From e983346ffc4e744aacefd7cbdc620850be4b6aad Mon Sep 17 00:00:00 2001 From: Mahdi Dibaiee Date: Tue, 25 Dec 2018 17:29:22 +0330 Subject: [PATCH] initial commit --- assets/textures/fire-sprite-small.png | Bin 0 -> 12224 bytes assets/textures/fire-sprite.png | Bin 0 -> 13979 bytes assets/textures/fire.jpg | Bin 0 -> 53782 bytes assets/textures/grass-long.jpg | Bin 0 -> 25526 bytes assets/textures/grass.jpg | Bin 0 -> 173276 bytes assets/textures/grassdead.jpg | Bin 0 -> 993342 bytes assets/textures/lava.jpg | Bin 0 -> 587998 bytes assets/textures/metal.png | Bin 0 -> 1357676 bytes index.html | 62 + lib/Three.Legacy.js | 1924 + lib/Three.js | 154 + lib/Tween.js | 917 + lib/ammo.js | 33 + lib/ammo.module.js | 31 + lib/animation/AnimationAction.js | 672 + lib/animation/AnimationClip.js | 453 + lib/animation/AnimationMixer.js | 761 + lib/animation/AnimationObjectGroup.js | 381 + lib/animation/AnimationUtils.js | 166 + lib/animation/KeyframeTrack.js | 454 + lib/animation/PropertyBinding.js | 726 + lib/animation/PropertyMixer.js | 209 + lib/animation/tracks/BooleanKeyframeTrack.js | 38 + lib/animation/tracks/ColorKeyframeTrack.js | 34 + lib/animation/tracks/NumberKeyframeTrack.js | 30 + .../tracks/QuaternionKeyframeTrack.js | 40 + lib/animation/tracks/StringKeyframeTrack.js | 35 + lib/animation/tracks/VectorKeyframeTrack.js | 31 + lib/audio/Audio.js | 319 + lib/audio/AudioAnalyser.js | 42 + lib/audio/AudioContext.js | 29 + lib/audio/AudioListener.js | 135 + lib/audio/PositionalAudio.js | 122 + lib/cameras/ArrayCamera.js | 24 + lib/cameras/Camera.js | 76 + lib/cameras/CubeCamera.js | 113 + lib/cameras/OrthographicCamera.js | 147 + lib/cameras/PerspectiveCamera.js | 244 + lib/cameras/StereoCamera.js | 98 + lib/constants.js | 142 + lib/core/BufferAttribute.js | 430 + lib/core/BufferGeometry.js | 1129 + lib/core/Clock.js | 73 + lib/core/DirectGeometry.js | 274 + lib/core/EventDispatcher.js | 86 + lib/core/Face3.js | 63 + lib/core/Geometry.js | 1435 + lib/core/InstancedBufferAttribute.js | 45 + lib/core/InstancedBufferGeometry.js | 40 + lib/core/InstancedInterleavedBuffer.js | 33 + lib/core/InterleavedBuffer.js | 111 + lib/core/InterleavedBufferAttribute.js | 139 + lib/core/Layers.js | 46 + lib/core/Object3D.js | 893 + lib/core/Raycaster.js | 134 + lib/core/Uniform.js | 24 + lib/extras/Earcut.js | 810 + lib/extras/ImageUtils.js | 55 + lib/extras/ShapeUtils.js | 96 + lib/extras/core/Curve.js | 425 + lib/extras/core/CurvePath.js | 261 + lib/extras/core/Font.js | 145 + lib/extras/core/Interpolations.js | 81 + lib/extras/core/Path.js | 183 + lib/extras/core/Shape.js | 115 + lib/extras/core/ShapePath.js | 286 + lib/extras/curves/ArcCurve.js | 18 + lib/extras/curves/CatmullRomCurve3.js | 255 + lib/extras/curves/CubicBezierCurve.js | 79 + lib/extras/curves/CubicBezierCurve3.js | 80 + lib/extras/curves/Curves.js | 10 + lib/extras/curves/EllipseCurve.js | 158 + lib/extras/curves/LineCurve.js | 90 + lib/extras/curves/LineCurve3.js | 82 + lib/extras/curves/QuadraticBezierCurve.js | 75 + lib/extras/curves/QuadraticBezierCurve3.js | 76 + lib/extras/curves/SplineCurve.js | 98 + lib/extras/objects/ImmediateRenderObject.js | 22 + lib/geometries/BoxGeometry.js | 203 + lib/geometries/CircleGeometry.js | 121 + lib/geometries/ConeGeometry.js | 55 + lib/geometries/CylinderGeometry.js | 316 + lib/geometries/DodecahedronGeometry.js | 88 + lib/geometries/EdgesGeometry.js | 113 + lib/geometries/ExtrudeGeometry.js | 832 + lib/geometries/Geometries.js | 22 + lib/geometries/IcosahedronGeometry.js | 64 + lib/geometries/LatheGeometry.js | 186 + lib/geometries/OctahedronGeometry.js | 60 + lib/geometries/ParametricGeometry.js | 163 + lib/geometries/PlaneGeometry.js | 126 + lib/geometries/PolyhedronGeometry.js | 341 + lib/geometries/RingGeometry.js | 152 + lib/geometries/ShapeGeometry.js | 222 + lib/geometries/SphereGeometry.js | 152 + lib/geometries/TetrahedronGeometry.js | 57 + lib/geometries/TextGeometry.js | 81 + lib/geometries/TorusGeometry.js | 142 + lib/geometries/TorusKnotGeometry.js | 194 + lib/geometries/TubeGeometry.js | 223 + lib/geometries/WireframeGeometry.js | 179 + lib/helpers/ArrowHelper.js | 139 + lib/helpers/AxesHelper.js | 42 + lib/helpers/Box3Helper.js | 55 + lib/helpers/BoxHelper.js | 120 + lib/helpers/CameraHelper.js | 210 + lib/helpers/DirectionalLightHelper.js | 98 + lib/helpers/FaceNormalsHelper.js | 118 + lib/helpers/GridHelper.js | 52 + lib/helpers/HemisphereLightHelper.js | 96 + lib/helpers/PlaneHelper.js | 63 + lib/helpers/PointLightHelper.js | 92 + lib/helpers/PolarGridHelper.js | 95 + lib/helpers/RectAreaLightHelper.js | 81 + lib/helpers/SkeletonHelper.js | 128 + lib/helpers/SpotLightHelper.js | 103 + lib/helpers/VertexNormalsHelper.js | 153 + lib/lights/AmbientLight.js | 26 + lib/lights/DirectionalLight.js | 46 + lib/lights/DirectionalLightShadow.js | 21 + lib/lights/HemisphereLight.js | 43 + lib/lights/Light.js | 62 + lib/lights/LightShadow.js | 61 + lib/lights/PointLight.js | 62 + lib/lights/RectAreaLight.js | 48 + lib/lights/SpotLight.js | 72 + lib/lights/SpotLightShadow.js | 43 + lib/loaders/AnimationLoader.js | 57 + lib/loaders/AudioLoader.js | 49 + lib/loaders/BufferGeometryLoader.js | 114 + lib/loaders/Cache.js | 46 + lib/loaders/CompressedTextureLoader.js | 141 + lib/loaders/CubeTextureLoader.js | 77 + lib/loaders/DataTextureLoader.js | 102 + lib/loaders/FileLoader.js | 319 + lib/loaders/FontLoader.js | 62 + lib/loaders/ImageBitmapLoader.js | 110 + lib/loaders/ImageLoader.js | 108 + lib/loaders/JSONLoader.js | 587 + lib/loaders/Loader.js | 342 + lib/loaders/LoaderUtils.js | 44 + lib/loaders/LoadingManager.js | 98 + lib/loaders/MaterialLoader.js | 236 + lib/loaders/ObjectLoader.js | 978 + lib/loaders/TextureLoader.js | 68 + lib/materials/LineBasicMaterial.js | 56 + lib/materials/LineDashedMaterial.js | 50 + lib/materials/Material.js | 381 + lib/materials/Materials.js | 18 + lib/materials/MeshBasicMaterial.js | 120 + lib/materials/MeshDepthMaterial.js | 86 + lib/materials/MeshDistanceMaterial.js | 84 + lib/materials/MeshLambertMaterial.js | 131 + lib/materials/MeshMatcapMaterial.js | 129 + lib/materials/MeshNormalMaterial.js | 95 + lib/materials/MeshPhongMaterial.js | 171 + lib/materials/MeshPhysicalMaterial.js | 49 + lib/materials/MeshStandardMaterial.js | 180 + lib/materials/MeshToonMaterial.js | 41 + lib/materials/PointsMaterial.js | 64 + lib/materials/RawShaderMaterial.js | 21 + lib/materials/ShaderMaterial.js | 190 + lib/materials/ShadowMaterial.js | 41 + lib/materials/SpriteMaterial.js | 55 + lib/math/Box2.js | 244 + lib/math/Box3.js | 616 + lib/math/Color.js | 606 + lib/math/Cylindrical.js | 65 + lib/math/Euler.js | 352 + lib/math/Frustum.js | 194 + lib/math/Interpolant.js | 259 + lib/math/Line3.js | 152 + lib/math/Math.js | 153 + lib/math/Matrix3.js | 388 + lib/math/Matrix4.js | 938 + lib/math/Plane.js | 245 + lib/math/Quaternion.js | 637 + lib/math/Ray.js | 546 + lib/math/Sphere.js | 180 + lib/math/Spherical.js | 90 + lib/math/Triangle.js | 349 + lib/math/Vector2.js | 499 + lib/math/Vector3.js | 734 + lib/math/Vector4.js | 629 + lib/math/interpolants/CubicInterpolant.js | 156 + lib/math/interpolants/DiscreteInterpolant.js | 30 + lib/math/interpolants/LinearInterpolant.js | 44 + .../QuaternionLinearInterpolant.js | 43 + lib/moment.min.js | 1 + lib/mousetrap.js | 11 + lib/objects/Bone.js | 26 + lib/objects/Group.js | 24 + lib/objects/LOD.js | 176 + lib/objects/Line.js | 267 + lib/objects/LineLoop.js | 24 + lib/objects/LineSegments.js | 85 + lib/objects/Mesh.js | 462 + lib/objects/Points.js | 148 + lib/objects/Skeleton.js | 178 + lib/objects/SkinnedMesh.js | 209 + lib/objects/Sky.js | 222 + lib/objects/Sprite.js | 181 + lib/physi.js | 1403 + lib/physics-module.js | 4504 ++ lib/physijs_worker.js | 1415 + lib/polyfills.js | 98 + lib/renderers/WebGL2Renderer.js | 189 + lib/renderers/WebGLRenderTarget.js | 95 + lib/renderers/WebGLRenderTargetCube.js | 22 + lib/renderers/WebGLRenderer.js | 2642 + lib/renderers/shaders/ShaderChunk.js | 243 + .../ShaderChunk/alphamap_fragment.glsl | 5 + .../ShaderChunk/alphamap_pars_fragment.glsl | 5 + .../ShaderChunk/alphatest_fragment.glsl | 5 + .../shaders/ShaderChunk/aomap_fragment.glsl | 16 + .../ShaderChunk/aomap_pars_fragment.glsl | 6 + .../shaders/ShaderChunk/begin_vertex.glsl | 2 + .../ShaderChunk/beginnormal_vertex.glsl | 2 + lib/renderers/shaders/ShaderChunk/bsdfs.glsl | 295 + .../ShaderChunk/bumpmap_pars_fragment.glsl | 44 + .../ShaderChunk/clipping_planes_fragment.glsl | 29 + .../clipping_planes_pars_fragment.glsl | 9 + .../clipping_planes_pars_vertex.glsl | 3 + .../ShaderChunk/clipping_planes_vertex.glsl | 4 + .../shaders/ShaderChunk/color_fragment.glsl | 5 + .../ShaderChunk/color_pars_fragment.glsl | 5 + .../ShaderChunk/color_pars_vertex.glsl | 5 + .../shaders/ShaderChunk/color_vertex.glsl | 5 + lib/renderers/shaders/ShaderChunk/common.glsl | 95 + .../cube_uv_reflection_fragment.glsl | 128 + .../ShaderChunk/defaultnormal_vertex.glsl | 7 + .../displacementmap_pars_vertex.glsl | 7 + .../ShaderChunk/displacementmap_vertex.glsl | 5 + .../ShaderChunk/dithering_fragment.glsl | 5 + .../ShaderChunk/dithering_pars_fragment.glsl | 18 + .../ShaderChunk/emissivemap_fragment.glsl | 9 + .../emissivemap_pars_fragment.glsl | 5 + .../ShaderChunk/encodings_fragment.glsl | 1 + .../ShaderChunk/encodings_pars_fragment.glsl | 83 + .../shaders/ShaderChunk/envmap_fragment.glsl | 72 + .../ShaderChunk/envmap_pars_fragment.glsl | 26 + .../ShaderChunk/envmap_pars_vertex.glsl | 13 + .../envmap_physical_pars_fragment.glsl | 133 + .../shaders/ShaderChunk/envmap_vertex.glsl | 25 + .../shaders/ShaderChunk/fog_fragment.glsl | 15 + .../ShaderChunk/fog_pars_fragment.glsl | 17 + .../shaders/ShaderChunk/fog_pars_vertex.glsl | 5 + .../shaders/ShaderChunk/fog_vertex.glsl | 5 + .../gradientmap_pars_fragment.glsl | 24 + .../ShaderChunk/lightmap_fragment.glsl | 5 + .../ShaderChunk/lightmap_pars_fragment.glsl | 6 + .../ShaderChunk/lights_fragment_begin.glsl | 123 + .../ShaderChunk/lights_fragment_end.glsl | 11 + .../ShaderChunk/lights_fragment_maps.glsl | 33 + .../ShaderChunk/lights_lambert_vertex.glsl | 115 + .../ShaderChunk/lights_pars_begin.glsl | 170 + .../ShaderChunk/lights_phong_fragment.glsl | 5 + .../lights_phong_pars_fragment.glsl | 53 + .../ShaderChunk/lights_physical_fragment.glsl | 10 + .../lights_physical_pars_fragment.glsl | 135 + .../ShaderChunk/logdepthbuf_fragment.glsl | 5 + .../logdepthbuf_pars_fragment.glsl | 6 + .../ShaderChunk/logdepthbuf_pars_vertex.glsl | 13 + .../ShaderChunk/logdepthbuf_vertex.glsl | 15 + .../shaders/ShaderChunk/map_fragment.glsl | 8 + .../ShaderChunk/map_pars_fragment.glsl | 5 + .../ShaderChunk/map_particle_fragment.glsl | 7 + .../map_particle_pars_fragment.glsl | 6 + .../ShaderChunk/metalnessmap_fragment.glsl | 10 + .../metalnessmap_pars_fragment.glsl | 5 + .../ShaderChunk/morphnormal_vertex.glsl | 8 + .../ShaderChunk/morphtarget_pars_vertex.glsl | 13 + .../ShaderChunk/morphtarget_vertex.glsl | 17 + .../ShaderChunk/normal_fragment_begin.glsl | 19 + .../ShaderChunk/normal_fragment_maps.glsl | 31 + .../ShaderChunk/normalmap_pars_fragment.glsl | 42 + .../shaders/ShaderChunk/packing.glsl | 41 + .../premultiplied_alpha_fragment.glsl | 6 + .../shaders/ShaderChunk/project_vertex.glsl | 3 + .../ShaderChunk/roughnessmap_fragment.glsl | 10 + .../roughnessmap_pars_fragment.glsl | 5 + .../ShaderChunk/shadowmap_pars_fragment.glsl | 243 + .../ShaderChunk/shadowmap_pars_vertex.glsl | 32 + .../shaders/ShaderChunk/shadowmap_vertex.glsl | 44 + .../ShaderChunk/shadowmask_pars_fragment.glsl | 61 + .../shaders/ShaderChunk/skinbase_vertex.glsl | 8 + .../ShaderChunk/skinning_pars_vertex.glsl | 46 + .../shaders/ShaderChunk/skinning_vertex.glsl | 13 + .../ShaderChunk/skinnormal_vertex.glsl | 12 + .../ShaderChunk/specularmap_fragment.glsl | 12 + .../specularmap_pars_fragment.glsl | 5 + .../ShaderChunk/tonemapping_fragment.glsl | 5 + .../tonemapping_pars_fragment.glsl | 41 + .../ShaderChunk/uv2_pars_fragment.glsl | 5 + .../shaders/ShaderChunk/uv2_pars_vertex.glsl | 6 + .../shaders/ShaderChunk/uv2_vertex.glsl | 5 + .../shaders/ShaderChunk/uv_pars_fragment.glsl | 5 + .../shaders/ShaderChunk/uv_pars_vertex.glsl | 6 + .../shaders/ShaderChunk/uv_vertex.glsl | 5 + .../shaders/ShaderChunk/worldpos_vertex.glsl | 5 + lib/renderers/shaders/ShaderLib.js | 284 + .../shaders/ShaderLib/background_frag.glsl | 9 + .../shaders/ShaderLib/background_vert.glsl | 10 + .../shaders/ShaderLib/cube_frag.glsl | 12 + .../shaders/ShaderLib/cube_vert.glsl | 14 + .../shaders/ShaderLib/depth_frag.glsl | 43 + .../shaders/ShaderLib/depth_vert.glsl | 31 + .../shaders/ShaderLib/distanceRGBA_frag.glsl | 31 + .../shaders/ShaderLib/distanceRGBA_vert.glsl | 36 + .../shaders/ShaderLib/equirect_frag.glsl | 19 + .../shaders/ShaderLib/equirect_vert.glsl | 12 + .../shaders/ShaderLib/linedashed_frag.glsl | 40 + .../shaders/ShaderLib/linedashed_vert.glsl | 25 + .../shaders/ShaderLib/meshbasic_frag.glsl | 66 + .../shaders/ShaderLib/meshbasic_vert.glsl | 39 + .../shaders/ShaderLib/meshlambert_frag.glsl | 84 + .../shaders/ShaderLib/meshlambert_vert.glsl | 50 + .../shaders/ShaderLib/meshmatcap_frag.glsl | 57 + .../shaders/ShaderLib/meshmatcap_vert.glsl | 49 + .../shaders/ShaderLib/meshphong_frag.glsl | 72 + .../shaders/ShaderLib/meshphong_vert.glsl | 57 + .../shaders/ShaderLib/meshphysical_frag.glsl | 86 + .../shaders/ShaderLib/meshphysical_vert.glsl | 55 + .../shaders/ShaderLib/normal_frag.glsl | 31 + .../shaders/ShaderLib/normal_vert.glsl | 50 + .../shaders/ShaderLib/points_frag.glsl | 32 + .../shaders/ShaderLib/points_vert.glsl | 33 + .../shaders/ShaderLib/shadow_frag.glsl | 18 + .../shaders/ShaderLib/shadow_vert.glsl | 12 + .../shaders/ShaderLib/sprite_frag.glsl | 30 + .../shaders/ShaderLib/sprite_vert.glsl | 42 + lib/renderers/shaders/UniformsLib.js | 200 + lib/renderers/shaders/UniformsUtils.js | 67 + lib/renderers/webgl/WebGLAnimation.js | 56 + lib/renderers/webgl/WebGLAttributes.js | 155 + lib/renderers/webgl/WebGLBackground.js | 149 + lib/renderers/webgl/WebGLBufferRenderer.js | 59 + lib/renderers/webgl/WebGLCapabilities.js | 116 + lib/renderers/webgl/WebGLClipping.js | 164 + lib/renderers/webgl/WebGLExtensions.js | 61 + lib/renderers/webgl/WebGLGeometries.js | 184 + .../webgl/WebGLIndexedBufferRenderer.js | 69 + lib/renderers/webgl/WebGLInfo.js | 83 + lib/renderers/webgl/WebGLLights.js | 345 + lib/renderers/webgl/WebGLMorphtargets.js | 111 + lib/renderers/webgl/WebGLObjects.js | 52 + lib/renderers/webgl/WebGLProgram.js | 730 + lib/renderers/webgl/WebGLPrograms.js | 312 + lib/renderers/webgl/WebGLProperties.js | 52 + lib/renderers/webgl/WebGLRenderLists.js | 161 + lib/renderers/webgl/WebGLRenderStates.js | 104 + lib/renderers/webgl/WebGLShader.js | 46 + lib/renderers/webgl/WebGLShadowMap.js | 430 + lib/renderers/webgl/WebGLState.js | 978 + lib/renderers/webgl/WebGLTextures.js | 948 + lib/renderers/webgl/WebGLUniforms.js | 876 + lib/renderers/webgl/WebGLUtils.js | 168 + lib/renderers/webvr/WebVRManager.js | 401 + lib/renderers/webvr/WebVRUtils.js | 66 + lib/renderers/webvr/WebXRManager.js | 313 + lib/scenes/Fog.js | 38 + lib/scenes/FogExp2.js | 35 + lib/scenes/Scene.js | 55 + lib/textures/CanvasTexture.js | 19 + lib/textures/CompressedTexture.js | 32 + lib/textures/CubeTexture.js | 41 + lib/textures/DataTexture.js | 29 + lib/textures/DataTexture3D.js | 34 + lib/textures/DepthTexture.js | 38 + lib/textures/Texture.js | 317 + lib/textures/VideoTexture.js | 36 + lib/three.js | 48206 ++++++++++++ lib/utils.js | 37 + lib/whs.js | 62443 ++++++++++++++++ lib/whs.js.map | 1 + lib/whs.min.js | 1240 + src/ball.js | 193 + src/config.js | 7 + src/controls.js | 38 + src/gui.js | 24 + src/helpers.js | 3 + src/levels/0-basic.js | 36 + src/lights.js | 30 + src/main.js | 9 + src/objects.js | 17 + src/scenes.js | 58 + src/utils.js | 2 + src/world.js | 128 + 388 files changed, 174266 insertions(+) create mode 100644 assets/textures/fire-sprite-small.png create mode 100644 assets/textures/fire-sprite.png create mode 100644 assets/textures/fire.jpg create mode 100644 assets/textures/grass-long.jpg create mode 100644 assets/textures/grass.jpg create mode 100644 assets/textures/grassdead.jpg create mode 100644 assets/textures/lava.jpg create mode 100644 assets/textures/metal.png create mode 100644 index.html create mode 100644 lib/Three.Legacy.js create mode 100644 lib/Three.js create mode 100644 lib/Tween.js create mode 100644 lib/ammo.js create mode 100644 lib/ammo.module.js create mode 100644 lib/animation/AnimationAction.js create mode 100644 lib/animation/AnimationClip.js create mode 100644 lib/animation/AnimationMixer.js create mode 100644 lib/animation/AnimationObjectGroup.js create mode 100644 lib/animation/AnimationUtils.js create mode 100644 lib/animation/KeyframeTrack.js create mode 100644 lib/animation/PropertyBinding.js create mode 100644 lib/animation/PropertyMixer.js create mode 100644 lib/animation/tracks/BooleanKeyframeTrack.js create mode 100644 lib/animation/tracks/ColorKeyframeTrack.js create mode 100644 lib/animation/tracks/NumberKeyframeTrack.js create mode 100644 lib/animation/tracks/QuaternionKeyframeTrack.js create mode 100644 lib/animation/tracks/StringKeyframeTrack.js create mode 100644 lib/animation/tracks/VectorKeyframeTrack.js create mode 100644 lib/audio/Audio.js create mode 100644 lib/audio/AudioAnalyser.js create mode 100644 lib/audio/AudioContext.js create mode 100644 lib/audio/AudioListener.js create mode 100644 lib/audio/PositionalAudio.js create mode 100644 lib/cameras/ArrayCamera.js create mode 100644 lib/cameras/Camera.js create mode 100644 lib/cameras/CubeCamera.js create mode 100755 lib/cameras/OrthographicCamera.js create mode 100755 lib/cameras/PerspectiveCamera.js create mode 100644 lib/cameras/StereoCamera.js create mode 100644 lib/constants.js create mode 100644 lib/core/BufferAttribute.js create mode 100644 lib/core/BufferGeometry.js create mode 100644 lib/core/Clock.js create mode 100644 lib/core/DirectGeometry.js create mode 100644 lib/core/EventDispatcher.js create mode 100644 lib/core/Face3.js create mode 100644 lib/core/Geometry.js create mode 100644 lib/core/InstancedBufferAttribute.js create mode 100644 lib/core/InstancedBufferGeometry.js create mode 100644 lib/core/InstancedInterleavedBuffer.js create mode 100644 lib/core/InterleavedBuffer.js create mode 100644 lib/core/InterleavedBufferAttribute.js create mode 100644 lib/core/Layers.js create mode 100644 lib/core/Object3D.js create mode 100644 lib/core/Raycaster.js create mode 100644 lib/core/Uniform.js create mode 100644 lib/extras/Earcut.js create mode 100644 lib/extras/ImageUtils.js create mode 100644 lib/extras/ShapeUtils.js create mode 100644 lib/extras/core/Curve.js create mode 100644 lib/extras/core/CurvePath.js create mode 100644 lib/extras/core/Font.js create mode 100644 lib/extras/core/Interpolations.js create mode 100644 lib/extras/core/Path.js create mode 100644 lib/extras/core/Shape.js create mode 100644 lib/extras/core/ShapePath.js create mode 100644 lib/extras/curves/ArcCurve.js create mode 100644 lib/extras/curves/CatmullRomCurve3.js create mode 100644 lib/extras/curves/CubicBezierCurve.js create mode 100644 lib/extras/curves/CubicBezierCurve3.js create mode 100644 lib/extras/curves/Curves.js create mode 100644 lib/extras/curves/EllipseCurve.js create mode 100644 lib/extras/curves/LineCurve.js create mode 100644 lib/extras/curves/LineCurve3.js create mode 100644 lib/extras/curves/QuadraticBezierCurve.js create mode 100644 lib/extras/curves/QuadraticBezierCurve3.js create mode 100644 lib/extras/curves/SplineCurve.js create mode 100644 lib/extras/objects/ImmediateRenderObject.js create mode 100644 lib/geometries/BoxGeometry.js create mode 100644 lib/geometries/CircleGeometry.js create mode 100644 lib/geometries/ConeGeometry.js create mode 100644 lib/geometries/CylinderGeometry.js create mode 100644 lib/geometries/DodecahedronGeometry.js create mode 100644 lib/geometries/EdgesGeometry.js create mode 100644 lib/geometries/ExtrudeGeometry.js create mode 100644 lib/geometries/Geometries.js create mode 100644 lib/geometries/IcosahedronGeometry.js create mode 100644 lib/geometries/LatheGeometry.js create mode 100644 lib/geometries/OctahedronGeometry.js create mode 100644 lib/geometries/ParametricGeometry.js create mode 100644 lib/geometries/PlaneGeometry.js create mode 100644 lib/geometries/PolyhedronGeometry.js create mode 100644 lib/geometries/RingGeometry.js create mode 100644 lib/geometries/ShapeGeometry.js create mode 100644 lib/geometries/SphereGeometry.js create mode 100644 lib/geometries/TetrahedronGeometry.js create mode 100644 lib/geometries/TextGeometry.js create mode 100644 lib/geometries/TorusGeometry.js create mode 100644 lib/geometries/TorusKnotGeometry.js create mode 100644 lib/geometries/TubeGeometry.js create mode 100644 lib/geometries/WireframeGeometry.js create mode 100644 lib/helpers/ArrowHelper.js create mode 100644 lib/helpers/AxesHelper.js create mode 100644 lib/helpers/Box3Helper.js create mode 100644 lib/helpers/BoxHelper.js create mode 100644 lib/helpers/CameraHelper.js create mode 100644 lib/helpers/DirectionalLightHelper.js create mode 100644 lib/helpers/FaceNormalsHelper.js create mode 100644 lib/helpers/GridHelper.js create mode 100644 lib/helpers/HemisphereLightHelper.js create mode 100644 lib/helpers/PlaneHelper.js create mode 100644 lib/helpers/PointLightHelper.js create mode 100644 lib/helpers/PolarGridHelper.js create mode 100644 lib/helpers/RectAreaLightHelper.js create mode 100644 lib/helpers/SkeletonHelper.js create mode 100644 lib/helpers/SpotLightHelper.js create mode 100644 lib/helpers/VertexNormalsHelper.js create mode 100644 lib/lights/AmbientLight.js create mode 100644 lib/lights/DirectionalLight.js create mode 100644 lib/lights/DirectionalLightShadow.js create mode 100644 lib/lights/HemisphereLight.js create mode 100644 lib/lights/Light.js create mode 100644 lib/lights/LightShadow.js create mode 100644 lib/lights/PointLight.js create mode 100644 lib/lights/RectAreaLight.js create mode 100644 lib/lights/SpotLight.js create mode 100644 lib/lights/SpotLightShadow.js create mode 100644 lib/loaders/AnimationLoader.js create mode 100644 lib/loaders/AudioLoader.js create mode 100644 lib/loaders/BufferGeometryLoader.js create mode 100644 lib/loaders/Cache.js create mode 100644 lib/loaders/CompressedTextureLoader.js create mode 100644 lib/loaders/CubeTextureLoader.js create mode 100644 lib/loaders/DataTextureLoader.js create mode 100644 lib/loaders/FileLoader.js create mode 100644 lib/loaders/FontLoader.js create mode 100644 lib/loaders/ImageBitmapLoader.js create mode 100644 lib/loaders/ImageLoader.js create mode 100644 lib/loaders/JSONLoader.js create mode 100644 lib/loaders/Loader.js create mode 100644 lib/loaders/LoaderUtils.js create mode 100644 lib/loaders/LoadingManager.js create mode 100644 lib/loaders/MaterialLoader.js create mode 100644 lib/loaders/ObjectLoader.js create mode 100644 lib/loaders/TextureLoader.js create mode 100644 lib/materials/LineBasicMaterial.js create mode 100644 lib/materials/LineDashedMaterial.js create mode 100644 lib/materials/Material.js create mode 100644 lib/materials/Materials.js create mode 100644 lib/materials/MeshBasicMaterial.js create mode 100644 lib/materials/MeshDepthMaterial.js create mode 100644 lib/materials/MeshDistanceMaterial.js create mode 100644 lib/materials/MeshLambertMaterial.js create mode 100644 lib/materials/MeshMatcapMaterial.js create mode 100644 lib/materials/MeshNormalMaterial.js create mode 100644 lib/materials/MeshPhongMaterial.js create mode 100644 lib/materials/MeshPhysicalMaterial.js create mode 100644 lib/materials/MeshStandardMaterial.js create mode 100644 lib/materials/MeshToonMaterial.js create mode 100644 lib/materials/PointsMaterial.js create mode 100644 lib/materials/RawShaderMaterial.js create mode 100644 lib/materials/ShaderMaterial.js create mode 100644 lib/materials/ShadowMaterial.js create mode 100644 lib/materials/SpriteMaterial.js create mode 100644 lib/math/Box2.js create mode 100644 lib/math/Box3.js create mode 100644 lib/math/Color.js create mode 100644 lib/math/Cylindrical.js create mode 100644 lib/math/Euler.js create mode 100644 lib/math/Frustum.js create mode 100644 lib/math/Interpolant.js create mode 100644 lib/math/Line3.js create mode 100644 lib/math/Math.js create mode 100644 lib/math/Matrix3.js create mode 100644 lib/math/Matrix4.js create mode 100644 lib/math/Plane.js create mode 100644 lib/math/Quaternion.js create mode 100644 lib/math/Ray.js create mode 100644 lib/math/Sphere.js create mode 100644 lib/math/Spherical.js create mode 100644 lib/math/Triangle.js create mode 100644 lib/math/Vector2.js create mode 100644 lib/math/Vector3.js create mode 100644 lib/math/Vector4.js create mode 100644 lib/math/interpolants/CubicInterpolant.js create mode 100644 lib/math/interpolants/DiscreteInterpolant.js create mode 100644 lib/math/interpolants/LinearInterpolant.js create mode 100644 lib/math/interpolants/QuaternionLinearInterpolant.js create mode 100644 lib/moment.min.js create mode 100644 lib/mousetrap.js create mode 100644 lib/objects/Bone.js create mode 100644 lib/objects/Group.js create mode 100644 lib/objects/LOD.js create mode 100644 lib/objects/Line.js create mode 100644 lib/objects/LineLoop.js create mode 100644 lib/objects/LineSegments.js create mode 100644 lib/objects/Mesh.js create mode 100644 lib/objects/Points.js create mode 100644 lib/objects/Skeleton.js create mode 100644 lib/objects/SkinnedMesh.js create mode 100644 lib/objects/Sky.js create mode 100644 lib/objects/Sprite.js create mode 100644 lib/physi.js create mode 100644 lib/physics-module.js create mode 100644 lib/physijs_worker.js create mode 100644 lib/polyfills.js create mode 100644 lib/renderers/WebGL2Renderer.js create mode 100644 lib/renderers/WebGLRenderTarget.js create mode 100644 lib/renderers/WebGLRenderTargetCube.js create mode 100644 lib/renderers/WebGLRenderer.js create mode 100644 lib/renderers/shaders/ShaderChunk.js create mode 100644 lib/renderers/shaders/ShaderChunk/alphamap_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/alphamap_pars_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/alphatest_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/aomap_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/aomap_pars_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/begin_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/beginnormal_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/bsdfs.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/clipping_planes_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/clipping_planes_pars_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/clipping_planes_pars_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/clipping_planes_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/color_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/color_pars_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/color_pars_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/color_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/common.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/displacementmap_pars_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/displacementmap_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/dithering_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/dithering_pars_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/emissivemap_pars_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/encodings_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/encodings_pars_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/envmap_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/envmap_pars_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/envmap_pars_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/envmap_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/fog_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/fog_pars_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/fog_pars_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/fog_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/gradientmap_pars_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/lightmap_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/lightmap_pars_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/lights_fragment_end.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/lights_lambert_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/lights_pars_begin.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/lights_phong_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/map_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/map_pars_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/map_particle_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/map_particle_pars_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/metalnessmap_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/metalnessmap_pars_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/packing.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/project_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/roughnessmap_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/roughnessmap_pars_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/skinbase_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/skinning_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/skinnormal_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/specularmap_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/specularmap_pars_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/tonemapping_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/uv2_pars_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/uv2_pars_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/uv2_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/uv_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderChunk/worldpos_vertex.glsl create mode 100644 lib/renderers/shaders/ShaderLib.js create mode 100644 lib/renderers/shaders/ShaderLib/background_frag.glsl create mode 100644 lib/renderers/shaders/ShaderLib/background_vert.glsl create mode 100644 lib/renderers/shaders/ShaderLib/cube_frag.glsl create mode 100644 lib/renderers/shaders/ShaderLib/cube_vert.glsl create mode 100644 lib/renderers/shaders/ShaderLib/depth_frag.glsl create mode 100644 lib/renderers/shaders/ShaderLib/depth_vert.glsl create mode 100644 lib/renderers/shaders/ShaderLib/distanceRGBA_frag.glsl create mode 100644 lib/renderers/shaders/ShaderLib/distanceRGBA_vert.glsl create mode 100644 lib/renderers/shaders/ShaderLib/equirect_frag.glsl create mode 100644 lib/renderers/shaders/ShaderLib/equirect_vert.glsl create mode 100644 lib/renderers/shaders/ShaderLib/linedashed_frag.glsl create mode 100644 lib/renderers/shaders/ShaderLib/linedashed_vert.glsl create mode 100644 lib/renderers/shaders/ShaderLib/meshbasic_frag.glsl create mode 100644 lib/renderers/shaders/ShaderLib/meshbasic_vert.glsl create mode 100644 lib/renderers/shaders/ShaderLib/meshlambert_frag.glsl create mode 100644 lib/renderers/shaders/ShaderLib/meshlambert_vert.glsl create mode 100644 lib/renderers/shaders/ShaderLib/meshmatcap_frag.glsl create mode 100644 lib/renderers/shaders/ShaderLib/meshmatcap_vert.glsl create mode 100644 lib/renderers/shaders/ShaderLib/meshphong_frag.glsl create mode 100644 lib/renderers/shaders/ShaderLib/meshphong_vert.glsl create mode 100644 lib/renderers/shaders/ShaderLib/meshphysical_frag.glsl create mode 100644 lib/renderers/shaders/ShaderLib/meshphysical_vert.glsl create mode 100644 lib/renderers/shaders/ShaderLib/normal_frag.glsl create mode 100644 lib/renderers/shaders/ShaderLib/normal_vert.glsl create mode 100644 lib/renderers/shaders/ShaderLib/points_frag.glsl create mode 100644 lib/renderers/shaders/ShaderLib/points_vert.glsl create mode 100644 lib/renderers/shaders/ShaderLib/shadow_frag.glsl create mode 100644 lib/renderers/shaders/ShaderLib/shadow_vert.glsl create mode 100644 lib/renderers/shaders/ShaderLib/sprite_frag.glsl create mode 100644 lib/renderers/shaders/ShaderLib/sprite_vert.glsl create mode 100644 lib/renderers/shaders/UniformsLib.js create mode 100644 lib/renderers/shaders/UniformsUtils.js create mode 100644 lib/renderers/webgl/WebGLAnimation.js create mode 100644 lib/renderers/webgl/WebGLAttributes.js create mode 100644 lib/renderers/webgl/WebGLBackground.js create mode 100644 lib/renderers/webgl/WebGLBufferRenderer.js create mode 100644 lib/renderers/webgl/WebGLCapabilities.js create mode 100644 lib/renderers/webgl/WebGLClipping.js create mode 100644 lib/renderers/webgl/WebGLExtensions.js create mode 100644 lib/renderers/webgl/WebGLGeometries.js create mode 100644 lib/renderers/webgl/WebGLIndexedBufferRenderer.js create mode 100644 lib/renderers/webgl/WebGLInfo.js create mode 100644 lib/renderers/webgl/WebGLLights.js create mode 100644 lib/renderers/webgl/WebGLMorphtargets.js create mode 100644 lib/renderers/webgl/WebGLObjects.js create mode 100644 lib/renderers/webgl/WebGLProgram.js create mode 100644 lib/renderers/webgl/WebGLPrograms.js create mode 100644 lib/renderers/webgl/WebGLProperties.js create mode 100644 lib/renderers/webgl/WebGLRenderLists.js create mode 100644 lib/renderers/webgl/WebGLRenderStates.js create mode 100644 lib/renderers/webgl/WebGLShader.js create mode 100644 lib/renderers/webgl/WebGLShadowMap.js create mode 100644 lib/renderers/webgl/WebGLState.js create mode 100644 lib/renderers/webgl/WebGLTextures.js create mode 100644 lib/renderers/webgl/WebGLUniforms.js create mode 100644 lib/renderers/webgl/WebGLUtils.js create mode 100644 lib/renderers/webvr/WebVRManager.js create mode 100644 lib/renderers/webvr/WebVRUtils.js create mode 100644 lib/renderers/webvr/WebXRManager.js create mode 100644 lib/scenes/Fog.js create mode 100644 lib/scenes/FogExp2.js create mode 100644 lib/scenes/Scene.js create mode 100644 lib/textures/CanvasTexture.js create mode 100644 lib/textures/CompressedTexture.js create mode 100644 lib/textures/CubeTexture.js create mode 100644 lib/textures/DataTexture.js create mode 100644 lib/textures/DataTexture3D.js create mode 100644 lib/textures/DepthTexture.js create mode 100644 lib/textures/Texture.js create mode 100644 lib/textures/VideoTexture.js create mode 100644 lib/three.js create mode 100644 lib/utils.js create mode 100644 lib/whs.js create mode 100644 lib/whs.js.map create mode 100644 lib/whs.min.js create mode 100644 src/ball.js create mode 100644 src/config.js create mode 100644 src/controls.js create mode 100644 src/gui.js create mode 100644 src/helpers.js create mode 100644 src/levels/0-basic.js create mode 100644 src/lights.js create mode 100644 src/main.js create mode 100644 src/objects.js create mode 100644 src/scenes.js create mode 100644 src/utils.js create mode 100644 src/world.js diff --git a/assets/textures/fire-sprite-small.png b/assets/textures/fire-sprite-small.png new file mode 100644 index 0000000000000000000000000000000000000000..6a1395ee9c3482a8cdb9b486130c81be9e98835b GIT binary patch literal 12224 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 literal 0 HcmV?d00001 diff --git a/assets/textures/fire-sprite.png b/assets/textures/fire-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..c5b4d821fb4af04d26fa79c94d27d3ab6c10d58f GIT binary patch literal 13979 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 z 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 literal 0 HcmV?d00001 diff --git a/assets/textures/grass-long.jpg b/assets/textures/grass-long.jpg new file mode 100644 index 0000000000000000000000000000000000000000..de28f61bb9afecb62bd4ea99fe77008984c7a94c GIT binary patch literal 25526 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 literal 0 HcmV?d00001 diff --git a/assets/textures/grassdead.jpg b/assets/textures/grassdead.jpg new file mode 100644 index 0000000000000000000000000000000000000000..23ba8bd5551ea2bd6ef6dce6967dc1a430449b4e GIT binary patch literal 993342 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

    dy#%ar8lyikBFa5(jnKVY+4Sxm#r3R-Fm*v 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 |sq5Nws4^BZ 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.cW@m_si$zpTKwCkIUxeSdcuvFxur{brQB+9~O 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 z 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

    |Ix>dPX!#9CQPMeKNv{8f4^-jZ3DHo6WLtjwgY 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%0A&eNlDKNh}`iQTK! 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�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%0AfJ=!eAt}L-`CE(V;}k2l^m(5@-ks?n%4PS8<_j~ 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

    (XCB*kI&9DYYTuY)d)kP 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 literal 0 HcmV?d00001 diff --git a/assets/textures/lava.jpg b/assets/textures/lava.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f05efd0631cf01ca2633b9d96801202b2e659fc9 GIT binary patch literal 587998 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

    ZRg9#rSk!Ak1fQ+P`2-xvKdK9qx1e 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

    3`YL&~*DXHYi19zsTlrt`Uji2d~{l+~{wAKPBn# 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\+V>*U5MsPAtisx!xU>@hoA)NG;d$SQ^ma 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 z⪴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. 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 literal 0 HcmV?d00001 diff --git a/assets/textures/metal.png b/assets/textures/metal.png new file mode 100644 index 0000000000000000000000000000000000000000..4d511d0606118ce0a164317ac955b02f03b3cdbe GIT binary patch literal 1357676 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
  1. 4u!yhVi=9LaRZ&DdF_eU92=BE@qY) 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ξ)Z4H5W8w55B{3|>HaybDV>ng?*$s%;grCpp{g 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 cQ*tS5wB+raABom*Q#c3qxQ%9HF*w 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 z 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

    ?zOA_OiSz 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ɚRRh&s{DONld%XuXDU>Og9 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

    %AqKQ&k)*U0DbJF+pm) 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

    &xaT6{In=$`plFbbt<1LP}}M(LaiymiUUz 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

    Gv1TQ8qq)XXqj*`7lYfzkWMS1@q!TImY1LNd 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

    X2&Bx7c6p$9$Dl+rCPgVR@3B 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

    h&*9cwX5hT^-Fa$mVWOw(GT<s~1V;ya# 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�jsV{o1M0#m?w8R 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 M07*qoM6N<$f(4NB0RR91 literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..e9f65f8 --- /dev/null +++ b/index.html @@ -0,0 +1,62 @@ + + + + + Fire Ball + + + + + + + + + + + + + +

    + + + + + + + + + + + + + + + diff --git a/lib/Three.Legacy.js b/lib/Three.Legacy.js new file mode 100644 index 0000000..1784cfa --- /dev/null +++ b/lib/Three.Legacy.js @@ -0,0 +1,1924 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { Audio } from './audio/Audio.js'; +import { AudioAnalyser } from './audio/AudioAnalyser.js'; +import { PerspectiveCamera } from './cameras/PerspectiveCamera.js'; +import { FlatShading } from './constants.js'; +import { + Float64BufferAttribute, + Float32BufferAttribute, + Uint32BufferAttribute, + Int32BufferAttribute, + Uint16BufferAttribute, + Int16BufferAttribute, + Uint8ClampedBufferAttribute, + Uint8BufferAttribute, + Int8BufferAttribute, + BufferAttribute +} from './core/BufferAttribute.js'; +import { BufferGeometry } from './core/BufferGeometry.js'; +import { Face3 } from './core/Face3.js'; +import { Geometry } from './core/Geometry.js'; +import { Object3D } from './core/Object3D.js'; +import { Uniform } from './core/Uniform.js'; +import { Curve } from './extras/core/Curve.js'; +import { CurvePath } from './extras/core/CurvePath.js'; +import { Path } from './extras/core/Path.js'; +import { CatmullRomCurve3 } from './extras/curves/CatmullRomCurve3.js'; +import { AxesHelper } from './helpers/AxesHelper.js'; +import { BoxHelper } from './helpers/BoxHelper.js'; +import { GridHelper } from './helpers/GridHelper.js'; +import { SkeletonHelper } from './helpers/SkeletonHelper.js'; +import { BoxGeometry } from './geometries/BoxGeometry.js'; +import { EdgesGeometry } from './geometries/EdgesGeometry.js'; +import { ExtrudeGeometry } from './geometries/ExtrudeGeometry.js'; +import { ExtrudeBufferGeometry } from './geometries/ExtrudeGeometry.js'; +import { ShapeGeometry } from './geometries/ShapeGeometry.js'; +import { WireframeGeometry } from './geometries/WireframeGeometry.js'; +import { Light } from './lights/Light.js'; +import { Loader } from './loaders/Loader.js'; +import { LoaderUtils } from './loaders/LoaderUtils.js'; +import { FileLoader } from './loaders/FileLoader.js'; +import { AudioLoader } from './loaders/AudioLoader.js'; +import { CubeTextureLoader } from './loaders/CubeTextureLoader.js'; +import { DataTextureLoader } from './loaders/DataTextureLoader.js'; +import { JSONLoader } from './loaders/JSONLoader.js'; +import { ObjectLoader } from './loaders/ObjectLoader.js'; +import { TextureLoader } from './loaders/TextureLoader.js'; +import { Material } from './materials/Material.js'; +import { LineBasicMaterial } from './materials/LineBasicMaterial.js'; +import { MeshPhongMaterial } from './materials/MeshPhongMaterial.js'; +import { PointsMaterial } from './materials/PointsMaterial.js'; +import { ShaderMaterial } from './materials/ShaderMaterial.js'; +import { Box2 } from './math/Box2.js'; +import { Box3 } from './math/Box3.js'; +import { Color } from './math/Color.js'; +import { Line3 } from './math/Line3.js'; +import { _Math } from './math/Math.js'; +import { Matrix3 } from './math/Matrix3.js'; +import { Matrix4 } from './math/Matrix4.js'; +import { Plane } from './math/Plane.js'; +import { Quaternion } from './math/Quaternion.js'; +import { Ray } from './math/Ray.js'; +import { Triangle } from './math/Triangle.js'; +import { Vector2 } from './math/Vector2.js'; +import { Vector3 } from './math/Vector3.js'; +import { Vector4 } from './math/Vector4.js'; +import { LineSegments } from './objects/LineSegments.js'; +import { LOD } from './objects/LOD.js'; +import { Points } from './objects/Points.js'; +import { Sprite } from './objects/Sprite.js'; +import { Skeleton } from './objects/Skeleton.js'; +import { WebGLRenderer } from './renderers/WebGLRenderer.js'; +import { WebGLRenderTarget } from './renderers/WebGLRenderTarget.js'; +import { WebGLShadowMap } from './renderers/webgl/WebGLShadowMap.js'; +import { WebVRManager } from './renderers/webvr/WebVRManager.js'; +import { ImageUtils } from './extras/ImageUtils.js'; +import { Shape } from './extras/core/Shape.js'; +import { CubeCamera } from './cameras/CubeCamera.js'; + +export { BoxGeometry as CubeGeometry }; + +export function Face4( a, b, c, d, normal, color, materialIndex ) { + + console.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' ); + return new Face3( a, b, c, normal, color, materialIndex ); + +} + +export var LineStrip = 0; + +export var LinePieces = 1; + +export function MeshFaceMaterial( materials ) { + + console.warn( 'THREE.MeshFaceMaterial has been removed. Use an Array instead.' ); + return materials; + +} + +export function MultiMaterial( materials ) { + + if ( materials === undefined ) materials = []; + + console.warn( 'THREE.MultiMaterial has been removed. Use an Array instead.' ); + materials.isMultiMaterial = true; + materials.materials = materials; + materials.clone = function () { + + return materials.slice(); + + }; + return materials; + +} + +export function PointCloud( geometry, material ) { + + console.warn( 'THREE.PointCloud has been renamed to THREE.Points.' ); + return new Points( geometry, material ); + +} + +export function Particle( material ) { + + console.warn( 'THREE.Particle has been renamed to THREE.Sprite.' ); + return new Sprite( material ); + +} + +export function ParticleSystem( geometry, material ) { + + console.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' ); + return new Points( geometry, material ); + +} + +export function PointCloudMaterial( parameters ) { + + console.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + +} + +export function ParticleBasicMaterial( parameters ) { + + console.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + +} + +export function ParticleSystemMaterial( parameters ) { + + console.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + +} + +export function Vertex( x, y, z ) { + + console.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' ); + return new Vector3( x, y, z ); + +} + +// + +export function DynamicBufferAttribute( array, itemSize ) { + + console.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' ); + return new BufferAttribute( array, itemSize ).setDynamic( true ); + +} + +export function Int8Attribute( array, itemSize ) { + + console.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' ); + return new Int8BufferAttribute( array, itemSize ); + +} + +export function Uint8Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' ); + return new Uint8BufferAttribute( array, itemSize ); + +} + +export function Uint8ClampedAttribute( array, itemSize ) { + + console.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' ); + return new Uint8ClampedBufferAttribute( array, itemSize ); + +} + +export function Int16Attribute( array, itemSize ) { + + console.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' ); + return new Int16BufferAttribute( array, itemSize ); + +} + +export function Uint16Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' ); + return new Uint16BufferAttribute( array, itemSize ); + +} + +export function Int32Attribute( array, itemSize ) { + + console.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' ); + return new Int32BufferAttribute( array, itemSize ); + +} + +export function Uint32Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' ); + return new Uint32BufferAttribute( array, itemSize ); + +} + +export function Float32Attribute( array, itemSize ) { + + console.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' ); + return new Float32BufferAttribute( array, itemSize ); + +} + +export function Float64Attribute( array, itemSize ) { + + console.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' ); + return new Float64BufferAttribute( array, itemSize ); + +} + +// + +Curve.create = function ( construct, getPoint ) { + + console.log( 'THREE.Curve.create() has been deprecated' ); + + construct.prototype = Object.create( Curve.prototype ); + construct.prototype.constructor = construct; + construct.prototype.getPoint = getPoint; + + return construct; + +}; + +// + +Object.assign( CurvePath.prototype, { + + createPointsGeometry: function ( divisions ) { + + console.warn( 'THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' ); + + // generate geometry from path points (for Line or Points objects) + + var pts = this.getPoints( divisions ); + return this.createGeometry( pts ); + + }, + + createSpacedPointsGeometry: function ( divisions ) { + + console.warn( 'THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' ); + + // generate geometry from equidistant sampling along the path + + var pts = this.getSpacedPoints( divisions ); + return this.createGeometry( pts ); + + }, + + createGeometry: function ( points ) { + + console.warn( 'THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' ); + + var geometry = new Geometry(); + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + var point = points[ i ]; + geometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) ); + + } + + return geometry; + + } + +} ); + +// + +Object.assign( Path.prototype, { + + fromPoints: function ( points ) { + + console.warn( 'THREE.Path: .fromPoints() has been renamed to .setFromPoints().' ); + this.setFromPoints( points ); + + } + +} ); + +// + +export function ClosedSplineCurve3( points ) { + + console.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + this.closed = true; + +} + +ClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype ); + +// + +export function SplineCurve3( points ) { + + console.warn( 'THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + +} + +SplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype ); + +// + +export function Spline( points ) { + + console.warn( 'THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + +} + +Spline.prototype = Object.create( CatmullRomCurve3.prototype ); + +Object.assign( Spline.prototype, { + + initFromArray: function ( /* a */ ) { + + console.error( 'THREE.Spline: .initFromArray() has been removed.' ); + + }, + getControlPointsArray: function ( /* optionalTarget */ ) { + + console.error( 'THREE.Spline: .getControlPointsArray() has been removed.' ); + + }, + reparametrizeByArcLength: function ( /* samplingCoef */ ) { + + console.error( 'THREE.Spline: .reparametrizeByArcLength() has been removed.' ); + + } + +} ); + +// + +export function AxisHelper( size ) { + + console.warn( 'THREE.AxisHelper has been renamed to THREE.AxesHelper.' ); + return new AxesHelper( size ); + +} + +export function BoundingBoxHelper( object, color ) { + + console.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' ); + return new BoxHelper( object, color ); + +} + +export function EdgesHelper( object, hex ) { + + console.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' ); + return new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) ); + +} + +GridHelper.prototype.setColors = function () { + + console.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' ); + +}; + +SkeletonHelper.prototype.update = function () { + + console.error( 'THREE.SkeletonHelper: update() no longer needs to be called.' ); + +}; + +export function WireframeHelper( object, hex ) { + + console.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' ); + return new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) ); + +} + +// + +Object.assign( Loader.prototype, { + + extractUrlBase: function ( url ) { + + console.warn( 'THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.' ); + return LoaderUtils.extractUrlBase( url ); + + } + +} ); + +export function XHRLoader( manager ) { + + console.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' ); + return new FileLoader( manager ); + +} + +export function BinaryTextureLoader( manager ) { + + console.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' ); + return new DataTextureLoader( manager ); + +} + +Object.assign( JSONLoader.prototype, { + + setTexturePath: function ( value ) { + + console.warn( 'THREE.JSONLoader: .setTexturePath() has been renamed to .setResourcePath().' ); + return this.setResourcePath( value ); + + } + +} ); + +Object.assign( ObjectLoader.prototype, { + + setTexturePath: function ( value ) { + + console.warn( 'THREE.ObjectLoader: .setTexturePath() has been renamed to .setResourcePath().' ); + return this.setResourcePath( value ); + + } + +} ); + +// + +Object.assign( Box2.prototype, { + + center: function ( optionalTarget ) { + + console.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }, + empty: function () { + + console.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + + }, + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + size: function ( optionalTarget ) { + + console.warn( 'THREE.Box2: .size() has been renamed to .getSize().' ); + return this.getSize( optionalTarget ); + + } +} ); + +Object.assign( Box3.prototype, { + + center: function ( optionalTarget ) { + + console.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }, + empty: function () { + + console.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + + }, + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + isIntersectionSphere: function ( sphere ) { + + console.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); + return this.intersectsSphere( sphere ); + + }, + size: function ( optionalTarget ) { + + console.warn( 'THREE.Box3: .size() has been renamed to .getSize().' ); + return this.getSize( optionalTarget ); + + } +} ); + +Line3.prototype.center = function ( optionalTarget ) { + + console.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + +}; + +Object.assign( _Math, { + + random16: function () { + + console.warn( 'THREE.Math: .random16() has been deprecated. Use Math.random() instead.' ); + return Math.random(); + + }, + + nearestPowerOfTwo: function ( value ) { + + console.warn( 'THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo().' ); + return _Math.floorPowerOfTwo( value ); + + }, + + nextPowerOfTwo: function ( value ) { + + console.warn( 'THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo().' ); + return _Math.ceilPowerOfTwo( value ); + + } + +} ); + +Object.assign( Matrix3.prototype, { + + flattenToArrayOffset: function ( array, offset ) { + + console.warn( "THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead." ); + return this.toArray( array, offset ); + + }, + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' ); + return vector.applyMatrix3( this ); + + }, + multiplyVector3Array: function ( /* a */ ) { + + console.error( 'THREE.Matrix3: .multiplyVector3Array() has been removed.' ); + + }, + applyToBuffer: function ( buffer /*, offset, length */ ) { + + console.warn( 'THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' ); + return this.applyToBufferAttribute( buffer ); + + }, + applyToVector3Array: function ( /* array, offset, length */ ) { + + console.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' ); + + } + +} ); + +Object.assign( Matrix4.prototype, { + + extractPosition: function ( m ) { + + console.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' ); + return this.copyPosition( m ); + + }, + flattenToArrayOffset: function ( array, offset ) { + + console.warn( "THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead." ); + return this.toArray( array, offset ); + + }, + getPosition: function () { + + var v1; + + return function getPosition() { + + if ( v1 === undefined ) v1 = new Vector3(); + console.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' ); + return v1.setFromMatrixColumn( this, 3 ); + + }; + + }(), + setRotationFromQuaternion: function ( q ) { + + console.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' ); + return this.makeRotationFromQuaternion( q ); + + }, + multiplyToArray: function () { + + console.warn( 'THREE.Matrix4: .multiplyToArray() has been removed.' ); + + }, + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + multiplyVector4: function ( vector ) { + + console.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + multiplyVector3Array: function ( /* a */ ) { + + console.error( 'THREE.Matrix4: .multiplyVector3Array() has been removed.' ); + + }, + rotateAxis: function ( v ) { + + console.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' ); + v.transformDirection( this ); + + }, + crossVector: function ( vector ) { + + console.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + translate: function () { + + console.error( 'THREE.Matrix4: .translate() has been removed.' ); + + }, + rotateX: function () { + + console.error( 'THREE.Matrix4: .rotateX() has been removed.' ); + + }, + rotateY: function () { + + console.error( 'THREE.Matrix4: .rotateY() has been removed.' ); + + }, + rotateZ: function () { + + console.error( 'THREE.Matrix4: .rotateZ() has been removed.' ); + + }, + rotateByAxis: function () { + + console.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' ); + + }, + applyToBuffer: function ( buffer /*, offset, length */ ) { + + console.warn( 'THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' ); + return this.applyToBufferAttribute( buffer ); + + }, + applyToVector3Array: function ( /* array, offset, length */ ) { + + console.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' ); + + }, + makeFrustum: function ( left, right, bottom, top, near, far ) { + + console.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' ); + return this.makePerspective( left, right, top, bottom, near, far ); + + } + +} ); + +Plane.prototype.isIntersectionLine = function ( line ) { + + console.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' ); + return this.intersectsLine( line ); + +}; + +Quaternion.prototype.multiplyVector3 = function ( vector ) { + + console.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' ); + return vector.applyQuaternion( this ); + +}; + +Object.assign( Ray.prototype, { + + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + isIntersectionPlane: function ( plane ) { + + console.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' ); + return this.intersectsPlane( plane ); + + }, + isIntersectionSphere: function ( sphere ) { + + console.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); + return this.intersectsSphere( sphere ); + + } + +} ); + +Object.assign( Triangle.prototype, { + + area: function () { + + console.warn( 'THREE.Triangle: .area() has been renamed to .getArea().' ); + return this.getArea(); + + }, + barycoordFromPoint: function ( point, target ) { + + console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' ); + return this.getBarycoord( point, target ); + + }, + midpoint: function ( target ) { + + console.warn( 'THREE.Triangle: .midpoint() has been renamed to .getMidpoint().' ); + return this.getMidpoint( target ); + + }, + normal: function ( target ) { + + console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' ); + return this.getNormal( target ); + + }, + plane: function ( target ) { + + console.warn( 'THREE.Triangle: .plane() has been renamed to .getPlane().' ); + return this.getPlane( target ); + + } + +} ); + +Object.assign( Triangle, { + + barycoordFromPoint: function ( point, a, b, c, target ) { + + console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' ); + return Triangle.getBarycoord( point, a, b, c, target ); + + }, + normal: function ( a, b, c, target ) { + + console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' ); + return Triangle.getNormal( a, b, c, target ); + + } + +} ); + +Object.assign( Shape.prototype, { + + extractAllPoints: function ( divisions ) { + + console.warn( 'THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.' ); + return this.extractPoints( divisions ); + + }, + extrude: function ( options ) { + + console.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' ); + return new ExtrudeGeometry( this, options ); + + }, + makeGeometry: function ( options ) { + + console.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' ); + return new ShapeGeometry( this, options ); + + } + +} ); + +Object.assign( Vector2.prototype, { + + fromAttribute: function ( attribute, index, offset ) { + + console.warn( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + }, + distanceToManhattan: function ( v ) { + + console.warn( 'THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' ); + return this.manhattanDistanceTo( v ); + + }, + lengthManhattan: function () { + + console.warn( 'THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().' ); + return this.manhattanLength(); + + } + +} ); + +Object.assign( Vector3.prototype, { + + setEulerFromRotationMatrix: function () { + + console.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' ); + + }, + setEulerFromQuaternion: function () { + + console.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' ); + + }, + getPositionFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' ); + return this.setFromMatrixPosition( m ); + + }, + getScaleFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' ); + return this.setFromMatrixScale( m ); + + }, + getColumnFromMatrix: function ( index, matrix ) { + + console.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' ); + return this.setFromMatrixColumn( matrix, index ); + + }, + applyProjection: function ( m ) { + + console.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' ); + return this.applyMatrix4( m ); + + }, + fromAttribute: function ( attribute, index, offset ) { + + console.warn( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + }, + distanceToManhattan: function ( v ) { + + console.warn( 'THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' ); + return this.manhattanDistanceTo( v ); + + }, + lengthManhattan: function () { + + console.warn( 'THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().' ); + return this.manhattanLength(); + + } + +} ); + +Object.assign( Vector4.prototype, { + + fromAttribute: function ( attribute, index, offset ) { + + console.warn( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + }, + lengthManhattan: function () { + + console.warn( 'THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().' ); + return this.manhattanLength(); + + } + +} ); + +// + +Object.assign( Geometry.prototype, { + + computeTangents: function () { + + console.error( 'THREE.Geometry: .computeTangents() has been removed.' ); + + }, + computeLineDistances: function () { + + console.error( 'THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.' ); + + } + +} ); + +Object.assign( Object3D.prototype, { + + getChildByName: function ( name ) { + + console.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' ); + return this.getObjectByName( name ); + + }, + renderDepth: function () { + + console.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' ); + + }, + translate: function ( distance, axis ) { + + console.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' ); + return this.translateOnAxis( axis, distance ); + + }, + getWorldRotation: function () { + + console.error( 'THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.' ); + + } + +} ); + +Object.defineProperties( Object3D.prototype, { + + eulerOrder: { + get: function () { + + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + return this.rotation.order; + + }, + set: function ( value ) { + + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + this.rotation.order = value; + + } + }, + useQuaternion: { + get: function () { + + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + + }, + set: function () { + + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + + } + } + +} ); + +Object.defineProperties( LOD.prototype, { + + objects: { + get: function () { + + console.warn( 'THREE.LOD: .objects has been renamed to .levels.' ); + return this.levels; + + } + } + +} ); + +Object.defineProperty( Skeleton.prototype, 'useVertexTexture', { + + get: function () { + + console.warn( 'THREE.Skeleton: useVertexTexture has been removed.' ); + + }, + set: function () { + + console.warn( 'THREE.Skeleton: useVertexTexture has been removed.' ); + + } + +} ); + +Object.defineProperty( Curve.prototype, '__arcLengthDivisions', { + + get: function () { + + console.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' ); + return this.arcLengthDivisions; + + }, + set: function ( value ) { + + console.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' ); + this.arcLengthDivisions = value; + + } + +} ); + +// + +PerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) { + + console.warn( "THREE.PerspectiveCamera.setLens is deprecated. " + + "Use .setFocalLength and .filmGauge for a photographic setup." ); + + if ( filmGauge !== undefined ) this.filmGauge = filmGauge; + this.setFocalLength( focalLength ); + +}; + +// + +Object.defineProperties( Light.prototype, { + onlyShadow: { + set: function () { + + console.warn( 'THREE.Light: .onlyShadow has been removed.' ); + + } + }, + shadowCameraFov: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' ); + this.shadow.camera.fov = value; + + } + }, + shadowCameraLeft: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' ); + this.shadow.camera.left = value; + + } + }, + shadowCameraRight: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' ); + this.shadow.camera.right = value; + + } + }, + shadowCameraTop: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' ); + this.shadow.camera.top = value; + + } + }, + shadowCameraBottom: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' ); + this.shadow.camera.bottom = value; + + } + }, + shadowCameraNear: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' ); + this.shadow.camera.near = value; + + } + }, + shadowCameraFar: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' ); + this.shadow.camera.far = value; + + } + }, + shadowCameraVisible: { + set: function () { + + console.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' ); + + } + }, + shadowBias: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' ); + this.shadow.bias = value; + + } + }, + shadowDarkness: { + set: function () { + + console.warn( 'THREE.Light: .shadowDarkness has been removed.' ); + + } + }, + shadowMapWidth: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' ); + this.shadow.mapSize.width = value; + + } + }, + shadowMapHeight: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' ); + this.shadow.mapSize.height = value; + + } + } +} ); + +// + +Object.defineProperties( BufferAttribute.prototype, { + + length: { + get: function () { + + console.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' ); + return this.array.length; + + } + }, + copyIndicesArray: function ( /* indices */ ) { + + console.error( 'THREE.BufferAttribute: .copyIndicesArray() has been removed.' ); + + } + +} ); + +Object.assign( BufferGeometry.prototype, { + + addIndex: function ( index ) { + + console.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' ); + this.setIndex( index ); + + }, + addDrawCall: function ( start, count, indexOffset ) { + + if ( indexOffset !== undefined ) { + + console.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' ); + + } + console.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' ); + this.addGroup( start, count ); + + }, + clearDrawCalls: function () { + + console.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' ); + this.clearGroups(); + + }, + computeTangents: function () { + + console.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' ); + + }, + computeOffsets: function () { + + console.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' ); + + } + +} ); + +Object.defineProperties( BufferGeometry.prototype, { + + drawcalls: { + get: function () { + + console.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' ); + return this.groups; + + } + }, + offsets: { + get: function () { + + console.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' ); + return this.groups; + + } + } + +} ); + +// + +Object.assign( ExtrudeBufferGeometry.prototype, { + + getArrays: function () { + + console.error( 'THREE.ExtrudeBufferGeometry: .getArrays() has been removed.' ); + + }, + + addShapeList: function () { + + console.error( 'THREE.ExtrudeBufferGeometry: .addShapeList() has been removed.' ); + + }, + + addShape: function () { + + console.error( 'THREE.ExtrudeBufferGeometry: .addShape() has been removed.' ); + + } + +} ); + +// + +Object.defineProperties( Uniform.prototype, { + + dynamic: { + set: function () { + + console.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' ); + + } + }, + onUpdate: { + value: function () { + + console.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' ); + return this; + + } + } + +} ); + +// + +Object.defineProperties( Material.prototype, { + + wrapAround: { + get: function () { + + console.warn( 'THREE.Material: .wrapAround has been removed.' ); + + }, + set: function () { + + console.warn( 'THREE.Material: .wrapAround has been removed.' ); + + } + }, + + overdraw: { + get: function () { + + console.warn( 'THREE.Material: .overdraw has been removed.' ); + + }, + set: function () { + + console.warn( 'THREE.Material: .overdraw has been removed.' ); + + } + }, + + wrapRGB: { + get: function () { + + console.warn( 'THREE.Material: .wrapRGB has been removed.' ); + return new Color(); + + } + }, + + shading: { + get: function () { + + console.error( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' ); + + }, + set: function ( value ) { + + console.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' ); + this.flatShading = ( value === FlatShading ); + + } + } + +} ); + +Object.defineProperties( MeshPhongMaterial.prototype, { + + metal: { + get: function () { + + console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' ); + return false; + + }, + set: function () { + + console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' ); + + } + } + +} ); + +Object.defineProperties( ShaderMaterial.prototype, { + + derivatives: { + get: function () { + + console.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); + return this.extensions.derivatives; + + }, + set: function ( value ) { + + console.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); + this.extensions.derivatives = value; + + } + } + +} ); + +// + +Object.assign( WebGLRenderer.prototype, { + + clearTarget: function ( renderTarget, color, depth, stencil ) { + + console.warn( 'THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead.' ); + this.setRenderTarget( renderTarget ); + this.clear( color, depth, stencil ); + + }, + + animate: function ( callback ) { + + console.warn( 'THREE.WebGLRenderer: .animate() is now .setAnimationLoop().' ); + this.setAnimationLoop( callback ); + + }, + + getCurrentRenderTarget: function () { + + console.warn( 'THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().' ); + return this.getRenderTarget(); + + }, + + getMaxAnisotropy: function () { + + console.warn( 'THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().' ); + return this.capabilities.getMaxAnisotropy(); + + }, + + getPrecision: function () { + + console.warn( 'THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.' ); + return this.capabilities.precision; + + }, + + resetGLState: function () { + + console.warn( 'THREE.WebGLRenderer: .resetGLState() is now .state.reset().' ); + return this.state.reset(); + + }, + + supportsFloatTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \'OES_texture_float\' ).' ); + return this.extensions.get( 'OES_texture_float' ); + + }, + supportsHalfFloatTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \'OES_texture_half_float\' ).' ); + return this.extensions.get( 'OES_texture_half_float' ); + + }, + supportsStandardDerivatives: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \'OES_standard_derivatives\' ).' ); + return this.extensions.get( 'OES_standard_derivatives' ); + + }, + supportsCompressedTextureS3TC: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \'WEBGL_compressed_texture_s3tc\' ).' ); + return this.extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + }, + supportsCompressedTexturePVRTC: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \'WEBGL_compressed_texture_pvrtc\' ).' ); + return this.extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + }, + supportsBlendMinMax: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \'EXT_blend_minmax\' ).' ); + return this.extensions.get( 'EXT_blend_minmax' ); + + }, + supportsVertexTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' ); + return this.capabilities.vertexTextures; + + }, + supportsInstancedArrays: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \'ANGLE_instanced_arrays\' ).' ); + return this.extensions.get( 'ANGLE_instanced_arrays' ); + + }, + enableScissorTest: function ( boolean ) { + + console.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' ); + this.setScissorTest( boolean ); + + }, + initMaterial: function () { + + console.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' ); + + }, + addPrePlugin: function () { + + console.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' ); + + }, + addPostPlugin: function () { + + console.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' ); + + }, + updateShadowMap: function () { + + console.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' ); + + }, + setFaceCulling: function () { + + console.warn( 'THREE.WebGLRenderer: .setFaceCulling() has been removed.' ); + + } + +} ); + +Object.defineProperties( WebGLRenderer.prototype, { + + shadowMapEnabled: { + get: function () { + + return this.shadowMap.enabled; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' ); + this.shadowMap.enabled = value; + + } + }, + shadowMapType: { + get: function () { + + return this.shadowMap.type; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' ); + this.shadowMap.type = value; + + } + }, + shadowMapCullFace: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function ( /* value */ ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' ); + + } + } +} ); + +Object.defineProperties( WebGLShadowMap.prototype, { + + cullFace: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function ( /* cullFace */ ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' ); + + } + }, + renderReverseSided: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' ); + + } + }, + renderSingleSided: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' ); + + } + } + +} ); + +// + +Object.defineProperties( WebGLRenderTarget.prototype, { + + wrapS: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + return this.texture.wrapS; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + this.texture.wrapS = value; + + } + }, + wrapT: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + return this.texture.wrapT; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + this.texture.wrapT = value; + + } + }, + magFilter: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + return this.texture.magFilter; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + this.texture.magFilter = value; + + } + }, + minFilter: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + return this.texture.minFilter; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + this.texture.minFilter = value; + + } + }, + anisotropy: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + return this.texture.anisotropy; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + this.texture.anisotropy = value; + + } + }, + offset: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + return this.texture.offset; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + this.texture.offset = value; + + } + }, + repeat: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + return this.texture.repeat; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + this.texture.repeat = value; + + } + }, + format: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + return this.texture.format; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + this.texture.format = value; + + } + }, + type: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + return this.texture.type; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + this.texture.type = value; + + } + }, + generateMipmaps: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + return this.texture.generateMipmaps; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + this.texture.generateMipmaps = value; + + } + } + +} ); + +// + +Object.defineProperties( WebVRManager.prototype, { + + standing: { + set: function ( /* value */ ) { + + console.warn( 'THREE.WebVRManager: .standing has been removed.' ); + + } + }, + userHeight: { + set: function ( /* value */ ) { + + console.warn( 'THREE.WebVRManager: .userHeight has been removed.' ); + + } + } + +} ); + +// + +Audio.prototype.load = function ( file ) { + + console.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' ); + var scope = this; + var audioLoader = new AudioLoader(); + audioLoader.load( file, function ( buffer ) { + + scope.setBuffer( buffer ); + + } ); + return this; + +}; + +AudioAnalyser.prototype.getData = function () { + + console.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' ); + return this.getFrequencyData(); + +}; + +// + +CubeCamera.prototype.updateCubeMap = function ( renderer, scene ) { + + console.warn( 'THREE.CubeCamera: .updateCubeMap() is now .update().' ); + return this.update( renderer, scene ); + +}; + +// + +export var GeometryUtils = { + + merge: function ( geometry1, geometry2, materialIndexOffset ) { + + console.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' ); + var matrix; + + if ( geometry2.isMesh ) { + + geometry2.matrixAutoUpdate && geometry2.updateMatrix(); + + matrix = geometry2.matrix; + geometry2 = geometry2.geometry; + + } + + geometry1.merge( geometry2, matrix, materialIndexOffset ); + + }, + + center: function ( geometry ) { + + console.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' ); + return geometry.center(); + + } + +}; + +ImageUtils.crossOrigin = undefined; + +ImageUtils.loadTexture = function ( url, mapping, onLoad, onError ) { + + console.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' ); + + var loader = new TextureLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + var texture = loader.load( url, onLoad, undefined, onError ); + + if ( mapping ) texture.mapping = mapping; + + return texture; + +}; + +ImageUtils.loadTextureCube = function ( urls, mapping, onLoad, onError ) { + + console.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' ); + + var loader = new CubeTextureLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + var texture = loader.load( urls, onLoad, undefined, onError ); + + if ( mapping ) texture.mapping = mapping; + + return texture; + +}; + +ImageUtils.loadCompressedTexture = function () { + + console.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' ); + +}; + +ImageUtils.loadCompressedTextureCube = function () { + + console.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' ); + +}; + +// + +export function Projector() { + + console.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' ); + + this.projectVector = function ( vector, camera ) { + + console.warn( 'THREE.Projector: .projectVector() is now vector.project().' ); + vector.project( camera ); + + }; + + this.unprojectVector = function ( vector, camera ) { + + console.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' ); + vector.unproject( camera ); + + }; + + this.pickingRay = function () { + + console.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' ); + + }; + +} + +// + +export function CanvasRenderer() { + + console.error( 'THREE.CanvasRenderer has been removed' ); + +} + +// + +export var SceneUtils = { + + createMultiMaterialObject: function ( /* geometry, materials */ ) { + + console.error( 'THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js' ); + + }, + + detach: function ( /* child, parent, scene */ ) { + + console.error( 'THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js' ); + + }, + + attach: function ( /* child, scene, parent */ ) { + + console.error( 'THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js' ); + + } + +}; + +// + +export function LensFlare() { + + console.error( 'THREE.LensFlare has been moved to /examples/js/objects/Lensflare.js' ); + +} diff --git a/lib/Three.js b/lib/Three.js new file mode 100644 index 0000000..365a901 --- /dev/null +++ b/lib/Three.js @@ -0,0 +1,154 @@ +import './polyfills.js'; + +export { WebGLRenderTargetCube } from './renderers/WebGLRenderTargetCube.js'; +export { WebGLRenderTarget } from './renderers/WebGLRenderTarget.js'; +export { WebGLRenderer } from './renderers/WebGLRenderer.js'; +// export { WebGL2Renderer } from './renderers/WebGL2Renderer.js'; +export { ShaderLib } from './renderers/shaders/ShaderLib.js'; +export { UniformsLib } from './renderers/shaders/UniformsLib.js'; +export { UniformsUtils } from './renderers/shaders/UniformsUtils.js'; +export { ShaderChunk } from './renderers/shaders/ShaderChunk.js'; +export { FogExp2 } from './scenes/FogExp2.js'; +export { Fog } from './scenes/Fog.js'; +export { Scene } from './scenes/Scene.js'; +export { Sprite } from './objects/Sprite.js'; +export { LOD } from './objects/LOD.js'; +export { SkinnedMesh } from './objects/SkinnedMesh.js'; +export { Skeleton } from './objects/Skeleton.js'; +export { Bone } from './objects/Bone.js'; +export { Mesh } from './objects/Mesh.js'; +export { LineSegments } from './objects/LineSegments.js'; +export { LineLoop } from './objects/LineLoop.js'; +export { Line } from './objects/Line.js'; +export { Points } from './objects/Points.js'; +export { Group } from './objects/Group.js'; +export { VideoTexture } from './textures/VideoTexture.js'; +export { DataTexture } from './textures/DataTexture.js'; +export { DataTexture3D } from './textures/DataTexture3D.js'; +export { CompressedTexture } from './textures/CompressedTexture.js'; +export { CubeTexture } from './textures/CubeTexture.js'; +export { CanvasTexture } from './textures/CanvasTexture.js'; +export { DepthTexture } from './textures/DepthTexture.js'; +export { Texture } from './textures/Texture.js'; +export * from './geometries/Geometries.js'; +export * from './materials/Materials.js'; +export { AnimationLoader } from './loaders/AnimationLoader.js'; +export { CompressedTextureLoader } from './loaders/CompressedTextureLoader.js'; +export { DataTextureLoader } from './loaders/DataTextureLoader.js'; +export { CubeTextureLoader } from './loaders/CubeTextureLoader.js'; +export { TextureLoader } from './loaders/TextureLoader.js'; +export { ObjectLoader } from './loaders/ObjectLoader.js'; +export { MaterialLoader } from './loaders/MaterialLoader.js'; +export { BufferGeometryLoader } from './loaders/BufferGeometryLoader.js'; +export { DefaultLoadingManager, LoadingManager } from './loaders/LoadingManager.js'; +export { JSONLoader } from './loaders/JSONLoader.js'; +export { ImageLoader } from './loaders/ImageLoader.js'; +export { ImageBitmapLoader } from './loaders/ImageBitmapLoader.js'; +export { FontLoader } from './loaders/FontLoader.js'; +export { FileLoader } from './loaders/FileLoader.js'; +export { Loader } from './loaders/Loader.js'; +export { LoaderUtils } from './loaders/LoaderUtils.js'; +export { Cache } from './loaders/Cache.js'; +export { AudioLoader } from './loaders/AudioLoader.js'; +export { SpotLightShadow } from './lights/SpotLightShadow.js'; +export { SpotLight } from './lights/SpotLight.js'; +export { PointLight } from './lights/PointLight.js'; +export { RectAreaLight } from './lights/RectAreaLight.js'; +export { HemisphereLight } from './lights/HemisphereLight.js'; +export { DirectionalLightShadow } from './lights/DirectionalLightShadow.js'; +export { DirectionalLight } from './lights/DirectionalLight.js'; +export { AmbientLight } from './lights/AmbientLight.js'; +export { LightShadow } from './lights/LightShadow.js'; +export { Light } from './lights/Light.js'; +export { StereoCamera } from './cameras/StereoCamera.js'; +export { PerspectiveCamera } from './cameras/PerspectiveCamera.js'; +export { OrthographicCamera } from './cameras/OrthographicCamera.js'; +export { CubeCamera } from './cameras/CubeCamera.js'; +export { ArrayCamera } from './cameras/ArrayCamera.js'; +export { Camera } from './cameras/Camera.js'; +export { AudioListener } from './audio/AudioListener.js'; +export { PositionalAudio } from './audio/PositionalAudio.js'; +export { AudioContext } from './audio/AudioContext.js'; +export { AudioAnalyser } from './audio/AudioAnalyser.js'; +export { Audio } from './audio/Audio.js'; +export { VectorKeyframeTrack } from './animation/tracks/VectorKeyframeTrack.js'; +export { StringKeyframeTrack } from './animation/tracks/StringKeyframeTrack.js'; +export { QuaternionKeyframeTrack } from './animation/tracks/QuaternionKeyframeTrack.js'; +export { NumberKeyframeTrack } from './animation/tracks/NumberKeyframeTrack.js'; +export { ColorKeyframeTrack } from './animation/tracks/ColorKeyframeTrack.js'; +export { BooleanKeyframeTrack } from './animation/tracks/BooleanKeyframeTrack.js'; +export { PropertyMixer } from './animation/PropertyMixer.js'; +export { PropertyBinding } from './animation/PropertyBinding.js'; +export { KeyframeTrack } from './animation/KeyframeTrack.js'; +export { AnimationUtils } from './animation/AnimationUtils.js'; +export { AnimationObjectGroup } from './animation/AnimationObjectGroup.js'; +export { AnimationMixer } from './animation/AnimationMixer.js'; +export { AnimationClip } from './animation/AnimationClip.js'; +export { Uniform } from './core/Uniform.js'; +export { InstancedBufferGeometry } from './core/InstancedBufferGeometry.js'; +export { BufferGeometry } from './core/BufferGeometry.js'; +export { Geometry } from './core/Geometry.js'; +export { InterleavedBufferAttribute } from './core/InterleavedBufferAttribute.js'; +export { InstancedInterleavedBuffer } from './core/InstancedInterleavedBuffer.js'; +export { InterleavedBuffer } from './core/InterleavedBuffer.js'; +export { InstancedBufferAttribute } from './core/InstancedBufferAttribute.js'; +export * from './core/BufferAttribute.js'; +export { Face3 } from './core/Face3.js'; +export { Object3D } from './core/Object3D.js'; +export { Raycaster } from './core/Raycaster.js'; +export { Layers } from './core/Layers.js'; +export { EventDispatcher } from './core/EventDispatcher.js'; +export { Clock } from './core/Clock.js'; +export { QuaternionLinearInterpolant } from './math/interpolants/QuaternionLinearInterpolant.js'; +export { LinearInterpolant } from './math/interpolants/LinearInterpolant.js'; +export { DiscreteInterpolant } from './math/interpolants/DiscreteInterpolant.js'; +export { CubicInterpolant } from './math/interpolants/CubicInterpolant.js'; +export { Interpolant } from './math/Interpolant.js'; +export { Triangle } from './math/Triangle.js'; +export { _Math as Math } from './math/Math.js'; +export { Spherical } from './math/Spherical.js'; +export { Cylindrical } from './math/Cylindrical.js'; +export { Plane } from './math/Plane.js'; +export { Frustum } from './math/Frustum.js'; +export { Sphere } from './math/Sphere.js'; +export { Ray } from './math/Ray.js'; +export { Matrix4 } from './math/Matrix4.js'; +export { Matrix3 } from './math/Matrix3.js'; +export { Box3 } from './math/Box3.js'; +export { Box2 } from './math/Box2.js'; +export { Line3 } from './math/Line3.js'; +export { Euler } from './math/Euler.js'; +export { Vector4 } from './math/Vector4.js'; +export { Vector3 } from './math/Vector3.js'; +export { Vector2 } from './math/Vector2.js'; +export { Quaternion } from './math/Quaternion.js'; +export { Color } from './math/Color.js'; +export { ImmediateRenderObject } from './extras/objects/ImmediateRenderObject.js'; +export { VertexNormalsHelper } from './helpers/VertexNormalsHelper.js'; +export { SpotLightHelper } from './helpers/SpotLightHelper.js'; +export { SkeletonHelper } from './helpers/SkeletonHelper.js'; +export { PointLightHelper } from './helpers/PointLightHelper.js'; +export { RectAreaLightHelper } from './helpers/RectAreaLightHelper.js'; +export { HemisphereLightHelper } from './helpers/HemisphereLightHelper.js'; +export { GridHelper } from './helpers/GridHelper.js'; +export { PolarGridHelper } from './helpers/PolarGridHelper.js'; +export { FaceNormalsHelper } from './helpers/FaceNormalsHelper.js'; +export { DirectionalLightHelper } from './helpers/DirectionalLightHelper.js'; +export { CameraHelper } from './helpers/CameraHelper.js'; +export { BoxHelper } from './helpers/BoxHelper.js'; +export { Box3Helper } from './helpers/Box3Helper.js'; +export { PlaneHelper } from './helpers/PlaneHelper.js'; +export { ArrowHelper } from './helpers/ArrowHelper.js'; +export { AxesHelper } from './helpers/AxesHelper.js'; +export * from './extras/curves/Curves.js'; +export { Shape } from './extras/core/Shape.js'; +export { Path } from './extras/core/Path.js'; +export { ShapePath } from './extras/core/ShapePath.js'; +export { Font } from './extras/core/Font.js'; +export { CurvePath } from './extras/core/CurvePath.js'; +export { Curve } from './extras/core/Curve.js'; +export { ImageUtils } from './extras/ImageUtils.js'; +export { ShapeUtils } from './extras/ShapeUtils.js'; +export { WebGLUtils } from './renderers/webgl/WebGLUtils.js'; +export * from './constants.js'; +export * from './Three.Legacy.js'; diff --git a/lib/Tween.js b/lib/Tween.js new file mode 100644 index 0000000..57a1be3 --- /dev/null +++ b/lib/Tween.js @@ -0,0 +1,917 @@ +/** + * Tween.js - Licensed under the MIT license + * https://github.com/tweenjs/tween.js + * ---------------------------------------------- + * + * See https://github.com/tweenjs/tween.js/graphs/contributors for the full list of contributors. + * Thank you all, you're awesome! + */ + + +var _Group = function () { + this._tweens = {}; + this._tweensAddedDuringUpdate = {}; +}; + +_Group.prototype = { + getAll: function () { + + return Object.keys(this._tweens).map(function (tweenId) { + return this._tweens[tweenId]; + }.bind(this)); + + }, + + removeAll: function () { + + this._tweens = {}; + + }, + + add: function (tween) { + + this._tweens[tween.getId()] = tween; + this._tweensAddedDuringUpdate[tween.getId()] = tween; + + }, + + remove: function (tween) { + + delete this._tweens[tween.getId()]; + delete this._tweensAddedDuringUpdate[tween.getId()]; + + }, + + update: function (time, preserve) { + + var tweenIds = Object.keys(this._tweens); + + if (tweenIds.length === 0) { + return false; + } + + time = time !== undefined ? time : TWEEN.now(); + + // Tweens are updated in "batches". If you add a new tween during an update, then the + // new tween will be updated in the next batch. + // If you remove a tween during an update, it may or may not be updated. However, + // if the removed tween was added during the current batch, then it will not be updated. + while (tweenIds.length > 0) { + this._tweensAddedDuringUpdate = {}; + + for (var i = 0; i < tweenIds.length; i++) { + + var tween = this._tweens[tweenIds[i]]; + + if (tween && tween.update(time) === false) { + tween._isPlaying = false; + + if (!preserve) { + delete this._tweens[tweenIds[i]]; + } + } + } + + tweenIds = Object.keys(this._tweensAddedDuringUpdate); + } + + return true; + + } +}; + +var TWEEN = new _Group(); + +TWEEN.Group = _Group; +TWEEN._nextId = 0; +TWEEN.nextId = function () { + return TWEEN._nextId++; +}; + + +// Include a performance.now polyfill. +// In node.js, use process.hrtime. +if (typeof (window) === 'undefined' && typeof (process) !== 'undefined') { + TWEEN.now = function () { + var time = process.hrtime(); + + // Convert [seconds, nanoseconds] to milliseconds. + return time[0] * 1000 + time[1] / 1000000; + }; +} +// In a browser, use window.performance.now if it is available. +else if (typeof (window) !== 'undefined' && + window.performance !== undefined && + window.performance.now !== undefined) { + // This must be bound, because directly assigning this function + // leads to an invocation exception in Chrome. + TWEEN.now = window.performance.now.bind(window.performance); +} +// Use Date.now if it is available. +else if (Date.now !== undefined) { + TWEEN.now = Date.now; +} +// Otherwise, use 'new Date().getTime()'. +else { + TWEEN.now = function () { + return new Date().getTime(); + }; +} + + +TWEEN.Tween = function (object, group) { + this._object = object; + this._valuesStart = {}; + this._valuesEnd = {}; + this._valuesStartRepeat = {}; + this._duration = 1000; + this._repeat = 0; + this._repeatDelayTime = undefined; + this._yoyo = false; + this._isPlaying = false; + this._reversed = false; + this._delayTime = 0; + this._startTime = null; + this._easingFunction = TWEEN.Easing.Linear.None; + this._interpolationFunction = TWEEN.Interpolation.Linear; + this._chainedTweens = []; + this._onStartCallback = null; + this._onStartCallbackFired = false; + this._onUpdateCallback = null; + this._onCompleteCallback = null; + this._onStopCallback = null; + this._group = group || TWEEN; + this._id = TWEEN.nextId(); + +}; + +TWEEN.Tween.prototype = { + getId: function getId() { + return this._id; + }, + + isPlaying: function isPlaying() { + return this._isPlaying; + }, + + to: function to(properties, duration) { + + this._valuesEnd = properties; + + if (duration !== undefined) { + this._duration = duration; + } + + return this; + + }, + + start: function start(time) { + + this._group.add(this); + + this._isPlaying = true; + + this._onStartCallbackFired = false; + + this._startTime = time !== undefined ? typeof time === 'string' ? TWEEN.now() + parseFloat(time) : time : TWEEN.now(); + this._startTime += this._delayTime; + + for (var property in this._valuesEnd) { + + // Check if an Array was provided as property value + if (this._valuesEnd[property] instanceof Array) { + + if (this._valuesEnd[property].length === 0) { + continue; + } + + // Create a local copy of the Array with the start value at the front + this._valuesEnd[property] = [this._object[property]].concat(this._valuesEnd[property]); + + } + + // If `to()` specifies a property that doesn't exist in the source object, + // we should not set that property in the object + if (this._object[property] === undefined) { + continue; + } + + // Save the starting value. + this._valuesStart[property] = this._object[property]; + + if ((this._valuesStart[property] instanceof Array) === false) { + this._valuesStart[property] *= 1.0; // Ensures we're using numbers, not strings + } + + this._valuesStartRepeat[property] = this._valuesStart[property] || 0; + + } + + return this; + + }, + + stop: function stop() { + + if (!this._isPlaying) { + return this; + } + + this._group.remove(this); + this._isPlaying = false; + + if (this._onStopCallback !== null) { + this._onStopCallback(this._object); + } + + this.stopChainedTweens(); + return this; + + }, + + end: function end() { + + this.update(this._startTime + this._duration); + return this; + + }, + + stopChainedTweens: function stopChainedTweens() { + + for (var i = 0, numChainedTweens = this._chainedTweens.length; i < numChainedTweens; i++) { + this._chainedTweens[i].stop(); + } + + }, + + group: function group(group) { + this._group = group; + return this; + }, + + delay: function delay(amount) { + + this._delayTime = amount; + return this; + + }, + + repeat: function repeat(times) { + + this._repeat = times; + return this; + + }, + + repeatDelay: function repeatDelay(amount) { + + this._repeatDelayTime = amount; + return this; + + }, + + yoyo: function yoyo(yy) { + + this._yoyo = yy; + return this; + + }, + + easing: function easing(eas) { + + this._easingFunction = eas; + return this; + + }, + + interpolation: function interpolation(inter) { + + this._interpolationFunction = inter; + return this; + + }, + + chain: function chain() { + + this._chainedTweens = arguments; + return this; + + }, + + onStart: function onStart(callback) { + + this._onStartCallback = callback; + return this; + + }, + + onUpdate: function onUpdate(callback) { + + this._onUpdateCallback = callback; + return this; + + }, + + onComplete: function onComplete(callback) { + + this._onCompleteCallback = callback; + return this; + + }, + + onStop: function onStop(callback) { + + this._onStopCallback = callback; + return this; + + }, + + update: function update(time) { + + var property; + var elapsed; + var value; + + if (time < this._startTime) { + return true; + } + + if (this._onStartCallbackFired === false) { + + if (this._onStartCallback !== null) { + this._onStartCallback(this._object); + } + + this._onStartCallbackFired = true; + } + + elapsed = (time - this._startTime) / this._duration; + elapsed = (this._duration === 0 || elapsed > 1) ? 1 : elapsed; + + value = this._easingFunction(elapsed); + + for (property in this._valuesEnd) { + + // Don't update properties that do not exist in the source object + if (this._valuesStart[property] === undefined) { + continue; + } + + var start = this._valuesStart[property] || 0; + var end = this._valuesEnd[property]; + + if (end instanceof Array) { + + this._object[property] = this._interpolationFunction(end, value); + + } else { + + // Parses relative end values with start as base (e.g.: +10, -3) + if (typeof (end) === 'string') { + + if (end.charAt(0) === '+' || end.charAt(0) === '-') { + end = start + parseFloat(end); + } else { + end = parseFloat(end); + } + } + + // Protect against non numeric properties. + if (typeof (end) === 'number') { + this._object[property] = start + (end - start) * value; + } + + } + + } + + if (this._onUpdateCallback !== null) { + this._onUpdateCallback(this._object); + } + + if (elapsed === 1) { + + if (this._repeat > 0) { + + if (isFinite(this._repeat)) { + this._repeat--; + } + + // Reassign starting values, restart by making startTime = now + for (property in this._valuesStartRepeat) { + + if (typeof (this._valuesEnd[property]) === 'string') { + this._valuesStartRepeat[property] = this._valuesStartRepeat[property] + parseFloat(this._valuesEnd[property]); + } + + if (this._yoyo) { + var tmp = this._valuesStartRepeat[property]; + + this._valuesStartRepeat[property] = this._valuesEnd[property]; + this._valuesEnd[property] = tmp; + } + + this._valuesStart[property] = this._valuesStartRepeat[property]; + + } + + if (this._yoyo) { + this._reversed = !this._reversed; + } + + if (this._repeatDelayTime !== undefined) { + this._startTime = time + this._repeatDelayTime; + } else { + this._startTime = time + this._delayTime; + } + + return true; + + } else { + + if (this._onCompleteCallback !== null) { + + this._onCompleteCallback(this._object); + } + + for (var i = 0, numChainedTweens = this._chainedTweens.length; i < numChainedTweens; i++) { + // Make the chained tweens start exactly at the time they should, + // even if the `update()` method was called way past the duration of the tween + this._chainedTweens[i].start(this._startTime + this._duration); + } + + return false; + + } + + } + + return true; + + } +}; + + +TWEEN.Easing = { + + Linear: { + + None: function (k) { + + return k; + + } + + }, + + Quadratic: { + + In: function (k) { + + return k * k; + + }, + + Out: function (k) { + + return k * (2 - k); + + }, + + InOut: function (k) { + + if ((k *= 2) < 1) { + return 0.5 * k * k; + } + + return - 0.5 * (--k * (k - 2) - 1); + + } + + }, + + Cubic: { + + In: function (k) { + + return k * k * k; + + }, + + Out: function (k) { + + return --k * k * k + 1; + + }, + + InOut: function (k) { + + if ((k *= 2) < 1) { + return 0.5 * k * k * k; + } + + return 0.5 * ((k -= 2) * k * k + 2); + + } + + }, + + Quartic: { + + In: function (k) { + + return k * k * k * k; + + }, + + Out: function (k) { + + return 1 - (--k * k * k * k); + + }, + + InOut: function (k) { + + if ((k *= 2) < 1) { + return 0.5 * k * k * k * k; + } + + return - 0.5 * ((k -= 2) * k * k * k - 2); + + } + + }, + + Quintic: { + + In: function (k) { + + return k * k * k * k * k; + + }, + + Out: function (k) { + + return --k * k * k * k * k + 1; + + }, + + InOut: function (k) { + + if ((k *= 2) < 1) { + return 0.5 * k * k * k * k * k; + } + + return 0.5 * ((k -= 2) * k * k * k * k + 2); + + } + + }, + + Sinusoidal: { + + In: function (k) { + + return 1 - Math.cos(k * Math.PI / 2); + + }, + + Out: function (k) { + + return Math.sin(k * Math.PI / 2); + + }, + + InOut: function (k) { + + return 0.5 * (1 - Math.cos(Math.PI * k)); + + } + + }, + + Exponential: { + + In: function (k) { + + return k === 0 ? 0 : Math.pow(1024, k - 1); + + }, + + Out: function (k) { + + return k === 1 ? 1 : 1 - Math.pow(2, - 10 * k); + + }, + + InOut: function (k) { + + if (k === 0) { + return 0; + } + + if (k === 1) { + return 1; + } + + if ((k *= 2) < 1) { + return 0.5 * Math.pow(1024, k - 1); + } + + return 0.5 * (- Math.pow(2, - 10 * (k - 1)) + 2); + + } + + }, + + Circular: { + + In: function (k) { + + return 1 - Math.sqrt(1 - k * k); + + }, + + Out: function (k) { + + return Math.sqrt(1 - (--k * k)); + + }, + + InOut: function (k) { + + if ((k *= 2) < 1) { + return - 0.5 * (Math.sqrt(1 - k * k) - 1); + } + + return 0.5 * (Math.sqrt(1 - (k -= 2) * k) + 1); + + } + + }, + + Elastic: { + + In: function (k) { + + if (k === 0) { + return 0; + } + + if (k === 1) { + return 1; + } + + return -Math.pow(2, 10 * (k - 1)) * Math.sin((k - 1.1) * 5 * Math.PI); + + }, + + Out: function (k) { + + if (k === 0) { + return 0; + } + + if (k === 1) { + return 1; + } + + return Math.pow(2, -10 * k) * Math.sin((k - 0.1) * 5 * Math.PI) + 1; + + }, + + InOut: function (k) { + + if (k === 0) { + return 0; + } + + if (k === 1) { + return 1; + } + + k *= 2; + + if (k < 1) { + return -0.5 * Math.pow(2, 10 * (k - 1)) * Math.sin((k - 1.1) * 5 * Math.PI); + } + + return 0.5 * Math.pow(2, -10 * (k - 1)) * Math.sin((k - 1.1) * 5 * Math.PI) + 1; + + } + + }, + + Back: { + + In: function (k) { + + var s = 1.70158; + + return k * k * ((s + 1) * k - s); + + }, + + Out: function (k) { + + var s = 1.70158; + + return --k * k * ((s + 1) * k + s) + 1; + + }, + + InOut: function (k) { + + var s = 1.70158 * 1.525; + + if ((k *= 2) < 1) { + return 0.5 * (k * k * ((s + 1) * k - s)); + } + + return 0.5 * ((k -= 2) * k * ((s + 1) * k + s) + 2); + + } + + }, + + Bounce: { + + In: function (k) { + + return 1 - TWEEN.Easing.Bounce.Out(1 - k); + + }, + + Out: function (k) { + + if (k < (1 / 2.75)) { + return 7.5625 * k * k; + } else if (k < (2 / 2.75)) { + return 7.5625 * (k -= (1.5 / 2.75)) * k + 0.75; + } else if (k < (2.5 / 2.75)) { + return 7.5625 * (k -= (2.25 / 2.75)) * k + 0.9375; + } else { + return 7.5625 * (k -= (2.625 / 2.75)) * k + 0.984375; + } + + }, + + InOut: function (k) { + + if (k < 0.5) { + return TWEEN.Easing.Bounce.In(k * 2) * 0.5; + } + + return TWEEN.Easing.Bounce.Out(k * 2 - 1) * 0.5 + 0.5; + + } + + } + +}; + +TWEEN.Interpolation = { + + Linear: function (v, k) { + + var m = v.length - 1; + var f = m * k; + var i = Math.floor(f); + var fn = TWEEN.Interpolation.Utils.Linear; + + if (k < 0) { + return fn(v[0], v[1], f); + } + + if (k > 1) { + return fn(v[m], v[m - 1], m - f); + } + + return fn(v[i], v[i + 1 > m ? m : i + 1], f - i); + + }, + + Bezier: function (v, k) { + + var b = 0; + var n = v.length - 1; + var pw = Math.pow; + var bn = TWEEN.Interpolation.Utils.Bernstein; + + for (var i = 0; i <= n; i++) { + b += pw(1 - k, n - i) * pw(k, i) * v[i] * bn(n, i); + } + + return b; + + }, + + CatmullRom: function (v, k) { + + var m = v.length - 1; + var f = m * k; + var i = Math.floor(f); + var fn = TWEEN.Interpolation.Utils.CatmullRom; + + if (v[0] === v[m]) { + + if (k < 0) { + i = Math.floor(f = m * (1 + k)); + } + + return fn(v[(i - 1 + m) % m], v[i], v[(i + 1) % m], v[(i + 2) % m], f - i); + + } else { + + if (k < 0) { + return v[0] - (fn(v[0], v[0], v[1], v[1], -f) - v[0]); + } + + if (k > 1) { + return v[m] - (fn(v[m], v[m], v[m - 1], v[m - 1], f - m) - v[m]); + } + + return fn(v[i ? i - 1 : 0], v[i], v[m < i + 1 ? m : i + 1], v[m < i + 2 ? m : i + 2], f - i); + + } + + }, + + Utils: { + + Linear: function (p0, p1, t) { + + return (p1 - p0) * t + p0; + + }, + + Bernstein: function (n, i) { + + var fc = TWEEN.Interpolation.Utils.Factorial; + + return fc(n) / fc(i) / fc(n - i); + + }, + + Factorial: (function () { + + var a = [1]; + + return function (n) { + + var s = 1; + + if (a[n]) { + return a[n]; + } + + for (var i = n; i > 1; i--) { + s *= i; + } + + a[n] = s; + return s; + + }; + + })(), + + CatmullRom: function (p0, p1, p2, p3, t) { + + var v0 = (p2 - p0) * 0.5; + var v1 = (p3 - p1) * 0.5; + var t2 = t * t; + var t3 = t * t2; + + return (2 * p1 - 2 * p2 + v0 + v1) * t3 + (- 3 * p1 + 3 * p2 - 2 * v0 - v1) * t2 + v0 * t + p1; + + } + + } + +}; + +// UMD (Universal Module Definition) +(function (root) { + + if (typeof define === 'function' && define.amd) { + + // AMD + define([], function () { + return TWEEN; + }); + + } else if (typeof module !== 'undefined' && typeof exports === 'object') { + + // Node.js + module.exports = TWEEN; + + } else if (root !== undefined) { + + // Global variable + root.TWEEN = TWEEN; + + } + +})(this); diff --git a/lib/ammo.js b/lib/ammo.js new file mode 100644 index 0000000..a9a7f8d --- /dev/null +++ b/lib/ammo.js @@ -0,0 +1,33 @@ + + // This is ammo.js, a port of Bullet Physics to JavaScript. zlib licensed. + var Ammo = function(Ammo) { + Ammo = Ammo || {}; + +var Module=typeof Ammo!=="undefined"?Ammo:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}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("The provided Module['ENVIRONMENT'] value is not valid. It 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){if(!Module["print"])Module["print"]=console.log;if(!Module["printErr"])Module["printErr"]=console.warn;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(!Module["thisProgram"]){if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}else{Module["thisProgram"]="unknown-program"}}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(!Module["print"])Module["print"]=print;if(typeof printErr!="undefined")Module["printErr"]=printErr;if(typeof read!="undefined"){Module["read"]=function shell_read(f){var data=tryParseAsDataURI(f);if(data){return intArrayToString(data)}return read(f)}}else{Module["read"]=function shell_read(){throw"no read() available"}}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)};if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof console!=="undefined"){if(!Module["print"])Module["print"]=function shell_print(x){console.log(x)};if(!Module["printErr"])Module["printErr"]=function shell_printErr(x){console.warn(x)}}else{var TRY_USE_DUMP=false;if(!Module["print"])Module["print"]=TRY_USE_DUMP&&typeof dump!=="undefined"?(function(x){dump(x)}):(function(x){})}if(typeof Module["setWindowTitle"]==="undefined"){Module["setWindowTitle"]=(function(title){document.title=title})}}else{throw new Error("Unknown runtime environment. Where are we?")}if(!Module["print"]){Module["print"]=(function(){})}if(!Module["printErr"]){Module["printErr"]=Module["print"]}if(!Module["arguments"]){Module["arguments"]=[]}if(!Module["thisProgram"]){Module["thisProgram"]="./this.program"}if(!Module["quit"]){Module["quit"]=(function(status,toThrow){throw toThrow})}Module.print=Module["print"];Module.printErr=Module["printErr"];Module["preRun"]=[];Module["postRun"]=[];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 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 buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;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 ")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||67108864;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}var ASM_CONSTS=[(function($0,$1,$2,$3,$4,$5,$6,$7){var self=Module["getCache"](Module["ConcreteContactResultCallback"])[$0];if(!self.hasOwnProperty("addSingleResult"))throw"a JSImplementation must implement all functions, you forgot ConcreteContactResultCallback::addSingleResult.";return self["addSingleResult"]($1,$2,$3,$4,$5,$6,$7)})];function _emscripten_asm_const_diiiiiiii(code,a0,a1,a2,a3,a4,a5,a6,a7){return ASM_CONSTS[code](a0,a1,a2,a3,a4,a5,a6,a7)}STATIC_BASE=GLOBAL_BASE;STATICTOP=STATIC_BASE+28576;__ATINIT__.push({func:(function(){__GLOBAL__sub_I_btConeTwistConstraint_cpp()})},{func:(function(){__GLOBAL__sub_I_btQuickprof_cpp()})});memoryInitializer="data:application/octet-stream;base64,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6AoAAAMBAAAEAQAABQEAAAYBAAAnAAAABAAAABIAAABHAAAAAAAAABALAAADAQAABwEAAAUBAAAGAQAAJwAAAAUAAAATAAAASAAAAAAAAABACwAAAwEAAAgBAAAFAQAABgEAACcAAAAGAAAAFAAAAEkAAAB7IHZhciBzZWxmID0gTW9kdWxlWydnZXRDYWNoZSddKE1vZHVsZVsnQ29uY3JldGVDb250YWN0UmVzdWx0Q2FsbGJhY2snXSlbJDBdOyBpZiAoIXNlbGYuaGFzT3duUHJvcGVydHkoJ2FkZFNpbmdsZVJlc3VsdCcpKSB0aHJvdyAnYSBKU0ltcGxlbWVudGF0aW9uIG11c3QgaW1wbGVtZW50IGFsbCBmdW5jdGlvbnMsIHlvdSBmb3Jnb3QgQ29uY3JldGVDb250YWN0UmVzdWx0Q2FsbGJhY2s6OmFkZFNpbmdsZVJlc3VsdC4nOyByZXR1cm4gc2VsZlsnYWRkU2luZ2xlUmVzdWx0J10oJDEsJDIsJDMsJDQsJDUsJDYsJDcpOyB9ADI5Q29uY3JldGVDb250YWN0UmVzdWx0Q2FsbGJhY2sATjE2YnRDb2xsaXNpb25Xb3JsZDIxQ29udGFjdFJlc3VsdENhbGxiYWNrRQBOMTZidENvbGxpc2lvbldvcmxkMjRDbG9zZXN0UmF5UmVzdWx0Q2FsbGJhY2tFAE4xNmJ0Q29sbGlzaW9uV29ybGQxN1JheVJlc3VsdENhbGxiYWNrRQAxOWJ0R2hvc3RQYWlyQ2FsbGJhY2sAMjVidE92ZXJsYXBwaW5nUGFpckNhbGxiYWNrADIwYnREZWZhdWx0TW90aW9uU3RhdGUAMTNidE1vdGlvblN0YXRlADE4YnRWZWhpY2xlUmF5Y2FzdGVyAE4xNmJ0Q29sbGlzaW9uV29ybGQyN0Nsb3Nlc3RDb252ZXhSZXN1bHRDYWxsYmFja0UATjE2YnRDb2xsaXNpb25Xb3JsZDIwQ29udmV4UmVzdWx0Q2FsbGJhY2tFADIzYnREZWZhdWx0U29mdEJvZHlTb2x2ZXIAMTZidFNvZnRCb2R5U29sdmVyADQxYnRTb2Z0Qm9keVJpZ2lkQm9keUNvbGxpc2lvbkNvbmZpZ3VyYXRpb24ATjM1YnRTb2Z0Qm9keUNvbmNhdmVDb2xsaXNpb25BbGdvcml0aG0xN1N3YXBwZWRDcmVhdGVGdW5jRQAzMGJ0Q29sbGlzaW9uQWxnb3JpdGhtQ3JlYXRlRnVuYwBOMzVidFNvZnRCb2R5Q29uY2F2ZUNvbGxpc2lvbkFsZ29yaXRobTEwQ3JlYXRlRnVuY0UATjI5YnRTb2Z0UmlnaWRDb2xsaXNpb25BbGdvcml0aG0xMENyZWF0ZUZ1bmNFAE4yOGJ0U29mdFNvZnRDb2xsaXNpb25BbGdvcml0aG0xMENyZWF0ZUZ1bmNFAFNvZnRCb2R5TWF0ZXJpYWxEYXRhAFNvZnRCb2R5Tm9kZURhdGEAU29mdEJvZHlMaW5rRGF0YQBTb2Z0Qm9keUZhY2VEYXRhAFNvZnRCb2R5VGV0cmFEYXRhAFNvZnRSaWdpZEFuY2hvckRhdGEAZmxvYXQAU29mdEJvZHlQb3NlRGF0YQBTb2Z0Qm9keUNsdXN0ZXJEYXRhAGludABidFNvZnRCb2R5Sm9pbnREYXRhAGJ0U29mdEJvZHlGbG9hdERhdGEAMTBidFNvZnRCb2R5AE4xMGJ0U29mdEJvZHkxNVJheUZyb21Ub0Nhc3RlckUATjZidERidnQ4SUNvbGxpZGVFAE4xMGJ0U29mdEJvZHk1Sm9pbnRFAE4xMGJ0U29mdEJvZHk2Q0pvaW50RQBOMTBidFNvZnRCb2R5NkxKb2ludEUAU29mdEJvZHkAMjRidFNvZnRCb2R5Q29sbGlzaW9uU2hhcGUAYnRDb252ZXhJbnRlcm5hbFNoYXBlRGF0YQBTT0ZUQ0xVU1RFUgAyN2J0U29mdENsdXN0ZXJDb2xsaXNpb25TaGFwZQBOMTVidFNvZnRDb2xsaWRlcnMxMkNvbGxpZGVDTF9SU0UATjE1YnRTb2Z0Q29sbGlkZXJzMTFDbHVzdGVyQmFzZUUATjE1YnRTb2Z0Q29sbGlkZXJzMTNDb2xsaWRlU0RGX1JTRQBOMTVidFNvZnRDb2xsaWRlcnMxMkNvbGxpZGVWRl9TU0UATjE1YnRTb2Z0Q29sbGlkZXJzMTJDb2xsaWRlQ0xfU1NFADI5YnRTb2Z0UmlnaWRDb2xsaXNpb25BbGdvcml0aG0AMjBidENvbGxpc2lvbkFsZ29yaXRobQBUcmlhbmdsZQAxNWJ0VHJpYW5nbGVTaGFwZQBOMTJidENvbnZleENhc3QxMENhc3RSZXN1bHRFAFpOMzVidFNvZnRCb2R5Q29uY2F2ZUNvbGxpc2lvbkFsZ29yaXRobTIxY2FsY3VsYXRlVGltZU9mSW1wYWN0RVAxN2J0Q29sbGlzaW9uT2JqZWN0UzFfUksxNmJ0RGlzcGF0Y2hlckluZm9QMTZidE1hbmlmb2xkUmVzdWx0RTMxTG9jYWxUcmlhbmdsZVNwaGVyZUNhc3RDYWxsYmFjawAyNmJ0U29mdEJvZHlUcmlhbmdsZUNhbGxiYWNrADM1YnRTb2Z0Qm9keUNvbmNhdmVDb2xsaXNpb25BbGdvcml0aG0AMjNidFNvZnRTaW5nbGVSYXlDYWxsYmFjawAyM2J0QnJvYWRwaGFzZVJheUNhbGxiYWNrADI0YnRCcm9hZHBoYXNlQWFiYkNhbGxiYWNrADI0YnRTb2Z0UmlnaWREeW5hbWljc1dvcmxkADI4YnRTb2Z0U29mdENvbGxpc2lvbkFsZ29yaXRobQBidFJpZ2lkQm9keUZsb2F0RGF0YQAxMWJ0UmlnaWRCb2R5ADM0YnRDbG9zZXN0Tm90TWVDb252ZXhSZXN1bHRDYWxsYmFjawBidER5bmFtaWNzV29ybGRGbG9hdERhdGEAMjNidERpc2NyZXRlRHluYW1pY3NXb3JsZAAxNWJ0RHluYW1pY3NXb3JsZAAyN0lucGxhY2VTb2x2ZXJJc2xhbmRDYWxsYmFjawBOMjVidFNpbXVsYXRpb25Jc2xhbmRNYW5hZ2VyMTRJc2xhbmRDYWxsYmFja0UAYnRHZW5lcmljNkRvZlNwcmluZzJDb25zdHJhaW50RGF0YQAxN2J0VHlwZWRDb25zdHJhaW50ADEzYnRUeXBlZE9iamVjdAAxN2J0Rml4ZWRDb25zdHJhaW50AGJ0R2VuZXJpYzZEb2ZDb25zdHJhaW50RGF0YQAyM2J0R2VuZXJpYzZEb2ZDb25zdHJhaW50AGJ0R2VuZXJpYzZEb2ZTcHJpbmdDb25zdHJhaW50RGF0YQAyOWJ0R2VuZXJpYzZEb2ZTcHJpbmdDb25zdHJhaW50AGJ0UG9pbnQyUG9pbnRDb25zdHJhaW50RmxvYXREYXRhADIzYnRQb2ludDJQb2ludENvbnN0cmFpbnQAYnRUeXBlZENvbnN0cmFpbnRGbG9hdERhdGEAYnRTbGlkZXJDb25zdHJhaW50RGF0YQAxOGJ0U2xpZGVyQ29uc3RyYWludABidENvbmVUd2lzdENvbnN0cmFpbnREYXRhADIxYnRDb25lVHdpc3RDb25zdHJhaW50AGJ0SGluZ2VDb25zdHJhaW50RmxvYXREYXRhADE3YnRIaW5nZUNvbnN0cmFpbnQAMzVidFNlcXVlbnRpYWxJbXB1bHNlQ29uc3RyYWludFNvbHZlcgAxOGJ0Q29uc3RyYWludFNvbHZlcgAxNmJ0UmF5Y2FzdFZlaGljbGUAMTdidEFjdGlvbkludGVyZmFjZQAyNWJ0RGVmYXVsdFZlaGljbGVSYXljYXN0ZXIANDNidEtpbmVtYXRpY0Nsb3Nlc3ROb3RNZUNvbnZleFJlc3VsdENhbGxiYWNrADMwYnRLaW5lbWF0aWNDaGFyYWN0ZXJDb250cm9sbGVyADMwYnRDaGFyYWN0ZXJDb250cm9sbGVySW50ZXJmYWNlADIyYnRTdWJzaW1wbGV4Q29udmV4Q2FzdAAxMmJ0Q29udmV4Q2FzdABidENvbGxpc2lvbk9iamVjdEZsb2F0RGF0YQAxN2J0Q29sbGlzaW9uT2JqZWN0ADEzYnRHaG9zdE9iamVjdAAyNGJ0UGFpckNhY2hpbmdHaG9zdE9iamVjdAAyM2J0Q29sbGlzaW9uUGFpckNhbGxiYWNrADE3YnRPdmVybGFwQ2FsbGJhY2sAMjFidENvbGxpc2lvbkRpc3BhdGNoZXIAMzFidERlZmF1bHRDb2xsaXNpb25Db25maWd1cmF0aW9uADI0YnRDb2xsaXNpb25Db25maWd1cmF0aW9uAE4zMWJ0Q29udmV4UGxhbmVDb2xsaXNpb25BbGdvcml0aG0xMENyZWF0ZUZ1bmNFAE4yNmJ0Qm94Qm94Q29sbGlzaW9uQWxnb3JpdGhtMTBDcmVhdGVGdW5jRQBOMzRidFNwaGVyZVRyaWFuZ2xlQ29sbGlzaW9uQWxnb3JpdGhtMTBDcmVhdGVGdW5jRQBOMzJidFNwaGVyZVNwaGVyZUNvbGxpc2lvbkFsZ29yaXRobTEwQ3JlYXRlRnVuY0UATjE2YnRFbXB0eUFsZ29yaXRobTEwQ3JlYXRlRnVuY0UATjI4YnRDb21wb3VuZENvbGxpc2lvbkFsZ29yaXRobTE3U3dhcHBlZENyZWF0ZUZ1bmNFAE4zNmJ0Q29tcG91bmRDb21wb3VuZENvbGxpc2lvbkFsZ29yaXRobTEwQ3JlYXRlRnVuY0UATjI4YnRDb21wb3VuZENvbGxpc2lvbkFsZ29yaXRobTEwQ3JlYXRlRnVuY0UATjMzYnRDb252ZXhDb25jYXZlQ29sbGlzaW9uQWxnb3JpdGhtMTdTd2FwcGVkQ3JlYXRlRnVuY0UATjMzYnRDb252ZXhDb25jYXZlQ29sbGlzaW9uQWxnb3JpdGhtMTBDcmVhdGVGdW5jRQAyNWJ0U2ltdWxhdGlvbklzbGFuZE1hbmFnZXIAMzFidENvbnZleFBsYW5lQ29sbGlzaW9uQWxnb3JpdGhtAFpOMzNidENvbnZleENvbmNhdmVDb2xsaXNpb25BbGdvcml0aG0yMWNhbGN1bGF0ZVRpbWVPZkltcGFjdEVQMTdidENvbGxpc2lvbk9iamVjdFMxX1JLMTZidERpc3BhdGNoZXJJbmZvUDE2YnRNYW5pZm9sZFJlc3VsdEUzMUxvY2FsVHJpYW5nbGVTcGhlcmVDYXN0Q2FsbGJhY2sAMjRidENvbnZleFRyaWFuZ2xlQ2FsbGJhY2sAMzNidENvbnZleENvbmNhdmVDb2xsaXNpb25BbGdvcml0aG0AMjZidEJveEJveENvbGxpc2lvbkFsZ29yaXRobQAxNmJ0TWFuaWZvbGRSZXN1bHQATjM2YnREaXNjcmV0ZUNvbGxpc2lvbkRldGVjdG9ySW50ZXJmYWNlNlJlc3VsdEUAWk4xNmJ0Q29sbGlzaW9uV29ybGQyMXJheVRlc3RTaW5nbGVJbnRlcm5hbEVSSzExYnRUcmFuc2Zvcm1TMl9QSzI0YnRDb2xsaXNpb25PYmplY3RXcmFwcGVyUk5TXzE3UmF5UmVzdWx0Q2FsbGJhY2tFRTE1TG9jYWxJbmZvQWRkZXIyAFpOMTZidENvbGxpc2lvbldvcmxkMjFyYXlUZXN0U2luZ2xlSW50ZXJuYWxFUksxMWJ0VHJhbnNmb3JtUzJfUEsyNGJ0Q29sbGlzaW9uT2JqZWN0V3JhcHBlclJOU18xN1JheVJlc3VsdENhbGxiYWNrRUU5UmF5VGVzdGVyAFpOMTZidENvbGxpc2lvbldvcmxkMjFyYXlUZXN0U2luZ2xlSW50ZXJuYWxFUksxMWJ0VHJhbnNmb3JtUzJfUEsyNGJ0Q29sbGlzaW9uT2JqZWN0V3JhcHBlclJOU18xN1JheVJlc3VsdENhbGxiYWNrRUUyOUJyaWRnZVRyaWFuZ2xlUmF5Y2FzdENhbGxiYWNrXzAAWk4xNmJ0Q29sbGlzaW9uV29ybGQyMXJheVRlc3RTaW5nbGVJbnRlcm5hbEVSSzExYnRUcmFuc2Zvcm1TMl9QSzI0YnRDb2xsaXNpb25PYmplY3RXcmFwcGVyUk5TXzE3UmF5UmVzdWx0Q2FsbGJhY2tFRTI5QnJpZGdlVHJpYW5nbGVSYXljYXN0Q2FsbGJhY2sAMTlidFNpbmdsZVJheUNhbGxiYWNrADE3RGVidWdEcmF3Y2FsbGJhY2sAAU92ZXJmbG93IGluIEFBQkIsIG9iamVjdCByZW1vdmVkIGZyb20gc2ltdWxhdGlvbgBJZiB5b3UgY2FuIHJlcHJvZHVjZSB0aGlzLCBwbGVhc2UgZW1haWwgYnVnc0Bjb250aW51b3VzcGh5c2ljcy5jb20KAFBsZWFzZSBpbmNsdWRlIGFib3ZlIGluZm9ybWF0aW9uLCB5b3VyIFBsYXRmb3JtLCB2ZXJzaW9uIG9mIE9TLgoAVGhhbmtzLgoAMTZidENvbGxpc2lvbldvcmxkAFpaTjE2YnRDb2xsaXNpb25Xb3JsZDI1b2JqZWN0UXVlcnlTaW5nbGVJbnRlcm5hbEVQSzEzYnRDb252ZXhTaGFwZVJLMTFidFRyYW5zZm9ybVM1X1BLMjRidENvbGxpc2lvbk9iamVjdFdyYXBwZXJSTlNfMjBDb252ZXhSZXN1bHRDYWxsYmFja0VmRU4yMmJ0Q29tcG91bmRMZWFmQ2FsbGJhY2sxMlByb2Nlc3NDaGlsZEVpUzVfUEsxNmJ0Q29sbGlzaW9uU2hhcGVFMTRMb2NhbEluZm9BZGRlcgBaTjE2YnRDb2xsaXNpb25Xb3JsZDI1b2JqZWN0UXVlcnlTaW5nbGVJbnRlcm5hbEVQSzEzYnRDb252ZXhTaGFwZVJLMTFidFRyYW5zZm9ybVM1X1BLMjRidENvbGxpc2lvbk9iamVjdFdyYXBwZXJSTlNfMjBDb252ZXhSZXN1bHRDYWxsYmFja0VmRTIyYnRDb21wb3VuZExlYWZDYWxsYmFjawBaTjE2YnRDb2xsaXNpb25Xb3JsZDI1b2JqZWN0UXVlcnlTaW5nbGVJbnRlcm5hbEVQSzEzYnRDb252ZXhTaGFwZVJLMTFidFRyYW5zZm9ybVM1X1BLMjRidENvbGxpc2lvbk9iamVjdFdyYXBwZXJSTlNfMjBDb252ZXhSZXN1bHRDYWxsYmFja0VmRTMyQnJpZGdlVHJpYW5nbGVDb252ZXhjYXN0Q2FsbGJhY2tfMABaTjE2YnRDb2xsaXNpb25Xb3JsZDI1b2JqZWN0UXVlcnlTaW5nbGVJbnRlcm5hbEVQSzEzYnRDb252ZXhTaGFwZVJLMTFidFRyYW5zZm9ybVM1X1BLMjRidENvbGxpc2lvbk9iamVjdFdyYXBwZXJSTlNfMjBDb252ZXhSZXN1bHRDYWxsYmFja0VmRTMyQnJpZGdlVHJpYW5nbGVDb252ZXhjYXN0Q2FsbGJhY2sAMjFidFNpbmdsZVN3ZWVwQ2FsbGJhY2sAMjNidEJyaWRnZWRNYW5pZm9sZFJlc3VsdAAyM2J0U2luZ2xlQ29udGFjdENhbGxiYWNrADM0YnRTcGhlcmVUcmlhbmdsZUNvbGxpc2lvbkFsZ29yaXRobQAyNGJ0UGVydHVyYmVkQ29udGFjdFJlc3VsdABaTjIzYnRDb252ZXhDb252ZXhBbGdvcml0aG0xNnByb2Nlc3NDb2xsaXNpb25FUEsyNGJ0Q29sbGlzaW9uT2JqZWN0V3JhcHBlclMyX1JLMTZidERpc3BhdGNoZXJJbmZvUDE2YnRNYW5pZm9sZFJlc3VsdEUyMWJ0V2l0aG91dE1hcmdpblJlc3VsdABaTjIzYnRDb252ZXhDb252ZXhBbGdvcml0aG0xNnByb2Nlc3NDb2xsaXNpb25FUEsyNGJ0Q29sbGlzaW9uT2JqZWN0V3JhcHBlclMyX1JLMTZidERpc3BhdGNoZXJJbmZvUDE2YnRNYW5pZm9sZFJlc3VsdEUxM2J0RHVtbXlSZXN1bHQAMjNidENvbnZleENvbnZleEFsZ29yaXRobQBOMjNidENvbnZleENvbnZleEFsZ29yaXRobTEwQ3JlYXRlRnVuY0UAMjJidENvbXBvdW5kTGVhZkNhbGxiYWNrADI4YnRDb21wb3VuZENvbGxpc2lvbkFsZ29yaXRobQAzMGJ0Q29tcG91bmRDb21wb3VuZExlYWZDYWxsYmFjawAzNmJ0Q29tcG91bmRDb21wb3VuZENvbGxpc2lvbkFsZ29yaXRobQBidENvbXBvdW5kU2hhcGVDaGlsZERhdGEAYnRDb21wb3VuZFNoYXBlRGF0YQBDb21wb3VuZAAxNWJ0Q29tcG91bmRTaGFwZQBidENvbmVTaGFwZURhdGEAQ29uZQAxMWJ0Q29uZVNoYXBlAENvbmVaADEyYnRDb25lU2hhcGVaAENvbmVYADEyYnRDb25lU2hhcGVYAFNQSEVSRQAxM2J0U3BoZXJlU2hhcGUAWk5LMjJidEJ2aFRyaWFuZ2xlTWVzaFNoYXBlMTlwcm9jZXNzQWxsVHJpYW5nbGVzRVAxOGJ0VHJpYW5nbGVDYWxsYmFja1JLOWJ0VmVjdG9yM1M0X0UyMU15Tm9kZU92ZXJsYXBDYWxsYmFjawAyMWJ0Tm9kZU92ZXJsYXBDYWxsYmFjawBidFRyaWFuZ2xlTWVzaFNoYXBlRGF0YQBCVkhUUklBTkdMRU1FU0gAMjJidEJ2aFRyaWFuZ2xlTWVzaFNoYXBlAFpOMjJidEJ2aFRyaWFuZ2xlTWVzaFNoYXBlMTRwZXJmb3JtUmF5Y2FzdEVQMThidFRyaWFuZ2xlQ2FsbGJhY2tSSzlidFZlY3RvcjNTNF9FMjFNeU5vZGVPdmVybGFwQ2FsbGJhY2sAWk4yMmJ0QnZoVHJpYW5nbGVNZXNoU2hhcGUxN3BlcmZvcm1Db252ZXhjYXN0RVAxOGJ0VHJpYW5nbGVDYWxsYmFja1JLOWJ0VmVjdG9yM1M0X1M0X1M0X0UyMU15Tm9kZU92ZXJsYXBDYWxsYmFjawAyMVN1cHBvcnRWZXJ0ZXhDYWxsYmFjawBaTksxOWJ0VHJpYW5nbGVNZXNoU2hhcGUxOXByb2Nlc3NBbGxUcmlhbmdsZXNFUDE4YnRUcmlhbmdsZUNhbGxiYWNrUks5YnRWZWN0b3IzUzRfRTE2RmlsdGVyZWRDYWxsYmFjawBUUklBTkdMRU1FU0gAMTlidFRyaWFuZ2xlTWVzaFNoYXBlAGJ0U3RhdGljUGxhbmVTaGFwZURhdGEAU1RBVElDUExBTkUAMThidFN0YXRpY1BsYW5lU2hhcGUAMjNidFBvbHloZWRyYWxDb252ZXhTaGFwZQAzNGJ0UG9seWhlZHJhbENvbnZleEFhYmJDYWNoaW5nU2hhcGUAYnRDb2xsaXNpb25TaGFwZURhdGEAMTZidENvbGxpc2lvblNoYXBlADEzYnRDb252ZXhTaGFwZQAyMWJ0Q29udmV4SW50ZXJuYWxTaGFwZQBidENvbnZleEh1bGxTaGFwZURhdGEAQ29udmV4ADE3YnRDb252ZXhIdWxsU2hhcGUAMThidFRyaWFuZ2xlQ2FsbGJhY2sAMzFidEludGVybmFsVHJpYW5nbGVJbmRleENhbGxiYWNrAGJ0Q2Fwc3VsZVNoYXBlRGF0YQBDYXBzdWxlU2hhcGUAMTRidENhcHN1bGVTaGFwZQBDYXBzdWxlWAAxNWJ0Q2Fwc3VsZVNoYXBlWABDYXBzdWxlWgAxNWJ0Q2Fwc3VsZVNoYXBlWgAyNkxvY2FsU3VwcG9ydFZlcnRleENhbGxiYWNrAENvbnZleFRyaW1lc2gAMjVidENvbnZleFRyaWFuZ2xlTWVzaFNoYXBlADE0YnRDb25jYXZlU2hhcGUAQm94ADEwYnRCb3hTaGFwZQAxNGJ0T3B0aW1pemVkQnZoAFpOMTRidE9wdGltaXplZEJ2aDVidWlsZEVQMjNidFN0cmlkaW5nTWVzaEludGVyZmFjZWJSSzlidFZlY3RvcjNTNF9FMjBOb2RlVHJpYW5nbGVDYWxsYmFjawBaTjE0YnRPcHRpbWl6ZWRCdmg1YnVpbGRFUDIzYnRTdHJpZGluZ01lc2hJbnRlcmZhY2ViUks5YnRWZWN0b3IzUzRfRTI5UXVhbnRpemVkTm9kZVRyaWFuZ2xlQ2FsbGJhY2sASEVJR0hURklFTEQAMjVidEhlaWdodGZpZWxkVGVycmFpblNoYXBlAGJ0Q3lsaW5kZXJTaGFwZURhdGEAQ3lsaW5kZXJZADE1YnRDeWxpbmRlclNoYXBlAEN5bGluZGVyWAAxNmJ0Q3lsaW5kZXJTaGFwZVgAQ3lsaW5kZXJaADE2YnRDeWxpbmRlclNoYXBlWgAxNGJ0VHJpYW5nbGVNZXNoADIwYnRBeGlzU3dlZXAzSW50ZXJuYWxJdEUAMjFidEJyb2FkcGhhc2VJbnRlcmZhY2UAMTJidEF4aXNTd2VlcDMAMTVidE51bGxQYWlyQ2FjaGUAMjJidE92ZXJsYXBwaW5nUGFpckNhY2hlAFpOMjhidEhhc2hlZE92ZXJsYXBwaW5nUGFpckNhY2hlMTljbGVhblByb3h5RnJvbVBhaXJzRVAxN2J0QnJvYWRwaGFzZVByb3h5UDEyYnREaXNwYXRjaGVyRTE3Q2xlYW5QYWlyQ2FsbGJhY2sAWk4yOGJ0SGFzaGVkT3ZlcmxhcHBpbmdQYWlyQ2FjaGUzN3JlbW92ZU92ZXJsYXBwaW5nUGFpcnNDb250YWluaW5nUHJveHlFUDE3YnRCcm9hZHBoYXNlUHJveHlQMTJidERpc3BhdGNoZXJFMThSZW1vdmVQYWlyQ2FsbGJhY2sAMjhidEhhc2hlZE92ZXJsYXBwaW5nUGFpckNhY2hlADE4YnREYnZ0VHJlZUNvbGxpZGVyADIwQnJvYWRwaGFzZUFhYmJUZXN0ZXIAMTlCcm9hZHBoYXNlUmF5VGVzdGVyADE2YnREYnZ0QnJvYWRwaGFzZQAxMmJ0RGlzcGF0Y2hlcgBidE9wdGltaXplZEJ2aE5vZGVEYXRhAGJ0UXVhbnRpemVkQnZoTm9kZURhdGEAYnRCdmhTdWJ0cmVlSW5mb0RhdGEAYnRRdWFudGl6ZWRCdmhGbG9hdERhdGEAMTRidFF1YW50aXplZEJ2aAAyNWJ0VHJpYW5nbGVSYXljYXN0Q2FsbGJhY2sAMjhidFRyaWFuZ2xlQ29udmV4Y2FzdENhbGxiYWNrAFpOMzNidE1pbmtvd3NraVBlbmV0cmF0aW9uRGVwdGhTb2x2ZXIxMmNhbGNQZW5EZXB0aEVSMjJidFZvcm9ub2lTaW1wbGV4U29sdmVyUEsxM2J0Q29udmV4U2hhcGVTNF9SSzExYnRUcmFuc2Zvcm1TN19SOWJ0VmVjdG9yM1M5X1M5X1AxMmJ0SURlYnVnRHJhd0UyMGJ0SW50ZXJtZWRpYXRlUmVzdWx0ADMzYnRNaW5rb3dza2lQZW5ldHJhdGlvbkRlcHRoU29sdmVyADMwYnRDb252ZXhQZW5ldHJhdGlvbkRlcHRoU29sdmVyADMwYnRHamtFcGFQZW5ldHJhdGlvbkRlcHRoU29sdmVyADE2YnRQb2ludENvbGxlY3RvcgAxNWJ0R2prQ29udmV4Q2FzdAAyN2J0Q29udGludW91c0NvbnZleENvbGxpc2lvbgAxN2J0R2prUGFpckRldGVjdG9yADM2YnREaXNjcmV0ZUNvbGxpc2lvbkRldGVjdG9ySW50ZXJmYWNlADMwYnRBY3RpdmF0aW5nQ29sbGlzaW9uQWxnb3JpdGhtADE2YnRFbXB0eUFsZ29yaXRobQAzMmJ0U3BoZXJlU3BoZXJlQ29sbGlzaW9uQWxnb3JpdGhtADE2YnRCb3hCb3hEZXRlY3RvcgAyMlNwaGVyZVRyaWFuZ2xlRGV0ZWN0b3IAMjNidEhhc2hlZFNpbXBsZVBhaXJDYWNoZQAxOGJ0Q29udmV4UG9seWhlZHJvbgAyNmJ0VHJpYW5nbGVJbmRleFZlcnRleEFycmF5AGJ0SW50SW5kZXhEYXRhAGJ0U2hvcnRJbnRJbmRleFRyaXBsZXREYXRhAGJ0Q2hhckluZGV4VHJpcGxldERhdGEAYnRWZWN0b3IzRmxvYXREYXRhAGJ0VmVjdG9yM0RvdWJsZURhdGEAYnRNZXNoUGFydERhdGEAYnRTdHJpZGluZ01lc2hJbnRlcmZhY2VEYXRhADIzYnRTdHJpZGluZ01lc2hJbnRlcmZhY2UAUm9vdAARAAoAERERAAAAAAUAAAAAAAAJAAAAAAsAAAAAAAAAABEADwoREREDCgcAARMJCwsAAAkGCwAACwAGEQAAABEREQAAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAARAAoKERERAAoAAAIACQsAAAAJAAsAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAADAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAA0AAAAEDQAAAAAJDgAAAAAADgAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAPAAAAAA8AAAAACRAAAAAAABAAABAAABIAAAASEhIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAABISEgAAAAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAAAAAAAAAAAAAoAAAAACgAAAAAJCwAAAAAACwAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAAAAwAAAAACQwAAAAAAAwAAAwAAC0rICAgMFgweAAobnVsbCkALTBYKzBYIDBYLTB4KzB4IDB4AGluZgBJTkYAbmFuAE5BTgAwMTIzNDU2Nzg5QUJDREVGLgBUISIZDQECAxFLHAwQBAsdEh4naG5vcHFiIAUGDxMUFRoIFgcoJBcYCQoOGx8lI4OCfSYqKzw9Pj9DR0pNWFlaW1xdXl9gYWNkZWZnaWprbHJzdHl6e3wASWxsZWdhbCBieXRlIHNlcXVlbmNlAERvbWFpbiBlcnJvcgBSZXN1bHQgbm90IHJlcHJlc2VudGFibGUATm90IGEgdHR5AFBlcm1pc3Npb24gZGVuaWVkAE9wZXJhdGlvbiBub3QgcGVybWl0dGVkAE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkATm8gc3VjaCBwcm9jZXNzAEZpbGUgZXhpc3RzAFZhbHVlIHRvbyBsYXJnZSBmb3IgZGF0YSB0eXBlAE5vIHNwYWNlIGxlZnQgb24gZGV2aWNlAE91dCBvZiBtZW1vcnkAUmVzb3VyY2UgYnVzeQBJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbABSZXNvdXJjZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZQBJbnZhbGlkIHNlZWsAQ3Jvc3MtZGV2aWNlIGxpbmsAUmVhZC1vbmx5IGZpbGUgc3lzdGVtAERpcmVjdG9yeSBub3QgZW1wdHkAQ29ubmVjdGlvbiByZXNldCBieSBwZWVyAE9wZXJhdGlvbiB0aW1lZCBvdXQAQ29ubmVjdGlvbiByZWZ1c2VkAEhvc3QgaXMgZG93bgBIb3N0IGlzIHVucmVhY2hhYmxlAEFkZHJlc3MgaW4gdXNlAEJyb2tlbiBwaXBlAEkvTyBlcnJvcgBObyBzdWNoIGRldmljZSBvciBhZGRyZXNzAEJsb2NrIGRldmljZSByZXF1aXJlZABObyBzdWNoIGRldmljZQBOb3QgYSBkaXJlY3RvcnkASXMgYSBkaXJlY3RvcnkAVGV4dCBmaWxlIGJ1c3kARXhlYyBmb3JtYXQgZXJyb3IASW52YWxpZCBhcmd1bWVudABBcmd1bWVudCBsaXN0IHRvbyBsb25nAFN5bWJvbGljIGxpbmsgbG9vcABGaWxlbmFtZSB0b28gbG9uZwBUb28gbWFueSBvcGVuIGZpbGVzIGluIHN5c3RlbQBObyBmaWxlIGRlc2NyaXB0b3JzIGF2YWlsYWJsZQBCYWQgZmlsZSBkZXNjcmlwdG9yAE5vIGNoaWxkIHByb2Nlc3MAQmFkIGFkZHJlc3MARmlsZSB0b28gbGFyZ2UAVG9vIG1hbnkgbGlua3MATm8gbG9ja3MgYXZhaWxhYmxlAFJlc291cmNlIGRlYWRsb2NrIHdvdWxkIG9jY3VyAFN0YXRlIG5vdCByZWNvdmVyYWJsZQBQcmV2aW91cyBvd25lciBkaWVkAE9wZXJhdGlvbiBjYW5jZWxlZABGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQATm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUASWRlbnRpZmllciByZW1vdmVkAERldmljZSBub3QgYSBzdHJlYW0ATm8gZGF0YSBhdmFpbGFibGUARGV2aWNlIHRpbWVvdXQAT3V0IG9mIHN0cmVhbXMgcmVzb3VyY2VzAExpbmsgaGFzIGJlZW4gc2V2ZXJlZABQcm90b2NvbCBlcnJvcgBCYWQgbWVzc2FnZQBGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlAE5vdCBhIHNvY2tldABEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkAE1lc3NhZ2UgdG9vIGxhcmdlAFByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldABQcm90b2NvbCBub3QgYXZhaWxhYmxlAFByb3RvY29sIG5vdCBzdXBwb3J0ZWQAU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZABOb3Qgc3VwcG9ydGVkAFByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkAEFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wAQWRkcmVzcyBub3QgYXZhaWxhYmxlAE5ldHdvcmsgaXMgZG93bgBOZXR3b3JrIHVucmVhY2hhYmxlAENvbm5lY3Rpb24gcmVzZXQgYnkgbmV0d29yawBDb25uZWN0aW9uIGFib3J0ZWQATm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZQBTb2NrZXQgaXMgY29ubmVjdGVkAFNvY2tldCBub3QgY29ubmVjdGVkAENhbm5vdCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93bgBPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcwBPcGVyYXRpb24gaW4gcHJvZ3Jlc3MAU3RhbGUgZmlsZSBoYW5kbGUAUmVtb3RlIEkvTyBlcnJvcgBRdW90YSBleGNlZWRlZABObyBtZWRpdW0gZm91bmQAV3JvbmcgbWVkaXVtIHR5cGUATm8gZXJyb3IgaW5mb3JtYXRpb24AAHRlcm1pbmF0aW5nIHdpdGggJXMgZXhjZXB0aW9uIG9mIHR5cGUgJXM6ICVzAHRlcm1pbmF0aW5nIHdpdGggJXMgZXhjZXB0aW9uIG9mIHR5cGUgJXMAdGVybWluYXRpbmcgd2l0aCAlcyBmb3JlaWduIGV4Y2VwdGlvbgB0ZXJtaW5hdGluZwB1bmNhdWdodABTdDlleGNlcHRpb24ATjEwX19jeHhhYml2MTE2X19zaGltX3R5cGVfaW5mb0UAU3Q5dHlwZV9pbmZvAE4xMF9fY3h4YWJpdjEyMF9fc2lfY2xhc3NfdHlwZV9pbmZvRQBOMTBfX2N4eGFiaXYxMTdfX2NsYXNzX3R5cGVfaW5mb0UAcHRocmVhZF9vbmNlIGZhaWx1cmUgaW4gX19jeGFfZ2V0X2dsb2JhbHNfZmFzdCgpAGNhbm5vdCBjcmVhdGUgcHRocmVhZCBrZXkgZm9yIF9fY3hhX2dldF9nbG9iYWxzKCkAY2Fubm90IHplcm8gb3V0IHRocmVhZCB2YWx1ZSBmb3IgX19jeGFfZ2V0X2dsb2JhbHMoKQB0ZXJtaW5hdGVfaGFuZGxlciB1bmV4cGVjdGVkbHkgcmV0dXJuZWQATjEwX19jeHhhYml2MTE5X19wb2ludGVyX3R5cGVfaW5mb0UATjEwX19jeHhhYml2MTE3X19wYmFzZV90eXBlX2luZm9FAE4xMF9fY3h4YWJpdjEyMV9fdm1pX2NsYXNzX3R5cGVfaW5mb0U=";var tempDoublePtr=STATICTOP;STATICTOP+=16;function __ZN30btGeneric6DofSpring2Constraint8getInfo1EPN17btTypedConstraint17btConstraintInfo1E(){Module["printErr"]("missing function: _ZN30btGeneric6DofSpring2Constraint8getInfo1EPN17btTypedConstraint17btConstraintInfo1E");abort(-1)}function __ZN30btGeneric6DofSpring2Constraint8getInfo2EPN17btTypedConstraint17btConstraintInfo2E(){Module["printErr"]("missing function: _ZN30btGeneric6DofSpring2Constraint8getInfo2EPN17btTypedConstraint17btConstraintInfo2E");abort(-1)}function __ZN30btGeneric6DofSpring2Constraint8setParamEifi(){Module["printErr"]("missing function: _ZN30btGeneric6DofSpring2Constraint8setParamEifi");abort(-1)}function __ZN30btGeneric6DofSpring2ConstraintC2ER11btRigidBodyS1_RK11btTransformS4_11RotateOrder(){Module["printErr"]("missing function: _ZN30btGeneric6DofSpring2ConstraintC2ER11btRigidBodyS1_RK11btTransformS4_11RotateOrder");abort(-1)}function __ZNK30btGeneric6DofSpring2Constraint8getParamEii(){Module["printErr"]("missing function: _ZNK30btGeneric6DofSpring2Constraint8getParamEii");abort(-1)}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 ___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.buffer){___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]=now/1e3|0;HEAP32[ptr+4>>2]=now%1e3*1e3|0;return 0}var _llvm_pow_f32=Math_pow;function _llvm_trap(){abort("trap!")}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}var PTHREAD_SPECIFIC={};function _pthread_getspecific(key){return PTHREAD_SPECIFIC[key]||0}var PTHREAD_SPECIFIC_NEXT_KEY=1;var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function _pthread_key_create(key,destructor){if(key==0){return ERRNO_CODES.EINVAL}HEAP32[key>>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}function __ZTI30btGeneric6DofSpring2Constraint(){Module["printErr"]("missing function: _ZTI30btGeneric6DofSpring2Constraint");abort(-1)}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(i>2]=c[a+4>>2];c[b+20>>2]=c[a+8>>2];c[b+24>>2]=c[a+12>>2];c[b+28>>2]=c[a+16>>2];c[b+32>>2]=c[a+20>>2];c[b+36>>2]=c[a+24>>2];c[b+40>>2]=c[a+28>>2];c[b+44>>2]=c[a+32>>2];c[b+48>>2]=c[a+36>>2];c[b+52>>2]=c[a+40>>2];c[b+56>>2]=c[a+44>>2];c[b+60>>2]=c[a+48>>2];c[b+64>>2]=c[a+52>>2];c[b+68>>2]=c[a+56>>2];c[b+72>>2]=c[a+60>>2];c[b+76>>2]=c[a+64>>2];c[b+80>>2]=c[a+68>>2];c[b+84>>2]=c[a+72>>2];c[b+88>>2]=c[a+76>>2];c[b+92>>2]=c[a+80>>2];c[b+96>>2]=c[a+84>>2];c[b+100>>2]=c[a+88>>2];c[b+104>>2]=c[a+92>>2];c[b+108>>2]=c[a+96>>2];c[b+112>>2]=c[a+100>>2];c[b+116>>2]=c[a+104>>2];c[b+120>>2]=c[a+108>>2];c[b+124>>2]=c[a+112>>2];c[b+128>>2]=c[a+116>>2];c[b+132>>2]=c[a+120>>2];c[b+136>>2]=c[a+124>>2];c[b+140>>2]=c[a+128>>2];c[b+144>>2]=c[a+132>>2];c[b+148>>2]=c[a+136>>2];c[b+152>>2]=c[a+140>>2];c[b+156>>2]=c[a+144>>2];c[b+160>>2]=c[a+148>>2];c[b+164>>2]=c[a+152>>2];c[b+168>>2]=c[a+156>>2];c[b+172>>2]=c[a+160>>2];c[b+176>>2]=c[a+164>>2];c[b+180>>2]=c[a+168>>2];c[b+184>>2]=c[a+172>>2];c[b+188>>2]=c[a+176>>2];c[b+232>>2]=c[a+180>>2];c[b+192>>2]=c[a+184>>2];c[b>>2]=0;c[b+4>>2]=zb[c[(c[d>>2]|0)+28>>2]&31](d,c[a+192>>2]|0)|0;c[b+8>>2]=0;c[b+236>>2]=c[a+204>>2];c[b+240>>2]=c[a+208>>2];c[b+244>>2]=c[a+212>>2];c[b+248>>2]=c[a+220>>2];c[b+196>>2]=c[a+224>>2];c[b+200>>2]=c[a+228>>2];c[b+204>>2]=c[a+236>>2];c[b+208>>2]=c[a+244>>2];c[b+212>>2]=c[a+248>>2];c[b+216>>2]=c[a+232>>2];c[b+252>>2]=c[a+252>>2];e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;f=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b+12>>2]=f;if(!f){f=a+268|0;f=c[f>>2]|0;d=b+220|0;c[d>>2]=f;d=a+272|0;d=c[d>>2]|0;f=b+224|0;c[f>>2]=d;f=a+276|0;f=c[f>>2]|0;d=b+228|0;c[d>>2]=f;d=a+280|0;d=c[d>>2]|0;f=b+256|0;c[f>>2]=d;f=b+260|0;c[f>>2]=0;return 13018}Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);f=a+268|0;f=c[f>>2]|0;d=b+220|0;c[d>>2]=f;d=a+272|0;d=c[d>>2]|0;f=b+224|0;c[f>>2]=d;f=a+276|0;f=c[f>>2]|0;d=b+228|0;c[d>>2]=f;d=a+280|0;d=c[d>>2]|0;f=b+256|0;c[f>>2]=d;f=b+260|0;c[f>>2]=0;return 13018}function cf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0.0,x=0.0,y=0.0,z=0.0;v=a[h+16>>0]&-16;a[h+16>>0]=v;w=+g[e>>2];x=+g[d>>2];n=+g[e+4>>2];o=+g[d+4>>2];p=+g[e+8>>2];q=+g[d+8>>2];r=+g[f>>2];s=+g[f+4>>2];t=+g[f+8>>2];l=+g[b>>2];m=+g[b+4>>2];i=+g[b+8>>2];y=(w-x)*(l-x)+(n-o)*(m-o)+(p-q)*(i-q);z=(r-x)*(l-x)+(s-o)*(m-o)+(t-q)*(i-q);do if(y<=0.0&z<=0.0){c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];a[h+16>>0]=v|1;j=0.0;k=0.0;i=1.0}else{u=(w-x)*(l-w)+(n-o)*(m-n)+(p-q)*(i-p);k=(r-x)*(l-w)+(s-o)*(m-n)+(t-q)*(i-p);if(!(!(u>=0.0)|!(k<=u))){c[h>>2]=c[e>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];c[h+12>>2]=c[e+12>>2];a[h+16>>0]=v|2;j=0.0;k=1.0;i=0.0;break}if(u<=0.0&(y>=0.0?y*k-u*z<=0.0:0)){g[h>>2]=x+(w-x)*(y/(y-u));g[h+4>>2]=o+(n-o)*(y/(y-u));g[h+8>>2]=q+(p-q)*(y/(y-u));g[h+12>>2]=0.0;a[h+16>>0]=v|3;j=0.0;k=y/(y-u);i=1.0-y/(y-u);break}j=(w-x)*(l-r)+(n-o)*(m-s)+(p-q)*(i-t);i=(r-x)*(l-r)+(s-o)*(m-s)+(t-q)*(i-t);if(!(!(i>=0.0)|!(j<=i))){c[h>>2]=c[f>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];c[h+12>>2]=c[f+12>>2];a[h+16>>0]=v|4;j=1.0;k=0.0;i=0.0;break}if(i<=0.0&(z>=0.0?j*z-y*i<=0.0:0)){g[h>>2]=x+(r-x)*(z/(z-i));g[h+4>>2]=o+(s-o)*(z/(z-i));g[h+8>>2]=q+(t-q)*(z/(z-i));g[h+12>>2]=0.0;a[h+16>>0]=v|5;j=z/(z-i);k=0.0;i=1.0-z/(z-i);break}if((u*i-j*k<=0.0?k-u>=0.0:0)?j-i>=0.0:0){k=(k-u)/(k-u+(j-i));g[h>>2]=w+(r-w)*k;g[h+4>>2]=n+(s-n)*k;g[h+8>>2]=p+(t-p)*k;g[h+12>>2]=0.0;a[h+16>>0]=v|6;j=k;k=1.0-k;i=0.0;break}l=1.0/(y*k-u*z+(u*i-j*k+(j*z-y*i)));m=(j*z-y*i)*l;i=(y*k-u*z)*l;g[h>>2]=(r-x)*i+((w-x)*m+x);g[h+4>>2]=(s-o)*i+((n-o)*m+o);g[h+8>>2]=(t-q)*i+((p-q)*m+q);g[h+12>>2]=0.0;a[h+16>>0]=v|7;j=i;k=m;i=1.0-m-i}while(0);g[h+20>>2]=i;g[h+24>>2]=k;g[h+28>>2]=j;g[h+32>>2]=0.0;return}function df(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0;h=c[c[b+1120>>2]>>2]|0;f=c[c[e+1120>>2]>>2]|0;c[6995]=(c[6995]|0)+1;e=sc(207)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}y=e+4|0;i=e+28|0;Yk(i|0,0,160)|0;c[e>>2]=3464;c[y>>2]=h;c[e+8>>2]=0;c[e+12>>2]=0;h=e+16|0;c[h>>2]=f;c[e+20>>2]=0;c[e+24>>2]=0;f=ui(y)|0;j=+g[f>>2];l=+g[f+16>>2];n=+g[f+32>>2];p=+g[f+4>>2];q=+g[f+20>>2];r=+g[f+36>>2];s=+g[f+8>>2];u=+g[f+24>>2];w=+g[f+40>>2];k=-+g[f+48>>2];m=-+g[f+52>>2];o=-+g[f+56>>2];t=+g[d+12>>2];v=+g[d+16>>2];x=+g[d+20>>2];g[i>>2]=j*k+l*m+n*o+(j*t+l*v+n*x);g[e+32>>2]=p*k+q*m+r*o+(p*t+q*v+r*x);g[e+36>>2]=s*k+u*m+w*o+(s*t+u*v+w*x);g[e+40>>2]=0.0;h=ui(h)|0;x=+g[h>>2];w=+g[h+16>>2];v=+g[h+32>>2];u=+g[h+4>>2];t=+g[h+20>>2];s=+g[h+36>>2];o=+g[h+8>>2];m=+g[h+24>>2];k=+g[h+40>>2];r=-+g[h+48>>2];q=-+g[h+52>>2];p=-+g[h+56>>2];n=+g[d+12>>2];l=+g[d+16>>2];j=+g[d+20>>2];g[e+44>>2]=x*r+w*q+v*p+(x*n+w*l+v*j);g[e+48>>2]=u*r+t*q+s*p+(u*n+t*l+s*j);g[e+52>>2]=o*r+m*q+k*p+(o*n+m*l+k*j);g[e+56>>2]=0.0;c[e+60>>2]=c[d+4>>2];c[e+64>>2]=c[d>>2];c[e+68>>2]=c[d+8>>2];h=e;f=c[b+912>>2]|0;if((f|0)!=(c[b+916>>2]|0)){y=f;i=b+920|0;i=c[i>>2]|0;i=i+(y<<2)|0;c[i>>2]=h;y=y+1|0;c[b+912>>2]=y;return}i=f|0?f<<1:1;if((f|0)>=(i|0)){y=f;i=b+920|0;i=c[i>>2]|0;i=i+(y<<2)|0;c[i>>2]=h;y=y+1|0;c[b+912>>2]=y;return}if(!i)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((i<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[b+912>>2]|0}if((f|0)>0){d=0;do{c[e+(d<<2)>>2]=c[(c[b+920>>2]|0)+(d<<2)>>2];d=d+1|0}while((d|0)!=(f|0))}d=c[b+920>>2]|0;if(d){if(a[b+924>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);f=c[b+912>>2]|0}c[b+920>>2]=0}a[b+924>>0]=1;c[b+920>>2]=e;c[b+916>>2]=i;y=f;i=b+920|0;i=c[i>>2]|0;i=i+(y<<2)|0;c[i>>2]=h;y=y+1|0;c[b+912>>2]=y;return}function ef(b,d,e,f,h){b=b|0;d=+d;e=e|0;f=f|0;h=h|0;var i=0;i=l;l=l+144|0;c[b>>2]=5320;c[b+132>>2]=0;c[b+132+4>>2]=0;c[b+132+8>>2]=0;c[b+132+12>>2]=0;c[b+132+16>>2]=0;c[b+132+20>>2]=0;c[b+132+24>>2]=0;c[b+132+28>>2]=0;c[b+164>>2]=1065353216;c[b+168>>2]=1065353216;c[b+172>>2]=1065353216;g[b+176>>2]=0.0;c[b+180>>2]=0;g[b+184>>2]=999999984306749440.0;c[b+188>>2]=0;c[b+188+4>>2]=0;c[b+188+8>>2]=0;c[b+188+12>>2]=0;c[b+204>>2]=1;c[b+208>>2]=-1;c[b+212>>2]=-1;c[b+216>>2]=-1;c[b+220>>2]=1;g[b+224>>2]=0.0;g[b+228>>2]=.5;g[b+232>>2]=0.0;g[b+236>>2]=0.0;g[b+240>>2]=0.0;g[b+244>>2]=.10000000149011612;g[b+248>>2]=1.0e4;c[b+252>>2]=1;c[b+256>>2]=0;c[b+260>>2]=-1;c[b+264>>2]=-1;g[b+268>>2]=1.0;g[b+272>>2]=0.0;g[b+276>>2]=0.0;c[b+280>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;c[b+304>>2]=0;c[b+4>>2]=1065353216;c[b+8>>2]=0;c[b+8+4>>2]=0;c[b+8+8>>2]=0;c[b+8+12>>2]=0;c[b+24>>2]=1065353216;c[b+28>>2]=0;c[b+28+4>>2]=0;c[b+28+8>>2]=0;c[b+28+12>>2]=0;c[b+44>>2]=1065353216;c[b+48>>2]=0;c[b+48+4>>2]=0;c[b+48+8>>2]=0;c[b+48+12>>2]=0;c[b+48+16>>2]=0;c[b+68>>2]=1065353216;c[b+72>>2]=0;c[b+72+4>>2]=0;c[b+72+8>>2]=0;c[b+72+12>>2]=0;c[b+88>>2]=1065353216;c[b+92>>2]=0;c[b+92+4>>2]=0;c[b+92+8>>2]=0;c[b+92+12>>2]=0;c[b+108>>2]=1065353216;c[b+112>>2]=0;c[b+112+4>>2]=0;c[b+112+8>>2]=0;c[b+112+12>>2]=0;c[b+112+16>>2]=0;c[b>>2]=4324;a[b+560>>0]=1;c[b+556>>2]=0;c[b+548>>2]=0;c[b+552>>2]=0;g[i>>2]=d;c[i+4>>2]=e;c[i+72>>2]=f;c[i+76>>2]=c[h>>2];c[i+76+4>>2]=c[h+4>>2];c[i+76+8>>2]=c[h+8>>2];c[i+76+12>>2]=c[h+12>>2];g[i+92>>2]=0.0;g[i+96>>2]=0.0;g[i+100>>2]=.5;g[i+104>>2]=0.0;g[i+108>>2]=0.0;g[i+112>>2]=0.0;g[i+116>>2]=.800000011920929;g[i+120>>2]=1.0;a[i+124>>0]=0;g[i+128>>2]=.004999999888241291;g[i+132>>2]=.009999999776482582;g[i+136>>2]=.009999999776482582;g[i+140>>2]=.009999999776482582;c[i+8>>2]=1065353216;c[i+12>>2]=0;c[i+12+4>>2]=0;c[i+12+8>>2]=0;c[i+12+12>>2]=0;c[i+28>>2]=1065353216;c[i+32>>2]=0;c[i+32+4>>2]=0;c[i+32+8>>2]=0;c[i+32+12>>2]=0;c[i+48>>2]=1065353216;c[i+52>>2]=0;c[i+52+4>>2]=0;c[i+52+8>>2]=0;c[i+52+12>>2]=0;c[i+52+16>>2]=0;Id(b,i);l=i;return}function ff(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=c[b+548>>2]|0;a:do if((e|0)>0){g=c[b+556>>2]|0;f=0;while(1){if((c[g+(f<<2)>>2]|0)==(d|0))break;f=f+1|0;if((f|0)>=(e|0))break a}if((f|0)!=(e|0))return}while(0);if((e|0)==(c[b+552>>2]|0)?(h=e|0?e<<1:1,(e|0)<(h|0)):0){if(!h)g=0;else{c[6995]=(c[6995]|0)+1;e=sc((h<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}g=e;e=c[b+548>>2]|0}if((e|0)>0){f=0;do{c[g+(f<<2)>>2]=c[(c[b+556>>2]|0)+(f<<2)>>2];f=f+1|0}while((f|0)!=(e|0))}f=c[b+556>>2]|0;if(f){if(a[b+560>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);e=c[b+548>>2]|0}c[b+556>>2]=0}a[b+560>>0]=1;c[b+556>>2]=g;c[b+552>>2]=h}c[(c[b+556>>2]|0)+(e<<2)>>2]=d;c[b+548>>2]=e+1;g=c[d+28>>2]|0;h=c[d+32>>2]|0;if((g|0)==(b|0)){e=c[b+288>>2]|0;if((e|0)==(c[b+292>>2]|0)?(j=e|0?e<<1:1,(e|0)<(j|0)):0){if(!j)g=0;else{c[6995]=(c[6995]|0)+1;e=sc((j<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}g=e;e=c[b+288>>2]|0}if((e|0)>0){f=0;do{c[g+(f<<2)>>2]=c[(c[b+296>>2]|0)+(f<<2)>>2];f=f+1|0}while((f|0)!=(e|0))}f=c[b+296>>2]|0;if(f){if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);e=c[b+288>>2]|0}c[b+296>>2]=0}a[b+300>>0]=1;c[b+296>>2]=g;c[b+292>>2]=j}c[(c[b+296>>2]|0)+(e<<2)>>2]=h;e=e+1|0;c[b+288>>2]=e}else{b=c[h+288>>2]|0;if((b|0)==(c[h+292>>2]|0)?(i=b|0?b<<1:1,(b|0)<(i|0)):0){if(!i)f=0;else{c[6995]=(c[6995]|0)+1;b=sc((i<<2|3)+16|0)|0;if(!b)b=0;else{c[(b+4+15&-16)+-4>>2]=b;b=b+4+15&-16}f=b;b=c[h+288>>2]|0}if((b|0)>0){e=0;do{c[f+(e<<2)>>2]=c[(c[h+296>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(b|0))}e=c[h+296>>2]|0;if(e){if(a[h+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);b=c[h+288>>2]|0}c[h+296>>2]=0}a[h+300>>0]=1;c[h+296>>2]=f;c[h+292>>2]=i}c[(c[h+296>>2]|0)+(b<<2)>>2]=g;e=b+1|0;c[h+288>>2]=e;b=h}c[b+280>>2]=(e|0)>0&1;return}function gf(a,b,f){a=a|0;b=b|0;f=f|0;var i=0,j=0.0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0;t=l;l=l+32|0;c[a+60>>2]=(c[a+60>>2]|0)+1;n=c[a+4>>2]|0;cc[c[(c[n>>2]|0)+16>>2]&3](n,t+28|0,t+24|0,t+20|0,t+16|0,t+12|0,t+8|0,t+4|0,t,b);n=(c[t+12>>2]|0)+(P(c[t+8>>2]|0,f)|0)|0;r=c[a+4>>2]|0;o=c[t>>2]|0;switch(o|0){case 3:{i=e[n+4>>1]|0;break}case 2:{i=c[n+8>>2]|0;break}default:i=d[n+2>>0]|0}s=(c[t+20>>2]|0)==0;p=c[t+16>>2]|0;q=c[t+28>>2]|0;i=q+(P(p,i)|0)|0;if(s){k=+g[i+4>>2]*+g[r+8>>2];m=+g[i>>2]*+g[r+4>>2];j=+g[i+8>>2]}else{k=+h[i+8>>3]*+g[r+8>>2];m=+h[i>>3]*+g[r+4>>2];j=+h[i+16>>3]}j=j*+g[r+12>>2];g[a+44>>2]=m;g[a+48>>2]=k;g[a+52>>2]=j;g[a+56>>2]=0.0;switch(o|0){case 3:{i=e[n+2>>1]|0;break}case 2:{i=c[n+4>>2]|0;break}default:i=d[n+1>>0]|0}i=q+(P(p,i)|0)|0;if(s){k=+g[i+4>>2]*+g[r+8>>2];m=+g[i>>2]*+g[r+4>>2];j=+g[i+8>>2]}else{k=+h[i+8>>3]*+g[r+8>>2];m=+h[i>>3]*+g[r+4>>2];j=+h[i+16>>3]}j=j*+g[r+12>>2];g[a+28>>2]=m;g[a+32>>2]=k;g[a+36>>2]=j;g[a+40>>2]=0.0;switch(o|0){case 3:{i=e[n>>1]|0;break}case 2:{i=c[n>>2]|0;break}default:i=d[n>>0]|0}i=q+(P(p,i)|0)|0;if(s){k=+g[i+4>>2]*+g[r+8>>2];j=+g[i>>2]*+g[r+4>>2];u=+g[i+8>>2];m=+g[r+12>>2];m=u*m;r=a+12|0;g[r>>2]=j;r=a+16|0;g[r>>2]=k;r=a+20|0;g[r>>2]=m;r=a+24|0;g[r>>2]=0.0;r=a+8|0;r=c[r>>2]|0;q=c[r>>2]|0;q=q+8|0;q=c[q>>2]|0;s=a+12|0;Vb[q&127](r,s,b,f);s=c[a+4>>2]|0;r=c[s>>2]|0;r=r+24|0;r=c[r>>2]|0;Ob[r&127](s,b);l=t;return}else{m=+h[i+8>>3]*+g[r+8>>2];k=+h[i>>3]*+g[r+4>>2];j=+h[i+16>>3];u=+g[r+12>>2];u=j*u;r=a+12|0;g[r>>2]=k;r=a+16|0;g[r>>2]=m;r=a+20|0;g[r>>2]=u;r=a+24|0;g[r>>2]=0.0;r=a+8|0;r=c[r>>2]|0;q=c[r>>2]|0;q=q+8|0;q=c[q>>2]|0;s=a+12|0;Vb[q&127](r,s,b,f);s=c[a+4>>2]|0;r=c[s>>2]|0;r=r+24|0;r=c[r>>2]|0;Ob[r&127](s,b);l=t;return}}function hf(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;a:do if(!(qD(b,c[d+8>>2]|0)|0)){if(!(qD(b,c[d>>2]|0)|0)){i=c[b+12>>2]|0;uo(b+16|0,d,e,f,g);if((i|0)<=1)break;h=c[b+8>>2]|0;if((h&2|0)==0?(c[d+36>>2]|0)!=1:0){if(!(h&1)){h=b+24|0;while(1){if(a[d+54>>0]|0)break a;if((c[d+36>>2]|0)==1)break a;uo(h,d,e,f,g);h=h+8|0;if(h>>>0>=(b+16+(i<<3)|0)>>>0)break a}}else h=b+24|0;while(1){if(a[d+54>>0]|0)break a;if((c[d+36>>2]|0)==1?(c[d+24>>2]|0)==1:0)break a;uo(h,d,e,f,g);h=h+8|0;if(h>>>0>=(b+16+(i<<3)|0)>>>0)break a}}else h=b+24|0;while(1){if(a[d+54>>0]|0)break a;uo(h,d,e,f,g);h=h+8|0;if(h>>>0>=(b+16+(i<<3)|0)>>>0)break a}}if((c[d+16>>2]|0)!=(e|0)?(c[d+20>>2]|0)!=(e|0):0){c[d+32>>2]=f;if((c[d+44>>2]|0)==4)break;j=b+16+(c[b+12>>2]<<3)|0;h=0;i=b+16|0;k=0;b:while(1){if(i>>>0>=j>>>0){f=18;break}a[d+52>>0]=0;a[d+53>>0]=0;ao(i,d,e,e,1,g);if(a[d+54>>0]|0){f=18;break}do if(a[d+53>>0]|0){if(!(a[d+52>>0]|0))if(!(c[b+8>>2]&1)){h=1;f=18;break b}else{h=1;f=k;break}if((c[d+24>>2]|0)==1){f=23;break b}if(!(c[b+8>>2]&2)){f=23;break b}else{h=1;f=1}}else f=k;while(0);i=i+8|0;k=f}do if((f|0)==18){if((!k?(c[d+20>>2]=e,c[d+40>>2]=(c[d+40>>2]|0)+1,(c[d+36>>2]|0)==1):0)?(c[d+24>>2]|0)==2:0){a[d+54>>0]=1;if(h){f=23;break}else{h=4;break}}if(h)f=23;else h=4}while(0);if((f|0)==23)h=3;c[d+44>>2]=h;break}if((f|0)==1)c[d+32>>2]=1}else qs(d,e,f);while(0);return}function jf(b,d,e){b=b|0;d=+d;e=+e;var f=0,h=0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0;s=l;l=l+80|0;f=c[b+8>>2]|0;if(!f){f=c[b+4>>2]|0;if(!f){k=0.0;o=0.0;m=0.0;d=0.0;j=0.0;n=0.0}else{r=+g[f+336>>2];j=+g[b+164>>2];t=+g[f+340>>2];p=+g[b+160>>2];n=+g[b+156>>2];q=+g[f+332>>2];k=+g[f+316>>2];o=+g[f+320>>2];m=+g[f+324>>2];d=r*j-t*p;j=t*n-j*q;n=p*q-r*n}}else{t=+g[f+392>>2];j=+g[b+164>>2];p=+g[f+396>>2];q=+g[b+160>>2];n=+g[b+156>>2];r=+g[f+388>>2];k=+g[f+372>>2];o=+g[f+376>>2];m=+g[f+380>>2];d=t*j-p*q;j=p*n-j*r;n=q*r-t*n}r=k+d;q=o+j;p=m+n;f=c[b+20>>2]|0;if(!f){f=c[b+16>>2]|0;if(!f){n=0.0;o=0.0;d=0.0;j=0.0;k=0.0;m=0.0}else{t=+g[f+336>>2];k=+g[b+180>>2];w=+g[f+340>>2];v=+g[b+176>>2];m=+g[b+172>>2];u=+g[f+332>>2];n=+g[f+316>>2];o=+g[f+320>>2];d=+g[f+324>>2];j=t*k-w*v;k=w*m-k*u;m=v*u-t*m}}else{w=+g[f+392>>2];k=+g[b+180>>2];t=+g[f+396>>2];u=+g[b+176>>2];m=+g[b+172>>2];v=+g[f+388>>2];n=+g[f+372>>2];o=+g[f+376>>2];d=+g[f+380>>2];j=w*k-t*u;k=t*m-k*v;m=u*v-w*m}c[s+36+16>>2]=0;c[s+36+16+4>>2]=0;c[s+36+16+8>>2]=0;c[s+36+16+12>>2]=0;a[s+36+32>>0]=1;u=+g[b+60>>2];r=+g[b+72>>2]+(r-(n+j))*u;t=(q-(o+k))*u+ +g[b+76>>2];u=(p-(d+m))*u+ +g[b+80>>2];v=(r*+g[b+120>>2]+t*+g[b+124>>2]+u*+g[b+128>>2])*e;w=(r*+g[b+136>>2]+t*+g[b+140>>2]+u*+g[b+144>>2])*e;g[s+36>>2]=(r*+g[b+104>>2]+t*+g[b+108>>2]+u*+g[b+112>>2])*e;g[s+36+4>>2]=v;g[s+36+8>>2]=w;g[s+36+12>>2]=0.0;f=s;h=s+36|0;i=f+36|0;do{c[f>>2]=c[h>>2];f=f+4|0;h=h+4|0}while((f|0)<(i|0));w=-+g[s+4>>2];v=-+g[s+8>>2];g[s>>2]=-+g[s>>2];g[s+4>>2]=w;g[s+8>>2]=v;g[s+12>>2]=0.0;v=-+g[s+20>>2];w=-+g[s+24>>2];g[s+16>>2]=-+g[s+16>>2];g[s+20>>2]=v;g[s+24>>2]=w;g[s+28>>2]=0.0;Nh(b+4|0,s,b+156|0);Nh(b+16|0,s+36|0,b+172|0);l=s;return}function kf(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,D=0.0;d=c[a+780>>2]|0;if((d|0)!=4){c[a+780>>2]=d+1;x=d;w=(x|0)>0;x=w?x:0;a=a+4+(x*192|0)|0;gi(a|0,b|0,192)|0;return x|0}y=+g[b+80>>2];v=+g[a+84>>2];u=v>2];s=t>2];w=+g[a+660>>2]<(r>31;y=+g[b>>2];if(d){e=+g[a+196>>2];k=+g[b+4>>2];l=+g[a+200>>2];h=+g[b+8>>2];f=+g[a+204>>2];m=+g[a+580>>2];u=+g[a+388>>2];q=+g[a+584>>2];p=+g[a+392>>2];s=+g[a+588>>2];n=+g[a+396>>2];i=((y-e)*(q-p)-(k-l)*(m-u))*((y-e)*(q-p)-(k-l)*(m-u))+(((k-l)*(s-n)-(h-f)*(q-p))*((k-l)*(s-n)-(h-f)*(q-p))+((h-f)*(m-u)-(y-e)*(s-n))*((h-f)*(m-u)-(y-e)*(s-n)));if((d|0)==1){j=+g[a+8>>2];t=h;o=+g[a+12>>2];r=m;v=e;h=0.0;m=+g[a+4>>2];x=7}else{t=h;r=m;x=6}}else{e=+g[a+196>>2];l=+g[a+200>>2];f=+g[a+204>>2];i=0.0;k=+g[b+4>>2];t=+g[b+8>>2];r=+g[a+580>>2];u=+g[a+388>>2];q=+g[a+584>>2];p=+g[a+392>>2];s=+g[a+588>>2];n=+g[a+396>>2];x=6}if((x|0)==6){m=+g[a+4>>2];j=+g[a+8>>2];B=k-j;o=+g[a+12>>2];z=t-o;v=r-u;A=q-p;h=s-n;h=((y-m)*A-B*v)*((y-m)*A-B*v)+((B*h-z*A)*(B*h-z*A)+(z*v-(y-m)*h)*(z*v-(y-m)*h));if((d|0)==2){r=u;q=e;e=0.0;x=8}else{v=e;x=7}}if((x|0)==7){B=y-m;D=k-j;z=t-o;A=r-v;r=q-l;e=s-f;e=(B*r-D*A)*(B*r-D*A)+((D*e-z*r)*(D*e-z*r)+(z*A-B*e)*(z*A-B*e));if(w)f=0.0;else{r=u;q=v;x=8}}if((x|0)==8){D=y-m;y=k-j;A=t-o;B=r-q;z=p-l;f=n-f;f=(D*z-y*B)*(D*z-y*B)+((y*f-A*z)*(y*f-A*z)+(A*B-D*f)*(A*B-D*f))}D=+C(+i);A=+C(+h);y=+C(+e);v=+C(+f);B=D>-999999984306749440.0?D:-999999984306749440.0;z=A>B?A:B;x=v>(y>z?y:z)?3:y>z?2:A>B?1:(D>-999999984306749440.0^1)<<31>>31;w=(x|0)>0;x=w?x:0;a=a+4+(x*192|0)|0;gi(a|0,b|0,192)|0;return x|0}function lf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0;q=c[b+18504>>2]|0;if(!q){c[b>>2]=5;q=0;return q|0}i=c[q+48>>2]|0;if(i|0)c[i+44>>2]=c[q+44>>2];i=c[q+44>>2]|0;if(i|0)c[i+48>>2]=c[q+48>>2];if((c[b+18504>>2]|0)==(q|0))c[b+18504>>2]=c[q+48>>2];c[b+18508>>2]=(c[b+18508>>2]|0)+-1;c[q+44>>2]=0;c[q+48>>2]=c[b+18496>>2];i=c[b+18496>>2]|0;if(i|0)c[i+44>>2]=q;c[b+18496>>2]=q;c[b+18500>>2]=(c[b+18500>>2]|0)+1;a[q+55>>0]=0;c[q+20>>2]=d;c[q+24>>2]=e;c[q+28>>2]=f;m=+g[d+16>>2];j=+g[e+16>>2]-m;n=+g[d+20>>2];k=+g[e+20>>2]-n;o=+g[d+24>>2];l=+g[e+24>>2]-o;m=+g[f+16>>2]-m;n=+g[f+20>>2]-n;o=+g[f+24>>2]-o;g[q>>2]=k*o-l*n;g[q+4>>2]=l*m-j*o;g[q+8>>2]=j*n-k*m;g[q+12>>2]=0.0;p=+D(+((k*o-l*n)*(k*o-l*n)+(l*m-j*o)*(l*m-j*o)+(j*n-k*m)*(j*n-k*m)));if(p>9.999999747378752e-05){if((!(Zk(k*o-l*n,l*m-j*o,j*n-k*m,+g[d+16>>2],+g[d+20>>2],+g[d+24>>2],+g[e+16>>2],+g[e+20>>2],+g[e+24>>2],q+16|0)|0)?!(Zk(+g[q>>2],+g[q+4>>2],+g[q+8>>2],+g[e+16>>2],+g[e+20>>2],+g[e+24>>2],+g[f+16>>2],+g[f+20>>2],+g[f+24>>2],q+16|0)|0):0)?!(Zk(+g[q>>2],+g[q+4>>2],+g[q+8>>2],+g[f+16>>2],+g[f+20>>2],+g[f+24>>2],+g[d+16>>2],+g[d+20>>2],+g[d+24>>2],q+16|0)|0):0)g[q+16>>2]=(+g[d+16>>2]*+g[q>>2]+ +g[d+20>>2]*+g[q+4>>2]+ +g[d+24>>2]*+g[q+8>>2])/p;g[q>>2]=1.0/p*+g[q>>2];g[q+4>>2]=1.0/p*+g[q+4>>2];g[q+8>>2]=1.0/p*+g[q+8>>2];if(h)return q|0;if(!(+g[q+16>>2]>=-9.999999747378752e-06))i=3;else return q|0}else i=2;c[b>>2]=i;i=c[q+48>>2]|0;if(i|0)c[i+44>>2]=c[q+44>>2];i=c[q+44>>2]|0;if(i|0)c[i+48>>2]=c[q+48>>2];if((c[b+18496>>2]|0)==(q|0))c[b+18496>>2]=c[q+48>>2];c[b+18500>>2]=(c[b+18500>>2]|0)+-1;c[q+44>>2]=0;c[q+48>>2]=c[b+18504>>2];i=c[b+18504>>2]|0;if(i|0)c[i+44>>2]=q;c[b+18504>>2]=q;c[b+18508>>2]=(c[b+18508>>2]|0)+1;q=0;return q|0}function mf(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,l=0,m=0;h=c[d+8>>2]|0;if((h|0)>0){i=c[d+16>>2]|0;f=0;e=0;do{j=c[i+(f<<2)>>2]|0;if(!(c[j+204>>2]&3)){c[j+208>>2]=e;e=e+1|0}c[j+212>>2]=-1;g[j+268>>2]=1.0;f=f+1|0}while((f|0)!=(h|0));j=e}else j=0;i=c[b+8>>2]|0;if((i|0)<(j|0)){if((c[b+12>>2]|0)<(j|0)){if(!j){e=0;h=i}else{c[6995]=(c[6995]|0)+1;e=sc((j<<3|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}h=c[b+8>>2]|0}if((h|0)>0){f=0;do{m=(c[b+16>>2]|0)+(f<<3)|0;k=c[m+4>>2]|0;l=e+(f<<3)|0;c[l>>2]=c[m>>2];c[l+4>>2]=k;f=f+1|0}while((f|0)!=(h|0))}f=c[b+16>>2]|0;if(f|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=e;c[b+12>>2]=j;f=b+16|0}else f=b+16|0;e=i;do{m=(c[f>>2]|0)+(e<<3)|0;c[m>>2]=0;c[m+4>>2]=0;e=e+1|0}while((e|0)!=(j|0))}c[b+8>>2]=j;if((j|0)>0){f=c[b+16>>2]|0;e=0;do{c[f+(e<<3)>>2]=e;c[f+(e<<3)+4>>2]=1;e=e+1|0}while((e|0)!=(j|0))}e=c[d+68>>2]|0;e=xb[c[(c[e>>2]|0)+36>>2]&127](e)|0;l=xb[c[(c[e>>2]|0)+36>>2]&127](e)|0;if(!l)return;k=xb[c[(c[e>>2]|0)+20>>2]&127](e)|0;if((l|0)<=0)return;d=0;do{e=c[c[k+(d<<4)>>2]>>2]|0;f=c[c[k+(d<<4)+4>>2]>>2]|0;if((e|0?(f|0?(c[e+204>>2]&7|0)==0:0):0)?(c[f+204>>2]&7|0)==0:0){i=c[e+208>>2]|0;e=c[f+208>>2]|0;j=c[b+16>>2]|0;f=c[j+(i<<3)>>2]|0;if((f|0)!=(i|0)){h=j+(i<<3)|0;do{i=j+(f<<3)|0;c[h>>2]=c[i>>2];i=c[i>>2]|0;h=j+(i<<3)|0;f=c[h>>2]|0}while((i|0)!=(f|0))}f=c[j+(e<<3)>>2]|0;if((f|0)!=(e|0)){h=j+(e<<3)|0;do{e=j+(f<<3)|0;c[h>>2]=c[e>>2];e=c[e>>2]|0;h=j+(e<<3)|0;f=c[h>>2]|0}while((e|0)!=(f|0))}if((i|0)!=(e|0)){c[j+(i<<3)>>2]=e;m=j+(e<<3)+4|0;c[m>>2]=(c[m>>2]|0)+(c[j+(i<<3)+4>>2]|0)}}d=d+1|0}while((d|0)!=(l|0));return}function nf(b){b=b|0;var d=0,e=0;c[b>>2]=5536;if(a[b+20>>0]|0){d=c[b+16>>2]|0;e=c[d+16>>2]|0;if(e){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[b+16>>2]|0}if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}}if(a[b+12>>0]|0){d=c[b+8>>2]|0;e=c[d+16>>2]|0;if(e){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[b+8>>2]|0}if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}}d=c[b+28>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+28>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+32>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+32>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+36>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+36>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+40>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+40>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+44>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+44>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+48>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+48>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+52>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+52>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+56>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+56>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+72>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+72>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+76>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+76>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+68>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+68>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+84>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+84>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+80>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+80>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+24>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+24>>2]|0;if(!d)return;c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);return}function of(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0;u=+g[b>>2];t=+g[b+4>>2];s=+g[b+8>>2];r=1.0/+D(+(u*u+t*t+s*s));y=+g[d>>2];x=+g[d+4>>2];w=+g[d+8>>2];v=1.0/+D(+(y*y+x*x+w*w));B=s*r*x*v-t*r*w*v;A=u*r*w*v-s*r*y*v;z=t*r*y*v-u*r*x*v;d=c[a+28>>2]|0;e=+g[d+4>>2];h=+g[d+20>>2];j=+g[d+36>>2];f=+g[d+8>>2];i=+g[d+24>>2];k=+g[d+40>>2];l=+g[d+12>>2];n=+g[d+28>>2];p=+g[d+44>>2];m=-+g[d+52>>2];o=-+g[d+56>>2];q=-+g[d+60>>2];g[a+48>>2]=z*j+(e*B+h*A);g[a+52>>2]=e*y*v+x*v*h+w*v*j;g[a+56>>2]=u*r*e+t*r*h+s*r*j;g[a+60>>2]=0.0;g[a+64>>2]=B*f+A*i+z*k;g[a+68>>2]=y*v*f+x*v*i+w*v*k;g[a+72>>2]=u*r*f+t*r*i+s*r*k;g[a+76>>2]=0.0;g[a+80>>2]=B*l+A*n+z*p;g[a+84>>2]=y*v*l+x*v*n+w*v*p;g[a+88>>2]=u*r*l+t*r*n+s*r*p;g[a+92>>2]=0.0;g[a+96>>2]=e*0.0+h*0.0+j*0.0+(e*m+h*o+j*q);g[a+100>>2]=f*0.0+i*0.0+k*0.0+(f*m+i*o+k*q);g[a+104>>2]=l*0.0+n*0.0+p*0.0+(l*m+n*o+p*q);g[a+108>>2]=0.0;d=c[a+32>>2]|0;q=+g[d+4>>2];p=+g[d+20>>2];o=+g[d+36>>2];n=+g[d+8>>2];m=+g[d+24>>2];l=+g[d+40>>2];k=+g[d+12>>2];i=+g[d+28>>2];f=+g[d+44>>2];j=-+g[d+52>>2];h=-+g[d+56>>2];e=-+g[d+60>>2];g[a+112>>2]=B*q+A*p+z*o;g[a+116>>2]=y*v*q+x*v*p+w*v*o;g[a+120>>2]=u*r*q+t*r*p+s*r*o;g[a+124>>2]=0.0;g[a+128>>2]=B*n+A*m+z*l;g[a+132>>2]=y*v*n+x*v*m+w*v*l;g[a+136>>2]=u*r*n+t*r*m+s*r*l;g[a+140>>2]=0.0;g[a+144>>2]=B*k+A*i+z*f;g[a+148>>2]=y*v*k+x*v*i+w*v*f;g[a+152>>2]=u*r*k+t*r*i+s*r*f;g[a+156>>2]=0.0;g[a+160>>2]=q*0.0+p*0.0+o*0.0+(q*j+p*h+o*e);g[a+164>>2]=n*0.0+m*0.0+l*0.0+(n*j+m*h+l*e);g[a+168>>2]=k*0.0+i*0.0+f*0.0+(k*j+i*h+f*e);g[a+172>>2]=0.0;jd(a,(c[a+28>>2]|0)+4|0,(c[a+32>>2]|0)+4|0);return}function pf(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c[6158]=(c[6158]|0)+1;f=c[b+24>>2]|0;if(!f){if(!(c[e+8>>2]&c[d+4>>2])){b=0;return b|0}if(!(c[d+8>>2]&c[e+4>>2])){b=0;return b|0}}else if(!(Bb[c[(c[f>>2]|0)+8>>2]&63](f,d,e)|0)){b=0;return b|0}k=(c[d+12>>2]|0)>(c[e+12>>2]|0);l=k?e:d;g=c[l+12>>2]|0;k=k?d:e;d=c[k+12>>2]|0;i=(((d<<16|g)+~((d<<16|g)<<15)|0)>>>10^(d<<16|g)+~((d<<16|g)<<15))*9|0;i=((i>>>6^i)+~((i>>>6^i)<<11)|0)>>>16^(i>>>6^i)+~((i>>>6^i)<<11);j=c[b+12>>2]|0;f=c[(c[b+40>>2]|0)+((i&j+-1)<<2)>>2]|0;a:do if((f|0)!=-1){e=c[b+16>>2]|0;while(1){if((c[(c[e+(f<<4)>>2]|0)+12>>2]|0)==(g|0)?(c[(c[e+(f<<4)+4>>2]|0)+12>>2]|0)==(d|0):0)break;f=c[(c[b+60>>2]|0)+(f<<2)>>2]|0;if((f|0)==-1)break a}f=e+(f<<4)|0;if(f|0){b=f;return b|0}}while(0);h=c[b+8>>2]|0;if((h|0)==(j|0)){g=j|0?j<<1:1;if((j|0)<(g|0)){if(!g){f=0;d=j}else{c[6995]=(c[6995]|0)+1;f=sc((g<<4|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}d=c[b+8>>2]|0}if((d|0)>0){e=0;do{m=c[b+16>>2]|0;c[f+(e<<4)>>2]=c[m+(e<<4)>>2];c[f+(e<<4)+4>>2]=c[m+(e<<4)+4>>2];c[f+(e<<4)+8>>2]=c[m+(e<<4)+8>>2];c[f+(e<<4)+12>>2]=c[m+(e<<4)+12>>2];e=e+1|0}while((e|0)!=(d|0))}e=c[b+16>>2]|0;if(e){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[b+8>>2]|0}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=f;c[b+12>>2]=g;f=g}else{d=j;f=j}}else{d=h;f=j}c[b+8>>2]=d+1;e=c[b+16>>2]|0;d=c[b+68>>2]|0;if(d){Bb[c[(c[d>>2]|0)+8>>2]&63](d,l,k)|0;f=c[b+12>>2]|0}if((j|0)<(f|0)){Kf(b);f=(c[b+12>>2]|0)+-1&i}else f=i&j+-1;m=(c[l+12>>2]|0)<(c[k+12>>2]|0);c[e+(h<<4)>>2]=m?l:k;c[e+(h<<4)+4>>2]=m?k:l;c[e+(h<<4)+8>>2]=0;c[e+(h<<4)+8+4>>2]=0;m=(c[b+40>>2]|0)+(f<<2)|0;c[(c[b+60>>2]|0)+(h<<2)>>2]=c[m>>2];c[m>>2]=h;m=e+(h<<4)|0;return m|0}function qf(a,d,f){a=a|0;d=d|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;g=c[a+108>>2]|0;if(g|0)Sb[c[(c[g>>2]|0)+12>>2]&127](g,c[d+60>>2]|0,f);o=c[d+12>>2]|0;p=c[a+60>>2]|0;n=c[a+92>>2]|0;if(!(xb[c[(c[n>>2]|0)+56>>2]&127](n)|0)){n=c[a+92>>2]|0;Sb[c[(c[n>>2]|0)+16>>2]&127](n,p+((o&65535)<<6)|0,f)}m=e[a+56>>1]|0;l=c[a+60>>2]|0;b[l+54>>1]=(e[l+54>>1]|0)+65534;b[l+56>>1]=(e[l+56>>1]|0)+65534;b[l+58>>1]=(e[l+58>>1]|0)+65534;l=0;d=b[a+6>>1]|0;do{k=a+68+(l<<2)|0;n=c[k>>2]|0;g=e[p+((o&65535)<<6)+54+(l<<1)>>1]|0;b[n+(g<<2)>>1]=d;f=b[n+(g<<2)+6>>1]|0;if(!(f<<16>>16))f=n;else{j=(c[a+60>>2]|0)+((e[n+(g<<2)+2>>1]|0)<<6)+54+(l<<1)|0;i=n+(g<<2)|0;while(1){h=i;i=i+4|0;g=b[i>>1]|0;if((d&65535)<(g&65535))break;q=c[a+60>>2]|0;d=f&65535;d=(g&1)==0?q+(d<<6)+48+(l<<1)|0:q+(d<<6)+54+(l<<1)|0;b[d>>1]=(b[d>>1]|0)+-1<<16>>16;b[j>>1]=(b[j>>1]|0)+1<<16>>16;d=e[h>>1]|e[h+2>>1]<<16;g=e[i>>1]|e[i+2>>1]<<16;b[h>>1]=g;b[h+2>>1]=g>>>16;b[i>>1]=d;b[i+2>>1]=d>>>16;f=b[h+10>>1]|0;if(!(f<<16>>16))break;else d=d&65535}d=b[a+6>>1]|0;f=c[k>>2]|0}g=e[p+((o&65535)<<6)+48+(l<<1)>>1]|0;b[n+(g<<2)>>1]=d;i=f+(g<<2)|0;h=b[i+6>>1]|0;if(h<<16>>16){k=(c[a+60>>2]|0)+((e[f+(g<<2)+2>>1]|0)<<6)+48+(l<<1)|0;j=i;f=b[i>>1]|0;while(1){g=j;j=j+4|0;d=b[j>>1]|0;if((f&65535)<(d&65535))break;i=c[a+60>>2]|0;q=h&65535;d=(d&1)==0?i+(q<<6)+48+(l<<1)|0:i+(q<<6)+54+(l<<1)|0;b[d>>1]=(b[d>>1]|0)+-1<<16>>16;b[k>>1]=(b[k>>1]|0)+1<<16>>16;d=e[g>>1]|e[g+2>>1]<<16;q=e[j>>1]|e[j+2>>1]<<16;b[g>>1]=q;b[g+2>>1]=q>>>16;b[j>>1]=d;b[j+2>>1]=d>>>16;h=b[g+10>>1]|0;if(!(h<<16>>16))break;else f=d&65535}d=b[a+6>>1]|0}b[n+((m<<1)+-1<<2)+2>>1]=0;b[n+((m<<1)+-1<<2)>>1]=d;l=l+1|0}while((l|0)!=3);b[(c[a+60>>2]|0)+((o&65535)<<6)+48>>1]=b[a+64>>1]|0;b[a+64>>1]=o;b[a+56>>1]=(b[a+56>>1]|0)+-1<<16>>16;return}function rf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0,x=0;w=l;l=l+32|0;q=c[a+12>>2]|0;r=+g[q+(((e+d|0)/2|0)*24|0)>>2];t=+g[q+(((e+d|0)/2|0)*24|0)+4>>2];u=+g[q+(((e+d|0)/2|0)*24|0)+8>>2];v=+g[q+(((e+d|0)/2|0)*24|0)+16>>2];s=c[q+(((e+d|0)/2|0)*24|0)+20>>2]|0;f=e;h=d;while(1){m=+g[b>>2];n=+g[b+4>>2];o=+g[b+8>>2];p=(r-m)*(r-m)+(t-n)*(t-n)+(u-o)*(u-o);a:while(1){i=+g[q+(h*24|0)+16>>2];do if(i!=v){if(!(i>2]-m;j=+g[q+(h*24|0)+4>>2]-n;k=+g[q+(h*24|0)+8>>2]-o;if(i*i+j*j+k*k!=p)if(i*i+j*j+k*k>2]|0)<(s|0))break;else break a}while(0);h=h+1|0}b:while(1){i=+g[q+(f*24|0)+16>>2];do if(v!=i){if(!(v>2]-m;j=+g[q+(f*24|0)+4>>2]-n;k=+g[q+(f*24|0)+8>>2]-o;if(p!=i*i+j*j+k*k)if(p>2]|0))break;else break b}while(0);f=f+-1|0}if((h|0)<=(f|0)){x=q+(h*24|0)|0;c[w>>2]=c[x>>2];c[w+4>>2]=c[x+4>>2];c[w+8>>2]=c[x+8>>2];c[w+12>>2]=c[x+12>>2];c[w+16>>2]=c[x+16>>2];c[w+20>>2]=c[x+20>>2];q=q+(f*24|0)|0;c[x>>2]=c[q>>2];c[x+4>>2]=c[q+4>>2];c[x+8>>2]=c[q+8>>2];c[x+12>>2]=c[q+12>>2];c[x+16>>2]=c[q+16>>2];c[x+20>>2]=c[q+20>>2];q=(c[a+12>>2]|0)+(f*24|0)|0;c[q>>2]=c[w>>2];c[q+4>>2]=c[w+4>>2];c[q+8>>2]=c[w+8>>2];c[q+12>>2]=c[w+12>>2];c[q+16>>2]=c[w+16>>2];c[q+20>>2]=c[w+20>>2];f=f+-1|0;h=h+1|0}if((h|0)>(f|0))break;q=c[a+12>>2]|0}if((f|0)>(d|0))rf(a,b,d,f);if((h|0)>=(e|0)){l=w;return}rf(a,b,h,e);l=w;return}function sf(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0.0,h=0,i=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0;j=c[a+28>>2]|0;k=c[a+32>>2]|0;e=c[b+8>>2]|0;g[e>>2]=1.0;h=c[b+24>>2]|0;g[e+(h+1<<2)>>2]=1.0;g[e+((h<<1)+2<<2)>>2]=1.0;l=+g[a+300>>2];q=+g[a+304>>2];f=+g[a+308>>2];o=+g[j+4>>2]*l+ +g[j+8>>2]*q+ +g[j+12>>2]*f;m=l*+g[j+20>>2]+q*+g[j+24>>2]+f*+g[j+28>>2];f=l*+g[j+36>>2]+q*+g[j+40>>2]+f*+g[j+44>>2];e=c[b+12>>2]|0;c[e>>2]=0;g[e+4>>2]=f;g[e+8>>2]=-m;g[e+12>>2]=0.0;g[e+(h<<2)>>2]=-f;c[e+(h<<2)+4>>2]=0;g[e+(h<<2)+8>>2]=o;g[e+(h<<2)+12>>2]=0.0;g[e+(h<<1<<2)>>2]=m;g[e+(h<<1<<2)+4>>2]=-o;c[e+(h<<1<<2)+8>>2]=0;g[e+(h<<1<<2)+12>>2]=0.0;e=c[b+16>>2]|0;g[e>>2]=-1.0;g[e+(h+1<<2)>>2]=-1.0;g[e+((h<<1)+2<<2)>>2]=-1.0;q=+g[a+316>>2];l=+g[a+320>>2];d=+g[a+324>>2];p=+g[k+4>>2]*q+ +g[k+8>>2]*l+ +g[k+12>>2]*d;n=q*+g[k+20>>2]+l*+g[k+24>>2]+d*+g[k+28>>2];d=q*+g[k+36>>2]+l*+g[k+40>>2]+d*+g[k+44>>2];h=c[b+20>>2]|0;e=c[b+24>>2]|0;c[h>>2]=0;g[h+4>>2]=-d;g[h+8>>2]=n;g[h+12>>2]=0.0;g[h+(e<<2)>>2]=d;c[h+(e<<2)+4>>2]=0;g[h+(e<<2)+8>>2]=-p;g[h+(e<<2)+12>>2]=0.0;g[h+(e<<1<<2)>>2]=-n;g[h+(e<<1<<2)+4>>2]=p;c[h+(e<<1<<2)+8>>2]=0;g[h+(e<<1<<2)+12>>2]=0.0;h=c[a+332>>2]|0;l=+g[(h&1|0?a+336|0:b+4|0)>>2]*+g[b>>2];i=c[b+28>>2]|0;g[i>>2]=l*(p+ +g[k+52>>2]-o-+g[j+52>>2]);g[i+(e<<2)>>2]=l*(n+ +g[k+56>>2]-m-+g[j+56>>2]);g[i+(e<<1<<2)>>2]=l*(d+ +g[k+60>>2]-f-+g[j+60>>2]);if(h&2|0){k=c[b+32>>2]|0;c[k>>2]=c[a+340>>2];c[k+(e<<2)>>2]=c[a+340>>2];c[k+(e<<1<<2)>>2]=c[a+340>>2]}f=+g[a+356>>2];if(f>0.0){g[c[b+36>>2]>>2]=-f;g[c[b+40>>2]>>2]=f;d=+g[a+356>>2]}else d=f;if(d>0.0){g[(c[b+36>>2]|0)+(e<<2)>>2]=-f;g[(c[b+40>>2]|0)+(e<<2)>>2]=f;d=+g[a+356>>2]}if(!(d>0.0)){j=a+352|0;j=c[j>>2]|0;k=b+48|0;c[k>>2]=j;return}g[(c[b+36>>2]|0)+(e<<1<<2)>>2]=-f;g[(c[b+40>>2]|0)+(e<<1<<2)>>2]=f;j=a+352|0;j=c[j>>2]|0;k=b+48|0;c[k>>2]=j;return}function tf(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+32|0;a[q+16>>0]=1;c[q+12>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;e=c[b+8>>2]|0;if((e|0)>0){o=0;i=0;h=0;g=0;f=0;while(1){m=c[b+16>>2]|0;n=m+(o<<4)|0;if((g|0)==(f|0)){j=f|0?f<<1:1;if((f|0)<(j|0)){if(j){c[6995]=(c[6995]|0)+1;e=sc((j<<4|3)+16|0)|0;if(!e){i=0;f=g}else{c[(e+4+15&-16)+-4>>2]=e;i=e+4+15&-16;f=g}}else i=0;if((f|0)>0){e=0;do{k=c[q+12>>2]|0;c[i+(e<<4)>>2]=c[k+(e<<4)>>2];c[i+(e<<4)+4>>2]=c[k+(e<<4)+4>>2];c[i+(e<<4)+8>>2]=c[k+(e<<4)+8>>2];c[i+(e<<4)+12>>2]=c[k+(e<<4)+12>>2];e=e+1|0}while((e|0)!=(f|0))}e=c[q+12>>2]|0;if(!e)g=f;else{c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);c[q+12>>2]=0}c[q+12>>2]=i;k=j;h=j;j=g;f=i;e=c[b+8>>2]|0}else{k=f;j=f;f=i}}else{k=f;j=g;f=i}c[f+(j<<4)>>2]=c[n>>2];c[f+(j<<4)+4>>2]=c[m+(o<<4)+4>>2];c[f+(j<<4)+8>>2]=c[m+(o<<4)+8>>2];c[f+(j<<4)+12>>2]=c[m+(o<<4)+12>>2];g=j+1|0;o=o+1|0;if((o|0)>=(e|0))break;else{i=f;f=k}}c[q+4>>2]=g;a[q+16>>0]=1;c[q+8>>2]=h;if((j|0)>-1){f=c[q+12>>2]|0;e=0;while(1){Cb[c[(c[b>>2]|0)+12>>2]&31](b,c[f+(e<<4)>>2]|0,c[f+(e<<4)+4>>2]|0,d)|0;if((e|0)<(j|0))e=e+1|0;else break}}}else g=0;if((c[b+52>>2]|0)>0){f=c[b+60>>2]|0;e=0;do{c[f+(e<<2)>>2]=-1;e=e+1|0}while((e|0)<(c[b+52>>2]|0))}if((g|0)<=1)if((g|0)<=0){e=c[q+12>>2]|0;if(!e){l=q;return}}else p=23;else{te(q,0,g+-1|0);p=23}if((p|0)==23){e=c[q+12>>2]|0;f=0;do{Bb[c[(c[b>>2]|0)+8>>2]&63](b,c[e+(f<<4)>>2]|0,c[e+(f<<4)+4>>2]|0)|0;f=f+1|0}while((f|0)<(g|0))}c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);c[q+12>>2]=0;l=q;return}function uf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0,u=0.0,v=0.0,w=0,x=0.0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0;B=(a[b+68>>0]|0)!=0;C=B?e:d;B=B?d:e;z=c[b+52>>2]|0;if((z|0)<=0){x=1.0;return +x}A=(c[C+192>>2]|0)+28|0;j=+g[C+4>>2];u=+g[C+8>>2];v=+g[C+12>>2];w=c[C+16>>2]|0;x=+g[C+20>>2];k=+g[C+24>>2];l=+g[C+28>>2];e=c[C+32>>2]|0;m=+g[C+36>>2];n=+g[C+40>>2];o=+g[C+44>>2];p=c[C+48>>2]|0;q=+g[C+52>>2];r=+g[C+56>>2];s=+g[C+60>>2];t=c[C+64>>2]|0;i=1.0;d=0;y=c[C+304>>2]|0;do{E=c[A>>2]|0;P=+g[E+(d*80|0)>>2];O=+g[E+(d*80|0)+16>>2];N=+g[E+(d*80|0)+32>>2];M=+g[E+(d*80|0)+4>>2];L=+g[E+(d*80|0)+20>>2];K=+g[E+(d*80|0)+36>>2];J=+g[E+(d*80|0)+8>>2];I=+g[E+(d*80|0)+24>>2];H=+g[E+(d*80|0)+40>>2];G=+g[E+(d*80|0)+48>>2];F=+g[E+(d*80|0)+52>>2];D=+g[E+(d*80|0)+56>>2];c[C+304>>2]=y+1;g[C+4>>2]=j*P+u*O+v*N;g[C+8>>2]=j*M+u*L+v*K;g[C+12>>2]=j*J+u*I+v*H;g[C+16>>2]=0.0;g[C+20>>2]=x*P+k*O+l*N;g[C+24>>2]=x*M+k*L+l*K;g[C+28>>2]=x*J+k*I+l*H;g[C+32>>2]=0.0;g[C+36>>2]=m*P+n*O+o*N;g[C+40>>2]=m*M+n*L+o*K;g[C+44>>2]=m*J+n*I+o*H;g[C+48>>2]=0.0;g[C+52>>2]=q+(j*G+u*F+v*D);g[C+56>>2]=r+(x*G+k*F+l*D);g[C+60>>2]=s+(m*G+n*F+o*D);g[C+64>>2]=0.0;E=c[(c[b+60>>2]|0)+(d<<2)>>2]|0;D=+tb[c[(c[E>>2]|0)+12>>2]&15](E,C,B,f,h);i=D>2]|0)+1|0;c[C+304>>2]=y;g[C+4>>2]=j;g[C+8>>2]=u;g[C+12>>2]=v;c[C+16>>2]=w;g[C+20>>2]=x;g[C+24>>2]=k;g[C+28>>2]=l;c[C+32>>2]=e;g[C+36>>2]=m;g[C+40>>2]=n;g[C+44>>2]=o;c[C+48>>2]=p;g[C+52>>2]=q;g[C+56>>2]=r;g[C+60>>2]=s;c[C+64>>2]=t;d=d+1|0}while((d|0)!=(z|0));return +i}function vf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0;i=lt()|0;c[i+4>>2]=7;c[i+8>>2]=-1;c[i+12>>2]=-1;g[i+16>>2]=3402823466385288598117041.0e14;a[i+20>>0]=1;a[i+21>>0]=0;c[i+24>>2]=-1;c[i+28>>2]=b;c[i+32>>2]=d;g[i+36>>2]=0.0;g[i+40>>2]=.05000000074505806;c[i+44>>2]=0;c[i>>2]=4884;a[i+48>>0]=0;c[i+52>>2]=c[e>>2];c[i+52+4>>2]=c[e+4>>2];c[i+52+8>>2]=c[e+8>>2];c[i+52+12>>2]=c[e+12>>2];c[i+68>>2]=c[e+16>>2];c[i+68+4>>2]=c[e+16+4>>2];c[i+68+8>>2]=c[e+16+8>>2];c[i+68+12>>2]=c[e+16+12>>2];c[i+84>>2]=c[e+32>>2];c[i+84+4>>2]=c[e+32+4>>2];c[i+84+8>>2]=c[e+32+8>>2];c[i+84+12>>2]=c[e+32+12>>2];c[i+100>>2]=c[e+48>>2];c[i+100+4>>2]=c[e+48+4>>2];c[i+100+8>>2]=c[e+48+8>>2];c[i+100+12>>2]=c[e+48+12>>2];c[i+116>>2]=c[f>>2];c[i+116+4>>2]=c[f+4>>2];c[i+116+8>>2]=c[f+8>>2];c[i+116+12>>2]=c[f+12>>2];c[i+132>>2]=c[f+16>>2];c[i+132+4>>2]=c[f+16+4>>2];c[i+132+8>>2]=c[f+16+8>>2];c[i+132+12>>2]=c[f+16+12>>2];c[i+148>>2]=c[f+32>>2];c[i+148+4>>2]=c[f+32+4>>2];c[i+148+8>>2]=c[f+32+8>>2];c[i+148+12>>2]=c[f+32+12>>2];c[i+164>>2]=c[f+48>>2];c[i+164+4>>2]=c[f+48+4>>2];c[i+164+8>>2]=c[f+48+8>>2];c[i+164+12>>2]=c[f+48+12>>2];a[i+180>>0]=h&1;g[i+184>>2]=1.0;g[i+188>>2]=-1.0;g[i+192>>2]=0.0;g[i+196>>2]=0.0;g[i+200>>2]=1.0;g[i+204>>2]=.699999988079071;g[i+208>>2]=0.0;g[i+212>>2]=0.0;g[i+216>>2]=1.0;g[i+220>>2]=.699999988079071;g[i+224>>2]=0.0;g[i+228>>2]=0.0;g[i+264>>2]=1.0;g[i+268>>2]=.699999988079071;g[i+272>>2]=1.0;g[i+276>>2]=0.0;g[i+280>>2]=1.0;g[i+284>>2]=.699999988079071;g[i+288>>2]=1.0;g[i+292>>2]=0.0;g[i+232>>2]=1.0;g[i+236>>2]=.699999988079071;g[i+240>>2]=1.0;g[i+244>>2]=0.0;g[i+248>>2]=1.0;g[i+252>>2]=.699999988079071;g[i+256>>2]=1.0;g[i+260>>2]=0.0;a[i+1096>>0]=0;g[i+1116>>2]=0.0;g[i+1120>>2]=0.0;g[i+1124>>2]=0.0;c[i+300>>2]=0;c[i+1100>>2]=0;c[i+1100+4>>2]=0;c[i+1100+8>>2]=0;a[i+1100+12>>0]=0;a[i+49>>0]=1;Zc(i,(c[i+28>>2]|0)+4|0,(c[i+32>>2]|0)+4|0);return i|0}function wf(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0;j=l;l=l+64|0;Tg(c[b+108>>2]|0,d,0);e=+g[d+204>>2]+ +g[d+212>>2];h=e*+g[d+56>>2]+ +g[d+40>>2];i=e*+g[d+60>>2]+ +g[d+44>>2];g[d+16>>2]=+g[d+52>>2]*e+ +g[d+36>>2];g[d+20>>2]=h;g[d+24>>2]=i;g[d+28>>2]=0.0;g[j+32>>2]=-1.0;k=c[b+92>>2]|0;k=Cb[c[(c[k>>2]|0)+8>>2]&31](k,d+36|0,d+16|0,j)|0;c[d+88>>2]=0;if(!k){c[d+32>>2]=c[d+204>>2];g[d+272>>2]=0.0;h=-+g[d+56>>2];i=-+g[d+60>>2];g[d>>2]=-+g[d+52>>2];g[d+4>>2]=h;g[d+8>>2]=i;g[d+12>>2]=0.0;i=-1.0;h=1.0;k=d+268|0;g[k>>2]=h;l=j;return +i}f=e*+g[j+32>>2];c[d>>2]=c[j+16>>2];c[d+4>>2]=c[j+16+4>>2];c[d+8>>2]=c[j+16+8>>2];c[d+12>>2]=c[j+16+12>>2];a[d+84>>0]=1;if((a[22488]|0)==0?Uz(22488)|0:0){c[j+40>>2]=0;c[j+40+4>>2]=0;c[j+40+8>>2]=0;c[j+40+12>>2]=0;ef(23848,0.0,0,0,j+40|0)}c[6013]=c[6013]|1;g[6063]=0.0;e=+g[6073]*0.0;h=+g[6074]*0.0;g[6068]=+g[6072]*0.0;g[6069]=e;g[6070]=h;g[6071]=0.0;c[6076]=0;c[6077]=0;c[6078]=0;c[6079]=0;h=+g[6065]*0.0;e=+g[6066]*0.0;g[6117]=+g[6064]*0.0;g[6118]=h;g[6119]=e;g[6120]=0.0;c[d+88>>2]=23848;e=f-+g[d+212>>2];g[d+32>>2]=e;h=+g[d+204>>2];i=+g[d+208>>2]*.009999999776482582;if(e>2]=h-i;e=h-i}if(e>h+i)g[d+32>>2]=h+i;c[d+16>>2]=c[j>>2];c[d+16+4>>2]=c[j+4>>2];c[d+16+8>>2]=c[j+8>>2];c[d+16+12>>2]=c[j+12>>2];s=+g[d>>2];r=+g[d+4>>2];o=+g[d+8>>2];h=s*+g[d+52>>2]+r*+g[d+56>>2]+o*+g[d+60>>2];k=c[b+108>>2]|0;e=+g[d+16>>2]-+g[k+52>>2];n=+g[d+20>>2]-+g[k+56>>2];p=+g[d+24>>2]-+g[k+60>>2];i=+g[k+392>>2];q=+g[k+396>>2];m=+g[k+388>>2];g[d+272>>2]=!(h>=-.10000000149011612)?-1.0/h*(s*(i*p-n*q+ +g[k+372>>2])+r*(+g[k+376>>2]+(e*q-p*m))+o*(n*m-e*i+ +g[k+380>>2])):0.0;i=f;h=!(h>=-.10000000149011612)?-1.0/h:10.0;k=d+268|0;g[k>>2]=h;l=j;return +i}function xf(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0;o=l;l=l+64|0;e=c[d+192>>2]|0;Vb[c[(c[e>>2]|0)+8>>2]&127](e,d+4|0,o+48|0,o+32|0);h=+g[o+48>>2]+-.019999999552965164;g[o+48>>2]=h;i=+g[o+48+4>>2]+-.019999999552965164;g[o+48+4>>2]=i;j=+g[o+48+8>>2]+-.019999999552965164;g[o+48+8>>2]=j;f=+g[o+32>>2]+.019999999552965164;g[o+32>>2]=f;k=+g[o+32+4>>2]+.019999999552965164;g[o+32+4>>2]=k;m=+g[o+32+8>>2]+.019999999552965164;g[o+32+8>>2]=m;if(((a[b+44>>0]|0)!=0?(c[d+252>>2]|0)==2:0)?(c[d+204>>2]&3|0)==0:0){e=c[d+192>>2]|0;Vb[c[(c[e>>2]|0)+8>>2]&127](e,d+68|0,o+16|0,o);h=+g[o+16>>2]+-.019999999552965164;g[o+16>>2]=h;j=+g[o+16+4>>2]+-.019999999552965164;g[o+16+4>>2]=j;k=+g[o+16+8>>2]+-.019999999552965164;g[o+16+8>>2]=k;f=+g[o>>2]+.019999999552965164;g[o>>2]=f;m=+g[o+4>>2]+.019999999552965164;g[o+4>>2]=m;n=+g[o+8>>2]+.019999999552965164;g[o+8>>2]=n;i=+g[o+48>>2];if(h>2]=h;else h=i;i=+g[o+48+4>>2];if(j>2]=j;i=j}j=+g[o+48+8>>2];if(k>2]=k;j=k}k=+g[o+16+12>>2];if(k<+g[o+48+12>>2])g[o+48+12>>2]=k;k=+g[o+32>>2];if(k>2]=f;else f=k;k=+g[o+32+4>>2];if(k>2]=m;k=m}m=+g[o+32+8>>2];if(m>2]=n;m=n}n=+g[o+12>>2];if(+g[o+32+12>>2]>2]=n}e=c[b+68>>2]|0;if((c[d+204>>2]&1|0)==0?(h=f-h,k=k-i,n=m-j,!(h*h+k*k+n*n<999999995904.0)):0){if((c[d+220>>2]&-2|0)!=4)c[d+220>>2]=5;if(!(a[14696]|0)){l=o;return}e=c[b+72>>2]|0;if(!e){l=o;return}a[14696]=0;Ob[c[(c[e>>2]|0)+44>>2]&127](e,14697);d=c[b+72>>2]|0;Ob[c[(c[d>>2]|0)+44>>2]&127](d,14746);d=c[b+72>>2]|0;Ob[c[(c[d>>2]|0)+44>>2]&127](d,14814);b=c[b+72>>2]|0;Ob[c[(c[b>>2]|0)+44>>2]&127](b,14879);l=o;return}Zb[c[(c[e>>2]|0)+16>>2]&31](e,c[d+188>>2]|0,o+48|0,o+32|0,c[b+24>>2]|0);l=o;return}function yf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0;b=l;l=l+608|0;p=+g[d+116>>2]-+g[d+52>>2];o=+g[d+120>>2]-+g[d+56>>2];n=+g[d+124>>2]-+g[d+60>>2];i=+g[e+116>>2]-+g[e+52>>2];j=+g[e+120>>2]-+g[e+56>>2];k=+g[e+124>>2]-+g[e+60>>2];m=+g[d+276>>2];if(p*p+o*o+n*n>2],i*i+j*j+k*k>2]|0;f=c[e+272>>2]|0;c[b+552+8>>2]=0;c[b+552+12>>2]=-1;q=b+552+28|0;c[b+552>>2]=7020;c[b+552+4>>2]=8;c[b+552+16>>2]=1065353216;c[b+552+20>>2]=1065353216;c[b+552+24>>2]=1065353216;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[q+16>>2]=0;c[b+552+32>>2]=f;c[b+552+48>>2]=f;g[b+552+52>>2]=0.0;c[b+376>>2]=3896;g[b+376+164>>2]=999999984306749440.0;c[b+376+168>>2]=0;g[b+376+172>>2]=0.0;g[b+16+308>>2]=9.999999747378752e-05;a[b+16+332>>0]=0;c[b>>2]=9484;c[b+4>>2]=b+16;c[b+8>>2]=h;c[b+12>>2]=b+552;if(Ad(b,d+4|0,d+68|0,e+4|0,e+68|0,b+376|0)|0){i=+g[b+376+164>>2];if(+g[d+268>>2]>i)g[d+268>>2]=i;if(+g[e+268>>2]>i)g[e+268>>2]=i;if(!(i<1.0))i=1.0}else i=1.0;q=c[e+192>>2]|0;h=c[d+272>>2]|0;c[b+552+8>>2]=0;c[b+552+12>>2]=-1;f=b+552+28|0;c[b+552>>2]=7020;c[b+552+4>>2]=8;c[b+552+16>>2]=1065353216;c[b+552+20>>2]=1065353216;c[b+552+24>>2]=1065353216;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[b+552+32>>2]=h;c[b+552+48>>2]=h;g[b+552+52>>2]=0.0;c[b+376>>2]=3896;g[b+376+164>>2]=999999984306749440.0;c[b+376+168>>2]=0;g[b+376+172>>2]=0.0;g[b+16+308>>2]=9.999999747378752e-05;a[b+16+332>>0]=0;c[b>>2]=9484;c[b+4>>2]=b+16;c[b+8>>2]=b+552;c[b+12>>2]=q;if(Ad(b,d+4|0,d+68|0,e+4|0,e+68|0,b+376|0)|0){j=+g[b+376+164>>2];if(+g[d+268>>2]>j)g[d+268>>2]=j;if(+g[e+268>>2]>j)g[e+268>>2]=j;if(i>j)i=j}p=i;l=b;return +p}function zf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0;i=Us(480)|0;Vd(i,b,d,e);c[i>>2]=4080;a[i+360>>0]=1;c[i+356>>2]=0;c[i+348>>2]=0;c[i+352>>2]=0;g[i+372>>2]=1.2000000476837158;g[i+376>>2]=0.0;g[i+380>>2]=0.0;g[i+384>>2]=1.0e3;c[i+388>>2]=0;c[i+388+4>>2]=0;c[i+388+8>>2]=0;c[i+388+12>>2]=0;c[i+388+16>>2]=0;c[i+388+20>>2]=0;c[i+388+24>>2]=0;c[i+416>>2]=-1054867456;c[i+420>>2]=0;g[i+424>>2]=0.0;a[i+444>>0]=1;c[i+440>>2]=0;c[i+432>>2]=0;c[i+436>>2]=0;c[i+472>>2]=h;a[i+476>>0]=0;if(!h){c[6995]=(c[6995]|0)+1;f=sc(59)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}g[f+12>>2]=1.0;c[f+8>>2]=0;c[f+4>>2]=5;c[f>>2]=3172;a[f+36>>0]=1;c[f+32>>2]=0;c[f+24>>2]=0;c[f+28>>2]=0;a[f+16>>0]=1;c[i+472>>2]=f;a[i+476>>0]=1}c[i+364>>2]=4302;a[i+368>>0]=1;a[i+369>>0]=0;a[i+370>>0]=0;c[i+404>>2]=d;c[i+408>>2]=b;Bi(i+428|0);h=c[i+432>>2]|0;if((h|0)>0)e=0;else{d=i+448|0;g[d>>2]=.25;d=i+452|0;c[d>>2]=0;d=i+456|0;c[d>>2]=0;d=i+464|0;c[d>>2]=1;d=i+468|0;c[d>>2]=1;g[i+372>>2]=1.2000000476837158;g[i+376>>2]=0.0;g[i+380>>2]=0.0;d=i+412|0;c[d>>2]=0;c[i+388>>2]=0;c[i+388+4>>2]=0;c[i+388+8>>2]=0;c[i+388+12>>2]=0;c[i+416>>2]=-1054867456;c[i+420>>2]=0;g[i+424>>2]=0.0;Bi(i+428|0);return i|0}do{d=(c[i+440>>2]|0)+(e<<2)|0;f=c[d>>2]|0;c[d>>2]=0;if(f|0)do{d=f;f=c[f+280>>2]|0;cJ(d)}while((f|0)!=0);e=e+1|0}while((e|0)!=(h|0));d=i+448|0;g[d>>2]=.25;d=i+452|0;c[d>>2]=0;d=i+456|0;c[d>>2]=0;d=i+464|0;c[d>>2]=1;d=i+468|0;c[d>>2]=1;g[i+372>>2]=1.2000000476837158;g[i+376>>2]=0.0;g[i+380>>2]=0.0;d=i+412|0;c[d>>2]=0;c[i+388>>2]=0;c[i+388+4>>2]=0;c[i+388+8>>2]=0;c[i+388+12>>2]=0;c[i+416>>2]=-1054867456;c[i+420>>2]=0;g[i+424>>2]=0.0;Bi(i+428|0);return i|0}function Af(a,b,d,e,f,h,i){a=a|0;b=+b;d=+d;e=+e;f=f|0;h=+h;i=i|0;var j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0;s=l;l=l+16|0;j=d*h+ +g[a+52>>2];d=e*h+ +g[a+56>>2];g[i+48>>2]=b*h+ +g[a+48>>2];g[i+52>>2]=j;g[i+56>>2]=d;g[i+60>>2]=0.0;d=+g[f>>2];j=+g[f+4>>2];k=+g[f+8>>2];if(d*d+j*j+k*k>1.1920928955078125e-07)b=+D(+(d*d+j*j+k*k));else b=0.0;e=b*h>.7853981852531433?.7853981852531433/h:b;if(e<1.0000000474974513e-03)b=h*.5-e*h*h*h*.02083333395421505*e;else b=+G(+(e*.5*h))/e;r=b*d;q=b*j;p=b*k;d=+F(+(e*h*.5));yh(a,s);e=+g[s>>2];j=+g[s+12>>2];k=+g[s+8>>2];h=+g[s+4>>2];b=(d*j-r*e-q*h-p*k)*(d*j-r*e-q*h-p*k)+((p*j+d*k+r*h-q*e)*(p*j+d*k+r*h-q*e)+((d*e+r*j+q*k-p*h)*(d*e+r*j+q*k-p*h)+(p*e+(q*j+d*h)-r*k)*(p*e+(q*j+d*h)-r*k)));if(b>1.1920928955078125e-07){b=1.0/+D(+b);m=(d*e+r*j+q*k-p*h)*b;n=(p*j+d*k+r*h-q*e)*b;o=(d*j-r*e-q*h-p*k)*b;b=(p*e+(q*j+d*h)-r*k)*b}else{m=d*e+r*j+q*k-p*h;n=p*j+d*k+r*h-q*e;o=d*j-r*e-q*h-p*k;b=p*e+(q*j+d*h)-r*k}d=o*o+(n*n+(b*b+m*m));if(d>1.1920928955078125e-07){q=m*(2.0/d);r=b*(2.0/d);e=n*(2.0/d);p=o*q;h=o*r;k=o*e;q=m*q;j=m*r;m=m*e;r=b*r;o=b*e;n=n*e;g[i>>2]=1.0-(r+n);g[i+4>>2]=j-k;g[i+8>>2]=m+h;g[i+12>>2]=0.0;g[i+16>>2]=j+k;g[i+20>>2]=1.0-(q+n);g[i+24>>2]=o-p;g[i+28>>2]=0.0;g[i+32>>2]=m-h;g[i+36>>2]=o+p;g[i+40>>2]=1.0-(q+r);g[i+44>>2]=0.0;l=s;return}else{c[i>>2]=c[a>>2];c[i+4>>2]=c[a+4>>2];c[i+8>>2]=c[a+8>>2];c[i+12>>2]=c[a+12>>2];c[i+16>>2]=c[a+16>>2];c[i+16+4>>2]=c[a+16+4>>2];c[i+16+8>>2]=c[a+16+8>>2];c[i+16+12>>2]=c[a+16+12>>2];c[i+32>>2]=c[a+32>>2];c[i+32+4>>2]=c[a+32+4>>2];c[i+32+8>>2]=c[a+32+8>>2];c[i+32+12>>2]=c[a+32+12>>2];l=s;return}}function Bf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0;x=l;l=l+256|0;if(!a){l=x;return}p=+g[b>>2];q=+g[b+4>>2];r=+g[b+8>>2];s=+g[b+16>>2];t=+g[b+20>>2];o=+g[b+24>>2];c[x>>2]=a;a=64;n=1;e=x;b=0;while(1){m=n+-1|0;j=c[e+(m<<2)>>2]|0;do if(((((+g[j>>2]<=s?+g[j+16>>2]>=p:0)?+g[j+4>>2]<=t:0)?+g[j+20>>2]>=q:0)?+g[j+8>>2]<=o:0)?+g[j+24>>2]>=r:0){if(!(c[j+40>>2]|0)){Ob[c[(c[d>>2]|0)+12>>2]&127](d,j);f=m;break}i=c[j+36>>2]|0;do if((m|0)==(a|0)?(u=a|0?a<<1:1,(n|0)<=(u|0)):0){if((u|0)!=0?(c[6995]=(c[6995]|0)+1,v=sc((u<<2|3)+16|0)|0,(v|0)!=0):0){c[(v+4+15&-16)+-4>>2]=v;h=v+4+15&-16}else h=0;if((n|0)>1){f=0;do{c[h+(f<<2)>>2]=c[e+(f<<2)>>2];f=f+1|0}while((f|0)!=(a|0));if(!(b<<24>>24)){a=u;k=1;break}}else if((e|0)==0|b<<24>>24==0){a=u;k=1;break}c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);a=u;k=1}else{h=e;k=b}while(0);c[h+(m<<2)>>2]=i;f=c[j+40>>2]|0;do if((n|0)==(a|0)){a=n|0?n<<1:1;if((n|0)<(a|0)){if((a|0)!=0?(c[6995]=(c[6995]|0)+1,w=sc((a<<2|3)+16|0)|0,(w|0)!=0):0){c[(w+4+15&-16)+-4>>2]=w;e=w+4+15&-16}else e=0;if((n|0)>0){b=0;do{c[e+(b<<2)>>2]=c[h+(b<<2)>>2];b=b+1|0}while((b|0)!=(n|0));if(!(k<<24>>24)){b=1;break}}else if((h|0)==0|k<<24>>24==0){b=1;break}c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);b=1}else{a=n;e=h;b=k}}else{e=h;b=k}while(0);c[e+(n<<2)>>2]=f;f=n+1|0}else f=m;while(0);if((f|0)>0)n=f;else break}if((e|0)==0|b<<24>>24==0){l=x;return}c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);l=x;return}function Cf(a,b,e){a=a|0;b=b|0;e=e|0;fi(a,b,e)|0;c[b+52>>2]=c[a+48>>2];c[b+56>>2]=c[a+52>>2];c[b+60>>2]=c[a+56>>2];c[b+64>>2]=c[a+60>>2];c[b+68>>2]=c[a+64>>2];c[b+72>>2]=c[a+68>>2];c[b+76>>2]=c[a+72>>2];c[b+80>>2]=c[a+76>>2];c[b+84>>2]=c[a+80>>2];c[b+88>>2]=c[a+84>>2];c[b+92>>2]=c[a+88>>2];c[b+96>>2]=c[a+92>>2];c[b+100>>2]=c[a+96>>2];c[b+104>>2]=c[a+100>>2];c[b+108>>2]=c[a+104>>2];c[b+112>>2]=c[a+108>>2];c[b+116>>2]=c[a+112>>2];c[b+120>>2]=c[a+116>>2];c[b+124>>2]=c[a+120>>2];c[b+128>>2]=c[a+124>>2];c[b+132>>2]=c[a+128>>2];c[b+136>>2]=c[a+132>>2];c[b+140>>2]=c[a+136>>2];c[b+144>>2]=c[a+140>>2];c[b+148>>2]=c[a+144>>2];c[b+152>>2]=c[a+148>>2];c[b+156>>2]=c[a+152>>2];c[b+160>>2]=c[a+156>>2];c[b+164>>2]=c[a+160>>2];c[b+168>>2]=c[a+164>>2];c[b+172>>2]=c[a+168>>2];c[b+176>>2]=c[a+172>>2];c[b+228>>2]=c[a+868>>2];c[b+212>>2]=c[a+872>>2];c[b+196>>2]=c[a+680>>2];c[b+180>>2]=c[a+696>>2];c[b+232>>2]=c[a+932>>2];c[b+216>>2]=c[a+936>>2];c[b+200>>2]=c[a+684>>2];c[b+184>>2]=c[a+700>>2];c[b+236>>2]=c[a+996>>2];c[b+220>>2]=c[a+1e3>>2];c[b+204>>2]=c[a+688>>2];c[b+188>>2]=c[a+704>>2];c[b+244>>2]=d[a+1300>>0];c[b+248>>2]=d[a+1301>>0];c[b+276>>2]=c[a+1316>>2];c[b+324>>2]=c[a+1364>>2];c[b+252>>2]=d[a+1309>>0];c[b+300>>2]=c[a+1340>>2];c[b+280>>2]=c[a+1320>>2];c[b+328>>2]=c[a+1368>>2];c[b+256>>2]=d[a+1310>>0];c[b+304>>2]=c[a+1344>>2];c[b+284>>2]=c[a+1324>>2];c[b+332>>2]=c[a+1372>>2];c[b+260>>2]=d[a+1311>>0];c[b+308>>2]=c[a+1348>>2];c[b+288>>2]=c[a+1328>>2];c[b+336>>2]=c[a+1376>>2];c[b+264>>2]=d[a+1312>>0];c[b+312>>2]=c[a+1352>>2];c[b+292>>2]=c[a+1332>>2];c[b+340>>2]=c[a+1380>>2];c[b+268>>2]=d[a+1313>>0];c[b+316>>2]=c[a+1356>>2];c[b+296>>2]=c[a+1336>>2];c[b+344>>2]=c[a+1384>>2];c[b+272>>2]=d[a+1314>>0];c[b+320>>2]=c[a+1360>>2];return 12447}function Df(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;k=c[b+220>>2]|0;Sb[c[(c[k>>2]|0)+8>>2]&127](k,b,c[b+24>>2]|0);k=c[b+324>>2]|0;if((k|0)>0){j=c[b+332>>2]|0;i=0;do{e=c[j+(i<<2)>>2]|0;d=c[e+772>>2]|0;e=c[e+776>>2]|0;if((d|0?(e|0?(c[d+204>>2]&3|0)==0:0):0)?(c[e+204>>2]&3|0)==0:0){g=c[d+208>>2]|0;d=c[e+208>>2]|0;h=c[(c[b+220>>2]|0)+16>>2]|0;e=c[h+(g<<3)>>2]|0;if((e|0)!=(g|0)){f=h+(g<<3)|0;do{g=h+(e<<3)|0;c[f>>2]=c[g>>2];g=c[g>>2]|0;f=h+(g<<3)|0;e=c[f>>2]|0}while((g|0)!=(e|0))}e=c[h+(d<<3)>>2]|0;if((e|0)!=(d|0)){f=h+(d<<3)|0;do{d=h+(e<<3)|0;c[f>>2]=c[d>>2];d=c[d>>2]|0;f=h+(d<<3)|0;e=c[f>>2]|0}while((d|0)!=(e|0))}if((g|0)!=(d|0)){c[h+(g<<3)>>2]=d;f=h+(d<<3)+4|0;c[f>>2]=(c[f>>2]|0)+(c[h+(g<<3)+4>>2]|0)}}i=i+1|0}while((i|0)!=(k|0))}k=c[b+228>>2]|0;if((k|0)<=0){m=c[b+220>>2]|0;l=c[m>>2]|0;l=l+12|0;l=c[l>>2]|0;Ob[l&127](m,b);return}j=c[b+236>>2]|0;i=0;do{d=c[j+(i<<2)>>2]|0;if((a[d+20>>0]|0?(l=c[d+28>>2]|0,(c[l+204>>2]&3|0)==0):0)?(m=c[d+32>>2]|0,(c[m+204>>2]&3|0)==0):0){f=c[l+208>>2]|0;d=c[m+208>>2]|0;h=c[(c[b+220>>2]|0)+16>>2]|0;e=c[h+(f<<3)>>2]|0;if((e|0)!=(f|0)){g=h+(f<<3)|0;do{f=h+(e<<3)|0;c[g>>2]=c[f>>2];f=c[f>>2]|0;g=h+(f<<3)|0;e=c[g>>2]|0}while((f|0)!=(e|0))}e=c[h+(d<<3)>>2]|0;if((e|0)!=(d|0)){g=h+(d<<3)|0;do{d=h+(e<<3)|0;c[g>>2]=c[d>>2];d=c[d>>2]|0;g=h+(d<<3)|0;e=c[g>>2]|0}while((d|0)!=(e|0))}if((f|0)!=(d|0)){c[h+(f<<3)>>2]=d;g=h+(d<<3)+4|0;c[g>>2]=(c[g>>2]|0)+(c[h+(f<<3)+4>>2]|0)}}i=i+1|0}while((i|0)!=(k|0));m=c[b+220>>2]|0;l=c[m>>2]|0;l=l+12|0;l=c[l>>2]|0;Ob[l&127](m,b);return}function Ef(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c[6157]=(c[6157]|0)+1;k=(c[b+12>>2]|0)>(c[d+12>>2]|0);n=k?d:b;h=c[n+12>>2]|0;k=k?b:d;f=c[k+12>>2]|0;j=(((f<<16|h)+~((f<<16|h)<<15)|0)>>>10^(f<<16|h)+~((f<<16|h)<<15))*9|0;j=(((j>>>6^j)+~((j>>>6^j)<<11)|0)>>>16^(j>>>6^j)+~((j>>>6^j)<<11))&(c[a+12>>2]|0)+-1;b=c[(c[a+40>>2]|0)+(j<<2)>>2]|0;if((b|0)==-1){a=0;return a|0}g=c[a+16>>2]|0;d=b;while(1){if((c[(c[g+(d<<4)>>2]|0)+12>>2]|0)==(h|0)?(c[(c[g+(d<<4)+4>>2]|0)+12>>2]|0)==(f|0):0)break;b=c[(c[a+60>>2]|0)+(d<<2)>>2]|0;if((b|0)==-1){b=0;i=22;break}else d=b}if((i|0)==22)return b|0;b=g+(d<<4)|0;if(!b){a=0;return a|0}Sb[c[(c[a>>2]|0)+32>>2]&127](a,b,e);m=c[g+(d<<4)+12>>2]|0;l=b-(c[a+16>>2]|0)>>4;d=j;f=-1;b=a+40|0;while(1){b=c[(c[b>>2]|0)+(d<<2)>>2]|0;if((b|0)==(l|0))break;else{d=b;f=b;b=a+60|0}}d=c[a+60>>2]|0;if((f|0)==-1)b=(c[a+40>>2]|0)+(j<<2)|0;else b=d+(f<<2)|0;c[b>>2]=c[d+(l<<2)>>2];i=(c[a+8>>2]|0)+-1|0;b=c[a+68>>2]|0;if(b|0)Cb[c[(c[b>>2]|0)+12>>2]&31](b,n,k,e)|0;if((i|0)==(l|0)){c[a+8>>2]=(c[a+8>>2]|0)+-1;a=m;return a|0}h=c[a+16>>2]|0;g=c[(c[h+(i<<4)+4>>2]|0)+12>>2]<<16|c[(c[h+(i<<4)>>2]|0)+12>>2];g=((g+~(g<<15)|0)>>>10^g+~(g<<15))*9|0;g=(((g>>>6^g)+~((g>>>6^g)<<11)|0)>>>16^(g>>>6^g)+~((g>>>6^g)<<11))&(c[a+12>>2]|0)+-1;d=g;f=-1;b=a+40|0;while(1){b=c[(c[b>>2]|0)+(d<<2)>>2]|0;if((b|0)==(i|0))break;else{d=b;f=b;b=a+60|0}}d=c[a+60>>2]|0;if((f|0)==-1)b=(c[a+40>>2]|0)+(g<<2)|0;else b=d+(f<<2)|0;c[b>>2]=c[d+(i<<2)>>2];c[h+(l<<4)>>2]=c[h+(i<<4)>>2];c[h+(l<<4)+4>>2]=c[h+(i<<4)+4>>2];c[h+(l<<4)+8>>2]=c[h+(i<<4)+8>>2];c[h+(l<<4)+12>>2]=c[h+(i<<4)+12>>2];e=(c[a+40>>2]|0)+(g<<2)|0;c[(c[a+60>>2]|0)+(l<<2)>>2]=c[e>>2];c[e>>2]=l;c[a+8>>2]=(c[a+8>>2]|0)+-1;a=m;return a|0}function Ff(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0;f=l;l=l+784|0;c[f+720>>2]=1065353216;c[f+720+4>>2]=0;c[f+720+4+4>>2]=0;c[f+720+4+8>>2]=0;c[f+720+4+12>>2]=0;c[f+720+20>>2]=1065353216;c[f+720+24>>2]=0;c[f+720+24+4>>2]=0;c[f+720+24+8>>2]=0;c[f+720+24+12>>2]=0;c[f+720+40>>2]=1065353216;e=f+720+44|0;c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[f+544>>2]=3896;c[f+544+168>>2]=0;g[f+544+172>>2]=0.0;c[f+544+164>>2]=c[b+200>>2];e=c[b+196>>2]|0;c[f+488+8>>2]=0;c[f+488+12>>2]=-1;i=f+488+28|0;c[f+488>>2]=7020;c[f+488+4>>2]=8;c[f+488+16>>2]=1065353216;c[f+488+20>>2]=1065353216;c[f+488+24>>2]=1065353216;c[i>>2]=0;c[i+4>>2]=0;c[i+8>>2]=0;c[i+12>>2]=0;c[i+16>>2]=0;c[f+488+32>>2]=e;c[f+488+48>>2]=e;g[f+488+52>>2]=0.0;c[f+376+8>>2]=0;c[f+376+12>>2]=-1;c[f+376+16>>2]=1065353216;c[f+376+20>>2]=1065353216;c[f+376+24>>2]=1065353216;g[f+376+28>>2]=0.0;g[f+376+48>>2]=.03999999910593033;c[f+376+56>>2]=0;c[f+376>>2]=3924;c[f+376+4>>2]=1;c[f+376+60>>2]=c[d>>2];c[f+376+60+4>>2]=c[d+4>>2];c[f+376+60+8>>2]=c[d+8>>2];c[f+376+60+12>>2]=c[d+12>>2];c[f+376+76>>2]=c[d+16>>2];c[f+376+76+4>>2]=c[d+16+4>>2];c[f+376+76+8>>2]=c[d+16+8>>2];c[f+376+76+12>>2]=c[d+16+12>>2];c[f+376+92>>2]=c[d+32>>2];c[f+376+92+4>>2]=c[d+32+4>>2];c[f+376+92+8>>2]=c[d+32+8>>2];c[f+376+92+12>>2]=c[d+32+12>>2];g[f+16+308>>2]=9.999999747378752e-05;a[f+16+332>>0]=0;c[f>>2]=5276;c[f+4>>2]=f+16;c[f+8>>2]=f+488;c[f+12>>2]=f+376;if(fd(f,b+4|0,b+68|0,f+720|0,f+720|0,f+544|0)|0?(h=+g[f+544+164>>2],+g[b+200>>2]>h):0)g[b+200>>2]=h;c[f+376>>2]=7472;e=c[f+376+56>>2]|0;if(!e){l=f;return}Ib[c[c[e>>2]>>2]&511](e);e=c[f+376+56>>2]|0;if(!e){l=f;return}c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);l=f;return}function Gf(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;i=c[b+4>>2]|0;if((i|0)==(c[b+8>>2]|0)?(h=i|0?i<<1:1,(i|0)<(h|0)):0){if(!h){e=0;g=i}else{c[6995]=(c[6995]|0)+1;e=sc((h*244|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}g=c[b+4>>2]|0}if((g|0)>0){f=0;do{k=e+(f*244|0)|0;j=c[b+12>>2]|0;l=j+(f*244|0)|0;c[k>>2]=c[l>>2];c[k+4>>2]=c[l+4>>2];c[k+8>>2]=c[l+8>>2];c[k+12>>2]=c[l+12>>2];k=j+(f*244|0)+16|0;l=e+(f*244|0)+16|0;c[l>>2]=c[k>>2];c[l+4>>2]=c[k+4>>2];c[l+8>>2]=c[k+8>>2];c[l+12>>2]=c[k+12>>2];l=j+(f*244|0)+32|0;k=e+(f*244|0)+32|0;c[k>>2]=c[l>>2];c[k+4>>2]=c[l+4>>2];c[k+8>>2]=c[l+8>>2];c[k+12>>2]=c[l+12>>2];k=e+(f*244|0)+48|0;l=j+(f*244|0)+48|0;c[k>>2]=c[l>>2];c[k+4>>2]=c[l+4>>2];c[k+8>>2]=c[l+8>>2];c[k+12>>2]=c[l+12>>2];gi(e+(f*244|0)+64|0,j+(f*244|0)+64|0,180)|0;f=f+1|0}while((f|0)!=(g|0))}f=c[b+12>>2]|0;if(f|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=e;c[b+8>>2]=h;e=c[b+4>>2]|0}else e=i;c[b+4>>2]=e+1;l=c[b+12>>2]|0;c[l+(i*244|0)>>2]=c[d>>2];c[l+(i*244|0)+4>>2]=c[d+4>>2];c[l+(i*244|0)+8>>2]=c[d+8>>2];c[l+(i*244|0)+12>>2]=c[d+12>>2];c[l+(i*244|0)+16>>2]=c[d+16>>2];c[l+(i*244|0)+16+4>>2]=c[d+16+4>>2];c[l+(i*244|0)+16+8>>2]=c[d+16+8>>2];c[l+(i*244|0)+16+12>>2]=c[d+16+12>>2];c[l+(i*244|0)+32>>2]=c[d+32>>2];c[l+(i*244|0)+32+4>>2]=c[d+32+4>>2];c[l+(i*244|0)+32+8>>2]=c[d+32+8>>2];c[l+(i*244|0)+32+12>>2]=c[d+32+12>>2];c[l+(i*244|0)+48>>2]=c[d+48>>2];c[l+(i*244|0)+48+4>>2]=c[d+48+4>>2];c[l+(i*244|0)+48+8>>2]=c[d+48+8>>2];c[l+(i*244|0)+48+12>>2]=c[d+48+12>>2];gi(l+(i*244|0)+64|0,d+64|0,180)|0;return (c[b+12>>2]|0)+(i*244|0)|0}function Hf(a,b,e){a=a|0;b=b|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0;fi(a,b,e)|0;c[b+52>>2]=c[a+552>>2];c[b+56>>2]=c[a+556>>2];c[b+60>>2]=c[a+560>>2];c[b+64>>2]=c[a+564>>2];c[b+68>>2]=c[a+568>>2];c[b+72>>2]=c[a+572>>2];c[b+76>>2]=c[a+576>>2];c[b+80>>2]=c[a+580>>2];c[b+84>>2]=c[a+584>>2];c[b+88>>2]=c[a+588>>2];c[b+92>>2]=c[a+592>>2];c[b+96>>2]=c[a+596>>2];c[b+100>>2]=c[a+600>>2];c[b+104>>2]=c[a+604>>2];c[b+108>>2]=c[a+608>>2];c[b+112>>2]=c[a+612>>2];c[b+116>>2]=c[a+616>>2];c[b+120>>2]=c[a+620>>2];c[b+124>>2]=c[a+624>>2];c[b+128>>2]=c[a+628>>2];c[b+132>>2]=c[a+632>>2];c[b+136>>2]=c[a+636>>2];c[b+140>>2]=c[a+640>>2];c[b+144>>2]=c[a+644>>2];c[b+148>>2]=c[a+648>>2];c[b+152>>2]=c[a+652>>2];c[b+156>>2]=c[a+656>>2];c[b+160>>2]=c[a+660>>2];c[b+164>>2]=c[a+664>>2];c[b+168>>2]=c[a+668>>2];c[b+172>>2]=c[a+672>>2];c[b+176>>2]=c[a+676>>2];c[b+184>>2]=d[a+736>>0];c[b+188>>2]=d[a+737>>0];c[b+196>>2]=c[a+684>>2];c[b+192>>2]=c[a+680>>2];c[b+180>>2]=d[a+740>>0];h=+g[a+688>>2];i=+g[a+692>>2];f=+mh(h-i,6.2831854820251465);if(!(f<-3.1415927410125732)){if(f>3.1415927410125732)f=f+-6.2831854820251465}else f=f+6.2831854820251465;g[b+200>>2]=f;f=+mh(h+i,6.2831854820251465);if(f<-3.1415927410125732){i=f+6.2831854820251465;e=b+204|0;g[e>>2]=i;e=a+696|0;e=c[e>>2]|0;j=b+208|0;c[j>>2]=e;j=a+700|0;j=c[j>>2]|0;e=b+212|0;c[e>>2]=j;a=a+704|0;a=c[a>>2]|0;b=b+216|0;c[b>>2]=a;return 12693}if(!(f>3.1415927410125732)){i=f;j=b+204|0;g[j>>2]=i;j=a+696|0;j=c[j>>2]|0;e=b+208|0;c[e>>2]=j;e=a+700|0;e=c[e>>2]|0;j=b+212|0;c[j>>2]=e;a=a+704|0;a=c[a>>2]|0;j=b+216|0;c[j>>2]=a;return 12693}i=f+-6.2831854820251465;j=b+204|0;g[j>>2]=i;j=a+696|0;j=c[j>>2]|0;e=b+208|0;c[e>>2]=j;e=a+700|0;e=c[e>>2]|0;j=b+212|0;c[j>>2]=e;a=a+704|0;a=c[a>>2]|0;j=b+216|0;c[j>>2]=a;return 12693}function If(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0;k=l;l=l+64|0;n=+g[a+20>>2];u=+g[a+40>>2];p=+g[a+24>>2];s=+g[a+36>>2];t=+g[a+32>>2];m=+g[a+16>>2];j=+g[a>>2];i=+g[a+4>>2];q=+g[a+8>>2];h=1.0/((n*u-p*s)*j+i*(p*t-u*m)+(s*m-n*t)*q);z=+g[b>>2];y=+g[b+4>>2];A=+g[b+8>>2];x=+g[b+16>>2];w=+g[b+20>>2];v=+g[b+24>>2];r=+g[b+32>>2];o=+g[b+36>>2];f=+g[b+40>>2];g[k+16>>2]=A*(s*m-n*t)*h+(z*(n*u-p*s)*h+y*(p*t-u*m)*h);g[k+16+4>>2]=A*(t*i-s*j)*h+(z*(s*q-u*i)*h+y*(u*j-t*q)*h);g[k+16+8>>2]=A*(n*j-m*i)*h+(z*(p*i-n*q)*h+y*(m*q-p*j)*h);g[k+16+12>>2]=0.0;g[k+16+16>>2]=(n*u-p*s)*h*x+(p*t-u*m)*h*w+(s*m-n*t)*h*v;g[k+16+20>>2]=(s*q-u*i)*h*x+(u*j-t*q)*h*w+(t*i-s*j)*h*v;g[k+16+24>>2]=(p*i-n*q)*h*x+(m*q-p*j)*h*w+(n*j-m*i)*h*v;g[k+16+28>>2]=0.0;g[k+16+32>>2]=(n*u-p*s)*h*r+(p*t-u*m)*h*o+(s*m-n*t)*h*f;g[k+16+36>>2]=(s*q-u*i)*h*r+(u*j-t*q)*h*o+(t*i-s*j)*h*f;g[k+16+40>>2]=(p*i-n*q)*h*r+(m*q-p*j)*h*o+(n*j-m*i)*h*f;g[k+16+44>>2]=0.0;yh(k+16|0,k);f=+g[k>>2];h=+g[k+4>>2];i=+g[k+8>>2];m=+g[k+12>>2];j=1.0/+D(+(f*f+h*h+i*i+m*m));g[k>>2]=f*j;g[k+4>>2]=h*j;g[k+8>>2]=i*j;g[k+12>>2]=m*j;m=m*j<-1.0?-1.0:m*j;g[e>>2]=+I(+(m>1.0?1.0:m))*2.0;g[d>>2]=f*j;g[d+4>>2]=h*j;g[d+8>>2]=i*j;g[d+12>>2]=0.0;if(f*j*f*j+h*j*h*j+i*j*i*j<1.4210854715202004e-14){c[d>>2]=1065353216;c[d+4>>2]=0;c[d+8>>2]=0;g[d+12>>2]=0.0;l=k;return}else{A=1.0/+D(+(f*j*f*j+h*j*h*j+i*j*i*j));g[d>>2]=f*j*A;g[d+4>>2]=A*h*j;g[d+8>>2]=A*i*j;l=k;return}}function Jf(a,b,d){a=a|0;b=+b;d=+d;var e=0.0,f=0,h=0,i=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0.0;v=c[a+892>>2]|0;if((v|0)<=0)return;q=c[a+900>>2]|0;a=0;do{u=c[q+(a*56|0)>>2]|0;j=c[q+(a*56|0)+4>>2]|0;y=c[j+8>>2]|0;x=c[j+12>>2]|0;w=c[j+16>>2]|0;f=q+(a*56|0)+8|0;s=+g[f>>2];h=q+(a*56|0)+12|0;r=+g[h>>2];i=q+(a*56|0)+16|0;p=+g[i>>2];b=+g[y+8>>2]*s+ +g[x+8>>2]*r+ +g[w+8>>2]*p;d=+g[y+12>>2]*s+ +g[x+12>>2]*r+ +g[w+12>>2]*p;e=+g[y+16>>2]*s+ +g[x+16>>2]*r+ +g[w+16>>2]*p;k=+g[u+8>>2];l=+g[u+12>>2];m=+g[u+16>>2];n=k-+g[u+24>>2]-(b-(s*+g[y+24>>2]+r*+g[x+24>>2]+p*+g[w+24>>2]));o=l-+g[u+28>>2]-(d-(s*+g[y+28>>2]+r*+g[x+28>>2]+p*+g[w+28>>2]));p=m-+g[u+32>>2]-(e-(s*+g[y+32>>2]+r*+g[x+32>>2]+p*+g[w+32>>2]));r=+g[q+(a*56|0)+24>>2];s=+g[q+(a*56|0)+28>>2];t=+g[q+(a*56|0)+32>>2];if(n*r+o*s+p*t<0.0){e=+g[q+(a*56|0)+40>>2]-(k*r+l*s+m*t-(b*r+d*s+e*t));b=r*e+0.0;d=s*e+0.0;e=t*e+0.0}else{b=0.0;d=0.0;e=0.0}z=+g[q+(a*56|0)+44>>2];b=b-z*(n-r*(n*r+o*s+p*t));d=d-z*(o-s*(n*r+o*s+p*t));s=e-z*(p-t*(n*r+o*s+p*t));t=+g[q+(a*56|0)+48>>2];g[u+8>>2]=k+t*b;g[u+12>>2]=l+t*d;g[u+16>>2]=t*s+m;y=q+(a*56|0)+52|0;t=+g[y>>2]*+g[f>>2];x=c[j+8>>2]|0;g[x+8>>2]=+g[x+8>>2]-b*t;g[x+12>>2]=+g[x+12>>2]-d*t;g[x+16>>2]=+g[x+16>>2]-s*t;t=+g[y>>2]*+g[h>>2];x=c[j+12>>2]|0;g[x+8>>2]=+g[x+8>>2]-b*t;g[x+12>>2]=+g[x+12>>2]-d*t;g[x+16>>2]=+g[x+16>>2]-s*t;t=+g[y>>2]*+g[i>>2];y=c[j+16>>2]|0;g[y+8>>2]=+g[y+8>>2]-b*t;g[y+12>>2]=+g[y+12>>2]-d*t;g[y+16>>2]=+g[y+16>>2]-s*t;a=a+1|0}while((a|0)!=(v|0));return}function Kf(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;k=c[b+12>>2]|0;l=c[b+32>>2]|0;if((l|0)>=(k|0))return;if((c[b+36>>2]|0)<(k|0)){if(!k){d=0;f=l}else{c[6995]=(c[6995]|0)+1;d=sc((k<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=c[b+32>>2]|0}g=c[b+40>>2]|0;if((f|0)<=0)if(!g)e=b+44|0;else j=12;else{e=0;do{c[d+(e<<2)>>2]=c[g+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0));j=12}if((j|0)==12)if(!(a[b+44>>0]|0))e=b+44|0;else{c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);e=b+44|0}a[e>>0]=1;c[b+40>>2]=d;c[b+36>>2]=k;i=b+40|0}else{i=b+40|0;d=c[b+40>>2]|0}Yk(d+(l<<2)|0,0,(k<<2)-(l<<2)|0)|0;c[b+32>>2]=k;h=c[b+52>>2]|0;if((h|0)<(k|0)){if((c[b+56>>2]|0)<(k|0)){if(!k){d=0;f=h}else{c[6995]=(c[6995]|0)+1;d=sc((k<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=c[b+52>>2]|0}g=c[b+60>>2]|0;if((f|0)<=0)if(!g)e=b+64|0;else j=26;else{e=0;do{c[d+(e<<2)>>2]=c[g+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0));j=26}if((j|0)==26)if(!(a[b+64>>0]|0))e=b+64|0;else{c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);e=b+64|0}a[e>>0]=1;c[b+60>>2]=d;c[b+56>>2]=k}else d=c[b+60>>2]|0;Yk(d+(h<<2)|0,0,(k<<2)-(h<<2)|0)|0}c[b+52>>2]=k;if((k|0)>0){Yk(c[i>>2]|0,-1,k<<2|0)|0;Yk(c[b+60>>2]|0,-1,k<<2|0)|0}if((l|0)<=0)return;g=c[b+16>>2]|0;e=c[i>>2]|0;f=c[b+60>>2]|0;d=0;do{k=c[(c[g+(d<<4)+4>>2]|0)+12>>2]<<16|c[(c[g+(d<<4)>>2]|0)+12>>2];k=((k+~(k<<15)|0)>>>10^k+~(k<<15))*9|0;k=e+(((((k>>>6^k)+~((k>>>6^k)<<11)|0)>>>16^(k>>>6^k)+~((k>>>6^k)<<11))&(c[b+12>>2]|0)+-1)<<2)|0;c[f+(d<<2)>>2]=c[k>>2];c[k>>2]=d;d=d+1|0}while((d|0)!=(l|0));return}function Lf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0;f=l;l=l+256|0;c[f+32>>2]=4276;k=f+32+36|0;c[k>>2]=c[b>>2];c[k+4>>2]=c[b+4>>2];c[k+8>>2]=c[b+8>>2];c[k+12>>2]=c[b+12>>2];m=f+32+52|0;c[m>>2]=c[d>>2];c[m+4>>2]=c[d+4>>2];c[m+8>>2]=c[d+8>>2];c[m+12>>2]=c[d+12>>2];c[f+32+212>>2]=a;c[f+32+216>>2]=e;c[f+32+68>>2]=1065353216;c[f+32+72>>2]=0;c[f+32+72+4>>2]=0;c[f+32+72+8>>2]=0;c[f+32+72+12>>2]=0;c[f+32+88>>2]=1065353216;c[f+32+92>>2]=0;c[f+32+92+4>>2]=0;c[f+32+92+8>>2]=0;c[f+32+92+12>>2]=0;c[f+32+108>>2]=1065353216;c[f+32+112>>2]=0;c[f+32+116>>2]=c[k>>2];c[f+32+116+4>>2]=c[k+4>>2];c[f+32+116+8>>2]=c[k+8>>2];c[f+32+116+12>>2]=c[k+12>>2];c[f+32+132>>2]=1065353216;c[f+32+136>>2]=0;c[f+32+136+4>>2]=0;c[f+32+136+8>>2]=0;c[f+32+136+12>>2]=0;c[f+32+152>>2]=1065353216;c[f+32+156>>2]=0;c[f+32+156+4>>2]=0;c[f+32+156+8>>2]=0;c[f+32+156+12>>2]=0;c[f+32+172>>2]=1065353216;c[f+32+176>>2]=0;c[f+32+180>>2]=c[d>>2];c[f+32+180+4>>2]=c[d+4>>2];c[f+32+180+8>>2]=c[d+8>>2];c[f+32+180+12>>2]=c[d+12>>2];n=+g[d>>2]-+g[b>>2];j=+g[d+4>>2]-+g[b+4>>2];i=+g[d+8>>2]-+g[b+8>>2];h=1.0/+D(+(n*n+j*j+i*i));q=n*h==0.0?1000000015047466219876688.0e6:1.0/(n*h);g[f+32+4>>2]=q;p=j*h==0.0?1000000015047466219876688.0e6:1.0/(j*h);g[f+32+8>>2]=p;o=i*h==0.0?1000000015047466219876688.0e6:1.0/(i*h);g[f+32+12>>2]=o;c[f+32+20>>2]=q<0.0&1;c[f+32+24>>2]=p<0.0&1;c[f+32+28>>2]=o<0.0&1;g[f+32+32>>2]=n*h*(+g[m>>2]-+g[k>>2])+j*h*(+g[f+32+56>>2]-+g[f+32+40>>2])+i*h*(+g[f+32+60>>2]-+g[f+32+44>>2]);e=c[a+68>>2]|0;a=c[(c[e>>2]|0)+24>>2]|0;c[f+16>>2]=0;c[f+16+4>>2]=0;c[f+16+8>>2]=0;c[f+16+12>>2]=0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;$b[a&7](e,b,d,f+32|0,f+16|0,f);l=f;return}function Mf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;g=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=g;if(g|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;c[b+20>>2]=c[a+76>>2];e=c[a+20>>2]|0;c[b+16>>2]=e;c[b+12>>2]=0;if(!e)return 16280;g=Bb[c[(c[d>>2]|0)+16>>2]&63](d,76,e)|0;e=c[g+8>>2]|0;c[b+12>>2]=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;if((c[b+16>>2]|0)>0){f=0;while(1){h=c[a+28>>2]|0;c[e+72>>2]=c[h+(f*80|0)+72>>2];c[e+64>>2]=zb[c[(c[d>>2]|0)+28>>2]&31](d,c[h+(f*80|0)+64>>2]|0)|0;if(!(zb[c[(c[d>>2]|0)+24>>2]&31](d,c[(c[a+28>>2]|0)+(f*80|0)+64>>2]|0)|0)){h=c[(c[d>>2]|0)+16>>2]|0;i=c[(c[a+28>>2]|0)+(f*80|0)+64>>2]|0;i=xb[c[(c[i>>2]|0)+52>>2]&127](i)|0;i=Bb[h&63](d,i,1)|0;h=c[(c[a+28>>2]|0)+(f*80|0)+64>>2]|0;h=Bb[c[(c[h>>2]|0)+56>>2]&63](h,c[i+8>>2]|0,d)|0;Zb[c[(c[d>>2]|0)+20>>2]&31](d,i,h,1346455635,c[(c[a+28>>2]|0)+(f*80|0)+64>>2]|0)}i=c[a+28>>2]|0;c[e+68>>2]=c[i+(f*80|0)+68>>2];c[e>>2]=c[i+(f*80|0)>>2];c[e+4>>2]=c[i+(f*80|0)+4>>2];c[e+8>>2]=c[i+(f*80|0)+8>>2];c[e+12>>2]=c[i+(f*80|0)+12>>2];c[e+16>>2]=c[i+(f*80|0)+16>>2];c[e+20>>2]=c[i+(f*80|0)+20>>2];c[e+24>>2]=c[i+(f*80|0)+24>>2];c[e+28>>2]=c[i+(f*80|0)+28>>2];c[e+32>>2]=c[i+(f*80|0)+32>>2];c[e+36>>2]=c[i+(f*80|0)+36>>2];c[e+40>>2]=c[i+(f*80|0)+40>>2];c[e+44>>2]=c[i+(f*80|0)+44>>2];c[e+48>>2]=c[i+(f*80|0)+48>>2];c[e+52>>2]=c[i+(f*80|0)+52>>2];c[e+56>>2]=c[i+(f*80|0)+56>>2];c[e+60>>2]=c[i+(f*80|0)+60>>2];f=f+1|0;if((f|0)>=(c[b+16>>2]|0)){e=d;break}else e=e+76|0}}else e=d;Zb[c[(c[e>>2]|0)+20>>2]&31](d,g,16255,1497453121,c[g+8>>2]|0);return 16280}function Nf(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;k=c[b+12>>2]|0;l=c[b+28>>2]|0;if((l|0)>=(k|0))return;if((c[b+32>>2]|0)<(k|0)){if(!k){d=0;f=l}else{c[6995]=(c[6995]|0)+1;d=sc((k<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=c[b+28>>2]|0}g=c[b+36>>2]|0;if((f|0)<=0)if(!g)e=b+40|0;else j=12;else{e=0;do{c[d+(e<<2)>>2]=c[g+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0));j=12}if((j|0)==12)if(!(a[b+40>>0]|0))e=b+40|0;else{c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);e=b+40|0}a[e>>0]=1;c[b+36>>2]=d;c[b+32>>2]=k;i=b+36|0}else{i=b+36|0;d=c[b+36>>2]|0}Yk(d+(l<<2)|0,0,(k<<2)-(l<<2)|0)|0;c[b+28>>2]=k;h=c[b+48>>2]|0;if((h|0)<(k|0)){if((c[b+52>>2]|0)<(k|0)){if(!k){d=0;f=h}else{c[6995]=(c[6995]|0)+1;d=sc((k<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=c[b+48>>2]|0}g=c[b+56>>2]|0;if((f|0)<=0)if(!g)e=b+60|0;else j=26;else{e=0;do{c[d+(e<<2)>>2]=c[g+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0));j=26}if((j|0)==26)if(!(a[b+60>>0]|0))e=b+60|0;else{c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);e=b+60|0}a[e>>0]=1;c[b+56>>2]=d;c[b+52>>2]=k}else d=c[b+56>>2]|0;Yk(d+(h<<2)|0,0,(k<<2)-(h<<2)|0)|0}c[b+48>>2]=k;if((k|0)>0){Yk(c[i>>2]|0,-1,k<<2|0)|0;Yk(c[b+56>>2]|0,-1,k<<2|0)|0}if((l|0)<=0)return;g=c[b+16>>2]|0;e=c[i>>2]|0;f=c[b+56>>2]|0;d=0;do{k=c[g+(d*12|0)+4>>2]<<16|c[g+(d*12|0)>>2];k=((k+~(k<<15)|0)>>>10^k+~(k<<15))*9|0;k=e+(((((k>>>6^k)+~((k>>>6^k)<<11)|0)>>>16^(k>>>6^k)+~((k>>>6^k)<<11))&(c[b+12>>2]|0)+-1)<<2)|0;c[f+(d<<2)>>2]=c[k>>2];c[k>>2]=d;d=d+1|0}while((d|0)!=(l|0));return}function Of(b,d){b=b|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,q=0,r=0;if((c[b+8>>2]|0)>=(d|0))return;if((d|0)!=0?(c[6995]=(c[6995]|0)+1,e=sc((d*36|3)+16|0)|0,(e|0)!=0):0){c[(e+4+15&-16)+-4>>2]=e;r=e+4+15&-16}else r=0;n=c[b+4>>2]|0;if((n|0)>0){m=0;do{o=c[b+12>>2]|0;i=r+(m*36|0)+16|0;a[i>>0]=1;j=r+(m*36|0)+12|0;c[j>>2]=0;l=r+(m*36|0)+4|0;c[l>>2]=0;k=r+(m*36|0)+8|0;c[k>>2]=0;p=c[o+(m*36|0)+4>>2]|0;if((p|0)>0){c[6995]=(c[6995]|0)+1;e=sc((p<<2|3)+16|0)|0;if(!e)f=0;else{c[(e+4+15&-16)+-4>>2]=e;f=e+4+15&-16}g=c[l>>2]|0;h=c[j>>2]|0;if((g|0)<=0){if(h|0)q=13}else{e=0;do{c[f+(e<<2)>>2]=c[h+(e<<2)>>2];e=e+1|0}while((e|0)!=(g|0));q=13}if((q|0)==13?(q=0,a[i>>0]|0):0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}a[i>>0]=1;c[j>>2]=f;c[k>>2]=p;Yk(f|0,0,p<<2|0)|0;g=c[j>>2]|0;c[l>>2]=p;f=c[o+(m*36|0)+12>>2]|0;e=0;do{c[g+(e<<2)>>2]=c[f+(e<<2)>>2];e=e+1|0}while((e|0)!=(p|0))}else c[l>>2]=p;p=r+(m*36|0)+20|0;o=o+(m*36|0)+20|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];m=m+1|0}while((m|0)!=(n|0));f=c[b+4>>2]|0;if((f|0)>0){e=0;do{h=c[b+12>>2]|0;i=h+(e*36|0)+4|0;j=h+(e*36|0)+12|0;k=c[j>>2]|0;g=h+(e*36|0)+16|0;if(k|0){if(a[g>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[j>>2]=0}a[g>>0]=1;c[j>>2]=0;c[i>>2]=0;c[h+(e*36|0)+8>>2]=0;e=e+1|0}while((e|0)!=(f|0))}}e=c[b+12>>2]|0;if(e|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=r;c[b+8>>2]=d;return}function Pf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0;f=l;l=l+256|0;c[f+32>>2]=6004;k=f+32+36|0;c[k>>2]=c[b>>2];c[k+4>>2]=c[b+4>>2];c[k+8>>2]=c[b+8>>2];c[k+12>>2]=c[b+12>>2];m=f+32+52|0;c[m>>2]=c[d>>2];c[m+4>>2]=c[d+4>>2];c[m+8>>2]=c[d+8>>2];c[m+12>>2]=c[d+12>>2];c[f+32+212>>2]=a;c[f+32+216>>2]=e;c[f+32+68>>2]=1065353216;c[f+32+72>>2]=0;c[f+32+72+4>>2]=0;c[f+32+72+8>>2]=0;c[f+32+72+12>>2]=0;c[f+32+88>>2]=1065353216;c[f+32+92>>2]=0;c[f+32+92+4>>2]=0;c[f+32+92+8>>2]=0;c[f+32+92+12>>2]=0;c[f+32+108>>2]=1065353216;c[f+32+112>>2]=0;c[f+32+116>>2]=c[k>>2];c[f+32+116+4>>2]=c[k+4>>2];c[f+32+116+8>>2]=c[k+8>>2];c[f+32+116+12>>2]=c[k+12>>2];c[f+32+132>>2]=1065353216;c[f+32+136>>2]=0;c[f+32+136+4>>2]=0;c[f+32+136+8>>2]=0;c[f+32+136+12>>2]=0;c[f+32+152>>2]=1065353216;c[f+32+156>>2]=0;c[f+32+156+4>>2]=0;c[f+32+156+8>>2]=0;c[f+32+156+12>>2]=0;c[f+32+172>>2]=1065353216;c[f+32+176>>2]=0;c[f+32+180>>2]=c[d>>2];c[f+32+180+4>>2]=c[d+4>>2];c[f+32+180+8>>2]=c[d+8>>2];c[f+32+180+12>>2]=c[d+12>>2];n=+g[d>>2]-+g[b>>2];j=+g[d+4>>2]-+g[b+4>>2];i=+g[d+8>>2]-+g[b+8>>2];h=1.0/+D(+(n*n+j*j+i*i));q=n*h==0.0?999999984306749440.0:1.0/(n*h);g[f+32+4>>2]=q;p=j*h==0.0?999999984306749440.0:1.0/(j*h);g[f+32+8>>2]=p;o=i*h==0.0?999999984306749440.0:1.0/(i*h);g[f+32+12>>2]=o;c[f+32+20>>2]=q<0.0&1;c[f+32+24>>2]=p<0.0&1;c[f+32+28>>2]=o<0.0&1;g[f+32+32>>2]=n*h*(+g[m>>2]-+g[k>>2])+j*h*(+g[f+32+56>>2]-+g[f+32+40>>2])+i*h*(+g[f+32+60>>2]-+g[f+32+44>>2]);e=c[a+68>>2]|0;a=c[(c[e>>2]|0)+24>>2]|0;c[f+16>>2]=0;c[f+16+4>>2]=0;c[f+16+8>>2]=0;c[f+16+12>>2]=0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;$b[a&7](e,b,d,f+32|0,f+16|0,f);l=f;return}function Qf(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;h=l;l=l+128|0;if(!b){l=h;return}if(c[b+40>>2]|0){Qf(a,c[b+36>>2]|0,d+1|0,e,f);Qf(a,c[b+40>>2]|0,d+1|0,e,f)}if((d|0)<0){l=h;return}m=+g[b>>2];r=+g[b+16>>2];j=+g[b+4>>2];q=+g[b+20>>2];i=+g[b+8>>2];p=+g[b+24>>2];k=(m+r)*.5-(r-m)*.5;n=(j+q)*.5-(q-j)*.5;o=(i+p)*.5-(p-i)*.5;m=(m+r)*.5+(r-m)*.5;j=(j+q)*.5+(q-j)*.5;i=(i+p)*.5+(p-i)*.5;f=(c[b+40>>2]|0)==0?f:e;g[h>>2]=k;g[h+4>>2]=n;g[h+8>>2]=o;g[h+12>>2]=0.0;g[h+16>>2]=m;g[h+20>>2]=n;g[h+24>>2]=o;g[h+28>>2]=0.0;g[h+32>>2]=m;g[h+36>>2]=j;g[h+40>>2]=o;g[h+44>>2]=0.0;g[h+48>>2]=k;g[h+52>>2]=j;g[h+56>>2]=o;g[h+60>>2]=0.0;g[h+64>>2]=k;g[h+68>>2]=n;g[h+72>>2]=i;g[h+76>>2]=0.0;g[h+80>>2]=m;g[h+84>>2]=n;g[h+88>>2]=i;g[h+92>>2]=0.0;g[h+96>>2]=m;g[h+100>>2]=j;g[h+104>>2]=i;g[h+108>>2]=0.0;g[h+112>>2]=k;g[h+116>>2]=j;g[h+120>>2]=i;g[h+124>>2]=0.0;Vb[c[(c[a>>2]|0)+16>>2]&127](a,h,h+16|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+16|0,h+32|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+32|0,h+48|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+48|0,h,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+64|0,h+80|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+80|0,h+96|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+96|0,h+112|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+112|0,h+64|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h,h+64|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+16|0,h+80|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+32|0,h+96|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+48|0,h+112|0,f);l=h;return}function Rf(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0;c[b+8>>2]=0;c[b+12>>2]=-1;c[b>>2]=6640;a[b+32>>0]=1;c[b+28>>2]=0;c[b+20>>2]=0;c[b+24>>2]=0;c[b+36>>2]=1566444395;c[b+40>>2]=1566444395;c[b+44>>2]=1566444395;g[b+48>>2]=0.0;c[b+52>>2]=-581039253;c[b+56>>2]=-581039253;c[b+60>>2]=-581039253;g[b+64>>2]=0.0;c[b+68>>2]=0;c[b+72>>2]=1;g[b+76>>2]=0.0;c[b+80>>2]=1065353216;c[b+84>>2]=1065353216;c[b+88>>2]=1065353216;g[b+92>>2]=0.0;c[b+4>>2]=31;if(d){c[6995]=(c[6995]|0)+1;d=sc(59)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}a[d+36>>0]=1;c[d+32>>2]=0;c[d+24>>2]=0;c[d+28>>2]=0;c[d>>2]=0;c[d+4>>2]=0;c[d+8>>2]=-1;c[d+12>>2]=0;c[d+16>>2]=0;c[b+68>>2]=d;d=c[b+24>>2]|0}else d=0;if((d|0)>=(e|0))return;if((e|0)!=0?(c[6995]=(c[6995]|0)+1,f=sc((e*80|3)+16|0)|0,(f|0)!=0):0){c[(f+4+15&-16)+-4>>2]=f;h=f+4+15&-16}else h=0;f=c[b+20>>2]|0;if((f|0)>0){d=0;do{i=h+(d*80|0)|0;j=c[b+28>>2]|0;k=j+(d*80|0)|0;c[i>>2]=c[k>>2];c[i+4>>2]=c[k+4>>2];c[i+8>>2]=c[k+8>>2];c[i+12>>2]=c[k+12>>2];i=j+(d*80|0)+16|0;k=h+(d*80|0)+16|0;c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];k=j+(d*80|0)+32|0;i=h+(d*80|0)+32|0;c[i>>2]=c[k>>2];c[i+4>>2]=c[k+4>>2];c[i+8>>2]=c[k+8>>2];c[i+12>>2]=c[k+12>>2];i=h+(d*80|0)+48|0;k=j+(d*80|0)+48|0;c[i>>2]=c[k>>2];c[i+4>>2]=c[k+4>>2];c[i+8>>2]=c[k+8>>2];c[i+12>>2]=c[k+12>>2];i=h+(d*80|0)+64|0;j=j+(d*80|0)+64|0;c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];d=d+1|0}while((d|0)!=(f|0))}d=c[b+28>>2]|0;if(d|0){if(a[b+32>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+28>>2]=0}a[b+32>>0]=1;c[b+28>>2]=h;c[b+24>>2]=e;return}function Sf(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0;r=l;l=l+96|0;m=r;n=m+96|0;do{c[m>>2]=0;m=m+4|0}while((m|0)<(n|0));if(!i)p=c[c[b+940>>2]>>2]|0;else p=i;i=c[b+832>>2]|0;if((i|0)==(c[b+836>>2]|0)?(q=i|0?i<<1:1,(i|0)<(q|0)):0){if(!q)o=0;else{c[6995]=(c[6995]|0)+1;i=sc((q*104|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}o=i;i=c[b+832>>2]|0}if((i|0)>0){j=0;do{m=o+(j*104|0)|0;k=(c[b+840>>2]|0)+(j*104|0)|0;n=m+104|0;do{c[m>>2]=c[k>>2];m=m+4|0;k=k+4|0}while((m|0)<(n|0));j=j+1|0}while((j|0)!=(i|0))}i=c[b+840>>2]|0;if(i|0){if(a[b+844>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[b+840>>2]=0}a[b+844>>0]=1;c[b+840>>2]=o;c[b+836>>2]=q;i=c[b+832>>2]|0}m=c[b+840>>2]|0;c[m+(i*104|0)>>2]=0;c[m+(i*104|0)+4>>2]=p;m=m+(i*104|0)+8|0;k=r;n=m+96|0;do{c[m>>2]=c[k>>2];m=m+4|0;k=k+4|0}while((m|0)<(n|0));q=c[b+832>>2]|0;c[b+832>>2]=q+1;p=c[b+840>>2]|0;k=c[b+780>>2]|0;c[p+(q*104|0)+8>>2]=k+(d*104|0);o=c[b+780>>2]|0;c[p+(q*104|0)+12>>2]=o+(e*104|0);m=c[b+780>>2]|0;c[p+(q*104|0)+16>>2]=m+(f*104|0);n=c[b+780>>2]|0;c[p+(q*104|0)+20>>2]=n+(h*104|0);z=+g[k+(d*104|0)+8>>2];w=+g[k+(d*104|0)+12>>2];A=+g[k+(d*104|0)+16>>2];t=+g[m+(f*104|0)+8>>2]-z;y=+g[m+(f*104|0)+12>>2]-w;v=+g[m+(f*104|0)+16>>2]-A;u=+g[n+(h*104|0)+8>>2]-z;x=+g[n+(h*104|0)+12>>2]-w;s=+g[n+(h*104|0)+16>>2]-A;g[p+(q*104|0)+24>>2]=(+g[o+(e*104|0)+16>>2]-A)*(t*x-y*u)+((+g[o+(e*104|0)+8>>2]-z)*(y*s-v*x)+(+g[o+(e*104|0)+12>>2]-w)*(v*u-t*s));a[b+984>>0]=1;l=r;return}function Tf(b){b=b|0;var d=0;c[b>>2]=5052;d=c[b+204>>2]|0;if(d|0){if(a[b+208>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+204>>2]=0}a[b+208>>0]=1;c[b+204>>2]=0;c[b+196>>2]=0;c[b+200>>2]=0;d=c[b+176>>2]|0;if(d|0){if(a[b+180>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+176>>2]=0}a[b+180>>0]=1;c[b+176>>2]=0;c[b+168>>2]=0;c[b+172>>2]=0;d=c[b+156>>2]|0;if(d|0){if(a[b+160>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+156>>2]=0}a[b+160>>0]=1;c[b+156>>2]=0;c[b+148>>2]=0;c[b+152>>2]=0;d=c[b+136>>2]|0;if(d|0){if(a[b+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+136>>2]=0}a[b+140>>0]=1;c[b+136>>2]=0;c[b+128>>2]=0;c[b+132>>2]=0;d=c[b+116>>2]|0;if(d|0){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+116>>2]=0}a[b+120>>0]=1;c[b+116>>2]=0;c[b+108>>2]=0;c[b+112>>2]=0;d=c[b+96>>2]|0;if(d|0){if(a[b+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+96>>2]=0}a[b+100>>0]=1;c[b+96>>2]=0;c[b+88>>2]=0;c[b+92>>2]=0;d=c[b+76>>2]|0;if(d|0){if(a[b+80>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+76>>2]=0}a[b+80>>0]=1;c[b+76>>2]=0;c[b+68>>2]=0;c[b+72>>2]=0;d=c[b+56>>2]|0;if(d|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;d=c[b+36>>2]|0;if(d|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;d=c[b+16>>2]|0;if(!d){a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}function Uf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0.0,p=0;k=l;l=l+160|0;i=c[b+12>>2]|0;if(!i){l=k;return}m=(a[b+16>>0]|0)!=0;n=m?e:d;e=m?d:e;p=c[n+4>>2]|0;d=c[e+4>>2]|0;c[h+4>>2]=i;o=+g[i+784>>2]+ +g[h+32>>2];c[k+136>>2]=9648;c[k+136+4>>2]=p;c[k+136+8>>2]=d;g[k+136+12>>2]=o;g[k+128>>2]=999999984306749440.0;i=c[n+12>>2]|0;c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];c[k+16>>2]=c[i+16>>2];c[k+16+4>>2]=c[i+16+4>>2];c[k+16+8>>2]=c[i+16+8>>2];c[k+16+12>>2]=c[i+16+12>>2];c[k+32>>2]=c[i+32>>2];c[k+32+4>>2]=c[i+32+4>>2];c[k+32+8>>2]=c[i+32+8>>2];c[k+32+12>>2]=c[i+32+12>>2];c[k+48>>2]=c[i+48>>2];c[k+48+4>>2]=c[i+48+4>>2];c[k+48+8>>2]=c[i+48+8>>2];c[k+48+12>>2]=c[i+48+12>>2];i=c[e+12>>2]|0;c[k+64>>2]=c[i>>2];c[k+64+4>>2]=c[i+4>>2];c[k+64+8>>2]=c[i+8>>2];c[k+64+12>>2]=c[i+12>>2];c[k+80>>2]=c[i+16>>2];c[k+80+4>>2]=c[i+16+4>>2];c[k+80+8>>2]=c[i+16+8>>2];c[k+80+12>>2]=c[i+16+12>>2];c[k+96>>2]=c[i+32>>2];c[k+96+4>>2]=c[i+32+4>>2];c[k+96+8>>2]=c[i+32+8>>2];c[k+96+12>>2]=c[i+32+12>>2];c[k+112>>2]=c[i+48>>2];c[k+112+4>>2]=c[i+48+4>>2];c[k+112+8>>2]=c[i+48+8>>2];c[k+112+12>>2]=c[i+48+12>>2];Xd(k+136|0,k,h,c[f+20>>2]|0,m);do if(a[b+8>>0]|0?(j=c[h+4>>2]|0,c[j+780>>2]|0):0){d=c[j+772>>2]|0;e=c[(c[h+8>>2]|0)+8>>2]|0;b=c[(c[h+12>>2]|0)+8>>2]|0;if((d|0)==(e|0)){af(j,d+4|0,b+4|0);break}else{af(j,b+4|0,e+4|0);break}}while(0);l=k;return}function Vf(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0;d=c[a+812>>2]|0;if((d|0)>0){e=c[a+820>>2]|0;b=0;do{f=c[e+(b*44|0)+8>>2]|0;h=c[e+(b*44|0)+12>>2]|0;i=c[e+(b*44|0)+16>>2]|0;l=+g[f+8>>2];n=+g[f+12>>2];j=+g[f+16>>2];k=+g[h+8>>2]-l;o=+g[h+12>>2]-n;m=+g[h+16>>2]-j;l=+g[i+8>>2]-l;n=+g[i+12>>2]-n;j=+g[i+16>>2]-j;g[e+(b*44|0)+36>>2]=+D(+((k*n-o*l)*(k*n-o*l)+((o*j-m*n)*(o*j-m*n)+(m*l-k*j)*(m*l-k*j))));b=b+1|0}while((b|0)!=(d|0))}d=c[a+772>>2]|0;if((d|0)>0){c[6995]=(c[6995]|0)+1;b=sc((d<<2|3)+16|0)|0;if(!b)e=0;else{c[(b+4+15&-16)+-4>>2]=b;e=b+4+15&-16}Yk(e|0,0,d<<2|0)|0;f=c[a+772>>2]|0;if((f|0)>0){d=c[a+780>>2]|0;b=0;do{g[d+(b*104|0)+92>>2]=0.0;b=b+1|0}while((b|0)!=(f|0));i=e;h=e;b=f}else{i=e;h=e;b=f}}else{i=0;h=0;b=d}f=c[a+812>>2]|0;if((f|0)>0){d=c[a+820>>2]|0;e=c[a+780>>2]|0;b=0;do{o=+C(+(+g[d+(b*44|0)+36>>2]));p=c[d+(b*44|0)+8>>2]|0;q=i+(((p-e|0)/104|0)<<2)|0;c[q>>2]=(c[q>>2]|0)+1;g[p+92>>2]=o+ +g[p+92>>2];p=c[d+(b*44|0)+12>>2]|0;q=i+(((p-e|0)/104|0)<<2)|0;c[q>>2]=(c[q>>2]|0)+1;g[p+92>>2]=o+ +g[p+92>>2];p=c[d+(b*44|0)+16>>2]|0;q=i+(((p-e|0)/104|0)<<2)|0;c[q>>2]=(c[q>>2]|0)+1;g[p+92>>2]=o+ +g[p+92>>2];b=b+1|0}while((b|0)!=(f|0));b=c[a+772>>2]|0}if((b|0)>0){d=0;do{e=c[i+(d<<2)>>2]|0;if((e|0)>0){q=(c[a+780>>2]|0)+(d*104|0)+92|0;g[q>>2]=+g[q>>2]/+(e|0)}else g[(c[a+780>>2]|0)+(d*104|0)+92>>2]=0.0;d=d+1|0}while((d|0)!=(b|0));if(!h)return}else if((i|0)==0|(h|0)==0)return;c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);return}function Wf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0;d=l;l=l+128|0;F=c[(c[a+8>>2]|0)+28>>2]|0;f=c[F+(b*80|0)+64>>2]|0;e=c[a+12>>2]|0;w=+g[F+(b*80|0)>>2];C=+g[e>>2];v=+g[F+(b*80|0)+16>>2];B=+g[e+4>>2];u=+g[F+(b*80|0)+32>>2];A=+g[e+8>>2];t=+g[F+(b*80|0)+4>>2];s=+g[F+(b*80|0)+20>>2];r=+g[F+(b*80|0)+36>>2];q=+g[F+(b*80|0)+8>>2];o=+g[F+(b*80|0)+24>>2];m=+g[F+(b*80|0)+40>>2];z=+g[e+16>>2];y=+g[e+20>>2];x=+g[e+24>>2];p=+g[e+32>>2];n=+g[e+36>>2];k=+g[e+40>>2];E=+g[F+(b*80|0)+48>>2];D=+g[F+(b*80|0)+52>>2];h=+g[F+(b*80|0)+56>>2];j=+g[e+48>>2]+(C*E+B*D+A*h);i=z*E+y*D+x*h+ +g[e+52>>2];h=p*E+n*D+k*h+ +g[e+56>>2];g[d+56>>2]=w*C+v*B+u*A;g[d+56+4>>2]=C*t+B*s+A*r;g[d+56+8>>2]=C*q+B*o+A*m;g[d+56+12>>2]=0.0;g[d+56+16>>2]=w*z+v*y+u*x;g[d+56+20>>2]=t*z+s*y+r*x;g[d+56+24>>2]=q*z+o*y+m*x;g[d+56+28>>2]=0.0;g[d+56+32>>2]=w*p+v*n+u*k;g[d+56+36>>2]=t*p+s*n+r*k;g[d+56+40>>2]=q*p+o*n+m*k;g[d+56+44>>2]=0.0;g[d+56+48>>2]=j;g[d+56+52>>2]=i;g[d+56+56>>2]=h;g[d+56+60>>2]=0.0;e=c[a+4>>2]|0;c[d+32>>2]=0;c[d+32+4>>2]=f;c[d+32+8>>2]=e;c[d+32+12>>2]=d+56;c[d+32+16>>2]=-1;c[d+32+20>>2]=b;e=c[a+24>>2]|0;g[d+4>>2]=1.0;c[d+8>>2]=0;c[d+12>>2]=1;c[d+16>>2]=-1;c[d+20>>2]=0;c[d>>2]=6108;c[d+24>>2]=e;c[d+28>>2]=b;c[d+4>>2]=c[e+4>>2];c[d+20>>2]=c[e+20>>2];ad(c[a+16>>2]|0,c[a+20>>2]|0,d+32|0,d);l=d;return}function Xf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0;i=l;l=l+80|0;h=+nb[c[(c[a>>2]|0)+48>>2]&15](a);f=0;do{q=i+64+(f<<2)|0;c[i+64>>2]=0;c[i+64+4>>2]=0;c[i+64+8>>2]=0;c[i+64+12>>2]=0;g[q>>2]=1.0;j=c[(c[a>>2]|0)+64>>2]|0;k=+g[i+64>>2];m=+g[i+64+4>>2];n=+g[i+64+8>>2];o=k*+g[b+4>>2]+m*+g[b+20>>2]+n*+g[b+36>>2];p=k*+g[b+8>>2]+m*+g[b+24>>2]+n*+g[b+40>>2];g[i+32>>2]=+g[b>>2]*k+ +g[b+16>>2]*m+ +g[b+32>>2]*n;g[i+32+4>>2]=o;g[i+32+8>>2]=p;g[i+32+12>>2]=0.0;Sb[j&127](i+48|0,a,i+32|0);p=+g[i+48>>2];o=+g[i+48+4>>2];n=+g[i+48+8>>2];m=p*+g[b+16>>2]+o*+g[b+20>>2]+n*+g[b+24>>2]+ +g[b+52>>2];k=p*+g[b+32>>2]+o*+g[b+36>>2]+n*+g[b+40>>2]+ +g[b+56>>2];g[i+32>>2]=p*+g[b>>2]+o*+g[b+4>>2]+n*+g[b+8>>2]+ +g[b+48>>2];g[i+32+4>>2]=m;g[i+32+8>>2]=k;g[i+32+12>>2]=0.0;j=i+32+(f<<2)|0;g[e+(f<<2)>>2]=h+ +g[j>>2];g[q>>2]=-1.0;q=c[(c[a>>2]|0)+64>>2]|0;k=+g[i+64>>2];m=+g[i+64+4>>2];n=+g[i+64+8>>2];o=k*+g[b+4>>2]+m*+g[b+20>>2]+n*+g[b+36>>2];p=k*+g[b+8>>2]+m*+g[b+24>>2]+n*+g[b+40>>2];g[i>>2]=+g[b>>2]*k+ +g[b+16>>2]*m+ +g[b+32>>2]*n;g[i+4>>2]=o;g[i+8>>2]=p;g[i+12>>2]=0.0;Sb[q&127](i+16|0,a,i);p=+g[i+16>>2];o=+g[i+16+4>>2];n=+g[i+16+8>>2];m=p*+g[b+16>>2]+o*+g[b+20>>2]+n*+g[b+24>>2]+ +g[b+52>>2];k=p*+g[b+32>>2]+o*+g[b+36>>2]+n*+g[b+40>>2]+ +g[b+56>>2];g[i+32>>2]=p*+g[b>>2]+o*+g[b+4>>2]+n*+g[b+8>>2]+ +g[b+48>>2];g[i+32+4>>2]=m;g[i+32+8>>2]=k;g[i+32+12>>2]=0.0;g[d+(f<<2)>>2]=+g[j>>2]-h;f=f+1|0}while((f|0)!=3);l=i;return}function Yf(b,d,e,f,g,h,i,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0;m=l;l=l+48|0;c[6995]=(c[6995]|0)+1;f=sc(83)|0;if(!f)k=0;else{c[(f+4+15&-16)+-4>>2]=f;k=f+4+15&-16}c[k>>2]=g;c[k+4>>2]=h;c[k+8>>2]=i;h=k+16|0;c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];h=k+32|0;c[h>>2]=c[e>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];c[h+12>>2]=c[e+12>>2];h=k+56|0;c[h>>2]=0;i=k+52|0;c[i>>2]=0;c[m+16>>2]=c[d>>2];c[m+16+4>>2]=c[d+4>>2];c[m+16+8>>2]=c[d+8>>2];c[m+16+12>>2]=c[d+12>>2];c[m+16+16>>2]=c[e>>2];c[m+16+16+4>>2]=c[e+4>>2];c[m+16+16+8>>2]=c[e+8>>2];c[m+16+16+12>>2]=c[e+12>>2];c[k+60>>2]=c[b+104>>2];f=(c[b+148>>2]|0)+1|0;c[b+148>>2]=f;c[k+12>>2]=f;f=c[b+8>>2]|0;if(!f){c[6995]=(c[6995]|0)+1;f=sc(63)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=f;g=j+44|0;do{c[j>>2]=0;j=j+4|0}while((j|0)<(g|0))}else c[b+8>>2]=0;c[f+32>>2]=0;c[f+36>>2]=k;c[f+40>>2]=0;c[f>>2]=c[m+16>>2];c[f+4>>2]=c[m+16+4>>2];c[f+8>>2]=c[m+16+8>>2];c[f+12>>2]=c[m+16+12>>2];c[f+16>>2]=c[m+16+16>>2];c[f+20>>2]=c[m+16+20>>2];c[f+24>>2]=c[m+16+24>>2];c[f+28>>2]=c[m+16+28>>2];Pe(b+4|0,c[b+4>>2]|0,f);c[b+16>>2]=(c[b+16>>2]|0)+1;c[k+48>>2]=f;j=b+84+(c[b+104>>2]<<2)|0;c[i>>2]=0;c[h>>2]=c[j>>2];f=c[j>>2]|0;if(f|0)c[f+52>>2]=k;c[j>>2]=k;if(a[b+153>>0]|0){l=m;return k|0}c[m>>2]=9248;c[m+4>>2]=b;c[m+8>>2]=k;Bf(c[b+4>>2]|0,m+16|0,m);Bf(c[b+44>>2]|0,m+16|0,m);l=m;return k|0}function Zf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=+h;var i=0,j=0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0;C=l;l=l+96|0;n=+g[e+4>>2];o=+g[e+20>>2];p=+g[e+36>>2];q=+g[e+8>>2];r=+g[e+24>>2];s=+g[e+40>>2];t=+g[e+12>>2];u=+g[e+28>>2];v=+g[e+44>>2];w=-+g[e+52>>2];x=-+g[e+56>>2];y=-+g[e+60>>2];k=c[b+780>>2]|0;z=+g[k+(d*104|0)+8>>2];A=+g[k+(d*104|0)+12>>2];B=+g[k+(d*104|0)+16>>2];a:do if(f){f=c[b+328>>2]|0;b:do if((f|0)>0){j=c[b+336>>2]|0;i=0;while(1){if((c[j+(i<<2)>>2]|0)==(e|0))break;i=i+1|0;if((i|0)>=(f|0))break b}if((i|0)!=(f|0)){f=k;break a}}while(0);if((f|0)==(c[b+332>>2]|0)?(m=f|0?f<<1:1,(f|0)<(m|0)):0){if(!m)j=0;else{c[6995]=(c[6995]|0)+1;f=sc((m<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=f;f=c[b+328>>2]|0}if((f|0)>0){i=0;do{c[j+(i<<2)>>2]=c[(c[b+336>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(f|0))}i=c[b+336>>2]|0;if(i){if(a[b+340>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);f=c[b+328>>2]|0}c[b+336>>2]=0}a[b+340>>0]=1;c[b+336>>2]=j;c[b+332>>2]=m}c[(c[b+336>>2]|0)+(f<<2)>>2]=e;c[b+328>>2]=f+1;f=c[b+780>>2]|0}else f=k;while(0);c[C>>2]=f+(d*104|0);c[C+20>>2]=e;g[C+4>>2]=n*w+o*x+p*y+(n*z+o*A+p*B);g[C+8>>2]=q*w+r*x+s*y+(q*z+r*A+s*B);g[C+12>>2]=t*w+u*x+v*y+(t*z+u*A+v*B);g[C+16>>2]=0.0;e=f+(d*104|0)+100|0;a[e>>0]=a[e>>0]|1;g[C+24>>2]=h;Ln(b+848|0,C);l=C;return}function _f(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0,H=0.0,I=0;I=l;l=l+32|0;j=+g[b+16>>2];f=+g[b>>2];k=+g[b+20>>2];h=+g[b+4>>2];n=+g[b+24>>2];i=+g[b+8>>2];r=+g[b+32>>2];v=+g[b+36>>2];w=+g[b+40>>2];B=(k-h)*(w-i)-(n-i)*(v-h);C=(n-i)*(r-f)-(j-f)*(w-i);E=(j-f)*(v-h)-(k-h)*(r-f);g[I+16>>2]=B;g[I+16+4>>2]=C;g[I+16+8>>2]=E;g[I+16+12>>2]=0.0;o=+g[a+4>>2];s=+g[a+8>>2];x=+g[a+12>>2];F=B*o+C*s+E*x-(f*B+h*C+i*E);p=+g[a+20>>2];t=+g[a+24>>2];y=+g[a+28>>2];if(F*(B*p+C*t+E*y-(f*B+h*C+i*E))>=0.0){l=I;return}G=c[a+36>>2]|0;if(F<=0.0&(G&1|0)!=0){l=I;return}H=F/(F-(B*p+C*t+E*y-(f*B+h*C+i*E)));if(!(H<+g[a+40>>2])){l=I;return}A=(B*B+C*C+E*E)*-9.999999747378752e-05;z=f-(p*H+o*(1.0-H));u=h-(t*H+s*(1.0-H));q=i-(y*H+x*(1.0-H));m=j-(p*H+o*(1.0-H));k=k-(t*H+s*(1.0-H));j=n-(y*H+x*(1.0-H));if(!(E*(z*k-u*m)+(B*(u*j-q*k)+C*(q*m-z*j))>=A)){l=I;return}i=r-(p*H+o*(1.0-H));h=v-(t*H+s*(1.0-H));f=w-(y*H+x*(1.0-H));if(!(E*(m*h-k*i)+(B*(k*f-j*h)+C*(j*i-m*f))>=A)){l=I;return}if(!(E*(u*i-z*h)+(B*(q*h-u*f)+C*(z*f-q*i))>=A)){l=I;return}f=1.0/+D(+(B*B+C*C+E*E));g[I+16>>2]=B*f;g[I+16+4>>2]=C*f;g[I+16+8>>2]=E*f;b=c[(c[a>>2]|0)+12>>2]|0;if(F<=0.0&(G&2|0)==0){g[I>>2]=-(B*f);g[I+4>>2]=-(C*f);g[I+8>>2]=-(E*f);g[I+12>>2]=0.0;g[a+40>>2]=+pb[b&3](a,I,H,d,e);l=I;return}else{g[a+40>>2]=+pb[b&3](a,I+16|0,H,d,e);l=I;return}}function $f(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0;k=l;l=l+144|0;i=c[b+12>>2]|0;if(!i){l=k;return}n=c[d+4>>2]|0;m=c[e+4>>2]|0;c[h+4>>2]=i;g[k+12+128>>2]=999999984306749440.0;i=c[d+12>>2]|0;c[k+12>>2]=c[i>>2];c[k+12+4>>2]=c[i+4>>2];c[k+12+8>>2]=c[i+8>>2];c[k+12+12>>2]=c[i+12>>2];c[k+12+16>>2]=c[i+16>>2];c[k+12+16+4>>2]=c[i+16+4>>2];c[k+12+16+8>>2]=c[i+16+8>>2];c[k+12+16+12>>2]=c[i+16+12>>2];c[k+12+32>>2]=c[i+32>>2];c[k+12+32+4>>2]=c[i+32+4>>2];c[k+12+32+8>>2]=c[i+32+8>>2];c[k+12+32+12>>2]=c[i+32+12>>2];c[k+12+48>>2]=c[i+48>>2];c[k+12+48+4>>2]=c[i+48+4>>2];c[k+12+48+8>>2]=c[i+48+8>>2];c[k+12+48+12>>2]=c[i+48+12>>2];i=c[e+12>>2]|0;c[k+12+64>>2]=c[i>>2];c[k+12+64+4>>2]=c[i+4>>2];c[k+12+64+8>>2]=c[i+8>>2];c[k+12+64+12>>2]=c[i+12>>2];c[k+12+80>>2]=c[i+16>>2];c[k+12+80+4>>2]=c[i+16+4>>2];c[k+12+80+8>>2]=c[i+16+8>>2];c[k+12+80+12>>2]=c[i+16+12>>2];c[k+12+96>>2]=c[i+32>>2];c[k+12+96+4>>2]=c[i+32+4>>2];c[k+12+96+8>>2]=c[i+32+8>>2];c[k+12+96+12>>2]=c[i+32+12>>2];c[k+12+112>>2]=c[i+48>>2];c[k+12+112+4>>2]=c[i+48+4>>2];c[k+12+112+8>>2]=c[i+48+8>>2];c[k+12+112+12>>2]=c[i+48+12>>2];c[k>>2]=9628;c[k+4>>2]=n;c[k+8>>2]=m;pc(k,k+12|0,h,c[f+20>>2]|0,0);do if(a[b+8>>0]|0?(j=c[h+4>>2]|0,c[j+780>>2]|0):0){d=c[j+772>>2]|0;e=c[(c[h+8>>2]|0)+8>>2]|0;b=c[(c[h+12>>2]|0)+8>>2]|0;if((d|0)==(e|0)){af(j,d+4|0,b+4|0);break}else{af(j,b+4|0,e+4|0);break}}while(0);l=k;return}function ag(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0;f=qt()|0;Ij(f,4,b);c[f>>2]=4996;c[f+552>>2]=c[d>>2];c[f+552+4>>2]=c[d+4>>2];c[f+552+8>>2]=c[d+8>>2];c[f+552+12>>2]=c[d+12>>2];c[f+568>>2]=c[d+16>>2];c[f+568+4>>2]=c[d+16+4>>2];c[f+568+8>>2]=c[d+16+8>>2];c[f+568+12>>2]=c[d+16+12>>2];c[f+584>>2]=c[d+32>>2];c[f+584+4>>2]=c[d+32+4>>2];c[f+584+8>>2]=c[d+32+8>>2];c[f+584+12>>2]=c[d+32+12>>2];c[f+600>>2]=c[d+48>>2];c[f+600+4>>2]=c[d+48+4>>2];c[f+600+8>>2]=c[d+48+8>>2];c[f+600+12>>2]=c[d+48+12>>2];c[f+616>>2]=c[d>>2];c[f+616+4>>2]=c[d+4>>2];c[f+616+8>>2]=c[d+8>>2];c[f+616+12>>2]=c[d+12>>2];c[f+632>>2]=c[d+16>>2];c[f+632+4>>2]=c[d+16+4>>2];c[f+632+8>>2]=c[d+16+8>>2];c[f+632+12>>2]=c[d+16+12>>2];c[f+648>>2]=c[d+32>>2];c[f+648+4>>2]=c[d+32+4>>2];c[f+648+8>>2]=c[d+32+8>>2];c[f+648+12>>2]=c[d+32+12>>2];c[f+664>>2]=c[d+48>>2];c[f+664+4>>2]=c[d+48+4>>2];c[f+664+8>>2]=c[d+48+8>>2];c[f+664+12>>2]=c[d+48+12>>2];g[f+688>>2]=0.0;g[f+692>>2]=-1.0;g[f+696>>2]=.8999999761581421;g[f+700>>2]=.30000001192092896;g[f+704>>2]=1.0;g[f+708>>2]=0.0;g[f+712>>2]=0.0;a[f+716>>0]=0;a[f+736>>0]=0;a[f+737>>0]=0;a[f+738>>0]=0;a[f+739>>0]=1;a[f+740>>0]=e&1;c[f+748>>2]=0;c[f+748+4>>2]=0;c[f+748+8>>2]=0;c[f+748+12>>2]=0;c[f+748+16>>2]=0;d=c[f+28>>2]|0;l=+g[f+600>>2];k=+g[f+604>>2];j=+g[f+608>>2];i=l*+g[d+20>>2]+k*+g[d+24>>2]+j*+g[d+28>>2]+ +g[d+56>>2];h=l*+g[d+36>>2]+k*+g[d+40>>2]+j*+g[d+44>>2]+ +g[d+60>>2];g[f+664>>2]=l*+g[d+4>>2]+k*+g[d+8>>2]+j*+g[d+12>>2]+ +g[d+52>>2];g[f+668>>2]=i;g[f+672>>2]=h;g[f+676>>2]=0.0;g[f+732>>2]=e?-1.0:1.0;return f|0}function bg(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0;q=l;l=l+48|0;if((f|0)==(d|0)|((d|0)==(e|0)|(e|0)==(f|0))){l=q;return}k=q;m=k+36|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(m|0));if(!h)o=c[c[b+940>>2]>>2]|0;else o=h;h=c[b+812>>2]|0;if((h|0)==(c[b+816>>2]|0)?(p=h|0?h<<1:1,(h|0)<(p|0)):0){if(!p)n=0;else{c[6995]=(c[6995]|0)+1;h=sc((p*44|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}n=h;h=c[b+812>>2]|0}if((h|0)>0){i=0;do{k=n+(i*44|0)|0;j=(c[b+820>>2]|0)+(i*44|0)|0;m=k+44|0;do{c[k>>2]=c[j>>2];k=k+4|0;j=j+4|0}while((k|0)<(m|0));i=i+1|0}while((i|0)!=(h|0))}h=c[b+820>>2]|0;if(h|0){if(a[b+824>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+820>>2]=0}a[b+824>>0]=1;c[b+820>>2]=n;c[b+816>>2]=p;h=c[b+812>>2]|0}k=c[b+820>>2]|0;c[k+(h*44|0)>>2]=0;c[k+(h*44|0)+4>>2]=o;k=k+(h*44|0)+8|0;j=q;m=k+36|0;do{c[k>>2]=c[j>>2];k=k+4|0;j=j+4|0}while((k|0)<(m|0));p=c[b+812>>2]|0;c[b+812>>2]=p+1;o=c[b+820>>2]|0;k=c[b+780>>2]|0;c[o+(p*44|0)+8>>2]=k+(d*104|0);m=c[b+780>>2]|0;c[o+(p*44|0)+12>>2]=m+(e*104|0);n=c[b+780>>2]|0;c[o+(p*44|0)+16>>2]=n+(f*104|0);t=+g[k+(d*104|0)+8>>2];v=+g[k+(d*104|0)+12>>2];r=+g[k+(d*104|0)+16>>2];s=+g[m+(e*104|0)+8>>2]-t;w=+g[m+(e*104|0)+12>>2]-v;u=+g[m+(e*104|0)+16>>2]-r;t=+g[n+(f*104|0)+8>>2]-t;v=+g[n+(f*104|0)+12>>2]-v;r=+g[n+(f*104|0)+16>>2]-r;g[o+(p*44|0)+36>>2]=+D(+((s*v-w*t)*(s*v-w*t)+((w*r-u*v)*(w*r-u*v)+(u*t-s*r)*(u*t-s*r))));a[b+984>>0]=1;l=q;return}function cg(b,d,e,f,h,i,j,k,m){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0,r=0;r=l;l=l+80|0;g[r+16+60>>2]=0.0;g[r+16+8>>2]=0.0;g[r+16+12>>2]=.10000000149011612;g[r+16+16>>2]=300.0;g[r+16>>2]=1.0;g[r+16+4>>2]=-1.0;g[r+16+28>>2]=0.0;g[r+16+32>>2]=.20000000298023224;g[r+16+36>>2]=0.0;g[r+16+40>>2]=0.0;g[r+16+20>>2]=1.0;g[r+16+24>>2]=.5;c[r+16+56>>2]=0;g[r+16+48>>2]=0.0;a[r+16+44>>0]=0;p=0;do{o=c[b+856+(p<<2)>>2]|0;n=a[b+788+p>>0]|0;if(!o){if(n<<24>>24){n=1;q=5}}else q=5;if((q|0)==5){q=0;g[r+16+40>>2]=0.0;c[r+16+56>>2]=o;c[r+16+52>>2]=c[b+840+(p<<2)>>2];c[r+16+48>>2]=c[b+824+(p<<2)>>2];c[r+16+20>>2]=c[b+732>>2];a[r+16+44>>0]=n;c[r+16+4>>2]=c[b+696+(p<<2)>>2];c[r+16+24>>2]=c[b+728>>2];c[r+16>>2]=c[b+680+(p<<2)>>2];g[r+16+16>>2]=0.0;c[r+16+12>>2]=c[b+808+(p<<2)>>2];c[r+16+8>>2]=c[b+792+(p<<2)>>2];c[r>>2]=c[b+1064+(p<<2)>>2];c[r+4>>2]=c[b+1080+(p<<2)>>2];c[r+8>>2]=c[b+1096+(p<<2)>>2];g[r+12>>2]=0.0;o=c[b+1304>>2]>>p*3;if(!(o&1))n=c[d+32>>2]|0;else n=b+740+(p<<2)|0;c[r+16+28>>2]=c[n>>2];if(!(o&2))n=c[d+32>>2]|0;else n=b+772+(p<<2)|0;c[r+16+36>>2]=c[n>>2];c[r+16+32>>2]=c[((o&4|0)==0?d+4|0:b+756+(p<<2)|0)>>2];if(a[b+1301>>0]|0){o=p+1|0;if(!(c[b+868+(((o|0)==3?0:o)<<6)+56>>2]|0))n=1;else n=(c[b+868+(((p+2|0)%3|0)<<6)+56>>2]|0)==0&1}else n=0;e=(Hd(b,r+16|0,f,h,i,j,k,m,d,e,r,0,n)|0)+e|0}p=p+1|0}while((p|0)!=3);l=r;return e|0}function dg(b,d){b=b|0;d=+d;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0;e=c[b+248>>2]|0;if((e|0)<=0)return;q=0;do{p=c[(c[b+256>>2]|0)+(q<<2)>>2]|0;if(!(c[p+204>>2]&3)){m=+g[p+504>>2];f=+E(+(1.0-m),+d);i=f*+g[p+372>>2];g[p+372>>2]=i;h=f*+g[p+376>>2];g[p+376>>2]=h;f=f*+g[p+380>>2];g[p+380>>2]=f;o=+g[p+508>>2];l=+E(+(1.0-o),+d);j=l*+g[p+388>>2];g[p+388>>2]=j;k=l*+g[p+392>>2];g[p+392>>2]=k;l=l*+g[p+396>>2];g[p+396>>2]=l;do if(a[p+512>>0]|0){if(l*l+(j*j+k*k)<+g[p+524>>2]?i*i+h*h+f*f<+g[p+520>>2]:0){r=+g[p+516>>2];g[p+388>>2]=j*r;g[p+392>>2]=r*k;g[p+396>>2]=r*l;g[p+372>>2]=r*i;g[p+376>>2]=r*h;g[p+380>>2]=r*f;i=r*i;h=r*h;f=r*f;n=j*r;k=r*k;l=r*l}else n=j;j=+D(+(i*i+h*h+f*f));do if(j.004999999888241291){i=i-i*(1.0/j)*.004999999888241291;g[p+372>>2]=i;h=h-h*(1.0/j)*.004999999888241291;g[p+376>>2]=h;f=f-f*(1.0/j)*.004999999888241291;g[p+380>>2]=f;break}else{c[p+372>>2]=0;c[p+372+4>>2]=0;c[p+372+8>>2]=0;c[p+372+12>>2]=0;i=0.0;h=0.0;f=0.0;break}while(0);j=+D(+(n*n+k*k+l*l));if(j.004999999888241291){g[p+388>>2]=n-n*(1.0/j)*.004999999888241291;g[p+392>>2]=k-k*(1.0/j)*.004999999888241291;g[p+396>>2]=l-l*(1.0/j)*.004999999888241291;break}else{c[p+388>>2]=0;c[p+388+4>>2]=0;c[p+388+8>>2]=0;c[p+388+12>>2]=0;break}}while(0);Af(p+4|0,i,h,f,p+388|0,d,p+68|0);e=c[b+248>>2]|0}q=q+1|0}while((q|0)<(e|0));return}function eg(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;e=qt()|0;Ij(e,4,b);c[e>>2]=4996;c[e+552>>2]=c[d>>2];c[e+552+4>>2]=c[d+4>>2];c[e+552+8>>2]=c[d+8>>2];c[e+552+12>>2]=c[d+12>>2];c[e+568>>2]=c[d+16>>2];c[e+568+4>>2]=c[d+16+4>>2];c[e+568+8>>2]=c[d+16+8>>2];c[e+568+12>>2]=c[d+16+12>>2];c[e+584>>2]=c[d+32>>2];c[e+584+4>>2]=c[d+32+4>>2];c[e+584+8>>2]=c[d+32+8>>2];c[e+584+12>>2]=c[d+32+12>>2];c[e+600>>2]=c[d+48>>2];c[e+600+4>>2]=c[d+48+4>>2];c[e+600+8>>2]=c[d+48+8>>2];c[e+600+12>>2]=c[d+48+12>>2];c[e+616>>2]=c[d>>2];c[e+616+4>>2]=c[d+4>>2];c[e+616+8>>2]=c[d+8>>2];c[e+616+12>>2]=c[d+12>>2];c[e+632>>2]=c[d+16>>2];c[e+632+4>>2]=c[d+16+4>>2];c[e+632+8>>2]=c[d+16+8>>2];c[e+632+12>>2]=c[d+16+12>>2];c[e+648>>2]=c[d+32>>2];c[e+648+4>>2]=c[d+32+4>>2];c[e+648+8>>2]=c[d+32+8>>2];c[e+648+12>>2]=c[d+32+12>>2];c[e+664>>2]=c[d+48>>2];c[e+664+4>>2]=c[d+48+4>>2];c[e+664+8>>2]=c[d+48+8>>2];c[e+664+12>>2]=c[d+48+12>>2];g[e+688>>2]=0.0;g[e+692>>2]=-1.0;g[e+696>>2]=.8999999761581421;g[e+700>>2]=.30000001192092896;g[e+704>>2]=1.0;g[e+708>>2]=0.0;g[e+712>>2]=0.0;a[e+716>>0]=0;a[e+736>>0]=0;a[e+737>>0]=0;a[e+738>>0]=0;a[e+739>>0]=1;a[e+740>>0]=0;c[e+748>>2]=0;c[e+748+4>>2]=0;c[e+748+8>>2]=0;c[e+748+12>>2]=0;c[e+748+16>>2]=0;d=c[e+28>>2]|0;k=+g[e+600>>2];j=+g[e+604>>2];i=+g[e+608>>2];h=k*+g[d+20>>2]+j*+g[d+24>>2]+i*+g[d+28>>2]+ +g[d+56>>2];f=k*+g[d+36>>2]+j*+g[d+40>>2]+i*+g[d+44>>2]+ +g[d+60>>2];g[e+664>>2]=k*+g[d+4>>2]+j*+g[d+8>>2]+i*+g[d+12>>2]+ +g[d+52>>2];g[e+668>>2]=h;g[e+672>>2]=f;g[e+676>>2]=0.0;g[e+732>>2]=1.0;return e|0}function fg(a,b,c,d,e,f,h,i,j,k,l){a=a|0;b=b|0;c=+c;d=+d;e=+e;f=+f;h=h|0;i=i|0;j=j|0;k=k|0;l=+l;var m=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0;x=+g[j+(h<<2)>>2];y=+g[j+16+(h<<2)>>2];w=+g[j+32+(h<<2)>>2];o=+g[k+(i<<2)>>2];q=+g[k+16+(i<<2)>>2];s=+g[k+32+(i<<2)>>2];t=+g[k+48>>2]-+g[j+48>>2];u=+g[k+52>>2]-+g[j+52>>2];v=+g[k+56>>2]-+g[j+56>>2];m=1.0-(x*o+y*q+w*s)*(x*o+y*q+w*s);if(!(m==0.0)){m=(x*t+y*u+w*v-(x*o+y*q+w*s)*(o*t+q*u+s*v))/m;if(!(m<-c)){if(m>c){m=c;p=4}}else{m=-c;p=4}}else{m=0.0;p=4}n=(x*o+y*q+w*s)*m-(o*t+q*u+s*v);if(n<-e){m=(x*o+y*q+w*s)*-e+(x*t+y*u+w*v);if(!(m<-c))if(m>c){n=-e;m=c}else n=-e;else{n=-e;m=-c}}else if(n>e){m=(x*o+y*q+w*s)*e+(x*t+y*u+w*v);if(!(m<-c))if(m>c){n=e;m=c}else n=e;else{n=e;m=-c}}r=o*n;q=q*n;o=s*n;e=r+(t-x*m);n=q+(u-y*m);m=o+(v-w*m);c=+D(+(m*m+(e*e+n*n)));if(c-d-f>l)return +(c-d-f);do if(m*m+(e*e+n*n)<=1.4210854715202004e-14)if(+C(+w)>.7071067690849304){m=1.0/+D(+(y*y+w*w));g[a>>2]=0.0;g[a+4>>2]=-(w*m);i=a+4|0;j=a;m=y*m;h=2;break}else{m=1.0/+D(+(x*x+y*y));g[a>>2]=-(y*m);g[a+4>>2]=x*m;i=a+4|0;j=a;m=0.0;h=2;break}else{g[a>>2]=e*-(1.0/c);g[a+4>>2]=n*-(1.0/c);g[a+8>>2]=m*-(1.0/c);i=a+4|0;j=a;m=0.0;h=3}while(0);g[a+(h<<2)>>2]=m;x=q+ +g[k+52>>2]+ +g[i>>2]*f;y=o+ +g[k+56>>2]+ +g[a+8>>2]*f;g[b>>2]=r+ +g[k+48>>2]+ +g[j>>2]*f;g[b+4>>2]=x;g[b+8>>2]=y;g[b+12>>2]=0.0;return +(c-d-f)}function gg(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;i=c[b+28>>2]|0;j=c[b+32>>2]|0;if(!(a[b+1301>>0]|0)){h=0;e=cg(b,d,0,i+4|0,j+4|0,i+372|0,j+372|0,i+388|0,j+388|0)|0;do{f=b+868+(h<<6)|0;if(!((c[b+868+(h<<6)+56>>2]|0)==0?(a[b+868+(h<<6)+44>>0]|0)==0:0)){g=b+1208+(h<<4)|0;c[k>>2]=c[g>>2];c[k+4>>2]=c[g+4>>2];c[k+8>>2]=c[g+8>>2];c[k+12>>2]=c[g+12>>2];g=c[b+1304>>2]>>(h*3|0)+9;if(!(g&1))c[b+868+(h<<6)+28>>2]=c[c[d+32>>2]>>2];if(!(g&2))c[b+868+(h<<6)+36>>2]=c[c[d+32>>2]>>2];if(!(g&4))c[b+868+(h<<6)+32>>2]=c[d+4>>2];e=(Hd(b,f,i+4|0,j+4|0,i+372|0,j+372|0,i+388|0,j+388|0,d,e,k,1,0)|0)+e|0}h=h+1|0}while((h|0)!=3);l=k;return}h=0;e=0;do{f=b+868+(h<<6)|0;if(!((c[b+868+(h<<6)+56>>2]|0)==0?(a[b+868+(h<<6)+44>>0]|0)==0:0)){g=b+1208+(h<<4)|0;c[k>>2]=c[g>>2];c[k+4>>2]=c[g+4>>2];c[k+8>>2]=c[g+8>>2];c[k+12>>2]=c[g+12>>2];g=c[b+1304>>2]>>(h*3|0)+9;if(!(g&1))c[b+868+(h<<6)+28>>2]=c[c[d+32>>2]>>2];if(!(g&2))c[b+868+(h<<6)+36>>2]=c[c[d+32>>2]>>2];if(!(g&4))c[b+868+(h<<6)+32>>2]=c[d+4>>2];e=(Hd(b,f,i+4|0,j+4|0,i+372|0,j+372|0,i+388|0,j+388|0,d,e,k,1,0)|0)+e|0}h=h+1|0}while((h|0)!=3);cg(b,d,e,i+4|0,j+4|0,i+372|0,j+372|0,i+388|0,j+388|0)|0;l=k;return}function hg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=c[a+56>>2]|0;if(!e){e=c[a+52>>2]|0;if(!e){c[6995]=(c[6995]|0)+1;e=sc(31)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[a+60>>2]|0;c[e+4>>2]=f;g=e+8|0;c[g>>2]=0;c[6995]=(c[6995]|0)+1;f=sc((f*24|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}c[e>>2]=f;c[g>>2]=c[a+48>>2];c[a+48>>2]=e}else c[a+52>>2]=c[e+8>>2];h=c[e>>2]|0;g=c[e+4>>2]|0;if((g|0)>0){e=0;f=h;do{e=e+1|0;i=f;f=f+24|0;c[i>>2]=(e|0)<(g|0)?f:0}while((e|0)!=(g|0))}}else h=e;c[a+56>>2]=c[h>>2];c[h>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;c[h+16>>2]=0;c[h+20>>2]=0;e=c[a+56>>2]|0;if(!e){e=c[a+52>>2]|0;if(!e){c[6995]=(c[6995]|0)+1;e=sc(31)|0;if(!e)f=0;else{c[(e+4+15&-16)+-4>>2]=e;f=e+4+15&-16}e=c[a+60>>2]|0;c[f+4>>2]=e;g=f+8|0;c[g>>2]=0;c[6995]=(c[6995]|0)+1;e=sc((e*24|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[f>>2]=e;c[g>>2]=c[a+48>>2];c[a+48>>2]=f}else{c[a+52>>2]=c[e+8>>2];f=e}e=c[f>>2]|0;i=c[f+4>>2]|0;if((i|0)>0){f=0;g=e;do{f=f+1|0;j=g;g=g+24|0;c[j>>2]=(f|0)<(i|0)?g:0}while((f|0)!=(i|0))}}c[a+56>>2]=c[e>>2];j=e;c[j>>2]=0;c[j+4>>2]=0;c[h+8>>2]=e;c[e+8>>2]=h;j=c[a+100>>2]|0;c[h+20>>2]=j;c[e+20>>2]=j;c[h+12>>2]=d;c[e+12>>2]=b;c[h+16>>2]=0;c[e+16>>2]=0;e=c[a+116>>2]|0;c[a+116>>2]=e+1;if((e|0)<(c[a+120>>2]|0))return h|0;c[a+120>>2]=e+1;return h|0}function ig(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0;c[b+4>>2]=1065353216;c[b+8>>2]=1065353216;c[b+12>>2]=1065353216;g[b+16>>2]=0.0;a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;c[b+48>>2]=0;c[b>>2]=8796;a[b+100>>0]=1;c[b+96>>2]=0;c[b+88>>2]=0;c[b+92>>2]=0;a[b+120>>0]=1;c[b+116>>2]=0;c[b+108>>2]=0;c[b+112>>2]=0;a[b+140>>0]=1;c[b+136>>2]=0;c[b+128>>2]=0;c[b+132>>2]=0;a[b+160>>0]=1;c[b+156>>2]=0;c[b+148>>2]=0;c[b+152>>2]=0;a[b+164>>0]=d&1;a[b+165>>0]=e&1;g[b+168>>2]=0.0;c[6995]=(c[6995]|0)+1;d=sc(51)|0;if(!d)f=0;else{c[(d+4+15&-16)+-4>>2]=d;f=d+4+15&-16}e=c[b+24>>2]|0;if((e|0)>0){d=0;do{h=f+(d<<5)|0;i=(c[b+32>>2]|0)+(d<<5)|0;c[h>>2]=c[i>>2];c[h+4>>2]=c[i+4>>2];c[h+8>>2]=c[i+8>>2];c[h+12>>2]=c[i+12>>2];c[h+16>>2]=c[i+16>>2];c[h+20>>2]=c[i+20>>2];c[h+24>>2]=c[i+24>>2];c[h+28>>2]=c[i+28>>2];d=d+1|0}while((d|0)!=(e|0))}d=c[b+32>>2]|0;if(d|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=f;c[b+28>>2]=1;i=c[b+24>>2]|0;c[f+(i<<5)>>2]=0;c[f+(i<<5)+4>>2]=0;c[f+(i<<5)+8>>2]=12;c[f+(i<<5)+12>>2]=0;c[f+(i<<5)+16>>2]=0;c[f+(i<<5)+20>>2]=16;c[f+(i<<5)+24>>2]=2;c[f+(i<<5)+28>>2]=0;c[b+24>>2]=(c[b+24>>2]|0)+1;i=(a[b+164>>0]|0)==0;d=c[b+32>>2]|0;c[d>>2]=(c[(i?b+148|0:b+128|0)>>2]|0)/3|0;c[d+4>>2]=0;c[d+24>>2]=i?3:2;c[d+8>>2]=i?6:12;if(!(a[b+165>>0]|0)){h=12;b=(c[b+108>>2]|0)/3|0;i=d+12|0;c[i>>2]=b;i=d+16|0;c[i>>2]=0;i=d+20|0;c[i>>2]=h;return}else{h=16;b=c[b+88>>2]|0;i=d+12|0;c[i>>2]=b;i=d+16|0;c[i>>2]=0;i=d+20|0;c[i>>2]=h;return}}function jg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0;f=l;l=l+112|0;h=c[a+28>>2]|0;x=+g[d>>2];D=+g[h>>2];w=+g[d+16>>2];C=+g[h+4>>2];v=+g[d+32>>2];B=+g[h+8>>2];u=+g[d+4>>2];t=+g[d+20>>2];s=+g[d+36>>2];r=+g[d+8>>2];p=+g[d+24>>2];n=+g[d+40>>2];A=+g[h+16>>2];z=+g[h+20>>2];y=+g[h+24>>2];q=+g[h+32>>2];o=+g[h+36>>2];m=+g[h+40>>2];F=+g[d+48>>2];E=+g[d+52>>2];i=+g[d+56>>2];k=+g[h+48>>2]+(D*F+C*E+B*i);j=A*F+z*E+y*i+ +g[h+52>>2];i=q*F+o*E+m*i+ +g[h+56>>2];g[f+48>>2]=x*D+w*C+v*B;g[f+48+4>>2]=D*u+C*t+B*s;g[f+48+8>>2]=D*r+C*p+B*n;g[f+48+12>>2]=0.0;g[f+48+16>>2]=x*A+w*z+v*y;g[f+48+20>>2]=u*A+t*z+s*y;g[f+48+24>>2]=r*A+p*z+n*y;g[f+48+28>>2]=0.0;g[f+48+32>>2]=x*q+w*o+v*m;g[f+48+36>>2]=u*q+t*o+s*m;g[f+48+40>>2]=r*q+p*o+n*m;g[f+48+44>>2]=0.0;g[f+48+48>>2]=k;g[f+48+52>>2]=j;g[f+48+56>>2]=i;g[f+48+60>>2]=0.0;h=c[a+32>>2]|0;g[f+24+4>>2]=1.0;c[f+24+8>>2]=1;c[f+24+12>>2]=-1;c[f+24>>2]=6260;c[f+24+16>>2]=h;c[f+24+20>>2]=b;c[f+24+4>>2]=c[h+4>>2];h=c[a+4>>2]|0;d=c[h+8>>2]|0;c[f>>2]=h;c[f+4>>2]=e;c[f+8>>2]=d;c[f+12>>2]=f+48;c[f+16>>2]=-1;c[f+20>>2]=b;vc(c[a+8>>2]|0,c[a+12>>2]|0,c[a+16>>2]|0,f,f+24|0,+g[a+20>>2]);l=f;return}function kg(){var b=0,d=0,e=0;b=Us(348)|0;c[b>>2]=5320;c[b+132>>2]=0;c[b+132+4>>2]=0;c[b+132+8>>2]=0;c[b+132+12>>2]=0;c[b+132+16>>2]=0;c[b+132+20>>2]=0;c[b+132+24>>2]=0;c[b+132+28>>2]=0;c[b+164>>2]=1065353216;c[b+168>>2]=1065353216;c[b+172>>2]=1065353216;g[b+176>>2]=0.0;c[b+180>>2]=0;g[b+184>>2]=999999984306749440.0;c[b+188>>2]=0;c[b+188+4>>2]=0;c[b+188+8>>2]=0;c[b+188+12>>2]=0;c[b+204>>2]=1;c[b+208>>2]=-1;c[b+212>>2]=-1;c[b+216>>2]=-1;c[b+220>>2]=1;g[b+224>>2]=0.0;g[b+228>>2]=.5;g[b+232>>2]=0.0;g[b+236>>2]=0.0;g[b+240>>2]=0.0;g[b+244>>2]=.10000000149011612;g[b+248>>2]=1.0e4;c[b+256>>2]=0;c[b+260>>2]=-1;c[b+264>>2]=-1;g[b+268>>2]=1.0;g[b+272>>2]=0.0;g[b+276>>2]=0.0;c[b+280>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;c[b+304>>2]=0;c[b+4>>2]=1065353216;c[b+8>>2]=0;c[b+8+4>>2]=0;c[b+8+8>>2]=0;c[b+8+12>>2]=0;c[b+24>>2]=1065353216;c[b+28>>2]=0;c[b+28+4>>2]=0;c[b+28+8>>2]=0;c[b+28+12>>2]=0;c[b+44>>2]=1065353216;c[b+48>>2]=0;c[b+48+4>>2]=0;c[b+48+8>>2]=0;c[b+48+12>>2]=0;c[b+48+16>>2]=0;c[b+68>>2]=1065353216;c[b+72>>2]=0;c[b+72+4>>2]=0;c[b+72+8>>2]=0;c[b+72+12>>2]=0;c[b+88>>2]=1065353216;c[b+92>>2]=0;c[b+92+4>>2]=0;c[b+92+8>>2]=0;c[b+92+12>>2]=0;c[b+108>>2]=1065353216;c[b+112>>2]=0;c[b+112+4>>2]=0;c[b+112+8>>2]=0;c[b+112+12>>2]=0;c[b+112+16>>2]=0;a[b+340>>0]=1;c[b+336>>2]=0;c[b+328>>2]=0;c[b+332>>2]=0;c[b+252>>2]=4;c[b>>2]=5400;c[6995]=(c[6995]|0)+1;d=sc(91)|0;if(!d){e=0;Li(e);d=b+344|0;c[d>>2]=e;return b|0}c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16;Li(d);e=b+344|0;c[e>>2]=d;return b|0}function lg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,m=0,n=0;k=l;l=l+16|0;c[b+8>>2]=0;c[b+12>>2]=-1;c[b+16>>2]=1065353216;c[b+20>>2]=1065353216;c[b+24>>2]=1065353216;g[b+28>>2]=0.0;g[b+48>>2]=.03999999910593033;c[b+56>>2]=0;c[b+60>>2]=1065353216;c[b+64>>2]=1065353216;c[b+68>>2]=1065353216;g[b+72>>2]=0.0;c[b+76>>2]=-1082130432;c[b+80>>2]=-1082130432;c[b+84>>2]=-1082130432;g[b+88>>2]=0.0;a[b+92>>0]=0;c[b>>2]=7604;a[b+112>>0]=1;c[b+108>>2]=0;c[b+100>>2]=0;c[b+104>>2]=0;c[b+4>>2]=4;if((e|0)<=0){c[b+100>>2]=e;uj(b);l=k;return}c[6995]=(c[6995]|0)+1;h=sc((e<<4|3)+16|0)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}i=c[b+100>>2]|0;if((i|0)>0){h=0;do{m=j+(h<<4)|0;n=(c[b+108>>2]|0)+(h<<4)|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];h=h+1|0}while((h|0)!=(i|0))}h=c[b+108>>2]|0;if(h|0){if(a[b+112>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+108>>2]=0}a[b+112>>0]=1;c[b+108>>2]=j;c[b+104>>2]=e;c[j>>2]=c[k>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];if((e|0)!=1){h=1;do{n=(c[b+108>>2]|0)+(h<<4)|0;c[n>>2]=c[k>>2];c[n+4>>2]=c[k+4>>2];c[n+8>>2]=c[k+8>>2];c[n+12>>2]=c[k+12>>2];h=h+1|0}while((h|0)!=(e|0))}c[b+100>>2]=e;h=0;while(1){j=c[d+4>>2]|0;m=c[d+8>>2]|0;n=c[b+108>>2]|0;c[n+(h<<4)>>2]=c[d>>2];c[n+(h<<4)+4>>2]=j;c[n+(h<<4)+8>>2]=m;g[n+(h<<4)+12>>2]=0.0;h=h+1|0;if((h|0)==(e|0))break;else d=d+f|0}uj(b);l=k;return}function mg(a,b,d,e,f,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0;s=l;l=l+48|0;q=+g[d>>2];p=+g[d+4>>2];r=+g[d+8>>2];j=q*+g[b+4>>2]+p*+g[b+20>>2]+r*+g[b+36>>2];k=q*+g[b+8>>2]+p*+g[b+24>>2]+r*+g[b+40>>2];g[s+32>>2]=+g[b>>2]*q+ +g[b+16>>2]*p+ +g[b+32>>2]*r;g[s+32+4>>2]=j;g[s+32+8>>2]=k;g[s+32+12>>2]=0.0;Sb[c[(c[a>>2]|0)+64>>2]&127](s+16|0,a,s+32|0);k=+g[s+16>>2];j=+g[s+16+4>>2];r=+g[s+16+8>>2];p=k*+g[b>>2]+j*+g[b+4>>2]+r*+g[b+8>>2]+ +g[b+48>>2];q=k*+g[b+16>>2]+j*+g[b+20>>2]+r*+g[b+24>>2]+ +g[b+52>>2];r=k*+g[b+32>>2]+j*+g[b+36>>2]+r*+g[b+40>>2]+ +g[b+56>>2];t=c[(c[a>>2]|0)+64>>2]|0;j=-+g[s+32+4>>2];k=-+g[s+32+8>>2];g[s>>2]=-+g[s+32>>2];g[s+4>>2]=j;g[s+8>>2]=k;g[s+12>>2]=0.0;Sb[t&127](s+16|0,a,s);k=+g[s+16>>2];j=+g[s+16+4>>2];m=+g[s+16+8>>2];n=k*+g[b>>2]+j*+g[b+4>>2]+m*+g[b+8>>2]+ +g[b+48>>2];o=k*+g[b+16>>2]+j*+g[b+20>>2]+m*+g[b+24>>2]+ +g[b+52>>2];m=k*+g[b+32>>2]+j*+g[b+36>>2]+m*+g[b+40>>2]+ +g[b+56>>2];g[e>>2]=p*+g[d>>2]+q*+g[d+4>>2]+r*+g[d+8>>2];g[f>>2]=n*+g[d>>2]+o*+g[d+4>>2]+m*+g[d+8>>2];g[i>>2]=n;g[i+4>>2]=o;g[i+8>>2]=m;g[i+12>>2]=0.0;g[h>>2]=p;g[h+4>>2]=q;g[h+8>>2]=r;g[h+12>>2]=0.0;j=+g[e>>2];k=+g[f>>2];if(!(j>k)){l=s;return}g[e>>2]=k;g[f>>2]=j;g[i>>2]=p;g[i+4>>2]=q;g[i+8>>2]=r;g[i+12>>2]=0.0;g[h>>2]=n;g[h+4>>2]=o;g[h+8>>2]=m;g[h+12>>2]=0.0;l=s;return}function ng(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+32|0;if((b|0)<0)b=c[a+12>>2]|0;d=c[a>>2]|0;if(!((b|0)>0&(d|0)!=0)){l=n;return}while(1){e=d+40|0;if(c[e>>2]|0){m=0;while(1){g=d+32|0;h=c[g>>2]|0;if(h>>>0>d>>>0){i=(c[h+40>>2]|0)==(d|0)&1;j=c[h+36+((i^1)<<2)>>2]|0;k=c[h+32>>2]|0;if(!k)f=a;else f=k+36+(((c[k+40>>2]|0)==(h|0)&1)<<2)|0;c[f>>2]=d;c[j+32>>2]=d;c[h+32>>2]=d;c[g>>2]=k;k=d+36|0;c[h+36>>2]=c[k>>2];c[h+40>>2]=c[e>>2];c[(c[k>>2]|0)+32>>2]=h;c[(c[e>>2]|0)+32>>2]=h;c[d+36+(i<<2)>>2]=h;c[d+36+((i^1)<<2)>>2]=j;c[n>>2]=c[h>>2];c[n+4>>2]=c[h+4>>2];c[n+8>>2]=c[h+8>>2];c[n+12>>2]=c[h+12>>2];c[n+16>>2]=c[h+16>>2];c[n+20>>2]=c[h+20>>2];c[n+24>>2]=c[h+24>>2];c[n+28>>2]=c[h+28>>2];c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];c[h+16>>2]=c[d+16>>2];c[h+20>>2]=c[d+20>>2];c[h+24>>2]=c[d+24>>2];c[h+28>>2]=c[d+28>>2];c[d>>2]=c[n>>2];c[d+4>>2]=c[n+4>>2];c[d+8>>2]=c[n+8>>2];c[d+12>>2]=c[n+12>>2];c[d+16>>2]=c[n+16>>2];c[d+20>>2]=c[n+20>>2];c[d+24>>2]=c[n+24>>2];c[d+28>>2]=c[n+28>>2];d=h}d=c[d+36+(((c[a+16>>2]|0)>>>m&1)<<2)>>2]|0;e=d+40|0;if(!(c[e>>2]|0))break;else m=m+1&31}}if(!(Ag(a,d)|0))e=0;else e=c[a>>2]|0;Pe(a,e,d);c[a+16>>2]=(c[a+16>>2]|0)+1;b=b+-1|0;if(!b)break;d=c[a>>2]|0}l=n;return}function og(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,D=0.0,E=0.0;i=l;l=l+32|0;d=a[b+8>>0]|0?d:e;if(((c[(c[d+4>>2]|0)+4>>2]|0)+-21|0)>>>0>=9){l=i;return}e=c[(c[d+8>>2]|0)+192>>2]|0;y=+nb[c[(c[e>>2]|0)+48>>2]&15](e);c[b+64>>2]=f;g[b+68>>2]=y+.05999999865889549;c[b+56>>2]=h;h=c[b+16>>2]|0;Sb[c[(c[h>>2]|0)+28>>2]&127](h,i+16|0,i);y=+g[i>>2];x=+g[i+16>>2];w=+g[i+4>>2];v=+g[i+16+4>>2];u=+g[i+8>>2];t=+g[i+16+8>>2];h=c[d+12>>2]|0;B=+g[h>>2];o=+g[h+16>>2];D=+g[h+32>>2];z=+g[h+4>>2];m=+g[h+20>>2];A=+g[h+36>>2];q=+g[h+8>>2];j=+g[h+24>>2];r=+g[h+40>>2];E=-+g[h+48>>2];s=-+g[h+52>>2];k=-+g[h+56>>2];p=(y+x)*.5*B+(w+v)*.5*o+(u+t)*.5*D+(B*E+o*s+D*k);n=(y+x)*.5*z+(w+v)*.5*m+(u+t)*.5*A+(z*E+m*s+A*k);k=(y+x)*.5*q+(w+v)*.5*j+(u+t)*.5*r+(q*E+j*s+r*k);s=+g[b+68>>2];o=((y-x)*.5+s)*+C(+(B+o*0.0+D*0.0))+((w-v)*.5+s)*+C(+(B*0.0+o+D*0.0))+((u-t)*.5+s)*+C(+(D+(B*0.0+o*0.0)));m=((y-x)*.5+s)*+C(+(z+m*0.0+A*0.0))+((w-v)*.5+s)*+C(+(z*0.0+m+A*0.0))+((u-t)*.5+s)*+C(+(A+(z*0.0+m*0.0)));j=((y-x)*.5+s)*+C(+(q+j*0.0+r*0.0))+((w-v)*.5+s)*+C(+(q*0.0+j+r*0.0))+((u-t)*.5+s)*+C(+(r+(q*0.0+j*0.0)));g[b+24>>2]=p-o;g[b+28>>2]=n-m;g[b+32>>2]=k-j;g[b+36>>2]=0.0;g[b+40>>2]=p+o;g[b+44>>2]=n+m;g[b+48>>2]=k+j;g[b+52>>2]=0.0;Vb[c[(c[e>>2]|0)+64>>2]&127](e,b+12|0,b+24|0,b+40|0);l=i;return}function pg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0.0,z=0.0;x=l;l=l+48|0;u=+g[e>>2];v=+g[d>>2];w=+g[e+4>>2];t=+g[d+4>>2];s=+g[e+8>>2];n=+g[d+8>>2];o=+D(+((u-v)*.5*(u-v)*.5+(w-t)*.5*(w-t)*.5+(s-n)*.5*(s-n)*.5));p=+g[a+60>>2];d=+C(+p)>.7071067690849304;q=+g[a+56>>2];if(d){m=1.0/+D(+(p*p+q*q));r=+g[a+52>>2];f=r*-(p*m);h=(p*p+q*q)*m;i=0.0;j=-(r*q*m);k=-(p*m);m=q*m}else{r=+g[a+52>>2];k=1.0/+D(+(r*r+q*q));f=(r*r+q*q)*k;h=-(p*r*k);i=-(q*k);j=p*-(q*k);k=r*k;m=0.0}y=(u+v)*.5*r+(w+t)*.5*q+(s+n)*.5*p-+g[a+68>>2];z=(u+v)*.5-r*y;i=o*i;r=o*k;v=o*m;k=o*h;m=o*j;u=o*f;g[x>>2]=k+(i+z);g[x+4>>2]=m+(r+((w+t)*.5-q*y));g[x+8>>2]=u+(v+((s+n)*.5-p*y));g[x+12>>2]=0.0;g[x+16>>2]=i+z-k;g[x+20>>2]=r+((w+t)*.5-q*y)-m;g[x+24>>2]=v+((s+n)*.5-p*y)-u;g[x+28>>2]=0.0;g[x+32>>2]=z-i-k;g[x+36>>2]=(w+t)*.5-q*y-r-m;g[x+40>>2]=(s+n)*.5-p*y-v-u;g[x+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,x,0,0);g[x>>2]=z-i-k;g[x+4>>2]=(w+t)*.5-q*y-r-m;g[x+8>>2]=(s+n)*.5-p*y-v-u;g[x+12>>2]=0.0;g[x+16>>2]=k+(z-i);g[x+20>>2]=m+((w+t)*.5-q*y-r);g[x+24>>2]=u+((s+n)*.5-p*y-v);g[x+28>>2]=0.0;g[x+32>>2]=k+(i+z);g[x+36>>2]=m+(r+((w+t)*.5-q*y));g[x+40>>2]=u+(v+((s+n)*.5-p*y));g[x+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,x,0,1);l=x;return}function qg(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;if(!(a[d+164>>0]|0)){f=c[d+148>>2]|0;if((f|0)==(c[d+152>>2]|0)?(k=f|0?f<<1:1,(f|0)<(k|0)):0){if(!k)i=0;else{c[6995]=(c[6995]|0)+1;f=sc((k<<1)+19|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=f;f=c[d+148>>2]|0}h=c[d+156>>2]|0;if((f|0)<=0)if(!h)f=d+160|0;else g=27;else{g=0;do{b[i+(g<<1)>>1]=b[h+(g<<1)>>1]|0;g=g+1|0}while((g|0)!=(f|0));g=27}if((g|0)==27){if(a[d+160>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[d+156>>2]=0;f=d+160|0}a[f>>0]=1;c[d+156>>2]=i;c[d+152>>2]=k;f=c[d+148>>2]|0}b[(c[d+156>>2]|0)+(f<<1)>>1]=e;c[d+148>>2]=f+1;k=d+156|0;k=c[k>>2]|0;e=d+32|0;e=c[e>>2]|0;e=e+4|0;c[e>>2]=k;return}else{f=c[d+128>>2]|0;if((f|0)==(c[d+132>>2]|0)?(j=f|0?f<<1:1,(f|0)<(j|0)):0){if(!j)i=0;else{c[6995]=(c[6995]|0)+1;f=sc((j<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=f;f=c[d+128>>2]|0}h=c[d+136>>2]|0;if((f|0)<=0)if(!h)f=d+140|0;else g=12;else{g=0;do{c[i+(g<<2)>>2]=c[h+(g<<2)>>2];g=g+1|0}while((g|0)!=(f|0));g=12}if((g|0)==12){if(a[d+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[d+136>>2]=0;f=d+140|0}a[f>>0]=1;c[d+136>>2]=i;c[d+132>>2]=j;f=c[d+128>>2]|0}c[(c[d+136>>2]|0)+(f<<2)>>2]=e;c[d+128>>2]=(c[d+128>>2]|0)+1;k=d+136|0;k=c[k>>2]|0;e=d+32|0;e=c[e>>2]|0;e=e+4|0;c[e>>2]=k;return}}function rg(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;ce(b,d);c[b>>2]=3244;c[6995]=(c[6995]|0)+1;e=sc(27)|0;i=e+4+15&-16;c[i+-4>>2]=e;a[i+4>>0]=0;c[(e+4+15&-16)>>2]=3276;c[b+88>>2]=i;c[6995]=(c[6995]|0)+1;i=sc(27)|0;e=i+4+15&-16;c[e+-4>>2]=i;a[e+4>>0]=0;c[(i+4+15&-16)>>2]=3296;c[b+92>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[e>>2]=3296;c[b+96>>2]=e;a[e+4>>0]=1;c[6995]=(c[6995]|0)+1;i=sc(27)|0;e=i+4+15&-16;c[e+-4>>2]=i;a[e+4>>0]=0;c[(i+4+15&-16)>>2]=3316;c[b+100>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[e>>2]=3336;c[b+104>>2]=e;a[e+4>>0]=1;if(!(a[b+20>>0]|0))return;e=c[b+16>>2]|0;if(!e)return;if((c[e>>2]|0)>=156)return;f=c[e+16>>2]|0;if(f){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);e=c[b+16>>2]|0;if(!e)i=b+16|0;else{f=b+16|0;g=11}}else{f=b+16|0;g=11}if((g|0)==11){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);i=f}c[6995]=(c[6995]|0)+1;e=sc(43)|0;if(!e)h=0;else{c[(e+4+15&-16)+-4>>2]=e;h=e+4+15&-16}e=c[d+12>>2]|0;c[h>>2]=156;f=h+4|0;c[f>>2]=e;c[h+20>>2]=0;c[6995]=(c[6995]|0)+1;e=sc((e*156|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[h+16>>2]=e;c[h+12>>2]=e;f=c[f>>2]|0;c[h+8>>2]=f;if(f+-1|0){b=c[h>>2]|0;g=e;d=f+-1|0;do{j=g;g=g+b|0;c[j>>2]=g;d=d+-1|0}while((d|0)!=0);e=e+(P(b,f+-1|0)|0)|0}c[e>>2]=0;c[i>>2]=h;return}function sg(a,b,e){a=a|0;b=b|0;e=e|0;bf(a,b,e)|0;c[b+264>>2]=c[a+324>>2];c[b+268>>2]=c[a+328>>2];c[b+272>>2]=c[a+332>>2];c[b+276>>2]=c[a+336>>2];c[b+280>>2]=c[a+340>>2];c[b+284>>2]=c[a+344>>2];c[b+288>>2]=c[a+348>>2];c[b+292>>2]=c[a+352>>2];c[b+296>>2]=c[a+356>>2];c[b+300>>2]=c[a+360>>2];c[b+304>>2]=c[a+364>>2];c[b+308>>2]=c[a+368>>2];c[b+312>>2]=c[a+372>>2];c[b+316>>2]=c[a+376>>2];c[b+320>>2]=c[a+380>>2];c[b+324>>2]=c[a+384>>2];c[b+328>>2]=c[a+388>>2];c[b+332>>2]=c[a+392>>2];c[b+336>>2]=c[a+396>>2];c[b+340>>2]=c[a+400>>2];c[b+456>>2]=c[a+404>>2];c[b+344>>2]=c[a+604>>2];c[b+348>>2]=c[a+608>>2];c[b+352>>2]=c[a+612>>2];c[b+356>>2]=c[a+616>>2];c[b+360>>2]=c[a+408>>2];c[b+364>>2]=c[a+412>>2];c[b+368>>2]=c[a+416>>2];c[b+372>>2]=c[a+420>>2];c[b+376>>2]=c[a+424>>2];c[b+380>>2]=c[a+428>>2];c[b+384>>2]=c[a+432>>2];c[b+388>>2]=c[a+436>>2];c[b+392>>2]=c[a+440>>2];c[b+396>>2]=c[a+444>>2];c[b+400>>2]=c[a+448>>2];c[b+404>>2]=c[a+452>>2];c[b+408>>2]=c[a+456>>2];c[b+412>>2]=c[a+460>>2];c[b+416>>2]=c[a+464>>2];c[b+420>>2]=c[a+468>>2];c[b+424>>2]=c[a+472>>2];c[b+428>>2]=c[a+476>>2];c[b+432>>2]=c[a+480>>2];c[b+436>>2]=c[a+484>>2];c[b+440>>2]=c[a+488>>2];c[b+444>>2]=c[a+492>>2];c[b+448>>2]=c[a+496>>2];c[b+452>>2]=c[a+500>>2];c[b+460>>2]=c[a+504>>2];c[b+464>>2]=c[a+508>>2];c[b+492>>2]=d[a+512>>0];c[b+468>>2]=c[a+516>>2];c[b+472>>2]=c[a+520>>2];c[b+476>>2]=c[a+524>>2];c[b+480>>2]=c[a+528>>2];c[b+484>>2]=c[a+532>>2];c[b+488>>2]=c[a+536>>2];return 12085}function tg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0.0,j=0.0,k=0,l=0,m=0.0;c[6131]=(c[6131]|0)+1;if(!(c[b+4>>2]&2))j=.019999999552965164;else{k=c[d+192>>2]|0;i=+ob[c[(c[k>>2]|0)+20>>2]&1](k,.019999999552965164);k=c[e+192>>2]|0;j=+ob[c[(c[k>>2]|0)+20>>2]&1](k,.019999999552965164);j=i>2];i=+g[e+184>>2];i=m>2]|0;h=c[f+12>>2]|0;if(!h){if(c[b+4>>2]&4|0){b=0;return b|0}c[6995]=(c[6995]|0)+1;f=sc(823)|0;if(!f)k=0;else{c[(f+4+15&-16)+-4>>2]=f;k=f+4+15&-16}}else{c[f+12>>2]=c[h>>2];c[f+8>>2]=(c[f+8>>2]|0)+-1;k=h}c[k>>2]=1025;f=k+120|0;h=f+44|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(h|0));f=k+312|0;h=f+44|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(h|0));f=k+504|0;h=f+44|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(h|0));f=k+696|0;h=f+44|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(h|0));c[k+772>>2]=d;c[k+776>>2]=e;c[k+780>>2]=0;g[k+784>>2]=j;g[k+788>>2]=i;e=k;f=c[b+12>>2]|0;c[k+800>>2]=f;if((f|0)==(c[b+16>>2]|0)?(l=f|0?f<<1:1,(f|0)<(l|0)):0){if(!l)d=0;else{c[6995]=(c[6995]|0)+1;f=sc((l<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}d=f;f=c[b+12>>2]|0}if((f|0)>0){h=0;do{c[d+(h<<2)>>2]=c[(c[b+20>>2]|0)+(h<<2)>>2];h=h+1|0}while((h|0)!=(f|0))}h=c[b+20>>2]|0;if(h){if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);f=c[b+12>>2]|0}c[b+20>>2]=0}a[b+24>>0]=1;c[b+20>>2]=d;c[b+16>>2]=l}c[(c[b+20>>2]|0)+(f<<2)>>2]=e;c[b+12>>2]=f+1;b=k;return b|0}function ug(b,d,e,f,h,i,k,l,m){b=b|0;d=d|0;e=e|0;f=+f;h=+h;i=+i;k=k|0;l=l|0;m=m|0;var n=0,o=0.0,p=0.0,q=0.0,r=0.0;n=at()|0;c[n+8>>2]=0;c[n+12>>2]=-1;g[n+16>>2]=0.0;c[n>>2]=8404;c[n+4>>2]=24;c[n+68>>2]=b;c[n+72>>2]=d;g[n+76>>2]=h;g[n+80>>2]=i;g[n+84>>2]=+(b+-1|0);g[n+88>>2]=+(d+-1|0);g[n+92>>2]=f;c[n+96>>2]=e;c[n+100>>2]=l;a[n+104>>0]=m&1;a[n+105>>0]=0;a[n+106>>0]=0;c[n+108>>2]=k;c[n+112>>2]=1065353216;c[n+116>>2]=1065353216;c[n+120>>2]=1065353216;g[n+124>>2]=0.0;switch(k|0){case 0:{g[n+20>>2]=h;c[n+24>>2]=0;b=n+88|0;d=n+84|0;e=n+80|0;f=0.0;i=0.0;break}case 1:{c[n+20>>2]=0;g[n+24>>2]=h;b=n+88|0;d=n+80|0;e=n+84|0;f=0.0;i=h;h=0.0;break}case 2:{c[n+20>>2]=0;c[n+24>>2]=0;b=n+80|0;d=n+88|0;e=n+84|0;f=h;i=0.0;h=0.0;break}default:{q=+g[n+36>>2];h=+g[n+20>>2];p=+g[n+40>>2];f=+g[n+24>>2];o=+g[n+44>>2];i=+g[n+28>>2];h=q+h;f=p+f;i=o+i;h=h*.5;f=f*.5;i=i*.5;m=n+52|0;g[m>>2]=h;m=n+56|0;g[m>>2]=f;m=n+60|0;g[m>>2]=i;m=n+64|0;g[m>>2]=0.0;return n|0}}g[n+28>>2]=f;g[n+32>>2]=0.0;k=c[e>>2]|0;c[n+36>>2]=k;l=c[d>>2]|0;c[n+40>>2]=l;m=c[b>>2]|0;c[n+44>>2]=m;g[n+48>>2]=0.0;r=(c[j>>2]=k,+g[j>>2]);p=(c[j>>2]=l,+g[j>>2]);o=h;h=p;p=i;i=(c[j>>2]=m,+g[j>>2]);q=f;o=r+o;p=h+p;q=i+q;o=o*.5;p=p*.5;q=q*.5;m=n+52|0;g[m>>2]=o;m=n+56|0;g[m>>2]=p;m=n+60|0;g[m>>2]=q;m=n+64|0;g[m>>2]=0.0;return n|0}function vg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;Ib[c[(c[b>>2]|0)+32>>2]&511](b);e=Bb[c[(c[b>>2]|0)+16>>2]&63](b,104,1)|0;d=c[e+8>>2]|0;f=d;g=f+104|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));c[d+88>>2]=c[a+264>>2];c[d+92>>2]=c[a+268>>2];c[d+96>>2]=c[a+272>>2];c[d+100>>2]=c[a+276>>2];c[d>>2]=c[a+92>>2];c[d+4>>2]=c[a+96>>2];c[d+8>>2]=c[a+100>>2];c[d+12>>2]=c[a+104>>2];c[d+16>>2]=c[a+108>>2];c[d+20>>2]=c[a+116>>2];c[d+24>>2]=c[a+120>>2];c[d+28>>2]=c[a+124>>2];c[d+32>>2]=c[a+128>>2];c[d+36>>2]=c[a+132>>2];c[d+40>>2]=c[a+148>>2];c[d+44>>2]=c[a+152>>2];c[d+48>>2]=c[a+156>>2];c[d+52>>2]=c[a+160>>2];c[d+56>>2]=c[a+176>>2];c[d+60>>2]=c[a+180>>2];c[d+64>>2]=c[a+112>>2];c[d+68>>2]=c[a+164>>2];c[d+72>>2]=c[a+168>>2];c[d+76>>2]=c[a+172>>2];c[d+80>>2]=c[a+144>>2];c[d+84>>2]=0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,12157,1145853764,d);d=c[a+8>>2]|0;if((d|0)<=0){dj(a,b);id(a,b);a=c[b>>2]|0;a=a+36|0;a=c[a>>2]|0;Ib[a&511](b);return}f=0;do{e=c[(c[a+16>>2]|0)+(f<<2)>>2]|0;if(c[e+252>>2]&8){g=xb[c[(c[e>>2]|0)+16>>2]&127](e)|0;g=Bb[c[(c[b>>2]|0)+16>>2]&63](b,g,1)|0;d=Bb[c[(c[e>>2]|0)+20>>2]&63](e,c[g+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,g,d,1497645651,e);d=c[a+8>>2]|0}f=f+1|0}while((f|0)<(d|0));dj(a,b);id(a,b);a=c[b>>2]|0;a=a+36|0;a=c[a>>2]|0;Ib[a&511](b);return}function wg(b,d,e,f){b=b|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;l=c[d>>2]|0;l=zb[c[(c[l>>2]|0)+56>>2]&31](l,116)|0;ul(l,d,e,f,0);c[l>>2]=6576;a[l+104>>0]=1;c[l+100>>2]=0;c[l+92>>2]=0;c[l+96>>2]=0;c[6995]=(c[6995]|0)+1;b=sc(83)|0;if(!b)h=0;else{c[(b+4+15&-16)+-4>>2]=b;h=b+4+15&-16}c[h>>2]=9668;i=h+20|0;a[i>>0]=1;j=h+16|0;c[j>>2]=0;d=h+8|0;c[d>>2]=0;k=h+12|0;c[k>>2]=0;a[h+40>>0]=1;c[h+36>>2]=0;c[h+28>>2]=0;c[h+32>>2]=0;a[h+60>>0]=1;c[h+56>>2]=0;c[h+48>>2]=0;c[h+52>>2]=0;c[6995]=(c[6995]|0)+1;b=sc(43)|0;if(!b)g=0;else{c[(b+4+15&-16)+-4>>2]=b;g=b+4+15&-16}d=c[d>>2]|0;if((d|0)>0){b=0;do{m=g+(b*12|0)|0;n=(c[j>>2]|0)+(b*12|0)|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];b=b+1|0}while((b|0)!=(d|0))}b=c[j>>2]|0;if(!b){a[i>>0]=1;c[j>>2]=g;c[k>>2]=2;Nf(h);n=l+84|0;c[n>>2]=h;n=e+4|0;n=c[n>>2]|0;n=n+72|0;n=c[n>>2]|0;m=l+108|0;c[m>>2]=n;m=f+4|0;m=c[m>>2]|0;m=m+72|0;m=c[m>>2]|0;n=l+112|0;c[n>>2]=m;return l|0}if(a[i>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0)}c[j>>2]=0;a[i>>0]=1;c[j>>2]=g;c[k>>2]=2;Nf(h);n=l+84|0;c[n>>2]=h;n=e+4|0;n=c[n>>2]|0;n=n+72|0;n=c[n>>2]|0;m=l+108|0;c[m>>2]=n;m=f+4|0;m=c[m>>2]|0;m=m+72|0;m=c[m>>2]|0;n=l+112|0;c[n>>2]=m;return l|0}function xg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;g=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=g;if(g|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;g=c[a+52>>2]|0;Bb[c[(c[g>>2]|0)+56>>2]&63](g,b+12|0,d)|0;c[b+52>>2]=c[a+16>>2];do if((c[a+56>>2]|0)!=0?((xb[c[(c[d>>2]|0)+52>>2]&127](d)|0)&1|0)==0:0){e=zb[c[(c[d>>2]|0)+24>>2]&31](d,c[a+56>>2]|0)|0;if(!e){c[b+40>>2]=zb[c[(c[d>>2]|0)+28>>2]&31](d,c[a+56>>2]|0)|0;c[b+44>>2]=0;e=c[a+56>>2]|0;e=xb[c[(c[e>>2]|0)+12>>2]&127](e)|0;e=Bb[c[(c[d>>2]|0)+16>>2]&63](d,e,1)|0;g=c[a+56>>2]|0;g=Bb[c[(c[g>>2]|0)+16>>2]&63](g,c[e+8>>2]|0,d)|0;Zb[c[(c[d>>2]|0)+20>>2]&31](d,e,g,1213612625,c[a+56>>2]|0);break}else{c[b+40>>2]=e;c[b+44>>2]=0;break}}else f=8;while(0);if((f|0)==8){c[b+40>>2]=0;c[b+44>>2]=0}if(c[a+60>>2]|0?((xb[c[(c[d>>2]|0)+52>>2]&127](d)|0)&2|0)==0:0){e=zb[c[(c[d>>2]|0)+24>>2]&31](d,c[a+60>>2]|0)|0;if(!e){c[b+48>>2]=zb[c[(c[d>>2]|0)+28>>2]&31](d,c[a+60>>2]|0)|0;f=c[a+60>>2]|0;f=xb[c[(c[f>>2]|0)+8>>2]&127](f)|0;f=Bb[c[(c[d>>2]|0)+16>>2]&63](d,f,1)|0;g=c[a+60>>2]|0;g=Bb[c[(c[g>>2]|0)+12>>2]&63](g,c[f+8>>2]|0,d)|0;Zb[c[(c[d>>2]|0)+20>>2]&31](d,f,g,1346456916,c[a+60>>2]|0);g=b+56|0;c[g>>2]=0;return 16561}else{c[b+48>>2]=e;g=b+56|0;c[g>>2]=0;return 16561}}c[b+48>>2]=0;g=b+56|0;c[g>>2]=0;return 16561}function yg(a,b){a=a|0;b=+b;var d=0,e=0,f=0,h=0,i=0.0,j=0.0,k=0.0;h=l;l=l+32|0;d=c[a+8>>2]|0;if((d|0)<=0){l=h;return}f=0;do{e=c[(c[a+16>>2]|0)+(f<<2)>>2]|0;if((!((e|0)==0?1:(c[e+252>>2]&2|0)==0)?(c[e+220>>2]|0)!=2:0)?!(b==0.0?1:(c[e+204>>2]&2|0)==0):0){d=c[e+540>>2]|0;if(!d)d=e+4|0;else{Ob[c[(c[d>>2]|0)+8>>2]&127](d,e+4|0);d=e+4|0}j=1.0/b*(+g[e+56>>2]-+g[e+120>>2]);k=1.0/b*(+g[e+60>>2]-+g[e+124>>2]);g[e+372>>2]=1.0/b*(+g[e+52>>2]-+g[e+116>>2]);g[e+376>>2]=j;g[e+380>>2]=k;g[e+384>>2]=0.0;If(e+68|0,d,h+8|0,h);k=+g[h>>2];j=1.0/b*k*+g[h+8+4>>2];i=1.0/b*k*+g[h+8+8>>2];g[e+388>>2]=1.0/b*+g[h+8>>2]*k;g[e+392>>2]=j;g[e+396>>2]=i;g[e+400>>2]=0.0;c[e+132>>2]=c[e+372>>2];c[e+132+4>>2]=c[e+372+4>>2];c[e+132+8>>2]=c[e+372+8>>2];c[e+132+12>>2]=c[e+372+12>>2];c[e+148>>2]=c[e+388>>2];c[e+148+4>>2]=c[e+388+4>>2];c[e+148+8>>2]=c[e+388+8>>2];c[e+148+12>>2]=c[e+388+12>>2];c[e+68>>2]=c[d>>2];c[e+68+4>>2]=c[d+4>>2];c[e+68+8>>2]=c[d+8>>2];c[e+68+12>>2]=c[d+12>>2];c[e+84>>2]=c[e+20>>2];c[e+84+4>>2]=c[e+20+4>>2];c[e+84+8>>2]=c[e+20+8>>2];c[e+84+12>>2]=c[e+20+12>>2];c[e+100>>2]=c[e+36>>2];c[e+100+4>>2]=c[e+36+4>>2];c[e+100+8>>2]=c[e+36+8>>2];c[e+100+12>>2]=c[e+36+12>>2];c[e+116>>2]=c[e+52>>2];c[e+116+4>>2]=c[e+52+4>>2];c[e+116+8>>2]=c[e+52+8>>2];c[e+116+12>>2]=c[e+52+12>>2];d=c[a+8>>2]|0}f=f+1|0}while((f|0)<(d|0));l=h;return}function zg(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0;i=qt()|0;c[i+4>>2]=4;c[i+8>>2]=-1;c[i+12>>2]=-1;g[i+16>>2]=3402823466385288598117041.0e14;a[i+20>>0]=1;a[i+21>>0]=0;c[i+24>>2]=-1;c[i+28>>2]=b;c[i+32>>2]=d;g[i+36>>2]=0.0;g[i+40>>2]=.05000000074505806;c[i+44>>2]=0;c[i>>2]=4996;c[i+552>>2]=c[e>>2];c[i+552+4>>2]=c[e+4>>2];c[i+552+8>>2]=c[e+8>>2];c[i+552+12>>2]=c[e+12>>2];c[i+568>>2]=c[e+16>>2];c[i+568+4>>2]=c[e+16+4>>2];c[i+568+8>>2]=c[e+16+8>>2];c[i+568+12>>2]=c[e+16+12>>2];c[i+584>>2]=c[e+32>>2];c[i+584+4>>2]=c[e+32+4>>2];c[i+584+8>>2]=c[e+32+8>>2];c[i+584+12>>2]=c[e+32+12>>2];c[i+600>>2]=c[e+48>>2];c[i+600+4>>2]=c[e+48+4>>2];c[i+600+8>>2]=c[e+48+8>>2];c[i+600+12>>2]=c[e+48+12>>2];c[i+616>>2]=c[f>>2];c[i+616+4>>2]=c[f+4>>2];c[i+616+8>>2]=c[f+8>>2];c[i+616+12>>2]=c[f+12>>2];c[i+632>>2]=c[f+16>>2];c[i+632+4>>2]=c[f+16+4>>2];c[i+632+8>>2]=c[f+16+8>>2];c[i+632+12>>2]=c[f+16+12>>2];c[i+648>>2]=c[f+32>>2];c[i+648+4>>2]=c[f+32+4>>2];c[i+648+8>>2]=c[f+32+8>>2];c[i+648+12>>2]=c[f+32+12>>2];c[i+664>>2]=c[f+48>>2];c[i+664+4>>2]=c[f+48+4>>2];c[i+664+8>>2]=c[f+48+8>>2];c[i+664+12>>2]=c[f+48+12>>2];g[i+688>>2]=0.0;g[i+692>>2]=-1.0;g[i+696>>2]=.8999999761581421;g[i+700>>2]=.30000001192092896;g[i+704>>2]=1.0;g[i+708>>2]=0.0;g[i+712>>2]=0.0;a[i+716>>0]=0;a[i+736>>0]=0;a[i+737>>0]=0;a[i+738>>0]=0;a[i+739>>0]=1;a[i+740>>0]=h&1;c[i+748>>2]=0;c[i+748+4>>2]=0;c[i+748+8>>2]=0;c[i+748+12>>2]=0;c[i+748+16>>2]=0;g[i+732>>2]=h?-1.0:1.0;return i|0}function Ag(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,h=0.0,i=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;if((c[a>>2]|0)==(b|0)){c[a>>2]=0;a=0;return a|0}e=c[b+32>>2]|0;d=c[e+32>>2]|0;b=c[e+36+(((c[e+40>>2]|0)!=(b|0)&1)<<2)>>2]|0;a:do if(!d){c[a>>2]=b;c[b+32>>2]=0;d=c[a+4>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[a+4>>2]=e}else{c[d+36+(((c[d+40>>2]|0)==(e|0)&1)<<2)>>2]=b;c[b+32>>2]=d;b=c[a+4>>2]|0;if(b|0){c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0)}c[a+4>>2]=e;while(1){n=+g[d>>2];r=d+4|0;p=+g[r>>2];w=d+8|0;o=+g[w>>2];e=d+16|0;m=+g[e>>2];t=d+20|0;k=+g[t>>2];u=d+24|0;h=+g[u>>2];v=c[d+36>>2]|0;q=c[d+40>>2]|0;b=c[(+g[v>>2]<+g[q>>2]?v:q)>>2]|0;c[d>>2]=b;s=c[(+g[v+16>>2]>+g[q+16>>2]?v+16|0:q+16|0)>>2]|0;c[e>>2]=s;e=c[(+g[v+4>>2]<+g[q+4>>2]?v:q)+4>>2]|0;c[r>>2]=e;r=c[(+g[v+20>>2]>+g[q+20>>2]?v+16|0:q+16|0)+4>>2]|0;c[t>>2]=r;t=c[(+g[v+8>>2]<+g[q+8>>2]?v:q)+8>>2]|0;c[w>>2]=t;q=c[(+g[v+24>>2]>+g[q+24>>2]?v+16|0:q+16|0)+8>>2]|0;c[u>>2]=q;b=n!=(c[j>>2]=b,+g[j>>2]);n=(c[j>>2]=t,+g[j>>2]);l=(c[j>>2]=s,+g[j>>2]);i=(c[j>>2]=r,+g[j>>2]);f=(c[j>>2]=q,+g[j>>2]);if(!(b|p!=(c[j>>2]=e,+g[j>>2])|o!=n|m!=l|k!=i|h!=f))break;d=c[d+32>>2]|0;if(!d)break a}return d|0}while(0);w=c[a>>2]|0;return w|0}function Bg(a,b,d){a=a|0;b=+b;d=+d;var e=0,f=0,h=0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0.0,v=0.0,w=0,x=0.0,y=0.0,z=0.0,A=0.0;h=l;l=l+16|0;d=+g[a+396>>2]*b;b=+g[a+512>>2];f=c[a+852>>2]|0;if((f|0)<=0){l=h;return}e=0;do{t=c[a+860>>2]|0;j=t+(e*96|0)+20|0;w=c[j>>2]|0;o=c[t+(e*96|0)>>2]|0;z=+g[t+(e*96|0)+4>>2];y=+g[t+(e*96|0)+8>>2];x=+g[t+(e*96|0)+12>>2];i=t+(e*96|0)+76|0;v=+g[w+392>>2];q=+g[t+(e*96|0)+84>>2];A=+g[w+396>>2];m=+g[t+(e*96|0)+80>>2];k=+g[i>>2];n=+g[w+388>>2];s=+g[o+8>>2];r=+g[o+12>>2];p=+g[o+16>>2];u=d*(z*+g[w+4>>2]+y*+g[w+8>>2]+x*+g[w+12>>2]+ +g[w+52>>2]-s)+(b*(v*q-A*m+ +g[w+372>>2])-(s-+g[o+24>>2]));q=d*(z*+g[w+20>>2]+y*+g[w+24>>2]+x*+g[w+28>>2]+ +g[w+56>>2]-r)+(b*(+g[w+376>>2]+(A*k-q*n))-(r-+g[o+28>>2]));k=d*(z*+g[w+36>>2]+y*+g[w+40>>2]+x*+g[w+44>>2]+ +g[w+60>>2]-p)+(b*(m*n-v*k+ +g[w+380>>2])-(p-+g[o+32>>2]));v=+g[t+(e*96|0)+24>>2];n=(u*+g[t+(e*96|0)+28>>2]+q*+g[t+(e*96|0)+32>>2]+ +g[t+(e*96|0)+36>>2]*k)*v;m=(u*+g[t+(e*96|0)+44>>2]+q*+g[t+(e*96|0)+48>>2]+k*+g[t+(e*96|0)+52>>2])*v;k=v*(u*+g[t+(e*96|0)+60>>2]+q*+g[t+(e*96|0)+64>>2]+k*+g[t+(e*96|0)+68>>2]);q=+g[t+(e*96|0)+92>>2];g[o+8>>2]=s+n*q;g[o+12>>2]=q*m+r;g[o+16>>2]=q*k+p;j=c[j>>2]|0;g[h>>2]=-n;g[h+4>>2]=-m;g[h+8>>2]=-k;g[h+12>>2]=0.0;ll(j,h,i);e=e+1|0}while((e|0)!=(f|0));l=h;return}function Cg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0.0,j=0.0,k=0.0,m=0,n=0.0;m=l;l=l+688|0;c[m+568+8>>2]=0;c[m+568+12>>2]=-1;c[m+568+16>>2]=1065353216;c[m+568+20>>2]=1065353216;c[m+568+24>>2]=1065353216;g[m+568+28>>2]=0.0;c[m+568+56>>2]=0;c[m+568>>2]=3924;c[m+568+4>>2]=1;c[m+568+60>>2]=c[d>>2];c[m+568+60+4>>2]=c[d+4>>2];c[m+568+60+8>>2]=c[d+8>>2];c[m+568+60+12>>2]=c[d+12>>2];c[m+568+76>>2]=c[d+16>>2];c[m+568+76+4>>2]=c[d+16+4>>2];c[m+568+76+8>>2]=c[d+16+8>>2];c[m+568+76+12>>2]=c[d+16+12>>2];c[m+568+92>>2]=c[d+32>>2];c[m+568+92+4>>2]=c[d+32+4>>2];c[m+568+92+8>>2]=c[d+32+8>>2];c[m+568+92+12>>2]=c[d+32+12>>2];c[m+568+48>>2]=c[b+204>>2];g[m+208+308>>2]=9.999999747378752e-05;a[m+208+332>>0]=0;c[m+200>>2]=9464;d=c[b+4>>2]|0;c[m+176>>2]=9532;c[m+176+4>>2]=m+208;c[m+176+8>>2]=m+200;c[m+176+12>>2]=d;c[m+176+16>>2]=m+568;c[m+176+20>>2]=0;c[m>>2]=3896;c[m+168>>2]=0;g[m+164>>2]=1.0;c[m+172>>2]=c[b+208>>2];if((Wd(m+176|0,b+8|0,b+72|0,b+136|0,b+136|0,m)|0?(h=+g[m+132>>2],i=+g[m+136>>2],j=+g[m+140>>2],h*h+i*i+j*j>9.999999747378752e-05):0)?(k=+g[m+164>>2],k<+g[b+200>>2]):0){n=1.0/+D(+(h*h+i*i+j*j));g[m+132>>2]=h*n;g[m+136>>2]=i*n;g[m+140>>2]=j*n;+rb[c[(c[b>>2]|0)+12>>2]&3](b,m+132|0,m+148|0,k,e,f)}c[m+568>>2]=7472;b=c[m+568+56>>2]|0;if(!b){l=m;return}Ib[c[c[b>>2]>>2]&511](b);b=c[m+568+56>>2]|0;if(!b){l=m;return}c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);l=m;return}function Dg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0;h=qt()|0;c[h+4>>2]=4;c[h+8>>2]=-1;c[h+12>>2]=-1;g[h+16>>2]=3402823466385288598117041.0e14;a[h+20>>0]=1;a[h+21>>0]=0;c[h+24>>2]=-1;c[h+28>>2]=b;c[h+32>>2]=d;g[h+36>>2]=0.0;g[h+40>>2]=.05000000074505806;c[h+44>>2]=0;c[h>>2]=4996;c[h+552>>2]=c[e>>2];c[h+552+4>>2]=c[e+4>>2];c[h+552+8>>2]=c[e+8>>2];c[h+552+12>>2]=c[e+12>>2];c[h+568>>2]=c[e+16>>2];c[h+568+4>>2]=c[e+16+4>>2];c[h+568+8>>2]=c[e+16+8>>2];c[h+568+12>>2]=c[e+16+12>>2];c[h+584>>2]=c[e+32>>2];c[h+584+4>>2]=c[e+32+4>>2];c[h+584+8>>2]=c[e+32+8>>2];c[h+584+12>>2]=c[e+32+12>>2];c[h+600>>2]=c[e+48>>2];c[h+600+4>>2]=c[e+48+4>>2];c[h+600+8>>2]=c[e+48+8>>2];c[h+600+12>>2]=c[e+48+12>>2];c[h+616>>2]=c[f>>2];c[h+616+4>>2]=c[f+4>>2];c[h+616+8>>2]=c[f+8>>2];c[h+616+12>>2]=c[f+12>>2];c[h+632>>2]=c[f+16>>2];c[h+632+4>>2]=c[f+16+4>>2];c[h+632+8>>2]=c[f+16+8>>2];c[h+632+12>>2]=c[f+16+12>>2];c[h+648>>2]=c[f+32>>2];c[h+648+4>>2]=c[f+32+4>>2];c[h+648+8>>2]=c[f+32+8>>2];c[h+648+12>>2]=c[f+32+12>>2];c[h+664>>2]=c[f+48>>2];c[h+664+4>>2]=c[f+48+4>>2];c[h+664+8>>2]=c[f+48+8>>2];c[h+664+12>>2]=c[f+48+12>>2];g[h+688>>2]=0.0;g[h+692>>2]=-1.0;g[h+696>>2]=.8999999761581421;g[h+700>>2]=.30000001192092896;g[h+704>>2]=1.0;g[h+708>>2]=0.0;g[h+712>>2]=0.0;a[h+716>>0]=0;a[h+736>>0]=0;a[h+737>>0]=0;a[h+738>>0]=0;a[h+739>>0]=1;a[h+740>>0]=0;c[h+748>>2]=0;c[h+748+4>>2]=0;c[h+748+8>>2]=0;c[h+748+12>>2]=0;c[h+748+16>>2]=0;g[h+732>>2]=1.0;return h|0}function Eg(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,h=0,i=0.0,j=0,k=0.0,l=0,m=0.0,n=0.0,o=0,p=0.0;d=c[a+772>>2]|0;if((d|0)>0){b=0;do{l=(c[a+780>>2]|0)+(b*104|0)+72|0;b=b+1|0;c[l>>2]=0;c[l+4>>2]=0;c[l+8>>2]=0;c[l+12>>2]=0}while((b|0)!=(d|0))}d=c[a+812>>2]|0;if((d|0)>0){b=0;do{o=c[a+820>>2]|0;j=c[o+(b*44|0)+12>>2]|0;h=c[o+(b*44|0)+8>>2]|0;k=+g[h+8>>2];e=+g[j+8>>2]-k;f=+g[h+12>>2];i=+g[j+12>>2]-f;m=+g[h+16>>2];n=+g[j+16>>2]-m;l=c[o+(b*44|0)+16>>2]|0;k=+g[l+8>>2]-k;f=+g[l+12>>2]-f;m=+g[l+16>>2]-m;p=1.0/+D(+((e*f-i*k)*(e*f-i*k)+((i*m-n*f)*(i*m-n*f)+(n*k-e*m)*(n*k-e*m))));g[o+(b*44|0)+20>>2]=p*(i*m-n*f);g[o+(b*44|0)+24>>2]=p*(n*k-e*m);g[o+(b*44|0)+28>>2]=(e*f-i*k)*p;c[o+(b*44|0)+32>>2]=0;g[h+72>>2]=i*m-n*f+ +g[h+72>>2];g[h+76>>2]=n*k-e*m+ +g[h+76>>2];g[h+80>>2]=e*f-i*k+ +g[h+80>>2];g[j+72>>2]=i*m-n*f+ +g[j+72>>2];g[j+76>>2]=n*k-e*m+ +g[j+76>>2];g[j+80>>2]=e*f-i*k+ +g[j+80>>2];g[l+72>>2]=i*m-n*f+ +g[l+72>>2];g[l+76>>2]=n*k-e*m+ +g[l+76>>2];g[l+80>>2]=e*f-i*k+ +g[l+80>>2];b=b+1|0}while((b|0)!=(d|0))}l=c[a+772>>2]|0;if((l|0)<=0)return;a=c[a+780>>2]|0;b=0;do{h=a+(b*104|0)+72|0;i=+g[h>>2];j=a+(b*104|0)+76|0;k=+g[j>>2];d=a+(b*104|0)+80|0;e=+g[d>>2];f=+D(+(i*i+k*k+e*e));if(f>1.1920928955078125e-07){g[h>>2]=i*(1.0/f);g[j>>2]=1.0/f*k;g[d>>2]=1.0/f*e}b=b+1|0}while((b|0)!=(l|0));return}function Fg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0;h=ht()|0;c[h+4>>2]=5;c[h+8>>2]=-1;c[h+12>>2]=-1;g[h+16>>2]=3402823466385288598117041.0e14;a[h+20>>0]=1;a[h+21>>0]=0;c[h+24>>2]=-1;c[h+28>>2]=b;c[h+32>>2]=d;g[h+36>>2]=0.0;g[h+40>>2]=.05000000074505806;c[h+44>>2]=0;c[h>>2]=4940;c[h+300>>2]=c[e>>2];c[h+300+4>>2]=c[e+4>>2];c[h+300+8>>2]=c[e+8>>2];c[h+300+12>>2]=c[e+12>>2];c[h+316>>2]=c[e+16>>2];c[h+316+4>>2]=c[e+16+4>>2];c[h+316+8>>2]=c[e+16+8>>2];c[h+316+12>>2]=c[e+16+12>>2];c[h+332>>2]=c[e+32>>2];c[h+332+4>>2]=c[e+32+4>>2];c[h+332+8>>2]=c[e+32+8>>2];c[h+332+12>>2]=c[e+32+12>>2];c[h+348>>2]=c[e+48>>2];c[h+348+4>>2]=c[e+48+4>>2];c[h+348+8>>2]=c[e+48+8>>2];c[h+348+12>>2]=c[e+48+12>>2];c[h+364>>2]=c[f>>2];c[h+364+4>>2]=c[f+4>>2];c[h+364+8>>2]=c[f+8>>2];c[h+364+12>>2]=c[f+12>>2];c[h+380>>2]=c[f+16>>2];c[h+380+4>>2]=c[f+16+4>>2];c[h+380+8>>2]=c[f+16+8>>2];c[h+380+12>>2]=c[f+16+12>>2];c[h+396>>2]=c[f+32>>2];c[h+396+4>>2]=c[f+32+4>>2];c[h+396+8>>2]=c[f+32+8>>2];c[h+396+12>>2]=c[f+32+12>>2];c[h+412>>2]=c[f+48>>2];c[h+412+4>>2]=c[f+48+4>>2];c[h+412+8>>2]=c[f+48+8>>2];c[h+412+12>>2]=c[f+48+12>>2];a[h+552>>0]=0;c[h+524>>2]=0;g[h+572>>2]=-1.0;g[h+444>>2]=999999984306749440.0;g[h+448>>2]=999999984306749440.0;g[h+452>>2]=999999984306749440.0;g[h+428>>2]=1.0;g[h+432>>2]=.30000001192092896;g[h+436>>2]=1.0;g[h+440>>2]=.009999999776482582;g[h+456>>2]=.05000000074505806;c[h+592>>2]=0;g[h+596>>2]=0.0;g[h+600>>2]=.699999988079071;g[h+604>>2]=0.0;return h|0}function Gg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0;e=+g[d+128>>2];if(!(e!=0.0)){i=0.0;return +i}c[5961]=(c[5961]|0)+1;k=+g[d+96>>2];f=+g[d+16>>2];h=+g[d+20>>2];i=+g[d+24>>2];j=+g[d+108>>2];j=e-k*+g[d+116>>2]-(f*+g[a+144>>2]+h*+g[a+148>>2]+i*+g[a+152>>2]+(+g[d>>2]*+g[a+160>>2]+ +g[d+4>>2]*+g[a+164>>2]+ +g[d+8>>2]*+g[a+168>>2]))*j-j*(+g[d+48>>2]*+g[b+144>>2]+ +g[d+52>>2]*+g[b+148>>2]+ +g[d+56>>2]*+g[b+152>>2]+(+g[d+32>>2]*+g[b+160>>2]+ +g[d+36>>2]*+g[b+164>>2]+ +g[d+40>>2]*+g[b+168>>2]));l=+g[d+120>>2];e=k+j>2]=k+j>2]|0){l=e*h*+g[a+132>>2]*+g[a+116>>2];k=e*i*+g[a+136>>2]*+g[a+120>>2];g[a+144>>2]=+g[a+112>>2]*e*f*+g[a+128>>2]+ +g[a+144>>2];g[a+148>>2]=l+ +g[a+148>>2];g[a+152>>2]=k+ +g[a+152>>2];k=e*+g[a+100>>2]*+g[d+68>>2];l=e*+g[a+104>>2]*+g[d+72>>2];g[a+160>>2]=e*+g[a+96>>2]*+g[d+64>>2]+ +g[a+160>>2];g[a+164>>2]=k+ +g[a+164>>2];g[a+168>>2]=l+ +g[a+168>>2]}if(!(c[b+240>>2]|0)){l=e;return +l}l=e*+g[d+52>>2]*+g[b+132>>2]*+g[b+116>>2];k=e*+g[d+56>>2]*+g[b+136>>2]*+g[b+120>>2];g[b+144>>2]=+g[b+112>>2]*e*+g[d+48>>2]*+g[b+128>>2]+ +g[b+144>>2];g[b+148>>2]=l+ +g[b+148>>2];g[b+152>>2]=k+ +g[b+152>>2];k=e*+g[b+100>>2]*+g[d+84>>2];l=e*+g[b+104>>2]*+g[d+88>>2];g[b+160>>2]=e*+g[b+96>>2]*+g[d+80>>2]+ +g[b+160>>2];g[b+164>>2]=k+ +g[b+164>>2];g[b+168>>2]=l+ +g[b+168>>2];l=e;return +l}function Hg(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=+f;h=h|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0;o=l;l=l+16|0;c[b>>2]=5168;a[b+216>>0]=1;c[b+212>>2]=0;c[b+204>>2]=0;c[b+208>>2]=0;c[b+8>>2]=d;c[b+256>>2]=0;c[b+260>>2]=0;c[b+264>>2]=1065353216;g[b+268>>2]=0.0;c[b+272>>2]=0;c[b+276>>2]=0;c[b+280>>2]=1065353216;g[b+284>>2]=0.0;g[b+64>>2]=.019999999552965164;c[b+68>>2]=0;c[b+68+4>>2]=0;c[b+68+8>>2]=0;c[b+68+12>>2]=0;c[b+100>>2]=0;c[b+100+4>>2]=0;c[b+100+8>>2]=0;c[b+100+12>>2]=0;a[b+250>>0]=1;g[b+56>>2]=0.0;c[b+12>>2]=e;a[b+251>>0]=1;g[b+252>>2]=0.0;g[b+20>>2]=0.0;g[b+24>>2]=0.0;g[b+52>>2]=29.399999618530273;g[b+28>>2]=55.0;g[b+32>>2]=10.0;g[b+36>>2]=10.0;a[b+248>>0]=0;a[b+249>>0]=0;a[b+288>>0]=1;g[b+148>>2]=0.0;g[b+16>>2]=.20000000298023224;a[b+289>>0]=0;a[b+290>>0]=0;g[b+240>>2]=0.0;g[b+244>>2]=0.0;k=+g[h>>2];m=+g[h+4>>2];n=+g[h+8>>2];if(!(k*k+m*m+n*n>0.0)){ve(b,h);h=b+60|0;g[h>>2]=f;h=b+44|0;g[h>>2]=.7853981852531433;b=b+48|0;g[b>>2]=.7071067690849304;l=o;return}i=1.0/+D(+(k*k+m*m+n*n));j=n*i*-29.399999618530273*n*i*-29.399999618530273+(k*i*-29.399999618530273*k*i*-29.399999618530273+m*i*-29.399999618530273*m*i*-29.399999618530273);if(j>0.0){g[o>>2]=-(k*i*-29.399999618530273);g[o+4>>2]=-(m*i*-29.399999618530273);g[o+8>>2]=-(n*i*-29.399999618530273);g[o+12>>2]=0.0;ve(b,o)}g[b+52>>2]=+D(+j);h=b+60|0;g[h>>2]=f;h=b+44|0;g[h>>2]=.7853981852531433;b=b+48|0;g[b>>2]=.7071067690849304;l=o;return}function Ig(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0;f=+g[d+100>>2];j=+g[d+16>>2];k=+g[d+20>>2];l=+g[d+24>>2];h=+g[d+108>>2];h=+g[d+112>>2]-f*+g[d+116>>2]-(j*+g[a+64>>2]+k*+g[a+68>>2]+l*+g[a+72>>2]+(+g[d>>2]*+g[a+80>>2]+ +g[d+4>>2]*+g[a+84>>2]+ +g[d+8>>2]*+g[a+88>>2]))*h-h*(+g[d+48>>2]*+g[b+64>>2]+ +g[d+52>>2]*+g[b+68>>2]+ +g[d+56>>2]*+g[b+72>>2]+(+g[d+32>>2]*+g[b+80>>2]+ +g[d+36>>2]*+g[b+84>>2]+ +g[d+40>>2]*+g[b+88>>2]));e=+g[d+120>>2];if(!(f+h>2];if(f+h>e)i=e-f;else{i=h;e=f+h}}else i=e-f;g[d+100>>2]=e;if(c[a+240>>2]|0){h=i*k*+g[a+132>>2]*+g[a+116>>2];k=i*l*+g[a+136>>2]*+g[a+120>>2];g[a+64>>2]=+g[a+112>>2]*i*j*+g[a+128>>2]+ +g[a+64>>2];g[a+68>>2]=h+ +g[a+68>>2];g[a+72>>2]=k+ +g[a+72>>2];k=i*+g[a+100>>2]*+g[d+68>>2];l=i*+g[a+104>>2]*+g[d+72>>2];g[a+80>>2]=i*+g[a+96>>2]*+g[d+64>>2]+ +g[a+80>>2];g[a+84>>2]=k+ +g[a+84>>2];g[a+88>>2]=l+ +g[a+88>>2]}if(!(c[b+240>>2]|0))return +i;l=i*+g[d+52>>2]*+g[b+132>>2]*+g[b+116>>2];k=i*+g[d+56>>2]*+g[b+136>>2]*+g[b+120>>2];g[b+64>>2]=+g[b+112>>2]*i*+g[d+48>>2]*+g[b+128>>2]+ +g[b+64>>2];g[b+68>>2]=l+ +g[b+68>>2];g[b+72>>2]=k+ +g[b+72>>2];k=i*+g[b+100>>2]*+g[d+84>>2];l=i*+g[b+104>>2]*+g[d+88>>2];g[b+80>>2]=i*+g[b+96>>2]*+g[d+80>>2]+ +g[b+80>>2];g[b+84>>2]=k+ +g[b+84>>2];g[b+88>>2]=l+ +g[b+88>>2];return +i}function Jg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c[6415]=(c[6415]|0)+1;k=(((e<<16|d)+~((e<<16|d)<<15)|0)>>>10^(e<<16|d)+~((e<<16|d)<<15))*9|0;k=((k>>>6^k)+~((k>>>6^k)<<11)|0)>>>16^(k>>>6^k)+~((k>>>6^k)<<11);l=c[b+12>>2]|0;f=c[(c[b+36>>2]|0)+((l+-1&k)<<2)>>2]|0;a:do if((f|0)!=-1){h=c[b+16>>2]|0;while(1){g=h+(f*12|0)|0;if((c[g>>2]|0)==(d|0)?(c[h+(f*12|0)+4>>2]|0)==(e|0):0)break;f=c[(c[b+56>>2]|0)+(f<<2)>>2]|0;if((f|0)==-1)break a}if(g|0){e=g;return e|0}}while(0);j=c[b+8>>2]|0;if((j|0)==(l|0)){h=l|0?l<<1:1;if((l|0)<(h|0)){if(!h){f=0;i=l}else{c[6995]=(c[6995]|0)+1;f=sc((h*12|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=c[b+8>>2]|0}if((i|0)>0){g=0;do{m=f+(g*12|0)|0;n=(c[b+16>>2]|0)+(g*12|0)|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];g=g+1|0}while((g|0)!=(i|0))}g=c[b+16>>2]|0;if(g|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=f;c[b+12>>2]=h;f=c[b+8>>2]|0}else{f=l;h=l}}else{f=j;h=l}c[b+8>>2]=f+1;g=c[b+16>>2]|0;if((l|0)<(h|0)){Nf(b);f=(c[b+12>>2]|0)+-1&k}else f=l+-1&k;c[g+(j*12|0)>>2]=d;c[g+(j*12|0)+4>>2]=e;c[g+(j*12|0)+8>>2]=0;n=(c[b+36>>2]|0)+(f<<2)|0;c[(c[b+56>>2]|0)+(j<<2)>>2]=c[n>>2];c[n>>2]=j;n=g+(j*12|0)|0;return n|0}function Kg(b){b=b|0;var d=0;d=Us(676)|0;c[d>>2]=5320;c[d+132>>2]=0;c[d+132+4>>2]=0;c[d+132+8>>2]=0;c[d+132+12>>2]=0;c[d+132+16>>2]=0;c[d+132+20>>2]=0;c[d+132+24>>2]=0;c[d+132+28>>2]=0;c[d+164>>2]=1065353216;c[d+168>>2]=1065353216;c[d+172>>2]=1065353216;g[d+176>>2]=0.0;c[d+180>>2]=0;g[d+184>>2]=999999984306749440.0;c[d+188>>2]=0;c[d+188+4>>2]=0;c[d+188+8>>2]=0;c[d+188+12>>2]=0;c[d+204>>2]=1;c[d+208>>2]=-1;c[d+212>>2]=-1;c[d+216>>2]=-1;c[d+220>>2]=1;g[d+224>>2]=0.0;g[d+228>>2]=.5;g[d+232>>2]=0.0;g[d+236>>2]=0.0;g[d+240>>2]=0.0;g[d+244>>2]=.10000000149011612;g[d+248>>2]=1.0e4;c[d+252>>2]=1;c[d+256>>2]=0;c[d+260>>2]=-1;c[d+264>>2]=-1;g[d+268>>2]=1.0;g[d+272>>2]=0.0;g[d+276>>2]=0.0;c[d+280>>2]=0;a[d+300>>0]=1;c[d+296>>2]=0;c[d+288>>2]=0;c[d+292>>2]=0;c[d+304>>2]=0;c[d+4>>2]=1065353216;c[d+8>>2]=0;c[d+8+4>>2]=0;c[d+8+8>>2]=0;c[d+8+12>>2]=0;c[d+24>>2]=1065353216;c[d+28>>2]=0;c[d+28+4>>2]=0;c[d+28+8>>2]=0;c[d+28+12>>2]=0;c[d+44>>2]=1065353216;c[d+48>>2]=0;c[d+48+4>>2]=0;c[d+48+8>>2]=0;c[d+48+12>>2]=0;c[d+48+16>>2]=0;c[d+68>>2]=1065353216;c[d+72>>2]=0;c[d+72+4>>2]=0;c[d+72+8>>2]=0;c[d+72+12>>2]=0;c[d+88>>2]=1065353216;c[d+92>>2]=0;c[d+92+4>>2]=0;c[d+92+8>>2]=0;c[d+92+12>>2]=0;c[d+108>>2]=1065353216;c[d+112>>2]=0;c[d+112+4>>2]=0;c[d+112+8>>2]=0;c[d+112+12>>2]=0;c[d+112+16>>2]=0;c[d>>2]=4324;a[d+560>>0]=1;c[d+556>>2]=0;c[d+548>>2]=0;c[d+552>>2]=0;Id(d,b);return d|0}function Lg(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0;c[6995]=(c[6995]|0)+1;b=sc((h+2|0)>>>0>268435455?18:(h+2<<4|3)+16|0)|0;if(!b)j=0;else{c[(b+4+15&-16)+-4>>2]=b;j=b+4+15&-16}k=$I((h+2|0)>>>0>1073741823?-1:h+2<<2)|0;if((h|0)>-2){b=0;do{p=+(b|0)/+(h+1|0);o=+g[e>>2];n=+g[e+4>>2];n=n+p*(+g[f+4>>2]-n);m=+g[e+8>>2];m=m+p*(+g[f+8>>2]-m);g[j+(b<<4)>>2]=o+p*(+g[f>>2]-o);g[j+(b<<4)+4>>2]=n;g[j+(b<<4)+8>>2]=m;g[j+(b<<4)+12>>2]=0.0;g[k+(b<<2)>>2]=1.0;b=b+1|0}while((b|0)<(h+2|0))}c[6995]=(c[6995]|0)+1;b=sc(1271)|0;if(!b)l=0;else{c[(b+4+15&-16)+-4>>2]=b;l=b+4+15&-16}Bc(l,d,h+2|0,j,k);if(i&1|0){g[(c[l+780>>2]|0)+88>>2]=0.0;a[l+984>>0]=1}if(i&2|0){g[(c[l+780>>2]|0)+((h+1|0)*104|0)+88>>2]=0.0;a[l+984>>0]=1}if(j|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}aJ(k);if((h+2|0)<=1)return l|0;j=l+780|0;k=l+792|0;e=l+800|0;f=l+984|0;b=1;do{r=b+-1|0;q=c[j>>2]|0;Xh(l,0);i=(c[k>>2]|0)+-1|0;d=c[e>>2]|0;c[d+(i*52|0)+24>>2]=q+(r*104|0);c[d+(i*52|0)+28>>2]=q+(b*104|0);n=+g[q+(r*104|0)+8>>2]-+g[q+(b*104|0)+8>>2];o=+g[q+(r*104|0)+12>>2]-+g[q+(b*104|0)+12>>2];p=+g[q+(r*104|0)+16>>2]-+g[q+(b*104|0)+16>>2];g[d+(i*52|0)+32>>2]=+D(+(n*n+o*o+p*p));a[f>>0]=1;b=b+1|0}while((b|0)!=(h+2|0));return l|0}function Mg(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,i=0.0,j=0,k=0.0,l=0.0,m=0.0,n=0;if(a[b+1308>>0]|0){c[d>>2]=0;c[d+4>>2]=0;return}jd(b,(c[b+28>>2]|0)+4|0,(c[b+32>>2]|0)+4|0);c[d>>2]=0;c[d+4>>2]=6;if((c[b+856>>2]|0)==0?(a[b+788>>0]|0)==0:0){e=0;f=6}else{c[d>>2]=1;c[d+4>>2]=5;e=1;f=5}if(!((c[b+860>>2]|0)==0?(a[b+789>>0]|0)==0:0)){e=e+1|0;c[d>>2]=e;f=f+-1|0;c[d+4>>2]=f}if((c[b+864>>2]|0)==0?(a[b+790>>0]|0)==0:0)n=0;else{e=e+1|0;c[d>>2]=e;f=f+-1|0;c[d+4>>2]=f;n=0}do{k=+g[b+868+(n<<6)>>2];l=+g[b+868+(n<<6)+4>>2];m=+Xj(+g[b+1192+(n<<2)>>2],k,l);g[b+868+(n<<6)+52>>2]=m;do if(!(k>l)){if(k>m){c[b+868+(n<<6)+56>>2]=1;h=b+868+(n<<6)+48|0;g[h>>2]=m-k;if(!(m-k>3.1415927410125732))if(m-k<-3.1415927410125732)i=6.2831854820251465;else{j=18;break}else i=-6.2831854820251465;g[h>>2]=m-k+i;j=18;break}h=b+868+(n<<6)+56|0;if(l>2]=2;h=b+868+(n<<6)+48|0;g[h>>2]=m-l;if(!(m-l>3.1415927410125732))if(m-l<-3.1415927410125732)i=6.2831854820251465;else{j=18;break}else i=-6.2831854820251465;g[h>>2]=m-l+i;j=18}else j=17}else{h=b+868+(n<<6)+56|0;j=17}while(0);if((j|0)==17){j=0;c[h>>2]=0;if(a[b+868+(n<<6)+44>>0]|0)j=18}if((j|0)==18){e=e+1|0;c[d>>2]=e;f=f+-1|0;c[d+4>>2]=f}n=n+1|0}while((n|0)!=3);return}function Ng(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0;k=+g[d+100>>2];f=+g[d+16>>2];h=+g[d+20>>2];i=+g[d+24>>2];j=+g[d+108>>2];j=+g[d+112>>2]-k*+g[d+116>>2]-(f*+g[a+64>>2]+h*+g[a+68>>2]+i*+g[a+72>>2]+(+g[d>>2]*+g[a+80>>2]+ +g[d+4>>2]*+g[a+84>>2]+ +g[d+8>>2]*+g[a+88>>2]))*j-j*(+g[d+48>>2]*+g[b+64>>2]+ +g[d+52>>2]*+g[b+68>>2]+ +g[d+56>>2]*+g[b+72>>2]+(+g[d+32>>2]*+g[b+80>>2]+ +g[d+36>>2]*+g[b+84>>2]+ +g[d+40>>2]*+g[b+88>>2]));l=+g[d+120>>2];e=k+j>2]=k+j>2]|0){l=e*h*+g[a+132>>2]*+g[a+116>>2];k=e*i*+g[a+136>>2]*+g[a+120>>2];g[a+64>>2]=+g[a+112>>2]*e*f*+g[a+128>>2]+ +g[a+64>>2];g[a+68>>2]=l+ +g[a+68>>2];g[a+72>>2]=k+ +g[a+72>>2];k=e*+g[a+100>>2]*+g[d+68>>2];l=e*+g[a+104>>2]*+g[d+72>>2];g[a+80>>2]=e*+g[a+96>>2]*+g[d+64>>2]+ +g[a+80>>2];g[a+84>>2]=k+ +g[a+84>>2];g[a+88>>2]=l+ +g[a+88>>2]}if(!(c[b+240>>2]|0))return +e;l=e*+g[d+52>>2]*+g[b+132>>2]*+g[b+116>>2];k=e*+g[d+56>>2]*+g[b+136>>2]*+g[b+120>>2];g[b+64>>2]=+g[b+112>>2]*e*+g[d+48>>2]*+g[b+128>>2]+ +g[b+64>>2];g[b+68>>2]=l+ +g[b+68>>2];g[b+72>>2]=k+ +g[b+72>>2];k=e*+g[b+100>>2]*+g[d+84>>2];l=e*+g[b+104>>2]*+g[d+88>>2];g[b+80>>2]=e*+g[b+96>>2]*+g[d+80>>2]+ +g[b+80>>2];g[b+84>>2]=k+ +g[b+84>>2];g[b+88>>2]=l+ +g[b+88>>2];return +e}function Og(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;k=l;l=l+96|0;g=c[b+8>>2]|0;c[d+216>>2]=g;if((g|0)==(c[b+12>>2]|0)?(j=g|0?g<<1:1,(g|0)<(j|0)):0){if(!j)i=0;else{c[6995]=(c[6995]|0)+1;g=sc((j<<2|3)+16|0)|0;if(!g)g=0;else{c[(g+4+15&-16)+-4>>2]=g;g=g+4+15&-16}i=g;g=c[b+8>>2]|0}if((g|0)>0){h=0;do{c[i+(h<<2)>>2]=c[(c[b+16>>2]|0)+(h<<2)>>2];h=h+1|0}while((h|0)!=(g|0))}h=c[b+16>>2]|0;if(h){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);g=c[b+8>>2]|0}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=i;c[b+12>>2]=j}c[(c[b+16>>2]|0)+(g<<2)>>2]=d;c[b+8>>2]=g+1;c[k+32>>2]=c[d+4>>2];c[k+32+4>>2]=c[d+4+4>>2];c[k+32+8>>2]=c[d+4+8>>2];c[k+32+12>>2]=c[d+4+12>>2];c[k+32+16>>2]=c[d+20>>2];c[k+32+16+4>>2]=c[d+20+4>>2];c[k+32+16+8>>2]=c[d+20+8>>2];c[k+32+16+12>>2]=c[d+20+12>>2];c[k+32+32>>2]=c[d+36>>2];c[k+32+32+4>>2]=c[d+36+4>>2];c[k+32+32+8>>2]=c[d+36+8>>2];c[k+32+32+12>>2]=c[d+36+12>>2];c[k+32+48>>2]=c[d+52>>2];c[k+32+48+4>>2]=c[d+52+4>>2];c[k+32+48+8>>2]=c[d+52+8>>2];c[k+32+48+12>>2]=c[d+52+12>>2];j=c[d+192>>2]|0;Vb[c[(c[j>>2]|0)+8>>2]&127](j,k+32|0,k+16|0,k);j=c[b+68>>2]|0;c[d+188>>2]=Fb[c[(c[j>>2]|0)+8>>2]&3](j,k+16|0,k,c[(c[d+192>>2]|0)+4>>2]|0,d,e,f,c[b+24>>2]|0)|0;l=k;return}function Pg(){var b=0;b=Us(344)|0;c[b>>2]=5320;c[b+132>>2]=0;c[b+132+4>>2]=0;c[b+132+8>>2]=0;c[b+132+12>>2]=0;c[b+132+16>>2]=0;c[b+132+20>>2]=0;c[b+132+24>>2]=0;c[b+132+28>>2]=0;c[b+164>>2]=1065353216;c[b+168>>2]=1065353216;c[b+172>>2]=1065353216;g[b+176>>2]=0.0;c[b+180>>2]=0;g[b+184>>2]=999999984306749440.0;c[b+188>>2]=0;c[b+188+4>>2]=0;c[b+188+8>>2]=0;c[b+188+12>>2]=0;c[b+204>>2]=1;c[b+208>>2]=-1;c[b+212>>2]=-1;c[b+216>>2]=-1;c[b+220>>2]=1;g[b+224>>2]=0.0;g[b+228>>2]=.5;g[b+232>>2]=0.0;g[b+236>>2]=0.0;g[b+240>>2]=0.0;g[b+244>>2]=.10000000149011612;g[b+248>>2]=1.0e4;c[b+256>>2]=0;c[b+260>>2]=-1;c[b+264>>2]=-1;g[b+268>>2]=1.0;g[b+272>>2]=0.0;g[b+276>>2]=0.0;c[b+280>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;c[b+304>>2]=0;c[b+4>>2]=1065353216;c[b+8>>2]=0;c[b+8+4>>2]=0;c[b+8+8>>2]=0;c[b+8+12>>2]=0;c[b+24>>2]=1065353216;c[b+28>>2]=0;c[b+28+4>>2]=0;c[b+28+8>>2]=0;c[b+28+12>>2]=0;c[b+44>>2]=1065353216;c[b+48>>2]=0;c[b+48+4>>2]=0;c[b+48+8>>2]=0;c[b+48+12>>2]=0;c[b+48+16>>2]=0;c[b+68>>2]=1065353216;c[b+72>>2]=0;c[b+72+4>>2]=0;c[b+72+8>>2]=0;c[b+72+12>>2]=0;c[b+88>>2]=1065353216;c[b+92>>2]=0;c[b+92+4>>2]=0;c[b+92+8>>2]=0;c[b+92+12>>2]=0;c[b+108>>2]=1065353216;c[b+112>>2]=0;c[b+112+4>>2]=0;c[b+112+8>>2]=0;c[b+112+12>>2]=0;c[b+112+16>>2]=0;c[b>>2]=5356;a[b+340>>0]=1;c[b+336>>2]=0;c[b+328>>2]=0;c[b+332>>2]=0;c[b+252>>2]=4;return b|0}function Qg(b){b=b|0;var d=0,e=0,f=0;c[b>>2]=4360;if(a[b+288>>0]|0?(d=c[b+220>>2]|0,Ib[c[c[d>>2]>>2]&511](d),d=c[b+220>>2]|0,d|0):0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+212>>2]|0;if(d|0?(Ib[c[c[d>>2]>>2]&511](d),e=c[b+212>>2]|0,e|0):0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}if(a[b+289>>0]|0?(f=c[b+216>>2]|0,Ib[c[c[f>>2]>>2]&511](f),f=c[b+216>>2]|0,f|0):0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}d=c[b+332>>2]|0;if(d|0){if(a[b+336>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+332>>2]=0}a[b+336>>0]=1;c[b+332>>2]=0;c[b+324>>2]=0;c[b+328>>2]=0;d=c[b+304>>2]|0;if(d|0){if(a[b+308>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+304>>2]=0}a[b+308>>0]=1;c[b+304>>2]=0;c[b+296>>2]=0;c[b+300>>2]=0;d=c[b+256>>2]|0;if(d|0){if(a[b+260>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+256>>2]=0}a[b+260>>0]=1;c[b+256>>2]=0;c[b+248>>2]=0;c[b+252>>2]=0;d=c[b+236>>2]|0;if(d|0){if(a[b+240>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+236>>2]=0}a[b+240>>0]=1;c[b+236>>2]=0;c[b+228>>2]=0;c[b+232>>2]=0;d=c[b+204>>2]|0;if(!d){a[b+208>>0]=1;c[b+204>>2]=0;c[b+196>>2]=0;f=b+200|0;c[f>>2]=0;Oj(b);return}if(a[b+208>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+204>>2]=0;a[b+208>>0]=1;c[b+204>>2]=0;c[b+196>>2]=0;f=b+200|0;c[f>>2]=0;Oj(b);return}function Rg(a,b,d,e,f,h,i,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=+j;k=k|0;l=+l;var m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0;c[a>>2]=c[h>>2];c[a+4>>2]=c[h+4>>2];c[a+8>>2]=c[h+8>>2];c[a+12>>2]=c[h+12>>2];s=+g[e+4>>2];v=+g[a+8>>2];w=+g[e+8>>2];p=+g[a+4>>2];m=+g[a>>2];r=+g[e>>2];u=(s*v-w*p)*+g[b>>2]+ +g[b+4>>2]*(w*m-v*r)+(p*r-s*m)*+g[b+8>>2];t=(s*v-w*p)*+g[b+16>>2]+(w*m-v*r)*+g[b+20>>2]+(p*r-s*m)*+g[b+24>>2];s=(s*v-w*p)*+g[b+32>>2]+(w*m-v*r)*+g[b+36>>2]+(p*r-s*m)*+g[b+40>>2];g[a+16>>2]=u;g[a+20>>2]=t;g[a+24>>2]=s;g[a+28>>2]=0.0;r=+g[f+4>>2];w=+g[f+8>>2];n=+g[f>>2];q=+g[d>>2]*(r*-v-w*-p)+ +g[d+4>>2]*(w*-m-n*-v)+(n*-p-r*-m)*+g[d+8>>2];o=(r*-v-w*-p)*+g[d+16>>2]+(w*-m-n*-v)*+g[d+20>>2]+(n*-p-r*-m)*+g[d+24>>2];m=(r*-v-w*-p)*+g[d+32>>2]+(w*-m-n*-v)*+g[d+36>>2]+(n*-p-r*-m)*+g[d+40>>2];g[a+32>>2]=q;g[a+36>>2]=o;g[a+40>>2]=m;g[a+44>>2]=0.0;u=+g[i>>2]*u;t=+g[i+4>>2]*t;s=+g[i+8>>2]*s;g[a+48>>2]=u;g[a+52>>2]=t;g[a+56>>2]=s;g[a+60>>2]=0.0;r=+g[k>>2]*q;p=+g[k+4>>2]*o;n=+g[k+8>>2]*m;g[a+64>>2]=r;g[a+68>>2]=p;g[a+72>>2]=n;g[a+76>>2]=0.0;g[a+80>>2]=u*+g[a+16>>2]+t*+g[a+20>>2]+s*+g[a+24>>2]+j+l+(r*q+p*o+n*m);return}function Sg(a,b,d){a=a|0;b=b|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;c[6414]=(c[6414]|0)+1;h=(((d<<16|b)+~((d<<16|b)<<15)|0)>>>10^(d<<16|b)+~((d<<16|b)<<15))*9|0;m=c[a+36>>2]|0;h=m+(((c[a+12>>2]|0)+-1&(((h>>>6^h)+~((h>>>6^h)<<11)|0)>>>16^(h>>>6^h)+~((h>>>6^h)<<11)))<<2)|0;g=c[h>>2]|0;if((g|0)==-1){n=0;return n|0}n=c[a+16>>2]|0;e=g;while(1){l=n+(e*12|0)|0;if((c[l>>2]|0)==(b|0)?(c[n+(e*12|0)+4>>2]|0)==(d|0):0)break;e=c[(c[a+56>>2]|0)+(e<<2)>>2]|0;if((e|0)==-1){e=0;f=13;break}}if((f|0)==13)return e|0;if(!l){n=0;return n|0}k=c[n+(e*12|0)+8>>2]|0;j=(e*12|0)/12|0;i=c[a+56>>2]|0;if((g|0)==(j|0))e=-1;else{e=g;while(1){b=c[i+(e<<2)>>2]|0;if((b|0)==(j|0))break;else e=b}}c[((e|0)==-1?h:i+(e<<2)|0)>>2]=c[i+(j<<2)>>2];f=(c[a+8>>2]|0)+-1|0;if((f|0)==(j|0)){c[a+8>>2]=j;n=k;return n|0}g=c[n+(f*12|0)+4>>2]<<16|c[n+(f*12|0)>>2];g=((g+~(g<<15)|0)>>>10^g+~(g<<15))*9|0;g=(((g>>>6^g)+~((g>>>6^g)<<11)|0)>>>16^(g>>>6^g)+~((g>>>6^g)<<11))&(c[a+12>>2]|0)+-1;b=g;d=-1;e=m;while(1){e=c[e+(b<<2)>>2]|0;if((e|0)==(f|0))break;else{b=e;d=e;e=i}}c[((d|0)==-1?m+(g<<2)|0:i+(d<<2)|0)>>2]=c[i+(f<<2)>>2];c[l>>2]=c[n+(f*12|0)>>2];c[l+4>>2]=c[n+(f*12|0)+4>>2];c[l+8>>2]=c[n+(f*12|0)+8>>2];n=(c[a+36>>2]|0)+(g<<2)|0;c[(c[a+56>>2]|0)+(j<<2)>>2]=c[n>>2];c[n>>2]=j;c[a+8>>2]=(c[a+8>>2]|0)+-1;n=k;return n|0}function Tg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0;h=l;l=l+64|0;a[d+84>>0]=0;c[h>>2]=c[b+4>>2];c[h+4>>2]=c[b+4+4>>2];c[h+8>>2]=c[b+4+8>>2];c[h+12>>2]=c[b+4+12>>2];c[h+16>>2]=c[b+20>>2];c[h+16+4>>2]=c[b+20+4>>2];c[h+16+8>>2]=c[b+20+8>>2];c[h+16+12>>2]=c[b+20+12>>2];c[h+32>>2]=c[b+36>>2];c[h+32+4>>2]=c[b+36+4>>2];c[h+32+8>>2]=c[b+36+8>>2];c[h+32+12>>2]=c[b+36+12>>2];c[h+48>>2]=c[b+52>>2];c[h+48+4>>2]=c[b+52+4>>2];c[h+48+8>>2]=c[b+52+8>>2];c[h+48+12>>2]=c[b+52+12>>2];if(e?(f=c[b+540>>2]|0,f|0):0)Ob[c[(c[f>>2]|0)+8>>2]&127](f,h);w=+g[d+156>>2];u=+g[h>>2];v=+g[d+160>>2];t=+g[h+4>>2];o=+g[d+164>>2];s=+g[h+8>>2];r=+g[h+16>>2];q=+g[h+20>>2];p=+g[h+24>>2];n=+g[h+32>>2];k=+g[h+36>>2];i=+g[h+40>>2];m=w*r+v*q+o*p+ +g[h+52>>2];j=w*n+v*k+o*i+ +g[h+56>>2];g[d+36>>2]=w*u+v*t+o*s+ +g[h+48>>2];g[d+40>>2]=m;g[d+44>>2]=j;g[d+48>>2]=0.0;j=+g[d+172>>2];m=+g[d+176>>2];o=+g[d+180>>2];g[d+52>>2]=u*j+t*m+s*o;g[d+56>>2]=j*r+m*q+o*p;g[d+60>>2]=j*n+m*k+o*i;g[d+64>>2]=0.0;o=+g[d+188>>2];m=+g[d+192>>2];j=+g[d+196>>2];g[d+68>>2]=u*o+t*m+s*j;g[d+72>>2]=o*r+m*q+j*p;g[d+76>>2]=o*n+m*k+j*i;g[d+80>>2]=0.0;l=h;return}function Ug(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=b;break a}case 10:{b=(c[d>>2]|0)+(4-1)&~(4-1);e=c[b>>2]|0;c[d>>2]=b+4;c[a>>2]=e;c[a+4>>2]=((e|0)<0)<<31>>31;break a}case 11:{b=(c[d>>2]|0)+(4-1)&~(4-1);e=c[b>>2]|0;c[d>>2]=b+4;c[a>>2]=e;c[a+4>>2]=0;break a}case 12:{f=(c[d>>2]|0)+(8-1)&~(8-1);b=c[f>>2]|0;e=c[f+4>>2]|0;c[d>>2]=f+8;c[a>>2]=b;c[a+4>>2]=e;break a}case 13:{e=(c[d>>2]|0)+(4-1)&~(4-1);f=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=(f&65535)<<16>>16;c[a+4>>2]=(((f&65535)<<16>>16|0)<0)<<31>>31;break a}case 14:{e=(c[d>>2]|0)+(4-1)&~(4-1);f=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=f&65535;c[a+4>>2]=0;break a}case 15:{e=(c[d>>2]|0)+(4-1)&~(4-1);f=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=(f&255)<<24>>24;c[a+4>>2]=(((f&255)<<24>>24|0)<0)<<31>>31;break a}case 16:{e=(c[d>>2]|0)+(4-1)&~(4-1);f=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=f&255;c[a+4>>2]=0;break a}case 17:{f=(c[d>>2]|0)+(8-1)&~(8-1);g=+h[f>>3];c[d>>2]=f+8;h[a>>3]=g;break a}case 18:{f=(c[d>>2]|0)+(8-1)&~(8-1);g=+h[f>>3];c[d>>2]=f+8;h[a>>3]=g;break a}default:break a}while(0);while(0);return}function Vg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0.0,j=0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0;w=l;l=l+2048|0;if((e|0)>0)f=0;else{l=w;return}do{g[d+(f<<4)+12>>2]=-999999984306749440.0;f=f+1|0}while((f|0)!=(e|0));p=0;do{if((xb[c[(c[a>>2]|0)+96>>2]&127](a)|0)>0){q=b+(p<<4)|0;r=b+(p<<4)+4|0;s=b+(p<<4)+8|0;t=d+(p<<4)+12|0;u=d+(p<<4)|0;o=0;do{if(((xb[c[(c[a>>2]|0)+96>>2]&127](a)|0)-o|0)<128){f=(xb[c[(c[a>>2]|0)+96>>2]&127](a)|0)-o|0;if((f|0)>0)v=10;else{i=-3402823466385288598117041.0e14;f=-1}}else{f=128;v=10}if((v|0)==10){v=0;h=0;do{Sb[c[(c[a>>2]|0)+108>>2]&127](a,h,w+(h<<4)|0);h=h+1|0}while((h|0)!=(f|0));k=+g[q>>2];m=+g[r>>2];n=+g[s>>2];h=-1;j=0;i=-3402823466385288598117041.0e14;do{x=k*+g[w+(j<<4)>>2]+m*+g[w+(j<<4)+4>>2]+n*+g[w+(j<<4)+8>>2];y=x>i;h=y?j:h;i=y?x:i;j=j+1|0}while((j|0)!=(f|0));f=h}if(i>+g[t>>2]){y=w+(f<<4)|0;c[u>>2]=c[y>>2];c[u+4>>2]=c[y+4>>2];c[u+8>>2]=c[y+8>>2];c[u+12>>2]=c[y+12>>2];g[t>>2]=i}o=o+128|0}while((o|0)<(xb[c[(c[a>>2]|0)+96>>2]&127](a)|0))}p=p+1|0}while((p|0)!=(e|0));l=w;return}function Wg(b,d){b=b|0;d=d|0;var e=0;e=ht()|0;Ij(e,5,b);c[e>>2]=4940;c[e+300>>2]=c[d>>2];c[e+300+4>>2]=c[d+4>>2];c[e+300+8>>2]=c[d+8>>2];c[e+300+12>>2]=c[d+12>>2];c[e+316>>2]=c[d+16>>2];c[e+316+4>>2]=c[d+16+4>>2];c[e+316+8>>2]=c[d+16+8>>2];c[e+316+12>>2]=c[d+16+12>>2];c[e+332>>2]=c[d+32>>2];c[e+332+4>>2]=c[d+32+4>>2];c[e+332+8>>2]=c[d+32+8>>2];c[e+332+12>>2]=c[d+32+12>>2];c[e+348>>2]=c[d+48>>2];c[e+348+4>>2]=c[d+48+4>>2];c[e+348+8>>2]=c[d+48+8>>2];c[e+348+12>>2]=c[d+48+12>>2];a[e+527>>0]=0;c[e+364>>2]=c[e+300>>2];c[e+364+4>>2]=c[e+300+4>>2];c[e+364+8>>2]=c[e+300+8>>2];c[e+364+12>>2]=c[e+300+12>>2];c[e+380>>2]=c[e+316>>2];c[e+380+4>>2]=c[e+316+4>>2];c[e+380+8>>2]=c[e+316+8>>2];c[e+380+12>>2]=c[e+316+12>>2];c[e+396>>2]=c[e+332>>2];c[e+396+4>>2]=c[e+332+4>>2];c[e+396+8>>2]=c[e+332+8>>2];c[e+396+12>>2]=c[e+332+12>>2];a[e+524>>0]=0;a[e+525>>0]=0;a[e+526>>0]=0;a[e+552>>0]=0;c[e+412>>2]=0;c[e+412+4>>2]=0;c[e+412+8>>2]=0;c[e+412+12>>2]=0;g[e+572>>2]=-1.0;g[e+444>>2]=999999984306749440.0;g[e+448>>2]=999999984306749440.0;g[e+452>>2]=999999984306749440.0;g[e+428>>2]=1.0;g[e+432>>2]=.30000001192092896;g[e+436>>2]=1.0;g[e+440>>2]=.009999999776482582;g[e+456>>2]=.05000000074505806;c[e+592>>2]=0;g[e+596>>2]=0.0;g[e+600>>2]=.699999988079071;g[e+604>>2]=0.0;return e|0}function Xg(a,b,d,e,f,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var k=0.0,m=0.0,n=0,o=0.0,p=0,q=0.0,r=0,s=0.0,t=0;r=l;l=l+16|0;g[e>>2]=3402823466385288598117041.0e14;g[f>>2]=-3402823466385288598117041.0e14;p=c[a+100>>2]|0;if((p|0)>0){n=0;do{t=c[a+108>>2]|0;s=+g[t+(n<<4)>>2]*+g[a+16>>2];q=+g[t+(n<<4)+4>>2]*+g[a+20>>2];o=+g[t+(n<<4)+8>>2]*+g[a+24>>2];k=s*+g[b>>2]+q*+g[b+4>>2]+o*+g[b+8>>2]+ +g[b+48>>2];m=s*+g[b+16>>2]+q*+g[b+20>>2]+o*+g[b+24>>2]+ +g[b+52>>2];o=s*+g[b+32>>2]+q*+g[b+36>>2]+o*+g[b+40>>2]+ +g[b+56>>2];q=k*+g[d>>2]+m*+g[d+4>>2]+o*+g[d+8>>2];if(q<+g[e>>2]){g[e>>2]=q;g[h>>2]=k;g[h+4>>2]=m;g[h+8>>2]=o;g[h+12>>2]=0.0}if(q>+g[f>>2]){g[f>>2]=q;g[i>>2]=k;g[i+4>>2]=m;g[i+8>>2]=o;g[i+12>>2]=0.0}n=n+1|0}while((n|0)!=(p|0));s=+g[f>>2];m=s;n=(g[j>>2]=s,c[j>>2]|0)}else{m=-3402823466385288598117041.0e14;n=-8388609}k=+g[e>>2];if(!(k>m)){l=r;return}c[e>>2]=n;g[f>>2]=k;c[r>>2]=c[h>>2];c[r+4>>2]=c[h+4>>2];c[r+8>>2]=c[h+8>>2];c[r+12>>2]=c[h+12>>2];c[h>>2]=c[i>>2];c[h+4>>2]=c[i+4>>2];c[h+8>>2]=c[i+8>>2];c[h+12>>2]=c[i+12>>2];c[i>>2]=c[r>>2];c[i+4>>2]=c[r+4>>2];c[i+8>>2]=c[r+8>>2];c[i+12>>2]=c[r+12>>2];l=r;return}function Yg(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+48|0;e=(c[a+52>>2]|0)+4|0;c[e>>2]=c[b>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];b=d+32+4|0;c[b>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;g[d+32>>2]=1.0;Sb[c[(c[a>>2]|0)+68>>2]&127](d+16|0,a,d+32|0);g[a+36>>2]=+g[d+16>>2]+ +g[a+16>>2];g[d+32>>2]=-1.0;Sb[c[(c[a>>2]|0)+68>>2]&127](d,a,d+32|0);c[d+16>>2]=c[d>>2];c[d+16+4>>2]=c[d+4>>2];c[d+16+8>>2]=c[d+8>>2];c[d+16+12>>2]=c[d+12>>2];g[a+20>>2]=+g[d+16>>2]-+g[a+16>>2];c[d+32>>2]=0;c[d+32+4>>2]=0;c[d+32+8>>2]=0;c[d+32+12>>2]=0;g[b>>2]=1.0;Sb[c[(c[a>>2]|0)+68>>2]&127](d+16|0,a,d+32|0);g[a+40>>2]=+g[d+16+4>>2]+ +g[a+16>>2];g[b>>2]=-1.0;Sb[c[(c[a>>2]|0)+68>>2]&127](d,a,d+32|0);c[d+16>>2]=c[d>>2];c[d+16+4>>2]=c[d+4>>2];c[d+16+8>>2]=c[d+8>>2];c[d+16+12>>2]=c[d+12>>2];g[a+24>>2]=+g[d+16+4>>2]-+g[a+16>>2];c[d+32>>2]=0;c[d+32+4>>2]=0;c[d+32+8>>2]=0;c[d+32+12>>2]=0;g[d+32+8>>2]=1.0;Sb[c[(c[a>>2]|0)+68>>2]&127](d+16|0,a,d+32|0);g[a+44>>2]=+g[d+16+8>>2]+ +g[a+16>>2];g[d+32+8>>2]=-1.0;Sb[c[(c[a>>2]|0)+68>>2]&127](d,a,d+32|0);c[d+16>>2]=c[d>>2];c[d+16+4>>2]=c[d+4>>2];c[d+16+8>>2]=c[d+8>>2];c[d+16+12>>2]=c[d+12>>2];g[a+28>>2]=+g[d+16+8>>2]-+g[a+16>>2];l=d;return}function Zg(b,d,e){b=b|0;d=+d;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0;f=c[b+8>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}f=c[b+12>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}f=c[b+20>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}f=c[b+24>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}f=c[b+156>>2]|0;c[b+156>>2]=f+1;a[b+152>>0]=(f|0)>=(c[b+160>>2]|0)&1;if(f|0){c[b+72>>2]=0;c[b+72+4>>2]=0;c[b+72+8>>2]=0;c[b+72+12>>2]=0;c[b+72+16>>2]=0;c[b+72+20>>2]=0;c[b+72+24>>2]=0;c[b+72+28>>2]=0;return}j=+g[b+64>>2];i=1.0/d*+g[b+72>>2]*j;h=1.0/d*j*+g[b+76>>2];d=1.0/d*j*+g[b+80>>2];g[b+72>>2]=i;g[b+76>>2]=h;g[b+80>>2]=d;g[b+84>>2]=0.0;j=+g[b+68>>2];if(j>0.0){l=j*i*+g[b+120>>2]+j*h*+g[b+124>>2]+j*d*+g[b+128>>2];k=j*i*+g[b+136>>2]+j*h*+g[b+140>>2]+j*d*+g[b+144>>2];g[b+88>>2]=j*i*+g[b+104>>2]+j*h*+g[b+108>>2]+j*d*+g[b+112>>2];g[b+92>>2]=l;g[b+96>>2]=k;g[b+100>>2]=0.0;g[b+72>>2]=(1.0-j)*i;g[b+76>>2]=(1.0-j)*h;g[b+80>>2]=(1.0-j)*d;i=(1.0-j)*i;h=(1.0-j)*h;d=(1.0-j)*d}g[b+72>>2]=1.0/+(e|0)*i;g[b+76>>2]=1.0/+(e|0)*h;g[b+80>>2]=1.0/+(e|0)*d;return}function _g(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0,j=0,k=0.0,m=0,n=0,o=0.0,p=0.0,q=0,r=0;n=l;l=l+16|0;if((f|0)>-3&(f+3|0)>-1){c[6995]=(c[6995]|0)+1;a=sc((f+3<<4|3)+16|0)|0;if(!a)m=0;else{c[(a+4+15&-16)+-4>>2]=a;m=a+4+15&-16}a=0;do{j=m+(a<<4)|0;c[j>>2]=c[n>>2];c[j+4>>2]=c[n+4>>2];c[j+8>>2]=c[n+8>>2];c[j+12>>2]=c[n+12>>2];a=a+1|0}while((a|0)!=(f+3|0));i=0;j=m;while(1){if(!i)h=0.0;else{a=i;h=0.0;k=.5;while(1){h=(a&1|0)==0?h:h+k;a=a>>1;if(!a)break;else k=k*.5}}k=h*2.0+-1.0;o=(+(i<<1|0)*3.1415927410125732+3.1415927410125732)/+(f+3|0);p=+D(+(1.0-k*k));h=p*+G(+o);g[j>>2]=p*+F(+o);g[j+4>>2]=h;g[j+8>>2]=k;g[j+12>>2]=0.0;i=i+1|0;if((i|0)==(f+3|0)){j=m;i=m;break}else j=j+16|0}}else{j=0;i=0}if((f|0)>-3){a=0;do{r=j+(a<<4)|0;q=j+(a<<4)+4|0;m=j+(a<<4)+8|0;o=+g[q>>2]*+g[e+4>>2]+ +g[d+4>>2];p=+g[m>>2]*+g[e+8>>2]+ +g[d+8>>2];g[r>>2]=+g[r>>2]*+g[e>>2]+ +g[d>>2];g[q>>2]=o;g[m>>2]=p;g[j+(a<<4)+12>>2]=0.0;a=a+1|0}while((a|0)<(f+3|0))}a=ic(b,j,f+3|0,1)|0;if((j|0)==0|(i|0)==0){l=n;return a|0}c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);l=n;return a|0}function $g(a){a=a|0;var b=0,d=0,e=0,f=0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0;Dl(a+1028|0);if((c[a+812>>2]|0)<=0)return;f=0;do{p=c[a+820>>2]|0;q=p+(f*44|0)|0;d=c[p+(f*44|0)+8>>2]|0;e=c[p+(f*44|0)+12>>2]|0;b=c[p+(f*44|0)+16>>2]|0;m=+g[d+8>>2];n=+g[d+12>>2];o=+g[d+16>>2];i=+g[d+20>>2];u=+g[e+8>>2];j=u>2];k=r>2];l=s>2];h=t>2];j=t>2];k=s>2];l=r>2];h=u>2]|0;if(!b){c[6995]=(c[6995]|0)+1;b=sc(63)|0;if(!b)b=0;else{c[(b+4+15&-16)+-4>>2]=b;b=b+4+15&-16}d=b;e=d+44|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(e|0))}else c[a+1032>>2]=0;c[b+32>>2]=0;c[b+36>>2]=q;c[b+40>>2]=0;g[b>>2]=j;g[b+4>>2]=k;g[b+8>>2]=l;g[b+12>>2]=h;g[b+16>>2]=m;g[b+20>>2]=n;g[b+24>>2]=o;g[b+28>>2]=i;Pe(a+1028|0,c[a+1028>>2]|0,b);c[a+1040>>2]=(c[a+1040>>2]|0)+1;c[p+(f*44|0)+40>>2]=b;f=f+1|0}while((f|0)<(c[a+812>>2]|0));return}function ah(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;h=c[a+12>>2]|0;i=c[h+(((d+b|0)/2|0)<<4)>>2]|0;j=c[h+(((d+b|0)/2|0)<<4)+4>>2]|0;k=c[h+(((d+b|0)/2|0)<<4)+8>>2]|0;f=d;e=b;while(1){while(1){g=c[h+(e<<4)+4>>2]|0;if((g|0)>=(j|0)){if((g|0)!=(j|0))break;g=c[h+(e<<4)>>2]|0;if((g|0)>=(i|0)){if((g|0)!=(i|0))break;if((c[h+(e<<4)+8>>2]|0)>=(k|0))break}}e=e+1|0}while(1){g=c[h+(f<<4)+4>>2]|0;if((j|0)>=(g|0)){if((j|0)!=(g|0))break;g=c[h+(f<<4)>>2]|0;if((i|0)>=(g|0)){if((i|0)!=(g|0))break;if((k|0)>=(c[h+(f<<4)+8>>2]|0))break}}f=f+-1|0}if((e|0)<=(f|0)){g=h+(e<<4)|0;c[m>>2]=c[g>>2];c[m+4>>2]=c[g+4>>2];c[m+8>>2]=c[g+8>>2];c[m+12>>2]=c[g+12>>2];h=h+(f<<4)|0;c[g>>2]=c[h>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];c[g+12>>2]=c[h+12>>2];h=(c[a+12>>2]|0)+(f<<4)|0;c[h>>2]=c[m>>2];c[h+4>>2]=c[m+4>>2];c[h+8>>2]=c[m+8>>2];c[h+12>>2]=c[m+12>>2];f=f+-1|0;e=e+1|0}if((e|0)>(f|0))break;h=c[a+12>>2]|0}if((f|0)>(b|0))ah(a,b,f);if((e|0)>=(d|0)){l=m;return}ah(a,e,d);l=m;return}function bh(a,b,d,e,f,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var k=0.0,m=0.0,n=0,o=0.0,p=0.0,q=0,r=0,s=0.0,t=0;r=l;l=l+16|0;g[e>>2]=3402823466385288598117041.0e14;g[f>>2]=-3402823466385288598117041.0e14;q=c[a+8>>2]|0;if((q|0)>0){n=0;do{t=c[a+16>>2]|0;s=+g[t+(n<<4)>>2];p=+g[t+(n<<4)+4>>2];o=+g[t+(n<<4)+8>>2];k=s*+g[b>>2]+p*+g[b+4>>2]+o*+g[b+8>>2]+ +g[b+48>>2];m=s*+g[b+16>>2]+p*+g[b+20>>2]+o*+g[b+24>>2]+ +g[b+52>>2];o=s*+g[b+32>>2]+p*+g[b+36>>2]+o*+g[b+40>>2]+ +g[b+56>>2];p=k*+g[d>>2]+m*+g[d+4>>2]+o*+g[d+8>>2];if(p<+g[e>>2]){g[e>>2]=p;g[h>>2]=k;g[h+4>>2]=m;g[h+8>>2]=o;g[h+12>>2]=0.0}if(p>+g[f>>2]){g[f>>2]=p;g[i>>2]=k;g[i+4>>2]=m;g[i+8>>2]=o;g[i+12>>2]=0.0}n=n+1|0}while((n|0)!=(q|0));s=+g[f>>2];m=s;n=(g[j>>2]=s,c[j>>2]|0)}else{m=-3402823466385288598117041.0e14;n=-8388609}k=+g[e>>2];if(!(k>m)){l=r;return}c[e>>2]=n;g[f>>2]=k;c[r>>2]=c[h>>2];c[r+4>>2]=c[h+4>>2];c[r+8>>2]=c[h+8>>2];c[r+12>>2]=c[h+12>>2];c[h>>2]=c[i>>2];c[h+4>>2]=c[i+4>>2];c[h+8>>2]=c[i+8>>2];c[h+12>>2]=c[i+12>>2];c[i>>2]=c[r>>2];c[i+4>>2]=c[r+4>>2];c[i+8>>2]=c[r+8>>2];c[i+12>>2]=c[r+12>>2];l=r;return}function ch(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=c[a+548>>2]|0;if((f|0)<=0)return;g=c[a+556>>2]|0;d=0;while(1){if((c[g+(d<<2)>>2]|0)==(b|0))break;d=d+1|0;if((d|0)>=(f|0)){e=25;break}}if((e|0)==25)return;if((d|0)<(f|0))d=0;else return;while(1){if((c[g+(d<<2)>>2]|0)==(b|0))break;d=d+1|0;if((d|0)>=(f|0)){d=f;break}}if((f|0)>(d|0)){d=g+(d<<2)|0;e=c[d>>2]|0;c[d>>2]=c[g+(f+-1<<2)>>2];c[(c[a+556>>2]|0)+(f+-1<<2)>>2]=e;c[a+548>>2]=f+-1}g=c[b+28>>2]|0;b=c[b+32>>2]|0;if((g|0)==(a|0)){d=c[a+288>>2]|0;a:do if((d|0)>0){f=c[a+296>>2]|0;e=0;while(1){if((c[f+(e<<2)>>2]|0)==(b|0))break a;e=e+1|0;if((e|0)>=(d|0)){e=d;break}}}else e=d;while(0);if((d|0)>(e|0)){f=c[a+296>>2]|0;g=f+(e<<2)|0;b=c[g>>2]|0;c[g>>2]=c[f+(d+-1<<2)>>2];c[(c[a+296>>2]|0)+(d+-1<<2)>>2]=b;c[a+288>>2]=d+-1;d=d+-1|0}c[a+280>>2]=(d|0)>0&1;return}else{d=c[b+288>>2]|0;b:do if((d|0)>0){f=c[b+296>>2]|0;e=0;while(1){if((c[f+(e<<2)>>2]|0)==(g|0))break b;e=e+1|0;if((e|0)>=(d|0)){e=d;break}}}else e=d;while(0);if((d|0)>(e|0)){f=c[b+296>>2]|0;g=f+(e<<2)|0;a=c[g>>2]|0;c[g>>2]=c[f+(d+-1<<2)>>2];c[(c[b+296>>2]|0)+(d+-1<<2)>>2]=a;c[b+288>>2]=d+-1;d=d+-1|0}c[b+280>>2]=(d|0)>0&1;return}}function dh(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,h=0.0,i=0,j=0;j=c[a+28>>2]|0;i=0;e=0.0;f=0.0;h=0.0;a:while(1){switch(i|0){case 0:{e=+g[a+80>>2]+ +g[a+64>>2];f=+g[a+84>>2]+ +g[a+68>>2];h=+g[a+88>>2]+ +g[a+72>>2];break}case 1:{e=+g[a+80>>2]+ +g[a+64>>2];f=+g[a+84>>2]+ +g[a+68>>2];h=+g[a+72>>2]-+g[a+88>>2];break}case 2:{e=+g[a+80>>2]+ +g[a+64>>2];f=+g[a+68>>2]-+g[a+84>>2];h=+g[a+88>>2]+ +g[a+72>>2];break}case 3:{e=+g[a+80>>2]+ +g[a+64>>2];f=+g[a+68>>2]-+g[a+84>>2];h=+g[a+72>>2]-+g[a+88>>2];break}case 4:{e=+g[a+64>>2]-+g[a+80>>2];f=+g[a+84>>2]+ +g[a+68>>2];h=+g[a+88>>2]+ +g[a+72>>2];break}case 5:{e=+g[a+64>>2]-+g[a+80>>2];f=+g[a+84>>2]+ +g[a+68>>2];h=+g[a+72>>2]-+g[a+88>>2];break}case 6:{e=+g[a+64>>2]-+g[a+80>>2];f=+g[a+68>>2]-+g[a+84>>2];h=+g[a+88>>2]+ +g[a+72>>2];break}case 7:{e=+g[a+64>>2]-+g[a+80>>2];f=+g[a+68>>2]-+g[a+84>>2];h=+g[a+72>>2]-+g[a+88>>2];break}default:{}}if((j|0)>0){d=c[a+36>>2]|0;b=0;do{if(+g[d+(b*36|0)+32>>2]+(e*+g[d+(b*36|0)+20>>2]+f*+g[d+(b*36|0)+24>>2]+h*+g[d+(b*36|0)+28>>2])>0.0){b=0;d=16;break a}b=b+1|0}while((b|0)<(j|0))}i=i+1|0;if((i|0)>=8){b=1;d=16;break}}if((d|0)==16)return b|0;return 0}function eh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+32|0;j=(a[b+68>>0]|0)!=0;k=j?e:d;j=j?d:e;h=c[k+4>>2]|0;i=c[h+20>>2]|0;g=c[b+52>>2]|0;if((g|0)<(i|0)){if((c[b+56>>2]|0)<(i|0)){if(!i){d=0;f=g}else{c[6995]=(c[6995]|0)+1;d=sc((i<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=c[b+52>>2]|0}if((f|0)>0){e=0;do{c[d+(e<<2)>>2]=c[(c[b+60>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0))}e=c[b+60>>2]|0;if(e|0){if(a[b+64>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+60>>2]=0}a[b+64>>0]=1;c[b+60>>2]=d;c[b+56>>2]=i;e=b+60|0}else e=b+60|0;d=g;do{c[(c[e>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(i|0))}c[b+52>>2]=i;if((i|0)<=0){l=m;return}d=0;do{if(!(c[h+68>>2]|0)){e=c[(c[h+28>>2]|0)+(d*80|0)+64>>2]|0;f=c[k+8>>2]|0;g=c[k+12>>2]|0;c[m>>2]=k;c[m+4>>2]=e;c[m+8>>2]=f;c[m+12>>2]=g;c[m+16>>2]=-1;c[m+20>>2]=d;g=c[b+4>>2]|0;g=Db[c[(c[g>>2]|0)+8>>2]&1](g,m,j,c[b+72>>2]|0,1)|0;c[(c[b+60>>2]|0)+(d<<2)>>2]=g}else c[(c[b+60>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(i|0));l=m;return}function fh(a,b,e){a=a|0;b=b|0;e=e|0;fi(a,b,e)|0;c[b+52>>2]=c[a+48>>2];c[b+56>>2]=c[a+52>>2];c[b+60>>2]=c[a+56>>2];c[b+64>>2]=c[a+60>>2];c[b+68>>2]=c[a+64>>2];c[b+72>>2]=c[a+68>>2];c[b+76>>2]=c[a+72>>2];c[b+80>>2]=c[a+76>>2];c[b+84>>2]=c[a+80>>2];c[b+88>>2]=c[a+84>>2];c[b+92>>2]=c[a+88>>2];c[b+96>>2]=c[a+92>>2];c[b+100>>2]=c[a+96>>2];c[b+104>>2]=c[a+100>>2];c[b+108>>2]=c[a+104>>2];c[b+112>>2]=c[a+108>>2];c[b+116>>2]=c[a+112>>2];c[b+120>>2]=c[a+116>>2];c[b+124>>2]=c[a+120>>2];c[b+128>>2]=c[a+124>>2];c[b+132>>2]=c[a+128>>2];c[b+136>>2]=c[a+132>>2];c[b+140>>2]=c[a+136>>2];c[b+144>>2]=c[a+140>>2];c[b+148>>2]=c[a+144>>2];c[b+152>>2]=c[a+148>>2];c[b+156>>2]=c[a+152>>2];c[b+160>>2]=c[a+156>>2];c[b+164>>2]=c[a+160>>2];c[b+168>>2]=c[a+164>>2];c[b+172>>2]=c[a+168>>2];c[b+176>>2]=c[a+172>>2];c[b+228>>2]=c[a+868>>2];c[b+212>>2]=c[a+872>>2];c[b+196>>2]=c[a+680>>2];c[b+180>>2]=c[a+696>>2];c[b+232>>2]=c[a+932>>2];c[b+216>>2]=c[a+936>>2];c[b+200>>2]=c[a+684>>2];c[b+184>>2]=c[a+700>>2];c[b+236>>2]=c[a+996>>2];c[b+220>>2]=c[a+1e3>>2];c[b+204>>2]=c[a+688>>2];c[b+188>>2]=c[a+704>>2];c[b+244>>2]=d[a+1300>>0];c[b+248>>2]=d[a+1301>>0];return 12393}function gh(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;e=c[b+32>>2]|0;if(!e)f=0;else f=c[b+40>>2]|0;i=c[b+52>>2]|0;if(!i)g=0;else g=c[b+60>>2]|0;d=c[b+72>>2]|0;if(!d)h=0;else h=c[b+80>>2]|0;j=c[b+8>>2]|0;+wb[c[(c[j>>2]|0)+12>>2]&3](j,f,e,g,i,h,d,c[b+4>>2]|0,c[b+20>>2]|0,c[b+24>>2]|0);d=c[b+32>>2]|0;if((d|0)<0){if((c[b+36>>2]|0)<0){e=c[b+40>>2]|0;if(e|0){if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+40>>2]=0}a[b+44>>0]=1;c[b+40>>2]=0;c[b+36>>2]=0}do{c[(c[b+40>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=0)}c[b+32>>2]=0;d=c[b+52>>2]|0;if((d|0)<0){if((c[b+56>>2]|0)<0){e=c[b+60>>2]|0;if(e|0){if(a[b+64>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+60>>2]=0}a[b+64>>0]=1;c[b+60>>2]=0;c[b+56>>2]=0}do{c[(c[b+60>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=0)}c[b+52>>2]=0;d=c[b+72>>2]|0;if((d|0)>=0){c[b+72>>2]=0;return}if((c[b+76>>2]|0)<0){e=c[b+80>>2]|0;if(e|0){if(a[b+84>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+80>>2]=0}a[b+84>>0]=1;c[b+80>>2]=0;c[b+76>>2]=0}do{c[(c[b+80>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=0);c[b+72>>2]=0;return}function hh(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;c[6995]=(c[6995]|0)+1;d=sc(39)|0;if(!d)g=0;else{c[(d+4+15&-16)+-4>>2]=d;g=d+4+15&-16}h=g;c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0;if((c[b+932>>2]|0)>0){i=c[c[b+940>>2]>>2]|0;c[g>>2]=c[i>>2];c[g+4>>2]=c[i+4>>2];c[g+8>>2]=c[i+8>>2];c[g+12>>2]=c[i+12>>2];c[g+16>>2]=c[i+16>>2]}else{c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0}e=c[b+932>>2]|0;if((e|0)!=(c[b+936>>2]|0)){i=e;f=b+940|0;f=c[f>>2]|0;f=f+(i<<2)|0;c[f>>2]=h;i=i+1|0;c[b+932>>2]=i;return g|0}i=e|0?e<<1:1;if((e|0)>=(i|0)){i=e;f=b+940|0;f=c[f>>2]|0;f=f+(i<<2)|0;c[f>>2]=h;i=i+1|0;c[b+932>>2]=i;return g|0}if(!i)d=0;else{c[6995]=(c[6995]|0)+1;d=sc((i<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}e=c[b+932>>2]|0}if((e|0)>0){f=0;do{c[d+(f<<2)>>2]=c[(c[b+940>>2]|0)+(f<<2)>>2];f=f+1|0}while((f|0)!=(e|0))}f=c[b+940>>2]|0;if(f){if(a[b+944>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);e=c[b+932>>2]|0}c[b+940>>2]=0}a[b+944>>0]=1;c[b+940>>2]=d;c[b+936>>2]=i;i=e;f=b+940|0;f=c[f>>2]|0;f=f+(i<<2)|0;c[f>>2]=h;i=i+1|0;c[b+932>>2]=i;return g|0}function ih(b,d){b=b|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;e=c[b+4>>2]|0;if((e|0)==(c[b+8>>2]|0)){Of(b,e|0?e<<1:1);e=c[b+4>>2]|0}o=c[b+12>>2]|0;j=o+(e*36|0)+16|0;a[j>>0]=1;k=o+(e*36|0)+12|0;c[k>>2]=0;n=o+(e*36|0)+4|0;c[n>>2]=0;l=o+(e*36|0)+8|0;c[l>>2]=0;p=c[d+4>>2]|0;if((p|0)<=0){c[n>>2]=p;p=o+(e*36|0)+20|0;d=d+20|0;c[p>>2]=c[d>>2];c[p+4>>2]=c[d+4>>2];c[p+8>>2]=c[d+8>>2];c[p+12>>2]=c[d+12>>2];d=c[b+4>>2]|0;d=d+1|0;c[b+4>>2]=d;return}c[6995]=(c[6995]|0)+1;f=sc((p<<2|3)+16|0)|0;if(!f)g=0;else{c[(f+4+15&-16)+-4>>2]=f;g=f+4+15&-16}h=c[n>>2]|0;i=c[k>>2]|0;if((h|0)<=0){if(i|0)m=10}else{f=0;do{c[g+(f<<2)>>2]=c[i+(f<<2)>>2];f=f+1|0}while((f|0)!=(h|0));m=10}if((m|0)==10?a[j>>0]|0:0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}a[j>>0]=1;c[k>>2]=g;c[l>>2]=p;Yk(g|0,0,p<<2|0)|0;h=c[k>>2]|0;c[n>>2]=p;g=c[d+12>>2]|0;f=0;do{c[h+(f<<2)>>2]=c[g+(f<<2)>>2];f=f+1|0}while((f|0)!=(p|0));p=o+(e*36|0)+20|0;d=d+20|0;c[p>>2]=c[d>>2];c[p+4>>2]=c[d+4>>2];c[p+8>>2]=c[d+8>>2];c[p+12>>2]=c[d+12>>2];d=c[b+4>>2]|0;d=d+1|0;c[b+4>>2]=d;return}function jh(b,d){b=b|0;d=+d;var e=0,f=0,h=0,i=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0;e=c[b+248>>2]|0;if((e|0)<=0)return;k=(a[28564]|0)==0;j=0;do{i=c[(c[b+256>>2]|0)+(j<<2)>>2]|0;a:do if(i){f=c[i+220>>2]|0;b:do switch(f|0){case 4:case 2:{if((f|0)==4)break a;break}default:{o=+g[i+372>>2];n=+g[i+376>>2];m=+g[i+380>>2];l=+g[i+532>>2];if(o*o+n*n+m*m>2],m=+g[i+392>>2],n=+g[i+396>>2],o=+g[i+536>>2],l*l+m*m+n*n>2]=+g[i+224>>2]+d;break b}g[i+224>>2]=0.0;if((f&-2|0)!=4){c[i+220>>2]=0;f=0}}}while(0);h=f&-2;do if(k){if((h|0)!=2?!(+g[i+224>>2]>2.0):0)break;if(c[i+204>>2]&3|0){if((h|0)==4)break a;c[i+220>>2]=2;break a}if((f|0)==1){if((h|0)==4)break a;c[i+220>>2]=3;break a}else{if((f|0)!=2)break a;e=(c[i+304>>2]|0)+2|0;c[i+388>>2]=0;c[i+388+4>>2]=0;c[i+388+8>>2]=0;c[i+388+12>>2]=0;c[i+304>>2]=e;c[i+372>>2]=0;c[i+372+4>>2]=0;c[i+372+8>>2]=0;c[i+372+12>>2]=0;e=c[b+248>>2]|0;break a}}while(0);if((h|0)!=4)c[i+220>>2]=1}while(0);j=j+1|0}while((j|0)<(e|0));return}function kh(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,k=0,l=0,m=0.0,n=0,o=0,p=0.0,q=0.0;Vb[c[(c[a>>2]|0)+8>>2]&127](a,b,f,h);n=c[h>>2]|0;k=c[h+4>>2]|0;b=c[h+8>>2]|0;l=c[f>>2]|0;o=c[f+4>>2]|0;i=c[f+8>>2]|0;m=+g[d>>2];p=+g[d+4>>2];q=+g[d+8>>2];if(m>0.0)n=(g[j>>2]=(c[j>>2]=n,+g[j>>2])+m,c[j>>2]|0);else l=(g[j>>2]=(c[j>>2]=l,+g[j>>2])+m,c[j>>2]|0);if(p>0.0){d=o;k=(g[j>>2]=(c[j>>2]=k,+g[j>>2])+p,c[j>>2]|0)}else d=(g[j>>2]=(c[j>>2]=o,+g[j>>2])+p,c[j>>2]|0);if(q>0.0)b=(g[j>>2]=(c[j>>2]=b,+g[j>>2])+q,c[j>>2]|0);else i=(g[j>>2]=(c[j>>2]=i,+g[j>>2])+q,c[j>>2]|0);m=+g[e>>2];p=+g[e+4>>2];q=+g[e+8>>2];q=+D(+(m*m+p*p+q*q));q=q*+nb[c[(c[a>>2]|0)+16>>2]&15](a);c[f>>2]=l;c[f+4>>2]=d;c[f+8>>2]=i;g[f+12>>2]=0.0;c[h>>2]=n;c[h+4>>2]=k;c[h+8>>2]=b;g[h+12>>2]=0.0;g[f>>2]=+g[f>>2]-q;g[f+4>>2]=+g[f+4>>2]-q;g[f+8>>2]=+g[f+8>>2]-q;g[h>>2]=q+ +g[h>>2];g[h+4>>2]=q+ +g[h+4>>2];g[h+8>>2]=q+ +g[h+8>>2];return}function lh(b,d,e){b=b|0;d=+d;e=e|0;var f=0,h=0.0,i=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;j=c[b+772>>2]|0;if(e){if((j|0)>0){f=c[b+780>>2]|0;e=0;do{g[f+(e*104|0)+88>>2]=0.0;e=e+1|0}while((e|0)!=(j|0))}i=c[b+812>>2]|0;if((i|0)>0){f=c[b+820>>2]|0;e=0;do{m=c[f+(e*44|0)+8>>2]|0;l=c[f+(e*44|0)+12>>2]|0;k=c[f+(e*44|0)+16>>2]|0;o=+g[m+8>>2];q=+g[m+12>>2];h=+g[m+16>>2];n=+g[l+8>>2]-o;r=+g[l+12>>2]-q;p=+g[l+16>>2]-h;o=+g[k+8>>2]-o;q=+g[k+12>>2]-q;h=+g[k+16>>2]-h;h=+D(+((n*q-r*o)*(n*q-r*o)+((r*h-p*q)*(r*h-p*q)+(p*o-n*h)*(p*o-n*h))));g[m+88>>2]=h+ +g[m+88>>2];g[l+88>>2]=h+ +g[l+88>>2];g[k+88>>2]=h+ +g[k+88>>2];e=e+1|0}while((e|0)!=(i|0))}if((j|0)<=0){m=b+984|0;a[m>>0]=1;return}f=c[b+780>>2]|0;e=0;do{m=f+(e*104|0)+88|0;g[m>>2]=1.0/+g[m>>2];e=e+1|0}while((e|0)!=(j|0))}if((j|0)<=0){m=b+984|0;a[m>>0]=1;return}f=c[b+780>>2]|0;e=0;h=0.0;do{r=+g[f+(e*104|0)+88>>2];h=h+(r>0.0?1.0/r:0.0);e=e+1|0}while((e|0)!=(j|0));h=1.0/h*d;e=0;do{m=f+(e*104|0)+88|0;g[m>>2]=+g[m>>2]/h;e=e+1|0}while((e|0)!=(j|0));m=b+984|0;a[m>>0]=1;return}function mh(a,b){a=+a;b=+b;var d=0,e=0,f=0,h=0,i=0,k=0,l=0,m=0;l=(g[j>>2]=a,c[j>>2]|0);i=(g[j>>2]=b,c[j>>2]|0);a:do if((i<<1|0)!=0?!((l>>>23&255|0)==255|((QD(b)|0)&2147483647)>>>0>2139095040):0){if(l<<1>>>0<=i<<1>>>0)return +((l<<1|0)==(i<<1|0)?a*0.0:a);if(!(l>>>23&255)){if((l<<9|0)>-1){e=l<<9;d=0;do{d=d+-1|0;e=e<<1}while((e|0)>-1)}else d=0;e=l<<1-d}else{e=l&8388607|8388608;d=l>>>23&255}if(!(i>>>23&255)){if((i<<9|0)>-1){f=0;h=i<<9;do{f=f+-1|0;h=h<<1}while((h|0)>-1)}else f=0;k=f;i=i<<1-f}else{k=i>>>23&255;i=i&8388607|8388608}f=e-i|0;b:do if((d|0)>(k|0)){h=f;f=(f|0)>-1;while(1){if(f)if(!h)break;else e=h;e=e<<1;d=d+-1|0;f=e-i|0;if((d|0)>(k|0)){h=f;f=(f|0)>-1}else{h=(f|0)>-1;break b}}b=a*0.0;break a}else h=(f|0)>-1;while(0);if(h)if(!f){b=a*0.0;break}else e=f;if(e>>>0<8388608)do{e=e<<1;d=d+-1|0}while(e>>>0<8388608);if((d|0)>0)d=e+-8388608|d<<23;else d=e>>>(1-d|0);b=(c[j>>2]=d|l&-2147483648,+g[j>>2])}else m=3;while(0);if((m|0)==3)b=a*b/(a*b);return +b}function nh(b,e,f,h,i,j){b=b|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;var k=0;if((d[h+55>>0]|0|0)==(e|0)){h=0;return h|0}k=c[5288+(i<<2)>>2]|0;if(+g[h>>2]*+g[f+16>>2]+ +g[h+4>>2]*+g[f+20>>2]+ +g[h+8>>2]*+g[f+24>>2]-+g[h+16>>2]<-9.999999747378752e-06){e=lf(b,c[h+20+(k<<2)>>2]|0,c[h+20+(i<<2)>>2]|0,f,0)|0;if(!e){h=0;return h|0}a[e+52>>0]=i;c[e+32>>2]=h;a[h+52+i>>0]=0;c[h+32+(i<<2)>>2]=e;i=c[j>>2]|0;if(!i)c[j+4>>2]=e;else{a[i+53>>0]=2;c[i+36>>2]=e;a[e+54>>0]=1;c[e+40>>2]=i}c[j>>2]=e;c[j+8>>2]=(c[j+8>>2]|0)+1;h=1;return h|0}i=c[5300+(i<<2)>>2]|0;a[h+55>>0]=e;if(!(nh(b,e,f,c[h+32+(k<<2)>>2]|0,d[h+52+k>>0]|0,j)|0)){h=0;return h|0}if(!(nh(b,e,f,c[h+32+(i<<2)>>2]|0,d[h+52+i>>0]|0,j)|0)){h=0;return h|0}i=c[h+48>>2]|0;if(i|0)c[i+44>>2]=c[h+44>>2];i=c[h+44>>2]|0;if(i|0)c[i+48>>2]=c[h+48>>2];if((c[b+18496>>2]|0)==(h|0))c[b+18496>>2]=c[h+48>>2];c[b+18500>>2]=(c[b+18500>>2]|0)+-1;c[h+44>>2]=0;c[h+48>>2]=c[b+18504>>2];i=c[b+18504>>2]|0;if(i|0)c[i+44>>2]=h;c[b+18504>>2]=h;c[b+18508>>2]=(c[b+18508>>2]|0)+1;h=1;return h|0}function oh(a,b,d,e,f,h,i,j,k,m){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0.0,o=0.0;a=l;l=l+80|0;o=+g[h+52>>2]-+g[f+52>>2];n=+g[h+56>>2]-+g[f+56>>2];g[a+56>>2]=+g[h+48>>2]-+g[f+48>>2];g[a+56+4>>2]=o;g[a+56+8>>2]=n;g[a+56+12>>2]=0.0;if(Hc(d,f,e,h,a+56|0,a,1)|0){c[j>>2]=c[a+4>>2];c[j+4>>2]=c[a+4+4>>2];c[j+8>>2]=c[a+4+8>>2];c[j+12>>2]=c[a+4+12>>2];c[k>>2]=c[a+20>>2];c[k+4>>2]=c[a+20+4>>2];c[k+8>>2]=c[a+20+8>>2];c[k+12>>2]=c[a+20+12>>2];c[i>>2]=c[a+36>>2];c[i+4>>2]=c[a+36+4>>2];c[i+8>>2]=c[a+36+8>>2];c[i+12>>2]=c[a+36+12>>2];k=1;l=a;return k|0}if(!(Gd(d,f,e,h,a+56|0,a)|0)){k=0;l=a;return k|0}c[j>>2]=c[a+4>>2];c[j+4>>2]=c[a+4+4>>2];c[j+8>>2]=c[a+4+8>>2];c[j+12>>2]=c[a+4+12>>2];c[k>>2]=c[a+20>>2];c[k+4>>2]=c[a+20+4>>2];c[k+8>>2]=c[a+20+8>>2];c[k+12>>2]=c[a+20+12>>2];c[i>>2]=c[a+36>>2];c[i+4>>2]=c[a+36+4>>2];c[i+8>>2]=c[a+36+8>>2];c[i+12>>2]=c[a+36+12>>2];k=0;l=a;return k|0}function ph(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0,j=0,k=0,m=0.0,n=0.0,o=0,p=0,q=0.0,r=0;p=l;l=l+2048|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;e=+g[d>>2];h=+g[d+4>>2];f=+g[d+8>>2];if(e*e+h*h+f*f<9.999999747378752e-05){n=1.0;m=0.0;h=0.0}else{q=1.0/+D(+(e*e+h*h+f*f));n=e*q;m=h*q;h=f*q}if((xb[c[(c[b>>2]|0)+96>>2]&127](b)|0)<=0){l=p;return}k=0;f=-999999984306749440.0;while(1){if(((xb[c[(c[b>>2]|0)+96>>2]&127](b)|0)-k|0)<128){d=(xb[c[(c[b>>2]|0)+96>>2]&127](b)|0)-k|0;if((d|0)>0)o=8;else{e=-3402823466385288598117041.0e14;d=-1}}else{d=128;o=8}if((o|0)==8){o=0;i=0;do{Sb[c[(c[b>>2]|0)+108>>2]&127](b,i,p+(i<<4)|0);i=i+1|0}while((i|0)!=(d|0));i=-1;j=0;e=-3402823466385288598117041.0e14;do{q=n*+g[p+(j<<4)>>2]+m*+g[p+(j<<4)+4>>2]+h*+g[p+(j<<4)+8>>2];r=q>e;i=r?j:i;e=r?q:e;j=j+1|0}while((j|0)!=(d|0));d=i}if(e>f){r=p+(d<<4)|0;c[a>>2]=c[r>>2];c[a+4>>2]=c[r+4>>2];c[a+8>>2]=c[r+8>>2];c[a+12>>2]=c[r+12>>2]}else e=f;k=k+128|0;if((k|0)>=(xb[c[(c[b>>2]|0)+96>>2]&127](b)|0))break;else f=e}l=p;return}function qh(b){b=b|0;var d=0,e=0.0,f=0,h=0,i=0.0,j=0.0,k=0;k=l;l=l+64|0;if(!(a[b+290>>0]|0)){d=c[b+248>>2]|0;if((d|0)<=0){l=k;return}h=0;do{f=c[(c[b+256>>2]|0)+(h<<2)>>2]|0;switch(c[f+220>>2]|0){case 2:case 5:break;default:if((c[f+540>>2]|0)!=0?(c[f+204>>2]&3|0)==0:0){e=+g[b+280>>2];if((a[b+316>>0]|0)!=0?(j=+g[b+284>>2],j!=0.0):0)e=e-j;else e=e*+g[f+268>>2];Af(f+68|0,+g[f+132>>2],+g[f+136>>2],+g[f+140>>2],f+148|0,e,k);d=c[f+540>>2]|0;Ob[c[(c[d>>2]|0)+12>>2]&127](d,k);d=c[b+248>>2]|0}}h=h+1|0}while((h|0)<(d|0));l=k;return}else{d=c[b+8>>2]|0;if((d|0)<=0){l=k;return}h=0;do{f=c[(c[b+16>>2]|0)+(h<<2)>>2]|0;if((!((f|0)==0?1:(c[f+252>>2]&2|0)==0)?(c[f+540>>2]|0)!=0:0)?(c[f+204>>2]&3|0)==0:0){e=+g[b+280>>2];if((a[b+316>>0]|0)!=0?(i=+g[b+284>>2],i!=0.0):0)e=e-i;else e=e*+g[f+268>>2];Af(f+68|0,+g[f+132>>2],+g[f+136>>2],+g[f+140>>2],f+148|0,e,k);d=c[f+540>>2]|0;Ob[c[(c[d>>2]|0)+12>>2]&127](d,k);d=c[b+8>>2]|0}h=h+1|0}while((h|0)<(d|0));l=k;return}}function rh(b,d){b=b|0;d=d|0;var e=0,f=0,h=0.0,i=0,j=0,k=0.0,l=0.0;e=c[d+204>>2]|0;if((e&3|0)==0?(c[d+564>>2]&1|0)==0:0){h=+g[d+404>>2];if(h!=0.0){l=1.0/h*+g[b+268>>2];k=1.0/h*+g[b+272>>2];g[d+424>>2]=1.0/h*+g[b+264>>2];g[d+428>>2]=l;g[d+432>>2]=k;g[d+436>>2]=0.0}c[d+440>>2]=c[b+264>>2];c[d+440+4>>2]=c[b+264+4>>2];c[d+440+8>>2]=c[b+264+8>>2];c[d+440+12>>2]=c[b+264+12>>2]}if(!(c[d+192>>2]|0))return;if(e&1){if((c[d+220>>2]&-2|0)!=4)c[d+220>>2]=2}else{f=c[b+248>>2]|0;if((f|0)==(c[b+252>>2]|0)?(j=f|0?f<<1:1,(f|0)<(j|0)):0){if(!j)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((j<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[b+248>>2]|0}if((f|0)>0){i=0;do{c[e+(i<<2)>>2]=c[(c[b+256>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(f|0))}i=c[b+256>>2]|0;if(i){if(a[b+260>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);f=c[b+248>>2]|0}c[b+256>>2]=0}a[b+260>>0]=1;c[b+256>>2]=e;c[b+252>>2]=j;e=c[d+204>>2]|0}c[(c[b+256>>2]|0)+(f<<2)>>2]=d;c[b+248>>2]=f+1}j=(e&3|0)==0;Vb[c[(c[b>>2]|0)+36>>2]&127](b,d,j?1:2,j?-1:-3);return}function sh(a,d,f,g){a=a|0;d=d|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;i=c[a+68+(d<<2)>>2]|0;j=b[i+((f&65535)<<2)+-4>>1]|0;if((e[i+((f&65535)<<2)>>1]|0)>=(j&65535))return;k=c[a+60>>2]|0;m=k+((e[i+((f&65535)<<2)+2>>1]|0)<<6)+54+(d<<1)|0;h=i+((f&65535)<<2)+-4|0;l=i+((f&65535)<<2)|0;while(1){i=e[l+-2>>1]|0;if(!(j&1)){f=e[l+2>>1]|0;if(((((e[k+(f<<6)+54+((1<>1]|0)>=(e[k+(i<<6)+48+((1<>1]|0)?(e[k+(i<<6)+54+((1<>1]|0)>=(e[k+(f<<6)+48+((1<>1]|0):0)?(e[k+(f<<6)+54+((1<<(1<>1]|0)>=(e[k+(i<<6)+48+((1<<(1<>1]|0):0)?(e[k+(i<<6)+54+((1<<(1<>1]|0)>=(e[k+(f<<6)+48+((1<<(1<>1]|0):0)?(p=c[a+92>>2]|0,n=k+(f<<6)|0,o=k+(i<<6)|0,Cb[c[(c[p>>2]|0)+12>>2]&31](p,n,o,g)|0,p=c[a+96>>2]|0,p|0):0)Cb[c[(c[p>>2]|0)+12>>2]&31](p,n,o,g)|0;f=k+(i<<6)+48+(d<<1)|0}else f=k+(i<<6)+54+(d<<1)|0;b[f>>1]=(b[f>>1]|0)+1<<16>>16;b[m>>1]=(b[m>>1]|0)+-1<<16>>16;f=e[l>>1]|e[l+2>>1]<<16;j=e[h>>1]|e[h+2>>1]<<16;b[l>>1]=j;b[l+2>>1]=j>>>16;b[h>>1]=f;b[h+2>>1]=f>>>16;f=l+-4|0;h=h+-4|0;j=b[h>>1]|0;if((e[f>>1]|0)>=(j&65535))break;l=f;k=c[a+60>>2]|0}return}function th(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0.0,j=0,k=0,l=0,m=0.0,n=0.0;h=c[d+204>>2]|0;if((h&3|0)==0?(c[d+564>>2]&1|0)==0:0){i=+g[d+404>>2];if(i!=0.0){n=1.0/i*+g[b+268>>2];m=1.0/i*+g[b+272>>2];g[d+424>>2]=1.0/i*+g[b+264>>2];g[d+428>>2]=n;g[d+432>>2]=m;g[d+436>>2]=0.0}c[d+440>>2]=c[b+264>>2];c[d+440+4>>2]=c[b+264+4>>2];c[d+440+8>>2]=c[b+264+8>>2];c[d+440+12>>2]=c[b+264+12>>2]}if(!(c[d+192>>2]|0))return;if(h&1){if((c[d+220>>2]&-2|0)!=4)c[d+220>>2]=2}else{h=c[b+248>>2]|0;if((h|0)==(c[b+252>>2]|0)?(l=h|0?h<<1:1,(h|0)<(l|0)):0){if(!l)k=0;else{c[6995]=(c[6995]|0)+1;h=sc((l<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}k=h;h=c[b+248>>2]|0}if((h|0)>0){j=0;do{c[k+(j<<2)>>2]=c[(c[b+256>>2]|0)+(j<<2)>>2];j=j+1|0}while((j|0)!=(h|0))}j=c[b+256>>2]|0;if(j){if(a[b+260>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);h=c[b+248>>2]|0}c[b+256>>2]=0}a[b+260>>0]=1;c[b+256>>2]=k;c[b+252>>2]=l}c[(c[b+256>>2]|0)+(h<<2)>>2]=d;c[b+248>>2]=h+1}Vb[c[(c[b>>2]|0)+36>>2]&127](b,d,e,f);return}function uh(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;var h=0,i=0,j=0.0,k=0,l=0.0;l=+g[d>>2];if(+g[b>>2]<=l){j=+g[d+4>>2];if((((+g[b+4>>2]<=j?+g[b+8>>2]<=+g[d+8>>2]:0)?+g[b+16>>2]>=+g[d+16>>2]:0)?+g[b+20>>2]>=+g[d+20>>2]:0)?+g[b+24>>2]>=+g[d+24>>2]:0){d=0;return d|0}else h=d+4|0}else{h=d+4|0;j=+g[d+4>>2]}g[d>>2]=l-f;g[h>>2]=j-f;g[d+8>>2]=+g[d+8>>2]-f;g[d+16>>2]=+g[d+16>>2]+f;g[d+20>>2]=+g[d+20>>2]+f;g[d+24>>2]=+g[d+24>>2]+f;l=+g[e>>2];k=l>0.0?d+16|0:d;g[k>>2]=l+ +g[k>>2];l=+g[e+4>>2];h=l>0.0?d+20|0:h;g[h>>2]=l+ +g[h>>2];l=+g[e+8>>2];h=l>0.0?d+24|0:d+8|0;g[h>>2]=l+ +g[h>>2];h=Ag(a,b)|0;a:do if(h){k=c[a+8>>2]|0;if((k|0)<=-1){h=c[a>>2]|0;break}if(k){e=0;while(1){i=c[h+32>>2]|0;e=e+1|0;if(!i)break a;if((e|0)>=(k|0)){h=i;break}else h=i}}}else h=0;while(0);c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];c[b+24>>2]=c[d+24>>2];c[b+28>>2]=c[d+28>>2];Pe(a,h,b);d=1;return d|0}function vh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,D=0.0,E=0.0,F=0.0,G=0.0;o=(+g[a+36>>2]-+g[a+20>>2])*.5;l=(+g[a+40>>2]-+g[a+24>>2])*.5;i=(+g[a+44>>2]-+g[a+28>>2])*.5;n=+nb[c[(c[a>>2]|0)+48>>2]&15](a);k=+nb[c[(c[a>>2]|0)+48>>2]&15](a);i=i+ +nb[c[(c[a>>2]|0)+48>>2]&15](a);B=(+g[a+36>>2]+ +g[a+20>>2])*.5;z=(+g[a+40>>2]+ +g[a+24>>2])*.5;x=(+g[a+44>>2]+ +g[a+28>>2])*.5;G=+g[b>>2];w=+C(+G);F=+g[b+4>>2];v=+C(+F);t=+g[b+8>>2];u=+C(+t);E=+g[b+16>>2];s=+C(+E);D=+g[b+20>>2];r=+C(+D);p=+g[b+24>>2];q=+C(+p);A=+g[b+32>>2];m=+C(+A);y=+g[b+36>>2];j=+C(+y);f=+g[b+40>>2];h=+C(+f);t=B*G+z*F+x*t+ +g[b+48>>2];p=B*E+z*D+x*p+ +g[b+52>>2];f=B*A+z*y+x*f+ +g[b+56>>2];g[d>>2]=t-((o+n)*w+(l+k)*v+i*u);g[d+4>>2]=p-((o+n)*s+(l+k)*r+i*q);g[d+8>>2]=f-((o+n)*m+(l+k)*j+i*h);g[d+12>>2]=0.0;g[e>>2]=(o+n)*w+(l+k)*v+i*u+t;g[e+4>>2]=(o+n)*s+(l+k)*r+i*q+p;g[e+8>>2]=(o+n)*m+(l+k)*j+i*h+f;g[e+12>>2]=0.0;return}function wh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,D=0.0,E=0.0,F=0.0,G=0,H=0.0,I=0.0;I=+g[a+52>>2];z=+g[a+36>>2];H=+g[a+56>>2];x=+g[a+40>>2];F=+g[a+60>>2];v=+g[a+44>>2];G=(c[a+20>>2]|0)==0;m=+nb[c[(c[a>>2]|0)+48>>2]&15](a);k=+nb[c[(c[a>>2]|0)+48>>2]&15](a);i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);m=(G?0.0:(I-z)*.5)+m;k=(G?0.0:(H-x)*.5)+k;i=(G?0.0:(F-v)*.5)+i;E=+g[b>>2];u=+C(+E);D=+g[b+4>>2];t=+C(+D);r=+g[b+8>>2];s=+C(+r);B=+g[b+16>>2];q=+C(+B);A=+g[b+20>>2];p=+C(+A);n=+g[b+24>>2];o=+C(+n);y=+g[b+32>>2];l=+C(+y);w=+g[b+36>>2];j=+C(+w);f=+g[b+40>>2];h=+C(+f);z=G?0.0:(I+z)*.5;x=G?0.0:(H+x)*.5;v=G?0.0:(F+v)*.5;r=z*E+x*D+v*r+ +g[b+48>>2];n=z*B+x*A+v*n+ +g[b+52>>2];f=z*y+x*w+v*f+ +g[b+56>>2];g[d>>2]=r-(m*u+k*t+i*s);g[d+4>>2]=n-(m*q+k*p+i*o);g[d+8>>2]=f-(m*l+k*j+i*h);g[d+12>>2]=0.0;g[e>>2]=m*u+k*t+i*s+r;g[e+4>>2]=m*q+k*p+i*o+n;g[e+8>>2]=m*l+k*j+i*h+f;g[e+12>>2]=0.0;return}function xh(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=c[a+68+(d<<2)>>2]|0;k=c[a+60>>2]|0;l=e[h+((f&65535)<<2)+2>>1]|0;i=b[h+((f&65535)<<2)+-4>>1]|0;if((e[h+((f&65535)<<2)>>1]|0)>=(i&65535))return;g=h+((f&65535)<<2)+-4|0;j=h+((f&65535)<<2)|0;h=k;while(1){f=e[j+-2>>1]|0;if(!(i&1))f=h+(f<<6)+48+(d<<1)|0;else{if(((((e[k+(l<<6)+54+((1<>1]|0)>=(e[h+(f<<6)+48+((1<>1]|0)?(e[h+(f<<6)+54+((1<>1]|0)>=(e[k+(l<<6)+48+((1<>1]|0):0)?(e[k+(l<<6)+54+((1<<(1<>1]|0)>=(e[h+(f<<6)+48+((1<<(1<>1]|0):0)?(e[h+(f<<6)+54+((1<<(1<>1]|0)>=(e[k+(l<<6)+48+((1<<(1<>1]|0):0)?(n=c[a+92>>2]|0,m=h+(f<<6)|0,Bb[c[(c[n>>2]|0)+8>>2]&63](n,k+(l<<6)|0,m)|0,n=c[a+96>>2]|0,n|0):0)Bb[c[(c[n>>2]|0)+8>>2]&63](n,k+(l<<6)|0,m)|0;f=h+(f<<6)+54+(d<<1)|0}b[f>>1]=(b[f>>1]|0)+1<<16>>16;b[k+(l<<6)+48+(d<<1)>>1]=(b[k+(l<<6)+48+(d<<1)>>1]|0)+-1<<16>>16;f=e[j>>1]|e[j+2>>1]<<16;i=e[g>>1]|e[g+2>>1]<<16;b[j>>1]=i;b[j+2>>1]=i>>>16;b[g>>1]=f;b[g+2>>1]=f>>>16;f=j+-4|0;g=g+-4|0;i=b[g>>1]|0;if((e[f>>1]|0)>=(i&65535))break;j=f;h=c[a+60>>2]|0}return}function yh(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0,h=0,i=0,j=0,k=0;f=l;l=l+16|0;d=+g[(gJ(a)|0)>>2];e=+g[(OI(a+16|0)|0)>>2];c=+g[(NI(a+32|0)|0)>>2];if(d+e+c>0.0){e=+VI(d+e+c+1.0);g[f+12>>2]=e*.5;d=+g[(OI(a+32|0)|0)>>2];g[f>>2]=(d-+g[(NI(a+16|0)|0)>>2])*(.5/e);d=+g[(NI(a)|0)>>2];g[f+4>>2]=(d-+g[(gJ(a+32|0)|0)>>2])*(.5/e);d=+g[(gJ(a+16|0)|0)>>2];g[f+8>>2]=(d-+g[(OI(a)|0)>>2])*(.5/e);i=f+4|0;h=f+8|0;a=f+12|0;j=f;as(b,j,i,h,a);l=f;return}else{h=(d>2];k=gJ(a+((((h+1|0)>>>0)%3|0)<<4)|0)|0;e=e-+g[k+((((h+1|0)>>>0)%3|0)<<2)>>2];j=gJ(a+((((h+2|0)>>>0)%3|0)<<4)|0)|0;e=+VI(e-+g[j+((((h+2|0)>>>0)%3|0)<<2)>>2]+1.0);g[f+(h<<2)>>2]=e*.5;g[f+12>>2]=(+g[j+((((h+1|0)>>>0)%3|0)<<2)>>2]-+g[k+((((h+2|0)>>>0)%3|0)<<2)>>2])*(.5/e);g[f+((((h+1|0)>>>0)%3|0)<<2)>>2]=(+g[k+(h<<2)>>2]+ +g[i+((((h+1|0)>>>0)%3|0)<<2)>>2])*(.5/e);g[f+((((h+2|0)>>>0)%3|0)<<2)>>2]=(+g[j+(h<<2)>>2]+ +g[i+((((h+2|0)>>>0)%3|0)<<2)>>2])*(.5/e);h=f+4|0;i=f+8|0;j=f+12|0;a=f;as(b,a,h,i,j);l=f;return}}function zh(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0;j=xb[c[(c[b>>2]|0)+28>>2]&127](b)|0;i=+g[j>>2]-+g[d>>2];h=+g[j+4>>2]-+g[d+4>>2];f=+g[j+8>>2]-+g[d+8>>2];if(!(i*i+h*h+f*f>1.1920928955078125e-07))return;Yg(b,d);if((a[b+65>>0]|0)!=0?(e=c[b+56>>2]|0,Ib[c[c[e>>2]>>2]&511](e),e=c[b+56>>2]|0,(e|0)!=0):0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);e=b+56|0}else e=b+56|0;c[6995]=(c[6995]|0)+1;d=sc(191)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}c[d+52>>2]=287;a[d+60>>0]=0;a[d+80>>0]=1;c[d+76>>2]=0;c[d+68>>2]=0;c[d+72>>2]=0;a[d+100>>0]=1;c[d+96>>2]=0;c[d+88>>2]=0;c[d+92>>2]=0;a[d+120>>0]=1;c[d+116>>2]=0;c[d+108>>2]=0;c[d+112>>2]=0;a[d+140>>0]=1;c[d+136>>2]=0;c[d+128>>2]=0;c[d+132>>2]=0;c[d+144>>2]=0;a[d+164>>0]=1;c[d+160>>2]=0;c[d+152>>2]=0;c[d+156>>2]=0;c[d+168>>2]=0;c[d+4>>2]=-8388609;c[d+8>>2]=-8388609;c[d+12>>2]=-8388609;g[d+16>>2]=0.0;c[d+20>>2]=2139095039;c[d+24>>2]=2139095039;c[d+28>>2]=2139095039;g[d+32>>2]=0.0;c[d>>2]=8324;c[e>>2]=d;dd(d,c[b+52>>2]|0,(a[b+64>>0]|0)!=0,b+20|0,b+36|0);a[b+65>>0]=1;return}function Ah(b,d){b=b|0;d=d|0;var e=0.0,f=0.0;if(a[b+1309>>0]|0){e=(+g[b+1256>>2]-+g[b+1316>>2])*+g[b+1340>>2];g[b+792>>2]=e*(+g[d>>2]*+g[b+1364>>2]/+(c[d+44>>2]|0));e=+C(+e);g[b+808>>2]=e/+g[d>>2]}if(a[b+1310>>0]|0){e=(+g[b+1260>>2]-+g[b+1320>>2])*+g[b+1344>>2];g[b+796>>2]=e*(+g[d>>2]*+g[b+1368>>2]/+(c[d+44>>2]|0));e=+C(+e);g[b+812>>2]=e/+g[d>>2]}if(a[b+1311>>0]|0){e=(+g[b+1264>>2]-+g[b+1324>>2])*+g[b+1348>>2];g[b+800>>2]=e*(+g[d>>2]*+g[b+1372>>2]/+(c[d+44>>2]|0));e=+C(+e);g[b+816>>2]=e/+g[d>>2]}if(a[b+1312>>0]|0){f=-((+g[b+1192>>2]-+g[b+1328>>2])*+g[b+1352>>2]);e=+g[d>>2];g[b+876>>2]=e*+g[b+1376>>2]/+(c[d+44>>2]|0)*f;g[b+880>>2]=+C(+f)/e}if(a[b+1313>>0]|0){e=-((+g[b+1196>>2]-+g[b+1332>>2])*+g[b+1356>>2]);f=+g[d>>2];g[b+940>>2]=f*+g[b+1380>>2]/+(c[d+44>>2]|0)*e;g[b+944>>2]=+C(+e)/f}if(!(a[b+1314>>0]|0)){gg(b,d);return}e=-((+g[b+1200>>2]-+g[b+1336>>2])*+g[b+1360>>2]);f=+g[d>>2];g[b+1004>>2]=f*+g[b+1384>>2]/+(c[d+44>>2]|0)*e;g[b+1008>>2]=+C(+e)/f;gg(b,d);return}function Bh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0.0,i=0.0,j=0.0;e=l;l=l+160|0;c[e+136>>2]=0;c[e+136+4>>2]=0;c[e+136+8>>2]=0;c[e+136+12>>2]=0;c[e+136+16>>2]=0;c[e+32>>2]=7356;f=e+32+4|0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[e+32+20>>2]=1065353216;c[e+32+24>>2]=0;c[e+32+24+4>>2]=0;c[e+32+24+8>>2]=0;c[e+32+24+12>>2]=0;c[e+32+40>>2]=1065353216;c[e+32+44>>2]=0;c[e+32+44+4>>2]=0;c[e+32+44+8>>2]=0;c[e+32+44+12>>2]=0;c[e+32+60>>2]=1065353216;c[e+32+64>>2]=0;c[e+32+68>>2]=c[e+136+4>>2];c[e+32+68+4>>2]=c[e+136+4+4>>2];c[e+32+68+8>>2]=c[e+136+4+8>>2];c[e+32+68+12>>2]=c[e+136+4+12>>2];g[e+32+84>>2]=-999999984306749440.0;j=+g[d>>2];i=+g[d+4>>2];h=+g[d+8>>2];g[e+32+88>>2]=j+i*0.0+h*0.0;g[e+32+92>>2]=j*0.0+i+h*0.0;g[e+32+96>>2]=j*0.0+i*0.0+h;g[e+32+100>>2]=0.0;c[e+16>>2]=1566444395;c[e+16+4>>2]=1566444395;c[e+16+8>>2]=1566444395;g[e+16+12>>2]=0.0;d=c[(c[b>>2]|0)+64>>2]|0;g[e>>2]=-999999984306749440.0;g[e+4>>2]=-999999984306749440.0;g[e+8>>2]=-999999984306749440.0;g[e+12>>2]=0.0;Vb[d&127](b,e+32|0,e,e+16|0);c[a>>2]=c[f>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];l=e;return}function Ch(a,b,d,e,f,h,i,j,k,m){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;h=+h;i=+i;j=+j;k=+k;m=+m;var n=0;n=l;l=l+128|0;c[n+80>>2]=c[a+4>>2];c[n+80+4>>2]=c[a+20>>2];c[n+80+8>>2]=c[a+36>>2];g[n+80+12>>2]=0.0;c[n+80+16>>2]=c[a+8>>2];c[n+80+20>>2]=c[a+24>>2];c[n+80+24>>2]=c[a+40>>2];g[n+80+28>>2]=0.0;c[n+80+32>>2]=c[a+12>>2];c[n+80+36>>2]=c[a+28>>2];c[n+80+40>>2]=c[a+44>>2];g[n+80+44>>2]=0.0;c[n+32>>2]=c[b+4>>2];c[n+32+4>>2]=c[b+20>>2];c[n+32+8>>2]=c[b+36>>2];g[n+32+12>>2]=0.0;c[n+32+16>>2]=c[b+8>>2];c[n+32+20>>2]=c[b+24>>2];c[n+32+24>>2]=c[b+40>>2];g[n+32+28>>2]=0.0;c[n+32+32>>2]=c[b+12>>2];c[n+32+36>>2]=c[b+28>>2];c[n+32+40>>2]=c[b+44>>2];g[n+32+44>>2]=0.0;h=h-+g[a+56>>2];i=i-+g[a+60>>2];g[n+16>>2]=f-+g[a+52>>2];g[n+16+4>>2]=h;g[n+16+8>>2]=i;g[n+16+12>>2]=0.0;i=k-+g[b+56>>2];m=m-+g[b+60>>2];g[n>>2]=j-+g[b+52>>2];g[n+4>>2]=i;g[n+8>>2]=m;g[n+12>>2]=0.0;Rg(d,n+80|0,n+32|0,n+16|0,n,e,a+456|0,+g[a+404>>2],b+456|0,+g[b+404>>2]);l=n;return}function Dh(b,d){b=b|0;d=d|0;var e=0.0,f=0,h=0.0,i=0.0,k=0,l=0.0,m=0.0;if(a[b+48>>0]|0){c[d>>2]=0;c[d+4>>2]=0;return}c[d>>2]=4;c[d+4>>2]=2;Zc(b,(c[b+28>>2]|0)+4|0,(c[b+32>>2]|0)+4|0);g[b+1088>>2]=0.0;a[b+297>>0]=0;e=+g[b+192>>2];h=+g[b+196>>2];do if(!(e<=h))k=0;else{m=+g[b+892>>2];l=+g[b+908>>2];i=+g[b+924>>2];i=+Xj(+L(+(+g[b+832>>2]*m+ +g[b+848>>2]*l+ +g[b+864>>2]*i),+(+g[b+828>>2]*m+ +g[b+844>>2]*l+ +g[b+860>>2]*i)),e,h);g[b+1084>>2]=i;if(!(ih)e=h;else{k=0;break}g[b+1088>>2]=i-e;a[b+297>>0]=1;k=1}while(0);a[b+296>>0]=0;f=c[b+1032>>2]|0;c[b+1080>>2]=f;e=+g[b+184>>2];h=+g[b+188>>2];i=(c[j>>2]=f,+g[j>>2]);do if(!(e<=h))f=10;else{if(!(i>h)){if(!(i>2]=i-e;a[b+296>>0]=1;f=12}while(0);if((f|0)==10?(g[b+1032>>2]=0.0,a[b+1096>>0]|0):0)f=12;if((f|0)==12){c[d>>2]=(c[d>>2]|0)+1;c[d+4>>2]=(c[d+4>>2]|0)+-1}if(k<<24>>24==0?(a[b+1112>>0]|0)==0:0)return;c[d>>2]=(c[d>>2]|0)+1;c[d+4>>2]=(c[d+4>>2]|0)+-1;return}function Eh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0,s=0,t=0.0,u=0,v=0,w=0;v=l;l=l+16|0;if((e|0)<=0){l=v;return}u=0;do{c[v>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;o=c[a+56>>2]|0;w=c[a+32+(o<<2)>>2]|0;c[v+(o<<2)>>2]=w;f=+g[v>>2];i=+g[v+4>>2];h=+g[v+8>>2];q=b+(u<<4)|0;p=+g[q>>2];r=b+(u<<4)+4|0;m=+g[r>>2];s=b+(u<<4)+8|0;k=+g[s>>2];n=(c[j>>2]=w,+g[j>>2]);if(f*p+i*m+h*k>-999999984306749440.0){o=c[v+12>>2]|0;g[d+(u<<4)>>2]=f;g[d+(u<<4)+4>>2]=i;g[d+(u<<4)+8>>2]=h;c[d+(u<<4)+12>>2]=o;o=c[a+56>>2]|0;t=f*p+i*m+h*k;n=+g[a+32+(o<<2)>>2];p=+g[q>>2];m=+g[r>>2];k=+g[s>>2]}else t=-999999984306749440.0;c[v>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;g[v+(o<<2)>>2]=-n;f=+g[v>>2];i=+g[v+4>>2];h=+g[v+8>>2];if(f*p+i*m+h*k>t){w=c[v+12>>2]|0;g[d+(u<<4)>>2]=f;g[d+(u<<4)+4>>2]=i;g[d+(u<<4)+8>>2]=h;c[d+(u<<4)+12>>2]=w}u=u+1|0}while((u|0)!=(e|0));l=v;return}function Fh(a,b,d,e,f){a=a|0;b=+b;d=+d;e=+e;f=f|0;var h=0,i=0,j=0,k=0,m=0.0,n=0.0;j=l;l=l+48|0;m=1.0/+D(+(b*b+d*d+e*e));g[f>>2]=m*b;g[f+4>>2]=m*d;g[f+8>>2]=m*e;g[f+12>>2]=0.0;h=c[a+120>>2]|0;k=c[a+124>>2]|0;i=(c[a>>2]|0)+(k>>1)|0;if(k&1)h=c[(c[i>>2]|0)+h>>2]|0;Sb[h&127](j,i,f);b=-+g[f>>2];d=-+g[f+4>>2];e=-+g[f+8>>2];h=c[a+120>>2]|0;k=c[a+124>>2]|0;i=(c[a+4>>2]|0)+(k>>1)|0;if(k&1)h=c[(c[i>>2]|0)+h>>2]|0;m=+g[a+24>>2]*b+ +g[a+28>>2]*d+ +g[a+32>>2]*e;n=+g[a+40>>2]*b+ +g[a+44>>2]*d+ +g[a+48>>2]*e;g[j+16>>2]=+g[a+8>>2]*b+ +g[a+12>>2]*d+ +g[a+16>>2]*e;g[j+16+4>>2]=m;g[j+16+8>>2]=n;g[j+16+12>>2]=0.0;Sb[h&127](j+32|0,i,j+16|0);n=+g[j+32>>2];b=+g[j+32+4>>2];d=+g[j+32+8>>2];e=+g[j+4>>2]-(n*+g[a+72>>2]+b*+g[a+76>>2]+d*+g[a+80>>2]+ +g[a+108>>2]);m=+g[j+8>>2]-(n*+g[a+88>>2]+b*+g[a+92>>2]+d*+g[a+96>>2]+ +g[a+112>>2]);g[f+16>>2]=+g[j>>2]-(n*+g[a+56>>2]+b*+g[a+60>>2]+d*+g[a+64>>2]+ +g[a+104>>2]);g[f+20>>2]=e;g[f+24>>2]=m;g[f+28>>2]=0.0;l=j;return}function Gh(a,b,c,d,e,f,h,i,j,k,l,m,n,o){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;i=+i;j=+j;k=+k;l=+l;m=+m;n=+n;o=+o;var p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0;q=(j-f)*(n-h)-(k-h)*(m-f);r=(k-h)*(l-e)-(i-e)*(n-h);s=(i-e)*(m-f)-(j-f)*(l-e);if(+C(+(s*d+(q*b+r*c)))<1.1920928955078125e-07){s=-1.0;return +s}t=+g[a>>2];v=+g[a+4>>2];u=+g[a+8>>2];p=-(q*t+r*v+s*u-(s*h+(q*e+r*f)))/(s*d+(q*b+r*c));if(((p>1.1920928955078125e-06&p-1.1920928955078125e-06:0)?s*((m-(v+p*c))*(i-(t+p*b))-(j-(v+p*c))*(l-(t+p*b)))+(q*((j-(v+p*c))*(n-(u+p*d))-(k-(u+p*d))*(m-(v+p*c)))+r*((k-(u+p*d))*(l-(t+p*b))-(n-(u+p*d))*(i-(t+p*b))))>-1.1920928955078125e-06:0)?s*((f-(v+p*c))*(l-(t+p*b))-(m-(v+p*c))*(e-(t+p*b)))+(q*((m-(v+p*c))*(h-(u+p*d))-(n-(u+p*d))*(f-(v+p*c)))+r*((n-(u+p*d))*(e-(t+p*b))-(h-(u+p*d))*(l-(t+p*b))))>-1.1920928955078125e-06:0){v=p;return +v}v=-1.0;return +v}function Hh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;if(a[b+165>>0]|0){if((c[b+92>>2]|0)>=(d|0))return;if((d|0)!=0?(c[6995]=(c[6995]|0)+1,e=sc((d<<4|3)+16|0)|0,(e|0)!=0):0){c[(e+4+15&-16)+-4>>2]=e;g=e+4+15&-16}else g=0;f=c[b+88>>2]|0;if((f|0)>0){e=0;do{i=g+(e<<4)|0;h=(c[b+96>>2]|0)+(e<<4)|0;c[i>>2]=c[h>>2];c[i+4>>2]=c[h+4>>2];c[i+8>>2]=c[h+8>>2];c[i+12>>2]=c[h+12>>2];e=e+1|0}while((e|0)!=(f|0))}e=c[b+96>>2]|0;if(e|0){if(a[b+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+96>>2]=0}a[b+100>>0]=1;c[b+96>>2]=g;c[b+92>>2]=d;return}if((c[b+112>>2]|0)>=(d|0))return;if((d|0)!=0?(c[6995]=(c[6995]|0)+1,f=sc((d<<2|3)+16|0)|0,(f|0)!=0):0){c[(f+4+15&-16)+-4>>2]=f;h=f+4+15&-16}else h=0;f=c[b+108>>2]|0;g=c[b+116>>2]|0;if((f|0)<=0)if(!g)e=b+120|0;else i=21;else{e=0;do{c[h+(e<<2)>>2]=c[g+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0));i=21}if((i|0)==21){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0)}c[b+116>>2]=0;e=b+120|0}a[e>>0]=1;c[b+116>>2]=h;c[b+112>>2]=d;return}function Ih(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;if(!(a[d+164>>0]|0)){if((c[d+152>>2]|0)>=(e|0))return;if((e|0)!=0?(c[6995]=(c[6995]|0)+1,g=sc((e<<1)+19|0)|0,(g|0)!=0):0){c[(g+4+15&-16)+-4>>2]=g;i=g+4+15&-16}else i=0;g=c[d+148>>2]|0;h=c[d+156>>2]|0;if((g|0)<=0)if(!h)f=d+160|0;else j=22;else{f=0;do{b[i+(f<<1)>>1]=b[h+(f<<1)>>1]|0;f=f+1|0}while((f|0)!=(g|0));j=22}if((j|0)==22){if(a[d+160>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[d+156>>2]=0;f=d+160|0}a[f>>0]=1;c[d+156>>2]=i;c[d+152>>2]=e;return}else{if((c[d+132>>2]|0)>=(e|0))return;if((e|0)!=0?(c[6995]=(c[6995]|0)+1,f=sc((e<<2|3)+16|0)|0,(f|0)!=0):0){c[(f+4+15&-16)+-4>>2]=f;i=f+4+15&-16}else i=0;g=c[d+128>>2]|0;h=c[d+136>>2]|0;if((g|0)<=0)if(!h)f=d+140|0;else j=10;else{f=0;do{c[i+(f<<2)>>2]=c[h+(f<<2)>>2];f=f+1|0}while((f|0)!=(g|0));j=10}if((j|0)==10){if(a[d+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[d+136>>2]=0;f=d+140|0}a[f>>0]=1;c[d+136>>2]=i;c[d+132>>2]=e;return}}function Jh(a,b,d){a=a|0;b=b|0;d=d|0;fi(a,b,d)|0;c[b+52>>2]=c[a+300>>2];c[b+56>>2]=c[a+304>>2];c[b+60>>2]=c[a+308>>2];c[b+64>>2]=c[a+312>>2];c[b+68>>2]=c[a+316>>2];c[b+72>>2]=c[a+320>>2];c[b+76>>2]=c[a+324>>2];c[b+80>>2]=c[a+328>>2];c[b+84>>2]=c[a+332>>2];c[b+88>>2]=c[a+336>>2];c[b+92>>2]=c[a+340>>2];c[b+96>>2]=c[a+344>>2];c[b+100>>2]=c[a+348>>2];c[b+104>>2]=c[a+352>>2];c[b+108>>2]=c[a+356>>2];c[b+112>>2]=c[a+360>>2];c[b+116>>2]=c[a+364>>2];c[b+120>>2]=c[a+368>>2];c[b+124>>2]=c[a+372>>2];c[b+128>>2]=c[a+376>>2];c[b+132>>2]=c[a+380>>2];c[b+136>>2]=c[a+384>>2];c[b+140>>2]=c[a+388>>2];c[b+144>>2]=c[a+392>>2];c[b+148>>2]=c[a+396>>2];c[b+152>>2]=c[a+400>>2];c[b+156>>2]=c[a+404>>2];c[b+160>>2]=c[a+408>>2];c[b+164>>2]=c[a+412>>2];c[b+168>>2]=c[a+416>>2];c[b+172>>2]=c[a+420>>2];c[b+176>>2]=c[a+424>>2];c[b+180>>2]=c[a+444>>2];c[b+184>>2]=c[a+448>>2];c[b+188>>2]=c[a+452>>2];c[b+192>>2]=c[a+428>>2];c[b+196>>2]=c[a+432>>2];c[b+200>>2]=c[a+436>>2];c[b+204>>2]=c[a+440>>2];return 12643}function Kh(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0.0,h=0.0,i=0.0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0;j=l;l=l+32|0;n=+g[a+60>>2];r=+g[a+76>>2]-n;m=+g[a+64>>2];p=+g[a+80>>2]-m;k=+g[a+68>>2];s=+g[a+84>>2]-k;o=+g[a+92>>2]-n;q=+g[a+96>>2]-m;h=+g[a+100>>2]-k;i=1.0/+D(+((r*q-p*o)*(r*q-p*o)+((p*h-s*q)*(p*h-s*q)+(s*o-r*h)*(s*o-r*h))));f=i*(p*h-s*q);h=i*(s*o-r*h);i=(r*q-p*o)*i;k=i*+g[b+8>>2]+(+g[b>>2]*f+ +g[b+4>>2]*h)-(f*n+h*m+i*k);if(!(k>=-d)|!(k<=d)){b=0;l=j;return b|0}e=0;while(1){Vb[c[(c[a>>2]|0)+104>>2]&127](a,e,j+16|0,j);n=+g[j+16>>2];s=+g[j>>2]-n;p=+g[j+16+4>>2];o=+g[j+4>>2]-p;m=+g[j+16+8>>2];r=+g[j+8>>2]-m;q=1.0/+D(+((h*s-f*o)*(h*s-f*o)+((i*o-h*r)*(i*o-h*r)+(f*r-i*s)*(f*r-i*s))));e=e+1|0;if((h*s-f*o)*q*+g[b+8>>2]+(+g[b>>2]*q*(i*o-h*r)+ +g[b+4>>2]*q*(f*r-i*s))-(m*(h*s-f*o)*q+(n*q*(i*o-h*r)+p*q*(f*r-i*s)))<-d){e=0;a=5;break}if((e|0)>=3){e=1;a=5;break}}if((a|0)==5){l=j;return e|0}return 0}function Lh(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0;c[6995]=(c[6995]|0)+1;h=sc(55)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}c[j>>2]=d;c[j+4>>2]=e;c[j+8>>2]=f;c[j+12>>2]=-1;c[j+16>>2]=-1;c[j+20>>2]=-1;c[j+28>>2]=-1;g[j+32>>2]=0.0;f=j;d=c[b+4>>2]|0;c[j+24>>2]=d;if((d|0)!=(c[b+8>>2]|0)){i=d;e=b+12|0;e=c[e>>2]|0;e=e+(i<<2)|0;c[e>>2]=f;i=i+1|0;c[b+4>>2]=i;return j|0}i=d|0?d<<1:1;if((d|0)>=(i|0)){i=d;e=b+12|0;e=c[e>>2]|0;e=e+(i<<2)|0;c[e>>2]=f;i=i+1|0;c[b+4>>2]=i;return j|0}if(!i)h=0;else{c[6995]=(c[6995]|0)+1;h=sc((i<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}d=c[b+4>>2]|0}if((d|0)>0){e=0;do{c[h+(e<<2)>>2]=c[(c[b+12>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(d|0))}e=c[b+12>>2]|0;if(e){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[b+4>>2]|0}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=h;c[b+8>>2]=i;i=d;e=b+12|0;e=c[e>>2]|0;e=e+(i<<2)|0;c[e>>2]=f;i=i+1|0;c[b+4>>2]=i;return j|0}function Mh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,D=0.0,E=0.0,F=0.0;o=+nb[c[(c[a>>2]|0)+48>>2]&15](a);u=+g[a+76>>2];t=+g[a+60>>2];r=+g[a+80>>2];q=+g[a+64>>2];n=+g[a+84>>2];m=+g[a+68>>2];F=+g[b>>2];y=+C(+F);E=+g[b+4>>2];x=+C(+E);k=+g[b+8>>2];l=+C(+k);D=+g[b+16>>2];w=+C(+D);B=+g[b+20>>2];v=+C(+B);i=+g[b+24>>2];j=+C(+i);A=+g[b+32>>2];s=+C(+A);z=+g[b+36>>2];p=+C(+z);f=+g[b+40>>2];h=+C(+f);k=(u+t)*.5*F+(r+q)*.5*E+(n+m)*.5*k+ +g[b+48>>2];i=(u+t)*.5*D+(r+q)*.5*B+(n+m)*.5*i+ +g[b+52>>2];f=(u+t)*.5*A+(r+q)*.5*z+(n+m)*.5*f+ +g[b+56>>2];l=(o+(u-t)*.5)*y+(o+(r-q)*.5)*x+(o+(n-m)*.5)*l;j=(o+(u-t)*.5)*w+(o+(r-q)*.5)*v+(o+(n-m)*.5)*j;h=(o+(u-t)*.5)*s+(o+(r-q)*.5)*p+(o+(n-m)*.5)*h;g[d>>2]=k-l;g[d+4>>2]=i-j;g[d+8>>2]=f-h;g[d+12>>2]=0.0;g[e>>2]=l+k;g[e+4>>2]=j+i;g[e+8>>2]=h+f;g[e+12>>2]=0.0;return}function Nh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0;if(a[d+32>>0]&1){f=c[b+4>>2]|0;if(f|0)ll(f,d,e);f=c[b>>2]|0;if(f|0){n=+g[d>>2];l=+g[f+128>>2];m=+g[d+4>>2];k=+g[d+8>>2];h=+g[e+4>>2];p=+g[e+8>>2];o=+g[e>>2];j=+g[f+180>>2]*(k*h-m*p)+ +g[f+184>>2]*(n*p-k*o)+(m*o-n*h)*+g[f+188>>2];i=(k*h-m*p)*+g[f+196>>2]+(n*p-k*o)*+g[f+200>>2]+(m*o-n*h)*+g[f+204>>2];h=(k*h-m*p)*+g[f+212>>2]+(n*p-k*o)*+g[f+216>>2]+(m*o-n*h)*+g[f+220>>2];g[f+244>>2]=n*l+ +g[f+244>>2];g[f+248>>2]=l*m+ +g[f+248>>2];g[f+252>>2]=l*k+ +g[f+252>>2];g[f+316>>2]=n*l+ +g[f+316>>2];g[f+320>>2]=l*m+ +g[f+320>>2];g[f+324>>2]=l*k+ +g[f+324>>2];g[f+260>>2]=j+ +g[f+260>>2];g[f+264>>2]=i+ +g[f+264>>2];g[f+268>>2]=h+ +g[f+268>>2];g[f+332>>2]=j+ +g[f+332>>2];g[f+336>>2]=i+ +g[f+336>>2];g[f+340>>2]=h+ +g[f+340>>2];c[f+308>>2]=(c[f+308>>2]|0)+1}}if(!(a[d+32>>0]&2))return;aj(b,d+16|0,e);return}function Oh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;h=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=h;if(h|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;c[b+28>>2]=c[a+32>>2];c[b+32>>2]=c[a+36>>2];c[b+36>>2]=c[a+40>>2];c[b+40>>2]=c[a+44>>2];c[b+12>>2]=c[a+16>>2];c[b+16>>2]=c[a+20>>2];c[b+20>>2]=c[a+24>>2];c[b+24>>2]=c[a+28>>2];c[b+44>>2]=c[a+48>>2];c[b+48>>2]=0;g=c[a+100>>2]|0;c[b+60>>2]=g;if(!g){c[b+52>>2]=0;c[b+56>>2]=0;d=b+64|0;c[d>>2]=0;return 17203}c[b+52>>2]=zb[c[(c[d>>2]|0)+28>>2]&31](d,c[a+108>>2]|0)|0;c[b+56>>2]=0;h=Bb[c[(c[d>>2]|0)+16>>2]&63](d,16,g)|0;if((g|0)>0){e=c[a+108>>2]|0;a=c[h+8>>2]|0;f=0;while(1){c[a>>2]=c[e+(f<<4)>>2];c[a+4>>2]=c[e+(f<<4)+4>>2];c[a+8>>2]=c[e+(f<<4)+8>>2];c[a+12>>2]=c[e+(f<<4)+12>>2];f=f+1|0;if((f|0)==(g|0))break;else a=a+16|0}}else e=c[a+108>>2]|0;Zb[c[(c[d>>2]|0)+20>>2]&31](d,h,19202,1497453121,e);d=b+64|0;c[d>>2]=0;return 17203}function Ph(b){b=b|0;var d=0;d=c[b+112>>2]|0;if(d|0){if(a[b+116>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+112>>2]=0}a[b+116>>0]=1;c[b+112>>2]=0;c[b+104>>2]=0;c[b+108>>2]=0;d=c[b+92>>2]|0;if(d|0){if(a[b+96>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+92>>2]=0}a[b+96>>0]=1;c[b+92>>2]=0;c[b+84>>2]=0;c[b+88>>2]=0;d=c[b+72>>2]|0;if(d|0){if(a[b+76>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+72>>2]=0}a[b+76>>0]=1;c[b+72>>2]=0;c[b+64>>2]=0;c[b+68>>2]=0;d=c[b+52>>2]|0;if(d|0){if(a[b+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+52>>2]=0}a[b+56>>0]=1;c[b+52>>2]=0;c[b+44>>2]=0;c[b+48>>2]=0;d=c[b+32>>2]|0;if(d|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;d=c[b+12>>2]|0;if(!d){a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;b=b+8|0;c[b>>2]=0;return}if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+12>>2]=0;a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;b=b+8|0;c[b>>2]=0;return}function Qh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0;k=c[b>>2]|0;if((k|0)==(c[a+84>>2]|0)){j=1.0;return +j}if(c[k+204>>2]&4|0){j=1.0;return +j}f=+g[b+8>>2];h=+g[b+12>>2];e=+g[b+16>>2];if(d){i=f;j=h}else{i=+g[k+4>>2]*f+ +g[k+8>>2]*h+ +g[k+12>>2]*e;j=f*+g[k+20>>2]+h*+g[k+24>>2]+e*+g[k+28>>2];e=f*+g[k+36>>2]+h*+g[k+40>>2]+e*+g[k+44>>2]}if(i*+g[a+88>>2]+j*+g[a+92>>2]+e*+g[a+96>>2]<+g[a+104>>2]){j=1.0;return +j}c[a+4>>2]=c[b+40>>2];c[a+80>>2]=k;if(d){c[a+48>>2]=c[b+8>>2];c[a+48+4>>2]=c[b+8+4>>2];c[a+48+8>>2]=c[b+8+8>>2];c[a+48+12>>2]=c[b+8+12>>2]}else{e=+g[b+8>>2];f=+g[b+12>>2];h=+g[b+16>>2];i=e*+g[k+20>>2]+f*+g[k+24>>2]+h*+g[k+28>>2];j=e*+g[k+36>>2]+f*+g[k+40>>2]+h*+g[k+44>>2];g[a+48>>2]=+g[k+4>>2]*e+ +g[k+8>>2]*f+ +g[k+12>>2]*h;g[a+52>>2]=i;g[a+56>>2]=j;g[a+60>>2]=0.0}c[a+64>>2]=c[b+24>>2];c[a+64+4>>2]=c[b+24+4>>2];c[a+64+8>>2]=c[b+24+8>>2];c[a+64+12>>2]=c[b+24+12>>2];j=+g[b+40>>2];return +j}function Rh(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=c[b+16>>2]|0;if(d|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;d=c[b+36>>2]|0;if(d|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;d=c[b+56>>2]|0;if(d|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;if((c[b+12>>2]|0)>=2){Nf(b);return}c[6995]=(c[6995]|0)+1;d=sc(43)|0;if(!d)f=0;else{c[(d+4+15&-16)+-4>>2]=d;f=d+4+15&-16}e=c[b+8>>2]|0;if((e|0)>0){d=0;do{g=f+(d*12|0)|0;h=(c[b+16>>2]|0)+(d*12|0)|0;c[g>>2]=c[h>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];d=d+1|0}while((d|0)!=(e|0))}d=c[b+16>>2]|0;if(d|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=f;c[b+12>>2]=2;Nf(b);return}function Sh(a,b,e){a=a|0;b=b|0;e=e|0;fi(a,b,e)|0;c[b+52>>2]=c[a+52>>2];c[b+56>>2]=c[a+56>>2];c[b+60>>2]=c[a+60>>2];c[b+64>>2]=c[a+64>>2];c[b+68>>2]=c[a+68>>2];c[b+72>>2]=c[a+72>>2];c[b+76>>2]=c[a+76>>2];c[b+80>>2]=c[a+80>>2];c[b+84>>2]=c[a+84>>2];c[b+88>>2]=c[a+88>>2];c[b+92>>2]=c[a+92>>2];c[b+96>>2]=c[a+96>>2];c[b+100>>2]=c[a+100>>2];c[b+104>>2]=c[a+104>>2];c[b+108>>2]=c[a+108>>2];c[b+112>>2]=c[a+112>>2];c[b+116>>2]=c[a+116>>2];c[b+120>>2]=c[a+120>>2];c[b+124>>2]=c[a+124>>2];c[b+128>>2]=c[a+128>>2];c[b+132>>2]=c[a+132>>2];c[b+136>>2]=c[a+136>>2];c[b+140>>2]=c[a+140>>2];c[b+144>>2]=c[a+144>>2];c[b+148>>2]=c[a+148>>2];c[b+152>>2]=c[a+152>>2];c[b+156>>2]=c[a+156>>2];c[b+160>>2]=c[a+160>>2];c[b+164>>2]=c[a+164>>2];c[b+168>>2]=c[a+168>>2];c[b+172>>2]=c[a+172>>2];c[b+176>>2]=c[a+176>>2];c[b+180>>2]=c[a+188>>2];c[b+184>>2]=c[a+184>>2];c[b+188>>2]=c[a+196>>2];c[b+192>>2]=c[a+192>>2];c[b+196>>2]=d[a+180>>0];c[b+200>>2]=d[a+49>>0];return 12599}function Th(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;Ib[c[(c[b>>2]|0)+32>>2]&511](b);e=Bb[c[(c[b>>2]|0)+16>>2]&63](b,104,1)|0;d=c[e+8>>2]|0;f=d;g=f+104|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));c[d+88>>2]=c[a+264>>2];c[d+92>>2]=c[a+268>>2];c[d+96>>2]=c[a+272>>2];c[d+100>>2]=c[a+276>>2];c[d>>2]=c[a+92>>2];c[d+4>>2]=c[a+96>>2];c[d+8>>2]=c[a+100>>2];c[d+12>>2]=c[a+104>>2];c[d+16>>2]=c[a+108>>2];c[d+20>>2]=c[a+116>>2];c[d+24>>2]=c[a+120>>2];c[d+28>>2]=c[a+124>>2];c[d+32>>2]=c[a+128>>2];c[d+36>>2]=c[a+132>>2];c[d+40>>2]=c[a+148>>2];c[d+44>>2]=c[a+152>>2];c[d+48>>2]=c[a+156>>2];c[d+52>>2]=c[a+160>>2];c[d+56>>2]=c[a+176>>2];c[d+60>>2]=c[a+180>>2];c[d+64>>2]=c[a+112>>2];c[d+68>>2]=c[a+164>>2];c[d+72>>2]=c[a+168>>2];c[d+76>>2]=c[a+172>>2];c[d+80>>2]=c[a+144>>2];c[d+84>>2]=0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,12157,1145853764,d);id(a,b);dj(a,b);Ib[c[(c[b>>2]|0)+36>>2]&511](b);return}function Uh(a,b,c,d,e,f){a=a|0;b=+b;c=c|0;d=+d;e=+e;f=+f;var h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0;p=+g[c>>2];o=+g[c+16>>2];n=+g[c+32>>2];m=+g[c+4>>2];l=+g[c+20>>2];k=+g[c+36>>2];j=+g[c+8>>2];i=+g[c+24>>2];h=+g[c+40>>2];g[a>>2]=b-((p*0.0+o*-f+n*e)*0.0+(m*0.0+l*-f+k*e)*f+(j*0.0+i*-f+h*e)*-e);g[a+4>>2]=0.0-((p*0.0+o*-f+n*e)*-f+(m*0.0+l*-f+k*e)*0.0+(j*0.0+i*-f+h*e)*d);g[a+8>>2]=0.0-((p*0.0+o*-f+n*e)*e+(m*0.0+l*-f+k*e)*-d+(j*0.0+i*-f+h*e)*0.0);g[a+12>>2]=0.0;g[a+16>>2]=0.0-((p*f+o*0.0+n*-d)*0.0+(m*f+l*0.0+k*-d)*f+(j*f+i*0.0+h*-d)*-e);g[a+20>>2]=b-((p*f+o*0.0+n*-d)*-f+(m*f+l*0.0+k*-d)*0.0+(j*f+i*0.0+h*-d)*d);g[a+24>>2]=0.0-((p*f+o*0.0+n*-d)*e+(m*f+l*0.0+k*-d)*-d+(j*f+i*0.0+h*-d)*0.0);g[a+28>>2]=0.0;g[a+32>>2]=0.0-((p*-e+o*d+n*0.0)*0.0+(m*-e+l*d+k*0.0)*f+(j*-e+i*d+h*0.0)*-e);g[a+36>>2]=0.0-((p*-e+o*d+n*0.0)*-f+(m*-e+l*d+k*0.0)*0.0+(j*-e+i*d+h*0.0)*d);g[a+40>>2]=b-((p*-e+o*d+n*0.0)*e+(m*-e+l*d+k*0.0)*-d+(j*-e+i*d+h*0.0)*0.0);g[a+44>>2]=0.0;return}function Vh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0.0;f=l;l=l+96|0;g[f+4>>2]=1.0;c[f+8>>2]=0;c[f+12>>2]=1;c[f+16>>2]=-1;c[f+20>>2]=0;c[f>>2]=2952;c[f+24>>2]=c[b>>2];c[f+24+4>>2]=c[b+4>>2];c[f+24+8>>2]=c[b+8>>2];c[f+24+12>>2]=c[b+12>>2];c[f+40>>2]=c[d>>2];c[f+40+4>>2]=c[d+4>>2];c[f+40+8>>2]=c[d+8>>2];c[f+40+12>>2]=c[d+12>>2];a=c[a+4>>2]|0;Vb[c[(c[a>>2]|0)+32>>2]&127](a,b,d,f);a=c[f+8>>2]|0;if(!a){e=0;l=f;return e|0}if(!(c[a+252>>2]&2)){e=0;l=f;return e|0}if(c[a+204>>2]&4|0){e=0;l=f;return e|0}c[e>>2]=c[f+72>>2];c[e+4>>2]=c[f+72+4>>2];c[e+8>>2]=c[f+72+8>>2];c[e+12>>2]=c[f+72+12>>2];c[e+16>>2]=c[f+56>>2];c[e+16+4>>2]=c[f+56+4>>2];c[e+16+8>>2]=c[f+56+8>>2];c[e+16+12>>2]=c[f+56+12>>2];k=+g[e+16>>2];j=+g[e+20>>2];i=+g[e+24>>2];h=1.0/+D(+(k*k+j*j+i*i));g[e+16>>2]=k*h;g[e+20>>2]=j*h;g[e+24>>2]=i*h;c[e+32>>2]=c[f+4>>2];e=a;l=f;return e|0}function Wh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0;e=l;l=l+32|0;d=c[b+448>>2]|0;switch(c[a+448>>2]&48&d&63){case 32:{if((a|0)==(b|0)&(d&64|0)==0){l=e;return}g[e+4>>2]=1.0;c[e+8+4>>2]=0;c[e+8+4+4>>2]=0;c[e+8+4+8>>2]=0;c[e>>2]=3748;c[e+8>>2]=c[a+516>>2];d=c[a+192>>2]|0;f=+nb[c[(c[d>>2]|0)+48>>2]&15](d);d=c[b+192>>2]|0;g[e+12>>2]=f+ +nb[c[(c[d>>2]|0)+48>>2]&15](d);c[e+16>>2]=c[(+g[a+376>>2]<+g[b+376>>2]?a+376|0:b+376|0)>>2];c[e+24>>2]=a;c[e+28>>2]=b;Ee(c[a+1068>>2]|0,c[b+1068>>2]|0,e);l=e;return}case 16:{if((a|0)==(b|0)){l=e;return}c[e>>2]=3784;d=c[a+192>>2]|0;f=+nb[c[(c[d>>2]|0)+48>>2]&15](d);d=c[b+192>>2]|0;g[e+12>>2]=f+ +nb[c[(c[d>>2]|0)+48>>2]&15](d);c[e+4>>2]=a;c[e+8>>2]=b;Ee(c[a+988>>2]|0,c[b+1028>>2]|0,e);c[e+4>>2]=b;c[e+8>>2]=a;Ee(c[b+988>>2]|0,c[a+1028>>2]|0,e);l=e;return}default:{l=e;return}}}function Xh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+48|0;g=m;h=g+44|0;do{c[g>>2]=0;g=g+4|0}while((g|0)<(h|0));if(!d)j=c[c[b+940>>2]>>2]|0;else j=d;d=c[b+792>>2]|0;if((d|0)==(c[b+796>>2]|0)?(k=d|0?d<<1:1,(d|0)<(k|0)):0){if(!k)i=0;else{c[6995]=(c[6995]|0)+1;d=sc((k*52|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}i=d;d=c[b+792>>2]|0}if((d|0)>0){e=0;do{g=i+(e*52|0)|0;f=(c[b+800>>2]|0)+(e*52|0)|0;h=g+52|0;do{c[g>>2]=c[f>>2];g=g+4|0;f=f+4|0}while((g|0)<(h|0));e=e+1|0}while((e|0)!=(d|0))}d=c[b+800>>2]|0;if(d|0){if(a[b+804>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+800>>2]=0}a[b+804>>0]=1;c[b+800>>2]=i;c[b+796>>2]=k;d=c[b+792>>2]|0}g=c[b+800>>2]|0;c[g+(d*52|0)>>2]=0;c[g+(d*52|0)+4>>2]=j;g=g+(d*52|0)+8|0;f=m;h=g+44|0;do{c[g>>2]=c[f>>2];g=g+4|0;f=f+4|0}while((g|0)<(h|0));c[b+792>>2]=(c[b+792>>2]|0)+1;l=m;return}function Yh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0,j=0.0;i=l;l=l+32|0;c[i+16>>2]=c[d>>2];c[i+16+4>>2]=c[d+4>>2];c[i+16+8>>2]=c[d+8>>2];c[i+16+12>>2]=c[d+12>>2];f=+g[i+16>>2];h=+g[i+16+4>>2];e=+g[i+16+8>>2];if(f*f+h*h+e*e<1.4210854715202004e-14){c[i+16>>2]=-1082130432;c[i+16+4>>2]=-1082130432;c[i+16+8>>2]=-1082130432;g[i+16+12>>2]=0.0;f=-1.0;h=-1.0;e=-1.0}j=1.0/+D(+(f*f+h*h+e*e));g[i+16>>2]=f*j;g[i+16+4>>2]=h*j;g[i+16+8>>2]=e*j;Nd(i,b,i+16|0);switch(c[b+4>>2]|0){case 8:{e=+g[b+32>>2]*+g[b+16>>2];break}case 0:{e=+g[b+48>>2];break}case 1:{e=+g[b+48>>2];break}case 13:{e=+g[b+48>>2];break}case 11:{e=+g[b+48>>2];break}case 10:{e=+g[b+48>>2];break}case 4:case 5:{e=+g[b+48>>2];break}default:e=+nb[c[(c[b>>2]|0)+48>>2]&15](b)}h=e*+g[i+16+4>>2]+ +g[i+4>>2];j=e*+g[i+16+8>>2]+ +g[i+8>>2];g[a>>2]=e*+g[i+16>>2]+ +g[i>>2];g[a+4>>2]=h;g[a+8>>2]=j;g[a+12>>2]=0.0;l=i;return}function Zh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0,i=0.0,k=0,m=0,n=0,o=0.0;m=l;l=l+80|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;e=+g[d>>2];f=+g[d+4>>2];i=+g[d+8>>2];if(e*e+f*f+i*i<9.999999747378752e-05){k=1065353216;h=0;e=0.0;d=0}else{o=1.0/+D(+(e*e+f*f+i*i));k=(g[j>>2]=e*o,c[j>>2]|0);n=(g[j>>2]=f*o,c[j>>2]|0);h=(g[j>>2]=i*o,c[j>>2]|0);e=+g[d+12>>2];d=n}c[m+32>>2]=8168;n=m+32+4|0;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;g[m+32+20>>2]=-999999984306749440.0;c[m+32+24>>2]=k;c[m+32+28>>2]=d;c[m+32+32>>2]=h;g[m+32+36>>2]=e;c[m+16>>2]=1566444395;c[m+16+4>>2]=1566444395;c[m+16+8>>2]=1566444395;g[m+16+12>>2]=0.0;b=c[b+96>>2]|0;k=c[(c[b>>2]|0)+8>>2]|0;g[m>>2]=-999999984306749440.0;g[m+4>>2]=-999999984306749440.0;g[m+8>>2]=-999999984306749440.0;g[m+12>>2]=0.0;Vb[k&127](b,m+32|0,m,m+16|0);c[a>>2]=c[n>>2];c[a+4>>2]=c[n+4>>2];c[a+8>>2]=c[n+8>>2];c[a+12>>2]=c[n+12>>2];l=m;return}function _h(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0;p=l;l=l+32|0;e=c[a+12>>2]|0;if(!e){l=p;return}c[f+4>>2]=e;q=c[b+4>>2]|0;a=c[d+4>>2]|0;r=c[b+12>>2]|0;b=c[d+12>>2]|0;h=+g[r+48>>2]-+g[b+48>>2];i=+g[r+52>>2]-+g[b+52>>2];k=+g[r+56>>2]-+g[b+56>>2];m=+D(+(h*h+i*i+k*k));n=+g[q+32>>2]*+g[q+16>>2];o=+g[a+32>>2]*+g[a+16>>2];c[e+780>>2]=0;if(m>n+o+ +g[f+32>>2]){l=p;return}c[p+16>>2]=1065353216;c[p+16+4>>2]=0;c[p+16+8>>2]=0;g[p+16+12>>2]=0.0;if(m>1.1920928955078125e-07){g[p+16>>2]=h*(1.0/m);g[p+16+4>>2]=i*(1.0/m);g[p+16+8>>2]=k*(1.0/m);g[p+16+12>>2]=0.0;j=h*(1.0/m);i=i*(1.0/m);h=k*(1.0/m)}else{j=1.0;i=0.0;h=0.0}r=c[d+12>>2]|0;i=o*i+ +g[r+52>>2];k=o*h+ +g[r+56>>2];g[p>>2]=o*j+ +g[r+48>>2];g[p+4>>2]=i;g[p+8>>2]=k;g[p+12>>2]=0.0;Tb[c[(c[f>>2]|0)+16>>2]&15](f,p+16|0,p,m-(n+o));l=p;return}function $h(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0,i=0,j=0,k=0.0,l=0,m=0;m=c[a+4>>2]|0;a=c[a+44>>2]|0;do if(!m)if(!a){e=0;f=0.0;h=0;i=0;j=0;k=0.0;l=0;a=0}else{e=c[a>>2]|0;f=+g[a+12>>2];h=c[a+16>>2]|0;i=c[a+20>>2]|0;j=c[a+24>>2]|0;k=+g[a+28>>2];l=c[a+4>>2]|0;a=c[a+8>>2]|0}else if(!a){e=c[m>>2]|0;f=+g[m+12>>2];h=c[m+16>>2]|0;i=c[m+20>>2]|0;j=c[m+24>>2]|0;k=+g[m+28>>2];l=c[m+4>>2]|0;a=c[m+8>>2]|0;break}else{e=c[(+g[m>>2]<+g[a>>2]?m:a)>>2]|0;f=0.0;h=c[(+g[m+16>>2]>+g[a+16>>2]?m+16|0:a+16|0)>>2]|0;i=c[(+g[m+20>>2]>+g[a+20>>2]?m+16|0:a+16|0)+4>>2]|0;j=c[(+g[m+24>>2]>+g[a+24>>2]?m+16|0:a+16|0)+8>>2]|0;k=0.0;l=c[(+g[m+4>>2]<+g[a+4>>2]?m:a)+4>>2]|0;a=c[(+g[m+8>>2]<+g[a+8>>2]?m:a)+8>>2]|0;break}while(0);c[b>>2]=e;c[b+4>>2]=l;c[b+8>>2]=a;g[b+12>>2]=f;c[d>>2]=h;c[d+4>>2]=i;c[d+8>>2]=j;g[d+12>>2]=k;return}function ai(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0,i=0.0,j=0.0,k=0.0,l=0,m=0.0;k=+g[b+64>>2]*.5;l=c[b+72>>2]|0;f=+g[d>>2];i=+g[d+4>>2];j=+g[d+8>>2];j=+D(+(f*f+i*i+j*j));h=c[b+68>>2]|0;do if(!(+g[d+(l<<2)>>2]>j*+g[b+56>>2])){f=+g[d+(h<<2)>>2];e=c[b+76>>2]|0;i=+g[d+(e<<2)>>2];j=+D(+(f*f+i*i));if(j>1.1920928955078125e-07){j=+g[b+60>>2]/j;g[a+(h<<2)>>2]=f*j;g[a+(l<<2)>>2]=-k;f=i*j;break}else{g[a+(h<<2)>>2]=0.0;g[a+(l<<2)>>2]=-k;f=0.0;break}}else{g[a+(h<<2)>>2]=0.0;g[a+(l<<2)>>2]=k;f=0.0;e=c[b+76>>2]|0}while(0);g[a+(e<<2)>>2]=f;if(!(+nb[c[(c[b>>2]|0)+48>>2]&15](b)!=0.0))return;i=+g[d>>2];j=+g[d+4>>2];k=+g[d+8>>2];m=i*i+j*j+k*k<1.4210854715202004e-14?-1.0:i;f=i*i+j*j+k*k<1.4210854715202004e-14?-1.0:j;k=i*i+j*j+k*k<1.4210854715202004e-14?-1.0:k;j=1.0/+D(+(k*k+(m*m+f*f)));i=+nb[c[(c[b>>2]|0)+48>>2]&15](b);g[a>>2]=+g[a>>2]+i*j*m;g[a+4>>2]=i*j*f+ +g[a+4>>2];g[a+8>>2]=i*j*k+ +g[a+8>>2];return}function bi(a,b,d){a=a|0;b=b|0;d=d|0;c[a+300>>2]=c[b>>2];c[a+300+4>>2]=c[b+4>>2];c[a+300+8>>2]=c[b+8>>2];c[a+300+12>>2]=c[b+12>>2];c[a+316>>2]=c[b+16>>2];c[a+316+4>>2]=c[b+16+4>>2];c[a+316+8>>2]=c[b+16+8>>2];c[a+316+12>>2]=c[b+16+12>>2];c[a+332>>2]=c[b+32>>2];c[a+332+4>>2]=c[b+32+4>>2];c[a+332+8>>2]=c[b+32+8>>2];c[a+332+12>>2]=c[b+32+12>>2];c[a+348>>2]=c[b+48>>2];c[a+348+4>>2]=c[b+48+4>>2];c[a+348+8>>2]=c[b+48+8>>2];c[a+348+12>>2]=c[b+48+12>>2];c[a+364>>2]=c[d>>2];c[a+364+4>>2]=c[d+4>>2];c[a+364+8>>2]=c[d+8>>2];c[a+364+12>>2]=c[d+12>>2];c[a+380>>2]=c[d+16>>2];c[a+380+4>>2]=c[d+16+4>>2];c[a+380+8>>2]=c[d+16+8>>2];c[a+380+12>>2]=c[d+16+12>>2];c[a+396>>2]=c[d+32>>2];c[a+396+4>>2]=c[d+32+4>>2];c[a+396+8>>2]=c[d+32+8>>2];c[a+396+12>>2]=c[d+32+12>>2];c[a+412>>2]=c[d+48>>2];c[a+412+4>>2]=c[d+48+4>>2];c[a+412+8>>2]=c[d+48+8>>2];c[a+412+12>>2]=c[d+48+12>>2];Ib[c[(c[a>>2]|0)+8>>2]&511](a);return}function ci(a){a=a|0;var b=0,d=0;Dd(a);a:do if(xb[c[(c[a>>2]|0)+20>>2]&127](a)|0?(d=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0,(xb[c[(c[d>>2]|0)+56>>2]&127](d)|0)&6144|0):0){d=xb[c[(c[a>>2]|0)+104>>2]&127](a)|0;while(1){b=d+-1|0;if((d|0)<=0)break a;d=zb[c[(c[a>>2]|0)+108>>2]&31](a,b)|0;Ob[c[(c[a>>2]|0)+172>>2]&127](a,d);d=b}}while(0);if((((xb[c[(c[a>>2]|0)+20>>2]&127](a)|0?(d=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0,(xb[c[(c[d>>2]|0)+56>>2]&127](d)|0)&16387|0):0)?xb[c[(c[a>>2]|0)+20>>2]&127](a)|0:0)?(d=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0,xb[c[(c[d>>2]|0)+56>>2]&127](d)|0):0)?(c[a+296>>2]|0)>0:0){b=0;do{d=c[(c[a+304>>2]|0)+(b<<2)>>2]|0;Ob[c[(c[d>>2]|0)+12>>2]&127](d,c[a+72>>2]|0);b=b+1|0}while((b|0)<(c[a+296>>2]|0))}if(!(xb[c[(c[a>>2]|0)+20>>2]&127](a)|0))return;a=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Ib[c[(c[a>>2]|0)+104>>2]&511](a);return}function di(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0;c=l;l=l+48|0;yh(a+364|0,c+16|0);h=-+g[c+16>>2];e=-+g[c+16+4>>2];m=-+g[c+16+8>>2];k=+g[c+16+12>>2];f=+g[b>>2];n=+g[b+12>>2];j=+g[b+8>>2];i=+g[b+4>>2];yh(a+300|0,c);p=+g[c>>2];q=+g[c+12>>2];d=+g[c+8>>2];o=+g[c+4>>2];g[c+32>>2]=(k*n-f*h-i*e-j*m)*p+(k*f+n*h+j*e-i*m)*q+(f*m+(n*e+k*i)-j*h)*d-(n*m+k*j+i*h-f*e)*o;g[c+32+4>>2]=p*(n*m+k*j+i*h-f*e)+(q*(f*m+(n*e+k*i)-j*h)+(k*n-f*h-i*e-j*m)*o)-(k*f+n*h+j*e-i*m)*d;g[c+32+8>>2]=(n*m+k*j+i*h-f*e)*q+(k*n-f*h-i*e-j*m)*d+(k*f+n*h+j*e-i*m)*o-p*(f*m+(n*e+k*i)-j*h);g[c+32+12>>2]=(k*n-f*h-i*e-j*m)*q-(k*f+n*h+j*e-i*m)*p-(f*m+(n*e+k*i)-j*h)*o-(n*m+k*j+i*h-f*e)*d;Ce(a,c+32|0);l=c;return}function ei(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;if(!e)e=c[b+188>>2]|0;j=c[d>>2]|0;f=c[b+328>>2]|0;a:do if((f|0)>0){h=c[b+336>>2]|0;g=0;while(1){if((c[h+(g<<2)>>2]|0)==(j|0))break;g=g+1|0;if((g|0)>=(f|0))break a}if((g|0)!=(f|0))return}while(0);if((f|0)==(c[b+332>>2]|0)?(i=f|0?f<<1:1,(f|0)<(i|0)):0){if(!i)h=0;else{c[6995]=(c[6995]|0)+1;f=sc((i<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=f;f=c[b+328>>2]|0}if((f|0)>0){g=0;do{c[h+(g<<2)>>2]=c[(c[b+336>>2]|0)+(g<<2)>>2];g=g+1|0}while((g|0)!=(f|0))}g=c[b+336>>2]|0;if(g){if(a[b+340>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);f=c[b+328>>2]|0}c[b+336>>2]=0}a[b+340>>0]=1;c[b+336>>2]=h;c[b+332>>2]=i}c[(c[b+336>>2]|0)+(f<<2)>>2]=j;c[b+328>>2]=f+1;b=c[b+344>>2]|0;Bb[c[(c[b>>2]|0)+8>>2]&63](b,e,d)|0;return}function fi(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0;c[b>>2]=zb[c[(c[e>>2]|0)+28>>2]&31](e,c[a+28>>2]|0)|0;c[b+4>>2]=zb[c[(c[e>>2]|0)+28>>2]&31](e,c[a+32>>2]|0)|0;f=zb[c[(c[e>>2]|0)+40>>2]&31](e,a)|0;g=zb[c[(c[e>>2]|0)+28>>2]&31](e,f)|0;c[b+8>>2]=g;if(g|0)Ob[c[(c[e>>2]|0)+48>>2]&127](e,f);c[b+12>>2]=c[a+4>>2];c[b+24>>2]=d[a+21>>0];c[b+40>>2]=c[a+24>>2];c[b+44>>2]=c[a+16>>2];c[b+48>>2]=d[a+20>>0];c[b+20>>2]=c[a+12>>2];c[b+16>>2]=c[a+8>>2];c[b+28>>2]=c[a+36>>2];c[b+32>>2]=c[a+40>>2];c[b+36>>2]=0;f=c[a+28>>2]|0;if((c[f+548>>2]|0)>0){e=0;do{if((c[(c[f+556>>2]|0)+(e<<2)>>2]|0)==(a|0)){c[b+36>>2]=1;f=c[a+28>>2]|0}e=e+1|0}while((e|0)<(c[f+548>>2]|0))}f=c[a+32>>2]|0;if((c[f+548>>2]|0)>0)e=0;else return 12572;do{if((c[(c[f+556>>2]|0)+(e<<2)>>2]|0)==(a|0)){c[b+36>>2]=1;f=c[a+32>>2]|0}e=e+1|0}while((e|0)<(c[f+548>>2]|0));return 12572}function gi(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if((e|0)>=8192)return db(b|0,d|0,e|0)|0;h=b|0;g=b+e|0;if((b&3)==(d&3)){while(b&3){if(!e)return h|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}e=g&-4|0;f=e-64|0;while((b|0)<=(f|0)){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];c[b+24>>2]=c[d+24>>2];c[b+28>>2]=c[d+28>>2];c[b+32>>2]=c[d+32>>2];c[b+36>>2]=c[d+36>>2];c[b+40>>2]=c[d+40>>2];c[b+44>>2]=c[d+44>>2];c[b+48>>2]=c[d+48>>2];c[b+52>>2]=c[d+52>>2];c[b+56>>2]=c[d+56>>2];c[b+60>>2]=c[d+60>>2];b=b+64|0;d=d+64|0}while((b|0)<(e|0)){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}}else{e=g-4|0;while((b|0)<(e|0)){a[b>>0]=a[d>>0]|0;a[b+1>>0]=a[d+1>>0]|0;a[b+2>>0]=a[d+2>>0]|0;a[b+3>>0]=a[d+3>>0]|0;b=b+4|0;d=d+4|0}}while((b|0)<(g|0)){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0}return h|0}function hi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;if(xb[c[(c[d>>2]|0)+16>>2]&127](d)|0)return;i=c[b+772>>2]|0;h=xb[c[(c[d>>2]|0)+36>>2]&127](d)|0;if(xb[c[(c[d>>2]|0)+8>>2]&127](d)|0?(e=xb[c[(c[d>>2]|0)+20>>2]&127](d)|0,g=xb[c[(c[d>>2]|0)+24>>2]&127](d)|0,(i|0)>0):0){f=c[b+780>>2]|0;a=h+(e<<2)|0;e=0;while(1){k=c[f+(e*104|0)+12>>2]|0;j=c[f+(e*104|0)+16>>2]|0;c[a>>2]=c[f+(e*104|0)+8>>2];c[a+4>>2]=k;c[a+8>>2]=j;e=e+1|0;if((e|0)==(i|0))break;else a=a+(g<<2)|0}}if(!(xb[c[(c[d>>2]|0)+12>>2]&127](d)|0))return;a=xb[c[(c[d>>2]|0)+28>>2]&127](d)|0;g=xb[c[(c[d>>2]|0)+32>>2]&127](d)|0;if((i|0)<=0)return;f=c[b+780>>2]|0;a=h+(a<<2)|0;e=0;while(1){j=c[f+(e*104|0)+76>>2]|0;k=c[f+(e*104|0)+80>>2]|0;c[a>>2]=c[f+(e*104|0)+72>>2];c[a+4>>2]=j;c[a+8>>2]=k;e=e+1|0;if((e|0)==(i|0))break;else a=a+(g<<2)|0}return}function ii(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;c[b>>2]=9696;d=c[b+56>>2]|0;if(d|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;f=c[b+28>>2]|0;if((f|0)>0){d=0;do{g=c[b+36>>2]|0;h=g+(d*36|0)+4|0;i=g+(d*36|0)+12|0;j=c[i>>2]|0;e=g+(d*36|0)+16|0;if(j|0){if(a[e>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[i>>2]=0}a[e>>0]=1;c[i>>2]=0;c[h>>2]=0;c[g+(d*36|0)+8>>2]=0;d=d+1|0}while((d|0)!=(f|0))}d=c[b+36>>2]|0;if(d|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;d=c[b+16>>2]|0;if(!d){a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}function ji(b){b=b|0;var d=0;c[b>>2]=8796;d=c[b+156>>2]|0;if(d|0){if(a[b+160>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+156>>2]=0}a[b+160>>0]=1;c[b+156>>2]=0;c[b+148>>2]=0;c[b+152>>2]=0;d=c[b+136>>2]|0;if(d|0){if(a[b+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+136>>2]=0}a[b+140>>0]=1;c[b+136>>2]=0;c[b+128>>2]=0;c[b+132>>2]=0;d=c[b+116>>2]|0;if(d|0){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+116>>2]=0}a[b+120>>0]=1;c[b+116>>2]=0;c[b+108>>2]=0;c[b+112>>2]=0;d=c[b+96>>2]|0;if(d|0){if(a[b+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+96>>2]=0}a[b+100>>0]=1;c[b+96>>2]=0;c[b+88>>2]=0;c[b+92>>2]=0;c[b>>2]=9712;d=c[b+32>>2]|0;if(!d){a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;b=b+28|0;c[b>>2]=0;return}if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0;a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;b=b+28|0;c[b>>2]=0;return}function ki(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=c[b+188>>2]|0;if(d|0){f=c[a+68>>2]|0;f=xb[c[(c[f>>2]|0)+36>>2]&127](f)|0;Sb[c[(c[f>>2]|0)+40>>2]&127](f,d,c[a+24>>2]|0);f=c[a+68>>2]|0;Sb[c[(c[f>>2]|0)+12>>2]&127](f,d,c[a+24>>2]|0);c[b+188>>2]=0}d=c[b+216>>2]|0;f=c[a+8>>2]|0;if((d|0)>-1&(d|0)<(f|0)){g=c[a+16>>2]|0;e=c[g+(d<<2)>>2]|0;c[g+(d<<2)>>2]=c[g+(f+-1<<2)>>2];c[(c[a+16>>2]|0)+(f+-1<<2)>>2]=e;c[a+8>>2]=f+-1;if((d|0)>=(f+-1|0)){c[b+216>>2]=-1;return}c[(c[(c[a+16>>2]|0)+(d<<2)>>2]|0)+216>>2]=d;c[b+216>>2]=-1;return}a:do if((f|0)>0){e=c[a+16>>2]|0;d=0;while(1){if((c[e+(d<<2)>>2]|0)==(b|0))break a;d=d+1|0;if((d|0)>=(f|0)){d=f;break}}}else d=f;while(0);if((f|0)<=(d|0)){c[b+216>>2]=-1;return}h=c[a+16>>2]|0;e=h+(d<<2)|0;g=c[e>>2]|0;c[e>>2]=c[h+(f+-1<<2)>>2];c[(c[a+16>>2]|0)+(f+-1<<2)>>2]=g;c[a+8>>2]=f+-1;c[b+216>>2]=-1;return}function li(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0;p=l;l=l+16|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;e=+g[d>>2];h=+g[d+4>>2];f=+g[d+8>>2];if(e*e+h*h+f*f<9.999999747378752e-05){o=1.0;n=0.0;m=0.0}else{m=1.0/+D(+(e*e+h*h+f*f));o=e*m;n=h*m;m=f*m}c[p>>2]=0;c[p+4>>2]=0;c[p+8>>2]=0;c[p+12>>2]=0;d=c[b+56>>2]|0;b=c[b+32+(d<<2)>>2]|0;c[p+(d<<2)>>2]=b;e=+g[p>>2];h=+g[p+4>>2];f=+g[p+8>>2];i=o*e+n*h+m*f;k=(c[j>>2]=b,+g[j>>2]);if(i>-999999984306749440.0){b=c[p+12>>2]|0;g[a>>2]=e;g[a+4>>2]=h;g[a+8>>2]=f;c[a+12>>2]=b}else i=-999999984306749440.0;c[p>>2]=0;c[p+4>>2]=0;c[p+8>>2]=0;c[p+12>>2]=0;g[p+(d<<2)>>2]=-k;e=+g[p>>2];h=+g[p+4>>2];f=+g[p+8>>2];if(!(o*e+n*h+m*f>i)){l=p;return}b=c[p+12>>2]|0;g[a>>2]=e;g[a+4>>2]=h;g[a+8>>2]=f;c[a+12>>2]=b;l=p;return}function mi(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0;c[b+68>>2]=c[d>>2];c[b+68+4>>2]=c[d+4>>2];c[b+68+8>>2]=c[d+8>>2];c[b+68+12>>2]=c[d+12>>2];n=+g[b+68>>2];o=+g[b+72>>2];m=+g[b+76>>2];if(!(n*n+o*o+m*m>0.0)){g[b+20>>2]=0.0;return}k=+g[d>>2];l=+g[d+4>>2];e=+g[d+8>>2];f=1.0/+D(+(k*k+l*l+e*e));h=+g[b+256>>2];i=+g[b+260>>2];j=+g[b+264>>2];if(!(h*k*f+l*f*i+e*f*j!=0.0))return;p=h*k*f+l*f*i+e*f*j<-1.0?-1.0:h*k*f+l*f*i+e*f*j;p=+G(+(1.5707963705062866-+I(+(p>1.0?1.0:p))))*+D(+(n*n+o*o+m*m));g[b+68>>2]=n-h*p;g[b+72>>2]=o-i*p;g[b+76>>2]=m-j*p;g[b+20>>2]=(h*k*f+l*f*i+e*f*j<0.0?-1.0:1.0)*+D(+(j*p*j*p+(h*p*h*p+i*p*i*p)));if(!(h*k*f+l*f*i+e*f*j>0.0))return;a[b+249>>0]=1;d=(c[b+8>>2]|0)+52|0;c[b+116>>2]=c[d>>2];c[b+116+4>>2]=c[d+4>>2];c[b+116+8>>2]=c[d+8>>2];c[b+116+12>>2]=c[d+12>>2];return}function ni(b){b=b|0;var d=0;c[b>>2]=9356;d=c[b+160>>2]|0;if(d|0){if(a[b+164>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+160>>2]=0}a[b+164>>0]=1;c[b+160>>2]=0;c[b+152>>2]=0;c[b+156>>2]=0;d=c[b+136>>2]|0;if(d|0){if(a[b+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+136>>2]=0}a[b+140>>0]=1;c[b+136>>2]=0;c[b+128>>2]=0;c[b+132>>2]=0;d=c[b+116>>2]|0;if(d|0){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+116>>2]=0}a[b+120>>0]=1;c[b+116>>2]=0;c[b+108>>2]=0;c[b+112>>2]=0;d=c[b+96>>2]|0;if(d|0){if(a[b+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+96>>2]=0}a[b+100>>0]=1;c[b+96>>2]=0;c[b+88>>2]=0;c[b+92>>2]=0;d=c[b+76>>2]|0;if(!d){a[b+80>>0]=1;c[b+76>>2]=0;c[b+68>>2]=0;b=b+72|0;c[b>>2]=0;return}if(a[b+80>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+76>>2]=0;a[b+80>>0]=1;c[b+76>>2]=0;c[b+68>>2]=0;b=b+72|0;c[b>>2]=0;return}function oi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0,p=0;p=l;l=l+16|0;if((e|0)<=0){l=p;return}o=0;do{h=+g[a+64>>2]*.5;i=c[a+72>>2]|0;k=+g[b+(o<<4)>>2];m=+g[b+(o<<4)+4>>2];n=+g[b+(o<<4)+8>>2];n=+D(+(k*k+m*m+n*n));j=c[a+68>>2]|0;do if(!(+g[b+(o<<4)+(i<<2)>>2]>n*+g[a+56>>2])){k=+g[b+(o<<4)+(j<<2)>>2];f=c[a+76>>2]|0;m=+g[b+(o<<4)+(f<<2)>>2];n=+D(+(k*k+m*m));if(n>1.1920928955078125e-07){n=+g[a+60>>2]/n;g[p+(j<<2)>>2]=k*n;g[p+(i<<2)>>2]=-h;h=m*n;break}else{g[p+(j<<2)>>2]=0.0;g[p+(i<<2)>>2]=-h;h=0.0;break}}else{g[p+(j<<2)>>2]=0.0;g[p+(i<<2)>>2]=h;h=0.0;f=c[a+76>>2]|0}while(0);g[p+(f<<2)>>2]=h;j=d+(o<<4)|0;c[j>>2]=c[p>>2];c[j+4>>2]=c[p+4>>2];c[j+8>>2]=c[p+8>>2];c[j+12>>2]=c[p+12>>2];o=o+1|0}while((o|0)!=(e|0));l=p;return}function pi(b){b=b|0;var d=0;c[b>>2]=5112;d=c[b+136>>2]|0;if(d|0){if(a[b+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+136>>2]=0}a[b+140>>0]=1;c[b+136>>2]=0;c[b+128>>2]=0;c[b+132>>2]=0;d=c[b+76>>2]|0;if(d|0){if(a[b+80>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+76>>2]=0}a[b+80>>0]=1;c[b+76>>2]=0;c[b+68>>2]=0;c[b+72>>2]=0;d=c[b+56>>2]|0;if(d|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;d=c[b+36>>2]|0;if(d|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;d=c[b+16>>2]|0;if(!d){a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}function qi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0;o=(+g[a+36>>2]-+g[a+20>>2])*+g[a+112>>2]*.5;m=(+g[a+40>>2]-+g[a+24>>2])*+g[a+116>>2]*.5;k=(+g[a+44>>2]-+g[a+28>>2])*+g[a+120>>2]*.5;t=+C(+(+g[b>>2]));s=+C(+(+g[b+4>>2]));r=+C(+(+g[b+8>>2]));n=+C(+(+g[b+16>>2]));l=+C(+(+g[b+20>>2]));j=+C(+(+g[b+24>>2]));w=+C(+(+g[b+32>>2]));v=+C(+(+g[b+36>>2]));f=+C(+(+g[b+40>>2]));u=+g[b+48>>2];p=+g[b+52>>2];h=+g[b+56>>2];q=+nb[c[(c[a>>2]|0)+48>>2]&15](a);i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);f=o*w+m*v+k*f+ +nb[c[(c[a>>2]|0)+48>>2]&15](a);g[d>>2]=u-(o*t+m*s+k*r+q);g[d+4>>2]=p-(o*n+m*l+k*j+i);g[d+8>>2]=h-f;g[d+12>>2]=0.0;g[e>>2]=u+(o*t+m*s+k*r+q);g[e+4>>2]=p+(o*n+m*l+k*j+i);g[e+8>>2]=h+f;g[e+12>>2]=0.0;return}function ri(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0;f=l;l=l+16|0;y=c[a+56>>2]|0;z=c[a+32+(((y+2|0)%3|0)<<2)>>2]|0;c[f>>2]=z;c[f+4>>2]=z;c[f+8>>2]=z;g[f+12>>2]=0.0;g[f+(y<<2)>>2]=(c[j>>2]=z,+g[j>>2])+ +g[a+32+(y<<2)>>2];w=+C(+(+g[b>>2]));v=+C(+(+g[b+4>>2]));u=+C(+(+g[b+8>>2]));s=+C(+(+g[b+16>>2]));r=+C(+(+g[b+20>>2]));q=+C(+(+g[b+24>>2]));o=+C(+(+g[b+32>>2]));m=+C(+(+g[b+36>>2]));i=+C(+(+g[b+40>>2]));x=+g[b+48>>2];t=+g[b+52>>2];p=+g[b+56>>2];n=+g[f>>2];k=+g[f+4>>2];h=+g[f+8>>2];g[d>>2]=x-(w*n+v*k+u*h);g[d+4>>2]=t-(s*n+r*k+q*h);g[d+8>>2]=p-(o*n+m*k+i*h);g[d+12>>2]=0.0;g[e>>2]=x+(w*n+v*k+u*h);g[e+4>>2]=t+(s*n+r*k+q*h);g[e+8>>2]=p+(o*n+m*k+i*h);g[e+12>>2]=0.0;l=f;return}function si(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+64|0;b=c[b+36>>2]|0;e=c[(c[a+24>>2]|0)+28>>2]|0;c[d>>2]=c[e+(b*80|0)>>2];c[d+4>>2]=c[e+(b*80|0)+4>>2];c[d+8>>2]=c[e+(b*80|0)+8>>2];c[d+12>>2]=c[e+(b*80|0)+12>>2];c[d+16>>2]=c[e+(b*80|0)+16>>2];c[d+16+4>>2]=c[e+(b*80|0)+16+4>>2];c[d+16+8>>2]=c[e+(b*80|0)+16+8>>2];c[d+16+12>>2]=c[e+(b*80|0)+16+12>>2];c[d+32>>2]=c[e+(b*80|0)+32>>2];c[d+32+4>>2]=c[e+(b*80|0)+32+4>>2];c[d+32+8>>2]=c[e+(b*80|0)+32+8>>2];c[d+32+12>>2]=c[e+(b*80|0)+32+12>>2];c[d+48>>2]=c[e+(b*80|0)+48>>2];c[d+48+4>>2]=c[e+(b*80|0)+48+4>>2];c[d+48+8>>2]=c[e+(b*80|0)+48+8>>2];c[d+48+12>>2]=c[e+(b*80|0)+48+12>>2];jg(a,b,d,c[e+(b*80|0)+64>>2]|0);l=d;return}function ti(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;i=l;l=l+48|0;e=c[a+28>>2]|0;c[i+32>>2]=e;e=(c[a+20>>2]|0)-e|0;c[i+32+4>>2]=e;c[i+32+8>>2]=b;c[i+32+12>>2]=d;c[i>>2]=c[a+60>>2];c[i+4>>2]=i+32;c[i+8>>2]=2;f=SC($a(146,i|0)|0)|0;a:do if((e+d|0)!=(f|0)){b=2;g=e+d|0;e=i+32|0;while(1){if((f|0)<0)break;g=g-f|0;j=c[e+4>>2]|0;k=f>>>0>j>>>0;e=k?e+8|0:e;b=(k<<31>>31)+b|0;j=f-(k?j:0)|0;c[e>>2]=(c[e>>2]|0)+j;c[e+4>>2]=(c[e+4>>2]|0)-j;c[i+16>>2]=c[a+60>>2];c[i+16+4>>2]=e;c[i+16+8>>2]=b;f=SC($a(146,i+16|0)|0)|0;if((g|0)==(f|0)){h=3;break a}}c[a+16>>2]=0;c[a+28>>2]=0;c[a+20>>2]=0;c[a>>2]=c[a>>2]|32;if((b|0)==2)d=0;else d=d-(c[e+4>>2]|0)|0}else h=3;while(0);if((h|0)==3){k=c[a+44>>2]|0;c[a+16>>2]=k+(c[a+48>>2]|0);c[a+28>>2]=k;c[a+20>>2]=k}l=i;return d|0}function ui(b){b=b|0;var d=0;if((a[22440]|0)==0?Uz(22440)|0:0){if((a[22384]|0)==0?Uz(22384)|0:0){if((a[22392]|0)==0?Uz(22392)|0:0){c[5698]=1065353216;c[5699]=0;c[5700]=0;c[5701]=0;c[5702]=0;c[5703]=1065353216;c[5704]=0;c[5705]=0;c[5706]=0;c[5707]=0;c[5708]=1065353216;g[5709]=0.0}c[5682]=c[5698];c[5683]=c[5699];c[5684]=c[5700];c[5685]=c[5701];c[5686]=c[5702];c[5687]=c[5703];c[5688]=c[5704];c[5689]=c[5705];c[5690]=c[5706];c[5691]=c[5707];c[5692]=c[5708];c[5693]=c[5709];c[5694]=0;c[5695]=0;c[5696]=0;c[5697]=0}c[5738]=c[5682];c[5739]=c[5683];c[5740]=c[5684];c[5741]=c[5685];c[5742]=c[5686];c[5743]=c[5687];c[5744]=c[5688];c[5745]=c[5689];c[5746]=c[5690];c[5747]=c[5691];c[5748]=c[5692];c[5749]=c[5693];c[5750]=c[5694];c[5751]=c[5695];c[5752]=c[5696];c[5753]=c[5697]}d=c[b+8>>2]|0;if(!d){d=c[b>>2]|0;return ((d|0)==0?22952:d+60|0)|0}else return d+4|0;return 0}function vi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;e=c[b>>2]|0;if((e|0)==(c[a+84>>2]|0)){f=1.0;return +f}if(c[e+204>>2]&4|0){f=1.0;return +f}if((+g[a+32>>2]-+g[a+16>>2])*+g[b+8>>2]+(+g[a+36>>2]-+g[a+20>>2])*+g[b+12>>2]+(+g[a+40>>2]-+g[a+24>>2])*+g[b+16>>2]>=-+g[a+88>>2]){f=1.0;return +f}c[a+4>>2]=c[b+40>>2];c[a+80>>2]=e;if(d){c[a+48>>2]=c[b+8>>2];c[a+48+4>>2]=c[b+8+4>>2];c[a+48+8>>2]=c[b+8+8>>2];c[a+48+12>>2]=c[b+8+12>>2]}else{k=+g[b+8>>2];j=+g[b+12>>2];i=+g[b+16>>2];h=k*+g[e+20>>2]+j*+g[e+24>>2]+i*+g[e+28>>2];f=k*+g[e+36>>2]+j*+g[e+40>>2]+i*+g[e+44>>2];g[a+48>>2]=+g[e+4>>2]*k+ +g[e+8>>2]*j+ +g[e+12>>2]*i;g[a+52>>2]=h;g[a+56>>2]=f;g[a+60>>2]=0.0}c[a+64>>2]=c[b+24>>2];c[a+64+4>>2]=c[b+24+4>>2];c[a+64+8>>2]=c[b+24+8>>2];c[a+64+12>>2]=c[b+24+12>>2];k=+g[b+40>>2];return +k}function wi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0;i=l;l=l+80|0;if((e|0)>0)f=0;else{l=i;return}do{g[d+(f<<4)+12>>2]=-999999984306749440.0;f=f+1|0}while((f|0)!=(e|0));h=i+32+4|0;f=0;do{j=b+(f<<4)|0;c[i+32>>2]=8168;c[h>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;g[i+32+20>>2]=-999999984306749440.0;c[i+32+24>>2]=c[j>>2];c[i+32+24+4>>2]=c[j+4>>2];c[i+32+24+8>>2]=c[j+8>>2];c[i+32+24+12>>2]=c[j+12>>2];c[i+16>>2]=1566444395;c[i+16+4>>2]=1566444395;c[i+16+8>>2]=1566444395;g[i+16+12>>2]=0.0;j=c[a+96>>2]|0;k=c[(c[j>>2]|0)+8>>2]|0;g[i>>2]=-999999984306749440.0;g[i+4>>2]=-999999984306749440.0;g[i+8>>2]=-999999984306749440.0;g[i+12>>2]=0.0;Vb[k&127](j,i+32|0,i,i+16|0);j=d+(f<<4)|0;c[j>>2]=c[h>>2];c[j+4>>2]=c[h+4>>2];c[j+8>>2]=c[h+8>>2];c[j+12>>2]=c[h+12>>2];f=f+1|0}while((f|0)<(e|0));l=i;return}function xi(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=c[b+100>>2]|0;if((f|0)==(c[b+104>>2]|0)?(i=f|0?f<<1:1,(f|0)<(i|0)):0){if(!i)h=0;else{c[6995]=(c[6995]|0)+1;f=sc((i<<4|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=f;f=c[b+100>>2]|0}if((f|0)>0){g=0;do{j=h+(g<<4)|0;k=(c[b+108>>2]|0)+(g<<4)|0;c[j>>2]=c[k>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];g=g+1|0}while((g|0)!=(f|0))}f=c[b+108>>2]|0;if(f|0){if(a[b+112>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+108>>2]=0}a[b+112>>0]=1;c[b+108>>2]=h;c[b+104>>2]=i;f=c[b+100>>2]|0}k=(c[b+108>>2]|0)+(f<<4)|0;c[k>>2]=c[d>>2];c[k+4>>2]=c[d+4>>2];c[k+8>>2]=c[d+8>>2];c[k+12>>2]=c[d+12>>2];c[b+100>>2]=(c[b+100>>2]|0)+1;if(!e)return;uj(b);return}function yi(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+96|0;b=c[b>>2]|0;if((b|0)==(c[a+4>>2]|0)){l=d;return 1}e=c[a+12>>2]|0;if(!(zb[c[(c[e>>2]|0)+8>>2]&31](e,c[b+188>>2]|0)|0)){l=d;return 1}e=c[a+4>>2]|0;f=c[e+192>>2]|0;c[d+64>>2]=0;c[d+64+4>>2]=f;c[d+64+8>>2]=e;c[d+64+12>>2]=e+4;c[d+64+16>>2]=-1;c[d+64+20>>2]=-1;e=c[b+192>>2]|0;c[d+40>>2]=0;c[d+40+4>>2]=e;c[d+40+8>>2]=b;c[d+40+12>>2]=b+4;c[d+40+16>>2]=-1;c[d+40+20>>2]=-1;b=c[(c[a+8>>2]|0)+24>>2]|0;b=Db[c[(c[b>>2]|0)+8>>2]&1](b,d+64|0,d+40|0,0,2)|0;if(b|0){f=c[a+12>>2]|0;c[d+4>>2]=0;c[d+8>>2]=d+64;c[d+12>>2]=d+40;g[d+32>>2]=0.0;c[d>>2]=6324;c[d+36>>2]=f;Zb[c[(c[b>>2]|0)+8>>2]&31](b,d+64|0,d+40|0,(c[a+8>>2]|0)+28|0,d);Ib[c[c[b>>2]>>2]&511](b);f=c[(c[a+8>>2]|0)+24>>2]|0;Ob[c[(c[f>>2]|0)+60>>2]&127](f,b)}l=d;return 1}function zi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,h=0,i=0,j=0,k=0;k=l;l=l+96|0;i=c[c[a>>2]>>2]|0;h=c[c[a+4>>2]>>2]|0;if(!(Bb[c[(c[b>>2]|0)+24>>2]&63](b,i,h)|0)){l=k;return}f=c[i+192>>2]|0;c[k+64>>2]=0;c[k+64+4>>2]=f;c[k+64+8>>2]=i;c[k+64+12>>2]=i+4;c[k+64+16>>2]=-1;c[k+64+20>>2]=-1;f=c[h+192>>2]|0;c[k+40>>2]=0;c[k+40+4>>2]=f;c[k+40+8>>2]=h;c[k+40+12>>2]=h+4;c[k+40+16>>2]=-1;c[k+40+20>>2]=-1;f=c[a+8>>2]|0;if(!f){f=Db[c[(c[b>>2]|0)+8>>2]&1](b,k+64|0,k+40|0,0,1)|0;c[a+8>>2]=f;if(f|0)j=4}else j=4;if((j|0)==4){c[k>>2]=5916;c[k+4>>2]=0;c[k+8>>2]=k+64;c[k+12>>2]=k+40;g[k+32>>2]=0.0;if((c[d+8>>2]|0)!=1){e=+tb[c[(c[f>>2]|0)+12>>2]&15](f,i,h,d,k);if(+g[d+12>>2]>e)g[d+12>>2]=e}else Zb[c[(c[f>>2]|0)+8>>2]&31](f,k+64|0,k+40|0,d,k)}l=k;return}function Ai(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0.0,h=0.0,i=0.0,j=0.0;c[a+4>>2]=35;c[a+8>>2]=0;c[a+12>>2]=-1;c[a+16>>2]=1065353216;c[a+20>>2]=1065353216;c[a+24>>2]=1065353216;g[a+28>>2]=0.0;g[a+48>>2]=.03999999910593033;c[a>>2]=8484;c[a+56>>2]=1;f=+g[b+4>>2]+-.03999999910593033;d=+g[b+8>>2]+-.03999999910593033;g[a+32>>2]=+g[b>>2]+-.03999999910593033;g[a+36>>2]=f;g[a+40>>2]=d;g[a+44>>2]=0.0;e=!(+g[b>>2]<+g[b+4>>2])&1;d=+g[b+((+g[b+(e<<2)>>2]<+g[b+8>>2]?e:2)<<2)>>2]*.10000000149011612;if(!(d<.03999999910593033)){c[a+4>>2]=13;return}j=+HG(a);h=+nb[c[(c[a>>2]|0)+48>>2]&15](a);f=+nb[c[(c[a>>2]|0)+48>>2]&15](a);j=j+ +g[a+32>>2];h=h+ +g[a+36>>2];f=f+ +g[a+40>>2];g[a+48>>2]=d;i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);d=+nb[c[(c[a>>2]|0)+48>>2]&15](a);f=f-+nb[c[(c[a>>2]|0)+48>>2]&15](a);g[a+32>>2]=j-i;g[a+36>>2]=h-d;g[a+40>>2]=f;g[a+44>>2]=0.0;c[a+4>>2]=13;return}function Bi(b){b=b|0;var d=0,e=0,f=0,h=0;c[b+32>>2]=262144;d=c[b+4>>2]|0;if((d|0)<2383){if((c[b+8>>2]|0)<2383){c[6995]=(c[6995]|0)+1;e=sc(9551)|0;if(!e)h=0;else{c[(e+4+15&-16)+-4>>2]=e;h=e+4+15&-16}f=c[b+4>>2]|0;if((f|0)>0){e=0;do{c[h+(e<<2)>>2]=c[(c[b+12>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0))}e=c[b+12>>2]|0;if(e|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=h;c[b+8>>2]=2383;e=b+12|0}else e=b+12|0;do{c[(c[e>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=2383)}c[b+4>>2]=2383;e=0;do{h=(c[b+12>>2]|0)+(e<<2)|0;d=c[h>>2]|0;c[h>>2]=0;if(d|0)do{h=d;d=c[d+280>>2]|0;cJ(h)}while((d|0)!=0);e=e+1|0}while((e|0)!=2383);g[b+20>>2]=.25;c[b+24>>2]=0;c[b+28>>2]=0;c[b+36>>2]=1;c[b+40>>2]=1;return}function Ci(a){a=a|0;var b=0.0,d=0,e=0,f=0.0,h=0.0,i=0.0,j=0.0;d=Nt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;g[d+48>>2]=.03999999910593033;c[d+56>>2]=0;c[d>>2]=8188;c[d+4>>2]=0;f=+g[a+4>>2]+-.03999999910593033;b=+g[a+8>>2]+-.03999999910593033;g[d+32>>2]=+g[a>>2]+-.03999999910593033;g[d+36>>2]=f;g[d+40>>2]=b;g[d+44>>2]=0.0;e=!(+g[a>>2]<+g[a+4>>2])&1;b=+g[a+((+g[a+(e<<2)>>2]<+g[a+8>>2]?e:2)<<2)>>2]*.10000000149011612;if(!(b<.03999999910593033))return d|0;j=+HG(d);h=+nb[c[(c[d>>2]|0)+48>>2]&15](d);f=+nb[c[(c[d>>2]|0)+48>>2]&15](d);j=j+ +g[d+32>>2];h=h+ +g[d+36>>2];f=f+ +g[d+40>>2];g[d+48>>2]=b;i=+nb[c[(c[d>>2]|0)+48>>2]&15](d);b=+nb[c[(c[d>>2]|0)+48>>2]&15](d);f=f-+nb[c[(c[d>>2]|0)+48>>2]&15](d);g[d+32>>2]=j-i;g[d+36>>2]=h-b;g[d+40>>2]=f;g[d+44>>2]=0.0;return d|0}function Di(b,d,e,f){b=b|0;d=+d;e=e|0;f=+f;var h=0,i=0.0,j=0;eb(c[6994]|0,0)|0;if(e){g[b+284>>2]=f;i=+g[b+280>>2]+d;g[b+280>>2]=i;if(!(i>=f)){d=f;j=0}else{g[b+280>>2]=i-+(~~(i/f)|0)*f;d=f;j=~~(i/f)}}else{g[b+280>>2]=a[b+316>>0]|0?0.0:d;g[b+284>>2]=0.0;j=!(+C(+d)<1.1920928955078125e-07)&1;e=j}if(xb[c[(c[b>>2]|0)+20>>2]&127](b)|0){h=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;a[28564]=(xb[c[(c[h>>2]|0)+56>>2]&127](h)|0)>>>4&1}if(j){h=(j|0)>(e|0)?e:j;Jb[c[(c[b>>2]|0)+168>>2]&31](b,d*+(h|0));Ib[c[(c[b>>2]|0)+176>>2]&511](b);if((h|0)>0){e=0;do{Jb[c[(c[b>>2]|0)+160>>2]&31](b,d);Ib[c[(c[b>>2]|0)+80>>2]&511](b);e=e+1|0}while((e|0)<(h|0));e=b}else e=b}else{Ib[c[(c[b>>2]|0)+80>>2]&511](b);e=b}Ib[c[(c[e>>2]|0)+120>>2]&511](b);c[6993]=(c[6993]|0)+1;return j|0}function Ei(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=c[d+4>>2]|0;f=c[b+24>>2]|0;if((f|0)<(i|0)){if((c[b+28>>2]|0)<(i|0)){if(!i){e=0;h=f}else{c[6995]=(c[6995]|0)+1;e=sc((i<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}h=c[b+24>>2]|0}if((h|0)>0){g=0;do{c[e+(g<<2)>>2]=c[(c[b+32>>2]|0)+(g<<2)>>2];g=g+1|0}while((g|0)!=(h|0))}g=c[b+32>>2]|0;if(g|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=e;c[b+28>>2]=i;e=b+32|0}else e=b+32|0;do{c[(c[e>>2]|0)+(f<<2)>>2]=0;f=f+1|0}while((f|0)!=(i|0))}else e=b+32|0;c[b+24>>2]=i;f=c[e>>2]|0;if((i|0)<=0)return;e=0;do{c[f+(e<<2)>>2]=c[(c[d+12>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(i|0));return}function Fi(a,b,d){a=a|0;b=b|0;d=d|0;do if(!((b|0)==32&(d|0)==32)){if((b|0)==32){if((d|0)<20){a=a+92|0;break}if((d+-21|0)>>>0<9){a=a+100|0;break}}else{if((b|0)<20&(d|0)==32){a=a+96|0;break}if((b+-21|0)>>>0<9&(d|0)==32){a=a+104|0;break}if((b|0)==8&(d|0)==8){a=a+56|0;break}if((b|0)==8&(d|0)==1){a=a+72|0;break}if((b|0)==1&(d|0)==8){a=a+76|0;break}}if(!(d|b)){a=a+68|0;break}if((b|0)<20&(d|0)==28){a=a+84|0;break}if((b|0)==28&(d|0)<20){a=a+80|0;break}if((b|0)<20){if((d|0)<20){a=a+28|0;break}if((d+-21|0)>>>0<9){a=a+32|0;break}}else{if((d|0)<20&(b+-21|0)>>>0<9){a=a+36|0;break}if((b|0)==31)if((d|0)==31){a=a+44|0;break}else{a=a+40|0;break}}if((d|0)==31){a=a+48|0;break}else{a=a+52|0;break}}else a=a+88|0;while(0);return c[a>>2]|0}function Gi(b){b=b|0;var d=0,e=0,f=0;c[b>>2]=6512;e=c[b+52>>2]|0;if((e|0)>0){d=0;do{f=c[(c[b+60>>2]|0)+(d<<2)>>2]|0;if(f|0){Ib[c[c[f>>2]>>2]&511](f);f=c[b+4>>2]|0;Ob[c[(c[f>>2]|0)+60>>2]&127](f,c[(c[b+60>>2]|0)+(d<<2)>>2]|0)}d=d+1|0}while((d|0)!=(e|0))}d=c[b+60>>2]|0;if(d|0){if(a[b+64>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+60>>2]=0}a[b+64>>0]=1;c[b+60>>2]=0;c[b+52>>2]=0;c[b+56>>2]=0;d=c[b+40>>2]|0;if(d|0){if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+40>>2]=0}a[b+44>>0]=1;c[b+40>>2]=0;c[b+32>>2]=0;c[b+36>>2]=0;d=c[b+20>>2]|0;if(!d){a[b+24>>0]=1;c[b+20>>2]=0;c[b+12>>2]=0;b=b+16|0;c[b>>2]=0;return}if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+20>>2]=0;a[b+24>>0]=1;c[b+20>>2]=0;c[b+12>>2]=0;b=b+16|0;c[b>>2]=0;return}function Hi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0,s=0.0,t=0;if((e|0)>0)f=0;else return;do{g[d+(f<<4)+12>>2]=-999999984306749440.0;f=f+1|0}while((f|0)!=(e|0));r=0;do{j=+g[a+16>>2];k=+g[b+(r<<4)>>2]*j;l=+g[a+20>>2];m=+g[b+(r<<4)+4>>2]*l;n=+g[a+24>>2];o=+g[b+(r<<4)+8>>2]*n;p=c[a+100>>2]|0;if((p|0)>0){q=c[a+108>>2]|0;f=-1;i=0;h=-3402823466385288598117041.0e14;do{s=k*+g[q+(i<<4)>>2]+m*+g[q+(i<<4)+4>>2]+o*+g[q+(i<<4)+8>>2];t=s>h;f=t?i:f;h=t?s:h;i=i+1|0}while((i|0)!=(p|0));o=+g[q+(f<<4)+4>>2]*l;s=+g[q+(f<<4)+8>>2]*n;g[d+(r<<4)>>2]=+g[q+(f<<4)>>2]*j;g[d+(r<<4)+4>>2]=o;g[d+(r<<4)+8>>2]=s}else h=-999999984306749440.0;g[d+(r<<4)+12>>2]=h;r=r+1|0}while((r|0)!=(e|0));return}function Ii(a,b,c,d,e,f,h,i,j,k,l){a=a|0;b=b|0;c=+c;d=+d;e=+e;f=+f;h=+h;i=+i;j=j|0;k=k|0;l=+l;var m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0;x=+g[a>>2]*f+ +g[a+16>>2]*h+ +g[a+32>>2]*i;v=+g[a+4>>2]*f+ +g[a+20>>2]*h+ +g[a+36>>2]*i;t=+g[a+8>>2]*f+ +g[a+24>>2]*h+ +g[a+40>>2]*i;s=+g[b>>2]*f+ +g[b+16>>2]*h+ +g[b+32>>2]*i;q=+g[b+4>>2]*f+ +g[b+20>>2]*h+ +g[b+36>>2]*i;o=+g[b+8>>2]*f+ +g[b+24>>2]*h+ +g[b+40>>2]*i;w=+g[j+80>>2];u=+g[j+84>>2];p=+g[j+88>>2];r=+g[k+80>>2];m=+g[k+84>>2];n=+g[k+88>>2];p=x*(x<0.0?-w:w)+v*(v<0.0?-u:u)+t*(t<0.0?-p:p);n=s*(s<0.0?-r:r)+q*(q<0.0?-m:m)+o*(o<0.0?-n:n);o=+g[j+96>>2];m=+g[k+96>>2];m=(p>o?p:o)+(n>m?n:m);return !((c*f+d*h+e*i+ml)|0}function Ji(a,b,d){a=a|0;b=b|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;while(1){m=c[a+12>>2]|0;n=c[m+(((b+d|0)/2|0)<<2)>>2]|0;f=b;e=d;while(1){l=c[n+772>>2]|0;l=c[((c[l+208>>2]|0)>-1?l:c[n+776>>2]|0)+208>>2]|0;while(1){h=m+(f<<2)|0;i=c[h>>2]|0;k=c[i+772>>2]|0;j=f+1|0;if((c[((c[k+208>>2]|0)>-1?k:c[i+776>>2]|0)+208>>2]|0)<(l|0))f=j;else break}while(1){g=c[m+(e<<2)>>2]|0;o=c[g+772>>2]|0;k=e+-1|0;if((l|0)<(c[((c[o+208>>2]|0)>-1?o:c[g+776>>2]|0)+208>>2]|0))e=k;else break}if((f|0)<=(e|0)){c[h>>2]=g;c[(c[a+12>>2]|0)+(e<<2)>>2]=i;f=j;e=k}if((f|0)>(e|0))break;m=c[a+12>>2]|0}if((e|0)>(b|0))Ji(a,b,e);if((f|0)<(d|0))b=f;else break}return} +function wd(b,d){b=b|0;d=+d;var e=0,f=0.0,h=0,i=0,j=0.0,k=0.0,m=0,n=0,o=0,p=0.0,q=0.0,r=0,s=0.0,t=0,u=0;r=l;l=l+288|0;o=c[b+248>>2]|0;if((o|0)>0){h=c[b+256>>2]|0;i=r+224+48|0;m=r+64+28|0;e=0;do{n=c[h+(e<<2)>>2]|0;g[n+268>>2]=1.0;a:do switch(c[n+220>>2]|0){case 2:case 5:break;default:if(!(c[n+204>>2]&3)){Af(n+4|0,+g[n+372>>2],+g[n+376>>2],+g[n+380>>2],n+388|0,d,r+224|0);f=+g[i>>2]-+g[n+52>>2];j=+g[r+224+52>>2]-+g[n+56>>2];k=+g[r+224+56>>2]-+g[n+60>>2];do if((a[b+44>>0]|0?(s=+g[n+276>>2],s*s!=0.0?s*s>2]|0)+4>>2]|0)<20:0){c[5787]=(c[5787]|0)+1;u=c[b+68>>2]|0;u=xb[c[(c[u>>2]|0)+36>>2]&127](u)|0;t=c[b+24>>2]|0;g[r+120+4>>2]=1.0;c[r+120+16>>2]=c[n+52>>2];c[r+120+16+4>>2]=c[n+52+4>>2];c[r+120+16+8>>2]=c[n+52+8>>2];c[r+120+16+12>>2]=c[n+52+12>>2];c[r+120+32>>2]=c[i>>2];c[r+120+32+4>>2]=c[i+4>>2];c[r+120+32+8>>2]=c[i+8>>2];c[r+120+32+12>>2]=c[i+12>>2];c[r+120+80>>2]=0;c[r+120>>2]=4556;c[r+120+84>>2]=n;c[r+120+92>>2]=u;c[r+120+96>>2]=t;t=c[n+272>>2]|0;c[r+64+8>>2]=0;c[r+64+12>>2]=-1;c[r+64>>2]=7020;c[r+64+4>>2]=8;c[r+64+16>>2]=1065353216;c[r+64+20>>2]=1065353216;c[r+64+24>>2]=1065353216;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;c[r+64+32>>2]=t;c[r+64+48>>2]=t;g[r+64+52>>2]=0.0;c[r+120+88>>2]=c[b+56>>2];t=c[n+188>>2]|0;c[r+120+8>>2]=c[t+4>>2];c[r+120+12>>2]=c[t+8>>2];c[r+48>>2]=c[i>>2];c[r+48+4>>2]=c[i+4>>2];c[r+48+8>>2]=c[i+8>>2];c[r+48+12>>2]=c[i+12>>2];c[r>>2]=c[n+4>>2];c[r+4>>2]=c[n+4+4>>2];c[r+8>>2]=c[n+4+8>>2];c[r+12>>2]=c[n+4+12>>2];c[r+16>>2]=c[n+20>>2];c[r+16+4>>2]=c[n+20+4>>2];c[r+16+8>>2]=c[n+20+8>>2];c[r+16+12>>2]=c[n+20+12>>2];c[r+32>>2]=c[n+36>>2];c[r+32+4>>2]=c[n+36+4>>2];c[r+32+8>>2]=c[n+36+8>>2];c[r+32+12>>2]=c[n+36+12>>2];Ud(b,r+64|0,n+4|0,r,r+120|0,0.0);f=+g[r+120+4>>2];if(f<1.0){g[n+268>>2]=f;Af(n+4|0,+g[n+372>>2],+g[n+376>>2],+g[n+380>>2],n+388|0,f*d,r+224|0);g[n+268>>2]=0.0;Oe(n,r+224|0);break a}else break}while(0);Oe(n,r+224|0)}}while(0);e=e+1|0}while((e|0)<(o|0))}if(!(a[b+291>>0]|0)){l=r;return}if((c[b+324>>2]|0)<=0){l=r;return}n=0;do{o=c[(c[b+332>>2]|0)+(n<<2)>>2]|0;h=c[o+772>>2]|0;h=(c[h+252>>2]&2|0)==0?0:h;m=c[o+776>>2]|0;m=(c[m+252>>2]&2|0)==0?0:m;e=c[o+780>>2]|0;if((e|0)>0)if(!h){h=0;do{f=+g[58]*+g[m+232>>2];if(f>0.0?(p=+g[o+4+(h*192|0)+124>>2],p!=0.0):0){k=f*+g[o+4+(h*192|0)+64>>2]*p;d=f*+g[o+4+(h*192|0)+68>>2]*p;s=f*+g[o+4+(h*192|0)+72>>2]*p;f=+g[o+4+(h*192|0)+36>>2]-+g[m+56>>2];j=+g[o+4+(h*192|0)+40>>2]-+g[m+60>>2];g[r+64>>2]=+g[o+4+(h*192|0)+32>>2]-+g[m+52>>2];g[r+64+4>>2]=f;g[r+64+8>>2]=j;g[r+64+12>>2]=0.0;g[r>>2]=k;g[r+4>>2]=d;g[r+8>>2]=s;g[r+12>>2]=0.0;ll(m,r,r+64|0);e=c[o+780>>2]|0}h=h+1|0}while((h|0)<(e|0))}else{i=0;do{f=+g[h+232>>2]*+g[m+232>>2];if(f>0.0?(q=+g[o+4+(i*192|0)+124>>2],q!=0.0):0){k=f*+g[o+4+(i*192|0)+64>>2]*q;d=f*+g[o+4+(i*192|0)+68>>2]*q;s=f*+g[o+4+(i*192|0)+72>>2]*q;g[r+224>>2]=-k;g[r+224+4>>2]=-d;g[r+224+8>>2]=-s;g[r+224+12>>2]=0.0;j=+g[o+4+(i*192|0)+52>>2]-+g[h+56>>2];f=+g[o+4+(i*192|0)+56>>2]-+g[h+60>>2];g[r+120>>2]=+g[o+4+(i*192|0)+48>>2]-+g[h+52>>2];g[r+120+4>>2]=j;g[r+120+8>>2]=f;g[r+120+12>>2]=0.0;f=+g[o+4+(i*192|0)+36>>2]-+g[m+56>>2];j=+g[o+4+(i*192|0)+40>>2]-+g[m+60>>2];g[r+64>>2]=+g[o+4+(i*192|0)+32>>2]-+g[m+52>>2];g[r+64+4>>2]=f;g[r+64+8>>2]=j;g[r+64+12>>2]=0.0;ll(h,r+224|0,r+120|0);g[r>>2]=k;g[r+4>>2]=d;g[r+8>>2]=s;g[r+12>>2]=0.0;ll(m,r,r+64|0);e=c[o+780>>2]|0}i=i+1|0}while((i|0)<(e|0))}n=n+1|0}while((n|0)<(c[b+324>>2]|0));l=r;return}function xd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0.0,i=0.0,j=0.0,k=0.0,m=0,n=0.0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0;q=l;l=l+240|0;c[a+4>>2]=(c[a+4>>2]|0)+1;p=c[b+36>>2]|0;o=c[d+36>>2]|0;f=c[a+8>>2]|0;J=c[(c[f+4>>2]|0)+28>>2]|0;d=c[J+(p*80|0)+64>>2]|0;b=(c[(c[a+12>>2]|0)+4>>2]|0)+28|0;e=c[(c[b>>2]|0)+(o*80|0)+64>>2]|0;f=c[f+12>>2]|0;n=+g[f>>2];H=+g[f+4>>2];I=+g[f+8>>2];h=+g[f+16>>2];k=+g[f+20>>2];t=+g[f+24>>2];r=+g[f+32>>2];u=+g[f+36>>2];C=+g[f+40>>2];v=+g[J+(p*80|0)>>2];w=+g[J+(p*80|0)+16>>2];x=+g[J+(p*80|0)+32>>2];y=+g[J+(p*80|0)+4>>2];z=+g[J+(p*80|0)+20>>2];A=+g[J+(p*80|0)+36>>2];i=+g[J+(p*80|0)+8>>2];B=+g[J+(p*80|0)+24>>2];D=+g[J+(p*80|0)+40>>2];s=+g[J+(p*80|0)+48>>2];j=+g[J+(p*80|0)+52>>2];G=+g[J+(p*80|0)+56>>2];E=+g[f+48>>2]+(n*s+H*j+I*G);F=+g[f+52>>2]+(h*s+k*j+t*G);G=+g[f+56>>2]+(r*s+u*j+C*G);g[q+176>>2]=n*v+H*w+I*x;g[q+176+4>>2]=n*y+H*z+I*A;g[q+176+8>>2]=n*i+H*B+I*D;g[q+176+12>>2]=0.0;g[q+176+16>>2]=h*v+k*w+t*x;g[q+176+20>>2]=h*y+k*z+t*A;g[q+176+24>>2]=h*i+k*B+t*D;g[q+176+28>>2]=0.0;g[q+176+32>>2]=r*v+u*w+C*x;g[q+176+36>>2]=r*y+u*z+C*A;g[q+176+40>>2]=r*i+u*B+C*D;g[q+176+44>>2]=0.0;g[q+176+48>>2]=E;g[q+176+52>>2]=F;g[q+176+56>>2]=G;g[q+176+60>>2]=0.0;f=c[(c[a+12>>2]|0)+12>>2]|0;G=+g[f>>2];F=+g[f+4>>2];E=+g[f+8>>2];D=+g[f+16>>2];C=+g[f+20>>2];B=+g[f+24>>2];u=+g[f+32>>2];i=+g[f+36>>2];r=+g[f+40>>2];b=c[b>>2]|0;A=+g[b+(o*80|0)>>2];z=+g[b+(o*80|0)+16>>2];y=+g[b+(o*80|0)+32>>2];x=+g[b+(o*80|0)+4>>2];w=+g[b+(o*80|0)+20>>2];v=+g[b+(o*80|0)+36>>2];t=+g[b+(o*80|0)+8>>2];k=+g[b+(o*80|0)+24>>2];h=+g[b+(o*80|0)+40>>2];I=+g[b+(o*80|0)+48>>2];H=+g[b+(o*80|0)+52>>2];n=+g[b+(o*80|0)+56>>2];j=+g[f+48>>2]+(G*I+F*H+E*n);s=+g[f+52>>2]+(D*I+C*H+B*n);n=+g[f+56>>2]+(u*I+i*H+r*n);g[q+112>>2]=G*A+F*z+E*y;g[q+112+4>>2]=G*x+F*w+E*v;g[q+112+8>>2]=G*t+F*k+E*h;g[q+112+12>>2]=0.0;g[q+112+16>>2]=D*A+C*z+B*y;g[q+112+20>>2]=D*x+C*w+B*v;g[q+112+24>>2]=D*t+C*k+B*h;g[q+112+28>>2]=0.0;g[q+112+32>>2]=u*A+i*z+r*y;g[q+112+36>>2]=u*x+i*w+r*v;g[q+112+40>>2]=u*t+i*k+r*h;g[q+112+44>>2]=0.0;g[q+112+48>>2]=j;g[q+112+52>>2]=s;g[q+112+56>>2]=n;g[q+112+60>>2]=0.0;Vb[c[(c[d>>2]|0)+8>>2]&127](d,q+176|0,q+96|0,q+80|0);Vb[c[(c[e>>2]|0)+8>>2]&127](e,q+112|0,q+64|0,q+48|0);n=+g[(c[a+24>>2]|0)+32>>2];s=+g[q+96>>2]-n;g[q+96>>2]=s;j=+g[q+96+4>>2]-n;g[q+96+4>>2]=j;h=+g[q+96+8>>2]-n;g[q+96+8>>2]=h;r=n+ +g[q+80>>2];g[q+80>>2]=r;k=n+ +g[q+80+4>>2];g[q+80+4>>2]=k;i=n+ +g[q+80+8>>2];g[q+80+8>>2]=i;if(!(s>+g[q+48>>2])?!(r<+g[q+64>>2]):0)b=1;else b=0;if(!(!(h>+g[q+48+8>>2])?!(i<+g[q+64+8>>2]):0))b=0;if(j>+g[q+48+4>>2]){l=q;return}if(k<+g[q+64+4>>2]|b^1){l=q;return}f=c[a+8>>2]|0;b=c[f+8>>2]|0;c[q+24>>2]=f;c[q+24+4>>2]=d;c[q+24+8>>2]=b;c[q+24+12>>2]=q+176;c[q+24+16>>2]=-1;c[q+24+20>>2]=p;b=c[a+12>>2]|0;f=c[b+8>>2]|0;c[q>>2]=b;c[q+4>>2]=e;c[q+8>>2]=f;c[q+12>>2]=q+112;c[q+16>>2]=-1;c[q+20>>2]=o;f=c[a+28>>2]|0;c[6416]=(c[6416]|0)+1;b=(((o<<16|p)+~((o<<16|p)<<15)|0)>>>10^(o<<16|p)+~((o<<16|p)<<15))*9|0;b=(c[f+12>>2]|0)+-1&(((b>>>6^b)+~((b>>>6^b)<<11)|0)>>>16^(b>>>6^b)+~((b>>>6^b)<<11));a:do if((b|0)<(c[f+28>>2]|0)?(m=c[(c[f+36>>2]|0)+(b<<2)>>2]|0,(m|0)!=-1):0){e=c[f+16>>2]|0;d=m;while(1){b=e+(d*12|0)|0;if((c[b>>2]|0)==(p|0)?(c[e+(d*12|0)+4>>2]|0)==(o|0):0)break a;d=c[(c[f+56>>2]|0)+(d<<2)>>2]|0;if((d|0)==-1){b=0;break}}}else b=0;while(0);do if(!(n>0.0))if(!b){b=c[a+16>>2]|0;b=Db[c[(c[b>>2]|0)+8>>2]&1](b,q+24|0,q,c[a+32>>2]|0,1)|0;J=c[a+28>>2]|0;c[(Bb[c[(c[J>>2]|0)+12>>2]&63](J,p,o)|0)+8>>2]=b;break}else{b=c[b+8>>2]|0;break}else{b=c[a+16>>2]|0;b=Db[c[(c[b>>2]|0)+8>>2]&1](b,q+24|0,q,0,2)|0}while(0);J=c[a+24>>2]|0;f=c[J+8>>2]|0;m=c[J+12>>2]|0;c[J+8>>2]=q+24;c[J+12>>2]=q;Sb[c[(c[J>>2]|0)+8>>2]&127](J,-1,p);J=c[a+24>>2]|0;Sb[c[(c[J>>2]|0)+12>>2]&127](J,-1,o);Zb[c[(c[b>>2]|0)+8>>2]&31](b,q+24|0,q,c[a+20>>2]|0,c[a+24>>2]|0);J=c[a+24>>2]|0;c[J+8>>2]=f;c[J+12>>2]=m;l=q;return}function yd(b,d,e){b=b|0;d=d|0;e=e|0;fi(b,d,e)|0;c[d+52>>2]=c[b+48>>2];c[d+56>>2]=c[b+52>>2];c[d+60>>2]=c[b+56>>2];c[d+64>>2]=c[b+60>>2];c[d+68>>2]=c[b+64>>2];c[d+72>>2]=c[b+68>>2];c[d+76>>2]=c[b+72>>2];c[d+80>>2]=c[b+76>>2];c[d+84>>2]=c[b+80>>2];c[d+88>>2]=c[b+84>>2];c[d+92>>2]=c[b+88>>2];c[d+96>>2]=c[b+92>>2];c[d+100>>2]=c[b+96>>2];c[d+104>>2]=c[b+100>>2];c[d+108>>2]=c[b+104>>2];c[d+112>>2]=c[b+108>>2];c[d+116>>2]=c[b+112>>2];c[d+120>>2]=c[b+116>>2];c[d+124>>2]=c[b+120>>2];c[d+128>>2]=c[b+124>>2];c[d+132>>2]=c[b+128>>2];c[d+136>>2]=c[b+132>>2];c[d+140>>2]=c[b+136>>2];c[d+144>>2]=c[b+140>>2];c[d+148>>2]=c[b+144>>2];c[d+152>>2]=c[b+148>>2];c[d+156>>2]=c[b+152>>2];c[d+160>>2]=c[b+156>>2];c[d+164>>2]=c[b+160>>2];c[d+168>>2]=c[b+164>>2];c[d+172>>2]=c[b+168>>2];c[d+176>>2]=c[b+172>>2];c[d+428>>2]=c[b+968>>2];c[d+412>>2]=c[b+972>>2];c[d+444>>2]=c[b+976>>2];c[d+460>>2]=c[b+980>>2];c[d+476>>2]=c[b+984>>2];c[d+492>>2]=c[b+988>>2];c[d+508>>2]=c[b+992>>2];c[d+524>>2]=c[b+1e3>>2];c[d+540>>2]=c[b+1004>>2];c[d+556>>2]=c[b+1012>>2];c[d+572>>2]=c[b+1020>>2];c[d+588>>2]=c[b+1028>>2];c[d+604>>2]=c[b+1036>>2];c[d+432>>2]=c[b+1056>>2];c[d+416>>2]=c[b+1060>>2];c[d+448>>2]=c[b+1064>>2];c[d+464>>2]=c[b+1068>>2];c[d+480>>2]=c[b+1072>>2];c[d+496>>2]=c[b+1076>>2];c[d+512>>2]=c[b+1080>>2];c[d+528>>2]=c[b+1088>>2];c[d+544>>2]=c[b+1092>>2];c[d+560>>2]=c[b+1100>>2];c[d+576>>2]=c[b+1108>>2];c[d+592>>2]=c[b+1116>>2];c[d+608>>2]=c[b+1124>>2];c[d+436>>2]=c[b+1144>>2];c[d+420>>2]=c[b+1148>>2];c[d+452>>2]=c[b+1152>>2];c[d+468>>2]=c[b+1156>>2];c[d+484>>2]=c[b+1160>>2];c[d+500>>2]=c[b+1164>>2];c[d+516>>2]=c[b+1168>>2];c[d+532>>2]=c[b+1176>>2];c[d+548>>2]=c[b+1180>>2];c[d+564>>2]=c[b+1188>>2];c[d+580>>2]=c[b+1196>>2];c[d+596>>2]=c[b+1204>>2];c[d+612>>2]=c[b+1212>>2];g[d+440>>2]=0.0;g[d+424>>2]=0.0;g[d+456>>2]=0.0;g[d+472>>2]=0.0;g[d+488>>2]=0.0;g[d+504>>2]=0.0;g[d+520>>2]=0.0;g[d+536>>2]=0.0;g[d+552>>2]=0.0;g[d+568>>2]=0.0;g[d+584>>2]=0.0;g[d+600>>2]=0.0;g[d+616>>2]=0.0;a[d+620>>0]=a[b+996>>0]|0;a[d+624>>0]=a[b+1008>>0]|0;a[d+628>>0]=a[b+1016>>0]|0;a[d+632>>0]=a[b+1024>>0]|0;a[d+636>>0]=a[b+1032>>0]|0;a[d+621>>0]=a[b+1084>>0]|0;a[d+625>>0]=a[b+1096>>0]|0;a[d+629>>0]=a[b+1104>>0]|0;a[d+633>>0]=a[b+1112>>0]|0;a[d+637>>0]=a[b+1120>>0]|0;a[d+622>>0]=a[b+1172>>0]|0;a[d+626>>0]=a[b+1184>>0]|0;a[d+630>>0]=a[b+1192>>0]|0;a[d+634>>0]=a[b+1200>>0]|0;a[d+638>>0]=a[b+1208>>0]|0;a[d+623>>0]=0;a[d+627>>0]=0;a[d+631>>0]=0;a[d+635>>0]=0;a[d+639>>0]=0;c[d+196>>2]=c[b+680>>2];c[d+200>>2]=c[b+684>>2];c[d+204>>2]=c[b+688>>2];c[d+208>>2]=c[b+692>>2];c[d+180>>2]=c[b+696>>2];c[d+184>>2]=c[b+700>>2];c[d+188>>2]=c[b+704>>2];c[d+192>>2]=c[b+708>>2];c[d+212>>2]=c[b+712>>2];c[d+216>>2]=c[b+716>>2];c[d+220>>2]=c[b+720>>2];c[d+224>>2]=c[b+724>>2];c[d+228>>2]=c[b+728>>2];c[d+232>>2]=c[b+732>>2];c[d+236>>2]=c[b+736>>2];c[d+240>>2]=c[b+740>>2];c[d+244>>2]=c[b+744>>2];c[d+248>>2]=c[b+748>>2];c[d+252>>2]=c[b+752>>2];c[d+256>>2]=c[b+756>>2];c[d+260>>2]=c[b+760>>2];c[d+264>>2]=c[b+764>>2];c[d+268>>2]=c[b+768>>2];c[d+272>>2]=c[b+772>>2];c[d+276>>2]=c[b+776>>2];c[d+280>>2]=c[b+780>>2];c[d+284>>2]=c[b+784>>2];c[d+288>>2]=c[b+788>>2];c[d+292>>2]=c[b+876>>2];c[d+296>>2]=c[b+880>>2];c[d+300>>2]=c[b+884>>2];c[d+304>>2]=c[b+888>>2];c[d+308>>2]=c[b+892>>2];c[d+312>>2]=c[b+896>>2];c[d+316>>2]=c[b+900>>2];c[d+320>>2]=c[b+904>>2];c[d+324>>2]=c[b+804>>2];c[d+328>>2]=c[b+808>>2];c[d+332>>2]=c[b+812>>2];c[d+336>>2]=c[b+816>>2];c[d+340>>2]=c[b+820>>2];c[d+344>>2]=c[b+824>>2];c[d+348>>2]=c[b+828>>2];c[d+352>>2]=c[b+832>>2];c[d+356>>2]=c[b+840>>2];c[d+360>>2]=c[b+844>>2];c[d+364>>2]=c[b+848>>2];c[d+368>>2]=c[b+852>>2];c[d+372>>2]=c[b+860>>2];c[d+376>>2]=c[b+864>>2];c[d+380>>2]=c[b+868>>2];c[d+384>>2]=c[b+872>>2];a[d+388>>0]=a[b+792>>0]|0;a[d+392>>0]=a[b+795>>0]|0;a[d+396>>0]=a[b+798>>0]|0;a[d+400>>0]=a[b+836>>0]|0;a[d+404>>0]=a[b+856>>0]|0;a[d+389>>0]=a[b+793>>0]|0;a[d+393>>0]=a[b+796>>0]|0;a[d+397>>0]=a[b+799>>0]|0;a[d+401>>0]=a[b+837>>0]|0;a[d+405>>0]=a[b+857>>0]|0;a[d+390>>0]=a[b+794>>0]|0;a[d+394>>0]=a[b+797>>0]|0;a[d+398>>0]=a[b+800>>0]|0;a[d+402>>0]=a[b+838>>0]|0;a[d+406>>0]=a[b+858>>0]|0;a[d+391>>0]=0;a[d+395>>0]=0;a[d+399>>0]=0;a[d+403>>0]=0;a[d+407>>0]=0;c[d+640>>2]=c[b+1232>>2];c[d+408>>2]=0;return 12302}function zd(b,d,e,f,h,i,j,k,m){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0,J=0.0;I=l;l=l+128|0;c[I+16>>2]=i;c[I+16+4>>2]=j;c[I+16+8>>2]=k;c[I>>2]=e;c[I+4>>2]=f;c[I+8>>2]=h;if(!(+g[d+52>>2]<+g[b+12>>2])){m=0;l=I;return m|0}w=+g[d+36>>2];y=+g[d+40>>2];x=+g[d+44>>2];k=c[d+48>>2]|0;z=1.0/+D(+(w*w+y*y+x*x));h=ui(I)|0;A=+g[d+4>>2]-+g[h+48>>2];B=+g[d+8>>2]-+g[h+52>>2];C=+g[d+12>>2]-+g[h+56>>2];h=ui(I+16|0)|0;E=+g[d+20>>2]-+g[h+48>>2];F=+g[d+24>>2]-+g[h+52>>2];G=+g[d+28>>2]-+g[h+56>>2];if(!f)if(!e){p=0.0;s=0.0;q=0.0;n=0.0;o=0.0;r=0.0}else{r=+g[e+336>>2];o=+g[e+340>>2];v=+g[e+332>>2];p=+g[e+316>>2];s=+g[e+320>>2];q=+g[e+324>>2];n=C*r-B*o;o=A*o-C*v;r=B*v-A*r}else{r=+g[f+392>>2];o=+g[f+396>>2];v=+g[f+388>>2];p=+g[f+372>>2];s=+g[f+376>>2];q=+g[f+380>>2];n=C*r-B*o;o=A*o-C*v;r=B*v-A*r}v=p+n;u=s+o;t=q+r;if(!j)if(!i){r=0.0;s=0.0;n=0.0;o=0.0;p=0.0;q=0.0}else{q=+g[i+336>>2];p=+g[i+340>>2];J=+g[i+332>>2];r=+g[i+316>>2];s=+g[i+320>>2];n=+g[i+324>>2];o=G*q-F*p;p=E*p-G*J;q=F*J-E*q}else{q=+g[j+392>>2];p=+g[j+396>>2];J=+g[j+388>>2];r=+g[j+372>>2];s=+g[j+376>>2];n=+g[j+380>>2];o=G*q-F*p;p=E*p-G*J;q=F*J-E*q}r=v-(r+o);u=u-(s+p);t=t-(n+q);v=x*z*t+(y*z*u+w*z*r);J=+g[d+52>>2]-+g[b+12>>2];c[m+4>>2]=c[I>>2];c[m+4+4>>2]=c[I+4>>2];c[m+4+8>>2]=c[I+8>>2];c[m+16>>2]=c[I+16>>2];c[m+16+4>>2]=c[I+16+4>>2];c[m+16+8>>2]=c[I+16+8>>2];d=ui(I)|0;s=A*+g[d+4>>2]+B*+g[d+20>>2]+C*+g[d+36>>2];q=A*+g[d+8>>2]+B*+g[d+24>>2]+C*+g[d+40>>2];g[m+28>>2]=A*+g[d>>2]+B*+g[d+16>>2]+C*+g[d+32>>2];g[m+32>>2]=s;g[m+36>>2]=q;g[m+40>>2]=0.0;d=ui(I+16|0)|0;q=E*+g[d+4>>2]+F*+g[d+20>>2]+G*+g[d+36>>2];s=E*+g[d+8>>2]+F*+g[d+24>>2]+G*+g[d+40>>2];g[m+44>>2]=E*+g[d>>2]+F*+g[d+16>>2]+G*+g[d+32>>2];g[m+48>>2]=q;g[m+52>>2]=s;g[m+56>>2]=0.0;g[m+164>>2]=A;g[m+168>>2]=B;g[m+172>>2]=C;g[m+176>>2]=0.0;g[m+180>>2]=E;g[m+184>>2]=F;g[m+188>>2]=G;g[m+192>>2]=0.0;g[m+60>>2]=1.0;g[m+64>>2]=1.0;c[m+156>>2]=0;c[m+160>>2]=0;g[m+68>>2]=1.0;g[m+72>>2]=w*z*J;g[m+76>>2]=y*z*J;g[m+80>>2]=x*z*J;g[m+84>>2]=0.0;g[m+196>>2]=w*z;g[m+200>>2]=y*z;g[m+204>>2]=x*z;c[m+208>>2]=k;a[m+152>>0]=0;J=+g[b+16>>2];g[m+212>>2]=(t-x*z*v)*(t-x*z*v)+((r-w*z*v)*(r-w*z*v)+(u-y*z*v)*(u-y*z*v))>2]|0;if(!k){k=c[I>>2]|0;if(!k)o=0.0;else{k=k+128|0;H=14}}else{k=k+404|0;H=14}if((H|0)==14)o=+g[k>>2];if((a[22432]|0)==0?Uz(22432)|0:0){k=22904;h=k+48|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(h|0))}k=c[I+4>>2]|0;if(!k){e=c[I>>2]|0;e=(e|0)==0?22904:e+180|0}else e=k+324|0;k=c[I+16+4>>2]|0;if(!k){k=c[I+16>>2]|0;if(!k)n=0.0;else{k=k+128|0;H=25}}else{k=k+404|0;H=25}if((H|0)==25)n=+g[k>>2];if((a[22432]|0)==0?Uz(22432)|0:0){k=22904;h=k+48|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(h|0))}k=c[I+16+4>>2]|0;if(!k){k=c[I+16>>2]|0;k=(k|0)==0?22904:k+180|0}else k=k+324|0;Uh(I+80|0,o,e,+g[m+164>>2],+g[m+168>>2],+g[m+172>>2]);Uh(I+32|0,n,k,+g[m+180>>2],+g[m+184>>2],+g[m+188>>2]);C=+g[I+80>>2]+ +g[I+32>>2];F=+g[I+80+4>>2]+ +g[I+32+4>>2];y=+g[I+80+8>>2]+ +g[I+32+8>>2];G=+g[I+80+16>>2]+ +g[I+32+16>>2];E=+g[I+80+20>>2]+ +g[I+32+20>>2];z=+g[I+80+24>>2]+ +g[I+32+24>>2];A=+g[I+80+32>>2]+ +g[I+32+32>>2];B=+g[I+80+36>>2]+ +g[I+32+36>>2];x=+g[I+80+40>>2]+ +g[I+32+40>>2];J=1.0/(y*(G*B-E*A)+(C*(E*x-z*B)+F*(z*A-G*x)));g[m+104>>2]=(E*x-z*B)*J;g[m+108>>2]=(y*B-F*x)*J;g[m+112>>2]=(F*z-y*E)*J;g[m+116>>2]=0.0;g[m+120>>2]=(z*A-G*x)*J;g[m+124>>2]=(C*x-y*A)*J;g[m+128>>2]=(y*G-C*z)*J;g[m+132>>2]=0.0;g[m+136>>2]=(G*B-E*A)*J;g[m+140>>2]=(F*A-C*B)*J;g[m+144>>2]=(C*E-F*G)*J;g[m+148>>2]=0.0;m=1;l=I;return m|0}function Ad(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var k=0.0,m=0,n=0.0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0,v=0.0,w=0.0;u=l;l=l+288|0;q=c[b+4>>2]|0;a[q+312>>0]=0;c[q>>2]=0;a[q+356>>0]=1;c[q+292>>2]=1566444395;c[q+296>>2]=1566444395;c[q+300>>2]=1566444395;g[q+304>>2]=0.0;c[q+336>>2]=0;c[q+336+4>>2]=0;c[q+336+8>>2]=0;c[q+336+12>>2]=0;a[q+336+16>>0]=0;a[q+332>>0]=a[q+332>>0]&-16;r=+g[e+48>>2]-+g[d+48>>2]-(+g[h+48>>2]-+g[f+48>>2]);s=+g[e+52>>2]-+g[d+52>>2]-(+g[h+52>>2]-+g[f+52>>2]);t=+g[e+56>>2]-+g[d+56>>2]-(+g[h+56>>2]-+g[f+56>>2]);c[u+216>>2]=9504;g[u+216+36>>2]=999999984306749440.0;a[u+216+40>>0]=0;q=c[b+8>>2]|0;p=c[b+12>>2]|0;o=c[b+4>>2]|0;c[u+136>>2]=9552;c[u+136+4>>2]=0;c[u+136+8>>2]=1065353216;c[u+136+12>>2]=0;g[u+136+16>>2]=0.0;c[u+136+20>>2]=0;c[u+136+24>>2]=o;c[u+136+28>>2]=q;c[u+136+32>>2]=p;c[u+136+36>>2]=c[q+4>>2];c[u+136+40>>2]=c[p+4>>2];g[u+136+44>>2]=+nb[c[(c[q>>2]|0)+48>>2]&15](q);g[u+136+48>>2]=+nb[c[(c[p>>2]|0)+48>>2]&15](p);a[u+136+52>>0]=0;c[u+136+60>>2]=-1;c[u+136+72>>2]=1;c[u+136+76>>2]=1;g[u+128>>2]=999999984306749440.0;c[u>>2]=c[d>>2];c[u+4>>2]=c[d+4>>2];c[u+8>>2]=c[d+8>>2];c[u+12>>2]=c[d+12>>2];c[u+16>>2]=c[d+16>>2];c[u+16+4>>2]=c[d+16+4>>2];c[u+16+8>>2]=c[d+16+8>>2];c[u+16+12>>2]=c[d+16+12>>2];c[u+32>>2]=c[d+32>>2];c[u+32+4>>2]=c[d+32+4>>2];c[u+32+8>>2]=c[d+32+8>>2];c[u+32+12>>2]=c[d+32+12>>2];c[u+48>>2]=c[d+48>>2];c[u+48+4>>2]=c[d+48+4>>2];c[u+48+8>>2]=c[d+48+8>>2];c[u+48+12>>2]=c[d+48+12>>2];c[u+64>>2]=c[f>>2];c[u+64+4>>2]=c[f+4>>2];c[u+64+8>>2]=c[f+8>>2];c[u+64+12>>2]=c[f+12>>2];c[u+80>>2]=c[f+16>>2];c[u+80+4>>2]=c[f+16+4>>2];c[u+80+8>>2]=c[f+16+8>>2];c[u+80+12>>2]=c[f+16+12>>2];c[u+96>>2]=c[f+32>>2];c[u+96+4>>2]=c[f+32+4>>2];c[u+96+8>>2]=c[f+32+8>>2];c[u+96+12>>2]=c[f+32+12>>2];c[u+112>>2]=c[f+48>>2];c[u+112+4>>2]=c[f+48+4>>2];c[u+112+8>>2]=c[f+48+8>>2];c[u+112+12>>2]=c[f+48+12>>2];Dc(u+136|0,u,u+216|0,0,0);p=(a[u+216+40>>0]|0)==0;q=u+216+20|0;c[u+264>>2]=c[q>>2];c[u+264+4>>2]=c[q+4>>2];c[u+264+8>>2]=c[q+8>>2];c[u+264+12>>2]=c[q+12>>2];if(p){i=0;l=u;return i|0}n=+g[u+216+36>>2];k=+g[u+216+16>>2];b=c[u+216+12>>2]|0;m=c[u+216+8>>2]|0;o=c[u+216+4>>2]|0;do if(n>1.0000000474974513e-03){p=0;k=0.0;while(1){if((p|0)>31){b=0;p=13;break}w=r*(c[j>>2]=o,+g[j>>2]);w=s*(c[j>>2]=m,+g[j>>2])+w;v=k;k=k-n/(t*(c[j>>2]=b,+g[j>>2])+w);if(!(!(k<=v)&(!(k<0.0)&!(k>1.0)))){b=0;p=13;break}Jb[c[c[i>>2]>>2]&31](i,k);w=1.0-k;g[u+48>>2]=w*+g[d+48>>2]+k*+g[e+48>>2];g[u+52>>2]=w*+g[d+52>>2]+k*+g[e+52>>2];g[u+56>>2]=w*+g[d+56>>2]+k*+g[e+56>>2];g[u+112>>2]=w*+g[f+48>>2]+k*+g[h+48>>2];g[u+116>>2]=w*+g[f+52>>2]+k*+g[h+52>>2];g[u+120>>2]=w*+g[f+56>>2]+k*+g[h+56>>2];Dc(u+136|0,u,u+216|0,0,0);if(!(a[u+216+40>>0]|0)){b=0;p=13;break}n=+g[u+216+36>>2];if(n<0.0){p=8;break}c[u+264>>2]=c[q>>2];c[u+264+4>>2]=c[q+4>>2];c[u+264+8>>2]=c[q+8>>2];c[u+264+12>>2]=c[q+12>>2];b=c[u+216+12>>2]|0;m=c[u+216+8>>2]|0;o=c[u+216+4>>2]|0;if(!(n>1.0000000474974513e-03)){p=10;break}else p=p+1|0}if((p|0)==8){g[i+164>>2]=k;e=c[u+216+8>>2]|0;f=c[u+216+12>>2]|0;h=c[u+216+16>>2]|0;c[i+132>>2]=c[u+216+4>>2];c[i+136>>2]=e;c[i+140>>2]=f;c[i+144>>2]=h;c[i+148>>2]=c[q>>2];c[i+148+4>>2]=c[q+4>>2];c[i+148+8>>2]=c[q+8>>2];c[i+148+12>>2]=c[q+12>>2];i=1;l=u;return i|0}else if((p|0)==10){n=k;k=+g[u+216+16>>2];break}else if((p|0)==13){l=u;return b|0}}else n=0.0;while(0);w=r*(c[j>>2]=o,+g[j>>2]);w=s*(c[j>>2]=m,+g[j>>2])+w;if(t*(c[j>>2]=b,+g[j>>2])+w>=-+g[i+172>>2]){i=0;l=u;return i|0}g[i+164>>2]=n;c[i+132>>2]=o;c[i+136>>2]=m;c[i+140>>2]=b;g[i+144>>2]=k;c[i+148>>2]=c[u+264>>2];c[i+148+4>>2]=c[u+264+4>>2];c[i+148+8>>2]=c[u+264+8>>2];c[i+148+12>>2]=c[u+264+12>>2];i=1;l=u;return i|0}function Bd(a,d,f,h,i){a=a|0;d=d|0;f=f|0;h=h|0;i=i|0;var j=0,k=0.0,m=0.0,n=0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0,u=0.0,v=0,w=0,x=0.0,y=0.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;P=l;l=l+16|0;c[d+16>>2]=c[f>>2];c[d+16+4>>2]=c[f+4>>2];c[d+16+8>>2]=c[f+8>>2];c[d+16+12>>2]=c[f+12>>2];c[d+32>>2]=c[h>>2];c[d+32+4>>2]=c[h+4>>2];c[d+32+8>>2]=c[h+8>>2];c[d+32+12>>2]=c[h+12>>2];H=c[a+60>>2]|0;I=c[d+12>>2]&65535;q=+g[a+8>>2];s=+g[a+12>>2];x=+g[a+16>>2];r=+g[a+40>>2];k=(+g[f>>2]-q)*r;u=+g[a+44>>2];m=(+g[f+4>>2]-s)*u;y=+g[a+48>>2];o=(+g[f+8>>2]-x)*y;if(!(k<=0.0)){p=b[a+6>>1]|0;p=(!(k>=+(p&65535))?~~k&65535:p)&b[a+4>>1]}else p=0;b[P+6>>1]=p;if(!(m<=0.0)){j=b[a+6>>1]|0;j=(!(m>=+(j&65535))?~~m&65535:j)&b[a+4>>1]}else j=0;b[P+6+2>>1]=j;if(!(o<=0.0)){j=b[a+6>>1]|0;j=(!(o>=+(j&65535))?~~o&65535:j)&b[a+4>>1]}else j=0;b[P+6+4>>1]=j;o=(+g[h>>2]-q)*r;m=(+g[h+4>>2]-s)*u;k=(+g[h+8>>2]-x)*y;if(!(o<=0.0)){n=b[a+6>>1]|0;n=(!(o>=+(n&65535))?~~o&65535:n)&b[a+4>>1]|1}else n=1;b[P>>1]=n;if(!(m<=0.0)){j=b[a+6>>1]|0;j=(!(m>=+(j&65535))?~~m&65535:j)&b[a+4>>1]|1}else j=1;b[P+2>>1]=j;if(!(k<=0.0)){j=b[a+6>>1]|0;j=(!(k>=+(j&65535))?~~k&65535:j)&b[a+4>>1]|1}else j=1;b[P+4>>1]=j;G=0;while(1){D=b[H+(I<<6)+48+(G<<1)>>1]|0;E=b[H+(I<<6)+54+(G<<1)>>1]|0;B=a+68+(G<<2)|0;A=c[B>>2]|0;C=(p&65535)-(e[A+((D&65535)<<2)>>1]|0)|0;F=(n&65535)-(e[A+((E&65535)<<2)>>1]|0)|0;b[A+((D&65535)<<2)>>1]=p;b[A+((E&65535)<<2)>>1]=n;if((C|0)<0)xh(a,G,D);a:do if((F|0)>0?(J=c[B>>2]|0,K=c[a+60>>2]|0,L=e[J+((E&65535)<<2)+2>>1]|0,M=b[J+((E&65535)<<2)+6>>1]|0,M<<16>>16):0){z=1<>1]|0;if((e[w>>1]|0)<(n&65535))break a;t=c[a+60>>2]|0;p=j&65535;if(!(n&1)){do if((((e[K+(L<<6)+54+(z<<1)>>1]|0)>=(e[t+(p<<6)+48+(z<<1)>>1]|0)?(e[t+(p<<6)+54+(z<<1)>>1]|0)>=(e[K+(L<<6)+48+(z<<1)>>1]|0):0)?(e[K+(L<<6)+54+((1<>1]|0)>=(e[t+(p<<6)+48+((1<>1]|0):0)?(e[t+(p<<6)+54+((1<>1]|0)>=(e[K+(L<<6)+48+((1<>1]|0):0){n=c[a+92>>2]|0;j=t+((e[w+2>>1]|0)<<6)|0;Bb[c[(c[n>>2]|0)+8>>2]&63](n,j,t+(p<<6)|0)|0;n=c[a+96>>2]|0;if(!n)break;Bb[c[(c[n>>2]|0)+8>>2]&63](n,j,t+(p<<6)|0)|0}while(0);j=t+(p<<6)+48+(G<<1)|0}else j=t+(p<<6)+54+(G<<1)|0;b[j>>1]=(b[j>>1]|0)+-1<<16>>16;b[A>>1]=(b[A>>1]|0)+1<<16>>16;j=e[w>>1]|e[w+2>>1]<<16;t=e[v>>1]|e[v+2>>1]<<16;b[w>>1]=t;b[w+2>>1]=t>>>16;b[v>>1]=j;b[v+2>>1]=j>>>16;j=b[w+10>>1]|0}while(j<<16>>16!=0)}while(0);b:do if((C|0)>0?(N=c[B>>2]|0,O=b[N+((D&65535)<<2)+6>>1]|0,O<<16>>16):0){z=(c[a+60>>2]|0)+((e[N+((D&65535)<<2)+2>>1]|0)<<6)+48+(G<<1)|0;A=1<>1]|0;if((e[w>>1]|0)<(n&65535))break b;t=c[a+60>>2]|0;p=j&65535;if(!(n&1))j=t+(p<<6)+48+(G<<1)|0;else{j=e[w+2>>1]|0;do if(((e[t+(j<<6)+54+(A<<1)>>1]|0)>=(e[t+(p<<6)+48+(A<<1)>>1]|0)?(e[t+(p<<6)+54+(A<<1)>>1]|0)>=(e[t+(j<<6)+48+(A<<1)>>1]|0):0)?(e[t+(j<<6)+54+((1<>1]|0)>=(e[t+(p<<6)+48+((1<>1]|0):0){if((e[t+(p<<6)+54+((1<>1]|0)<(e[t+(j<<6)+48+((1<>1]|0))break;n=c[a+92>>2]|0;Cb[c[(c[n>>2]|0)+12>>2]&31](n,t+(j<<6)|0,t+(p<<6)|0,i)|0;n=c[a+96>>2]|0;if(!n)break;Cb[c[(c[n>>2]|0)+12>>2]&31](n,t+(j<<6)|0,t+(p<<6)|0,i)|0}while(0);j=t+(p<<6)+54+(G<<1)|0}b[j>>1]=(b[j>>1]|0)+-1<<16>>16;b[z>>1]=(b[z>>1]|0)+1<<16>>16;j=e[w>>1]|e[w+2>>1]<<16;D=e[v>>1]|e[v+2>>1]<<16;b[w>>1]=D;b[w+2>>1]=D>>>16;b[v>>1]=j;b[v+2>>1]=j>>>16;j=b[w+10>>1]|0}while(j<<16>>16!=0)}while(0);if((F|0)<0)sh(a,G,E,i);j=G+1|0;if((j|0)==3)break;G=j;p=b[P+6+(j<<1)>>1]|0;n=b[P+(j<<1)>>1]|0}j=c[a+108>>2]|0;if(!j){l=P;return}Zb[c[(c[j>>2]|0)+16>>2]&31](j,c[d+60>>2]|0,f,h,i);l=P;return}function Cd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;if(!a)return;b=c[7001]|0;d=c[a+-4>>2]|0;j=a+-8+(d&-8)|0;do if(!(d&1)){e=c[a+-8>>2]|0;if(!(d&3))return;h=a+-8+(0-e)|0;g=e+(d&-8)|0;if(h>>>0>>0)return;if((h|0)==(c[7002]|0)){a=c[j+4>>2]|0;if((a&3|0)!=3){i=h;b=g;break}c[6999]=g;c[j+4>>2]=a&-2;c[h+4>>2]=g|1;c[h+g>>2]=g;return}if(e>>>0<256){a=c[h+8>>2]|0;b=c[h+12>>2]|0;if((b|0)==(a|0)){c[6997]=c[6997]&~(1<<(e>>>3));i=h;b=g;break}else{c[a+12>>2]=b;c[b+8>>2]=a;i=h;b=g;break}}f=c[h+24>>2]|0;a=c[h+12>>2]|0;do if((a|0)==(h|0)){a=c[h+16+4>>2]|0;if(!a){a=c[h+16>>2]|0;if(!a){a=0;break}else e=h+16|0}else e=h+16+4|0;while(1){b=a+20|0;d=c[b>>2]|0;if(d|0){a=d;e=b;continue}b=a+16|0;d=c[b>>2]|0;if(!d)break;else{a=d;e=b}}c[e>>2]=0}else{i=c[h+8>>2]|0;c[i+12>>2]=a;c[a+8>>2]=i}while(0);if(f){b=c[h+28>>2]|0;if((h|0)==(c[28292+(b<<2)>>2]|0)){c[28292+(b<<2)>>2]=a;if(!a){c[6998]=c[6998]&~(1<>2]|0)!=(h|0)&1)<<2)>>2]=a;if(!a){i=h;b=g;break}}c[a+24>>2]=f;b=c[h+16>>2]|0;if(b|0){c[a+16>>2]=b;c[b+24>>2]=a}b=c[h+16+4>>2]|0;if(b){c[a+20>>2]=b;c[b+24>>2]=a;i=h;b=g}else{i=h;b=g}}else{i=h;b=g}}else{i=a+-8|0;b=d&-8;h=a+-8|0}while(0);if(h>>>0>=j>>>0)return;d=c[j+4>>2]|0;if(!(d&1))return;if(!(d&2)){a=c[7002]|0;if((j|0)==(c[7003]|0)){j=(c[7e3]|0)+b|0;c[7e3]=j;c[7003]=i;c[i+4>>2]=j|1;if((i|0)!=(a|0))return;c[7002]=0;c[6999]=0;return}if((j|0)==(a|0)){j=(c[6999]|0)+b|0;c[6999]=j;c[7002]=h;c[i+4>>2]=j|1;c[h+j>>2]=j;return}f=(d&-8)+b|0;do if(d>>>0<256){b=c[j+8>>2]|0;a=c[j+12>>2]|0;if((a|0)==(b|0)){c[6997]=c[6997]&~(1<<(d>>>3));break}else{c[b+12>>2]=a;c[a+8>>2]=b;break}}else{g=c[j+24>>2]|0;a=c[j+12>>2]|0;do if((a|0)==(j|0)){a=c[j+16+4>>2]|0;if(!a){a=c[j+16>>2]|0;if(!a){b=0;break}else e=j+16|0}else e=j+16+4|0;while(1){b=a+20|0;d=c[b>>2]|0;if(d|0){a=d;e=b;continue}b=a+16|0;d=c[b>>2]|0;if(!d)break;else{a=d;e=b}}c[e>>2]=0;b=a}else{b=c[j+8>>2]|0;c[b+12>>2]=a;c[a+8>>2]=b;b=a}while(0);if(g|0){a=c[j+28>>2]|0;if((j|0)==(c[28292+(a<<2)>>2]|0)){c[28292+(a<<2)>>2]=b;if(!b){c[6998]=c[6998]&~(1<>2]|0)!=(j|0)&1)<<2)>>2]=b;if(!b)break}c[b+24>>2]=g;a=c[j+16>>2]|0;if(a|0){c[b+16>>2]=a;c[a+24>>2]=b}a=c[j+16+4>>2]|0;if(a|0){c[b+20>>2]=a;c[a+24>>2]=b}}}while(0);c[i+4>>2]=f|1;c[h+f>>2]=f;if((i|0)==(c[7002]|0)){c[6999]=f;return}}else{c[j+4>>2]=d&-2;c[i+4>>2]=b|1;c[h+b>>2]=b;f=b}d=f>>>3;if(f>>>0<256){a=c[6997]|0;if(!(a&1<>2]|0;b=28028+(d<<1<<2)+8|0}c[b>>2]=i;c[a+12>>2]=i;c[i+8>>2]=a;c[i+12>>2]=28028+(d<<1<<2);return}a=f>>>8;if(a)if(f>>>0>16777215)a=31;else{j=a<<((a+1048320|0)>>>16&8)<<(((a<<((a+1048320|0)>>>16&8))+520192|0)>>>16&4);a=14-(((a<<((a+1048320|0)>>>16&8))+520192|0)>>>16&4|(a+1048320|0)>>>16&8|(j+245760|0)>>>16&2)+(j<<((j+245760|0)>>>16&2)>>>15)|0;a=f>>>(a+7|0)&1|a<<1}else a=0;e=28292+(a<<2)|0;c[i+28>>2]=a;c[i+20>>2]=0;c[i+16>>2]=0;b=c[6998]|0;d=1<>>1)|0);d=c[e>>2]|0;while(1){if((c[d+4>>2]&-8|0)==(f|0)){a=73;break}e=d+16+(b>>>31<<2)|0;a=c[e>>2]|0;if(!a){a=72;break}else{b=b<<1;d=a}}if((a|0)==72){c[e>>2]=i;c[i+24>>2]=d;c[i+12>>2]=i;c[i+8>>2]=i;break}else if((a|0)==73){h=d+8|0;j=c[h>>2]|0;c[j+12>>2]=i;c[h>>2]=i;c[i+8>>2]=j;c[i+12>>2]=d;c[i+24>>2]=0;break}}else{c[6998]=b|d;c[e>>2]=i;c[i+24>>2]=e;c[i+12>>2]=i;c[i+8>>2]=i}while(0);j=(c[7005]|0)+-1|0;c[7005]=j;if(!j)a=28444;else return;while(1){a=c[a>>2]|0;if(!a)break;else a=a+8|0}c[7005]=-1;return}function Dd(b){b=b|0;var d=0.0,e=0,f=0,h=0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0;q=l;l=l+192|0;if(!(xb[c[(c[b>>2]|0)+20>>2]&127](b)|0)){l=q;return}i=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Ib[c[(c[i>>2]|0)+100>>2]&511](i);i=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Ob[c[(c[i>>2]|0)+8>>2]&127](q+80|0,i);i=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;if(((xb[c[(c[i>>2]|0)+56>>2]&127](i)|0)&8|0?(e=c[b+24>>2]|0,e|0):0)?(j=xb[c[(c[e>>2]|0)+36>>2]&127](e)|0,(j|0)>0):0){f=0;do{h=c[b+24>>2]|0;h=zb[c[(c[h>>2]|0)+40>>2]&31](h,f)|0;i=c[h+780>>2]|0;if((i|0)>0){e=0;do{r=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Ub[c[(c[r>>2]|0)+40>>2]&0](r,h+4+(e*192|0)+32|0,h+4+(e*192|0)+64|0,+g[h+4+(e*192|0)+80>>2],c[h+4+(e*192|0)+156>>2]|0,q+80+96|0);e=e+1|0}while((e|0)!=(i|0))}f=f+1|0}while((f|0)!=(j|0))}r=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;if((xb[c[(c[r>>2]|0)+56>>2]&127](r)|0)&3|0?(c[b+8>>2]|0)>0:0){h=0;do{e=c[(c[b+16>>2]|0)+(h<<2)>>2]|0;if(!(c[e+204>>2]&32)){if(xb[c[(c[b>>2]|0)+20>>2]&127](b)|0?(r=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0,(xb[c[(c[r>>2]|0)+56>>2]&127](r)|0)&1|0):0){c[q+64>>2]=1053609165;c[q+64+4>>2]=1053609165;c[q+64+8>>2]=1053609165;g[q+64+12>>2]=0.0;switch(c[e+220>>2]|0){case 1:{c[q+64>>2]=c[q+80>>2];c[q+64+4>>2]=c[q+80+4>>2];c[q+64+8>>2]=c[q+80+8>>2];c[q+64+12>>2]=c[q+80+12>>2];break}case 2:{c[q+64>>2]=c[q+80+16>>2];c[q+64+4>>2]=c[q+80+16+4>>2];c[q+64+8>>2]=c[q+80+16+8>>2];c[q+64+12>>2]=c[q+80+16+12>>2];break}case 3:{c[q+64>>2]=c[q+80+32>>2];c[q+64+4>>2]=c[q+80+32+4>>2];c[q+64+8>>2]=c[q+80+32+8>>2];c[q+64+12>>2]=c[q+80+32+12>>2];break}case 4:{c[q+64>>2]=c[q+80+48>>2];c[q+64+4>>2]=c[q+80+48+4>>2];c[q+64+8>>2]=c[q+80+48+8>>2];c[q+64+12>>2]=c[q+80+48+12>>2];break}case 5:{c[q+64>>2]=c[q+80+64>>2];c[q+64+4>>2]=c[q+80+64+4>>2];c[q+64+8>>2]=c[q+80+64+8>>2];c[q+64+12>>2]=c[q+80+64+12>>2];break}default:{c[q+64>>2]=1050253722;c[q+64+4>>2]=1050253722;c[q+64+8>>2]=1050253722;g[q+64+12>>2]=0.0}}if(c[e+204>>2]&256|0){c[q+64>>2]=c[e+308>>2];c[q+64+4>>2]=c[e+308+4>>2];c[q+64+8>>2]=c[e+308+8>>2];c[q+64+12>>2]=c[e+308+12>>2]}Vb[c[(c[b>>2]|0)+28>>2]&127](b,e+4|0,c[e+192>>2]|0,q+64|0)}f=c[b+72>>2]|0;if(f|0?(xb[c[(c[f>>2]|0)+56>>2]&127](f)|0)&2|0:0){c[q+32>>2]=c[q+80+80>>2];c[q+32+4>>2]=c[q+80+80+4>>2];c[q+32+8>>2]=c[q+80+80+8>>2];c[q+32+12>>2]=c[q+80+80+12>>2];r=c[e+192>>2]|0;Vb[c[(c[r>>2]|0)+8>>2]&127](r,e+4|0,q+64|0,q+48|0);g[q+64>>2]=+g[q+64>>2]+-.019999999552965164;g[q+64+4>>2]=+g[q+64+4>>2]+-.019999999552965164;g[q+64+8>>2]=+g[q+64+8>>2]+-.019999999552965164;g[q+48>>2]=+g[q+48>>2]+.019999999552965164;g[q+48+4>>2]=+g[q+48+4>>2]+.019999999552965164;g[q+48+8>>2]=+g[q+48+8>>2]+.019999999552965164;do if((a[b+44>>0]|0?(c[e+252>>2]|0)==2:0)?(c[e+204>>2]&3|0)==0:0){r=c[e+192>>2]|0;Vb[c[(c[r>>2]|0)+8>>2]&127](r,e+68|0,q+16|0,q);d=+g[q+16>>2]+-.019999999552965164;g[q+16>>2]=d;k=+g[q+16+4>>2]+-.019999999552965164;g[q+16+4>>2]=k;m=+g[q+16+8>>2]+-.019999999552965164;g[q+16+8>>2]=m;n=+g[q>>2]+.019999999552965164;g[q>>2]=n;o=+g[q+4>>2]+.019999999552965164;g[q+4>>2]=o;p=+g[q+8>>2]+.019999999552965164;g[q+8>>2]=p;if(d<+g[q+64>>2])g[q+64>>2]=d;if(k<+g[q+64+4>>2])g[q+64+4>>2]=k;if(m<+g[q+64+8>>2])g[q+64+8>>2]=m;d=+g[q+16+12>>2];if(d<+g[q+64+12>>2])g[q+64+12>>2]=d;if(+g[q+48>>2]>2]=n;if(+g[q+48+4>>2]>2]=o;if(+g[q+48+8>>2]>2]=p;d=+g[q+12>>2];if(!(+g[q+48+12>>2]>2]=d}while(0);r=c[b+72>>2]|0;Vb[c[(c[r>>2]|0)+60>>2]&127](r,q+64|0,q+48|0,q+32|0)}}h=h+1|0}while((h|0)<(c[b+8>>2]|0))}l=q;return}function Ed(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;t=l;l=l+32|0;g=xb[c[(c[d>>2]|0)+28>>2]&127](d)|0;c[e+20>>2]=g;c[e>>2]=0;if(!g){s=e+24|0;c[s>>2]=0;s=d+4|0;f=e+4|0;s=c[s>>2]|0;c[f>>2]=s;f=d+8|0;f=c[f>>2]|0;s=e+8|0;c[s>>2]=f;s=d+12|0;s=c[s>>2]|0;f=e+12|0;c[f>>2]=s;d=d+16|0;d=c[d>>2]|0;f=e+16|0;c[f>>2]=d;l=t;return 19256}s=Bb[c[(c[f>>2]|0)+16>>2]&63](f,32,g)|0;g=c[s+8>>2]|0;c[e>>2]=zb[c[(c[f>>2]|0)+28>>2]&31](f,g)|0;r=xb[c[(c[d>>2]|0)+28>>2]&127](d)|0;a:do if((r|0)>0){q=0;while(1){cc[c[(c[d>>2]|0)+16>>2]&3](d,t+28|0,t+4|0,t+16|0,t+8|0,t+24|0,t+20|0,t,t+12|0,q);i=c[t>>2]|0;c[g+24>>2]=i;c[g+28>>2]=c[t+4>>2];j=g+12|0;m=g+16|0;p=g+4|0;c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0;c[g+20>>2]=0;switch(c[t+12>>2]|0){case 2:{if(i|0){j=Bb[c[(c[f>>2]|0)+16>>2]&63](f,4,i*3|0)|0;k=c[j+8>>2]|0;c[g+8>>2]=zb[c[(c[f>>2]|0)+28>>2]&31](f,k)|0;if((c[t>>2]|0)>0){m=c[t+24>>2]|0;i=0;do{n=m+(P(c[t+20>>2]|0,i)|0)|0;o=i*3|0;c[k+(o<<2)>>2]=c[n>>2];c[k+(o+1<<2)>>2]=c[n+4>>2];c[k+(o+2<<2)>>2]=c[n+8>>2];i=i+1|0}while((i|0)<(c[t>>2]|0))}Zb[c[(c[f>>2]|0)+20>>2]&31](f,j,19137,1497453121,c[j+8>>2]|0)}break}case 3:{if(i|0){n=Bb[c[(c[f>>2]|0)+16>>2]&63](f,8,i)|0;o=c[n+8>>2]|0;c[j>>2]=zb[c[(c[f>>2]|0)+28>>2]&31](f,o)|0;j=c[t>>2]|0;if((j|0)>0){k=c[t+24>>2]|0;m=c[t+20>>2]|0;i=0;do{u=k+(P(m,i)|0)|0;b[o+(i<<3)>>1]=b[u>>1]|0;b[o+(i<<3)+2>>1]=b[u+2>>1]|0;b[o+(i<<3)+4>>1]=b[u+4>>1]|0;a[o+(i<<3)+6>>0]=0;a[o+(i<<3)+7>>0]=0;i=i+1|0}while((i|0)!=(j|0))}Zb[c[(c[f>>2]|0)+20>>2]&31](f,n,19152,1497453121,c[n+8>>2]|0)}break}case 5:{if(i|0){j=Bb[c[(c[f>>2]|0)+16>>2]&63](f,4,i)|0;k=c[j+8>>2]|0;c[m>>2]=zb[c[(c[f>>2]|0)+28>>2]&31](f,k)|0;if((c[t>>2]|0)>0){i=0;do{u=(c[t+24>>2]|0)+(P(c[t+20>>2]|0,i)|0)|0;a[k+(i<<2)>>0]=a[u>>0]|0;a[k+(i<<2)+1>>0]=a[u+1>>0]|0;a[k+(i<<2)+2>>0]=a[u+2>>0]|0;a[k+(i<<2)+3>>0]=0;i=i+1|0}while((i|0)<(c[t>>2]|0))}Zb[c[(c[f>>2]|0)+20>>2]&31](f,j,19179,1497453121,c[j+8>>2]|0)}break}default:{}}switch(c[t+16>>2]|0){case 0:{i=c[t+4>>2]|0;if(i|0){j=Bb[c[(c[f>>2]|0)+16>>2]&63](f,16,i)|0;k=c[j+8>>2]|0;c[g>>2]=zb[c[(c[f>>2]|0)+28>>2]&31](f,k)|0;m=c[t+4>>2]|0;if((m|0)>0){n=c[t+28>>2]|0;o=c[t+8>>2]|0;i=0;do{u=n+(P(o,i)|0)|0;c[k+(i<<4)>>2]=c[u>>2];c[k+(i<<4)+4>>2]=c[u+4>>2];c[k+(i<<4)+8>>2]=c[u+8>>2];i=i+1|0}while((i|0)!=(m|0))}Zb[c[(c[f>>2]|0)+20>>2]&31](f,j,19202,1497453121,c[j+8>>2]|0)}break}case 1:{i=c[t+4>>2]|0;if(i|0){n=Bb[c[(c[f>>2]|0)+16>>2]&63](f,32,i)|0;o=c[n+8>>2]|0;c[p>>2]=zb[c[(c[f>>2]|0)+28>>2]&31](f,o)|0;j=c[t+4>>2]|0;if((j|0)>0){k=c[t+28>>2]|0;m=c[t+8>>2]|0;i=0;do{u=k+(P(m,i)|0)|0;h[o+(i<<5)>>3]=+h[u>>3];h[o+(i<<5)+8>>3]=+h[u+8>>3];h[o+(i<<5)+16>>3]=+h[u+16>>3];i=i+1|0}while((i|0)!=(j|0))}Zb[c[(c[f>>2]|0)+20>>2]&31](f,n,19221,1497453121,c[n+8>>2]|0)}break}default:{}}Ob[c[(c[d>>2]|0)+24>>2]&127](d,q);q=q+1|0;if((q|0)==(r|0)){g=f;break a}else g=g+32|0}}else g=f;while(0);Zb[c[(c[g>>2]|0)+20>>2]&31](f,s,19241,1497453121,c[s+8>>2]|0);u=e+24|0;c[u>>2]=0;u=d+4|0;f=e+4|0;u=c[u>>2]|0;c[f>>2]=u;f=d+8|0;f=c[f>>2]|0;u=e+8|0;c[u>>2]=f;u=d+12|0;u=c[u>>2]|0;f=e+12|0;c[f>>2]=u;f=d+16|0;f=c[f>>2]|0;u=e+16|0;c[u>>2]=f;l=t;return 19256}function Fd(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|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,t=0,u=0,v=0,w=0,x=0,y=0,z=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;j=c[d+8>>2]|0;if(!j){h=0;return h|0}i=0;D=j;do{if((c[D+20>>2]|0)>(c[a+100>>2]|0)){B=c[D+12>>2]|0;w=c[B+88>>2]|0;x=w-(c[d+88>>2]|0)|0;y=c[B+92>>2]|0;z=y-(c[d+92>>2]|0)|0;B=c[B+96>>2]|0;C=B-(c[d+96>>2]|0)|0;k=ct(c[g>>2]|0,c[g+4>>2]|0,x|0,((x|0)<0)<<31>>31|0)|0;o=A;j=ct(c[g+8>>2]|0,c[g+8+4>>2]|0,z|0,((z|0)<0)<<31>>31|0)|0;o=Ow(j|0,A|0,k|0,o|0)|0;k=A;j=ct(c[g+16>>2]|0,c[g+16+4>>2]|0,C|0,((C|0)<0)<<31>>31|0)|0;j=Ow(o|0,k|0,j|0,A|0)|0;k=A;o=ct(c[f>>2]|0,c[f+4>>2]|0,x|0,((x|0)<0)<<31>>31|0)|0;v=A;n=ct(c[f+8>>2]|0,c[f+8+4>>2]|0,z|0,((z|0)<0)<<31>>31|0)|0;v=Ow(n|0,A|0,o|0,v|0)|0;o=A;n=ct(c[f+16>>2]|0,c[f+16+4>>2]|0,C|0,((C|0)<0)<<31>>31|0)|0;n=Ow(v|0,o|0,n|0,A|0)|0;o=A;if((k|0)>0|(k|0)==0&j>>>0>0){l=1;v=j}else{v=sw(0,0,j|0,k|0)|0;l=((j|0)!=0|(k|0)!=0)<<31>>31;v=(j|0)!=0|(k|0)!=0?v:0;k=(j|0)!=0|(k|0)!=0?A:0}if(!((o|0)>0|(o|0)==0&n>>>0>0)){j=sw(0,0,n|0,o|0)|0;j=(n|0)!=0|(o|0)!=0?j:0;m=(n|0)!=0|(o|0)!=0?A:0;if((j|0)!=0|(m|0)!=0|(l|0)!=0){l=(n|0)!=0|(o|0)!=0?0-l|0:l;n=j;p=8}}else{m=o;p=8}a:do if((p|0)==8){p=0;if(!i){c[h>>2]=v;c[h+4>>2]=k;c[h+8>>2]=n;c[h+8+4>>2]=m;c[h+16>>2]=l;i=D;break}j=c[h+16>>2]|0;if((l|0)==(j|0)){if(l|0){p=c[h+8>>2]|0;s=c[h+8+4>>2]|0;o=ct(p|0,0,v|0,0)|0;j=A;t=ct(s|0,0,v|0,0)|0;r=A;p=ct(p|0,0,k|0,0)|0;q=A;s=ct(s|0,0,k|0,0)|0;G=A;p=Ow(t|0,0,p|0,0)|0;t=A;G=Ow(r|0,0,s|0,G|0)|0;q=Ow(G|0,A|0,q|0,0)|0;t=Ow(q|0,A|0,t|0,0)|0;q=A;j=Ow(0,p|0,o|0,j|0)|0;o=A;p=Ow(t|0,q|0,(o>>>0

    >>0|(o|0)==(p|0)&b>>>0<0)&1|0,0)|0;q=A;M=c[K+24+8>>2]|0;N=c[K+24+8+4>>2]|0;t=c[K>>2]|0;L=c[K+4>>2]|0;s=ct(t|0,0,M|0,0)|0;r=A;M=ct(L|0,0,M|0,0)|0;O=A;t=ct(t|0,0,N|0,0)|0;u=A;N=ct(L|0,0,N|0,0)|0;L=A;t=Ow(M|0,0,t|0,0)|0;M=A;L=Ow(O|0,0,N|0,L|0)|0;u=Ow(L|0,A|0,u|0,0)|0;M=Ow(u|0,A|0,M|0,0)|0;u=A;r=Ow(0,t|0,s|0,r|0)|0;s=A;t=Ow(M|0,u|0,(s>>>0>>0|(s|0)==(t|0)&r>>>0<0)&1|0,0)|0;u=A;if(q>>>0>>0|(q|0)==(u|0)&p>>>0>>0)b=-1;else b=q>>>0>u>>>0|(q|0)==(u|0)&p>>>0>t>>>0?1:o>>>0>>0|(o|0)==(s|0)&b>>>0>>0?-1:(o>>>0>s>>>0|(o|0)==(s|0)&b>>>0>r>>>0)&1;u=P(b,v)|0}}else u=b;while(0);do if(!G)if((u|0)>-1)if((c[K+16>>2]|0)<0&((c[K+8>>2]|0)==0?(c[K+8+4>>2]|0)==0:0)){o=z;s=B;break}else{H=133;break}else if((c[K+24+16>>2]|0)<0&((c[K+24+8>>2]|0)==0?(c[K+24+8+4>>2]|0)==0:0)){o=z;s=B;break}else{H=133;break}else H=133;while(0);if((H|0)==133){H=0;o=hg(a,w,x)|0;if(!z)k=o;else c[z+4>>2]=o;c[o>>2]=z;b=c[o+8>>2]|0;if(!B)d=b;else c[B>>2]=b;c[b+4>>2]=B;s=b}c[K+116>>2]=E;c[K+112>>2]=y;if(!u){rc(a,g,F,K+116|0,K+112|0);b=c[K+112>>2]|0}else b=y;if((u|0)>-1&(b|0)!=0){q=(D|0)!=0;if(q?(I=c[D>>2]|0,(I|0)!=(y|0)):0){n=I;do{p=n;n=c[n>>2]|0;r=c[p+8>>2]|0;if((n|0)==(p|0))h=0;else{c[n+4>>2]=c[p+4>>2];c[c[p+4>>2]>>2]=n;h=n}c[(c[r+12>>2]|0)+8>>2]=h;h=c[r>>2]|0;if((h|0)==(r|0))h=0;else{c[h+4>>2]=c[r+4>>2];c[c[r+4>>2]>>2]=h}c[(c[p+12>>2]|0)+8>>2]=h;c[p+4>>2]=0;c[p+4+4>>2]=0;c[p+4+8>>2]=0;c[p+4+12>>2]=0;c[p>>2]=c[a+56>>2];c[a+56>>2]=p;c[r+4>>2]=0;c[r+4+4>>2]=0;c[r+4+8>>2]=0;c[r+4+12>>2]=0;c[r>>2]=c[a+56>>2];c[a+56>>2]=r;c[a+116>>2]=(c[a+116>>2]|0)+-1}while((n|0)!=(y|0))}if(!s){m=q?m:y;h=d}else{if(q)h=D;else{m=d;h=c[y+4>>2]|0}c[h>>2]=d;c[d+4>>2]=h;c[s>>2]=y;c[y+4>>2]=s;h=0;b=c[K+112>>2]|0}O=F;t=c[b+8>>2]|0;s=0;B=h;z=c[b+12>>2]|0;n=c[O+88>>2]|0;d=c[O+96>>2]|0;h=c[O+92>>2]|0}else{t=D;B=d;z=F;d=C}b=c[K+116>>2]|0;if((u|0)<1&(b|0)!=0){p=(f|0)!=0;if(p?(J=c[f+4>>2]|0,(J|0)!=(E|0)):0){d=J;do{q=d+4|0;n=d;d=c[q>>2]|0;h=c[n>>2]|0;r=c[n+8>>2]|0;if((h|0)==(n|0))h=0;else{c[h+4>>2]=d;c[c[q>>2]>>2]=h}c[(c[r+12>>2]|0)+8>>2]=h;h=c[r>>2]|0;if((h|0)==(r|0))h=0;else{c[h+4>>2]=c[r+4>>2];c[c[r+4>>2]>>2]=h}c[(c[n+12>>2]|0)+8>>2]=h;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[n>>2]=c[a+56>>2];c[a+56>>2]=n;c[r+4>>2]=0;c[r+4+4>>2]=0;c[r+4+8>>2]=0;c[r+4+12>>2]=0;c[r>>2]=c[a+56>>2];c[a+56>>2]=r;c[a+116>>2]=(c[a+116>>2]|0)+-1}while((d|0)!=(E|0))}if(!o)h=p?e:E;else{if(p)h=e;else{h=k;f=c[E>>2]|0}c[k>>2]=f;c[f+4>>2]=k;c[E>>2]=o;c[o+4>>2]=E;k=0;b=c[K+116>>2]|0}O=g;f=c[b+8>>2]|0;r=h;w=0;y=c[O+88>>2]|0;g=c[b+12>>2]|0;x=c[O+96>>2]|0;h=c[O+92>>2]|0}else{r=e;w=o;y=n;x=d}if((g|0)==(i|0)&(z|0)==(j|0)){if(f){q=f+4|0;b=c[q>>2]|0;if((b|0)!=(r|0))do{o=b+4|0;n=b;b=c[o>>2]|0;d=c[n>>2]|0;p=c[n+8>>2]|0;if((d|0)==(n|0))d=0;else{c[d+4>>2]=b;c[c[o>>2]>>2]=d}c[(c[p+12>>2]|0)+8>>2]=d;d=c[p>>2]|0;if((d|0)==(p|0))d=0;else{c[d+4>>2]=c[p+4>>2];c[c[p+4>>2]>>2]=d}c[(c[n+12>>2]|0)+8>>2]=d;c[o>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;c[n>>2]=c[a+56>>2];c[a+56>>2]=n;c[p+4>>2]=0;c[p+4+4>>2]=0;c[p+4+8>>2]=0;c[p+4+12>>2]=0;c[p>>2]=c[a+56>>2];c[a+56>>2]=p;c[a+116>>2]=(c[a+116>>2]|0)+-1}while((b|0)!=(r|0));if(w|0){c[k>>2]=f;c[q>>2]=k;c[r>>2]=w;c[w+4>>2]=r}}else{c[k>>2]=w;c[w+4>>2]=k;c[g+8>>2]=w}if(!t){c[s>>2]=B;c[B+4>>2]=s;c[j+8>>2]=s;v=0;u=G;t=0;q=w;d=B;p=z;n=y;o=g;b=x;break}b=c[t>>2]|0;if((b|0)!=(m|0))do{n=b;b=c[b>>2]|0;o=c[n+8>>2]|0;if((b|0)==(n|0))d=0;else{c[b+4>>2]=c[n+4>>2];c[c[n+4>>2]>>2]=b;d=b}c[(c[o+12>>2]|0)+8>>2]=d;d=c[o>>2]|0;if((d|0)==(o|0))d=0;else{c[d+4>>2]=c[o+4>>2];c[c[o+4>>2]>>2]=d}c[(c[n+12>>2]|0)+8>>2]=d;c[n+4>>2]=0;c[n+4+4>>2]=0;c[n+4+8>>2]=0;c[n+4+12>>2]=0;c[n>>2]=c[a+56>>2];c[a+56>>2]=n;c[o+4>>2]=0;c[o+4+4>>2]=0;c[o+4+8>>2]=0;c[o+4+12>>2]=0;c[o>>2]=c[a+56>>2];c[a+56>>2]=o;c[a+116>>2]=(c[a+116>>2]|0)+-1}while((b|0)!=(m|0));if(!s){v=0;u=G;q=w;s=0;d=B;p=z;n=y;o=g;b=x}else{c[t>>2]=B;c[B+4>>2]=t;c[s>>2]=m;c[m+4>>2]=s;v=0;u=G;q=w;d=B;p=z;n=y;o=g;b=x}}else{v=1;u=0;q=w;d=B;p=z;n=y;o=g;b=x}}else{v=hg(a,w,x)|0;c[v>>2]=v;c[v+4>>2]=v;c[w+8>>2]=v;v=c[v+8>>2]|0;c[v>>2]=v;c[v+4>>2]=v;c[x+8>>2]=v;v=0;u=G;t=D;r=e;q=z;s=B;p=F;o=g;b=C}while(0);if(!v)break b;e=r;z=q;G=u;D=t;B=s;F=p;g=o;C=b;x=p;w=o}}while(0);l=K;return}}} + +// EMSCRIPTEN_END_FUNCS +var nb=[fJ,ip,UG,HG,HG,LG,$D,Mq,Lq,Mq,fJ,fJ,fJ,fJ,fJ,fJ];var ob=[KI,bx];var pb=[FD,fk,fk,FD];var qb=[DH,Dj,gk,vi,Bv,$k,Ao,$j,Xm,_m,Qh,Tm,lm,ym,Ig,Ng,Gg,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH];var rb=[eB,tk,tk,eB];var sb=[CF,Vc];var tb=[ZC,Yu,ie,Yu,Yu,je,Yu,Yu,yf,uf,bu,Yu,Yu,ZC,ZC,ZC];var ub=[ix,oq];var vb=[Zv,qc,Vk,Zv];var wb=[bv,Nm,qd,bv];var xb=[eJ,HI,jI,hF,DE,DE,fG,BH,II,HI,Nr,VH,EI,XG,LH,YG,HI,xH,qI,II,oI,oI,jI,cG,KE,UE,PH,vH,II,oF,YG,XF,LF,wF,_G,PF,wG,sG,jG,JG,xG,jI,Cz,Vs,vF,KG,xF,Fv,cG,cG,yH,tI,jH,GI,AH,BI,CI,zI,sE,ZH,AH,cI,aI,fI,YG,iI,ZG,bG,bG,HI,wI,AH,vI,uI,zD,SH,HI,HI,HI,JI,DI,xI,EI,DI,_G,iG,RH,sI,AH,nI,mI,aF,nD,aG,VF,VF,fG,fG,OI,HI,jI,fG,fG,OI,DE,HI,WF,WF,fG,Ot,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ];var yb=[YF,Di];var zb=[AI,ds,gs,es,Fo,oG,oG,dc,tz,tz,Pd,wn,sy,bo,Ct,tl,fr,op,Pk,yi,Io,dr,AI,AI,AI,AI,AI,AI,AI,AI,AI,AI];var Ab=[KH,Kh,hE,hE,bn,KH,KH,KH];var Bb=[wH,Wn,Fi,xk,lc,vo,gl,sg,yd,fi,fh,Cf,vn,Sh,Jh,Hf,nq,bf,tg,hm,Wq,ek,Mf,Qk,xg,hl,Oh,Ok,Ie,Mk,Ed,EC,EC,pf,Yj,Sg,Jg,ti,To,ql,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH];var Cb=[zF,sn,zp,Uo,sk,qk,Vh,Ll,Il,Mo,wg,Ho,Rp,Ym,Zl,Rl,Si,jl,Qc,cw,Gx,Ef,zF,zF,zF,zF,zF,zF,zF,zF,zF,zF];var Db=[VC,Jl];var Eb=[GA,fd,Ad,Wd];var Fb=[gx,ld,Yf,gx];var Gb=[_u,Rc,oh,_u];var Hb=[lJ,UI,pk,gu];var Ib=[jJ,ZI,aJ,ZI,aJ,ZI,aJ,ZI,aJ,ZI,aJ,ZI,aJ,ZI,nH,ZI,aJ,ZI,aJ,ZI,aJ,ZI,aJ,Lp,Vq,no,Jj,gz,ZI,aJ,aJ,aJ,aJ,rd,pw,ZI,aJ,ZI,aJ,aJ,ZI,Ey,aJ,aJ,ZI,Ey,aJ,aJ,ZI,aJ,lz,Sx,ZI,aJ,ZI,aJ,mq,Mp,Qi,vC,bk,Vu,Wm,zu,fc,Bn,qh,Pn,Df,Ml,ZI,aJ,ZI,aJ,zl,$l,Qg,av,ci,aJ,kk,ZB,IH,Yv,ZI,IH,Yv,ZI,Yv,Td,mn,Yv,Yv,Le,Yv,Yv,qe,Yv,Oc,Tf,St,WE,pi,pF,aJ,up,Do,aJ,ZI,aJ,Jp,No,wl,_l,rk,Wu,Qp,_q,ZI,aJ,nf,lB,aJ,aJ,aJ,aJ,aJ,aJ,aJ,aJ,aJ,aJ,mk,HC,cr,Xp,Np,Qo,aJ,rq,jp,ir,_p,ZI,aJ,Oj,rF,Dd,aJ,aJ,aJ,aJ,aJ,ZI,aJ,ZI,oH,aJ,aJ,aJ,aJ,aJ,aJ,aJ,Yq,Vp,ZI,aJ,Hk,pD,aJ,aJ,aJ,Gi,IB,aJ,cj,iA,aJ,qm,Hv,ej,Ey,Ey,Ey,Ey,Yp,np,ZI,aJ,aJ,aJ,ZI,Ey,aJ,ZI,aJ,ZI,Ey,Mp,Dm,rm,Ey,Ey,Ey,Mp,aJ,Mp,pH,Qv,aJ,aJ,OG,Cv,Ey,Ey,Ey,ji,Pv,tj,xv,ZI,xv,Sp,gr,lk,yu,aJ,aJ,Ki,qF,ZI,aJ,aJ,aJ,ni,Qv,aJ,ZI,aJ,aJ,aJ,aJ,aJ,aJ,ZI,aJ,ZI,aJ,ar,Wp,aJ,aJ,nk,oD,ii,vv,Hp,Ko,ZI,aJ,ZI,ZI,aJ,aJ,Ms,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ];var Jb=[_I,nc,Uc,kn,jn,bF,kF,WH,kF,ns,wd,jh,Te,kd,yg,sp,dg,Hj,De,Gc,YE,kF,WH,Pl,Pl,lj,_I,_I,_I,_I,_I,_I];var Kb=[yI,be,jf,Bg,xj,gc,Jf,yI];var Lb=[LC];var Mb=[lI,Zg,Kd,vB,vB,xu,Vj,Xi,yp,xu,xu,jj,Ol,bm,xu,Pi];var Nb=[hH];var Ob=[YI,$q,ws,yG,OB,AB,yG,oo,_k,yG,Bt,so,Fc,le,cq,yG,yG,yG,yG,wB,jk,vg,fl,Tj,im,Pj,ks,rh,nl,Pp,Jx,ox,Jx,ox,Nc,hc,yG,mj,nu,io,pq,Th,Gt,Ft,Mg,gg,Ah,tu,sf,Dh,Ac,Wk,nd,Cj,zc,Vi,yG,Tl,Bk,Sk,el,ak,VA,Cr,mi,ap,Ck,lA,On,Dk,mj,wj,mj,ki,yr,dq,si,mj,nj,Sn,nr,pn,fe,Mn,vl,Eu,Cu,Du,zh,$m,Zm,Yg,Is,wq,Hl,Ls,Op,Uk,vd,ud,Lr,Uk,Ls,yG,yG,Hh,Ih,se,Yn,yG,yG,yG,ly,Dx,tf,md,mm,Fu,ku,ku,yG,mj,yG,yG,YI,YI,YI,YI];var Pb=[kI,Cw,Kv,fs,pl,tc,kI,kI];var Qb=[gH,ev,hk,cp,Wi,Nn,Am,gH];var Rb=[dF];var Sb=[bI,XE,Ei,Ge,mw,hi,zo,XE,yj,Lj,au,XE,Rd,td,XE,al,Rk,Kk,Gq,$i,of,bi,XE,XE,Mi,ei,mf,Fx,Ex,XE,XE,XE,XE,xd,ai,Sj,yk,Mt,Bh,su,gf,Me,Me,ph,al,Uj,So,li,al,Zh,XE,nm,Bo,wm,jm,Kl,Zj,gn,hn,fn,Vn,mo,qf,ro,XE,XE,XE,XE,Zp,lp,mp,Ql,zj,$h,hp,XE,XE,XE,XE,zi,Nd,Yh,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI];var Tb=[fH,Jz,oc,ae,$e,Jz,Ej,Be,xm,en,fH,fH,fH,fH,fH,fH];var Ub=[pC];var Vb=[zG,_e,jB,jB,jB,Xf,Ff,cu,Nj,Ar,Nu,Gk,Kc,Ec,Lf,Ht,th,Pf,kc,Ou,Km,sl,kp,Ff,We,Og,_f,Fe,Tt,Zs,Cg,wh,cu,oi,Ul,tt,vh,$d,am,qj,Bj,Cp,pg,Vg,Mh,Hi,Nk,jB,ri,Eh,wi,jB,jB,oj,rj,om,Tk,dk,ke,Ae,qi,Lc,rj,yl,rl,xl,cd,_n,Aj,_n,Cl,eq,po,dl,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG];var Wb=[cF,Ov];var Xb=[pu];var Yb=[iv];var Zb=[xE,Sl,og,Up,Pc,Ze,$f,Uf,ec,Ic,yc,Bd,de,Dc,Zu,_h,pc,Xd,bl,Oi,hf,xE,xE,xE,xE,xE,xE,xE,xE,xE,xE,xE];var _b=[oC];var $b=[JB,_d,Gl,cm,rp,Jn,Ti,JB];var ac=[$z,mg,Xg,$z];var bc=[Nw,Fj];var cc=[wv,pm,pm,wv];return{__GLOBAL__sub_I_btConeTwistConstraint_cpp:nA,__GLOBAL__sub_I_btQuickprof_cpp:Sc,___cxa_can_catch:Oq,___cxa_is_pointer_type:fz,___muldi3:ct,___udivdi3:rB,___uremdi3:xs,_bitshift64Lshr:Mu,_bitshift64Shl:wu,_emscripten_bind_Anchor___destroy___0:TD,_emscripten_bind_Anchor_get_m_body_0:vG,_emscripten_bind_Anchor_get_m_c0_0:YH,_emscripten_bind_Anchor_get_m_c1_0:XH,_emscripten_bind_Anchor_get_m_c2_0:IG,_emscripten_bind_Anchor_get_m_influence_0:QG,_emscripten_bind_Anchor_get_m_local_0:OI,_emscripten_bind_Anchor_get_m_node_0:lH,_emscripten_bind_Anchor_set_m_body_1:gE,_emscripten_bind_Anchor_set_m_c0_1:RB,_emscripten_bind_Anchor_set_m_c1_1:Cs,_emscripten_bind_Anchor_set_m_c2_1:JE,_emscripten_bind_Anchor_set_m_influence_1:PE,_emscripten_bind_Anchor_set_m_local_1:Es,_emscripten_bind_Anchor_set_m_node_1:TE,_emscripten_bind_ClosestConvexResultCallback_ClosestConvexResultCallback_2:mt,_emscripten_bind_ClosestConvexResultCallback___destroy___0:px,_emscripten_bind_ClosestConvexResultCallback_get_m_closestHitFraction_0:RG,_emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterGroup_0:EB,_emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterMask_0:PB,_emscripten_bind_ClosestConvexResultCallback_get_m_convexFromWorld_0:XG,_emscripten_bind_ClosestConvexResultCallback_get_m_convexToWorld_0:iH,_emscripten_bind_ClosestConvexResultCallback_get_m_hitNormalWorld_0:gI,_emscripten_bind_ClosestConvexResultCallback_get_m_hitPointWorld_0:NF,_emscripten_bind_ClosestConvexResultCallback_hasHit_0:Dy,_emscripten_bind_ClosestConvexResultCallback_set_m_closestHitFraction_1:mG,_emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterGroup_1:ez,_emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterMask_1:sz,_emscripten_bind_ClosestConvexResultCallback_set_m_convexFromWorld_1:cs,_emscripten_bind_ClosestConvexResultCallback_set_m_convexToWorld_1:Sr,_emscripten_bind_ClosestConvexResultCallback_set_m_hitNormalWorld_1:ss,_emscripten_bind_ClosestConvexResultCallback_set_m_hitPointWorld_1:Xr,_emscripten_bind_ClosestRayResultCallback_ClosestRayResultCallback_2:Lt,_emscripten_bind_ClosestRayResultCallback___destroy___0:px,_emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterGroup_0:PB,_emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterMask_0:YB,_emscripten_bind_ClosestRayResultCallback_get_m_collisionObject_0:DE,_emscripten_bind_ClosestRayResultCallback_get_m_hitNormalWorld_0:$E,_emscripten_bind_ClosestRayResultCallback_get_m_hitPointWorld_0:aI,_emscripten_bind_ClosestRayResultCallback_get_m_rayFromWorld_0:JF,_emscripten_bind_ClosestRayResultCallback_get_m_rayToWorld_0:eG,_emscripten_bind_ClosestRayResultCallback_hasHit_0:$y,_emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterGroup_1:sz,_emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterMask_1:Az,_emscripten_bind_ClosestRayResultCallback_set_m_collisionObject_1:AB,_emscripten_bind_ClosestRayResultCallback_set_m_hitNormalWorld_1:Mr,_emscripten_bind_ClosestRayResultCallback_set_m_hitPointWorld_1:Is,_emscripten_bind_ClosestRayResultCallback_set_m_rayFromWorld_1:Ur,_emscripten_bind_ClosestRayResultCallback_set_m_rayToWorld_1:$r,_emscripten_bind_ConcreteContactResultCallback_ConcreteContactResultCallback_0:ms,_emscripten_bind_ConcreteContactResultCallback___destroy___0:px,_emscripten_bind_ConcreteContactResultCallback_addSingleResult_7:rr,_emscripten_bind_Config___destroy___0:Bz,_emscripten_bind_Config_get_citerations_0:WF,_emscripten_bind_Config_get_collisions_0:bG,_emscripten_bind_Config_get_diterations_0:VF,_emscripten_bind_Config_get_kAHR_0:HG,_emscripten_bind_Config_get_kCHR_0:GG,_emscripten_bind_Config_get_kDF_0:WG,_emscripten_bind_Config_get_kDG_0:VG,_emscripten_bind_Config_get_kDP_0:bH,_emscripten_bind_Config_get_kKHR_0:FG,_emscripten_bind_Config_get_kLF_0:UG,_emscripten_bind_Config_get_kMT_0:TG,_emscripten_bind_Config_get_kPR_0:SG,_emscripten_bind_Config_get_kSHR_0:EG,_emscripten_bind_Config_get_kSKHR_CL_0:hG,_emscripten_bind_Config_get_kSK_SPLT_CL_0:rG,_emscripten_bind_Config_get_kSRHR_CL_0:gG,_emscripten_bind_Config_get_kSR_SPLT_CL_0:CG,_emscripten_bind_Config_get_kSSHR_CL_0:DG,_emscripten_bind_Config_get_kSS_SPLT_CL_0:OF,_emscripten_bind_Config_get_kVCF_0:RG,_emscripten_bind_Config_get_kVC_0:QG,_emscripten_bind_Config_get_maxvolume_0:LG,_emscripten_bind_Config_get_piterations_0:UF,_emscripten_bind_Config_get_timescale_0:$F,_emscripten_bind_Config_get_viterations_0:TF,_emscripten_bind_Config_set_citerations_1:mD,_emscripten_bind_Config_set_collisions_1:lD,_emscripten_bind_Config_set_diterations_1:kD,_emscripten_bind_Config_set_kAHR_1:kF,_emscripten_bind_Config_set_kCHR_1:IE,_emscripten_bind_Config_set_kDF_1:SE,_emscripten_bind_Config_set_kDG_1:RF,_emscripten_bind_Config_set_kDP_1:lG,_emscripten_bind_Config_set_kKHR_1:HE,_emscripten_bind_Config_set_kLF_1:bF,_emscripten_bind_Config_set_kMT_1:RE,_emscripten_bind_Config_set_kPR_1:QE,_emscripten_bind_Config_set_kSHR_1:GE,_emscripten_bind_Config_set_kSKHR_CL_1:fE,_emscripten_bind_Config_set_kSK_SPLT_CL_1:rE,_emscripten_bind_Config_set_kSRHR_CL_1:eE,_emscripten_bind_Config_set_kSR_SPLT_CL_1:EE,_emscripten_bind_Config_set_kSSHR_CL_1:FE,_emscripten_bind_Config_set_kSS_SPLT_CL_1:PD,_emscripten_bind_Config_set_kVCF_1:mG,_emscripten_bind_Config_set_kVC_1:PE,_emscripten_bind_Config_set_maxvolume_1:YE,_emscripten_bind_Config_set_piterations_1:jD,_emscripten_bind_Config_set_timescale_1:_D,_emscripten_bind_Config_set_viterations_1:iD,_emscripten_bind_ContactResultCallback___destroy___0:px,_emscripten_bind_ContactResultCallback_addSingleResult_7:rr,_emscripten_bind_ConvexResultCallback___destroy___0:px,_emscripten_bind_ConvexResultCallback_get_m_closestHitFraction_0:RG,_emscripten_bind_ConvexResultCallback_get_m_collisionFilterGroup_0:EB,_emscripten_bind_ConvexResultCallback_get_m_collisionFilterMask_0:PB,_emscripten_bind_ConvexResultCallback_hasHit_0:Dy,_emscripten_bind_ConvexResultCallback_set_m_closestHitFraction_1:mG,_emscripten_bind_ConvexResultCallback_set_m_collisionFilterGroup_1:ez,_emscripten_bind_ConvexResultCallback_set_m_collisionFilterMask_1:sz,_emscripten_bind_Face___destroy___0:TD,_emscripten_bind_Face_get_m_n_1:OD,_emscripten_bind_Face_get_m_normal_0:QH,_emscripten_bind_Face_set_m_n_2:UA,_emscripten_bind_Face_set_m_normal_1:Bs,_emscripten_bind_Joint___destroy___0:px,_emscripten_bind_Joint_get_m_cfm_0:DG,_emscripten_bind_Joint_get_m_delete_0:mF,_emscripten_bind_Joint_get_m_drift_0:aI,_emscripten_bind_Joint_get_m_erp_0:CG,_emscripten_bind_Joint_get_m_massmatrix_0:uH,_emscripten_bind_Joint_get_m_refs_1:OE,_emscripten_bind_Joint_get_m_sdrift_0:OH,_emscripten_bind_Joint_get_m_split_0:rG,_emscripten_bind_Joint_set_m_cfm_1:FE,_emscripten_bind_Joint_set_m_delete_1:hD,_emscripten_bind_Joint_set_m_drift_1:Is,_emscripten_bind_Joint_set_m_erp_1:EE,_emscripten_bind_Joint_set_m_massmatrix_1:dB,_emscripten_bind_Joint_set_m_refs_2:Uq,_emscripten_bind_Joint_set_m_sdrift_1:zs,_emscripten_bind_Joint_set_m_split_1:rE,_emscripten_bind_LJoint___destroy___0:px,_emscripten_bind_LJoint_get_m_rpos_1:vE,_emscripten_bind_LJoint_set_m_rpos_2:Pq,_emscripten_bind_Link___destroy___0:QB,_emscripten_bind_Link_get_m_n_1:yD,_emscripten_bind_Link_set_m_n_2:LA,_emscripten_bind_LocalConvexResult_LocalConvexResult_5:lr,_emscripten_bind_LocalConvexResult___destroy___0:TD,_emscripten_bind_LocalConvexResult_get_m_hitCollisionObject_0:lH,_emscripten_bind_LocalConvexResult_get_m_hitFraction_0:FG,_emscripten_bind_LocalConvexResult_get_m_hitNormalLocal_0:NI,_emscripten_bind_LocalConvexResult_get_m_hitPointLocal_0:JF,_emscripten_bind_LocalConvexResult_get_m_localShapeInfo_0:hF,_emscripten_bind_LocalConvexResult_set_m_hitCollisionObject_1:TE,_emscripten_bind_LocalConvexResult_set_m_hitFraction_1:HE,_emscripten_bind_LocalConvexResult_set_m_hitNormalLocal_1:Ns,_emscripten_bind_LocalConvexResult_set_m_hitPointLocal_1:Ur,_emscripten_bind_LocalConvexResult_set_m_localShapeInfo_1:OB,_emscripten_bind_LocalShapeInfo___destroy___0:TD,_emscripten_bind_LocalShapeInfo_get_m_shapePart_0:lH,_emscripten_bind_LocalShapeInfo_get_m_triangleIndex_0:hF,_emscripten_bind_LocalShapeInfo_set_m_shapePart_1:TE,_emscripten_bind_LocalShapeInfo_set_m_triangleIndex_1:OB,_emscripten_bind_Material___destroy___0:TD,_emscripten_bind_Material_get_m_flags_0:fG,_emscripten_bind_Material_get_m_kAST_0:bH,_emscripten_bind_Material_get_m_kLST_0:RG,_emscripten_bind_Material_get_m_kVST_0:VG,_emscripten_bind_Material_set_m_flags_1:ND,_emscripten_bind_Material_set_m_kAST_1:lG,_emscripten_bind_Material_set_m_kLST_1:mG,_emscripten_bind_Material_set_m_kVST_1:RF,_emscripten_bind_Node___destroy___0:TD,_emscripten_bind_Node_get_m_n_0:aI,_emscripten_bind_Node_get_m_x_0:NI,_emscripten_bind_Node_set_m_n_1:Is,_emscripten_bind_Node_set_m_x_1:Ns,_emscripten_bind_RayResultCallback___destroy___0:px,_emscripten_bind_RayResultCallback_get_m_collisionFilterGroup_0:PB,_emscripten_bind_RayResultCallback_get_m_collisionFilterMask_0:YB,_emscripten_bind_RayResultCallback_get_m_collisionObject_0:DE,_emscripten_bind_RayResultCallback_hasHit_0:$y,_emscripten_bind_RayResultCallback_set_m_collisionFilterGroup_1:sz,_emscripten_bind_RayResultCallback_set_m_collisionFilterMask_1:Az,_emscripten_bind_RayResultCallback_set_m_collisionObject_1:AB,_emscripten_bind_RaycastInfo___destroy___0:TD,_emscripten_bind_RaycastInfo_get_m_contactNormalWS_0:gJ,_emscripten_bind_RaycastInfo_get_m_contactPointWS_0:XG,_emscripten_bind_RaycastInfo_get_m_groundObject_0:UF,_emscripten_bind_RaycastInfo_get_m_hardPointWS_0:BG,_emscripten_bind_RaycastInfo_get_m_isInContact_0:ZD,_emscripten_bind_RaycastInfo_get_m_suspensionLength_0:TG,_emscripten_bind_RaycastInfo_get_m_wheelAxleWS_0:AG,_emscripten_bind_RaycastInfo_get_m_wheelDirectionWS_0:_F,_emscripten_bind_RaycastInfo_set_m_contactNormalWS_1:Gs,_emscripten_bind_RaycastInfo_set_m_contactPointWS_1:cs,_emscripten_bind_RaycastInfo_set_m_groundObject_1:jD,_emscripten_bind_RaycastInfo_set_m_hardPointWS_1:js,_emscripten_bind_RaycastInfo_set_m_isInContact_1:HB,_emscripten_bind_RaycastInfo_set_m_suspensionLength_1:RE,_emscripten_bind_RaycastInfo_set_m_wheelAxleWS_1:is,_emscripten_bind_RaycastInfo_set_m_wheelDirectionWS_1:Zr,_emscripten_bind_Specs___destroy___0:TD,_emscripten_bind_Specs_get_position_0:MI,_emscripten_bind_Specs_set_position_1:ys,_emscripten_bind_VoidPtr___destroy___0:TD,_emscripten_bind_btActionInterface___destroy___0:px,_emscripten_bind_btActionInterface_updateAction_2:aw,_emscripten_bind_btAxisSweep3___destroy___0:px,_emscripten_bind_btAxisSweep3_btAxisSweep3_2:yt,_emscripten_bind_btAxisSweep3_btAxisSweep3_3:Ks,_emscripten_bind_btAxisSweep3_btAxisSweep3_4:hs,_emscripten_bind_btAxisSweep3_btAxisSweep3_5:Gr,_emscripten_bind_btBoxShape___destroy___0:px,_emscripten_bind_btBoxShape_btBoxShape_1:Ci,_emscripten_bind_btBoxShape_calculateLocalInertia_2:Nv,_emscripten_bind_btBoxShape_getLocalScaling_0:Oz,_emscripten_bind_btBoxShape_getMargin_0:pA,_emscripten_bind_btBoxShape_setLocalScaling_1:Cx,_emscripten_bind_btBoxShape_setMargin_1:Ay,_emscripten_bind_btBroadphaseInterface___destroy___0:px,_emscripten_bind_btBvhTriangleMeshShape___destroy___0:px,_emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_2:xt,_emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_3:Ps,_emscripten_bind_btBvhTriangleMeshShape_calculateLocalInertia_2:Nv,_emscripten_bind_btBvhTriangleMeshShape_getLocalScaling_0:Oz,_emscripten_bind_btBvhTriangleMeshShape_setLocalScaling_1:Cx,_emscripten_bind_btCapsuleShapeX___destroy___0:px,_emscripten_bind_btCapsuleShapeX_btCapsuleShapeX_2:Dn,_emscripten_bind_btCapsuleShapeX_calculateLocalInertia_2:Nv,_emscripten_bind_btCapsuleShapeX_getHalfHeight_0:mC,_emscripten_bind_btCapsuleShapeX_getLocalScaling_0:Oz,_emscripten_bind_btCapsuleShapeX_getMargin_0:pA,_emscripten_bind_btCapsuleShapeX_getRadius_0:MD,_emscripten_bind_btCapsuleShapeX_getUpAxis_0:qE,_emscripten_bind_btCapsuleShapeX_setLocalScaling_1:Cx,_emscripten_bind_btCapsuleShapeX_setMargin_1:Ay,_emscripten_bind_btCapsuleShapeZ___destroy___0:px,_emscripten_bind_btCapsuleShapeZ_btCapsuleShapeZ_2:Cn,_emscripten_bind_btCapsuleShapeZ_calculateLocalInertia_2:Nv,_emscripten_bind_btCapsuleShapeZ_getHalfHeight_0:mC,_emscripten_bind_btCapsuleShapeZ_getLocalScaling_0:Oz,_emscripten_bind_btCapsuleShapeZ_getMargin_0:pA,_emscripten_bind_btCapsuleShapeZ_getRadius_0:MD,_emscripten_bind_btCapsuleShapeZ_getUpAxis_0:qE,_emscripten_bind_btCapsuleShapeZ_setLocalScaling_1:Cx,_emscripten_bind_btCapsuleShapeZ_setMargin_1:Ay,_emscripten_bind_btCapsuleShape___destroy___0:px,_emscripten_bind_btCapsuleShape_btCapsuleShape_2:Fn,_emscripten_bind_btCapsuleShape_calculateLocalInertia_2:Nv,_emscripten_bind_btCapsuleShape_getHalfHeight_0:mC,_emscripten_bind_btCapsuleShape_getLocalScaling_0:Oz,_emscripten_bind_btCapsuleShape_getMargin_0:pA,_emscripten_bind_btCapsuleShape_getRadius_0:MD,_emscripten_bind_btCapsuleShape_getUpAxis_0:qE,_emscripten_bind_btCapsuleShape_setLocalScaling_1:Cx,_emscripten_bind_btCapsuleShape_setMargin_1:Ay,_emscripten_bind_btCollisionConfiguration___destroy___0:px,_emscripten_bind_btCollisionDispatcher___destroy___0:px,_emscripten_bind_btCollisionDispatcher_btCollisionDispatcher_1:ok,_emscripten_bind_btCollisionDispatcher_getManifoldByIndexInternal_1:Aw,_emscripten_bind_btCollisionDispatcher_getNumManifolds_0:qA,_emscripten_bind_btCollisionObject___destroy___0:px,_emscripten_bind_btCollisionObject_activate_0:ju,_emscripten_bind_btCollisionObject_activate_1:Ys,_emscripten_bind_btCollisionObject_forceActivationState_1:FB,_emscripten_bind_btCollisionObject_getCollisionFlags_0:JD,_emscripten_bind_btCollisionObject_getCollisionShape_0:ID,_emscripten_bind_btCollisionObject_getUserIndex_0:nE,_emscripten_bind_btCollisionObject_getUserPointer_0:cE,_emscripten_bind_btCollisionObject_getWorldTransform_0:fF,_emscripten_bind_btCollisionObject_isActive_0:ZA,_emscripten_bind_btCollisionObject_isKinematicObject_0:Ry,_emscripten_bind_btCollisionObject_isStaticObject_0:Kz,_emscripten_bind_btCollisionObject_isStaticOrKinematicObject_0:tx,_emscripten_bind_btCollisionObject_setActivationState_1:uw,_emscripten_bind_btCollisionObject_setAnisotropicFriction_2:Lv,_emscripten_bind_btCollisionObject_setCcdMotionThreshold_1:Oy,_emscripten_bind_btCollisionObject_setCcdSweptSphereRadius_1:xy,_emscripten_bind_btCollisionObject_setCollisionFlags_1:wz,_emscripten_bind_btCollisionObject_setCollisionShape_1:sx,_emscripten_bind_btCollisionObject_setContactProcessingThreshold_1:Uy,_emscripten_bind_btCollisionObject_setFriction_1:YA,_emscripten_bind_btCollisionObject_setRestitution_1:oA,_emscripten_bind_btCollisionObject_setRollingFriction_1:Fz,_emscripten_bind_btCollisionObject_setUserIndex_1:tA,_emscripten_bind_btCollisionObject_setUserPointer_1:Wz,_emscripten_bind_btCollisionObject_setWorldTransform_1:cy,_emscripten_bind_btCollisionShape___destroy___0:px,_emscripten_bind_btCollisionShape_calculateLocalInertia_2:Nv,_emscripten_bind_btCollisionShape_getLocalScaling_0:Oz,_emscripten_bind_btCollisionShape_getMargin_0:pA,_emscripten_bind_btCollisionShape_setLocalScaling_1:Cx,_emscripten_bind_btCollisionShape_setMargin_1:Ay,_emscripten_bind_btCollisionWorld___destroy___0:px,_emscripten_bind_btCollisionWorld_addCollisionObject_1:kw,_emscripten_bind_btCollisionWorld_addCollisionObject_2:Ru,_emscripten_bind_btCollisionWorld_addCollisionObject_3:pt,_emscripten_bind_btCollisionWorld_contactPairTest_3:wt,_emscripten_bind_btCollisionWorld_contactTest_2:tn,_emscripten_bind_btCollisionWorld_convexSweepTest_5:Qr,_emscripten_bind_btCollisionWorld_getBroadphase_0:LD,_emscripten_bind_btCollisionWorld_getDispatchInfo_0:tC,_emscripten_bind_btCollisionWorld_getDispatcher_0:KD,_emscripten_bind_btCollisionWorld_getPairCache_0:Tz,_emscripten_bind_btCollisionWorld_rayTest_3:$u,_emscripten_bind_btCollisionWorld_removeCollisionObject_1:Pw,_emscripten_bind_btCollisionWorld_updateSingleAabb_1:nx,_emscripten_bind_btCompoundShape___destroy___0:px,_emscripten_bind_btCompoundShape_addChildShape_2:Sd,_emscripten_bind_btCompoundShape_btCompoundShape_0:ny,_emscripten_bind_btCompoundShape_btCompoundShape_1:Sw,_emscripten_bind_btCompoundShape_calculateLocalInertia_2:Nv,_emscripten_bind_btCompoundShape_getChildShape_1:Pz,_emscripten_bind_btCompoundShape_getLocalScaling_0:Oz,_emscripten_bind_btCompoundShape_getMargin_0:pA,_emscripten_bind_btCompoundShape_getNumChildShapes_0:cB,_emscripten_bind_btCompoundShape_removeChildShapeByIndex_1:_x,_emscripten_bind_btCompoundShape_setLocalScaling_1:Cx,_emscripten_bind_btCompoundShape_setMargin_1:Ay,_emscripten_bind_btConcaveShape___destroy___0:px,_emscripten_bind_btConcaveShape_calculateLocalInertia_2:Nv,_emscripten_bind_btConcaveShape_getLocalScaling_0:Oz,_emscripten_bind_btConcaveShape_setLocalScaling_1:Cx,_emscripten_bind_btConeShapeX___destroy___0:px,_emscripten_bind_btConeShapeX_btConeShapeX_2:um,_emscripten_bind_btConeShapeX_calculateLocalInertia_2:Nv,_emscripten_bind_btConeShapeX_getLocalScaling_0:Oz,_emscripten_bind_btConeShapeX_setLocalScaling_1:Cx,_emscripten_bind_btConeShapeZ___destroy___0:px,_emscripten_bind_btConeShapeZ_btConeShapeZ_2:tm,_emscripten_bind_btConeShapeZ_calculateLocalInertia_2:Nv,_emscripten_bind_btConeShapeZ_getLocalScaling_0:Oz,_emscripten_bind_btConeShapeZ_setLocalScaling_1:Cx,_emscripten_bind_btConeShape___destroy___0:px,_emscripten_bind_btConeShape_btConeShape_2:vm,_emscripten_bind_btConeShape_calculateLocalInertia_2:Nv,_emscripten_bind_btConeShape_getLocalScaling_0:Oz,_emscripten_bind_btConeShape_setLocalScaling_1:Cx,_emscripten_bind_btConeTwistConstraint___destroy___0:px,_emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_2:Wg,_emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_4:Fg,_emscripten_bind_btConeTwistConstraint_enableFeedback_1:mz,_emscripten_bind_btConeTwistConstraint_enableMotor_1:dz,_emscripten_bind_btConeTwistConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btConeTwistConstraint_getParam_2:Rv,_emscripten_bind_btConeTwistConstraint_setAngularOnly_1:zy,_emscripten_bind_btConeTwistConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btConeTwistConstraint_setDamping_1:Nz,_emscripten_bind_btConeTwistConstraint_setLimit_2:Rx,_emscripten_bind_btConeTwistConstraint_setMaxMotorImpulseNormalized_1:yw,_emscripten_bind_btConeTwistConstraint_setMaxMotorImpulse_1:ey,_emscripten_bind_btConeTwistConstraint_setMotorTargetInConstraintSpace_1:hv,_emscripten_bind_btConeTwistConstraint_setMotorTarget_1:di,_emscripten_bind_btConeTwistConstraint_setParam_3:fv,_emscripten_bind_btConstraintSetting___destroy___0:TD,_emscripten_bind_btConstraintSetting_btConstraintSetting_0:zz,_emscripten_bind_btConstraintSetting_get_m_damping_0:RG,_emscripten_bind_btConstraintSetting_get_m_impulseClamp_0:bH,_emscripten_bind_btConstraintSetting_get_m_tau_0:GF,_emscripten_bind_btConstraintSetting_set_m_damping_1:mG,_emscripten_bind_btConstraintSetting_set_m_impulseClamp_1:lG,_emscripten_bind_btConstraintSetting_set_m_tau_1:MG,_emscripten_bind_btConstraintSolver___destroy___0:px,_emscripten_bind_btContactSolverInfo___destroy___0:TD,_emscripten_bind_btContactSolverInfo_get_m_numIterations_0:vG,_emscripten_bind_btContactSolverInfo_get_m_splitImpulsePenetrationThreshold_0:TA,_emscripten_bind_btContactSolverInfo_get_m_splitImpulse_0:uC,_emscripten_bind_btContactSolverInfo_set_m_numIterations_1:gE,_emscripten_bind_btContactSolverInfo_set_m_splitImpulsePenetrationThreshold_1:py,_emscripten_bind_btContactSolverInfo_set_m_splitImpulse_1:KA,_emscripten_bind_btConvexHullShape___destroy___0:px,_emscripten_bind_btConvexHullShape_addPoint_1:cz,_emscripten_bind_btConvexHullShape_addPoint_2:jx,_emscripten_bind_btConvexHullShape_btConvexHullShape_0:_w,_emscripten_bind_btConvexHullShape_calculateLocalInertia_2:Nv,_emscripten_bind_btConvexHullShape_getLocalScaling_0:Oz,_emscripten_bind_btConvexHullShape_getMargin_0:pA,_emscripten_bind_btConvexHullShape_setLocalScaling_1:Cx,_emscripten_bind_btConvexHullShape_setMargin_1:Ay,_emscripten_bind_btConvexShape___destroy___0:px,_emscripten_bind_btConvexShape_calculateLocalInertia_2:Nv,_emscripten_bind_btConvexShape_getLocalScaling_0:Oz,_emscripten_bind_btConvexShape_getMargin_0:pA,_emscripten_bind_btConvexShape_setLocalScaling_1:Cx,_emscripten_bind_btConvexShape_setMargin_1:Ay,_emscripten_bind_btConvexTriangleMeshShape___destroy___0:px,_emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_1:Al,_emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_2:kl,_emscripten_bind_btConvexTriangleMeshShape_calculateLocalInertia_2:Nv,_emscripten_bind_btConvexTriangleMeshShape_getLocalScaling_0:Oz,_emscripten_bind_btConvexTriangleMeshShape_getMargin_0:pA,_emscripten_bind_btConvexTriangleMeshShape_setLocalScaling_1:Cx,_emscripten_bind_btConvexTriangleMeshShape_setMargin_1:Ay,_emscripten_bind_btCylinderShapeX___destroy___0:px,_emscripten_bind_btCylinderShapeX_btCylinderShapeX_1:Wt,_emscripten_bind_btCylinderShapeX_calculateLocalInertia_2:Nv,_emscripten_bind_btCylinderShapeX_getLocalScaling_0:Oz,_emscripten_bind_btCylinderShapeX_getMargin_0:pA,_emscripten_bind_btCylinderShapeX_setLocalScaling_1:Cx,_emscripten_bind_btCylinderShapeX_setMargin_1:Ay,_emscripten_bind_btCylinderShapeZ___destroy___0:px,_emscripten_bind_btCylinderShapeZ_btCylinderShapeZ_1:Vt,_emscripten_bind_btCylinderShapeZ_calculateLocalInertia_2:Nv,_emscripten_bind_btCylinderShapeZ_getLocalScaling_0:Oz,_emscripten_bind_btCylinderShapeZ_getMargin_0:pA,_emscripten_bind_btCylinderShapeZ_setLocalScaling_1:Cx,_emscripten_bind_btCylinderShapeZ_setMargin_1:Ay,_emscripten_bind_btCylinderShape___destroy___0:px,_emscripten_bind_btCylinderShape_btCylinderShape_1:Mw,_emscripten_bind_btCylinderShape_calculateLocalInertia_2:Nv,_emscripten_bind_btCylinderShape_getLocalScaling_0:Oz,_emscripten_bind_btCylinderShape_getMargin_0:pA,_emscripten_bind_btCylinderShape_setLocalScaling_1:Cx,_emscripten_bind_btCylinderShape_setMargin_1:Ay,_emscripten_bind_btDbvtBroadphase___destroy___0:px,_emscripten_bind_btDbvtBroadphase_btDbvtBroadphase_0:Bx,_emscripten_bind_btDefaultCollisionConfiguration___destroy___0:px,_emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_0:Fq,_emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_1:At,_emscripten_bind_btDefaultCollisionConstructionInfo___destroy___0:TD,_emscripten_bind_btDefaultCollisionConstructionInfo_btDefaultCollisionConstructionInfo_0:Jv,_emscripten_bind_btDefaultMotionState___destroy___0:px,_emscripten_bind_btDefaultMotionState_btDefaultMotionState_0:ps,_emscripten_bind_btDefaultMotionState_btDefaultMotionState_1:Ws,_emscripten_bind_btDefaultMotionState_btDefaultMotionState_2:_t,_emscripten_bind_btDefaultMotionState_getWorldTransform_1:sx,_emscripten_bind_btDefaultMotionState_get_m_graphicsWorldTrans_0:OI,_emscripten_bind_btDefaultMotionState_setWorldTransform_1:ex,_emscripten_bind_btDefaultMotionState_set_m_graphicsWorldTrans_1:Qy,_emscripten_bind_btDefaultSoftBodySolver___destroy___0:px,_emscripten_bind_btDefaultSoftBodySolver_btDefaultSoftBodySolver_0:sq,_emscripten_bind_btDefaultVehicleRaycaster___destroy___0:px,_emscripten_bind_btDefaultVehicleRaycaster_btDefaultVehicleRaycaster_1:rv,_emscripten_bind_btDefaultVehicleRaycaster_castRay_3:Pu,_emscripten_bind_btDiscreteDynamicsWorld___destroy___0:px,_emscripten_bind_btDiscreteDynamicsWorld_addAction_1:Jx,_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_1:Mv,_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_2:ru,_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_3:pt,_emscripten_bind_btDiscreteDynamicsWorld_addConstraint_1:xw,_emscripten_bind_btDiscreteDynamicsWorld_addConstraint_2:sv,_emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_1:Rw,_emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_3:kt,_emscripten_bind_btDiscreteDynamicsWorld_addVehicle_1:Vw,_emscripten_bind_btDiscreteDynamicsWorld_btDiscreteDynamicsWorld_4:Tq,_emscripten_bind_btDiscreteDynamicsWorld_contactPairTest_3:wt,_emscripten_bind_btDiscreteDynamicsWorld_contactTest_2:tn,_emscripten_bind_btDiscreteDynamicsWorld_convexSweepTest_5:Qr,_emscripten_bind_btDiscreteDynamicsWorld_getBroadphase_0:LD,_emscripten_bind_btDiscreteDynamicsWorld_getDispatchInfo_0:tC,_emscripten_bind_btDiscreteDynamicsWorld_getDispatcher_0:KD,_emscripten_bind_btDiscreteDynamicsWorld_getGravity_0:Zo,_emscripten_bind_btDiscreteDynamicsWorld_getPairCache_0:Tz,_emscripten_bind_btDiscreteDynamicsWorld_getSolverInfo_0:XB,_emscripten_bind_btDiscreteDynamicsWorld_rayTest_3:$u,_emscripten_bind_btDiscreteDynamicsWorld_removeAction_1:ox,_emscripten_bind_btDiscreteDynamicsWorld_removeCollisionObject_1:Pw,_emscripten_bind_btDiscreteDynamicsWorld_removeConstraint_1:Bw,_emscripten_bind_btDiscreteDynamicsWorld_removeRigidBody_1:Fw,_emscripten_bind_btDiscreteDynamicsWorld_removeVehicle_1:Lw,_emscripten_bind_btDiscreteDynamicsWorld_setGravity_1:Zw,_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_1:qv,_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_2:vu,_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_3:Bu,_emscripten_bind_btDiscreteDynamicsWorld_updateSingleAabb_1:nx,_emscripten_bind_btDispatcherInfo___destroy___0:TD,_emscripten_bind_btDispatcherInfo_get_m_allowedCcdPenetration_0:WG,_emscripten_bind_btDispatcherInfo_get_m_convexConservativeDistanceThreshold_0:GG,_emscripten_bind_btDispatcherInfo_get_m_dispatchFunc_0:DE,_emscripten_bind_btDispatcherInfo_get_m_enableSPU_0:xD,_emscripten_bind_btDispatcherInfo_get_m_enableSatConvex_0:CC,_emscripten_bind_btDispatcherInfo_get_m_stepCount_0:hF,_emscripten_bind_btDispatcherInfo_get_m_timeOfImpact_0:VG,_emscripten_bind_btDispatcherInfo_get_m_timeStep_0:GF,_emscripten_bind_btDispatcherInfo_get_m_useContinuous_0:RC,_emscripten_bind_btDispatcherInfo_get_m_useConvexConservativeDistanceUtil_0:vA,_emscripten_bind_btDispatcherInfo_get_m_useEpa_0:YD,_emscripten_bind_btDispatcherInfo_set_m_allowedCcdPenetration_1:SE,_emscripten_bind_btDispatcherInfo_set_m_convexConservativeDistanceThreshold_1:IE,_emscripten_bind_btDispatcherInfo_set_m_dispatchFunc_1:AB,_emscripten_bind_btDispatcherInfo_set_m_enableSPU_1:uB,_emscripten_bind_btDispatcherInfo_set_m_enableSatConvex_1:SA,_emscripten_bind_btDispatcherInfo_set_m_stepCount_1:OB,_emscripten_bind_btDispatcherInfo_set_m_timeOfImpact_1:RF,_emscripten_bind_btDispatcherInfo_set_m_timeStep_1:MG,_emscripten_bind_btDispatcherInfo_set_m_useContinuous_1:bB,_emscripten_bind_btDispatcherInfo_set_m_useConvexConservativeDistanceUtil_1:_y,_emscripten_bind_btDispatcherInfo_set_m_useEpa_1:GB,_emscripten_bind_btDispatcher___destroy___0:px,_emscripten_bind_btDispatcher_getManifoldByIndexInternal_1:Aw,_emscripten_bind_btDispatcher_getNumManifolds_0:qA,_emscripten_bind_btDynamicsWorld___destroy___0:px,_emscripten_bind_btDynamicsWorld_addAction_1:Jx,_emscripten_bind_btDynamicsWorld_addCollisionObject_1:kw,_emscripten_bind_btDynamicsWorld_addCollisionObject_2:Ru,_emscripten_bind_btDynamicsWorld_addCollisionObject_3:pt,_emscripten_bind_btDynamicsWorld_contactPairTest_3:wt,_emscripten_bind_btDynamicsWorld_contactTest_2:tn,_emscripten_bind_btDynamicsWorld_convexSweepTest_5:Qr,_emscripten_bind_btDynamicsWorld_getBroadphase_0:LD,_emscripten_bind_btDynamicsWorld_getDispatchInfo_0:tC,_emscripten_bind_btDynamicsWorld_getDispatcher_0:KD,_emscripten_bind_btDynamicsWorld_getPairCache_0:Tz,_emscripten_bind_btDynamicsWorld_getSolverInfo_0:XB,_emscripten_bind_btDynamicsWorld_rayTest_3:$u,_emscripten_bind_btDynamicsWorld_removeAction_1:ox,_emscripten_bind_btDynamicsWorld_removeCollisionObject_1:Pw,_emscripten_bind_btDynamicsWorld_updateSingleAabb_1:nx,_emscripten_bind_btFixedConstraint___destroy___0:px,_emscripten_bind_btFixedConstraint_btFixedConstraint_4:Xl,_emscripten_bind_btFixedConstraint_enableFeedback_1:mz,_emscripten_bind_btFixedConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btFixedConstraint_getParam_2:Rv,_emscripten_bind_btFixedConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btFixedConstraint_setParam_3:fv,_emscripten_bind_btGeneric6DofConstraint___destroy___0:px,_emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_3:os,_emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_5:er,_emscripten_bind_btGeneric6DofConstraint_enableFeedback_1:mz,_emscripten_bind_btGeneric6DofConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btGeneric6DofConstraint_getParam_2:Rv,_emscripten_bind_btGeneric6DofConstraint_getRotationalLimitMotor_1:zw,_emscripten_bind_btGeneric6DofConstraint_setAngularLowerLimit_1:jw,_emscripten_bind_btGeneric6DofConstraint_setAngularUpperLimit_1:iw,_emscripten_bind_btGeneric6DofConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btGeneric6DofConstraint_setLinearLowerLimit_1:ww,_emscripten_bind_btGeneric6DofConstraint_setLinearUpperLimit_1:vw,_emscripten_bind_btGeneric6DofConstraint_setParam_3:fv,_emscripten_bind_btGeneric6DofSpringConstraint___destroy___0:px,_emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_3:Fk,_emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_5:uk,_emscripten_bind_btGeneric6DofSpringConstraint_enableFeedback_1:mz,_emscripten_bind_btGeneric6DofSpringConstraint_enableSpring_2:Kr,_emscripten_bind_btGeneric6DofSpringConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btGeneric6DofSpringConstraint_getParam_2:Rv,_emscripten_bind_btGeneric6DofSpringConstraint_getRotationalLimitMotor_1:zw,_emscripten_bind_btGeneric6DofSpringConstraint_setAngularLowerLimit_1:jw,_emscripten_bind_btGeneric6DofSpringConstraint_setAngularUpperLimit_1:iw,_emscripten_bind_btGeneric6DofSpringConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btGeneric6DofSpringConstraint_setDamping_2:Zx,_emscripten_bind_btGeneric6DofSpringConstraint_setLinearLowerLimit_1:ww,_emscripten_bind_btGeneric6DofSpringConstraint_setLinearUpperLimit_1:vw,_emscripten_bind_btGeneric6DofSpringConstraint_setParam_3:fv,_emscripten_bind_btGeneric6DofSpringConstraint_setStiffness_2:Px,_emscripten_bind_btGhostObject___destroy___0:px,_emscripten_bind_btGhostObject_activate_0:ju,_emscripten_bind_btGhostObject_activate_1:Ys,_emscripten_bind_btGhostObject_btGhostObject_0:Pg,_emscripten_bind_btGhostObject_forceActivationState_1:FB,_emscripten_bind_btGhostObject_getCollisionFlags_0:JD,_emscripten_bind_btGhostObject_getCollisionShape_0:ID,_emscripten_bind_btGhostObject_getNumOverlappingObjects_0:aA,_emscripten_bind_btGhostObject_getOverlappingObject_1:Hy,_emscripten_bind_btGhostObject_getUserIndex_0:nE,_emscripten_bind_btGhostObject_getUserPointer_0:cE,_emscripten_bind_btGhostObject_getWorldTransform_0:fF,_emscripten_bind_btGhostObject_isActive_0:ZA,_emscripten_bind_btGhostObject_isKinematicObject_0:Ry,_emscripten_bind_btGhostObject_isStaticObject_0:Kz,_emscripten_bind_btGhostObject_isStaticOrKinematicObject_0:tx,_emscripten_bind_btGhostObject_setActivationState_1:uw,_emscripten_bind_btGhostObject_setAnisotropicFriction_2:Lv,_emscripten_bind_btGhostObject_setCcdMotionThreshold_1:Oy,_emscripten_bind_btGhostObject_setCcdSweptSphereRadius_1:xy,_emscripten_bind_btGhostObject_setCollisionFlags_1:wz,_emscripten_bind_btGhostObject_setCollisionShape_1:sx,_emscripten_bind_btGhostObject_setContactProcessingThreshold_1:Uy,_emscripten_bind_btGhostObject_setFriction_1:YA,_emscripten_bind_btGhostObject_setRestitution_1:oA,_emscripten_bind_btGhostObject_setRollingFriction_1:Fz,_emscripten_bind_btGhostObject_setUserIndex_1:tA,_emscripten_bind_btGhostObject_setUserPointer_1:Wz,_emscripten_bind_btGhostObject_setWorldTransform_1:cy,_emscripten_bind_btGhostPairCallback___destroy___0:px,_emscripten_bind_btGhostPairCallback_btGhostPairCallback_0:Iz,_emscripten_bind_btHeightfieldTerrainShape___destroy___0:px,_emscripten_bind_btHeightfieldTerrainShape_btHeightfieldTerrainShape_9:ug,_emscripten_bind_btHeightfieldTerrainShape_calculateLocalInertia_2:Nv,_emscripten_bind_btHeightfieldTerrainShape_getLocalScaling_0:Oz,_emscripten_bind_btHeightfieldTerrainShape_getMargin_0:pA,_emscripten_bind_btHeightfieldTerrainShape_setLocalScaling_1:Cx,_emscripten_bind_btHeightfieldTerrainShape_setMargin_1:Ay,_emscripten_bind_btHingeConstraint___destroy___0:px,_emscripten_bind_btHingeConstraint_btHingeConstraint_2:eg,_emscripten_bind_btHingeConstraint_btHingeConstraint_3:ag,_emscripten_bind_btHingeConstraint_btHingeConstraint_4:Dg,_emscripten_bind_btHingeConstraint_btHingeConstraint_5:zg,_emscripten_bind_btHingeConstraint_btHingeConstraint_6:br,_emscripten_bind_btHingeConstraint_btHingeConstraint_7:Bq,_emscripten_bind_btHingeConstraint_enableAngularMotor_3:Av,_emscripten_bind_btHingeConstraint_enableFeedback_1:mz,_emscripten_bind_btHingeConstraint_enableMotor_1:Zz,_emscripten_bind_btHingeConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btHingeConstraint_getParam_2:Rv,_emscripten_bind_btHingeConstraint_setAngularOnly_1:rz,_emscripten_bind_btHingeConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btHingeConstraint_setLimit_4:yv,_emscripten_bind_btHingeConstraint_setLimit_5:Uu,_emscripten_bind_btHingeConstraint_setMaxMotorImpulse_1:My,_emscripten_bind_btHingeConstraint_setMotorTarget_2:_j,_emscripten_bind_btHingeConstraint_setParam_3:fv,_emscripten_bind_btKinematicCharacterController___destroy___0:px,_emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_3:En,_emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_4:Aq,_emscripten_bind_btKinematicCharacterController_canJump_0:uy,_emscripten_bind_btKinematicCharacterController_getGhostObject_0:DE,_emscripten_bind_btKinematicCharacterController_getGravity_0:xp,_emscripten_bind_btKinematicCharacterController_getMaxSlope_0:EG,_emscripten_bind_btKinematicCharacterController_jump_0:Rt,_emscripten_bind_btKinematicCharacterController_onGround_0:Cz,_emscripten_bind_btKinematicCharacterController_playerStep_2:tv,_emscripten_bind_btKinematicCharacterController_preStep_1:Kw,_emscripten_bind_btKinematicCharacterController_setFallSpeed_1:SE,_emscripten_bind_btKinematicCharacterController_setGravity_1:Jm,_emscripten_bind_btKinematicCharacterController_setJumpSpeed_1:Yx,_emscripten_bind_btKinematicCharacterController_setMaxJumpHeight_1:HE,_emscripten_bind_btKinematicCharacterController_setMaxSlope_1:ax,_emscripten_bind_btKinematicCharacterController_setUpInterpolate_1:$v,_emscripten_bind_btKinematicCharacterController_setUp_1:cl,_emscripten_bind_btKinematicCharacterController_setUseGhostSweepTest_1:bw,_emscripten_bind_btKinematicCharacterController_setVelocityForTimeInterval_2:Lu,_emscripten_bind_btKinematicCharacterController_setWalkDirection_1:_v,_emscripten_bind_btKinematicCharacterController_updateAction_2:aw,_emscripten_bind_btKinematicCharacterController_warp_1:Uw,_emscripten_bind_btManifoldPoint___destroy___0:TD,_emscripten_bind_btManifoldPoint_getAppliedImpulse_0:Hz,_emscripten_bind_btManifoldPoint_getDistance_0:kA,_emscripten_bind_btManifoldPoint_getPositionWorldOnA_0:BE,_emscripten_bind_btManifoldPoint_getPositionWorldOnB_0:FA,_emscripten_bind_btManifoldPoint_get_m_localPointA_0:gJ,_emscripten_bind_btManifoldPoint_get_m_localPointB_0:XG,_emscripten_bind_btManifoldPoint_get_m_normalWorldOnB_0:NF,_emscripten_bind_btManifoldPoint_get_m_positionWorldOnA_0:gI,_emscripten_bind_btManifoldPoint_get_m_positionWorldOnB_0:iH,_emscripten_bind_btManifoldPoint_set_m_localPointA_1:Gs,_emscripten_bind_btManifoldPoint_set_m_localPointB_1:cs,_emscripten_bind_btManifoldPoint_set_m_normalWorldOnB_1:Xr,_emscripten_bind_btManifoldPoint_set_m_positionWorldOnA_1:ss,_emscripten_bind_btManifoldPoint_set_m_positionWorldOnB_1:Sr,_emscripten_bind_btMatrix3x3___destroy___0:TD,_emscripten_bind_btMatrix3x3_getRotation_1:Mz,_emscripten_bind_btMatrix3x3_getRow_1:Iq,_emscripten_bind_btMatrix3x3_setEulerZYX_3:wx,_emscripten_bind_btMotionState___destroy___0:px,_emscripten_bind_btMotionState_getWorldTransform_1:sx,_emscripten_bind_btMotionState_setWorldTransform_1:ex,_emscripten_bind_btOverlappingPairCache___destroy___0:px,_emscripten_bind_btOverlappingPairCache_setInternalGhostPairCallback_1:Bw,_emscripten_bind_btOverlappingPairCallback___destroy___0:px,_emscripten_bind_btPairCachingGhostObject___destroy___0:px,_emscripten_bind_btPairCachingGhostObject_activate_0:ju,_emscripten_bind_btPairCachingGhostObject_activate_1:Ys,_emscripten_bind_btPairCachingGhostObject_btPairCachingGhostObject_0:kg,_emscripten_bind_btPairCachingGhostObject_forceActivationState_1:FB,_emscripten_bind_btPairCachingGhostObject_getCollisionFlags_0:JD,_emscripten_bind_btPairCachingGhostObject_getCollisionShape_0:ID,_emscripten_bind_btPairCachingGhostObject_getNumOverlappingObjects_0:aA,_emscripten_bind_btPairCachingGhostObject_getOverlappingObject_1:Hy,_emscripten_bind_btPairCachingGhostObject_getUserIndex_0:nE,_emscripten_bind_btPairCachingGhostObject_getUserPointer_0:cE,_emscripten_bind_btPairCachingGhostObject_getWorldTransform_0:fF,_emscripten_bind_btPairCachingGhostObject_isActive_0:ZA,_emscripten_bind_btPairCachingGhostObject_isKinematicObject_0:Ry,_emscripten_bind_btPairCachingGhostObject_isStaticObject_0:Kz,_emscripten_bind_btPairCachingGhostObject_isStaticOrKinematicObject_0:tx,_emscripten_bind_btPairCachingGhostObject_setActivationState_1:uw,_emscripten_bind_btPairCachingGhostObject_setAnisotropicFriction_2:Lv,_emscripten_bind_btPairCachingGhostObject_setCcdMotionThreshold_1:Oy,_emscripten_bind_btPairCachingGhostObject_setCcdSweptSphereRadius_1:xy,_emscripten_bind_btPairCachingGhostObject_setCollisionFlags_1:wz,_emscripten_bind_btPairCachingGhostObject_setCollisionShape_1:sx,_emscripten_bind_btPairCachingGhostObject_setContactProcessingThreshold_1:Uy,_emscripten_bind_btPairCachingGhostObject_setFriction_1:YA,_emscripten_bind_btPairCachingGhostObject_setRestitution_1:oA,_emscripten_bind_btPairCachingGhostObject_setRollingFriction_1:Fz,_emscripten_bind_btPairCachingGhostObject_setUserIndex_1:tA,_emscripten_bind_btPairCachingGhostObject_setUserPointer_1:Wz,_emscripten_bind_btPairCachingGhostObject_setWorldTransform_1:cy,_emscripten_bind_btPersistentManifold___destroy___0:QB,_emscripten_bind_btPersistentManifold_btPersistentManifold_0:gm,_emscripten_bind_btPersistentManifold_getBody0_0:wD,_emscripten_bind_btPersistentManifold_getBody1_0:vD,_emscripten_bind_btPersistentManifold_getContactPoint_1:oy,_emscripten_bind_btPersistentManifold_getNumContacts_0:BC,_emscripten_bind_btPoint2PointConstraint___destroy___0:px,_emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_2:Wj,_emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_4:ik,_emscripten_bind_btPoint2PointConstraint_enableFeedback_1:mz,_emscripten_bind_btPoint2PointConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btPoint2PointConstraint_getParam_2:Rv,_emscripten_bind_btPoint2PointConstraint_getPivotInA_0:EA,_emscripten_bind_btPoint2PointConstraint_getPivotInB_0:DA,_emscripten_bind_btPoint2PointConstraint_get_m_setting_0:EH,_emscripten_bind_btPoint2PointConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btPoint2PointConstraint_setParam_3:fv,_emscripten_bind_btPoint2PointConstraint_setPivotA_1:jy,_emscripten_bind_btPoint2PointConstraint_setPivotB_1:iy,_emscripten_bind_btPoint2PointConstraint_set_m_setting_1:st,_emscripten_bind_btQuadWord___destroy___0:TD,_emscripten_bind_btQuadWord_setW_1:XD,_emscripten_bind_btQuadWord_setX_1:mE,_emscripten_bind_btQuadWord_setY_1:lE,_emscripten_bind_btQuadWord_setZ_1:kE,_emscripten_bind_btQuadWord_w_0:AE,_emscripten_bind_btQuadWord_x_0:ZF,_emscripten_bind_btQuadWord_y_0:zE,_emscripten_bind_btQuadWord_z_0:yE,_emscripten_bind_btQuaternion___destroy___0:TD,_emscripten_bind_btQuaternion_angleShortestPath_1:bz,_emscripten_bind_btQuaternion_angle_1:DB,_emscripten_bind_btQuaternion_btQuaternion_4:qp,_emscripten_bind_btQuaternion_dot_1:lC,_emscripten_bind_btQuaternion_getAngleShortestPath_0:Zy,_emscripten_bind_btQuaternion_getAngle_0:zB,_emscripten_bind_btQuaternion_getAxis_0:Fp,_emscripten_bind_btQuaternion_inverse_0:Ep,_emscripten_bind_btQuaternion_length2_0:NE,_emscripten_bind_btQuaternion_length_0:gF,_emscripten_bind_btQuaternion_normalize_0:CE,_emscripten_bind_btQuaternion_normalized_0:wp,_emscripten_bind_btQuaternion_op_add_1:kC,_emscripten_bind_btQuaternion_op_div_1:QC,_emscripten_bind_btQuaternion_op_mul_1:Zt,_emscripten_bind_btQuaternion_op_mulq_1:WB,_emscripten_bind_btQuaternion_op_sub_1:jC,_emscripten_bind_btQuaternion_setEulerZYX_3:Tw,_emscripten_bind_btQuaternion_setEuler_3:mx,_emscripten_bind_btQuaternion_setRotation_2:Ix,_emscripten_bind_btQuaternion_setValue_4:Tp,_emscripten_bind_btQuaternion_setW_1:XD,_emscripten_bind_btQuaternion_setX_1:mE,_emscripten_bind_btQuaternion_setY_1:lE,_emscripten_bind_btQuaternion_setZ_1:kE,_emscripten_bind_btQuaternion_w_0:AE,_emscripten_bind_btQuaternion_x_0:ZF,_emscripten_bind_btQuaternion_y_0:zE,_emscripten_bind_btQuaternion_z_0:yE,_emscripten_bind_btRaycastVehicle___destroy___0:px,_emscripten_bind_btRaycastVehicle_addWheel_7:Zd,_emscripten_bind_btRaycastVehicle_applyEngineForce_2:gw,_emscripten_bind_btRaycastVehicle_btRaycastVehicle_3:il,_emscripten_bind_btRaycastVehicle_getChassisWorldTransform_0:NB,_emscripten_bind_btRaycastVehicle_getCurrentSpeedKmHour_0:Yy,_emscripten_bind_btRaycastVehicle_getForwardAxis_0:aD,_emscripten_bind_btRaycastVehicle_getForwardVector_0:Go,_emscripten_bind_btRaycastVehicle_getNumWheels_0:MB,_emscripten_bind_btRaycastVehicle_getRightAxis_0:uD,_emscripten_bind_btRaycastVehicle_getRigidBody_0:tD,_emscripten_bind_btRaycastVehicle_getSteeringValue_1:Ax,_emscripten_bind_btRaycastVehicle_getUpAxis_0:WD,_emscripten_bind_btRaycastVehicle_getUserConstraintId_0:AC,_emscripten_bind_btRaycastVehicle_getUserConstraintType_0:iC,_emscripten_bind_btRaycastVehicle_getWheelInfo_1:Yz,_emscripten_bind_btRaycastVehicle_getWheelTransformWS_1:Gy,_emscripten_bind_btRaycastVehicle_rayCast_1:Gz,_emscripten_bind_btRaycastVehicle_resetSuspension_0:Yl,_emscripten_bind_btRaycastVehicle_setBrake_2:Qw,_emscripten_bind_btRaycastVehicle_setCoordinateSystem_3:qu,_emscripten_bind_btRaycastVehicle_setPitchControl_1:Lz,_emscripten_bind_btRaycastVehicle_setSteeringValue_2:fw,_emscripten_bind_btRaycastVehicle_setUserConstraintId_1:Py,_emscripten_bind_btRaycastVehicle_setUserConstraintType_1:Fy,_emscripten_bind_btRaycastVehicle_updateAction_2:aw,_emscripten_bind_btRaycastVehicle_updateFriction_1:vx,_emscripten_bind_btRaycastVehicle_updateSuspension_1:El,_emscripten_bind_btRaycastVehicle_updateVehicle_1:zx,_emscripten_bind_btRaycastVehicle_updateWheelTransform_2:Yt,_emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_1:jv,_emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_2:mu,_emscripten_bind_btRigidBodyConstructionInfo___destroy___0:TD,_emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_3:Zn,_emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_4:qr,_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingFactor_0:uA,_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingThresholdSqr_0:Sz,_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDampingFactor_0:iB,_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDamping_0:RA,_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalLinearDampingThresholdSqr_0:Xz,_emscripten_bind_btRigidBodyConstructionInfo_get_m_angularDamping_0:sC,_emscripten_bind_btRigidBodyConstructionInfo_get_m_angularSleepingThreshold_0:aB,_emscripten_bind_btRigidBodyConstructionInfo_get_m_friction_0:$C,_emscripten_bind_btRigidBodyConstructionInfo_get_m_linearDamping_0:IG,_emscripten_bind_btRigidBodyConstructionInfo_get_m_linearSleepingThreshold_0:hB,_emscripten_bind_btRigidBodyConstructionInfo_get_m_restitution_0:FC,_emscripten_bind_btRigidBodyConstructionInfo_get_m_rollingFriction_0:VB,_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingFactor_1:Cy,_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingThresholdSqr_1:dy,_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDampingFactor_1:qz,_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDamping_1:yz,_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalLinearDampingThresholdSqr_1:hy,_emscripten_bind_btRigidBodyConstructionInfo_set_m_angularDamping_1:SD,_emscripten_bind_btRigidBodyConstructionInfo_set_m_angularSleepingThreshold_1:jz,_emscripten_bind_btRigidBodyConstructionInfo_set_m_friction_1:QA,_emscripten_bind_btRigidBodyConstructionInfo_set_m_linearDamping_1:JE,_emscripten_bind_btRigidBodyConstructionInfo_set_m_linearSleepingThreshold_1:pz,_emscripten_bind_btRigidBodyConstructionInfo_set_m_restitution_1:AA,_emscripten_bind_btRigidBodyConstructionInfo_set_m_rollingFriction_1:hA,_emscripten_bind_btRigidBody___destroy___0:px,_emscripten_bind_btRigidBody_activate_0:ju,_emscripten_bind_btRigidBody_activate_1:Ys,_emscripten_bind_btRigidBody_applyCentralForce_1:Qu,_emscripten_bind_btRigidBody_applyCentralImpulse_1:Au,_emscripten_bind_btRigidBody_applyForce_2:Ox,_emscripten_bind_btRigidBody_applyGravity_0:Lo,_emscripten_bind_btRigidBody_applyImpulse_2:lx,_emscripten_bind_btRigidBody_applyTorqueImpulse_1:Iu,_emscripten_bind_btRigidBody_applyTorque_1:ov,_emscripten_bind_btRigidBody_btRigidBody_1:Kg,_emscripten_bind_btRigidBody_forceActivationState_1:FB,_emscripten_bind_btRigidBody_getAabb_2:zt,_emscripten_bind_btRigidBody_getAngularVelocity_0:CB,_emscripten_bind_btRigidBody_getCenterOfMassTransform_0:fF,_emscripten_bind_btRigidBody_getCollisionFlags_0:JD,_emscripten_bind_btRigidBody_getCollisionShape_0:ID,_emscripten_bind_btRigidBody_getGravity_0:dE,_emscripten_bind_btRigidBody_getLinearVelocity_0:LB,_emscripten_bind_btRigidBody_getMotionState_0:VD,_emscripten_bind_btRigidBody_getUserIndex_0:nE,_emscripten_bind_btRigidBody_getUserPointer_0:cE,_emscripten_bind_btRigidBody_getWorldTransform_0:fF,_emscripten_bind_btRigidBody_isActive_0:ZA,_emscripten_bind_btRigidBody_isKinematicObject_0:Ry,_emscripten_bind_btRigidBody_isStaticObject_0:Kz,_emscripten_bind_btRigidBody_isStaticOrKinematicObject_0:tx,_emscripten_bind_btRigidBody_setActivationState_1:uw,_emscripten_bind_btRigidBody_setAngularFactor_1:Xy,_emscripten_bind_btRigidBody_setAngularVelocity_1:By,_emscripten_bind_btRigidBody_setAnisotropicFriction_2:Lv,_emscripten_bind_btRigidBody_setCcdMotionThreshold_1:Oy,_emscripten_bind_btRigidBody_setCcdSweptSphereRadius_1:xy,_emscripten_bind_btRigidBody_setCenterOfMassTransform_1:hx,_emscripten_bind_btRigidBody_setCollisionFlags_1:wz,_emscripten_bind_btRigidBody_setCollisionShape_1:sx,_emscripten_bind_btRigidBody_setContactProcessingThreshold_1:Uy,_emscripten_bind_btRigidBody_setDamping_2:go,_emscripten_bind_btRigidBody_setFriction_1:YA,_emscripten_bind_btRigidBody_setGravity_1:nn,_emscripten_bind_btRigidBody_setLinearFactor_1:iz,_emscripten_bind_btRigidBody_setLinearVelocity_1:Ly,_emscripten_bind_btRigidBody_setMassProps_2:Qj,_emscripten_bind_btRigidBody_setMotionState_1:Wy,_emscripten_bind_btRigidBody_setRestitution_1:oA,_emscripten_bind_btRigidBody_setRollingFriction_1:Fz,_emscripten_bind_btRigidBody_setSleepingThresholds_2:ux,_emscripten_bind_btRigidBody_setUserIndex_1:tA,_emscripten_bind_btRigidBody_setUserPointer_1:Wz,_emscripten_bind_btRigidBody_setWorldTransform_1:cy,_emscripten_bind_btRigidBody_upcast_1:zA,_emscripten_bind_btRigidBody_updateInertiaTensor_0:Mj,_emscripten_bind_btRotationalLimitMotor___destroy___0:TD,_emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_0:yy,_emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_1:Ew,_emscripten_bind_btRotationalLimitMotor_get_m_enableMotor_0:hC,_emscripten_bind_btRotationalLimitMotor_get_m_hiLimit_0:RG,_emscripten_bind_btRotationalLimitMotor_get_m_loLimit_0:GF,_emscripten_bind_btRotationalLimitMotor_get_m_maxMotorForce_0:VG,_emscripten_bind_btRotationalLimitMotor_get_m_targetVelocity_0:bH,_emscripten_bind_btRotationalLimitMotor_isLimited_0:yx,_emscripten_bind_btRotationalLimitMotor_needApplyTorques_0:Rz,_emscripten_bind_btRotationalLimitMotor_set_m_enableMotor_1:CA,_emscripten_bind_btRotationalLimitMotor_set_m_hiLimit_1:mG,_emscripten_bind_btRotationalLimitMotor_set_m_loLimit_1:MG,_emscripten_bind_btRotationalLimitMotor_set_m_maxMotorForce_1:RF,_emscripten_bind_btRotationalLimitMotor_set_m_targetVelocity_1:lG,_emscripten_bind_btSequentialImpulseConstraintSolver___destroy___0:px,_emscripten_bind_btSequentialImpulseConstraintSolver_btSequentialImpulseConstraintSolver_0:hj,_emscripten_bind_btSliderConstraint___destroy___0:px,_emscripten_bind_btSliderConstraint_btSliderConstraint_3:oe,_emscripten_bind_btSliderConstraint_btSliderConstraint_5:vf,_emscripten_bind_btSliderConstraint_enableFeedback_1:mz,_emscripten_bind_btSliderConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btSliderConstraint_getParam_2:Rv,_emscripten_bind_btSliderConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btSliderConstraint_setLowerAngLimit_1:Vy,_emscripten_bind_btSliderConstraint_setLowerLinLimit_1:Uy,_emscripten_bind_btSliderConstraint_setParam_3:fv,_emscripten_bind_btSliderConstraint_setUpperAngLimit_1:Ty,_emscripten_bind_btSliderConstraint_setUpperLinLimit_1:Sy,_emscripten_bind_btSoftBodyArray___destroy___0:ay,_emscripten_bind_btSoftBodyArray_at_1:tw,_emscripten_bind_btSoftBodyArray_size_0:DF,_emscripten_bind_btSoftBodyHelpers_CreateEllipsoid_4:_g,_emscripten_bind_btSoftBodyHelpers_CreateFromConvexHull_4:Qs,_emscripten_bind_btSoftBodyHelpers_CreateFromTriMesh_5:Od,_emscripten_bind_btSoftBodyHelpers_CreatePatchUV_10:gd,_emscripten_bind_btSoftBodyHelpers_CreatePatch_9:od,_emscripten_bind_btSoftBodyHelpers_CreateRope_5:Lg,_emscripten_bind_btSoftBodyHelpers___destroy___0:TD,_emscripten_bind_btSoftBodyHelpers_btSoftBodyHelpers_0:FH,_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration___destroy___0:px,_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_0:aq,_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_1:As,_emscripten_bind_btSoftBodySolver___destroy___0:px,_emscripten_bind_btSoftBodyWorldInfo___destroy___0:Xx,_emscripten_bind_btSoftBodyWorldInfo_btSoftBodyWorldInfo_0:oz,_emscripten_bind_btSoftBodyWorldInfo_get_air_density_0:GF,_emscripten_bind_btSoftBodyWorldInfo_get_m_broadphase_0:pE,_emscripten_bind_btSoftBodyWorldInfo_get_m_dispatcher_0:oE,_emscripten_bind_btSoftBodyWorldInfo_get_m_gravity_0:eG,_emscripten_bind_btSoftBodyWorldInfo_get_m_maxDisplacement_0:VG,_emscripten_bind_btSoftBodyWorldInfo_get_water_density_0:RG,_emscripten_bind_btSoftBodyWorldInfo_get_water_normal_0:XG,_emscripten_bind_btSoftBodyWorldInfo_get_water_offset_0:bH,_emscripten_bind_btSoftBodyWorldInfo_set_air_density_1:MG,_emscripten_bind_btSoftBodyWorldInfo_set_m_broadphase_1:qB,_emscripten_bind_btSoftBodyWorldInfo_set_m_dispatcher_1:pB,_emscripten_bind_btSoftBodyWorldInfo_set_m_gravity_1:$r,_emscripten_bind_btSoftBodyWorldInfo_set_m_maxDisplacement_1:RF,_emscripten_bind_btSoftBodyWorldInfo_set_water_density_1:mG,_emscripten_bind_btSoftBodyWorldInfo_set_water_normal_1:cs,_emscripten_bind_btSoftBodyWorldInfo_set_water_offset_1:lG,_emscripten_bind_btSoftBody___destroy___0:px,_emscripten_bind_btSoftBody_activate_0:ju,_emscripten_bind_btSoftBody_activate_1:Ys,_emscripten_bind_btSoftBody_appendAnchor_4:Zf,_emscripten_bind_btSoftBody_appendFace_4:dv,_emscripten_bind_btSoftBody_appendLinearJoint_2:df,_emscripten_bind_btSoftBody_appendLink_4:cv,_emscripten_bind_btSoftBody_appendMaterial_0:gD,_emscripten_bind_btSoftBody_appendNode_2:$c,_emscripten_bind_btSoftBody_appendTetra_5:Sf,_emscripten_bind_btSoftBody_btSoftBody_4:Hs,_emscripten_bind_btSoftBody_checkFace_3:Lk,_emscripten_bind_btSoftBody_checkLink_2:Wl,_emscripten_bind_btSoftBody_forceActivationState_1:FB,_emscripten_bind_btSoftBody_generateBendingConstraints_2:_c,_emscripten_bind_btSoftBody_generateClusters_1:xz,_emscripten_bind_btSoftBody_generateClusters_2:Qx,_emscripten_bind_btSoftBody_getCollisionFlags_0:JD,_emscripten_bind_btSoftBody_getCollisionShape_0:ID,_emscripten_bind_btSoftBody_getTotalMass_0:tp,_emscripten_bind_btSoftBody_getUserIndex_0:nE,_emscripten_bind_btSoftBody_getUserPointer_0:cE,_emscripten_bind_btSoftBody_getWorldTransform_0:fF,_emscripten_bind_btSoftBody_get_m_anchors_0:kH,_emscripten_bind_btSoftBody_get_m_cfg_0:EH,_emscripten_bind_btSoftBody_get_m_faces_0:tH,_emscripten_bind_btSoftBody_get_m_links_0:sH,_emscripten_bind_btSoftBody_get_m_materials_0:aH,_emscripten_bind_btSoftBody_get_m_nodes_0:rH,_emscripten_bind_btSoftBody_isActive_0:ZA,_emscripten_bind_btSoftBody_isKinematicObject_0:Ry,_emscripten_bind_btSoftBody_isStaticObject_0:Kz,_emscripten_bind_btSoftBody_isStaticOrKinematicObject_0:tx,_emscripten_bind_btSoftBody_rotate_1:ck,_emscripten_bind_btSoftBody_scale_1:Ve,_emscripten_bind_btSoftBody_setActivationState_1:uw,_emscripten_bind_btSoftBody_setAnisotropicFriction_2:Lv,_emscripten_bind_btSoftBody_setCcdMotionThreshold_1:Oy,_emscripten_bind_btSoftBody_setCcdSweptSphereRadius_1:xy,_emscripten_bind_btSoftBody_setCollisionFlags_1:wz,_emscripten_bind_btSoftBody_setCollisionShape_1:sx,_emscripten_bind_btSoftBody_setContactProcessingThreshold_1:Uy,_emscripten_bind_btSoftBody_setFriction_1:YA,_emscripten_bind_btSoftBody_setMass_2:Ku,_emscripten_bind_btSoftBody_setRestitution_1:oA,_emscripten_bind_btSoftBody_setRollingFriction_1:Fz,_emscripten_bind_btSoftBody_setTotalMass_2:lh,_emscripten_bind_btSoftBody_setUserIndex_1:tA,_emscripten_bind_btSoftBody_setUserPointer_1:Wz,_emscripten_bind_btSoftBody_setWorldTransform_1:cy,_emscripten_bind_btSoftBody_set_m_anchors_1:xx,_emscripten_bind_btSoftBody_set_m_cfg_1:yA,_emscripten_bind_btSoftBody_set_m_faces_1:Wx,_emscripten_bind_btSoftBody_set_m_links_1:Vx,_emscripten_bind_btSoftBody_set_m_materials_1:dx,_emscripten_bind_btSoftBody_set_m_nodes_1:Ux,_emscripten_bind_btSoftBody_transform_1:sA,_emscripten_bind_btSoftBody_translate_1:em,_emscripten_bind_btSoftBody_upcast_1:JA,_emscripten_bind_btSoftRigidDynamicsWorld___destroy___0:px,_emscripten_bind_btSoftRigidDynamicsWorld_addAction_1:Jx,_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_1:Mv,_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_2:ru,_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_3:pt,_emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_1:xw,_emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_2:sv,_emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_1:Rw,_emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_3:kt,_emscripten_bind_btSoftRigidDynamicsWorld_addSoftBody_3:ij,_emscripten_bind_btSoftRigidDynamicsWorld_addVehicle_1:Vw,_emscripten_bind_btSoftRigidDynamicsWorld_btSoftRigidDynamicsWorld_5:zf,_emscripten_bind_btSoftRigidDynamicsWorld_contactPairTest_3:wt,_emscripten_bind_btSoftRigidDynamicsWorld_contactTest_2:tn,_emscripten_bind_btSoftRigidDynamicsWorld_convexSweepTest_5:Qr,_emscripten_bind_btSoftRigidDynamicsWorld_getBroadphase_0:LD,_emscripten_bind_btSoftRigidDynamicsWorld_getDispatchInfo_0:tC,_emscripten_bind_btSoftRigidDynamicsWorld_getDispatcher_0:KD,_emscripten_bind_btSoftRigidDynamicsWorld_getGravity_0:Yo,_emscripten_bind_btSoftRigidDynamicsWorld_getPairCache_0:Tz,_emscripten_bind_btSoftRigidDynamicsWorld_getSoftBodyArray_0:Ez,_emscripten_bind_btSoftRigidDynamicsWorld_getSolverInfo_0:XB,_emscripten_bind_btSoftRigidDynamicsWorld_getWorldInfo_0:LB,_emscripten_bind_btSoftRigidDynamicsWorld_rayTest_3:$u,_emscripten_bind_btSoftRigidDynamicsWorld_removeAction_1:ox,_emscripten_bind_btSoftRigidDynamicsWorld_removeCollisionObject_1:Pw,_emscripten_bind_btSoftRigidDynamicsWorld_removeConstraint_1:Bw,_emscripten_bind_btSoftRigidDynamicsWorld_removeRigidBody_1:Fw,_emscripten_bind_btSoftRigidDynamicsWorld_removeSoftBody_1:ol,_emscripten_bind_btSoftRigidDynamicsWorld_removeVehicle_1:Lw,_emscripten_bind_btSoftRigidDynamicsWorld_setGravity_1:Zw,_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_1:qv,_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_2:vu,_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_3:Bu,_emscripten_bind_btSoftRigidDynamicsWorld_updateSingleAabb_1:nx,_emscripten_bind_btSphereShape___destroy___0:px,_emscripten_bind_btSphereShape_btSphereShape_1:by,_emscripten_bind_btSphereShape_calculateLocalInertia_2:Nv,_emscripten_bind_btSphereShape_getLocalScaling_0:Oz,_emscripten_bind_btSphereShape_getMargin_0:pA,_emscripten_bind_btSphereShape_setLocalScaling_1:Cx,_emscripten_bind_btSphereShape_setMargin_1:Ay,_emscripten_bind_btStaticPlaneShape___destroy___0:px,_emscripten_bind_btStaticPlaneShape_btStaticPlaneShape_2:Vl,_emscripten_bind_btStaticPlaneShape_calculateLocalInertia_2:Nv,_emscripten_bind_btStaticPlaneShape_getLocalScaling_0:Oz,_emscripten_bind_btStaticPlaneShape_setLocalScaling_1:Cx,_emscripten_bind_btStridingMeshInterface___destroy___0:px,_emscripten_bind_btTransform___destroy___0:TD,_emscripten_bind_btTransform_btTransform_0:eI,_emscripten_bind_btTransform_btTransform_2:Iv,_emscripten_bind_btTransform_getBasis_0:qH,_emscripten_bind_btTransform_getOrigin_0:BE,_emscripten_bind_btTransform_getRotation_0:vp,_emscripten_bind_btTransform_setFromOpenGLMatrix_1:nz,_emscripten_bind_btTransform_setIdentity_0:jE,_emscripten_bind_btTransform_setOrigin_1:xA,_emscripten_bind_btTransform_setRotation_1:IA,_emscripten_bind_btTriangleMeshShape___destroy___0:px,_emscripten_bind_btTriangleMeshShape_calculateLocalInertia_2:Nv,_emscripten_bind_btTriangleMeshShape_getLocalScaling_0:Oz,_emscripten_bind_btTriangleMeshShape_setLocalScaling_1:Cx,_emscripten_bind_btTriangleMesh___destroy___0:px,_emscripten_bind_btTriangleMesh_addTriangle_3:Un,_emscripten_bind_btTriangleMesh_addTriangle_4:In,_emscripten_bind_btTriangleMesh_btTriangleMesh_0:rx,_emscripten_bind_btTriangleMesh_btTriangleMesh_1:ew,_emscripten_bind_btTriangleMesh_btTriangleMesh_2:mv,_emscripten_bind_btTypedConstraint___destroy___0:px,_emscripten_bind_btTypedConstraint_enableFeedback_1:mz,_emscripten_bind_btTypedConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btTypedConstraint_getParam_2:Rv,_emscripten_bind_btTypedConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btTypedConstraint_setParam_3:fv,_emscripten_bind_btVector3___destroy___0:QB,_emscripten_bind_btVector3_btVector3_0:UH,_emscripten_bind_btVector3_btVector3_3:vq,_emscripten_bind_btVector3_dot_1:Kt,_emscripten_bind_btVector3_length_0:wy,_emscripten_bind_btVector3_normalize_0:AF,_emscripten_bind_btVector3_op_add_1:fD,_emscripten_bind_btVector3_op_mul_1:iu,_emscripten_bind_btVector3_op_sub_1:eD,_emscripten_bind_btVector3_rotate_2:gp,_emscripten_bind_btVector3_setValue_3:hr,_emscripten_bind_btVector3_setX_1:mE,_emscripten_bind_btVector3_setY_1:lE,_emscripten_bind_btVector3_setZ_1:kE,_emscripten_bind_btVector3_x_0:ZF,_emscripten_bind_btVector3_y_0:zE,_emscripten_bind_btVector3_z_0:yE,_emscripten_bind_btVector4___destroy___0:QB,_emscripten_bind_btVector4_btVector4_0:UH,_emscripten_bind_btVector4_btVector4_4:pp,_emscripten_bind_btVector4_dot_1:Kt,_emscripten_bind_btVector4_length_0:wy,_emscripten_bind_btVector4_normalize_0:AF,_emscripten_bind_btVector4_op_add_1:fD,_emscripten_bind_btVector4_op_mul_1:iu,_emscripten_bind_btVector4_op_sub_1:eD,_emscripten_bind_btVector4_rotate_2:fp,_emscripten_bind_btVector4_setValue_4:Tp,_emscripten_bind_btVector4_setX_1:mE,_emscripten_bind_btVector4_setY_1:lE,_emscripten_bind_btVector4_setZ_1:kE,_emscripten_bind_btVector4_w_0:AE,_emscripten_bind_btVector4_x_0:ZF,_emscripten_bind_btVector4_y_0:zE,_emscripten_bind_btVector4_z_0:yE,_emscripten_bind_btVehicleRaycasterResult___destroy___0:TD,_emscripten_bind_btVehicleRaycasterResult_get_m_distFraction_0:TG,_emscripten_bind_btVehicleRaycasterResult_get_m_hitNormalInWorld_0:XG,_emscripten_bind_btVehicleRaycasterResult_get_m_hitPointInWorld_0:gJ,_emscripten_bind_btVehicleRaycasterResult_set_m_distFraction_1:RE,_emscripten_bind_btVehicleRaycasterResult_set_m_hitNormalInWorld_1:cs,_emscripten_bind_btVehicleRaycasterResult_set_m_hitPointInWorld_1:Gs,_emscripten_bind_btVehicleRaycaster___destroy___0:px,_emscripten_bind_btVehicleRaycaster_castRay_3:Pu,_emscripten_bind_btVehicleTuning_btVehicleTuning_0:Ky,_emscripten_bind_btVehicleTuning_get_m_frictionSlip_0:UG,_emscripten_bind_btVehicleTuning_get_m_maxSuspensionForce_0:SG,_emscripten_bind_btVehicleTuning_get_m_maxSuspensionTravelCm_0:VG,_emscripten_bind_btVehicleTuning_get_m_suspensionCompression_0:RG,_emscripten_bind_btVehicleTuning_get_m_suspensionDamping_0:bH,_emscripten_bind_btVehicleTuning_get_m_suspensionStiffness_0:GF,_emscripten_bind_btVehicleTuning_set_m_frictionSlip_1:bF,_emscripten_bind_btVehicleTuning_set_m_maxSuspensionForce_1:QE,_emscripten_bind_btVehicleTuning_set_m_maxSuspensionTravelCm_1:RF,_emscripten_bind_btVehicleTuning_set_m_suspensionCompression_1:mG,_emscripten_bind_btVehicleTuning_set_m_suspensionDamping_1:lG,_emscripten_bind_btVehicleTuning_set_m_suspensionStiffness_1:MG,_emscripten_bind_btWheelInfoConstructionInfo___destroy___0:TD,_emscripten_bind_btWheelInfoConstructionInfo_get_m_bIsFrontWheel_0:oB,_emscripten_bind_btWheelInfoConstructionInfo_get_m_chassisConnectionCS_0:gJ,_emscripten_bind_btWheelInfoConstructionInfo_get_m_frictionSlip_0:OF,_emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionForce_0:LG,_emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionTravelCm_0:gG,_emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionRestLength_0:HG,_emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionStiffness_0:DG,_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelAxleCS_0:iH,_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelDirectionCS_0:XG,_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelRadius_0:hG,_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingCompression_0:CG,_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingRelaxation_0:rG,_emscripten_bind_btWheelInfoConstructionInfo_set_m_bIsFrontWheel_1:Vz,_emscripten_bind_btWheelInfoConstructionInfo_set_m_chassisConnectionCS_1:Gs,_emscripten_bind_btWheelInfoConstructionInfo_set_m_frictionSlip_1:PD,_emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionForce_1:YE,_emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionTravelCm_1:eE,_emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionRestLength_1:kF,_emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionStiffness_1:FE,_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelAxleCS_1:Sr,_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelDirectionCS_1:cs,_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelRadius_1:fE,_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingCompression_1:EE,_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingRelaxation_1:rE,_emscripten_bind_btWheelInfo___destroy___0:TD,_emscripten_bind_btWheelInfo_btWheelInfo_1:$w,_emscripten_bind_btWheelInfo_getSuspensionRestLength_0:iE,_emscripten_bind_btWheelInfo_get_m_bIsFrontWheel_0:sD,_emscripten_bind_btWheelInfo_get_m_brake_0:FF,_emscripten_bind_btWheelInfo_get_m_chassisConnectionPointCS_0:lF,_emscripten_bind_btWheelInfo_get_m_clippedInvContactDotSuspension_0:gC,_emscripten_bind_btWheelInfo_get_m_deltaRotation_0:ME,_emscripten_bind_btWheelInfo_get_m_engineForce_0:eF,_emscripten_bind_btWheelInfo_get_m_frictionSlip_0:_E,_emscripten_bind_btWheelInfo_get_m_maxSuspensionForce_0:bE,_emscripten_bind_btWheelInfo_get_m_maxSuspensionTravelCm_0:HD,_emscripten_bind_btWheelInfo_get_m_raycastInfo_0:gJ,_emscripten_bind_btWheelInfo_get_m_rollInfluence_0:LE,_emscripten_bind_btWheelInfo_get_m_rotation_0:uF,_emscripten_bind_btWheelInfo_get_m_skidInfo_0:tF,_emscripten_bind_btWheelInfo_get_m_steering_0:sF,_emscripten_bind_btWheelInfo_get_m_suspensionRelativeVelocity_0:PC,_emscripten_bind_btWheelInfo_get_m_suspensionRestLength1_0:iE,_emscripten_bind_btWheelInfo_get_m_suspensionStiffness_0:UD,_emscripten_bind_btWheelInfo_get_m_wheelAxleCS_0:uG,_emscripten_bind_btWheelInfo_get_m_wheelDirectionCS_0:SF,_emscripten_bind_btWheelInfo_get_m_wheelsDampingCompression_0:_C,_emscripten_bind_btWheelInfo_get_m_wheelsDampingRelaxation_0:dD,_emscripten_bind_btWheelInfo_get_m_wheelsRadius_0:ZE,_emscripten_bind_btWheelInfo_get_m_wheelsSuspensionForce_0:GD,_emscripten_bind_btWheelInfo_get_m_worldTransform_0:MH,_emscripten_bind_btWheelInfo_set_m_bIsFrontWheel_1:tB,_emscripten_bind_btWheelInfo_set_m_brake_1:cD,_emscripten_bind_btWheelInfo_set_m_chassisConnectionPointCS_1:Jr,_emscripten_bind_btWheelInfo_set_m_clippedInvContactDotSuspension_1:jA,_emscripten_bind_btWheelInfo_set_m_deltaRotation_1:UB,_emscripten_bind_btWheelInfo_set_m_engineForce_1:rC,_emscripten_bind_btWheelInfo_set_m_frictionSlip_1:fC,_emscripten_bind_btWheelInfo_set_m_maxSuspensionForce_1:sB,_emscripten_bind_btWheelInfo_set_m_maxSuspensionTravelCm_1:gB,_emscripten_bind_btWheelInfo_set_m_raycastInfo_1:Et,_emscripten_bind_btWheelInfo_set_m_rollInfluence_1:TB,_emscripten_bind_btWheelInfo_set_m_rotation_1:OC,_emscripten_bind_btWheelInfo_set_m_skidInfo_1:NC,_emscripten_bind_btWheelInfo_set_m_steering_1:MC,_emscripten_bind_btWheelInfo_set_m_suspensionRelativeVelocity_1:dC,_emscripten_bind_btWheelInfo_set_m_suspensionRestLength1_1:fB,_emscripten_bind_btWheelInfo_set_m_suspensionStiffness_1:nB,_emscripten_bind_btWheelInfo_set_m_wheelAxleCS_1:_r,_emscripten_bind_btWheelInfo_set_m_wheelDirectionCS_1:Rr,_emscripten_bind_btWheelInfo_set_m_wheelsDampingCompression_1:PA,_emscripten_bind_btWheelInfo_set_m_wheelsDampingRelaxation_1:XA,_emscripten_bind_btWheelInfo_set_m_wheelsRadius_1:eC,_emscripten_bind_btWheelInfo_set_m_wheelsSuspensionForce_1:yC,_emscripten_bind_btWheelInfo_set_m_worldTransform_1:gA,_emscripten_bind_btWheelInfo_updateWheel_2:Zi,_emscripten_bind_tAnchorArray___destroy___0:ay,_emscripten_bind_tAnchorArray_at_1:ls,_emscripten_bind_tAnchorArray_clear_0:qC,_emscripten_bind_tAnchorArray_pop_back_0:HA,_emscripten_bind_tAnchorArray_push_back_1:Tx,_emscripten_bind_tAnchorArray_size_0:DF,_emscripten_bind_tFaceArray___destroy___0:ay,_emscripten_bind_tFaceArray_at_1:Nx,_emscripten_bind_tFaceArray_size_0:DF,_emscripten_bind_tLinkArray___destroy___0:ay,_emscripten_bind_tLinkArray_at_1:Mx,_emscripten_bind_tLinkArray_size_0:DF,_emscripten_bind_tMaterialArray___destroy___0:ay,_emscripten_bind_tMaterialArray_at_1:tw,_emscripten_bind_tMaterialArray_size_0:DF,_emscripten_bind_tNodeArray___destroy___0:ay,_emscripten_bind_tNodeArray_at_1:Lx,_emscripten_bind_tNodeArray_size_0:DF,_emscripten_enum_PHY_ScalarType_PHY_DOUBLE:RI,_emscripten_enum_PHY_ScalarType_PHY_FIXEDPOINT88:FI,_emscripten_enum_PHY_ScalarType_PHY_FLOAT:kJ,_emscripten_enum_PHY_ScalarType_PHY_INTEGER:QI,_emscripten_enum_PHY_ScalarType_PHY_SHORT:TI,_emscripten_enum_PHY_ScalarType_PHY_UCHAR:SI,_emscripten_enum_btConstraintParams_BT_CONSTRAINT_CFM:TI,_emscripten_enum_btConstraintParams_BT_CONSTRAINT_ERP:RI,_emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_CFM:FI,_emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_ERP:QI,_free:Cd,_i64Add:Ow,_i64Subtract:sw,_llvm_bswap_i16:JH,_llvm_bswap_i32:KB,_malloc:sc,_memcpy:gi,_memmove:$p,_memset:Yk,_sbrk:_o,dynCall_di:dG,dynCall_did:ED,dynCall_diidii:zv,dynCall_diii:vz,dynCall_diiidii:hu,dynCall_diiii:Yw,dynCall_diiiii:lv,dynCall_diiiiiiii:bs,dynCall_diiiiiiiii:or,dynCall_diiiiiiiiii:zq,dynCall_ii:IF,dynCall_iidid:Hx,dynCall_iii:SB,dynCall_iiid:Qz,dynCall_iiii:az,dynCall_iiiii:Jw,dynCall_iiiiii:gv,dynCall_iiiiiii:Qt,dynCall_iiiiiiiii:Yr,dynCall_iiiiiiiiiii:xq,dynCall_v:PI,dynCall_vi:eH,dynCall_vid:wE,dynCall_vidd:yB,dynCall_viddiii:Xu,dynCall_vidi:NA,dynCall_vidii:gy,dynCall_vii:DD,dynCall_viid:WA,dynCall_viidi:fy,dynCall_viidii:Xv,dynCall_viii:eA,dynCall_viiid:$x,dynCall_viiidii:Hu,dynCall_viiii:kx,dynCall_viiiid:Wv,dynCall_viiiidddddidi:fq,dynCall_viiiiddddiid:Kq,dynCall_viiiii:Ev,dynCall_viiiiid:Gu,dynCall_viiiiii:ou,dynCall_viiiiiii:ft,dynCall_viiiiiiiii:zr,dynCall_viiiiiiiiii:Nq,establishStackSpace:tG,getTempRet0:hJ,runPostSets:hI,setTempRet0:dJ,setThrew:rD,stackAlloc:rA,stackRestore:bJ,stackSave:iJ}}) + + +// EMSCRIPTEN_END_ASM +(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var __GLOBAL__sub_I_btConeTwistConstraint_cpp=Module["__GLOBAL__sub_I_btConeTwistConstraint_cpp"]=asm["__GLOBAL__sub_I_btConeTwistConstraint_cpp"];var __GLOBAL__sub_I_btQuickprof_cpp=Module["__GLOBAL__sub_I_btQuickprof_cpp"]=asm["__GLOBAL__sub_I_btQuickprof_cpp"];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 ___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_Anchor___destroy___0=Module["_emscripten_bind_Anchor___destroy___0"]=asm["_emscripten_bind_Anchor___destroy___0"];var _emscripten_bind_Anchor_get_m_body_0=Module["_emscripten_bind_Anchor_get_m_body_0"]=asm["_emscripten_bind_Anchor_get_m_body_0"];var _emscripten_bind_Anchor_get_m_c0_0=Module["_emscripten_bind_Anchor_get_m_c0_0"]=asm["_emscripten_bind_Anchor_get_m_c0_0"];var _emscripten_bind_Anchor_get_m_c1_0=Module["_emscripten_bind_Anchor_get_m_c1_0"]=asm["_emscripten_bind_Anchor_get_m_c1_0"];var _emscripten_bind_Anchor_get_m_c2_0=Module["_emscripten_bind_Anchor_get_m_c2_0"]=asm["_emscripten_bind_Anchor_get_m_c2_0"];var _emscripten_bind_Anchor_get_m_influence_0=Module["_emscripten_bind_Anchor_get_m_influence_0"]=asm["_emscripten_bind_Anchor_get_m_influence_0"];var _emscripten_bind_Anchor_get_m_local_0=Module["_emscripten_bind_Anchor_get_m_local_0"]=asm["_emscripten_bind_Anchor_get_m_local_0"];var _emscripten_bind_Anchor_get_m_node_0=Module["_emscripten_bind_Anchor_get_m_node_0"]=asm["_emscripten_bind_Anchor_get_m_node_0"];var _emscripten_bind_Anchor_set_m_body_1=Module["_emscripten_bind_Anchor_set_m_body_1"]=asm["_emscripten_bind_Anchor_set_m_body_1"];var _emscripten_bind_Anchor_set_m_c0_1=Module["_emscripten_bind_Anchor_set_m_c0_1"]=asm["_emscripten_bind_Anchor_set_m_c0_1"];var _emscripten_bind_Anchor_set_m_c1_1=Module["_emscripten_bind_Anchor_set_m_c1_1"]=asm["_emscripten_bind_Anchor_set_m_c1_1"];var _emscripten_bind_Anchor_set_m_c2_1=Module["_emscripten_bind_Anchor_set_m_c2_1"]=asm["_emscripten_bind_Anchor_set_m_c2_1"];var _emscripten_bind_Anchor_set_m_influence_1=Module["_emscripten_bind_Anchor_set_m_influence_1"]=asm["_emscripten_bind_Anchor_set_m_influence_1"];var _emscripten_bind_Anchor_set_m_local_1=Module["_emscripten_bind_Anchor_set_m_local_1"]=asm["_emscripten_bind_Anchor_set_m_local_1"];var _emscripten_bind_Anchor_set_m_node_1=Module["_emscripten_bind_Anchor_set_m_node_1"]=asm["_emscripten_bind_Anchor_set_m_node_1"];var _emscripten_bind_ClosestConvexResultCallback_ClosestConvexResultCallback_2=Module["_emscripten_bind_ClosestConvexResultCallback_ClosestConvexResultCallback_2"]=asm["_emscripten_bind_ClosestConvexResultCallback_ClosestConvexResultCallback_2"];var _emscripten_bind_ClosestConvexResultCallback___destroy___0=Module["_emscripten_bind_ClosestConvexResultCallback___destroy___0"]=asm["_emscripten_bind_ClosestConvexResultCallback___destroy___0"];var _emscripten_bind_ClosestConvexResultCallback_get_m_closestHitFraction_0=Module["_emscripten_bind_ClosestConvexResultCallback_get_m_closestHitFraction_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_get_m_closestHitFraction_0"];var _emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterGroup_0=Module["_emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterGroup_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterGroup_0"];var _emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterMask_0=Module["_emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterMask_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterMask_0"];var _emscripten_bind_ClosestConvexResultCallback_get_m_convexFromWorld_0=Module["_emscripten_bind_ClosestConvexResultCallback_get_m_convexFromWorld_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_get_m_convexFromWorld_0"];var _emscripten_bind_ClosestConvexResultCallback_get_m_convexToWorld_0=Module["_emscripten_bind_ClosestConvexResultCallback_get_m_convexToWorld_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_get_m_convexToWorld_0"];var _emscripten_bind_ClosestConvexResultCallback_get_m_hitNormalWorld_0=Module["_emscripten_bind_ClosestConvexResultCallback_get_m_hitNormalWorld_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_get_m_hitNormalWorld_0"];var _emscripten_bind_ClosestConvexResultCallback_get_m_hitPointWorld_0=Module["_emscripten_bind_ClosestConvexResultCallback_get_m_hitPointWorld_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_get_m_hitPointWorld_0"];var _emscripten_bind_ClosestConvexResultCallback_hasHit_0=Module["_emscripten_bind_ClosestConvexResultCallback_hasHit_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_hasHit_0"];var _emscripten_bind_ClosestConvexResultCallback_set_m_closestHitFraction_1=Module["_emscripten_bind_ClosestConvexResultCallback_set_m_closestHitFraction_1"]=asm["_emscripten_bind_ClosestConvexResultCallback_set_m_closestHitFraction_1"];var _emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterGroup_1=Module["_emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterGroup_1"]=asm["_emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterGroup_1"];var _emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterMask_1=Module["_emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterMask_1"]=asm["_emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterMask_1"];var _emscripten_bind_ClosestConvexResultCallback_set_m_convexFromWorld_1=Module["_emscripten_bind_ClosestConvexResultCallback_set_m_convexFromWorld_1"]=asm["_emscripten_bind_ClosestConvexResultCallback_set_m_convexFromWorld_1"];var _emscripten_bind_ClosestConvexResultCallback_set_m_convexToWorld_1=Module["_emscripten_bind_ClosestConvexResultCallback_set_m_convexToWorld_1"]=asm["_emscripten_bind_ClosestConvexResultCallback_set_m_convexToWorld_1"];var _emscripten_bind_ClosestConvexResultCallback_set_m_hitNormalWorld_1=Module["_emscripten_bind_ClosestConvexResultCallback_set_m_hitNormalWorld_1"]=asm["_emscripten_bind_ClosestConvexResultCallback_set_m_hitNormalWorld_1"];var _emscripten_bind_ClosestConvexResultCallback_set_m_hitPointWorld_1=Module["_emscripten_bind_ClosestConvexResultCallback_set_m_hitPointWorld_1"]=asm["_emscripten_bind_ClosestConvexResultCallback_set_m_hitPointWorld_1"];var _emscripten_bind_ClosestRayResultCallback_ClosestRayResultCallback_2=Module["_emscripten_bind_ClosestRayResultCallback_ClosestRayResultCallback_2"]=asm["_emscripten_bind_ClosestRayResultCallback_ClosestRayResultCallback_2"];var _emscripten_bind_ClosestRayResultCallback___destroy___0=Module["_emscripten_bind_ClosestRayResultCallback___destroy___0"]=asm["_emscripten_bind_ClosestRayResultCallback___destroy___0"];var _emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterGroup_0=Module["_emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterGroup_0"]=asm["_emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterGroup_0"];var _emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterMask_0=Module["_emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterMask_0"]=asm["_emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterMask_0"];var _emscripten_bind_ClosestRayResultCallback_get_m_collisionObject_0=Module["_emscripten_bind_ClosestRayResultCallback_get_m_collisionObject_0"]=asm["_emscripten_bind_ClosestRayResultCallback_get_m_collisionObject_0"];var _emscripten_bind_ClosestRayResultCallback_get_m_hitNormalWorld_0=Module["_emscripten_bind_ClosestRayResultCallback_get_m_hitNormalWorld_0"]=asm["_emscripten_bind_ClosestRayResultCallback_get_m_hitNormalWorld_0"];var _emscripten_bind_ClosestRayResultCallback_get_m_hitPointWorld_0=Module["_emscripten_bind_ClosestRayResultCallback_get_m_hitPointWorld_0"]=asm["_emscripten_bind_ClosestRayResultCallback_get_m_hitPointWorld_0"];var _emscripten_bind_ClosestRayResultCallback_get_m_rayFromWorld_0=Module["_emscripten_bind_ClosestRayResultCallback_get_m_rayFromWorld_0"]=asm["_emscripten_bind_ClosestRayResultCallback_get_m_rayFromWorld_0"];var _emscripten_bind_ClosestRayResultCallback_get_m_rayToWorld_0=Module["_emscripten_bind_ClosestRayResultCallback_get_m_rayToWorld_0"]=asm["_emscripten_bind_ClosestRayResultCallback_get_m_rayToWorld_0"];var _emscripten_bind_ClosestRayResultCallback_hasHit_0=Module["_emscripten_bind_ClosestRayResultCallback_hasHit_0"]=asm["_emscripten_bind_ClosestRayResultCallback_hasHit_0"];var _emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterGroup_1=Module["_emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterGroup_1"]=asm["_emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterGroup_1"];var _emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterMask_1=Module["_emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterMask_1"]=asm["_emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterMask_1"];var _emscripten_bind_ClosestRayResultCallback_set_m_collisionObject_1=Module["_emscripten_bind_ClosestRayResultCallback_set_m_collisionObject_1"]=asm["_emscripten_bind_ClosestRayResultCallback_set_m_collisionObject_1"];var _emscripten_bind_ClosestRayResultCallback_set_m_hitNormalWorld_1=Module["_emscripten_bind_ClosestRayResultCallback_set_m_hitNormalWorld_1"]=asm["_emscripten_bind_ClosestRayResultCallback_set_m_hitNormalWorld_1"];var _emscripten_bind_ClosestRayResultCallback_set_m_hitPointWorld_1=Module["_emscripten_bind_ClosestRayResultCallback_set_m_hitPointWorld_1"]=asm["_emscripten_bind_ClosestRayResultCallback_set_m_hitPointWorld_1"];var _emscripten_bind_ClosestRayResultCallback_set_m_rayFromWorld_1=Module["_emscripten_bind_ClosestRayResultCallback_set_m_rayFromWorld_1"]=asm["_emscripten_bind_ClosestRayResultCallback_set_m_rayFromWorld_1"];var _emscripten_bind_ClosestRayResultCallback_set_m_rayToWorld_1=Module["_emscripten_bind_ClosestRayResultCallback_set_m_rayToWorld_1"]=asm["_emscripten_bind_ClosestRayResultCallback_set_m_rayToWorld_1"];var _emscripten_bind_ConcreteContactResultCallback_ConcreteContactResultCallback_0=Module["_emscripten_bind_ConcreteContactResultCallback_ConcreteContactResultCallback_0"]=asm["_emscripten_bind_ConcreteContactResultCallback_ConcreteContactResultCallback_0"];var _emscripten_bind_ConcreteContactResultCallback___destroy___0=Module["_emscripten_bind_ConcreteContactResultCallback___destroy___0"]=asm["_emscripten_bind_ConcreteContactResultCallback___destroy___0"];var _emscripten_bind_ConcreteContactResultCallback_addSingleResult_7=Module["_emscripten_bind_ConcreteContactResultCallback_addSingleResult_7"]=asm["_emscripten_bind_ConcreteContactResultCallback_addSingleResult_7"];var _emscripten_bind_Config___destroy___0=Module["_emscripten_bind_Config___destroy___0"]=asm["_emscripten_bind_Config___destroy___0"];var _emscripten_bind_Config_get_citerations_0=Module["_emscripten_bind_Config_get_citerations_0"]=asm["_emscripten_bind_Config_get_citerations_0"];var _emscripten_bind_Config_get_collisions_0=Module["_emscripten_bind_Config_get_collisions_0"]=asm["_emscripten_bind_Config_get_collisions_0"];var _emscripten_bind_Config_get_diterations_0=Module["_emscripten_bind_Config_get_diterations_0"]=asm["_emscripten_bind_Config_get_diterations_0"];var _emscripten_bind_Config_get_kAHR_0=Module["_emscripten_bind_Config_get_kAHR_0"]=asm["_emscripten_bind_Config_get_kAHR_0"];var _emscripten_bind_Config_get_kCHR_0=Module["_emscripten_bind_Config_get_kCHR_0"]=asm["_emscripten_bind_Config_get_kCHR_0"];var _emscripten_bind_Config_get_kDF_0=Module["_emscripten_bind_Config_get_kDF_0"]=asm["_emscripten_bind_Config_get_kDF_0"];var _emscripten_bind_Config_get_kDG_0=Module["_emscripten_bind_Config_get_kDG_0"]=asm["_emscripten_bind_Config_get_kDG_0"];var _emscripten_bind_Config_get_kDP_0=Module["_emscripten_bind_Config_get_kDP_0"]=asm["_emscripten_bind_Config_get_kDP_0"];var _emscripten_bind_Config_get_kKHR_0=Module["_emscripten_bind_Config_get_kKHR_0"]=asm["_emscripten_bind_Config_get_kKHR_0"];var _emscripten_bind_Config_get_kLF_0=Module["_emscripten_bind_Config_get_kLF_0"]=asm["_emscripten_bind_Config_get_kLF_0"];var _emscripten_bind_Config_get_kMT_0=Module["_emscripten_bind_Config_get_kMT_0"]=asm["_emscripten_bind_Config_get_kMT_0"];var _emscripten_bind_Config_get_kPR_0=Module["_emscripten_bind_Config_get_kPR_0"]=asm["_emscripten_bind_Config_get_kPR_0"];var _emscripten_bind_Config_get_kSHR_0=Module["_emscripten_bind_Config_get_kSHR_0"]=asm["_emscripten_bind_Config_get_kSHR_0"];var _emscripten_bind_Config_get_kSKHR_CL_0=Module["_emscripten_bind_Config_get_kSKHR_CL_0"]=asm["_emscripten_bind_Config_get_kSKHR_CL_0"];var _emscripten_bind_Config_get_kSK_SPLT_CL_0=Module["_emscripten_bind_Config_get_kSK_SPLT_CL_0"]=asm["_emscripten_bind_Config_get_kSK_SPLT_CL_0"];var _emscripten_bind_Config_get_kSRHR_CL_0=Module["_emscripten_bind_Config_get_kSRHR_CL_0"]=asm["_emscripten_bind_Config_get_kSRHR_CL_0"];var _emscripten_bind_Config_get_kSR_SPLT_CL_0=Module["_emscripten_bind_Config_get_kSR_SPLT_CL_0"]=asm["_emscripten_bind_Config_get_kSR_SPLT_CL_0"];var _emscripten_bind_Config_get_kSSHR_CL_0=Module["_emscripten_bind_Config_get_kSSHR_CL_0"]=asm["_emscripten_bind_Config_get_kSSHR_CL_0"];var _emscripten_bind_Config_get_kSS_SPLT_CL_0=Module["_emscripten_bind_Config_get_kSS_SPLT_CL_0"]=asm["_emscripten_bind_Config_get_kSS_SPLT_CL_0"];var _emscripten_bind_Config_get_kVCF_0=Module["_emscripten_bind_Config_get_kVCF_0"]=asm["_emscripten_bind_Config_get_kVCF_0"];var _emscripten_bind_Config_get_kVC_0=Module["_emscripten_bind_Config_get_kVC_0"]=asm["_emscripten_bind_Config_get_kVC_0"];var _emscripten_bind_Config_get_maxvolume_0=Module["_emscripten_bind_Config_get_maxvolume_0"]=asm["_emscripten_bind_Config_get_maxvolume_0"];var _emscripten_bind_Config_get_piterations_0=Module["_emscripten_bind_Config_get_piterations_0"]=asm["_emscripten_bind_Config_get_piterations_0"];var _emscripten_bind_Config_get_timescale_0=Module["_emscripten_bind_Config_get_timescale_0"]=asm["_emscripten_bind_Config_get_timescale_0"];var _emscripten_bind_Config_get_viterations_0=Module["_emscripten_bind_Config_get_viterations_0"]=asm["_emscripten_bind_Config_get_viterations_0"];var _emscripten_bind_Config_set_citerations_1=Module["_emscripten_bind_Config_set_citerations_1"]=asm["_emscripten_bind_Config_set_citerations_1"];var _emscripten_bind_Config_set_collisions_1=Module["_emscripten_bind_Config_set_collisions_1"]=asm["_emscripten_bind_Config_set_collisions_1"];var _emscripten_bind_Config_set_diterations_1=Module["_emscripten_bind_Config_set_diterations_1"]=asm["_emscripten_bind_Config_set_diterations_1"];var _emscripten_bind_Config_set_kAHR_1=Module["_emscripten_bind_Config_set_kAHR_1"]=asm["_emscripten_bind_Config_set_kAHR_1"];var _emscripten_bind_Config_set_kCHR_1=Module["_emscripten_bind_Config_set_kCHR_1"]=asm["_emscripten_bind_Config_set_kCHR_1"];var _emscripten_bind_Config_set_kDF_1=Module["_emscripten_bind_Config_set_kDF_1"]=asm["_emscripten_bind_Config_set_kDF_1"];var _emscripten_bind_Config_set_kDG_1=Module["_emscripten_bind_Config_set_kDG_1"]=asm["_emscripten_bind_Config_set_kDG_1"];var _emscripten_bind_Config_set_kDP_1=Module["_emscripten_bind_Config_set_kDP_1"]=asm["_emscripten_bind_Config_set_kDP_1"];var _emscripten_bind_Config_set_kKHR_1=Module["_emscripten_bind_Config_set_kKHR_1"]=asm["_emscripten_bind_Config_set_kKHR_1"];var _emscripten_bind_Config_set_kLF_1=Module["_emscripten_bind_Config_set_kLF_1"]=asm["_emscripten_bind_Config_set_kLF_1"];var _emscripten_bind_Config_set_kMT_1=Module["_emscripten_bind_Config_set_kMT_1"]=asm["_emscripten_bind_Config_set_kMT_1"];var _emscripten_bind_Config_set_kPR_1=Module["_emscripten_bind_Config_set_kPR_1"]=asm["_emscripten_bind_Config_set_kPR_1"];var _emscripten_bind_Config_set_kSHR_1=Module["_emscripten_bind_Config_set_kSHR_1"]=asm["_emscripten_bind_Config_set_kSHR_1"];var _emscripten_bind_Config_set_kSKHR_CL_1=Module["_emscripten_bind_Config_set_kSKHR_CL_1"]=asm["_emscripten_bind_Config_set_kSKHR_CL_1"];var _emscripten_bind_Config_set_kSK_SPLT_CL_1=Module["_emscripten_bind_Config_set_kSK_SPLT_CL_1"]=asm["_emscripten_bind_Config_set_kSK_SPLT_CL_1"];var _emscripten_bind_Config_set_kSRHR_CL_1=Module["_emscripten_bind_Config_set_kSRHR_CL_1"]=asm["_emscripten_bind_Config_set_kSRHR_CL_1"];var _emscripten_bind_Config_set_kSR_SPLT_CL_1=Module["_emscripten_bind_Config_set_kSR_SPLT_CL_1"]=asm["_emscripten_bind_Config_set_kSR_SPLT_CL_1"];var _emscripten_bind_Config_set_kSSHR_CL_1=Module["_emscripten_bind_Config_set_kSSHR_CL_1"]=asm["_emscripten_bind_Config_set_kSSHR_CL_1"];var _emscripten_bind_Config_set_kSS_SPLT_CL_1=Module["_emscripten_bind_Config_set_kSS_SPLT_CL_1"]=asm["_emscripten_bind_Config_set_kSS_SPLT_CL_1"];var _emscripten_bind_Config_set_kVCF_1=Module["_emscripten_bind_Config_set_kVCF_1"]=asm["_emscripten_bind_Config_set_kVCF_1"];var _emscripten_bind_Config_set_kVC_1=Module["_emscripten_bind_Config_set_kVC_1"]=asm["_emscripten_bind_Config_set_kVC_1"];var _emscripten_bind_Config_set_maxvolume_1=Module["_emscripten_bind_Config_set_maxvolume_1"]=asm["_emscripten_bind_Config_set_maxvolume_1"];var _emscripten_bind_Config_set_piterations_1=Module["_emscripten_bind_Config_set_piterations_1"]=asm["_emscripten_bind_Config_set_piterations_1"];var _emscripten_bind_Config_set_timescale_1=Module["_emscripten_bind_Config_set_timescale_1"]=asm["_emscripten_bind_Config_set_timescale_1"];var _emscripten_bind_Config_set_viterations_1=Module["_emscripten_bind_Config_set_viterations_1"]=asm["_emscripten_bind_Config_set_viterations_1"];var _emscripten_bind_ContactResultCallback___destroy___0=Module["_emscripten_bind_ContactResultCallback___destroy___0"]=asm["_emscripten_bind_ContactResultCallback___destroy___0"];var _emscripten_bind_ContactResultCallback_addSingleResult_7=Module["_emscripten_bind_ContactResultCallback_addSingleResult_7"]=asm["_emscripten_bind_ContactResultCallback_addSingleResult_7"];var _emscripten_bind_ConvexResultCallback___destroy___0=Module["_emscripten_bind_ConvexResultCallback___destroy___0"]=asm["_emscripten_bind_ConvexResultCallback___destroy___0"];var _emscripten_bind_ConvexResultCallback_get_m_closestHitFraction_0=Module["_emscripten_bind_ConvexResultCallback_get_m_closestHitFraction_0"]=asm["_emscripten_bind_ConvexResultCallback_get_m_closestHitFraction_0"];var _emscripten_bind_ConvexResultCallback_get_m_collisionFilterGroup_0=Module["_emscripten_bind_ConvexResultCallback_get_m_collisionFilterGroup_0"]=asm["_emscripten_bind_ConvexResultCallback_get_m_collisionFilterGroup_0"];var _emscripten_bind_ConvexResultCallback_get_m_collisionFilterMask_0=Module["_emscripten_bind_ConvexResultCallback_get_m_collisionFilterMask_0"]=asm["_emscripten_bind_ConvexResultCallback_get_m_collisionFilterMask_0"];var _emscripten_bind_ConvexResultCallback_hasHit_0=Module["_emscripten_bind_ConvexResultCallback_hasHit_0"]=asm["_emscripten_bind_ConvexResultCallback_hasHit_0"];var _emscripten_bind_ConvexResultCallback_set_m_closestHitFraction_1=Module["_emscripten_bind_ConvexResultCallback_set_m_closestHitFraction_1"]=asm["_emscripten_bind_ConvexResultCallback_set_m_closestHitFraction_1"];var _emscripten_bind_ConvexResultCallback_set_m_collisionFilterGroup_1=Module["_emscripten_bind_ConvexResultCallback_set_m_collisionFilterGroup_1"]=asm["_emscripten_bind_ConvexResultCallback_set_m_collisionFilterGroup_1"];var _emscripten_bind_ConvexResultCallback_set_m_collisionFilterMask_1=Module["_emscripten_bind_ConvexResultCallback_set_m_collisionFilterMask_1"]=asm["_emscripten_bind_ConvexResultCallback_set_m_collisionFilterMask_1"];var _emscripten_bind_Face___destroy___0=Module["_emscripten_bind_Face___destroy___0"]=asm["_emscripten_bind_Face___destroy___0"];var _emscripten_bind_Face_get_m_n_1=Module["_emscripten_bind_Face_get_m_n_1"]=asm["_emscripten_bind_Face_get_m_n_1"];var _emscripten_bind_Face_get_m_normal_0=Module["_emscripten_bind_Face_get_m_normal_0"]=asm["_emscripten_bind_Face_get_m_normal_0"];var _emscripten_bind_Face_set_m_n_2=Module["_emscripten_bind_Face_set_m_n_2"]=asm["_emscripten_bind_Face_set_m_n_2"];var _emscripten_bind_Face_set_m_normal_1=Module["_emscripten_bind_Face_set_m_normal_1"]=asm["_emscripten_bind_Face_set_m_normal_1"];var _emscripten_bind_Joint___destroy___0=Module["_emscripten_bind_Joint___destroy___0"]=asm["_emscripten_bind_Joint___destroy___0"];var _emscripten_bind_Joint_get_m_cfm_0=Module["_emscripten_bind_Joint_get_m_cfm_0"]=asm["_emscripten_bind_Joint_get_m_cfm_0"];var _emscripten_bind_Joint_get_m_delete_0=Module["_emscripten_bind_Joint_get_m_delete_0"]=asm["_emscripten_bind_Joint_get_m_delete_0"];var _emscripten_bind_Joint_get_m_drift_0=Module["_emscripten_bind_Joint_get_m_drift_0"]=asm["_emscripten_bind_Joint_get_m_drift_0"];var _emscripten_bind_Joint_get_m_erp_0=Module["_emscripten_bind_Joint_get_m_erp_0"]=asm["_emscripten_bind_Joint_get_m_erp_0"];var _emscripten_bind_Joint_get_m_massmatrix_0=Module["_emscripten_bind_Joint_get_m_massmatrix_0"]=asm["_emscripten_bind_Joint_get_m_massmatrix_0"];var _emscripten_bind_Joint_get_m_refs_1=Module["_emscripten_bind_Joint_get_m_refs_1"]=asm["_emscripten_bind_Joint_get_m_refs_1"];var _emscripten_bind_Joint_get_m_sdrift_0=Module["_emscripten_bind_Joint_get_m_sdrift_0"]=asm["_emscripten_bind_Joint_get_m_sdrift_0"];var _emscripten_bind_Joint_get_m_split_0=Module["_emscripten_bind_Joint_get_m_split_0"]=asm["_emscripten_bind_Joint_get_m_split_0"];var _emscripten_bind_Joint_set_m_cfm_1=Module["_emscripten_bind_Joint_set_m_cfm_1"]=asm["_emscripten_bind_Joint_set_m_cfm_1"];var _emscripten_bind_Joint_set_m_delete_1=Module["_emscripten_bind_Joint_set_m_delete_1"]=asm["_emscripten_bind_Joint_set_m_delete_1"];var _emscripten_bind_Joint_set_m_drift_1=Module["_emscripten_bind_Joint_set_m_drift_1"]=asm["_emscripten_bind_Joint_set_m_drift_1"];var _emscripten_bind_Joint_set_m_erp_1=Module["_emscripten_bind_Joint_set_m_erp_1"]=asm["_emscripten_bind_Joint_set_m_erp_1"];var _emscripten_bind_Joint_set_m_massmatrix_1=Module["_emscripten_bind_Joint_set_m_massmatrix_1"]=asm["_emscripten_bind_Joint_set_m_massmatrix_1"];var _emscripten_bind_Joint_set_m_refs_2=Module["_emscripten_bind_Joint_set_m_refs_2"]=asm["_emscripten_bind_Joint_set_m_refs_2"];var _emscripten_bind_Joint_set_m_sdrift_1=Module["_emscripten_bind_Joint_set_m_sdrift_1"]=asm["_emscripten_bind_Joint_set_m_sdrift_1"];var _emscripten_bind_Joint_set_m_split_1=Module["_emscripten_bind_Joint_set_m_split_1"]=asm["_emscripten_bind_Joint_set_m_split_1"];var _emscripten_bind_LJoint___destroy___0=Module["_emscripten_bind_LJoint___destroy___0"]=asm["_emscripten_bind_LJoint___destroy___0"];var _emscripten_bind_LJoint_get_m_rpos_1=Module["_emscripten_bind_LJoint_get_m_rpos_1"]=asm["_emscripten_bind_LJoint_get_m_rpos_1"];var _emscripten_bind_LJoint_set_m_rpos_2=Module["_emscripten_bind_LJoint_set_m_rpos_2"]=asm["_emscripten_bind_LJoint_set_m_rpos_2"];var _emscripten_bind_Link___destroy___0=Module["_emscripten_bind_Link___destroy___0"]=asm["_emscripten_bind_Link___destroy___0"];var _emscripten_bind_Link_get_m_n_1=Module["_emscripten_bind_Link_get_m_n_1"]=asm["_emscripten_bind_Link_get_m_n_1"];var _emscripten_bind_Link_set_m_n_2=Module["_emscripten_bind_Link_set_m_n_2"]=asm["_emscripten_bind_Link_set_m_n_2"];var _emscripten_bind_LocalConvexResult_LocalConvexResult_5=Module["_emscripten_bind_LocalConvexResult_LocalConvexResult_5"]=asm["_emscripten_bind_LocalConvexResult_LocalConvexResult_5"];var _emscripten_bind_LocalConvexResult___destroy___0=Module["_emscripten_bind_LocalConvexResult___destroy___0"]=asm["_emscripten_bind_LocalConvexResult___destroy___0"];var _emscripten_bind_LocalConvexResult_get_m_hitCollisionObject_0=Module["_emscripten_bind_LocalConvexResult_get_m_hitCollisionObject_0"]=asm["_emscripten_bind_LocalConvexResult_get_m_hitCollisionObject_0"];var _emscripten_bind_LocalConvexResult_get_m_hitFraction_0=Module["_emscripten_bind_LocalConvexResult_get_m_hitFraction_0"]=asm["_emscripten_bind_LocalConvexResult_get_m_hitFraction_0"];var _emscripten_bind_LocalConvexResult_get_m_hitNormalLocal_0=Module["_emscripten_bind_LocalConvexResult_get_m_hitNormalLocal_0"]=asm["_emscripten_bind_LocalConvexResult_get_m_hitNormalLocal_0"];var _emscripten_bind_LocalConvexResult_get_m_hitPointLocal_0=Module["_emscripten_bind_LocalConvexResult_get_m_hitPointLocal_0"]=asm["_emscripten_bind_LocalConvexResult_get_m_hitPointLocal_0"];var _emscripten_bind_LocalConvexResult_get_m_localShapeInfo_0=Module["_emscripten_bind_LocalConvexResult_get_m_localShapeInfo_0"]=asm["_emscripten_bind_LocalConvexResult_get_m_localShapeInfo_0"];var _emscripten_bind_LocalConvexResult_set_m_hitCollisionObject_1=Module["_emscripten_bind_LocalConvexResult_set_m_hitCollisionObject_1"]=asm["_emscripten_bind_LocalConvexResult_set_m_hitCollisionObject_1"];var _emscripten_bind_LocalConvexResult_set_m_hitFraction_1=Module["_emscripten_bind_LocalConvexResult_set_m_hitFraction_1"]=asm["_emscripten_bind_LocalConvexResult_set_m_hitFraction_1"];var _emscripten_bind_LocalConvexResult_set_m_hitNormalLocal_1=Module["_emscripten_bind_LocalConvexResult_set_m_hitNormalLocal_1"]=asm["_emscripten_bind_LocalConvexResult_set_m_hitNormalLocal_1"];var _emscripten_bind_LocalConvexResult_set_m_hitPointLocal_1=Module["_emscripten_bind_LocalConvexResult_set_m_hitPointLocal_1"]=asm["_emscripten_bind_LocalConvexResult_set_m_hitPointLocal_1"];var _emscripten_bind_LocalConvexResult_set_m_localShapeInfo_1=Module["_emscripten_bind_LocalConvexResult_set_m_localShapeInfo_1"]=asm["_emscripten_bind_LocalConvexResult_set_m_localShapeInfo_1"];var _emscripten_bind_LocalShapeInfo___destroy___0=Module["_emscripten_bind_LocalShapeInfo___destroy___0"]=asm["_emscripten_bind_LocalShapeInfo___destroy___0"];var _emscripten_bind_LocalShapeInfo_get_m_shapePart_0=Module["_emscripten_bind_LocalShapeInfo_get_m_shapePart_0"]=asm["_emscripten_bind_LocalShapeInfo_get_m_shapePart_0"];var _emscripten_bind_LocalShapeInfo_get_m_triangleIndex_0=Module["_emscripten_bind_LocalShapeInfo_get_m_triangleIndex_0"]=asm["_emscripten_bind_LocalShapeInfo_get_m_triangleIndex_0"];var _emscripten_bind_LocalShapeInfo_set_m_shapePart_1=Module["_emscripten_bind_LocalShapeInfo_set_m_shapePart_1"]=asm["_emscripten_bind_LocalShapeInfo_set_m_shapePart_1"];var _emscripten_bind_LocalShapeInfo_set_m_triangleIndex_1=Module["_emscripten_bind_LocalShapeInfo_set_m_triangleIndex_1"]=asm["_emscripten_bind_LocalShapeInfo_set_m_triangleIndex_1"];var _emscripten_bind_Material___destroy___0=Module["_emscripten_bind_Material___destroy___0"]=asm["_emscripten_bind_Material___destroy___0"];var _emscripten_bind_Material_get_m_flags_0=Module["_emscripten_bind_Material_get_m_flags_0"]=asm["_emscripten_bind_Material_get_m_flags_0"];var _emscripten_bind_Material_get_m_kAST_0=Module["_emscripten_bind_Material_get_m_kAST_0"]=asm["_emscripten_bind_Material_get_m_kAST_0"];var _emscripten_bind_Material_get_m_kLST_0=Module["_emscripten_bind_Material_get_m_kLST_0"]=asm["_emscripten_bind_Material_get_m_kLST_0"];var _emscripten_bind_Material_get_m_kVST_0=Module["_emscripten_bind_Material_get_m_kVST_0"]=asm["_emscripten_bind_Material_get_m_kVST_0"];var _emscripten_bind_Material_set_m_flags_1=Module["_emscripten_bind_Material_set_m_flags_1"]=asm["_emscripten_bind_Material_set_m_flags_1"];var _emscripten_bind_Material_set_m_kAST_1=Module["_emscripten_bind_Material_set_m_kAST_1"]=asm["_emscripten_bind_Material_set_m_kAST_1"];var _emscripten_bind_Material_set_m_kLST_1=Module["_emscripten_bind_Material_set_m_kLST_1"]=asm["_emscripten_bind_Material_set_m_kLST_1"];var _emscripten_bind_Material_set_m_kVST_1=Module["_emscripten_bind_Material_set_m_kVST_1"]=asm["_emscripten_bind_Material_set_m_kVST_1"];var _emscripten_bind_Node___destroy___0=Module["_emscripten_bind_Node___destroy___0"]=asm["_emscripten_bind_Node___destroy___0"];var _emscripten_bind_Node_get_m_n_0=Module["_emscripten_bind_Node_get_m_n_0"]=asm["_emscripten_bind_Node_get_m_n_0"];var _emscripten_bind_Node_get_m_x_0=Module["_emscripten_bind_Node_get_m_x_0"]=asm["_emscripten_bind_Node_get_m_x_0"];var _emscripten_bind_Node_set_m_n_1=Module["_emscripten_bind_Node_set_m_n_1"]=asm["_emscripten_bind_Node_set_m_n_1"];var _emscripten_bind_Node_set_m_x_1=Module["_emscripten_bind_Node_set_m_x_1"]=asm["_emscripten_bind_Node_set_m_x_1"];var _emscripten_bind_RayResultCallback___destroy___0=Module["_emscripten_bind_RayResultCallback___destroy___0"]=asm["_emscripten_bind_RayResultCallback___destroy___0"];var _emscripten_bind_RayResultCallback_get_m_collisionFilterGroup_0=Module["_emscripten_bind_RayResultCallback_get_m_collisionFilterGroup_0"]=asm["_emscripten_bind_RayResultCallback_get_m_collisionFilterGroup_0"];var _emscripten_bind_RayResultCallback_get_m_collisionFilterMask_0=Module["_emscripten_bind_RayResultCallback_get_m_collisionFilterMask_0"]=asm["_emscripten_bind_RayResultCallback_get_m_collisionFilterMask_0"];var _emscripten_bind_RayResultCallback_get_m_collisionObject_0=Module["_emscripten_bind_RayResultCallback_get_m_collisionObject_0"]=asm["_emscripten_bind_RayResultCallback_get_m_collisionObject_0"];var _emscripten_bind_RayResultCallback_hasHit_0=Module["_emscripten_bind_RayResultCallback_hasHit_0"]=asm["_emscripten_bind_RayResultCallback_hasHit_0"];var _emscripten_bind_RayResultCallback_set_m_collisionFilterGroup_1=Module["_emscripten_bind_RayResultCallback_set_m_collisionFilterGroup_1"]=asm["_emscripten_bind_RayResultCallback_set_m_collisionFilterGroup_1"];var _emscripten_bind_RayResultCallback_set_m_collisionFilterMask_1=Module["_emscripten_bind_RayResultCallback_set_m_collisionFilterMask_1"]=asm["_emscripten_bind_RayResultCallback_set_m_collisionFilterMask_1"];var _emscripten_bind_RayResultCallback_set_m_collisionObject_1=Module["_emscripten_bind_RayResultCallback_set_m_collisionObject_1"]=asm["_emscripten_bind_RayResultCallback_set_m_collisionObject_1"];var _emscripten_bind_RaycastInfo___destroy___0=Module["_emscripten_bind_RaycastInfo___destroy___0"]=asm["_emscripten_bind_RaycastInfo___destroy___0"];var _emscripten_bind_RaycastInfo_get_m_contactNormalWS_0=Module["_emscripten_bind_RaycastInfo_get_m_contactNormalWS_0"]=asm["_emscripten_bind_RaycastInfo_get_m_contactNormalWS_0"];var _emscripten_bind_RaycastInfo_get_m_contactPointWS_0=Module["_emscripten_bind_RaycastInfo_get_m_contactPointWS_0"]=asm["_emscripten_bind_RaycastInfo_get_m_contactPointWS_0"];var _emscripten_bind_RaycastInfo_get_m_groundObject_0=Module["_emscripten_bind_RaycastInfo_get_m_groundObject_0"]=asm["_emscripten_bind_RaycastInfo_get_m_groundObject_0"];var _emscripten_bind_RaycastInfo_get_m_hardPointWS_0=Module["_emscripten_bind_RaycastInfo_get_m_hardPointWS_0"]=asm["_emscripten_bind_RaycastInfo_get_m_hardPointWS_0"];var _emscripten_bind_RaycastInfo_get_m_isInContact_0=Module["_emscripten_bind_RaycastInfo_get_m_isInContact_0"]=asm["_emscripten_bind_RaycastInfo_get_m_isInContact_0"];var _emscripten_bind_RaycastInfo_get_m_suspensionLength_0=Module["_emscripten_bind_RaycastInfo_get_m_suspensionLength_0"]=asm["_emscripten_bind_RaycastInfo_get_m_suspensionLength_0"];var _emscripten_bind_RaycastInfo_get_m_wheelAxleWS_0=Module["_emscripten_bind_RaycastInfo_get_m_wheelAxleWS_0"]=asm["_emscripten_bind_RaycastInfo_get_m_wheelAxleWS_0"];var _emscripten_bind_RaycastInfo_get_m_wheelDirectionWS_0=Module["_emscripten_bind_RaycastInfo_get_m_wheelDirectionWS_0"]=asm["_emscripten_bind_RaycastInfo_get_m_wheelDirectionWS_0"];var _emscripten_bind_RaycastInfo_set_m_contactNormalWS_1=Module["_emscripten_bind_RaycastInfo_set_m_contactNormalWS_1"]=asm["_emscripten_bind_RaycastInfo_set_m_contactNormalWS_1"];var _emscripten_bind_RaycastInfo_set_m_contactPointWS_1=Module["_emscripten_bind_RaycastInfo_set_m_contactPointWS_1"]=asm["_emscripten_bind_RaycastInfo_set_m_contactPointWS_1"];var _emscripten_bind_RaycastInfo_set_m_groundObject_1=Module["_emscripten_bind_RaycastInfo_set_m_groundObject_1"]=asm["_emscripten_bind_RaycastInfo_set_m_groundObject_1"];var _emscripten_bind_RaycastInfo_set_m_hardPointWS_1=Module["_emscripten_bind_RaycastInfo_set_m_hardPointWS_1"]=asm["_emscripten_bind_RaycastInfo_set_m_hardPointWS_1"];var _emscripten_bind_RaycastInfo_set_m_isInContact_1=Module["_emscripten_bind_RaycastInfo_set_m_isInContact_1"]=asm["_emscripten_bind_RaycastInfo_set_m_isInContact_1"];var _emscripten_bind_RaycastInfo_set_m_suspensionLength_1=Module["_emscripten_bind_RaycastInfo_set_m_suspensionLength_1"]=asm["_emscripten_bind_RaycastInfo_set_m_suspensionLength_1"];var _emscripten_bind_RaycastInfo_set_m_wheelAxleWS_1=Module["_emscripten_bind_RaycastInfo_set_m_wheelAxleWS_1"]=asm["_emscripten_bind_RaycastInfo_set_m_wheelAxleWS_1"];var _emscripten_bind_RaycastInfo_set_m_wheelDirectionWS_1=Module["_emscripten_bind_RaycastInfo_set_m_wheelDirectionWS_1"]=asm["_emscripten_bind_RaycastInfo_set_m_wheelDirectionWS_1"];var _emscripten_bind_Specs___destroy___0=Module["_emscripten_bind_Specs___destroy___0"]=asm["_emscripten_bind_Specs___destroy___0"];var _emscripten_bind_Specs_get_position_0=Module["_emscripten_bind_Specs_get_position_0"]=asm["_emscripten_bind_Specs_get_position_0"];var _emscripten_bind_Specs_set_position_1=Module["_emscripten_bind_Specs_set_position_1"]=asm["_emscripten_bind_Specs_set_position_1"];var _emscripten_bind_VoidPtr___destroy___0=Module["_emscripten_bind_VoidPtr___destroy___0"]=asm["_emscripten_bind_VoidPtr___destroy___0"];var _emscripten_bind_btActionInterface___destroy___0=Module["_emscripten_bind_btActionInterface___destroy___0"]=asm["_emscripten_bind_btActionInterface___destroy___0"];var _emscripten_bind_btActionInterface_updateAction_2=Module["_emscripten_bind_btActionInterface_updateAction_2"]=asm["_emscripten_bind_btActionInterface_updateAction_2"];var _emscripten_bind_btAxisSweep3___destroy___0=Module["_emscripten_bind_btAxisSweep3___destroy___0"]=asm["_emscripten_bind_btAxisSweep3___destroy___0"];var _emscripten_bind_btAxisSweep3_btAxisSweep3_2=Module["_emscripten_bind_btAxisSweep3_btAxisSweep3_2"]=asm["_emscripten_bind_btAxisSweep3_btAxisSweep3_2"];var _emscripten_bind_btAxisSweep3_btAxisSweep3_3=Module["_emscripten_bind_btAxisSweep3_btAxisSweep3_3"]=asm["_emscripten_bind_btAxisSweep3_btAxisSweep3_3"];var _emscripten_bind_btAxisSweep3_btAxisSweep3_4=Module["_emscripten_bind_btAxisSweep3_btAxisSweep3_4"]=asm["_emscripten_bind_btAxisSweep3_btAxisSweep3_4"];var _emscripten_bind_btAxisSweep3_btAxisSweep3_5=Module["_emscripten_bind_btAxisSweep3_btAxisSweep3_5"]=asm["_emscripten_bind_btAxisSweep3_btAxisSweep3_5"];var _emscripten_bind_btBoxShape___destroy___0=Module["_emscripten_bind_btBoxShape___destroy___0"]=asm["_emscripten_bind_btBoxShape___destroy___0"];var _emscripten_bind_btBoxShape_btBoxShape_1=Module["_emscripten_bind_btBoxShape_btBoxShape_1"]=asm["_emscripten_bind_btBoxShape_btBoxShape_1"];var _emscripten_bind_btBoxShape_calculateLocalInertia_2=Module["_emscripten_bind_btBoxShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btBoxShape_calculateLocalInertia_2"];var _emscripten_bind_btBoxShape_getLocalScaling_0=Module["_emscripten_bind_btBoxShape_getLocalScaling_0"]=asm["_emscripten_bind_btBoxShape_getLocalScaling_0"];var _emscripten_bind_btBoxShape_getMargin_0=Module["_emscripten_bind_btBoxShape_getMargin_0"]=asm["_emscripten_bind_btBoxShape_getMargin_0"];var _emscripten_bind_btBoxShape_setLocalScaling_1=Module["_emscripten_bind_btBoxShape_setLocalScaling_1"]=asm["_emscripten_bind_btBoxShape_setLocalScaling_1"];var _emscripten_bind_btBoxShape_setMargin_1=Module["_emscripten_bind_btBoxShape_setMargin_1"]=asm["_emscripten_bind_btBoxShape_setMargin_1"];var _emscripten_bind_btBroadphaseInterface___destroy___0=Module["_emscripten_bind_btBroadphaseInterface___destroy___0"]=asm["_emscripten_bind_btBroadphaseInterface___destroy___0"];var _emscripten_bind_btBvhTriangleMeshShape___destroy___0=Module["_emscripten_bind_btBvhTriangleMeshShape___destroy___0"]=asm["_emscripten_bind_btBvhTriangleMeshShape___destroy___0"];var _emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_2=Module["_emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_2"]=asm["_emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_2"];var _emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_3=Module["_emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_3"]=asm["_emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_3"];var _emscripten_bind_btBvhTriangleMeshShape_calculateLocalInertia_2=Module["_emscripten_bind_btBvhTriangleMeshShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btBvhTriangleMeshShape_calculateLocalInertia_2"];var _emscripten_bind_btBvhTriangleMeshShape_getLocalScaling_0=Module["_emscripten_bind_btBvhTriangleMeshShape_getLocalScaling_0"]=asm["_emscripten_bind_btBvhTriangleMeshShape_getLocalScaling_0"];var _emscripten_bind_btBvhTriangleMeshShape_setLocalScaling_1=Module["_emscripten_bind_btBvhTriangleMeshShape_setLocalScaling_1"]=asm["_emscripten_bind_btBvhTriangleMeshShape_setLocalScaling_1"];var _emscripten_bind_btCapsuleShapeX___destroy___0=Module["_emscripten_bind_btCapsuleShapeX___destroy___0"]=asm["_emscripten_bind_btCapsuleShapeX___destroy___0"];var _emscripten_bind_btCapsuleShapeX_btCapsuleShapeX_2=Module["_emscripten_bind_btCapsuleShapeX_btCapsuleShapeX_2"]=asm["_emscripten_bind_btCapsuleShapeX_btCapsuleShapeX_2"];var _emscripten_bind_btCapsuleShapeX_calculateLocalInertia_2=Module["_emscripten_bind_btCapsuleShapeX_calculateLocalInertia_2"]=asm["_emscripten_bind_btCapsuleShapeX_calculateLocalInertia_2"];var _emscripten_bind_btCapsuleShapeX_getHalfHeight_0=Module["_emscripten_bind_btCapsuleShapeX_getHalfHeight_0"]=asm["_emscripten_bind_btCapsuleShapeX_getHalfHeight_0"];var _emscripten_bind_btCapsuleShapeX_getLocalScaling_0=Module["_emscripten_bind_btCapsuleShapeX_getLocalScaling_0"]=asm["_emscripten_bind_btCapsuleShapeX_getLocalScaling_0"];var _emscripten_bind_btCapsuleShapeX_getMargin_0=Module["_emscripten_bind_btCapsuleShapeX_getMargin_0"]=asm["_emscripten_bind_btCapsuleShapeX_getMargin_0"];var _emscripten_bind_btCapsuleShapeX_getRadius_0=Module["_emscripten_bind_btCapsuleShapeX_getRadius_0"]=asm["_emscripten_bind_btCapsuleShapeX_getRadius_0"];var _emscripten_bind_btCapsuleShapeX_getUpAxis_0=Module["_emscripten_bind_btCapsuleShapeX_getUpAxis_0"]=asm["_emscripten_bind_btCapsuleShapeX_getUpAxis_0"];var _emscripten_bind_btCapsuleShapeX_setLocalScaling_1=Module["_emscripten_bind_btCapsuleShapeX_setLocalScaling_1"]=asm["_emscripten_bind_btCapsuleShapeX_setLocalScaling_1"];var _emscripten_bind_btCapsuleShapeX_setMargin_1=Module["_emscripten_bind_btCapsuleShapeX_setMargin_1"]=asm["_emscripten_bind_btCapsuleShapeX_setMargin_1"];var _emscripten_bind_btCapsuleShapeZ___destroy___0=Module["_emscripten_bind_btCapsuleShapeZ___destroy___0"]=asm["_emscripten_bind_btCapsuleShapeZ___destroy___0"];var _emscripten_bind_btCapsuleShapeZ_btCapsuleShapeZ_2=Module["_emscripten_bind_btCapsuleShapeZ_btCapsuleShapeZ_2"]=asm["_emscripten_bind_btCapsuleShapeZ_btCapsuleShapeZ_2"];var _emscripten_bind_btCapsuleShapeZ_calculateLocalInertia_2=Module["_emscripten_bind_btCapsuleShapeZ_calculateLocalInertia_2"]=asm["_emscripten_bind_btCapsuleShapeZ_calculateLocalInertia_2"];var _emscripten_bind_btCapsuleShapeZ_getHalfHeight_0=Module["_emscripten_bind_btCapsuleShapeZ_getHalfHeight_0"]=asm["_emscripten_bind_btCapsuleShapeZ_getHalfHeight_0"];var _emscripten_bind_btCapsuleShapeZ_getLocalScaling_0=Module["_emscripten_bind_btCapsuleShapeZ_getLocalScaling_0"]=asm["_emscripten_bind_btCapsuleShapeZ_getLocalScaling_0"];var _emscripten_bind_btCapsuleShapeZ_getMargin_0=Module["_emscripten_bind_btCapsuleShapeZ_getMargin_0"]=asm["_emscripten_bind_btCapsuleShapeZ_getMargin_0"];var _emscripten_bind_btCapsuleShapeZ_getRadius_0=Module["_emscripten_bind_btCapsuleShapeZ_getRadius_0"]=asm["_emscripten_bind_btCapsuleShapeZ_getRadius_0"];var _emscripten_bind_btCapsuleShapeZ_getUpAxis_0=Module["_emscripten_bind_btCapsuleShapeZ_getUpAxis_0"]=asm["_emscripten_bind_btCapsuleShapeZ_getUpAxis_0"];var _emscripten_bind_btCapsuleShapeZ_setLocalScaling_1=Module["_emscripten_bind_btCapsuleShapeZ_setLocalScaling_1"]=asm["_emscripten_bind_btCapsuleShapeZ_setLocalScaling_1"];var _emscripten_bind_btCapsuleShapeZ_setMargin_1=Module["_emscripten_bind_btCapsuleShapeZ_setMargin_1"]=asm["_emscripten_bind_btCapsuleShapeZ_setMargin_1"];var _emscripten_bind_btCapsuleShape___destroy___0=Module["_emscripten_bind_btCapsuleShape___destroy___0"]=asm["_emscripten_bind_btCapsuleShape___destroy___0"];var _emscripten_bind_btCapsuleShape_btCapsuleShape_2=Module["_emscripten_bind_btCapsuleShape_btCapsuleShape_2"]=asm["_emscripten_bind_btCapsuleShape_btCapsuleShape_2"];var _emscripten_bind_btCapsuleShape_calculateLocalInertia_2=Module["_emscripten_bind_btCapsuleShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btCapsuleShape_calculateLocalInertia_2"];var _emscripten_bind_btCapsuleShape_getHalfHeight_0=Module["_emscripten_bind_btCapsuleShape_getHalfHeight_0"]=asm["_emscripten_bind_btCapsuleShape_getHalfHeight_0"];var _emscripten_bind_btCapsuleShape_getLocalScaling_0=Module["_emscripten_bind_btCapsuleShape_getLocalScaling_0"]=asm["_emscripten_bind_btCapsuleShape_getLocalScaling_0"];var _emscripten_bind_btCapsuleShape_getMargin_0=Module["_emscripten_bind_btCapsuleShape_getMargin_0"]=asm["_emscripten_bind_btCapsuleShape_getMargin_0"];var _emscripten_bind_btCapsuleShape_getRadius_0=Module["_emscripten_bind_btCapsuleShape_getRadius_0"]=asm["_emscripten_bind_btCapsuleShape_getRadius_0"];var _emscripten_bind_btCapsuleShape_getUpAxis_0=Module["_emscripten_bind_btCapsuleShape_getUpAxis_0"]=asm["_emscripten_bind_btCapsuleShape_getUpAxis_0"];var _emscripten_bind_btCapsuleShape_setLocalScaling_1=Module["_emscripten_bind_btCapsuleShape_setLocalScaling_1"]=asm["_emscripten_bind_btCapsuleShape_setLocalScaling_1"];var _emscripten_bind_btCapsuleShape_setMargin_1=Module["_emscripten_bind_btCapsuleShape_setMargin_1"]=asm["_emscripten_bind_btCapsuleShape_setMargin_1"];var _emscripten_bind_btCollisionConfiguration___destroy___0=Module["_emscripten_bind_btCollisionConfiguration___destroy___0"]=asm["_emscripten_bind_btCollisionConfiguration___destroy___0"];var _emscripten_bind_btCollisionDispatcher___destroy___0=Module["_emscripten_bind_btCollisionDispatcher___destroy___0"]=asm["_emscripten_bind_btCollisionDispatcher___destroy___0"];var _emscripten_bind_btCollisionDispatcher_btCollisionDispatcher_1=Module["_emscripten_bind_btCollisionDispatcher_btCollisionDispatcher_1"]=asm["_emscripten_bind_btCollisionDispatcher_btCollisionDispatcher_1"];var _emscripten_bind_btCollisionDispatcher_getManifoldByIndexInternal_1=Module["_emscripten_bind_btCollisionDispatcher_getManifoldByIndexInternal_1"]=asm["_emscripten_bind_btCollisionDispatcher_getManifoldByIndexInternal_1"];var _emscripten_bind_btCollisionDispatcher_getNumManifolds_0=Module["_emscripten_bind_btCollisionDispatcher_getNumManifolds_0"]=asm["_emscripten_bind_btCollisionDispatcher_getNumManifolds_0"];var _emscripten_bind_btCollisionObject___destroy___0=Module["_emscripten_bind_btCollisionObject___destroy___0"]=asm["_emscripten_bind_btCollisionObject___destroy___0"];var _emscripten_bind_btCollisionObject_activate_0=Module["_emscripten_bind_btCollisionObject_activate_0"]=asm["_emscripten_bind_btCollisionObject_activate_0"];var _emscripten_bind_btCollisionObject_activate_1=Module["_emscripten_bind_btCollisionObject_activate_1"]=asm["_emscripten_bind_btCollisionObject_activate_1"];var _emscripten_bind_btCollisionObject_forceActivationState_1=Module["_emscripten_bind_btCollisionObject_forceActivationState_1"]=asm["_emscripten_bind_btCollisionObject_forceActivationState_1"];var _emscripten_bind_btCollisionObject_getCollisionFlags_0=Module["_emscripten_bind_btCollisionObject_getCollisionFlags_0"]=asm["_emscripten_bind_btCollisionObject_getCollisionFlags_0"];var _emscripten_bind_btCollisionObject_getCollisionShape_0=Module["_emscripten_bind_btCollisionObject_getCollisionShape_0"]=asm["_emscripten_bind_btCollisionObject_getCollisionShape_0"];var _emscripten_bind_btCollisionObject_getUserIndex_0=Module["_emscripten_bind_btCollisionObject_getUserIndex_0"]=asm["_emscripten_bind_btCollisionObject_getUserIndex_0"];var _emscripten_bind_btCollisionObject_getUserPointer_0=Module["_emscripten_bind_btCollisionObject_getUserPointer_0"]=asm["_emscripten_bind_btCollisionObject_getUserPointer_0"];var _emscripten_bind_btCollisionObject_getWorldTransform_0=Module["_emscripten_bind_btCollisionObject_getWorldTransform_0"]=asm["_emscripten_bind_btCollisionObject_getWorldTransform_0"];var _emscripten_bind_btCollisionObject_isActive_0=Module["_emscripten_bind_btCollisionObject_isActive_0"]=asm["_emscripten_bind_btCollisionObject_isActive_0"];var _emscripten_bind_btCollisionObject_isKinematicObject_0=Module["_emscripten_bind_btCollisionObject_isKinematicObject_0"]=asm["_emscripten_bind_btCollisionObject_isKinematicObject_0"];var _emscripten_bind_btCollisionObject_isStaticObject_0=Module["_emscripten_bind_btCollisionObject_isStaticObject_0"]=asm["_emscripten_bind_btCollisionObject_isStaticObject_0"];var _emscripten_bind_btCollisionObject_isStaticOrKinematicObject_0=Module["_emscripten_bind_btCollisionObject_isStaticOrKinematicObject_0"]=asm["_emscripten_bind_btCollisionObject_isStaticOrKinematicObject_0"];var _emscripten_bind_btCollisionObject_setActivationState_1=Module["_emscripten_bind_btCollisionObject_setActivationState_1"]=asm["_emscripten_bind_btCollisionObject_setActivationState_1"];var _emscripten_bind_btCollisionObject_setAnisotropicFriction_2=Module["_emscripten_bind_btCollisionObject_setAnisotropicFriction_2"]=asm["_emscripten_bind_btCollisionObject_setAnisotropicFriction_2"];var _emscripten_bind_btCollisionObject_setCcdMotionThreshold_1=Module["_emscripten_bind_btCollisionObject_setCcdMotionThreshold_1"]=asm["_emscripten_bind_btCollisionObject_setCcdMotionThreshold_1"];var _emscripten_bind_btCollisionObject_setCcdSweptSphereRadius_1=Module["_emscripten_bind_btCollisionObject_setCcdSweptSphereRadius_1"]=asm["_emscripten_bind_btCollisionObject_setCcdSweptSphereRadius_1"];var _emscripten_bind_btCollisionObject_setCollisionFlags_1=Module["_emscripten_bind_btCollisionObject_setCollisionFlags_1"]=asm["_emscripten_bind_btCollisionObject_setCollisionFlags_1"];var _emscripten_bind_btCollisionObject_setCollisionShape_1=Module["_emscripten_bind_btCollisionObject_setCollisionShape_1"]=asm["_emscripten_bind_btCollisionObject_setCollisionShape_1"];var _emscripten_bind_btCollisionObject_setContactProcessingThreshold_1=Module["_emscripten_bind_btCollisionObject_setContactProcessingThreshold_1"]=asm["_emscripten_bind_btCollisionObject_setContactProcessingThreshold_1"];var _emscripten_bind_btCollisionObject_setFriction_1=Module["_emscripten_bind_btCollisionObject_setFriction_1"]=asm["_emscripten_bind_btCollisionObject_setFriction_1"];var _emscripten_bind_btCollisionObject_setRestitution_1=Module["_emscripten_bind_btCollisionObject_setRestitution_1"]=asm["_emscripten_bind_btCollisionObject_setRestitution_1"];var _emscripten_bind_btCollisionObject_setRollingFriction_1=Module["_emscripten_bind_btCollisionObject_setRollingFriction_1"]=asm["_emscripten_bind_btCollisionObject_setRollingFriction_1"];var _emscripten_bind_btCollisionObject_setUserIndex_1=Module["_emscripten_bind_btCollisionObject_setUserIndex_1"]=asm["_emscripten_bind_btCollisionObject_setUserIndex_1"];var _emscripten_bind_btCollisionObject_setUserPointer_1=Module["_emscripten_bind_btCollisionObject_setUserPointer_1"]=asm["_emscripten_bind_btCollisionObject_setUserPointer_1"];var _emscripten_bind_btCollisionObject_setWorldTransform_1=Module["_emscripten_bind_btCollisionObject_setWorldTransform_1"]=asm["_emscripten_bind_btCollisionObject_setWorldTransform_1"];var _emscripten_bind_btCollisionShape___destroy___0=Module["_emscripten_bind_btCollisionShape___destroy___0"]=asm["_emscripten_bind_btCollisionShape___destroy___0"];var _emscripten_bind_btCollisionShape_calculateLocalInertia_2=Module["_emscripten_bind_btCollisionShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btCollisionShape_calculateLocalInertia_2"];var _emscripten_bind_btCollisionShape_getLocalScaling_0=Module["_emscripten_bind_btCollisionShape_getLocalScaling_0"]=asm["_emscripten_bind_btCollisionShape_getLocalScaling_0"];var _emscripten_bind_btCollisionShape_getMargin_0=Module["_emscripten_bind_btCollisionShape_getMargin_0"]=asm["_emscripten_bind_btCollisionShape_getMargin_0"];var _emscripten_bind_btCollisionShape_setLocalScaling_1=Module["_emscripten_bind_btCollisionShape_setLocalScaling_1"]=asm["_emscripten_bind_btCollisionShape_setLocalScaling_1"];var _emscripten_bind_btCollisionShape_setMargin_1=Module["_emscripten_bind_btCollisionShape_setMargin_1"]=asm["_emscripten_bind_btCollisionShape_setMargin_1"];var _emscripten_bind_btCollisionWorld___destroy___0=Module["_emscripten_bind_btCollisionWorld___destroy___0"]=asm["_emscripten_bind_btCollisionWorld___destroy___0"];var _emscripten_bind_btCollisionWorld_addCollisionObject_1=Module["_emscripten_bind_btCollisionWorld_addCollisionObject_1"]=asm["_emscripten_bind_btCollisionWorld_addCollisionObject_1"];var _emscripten_bind_btCollisionWorld_addCollisionObject_2=Module["_emscripten_bind_btCollisionWorld_addCollisionObject_2"]=asm["_emscripten_bind_btCollisionWorld_addCollisionObject_2"];var _emscripten_bind_btCollisionWorld_addCollisionObject_3=Module["_emscripten_bind_btCollisionWorld_addCollisionObject_3"]=asm["_emscripten_bind_btCollisionWorld_addCollisionObject_3"];var _emscripten_bind_btCollisionWorld_contactPairTest_3=Module["_emscripten_bind_btCollisionWorld_contactPairTest_3"]=asm["_emscripten_bind_btCollisionWorld_contactPairTest_3"];var _emscripten_bind_btCollisionWorld_contactTest_2=Module["_emscripten_bind_btCollisionWorld_contactTest_2"]=asm["_emscripten_bind_btCollisionWorld_contactTest_2"];var _emscripten_bind_btCollisionWorld_convexSweepTest_5=Module["_emscripten_bind_btCollisionWorld_convexSweepTest_5"]=asm["_emscripten_bind_btCollisionWorld_convexSweepTest_5"];var _emscripten_bind_btCollisionWorld_getBroadphase_0=Module["_emscripten_bind_btCollisionWorld_getBroadphase_0"]=asm["_emscripten_bind_btCollisionWorld_getBroadphase_0"];var _emscripten_bind_btCollisionWorld_getDispatchInfo_0=Module["_emscripten_bind_btCollisionWorld_getDispatchInfo_0"]=asm["_emscripten_bind_btCollisionWorld_getDispatchInfo_0"];var _emscripten_bind_btCollisionWorld_getDispatcher_0=Module["_emscripten_bind_btCollisionWorld_getDispatcher_0"]=asm["_emscripten_bind_btCollisionWorld_getDispatcher_0"];var _emscripten_bind_btCollisionWorld_getPairCache_0=Module["_emscripten_bind_btCollisionWorld_getPairCache_0"]=asm["_emscripten_bind_btCollisionWorld_getPairCache_0"];var _emscripten_bind_btCollisionWorld_rayTest_3=Module["_emscripten_bind_btCollisionWorld_rayTest_3"]=asm["_emscripten_bind_btCollisionWorld_rayTest_3"];var _emscripten_bind_btCollisionWorld_removeCollisionObject_1=Module["_emscripten_bind_btCollisionWorld_removeCollisionObject_1"]=asm["_emscripten_bind_btCollisionWorld_removeCollisionObject_1"];var _emscripten_bind_btCollisionWorld_updateSingleAabb_1=Module["_emscripten_bind_btCollisionWorld_updateSingleAabb_1"]=asm["_emscripten_bind_btCollisionWorld_updateSingleAabb_1"];var _emscripten_bind_btCompoundShape___destroy___0=Module["_emscripten_bind_btCompoundShape___destroy___0"]=asm["_emscripten_bind_btCompoundShape___destroy___0"];var _emscripten_bind_btCompoundShape_addChildShape_2=Module["_emscripten_bind_btCompoundShape_addChildShape_2"]=asm["_emscripten_bind_btCompoundShape_addChildShape_2"];var _emscripten_bind_btCompoundShape_btCompoundShape_0=Module["_emscripten_bind_btCompoundShape_btCompoundShape_0"]=asm["_emscripten_bind_btCompoundShape_btCompoundShape_0"];var _emscripten_bind_btCompoundShape_btCompoundShape_1=Module["_emscripten_bind_btCompoundShape_btCompoundShape_1"]=asm["_emscripten_bind_btCompoundShape_btCompoundShape_1"];var _emscripten_bind_btCompoundShape_calculateLocalInertia_2=Module["_emscripten_bind_btCompoundShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btCompoundShape_calculateLocalInertia_2"];var _emscripten_bind_btCompoundShape_getChildShape_1=Module["_emscripten_bind_btCompoundShape_getChildShape_1"]=asm["_emscripten_bind_btCompoundShape_getChildShape_1"];var _emscripten_bind_btCompoundShape_getLocalScaling_0=Module["_emscripten_bind_btCompoundShape_getLocalScaling_0"]=asm["_emscripten_bind_btCompoundShape_getLocalScaling_0"];var _emscripten_bind_btCompoundShape_getMargin_0=Module["_emscripten_bind_btCompoundShape_getMargin_0"]=asm["_emscripten_bind_btCompoundShape_getMargin_0"];var _emscripten_bind_btCompoundShape_getNumChildShapes_0=Module["_emscripten_bind_btCompoundShape_getNumChildShapes_0"]=asm["_emscripten_bind_btCompoundShape_getNumChildShapes_0"];var _emscripten_bind_btCompoundShape_removeChildShapeByIndex_1=Module["_emscripten_bind_btCompoundShape_removeChildShapeByIndex_1"]=asm["_emscripten_bind_btCompoundShape_removeChildShapeByIndex_1"];var _emscripten_bind_btCompoundShape_setLocalScaling_1=Module["_emscripten_bind_btCompoundShape_setLocalScaling_1"]=asm["_emscripten_bind_btCompoundShape_setLocalScaling_1"];var _emscripten_bind_btCompoundShape_setMargin_1=Module["_emscripten_bind_btCompoundShape_setMargin_1"]=asm["_emscripten_bind_btCompoundShape_setMargin_1"];var _emscripten_bind_btConcaveShape___destroy___0=Module["_emscripten_bind_btConcaveShape___destroy___0"]=asm["_emscripten_bind_btConcaveShape___destroy___0"];var _emscripten_bind_btConcaveShape_calculateLocalInertia_2=Module["_emscripten_bind_btConcaveShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btConcaveShape_calculateLocalInertia_2"];var _emscripten_bind_btConcaveShape_getLocalScaling_0=Module["_emscripten_bind_btConcaveShape_getLocalScaling_0"]=asm["_emscripten_bind_btConcaveShape_getLocalScaling_0"];var _emscripten_bind_btConcaveShape_setLocalScaling_1=Module["_emscripten_bind_btConcaveShape_setLocalScaling_1"]=asm["_emscripten_bind_btConcaveShape_setLocalScaling_1"];var _emscripten_bind_btConeShapeX___destroy___0=Module["_emscripten_bind_btConeShapeX___destroy___0"]=asm["_emscripten_bind_btConeShapeX___destroy___0"];var _emscripten_bind_btConeShapeX_btConeShapeX_2=Module["_emscripten_bind_btConeShapeX_btConeShapeX_2"]=asm["_emscripten_bind_btConeShapeX_btConeShapeX_2"];var _emscripten_bind_btConeShapeX_calculateLocalInertia_2=Module["_emscripten_bind_btConeShapeX_calculateLocalInertia_2"]=asm["_emscripten_bind_btConeShapeX_calculateLocalInertia_2"];var _emscripten_bind_btConeShapeX_getLocalScaling_0=Module["_emscripten_bind_btConeShapeX_getLocalScaling_0"]=asm["_emscripten_bind_btConeShapeX_getLocalScaling_0"];var _emscripten_bind_btConeShapeX_setLocalScaling_1=Module["_emscripten_bind_btConeShapeX_setLocalScaling_1"]=asm["_emscripten_bind_btConeShapeX_setLocalScaling_1"];var _emscripten_bind_btConeShapeZ___destroy___0=Module["_emscripten_bind_btConeShapeZ___destroy___0"]=asm["_emscripten_bind_btConeShapeZ___destroy___0"];var _emscripten_bind_btConeShapeZ_btConeShapeZ_2=Module["_emscripten_bind_btConeShapeZ_btConeShapeZ_2"]=asm["_emscripten_bind_btConeShapeZ_btConeShapeZ_2"];var _emscripten_bind_btConeShapeZ_calculateLocalInertia_2=Module["_emscripten_bind_btConeShapeZ_calculateLocalInertia_2"]=asm["_emscripten_bind_btConeShapeZ_calculateLocalInertia_2"];var _emscripten_bind_btConeShapeZ_getLocalScaling_0=Module["_emscripten_bind_btConeShapeZ_getLocalScaling_0"]=asm["_emscripten_bind_btConeShapeZ_getLocalScaling_0"];var _emscripten_bind_btConeShapeZ_setLocalScaling_1=Module["_emscripten_bind_btConeShapeZ_setLocalScaling_1"]=asm["_emscripten_bind_btConeShapeZ_setLocalScaling_1"];var _emscripten_bind_btConeShape___destroy___0=Module["_emscripten_bind_btConeShape___destroy___0"]=asm["_emscripten_bind_btConeShape___destroy___0"];var _emscripten_bind_btConeShape_btConeShape_2=Module["_emscripten_bind_btConeShape_btConeShape_2"]=asm["_emscripten_bind_btConeShape_btConeShape_2"];var _emscripten_bind_btConeShape_calculateLocalInertia_2=Module["_emscripten_bind_btConeShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btConeShape_calculateLocalInertia_2"];var _emscripten_bind_btConeShape_getLocalScaling_0=Module["_emscripten_bind_btConeShape_getLocalScaling_0"]=asm["_emscripten_bind_btConeShape_getLocalScaling_0"];var _emscripten_bind_btConeShape_setLocalScaling_1=Module["_emscripten_bind_btConeShape_setLocalScaling_1"]=asm["_emscripten_bind_btConeShape_setLocalScaling_1"];var _emscripten_bind_btConeTwistConstraint___destroy___0=Module["_emscripten_bind_btConeTwistConstraint___destroy___0"]=asm["_emscripten_bind_btConeTwistConstraint___destroy___0"];var _emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_2=Module["_emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_2"]=asm["_emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_2"];var _emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_4=Module["_emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_4"]=asm["_emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_4"];var _emscripten_bind_btConeTwistConstraint_enableFeedback_1=Module["_emscripten_bind_btConeTwistConstraint_enableFeedback_1"]=asm["_emscripten_bind_btConeTwistConstraint_enableFeedback_1"];var _emscripten_bind_btConeTwistConstraint_enableMotor_1=Module["_emscripten_bind_btConeTwistConstraint_enableMotor_1"]=asm["_emscripten_bind_btConeTwistConstraint_enableMotor_1"];var _emscripten_bind_btConeTwistConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btConeTwistConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btConeTwistConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btConeTwistConstraint_getParam_2=Module["_emscripten_bind_btConeTwistConstraint_getParam_2"]=asm["_emscripten_bind_btConeTwistConstraint_getParam_2"];var _emscripten_bind_btConeTwistConstraint_setAngularOnly_1=Module["_emscripten_bind_btConeTwistConstraint_setAngularOnly_1"]=asm["_emscripten_bind_btConeTwistConstraint_setAngularOnly_1"];var _emscripten_bind_btConeTwistConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btConeTwistConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btConeTwistConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btConeTwistConstraint_setDamping_1=Module["_emscripten_bind_btConeTwistConstraint_setDamping_1"]=asm["_emscripten_bind_btConeTwistConstraint_setDamping_1"];var _emscripten_bind_btConeTwistConstraint_setLimit_2=Module["_emscripten_bind_btConeTwistConstraint_setLimit_2"]=asm["_emscripten_bind_btConeTwistConstraint_setLimit_2"];var _emscripten_bind_btConeTwistConstraint_setMaxMotorImpulseNormalized_1=Module["_emscripten_bind_btConeTwistConstraint_setMaxMotorImpulseNormalized_1"]=asm["_emscripten_bind_btConeTwistConstraint_setMaxMotorImpulseNormalized_1"];var _emscripten_bind_btConeTwistConstraint_setMaxMotorImpulse_1=Module["_emscripten_bind_btConeTwistConstraint_setMaxMotorImpulse_1"]=asm["_emscripten_bind_btConeTwistConstraint_setMaxMotorImpulse_1"];var _emscripten_bind_btConeTwistConstraint_setMotorTargetInConstraintSpace_1=Module["_emscripten_bind_btConeTwistConstraint_setMotorTargetInConstraintSpace_1"]=asm["_emscripten_bind_btConeTwistConstraint_setMotorTargetInConstraintSpace_1"];var _emscripten_bind_btConeTwistConstraint_setMotorTarget_1=Module["_emscripten_bind_btConeTwistConstraint_setMotorTarget_1"]=asm["_emscripten_bind_btConeTwistConstraint_setMotorTarget_1"];var _emscripten_bind_btConeTwistConstraint_setParam_3=Module["_emscripten_bind_btConeTwistConstraint_setParam_3"]=asm["_emscripten_bind_btConeTwistConstraint_setParam_3"];var _emscripten_bind_btConstraintSetting___destroy___0=Module["_emscripten_bind_btConstraintSetting___destroy___0"]=asm["_emscripten_bind_btConstraintSetting___destroy___0"];var _emscripten_bind_btConstraintSetting_btConstraintSetting_0=Module["_emscripten_bind_btConstraintSetting_btConstraintSetting_0"]=asm["_emscripten_bind_btConstraintSetting_btConstraintSetting_0"];var _emscripten_bind_btConstraintSetting_get_m_damping_0=Module["_emscripten_bind_btConstraintSetting_get_m_damping_0"]=asm["_emscripten_bind_btConstraintSetting_get_m_damping_0"];var _emscripten_bind_btConstraintSetting_get_m_impulseClamp_0=Module["_emscripten_bind_btConstraintSetting_get_m_impulseClamp_0"]=asm["_emscripten_bind_btConstraintSetting_get_m_impulseClamp_0"];var _emscripten_bind_btConstraintSetting_get_m_tau_0=Module["_emscripten_bind_btConstraintSetting_get_m_tau_0"]=asm["_emscripten_bind_btConstraintSetting_get_m_tau_0"];var _emscripten_bind_btConstraintSetting_set_m_damping_1=Module["_emscripten_bind_btConstraintSetting_set_m_damping_1"]=asm["_emscripten_bind_btConstraintSetting_set_m_damping_1"];var _emscripten_bind_btConstraintSetting_set_m_impulseClamp_1=Module["_emscripten_bind_btConstraintSetting_set_m_impulseClamp_1"]=asm["_emscripten_bind_btConstraintSetting_set_m_impulseClamp_1"];var _emscripten_bind_btConstraintSetting_set_m_tau_1=Module["_emscripten_bind_btConstraintSetting_set_m_tau_1"]=asm["_emscripten_bind_btConstraintSetting_set_m_tau_1"];var _emscripten_bind_btConstraintSolver___destroy___0=Module["_emscripten_bind_btConstraintSolver___destroy___0"]=asm["_emscripten_bind_btConstraintSolver___destroy___0"];var _emscripten_bind_btContactSolverInfo___destroy___0=Module["_emscripten_bind_btContactSolverInfo___destroy___0"]=asm["_emscripten_bind_btContactSolverInfo___destroy___0"];var _emscripten_bind_btContactSolverInfo_get_m_numIterations_0=Module["_emscripten_bind_btContactSolverInfo_get_m_numIterations_0"]=asm["_emscripten_bind_btContactSolverInfo_get_m_numIterations_0"];var _emscripten_bind_btContactSolverInfo_get_m_splitImpulsePenetrationThreshold_0=Module["_emscripten_bind_btContactSolverInfo_get_m_splitImpulsePenetrationThreshold_0"]=asm["_emscripten_bind_btContactSolverInfo_get_m_splitImpulsePenetrationThreshold_0"];var _emscripten_bind_btContactSolverInfo_get_m_splitImpulse_0=Module["_emscripten_bind_btContactSolverInfo_get_m_splitImpulse_0"]=asm["_emscripten_bind_btContactSolverInfo_get_m_splitImpulse_0"];var _emscripten_bind_btContactSolverInfo_set_m_numIterations_1=Module["_emscripten_bind_btContactSolverInfo_set_m_numIterations_1"]=asm["_emscripten_bind_btContactSolverInfo_set_m_numIterations_1"];var _emscripten_bind_btContactSolverInfo_set_m_splitImpulsePenetrationThreshold_1=Module["_emscripten_bind_btContactSolverInfo_set_m_splitImpulsePenetrationThreshold_1"]=asm["_emscripten_bind_btContactSolverInfo_set_m_splitImpulsePenetrationThreshold_1"];var _emscripten_bind_btContactSolverInfo_set_m_splitImpulse_1=Module["_emscripten_bind_btContactSolverInfo_set_m_splitImpulse_1"]=asm["_emscripten_bind_btContactSolverInfo_set_m_splitImpulse_1"];var _emscripten_bind_btConvexHullShape___destroy___0=Module["_emscripten_bind_btConvexHullShape___destroy___0"]=asm["_emscripten_bind_btConvexHullShape___destroy___0"];var _emscripten_bind_btConvexHullShape_addPoint_1=Module["_emscripten_bind_btConvexHullShape_addPoint_1"]=asm["_emscripten_bind_btConvexHullShape_addPoint_1"];var _emscripten_bind_btConvexHullShape_addPoint_2=Module["_emscripten_bind_btConvexHullShape_addPoint_2"]=asm["_emscripten_bind_btConvexHullShape_addPoint_2"];var _emscripten_bind_btConvexHullShape_btConvexHullShape_0=Module["_emscripten_bind_btConvexHullShape_btConvexHullShape_0"]=asm["_emscripten_bind_btConvexHullShape_btConvexHullShape_0"];var _emscripten_bind_btConvexHullShape_calculateLocalInertia_2=Module["_emscripten_bind_btConvexHullShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btConvexHullShape_calculateLocalInertia_2"];var _emscripten_bind_btConvexHullShape_getLocalScaling_0=Module["_emscripten_bind_btConvexHullShape_getLocalScaling_0"]=asm["_emscripten_bind_btConvexHullShape_getLocalScaling_0"];var _emscripten_bind_btConvexHullShape_getMargin_0=Module["_emscripten_bind_btConvexHullShape_getMargin_0"]=asm["_emscripten_bind_btConvexHullShape_getMargin_0"];var _emscripten_bind_btConvexHullShape_setLocalScaling_1=Module["_emscripten_bind_btConvexHullShape_setLocalScaling_1"]=asm["_emscripten_bind_btConvexHullShape_setLocalScaling_1"];var _emscripten_bind_btConvexHullShape_setMargin_1=Module["_emscripten_bind_btConvexHullShape_setMargin_1"]=asm["_emscripten_bind_btConvexHullShape_setMargin_1"];var _emscripten_bind_btConvexShape___destroy___0=Module["_emscripten_bind_btConvexShape___destroy___0"]=asm["_emscripten_bind_btConvexShape___destroy___0"];var _emscripten_bind_btConvexShape_calculateLocalInertia_2=Module["_emscripten_bind_btConvexShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btConvexShape_calculateLocalInertia_2"];var _emscripten_bind_btConvexShape_getLocalScaling_0=Module["_emscripten_bind_btConvexShape_getLocalScaling_0"]=asm["_emscripten_bind_btConvexShape_getLocalScaling_0"];var _emscripten_bind_btConvexShape_getMargin_0=Module["_emscripten_bind_btConvexShape_getMargin_0"]=asm["_emscripten_bind_btConvexShape_getMargin_0"];var _emscripten_bind_btConvexShape_setLocalScaling_1=Module["_emscripten_bind_btConvexShape_setLocalScaling_1"]=asm["_emscripten_bind_btConvexShape_setLocalScaling_1"];var _emscripten_bind_btConvexShape_setMargin_1=Module["_emscripten_bind_btConvexShape_setMargin_1"]=asm["_emscripten_bind_btConvexShape_setMargin_1"];var _emscripten_bind_btConvexTriangleMeshShape___destroy___0=Module["_emscripten_bind_btConvexTriangleMeshShape___destroy___0"]=asm["_emscripten_bind_btConvexTriangleMeshShape___destroy___0"];var _emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_1=Module["_emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_1"]=asm["_emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_1"];var _emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_2=Module["_emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_2"]=asm["_emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_2"];var _emscripten_bind_btConvexTriangleMeshShape_calculateLocalInertia_2=Module["_emscripten_bind_btConvexTriangleMeshShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btConvexTriangleMeshShape_calculateLocalInertia_2"];var _emscripten_bind_btConvexTriangleMeshShape_getLocalScaling_0=Module["_emscripten_bind_btConvexTriangleMeshShape_getLocalScaling_0"]=asm["_emscripten_bind_btConvexTriangleMeshShape_getLocalScaling_0"];var _emscripten_bind_btConvexTriangleMeshShape_getMargin_0=Module["_emscripten_bind_btConvexTriangleMeshShape_getMargin_0"]=asm["_emscripten_bind_btConvexTriangleMeshShape_getMargin_0"];var _emscripten_bind_btConvexTriangleMeshShape_setLocalScaling_1=Module["_emscripten_bind_btConvexTriangleMeshShape_setLocalScaling_1"]=asm["_emscripten_bind_btConvexTriangleMeshShape_setLocalScaling_1"];var _emscripten_bind_btConvexTriangleMeshShape_setMargin_1=Module["_emscripten_bind_btConvexTriangleMeshShape_setMargin_1"]=asm["_emscripten_bind_btConvexTriangleMeshShape_setMargin_1"];var _emscripten_bind_btCylinderShapeX___destroy___0=Module["_emscripten_bind_btCylinderShapeX___destroy___0"]=asm["_emscripten_bind_btCylinderShapeX___destroy___0"];var _emscripten_bind_btCylinderShapeX_btCylinderShapeX_1=Module["_emscripten_bind_btCylinderShapeX_btCylinderShapeX_1"]=asm["_emscripten_bind_btCylinderShapeX_btCylinderShapeX_1"];var _emscripten_bind_btCylinderShapeX_calculateLocalInertia_2=Module["_emscripten_bind_btCylinderShapeX_calculateLocalInertia_2"]=asm["_emscripten_bind_btCylinderShapeX_calculateLocalInertia_2"];var _emscripten_bind_btCylinderShapeX_getLocalScaling_0=Module["_emscripten_bind_btCylinderShapeX_getLocalScaling_0"]=asm["_emscripten_bind_btCylinderShapeX_getLocalScaling_0"];var _emscripten_bind_btCylinderShapeX_getMargin_0=Module["_emscripten_bind_btCylinderShapeX_getMargin_0"]=asm["_emscripten_bind_btCylinderShapeX_getMargin_0"];var _emscripten_bind_btCylinderShapeX_setLocalScaling_1=Module["_emscripten_bind_btCylinderShapeX_setLocalScaling_1"]=asm["_emscripten_bind_btCylinderShapeX_setLocalScaling_1"];var _emscripten_bind_btCylinderShapeX_setMargin_1=Module["_emscripten_bind_btCylinderShapeX_setMargin_1"]=asm["_emscripten_bind_btCylinderShapeX_setMargin_1"];var _emscripten_bind_btCylinderShapeZ___destroy___0=Module["_emscripten_bind_btCylinderShapeZ___destroy___0"]=asm["_emscripten_bind_btCylinderShapeZ___destroy___0"];var _emscripten_bind_btCylinderShapeZ_btCylinderShapeZ_1=Module["_emscripten_bind_btCylinderShapeZ_btCylinderShapeZ_1"]=asm["_emscripten_bind_btCylinderShapeZ_btCylinderShapeZ_1"];var _emscripten_bind_btCylinderShapeZ_calculateLocalInertia_2=Module["_emscripten_bind_btCylinderShapeZ_calculateLocalInertia_2"]=asm["_emscripten_bind_btCylinderShapeZ_calculateLocalInertia_2"];var _emscripten_bind_btCylinderShapeZ_getLocalScaling_0=Module["_emscripten_bind_btCylinderShapeZ_getLocalScaling_0"]=asm["_emscripten_bind_btCylinderShapeZ_getLocalScaling_0"];var _emscripten_bind_btCylinderShapeZ_getMargin_0=Module["_emscripten_bind_btCylinderShapeZ_getMargin_0"]=asm["_emscripten_bind_btCylinderShapeZ_getMargin_0"];var _emscripten_bind_btCylinderShapeZ_setLocalScaling_1=Module["_emscripten_bind_btCylinderShapeZ_setLocalScaling_1"]=asm["_emscripten_bind_btCylinderShapeZ_setLocalScaling_1"];var _emscripten_bind_btCylinderShapeZ_setMargin_1=Module["_emscripten_bind_btCylinderShapeZ_setMargin_1"]=asm["_emscripten_bind_btCylinderShapeZ_setMargin_1"];var _emscripten_bind_btCylinderShape___destroy___0=Module["_emscripten_bind_btCylinderShape___destroy___0"]=asm["_emscripten_bind_btCylinderShape___destroy___0"];var _emscripten_bind_btCylinderShape_btCylinderShape_1=Module["_emscripten_bind_btCylinderShape_btCylinderShape_1"]=asm["_emscripten_bind_btCylinderShape_btCylinderShape_1"];var _emscripten_bind_btCylinderShape_calculateLocalInertia_2=Module["_emscripten_bind_btCylinderShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btCylinderShape_calculateLocalInertia_2"];var _emscripten_bind_btCylinderShape_getLocalScaling_0=Module["_emscripten_bind_btCylinderShape_getLocalScaling_0"]=asm["_emscripten_bind_btCylinderShape_getLocalScaling_0"];var _emscripten_bind_btCylinderShape_getMargin_0=Module["_emscripten_bind_btCylinderShape_getMargin_0"]=asm["_emscripten_bind_btCylinderShape_getMargin_0"];var _emscripten_bind_btCylinderShape_setLocalScaling_1=Module["_emscripten_bind_btCylinderShape_setLocalScaling_1"]=asm["_emscripten_bind_btCylinderShape_setLocalScaling_1"];var _emscripten_bind_btCylinderShape_setMargin_1=Module["_emscripten_bind_btCylinderShape_setMargin_1"]=asm["_emscripten_bind_btCylinderShape_setMargin_1"];var _emscripten_bind_btDbvtBroadphase___destroy___0=Module["_emscripten_bind_btDbvtBroadphase___destroy___0"]=asm["_emscripten_bind_btDbvtBroadphase___destroy___0"];var _emscripten_bind_btDbvtBroadphase_btDbvtBroadphase_0=Module["_emscripten_bind_btDbvtBroadphase_btDbvtBroadphase_0"]=asm["_emscripten_bind_btDbvtBroadphase_btDbvtBroadphase_0"];var _emscripten_bind_btDefaultCollisionConfiguration___destroy___0=Module["_emscripten_bind_btDefaultCollisionConfiguration___destroy___0"]=asm["_emscripten_bind_btDefaultCollisionConfiguration___destroy___0"];var _emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_0=Module["_emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_0"]=asm["_emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_0"];var _emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_1=Module["_emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_1"]=asm["_emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_1"];var _emscripten_bind_btDefaultCollisionConstructionInfo___destroy___0=Module["_emscripten_bind_btDefaultCollisionConstructionInfo___destroy___0"]=asm["_emscripten_bind_btDefaultCollisionConstructionInfo___destroy___0"];var _emscripten_bind_btDefaultCollisionConstructionInfo_btDefaultCollisionConstructionInfo_0=Module["_emscripten_bind_btDefaultCollisionConstructionInfo_btDefaultCollisionConstructionInfo_0"]=asm["_emscripten_bind_btDefaultCollisionConstructionInfo_btDefaultCollisionConstructionInfo_0"];var _emscripten_bind_btDefaultMotionState___destroy___0=Module["_emscripten_bind_btDefaultMotionState___destroy___0"]=asm["_emscripten_bind_btDefaultMotionState___destroy___0"];var _emscripten_bind_btDefaultMotionState_btDefaultMotionState_0=Module["_emscripten_bind_btDefaultMotionState_btDefaultMotionState_0"]=asm["_emscripten_bind_btDefaultMotionState_btDefaultMotionState_0"];var _emscripten_bind_btDefaultMotionState_btDefaultMotionState_1=Module["_emscripten_bind_btDefaultMotionState_btDefaultMotionState_1"]=asm["_emscripten_bind_btDefaultMotionState_btDefaultMotionState_1"];var _emscripten_bind_btDefaultMotionState_btDefaultMotionState_2=Module["_emscripten_bind_btDefaultMotionState_btDefaultMotionState_2"]=asm["_emscripten_bind_btDefaultMotionState_btDefaultMotionState_2"];var _emscripten_bind_btDefaultMotionState_getWorldTransform_1=Module["_emscripten_bind_btDefaultMotionState_getWorldTransform_1"]=asm["_emscripten_bind_btDefaultMotionState_getWorldTransform_1"];var _emscripten_bind_btDefaultMotionState_get_m_graphicsWorldTrans_0=Module["_emscripten_bind_btDefaultMotionState_get_m_graphicsWorldTrans_0"]=asm["_emscripten_bind_btDefaultMotionState_get_m_graphicsWorldTrans_0"];var _emscripten_bind_btDefaultMotionState_setWorldTransform_1=Module["_emscripten_bind_btDefaultMotionState_setWorldTransform_1"]=asm["_emscripten_bind_btDefaultMotionState_setWorldTransform_1"];var _emscripten_bind_btDefaultMotionState_set_m_graphicsWorldTrans_1=Module["_emscripten_bind_btDefaultMotionState_set_m_graphicsWorldTrans_1"]=asm["_emscripten_bind_btDefaultMotionState_set_m_graphicsWorldTrans_1"];var _emscripten_bind_btDefaultSoftBodySolver___destroy___0=Module["_emscripten_bind_btDefaultSoftBodySolver___destroy___0"]=asm["_emscripten_bind_btDefaultSoftBodySolver___destroy___0"];var _emscripten_bind_btDefaultSoftBodySolver_btDefaultSoftBodySolver_0=Module["_emscripten_bind_btDefaultSoftBodySolver_btDefaultSoftBodySolver_0"]=asm["_emscripten_bind_btDefaultSoftBodySolver_btDefaultSoftBodySolver_0"];var _emscripten_bind_btDefaultVehicleRaycaster___destroy___0=Module["_emscripten_bind_btDefaultVehicleRaycaster___destroy___0"]=asm["_emscripten_bind_btDefaultVehicleRaycaster___destroy___0"];var _emscripten_bind_btDefaultVehicleRaycaster_btDefaultVehicleRaycaster_1=Module["_emscripten_bind_btDefaultVehicleRaycaster_btDefaultVehicleRaycaster_1"]=asm["_emscripten_bind_btDefaultVehicleRaycaster_btDefaultVehicleRaycaster_1"];var _emscripten_bind_btDefaultVehicleRaycaster_castRay_3=Module["_emscripten_bind_btDefaultVehicleRaycaster_castRay_3"]=asm["_emscripten_bind_btDefaultVehicleRaycaster_castRay_3"];var _emscripten_bind_btDiscreteDynamicsWorld___destroy___0=Module["_emscripten_bind_btDiscreteDynamicsWorld___destroy___0"]=asm["_emscripten_bind_btDiscreteDynamicsWorld___destroy___0"];var _emscripten_bind_btDiscreteDynamicsWorld_addAction_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_addAction_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addAction_1"];var _emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_1"];var _emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_2=Module["_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_2"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_2"];var _emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_3=Module["_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_3"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_3"];var _emscripten_bind_btDiscreteDynamicsWorld_addConstraint_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_addConstraint_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addConstraint_1"];var _emscripten_bind_btDiscreteDynamicsWorld_addConstraint_2=Module["_emscripten_bind_btDiscreteDynamicsWorld_addConstraint_2"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addConstraint_2"];var _emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_1"];var _emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_3=Module["_emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_3"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_3"];var _emscripten_bind_btDiscreteDynamicsWorld_addVehicle_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_addVehicle_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addVehicle_1"];var _emscripten_bind_btDiscreteDynamicsWorld_btDiscreteDynamicsWorld_4=Module["_emscripten_bind_btDiscreteDynamicsWorld_btDiscreteDynamicsWorld_4"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_btDiscreteDynamicsWorld_4"];var _emscripten_bind_btDiscreteDynamicsWorld_contactPairTest_3=Module["_emscripten_bind_btDiscreteDynamicsWorld_contactPairTest_3"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_contactPairTest_3"];var _emscripten_bind_btDiscreteDynamicsWorld_contactTest_2=Module["_emscripten_bind_btDiscreteDynamicsWorld_contactTest_2"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_contactTest_2"];var _emscripten_bind_btDiscreteDynamicsWorld_convexSweepTest_5=Module["_emscripten_bind_btDiscreteDynamicsWorld_convexSweepTest_5"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_convexSweepTest_5"];var _emscripten_bind_btDiscreteDynamicsWorld_getBroadphase_0=Module["_emscripten_bind_btDiscreteDynamicsWorld_getBroadphase_0"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_getBroadphase_0"];var _emscripten_bind_btDiscreteDynamicsWorld_getDispatchInfo_0=Module["_emscripten_bind_btDiscreteDynamicsWorld_getDispatchInfo_0"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_getDispatchInfo_0"];var _emscripten_bind_btDiscreteDynamicsWorld_getDispatcher_0=Module["_emscripten_bind_btDiscreteDynamicsWorld_getDispatcher_0"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_getDispatcher_0"];var _emscripten_bind_btDiscreteDynamicsWorld_getGravity_0=Module["_emscripten_bind_btDiscreteDynamicsWorld_getGravity_0"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_getGravity_0"];var _emscripten_bind_btDiscreteDynamicsWorld_getPairCache_0=Module["_emscripten_bind_btDiscreteDynamicsWorld_getPairCache_0"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_getPairCache_0"];var _emscripten_bind_btDiscreteDynamicsWorld_getSolverInfo_0=Module["_emscripten_bind_btDiscreteDynamicsWorld_getSolverInfo_0"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_getSolverInfo_0"];var _emscripten_bind_btDiscreteDynamicsWorld_rayTest_3=Module["_emscripten_bind_btDiscreteDynamicsWorld_rayTest_3"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_rayTest_3"];var _emscripten_bind_btDiscreteDynamicsWorld_removeAction_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_removeAction_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_removeAction_1"];var _emscripten_bind_btDiscreteDynamicsWorld_removeCollisionObject_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_removeCollisionObject_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_removeCollisionObject_1"];var _emscripten_bind_btDiscreteDynamicsWorld_removeConstraint_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_removeConstraint_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_removeConstraint_1"];var _emscripten_bind_btDiscreteDynamicsWorld_removeRigidBody_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_removeRigidBody_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_removeRigidBody_1"];var _emscripten_bind_btDiscreteDynamicsWorld_removeVehicle_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_removeVehicle_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_removeVehicle_1"];var _emscripten_bind_btDiscreteDynamicsWorld_setGravity_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_setGravity_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_setGravity_1"];var _emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_1"];var _emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_2=Module["_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_2"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_2"];var _emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_3=Module["_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_3"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_3"];var _emscripten_bind_btDiscreteDynamicsWorld_updateSingleAabb_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_updateSingleAabb_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_updateSingleAabb_1"];var _emscripten_bind_btDispatcherInfo___destroy___0=Module["_emscripten_bind_btDispatcherInfo___destroy___0"]=asm["_emscripten_bind_btDispatcherInfo___destroy___0"];var _emscripten_bind_btDispatcherInfo_get_m_allowedCcdPenetration_0=Module["_emscripten_bind_btDispatcherInfo_get_m_allowedCcdPenetration_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_allowedCcdPenetration_0"];var _emscripten_bind_btDispatcherInfo_get_m_convexConservativeDistanceThreshold_0=Module["_emscripten_bind_btDispatcherInfo_get_m_convexConservativeDistanceThreshold_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_convexConservativeDistanceThreshold_0"];var _emscripten_bind_btDispatcherInfo_get_m_dispatchFunc_0=Module["_emscripten_bind_btDispatcherInfo_get_m_dispatchFunc_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_dispatchFunc_0"];var _emscripten_bind_btDispatcherInfo_get_m_enableSPU_0=Module["_emscripten_bind_btDispatcherInfo_get_m_enableSPU_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_enableSPU_0"];var _emscripten_bind_btDispatcherInfo_get_m_enableSatConvex_0=Module["_emscripten_bind_btDispatcherInfo_get_m_enableSatConvex_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_enableSatConvex_0"];var _emscripten_bind_btDispatcherInfo_get_m_stepCount_0=Module["_emscripten_bind_btDispatcherInfo_get_m_stepCount_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_stepCount_0"];var _emscripten_bind_btDispatcherInfo_get_m_timeOfImpact_0=Module["_emscripten_bind_btDispatcherInfo_get_m_timeOfImpact_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_timeOfImpact_0"];var _emscripten_bind_btDispatcherInfo_get_m_timeStep_0=Module["_emscripten_bind_btDispatcherInfo_get_m_timeStep_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_timeStep_0"];var _emscripten_bind_btDispatcherInfo_get_m_useContinuous_0=Module["_emscripten_bind_btDispatcherInfo_get_m_useContinuous_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_useContinuous_0"];var _emscripten_bind_btDispatcherInfo_get_m_useConvexConservativeDistanceUtil_0=Module["_emscripten_bind_btDispatcherInfo_get_m_useConvexConservativeDistanceUtil_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_useConvexConservativeDistanceUtil_0"];var _emscripten_bind_btDispatcherInfo_get_m_useEpa_0=Module["_emscripten_bind_btDispatcherInfo_get_m_useEpa_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_useEpa_0"];var _emscripten_bind_btDispatcherInfo_set_m_allowedCcdPenetration_1=Module["_emscripten_bind_btDispatcherInfo_set_m_allowedCcdPenetration_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_allowedCcdPenetration_1"];var _emscripten_bind_btDispatcherInfo_set_m_convexConservativeDistanceThreshold_1=Module["_emscripten_bind_btDispatcherInfo_set_m_convexConservativeDistanceThreshold_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_convexConservativeDistanceThreshold_1"];var _emscripten_bind_btDispatcherInfo_set_m_dispatchFunc_1=Module["_emscripten_bind_btDispatcherInfo_set_m_dispatchFunc_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_dispatchFunc_1"];var _emscripten_bind_btDispatcherInfo_set_m_enableSPU_1=Module["_emscripten_bind_btDispatcherInfo_set_m_enableSPU_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_enableSPU_1"];var _emscripten_bind_btDispatcherInfo_set_m_enableSatConvex_1=Module["_emscripten_bind_btDispatcherInfo_set_m_enableSatConvex_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_enableSatConvex_1"];var _emscripten_bind_btDispatcherInfo_set_m_stepCount_1=Module["_emscripten_bind_btDispatcherInfo_set_m_stepCount_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_stepCount_1"];var _emscripten_bind_btDispatcherInfo_set_m_timeOfImpact_1=Module["_emscripten_bind_btDispatcherInfo_set_m_timeOfImpact_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_timeOfImpact_1"];var _emscripten_bind_btDispatcherInfo_set_m_timeStep_1=Module["_emscripten_bind_btDispatcherInfo_set_m_timeStep_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_timeStep_1"];var _emscripten_bind_btDispatcherInfo_set_m_useContinuous_1=Module["_emscripten_bind_btDispatcherInfo_set_m_useContinuous_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_useContinuous_1"];var _emscripten_bind_btDispatcherInfo_set_m_useConvexConservativeDistanceUtil_1=Module["_emscripten_bind_btDispatcherInfo_set_m_useConvexConservativeDistanceUtil_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_useConvexConservativeDistanceUtil_1"];var _emscripten_bind_btDispatcherInfo_set_m_useEpa_1=Module["_emscripten_bind_btDispatcherInfo_set_m_useEpa_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_useEpa_1"];var _emscripten_bind_btDispatcher___destroy___0=Module["_emscripten_bind_btDispatcher___destroy___0"]=asm["_emscripten_bind_btDispatcher___destroy___0"];var _emscripten_bind_btDispatcher_getManifoldByIndexInternal_1=Module["_emscripten_bind_btDispatcher_getManifoldByIndexInternal_1"]=asm["_emscripten_bind_btDispatcher_getManifoldByIndexInternal_1"];var _emscripten_bind_btDispatcher_getNumManifolds_0=Module["_emscripten_bind_btDispatcher_getNumManifolds_0"]=asm["_emscripten_bind_btDispatcher_getNumManifolds_0"];var _emscripten_bind_btDynamicsWorld___destroy___0=Module["_emscripten_bind_btDynamicsWorld___destroy___0"]=asm["_emscripten_bind_btDynamicsWorld___destroy___0"];var _emscripten_bind_btDynamicsWorld_addAction_1=Module["_emscripten_bind_btDynamicsWorld_addAction_1"]=asm["_emscripten_bind_btDynamicsWorld_addAction_1"];var _emscripten_bind_btDynamicsWorld_addCollisionObject_1=Module["_emscripten_bind_btDynamicsWorld_addCollisionObject_1"]=asm["_emscripten_bind_btDynamicsWorld_addCollisionObject_1"];var _emscripten_bind_btDynamicsWorld_addCollisionObject_2=Module["_emscripten_bind_btDynamicsWorld_addCollisionObject_2"]=asm["_emscripten_bind_btDynamicsWorld_addCollisionObject_2"];var _emscripten_bind_btDynamicsWorld_addCollisionObject_3=Module["_emscripten_bind_btDynamicsWorld_addCollisionObject_3"]=asm["_emscripten_bind_btDynamicsWorld_addCollisionObject_3"];var _emscripten_bind_btDynamicsWorld_contactPairTest_3=Module["_emscripten_bind_btDynamicsWorld_contactPairTest_3"]=asm["_emscripten_bind_btDynamicsWorld_contactPairTest_3"];var _emscripten_bind_btDynamicsWorld_contactTest_2=Module["_emscripten_bind_btDynamicsWorld_contactTest_2"]=asm["_emscripten_bind_btDynamicsWorld_contactTest_2"];var _emscripten_bind_btDynamicsWorld_convexSweepTest_5=Module["_emscripten_bind_btDynamicsWorld_convexSweepTest_5"]=asm["_emscripten_bind_btDynamicsWorld_convexSweepTest_5"];var _emscripten_bind_btDynamicsWorld_getBroadphase_0=Module["_emscripten_bind_btDynamicsWorld_getBroadphase_0"]=asm["_emscripten_bind_btDynamicsWorld_getBroadphase_0"];var _emscripten_bind_btDynamicsWorld_getDispatchInfo_0=Module["_emscripten_bind_btDynamicsWorld_getDispatchInfo_0"]=asm["_emscripten_bind_btDynamicsWorld_getDispatchInfo_0"];var _emscripten_bind_btDynamicsWorld_getDispatcher_0=Module["_emscripten_bind_btDynamicsWorld_getDispatcher_0"]=asm["_emscripten_bind_btDynamicsWorld_getDispatcher_0"];var _emscripten_bind_btDynamicsWorld_getPairCache_0=Module["_emscripten_bind_btDynamicsWorld_getPairCache_0"]=asm["_emscripten_bind_btDynamicsWorld_getPairCache_0"];var _emscripten_bind_btDynamicsWorld_getSolverInfo_0=Module["_emscripten_bind_btDynamicsWorld_getSolverInfo_0"]=asm["_emscripten_bind_btDynamicsWorld_getSolverInfo_0"];var _emscripten_bind_btDynamicsWorld_rayTest_3=Module["_emscripten_bind_btDynamicsWorld_rayTest_3"]=asm["_emscripten_bind_btDynamicsWorld_rayTest_3"];var _emscripten_bind_btDynamicsWorld_removeAction_1=Module["_emscripten_bind_btDynamicsWorld_removeAction_1"]=asm["_emscripten_bind_btDynamicsWorld_removeAction_1"];var _emscripten_bind_btDynamicsWorld_removeCollisionObject_1=Module["_emscripten_bind_btDynamicsWorld_removeCollisionObject_1"]=asm["_emscripten_bind_btDynamicsWorld_removeCollisionObject_1"];var _emscripten_bind_btDynamicsWorld_updateSingleAabb_1=Module["_emscripten_bind_btDynamicsWorld_updateSingleAabb_1"]=asm["_emscripten_bind_btDynamicsWorld_updateSingleAabb_1"];var _emscripten_bind_btFixedConstraint___destroy___0=Module["_emscripten_bind_btFixedConstraint___destroy___0"]=asm["_emscripten_bind_btFixedConstraint___destroy___0"];var _emscripten_bind_btFixedConstraint_btFixedConstraint_4=Module["_emscripten_bind_btFixedConstraint_btFixedConstraint_4"]=asm["_emscripten_bind_btFixedConstraint_btFixedConstraint_4"];var _emscripten_bind_btFixedConstraint_enableFeedback_1=Module["_emscripten_bind_btFixedConstraint_enableFeedback_1"]=asm["_emscripten_bind_btFixedConstraint_enableFeedback_1"];var _emscripten_bind_btFixedConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btFixedConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btFixedConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btFixedConstraint_getParam_2=Module["_emscripten_bind_btFixedConstraint_getParam_2"]=asm["_emscripten_bind_btFixedConstraint_getParam_2"];var _emscripten_bind_btFixedConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btFixedConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btFixedConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btFixedConstraint_setParam_3=Module["_emscripten_bind_btFixedConstraint_setParam_3"]=asm["_emscripten_bind_btFixedConstraint_setParam_3"];var _emscripten_bind_btGeneric6DofConstraint___destroy___0=Module["_emscripten_bind_btGeneric6DofConstraint___destroy___0"]=asm["_emscripten_bind_btGeneric6DofConstraint___destroy___0"];var _emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_3=Module["_emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_3"]=asm["_emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_3"];var _emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_5=Module["_emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_5"]=asm["_emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_5"];var _emscripten_bind_btGeneric6DofConstraint_enableFeedback_1=Module["_emscripten_bind_btGeneric6DofConstraint_enableFeedback_1"]=asm["_emscripten_bind_btGeneric6DofConstraint_enableFeedback_1"];var _emscripten_bind_btGeneric6DofConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btGeneric6DofConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btGeneric6DofConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btGeneric6DofConstraint_getParam_2=Module["_emscripten_bind_btGeneric6DofConstraint_getParam_2"]=asm["_emscripten_bind_btGeneric6DofConstraint_getParam_2"];var _emscripten_bind_btGeneric6DofConstraint_getRotationalLimitMotor_1=Module["_emscripten_bind_btGeneric6DofConstraint_getRotationalLimitMotor_1"]=asm["_emscripten_bind_btGeneric6DofConstraint_getRotationalLimitMotor_1"];var _emscripten_bind_btGeneric6DofConstraint_setAngularLowerLimit_1=Module["_emscripten_bind_btGeneric6DofConstraint_setAngularLowerLimit_1"]=asm["_emscripten_bind_btGeneric6DofConstraint_setAngularLowerLimit_1"];var _emscripten_bind_btGeneric6DofConstraint_setAngularUpperLimit_1=Module["_emscripten_bind_btGeneric6DofConstraint_setAngularUpperLimit_1"]=asm["_emscripten_bind_btGeneric6DofConstraint_setAngularUpperLimit_1"];var _emscripten_bind_btGeneric6DofConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btGeneric6DofConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btGeneric6DofConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btGeneric6DofConstraint_setLinearLowerLimit_1=Module["_emscripten_bind_btGeneric6DofConstraint_setLinearLowerLimit_1"]=asm["_emscripten_bind_btGeneric6DofConstraint_setLinearLowerLimit_1"];var _emscripten_bind_btGeneric6DofConstraint_setLinearUpperLimit_1=Module["_emscripten_bind_btGeneric6DofConstraint_setLinearUpperLimit_1"]=asm["_emscripten_bind_btGeneric6DofConstraint_setLinearUpperLimit_1"];var _emscripten_bind_btGeneric6DofConstraint_setParam_3=Module["_emscripten_bind_btGeneric6DofConstraint_setParam_3"]=asm["_emscripten_bind_btGeneric6DofConstraint_setParam_3"];var _emscripten_bind_btGeneric6DofSpringConstraint___destroy___0=Module["_emscripten_bind_btGeneric6DofSpringConstraint___destroy___0"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint___destroy___0"];var _emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_3=Module["_emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_3"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_3"];var _emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_5=Module["_emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_5"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_5"];var _emscripten_bind_btGeneric6DofSpringConstraint_enableFeedback_1=Module["_emscripten_bind_btGeneric6DofSpringConstraint_enableFeedback_1"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_enableFeedback_1"];var _emscripten_bind_btGeneric6DofSpringConstraint_enableSpring_2=Module["_emscripten_bind_btGeneric6DofSpringConstraint_enableSpring_2"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_enableSpring_2"];var _emscripten_bind_btGeneric6DofSpringConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btGeneric6DofSpringConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btGeneric6DofSpringConstraint_getParam_2=Module["_emscripten_bind_btGeneric6DofSpringConstraint_getParam_2"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_getParam_2"];var _emscripten_bind_btGeneric6DofSpringConstraint_getRotationalLimitMotor_1=Module["_emscripten_bind_btGeneric6DofSpringConstraint_getRotationalLimitMotor_1"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_getRotationalLimitMotor_1"];var _emscripten_bind_btGeneric6DofSpringConstraint_setAngularLowerLimit_1=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setAngularLowerLimit_1"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setAngularLowerLimit_1"];var _emscripten_bind_btGeneric6DofSpringConstraint_setAngularUpperLimit_1=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setAngularUpperLimit_1"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setAngularUpperLimit_1"];var _emscripten_bind_btGeneric6DofSpringConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btGeneric6DofSpringConstraint_setDamping_2=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setDamping_2"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setDamping_2"];var _emscripten_bind_btGeneric6DofSpringConstraint_setLinearLowerLimit_1=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setLinearLowerLimit_1"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setLinearLowerLimit_1"];var _emscripten_bind_btGeneric6DofSpringConstraint_setLinearUpperLimit_1=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setLinearUpperLimit_1"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setLinearUpperLimit_1"];var _emscripten_bind_btGeneric6DofSpringConstraint_setParam_3=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setParam_3"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setParam_3"];var _emscripten_bind_btGeneric6DofSpringConstraint_setStiffness_2=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setStiffness_2"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setStiffness_2"];var _emscripten_bind_btGhostObject___destroy___0=Module["_emscripten_bind_btGhostObject___destroy___0"]=asm["_emscripten_bind_btGhostObject___destroy___0"];var _emscripten_bind_btGhostObject_activate_0=Module["_emscripten_bind_btGhostObject_activate_0"]=asm["_emscripten_bind_btGhostObject_activate_0"];var _emscripten_bind_btGhostObject_activate_1=Module["_emscripten_bind_btGhostObject_activate_1"]=asm["_emscripten_bind_btGhostObject_activate_1"];var _emscripten_bind_btGhostObject_btGhostObject_0=Module["_emscripten_bind_btGhostObject_btGhostObject_0"]=asm["_emscripten_bind_btGhostObject_btGhostObject_0"];var _emscripten_bind_btGhostObject_forceActivationState_1=Module["_emscripten_bind_btGhostObject_forceActivationState_1"]=asm["_emscripten_bind_btGhostObject_forceActivationState_1"];var _emscripten_bind_btGhostObject_getCollisionFlags_0=Module["_emscripten_bind_btGhostObject_getCollisionFlags_0"]=asm["_emscripten_bind_btGhostObject_getCollisionFlags_0"];var _emscripten_bind_btGhostObject_getCollisionShape_0=Module["_emscripten_bind_btGhostObject_getCollisionShape_0"]=asm["_emscripten_bind_btGhostObject_getCollisionShape_0"];var _emscripten_bind_btGhostObject_getNumOverlappingObjects_0=Module["_emscripten_bind_btGhostObject_getNumOverlappingObjects_0"]=asm["_emscripten_bind_btGhostObject_getNumOverlappingObjects_0"];var _emscripten_bind_btGhostObject_getOverlappingObject_1=Module["_emscripten_bind_btGhostObject_getOverlappingObject_1"]=asm["_emscripten_bind_btGhostObject_getOverlappingObject_1"];var _emscripten_bind_btGhostObject_getUserIndex_0=Module["_emscripten_bind_btGhostObject_getUserIndex_0"]=asm["_emscripten_bind_btGhostObject_getUserIndex_0"];var _emscripten_bind_btGhostObject_getUserPointer_0=Module["_emscripten_bind_btGhostObject_getUserPointer_0"]=asm["_emscripten_bind_btGhostObject_getUserPointer_0"];var _emscripten_bind_btGhostObject_getWorldTransform_0=Module["_emscripten_bind_btGhostObject_getWorldTransform_0"]=asm["_emscripten_bind_btGhostObject_getWorldTransform_0"];var _emscripten_bind_btGhostObject_isActive_0=Module["_emscripten_bind_btGhostObject_isActive_0"]=asm["_emscripten_bind_btGhostObject_isActive_0"];var _emscripten_bind_btGhostObject_isKinematicObject_0=Module["_emscripten_bind_btGhostObject_isKinematicObject_0"]=asm["_emscripten_bind_btGhostObject_isKinematicObject_0"];var _emscripten_bind_btGhostObject_isStaticObject_0=Module["_emscripten_bind_btGhostObject_isStaticObject_0"]=asm["_emscripten_bind_btGhostObject_isStaticObject_0"];var _emscripten_bind_btGhostObject_isStaticOrKinematicObject_0=Module["_emscripten_bind_btGhostObject_isStaticOrKinematicObject_0"]=asm["_emscripten_bind_btGhostObject_isStaticOrKinematicObject_0"];var _emscripten_bind_btGhostObject_setActivationState_1=Module["_emscripten_bind_btGhostObject_setActivationState_1"]=asm["_emscripten_bind_btGhostObject_setActivationState_1"];var _emscripten_bind_btGhostObject_setAnisotropicFriction_2=Module["_emscripten_bind_btGhostObject_setAnisotropicFriction_2"]=asm["_emscripten_bind_btGhostObject_setAnisotropicFriction_2"];var _emscripten_bind_btGhostObject_setCcdMotionThreshold_1=Module["_emscripten_bind_btGhostObject_setCcdMotionThreshold_1"]=asm["_emscripten_bind_btGhostObject_setCcdMotionThreshold_1"];var _emscripten_bind_btGhostObject_setCcdSweptSphereRadius_1=Module["_emscripten_bind_btGhostObject_setCcdSweptSphereRadius_1"]=asm["_emscripten_bind_btGhostObject_setCcdSweptSphereRadius_1"];var _emscripten_bind_btGhostObject_setCollisionFlags_1=Module["_emscripten_bind_btGhostObject_setCollisionFlags_1"]=asm["_emscripten_bind_btGhostObject_setCollisionFlags_1"];var _emscripten_bind_btGhostObject_setCollisionShape_1=Module["_emscripten_bind_btGhostObject_setCollisionShape_1"]=asm["_emscripten_bind_btGhostObject_setCollisionShape_1"];var _emscripten_bind_btGhostObject_setContactProcessingThreshold_1=Module["_emscripten_bind_btGhostObject_setContactProcessingThreshold_1"]=asm["_emscripten_bind_btGhostObject_setContactProcessingThreshold_1"];var _emscripten_bind_btGhostObject_setFriction_1=Module["_emscripten_bind_btGhostObject_setFriction_1"]=asm["_emscripten_bind_btGhostObject_setFriction_1"];var _emscripten_bind_btGhostObject_setRestitution_1=Module["_emscripten_bind_btGhostObject_setRestitution_1"]=asm["_emscripten_bind_btGhostObject_setRestitution_1"];var _emscripten_bind_btGhostObject_setRollingFriction_1=Module["_emscripten_bind_btGhostObject_setRollingFriction_1"]=asm["_emscripten_bind_btGhostObject_setRollingFriction_1"];var _emscripten_bind_btGhostObject_setUserIndex_1=Module["_emscripten_bind_btGhostObject_setUserIndex_1"]=asm["_emscripten_bind_btGhostObject_setUserIndex_1"];var _emscripten_bind_btGhostObject_setUserPointer_1=Module["_emscripten_bind_btGhostObject_setUserPointer_1"]=asm["_emscripten_bind_btGhostObject_setUserPointer_1"];var _emscripten_bind_btGhostObject_setWorldTransform_1=Module["_emscripten_bind_btGhostObject_setWorldTransform_1"]=asm["_emscripten_bind_btGhostObject_setWorldTransform_1"];var _emscripten_bind_btGhostPairCallback___destroy___0=Module["_emscripten_bind_btGhostPairCallback___destroy___0"]=asm["_emscripten_bind_btGhostPairCallback___destroy___0"];var _emscripten_bind_btGhostPairCallback_btGhostPairCallback_0=Module["_emscripten_bind_btGhostPairCallback_btGhostPairCallback_0"]=asm["_emscripten_bind_btGhostPairCallback_btGhostPairCallback_0"];var _emscripten_bind_btHeightfieldTerrainShape___destroy___0=Module["_emscripten_bind_btHeightfieldTerrainShape___destroy___0"]=asm["_emscripten_bind_btHeightfieldTerrainShape___destroy___0"];var _emscripten_bind_btHeightfieldTerrainShape_btHeightfieldTerrainShape_9=Module["_emscripten_bind_btHeightfieldTerrainShape_btHeightfieldTerrainShape_9"]=asm["_emscripten_bind_btHeightfieldTerrainShape_btHeightfieldTerrainShape_9"];var _emscripten_bind_btHeightfieldTerrainShape_calculateLocalInertia_2=Module["_emscripten_bind_btHeightfieldTerrainShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btHeightfieldTerrainShape_calculateLocalInertia_2"];var _emscripten_bind_btHeightfieldTerrainShape_getLocalScaling_0=Module["_emscripten_bind_btHeightfieldTerrainShape_getLocalScaling_0"]=asm["_emscripten_bind_btHeightfieldTerrainShape_getLocalScaling_0"];var _emscripten_bind_btHeightfieldTerrainShape_getMargin_0=Module["_emscripten_bind_btHeightfieldTerrainShape_getMargin_0"]=asm["_emscripten_bind_btHeightfieldTerrainShape_getMargin_0"];var _emscripten_bind_btHeightfieldTerrainShape_setLocalScaling_1=Module["_emscripten_bind_btHeightfieldTerrainShape_setLocalScaling_1"]=asm["_emscripten_bind_btHeightfieldTerrainShape_setLocalScaling_1"];var _emscripten_bind_btHeightfieldTerrainShape_setMargin_1=Module["_emscripten_bind_btHeightfieldTerrainShape_setMargin_1"]=asm["_emscripten_bind_btHeightfieldTerrainShape_setMargin_1"];var _emscripten_bind_btHingeConstraint___destroy___0=Module["_emscripten_bind_btHingeConstraint___destroy___0"]=asm["_emscripten_bind_btHingeConstraint___destroy___0"];var _emscripten_bind_btHingeConstraint_btHingeConstraint_2=Module["_emscripten_bind_btHingeConstraint_btHingeConstraint_2"]=asm["_emscripten_bind_btHingeConstraint_btHingeConstraint_2"];var _emscripten_bind_btHingeConstraint_btHingeConstraint_3=Module["_emscripten_bind_btHingeConstraint_btHingeConstraint_3"]=asm["_emscripten_bind_btHingeConstraint_btHingeConstraint_3"];var _emscripten_bind_btHingeConstraint_btHingeConstraint_4=Module["_emscripten_bind_btHingeConstraint_btHingeConstraint_4"]=asm["_emscripten_bind_btHingeConstraint_btHingeConstraint_4"];var _emscripten_bind_btHingeConstraint_btHingeConstraint_5=Module["_emscripten_bind_btHingeConstraint_btHingeConstraint_5"]=asm["_emscripten_bind_btHingeConstraint_btHingeConstraint_5"];var _emscripten_bind_btHingeConstraint_btHingeConstraint_6=Module["_emscripten_bind_btHingeConstraint_btHingeConstraint_6"]=asm["_emscripten_bind_btHingeConstraint_btHingeConstraint_6"];var _emscripten_bind_btHingeConstraint_btHingeConstraint_7=Module["_emscripten_bind_btHingeConstraint_btHingeConstraint_7"]=asm["_emscripten_bind_btHingeConstraint_btHingeConstraint_7"];var _emscripten_bind_btHingeConstraint_enableAngularMotor_3=Module["_emscripten_bind_btHingeConstraint_enableAngularMotor_3"]=asm["_emscripten_bind_btHingeConstraint_enableAngularMotor_3"];var _emscripten_bind_btHingeConstraint_enableFeedback_1=Module["_emscripten_bind_btHingeConstraint_enableFeedback_1"]=asm["_emscripten_bind_btHingeConstraint_enableFeedback_1"];var _emscripten_bind_btHingeConstraint_enableMotor_1=Module["_emscripten_bind_btHingeConstraint_enableMotor_1"]=asm["_emscripten_bind_btHingeConstraint_enableMotor_1"];var _emscripten_bind_btHingeConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btHingeConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btHingeConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btHingeConstraint_getParam_2=Module["_emscripten_bind_btHingeConstraint_getParam_2"]=asm["_emscripten_bind_btHingeConstraint_getParam_2"];var _emscripten_bind_btHingeConstraint_setAngularOnly_1=Module["_emscripten_bind_btHingeConstraint_setAngularOnly_1"]=asm["_emscripten_bind_btHingeConstraint_setAngularOnly_1"];var _emscripten_bind_btHingeConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btHingeConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btHingeConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btHingeConstraint_setLimit_4=Module["_emscripten_bind_btHingeConstraint_setLimit_4"]=asm["_emscripten_bind_btHingeConstraint_setLimit_4"];var _emscripten_bind_btHingeConstraint_setLimit_5=Module["_emscripten_bind_btHingeConstraint_setLimit_5"]=asm["_emscripten_bind_btHingeConstraint_setLimit_5"];var _emscripten_bind_btHingeConstraint_setMaxMotorImpulse_1=Module["_emscripten_bind_btHingeConstraint_setMaxMotorImpulse_1"]=asm["_emscripten_bind_btHingeConstraint_setMaxMotorImpulse_1"];var _emscripten_bind_btHingeConstraint_setMotorTarget_2=Module["_emscripten_bind_btHingeConstraint_setMotorTarget_2"]=asm["_emscripten_bind_btHingeConstraint_setMotorTarget_2"];var _emscripten_bind_btHingeConstraint_setParam_3=Module["_emscripten_bind_btHingeConstraint_setParam_3"]=asm["_emscripten_bind_btHingeConstraint_setParam_3"];var _emscripten_bind_btKinematicCharacterController___destroy___0=Module["_emscripten_bind_btKinematicCharacterController___destroy___0"]=asm["_emscripten_bind_btKinematicCharacterController___destroy___0"];var _emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_3=Module["_emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_3"]=asm["_emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_3"];var _emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_4=Module["_emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_4"]=asm["_emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_4"];var _emscripten_bind_btKinematicCharacterController_canJump_0=Module["_emscripten_bind_btKinematicCharacterController_canJump_0"]=asm["_emscripten_bind_btKinematicCharacterController_canJump_0"];var _emscripten_bind_btKinematicCharacterController_getGhostObject_0=Module["_emscripten_bind_btKinematicCharacterController_getGhostObject_0"]=asm["_emscripten_bind_btKinematicCharacterController_getGhostObject_0"];var _emscripten_bind_btKinematicCharacterController_getGravity_0=Module["_emscripten_bind_btKinematicCharacterController_getGravity_0"]=asm["_emscripten_bind_btKinematicCharacterController_getGravity_0"];var _emscripten_bind_btKinematicCharacterController_getMaxSlope_0=Module["_emscripten_bind_btKinematicCharacterController_getMaxSlope_0"]=asm["_emscripten_bind_btKinematicCharacterController_getMaxSlope_0"];var _emscripten_bind_btKinematicCharacterController_jump_0=Module["_emscripten_bind_btKinematicCharacterController_jump_0"]=asm["_emscripten_bind_btKinematicCharacterController_jump_0"];var _emscripten_bind_btKinematicCharacterController_onGround_0=Module["_emscripten_bind_btKinematicCharacterController_onGround_0"]=asm["_emscripten_bind_btKinematicCharacterController_onGround_0"];var _emscripten_bind_btKinematicCharacterController_playerStep_2=Module["_emscripten_bind_btKinematicCharacterController_playerStep_2"]=asm["_emscripten_bind_btKinematicCharacterController_playerStep_2"];var _emscripten_bind_btKinematicCharacterController_preStep_1=Module["_emscripten_bind_btKinematicCharacterController_preStep_1"]=asm["_emscripten_bind_btKinematicCharacterController_preStep_1"];var _emscripten_bind_btKinematicCharacterController_setFallSpeed_1=Module["_emscripten_bind_btKinematicCharacterController_setFallSpeed_1"]=asm["_emscripten_bind_btKinematicCharacterController_setFallSpeed_1"];var _emscripten_bind_btKinematicCharacterController_setGravity_1=Module["_emscripten_bind_btKinematicCharacterController_setGravity_1"]=asm["_emscripten_bind_btKinematicCharacterController_setGravity_1"];var _emscripten_bind_btKinematicCharacterController_setJumpSpeed_1=Module["_emscripten_bind_btKinematicCharacterController_setJumpSpeed_1"]=asm["_emscripten_bind_btKinematicCharacterController_setJumpSpeed_1"];var _emscripten_bind_btKinematicCharacterController_setMaxJumpHeight_1=Module["_emscripten_bind_btKinematicCharacterController_setMaxJumpHeight_1"]=asm["_emscripten_bind_btKinematicCharacterController_setMaxJumpHeight_1"];var _emscripten_bind_btKinematicCharacterController_setMaxSlope_1=Module["_emscripten_bind_btKinematicCharacterController_setMaxSlope_1"]=asm["_emscripten_bind_btKinematicCharacterController_setMaxSlope_1"];var _emscripten_bind_btKinematicCharacterController_setUpInterpolate_1=Module["_emscripten_bind_btKinematicCharacterController_setUpInterpolate_1"]=asm["_emscripten_bind_btKinematicCharacterController_setUpInterpolate_1"];var _emscripten_bind_btKinematicCharacterController_setUp_1=Module["_emscripten_bind_btKinematicCharacterController_setUp_1"]=asm["_emscripten_bind_btKinematicCharacterController_setUp_1"];var _emscripten_bind_btKinematicCharacterController_setUseGhostSweepTest_1=Module["_emscripten_bind_btKinematicCharacterController_setUseGhostSweepTest_1"]=asm["_emscripten_bind_btKinematicCharacterController_setUseGhostSweepTest_1"];var _emscripten_bind_btKinematicCharacterController_setVelocityForTimeInterval_2=Module["_emscripten_bind_btKinematicCharacterController_setVelocityForTimeInterval_2"]=asm["_emscripten_bind_btKinematicCharacterController_setVelocityForTimeInterval_2"];var _emscripten_bind_btKinematicCharacterController_setWalkDirection_1=Module["_emscripten_bind_btKinematicCharacterController_setWalkDirection_1"]=asm["_emscripten_bind_btKinematicCharacterController_setWalkDirection_1"];var _emscripten_bind_btKinematicCharacterController_updateAction_2=Module["_emscripten_bind_btKinematicCharacterController_updateAction_2"]=asm["_emscripten_bind_btKinematicCharacterController_updateAction_2"];var _emscripten_bind_btKinematicCharacterController_warp_1=Module["_emscripten_bind_btKinematicCharacterController_warp_1"]=asm["_emscripten_bind_btKinematicCharacterController_warp_1"];var _emscripten_bind_btManifoldPoint___destroy___0=Module["_emscripten_bind_btManifoldPoint___destroy___0"]=asm["_emscripten_bind_btManifoldPoint___destroy___0"];var _emscripten_bind_btManifoldPoint_getAppliedImpulse_0=Module["_emscripten_bind_btManifoldPoint_getAppliedImpulse_0"]=asm["_emscripten_bind_btManifoldPoint_getAppliedImpulse_0"];var _emscripten_bind_btManifoldPoint_getDistance_0=Module["_emscripten_bind_btManifoldPoint_getDistance_0"]=asm["_emscripten_bind_btManifoldPoint_getDistance_0"];var _emscripten_bind_btManifoldPoint_getPositionWorldOnA_0=Module["_emscripten_bind_btManifoldPoint_getPositionWorldOnA_0"]=asm["_emscripten_bind_btManifoldPoint_getPositionWorldOnA_0"];var _emscripten_bind_btManifoldPoint_getPositionWorldOnB_0=Module["_emscripten_bind_btManifoldPoint_getPositionWorldOnB_0"]=asm["_emscripten_bind_btManifoldPoint_getPositionWorldOnB_0"];var _emscripten_bind_btManifoldPoint_get_m_localPointA_0=Module["_emscripten_bind_btManifoldPoint_get_m_localPointA_0"]=asm["_emscripten_bind_btManifoldPoint_get_m_localPointA_0"];var _emscripten_bind_btManifoldPoint_get_m_localPointB_0=Module["_emscripten_bind_btManifoldPoint_get_m_localPointB_0"]=asm["_emscripten_bind_btManifoldPoint_get_m_localPointB_0"];var _emscripten_bind_btManifoldPoint_get_m_normalWorldOnB_0=Module["_emscripten_bind_btManifoldPoint_get_m_normalWorldOnB_0"]=asm["_emscripten_bind_btManifoldPoint_get_m_normalWorldOnB_0"];var _emscripten_bind_btManifoldPoint_get_m_positionWorldOnA_0=Module["_emscripten_bind_btManifoldPoint_get_m_positionWorldOnA_0"]=asm["_emscripten_bind_btManifoldPoint_get_m_positionWorldOnA_0"];var _emscripten_bind_btManifoldPoint_get_m_positionWorldOnB_0=Module["_emscripten_bind_btManifoldPoint_get_m_positionWorldOnB_0"]=asm["_emscripten_bind_btManifoldPoint_get_m_positionWorldOnB_0"];var _emscripten_bind_btManifoldPoint_set_m_localPointA_1=Module["_emscripten_bind_btManifoldPoint_set_m_localPointA_1"]=asm["_emscripten_bind_btManifoldPoint_set_m_localPointA_1"];var _emscripten_bind_btManifoldPoint_set_m_localPointB_1=Module["_emscripten_bind_btManifoldPoint_set_m_localPointB_1"]=asm["_emscripten_bind_btManifoldPoint_set_m_localPointB_1"];var _emscripten_bind_btManifoldPoint_set_m_normalWorldOnB_1=Module["_emscripten_bind_btManifoldPoint_set_m_normalWorldOnB_1"]=asm["_emscripten_bind_btManifoldPoint_set_m_normalWorldOnB_1"];var _emscripten_bind_btManifoldPoint_set_m_positionWorldOnA_1=Module["_emscripten_bind_btManifoldPoint_set_m_positionWorldOnA_1"]=asm["_emscripten_bind_btManifoldPoint_set_m_positionWorldOnA_1"];var _emscripten_bind_btManifoldPoint_set_m_positionWorldOnB_1=Module["_emscripten_bind_btManifoldPoint_set_m_positionWorldOnB_1"]=asm["_emscripten_bind_btManifoldPoint_set_m_positionWorldOnB_1"];var _emscripten_bind_btMatrix3x3___destroy___0=Module["_emscripten_bind_btMatrix3x3___destroy___0"]=asm["_emscripten_bind_btMatrix3x3___destroy___0"];var _emscripten_bind_btMatrix3x3_getRotation_1=Module["_emscripten_bind_btMatrix3x3_getRotation_1"]=asm["_emscripten_bind_btMatrix3x3_getRotation_1"];var _emscripten_bind_btMatrix3x3_getRow_1=Module["_emscripten_bind_btMatrix3x3_getRow_1"]=asm["_emscripten_bind_btMatrix3x3_getRow_1"];var _emscripten_bind_btMatrix3x3_setEulerZYX_3=Module["_emscripten_bind_btMatrix3x3_setEulerZYX_3"]=asm["_emscripten_bind_btMatrix3x3_setEulerZYX_3"];var _emscripten_bind_btMotionState___destroy___0=Module["_emscripten_bind_btMotionState___destroy___0"]=asm["_emscripten_bind_btMotionState___destroy___0"];var _emscripten_bind_btMotionState_getWorldTransform_1=Module["_emscripten_bind_btMotionState_getWorldTransform_1"]=asm["_emscripten_bind_btMotionState_getWorldTransform_1"];var _emscripten_bind_btMotionState_setWorldTransform_1=Module["_emscripten_bind_btMotionState_setWorldTransform_1"]=asm["_emscripten_bind_btMotionState_setWorldTransform_1"];var _emscripten_bind_btOverlappingPairCache___destroy___0=Module["_emscripten_bind_btOverlappingPairCache___destroy___0"]=asm["_emscripten_bind_btOverlappingPairCache___destroy___0"];var _emscripten_bind_btOverlappingPairCache_setInternalGhostPairCallback_1=Module["_emscripten_bind_btOverlappingPairCache_setInternalGhostPairCallback_1"]=asm["_emscripten_bind_btOverlappingPairCache_setInternalGhostPairCallback_1"];var _emscripten_bind_btOverlappingPairCallback___destroy___0=Module["_emscripten_bind_btOverlappingPairCallback___destroy___0"]=asm["_emscripten_bind_btOverlappingPairCallback___destroy___0"];var _emscripten_bind_btPairCachingGhostObject___destroy___0=Module["_emscripten_bind_btPairCachingGhostObject___destroy___0"]=asm["_emscripten_bind_btPairCachingGhostObject___destroy___0"];var _emscripten_bind_btPairCachingGhostObject_activate_0=Module["_emscripten_bind_btPairCachingGhostObject_activate_0"]=asm["_emscripten_bind_btPairCachingGhostObject_activate_0"];var _emscripten_bind_btPairCachingGhostObject_activate_1=Module["_emscripten_bind_btPairCachingGhostObject_activate_1"]=asm["_emscripten_bind_btPairCachingGhostObject_activate_1"];var _emscripten_bind_btPairCachingGhostObject_btPairCachingGhostObject_0=Module["_emscripten_bind_btPairCachingGhostObject_btPairCachingGhostObject_0"]=asm["_emscripten_bind_btPairCachingGhostObject_btPairCachingGhostObject_0"];var _emscripten_bind_btPairCachingGhostObject_forceActivationState_1=Module["_emscripten_bind_btPairCachingGhostObject_forceActivationState_1"]=asm["_emscripten_bind_btPairCachingGhostObject_forceActivationState_1"];var _emscripten_bind_btPairCachingGhostObject_getCollisionFlags_0=Module["_emscripten_bind_btPairCachingGhostObject_getCollisionFlags_0"]=asm["_emscripten_bind_btPairCachingGhostObject_getCollisionFlags_0"];var _emscripten_bind_btPairCachingGhostObject_getCollisionShape_0=Module["_emscripten_bind_btPairCachingGhostObject_getCollisionShape_0"]=asm["_emscripten_bind_btPairCachingGhostObject_getCollisionShape_0"];var _emscripten_bind_btPairCachingGhostObject_getNumOverlappingObjects_0=Module["_emscripten_bind_btPairCachingGhostObject_getNumOverlappingObjects_0"]=asm["_emscripten_bind_btPairCachingGhostObject_getNumOverlappingObjects_0"];var _emscripten_bind_btPairCachingGhostObject_getOverlappingObject_1=Module["_emscripten_bind_btPairCachingGhostObject_getOverlappingObject_1"]=asm["_emscripten_bind_btPairCachingGhostObject_getOverlappingObject_1"];var _emscripten_bind_btPairCachingGhostObject_getUserIndex_0=Module["_emscripten_bind_btPairCachingGhostObject_getUserIndex_0"]=asm["_emscripten_bind_btPairCachingGhostObject_getUserIndex_0"];var _emscripten_bind_btPairCachingGhostObject_getUserPointer_0=Module["_emscripten_bind_btPairCachingGhostObject_getUserPointer_0"]=asm["_emscripten_bind_btPairCachingGhostObject_getUserPointer_0"];var _emscripten_bind_btPairCachingGhostObject_getWorldTransform_0=Module["_emscripten_bind_btPairCachingGhostObject_getWorldTransform_0"]=asm["_emscripten_bind_btPairCachingGhostObject_getWorldTransform_0"];var _emscripten_bind_btPairCachingGhostObject_isActive_0=Module["_emscripten_bind_btPairCachingGhostObject_isActive_0"]=asm["_emscripten_bind_btPairCachingGhostObject_isActive_0"];var _emscripten_bind_btPairCachingGhostObject_isKinematicObject_0=Module["_emscripten_bind_btPairCachingGhostObject_isKinematicObject_0"]=asm["_emscripten_bind_btPairCachingGhostObject_isKinematicObject_0"];var _emscripten_bind_btPairCachingGhostObject_isStaticObject_0=Module["_emscripten_bind_btPairCachingGhostObject_isStaticObject_0"]=asm["_emscripten_bind_btPairCachingGhostObject_isStaticObject_0"];var _emscripten_bind_btPairCachingGhostObject_isStaticOrKinematicObject_0=Module["_emscripten_bind_btPairCachingGhostObject_isStaticOrKinematicObject_0"]=asm["_emscripten_bind_btPairCachingGhostObject_isStaticOrKinematicObject_0"];var _emscripten_bind_btPairCachingGhostObject_setActivationState_1=Module["_emscripten_bind_btPairCachingGhostObject_setActivationState_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setActivationState_1"];var _emscripten_bind_btPairCachingGhostObject_setAnisotropicFriction_2=Module["_emscripten_bind_btPairCachingGhostObject_setAnisotropicFriction_2"]=asm["_emscripten_bind_btPairCachingGhostObject_setAnisotropicFriction_2"];var _emscripten_bind_btPairCachingGhostObject_setCcdMotionThreshold_1=Module["_emscripten_bind_btPairCachingGhostObject_setCcdMotionThreshold_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setCcdMotionThreshold_1"];var _emscripten_bind_btPairCachingGhostObject_setCcdSweptSphereRadius_1=Module["_emscripten_bind_btPairCachingGhostObject_setCcdSweptSphereRadius_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setCcdSweptSphereRadius_1"];var _emscripten_bind_btPairCachingGhostObject_setCollisionFlags_1=Module["_emscripten_bind_btPairCachingGhostObject_setCollisionFlags_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setCollisionFlags_1"];var _emscripten_bind_btPairCachingGhostObject_setCollisionShape_1=Module["_emscripten_bind_btPairCachingGhostObject_setCollisionShape_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setCollisionShape_1"];var _emscripten_bind_btPairCachingGhostObject_setContactProcessingThreshold_1=Module["_emscripten_bind_btPairCachingGhostObject_setContactProcessingThreshold_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setContactProcessingThreshold_1"];var _emscripten_bind_btPairCachingGhostObject_setFriction_1=Module["_emscripten_bind_btPairCachingGhostObject_setFriction_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setFriction_1"];var _emscripten_bind_btPairCachingGhostObject_setRestitution_1=Module["_emscripten_bind_btPairCachingGhostObject_setRestitution_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setRestitution_1"];var _emscripten_bind_btPairCachingGhostObject_setRollingFriction_1=Module["_emscripten_bind_btPairCachingGhostObject_setRollingFriction_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setRollingFriction_1"];var _emscripten_bind_btPairCachingGhostObject_setUserIndex_1=Module["_emscripten_bind_btPairCachingGhostObject_setUserIndex_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setUserIndex_1"];var _emscripten_bind_btPairCachingGhostObject_setUserPointer_1=Module["_emscripten_bind_btPairCachingGhostObject_setUserPointer_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setUserPointer_1"];var _emscripten_bind_btPairCachingGhostObject_setWorldTransform_1=Module["_emscripten_bind_btPairCachingGhostObject_setWorldTransform_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setWorldTransform_1"];var _emscripten_bind_btPersistentManifold___destroy___0=Module["_emscripten_bind_btPersistentManifold___destroy___0"]=asm["_emscripten_bind_btPersistentManifold___destroy___0"];var _emscripten_bind_btPersistentManifold_btPersistentManifold_0=Module["_emscripten_bind_btPersistentManifold_btPersistentManifold_0"]=asm["_emscripten_bind_btPersistentManifold_btPersistentManifold_0"];var _emscripten_bind_btPersistentManifold_getBody0_0=Module["_emscripten_bind_btPersistentManifold_getBody0_0"]=asm["_emscripten_bind_btPersistentManifold_getBody0_0"];var _emscripten_bind_btPersistentManifold_getBody1_0=Module["_emscripten_bind_btPersistentManifold_getBody1_0"]=asm["_emscripten_bind_btPersistentManifold_getBody1_0"];var _emscripten_bind_btPersistentManifold_getContactPoint_1=Module["_emscripten_bind_btPersistentManifold_getContactPoint_1"]=asm["_emscripten_bind_btPersistentManifold_getContactPoint_1"];var _emscripten_bind_btPersistentManifold_getNumContacts_0=Module["_emscripten_bind_btPersistentManifold_getNumContacts_0"]=asm["_emscripten_bind_btPersistentManifold_getNumContacts_0"];var _emscripten_bind_btPoint2PointConstraint___destroy___0=Module["_emscripten_bind_btPoint2PointConstraint___destroy___0"]=asm["_emscripten_bind_btPoint2PointConstraint___destroy___0"];var _emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_2=Module["_emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_2"]=asm["_emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_2"];var _emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_4=Module["_emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_4"]=asm["_emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_4"];var _emscripten_bind_btPoint2PointConstraint_enableFeedback_1=Module["_emscripten_bind_btPoint2PointConstraint_enableFeedback_1"]=asm["_emscripten_bind_btPoint2PointConstraint_enableFeedback_1"];var _emscripten_bind_btPoint2PointConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btPoint2PointConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btPoint2PointConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btPoint2PointConstraint_getParam_2=Module["_emscripten_bind_btPoint2PointConstraint_getParam_2"]=asm["_emscripten_bind_btPoint2PointConstraint_getParam_2"];var _emscripten_bind_btPoint2PointConstraint_getPivotInA_0=Module["_emscripten_bind_btPoint2PointConstraint_getPivotInA_0"]=asm["_emscripten_bind_btPoint2PointConstraint_getPivotInA_0"];var _emscripten_bind_btPoint2PointConstraint_getPivotInB_0=Module["_emscripten_bind_btPoint2PointConstraint_getPivotInB_0"]=asm["_emscripten_bind_btPoint2PointConstraint_getPivotInB_0"];var _emscripten_bind_btPoint2PointConstraint_get_m_setting_0=Module["_emscripten_bind_btPoint2PointConstraint_get_m_setting_0"]=asm["_emscripten_bind_btPoint2PointConstraint_get_m_setting_0"];var _emscripten_bind_btPoint2PointConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btPoint2PointConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btPoint2PointConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btPoint2PointConstraint_setParam_3=Module["_emscripten_bind_btPoint2PointConstraint_setParam_3"]=asm["_emscripten_bind_btPoint2PointConstraint_setParam_3"];var _emscripten_bind_btPoint2PointConstraint_setPivotA_1=Module["_emscripten_bind_btPoint2PointConstraint_setPivotA_1"]=asm["_emscripten_bind_btPoint2PointConstraint_setPivotA_1"];var _emscripten_bind_btPoint2PointConstraint_setPivotB_1=Module["_emscripten_bind_btPoint2PointConstraint_setPivotB_1"]=asm["_emscripten_bind_btPoint2PointConstraint_setPivotB_1"];var _emscripten_bind_btPoint2PointConstraint_set_m_setting_1=Module["_emscripten_bind_btPoint2PointConstraint_set_m_setting_1"]=asm["_emscripten_bind_btPoint2PointConstraint_set_m_setting_1"];var _emscripten_bind_btQuadWord___destroy___0=Module["_emscripten_bind_btQuadWord___destroy___0"]=asm["_emscripten_bind_btQuadWord___destroy___0"];var _emscripten_bind_btQuadWord_setW_1=Module["_emscripten_bind_btQuadWord_setW_1"]=asm["_emscripten_bind_btQuadWord_setW_1"];var _emscripten_bind_btQuadWord_setX_1=Module["_emscripten_bind_btQuadWord_setX_1"]=asm["_emscripten_bind_btQuadWord_setX_1"];var _emscripten_bind_btQuadWord_setY_1=Module["_emscripten_bind_btQuadWord_setY_1"]=asm["_emscripten_bind_btQuadWord_setY_1"];var _emscripten_bind_btQuadWord_setZ_1=Module["_emscripten_bind_btQuadWord_setZ_1"]=asm["_emscripten_bind_btQuadWord_setZ_1"];var _emscripten_bind_btQuadWord_w_0=Module["_emscripten_bind_btQuadWord_w_0"]=asm["_emscripten_bind_btQuadWord_w_0"];var _emscripten_bind_btQuadWord_x_0=Module["_emscripten_bind_btQuadWord_x_0"]=asm["_emscripten_bind_btQuadWord_x_0"];var _emscripten_bind_btQuadWord_y_0=Module["_emscripten_bind_btQuadWord_y_0"]=asm["_emscripten_bind_btQuadWord_y_0"];var _emscripten_bind_btQuadWord_z_0=Module["_emscripten_bind_btQuadWord_z_0"]=asm["_emscripten_bind_btQuadWord_z_0"];var _emscripten_bind_btQuaternion___destroy___0=Module["_emscripten_bind_btQuaternion___destroy___0"]=asm["_emscripten_bind_btQuaternion___destroy___0"];var _emscripten_bind_btQuaternion_angleShortestPath_1=Module["_emscripten_bind_btQuaternion_angleShortestPath_1"]=asm["_emscripten_bind_btQuaternion_angleShortestPath_1"];var _emscripten_bind_btQuaternion_angle_1=Module["_emscripten_bind_btQuaternion_angle_1"]=asm["_emscripten_bind_btQuaternion_angle_1"];var _emscripten_bind_btQuaternion_btQuaternion_4=Module["_emscripten_bind_btQuaternion_btQuaternion_4"]=asm["_emscripten_bind_btQuaternion_btQuaternion_4"];var _emscripten_bind_btQuaternion_dot_1=Module["_emscripten_bind_btQuaternion_dot_1"]=asm["_emscripten_bind_btQuaternion_dot_1"];var _emscripten_bind_btQuaternion_getAngleShortestPath_0=Module["_emscripten_bind_btQuaternion_getAngleShortestPath_0"]=asm["_emscripten_bind_btQuaternion_getAngleShortestPath_0"];var _emscripten_bind_btQuaternion_getAngle_0=Module["_emscripten_bind_btQuaternion_getAngle_0"]=asm["_emscripten_bind_btQuaternion_getAngle_0"];var _emscripten_bind_btQuaternion_getAxis_0=Module["_emscripten_bind_btQuaternion_getAxis_0"]=asm["_emscripten_bind_btQuaternion_getAxis_0"];var _emscripten_bind_btQuaternion_inverse_0=Module["_emscripten_bind_btQuaternion_inverse_0"]=asm["_emscripten_bind_btQuaternion_inverse_0"];var _emscripten_bind_btQuaternion_length2_0=Module["_emscripten_bind_btQuaternion_length2_0"]=asm["_emscripten_bind_btQuaternion_length2_0"];var _emscripten_bind_btQuaternion_length_0=Module["_emscripten_bind_btQuaternion_length_0"]=asm["_emscripten_bind_btQuaternion_length_0"];var _emscripten_bind_btQuaternion_normalize_0=Module["_emscripten_bind_btQuaternion_normalize_0"]=asm["_emscripten_bind_btQuaternion_normalize_0"];var _emscripten_bind_btQuaternion_normalized_0=Module["_emscripten_bind_btQuaternion_normalized_0"]=asm["_emscripten_bind_btQuaternion_normalized_0"];var _emscripten_bind_btQuaternion_op_add_1=Module["_emscripten_bind_btQuaternion_op_add_1"]=asm["_emscripten_bind_btQuaternion_op_add_1"];var _emscripten_bind_btQuaternion_op_div_1=Module["_emscripten_bind_btQuaternion_op_div_1"]=asm["_emscripten_bind_btQuaternion_op_div_1"];var _emscripten_bind_btQuaternion_op_mul_1=Module["_emscripten_bind_btQuaternion_op_mul_1"]=asm["_emscripten_bind_btQuaternion_op_mul_1"];var _emscripten_bind_btQuaternion_op_mulq_1=Module["_emscripten_bind_btQuaternion_op_mulq_1"]=asm["_emscripten_bind_btQuaternion_op_mulq_1"];var _emscripten_bind_btQuaternion_op_sub_1=Module["_emscripten_bind_btQuaternion_op_sub_1"]=asm["_emscripten_bind_btQuaternion_op_sub_1"];var _emscripten_bind_btQuaternion_setEulerZYX_3=Module["_emscripten_bind_btQuaternion_setEulerZYX_3"]=asm["_emscripten_bind_btQuaternion_setEulerZYX_3"];var _emscripten_bind_btQuaternion_setEuler_3=Module["_emscripten_bind_btQuaternion_setEuler_3"]=asm["_emscripten_bind_btQuaternion_setEuler_3"];var _emscripten_bind_btQuaternion_setRotation_2=Module["_emscripten_bind_btQuaternion_setRotation_2"]=asm["_emscripten_bind_btQuaternion_setRotation_2"];var _emscripten_bind_btQuaternion_setValue_4=Module["_emscripten_bind_btQuaternion_setValue_4"]=asm["_emscripten_bind_btQuaternion_setValue_4"];var _emscripten_bind_btQuaternion_setW_1=Module["_emscripten_bind_btQuaternion_setW_1"]=asm["_emscripten_bind_btQuaternion_setW_1"];var _emscripten_bind_btQuaternion_setX_1=Module["_emscripten_bind_btQuaternion_setX_1"]=asm["_emscripten_bind_btQuaternion_setX_1"];var _emscripten_bind_btQuaternion_setY_1=Module["_emscripten_bind_btQuaternion_setY_1"]=asm["_emscripten_bind_btQuaternion_setY_1"];var _emscripten_bind_btQuaternion_setZ_1=Module["_emscripten_bind_btQuaternion_setZ_1"]=asm["_emscripten_bind_btQuaternion_setZ_1"];var _emscripten_bind_btQuaternion_w_0=Module["_emscripten_bind_btQuaternion_w_0"]=asm["_emscripten_bind_btQuaternion_w_0"];var _emscripten_bind_btQuaternion_x_0=Module["_emscripten_bind_btQuaternion_x_0"]=asm["_emscripten_bind_btQuaternion_x_0"];var _emscripten_bind_btQuaternion_y_0=Module["_emscripten_bind_btQuaternion_y_0"]=asm["_emscripten_bind_btQuaternion_y_0"];var _emscripten_bind_btQuaternion_z_0=Module["_emscripten_bind_btQuaternion_z_0"]=asm["_emscripten_bind_btQuaternion_z_0"];var _emscripten_bind_btRaycastVehicle___destroy___0=Module["_emscripten_bind_btRaycastVehicle___destroy___0"]=asm["_emscripten_bind_btRaycastVehicle___destroy___0"];var _emscripten_bind_btRaycastVehicle_addWheel_7=Module["_emscripten_bind_btRaycastVehicle_addWheel_7"]=asm["_emscripten_bind_btRaycastVehicle_addWheel_7"];var _emscripten_bind_btRaycastVehicle_applyEngineForce_2=Module["_emscripten_bind_btRaycastVehicle_applyEngineForce_2"]=asm["_emscripten_bind_btRaycastVehicle_applyEngineForce_2"];var _emscripten_bind_btRaycastVehicle_btRaycastVehicle_3=Module["_emscripten_bind_btRaycastVehicle_btRaycastVehicle_3"]=asm["_emscripten_bind_btRaycastVehicle_btRaycastVehicle_3"];var _emscripten_bind_btRaycastVehicle_getChassisWorldTransform_0=Module["_emscripten_bind_btRaycastVehicle_getChassisWorldTransform_0"]=asm["_emscripten_bind_btRaycastVehicle_getChassisWorldTransform_0"];var _emscripten_bind_btRaycastVehicle_getCurrentSpeedKmHour_0=Module["_emscripten_bind_btRaycastVehicle_getCurrentSpeedKmHour_0"]=asm["_emscripten_bind_btRaycastVehicle_getCurrentSpeedKmHour_0"];var _emscripten_bind_btRaycastVehicle_getForwardAxis_0=Module["_emscripten_bind_btRaycastVehicle_getForwardAxis_0"]=asm["_emscripten_bind_btRaycastVehicle_getForwardAxis_0"];var _emscripten_bind_btRaycastVehicle_getForwardVector_0=Module["_emscripten_bind_btRaycastVehicle_getForwardVector_0"]=asm["_emscripten_bind_btRaycastVehicle_getForwardVector_0"];var _emscripten_bind_btRaycastVehicle_getNumWheels_0=Module["_emscripten_bind_btRaycastVehicle_getNumWheels_0"]=asm["_emscripten_bind_btRaycastVehicle_getNumWheels_0"];var _emscripten_bind_btRaycastVehicle_getRightAxis_0=Module["_emscripten_bind_btRaycastVehicle_getRightAxis_0"]=asm["_emscripten_bind_btRaycastVehicle_getRightAxis_0"];var _emscripten_bind_btRaycastVehicle_getRigidBody_0=Module["_emscripten_bind_btRaycastVehicle_getRigidBody_0"]=asm["_emscripten_bind_btRaycastVehicle_getRigidBody_0"];var _emscripten_bind_btRaycastVehicle_getSteeringValue_1=Module["_emscripten_bind_btRaycastVehicle_getSteeringValue_1"]=asm["_emscripten_bind_btRaycastVehicle_getSteeringValue_1"];var _emscripten_bind_btRaycastVehicle_getUpAxis_0=Module["_emscripten_bind_btRaycastVehicle_getUpAxis_0"]=asm["_emscripten_bind_btRaycastVehicle_getUpAxis_0"];var _emscripten_bind_btRaycastVehicle_getUserConstraintId_0=Module["_emscripten_bind_btRaycastVehicle_getUserConstraintId_0"]=asm["_emscripten_bind_btRaycastVehicle_getUserConstraintId_0"];var _emscripten_bind_btRaycastVehicle_getUserConstraintType_0=Module["_emscripten_bind_btRaycastVehicle_getUserConstraintType_0"]=asm["_emscripten_bind_btRaycastVehicle_getUserConstraintType_0"];var _emscripten_bind_btRaycastVehicle_getWheelInfo_1=Module["_emscripten_bind_btRaycastVehicle_getWheelInfo_1"]=asm["_emscripten_bind_btRaycastVehicle_getWheelInfo_1"];var _emscripten_bind_btRaycastVehicle_getWheelTransformWS_1=Module["_emscripten_bind_btRaycastVehicle_getWheelTransformWS_1"]=asm["_emscripten_bind_btRaycastVehicle_getWheelTransformWS_1"];var _emscripten_bind_btRaycastVehicle_rayCast_1=Module["_emscripten_bind_btRaycastVehicle_rayCast_1"]=asm["_emscripten_bind_btRaycastVehicle_rayCast_1"];var _emscripten_bind_btRaycastVehicle_resetSuspension_0=Module["_emscripten_bind_btRaycastVehicle_resetSuspension_0"]=asm["_emscripten_bind_btRaycastVehicle_resetSuspension_0"];var _emscripten_bind_btRaycastVehicle_setBrake_2=Module["_emscripten_bind_btRaycastVehicle_setBrake_2"]=asm["_emscripten_bind_btRaycastVehicle_setBrake_2"];var _emscripten_bind_btRaycastVehicle_setCoordinateSystem_3=Module["_emscripten_bind_btRaycastVehicle_setCoordinateSystem_3"]=asm["_emscripten_bind_btRaycastVehicle_setCoordinateSystem_3"];var _emscripten_bind_btRaycastVehicle_setPitchControl_1=Module["_emscripten_bind_btRaycastVehicle_setPitchControl_1"]=asm["_emscripten_bind_btRaycastVehicle_setPitchControl_1"];var _emscripten_bind_btRaycastVehicle_setSteeringValue_2=Module["_emscripten_bind_btRaycastVehicle_setSteeringValue_2"]=asm["_emscripten_bind_btRaycastVehicle_setSteeringValue_2"];var _emscripten_bind_btRaycastVehicle_setUserConstraintId_1=Module["_emscripten_bind_btRaycastVehicle_setUserConstraintId_1"]=asm["_emscripten_bind_btRaycastVehicle_setUserConstraintId_1"];var _emscripten_bind_btRaycastVehicle_setUserConstraintType_1=Module["_emscripten_bind_btRaycastVehicle_setUserConstraintType_1"]=asm["_emscripten_bind_btRaycastVehicle_setUserConstraintType_1"];var _emscripten_bind_btRaycastVehicle_updateAction_2=Module["_emscripten_bind_btRaycastVehicle_updateAction_2"]=asm["_emscripten_bind_btRaycastVehicle_updateAction_2"];var _emscripten_bind_btRaycastVehicle_updateFriction_1=Module["_emscripten_bind_btRaycastVehicle_updateFriction_1"]=asm["_emscripten_bind_btRaycastVehicle_updateFriction_1"];var _emscripten_bind_btRaycastVehicle_updateSuspension_1=Module["_emscripten_bind_btRaycastVehicle_updateSuspension_1"]=asm["_emscripten_bind_btRaycastVehicle_updateSuspension_1"];var _emscripten_bind_btRaycastVehicle_updateVehicle_1=Module["_emscripten_bind_btRaycastVehicle_updateVehicle_1"]=asm["_emscripten_bind_btRaycastVehicle_updateVehicle_1"];var _emscripten_bind_btRaycastVehicle_updateWheelTransform_2=Module["_emscripten_bind_btRaycastVehicle_updateWheelTransform_2"]=asm["_emscripten_bind_btRaycastVehicle_updateWheelTransform_2"];var _emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_1=Module["_emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_1"]=asm["_emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_1"];var _emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_2=Module["_emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_2"]=asm["_emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_2"];var _emscripten_bind_btRigidBodyConstructionInfo___destroy___0=Module["_emscripten_bind_btRigidBodyConstructionInfo___destroy___0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo___destroy___0"];var _emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_3=Module["_emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_3"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_3"];var _emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_4=Module["_emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_4"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_4"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingFactor_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingFactor_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingFactor_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingThresholdSqr_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingThresholdSqr_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingThresholdSqr_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDampingFactor_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDampingFactor_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDampingFactor_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDamping_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDamping_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDamping_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalLinearDampingThresholdSqr_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalLinearDampingThresholdSqr_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalLinearDampingThresholdSqr_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_angularDamping_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_angularDamping_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_angularDamping_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_angularSleepingThreshold_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_angularSleepingThreshold_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_angularSleepingThreshold_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_friction_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_friction_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_friction_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_linearDamping_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_linearDamping_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_linearDamping_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_linearSleepingThreshold_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_linearSleepingThreshold_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_linearSleepingThreshold_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_restitution_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_restitution_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_restitution_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_rollingFriction_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_rollingFriction_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_rollingFriction_0"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingFactor_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingFactor_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingFactor_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingThresholdSqr_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingThresholdSqr_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingThresholdSqr_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDampingFactor_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDampingFactor_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDampingFactor_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDamping_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDamping_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDamping_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalLinearDampingThresholdSqr_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalLinearDampingThresholdSqr_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalLinearDampingThresholdSqr_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_angularDamping_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_angularDamping_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_angularDamping_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_angularSleepingThreshold_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_angularSleepingThreshold_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_angularSleepingThreshold_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_friction_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_friction_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_friction_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_linearDamping_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_linearDamping_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_linearDamping_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_linearSleepingThreshold_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_linearSleepingThreshold_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_linearSleepingThreshold_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_restitution_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_restitution_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_restitution_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_rollingFriction_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_rollingFriction_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_rollingFriction_1"];var _emscripten_bind_btRigidBody___destroy___0=Module["_emscripten_bind_btRigidBody___destroy___0"]=asm["_emscripten_bind_btRigidBody___destroy___0"];var _emscripten_bind_btRigidBody_activate_0=Module["_emscripten_bind_btRigidBody_activate_0"]=asm["_emscripten_bind_btRigidBody_activate_0"];var _emscripten_bind_btRigidBody_activate_1=Module["_emscripten_bind_btRigidBody_activate_1"]=asm["_emscripten_bind_btRigidBody_activate_1"];var _emscripten_bind_btRigidBody_applyCentralForce_1=Module["_emscripten_bind_btRigidBody_applyCentralForce_1"]=asm["_emscripten_bind_btRigidBody_applyCentralForce_1"];var _emscripten_bind_btRigidBody_applyCentralImpulse_1=Module["_emscripten_bind_btRigidBody_applyCentralImpulse_1"]=asm["_emscripten_bind_btRigidBody_applyCentralImpulse_1"];var _emscripten_bind_btRigidBody_applyForce_2=Module["_emscripten_bind_btRigidBody_applyForce_2"]=asm["_emscripten_bind_btRigidBody_applyForce_2"];var _emscripten_bind_btRigidBody_applyGravity_0=Module["_emscripten_bind_btRigidBody_applyGravity_0"]=asm["_emscripten_bind_btRigidBody_applyGravity_0"];var _emscripten_bind_btRigidBody_applyImpulse_2=Module["_emscripten_bind_btRigidBody_applyImpulse_2"]=asm["_emscripten_bind_btRigidBody_applyImpulse_2"];var _emscripten_bind_btRigidBody_applyTorqueImpulse_1=Module["_emscripten_bind_btRigidBody_applyTorqueImpulse_1"]=asm["_emscripten_bind_btRigidBody_applyTorqueImpulse_1"];var _emscripten_bind_btRigidBody_applyTorque_1=Module["_emscripten_bind_btRigidBody_applyTorque_1"]=asm["_emscripten_bind_btRigidBody_applyTorque_1"];var _emscripten_bind_btRigidBody_btRigidBody_1=Module["_emscripten_bind_btRigidBody_btRigidBody_1"]=asm["_emscripten_bind_btRigidBody_btRigidBody_1"];var _emscripten_bind_btRigidBody_forceActivationState_1=Module["_emscripten_bind_btRigidBody_forceActivationState_1"]=asm["_emscripten_bind_btRigidBody_forceActivationState_1"];var _emscripten_bind_btRigidBody_getAabb_2=Module["_emscripten_bind_btRigidBody_getAabb_2"]=asm["_emscripten_bind_btRigidBody_getAabb_2"];var _emscripten_bind_btRigidBody_getAngularVelocity_0=Module["_emscripten_bind_btRigidBody_getAngularVelocity_0"]=asm["_emscripten_bind_btRigidBody_getAngularVelocity_0"];var _emscripten_bind_btRigidBody_getCenterOfMassTransform_0=Module["_emscripten_bind_btRigidBody_getCenterOfMassTransform_0"]=asm["_emscripten_bind_btRigidBody_getCenterOfMassTransform_0"];var _emscripten_bind_btRigidBody_getCollisionFlags_0=Module["_emscripten_bind_btRigidBody_getCollisionFlags_0"]=asm["_emscripten_bind_btRigidBody_getCollisionFlags_0"];var _emscripten_bind_btRigidBody_getCollisionShape_0=Module["_emscripten_bind_btRigidBody_getCollisionShape_0"]=asm["_emscripten_bind_btRigidBody_getCollisionShape_0"];var _emscripten_bind_btRigidBody_getGravity_0=Module["_emscripten_bind_btRigidBody_getGravity_0"]=asm["_emscripten_bind_btRigidBody_getGravity_0"];var _emscripten_bind_btRigidBody_getLinearVelocity_0=Module["_emscripten_bind_btRigidBody_getLinearVelocity_0"]=asm["_emscripten_bind_btRigidBody_getLinearVelocity_0"];var _emscripten_bind_btRigidBody_getMotionState_0=Module["_emscripten_bind_btRigidBody_getMotionState_0"]=asm["_emscripten_bind_btRigidBody_getMotionState_0"];var _emscripten_bind_btRigidBody_getUserIndex_0=Module["_emscripten_bind_btRigidBody_getUserIndex_0"]=asm["_emscripten_bind_btRigidBody_getUserIndex_0"];var _emscripten_bind_btRigidBody_getUserPointer_0=Module["_emscripten_bind_btRigidBody_getUserPointer_0"]=asm["_emscripten_bind_btRigidBody_getUserPointer_0"];var _emscripten_bind_btRigidBody_getWorldTransform_0=Module["_emscripten_bind_btRigidBody_getWorldTransform_0"]=asm["_emscripten_bind_btRigidBody_getWorldTransform_0"];var _emscripten_bind_btRigidBody_isActive_0=Module["_emscripten_bind_btRigidBody_isActive_0"]=asm["_emscripten_bind_btRigidBody_isActive_0"];var _emscripten_bind_btRigidBody_isKinematicObject_0=Module["_emscripten_bind_btRigidBody_isKinematicObject_0"]=asm["_emscripten_bind_btRigidBody_isKinematicObject_0"];var _emscripten_bind_btRigidBody_isStaticObject_0=Module["_emscripten_bind_btRigidBody_isStaticObject_0"]=asm["_emscripten_bind_btRigidBody_isStaticObject_0"];var _emscripten_bind_btRigidBody_isStaticOrKinematicObject_0=Module["_emscripten_bind_btRigidBody_isStaticOrKinematicObject_0"]=asm["_emscripten_bind_btRigidBody_isStaticOrKinematicObject_0"];var _emscripten_bind_btRigidBody_setActivationState_1=Module["_emscripten_bind_btRigidBody_setActivationState_1"]=asm["_emscripten_bind_btRigidBody_setActivationState_1"];var _emscripten_bind_btRigidBody_setAngularFactor_1=Module["_emscripten_bind_btRigidBody_setAngularFactor_1"]=asm["_emscripten_bind_btRigidBody_setAngularFactor_1"];var _emscripten_bind_btRigidBody_setAngularVelocity_1=Module["_emscripten_bind_btRigidBody_setAngularVelocity_1"]=asm["_emscripten_bind_btRigidBody_setAngularVelocity_1"];var _emscripten_bind_btRigidBody_setAnisotropicFriction_2=Module["_emscripten_bind_btRigidBody_setAnisotropicFriction_2"]=asm["_emscripten_bind_btRigidBody_setAnisotropicFriction_2"];var _emscripten_bind_btRigidBody_setCcdMotionThreshold_1=Module["_emscripten_bind_btRigidBody_setCcdMotionThreshold_1"]=asm["_emscripten_bind_btRigidBody_setCcdMotionThreshold_1"];var _emscripten_bind_btRigidBody_setCcdSweptSphereRadius_1=Module["_emscripten_bind_btRigidBody_setCcdSweptSphereRadius_1"]=asm["_emscripten_bind_btRigidBody_setCcdSweptSphereRadius_1"];var _emscripten_bind_btRigidBody_setCenterOfMassTransform_1=Module["_emscripten_bind_btRigidBody_setCenterOfMassTransform_1"]=asm["_emscripten_bind_btRigidBody_setCenterOfMassTransform_1"];var _emscripten_bind_btRigidBody_setCollisionFlags_1=Module["_emscripten_bind_btRigidBody_setCollisionFlags_1"]=asm["_emscripten_bind_btRigidBody_setCollisionFlags_1"];var _emscripten_bind_btRigidBody_setCollisionShape_1=Module["_emscripten_bind_btRigidBody_setCollisionShape_1"]=asm["_emscripten_bind_btRigidBody_setCollisionShape_1"];var _emscripten_bind_btRigidBody_setContactProcessingThreshold_1=Module["_emscripten_bind_btRigidBody_setContactProcessingThreshold_1"]=asm["_emscripten_bind_btRigidBody_setContactProcessingThreshold_1"];var _emscripten_bind_btRigidBody_setDamping_2=Module["_emscripten_bind_btRigidBody_setDamping_2"]=asm["_emscripten_bind_btRigidBody_setDamping_2"];var _emscripten_bind_btRigidBody_setFriction_1=Module["_emscripten_bind_btRigidBody_setFriction_1"]=asm["_emscripten_bind_btRigidBody_setFriction_1"];var _emscripten_bind_btRigidBody_setGravity_1=Module["_emscripten_bind_btRigidBody_setGravity_1"]=asm["_emscripten_bind_btRigidBody_setGravity_1"];var _emscripten_bind_btRigidBody_setLinearFactor_1=Module["_emscripten_bind_btRigidBody_setLinearFactor_1"]=asm["_emscripten_bind_btRigidBody_setLinearFactor_1"];var _emscripten_bind_btRigidBody_setLinearVelocity_1=Module["_emscripten_bind_btRigidBody_setLinearVelocity_1"]=asm["_emscripten_bind_btRigidBody_setLinearVelocity_1"];var _emscripten_bind_btRigidBody_setMassProps_2=Module["_emscripten_bind_btRigidBody_setMassProps_2"]=asm["_emscripten_bind_btRigidBody_setMassProps_2"];var _emscripten_bind_btRigidBody_setMotionState_1=Module["_emscripten_bind_btRigidBody_setMotionState_1"]=asm["_emscripten_bind_btRigidBody_setMotionState_1"];var _emscripten_bind_btRigidBody_setRestitution_1=Module["_emscripten_bind_btRigidBody_setRestitution_1"]=asm["_emscripten_bind_btRigidBody_setRestitution_1"];var _emscripten_bind_btRigidBody_setRollingFriction_1=Module["_emscripten_bind_btRigidBody_setRollingFriction_1"]=asm["_emscripten_bind_btRigidBody_setRollingFriction_1"];var _emscripten_bind_btRigidBody_setSleepingThresholds_2=Module["_emscripten_bind_btRigidBody_setSleepingThresholds_2"]=asm["_emscripten_bind_btRigidBody_setSleepingThresholds_2"];var _emscripten_bind_btRigidBody_setUserIndex_1=Module["_emscripten_bind_btRigidBody_setUserIndex_1"]=asm["_emscripten_bind_btRigidBody_setUserIndex_1"];var _emscripten_bind_btRigidBody_setUserPointer_1=Module["_emscripten_bind_btRigidBody_setUserPointer_1"]=asm["_emscripten_bind_btRigidBody_setUserPointer_1"];var _emscripten_bind_btRigidBody_setWorldTransform_1=Module["_emscripten_bind_btRigidBody_setWorldTransform_1"]=asm["_emscripten_bind_btRigidBody_setWorldTransform_1"];var _emscripten_bind_btRigidBody_upcast_1=Module["_emscripten_bind_btRigidBody_upcast_1"]=asm["_emscripten_bind_btRigidBody_upcast_1"];var _emscripten_bind_btRigidBody_updateInertiaTensor_0=Module["_emscripten_bind_btRigidBody_updateInertiaTensor_0"]=asm["_emscripten_bind_btRigidBody_updateInertiaTensor_0"];var _emscripten_bind_btRotationalLimitMotor___destroy___0=Module["_emscripten_bind_btRotationalLimitMotor___destroy___0"]=asm["_emscripten_bind_btRotationalLimitMotor___destroy___0"];var _emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_0=Module["_emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_0"]=asm["_emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_0"];var _emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_1=Module["_emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_1"]=asm["_emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_1"];var _emscripten_bind_btRotationalLimitMotor_get_m_enableMotor_0=Module["_emscripten_bind_btRotationalLimitMotor_get_m_enableMotor_0"]=asm["_emscripten_bind_btRotationalLimitMotor_get_m_enableMotor_0"];var _emscripten_bind_btRotationalLimitMotor_get_m_hiLimit_0=Module["_emscripten_bind_btRotationalLimitMotor_get_m_hiLimit_0"]=asm["_emscripten_bind_btRotationalLimitMotor_get_m_hiLimit_0"];var _emscripten_bind_btRotationalLimitMotor_get_m_loLimit_0=Module["_emscripten_bind_btRotationalLimitMotor_get_m_loLimit_0"]=asm["_emscripten_bind_btRotationalLimitMotor_get_m_loLimit_0"];var _emscripten_bind_btRotationalLimitMotor_get_m_maxMotorForce_0=Module["_emscripten_bind_btRotationalLimitMotor_get_m_maxMotorForce_0"]=asm["_emscripten_bind_btRotationalLimitMotor_get_m_maxMotorForce_0"];var _emscripten_bind_btRotationalLimitMotor_get_m_targetVelocity_0=Module["_emscripten_bind_btRotationalLimitMotor_get_m_targetVelocity_0"]=asm["_emscripten_bind_btRotationalLimitMotor_get_m_targetVelocity_0"];var _emscripten_bind_btRotationalLimitMotor_isLimited_0=Module["_emscripten_bind_btRotationalLimitMotor_isLimited_0"]=asm["_emscripten_bind_btRotationalLimitMotor_isLimited_0"];var _emscripten_bind_btRotationalLimitMotor_needApplyTorques_0=Module["_emscripten_bind_btRotationalLimitMotor_needApplyTorques_0"]=asm["_emscripten_bind_btRotationalLimitMotor_needApplyTorques_0"];var _emscripten_bind_btRotationalLimitMotor_set_m_enableMotor_1=Module["_emscripten_bind_btRotationalLimitMotor_set_m_enableMotor_1"]=asm["_emscripten_bind_btRotationalLimitMotor_set_m_enableMotor_1"];var _emscripten_bind_btRotationalLimitMotor_set_m_hiLimit_1=Module["_emscripten_bind_btRotationalLimitMotor_set_m_hiLimit_1"]=asm["_emscripten_bind_btRotationalLimitMotor_set_m_hiLimit_1"];var _emscripten_bind_btRotationalLimitMotor_set_m_loLimit_1=Module["_emscripten_bind_btRotationalLimitMotor_set_m_loLimit_1"]=asm["_emscripten_bind_btRotationalLimitMotor_set_m_loLimit_1"];var _emscripten_bind_btRotationalLimitMotor_set_m_maxMotorForce_1=Module["_emscripten_bind_btRotationalLimitMotor_set_m_maxMotorForce_1"]=asm["_emscripten_bind_btRotationalLimitMotor_set_m_maxMotorForce_1"];var _emscripten_bind_btRotationalLimitMotor_set_m_targetVelocity_1=Module["_emscripten_bind_btRotationalLimitMotor_set_m_targetVelocity_1"]=asm["_emscripten_bind_btRotationalLimitMotor_set_m_targetVelocity_1"];var _emscripten_bind_btSequentialImpulseConstraintSolver___destroy___0=Module["_emscripten_bind_btSequentialImpulseConstraintSolver___destroy___0"]=asm["_emscripten_bind_btSequentialImpulseConstraintSolver___destroy___0"];var _emscripten_bind_btSequentialImpulseConstraintSolver_btSequentialImpulseConstraintSolver_0=Module["_emscripten_bind_btSequentialImpulseConstraintSolver_btSequentialImpulseConstraintSolver_0"]=asm["_emscripten_bind_btSequentialImpulseConstraintSolver_btSequentialImpulseConstraintSolver_0"];var _emscripten_bind_btSliderConstraint___destroy___0=Module["_emscripten_bind_btSliderConstraint___destroy___0"]=asm["_emscripten_bind_btSliderConstraint___destroy___0"];var _emscripten_bind_btSliderConstraint_btSliderConstraint_3=Module["_emscripten_bind_btSliderConstraint_btSliderConstraint_3"]=asm["_emscripten_bind_btSliderConstraint_btSliderConstraint_3"];var _emscripten_bind_btSliderConstraint_btSliderConstraint_5=Module["_emscripten_bind_btSliderConstraint_btSliderConstraint_5"]=asm["_emscripten_bind_btSliderConstraint_btSliderConstraint_5"];var _emscripten_bind_btSliderConstraint_enableFeedback_1=Module["_emscripten_bind_btSliderConstraint_enableFeedback_1"]=asm["_emscripten_bind_btSliderConstraint_enableFeedback_1"];var _emscripten_bind_btSliderConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btSliderConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btSliderConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btSliderConstraint_getParam_2=Module["_emscripten_bind_btSliderConstraint_getParam_2"]=asm["_emscripten_bind_btSliderConstraint_getParam_2"];var _emscripten_bind_btSliderConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btSliderConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btSliderConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btSliderConstraint_setLowerAngLimit_1=Module["_emscripten_bind_btSliderConstraint_setLowerAngLimit_1"]=asm["_emscripten_bind_btSliderConstraint_setLowerAngLimit_1"];var _emscripten_bind_btSliderConstraint_setLowerLinLimit_1=Module["_emscripten_bind_btSliderConstraint_setLowerLinLimit_1"]=asm["_emscripten_bind_btSliderConstraint_setLowerLinLimit_1"];var _emscripten_bind_btSliderConstraint_setParam_3=Module["_emscripten_bind_btSliderConstraint_setParam_3"]=asm["_emscripten_bind_btSliderConstraint_setParam_3"];var _emscripten_bind_btSliderConstraint_setUpperAngLimit_1=Module["_emscripten_bind_btSliderConstraint_setUpperAngLimit_1"]=asm["_emscripten_bind_btSliderConstraint_setUpperAngLimit_1"];var _emscripten_bind_btSliderConstraint_setUpperLinLimit_1=Module["_emscripten_bind_btSliderConstraint_setUpperLinLimit_1"]=asm["_emscripten_bind_btSliderConstraint_setUpperLinLimit_1"];var _emscripten_bind_btSoftBodyArray___destroy___0=Module["_emscripten_bind_btSoftBodyArray___destroy___0"]=asm["_emscripten_bind_btSoftBodyArray___destroy___0"];var _emscripten_bind_btSoftBodyArray_at_1=Module["_emscripten_bind_btSoftBodyArray_at_1"]=asm["_emscripten_bind_btSoftBodyArray_at_1"];var _emscripten_bind_btSoftBodyArray_size_0=Module["_emscripten_bind_btSoftBodyArray_size_0"]=asm["_emscripten_bind_btSoftBodyArray_size_0"];var _emscripten_bind_btSoftBodyHelpers_CreateEllipsoid_4=Module["_emscripten_bind_btSoftBodyHelpers_CreateEllipsoid_4"]=asm["_emscripten_bind_btSoftBodyHelpers_CreateEllipsoid_4"];var _emscripten_bind_btSoftBodyHelpers_CreateFromConvexHull_4=Module["_emscripten_bind_btSoftBodyHelpers_CreateFromConvexHull_4"]=asm["_emscripten_bind_btSoftBodyHelpers_CreateFromConvexHull_4"];var _emscripten_bind_btSoftBodyHelpers_CreateFromTriMesh_5=Module["_emscripten_bind_btSoftBodyHelpers_CreateFromTriMesh_5"]=asm["_emscripten_bind_btSoftBodyHelpers_CreateFromTriMesh_5"];var _emscripten_bind_btSoftBodyHelpers_CreatePatchUV_10=Module["_emscripten_bind_btSoftBodyHelpers_CreatePatchUV_10"]=asm["_emscripten_bind_btSoftBodyHelpers_CreatePatchUV_10"];var _emscripten_bind_btSoftBodyHelpers_CreatePatch_9=Module["_emscripten_bind_btSoftBodyHelpers_CreatePatch_9"]=asm["_emscripten_bind_btSoftBodyHelpers_CreatePatch_9"];var _emscripten_bind_btSoftBodyHelpers_CreateRope_5=Module["_emscripten_bind_btSoftBodyHelpers_CreateRope_5"]=asm["_emscripten_bind_btSoftBodyHelpers_CreateRope_5"];var _emscripten_bind_btSoftBodyHelpers___destroy___0=Module["_emscripten_bind_btSoftBodyHelpers___destroy___0"]=asm["_emscripten_bind_btSoftBodyHelpers___destroy___0"];var _emscripten_bind_btSoftBodyHelpers_btSoftBodyHelpers_0=Module["_emscripten_bind_btSoftBodyHelpers_btSoftBodyHelpers_0"]=asm["_emscripten_bind_btSoftBodyHelpers_btSoftBodyHelpers_0"];var _emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration___destroy___0=Module["_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration___destroy___0"]=asm["_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration___destroy___0"];var _emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_0=Module["_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_0"]=asm["_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_0"];var _emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_1=Module["_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_1"]=asm["_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_1"];var _emscripten_bind_btSoftBodySolver___destroy___0=Module["_emscripten_bind_btSoftBodySolver___destroy___0"]=asm["_emscripten_bind_btSoftBodySolver___destroy___0"];var _emscripten_bind_btSoftBodyWorldInfo___destroy___0=Module["_emscripten_bind_btSoftBodyWorldInfo___destroy___0"]=asm["_emscripten_bind_btSoftBodyWorldInfo___destroy___0"];var _emscripten_bind_btSoftBodyWorldInfo_btSoftBodyWorldInfo_0=Module["_emscripten_bind_btSoftBodyWorldInfo_btSoftBodyWorldInfo_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_btSoftBodyWorldInfo_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_air_density_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_air_density_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_air_density_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_m_broadphase_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_m_broadphase_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_m_broadphase_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_m_dispatcher_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_m_dispatcher_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_m_dispatcher_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_m_gravity_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_m_gravity_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_m_gravity_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_m_maxDisplacement_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_m_maxDisplacement_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_m_maxDisplacement_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_water_density_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_water_density_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_water_density_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_water_normal_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_water_normal_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_water_normal_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_water_offset_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_water_offset_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_water_offset_0"];var _emscripten_bind_btSoftBodyWorldInfo_set_air_density_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_air_density_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_air_density_1"];var _emscripten_bind_btSoftBodyWorldInfo_set_m_broadphase_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_m_broadphase_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_m_broadphase_1"];var _emscripten_bind_btSoftBodyWorldInfo_set_m_dispatcher_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_m_dispatcher_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_m_dispatcher_1"];var _emscripten_bind_btSoftBodyWorldInfo_set_m_gravity_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_m_gravity_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_m_gravity_1"];var _emscripten_bind_btSoftBodyWorldInfo_set_m_maxDisplacement_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_m_maxDisplacement_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_m_maxDisplacement_1"];var _emscripten_bind_btSoftBodyWorldInfo_set_water_density_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_water_density_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_water_density_1"];var _emscripten_bind_btSoftBodyWorldInfo_set_water_normal_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_water_normal_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_water_normal_1"];var _emscripten_bind_btSoftBodyWorldInfo_set_water_offset_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_water_offset_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_water_offset_1"];var _emscripten_bind_btSoftBody___destroy___0=Module["_emscripten_bind_btSoftBody___destroy___0"]=asm["_emscripten_bind_btSoftBody___destroy___0"];var _emscripten_bind_btSoftBody_activate_0=Module["_emscripten_bind_btSoftBody_activate_0"]=asm["_emscripten_bind_btSoftBody_activate_0"];var _emscripten_bind_btSoftBody_activate_1=Module["_emscripten_bind_btSoftBody_activate_1"]=asm["_emscripten_bind_btSoftBody_activate_1"];var _emscripten_bind_btSoftBody_appendAnchor_4=Module["_emscripten_bind_btSoftBody_appendAnchor_4"]=asm["_emscripten_bind_btSoftBody_appendAnchor_4"];var _emscripten_bind_btSoftBody_appendFace_4=Module["_emscripten_bind_btSoftBody_appendFace_4"]=asm["_emscripten_bind_btSoftBody_appendFace_4"];var _emscripten_bind_btSoftBody_appendLinearJoint_2=Module["_emscripten_bind_btSoftBody_appendLinearJoint_2"]=asm["_emscripten_bind_btSoftBody_appendLinearJoint_2"];var _emscripten_bind_btSoftBody_appendLink_4=Module["_emscripten_bind_btSoftBody_appendLink_4"]=asm["_emscripten_bind_btSoftBody_appendLink_4"];var _emscripten_bind_btSoftBody_appendMaterial_0=Module["_emscripten_bind_btSoftBody_appendMaterial_0"]=asm["_emscripten_bind_btSoftBody_appendMaterial_0"];var _emscripten_bind_btSoftBody_appendNode_2=Module["_emscripten_bind_btSoftBody_appendNode_2"]=asm["_emscripten_bind_btSoftBody_appendNode_2"];var _emscripten_bind_btSoftBody_appendTetra_5=Module["_emscripten_bind_btSoftBody_appendTetra_5"]=asm["_emscripten_bind_btSoftBody_appendTetra_5"];var _emscripten_bind_btSoftBody_btSoftBody_4=Module["_emscripten_bind_btSoftBody_btSoftBody_4"]=asm["_emscripten_bind_btSoftBody_btSoftBody_4"];var _emscripten_bind_btSoftBody_checkFace_3=Module["_emscripten_bind_btSoftBody_checkFace_3"]=asm["_emscripten_bind_btSoftBody_checkFace_3"];var _emscripten_bind_btSoftBody_checkLink_2=Module["_emscripten_bind_btSoftBody_checkLink_2"]=asm["_emscripten_bind_btSoftBody_checkLink_2"];var _emscripten_bind_btSoftBody_forceActivationState_1=Module["_emscripten_bind_btSoftBody_forceActivationState_1"]=asm["_emscripten_bind_btSoftBody_forceActivationState_1"];var _emscripten_bind_btSoftBody_generateBendingConstraints_2=Module["_emscripten_bind_btSoftBody_generateBendingConstraints_2"]=asm["_emscripten_bind_btSoftBody_generateBendingConstraints_2"];var _emscripten_bind_btSoftBody_generateClusters_1=Module["_emscripten_bind_btSoftBody_generateClusters_1"]=asm["_emscripten_bind_btSoftBody_generateClusters_1"];var _emscripten_bind_btSoftBody_generateClusters_2=Module["_emscripten_bind_btSoftBody_generateClusters_2"]=asm["_emscripten_bind_btSoftBody_generateClusters_2"];var _emscripten_bind_btSoftBody_getCollisionFlags_0=Module["_emscripten_bind_btSoftBody_getCollisionFlags_0"]=asm["_emscripten_bind_btSoftBody_getCollisionFlags_0"];var _emscripten_bind_btSoftBody_getCollisionShape_0=Module["_emscripten_bind_btSoftBody_getCollisionShape_0"]=asm["_emscripten_bind_btSoftBody_getCollisionShape_0"];var _emscripten_bind_btSoftBody_getTotalMass_0=Module["_emscripten_bind_btSoftBody_getTotalMass_0"]=asm["_emscripten_bind_btSoftBody_getTotalMass_0"];var _emscripten_bind_btSoftBody_getUserIndex_0=Module["_emscripten_bind_btSoftBody_getUserIndex_0"]=asm["_emscripten_bind_btSoftBody_getUserIndex_0"];var _emscripten_bind_btSoftBody_getUserPointer_0=Module["_emscripten_bind_btSoftBody_getUserPointer_0"]=asm["_emscripten_bind_btSoftBody_getUserPointer_0"];var _emscripten_bind_btSoftBody_getWorldTransform_0=Module["_emscripten_bind_btSoftBody_getWorldTransform_0"]=asm["_emscripten_bind_btSoftBody_getWorldTransform_0"];var _emscripten_bind_btSoftBody_get_m_anchors_0=Module["_emscripten_bind_btSoftBody_get_m_anchors_0"]=asm["_emscripten_bind_btSoftBody_get_m_anchors_0"];var _emscripten_bind_btSoftBody_get_m_cfg_0=Module["_emscripten_bind_btSoftBody_get_m_cfg_0"]=asm["_emscripten_bind_btSoftBody_get_m_cfg_0"];var _emscripten_bind_btSoftBody_get_m_faces_0=Module["_emscripten_bind_btSoftBody_get_m_faces_0"]=asm["_emscripten_bind_btSoftBody_get_m_faces_0"];var _emscripten_bind_btSoftBody_get_m_links_0=Module["_emscripten_bind_btSoftBody_get_m_links_0"]=asm["_emscripten_bind_btSoftBody_get_m_links_0"];var _emscripten_bind_btSoftBody_get_m_materials_0=Module["_emscripten_bind_btSoftBody_get_m_materials_0"]=asm["_emscripten_bind_btSoftBody_get_m_materials_0"];var _emscripten_bind_btSoftBody_get_m_nodes_0=Module["_emscripten_bind_btSoftBody_get_m_nodes_0"]=asm["_emscripten_bind_btSoftBody_get_m_nodes_0"];var _emscripten_bind_btSoftBody_isActive_0=Module["_emscripten_bind_btSoftBody_isActive_0"]=asm["_emscripten_bind_btSoftBody_isActive_0"];var _emscripten_bind_btSoftBody_isKinematicObject_0=Module["_emscripten_bind_btSoftBody_isKinematicObject_0"]=asm["_emscripten_bind_btSoftBody_isKinematicObject_0"];var _emscripten_bind_btSoftBody_isStaticObject_0=Module["_emscripten_bind_btSoftBody_isStaticObject_0"]=asm["_emscripten_bind_btSoftBody_isStaticObject_0"];var _emscripten_bind_btSoftBody_isStaticOrKinematicObject_0=Module["_emscripten_bind_btSoftBody_isStaticOrKinematicObject_0"]=asm["_emscripten_bind_btSoftBody_isStaticOrKinematicObject_0"];var _emscripten_bind_btSoftBody_rotate_1=Module["_emscripten_bind_btSoftBody_rotate_1"]=asm["_emscripten_bind_btSoftBody_rotate_1"];var _emscripten_bind_btSoftBody_scale_1=Module["_emscripten_bind_btSoftBody_scale_1"]=asm["_emscripten_bind_btSoftBody_scale_1"];var _emscripten_bind_btSoftBody_setActivationState_1=Module["_emscripten_bind_btSoftBody_setActivationState_1"]=asm["_emscripten_bind_btSoftBody_setActivationState_1"];var _emscripten_bind_btSoftBody_setAnisotropicFriction_2=Module["_emscripten_bind_btSoftBody_setAnisotropicFriction_2"]=asm["_emscripten_bind_btSoftBody_setAnisotropicFriction_2"];var _emscripten_bind_btSoftBody_setCcdMotionThreshold_1=Module["_emscripten_bind_btSoftBody_setCcdMotionThreshold_1"]=asm["_emscripten_bind_btSoftBody_setCcdMotionThreshold_1"];var _emscripten_bind_btSoftBody_setCcdSweptSphereRadius_1=Module["_emscripten_bind_btSoftBody_setCcdSweptSphereRadius_1"]=asm["_emscripten_bind_btSoftBody_setCcdSweptSphereRadius_1"];var _emscripten_bind_btSoftBody_setCollisionFlags_1=Module["_emscripten_bind_btSoftBody_setCollisionFlags_1"]=asm["_emscripten_bind_btSoftBody_setCollisionFlags_1"];var _emscripten_bind_btSoftBody_setCollisionShape_1=Module["_emscripten_bind_btSoftBody_setCollisionShape_1"]=asm["_emscripten_bind_btSoftBody_setCollisionShape_1"];var _emscripten_bind_btSoftBody_setContactProcessingThreshold_1=Module["_emscripten_bind_btSoftBody_setContactProcessingThreshold_1"]=asm["_emscripten_bind_btSoftBody_setContactProcessingThreshold_1"];var _emscripten_bind_btSoftBody_setFriction_1=Module["_emscripten_bind_btSoftBody_setFriction_1"]=asm["_emscripten_bind_btSoftBody_setFriction_1"];var _emscripten_bind_btSoftBody_setMass_2=Module["_emscripten_bind_btSoftBody_setMass_2"]=asm["_emscripten_bind_btSoftBody_setMass_2"];var _emscripten_bind_btSoftBody_setRestitution_1=Module["_emscripten_bind_btSoftBody_setRestitution_1"]=asm["_emscripten_bind_btSoftBody_setRestitution_1"];var _emscripten_bind_btSoftBody_setRollingFriction_1=Module["_emscripten_bind_btSoftBody_setRollingFriction_1"]=asm["_emscripten_bind_btSoftBody_setRollingFriction_1"];var _emscripten_bind_btSoftBody_setTotalMass_2=Module["_emscripten_bind_btSoftBody_setTotalMass_2"]=asm["_emscripten_bind_btSoftBody_setTotalMass_2"];var _emscripten_bind_btSoftBody_setUserIndex_1=Module["_emscripten_bind_btSoftBody_setUserIndex_1"]=asm["_emscripten_bind_btSoftBody_setUserIndex_1"];var _emscripten_bind_btSoftBody_setUserPointer_1=Module["_emscripten_bind_btSoftBody_setUserPointer_1"]=asm["_emscripten_bind_btSoftBody_setUserPointer_1"];var _emscripten_bind_btSoftBody_setWorldTransform_1=Module["_emscripten_bind_btSoftBody_setWorldTransform_1"]=asm["_emscripten_bind_btSoftBody_setWorldTransform_1"];var _emscripten_bind_btSoftBody_set_m_anchors_1=Module["_emscripten_bind_btSoftBody_set_m_anchors_1"]=asm["_emscripten_bind_btSoftBody_set_m_anchors_1"];var _emscripten_bind_btSoftBody_set_m_cfg_1=Module["_emscripten_bind_btSoftBody_set_m_cfg_1"]=asm["_emscripten_bind_btSoftBody_set_m_cfg_1"];var _emscripten_bind_btSoftBody_set_m_faces_1=Module["_emscripten_bind_btSoftBody_set_m_faces_1"]=asm["_emscripten_bind_btSoftBody_set_m_faces_1"];var _emscripten_bind_btSoftBody_set_m_links_1=Module["_emscripten_bind_btSoftBody_set_m_links_1"]=asm["_emscripten_bind_btSoftBody_set_m_links_1"];var _emscripten_bind_btSoftBody_set_m_materials_1=Module["_emscripten_bind_btSoftBody_set_m_materials_1"]=asm["_emscripten_bind_btSoftBody_set_m_materials_1"];var _emscripten_bind_btSoftBody_set_m_nodes_1=Module["_emscripten_bind_btSoftBody_set_m_nodes_1"]=asm["_emscripten_bind_btSoftBody_set_m_nodes_1"];var _emscripten_bind_btSoftBody_transform_1=Module["_emscripten_bind_btSoftBody_transform_1"]=asm["_emscripten_bind_btSoftBody_transform_1"];var _emscripten_bind_btSoftBody_translate_1=Module["_emscripten_bind_btSoftBody_translate_1"]=asm["_emscripten_bind_btSoftBody_translate_1"];var _emscripten_bind_btSoftBody_upcast_1=Module["_emscripten_bind_btSoftBody_upcast_1"]=asm["_emscripten_bind_btSoftBody_upcast_1"];var _emscripten_bind_btSoftRigidDynamicsWorld___destroy___0=Module["_emscripten_bind_btSoftRigidDynamicsWorld___destroy___0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld___destroy___0"];var _emscripten_bind_btSoftRigidDynamicsWorld_addAction_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addAction_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addAction_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_2=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_2"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_2"];var _emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_3=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_3"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_3"];var _emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_2=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_2"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_2"];var _emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_3=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_3"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_3"];var _emscripten_bind_btSoftRigidDynamicsWorld_addSoftBody_3=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addSoftBody_3"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addSoftBody_3"];var _emscripten_bind_btSoftRigidDynamicsWorld_addVehicle_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addVehicle_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addVehicle_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_btSoftRigidDynamicsWorld_5=Module["_emscripten_bind_btSoftRigidDynamicsWorld_btSoftRigidDynamicsWorld_5"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_btSoftRigidDynamicsWorld_5"];var _emscripten_bind_btSoftRigidDynamicsWorld_contactPairTest_3=Module["_emscripten_bind_btSoftRigidDynamicsWorld_contactPairTest_3"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_contactPairTest_3"];var _emscripten_bind_btSoftRigidDynamicsWorld_contactTest_2=Module["_emscripten_bind_btSoftRigidDynamicsWorld_contactTest_2"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_contactTest_2"];var _emscripten_bind_btSoftRigidDynamicsWorld_convexSweepTest_5=Module["_emscripten_bind_btSoftRigidDynamicsWorld_convexSweepTest_5"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_convexSweepTest_5"];var _emscripten_bind_btSoftRigidDynamicsWorld_getBroadphase_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getBroadphase_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getBroadphase_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_getDispatchInfo_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getDispatchInfo_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getDispatchInfo_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_getDispatcher_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getDispatcher_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getDispatcher_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_getGravity_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getGravity_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getGravity_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_getPairCache_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getPairCache_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getPairCache_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_getSoftBodyArray_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getSoftBodyArray_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getSoftBodyArray_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_getSolverInfo_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getSolverInfo_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getSolverInfo_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_getWorldInfo_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getWorldInfo_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getWorldInfo_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_rayTest_3=Module["_emscripten_bind_btSoftRigidDynamicsWorld_rayTest_3"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_rayTest_3"];var _emscripten_bind_btSoftRigidDynamicsWorld_removeAction_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_removeAction_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_removeAction_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_removeCollisionObject_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_removeCollisionObject_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_removeCollisionObject_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_removeConstraint_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_removeConstraint_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_removeConstraint_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_removeRigidBody_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_removeRigidBody_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_removeRigidBody_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_removeSoftBody_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_removeSoftBody_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_removeSoftBody_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_removeVehicle_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_removeVehicle_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_removeVehicle_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_setGravity_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_setGravity_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_setGravity_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_2=Module["_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_2"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_2"];var _emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_3=Module["_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_3"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_3"];var _emscripten_bind_btSoftRigidDynamicsWorld_updateSingleAabb_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_updateSingleAabb_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_updateSingleAabb_1"];var _emscripten_bind_btSphereShape___destroy___0=Module["_emscripten_bind_btSphereShape___destroy___0"]=asm["_emscripten_bind_btSphereShape___destroy___0"];var _emscripten_bind_btSphereShape_btSphereShape_1=Module["_emscripten_bind_btSphereShape_btSphereShape_1"]=asm["_emscripten_bind_btSphereShape_btSphereShape_1"];var _emscripten_bind_btSphereShape_calculateLocalInertia_2=Module["_emscripten_bind_btSphereShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btSphereShape_calculateLocalInertia_2"];var _emscripten_bind_btSphereShape_getLocalScaling_0=Module["_emscripten_bind_btSphereShape_getLocalScaling_0"]=asm["_emscripten_bind_btSphereShape_getLocalScaling_0"];var _emscripten_bind_btSphereShape_getMargin_0=Module["_emscripten_bind_btSphereShape_getMargin_0"]=asm["_emscripten_bind_btSphereShape_getMargin_0"];var _emscripten_bind_btSphereShape_setLocalScaling_1=Module["_emscripten_bind_btSphereShape_setLocalScaling_1"]=asm["_emscripten_bind_btSphereShape_setLocalScaling_1"];var _emscripten_bind_btSphereShape_setMargin_1=Module["_emscripten_bind_btSphereShape_setMargin_1"]=asm["_emscripten_bind_btSphereShape_setMargin_1"];var _emscripten_bind_btStaticPlaneShape___destroy___0=Module["_emscripten_bind_btStaticPlaneShape___destroy___0"]=asm["_emscripten_bind_btStaticPlaneShape___destroy___0"];var _emscripten_bind_btStaticPlaneShape_btStaticPlaneShape_2=Module["_emscripten_bind_btStaticPlaneShape_btStaticPlaneShape_2"]=asm["_emscripten_bind_btStaticPlaneShape_btStaticPlaneShape_2"];var _emscripten_bind_btStaticPlaneShape_calculateLocalInertia_2=Module["_emscripten_bind_btStaticPlaneShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btStaticPlaneShape_calculateLocalInertia_2"];var _emscripten_bind_btStaticPlaneShape_getLocalScaling_0=Module["_emscripten_bind_btStaticPlaneShape_getLocalScaling_0"]=asm["_emscripten_bind_btStaticPlaneShape_getLocalScaling_0"];var _emscripten_bind_btStaticPlaneShape_setLocalScaling_1=Module["_emscripten_bind_btStaticPlaneShape_setLocalScaling_1"]=asm["_emscripten_bind_btStaticPlaneShape_setLocalScaling_1"];var _emscripten_bind_btStridingMeshInterface___destroy___0=Module["_emscripten_bind_btStridingMeshInterface___destroy___0"]=asm["_emscripten_bind_btStridingMeshInterface___destroy___0"];var _emscripten_bind_btTransform___destroy___0=Module["_emscripten_bind_btTransform___destroy___0"]=asm["_emscripten_bind_btTransform___destroy___0"];var _emscripten_bind_btTransform_btTransform_0=Module["_emscripten_bind_btTransform_btTransform_0"]=asm["_emscripten_bind_btTransform_btTransform_0"];var _emscripten_bind_btTransform_btTransform_2=Module["_emscripten_bind_btTransform_btTransform_2"]=asm["_emscripten_bind_btTransform_btTransform_2"];var _emscripten_bind_btTransform_getBasis_0=Module["_emscripten_bind_btTransform_getBasis_0"]=asm["_emscripten_bind_btTransform_getBasis_0"];var _emscripten_bind_btTransform_getOrigin_0=Module["_emscripten_bind_btTransform_getOrigin_0"]=asm["_emscripten_bind_btTransform_getOrigin_0"];var _emscripten_bind_btTransform_getRotation_0=Module["_emscripten_bind_btTransform_getRotation_0"]=asm["_emscripten_bind_btTransform_getRotation_0"];var _emscripten_bind_btTransform_setFromOpenGLMatrix_1=Module["_emscripten_bind_btTransform_setFromOpenGLMatrix_1"]=asm["_emscripten_bind_btTransform_setFromOpenGLMatrix_1"];var _emscripten_bind_btTransform_setIdentity_0=Module["_emscripten_bind_btTransform_setIdentity_0"]=asm["_emscripten_bind_btTransform_setIdentity_0"];var _emscripten_bind_btTransform_setOrigin_1=Module["_emscripten_bind_btTransform_setOrigin_1"]=asm["_emscripten_bind_btTransform_setOrigin_1"];var _emscripten_bind_btTransform_setRotation_1=Module["_emscripten_bind_btTransform_setRotation_1"]=asm["_emscripten_bind_btTransform_setRotation_1"];var _emscripten_bind_btTriangleMeshShape___destroy___0=Module["_emscripten_bind_btTriangleMeshShape___destroy___0"]=asm["_emscripten_bind_btTriangleMeshShape___destroy___0"];var _emscripten_bind_btTriangleMeshShape_calculateLocalInertia_2=Module["_emscripten_bind_btTriangleMeshShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btTriangleMeshShape_calculateLocalInertia_2"];var _emscripten_bind_btTriangleMeshShape_getLocalScaling_0=Module["_emscripten_bind_btTriangleMeshShape_getLocalScaling_0"]=asm["_emscripten_bind_btTriangleMeshShape_getLocalScaling_0"];var _emscripten_bind_btTriangleMeshShape_setLocalScaling_1=Module["_emscripten_bind_btTriangleMeshShape_setLocalScaling_1"]=asm["_emscripten_bind_btTriangleMeshShape_setLocalScaling_1"];var _emscripten_bind_btTriangleMesh___destroy___0=Module["_emscripten_bind_btTriangleMesh___destroy___0"]=asm["_emscripten_bind_btTriangleMesh___destroy___0"];var _emscripten_bind_btTriangleMesh_addTriangle_3=Module["_emscripten_bind_btTriangleMesh_addTriangle_3"]=asm["_emscripten_bind_btTriangleMesh_addTriangle_3"];var _emscripten_bind_btTriangleMesh_addTriangle_4=Module["_emscripten_bind_btTriangleMesh_addTriangle_4"]=asm["_emscripten_bind_btTriangleMesh_addTriangle_4"];var _emscripten_bind_btTriangleMesh_btTriangleMesh_0=Module["_emscripten_bind_btTriangleMesh_btTriangleMesh_0"]=asm["_emscripten_bind_btTriangleMesh_btTriangleMesh_0"];var _emscripten_bind_btTriangleMesh_btTriangleMesh_1=Module["_emscripten_bind_btTriangleMesh_btTriangleMesh_1"]=asm["_emscripten_bind_btTriangleMesh_btTriangleMesh_1"];var _emscripten_bind_btTriangleMesh_btTriangleMesh_2=Module["_emscripten_bind_btTriangleMesh_btTriangleMesh_2"]=asm["_emscripten_bind_btTriangleMesh_btTriangleMesh_2"];var _emscripten_bind_btTypedConstraint___destroy___0=Module["_emscripten_bind_btTypedConstraint___destroy___0"]=asm["_emscripten_bind_btTypedConstraint___destroy___0"];var _emscripten_bind_btTypedConstraint_enableFeedback_1=Module["_emscripten_bind_btTypedConstraint_enableFeedback_1"]=asm["_emscripten_bind_btTypedConstraint_enableFeedback_1"];var _emscripten_bind_btTypedConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btTypedConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btTypedConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btTypedConstraint_getParam_2=Module["_emscripten_bind_btTypedConstraint_getParam_2"]=asm["_emscripten_bind_btTypedConstraint_getParam_2"];var _emscripten_bind_btTypedConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btTypedConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btTypedConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btTypedConstraint_setParam_3=Module["_emscripten_bind_btTypedConstraint_setParam_3"]=asm["_emscripten_bind_btTypedConstraint_setParam_3"];var _emscripten_bind_btVector3___destroy___0=Module["_emscripten_bind_btVector3___destroy___0"]=asm["_emscripten_bind_btVector3___destroy___0"];var _emscripten_bind_btVector3_btVector3_0=Module["_emscripten_bind_btVector3_btVector3_0"]=asm["_emscripten_bind_btVector3_btVector3_0"];var _emscripten_bind_btVector3_btVector3_3=Module["_emscripten_bind_btVector3_btVector3_3"]=asm["_emscripten_bind_btVector3_btVector3_3"];var _emscripten_bind_btVector3_dot_1=Module["_emscripten_bind_btVector3_dot_1"]=asm["_emscripten_bind_btVector3_dot_1"];var _emscripten_bind_btVector3_length_0=Module["_emscripten_bind_btVector3_length_0"]=asm["_emscripten_bind_btVector3_length_0"];var _emscripten_bind_btVector3_normalize_0=Module["_emscripten_bind_btVector3_normalize_0"]=asm["_emscripten_bind_btVector3_normalize_0"];var _emscripten_bind_btVector3_op_add_1=Module["_emscripten_bind_btVector3_op_add_1"]=asm["_emscripten_bind_btVector3_op_add_1"];var _emscripten_bind_btVector3_op_mul_1=Module["_emscripten_bind_btVector3_op_mul_1"]=asm["_emscripten_bind_btVector3_op_mul_1"];var _emscripten_bind_btVector3_op_sub_1=Module["_emscripten_bind_btVector3_op_sub_1"]=asm["_emscripten_bind_btVector3_op_sub_1"];var _emscripten_bind_btVector3_rotate_2=Module["_emscripten_bind_btVector3_rotate_2"]=asm["_emscripten_bind_btVector3_rotate_2"];var _emscripten_bind_btVector3_setValue_3=Module["_emscripten_bind_btVector3_setValue_3"]=asm["_emscripten_bind_btVector3_setValue_3"];var _emscripten_bind_btVector3_setX_1=Module["_emscripten_bind_btVector3_setX_1"]=asm["_emscripten_bind_btVector3_setX_1"];var _emscripten_bind_btVector3_setY_1=Module["_emscripten_bind_btVector3_setY_1"]=asm["_emscripten_bind_btVector3_setY_1"];var _emscripten_bind_btVector3_setZ_1=Module["_emscripten_bind_btVector3_setZ_1"]=asm["_emscripten_bind_btVector3_setZ_1"];var _emscripten_bind_btVector3_x_0=Module["_emscripten_bind_btVector3_x_0"]=asm["_emscripten_bind_btVector3_x_0"];var _emscripten_bind_btVector3_y_0=Module["_emscripten_bind_btVector3_y_0"]=asm["_emscripten_bind_btVector3_y_0"];var _emscripten_bind_btVector3_z_0=Module["_emscripten_bind_btVector3_z_0"]=asm["_emscripten_bind_btVector3_z_0"];var _emscripten_bind_btVector4___destroy___0=Module["_emscripten_bind_btVector4___destroy___0"]=asm["_emscripten_bind_btVector4___destroy___0"];var _emscripten_bind_btVector4_btVector4_0=Module["_emscripten_bind_btVector4_btVector4_0"]=asm["_emscripten_bind_btVector4_btVector4_0"];var _emscripten_bind_btVector4_btVector4_4=Module["_emscripten_bind_btVector4_btVector4_4"]=asm["_emscripten_bind_btVector4_btVector4_4"];var _emscripten_bind_btVector4_dot_1=Module["_emscripten_bind_btVector4_dot_1"]=asm["_emscripten_bind_btVector4_dot_1"];var _emscripten_bind_btVector4_length_0=Module["_emscripten_bind_btVector4_length_0"]=asm["_emscripten_bind_btVector4_length_0"];var _emscripten_bind_btVector4_normalize_0=Module["_emscripten_bind_btVector4_normalize_0"]=asm["_emscripten_bind_btVector4_normalize_0"];var _emscripten_bind_btVector4_op_add_1=Module["_emscripten_bind_btVector4_op_add_1"]=asm["_emscripten_bind_btVector4_op_add_1"];var _emscripten_bind_btVector4_op_mul_1=Module["_emscripten_bind_btVector4_op_mul_1"]=asm["_emscripten_bind_btVector4_op_mul_1"];var _emscripten_bind_btVector4_op_sub_1=Module["_emscripten_bind_btVector4_op_sub_1"]=asm["_emscripten_bind_btVector4_op_sub_1"];var _emscripten_bind_btVector4_rotate_2=Module["_emscripten_bind_btVector4_rotate_2"]=asm["_emscripten_bind_btVector4_rotate_2"];var _emscripten_bind_btVector4_setValue_4=Module["_emscripten_bind_btVector4_setValue_4"]=asm["_emscripten_bind_btVector4_setValue_4"];var _emscripten_bind_btVector4_setX_1=Module["_emscripten_bind_btVector4_setX_1"]=asm["_emscripten_bind_btVector4_setX_1"];var _emscripten_bind_btVector4_setY_1=Module["_emscripten_bind_btVector4_setY_1"]=asm["_emscripten_bind_btVector4_setY_1"];var _emscripten_bind_btVector4_setZ_1=Module["_emscripten_bind_btVector4_setZ_1"]=asm["_emscripten_bind_btVector4_setZ_1"];var _emscripten_bind_btVector4_w_0=Module["_emscripten_bind_btVector4_w_0"]=asm["_emscripten_bind_btVector4_w_0"];var _emscripten_bind_btVector4_x_0=Module["_emscripten_bind_btVector4_x_0"]=asm["_emscripten_bind_btVector4_x_0"];var _emscripten_bind_btVector4_y_0=Module["_emscripten_bind_btVector4_y_0"]=asm["_emscripten_bind_btVector4_y_0"];var _emscripten_bind_btVector4_z_0=Module["_emscripten_bind_btVector4_z_0"]=asm["_emscripten_bind_btVector4_z_0"];var _emscripten_bind_btVehicleRaycasterResult___destroy___0=Module["_emscripten_bind_btVehicleRaycasterResult___destroy___0"]=asm["_emscripten_bind_btVehicleRaycasterResult___destroy___0"];var _emscripten_bind_btVehicleRaycasterResult_get_m_distFraction_0=Module["_emscripten_bind_btVehicleRaycasterResult_get_m_distFraction_0"]=asm["_emscripten_bind_btVehicleRaycasterResult_get_m_distFraction_0"];var _emscripten_bind_btVehicleRaycasterResult_get_m_hitNormalInWorld_0=Module["_emscripten_bind_btVehicleRaycasterResult_get_m_hitNormalInWorld_0"]=asm["_emscripten_bind_btVehicleRaycasterResult_get_m_hitNormalInWorld_0"];var _emscripten_bind_btVehicleRaycasterResult_get_m_hitPointInWorld_0=Module["_emscripten_bind_btVehicleRaycasterResult_get_m_hitPointInWorld_0"]=asm["_emscripten_bind_btVehicleRaycasterResult_get_m_hitPointInWorld_0"];var _emscripten_bind_btVehicleRaycasterResult_set_m_distFraction_1=Module["_emscripten_bind_btVehicleRaycasterResult_set_m_distFraction_1"]=asm["_emscripten_bind_btVehicleRaycasterResult_set_m_distFraction_1"];var _emscripten_bind_btVehicleRaycasterResult_set_m_hitNormalInWorld_1=Module["_emscripten_bind_btVehicleRaycasterResult_set_m_hitNormalInWorld_1"]=asm["_emscripten_bind_btVehicleRaycasterResult_set_m_hitNormalInWorld_1"];var _emscripten_bind_btVehicleRaycasterResult_set_m_hitPointInWorld_1=Module["_emscripten_bind_btVehicleRaycasterResult_set_m_hitPointInWorld_1"]=asm["_emscripten_bind_btVehicleRaycasterResult_set_m_hitPointInWorld_1"];var _emscripten_bind_btVehicleRaycaster___destroy___0=Module["_emscripten_bind_btVehicleRaycaster___destroy___0"]=asm["_emscripten_bind_btVehicleRaycaster___destroy___0"];var _emscripten_bind_btVehicleRaycaster_castRay_3=Module["_emscripten_bind_btVehicleRaycaster_castRay_3"]=asm["_emscripten_bind_btVehicleRaycaster_castRay_3"];var _emscripten_bind_btVehicleTuning_btVehicleTuning_0=Module["_emscripten_bind_btVehicleTuning_btVehicleTuning_0"]=asm["_emscripten_bind_btVehicleTuning_btVehicleTuning_0"];var _emscripten_bind_btVehicleTuning_get_m_frictionSlip_0=Module["_emscripten_bind_btVehicleTuning_get_m_frictionSlip_0"]=asm["_emscripten_bind_btVehicleTuning_get_m_frictionSlip_0"];var _emscripten_bind_btVehicleTuning_get_m_maxSuspensionForce_0=Module["_emscripten_bind_btVehicleTuning_get_m_maxSuspensionForce_0"]=asm["_emscripten_bind_btVehicleTuning_get_m_maxSuspensionForce_0"];var _emscripten_bind_btVehicleTuning_get_m_maxSuspensionTravelCm_0=Module["_emscripten_bind_btVehicleTuning_get_m_maxSuspensionTravelCm_0"]=asm["_emscripten_bind_btVehicleTuning_get_m_maxSuspensionTravelCm_0"];var _emscripten_bind_btVehicleTuning_get_m_suspensionCompression_0=Module["_emscripten_bind_btVehicleTuning_get_m_suspensionCompression_0"]=asm["_emscripten_bind_btVehicleTuning_get_m_suspensionCompression_0"];var _emscripten_bind_btVehicleTuning_get_m_suspensionDamping_0=Module["_emscripten_bind_btVehicleTuning_get_m_suspensionDamping_0"]=asm["_emscripten_bind_btVehicleTuning_get_m_suspensionDamping_0"];var _emscripten_bind_btVehicleTuning_get_m_suspensionStiffness_0=Module["_emscripten_bind_btVehicleTuning_get_m_suspensionStiffness_0"]=asm["_emscripten_bind_btVehicleTuning_get_m_suspensionStiffness_0"];var _emscripten_bind_btVehicleTuning_set_m_frictionSlip_1=Module["_emscripten_bind_btVehicleTuning_set_m_frictionSlip_1"]=asm["_emscripten_bind_btVehicleTuning_set_m_frictionSlip_1"];var _emscripten_bind_btVehicleTuning_set_m_maxSuspensionForce_1=Module["_emscripten_bind_btVehicleTuning_set_m_maxSuspensionForce_1"]=asm["_emscripten_bind_btVehicleTuning_set_m_maxSuspensionForce_1"];var _emscripten_bind_btVehicleTuning_set_m_maxSuspensionTravelCm_1=Module["_emscripten_bind_btVehicleTuning_set_m_maxSuspensionTravelCm_1"]=asm["_emscripten_bind_btVehicleTuning_set_m_maxSuspensionTravelCm_1"];var _emscripten_bind_btVehicleTuning_set_m_suspensionCompression_1=Module["_emscripten_bind_btVehicleTuning_set_m_suspensionCompression_1"]=asm["_emscripten_bind_btVehicleTuning_set_m_suspensionCompression_1"];var _emscripten_bind_btVehicleTuning_set_m_suspensionDamping_1=Module["_emscripten_bind_btVehicleTuning_set_m_suspensionDamping_1"]=asm["_emscripten_bind_btVehicleTuning_set_m_suspensionDamping_1"];var _emscripten_bind_btVehicleTuning_set_m_suspensionStiffness_1=Module["_emscripten_bind_btVehicleTuning_set_m_suspensionStiffness_1"]=asm["_emscripten_bind_btVehicleTuning_set_m_suspensionStiffness_1"];var _emscripten_bind_btWheelInfoConstructionInfo___destroy___0=Module["_emscripten_bind_btWheelInfoConstructionInfo___destroy___0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo___destroy___0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_bIsFrontWheel_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_bIsFrontWheel_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_bIsFrontWheel_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_chassisConnectionCS_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_chassisConnectionCS_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_chassisConnectionCS_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_frictionSlip_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_frictionSlip_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_frictionSlip_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionForce_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionForce_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionForce_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionTravelCm_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionTravelCm_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionTravelCm_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionRestLength_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionRestLength_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionRestLength_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionStiffness_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionStiffness_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionStiffness_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelAxleCS_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelAxleCS_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelAxleCS_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelDirectionCS_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelDirectionCS_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelDirectionCS_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelRadius_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelRadius_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelRadius_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingCompression_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingCompression_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingCompression_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingRelaxation_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingRelaxation_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingRelaxation_0"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_bIsFrontWheel_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_bIsFrontWheel_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_bIsFrontWheel_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_chassisConnectionCS_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_chassisConnectionCS_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_chassisConnectionCS_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_frictionSlip_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_frictionSlip_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_frictionSlip_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionForce_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionForce_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionForce_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionTravelCm_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionTravelCm_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionTravelCm_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionRestLength_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionRestLength_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionRestLength_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionStiffness_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionStiffness_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionStiffness_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelAxleCS_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelAxleCS_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelAxleCS_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelDirectionCS_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelDirectionCS_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelDirectionCS_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelRadius_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelRadius_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelRadius_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingCompression_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingCompression_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingCompression_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingRelaxation_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingRelaxation_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingRelaxation_1"];var _emscripten_bind_btWheelInfo___destroy___0=Module["_emscripten_bind_btWheelInfo___destroy___0"]=asm["_emscripten_bind_btWheelInfo___destroy___0"];var _emscripten_bind_btWheelInfo_btWheelInfo_1=Module["_emscripten_bind_btWheelInfo_btWheelInfo_1"]=asm["_emscripten_bind_btWheelInfo_btWheelInfo_1"];var _emscripten_bind_btWheelInfo_getSuspensionRestLength_0=Module["_emscripten_bind_btWheelInfo_getSuspensionRestLength_0"]=asm["_emscripten_bind_btWheelInfo_getSuspensionRestLength_0"];var _emscripten_bind_btWheelInfo_get_m_bIsFrontWheel_0=Module["_emscripten_bind_btWheelInfo_get_m_bIsFrontWheel_0"]=asm["_emscripten_bind_btWheelInfo_get_m_bIsFrontWheel_0"];var _emscripten_bind_btWheelInfo_get_m_brake_0=Module["_emscripten_bind_btWheelInfo_get_m_brake_0"]=asm["_emscripten_bind_btWheelInfo_get_m_brake_0"];var _emscripten_bind_btWheelInfo_get_m_chassisConnectionPointCS_0=Module["_emscripten_bind_btWheelInfo_get_m_chassisConnectionPointCS_0"]=asm["_emscripten_bind_btWheelInfo_get_m_chassisConnectionPointCS_0"];var _emscripten_bind_btWheelInfo_get_m_clippedInvContactDotSuspension_0=Module["_emscripten_bind_btWheelInfo_get_m_clippedInvContactDotSuspension_0"]=asm["_emscripten_bind_btWheelInfo_get_m_clippedInvContactDotSuspension_0"];var _emscripten_bind_btWheelInfo_get_m_deltaRotation_0=Module["_emscripten_bind_btWheelInfo_get_m_deltaRotation_0"]=asm["_emscripten_bind_btWheelInfo_get_m_deltaRotation_0"];var _emscripten_bind_btWheelInfo_get_m_engineForce_0=Module["_emscripten_bind_btWheelInfo_get_m_engineForce_0"]=asm["_emscripten_bind_btWheelInfo_get_m_engineForce_0"];var _emscripten_bind_btWheelInfo_get_m_frictionSlip_0=Module["_emscripten_bind_btWheelInfo_get_m_frictionSlip_0"]=asm["_emscripten_bind_btWheelInfo_get_m_frictionSlip_0"];var _emscripten_bind_btWheelInfo_get_m_maxSuspensionForce_0=Module["_emscripten_bind_btWheelInfo_get_m_maxSuspensionForce_0"]=asm["_emscripten_bind_btWheelInfo_get_m_maxSuspensionForce_0"];var _emscripten_bind_btWheelInfo_get_m_maxSuspensionTravelCm_0=Module["_emscripten_bind_btWheelInfo_get_m_maxSuspensionTravelCm_0"]=asm["_emscripten_bind_btWheelInfo_get_m_maxSuspensionTravelCm_0"];var _emscripten_bind_btWheelInfo_get_m_raycastInfo_0=Module["_emscripten_bind_btWheelInfo_get_m_raycastInfo_0"]=asm["_emscripten_bind_btWheelInfo_get_m_raycastInfo_0"];var _emscripten_bind_btWheelInfo_get_m_rollInfluence_0=Module["_emscripten_bind_btWheelInfo_get_m_rollInfluence_0"]=asm["_emscripten_bind_btWheelInfo_get_m_rollInfluence_0"];var _emscripten_bind_btWheelInfo_get_m_rotation_0=Module["_emscripten_bind_btWheelInfo_get_m_rotation_0"]=asm["_emscripten_bind_btWheelInfo_get_m_rotation_0"];var _emscripten_bind_btWheelInfo_get_m_skidInfo_0=Module["_emscripten_bind_btWheelInfo_get_m_skidInfo_0"]=asm["_emscripten_bind_btWheelInfo_get_m_skidInfo_0"];var _emscripten_bind_btWheelInfo_get_m_steering_0=Module["_emscripten_bind_btWheelInfo_get_m_steering_0"]=asm["_emscripten_bind_btWheelInfo_get_m_steering_0"];var _emscripten_bind_btWheelInfo_get_m_suspensionRelativeVelocity_0=Module["_emscripten_bind_btWheelInfo_get_m_suspensionRelativeVelocity_0"]=asm["_emscripten_bind_btWheelInfo_get_m_suspensionRelativeVelocity_0"];var _emscripten_bind_btWheelInfo_get_m_suspensionRestLength1_0=Module["_emscripten_bind_btWheelInfo_get_m_suspensionRestLength1_0"]=asm["_emscripten_bind_btWheelInfo_get_m_suspensionRestLength1_0"];var _emscripten_bind_btWheelInfo_get_m_suspensionStiffness_0=Module["_emscripten_bind_btWheelInfo_get_m_suspensionStiffness_0"]=asm["_emscripten_bind_btWheelInfo_get_m_suspensionStiffness_0"];var _emscripten_bind_btWheelInfo_get_m_wheelAxleCS_0=Module["_emscripten_bind_btWheelInfo_get_m_wheelAxleCS_0"]=asm["_emscripten_bind_btWheelInfo_get_m_wheelAxleCS_0"];var _emscripten_bind_btWheelInfo_get_m_wheelDirectionCS_0=Module["_emscripten_bind_btWheelInfo_get_m_wheelDirectionCS_0"]=asm["_emscripten_bind_btWheelInfo_get_m_wheelDirectionCS_0"];var _emscripten_bind_btWheelInfo_get_m_wheelsDampingCompression_0=Module["_emscripten_bind_btWheelInfo_get_m_wheelsDampingCompression_0"]=asm["_emscripten_bind_btWheelInfo_get_m_wheelsDampingCompression_0"];var _emscripten_bind_btWheelInfo_get_m_wheelsDampingRelaxation_0=Module["_emscripten_bind_btWheelInfo_get_m_wheelsDampingRelaxation_0"]=asm["_emscripten_bind_btWheelInfo_get_m_wheelsDampingRelaxation_0"];var _emscripten_bind_btWheelInfo_get_m_wheelsRadius_0=Module["_emscripten_bind_btWheelInfo_get_m_wheelsRadius_0"]=asm["_emscripten_bind_btWheelInfo_get_m_wheelsRadius_0"];var _emscripten_bind_btWheelInfo_get_m_wheelsSuspensionForce_0=Module["_emscripten_bind_btWheelInfo_get_m_wheelsSuspensionForce_0"]=asm["_emscripten_bind_btWheelInfo_get_m_wheelsSuspensionForce_0"];var _emscripten_bind_btWheelInfo_get_m_worldTransform_0=Module["_emscripten_bind_btWheelInfo_get_m_worldTransform_0"]=asm["_emscripten_bind_btWheelInfo_get_m_worldTransform_0"];var _emscripten_bind_btWheelInfo_set_m_bIsFrontWheel_1=Module["_emscripten_bind_btWheelInfo_set_m_bIsFrontWheel_1"]=asm["_emscripten_bind_btWheelInfo_set_m_bIsFrontWheel_1"];var _emscripten_bind_btWheelInfo_set_m_brake_1=Module["_emscripten_bind_btWheelInfo_set_m_brake_1"]=asm["_emscripten_bind_btWheelInfo_set_m_brake_1"];var _emscripten_bind_btWheelInfo_set_m_chassisConnectionPointCS_1=Module["_emscripten_bind_btWheelInfo_set_m_chassisConnectionPointCS_1"]=asm["_emscripten_bind_btWheelInfo_set_m_chassisConnectionPointCS_1"];var _emscripten_bind_btWheelInfo_set_m_clippedInvContactDotSuspension_1=Module["_emscripten_bind_btWheelInfo_set_m_clippedInvContactDotSuspension_1"]=asm["_emscripten_bind_btWheelInfo_set_m_clippedInvContactDotSuspension_1"];var _emscripten_bind_btWheelInfo_set_m_deltaRotation_1=Module["_emscripten_bind_btWheelInfo_set_m_deltaRotation_1"]=asm["_emscripten_bind_btWheelInfo_set_m_deltaRotation_1"];var _emscripten_bind_btWheelInfo_set_m_engineForce_1=Module["_emscripten_bind_btWheelInfo_set_m_engineForce_1"]=asm["_emscripten_bind_btWheelInfo_set_m_engineForce_1"];var _emscripten_bind_btWheelInfo_set_m_frictionSlip_1=Module["_emscripten_bind_btWheelInfo_set_m_frictionSlip_1"]=asm["_emscripten_bind_btWheelInfo_set_m_frictionSlip_1"];var _emscripten_bind_btWheelInfo_set_m_maxSuspensionForce_1=Module["_emscripten_bind_btWheelInfo_set_m_maxSuspensionForce_1"]=asm["_emscripten_bind_btWheelInfo_set_m_maxSuspensionForce_1"];var _emscripten_bind_btWheelInfo_set_m_maxSuspensionTravelCm_1=Module["_emscripten_bind_btWheelInfo_set_m_maxSuspensionTravelCm_1"]=asm["_emscripten_bind_btWheelInfo_set_m_maxSuspensionTravelCm_1"];var _emscripten_bind_btWheelInfo_set_m_raycastInfo_1=Module["_emscripten_bind_btWheelInfo_set_m_raycastInfo_1"]=asm["_emscripten_bind_btWheelInfo_set_m_raycastInfo_1"];var _emscripten_bind_btWheelInfo_set_m_rollInfluence_1=Module["_emscripten_bind_btWheelInfo_set_m_rollInfluence_1"]=asm["_emscripten_bind_btWheelInfo_set_m_rollInfluence_1"];var _emscripten_bind_btWheelInfo_set_m_rotation_1=Module["_emscripten_bind_btWheelInfo_set_m_rotation_1"]=asm["_emscripten_bind_btWheelInfo_set_m_rotation_1"];var _emscripten_bind_btWheelInfo_set_m_skidInfo_1=Module["_emscripten_bind_btWheelInfo_set_m_skidInfo_1"]=asm["_emscripten_bind_btWheelInfo_set_m_skidInfo_1"];var _emscripten_bind_btWheelInfo_set_m_steering_1=Module["_emscripten_bind_btWheelInfo_set_m_steering_1"]=asm["_emscripten_bind_btWheelInfo_set_m_steering_1"];var _emscripten_bind_btWheelInfo_set_m_suspensionRelativeVelocity_1=Module["_emscripten_bind_btWheelInfo_set_m_suspensionRelativeVelocity_1"]=asm["_emscripten_bind_btWheelInfo_set_m_suspensionRelativeVelocity_1"];var _emscripten_bind_btWheelInfo_set_m_suspensionRestLength1_1=Module["_emscripten_bind_btWheelInfo_set_m_suspensionRestLength1_1"]=asm["_emscripten_bind_btWheelInfo_set_m_suspensionRestLength1_1"];var _emscripten_bind_btWheelInfo_set_m_suspensionStiffness_1=Module["_emscripten_bind_btWheelInfo_set_m_suspensionStiffness_1"]=asm["_emscripten_bind_btWheelInfo_set_m_suspensionStiffness_1"];var _emscripten_bind_btWheelInfo_set_m_wheelAxleCS_1=Module["_emscripten_bind_btWheelInfo_set_m_wheelAxleCS_1"]=asm["_emscripten_bind_btWheelInfo_set_m_wheelAxleCS_1"];var _emscripten_bind_btWheelInfo_set_m_wheelDirectionCS_1=Module["_emscripten_bind_btWheelInfo_set_m_wheelDirectionCS_1"]=asm["_emscripten_bind_btWheelInfo_set_m_wheelDirectionCS_1"];var _emscripten_bind_btWheelInfo_set_m_wheelsDampingCompression_1=Module["_emscripten_bind_btWheelInfo_set_m_wheelsDampingCompression_1"]=asm["_emscripten_bind_btWheelInfo_set_m_wheelsDampingCompression_1"];var _emscripten_bind_btWheelInfo_set_m_wheelsDampingRelaxation_1=Module["_emscripten_bind_btWheelInfo_set_m_wheelsDampingRelaxation_1"]=asm["_emscripten_bind_btWheelInfo_set_m_wheelsDampingRelaxation_1"];var _emscripten_bind_btWheelInfo_set_m_wheelsRadius_1=Module["_emscripten_bind_btWheelInfo_set_m_wheelsRadius_1"]=asm["_emscripten_bind_btWheelInfo_set_m_wheelsRadius_1"];var _emscripten_bind_btWheelInfo_set_m_wheelsSuspensionForce_1=Module["_emscripten_bind_btWheelInfo_set_m_wheelsSuspensionForce_1"]=asm["_emscripten_bind_btWheelInfo_set_m_wheelsSuspensionForce_1"];var _emscripten_bind_btWheelInfo_set_m_worldTransform_1=Module["_emscripten_bind_btWheelInfo_set_m_worldTransform_1"]=asm["_emscripten_bind_btWheelInfo_set_m_worldTransform_1"];var _emscripten_bind_btWheelInfo_updateWheel_2=Module["_emscripten_bind_btWheelInfo_updateWheel_2"]=asm["_emscripten_bind_btWheelInfo_updateWheel_2"];var _emscripten_bind_tAnchorArray___destroy___0=Module["_emscripten_bind_tAnchorArray___destroy___0"]=asm["_emscripten_bind_tAnchorArray___destroy___0"];var _emscripten_bind_tAnchorArray_at_1=Module["_emscripten_bind_tAnchorArray_at_1"]=asm["_emscripten_bind_tAnchorArray_at_1"];var _emscripten_bind_tAnchorArray_clear_0=Module["_emscripten_bind_tAnchorArray_clear_0"]=asm["_emscripten_bind_tAnchorArray_clear_0"];var _emscripten_bind_tAnchorArray_pop_back_0=Module["_emscripten_bind_tAnchorArray_pop_back_0"]=asm["_emscripten_bind_tAnchorArray_pop_back_0"];var _emscripten_bind_tAnchorArray_push_back_1=Module["_emscripten_bind_tAnchorArray_push_back_1"]=asm["_emscripten_bind_tAnchorArray_push_back_1"];var _emscripten_bind_tAnchorArray_size_0=Module["_emscripten_bind_tAnchorArray_size_0"]=asm["_emscripten_bind_tAnchorArray_size_0"];var _emscripten_bind_tFaceArray___destroy___0=Module["_emscripten_bind_tFaceArray___destroy___0"]=asm["_emscripten_bind_tFaceArray___destroy___0"];var _emscripten_bind_tFaceArray_at_1=Module["_emscripten_bind_tFaceArray_at_1"]=asm["_emscripten_bind_tFaceArray_at_1"];var _emscripten_bind_tFaceArray_size_0=Module["_emscripten_bind_tFaceArray_size_0"]=asm["_emscripten_bind_tFaceArray_size_0"];var _emscripten_bind_tLinkArray___destroy___0=Module["_emscripten_bind_tLinkArray___destroy___0"]=asm["_emscripten_bind_tLinkArray___destroy___0"];var _emscripten_bind_tLinkArray_at_1=Module["_emscripten_bind_tLinkArray_at_1"]=asm["_emscripten_bind_tLinkArray_at_1"];var _emscripten_bind_tLinkArray_size_0=Module["_emscripten_bind_tLinkArray_size_0"]=asm["_emscripten_bind_tLinkArray_size_0"];var _emscripten_bind_tMaterialArray___destroy___0=Module["_emscripten_bind_tMaterialArray___destroy___0"]=asm["_emscripten_bind_tMaterialArray___destroy___0"];var _emscripten_bind_tMaterialArray_at_1=Module["_emscripten_bind_tMaterialArray_at_1"]=asm["_emscripten_bind_tMaterialArray_at_1"];var _emscripten_bind_tMaterialArray_size_0=Module["_emscripten_bind_tMaterialArray_size_0"]=asm["_emscripten_bind_tMaterialArray_size_0"];var _emscripten_bind_tNodeArray___destroy___0=Module["_emscripten_bind_tNodeArray___destroy___0"]=asm["_emscripten_bind_tNodeArray___destroy___0"];var _emscripten_bind_tNodeArray_at_1=Module["_emscripten_bind_tNodeArray_at_1"]=asm["_emscripten_bind_tNodeArray_at_1"];var _emscripten_bind_tNodeArray_size_0=Module["_emscripten_bind_tNodeArray_size_0"]=asm["_emscripten_bind_tNodeArray_size_0"];var _emscripten_enum_PHY_ScalarType_PHY_DOUBLE=Module["_emscripten_enum_PHY_ScalarType_PHY_DOUBLE"]=asm["_emscripten_enum_PHY_ScalarType_PHY_DOUBLE"];var _emscripten_enum_PHY_ScalarType_PHY_FIXEDPOINT88=Module["_emscripten_enum_PHY_ScalarType_PHY_FIXEDPOINT88"]=asm["_emscripten_enum_PHY_ScalarType_PHY_FIXEDPOINT88"];var _emscripten_enum_PHY_ScalarType_PHY_FLOAT=Module["_emscripten_enum_PHY_ScalarType_PHY_FLOAT"]=asm["_emscripten_enum_PHY_ScalarType_PHY_FLOAT"];var _emscripten_enum_PHY_ScalarType_PHY_INTEGER=Module["_emscripten_enum_PHY_ScalarType_PHY_INTEGER"]=asm["_emscripten_enum_PHY_ScalarType_PHY_INTEGER"];var _emscripten_enum_PHY_ScalarType_PHY_SHORT=Module["_emscripten_enum_PHY_ScalarType_PHY_SHORT"]=asm["_emscripten_enum_PHY_ScalarType_PHY_SHORT"];var _emscripten_enum_PHY_ScalarType_PHY_UCHAR=Module["_emscripten_enum_PHY_ScalarType_PHY_UCHAR"]=asm["_emscripten_enum_PHY_ScalarType_PHY_UCHAR"];var _emscripten_enum_btConstraintParams_BT_CONSTRAINT_CFM=Module["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_CFM"]=asm["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_CFM"];var _emscripten_enum_btConstraintParams_BT_CONSTRAINT_ERP=Module["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_ERP"]=asm["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_ERP"];var _emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_CFM=Module["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_CFM"]=asm["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_CFM"];var _emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_ERP=Module["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_ERP"]=asm["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_ERP"];var _free=Module["_free"]=asm["_free"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var _llvm_bswap_i16=Module["_llvm_bswap_i16"]=asm["_llvm_bswap_i16"];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_di=Module["dynCall_di"]=asm["dynCall_di"];var dynCall_did=Module["dynCall_did"]=asm["dynCall_did"];var dynCall_diidii=Module["dynCall_diidii"]=asm["dynCall_diidii"];var dynCall_diii=Module["dynCall_diii"]=asm["dynCall_diii"];var dynCall_diiidii=Module["dynCall_diiidii"]=asm["dynCall_diiidii"];var dynCall_diiii=Module["dynCall_diiii"]=asm["dynCall_diiii"];var dynCall_diiiii=Module["dynCall_diiiii"]=asm["dynCall_diiiii"];var dynCall_diiiiiiii=Module["dynCall_diiiiiiii"]=asm["dynCall_diiiiiiii"];var dynCall_diiiiiiiii=Module["dynCall_diiiiiiiii"]=asm["dynCall_diiiiiiiii"];var dynCall_diiiiiiiiii=Module["dynCall_diiiiiiiiii"]=asm["dynCall_diiiiiiiiii"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_iidid=Module["dynCall_iidid"]=asm["dynCall_iidid"];var dynCall_iii=Module["dynCall_iii"]=asm["dynCall_iii"];var dynCall_iiid=Module["dynCall_iiid"]=asm["dynCall_iiid"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];var dynCall_iiiii=Module["dynCall_iiiii"]=asm["dynCall_iiiii"];var dynCall_iiiiii=Module["dynCall_iiiiii"]=asm["dynCall_iiiiii"];var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=asm["dynCall_iiiiiii"];var dynCall_iiiiiiiii=Module["dynCall_iiiiiiiii"]=asm["dynCall_iiiiiiiii"];var dynCall_iiiiiiiiiii=Module["dynCall_iiiiiiiiiii"]=asm["dynCall_iiiiiiiiiii"];var dynCall_v=Module["dynCall_v"]=asm["dynCall_v"];var dynCall_vi=Module["dynCall_vi"]=asm["dynCall_vi"];var dynCall_vid=Module["dynCall_vid"]=asm["dynCall_vid"];var dynCall_vidd=Module["dynCall_vidd"]=asm["dynCall_vidd"];var dynCall_viddiii=Module["dynCall_viddiii"]=asm["dynCall_viddiii"];var dynCall_vidi=Module["dynCall_vidi"]=asm["dynCall_vidi"];var dynCall_vidii=Module["dynCall_vidii"]=asm["dynCall_vidii"];var dynCall_vii=Module["dynCall_vii"]=asm["dynCall_vii"];var dynCall_viid=Module["dynCall_viid"]=asm["dynCall_viid"];var dynCall_viidi=Module["dynCall_viidi"]=asm["dynCall_viidi"];var dynCall_viidii=Module["dynCall_viidii"]=asm["dynCall_viidii"];var dynCall_viii=Module["dynCall_viii"]=asm["dynCall_viii"];var dynCall_viiid=Module["dynCall_viiid"]=asm["dynCall_viiid"];var dynCall_viiidii=Module["dynCall_viiidii"]=asm["dynCall_viiidii"];var dynCall_viiii=Module["dynCall_viiii"]=asm["dynCall_viiii"];var dynCall_viiiid=Module["dynCall_viiiid"]=asm["dynCall_viiiid"];var dynCall_viiiidddddidi=Module["dynCall_viiiidddddidi"]=asm["dynCall_viiiidddddidi"];var dynCall_viiiiddddiid=Module["dynCall_viiiiddddiid"]=asm["dynCall_viiiiddddiid"];var dynCall_viiiii=Module["dynCall_viiiii"]=asm["dynCall_viiiii"];var dynCall_viiiiid=Module["dynCall_viiiiid"]=asm["dynCall_viiiiid"];var dynCall_viiiiii=Module["dynCall_viiiiii"]=asm["dynCall_viiiiii"];var dynCall_viiiiiii=Module["dynCall_viiiiiii"]=asm["dynCall_viiiiiii"];var dynCall_viiiiiiiii=Module["dynCall_viiiiiiiii"]=asm["dynCall_viiiiiiiii"];var dynCall_viiiiiiiiii=Module["dynCall_viiiiiiiiii"]=asm["dynCall_viiiiiiiiii"];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;var preloadStartTime=null;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};function run(args){args=args||Module["arguments"];if(preloadStartTime===null)preloadStartTime=Date.now();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;var abortDecorators=[];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;i1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}else{Module["thisProgram"]="unknown-program"}}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(!Module["print"])Module["print"]=print;if(typeof printErr!="undefined")Module["printErr"]=printErr;if(typeof read!="undefined"){Module["read"]=function shell_read(f){var data=tryParseAsDataURI(f);if(data){return intArrayToString(data)}return read(f)}}else{Module["read"]=function shell_read(){throw"no read() available"}}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)};if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof console!=="undefined"){if(!Module["print"])Module["print"]=function shell_print(x){console.log(x)};if(!Module["printErr"])Module["printErr"]=function shell_printErr(x){console.warn(x)}}else{var TRY_USE_DUMP=false;if(!Module["print"])Module["print"]=TRY_USE_DUMP&&typeof dump!=="undefined"?(function(x){dump(x)}):(function(x){})}if(typeof Module["setWindowTitle"]==="undefined"){Module["setWindowTitle"]=(function(title){document.title=title})}}else{throw new Error("Unknown runtime environment. Where are we?")}if(!Module["print"]){Module["print"]=(function(){})}if(!Module["printErr"]){Module["printErr"]=Module["print"]}if(!Module["arguments"]){Module["arguments"]=[]}if(!Module["thisProgram"]){Module["thisProgram"]="./this.program"}if(!Module["quit"]){Module["quit"]=(function(status,toThrow){throw toThrow})}Module.print=Module["print"];Module.printErr=Module["printErr"];Module["preRun"]=[];Module["postRun"]=[];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 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 buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;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 ")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||67108864;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}var ASM_CONSTS=[(function($0,$1,$2,$3,$4,$5,$6,$7){var self=Module["getCache"](Module["ConcreteContactResultCallback"])[$0];if(!self.hasOwnProperty("addSingleResult"))throw"a JSImplementation must implement all functions, you forgot ConcreteContactResultCallback::addSingleResult.";return self["addSingleResult"]($1,$2,$3,$4,$5,$6,$7)})];function _emscripten_asm_const_diiiiiiii(code,a0,a1,a2,a3,a4,a5,a6,a7){return ASM_CONSTS[code](a0,a1,a2,a3,a4,a5,a6,a7)}STATIC_BASE=GLOBAL_BASE;STATICTOP=STATIC_BASE+28576;__ATINIT__.push({func:(function(){__GLOBAL__sub_I_btConeTwistConstraint_cpp()})},{func:(function(){__GLOBAL__sub_I_btQuickprof_cpp()})});memoryInitializer="data:application/octet-stream;base64,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6AoAAAMBAAAEAQAABQEAAAYBAAAnAAAABAAAABIAAABHAAAAAAAAABALAAADAQAABwEAAAUBAAAGAQAAJwAAAAUAAAATAAAASAAAAAAAAABACwAAAwEAAAgBAAAFAQAABgEAACcAAAAGAAAAFAAAAEkAAAB7IHZhciBzZWxmID0gTW9kdWxlWydnZXRDYWNoZSddKE1vZHVsZVsnQ29uY3JldGVDb250YWN0UmVzdWx0Q2FsbGJhY2snXSlbJDBdOyBpZiAoIXNlbGYuaGFzT3duUHJvcGVydHkoJ2FkZFNpbmdsZVJlc3VsdCcpKSB0aHJvdyAnYSBKU0ltcGxlbWVudGF0aW9uIG11c3QgaW1wbGVtZW50IGFsbCBmdW5jdGlvbnMsIHlvdSBmb3Jnb3QgQ29uY3JldGVDb250YWN0UmVzdWx0Q2FsbGJhY2s6OmFkZFNpbmdsZVJlc3VsdC4nOyByZXR1cm4gc2VsZlsnYWRkU2luZ2xlUmVzdWx0J10oJDEsJDIsJDMsJDQsJDUsJDYsJDcpOyB9ADI5Q29uY3JldGVDb250YWN0UmVzdWx0Q2FsbGJhY2sATjE2YnRDb2xsaXNpb25Xb3JsZDIxQ29udGFjdFJlc3VsdENhbGxiYWNrRQBOMTZidENvbGxpc2lvbldvcmxkMjRDbG9zZXN0UmF5UmVzdWx0Q2FsbGJhY2tFAE4xNmJ0Q29sbGlzaW9uV29ybGQxN1JheVJlc3VsdENhbGxiYWNrRQAxOWJ0R2hvc3RQYWlyQ2FsbGJhY2sAMjVidE92ZXJsYXBwaW5nUGFpckNhbGxiYWNrADIwYnREZWZhdWx0TW90aW9uU3RhdGUAMTNidE1vdGlvblN0YXRlADE4YnRWZWhpY2xlUmF5Y2FzdGVyAE4xNmJ0Q29sbGlzaW9uV29ybGQyN0Nsb3Nlc3RDb252ZXhSZXN1bHRDYWxsYmFja0UATjE2YnRDb2xsaXNpb25Xb3JsZDIwQ29udmV4UmVzdWx0Q2FsbGJhY2tFADIzYnREZWZhdWx0U29mdEJvZHlTb2x2ZXIAMTZidFNvZnRCb2R5U29sdmVyADQxYnRTb2Z0Qm9keVJpZ2lkQm9keUNvbGxpc2lvbkNvbmZpZ3VyYXRpb24ATjM1YnRTb2Z0Qm9keUNvbmNhdmVDb2xsaXNpb25BbGdvcml0aG0xN1N3YXBwZWRDcmVhdGVGdW5jRQAzMGJ0Q29sbGlzaW9uQWxnb3JpdGhtQ3JlYXRlRnVuYwBOMzVidFNvZnRCb2R5Q29uY2F2ZUNvbGxpc2lvbkFsZ29yaXRobTEwQ3JlYXRlRnVuY0UATjI5YnRTb2Z0UmlnaWRDb2xsaXNpb25BbGdvcml0aG0xMENyZWF0ZUZ1bmNFAE4yOGJ0U29mdFNvZnRDb2xsaXNpb25BbGdvcml0aG0xMENyZWF0ZUZ1bmNFAFNvZnRCb2R5TWF0ZXJpYWxEYXRhAFNvZnRCb2R5Tm9kZURhdGEAU29mdEJvZHlMaW5rRGF0YQBTb2Z0Qm9keUZhY2VEYXRhAFNvZnRCb2R5VGV0cmFEYXRhAFNvZnRSaWdpZEFuY2hvckRhdGEAZmxvYXQAU29mdEJvZHlQb3NlRGF0YQBTb2Z0Qm9keUNsdXN0ZXJEYXRhAGludABidFNvZnRCb2R5Sm9pbnREYXRhAGJ0U29mdEJvZHlGbG9hdERhdGEAMTBidFNvZnRCb2R5AE4xMGJ0U29mdEJvZHkxNVJheUZyb21Ub0Nhc3RlckUATjZidERidnQ4SUNvbGxpZGVFAE4xMGJ0U29mdEJvZHk1Sm9pbnRFAE4xMGJ0U29mdEJvZHk2Q0pvaW50RQBOMTBidFNvZnRCb2R5NkxKb2ludEUAU29mdEJvZHkAMjRidFNvZnRCb2R5Q29sbGlzaW9uU2hhcGUAYnRDb252ZXhJbnRlcm5hbFNoYXBlRGF0YQBTT0ZUQ0xVU1RFUgAyN2J0U29mdENsdXN0ZXJDb2xsaXNpb25TaGFwZQBOMTVidFNvZnRDb2xsaWRlcnMxMkNvbGxpZGVDTF9SU0UATjE1YnRTb2Z0Q29sbGlkZXJzMTFDbHVzdGVyQmFzZUUATjE1YnRTb2Z0Q29sbGlkZXJzMTNDb2xsaWRlU0RGX1JTRQBOMTVidFNvZnRDb2xsaWRlcnMxMkNvbGxpZGVWRl9TU0UATjE1YnRTb2Z0Q29sbGlkZXJzMTJDb2xsaWRlQ0xfU1NFADI5YnRTb2Z0UmlnaWRDb2xsaXNpb25BbGdvcml0aG0AMjBidENvbGxpc2lvbkFsZ29yaXRobQBUcmlhbmdsZQAxNWJ0VHJpYW5nbGVTaGFwZQBOMTJidENvbnZleENhc3QxMENhc3RSZXN1bHRFAFpOMzVidFNvZnRCb2R5Q29uY2F2ZUNvbGxpc2lvbkFsZ29yaXRobTIxY2FsY3VsYXRlVGltZU9mSW1wYWN0RVAxN2J0Q29sbGlzaW9uT2JqZWN0UzFfUksxNmJ0RGlzcGF0Y2hlckluZm9QMTZidE1hbmlmb2xkUmVzdWx0RTMxTG9jYWxUcmlhbmdsZVNwaGVyZUNhc3RDYWxsYmFjawAyNmJ0U29mdEJvZHlUcmlhbmdsZUNhbGxiYWNrADM1YnRTb2Z0Qm9keUNvbmNhdmVDb2xsaXNpb25BbGdvcml0aG0AMjNidFNvZnRTaW5nbGVSYXlDYWxsYmFjawAyM2J0QnJvYWRwaGFzZVJheUNhbGxiYWNrADI0YnRCcm9hZHBoYXNlQWFiYkNhbGxiYWNrADI0YnRTb2Z0UmlnaWREeW5hbWljc1dvcmxkADI4YnRTb2Z0U29mdENvbGxpc2lvbkFsZ29yaXRobQBidFJpZ2lkQm9keUZsb2F0RGF0YQAxMWJ0UmlnaWRCb2R5ADM0YnRDbG9zZXN0Tm90TWVDb252ZXhSZXN1bHRDYWxsYmFjawBidER5bmFtaWNzV29ybGRGbG9hdERhdGEAMjNidERpc2NyZXRlRHluYW1pY3NXb3JsZAAxNWJ0RHluYW1pY3NXb3JsZAAyN0lucGxhY2VTb2x2ZXJJc2xhbmRDYWxsYmFjawBOMjVidFNpbXVsYXRpb25Jc2xhbmRNYW5hZ2VyMTRJc2xhbmRDYWxsYmFja0UAYnRHZW5lcmljNkRvZlNwcmluZzJDb25zdHJhaW50RGF0YQAxN2J0VHlwZWRDb25zdHJhaW50ADEzYnRUeXBlZE9iamVjdAAxN2J0Rml4ZWRDb25zdHJhaW50AGJ0R2VuZXJpYzZEb2ZDb25zdHJhaW50RGF0YQAyM2J0R2VuZXJpYzZEb2ZDb25zdHJhaW50AGJ0R2VuZXJpYzZEb2ZTcHJpbmdDb25zdHJhaW50RGF0YQAyOWJ0R2VuZXJpYzZEb2ZTcHJpbmdDb25zdHJhaW50AGJ0UG9pbnQyUG9pbnRDb25zdHJhaW50RmxvYXREYXRhADIzYnRQb2ludDJQb2ludENvbnN0cmFpbnQAYnRUeXBlZENvbnN0cmFpbnRGbG9hdERhdGEAYnRTbGlkZXJDb25zdHJhaW50RGF0YQAxOGJ0U2xpZGVyQ29uc3RyYWludABidENvbmVUd2lzdENvbnN0cmFpbnREYXRhADIxYnRDb25lVHdpc3RDb25zdHJhaW50AGJ0SGluZ2VDb25zdHJhaW50RmxvYXREYXRhADE3YnRIaW5nZUNvbnN0cmFpbnQAMzVidFNlcXVlbnRpYWxJbXB1bHNlQ29uc3RyYWludFNvbHZlcgAxOGJ0Q29uc3RyYWludFNvbHZlcgAxNmJ0UmF5Y2FzdFZlaGljbGUAMTdidEFjdGlvbkludGVyZmFjZQAyNWJ0RGVmYXVsdFZlaGljbGVSYXljYXN0ZXIANDNidEtpbmVtYXRpY0Nsb3Nlc3ROb3RNZUNvbnZleFJlc3VsdENhbGxiYWNrADMwYnRLaW5lbWF0aWNDaGFyYWN0ZXJDb250cm9sbGVyADMwYnRDaGFyYWN0ZXJDb250cm9sbGVySW50ZXJmYWNlADIyYnRTdWJzaW1wbGV4Q29udmV4Q2FzdAAxMmJ0Q29udmV4Q2FzdABidENvbGxpc2lvbk9iamVjdEZsb2F0RGF0YQAxN2J0Q29sbGlzaW9uT2JqZWN0ADEzYnRHaG9zdE9iamVjdAAyNGJ0UGFpckNhY2hpbmdHaG9zdE9iamVjdAAyM2J0Q29sbGlzaW9uUGFpckNhbGxiYWNrADE3YnRPdmVybGFwQ2FsbGJhY2sAMjFidENvbGxpc2lvbkRpc3BhdGNoZXIAMzFidERlZmF1bHRDb2xsaXNpb25Db25maWd1cmF0aW9uADI0YnRDb2xsaXNpb25Db25maWd1cmF0aW9uAE4zMWJ0Q29udmV4UGxhbmVDb2xsaXNpb25BbGdvcml0aG0xMENyZWF0ZUZ1bmNFAE4yNmJ0Qm94Qm94Q29sbGlzaW9uQWxnb3JpdGhtMTBDcmVhdGVGdW5jRQBOMzRidFNwaGVyZVRyaWFuZ2xlQ29sbGlzaW9uQWxnb3JpdGhtMTBDcmVhdGVGdW5jRQBOMzJidFNwaGVyZVNwaGVyZUNvbGxpc2lvbkFsZ29yaXRobTEwQ3JlYXRlRnVuY0UATjE2YnRFbXB0eUFsZ29yaXRobTEwQ3JlYXRlRnVuY0UATjI4YnRDb21wb3VuZENvbGxpc2lvbkFsZ29yaXRobTE3U3dhcHBlZENyZWF0ZUZ1bmNFAE4zNmJ0Q29tcG91bmRDb21wb3VuZENvbGxpc2lvbkFsZ29yaXRobTEwQ3JlYXRlRnVuY0UATjI4YnRDb21wb3VuZENvbGxpc2lvbkFsZ29yaXRobTEwQ3JlYXRlRnVuY0UATjMzYnRDb252ZXhDb25jYXZlQ29sbGlzaW9uQWxnb3JpdGhtMTdTd2FwcGVkQ3JlYXRlRnVuY0UATjMzYnRDb252ZXhDb25jYXZlQ29sbGlzaW9uQWxnb3JpdGhtMTBDcmVhdGVGdW5jRQAyNWJ0U2ltdWxhdGlvbklzbGFuZE1hbmFnZXIAMzFidENvbnZleFBsYW5lQ29sbGlzaW9uQWxnb3JpdGhtAFpOMzNidENvbnZleENvbmNhdmVDb2xsaXNpb25BbGdvcml0aG0yMWNhbGN1bGF0ZVRpbWVPZkltcGFjdEVQMTdidENvbGxpc2lvbk9iamVjdFMxX1JLMTZidERpc3BhdGNoZXJJbmZvUDE2YnRNYW5pZm9sZFJlc3VsdEUzMUxvY2FsVHJpYW5nbGVTcGhlcmVDYXN0Q2FsbGJhY2sAMjRidENvbnZleFRyaWFuZ2xlQ2FsbGJhY2sAMzNidENvbnZleENvbmNhdmVDb2xsaXNpb25BbGdvcml0aG0AMjZidEJveEJveENvbGxpc2lvbkFsZ29yaXRobQAxNmJ0TWFuaWZvbGRSZXN1bHQATjM2YnREaXNjcmV0ZUNvbGxpc2lvbkRldGVjdG9ySW50ZXJmYWNlNlJlc3VsdEUAWk4xNmJ0Q29sbGlzaW9uV29ybGQyMXJheVRlc3RTaW5nbGVJbnRlcm5hbEVSSzExYnRUcmFuc2Zvcm1TMl9QSzI0YnRDb2xsaXNpb25PYmplY3RXcmFwcGVyUk5TXzE3UmF5UmVzdWx0Q2FsbGJhY2tFRTE1TG9jYWxJbmZvQWRkZXIyAFpOMTZidENvbGxpc2lvbldvcmxkMjFyYXlUZXN0U2luZ2xlSW50ZXJuYWxFUksxMWJ0VHJhbnNmb3JtUzJfUEsyNGJ0Q29sbGlzaW9uT2JqZWN0V3JhcHBlclJOU18xN1JheVJlc3VsdENhbGxiYWNrRUU5UmF5VGVzdGVyAFpOMTZidENvbGxpc2lvbldvcmxkMjFyYXlUZXN0U2luZ2xlSW50ZXJuYWxFUksxMWJ0VHJhbnNmb3JtUzJfUEsyNGJ0Q29sbGlzaW9uT2JqZWN0V3JhcHBlclJOU18xN1JheVJlc3VsdENhbGxiYWNrRUUyOUJyaWRnZVRyaWFuZ2xlUmF5Y2FzdENhbGxiYWNrXzAAWk4xNmJ0Q29sbGlzaW9uV29ybGQyMXJheVRlc3RTaW5nbGVJbnRlcm5hbEVSSzExYnRUcmFuc2Zvcm1TMl9QSzI0YnRDb2xsaXNpb25PYmplY3RXcmFwcGVyUk5TXzE3UmF5UmVzdWx0Q2FsbGJhY2tFRTI5QnJpZGdlVHJpYW5nbGVSYXljYXN0Q2FsbGJhY2sAMTlidFNpbmdsZVJheUNhbGxiYWNrADE3RGVidWdEcmF3Y2FsbGJhY2sAAU92ZXJmbG93IGluIEFBQkIsIG9iamVjdCByZW1vdmVkIGZyb20gc2ltdWxhdGlvbgBJZiB5b3UgY2FuIHJlcHJvZHVjZSB0aGlzLCBwbGVhc2UgZW1haWwgYnVnc0Bjb250aW51b3VzcGh5c2ljcy5jb20KAFBsZWFzZSBpbmNsdWRlIGFib3ZlIGluZm9ybWF0aW9uLCB5b3VyIFBsYXRmb3JtLCB2ZXJzaW9uIG9mIE9TLgoAVGhhbmtzLgoAMTZidENvbGxpc2lvbldvcmxkAFpaTjE2YnRDb2xsaXNpb25Xb3JsZDI1b2JqZWN0UXVlcnlTaW5nbGVJbnRlcm5hbEVQSzEzYnRDb252ZXhTaGFwZVJLMTFidFRyYW5zZm9ybVM1X1BLMjRidENvbGxpc2lvbk9iamVjdFdyYXBwZXJSTlNfMjBDb252ZXhSZXN1bHRDYWxsYmFja0VmRU4yMmJ0Q29tcG91bmRMZWFmQ2FsbGJhY2sxMlByb2Nlc3NDaGlsZEVpUzVfUEsxNmJ0Q29sbGlzaW9uU2hhcGVFMTRMb2NhbEluZm9BZGRlcgBaTjE2YnRDb2xsaXNpb25Xb3JsZDI1b2JqZWN0UXVlcnlTaW5nbGVJbnRlcm5hbEVQSzEzYnRDb252ZXhTaGFwZVJLMTFidFRyYW5zZm9ybVM1X1BLMjRidENvbGxpc2lvbk9iamVjdFdyYXBwZXJSTlNfMjBDb252ZXhSZXN1bHRDYWxsYmFja0VmRTIyYnRDb21wb3VuZExlYWZDYWxsYmFjawBaTjE2YnRDb2xsaXNpb25Xb3JsZDI1b2JqZWN0UXVlcnlTaW5nbGVJbnRlcm5hbEVQSzEzYnRDb252ZXhTaGFwZVJLMTFidFRyYW5zZm9ybVM1X1BLMjRidENvbGxpc2lvbk9iamVjdFdyYXBwZXJSTlNfMjBDb252ZXhSZXN1bHRDYWxsYmFja0VmRTMyQnJpZGdlVHJpYW5nbGVDb252ZXhjYXN0Q2FsbGJhY2tfMABaTjE2YnRDb2xsaXNpb25Xb3JsZDI1b2JqZWN0UXVlcnlTaW5nbGVJbnRlcm5hbEVQSzEzYnRDb252ZXhTaGFwZVJLMTFidFRyYW5zZm9ybVM1X1BLMjRidENvbGxpc2lvbk9iamVjdFdyYXBwZXJSTlNfMjBDb252ZXhSZXN1bHRDYWxsYmFja0VmRTMyQnJpZGdlVHJpYW5nbGVDb252ZXhjYXN0Q2FsbGJhY2sAMjFidFNpbmdsZVN3ZWVwQ2FsbGJhY2sAMjNidEJyaWRnZWRNYW5pZm9sZFJlc3VsdAAyM2J0U2luZ2xlQ29udGFjdENhbGxiYWNrADM0YnRTcGhlcmVUcmlhbmdsZUNvbGxpc2lvbkFsZ29yaXRobQAyNGJ0UGVydHVyYmVkQ29udGFjdFJlc3VsdABaTjIzYnRDb252ZXhDb252ZXhBbGdvcml0aG0xNnByb2Nlc3NDb2xsaXNpb25FUEsyNGJ0Q29sbGlzaW9uT2JqZWN0V3JhcHBlclMyX1JLMTZidERpc3BhdGNoZXJJbmZvUDE2YnRNYW5pZm9sZFJlc3VsdEUyMWJ0V2l0aG91dE1hcmdpblJlc3VsdABaTjIzYnRDb252ZXhDb252ZXhBbGdvcml0aG0xNnByb2Nlc3NDb2xsaXNpb25FUEsyNGJ0Q29sbGlzaW9uT2JqZWN0V3JhcHBlclMyX1JLMTZidERpc3BhdGNoZXJJbmZvUDE2YnRNYW5pZm9sZFJlc3VsdEUxM2J0RHVtbXlSZXN1bHQAMjNidENvbnZleENvbnZleEFsZ29yaXRobQBOMjNidENvbnZleENvbnZleEFsZ29yaXRobTEwQ3JlYXRlRnVuY0UAMjJidENvbXBvdW5kTGVhZkNhbGxiYWNrADI4YnRDb21wb3VuZENvbGxpc2lvbkFsZ29yaXRobQAzMGJ0Q29tcG91bmRDb21wb3VuZExlYWZDYWxsYmFjawAzNmJ0Q29tcG91bmRDb21wb3VuZENvbGxpc2lvbkFsZ29yaXRobQBidENvbXBvdW5kU2hhcGVDaGlsZERhdGEAYnRDb21wb3VuZFNoYXBlRGF0YQBDb21wb3VuZAAxNWJ0Q29tcG91bmRTaGFwZQBidENvbmVTaGFwZURhdGEAQ29uZQAxMWJ0Q29uZVNoYXBlAENvbmVaADEyYnRDb25lU2hhcGVaAENvbmVYADEyYnRDb25lU2hhcGVYAFNQSEVSRQAxM2J0U3BoZXJlU2hhcGUAWk5LMjJidEJ2aFRyaWFuZ2xlTWVzaFNoYXBlMTlwcm9jZXNzQWxsVHJpYW5nbGVzRVAxOGJ0VHJpYW5nbGVDYWxsYmFja1JLOWJ0VmVjdG9yM1M0X0UyMU15Tm9kZU92ZXJsYXBDYWxsYmFjawAyMWJ0Tm9kZU92ZXJsYXBDYWxsYmFjawBidFRyaWFuZ2xlTWVzaFNoYXBlRGF0YQBCVkhUUklBTkdMRU1FU0gAMjJidEJ2aFRyaWFuZ2xlTWVzaFNoYXBlAFpOMjJidEJ2aFRyaWFuZ2xlTWVzaFNoYXBlMTRwZXJmb3JtUmF5Y2FzdEVQMThidFRyaWFuZ2xlQ2FsbGJhY2tSSzlidFZlY3RvcjNTNF9FMjFNeU5vZGVPdmVybGFwQ2FsbGJhY2sAWk4yMmJ0QnZoVHJpYW5nbGVNZXNoU2hhcGUxN3BlcmZvcm1Db252ZXhjYXN0RVAxOGJ0VHJpYW5nbGVDYWxsYmFja1JLOWJ0VmVjdG9yM1M0X1M0X1M0X0UyMU15Tm9kZU92ZXJsYXBDYWxsYmFjawAyMVN1cHBvcnRWZXJ0ZXhDYWxsYmFjawBaTksxOWJ0VHJpYW5nbGVNZXNoU2hhcGUxOXByb2Nlc3NBbGxUcmlhbmdsZXNFUDE4YnRUcmlhbmdsZUNhbGxiYWNrUks5YnRWZWN0b3IzUzRfRTE2RmlsdGVyZWRDYWxsYmFjawBUUklBTkdMRU1FU0gAMTlidFRyaWFuZ2xlTWVzaFNoYXBlAGJ0U3RhdGljUGxhbmVTaGFwZURhdGEAU1RBVElDUExBTkUAMThidFN0YXRpY1BsYW5lU2hhcGUAMjNidFBvbHloZWRyYWxDb252ZXhTaGFwZQAzNGJ0UG9seWhlZHJhbENvbnZleEFhYmJDYWNoaW5nU2hhcGUAYnRDb2xsaXNpb25TaGFwZURhdGEAMTZidENvbGxpc2lvblNoYXBlADEzYnRDb252ZXhTaGFwZQAyMWJ0Q29udmV4SW50ZXJuYWxTaGFwZQBidENvbnZleEh1bGxTaGFwZURhdGEAQ29udmV4ADE3YnRDb252ZXhIdWxsU2hhcGUAMThidFRyaWFuZ2xlQ2FsbGJhY2sAMzFidEludGVybmFsVHJpYW5nbGVJbmRleENhbGxiYWNrAGJ0Q2Fwc3VsZVNoYXBlRGF0YQBDYXBzdWxlU2hhcGUAMTRidENhcHN1bGVTaGFwZQBDYXBzdWxlWAAxNWJ0Q2Fwc3VsZVNoYXBlWABDYXBzdWxlWgAxNWJ0Q2Fwc3VsZVNoYXBlWgAyNkxvY2FsU3VwcG9ydFZlcnRleENhbGxiYWNrAENvbnZleFRyaW1lc2gAMjVidENvbnZleFRyaWFuZ2xlTWVzaFNoYXBlADE0YnRDb25jYXZlU2hhcGUAQm94ADEwYnRCb3hTaGFwZQAxNGJ0T3B0aW1pemVkQnZoAFpOMTRidE9wdGltaXplZEJ2aDVidWlsZEVQMjNidFN0cmlkaW5nTWVzaEludGVyZmFjZWJSSzlidFZlY3RvcjNTNF9FMjBOb2RlVHJpYW5nbGVDYWxsYmFjawBaTjE0YnRPcHRpbWl6ZWRCdmg1YnVpbGRFUDIzYnRTdHJpZGluZ01lc2hJbnRlcmZhY2ViUks5YnRWZWN0b3IzUzRfRTI5UXVhbnRpemVkTm9kZVRyaWFuZ2xlQ2FsbGJhY2sASEVJR0hURklFTEQAMjVidEhlaWdodGZpZWxkVGVycmFpblNoYXBlAGJ0Q3lsaW5kZXJTaGFwZURhdGEAQ3lsaW5kZXJZADE1YnRDeWxpbmRlclNoYXBlAEN5bGluZGVyWAAxNmJ0Q3lsaW5kZXJTaGFwZVgAQ3lsaW5kZXJaADE2YnRDeWxpbmRlclNoYXBlWgAxNGJ0VHJpYW5nbGVNZXNoADIwYnRBeGlzU3dlZXAzSW50ZXJuYWxJdEUAMjFidEJyb2FkcGhhc2VJbnRlcmZhY2UAMTJidEF4aXNTd2VlcDMAMTVidE51bGxQYWlyQ2FjaGUAMjJidE92ZXJsYXBwaW5nUGFpckNhY2hlAFpOMjhidEhhc2hlZE92ZXJsYXBwaW5nUGFpckNhY2hlMTljbGVhblByb3h5RnJvbVBhaXJzRVAxN2J0QnJvYWRwaGFzZVByb3h5UDEyYnREaXNwYXRjaGVyRTE3Q2xlYW5QYWlyQ2FsbGJhY2sAWk4yOGJ0SGFzaGVkT3ZlcmxhcHBpbmdQYWlyQ2FjaGUzN3JlbW92ZU92ZXJsYXBwaW5nUGFpcnNDb250YWluaW5nUHJveHlFUDE3YnRCcm9hZHBoYXNlUHJveHlQMTJidERpc3BhdGNoZXJFMThSZW1vdmVQYWlyQ2FsbGJhY2sAMjhidEhhc2hlZE92ZXJsYXBwaW5nUGFpckNhY2hlADE4YnREYnZ0VHJlZUNvbGxpZGVyADIwQnJvYWRwaGFzZUFhYmJUZXN0ZXIAMTlCcm9hZHBoYXNlUmF5VGVzdGVyADE2YnREYnZ0QnJvYWRwaGFzZQAxMmJ0RGlzcGF0Y2hlcgBidE9wdGltaXplZEJ2aE5vZGVEYXRhAGJ0UXVhbnRpemVkQnZoTm9kZURhdGEAYnRCdmhTdWJ0cmVlSW5mb0RhdGEAYnRRdWFudGl6ZWRCdmhGbG9hdERhdGEAMTRidFF1YW50aXplZEJ2aAAyNWJ0VHJpYW5nbGVSYXljYXN0Q2FsbGJhY2sAMjhidFRyaWFuZ2xlQ29udmV4Y2FzdENhbGxiYWNrAFpOMzNidE1pbmtvd3NraVBlbmV0cmF0aW9uRGVwdGhTb2x2ZXIxMmNhbGNQZW5EZXB0aEVSMjJidFZvcm9ub2lTaW1wbGV4U29sdmVyUEsxM2J0Q29udmV4U2hhcGVTNF9SSzExYnRUcmFuc2Zvcm1TN19SOWJ0VmVjdG9yM1M5X1M5X1AxMmJ0SURlYnVnRHJhd0UyMGJ0SW50ZXJtZWRpYXRlUmVzdWx0ADMzYnRNaW5rb3dza2lQZW5ldHJhdGlvbkRlcHRoU29sdmVyADMwYnRDb252ZXhQZW5ldHJhdGlvbkRlcHRoU29sdmVyADMwYnRHamtFcGFQZW5ldHJhdGlvbkRlcHRoU29sdmVyADE2YnRQb2ludENvbGxlY3RvcgAxNWJ0R2prQ29udmV4Q2FzdAAyN2J0Q29udGludW91c0NvbnZleENvbGxpc2lvbgAxN2J0R2prUGFpckRldGVjdG9yADM2YnREaXNjcmV0ZUNvbGxpc2lvbkRldGVjdG9ySW50ZXJmYWNlADMwYnRBY3RpdmF0aW5nQ29sbGlzaW9uQWxnb3JpdGhtADE2YnRFbXB0eUFsZ29yaXRobQAzMmJ0U3BoZXJlU3BoZXJlQ29sbGlzaW9uQWxnb3JpdGhtADE2YnRCb3hCb3hEZXRlY3RvcgAyMlNwaGVyZVRyaWFuZ2xlRGV0ZWN0b3IAMjNidEhhc2hlZFNpbXBsZVBhaXJDYWNoZQAxOGJ0Q29udmV4UG9seWhlZHJvbgAyNmJ0VHJpYW5nbGVJbmRleFZlcnRleEFycmF5AGJ0SW50SW5kZXhEYXRhAGJ0U2hvcnRJbnRJbmRleFRyaXBsZXREYXRhAGJ0Q2hhckluZGV4VHJpcGxldERhdGEAYnRWZWN0b3IzRmxvYXREYXRhAGJ0VmVjdG9yM0RvdWJsZURhdGEAYnRNZXNoUGFydERhdGEAYnRTdHJpZGluZ01lc2hJbnRlcmZhY2VEYXRhADIzYnRTdHJpZGluZ01lc2hJbnRlcmZhY2UAUm9vdAARAAoAERERAAAAAAUAAAAAAAAJAAAAAAsAAAAAAAAAABEADwoREREDCgcAARMJCwsAAAkGCwAACwAGEQAAABEREQAAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAARAAoKERERAAoAAAIACQsAAAAJAAsAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAADAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAA0AAAAEDQAAAAAJDgAAAAAADgAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAPAAAAAA8AAAAACRAAAAAAABAAABAAABIAAAASEhIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAABISEgAAAAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAAAAAAAAAAAAAoAAAAACgAAAAAJCwAAAAAACwAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAAAAwAAAAACQwAAAAAAAwAAAwAAC0rICAgMFgweAAobnVsbCkALTBYKzBYIDBYLTB4KzB4IDB4AGluZgBJTkYAbmFuAE5BTgAwMTIzNDU2Nzg5QUJDREVGLgBUISIZDQECAxFLHAwQBAsdEh4naG5vcHFiIAUGDxMUFRoIFgcoJBcYCQoOGx8lI4OCfSYqKzw9Pj9DR0pNWFlaW1xdXl9gYWNkZWZnaWprbHJzdHl6e3wASWxsZWdhbCBieXRlIHNlcXVlbmNlAERvbWFpbiBlcnJvcgBSZXN1bHQgbm90IHJlcHJlc2VudGFibGUATm90IGEgdHR5AFBlcm1pc3Npb24gZGVuaWVkAE9wZXJhdGlvbiBub3QgcGVybWl0dGVkAE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkATm8gc3VjaCBwcm9jZXNzAEZpbGUgZXhpc3RzAFZhbHVlIHRvbyBsYXJnZSBmb3IgZGF0YSB0eXBlAE5vIHNwYWNlIGxlZnQgb24gZGV2aWNlAE91dCBvZiBtZW1vcnkAUmVzb3VyY2UgYnVzeQBJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbABSZXNvdXJjZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZQBJbnZhbGlkIHNlZWsAQ3Jvc3MtZGV2aWNlIGxpbmsAUmVhZC1vbmx5IGZpbGUgc3lzdGVtAERpcmVjdG9yeSBub3QgZW1wdHkAQ29ubmVjdGlvbiByZXNldCBieSBwZWVyAE9wZXJhdGlvbiB0aW1lZCBvdXQAQ29ubmVjdGlvbiByZWZ1c2VkAEhvc3QgaXMgZG93bgBIb3N0IGlzIHVucmVhY2hhYmxlAEFkZHJlc3MgaW4gdXNlAEJyb2tlbiBwaXBlAEkvTyBlcnJvcgBObyBzdWNoIGRldmljZSBvciBhZGRyZXNzAEJsb2NrIGRldmljZSByZXF1aXJlZABObyBzdWNoIGRldmljZQBOb3QgYSBkaXJlY3RvcnkASXMgYSBkaXJlY3RvcnkAVGV4dCBmaWxlIGJ1c3kARXhlYyBmb3JtYXQgZXJyb3IASW52YWxpZCBhcmd1bWVudABBcmd1bWVudCBsaXN0IHRvbyBsb25nAFN5bWJvbGljIGxpbmsgbG9vcABGaWxlbmFtZSB0b28gbG9uZwBUb28gbWFueSBvcGVuIGZpbGVzIGluIHN5c3RlbQBObyBmaWxlIGRlc2NyaXB0b3JzIGF2YWlsYWJsZQBCYWQgZmlsZSBkZXNjcmlwdG9yAE5vIGNoaWxkIHByb2Nlc3MAQmFkIGFkZHJlc3MARmlsZSB0b28gbGFyZ2UAVG9vIG1hbnkgbGlua3MATm8gbG9ja3MgYXZhaWxhYmxlAFJlc291cmNlIGRlYWRsb2NrIHdvdWxkIG9jY3VyAFN0YXRlIG5vdCByZWNvdmVyYWJsZQBQcmV2aW91cyBvd25lciBkaWVkAE9wZXJhdGlvbiBjYW5jZWxlZABGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQATm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUASWRlbnRpZmllciByZW1vdmVkAERldmljZSBub3QgYSBzdHJlYW0ATm8gZGF0YSBhdmFpbGFibGUARGV2aWNlIHRpbWVvdXQAT3V0IG9mIHN0cmVhbXMgcmVzb3VyY2VzAExpbmsgaGFzIGJlZW4gc2V2ZXJlZABQcm90b2NvbCBlcnJvcgBCYWQgbWVzc2FnZQBGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlAE5vdCBhIHNvY2tldABEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkAE1lc3NhZ2UgdG9vIGxhcmdlAFByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldABQcm90b2NvbCBub3QgYXZhaWxhYmxlAFByb3RvY29sIG5vdCBzdXBwb3J0ZWQAU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZABOb3Qgc3VwcG9ydGVkAFByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkAEFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wAQWRkcmVzcyBub3QgYXZhaWxhYmxlAE5ldHdvcmsgaXMgZG93bgBOZXR3b3JrIHVucmVhY2hhYmxlAENvbm5lY3Rpb24gcmVzZXQgYnkgbmV0d29yawBDb25uZWN0aW9uIGFib3J0ZWQATm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZQBTb2NrZXQgaXMgY29ubmVjdGVkAFNvY2tldCBub3QgY29ubmVjdGVkAENhbm5vdCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93bgBPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcwBPcGVyYXRpb24gaW4gcHJvZ3Jlc3MAU3RhbGUgZmlsZSBoYW5kbGUAUmVtb3RlIEkvTyBlcnJvcgBRdW90YSBleGNlZWRlZABObyBtZWRpdW0gZm91bmQAV3JvbmcgbWVkaXVtIHR5cGUATm8gZXJyb3IgaW5mb3JtYXRpb24AAHRlcm1pbmF0aW5nIHdpdGggJXMgZXhjZXB0aW9uIG9mIHR5cGUgJXM6ICVzAHRlcm1pbmF0aW5nIHdpdGggJXMgZXhjZXB0aW9uIG9mIHR5cGUgJXMAdGVybWluYXRpbmcgd2l0aCAlcyBmb3JlaWduIGV4Y2VwdGlvbgB0ZXJtaW5hdGluZwB1bmNhdWdodABTdDlleGNlcHRpb24ATjEwX19jeHhhYml2MTE2X19zaGltX3R5cGVfaW5mb0UAU3Q5dHlwZV9pbmZvAE4xMF9fY3h4YWJpdjEyMF9fc2lfY2xhc3NfdHlwZV9pbmZvRQBOMTBfX2N4eGFiaXYxMTdfX2NsYXNzX3R5cGVfaW5mb0UAcHRocmVhZF9vbmNlIGZhaWx1cmUgaW4gX19jeGFfZ2V0X2dsb2JhbHNfZmFzdCgpAGNhbm5vdCBjcmVhdGUgcHRocmVhZCBrZXkgZm9yIF9fY3hhX2dldF9nbG9iYWxzKCkAY2Fubm90IHplcm8gb3V0IHRocmVhZCB2YWx1ZSBmb3IgX19jeGFfZ2V0X2dsb2JhbHMoKQB0ZXJtaW5hdGVfaGFuZGxlciB1bmV4cGVjdGVkbHkgcmV0dXJuZWQATjEwX19jeHhhYml2MTE5X19wb2ludGVyX3R5cGVfaW5mb0UATjEwX19jeHhhYml2MTE3X19wYmFzZV90eXBlX2luZm9FAE4xMF9fY3h4YWJpdjEyMV9fdm1pX2NsYXNzX3R5cGVfaW5mb0U=";var tempDoublePtr=STATICTOP;STATICTOP+=16;function __ZN30btGeneric6DofSpring2Constraint8getInfo1EPN17btTypedConstraint17btConstraintInfo1E(){Module["printErr"]("missing function: _ZN30btGeneric6DofSpring2Constraint8getInfo1EPN17btTypedConstraint17btConstraintInfo1E");abort(-1)}function __ZN30btGeneric6DofSpring2Constraint8getInfo2EPN17btTypedConstraint17btConstraintInfo2E(){Module["printErr"]("missing function: _ZN30btGeneric6DofSpring2Constraint8getInfo2EPN17btTypedConstraint17btConstraintInfo2E");abort(-1)}function __ZN30btGeneric6DofSpring2Constraint8setParamEifi(){Module["printErr"]("missing function: _ZN30btGeneric6DofSpring2Constraint8setParamEifi");abort(-1)}function __ZN30btGeneric6DofSpring2ConstraintC2ER11btRigidBodyS1_RK11btTransformS4_11RotateOrder(){Module["printErr"]("missing function: _ZN30btGeneric6DofSpring2ConstraintC2ER11btRigidBodyS1_RK11btTransformS4_11RotateOrder");abort(-1)}function __ZNK30btGeneric6DofSpring2Constraint8getParamEii(){Module["printErr"]("missing function: _ZNK30btGeneric6DofSpring2Constraint8getParamEii");abort(-1)}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 ___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.buffer){___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]=now/1e3|0;HEAP32[ptr+4>>2]=now%1e3*1e3|0;return 0}var _llvm_pow_f32=Math_pow;function _llvm_trap(){abort("trap!")}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}var PTHREAD_SPECIFIC={};function _pthread_getspecific(key){return PTHREAD_SPECIFIC[key]||0}var PTHREAD_SPECIFIC_NEXT_KEY=1;var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function _pthread_key_create(key,destructor){if(key==0){return ERRNO_CODES.EINVAL}HEAP32[key>>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}function __ZTI30btGeneric6DofSpring2Constraint(){Module["printErr"]("missing function: _ZTI30btGeneric6DofSpring2Constraint");abort(-1)}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(i>2]=c[a+4>>2];c[b+20>>2]=c[a+8>>2];c[b+24>>2]=c[a+12>>2];c[b+28>>2]=c[a+16>>2];c[b+32>>2]=c[a+20>>2];c[b+36>>2]=c[a+24>>2];c[b+40>>2]=c[a+28>>2];c[b+44>>2]=c[a+32>>2];c[b+48>>2]=c[a+36>>2];c[b+52>>2]=c[a+40>>2];c[b+56>>2]=c[a+44>>2];c[b+60>>2]=c[a+48>>2];c[b+64>>2]=c[a+52>>2];c[b+68>>2]=c[a+56>>2];c[b+72>>2]=c[a+60>>2];c[b+76>>2]=c[a+64>>2];c[b+80>>2]=c[a+68>>2];c[b+84>>2]=c[a+72>>2];c[b+88>>2]=c[a+76>>2];c[b+92>>2]=c[a+80>>2];c[b+96>>2]=c[a+84>>2];c[b+100>>2]=c[a+88>>2];c[b+104>>2]=c[a+92>>2];c[b+108>>2]=c[a+96>>2];c[b+112>>2]=c[a+100>>2];c[b+116>>2]=c[a+104>>2];c[b+120>>2]=c[a+108>>2];c[b+124>>2]=c[a+112>>2];c[b+128>>2]=c[a+116>>2];c[b+132>>2]=c[a+120>>2];c[b+136>>2]=c[a+124>>2];c[b+140>>2]=c[a+128>>2];c[b+144>>2]=c[a+132>>2];c[b+148>>2]=c[a+136>>2];c[b+152>>2]=c[a+140>>2];c[b+156>>2]=c[a+144>>2];c[b+160>>2]=c[a+148>>2];c[b+164>>2]=c[a+152>>2];c[b+168>>2]=c[a+156>>2];c[b+172>>2]=c[a+160>>2];c[b+176>>2]=c[a+164>>2];c[b+180>>2]=c[a+168>>2];c[b+184>>2]=c[a+172>>2];c[b+188>>2]=c[a+176>>2];c[b+232>>2]=c[a+180>>2];c[b+192>>2]=c[a+184>>2];c[b>>2]=0;c[b+4>>2]=zb[c[(c[d>>2]|0)+28>>2]&31](d,c[a+192>>2]|0)|0;c[b+8>>2]=0;c[b+236>>2]=c[a+204>>2];c[b+240>>2]=c[a+208>>2];c[b+244>>2]=c[a+212>>2];c[b+248>>2]=c[a+220>>2];c[b+196>>2]=c[a+224>>2];c[b+200>>2]=c[a+228>>2];c[b+204>>2]=c[a+236>>2];c[b+208>>2]=c[a+244>>2];c[b+212>>2]=c[a+248>>2];c[b+216>>2]=c[a+232>>2];c[b+252>>2]=c[a+252>>2];e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;f=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b+12>>2]=f;if(!f){f=a+268|0;f=c[f>>2]|0;d=b+220|0;c[d>>2]=f;d=a+272|0;d=c[d>>2]|0;f=b+224|0;c[f>>2]=d;f=a+276|0;f=c[f>>2]|0;d=b+228|0;c[d>>2]=f;d=a+280|0;d=c[d>>2]|0;f=b+256|0;c[f>>2]=d;f=b+260|0;c[f>>2]=0;return 13018}Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);f=a+268|0;f=c[f>>2]|0;d=b+220|0;c[d>>2]=f;d=a+272|0;d=c[d>>2]|0;f=b+224|0;c[f>>2]=d;f=a+276|0;f=c[f>>2]|0;d=b+228|0;c[d>>2]=f;d=a+280|0;d=c[d>>2]|0;f=b+256|0;c[f>>2]=d;f=b+260|0;c[f>>2]=0;return 13018}function cf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0.0,x=0.0,y=0.0,z=0.0;v=a[h+16>>0]&-16;a[h+16>>0]=v;w=+g[e>>2];x=+g[d>>2];n=+g[e+4>>2];o=+g[d+4>>2];p=+g[e+8>>2];q=+g[d+8>>2];r=+g[f>>2];s=+g[f+4>>2];t=+g[f+8>>2];l=+g[b>>2];m=+g[b+4>>2];i=+g[b+8>>2];y=(w-x)*(l-x)+(n-o)*(m-o)+(p-q)*(i-q);z=(r-x)*(l-x)+(s-o)*(m-o)+(t-q)*(i-q);do if(y<=0.0&z<=0.0){c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];a[h+16>>0]=v|1;j=0.0;k=0.0;i=1.0}else{u=(w-x)*(l-w)+(n-o)*(m-n)+(p-q)*(i-p);k=(r-x)*(l-w)+(s-o)*(m-n)+(t-q)*(i-p);if(!(!(u>=0.0)|!(k<=u))){c[h>>2]=c[e>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];c[h+12>>2]=c[e+12>>2];a[h+16>>0]=v|2;j=0.0;k=1.0;i=0.0;break}if(u<=0.0&(y>=0.0?y*k-u*z<=0.0:0)){g[h>>2]=x+(w-x)*(y/(y-u));g[h+4>>2]=o+(n-o)*(y/(y-u));g[h+8>>2]=q+(p-q)*(y/(y-u));g[h+12>>2]=0.0;a[h+16>>0]=v|3;j=0.0;k=y/(y-u);i=1.0-y/(y-u);break}j=(w-x)*(l-r)+(n-o)*(m-s)+(p-q)*(i-t);i=(r-x)*(l-r)+(s-o)*(m-s)+(t-q)*(i-t);if(!(!(i>=0.0)|!(j<=i))){c[h>>2]=c[f>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];c[h+12>>2]=c[f+12>>2];a[h+16>>0]=v|4;j=1.0;k=0.0;i=0.0;break}if(i<=0.0&(z>=0.0?j*z-y*i<=0.0:0)){g[h>>2]=x+(r-x)*(z/(z-i));g[h+4>>2]=o+(s-o)*(z/(z-i));g[h+8>>2]=q+(t-q)*(z/(z-i));g[h+12>>2]=0.0;a[h+16>>0]=v|5;j=z/(z-i);k=0.0;i=1.0-z/(z-i);break}if((u*i-j*k<=0.0?k-u>=0.0:0)?j-i>=0.0:0){k=(k-u)/(k-u+(j-i));g[h>>2]=w+(r-w)*k;g[h+4>>2]=n+(s-n)*k;g[h+8>>2]=p+(t-p)*k;g[h+12>>2]=0.0;a[h+16>>0]=v|6;j=k;k=1.0-k;i=0.0;break}l=1.0/(y*k-u*z+(u*i-j*k+(j*z-y*i)));m=(j*z-y*i)*l;i=(y*k-u*z)*l;g[h>>2]=(r-x)*i+((w-x)*m+x);g[h+4>>2]=(s-o)*i+((n-o)*m+o);g[h+8>>2]=(t-q)*i+((p-q)*m+q);g[h+12>>2]=0.0;a[h+16>>0]=v|7;j=i;k=m;i=1.0-m-i}while(0);g[h+20>>2]=i;g[h+24>>2]=k;g[h+28>>2]=j;g[h+32>>2]=0.0;return}function df(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0;h=c[c[b+1120>>2]>>2]|0;f=c[c[e+1120>>2]>>2]|0;c[6995]=(c[6995]|0)+1;e=sc(207)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}y=e+4|0;i=e+28|0;Yk(i|0,0,160)|0;c[e>>2]=3464;c[y>>2]=h;c[e+8>>2]=0;c[e+12>>2]=0;h=e+16|0;c[h>>2]=f;c[e+20>>2]=0;c[e+24>>2]=0;f=ui(y)|0;j=+g[f>>2];l=+g[f+16>>2];n=+g[f+32>>2];p=+g[f+4>>2];q=+g[f+20>>2];r=+g[f+36>>2];s=+g[f+8>>2];u=+g[f+24>>2];w=+g[f+40>>2];k=-+g[f+48>>2];m=-+g[f+52>>2];o=-+g[f+56>>2];t=+g[d+12>>2];v=+g[d+16>>2];x=+g[d+20>>2];g[i>>2]=j*k+l*m+n*o+(j*t+l*v+n*x);g[e+32>>2]=p*k+q*m+r*o+(p*t+q*v+r*x);g[e+36>>2]=s*k+u*m+w*o+(s*t+u*v+w*x);g[e+40>>2]=0.0;h=ui(h)|0;x=+g[h>>2];w=+g[h+16>>2];v=+g[h+32>>2];u=+g[h+4>>2];t=+g[h+20>>2];s=+g[h+36>>2];o=+g[h+8>>2];m=+g[h+24>>2];k=+g[h+40>>2];r=-+g[h+48>>2];q=-+g[h+52>>2];p=-+g[h+56>>2];n=+g[d+12>>2];l=+g[d+16>>2];j=+g[d+20>>2];g[e+44>>2]=x*r+w*q+v*p+(x*n+w*l+v*j);g[e+48>>2]=u*r+t*q+s*p+(u*n+t*l+s*j);g[e+52>>2]=o*r+m*q+k*p+(o*n+m*l+k*j);g[e+56>>2]=0.0;c[e+60>>2]=c[d+4>>2];c[e+64>>2]=c[d>>2];c[e+68>>2]=c[d+8>>2];h=e;f=c[b+912>>2]|0;if((f|0)!=(c[b+916>>2]|0)){y=f;i=b+920|0;i=c[i>>2]|0;i=i+(y<<2)|0;c[i>>2]=h;y=y+1|0;c[b+912>>2]=y;return}i=f|0?f<<1:1;if((f|0)>=(i|0)){y=f;i=b+920|0;i=c[i>>2]|0;i=i+(y<<2)|0;c[i>>2]=h;y=y+1|0;c[b+912>>2]=y;return}if(!i)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((i<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[b+912>>2]|0}if((f|0)>0){d=0;do{c[e+(d<<2)>>2]=c[(c[b+920>>2]|0)+(d<<2)>>2];d=d+1|0}while((d|0)!=(f|0))}d=c[b+920>>2]|0;if(d){if(a[b+924>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);f=c[b+912>>2]|0}c[b+920>>2]=0}a[b+924>>0]=1;c[b+920>>2]=e;c[b+916>>2]=i;y=f;i=b+920|0;i=c[i>>2]|0;i=i+(y<<2)|0;c[i>>2]=h;y=y+1|0;c[b+912>>2]=y;return}function ef(b,d,e,f,h){b=b|0;d=+d;e=e|0;f=f|0;h=h|0;var i=0;i=l;l=l+144|0;c[b>>2]=5320;c[b+132>>2]=0;c[b+132+4>>2]=0;c[b+132+8>>2]=0;c[b+132+12>>2]=0;c[b+132+16>>2]=0;c[b+132+20>>2]=0;c[b+132+24>>2]=0;c[b+132+28>>2]=0;c[b+164>>2]=1065353216;c[b+168>>2]=1065353216;c[b+172>>2]=1065353216;g[b+176>>2]=0.0;c[b+180>>2]=0;g[b+184>>2]=999999984306749440.0;c[b+188>>2]=0;c[b+188+4>>2]=0;c[b+188+8>>2]=0;c[b+188+12>>2]=0;c[b+204>>2]=1;c[b+208>>2]=-1;c[b+212>>2]=-1;c[b+216>>2]=-1;c[b+220>>2]=1;g[b+224>>2]=0.0;g[b+228>>2]=.5;g[b+232>>2]=0.0;g[b+236>>2]=0.0;g[b+240>>2]=0.0;g[b+244>>2]=.10000000149011612;g[b+248>>2]=1.0e4;c[b+252>>2]=1;c[b+256>>2]=0;c[b+260>>2]=-1;c[b+264>>2]=-1;g[b+268>>2]=1.0;g[b+272>>2]=0.0;g[b+276>>2]=0.0;c[b+280>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;c[b+304>>2]=0;c[b+4>>2]=1065353216;c[b+8>>2]=0;c[b+8+4>>2]=0;c[b+8+8>>2]=0;c[b+8+12>>2]=0;c[b+24>>2]=1065353216;c[b+28>>2]=0;c[b+28+4>>2]=0;c[b+28+8>>2]=0;c[b+28+12>>2]=0;c[b+44>>2]=1065353216;c[b+48>>2]=0;c[b+48+4>>2]=0;c[b+48+8>>2]=0;c[b+48+12>>2]=0;c[b+48+16>>2]=0;c[b+68>>2]=1065353216;c[b+72>>2]=0;c[b+72+4>>2]=0;c[b+72+8>>2]=0;c[b+72+12>>2]=0;c[b+88>>2]=1065353216;c[b+92>>2]=0;c[b+92+4>>2]=0;c[b+92+8>>2]=0;c[b+92+12>>2]=0;c[b+108>>2]=1065353216;c[b+112>>2]=0;c[b+112+4>>2]=0;c[b+112+8>>2]=0;c[b+112+12>>2]=0;c[b+112+16>>2]=0;c[b>>2]=4324;a[b+560>>0]=1;c[b+556>>2]=0;c[b+548>>2]=0;c[b+552>>2]=0;g[i>>2]=d;c[i+4>>2]=e;c[i+72>>2]=f;c[i+76>>2]=c[h>>2];c[i+76+4>>2]=c[h+4>>2];c[i+76+8>>2]=c[h+8>>2];c[i+76+12>>2]=c[h+12>>2];g[i+92>>2]=0.0;g[i+96>>2]=0.0;g[i+100>>2]=.5;g[i+104>>2]=0.0;g[i+108>>2]=0.0;g[i+112>>2]=0.0;g[i+116>>2]=.800000011920929;g[i+120>>2]=1.0;a[i+124>>0]=0;g[i+128>>2]=.004999999888241291;g[i+132>>2]=.009999999776482582;g[i+136>>2]=.009999999776482582;g[i+140>>2]=.009999999776482582;c[i+8>>2]=1065353216;c[i+12>>2]=0;c[i+12+4>>2]=0;c[i+12+8>>2]=0;c[i+12+12>>2]=0;c[i+28>>2]=1065353216;c[i+32>>2]=0;c[i+32+4>>2]=0;c[i+32+8>>2]=0;c[i+32+12>>2]=0;c[i+48>>2]=1065353216;c[i+52>>2]=0;c[i+52+4>>2]=0;c[i+52+8>>2]=0;c[i+52+12>>2]=0;c[i+52+16>>2]=0;Id(b,i);l=i;return}function ff(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=c[b+548>>2]|0;a:do if((e|0)>0){g=c[b+556>>2]|0;f=0;while(1){if((c[g+(f<<2)>>2]|0)==(d|0))break;f=f+1|0;if((f|0)>=(e|0))break a}if((f|0)!=(e|0))return}while(0);if((e|0)==(c[b+552>>2]|0)?(h=e|0?e<<1:1,(e|0)<(h|0)):0){if(!h)g=0;else{c[6995]=(c[6995]|0)+1;e=sc((h<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}g=e;e=c[b+548>>2]|0}if((e|0)>0){f=0;do{c[g+(f<<2)>>2]=c[(c[b+556>>2]|0)+(f<<2)>>2];f=f+1|0}while((f|0)!=(e|0))}f=c[b+556>>2]|0;if(f){if(a[b+560>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);e=c[b+548>>2]|0}c[b+556>>2]=0}a[b+560>>0]=1;c[b+556>>2]=g;c[b+552>>2]=h}c[(c[b+556>>2]|0)+(e<<2)>>2]=d;c[b+548>>2]=e+1;g=c[d+28>>2]|0;h=c[d+32>>2]|0;if((g|0)==(b|0)){e=c[b+288>>2]|0;if((e|0)==(c[b+292>>2]|0)?(j=e|0?e<<1:1,(e|0)<(j|0)):0){if(!j)g=0;else{c[6995]=(c[6995]|0)+1;e=sc((j<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}g=e;e=c[b+288>>2]|0}if((e|0)>0){f=0;do{c[g+(f<<2)>>2]=c[(c[b+296>>2]|0)+(f<<2)>>2];f=f+1|0}while((f|0)!=(e|0))}f=c[b+296>>2]|0;if(f){if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);e=c[b+288>>2]|0}c[b+296>>2]=0}a[b+300>>0]=1;c[b+296>>2]=g;c[b+292>>2]=j}c[(c[b+296>>2]|0)+(e<<2)>>2]=h;e=e+1|0;c[b+288>>2]=e}else{b=c[h+288>>2]|0;if((b|0)==(c[h+292>>2]|0)?(i=b|0?b<<1:1,(b|0)<(i|0)):0){if(!i)f=0;else{c[6995]=(c[6995]|0)+1;b=sc((i<<2|3)+16|0)|0;if(!b)b=0;else{c[(b+4+15&-16)+-4>>2]=b;b=b+4+15&-16}f=b;b=c[h+288>>2]|0}if((b|0)>0){e=0;do{c[f+(e<<2)>>2]=c[(c[h+296>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(b|0))}e=c[h+296>>2]|0;if(e){if(a[h+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);b=c[h+288>>2]|0}c[h+296>>2]=0}a[h+300>>0]=1;c[h+296>>2]=f;c[h+292>>2]=i}c[(c[h+296>>2]|0)+(b<<2)>>2]=g;e=b+1|0;c[h+288>>2]=e;b=h}c[b+280>>2]=(e|0)>0&1;return}function gf(a,b,f){a=a|0;b=b|0;f=f|0;var i=0,j=0.0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0;t=l;l=l+32|0;c[a+60>>2]=(c[a+60>>2]|0)+1;n=c[a+4>>2]|0;cc[c[(c[n>>2]|0)+16>>2]&3](n,t+28|0,t+24|0,t+20|0,t+16|0,t+12|0,t+8|0,t+4|0,t,b);n=(c[t+12>>2]|0)+(P(c[t+8>>2]|0,f)|0)|0;r=c[a+4>>2]|0;o=c[t>>2]|0;switch(o|0){case 3:{i=e[n+4>>1]|0;break}case 2:{i=c[n+8>>2]|0;break}default:i=d[n+2>>0]|0}s=(c[t+20>>2]|0)==0;p=c[t+16>>2]|0;q=c[t+28>>2]|0;i=q+(P(p,i)|0)|0;if(s){k=+g[i+4>>2]*+g[r+8>>2];m=+g[i>>2]*+g[r+4>>2];j=+g[i+8>>2]}else{k=+h[i+8>>3]*+g[r+8>>2];m=+h[i>>3]*+g[r+4>>2];j=+h[i+16>>3]}j=j*+g[r+12>>2];g[a+44>>2]=m;g[a+48>>2]=k;g[a+52>>2]=j;g[a+56>>2]=0.0;switch(o|0){case 3:{i=e[n+2>>1]|0;break}case 2:{i=c[n+4>>2]|0;break}default:i=d[n+1>>0]|0}i=q+(P(p,i)|0)|0;if(s){k=+g[i+4>>2]*+g[r+8>>2];m=+g[i>>2]*+g[r+4>>2];j=+g[i+8>>2]}else{k=+h[i+8>>3]*+g[r+8>>2];m=+h[i>>3]*+g[r+4>>2];j=+h[i+16>>3]}j=j*+g[r+12>>2];g[a+28>>2]=m;g[a+32>>2]=k;g[a+36>>2]=j;g[a+40>>2]=0.0;switch(o|0){case 3:{i=e[n>>1]|0;break}case 2:{i=c[n>>2]|0;break}default:i=d[n>>0]|0}i=q+(P(p,i)|0)|0;if(s){k=+g[i+4>>2]*+g[r+8>>2];j=+g[i>>2]*+g[r+4>>2];u=+g[i+8>>2];m=+g[r+12>>2];m=u*m;r=a+12|0;g[r>>2]=j;r=a+16|0;g[r>>2]=k;r=a+20|0;g[r>>2]=m;r=a+24|0;g[r>>2]=0.0;r=a+8|0;r=c[r>>2]|0;q=c[r>>2]|0;q=q+8|0;q=c[q>>2]|0;s=a+12|0;Vb[q&127](r,s,b,f);s=c[a+4>>2]|0;r=c[s>>2]|0;r=r+24|0;r=c[r>>2]|0;Ob[r&127](s,b);l=t;return}else{m=+h[i+8>>3]*+g[r+8>>2];k=+h[i>>3]*+g[r+4>>2];j=+h[i+16>>3];u=+g[r+12>>2];u=j*u;r=a+12|0;g[r>>2]=k;r=a+16|0;g[r>>2]=m;r=a+20|0;g[r>>2]=u;r=a+24|0;g[r>>2]=0.0;r=a+8|0;r=c[r>>2]|0;q=c[r>>2]|0;q=q+8|0;q=c[q>>2]|0;s=a+12|0;Vb[q&127](r,s,b,f);s=c[a+4>>2]|0;r=c[s>>2]|0;r=r+24|0;r=c[r>>2]|0;Ob[r&127](s,b);l=t;return}}function hf(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;a:do if(!(qD(b,c[d+8>>2]|0)|0)){if(!(qD(b,c[d>>2]|0)|0)){i=c[b+12>>2]|0;uo(b+16|0,d,e,f,g);if((i|0)<=1)break;h=c[b+8>>2]|0;if((h&2|0)==0?(c[d+36>>2]|0)!=1:0){if(!(h&1)){h=b+24|0;while(1){if(a[d+54>>0]|0)break a;if((c[d+36>>2]|0)==1)break a;uo(h,d,e,f,g);h=h+8|0;if(h>>>0>=(b+16+(i<<3)|0)>>>0)break a}}else h=b+24|0;while(1){if(a[d+54>>0]|0)break a;if((c[d+36>>2]|0)==1?(c[d+24>>2]|0)==1:0)break a;uo(h,d,e,f,g);h=h+8|0;if(h>>>0>=(b+16+(i<<3)|0)>>>0)break a}}else h=b+24|0;while(1){if(a[d+54>>0]|0)break a;uo(h,d,e,f,g);h=h+8|0;if(h>>>0>=(b+16+(i<<3)|0)>>>0)break a}}if((c[d+16>>2]|0)!=(e|0)?(c[d+20>>2]|0)!=(e|0):0){c[d+32>>2]=f;if((c[d+44>>2]|0)==4)break;j=b+16+(c[b+12>>2]<<3)|0;h=0;i=b+16|0;k=0;b:while(1){if(i>>>0>=j>>>0){f=18;break}a[d+52>>0]=0;a[d+53>>0]=0;ao(i,d,e,e,1,g);if(a[d+54>>0]|0){f=18;break}do if(a[d+53>>0]|0){if(!(a[d+52>>0]|0))if(!(c[b+8>>2]&1)){h=1;f=18;break b}else{h=1;f=k;break}if((c[d+24>>2]|0)==1){f=23;break b}if(!(c[b+8>>2]&2)){f=23;break b}else{h=1;f=1}}else f=k;while(0);i=i+8|0;k=f}do if((f|0)==18){if((!k?(c[d+20>>2]=e,c[d+40>>2]=(c[d+40>>2]|0)+1,(c[d+36>>2]|0)==1):0)?(c[d+24>>2]|0)==2:0){a[d+54>>0]=1;if(h){f=23;break}else{h=4;break}}if(h)f=23;else h=4}while(0);if((f|0)==23)h=3;c[d+44>>2]=h;break}if((f|0)==1)c[d+32>>2]=1}else qs(d,e,f);while(0);return}function jf(b,d,e){b=b|0;d=+d;e=+e;var f=0,h=0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0;s=l;l=l+80|0;f=c[b+8>>2]|0;if(!f){f=c[b+4>>2]|0;if(!f){k=0.0;o=0.0;m=0.0;d=0.0;j=0.0;n=0.0}else{r=+g[f+336>>2];j=+g[b+164>>2];t=+g[f+340>>2];p=+g[b+160>>2];n=+g[b+156>>2];q=+g[f+332>>2];k=+g[f+316>>2];o=+g[f+320>>2];m=+g[f+324>>2];d=r*j-t*p;j=t*n-j*q;n=p*q-r*n}}else{t=+g[f+392>>2];j=+g[b+164>>2];p=+g[f+396>>2];q=+g[b+160>>2];n=+g[b+156>>2];r=+g[f+388>>2];k=+g[f+372>>2];o=+g[f+376>>2];m=+g[f+380>>2];d=t*j-p*q;j=p*n-j*r;n=q*r-t*n}r=k+d;q=o+j;p=m+n;f=c[b+20>>2]|0;if(!f){f=c[b+16>>2]|0;if(!f){n=0.0;o=0.0;d=0.0;j=0.0;k=0.0;m=0.0}else{t=+g[f+336>>2];k=+g[b+180>>2];w=+g[f+340>>2];v=+g[b+176>>2];m=+g[b+172>>2];u=+g[f+332>>2];n=+g[f+316>>2];o=+g[f+320>>2];d=+g[f+324>>2];j=t*k-w*v;k=w*m-k*u;m=v*u-t*m}}else{w=+g[f+392>>2];k=+g[b+180>>2];t=+g[f+396>>2];u=+g[b+176>>2];m=+g[b+172>>2];v=+g[f+388>>2];n=+g[f+372>>2];o=+g[f+376>>2];d=+g[f+380>>2];j=w*k-t*u;k=t*m-k*v;m=u*v-w*m}c[s+36+16>>2]=0;c[s+36+16+4>>2]=0;c[s+36+16+8>>2]=0;c[s+36+16+12>>2]=0;a[s+36+32>>0]=1;u=+g[b+60>>2];r=+g[b+72>>2]+(r-(n+j))*u;t=(q-(o+k))*u+ +g[b+76>>2];u=(p-(d+m))*u+ +g[b+80>>2];v=(r*+g[b+120>>2]+t*+g[b+124>>2]+u*+g[b+128>>2])*e;w=(r*+g[b+136>>2]+t*+g[b+140>>2]+u*+g[b+144>>2])*e;g[s+36>>2]=(r*+g[b+104>>2]+t*+g[b+108>>2]+u*+g[b+112>>2])*e;g[s+36+4>>2]=v;g[s+36+8>>2]=w;g[s+36+12>>2]=0.0;f=s;h=s+36|0;i=f+36|0;do{c[f>>2]=c[h>>2];f=f+4|0;h=h+4|0}while((f|0)<(i|0));w=-+g[s+4>>2];v=-+g[s+8>>2];g[s>>2]=-+g[s>>2];g[s+4>>2]=w;g[s+8>>2]=v;g[s+12>>2]=0.0;v=-+g[s+20>>2];w=-+g[s+24>>2];g[s+16>>2]=-+g[s+16>>2];g[s+20>>2]=v;g[s+24>>2]=w;g[s+28>>2]=0.0;Nh(b+4|0,s,b+156|0);Nh(b+16|0,s+36|0,b+172|0);l=s;return}function kf(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,D=0.0;d=c[a+780>>2]|0;if((d|0)!=4){c[a+780>>2]=d+1;x=d;w=(x|0)>0;x=w?x:0;a=a+4+(x*192|0)|0;gi(a|0,b|0,192)|0;return x|0}y=+g[b+80>>2];v=+g[a+84>>2];u=v>2];s=t>2];w=+g[a+660>>2]<(r>31;y=+g[b>>2];if(d){e=+g[a+196>>2];k=+g[b+4>>2];l=+g[a+200>>2];h=+g[b+8>>2];f=+g[a+204>>2];m=+g[a+580>>2];u=+g[a+388>>2];q=+g[a+584>>2];p=+g[a+392>>2];s=+g[a+588>>2];n=+g[a+396>>2];i=((y-e)*(q-p)-(k-l)*(m-u))*((y-e)*(q-p)-(k-l)*(m-u))+(((k-l)*(s-n)-(h-f)*(q-p))*((k-l)*(s-n)-(h-f)*(q-p))+((h-f)*(m-u)-(y-e)*(s-n))*((h-f)*(m-u)-(y-e)*(s-n)));if((d|0)==1){j=+g[a+8>>2];t=h;o=+g[a+12>>2];r=m;v=e;h=0.0;m=+g[a+4>>2];x=7}else{t=h;r=m;x=6}}else{e=+g[a+196>>2];l=+g[a+200>>2];f=+g[a+204>>2];i=0.0;k=+g[b+4>>2];t=+g[b+8>>2];r=+g[a+580>>2];u=+g[a+388>>2];q=+g[a+584>>2];p=+g[a+392>>2];s=+g[a+588>>2];n=+g[a+396>>2];x=6}if((x|0)==6){m=+g[a+4>>2];j=+g[a+8>>2];B=k-j;o=+g[a+12>>2];z=t-o;v=r-u;A=q-p;h=s-n;h=((y-m)*A-B*v)*((y-m)*A-B*v)+((B*h-z*A)*(B*h-z*A)+(z*v-(y-m)*h)*(z*v-(y-m)*h));if((d|0)==2){r=u;q=e;e=0.0;x=8}else{v=e;x=7}}if((x|0)==7){B=y-m;D=k-j;z=t-o;A=r-v;r=q-l;e=s-f;e=(B*r-D*A)*(B*r-D*A)+((D*e-z*r)*(D*e-z*r)+(z*A-B*e)*(z*A-B*e));if(w)f=0.0;else{r=u;q=v;x=8}}if((x|0)==8){D=y-m;y=k-j;A=t-o;B=r-q;z=p-l;f=n-f;f=(D*z-y*B)*(D*z-y*B)+((y*f-A*z)*(y*f-A*z)+(A*B-D*f)*(A*B-D*f))}D=+C(+i);A=+C(+h);y=+C(+e);v=+C(+f);B=D>-999999984306749440.0?D:-999999984306749440.0;z=A>B?A:B;x=v>(y>z?y:z)?3:y>z?2:A>B?1:(D>-999999984306749440.0^1)<<31>>31;w=(x|0)>0;x=w?x:0;a=a+4+(x*192|0)|0;gi(a|0,b|0,192)|0;return x|0}function lf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0;q=c[b+18504>>2]|0;if(!q){c[b>>2]=5;q=0;return q|0}i=c[q+48>>2]|0;if(i|0)c[i+44>>2]=c[q+44>>2];i=c[q+44>>2]|0;if(i|0)c[i+48>>2]=c[q+48>>2];if((c[b+18504>>2]|0)==(q|0))c[b+18504>>2]=c[q+48>>2];c[b+18508>>2]=(c[b+18508>>2]|0)+-1;c[q+44>>2]=0;c[q+48>>2]=c[b+18496>>2];i=c[b+18496>>2]|0;if(i|0)c[i+44>>2]=q;c[b+18496>>2]=q;c[b+18500>>2]=(c[b+18500>>2]|0)+1;a[q+55>>0]=0;c[q+20>>2]=d;c[q+24>>2]=e;c[q+28>>2]=f;m=+g[d+16>>2];j=+g[e+16>>2]-m;n=+g[d+20>>2];k=+g[e+20>>2]-n;o=+g[d+24>>2];l=+g[e+24>>2]-o;m=+g[f+16>>2]-m;n=+g[f+20>>2]-n;o=+g[f+24>>2]-o;g[q>>2]=k*o-l*n;g[q+4>>2]=l*m-j*o;g[q+8>>2]=j*n-k*m;g[q+12>>2]=0.0;p=+D(+((k*o-l*n)*(k*o-l*n)+(l*m-j*o)*(l*m-j*o)+(j*n-k*m)*(j*n-k*m)));if(p>9.999999747378752e-05){if((!(Zk(k*o-l*n,l*m-j*o,j*n-k*m,+g[d+16>>2],+g[d+20>>2],+g[d+24>>2],+g[e+16>>2],+g[e+20>>2],+g[e+24>>2],q+16|0)|0)?!(Zk(+g[q>>2],+g[q+4>>2],+g[q+8>>2],+g[e+16>>2],+g[e+20>>2],+g[e+24>>2],+g[f+16>>2],+g[f+20>>2],+g[f+24>>2],q+16|0)|0):0)?!(Zk(+g[q>>2],+g[q+4>>2],+g[q+8>>2],+g[f+16>>2],+g[f+20>>2],+g[f+24>>2],+g[d+16>>2],+g[d+20>>2],+g[d+24>>2],q+16|0)|0):0)g[q+16>>2]=(+g[d+16>>2]*+g[q>>2]+ +g[d+20>>2]*+g[q+4>>2]+ +g[d+24>>2]*+g[q+8>>2])/p;g[q>>2]=1.0/p*+g[q>>2];g[q+4>>2]=1.0/p*+g[q+4>>2];g[q+8>>2]=1.0/p*+g[q+8>>2];if(h)return q|0;if(!(+g[q+16>>2]>=-9.999999747378752e-06))i=3;else return q|0}else i=2;c[b>>2]=i;i=c[q+48>>2]|0;if(i|0)c[i+44>>2]=c[q+44>>2];i=c[q+44>>2]|0;if(i|0)c[i+48>>2]=c[q+48>>2];if((c[b+18496>>2]|0)==(q|0))c[b+18496>>2]=c[q+48>>2];c[b+18500>>2]=(c[b+18500>>2]|0)+-1;c[q+44>>2]=0;c[q+48>>2]=c[b+18504>>2];i=c[b+18504>>2]|0;if(i|0)c[i+44>>2]=q;c[b+18504>>2]=q;c[b+18508>>2]=(c[b+18508>>2]|0)+1;q=0;return q|0}function mf(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,l=0,m=0;h=c[d+8>>2]|0;if((h|0)>0){i=c[d+16>>2]|0;f=0;e=0;do{j=c[i+(f<<2)>>2]|0;if(!(c[j+204>>2]&3)){c[j+208>>2]=e;e=e+1|0}c[j+212>>2]=-1;g[j+268>>2]=1.0;f=f+1|0}while((f|0)!=(h|0));j=e}else j=0;i=c[b+8>>2]|0;if((i|0)<(j|0)){if((c[b+12>>2]|0)<(j|0)){if(!j){e=0;h=i}else{c[6995]=(c[6995]|0)+1;e=sc((j<<3|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}h=c[b+8>>2]|0}if((h|0)>0){f=0;do{m=(c[b+16>>2]|0)+(f<<3)|0;k=c[m+4>>2]|0;l=e+(f<<3)|0;c[l>>2]=c[m>>2];c[l+4>>2]=k;f=f+1|0}while((f|0)!=(h|0))}f=c[b+16>>2]|0;if(f|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=e;c[b+12>>2]=j;f=b+16|0}else f=b+16|0;e=i;do{m=(c[f>>2]|0)+(e<<3)|0;c[m>>2]=0;c[m+4>>2]=0;e=e+1|0}while((e|0)!=(j|0))}c[b+8>>2]=j;if((j|0)>0){f=c[b+16>>2]|0;e=0;do{c[f+(e<<3)>>2]=e;c[f+(e<<3)+4>>2]=1;e=e+1|0}while((e|0)!=(j|0))}e=c[d+68>>2]|0;e=xb[c[(c[e>>2]|0)+36>>2]&127](e)|0;l=xb[c[(c[e>>2]|0)+36>>2]&127](e)|0;if(!l)return;k=xb[c[(c[e>>2]|0)+20>>2]&127](e)|0;if((l|0)<=0)return;d=0;do{e=c[c[k+(d<<4)>>2]>>2]|0;f=c[c[k+(d<<4)+4>>2]>>2]|0;if((e|0?(f|0?(c[e+204>>2]&7|0)==0:0):0)?(c[f+204>>2]&7|0)==0:0){i=c[e+208>>2]|0;e=c[f+208>>2]|0;j=c[b+16>>2]|0;f=c[j+(i<<3)>>2]|0;if((f|0)!=(i|0)){h=j+(i<<3)|0;do{i=j+(f<<3)|0;c[h>>2]=c[i>>2];i=c[i>>2]|0;h=j+(i<<3)|0;f=c[h>>2]|0}while((i|0)!=(f|0))}f=c[j+(e<<3)>>2]|0;if((f|0)!=(e|0)){h=j+(e<<3)|0;do{e=j+(f<<3)|0;c[h>>2]=c[e>>2];e=c[e>>2]|0;h=j+(e<<3)|0;f=c[h>>2]|0}while((e|0)!=(f|0))}if((i|0)!=(e|0)){c[j+(i<<3)>>2]=e;m=j+(e<<3)+4|0;c[m>>2]=(c[m>>2]|0)+(c[j+(i<<3)+4>>2]|0)}}d=d+1|0}while((d|0)!=(l|0));return}function nf(b){b=b|0;var d=0,e=0;c[b>>2]=5536;if(a[b+20>>0]|0){d=c[b+16>>2]|0;e=c[d+16>>2]|0;if(e){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[b+16>>2]|0}if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}}if(a[b+12>>0]|0){d=c[b+8>>2]|0;e=c[d+16>>2]|0;if(e){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[b+8>>2]|0}if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}}d=c[b+28>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+28>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+32>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+32>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+36>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+36>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+40>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+40>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+44>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+44>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+48>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+48>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+52>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+52>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+56>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+56>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+72>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+72>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+76>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+76>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+68>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+68>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+84>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+84>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+80>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+80>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+24>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+24>>2]|0;if(!d)return;c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);return}function of(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0;u=+g[b>>2];t=+g[b+4>>2];s=+g[b+8>>2];r=1.0/+D(+(u*u+t*t+s*s));y=+g[d>>2];x=+g[d+4>>2];w=+g[d+8>>2];v=1.0/+D(+(y*y+x*x+w*w));B=s*r*x*v-t*r*w*v;A=u*r*w*v-s*r*y*v;z=t*r*y*v-u*r*x*v;d=c[a+28>>2]|0;e=+g[d+4>>2];h=+g[d+20>>2];j=+g[d+36>>2];f=+g[d+8>>2];i=+g[d+24>>2];k=+g[d+40>>2];l=+g[d+12>>2];n=+g[d+28>>2];p=+g[d+44>>2];m=-+g[d+52>>2];o=-+g[d+56>>2];q=-+g[d+60>>2];g[a+48>>2]=z*j+(e*B+h*A);g[a+52>>2]=e*y*v+x*v*h+w*v*j;g[a+56>>2]=u*r*e+t*r*h+s*r*j;g[a+60>>2]=0.0;g[a+64>>2]=B*f+A*i+z*k;g[a+68>>2]=y*v*f+x*v*i+w*v*k;g[a+72>>2]=u*r*f+t*r*i+s*r*k;g[a+76>>2]=0.0;g[a+80>>2]=B*l+A*n+z*p;g[a+84>>2]=y*v*l+x*v*n+w*v*p;g[a+88>>2]=u*r*l+t*r*n+s*r*p;g[a+92>>2]=0.0;g[a+96>>2]=e*0.0+h*0.0+j*0.0+(e*m+h*o+j*q);g[a+100>>2]=f*0.0+i*0.0+k*0.0+(f*m+i*o+k*q);g[a+104>>2]=l*0.0+n*0.0+p*0.0+(l*m+n*o+p*q);g[a+108>>2]=0.0;d=c[a+32>>2]|0;q=+g[d+4>>2];p=+g[d+20>>2];o=+g[d+36>>2];n=+g[d+8>>2];m=+g[d+24>>2];l=+g[d+40>>2];k=+g[d+12>>2];i=+g[d+28>>2];f=+g[d+44>>2];j=-+g[d+52>>2];h=-+g[d+56>>2];e=-+g[d+60>>2];g[a+112>>2]=B*q+A*p+z*o;g[a+116>>2]=y*v*q+x*v*p+w*v*o;g[a+120>>2]=u*r*q+t*r*p+s*r*o;g[a+124>>2]=0.0;g[a+128>>2]=B*n+A*m+z*l;g[a+132>>2]=y*v*n+x*v*m+w*v*l;g[a+136>>2]=u*r*n+t*r*m+s*r*l;g[a+140>>2]=0.0;g[a+144>>2]=B*k+A*i+z*f;g[a+148>>2]=y*v*k+x*v*i+w*v*f;g[a+152>>2]=u*r*k+t*r*i+s*r*f;g[a+156>>2]=0.0;g[a+160>>2]=q*0.0+p*0.0+o*0.0+(q*j+p*h+o*e);g[a+164>>2]=n*0.0+m*0.0+l*0.0+(n*j+m*h+l*e);g[a+168>>2]=k*0.0+i*0.0+f*0.0+(k*j+i*h+f*e);g[a+172>>2]=0.0;jd(a,(c[a+28>>2]|0)+4|0,(c[a+32>>2]|0)+4|0);return}function pf(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c[6158]=(c[6158]|0)+1;f=c[b+24>>2]|0;if(!f){if(!(c[e+8>>2]&c[d+4>>2])){b=0;return b|0}if(!(c[d+8>>2]&c[e+4>>2])){b=0;return b|0}}else if(!(Bb[c[(c[f>>2]|0)+8>>2]&63](f,d,e)|0)){b=0;return b|0}k=(c[d+12>>2]|0)>(c[e+12>>2]|0);l=k?e:d;g=c[l+12>>2]|0;k=k?d:e;d=c[k+12>>2]|0;i=(((d<<16|g)+~((d<<16|g)<<15)|0)>>>10^(d<<16|g)+~((d<<16|g)<<15))*9|0;i=((i>>>6^i)+~((i>>>6^i)<<11)|0)>>>16^(i>>>6^i)+~((i>>>6^i)<<11);j=c[b+12>>2]|0;f=c[(c[b+40>>2]|0)+((i&j+-1)<<2)>>2]|0;a:do if((f|0)!=-1){e=c[b+16>>2]|0;while(1){if((c[(c[e+(f<<4)>>2]|0)+12>>2]|0)==(g|0)?(c[(c[e+(f<<4)+4>>2]|0)+12>>2]|0)==(d|0):0)break;f=c[(c[b+60>>2]|0)+(f<<2)>>2]|0;if((f|0)==-1)break a}f=e+(f<<4)|0;if(f|0){b=f;return b|0}}while(0);h=c[b+8>>2]|0;if((h|0)==(j|0)){g=j|0?j<<1:1;if((j|0)<(g|0)){if(!g){f=0;d=j}else{c[6995]=(c[6995]|0)+1;f=sc((g<<4|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}d=c[b+8>>2]|0}if((d|0)>0){e=0;do{m=c[b+16>>2]|0;c[f+(e<<4)>>2]=c[m+(e<<4)>>2];c[f+(e<<4)+4>>2]=c[m+(e<<4)+4>>2];c[f+(e<<4)+8>>2]=c[m+(e<<4)+8>>2];c[f+(e<<4)+12>>2]=c[m+(e<<4)+12>>2];e=e+1|0}while((e|0)!=(d|0))}e=c[b+16>>2]|0;if(e){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[b+8>>2]|0}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=f;c[b+12>>2]=g;f=g}else{d=j;f=j}}else{d=h;f=j}c[b+8>>2]=d+1;e=c[b+16>>2]|0;d=c[b+68>>2]|0;if(d){Bb[c[(c[d>>2]|0)+8>>2]&63](d,l,k)|0;f=c[b+12>>2]|0}if((j|0)<(f|0)){Kf(b);f=(c[b+12>>2]|0)+-1&i}else f=i&j+-1;m=(c[l+12>>2]|0)<(c[k+12>>2]|0);c[e+(h<<4)>>2]=m?l:k;c[e+(h<<4)+4>>2]=m?k:l;c[e+(h<<4)+8>>2]=0;c[e+(h<<4)+8+4>>2]=0;m=(c[b+40>>2]|0)+(f<<2)|0;c[(c[b+60>>2]|0)+(h<<2)>>2]=c[m>>2];c[m>>2]=h;m=e+(h<<4)|0;return m|0}function qf(a,d,f){a=a|0;d=d|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;g=c[a+108>>2]|0;if(g|0)Sb[c[(c[g>>2]|0)+12>>2]&127](g,c[d+60>>2]|0,f);o=c[d+12>>2]|0;p=c[a+60>>2]|0;n=c[a+92>>2]|0;if(!(xb[c[(c[n>>2]|0)+56>>2]&127](n)|0)){n=c[a+92>>2]|0;Sb[c[(c[n>>2]|0)+16>>2]&127](n,p+((o&65535)<<6)|0,f)}m=e[a+56>>1]|0;l=c[a+60>>2]|0;b[l+54>>1]=(e[l+54>>1]|0)+65534;b[l+56>>1]=(e[l+56>>1]|0)+65534;b[l+58>>1]=(e[l+58>>1]|0)+65534;l=0;d=b[a+6>>1]|0;do{k=a+68+(l<<2)|0;n=c[k>>2]|0;g=e[p+((o&65535)<<6)+54+(l<<1)>>1]|0;b[n+(g<<2)>>1]=d;f=b[n+(g<<2)+6>>1]|0;if(!(f<<16>>16))f=n;else{j=(c[a+60>>2]|0)+((e[n+(g<<2)+2>>1]|0)<<6)+54+(l<<1)|0;i=n+(g<<2)|0;while(1){h=i;i=i+4|0;g=b[i>>1]|0;if((d&65535)<(g&65535))break;q=c[a+60>>2]|0;d=f&65535;d=(g&1)==0?q+(d<<6)+48+(l<<1)|0:q+(d<<6)+54+(l<<1)|0;b[d>>1]=(b[d>>1]|0)+-1<<16>>16;b[j>>1]=(b[j>>1]|0)+1<<16>>16;d=e[h>>1]|e[h+2>>1]<<16;g=e[i>>1]|e[i+2>>1]<<16;b[h>>1]=g;b[h+2>>1]=g>>>16;b[i>>1]=d;b[i+2>>1]=d>>>16;f=b[h+10>>1]|0;if(!(f<<16>>16))break;else d=d&65535}d=b[a+6>>1]|0;f=c[k>>2]|0}g=e[p+((o&65535)<<6)+48+(l<<1)>>1]|0;b[n+(g<<2)>>1]=d;i=f+(g<<2)|0;h=b[i+6>>1]|0;if(h<<16>>16){k=(c[a+60>>2]|0)+((e[f+(g<<2)+2>>1]|0)<<6)+48+(l<<1)|0;j=i;f=b[i>>1]|0;while(1){g=j;j=j+4|0;d=b[j>>1]|0;if((f&65535)<(d&65535))break;i=c[a+60>>2]|0;q=h&65535;d=(d&1)==0?i+(q<<6)+48+(l<<1)|0:i+(q<<6)+54+(l<<1)|0;b[d>>1]=(b[d>>1]|0)+-1<<16>>16;b[k>>1]=(b[k>>1]|0)+1<<16>>16;d=e[g>>1]|e[g+2>>1]<<16;q=e[j>>1]|e[j+2>>1]<<16;b[g>>1]=q;b[g+2>>1]=q>>>16;b[j>>1]=d;b[j+2>>1]=d>>>16;h=b[g+10>>1]|0;if(!(h<<16>>16))break;else f=d&65535}d=b[a+6>>1]|0}b[n+((m<<1)+-1<<2)+2>>1]=0;b[n+((m<<1)+-1<<2)>>1]=d;l=l+1|0}while((l|0)!=3);b[(c[a+60>>2]|0)+((o&65535)<<6)+48>>1]=b[a+64>>1]|0;b[a+64>>1]=o;b[a+56>>1]=(b[a+56>>1]|0)+-1<<16>>16;return}function rf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0,x=0;w=l;l=l+32|0;q=c[a+12>>2]|0;r=+g[q+(((e+d|0)/2|0)*24|0)>>2];t=+g[q+(((e+d|0)/2|0)*24|0)+4>>2];u=+g[q+(((e+d|0)/2|0)*24|0)+8>>2];v=+g[q+(((e+d|0)/2|0)*24|0)+16>>2];s=c[q+(((e+d|0)/2|0)*24|0)+20>>2]|0;f=e;h=d;while(1){m=+g[b>>2];n=+g[b+4>>2];o=+g[b+8>>2];p=(r-m)*(r-m)+(t-n)*(t-n)+(u-o)*(u-o);a:while(1){i=+g[q+(h*24|0)+16>>2];do if(i!=v){if(!(i>2]-m;j=+g[q+(h*24|0)+4>>2]-n;k=+g[q+(h*24|0)+8>>2]-o;if(i*i+j*j+k*k!=p)if(i*i+j*j+k*k>2]|0)<(s|0))break;else break a}while(0);h=h+1|0}b:while(1){i=+g[q+(f*24|0)+16>>2];do if(v!=i){if(!(v>2]-m;j=+g[q+(f*24|0)+4>>2]-n;k=+g[q+(f*24|0)+8>>2]-o;if(p!=i*i+j*j+k*k)if(p>2]|0))break;else break b}while(0);f=f+-1|0}if((h|0)<=(f|0)){x=q+(h*24|0)|0;c[w>>2]=c[x>>2];c[w+4>>2]=c[x+4>>2];c[w+8>>2]=c[x+8>>2];c[w+12>>2]=c[x+12>>2];c[w+16>>2]=c[x+16>>2];c[w+20>>2]=c[x+20>>2];q=q+(f*24|0)|0;c[x>>2]=c[q>>2];c[x+4>>2]=c[q+4>>2];c[x+8>>2]=c[q+8>>2];c[x+12>>2]=c[q+12>>2];c[x+16>>2]=c[q+16>>2];c[x+20>>2]=c[q+20>>2];q=(c[a+12>>2]|0)+(f*24|0)|0;c[q>>2]=c[w>>2];c[q+4>>2]=c[w+4>>2];c[q+8>>2]=c[w+8>>2];c[q+12>>2]=c[w+12>>2];c[q+16>>2]=c[w+16>>2];c[q+20>>2]=c[w+20>>2];f=f+-1|0;h=h+1|0}if((h|0)>(f|0))break;q=c[a+12>>2]|0}if((f|0)>(d|0))rf(a,b,d,f);if((h|0)>=(e|0)){l=w;return}rf(a,b,h,e);l=w;return}function sf(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0.0,h=0,i=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0;j=c[a+28>>2]|0;k=c[a+32>>2]|0;e=c[b+8>>2]|0;g[e>>2]=1.0;h=c[b+24>>2]|0;g[e+(h+1<<2)>>2]=1.0;g[e+((h<<1)+2<<2)>>2]=1.0;l=+g[a+300>>2];q=+g[a+304>>2];f=+g[a+308>>2];o=+g[j+4>>2]*l+ +g[j+8>>2]*q+ +g[j+12>>2]*f;m=l*+g[j+20>>2]+q*+g[j+24>>2]+f*+g[j+28>>2];f=l*+g[j+36>>2]+q*+g[j+40>>2]+f*+g[j+44>>2];e=c[b+12>>2]|0;c[e>>2]=0;g[e+4>>2]=f;g[e+8>>2]=-m;g[e+12>>2]=0.0;g[e+(h<<2)>>2]=-f;c[e+(h<<2)+4>>2]=0;g[e+(h<<2)+8>>2]=o;g[e+(h<<2)+12>>2]=0.0;g[e+(h<<1<<2)>>2]=m;g[e+(h<<1<<2)+4>>2]=-o;c[e+(h<<1<<2)+8>>2]=0;g[e+(h<<1<<2)+12>>2]=0.0;e=c[b+16>>2]|0;g[e>>2]=-1.0;g[e+(h+1<<2)>>2]=-1.0;g[e+((h<<1)+2<<2)>>2]=-1.0;q=+g[a+316>>2];l=+g[a+320>>2];d=+g[a+324>>2];p=+g[k+4>>2]*q+ +g[k+8>>2]*l+ +g[k+12>>2]*d;n=q*+g[k+20>>2]+l*+g[k+24>>2]+d*+g[k+28>>2];d=q*+g[k+36>>2]+l*+g[k+40>>2]+d*+g[k+44>>2];h=c[b+20>>2]|0;e=c[b+24>>2]|0;c[h>>2]=0;g[h+4>>2]=-d;g[h+8>>2]=n;g[h+12>>2]=0.0;g[h+(e<<2)>>2]=d;c[h+(e<<2)+4>>2]=0;g[h+(e<<2)+8>>2]=-p;g[h+(e<<2)+12>>2]=0.0;g[h+(e<<1<<2)>>2]=-n;g[h+(e<<1<<2)+4>>2]=p;c[h+(e<<1<<2)+8>>2]=0;g[h+(e<<1<<2)+12>>2]=0.0;h=c[a+332>>2]|0;l=+g[(h&1|0?a+336|0:b+4|0)>>2]*+g[b>>2];i=c[b+28>>2]|0;g[i>>2]=l*(p+ +g[k+52>>2]-o-+g[j+52>>2]);g[i+(e<<2)>>2]=l*(n+ +g[k+56>>2]-m-+g[j+56>>2]);g[i+(e<<1<<2)>>2]=l*(d+ +g[k+60>>2]-f-+g[j+60>>2]);if(h&2|0){k=c[b+32>>2]|0;c[k>>2]=c[a+340>>2];c[k+(e<<2)>>2]=c[a+340>>2];c[k+(e<<1<<2)>>2]=c[a+340>>2]}f=+g[a+356>>2];if(f>0.0){g[c[b+36>>2]>>2]=-f;g[c[b+40>>2]>>2]=f;d=+g[a+356>>2]}else d=f;if(d>0.0){g[(c[b+36>>2]|0)+(e<<2)>>2]=-f;g[(c[b+40>>2]|0)+(e<<2)>>2]=f;d=+g[a+356>>2]}if(!(d>0.0)){j=a+352|0;j=c[j>>2]|0;k=b+48|0;c[k>>2]=j;return}g[(c[b+36>>2]|0)+(e<<1<<2)>>2]=-f;g[(c[b+40>>2]|0)+(e<<1<<2)>>2]=f;j=a+352|0;j=c[j>>2]|0;k=b+48|0;c[k>>2]=j;return}function tf(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+32|0;a[q+16>>0]=1;c[q+12>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;e=c[b+8>>2]|0;if((e|0)>0){o=0;i=0;h=0;g=0;f=0;while(1){m=c[b+16>>2]|0;n=m+(o<<4)|0;if((g|0)==(f|0)){j=f|0?f<<1:1;if((f|0)<(j|0)){if(j){c[6995]=(c[6995]|0)+1;e=sc((j<<4|3)+16|0)|0;if(!e){i=0;f=g}else{c[(e+4+15&-16)+-4>>2]=e;i=e+4+15&-16;f=g}}else i=0;if((f|0)>0){e=0;do{k=c[q+12>>2]|0;c[i+(e<<4)>>2]=c[k+(e<<4)>>2];c[i+(e<<4)+4>>2]=c[k+(e<<4)+4>>2];c[i+(e<<4)+8>>2]=c[k+(e<<4)+8>>2];c[i+(e<<4)+12>>2]=c[k+(e<<4)+12>>2];e=e+1|0}while((e|0)!=(f|0))}e=c[q+12>>2]|0;if(!e)g=f;else{c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);c[q+12>>2]=0}c[q+12>>2]=i;k=j;h=j;j=g;f=i;e=c[b+8>>2]|0}else{k=f;j=f;f=i}}else{k=f;j=g;f=i}c[f+(j<<4)>>2]=c[n>>2];c[f+(j<<4)+4>>2]=c[m+(o<<4)+4>>2];c[f+(j<<4)+8>>2]=c[m+(o<<4)+8>>2];c[f+(j<<4)+12>>2]=c[m+(o<<4)+12>>2];g=j+1|0;o=o+1|0;if((o|0)>=(e|0))break;else{i=f;f=k}}c[q+4>>2]=g;a[q+16>>0]=1;c[q+8>>2]=h;if((j|0)>-1){f=c[q+12>>2]|0;e=0;while(1){Cb[c[(c[b>>2]|0)+12>>2]&31](b,c[f+(e<<4)>>2]|0,c[f+(e<<4)+4>>2]|0,d)|0;if((e|0)<(j|0))e=e+1|0;else break}}}else g=0;if((c[b+52>>2]|0)>0){f=c[b+60>>2]|0;e=0;do{c[f+(e<<2)>>2]=-1;e=e+1|0}while((e|0)<(c[b+52>>2]|0))}if((g|0)<=1)if((g|0)<=0){e=c[q+12>>2]|0;if(!e){l=q;return}}else p=23;else{te(q,0,g+-1|0);p=23}if((p|0)==23){e=c[q+12>>2]|0;f=0;do{Bb[c[(c[b>>2]|0)+8>>2]&63](b,c[e+(f<<4)>>2]|0,c[e+(f<<4)+4>>2]|0)|0;f=f+1|0}while((f|0)<(g|0))}c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);c[q+12>>2]=0;l=q;return}function uf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0,u=0.0,v=0.0,w=0,x=0.0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0;B=(a[b+68>>0]|0)!=0;C=B?e:d;B=B?d:e;z=c[b+52>>2]|0;if((z|0)<=0){x=1.0;return +x}A=(c[C+192>>2]|0)+28|0;j=+g[C+4>>2];u=+g[C+8>>2];v=+g[C+12>>2];w=c[C+16>>2]|0;x=+g[C+20>>2];k=+g[C+24>>2];l=+g[C+28>>2];e=c[C+32>>2]|0;m=+g[C+36>>2];n=+g[C+40>>2];o=+g[C+44>>2];p=c[C+48>>2]|0;q=+g[C+52>>2];r=+g[C+56>>2];s=+g[C+60>>2];t=c[C+64>>2]|0;i=1.0;d=0;y=c[C+304>>2]|0;do{E=c[A>>2]|0;P=+g[E+(d*80|0)>>2];O=+g[E+(d*80|0)+16>>2];N=+g[E+(d*80|0)+32>>2];M=+g[E+(d*80|0)+4>>2];L=+g[E+(d*80|0)+20>>2];K=+g[E+(d*80|0)+36>>2];J=+g[E+(d*80|0)+8>>2];I=+g[E+(d*80|0)+24>>2];H=+g[E+(d*80|0)+40>>2];G=+g[E+(d*80|0)+48>>2];F=+g[E+(d*80|0)+52>>2];D=+g[E+(d*80|0)+56>>2];c[C+304>>2]=y+1;g[C+4>>2]=j*P+u*O+v*N;g[C+8>>2]=j*M+u*L+v*K;g[C+12>>2]=j*J+u*I+v*H;g[C+16>>2]=0.0;g[C+20>>2]=x*P+k*O+l*N;g[C+24>>2]=x*M+k*L+l*K;g[C+28>>2]=x*J+k*I+l*H;g[C+32>>2]=0.0;g[C+36>>2]=m*P+n*O+o*N;g[C+40>>2]=m*M+n*L+o*K;g[C+44>>2]=m*J+n*I+o*H;g[C+48>>2]=0.0;g[C+52>>2]=q+(j*G+u*F+v*D);g[C+56>>2]=r+(x*G+k*F+l*D);g[C+60>>2]=s+(m*G+n*F+o*D);g[C+64>>2]=0.0;E=c[(c[b+60>>2]|0)+(d<<2)>>2]|0;D=+tb[c[(c[E>>2]|0)+12>>2]&15](E,C,B,f,h);i=D>2]|0)+1|0;c[C+304>>2]=y;g[C+4>>2]=j;g[C+8>>2]=u;g[C+12>>2]=v;c[C+16>>2]=w;g[C+20>>2]=x;g[C+24>>2]=k;g[C+28>>2]=l;c[C+32>>2]=e;g[C+36>>2]=m;g[C+40>>2]=n;g[C+44>>2]=o;c[C+48>>2]=p;g[C+52>>2]=q;g[C+56>>2]=r;g[C+60>>2]=s;c[C+64>>2]=t;d=d+1|0}while((d|0)!=(z|0));return +i}function vf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0;i=lt()|0;c[i+4>>2]=7;c[i+8>>2]=-1;c[i+12>>2]=-1;g[i+16>>2]=3402823466385288598117041.0e14;a[i+20>>0]=1;a[i+21>>0]=0;c[i+24>>2]=-1;c[i+28>>2]=b;c[i+32>>2]=d;g[i+36>>2]=0.0;g[i+40>>2]=.05000000074505806;c[i+44>>2]=0;c[i>>2]=4884;a[i+48>>0]=0;c[i+52>>2]=c[e>>2];c[i+52+4>>2]=c[e+4>>2];c[i+52+8>>2]=c[e+8>>2];c[i+52+12>>2]=c[e+12>>2];c[i+68>>2]=c[e+16>>2];c[i+68+4>>2]=c[e+16+4>>2];c[i+68+8>>2]=c[e+16+8>>2];c[i+68+12>>2]=c[e+16+12>>2];c[i+84>>2]=c[e+32>>2];c[i+84+4>>2]=c[e+32+4>>2];c[i+84+8>>2]=c[e+32+8>>2];c[i+84+12>>2]=c[e+32+12>>2];c[i+100>>2]=c[e+48>>2];c[i+100+4>>2]=c[e+48+4>>2];c[i+100+8>>2]=c[e+48+8>>2];c[i+100+12>>2]=c[e+48+12>>2];c[i+116>>2]=c[f>>2];c[i+116+4>>2]=c[f+4>>2];c[i+116+8>>2]=c[f+8>>2];c[i+116+12>>2]=c[f+12>>2];c[i+132>>2]=c[f+16>>2];c[i+132+4>>2]=c[f+16+4>>2];c[i+132+8>>2]=c[f+16+8>>2];c[i+132+12>>2]=c[f+16+12>>2];c[i+148>>2]=c[f+32>>2];c[i+148+4>>2]=c[f+32+4>>2];c[i+148+8>>2]=c[f+32+8>>2];c[i+148+12>>2]=c[f+32+12>>2];c[i+164>>2]=c[f+48>>2];c[i+164+4>>2]=c[f+48+4>>2];c[i+164+8>>2]=c[f+48+8>>2];c[i+164+12>>2]=c[f+48+12>>2];a[i+180>>0]=h&1;g[i+184>>2]=1.0;g[i+188>>2]=-1.0;g[i+192>>2]=0.0;g[i+196>>2]=0.0;g[i+200>>2]=1.0;g[i+204>>2]=.699999988079071;g[i+208>>2]=0.0;g[i+212>>2]=0.0;g[i+216>>2]=1.0;g[i+220>>2]=.699999988079071;g[i+224>>2]=0.0;g[i+228>>2]=0.0;g[i+264>>2]=1.0;g[i+268>>2]=.699999988079071;g[i+272>>2]=1.0;g[i+276>>2]=0.0;g[i+280>>2]=1.0;g[i+284>>2]=.699999988079071;g[i+288>>2]=1.0;g[i+292>>2]=0.0;g[i+232>>2]=1.0;g[i+236>>2]=.699999988079071;g[i+240>>2]=1.0;g[i+244>>2]=0.0;g[i+248>>2]=1.0;g[i+252>>2]=.699999988079071;g[i+256>>2]=1.0;g[i+260>>2]=0.0;a[i+1096>>0]=0;g[i+1116>>2]=0.0;g[i+1120>>2]=0.0;g[i+1124>>2]=0.0;c[i+300>>2]=0;c[i+1100>>2]=0;c[i+1100+4>>2]=0;c[i+1100+8>>2]=0;a[i+1100+12>>0]=0;a[i+49>>0]=1;Zc(i,(c[i+28>>2]|0)+4|0,(c[i+32>>2]|0)+4|0);return i|0}function wf(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0;j=l;l=l+64|0;Tg(c[b+108>>2]|0,d,0);e=+g[d+204>>2]+ +g[d+212>>2];h=e*+g[d+56>>2]+ +g[d+40>>2];i=e*+g[d+60>>2]+ +g[d+44>>2];g[d+16>>2]=+g[d+52>>2]*e+ +g[d+36>>2];g[d+20>>2]=h;g[d+24>>2]=i;g[d+28>>2]=0.0;g[j+32>>2]=-1.0;k=c[b+92>>2]|0;k=Cb[c[(c[k>>2]|0)+8>>2]&31](k,d+36|0,d+16|0,j)|0;c[d+88>>2]=0;if(!k){c[d+32>>2]=c[d+204>>2];g[d+272>>2]=0.0;h=-+g[d+56>>2];i=-+g[d+60>>2];g[d>>2]=-+g[d+52>>2];g[d+4>>2]=h;g[d+8>>2]=i;g[d+12>>2]=0.0;i=-1.0;h=1.0;k=d+268|0;g[k>>2]=h;l=j;return +i}f=e*+g[j+32>>2];c[d>>2]=c[j+16>>2];c[d+4>>2]=c[j+16+4>>2];c[d+8>>2]=c[j+16+8>>2];c[d+12>>2]=c[j+16+12>>2];a[d+84>>0]=1;if((a[22488]|0)==0?Uz(22488)|0:0){c[j+40>>2]=0;c[j+40+4>>2]=0;c[j+40+8>>2]=0;c[j+40+12>>2]=0;ef(23848,0.0,0,0,j+40|0)}c[6013]=c[6013]|1;g[6063]=0.0;e=+g[6073]*0.0;h=+g[6074]*0.0;g[6068]=+g[6072]*0.0;g[6069]=e;g[6070]=h;g[6071]=0.0;c[6076]=0;c[6077]=0;c[6078]=0;c[6079]=0;h=+g[6065]*0.0;e=+g[6066]*0.0;g[6117]=+g[6064]*0.0;g[6118]=h;g[6119]=e;g[6120]=0.0;c[d+88>>2]=23848;e=f-+g[d+212>>2];g[d+32>>2]=e;h=+g[d+204>>2];i=+g[d+208>>2]*.009999999776482582;if(e>2]=h-i;e=h-i}if(e>h+i)g[d+32>>2]=h+i;c[d+16>>2]=c[j>>2];c[d+16+4>>2]=c[j+4>>2];c[d+16+8>>2]=c[j+8>>2];c[d+16+12>>2]=c[j+12>>2];s=+g[d>>2];r=+g[d+4>>2];o=+g[d+8>>2];h=s*+g[d+52>>2]+r*+g[d+56>>2]+o*+g[d+60>>2];k=c[b+108>>2]|0;e=+g[d+16>>2]-+g[k+52>>2];n=+g[d+20>>2]-+g[k+56>>2];p=+g[d+24>>2]-+g[k+60>>2];i=+g[k+392>>2];q=+g[k+396>>2];m=+g[k+388>>2];g[d+272>>2]=!(h>=-.10000000149011612)?-1.0/h*(s*(i*p-n*q+ +g[k+372>>2])+r*(+g[k+376>>2]+(e*q-p*m))+o*(n*m-e*i+ +g[k+380>>2])):0.0;i=f;h=!(h>=-.10000000149011612)?-1.0/h:10.0;k=d+268|0;g[k>>2]=h;l=j;return +i}function xf(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0;o=l;l=l+64|0;e=c[d+192>>2]|0;Vb[c[(c[e>>2]|0)+8>>2]&127](e,d+4|0,o+48|0,o+32|0);h=+g[o+48>>2]+-.019999999552965164;g[o+48>>2]=h;i=+g[o+48+4>>2]+-.019999999552965164;g[o+48+4>>2]=i;j=+g[o+48+8>>2]+-.019999999552965164;g[o+48+8>>2]=j;f=+g[o+32>>2]+.019999999552965164;g[o+32>>2]=f;k=+g[o+32+4>>2]+.019999999552965164;g[o+32+4>>2]=k;m=+g[o+32+8>>2]+.019999999552965164;g[o+32+8>>2]=m;if(((a[b+44>>0]|0)!=0?(c[d+252>>2]|0)==2:0)?(c[d+204>>2]&3|0)==0:0){e=c[d+192>>2]|0;Vb[c[(c[e>>2]|0)+8>>2]&127](e,d+68|0,o+16|0,o);h=+g[o+16>>2]+-.019999999552965164;g[o+16>>2]=h;j=+g[o+16+4>>2]+-.019999999552965164;g[o+16+4>>2]=j;k=+g[o+16+8>>2]+-.019999999552965164;g[o+16+8>>2]=k;f=+g[o>>2]+.019999999552965164;g[o>>2]=f;m=+g[o+4>>2]+.019999999552965164;g[o+4>>2]=m;n=+g[o+8>>2]+.019999999552965164;g[o+8>>2]=n;i=+g[o+48>>2];if(h>2]=h;else h=i;i=+g[o+48+4>>2];if(j>2]=j;i=j}j=+g[o+48+8>>2];if(k>2]=k;j=k}k=+g[o+16+12>>2];if(k<+g[o+48+12>>2])g[o+48+12>>2]=k;k=+g[o+32>>2];if(k>2]=f;else f=k;k=+g[o+32+4>>2];if(k>2]=m;k=m}m=+g[o+32+8>>2];if(m>2]=n;m=n}n=+g[o+12>>2];if(+g[o+32+12>>2]>2]=n}e=c[b+68>>2]|0;if((c[d+204>>2]&1|0)==0?(h=f-h,k=k-i,n=m-j,!(h*h+k*k+n*n<999999995904.0)):0){if((c[d+220>>2]&-2|0)!=4)c[d+220>>2]=5;if(!(a[14696]|0)){l=o;return}e=c[b+72>>2]|0;if(!e){l=o;return}a[14696]=0;Ob[c[(c[e>>2]|0)+44>>2]&127](e,14697);d=c[b+72>>2]|0;Ob[c[(c[d>>2]|0)+44>>2]&127](d,14746);d=c[b+72>>2]|0;Ob[c[(c[d>>2]|0)+44>>2]&127](d,14814);b=c[b+72>>2]|0;Ob[c[(c[b>>2]|0)+44>>2]&127](b,14879);l=o;return}Zb[c[(c[e>>2]|0)+16>>2]&31](e,c[d+188>>2]|0,o+48|0,o+32|0,c[b+24>>2]|0);l=o;return}function yf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0;b=l;l=l+608|0;p=+g[d+116>>2]-+g[d+52>>2];o=+g[d+120>>2]-+g[d+56>>2];n=+g[d+124>>2]-+g[d+60>>2];i=+g[e+116>>2]-+g[e+52>>2];j=+g[e+120>>2]-+g[e+56>>2];k=+g[e+124>>2]-+g[e+60>>2];m=+g[d+276>>2];if(p*p+o*o+n*n>2],i*i+j*j+k*k>2]|0;f=c[e+272>>2]|0;c[b+552+8>>2]=0;c[b+552+12>>2]=-1;q=b+552+28|0;c[b+552>>2]=7020;c[b+552+4>>2]=8;c[b+552+16>>2]=1065353216;c[b+552+20>>2]=1065353216;c[b+552+24>>2]=1065353216;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[q+16>>2]=0;c[b+552+32>>2]=f;c[b+552+48>>2]=f;g[b+552+52>>2]=0.0;c[b+376>>2]=3896;g[b+376+164>>2]=999999984306749440.0;c[b+376+168>>2]=0;g[b+376+172>>2]=0.0;g[b+16+308>>2]=9.999999747378752e-05;a[b+16+332>>0]=0;c[b>>2]=9484;c[b+4>>2]=b+16;c[b+8>>2]=h;c[b+12>>2]=b+552;if(Ad(b,d+4|0,d+68|0,e+4|0,e+68|0,b+376|0)|0){i=+g[b+376+164>>2];if(+g[d+268>>2]>i)g[d+268>>2]=i;if(+g[e+268>>2]>i)g[e+268>>2]=i;if(!(i<1.0))i=1.0}else i=1.0;q=c[e+192>>2]|0;h=c[d+272>>2]|0;c[b+552+8>>2]=0;c[b+552+12>>2]=-1;f=b+552+28|0;c[b+552>>2]=7020;c[b+552+4>>2]=8;c[b+552+16>>2]=1065353216;c[b+552+20>>2]=1065353216;c[b+552+24>>2]=1065353216;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[b+552+32>>2]=h;c[b+552+48>>2]=h;g[b+552+52>>2]=0.0;c[b+376>>2]=3896;g[b+376+164>>2]=999999984306749440.0;c[b+376+168>>2]=0;g[b+376+172>>2]=0.0;g[b+16+308>>2]=9.999999747378752e-05;a[b+16+332>>0]=0;c[b>>2]=9484;c[b+4>>2]=b+16;c[b+8>>2]=b+552;c[b+12>>2]=q;if(Ad(b,d+4|0,d+68|0,e+4|0,e+68|0,b+376|0)|0){j=+g[b+376+164>>2];if(+g[d+268>>2]>j)g[d+268>>2]=j;if(+g[e+268>>2]>j)g[e+268>>2]=j;if(i>j)i=j}p=i;l=b;return +p}function zf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0;i=Us(480)|0;Vd(i,b,d,e);c[i>>2]=4080;a[i+360>>0]=1;c[i+356>>2]=0;c[i+348>>2]=0;c[i+352>>2]=0;g[i+372>>2]=1.2000000476837158;g[i+376>>2]=0.0;g[i+380>>2]=0.0;g[i+384>>2]=1.0e3;c[i+388>>2]=0;c[i+388+4>>2]=0;c[i+388+8>>2]=0;c[i+388+12>>2]=0;c[i+388+16>>2]=0;c[i+388+20>>2]=0;c[i+388+24>>2]=0;c[i+416>>2]=-1054867456;c[i+420>>2]=0;g[i+424>>2]=0.0;a[i+444>>0]=1;c[i+440>>2]=0;c[i+432>>2]=0;c[i+436>>2]=0;c[i+472>>2]=h;a[i+476>>0]=0;if(!h){c[6995]=(c[6995]|0)+1;f=sc(59)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}g[f+12>>2]=1.0;c[f+8>>2]=0;c[f+4>>2]=5;c[f>>2]=3172;a[f+36>>0]=1;c[f+32>>2]=0;c[f+24>>2]=0;c[f+28>>2]=0;a[f+16>>0]=1;c[i+472>>2]=f;a[i+476>>0]=1}c[i+364>>2]=4302;a[i+368>>0]=1;a[i+369>>0]=0;a[i+370>>0]=0;c[i+404>>2]=d;c[i+408>>2]=b;Bi(i+428|0);h=c[i+432>>2]|0;if((h|0)>0)e=0;else{d=i+448|0;g[d>>2]=.25;d=i+452|0;c[d>>2]=0;d=i+456|0;c[d>>2]=0;d=i+464|0;c[d>>2]=1;d=i+468|0;c[d>>2]=1;g[i+372>>2]=1.2000000476837158;g[i+376>>2]=0.0;g[i+380>>2]=0.0;d=i+412|0;c[d>>2]=0;c[i+388>>2]=0;c[i+388+4>>2]=0;c[i+388+8>>2]=0;c[i+388+12>>2]=0;c[i+416>>2]=-1054867456;c[i+420>>2]=0;g[i+424>>2]=0.0;Bi(i+428|0);return i|0}do{d=(c[i+440>>2]|0)+(e<<2)|0;f=c[d>>2]|0;c[d>>2]=0;if(f|0)do{d=f;f=c[f+280>>2]|0;cJ(d)}while((f|0)!=0);e=e+1|0}while((e|0)!=(h|0));d=i+448|0;g[d>>2]=.25;d=i+452|0;c[d>>2]=0;d=i+456|0;c[d>>2]=0;d=i+464|0;c[d>>2]=1;d=i+468|0;c[d>>2]=1;g[i+372>>2]=1.2000000476837158;g[i+376>>2]=0.0;g[i+380>>2]=0.0;d=i+412|0;c[d>>2]=0;c[i+388>>2]=0;c[i+388+4>>2]=0;c[i+388+8>>2]=0;c[i+388+12>>2]=0;c[i+416>>2]=-1054867456;c[i+420>>2]=0;g[i+424>>2]=0.0;Bi(i+428|0);return i|0}function Af(a,b,d,e,f,h,i){a=a|0;b=+b;d=+d;e=+e;f=f|0;h=+h;i=i|0;var j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0;s=l;l=l+16|0;j=d*h+ +g[a+52>>2];d=e*h+ +g[a+56>>2];g[i+48>>2]=b*h+ +g[a+48>>2];g[i+52>>2]=j;g[i+56>>2]=d;g[i+60>>2]=0.0;d=+g[f>>2];j=+g[f+4>>2];k=+g[f+8>>2];if(d*d+j*j+k*k>1.1920928955078125e-07)b=+D(+(d*d+j*j+k*k));else b=0.0;e=b*h>.7853981852531433?.7853981852531433/h:b;if(e<1.0000000474974513e-03)b=h*.5-e*h*h*h*.02083333395421505*e;else b=+G(+(e*.5*h))/e;r=b*d;q=b*j;p=b*k;d=+F(+(e*h*.5));yh(a,s);e=+g[s>>2];j=+g[s+12>>2];k=+g[s+8>>2];h=+g[s+4>>2];b=(d*j-r*e-q*h-p*k)*(d*j-r*e-q*h-p*k)+((p*j+d*k+r*h-q*e)*(p*j+d*k+r*h-q*e)+((d*e+r*j+q*k-p*h)*(d*e+r*j+q*k-p*h)+(p*e+(q*j+d*h)-r*k)*(p*e+(q*j+d*h)-r*k)));if(b>1.1920928955078125e-07){b=1.0/+D(+b);m=(d*e+r*j+q*k-p*h)*b;n=(p*j+d*k+r*h-q*e)*b;o=(d*j-r*e-q*h-p*k)*b;b=(p*e+(q*j+d*h)-r*k)*b}else{m=d*e+r*j+q*k-p*h;n=p*j+d*k+r*h-q*e;o=d*j-r*e-q*h-p*k;b=p*e+(q*j+d*h)-r*k}d=o*o+(n*n+(b*b+m*m));if(d>1.1920928955078125e-07){q=m*(2.0/d);r=b*(2.0/d);e=n*(2.0/d);p=o*q;h=o*r;k=o*e;q=m*q;j=m*r;m=m*e;r=b*r;o=b*e;n=n*e;g[i>>2]=1.0-(r+n);g[i+4>>2]=j-k;g[i+8>>2]=m+h;g[i+12>>2]=0.0;g[i+16>>2]=j+k;g[i+20>>2]=1.0-(q+n);g[i+24>>2]=o-p;g[i+28>>2]=0.0;g[i+32>>2]=m-h;g[i+36>>2]=o+p;g[i+40>>2]=1.0-(q+r);g[i+44>>2]=0.0;l=s;return}else{c[i>>2]=c[a>>2];c[i+4>>2]=c[a+4>>2];c[i+8>>2]=c[a+8>>2];c[i+12>>2]=c[a+12>>2];c[i+16>>2]=c[a+16>>2];c[i+16+4>>2]=c[a+16+4>>2];c[i+16+8>>2]=c[a+16+8>>2];c[i+16+12>>2]=c[a+16+12>>2];c[i+32>>2]=c[a+32>>2];c[i+32+4>>2]=c[a+32+4>>2];c[i+32+8>>2]=c[a+32+8>>2];c[i+32+12>>2]=c[a+32+12>>2];l=s;return}}function Bf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0;x=l;l=l+256|0;if(!a){l=x;return}p=+g[b>>2];q=+g[b+4>>2];r=+g[b+8>>2];s=+g[b+16>>2];t=+g[b+20>>2];o=+g[b+24>>2];c[x>>2]=a;a=64;n=1;e=x;b=0;while(1){m=n+-1|0;j=c[e+(m<<2)>>2]|0;do if(((((+g[j>>2]<=s?+g[j+16>>2]>=p:0)?+g[j+4>>2]<=t:0)?+g[j+20>>2]>=q:0)?+g[j+8>>2]<=o:0)?+g[j+24>>2]>=r:0){if(!(c[j+40>>2]|0)){Ob[c[(c[d>>2]|0)+12>>2]&127](d,j);f=m;break}i=c[j+36>>2]|0;do if((m|0)==(a|0)?(u=a|0?a<<1:1,(n|0)<=(u|0)):0){if((u|0)!=0?(c[6995]=(c[6995]|0)+1,v=sc((u<<2|3)+16|0)|0,(v|0)!=0):0){c[(v+4+15&-16)+-4>>2]=v;h=v+4+15&-16}else h=0;if((n|0)>1){f=0;do{c[h+(f<<2)>>2]=c[e+(f<<2)>>2];f=f+1|0}while((f|0)!=(a|0));if(!(b<<24>>24)){a=u;k=1;break}}else if((e|0)==0|b<<24>>24==0){a=u;k=1;break}c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);a=u;k=1}else{h=e;k=b}while(0);c[h+(m<<2)>>2]=i;f=c[j+40>>2]|0;do if((n|0)==(a|0)){a=n|0?n<<1:1;if((n|0)<(a|0)){if((a|0)!=0?(c[6995]=(c[6995]|0)+1,w=sc((a<<2|3)+16|0)|0,(w|0)!=0):0){c[(w+4+15&-16)+-4>>2]=w;e=w+4+15&-16}else e=0;if((n|0)>0){b=0;do{c[e+(b<<2)>>2]=c[h+(b<<2)>>2];b=b+1|0}while((b|0)!=(n|0));if(!(k<<24>>24)){b=1;break}}else if((h|0)==0|k<<24>>24==0){b=1;break}c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);b=1}else{a=n;e=h;b=k}}else{e=h;b=k}while(0);c[e+(n<<2)>>2]=f;f=n+1|0}else f=m;while(0);if((f|0)>0)n=f;else break}if((e|0)==0|b<<24>>24==0){l=x;return}c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);l=x;return}function Cf(a,b,e){a=a|0;b=b|0;e=e|0;fi(a,b,e)|0;c[b+52>>2]=c[a+48>>2];c[b+56>>2]=c[a+52>>2];c[b+60>>2]=c[a+56>>2];c[b+64>>2]=c[a+60>>2];c[b+68>>2]=c[a+64>>2];c[b+72>>2]=c[a+68>>2];c[b+76>>2]=c[a+72>>2];c[b+80>>2]=c[a+76>>2];c[b+84>>2]=c[a+80>>2];c[b+88>>2]=c[a+84>>2];c[b+92>>2]=c[a+88>>2];c[b+96>>2]=c[a+92>>2];c[b+100>>2]=c[a+96>>2];c[b+104>>2]=c[a+100>>2];c[b+108>>2]=c[a+104>>2];c[b+112>>2]=c[a+108>>2];c[b+116>>2]=c[a+112>>2];c[b+120>>2]=c[a+116>>2];c[b+124>>2]=c[a+120>>2];c[b+128>>2]=c[a+124>>2];c[b+132>>2]=c[a+128>>2];c[b+136>>2]=c[a+132>>2];c[b+140>>2]=c[a+136>>2];c[b+144>>2]=c[a+140>>2];c[b+148>>2]=c[a+144>>2];c[b+152>>2]=c[a+148>>2];c[b+156>>2]=c[a+152>>2];c[b+160>>2]=c[a+156>>2];c[b+164>>2]=c[a+160>>2];c[b+168>>2]=c[a+164>>2];c[b+172>>2]=c[a+168>>2];c[b+176>>2]=c[a+172>>2];c[b+228>>2]=c[a+868>>2];c[b+212>>2]=c[a+872>>2];c[b+196>>2]=c[a+680>>2];c[b+180>>2]=c[a+696>>2];c[b+232>>2]=c[a+932>>2];c[b+216>>2]=c[a+936>>2];c[b+200>>2]=c[a+684>>2];c[b+184>>2]=c[a+700>>2];c[b+236>>2]=c[a+996>>2];c[b+220>>2]=c[a+1e3>>2];c[b+204>>2]=c[a+688>>2];c[b+188>>2]=c[a+704>>2];c[b+244>>2]=d[a+1300>>0];c[b+248>>2]=d[a+1301>>0];c[b+276>>2]=c[a+1316>>2];c[b+324>>2]=c[a+1364>>2];c[b+252>>2]=d[a+1309>>0];c[b+300>>2]=c[a+1340>>2];c[b+280>>2]=c[a+1320>>2];c[b+328>>2]=c[a+1368>>2];c[b+256>>2]=d[a+1310>>0];c[b+304>>2]=c[a+1344>>2];c[b+284>>2]=c[a+1324>>2];c[b+332>>2]=c[a+1372>>2];c[b+260>>2]=d[a+1311>>0];c[b+308>>2]=c[a+1348>>2];c[b+288>>2]=c[a+1328>>2];c[b+336>>2]=c[a+1376>>2];c[b+264>>2]=d[a+1312>>0];c[b+312>>2]=c[a+1352>>2];c[b+292>>2]=c[a+1332>>2];c[b+340>>2]=c[a+1380>>2];c[b+268>>2]=d[a+1313>>0];c[b+316>>2]=c[a+1356>>2];c[b+296>>2]=c[a+1336>>2];c[b+344>>2]=c[a+1384>>2];c[b+272>>2]=d[a+1314>>0];c[b+320>>2]=c[a+1360>>2];return 12447}function Df(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;k=c[b+220>>2]|0;Sb[c[(c[k>>2]|0)+8>>2]&127](k,b,c[b+24>>2]|0);k=c[b+324>>2]|0;if((k|0)>0){j=c[b+332>>2]|0;i=0;do{e=c[j+(i<<2)>>2]|0;d=c[e+772>>2]|0;e=c[e+776>>2]|0;if((d|0?(e|0?(c[d+204>>2]&3|0)==0:0):0)?(c[e+204>>2]&3|0)==0:0){g=c[d+208>>2]|0;d=c[e+208>>2]|0;h=c[(c[b+220>>2]|0)+16>>2]|0;e=c[h+(g<<3)>>2]|0;if((e|0)!=(g|0)){f=h+(g<<3)|0;do{g=h+(e<<3)|0;c[f>>2]=c[g>>2];g=c[g>>2]|0;f=h+(g<<3)|0;e=c[f>>2]|0}while((g|0)!=(e|0))}e=c[h+(d<<3)>>2]|0;if((e|0)!=(d|0)){f=h+(d<<3)|0;do{d=h+(e<<3)|0;c[f>>2]=c[d>>2];d=c[d>>2]|0;f=h+(d<<3)|0;e=c[f>>2]|0}while((d|0)!=(e|0))}if((g|0)!=(d|0)){c[h+(g<<3)>>2]=d;f=h+(d<<3)+4|0;c[f>>2]=(c[f>>2]|0)+(c[h+(g<<3)+4>>2]|0)}}i=i+1|0}while((i|0)!=(k|0))}k=c[b+228>>2]|0;if((k|0)<=0){m=c[b+220>>2]|0;l=c[m>>2]|0;l=l+12|0;l=c[l>>2]|0;Ob[l&127](m,b);return}j=c[b+236>>2]|0;i=0;do{d=c[j+(i<<2)>>2]|0;if((a[d+20>>0]|0?(l=c[d+28>>2]|0,(c[l+204>>2]&3|0)==0):0)?(m=c[d+32>>2]|0,(c[m+204>>2]&3|0)==0):0){f=c[l+208>>2]|0;d=c[m+208>>2]|0;h=c[(c[b+220>>2]|0)+16>>2]|0;e=c[h+(f<<3)>>2]|0;if((e|0)!=(f|0)){g=h+(f<<3)|0;do{f=h+(e<<3)|0;c[g>>2]=c[f>>2];f=c[f>>2]|0;g=h+(f<<3)|0;e=c[g>>2]|0}while((f|0)!=(e|0))}e=c[h+(d<<3)>>2]|0;if((e|0)!=(d|0)){g=h+(d<<3)|0;do{d=h+(e<<3)|0;c[g>>2]=c[d>>2];d=c[d>>2]|0;g=h+(d<<3)|0;e=c[g>>2]|0}while((d|0)!=(e|0))}if((f|0)!=(d|0)){c[h+(f<<3)>>2]=d;g=h+(d<<3)+4|0;c[g>>2]=(c[g>>2]|0)+(c[h+(f<<3)+4>>2]|0)}}i=i+1|0}while((i|0)!=(k|0));m=c[b+220>>2]|0;l=c[m>>2]|0;l=l+12|0;l=c[l>>2]|0;Ob[l&127](m,b);return}function Ef(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c[6157]=(c[6157]|0)+1;k=(c[b+12>>2]|0)>(c[d+12>>2]|0);n=k?d:b;h=c[n+12>>2]|0;k=k?b:d;f=c[k+12>>2]|0;j=(((f<<16|h)+~((f<<16|h)<<15)|0)>>>10^(f<<16|h)+~((f<<16|h)<<15))*9|0;j=(((j>>>6^j)+~((j>>>6^j)<<11)|0)>>>16^(j>>>6^j)+~((j>>>6^j)<<11))&(c[a+12>>2]|0)+-1;b=c[(c[a+40>>2]|0)+(j<<2)>>2]|0;if((b|0)==-1){a=0;return a|0}g=c[a+16>>2]|0;d=b;while(1){if((c[(c[g+(d<<4)>>2]|0)+12>>2]|0)==(h|0)?(c[(c[g+(d<<4)+4>>2]|0)+12>>2]|0)==(f|0):0)break;b=c[(c[a+60>>2]|0)+(d<<2)>>2]|0;if((b|0)==-1){b=0;i=22;break}else d=b}if((i|0)==22)return b|0;b=g+(d<<4)|0;if(!b){a=0;return a|0}Sb[c[(c[a>>2]|0)+32>>2]&127](a,b,e);m=c[g+(d<<4)+12>>2]|0;l=b-(c[a+16>>2]|0)>>4;d=j;f=-1;b=a+40|0;while(1){b=c[(c[b>>2]|0)+(d<<2)>>2]|0;if((b|0)==(l|0))break;else{d=b;f=b;b=a+60|0}}d=c[a+60>>2]|0;if((f|0)==-1)b=(c[a+40>>2]|0)+(j<<2)|0;else b=d+(f<<2)|0;c[b>>2]=c[d+(l<<2)>>2];i=(c[a+8>>2]|0)+-1|0;b=c[a+68>>2]|0;if(b|0)Cb[c[(c[b>>2]|0)+12>>2]&31](b,n,k,e)|0;if((i|0)==(l|0)){c[a+8>>2]=(c[a+8>>2]|0)+-1;a=m;return a|0}h=c[a+16>>2]|0;g=c[(c[h+(i<<4)+4>>2]|0)+12>>2]<<16|c[(c[h+(i<<4)>>2]|0)+12>>2];g=((g+~(g<<15)|0)>>>10^g+~(g<<15))*9|0;g=(((g>>>6^g)+~((g>>>6^g)<<11)|0)>>>16^(g>>>6^g)+~((g>>>6^g)<<11))&(c[a+12>>2]|0)+-1;d=g;f=-1;b=a+40|0;while(1){b=c[(c[b>>2]|0)+(d<<2)>>2]|0;if((b|0)==(i|0))break;else{d=b;f=b;b=a+60|0}}d=c[a+60>>2]|0;if((f|0)==-1)b=(c[a+40>>2]|0)+(g<<2)|0;else b=d+(f<<2)|0;c[b>>2]=c[d+(i<<2)>>2];c[h+(l<<4)>>2]=c[h+(i<<4)>>2];c[h+(l<<4)+4>>2]=c[h+(i<<4)+4>>2];c[h+(l<<4)+8>>2]=c[h+(i<<4)+8>>2];c[h+(l<<4)+12>>2]=c[h+(i<<4)+12>>2];e=(c[a+40>>2]|0)+(g<<2)|0;c[(c[a+60>>2]|0)+(l<<2)>>2]=c[e>>2];c[e>>2]=l;c[a+8>>2]=(c[a+8>>2]|0)+-1;a=m;return a|0}function Ff(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0;f=l;l=l+784|0;c[f+720>>2]=1065353216;c[f+720+4>>2]=0;c[f+720+4+4>>2]=0;c[f+720+4+8>>2]=0;c[f+720+4+12>>2]=0;c[f+720+20>>2]=1065353216;c[f+720+24>>2]=0;c[f+720+24+4>>2]=0;c[f+720+24+8>>2]=0;c[f+720+24+12>>2]=0;c[f+720+40>>2]=1065353216;e=f+720+44|0;c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[f+544>>2]=3896;c[f+544+168>>2]=0;g[f+544+172>>2]=0.0;c[f+544+164>>2]=c[b+200>>2];e=c[b+196>>2]|0;c[f+488+8>>2]=0;c[f+488+12>>2]=-1;i=f+488+28|0;c[f+488>>2]=7020;c[f+488+4>>2]=8;c[f+488+16>>2]=1065353216;c[f+488+20>>2]=1065353216;c[f+488+24>>2]=1065353216;c[i>>2]=0;c[i+4>>2]=0;c[i+8>>2]=0;c[i+12>>2]=0;c[i+16>>2]=0;c[f+488+32>>2]=e;c[f+488+48>>2]=e;g[f+488+52>>2]=0.0;c[f+376+8>>2]=0;c[f+376+12>>2]=-1;c[f+376+16>>2]=1065353216;c[f+376+20>>2]=1065353216;c[f+376+24>>2]=1065353216;g[f+376+28>>2]=0.0;g[f+376+48>>2]=.03999999910593033;c[f+376+56>>2]=0;c[f+376>>2]=3924;c[f+376+4>>2]=1;c[f+376+60>>2]=c[d>>2];c[f+376+60+4>>2]=c[d+4>>2];c[f+376+60+8>>2]=c[d+8>>2];c[f+376+60+12>>2]=c[d+12>>2];c[f+376+76>>2]=c[d+16>>2];c[f+376+76+4>>2]=c[d+16+4>>2];c[f+376+76+8>>2]=c[d+16+8>>2];c[f+376+76+12>>2]=c[d+16+12>>2];c[f+376+92>>2]=c[d+32>>2];c[f+376+92+4>>2]=c[d+32+4>>2];c[f+376+92+8>>2]=c[d+32+8>>2];c[f+376+92+12>>2]=c[d+32+12>>2];g[f+16+308>>2]=9.999999747378752e-05;a[f+16+332>>0]=0;c[f>>2]=5276;c[f+4>>2]=f+16;c[f+8>>2]=f+488;c[f+12>>2]=f+376;if(fd(f,b+4|0,b+68|0,f+720|0,f+720|0,f+544|0)|0?(h=+g[f+544+164>>2],+g[b+200>>2]>h):0)g[b+200>>2]=h;c[f+376>>2]=7472;e=c[f+376+56>>2]|0;if(!e){l=f;return}Ib[c[c[e>>2]>>2]&511](e);e=c[f+376+56>>2]|0;if(!e){l=f;return}c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);l=f;return}function Gf(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;i=c[b+4>>2]|0;if((i|0)==(c[b+8>>2]|0)?(h=i|0?i<<1:1,(i|0)<(h|0)):0){if(!h){e=0;g=i}else{c[6995]=(c[6995]|0)+1;e=sc((h*244|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}g=c[b+4>>2]|0}if((g|0)>0){f=0;do{k=e+(f*244|0)|0;j=c[b+12>>2]|0;l=j+(f*244|0)|0;c[k>>2]=c[l>>2];c[k+4>>2]=c[l+4>>2];c[k+8>>2]=c[l+8>>2];c[k+12>>2]=c[l+12>>2];k=j+(f*244|0)+16|0;l=e+(f*244|0)+16|0;c[l>>2]=c[k>>2];c[l+4>>2]=c[k+4>>2];c[l+8>>2]=c[k+8>>2];c[l+12>>2]=c[k+12>>2];l=j+(f*244|0)+32|0;k=e+(f*244|0)+32|0;c[k>>2]=c[l>>2];c[k+4>>2]=c[l+4>>2];c[k+8>>2]=c[l+8>>2];c[k+12>>2]=c[l+12>>2];k=e+(f*244|0)+48|0;l=j+(f*244|0)+48|0;c[k>>2]=c[l>>2];c[k+4>>2]=c[l+4>>2];c[k+8>>2]=c[l+8>>2];c[k+12>>2]=c[l+12>>2];gi(e+(f*244|0)+64|0,j+(f*244|0)+64|0,180)|0;f=f+1|0}while((f|0)!=(g|0))}f=c[b+12>>2]|0;if(f|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=e;c[b+8>>2]=h;e=c[b+4>>2]|0}else e=i;c[b+4>>2]=e+1;l=c[b+12>>2]|0;c[l+(i*244|0)>>2]=c[d>>2];c[l+(i*244|0)+4>>2]=c[d+4>>2];c[l+(i*244|0)+8>>2]=c[d+8>>2];c[l+(i*244|0)+12>>2]=c[d+12>>2];c[l+(i*244|0)+16>>2]=c[d+16>>2];c[l+(i*244|0)+16+4>>2]=c[d+16+4>>2];c[l+(i*244|0)+16+8>>2]=c[d+16+8>>2];c[l+(i*244|0)+16+12>>2]=c[d+16+12>>2];c[l+(i*244|0)+32>>2]=c[d+32>>2];c[l+(i*244|0)+32+4>>2]=c[d+32+4>>2];c[l+(i*244|0)+32+8>>2]=c[d+32+8>>2];c[l+(i*244|0)+32+12>>2]=c[d+32+12>>2];c[l+(i*244|0)+48>>2]=c[d+48>>2];c[l+(i*244|0)+48+4>>2]=c[d+48+4>>2];c[l+(i*244|0)+48+8>>2]=c[d+48+8>>2];c[l+(i*244|0)+48+12>>2]=c[d+48+12>>2];gi(l+(i*244|0)+64|0,d+64|0,180)|0;return (c[b+12>>2]|0)+(i*244|0)|0}function Hf(a,b,e){a=a|0;b=b|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0;fi(a,b,e)|0;c[b+52>>2]=c[a+552>>2];c[b+56>>2]=c[a+556>>2];c[b+60>>2]=c[a+560>>2];c[b+64>>2]=c[a+564>>2];c[b+68>>2]=c[a+568>>2];c[b+72>>2]=c[a+572>>2];c[b+76>>2]=c[a+576>>2];c[b+80>>2]=c[a+580>>2];c[b+84>>2]=c[a+584>>2];c[b+88>>2]=c[a+588>>2];c[b+92>>2]=c[a+592>>2];c[b+96>>2]=c[a+596>>2];c[b+100>>2]=c[a+600>>2];c[b+104>>2]=c[a+604>>2];c[b+108>>2]=c[a+608>>2];c[b+112>>2]=c[a+612>>2];c[b+116>>2]=c[a+616>>2];c[b+120>>2]=c[a+620>>2];c[b+124>>2]=c[a+624>>2];c[b+128>>2]=c[a+628>>2];c[b+132>>2]=c[a+632>>2];c[b+136>>2]=c[a+636>>2];c[b+140>>2]=c[a+640>>2];c[b+144>>2]=c[a+644>>2];c[b+148>>2]=c[a+648>>2];c[b+152>>2]=c[a+652>>2];c[b+156>>2]=c[a+656>>2];c[b+160>>2]=c[a+660>>2];c[b+164>>2]=c[a+664>>2];c[b+168>>2]=c[a+668>>2];c[b+172>>2]=c[a+672>>2];c[b+176>>2]=c[a+676>>2];c[b+184>>2]=d[a+736>>0];c[b+188>>2]=d[a+737>>0];c[b+196>>2]=c[a+684>>2];c[b+192>>2]=c[a+680>>2];c[b+180>>2]=d[a+740>>0];h=+g[a+688>>2];i=+g[a+692>>2];f=+mh(h-i,6.2831854820251465);if(!(f<-3.1415927410125732)){if(f>3.1415927410125732)f=f+-6.2831854820251465}else f=f+6.2831854820251465;g[b+200>>2]=f;f=+mh(h+i,6.2831854820251465);if(f<-3.1415927410125732){i=f+6.2831854820251465;e=b+204|0;g[e>>2]=i;e=a+696|0;e=c[e>>2]|0;j=b+208|0;c[j>>2]=e;j=a+700|0;j=c[j>>2]|0;e=b+212|0;c[e>>2]=j;a=a+704|0;a=c[a>>2]|0;b=b+216|0;c[b>>2]=a;return 12693}if(!(f>3.1415927410125732)){i=f;j=b+204|0;g[j>>2]=i;j=a+696|0;j=c[j>>2]|0;e=b+208|0;c[e>>2]=j;e=a+700|0;e=c[e>>2]|0;j=b+212|0;c[j>>2]=e;a=a+704|0;a=c[a>>2]|0;j=b+216|0;c[j>>2]=a;return 12693}i=f+-6.2831854820251465;j=b+204|0;g[j>>2]=i;j=a+696|0;j=c[j>>2]|0;e=b+208|0;c[e>>2]=j;e=a+700|0;e=c[e>>2]|0;j=b+212|0;c[j>>2]=e;a=a+704|0;a=c[a>>2]|0;j=b+216|0;c[j>>2]=a;return 12693}function If(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0;k=l;l=l+64|0;n=+g[a+20>>2];u=+g[a+40>>2];p=+g[a+24>>2];s=+g[a+36>>2];t=+g[a+32>>2];m=+g[a+16>>2];j=+g[a>>2];i=+g[a+4>>2];q=+g[a+8>>2];h=1.0/((n*u-p*s)*j+i*(p*t-u*m)+(s*m-n*t)*q);z=+g[b>>2];y=+g[b+4>>2];A=+g[b+8>>2];x=+g[b+16>>2];w=+g[b+20>>2];v=+g[b+24>>2];r=+g[b+32>>2];o=+g[b+36>>2];f=+g[b+40>>2];g[k+16>>2]=A*(s*m-n*t)*h+(z*(n*u-p*s)*h+y*(p*t-u*m)*h);g[k+16+4>>2]=A*(t*i-s*j)*h+(z*(s*q-u*i)*h+y*(u*j-t*q)*h);g[k+16+8>>2]=A*(n*j-m*i)*h+(z*(p*i-n*q)*h+y*(m*q-p*j)*h);g[k+16+12>>2]=0.0;g[k+16+16>>2]=(n*u-p*s)*h*x+(p*t-u*m)*h*w+(s*m-n*t)*h*v;g[k+16+20>>2]=(s*q-u*i)*h*x+(u*j-t*q)*h*w+(t*i-s*j)*h*v;g[k+16+24>>2]=(p*i-n*q)*h*x+(m*q-p*j)*h*w+(n*j-m*i)*h*v;g[k+16+28>>2]=0.0;g[k+16+32>>2]=(n*u-p*s)*h*r+(p*t-u*m)*h*o+(s*m-n*t)*h*f;g[k+16+36>>2]=(s*q-u*i)*h*r+(u*j-t*q)*h*o+(t*i-s*j)*h*f;g[k+16+40>>2]=(p*i-n*q)*h*r+(m*q-p*j)*h*o+(n*j-m*i)*h*f;g[k+16+44>>2]=0.0;yh(k+16|0,k);f=+g[k>>2];h=+g[k+4>>2];i=+g[k+8>>2];m=+g[k+12>>2];j=1.0/+D(+(f*f+h*h+i*i+m*m));g[k>>2]=f*j;g[k+4>>2]=h*j;g[k+8>>2]=i*j;g[k+12>>2]=m*j;m=m*j<-1.0?-1.0:m*j;g[e>>2]=+I(+(m>1.0?1.0:m))*2.0;g[d>>2]=f*j;g[d+4>>2]=h*j;g[d+8>>2]=i*j;g[d+12>>2]=0.0;if(f*j*f*j+h*j*h*j+i*j*i*j<1.4210854715202004e-14){c[d>>2]=1065353216;c[d+4>>2]=0;c[d+8>>2]=0;g[d+12>>2]=0.0;l=k;return}else{A=1.0/+D(+(f*j*f*j+h*j*h*j+i*j*i*j));g[d>>2]=f*j*A;g[d+4>>2]=A*h*j;g[d+8>>2]=A*i*j;l=k;return}}function Jf(a,b,d){a=a|0;b=+b;d=+d;var e=0.0,f=0,h=0,i=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0.0;v=c[a+892>>2]|0;if((v|0)<=0)return;q=c[a+900>>2]|0;a=0;do{u=c[q+(a*56|0)>>2]|0;j=c[q+(a*56|0)+4>>2]|0;y=c[j+8>>2]|0;x=c[j+12>>2]|0;w=c[j+16>>2]|0;f=q+(a*56|0)+8|0;s=+g[f>>2];h=q+(a*56|0)+12|0;r=+g[h>>2];i=q+(a*56|0)+16|0;p=+g[i>>2];b=+g[y+8>>2]*s+ +g[x+8>>2]*r+ +g[w+8>>2]*p;d=+g[y+12>>2]*s+ +g[x+12>>2]*r+ +g[w+12>>2]*p;e=+g[y+16>>2]*s+ +g[x+16>>2]*r+ +g[w+16>>2]*p;k=+g[u+8>>2];l=+g[u+12>>2];m=+g[u+16>>2];n=k-+g[u+24>>2]-(b-(s*+g[y+24>>2]+r*+g[x+24>>2]+p*+g[w+24>>2]));o=l-+g[u+28>>2]-(d-(s*+g[y+28>>2]+r*+g[x+28>>2]+p*+g[w+28>>2]));p=m-+g[u+32>>2]-(e-(s*+g[y+32>>2]+r*+g[x+32>>2]+p*+g[w+32>>2]));r=+g[q+(a*56|0)+24>>2];s=+g[q+(a*56|0)+28>>2];t=+g[q+(a*56|0)+32>>2];if(n*r+o*s+p*t<0.0){e=+g[q+(a*56|0)+40>>2]-(k*r+l*s+m*t-(b*r+d*s+e*t));b=r*e+0.0;d=s*e+0.0;e=t*e+0.0}else{b=0.0;d=0.0;e=0.0}z=+g[q+(a*56|0)+44>>2];b=b-z*(n-r*(n*r+o*s+p*t));d=d-z*(o-s*(n*r+o*s+p*t));s=e-z*(p-t*(n*r+o*s+p*t));t=+g[q+(a*56|0)+48>>2];g[u+8>>2]=k+t*b;g[u+12>>2]=l+t*d;g[u+16>>2]=t*s+m;y=q+(a*56|0)+52|0;t=+g[y>>2]*+g[f>>2];x=c[j+8>>2]|0;g[x+8>>2]=+g[x+8>>2]-b*t;g[x+12>>2]=+g[x+12>>2]-d*t;g[x+16>>2]=+g[x+16>>2]-s*t;t=+g[y>>2]*+g[h>>2];x=c[j+12>>2]|0;g[x+8>>2]=+g[x+8>>2]-b*t;g[x+12>>2]=+g[x+12>>2]-d*t;g[x+16>>2]=+g[x+16>>2]-s*t;t=+g[y>>2]*+g[i>>2];y=c[j+16>>2]|0;g[y+8>>2]=+g[y+8>>2]-b*t;g[y+12>>2]=+g[y+12>>2]-d*t;g[y+16>>2]=+g[y+16>>2]-s*t;a=a+1|0}while((a|0)!=(v|0));return}function Kf(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;k=c[b+12>>2]|0;l=c[b+32>>2]|0;if((l|0)>=(k|0))return;if((c[b+36>>2]|0)<(k|0)){if(!k){d=0;f=l}else{c[6995]=(c[6995]|0)+1;d=sc((k<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=c[b+32>>2]|0}g=c[b+40>>2]|0;if((f|0)<=0)if(!g)e=b+44|0;else j=12;else{e=0;do{c[d+(e<<2)>>2]=c[g+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0));j=12}if((j|0)==12)if(!(a[b+44>>0]|0))e=b+44|0;else{c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);e=b+44|0}a[e>>0]=1;c[b+40>>2]=d;c[b+36>>2]=k;i=b+40|0}else{i=b+40|0;d=c[b+40>>2]|0}Yk(d+(l<<2)|0,0,(k<<2)-(l<<2)|0)|0;c[b+32>>2]=k;h=c[b+52>>2]|0;if((h|0)<(k|0)){if((c[b+56>>2]|0)<(k|0)){if(!k){d=0;f=h}else{c[6995]=(c[6995]|0)+1;d=sc((k<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=c[b+52>>2]|0}g=c[b+60>>2]|0;if((f|0)<=0)if(!g)e=b+64|0;else j=26;else{e=0;do{c[d+(e<<2)>>2]=c[g+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0));j=26}if((j|0)==26)if(!(a[b+64>>0]|0))e=b+64|0;else{c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);e=b+64|0}a[e>>0]=1;c[b+60>>2]=d;c[b+56>>2]=k}else d=c[b+60>>2]|0;Yk(d+(h<<2)|0,0,(k<<2)-(h<<2)|0)|0}c[b+52>>2]=k;if((k|0)>0){Yk(c[i>>2]|0,-1,k<<2|0)|0;Yk(c[b+60>>2]|0,-1,k<<2|0)|0}if((l|0)<=0)return;g=c[b+16>>2]|0;e=c[i>>2]|0;f=c[b+60>>2]|0;d=0;do{k=c[(c[g+(d<<4)+4>>2]|0)+12>>2]<<16|c[(c[g+(d<<4)>>2]|0)+12>>2];k=((k+~(k<<15)|0)>>>10^k+~(k<<15))*9|0;k=e+(((((k>>>6^k)+~((k>>>6^k)<<11)|0)>>>16^(k>>>6^k)+~((k>>>6^k)<<11))&(c[b+12>>2]|0)+-1)<<2)|0;c[f+(d<<2)>>2]=c[k>>2];c[k>>2]=d;d=d+1|0}while((d|0)!=(l|0));return}function Lf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0;f=l;l=l+256|0;c[f+32>>2]=4276;k=f+32+36|0;c[k>>2]=c[b>>2];c[k+4>>2]=c[b+4>>2];c[k+8>>2]=c[b+8>>2];c[k+12>>2]=c[b+12>>2];m=f+32+52|0;c[m>>2]=c[d>>2];c[m+4>>2]=c[d+4>>2];c[m+8>>2]=c[d+8>>2];c[m+12>>2]=c[d+12>>2];c[f+32+212>>2]=a;c[f+32+216>>2]=e;c[f+32+68>>2]=1065353216;c[f+32+72>>2]=0;c[f+32+72+4>>2]=0;c[f+32+72+8>>2]=0;c[f+32+72+12>>2]=0;c[f+32+88>>2]=1065353216;c[f+32+92>>2]=0;c[f+32+92+4>>2]=0;c[f+32+92+8>>2]=0;c[f+32+92+12>>2]=0;c[f+32+108>>2]=1065353216;c[f+32+112>>2]=0;c[f+32+116>>2]=c[k>>2];c[f+32+116+4>>2]=c[k+4>>2];c[f+32+116+8>>2]=c[k+8>>2];c[f+32+116+12>>2]=c[k+12>>2];c[f+32+132>>2]=1065353216;c[f+32+136>>2]=0;c[f+32+136+4>>2]=0;c[f+32+136+8>>2]=0;c[f+32+136+12>>2]=0;c[f+32+152>>2]=1065353216;c[f+32+156>>2]=0;c[f+32+156+4>>2]=0;c[f+32+156+8>>2]=0;c[f+32+156+12>>2]=0;c[f+32+172>>2]=1065353216;c[f+32+176>>2]=0;c[f+32+180>>2]=c[d>>2];c[f+32+180+4>>2]=c[d+4>>2];c[f+32+180+8>>2]=c[d+8>>2];c[f+32+180+12>>2]=c[d+12>>2];n=+g[d>>2]-+g[b>>2];j=+g[d+4>>2]-+g[b+4>>2];i=+g[d+8>>2]-+g[b+8>>2];h=1.0/+D(+(n*n+j*j+i*i));q=n*h==0.0?1000000015047466219876688.0e6:1.0/(n*h);g[f+32+4>>2]=q;p=j*h==0.0?1000000015047466219876688.0e6:1.0/(j*h);g[f+32+8>>2]=p;o=i*h==0.0?1000000015047466219876688.0e6:1.0/(i*h);g[f+32+12>>2]=o;c[f+32+20>>2]=q<0.0&1;c[f+32+24>>2]=p<0.0&1;c[f+32+28>>2]=o<0.0&1;g[f+32+32>>2]=n*h*(+g[m>>2]-+g[k>>2])+j*h*(+g[f+32+56>>2]-+g[f+32+40>>2])+i*h*(+g[f+32+60>>2]-+g[f+32+44>>2]);e=c[a+68>>2]|0;a=c[(c[e>>2]|0)+24>>2]|0;c[f+16>>2]=0;c[f+16+4>>2]=0;c[f+16+8>>2]=0;c[f+16+12>>2]=0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;$b[a&7](e,b,d,f+32|0,f+16|0,f);l=f;return}function Mf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;g=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=g;if(g|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;c[b+20>>2]=c[a+76>>2];e=c[a+20>>2]|0;c[b+16>>2]=e;c[b+12>>2]=0;if(!e)return 16280;g=Bb[c[(c[d>>2]|0)+16>>2]&63](d,76,e)|0;e=c[g+8>>2]|0;c[b+12>>2]=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;if((c[b+16>>2]|0)>0){f=0;while(1){h=c[a+28>>2]|0;c[e+72>>2]=c[h+(f*80|0)+72>>2];c[e+64>>2]=zb[c[(c[d>>2]|0)+28>>2]&31](d,c[h+(f*80|0)+64>>2]|0)|0;if(!(zb[c[(c[d>>2]|0)+24>>2]&31](d,c[(c[a+28>>2]|0)+(f*80|0)+64>>2]|0)|0)){h=c[(c[d>>2]|0)+16>>2]|0;i=c[(c[a+28>>2]|0)+(f*80|0)+64>>2]|0;i=xb[c[(c[i>>2]|0)+52>>2]&127](i)|0;i=Bb[h&63](d,i,1)|0;h=c[(c[a+28>>2]|0)+(f*80|0)+64>>2]|0;h=Bb[c[(c[h>>2]|0)+56>>2]&63](h,c[i+8>>2]|0,d)|0;Zb[c[(c[d>>2]|0)+20>>2]&31](d,i,h,1346455635,c[(c[a+28>>2]|0)+(f*80|0)+64>>2]|0)}i=c[a+28>>2]|0;c[e+68>>2]=c[i+(f*80|0)+68>>2];c[e>>2]=c[i+(f*80|0)>>2];c[e+4>>2]=c[i+(f*80|0)+4>>2];c[e+8>>2]=c[i+(f*80|0)+8>>2];c[e+12>>2]=c[i+(f*80|0)+12>>2];c[e+16>>2]=c[i+(f*80|0)+16>>2];c[e+20>>2]=c[i+(f*80|0)+20>>2];c[e+24>>2]=c[i+(f*80|0)+24>>2];c[e+28>>2]=c[i+(f*80|0)+28>>2];c[e+32>>2]=c[i+(f*80|0)+32>>2];c[e+36>>2]=c[i+(f*80|0)+36>>2];c[e+40>>2]=c[i+(f*80|0)+40>>2];c[e+44>>2]=c[i+(f*80|0)+44>>2];c[e+48>>2]=c[i+(f*80|0)+48>>2];c[e+52>>2]=c[i+(f*80|0)+52>>2];c[e+56>>2]=c[i+(f*80|0)+56>>2];c[e+60>>2]=c[i+(f*80|0)+60>>2];f=f+1|0;if((f|0)>=(c[b+16>>2]|0)){e=d;break}else e=e+76|0}}else e=d;Zb[c[(c[e>>2]|0)+20>>2]&31](d,g,16255,1497453121,c[g+8>>2]|0);return 16280}function Nf(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;k=c[b+12>>2]|0;l=c[b+28>>2]|0;if((l|0)>=(k|0))return;if((c[b+32>>2]|0)<(k|0)){if(!k){d=0;f=l}else{c[6995]=(c[6995]|0)+1;d=sc((k<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=c[b+28>>2]|0}g=c[b+36>>2]|0;if((f|0)<=0)if(!g)e=b+40|0;else j=12;else{e=0;do{c[d+(e<<2)>>2]=c[g+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0));j=12}if((j|0)==12)if(!(a[b+40>>0]|0))e=b+40|0;else{c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);e=b+40|0}a[e>>0]=1;c[b+36>>2]=d;c[b+32>>2]=k;i=b+36|0}else{i=b+36|0;d=c[b+36>>2]|0}Yk(d+(l<<2)|0,0,(k<<2)-(l<<2)|0)|0;c[b+28>>2]=k;h=c[b+48>>2]|0;if((h|0)<(k|0)){if((c[b+52>>2]|0)<(k|0)){if(!k){d=0;f=h}else{c[6995]=(c[6995]|0)+1;d=sc((k<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=c[b+48>>2]|0}g=c[b+56>>2]|0;if((f|0)<=0)if(!g)e=b+60|0;else j=26;else{e=0;do{c[d+(e<<2)>>2]=c[g+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0));j=26}if((j|0)==26)if(!(a[b+60>>0]|0))e=b+60|0;else{c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);e=b+60|0}a[e>>0]=1;c[b+56>>2]=d;c[b+52>>2]=k}else d=c[b+56>>2]|0;Yk(d+(h<<2)|0,0,(k<<2)-(h<<2)|0)|0}c[b+48>>2]=k;if((k|0)>0){Yk(c[i>>2]|0,-1,k<<2|0)|0;Yk(c[b+56>>2]|0,-1,k<<2|0)|0}if((l|0)<=0)return;g=c[b+16>>2]|0;e=c[i>>2]|0;f=c[b+56>>2]|0;d=0;do{k=c[g+(d*12|0)+4>>2]<<16|c[g+(d*12|0)>>2];k=((k+~(k<<15)|0)>>>10^k+~(k<<15))*9|0;k=e+(((((k>>>6^k)+~((k>>>6^k)<<11)|0)>>>16^(k>>>6^k)+~((k>>>6^k)<<11))&(c[b+12>>2]|0)+-1)<<2)|0;c[f+(d<<2)>>2]=c[k>>2];c[k>>2]=d;d=d+1|0}while((d|0)!=(l|0));return}function Of(b,d){b=b|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,q=0,r=0;if((c[b+8>>2]|0)>=(d|0))return;if((d|0)!=0?(c[6995]=(c[6995]|0)+1,e=sc((d*36|3)+16|0)|0,(e|0)!=0):0){c[(e+4+15&-16)+-4>>2]=e;r=e+4+15&-16}else r=0;n=c[b+4>>2]|0;if((n|0)>0){m=0;do{o=c[b+12>>2]|0;i=r+(m*36|0)+16|0;a[i>>0]=1;j=r+(m*36|0)+12|0;c[j>>2]=0;l=r+(m*36|0)+4|0;c[l>>2]=0;k=r+(m*36|0)+8|0;c[k>>2]=0;p=c[o+(m*36|0)+4>>2]|0;if((p|0)>0){c[6995]=(c[6995]|0)+1;e=sc((p<<2|3)+16|0)|0;if(!e)f=0;else{c[(e+4+15&-16)+-4>>2]=e;f=e+4+15&-16}g=c[l>>2]|0;h=c[j>>2]|0;if((g|0)<=0){if(h|0)q=13}else{e=0;do{c[f+(e<<2)>>2]=c[h+(e<<2)>>2];e=e+1|0}while((e|0)!=(g|0));q=13}if((q|0)==13?(q=0,a[i>>0]|0):0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}a[i>>0]=1;c[j>>2]=f;c[k>>2]=p;Yk(f|0,0,p<<2|0)|0;g=c[j>>2]|0;c[l>>2]=p;f=c[o+(m*36|0)+12>>2]|0;e=0;do{c[g+(e<<2)>>2]=c[f+(e<<2)>>2];e=e+1|0}while((e|0)!=(p|0))}else c[l>>2]=p;p=r+(m*36|0)+20|0;o=o+(m*36|0)+20|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];m=m+1|0}while((m|0)!=(n|0));f=c[b+4>>2]|0;if((f|0)>0){e=0;do{h=c[b+12>>2]|0;i=h+(e*36|0)+4|0;j=h+(e*36|0)+12|0;k=c[j>>2]|0;g=h+(e*36|0)+16|0;if(k|0){if(a[g>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[j>>2]=0}a[g>>0]=1;c[j>>2]=0;c[i>>2]=0;c[h+(e*36|0)+8>>2]=0;e=e+1|0}while((e|0)!=(f|0))}}e=c[b+12>>2]|0;if(e|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=r;c[b+8>>2]=d;return}function Pf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0;f=l;l=l+256|0;c[f+32>>2]=6004;k=f+32+36|0;c[k>>2]=c[b>>2];c[k+4>>2]=c[b+4>>2];c[k+8>>2]=c[b+8>>2];c[k+12>>2]=c[b+12>>2];m=f+32+52|0;c[m>>2]=c[d>>2];c[m+4>>2]=c[d+4>>2];c[m+8>>2]=c[d+8>>2];c[m+12>>2]=c[d+12>>2];c[f+32+212>>2]=a;c[f+32+216>>2]=e;c[f+32+68>>2]=1065353216;c[f+32+72>>2]=0;c[f+32+72+4>>2]=0;c[f+32+72+8>>2]=0;c[f+32+72+12>>2]=0;c[f+32+88>>2]=1065353216;c[f+32+92>>2]=0;c[f+32+92+4>>2]=0;c[f+32+92+8>>2]=0;c[f+32+92+12>>2]=0;c[f+32+108>>2]=1065353216;c[f+32+112>>2]=0;c[f+32+116>>2]=c[k>>2];c[f+32+116+4>>2]=c[k+4>>2];c[f+32+116+8>>2]=c[k+8>>2];c[f+32+116+12>>2]=c[k+12>>2];c[f+32+132>>2]=1065353216;c[f+32+136>>2]=0;c[f+32+136+4>>2]=0;c[f+32+136+8>>2]=0;c[f+32+136+12>>2]=0;c[f+32+152>>2]=1065353216;c[f+32+156>>2]=0;c[f+32+156+4>>2]=0;c[f+32+156+8>>2]=0;c[f+32+156+12>>2]=0;c[f+32+172>>2]=1065353216;c[f+32+176>>2]=0;c[f+32+180>>2]=c[d>>2];c[f+32+180+4>>2]=c[d+4>>2];c[f+32+180+8>>2]=c[d+8>>2];c[f+32+180+12>>2]=c[d+12>>2];n=+g[d>>2]-+g[b>>2];j=+g[d+4>>2]-+g[b+4>>2];i=+g[d+8>>2]-+g[b+8>>2];h=1.0/+D(+(n*n+j*j+i*i));q=n*h==0.0?999999984306749440.0:1.0/(n*h);g[f+32+4>>2]=q;p=j*h==0.0?999999984306749440.0:1.0/(j*h);g[f+32+8>>2]=p;o=i*h==0.0?999999984306749440.0:1.0/(i*h);g[f+32+12>>2]=o;c[f+32+20>>2]=q<0.0&1;c[f+32+24>>2]=p<0.0&1;c[f+32+28>>2]=o<0.0&1;g[f+32+32>>2]=n*h*(+g[m>>2]-+g[k>>2])+j*h*(+g[f+32+56>>2]-+g[f+32+40>>2])+i*h*(+g[f+32+60>>2]-+g[f+32+44>>2]);e=c[a+68>>2]|0;a=c[(c[e>>2]|0)+24>>2]|0;c[f+16>>2]=0;c[f+16+4>>2]=0;c[f+16+8>>2]=0;c[f+16+12>>2]=0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;$b[a&7](e,b,d,f+32|0,f+16|0,f);l=f;return}function Qf(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;h=l;l=l+128|0;if(!b){l=h;return}if(c[b+40>>2]|0){Qf(a,c[b+36>>2]|0,d+1|0,e,f);Qf(a,c[b+40>>2]|0,d+1|0,e,f)}if((d|0)<0){l=h;return}m=+g[b>>2];r=+g[b+16>>2];j=+g[b+4>>2];q=+g[b+20>>2];i=+g[b+8>>2];p=+g[b+24>>2];k=(m+r)*.5-(r-m)*.5;n=(j+q)*.5-(q-j)*.5;o=(i+p)*.5-(p-i)*.5;m=(m+r)*.5+(r-m)*.5;j=(j+q)*.5+(q-j)*.5;i=(i+p)*.5+(p-i)*.5;f=(c[b+40>>2]|0)==0?f:e;g[h>>2]=k;g[h+4>>2]=n;g[h+8>>2]=o;g[h+12>>2]=0.0;g[h+16>>2]=m;g[h+20>>2]=n;g[h+24>>2]=o;g[h+28>>2]=0.0;g[h+32>>2]=m;g[h+36>>2]=j;g[h+40>>2]=o;g[h+44>>2]=0.0;g[h+48>>2]=k;g[h+52>>2]=j;g[h+56>>2]=o;g[h+60>>2]=0.0;g[h+64>>2]=k;g[h+68>>2]=n;g[h+72>>2]=i;g[h+76>>2]=0.0;g[h+80>>2]=m;g[h+84>>2]=n;g[h+88>>2]=i;g[h+92>>2]=0.0;g[h+96>>2]=m;g[h+100>>2]=j;g[h+104>>2]=i;g[h+108>>2]=0.0;g[h+112>>2]=k;g[h+116>>2]=j;g[h+120>>2]=i;g[h+124>>2]=0.0;Vb[c[(c[a>>2]|0)+16>>2]&127](a,h,h+16|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+16|0,h+32|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+32|0,h+48|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+48|0,h,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+64|0,h+80|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+80|0,h+96|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+96|0,h+112|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+112|0,h+64|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h,h+64|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+16|0,h+80|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+32|0,h+96|0,f);Vb[c[(c[a>>2]|0)+16>>2]&127](a,h+48|0,h+112|0,f);l=h;return}function Rf(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0;c[b+8>>2]=0;c[b+12>>2]=-1;c[b>>2]=6640;a[b+32>>0]=1;c[b+28>>2]=0;c[b+20>>2]=0;c[b+24>>2]=0;c[b+36>>2]=1566444395;c[b+40>>2]=1566444395;c[b+44>>2]=1566444395;g[b+48>>2]=0.0;c[b+52>>2]=-581039253;c[b+56>>2]=-581039253;c[b+60>>2]=-581039253;g[b+64>>2]=0.0;c[b+68>>2]=0;c[b+72>>2]=1;g[b+76>>2]=0.0;c[b+80>>2]=1065353216;c[b+84>>2]=1065353216;c[b+88>>2]=1065353216;g[b+92>>2]=0.0;c[b+4>>2]=31;if(d){c[6995]=(c[6995]|0)+1;d=sc(59)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}a[d+36>>0]=1;c[d+32>>2]=0;c[d+24>>2]=0;c[d+28>>2]=0;c[d>>2]=0;c[d+4>>2]=0;c[d+8>>2]=-1;c[d+12>>2]=0;c[d+16>>2]=0;c[b+68>>2]=d;d=c[b+24>>2]|0}else d=0;if((d|0)>=(e|0))return;if((e|0)!=0?(c[6995]=(c[6995]|0)+1,f=sc((e*80|3)+16|0)|0,(f|0)!=0):0){c[(f+4+15&-16)+-4>>2]=f;h=f+4+15&-16}else h=0;f=c[b+20>>2]|0;if((f|0)>0){d=0;do{i=h+(d*80|0)|0;j=c[b+28>>2]|0;k=j+(d*80|0)|0;c[i>>2]=c[k>>2];c[i+4>>2]=c[k+4>>2];c[i+8>>2]=c[k+8>>2];c[i+12>>2]=c[k+12>>2];i=j+(d*80|0)+16|0;k=h+(d*80|0)+16|0;c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];k=j+(d*80|0)+32|0;i=h+(d*80|0)+32|0;c[i>>2]=c[k>>2];c[i+4>>2]=c[k+4>>2];c[i+8>>2]=c[k+8>>2];c[i+12>>2]=c[k+12>>2];i=h+(d*80|0)+48|0;k=j+(d*80|0)+48|0;c[i>>2]=c[k>>2];c[i+4>>2]=c[k+4>>2];c[i+8>>2]=c[k+8>>2];c[i+12>>2]=c[k+12>>2];i=h+(d*80|0)+64|0;j=j+(d*80|0)+64|0;c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];d=d+1|0}while((d|0)!=(f|0))}d=c[b+28>>2]|0;if(d|0){if(a[b+32>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+28>>2]=0}a[b+32>>0]=1;c[b+28>>2]=h;c[b+24>>2]=e;return}function Sf(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0;r=l;l=l+96|0;m=r;n=m+96|0;do{c[m>>2]=0;m=m+4|0}while((m|0)<(n|0));if(!i)p=c[c[b+940>>2]>>2]|0;else p=i;i=c[b+832>>2]|0;if((i|0)==(c[b+836>>2]|0)?(q=i|0?i<<1:1,(i|0)<(q|0)):0){if(!q)o=0;else{c[6995]=(c[6995]|0)+1;i=sc((q*104|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}o=i;i=c[b+832>>2]|0}if((i|0)>0){j=0;do{m=o+(j*104|0)|0;k=(c[b+840>>2]|0)+(j*104|0)|0;n=m+104|0;do{c[m>>2]=c[k>>2];m=m+4|0;k=k+4|0}while((m|0)<(n|0));j=j+1|0}while((j|0)!=(i|0))}i=c[b+840>>2]|0;if(i|0){if(a[b+844>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[b+840>>2]=0}a[b+844>>0]=1;c[b+840>>2]=o;c[b+836>>2]=q;i=c[b+832>>2]|0}m=c[b+840>>2]|0;c[m+(i*104|0)>>2]=0;c[m+(i*104|0)+4>>2]=p;m=m+(i*104|0)+8|0;k=r;n=m+96|0;do{c[m>>2]=c[k>>2];m=m+4|0;k=k+4|0}while((m|0)<(n|0));q=c[b+832>>2]|0;c[b+832>>2]=q+1;p=c[b+840>>2]|0;k=c[b+780>>2]|0;c[p+(q*104|0)+8>>2]=k+(d*104|0);o=c[b+780>>2]|0;c[p+(q*104|0)+12>>2]=o+(e*104|0);m=c[b+780>>2]|0;c[p+(q*104|0)+16>>2]=m+(f*104|0);n=c[b+780>>2]|0;c[p+(q*104|0)+20>>2]=n+(h*104|0);z=+g[k+(d*104|0)+8>>2];w=+g[k+(d*104|0)+12>>2];A=+g[k+(d*104|0)+16>>2];t=+g[m+(f*104|0)+8>>2]-z;y=+g[m+(f*104|0)+12>>2]-w;v=+g[m+(f*104|0)+16>>2]-A;u=+g[n+(h*104|0)+8>>2]-z;x=+g[n+(h*104|0)+12>>2]-w;s=+g[n+(h*104|0)+16>>2]-A;g[p+(q*104|0)+24>>2]=(+g[o+(e*104|0)+16>>2]-A)*(t*x-y*u)+((+g[o+(e*104|0)+8>>2]-z)*(y*s-v*x)+(+g[o+(e*104|0)+12>>2]-w)*(v*u-t*s));a[b+984>>0]=1;l=r;return}function Tf(b){b=b|0;var d=0;c[b>>2]=5052;d=c[b+204>>2]|0;if(d|0){if(a[b+208>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+204>>2]=0}a[b+208>>0]=1;c[b+204>>2]=0;c[b+196>>2]=0;c[b+200>>2]=0;d=c[b+176>>2]|0;if(d|0){if(a[b+180>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+176>>2]=0}a[b+180>>0]=1;c[b+176>>2]=0;c[b+168>>2]=0;c[b+172>>2]=0;d=c[b+156>>2]|0;if(d|0){if(a[b+160>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+156>>2]=0}a[b+160>>0]=1;c[b+156>>2]=0;c[b+148>>2]=0;c[b+152>>2]=0;d=c[b+136>>2]|0;if(d|0){if(a[b+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+136>>2]=0}a[b+140>>0]=1;c[b+136>>2]=0;c[b+128>>2]=0;c[b+132>>2]=0;d=c[b+116>>2]|0;if(d|0){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+116>>2]=0}a[b+120>>0]=1;c[b+116>>2]=0;c[b+108>>2]=0;c[b+112>>2]=0;d=c[b+96>>2]|0;if(d|0){if(a[b+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+96>>2]=0}a[b+100>>0]=1;c[b+96>>2]=0;c[b+88>>2]=0;c[b+92>>2]=0;d=c[b+76>>2]|0;if(d|0){if(a[b+80>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+76>>2]=0}a[b+80>>0]=1;c[b+76>>2]=0;c[b+68>>2]=0;c[b+72>>2]=0;d=c[b+56>>2]|0;if(d|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;d=c[b+36>>2]|0;if(d|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;d=c[b+16>>2]|0;if(!d){a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}function Uf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0.0,p=0;k=l;l=l+160|0;i=c[b+12>>2]|0;if(!i){l=k;return}m=(a[b+16>>0]|0)!=0;n=m?e:d;e=m?d:e;p=c[n+4>>2]|0;d=c[e+4>>2]|0;c[h+4>>2]=i;o=+g[i+784>>2]+ +g[h+32>>2];c[k+136>>2]=9648;c[k+136+4>>2]=p;c[k+136+8>>2]=d;g[k+136+12>>2]=o;g[k+128>>2]=999999984306749440.0;i=c[n+12>>2]|0;c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];c[k+16>>2]=c[i+16>>2];c[k+16+4>>2]=c[i+16+4>>2];c[k+16+8>>2]=c[i+16+8>>2];c[k+16+12>>2]=c[i+16+12>>2];c[k+32>>2]=c[i+32>>2];c[k+32+4>>2]=c[i+32+4>>2];c[k+32+8>>2]=c[i+32+8>>2];c[k+32+12>>2]=c[i+32+12>>2];c[k+48>>2]=c[i+48>>2];c[k+48+4>>2]=c[i+48+4>>2];c[k+48+8>>2]=c[i+48+8>>2];c[k+48+12>>2]=c[i+48+12>>2];i=c[e+12>>2]|0;c[k+64>>2]=c[i>>2];c[k+64+4>>2]=c[i+4>>2];c[k+64+8>>2]=c[i+8>>2];c[k+64+12>>2]=c[i+12>>2];c[k+80>>2]=c[i+16>>2];c[k+80+4>>2]=c[i+16+4>>2];c[k+80+8>>2]=c[i+16+8>>2];c[k+80+12>>2]=c[i+16+12>>2];c[k+96>>2]=c[i+32>>2];c[k+96+4>>2]=c[i+32+4>>2];c[k+96+8>>2]=c[i+32+8>>2];c[k+96+12>>2]=c[i+32+12>>2];c[k+112>>2]=c[i+48>>2];c[k+112+4>>2]=c[i+48+4>>2];c[k+112+8>>2]=c[i+48+8>>2];c[k+112+12>>2]=c[i+48+12>>2];Xd(k+136|0,k,h,c[f+20>>2]|0,m);do if(a[b+8>>0]|0?(j=c[h+4>>2]|0,c[j+780>>2]|0):0){d=c[j+772>>2]|0;e=c[(c[h+8>>2]|0)+8>>2]|0;b=c[(c[h+12>>2]|0)+8>>2]|0;if((d|0)==(e|0)){af(j,d+4|0,b+4|0);break}else{af(j,b+4|0,e+4|0);break}}while(0);l=k;return}function Vf(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0;d=c[a+812>>2]|0;if((d|0)>0){e=c[a+820>>2]|0;b=0;do{f=c[e+(b*44|0)+8>>2]|0;h=c[e+(b*44|0)+12>>2]|0;i=c[e+(b*44|0)+16>>2]|0;l=+g[f+8>>2];n=+g[f+12>>2];j=+g[f+16>>2];k=+g[h+8>>2]-l;o=+g[h+12>>2]-n;m=+g[h+16>>2]-j;l=+g[i+8>>2]-l;n=+g[i+12>>2]-n;j=+g[i+16>>2]-j;g[e+(b*44|0)+36>>2]=+D(+((k*n-o*l)*(k*n-o*l)+((o*j-m*n)*(o*j-m*n)+(m*l-k*j)*(m*l-k*j))));b=b+1|0}while((b|0)!=(d|0))}d=c[a+772>>2]|0;if((d|0)>0){c[6995]=(c[6995]|0)+1;b=sc((d<<2|3)+16|0)|0;if(!b)e=0;else{c[(b+4+15&-16)+-4>>2]=b;e=b+4+15&-16}Yk(e|0,0,d<<2|0)|0;f=c[a+772>>2]|0;if((f|0)>0){d=c[a+780>>2]|0;b=0;do{g[d+(b*104|0)+92>>2]=0.0;b=b+1|0}while((b|0)!=(f|0));i=e;h=e;b=f}else{i=e;h=e;b=f}}else{i=0;h=0;b=d}f=c[a+812>>2]|0;if((f|0)>0){d=c[a+820>>2]|0;e=c[a+780>>2]|0;b=0;do{o=+C(+(+g[d+(b*44|0)+36>>2]));p=c[d+(b*44|0)+8>>2]|0;q=i+(((p-e|0)/104|0)<<2)|0;c[q>>2]=(c[q>>2]|0)+1;g[p+92>>2]=o+ +g[p+92>>2];p=c[d+(b*44|0)+12>>2]|0;q=i+(((p-e|0)/104|0)<<2)|0;c[q>>2]=(c[q>>2]|0)+1;g[p+92>>2]=o+ +g[p+92>>2];p=c[d+(b*44|0)+16>>2]|0;q=i+(((p-e|0)/104|0)<<2)|0;c[q>>2]=(c[q>>2]|0)+1;g[p+92>>2]=o+ +g[p+92>>2];b=b+1|0}while((b|0)!=(f|0));b=c[a+772>>2]|0}if((b|0)>0){d=0;do{e=c[i+(d<<2)>>2]|0;if((e|0)>0){q=(c[a+780>>2]|0)+(d*104|0)+92|0;g[q>>2]=+g[q>>2]/+(e|0)}else g[(c[a+780>>2]|0)+(d*104|0)+92>>2]=0.0;d=d+1|0}while((d|0)!=(b|0));if(!h)return}else if((i|0)==0|(h|0)==0)return;c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);return}function Wf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0;d=l;l=l+128|0;F=c[(c[a+8>>2]|0)+28>>2]|0;f=c[F+(b*80|0)+64>>2]|0;e=c[a+12>>2]|0;w=+g[F+(b*80|0)>>2];C=+g[e>>2];v=+g[F+(b*80|0)+16>>2];B=+g[e+4>>2];u=+g[F+(b*80|0)+32>>2];A=+g[e+8>>2];t=+g[F+(b*80|0)+4>>2];s=+g[F+(b*80|0)+20>>2];r=+g[F+(b*80|0)+36>>2];q=+g[F+(b*80|0)+8>>2];o=+g[F+(b*80|0)+24>>2];m=+g[F+(b*80|0)+40>>2];z=+g[e+16>>2];y=+g[e+20>>2];x=+g[e+24>>2];p=+g[e+32>>2];n=+g[e+36>>2];k=+g[e+40>>2];E=+g[F+(b*80|0)+48>>2];D=+g[F+(b*80|0)+52>>2];h=+g[F+(b*80|0)+56>>2];j=+g[e+48>>2]+(C*E+B*D+A*h);i=z*E+y*D+x*h+ +g[e+52>>2];h=p*E+n*D+k*h+ +g[e+56>>2];g[d+56>>2]=w*C+v*B+u*A;g[d+56+4>>2]=C*t+B*s+A*r;g[d+56+8>>2]=C*q+B*o+A*m;g[d+56+12>>2]=0.0;g[d+56+16>>2]=w*z+v*y+u*x;g[d+56+20>>2]=t*z+s*y+r*x;g[d+56+24>>2]=q*z+o*y+m*x;g[d+56+28>>2]=0.0;g[d+56+32>>2]=w*p+v*n+u*k;g[d+56+36>>2]=t*p+s*n+r*k;g[d+56+40>>2]=q*p+o*n+m*k;g[d+56+44>>2]=0.0;g[d+56+48>>2]=j;g[d+56+52>>2]=i;g[d+56+56>>2]=h;g[d+56+60>>2]=0.0;e=c[a+4>>2]|0;c[d+32>>2]=0;c[d+32+4>>2]=f;c[d+32+8>>2]=e;c[d+32+12>>2]=d+56;c[d+32+16>>2]=-1;c[d+32+20>>2]=b;e=c[a+24>>2]|0;g[d+4>>2]=1.0;c[d+8>>2]=0;c[d+12>>2]=1;c[d+16>>2]=-1;c[d+20>>2]=0;c[d>>2]=6108;c[d+24>>2]=e;c[d+28>>2]=b;c[d+4>>2]=c[e+4>>2];c[d+20>>2]=c[e+20>>2];ad(c[a+16>>2]|0,c[a+20>>2]|0,d+32|0,d);l=d;return}function Xf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0;i=l;l=l+80|0;h=+nb[c[(c[a>>2]|0)+48>>2]&15](a);f=0;do{q=i+64+(f<<2)|0;c[i+64>>2]=0;c[i+64+4>>2]=0;c[i+64+8>>2]=0;c[i+64+12>>2]=0;g[q>>2]=1.0;j=c[(c[a>>2]|0)+64>>2]|0;k=+g[i+64>>2];m=+g[i+64+4>>2];n=+g[i+64+8>>2];o=k*+g[b+4>>2]+m*+g[b+20>>2]+n*+g[b+36>>2];p=k*+g[b+8>>2]+m*+g[b+24>>2]+n*+g[b+40>>2];g[i+32>>2]=+g[b>>2]*k+ +g[b+16>>2]*m+ +g[b+32>>2]*n;g[i+32+4>>2]=o;g[i+32+8>>2]=p;g[i+32+12>>2]=0.0;Sb[j&127](i+48|0,a,i+32|0);p=+g[i+48>>2];o=+g[i+48+4>>2];n=+g[i+48+8>>2];m=p*+g[b+16>>2]+o*+g[b+20>>2]+n*+g[b+24>>2]+ +g[b+52>>2];k=p*+g[b+32>>2]+o*+g[b+36>>2]+n*+g[b+40>>2]+ +g[b+56>>2];g[i+32>>2]=p*+g[b>>2]+o*+g[b+4>>2]+n*+g[b+8>>2]+ +g[b+48>>2];g[i+32+4>>2]=m;g[i+32+8>>2]=k;g[i+32+12>>2]=0.0;j=i+32+(f<<2)|0;g[e+(f<<2)>>2]=h+ +g[j>>2];g[q>>2]=-1.0;q=c[(c[a>>2]|0)+64>>2]|0;k=+g[i+64>>2];m=+g[i+64+4>>2];n=+g[i+64+8>>2];o=k*+g[b+4>>2]+m*+g[b+20>>2]+n*+g[b+36>>2];p=k*+g[b+8>>2]+m*+g[b+24>>2]+n*+g[b+40>>2];g[i>>2]=+g[b>>2]*k+ +g[b+16>>2]*m+ +g[b+32>>2]*n;g[i+4>>2]=o;g[i+8>>2]=p;g[i+12>>2]=0.0;Sb[q&127](i+16|0,a,i);p=+g[i+16>>2];o=+g[i+16+4>>2];n=+g[i+16+8>>2];m=p*+g[b+16>>2]+o*+g[b+20>>2]+n*+g[b+24>>2]+ +g[b+52>>2];k=p*+g[b+32>>2]+o*+g[b+36>>2]+n*+g[b+40>>2]+ +g[b+56>>2];g[i+32>>2]=p*+g[b>>2]+o*+g[b+4>>2]+n*+g[b+8>>2]+ +g[b+48>>2];g[i+32+4>>2]=m;g[i+32+8>>2]=k;g[i+32+12>>2]=0.0;g[d+(f<<2)>>2]=+g[j>>2]-h;f=f+1|0}while((f|0)!=3);l=i;return}function Yf(b,d,e,f,g,h,i,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0;m=l;l=l+48|0;c[6995]=(c[6995]|0)+1;f=sc(83)|0;if(!f)k=0;else{c[(f+4+15&-16)+-4>>2]=f;k=f+4+15&-16}c[k>>2]=g;c[k+4>>2]=h;c[k+8>>2]=i;h=k+16|0;c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];h=k+32|0;c[h>>2]=c[e>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];c[h+12>>2]=c[e+12>>2];h=k+56|0;c[h>>2]=0;i=k+52|0;c[i>>2]=0;c[m+16>>2]=c[d>>2];c[m+16+4>>2]=c[d+4>>2];c[m+16+8>>2]=c[d+8>>2];c[m+16+12>>2]=c[d+12>>2];c[m+16+16>>2]=c[e>>2];c[m+16+16+4>>2]=c[e+4>>2];c[m+16+16+8>>2]=c[e+8>>2];c[m+16+16+12>>2]=c[e+12>>2];c[k+60>>2]=c[b+104>>2];f=(c[b+148>>2]|0)+1|0;c[b+148>>2]=f;c[k+12>>2]=f;f=c[b+8>>2]|0;if(!f){c[6995]=(c[6995]|0)+1;f=sc(63)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=f;g=j+44|0;do{c[j>>2]=0;j=j+4|0}while((j|0)<(g|0))}else c[b+8>>2]=0;c[f+32>>2]=0;c[f+36>>2]=k;c[f+40>>2]=0;c[f>>2]=c[m+16>>2];c[f+4>>2]=c[m+16+4>>2];c[f+8>>2]=c[m+16+8>>2];c[f+12>>2]=c[m+16+12>>2];c[f+16>>2]=c[m+16+16>>2];c[f+20>>2]=c[m+16+20>>2];c[f+24>>2]=c[m+16+24>>2];c[f+28>>2]=c[m+16+28>>2];Pe(b+4|0,c[b+4>>2]|0,f);c[b+16>>2]=(c[b+16>>2]|0)+1;c[k+48>>2]=f;j=b+84+(c[b+104>>2]<<2)|0;c[i>>2]=0;c[h>>2]=c[j>>2];f=c[j>>2]|0;if(f|0)c[f+52>>2]=k;c[j>>2]=k;if(a[b+153>>0]|0){l=m;return k|0}c[m>>2]=9248;c[m+4>>2]=b;c[m+8>>2]=k;Bf(c[b+4>>2]|0,m+16|0,m);Bf(c[b+44>>2]|0,m+16|0,m);l=m;return k|0}function Zf(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=+h;var i=0,j=0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0;C=l;l=l+96|0;n=+g[e+4>>2];o=+g[e+20>>2];p=+g[e+36>>2];q=+g[e+8>>2];r=+g[e+24>>2];s=+g[e+40>>2];t=+g[e+12>>2];u=+g[e+28>>2];v=+g[e+44>>2];w=-+g[e+52>>2];x=-+g[e+56>>2];y=-+g[e+60>>2];k=c[b+780>>2]|0;z=+g[k+(d*104|0)+8>>2];A=+g[k+(d*104|0)+12>>2];B=+g[k+(d*104|0)+16>>2];a:do if(f){f=c[b+328>>2]|0;b:do if((f|0)>0){j=c[b+336>>2]|0;i=0;while(1){if((c[j+(i<<2)>>2]|0)==(e|0))break;i=i+1|0;if((i|0)>=(f|0))break b}if((i|0)!=(f|0)){f=k;break a}}while(0);if((f|0)==(c[b+332>>2]|0)?(m=f|0?f<<1:1,(f|0)<(m|0)):0){if(!m)j=0;else{c[6995]=(c[6995]|0)+1;f=sc((m<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=f;f=c[b+328>>2]|0}if((f|0)>0){i=0;do{c[j+(i<<2)>>2]=c[(c[b+336>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(f|0))}i=c[b+336>>2]|0;if(i){if(a[b+340>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);f=c[b+328>>2]|0}c[b+336>>2]=0}a[b+340>>0]=1;c[b+336>>2]=j;c[b+332>>2]=m}c[(c[b+336>>2]|0)+(f<<2)>>2]=e;c[b+328>>2]=f+1;f=c[b+780>>2]|0}else f=k;while(0);c[C>>2]=f+(d*104|0);c[C+20>>2]=e;g[C+4>>2]=n*w+o*x+p*y+(n*z+o*A+p*B);g[C+8>>2]=q*w+r*x+s*y+(q*z+r*A+s*B);g[C+12>>2]=t*w+u*x+v*y+(t*z+u*A+v*B);g[C+16>>2]=0.0;e=f+(d*104|0)+100|0;a[e>>0]=a[e>>0]|1;g[C+24>>2]=h;Ln(b+848|0,C);l=C;return}function _f(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0,H=0.0,I=0;I=l;l=l+32|0;j=+g[b+16>>2];f=+g[b>>2];k=+g[b+20>>2];h=+g[b+4>>2];n=+g[b+24>>2];i=+g[b+8>>2];r=+g[b+32>>2];v=+g[b+36>>2];w=+g[b+40>>2];B=(k-h)*(w-i)-(n-i)*(v-h);C=(n-i)*(r-f)-(j-f)*(w-i);E=(j-f)*(v-h)-(k-h)*(r-f);g[I+16>>2]=B;g[I+16+4>>2]=C;g[I+16+8>>2]=E;g[I+16+12>>2]=0.0;o=+g[a+4>>2];s=+g[a+8>>2];x=+g[a+12>>2];F=B*o+C*s+E*x-(f*B+h*C+i*E);p=+g[a+20>>2];t=+g[a+24>>2];y=+g[a+28>>2];if(F*(B*p+C*t+E*y-(f*B+h*C+i*E))>=0.0){l=I;return}G=c[a+36>>2]|0;if(F<=0.0&(G&1|0)!=0){l=I;return}H=F/(F-(B*p+C*t+E*y-(f*B+h*C+i*E)));if(!(H<+g[a+40>>2])){l=I;return}A=(B*B+C*C+E*E)*-9.999999747378752e-05;z=f-(p*H+o*(1.0-H));u=h-(t*H+s*(1.0-H));q=i-(y*H+x*(1.0-H));m=j-(p*H+o*(1.0-H));k=k-(t*H+s*(1.0-H));j=n-(y*H+x*(1.0-H));if(!(E*(z*k-u*m)+(B*(u*j-q*k)+C*(q*m-z*j))>=A)){l=I;return}i=r-(p*H+o*(1.0-H));h=v-(t*H+s*(1.0-H));f=w-(y*H+x*(1.0-H));if(!(E*(m*h-k*i)+(B*(k*f-j*h)+C*(j*i-m*f))>=A)){l=I;return}if(!(E*(u*i-z*h)+(B*(q*h-u*f)+C*(z*f-q*i))>=A)){l=I;return}f=1.0/+D(+(B*B+C*C+E*E));g[I+16>>2]=B*f;g[I+16+4>>2]=C*f;g[I+16+8>>2]=E*f;b=c[(c[a>>2]|0)+12>>2]|0;if(F<=0.0&(G&2|0)==0){g[I>>2]=-(B*f);g[I+4>>2]=-(C*f);g[I+8>>2]=-(E*f);g[I+12>>2]=0.0;g[a+40>>2]=+pb[b&3](a,I,H,d,e);l=I;return}else{g[a+40>>2]=+pb[b&3](a,I+16|0,H,d,e);l=I;return}}function $f(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0;k=l;l=l+144|0;i=c[b+12>>2]|0;if(!i){l=k;return}n=c[d+4>>2]|0;m=c[e+4>>2]|0;c[h+4>>2]=i;g[k+12+128>>2]=999999984306749440.0;i=c[d+12>>2]|0;c[k+12>>2]=c[i>>2];c[k+12+4>>2]=c[i+4>>2];c[k+12+8>>2]=c[i+8>>2];c[k+12+12>>2]=c[i+12>>2];c[k+12+16>>2]=c[i+16>>2];c[k+12+16+4>>2]=c[i+16+4>>2];c[k+12+16+8>>2]=c[i+16+8>>2];c[k+12+16+12>>2]=c[i+16+12>>2];c[k+12+32>>2]=c[i+32>>2];c[k+12+32+4>>2]=c[i+32+4>>2];c[k+12+32+8>>2]=c[i+32+8>>2];c[k+12+32+12>>2]=c[i+32+12>>2];c[k+12+48>>2]=c[i+48>>2];c[k+12+48+4>>2]=c[i+48+4>>2];c[k+12+48+8>>2]=c[i+48+8>>2];c[k+12+48+12>>2]=c[i+48+12>>2];i=c[e+12>>2]|0;c[k+12+64>>2]=c[i>>2];c[k+12+64+4>>2]=c[i+4>>2];c[k+12+64+8>>2]=c[i+8>>2];c[k+12+64+12>>2]=c[i+12>>2];c[k+12+80>>2]=c[i+16>>2];c[k+12+80+4>>2]=c[i+16+4>>2];c[k+12+80+8>>2]=c[i+16+8>>2];c[k+12+80+12>>2]=c[i+16+12>>2];c[k+12+96>>2]=c[i+32>>2];c[k+12+96+4>>2]=c[i+32+4>>2];c[k+12+96+8>>2]=c[i+32+8>>2];c[k+12+96+12>>2]=c[i+32+12>>2];c[k+12+112>>2]=c[i+48>>2];c[k+12+112+4>>2]=c[i+48+4>>2];c[k+12+112+8>>2]=c[i+48+8>>2];c[k+12+112+12>>2]=c[i+48+12>>2];c[k>>2]=9628;c[k+4>>2]=n;c[k+8>>2]=m;pc(k,k+12|0,h,c[f+20>>2]|0,0);do if(a[b+8>>0]|0?(j=c[h+4>>2]|0,c[j+780>>2]|0):0){d=c[j+772>>2]|0;e=c[(c[h+8>>2]|0)+8>>2]|0;b=c[(c[h+12>>2]|0)+8>>2]|0;if((d|0)==(e|0)){af(j,d+4|0,b+4|0);break}else{af(j,b+4|0,e+4|0);break}}while(0);l=k;return}function ag(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0;f=qt()|0;Ij(f,4,b);c[f>>2]=4996;c[f+552>>2]=c[d>>2];c[f+552+4>>2]=c[d+4>>2];c[f+552+8>>2]=c[d+8>>2];c[f+552+12>>2]=c[d+12>>2];c[f+568>>2]=c[d+16>>2];c[f+568+4>>2]=c[d+16+4>>2];c[f+568+8>>2]=c[d+16+8>>2];c[f+568+12>>2]=c[d+16+12>>2];c[f+584>>2]=c[d+32>>2];c[f+584+4>>2]=c[d+32+4>>2];c[f+584+8>>2]=c[d+32+8>>2];c[f+584+12>>2]=c[d+32+12>>2];c[f+600>>2]=c[d+48>>2];c[f+600+4>>2]=c[d+48+4>>2];c[f+600+8>>2]=c[d+48+8>>2];c[f+600+12>>2]=c[d+48+12>>2];c[f+616>>2]=c[d>>2];c[f+616+4>>2]=c[d+4>>2];c[f+616+8>>2]=c[d+8>>2];c[f+616+12>>2]=c[d+12>>2];c[f+632>>2]=c[d+16>>2];c[f+632+4>>2]=c[d+16+4>>2];c[f+632+8>>2]=c[d+16+8>>2];c[f+632+12>>2]=c[d+16+12>>2];c[f+648>>2]=c[d+32>>2];c[f+648+4>>2]=c[d+32+4>>2];c[f+648+8>>2]=c[d+32+8>>2];c[f+648+12>>2]=c[d+32+12>>2];c[f+664>>2]=c[d+48>>2];c[f+664+4>>2]=c[d+48+4>>2];c[f+664+8>>2]=c[d+48+8>>2];c[f+664+12>>2]=c[d+48+12>>2];g[f+688>>2]=0.0;g[f+692>>2]=-1.0;g[f+696>>2]=.8999999761581421;g[f+700>>2]=.30000001192092896;g[f+704>>2]=1.0;g[f+708>>2]=0.0;g[f+712>>2]=0.0;a[f+716>>0]=0;a[f+736>>0]=0;a[f+737>>0]=0;a[f+738>>0]=0;a[f+739>>0]=1;a[f+740>>0]=e&1;c[f+748>>2]=0;c[f+748+4>>2]=0;c[f+748+8>>2]=0;c[f+748+12>>2]=0;c[f+748+16>>2]=0;d=c[f+28>>2]|0;l=+g[f+600>>2];k=+g[f+604>>2];j=+g[f+608>>2];i=l*+g[d+20>>2]+k*+g[d+24>>2]+j*+g[d+28>>2]+ +g[d+56>>2];h=l*+g[d+36>>2]+k*+g[d+40>>2]+j*+g[d+44>>2]+ +g[d+60>>2];g[f+664>>2]=l*+g[d+4>>2]+k*+g[d+8>>2]+j*+g[d+12>>2]+ +g[d+52>>2];g[f+668>>2]=i;g[f+672>>2]=h;g[f+676>>2]=0.0;g[f+732>>2]=e?-1.0:1.0;return f|0}function bg(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0;q=l;l=l+48|0;if((f|0)==(d|0)|((d|0)==(e|0)|(e|0)==(f|0))){l=q;return}k=q;m=k+36|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(m|0));if(!h)o=c[c[b+940>>2]>>2]|0;else o=h;h=c[b+812>>2]|0;if((h|0)==(c[b+816>>2]|0)?(p=h|0?h<<1:1,(h|0)<(p|0)):0){if(!p)n=0;else{c[6995]=(c[6995]|0)+1;h=sc((p*44|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}n=h;h=c[b+812>>2]|0}if((h|0)>0){i=0;do{k=n+(i*44|0)|0;j=(c[b+820>>2]|0)+(i*44|0)|0;m=k+44|0;do{c[k>>2]=c[j>>2];k=k+4|0;j=j+4|0}while((k|0)<(m|0));i=i+1|0}while((i|0)!=(h|0))}h=c[b+820>>2]|0;if(h|0){if(a[b+824>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+820>>2]=0}a[b+824>>0]=1;c[b+820>>2]=n;c[b+816>>2]=p;h=c[b+812>>2]|0}k=c[b+820>>2]|0;c[k+(h*44|0)>>2]=0;c[k+(h*44|0)+4>>2]=o;k=k+(h*44|0)+8|0;j=q;m=k+36|0;do{c[k>>2]=c[j>>2];k=k+4|0;j=j+4|0}while((k|0)<(m|0));p=c[b+812>>2]|0;c[b+812>>2]=p+1;o=c[b+820>>2]|0;k=c[b+780>>2]|0;c[o+(p*44|0)+8>>2]=k+(d*104|0);m=c[b+780>>2]|0;c[o+(p*44|0)+12>>2]=m+(e*104|0);n=c[b+780>>2]|0;c[o+(p*44|0)+16>>2]=n+(f*104|0);t=+g[k+(d*104|0)+8>>2];v=+g[k+(d*104|0)+12>>2];r=+g[k+(d*104|0)+16>>2];s=+g[m+(e*104|0)+8>>2]-t;w=+g[m+(e*104|0)+12>>2]-v;u=+g[m+(e*104|0)+16>>2]-r;t=+g[n+(f*104|0)+8>>2]-t;v=+g[n+(f*104|0)+12>>2]-v;r=+g[n+(f*104|0)+16>>2]-r;g[o+(p*44|0)+36>>2]=+D(+((s*v-w*t)*(s*v-w*t)+((w*r-u*v)*(w*r-u*v)+(u*t-s*r)*(u*t-s*r))));a[b+984>>0]=1;l=q;return}function cg(b,d,e,f,h,i,j,k,m){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0,r=0;r=l;l=l+80|0;g[r+16+60>>2]=0.0;g[r+16+8>>2]=0.0;g[r+16+12>>2]=.10000000149011612;g[r+16+16>>2]=300.0;g[r+16>>2]=1.0;g[r+16+4>>2]=-1.0;g[r+16+28>>2]=0.0;g[r+16+32>>2]=.20000000298023224;g[r+16+36>>2]=0.0;g[r+16+40>>2]=0.0;g[r+16+20>>2]=1.0;g[r+16+24>>2]=.5;c[r+16+56>>2]=0;g[r+16+48>>2]=0.0;a[r+16+44>>0]=0;p=0;do{o=c[b+856+(p<<2)>>2]|0;n=a[b+788+p>>0]|0;if(!o){if(n<<24>>24){n=1;q=5}}else q=5;if((q|0)==5){q=0;g[r+16+40>>2]=0.0;c[r+16+56>>2]=o;c[r+16+52>>2]=c[b+840+(p<<2)>>2];c[r+16+48>>2]=c[b+824+(p<<2)>>2];c[r+16+20>>2]=c[b+732>>2];a[r+16+44>>0]=n;c[r+16+4>>2]=c[b+696+(p<<2)>>2];c[r+16+24>>2]=c[b+728>>2];c[r+16>>2]=c[b+680+(p<<2)>>2];g[r+16+16>>2]=0.0;c[r+16+12>>2]=c[b+808+(p<<2)>>2];c[r+16+8>>2]=c[b+792+(p<<2)>>2];c[r>>2]=c[b+1064+(p<<2)>>2];c[r+4>>2]=c[b+1080+(p<<2)>>2];c[r+8>>2]=c[b+1096+(p<<2)>>2];g[r+12>>2]=0.0;o=c[b+1304>>2]>>p*3;if(!(o&1))n=c[d+32>>2]|0;else n=b+740+(p<<2)|0;c[r+16+28>>2]=c[n>>2];if(!(o&2))n=c[d+32>>2]|0;else n=b+772+(p<<2)|0;c[r+16+36>>2]=c[n>>2];c[r+16+32>>2]=c[((o&4|0)==0?d+4|0:b+756+(p<<2)|0)>>2];if(a[b+1301>>0]|0){o=p+1|0;if(!(c[b+868+(((o|0)==3?0:o)<<6)+56>>2]|0))n=1;else n=(c[b+868+(((p+2|0)%3|0)<<6)+56>>2]|0)==0&1}else n=0;e=(Hd(b,r+16|0,f,h,i,j,k,m,d,e,r,0,n)|0)+e|0}p=p+1|0}while((p|0)!=3);l=r;return e|0}function dg(b,d){b=b|0;d=+d;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0;e=c[b+248>>2]|0;if((e|0)<=0)return;q=0;do{p=c[(c[b+256>>2]|0)+(q<<2)>>2]|0;if(!(c[p+204>>2]&3)){m=+g[p+504>>2];f=+E(+(1.0-m),+d);i=f*+g[p+372>>2];g[p+372>>2]=i;h=f*+g[p+376>>2];g[p+376>>2]=h;f=f*+g[p+380>>2];g[p+380>>2]=f;o=+g[p+508>>2];l=+E(+(1.0-o),+d);j=l*+g[p+388>>2];g[p+388>>2]=j;k=l*+g[p+392>>2];g[p+392>>2]=k;l=l*+g[p+396>>2];g[p+396>>2]=l;do if(a[p+512>>0]|0){if(l*l+(j*j+k*k)<+g[p+524>>2]?i*i+h*h+f*f<+g[p+520>>2]:0){r=+g[p+516>>2];g[p+388>>2]=j*r;g[p+392>>2]=r*k;g[p+396>>2]=r*l;g[p+372>>2]=r*i;g[p+376>>2]=r*h;g[p+380>>2]=r*f;i=r*i;h=r*h;f=r*f;n=j*r;k=r*k;l=r*l}else n=j;j=+D(+(i*i+h*h+f*f));do if(j.004999999888241291){i=i-i*(1.0/j)*.004999999888241291;g[p+372>>2]=i;h=h-h*(1.0/j)*.004999999888241291;g[p+376>>2]=h;f=f-f*(1.0/j)*.004999999888241291;g[p+380>>2]=f;break}else{c[p+372>>2]=0;c[p+372+4>>2]=0;c[p+372+8>>2]=0;c[p+372+12>>2]=0;i=0.0;h=0.0;f=0.0;break}while(0);j=+D(+(n*n+k*k+l*l));if(j.004999999888241291){g[p+388>>2]=n-n*(1.0/j)*.004999999888241291;g[p+392>>2]=k-k*(1.0/j)*.004999999888241291;g[p+396>>2]=l-l*(1.0/j)*.004999999888241291;break}else{c[p+388>>2]=0;c[p+388+4>>2]=0;c[p+388+8>>2]=0;c[p+388+12>>2]=0;break}}while(0);Af(p+4|0,i,h,f,p+388|0,d,p+68|0);e=c[b+248>>2]|0}q=q+1|0}while((q|0)<(e|0));return}function eg(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;e=qt()|0;Ij(e,4,b);c[e>>2]=4996;c[e+552>>2]=c[d>>2];c[e+552+4>>2]=c[d+4>>2];c[e+552+8>>2]=c[d+8>>2];c[e+552+12>>2]=c[d+12>>2];c[e+568>>2]=c[d+16>>2];c[e+568+4>>2]=c[d+16+4>>2];c[e+568+8>>2]=c[d+16+8>>2];c[e+568+12>>2]=c[d+16+12>>2];c[e+584>>2]=c[d+32>>2];c[e+584+4>>2]=c[d+32+4>>2];c[e+584+8>>2]=c[d+32+8>>2];c[e+584+12>>2]=c[d+32+12>>2];c[e+600>>2]=c[d+48>>2];c[e+600+4>>2]=c[d+48+4>>2];c[e+600+8>>2]=c[d+48+8>>2];c[e+600+12>>2]=c[d+48+12>>2];c[e+616>>2]=c[d>>2];c[e+616+4>>2]=c[d+4>>2];c[e+616+8>>2]=c[d+8>>2];c[e+616+12>>2]=c[d+12>>2];c[e+632>>2]=c[d+16>>2];c[e+632+4>>2]=c[d+16+4>>2];c[e+632+8>>2]=c[d+16+8>>2];c[e+632+12>>2]=c[d+16+12>>2];c[e+648>>2]=c[d+32>>2];c[e+648+4>>2]=c[d+32+4>>2];c[e+648+8>>2]=c[d+32+8>>2];c[e+648+12>>2]=c[d+32+12>>2];c[e+664>>2]=c[d+48>>2];c[e+664+4>>2]=c[d+48+4>>2];c[e+664+8>>2]=c[d+48+8>>2];c[e+664+12>>2]=c[d+48+12>>2];g[e+688>>2]=0.0;g[e+692>>2]=-1.0;g[e+696>>2]=.8999999761581421;g[e+700>>2]=.30000001192092896;g[e+704>>2]=1.0;g[e+708>>2]=0.0;g[e+712>>2]=0.0;a[e+716>>0]=0;a[e+736>>0]=0;a[e+737>>0]=0;a[e+738>>0]=0;a[e+739>>0]=1;a[e+740>>0]=0;c[e+748>>2]=0;c[e+748+4>>2]=0;c[e+748+8>>2]=0;c[e+748+12>>2]=0;c[e+748+16>>2]=0;d=c[e+28>>2]|0;k=+g[e+600>>2];j=+g[e+604>>2];i=+g[e+608>>2];h=k*+g[d+20>>2]+j*+g[d+24>>2]+i*+g[d+28>>2]+ +g[d+56>>2];f=k*+g[d+36>>2]+j*+g[d+40>>2]+i*+g[d+44>>2]+ +g[d+60>>2];g[e+664>>2]=k*+g[d+4>>2]+j*+g[d+8>>2]+i*+g[d+12>>2]+ +g[d+52>>2];g[e+668>>2]=h;g[e+672>>2]=f;g[e+676>>2]=0.0;g[e+732>>2]=1.0;return e|0}function fg(a,b,c,d,e,f,h,i,j,k,l){a=a|0;b=b|0;c=+c;d=+d;e=+e;f=+f;h=h|0;i=i|0;j=j|0;k=k|0;l=+l;var m=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0;x=+g[j+(h<<2)>>2];y=+g[j+16+(h<<2)>>2];w=+g[j+32+(h<<2)>>2];o=+g[k+(i<<2)>>2];q=+g[k+16+(i<<2)>>2];s=+g[k+32+(i<<2)>>2];t=+g[k+48>>2]-+g[j+48>>2];u=+g[k+52>>2]-+g[j+52>>2];v=+g[k+56>>2]-+g[j+56>>2];m=1.0-(x*o+y*q+w*s)*(x*o+y*q+w*s);if(!(m==0.0)){m=(x*t+y*u+w*v-(x*o+y*q+w*s)*(o*t+q*u+s*v))/m;if(!(m<-c)){if(m>c){m=c;p=4}}else{m=-c;p=4}}else{m=0.0;p=4}n=(x*o+y*q+w*s)*m-(o*t+q*u+s*v);if(n<-e){m=(x*o+y*q+w*s)*-e+(x*t+y*u+w*v);if(!(m<-c))if(m>c){n=-e;m=c}else n=-e;else{n=-e;m=-c}}else if(n>e){m=(x*o+y*q+w*s)*e+(x*t+y*u+w*v);if(!(m<-c))if(m>c){n=e;m=c}else n=e;else{n=e;m=-c}}r=o*n;q=q*n;o=s*n;e=r+(t-x*m);n=q+(u-y*m);m=o+(v-w*m);c=+D(+(m*m+(e*e+n*n)));if(c-d-f>l)return +(c-d-f);do if(m*m+(e*e+n*n)<=1.4210854715202004e-14)if(+C(+w)>.7071067690849304){m=1.0/+D(+(y*y+w*w));g[a>>2]=0.0;g[a+4>>2]=-(w*m);i=a+4|0;j=a;m=y*m;h=2;break}else{m=1.0/+D(+(x*x+y*y));g[a>>2]=-(y*m);g[a+4>>2]=x*m;i=a+4|0;j=a;m=0.0;h=2;break}else{g[a>>2]=e*-(1.0/c);g[a+4>>2]=n*-(1.0/c);g[a+8>>2]=m*-(1.0/c);i=a+4|0;j=a;m=0.0;h=3}while(0);g[a+(h<<2)>>2]=m;x=q+ +g[k+52>>2]+ +g[i>>2]*f;y=o+ +g[k+56>>2]+ +g[a+8>>2]*f;g[b>>2]=r+ +g[k+48>>2]+ +g[j>>2]*f;g[b+4>>2]=x;g[b+8>>2]=y;g[b+12>>2]=0.0;return +(c-d-f)}function gg(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;i=c[b+28>>2]|0;j=c[b+32>>2]|0;if(!(a[b+1301>>0]|0)){h=0;e=cg(b,d,0,i+4|0,j+4|0,i+372|0,j+372|0,i+388|0,j+388|0)|0;do{f=b+868+(h<<6)|0;if(!((c[b+868+(h<<6)+56>>2]|0)==0?(a[b+868+(h<<6)+44>>0]|0)==0:0)){g=b+1208+(h<<4)|0;c[k>>2]=c[g>>2];c[k+4>>2]=c[g+4>>2];c[k+8>>2]=c[g+8>>2];c[k+12>>2]=c[g+12>>2];g=c[b+1304>>2]>>(h*3|0)+9;if(!(g&1))c[b+868+(h<<6)+28>>2]=c[c[d+32>>2]>>2];if(!(g&2))c[b+868+(h<<6)+36>>2]=c[c[d+32>>2]>>2];if(!(g&4))c[b+868+(h<<6)+32>>2]=c[d+4>>2];e=(Hd(b,f,i+4|0,j+4|0,i+372|0,j+372|0,i+388|0,j+388|0,d,e,k,1,0)|0)+e|0}h=h+1|0}while((h|0)!=3);l=k;return}h=0;e=0;do{f=b+868+(h<<6)|0;if(!((c[b+868+(h<<6)+56>>2]|0)==0?(a[b+868+(h<<6)+44>>0]|0)==0:0)){g=b+1208+(h<<4)|0;c[k>>2]=c[g>>2];c[k+4>>2]=c[g+4>>2];c[k+8>>2]=c[g+8>>2];c[k+12>>2]=c[g+12>>2];g=c[b+1304>>2]>>(h*3|0)+9;if(!(g&1))c[b+868+(h<<6)+28>>2]=c[c[d+32>>2]>>2];if(!(g&2))c[b+868+(h<<6)+36>>2]=c[c[d+32>>2]>>2];if(!(g&4))c[b+868+(h<<6)+32>>2]=c[d+4>>2];e=(Hd(b,f,i+4|0,j+4|0,i+372|0,j+372|0,i+388|0,j+388|0,d,e,k,1,0)|0)+e|0}h=h+1|0}while((h|0)!=3);cg(b,d,e,i+4|0,j+4|0,i+372|0,j+372|0,i+388|0,j+388|0)|0;l=k;return}function hg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=c[a+56>>2]|0;if(!e){e=c[a+52>>2]|0;if(!e){c[6995]=(c[6995]|0)+1;e=sc(31)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[a+60>>2]|0;c[e+4>>2]=f;g=e+8|0;c[g>>2]=0;c[6995]=(c[6995]|0)+1;f=sc((f*24|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}c[e>>2]=f;c[g>>2]=c[a+48>>2];c[a+48>>2]=e}else c[a+52>>2]=c[e+8>>2];h=c[e>>2]|0;g=c[e+4>>2]|0;if((g|0)>0){e=0;f=h;do{e=e+1|0;i=f;f=f+24|0;c[i>>2]=(e|0)<(g|0)?f:0}while((e|0)!=(g|0))}}else h=e;c[a+56>>2]=c[h>>2];c[h>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;c[h+16>>2]=0;c[h+20>>2]=0;e=c[a+56>>2]|0;if(!e){e=c[a+52>>2]|0;if(!e){c[6995]=(c[6995]|0)+1;e=sc(31)|0;if(!e)f=0;else{c[(e+4+15&-16)+-4>>2]=e;f=e+4+15&-16}e=c[a+60>>2]|0;c[f+4>>2]=e;g=f+8|0;c[g>>2]=0;c[6995]=(c[6995]|0)+1;e=sc((e*24|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[f>>2]=e;c[g>>2]=c[a+48>>2];c[a+48>>2]=f}else{c[a+52>>2]=c[e+8>>2];f=e}e=c[f>>2]|0;i=c[f+4>>2]|0;if((i|0)>0){f=0;g=e;do{f=f+1|0;j=g;g=g+24|0;c[j>>2]=(f|0)<(i|0)?g:0}while((f|0)!=(i|0))}}c[a+56>>2]=c[e>>2];j=e;c[j>>2]=0;c[j+4>>2]=0;c[h+8>>2]=e;c[e+8>>2]=h;j=c[a+100>>2]|0;c[h+20>>2]=j;c[e+20>>2]=j;c[h+12>>2]=d;c[e+12>>2]=b;c[h+16>>2]=0;c[e+16>>2]=0;e=c[a+116>>2]|0;c[a+116>>2]=e+1;if((e|0)<(c[a+120>>2]|0))return h|0;c[a+120>>2]=e+1;return h|0}function ig(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0;c[b+4>>2]=1065353216;c[b+8>>2]=1065353216;c[b+12>>2]=1065353216;g[b+16>>2]=0.0;a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;c[b+48>>2]=0;c[b>>2]=8796;a[b+100>>0]=1;c[b+96>>2]=0;c[b+88>>2]=0;c[b+92>>2]=0;a[b+120>>0]=1;c[b+116>>2]=0;c[b+108>>2]=0;c[b+112>>2]=0;a[b+140>>0]=1;c[b+136>>2]=0;c[b+128>>2]=0;c[b+132>>2]=0;a[b+160>>0]=1;c[b+156>>2]=0;c[b+148>>2]=0;c[b+152>>2]=0;a[b+164>>0]=d&1;a[b+165>>0]=e&1;g[b+168>>2]=0.0;c[6995]=(c[6995]|0)+1;d=sc(51)|0;if(!d)f=0;else{c[(d+4+15&-16)+-4>>2]=d;f=d+4+15&-16}e=c[b+24>>2]|0;if((e|0)>0){d=0;do{h=f+(d<<5)|0;i=(c[b+32>>2]|0)+(d<<5)|0;c[h>>2]=c[i>>2];c[h+4>>2]=c[i+4>>2];c[h+8>>2]=c[i+8>>2];c[h+12>>2]=c[i+12>>2];c[h+16>>2]=c[i+16>>2];c[h+20>>2]=c[i+20>>2];c[h+24>>2]=c[i+24>>2];c[h+28>>2]=c[i+28>>2];d=d+1|0}while((d|0)!=(e|0))}d=c[b+32>>2]|0;if(d|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=f;c[b+28>>2]=1;i=c[b+24>>2]|0;c[f+(i<<5)>>2]=0;c[f+(i<<5)+4>>2]=0;c[f+(i<<5)+8>>2]=12;c[f+(i<<5)+12>>2]=0;c[f+(i<<5)+16>>2]=0;c[f+(i<<5)+20>>2]=16;c[f+(i<<5)+24>>2]=2;c[f+(i<<5)+28>>2]=0;c[b+24>>2]=(c[b+24>>2]|0)+1;i=(a[b+164>>0]|0)==0;d=c[b+32>>2]|0;c[d>>2]=(c[(i?b+148|0:b+128|0)>>2]|0)/3|0;c[d+4>>2]=0;c[d+24>>2]=i?3:2;c[d+8>>2]=i?6:12;if(!(a[b+165>>0]|0)){h=12;b=(c[b+108>>2]|0)/3|0;i=d+12|0;c[i>>2]=b;i=d+16|0;c[i>>2]=0;i=d+20|0;c[i>>2]=h;return}else{h=16;b=c[b+88>>2]|0;i=d+12|0;c[i>>2]=b;i=d+16|0;c[i>>2]=0;i=d+20|0;c[i>>2]=h;return}}function jg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0;f=l;l=l+112|0;h=c[a+28>>2]|0;x=+g[d>>2];D=+g[h>>2];w=+g[d+16>>2];C=+g[h+4>>2];v=+g[d+32>>2];B=+g[h+8>>2];u=+g[d+4>>2];t=+g[d+20>>2];s=+g[d+36>>2];r=+g[d+8>>2];p=+g[d+24>>2];n=+g[d+40>>2];A=+g[h+16>>2];z=+g[h+20>>2];y=+g[h+24>>2];q=+g[h+32>>2];o=+g[h+36>>2];m=+g[h+40>>2];F=+g[d+48>>2];E=+g[d+52>>2];i=+g[d+56>>2];k=+g[h+48>>2]+(D*F+C*E+B*i);j=A*F+z*E+y*i+ +g[h+52>>2];i=q*F+o*E+m*i+ +g[h+56>>2];g[f+48>>2]=x*D+w*C+v*B;g[f+48+4>>2]=D*u+C*t+B*s;g[f+48+8>>2]=D*r+C*p+B*n;g[f+48+12>>2]=0.0;g[f+48+16>>2]=x*A+w*z+v*y;g[f+48+20>>2]=u*A+t*z+s*y;g[f+48+24>>2]=r*A+p*z+n*y;g[f+48+28>>2]=0.0;g[f+48+32>>2]=x*q+w*o+v*m;g[f+48+36>>2]=u*q+t*o+s*m;g[f+48+40>>2]=r*q+p*o+n*m;g[f+48+44>>2]=0.0;g[f+48+48>>2]=k;g[f+48+52>>2]=j;g[f+48+56>>2]=i;g[f+48+60>>2]=0.0;h=c[a+32>>2]|0;g[f+24+4>>2]=1.0;c[f+24+8>>2]=1;c[f+24+12>>2]=-1;c[f+24>>2]=6260;c[f+24+16>>2]=h;c[f+24+20>>2]=b;c[f+24+4>>2]=c[h+4>>2];h=c[a+4>>2]|0;d=c[h+8>>2]|0;c[f>>2]=h;c[f+4>>2]=e;c[f+8>>2]=d;c[f+12>>2]=f+48;c[f+16>>2]=-1;c[f+20>>2]=b;vc(c[a+8>>2]|0,c[a+12>>2]|0,c[a+16>>2]|0,f,f+24|0,+g[a+20>>2]);l=f;return}function kg(){var b=0,d=0,e=0;b=Us(348)|0;c[b>>2]=5320;c[b+132>>2]=0;c[b+132+4>>2]=0;c[b+132+8>>2]=0;c[b+132+12>>2]=0;c[b+132+16>>2]=0;c[b+132+20>>2]=0;c[b+132+24>>2]=0;c[b+132+28>>2]=0;c[b+164>>2]=1065353216;c[b+168>>2]=1065353216;c[b+172>>2]=1065353216;g[b+176>>2]=0.0;c[b+180>>2]=0;g[b+184>>2]=999999984306749440.0;c[b+188>>2]=0;c[b+188+4>>2]=0;c[b+188+8>>2]=0;c[b+188+12>>2]=0;c[b+204>>2]=1;c[b+208>>2]=-1;c[b+212>>2]=-1;c[b+216>>2]=-1;c[b+220>>2]=1;g[b+224>>2]=0.0;g[b+228>>2]=.5;g[b+232>>2]=0.0;g[b+236>>2]=0.0;g[b+240>>2]=0.0;g[b+244>>2]=.10000000149011612;g[b+248>>2]=1.0e4;c[b+256>>2]=0;c[b+260>>2]=-1;c[b+264>>2]=-1;g[b+268>>2]=1.0;g[b+272>>2]=0.0;g[b+276>>2]=0.0;c[b+280>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;c[b+304>>2]=0;c[b+4>>2]=1065353216;c[b+8>>2]=0;c[b+8+4>>2]=0;c[b+8+8>>2]=0;c[b+8+12>>2]=0;c[b+24>>2]=1065353216;c[b+28>>2]=0;c[b+28+4>>2]=0;c[b+28+8>>2]=0;c[b+28+12>>2]=0;c[b+44>>2]=1065353216;c[b+48>>2]=0;c[b+48+4>>2]=0;c[b+48+8>>2]=0;c[b+48+12>>2]=0;c[b+48+16>>2]=0;c[b+68>>2]=1065353216;c[b+72>>2]=0;c[b+72+4>>2]=0;c[b+72+8>>2]=0;c[b+72+12>>2]=0;c[b+88>>2]=1065353216;c[b+92>>2]=0;c[b+92+4>>2]=0;c[b+92+8>>2]=0;c[b+92+12>>2]=0;c[b+108>>2]=1065353216;c[b+112>>2]=0;c[b+112+4>>2]=0;c[b+112+8>>2]=0;c[b+112+12>>2]=0;c[b+112+16>>2]=0;a[b+340>>0]=1;c[b+336>>2]=0;c[b+328>>2]=0;c[b+332>>2]=0;c[b+252>>2]=4;c[b>>2]=5400;c[6995]=(c[6995]|0)+1;d=sc(91)|0;if(!d){e=0;Li(e);d=b+344|0;c[d>>2]=e;return b|0}c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16;Li(d);e=b+344|0;c[e>>2]=d;return b|0}function lg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,m=0,n=0;k=l;l=l+16|0;c[b+8>>2]=0;c[b+12>>2]=-1;c[b+16>>2]=1065353216;c[b+20>>2]=1065353216;c[b+24>>2]=1065353216;g[b+28>>2]=0.0;g[b+48>>2]=.03999999910593033;c[b+56>>2]=0;c[b+60>>2]=1065353216;c[b+64>>2]=1065353216;c[b+68>>2]=1065353216;g[b+72>>2]=0.0;c[b+76>>2]=-1082130432;c[b+80>>2]=-1082130432;c[b+84>>2]=-1082130432;g[b+88>>2]=0.0;a[b+92>>0]=0;c[b>>2]=7604;a[b+112>>0]=1;c[b+108>>2]=0;c[b+100>>2]=0;c[b+104>>2]=0;c[b+4>>2]=4;if((e|0)<=0){c[b+100>>2]=e;uj(b);l=k;return}c[6995]=(c[6995]|0)+1;h=sc((e<<4|3)+16|0)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}i=c[b+100>>2]|0;if((i|0)>0){h=0;do{m=j+(h<<4)|0;n=(c[b+108>>2]|0)+(h<<4)|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];h=h+1|0}while((h|0)!=(i|0))}h=c[b+108>>2]|0;if(h|0){if(a[b+112>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+108>>2]=0}a[b+112>>0]=1;c[b+108>>2]=j;c[b+104>>2]=e;c[j>>2]=c[k>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];if((e|0)!=1){h=1;do{n=(c[b+108>>2]|0)+(h<<4)|0;c[n>>2]=c[k>>2];c[n+4>>2]=c[k+4>>2];c[n+8>>2]=c[k+8>>2];c[n+12>>2]=c[k+12>>2];h=h+1|0}while((h|0)!=(e|0))}c[b+100>>2]=e;h=0;while(1){j=c[d+4>>2]|0;m=c[d+8>>2]|0;n=c[b+108>>2]|0;c[n+(h<<4)>>2]=c[d>>2];c[n+(h<<4)+4>>2]=j;c[n+(h<<4)+8>>2]=m;g[n+(h<<4)+12>>2]=0.0;h=h+1|0;if((h|0)==(e|0))break;else d=d+f|0}uj(b);l=k;return}function mg(a,b,d,e,f,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0;s=l;l=l+48|0;q=+g[d>>2];p=+g[d+4>>2];r=+g[d+8>>2];j=q*+g[b+4>>2]+p*+g[b+20>>2]+r*+g[b+36>>2];k=q*+g[b+8>>2]+p*+g[b+24>>2]+r*+g[b+40>>2];g[s+32>>2]=+g[b>>2]*q+ +g[b+16>>2]*p+ +g[b+32>>2]*r;g[s+32+4>>2]=j;g[s+32+8>>2]=k;g[s+32+12>>2]=0.0;Sb[c[(c[a>>2]|0)+64>>2]&127](s+16|0,a,s+32|0);k=+g[s+16>>2];j=+g[s+16+4>>2];r=+g[s+16+8>>2];p=k*+g[b>>2]+j*+g[b+4>>2]+r*+g[b+8>>2]+ +g[b+48>>2];q=k*+g[b+16>>2]+j*+g[b+20>>2]+r*+g[b+24>>2]+ +g[b+52>>2];r=k*+g[b+32>>2]+j*+g[b+36>>2]+r*+g[b+40>>2]+ +g[b+56>>2];t=c[(c[a>>2]|0)+64>>2]|0;j=-+g[s+32+4>>2];k=-+g[s+32+8>>2];g[s>>2]=-+g[s+32>>2];g[s+4>>2]=j;g[s+8>>2]=k;g[s+12>>2]=0.0;Sb[t&127](s+16|0,a,s);k=+g[s+16>>2];j=+g[s+16+4>>2];m=+g[s+16+8>>2];n=k*+g[b>>2]+j*+g[b+4>>2]+m*+g[b+8>>2]+ +g[b+48>>2];o=k*+g[b+16>>2]+j*+g[b+20>>2]+m*+g[b+24>>2]+ +g[b+52>>2];m=k*+g[b+32>>2]+j*+g[b+36>>2]+m*+g[b+40>>2]+ +g[b+56>>2];g[e>>2]=p*+g[d>>2]+q*+g[d+4>>2]+r*+g[d+8>>2];g[f>>2]=n*+g[d>>2]+o*+g[d+4>>2]+m*+g[d+8>>2];g[i>>2]=n;g[i+4>>2]=o;g[i+8>>2]=m;g[i+12>>2]=0.0;g[h>>2]=p;g[h+4>>2]=q;g[h+8>>2]=r;g[h+12>>2]=0.0;j=+g[e>>2];k=+g[f>>2];if(!(j>k)){l=s;return}g[e>>2]=k;g[f>>2]=j;g[i>>2]=p;g[i+4>>2]=q;g[i+8>>2]=r;g[i+12>>2]=0.0;g[h>>2]=n;g[h+4>>2]=o;g[h+8>>2]=m;g[h+12>>2]=0.0;l=s;return}function ng(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+32|0;if((b|0)<0)b=c[a+12>>2]|0;d=c[a>>2]|0;if(!((b|0)>0&(d|0)!=0)){l=n;return}while(1){e=d+40|0;if(c[e>>2]|0){m=0;while(1){g=d+32|0;h=c[g>>2]|0;if(h>>>0>d>>>0){i=(c[h+40>>2]|0)==(d|0)&1;j=c[h+36+((i^1)<<2)>>2]|0;k=c[h+32>>2]|0;if(!k)f=a;else f=k+36+(((c[k+40>>2]|0)==(h|0)&1)<<2)|0;c[f>>2]=d;c[j+32>>2]=d;c[h+32>>2]=d;c[g>>2]=k;k=d+36|0;c[h+36>>2]=c[k>>2];c[h+40>>2]=c[e>>2];c[(c[k>>2]|0)+32>>2]=h;c[(c[e>>2]|0)+32>>2]=h;c[d+36+(i<<2)>>2]=h;c[d+36+((i^1)<<2)>>2]=j;c[n>>2]=c[h>>2];c[n+4>>2]=c[h+4>>2];c[n+8>>2]=c[h+8>>2];c[n+12>>2]=c[h+12>>2];c[n+16>>2]=c[h+16>>2];c[n+20>>2]=c[h+20>>2];c[n+24>>2]=c[h+24>>2];c[n+28>>2]=c[h+28>>2];c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];c[h+16>>2]=c[d+16>>2];c[h+20>>2]=c[d+20>>2];c[h+24>>2]=c[d+24>>2];c[h+28>>2]=c[d+28>>2];c[d>>2]=c[n>>2];c[d+4>>2]=c[n+4>>2];c[d+8>>2]=c[n+8>>2];c[d+12>>2]=c[n+12>>2];c[d+16>>2]=c[n+16>>2];c[d+20>>2]=c[n+20>>2];c[d+24>>2]=c[n+24>>2];c[d+28>>2]=c[n+28>>2];d=h}d=c[d+36+(((c[a+16>>2]|0)>>>m&1)<<2)>>2]|0;e=d+40|0;if(!(c[e>>2]|0))break;else m=m+1&31}}if(!(Ag(a,d)|0))e=0;else e=c[a>>2]|0;Pe(a,e,d);c[a+16>>2]=(c[a+16>>2]|0)+1;b=b+-1|0;if(!b)break;d=c[a>>2]|0}l=n;return}function og(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,D=0.0,E=0.0;i=l;l=l+32|0;d=a[b+8>>0]|0?d:e;if(((c[(c[d+4>>2]|0)+4>>2]|0)+-21|0)>>>0>=9){l=i;return}e=c[(c[d+8>>2]|0)+192>>2]|0;y=+nb[c[(c[e>>2]|0)+48>>2]&15](e);c[b+64>>2]=f;g[b+68>>2]=y+.05999999865889549;c[b+56>>2]=h;h=c[b+16>>2]|0;Sb[c[(c[h>>2]|0)+28>>2]&127](h,i+16|0,i);y=+g[i>>2];x=+g[i+16>>2];w=+g[i+4>>2];v=+g[i+16+4>>2];u=+g[i+8>>2];t=+g[i+16+8>>2];h=c[d+12>>2]|0;B=+g[h>>2];o=+g[h+16>>2];D=+g[h+32>>2];z=+g[h+4>>2];m=+g[h+20>>2];A=+g[h+36>>2];q=+g[h+8>>2];j=+g[h+24>>2];r=+g[h+40>>2];E=-+g[h+48>>2];s=-+g[h+52>>2];k=-+g[h+56>>2];p=(y+x)*.5*B+(w+v)*.5*o+(u+t)*.5*D+(B*E+o*s+D*k);n=(y+x)*.5*z+(w+v)*.5*m+(u+t)*.5*A+(z*E+m*s+A*k);k=(y+x)*.5*q+(w+v)*.5*j+(u+t)*.5*r+(q*E+j*s+r*k);s=+g[b+68>>2];o=((y-x)*.5+s)*+C(+(B+o*0.0+D*0.0))+((w-v)*.5+s)*+C(+(B*0.0+o+D*0.0))+((u-t)*.5+s)*+C(+(D+(B*0.0+o*0.0)));m=((y-x)*.5+s)*+C(+(z+m*0.0+A*0.0))+((w-v)*.5+s)*+C(+(z*0.0+m+A*0.0))+((u-t)*.5+s)*+C(+(A+(z*0.0+m*0.0)));j=((y-x)*.5+s)*+C(+(q+j*0.0+r*0.0))+((w-v)*.5+s)*+C(+(q*0.0+j+r*0.0))+((u-t)*.5+s)*+C(+(r+(q*0.0+j*0.0)));g[b+24>>2]=p-o;g[b+28>>2]=n-m;g[b+32>>2]=k-j;g[b+36>>2]=0.0;g[b+40>>2]=p+o;g[b+44>>2]=n+m;g[b+48>>2]=k+j;g[b+52>>2]=0.0;Vb[c[(c[e>>2]|0)+64>>2]&127](e,b+12|0,b+24|0,b+40|0);l=i;return}function pg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0.0,z=0.0;x=l;l=l+48|0;u=+g[e>>2];v=+g[d>>2];w=+g[e+4>>2];t=+g[d+4>>2];s=+g[e+8>>2];n=+g[d+8>>2];o=+D(+((u-v)*.5*(u-v)*.5+(w-t)*.5*(w-t)*.5+(s-n)*.5*(s-n)*.5));p=+g[a+60>>2];d=+C(+p)>.7071067690849304;q=+g[a+56>>2];if(d){m=1.0/+D(+(p*p+q*q));r=+g[a+52>>2];f=r*-(p*m);h=(p*p+q*q)*m;i=0.0;j=-(r*q*m);k=-(p*m);m=q*m}else{r=+g[a+52>>2];k=1.0/+D(+(r*r+q*q));f=(r*r+q*q)*k;h=-(p*r*k);i=-(q*k);j=p*-(q*k);k=r*k;m=0.0}y=(u+v)*.5*r+(w+t)*.5*q+(s+n)*.5*p-+g[a+68>>2];z=(u+v)*.5-r*y;i=o*i;r=o*k;v=o*m;k=o*h;m=o*j;u=o*f;g[x>>2]=k+(i+z);g[x+4>>2]=m+(r+((w+t)*.5-q*y));g[x+8>>2]=u+(v+((s+n)*.5-p*y));g[x+12>>2]=0.0;g[x+16>>2]=i+z-k;g[x+20>>2]=r+((w+t)*.5-q*y)-m;g[x+24>>2]=v+((s+n)*.5-p*y)-u;g[x+28>>2]=0.0;g[x+32>>2]=z-i-k;g[x+36>>2]=(w+t)*.5-q*y-r-m;g[x+40>>2]=(s+n)*.5-p*y-v-u;g[x+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,x,0,0);g[x>>2]=z-i-k;g[x+4>>2]=(w+t)*.5-q*y-r-m;g[x+8>>2]=(s+n)*.5-p*y-v-u;g[x+12>>2]=0.0;g[x+16>>2]=k+(z-i);g[x+20>>2]=m+((w+t)*.5-q*y-r);g[x+24>>2]=u+((s+n)*.5-p*y-v);g[x+28>>2]=0.0;g[x+32>>2]=k+(i+z);g[x+36>>2]=m+(r+((w+t)*.5-q*y));g[x+40>>2]=u+(v+((s+n)*.5-p*y));g[x+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,x,0,1);l=x;return}function qg(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;if(!(a[d+164>>0]|0)){f=c[d+148>>2]|0;if((f|0)==(c[d+152>>2]|0)?(k=f|0?f<<1:1,(f|0)<(k|0)):0){if(!k)i=0;else{c[6995]=(c[6995]|0)+1;f=sc((k<<1)+19|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=f;f=c[d+148>>2]|0}h=c[d+156>>2]|0;if((f|0)<=0)if(!h)f=d+160|0;else g=27;else{g=0;do{b[i+(g<<1)>>1]=b[h+(g<<1)>>1]|0;g=g+1|0}while((g|0)!=(f|0));g=27}if((g|0)==27){if(a[d+160>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[d+156>>2]=0;f=d+160|0}a[f>>0]=1;c[d+156>>2]=i;c[d+152>>2]=k;f=c[d+148>>2]|0}b[(c[d+156>>2]|0)+(f<<1)>>1]=e;c[d+148>>2]=f+1;k=d+156|0;k=c[k>>2]|0;e=d+32|0;e=c[e>>2]|0;e=e+4|0;c[e>>2]=k;return}else{f=c[d+128>>2]|0;if((f|0)==(c[d+132>>2]|0)?(j=f|0?f<<1:1,(f|0)<(j|0)):0){if(!j)i=0;else{c[6995]=(c[6995]|0)+1;f=sc((j<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=f;f=c[d+128>>2]|0}h=c[d+136>>2]|0;if((f|0)<=0)if(!h)f=d+140|0;else g=12;else{g=0;do{c[i+(g<<2)>>2]=c[h+(g<<2)>>2];g=g+1|0}while((g|0)!=(f|0));g=12}if((g|0)==12){if(a[d+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[d+136>>2]=0;f=d+140|0}a[f>>0]=1;c[d+136>>2]=i;c[d+132>>2]=j;f=c[d+128>>2]|0}c[(c[d+136>>2]|0)+(f<<2)>>2]=e;c[d+128>>2]=(c[d+128>>2]|0)+1;k=d+136|0;k=c[k>>2]|0;e=d+32|0;e=c[e>>2]|0;e=e+4|0;c[e>>2]=k;return}}function rg(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;ce(b,d);c[b>>2]=3244;c[6995]=(c[6995]|0)+1;e=sc(27)|0;i=e+4+15&-16;c[i+-4>>2]=e;a[i+4>>0]=0;c[(e+4+15&-16)>>2]=3276;c[b+88>>2]=i;c[6995]=(c[6995]|0)+1;i=sc(27)|0;e=i+4+15&-16;c[e+-4>>2]=i;a[e+4>>0]=0;c[(i+4+15&-16)>>2]=3296;c[b+92>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[e>>2]=3296;c[b+96>>2]=e;a[e+4>>0]=1;c[6995]=(c[6995]|0)+1;i=sc(27)|0;e=i+4+15&-16;c[e+-4>>2]=i;a[e+4>>0]=0;c[(i+4+15&-16)>>2]=3316;c[b+100>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[e>>2]=3336;c[b+104>>2]=e;a[e+4>>0]=1;if(!(a[b+20>>0]|0))return;e=c[b+16>>2]|0;if(!e)return;if((c[e>>2]|0)>=156)return;f=c[e+16>>2]|0;if(f){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);e=c[b+16>>2]|0;if(!e)i=b+16|0;else{f=b+16|0;g=11}}else{f=b+16|0;g=11}if((g|0)==11){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);i=f}c[6995]=(c[6995]|0)+1;e=sc(43)|0;if(!e)h=0;else{c[(e+4+15&-16)+-4>>2]=e;h=e+4+15&-16}e=c[d+12>>2]|0;c[h>>2]=156;f=h+4|0;c[f>>2]=e;c[h+20>>2]=0;c[6995]=(c[6995]|0)+1;e=sc((e*156|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[h+16>>2]=e;c[h+12>>2]=e;f=c[f>>2]|0;c[h+8>>2]=f;if(f+-1|0){b=c[h>>2]|0;g=e;d=f+-1|0;do{j=g;g=g+b|0;c[j>>2]=g;d=d+-1|0}while((d|0)!=0);e=e+(P(b,f+-1|0)|0)|0}c[e>>2]=0;c[i>>2]=h;return}function sg(a,b,e){a=a|0;b=b|0;e=e|0;bf(a,b,e)|0;c[b+264>>2]=c[a+324>>2];c[b+268>>2]=c[a+328>>2];c[b+272>>2]=c[a+332>>2];c[b+276>>2]=c[a+336>>2];c[b+280>>2]=c[a+340>>2];c[b+284>>2]=c[a+344>>2];c[b+288>>2]=c[a+348>>2];c[b+292>>2]=c[a+352>>2];c[b+296>>2]=c[a+356>>2];c[b+300>>2]=c[a+360>>2];c[b+304>>2]=c[a+364>>2];c[b+308>>2]=c[a+368>>2];c[b+312>>2]=c[a+372>>2];c[b+316>>2]=c[a+376>>2];c[b+320>>2]=c[a+380>>2];c[b+324>>2]=c[a+384>>2];c[b+328>>2]=c[a+388>>2];c[b+332>>2]=c[a+392>>2];c[b+336>>2]=c[a+396>>2];c[b+340>>2]=c[a+400>>2];c[b+456>>2]=c[a+404>>2];c[b+344>>2]=c[a+604>>2];c[b+348>>2]=c[a+608>>2];c[b+352>>2]=c[a+612>>2];c[b+356>>2]=c[a+616>>2];c[b+360>>2]=c[a+408>>2];c[b+364>>2]=c[a+412>>2];c[b+368>>2]=c[a+416>>2];c[b+372>>2]=c[a+420>>2];c[b+376>>2]=c[a+424>>2];c[b+380>>2]=c[a+428>>2];c[b+384>>2]=c[a+432>>2];c[b+388>>2]=c[a+436>>2];c[b+392>>2]=c[a+440>>2];c[b+396>>2]=c[a+444>>2];c[b+400>>2]=c[a+448>>2];c[b+404>>2]=c[a+452>>2];c[b+408>>2]=c[a+456>>2];c[b+412>>2]=c[a+460>>2];c[b+416>>2]=c[a+464>>2];c[b+420>>2]=c[a+468>>2];c[b+424>>2]=c[a+472>>2];c[b+428>>2]=c[a+476>>2];c[b+432>>2]=c[a+480>>2];c[b+436>>2]=c[a+484>>2];c[b+440>>2]=c[a+488>>2];c[b+444>>2]=c[a+492>>2];c[b+448>>2]=c[a+496>>2];c[b+452>>2]=c[a+500>>2];c[b+460>>2]=c[a+504>>2];c[b+464>>2]=c[a+508>>2];c[b+492>>2]=d[a+512>>0];c[b+468>>2]=c[a+516>>2];c[b+472>>2]=c[a+520>>2];c[b+476>>2]=c[a+524>>2];c[b+480>>2]=c[a+528>>2];c[b+484>>2]=c[a+532>>2];c[b+488>>2]=c[a+536>>2];return 12085}function tg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0.0,j=0.0,k=0,l=0,m=0.0;c[6131]=(c[6131]|0)+1;if(!(c[b+4>>2]&2))j=.019999999552965164;else{k=c[d+192>>2]|0;i=+ob[c[(c[k>>2]|0)+20>>2]&1](k,.019999999552965164);k=c[e+192>>2]|0;j=+ob[c[(c[k>>2]|0)+20>>2]&1](k,.019999999552965164);j=i>2];i=+g[e+184>>2];i=m>2]|0;h=c[f+12>>2]|0;if(!h){if(c[b+4>>2]&4|0){b=0;return b|0}c[6995]=(c[6995]|0)+1;f=sc(823)|0;if(!f)k=0;else{c[(f+4+15&-16)+-4>>2]=f;k=f+4+15&-16}}else{c[f+12>>2]=c[h>>2];c[f+8>>2]=(c[f+8>>2]|0)+-1;k=h}c[k>>2]=1025;f=k+120|0;h=f+44|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(h|0));f=k+312|0;h=f+44|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(h|0));f=k+504|0;h=f+44|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(h|0));f=k+696|0;h=f+44|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(h|0));c[k+772>>2]=d;c[k+776>>2]=e;c[k+780>>2]=0;g[k+784>>2]=j;g[k+788>>2]=i;e=k;f=c[b+12>>2]|0;c[k+800>>2]=f;if((f|0)==(c[b+16>>2]|0)?(l=f|0?f<<1:1,(f|0)<(l|0)):0){if(!l)d=0;else{c[6995]=(c[6995]|0)+1;f=sc((l<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}d=f;f=c[b+12>>2]|0}if((f|0)>0){h=0;do{c[d+(h<<2)>>2]=c[(c[b+20>>2]|0)+(h<<2)>>2];h=h+1|0}while((h|0)!=(f|0))}h=c[b+20>>2]|0;if(h){if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);f=c[b+12>>2]|0}c[b+20>>2]=0}a[b+24>>0]=1;c[b+20>>2]=d;c[b+16>>2]=l}c[(c[b+20>>2]|0)+(f<<2)>>2]=e;c[b+12>>2]=f+1;b=k;return b|0}function ug(b,d,e,f,h,i,k,l,m){b=b|0;d=d|0;e=e|0;f=+f;h=+h;i=+i;k=k|0;l=l|0;m=m|0;var n=0,o=0.0,p=0.0,q=0.0,r=0.0;n=at()|0;c[n+8>>2]=0;c[n+12>>2]=-1;g[n+16>>2]=0.0;c[n>>2]=8404;c[n+4>>2]=24;c[n+68>>2]=b;c[n+72>>2]=d;g[n+76>>2]=h;g[n+80>>2]=i;g[n+84>>2]=+(b+-1|0);g[n+88>>2]=+(d+-1|0);g[n+92>>2]=f;c[n+96>>2]=e;c[n+100>>2]=l;a[n+104>>0]=m&1;a[n+105>>0]=0;a[n+106>>0]=0;c[n+108>>2]=k;c[n+112>>2]=1065353216;c[n+116>>2]=1065353216;c[n+120>>2]=1065353216;g[n+124>>2]=0.0;switch(k|0){case 0:{g[n+20>>2]=h;c[n+24>>2]=0;b=n+88|0;d=n+84|0;e=n+80|0;f=0.0;i=0.0;break}case 1:{c[n+20>>2]=0;g[n+24>>2]=h;b=n+88|0;d=n+80|0;e=n+84|0;f=0.0;i=h;h=0.0;break}case 2:{c[n+20>>2]=0;c[n+24>>2]=0;b=n+80|0;d=n+88|0;e=n+84|0;f=h;i=0.0;h=0.0;break}default:{q=+g[n+36>>2];h=+g[n+20>>2];p=+g[n+40>>2];f=+g[n+24>>2];o=+g[n+44>>2];i=+g[n+28>>2];h=q+h;f=p+f;i=o+i;h=h*.5;f=f*.5;i=i*.5;m=n+52|0;g[m>>2]=h;m=n+56|0;g[m>>2]=f;m=n+60|0;g[m>>2]=i;m=n+64|0;g[m>>2]=0.0;return n|0}}g[n+28>>2]=f;g[n+32>>2]=0.0;k=c[e>>2]|0;c[n+36>>2]=k;l=c[d>>2]|0;c[n+40>>2]=l;m=c[b>>2]|0;c[n+44>>2]=m;g[n+48>>2]=0.0;r=(c[j>>2]=k,+g[j>>2]);p=(c[j>>2]=l,+g[j>>2]);o=h;h=p;p=i;i=(c[j>>2]=m,+g[j>>2]);q=f;o=r+o;p=h+p;q=i+q;o=o*.5;p=p*.5;q=q*.5;m=n+52|0;g[m>>2]=o;m=n+56|0;g[m>>2]=p;m=n+60|0;g[m>>2]=q;m=n+64|0;g[m>>2]=0.0;return n|0}function vg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;Ib[c[(c[b>>2]|0)+32>>2]&511](b);e=Bb[c[(c[b>>2]|0)+16>>2]&63](b,104,1)|0;d=c[e+8>>2]|0;f=d;g=f+104|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));c[d+88>>2]=c[a+264>>2];c[d+92>>2]=c[a+268>>2];c[d+96>>2]=c[a+272>>2];c[d+100>>2]=c[a+276>>2];c[d>>2]=c[a+92>>2];c[d+4>>2]=c[a+96>>2];c[d+8>>2]=c[a+100>>2];c[d+12>>2]=c[a+104>>2];c[d+16>>2]=c[a+108>>2];c[d+20>>2]=c[a+116>>2];c[d+24>>2]=c[a+120>>2];c[d+28>>2]=c[a+124>>2];c[d+32>>2]=c[a+128>>2];c[d+36>>2]=c[a+132>>2];c[d+40>>2]=c[a+148>>2];c[d+44>>2]=c[a+152>>2];c[d+48>>2]=c[a+156>>2];c[d+52>>2]=c[a+160>>2];c[d+56>>2]=c[a+176>>2];c[d+60>>2]=c[a+180>>2];c[d+64>>2]=c[a+112>>2];c[d+68>>2]=c[a+164>>2];c[d+72>>2]=c[a+168>>2];c[d+76>>2]=c[a+172>>2];c[d+80>>2]=c[a+144>>2];c[d+84>>2]=0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,12157,1145853764,d);d=c[a+8>>2]|0;if((d|0)<=0){dj(a,b);id(a,b);a=c[b>>2]|0;a=a+36|0;a=c[a>>2]|0;Ib[a&511](b);return}f=0;do{e=c[(c[a+16>>2]|0)+(f<<2)>>2]|0;if(c[e+252>>2]&8){g=xb[c[(c[e>>2]|0)+16>>2]&127](e)|0;g=Bb[c[(c[b>>2]|0)+16>>2]&63](b,g,1)|0;d=Bb[c[(c[e>>2]|0)+20>>2]&63](e,c[g+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,g,d,1497645651,e);d=c[a+8>>2]|0}f=f+1|0}while((f|0)<(d|0));dj(a,b);id(a,b);a=c[b>>2]|0;a=a+36|0;a=c[a>>2]|0;Ib[a&511](b);return}function wg(b,d,e,f){b=b|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;l=c[d>>2]|0;l=zb[c[(c[l>>2]|0)+56>>2]&31](l,116)|0;ul(l,d,e,f,0);c[l>>2]=6576;a[l+104>>0]=1;c[l+100>>2]=0;c[l+92>>2]=0;c[l+96>>2]=0;c[6995]=(c[6995]|0)+1;b=sc(83)|0;if(!b)h=0;else{c[(b+4+15&-16)+-4>>2]=b;h=b+4+15&-16}c[h>>2]=9668;i=h+20|0;a[i>>0]=1;j=h+16|0;c[j>>2]=0;d=h+8|0;c[d>>2]=0;k=h+12|0;c[k>>2]=0;a[h+40>>0]=1;c[h+36>>2]=0;c[h+28>>2]=0;c[h+32>>2]=0;a[h+60>>0]=1;c[h+56>>2]=0;c[h+48>>2]=0;c[h+52>>2]=0;c[6995]=(c[6995]|0)+1;b=sc(43)|0;if(!b)g=0;else{c[(b+4+15&-16)+-4>>2]=b;g=b+4+15&-16}d=c[d>>2]|0;if((d|0)>0){b=0;do{m=g+(b*12|0)|0;n=(c[j>>2]|0)+(b*12|0)|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];b=b+1|0}while((b|0)!=(d|0))}b=c[j>>2]|0;if(!b){a[i>>0]=1;c[j>>2]=g;c[k>>2]=2;Nf(h);n=l+84|0;c[n>>2]=h;n=e+4|0;n=c[n>>2]|0;n=n+72|0;n=c[n>>2]|0;m=l+108|0;c[m>>2]=n;m=f+4|0;m=c[m>>2]|0;m=m+72|0;m=c[m>>2]|0;n=l+112|0;c[n>>2]=m;return l|0}if(a[i>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0)}c[j>>2]=0;a[i>>0]=1;c[j>>2]=g;c[k>>2]=2;Nf(h);n=l+84|0;c[n>>2]=h;n=e+4|0;n=c[n>>2]|0;n=n+72|0;n=c[n>>2]|0;m=l+108|0;c[m>>2]=n;m=f+4|0;m=c[m>>2]|0;m=m+72|0;m=c[m>>2]|0;n=l+112|0;c[n>>2]=m;return l|0}function xg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;g=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=g;if(g|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;g=c[a+52>>2]|0;Bb[c[(c[g>>2]|0)+56>>2]&63](g,b+12|0,d)|0;c[b+52>>2]=c[a+16>>2];do if((c[a+56>>2]|0)!=0?((xb[c[(c[d>>2]|0)+52>>2]&127](d)|0)&1|0)==0:0){e=zb[c[(c[d>>2]|0)+24>>2]&31](d,c[a+56>>2]|0)|0;if(!e){c[b+40>>2]=zb[c[(c[d>>2]|0)+28>>2]&31](d,c[a+56>>2]|0)|0;c[b+44>>2]=0;e=c[a+56>>2]|0;e=xb[c[(c[e>>2]|0)+12>>2]&127](e)|0;e=Bb[c[(c[d>>2]|0)+16>>2]&63](d,e,1)|0;g=c[a+56>>2]|0;g=Bb[c[(c[g>>2]|0)+16>>2]&63](g,c[e+8>>2]|0,d)|0;Zb[c[(c[d>>2]|0)+20>>2]&31](d,e,g,1213612625,c[a+56>>2]|0);break}else{c[b+40>>2]=e;c[b+44>>2]=0;break}}else f=8;while(0);if((f|0)==8){c[b+40>>2]=0;c[b+44>>2]=0}if(c[a+60>>2]|0?((xb[c[(c[d>>2]|0)+52>>2]&127](d)|0)&2|0)==0:0){e=zb[c[(c[d>>2]|0)+24>>2]&31](d,c[a+60>>2]|0)|0;if(!e){c[b+48>>2]=zb[c[(c[d>>2]|0)+28>>2]&31](d,c[a+60>>2]|0)|0;f=c[a+60>>2]|0;f=xb[c[(c[f>>2]|0)+8>>2]&127](f)|0;f=Bb[c[(c[d>>2]|0)+16>>2]&63](d,f,1)|0;g=c[a+60>>2]|0;g=Bb[c[(c[g>>2]|0)+12>>2]&63](g,c[f+8>>2]|0,d)|0;Zb[c[(c[d>>2]|0)+20>>2]&31](d,f,g,1346456916,c[a+60>>2]|0);g=b+56|0;c[g>>2]=0;return 16561}else{c[b+48>>2]=e;g=b+56|0;c[g>>2]=0;return 16561}}c[b+48>>2]=0;g=b+56|0;c[g>>2]=0;return 16561}function yg(a,b){a=a|0;b=+b;var d=0,e=0,f=0,h=0,i=0.0,j=0.0,k=0.0;h=l;l=l+32|0;d=c[a+8>>2]|0;if((d|0)<=0){l=h;return}f=0;do{e=c[(c[a+16>>2]|0)+(f<<2)>>2]|0;if((!((e|0)==0?1:(c[e+252>>2]&2|0)==0)?(c[e+220>>2]|0)!=2:0)?!(b==0.0?1:(c[e+204>>2]&2|0)==0):0){d=c[e+540>>2]|0;if(!d)d=e+4|0;else{Ob[c[(c[d>>2]|0)+8>>2]&127](d,e+4|0);d=e+4|0}j=1.0/b*(+g[e+56>>2]-+g[e+120>>2]);k=1.0/b*(+g[e+60>>2]-+g[e+124>>2]);g[e+372>>2]=1.0/b*(+g[e+52>>2]-+g[e+116>>2]);g[e+376>>2]=j;g[e+380>>2]=k;g[e+384>>2]=0.0;If(e+68|0,d,h+8|0,h);k=+g[h>>2];j=1.0/b*k*+g[h+8+4>>2];i=1.0/b*k*+g[h+8+8>>2];g[e+388>>2]=1.0/b*+g[h+8>>2]*k;g[e+392>>2]=j;g[e+396>>2]=i;g[e+400>>2]=0.0;c[e+132>>2]=c[e+372>>2];c[e+132+4>>2]=c[e+372+4>>2];c[e+132+8>>2]=c[e+372+8>>2];c[e+132+12>>2]=c[e+372+12>>2];c[e+148>>2]=c[e+388>>2];c[e+148+4>>2]=c[e+388+4>>2];c[e+148+8>>2]=c[e+388+8>>2];c[e+148+12>>2]=c[e+388+12>>2];c[e+68>>2]=c[d>>2];c[e+68+4>>2]=c[d+4>>2];c[e+68+8>>2]=c[d+8>>2];c[e+68+12>>2]=c[d+12>>2];c[e+84>>2]=c[e+20>>2];c[e+84+4>>2]=c[e+20+4>>2];c[e+84+8>>2]=c[e+20+8>>2];c[e+84+12>>2]=c[e+20+12>>2];c[e+100>>2]=c[e+36>>2];c[e+100+4>>2]=c[e+36+4>>2];c[e+100+8>>2]=c[e+36+8>>2];c[e+100+12>>2]=c[e+36+12>>2];c[e+116>>2]=c[e+52>>2];c[e+116+4>>2]=c[e+52+4>>2];c[e+116+8>>2]=c[e+52+8>>2];c[e+116+12>>2]=c[e+52+12>>2];d=c[a+8>>2]|0}f=f+1|0}while((f|0)<(d|0));l=h;return}function zg(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0;i=qt()|0;c[i+4>>2]=4;c[i+8>>2]=-1;c[i+12>>2]=-1;g[i+16>>2]=3402823466385288598117041.0e14;a[i+20>>0]=1;a[i+21>>0]=0;c[i+24>>2]=-1;c[i+28>>2]=b;c[i+32>>2]=d;g[i+36>>2]=0.0;g[i+40>>2]=.05000000074505806;c[i+44>>2]=0;c[i>>2]=4996;c[i+552>>2]=c[e>>2];c[i+552+4>>2]=c[e+4>>2];c[i+552+8>>2]=c[e+8>>2];c[i+552+12>>2]=c[e+12>>2];c[i+568>>2]=c[e+16>>2];c[i+568+4>>2]=c[e+16+4>>2];c[i+568+8>>2]=c[e+16+8>>2];c[i+568+12>>2]=c[e+16+12>>2];c[i+584>>2]=c[e+32>>2];c[i+584+4>>2]=c[e+32+4>>2];c[i+584+8>>2]=c[e+32+8>>2];c[i+584+12>>2]=c[e+32+12>>2];c[i+600>>2]=c[e+48>>2];c[i+600+4>>2]=c[e+48+4>>2];c[i+600+8>>2]=c[e+48+8>>2];c[i+600+12>>2]=c[e+48+12>>2];c[i+616>>2]=c[f>>2];c[i+616+4>>2]=c[f+4>>2];c[i+616+8>>2]=c[f+8>>2];c[i+616+12>>2]=c[f+12>>2];c[i+632>>2]=c[f+16>>2];c[i+632+4>>2]=c[f+16+4>>2];c[i+632+8>>2]=c[f+16+8>>2];c[i+632+12>>2]=c[f+16+12>>2];c[i+648>>2]=c[f+32>>2];c[i+648+4>>2]=c[f+32+4>>2];c[i+648+8>>2]=c[f+32+8>>2];c[i+648+12>>2]=c[f+32+12>>2];c[i+664>>2]=c[f+48>>2];c[i+664+4>>2]=c[f+48+4>>2];c[i+664+8>>2]=c[f+48+8>>2];c[i+664+12>>2]=c[f+48+12>>2];g[i+688>>2]=0.0;g[i+692>>2]=-1.0;g[i+696>>2]=.8999999761581421;g[i+700>>2]=.30000001192092896;g[i+704>>2]=1.0;g[i+708>>2]=0.0;g[i+712>>2]=0.0;a[i+716>>0]=0;a[i+736>>0]=0;a[i+737>>0]=0;a[i+738>>0]=0;a[i+739>>0]=1;a[i+740>>0]=h&1;c[i+748>>2]=0;c[i+748+4>>2]=0;c[i+748+8>>2]=0;c[i+748+12>>2]=0;c[i+748+16>>2]=0;g[i+732>>2]=h?-1.0:1.0;return i|0}function Ag(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,h=0.0,i=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;if((c[a>>2]|0)==(b|0)){c[a>>2]=0;a=0;return a|0}e=c[b+32>>2]|0;d=c[e+32>>2]|0;b=c[e+36+(((c[e+40>>2]|0)!=(b|0)&1)<<2)>>2]|0;a:do if(!d){c[a>>2]=b;c[b+32>>2]=0;d=c[a+4>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[a+4>>2]=e}else{c[d+36+(((c[d+40>>2]|0)==(e|0)&1)<<2)>>2]=b;c[b+32>>2]=d;b=c[a+4>>2]|0;if(b|0){c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0)}c[a+4>>2]=e;while(1){n=+g[d>>2];r=d+4|0;p=+g[r>>2];w=d+8|0;o=+g[w>>2];e=d+16|0;m=+g[e>>2];t=d+20|0;k=+g[t>>2];u=d+24|0;h=+g[u>>2];v=c[d+36>>2]|0;q=c[d+40>>2]|0;b=c[(+g[v>>2]<+g[q>>2]?v:q)>>2]|0;c[d>>2]=b;s=c[(+g[v+16>>2]>+g[q+16>>2]?v+16|0:q+16|0)>>2]|0;c[e>>2]=s;e=c[(+g[v+4>>2]<+g[q+4>>2]?v:q)+4>>2]|0;c[r>>2]=e;r=c[(+g[v+20>>2]>+g[q+20>>2]?v+16|0:q+16|0)+4>>2]|0;c[t>>2]=r;t=c[(+g[v+8>>2]<+g[q+8>>2]?v:q)+8>>2]|0;c[w>>2]=t;q=c[(+g[v+24>>2]>+g[q+24>>2]?v+16|0:q+16|0)+8>>2]|0;c[u>>2]=q;b=n!=(c[j>>2]=b,+g[j>>2]);n=(c[j>>2]=t,+g[j>>2]);l=(c[j>>2]=s,+g[j>>2]);i=(c[j>>2]=r,+g[j>>2]);f=(c[j>>2]=q,+g[j>>2]);if(!(b|p!=(c[j>>2]=e,+g[j>>2])|o!=n|m!=l|k!=i|h!=f))break;d=c[d+32>>2]|0;if(!d)break a}return d|0}while(0);w=c[a>>2]|0;return w|0}function Bg(a,b,d){a=a|0;b=+b;d=+d;var e=0,f=0,h=0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0.0,v=0.0,w=0,x=0.0,y=0.0,z=0.0,A=0.0;h=l;l=l+16|0;d=+g[a+396>>2]*b;b=+g[a+512>>2];f=c[a+852>>2]|0;if((f|0)<=0){l=h;return}e=0;do{t=c[a+860>>2]|0;j=t+(e*96|0)+20|0;w=c[j>>2]|0;o=c[t+(e*96|0)>>2]|0;z=+g[t+(e*96|0)+4>>2];y=+g[t+(e*96|0)+8>>2];x=+g[t+(e*96|0)+12>>2];i=t+(e*96|0)+76|0;v=+g[w+392>>2];q=+g[t+(e*96|0)+84>>2];A=+g[w+396>>2];m=+g[t+(e*96|0)+80>>2];k=+g[i>>2];n=+g[w+388>>2];s=+g[o+8>>2];r=+g[o+12>>2];p=+g[o+16>>2];u=d*(z*+g[w+4>>2]+y*+g[w+8>>2]+x*+g[w+12>>2]+ +g[w+52>>2]-s)+(b*(v*q-A*m+ +g[w+372>>2])-(s-+g[o+24>>2]));q=d*(z*+g[w+20>>2]+y*+g[w+24>>2]+x*+g[w+28>>2]+ +g[w+56>>2]-r)+(b*(+g[w+376>>2]+(A*k-q*n))-(r-+g[o+28>>2]));k=d*(z*+g[w+36>>2]+y*+g[w+40>>2]+x*+g[w+44>>2]+ +g[w+60>>2]-p)+(b*(m*n-v*k+ +g[w+380>>2])-(p-+g[o+32>>2]));v=+g[t+(e*96|0)+24>>2];n=(u*+g[t+(e*96|0)+28>>2]+q*+g[t+(e*96|0)+32>>2]+ +g[t+(e*96|0)+36>>2]*k)*v;m=(u*+g[t+(e*96|0)+44>>2]+q*+g[t+(e*96|0)+48>>2]+k*+g[t+(e*96|0)+52>>2])*v;k=v*(u*+g[t+(e*96|0)+60>>2]+q*+g[t+(e*96|0)+64>>2]+k*+g[t+(e*96|0)+68>>2]);q=+g[t+(e*96|0)+92>>2];g[o+8>>2]=s+n*q;g[o+12>>2]=q*m+r;g[o+16>>2]=q*k+p;j=c[j>>2]|0;g[h>>2]=-n;g[h+4>>2]=-m;g[h+8>>2]=-k;g[h+12>>2]=0.0;ll(j,h,i);e=e+1|0}while((e|0)!=(f|0));l=h;return}function Cg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0.0,j=0.0,k=0.0,m=0,n=0.0;m=l;l=l+688|0;c[m+568+8>>2]=0;c[m+568+12>>2]=-1;c[m+568+16>>2]=1065353216;c[m+568+20>>2]=1065353216;c[m+568+24>>2]=1065353216;g[m+568+28>>2]=0.0;c[m+568+56>>2]=0;c[m+568>>2]=3924;c[m+568+4>>2]=1;c[m+568+60>>2]=c[d>>2];c[m+568+60+4>>2]=c[d+4>>2];c[m+568+60+8>>2]=c[d+8>>2];c[m+568+60+12>>2]=c[d+12>>2];c[m+568+76>>2]=c[d+16>>2];c[m+568+76+4>>2]=c[d+16+4>>2];c[m+568+76+8>>2]=c[d+16+8>>2];c[m+568+76+12>>2]=c[d+16+12>>2];c[m+568+92>>2]=c[d+32>>2];c[m+568+92+4>>2]=c[d+32+4>>2];c[m+568+92+8>>2]=c[d+32+8>>2];c[m+568+92+12>>2]=c[d+32+12>>2];c[m+568+48>>2]=c[b+204>>2];g[m+208+308>>2]=9.999999747378752e-05;a[m+208+332>>0]=0;c[m+200>>2]=9464;d=c[b+4>>2]|0;c[m+176>>2]=9532;c[m+176+4>>2]=m+208;c[m+176+8>>2]=m+200;c[m+176+12>>2]=d;c[m+176+16>>2]=m+568;c[m+176+20>>2]=0;c[m>>2]=3896;c[m+168>>2]=0;g[m+164>>2]=1.0;c[m+172>>2]=c[b+208>>2];if((Wd(m+176|0,b+8|0,b+72|0,b+136|0,b+136|0,m)|0?(h=+g[m+132>>2],i=+g[m+136>>2],j=+g[m+140>>2],h*h+i*i+j*j>9.999999747378752e-05):0)?(k=+g[m+164>>2],k<+g[b+200>>2]):0){n=1.0/+D(+(h*h+i*i+j*j));g[m+132>>2]=h*n;g[m+136>>2]=i*n;g[m+140>>2]=j*n;+rb[c[(c[b>>2]|0)+12>>2]&3](b,m+132|0,m+148|0,k,e,f)}c[m+568>>2]=7472;b=c[m+568+56>>2]|0;if(!b){l=m;return}Ib[c[c[b>>2]>>2]&511](b);b=c[m+568+56>>2]|0;if(!b){l=m;return}c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);l=m;return}function Dg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0;h=qt()|0;c[h+4>>2]=4;c[h+8>>2]=-1;c[h+12>>2]=-1;g[h+16>>2]=3402823466385288598117041.0e14;a[h+20>>0]=1;a[h+21>>0]=0;c[h+24>>2]=-1;c[h+28>>2]=b;c[h+32>>2]=d;g[h+36>>2]=0.0;g[h+40>>2]=.05000000074505806;c[h+44>>2]=0;c[h>>2]=4996;c[h+552>>2]=c[e>>2];c[h+552+4>>2]=c[e+4>>2];c[h+552+8>>2]=c[e+8>>2];c[h+552+12>>2]=c[e+12>>2];c[h+568>>2]=c[e+16>>2];c[h+568+4>>2]=c[e+16+4>>2];c[h+568+8>>2]=c[e+16+8>>2];c[h+568+12>>2]=c[e+16+12>>2];c[h+584>>2]=c[e+32>>2];c[h+584+4>>2]=c[e+32+4>>2];c[h+584+8>>2]=c[e+32+8>>2];c[h+584+12>>2]=c[e+32+12>>2];c[h+600>>2]=c[e+48>>2];c[h+600+4>>2]=c[e+48+4>>2];c[h+600+8>>2]=c[e+48+8>>2];c[h+600+12>>2]=c[e+48+12>>2];c[h+616>>2]=c[f>>2];c[h+616+4>>2]=c[f+4>>2];c[h+616+8>>2]=c[f+8>>2];c[h+616+12>>2]=c[f+12>>2];c[h+632>>2]=c[f+16>>2];c[h+632+4>>2]=c[f+16+4>>2];c[h+632+8>>2]=c[f+16+8>>2];c[h+632+12>>2]=c[f+16+12>>2];c[h+648>>2]=c[f+32>>2];c[h+648+4>>2]=c[f+32+4>>2];c[h+648+8>>2]=c[f+32+8>>2];c[h+648+12>>2]=c[f+32+12>>2];c[h+664>>2]=c[f+48>>2];c[h+664+4>>2]=c[f+48+4>>2];c[h+664+8>>2]=c[f+48+8>>2];c[h+664+12>>2]=c[f+48+12>>2];g[h+688>>2]=0.0;g[h+692>>2]=-1.0;g[h+696>>2]=.8999999761581421;g[h+700>>2]=.30000001192092896;g[h+704>>2]=1.0;g[h+708>>2]=0.0;g[h+712>>2]=0.0;a[h+716>>0]=0;a[h+736>>0]=0;a[h+737>>0]=0;a[h+738>>0]=0;a[h+739>>0]=1;a[h+740>>0]=0;c[h+748>>2]=0;c[h+748+4>>2]=0;c[h+748+8>>2]=0;c[h+748+12>>2]=0;c[h+748+16>>2]=0;g[h+732>>2]=1.0;return h|0}function Eg(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,h=0,i=0.0,j=0,k=0.0,l=0,m=0.0,n=0.0,o=0,p=0.0;d=c[a+772>>2]|0;if((d|0)>0){b=0;do{l=(c[a+780>>2]|0)+(b*104|0)+72|0;b=b+1|0;c[l>>2]=0;c[l+4>>2]=0;c[l+8>>2]=0;c[l+12>>2]=0}while((b|0)!=(d|0))}d=c[a+812>>2]|0;if((d|0)>0){b=0;do{o=c[a+820>>2]|0;j=c[o+(b*44|0)+12>>2]|0;h=c[o+(b*44|0)+8>>2]|0;k=+g[h+8>>2];e=+g[j+8>>2]-k;f=+g[h+12>>2];i=+g[j+12>>2]-f;m=+g[h+16>>2];n=+g[j+16>>2]-m;l=c[o+(b*44|0)+16>>2]|0;k=+g[l+8>>2]-k;f=+g[l+12>>2]-f;m=+g[l+16>>2]-m;p=1.0/+D(+((e*f-i*k)*(e*f-i*k)+((i*m-n*f)*(i*m-n*f)+(n*k-e*m)*(n*k-e*m))));g[o+(b*44|0)+20>>2]=p*(i*m-n*f);g[o+(b*44|0)+24>>2]=p*(n*k-e*m);g[o+(b*44|0)+28>>2]=(e*f-i*k)*p;c[o+(b*44|0)+32>>2]=0;g[h+72>>2]=i*m-n*f+ +g[h+72>>2];g[h+76>>2]=n*k-e*m+ +g[h+76>>2];g[h+80>>2]=e*f-i*k+ +g[h+80>>2];g[j+72>>2]=i*m-n*f+ +g[j+72>>2];g[j+76>>2]=n*k-e*m+ +g[j+76>>2];g[j+80>>2]=e*f-i*k+ +g[j+80>>2];g[l+72>>2]=i*m-n*f+ +g[l+72>>2];g[l+76>>2]=n*k-e*m+ +g[l+76>>2];g[l+80>>2]=e*f-i*k+ +g[l+80>>2];b=b+1|0}while((b|0)!=(d|0))}l=c[a+772>>2]|0;if((l|0)<=0)return;a=c[a+780>>2]|0;b=0;do{h=a+(b*104|0)+72|0;i=+g[h>>2];j=a+(b*104|0)+76|0;k=+g[j>>2];d=a+(b*104|0)+80|0;e=+g[d>>2];f=+D(+(i*i+k*k+e*e));if(f>1.1920928955078125e-07){g[h>>2]=i*(1.0/f);g[j>>2]=1.0/f*k;g[d>>2]=1.0/f*e}b=b+1|0}while((b|0)!=(l|0));return}function Fg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0;h=ht()|0;c[h+4>>2]=5;c[h+8>>2]=-1;c[h+12>>2]=-1;g[h+16>>2]=3402823466385288598117041.0e14;a[h+20>>0]=1;a[h+21>>0]=0;c[h+24>>2]=-1;c[h+28>>2]=b;c[h+32>>2]=d;g[h+36>>2]=0.0;g[h+40>>2]=.05000000074505806;c[h+44>>2]=0;c[h>>2]=4940;c[h+300>>2]=c[e>>2];c[h+300+4>>2]=c[e+4>>2];c[h+300+8>>2]=c[e+8>>2];c[h+300+12>>2]=c[e+12>>2];c[h+316>>2]=c[e+16>>2];c[h+316+4>>2]=c[e+16+4>>2];c[h+316+8>>2]=c[e+16+8>>2];c[h+316+12>>2]=c[e+16+12>>2];c[h+332>>2]=c[e+32>>2];c[h+332+4>>2]=c[e+32+4>>2];c[h+332+8>>2]=c[e+32+8>>2];c[h+332+12>>2]=c[e+32+12>>2];c[h+348>>2]=c[e+48>>2];c[h+348+4>>2]=c[e+48+4>>2];c[h+348+8>>2]=c[e+48+8>>2];c[h+348+12>>2]=c[e+48+12>>2];c[h+364>>2]=c[f>>2];c[h+364+4>>2]=c[f+4>>2];c[h+364+8>>2]=c[f+8>>2];c[h+364+12>>2]=c[f+12>>2];c[h+380>>2]=c[f+16>>2];c[h+380+4>>2]=c[f+16+4>>2];c[h+380+8>>2]=c[f+16+8>>2];c[h+380+12>>2]=c[f+16+12>>2];c[h+396>>2]=c[f+32>>2];c[h+396+4>>2]=c[f+32+4>>2];c[h+396+8>>2]=c[f+32+8>>2];c[h+396+12>>2]=c[f+32+12>>2];c[h+412>>2]=c[f+48>>2];c[h+412+4>>2]=c[f+48+4>>2];c[h+412+8>>2]=c[f+48+8>>2];c[h+412+12>>2]=c[f+48+12>>2];a[h+552>>0]=0;c[h+524>>2]=0;g[h+572>>2]=-1.0;g[h+444>>2]=999999984306749440.0;g[h+448>>2]=999999984306749440.0;g[h+452>>2]=999999984306749440.0;g[h+428>>2]=1.0;g[h+432>>2]=.30000001192092896;g[h+436>>2]=1.0;g[h+440>>2]=.009999999776482582;g[h+456>>2]=.05000000074505806;c[h+592>>2]=0;g[h+596>>2]=0.0;g[h+600>>2]=.699999988079071;g[h+604>>2]=0.0;return h|0}function Gg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0;e=+g[d+128>>2];if(!(e!=0.0)){i=0.0;return +i}c[5961]=(c[5961]|0)+1;k=+g[d+96>>2];f=+g[d+16>>2];h=+g[d+20>>2];i=+g[d+24>>2];j=+g[d+108>>2];j=e-k*+g[d+116>>2]-(f*+g[a+144>>2]+h*+g[a+148>>2]+i*+g[a+152>>2]+(+g[d>>2]*+g[a+160>>2]+ +g[d+4>>2]*+g[a+164>>2]+ +g[d+8>>2]*+g[a+168>>2]))*j-j*(+g[d+48>>2]*+g[b+144>>2]+ +g[d+52>>2]*+g[b+148>>2]+ +g[d+56>>2]*+g[b+152>>2]+(+g[d+32>>2]*+g[b+160>>2]+ +g[d+36>>2]*+g[b+164>>2]+ +g[d+40>>2]*+g[b+168>>2]));l=+g[d+120>>2];e=k+j>2]=k+j>2]|0){l=e*h*+g[a+132>>2]*+g[a+116>>2];k=e*i*+g[a+136>>2]*+g[a+120>>2];g[a+144>>2]=+g[a+112>>2]*e*f*+g[a+128>>2]+ +g[a+144>>2];g[a+148>>2]=l+ +g[a+148>>2];g[a+152>>2]=k+ +g[a+152>>2];k=e*+g[a+100>>2]*+g[d+68>>2];l=e*+g[a+104>>2]*+g[d+72>>2];g[a+160>>2]=e*+g[a+96>>2]*+g[d+64>>2]+ +g[a+160>>2];g[a+164>>2]=k+ +g[a+164>>2];g[a+168>>2]=l+ +g[a+168>>2]}if(!(c[b+240>>2]|0)){l=e;return +l}l=e*+g[d+52>>2]*+g[b+132>>2]*+g[b+116>>2];k=e*+g[d+56>>2]*+g[b+136>>2]*+g[b+120>>2];g[b+144>>2]=+g[b+112>>2]*e*+g[d+48>>2]*+g[b+128>>2]+ +g[b+144>>2];g[b+148>>2]=l+ +g[b+148>>2];g[b+152>>2]=k+ +g[b+152>>2];k=e*+g[b+100>>2]*+g[d+84>>2];l=e*+g[b+104>>2]*+g[d+88>>2];g[b+160>>2]=e*+g[b+96>>2]*+g[d+80>>2]+ +g[b+160>>2];g[b+164>>2]=k+ +g[b+164>>2];g[b+168>>2]=l+ +g[b+168>>2];l=e;return +l}function Hg(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=+f;h=h|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0;o=l;l=l+16|0;c[b>>2]=5168;a[b+216>>0]=1;c[b+212>>2]=0;c[b+204>>2]=0;c[b+208>>2]=0;c[b+8>>2]=d;c[b+256>>2]=0;c[b+260>>2]=0;c[b+264>>2]=1065353216;g[b+268>>2]=0.0;c[b+272>>2]=0;c[b+276>>2]=0;c[b+280>>2]=1065353216;g[b+284>>2]=0.0;g[b+64>>2]=.019999999552965164;c[b+68>>2]=0;c[b+68+4>>2]=0;c[b+68+8>>2]=0;c[b+68+12>>2]=0;c[b+100>>2]=0;c[b+100+4>>2]=0;c[b+100+8>>2]=0;c[b+100+12>>2]=0;a[b+250>>0]=1;g[b+56>>2]=0.0;c[b+12>>2]=e;a[b+251>>0]=1;g[b+252>>2]=0.0;g[b+20>>2]=0.0;g[b+24>>2]=0.0;g[b+52>>2]=29.399999618530273;g[b+28>>2]=55.0;g[b+32>>2]=10.0;g[b+36>>2]=10.0;a[b+248>>0]=0;a[b+249>>0]=0;a[b+288>>0]=1;g[b+148>>2]=0.0;g[b+16>>2]=.20000000298023224;a[b+289>>0]=0;a[b+290>>0]=0;g[b+240>>2]=0.0;g[b+244>>2]=0.0;k=+g[h>>2];m=+g[h+4>>2];n=+g[h+8>>2];if(!(k*k+m*m+n*n>0.0)){ve(b,h);h=b+60|0;g[h>>2]=f;h=b+44|0;g[h>>2]=.7853981852531433;b=b+48|0;g[b>>2]=.7071067690849304;l=o;return}i=1.0/+D(+(k*k+m*m+n*n));j=n*i*-29.399999618530273*n*i*-29.399999618530273+(k*i*-29.399999618530273*k*i*-29.399999618530273+m*i*-29.399999618530273*m*i*-29.399999618530273);if(j>0.0){g[o>>2]=-(k*i*-29.399999618530273);g[o+4>>2]=-(m*i*-29.399999618530273);g[o+8>>2]=-(n*i*-29.399999618530273);g[o+12>>2]=0.0;ve(b,o)}g[b+52>>2]=+D(+j);h=b+60|0;g[h>>2]=f;h=b+44|0;g[h>>2]=.7853981852531433;b=b+48|0;g[b>>2]=.7071067690849304;l=o;return}function Ig(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0;f=+g[d+100>>2];j=+g[d+16>>2];k=+g[d+20>>2];l=+g[d+24>>2];h=+g[d+108>>2];h=+g[d+112>>2]-f*+g[d+116>>2]-(j*+g[a+64>>2]+k*+g[a+68>>2]+l*+g[a+72>>2]+(+g[d>>2]*+g[a+80>>2]+ +g[d+4>>2]*+g[a+84>>2]+ +g[d+8>>2]*+g[a+88>>2]))*h-h*(+g[d+48>>2]*+g[b+64>>2]+ +g[d+52>>2]*+g[b+68>>2]+ +g[d+56>>2]*+g[b+72>>2]+(+g[d+32>>2]*+g[b+80>>2]+ +g[d+36>>2]*+g[b+84>>2]+ +g[d+40>>2]*+g[b+88>>2]));e=+g[d+120>>2];if(!(f+h>2];if(f+h>e)i=e-f;else{i=h;e=f+h}}else i=e-f;g[d+100>>2]=e;if(c[a+240>>2]|0){h=i*k*+g[a+132>>2]*+g[a+116>>2];k=i*l*+g[a+136>>2]*+g[a+120>>2];g[a+64>>2]=+g[a+112>>2]*i*j*+g[a+128>>2]+ +g[a+64>>2];g[a+68>>2]=h+ +g[a+68>>2];g[a+72>>2]=k+ +g[a+72>>2];k=i*+g[a+100>>2]*+g[d+68>>2];l=i*+g[a+104>>2]*+g[d+72>>2];g[a+80>>2]=i*+g[a+96>>2]*+g[d+64>>2]+ +g[a+80>>2];g[a+84>>2]=k+ +g[a+84>>2];g[a+88>>2]=l+ +g[a+88>>2]}if(!(c[b+240>>2]|0))return +i;l=i*+g[d+52>>2]*+g[b+132>>2]*+g[b+116>>2];k=i*+g[d+56>>2]*+g[b+136>>2]*+g[b+120>>2];g[b+64>>2]=+g[b+112>>2]*i*+g[d+48>>2]*+g[b+128>>2]+ +g[b+64>>2];g[b+68>>2]=l+ +g[b+68>>2];g[b+72>>2]=k+ +g[b+72>>2];k=i*+g[b+100>>2]*+g[d+84>>2];l=i*+g[b+104>>2]*+g[d+88>>2];g[b+80>>2]=i*+g[b+96>>2]*+g[d+80>>2]+ +g[b+80>>2];g[b+84>>2]=k+ +g[b+84>>2];g[b+88>>2]=l+ +g[b+88>>2];return +i}function Jg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c[6415]=(c[6415]|0)+1;k=(((e<<16|d)+~((e<<16|d)<<15)|0)>>>10^(e<<16|d)+~((e<<16|d)<<15))*9|0;k=((k>>>6^k)+~((k>>>6^k)<<11)|0)>>>16^(k>>>6^k)+~((k>>>6^k)<<11);l=c[b+12>>2]|0;f=c[(c[b+36>>2]|0)+((l+-1&k)<<2)>>2]|0;a:do if((f|0)!=-1){h=c[b+16>>2]|0;while(1){g=h+(f*12|0)|0;if((c[g>>2]|0)==(d|0)?(c[h+(f*12|0)+4>>2]|0)==(e|0):0)break;f=c[(c[b+56>>2]|0)+(f<<2)>>2]|0;if((f|0)==-1)break a}if(g|0){e=g;return e|0}}while(0);j=c[b+8>>2]|0;if((j|0)==(l|0)){h=l|0?l<<1:1;if((l|0)<(h|0)){if(!h){f=0;i=l}else{c[6995]=(c[6995]|0)+1;f=sc((h*12|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=c[b+8>>2]|0}if((i|0)>0){g=0;do{m=f+(g*12|0)|0;n=(c[b+16>>2]|0)+(g*12|0)|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];g=g+1|0}while((g|0)!=(i|0))}g=c[b+16>>2]|0;if(g|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=f;c[b+12>>2]=h;f=c[b+8>>2]|0}else{f=l;h=l}}else{f=j;h=l}c[b+8>>2]=f+1;g=c[b+16>>2]|0;if((l|0)<(h|0)){Nf(b);f=(c[b+12>>2]|0)+-1&k}else f=l+-1&k;c[g+(j*12|0)>>2]=d;c[g+(j*12|0)+4>>2]=e;c[g+(j*12|0)+8>>2]=0;n=(c[b+36>>2]|0)+(f<<2)|0;c[(c[b+56>>2]|0)+(j<<2)>>2]=c[n>>2];c[n>>2]=j;n=g+(j*12|0)|0;return n|0}function Kg(b){b=b|0;var d=0;d=Us(676)|0;c[d>>2]=5320;c[d+132>>2]=0;c[d+132+4>>2]=0;c[d+132+8>>2]=0;c[d+132+12>>2]=0;c[d+132+16>>2]=0;c[d+132+20>>2]=0;c[d+132+24>>2]=0;c[d+132+28>>2]=0;c[d+164>>2]=1065353216;c[d+168>>2]=1065353216;c[d+172>>2]=1065353216;g[d+176>>2]=0.0;c[d+180>>2]=0;g[d+184>>2]=999999984306749440.0;c[d+188>>2]=0;c[d+188+4>>2]=0;c[d+188+8>>2]=0;c[d+188+12>>2]=0;c[d+204>>2]=1;c[d+208>>2]=-1;c[d+212>>2]=-1;c[d+216>>2]=-1;c[d+220>>2]=1;g[d+224>>2]=0.0;g[d+228>>2]=.5;g[d+232>>2]=0.0;g[d+236>>2]=0.0;g[d+240>>2]=0.0;g[d+244>>2]=.10000000149011612;g[d+248>>2]=1.0e4;c[d+252>>2]=1;c[d+256>>2]=0;c[d+260>>2]=-1;c[d+264>>2]=-1;g[d+268>>2]=1.0;g[d+272>>2]=0.0;g[d+276>>2]=0.0;c[d+280>>2]=0;a[d+300>>0]=1;c[d+296>>2]=0;c[d+288>>2]=0;c[d+292>>2]=0;c[d+304>>2]=0;c[d+4>>2]=1065353216;c[d+8>>2]=0;c[d+8+4>>2]=0;c[d+8+8>>2]=0;c[d+8+12>>2]=0;c[d+24>>2]=1065353216;c[d+28>>2]=0;c[d+28+4>>2]=0;c[d+28+8>>2]=0;c[d+28+12>>2]=0;c[d+44>>2]=1065353216;c[d+48>>2]=0;c[d+48+4>>2]=0;c[d+48+8>>2]=0;c[d+48+12>>2]=0;c[d+48+16>>2]=0;c[d+68>>2]=1065353216;c[d+72>>2]=0;c[d+72+4>>2]=0;c[d+72+8>>2]=0;c[d+72+12>>2]=0;c[d+88>>2]=1065353216;c[d+92>>2]=0;c[d+92+4>>2]=0;c[d+92+8>>2]=0;c[d+92+12>>2]=0;c[d+108>>2]=1065353216;c[d+112>>2]=0;c[d+112+4>>2]=0;c[d+112+8>>2]=0;c[d+112+12>>2]=0;c[d+112+16>>2]=0;c[d>>2]=4324;a[d+560>>0]=1;c[d+556>>2]=0;c[d+548>>2]=0;c[d+552>>2]=0;Id(d,b);return d|0}function Lg(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0;c[6995]=(c[6995]|0)+1;b=sc((h+2|0)>>>0>268435455?18:(h+2<<4|3)+16|0)|0;if(!b)j=0;else{c[(b+4+15&-16)+-4>>2]=b;j=b+4+15&-16}k=$I((h+2|0)>>>0>1073741823?-1:h+2<<2)|0;if((h|0)>-2){b=0;do{p=+(b|0)/+(h+1|0);o=+g[e>>2];n=+g[e+4>>2];n=n+p*(+g[f+4>>2]-n);m=+g[e+8>>2];m=m+p*(+g[f+8>>2]-m);g[j+(b<<4)>>2]=o+p*(+g[f>>2]-o);g[j+(b<<4)+4>>2]=n;g[j+(b<<4)+8>>2]=m;g[j+(b<<4)+12>>2]=0.0;g[k+(b<<2)>>2]=1.0;b=b+1|0}while((b|0)<(h+2|0))}c[6995]=(c[6995]|0)+1;b=sc(1271)|0;if(!b)l=0;else{c[(b+4+15&-16)+-4>>2]=b;l=b+4+15&-16}Bc(l,d,h+2|0,j,k);if(i&1|0){g[(c[l+780>>2]|0)+88>>2]=0.0;a[l+984>>0]=1}if(i&2|0){g[(c[l+780>>2]|0)+((h+1|0)*104|0)+88>>2]=0.0;a[l+984>>0]=1}if(j|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}aJ(k);if((h+2|0)<=1)return l|0;j=l+780|0;k=l+792|0;e=l+800|0;f=l+984|0;b=1;do{r=b+-1|0;q=c[j>>2]|0;Xh(l,0);i=(c[k>>2]|0)+-1|0;d=c[e>>2]|0;c[d+(i*52|0)+24>>2]=q+(r*104|0);c[d+(i*52|0)+28>>2]=q+(b*104|0);n=+g[q+(r*104|0)+8>>2]-+g[q+(b*104|0)+8>>2];o=+g[q+(r*104|0)+12>>2]-+g[q+(b*104|0)+12>>2];p=+g[q+(r*104|0)+16>>2]-+g[q+(b*104|0)+16>>2];g[d+(i*52|0)+32>>2]=+D(+(n*n+o*o+p*p));a[f>>0]=1;b=b+1|0}while((b|0)!=(h+2|0));return l|0}function Mg(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,i=0.0,j=0,k=0.0,l=0.0,m=0.0,n=0;if(a[b+1308>>0]|0){c[d>>2]=0;c[d+4>>2]=0;return}jd(b,(c[b+28>>2]|0)+4|0,(c[b+32>>2]|0)+4|0);c[d>>2]=0;c[d+4>>2]=6;if((c[b+856>>2]|0)==0?(a[b+788>>0]|0)==0:0){e=0;f=6}else{c[d>>2]=1;c[d+4>>2]=5;e=1;f=5}if(!((c[b+860>>2]|0)==0?(a[b+789>>0]|0)==0:0)){e=e+1|0;c[d>>2]=e;f=f+-1|0;c[d+4>>2]=f}if((c[b+864>>2]|0)==0?(a[b+790>>0]|0)==0:0)n=0;else{e=e+1|0;c[d>>2]=e;f=f+-1|0;c[d+4>>2]=f;n=0}do{k=+g[b+868+(n<<6)>>2];l=+g[b+868+(n<<6)+4>>2];m=+Xj(+g[b+1192+(n<<2)>>2],k,l);g[b+868+(n<<6)+52>>2]=m;do if(!(k>l)){if(k>m){c[b+868+(n<<6)+56>>2]=1;h=b+868+(n<<6)+48|0;g[h>>2]=m-k;if(!(m-k>3.1415927410125732))if(m-k<-3.1415927410125732)i=6.2831854820251465;else{j=18;break}else i=-6.2831854820251465;g[h>>2]=m-k+i;j=18;break}h=b+868+(n<<6)+56|0;if(l>2]=2;h=b+868+(n<<6)+48|0;g[h>>2]=m-l;if(!(m-l>3.1415927410125732))if(m-l<-3.1415927410125732)i=6.2831854820251465;else{j=18;break}else i=-6.2831854820251465;g[h>>2]=m-l+i;j=18}else j=17}else{h=b+868+(n<<6)+56|0;j=17}while(0);if((j|0)==17){j=0;c[h>>2]=0;if(a[b+868+(n<<6)+44>>0]|0)j=18}if((j|0)==18){e=e+1|0;c[d>>2]=e;f=f+-1|0;c[d+4>>2]=f}n=n+1|0}while((n|0)!=3);return}function Ng(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0;k=+g[d+100>>2];f=+g[d+16>>2];h=+g[d+20>>2];i=+g[d+24>>2];j=+g[d+108>>2];j=+g[d+112>>2]-k*+g[d+116>>2]-(f*+g[a+64>>2]+h*+g[a+68>>2]+i*+g[a+72>>2]+(+g[d>>2]*+g[a+80>>2]+ +g[d+4>>2]*+g[a+84>>2]+ +g[d+8>>2]*+g[a+88>>2]))*j-j*(+g[d+48>>2]*+g[b+64>>2]+ +g[d+52>>2]*+g[b+68>>2]+ +g[d+56>>2]*+g[b+72>>2]+(+g[d+32>>2]*+g[b+80>>2]+ +g[d+36>>2]*+g[b+84>>2]+ +g[d+40>>2]*+g[b+88>>2]));l=+g[d+120>>2];e=k+j>2]=k+j>2]|0){l=e*h*+g[a+132>>2]*+g[a+116>>2];k=e*i*+g[a+136>>2]*+g[a+120>>2];g[a+64>>2]=+g[a+112>>2]*e*f*+g[a+128>>2]+ +g[a+64>>2];g[a+68>>2]=l+ +g[a+68>>2];g[a+72>>2]=k+ +g[a+72>>2];k=e*+g[a+100>>2]*+g[d+68>>2];l=e*+g[a+104>>2]*+g[d+72>>2];g[a+80>>2]=e*+g[a+96>>2]*+g[d+64>>2]+ +g[a+80>>2];g[a+84>>2]=k+ +g[a+84>>2];g[a+88>>2]=l+ +g[a+88>>2]}if(!(c[b+240>>2]|0))return +e;l=e*+g[d+52>>2]*+g[b+132>>2]*+g[b+116>>2];k=e*+g[d+56>>2]*+g[b+136>>2]*+g[b+120>>2];g[b+64>>2]=+g[b+112>>2]*e*+g[d+48>>2]*+g[b+128>>2]+ +g[b+64>>2];g[b+68>>2]=l+ +g[b+68>>2];g[b+72>>2]=k+ +g[b+72>>2];k=e*+g[b+100>>2]*+g[d+84>>2];l=e*+g[b+104>>2]*+g[d+88>>2];g[b+80>>2]=e*+g[b+96>>2]*+g[d+80>>2]+ +g[b+80>>2];g[b+84>>2]=k+ +g[b+84>>2];g[b+88>>2]=l+ +g[b+88>>2];return +e}function Og(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;k=l;l=l+96|0;g=c[b+8>>2]|0;c[d+216>>2]=g;if((g|0)==(c[b+12>>2]|0)?(j=g|0?g<<1:1,(g|0)<(j|0)):0){if(!j)i=0;else{c[6995]=(c[6995]|0)+1;g=sc((j<<2|3)+16|0)|0;if(!g)g=0;else{c[(g+4+15&-16)+-4>>2]=g;g=g+4+15&-16}i=g;g=c[b+8>>2]|0}if((g|0)>0){h=0;do{c[i+(h<<2)>>2]=c[(c[b+16>>2]|0)+(h<<2)>>2];h=h+1|0}while((h|0)!=(g|0))}h=c[b+16>>2]|0;if(h){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);g=c[b+8>>2]|0}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=i;c[b+12>>2]=j}c[(c[b+16>>2]|0)+(g<<2)>>2]=d;c[b+8>>2]=g+1;c[k+32>>2]=c[d+4>>2];c[k+32+4>>2]=c[d+4+4>>2];c[k+32+8>>2]=c[d+4+8>>2];c[k+32+12>>2]=c[d+4+12>>2];c[k+32+16>>2]=c[d+20>>2];c[k+32+16+4>>2]=c[d+20+4>>2];c[k+32+16+8>>2]=c[d+20+8>>2];c[k+32+16+12>>2]=c[d+20+12>>2];c[k+32+32>>2]=c[d+36>>2];c[k+32+32+4>>2]=c[d+36+4>>2];c[k+32+32+8>>2]=c[d+36+8>>2];c[k+32+32+12>>2]=c[d+36+12>>2];c[k+32+48>>2]=c[d+52>>2];c[k+32+48+4>>2]=c[d+52+4>>2];c[k+32+48+8>>2]=c[d+52+8>>2];c[k+32+48+12>>2]=c[d+52+12>>2];j=c[d+192>>2]|0;Vb[c[(c[j>>2]|0)+8>>2]&127](j,k+32|0,k+16|0,k);j=c[b+68>>2]|0;c[d+188>>2]=Fb[c[(c[j>>2]|0)+8>>2]&3](j,k+16|0,k,c[(c[d+192>>2]|0)+4>>2]|0,d,e,f,c[b+24>>2]|0)|0;l=k;return}function Pg(){var b=0;b=Us(344)|0;c[b>>2]=5320;c[b+132>>2]=0;c[b+132+4>>2]=0;c[b+132+8>>2]=0;c[b+132+12>>2]=0;c[b+132+16>>2]=0;c[b+132+20>>2]=0;c[b+132+24>>2]=0;c[b+132+28>>2]=0;c[b+164>>2]=1065353216;c[b+168>>2]=1065353216;c[b+172>>2]=1065353216;g[b+176>>2]=0.0;c[b+180>>2]=0;g[b+184>>2]=999999984306749440.0;c[b+188>>2]=0;c[b+188+4>>2]=0;c[b+188+8>>2]=0;c[b+188+12>>2]=0;c[b+204>>2]=1;c[b+208>>2]=-1;c[b+212>>2]=-1;c[b+216>>2]=-1;c[b+220>>2]=1;g[b+224>>2]=0.0;g[b+228>>2]=.5;g[b+232>>2]=0.0;g[b+236>>2]=0.0;g[b+240>>2]=0.0;g[b+244>>2]=.10000000149011612;g[b+248>>2]=1.0e4;c[b+256>>2]=0;c[b+260>>2]=-1;c[b+264>>2]=-1;g[b+268>>2]=1.0;g[b+272>>2]=0.0;g[b+276>>2]=0.0;c[b+280>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;c[b+304>>2]=0;c[b+4>>2]=1065353216;c[b+8>>2]=0;c[b+8+4>>2]=0;c[b+8+8>>2]=0;c[b+8+12>>2]=0;c[b+24>>2]=1065353216;c[b+28>>2]=0;c[b+28+4>>2]=0;c[b+28+8>>2]=0;c[b+28+12>>2]=0;c[b+44>>2]=1065353216;c[b+48>>2]=0;c[b+48+4>>2]=0;c[b+48+8>>2]=0;c[b+48+12>>2]=0;c[b+48+16>>2]=0;c[b+68>>2]=1065353216;c[b+72>>2]=0;c[b+72+4>>2]=0;c[b+72+8>>2]=0;c[b+72+12>>2]=0;c[b+88>>2]=1065353216;c[b+92>>2]=0;c[b+92+4>>2]=0;c[b+92+8>>2]=0;c[b+92+12>>2]=0;c[b+108>>2]=1065353216;c[b+112>>2]=0;c[b+112+4>>2]=0;c[b+112+8>>2]=0;c[b+112+12>>2]=0;c[b+112+16>>2]=0;c[b>>2]=5356;a[b+340>>0]=1;c[b+336>>2]=0;c[b+328>>2]=0;c[b+332>>2]=0;c[b+252>>2]=4;return b|0}function Qg(b){b=b|0;var d=0,e=0,f=0;c[b>>2]=4360;if(a[b+288>>0]|0?(d=c[b+220>>2]|0,Ib[c[c[d>>2]>>2]&511](d),d=c[b+220>>2]|0,d|0):0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+212>>2]|0;if(d|0?(Ib[c[c[d>>2]>>2]&511](d),e=c[b+212>>2]|0,e|0):0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}if(a[b+289>>0]|0?(f=c[b+216>>2]|0,Ib[c[c[f>>2]>>2]&511](f),f=c[b+216>>2]|0,f|0):0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}d=c[b+332>>2]|0;if(d|0){if(a[b+336>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+332>>2]=0}a[b+336>>0]=1;c[b+332>>2]=0;c[b+324>>2]=0;c[b+328>>2]=0;d=c[b+304>>2]|0;if(d|0){if(a[b+308>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+304>>2]=0}a[b+308>>0]=1;c[b+304>>2]=0;c[b+296>>2]=0;c[b+300>>2]=0;d=c[b+256>>2]|0;if(d|0){if(a[b+260>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+256>>2]=0}a[b+260>>0]=1;c[b+256>>2]=0;c[b+248>>2]=0;c[b+252>>2]=0;d=c[b+236>>2]|0;if(d|0){if(a[b+240>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+236>>2]=0}a[b+240>>0]=1;c[b+236>>2]=0;c[b+228>>2]=0;c[b+232>>2]=0;d=c[b+204>>2]|0;if(!d){a[b+208>>0]=1;c[b+204>>2]=0;c[b+196>>2]=0;f=b+200|0;c[f>>2]=0;Oj(b);return}if(a[b+208>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+204>>2]=0;a[b+208>>0]=1;c[b+204>>2]=0;c[b+196>>2]=0;f=b+200|0;c[f>>2]=0;Oj(b);return}function Rg(a,b,d,e,f,h,i,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=+j;k=k|0;l=+l;var m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0;c[a>>2]=c[h>>2];c[a+4>>2]=c[h+4>>2];c[a+8>>2]=c[h+8>>2];c[a+12>>2]=c[h+12>>2];s=+g[e+4>>2];v=+g[a+8>>2];w=+g[e+8>>2];p=+g[a+4>>2];m=+g[a>>2];r=+g[e>>2];u=(s*v-w*p)*+g[b>>2]+ +g[b+4>>2]*(w*m-v*r)+(p*r-s*m)*+g[b+8>>2];t=(s*v-w*p)*+g[b+16>>2]+(w*m-v*r)*+g[b+20>>2]+(p*r-s*m)*+g[b+24>>2];s=(s*v-w*p)*+g[b+32>>2]+(w*m-v*r)*+g[b+36>>2]+(p*r-s*m)*+g[b+40>>2];g[a+16>>2]=u;g[a+20>>2]=t;g[a+24>>2]=s;g[a+28>>2]=0.0;r=+g[f+4>>2];w=+g[f+8>>2];n=+g[f>>2];q=+g[d>>2]*(r*-v-w*-p)+ +g[d+4>>2]*(w*-m-n*-v)+(n*-p-r*-m)*+g[d+8>>2];o=(r*-v-w*-p)*+g[d+16>>2]+(w*-m-n*-v)*+g[d+20>>2]+(n*-p-r*-m)*+g[d+24>>2];m=(r*-v-w*-p)*+g[d+32>>2]+(w*-m-n*-v)*+g[d+36>>2]+(n*-p-r*-m)*+g[d+40>>2];g[a+32>>2]=q;g[a+36>>2]=o;g[a+40>>2]=m;g[a+44>>2]=0.0;u=+g[i>>2]*u;t=+g[i+4>>2]*t;s=+g[i+8>>2]*s;g[a+48>>2]=u;g[a+52>>2]=t;g[a+56>>2]=s;g[a+60>>2]=0.0;r=+g[k>>2]*q;p=+g[k+4>>2]*o;n=+g[k+8>>2]*m;g[a+64>>2]=r;g[a+68>>2]=p;g[a+72>>2]=n;g[a+76>>2]=0.0;g[a+80>>2]=u*+g[a+16>>2]+t*+g[a+20>>2]+s*+g[a+24>>2]+j+l+(r*q+p*o+n*m);return}function Sg(a,b,d){a=a|0;b=b|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;c[6414]=(c[6414]|0)+1;h=(((d<<16|b)+~((d<<16|b)<<15)|0)>>>10^(d<<16|b)+~((d<<16|b)<<15))*9|0;m=c[a+36>>2]|0;h=m+(((c[a+12>>2]|0)+-1&(((h>>>6^h)+~((h>>>6^h)<<11)|0)>>>16^(h>>>6^h)+~((h>>>6^h)<<11)))<<2)|0;g=c[h>>2]|0;if((g|0)==-1){n=0;return n|0}n=c[a+16>>2]|0;e=g;while(1){l=n+(e*12|0)|0;if((c[l>>2]|0)==(b|0)?(c[n+(e*12|0)+4>>2]|0)==(d|0):0)break;e=c[(c[a+56>>2]|0)+(e<<2)>>2]|0;if((e|0)==-1){e=0;f=13;break}}if((f|0)==13)return e|0;if(!l){n=0;return n|0}k=c[n+(e*12|0)+8>>2]|0;j=(e*12|0)/12|0;i=c[a+56>>2]|0;if((g|0)==(j|0))e=-1;else{e=g;while(1){b=c[i+(e<<2)>>2]|0;if((b|0)==(j|0))break;else e=b}}c[((e|0)==-1?h:i+(e<<2)|0)>>2]=c[i+(j<<2)>>2];f=(c[a+8>>2]|0)+-1|0;if((f|0)==(j|0)){c[a+8>>2]=j;n=k;return n|0}g=c[n+(f*12|0)+4>>2]<<16|c[n+(f*12|0)>>2];g=((g+~(g<<15)|0)>>>10^g+~(g<<15))*9|0;g=(((g>>>6^g)+~((g>>>6^g)<<11)|0)>>>16^(g>>>6^g)+~((g>>>6^g)<<11))&(c[a+12>>2]|0)+-1;b=g;d=-1;e=m;while(1){e=c[e+(b<<2)>>2]|0;if((e|0)==(f|0))break;else{b=e;d=e;e=i}}c[((d|0)==-1?m+(g<<2)|0:i+(d<<2)|0)>>2]=c[i+(f<<2)>>2];c[l>>2]=c[n+(f*12|0)>>2];c[l+4>>2]=c[n+(f*12|0)+4>>2];c[l+8>>2]=c[n+(f*12|0)+8>>2];n=(c[a+36>>2]|0)+(g<<2)|0;c[(c[a+56>>2]|0)+(j<<2)>>2]=c[n>>2];c[n>>2]=j;c[a+8>>2]=(c[a+8>>2]|0)+-1;n=k;return n|0}function Tg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0;h=l;l=l+64|0;a[d+84>>0]=0;c[h>>2]=c[b+4>>2];c[h+4>>2]=c[b+4+4>>2];c[h+8>>2]=c[b+4+8>>2];c[h+12>>2]=c[b+4+12>>2];c[h+16>>2]=c[b+20>>2];c[h+16+4>>2]=c[b+20+4>>2];c[h+16+8>>2]=c[b+20+8>>2];c[h+16+12>>2]=c[b+20+12>>2];c[h+32>>2]=c[b+36>>2];c[h+32+4>>2]=c[b+36+4>>2];c[h+32+8>>2]=c[b+36+8>>2];c[h+32+12>>2]=c[b+36+12>>2];c[h+48>>2]=c[b+52>>2];c[h+48+4>>2]=c[b+52+4>>2];c[h+48+8>>2]=c[b+52+8>>2];c[h+48+12>>2]=c[b+52+12>>2];if(e?(f=c[b+540>>2]|0,f|0):0)Ob[c[(c[f>>2]|0)+8>>2]&127](f,h);w=+g[d+156>>2];u=+g[h>>2];v=+g[d+160>>2];t=+g[h+4>>2];o=+g[d+164>>2];s=+g[h+8>>2];r=+g[h+16>>2];q=+g[h+20>>2];p=+g[h+24>>2];n=+g[h+32>>2];k=+g[h+36>>2];i=+g[h+40>>2];m=w*r+v*q+o*p+ +g[h+52>>2];j=w*n+v*k+o*i+ +g[h+56>>2];g[d+36>>2]=w*u+v*t+o*s+ +g[h+48>>2];g[d+40>>2]=m;g[d+44>>2]=j;g[d+48>>2]=0.0;j=+g[d+172>>2];m=+g[d+176>>2];o=+g[d+180>>2];g[d+52>>2]=u*j+t*m+s*o;g[d+56>>2]=j*r+m*q+o*p;g[d+60>>2]=j*n+m*k+o*i;g[d+64>>2]=0.0;o=+g[d+188>>2];m=+g[d+192>>2];j=+g[d+196>>2];g[d+68>>2]=u*o+t*m+s*j;g[d+72>>2]=o*r+m*q+j*p;g[d+76>>2]=o*n+m*k+j*i;g[d+80>>2]=0.0;l=h;return}function Ug(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=b;break a}case 10:{b=(c[d>>2]|0)+(4-1)&~(4-1);e=c[b>>2]|0;c[d>>2]=b+4;c[a>>2]=e;c[a+4>>2]=((e|0)<0)<<31>>31;break a}case 11:{b=(c[d>>2]|0)+(4-1)&~(4-1);e=c[b>>2]|0;c[d>>2]=b+4;c[a>>2]=e;c[a+4>>2]=0;break a}case 12:{f=(c[d>>2]|0)+(8-1)&~(8-1);b=c[f>>2]|0;e=c[f+4>>2]|0;c[d>>2]=f+8;c[a>>2]=b;c[a+4>>2]=e;break a}case 13:{e=(c[d>>2]|0)+(4-1)&~(4-1);f=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=(f&65535)<<16>>16;c[a+4>>2]=(((f&65535)<<16>>16|0)<0)<<31>>31;break a}case 14:{e=(c[d>>2]|0)+(4-1)&~(4-1);f=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=f&65535;c[a+4>>2]=0;break a}case 15:{e=(c[d>>2]|0)+(4-1)&~(4-1);f=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=(f&255)<<24>>24;c[a+4>>2]=(((f&255)<<24>>24|0)<0)<<31>>31;break a}case 16:{e=(c[d>>2]|0)+(4-1)&~(4-1);f=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=f&255;c[a+4>>2]=0;break a}case 17:{f=(c[d>>2]|0)+(8-1)&~(8-1);g=+h[f>>3];c[d>>2]=f+8;h[a>>3]=g;break a}case 18:{f=(c[d>>2]|0)+(8-1)&~(8-1);g=+h[f>>3];c[d>>2]=f+8;h[a>>3]=g;break a}default:break a}while(0);while(0);return}function Vg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0.0,j=0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0;w=l;l=l+2048|0;if((e|0)>0)f=0;else{l=w;return}do{g[d+(f<<4)+12>>2]=-999999984306749440.0;f=f+1|0}while((f|0)!=(e|0));p=0;do{if((xb[c[(c[a>>2]|0)+96>>2]&127](a)|0)>0){q=b+(p<<4)|0;r=b+(p<<4)+4|0;s=b+(p<<4)+8|0;t=d+(p<<4)+12|0;u=d+(p<<4)|0;o=0;do{if(((xb[c[(c[a>>2]|0)+96>>2]&127](a)|0)-o|0)<128){f=(xb[c[(c[a>>2]|0)+96>>2]&127](a)|0)-o|0;if((f|0)>0)v=10;else{i=-3402823466385288598117041.0e14;f=-1}}else{f=128;v=10}if((v|0)==10){v=0;h=0;do{Sb[c[(c[a>>2]|0)+108>>2]&127](a,h,w+(h<<4)|0);h=h+1|0}while((h|0)!=(f|0));k=+g[q>>2];m=+g[r>>2];n=+g[s>>2];h=-1;j=0;i=-3402823466385288598117041.0e14;do{x=k*+g[w+(j<<4)>>2]+m*+g[w+(j<<4)+4>>2]+n*+g[w+(j<<4)+8>>2];y=x>i;h=y?j:h;i=y?x:i;j=j+1|0}while((j|0)!=(f|0));f=h}if(i>+g[t>>2]){y=w+(f<<4)|0;c[u>>2]=c[y>>2];c[u+4>>2]=c[y+4>>2];c[u+8>>2]=c[y+8>>2];c[u+12>>2]=c[y+12>>2];g[t>>2]=i}o=o+128|0}while((o|0)<(xb[c[(c[a>>2]|0)+96>>2]&127](a)|0))}p=p+1|0}while((p|0)!=(e|0));l=w;return}function Wg(b,d){b=b|0;d=d|0;var e=0;e=ht()|0;Ij(e,5,b);c[e>>2]=4940;c[e+300>>2]=c[d>>2];c[e+300+4>>2]=c[d+4>>2];c[e+300+8>>2]=c[d+8>>2];c[e+300+12>>2]=c[d+12>>2];c[e+316>>2]=c[d+16>>2];c[e+316+4>>2]=c[d+16+4>>2];c[e+316+8>>2]=c[d+16+8>>2];c[e+316+12>>2]=c[d+16+12>>2];c[e+332>>2]=c[d+32>>2];c[e+332+4>>2]=c[d+32+4>>2];c[e+332+8>>2]=c[d+32+8>>2];c[e+332+12>>2]=c[d+32+12>>2];c[e+348>>2]=c[d+48>>2];c[e+348+4>>2]=c[d+48+4>>2];c[e+348+8>>2]=c[d+48+8>>2];c[e+348+12>>2]=c[d+48+12>>2];a[e+527>>0]=0;c[e+364>>2]=c[e+300>>2];c[e+364+4>>2]=c[e+300+4>>2];c[e+364+8>>2]=c[e+300+8>>2];c[e+364+12>>2]=c[e+300+12>>2];c[e+380>>2]=c[e+316>>2];c[e+380+4>>2]=c[e+316+4>>2];c[e+380+8>>2]=c[e+316+8>>2];c[e+380+12>>2]=c[e+316+12>>2];c[e+396>>2]=c[e+332>>2];c[e+396+4>>2]=c[e+332+4>>2];c[e+396+8>>2]=c[e+332+8>>2];c[e+396+12>>2]=c[e+332+12>>2];a[e+524>>0]=0;a[e+525>>0]=0;a[e+526>>0]=0;a[e+552>>0]=0;c[e+412>>2]=0;c[e+412+4>>2]=0;c[e+412+8>>2]=0;c[e+412+12>>2]=0;g[e+572>>2]=-1.0;g[e+444>>2]=999999984306749440.0;g[e+448>>2]=999999984306749440.0;g[e+452>>2]=999999984306749440.0;g[e+428>>2]=1.0;g[e+432>>2]=.30000001192092896;g[e+436>>2]=1.0;g[e+440>>2]=.009999999776482582;g[e+456>>2]=.05000000074505806;c[e+592>>2]=0;g[e+596>>2]=0.0;g[e+600>>2]=.699999988079071;g[e+604>>2]=0.0;return e|0}function Xg(a,b,d,e,f,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var k=0.0,m=0.0,n=0,o=0.0,p=0,q=0.0,r=0,s=0.0,t=0;r=l;l=l+16|0;g[e>>2]=3402823466385288598117041.0e14;g[f>>2]=-3402823466385288598117041.0e14;p=c[a+100>>2]|0;if((p|0)>0){n=0;do{t=c[a+108>>2]|0;s=+g[t+(n<<4)>>2]*+g[a+16>>2];q=+g[t+(n<<4)+4>>2]*+g[a+20>>2];o=+g[t+(n<<4)+8>>2]*+g[a+24>>2];k=s*+g[b>>2]+q*+g[b+4>>2]+o*+g[b+8>>2]+ +g[b+48>>2];m=s*+g[b+16>>2]+q*+g[b+20>>2]+o*+g[b+24>>2]+ +g[b+52>>2];o=s*+g[b+32>>2]+q*+g[b+36>>2]+o*+g[b+40>>2]+ +g[b+56>>2];q=k*+g[d>>2]+m*+g[d+4>>2]+o*+g[d+8>>2];if(q<+g[e>>2]){g[e>>2]=q;g[h>>2]=k;g[h+4>>2]=m;g[h+8>>2]=o;g[h+12>>2]=0.0}if(q>+g[f>>2]){g[f>>2]=q;g[i>>2]=k;g[i+4>>2]=m;g[i+8>>2]=o;g[i+12>>2]=0.0}n=n+1|0}while((n|0)!=(p|0));s=+g[f>>2];m=s;n=(g[j>>2]=s,c[j>>2]|0)}else{m=-3402823466385288598117041.0e14;n=-8388609}k=+g[e>>2];if(!(k>m)){l=r;return}c[e>>2]=n;g[f>>2]=k;c[r>>2]=c[h>>2];c[r+4>>2]=c[h+4>>2];c[r+8>>2]=c[h+8>>2];c[r+12>>2]=c[h+12>>2];c[h>>2]=c[i>>2];c[h+4>>2]=c[i+4>>2];c[h+8>>2]=c[i+8>>2];c[h+12>>2]=c[i+12>>2];c[i>>2]=c[r>>2];c[i+4>>2]=c[r+4>>2];c[i+8>>2]=c[r+8>>2];c[i+12>>2]=c[r+12>>2];l=r;return}function Yg(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+48|0;e=(c[a+52>>2]|0)+4|0;c[e>>2]=c[b>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];b=d+32+4|0;c[b>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;g[d+32>>2]=1.0;Sb[c[(c[a>>2]|0)+68>>2]&127](d+16|0,a,d+32|0);g[a+36>>2]=+g[d+16>>2]+ +g[a+16>>2];g[d+32>>2]=-1.0;Sb[c[(c[a>>2]|0)+68>>2]&127](d,a,d+32|0);c[d+16>>2]=c[d>>2];c[d+16+4>>2]=c[d+4>>2];c[d+16+8>>2]=c[d+8>>2];c[d+16+12>>2]=c[d+12>>2];g[a+20>>2]=+g[d+16>>2]-+g[a+16>>2];c[d+32>>2]=0;c[d+32+4>>2]=0;c[d+32+8>>2]=0;c[d+32+12>>2]=0;g[b>>2]=1.0;Sb[c[(c[a>>2]|0)+68>>2]&127](d+16|0,a,d+32|0);g[a+40>>2]=+g[d+16+4>>2]+ +g[a+16>>2];g[b>>2]=-1.0;Sb[c[(c[a>>2]|0)+68>>2]&127](d,a,d+32|0);c[d+16>>2]=c[d>>2];c[d+16+4>>2]=c[d+4>>2];c[d+16+8>>2]=c[d+8>>2];c[d+16+12>>2]=c[d+12>>2];g[a+24>>2]=+g[d+16+4>>2]-+g[a+16>>2];c[d+32>>2]=0;c[d+32+4>>2]=0;c[d+32+8>>2]=0;c[d+32+12>>2]=0;g[d+32+8>>2]=1.0;Sb[c[(c[a>>2]|0)+68>>2]&127](d+16|0,a,d+32|0);g[a+44>>2]=+g[d+16+8>>2]+ +g[a+16>>2];g[d+32+8>>2]=-1.0;Sb[c[(c[a>>2]|0)+68>>2]&127](d,a,d+32|0);c[d+16>>2]=c[d>>2];c[d+16+4>>2]=c[d+4>>2];c[d+16+8>>2]=c[d+8>>2];c[d+16+12>>2]=c[d+12>>2];g[a+28>>2]=+g[d+16+8>>2]-+g[a+16>>2];l=d;return}function Zg(b,d,e){b=b|0;d=+d;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0;f=c[b+8>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}f=c[b+12>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}f=c[b+20>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}f=c[b+24>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}f=c[b+156>>2]|0;c[b+156>>2]=f+1;a[b+152>>0]=(f|0)>=(c[b+160>>2]|0)&1;if(f|0){c[b+72>>2]=0;c[b+72+4>>2]=0;c[b+72+8>>2]=0;c[b+72+12>>2]=0;c[b+72+16>>2]=0;c[b+72+20>>2]=0;c[b+72+24>>2]=0;c[b+72+28>>2]=0;return}j=+g[b+64>>2];i=1.0/d*+g[b+72>>2]*j;h=1.0/d*j*+g[b+76>>2];d=1.0/d*j*+g[b+80>>2];g[b+72>>2]=i;g[b+76>>2]=h;g[b+80>>2]=d;g[b+84>>2]=0.0;j=+g[b+68>>2];if(j>0.0){l=j*i*+g[b+120>>2]+j*h*+g[b+124>>2]+j*d*+g[b+128>>2];k=j*i*+g[b+136>>2]+j*h*+g[b+140>>2]+j*d*+g[b+144>>2];g[b+88>>2]=j*i*+g[b+104>>2]+j*h*+g[b+108>>2]+j*d*+g[b+112>>2];g[b+92>>2]=l;g[b+96>>2]=k;g[b+100>>2]=0.0;g[b+72>>2]=(1.0-j)*i;g[b+76>>2]=(1.0-j)*h;g[b+80>>2]=(1.0-j)*d;i=(1.0-j)*i;h=(1.0-j)*h;d=(1.0-j)*d}g[b+72>>2]=1.0/+(e|0)*i;g[b+76>>2]=1.0/+(e|0)*h;g[b+80>>2]=1.0/+(e|0)*d;return}function _g(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0,j=0,k=0.0,m=0,n=0,o=0.0,p=0.0,q=0,r=0;n=l;l=l+16|0;if((f|0)>-3&(f+3|0)>-1){c[6995]=(c[6995]|0)+1;a=sc((f+3<<4|3)+16|0)|0;if(!a)m=0;else{c[(a+4+15&-16)+-4>>2]=a;m=a+4+15&-16}a=0;do{j=m+(a<<4)|0;c[j>>2]=c[n>>2];c[j+4>>2]=c[n+4>>2];c[j+8>>2]=c[n+8>>2];c[j+12>>2]=c[n+12>>2];a=a+1|0}while((a|0)!=(f+3|0));i=0;j=m;while(1){if(!i)h=0.0;else{a=i;h=0.0;k=.5;while(1){h=(a&1|0)==0?h:h+k;a=a>>1;if(!a)break;else k=k*.5}}k=h*2.0+-1.0;o=(+(i<<1|0)*3.1415927410125732+3.1415927410125732)/+(f+3|0);p=+D(+(1.0-k*k));h=p*+G(+o);g[j>>2]=p*+F(+o);g[j+4>>2]=h;g[j+8>>2]=k;g[j+12>>2]=0.0;i=i+1|0;if((i|0)==(f+3|0)){j=m;i=m;break}else j=j+16|0}}else{j=0;i=0}if((f|0)>-3){a=0;do{r=j+(a<<4)|0;q=j+(a<<4)+4|0;m=j+(a<<4)+8|0;o=+g[q>>2]*+g[e+4>>2]+ +g[d+4>>2];p=+g[m>>2]*+g[e+8>>2]+ +g[d+8>>2];g[r>>2]=+g[r>>2]*+g[e>>2]+ +g[d>>2];g[q>>2]=o;g[m>>2]=p;g[j+(a<<4)+12>>2]=0.0;a=a+1|0}while((a|0)<(f+3|0))}a=ic(b,j,f+3|0,1)|0;if((j|0)==0|(i|0)==0){l=n;return a|0}c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);l=n;return a|0}function $g(a){a=a|0;var b=0,d=0,e=0,f=0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0;Dl(a+1028|0);if((c[a+812>>2]|0)<=0)return;f=0;do{p=c[a+820>>2]|0;q=p+(f*44|0)|0;d=c[p+(f*44|0)+8>>2]|0;e=c[p+(f*44|0)+12>>2]|0;b=c[p+(f*44|0)+16>>2]|0;m=+g[d+8>>2];n=+g[d+12>>2];o=+g[d+16>>2];i=+g[d+20>>2];u=+g[e+8>>2];j=u>2];k=r>2];l=s>2];h=t>2];j=t>2];k=s>2];l=r>2];h=u>2]|0;if(!b){c[6995]=(c[6995]|0)+1;b=sc(63)|0;if(!b)b=0;else{c[(b+4+15&-16)+-4>>2]=b;b=b+4+15&-16}d=b;e=d+44|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(e|0))}else c[a+1032>>2]=0;c[b+32>>2]=0;c[b+36>>2]=q;c[b+40>>2]=0;g[b>>2]=j;g[b+4>>2]=k;g[b+8>>2]=l;g[b+12>>2]=h;g[b+16>>2]=m;g[b+20>>2]=n;g[b+24>>2]=o;g[b+28>>2]=i;Pe(a+1028|0,c[a+1028>>2]|0,b);c[a+1040>>2]=(c[a+1040>>2]|0)+1;c[p+(f*44|0)+40>>2]=b;f=f+1|0}while((f|0)<(c[a+812>>2]|0));return}function ah(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;h=c[a+12>>2]|0;i=c[h+(((d+b|0)/2|0)<<4)>>2]|0;j=c[h+(((d+b|0)/2|0)<<4)+4>>2]|0;k=c[h+(((d+b|0)/2|0)<<4)+8>>2]|0;f=d;e=b;while(1){while(1){g=c[h+(e<<4)+4>>2]|0;if((g|0)>=(j|0)){if((g|0)!=(j|0))break;g=c[h+(e<<4)>>2]|0;if((g|0)>=(i|0)){if((g|0)!=(i|0))break;if((c[h+(e<<4)+8>>2]|0)>=(k|0))break}}e=e+1|0}while(1){g=c[h+(f<<4)+4>>2]|0;if((j|0)>=(g|0)){if((j|0)!=(g|0))break;g=c[h+(f<<4)>>2]|0;if((i|0)>=(g|0)){if((i|0)!=(g|0))break;if((k|0)>=(c[h+(f<<4)+8>>2]|0))break}}f=f+-1|0}if((e|0)<=(f|0)){g=h+(e<<4)|0;c[m>>2]=c[g>>2];c[m+4>>2]=c[g+4>>2];c[m+8>>2]=c[g+8>>2];c[m+12>>2]=c[g+12>>2];h=h+(f<<4)|0;c[g>>2]=c[h>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];c[g+12>>2]=c[h+12>>2];h=(c[a+12>>2]|0)+(f<<4)|0;c[h>>2]=c[m>>2];c[h+4>>2]=c[m+4>>2];c[h+8>>2]=c[m+8>>2];c[h+12>>2]=c[m+12>>2];f=f+-1|0;e=e+1|0}if((e|0)>(f|0))break;h=c[a+12>>2]|0}if((f|0)>(b|0))ah(a,b,f);if((e|0)>=(d|0)){l=m;return}ah(a,e,d);l=m;return}function bh(a,b,d,e,f,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var k=0.0,m=0.0,n=0,o=0.0,p=0.0,q=0,r=0,s=0.0,t=0;r=l;l=l+16|0;g[e>>2]=3402823466385288598117041.0e14;g[f>>2]=-3402823466385288598117041.0e14;q=c[a+8>>2]|0;if((q|0)>0){n=0;do{t=c[a+16>>2]|0;s=+g[t+(n<<4)>>2];p=+g[t+(n<<4)+4>>2];o=+g[t+(n<<4)+8>>2];k=s*+g[b>>2]+p*+g[b+4>>2]+o*+g[b+8>>2]+ +g[b+48>>2];m=s*+g[b+16>>2]+p*+g[b+20>>2]+o*+g[b+24>>2]+ +g[b+52>>2];o=s*+g[b+32>>2]+p*+g[b+36>>2]+o*+g[b+40>>2]+ +g[b+56>>2];p=k*+g[d>>2]+m*+g[d+4>>2]+o*+g[d+8>>2];if(p<+g[e>>2]){g[e>>2]=p;g[h>>2]=k;g[h+4>>2]=m;g[h+8>>2]=o;g[h+12>>2]=0.0}if(p>+g[f>>2]){g[f>>2]=p;g[i>>2]=k;g[i+4>>2]=m;g[i+8>>2]=o;g[i+12>>2]=0.0}n=n+1|0}while((n|0)!=(q|0));s=+g[f>>2];m=s;n=(g[j>>2]=s,c[j>>2]|0)}else{m=-3402823466385288598117041.0e14;n=-8388609}k=+g[e>>2];if(!(k>m)){l=r;return}c[e>>2]=n;g[f>>2]=k;c[r>>2]=c[h>>2];c[r+4>>2]=c[h+4>>2];c[r+8>>2]=c[h+8>>2];c[r+12>>2]=c[h+12>>2];c[h>>2]=c[i>>2];c[h+4>>2]=c[i+4>>2];c[h+8>>2]=c[i+8>>2];c[h+12>>2]=c[i+12>>2];c[i>>2]=c[r>>2];c[i+4>>2]=c[r+4>>2];c[i+8>>2]=c[r+8>>2];c[i+12>>2]=c[r+12>>2];l=r;return}function ch(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=c[a+548>>2]|0;if((f|0)<=0)return;g=c[a+556>>2]|0;d=0;while(1){if((c[g+(d<<2)>>2]|0)==(b|0))break;d=d+1|0;if((d|0)>=(f|0)){e=25;break}}if((e|0)==25)return;if((d|0)<(f|0))d=0;else return;while(1){if((c[g+(d<<2)>>2]|0)==(b|0))break;d=d+1|0;if((d|0)>=(f|0)){d=f;break}}if((f|0)>(d|0)){d=g+(d<<2)|0;e=c[d>>2]|0;c[d>>2]=c[g+(f+-1<<2)>>2];c[(c[a+556>>2]|0)+(f+-1<<2)>>2]=e;c[a+548>>2]=f+-1}g=c[b+28>>2]|0;b=c[b+32>>2]|0;if((g|0)==(a|0)){d=c[a+288>>2]|0;a:do if((d|0)>0){f=c[a+296>>2]|0;e=0;while(1){if((c[f+(e<<2)>>2]|0)==(b|0))break a;e=e+1|0;if((e|0)>=(d|0)){e=d;break}}}else e=d;while(0);if((d|0)>(e|0)){f=c[a+296>>2]|0;g=f+(e<<2)|0;b=c[g>>2]|0;c[g>>2]=c[f+(d+-1<<2)>>2];c[(c[a+296>>2]|0)+(d+-1<<2)>>2]=b;c[a+288>>2]=d+-1;d=d+-1|0}c[a+280>>2]=(d|0)>0&1;return}else{d=c[b+288>>2]|0;b:do if((d|0)>0){f=c[b+296>>2]|0;e=0;while(1){if((c[f+(e<<2)>>2]|0)==(g|0))break b;e=e+1|0;if((e|0)>=(d|0)){e=d;break}}}else e=d;while(0);if((d|0)>(e|0)){f=c[b+296>>2]|0;g=f+(e<<2)|0;a=c[g>>2]|0;c[g>>2]=c[f+(d+-1<<2)>>2];c[(c[b+296>>2]|0)+(d+-1<<2)>>2]=a;c[b+288>>2]=d+-1;d=d+-1|0}c[b+280>>2]=(d|0)>0&1;return}}function dh(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,h=0.0,i=0,j=0;j=c[a+28>>2]|0;i=0;e=0.0;f=0.0;h=0.0;a:while(1){switch(i|0){case 0:{e=+g[a+80>>2]+ +g[a+64>>2];f=+g[a+84>>2]+ +g[a+68>>2];h=+g[a+88>>2]+ +g[a+72>>2];break}case 1:{e=+g[a+80>>2]+ +g[a+64>>2];f=+g[a+84>>2]+ +g[a+68>>2];h=+g[a+72>>2]-+g[a+88>>2];break}case 2:{e=+g[a+80>>2]+ +g[a+64>>2];f=+g[a+68>>2]-+g[a+84>>2];h=+g[a+88>>2]+ +g[a+72>>2];break}case 3:{e=+g[a+80>>2]+ +g[a+64>>2];f=+g[a+68>>2]-+g[a+84>>2];h=+g[a+72>>2]-+g[a+88>>2];break}case 4:{e=+g[a+64>>2]-+g[a+80>>2];f=+g[a+84>>2]+ +g[a+68>>2];h=+g[a+88>>2]+ +g[a+72>>2];break}case 5:{e=+g[a+64>>2]-+g[a+80>>2];f=+g[a+84>>2]+ +g[a+68>>2];h=+g[a+72>>2]-+g[a+88>>2];break}case 6:{e=+g[a+64>>2]-+g[a+80>>2];f=+g[a+68>>2]-+g[a+84>>2];h=+g[a+88>>2]+ +g[a+72>>2];break}case 7:{e=+g[a+64>>2]-+g[a+80>>2];f=+g[a+68>>2]-+g[a+84>>2];h=+g[a+72>>2]-+g[a+88>>2];break}default:{}}if((j|0)>0){d=c[a+36>>2]|0;b=0;do{if(+g[d+(b*36|0)+32>>2]+(e*+g[d+(b*36|0)+20>>2]+f*+g[d+(b*36|0)+24>>2]+h*+g[d+(b*36|0)+28>>2])>0.0){b=0;d=16;break a}b=b+1|0}while((b|0)<(j|0))}i=i+1|0;if((i|0)>=8){b=1;d=16;break}}if((d|0)==16)return b|0;return 0}function eh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+32|0;j=(a[b+68>>0]|0)!=0;k=j?e:d;j=j?d:e;h=c[k+4>>2]|0;i=c[h+20>>2]|0;g=c[b+52>>2]|0;if((g|0)<(i|0)){if((c[b+56>>2]|0)<(i|0)){if(!i){d=0;f=g}else{c[6995]=(c[6995]|0)+1;d=sc((i<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=c[b+52>>2]|0}if((f|0)>0){e=0;do{c[d+(e<<2)>>2]=c[(c[b+60>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0))}e=c[b+60>>2]|0;if(e|0){if(a[b+64>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+60>>2]=0}a[b+64>>0]=1;c[b+60>>2]=d;c[b+56>>2]=i;e=b+60|0}else e=b+60|0;d=g;do{c[(c[e>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(i|0))}c[b+52>>2]=i;if((i|0)<=0){l=m;return}d=0;do{if(!(c[h+68>>2]|0)){e=c[(c[h+28>>2]|0)+(d*80|0)+64>>2]|0;f=c[k+8>>2]|0;g=c[k+12>>2]|0;c[m>>2]=k;c[m+4>>2]=e;c[m+8>>2]=f;c[m+12>>2]=g;c[m+16>>2]=-1;c[m+20>>2]=d;g=c[b+4>>2]|0;g=Db[c[(c[g>>2]|0)+8>>2]&1](g,m,j,c[b+72>>2]|0,1)|0;c[(c[b+60>>2]|0)+(d<<2)>>2]=g}else c[(c[b+60>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(i|0));l=m;return}function fh(a,b,e){a=a|0;b=b|0;e=e|0;fi(a,b,e)|0;c[b+52>>2]=c[a+48>>2];c[b+56>>2]=c[a+52>>2];c[b+60>>2]=c[a+56>>2];c[b+64>>2]=c[a+60>>2];c[b+68>>2]=c[a+64>>2];c[b+72>>2]=c[a+68>>2];c[b+76>>2]=c[a+72>>2];c[b+80>>2]=c[a+76>>2];c[b+84>>2]=c[a+80>>2];c[b+88>>2]=c[a+84>>2];c[b+92>>2]=c[a+88>>2];c[b+96>>2]=c[a+92>>2];c[b+100>>2]=c[a+96>>2];c[b+104>>2]=c[a+100>>2];c[b+108>>2]=c[a+104>>2];c[b+112>>2]=c[a+108>>2];c[b+116>>2]=c[a+112>>2];c[b+120>>2]=c[a+116>>2];c[b+124>>2]=c[a+120>>2];c[b+128>>2]=c[a+124>>2];c[b+132>>2]=c[a+128>>2];c[b+136>>2]=c[a+132>>2];c[b+140>>2]=c[a+136>>2];c[b+144>>2]=c[a+140>>2];c[b+148>>2]=c[a+144>>2];c[b+152>>2]=c[a+148>>2];c[b+156>>2]=c[a+152>>2];c[b+160>>2]=c[a+156>>2];c[b+164>>2]=c[a+160>>2];c[b+168>>2]=c[a+164>>2];c[b+172>>2]=c[a+168>>2];c[b+176>>2]=c[a+172>>2];c[b+228>>2]=c[a+868>>2];c[b+212>>2]=c[a+872>>2];c[b+196>>2]=c[a+680>>2];c[b+180>>2]=c[a+696>>2];c[b+232>>2]=c[a+932>>2];c[b+216>>2]=c[a+936>>2];c[b+200>>2]=c[a+684>>2];c[b+184>>2]=c[a+700>>2];c[b+236>>2]=c[a+996>>2];c[b+220>>2]=c[a+1e3>>2];c[b+204>>2]=c[a+688>>2];c[b+188>>2]=c[a+704>>2];c[b+244>>2]=d[a+1300>>0];c[b+248>>2]=d[a+1301>>0];return 12393}function gh(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;e=c[b+32>>2]|0;if(!e)f=0;else f=c[b+40>>2]|0;i=c[b+52>>2]|0;if(!i)g=0;else g=c[b+60>>2]|0;d=c[b+72>>2]|0;if(!d)h=0;else h=c[b+80>>2]|0;j=c[b+8>>2]|0;+wb[c[(c[j>>2]|0)+12>>2]&3](j,f,e,g,i,h,d,c[b+4>>2]|0,c[b+20>>2]|0,c[b+24>>2]|0);d=c[b+32>>2]|0;if((d|0)<0){if((c[b+36>>2]|0)<0){e=c[b+40>>2]|0;if(e|0){if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+40>>2]=0}a[b+44>>0]=1;c[b+40>>2]=0;c[b+36>>2]=0}do{c[(c[b+40>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=0)}c[b+32>>2]=0;d=c[b+52>>2]|0;if((d|0)<0){if((c[b+56>>2]|0)<0){e=c[b+60>>2]|0;if(e|0){if(a[b+64>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+60>>2]=0}a[b+64>>0]=1;c[b+60>>2]=0;c[b+56>>2]=0}do{c[(c[b+60>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=0)}c[b+52>>2]=0;d=c[b+72>>2]|0;if((d|0)>=0){c[b+72>>2]=0;return}if((c[b+76>>2]|0)<0){e=c[b+80>>2]|0;if(e|0){if(a[b+84>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+80>>2]=0}a[b+84>>0]=1;c[b+80>>2]=0;c[b+76>>2]=0}do{c[(c[b+80>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=0);c[b+72>>2]=0;return}function hh(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;c[6995]=(c[6995]|0)+1;d=sc(39)|0;if(!d)g=0;else{c[(d+4+15&-16)+-4>>2]=d;g=d+4+15&-16}h=g;c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0;if((c[b+932>>2]|0)>0){i=c[c[b+940>>2]>>2]|0;c[g>>2]=c[i>>2];c[g+4>>2]=c[i+4>>2];c[g+8>>2]=c[i+8>>2];c[g+12>>2]=c[i+12>>2];c[g+16>>2]=c[i+16>>2]}else{c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0}e=c[b+932>>2]|0;if((e|0)!=(c[b+936>>2]|0)){i=e;f=b+940|0;f=c[f>>2]|0;f=f+(i<<2)|0;c[f>>2]=h;i=i+1|0;c[b+932>>2]=i;return g|0}i=e|0?e<<1:1;if((e|0)>=(i|0)){i=e;f=b+940|0;f=c[f>>2]|0;f=f+(i<<2)|0;c[f>>2]=h;i=i+1|0;c[b+932>>2]=i;return g|0}if(!i)d=0;else{c[6995]=(c[6995]|0)+1;d=sc((i<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}e=c[b+932>>2]|0}if((e|0)>0){f=0;do{c[d+(f<<2)>>2]=c[(c[b+940>>2]|0)+(f<<2)>>2];f=f+1|0}while((f|0)!=(e|0))}f=c[b+940>>2]|0;if(f){if(a[b+944>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);e=c[b+932>>2]|0}c[b+940>>2]=0}a[b+944>>0]=1;c[b+940>>2]=d;c[b+936>>2]=i;i=e;f=b+940|0;f=c[f>>2]|0;f=f+(i<<2)|0;c[f>>2]=h;i=i+1|0;c[b+932>>2]=i;return g|0}function ih(b,d){b=b|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;e=c[b+4>>2]|0;if((e|0)==(c[b+8>>2]|0)){Of(b,e|0?e<<1:1);e=c[b+4>>2]|0}o=c[b+12>>2]|0;j=o+(e*36|0)+16|0;a[j>>0]=1;k=o+(e*36|0)+12|0;c[k>>2]=0;n=o+(e*36|0)+4|0;c[n>>2]=0;l=o+(e*36|0)+8|0;c[l>>2]=0;p=c[d+4>>2]|0;if((p|0)<=0){c[n>>2]=p;p=o+(e*36|0)+20|0;d=d+20|0;c[p>>2]=c[d>>2];c[p+4>>2]=c[d+4>>2];c[p+8>>2]=c[d+8>>2];c[p+12>>2]=c[d+12>>2];d=c[b+4>>2]|0;d=d+1|0;c[b+4>>2]=d;return}c[6995]=(c[6995]|0)+1;f=sc((p<<2|3)+16|0)|0;if(!f)g=0;else{c[(f+4+15&-16)+-4>>2]=f;g=f+4+15&-16}h=c[n>>2]|0;i=c[k>>2]|0;if((h|0)<=0){if(i|0)m=10}else{f=0;do{c[g+(f<<2)>>2]=c[i+(f<<2)>>2];f=f+1|0}while((f|0)!=(h|0));m=10}if((m|0)==10?a[j>>0]|0:0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}a[j>>0]=1;c[k>>2]=g;c[l>>2]=p;Yk(g|0,0,p<<2|0)|0;h=c[k>>2]|0;c[n>>2]=p;g=c[d+12>>2]|0;f=0;do{c[h+(f<<2)>>2]=c[g+(f<<2)>>2];f=f+1|0}while((f|0)!=(p|0));p=o+(e*36|0)+20|0;d=d+20|0;c[p>>2]=c[d>>2];c[p+4>>2]=c[d+4>>2];c[p+8>>2]=c[d+8>>2];c[p+12>>2]=c[d+12>>2];d=c[b+4>>2]|0;d=d+1|0;c[b+4>>2]=d;return}function jh(b,d){b=b|0;d=+d;var e=0,f=0,h=0,i=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0;e=c[b+248>>2]|0;if((e|0)<=0)return;k=(a[28564]|0)==0;j=0;do{i=c[(c[b+256>>2]|0)+(j<<2)>>2]|0;a:do if(i){f=c[i+220>>2]|0;b:do switch(f|0){case 4:case 2:{if((f|0)==4)break a;break}default:{o=+g[i+372>>2];n=+g[i+376>>2];m=+g[i+380>>2];l=+g[i+532>>2];if(o*o+n*n+m*m>2],m=+g[i+392>>2],n=+g[i+396>>2],o=+g[i+536>>2],l*l+m*m+n*n>2]=+g[i+224>>2]+d;break b}g[i+224>>2]=0.0;if((f&-2|0)!=4){c[i+220>>2]=0;f=0}}}while(0);h=f&-2;do if(k){if((h|0)!=2?!(+g[i+224>>2]>2.0):0)break;if(c[i+204>>2]&3|0){if((h|0)==4)break a;c[i+220>>2]=2;break a}if((f|0)==1){if((h|0)==4)break a;c[i+220>>2]=3;break a}else{if((f|0)!=2)break a;e=(c[i+304>>2]|0)+2|0;c[i+388>>2]=0;c[i+388+4>>2]=0;c[i+388+8>>2]=0;c[i+388+12>>2]=0;c[i+304>>2]=e;c[i+372>>2]=0;c[i+372+4>>2]=0;c[i+372+8>>2]=0;c[i+372+12>>2]=0;e=c[b+248>>2]|0;break a}}while(0);if((h|0)!=4)c[i+220>>2]=1}while(0);j=j+1|0}while((j|0)<(e|0));return}function kh(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,k=0,l=0,m=0.0,n=0,o=0,p=0.0,q=0.0;Vb[c[(c[a>>2]|0)+8>>2]&127](a,b,f,h);n=c[h>>2]|0;k=c[h+4>>2]|0;b=c[h+8>>2]|0;l=c[f>>2]|0;o=c[f+4>>2]|0;i=c[f+8>>2]|0;m=+g[d>>2];p=+g[d+4>>2];q=+g[d+8>>2];if(m>0.0)n=(g[j>>2]=(c[j>>2]=n,+g[j>>2])+m,c[j>>2]|0);else l=(g[j>>2]=(c[j>>2]=l,+g[j>>2])+m,c[j>>2]|0);if(p>0.0){d=o;k=(g[j>>2]=(c[j>>2]=k,+g[j>>2])+p,c[j>>2]|0)}else d=(g[j>>2]=(c[j>>2]=o,+g[j>>2])+p,c[j>>2]|0);if(q>0.0)b=(g[j>>2]=(c[j>>2]=b,+g[j>>2])+q,c[j>>2]|0);else i=(g[j>>2]=(c[j>>2]=i,+g[j>>2])+q,c[j>>2]|0);m=+g[e>>2];p=+g[e+4>>2];q=+g[e+8>>2];q=+D(+(m*m+p*p+q*q));q=q*+nb[c[(c[a>>2]|0)+16>>2]&15](a);c[f>>2]=l;c[f+4>>2]=d;c[f+8>>2]=i;g[f+12>>2]=0.0;c[h>>2]=n;c[h+4>>2]=k;c[h+8>>2]=b;g[h+12>>2]=0.0;g[f>>2]=+g[f>>2]-q;g[f+4>>2]=+g[f+4>>2]-q;g[f+8>>2]=+g[f+8>>2]-q;g[h>>2]=q+ +g[h>>2];g[h+4>>2]=q+ +g[h+4>>2];g[h+8>>2]=q+ +g[h+8>>2];return}function lh(b,d,e){b=b|0;d=+d;e=e|0;var f=0,h=0.0,i=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;j=c[b+772>>2]|0;if(e){if((j|0)>0){f=c[b+780>>2]|0;e=0;do{g[f+(e*104|0)+88>>2]=0.0;e=e+1|0}while((e|0)!=(j|0))}i=c[b+812>>2]|0;if((i|0)>0){f=c[b+820>>2]|0;e=0;do{m=c[f+(e*44|0)+8>>2]|0;l=c[f+(e*44|0)+12>>2]|0;k=c[f+(e*44|0)+16>>2]|0;o=+g[m+8>>2];q=+g[m+12>>2];h=+g[m+16>>2];n=+g[l+8>>2]-o;r=+g[l+12>>2]-q;p=+g[l+16>>2]-h;o=+g[k+8>>2]-o;q=+g[k+12>>2]-q;h=+g[k+16>>2]-h;h=+D(+((n*q-r*o)*(n*q-r*o)+((r*h-p*q)*(r*h-p*q)+(p*o-n*h)*(p*o-n*h))));g[m+88>>2]=h+ +g[m+88>>2];g[l+88>>2]=h+ +g[l+88>>2];g[k+88>>2]=h+ +g[k+88>>2];e=e+1|0}while((e|0)!=(i|0))}if((j|0)<=0){m=b+984|0;a[m>>0]=1;return}f=c[b+780>>2]|0;e=0;do{m=f+(e*104|0)+88|0;g[m>>2]=1.0/+g[m>>2];e=e+1|0}while((e|0)!=(j|0))}if((j|0)<=0){m=b+984|0;a[m>>0]=1;return}f=c[b+780>>2]|0;e=0;h=0.0;do{r=+g[f+(e*104|0)+88>>2];h=h+(r>0.0?1.0/r:0.0);e=e+1|0}while((e|0)!=(j|0));h=1.0/h*d;e=0;do{m=f+(e*104|0)+88|0;g[m>>2]=+g[m>>2]/h;e=e+1|0}while((e|0)!=(j|0));m=b+984|0;a[m>>0]=1;return}function mh(a,b){a=+a;b=+b;var d=0,e=0,f=0,h=0,i=0,k=0,l=0,m=0;l=(g[j>>2]=a,c[j>>2]|0);i=(g[j>>2]=b,c[j>>2]|0);a:do if((i<<1|0)!=0?!((l>>>23&255|0)==255|((QD(b)|0)&2147483647)>>>0>2139095040):0){if(l<<1>>>0<=i<<1>>>0)return +((l<<1|0)==(i<<1|0)?a*0.0:a);if(!(l>>>23&255)){if((l<<9|0)>-1){e=l<<9;d=0;do{d=d+-1|0;e=e<<1}while((e|0)>-1)}else d=0;e=l<<1-d}else{e=l&8388607|8388608;d=l>>>23&255}if(!(i>>>23&255)){if((i<<9|0)>-1){f=0;h=i<<9;do{f=f+-1|0;h=h<<1}while((h|0)>-1)}else f=0;k=f;i=i<<1-f}else{k=i>>>23&255;i=i&8388607|8388608}f=e-i|0;b:do if((d|0)>(k|0)){h=f;f=(f|0)>-1;while(1){if(f)if(!h)break;else e=h;e=e<<1;d=d+-1|0;f=e-i|0;if((d|0)>(k|0)){h=f;f=(f|0)>-1}else{h=(f|0)>-1;break b}}b=a*0.0;break a}else h=(f|0)>-1;while(0);if(h)if(!f){b=a*0.0;break}else e=f;if(e>>>0<8388608)do{e=e<<1;d=d+-1|0}while(e>>>0<8388608);if((d|0)>0)d=e+-8388608|d<<23;else d=e>>>(1-d|0);b=(c[j>>2]=d|l&-2147483648,+g[j>>2])}else m=3;while(0);if((m|0)==3)b=a*b/(a*b);return +b}function nh(b,e,f,h,i,j){b=b|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;var k=0;if((d[h+55>>0]|0|0)==(e|0)){h=0;return h|0}k=c[5288+(i<<2)>>2]|0;if(+g[h>>2]*+g[f+16>>2]+ +g[h+4>>2]*+g[f+20>>2]+ +g[h+8>>2]*+g[f+24>>2]-+g[h+16>>2]<-9.999999747378752e-06){e=lf(b,c[h+20+(k<<2)>>2]|0,c[h+20+(i<<2)>>2]|0,f,0)|0;if(!e){h=0;return h|0}a[e+52>>0]=i;c[e+32>>2]=h;a[h+52+i>>0]=0;c[h+32+(i<<2)>>2]=e;i=c[j>>2]|0;if(!i)c[j+4>>2]=e;else{a[i+53>>0]=2;c[i+36>>2]=e;a[e+54>>0]=1;c[e+40>>2]=i}c[j>>2]=e;c[j+8>>2]=(c[j+8>>2]|0)+1;h=1;return h|0}i=c[5300+(i<<2)>>2]|0;a[h+55>>0]=e;if(!(nh(b,e,f,c[h+32+(k<<2)>>2]|0,d[h+52+k>>0]|0,j)|0)){h=0;return h|0}if(!(nh(b,e,f,c[h+32+(i<<2)>>2]|0,d[h+52+i>>0]|0,j)|0)){h=0;return h|0}i=c[h+48>>2]|0;if(i|0)c[i+44>>2]=c[h+44>>2];i=c[h+44>>2]|0;if(i|0)c[i+48>>2]=c[h+48>>2];if((c[b+18496>>2]|0)==(h|0))c[b+18496>>2]=c[h+48>>2];c[b+18500>>2]=(c[b+18500>>2]|0)+-1;c[h+44>>2]=0;c[h+48>>2]=c[b+18504>>2];i=c[b+18504>>2]|0;if(i|0)c[i+44>>2]=h;c[b+18504>>2]=h;c[b+18508>>2]=(c[b+18508>>2]|0)+1;h=1;return h|0}function oh(a,b,d,e,f,h,i,j,k,m){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0.0,o=0.0;a=l;l=l+80|0;o=+g[h+52>>2]-+g[f+52>>2];n=+g[h+56>>2]-+g[f+56>>2];g[a+56>>2]=+g[h+48>>2]-+g[f+48>>2];g[a+56+4>>2]=o;g[a+56+8>>2]=n;g[a+56+12>>2]=0.0;if(Hc(d,f,e,h,a+56|0,a,1)|0){c[j>>2]=c[a+4>>2];c[j+4>>2]=c[a+4+4>>2];c[j+8>>2]=c[a+4+8>>2];c[j+12>>2]=c[a+4+12>>2];c[k>>2]=c[a+20>>2];c[k+4>>2]=c[a+20+4>>2];c[k+8>>2]=c[a+20+8>>2];c[k+12>>2]=c[a+20+12>>2];c[i>>2]=c[a+36>>2];c[i+4>>2]=c[a+36+4>>2];c[i+8>>2]=c[a+36+8>>2];c[i+12>>2]=c[a+36+12>>2];k=1;l=a;return k|0}if(!(Gd(d,f,e,h,a+56|0,a)|0)){k=0;l=a;return k|0}c[j>>2]=c[a+4>>2];c[j+4>>2]=c[a+4+4>>2];c[j+8>>2]=c[a+4+8>>2];c[j+12>>2]=c[a+4+12>>2];c[k>>2]=c[a+20>>2];c[k+4>>2]=c[a+20+4>>2];c[k+8>>2]=c[a+20+8>>2];c[k+12>>2]=c[a+20+12>>2];c[i>>2]=c[a+36>>2];c[i+4>>2]=c[a+36+4>>2];c[i+8>>2]=c[a+36+8>>2];c[i+12>>2]=c[a+36+12>>2];k=0;l=a;return k|0}function ph(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0,j=0,k=0,m=0.0,n=0.0,o=0,p=0,q=0.0,r=0;p=l;l=l+2048|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;e=+g[d>>2];h=+g[d+4>>2];f=+g[d+8>>2];if(e*e+h*h+f*f<9.999999747378752e-05){n=1.0;m=0.0;h=0.0}else{q=1.0/+D(+(e*e+h*h+f*f));n=e*q;m=h*q;h=f*q}if((xb[c[(c[b>>2]|0)+96>>2]&127](b)|0)<=0){l=p;return}k=0;f=-999999984306749440.0;while(1){if(((xb[c[(c[b>>2]|0)+96>>2]&127](b)|0)-k|0)<128){d=(xb[c[(c[b>>2]|0)+96>>2]&127](b)|0)-k|0;if((d|0)>0)o=8;else{e=-3402823466385288598117041.0e14;d=-1}}else{d=128;o=8}if((o|0)==8){o=0;i=0;do{Sb[c[(c[b>>2]|0)+108>>2]&127](b,i,p+(i<<4)|0);i=i+1|0}while((i|0)!=(d|0));i=-1;j=0;e=-3402823466385288598117041.0e14;do{q=n*+g[p+(j<<4)>>2]+m*+g[p+(j<<4)+4>>2]+h*+g[p+(j<<4)+8>>2];r=q>e;i=r?j:i;e=r?q:e;j=j+1|0}while((j|0)!=(d|0));d=i}if(e>f){r=p+(d<<4)|0;c[a>>2]=c[r>>2];c[a+4>>2]=c[r+4>>2];c[a+8>>2]=c[r+8>>2];c[a+12>>2]=c[r+12>>2]}else e=f;k=k+128|0;if((k|0)>=(xb[c[(c[b>>2]|0)+96>>2]&127](b)|0))break;else f=e}l=p;return}function qh(b){b=b|0;var d=0,e=0.0,f=0,h=0,i=0.0,j=0.0,k=0;k=l;l=l+64|0;if(!(a[b+290>>0]|0)){d=c[b+248>>2]|0;if((d|0)<=0){l=k;return}h=0;do{f=c[(c[b+256>>2]|0)+(h<<2)>>2]|0;switch(c[f+220>>2]|0){case 2:case 5:break;default:if((c[f+540>>2]|0)!=0?(c[f+204>>2]&3|0)==0:0){e=+g[b+280>>2];if((a[b+316>>0]|0)!=0?(j=+g[b+284>>2],j!=0.0):0)e=e-j;else e=e*+g[f+268>>2];Af(f+68|0,+g[f+132>>2],+g[f+136>>2],+g[f+140>>2],f+148|0,e,k);d=c[f+540>>2]|0;Ob[c[(c[d>>2]|0)+12>>2]&127](d,k);d=c[b+248>>2]|0}}h=h+1|0}while((h|0)<(d|0));l=k;return}else{d=c[b+8>>2]|0;if((d|0)<=0){l=k;return}h=0;do{f=c[(c[b+16>>2]|0)+(h<<2)>>2]|0;if((!((f|0)==0?1:(c[f+252>>2]&2|0)==0)?(c[f+540>>2]|0)!=0:0)?(c[f+204>>2]&3|0)==0:0){e=+g[b+280>>2];if((a[b+316>>0]|0)!=0?(i=+g[b+284>>2],i!=0.0):0)e=e-i;else e=e*+g[f+268>>2];Af(f+68|0,+g[f+132>>2],+g[f+136>>2],+g[f+140>>2],f+148|0,e,k);d=c[f+540>>2]|0;Ob[c[(c[d>>2]|0)+12>>2]&127](d,k);d=c[b+8>>2]|0}h=h+1|0}while((h|0)<(d|0));l=k;return}}function rh(b,d){b=b|0;d=d|0;var e=0,f=0,h=0.0,i=0,j=0,k=0.0,l=0.0;e=c[d+204>>2]|0;if((e&3|0)==0?(c[d+564>>2]&1|0)==0:0){h=+g[d+404>>2];if(h!=0.0){l=1.0/h*+g[b+268>>2];k=1.0/h*+g[b+272>>2];g[d+424>>2]=1.0/h*+g[b+264>>2];g[d+428>>2]=l;g[d+432>>2]=k;g[d+436>>2]=0.0}c[d+440>>2]=c[b+264>>2];c[d+440+4>>2]=c[b+264+4>>2];c[d+440+8>>2]=c[b+264+8>>2];c[d+440+12>>2]=c[b+264+12>>2]}if(!(c[d+192>>2]|0))return;if(e&1){if((c[d+220>>2]&-2|0)!=4)c[d+220>>2]=2}else{f=c[b+248>>2]|0;if((f|0)==(c[b+252>>2]|0)?(j=f|0?f<<1:1,(f|0)<(j|0)):0){if(!j)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((j<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[b+248>>2]|0}if((f|0)>0){i=0;do{c[e+(i<<2)>>2]=c[(c[b+256>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(f|0))}i=c[b+256>>2]|0;if(i){if(a[b+260>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);f=c[b+248>>2]|0}c[b+256>>2]=0}a[b+260>>0]=1;c[b+256>>2]=e;c[b+252>>2]=j;e=c[d+204>>2]|0}c[(c[b+256>>2]|0)+(f<<2)>>2]=d;c[b+248>>2]=f+1}j=(e&3|0)==0;Vb[c[(c[b>>2]|0)+36>>2]&127](b,d,j?1:2,j?-1:-3);return}function sh(a,d,f,g){a=a|0;d=d|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;i=c[a+68+(d<<2)>>2]|0;j=b[i+((f&65535)<<2)+-4>>1]|0;if((e[i+((f&65535)<<2)>>1]|0)>=(j&65535))return;k=c[a+60>>2]|0;m=k+((e[i+((f&65535)<<2)+2>>1]|0)<<6)+54+(d<<1)|0;h=i+((f&65535)<<2)+-4|0;l=i+((f&65535)<<2)|0;while(1){i=e[l+-2>>1]|0;if(!(j&1)){f=e[l+2>>1]|0;if(((((e[k+(f<<6)+54+((1<>1]|0)>=(e[k+(i<<6)+48+((1<>1]|0)?(e[k+(i<<6)+54+((1<>1]|0)>=(e[k+(f<<6)+48+((1<>1]|0):0)?(e[k+(f<<6)+54+((1<<(1<>1]|0)>=(e[k+(i<<6)+48+((1<<(1<>1]|0):0)?(e[k+(i<<6)+54+((1<<(1<>1]|0)>=(e[k+(f<<6)+48+((1<<(1<>1]|0):0)?(p=c[a+92>>2]|0,n=k+(f<<6)|0,o=k+(i<<6)|0,Cb[c[(c[p>>2]|0)+12>>2]&31](p,n,o,g)|0,p=c[a+96>>2]|0,p|0):0)Cb[c[(c[p>>2]|0)+12>>2]&31](p,n,o,g)|0;f=k+(i<<6)+48+(d<<1)|0}else f=k+(i<<6)+54+(d<<1)|0;b[f>>1]=(b[f>>1]|0)+1<<16>>16;b[m>>1]=(b[m>>1]|0)+-1<<16>>16;f=e[l>>1]|e[l+2>>1]<<16;j=e[h>>1]|e[h+2>>1]<<16;b[l>>1]=j;b[l+2>>1]=j>>>16;b[h>>1]=f;b[h+2>>1]=f>>>16;f=l+-4|0;h=h+-4|0;j=b[h>>1]|0;if((e[f>>1]|0)>=(j&65535))break;l=f;k=c[a+60>>2]|0}return}function th(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0.0,j=0,k=0,l=0,m=0.0,n=0.0;h=c[d+204>>2]|0;if((h&3|0)==0?(c[d+564>>2]&1|0)==0:0){i=+g[d+404>>2];if(i!=0.0){n=1.0/i*+g[b+268>>2];m=1.0/i*+g[b+272>>2];g[d+424>>2]=1.0/i*+g[b+264>>2];g[d+428>>2]=n;g[d+432>>2]=m;g[d+436>>2]=0.0}c[d+440>>2]=c[b+264>>2];c[d+440+4>>2]=c[b+264+4>>2];c[d+440+8>>2]=c[b+264+8>>2];c[d+440+12>>2]=c[b+264+12>>2]}if(!(c[d+192>>2]|0))return;if(h&1){if((c[d+220>>2]&-2|0)!=4)c[d+220>>2]=2}else{h=c[b+248>>2]|0;if((h|0)==(c[b+252>>2]|0)?(l=h|0?h<<1:1,(h|0)<(l|0)):0){if(!l)k=0;else{c[6995]=(c[6995]|0)+1;h=sc((l<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}k=h;h=c[b+248>>2]|0}if((h|0)>0){j=0;do{c[k+(j<<2)>>2]=c[(c[b+256>>2]|0)+(j<<2)>>2];j=j+1|0}while((j|0)!=(h|0))}j=c[b+256>>2]|0;if(j){if(a[b+260>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);h=c[b+248>>2]|0}c[b+256>>2]=0}a[b+260>>0]=1;c[b+256>>2]=k;c[b+252>>2]=l}c[(c[b+256>>2]|0)+(h<<2)>>2]=d;c[b+248>>2]=h+1}Vb[c[(c[b>>2]|0)+36>>2]&127](b,d,e,f);return}function uh(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;var h=0,i=0,j=0.0,k=0,l=0.0;l=+g[d>>2];if(+g[b>>2]<=l){j=+g[d+4>>2];if((((+g[b+4>>2]<=j?+g[b+8>>2]<=+g[d+8>>2]:0)?+g[b+16>>2]>=+g[d+16>>2]:0)?+g[b+20>>2]>=+g[d+20>>2]:0)?+g[b+24>>2]>=+g[d+24>>2]:0){d=0;return d|0}else h=d+4|0}else{h=d+4|0;j=+g[d+4>>2]}g[d>>2]=l-f;g[h>>2]=j-f;g[d+8>>2]=+g[d+8>>2]-f;g[d+16>>2]=+g[d+16>>2]+f;g[d+20>>2]=+g[d+20>>2]+f;g[d+24>>2]=+g[d+24>>2]+f;l=+g[e>>2];k=l>0.0?d+16|0:d;g[k>>2]=l+ +g[k>>2];l=+g[e+4>>2];h=l>0.0?d+20|0:h;g[h>>2]=l+ +g[h>>2];l=+g[e+8>>2];h=l>0.0?d+24|0:d+8|0;g[h>>2]=l+ +g[h>>2];h=Ag(a,b)|0;a:do if(h){k=c[a+8>>2]|0;if((k|0)<=-1){h=c[a>>2]|0;break}if(k){e=0;while(1){i=c[h+32>>2]|0;e=e+1|0;if(!i)break a;if((e|0)>=(k|0)){h=i;break}else h=i}}}else h=0;while(0);c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];c[b+24>>2]=c[d+24>>2];c[b+28>>2]=c[d+28>>2];Pe(a,h,b);d=1;return d|0}function vh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,D=0.0,E=0.0,F=0.0,G=0.0;o=(+g[a+36>>2]-+g[a+20>>2])*.5;l=(+g[a+40>>2]-+g[a+24>>2])*.5;i=(+g[a+44>>2]-+g[a+28>>2])*.5;n=+nb[c[(c[a>>2]|0)+48>>2]&15](a);k=+nb[c[(c[a>>2]|0)+48>>2]&15](a);i=i+ +nb[c[(c[a>>2]|0)+48>>2]&15](a);B=(+g[a+36>>2]+ +g[a+20>>2])*.5;z=(+g[a+40>>2]+ +g[a+24>>2])*.5;x=(+g[a+44>>2]+ +g[a+28>>2])*.5;G=+g[b>>2];w=+C(+G);F=+g[b+4>>2];v=+C(+F);t=+g[b+8>>2];u=+C(+t);E=+g[b+16>>2];s=+C(+E);D=+g[b+20>>2];r=+C(+D);p=+g[b+24>>2];q=+C(+p);A=+g[b+32>>2];m=+C(+A);y=+g[b+36>>2];j=+C(+y);f=+g[b+40>>2];h=+C(+f);t=B*G+z*F+x*t+ +g[b+48>>2];p=B*E+z*D+x*p+ +g[b+52>>2];f=B*A+z*y+x*f+ +g[b+56>>2];g[d>>2]=t-((o+n)*w+(l+k)*v+i*u);g[d+4>>2]=p-((o+n)*s+(l+k)*r+i*q);g[d+8>>2]=f-((o+n)*m+(l+k)*j+i*h);g[d+12>>2]=0.0;g[e>>2]=(o+n)*w+(l+k)*v+i*u+t;g[e+4>>2]=(o+n)*s+(l+k)*r+i*q+p;g[e+8>>2]=(o+n)*m+(l+k)*j+i*h+f;g[e+12>>2]=0.0;return}function wh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,D=0.0,E=0.0,F=0.0,G=0,H=0.0,I=0.0;I=+g[a+52>>2];z=+g[a+36>>2];H=+g[a+56>>2];x=+g[a+40>>2];F=+g[a+60>>2];v=+g[a+44>>2];G=(c[a+20>>2]|0)==0;m=+nb[c[(c[a>>2]|0)+48>>2]&15](a);k=+nb[c[(c[a>>2]|0)+48>>2]&15](a);i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);m=(G?0.0:(I-z)*.5)+m;k=(G?0.0:(H-x)*.5)+k;i=(G?0.0:(F-v)*.5)+i;E=+g[b>>2];u=+C(+E);D=+g[b+4>>2];t=+C(+D);r=+g[b+8>>2];s=+C(+r);B=+g[b+16>>2];q=+C(+B);A=+g[b+20>>2];p=+C(+A);n=+g[b+24>>2];o=+C(+n);y=+g[b+32>>2];l=+C(+y);w=+g[b+36>>2];j=+C(+w);f=+g[b+40>>2];h=+C(+f);z=G?0.0:(I+z)*.5;x=G?0.0:(H+x)*.5;v=G?0.0:(F+v)*.5;r=z*E+x*D+v*r+ +g[b+48>>2];n=z*B+x*A+v*n+ +g[b+52>>2];f=z*y+x*w+v*f+ +g[b+56>>2];g[d>>2]=r-(m*u+k*t+i*s);g[d+4>>2]=n-(m*q+k*p+i*o);g[d+8>>2]=f-(m*l+k*j+i*h);g[d+12>>2]=0.0;g[e>>2]=m*u+k*t+i*s+r;g[e+4>>2]=m*q+k*p+i*o+n;g[e+8>>2]=m*l+k*j+i*h+f;g[e+12>>2]=0.0;return}function xh(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=c[a+68+(d<<2)>>2]|0;k=c[a+60>>2]|0;l=e[h+((f&65535)<<2)+2>>1]|0;i=b[h+((f&65535)<<2)+-4>>1]|0;if((e[h+((f&65535)<<2)>>1]|0)>=(i&65535))return;g=h+((f&65535)<<2)+-4|0;j=h+((f&65535)<<2)|0;h=k;while(1){f=e[j+-2>>1]|0;if(!(i&1))f=h+(f<<6)+48+(d<<1)|0;else{if(((((e[k+(l<<6)+54+((1<>1]|0)>=(e[h+(f<<6)+48+((1<>1]|0)?(e[h+(f<<6)+54+((1<>1]|0)>=(e[k+(l<<6)+48+((1<>1]|0):0)?(e[k+(l<<6)+54+((1<<(1<>1]|0)>=(e[h+(f<<6)+48+((1<<(1<>1]|0):0)?(e[h+(f<<6)+54+((1<<(1<>1]|0)>=(e[k+(l<<6)+48+((1<<(1<>1]|0):0)?(n=c[a+92>>2]|0,m=h+(f<<6)|0,Bb[c[(c[n>>2]|0)+8>>2]&63](n,k+(l<<6)|0,m)|0,n=c[a+96>>2]|0,n|0):0)Bb[c[(c[n>>2]|0)+8>>2]&63](n,k+(l<<6)|0,m)|0;f=h+(f<<6)+54+(d<<1)|0}b[f>>1]=(b[f>>1]|0)+1<<16>>16;b[k+(l<<6)+48+(d<<1)>>1]=(b[k+(l<<6)+48+(d<<1)>>1]|0)+-1<<16>>16;f=e[j>>1]|e[j+2>>1]<<16;i=e[g>>1]|e[g+2>>1]<<16;b[j>>1]=i;b[j+2>>1]=i>>>16;b[g>>1]=f;b[g+2>>1]=f>>>16;f=j+-4|0;g=g+-4|0;i=b[g>>1]|0;if((e[f>>1]|0)>=(i&65535))break;j=f;h=c[a+60>>2]|0}return}function yh(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0,h=0,i=0,j=0,k=0;f=l;l=l+16|0;d=+g[(gJ(a)|0)>>2];e=+g[(OI(a+16|0)|0)>>2];c=+g[(NI(a+32|0)|0)>>2];if(d+e+c>0.0){e=+VI(d+e+c+1.0);g[f+12>>2]=e*.5;d=+g[(OI(a+32|0)|0)>>2];g[f>>2]=(d-+g[(NI(a+16|0)|0)>>2])*(.5/e);d=+g[(NI(a)|0)>>2];g[f+4>>2]=(d-+g[(gJ(a+32|0)|0)>>2])*(.5/e);d=+g[(gJ(a+16|0)|0)>>2];g[f+8>>2]=(d-+g[(OI(a)|0)>>2])*(.5/e);i=f+4|0;h=f+8|0;a=f+12|0;j=f;as(b,j,i,h,a);l=f;return}else{h=(d>2];k=gJ(a+((((h+1|0)>>>0)%3|0)<<4)|0)|0;e=e-+g[k+((((h+1|0)>>>0)%3|0)<<2)>>2];j=gJ(a+((((h+2|0)>>>0)%3|0)<<4)|0)|0;e=+VI(e-+g[j+((((h+2|0)>>>0)%3|0)<<2)>>2]+1.0);g[f+(h<<2)>>2]=e*.5;g[f+12>>2]=(+g[j+((((h+1|0)>>>0)%3|0)<<2)>>2]-+g[k+((((h+2|0)>>>0)%3|0)<<2)>>2])*(.5/e);g[f+((((h+1|0)>>>0)%3|0)<<2)>>2]=(+g[k+(h<<2)>>2]+ +g[i+((((h+1|0)>>>0)%3|0)<<2)>>2])*(.5/e);g[f+((((h+2|0)>>>0)%3|0)<<2)>>2]=(+g[j+(h<<2)>>2]+ +g[i+((((h+2|0)>>>0)%3|0)<<2)>>2])*(.5/e);h=f+4|0;i=f+8|0;j=f+12|0;a=f;as(b,a,h,i,j);l=f;return}}function zh(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0;j=xb[c[(c[b>>2]|0)+28>>2]&127](b)|0;i=+g[j>>2]-+g[d>>2];h=+g[j+4>>2]-+g[d+4>>2];f=+g[j+8>>2]-+g[d+8>>2];if(!(i*i+h*h+f*f>1.1920928955078125e-07))return;Yg(b,d);if((a[b+65>>0]|0)!=0?(e=c[b+56>>2]|0,Ib[c[c[e>>2]>>2]&511](e),e=c[b+56>>2]|0,(e|0)!=0):0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);e=b+56|0}else e=b+56|0;c[6995]=(c[6995]|0)+1;d=sc(191)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}c[d+52>>2]=287;a[d+60>>0]=0;a[d+80>>0]=1;c[d+76>>2]=0;c[d+68>>2]=0;c[d+72>>2]=0;a[d+100>>0]=1;c[d+96>>2]=0;c[d+88>>2]=0;c[d+92>>2]=0;a[d+120>>0]=1;c[d+116>>2]=0;c[d+108>>2]=0;c[d+112>>2]=0;a[d+140>>0]=1;c[d+136>>2]=0;c[d+128>>2]=0;c[d+132>>2]=0;c[d+144>>2]=0;a[d+164>>0]=1;c[d+160>>2]=0;c[d+152>>2]=0;c[d+156>>2]=0;c[d+168>>2]=0;c[d+4>>2]=-8388609;c[d+8>>2]=-8388609;c[d+12>>2]=-8388609;g[d+16>>2]=0.0;c[d+20>>2]=2139095039;c[d+24>>2]=2139095039;c[d+28>>2]=2139095039;g[d+32>>2]=0.0;c[d>>2]=8324;c[e>>2]=d;dd(d,c[b+52>>2]|0,(a[b+64>>0]|0)!=0,b+20|0,b+36|0);a[b+65>>0]=1;return}function Ah(b,d){b=b|0;d=d|0;var e=0.0,f=0.0;if(a[b+1309>>0]|0){e=(+g[b+1256>>2]-+g[b+1316>>2])*+g[b+1340>>2];g[b+792>>2]=e*(+g[d>>2]*+g[b+1364>>2]/+(c[d+44>>2]|0));e=+C(+e);g[b+808>>2]=e/+g[d>>2]}if(a[b+1310>>0]|0){e=(+g[b+1260>>2]-+g[b+1320>>2])*+g[b+1344>>2];g[b+796>>2]=e*(+g[d>>2]*+g[b+1368>>2]/+(c[d+44>>2]|0));e=+C(+e);g[b+812>>2]=e/+g[d>>2]}if(a[b+1311>>0]|0){e=(+g[b+1264>>2]-+g[b+1324>>2])*+g[b+1348>>2];g[b+800>>2]=e*(+g[d>>2]*+g[b+1372>>2]/+(c[d+44>>2]|0));e=+C(+e);g[b+816>>2]=e/+g[d>>2]}if(a[b+1312>>0]|0){f=-((+g[b+1192>>2]-+g[b+1328>>2])*+g[b+1352>>2]);e=+g[d>>2];g[b+876>>2]=e*+g[b+1376>>2]/+(c[d+44>>2]|0)*f;g[b+880>>2]=+C(+f)/e}if(a[b+1313>>0]|0){e=-((+g[b+1196>>2]-+g[b+1332>>2])*+g[b+1356>>2]);f=+g[d>>2];g[b+940>>2]=f*+g[b+1380>>2]/+(c[d+44>>2]|0)*e;g[b+944>>2]=+C(+e)/f}if(!(a[b+1314>>0]|0)){gg(b,d);return}e=-((+g[b+1200>>2]-+g[b+1336>>2])*+g[b+1360>>2]);f=+g[d>>2];g[b+1004>>2]=f*+g[b+1384>>2]/+(c[d+44>>2]|0)*e;g[b+1008>>2]=+C(+e)/f;gg(b,d);return}function Bh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0.0,i=0.0,j=0.0;e=l;l=l+160|0;c[e+136>>2]=0;c[e+136+4>>2]=0;c[e+136+8>>2]=0;c[e+136+12>>2]=0;c[e+136+16>>2]=0;c[e+32>>2]=7356;f=e+32+4|0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[e+32+20>>2]=1065353216;c[e+32+24>>2]=0;c[e+32+24+4>>2]=0;c[e+32+24+8>>2]=0;c[e+32+24+12>>2]=0;c[e+32+40>>2]=1065353216;c[e+32+44>>2]=0;c[e+32+44+4>>2]=0;c[e+32+44+8>>2]=0;c[e+32+44+12>>2]=0;c[e+32+60>>2]=1065353216;c[e+32+64>>2]=0;c[e+32+68>>2]=c[e+136+4>>2];c[e+32+68+4>>2]=c[e+136+4+4>>2];c[e+32+68+8>>2]=c[e+136+4+8>>2];c[e+32+68+12>>2]=c[e+136+4+12>>2];g[e+32+84>>2]=-999999984306749440.0;j=+g[d>>2];i=+g[d+4>>2];h=+g[d+8>>2];g[e+32+88>>2]=j+i*0.0+h*0.0;g[e+32+92>>2]=j*0.0+i+h*0.0;g[e+32+96>>2]=j*0.0+i*0.0+h;g[e+32+100>>2]=0.0;c[e+16>>2]=1566444395;c[e+16+4>>2]=1566444395;c[e+16+8>>2]=1566444395;g[e+16+12>>2]=0.0;d=c[(c[b>>2]|0)+64>>2]|0;g[e>>2]=-999999984306749440.0;g[e+4>>2]=-999999984306749440.0;g[e+8>>2]=-999999984306749440.0;g[e+12>>2]=0.0;Vb[d&127](b,e+32|0,e,e+16|0);c[a>>2]=c[f>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];l=e;return}function Ch(a,b,d,e,f,h,i,j,k,m){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;h=+h;i=+i;j=+j;k=+k;m=+m;var n=0;n=l;l=l+128|0;c[n+80>>2]=c[a+4>>2];c[n+80+4>>2]=c[a+20>>2];c[n+80+8>>2]=c[a+36>>2];g[n+80+12>>2]=0.0;c[n+80+16>>2]=c[a+8>>2];c[n+80+20>>2]=c[a+24>>2];c[n+80+24>>2]=c[a+40>>2];g[n+80+28>>2]=0.0;c[n+80+32>>2]=c[a+12>>2];c[n+80+36>>2]=c[a+28>>2];c[n+80+40>>2]=c[a+44>>2];g[n+80+44>>2]=0.0;c[n+32>>2]=c[b+4>>2];c[n+32+4>>2]=c[b+20>>2];c[n+32+8>>2]=c[b+36>>2];g[n+32+12>>2]=0.0;c[n+32+16>>2]=c[b+8>>2];c[n+32+20>>2]=c[b+24>>2];c[n+32+24>>2]=c[b+40>>2];g[n+32+28>>2]=0.0;c[n+32+32>>2]=c[b+12>>2];c[n+32+36>>2]=c[b+28>>2];c[n+32+40>>2]=c[b+44>>2];g[n+32+44>>2]=0.0;h=h-+g[a+56>>2];i=i-+g[a+60>>2];g[n+16>>2]=f-+g[a+52>>2];g[n+16+4>>2]=h;g[n+16+8>>2]=i;g[n+16+12>>2]=0.0;i=k-+g[b+56>>2];m=m-+g[b+60>>2];g[n>>2]=j-+g[b+52>>2];g[n+4>>2]=i;g[n+8>>2]=m;g[n+12>>2]=0.0;Rg(d,n+80|0,n+32|0,n+16|0,n,e,a+456|0,+g[a+404>>2],b+456|0,+g[b+404>>2]);l=n;return}function Dh(b,d){b=b|0;d=d|0;var e=0.0,f=0,h=0.0,i=0.0,k=0,l=0.0,m=0.0;if(a[b+48>>0]|0){c[d>>2]=0;c[d+4>>2]=0;return}c[d>>2]=4;c[d+4>>2]=2;Zc(b,(c[b+28>>2]|0)+4|0,(c[b+32>>2]|0)+4|0);g[b+1088>>2]=0.0;a[b+297>>0]=0;e=+g[b+192>>2];h=+g[b+196>>2];do if(!(e<=h))k=0;else{m=+g[b+892>>2];l=+g[b+908>>2];i=+g[b+924>>2];i=+Xj(+L(+(+g[b+832>>2]*m+ +g[b+848>>2]*l+ +g[b+864>>2]*i),+(+g[b+828>>2]*m+ +g[b+844>>2]*l+ +g[b+860>>2]*i)),e,h);g[b+1084>>2]=i;if(!(ih)e=h;else{k=0;break}g[b+1088>>2]=i-e;a[b+297>>0]=1;k=1}while(0);a[b+296>>0]=0;f=c[b+1032>>2]|0;c[b+1080>>2]=f;e=+g[b+184>>2];h=+g[b+188>>2];i=(c[j>>2]=f,+g[j>>2]);do if(!(e<=h))f=10;else{if(!(i>h)){if(!(i>2]=i-e;a[b+296>>0]=1;f=12}while(0);if((f|0)==10?(g[b+1032>>2]=0.0,a[b+1096>>0]|0):0)f=12;if((f|0)==12){c[d>>2]=(c[d>>2]|0)+1;c[d+4>>2]=(c[d+4>>2]|0)+-1}if(k<<24>>24==0?(a[b+1112>>0]|0)==0:0)return;c[d>>2]=(c[d>>2]|0)+1;c[d+4>>2]=(c[d+4>>2]|0)+-1;return}function Eh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0,s=0,t=0.0,u=0,v=0,w=0;v=l;l=l+16|0;if((e|0)<=0){l=v;return}u=0;do{c[v>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;o=c[a+56>>2]|0;w=c[a+32+(o<<2)>>2]|0;c[v+(o<<2)>>2]=w;f=+g[v>>2];i=+g[v+4>>2];h=+g[v+8>>2];q=b+(u<<4)|0;p=+g[q>>2];r=b+(u<<4)+4|0;m=+g[r>>2];s=b+(u<<4)+8|0;k=+g[s>>2];n=(c[j>>2]=w,+g[j>>2]);if(f*p+i*m+h*k>-999999984306749440.0){o=c[v+12>>2]|0;g[d+(u<<4)>>2]=f;g[d+(u<<4)+4>>2]=i;g[d+(u<<4)+8>>2]=h;c[d+(u<<4)+12>>2]=o;o=c[a+56>>2]|0;t=f*p+i*m+h*k;n=+g[a+32+(o<<2)>>2];p=+g[q>>2];m=+g[r>>2];k=+g[s>>2]}else t=-999999984306749440.0;c[v>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;g[v+(o<<2)>>2]=-n;f=+g[v>>2];i=+g[v+4>>2];h=+g[v+8>>2];if(f*p+i*m+h*k>t){w=c[v+12>>2]|0;g[d+(u<<4)>>2]=f;g[d+(u<<4)+4>>2]=i;g[d+(u<<4)+8>>2]=h;c[d+(u<<4)+12>>2]=w}u=u+1|0}while((u|0)!=(e|0));l=v;return}function Fh(a,b,d,e,f){a=a|0;b=+b;d=+d;e=+e;f=f|0;var h=0,i=0,j=0,k=0,m=0.0,n=0.0;j=l;l=l+48|0;m=1.0/+D(+(b*b+d*d+e*e));g[f>>2]=m*b;g[f+4>>2]=m*d;g[f+8>>2]=m*e;g[f+12>>2]=0.0;h=c[a+120>>2]|0;k=c[a+124>>2]|0;i=(c[a>>2]|0)+(k>>1)|0;if(k&1)h=c[(c[i>>2]|0)+h>>2]|0;Sb[h&127](j,i,f);b=-+g[f>>2];d=-+g[f+4>>2];e=-+g[f+8>>2];h=c[a+120>>2]|0;k=c[a+124>>2]|0;i=(c[a+4>>2]|0)+(k>>1)|0;if(k&1)h=c[(c[i>>2]|0)+h>>2]|0;m=+g[a+24>>2]*b+ +g[a+28>>2]*d+ +g[a+32>>2]*e;n=+g[a+40>>2]*b+ +g[a+44>>2]*d+ +g[a+48>>2]*e;g[j+16>>2]=+g[a+8>>2]*b+ +g[a+12>>2]*d+ +g[a+16>>2]*e;g[j+16+4>>2]=m;g[j+16+8>>2]=n;g[j+16+12>>2]=0.0;Sb[h&127](j+32|0,i,j+16|0);n=+g[j+32>>2];b=+g[j+32+4>>2];d=+g[j+32+8>>2];e=+g[j+4>>2]-(n*+g[a+72>>2]+b*+g[a+76>>2]+d*+g[a+80>>2]+ +g[a+108>>2]);m=+g[j+8>>2]-(n*+g[a+88>>2]+b*+g[a+92>>2]+d*+g[a+96>>2]+ +g[a+112>>2]);g[f+16>>2]=+g[j>>2]-(n*+g[a+56>>2]+b*+g[a+60>>2]+d*+g[a+64>>2]+ +g[a+104>>2]);g[f+20>>2]=e;g[f+24>>2]=m;g[f+28>>2]=0.0;l=j;return}function Gh(a,b,c,d,e,f,h,i,j,k,l,m,n,o){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;i=+i;j=+j;k=+k;l=+l;m=+m;n=+n;o=+o;var p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0;q=(j-f)*(n-h)-(k-h)*(m-f);r=(k-h)*(l-e)-(i-e)*(n-h);s=(i-e)*(m-f)-(j-f)*(l-e);if(+C(+(s*d+(q*b+r*c)))<1.1920928955078125e-07){s=-1.0;return +s}t=+g[a>>2];v=+g[a+4>>2];u=+g[a+8>>2];p=-(q*t+r*v+s*u-(s*h+(q*e+r*f)))/(s*d+(q*b+r*c));if(((p>1.1920928955078125e-06&p-1.1920928955078125e-06:0)?s*((m-(v+p*c))*(i-(t+p*b))-(j-(v+p*c))*(l-(t+p*b)))+(q*((j-(v+p*c))*(n-(u+p*d))-(k-(u+p*d))*(m-(v+p*c)))+r*((k-(u+p*d))*(l-(t+p*b))-(n-(u+p*d))*(i-(t+p*b))))>-1.1920928955078125e-06:0)?s*((f-(v+p*c))*(l-(t+p*b))-(m-(v+p*c))*(e-(t+p*b)))+(q*((m-(v+p*c))*(h-(u+p*d))-(n-(u+p*d))*(f-(v+p*c)))+r*((n-(u+p*d))*(e-(t+p*b))-(h-(u+p*d))*(l-(t+p*b))))>-1.1920928955078125e-06:0){v=p;return +v}v=-1.0;return +v}function Hh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;if(a[b+165>>0]|0){if((c[b+92>>2]|0)>=(d|0))return;if((d|0)!=0?(c[6995]=(c[6995]|0)+1,e=sc((d<<4|3)+16|0)|0,(e|0)!=0):0){c[(e+4+15&-16)+-4>>2]=e;g=e+4+15&-16}else g=0;f=c[b+88>>2]|0;if((f|0)>0){e=0;do{i=g+(e<<4)|0;h=(c[b+96>>2]|0)+(e<<4)|0;c[i>>2]=c[h>>2];c[i+4>>2]=c[h+4>>2];c[i+8>>2]=c[h+8>>2];c[i+12>>2]=c[h+12>>2];e=e+1|0}while((e|0)!=(f|0))}e=c[b+96>>2]|0;if(e|0){if(a[b+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+96>>2]=0}a[b+100>>0]=1;c[b+96>>2]=g;c[b+92>>2]=d;return}if((c[b+112>>2]|0)>=(d|0))return;if((d|0)!=0?(c[6995]=(c[6995]|0)+1,f=sc((d<<2|3)+16|0)|0,(f|0)!=0):0){c[(f+4+15&-16)+-4>>2]=f;h=f+4+15&-16}else h=0;f=c[b+108>>2]|0;g=c[b+116>>2]|0;if((f|0)<=0)if(!g)e=b+120|0;else i=21;else{e=0;do{c[h+(e<<2)>>2]=c[g+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0));i=21}if((i|0)==21){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0)}c[b+116>>2]=0;e=b+120|0}a[e>>0]=1;c[b+116>>2]=h;c[b+112>>2]=d;return}function Ih(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;if(!(a[d+164>>0]|0)){if((c[d+152>>2]|0)>=(e|0))return;if((e|0)!=0?(c[6995]=(c[6995]|0)+1,g=sc((e<<1)+19|0)|0,(g|0)!=0):0){c[(g+4+15&-16)+-4>>2]=g;i=g+4+15&-16}else i=0;g=c[d+148>>2]|0;h=c[d+156>>2]|0;if((g|0)<=0)if(!h)f=d+160|0;else j=22;else{f=0;do{b[i+(f<<1)>>1]=b[h+(f<<1)>>1]|0;f=f+1|0}while((f|0)!=(g|0));j=22}if((j|0)==22){if(a[d+160>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[d+156>>2]=0;f=d+160|0}a[f>>0]=1;c[d+156>>2]=i;c[d+152>>2]=e;return}else{if((c[d+132>>2]|0)>=(e|0))return;if((e|0)!=0?(c[6995]=(c[6995]|0)+1,f=sc((e<<2|3)+16|0)|0,(f|0)!=0):0){c[(f+4+15&-16)+-4>>2]=f;i=f+4+15&-16}else i=0;g=c[d+128>>2]|0;h=c[d+136>>2]|0;if((g|0)<=0)if(!h)f=d+140|0;else j=10;else{f=0;do{c[i+(f<<2)>>2]=c[h+(f<<2)>>2];f=f+1|0}while((f|0)!=(g|0));j=10}if((j|0)==10){if(a[d+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[d+136>>2]=0;f=d+140|0}a[f>>0]=1;c[d+136>>2]=i;c[d+132>>2]=e;return}}function Jh(a,b,d){a=a|0;b=b|0;d=d|0;fi(a,b,d)|0;c[b+52>>2]=c[a+300>>2];c[b+56>>2]=c[a+304>>2];c[b+60>>2]=c[a+308>>2];c[b+64>>2]=c[a+312>>2];c[b+68>>2]=c[a+316>>2];c[b+72>>2]=c[a+320>>2];c[b+76>>2]=c[a+324>>2];c[b+80>>2]=c[a+328>>2];c[b+84>>2]=c[a+332>>2];c[b+88>>2]=c[a+336>>2];c[b+92>>2]=c[a+340>>2];c[b+96>>2]=c[a+344>>2];c[b+100>>2]=c[a+348>>2];c[b+104>>2]=c[a+352>>2];c[b+108>>2]=c[a+356>>2];c[b+112>>2]=c[a+360>>2];c[b+116>>2]=c[a+364>>2];c[b+120>>2]=c[a+368>>2];c[b+124>>2]=c[a+372>>2];c[b+128>>2]=c[a+376>>2];c[b+132>>2]=c[a+380>>2];c[b+136>>2]=c[a+384>>2];c[b+140>>2]=c[a+388>>2];c[b+144>>2]=c[a+392>>2];c[b+148>>2]=c[a+396>>2];c[b+152>>2]=c[a+400>>2];c[b+156>>2]=c[a+404>>2];c[b+160>>2]=c[a+408>>2];c[b+164>>2]=c[a+412>>2];c[b+168>>2]=c[a+416>>2];c[b+172>>2]=c[a+420>>2];c[b+176>>2]=c[a+424>>2];c[b+180>>2]=c[a+444>>2];c[b+184>>2]=c[a+448>>2];c[b+188>>2]=c[a+452>>2];c[b+192>>2]=c[a+428>>2];c[b+196>>2]=c[a+432>>2];c[b+200>>2]=c[a+436>>2];c[b+204>>2]=c[a+440>>2];return 12643}function Kh(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0.0,h=0.0,i=0.0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0;j=l;l=l+32|0;n=+g[a+60>>2];r=+g[a+76>>2]-n;m=+g[a+64>>2];p=+g[a+80>>2]-m;k=+g[a+68>>2];s=+g[a+84>>2]-k;o=+g[a+92>>2]-n;q=+g[a+96>>2]-m;h=+g[a+100>>2]-k;i=1.0/+D(+((r*q-p*o)*(r*q-p*o)+((p*h-s*q)*(p*h-s*q)+(s*o-r*h)*(s*o-r*h))));f=i*(p*h-s*q);h=i*(s*o-r*h);i=(r*q-p*o)*i;k=i*+g[b+8>>2]+(+g[b>>2]*f+ +g[b+4>>2]*h)-(f*n+h*m+i*k);if(!(k>=-d)|!(k<=d)){b=0;l=j;return b|0}e=0;while(1){Vb[c[(c[a>>2]|0)+104>>2]&127](a,e,j+16|0,j);n=+g[j+16>>2];s=+g[j>>2]-n;p=+g[j+16+4>>2];o=+g[j+4>>2]-p;m=+g[j+16+8>>2];r=+g[j+8>>2]-m;q=1.0/+D(+((h*s-f*o)*(h*s-f*o)+((i*o-h*r)*(i*o-h*r)+(f*r-i*s)*(f*r-i*s))));e=e+1|0;if((h*s-f*o)*q*+g[b+8>>2]+(+g[b>>2]*q*(i*o-h*r)+ +g[b+4>>2]*q*(f*r-i*s))-(m*(h*s-f*o)*q+(n*q*(i*o-h*r)+p*q*(f*r-i*s)))<-d){e=0;a=5;break}if((e|0)>=3){e=1;a=5;break}}if((a|0)==5){l=j;return e|0}return 0}function Lh(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0;c[6995]=(c[6995]|0)+1;h=sc(55)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}c[j>>2]=d;c[j+4>>2]=e;c[j+8>>2]=f;c[j+12>>2]=-1;c[j+16>>2]=-1;c[j+20>>2]=-1;c[j+28>>2]=-1;g[j+32>>2]=0.0;f=j;d=c[b+4>>2]|0;c[j+24>>2]=d;if((d|0)!=(c[b+8>>2]|0)){i=d;e=b+12|0;e=c[e>>2]|0;e=e+(i<<2)|0;c[e>>2]=f;i=i+1|0;c[b+4>>2]=i;return j|0}i=d|0?d<<1:1;if((d|0)>=(i|0)){i=d;e=b+12|0;e=c[e>>2]|0;e=e+(i<<2)|0;c[e>>2]=f;i=i+1|0;c[b+4>>2]=i;return j|0}if(!i)h=0;else{c[6995]=(c[6995]|0)+1;h=sc((i<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}d=c[b+4>>2]|0}if((d|0)>0){e=0;do{c[h+(e<<2)>>2]=c[(c[b+12>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(d|0))}e=c[b+12>>2]|0;if(e){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[b+4>>2]|0}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=h;c[b+8>>2]=i;i=d;e=b+12|0;e=c[e>>2]|0;e=e+(i<<2)|0;c[e>>2]=f;i=i+1|0;c[b+4>>2]=i;return j|0}function Mh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,D=0.0,E=0.0,F=0.0;o=+nb[c[(c[a>>2]|0)+48>>2]&15](a);u=+g[a+76>>2];t=+g[a+60>>2];r=+g[a+80>>2];q=+g[a+64>>2];n=+g[a+84>>2];m=+g[a+68>>2];F=+g[b>>2];y=+C(+F);E=+g[b+4>>2];x=+C(+E);k=+g[b+8>>2];l=+C(+k);D=+g[b+16>>2];w=+C(+D);B=+g[b+20>>2];v=+C(+B);i=+g[b+24>>2];j=+C(+i);A=+g[b+32>>2];s=+C(+A);z=+g[b+36>>2];p=+C(+z);f=+g[b+40>>2];h=+C(+f);k=(u+t)*.5*F+(r+q)*.5*E+(n+m)*.5*k+ +g[b+48>>2];i=(u+t)*.5*D+(r+q)*.5*B+(n+m)*.5*i+ +g[b+52>>2];f=(u+t)*.5*A+(r+q)*.5*z+(n+m)*.5*f+ +g[b+56>>2];l=(o+(u-t)*.5)*y+(o+(r-q)*.5)*x+(o+(n-m)*.5)*l;j=(o+(u-t)*.5)*w+(o+(r-q)*.5)*v+(o+(n-m)*.5)*j;h=(o+(u-t)*.5)*s+(o+(r-q)*.5)*p+(o+(n-m)*.5)*h;g[d>>2]=k-l;g[d+4>>2]=i-j;g[d+8>>2]=f-h;g[d+12>>2]=0.0;g[e>>2]=l+k;g[e+4>>2]=j+i;g[e+8>>2]=h+f;g[e+12>>2]=0.0;return}function Nh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0;if(a[d+32>>0]&1){f=c[b+4>>2]|0;if(f|0)ll(f,d,e);f=c[b>>2]|0;if(f|0){n=+g[d>>2];l=+g[f+128>>2];m=+g[d+4>>2];k=+g[d+8>>2];h=+g[e+4>>2];p=+g[e+8>>2];o=+g[e>>2];j=+g[f+180>>2]*(k*h-m*p)+ +g[f+184>>2]*(n*p-k*o)+(m*o-n*h)*+g[f+188>>2];i=(k*h-m*p)*+g[f+196>>2]+(n*p-k*o)*+g[f+200>>2]+(m*o-n*h)*+g[f+204>>2];h=(k*h-m*p)*+g[f+212>>2]+(n*p-k*o)*+g[f+216>>2]+(m*o-n*h)*+g[f+220>>2];g[f+244>>2]=n*l+ +g[f+244>>2];g[f+248>>2]=l*m+ +g[f+248>>2];g[f+252>>2]=l*k+ +g[f+252>>2];g[f+316>>2]=n*l+ +g[f+316>>2];g[f+320>>2]=l*m+ +g[f+320>>2];g[f+324>>2]=l*k+ +g[f+324>>2];g[f+260>>2]=j+ +g[f+260>>2];g[f+264>>2]=i+ +g[f+264>>2];g[f+268>>2]=h+ +g[f+268>>2];g[f+332>>2]=j+ +g[f+332>>2];g[f+336>>2]=i+ +g[f+336>>2];g[f+340>>2]=h+ +g[f+340>>2];c[f+308>>2]=(c[f+308>>2]|0)+1}}if(!(a[d+32>>0]&2))return;aj(b,d+16|0,e);return}function Oh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;h=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=h;if(h|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;c[b+28>>2]=c[a+32>>2];c[b+32>>2]=c[a+36>>2];c[b+36>>2]=c[a+40>>2];c[b+40>>2]=c[a+44>>2];c[b+12>>2]=c[a+16>>2];c[b+16>>2]=c[a+20>>2];c[b+20>>2]=c[a+24>>2];c[b+24>>2]=c[a+28>>2];c[b+44>>2]=c[a+48>>2];c[b+48>>2]=0;g=c[a+100>>2]|0;c[b+60>>2]=g;if(!g){c[b+52>>2]=0;c[b+56>>2]=0;d=b+64|0;c[d>>2]=0;return 17203}c[b+52>>2]=zb[c[(c[d>>2]|0)+28>>2]&31](d,c[a+108>>2]|0)|0;c[b+56>>2]=0;h=Bb[c[(c[d>>2]|0)+16>>2]&63](d,16,g)|0;if((g|0)>0){e=c[a+108>>2]|0;a=c[h+8>>2]|0;f=0;while(1){c[a>>2]=c[e+(f<<4)>>2];c[a+4>>2]=c[e+(f<<4)+4>>2];c[a+8>>2]=c[e+(f<<4)+8>>2];c[a+12>>2]=c[e+(f<<4)+12>>2];f=f+1|0;if((f|0)==(g|0))break;else a=a+16|0}}else e=c[a+108>>2]|0;Zb[c[(c[d>>2]|0)+20>>2]&31](d,h,19202,1497453121,e);d=b+64|0;c[d>>2]=0;return 17203}function Ph(b){b=b|0;var d=0;d=c[b+112>>2]|0;if(d|0){if(a[b+116>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+112>>2]=0}a[b+116>>0]=1;c[b+112>>2]=0;c[b+104>>2]=0;c[b+108>>2]=0;d=c[b+92>>2]|0;if(d|0){if(a[b+96>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+92>>2]=0}a[b+96>>0]=1;c[b+92>>2]=0;c[b+84>>2]=0;c[b+88>>2]=0;d=c[b+72>>2]|0;if(d|0){if(a[b+76>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+72>>2]=0}a[b+76>>0]=1;c[b+72>>2]=0;c[b+64>>2]=0;c[b+68>>2]=0;d=c[b+52>>2]|0;if(d|0){if(a[b+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+52>>2]=0}a[b+56>>0]=1;c[b+52>>2]=0;c[b+44>>2]=0;c[b+48>>2]=0;d=c[b+32>>2]|0;if(d|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;d=c[b+12>>2]|0;if(!d){a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;b=b+8|0;c[b>>2]=0;return}if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+12>>2]=0;a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;b=b+8|0;c[b>>2]=0;return}function Qh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0;k=c[b>>2]|0;if((k|0)==(c[a+84>>2]|0)){j=1.0;return +j}if(c[k+204>>2]&4|0){j=1.0;return +j}f=+g[b+8>>2];h=+g[b+12>>2];e=+g[b+16>>2];if(d){i=f;j=h}else{i=+g[k+4>>2]*f+ +g[k+8>>2]*h+ +g[k+12>>2]*e;j=f*+g[k+20>>2]+h*+g[k+24>>2]+e*+g[k+28>>2];e=f*+g[k+36>>2]+h*+g[k+40>>2]+e*+g[k+44>>2]}if(i*+g[a+88>>2]+j*+g[a+92>>2]+e*+g[a+96>>2]<+g[a+104>>2]){j=1.0;return +j}c[a+4>>2]=c[b+40>>2];c[a+80>>2]=k;if(d){c[a+48>>2]=c[b+8>>2];c[a+48+4>>2]=c[b+8+4>>2];c[a+48+8>>2]=c[b+8+8>>2];c[a+48+12>>2]=c[b+8+12>>2]}else{e=+g[b+8>>2];f=+g[b+12>>2];h=+g[b+16>>2];i=e*+g[k+20>>2]+f*+g[k+24>>2]+h*+g[k+28>>2];j=e*+g[k+36>>2]+f*+g[k+40>>2]+h*+g[k+44>>2];g[a+48>>2]=+g[k+4>>2]*e+ +g[k+8>>2]*f+ +g[k+12>>2]*h;g[a+52>>2]=i;g[a+56>>2]=j;g[a+60>>2]=0.0}c[a+64>>2]=c[b+24>>2];c[a+64+4>>2]=c[b+24+4>>2];c[a+64+8>>2]=c[b+24+8>>2];c[a+64+12>>2]=c[b+24+12>>2];j=+g[b+40>>2];return +j}function Rh(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=c[b+16>>2]|0;if(d|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;d=c[b+36>>2]|0;if(d|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;d=c[b+56>>2]|0;if(d|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;if((c[b+12>>2]|0)>=2){Nf(b);return}c[6995]=(c[6995]|0)+1;d=sc(43)|0;if(!d)f=0;else{c[(d+4+15&-16)+-4>>2]=d;f=d+4+15&-16}e=c[b+8>>2]|0;if((e|0)>0){d=0;do{g=f+(d*12|0)|0;h=(c[b+16>>2]|0)+(d*12|0)|0;c[g>>2]=c[h>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];d=d+1|0}while((d|0)!=(e|0))}d=c[b+16>>2]|0;if(d|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=f;c[b+12>>2]=2;Nf(b);return}function Sh(a,b,e){a=a|0;b=b|0;e=e|0;fi(a,b,e)|0;c[b+52>>2]=c[a+52>>2];c[b+56>>2]=c[a+56>>2];c[b+60>>2]=c[a+60>>2];c[b+64>>2]=c[a+64>>2];c[b+68>>2]=c[a+68>>2];c[b+72>>2]=c[a+72>>2];c[b+76>>2]=c[a+76>>2];c[b+80>>2]=c[a+80>>2];c[b+84>>2]=c[a+84>>2];c[b+88>>2]=c[a+88>>2];c[b+92>>2]=c[a+92>>2];c[b+96>>2]=c[a+96>>2];c[b+100>>2]=c[a+100>>2];c[b+104>>2]=c[a+104>>2];c[b+108>>2]=c[a+108>>2];c[b+112>>2]=c[a+112>>2];c[b+116>>2]=c[a+116>>2];c[b+120>>2]=c[a+120>>2];c[b+124>>2]=c[a+124>>2];c[b+128>>2]=c[a+128>>2];c[b+132>>2]=c[a+132>>2];c[b+136>>2]=c[a+136>>2];c[b+140>>2]=c[a+140>>2];c[b+144>>2]=c[a+144>>2];c[b+148>>2]=c[a+148>>2];c[b+152>>2]=c[a+152>>2];c[b+156>>2]=c[a+156>>2];c[b+160>>2]=c[a+160>>2];c[b+164>>2]=c[a+164>>2];c[b+168>>2]=c[a+168>>2];c[b+172>>2]=c[a+172>>2];c[b+176>>2]=c[a+176>>2];c[b+180>>2]=c[a+188>>2];c[b+184>>2]=c[a+184>>2];c[b+188>>2]=c[a+196>>2];c[b+192>>2]=c[a+192>>2];c[b+196>>2]=d[a+180>>0];c[b+200>>2]=d[a+49>>0];return 12599}function Th(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;Ib[c[(c[b>>2]|0)+32>>2]&511](b);e=Bb[c[(c[b>>2]|0)+16>>2]&63](b,104,1)|0;d=c[e+8>>2]|0;f=d;g=f+104|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));c[d+88>>2]=c[a+264>>2];c[d+92>>2]=c[a+268>>2];c[d+96>>2]=c[a+272>>2];c[d+100>>2]=c[a+276>>2];c[d>>2]=c[a+92>>2];c[d+4>>2]=c[a+96>>2];c[d+8>>2]=c[a+100>>2];c[d+12>>2]=c[a+104>>2];c[d+16>>2]=c[a+108>>2];c[d+20>>2]=c[a+116>>2];c[d+24>>2]=c[a+120>>2];c[d+28>>2]=c[a+124>>2];c[d+32>>2]=c[a+128>>2];c[d+36>>2]=c[a+132>>2];c[d+40>>2]=c[a+148>>2];c[d+44>>2]=c[a+152>>2];c[d+48>>2]=c[a+156>>2];c[d+52>>2]=c[a+160>>2];c[d+56>>2]=c[a+176>>2];c[d+60>>2]=c[a+180>>2];c[d+64>>2]=c[a+112>>2];c[d+68>>2]=c[a+164>>2];c[d+72>>2]=c[a+168>>2];c[d+76>>2]=c[a+172>>2];c[d+80>>2]=c[a+144>>2];c[d+84>>2]=0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,12157,1145853764,d);id(a,b);dj(a,b);Ib[c[(c[b>>2]|0)+36>>2]&511](b);return}function Uh(a,b,c,d,e,f){a=a|0;b=+b;c=c|0;d=+d;e=+e;f=+f;var h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0;p=+g[c>>2];o=+g[c+16>>2];n=+g[c+32>>2];m=+g[c+4>>2];l=+g[c+20>>2];k=+g[c+36>>2];j=+g[c+8>>2];i=+g[c+24>>2];h=+g[c+40>>2];g[a>>2]=b-((p*0.0+o*-f+n*e)*0.0+(m*0.0+l*-f+k*e)*f+(j*0.0+i*-f+h*e)*-e);g[a+4>>2]=0.0-((p*0.0+o*-f+n*e)*-f+(m*0.0+l*-f+k*e)*0.0+(j*0.0+i*-f+h*e)*d);g[a+8>>2]=0.0-((p*0.0+o*-f+n*e)*e+(m*0.0+l*-f+k*e)*-d+(j*0.0+i*-f+h*e)*0.0);g[a+12>>2]=0.0;g[a+16>>2]=0.0-((p*f+o*0.0+n*-d)*0.0+(m*f+l*0.0+k*-d)*f+(j*f+i*0.0+h*-d)*-e);g[a+20>>2]=b-((p*f+o*0.0+n*-d)*-f+(m*f+l*0.0+k*-d)*0.0+(j*f+i*0.0+h*-d)*d);g[a+24>>2]=0.0-((p*f+o*0.0+n*-d)*e+(m*f+l*0.0+k*-d)*-d+(j*f+i*0.0+h*-d)*0.0);g[a+28>>2]=0.0;g[a+32>>2]=0.0-((p*-e+o*d+n*0.0)*0.0+(m*-e+l*d+k*0.0)*f+(j*-e+i*d+h*0.0)*-e);g[a+36>>2]=0.0-((p*-e+o*d+n*0.0)*-f+(m*-e+l*d+k*0.0)*0.0+(j*-e+i*d+h*0.0)*d);g[a+40>>2]=b-((p*-e+o*d+n*0.0)*e+(m*-e+l*d+k*0.0)*-d+(j*-e+i*d+h*0.0)*0.0);g[a+44>>2]=0.0;return}function Vh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0.0;f=l;l=l+96|0;g[f+4>>2]=1.0;c[f+8>>2]=0;c[f+12>>2]=1;c[f+16>>2]=-1;c[f+20>>2]=0;c[f>>2]=2952;c[f+24>>2]=c[b>>2];c[f+24+4>>2]=c[b+4>>2];c[f+24+8>>2]=c[b+8>>2];c[f+24+12>>2]=c[b+12>>2];c[f+40>>2]=c[d>>2];c[f+40+4>>2]=c[d+4>>2];c[f+40+8>>2]=c[d+8>>2];c[f+40+12>>2]=c[d+12>>2];a=c[a+4>>2]|0;Vb[c[(c[a>>2]|0)+32>>2]&127](a,b,d,f);a=c[f+8>>2]|0;if(!a){e=0;l=f;return e|0}if(!(c[a+252>>2]&2)){e=0;l=f;return e|0}if(c[a+204>>2]&4|0){e=0;l=f;return e|0}c[e>>2]=c[f+72>>2];c[e+4>>2]=c[f+72+4>>2];c[e+8>>2]=c[f+72+8>>2];c[e+12>>2]=c[f+72+12>>2];c[e+16>>2]=c[f+56>>2];c[e+16+4>>2]=c[f+56+4>>2];c[e+16+8>>2]=c[f+56+8>>2];c[e+16+12>>2]=c[f+56+12>>2];k=+g[e+16>>2];j=+g[e+20>>2];i=+g[e+24>>2];h=1.0/+D(+(k*k+j*j+i*i));g[e+16>>2]=k*h;g[e+20>>2]=j*h;g[e+24>>2]=i*h;c[e+32>>2]=c[f+4>>2];e=a;l=f;return e|0}function Wh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0;e=l;l=l+32|0;d=c[b+448>>2]|0;switch(c[a+448>>2]&48&d&63){case 32:{if((a|0)==(b|0)&(d&64|0)==0){l=e;return}g[e+4>>2]=1.0;c[e+8+4>>2]=0;c[e+8+4+4>>2]=0;c[e+8+4+8>>2]=0;c[e>>2]=3748;c[e+8>>2]=c[a+516>>2];d=c[a+192>>2]|0;f=+nb[c[(c[d>>2]|0)+48>>2]&15](d);d=c[b+192>>2]|0;g[e+12>>2]=f+ +nb[c[(c[d>>2]|0)+48>>2]&15](d);c[e+16>>2]=c[(+g[a+376>>2]<+g[b+376>>2]?a+376|0:b+376|0)>>2];c[e+24>>2]=a;c[e+28>>2]=b;Ee(c[a+1068>>2]|0,c[b+1068>>2]|0,e);l=e;return}case 16:{if((a|0)==(b|0)){l=e;return}c[e>>2]=3784;d=c[a+192>>2]|0;f=+nb[c[(c[d>>2]|0)+48>>2]&15](d);d=c[b+192>>2]|0;g[e+12>>2]=f+ +nb[c[(c[d>>2]|0)+48>>2]&15](d);c[e+4>>2]=a;c[e+8>>2]=b;Ee(c[a+988>>2]|0,c[b+1028>>2]|0,e);c[e+4>>2]=b;c[e+8>>2]=a;Ee(c[b+988>>2]|0,c[a+1028>>2]|0,e);l=e;return}default:{l=e;return}}}function Xh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+48|0;g=m;h=g+44|0;do{c[g>>2]=0;g=g+4|0}while((g|0)<(h|0));if(!d)j=c[c[b+940>>2]>>2]|0;else j=d;d=c[b+792>>2]|0;if((d|0)==(c[b+796>>2]|0)?(k=d|0?d<<1:1,(d|0)<(k|0)):0){if(!k)i=0;else{c[6995]=(c[6995]|0)+1;d=sc((k*52|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}i=d;d=c[b+792>>2]|0}if((d|0)>0){e=0;do{g=i+(e*52|0)|0;f=(c[b+800>>2]|0)+(e*52|0)|0;h=g+52|0;do{c[g>>2]=c[f>>2];g=g+4|0;f=f+4|0}while((g|0)<(h|0));e=e+1|0}while((e|0)!=(d|0))}d=c[b+800>>2]|0;if(d|0){if(a[b+804>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+800>>2]=0}a[b+804>>0]=1;c[b+800>>2]=i;c[b+796>>2]=k;d=c[b+792>>2]|0}g=c[b+800>>2]|0;c[g+(d*52|0)>>2]=0;c[g+(d*52|0)+4>>2]=j;g=g+(d*52|0)+8|0;f=m;h=g+44|0;do{c[g>>2]=c[f>>2];g=g+4|0;f=f+4|0}while((g|0)<(h|0));c[b+792>>2]=(c[b+792>>2]|0)+1;l=m;return}function Yh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0,j=0.0;i=l;l=l+32|0;c[i+16>>2]=c[d>>2];c[i+16+4>>2]=c[d+4>>2];c[i+16+8>>2]=c[d+8>>2];c[i+16+12>>2]=c[d+12>>2];f=+g[i+16>>2];h=+g[i+16+4>>2];e=+g[i+16+8>>2];if(f*f+h*h+e*e<1.4210854715202004e-14){c[i+16>>2]=-1082130432;c[i+16+4>>2]=-1082130432;c[i+16+8>>2]=-1082130432;g[i+16+12>>2]=0.0;f=-1.0;h=-1.0;e=-1.0}j=1.0/+D(+(f*f+h*h+e*e));g[i+16>>2]=f*j;g[i+16+4>>2]=h*j;g[i+16+8>>2]=e*j;Nd(i,b,i+16|0);switch(c[b+4>>2]|0){case 8:{e=+g[b+32>>2]*+g[b+16>>2];break}case 0:{e=+g[b+48>>2];break}case 1:{e=+g[b+48>>2];break}case 13:{e=+g[b+48>>2];break}case 11:{e=+g[b+48>>2];break}case 10:{e=+g[b+48>>2];break}case 4:case 5:{e=+g[b+48>>2];break}default:e=+nb[c[(c[b>>2]|0)+48>>2]&15](b)}h=e*+g[i+16+4>>2]+ +g[i+4>>2];j=e*+g[i+16+8>>2]+ +g[i+8>>2];g[a>>2]=e*+g[i+16>>2]+ +g[i>>2];g[a+4>>2]=h;g[a+8>>2]=j;g[a+12>>2]=0.0;l=i;return}function Zh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0,i=0.0,k=0,m=0,n=0,o=0.0;m=l;l=l+80|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;e=+g[d>>2];f=+g[d+4>>2];i=+g[d+8>>2];if(e*e+f*f+i*i<9.999999747378752e-05){k=1065353216;h=0;e=0.0;d=0}else{o=1.0/+D(+(e*e+f*f+i*i));k=(g[j>>2]=e*o,c[j>>2]|0);n=(g[j>>2]=f*o,c[j>>2]|0);h=(g[j>>2]=i*o,c[j>>2]|0);e=+g[d+12>>2];d=n}c[m+32>>2]=8168;n=m+32+4|0;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;g[m+32+20>>2]=-999999984306749440.0;c[m+32+24>>2]=k;c[m+32+28>>2]=d;c[m+32+32>>2]=h;g[m+32+36>>2]=e;c[m+16>>2]=1566444395;c[m+16+4>>2]=1566444395;c[m+16+8>>2]=1566444395;g[m+16+12>>2]=0.0;b=c[b+96>>2]|0;k=c[(c[b>>2]|0)+8>>2]|0;g[m>>2]=-999999984306749440.0;g[m+4>>2]=-999999984306749440.0;g[m+8>>2]=-999999984306749440.0;g[m+12>>2]=0.0;Vb[k&127](b,m+32|0,m,m+16|0);c[a>>2]=c[n>>2];c[a+4>>2]=c[n+4>>2];c[a+8>>2]=c[n+8>>2];c[a+12>>2]=c[n+12>>2];l=m;return}function _h(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0;p=l;l=l+32|0;e=c[a+12>>2]|0;if(!e){l=p;return}c[f+4>>2]=e;q=c[b+4>>2]|0;a=c[d+4>>2]|0;r=c[b+12>>2]|0;b=c[d+12>>2]|0;h=+g[r+48>>2]-+g[b+48>>2];i=+g[r+52>>2]-+g[b+52>>2];k=+g[r+56>>2]-+g[b+56>>2];m=+D(+(h*h+i*i+k*k));n=+g[q+32>>2]*+g[q+16>>2];o=+g[a+32>>2]*+g[a+16>>2];c[e+780>>2]=0;if(m>n+o+ +g[f+32>>2]){l=p;return}c[p+16>>2]=1065353216;c[p+16+4>>2]=0;c[p+16+8>>2]=0;g[p+16+12>>2]=0.0;if(m>1.1920928955078125e-07){g[p+16>>2]=h*(1.0/m);g[p+16+4>>2]=i*(1.0/m);g[p+16+8>>2]=k*(1.0/m);g[p+16+12>>2]=0.0;j=h*(1.0/m);i=i*(1.0/m);h=k*(1.0/m)}else{j=1.0;i=0.0;h=0.0}r=c[d+12>>2]|0;i=o*i+ +g[r+52>>2];k=o*h+ +g[r+56>>2];g[p>>2]=o*j+ +g[r+48>>2];g[p+4>>2]=i;g[p+8>>2]=k;g[p+12>>2]=0.0;Tb[c[(c[f>>2]|0)+16>>2]&15](f,p+16|0,p,m-(n+o));l=p;return}function $h(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0,i=0,j=0,k=0.0,l=0,m=0;m=c[a+4>>2]|0;a=c[a+44>>2]|0;do if(!m)if(!a){e=0;f=0.0;h=0;i=0;j=0;k=0.0;l=0;a=0}else{e=c[a>>2]|0;f=+g[a+12>>2];h=c[a+16>>2]|0;i=c[a+20>>2]|0;j=c[a+24>>2]|0;k=+g[a+28>>2];l=c[a+4>>2]|0;a=c[a+8>>2]|0}else if(!a){e=c[m>>2]|0;f=+g[m+12>>2];h=c[m+16>>2]|0;i=c[m+20>>2]|0;j=c[m+24>>2]|0;k=+g[m+28>>2];l=c[m+4>>2]|0;a=c[m+8>>2]|0;break}else{e=c[(+g[m>>2]<+g[a>>2]?m:a)>>2]|0;f=0.0;h=c[(+g[m+16>>2]>+g[a+16>>2]?m+16|0:a+16|0)>>2]|0;i=c[(+g[m+20>>2]>+g[a+20>>2]?m+16|0:a+16|0)+4>>2]|0;j=c[(+g[m+24>>2]>+g[a+24>>2]?m+16|0:a+16|0)+8>>2]|0;k=0.0;l=c[(+g[m+4>>2]<+g[a+4>>2]?m:a)+4>>2]|0;a=c[(+g[m+8>>2]<+g[a+8>>2]?m:a)+8>>2]|0;break}while(0);c[b>>2]=e;c[b+4>>2]=l;c[b+8>>2]=a;g[b+12>>2]=f;c[d>>2]=h;c[d+4>>2]=i;c[d+8>>2]=j;g[d+12>>2]=k;return}function ai(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0,i=0.0,j=0.0,k=0.0,l=0,m=0.0;k=+g[b+64>>2]*.5;l=c[b+72>>2]|0;f=+g[d>>2];i=+g[d+4>>2];j=+g[d+8>>2];j=+D(+(f*f+i*i+j*j));h=c[b+68>>2]|0;do if(!(+g[d+(l<<2)>>2]>j*+g[b+56>>2])){f=+g[d+(h<<2)>>2];e=c[b+76>>2]|0;i=+g[d+(e<<2)>>2];j=+D(+(f*f+i*i));if(j>1.1920928955078125e-07){j=+g[b+60>>2]/j;g[a+(h<<2)>>2]=f*j;g[a+(l<<2)>>2]=-k;f=i*j;break}else{g[a+(h<<2)>>2]=0.0;g[a+(l<<2)>>2]=-k;f=0.0;break}}else{g[a+(h<<2)>>2]=0.0;g[a+(l<<2)>>2]=k;f=0.0;e=c[b+76>>2]|0}while(0);g[a+(e<<2)>>2]=f;if(!(+nb[c[(c[b>>2]|0)+48>>2]&15](b)!=0.0))return;i=+g[d>>2];j=+g[d+4>>2];k=+g[d+8>>2];m=i*i+j*j+k*k<1.4210854715202004e-14?-1.0:i;f=i*i+j*j+k*k<1.4210854715202004e-14?-1.0:j;k=i*i+j*j+k*k<1.4210854715202004e-14?-1.0:k;j=1.0/+D(+(k*k+(m*m+f*f)));i=+nb[c[(c[b>>2]|0)+48>>2]&15](b);g[a>>2]=+g[a>>2]+i*j*m;g[a+4>>2]=i*j*f+ +g[a+4>>2];g[a+8>>2]=i*j*k+ +g[a+8>>2];return}function bi(a,b,d){a=a|0;b=b|0;d=d|0;c[a+300>>2]=c[b>>2];c[a+300+4>>2]=c[b+4>>2];c[a+300+8>>2]=c[b+8>>2];c[a+300+12>>2]=c[b+12>>2];c[a+316>>2]=c[b+16>>2];c[a+316+4>>2]=c[b+16+4>>2];c[a+316+8>>2]=c[b+16+8>>2];c[a+316+12>>2]=c[b+16+12>>2];c[a+332>>2]=c[b+32>>2];c[a+332+4>>2]=c[b+32+4>>2];c[a+332+8>>2]=c[b+32+8>>2];c[a+332+12>>2]=c[b+32+12>>2];c[a+348>>2]=c[b+48>>2];c[a+348+4>>2]=c[b+48+4>>2];c[a+348+8>>2]=c[b+48+8>>2];c[a+348+12>>2]=c[b+48+12>>2];c[a+364>>2]=c[d>>2];c[a+364+4>>2]=c[d+4>>2];c[a+364+8>>2]=c[d+8>>2];c[a+364+12>>2]=c[d+12>>2];c[a+380>>2]=c[d+16>>2];c[a+380+4>>2]=c[d+16+4>>2];c[a+380+8>>2]=c[d+16+8>>2];c[a+380+12>>2]=c[d+16+12>>2];c[a+396>>2]=c[d+32>>2];c[a+396+4>>2]=c[d+32+4>>2];c[a+396+8>>2]=c[d+32+8>>2];c[a+396+12>>2]=c[d+32+12>>2];c[a+412>>2]=c[d+48>>2];c[a+412+4>>2]=c[d+48+4>>2];c[a+412+8>>2]=c[d+48+8>>2];c[a+412+12>>2]=c[d+48+12>>2];Ib[c[(c[a>>2]|0)+8>>2]&511](a);return}function ci(a){a=a|0;var b=0,d=0;Dd(a);a:do if(xb[c[(c[a>>2]|0)+20>>2]&127](a)|0?(d=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0,(xb[c[(c[d>>2]|0)+56>>2]&127](d)|0)&6144|0):0){d=xb[c[(c[a>>2]|0)+104>>2]&127](a)|0;while(1){b=d+-1|0;if((d|0)<=0)break a;d=zb[c[(c[a>>2]|0)+108>>2]&31](a,b)|0;Ob[c[(c[a>>2]|0)+172>>2]&127](a,d);d=b}}while(0);if((((xb[c[(c[a>>2]|0)+20>>2]&127](a)|0?(d=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0,(xb[c[(c[d>>2]|0)+56>>2]&127](d)|0)&16387|0):0)?xb[c[(c[a>>2]|0)+20>>2]&127](a)|0:0)?(d=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0,xb[c[(c[d>>2]|0)+56>>2]&127](d)|0):0)?(c[a+296>>2]|0)>0:0){b=0;do{d=c[(c[a+304>>2]|0)+(b<<2)>>2]|0;Ob[c[(c[d>>2]|0)+12>>2]&127](d,c[a+72>>2]|0);b=b+1|0}while((b|0)<(c[a+296>>2]|0))}if(!(xb[c[(c[a>>2]|0)+20>>2]&127](a)|0))return;a=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Ib[c[(c[a>>2]|0)+104>>2]&511](a);return}function di(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0;c=l;l=l+48|0;yh(a+364|0,c+16|0);h=-+g[c+16>>2];e=-+g[c+16+4>>2];m=-+g[c+16+8>>2];k=+g[c+16+12>>2];f=+g[b>>2];n=+g[b+12>>2];j=+g[b+8>>2];i=+g[b+4>>2];yh(a+300|0,c);p=+g[c>>2];q=+g[c+12>>2];d=+g[c+8>>2];o=+g[c+4>>2];g[c+32>>2]=(k*n-f*h-i*e-j*m)*p+(k*f+n*h+j*e-i*m)*q+(f*m+(n*e+k*i)-j*h)*d-(n*m+k*j+i*h-f*e)*o;g[c+32+4>>2]=p*(n*m+k*j+i*h-f*e)+(q*(f*m+(n*e+k*i)-j*h)+(k*n-f*h-i*e-j*m)*o)-(k*f+n*h+j*e-i*m)*d;g[c+32+8>>2]=(n*m+k*j+i*h-f*e)*q+(k*n-f*h-i*e-j*m)*d+(k*f+n*h+j*e-i*m)*o-p*(f*m+(n*e+k*i)-j*h);g[c+32+12>>2]=(k*n-f*h-i*e-j*m)*q-(k*f+n*h+j*e-i*m)*p-(f*m+(n*e+k*i)-j*h)*o-(n*m+k*j+i*h-f*e)*d;Ce(a,c+32|0);l=c;return}function ei(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;if(!e)e=c[b+188>>2]|0;j=c[d>>2]|0;f=c[b+328>>2]|0;a:do if((f|0)>0){h=c[b+336>>2]|0;g=0;while(1){if((c[h+(g<<2)>>2]|0)==(j|0))break;g=g+1|0;if((g|0)>=(f|0))break a}if((g|0)!=(f|0))return}while(0);if((f|0)==(c[b+332>>2]|0)?(i=f|0?f<<1:1,(f|0)<(i|0)):0){if(!i)h=0;else{c[6995]=(c[6995]|0)+1;f=sc((i<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=f;f=c[b+328>>2]|0}if((f|0)>0){g=0;do{c[h+(g<<2)>>2]=c[(c[b+336>>2]|0)+(g<<2)>>2];g=g+1|0}while((g|0)!=(f|0))}g=c[b+336>>2]|0;if(g){if(a[b+340>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);f=c[b+328>>2]|0}c[b+336>>2]=0}a[b+340>>0]=1;c[b+336>>2]=h;c[b+332>>2]=i}c[(c[b+336>>2]|0)+(f<<2)>>2]=j;c[b+328>>2]=f+1;b=c[b+344>>2]|0;Bb[c[(c[b>>2]|0)+8>>2]&63](b,e,d)|0;return}function fi(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0;c[b>>2]=zb[c[(c[e>>2]|0)+28>>2]&31](e,c[a+28>>2]|0)|0;c[b+4>>2]=zb[c[(c[e>>2]|0)+28>>2]&31](e,c[a+32>>2]|0)|0;f=zb[c[(c[e>>2]|0)+40>>2]&31](e,a)|0;g=zb[c[(c[e>>2]|0)+28>>2]&31](e,f)|0;c[b+8>>2]=g;if(g|0)Ob[c[(c[e>>2]|0)+48>>2]&127](e,f);c[b+12>>2]=c[a+4>>2];c[b+24>>2]=d[a+21>>0];c[b+40>>2]=c[a+24>>2];c[b+44>>2]=c[a+16>>2];c[b+48>>2]=d[a+20>>0];c[b+20>>2]=c[a+12>>2];c[b+16>>2]=c[a+8>>2];c[b+28>>2]=c[a+36>>2];c[b+32>>2]=c[a+40>>2];c[b+36>>2]=0;f=c[a+28>>2]|0;if((c[f+548>>2]|0)>0){e=0;do{if((c[(c[f+556>>2]|0)+(e<<2)>>2]|0)==(a|0)){c[b+36>>2]=1;f=c[a+28>>2]|0}e=e+1|0}while((e|0)<(c[f+548>>2]|0))}f=c[a+32>>2]|0;if((c[f+548>>2]|0)>0)e=0;else return 12572;do{if((c[(c[f+556>>2]|0)+(e<<2)>>2]|0)==(a|0)){c[b+36>>2]=1;f=c[a+32>>2]|0}e=e+1|0}while((e|0)<(c[f+548>>2]|0));return 12572}function gi(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if((e|0)>=8192)return db(b|0,d|0,e|0)|0;h=b|0;g=b+e|0;if((b&3)==(d&3)){while(b&3){if(!e)return h|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}e=g&-4|0;f=e-64|0;while((b|0)<=(f|0)){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];c[b+24>>2]=c[d+24>>2];c[b+28>>2]=c[d+28>>2];c[b+32>>2]=c[d+32>>2];c[b+36>>2]=c[d+36>>2];c[b+40>>2]=c[d+40>>2];c[b+44>>2]=c[d+44>>2];c[b+48>>2]=c[d+48>>2];c[b+52>>2]=c[d+52>>2];c[b+56>>2]=c[d+56>>2];c[b+60>>2]=c[d+60>>2];b=b+64|0;d=d+64|0}while((b|0)<(e|0)){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}}else{e=g-4|0;while((b|0)<(e|0)){a[b>>0]=a[d>>0]|0;a[b+1>>0]=a[d+1>>0]|0;a[b+2>>0]=a[d+2>>0]|0;a[b+3>>0]=a[d+3>>0]|0;b=b+4|0;d=d+4|0}}while((b|0)<(g|0)){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0}return h|0}function hi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;if(xb[c[(c[d>>2]|0)+16>>2]&127](d)|0)return;i=c[b+772>>2]|0;h=xb[c[(c[d>>2]|0)+36>>2]&127](d)|0;if(xb[c[(c[d>>2]|0)+8>>2]&127](d)|0?(e=xb[c[(c[d>>2]|0)+20>>2]&127](d)|0,g=xb[c[(c[d>>2]|0)+24>>2]&127](d)|0,(i|0)>0):0){f=c[b+780>>2]|0;a=h+(e<<2)|0;e=0;while(1){k=c[f+(e*104|0)+12>>2]|0;j=c[f+(e*104|0)+16>>2]|0;c[a>>2]=c[f+(e*104|0)+8>>2];c[a+4>>2]=k;c[a+8>>2]=j;e=e+1|0;if((e|0)==(i|0))break;else a=a+(g<<2)|0}}if(!(xb[c[(c[d>>2]|0)+12>>2]&127](d)|0))return;a=xb[c[(c[d>>2]|0)+28>>2]&127](d)|0;g=xb[c[(c[d>>2]|0)+32>>2]&127](d)|0;if((i|0)<=0)return;f=c[b+780>>2]|0;a=h+(a<<2)|0;e=0;while(1){j=c[f+(e*104|0)+76>>2]|0;k=c[f+(e*104|0)+80>>2]|0;c[a>>2]=c[f+(e*104|0)+72>>2];c[a+4>>2]=j;c[a+8>>2]=k;e=e+1|0;if((e|0)==(i|0))break;else a=a+(g<<2)|0}return}function ii(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;c[b>>2]=9696;d=c[b+56>>2]|0;if(d|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;f=c[b+28>>2]|0;if((f|0)>0){d=0;do{g=c[b+36>>2]|0;h=g+(d*36|0)+4|0;i=g+(d*36|0)+12|0;j=c[i>>2]|0;e=g+(d*36|0)+16|0;if(j|0){if(a[e>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[i>>2]=0}a[e>>0]=1;c[i>>2]=0;c[h>>2]=0;c[g+(d*36|0)+8>>2]=0;d=d+1|0}while((d|0)!=(f|0))}d=c[b+36>>2]|0;if(d|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;d=c[b+16>>2]|0;if(!d){a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}function ji(b){b=b|0;var d=0;c[b>>2]=8796;d=c[b+156>>2]|0;if(d|0){if(a[b+160>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+156>>2]=0}a[b+160>>0]=1;c[b+156>>2]=0;c[b+148>>2]=0;c[b+152>>2]=0;d=c[b+136>>2]|0;if(d|0){if(a[b+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+136>>2]=0}a[b+140>>0]=1;c[b+136>>2]=0;c[b+128>>2]=0;c[b+132>>2]=0;d=c[b+116>>2]|0;if(d|0){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+116>>2]=0}a[b+120>>0]=1;c[b+116>>2]=0;c[b+108>>2]=0;c[b+112>>2]=0;d=c[b+96>>2]|0;if(d|0){if(a[b+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+96>>2]=0}a[b+100>>0]=1;c[b+96>>2]=0;c[b+88>>2]=0;c[b+92>>2]=0;c[b>>2]=9712;d=c[b+32>>2]|0;if(!d){a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;b=b+28|0;c[b>>2]=0;return}if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0;a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;b=b+28|0;c[b>>2]=0;return}function ki(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=c[b+188>>2]|0;if(d|0){f=c[a+68>>2]|0;f=xb[c[(c[f>>2]|0)+36>>2]&127](f)|0;Sb[c[(c[f>>2]|0)+40>>2]&127](f,d,c[a+24>>2]|0);f=c[a+68>>2]|0;Sb[c[(c[f>>2]|0)+12>>2]&127](f,d,c[a+24>>2]|0);c[b+188>>2]=0}d=c[b+216>>2]|0;f=c[a+8>>2]|0;if((d|0)>-1&(d|0)<(f|0)){g=c[a+16>>2]|0;e=c[g+(d<<2)>>2]|0;c[g+(d<<2)>>2]=c[g+(f+-1<<2)>>2];c[(c[a+16>>2]|0)+(f+-1<<2)>>2]=e;c[a+8>>2]=f+-1;if((d|0)>=(f+-1|0)){c[b+216>>2]=-1;return}c[(c[(c[a+16>>2]|0)+(d<<2)>>2]|0)+216>>2]=d;c[b+216>>2]=-1;return}a:do if((f|0)>0){e=c[a+16>>2]|0;d=0;while(1){if((c[e+(d<<2)>>2]|0)==(b|0))break a;d=d+1|0;if((d|0)>=(f|0)){d=f;break}}}else d=f;while(0);if((f|0)<=(d|0)){c[b+216>>2]=-1;return}h=c[a+16>>2]|0;e=h+(d<<2)|0;g=c[e>>2]|0;c[e>>2]=c[h+(f+-1<<2)>>2];c[(c[a+16>>2]|0)+(f+-1<<2)>>2]=g;c[a+8>>2]=f+-1;c[b+216>>2]=-1;return}function li(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0;p=l;l=l+16|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;e=+g[d>>2];h=+g[d+4>>2];f=+g[d+8>>2];if(e*e+h*h+f*f<9.999999747378752e-05){o=1.0;n=0.0;m=0.0}else{m=1.0/+D(+(e*e+h*h+f*f));o=e*m;n=h*m;m=f*m}c[p>>2]=0;c[p+4>>2]=0;c[p+8>>2]=0;c[p+12>>2]=0;d=c[b+56>>2]|0;b=c[b+32+(d<<2)>>2]|0;c[p+(d<<2)>>2]=b;e=+g[p>>2];h=+g[p+4>>2];f=+g[p+8>>2];i=o*e+n*h+m*f;k=(c[j>>2]=b,+g[j>>2]);if(i>-999999984306749440.0){b=c[p+12>>2]|0;g[a>>2]=e;g[a+4>>2]=h;g[a+8>>2]=f;c[a+12>>2]=b}else i=-999999984306749440.0;c[p>>2]=0;c[p+4>>2]=0;c[p+8>>2]=0;c[p+12>>2]=0;g[p+(d<<2)>>2]=-k;e=+g[p>>2];h=+g[p+4>>2];f=+g[p+8>>2];if(!(o*e+n*h+m*f>i)){l=p;return}b=c[p+12>>2]|0;g[a>>2]=e;g[a+4>>2]=h;g[a+8>>2]=f;c[a+12>>2]=b;l=p;return}function mi(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0;c[b+68>>2]=c[d>>2];c[b+68+4>>2]=c[d+4>>2];c[b+68+8>>2]=c[d+8>>2];c[b+68+12>>2]=c[d+12>>2];n=+g[b+68>>2];o=+g[b+72>>2];m=+g[b+76>>2];if(!(n*n+o*o+m*m>0.0)){g[b+20>>2]=0.0;return}k=+g[d>>2];l=+g[d+4>>2];e=+g[d+8>>2];f=1.0/+D(+(k*k+l*l+e*e));h=+g[b+256>>2];i=+g[b+260>>2];j=+g[b+264>>2];if(!(h*k*f+l*f*i+e*f*j!=0.0))return;p=h*k*f+l*f*i+e*f*j<-1.0?-1.0:h*k*f+l*f*i+e*f*j;p=+G(+(1.5707963705062866-+I(+(p>1.0?1.0:p))))*+D(+(n*n+o*o+m*m));g[b+68>>2]=n-h*p;g[b+72>>2]=o-i*p;g[b+76>>2]=m-j*p;g[b+20>>2]=(h*k*f+l*f*i+e*f*j<0.0?-1.0:1.0)*+D(+(j*p*j*p+(h*p*h*p+i*p*i*p)));if(!(h*k*f+l*f*i+e*f*j>0.0))return;a[b+249>>0]=1;d=(c[b+8>>2]|0)+52|0;c[b+116>>2]=c[d>>2];c[b+116+4>>2]=c[d+4>>2];c[b+116+8>>2]=c[d+8>>2];c[b+116+12>>2]=c[d+12>>2];return}function ni(b){b=b|0;var d=0;c[b>>2]=9356;d=c[b+160>>2]|0;if(d|0){if(a[b+164>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+160>>2]=0}a[b+164>>0]=1;c[b+160>>2]=0;c[b+152>>2]=0;c[b+156>>2]=0;d=c[b+136>>2]|0;if(d|0){if(a[b+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+136>>2]=0}a[b+140>>0]=1;c[b+136>>2]=0;c[b+128>>2]=0;c[b+132>>2]=0;d=c[b+116>>2]|0;if(d|0){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+116>>2]=0}a[b+120>>0]=1;c[b+116>>2]=0;c[b+108>>2]=0;c[b+112>>2]=0;d=c[b+96>>2]|0;if(d|0){if(a[b+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+96>>2]=0}a[b+100>>0]=1;c[b+96>>2]=0;c[b+88>>2]=0;c[b+92>>2]=0;d=c[b+76>>2]|0;if(!d){a[b+80>>0]=1;c[b+76>>2]=0;c[b+68>>2]=0;b=b+72|0;c[b>>2]=0;return}if(a[b+80>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+76>>2]=0;a[b+80>>0]=1;c[b+76>>2]=0;c[b+68>>2]=0;b=b+72|0;c[b>>2]=0;return}function oi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0,p=0;p=l;l=l+16|0;if((e|0)<=0){l=p;return}o=0;do{h=+g[a+64>>2]*.5;i=c[a+72>>2]|0;k=+g[b+(o<<4)>>2];m=+g[b+(o<<4)+4>>2];n=+g[b+(o<<4)+8>>2];n=+D(+(k*k+m*m+n*n));j=c[a+68>>2]|0;do if(!(+g[b+(o<<4)+(i<<2)>>2]>n*+g[a+56>>2])){k=+g[b+(o<<4)+(j<<2)>>2];f=c[a+76>>2]|0;m=+g[b+(o<<4)+(f<<2)>>2];n=+D(+(k*k+m*m));if(n>1.1920928955078125e-07){n=+g[a+60>>2]/n;g[p+(j<<2)>>2]=k*n;g[p+(i<<2)>>2]=-h;h=m*n;break}else{g[p+(j<<2)>>2]=0.0;g[p+(i<<2)>>2]=-h;h=0.0;break}}else{g[p+(j<<2)>>2]=0.0;g[p+(i<<2)>>2]=h;h=0.0;f=c[a+76>>2]|0}while(0);g[p+(f<<2)>>2]=h;j=d+(o<<4)|0;c[j>>2]=c[p>>2];c[j+4>>2]=c[p+4>>2];c[j+8>>2]=c[p+8>>2];c[j+12>>2]=c[p+12>>2];o=o+1|0}while((o|0)!=(e|0));l=p;return}function pi(b){b=b|0;var d=0;c[b>>2]=5112;d=c[b+136>>2]|0;if(d|0){if(a[b+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+136>>2]=0}a[b+140>>0]=1;c[b+136>>2]=0;c[b+128>>2]=0;c[b+132>>2]=0;d=c[b+76>>2]|0;if(d|0){if(a[b+80>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+76>>2]=0}a[b+80>>0]=1;c[b+76>>2]=0;c[b+68>>2]=0;c[b+72>>2]=0;d=c[b+56>>2]|0;if(d|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;d=c[b+36>>2]|0;if(d|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;d=c[b+16>>2]|0;if(!d){a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}function qi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0;o=(+g[a+36>>2]-+g[a+20>>2])*+g[a+112>>2]*.5;m=(+g[a+40>>2]-+g[a+24>>2])*+g[a+116>>2]*.5;k=(+g[a+44>>2]-+g[a+28>>2])*+g[a+120>>2]*.5;t=+C(+(+g[b>>2]));s=+C(+(+g[b+4>>2]));r=+C(+(+g[b+8>>2]));n=+C(+(+g[b+16>>2]));l=+C(+(+g[b+20>>2]));j=+C(+(+g[b+24>>2]));w=+C(+(+g[b+32>>2]));v=+C(+(+g[b+36>>2]));f=+C(+(+g[b+40>>2]));u=+g[b+48>>2];p=+g[b+52>>2];h=+g[b+56>>2];q=+nb[c[(c[a>>2]|0)+48>>2]&15](a);i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);f=o*w+m*v+k*f+ +nb[c[(c[a>>2]|0)+48>>2]&15](a);g[d>>2]=u-(o*t+m*s+k*r+q);g[d+4>>2]=p-(o*n+m*l+k*j+i);g[d+8>>2]=h-f;g[d+12>>2]=0.0;g[e>>2]=u+(o*t+m*s+k*r+q);g[e+4>>2]=p+(o*n+m*l+k*j+i);g[e+8>>2]=h+f;g[e+12>>2]=0.0;return}function ri(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0;f=l;l=l+16|0;y=c[a+56>>2]|0;z=c[a+32+(((y+2|0)%3|0)<<2)>>2]|0;c[f>>2]=z;c[f+4>>2]=z;c[f+8>>2]=z;g[f+12>>2]=0.0;g[f+(y<<2)>>2]=(c[j>>2]=z,+g[j>>2])+ +g[a+32+(y<<2)>>2];w=+C(+(+g[b>>2]));v=+C(+(+g[b+4>>2]));u=+C(+(+g[b+8>>2]));s=+C(+(+g[b+16>>2]));r=+C(+(+g[b+20>>2]));q=+C(+(+g[b+24>>2]));o=+C(+(+g[b+32>>2]));m=+C(+(+g[b+36>>2]));i=+C(+(+g[b+40>>2]));x=+g[b+48>>2];t=+g[b+52>>2];p=+g[b+56>>2];n=+g[f>>2];k=+g[f+4>>2];h=+g[f+8>>2];g[d>>2]=x-(w*n+v*k+u*h);g[d+4>>2]=t-(s*n+r*k+q*h);g[d+8>>2]=p-(o*n+m*k+i*h);g[d+12>>2]=0.0;g[e>>2]=x+(w*n+v*k+u*h);g[e+4>>2]=t+(s*n+r*k+q*h);g[e+8>>2]=p+(o*n+m*k+i*h);g[e+12>>2]=0.0;l=f;return}function si(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+64|0;b=c[b+36>>2]|0;e=c[(c[a+24>>2]|0)+28>>2]|0;c[d>>2]=c[e+(b*80|0)>>2];c[d+4>>2]=c[e+(b*80|0)+4>>2];c[d+8>>2]=c[e+(b*80|0)+8>>2];c[d+12>>2]=c[e+(b*80|0)+12>>2];c[d+16>>2]=c[e+(b*80|0)+16>>2];c[d+16+4>>2]=c[e+(b*80|0)+16+4>>2];c[d+16+8>>2]=c[e+(b*80|0)+16+8>>2];c[d+16+12>>2]=c[e+(b*80|0)+16+12>>2];c[d+32>>2]=c[e+(b*80|0)+32>>2];c[d+32+4>>2]=c[e+(b*80|0)+32+4>>2];c[d+32+8>>2]=c[e+(b*80|0)+32+8>>2];c[d+32+12>>2]=c[e+(b*80|0)+32+12>>2];c[d+48>>2]=c[e+(b*80|0)+48>>2];c[d+48+4>>2]=c[e+(b*80|0)+48+4>>2];c[d+48+8>>2]=c[e+(b*80|0)+48+8>>2];c[d+48+12>>2]=c[e+(b*80|0)+48+12>>2];jg(a,b,d,c[e+(b*80|0)+64>>2]|0);l=d;return}function ti(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;i=l;l=l+48|0;e=c[a+28>>2]|0;c[i+32>>2]=e;e=(c[a+20>>2]|0)-e|0;c[i+32+4>>2]=e;c[i+32+8>>2]=b;c[i+32+12>>2]=d;c[i>>2]=c[a+60>>2];c[i+4>>2]=i+32;c[i+8>>2]=2;f=SC($a(146,i|0)|0)|0;a:do if((e+d|0)!=(f|0)){b=2;g=e+d|0;e=i+32|0;while(1){if((f|0)<0)break;g=g-f|0;j=c[e+4>>2]|0;k=f>>>0>j>>>0;e=k?e+8|0:e;b=(k<<31>>31)+b|0;j=f-(k?j:0)|0;c[e>>2]=(c[e>>2]|0)+j;c[e+4>>2]=(c[e+4>>2]|0)-j;c[i+16>>2]=c[a+60>>2];c[i+16+4>>2]=e;c[i+16+8>>2]=b;f=SC($a(146,i+16|0)|0)|0;if((g|0)==(f|0)){h=3;break a}}c[a+16>>2]=0;c[a+28>>2]=0;c[a+20>>2]=0;c[a>>2]=c[a>>2]|32;if((b|0)==2)d=0;else d=d-(c[e+4>>2]|0)|0}else h=3;while(0);if((h|0)==3){k=c[a+44>>2]|0;c[a+16>>2]=k+(c[a+48>>2]|0);c[a+28>>2]=k;c[a+20>>2]=k}l=i;return d|0}function ui(b){b=b|0;var d=0;if((a[22440]|0)==0?Uz(22440)|0:0){if((a[22384]|0)==0?Uz(22384)|0:0){if((a[22392]|0)==0?Uz(22392)|0:0){c[5698]=1065353216;c[5699]=0;c[5700]=0;c[5701]=0;c[5702]=0;c[5703]=1065353216;c[5704]=0;c[5705]=0;c[5706]=0;c[5707]=0;c[5708]=1065353216;g[5709]=0.0}c[5682]=c[5698];c[5683]=c[5699];c[5684]=c[5700];c[5685]=c[5701];c[5686]=c[5702];c[5687]=c[5703];c[5688]=c[5704];c[5689]=c[5705];c[5690]=c[5706];c[5691]=c[5707];c[5692]=c[5708];c[5693]=c[5709];c[5694]=0;c[5695]=0;c[5696]=0;c[5697]=0}c[5738]=c[5682];c[5739]=c[5683];c[5740]=c[5684];c[5741]=c[5685];c[5742]=c[5686];c[5743]=c[5687];c[5744]=c[5688];c[5745]=c[5689];c[5746]=c[5690];c[5747]=c[5691];c[5748]=c[5692];c[5749]=c[5693];c[5750]=c[5694];c[5751]=c[5695];c[5752]=c[5696];c[5753]=c[5697]}d=c[b+8>>2]|0;if(!d){d=c[b>>2]|0;return ((d|0)==0?22952:d+60|0)|0}else return d+4|0;return 0}function vi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;e=c[b>>2]|0;if((e|0)==(c[a+84>>2]|0)){f=1.0;return +f}if(c[e+204>>2]&4|0){f=1.0;return +f}if((+g[a+32>>2]-+g[a+16>>2])*+g[b+8>>2]+(+g[a+36>>2]-+g[a+20>>2])*+g[b+12>>2]+(+g[a+40>>2]-+g[a+24>>2])*+g[b+16>>2]>=-+g[a+88>>2]){f=1.0;return +f}c[a+4>>2]=c[b+40>>2];c[a+80>>2]=e;if(d){c[a+48>>2]=c[b+8>>2];c[a+48+4>>2]=c[b+8+4>>2];c[a+48+8>>2]=c[b+8+8>>2];c[a+48+12>>2]=c[b+8+12>>2]}else{k=+g[b+8>>2];j=+g[b+12>>2];i=+g[b+16>>2];h=k*+g[e+20>>2]+j*+g[e+24>>2]+i*+g[e+28>>2];f=k*+g[e+36>>2]+j*+g[e+40>>2]+i*+g[e+44>>2];g[a+48>>2]=+g[e+4>>2]*k+ +g[e+8>>2]*j+ +g[e+12>>2]*i;g[a+52>>2]=h;g[a+56>>2]=f;g[a+60>>2]=0.0}c[a+64>>2]=c[b+24>>2];c[a+64+4>>2]=c[b+24+4>>2];c[a+64+8>>2]=c[b+24+8>>2];c[a+64+12>>2]=c[b+24+12>>2];k=+g[b+40>>2];return +k}function wi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0;i=l;l=l+80|0;if((e|0)>0)f=0;else{l=i;return}do{g[d+(f<<4)+12>>2]=-999999984306749440.0;f=f+1|0}while((f|0)!=(e|0));h=i+32+4|0;f=0;do{j=b+(f<<4)|0;c[i+32>>2]=8168;c[h>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;g[i+32+20>>2]=-999999984306749440.0;c[i+32+24>>2]=c[j>>2];c[i+32+24+4>>2]=c[j+4>>2];c[i+32+24+8>>2]=c[j+8>>2];c[i+32+24+12>>2]=c[j+12>>2];c[i+16>>2]=1566444395;c[i+16+4>>2]=1566444395;c[i+16+8>>2]=1566444395;g[i+16+12>>2]=0.0;j=c[a+96>>2]|0;k=c[(c[j>>2]|0)+8>>2]|0;g[i>>2]=-999999984306749440.0;g[i+4>>2]=-999999984306749440.0;g[i+8>>2]=-999999984306749440.0;g[i+12>>2]=0.0;Vb[k&127](j,i+32|0,i,i+16|0);j=d+(f<<4)|0;c[j>>2]=c[h>>2];c[j+4>>2]=c[h+4>>2];c[j+8>>2]=c[h+8>>2];c[j+12>>2]=c[h+12>>2];f=f+1|0}while((f|0)<(e|0));l=i;return}function xi(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=c[b+100>>2]|0;if((f|0)==(c[b+104>>2]|0)?(i=f|0?f<<1:1,(f|0)<(i|0)):0){if(!i)h=0;else{c[6995]=(c[6995]|0)+1;f=sc((i<<4|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=f;f=c[b+100>>2]|0}if((f|0)>0){g=0;do{j=h+(g<<4)|0;k=(c[b+108>>2]|0)+(g<<4)|0;c[j>>2]=c[k>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];g=g+1|0}while((g|0)!=(f|0))}f=c[b+108>>2]|0;if(f|0){if(a[b+112>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+108>>2]=0}a[b+112>>0]=1;c[b+108>>2]=h;c[b+104>>2]=i;f=c[b+100>>2]|0}k=(c[b+108>>2]|0)+(f<<4)|0;c[k>>2]=c[d>>2];c[k+4>>2]=c[d+4>>2];c[k+8>>2]=c[d+8>>2];c[k+12>>2]=c[d+12>>2];c[b+100>>2]=(c[b+100>>2]|0)+1;if(!e)return;uj(b);return}function yi(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+96|0;b=c[b>>2]|0;if((b|0)==(c[a+4>>2]|0)){l=d;return 1}e=c[a+12>>2]|0;if(!(zb[c[(c[e>>2]|0)+8>>2]&31](e,c[b+188>>2]|0)|0)){l=d;return 1}e=c[a+4>>2]|0;f=c[e+192>>2]|0;c[d+64>>2]=0;c[d+64+4>>2]=f;c[d+64+8>>2]=e;c[d+64+12>>2]=e+4;c[d+64+16>>2]=-1;c[d+64+20>>2]=-1;e=c[b+192>>2]|0;c[d+40>>2]=0;c[d+40+4>>2]=e;c[d+40+8>>2]=b;c[d+40+12>>2]=b+4;c[d+40+16>>2]=-1;c[d+40+20>>2]=-1;b=c[(c[a+8>>2]|0)+24>>2]|0;b=Db[c[(c[b>>2]|0)+8>>2]&1](b,d+64|0,d+40|0,0,2)|0;if(b|0){f=c[a+12>>2]|0;c[d+4>>2]=0;c[d+8>>2]=d+64;c[d+12>>2]=d+40;g[d+32>>2]=0.0;c[d>>2]=6324;c[d+36>>2]=f;Zb[c[(c[b>>2]|0)+8>>2]&31](b,d+64|0,d+40|0,(c[a+8>>2]|0)+28|0,d);Ib[c[c[b>>2]>>2]&511](b);f=c[(c[a+8>>2]|0)+24>>2]|0;Ob[c[(c[f>>2]|0)+60>>2]&127](f,b)}l=d;return 1}function zi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,h=0,i=0,j=0,k=0;k=l;l=l+96|0;i=c[c[a>>2]>>2]|0;h=c[c[a+4>>2]>>2]|0;if(!(Bb[c[(c[b>>2]|0)+24>>2]&63](b,i,h)|0)){l=k;return}f=c[i+192>>2]|0;c[k+64>>2]=0;c[k+64+4>>2]=f;c[k+64+8>>2]=i;c[k+64+12>>2]=i+4;c[k+64+16>>2]=-1;c[k+64+20>>2]=-1;f=c[h+192>>2]|0;c[k+40>>2]=0;c[k+40+4>>2]=f;c[k+40+8>>2]=h;c[k+40+12>>2]=h+4;c[k+40+16>>2]=-1;c[k+40+20>>2]=-1;f=c[a+8>>2]|0;if(!f){f=Db[c[(c[b>>2]|0)+8>>2]&1](b,k+64|0,k+40|0,0,1)|0;c[a+8>>2]=f;if(f|0)j=4}else j=4;if((j|0)==4){c[k>>2]=5916;c[k+4>>2]=0;c[k+8>>2]=k+64;c[k+12>>2]=k+40;g[k+32>>2]=0.0;if((c[d+8>>2]|0)!=1){e=+tb[c[(c[f>>2]|0)+12>>2]&15](f,i,h,d,k);if(+g[d+12>>2]>e)g[d+12>>2]=e}else Zb[c[(c[f>>2]|0)+8>>2]&31](f,k+64|0,k+40|0,d,k)}l=k;return}function Ai(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0.0,h=0.0,i=0.0,j=0.0;c[a+4>>2]=35;c[a+8>>2]=0;c[a+12>>2]=-1;c[a+16>>2]=1065353216;c[a+20>>2]=1065353216;c[a+24>>2]=1065353216;g[a+28>>2]=0.0;g[a+48>>2]=.03999999910593033;c[a>>2]=8484;c[a+56>>2]=1;f=+g[b+4>>2]+-.03999999910593033;d=+g[b+8>>2]+-.03999999910593033;g[a+32>>2]=+g[b>>2]+-.03999999910593033;g[a+36>>2]=f;g[a+40>>2]=d;g[a+44>>2]=0.0;e=!(+g[b>>2]<+g[b+4>>2])&1;d=+g[b+((+g[b+(e<<2)>>2]<+g[b+8>>2]?e:2)<<2)>>2]*.10000000149011612;if(!(d<.03999999910593033)){c[a+4>>2]=13;return}j=+HG(a);h=+nb[c[(c[a>>2]|0)+48>>2]&15](a);f=+nb[c[(c[a>>2]|0)+48>>2]&15](a);j=j+ +g[a+32>>2];h=h+ +g[a+36>>2];f=f+ +g[a+40>>2];g[a+48>>2]=d;i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);d=+nb[c[(c[a>>2]|0)+48>>2]&15](a);f=f-+nb[c[(c[a>>2]|0)+48>>2]&15](a);g[a+32>>2]=j-i;g[a+36>>2]=h-d;g[a+40>>2]=f;g[a+44>>2]=0.0;c[a+4>>2]=13;return}function Bi(b){b=b|0;var d=0,e=0,f=0,h=0;c[b+32>>2]=262144;d=c[b+4>>2]|0;if((d|0)<2383){if((c[b+8>>2]|0)<2383){c[6995]=(c[6995]|0)+1;e=sc(9551)|0;if(!e)h=0;else{c[(e+4+15&-16)+-4>>2]=e;h=e+4+15&-16}f=c[b+4>>2]|0;if((f|0)>0){e=0;do{c[h+(e<<2)>>2]=c[(c[b+12>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0))}e=c[b+12>>2]|0;if(e|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=h;c[b+8>>2]=2383;e=b+12|0}else e=b+12|0;do{c[(c[e>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=2383)}c[b+4>>2]=2383;e=0;do{h=(c[b+12>>2]|0)+(e<<2)|0;d=c[h>>2]|0;c[h>>2]=0;if(d|0)do{h=d;d=c[d+280>>2]|0;cJ(h)}while((d|0)!=0);e=e+1|0}while((e|0)!=2383);g[b+20>>2]=.25;c[b+24>>2]=0;c[b+28>>2]=0;c[b+36>>2]=1;c[b+40>>2]=1;return}function Ci(a){a=a|0;var b=0.0,d=0,e=0,f=0.0,h=0.0,i=0.0,j=0.0;d=Nt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;g[d+48>>2]=.03999999910593033;c[d+56>>2]=0;c[d>>2]=8188;c[d+4>>2]=0;f=+g[a+4>>2]+-.03999999910593033;b=+g[a+8>>2]+-.03999999910593033;g[d+32>>2]=+g[a>>2]+-.03999999910593033;g[d+36>>2]=f;g[d+40>>2]=b;g[d+44>>2]=0.0;e=!(+g[a>>2]<+g[a+4>>2])&1;b=+g[a+((+g[a+(e<<2)>>2]<+g[a+8>>2]?e:2)<<2)>>2]*.10000000149011612;if(!(b<.03999999910593033))return d|0;j=+HG(d);h=+nb[c[(c[d>>2]|0)+48>>2]&15](d);f=+nb[c[(c[d>>2]|0)+48>>2]&15](d);j=j+ +g[d+32>>2];h=h+ +g[d+36>>2];f=f+ +g[d+40>>2];g[d+48>>2]=b;i=+nb[c[(c[d>>2]|0)+48>>2]&15](d);b=+nb[c[(c[d>>2]|0)+48>>2]&15](d);f=f-+nb[c[(c[d>>2]|0)+48>>2]&15](d);g[d+32>>2]=j-i;g[d+36>>2]=h-b;g[d+40>>2]=f;g[d+44>>2]=0.0;return d|0}function Di(b,d,e,f){b=b|0;d=+d;e=e|0;f=+f;var h=0,i=0.0,j=0;eb(c[6994]|0,0)|0;if(e){g[b+284>>2]=f;i=+g[b+280>>2]+d;g[b+280>>2]=i;if(!(i>=f)){d=f;j=0}else{g[b+280>>2]=i-+(~~(i/f)|0)*f;d=f;j=~~(i/f)}}else{g[b+280>>2]=a[b+316>>0]|0?0.0:d;g[b+284>>2]=0.0;j=!(+C(+d)<1.1920928955078125e-07)&1;e=j}if(xb[c[(c[b>>2]|0)+20>>2]&127](b)|0){h=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;a[28564]=(xb[c[(c[h>>2]|0)+56>>2]&127](h)|0)>>>4&1}if(j){h=(j|0)>(e|0)?e:j;Jb[c[(c[b>>2]|0)+168>>2]&31](b,d*+(h|0));Ib[c[(c[b>>2]|0)+176>>2]&511](b);if((h|0)>0){e=0;do{Jb[c[(c[b>>2]|0)+160>>2]&31](b,d);Ib[c[(c[b>>2]|0)+80>>2]&511](b);e=e+1|0}while((e|0)<(h|0));e=b}else e=b}else{Ib[c[(c[b>>2]|0)+80>>2]&511](b);e=b}Ib[c[(c[e>>2]|0)+120>>2]&511](b);c[6993]=(c[6993]|0)+1;return j|0}function Ei(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=c[d+4>>2]|0;f=c[b+24>>2]|0;if((f|0)<(i|0)){if((c[b+28>>2]|0)<(i|0)){if(!i){e=0;h=f}else{c[6995]=(c[6995]|0)+1;e=sc((i<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}h=c[b+24>>2]|0}if((h|0)>0){g=0;do{c[e+(g<<2)>>2]=c[(c[b+32>>2]|0)+(g<<2)>>2];g=g+1|0}while((g|0)!=(h|0))}g=c[b+32>>2]|0;if(g|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=e;c[b+28>>2]=i;e=b+32|0}else e=b+32|0;do{c[(c[e>>2]|0)+(f<<2)>>2]=0;f=f+1|0}while((f|0)!=(i|0))}else e=b+32|0;c[b+24>>2]=i;f=c[e>>2]|0;if((i|0)<=0)return;e=0;do{c[f+(e<<2)>>2]=c[(c[d+12>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(i|0));return}function Fi(a,b,d){a=a|0;b=b|0;d=d|0;do if(!((b|0)==32&(d|0)==32)){if((b|0)==32){if((d|0)<20){a=a+92|0;break}if((d+-21|0)>>>0<9){a=a+100|0;break}}else{if((b|0)<20&(d|0)==32){a=a+96|0;break}if((b+-21|0)>>>0<9&(d|0)==32){a=a+104|0;break}if((b|0)==8&(d|0)==8){a=a+56|0;break}if((b|0)==8&(d|0)==1){a=a+72|0;break}if((b|0)==1&(d|0)==8){a=a+76|0;break}}if(!(d|b)){a=a+68|0;break}if((b|0)<20&(d|0)==28){a=a+84|0;break}if((b|0)==28&(d|0)<20){a=a+80|0;break}if((b|0)<20){if((d|0)<20){a=a+28|0;break}if((d+-21|0)>>>0<9){a=a+32|0;break}}else{if((d|0)<20&(b+-21|0)>>>0<9){a=a+36|0;break}if((b|0)==31)if((d|0)==31){a=a+44|0;break}else{a=a+40|0;break}}if((d|0)==31){a=a+48|0;break}else{a=a+52|0;break}}else a=a+88|0;while(0);return c[a>>2]|0}function Gi(b){b=b|0;var d=0,e=0,f=0;c[b>>2]=6512;e=c[b+52>>2]|0;if((e|0)>0){d=0;do{f=c[(c[b+60>>2]|0)+(d<<2)>>2]|0;if(f|0){Ib[c[c[f>>2]>>2]&511](f);f=c[b+4>>2]|0;Ob[c[(c[f>>2]|0)+60>>2]&127](f,c[(c[b+60>>2]|0)+(d<<2)>>2]|0)}d=d+1|0}while((d|0)!=(e|0))}d=c[b+60>>2]|0;if(d|0){if(a[b+64>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+60>>2]=0}a[b+64>>0]=1;c[b+60>>2]=0;c[b+52>>2]=0;c[b+56>>2]=0;d=c[b+40>>2]|0;if(d|0){if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+40>>2]=0}a[b+44>>0]=1;c[b+40>>2]=0;c[b+32>>2]=0;c[b+36>>2]=0;d=c[b+20>>2]|0;if(!d){a[b+24>>0]=1;c[b+20>>2]=0;c[b+12>>2]=0;b=b+16|0;c[b>>2]=0;return}if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+20>>2]=0;a[b+24>>0]=1;c[b+20>>2]=0;c[b+12>>2]=0;b=b+16|0;c[b>>2]=0;return}function Hi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0,s=0.0,t=0;if((e|0)>0)f=0;else return;do{g[d+(f<<4)+12>>2]=-999999984306749440.0;f=f+1|0}while((f|0)!=(e|0));r=0;do{j=+g[a+16>>2];k=+g[b+(r<<4)>>2]*j;l=+g[a+20>>2];m=+g[b+(r<<4)+4>>2]*l;n=+g[a+24>>2];o=+g[b+(r<<4)+8>>2]*n;p=c[a+100>>2]|0;if((p|0)>0){q=c[a+108>>2]|0;f=-1;i=0;h=-3402823466385288598117041.0e14;do{s=k*+g[q+(i<<4)>>2]+m*+g[q+(i<<4)+4>>2]+o*+g[q+(i<<4)+8>>2];t=s>h;f=t?i:f;h=t?s:h;i=i+1|0}while((i|0)!=(p|0));o=+g[q+(f<<4)+4>>2]*l;s=+g[q+(f<<4)+8>>2]*n;g[d+(r<<4)>>2]=+g[q+(f<<4)>>2]*j;g[d+(r<<4)+4>>2]=o;g[d+(r<<4)+8>>2]=s}else h=-999999984306749440.0;g[d+(r<<4)+12>>2]=h;r=r+1|0}while((r|0)!=(e|0));return}function Ii(a,b,c,d,e,f,h,i,j,k,l){a=a|0;b=b|0;c=+c;d=+d;e=+e;f=+f;h=+h;i=+i;j=j|0;k=k|0;l=+l;var m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0;x=+g[a>>2]*f+ +g[a+16>>2]*h+ +g[a+32>>2]*i;v=+g[a+4>>2]*f+ +g[a+20>>2]*h+ +g[a+36>>2]*i;t=+g[a+8>>2]*f+ +g[a+24>>2]*h+ +g[a+40>>2]*i;s=+g[b>>2]*f+ +g[b+16>>2]*h+ +g[b+32>>2]*i;q=+g[b+4>>2]*f+ +g[b+20>>2]*h+ +g[b+36>>2]*i;o=+g[b+8>>2]*f+ +g[b+24>>2]*h+ +g[b+40>>2]*i;w=+g[j+80>>2];u=+g[j+84>>2];p=+g[j+88>>2];r=+g[k+80>>2];m=+g[k+84>>2];n=+g[k+88>>2];p=x*(x<0.0?-w:w)+v*(v<0.0?-u:u)+t*(t<0.0?-p:p);n=s*(s<0.0?-r:r)+q*(q<0.0?-m:m)+o*(o<0.0?-n:n);o=+g[j+96>>2];m=+g[k+96>>2];m=(p>o?p:o)+(n>m?n:m);return !((c*f+d*h+e*i+ml)|0}function Ji(a,b,d){a=a|0;b=b|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;while(1){m=c[a+12>>2]|0;n=c[m+(((b+d|0)/2|0)<<2)>>2]|0;f=b;e=d;while(1){l=c[n+772>>2]|0;l=c[((c[l+208>>2]|0)>-1?l:c[n+776>>2]|0)+208>>2]|0;while(1){h=m+(f<<2)|0;i=c[h>>2]|0;k=c[i+772>>2]|0;j=f+1|0;if((c[((c[k+208>>2]|0)>-1?k:c[i+776>>2]|0)+208>>2]|0)<(l|0))f=j;else break}while(1){g=c[m+(e<<2)>>2]|0;o=c[g+772>>2]|0;k=e+-1|0;if((l|0)<(c[((c[o+208>>2]|0)>-1?o:c[g+776>>2]|0)+208>>2]|0))e=k;else break}if((f|0)<=(e|0)){c[h>>2]=g;c[(c[a+12>>2]|0)+(e<<2)>>2]=i;f=j;e=k}if((f|0)>(e|0))break;m=c[a+12>>2]|0}if((e|0)>(b|0))Ji(a,b,e);if((f|0)<(d|0))b=f;else break}return} +function wd(b,d){b=b|0;d=+d;var e=0,f=0.0,h=0,i=0,j=0.0,k=0.0,m=0,n=0,o=0,p=0.0,q=0.0,r=0,s=0.0,t=0,u=0;r=l;l=l+288|0;o=c[b+248>>2]|0;if((o|0)>0){h=c[b+256>>2]|0;i=r+224+48|0;m=r+64+28|0;e=0;do{n=c[h+(e<<2)>>2]|0;g[n+268>>2]=1.0;a:do switch(c[n+220>>2]|0){case 2:case 5:break;default:if(!(c[n+204>>2]&3)){Af(n+4|0,+g[n+372>>2],+g[n+376>>2],+g[n+380>>2],n+388|0,d,r+224|0);f=+g[i>>2]-+g[n+52>>2];j=+g[r+224+52>>2]-+g[n+56>>2];k=+g[r+224+56>>2]-+g[n+60>>2];do if((a[b+44>>0]|0?(s=+g[n+276>>2],s*s!=0.0?s*s>2]|0)+4>>2]|0)<20:0){c[5787]=(c[5787]|0)+1;u=c[b+68>>2]|0;u=xb[c[(c[u>>2]|0)+36>>2]&127](u)|0;t=c[b+24>>2]|0;g[r+120+4>>2]=1.0;c[r+120+16>>2]=c[n+52>>2];c[r+120+16+4>>2]=c[n+52+4>>2];c[r+120+16+8>>2]=c[n+52+8>>2];c[r+120+16+12>>2]=c[n+52+12>>2];c[r+120+32>>2]=c[i>>2];c[r+120+32+4>>2]=c[i+4>>2];c[r+120+32+8>>2]=c[i+8>>2];c[r+120+32+12>>2]=c[i+12>>2];c[r+120+80>>2]=0;c[r+120>>2]=4556;c[r+120+84>>2]=n;c[r+120+92>>2]=u;c[r+120+96>>2]=t;t=c[n+272>>2]|0;c[r+64+8>>2]=0;c[r+64+12>>2]=-1;c[r+64>>2]=7020;c[r+64+4>>2]=8;c[r+64+16>>2]=1065353216;c[r+64+20>>2]=1065353216;c[r+64+24>>2]=1065353216;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;c[r+64+32>>2]=t;c[r+64+48>>2]=t;g[r+64+52>>2]=0.0;c[r+120+88>>2]=c[b+56>>2];t=c[n+188>>2]|0;c[r+120+8>>2]=c[t+4>>2];c[r+120+12>>2]=c[t+8>>2];c[r+48>>2]=c[i>>2];c[r+48+4>>2]=c[i+4>>2];c[r+48+8>>2]=c[i+8>>2];c[r+48+12>>2]=c[i+12>>2];c[r>>2]=c[n+4>>2];c[r+4>>2]=c[n+4+4>>2];c[r+8>>2]=c[n+4+8>>2];c[r+12>>2]=c[n+4+12>>2];c[r+16>>2]=c[n+20>>2];c[r+16+4>>2]=c[n+20+4>>2];c[r+16+8>>2]=c[n+20+8>>2];c[r+16+12>>2]=c[n+20+12>>2];c[r+32>>2]=c[n+36>>2];c[r+32+4>>2]=c[n+36+4>>2];c[r+32+8>>2]=c[n+36+8>>2];c[r+32+12>>2]=c[n+36+12>>2];Ud(b,r+64|0,n+4|0,r,r+120|0,0.0);f=+g[r+120+4>>2];if(f<1.0){g[n+268>>2]=f;Af(n+4|0,+g[n+372>>2],+g[n+376>>2],+g[n+380>>2],n+388|0,f*d,r+224|0);g[n+268>>2]=0.0;Oe(n,r+224|0);break a}else break}while(0);Oe(n,r+224|0)}}while(0);e=e+1|0}while((e|0)<(o|0))}if(!(a[b+291>>0]|0)){l=r;return}if((c[b+324>>2]|0)<=0){l=r;return}n=0;do{o=c[(c[b+332>>2]|0)+(n<<2)>>2]|0;h=c[o+772>>2]|0;h=(c[h+252>>2]&2|0)==0?0:h;m=c[o+776>>2]|0;m=(c[m+252>>2]&2|0)==0?0:m;e=c[o+780>>2]|0;if((e|0)>0)if(!h){h=0;do{f=+g[58]*+g[m+232>>2];if(f>0.0?(p=+g[o+4+(h*192|0)+124>>2],p!=0.0):0){k=f*+g[o+4+(h*192|0)+64>>2]*p;d=f*+g[o+4+(h*192|0)+68>>2]*p;s=f*+g[o+4+(h*192|0)+72>>2]*p;f=+g[o+4+(h*192|0)+36>>2]-+g[m+56>>2];j=+g[o+4+(h*192|0)+40>>2]-+g[m+60>>2];g[r+64>>2]=+g[o+4+(h*192|0)+32>>2]-+g[m+52>>2];g[r+64+4>>2]=f;g[r+64+8>>2]=j;g[r+64+12>>2]=0.0;g[r>>2]=k;g[r+4>>2]=d;g[r+8>>2]=s;g[r+12>>2]=0.0;ll(m,r,r+64|0);e=c[o+780>>2]|0}h=h+1|0}while((h|0)<(e|0))}else{i=0;do{f=+g[h+232>>2]*+g[m+232>>2];if(f>0.0?(q=+g[o+4+(i*192|0)+124>>2],q!=0.0):0){k=f*+g[o+4+(i*192|0)+64>>2]*q;d=f*+g[o+4+(i*192|0)+68>>2]*q;s=f*+g[o+4+(i*192|0)+72>>2]*q;g[r+224>>2]=-k;g[r+224+4>>2]=-d;g[r+224+8>>2]=-s;g[r+224+12>>2]=0.0;j=+g[o+4+(i*192|0)+52>>2]-+g[h+56>>2];f=+g[o+4+(i*192|0)+56>>2]-+g[h+60>>2];g[r+120>>2]=+g[o+4+(i*192|0)+48>>2]-+g[h+52>>2];g[r+120+4>>2]=j;g[r+120+8>>2]=f;g[r+120+12>>2]=0.0;f=+g[o+4+(i*192|0)+36>>2]-+g[m+56>>2];j=+g[o+4+(i*192|0)+40>>2]-+g[m+60>>2];g[r+64>>2]=+g[o+4+(i*192|0)+32>>2]-+g[m+52>>2];g[r+64+4>>2]=f;g[r+64+8>>2]=j;g[r+64+12>>2]=0.0;ll(h,r+224|0,r+120|0);g[r>>2]=k;g[r+4>>2]=d;g[r+8>>2]=s;g[r+12>>2]=0.0;ll(m,r,r+64|0);e=c[o+780>>2]|0}i=i+1|0}while((i|0)<(e|0))}n=n+1|0}while((n|0)<(c[b+324>>2]|0));l=r;return}function xd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0.0,i=0.0,j=0.0,k=0.0,m=0,n=0.0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0;q=l;l=l+240|0;c[a+4>>2]=(c[a+4>>2]|0)+1;p=c[b+36>>2]|0;o=c[d+36>>2]|0;f=c[a+8>>2]|0;J=c[(c[f+4>>2]|0)+28>>2]|0;d=c[J+(p*80|0)+64>>2]|0;b=(c[(c[a+12>>2]|0)+4>>2]|0)+28|0;e=c[(c[b>>2]|0)+(o*80|0)+64>>2]|0;f=c[f+12>>2]|0;n=+g[f>>2];H=+g[f+4>>2];I=+g[f+8>>2];h=+g[f+16>>2];k=+g[f+20>>2];t=+g[f+24>>2];r=+g[f+32>>2];u=+g[f+36>>2];C=+g[f+40>>2];v=+g[J+(p*80|0)>>2];w=+g[J+(p*80|0)+16>>2];x=+g[J+(p*80|0)+32>>2];y=+g[J+(p*80|0)+4>>2];z=+g[J+(p*80|0)+20>>2];A=+g[J+(p*80|0)+36>>2];i=+g[J+(p*80|0)+8>>2];B=+g[J+(p*80|0)+24>>2];D=+g[J+(p*80|0)+40>>2];s=+g[J+(p*80|0)+48>>2];j=+g[J+(p*80|0)+52>>2];G=+g[J+(p*80|0)+56>>2];E=+g[f+48>>2]+(n*s+H*j+I*G);F=+g[f+52>>2]+(h*s+k*j+t*G);G=+g[f+56>>2]+(r*s+u*j+C*G);g[q+176>>2]=n*v+H*w+I*x;g[q+176+4>>2]=n*y+H*z+I*A;g[q+176+8>>2]=n*i+H*B+I*D;g[q+176+12>>2]=0.0;g[q+176+16>>2]=h*v+k*w+t*x;g[q+176+20>>2]=h*y+k*z+t*A;g[q+176+24>>2]=h*i+k*B+t*D;g[q+176+28>>2]=0.0;g[q+176+32>>2]=r*v+u*w+C*x;g[q+176+36>>2]=r*y+u*z+C*A;g[q+176+40>>2]=r*i+u*B+C*D;g[q+176+44>>2]=0.0;g[q+176+48>>2]=E;g[q+176+52>>2]=F;g[q+176+56>>2]=G;g[q+176+60>>2]=0.0;f=c[(c[a+12>>2]|0)+12>>2]|0;G=+g[f>>2];F=+g[f+4>>2];E=+g[f+8>>2];D=+g[f+16>>2];C=+g[f+20>>2];B=+g[f+24>>2];u=+g[f+32>>2];i=+g[f+36>>2];r=+g[f+40>>2];b=c[b>>2]|0;A=+g[b+(o*80|0)>>2];z=+g[b+(o*80|0)+16>>2];y=+g[b+(o*80|0)+32>>2];x=+g[b+(o*80|0)+4>>2];w=+g[b+(o*80|0)+20>>2];v=+g[b+(o*80|0)+36>>2];t=+g[b+(o*80|0)+8>>2];k=+g[b+(o*80|0)+24>>2];h=+g[b+(o*80|0)+40>>2];I=+g[b+(o*80|0)+48>>2];H=+g[b+(o*80|0)+52>>2];n=+g[b+(o*80|0)+56>>2];j=+g[f+48>>2]+(G*I+F*H+E*n);s=+g[f+52>>2]+(D*I+C*H+B*n);n=+g[f+56>>2]+(u*I+i*H+r*n);g[q+112>>2]=G*A+F*z+E*y;g[q+112+4>>2]=G*x+F*w+E*v;g[q+112+8>>2]=G*t+F*k+E*h;g[q+112+12>>2]=0.0;g[q+112+16>>2]=D*A+C*z+B*y;g[q+112+20>>2]=D*x+C*w+B*v;g[q+112+24>>2]=D*t+C*k+B*h;g[q+112+28>>2]=0.0;g[q+112+32>>2]=u*A+i*z+r*y;g[q+112+36>>2]=u*x+i*w+r*v;g[q+112+40>>2]=u*t+i*k+r*h;g[q+112+44>>2]=0.0;g[q+112+48>>2]=j;g[q+112+52>>2]=s;g[q+112+56>>2]=n;g[q+112+60>>2]=0.0;Vb[c[(c[d>>2]|0)+8>>2]&127](d,q+176|0,q+96|0,q+80|0);Vb[c[(c[e>>2]|0)+8>>2]&127](e,q+112|0,q+64|0,q+48|0);n=+g[(c[a+24>>2]|0)+32>>2];s=+g[q+96>>2]-n;g[q+96>>2]=s;j=+g[q+96+4>>2]-n;g[q+96+4>>2]=j;h=+g[q+96+8>>2]-n;g[q+96+8>>2]=h;r=n+ +g[q+80>>2];g[q+80>>2]=r;k=n+ +g[q+80+4>>2];g[q+80+4>>2]=k;i=n+ +g[q+80+8>>2];g[q+80+8>>2]=i;if(!(s>+g[q+48>>2])?!(r<+g[q+64>>2]):0)b=1;else b=0;if(!(!(h>+g[q+48+8>>2])?!(i<+g[q+64+8>>2]):0))b=0;if(j>+g[q+48+4>>2]){l=q;return}if(k<+g[q+64+4>>2]|b^1){l=q;return}f=c[a+8>>2]|0;b=c[f+8>>2]|0;c[q+24>>2]=f;c[q+24+4>>2]=d;c[q+24+8>>2]=b;c[q+24+12>>2]=q+176;c[q+24+16>>2]=-1;c[q+24+20>>2]=p;b=c[a+12>>2]|0;f=c[b+8>>2]|0;c[q>>2]=b;c[q+4>>2]=e;c[q+8>>2]=f;c[q+12>>2]=q+112;c[q+16>>2]=-1;c[q+20>>2]=o;f=c[a+28>>2]|0;c[6416]=(c[6416]|0)+1;b=(((o<<16|p)+~((o<<16|p)<<15)|0)>>>10^(o<<16|p)+~((o<<16|p)<<15))*9|0;b=(c[f+12>>2]|0)+-1&(((b>>>6^b)+~((b>>>6^b)<<11)|0)>>>16^(b>>>6^b)+~((b>>>6^b)<<11));a:do if((b|0)<(c[f+28>>2]|0)?(m=c[(c[f+36>>2]|0)+(b<<2)>>2]|0,(m|0)!=-1):0){e=c[f+16>>2]|0;d=m;while(1){b=e+(d*12|0)|0;if((c[b>>2]|0)==(p|0)?(c[e+(d*12|0)+4>>2]|0)==(o|0):0)break a;d=c[(c[f+56>>2]|0)+(d<<2)>>2]|0;if((d|0)==-1){b=0;break}}}else b=0;while(0);do if(!(n>0.0))if(!b){b=c[a+16>>2]|0;b=Db[c[(c[b>>2]|0)+8>>2]&1](b,q+24|0,q,c[a+32>>2]|0,1)|0;J=c[a+28>>2]|0;c[(Bb[c[(c[J>>2]|0)+12>>2]&63](J,p,o)|0)+8>>2]=b;break}else{b=c[b+8>>2]|0;break}else{b=c[a+16>>2]|0;b=Db[c[(c[b>>2]|0)+8>>2]&1](b,q+24|0,q,0,2)|0}while(0);J=c[a+24>>2]|0;f=c[J+8>>2]|0;m=c[J+12>>2]|0;c[J+8>>2]=q+24;c[J+12>>2]=q;Sb[c[(c[J>>2]|0)+8>>2]&127](J,-1,p);J=c[a+24>>2]|0;Sb[c[(c[J>>2]|0)+12>>2]&127](J,-1,o);Zb[c[(c[b>>2]|0)+8>>2]&31](b,q+24|0,q,c[a+20>>2]|0,c[a+24>>2]|0);J=c[a+24>>2]|0;c[J+8>>2]=f;c[J+12>>2]=m;l=q;return}function yd(b,d,e){b=b|0;d=d|0;e=e|0;fi(b,d,e)|0;c[d+52>>2]=c[b+48>>2];c[d+56>>2]=c[b+52>>2];c[d+60>>2]=c[b+56>>2];c[d+64>>2]=c[b+60>>2];c[d+68>>2]=c[b+64>>2];c[d+72>>2]=c[b+68>>2];c[d+76>>2]=c[b+72>>2];c[d+80>>2]=c[b+76>>2];c[d+84>>2]=c[b+80>>2];c[d+88>>2]=c[b+84>>2];c[d+92>>2]=c[b+88>>2];c[d+96>>2]=c[b+92>>2];c[d+100>>2]=c[b+96>>2];c[d+104>>2]=c[b+100>>2];c[d+108>>2]=c[b+104>>2];c[d+112>>2]=c[b+108>>2];c[d+116>>2]=c[b+112>>2];c[d+120>>2]=c[b+116>>2];c[d+124>>2]=c[b+120>>2];c[d+128>>2]=c[b+124>>2];c[d+132>>2]=c[b+128>>2];c[d+136>>2]=c[b+132>>2];c[d+140>>2]=c[b+136>>2];c[d+144>>2]=c[b+140>>2];c[d+148>>2]=c[b+144>>2];c[d+152>>2]=c[b+148>>2];c[d+156>>2]=c[b+152>>2];c[d+160>>2]=c[b+156>>2];c[d+164>>2]=c[b+160>>2];c[d+168>>2]=c[b+164>>2];c[d+172>>2]=c[b+168>>2];c[d+176>>2]=c[b+172>>2];c[d+428>>2]=c[b+968>>2];c[d+412>>2]=c[b+972>>2];c[d+444>>2]=c[b+976>>2];c[d+460>>2]=c[b+980>>2];c[d+476>>2]=c[b+984>>2];c[d+492>>2]=c[b+988>>2];c[d+508>>2]=c[b+992>>2];c[d+524>>2]=c[b+1e3>>2];c[d+540>>2]=c[b+1004>>2];c[d+556>>2]=c[b+1012>>2];c[d+572>>2]=c[b+1020>>2];c[d+588>>2]=c[b+1028>>2];c[d+604>>2]=c[b+1036>>2];c[d+432>>2]=c[b+1056>>2];c[d+416>>2]=c[b+1060>>2];c[d+448>>2]=c[b+1064>>2];c[d+464>>2]=c[b+1068>>2];c[d+480>>2]=c[b+1072>>2];c[d+496>>2]=c[b+1076>>2];c[d+512>>2]=c[b+1080>>2];c[d+528>>2]=c[b+1088>>2];c[d+544>>2]=c[b+1092>>2];c[d+560>>2]=c[b+1100>>2];c[d+576>>2]=c[b+1108>>2];c[d+592>>2]=c[b+1116>>2];c[d+608>>2]=c[b+1124>>2];c[d+436>>2]=c[b+1144>>2];c[d+420>>2]=c[b+1148>>2];c[d+452>>2]=c[b+1152>>2];c[d+468>>2]=c[b+1156>>2];c[d+484>>2]=c[b+1160>>2];c[d+500>>2]=c[b+1164>>2];c[d+516>>2]=c[b+1168>>2];c[d+532>>2]=c[b+1176>>2];c[d+548>>2]=c[b+1180>>2];c[d+564>>2]=c[b+1188>>2];c[d+580>>2]=c[b+1196>>2];c[d+596>>2]=c[b+1204>>2];c[d+612>>2]=c[b+1212>>2];g[d+440>>2]=0.0;g[d+424>>2]=0.0;g[d+456>>2]=0.0;g[d+472>>2]=0.0;g[d+488>>2]=0.0;g[d+504>>2]=0.0;g[d+520>>2]=0.0;g[d+536>>2]=0.0;g[d+552>>2]=0.0;g[d+568>>2]=0.0;g[d+584>>2]=0.0;g[d+600>>2]=0.0;g[d+616>>2]=0.0;a[d+620>>0]=a[b+996>>0]|0;a[d+624>>0]=a[b+1008>>0]|0;a[d+628>>0]=a[b+1016>>0]|0;a[d+632>>0]=a[b+1024>>0]|0;a[d+636>>0]=a[b+1032>>0]|0;a[d+621>>0]=a[b+1084>>0]|0;a[d+625>>0]=a[b+1096>>0]|0;a[d+629>>0]=a[b+1104>>0]|0;a[d+633>>0]=a[b+1112>>0]|0;a[d+637>>0]=a[b+1120>>0]|0;a[d+622>>0]=a[b+1172>>0]|0;a[d+626>>0]=a[b+1184>>0]|0;a[d+630>>0]=a[b+1192>>0]|0;a[d+634>>0]=a[b+1200>>0]|0;a[d+638>>0]=a[b+1208>>0]|0;a[d+623>>0]=0;a[d+627>>0]=0;a[d+631>>0]=0;a[d+635>>0]=0;a[d+639>>0]=0;c[d+196>>2]=c[b+680>>2];c[d+200>>2]=c[b+684>>2];c[d+204>>2]=c[b+688>>2];c[d+208>>2]=c[b+692>>2];c[d+180>>2]=c[b+696>>2];c[d+184>>2]=c[b+700>>2];c[d+188>>2]=c[b+704>>2];c[d+192>>2]=c[b+708>>2];c[d+212>>2]=c[b+712>>2];c[d+216>>2]=c[b+716>>2];c[d+220>>2]=c[b+720>>2];c[d+224>>2]=c[b+724>>2];c[d+228>>2]=c[b+728>>2];c[d+232>>2]=c[b+732>>2];c[d+236>>2]=c[b+736>>2];c[d+240>>2]=c[b+740>>2];c[d+244>>2]=c[b+744>>2];c[d+248>>2]=c[b+748>>2];c[d+252>>2]=c[b+752>>2];c[d+256>>2]=c[b+756>>2];c[d+260>>2]=c[b+760>>2];c[d+264>>2]=c[b+764>>2];c[d+268>>2]=c[b+768>>2];c[d+272>>2]=c[b+772>>2];c[d+276>>2]=c[b+776>>2];c[d+280>>2]=c[b+780>>2];c[d+284>>2]=c[b+784>>2];c[d+288>>2]=c[b+788>>2];c[d+292>>2]=c[b+876>>2];c[d+296>>2]=c[b+880>>2];c[d+300>>2]=c[b+884>>2];c[d+304>>2]=c[b+888>>2];c[d+308>>2]=c[b+892>>2];c[d+312>>2]=c[b+896>>2];c[d+316>>2]=c[b+900>>2];c[d+320>>2]=c[b+904>>2];c[d+324>>2]=c[b+804>>2];c[d+328>>2]=c[b+808>>2];c[d+332>>2]=c[b+812>>2];c[d+336>>2]=c[b+816>>2];c[d+340>>2]=c[b+820>>2];c[d+344>>2]=c[b+824>>2];c[d+348>>2]=c[b+828>>2];c[d+352>>2]=c[b+832>>2];c[d+356>>2]=c[b+840>>2];c[d+360>>2]=c[b+844>>2];c[d+364>>2]=c[b+848>>2];c[d+368>>2]=c[b+852>>2];c[d+372>>2]=c[b+860>>2];c[d+376>>2]=c[b+864>>2];c[d+380>>2]=c[b+868>>2];c[d+384>>2]=c[b+872>>2];a[d+388>>0]=a[b+792>>0]|0;a[d+392>>0]=a[b+795>>0]|0;a[d+396>>0]=a[b+798>>0]|0;a[d+400>>0]=a[b+836>>0]|0;a[d+404>>0]=a[b+856>>0]|0;a[d+389>>0]=a[b+793>>0]|0;a[d+393>>0]=a[b+796>>0]|0;a[d+397>>0]=a[b+799>>0]|0;a[d+401>>0]=a[b+837>>0]|0;a[d+405>>0]=a[b+857>>0]|0;a[d+390>>0]=a[b+794>>0]|0;a[d+394>>0]=a[b+797>>0]|0;a[d+398>>0]=a[b+800>>0]|0;a[d+402>>0]=a[b+838>>0]|0;a[d+406>>0]=a[b+858>>0]|0;a[d+391>>0]=0;a[d+395>>0]=0;a[d+399>>0]=0;a[d+403>>0]=0;a[d+407>>0]=0;c[d+640>>2]=c[b+1232>>2];c[d+408>>2]=0;return 12302}function zd(b,d,e,f,h,i,j,k,m){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0,J=0.0;I=l;l=l+128|0;c[I+16>>2]=i;c[I+16+4>>2]=j;c[I+16+8>>2]=k;c[I>>2]=e;c[I+4>>2]=f;c[I+8>>2]=h;if(!(+g[d+52>>2]<+g[b+12>>2])){m=0;l=I;return m|0}w=+g[d+36>>2];y=+g[d+40>>2];x=+g[d+44>>2];k=c[d+48>>2]|0;z=1.0/+D(+(w*w+y*y+x*x));h=ui(I)|0;A=+g[d+4>>2]-+g[h+48>>2];B=+g[d+8>>2]-+g[h+52>>2];C=+g[d+12>>2]-+g[h+56>>2];h=ui(I+16|0)|0;E=+g[d+20>>2]-+g[h+48>>2];F=+g[d+24>>2]-+g[h+52>>2];G=+g[d+28>>2]-+g[h+56>>2];if(!f)if(!e){p=0.0;s=0.0;q=0.0;n=0.0;o=0.0;r=0.0}else{r=+g[e+336>>2];o=+g[e+340>>2];v=+g[e+332>>2];p=+g[e+316>>2];s=+g[e+320>>2];q=+g[e+324>>2];n=C*r-B*o;o=A*o-C*v;r=B*v-A*r}else{r=+g[f+392>>2];o=+g[f+396>>2];v=+g[f+388>>2];p=+g[f+372>>2];s=+g[f+376>>2];q=+g[f+380>>2];n=C*r-B*o;o=A*o-C*v;r=B*v-A*r}v=p+n;u=s+o;t=q+r;if(!j)if(!i){r=0.0;s=0.0;n=0.0;o=0.0;p=0.0;q=0.0}else{q=+g[i+336>>2];p=+g[i+340>>2];J=+g[i+332>>2];r=+g[i+316>>2];s=+g[i+320>>2];n=+g[i+324>>2];o=G*q-F*p;p=E*p-G*J;q=F*J-E*q}else{q=+g[j+392>>2];p=+g[j+396>>2];J=+g[j+388>>2];r=+g[j+372>>2];s=+g[j+376>>2];n=+g[j+380>>2];o=G*q-F*p;p=E*p-G*J;q=F*J-E*q}r=v-(r+o);u=u-(s+p);t=t-(n+q);v=x*z*t+(y*z*u+w*z*r);J=+g[d+52>>2]-+g[b+12>>2];c[m+4>>2]=c[I>>2];c[m+4+4>>2]=c[I+4>>2];c[m+4+8>>2]=c[I+8>>2];c[m+16>>2]=c[I+16>>2];c[m+16+4>>2]=c[I+16+4>>2];c[m+16+8>>2]=c[I+16+8>>2];d=ui(I)|0;s=A*+g[d+4>>2]+B*+g[d+20>>2]+C*+g[d+36>>2];q=A*+g[d+8>>2]+B*+g[d+24>>2]+C*+g[d+40>>2];g[m+28>>2]=A*+g[d>>2]+B*+g[d+16>>2]+C*+g[d+32>>2];g[m+32>>2]=s;g[m+36>>2]=q;g[m+40>>2]=0.0;d=ui(I+16|0)|0;q=E*+g[d+4>>2]+F*+g[d+20>>2]+G*+g[d+36>>2];s=E*+g[d+8>>2]+F*+g[d+24>>2]+G*+g[d+40>>2];g[m+44>>2]=E*+g[d>>2]+F*+g[d+16>>2]+G*+g[d+32>>2];g[m+48>>2]=q;g[m+52>>2]=s;g[m+56>>2]=0.0;g[m+164>>2]=A;g[m+168>>2]=B;g[m+172>>2]=C;g[m+176>>2]=0.0;g[m+180>>2]=E;g[m+184>>2]=F;g[m+188>>2]=G;g[m+192>>2]=0.0;g[m+60>>2]=1.0;g[m+64>>2]=1.0;c[m+156>>2]=0;c[m+160>>2]=0;g[m+68>>2]=1.0;g[m+72>>2]=w*z*J;g[m+76>>2]=y*z*J;g[m+80>>2]=x*z*J;g[m+84>>2]=0.0;g[m+196>>2]=w*z;g[m+200>>2]=y*z;g[m+204>>2]=x*z;c[m+208>>2]=k;a[m+152>>0]=0;J=+g[b+16>>2];g[m+212>>2]=(t-x*z*v)*(t-x*z*v)+((r-w*z*v)*(r-w*z*v)+(u-y*z*v)*(u-y*z*v))>2]|0;if(!k){k=c[I>>2]|0;if(!k)o=0.0;else{k=k+128|0;H=14}}else{k=k+404|0;H=14}if((H|0)==14)o=+g[k>>2];if((a[22432]|0)==0?Uz(22432)|0:0){k=22904;h=k+48|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(h|0))}k=c[I+4>>2]|0;if(!k){e=c[I>>2]|0;e=(e|0)==0?22904:e+180|0}else e=k+324|0;k=c[I+16+4>>2]|0;if(!k){k=c[I+16>>2]|0;if(!k)n=0.0;else{k=k+128|0;H=25}}else{k=k+404|0;H=25}if((H|0)==25)n=+g[k>>2];if((a[22432]|0)==0?Uz(22432)|0:0){k=22904;h=k+48|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(h|0))}k=c[I+16+4>>2]|0;if(!k){k=c[I+16>>2]|0;k=(k|0)==0?22904:k+180|0}else k=k+324|0;Uh(I+80|0,o,e,+g[m+164>>2],+g[m+168>>2],+g[m+172>>2]);Uh(I+32|0,n,k,+g[m+180>>2],+g[m+184>>2],+g[m+188>>2]);C=+g[I+80>>2]+ +g[I+32>>2];F=+g[I+80+4>>2]+ +g[I+32+4>>2];y=+g[I+80+8>>2]+ +g[I+32+8>>2];G=+g[I+80+16>>2]+ +g[I+32+16>>2];E=+g[I+80+20>>2]+ +g[I+32+20>>2];z=+g[I+80+24>>2]+ +g[I+32+24>>2];A=+g[I+80+32>>2]+ +g[I+32+32>>2];B=+g[I+80+36>>2]+ +g[I+32+36>>2];x=+g[I+80+40>>2]+ +g[I+32+40>>2];J=1.0/(y*(G*B-E*A)+(C*(E*x-z*B)+F*(z*A-G*x)));g[m+104>>2]=(E*x-z*B)*J;g[m+108>>2]=(y*B-F*x)*J;g[m+112>>2]=(F*z-y*E)*J;g[m+116>>2]=0.0;g[m+120>>2]=(z*A-G*x)*J;g[m+124>>2]=(C*x-y*A)*J;g[m+128>>2]=(y*G-C*z)*J;g[m+132>>2]=0.0;g[m+136>>2]=(G*B-E*A)*J;g[m+140>>2]=(F*A-C*B)*J;g[m+144>>2]=(C*E-F*G)*J;g[m+148>>2]=0.0;m=1;l=I;return m|0}function Ad(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var k=0.0,m=0,n=0.0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0,v=0.0,w=0.0;u=l;l=l+288|0;q=c[b+4>>2]|0;a[q+312>>0]=0;c[q>>2]=0;a[q+356>>0]=1;c[q+292>>2]=1566444395;c[q+296>>2]=1566444395;c[q+300>>2]=1566444395;g[q+304>>2]=0.0;c[q+336>>2]=0;c[q+336+4>>2]=0;c[q+336+8>>2]=0;c[q+336+12>>2]=0;a[q+336+16>>0]=0;a[q+332>>0]=a[q+332>>0]&-16;r=+g[e+48>>2]-+g[d+48>>2]-(+g[h+48>>2]-+g[f+48>>2]);s=+g[e+52>>2]-+g[d+52>>2]-(+g[h+52>>2]-+g[f+52>>2]);t=+g[e+56>>2]-+g[d+56>>2]-(+g[h+56>>2]-+g[f+56>>2]);c[u+216>>2]=9504;g[u+216+36>>2]=999999984306749440.0;a[u+216+40>>0]=0;q=c[b+8>>2]|0;p=c[b+12>>2]|0;o=c[b+4>>2]|0;c[u+136>>2]=9552;c[u+136+4>>2]=0;c[u+136+8>>2]=1065353216;c[u+136+12>>2]=0;g[u+136+16>>2]=0.0;c[u+136+20>>2]=0;c[u+136+24>>2]=o;c[u+136+28>>2]=q;c[u+136+32>>2]=p;c[u+136+36>>2]=c[q+4>>2];c[u+136+40>>2]=c[p+4>>2];g[u+136+44>>2]=+nb[c[(c[q>>2]|0)+48>>2]&15](q);g[u+136+48>>2]=+nb[c[(c[p>>2]|0)+48>>2]&15](p);a[u+136+52>>0]=0;c[u+136+60>>2]=-1;c[u+136+72>>2]=1;c[u+136+76>>2]=1;g[u+128>>2]=999999984306749440.0;c[u>>2]=c[d>>2];c[u+4>>2]=c[d+4>>2];c[u+8>>2]=c[d+8>>2];c[u+12>>2]=c[d+12>>2];c[u+16>>2]=c[d+16>>2];c[u+16+4>>2]=c[d+16+4>>2];c[u+16+8>>2]=c[d+16+8>>2];c[u+16+12>>2]=c[d+16+12>>2];c[u+32>>2]=c[d+32>>2];c[u+32+4>>2]=c[d+32+4>>2];c[u+32+8>>2]=c[d+32+8>>2];c[u+32+12>>2]=c[d+32+12>>2];c[u+48>>2]=c[d+48>>2];c[u+48+4>>2]=c[d+48+4>>2];c[u+48+8>>2]=c[d+48+8>>2];c[u+48+12>>2]=c[d+48+12>>2];c[u+64>>2]=c[f>>2];c[u+64+4>>2]=c[f+4>>2];c[u+64+8>>2]=c[f+8>>2];c[u+64+12>>2]=c[f+12>>2];c[u+80>>2]=c[f+16>>2];c[u+80+4>>2]=c[f+16+4>>2];c[u+80+8>>2]=c[f+16+8>>2];c[u+80+12>>2]=c[f+16+12>>2];c[u+96>>2]=c[f+32>>2];c[u+96+4>>2]=c[f+32+4>>2];c[u+96+8>>2]=c[f+32+8>>2];c[u+96+12>>2]=c[f+32+12>>2];c[u+112>>2]=c[f+48>>2];c[u+112+4>>2]=c[f+48+4>>2];c[u+112+8>>2]=c[f+48+8>>2];c[u+112+12>>2]=c[f+48+12>>2];Dc(u+136|0,u,u+216|0,0,0);p=(a[u+216+40>>0]|0)==0;q=u+216+20|0;c[u+264>>2]=c[q>>2];c[u+264+4>>2]=c[q+4>>2];c[u+264+8>>2]=c[q+8>>2];c[u+264+12>>2]=c[q+12>>2];if(p){i=0;l=u;return i|0}n=+g[u+216+36>>2];k=+g[u+216+16>>2];b=c[u+216+12>>2]|0;m=c[u+216+8>>2]|0;o=c[u+216+4>>2]|0;do if(n>1.0000000474974513e-03){p=0;k=0.0;while(1){if((p|0)>31){b=0;p=13;break}w=r*(c[j>>2]=o,+g[j>>2]);w=s*(c[j>>2]=m,+g[j>>2])+w;v=k;k=k-n/(t*(c[j>>2]=b,+g[j>>2])+w);if(!(!(k<=v)&(!(k<0.0)&!(k>1.0)))){b=0;p=13;break}Jb[c[c[i>>2]>>2]&31](i,k);w=1.0-k;g[u+48>>2]=w*+g[d+48>>2]+k*+g[e+48>>2];g[u+52>>2]=w*+g[d+52>>2]+k*+g[e+52>>2];g[u+56>>2]=w*+g[d+56>>2]+k*+g[e+56>>2];g[u+112>>2]=w*+g[f+48>>2]+k*+g[h+48>>2];g[u+116>>2]=w*+g[f+52>>2]+k*+g[h+52>>2];g[u+120>>2]=w*+g[f+56>>2]+k*+g[h+56>>2];Dc(u+136|0,u,u+216|0,0,0);if(!(a[u+216+40>>0]|0)){b=0;p=13;break}n=+g[u+216+36>>2];if(n<0.0){p=8;break}c[u+264>>2]=c[q>>2];c[u+264+4>>2]=c[q+4>>2];c[u+264+8>>2]=c[q+8>>2];c[u+264+12>>2]=c[q+12>>2];b=c[u+216+12>>2]|0;m=c[u+216+8>>2]|0;o=c[u+216+4>>2]|0;if(!(n>1.0000000474974513e-03)){p=10;break}else p=p+1|0}if((p|0)==8){g[i+164>>2]=k;e=c[u+216+8>>2]|0;f=c[u+216+12>>2]|0;h=c[u+216+16>>2]|0;c[i+132>>2]=c[u+216+4>>2];c[i+136>>2]=e;c[i+140>>2]=f;c[i+144>>2]=h;c[i+148>>2]=c[q>>2];c[i+148+4>>2]=c[q+4>>2];c[i+148+8>>2]=c[q+8>>2];c[i+148+12>>2]=c[q+12>>2];i=1;l=u;return i|0}else if((p|0)==10){n=k;k=+g[u+216+16>>2];break}else if((p|0)==13){l=u;return b|0}}else n=0.0;while(0);w=r*(c[j>>2]=o,+g[j>>2]);w=s*(c[j>>2]=m,+g[j>>2])+w;if(t*(c[j>>2]=b,+g[j>>2])+w>=-+g[i+172>>2]){i=0;l=u;return i|0}g[i+164>>2]=n;c[i+132>>2]=o;c[i+136>>2]=m;c[i+140>>2]=b;g[i+144>>2]=k;c[i+148>>2]=c[u+264>>2];c[i+148+4>>2]=c[u+264+4>>2];c[i+148+8>>2]=c[u+264+8>>2];c[i+148+12>>2]=c[u+264+12>>2];i=1;l=u;return i|0}function Bd(a,d,f,h,i){a=a|0;d=d|0;f=f|0;h=h|0;i=i|0;var j=0,k=0.0,m=0.0,n=0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0,u=0.0,v=0,w=0,x=0.0,y=0.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;P=l;l=l+16|0;c[d+16>>2]=c[f>>2];c[d+16+4>>2]=c[f+4>>2];c[d+16+8>>2]=c[f+8>>2];c[d+16+12>>2]=c[f+12>>2];c[d+32>>2]=c[h>>2];c[d+32+4>>2]=c[h+4>>2];c[d+32+8>>2]=c[h+8>>2];c[d+32+12>>2]=c[h+12>>2];H=c[a+60>>2]|0;I=c[d+12>>2]&65535;q=+g[a+8>>2];s=+g[a+12>>2];x=+g[a+16>>2];r=+g[a+40>>2];k=(+g[f>>2]-q)*r;u=+g[a+44>>2];m=(+g[f+4>>2]-s)*u;y=+g[a+48>>2];o=(+g[f+8>>2]-x)*y;if(!(k<=0.0)){p=b[a+6>>1]|0;p=(!(k>=+(p&65535))?~~k&65535:p)&b[a+4>>1]}else p=0;b[P+6>>1]=p;if(!(m<=0.0)){j=b[a+6>>1]|0;j=(!(m>=+(j&65535))?~~m&65535:j)&b[a+4>>1]}else j=0;b[P+6+2>>1]=j;if(!(o<=0.0)){j=b[a+6>>1]|0;j=(!(o>=+(j&65535))?~~o&65535:j)&b[a+4>>1]}else j=0;b[P+6+4>>1]=j;o=(+g[h>>2]-q)*r;m=(+g[h+4>>2]-s)*u;k=(+g[h+8>>2]-x)*y;if(!(o<=0.0)){n=b[a+6>>1]|0;n=(!(o>=+(n&65535))?~~o&65535:n)&b[a+4>>1]|1}else n=1;b[P>>1]=n;if(!(m<=0.0)){j=b[a+6>>1]|0;j=(!(m>=+(j&65535))?~~m&65535:j)&b[a+4>>1]|1}else j=1;b[P+2>>1]=j;if(!(k<=0.0)){j=b[a+6>>1]|0;j=(!(k>=+(j&65535))?~~k&65535:j)&b[a+4>>1]|1}else j=1;b[P+4>>1]=j;G=0;while(1){D=b[H+(I<<6)+48+(G<<1)>>1]|0;E=b[H+(I<<6)+54+(G<<1)>>1]|0;B=a+68+(G<<2)|0;A=c[B>>2]|0;C=(p&65535)-(e[A+((D&65535)<<2)>>1]|0)|0;F=(n&65535)-(e[A+((E&65535)<<2)>>1]|0)|0;b[A+((D&65535)<<2)>>1]=p;b[A+((E&65535)<<2)>>1]=n;if((C|0)<0)xh(a,G,D);a:do if((F|0)>0?(J=c[B>>2]|0,K=c[a+60>>2]|0,L=e[J+((E&65535)<<2)+2>>1]|0,M=b[J+((E&65535)<<2)+6>>1]|0,M<<16>>16):0){z=1<>1]|0;if((e[w>>1]|0)<(n&65535))break a;t=c[a+60>>2]|0;p=j&65535;if(!(n&1)){do if((((e[K+(L<<6)+54+(z<<1)>>1]|0)>=(e[t+(p<<6)+48+(z<<1)>>1]|0)?(e[t+(p<<6)+54+(z<<1)>>1]|0)>=(e[K+(L<<6)+48+(z<<1)>>1]|0):0)?(e[K+(L<<6)+54+((1<>1]|0)>=(e[t+(p<<6)+48+((1<>1]|0):0)?(e[t+(p<<6)+54+((1<>1]|0)>=(e[K+(L<<6)+48+((1<>1]|0):0){n=c[a+92>>2]|0;j=t+((e[w+2>>1]|0)<<6)|0;Bb[c[(c[n>>2]|0)+8>>2]&63](n,j,t+(p<<6)|0)|0;n=c[a+96>>2]|0;if(!n)break;Bb[c[(c[n>>2]|0)+8>>2]&63](n,j,t+(p<<6)|0)|0}while(0);j=t+(p<<6)+48+(G<<1)|0}else j=t+(p<<6)+54+(G<<1)|0;b[j>>1]=(b[j>>1]|0)+-1<<16>>16;b[A>>1]=(b[A>>1]|0)+1<<16>>16;j=e[w>>1]|e[w+2>>1]<<16;t=e[v>>1]|e[v+2>>1]<<16;b[w>>1]=t;b[w+2>>1]=t>>>16;b[v>>1]=j;b[v+2>>1]=j>>>16;j=b[w+10>>1]|0}while(j<<16>>16!=0)}while(0);b:do if((C|0)>0?(N=c[B>>2]|0,O=b[N+((D&65535)<<2)+6>>1]|0,O<<16>>16):0){z=(c[a+60>>2]|0)+((e[N+((D&65535)<<2)+2>>1]|0)<<6)+48+(G<<1)|0;A=1<>1]|0;if((e[w>>1]|0)<(n&65535))break b;t=c[a+60>>2]|0;p=j&65535;if(!(n&1))j=t+(p<<6)+48+(G<<1)|0;else{j=e[w+2>>1]|0;do if(((e[t+(j<<6)+54+(A<<1)>>1]|0)>=(e[t+(p<<6)+48+(A<<1)>>1]|0)?(e[t+(p<<6)+54+(A<<1)>>1]|0)>=(e[t+(j<<6)+48+(A<<1)>>1]|0):0)?(e[t+(j<<6)+54+((1<>1]|0)>=(e[t+(p<<6)+48+((1<>1]|0):0){if((e[t+(p<<6)+54+((1<>1]|0)<(e[t+(j<<6)+48+((1<>1]|0))break;n=c[a+92>>2]|0;Cb[c[(c[n>>2]|0)+12>>2]&31](n,t+(j<<6)|0,t+(p<<6)|0,i)|0;n=c[a+96>>2]|0;if(!n)break;Cb[c[(c[n>>2]|0)+12>>2]&31](n,t+(j<<6)|0,t+(p<<6)|0,i)|0}while(0);j=t+(p<<6)+54+(G<<1)|0}b[j>>1]=(b[j>>1]|0)+-1<<16>>16;b[z>>1]=(b[z>>1]|0)+1<<16>>16;j=e[w>>1]|e[w+2>>1]<<16;D=e[v>>1]|e[v+2>>1]<<16;b[w>>1]=D;b[w+2>>1]=D>>>16;b[v>>1]=j;b[v+2>>1]=j>>>16;j=b[w+10>>1]|0}while(j<<16>>16!=0)}while(0);if((F|0)<0)sh(a,G,E,i);j=G+1|0;if((j|0)==3)break;G=j;p=b[P+6+(j<<1)>>1]|0;n=b[P+(j<<1)>>1]|0}j=c[a+108>>2]|0;if(!j){l=P;return}Zb[c[(c[j>>2]|0)+16>>2]&31](j,c[d+60>>2]|0,f,h,i);l=P;return}function Cd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;if(!a)return;b=c[7001]|0;d=c[a+-4>>2]|0;j=a+-8+(d&-8)|0;do if(!(d&1)){e=c[a+-8>>2]|0;if(!(d&3))return;h=a+-8+(0-e)|0;g=e+(d&-8)|0;if(h>>>0>>0)return;if((h|0)==(c[7002]|0)){a=c[j+4>>2]|0;if((a&3|0)!=3){i=h;b=g;break}c[6999]=g;c[j+4>>2]=a&-2;c[h+4>>2]=g|1;c[h+g>>2]=g;return}if(e>>>0<256){a=c[h+8>>2]|0;b=c[h+12>>2]|0;if((b|0)==(a|0)){c[6997]=c[6997]&~(1<<(e>>>3));i=h;b=g;break}else{c[a+12>>2]=b;c[b+8>>2]=a;i=h;b=g;break}}f=c[h+24>>2]|0;a=c[h+12>>2]|0;do if((a|0)==(h|0)){a=c[h+16+4>>2]|0;if(!a){a=c[h+16>>2]|0;if(!a){a=0;break}else e=h+16|0}else e=h+16+4|0;while(1){b=a+20|0;d=c[b>>2]|0;if(d|0){a=d;e=b;continue}b=a+16|0;d=c[b>>2]|0;if(!d)break;else{a=d;e=b}}c[e>>2]=0}else{i=c[h+8>>2]|0;c[i+12>>2]=a;c[a+8>>2]=i}while(0);if(f){b=c[h+28>>2]|0;if((h|0)==(c[28292+(b<<2)>>2]|0)){c[28292+(b<<2)>>2]=a;if(!a){c[6998]=c[6998]&~(1<>2]|0)!=(h|0)&1)<<2)>>2]=a;if(!a){i=h;b=g;break}}c[a+24>>2]=f;b=c[h+16>>2]|0;if(b|0){c[a+16>>2]=b;c[b+24>>2]=a}b=c[h+16+4>>2]|0;if(b){c[a+20>>2]=b;c[b+24>>2]=a;i=h;b=g}else{i=h;b=g}}else{i=h;b=g}}else{i=a+-8|0;b=d&-8;h=a+-8|0}while(0);if(h>>>0>=j>>>0)return;d=c[j+4>>2]|0;if(!(d&1))return;if(!(d&2)){a=c[7002]|0;if((j|0)==(c[7003]|0)){j=(c[7e3]|0)+b|0;c[7e3]=j;c[7003]=i;c[i+4>>2]=j|1;if((i|0)!=(a|0))return;c[7002]=0;c[6999]=0;return}if((j|0)==(a|0)){j=(c[6999]|0)+b|0;c[6999]=j;c[7002]=h;c[i+4>>2]=j|1;c[h+j>>2]=j;return}f=(d&-8)+b|0;do if(d>>>0<256){b=c[j+8>>2]|0;a=c[j+12>>2]|0;if((a|0)==(b|0)){c[6997]=c[6997]&~(1<<(d>>>3));break}else{c[b+12>>2]=a;c[a+8>>2]=b;break}}else{g=c[j+24>>2]|0;a=c[j+12>>2]|0;do if((a|0)==(j|0)){a=c[j+16+4>>2]|0;if(!a){a=c[j+16>>2]|0;if(!a){b=0;break}else e=j+16|0}else e=j+16+4|0;while(1){b=a+20|0;d=c[b>>2]|0;if(d|0){a=d;e=b;continue}b=a+16|0;d=c[b>>2]|0;if(!d)break;else{a=d;e=b}}c[e>>2]=0;b=a}else{b=c[j+8>>2]|0;c[b+12>>2]=a;c[a+8>>2]=b;b=a}while(0);if(g|0){a=c[j+28>>2]|0;if((j|0)==(c[28292+(a<<2)>>2]|0)){c[28292+(a<<2)>>2]=b;if(!b){c[6998]=c[6998]&~(1<>2]|0)!=(j|0)&1)<<2)>>2]=b;if(!b)break}c[b+24>>2]=g;a=c[j+16>>2]|0;if(a|0){c[b+16>>2]=a;c[a+24>>2]=b}a=c[j+16+4>>2]|0;if(a|0){c[b+20>>2]=a;c[a+24>>2]=b}}}while(0);c[i+4>>2]=f|1;c[h+f>>2]=f;if((i|0)==(c[7002]|0)){c[6999]=f;return}}else{c[j+4>>2]=d&-2;c[i+4>>2]=b|1;c[h+b>>2]=b;f=b}d=f>>>3;if(f>>>0<256){a=c[6997]|0;if(!(a&1<>2]|0;b=28028+(d<<1<<2)+8|0}c[b>>2]=i;c[a+12>>2]=i;c[i+8>>2]=a;c[i+12>>2]=28028+(d<<1<<2);return}a=f>>>8;if(a)if(f>>>0>16777215)a=31;else{j=a<<((a+1048320|0)>>>16&8)<<(((a<<((a+1048320|0)>>>16&8))+520192|0)>>>16&4);a=14-(((a<<((a+1048320|0)>>>16&8))+520192|0)>>>16&4|(a+1048320|0)>>>16&8|(j+245760|0)>>>16&2)+(j<<((j+245760|0)>>>16&2)>>>15)|0;a=f>>>(a+7|0)&1|a<<1}else a=0;e=28292+(a<<2)|0;c[i+28>>2]=a;c[i+20>>2]=0;c[i+16>>2]=0;b=c[6998]|0;d=1<>>1)|0);d=c[e>>2]|0;while(1){if((c[d+4>>2]&-8|0)==(f|0)){a=73;break}e=d+16+(b>>>31<<2)|0;a=c[e>>2]|0;if(!a){a=72;break}else{b=b<<1;d=a}}if((a|0)==72){c[e>>2]=i;c[i+24>>2]=d;c[i+12>>2]=i;c[i+8>>2]=i;break}else if((a|0)==73){h=d+8|0;j=c[h>>2]|0;c[j+12>>2]=i;c[h>>2]=i;c[i+8>>2]=j;c[i+12>>2]=d;c[i+24>>2]=0;break}}else{c[6998]=b|d;c[e>>2]=i;c[i+24>>2]=e;c[i+12>>2]=i;c[i+8>>2]=i}while(0);j=(c[7005]|0)+-1|0;c[7005]=j;if(!j)a=28444;else return;while(1){a=c[a>>2]|0;if(!a)break;else a=a+8|0}c[7005]=-1;return}function Dd(b){b=b|0;var d=0.0,e=0,f=0,h=0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0;q=l;l=l+192|0;if(!(xb[c[(c[b>>2]|0)+20>>2]&127](b)|0)){l=q;return}i=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Ib[c[(c[i>>2]|0)+100>>2]&511](i);i=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Ob[c[(c[i>>2]|0)+8>>2]&127](q+80|0,i);i=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;if(((xb[c[(c[i>>2]|0)+56>>2]&127](i)|0)&8|0?(e=c[b+24>>2]|0,e|0):0)?(j=xb[c[(c[e>>2]|0)+36>>2]&127](e)|0,(j|0)>0):0){f=0;do{h=c[b+24>>2]|0;h=zb[c[(c[h>>2]|0)+40>>2]&31](h,f)|0;i=c[h+780>>2]|0;if((i|0)>0){e=0;do{r=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Ub[c[(c[r>>2]|0)+40>>2]&0](r,h+4+(e*192|0)+32|0,h+4+(e*192|0)+64|0,+g[h+4+(e*192|0)+80>>2],c[h+4+(e*192|0)+156>>2]|0,q+80+96|0);e=e+1|0}while((e|0)!=(i|0))}f=f+1|0}while((f|0)!=(j|0))}r=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;if((xb[c[(c[r>>2]|0)+56>>2]&127](r)|0)&3|0?(c[b+8>>2]|0)>0:0){h=0;do{e=c[(c[b+16>>2]|0)+(h<<2)>>2]|0;if(!(c[e+204>>2]&32)){if(xb[c[(c[b>>2]|0)+20>>2]&127](b)|0?(r=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0,(xb[c[(c[r>>2]|0)+56>>2]&127](r)|0)&1|0):0){c[q+64>>2]=1053609165;c[q+64+4>>2]=1053609165;c[q+64+8>>2]=1053609165;g[q+64+12>>2]=0.0;switch(c[e+220>>2]|0){case 1:{c[q+64>>2]=c[q+80>>2];c[q+64+4>>2]=c[q+80+4>>2];c[q+64+8>>2]=c[q+80+8>>2];c[q+64+12>>2]=c[q+80+12>>2];break}case 2:{c[q+64>>2]=c[q+80+16>>2];c[q+64+4>>2]=c[q+80+16+4>>2];c[q+64+8>>2]=c[q+80+16+8>>2];c[q+64+12>>2]=c[q+80+16+12>>2];break}case 3:{c[q+64>>2]=c[q+80+32>>2];c[q+64+4>>2]=c[q+80+32+4>>2];c[q+64+8>>2]=c[q+80+32+8>>2];c[q+64+12>>2]=c[q+80+32+12>>2];break}case 4:{c[q+64>>2]=c[q+80+48>>2];c[q+64+4>>2]=c[q+80+48+4>>2];c[q+64+8>>2]=c[q+80+48+8>>2];c[q+64+12>>2]=c[q+80+48+12>>2];break}case 5:{c[q+64>>2]=c[q+80+64>>2];c[q+64+4>>2]=c[q+80+64+4>>2];c[q+64+8>>2]=c[q+80+64+8>>2];c[q+64+12>>2]=c[q+80+64+12>>2];break}default:{c[q+64>>2]=1050253722;c[q+64+4>>2]=1050253722;c[q+64+8>>2]=1050253722;g[q+64+12>>2]=0.0}}if(c[e+204>>2]&256|0){c[q+64>>2]=c[e+308>>2];c[q+64+4>>2]=c[e+308+4>>2];c[q+64+8>>2]=c[e+308+8>>2];c[q+64+12>>2]=c[e+308+12>>2]}Vb[c[(c[b>>2]|0)+28>>2]&127](b,e+4|0,c[e+192>>2]|0,q+64|0)}f=c[b+72>>2]|0;if(f|0?(xb[c[(c[f>>2]|0)+56>>2]&127](f)|0)&2|0:0){c[q+32>>2]=c[q+80+80>>2];c[q+32+4>>2]=c[q+80+80+4>>2];c[q+32+8>>2]=c[q+80+80+8>>2];c[q+32+12>>2]=c[q+80+80+12>>2];r=c[e+192>>2]|0;Vb[c[(c[r>>2]|0)+8>>2]&127](r,e+4|0,q+64|0,q+48|0);g[q+64>>2]=+g[q+64>>2]+-.019999999552965164;g[q+64+4>>2]=+g[q+64+4>>2]+-.019999999552965164;g[q+64+8>>2]=+g[q+64+8>>2]+-.019999999552965164;g[q+48>>2]=+g[q+48>>2]+.019999999552965164;g[q+48+4>>2]=+g[q+48+4>>2]+.019999999552965164;g[q+48+8>>2]=+g[q+48+8>>2]+.019999999552965164;do if((a[b+44>>0]|0?(c[e+252>>2]|0)==2:0)?(c[e+204>>2]&3|0)==0:0){r=c[e+192>>2]|0;Vb[c[(c[r>>2]|0)+8>>2]&127](r,e+68|0,q+16|0,q);d=+g[q+16>>2]+-.019999999552965164;g[q+16>>2]=d;k=+g[q+16+4>>2]+-.019999999552965164;g[q+16+4>>2]=k;m=+g[q+16+8>>2]+-.019999999552965164;g[q+16+8>>2]=m;n=+g[q>>2]+.019999999552965164;g[q>>2]=n;o=+g[q+4>>2]+.019999999552965164;g[q+4>>2]=o;p=+g[q+8>>2]+.019999999552965164;g[q+8>>2]=p;if(d<+g[q+64>>2])g[q+64>>2]=d;if(k<+g[q+64+4>>2])g[q+64+4>>2]=k;if(m<+g[q+64+8>>2])g[q+64+8>>2]=m;d=+g[q+16+12>>2];if(d<+g[q+64+12>>2])g[q+64+12>>2]=d;if(+g[q+48>>2]>2]=n;if(+g[q+48+4>>2]>2]=o;if(+g[q+48+8>>2]>2]=p;d=+g[q+12>>2];if(!(+g[q+48+12>>2]>2]=d}while(0);r=c[b+72>>2]|0;Vb[c[(c[r>>2]|0)+60>>2]&127](r,q+64|0,q+48|0,q+32|0)}}h=h+1|0}while((h|0)<(c[b+8>>2]|0))}l=q;return}function Ed(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;t=l;l=l+32|0;g=xb[c[(c[d>>2]|0)+28>>2]&127](d)|0;c[e+20>>2]=g;c[e>>2]=0;if(!g){s=e+24|0;c[s>>2]=0;s=d+4|0;f=e+4|0;s=c[s>>2]|0;c[f>>2]=s;f=d+8|0;f=c[f>>2]|0;s=e+8|0;c[s>>2]=f;s=d+12|0;s=c[s>>2]|0;f=e+12|0;c[f>>2]=s;d=d+16|0;d=c[d>>2]|0;f=e+16|0;c[f>>2]=d;l=t;return 19256}s=Bb[c[(c[f>>2]|0)+16>>2]&63](f,32,g)|0;g=c[s+8>>2]|0;c[e>>2]=zb[c[(c[f>>2]|0)+28>>2]&31](f,g)|0;r=xb[c[(c[d>>2]|0)+28>>2]&127](d)|0;a:do if((r|0)>0){q=0;while(1){cc[c[(c[d>>2]|0)+16>>2]&3](d,t+28|0,t+4|0,t+16|0,t+8|0,t+24|0,t+20|0,t,t+12|0,q);i=c[t>>2]|0;c[g+24>>2]=i;c[g+28>>2]=c[t+4>>2];j=g+12|0;m=g+16|0;p=g+4|0;c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0;c[g+20>>2]=0;switch(c[t+12>>2]|0){case 2:{if(i|0){j=Bb[c[(c[f>>2]|0)+16>>2]&63](f,4,i*3|0)|0;k=c[j+8>>2]|0;c[g+8>>2]=zb[c[(c[f>>2]|0)+28>>2]&31](f,k)|0;if((c[t>>2]|0)>0){m=c[t+24>>2]|0;i=0;do{n=m+(P(c[t+20>>2]|0,i)|0)|0;o=i*3|0;c[k+(o<<2)>>2]=c[n>>2];c[k+(o+1<<2)>>2]=c[n+4>>2];c[k+(o+2<<2)>>2]=c[n+8>>2];i=i+1|0}while((i|0)<(c[t>>2]|0))}Zb[c[(c[f>>2]|0)+20>>2]&31](f,j,19137,1497453121,c[j+8>>2]|0)}break}case 3:{if(i|0){n=Bb[c[(c[f>>2]|0)+16>>2]&63](f,8,i)|0;o=c[n+8>>2]|0;c[j>>2]=zb[c[(c[f>>2]|0)+28>>2]&31](f,o)|0;j=c[t>>2]|0;if((j|0)>0){k=c[t+24>>2]|0;m=c[t+20>>2]|0;i=0;do{u=k+(P(m,i)|0)|0;b[o+(i<<3)>>1]=b[u>>1]|0;b[o+(i<<3)+2>>1]=b[u+2>>1]|0;b[o+(i<<3)+4>>1]=b[u+4>>1]|0;a[o+(i<<3)+6>>0]=0;a[o+(i<<3)+7>>0]=0;i=i+1|0}while((i|0)!=(j|0))}Zb[c[(c[f>>2]|0)+20>>2]&31](f,n,19152,1497453121,c[n+8>>2]|0)}break}case 5:{if(i|0){j=Bb[c[(c[f>>2]|0)+16>>2]&63](f,4,i)|0;k=c[j+8>>2]|0;c[m>>2]=zb[c[(c[f>>2]|0)+28>>2]&31](f,k)|0;if((c[t>>2]|0)>0){i=0;do{u=(c[t+24>>2]|0)+(P(c[t+20>>2]|0,i)|0)|0;a[k+(i<<2)>>0]=a[u>>0]|0;a[k+(i<<2)+1>>0]=a[u+1>>0]|0;a[k+(i<<2)+2>>0]=a[u+2>>0]|0;a[k+(i<<2)+3>>0]=0;i=i+1|0}while((i|0)<(c[t>>2]|0))}Zb[c[(c[f>>2]|0)+20>>2]&31](f,j,19179,1497453121,c[j+8>>2]|0)}break}default:{}}switch(c[t+16>>2]|0){case 0:{i=c[t+4>>2]|0;if(i|0){j=Bb[c[(c[f>>2]|0)+16>>2]&63](f,16,i)|0;k=c[j+8>>2]|0;c[g>>2]=zb[c[(c[f>>2]|0)+28>>2]&31](f,k)|0;m=c[t+4>>2]|0;if((m|0)>0){n=c[t+28>>2]|0;o=c[t+8>>2]|0;i=0;do{u=n+(P(o,i)|0)|0;c[k+(i<<4)>>2]=c[u>>2];c[k+(i<<4)+4>>2]=c[u+4>>2];c[k+(i<<4)+8>>2]=c[u+8>>2];i=i+1|0}while((i|0)!=(m|0))}Zb[c[(c[f>>2]|0)+20>>2]&31](f,j,19202,1497453121,c[j+8>>2]|0)}break}case 1:{i=c[t+4>>2]|0;if(i|0){n=Bb[c[(c[f>>2]|0)+16>>2]&63](f,32,i)|0;o=c[n+8>>2]|0;c[p>>2]=zb[c[(c[f>>2]|0)+28>>2]&31](f,o)|0;j=c[t+4>>2]|0;if((j|0)>0){k=c[t+28>>2]|0;m=c[t+8>>2]|0;i=0;do{u=k+(P(m,i)|0)|0;h[o+(i<<5)>>3]=+h[u>>3];h[o+(i<<5)+8>>3]=+h[u+8>>3];h[o+(i<<5)+16>>3]=+h[u+16>>3];i=i+1|0}while((i|0)!=(j|0))}Zb[c[(c[f>>2]|0)+20>>2]&31](f,n,19221,1497453121,c[n+8>>2]|0)}break}default:{}}Ob[c[(c[d>>2]|0)+24>>2]&127](d,q);q=q+1|0;if((q|0)==(r|0)){g=f;break a}else g=g+32|0}}else g=f;while(0);Zb[c[(c[g>>2]|0)+20>>2]&31](f,s,19241,1497453121,c[s+8>>2]|0);u=e+24|0;c[u>>2]=0;u=d+4|0;f=e+4|0;u=c[u>>2]|0;c[f>>2]=u;f=d+8|0;f=c[f>>2]|0;u=e+8|0;c[u>>2]=f;u=d+12|0;u=c[u>>2]|0;f=e+12|0;c[f>>2]=u;f=d+16|0;f=c[f>>2]|0;u=e+16|0;c[u>>2]=f;l=t;return 19256}function Fd(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|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,t=0,u=0,v=0,w=0,x=0,y=0,z=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;j=c[d+8>>2]|0;if(!j){h=0;return h|0}i=0;D=j;do{if((c[D+20>>2]|0)>(c[a+100>>2]|0)){B=c[D+12>>2]|0;w=c[B+88>>2]|0;x=w-(c[d+88>>2]|0)|0;y=c[B+92>>2]|0;z=y-(c[d+92>>2]|0)|0;B=c[B+96>>2]|0;C=B-(c[d+96>>2]|0)|0;k=ct(c[g>>2]|0,c[g+4>>2]|0,x|0,((x|0)<0)<<31>>31|0)|0;o=A;j=ct(c[g+8>>2]|0,c[g+8+4>>2]|0,z|0,((z|0)<0)<<31>>31|0)|0;o=Ow(j|0,A|0,k|0,o|0)|0;k=A;j=ct(c[g+16>>2]|0,c[g+16+4>>2]|0,C|0,((C|0)<0)<<31>>31|0)|0;j=Ow(o|0,k|0,j|0,A|0)|0;k=A;o=ct(c[f>>2]|0,c[f+4>>2]|0,x|0,((x|0)<0)<<31>>31|0)|0;v=A;n=ct(c[f+8>>2]|0,c[f+8+4>>2]|0,z|0,((z|0)<0)<<31>>31|0)|0;v=Ow(n|0,A|0,o|0,v|0)|0;o=A;n=ct(c[f+16>>2]|0,c[f+16+4>>2]|0,C|0,((C|0)<0)<<31>>31|0)|0;n=Ow(v|0,o|0,n|0,A|0)|0;o=A;if((k|0)>0|(k|0)==0&j>>>0>0){l=1;v=j}else{v=sw(0,0,j|0,k|0)|0;l=((j|0)!=0|(k|0)!=0)<<31>>31;v=(j|0)!=0|(k|0)!=0?v:0;k=(j|0)!=0|(k|0)!=0?A:0}if(!((o|0)>0|(o|0)==0&n>>>0>0)){j=sw(0,0,n|0,o|0)|0;j=(n|0)!=0|(o|0)!=0?j:0;m=(n|0)!=0|(o|0)!=0?A:0;if((j|0)!=0|(m|0)!=0|(l|0)!=0){l=(n|0)!=0|(o|0)!=0?0-l|0:l;n=j;p=8}}else{m=o;p=8}a:do if((p|0)==8){p=0;if(!i){c[h>>2]=v;c[h+4>>2]=k;c[h+8>>2]=n;c[h+8+4>>2]=m;c[h+16>>2]=l;i=D;break}j=c[h+16>>2]|0;if((l|0)==(j|0)){if(l|0){p=c[h+8>>2]|0;s=c[h+8+4>>2]|0;o=ct(p|0,0,v|0,0)|0;j=A;t=ct(s|0,0,v|0,0)|0;r=A;p=ct(p|0,0,k|0,0)|0;q=A;s=ct(s|0,0,k|0,0)|0;G=A;p=Ow(t|0,0,p|0,0)|0;t=A;G=Ow(r|0,0,s|0,G|0)|0;q=Ow(G|0,A|0,q|0,0)|0;t=Ow(q|0,A|0,t|0,0)|0;q=A;j=Ow(0,p|0,o|0,j|0)|0;o=A;p=Ow(t|0,q|0,(o>>>0

    >>0|(o|0)==(p|0)&j>>>0<0)&1|0,0)|0;q=A;t=c[h>>2]|0;G=c[h+4>>2]|0;s=ct(t|0,0,n|0,0)|0;r=A;E=ct(G|0,0,n|0,0)|0;H=A;t=ct(t|0,0,m|0,0)|0;u=A;G=ct(G|0,0,m|0,0)|0;F=A;t=Ow(E|0,0,t|0,0)|0;E=A;F=Ow(H|0,0,G|0,F|0)|0;u=Ow(F|0,A|0,u|0,0)|0;E=Ow(u|0,A|0,E|0,0)|0;u=A;r=Ow(0,t|0,s|0,r|0)|0;s=A;t=Ow(E|0,u|0,(s>>>0>>0|(s|0)==(t|0)&r>>>0<0)&1|0,0)|0;u=A;if(!(q>>>0>>0|(q|0)==(u|0)&p>>>0>>0))if(q>>>0>u>>>0|(q|0)==(u|0)&p>>>0>t>>>0)j=1;else j=o>>>0>>0|(o|0)==(s|0)&j>>>0>>0?-1:(o>>>0>s>>>0|(o|0)==(s|0)&j>>>0>r>>>0)&1;else j=-1;j=P(j,l)|0;p=17}}else{j=l-j|0;p=17}do if((p|0)==17){p=0;if((j|0)>=0)if(!j)break;else break a;else{c[h>>2]=v;c[h+4>>2]=k;c[h+8>>2]=n;c[h+8+4>>2]=m;c[h+16>>2]=l;i=D;break a}}while(0);j=(c[i+4>>2]|0)==(D|0);if((c[i>>2]|0)==(D|0))if(j){H=c[e+8>>2]|0;E=P(H,z)|0;u=c[e+4>>2]|0;E=E-(P(u,C)|0)|0;G=c[e>>2]|0;H=(P(G,C)|0)-(P(H,x)|0)|0;G=(P(u,x)|0)-(P(G,z)|0)|0;u=c[i+12>>2]|0;j=c[(c[D+8>>2]|0)+12>>2]|0;z=c[j+88>>2]|0;x=(c[u+88>>2]|0)-z|0;v=c[j+92>>2]|0;C=(c[u+92>>2]|0)-v|0;j=c[j+96>>2]|0;u=(c[u+96>>2]|0)-j|0;F=(P(B-j|0,C)|0)-(P(y-v|0,u)|0)|0;j=(P(w-z|0,u)|0)-(P(B-j|0,x)|0)|0;C=(P(y-v|0,x)|0)-(P(w-z|0,C)|0)|0;E=ct(F|0,((F|0)<0)<<31>>31|0,E|0,((E|0)<0)<<31>>31|0)|0;F=A;H=ct(j|0,((j|0)<0)<<31>>31|0,H|0,((H|0)<0)<<31>>31|0)|0;j=A;G=ct(C|0,((C|0)<0)<<31>>31|0,G|0,((G|0)<0)<<31>>31|0)|0;G=Ow(E|0,F|0,G|0,A|0)|0;j=Ow(G|0,A|0,H|0,j|0)|0;H=A;j=(H|0)>0|(H|0)==0&j>>>0>0?2:1}else j=2;else j=j&1;i=(j|0)==2^b?i:D}while(0);j=c[d+8>>2]|0}D=c[D>>2]|0}while((D|0)!=(j|0));return i|0}function Gd(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0;v=l;l=l+544|0;j=h;k=j+36|0;do{c[j>>2]=0;j=j+4|0}while((j|0)<(k|0));c[v+384>>2]=a;c[v+384+4>>2]=d;o=+g[e>>2];F=+g[b>>2];n=+g[e+16>>2];i=+g[b+16>>2];m=+g[e+32>>2];G=+g[b+32>>2];w=+g[b+4>>2];H=+g[b+20>>2];x=+g[b+36>>2];t=+g[b+8>>2];r=+g[b+24>>2];p=+g[b+40>>2];E=+g[e+4>>2];C=+g[e+20>>2];B=+g[e+36>>2];A=+g[e+8>>2];z=+g[e+24>>2];y=+g[e+40>>2];g[v+384+8>>2]=o*F+n*i+m*G;g[v+384+12>>2]=o*w+n*H+m*x;g[v+384+16>>2]=o*t+n*r+m*p;g[v+384+20>>2]=0.0;g[v+384+24>>2]=F*E+i*C+G*B;g[v+384+28>>2]=w*E+H*C+x*B;g[v+384+32>>2]=t*E+r*C+p*B;g[v+384+36>>2]=0.0;g[v+384+40>>2]=F*A+i*z+G*y;g[v+384+44>>2]=w*A+H*z+x*y;g[v+384+48>>2]=t*A+r*z+p*y;g[v+384+52>>2]=0.0;p=+g[e+48>>2]-+g[b+48>>2];r=+g[e+52>>2]-+g[b+52>>2];t=+g[e+56>>2]-+g[b+56>>2];x=+g[b>>2];H=+g[e>>2];w=+g[b+16>>2];G=+g[e+16>>2];i=+g[b+32>>2];F=+g[e+32>>2];m=+g[b+4>>2];n=+g[b+20>>2];o=+g[b+36>>2];q=+g[b+8>>2];s=+g[b+24>>2];u=+g[b+40>>2];g[v+384+56>>2]=x*H+w*G+i*F;g[v+384+60>>2]=x*E+w*C+i*B;g[v+384+64>>2]=x*A+w*z+i*y;g[v+384+68>>2]=0.0;g[v+384+72>>2]=H*m+G*n+F*o;g[v+384+76>>2]=E*m+C*n+B*o;g[v+384+80>>2]=A*m+z*n+y*o;g[v+384+84>>2]=0.0;g[v+384+88>>2]=H*q+G*s+F*u;g[v+384+92>>2]=E*q+C*s+B*u;g[v+384+96>>2]=A*q+z*s+y*u;g[v+384+100>>2]=0.0;g[v+384+104>>2]=p*x+r*w+t*i;g[v+384+108>>2]=p*m+r*n+t*o;g[v+384+112>>2]=p*q+r*s+t*u;g[v+384+116>>2]=0.0;c[v+384+120>>2]=80;c[v+384+124>>2]=0;c[v+364>>2]=0;c[v+128>>2]=0;c[v+128+4>>2]=0;c[v+128+8>>2]=0;c[v+128+12>>2]=0;c[v+376>>2]=2;c[v+368>>2]=0;g[v+144>>2]=0.0;a=Jc(v,v+384|0,f)|0;if(a|0){c[h>>2]=(a|0)==1?1:2;h=0;l=v;return h|0}a=c[v+372>>2]|0;if(!(c[a+32>>2]|0)){q=0.0;p=0.0;o=0.0;n=0.0;m=0.0;i=0.0}else{f=0;o=0.0;p=0.0;q=0.0;i=0.0;m=0.0;n=0.0;do{u=+g[a+16+(f<<2)>>2];d=c[v+384+120>>2]|0;k=c[v+384+124>>2]|0;e=(c[v+384>>2]|0)+(k>>1)|0;if(k&1)d=c[(c[e>>2]|0)+d>>2]|0;Sb[d&127](v+528|0,e,c[a+(f<<2)>>2]|0);o=o+u*+g[v+528>>2];p=p+u*+g[v+528+4>>2];q=q+u*+g[v+528+8>>2];a=c[(c[v+372>>2]|0)+(f<<2)>>2]|0;r=-+g[a>>2];s=-+g[a+4>>2];t=-+g[a+8>>2];a=c[v+384+120>>2]|0;k=c[v+384+124>>2]|0;d=(c[v+384+4>>2]|0)+(k>>1)|0;if(k&1)a=c[(c[d>>2]|0)+a>>2]|0;G=+g[v+384+24>>2]*r+ +g[v+384+28>>2]*s+ +g[v+384+32>>2]*t;F=+g[v+384+40>>2]*r+ +g[v+384+44>>2]*s+ +g[v+384+48>>2]*t;g[v+512>>2]=+g[v+384+8>>2]*r+ +g[v+384+12>>2]*s+ +g[v+384+16>>2]*t;g[v+512+4>>2]=G;g[v+512+8>>2]=F;g[v+512+12>>2]=0.0;Sb[a&127](v+528|0,d,v+512|0);F=+g[v+528>>2];G=+g[v+528+4>>2];H=+g[v+528+8>>2];i=i+u*(F*+g[v+384+56>>2]+G*+g[v+384+60>>2]+H*+g[v+384+64>>2]+ +g[v+384+104>>2]);m=m+u*(F*+g[v+384+72>>2]+G*+g[v+384+76>>2]+H*+g[v+384+80>>2]+ +g[v+384+108>>2]);n=n+u*(F*+g[v+384+88>>2]+G*+g[v+384+92>>2]+H*+g[v+384+96>>2]+ +g[v+384+112>>2]);f=f+1|0;a=c[v+372>>2]|0}while(f>>>0<(c[a+32>>2]|0)>>>0)}E=o*+g[b+16>>2]+p*+g[b+20>>2]+q*+g[b+24>>2]+ +g[b+52>>2];F=o*+g[b+32>>2]+p*+g[b+36>>2]+q*+g[b+40>>2]+ +g[b+56>>2];g[h+4>>2]=o*+g[b>>2]+p*+g[b+4>>2]+q*+g[b+8>>2]+ +g[b+48>>2];g[h+8>>2]=E;g[h+12>>2]=F;g[h+16>>2]=0.0;F=i*+g[b+16>>2]+m*+g[b+20>>2]+n*+g[b+24>>2]+ +g[b+52>>2];E=i*+g[b+32>>2]+m*+g[b+36>>2]+n*+g[b+40>>2]+ +g[b+56>>2];g[h+20>>2]=i*+g[b>>2]+m*+g[b+4>>2]+n*+g[b+8>>2]+ +g[b+48>>2];g[h+24>>2]=F;g[h+28>>2]=E;g[h+32>>2]=0.0;E=o-i;F=p-m;H=q-n;g[h+48>>2]=0.0;G=+D(+(E*E+F*F+H*H));g[h+52>>2]=G;G=G>9.999999747378752e-05?1.0/G:1.0;g[h+36>>2]=G*E;g[h+40>>2]=G*F;g[h+44>>2]=G*H;h=1;l=v;return h|0}function Hd(b,d,e,f,h,i,j,k,l,m,n,o,p){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;var q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0;B=P(c[l+24>>2]|0,m)|0;y=(a[d+44>>0]|0)!=0;A=c[d+56>>2]|0;if(!(y|(A|0)!=0)){d=0;return d|0}C=c[(o|0?l+12|0:l+8|0)>>2]|0;m=c[(o|0?l+20|0:l+16|0)>>2]|0;c[C+(B<<2)>>2]=c[n>>2];c[C+(B+1<<2)>>2]=c[n+4>>2];c[C+(B+2<<2)>>2]=c[n+8>>2];g[m+(B<<2)>>2]=-+g[n>>2];g[m+(B+1<<2)>>2]=-+g[n+4>>2];g[m+(B+2<<2)>>2]=-+g[n+8>>2];if(!o){q=+g[b+1176>>2];if(!(a[b+1301>>0]|0)){q=q-+g[e+48>>2];r=+g[b+1180>>2]-+g[e+52>>2];w=+g[b+1184>>2]-+g[e+56>>2];u=+g[n+8>>2];v=+g[n+4>>2];x=+g[n>>2];m=c[l+12>>2]|0;g[m+(B<<2)>>2]=r*u-w*v;g[m+(B+1<<2)>>2]=w*x-q*u;g[m+(B+2<<2)>>2]=q*v-r*x;x=+g[b+1176>>2]-+g[f+48>>2];r=+g[b+1180>>2]-+g[f+52>>2];v=+g[b+1184>>2]-+g[f+56>>2];q=+g[n+8>>2];u=+g[n+4>>2];w=+g[n>>2];m=c[l+20>>2]|0;g[m+(B<<2)>>2]=-(r*q-v*u);r=x*u-r*w;e=m;q=-(v*w-x*q)}else{I=q-+g[f+48>>2];H=+g[b+1180>>2]-+g[f+52>>2];F=+g[b+1184>>2]-+g[f+56>>2];r=+g[n>>2];G=+g[n+4>>2];E=+g[n+8>>2];K=+g[b+1112>>2]-+g[e+48>>2];q=+g[b+1116>>2]-+g[e+52>>2];s=+g[b+1120>>2]-+g[e+56>>2];u=+g[d+52>>2]-+g[d+48>>2];J=r*(r*K+G*q+E*s)+r*u-r*(I*r+H*G+F*E);D=G*(r*K+G*q+E*s)+G*u-G*(I*r+H*G+F*E);u=E*(r*K+G*q+E*s)+E*u-E*(I*r+H*G+F*E);w=+g[b+1272>>2];x=+g[b+1276>>2];t=E*(q-G*(r*K+G*q+E*s)+w*D)-G*(s-E*(r*K+G*q+E*s)+w*u);v=r*(s-E*(r*K+G*q+E*s)+w*u)-E*(K-r*(r*K+G*q+E*s)+w*J);s=G*(K-r*(r*K+G*q+E*s)+w*J)-r*(q-G*(r*K+G*q+E*s)+w*D);q=(H-G*(I*r+H*G+F*E)-x*D)*E-(F-E*(I*r+H*G+F*E)-x*u)*G;u=(F-E*(I*r+H*G+F*E)-x*u)*r-(I-r*(I*r+H*G+F*E)-x*J)*E;r=(I-r*(I*r+H*G+F*E)-x*J)*G-(H-G*(I*r+H*G+F*E)-x*D)*r;if(!((p|0)!=0|(a[b+1280>>0]|0)==0)){t=w*t;v=w*v;s=w*s;q=x*q;u=x*u;r=x*r}m=(c[l+12>>2]|0)+(B<<2)|0;g[m>>2]=t;g[m+4>>2]=v;g[m+8>>2]=s;m=c[l+20>>2]|0;g[m+(B<<2)>>2]=-q;e=m;q=-u}g[m+(B+1<<2)>>2]=q;g[e+(B+2<<2)>>2]=-r}if(A|0?+g[d>>2]==+g[d+4>>2]:0){m=c[l+28>>2]|0;g[m+(B<<2)>>2]=0.0;q=0.0}else z=12;do if((z|0)==12){e=c[l+28>>2]|0;g[e+(B<<2)>>2]=0.0;if(!y){if(A|0){m=e;q=0.0;break}else m=1;return m|0}c[(c[l+32>>2]|0)+(B<<2)>>2]=c[d+28>>2];if(A|0){m=e;q=+g[e+(B<<2)>>2];break}v=+g[d+8>>2];q=o|0?v:-v;r=+g[d+52>>2];s=+g[d>>2];t=+g[d+4>>2];u=+g[l>>2]*+g[d+32>>2];do if(!(s>t))if(!(s==t)){if(q/u<0.0)if(r>=s?s-q/u>r:0){q=(s-r)/(q/u);break}else{q=r0.0)if(r<=t?t-q/ut?0.0:1.0;break}else q=0.0}else q=0.0;else q=1.0;while(0);g[e+(B<<2)>>2]=q*v+ +g[e+(B<<2)>>2];g[(c[l+36>>2]|0)+(B<<2)>>2]=-+g[d+12>>2];c[(c[l+40>>2]|0)+(B<<2)>>2]=c[d+12>>2];C=1;return C|0}while(0);K=+g[l>>2]*+g[d+32>>2];f=m+(B<<2)|0;g[f>>2]=q+ +g[d+48>>2]*(o|0?-K:K);c[(c[l+32>>2]|0)+(B<<2)>>2]=c[d+36>>2];e=c[l+36>>2]|0;m=c[l+40>>2]|0;if(+g[d>>2]==+g[d+4>>2]){g[e+(B<<2)>>2]=-3402823466385288598117041.0e14;g[m+(B<<2)>>2]=3402823466385288598117041.0e14;C=1;return C|0}g[e+(B<<2)>>2]=(A|0)==1?0.0:-3402823466385288598117041.0e14;g[m+(B<<2)>>2]=(A|0)==1?3402823466385288598117041.0e14:0.0;r=+g[d+40>>2];if(!(r>0.0)){C=1;return C|0}d=o|0?j:h;C=o|0?k:i;J=+g[n>>2];K=+g[n+4>>2];q=+g[n+8>>2];q=+g[d>>2]*J+ +g[d+4>>2]*K+ +g[d+8>>2]*q-(J*+g[C>>2]+K*+g[C+4>>2]+q*+g[C+8>>2]);if((A|0)==1){if(!(q<0.0)){C=1;return C|0}if(!(+g[f>>2]<-(r*q))){C=1;return C|0}g[f>>2]=-(r*q);C=1;return C|0}else{if(!(q>0.0)){C=1;return C|0}if(!(+g[f>>2]>-(r*q))){C=1;return C|0}g[f>>2]=-(r*q);C=1;return C|0}return 0}function Id(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0,i=0,k=0,m=0.0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0;n=l;l=l+16|0;c[b+252>>2]=2;c[b+372>>2]=0;c[b+372+4>>2]=0;c[b+372+8>>2]=0;c[b+372+12>>2]=0;c[b+372+16>>2]=0;c[b+372+20>>2]=0;c[b+372+24>>2]=0;c[b+372+28>>2]=0;c[b+604>>2]=1065353216;c[b+608>>2]=1065353216;c[b+612>>2]=1065353216;g[b+616>>2]=0.0;c[b+408>>2]=1065353216;c[b+412>>2]=1065353216;c[b+416>>2]=1065353216;e=b+420|0;h=e+36|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(h|0));c[b+472>>2]=0;c[b+472+4>>2]=0;c[b+472+8>>2]=0;c[b+472+12>>2]=0;c[b+472+16>>2]=0;c[b+472+20>>2]=0;c[b+472+24>>2]=0;c[b+472+28>>2]=0;f=+g[d+92>>2];m=+g[d+96>>2];g[n+12>>2]=f;g[n+8>>2]=m;g[n+4>>2]=0.0;g[n>>2]=1.0;c[b+504>>2]=c[(f<0.0?n+4|0:f>1.0?n:n+12|0)>>2];g[n+4>>2]=0.0;g[n>>2]=1.0;c[b+508>>2]=c[(m<0.0?n+4|0:m>1.0?n:n+8|0)>>2];c[b+532>>2]=c[d+116>>2];c[b+536>>2]=c[d+120>>2];e=c[d+4>>2]|0;c[b+540>>2]=e;c[b+668>>2]=0;c[b+672>>2]=0;a[b+512>>0]=a[d+124>>0]|0;c[b+516>>2]=c[d+128>>2];c[b+520>>2]=c[d+132>>2];c[b+524>>2]=c[d+136>>2];c[b+528>>2]=c[d+140>>2];if(!e){c[b+4>>2]=c[d+8>>2];c[b+4+4>>2]=c[d+8+4>>2];c[b+4+8>>2]=c[d+8+8>>2];c[b+4+12>>2]=c[d+8+12>>2];c[b+20>>2]=c[d+24>>2];c[b+20+4>>2]=c[d+24+4>>2];c[b+20+8>>2]=c[d+24+8>>2];c[b+20+12>>2]=c[d+24+12>>2];c[b+36>>2]=c[d+40>>2];c[b+36+4>>2]=c[d+40+4>>2];c[b+36+8>>2]=c[d+40+8>>2];c[b+36+12>>2]=c[d+40+12>>2];c[b+52>>2]=c[d+56>>2];c[b+52+4>>2]=c[d+56+4>>2];c[b+52+8>>2]=c[d+56+8>>2];c[b+52+12>>2]=c[d+56+12>>2];e=b+20|0;h=b+36|0;i=b+52|0;k=b+4|0}else{Ob[c[(c[e>>2]|0)+8>>2]&127](e,b+4|0);e=b+20|0;h=b+36|0;i=b+52|0;k=b+4|0}c[b+68>>2]=c[k>>2];c[b+68+4>>2]=c[k+4>>2];c[b+68+8>>2]=c[k+8>>2];c[b+68+12>>2]=c[k+12>>2];c[b+84>>2]=c[e>>2];c[b+84+4>>2]=c[e+4>>2];c[b+84+8>>2]=c[e+8>>2];c[b+84+12>>2]=c[e+12>>2];c[b+100>>2]=c[h>>2];c[b+100+4>>2]=c[h+4>>2];c[b+100+8>>2]=c[h+8>>2];c[b+100+12>>2]=c[h+12>>2];c[b+116>>2]=c[i>>2];c[b+116+4>>2]=c[i+4>>2];c[b+116+8>>2]=c[i+8>>2];c[b+116+12>>2]=c[i+12>>2];c[b+132>>2]=0;c[b+132+4>>2]=0;c[b+132+8>>2]=0;c[b+132+12>>2]=0;c[b+132+16>>2]=0;c[b+132+20>>2]=0;c[b+132+24>>2]=0;c[b+132+28>>2]=0;c[b+228>>2]=c[d+100>>2];c[b+236>>2]=c[d+104>>2];c[b+240>>2]=c[d+108>>2];c[b+232>>2]=c[d+112>>2];Ob[c[(c[b>>2]|0)+8>>2]&127](b,c[d+72>>2]|0);e=c[5786]|0;c[5786]=e+1;c[b+568>>2]=e;f=+g[d>>2];e=c[b+204>>2]|0;if(f==0.0){c[b+204>>2]=e|1;m=0.0}else{c[b+204>>2]=e&-2;m=1.0/f}g[b+404>>2]=m;p=f*+g[b+444>>2];o=f*+g[b+448>>2];g[b+424>>2]=f*+g[b+440>>2];g[b+428>>2]=p;g[b+432>>2]=o;g[b+436>>2]=0.0;f=+g[d+76>>2];h=f!=0.0?(g[j>>2]=1.0/f,c[j>>2]|0):0;f=+g[d+80>>2];e=f!=0.0?(g[j>>2]=1.0/f,c[j>>2]|0):0;f=+g[d+84>>2];d=f!=0.0?(g[j>>2]=1.0/f,c[j>>2]|0):0;c[b+456>>2]=h;c[b+460>>2]=e;c[b+464>>2]=d;g[b+468>>2]=0.0;r=m*+g[b+412>>2];x=m*+g[b+416>>2];g[b+620>>2]=m*+g[b+408>>2];g[b+624>>2]=r;g[b+628>>2]=x;g[b+632>>2]=0.0;x=+g[b+4>>2];r=(c[j>>2]=h,+g[j>>2]);w=+g[b+8>>2];f=(c[j>>2]=e,+g[j>>2]);v=+g[b+12>>2];o=(c[j>>2]=d,+g[j>>2]);u=+g[b+20>>2];t=+g[b+24>>2];s=+g[b+28>>2];q=+g[b+36>>2];p=+g[b+40>>2];m=+g[b+44>>2];g[b+324>>2]=x*x*r+w*w*f+v*v*o;g[b+328>>2]=x*r*u+w*f*t+v*o*s;g[b+332>>2]=x*r*q+w*f*p+v*o*m;g[b+336>>2]=0.0;g[b+340>>2]=x*r*u+w*f*t+v*o*s;g[b+344>>2]=u*r*u+t*f*t+s*o*s;g[b+348>>2]=r*u*q+f*t*p+o*s*m;g[b+352>>2]=0.0;g[b+356>>2]=x*r*q+w*f*p+v*o*m;g[b+360>>2]=u*r*q+t*f*p+s*o*m;g[b+364>>2]=q*r*q+p*f*p+m*o*m;g[b+368>>2]=0.0;c[b+564>>2]=8;c[b+572>>2]=0;c[b+572+4>>2]=0;c[b+572+8>>2]=0;c[b+572+12>>2]=0;c[b+572+16>>2]=0;c[b+572+20>>2]=0;c[b+572+24>>2]=0;c[b+572+28>>2]=0;m=+g[b+404>>2];o=m*+g[b+412>>2];p=m*+g[b+416>>2];g[b+620>>2]=+g[b+408>>2]*m;g[b+624>>2]=o;g[b+628>>2]=p;e=b+632|0;h=e+36|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(h|0));l=n;return}function Jd(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0,L=0,M=0,N=0,O=0;h=l;l=l+240|0;if(!(c[b+16>>2]|0)){K=c[b+12>>2]|0;b=c[b+20>>2]|0;x=+g[d>>2];q=+g[d+4>>2];u=+g[d+8>>2];j=+g[d+16>>2];r=+g[d+20>>2];i=+g[d+24>>2];m=+g[d+32>>2];s=+g[d+36>>2];n=+g[d+40>>2];F=+g[d+48>>2];E=+g[d+52>>2];D=+g[d+56>>2];J=+g[e>>2];I=+g[e+16>>2];z=+g[e+32>>2];H=+g[e+4>>2];G=+g[e+20>>2];y=+g[e+36>>2];v=+g[e+8>>2];k=+g[e+24>>2];p=+g[e+40>>2];C=-+g[e+48>>2];B=-+g[e+52>>2];w=-+g[e+56>>2];d=c[(c[K>>2]|0)+64>>2]|0;A=-+g[b+52>>2];t=-+g[b+56>>2];o=-+g[b+60>>2];g[h+16>>2]=(x*J+j*I+m*z)*A+(x*H+j*G+m*y)*t+(x*v+j*k+m*p)*o;g[h+16+4>>2]=(q*J+r*I+s*z)*A+(q*H+r*G+s*y)*t+(q*v+r*k+s*p)*o;g[h+16+8>>2]=(u*J+i*I+n*z)*A+(u*H+i*G+n*y)*t+(u*v+i*k+n*p)*o;g[h+16+12>>2]=0.0;Sb[d&127](h+152|0,K,h+16|0);o=+g[h+152>>2];t=+g[h+152+4>>2];A=+g[h+152+8>>2];z=F*J+E*I+D*z+(J*C+I*B+z*w)+((x*J+j*I+m*z)*o+(q*J+r*I+s*z)*t+(u*J+i*I+n*z)*A);y=F*H+E*G+D*y+(H*C+G*B+y*w)+((x*H+j*G+m*y)*o+(q*H+r*G+s*y)*t+(u*H+i*G+n*y)*A);A=F*v+E*k+D*p+(v*C+k*B+p*w)+((x*v+j*k+m*p)*o+(q*v+r*k+s*p)*t+(u*v+i*k+n*p)*A);p=+g[b+52>>2];n=+g[b+56>>2];k=+g[b+60>>2];i=k*A+(p*z+n*y)-+g[b+68>>2];v=+g[e>>2];u=+g[e+4>>2];t=+g[e+8>>2];s=+g[e+16>>2];r=+g[e+20>>2];q=+g[e+24>>2];o=+g[e+32>>2];m=+g[e+36>>2];j=+g[e+40>>2];x=(z-p*i)*s+(y-n*i)*r+(A-k*i)*q+ +g[e+52>>2];w=(z-p*i)*o+(y-n*i)*m+(A-k*i)*j+ +g[e+56>>2];g[h+16>>2]=t*(A-k*i)+(v*(z-p*i)+u*(y-n*i))+ +g[e+48>>2];g[h+16+4>>2]=x;g[h+16+8>>2]=w;g[h+16+12>>2]=0.0;g[h>>2]=v*p+u*n+t*k;g[h+4>>2]=p*s+n*r+k*q;g[h+8>>2]=p*o+n*m+k*j;g[h+12>>2]=0.0;Tb[c[(c[f>>2]|0)+16>>2]&15](f,h,h+16|0,i);l=h;return}else{N=c[b+4>>2]|0;a[N+312>>0]=0;c[N>>2]=0;a[N+356>>0]=1;c[N+292>>2]=1566444395;c[N+296>>2]=1566444395;c[N+300>>2]=1566444395;g[N+304>>2]=0.0;c[N+336>>2]=0;c[N+336+4>>2]=0;c[N+336+8>>2]=0;c[N+336+12>>2]=0;a[N+336+16>>0]=0;a[N+332>>0]=a[N+332>>0]&-16;N=c[b+12>>2]|0;M=c[b+16>>2]|0;L=c[N+4>>2]|0;K=c[M+4>>2]|0;I=+nb[c[(c[N>>2]|0)+48>>2]&15](N);O=c[b+16>>2]|0;J=+nb[c[(c[O>>2]|0)+48>>2]&15](O);O=c[b+4>>2]|0;b=c[b+8>>2]|0;c[h+152>>2]=9552;c[h+152+4>>2]=0;c[h+152+8>>2]=1065353216;c[h+152+12>>2]=0;g[h+152+16>>2]=0.0;c[h+152+20>>2]=b;c[h+152+24>>2]=O;c[h+152+28>>2]=N;c[h+152+32>>2]=M;c[h+152+36>>2]=L;c[h+152+40>>2]=K;g[h+152+44>>2]=I;g[h+152+48>>2]=J;a[h+152+52>>0]=0;c[h+152+60>>2]=-1;c[h+152+72>>2]=1;c[h+152+76>>2]=1;g[h+16+128>>2]=999999984306749440.0;c[h+16>>2]=c[d>>2];c[h+16+4>>2]=c[d+4>>2];c[h+16+8>>2]=c[d+8>>2];c[h+16+12>>2]=c[d+12>>2];c[h+16+16>>2]=c[d+16>>2];c[h+16+16+4>>2]=c[d+16+4>>2];c[h+16+16+8>>2]=c[d+16+8>>2];c[h+16+16+12>>2]=c[d+16+12>>2];c[h+16+32>>2]=c[d+32>>2];c[h+16+32+4>>2]=c[d+32+4>>2];c[h+16+32+8>>2]=c[d+32+8>>2];c[h+16+32+12>>2]=c[d+32+12>>2];c[h+16+48>>2]=c[d+48>>2];c[h+16+48+4>>2]=c[d+48+4>>2];c[h+16+48+8>>2]=c[d+48+8>>2];c[h+16+48+12>>2]=c[d+48+12>>2];c[h+16+64>>2]=c[e>>2];c[h+16+64+4>>2]=c[e+4>>2];c[h+16+64+8>>2]=c[e+8>>2];c[h+16+64+12>>2]=c[e+12>>2];c[h+16+80>>2]=c[e+16>>2];c[h+16+80+4>>2]=c[e+16+4>>2];c[h+16+80+8>>2]=c[e+16+8>>2];c[h+16+80+12>>2]=c[e+16+12>>2];c[h+16+96>>2]=c[e+32>>2];c[h+16+96+4>>2]=c[e+32+4>>2];c[h+16+96+8>>2]=c[e+32+8>>2];c[h+16+96+12>>2]=c[e+32+12>>2];c[h+16+112>>2]=c[e+48>>2];c[h+16+112+4>>2]=c[e+48+4>>2];c[h+16+112+8>>2]=c[e+48+8>>2];c[h+16+112+12>>2]=c[e+48+12>>2];Dc(h+152|0,h+16|0,f,0,0);l=h;return}}function Kd(b,d,e){b=b|0;d=+d;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0,x=0.0,y=0.0;w=l;l=l+96|0;f=c[b+8>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}f=c[b+12>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}f=c[b+20>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}f=c[b+24>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}m=ui(b+4|0)|0;j=+g[b+28>>2];i=+g[b+32>>2];h=+g[b+36>>2];u=j*+g[m+16>>2]+i*+g[m+20>>2]+h*+g[m+24>>2]+ +g[m+52>>2];t=j*+g[m+32>>2]+i*+g[m+36>>2]+h*+g[m+40>>2]+ +g[m+56>>2];g[b+156>>2]=j*+g[m>>2]+i*+g[m+4>>2]+h*+g[m+8>>2]+ +g[m+48>>2];g[b+160>>2]=u;g[b+164>>2]=t;g[b+168>>2]=0.0;m=ui(b+16|0)|0;t=+g[b+44>>2];u=+g[b+48>>2];h=+g[b+52>>2];i=t*+g[m>>2]+u*+g[m+4>>2]+h*+g[m+8>>2]+ +g[m+48>>2];j=t*+g[m+16>>2]+u*+g[m+20>>2]+h*+g[m+24>>2]+ +g[m+52>>2];h=t*+g[m+32>>2]+u*+g[m+36>>2]+h*+g[m+40>>2]+ +g[m+56>>2];g[b+172>>2]=i;g[b+176>>2]=j;g[b+180>>2]=h;g[b+184>>2]=0.0;i=+g[b+156>>2]-i;j=+g[b+160>>2]-j;h=+g[b+164>>2]-h;if(i*i+j*j+h*h>16.0){u=1.0/+D(+(i*i+j*j+h*h));i=i*4.0*u;j=j*4.0*u;h=h*4.0*u}u=+g[b+64>>2];g[b+72>>2]=1.0/d*i*u;g[b+76>>2]=1.0/d*j*u;g[b+80>>2]=1.0/d*h*u;g[b+84>>2]=0.0;f=ui(b+4|0)|0;g[b+156>>2]=+g[b+156>>2]-+g[f+48>>2];g[b+160>>2]=+g[b+160>>2]-+g[f+52>>2];g[b+164>>2]=+g[b+164>>2]-+g[f+56>>2];f=ui(b+16|0)|0;g[b+172>>2]=+g[b+172>>2]-+g[f+48>>2];g[b+176>>2]=+g[b+176>>2]-+g[f+52>>2];g[b+180>>2]=+g[b+180>>2]-+g[f+56>>2];f=c[b+8>>2]|0;if(!f){f=c[b+4>>2]|0;if(!f)i=0.0;else{f=f+128|0;v=27}}else{f=f+404|0;v=27}if((v|0)==27)i=+g[f>>2];if((a[22432]|0)==0?Uz(22432)|0:0){f=22904;k=f+48|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(k|0))}f=c[b+8>>2]|0;if(!f){m=c[b+4>>2]|0;m=(m|0)==0?22904:m+180|0}else m=f+324|0;f=c[b+20>>2]|0;if(!f){f=c[b+16>>2]|0;if(!f)h=0.0;else{f=f+128|0;v=38}}else{f=f+404|0;v=38}if((v|0)==38)h=+g[f>>2];if((a[22432]|0)==0?Uz(22432)|0:0){f=22904;k=f+48|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(k|0))}f=c[b+20>>2]|0;if(!f){f=c[b+16>>2]|0;f=(f|0)==0?22904:f+180|0}else f=f+324|0;Uh(w+48|0,i,m,+g[b+156>>2],+g[b+160>>2],+g[b+164>>2]);Uh(w,h,f,+g[b+172>>2],+g[b+176>>2],+g[b+180>>2]);h=+g[w+48>>2]+ +g[w>>2];i=+g[w+48+4>>2]+ +g[w+4>>2];j=+g[w+48+8>>2]+ +g[w+8>>2];d=+g[w+48+16>>2]+ +g[w+16>>2];n=+g[w+48+20>>2]+ +g[w+20>>2];o=+g[w+48+24>>2]+ +g[w+24>>2];p=+g[w+48+32>>2]+ +g[w+32>>2];q=+g[w+48+36>>2]+ +g[w+36>>2];r=+g[w+48+40>>2]+ +g[w+40>>2];s=1.0/(j*(d*q-n*p)+(h*(n*r-o*q)+i*(o*p-d*r)));g[b+104>>2]=(n*r-o*q)*s;g[b+108>>2]=(j*q-i*r)*s;g[b+112>>2]=(i*o-j*n)*s;g[b+116>>2]=0.0;g[b+120>>2]=(o*p-d*r)*s;g[b+124>>2]=(h*r-j*p)*s;g[b+128>>2]=(j*d-h*o)*s;g[b+132>>2]=0.0;g[b+136>>2]=(d*q-n*p)*s;g[b+140>>2]=(i*p-h*q)*s;g[b+144>>2]=(h*n-i*d)*s;g[b+148>>2]=0.0;t=+g[b+68>>2];u=+g[b+72>>2];if(t>0.0){y=+g[b+76>>2];x=+g[b+80>>2];g[b+88>>2]=t*u*(n*r-o*q)*s+t*y*(j*q-i*r)*s+t*x*(i*o-j*n)*s;g[b+92>>2]=t*u*(o*p-d*r)*s+t*y*(h*r-j*p)*s+t*x*(j*d-h*o)*s;g[b+96>>2]=t*u*(d*q-n*p)*s+t*y*(i*p-h*q)*s+t*x*(h*n-i*d)*s;g[b+100>>2]=0.0;g[b+72>>2]=(1.0-t)*u;g[b+76>>2]=(1.0-t)*y;g[b+80>>2]=(1.0-t)*x;r=(1.0-t)*u;s=(1.0-t)*y;u=(1.0-t)*x;t=+(e|0);t=1.0/t;r=t*r;g[b+72>>2]=r;s=t*s;g[b+76>>2]=s;u=t*u;g[b+80>>2]=u;l=w;return}else{t=u;u=+g[b+76>>2];y=+g[b+80>>2];x=+(e|0);x=1.0/x;t=x*t;g[b+72>>2]=t;u=x*u;g[b+76>>2]=u;y=x*y;g[b+80>>2]=y;l=w;return}}function Ld(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0.0,k=0.0,l=0.0,m=0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0;o=c[a+192>>2]|0;n=+nb[c[(c[o>>2]|0)+48>>2]&15](o);o=c[a+772>>2]|0;if((o|0)>0){i=0;do{m=c[a+780>>2]|0;f=m+(i*104|0)+8|0;q=+g[f>>2];h=m+(i*104|0)+12|0;p=+g[h>>2];d=m+(i*104|0)+16|0;l=+g[d>>2];j=q*+g[b>>2]+p*+g[b+4>>2]+l*+g[b+8>>2]+ +g[b+48>>2];k=q*+g[b+16>>2]+p*+g[b+20>>2]+l*+g[b+24>>2]+ +g[b+52>>2];l=q*+g[b+32>>2]+p*+g[b+36>>2]+l*+g[b+40>>2]+ +g[b+56>>2];g[f>>2]=j;g[h>>2]=k;g[d>>2]=l;g[m+(i*104|0)+20>>2]=0.0;d=m+(i*104|0)+24|0;p=+g[d>>2];h=m+(i*104|0)+28|0;q=+g[h>>2];f=m+(i*104|0)+32|0;r=+g[f>>2];s=p*+g[b+16>>2]+q*+g[b+20>>2]+r*+g[b+24>>2]+ +g[b+52>>2];t=p*+g[b+32>>2]+q*+g[b+36>>2]+r*+g[b+40>>2]+ +g[b+56>>2];g[d>>2]=p*+g[b>>2]+q*+g[b+4>>2]+r*+g[b+8>>2]+ +g[b+48>>2];g[h>>2]=s;g[f>>2]=t;g[m+(i*104|0)+36>>2]=0.0;f=m+(i*104|0)+72|0;t=+g[f>>2];h=m+(i*104|0)+76|0;s=+g[h>>2];d=m+(i*104|0)+80|0;r=+g[d>>2];q=t*+g[b+16>>2]+s*+g[b+20>>2]+r*+g[b+24>>2];p=t*+g[b+32>>2]+s*+g[b+36>>2]+r*+g[b+40>>2];g[f>>2]=+g[b>>2]*t+ +g[b+4>>2]*s+ +g[b+8>>2]*r;g[h>>2]=q;g[d>>2]=p;g[m+(i*104|0)+84>>2]=0.0;m=c[m+(i*104|0)+96>>2]|0;d=Ag(a+988|0,m)|0;a:do if(d){h=c[a+996>>2]|0;if((h|0)<=-1){d=c[a+988>>2]|0;break}if(h){e=0;while(1){f=c[d+32>>2]|0;e=e+1|0;if(!f)break a;if((e|0)>=(h|0)){d=f;break}else d=f}}}else d=0;while(0);g[m>>2]=j-n;g[m+4>>2]=k-n;g[m+8>>2]=l-n;g[m+12>>2]=0.0;g[m+16>>2]=n+j;g[m+20>>2]=n+k;g[m+24>>2]=n+l;g[m+28>>2]=0.0;Pe(a+988|0,d,m);i=i+1|0}while((i|0)!=(o|0))}Eg(a);d=c[a+988>>2]|0;if(d){o=c[a+192>>2]|0;r=+nb[c[(c[o>>2]|0)+48>>2]&15](o);t=+g[d+4>>2]-r;s=+g[d+8>>2]-r;g[a+952>>2]=+g[d>>2]-r;g[a+956>>2]=t;g[a+960>>2]=s;g[a+964>>2]=0.0;s=r+ +g[d+20>>2];t=r+ +g[d+24>>2];g[a+968>>2]=r+ +g[d+16>>2];g[a+972>>2]=s;g[a+976>>2]=t;g[a+980>>2]=0.0;d=c[a+188>>2]|0;if(d|0){o=c[a+744>>2]|0;m=c[o+32>>2]|0;Zb[c[(c[m>>2]|0)+16>>2]&31](m,d,a+952|0,a+968|0,c[o+36>>2]|0)}}else{c[a+952>>2]=0;c[a+952+4>>2]=0;c[a+952+8>>2]=0;c[a+952+12>>2]=0;c[a+952+16>>2]=0;c[a+952+20>>2]=0;c[a+952+24>>2]=0;c[a+952+28>>2]=0}e=c[a+792>>2]|0;if((e|0)<=0){Vf(a);o=a+1148|0;c[o>>2]=c[b>>2];c[o+4>>2]=c[b+4>>2];c[o+8>>2]=c[b+8>>2];c[o+12>>2]=c[b+12>>2];o=b+16|0;m=a+1164|0;c[m>>2]=c[o>>2];c[m+4>>2]=c[o+4>>2];c[m+8>>2]=c[o+8>>2];c[m+12>>2]=c[o+12>>2];m=b+32|0;o=a+1180|0;c[o>>2]=c[m>>2];c[o+4>>2]=c[m+4>>2];c[o+8>>2]=c[m+8>>2];c[o+12>>2]=c[m+12>>2];o=b+48|0;b=a+1196|0;c[b>>2]=c[o>>2];c[b+4>>2]=c[o+4>>2];c[b+8>>2]=c[o+8>>2];c[b+12>>2]=c[o+12>>2];return}f=c[a+800>>2]|0;d=0;do{m=c[f+(d*52|0)+24>>2]|0;o=c[f+(d*52|0)+28>>2]|0;r=+g[m+8>>2]-+g[o+8>>2];s=+g[m+12>>2]-+g[o+12>>2];t=+g[m+16>>2]-+g[o+16>>2];t=+D(+(r*r+s*s+t*t));g[f+(d*52|0)+32>>2]=t;g[f+(d*52|0)+44>>2]=t*t;d=d+1|0}while((d|0)!=(e|0));d=0;do{g[f+(d*52|0)+40>>2]=(+g[(c[f+(d*52|0)+24>>2]|0)+88>>2]+ +g[(c[f+(d*52|0)+28>>2]|0)+88>>2])/+g[(c[f+(d*52|0)+4>>2]|0)+4>>2];d=d+1|0}while((d|0)!=(e|0));Vf(a);o=a+1148|0;c[o>>2]=c[b>>2];c[o+4>>2]=c[b+4>>2];c[o+8>>2]=c[b+8>>2];c[o+12>>2]=c[b+12>>2];o=b+16|0;m=a+1164|0;c[m>>2]=c[o>>2];c[m+4>>2]=c[o+4>>2];c[m+8>>2]=c[o+8>>2];c[m+12>>2]=c[o+12>>2];m=b+32|0;o=a+1180|0;c[o>>2]=c[m>>2];c[o+4>>2]=c[m+4>>2];c[o+8>>2]=c[m+8>>2];c[o+12>>2]=c[m+12>>2];o=b+48|0;b=a+1196|0;c[b>>2]=c[o>>2];c[b+4>>2]=c[o+4>>2];c[b+8>>2]=c[o+8>>2];c[b+12>>2]=c[o+12>>2];return}function Md(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=+i;var k=0,l=0,m=0.0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0;B=c[b+88>>2]|0;if((B|0)==(c[b+92>>2]|0)?(o=B|0?B<<1:1,(B|0)<(o|0)):0){if(!o){k=0;n=B}else{c[6995]=(c[6995]|0)+1;k=sc((o*152|3)+16|0)|0;if(!k)k=0;else{c[(k+4+15&-16)+-4>>2]=k;k=k+4+15&-16}n=c[b+88>>2]|0}if((n|0)>0){l=0;do{gi(k+(l*152|0)|0,(c[b+96>>2]|0)+(l*152|0)|0,152)|0;l=l+1|0}while((l|0)!=(n|0))}l=c[b+96>>2]|0;if(l|0){if(a[b+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[l+-4>>2]|0)}c[b+96>>2]=0}a[b+100>>0]=1;c[b+96>>2]=k;c[b+92>>2]=o;k=c[b+88>>2]|0}else k=B;c[b+88>>2]=k+1;A=c[b+96>>2]|0;c[A+(B*152|0)+140>>2]=h;c[A+(B*152|0)+16>>2]=0;c[A+(B*152|0)+16+4>>2]=0;c[A+(B*152|0)+16+8>>2]=0;c[A+(B*152|0)+16+12>>2]=0;g[A+(B*152|0)+48>>2]=-0.0;g[A+(B*152|0)+52>>2]=-0.0;g[A+(B*152|0)+56>>2]=-0.0;g[A+(B*152|0)+60>>2]=0.0;b=c[b+16>>2]|0;o=c[b+(e*244|0)+240>>2]|0;h=c[b+(f*244|0)+240>>2]|0;c[A+(B*152|0)+144>>2]=e;c[A+(B*152|0)+148>>2]=f;g[A+(B*152|0)+104>>2]=i;c[A+(B*152|0)+132>>2]=0;g[A+(B*152|0)+100>>2]=0.0;g[A+(B*152|0)+96>>2]=0.0;x=-+g[d>>2];y=-+g[d+4>>2];z=-+g[d+8>>2];g[A+(B*152|0)>>2]=x;g[A+(B*152|0)+4>>2]=y;g[A+(B*152|0)+8>>2]=z;g[A+(B*152|0)+12>>2]=0.0;if(o|0){k=(g[j>>2]=(+g[o+324>>2]*x+ +g[o+328>>2]*y+ +g[o+332>>2]*z)*+g[o+604>>2],c[j>>2]|0);l=(g[j>>2]=(+g[o+340>>2]*x+ +g[o+344>>2]*y+ +g[o+348>>2]*z)*+g[o+608>>2],c[j>>2]|0);n=(g[j>>2]=(+g[o+356>>2]*x+ +g[o+360>>2]*y+ +g[o+364>>2]*z)*+g[o+612>>2],c[j>>2]|0)}else{k=0;l=0;n=0}c[A+(B*152|0)+64>>2]=k;c[A+(B*152|0)+68>>2]=l;c[A+(B*152|0)+72>>2]=n;g[A+(B*152|0)+76>>2]=0.0;u=+g[d>>2];v=+g[d+4>>2];w=+g[d+8>>2];d=c[d+12>>2]|0;g[A+(B*152|0)+32>>2]=u;g[A+(B*152|0)+36>>2]=v;g[A+(B*152|0)+40>>2]=w;c[A+(B*152|0)+44>>2]=d;if(h|0){k=(g[j>>2]=(u*+g[h+324>>2]+v*+g[h+328>>2]+w*+g[h+332>>2])*+g[h+604>>2],c[j>>2]|0);l=(g[j>>2]=(u*+g[h+340>>2]+v*+g[h+344>>2]+w*+g[h+348>>2])*+g[h+608>>2],c[j>>2]|0);n=(g[j>>2]=(u*+g[h+356>>2]+v*+g[h+360>>2]+w*+g[h+364>>2])*+g[h+612>>2],c[j>>2]|0)}else{k=0;l=0;n=0}c[A+(B*152|0)+80>>2]=k;c[A+(B*152|0)+84>>2]=l;c[A+(B*152|0)+88>>2]=n;g[A+(B*152|0)+92>>2]=0.0;if(o|0){m=+g[o+324>>2]*x+ +g[o+328>>2]*y+ +g[o+332>>2]*z;p=+g[o+340>>2]*x+ +g[o+344>>2]*y+ +g[o+348>>2]*z;q=+g[o+356>>2]*x+ +g[o+360>>2]*y+ +g[o+364>>2]*z}else{m=0.0;p=0.0;q=0.0}if(h|0){r=+g[h+324>>2]*u+ +g[h+328>>2]*v+ +g[h+332>>2]*w;s=u*+g[h+340>>2]+v*+g[h+344>>2]+w*+g[h+348>>2];t=u*+g[h+356>>2]+v*+g[h+360>>2]+w*+g[h+364>>2]}else{r=0.0;s=0.0;t=0.0}s=1.0/(m*x+p*y+q*z+0.0+(r*u+s*v+t*w));g[A+(B*152|0)+108>>2]=s;if(o|0){p=+g[b+(e*244|0)+192>>2];q=+g[b+(e*244|0)+196>>2];r=+g[b+(e*244|0)+200>>2];m=(+g[b+(e*244|0)+176>>2]+ +g[b+(e*244|0)+208>>2])*0.0+(+g[b+(e*244|0)+180>>2]+ +g[b+(e*244|0)+212>>2])*0.0+(+g[b+(e*244|0)+184>>2]+ +g[b+(e*244|0)+216>>2])*0.0}else{p=0.0;q=0.0;r=0.0;m=0.0}m=m+(p*x+q*y+r*z);if(!h){t=0.0;x=0.0;z=0.0;y=-0.0;u=t*u;x=x*v;x=u+x;z=z*w;z=x+z;z=y+z;z=m+z;z=0.0-z;z=s*z;f=A+(B*152|0)+112|0;g[f>>2]=z;f=A+(B*152|0)+116|0;g[f>>2]=0.0;z=-i;f=A+(B*152|0)+120|0;g[f>>2]=z;B=A+(B*152|0)+124|0;g[B>>2]=i;return}t=+g[b+(f*244|0)+192>>2];x=+g[b+(f*244|0)+196>>2];z=+g[b+(f*244|0)+200>>2];y=(+g[b+(f*244|0)+176>>2]+ +g[b+(f*244|0)+208>>2])*-0.0+(+g[b+(f*244|0)+180>>2]+ +g[b+(f*244|0)+212>>2])*-0.0+(+g[b+(f*244|0)+184>>2]+ +g[b+(f*244|0)+216>>2])*-0.0;u=t*u;x=x*v;x=u+x;z=z*w;z=x+z;z=y+z;z=m+z;z=0.0-z;z=s*z;f=A+(B*152|0)+112|0;g[f>>2]=z;f=A+(B*152|0)+116|0;g[f>>2]=0.0;z=-i;f=A+(B*152|0)+120|0;g[f>>2]=z;B=A+(B*152|0)+124|0;g[B>>2]=i;return}function Nd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0.0,s=0.0,t=0;t=l;l=l+48|0;switch(c[b+4>>2]|0){case 8:{c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;l=t;return}case 0:{n=+g[b+32>>2];r=+g[b+36>>2];r=+g[d+4>>2]>=0.0?r:-r;s=+g[b+40>>2];s=+g[d+8>>2]>=0.0?s:-s;g[a>>2]=+g[d>>2]>=0.0?n:-n;g[a+4>>2]=r;g[a+8>>2]=s;g[a+12>>2]=0.0;l=t;return}case 1:{k=+g[d>>2];m=+g[d+4>>2];n=+g[d+8>>2];r=k*+g[b+60>>2]+m*+g[b+60+4>>2]+n*+g[b+60+8>>2];s=k*+g[b+60+16>>2]+m*+g[b+60+20>>2]+n*+g[b+60+24>>2];n=k*+g[b+60+32>>2]+m*+g[b+60+36>>2]+n*+g[b+60+40>>2];g[t+32>>2]=r;g[t+32+4>>2]=s;g[t+32+8>>2]=n;g[t+32+12>>2]=0.0;o=+g[t+32+((r>2]>2]|0;q=c[b+60+(o<<4)+8>>2]|0;c[a>>2]=c[b+60+(o<<4)>>2];c[a+4>>2]=p;c[a+8>>2]=q;g[a+12>>2]=0.0;l=t;return}case 13:{c[t+32>>2]=c[b+32>>2];c[t+32+4>>2]=c[b+32+4>>2];c[t+32+8>>2]=c[b+32+8>>2];c[t+32+12>>2]=c[b+32+12>>2];c[t+16>>2]=c[d>>2];e=c[d+4>>2]|0;c[t+16+4>>2]=e;q=c[d+8>>2]|0;c[t+16+8>>2]=q;g[t+16+12>>2]=0.0;b=c[b+56>>2]|0;f=(c[j>>2]=q,+g[j>>2]);switch(b|0){case 2:{d=0;o=2;p=1;f=(c[j>>2]=e,+g[j>>2]);break}case 1:{d=0;o=1;p=2;break}default:{d=1;o=0;p=2}}r=+g[t+32+(d<<2)>>2];i=+g[t+32+(b<<2)>>2];n=+g[t+16+(d<<2)>>2];m=+D(+(n*n+f*f));h=+g[t+16+(o<<2)>>2];if(m!=0.0){k=r/m*f;e=t;h=h<0.0?-i:i;f=n*(r/m)}else{k=0.0;e=t;h=h<0.0?-i:i;f=r}g[t+(d<<2)>>2]=f;g[t+(o<<2)>>2]=h;g[t+(p<<2)>>2]=k;c[a>>2]=c[e>>2];c[a+4>>2]=c[t+4>>2];c[a+8>>2]=c[t+8>>2];g[a+12>>2]=0.0;l=t;return}case 10:{f=+g[d>>2];h=+g[d+4>>2];i=+g[d+8>>2];e=c[b+56>>2]|0;r=+g[b+32+(e<<2)>>2];if(f*f+h*h+i*i<1.4210854715202004e-14){s=1.0;n=0.0;m=0.0}else{m=1.0/+D(+(f*f+h*h+i*i));s=f*m;n=h*m;m=i*m}c[t+32>>2]=0;c[t+32+4>>2]=0;c[t+32+8>>2]=0;c[t+32+12>>2]=0;g[t+32+(e<<2)>>2]=r;k=+g[t+32>>2];h=+g[t+32+4>>2];f=+g[t+32+8>>2];i=s*k+n*h+m*f;if(i>-999999984306749440.0){p=(g[j>>2]=f,c[j>>2]|0);q=(g[j>>2]=h,c[j>>2]|0);o=(g[j>>2]=k,c[j>>2]|0)}else{i=-999999984306749440.0;o=0;p=0;q=0}c[t+32>>2]=0;c[t+32+4>>2]=0;c[t+32+8>>2]=0;c[t+32+12>>2]=0;g[t+32+(e<<2)>>2]=-r;k=+g[t+32>>2];r=+g[t+32+4>>2];f=+g[t+32+8>>2];e=s*k+n*r+m*f>i;b=(g[j>>2]=k,c[j>>2]|0);d=(g[j>>2]=r,c[j>>2]|0);p=e?(g[j>>2]=f,c[j>>2]|0):p;c[a>>2]=e?b:o;c[a+4>>2]=e?d:q;c[a+8>>2]=p;g[a+12>>2]=0.0;l=t;return}case 5:{p=c[b+96>>2]|0;o=c[b+100>>2]|0;r=+g[b+16>>2];s=+g[b+20>>2];n=+g[b+24>>2];k=+g[d>>2]*r;m=+g[d+4>>2]*s;h=+g[d+8>>2]*n;if((o|0)>0){e=-1;b=0;f=-3402823466385288598117041.0e14;while(1){i=k*+g[p+(b<<4)>>2]+m*+g[p+(b<<4)+4>>2]+h*+g[p+(b<<4)+8>>2];d=i>f;e=d?b:e;b=b+1|0;if((b|0)==(o|0))break;else f=d?i:f}}else e=-1;m=s*+g[p+(e<<4)+4>>2];s=n*+g[p+(e<<4)+8>>2];g[a>>2]=r*+g[p+(e<<4)>>2];g[a+4>>2]=m;g[a+8>>2]=s;g[a+12>>2]=0.0;l=t;return}case 4:{p=c[b+108>>2]|0;o=c[b+100>>2]|0;r=+g[b+16>>2];s=+g[b+20>>2];n=+g[b+24>>2];k=+g[d>>2]*r;m=+g[d+4>>2]*s;h=+g[d+8>>2]*n;if((o|0)>0){e=-1;b=0;f=-3402823466385288598117041.0e14;while(1){i=k*+g[p+(b<<4)>>2]+m*+g[p+(b<<4)+4>>2]+h*+g[p+(b<<4)+8>>2];d=i>f;e=d?b:e;b=b+1|0;if((b|0)==(o|0))break;else f=d?i:f}}else e=-1;m=s*+g[p+(e<<4)+4>>2];s=n*+g[p+(e<<4)+8>>2];g[a>>2]=r*+g[p+(e<<4)>>2];g[a+4>>2]=m;g[a+8>>2]=s;g[a+12>>2]=0.0;l=t;return}default:{Sb[c[(c[b>>2]|0)+68>>2]&127](a,b,d);l=t;return}}}function Od(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0,k=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,z=0.0,A=0.0,B=0;x=l;l=l+64|0;if((h|0)>0){b=0;j=0;do{w=c[f+(j<<2)>>2]|0;b=(w|0)>(b|0)?w:b;j=j+1|0}while((j|0)<(h*3|0))}else b=0;t=b+1|0;k=P(t,t)|0;if(!k)j=0;else{c[6995]=(c[6995]|0)+1;j=sc(k+19|0)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}Yk(j|0,0,k|0)|0}if((b|0)>-1){c[6995]=(c[6995]|0)+1;b=sc((t<<4|3)+16|0)|0;if(!b)m=0;else{c[(b+4+15&-16)+-4>>2]=b;m=b+4+15&-16}b=0;do{w=m+(b<<4)|0;c[w>>2]=c[x>>2];c[w+4>>2]=c[x+4>>2];c[w+8>>2]=c[x+8>>2];c[w+12>>2]=c[x+12>>2];b=b+1|0}while((b|0)!=(t|0));b=0;k=0;while(1){v=c[e+(k+1<<2)>>2]|0;w=c[e+(k+2<<2)>>2]|0;c[m+(b<<4)>>2]=c[e+(k<<2)>>2];c[m+(b<<4)+4>>2]=v;c[m+(b<<4)+8>>2]=w;g[m+(b<<4)+12>>2]=0.0;k=k+3|0;if((k|0)>=(t*3|0)){w=m;v=m;break}else b=b+1|0}}else{w=0;v=0}c[6995]=(c[6995]|0)+1;b=sc(1271)|0;if(!b)u=0;else{c[(b+4+15&-16)+-4>>2]=b;u=b+4+15&-16}Bc(u,d,t,w,0);if((h|0)>0){d=u+780|0;n=u+792|0;o=u+800|0;p=u+984|0;e=0;do{q=c[f+(e<<2)>>2]|0;r=c[f+(e+1<<2)>>2]|0;s=c[f+(e+2<<2)>>2]|0;m=P(q,t)|0;b=j+(m+s)|0;if(!(a[b>>0]|0)){a[b>>0]=1;a[j+((P(s,t)|0)+q)>>0]=1;B=c[d>>2]|0;Xh(u,0);k=(c[n>>2]|0)+-1|0;b=c[o>>2]|0;c[b+(k*52|0)+24>>2]=B+(s*104|0);c[b+(k*52|0)+28>>2]=B+(q*104|0);A=+g[B+(s*104|0)+8>>2]-+g[B+(q*104|0)+8>>2];z=+g[B+(s*104|0)+12>>2]-+g[B+(q*104|0)+12>>2];y=+g[B+(s*104|0)+16>>2]-+g[B+(q*104|0)+16>>2];g[b+(k*52|0)+32>>2]=+D(+(A*A+z*z+y*y));a[p>>0]=1}k=P(r,t)|0;b=j+(k+q)|0;if(!(a[b>>0]|0)){a[b>>0]=1;a[j+(m+r)>>0]=1;b=c[d>>2]|0;Xh(u,0);B=(c[n>>2]|0)+-1|0;m=c[o>>2]|0;c[m+(B*52|0)+24>>2]=b+(q*104|0);c[m+(B*52|0)+28>>2]=b+(r*104|0);y=+g[b+(q*104|0)+8>>2]-+g[b+(r*104|0)+8>>2];z=+g[b+(q*104|0)+12>>2]-+g[b+(r*104|0)+12>>2];A=+g[b+(q*104|0)+16>>2]-+g[b+(r*104|0)+16>>2];g[m+(B*52|0)+32>>2]=+D(+(y*y+z*z+A*A));a[p>>0]=1}b=j+((P(s,t)|0)+r)|0;if(!(a[b>>0]|0)){a[b>>0]=1;a[j+(k+s)>>0]=1;k=c[d>>2]|0;Xh(u,0);B=(c[n>>2]|0)+-1|0;m=c[o>>2]|0;c[m+(B*52|0)+24>>2]=k+(r*104|0);c[m+(B*52|0)+28>>2]=k+(s*104|0);y=+g[k+(r*104|0)+8>>2]-+g[k+(s*104|0)+8>>2];z=+g[k+(r*104|0)+12>>2]-+g[k+(s*104|0)+12>>2];A=+g[k+(r*104|0)+16>>2]-+g[k+(s*104|0)+16>>2];g[m+(B*52|0)+32>>2]=+D(+(y*y+z*z+A*A));a[p>>0]=1}bg(u,q,r,s,0);e=e+3|0}while((e|0)<(h*3|0))}if(i){m=c[u+792>>2]|0;if((m|0)>0){e=u+800|0;b=243703;k=0;do{d=c[e>>2]|0;n=d+(k*52|0)|0;b=(P(b,1664525)|0)+1013904223|0;o=x;p=n;q=o+52|0;do{c[o>>2]=c[p>>2];o=o+4|0;p=p+4|0}while((o|0)<(q|0));o=n;p=d+(((b>>>0)%(m>>>0)|0)*52|0)|0;q=o+52|0;do{c[o>>2]=c[p>>2];o=o+4|0;p=p+4|0}while((o|0)<(q|0));o=d+(((b>>>0)%(m>>>0)|0)*52|0)|0;p=x;q=o+52|0;do{c[o>>2]=c[p>>2];o=o+4|0;p=p+4|0}while((o|0)<(q|0));k=k+1|0}while((k|0)!=(m|0))}else b=243703;d=c[u+812>>2]|0;if((d|0)>0){n=u+820|0;k=0;do{e=c[n>>2]|0;m=e+(k*44|0)|0;b=(P(b,1664525)|0)+1013904223|0;e=e+(((b>>>0)%(d>>>0)|0)*44|0)|0;o=x;p=m;q=o+44|0;do{c[o>>2]=c[p>>2];o=o+4|0;p=p+4|0}while((o|0)<(q|0));o=m;p=e;q=o+44|0;do{c[o>>2]=c[p>>2];o=o+4|0;p=p+4|0}while((o|0)<(q|0));o=e;p=x;q=o+44|0;do{c[o>>2]=c[p>>2];o=o+4|0;p=p+4|0}while((o|0)<(q|0));k=k+1|0}while((k|0)!=(d|0))}}if(!((w|0)==0|(v|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[v+-4>>2]|0)}if(!j){l=x;return u|0}c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);l=x;return u|0}function Pd(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,h=0.0,i=0,k=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0,G=0,H=0,I=0,J=0,K=0;H=l;l=l+96|0;d=c[a+216>>2]|0;if(+g[d+4>>2]==0.0){G=0;l=H;return G|0}G=c[b>>2]|0;if(!(zb[c[(c[d>>2]|0)+8>>2]&31](d,c[G+188>>2]|0)|0)){G=1;l=H;return G|0}b=c[G+192>>2]|0;F=c[a+216>>2]|0;if((c[b+4>>2]|0)!=32){c[H+32>>2]=0;c[H+32+4>>2]=b;c[H+32+8>>2]=G;c[H+32+12>>2]=G+4;c[H+32+16>>2]=-1;c[H+32+20>>2]=-1;ad(a+68|0,a+132|0,H+32|0,F);G=1;l=H;return G|0}if((G|0)==0?1:(c[G+252>>2]|0)!=8){G=1;l=H;return G|0}if(c[G+812>>2]|0?(c[G+1028>>2]|0)==0:0)$g(G);B=+g[a+180>>2]-+g[a+116>>2];C=+g[a+184>>2]-+g[a+120>>2];E=+g[a+188>>2]-+g[a+124>>2];b=c[G+1028>>2]|0;if(!b){s=c[G+812>>2]|0;if((s|0)>0){r=c[G+820>>2]|0;q=0;d=0;b=-1;i=1065353216;m=0;e=1.0;f=1.0;do{K=c[r+(q*44|0)+8>>2]|0;J=c[r+(q*44|0)+12>>2]|0;I=c[r+(q*44|0)+16>>2]|0;h=+Gh(a+116|0,B,C,E,+g[K+8>>2],+g[K+12>>2],+g[K+16>>2],+g[J+8>>2],+g[J+12>>2],+g[J+16>>2],+g[I+8>>2],+g[I+12>>2],+g[I+16>>2],f);if(h>0.0){d=d+1|0;b=q;i=(g[j>>2]=h,c[j>>2]|0);m=3;e=h;f=h}q=q+1|0}while((q|0)!=(s|0))}else{d=0;b=-1;i=1065353216;m=0;e=1.0}}else{c[H+32>>2]=3396;c[H+32+4>>2]=c[a+116>>2];c[H+32+4+4>>2]=c[a+116+4>>2];c[H+32+4+8>>2]=c[a+116+8>>2];c[H+32+4+12>>2]=c[a+116+12>>2];g[H+32+36>>2]=B;g[H+32+40>>2]=C;g[H+32+44>>2]=E;g[H+32+48>>2]=0.0;c[H+32+20>>2]=c[a+180>>2];c[H+32+20+4>>2]=c[a+180+4>>2];c[H+32+20+8>>2]=c[a+180+8>>2];c[H+32+20+12>>2]=c[a+180+12>>2];c[H+32+52>>2]=1065353216;c[H+32+56>>2]=0;c[H+32+60>>2]=0;Ue(b,a+116|0,a+180|0,H+32|0);b=c[H+32+56>>2]|0;if(!b){d=0;b=-1;i=1065353216;m=0;e=1.0}else{K=c[H+32+52>>2]|0;d=1;b=(b-(c[G+820>>2]|0)|0)/44|0;i=K;m=3;e=(c[j>>2]=K,+g[j>>2])}}s=c[G+832>>2]|0;if((s|0)>0){r=c[G+840>>2]|0;q=0;f=(c[j>>2]=i,+g[j>>2]);while(1){K=c[r+(q*104|0)+8>>2]|0;v=+g[K+8>>2];y=+g[K+12>>2];A=+g[K+16>>2];K=c[r+(q*104|0)+12>>2]|0;k=+g[K+8>>2];p=+g[K+12>>2];u=+g[K+16>>2];K=c[r+(q*104|0)+16>>2]|0;w=+g[K+8>>2];x=+g[K+12>>2];z=+g[K+16>>2];h=+Gh(a+116|0,B,C,E,v,y,A,k,p,u,w,x,z,f);if(h>0.0){d=d+1|0;b=q;i=4;e=h;f=h}else i=m;K=c[r+(q*104|0)+20>>2]|0;n=+g[K+8>>2];o=+g[K+12>>2];t=+g[K+16>>2];h=+Gh(a+116|0,B,C,E,v,y,A,k,p,u,n,o,t,f);if(h>0.0){d=d+1|0;b=q;i=4;e=h;f=h}h=+Gh(a+116|0,B,C,E,k,p,u,w,x,z,n,o,t,f);if(h>0.0){d=d+1|0;b=q;i=4;f=h;e=h}h=+Gh(a+116|0,B,C,E,v,y,A,w,x,z,n,o,t,f);if(h>0.0){d=d+1|0;b=q;i=4;e=h;f=h}q=q+1|0;if((q|0)==(s|0)){p=e;break}else m=i}}else{i=m;p=e}if(!d){K=1;l=H;return K|0}if(!(p<=+g[F+4>>2])){K=1;l=H;return K|0}c[H+32>>2]=0;c[H+32+4>>2]=b;k=+g[a+180>>2]-+g[a+116>>2];n=+g[a+184>>2]-+g[a+120>>2];o=+g[a+188>>2]-+g[a+124>>2];e=1.0/+D(+(k*k+n*n+o*o));if((i|0)==3){d=c[G+820>>2]|0;e=+g[d+(b*44|0)+20>>2];h=+g[d+(b*44|0)+24>>2];f=+g[d+(b*44|0)+28>>2];if(k*e+n*h+o*f>0.0){k=-e;h=-h;f=-f;e=0.0}else{k=e;e=+g[d+(b*44|0)+32>>2]}}else{k=-(k*e);h=-(n*e);f=-(o*e);e=0.0}c[H>>2]=G;c[H+4>>2]=H+32;g[H+8>>2]=k;g[H+12>>2]=h;g[H+16>>2]=f;g[H+20>>2]=e;g[H+24>>2]=p;+qb[c[(c[F>>2]|0)+12>>2]&31](F,H,1);K=1;l=H;return K|0}function Qd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0;if(a[b+165>>0]|0){h=c[b+88>>2]|0;a:do if((h|0)>0&e){f=c[b+96>>2]|0;j=+g[d>>2];k=+g[d+4>>2];l=+g[d+8>>2];m=+g[b+168>>2];e=0;while(1){s=+g[f+(e<<4)>>2]-j;r=+g[f+(e<<4)+4>>2]-k;q=+g[f+(e<<4)+8>>2]-l;if(s*s+r*r+q*q<=m)break;e=e+1|0;if((e|0)>=(h|0))break a}return e|0}while(0);p=(c[b+32>>2]|0)+12|0;c[p>>2]=(c[p>>2]|0)+1;if((h|0)==(c[b+92>>2]|0)?(i=h|0?h<<1:1,(h|0)<(i|0)):0){if(!i)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((i<<4|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}h=c[b+88>>2]|0}if((h|0)>0){f=0;do{p=e+(f<<4)|0;o=(c[b+96>>2]|0)+(f<<4)|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];f=f+1|0}while((f|0)!=(h|0))}f=c[b+96>>2]|0;if(f|0){if(a[b+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+96>>2]=0}a[b+100>>0]=1;c[b+96>>2]=e;c[b+92>>2]=i;e=c[b+88>>2]|0}else e=h;p=(c[b+96>>2]|0)+(e<<4)|0;c[p>>2]=c[d>>2];c[p+4>>2]=c[d+4>>2];c[p+8>>2]=c[d+8>>2];c[p+12>>2]=c[d+12>>2];d=c[b+88>>2]|0;c[b+88>>2]=d+1;c[(c[b+32>>2]|0)+16>>2]=c[b+96>>2];return d|0}h=c[b+108>>2]|0;b:do if((h|0)>0&e){f=c[b+116>>2]|0;j=+g[d>>2];k=+g[d+4>>2];l=+g[d+8>>2];m=+g[b+168>>2];e=0;while(1){q=+g[f+(e<<2)>>2]-j;r=+g[f+(e+1<<2)>>2]-k;s=+g[f+(e+2<<2)>>2]-l;i=e+3|0;if(q*q+r*r+s*s<=m)break;if((i|0)<(h|0))e=i;else break b}d=(e|0)/3|0;return d|0}while(0);e=c[b+112>>2]|0;if((h|0)==(e|0)){n=h|0?h<<1:1;if((h|0)<(n|0)){if(!n)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((n<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}h=c[b+108>>2]|0}i=c[b+116>>2]|0;if((h|0)<=0)if(!i)f=b+120|0;else p=34;else{f=0;do{c[e+(f<<2)>>2]=c[i+(f<<2)>>2];f=f+1|0}while((f|0)!=(h|0));p=34}if((p|0)==34){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[b+116>>2]=0;f=b+120|0}a[f>>0]=1;c[b+116>>2]=e;c[b+112>>2]=n;f=c[b+108>>2]|0;i=n}else{f=h;i=h}}else{f=h;i=e}h=c[b+116>>2]|0;c[h+(f<<2)>>2]=c[d>>2];e=f+1|0;c[b+108>>2]=e;if((e|0)==(i|0)){n=i|0?i<<1:1;if((i|0)<(n|0)){if(!n)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((n<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}i=c[b+108>>2]|0;h=c[b+116>>2]|0}if((i|0)<=0)if(!h)f=b+120|0;else p=48;else{f=0;do{c[e+(f<<2)>>2]=c[h+(f<<2)>>2];f=f+1|0}while((f|0)!=(i|0));p=48}if((p|0)==48){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+116>>2]=0;f=b+120|0}a[f>>0]=1;c[b+116>>2]=e;c[b+112>>2]=n;o=e;f=c[b+108>>2]|0;i=n}else{o=h;f=i;e=h}}else{o=h;f=e;e=h}c[o+(f<<2)>>2]=c[d+4>>2];f=f+1|0;c[b+108>>2]=f;if((f|0)==(i|0)){n=i|0?i<<1:1;if((i|0)<(n|0)){if(!n){e=0;h=o}else{c[6995]=(c[6995]|0)+1;e=sc((n<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}i=c[b+108>>2]|0;h=c[b+116>>2]|0}if((i|0)<=0)if(!h)f=b+120|0;else p=62;else{f=0;do{c[e+(f<<2)>>2]=c[h+(f<<2)>>2];f=f+1|0}while((f|0)!=(i|0));p=62}if((p|0)==62){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+116>>2]=0;f=b+120|0}a[f>>0]=1;c[b+116>>2]=e;c[b+112>>2]=n;h=e;f=c[b+108>>2]|0}else{h=o;f=i}}else h=o;c[h+(f<<2)>>2]=c[d+8>>2];d=f+1|0;c[b+108>>2]=d;b=c[b+32>>2]|0;c[b+12>>2]=(c[b+12>>2]|0)+1;c[b+16>>2]=e;d=((d|0)/3|0)+-1|0;return d|0}function Rd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,m=0,n=0.0,o=0.0;m=l;l=l+400|0;f=c[d+36>>2]|0;d=c[e+36>>2]|0;e=c[b+24>>2]|0;if(((e|0)==(c[b+28>>2]|0)?c[e+1132>>2]|0:0)?(j=(P(c[d+380>>2]|0,c[e+1112>>2]|0)|0)+(c[f+380>>2]|0)|0,a[(c[e+1140>>2]|0)+j>>0]|0):0){c[5773]=(c[5773]|0)+1;l=m;return}c[m+332+4>>2]=35;c[m+332+8>>2]=0;c[m+332+12>>2]=-1;c[m+332+16>>2]=1065353216;c[m+332+20>>2]=1065353216;c[m+332+24>>2]=1065353216;g[m+332+28>>2]=0.0;c[m+332>>2]=3644;c[m+332+56>>2]=f;g[m+332+48>>2]=0.0;c[m+272+4>>2]=35;c[m+272+8>>2]=0;c[m+272+12>>2]=-1;c[m+272+16>>2]=1065353216;c[m+272+20>>2]=1065353216;c[m+272+24>>2]=1065353216;g[m+272+28>>2]=0.0;c[m+272>>2]=3644;c[m+272+56>>2]=d;g[m+272+48>>2]=0.0;if((a[22384]|0)==0?Uz(22384)|0:0){if((a[22392]|0)==0?Uz(22392)|0:0){c[5698]=1065353216;c[5699]=0;c[5700]=0;c[5701]=0;c[5702]=0;c[5703]=1065353216;c[5704]=0;c[5705]=0;c[5706]=0;c[5707]=0;c[5708]=1065353216;g[5709]=0.0}c[5682]=c[5698];c[5683]=c[5699];c[5684]=c[5700];c[5685]=c[5701];c[5686]=c[5702];c[5687]=c[5703];c[5688]=c[5704];c[5689]=c[5705];c[5690]=c[5706];c[5691]=c[5707];c[5692]=c[5708];c[5693]=c[5709];c[5694]=0;c[5695]=0;c[5696]=0;c[5697]=0}if((a[22384]|0)==0?Uz(22384)|0:0){if((a[22392]|0)==0?Uz(22392)|0:0){c[5698]=1065353216;c[5699]=0;c[5700]=0;c[5701]=0;c[5702]=0;c[5703]=1065353216;c[5704]=0;c[5705]=0;c[5706]=0;c[5707]=0;c[5708]=1065353216;g[5709]=0.0}c[5682]=c[5698];c[5683]=c[5699];c[5684]=c[5700];c[5685]=c[5701];c[5686]=c[5702];c[5687]=c[5703];c[5688]=c[5704];c[5689]=c[5705];c[5690]=c[5706];c[5691]=c[5707];c[5692]=c[5708];c[5693]=c[5709];c[5694]=0;c[5695]=0;c[5696]=0;c[5697]=0}o=+g[f+232>>2]-+g[d+232>>2];n=+g[f+236>>2]-+g[d+236>>2];g[m>>2]=+g[f+228>>2]-+g[d+228>>2];g[m+4>>2]=o;g[m+8>>2]=n;g[m+12>>2]=0.0;if(!(!(Gd(m+332|0,22728,m+272|0,22728,m,m+216|0)|0)?!(Hc(m+332|0,22728,m+272|0,22728,m,m+216|0,0)|0):0))h=19;if((h|0)==19?(c[m+4>>2]=0,c[m+4+4>>2]=0,c[m+4+8>>2]=0,c[m+4+12>>2]=0,c[m+4+16>>2]=0,c[m+4+20>>2]=0,a[m+152>>0]=0,c[m>>2]=3432,zd(b,m+216|0,f,0,0,d,0,0,m)|0):0){c[6995]=(c[6995]|0)+1;d=sc(235)|0;if(!d)j=0;else{c[(d+4+15&-16)+-4>>2]=d;j=d+4+15&-16}e=j+4|0;d=j+152|0;Yk(e|0,0,212)|0;c[j>>2]=3432;f=m+4|0;h=e+100|0;do{c[e>>2]=c[f>>2];e=e+4|0;f=f+4|0}while((e|0)<(h|0));e=j+104|0;c[e>>2]=c[m+104>>2];c[e+4>>2]=c[m+104+4>>2];c[e+8>>2]=c[m+104+8>>2];c[e+12>>2]=c[m+104+12>>2];e=j+120|0;c[e>>2]=c[m+120>>2];c[e+4>>2]=c[m+120+4>>2];c[e+8>>2]=c[m+120+8>>2];c[e+12>>2]=c[m+120+12>>2];e=j+136|0;c[e>>2]=c[m+136>>2];c[e+4>>2]=c[m+136+4>>2];c[e+8>>2]=c[m+136+8>>2];c[e+12>>2]=c[m+136+12>>2];a[d>>0]=a[m+152>>0]|0;e=j+156|0;f=m+156|0;h=e+60|0;do{c[e>>2]=c[f>>2];e=e+4|0;f=f+4|0}while((e|0)<(h|0));h=c[b+24>>2]|0;i=j;d=c[h+912>>2]|0;if((d|0)==(c[h+916>>2]|0)?(k=d|0?d<<1:1,(d|0)<(k|0)):0){if(!k)f=0;else{c[6995]=(c[6995]|0)+1;d=sc((k<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=d;d=c[h+912>>2]|0}if((d|0)>0){e=0;do{c[f+(e<<2)>>2]=c[(c[h+920>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(d|0))}e=c[h+920>>2]|0;if(e){if(a[h+924>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[h+912>>2]|0}c[h+920>>2]=0}a[h+924>>0]=1;c[h+920>>2]=f;c[h+916>>2]=k}c[(c[h+920>>2]|0)+(d<<2)>>2]=i;c[h+912>>2]=d+1;i=c[b+24>>2]|0;k=c[b+28>>2]|0;n=+g[i+408>>2];o=+g[k+408>>2];b=j+64|0;g[b>>2]=+g[b>>2]*(n>o?n:o);b=j+68|0;g[b>>2]=+g[b>>2]*(+g[i+420>>2]+ +g[k+420>>2])*.5}l=m;return}function Sd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,h=0,i=0,j=0,k=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0;p=l;l=l+128|0;c[b+72>>2]=(c[b+72>>2]|0)+1;c[p>>2]=c[d>>2];c[p+4>>2]=c[d+4>>2];c[p+8>>2]=c[d+8>>2];c[p+12>>2]=c[d+12>>2];c[p+16>>2]=c[d+16>>2];c[p+16+4>>2]=c[d+16+4>>2];c[p+16+8>>2]=c[d+16+8>>2];c[p+16+12>>2]=c[d+16+12>>2];c[p+32>>2]=c[d+32>>2];c[p+32+4>>2]=c[d+32+4>>2];c[p+32+8>>2]=c[d+32+8>>2];c[p+32+12>>2]=c[d+32+12>>2];c[p+48>>2]=c[d+48>>2];c[p+48+4>>2]=c[d+48+4>>2];c[p+48+8>>2]=c[d+48+8>>2];c[p+48+12>>2]=c[d+48+12>>2];n=c[e+4>>2]|0;o=+nb[c[(c[e>>2]|0)+48>>2]&15](e);Vb[c[(c[e>>2]|0)+8>>2]&127](e,d,p+112|0,p+96|0);f=+g[p+112>>2];if(+g[b+36>>2]>f)g[b+36>>2]=f;f=+g[p+96>>2];if(+g[b+52>>2]>2]=f;f=+g[p+112+4>>2];if(+g[b+40>>2]>f)g[b+40>>2]=f;f=+g[p+96+4>>2];if(+g[b+56>>2]>2]=f;f=+g[p+112+8>>2];if(+g[b+44>>2]>f)g[b+44>>2]=f;f=+g[p+96+8>>2];if(+g[b+60>>2]>2]=f;k=c[b+68>>2]|0;if(!k){k=b+20|0;j=0}else{c[p+64>>2]=c[p+112>>2];c[p+64+4>>2]=c[p+112+4>>2];c[p+64+8>>2]=c[p+112+8>>2];c[p+64+12>>2]=c[p+112+12>>2];c[p+64+16>>2]=c[p+96>>2];c[p+64+16+4>>2]=c[p+96+4>>2];c[p+64+16+8>>2]=c[p+96+8>>2];c[p+64+16+12>>2]=c[p+96+12>>2];j=c[b+20>>2]|0;d=c[k+4>>2]|0;if(!d){c[6995]=(c[6995]|0)+1;d=sc(63)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}h=d;i=h+44|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(i|0))}else c[k+4>>2]=0;c[d+32>>2]=0;c[d+36>>2]=j;c[d+40>>2]=0;c[d>>2]=c[p+64>>2];c[d+4>>2]=c[p+64+4>>2];c[d+8>>2]=c[p+64+8>>2];c[d+12>>2]=c[p+64+12>>2];c[d+16>>2]=c[p+64+16>>2];c[d+20>>2]=c[p+64+20>>2];c[d+24>>2]=c[p+64+24>>2];c[d+28>>2]=c[p+64+28>>2];Pe(k,c[k>>2]|0,d);c[k+12>>2]=(c[k+12>>2]|0)+1;k=b+20|0;j=d}d=c[k>>2]|0;if((d|0)==(c[b+24>>2]|0)?(m=d|0?d<<1:1,(d|0)<(m|0)):0){if(!m)i=0;else{c[6995]=(c[6995]|0)+1;d=sc((m*80|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}i=d;d=c[k>>2]|0}if((d|0)>0){h=0;do{q=i+(h*80|0)|0;r=c[b+28>>2]|0;s=r+(h*80|0)|0;c[q>>2]=c[s>>2];c[q+4>>2]=c[s+4>>2];c[q+8>>2]=c[s+8>>2];c[q+12>>2]=c[s+12>>2];q=r+(h*80|0)+16|0;s=i+(h*80|0)+16|0;c[s>>2]=c[q>>2];c[s+4>>2]=c[q+4>>2];c[s+8>>2]=c[q+8>>2];c[s+12>>2]=c[q+12>>2];s=r+(h*80|0)+32|0;q=i+(h*80|0)+32|0;c[q>>2]=c[s>>2];c[q+4>>2]=c[s+4>>2];c[q+8>>2]=c[s+8>>2];c[q+12>>2]=c[s+12>>2];q=i+(h*80|0)+48|0;s=r+(h*80|0)+48|0;c[q>>2]=c[s>>2];c[q+4>>2]=c[s+4>>2];c[q+8>>2]=c[s+8>>2];c[q+12>>2]=c[s+12>>2];q=i+(h*80|0)+64|0;r=r+(h*80|0)+64|0;c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];h=h+1|0}while((h|0)!=(d|0))}d=c[b+28>>2]|0;if(d|0){if(a[b+32>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+28>>2]=0}a[b+32>>0]=1;c[b+28>>2]=i;c[b+24>>2]=m;d=c[k>>2]|0}s=c[b+28>>2]|0;r=s+(d*80|0)|0;c[r>>2]=c[p>>2];c[r+4>>2]=c[p+4>>2];c[r+8>>2]=c[p+8>>2];c[r+12>>2]=c[p+12>>2];r=s+(d*80|0)+16|0;c[r>>2]=c[p+16>>2];c[r+4>>2]=c[p+16+4>>2];c[r+8>>2]=c[p+16+8>>2];c[r+12>>2]=c[p+16+12>>2];r=s+(d*80|0)+32|0;c[r>>2]=c[p+32>>2];c[r+4>>2]=c[p+32+4>>2];c[r+8>>2]=c[p+32+8>>2];c[r+12>>2]=c[p+32+12>>2];r=s+(d*80|0)+48|0;c[r>>2]=c[p+48>>2];c[r+4>>2]=c[p+48+4>>2];c[r+8>>2]=c[p+48+8>>2];c[r+12>>2]=c[p+48+12>>2];s=s+(d*80|0)+64|0;c[s>>2]=e;c[s+4>>2]=n;g[s+8>>2]=o;c[s+12>>2]=j;c[k>>2]=(c[k>>2]|0)+1;l=p;return}function Td(b){b=b|0;var d=0,e=0.0,f=0.0,h=0.0,i=0,j=0.0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0;m=l;l=l+16|0;if(!(a[b+1308>>0]|0)){l=m;return}g[b+928>>2]=0.0;g[b+992>>2]=0.0;g[b+1056>>2]=0.0;c[b+712>>2]=0;c[b+712+4>>2]=0;c[b+712+8>>2]=0;c[b+712+12>>2]=0;jd(b,(c[b+28>>2]|0)+4|0,(c[b+32>>2]|0)+4|0);Ib[c[(c[b>>2]|0)+44>>2]&511](b);e=+g[b+1284>>2];f=+g[b+1288>>2];h=+g[b+1292>>2];if(+g[b+696>>2]>=+g[b+680>>2]){d=(a[b+1300>>0]|0)==0?b+1128|0:b+1064|0;i=c[d+16>>2]|0;k=c[d+32>>2]|0;c[m>>2]=c[d>>2];c[m+4>>2]=i;c[m+8>>2]=k;g[m+12>>2]=0.0;Ch(c[b+28>>2]|0,c[b+32>>2]|0,b+176|0,m,e,f,h,e,f,h)}if(+g[b+700>>2]>=+g[b+684>>2]){d=(a[b+1300>>0]|0)==0?b+1128|0:b+1064|0;i=c[d+20>>2]|0;k=c[d+36>>2]|0;c[m>>2]=c[d+4>>2];c[m+4>>2]=i;c[m+8>>2]=k;g[m+12>>2]=0.0;Ch(c[b+28>>2]|0,c[b+32>>2]|0,b+260|0,m,e,f,h,e,f,h)}if(+g[b+704>>2]>=+g[b+688>>2]){d=(a[b+1300>>0]|0)==0?b+1128|0:b+1064|0;i=c[d+24>>2]|0;k=c[d+40>>2]|0;c[m>>2]=c[d+8>>2];c[m+4>>2]=i;c[m+8>>2]=k;g[m+12>>2]=0.0;Ch(c[b+28>>2]|0,c[b+32>>2]|0,b+344|0,m,e,f,h,e,f,h)}k=0;do{f=+g[b+868+(k<<6)>>2];h=+g[b+868+(k<<6)+4>>2];j=+Xj(+g[b+1192+(k<<2)>>2],f,h);g[b+868+(k<<6)+52>>2]=j;do if(!(f>h)){if(f>j){c[b+868+(k<<6)+56>>2]=1;d=b+868+(k<<6)+48|0;g[d>>2]=j-f;if(!(j-f>3.1415927410125732))if(j-f<-3.1415927410125732)e=6.2831854820251465;else{i=16;break}else e=-6.2831854820251465;g[d>>2]=j-f+e;i=16;break}d=b+868+(k<<6)+56|0;if(h>2]=2;d=b+868+(k<<6)+48|0;g[d>>2]=j-h;if(!(j-h>3.1415927410125732))if(j-h<-3.1415927410125732)e=6.2831854820251465;else{i=16;break}else e=-6.2831854820251465;g[d>>2]=j-h+e;i=16}else i=15}else{d=b+868+(k<<6)+56|0;i=15}while(0);if((i|0)==15?(i=0,c[d>>2]=0,a[b+868+(k<<6)+44>>0]|0):0)i=16;if((i|0)==16){K=b+1208+(k<<4)|0;c[m>>2]=c[K>>2];c[m+4>>2]=c[K+4>>2];c[m+8>>2]=c[K+8>>2];c[m+12>>2]=c[K+12>>2];K=b+428+(k*84|0)|0;d=c[b+28>>2]|0;J=+g[d+4>>2];I=+g[d+20>>2];H=+g[d+36>>2];F=+g[d+8>>2];E=+g[d+24>>2];D=+g[d+40>>2];B=+g[d+12>>2];A=+g[d+28>>2];z=+g[d+44>>2];i=c[b+32>>2]|0;x=+g[i+4>>2];w=+g[i+20>>2];v=+g[i+36>>2];t=+g[i+8>>2];s=+g[i+24>>2];r=+g[i+40>>2];p=+g[i+12>>2];n=+g[i+28>>2];f=+g[i+44>>2];c[K>>2]=0;c[K+4>>2]=0;c[K+8>>2]=0;c[K+12>>2]=0;o=+g[m>>2];e=+g[m+4>>2];h=+g[m+8>>2];g[b+428+(k*84|0)+16>>2]=J*o+I*e+H*h;g[b+428+(k*84|0)+20>>2]=F*o+E*e+D*h;g[b+428+(k*84|0)+24>>2]=B*o+A*e+z*h;g[b+428+(k*84|0)+28>>2]=0.0;g[b+428+(k*84|0)+32>>2]=x*-o+w*-e+v*-h;g[b+428+(k*84|0)+36>>2]=t*-o+s*-e+r*-h;g[b+428+(k*84|0)+40>>2]=p*-o+n*-e+f*-h;g[b+428+(k*84|0)+44>>2]=0.0;G=(J*o+I*e+H*h)*+g[d+456>>2];C=(F*o+E*e+D*h)*+g[d+460>>2];y=(B*o+A*e+z*h)*+g[d+464>>2];g[b+428+(k*84|0)+48>>2]=G;g[b+428+(k*84|0)+52>>2]=C;g[b+428+(k*84|0)+56>>2]=y;g[b+428+(k*84|0)+60>>2]=0.0;u=(x*-o+w*-e+v*-h)*+g[i+456>>2];q=(t*-o+s*-e+r*-h)*+g[i+460>>2];j=(p*-o+n*-e+f*-h)*+g[i+464>>2];g[b+428+(k*84|0)+64>>2]=u;g[b+428+(k*84|0)+68>>2]=q;g[b+428+(k*84|0)+72>>2]=j;g[b+428+(k*84|0)+76>>2]=0.0;g[b+428+(k*84|0)+80>>2]=(J*o+I*e+H*h)*G+(F*o+E*e+D*h)*C+(B*o+A*e+z*h)*y+((x*-o+w*-e+v*-h)*u+(t*-o+s*-e+r*-h)*q+(p*-o+n*-e+f*-h)*j)}k=k+1|0}while((k|0)!=3);l=m;return}function Ud(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=+h;var i=0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0.0;i=l;l=l+464|0;c[i+128>>2]=c[d>>2];c[i+128+4>>2]=c[d+4>>2];c[i+128+8>>2]=c[d+8>>2];c[i+128+12>>2]=c[d+12>>2];c[i+128+16>>2]=c[d+16>>2];c[i+128+16+4>>2]=c[d+16+4>>2];c[i+128+16+8>>2]=c[d+16+8>>2];c[i+128+16+12>>2]=c[d+16+12>>2];c[i+128+32>>2]=c[d+32>>2];c[i+128+32+4>>2]=c[d+32+4>>2];c[i+128+32+8>>2]=c[d+32+8>>2];c[i+128+32+12>>2]=c[d+32+12>>2];k=i+128+48|0;c[k>>2]=c[d+48>>2];c[k+4>>2]=c[d+48+4>>2];c[k+8>>2]=c[d+48+8>>2];c[k+12>>2]=c[d+48+12>>2];c[i+64>>2]=c[e>>2];c[i+64+4>>2]=c[e+4>>2];c[i+64+8>>2]=c[e+8>>2];c[i+64+12>>2]=c[e+12>>2];c[i+64+16>>2]=c[e+16>>2];c[i+64+16+4>>2]=c[e+16+4>>2];c[i+64+16+8>>2]=c[e+16+8>>2];c[i+64+16+12>>2]=c[e+16+12>>2];c[i+64+32>>2]=c[e+32>>2];c[i+64+32+4>>2]=c[e+32+4>>2];c[i+64+32+8>>2]=c[e+32+8>>2];c[i+64+32+12>>2]=c[e+32+12>>2];j=i+64+48|0;c[j>>2]=c[e+48>>2];c[j+4>>2]=c[e+48+4>>2];c[j+8>>2]=c[e+48+8>>2];c[j+12>>2]=c[e+48+12>>2];If(i+128|0,i+64|0,i+256|0,i+192|0);t=+g[i+192>>2];m=t*+g[i+256+4>>2];r=t*+g[i+256+8>>2];g[i+16>>2]=+g[i+256>>2]*t;g[i+16+4>>2]=m;g[i+16+8>>2]=r;g[i+16+12>>2]=0.0;c[i+256>>2]=0;c[i+256+4>>2]=0;c[i+256+8>>2]=0;c[i+256+12>>2]=0;c[i+192+48>>2]=0;c[i+192+48+4>>2]=0;c[i+192+48+8>>2]=0;c[i+192+48+12>>2]=0;yh(i+128|0,i);r=+g[i>>2];m=+g[i+4>>2];t=+g[i+8>>2];q=+g[i+12>>2];o=r*(2.0/(r*r+m*m+t*t+q*q));n=m*(2.0/(r*r+m*m+t*t+q*q));p=t*(2.0/(r*r+m*m+t*t+q*q));g[i+192>>2]=1.0-(m*n+t*p);g[i+192+4>>2]=r*n-q*p;g[i+192+8>>2]=r*p+q*n;g[i+192+12>>2]=0.0;g[i+192+16>>2]=r*n+q*p;g[i+192+20>>2]=1.0-(r*o+t*p);g[i+192+24>>2]=m*p-q*o;g[i+192+28>>2]=0.0;g[i+192+32>>2]=r*p-q*n;g[i+192+36>>2]=m*p+q*o;g[i+192+40>>2]=1.0-(r*o+m*n);g[i+192+44>>2]=0.0;kh(b,i+192|0,i+256|0,i+16|0,i+48|0,i+32|0);c[i+256>>2]=6284;c[i+256+36>>2]=c[d>>2];c[i+256+36+4>>2]=c[d+4>>2];c[i+256+36+8>>2]=c[d+8>>2];c[i+256+36+12>>2]=c[d+12>>2];c[i+256+52>>2]=c[d+16>>2];c[i+256+52+4>>2]=c[d+16+4>>2];c[i+256+52+8>>2]=c[d+16+8>>2];c[i+256+52+12>>2]=c[d+16+12>>2];c[i+256+68>>2]=c[d+32>>2];c[i+256+68+4>>2]=c[d+32+4>>2];c[i+256+68+8>>2]=c[d+32+8>>2];c[i+256+68+12>>2]=c[d+32+12>>2];s=i+256+84|0;c[s>>2]=c[d+48>>2];c[s+4>>2]=c[d+48+4>>2];c[s+8>>2]=c[d+48+8>>2];c[s+12>>2]=c[d+48+12>>2];c[i+256+100>>2]=c[e>>2];c[i+256+100+4>>2]=c[e+4>>2];c[i+256+100+8>>2]=c[e+8>>2];c[i+256+100+12>>2]=c[e+12>>2];c[i+256+116>>2]=c[e+16>>2];c[i+256+116+4>>2]=c[e+16+4>>2];c[i+256+116+8>>2]=c[e+16+8>>2];c[i+256+116+12>>2]=c[e+16+12>>2];c[i+256+132>>2]=c[e+32>>2];c[i+256+132+4>>2]=c[e+32+4>>2];c[i+256+132+8>>2]=c[e+32+8>>2];c[i+256+132+12>>2]=c[e+32+12>>2];d=i+256+148|0;c[d>>2]=c[e+48>>2];c[d+4>>2]=c[e+48+4>>2];c[d+8>>2]=c[e+48+8>>2];c[d+12>>2]=c[e+48+12>>2];c[i+256+180>>2]=a;c[i+256+184>>2]=f;g[i+256+188>>2]=h;c[i+256+192>>2]=b;n=+g[d>>2]-+g[s>>2];m=+g[i+256+152>>2]-+g[i+256+88>>2];o=+g[i+256+156>>2]-+g[i+256+92>>2];h=1.0/+D(+(n*n+m*m+o*o));r=n*h==0.0?999999984306749440.0:1.0/(n*h);g[i+256+4>>2]=r;q=m*h==0.0?999999984306749440.0:1.0/(m*h);g[i+256+8>>2]=q;p=o*h==0.0?999999984306749440.0:1.0/(o*h);g[i+256+12>>2]=p;c[i+256+20>>2]=r<0.0&1;c[i+256+24>>2]=q<0.0&1;c[i+256+28>>2]=p<0.0&1;g[i+256+32>>2]=o*o*h+(n*n*h+m*m*h);f=c[a+68>>2]|0;$b[c[(c[f>>2]|0)+24>>2]&7](f,k,j,i+256|0,i+48|0,i+32|0);l=i;return}function Vd(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[b+24>>2]=d;g[b+28>>2]=0.0;c[b+32>>2]=0;c[b+36>>2]=1;g[b+40>>2]=1.0;a[b+44>>0]=1;c[b+48>>2]=0;a[b+52>>0]=0;a[b+53>>0]=1;a[b+54>>0]=1;g[b+56>>2]=.03999999910593033;a[b+60>>0]=0;g[b+64>>2]=0.0;c[b+68>>2]=e;c[b+72>>2]=0;a[b+76>>0]=1;c[b+80>>2]=0;c[b+84>>2]=0;c[b+88>>2]=0;g[b+92>>2]=.6000000238418579;g[b+96>>2]=1.0;g[b+100>>2]=.30000001192092896;g[b+104>>2]=.01666666753590107;g[b+108>>2]=0.0;g[b+116>>2]=20.0;c[b+112>>2]=10;g[b+124>>2]=.20000000298023224;g[b+128>>2]=.20000000298023224;g[b+132>>2]=0.0;g[b+136>>2]=.20000000298023224;g[b+140>>2]=0.0;g[b+120>>2]=1.0;c[b+144>>2]=1;g[b+148>>2]=-.03999999910593033;g[b+152>>2]=.10000000149011612;g[b+156>>2]=0.0;g[b+160>>2]=.8500000238418579;c[b+164>>2]=260;c[b+168>>2]=2;c[b+172>>2]=128;g[b+176>>2]=100.0;g[b+180>>2]=1000000015047466219876688.0e6;g[b+184>>2]=0.0;g[b+188>>2]=.20000000298023224;c[b>>2]=4360;a[b+208>>0]=1;c[b+204>>2]=0;c[b+196>>2]=0;c[b+200>>2]=0;c[b+212>>2]=0;c[b+216>>2]=f;a[b+240>>0]=1;c[b+236>>2]=0;c[b+228>>2]=0;c[b+232>>2]=0;a[b+260>>0]=1;c[b+256>>2]=0;c[b+248>>2]=0;c[b+252>>2]=0;c[b+264>>2]=0;c[b+268>>2]=-1054867456;a[b+290>>0]=0;a[b+291>>0]=0;c[b+272>>2]=0;c[b+272+4>>2]=0;c[b+272+8>>2]=0;c[b+272+12>>2]=0;a[b+308>>0]=1;c[b+304>>2]=0;c[b+296>>2]=0;c[b+300>>2]=0;c[b+312>>2]=0;a[b+316>>0]=1;a[b+336>>0]=1;c[b+332>>2]=0;c[b+324>>2]=0;c[b+328>>2]=0;c[b+340>>2]=0;if(!f){c[6995]=(c[6995]|0)+1;e=sc(255)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[e>>2]=5052;a[e+20>>0]=1;c[e+16>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;a[e+40>>0]=1;c[e+36>>2]=0;c[e+28>>2]=0;c[e+32>>2]=0;a[e+60>>0]=1;c[e+56>>2]=0;c[e+48>>2]=0;c[e+52>>2]=0;a[e+80>>0]=1;c[e+76>>2]=0;c[e+68>>2]=0;c[e+72>>2]=0;a[e+100>>0]=1;c[e+96>>2]=0;c[e+88>>2]=0;c[e+92>>2]=0;a[e+120>>0]=1;c[e+116>>2]=0;c[e+108>>2]=0;c[e+112>>2]=0;a[e+140>>0]=1;c[e+136>>2]=0;c[e+128>>2]=0;c[e+132>>2]=0;a[e+160>>0]=1;c[e+156>>2]=0;c[e+148>>2]=0;c[e+152>>2]=0;a[e+180>>0]=1;c[e+176>>2]=0;c[e+168>>2]=0;c[e+172>>2]=0;a[e+208>>0]=1;c[e+204>>2]=0;c[e+196>>2]=0;c[e+200>>2]=0;c[e+232>>2]=0;c[e+224>>2]=0;c[e+212>>2]=14;c[e+216>>2]=15;c[e+220>>2]=16;c[b+216>>2]=e;e=1}else e=0;a[b+289>>0]=e;c[6995]=(c[6995]|0)+1;e=sc(87)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[e>>2]=5768;a[e+20>>0]=1;c[e+16>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;a[e+40>>0]=1;c[e+36>>2]=0;c[e+28>>2]=0;c[e+32>>2]=0;a[e+60>>0]=1;c[e+56>>2]=0;c[e+48>>2]=0;c[e+52>>2]=0;a[e+64>>0]=1;c[b+220>>2]=e;a[b+288>>0]=1;c[6995]=(c[6995]|0)+1;e=sc(107)|0;if(!e){f=0;h=c[b+216>>2]|0;c[f>>2]=4580;e=f+4|0;c[e>>2]=0;e=f+8|0;c[e>>2]=h;e=f+12|0;c[e>>2]=0;e=f+16|0;c[e>>2]=0;e=f+20|0;c[e>>2]=0;e=f+24|0;c[e>>2]=d;d=f+44|0;a[d>>0]=1;d=f+40|0;c[d>>2]=0;d=f+32|0;c[d>>2]=0;d=f+36|0;c[d>>2]=0;d=f+64|0;a[d>>0]=1;d=f+60|0;c[d>>2]=0;d=f+52|0;c[d>>2]=0;d=f+56|0;c[d>>2]=0;d=f+84|0;a[d>>0]=1;d=f+80|0;c[d>>2]=0;d=f+72|0;c[d>>2]=0;d=f+76|0;c[d>>2]=0;c[b+212>>2]=f;return}c[(e+4+15&-16)+-4>>2]=e;h=e+4+15&-16;e=c[b+216>>2]|0;c[h>>2]=4580;f=h+4|0;c[f>>2]=0;f=h+8|0;c[f>>2]=e;f=h+12|0;c[f>>2]=0;f=h+16|0;c[f>>2]=0;f=h+20|0;c[f>>2]=0;f=h+24|0;c[f>>2]=d;d=h+44|0;a[d>>0]=1;d=h+40|0;c[d>>2]=0;d=h+32|0;c[d>>2]=0;d=h+36|0;c[d>>2]=0;d=h+64|0;a[d>>0]=1;d=h+60|0;c[d>>2]=0;d=h+52|0;c[d>>2]=0;d=h+56|0;c[d>>2]=0;d=h+84|0;a[d>>0]=1;d=h+80|0;c[d>>2]=0;d=h+72|0;c[d>>2]=0;d=h+76|0;c[d>>2]=0;c[b+212>>2]=h;return}function Wd(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var k=0,m=0.0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0,E=0;C=l;l=l+272|0;z=+g[e+48>>2]-+g[d+48>>2];A=+g[e+52>>2]-+g[d+52>>2];B=+g[e+56>>2]-+g[d+56>>2];If(d,e,C+256|0,C+208|0);v=+g[C+208>>2];t=+g[C+256>>2]*v;u=v*+g[C+256+4>>2];v=v*+g[C+256+8>>2];g[C+192>>2]=t;g[C+192+4>>2]=u;g[C+192+8>>2]=v;g[C+192+12>>2]=0.0;w=+g[h+48>>2]-+g[f+48>>2];x=+g[h+52>>2]-+g[f+52>>2];y=+g[h+56>>2]-+g[f+56>>2];If(f,h,C+256|0,C+208|0);r=+g[C+208>>2];p=+g[C+256>>2]*r;q=r*+g[C+256+4>>2];r=r*+g[C+256+8>>2];g[C+176>>2]=p;g[C+176+4>>2]=q;g[C+176+8>>2]=r;g[C+176+12>>2]=0.0;e=c[b+12>>2]|0;s=+nb[c[(c[e>>2]|0)+16>>2]&15](e);e=c[b+16>>2]|0;if(!e)m=0.0;else m=+nb[c[(c[e>>2]|0)+16>>2]&15](e);s=s*+D(+(t*t+u*u+v*v))+m*+D(+(p*p+q*q+r*r));if(s+ +D(+((w-z)*(w-z)+(x-A)*(x-A)+(y-B)*(y-B)))==0.0){i=0;l=C;return i|0}c[C+208>>2]=9504;g[C+208+36>>2]=999999984306749440.0;a[C+208+40>>0]=0;Jd(b,d,f,C+208|0);h=(a[C+208+40>>0]|0)==0;c[C+256>>2]=c[C+208+20>>2];c[C+256+4>>2]=c[C+208+20+4>>2];c[C+256+8>>2]=c[C+208+20+8>>2];c[C+256+12>>2]=c[C+208+20+12>>2];a:do if(!h?(o=c[C+208+4>>2]|0,k=c[C+208+8>>2]|0,n=c[C+208+12>>2]|0,v=(w-z)*(c[j>>2]=o,+g[j>>2]),v=v+(x-A)*(c[j>>2]=k,+g[j>>2]),!(s+(v+(y-B)*(c[j>>2]=n,+g[j>>2]))<=1.1920928955078125e-07)):0){m=+g[C+208+16>>2];p=+g[C+208+36>>2]+ +g[i+172>>2];b:do if(p>1.0000000474974513e-03){h=0;q=0.0;r=p;while(1){e=c[i+168>>2]|0;if(e|0){E=c[(c[e>>2]|0)+28>>2]|0;c[C+112>>2]=1065353216;c[C+112+4>>2]=1065353216;c[C+112+8>>2]=1065353216;g[C+112+12>>2]=0.0;Qb[E&7](e,C+256|0,.20000000298023224,C+112|0)}m=(w-z)*(c[j>>2]=o,+g[j>>2]);m=m+(x-A)*(c[j>>2]=k,+g[j>>2]);m=s+(m+(y-B)*(c[j>>2]=n,+g[j>>2]));if(m<=1.1920928955078125e-07){k=0;break a}p=q+r/m;if(!(!(p<=q)&(!(p<0.0)&!(p>1.0)))){k=0;break a}Af(d,z,A,B,C+192|0,p,C+112|0);Af(f,w,x,y,C+176|0,p,C+48|0);k=c[i+168>>2]|0;if(k|0){E=c[(c[k>>2]|0)+28>>2]|0;c[C>>2]=1065353216;c[C+4>>2]=0;c[C+8>>2]=0;g[C+12>>2]=0.0;Qb[E&7](k,C+112+48|0,.20000000298023224,C)}Jb[c[c[i>>2]>>2]&31](i,p);c[C>>2]=9504;g[C+36>>2]=999999984306749440.0;a[C+40>>0]=0;Jd(b,C+112|0,C+48|0,C);if(!(a[C+40>>0]|0)){k=15;break}m=+g[C+36>>2];q=+g[i+172>>2];c[C+256>>2]=c[C+20>>2];c[C+256+4>>2]=c[C+20+4>>2];c[C+256+8>>2]=c[C+20+8>>2];c[C+256+12>>2]=c[C+20+12>>2];e=h+1|0;if((h|0)>63){k=16;break}n=c[C+12>>2]|0;k=c[C+8>>2]|0;o=c[C+4>>2]|0;r=m+q;if(!(r>1.0000000474974513e-03)){m=+g[C+16>>2];break b}else{h=e;q=p}}if((k|0)==15)Sb[c[(c[i>>2]|0)+8>>2]&127](i,-1,h);else if((k|0)==16)Sb[c[(c[i>>2]|0)+8>>2]&127](i,-2,e);k=0;break a}else p=0.0;while(0);g[i+164>>2]=p;c[i+132>>2]=o;c[i+136>>2]=k;c[i+140>>2]=n;g[i+144>>2]=m;c[i+148>>2]=c[C+256>>2];c[i+148+4>>2]=c[C+256+4>>2];c[i+148+8>>2]=c[C+256+8>>2];c[i+148+12>>2]=c[C+256+12>>2];k=1}else k=0;while(0);E=k;l=C;return E|0}function Xd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0.0,B=0.0,C=0.0,E=0.0,F=0,G=0;F=l;l=l+32|0;A=+g[b+48>>2]-+g[b+112>>2];h=+g[b+52>>2]-+g[b+116>>2];E=+g[b+56>>2]-+g[b+120>>2];B=A*+g[b+64>>2]+h*+g[b+80>>2]+E*+g[b+96>>2];C=A*+g[b+68>>2]+h*+g[b+84>>2]+E*+g[b+100>>2];E=A*+g[b+72>>2]+h*+g[b+88>>2]+E*+g[b+104>>2];e=c[a+8>>2]|0;z=c[a+4>>2]|0;h=+g[z+32>>2]*+g[z+16>>2];A=h+ +g[a+12>>2];p=+g[e+76>>2];q=+g[e+60>>2];r=+g[e+80>>2];s=+g[e+64>>2];t=+g[e+84>>2];u=+g[e+68>>2];v=+g[e+92>>2];w=+g[e+96>>2];x=+g[e+100>>2];j=(r-s)*(x-u)-(t-u)*(w-s);k=(t-u)*(v-q)-(p-q)*(x-u);o=(p-q)*(w-s)-(r-s)*(v-q);if(!(o*o+(j*j+k*k)>=1.4210854715202004e-14)){l=F;return}n=1.0/+D(+(o*o+(j*j+k*k)));i=(B-q)*j*n+k*n*(C-s)+o*n*(E-u);if(i<0.0){i=-i;m=-(j*n);j=-(k*n);k=-(o*n)}else{m=j*n;j=k*n;k=o*n}if(!(i0.0&(o>0.0&y>0.0)|x<=0.0&(o<=0.0&y<=0.0))){if((xb[c[(c[e>>2]|0)+100>>2]&127](e)|0)<=0){l=F;return}e=0;z=0;o=0.0;n=0.0;i=0.0;do{G=c[a+8>>2]|0;Vb[c[(c[G>>2]|0)+104>>2]&127](G,z,F+16|0,F);s=+g[F+16>>2];x=+g[F+16+4>>2];u=+g[F+16+8>>2];t=+g[F>>2]-s;y=+g[F+4>>2]-x;v=+g[F+8>>2]-u;do if((B-s)*t+(C-x)*y+(E-u)*v>0.0)if((B-s)*t+(C-x)*y+(E-u)*v>2]|0}while((z|0)<(xb[c[(c[G>>2]|0)+100>>2]&127](G)|0));if(!(e&1)){l=F;return}else{p=A*A;s=o;r=n;q=i}}else{p=A*A;s=B-i*m;r=E-i*k;q=C-i*j}n=B-s;o=C-q;i=E-r;if(!(n*n+o*o+i*i1.1920928955078125e-07){j=+D(+(n*n+o*o+i*i));h=h-j;m=n*(1.0/j);k=i*(1.0/j);j=o*(1.0/j)}i=-h;h=+g[b+64>>2];if(f){y=+g[b+68>>2];A=+g[b+72>>2];B=h*m+y*j+A*k;p=+g[b+80>>2];t=+g[b+84>>2];u=+g[b+88>>2];C=m*p+j*t+k*u;v=+g[b+96>>2];w=+g[b+100>>2];x=+g[b+104>>2];E=m*v+j*w+k*x;g[F+16>>2]=-B;g[F+16+4>>2]=-C;g[F+16+8>>2]=-E;g[F+16+12>>2]=0.0;C=s*p+q*t+r*u+ +g[b+116>>2]+C*i;E=s*v+q*w+r*x+ +g[b+120>>2]+E*i;g[F>>2]=s*h+q*y+r*A+ +g[b+112>>2]+B*i;g[F+4>>2]=C;g[F+8>>2]=E;g[F+12>>2]=0.0;Tb[c[(c[d>>2]|0)+16>>2]&15](d,F+16|0,F,i);l=F;return}else{G=c[(c[d>>2]|0)+16>>2]|0;A=+g[b+68>>2];B=+g[b+72>>2];v=+g[b+80>>2];w=+g[b+84>>2];C=+g[b+88>>2];x=+g[b+96>>2];y=+g[b+100>>2];E=+g[b+104>>2];g[F+16>>2]=h*m+A*j+B*k;g[F+16+4>>2]=m*v+j*w+k*C;g[F+16+8>>2]=m*x+j*y+k*E;g[F+16+12>>2]=0.0;C=s*v+q*w+r*C+ +g[b+116>>2];E=s*x+q*y+r*E+ +g[b+120>>2];g[F>>2]=s*h+q*A+r*B+ +g[b+112>>2];g[F+4>>2]=C;g[F+8>>2]=E;g[F+12>>2]=0.0;Tb[G&15](d,F+16|0,F,i);l=F;return}}function Yd(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0;i=l;l=l+16|0;if((a[22480]|0)==0?Uz(22480)|0:0){c[i>>2]=0;c[i+4>>2]=0;c[i+8>>2]=0;c[i+12>>2]=0;ef(23152,0.0,0,0,i)}c[5839]=c[5839]|1;g[5889]=0.0;j=+g[5899]*0.0;k=+g[5900]*0.0;g[5894]=+g[5898]*0.0;g[5895]=j;g[5896]=k;g[5897]=0.0;c[5902]=0;c[5903]=0;c[5904]=0;c[5905]=0;k=+g[5891]*0.0;j=+g[5892]*0.0;g[5943]=+g[5890]*0.0;g[5944]=k;g[5945]=j;g[5946]=0.0;c[b+4>>2]=6;c[b+8>>2]=-1;c[b+12>>2]=-1;g[b+16>>2]=3402823466385288598117041.0e14;a[b+20>>0]=1;a[b+21>>0]=0;c[b+24>>2]=-1;c[b+28>>2]=23152;c[b+32>>2]=d;g[b+36>>2]=0.0;g[b+40>>2]=.05000000074505806;c[b+44>>2]=0;c[b>>2]=4704;c[b+112>>2]=c[e>>2];c[b+112+4>>2]=c[e+4>>2];c[b+112+8>>2]=c[e+8>>2];c[b+112+12>>2]=c[e+12>>2];c[b+128>>2]=c[e+16>>2];c[b+128+4>>2]=c[e+16+4>>2];c[b+128+8>>2]=c[e+16+8>>2];c[b+128+12>>2]=c[e+16+12>>2];c[b+144>>2]=c[e+32>>2];c[b+144+4>>2]=c[e+32+4>>2];c[b+144+8>>2]=c[e+32+8>>2];c[b+144+12>>2]=c[e+32+12>>2];c[b+160>>2]=c[e+48>>2];c[b+160+4>>2]=c[e+48+4>>2];c[b+160+8>>2]=c[e+48+8>>2];c[b+160+12>>2]=c[e+48+12>>2];e=b+680|0;h=e+48|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(h|0));c[b+740>>2]=0;c[b+740+4>>2]=0;c[b+740+8>>2]=0;c[b+740+12>>2]=0;c[b+756>>2]=1045220557;c[b+760>>2]=1045220557;c[b+764>>2]=1045220557;c[b+768>>2]=0;c[b+768+4>>2]=0;c[b+768+8>>2]=0;c[b+768+12>>2]=0;c[b+768+16>>2]=0;g[b+728>>2]=.699999988079071;g[b+732>>2]=1.0;g[b+736>>2]=.5;a[b+788>>0]=0;g[b+792>>2]=0.0;g[b+808>>2]=0.0;a[b+789>>0]=0;g[b+796>>2]=0.0;g[b+812>>2]=0.0;a[b+790>>0]=0;g[b+800>>2]=0.0;g[b+816>>2]=0.0;g[b+928>>2]=0.0;g[b+876>>2]=0.0;g[b+880>>2]=.10000000149011612;g[b+884>>2]=300.0;g[b+868>>2]=1.0;g[b+872>>2]=-1.0;g[b+896>>2]=0.0;g[b+900>>2]=.20000000298023224;g[b+904>>2]=0.0;g[b+908>>2]=0.0;g[b+888>>2]=1.0;g[b+892>>2]=.5;c[b+924>>2]=0;g[b+916>>2]=0.0;a[b+912>>0]=0;g[b+992>>2]=0.0;g[b+940>>2]=0.0;g[b+944>>2]=.10000000149011612;g[b+948>>2]=300.0;g[b+932>>2]=1.0;g[b+936>>2]=-1.0;g[b+960>>2]=0.0;g[b+964>>2]=.20000000298023224;g[b+968>>2]=0.0;g[b+972>>2]=0.0;g[b+952>>2]=1.0;g[b+956>>2]=.5;c[b+988>>2]=0;g[b+980>>2]=0.0;a[b+976>>0]=0;g[b+1056>>2]=0.0;g[b+1004>>2]=0.0;g[b+1008>>2]=.10000000149011612;g[b+1012>>2]=300.0;g[b+996>>2]=1.0;g[b+1e3>>2]=-1.0;g[b+1024>>2]=0.0;g[b+1028>>2]=.20000000298023224;g[b+1032>>2]=0.0;g[b+1036>>2]=0.0;g[b+1016>>2]=1.0;g[b+1020>>2]=.5;c[b+1052>>2]=0;g[b+1044>>2]=0.0;a[b+1040>>0]=0;a[b+1300>>0]=f&1;a[b+1301>>0]=1;c[b+1304>>2]=0;a[b+1308>>0]=0;y=+g[b+112>>2];E=+g[d+4>>2];x=+g[b+128>>2];D=+g[d+8>>2];w=+g[b+144>>2];C=+g[d+12>>2];v=+g[b+116>>2];u=+g[b+132>>2];t=+g[b+148>>2];s=+g[b+120>>2];q=+g[b+136>>2];o=+g[b+152>>2];B=+g[d+20>>2];A=+g[d+24>>2];z=+g[d+28>>2];r=+g[d+36>>2];p=+g[d+40>>2];n=+g[d+44>>2];G=+g[b+160>>2];F=+g[b+164>>2];k=+g[b+168>>2];m=+g[d+52>>2]+(E*G+D*F+C*k);j=B*G+A*F+z*k+ +g[d+56>>2];k=r*G+p*F+n*k+ +g[d+60>>2];g[b+48>>2]=y*E+x*D+w*C;g[b+52>>2]=E*v+D*u+C*t;g[b+56>>2]=E*s+D*q+C*o;g[b+60>>2]=0.0;g[b+64>>2]=y*B+x*A+w*z;g[b+68>>2]=v*B+u*A+t*z;g[b+72>>2]=s*B+q*A+o*z;g[b+76>>2]=0.0;g[b+80>>2]=y*r+x*p+w*n;g[b+84>>2]=v*r+u*p+t*n;g[b+88>>2]=s*r+q*p+o*n;g[b+92>>2]=0.0;g[b+96>>2]=m;g[b+100>>2]=j;g[b+104>>2]=k;g[b+108>>2]=0.0;jd(b,(c[b+28>>2]|0)+4|0,(c[b+32>>2]|0)+4|0);l=i;return}function Zd(b,d,e,f,h,i,j,k){b=b|0;d=d|0;e=e|0;f=f|0;h=+h;i=+i;j=j|0;k=k|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=l;l=l+288|0;c[w+208>>2]=c[d>>2];c[w+208+4>>2]=c[d+4>>2];c[w+208+8>>2]=c[d+8>>2];c[w+208+12>>2]=c[d+12>>2];o=w+208+16|0;c[o>>2]=c[e>>2];c[o+4>>2]=c[e+4>>2];c[o+8>>2]=c[e+8>>2];c[o+12>>2]=c[e+12>>2];e=w+208+32|0;c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];v=c[j>>2]|0;q=c[j+4>>2]|0;r=c[j+8>>2]|0;s=c[j+16>>2]|0;t=c[j+12>>2]|0;p=c[j+20>>2]|0;c[w+156>>2]=c[w+208>>2];c[w+156+4>>2]=c[w+208+4>>2];c[w+156+8>>2]=c[w+208+8>>2];c[w+156+12>>2]=c[w+208+12>>2];c[w+172>>2]=c[o>>2];c[w+172+4>>2]=c[o+4>>2];c[w+172+8>>2]=c[o+8>>2];c[w+172+12>>2]=c[o+12>>2];c[w+188>>2]=c[e>>2];c[w+188+4>>2]=c[e+4>>2];c[w+188+8>>2]=c[e+8>>2];c[w+188+12>>2]=c[e+12>>2];e=c[b+128>>2]|0;if((e|0)==(c[b+132>>2]|0)?(u=e|0?e<<1:1,(e|0)<(u|0)):0){if(!u)d=0;else{c[6995]=(c[6995]|0)+1;d=sc((u*284|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}e=c[b+128>>2]|0}if((e|0)>0){f=0;do{j=c[b+136>>2]|0;m=d+(f*284|0)|0;n=j+(f*284|0)|0;o=m+92|0;do{c[m>>2]=c[n>>2];m=m+4|0;n=n+4|0}while((m|0)<(o|0));m=d+(f*284|0)+92|0;n=j+(f*284|0)+92|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];m=j+(f*284|0)+108|0;n=d+(f*284|0)+108|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];c[n+8>>2]=c[m+8>>2];c[n+12>>2]=c[m+12>>2];n=j+(f*284|0)+124|0;m=d+(f*284|0)+124|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];m=d+(f*284|0)+140|0;n=j+(f*284|0)+140|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];m=d+(f*284|0)+156|0;n=j+(f*284|0)+156|0;o=m+128|0;do{c[m>>2]=c[n>>2];m=m+4|0;n=n+4|0}while((m|0)<(o|0));f=f+1|0}while((f|0)!=(e|0))}e=c[b+136>>2]|0;if(e|0){if(a[b+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+136>>2]=0}a[b+140>>0]=1;c[b+136>>2]=d;c[b+132>>2]=u;e=c[b+128>>2]|0}d=c[b+136>>2]|0;m=d+(e*284|0)|0;n=w;o=m+92|0;do{c[m>>2]=c[n>>2];m=m+4|0;n=n+4|0}while((m|0)<(o|0));m=d+(e*284|0)+92|0;c[m>>2]=c[w+92>>2];c[m+4>>2]=c[w+92+4>>2];c[m+8>>2]=c[w+92+8>>2];c[m+12>>2]=c[w+92+12>>2];m=d+(e*284|0)+108|0;c[m>>2]=c[w+108>>2];c[m+4>>2]=c[w+108+4>>2];c[m+8>>2]=c[w+108+8>>2];c[m+12>>2]=c[w+108+12>>2];m=d+(e*284|0)+124|0;c[m>>2]=c[w+124>>2];c[m+4>>2]=c[w+124+4>>2];c[m+8>>2]=c[w+124+8>>2];c[m+12>>2]=c[w+124+12>>2];m=d+(e*284|0)+140|0;c[m>>2]=c[w+140>>2];c[m+4>>2]=c[w+140+4>>2];c[m+8>>2]=c[w+140+8>>2];c[m+12>>2]=c[w+140+12>>2];d=d+(e*284|0)+156|0;m=d;n=w+156|0;o=m+48|0;do{c[m>>2]=c[n>>2];m=m+4|0;n=n+4|0}while((m|0)<(o|0));g[d+48>>2]=h;c[d+52>>2]=t;g[d+56>>2]=i;c[d+60>>2]=v;c[d+64>>2]=q;c[d+68>>2]=r;c[d+72>>2]=s;g[d+76>>2]=0.0;g[d+80>>2]=0.0;g[d+84>>2]=0.0;g[d+88>>2]=.10000000149011612;c[d+92>>2]=p;g[d+96>>2]=0.0;g[d+100>>2]=0.0;a[d+104>>0]=k&1;m=d+105|0;n=w+256|0;o=m+23|0;do{a[m>>0]=a[n>>0]|0;m=m+1|0;n=n+1|0}while((m|0)<(o|0));k=c[b+128>>2]|0;c[b+128>>2]=k+1;k=(c[b+136>>2]|0)+(k*284|0)|0;Tg(c[b+108>>2]|0,k,0);xe(c[b+108>>2]|0,c[b+136>>2]|0,(c[b+128>>2]|0)+-1|0,0);l=w;return k|0}function _d(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0;if((h|0)<0){o=c[b+8>>2]|0;+wb[c[(c[o>>2]|0)+12>>2]&3](o,d,e,f,g,c[b+12>>2]|0,c[b+16>>2]|0,c[b+4>>2]|0,c[b+20>>2]|0,c[b+24>>2]|0);return}l=c[b+16>>2]|0;a:do if((l|0)>0){j=c[b+12>>2]|0;i=0;while(1){k=j+(i<<2)|0;o=c[k>>2]|0;n=c[o+28>>2]|0;if((c[((c[n+208>>2]|0)>-1?n:c[o+32>>2]|0)+208>>2]|0)==(h|0)){o=k;break a}i=i+1|0;if((i|0)>=(l|0)){o=0;break}}}else{i=0;o=0}while(0);if((i|0)<(l|0)){k=c[b+12>>2]|0;j=0;do{n=c[k+(i<<2)>>2]|0;m=c[n+28>>2]|0;j=((c[((c[m+208>>2]|0)>-1?m:c[n+32>>2]|0)+208>>2]|0)==(h|0)&1)+j|0;i=i+1|0}while((i|0)!=(l|0));n=j}else n=0;i=c[b+4>>2]|0;if((c[i+80>>2]|0)<2){m=c[b+8>>2]|0;+wb[c[(c[m>>2]|0)+12>>2]&3](m,d,e,f,g,o,n,i,c[b+20>>2]|0,c[b+24>>2]|0);return}if((e|0)>0){l=0;i=c[b+32>>2]|0;j=c[b+36>>2]|0;do{m=d+(l<<2)|0;if((i|0)==(j|0)){h=j|0?j<<1:1;if((j|0)<(h|0)){if(!h)i=0;else{c[6995]=(c[6995]|0)+1;i=sc((h<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}j=c[b+32>>2]|0}if((j|0)>0){k=0;do{c[i+(k<<2)>>2]=c[(c[b+40>>2]|0)+(k<<2)>>2];k=k+1|0}while((k|0)!=(j|0))}k=c[b+40>>2]|0;if(k){if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);j=c[b+32>>2]|0}c[b+40>>2]=0}a[b+44>>0]=1;c[b+40>>2]=i;c[b+36>>2]=h;i=j;j=h}else i=j}c[(c[b+40>>2]|0)+(i<<2)>>2]=c[m>>2];i=i+1|0;c[b+32>>2]=i;l=l+1|0}while((l|0)!=(e|0))}if((g|0)>0){l=0;i=c[b+52>>2]|0;j=c[b+56>>2]|0;do{m=f+(l<<2)|0;if((i|0)==(j|0)){h=j|0?j<<1:1;if((j|0)<(h|0)){if(!h)i=0;else{c[6995]=(c[6995]|0)+1;i=sc((h<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}j=c[b+52>>2]|0}if((j|0)>0){k=0;do{c[i+(k<<2)>>2]=c[(c[b+60>>2]|0)+(k<<2)>>2];k=k+1|0}while((k|0)!=(j|0))}k=c[b+60>>2]|0;if(k){if(a[b+64>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);j=c[b+52>>2]|0}c[b+60>>2]=0}a[b+64>>0]=1;c[b+60>>2]=i;c[b+56>>2]=h;i=j;j=h}else i=j}c[(c[b+60>>2]|0)+(i<<2)>>2]=c[m>>2];i=i+1|0;c[b+52>>2]=i;l=l+1|0}while((l|0)!=(g|0))}if((n|0)>0){m=0;i=c[b+72>>2]|0;j=c[b+76>>2]|0;do{l=o+(m<<2)|0;if((i|0)==(j|0)){h=j|0?j<<1:1;if((j|0)<(h|0)){if(!h){k=0;i=j}else{c[6995]=(c[6995]|0)+1;i=sc((h<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}k=i;i=c[b+72>>2]|0}if((i|0)>0){j=0;do{c[k+(j<<2)>>2]=c[(c[b+80>>2]|0)+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0))}j=c[b+80>>2]|0;if(j){if(a[b+84>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);i=c[b+72>>2]|0}c[b+80>>2]=0}a[b+84>>0]=1;c[b+80>>2]=k;c[b+76>>2]=h;j=h}else i=j}c[(c[b+80>>2]|0)+(i<<2)>>2]=c[l>>2];i=i+1|0;c[b+72>>2]=i;m=m+1|0}while((m|0)!=(n|0))}else i=c[b+72>>2]|0;if(((c[b+52>>2]|0)+i|0)<=(c[(c[b+4>>2]|0)+80>>2]|0))return;gh(b);return}function $d(d,f,h,i){d=d|0;f=f|0;h=h|0;i=i|0;var j=0,k=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.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0;w=l;l=l+80|0;v=c[d+52>>2]|0;c[w>>2]=7212;c[w+4>>2]=v;c[w+8>>2]=f;c[w+60>>2]=0;v=c[d+56>>2]|0;if(!(a[v+60>>0]|0)){f=c[v+56>>2]|0;if((f|0)>0){p=0;d=0;m=c[v+96>>2]|0;while(1){d=d+1|0;if(!(+g[h>>2]>+g[m+16>>2])?!(+g[i>>2]<+g[m>>2]):0)j=1;else j=0;if(!(!(+g[h+8>>2]>+g[m+24>>2])?!(+g[i+8>>2]<+g[m+8>>2]):0))j=0;if(!(+g[h+4>>2]>+g[m+20>>2])?!(+g[i+4>>2]<+g[m+4>>2]):0){k=c[m+32>>2]|0;if(j&(k|0)==-1){Sb[c[(c[w>>2]|0)+8>>2]&127](w,c[m+36>>2]|0,c[m+40>>2]|0);f=c[v+56>>2]|0;o=43}else{n=(k|0)==-1;o=42}}else{k=c[m+32>>2]|0;n=(k|0)==-1;j=0;o=42}if((o|0)==42){o=0;if(n|j)o=43;else{m=m+(k<<6)|0;j=k+p|0}}if((o|0)==43){m=m+64|0;j=p+1|0}if((j|0)<(f|0))p=j;else break}}else d=0;if((c[6160]|0)>=(d|0)){l=w;return}c[6160]=d;l=w;return}z=+g[h>>2];D=+g[h+4>>2];H=+g[h+8>>2];G=+g[v+4>>2];z=z>2];D=D>2];H=H>2];E=+g[v+24>>2];A=+g[v+28>>2];F=+g[v+36>>2];B=+g[v+40>>2];x=+g[v+44>>2];s=~~(((I>1]=s;t=~~(((E>1]=t;b[w+70+4>>1]=u;H=+g[i>>2];D=+g[i+4>>2];z=+g[i+8>>2];H=H>1]=i;q=~~(((E>1]=q;b[w+64+4>>1]=r;switch(c[v+144>>2]|0){case 0:{o=c[v+56>>2]|0;if((o|0)>0){d=0;f=c[v+136>>2]|0;j=0;do{d=d+1|0;k=((i&65535)>=(e[f>>1]|0)?(s&65535)<=(e[f+6>>1]|0):0)&(u&65535)<=(e[f+10>>1]|0)&(r&65535)>=(e[f+4>>1]|0)&(t&65535)<=(e[f+8>>1]|0)&(q&65535)>=(e[f+2>>1]|0);m=f+12|0;n=c[m>>2]|0;if((n|0)>-1&k)Sb[c[(c[w>>2]|0)+8>>2]&127](w,n>>>21,n&2097151);if(k|(n|0)>-1){j=j+1|0;f=f+16|0}else{v=c[m>>2]|0;j=j-v|0;f=f+(0-v<<4)|0}}while((j|0)<(o|0))}else d=0;if((c[6160]|0)<(d|0))c[6160]=d;break}case 1:{if((c[v+152>>2]|0)>0){h=0;do{d=c[v+160>>2]|0;if(((i&65535)>=(e[d+(h<<5)>>1]|0)?(s&65535)<=(e[d+(h<<5)+6>>1]|0):0)&(u&65535)<=(e[d+(h<<5)+10>>1]|0)&(r&65535)>=(e[d+(h<<5)+4>>1]|0)&(t&65535)<=(e[d+(h<<5)+8>>1]|0)&(q&65535)>=(e[d+(h<<5)+2>>1]|0)){p=c[d+(h<<5)+12>>2]|0;o=c[d+(h<<5)+16>>2]|0;if((o|0)>0){d=0;f=(c[v+136>>2]|0)+(p<<4)|0;j=p;do{d=d+1|0;k=((i&65535)>=(e[f>>1]|0)?(s&65535)<=(e[f+6>>1]|0):0)&(u&65535)<=(e[f+10>>1]|0)&(r&65535)>=(e[f+4>>1]|0)&(t&65535)<=(e[f+8>>1]|0)&(q&65535)>=(e[f+2>>1]|0);m=f+12|0;n=c[m>>2]|0;if((n|0)>-1&k)Sb[c[(c[w>>2]|0)+8>>2]&127](w,n>>>21,n&2097151);if(k|(n|0)>-1){j=j+1|0;f=f+16|0}else{n=c[m>>2]|0;j=j-n|0;f=f+(0-n<<4)|0}}while((j|0)<(o+p|0))}else d=0;if((c[6160]|0)<(d|0))c[6160]=d}h=h+1|0}while((h|0)<(c[v+152>>2]|0))}break}case 2:{Ek(c[v+136>>2]|0,w,w+70|0,w+64|0);break}default:{}}l=w;return}function ae(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;var f=0,h=0,i=0,j=0.0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0;x=l;l=l+192|0;w=c[a+4>>2]|0;o=+g[w+784>>2];if(o>2]|0;i=(c[a+8>>2]|0)+8|0;v=c[i>>2]|0;E=+g[d>>2];j=+g[b>>2]*e+E;B=+g[d+4>>2];m=+g[b+4>>2]*e+B;y=+g[d+8>>2];n=+g[b+8>>2]*e+y;k=(c[a+12>>2]|0)+8|0;f=c[k>>2]|0;t=(u|0)!=(v|0)?f:u;f=(u|0)!=(v|0)?v:f;z=j-+g[t+52>>2];A=m-+g[t+56>>2];r=n-+g[t+60>>2];p=z*+g[t+4>>2]+A*+g[t+20>>2]+r*+g[t+36>>2];q=z*+g[t+8>>2]+A*+g[t+24>>2]+r*+g[t+40>>2];r=z*+g[t+12>>2]+A*+g[t+28>>2]+r*+g[t+44>>2];E=E-+g[f+52>>2];B=B-+g[f+56>>2];y=y-+g[f+60>>2];A=E*+g[f+4>>2]+B*+g[f+20>>2]+y*+g[f+36>>2];z=E*+g[f+8>>2]+B*+g[f+24>>2]+y*+g[f+40>>2];y=E*+g[f+12>>2]+B*+g[f+28>>2]+y*+g[f+44>>2];g[x>>2]=p;g[x+4>>2]=q;g[x+8>>2]=r;g[x+12>>2]=0.0;g[x+16>>2]=A;g[x+20>>2]=z;g[x+24>>2]=y;g[x+28>>2]=0.0;c[x+64>>2]=c[b>>2];c[x+64+4>>2]=c[b+4>>2];c[x+64+8>>2]=c[b+8>>2];c[x+64+12>>2]=c[b+12>>2];g[x+80>>2]=e;c[x+84>>2]=0;c[x+84+4>>2]=0;c[x+84+8>>2]=0;c[x+84+12>>2]=0;b=x+116|0;f=b+44|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(f|0));g[x+48>>2]=j;g[x+52>>2]=m;g[x+56>>2]=n;g[x+60>>2]=0.0;c[x+32>>2]=c[d>>2];c[x+32+4>>2]=c[d+4>>2];c[x+32+8>>2]=c[d+8>>2];c[x+32+12>>2]=c[d+12>>2];h=c[w+780>>2]|0;if((h|0)>0){b=-1;d=0;e=o*o;while(1){j=+g[w+4+(d*192|0)>>2]-p;m=+g[w+4+(d*192|0)+4>>2]-q;n=+g[w+4+(d*192|0)+8>>2]-r;f=j*j+m*m+n*n>2]|0;f=c[k>>2]|0;E=+g[b+228>>2];B=+g[f+228>>2];A=E*B<-10.0?-10.0:E*B;g[x+84>>2]=A>10.0?10.0:A;g[x+96>>2]=+g[b+232>>2]*+g[f+232>>2];A=+g[b+236>>2]*B+ +g[f+236>>2]*E;A=A<-10.0?-10.0:A;g[x+88>>2]=A>10.0?10.0:A;E=+g[b+240>>2]*B+ +g[f+240>>2]*E;E=E<-10.0?-10.0:E;g[x+92>>2]=E>10.0?10.0:E;d=c[b+204>>2]|0;if((d&128|0)==0?(c[f+204>>2]&128|0)==0:0)b=0;else{g[x+148>>2]=+g[b+244>>2]+ +g[f+244>>2];g[x+144>>2]=1.0/(1.0/+g[b+248>>2]+1.0/+g[f+248>>2]);c[x+120>>2]=8;b=8}if((d&512|0)==0?(c[f+204>>2]&512|0)==0:0)s=b;else{s=b|16;c[x+120>>2]=s}e=+g[x+72>>2];k=+C(+e)>.7071067690849304;n=+g[x+68>>2];if(k){m=1.0/+D(+(e*e+n*n));q=+g[x+64>>2];o=-(m*e);p=q*-(m*e);q=-(m*n*q);j=(e*e+n*n)*m;m=m*n;e=0.0}else{j=+g[x+64>>2];E=1.0/+D(+(j*j+n*n));o=E*j;p=(j*j+n*n)*E;q=e*-(n*E);j=-(E*j*e);m=0.0;e=-(n*E)}g[x+160>>2]=e;g[x+164>>2]=o;g[x+168>>2]=m;g[x+176>>2]=j;g[x+180>>2]=q;g[x+184>>2]=p;f=c[a+16>>2]|0;b=c[a+20>>2]|0;if((u|0)!=(v|0)){c[x+100>>2]=b;d=a+28|0;b=a+24|0}else{c[x+100>>2]=f;d=a+24|0;f=b;b=a+28|0}a=c[d>>2]|0;c[x+104>>2]=f;c[x+108>>2]=a;c[x+112>>2]=c[b>>2];if((t|0)>-1){b=w+4+(t*192|0)|0;f=w+4+(t*192|0)+156|0;d=c[f>>2]|0;h=w+4+(t*192|0)+124|0;e=+g[h>>2];i=w+4+(t*192|0)+128|0;j=+g[i>>2];k=w+4+(t*192|0)+132|0;m=+g[k>>2];if(!((s&16|0)!=0?(E=e*+g[w+4+(t*192|0)+84>>2]+0.0,!(j*j+m*m>E*E)):0)){w=w+4+(t*192|0)+116|0;a=c[w>>2]|0;gi(b|0,x|0,192)|0;c[w>>2]=a;g[h>>2]=e;g[i>>2]=j;g[k>>2]=m}c[f>>2]=d}else kf(w,x)|0;l=x;return}function be(b,d,e){b=b|0;d=+d;e=+e;var f=0,h=0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0;s=l;l=l+80|0;f=c[b+8>>2]|0;if(!f){f=c[b+4>>2]|0;if(!f){k=0.0;o=0.0;m=0.0;d=0.0;j=0.0;n=0.0}else{r=+g[f+336>>2];j=+g[b+172>>2];t=+g[f+340>>2];p=+g[b+168>>2];n=+g[b+164>>2];q=+g[f+332>>2];k=+g[f+316>>2];o=+g[f+320>>2];m=+g[f+324>>2];d=r*j-t*p;j=t*n-j*q;n=p*q-r*n}}else{t=+g[f+392>>2];j=+g[b+172>>2];p=+g[f+396>>2];q=+g[b+168>>2];n=+g[b+164>>2];r=+g[f+388>>2];k=+g[f+372>>2];o=+g[f+376>>2];m=+g[f+380>>2];d=t*j-p*q;j=p*n-j*r;n=q*r-t*n}p=k+d;r=o+j;q=m+n;f=c[b+20>>2]|0;if(!f){f=c[b+16>>2]|0;if(!f){k=0.0;n=0.0;m=0.0;d=0.0;j=0.0;o=0.0}else{t=+g[f+336>>2];j=+g[b+188>>2];w=+g[f+340>>2];v=+g[b+184>>2];o=+g[b+180>>2];u=+g[f+332>>2];k=+g[f+316>>2];n=+g[f+320>>2];m=+g[f+324>>2];d=t*j-w*v;j=w*o-j*u;o=v*u-t*o}}else{w=+g[f+392>>2];j=+g[b+188>>2];t=+g[f+396>>2];u=+g[b+184>>2];o=+g[b+180>>2];v=+g[f+388>>2];k=+g[f+372>>2];n=+g[f+376>>2];m=+g[f+380>>2];d=w*j-t*u;j=t*o-j*v;o=u*v-w*o}p=p-(k+d);n=r-(n+j);d=q-(m+o);j=+g[b+196>>2];k=+g[b+200>>2];m=+g[b+204>>2];a[s+36+32>>0]=1;c[s+36+16>>2]=0;c[s+36+16+4>>2]=0;c[s+36+16+8>>2]=0;c[s+36+16+12>>2]=0;c[s+36>>2]=c[b+72>>2];c[s+36+4>>2]=c[b+72+4>>2];c[s+36+8>>2]=c[b+72+8>>2];c[s+36+12>>2]=c[b+72+12>>2];if(j*p+n*k+d*m<0.0){u=+g[b+212>>2];v=+g[s+36>>2]+((j*p+n*k+d*m)*j+(p-(j*p+n*k+d*m)*j)*u);g[s+36>>2]=v;w=(j*p+n*k+d*m)*k+u*(n-(j*p+n*k+d*m)*k)+ +g[s+36+4>>2];g[s+36+4>>2]=w;k=(j*p+n*k+d*m)*m+u*(d-(j*p+n*k+d*m)*m)+ +g[s+36+8>>2];g[s+36+8>>2]=k;f=s+36+4|0;h=s+36+8|0;i=s+36|0;d=v;j=w}else{f=s+36+4|0;h=s+36+8|0;i=s+36|0;d=+g[s+36>>2];j=+g[s+36+4>>2];k=+g[s+36+8>>2]}m=(+g[b+104>>2]*d+ +g[b+108>>2]*j+ +g[b+112>>2]*k)*e;n=(d*+g[b+120>>2]+j*+g[b+124>>2]+k*+g[b+128>>2])*e;d=(d*+g[b+136>>2]+j*+g[b+140>>2]+k*+g[b+144>>2])*e;g[i>>2]=m;g[f>>2]=n;g[h>>2]=d;g[s+36+12>>2]=0.0;f=c[b+4>>2]|0;if((f|0)!=(c[b+16>>2]|0)){f=s;h=s+36|0;i=f+36|0;do{c[f>>2]=c[h>>2];f=f+4|0;h=h+4|0}while((f|0)<(i|0));w=-+g[s+4>>2];v=-+g[s+8>>2];g[s>>2]=-+g[s>>2];g[s+4>>2]=w;g[s+8>>2]=v;g[s+12>>2]=0.0;v=-+g[s+20>>2];w=-+g[s+24>>2];g[s+16>>2]=-+g[s+16>>2];g[s+20>>2]=v;g[s+24>>2]=w;g[s+28>>2]=0.0;Nh(b+4|0,s,b+164|0);Nh(b+16|0,s+36|0,b+180|0);l=s;return}if(!(m==m&n==n&(d==d&0.0==0.0))){l=s;return}w=+D(+(m*m+n*n+d*d));if(w<+g[f+368>>2]){l=s;return}h=c[s+36+32>>2]|0;w=+g[f+372>>2];g[s+12>>2]=0.0;g[s+28>>2]=0.0;c[s+32>>2]=h;g[s>>2]=-(m*w);g[s+4>>2]=-(n*w);g[s+8>>2]=-(d*w);g[s+16>>2]=w*-0.0;g[s+20>>2]=w*-0.0;g[s+24>>2]=w*-0.0;Nh(b+4|0,s,b+164|0);d=+g[(c[b+4>>2]|0)+372>>2];f=s;h=s+36|0;i=f+36|0;do{c[f>>2]=c[h>>2];f=f+4|0;h=h+4|0}while((f|0)<(i|0));g[s>>2]=d*+g[s>>2];g[s+4>>2]=d*+g[s+4>>2];g[s+8>>2]=d*+g[s+8>>2];g[s+16>>2]=d*+g[s+16>>2];g[s+20>>2]=d*+g[s+20>>2];g[s+24>>2]=d*+g[s+24>>2];Nh(b+16|0,s,b+180|0);l=s;return}function ce(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;c[b>>2]=5536;k=(c[d+20>>2]|0)==0;c[6995]=(c[6995]|0)+1;e=sc(23)|0;c[(e+4+15&-16)+-4>>2]=e;c[(e+4+15&-16)>>2]=k?9416:9464;c[b+24>>2]=e+4+15&-16;c[6995]=(c[6995]|0)+1;e=sc(39)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}k=c[b+24>>2]|0;a[e+4>>0]=0;c[e>>2]=6380;c[e+12>>2]=0;c[e+16>>2]=3;c[e+8>>2]=k;c[b+28>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5568;c[b+32>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5588;c[b+36>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5608;c[b+40>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5628;c[b+44>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5648;c[b+48>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5668;c[b+52>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5688;c[b+56>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5708;c[b+72>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[e>>2]=5708;c[b+76>>2]=e;a[e+4>>0]=1;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5728;c[b+68>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(35)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5748;c[e+8>>2]=1;c[e+12>>2]=0;c[b+84>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(35)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[e>>2]=5748;c[e+8>>2]=1;c[e+12>>2]=0;c[b+80>>2]=e;a[e+4>>0]=1;k=c[d+16>>2]|0;k=(k|0)>80?k:80;e=c[d>>2]|0;if(!e){a[b+12>>0]=1;c[6995]=(c[6995]|0)+1;e=sc(43)|0;if(!e)j=0;else{c[(e+4+15&-16)+-4>>2]=e;j=e+4+15&-16}e=c[d+8>>2]|0;c[j>>2]=804;f=j+4|0;c[f>>2]=e;c[j+20>>2]=0;c[6995]=(c[6995]|0)+1;e=sc((e*804|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[j+16>>2]=e;c[j+12>>2]=e;f=c[f>>2]|0;c[j+8>>2]=f;if(f+-1|0){g=c[j>>2]|0;h=e;i=f+-1|0;do{l=h;h=h+g|0;c[l>>2]=h;i=i+-1|0}while((i|0)!=0);e=e+(P(g,f+-1|0)|0)|0}c[e>>2]=0;c[b+8>>2]=j}else{a[b+12>>0]=0;c[b+8>>2]=e}g=(k|0)>116?k+16&-16:128;e=c[d+4>>2]|0;if(e|0){a[b+20>>0]=0;c[b+16>>2]=e;return}a[b+20>>0]=1;c[6995]=(c[6995]|0)+1;e=sc(43)|0;if(!e)j=0;else{c[(e+4+15&-16)+-4>>2]=e;j=e+4+15&-16}e=c[d+12>>2]|0;c[j>>2]=g;f=j+4|0;c[f>>2]=e;c[j+20>>2]=0;e=P(e,g)|0;c[6995]=(c[6995]|0)+1;e=sc((e|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[j+16>>2]=e;c[j+12>>2]=e;f=c[f>>2]|0;c[j+8>>2]=f;if(f+-1|0){g=c[j>>2]|0;h=e;i=f+-1|0;do{l=h;h=h+g|0;c[l>>2]=h;i=i+-1|0}while((i|0)!=0);e=e+(P(g,f+-1|0)|0)|0}c[e>>2]=0;c[b+16>>2]=j;return}function de(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0,s=0,t=0.0,u=0.0;s=l;l=l+48|0;c[s+16>>2]=c[e>>2];c[s+16+4>>2]=c[e+4>>2];c[s+16+8>>2]=c[e+8>>2];c[s+16+12>>2]=c[e+12>>2];c[s+16+16>>2]=c[f>>2];c[s+16+16+4>>2]=c[f+4>>2];c[s+16+16+8>>2]=c[f+8>>2];c[s+16+16+12>>2]=c[f+12>>2];do if((c[d+60>>2]|0)==2){h=c[d+48>>2]|0;Ag(b+44|0,h)|0;i=c[b+48>>2]|0;if(i|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[b+48>>2]=h;c[b+56>>2]=(c[b+56>>2]|0)+-1;h=c[b+8>>2]|0;if(!h){c[6995]=(c[6995]|0)+1;h=sc(63)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}i=h;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0))}else c[b+8>>2]=0;c[h+32>>2]=0;c[h+36>>2]=d;c[h+40>>2]=0;c[h>>2]=c[s+16>>2];c[h+4>>2]=c[s+16+4>>2];c[h+8>>2]=c[s+16+8>>2];c[h+12>>2]=c[s+16+12>>2];c[h+16>>2]=c[s+16+16>>2];c[h+20>>2]=c[s+16+20>>2];c[h+24>>2]=c[s+16+24>>2];c[h+28>>2]=c[s+16+28>>2];Pe(b+4|0,c[b+4>>2]|0,h);c[b+16>>2]=(c[b+16>>2]|0)+1;c[d+48>>2]=h;h=1}else{c[b+128>>2]=(c[b+128>>2]|0)+1;r=c[d+48>>2]|0;if(((((+g[r>>2]<=+g[s+16+16>>2]?+g[r+16>>2]>=+g[s+16>>2]:0)?+g[r+4>>2]<=+g[s+16+20>>2]:0)?+g[r+20>>2]>=+g[s+16+4>>2]:0)?+g[r+8>>2]<=+g[s+16+24>>2]:0)?+g[r+24>>2]>=+g[s+16+8>>2]:0){k=+g[d+16>>2];t=+g[e>>2]-k;m=+g[d+20>>2];p=+g[e+4>>2]-m;n=+g[d+24>>2];q=+g[e+8>>2]-n;u=+g[b+100>>2];k=(+g[d+32>>2]-k)*.5*u;m=(+g[d+36>>2]-m)*.5*u;n=u*(+g[d+40>>2]-n)*.5;g[s>>2]=k;g[s+4>>2]=m;g[s+8>>2]=n;g[s+12>>2]=0.0;if(t<0.0)g[s>>2]=-k;if(p<0.0)g[s+4>>2]=-m;if(q<0.0)g[s+8>>2]=-n;if(uh(b+4|0,r,s+16|0,s,.05000000074505806)|0){c[b+132>>2]=(c[b+132>>2]|0)+1;h=1}else h=0;break}h=Ag(b+4|0,r)|0;a:do if(h){o=c[b+12>>2]|0;if((o|0)<=-1){h=c[b+4>>2]|0;break}if(o){i=0;while(1){j=c[h+32>>2]|0;i=i+1|0;if(!j)break a;if((i|0)>=(o|0)){h=j;break}else h=j}}}else h=0;while(0);c[r>>2]=c[s+16>>2];c[r+4>>2]=c[s+16+4>>2];c[r+8>>2]=c[s+16+8>>2];c[r+12>>2]=c[s+16+12>>2];c[r+16>>2]=c[s+16+16>>2];c[r+20>>2]=c[s+16+20>>2];c[r+24>>2]=c[s+16+24>>2];c[r+28>>2]=c[s+16+28>>2];Pe(b+4|0,h,r);c[b+132>>2]=(c[b+132>>2]|0)+1;h=1}while(0);i=c[d+52>>2]|0;c[((i|0)==0?b+84+(c[d+60>>2]<<2)|0:i+56|0)>>2]=c[d+56>>2];i=c[d+56>>2]|0;if(i|0)c[i+52>>2]=c[d+52>>2];c[d+16>>2]=c[e>>2];c[d+16+4>>2]=c[e+4>>2];c[d+16+8>>2]=c[e+8>>2];c[d+16+12>>2]=c[e+12>>2];c[d+32>>2]=c[f>>2];c[d+32+4>>2]=c[f+4>>2];c[d+32+8>>2]=c[f+8>>2];c[d+32+12>>2]=c[f+12>>2];i=c[b+104>>2]|0;c[d+60>>2]=i;c[d+52>>2]=0;c[d+56>>2]=c[b+84+(i<<2)>>2];j=c[b+84+(i<<2)>>2]|0;if(j|0)c[j+52>>2]=d;c[b+84+(i<<2)>>2]=d;if(!h){l=s;return}a[b+154>>0]=1;if(a[b+153>>0]|0){l=s;return}c[s>>2]=9248;c[s+4>>2]=b;ne(b+44|0,c[b+44>>2]|0,c[d+48>>2]|0,s);ne(b+4|0,c[b+4>>2]|0,c[d+48>>2]|0,s);l=s;return}function ee(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0,h=0,i=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;D=c[a+772>>2]|0;if((D|0)>0){c[6995]=(c[6995]|0)+1;d=sc((D<<4|3)+16|0)|0;if(!d)h=0;else{c[(d+4+15&-16)+-4>>2]=d;h=d+4+15&-16}Yk(h|0,0,D<<4|0)|0;f=c[a+772>>2]|0;if((f|0)>0){c[6995]=(c[6995]|0)+1;d=sc((f<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}Yk(d|0,0,f<<2|0)|0;B=d;C=h;A=d;z=h}else{B=0;C=h;A=0;z=h}}else{B=0;C=0;A=0;z=0}y=c[a+1112>>2]|0;if(b){if((y|0)>0){i=c[a+1120>>2]|0;d=0;do{f=c[i+(d<<2)>>2]|0;h=c[f+312>>2]|0;if(h|0){g[f+276>>2]=1.0/+(h|0)*+g[f+276>>2];g[f+280>>2]=1.0/+(h|0)*+g[f+280>>2];g[f+284>>2]=1.0/+(h|0)*+g[f+284>>2];g[f+292>>2]=+g[f+292>>2]*(1.0/+(h|0));g[f+296>>2]=1.0/+(h|0)*+g[f+296>>2];g[f+300>>2]=1.0/+(h|0)*+g[f+300>>2]}d=d+1|0}while((d|0)!=(y|0));i=11}}else i=11;if((i|0)==11?(y|0)>0:0){k=c[a+1120>>2]|0;if(b){f=0;do{h=c[k+(f<<2)>>2]|0;if((c[h+312>>2]|0)>0?(w=+g[a+512>>2],r=+g[h+276>>2]*w,s=w*+g[h+280>>2],t=w*+g[h+284>>2],u=w*+g[h+292>>2],v=w*+g[h+296>>2],w=w*+g[h+300>>2],x=c[h+24>>2]|0,(x|0)>0):0){i=c[h+32>>2]|0;b=c[a+780>>2]|0;j=c[h+12>>2]|0;d=0;do{q=c[i+(d<<2)>>2]|0;p=+g[j+(d<<2)>>2];o=+g[q+8>>2]-+g[h+228>>2];n=+g[q+12>>2]-+g[h+232>>2];m=+g[q+16>>2]-+g[h+236>>2];E=C+(((q-b|0)/104|0)<<4)|0;g[E>>2]=+g[E>>2]+p*(r+(v*m-w*n));E=C+(((q-b|0)/104|0)<<4)+4|0;g[E>>2]=+g[E>>2]+p*(s+(w*o-u*m));E=C+(((q-b|0)/104|0)<<4)+8|0;g[E>>2]=p*(t+(u*n-v*o))+ +g[E>>2];q=B+(((q-b|0)/104|0)<<2)|0;g[q>>2]=p+ +g[q>>2];d=d+1|0}while((d|0)!=(x|0))}f=f+1|0}while((f|0)!=(y|0))}else{f=0;do{h=c[k+(f<<2)>>2]|0;if((c[h+308>>2]|0)>0?(p=+g[a+512>>2],e=+g[h+244>>2]*p,l=p*+g[h+248>>2],m=p*+g[h+252>>2],n=p*+g[h+260>>2],o=p*+g[h+264>>2],p=p*+g[h+268>>2],q=c[h+24>>2]|0,(q|0)>0):0){i=c[h+32>>2]|0;b=c[a+780>>2]|0;j=c[h+12>>2]|0;d=0;do{E=c[i+(d<<2)>>2]|0;w=+g[j+(d<<2)>>2];v=+g[E+8>>2]-+g[h+228>>2];u=+g[E+12>>2]-+g[h+232>>2];t=+g[E+16>>2]-+g[h+236>>2];x=C+(((E-b|0)/104|0)<<4)|0;g[x>>2]=+g[x>>2]+w*(e+(o*t-p*u));x=C+(((E-b|0)/104|0)<<4)+4|0;g[x>>2]=+g[x>>2]+w*(l+(p*v-n*t));x=C+(((E-b|0)/104|0)<<4)+8|0;g[x>>2]=w*(m+(n*u-o*v))+ +g[x>>2];E=B+(((E-b|0)/104|0)<<2)|0;g[E>>2]=w+ +g[E>>2];d=d+1|0}while((d|0)!=(q|0))}f=f+1|0}while((f|0)!=(y|0))}}if((D|0)>0){d=0;do{e=+g[B+(d<<2)>>2];if(e>0.0){v=1.0/e*+g[C+(d<<4)+4>>2];w=1.0/e*+g[C+(d<<4)+8>>2];E=c[a+780>>2]|0;y=E+(d*104|0)+8|0;g[y>>2]=1.0/e*+g[C+(d<<4)>>2]+ +g[y>>2];y=E+(d*104|0)+12|0;g[y>>2]=v+ +g[y>>2];E=E+(d*104|0)+16|0;g[E>>2]=w+ +g[E>>2]}d=d+1|0}while((d|0)!=(D|0))}if(!((B|0)==0|(A|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[A+-4>>2]|0)}if((C|0)==0|(z|0)==0)return;c[6996]=(c[6996]|0)+1;Cd(c[z+-4>>2]|0);return}function fe(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0;p=l;l=l+144|0;if((c[a+20>>2]|0)<=0){o=a+80|0;c[o>>2]=c[b>>2];c[o+4>>2]=c[b+4>>2];c[o+8>>2]=c[b+8>>2];c[o+12>>2]=c[b+12>>2];o=c[a>>2]|0;o=o+68|0;o=c[o>>2]|0;Ib[o&511](a);l=p;return}j=p+16+16|0;k=p+16+32|0;m=p+16+48|0;i=0;do{o=c[a+28>>2]|0;n=o+(i*80|0)|0;c[p+16>>2]=c[n>>2];c[p+16+4>>2]=c[n+4>>2];c[p+16+8>>2]=c[n+8>>2];c[p+16+12>>2]=c[n+12>>2];n=o+(i*80|0)+16|0;c[j>>2]=c[n>>2];c[j+4>>2]=c[n+4>>2];c[j+8>>2]=c[n+8>>2];c[j+12>>2]=c[n+12>>2];n=o+(i*80|0)+32|0;c[k>>2]=c[n>>2];c[k+4>>2]=c[n+4>>2];c[k+8>>2]=c[n+8>>2];c[k+12>>2]=c[n+12>>2];n=o+(i*80|0)+48|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];o=c[o+(i*80|0)+64>>2]|0;o=xb[c[(c[o>>2]|0)+28>>2]&127](o)|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];q=+g[p+4>>2]*+g[b+4>>2]/+g[a+84>>2];r=+g[p+8>>2]*+g[b+8>>2]/+g[a+88>>2];g[p>>2]=+g[p>>2]*+g[b>>2]/+g[a+80>>2];g[p+4>>2]=q;g[p+8>>2]=r;g[p+12>>2]=0.0;o=c[(c[a+28>>2]|0)+(i*80|0)+64>>2]|0;Ob[c[(c[o>>2]|0)+24>>2]&127](o,p);r=+g[p+16+52>>2]*+g[b+4>>2]/+g[a+84>>2];q=+g[p+16+56>>2]*+g[b+8>>2]/+g[a+88>>2];g[p+16+48>>2]=+g[m>>2]*+g[b>>2]/+g[a+80>>2];g[p+16+52>>2]=r;g[p+16+56>>2]=q;g[p+16+60>>2]=0.0;o=c[a+28>>2]|0;n=o+(i*80|0)|0;c[n>>2]=c[p+16>>2];c[n+4>>2]=c[p+16+4>>2];c[n+8>>2]=c[p+16+8>>2];c[n+12>>2]=c[p+16+12>>2];n=o+(i*80|0)+16|0;c[n>>2]=c[j>>2];c[n+4>>2]=c[j+4>>2];c[n+8>>2]=c[j+8>>2];c[n+12>>2]=c[j+12>>2];n=o+(i*80|0)+32|0;c[n>>2]=c[k>>2];c[n+4>>2]=c[k+4>>2];c[n+8>>2]=c[k+8>>2];c[n+12>>2]=c[k+12>>2];o=o+(i*80|0)+48|0;c[o>>2]=c[m>>2];c[o+4>>2]=c[m+4>>2];c[o+8>>2]=c[m+8>>2];c[o+12>>2]=c[m+12>>2];if(c[a+68>>2]|0){n=c[(c[a+28>>2]|0)+(i*80|0)+64>>2]|0;Vb[c[(c[n>>2]|0)+8>>2]&127](n,p+16|0,p+128|0,p+112|0);c[p+80>>2]=c[p+128>>2];c[p+80+4>>2]=c[p+128+4>>2];c[p+80+8>>2]=c[p+128+8>>2];c[p+80+12>>2]=c[p+128+12>>2];c[p+80+16>>2]=c[p+112>>2];c[p+80+16+4>>2]=c[p+112+4>>2];c[p+80+16+8>>2]=c[p+112+8>>2];c[p+80+16+12>>2]=c[p+112+12>>2];n=c[a+68>>2]|0;o=c[(c[a+28>>2]|0)+(i*80|0)+76>>2]|0;d=Ag(n,o)|0;a:do if(d){h=c[n+8>>2]|0;if((h|0)<=-1){d=c[n>>2]|0;break}if(h){e=0;while(1){f=c[d+32>>2]|0;e=e+1|0;if(!f)break a;if((e|0)>=(h|0)){d=f;break}else d=f}}}else d=0;while(0);c[o>>2]=c[p+80>>2];c[o+4>>2]=c[p+80+4>>2];c[o+8>>2]=c[p+80+8>>2];c[o+12>>2]=c[p+80+12>>2];c[o+16>>2]=c[p+80+16>>2];c[o+20>>2]=c[p+80+20>>2];c[o+24>>2]=c[p+80+24>>2];c[o+28>>2]=c[p+80+28>>2];Pe(n,d,o)}i=i+1|0}while((i|0)<(c[a+20>>2]|0));o=a+80|0;c[o>>2]=c[b>>2];c[o+4>>2]=c[b+4>>2];c[o+8>>2]=c[b+8>>2];c[o+12>>2]=c[b+12>>2];o=c[a>>2]|0;o=o+68|0;o=c[o>>2]|0;Ib[o&511](a);l=p;return}function ge(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,i=0.0,j=0.0,k=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0;s=l;l=l+96|0;q=c[b+12>>2]|0;Vb[c[(c[q>>2]|0)+8>>2]&127](q,(c[b+8>>2]|0)+4|0,s+80|0,s+64|0);q=c[d+68>>2]|0;Zb[c[(c[q>>2]|0)+16>>2]&31](q,c[(c[b+8>>2]|0)+188>>2]|0,s+80|0,s+64|0,c[d+24>>2]|0);q=c[d+24>>2]|0;Vb[c[(c[q>>2]|0)+32>>2]&127](q,c[(c[b+8>>2]|0)+344>>2]|0,d+28|0,q);q=c[b+8>>2]|0;c[b+132>>2]=c[q+52>>2];c[b+132+4>>2]=c[q+52+4>>2];c[b+132+8>>2]=c[q+52+8>>2];c[b+132+12>>2]=c[q+52+12>>2];q=c[q+344>>2]|0;if((xb[c[(c[q>>2]|0)+36>>2]&127](q)|0)>0){d=0;q=0;do{e=c[b+204>>2]|0;if((e|0)<0){if((c[b+208>>2]|0)<0){f=c[b+212>>2]|0;if(f|0){if(a[b+216>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+212>>2]=0}a[b+216>>0]=1;c[b+212>>2]=0;c[b+208>>2]=0}do{c[(c[b+212>>2]|0)+(e<<2)>>2]=0;e=e+1|0}while((e|0)!=0)}c[b+204>>2]=0;e=c[(c[b+8>>2]|0)+344>>2]|0;e=c[(xb[c[(c[e>>2]|0)+28>>2]&127](e)|0)+12>>2]|0;f=c[c[e+(q<<4)>>2]>>2]|0;h=c[c[e+(q<<4)+4>>2]>>2]|0;if(!((f|0)!=0?(c[f+204>>2]&4|0)!=0:0))r=14;do if((r|0)==14){r=0;if(h|0?c[h+204>>2]&4|0:0)break;if(Bb[c[(c[b>>2]|0)+56>>2]&63](b,f,h)|0){e=c[e+(q<<4)+8>>2]|0;if(e|0)Ob[c[(c[e>>2]|0)+16>>2]&127](e,b+200|0);p=c[b+204>>2]|0;if((p|0)>0){n=c[b+212>>2]|0;o=c[b+8>>2]|0;m=0;do{f=c[n+(m<<2)>>2]|0;j=(c[f+772>>2]|0)==(o|0)?-1.0:1.0;h=c[f+780>>2]|0;if((h|0)>0){k=-+g[b+16>>2];e=0;do{i=+g[f+4+(e*192|0)+80>>2];if(i>2]*.20000000298023224;t=i*j*+g[f+4+(e*192|0)+72>>2]*.20000000298023224;g[b+132>>2]=i*j*+g[f+4+(e*192|0)+64>>2]*.20000000298023224+ +g[b+132>>2];g[b+136>>2]=u+ +g[b+136>>2];g[b+140>>2]=t+ +g[b+140>>2];d=1}e=e+1|0}while((e|0)!=(h|0))}m=m+1|0}while((m|0)!=(p|0))}}}while(0);q=q+1|0;p=c[(c[b+8>>2]|0)+344>>2]|0}while((q|0)<(xb[c[(c[p>>2]|0)+36>>2]&127](p)|0))}else d=0;r=c[b+8>>2]|0;c[s>>2]=c[r+4>>2];c[s+4>>2]=c[r+4+4>>2];c[s+8>>2]=c[r+4+8>>2];c[s+12>>2]=c[r+4+12>>2];c[s+16>>2]=c[r+20>>2];c[s+16+4>>2]=c[r+20+4>>2];c[s+16+8>>2]=c[r+20+8>>2];c[s+16+12>>2]=c[r+20+12>>2];c[s+32>>2]=c[r+36>>2];c[s+32+4>>2]=c[r+36+4>>2];c[s+32+8>>2]=c[r+36+8>>2];c[s+32+12>>2]=c[r+36+12>>2];c[s+48>>2]=c[b+132>>2];c[s+48+4>>2]=c[b+132+4>>2];c[s+48+8>>2]=c[b+132+8>>2];c[s+48+12>>2]=c[b+132+12>>2];c[r+304>>2]=(c[r+304>>2]|0)+1;c[r+4>>2]=c[s>>2];c[r+4+4>>2]=c[s+4>>2];c[r+4+8>>2]=c[s+8>>2];c[r+4+12>>2]=c[s+12>>2];c[r+20>>2]=c[s+16>>2];c[r+20+4>>2]=c[s+16+4>>2];c[r+20+8>>2]=c[s+16+8>>2];c[r+20+12>>2]=c[s+16+12>>2];c[r+36>>2]=c[s+32>>2];c[r+36+4>>2]=c[s+32+4>>2];c[r+36+8>>2]=c[s+32+8>>2];c[r+36+12>>2]=c[s+32+12>>2];c[r+52>>2]=c[s+48>>2];c[r+52+4>>2]=c[s+48+4>>2];c[r+52+8>>2]=c[s+48+8>>2];c[r+52+12>>2]=c[s+48+12>>2];l=s;return d|0}function he(d,f,h,i,j,k){d=d|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0.0,m=0.0,n=0.0;c[d>>2]=8928;b[d+4>>1]=-2;b[d+6>>1]=-1;c[d+92>>2]=j;c[d+96>>2]=0;a[d+100>>0]=0;c[d+104>>2]=0;c[d+108>>2]=0;if(!j){c[6995]=(c[6995]|0)+1;j=sc(91)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}Li(j);c[d+92>>2]=j;a[d+100>>0]=1}if(!k){c[6995]=(c[6995]|0)+1;j=sc(43)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}k=j+4|0;c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0;c[j>>2]=8992;a[j+20>>0]=1;c[j+16>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[d+112>>2]=j;c[6995]=(c[6995]|0)+1;j=sc(195)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}Ne(j,c[d+112>>2]|0);c[d+108>>2]=j;a[j+153>>0]=1}c[d+8>>2]=c[f>>2];c[d+8+4>>2]=c[f+4>>2];c[d+8+8>>2]=c[f+8>>2];c[d+8+12>>2]=c[f+12>>2];c[d+24>>2]=c[h>>2];c[d+24+4>>2]=c[h+4>>2];c[d+24+8>>2]=c[h+8>>2];c[d+24+12>>2]=c[h+12>>2];n=+(e[d+6>>1]|0);m=n/(+g[d+28>>2]-+g[d+12>>2]);l=n/(+g[d+32>>2]-+g[d+16>>2]);g[d+40>>2]=n/(+g[d+24>>2]-+g[d+8>>2]);g[d+44>>2]=m;g[d+48>>2]=l;g[d+52>>2]=0.0;h=(i&65535)+1&65535;c[6995]=(c[6995]|0)+1;j=sc(h<<6|19)|0;if(!j)f=0;else{c[(j+4+15&-16)+-4>>2]=j;f=j+4+15&-16}if(h|0){j=f+(h<<6)|0;k=f;do{c[k>>2]=0;k=k+64|0}while((k|0)!=(j|0))}c[d+60>>2]=f;b[d+58>>1]=(i&65535)+1;b[d+56>>1]=0;b[d+64>>1]=1;if(h>>>0>1){j=1;k=1;do{b[f+(k<<6)+48>>1]=k+1;j=j+1<<16>>16;k=j&65535}while(k>>>0>>0)}b[f+(h+-1<<6)+48>>1]=0;c[6995]=(c[6995]|0)+1;j=sc((h<<3|3)+16|0)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}c[d+80>>2]=j;c[d+68>>2]=j;c[6995]=(c[6995]|0)+1;j=sc((h<<3|3)+16|0)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}c[d+84>>2]=j;c[d+72>>2]=j;c[6995]=(c[6995]|0)+1;j=sc((h<<3|3)+16|0)|0;if(!j){f=0;i=d+88|0;c[i>>2]=f;i=d+76|0;c[i>>2]=f;f=c[d+60>>2]|0;c[f>>2]=0;h=f+48|0;b[h>>1]=0;h=f+54|0;b[h>>1]=1;h=c[d+68>>2]|0;b[h>>1]=0;k=h+2|0;b[k>>1]=0;k=b[d+6>>1]|0;j=h+4|0;b[j>>1]=k;h=h+6|0;b[h>>1]=0;h=f+50|0;b[h>>1]=0;h=f+56|0;b[h>>1]=1;h=c[d+72>>2]|0;b[h>>1]=0;j=h+2|0;b[j>>1]=0;j=b[d+6>>1]|0;k=h+4|0;b[k>>1]=j;h=h+6|0;b[h>>1]=0;h=f+52|0;b[h>>1]=0;f=f+58|0;b[f>>1]=1;i=c[i>>2]|0;b[i>>1]=0;f=i+2|0;b[f>>1]=0;f=b[d+6>>1]|0;h=i+4|0;b[h>>1]=f;i=i+6|0;b[i>>1]=0;c[d>>2]=8864;return}c[(j+4+15&-16)+-4>>2]=j;f=j+4+15&-16;i=d+88|0;c[i>>2]=f;i=d+76|0;c[i>>2]=f;f=c[d+60>>2]|0;c[f>>2]=0;h=f+48|0;b[h>>1]=0;h=f+54|0;b[h>>1]=1;h=c[d+68>>2]|0;b[h>>1]=0;k=h+2|0;b[k>>1]=0;k=b[d+6>>1]|0;j=h+4|0;b[j>>1]=k;h=h+6|0;b[h>>1]=0;h=f+50|0;b[h>>1]=0;h=f+56|0;b[h>>1]=1;h=c[d+72>>2]|0;b[h>>1]=0;j=h+2|0;b[j>>1]=0;j=b[d+6>>1]|0;k=h+4|0;b[k>>1]=j;h=h+6|0;b[h>>1]=0;h=f+52|0;b[h>>1]=0;f=f+58|0;b[f>>1]=1;i=c[i>>2]|0;b[i>>1]=0;f=i+2|0;b[f>>1]=0;f=b[d+6>>1]|0;h=i+4|0;b[h>>1]=f;i=i+6|0;b[i>>1]=0;c[d>>2]=8864;return}function ie(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0,X=0.0,Y=0.0;W=l;l=l+240|0;f=(a[b+8>>0]|0)!=0;h=f?e:d;f=f?d:e;S=+g[h+116>>2]-+g[h+52>>2];T=+g[h+120>>2]-+g[h+56>>2];U=+g[h+124>>2]-+g[h+60>>2];V=+g[h+276>>2];if(S*S+T*T+U*U>2];I=+g[f+20>>2];J=+g[f+36>>2];K=+g[f+8>>2];L=+g[f+24>>2];M=+g[f+40>>2];N=+g[f+12>>2];O=+g[f+28>>2];P=+g[f+44>>2];j=-+g[f+52>>2];k=-+g[f+56>>2];m=-+g[f+60>>2];Q=+g[h+4>>2];R=+g[h+20>>2];S=+g[h+36>>2];T=+g[h+8>>2];U=+g[h+24>>2];V=+g[h+40>>2];p=+g[h+12>>2];q=+g[h+28>>2];r=+g[h+44>>2];w=+g[h+52>>2];v=+g[h+56>>2];u=+g[h+60>>2];s=H*j+I*k+J*m+(H*w+I*v+J*u);t=K*j+L*k+M*m+(K*w+L*v+M*u);u=N*j+O*k+P*m+(N*w+O*v+P*u);v=+g[h+68>>2];w=+g[h+84>>2];x=+g[h+100>>2];y=+g[h+72>>2];z=+g[h+88>>2];A=+g[h+104>>2];B=+g[h+76>>2];C=+g[h+92>>2];D=+g[h+108>>2];n=+g[h+116>>2];o=+g[h+120>>2];G=+g[h+124>>2];E=H*j+I*k+J*m+(H*n+I*o+J*G);F=K*j+L*k+M*m+(K*n+L*o+M*G);G=N*j+O*k+P*m+(N*n+O*o+P*G);f=c[f+192>>2]|0;if(((c[f+4>>2]|0)+-21|0)>>>0>=9){X=1.0;l=W;return +X}g[W+224>>2]=s;g[W+224+4>>2]=t;g[W+224+8>>2]=u;g[W+224+12>>2]=0.0;if(E>2]=E;i=E}else i=s;if(F>2]=F;j=F}else j=t;if(G>2]=G;k=G}else k=u;g[W+208>>2]=s;g[W+208+4>>2]=t;g[W+208+8>>2]=u;g[W+208+12>>2]=0.0;if(s>2]=E;m=E}else m=s;if(t>2]=F;n=F}else n=t;if(u>2]=G;o=G}else o=u;Y=+g[h+272>>2];g[W+224>>2]=i-Y;g[W+224+4>>2]=j-Y;g[W+224+8>>2]=k-Y;g[W+208>>2]=Y+m;g[W+208+4>>2]=Y+n;g[W+208+8>>2]=Y+o;c[W>>2]=3876;g[W+4>>2]=H*Q+I*R+J*S;g[W+8>>2]=H*T+I*U+J*V;g[W+12>>2]=H*p+I*q+J*r;g[W+16>>2]=0.0;g[W+20>>2]=K*Q+L*R+M*S;g[W+24>>2]=K*T+L*U+M*V;g[W+28>>2]=K*p+L*q+M*r;g[W+32>>2]=0.0;g[W+36>>2]=N*Q+O*R+P*S;g[W+40>>2]=N*T+O*U+P*V;g[W+44>>2]=N*p+O*q+P*r;g[W+48>>2]=0.0;g[W+52>>2]=s;g[W+56>>2]=t;g[W+60>>2]=u;g[W+64>>2]=0.0;g[W+68>>2]=H*v+I*w+J*x;g[W+72>>2]=H*y+I*z+J*A;g[W+76>>2]=H*B+I*C+J*D;g[W+80>>2]=0.0;g[W+84>>2]=K*v+L*w+M*x;g[W+88>>2]=K*y+L*z+M*A;g[W+92>>2]=K*B+L*C+M*D;g[W+96>>2]=0.0;g[W+100>>2]=N*v+O*w+P*x;g[W+104>>2]=N*y+O*z+P*A;g[W+108>>2]=N*B+O*C+P*D;g[W+112>>2]=0.0;g[W+116>>2]=E;g[W+120>>2]=F;g[W+124>>2]=G;g[W+128>>2]=0.0;g[W+196>>2]=Y;c[W+200>>2]=c[h+268>>2];if(f|0?(Vb[c[(c[f>>2]|0)+64>>2]&127](f,W,W+224|0,W+208|0),X=+g[W+200>>2],X<+g[h+268>>2]):0){g[h+268>>2]=X;Y=X;l=W;return +Y}Y=1.0;l=W;return +Y}function je(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0,X=0.0,Y=0.0;W=l;l=l+240|0;f=(a[b+76>>0]|0)!=0;h=f?e:d;f=f?d:e;S=+g[h+116>>2]-+g[h+52>>2];T=+g[h+120>>2]-+g[h+56>>2];U=+g[h+124>>2]-+g[h+60>>2];V=+g[h+276>>2];if(S*S+T*T+U*U>2];I=+g[f+20>>2];J=+g[f+36>>2];K=+g[f+8>>2];L=+g[f+24>>2];M=+g[f+40>>2];N=+g[f+12>>2];O=+g[f+28>>2];P=+g[f+44>>2];j=-+g[f+52>>2];k=-+g[f+56>>2];m=-+g[f+60>>2];Q=+g[h+4>>2];R=+g[h+20>>2];S=+g[h+36>>2];T=+g[h+8>>2];U=+g[h+24>>2];V=+g[h+40>>2];p=+g[h+12>>2];q=+g[h+28>>2];r=+g[h+44>>2];w=+g[h+52>>2];v=+g[h+56>>2];u=+g[h+60>>2];s=H*j+I*k+J*m+(H*w+I*v+J*u);t=K*j+L*k+M*m+(K*w+L*v+M*u);u=N*j+O*k+P*m+(N*w+O*v+P*u);v=+g[h+68>>2];w=+g[h+84>>2];x=+g[h+100>>2];y=+g[h+72>>2];z=+g[h+88>>2];A=+g[h+104>>2];B=+g[h+76>>2];C=+g[h+92>>2];D=+g[h+108>>2];n=+g[h+116>>2];o=+g[h+120>>2];G=+g[h+124>>2];E=H*j+I*k+J*m+(H*n+I*o+J*G);F=K*j+L*k+M*m+(K*n+L*o+M*G);G=N*j+O*k+P*m+(N*n+O*o+P*G);f=c[f+192>>2]|0;if(((c[f+4>>2]|0)+-21|0)>>>0>=9){X=1.0;l=W;return +X}g[W+224>>2]=s;g[W+224+4>>2]=t;g[W+224+8>>2]=u;g[W+224+12>>2]=0.0;if(E>2]=E;i=E}else i=s;if(F>2]=F;j=F}else j=t;if(G>2]=G;k=G}else k=u;g[W+208>>2]=s;g[W+208+4>>2]=t;g[W+208+8>>2]=u;g[W+208+12>>2]=0.0;if(s>2]=E;m=E}else m=s;if(t>2]=F;n=F}else n=t;if(u>2]=G;o=G}else o=u;Y=+g[h+272>>2];g[W+224>>2]=i-Y;g[W+224+4>>2]=j-Y;g[W+224+8>>2]=k-Y;g[W+208>>2]=Y+m;g[W+208+4>>2]=Y+n;g[W+208+8>>2]=Y+o;c[W>>2]=5848;g[W+4>>2]=H*Q+I*R+J*S;g[W+8>>2]=H*T+I*U+J*V;g[W+12>>2]=H*p+I*q+J*r;g[W+16>>2]=0.0;g[W+20>>2]=K*Q+L*R+M*S;g[W+24>>2]=K*T+L*U+M*V;g[W+28>>2]=K*p+L*q+M*r;g[W+32>>2]=0.0;g[W+36>>2]=N*Q+O*R+P*S;g[W+40>>2]=N*T+O*U+P*V;g[W+44>>2]=N*p+O*q+P*r;g[W+48>>2]=0.0;g[W+52>>2]=s;g[W+56>>2]=t;g[W+60>>2]=u;g[W+64>>2]=0.0;g[W+68>>2]=H*v+I*w+J*x;g[W+72>>2]=H*y+I*z+J*A;g[W+76>>2]=H*B+I*C+J*D;g[W+80>>2]=0.0;g[W+84>>2]=K*v+L*w+M*x;g[W+88>>2]=K*y+L*z+M*A;g[W+92>>2]=K*B+L*C+M*D;g[W+96>>2]=0.0;g[W+100>>2]=N*v+O*w+P*x;g[W+104>>2]=N*y+O*z+P*A;g[W+108>>2]=N*B+O*C+P*D;g[W+112>>2]=0.0;g[W+116>>2]=E;g[W+120>>2]=F;g[W+124>>2]=G;g[W+128>>2]=0.0;g[W+196>>2]=Y;c[W+200>>2]=c[h+268>>2];if(f|0?(Vb[c[(c[f>>2]|0)+64>>2]&127](f,W,W+224|0,W+208|0),X=+g[W+200>>2],X<+g[h+268>>2]):0){g[h+268>>2]=X;Y=X;l=W;return +Y}Y=1.0;l=W;return +Y}function ke(d,e,f,h){d=d|0;e=e|0;f=f|0;h=h|0;var i=0,k=0,l=0,m=0.0,n=0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0;p=+g[e>>2];i=(g[j>>2]=p,c[j>>2]|0);u=p<999999984306749440.0?i:1566444395;m=+g[e+4>>2];l=(g[j>>2]=m,c[j>>2]|0);v=m<999999984306749440.0?l:1566444395;y=+g[e+8>>2];o=(g[j>>2]=y,c[j>>2]|0);w=y<999999984306749440.0?o:1566444395;i=p>-999999984306749440.0?i:-581039253;l=m>-999999984306749440.0?l:-581039253;o=y>-999999984306749440.0?o:-581039253;y=+g[e+16>>2];t=y<(c[j>>2]=u,+g[j>>2]);k=(g[j>>2]=y,c[j>>2]|0);u=t?k:u;m=+g[e+20>>2];t=m<(c[j>>2]=v,+g[j>>2]);n=(g[j>>2]=m,c[j>>2]|0);v=t?n:v;p=+g[e+24>>2];t=p<(c[j>>2]=w,+g[j>>2]);q=(g[j>>2]=p,c[j>>2]|0);w=t?q:w;k=(c[j>>2]=i,+g[j>>2])>2]=l,+g[j>>2])>2]=o,+g[j>>2])>2];q=y<(c[j>>2]=u,+g[j>>2]);r=(g[j>>2]=y,c[j>>2]|0);m=+g[e+36>>2];s=m<(c[j>>2]=v,+g[j>>2]);t=(g[j>>2]=m,c[j>>2]|0);p=+g[e+40>>2];l=p<(c[j>>2]=w,+g[j>>2]);n=(g[j>>2]=p,c[j>>2]|0);k=(c[j>>2]=k,+g[j>>2])>2]=i,+g[j>>2])>2]=o,+g[j>>2])>2]=k,+g[j>>2]);H=(c[j>>2]=q?r:u,+g[j>>2]);C=(c[j>>2]=i,+g[j>>2]);D=(c[j>>2]=s?t:v,+g[j>>2]);m=(c[j>>2]=o,+g[j>>2]);z=(c[j>>2]=l?n:w,+g[j>>2]);o=c[d+8>>2]|0;F=+g[o+4>>2];B=+g[o+8>>2];p=+g[o+12>>2];E=+g[o+36>>2];A=+g[o+40>>2];y=+g[o+44>>2];o=~~(((G-H<2.0000000949949026e-03?H+-1.0000000474974513e-03:H)-F)*E)&65535&-2;q=~~(((C-D<2.0000000949949026e-03?D+-1.0000000474974513e-03:D)-B)*A)&65535&-2;r=~~(((m-z<2.0000000949949026e-03?z+-1.0000000474974513e-03:z)-p)*y)&65535&-2;s=~~(((G-H<2.0000000949949026e-03?G+1.0000000474974513e-03:G)-F)*E+1.0)&65535|1;t=~~(((C-D<2.0000000949949026e-03?C+1.0000000474974513e-03:C)-B)*A+1.0)&65535|1;e=~~(((m-z<2.0000000949949026e-03?m+1.0000000474974513e-03:m)-p)*y+1.0)&65535|1;n=c[d+4>>2]|0;i=c[n+4>>2]|0;if((i|0)==(c[n+8>>2]|0)?(x=i|0?i<<1:1,(i|0)<(x|0)):0){if(!x)l=0;else{c[6995]=(c[6995]|0)+1;i=sc((x<<4|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}l=i;i=c[n+4>>2]|0}if((i|0)>0){k=0;do{d=l+(k<<4)|0;w=(c[n+12>>2]|0)+(k<<4)|0;c[d>>2]=c[w>>2];c[d+4>>2]=c[w+4>>2];c[d+8>>2]=c[w+8>>2];c[d+12>>2]=c[w+12>>2];k=k+1|0}while((k|0)!=(i|0))}i=c[n+12>>2]|0;if(i|0){if(a[n+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[n+12>>2]=0}a[n+16>>0]=1;c[n+12>>2]=l;c[n+8>>2]=x;i=c[n+4>>2]|0}x=c[n+12>>2]|0;b[x+(i<<4)>>1]=o;b[x+(i<<4)+2>>1]=q;b[x+(i<<4)+4>>1]=r;b[x+(i<<4)+6>>1]=s;b[x+(i<<4)+8>>1]=t;b[x+(i<<4)+10>>1]=e;c[x+(i<<4)+12>>2]=f<<21|h;c[n+4>>2]=(c[n+4>>2]|0)+1;return}function le(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+336|0;h=c[d+36>>2]|0;c[n+272+4>>2]=35;c[n+272+8>>2]=0;c[n+272+12>>2]=-1;c[n+272+16>>2]=1065353216;c[n+272+20>>2]=1065353216;c[n+272+24>>2]=1065353216;g[n+272+28>>2]=0.0;c[n+272>>2]=3644;c[n+272+56>>2]=h;g[n+272+48>>2]=0.0;k=c[b+28>>2]|0;d=c[k+4>>2]|0;if(c[(c[k+8>>2]|0)+204>>2]&3|0?a[h+376>>0]|0:0){l=n;return}if((a[22384]|0)==0?Uz(22384)|0:0){if((a[22392]|0)==0?Uz(22392)|0:0){c[5698]=1065353216;c[5699]=0;c[5700]=0;c[5701]=0;c[5702]=0;c[5703]=1065353216;c[5704]=0;c[5705]=0;c[5706]=0;c[5707]=0;c[5708]=1065353216;g[5709]=0.0}c[5682]=c[5698];c[5683]=c[5699];c[5684]=c[5700];c[5685]=c[5701];c[5686]=c[5702];c[5687]=c[5703];c[5688]=c[5704];c[5689]=c[5705];c[5690]=c[5706];c[5691]=c[5707];c[5692]=c[5708];c[5693]=c[5709];c[5694]=0;c[5695]=0;c[5696]=0;c[5697]=0}e=c[(c[b+28>>2]|0)+12>>2]|0;c[n>>2]=1065353216;c[n+4>>2]=0;c[n+8>>2]=0;g[n+12>>2]=0.0;if(!(!(Gd(n+272|0,22728,d,e,n,n+216|0)|0)?!(Hc(n+272|0,22728,d,e,n,n+216|0,0)|0):0))i=12;if((i|0)==12?(c[n+4>>2]=0,c[n+4+4>>2]=0,c[n+4+8>>2]=0,c[n+4+12>>2]=0,c[n+4+16>>2]=0,c[n+4+20>>2]=0,a[n+152>>0]=0,c[n>>2]=3432,k=c[(c[b+28>>2]|0)+8>>2]|0,zd(b,n+216|0,h,0,0,0,(c[k+252>>2]&2|0)==0?0:k,k,n)|0):0){c[6995]=(c[6995]|0)+1;d=sc(235)|0;if(!d)k=0;else{c[(d+4+15&-16)+-4>>2]=d;k=d+4+15&-16}e=k+4|0;d=k+152|0;Yk(e|0,0,212)|0;c[k>>2]=3432;h=n+4|0;i=e+100|0;do{c[e>>2]=c[h>>2];e=e+4|0;h=h+4|0}while((e|0)<(i|0));e=k+104|0;c[e>>2]=c[n+104>>2];c[e+4>>2]=c[n+104+4>>2];c[e+8>>2]=c[n+104+8>>2];c[e+12>>2]=c[n+104+12>>2];e=k+120|0;c[e>>2]=c[n+120>>2];c[e+4>>2]=c[n+120+4>>2];c[e+8>>2]=c[n+120+8>>2];c[e+12>>2]=c[n+120+12>>2];e=k+136|0;c[e>>2]=c[n+136>>2];c[e+4>>2]=c[n+136+4>>2];c[e+8>>2]=c[n+136+8>>2];c[e+12>>2]=c[n+136+12>>2];a[d>>0]=a[n+152>>0]|0;e=k+156|0;h=n+156|0;i=e+60|0;do{c[e>>2]=c[h>>2];e=e+4|0;h=h+4|0}while((e|0)<(i|0));i=c[b+24>>2]|0;j=k;d=c[i+912>>2]|0;if((d|0)==(c[i+916>>2]|0)?(m=d|0?d<<1:1,(d|0)<(m|0)):0){if(!m)h=0;else{c[6995]=(c[6995]|0)+1;d=sc((m<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}h=d;d=c[i+912>>2]|0}if((d|0)>0){e=0;do{c[h+(e<<2)>>2]=c[(c[i+920>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(d|0))}e=c[i+920>>2]|0;if(e){if(a[i+924>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[i+912>>2]|0}c[i+920>>2]=0}a[i+924>>0]=1;c[i+920>>2]=h;c[i+916>>2]=m}c[(c[i+920>>2]|0)+(d<<2)>>2]=j;c[i+912>>2]=d+1;d=c[b+24>>2]|0;e=k+64|0;f=+g[e>>2];if(!(c[(c[(c[b+28>>2]|0)+8>>2]|0)+204>>2]&3)){g[e>>2]=f*+g[d+400>>2];d=d+412|0}else{g[e>>2]=f*+g[d+404>>2];d=d+416|0}b=k+68|0;g[b>>2]=+g[d>>2]*+g[b>>2]}l=n;return}function me(a,b,d){a=a|0;b=b|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;l=c[b>>2]|0;m=c[b+4>>2]|0;i=c[b+8>>2]|0;n=c[a+4>>2]|0;p=Lh(a,d,m,i)|0;c[p+12>>2]=c[b+12>>2];c[p+16>>2]=n+1;c[p+20>>2]=n+2;h=c[(c[a+12>>2]|0)+(c[b+12>>2]<<2)>>2]|0;e=c[h>>2]|0;f=c[h+4>>2]|0;do if(!((e|0)==(m|0)&(f|0)==(i|0))){if((e|0)==(i|0)?(f|0)==(m|0):0){e=h+12+8|0;break}g=c[h+8>>2]|0;if(!((f|0)==(m|0)&(g|0)==(i|0)))if(!((f|0)==(i|0)&(g|0)==(m|0)))if((g|0)!=(m|0)|(e|0)==(i|0)^1){if((g|0)==(i|0)?(e|0)==(m|0):0){e=h+12+4|0;break}e=9772}else{e=1;o=2}else e=h+12|0;else{e=0;o=2}}else{e=2;o=2}while(0);if((o|0)==2)e=h+12+(e<<2)|0;c[e>>2]=n;k=Lh(a,d,i,l)|0;c[k+12>>2]=c[b+12+4>>2];c[k+16>>2]=n+2;c[k+20>>2]=n;h=c[(c[a+12>>2]|0)+(c[b+12+4>>2]<<2)>>2]|0;e=c[h>>2]|0;f=c[h+4>>2]|0;do if(!((e|0)==(i|0)&(f|0)==(l|0))){if((e|0)==(l|0)?(f|0)==(i|0):0){e=h+12+8|0;break}g=c[h+8>>2]|0;if(!((f|0)==(i|0)&(g|0)==(l|0)))if(!((f|0)==(l|0)&(g|0)==(i|0)))if((g|0)!=(i|0)|(e|0)==(l|0)^1){if((g|0)==(l|0)?(e|0)==(i|0):0){e=h+12+4|0;break}e=9772}else{e=1;o=12}else e=h+12|0;else{e=0;o=12}}else{e=2;o=12}while(0);if((o|0)==12)e=h+12+(e<<2)|0;c[e>>2]=n+1;j=Lh(a,d,l,m)|0;c[j+12>>2]=c[b+12+8>>2];c[j+16>>2]=n;c[j+20>>2]=n+1;e=c[a+12>>2]|0;i=c[e+(c[b+12+8>>2]<<2)>>2]|0;f=c[i>>2]|0;g=c[i+4>>2]|0;do if(!((f|0)==(l|0)&(g|0)==(m|0))){if((f|0)==(m|0)?(g|0)==(l|0):0){f=i+12+8|0;break}h=c[i+8>>2]|0;if(!((g|0)==(l|0)&(h|0)==(m|0)))if(!((g|0)==(m|0)&(h|0)==(l|0)))if((h|0)!=(l|0)|(f|0)==(m|0)^1){if((h|0)==(m|0)?(f|0)==(l|0):0){f=i+12+4|0;break}f=9772}else{f=1;o=22}else f=i+12|0;else{f=0;o=22}}else{f=2;o=22}while(0);if((o|0)==22)f=i+12+(f<<2)|0;c[f>>2]=n+2;f=c[e+(c[p+12>>2]<<2)>>2]|0;if(!(((c[f>>2]|0)!=(d|0)?(c[f+4>>2]|0)!=(d|0):0)?(c[f+8>>2]|0)!=(d|0):0)){pe(e,p,f);c[(c[a+12>>2]|0)+(c[p+24>>2]<<2)>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0);c[(c[a+12>>2]|0)+(c[f+24>>2]<<2)>>2]=0;if(f|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}e=c[a+12>>2]|0}f=c[e+(c[k+12>>2]<<2)>>2]|0;if(!(((c[f>>2]|0)!=(d|0)?(c[f+4>>2]|0)!=(d|0):0)?(c[f+8>>2]|0)!=(d|0):0)){pe(e,k,f);c[(c[a+12>>2]|0)+(c[k+24>>2]<<2)>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);c[(c[a+12>>2]|0)+(c[f+24>>2]<<2)>>2]=0;if(f|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}e=c[a+12>>2]|0}f=c[e+(c[j+12>>2]<<2)>>2]|0;if(!(((c[f>>2]|0)!=(d|0)?(c[f+4>>2]|0)!=(d|0):0)?(c[f+8>>2]|0)!=(d|0):0)){pe(e,j,f);c[(c[a+12>>2]|0)+(c[j+24>>2]<<2)>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);c[(c[a+12>>2]|0)+(c[f+24>>2]<<2)>>2]=0;if(f|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}e=c[a+12>>2]|0}c[e+(c[b+24>>2]<<2)>>2]=0;if(!b)return;c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function ne(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if(!((d|0)!=0&(e|0)!=0))return;if((c[b+24>>2]|0)<128?(c[b+28>>2]|0)<128:0){c[6995]=(c[6995]|0)+1;h=sc(1043)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}i=c[b+24>>2]|0;if((i|0)>0){h=0;do{k=(c[b+32>>2]|0)+(h<<3)|0;l=c[k+4>>2]|0;m=j+(h<<3)|0;c[m>>2]=c[k>>2];c[m+4>>2]=l;h=h+1|0}while((h|0)!=(i|0))}h=c[b+32>>2]|0;if(h|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=j;c[b+28>>2]=128}c[b+24>>2]=128;h=c[b+32>>2]|0;c[h>>2]=d;c[h+4>>2]=e;h=1;i=124;do{m=h+-1|0;j=c[b+32>>2]|0;k=c[j+(m<<3)>>2]|0;l=c[j+(m<<3)+4>>2]|0;if((m|0)>(i|0)){e=c[b+24>>2]|0;if((e|0)<(e<<1|0)?(c[b+28>>2]|0)<(e<<1|0):0){if(e){c[6995]=(c[6995]|0)+1;i=sc((e<<4|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}d=c[b+24>>2]|0;if((d|0)>0){j=0;do{p=(c[b+32>>2]|0)+(j<<3)|0;o=c[p+4>>2]|0;n=i+(j<<3)|0;c[n>>2]=c[p>>2];c[n+4>>2]=o;j=j+1|0}while((j|0)!=(d|0))}}else i=0;j=c[b+32>>2]|0;if(j|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=i;c[b+28>>2]=e<<1;j=i}c[b+24>>2]=e<<1;i=(e<<1)+-4|0}do if((k|0)==(l|0))if(!(c[k+40>>2]|0))h=m;else{o=c[k+36>>2]|0;c[j+(m<<3)>>2]=o;c[j+(m<<3)+4>>2]=o;o=c[k+40>>2]|0;p=h+1|0;n=c[b+32>>2]|0;c[n+(h<<3)>>2]=o;c[n+(h<<3)+4>>2]=o;n=c[k+40>>2]|0;o=c[b+32>>2]|0;c[o+(p<<3)>>2]=c[k+36>>2];c[o+(p<<3)+4>>2]=n;h=h+2|0}else if(((((+g[k>>2]<=+g[l+16>>2]?+g[k+16>>2]>=+g[l>>2]:0)?+g[k+4>>2]<=+g[l+20>>2]:0)?+g[k+20>>2]>=+g[l+4>>2]:0)?+g[k+8>>2]<=+g[l+24>>2]:0)?+g[k+24>>2]>=+g[l+8>>2]:0){d=(c[l+40>>2]|0)!=0;if(!(c[k+40>>2]|0))if(d){o=c[l+36>>2]|0;c[j+(m<<3)>>2]=k;c[j+(m<<3)+4>>2]=o;o=c[l+40>>2]|0;p=c[b+32>>2]|0;c[p+(h<<3)>>2]=k;c[p+(h<<3)+4>>2]=o;h=h+1|0;break}else{Sb[c[(c[f>>2]|0)+8>>2]&127](f,k,l);h=m;break}else{e=c[k+36>>2]|0;if(d){p=c[l+36>>2]|0;c[j+(m<<3)>>2]=e;c[j+(m<<3)+4>>2]=p;p=c[l+36>>2]|0;n=h+1|0;m=c[b+32>>2]|0;c[m+(h<<3)>>2]=c[k+40>>2];c[m+(h<<3)+4>>2]=p;m=c[l+40>>2]|0;p=h+2|0;o=c[b+32>>2]|0;c[o+(n<<3)>>2]=c[k+36>>2];c[o+(n<<3)+4>>2]=m;n=c[l+40>>2]|0;o=c[b+32>>2]|0;c[o+(p<<3)>>2]=c[k+40>>2];c[o+(p<<3)+4>>2]=n;h=h+3|0;break}else{c[j+(m<<3)>>2]=e;c[j+(m<<3)+4>>2]=l;p=c[b+32>>2]|0;c[p+(h<<3)>>2]=c[k+40>>2];c[p+(h<<3)+4>>2]=l;h=h+1|0;break}}}else h=m;while(0)}while((h|0)!=0);return}function oe(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0;h=l;l=l+16|0;f=lt()|0;if((a[22480]|0)==0?Uz(22480)|0:0){c[h>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;ef(23152,0.0,0,0,h)}c[5839]=c[5839]|1;g[5889]=0.0;x=+g[5899]*0.0;D=+g[5900]*0.0;g[5894]=+g[5898]*0.0;g[5895]=x;g[5896]=D;g[5897]=0.0;c[5902]=0;c[5903]=0;c[5904]=0;c[5905]=0;D=+g[5891]*0.0;x=+g[5892]*0.0;g[5943]=+g[5890]*0.0;g[5944]=D;g[5945]=x;g[5946]=0.0;c[f+4>>2]=7;c[f+8>>2]=-1;c[f+12>>2]=-1;g[f+16>>2]=3402823466385288598117041.0e14;a[f+20>>0]=1;a[f+21>>0]=0;c[f+24>>2]=-1;c[f+28>>2]=23152;c[f+32>>2]=b;g[f+36>>2]=0.0;g[f+40>>2]=.05000000074505806;c[f+44>>2]=0;c[f>>2]=4884;a[f+48>>0]=0;c[f+116>>2]=c[d>>2];c[f+116+4>>2]=c[d+4>>2];c[f+116+8>>2]=c[d+8>>2];c[f+116+12>>2]=c[d+12>>2];c[f+132>>2]=c[d+16>>2];c[f+132+4>>2]=c[d+16+4>>2];c[f+132+8>>2]=c[d+16+8>>2];c[f+132+12>>2]=c[d+16+12>>2];c[f+148>>2]=c[d+32>>2];c[f+148+4>>2]=c[d+32+4>>2];c[f+148+8>>2]=c[d+32+8>>2];c[f+148+12>>2]=c[d+32+12>>2];c[f+164>>2]=c[d+48>>2];c[f+164+4>>2]=c[d+48+4>>2];c[f+164+8>>2]=c[d+48+8>>2];c[f+164+12>>2]=c[d+48+12>>2];a[f+180>>0]=e&1;x=+g[f+116>>2];D=+g[b+4>>2];w=+g[f+132>>2];C=+g[b+8>>2];v=+g[f+148>>2];B=+g[b+12>>2];u=+g[f+120>>2];t=+g[f+136>>2];s=+g[f+152>>2];r=+g[f+124>>2];p=+g[f+140>>2];n=+g[f+156>>2];A=+g[b+20>>2];z=+g[b+24>>2];y=+g[b+28>>2];q=+g[b+36>>2];o=+g[b+40>>2];m=+g[b+44>>2];F=+g[f+164>>2];E=+g[f+168>>2];i=+g[f+172>>2];k=+g[b+52>>2]+(D*F+C*E+B*i);j=A*F+z*E+y*i+ +g[b+56>>2];i=q*F+o*E+m*i+ +g[b+60>>2];g[f+52>>2]=x*D+w*C+v*B;g[f+56>>2]=D*u+C*t+B*s;g[f+60>>2]=D*r+C*p+B*n;g[f+64>>2]=0.0;g[f+68>>2]=x*A+w*z+v*y;g[f+72>>2]=u*A+t*z+s*y;g[f+76>>2]=r*A+p*z+n*y;g[f+80>>2]=0.0;g[f+84>>2]=x*q+w*o+v*m;g[f+88>>2]=u*q+t*o+s*m;g[f+92>>2]=r*q+p*o+n*m;g[f+96>>2]=0.0;g[f+100>>2]=k;g[f+104>>2]=j;g[f+108>>2]=i;g[f+112>>2]=0.0;g[f+184>>2]=1.0;g[f+188>>2]=-1.0;g[f+192>>2]=0.0;g[f+196>>2]=0.0;g[f+200>>2]=1.0;g[f+204>>2]=.699999988079071;g[f+208>>2]=0.0;g[f+212>>2]=0.0;g[f+216>>2]=1.0;g[f+220>>2]=.699999988079071;g[f+224>>2]=0.0;g[f+228>>2]=0.0;g[f+264>>2]=1.0;g[f+268>>2]=.699999988079071;g[f+272>>2]=1.0;g[f+276>>2]=0.0;g[f+280>>2]=1.0;g[f+284>>2]=.699999988079071;g[f+288>>2]=1.0;g[f+292>>2]=0.0;g[f+232>>2]=1.0;g[f+236>>2]=.699999988079071;g[f+240>>2]=1.0;g[f+244>>2]=0.0;g[f+248>>2]=1.0;g[f+252>>2]=.699999988079071;g[f+256>>2]=1.0;g[f+260>>2]=0.0;a[f+1096>>0]=0;g[f+1116>>2]=0.0;g[f+1120>>2]=0.0;g[f+1124>>2]=0.0;c[f+300>>2]=0;c[f+1100>>2]=0;c[f+1100+4>>2]=0;c[f+1100+8>>2]=0;a[f+1100+12>>0]=0;a[f+49>>0]=1;Zc(f,(c[f+28>>2]|0)+4|0,(c[f+32>>2]|0)+4|0);l=h;return f|0}function pe(a,b,d){a=a|0;b=b|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;l=0;do{k=l;l=l+1|0;m=(l|0)==3;j=c[b+((m?0:l)<<2)>>2]|0;k=c[b+(((k+2|0)%3|0)<<2)>>2]|0;e=c[d>>2]|0;f=c[d+4>>2]|0;if(!((e|0)==(k|0)&(f|0)==(j|0)))if(!((e|0)==(j|0)&(f|0)==(k|0))){g=c[d+8>>2]|0;if(!((f|0)==(k|0)&(g|0)==(j|0)))if(!((f|0)==(j|0)&(g|0)==(k|0)))if((g|0)!=(k|0)|(e|0)==(j|0)^1)e=(g|0)!=(j|0)|(e|0)==(k|0)^1?9772:d+12+4|0;else{e=1;n=3}else e=d+12|0;else{e=0;n=3}}else e=d+12+8|0;else{e=2;n=3}if((n|0)==3){n=0;e=d+12+(e<<2)|0}i=c[e>>2]|0;e=c[b>>2]|0;f=c[b+4>>2]|0;if(!((e|0)==(j|0)&(f|0)==(k|0)))if(!((e|0)==(k|0)&(f|0)==(j|0))){g=c[b+8>>2]|0;if(!((f|0)==(j|0)&(g|0)==(k|0)))if(!((f|0)==(k|0)&(g|0)==(j|0)))if((g|0)!=(j|0)|(e|0)==(k|0)^1)e=(g|0)!=(k|0)|(e|0)==(j|0)^1?9772:b+12+4|0;else{e=1;n=10}else e=b+12|0;else{e=0;n=10}}else e=b+12+8|0;else{e=2;n=10}if((n|0)==10){n=0;e=b+12+(e<<2)|0}h=c[a+(c[e>>2]<<2)>>2]|0;e=c[h>>2]|0;f=c[h+4>>2]|0;do if(!((e|0)==(k|0)&(f|0)==(j|0))){if((e|0)==(j|0)?(f|0)==(k|0):0){e=h+12+8|0;break}g=c[h+8>>2]|0;if(!((f|0)==(k|0)&(g|0)==(j|0)))if(!((f|0)==(j|0)&(g|0)==(k|0)))if((g|0)!=(k|0)|(e|0)==(j|0)^1){if((g|0)==(j|0)?(e|0)==(k|0):0){e=h+12+4|0;break}e=9772}else{e=1;n=17}else e=h+12|0;else{e=0;n=17}}else{e=2;n=17}while(0);if((n|0)==17){n=0;e=h+12+(e<<2)|0}c[e>>2]=i;e=c[b>>2]|0;f=c[b+4>>2]|0;if(!((e|0)==(j|0)&(f|0)==(k|0)))if(!((e|0)==(k|0)&(f|0)==(j|0))){g=c[b+8>>2]|0;if(!((f|0)==(j|0)&(g|0)==(k|0)))if(!((f|0)==(k|0)&(g|0)==(j|0)))if((g|0)!=(j|0)|(e|0)==(k|0)^1)e=(g|0)!=(k|0)|(e|0)==(j|0)^1?9772:b+12+4|0;else{e=1;n=27}else e=b+12|0;else{e=0;n=27}}else e=b+12+8|0;else{e=2;n=27}if((n|0)==27){n=0;e=b+12+(e<<2)|0}i=c[e>>2]|0;e=c[d>>2]|0;f=c[d+4>>2]|0;if(!((e|0)==(k|0)&(f|0)==(j|0)))if(!((e|0)==(j|0)&(f|0)==(k|0))){g=c[d+8>>2]|0;if(!((f|0)==(k|0)&(g|0)==(j|0)))if(!((f|0)==(j|0)&(g|0)==(k|0)))if((g|0)!=(k|0)|(e|0)==(j|0)^1)e=(g|0)!=(j|0)|(e|0)==(k|0)^1?9772:d+12+4|0;else{e=1;n=34}else e=d+12|0;else{e=0;n=34}}else e=d+12+8|0;else{e=2;n=34}if((n|0)==34){n=0;e=d+12+(e<<2)|0}h=c[a+(c[e>>2]<<2)>>2]|0;e=c[h>>2]|0;f=c[h+4>>2]|0;do if(!((e|0)==(j|0)&(f|0)==(k|0))){if((e|0)==(k|0)?(f|0)==(j|0):0){e=h+12+8|0;break}g=c[h+8>>2]|0;if(!((f|0)==(j|0)&(g|0)==(k|0)))if(!((f|0)==(k|0)&(g|0)==(j|0)))if((g|0)!=(j|0)|(e|0)==(k|0)^1){if((g|0)==(k|0)?(e|0)==(j|0):0){e=h+12+4|0;break}e=9772}else{e=1;n=41}else e=h+12|0;else{e=0;n=41}}else{e=2;n=41}while(0);if((n|0)==41){n=0;e=h+12+(e<<2)|0}c[e>>2]=i}while(!m);return}function qe(b){b=b|0;var d=0,e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0.0,w=0.0,x=0;u=l;l=l+176|0;if(!(a[b+527>>0]|0)){l=u;return}g[b+36>>2]=0.0;g[b+520>>2]=0.0;g[b+516>>2]=0.0;c[b+576>>2]=0;c[b+576+4>>2]=0;c[b+576+8>>2]=0;c[b+576+12>>2]=0;if(!(a[b+524>>0]|0)){d=c[b+28>>2]|0;j=+g[b+348>>2];k=+g[b+352>>2];q=+g[b+356>>2];s=j*+g[d+20>>2]+k*+g[d+24>>2]+q*+g[d+28>>2]+ +g[d+56>>2];e=c[b+32>>2]|0;m=+g[b+412>>2];n=+g[b+416>>2];r=+g[b+420>>2];t=m*+g[e+20>>2]+n*+g[e+24>>2]+r*+g[e+28>>2]+ +g[e+56>>2];o=m*+g[e+36>>2]+n*+g[e+40>>2]+r*+g[e+44>>2]+ +g[e+60>>2];p=j*+g[d+4>>2]+k*+g[d+8>>2]+q*+g[d+12>>2]+ +g[d+52>>2];q=j*+g[d+36>>2]+k*+g[d+40>>2]+q*+g[d+44>>2]+ +g[d+60>>2];r=m*+g[e+4>>2]+n*+g[e+8>>2]+r*+g[e+12>>2]+ +g[e+52>>2];if((r-p)*(r-p)+(t-s)*(t-s)+(o-q)*(o-q)>1.1920928955078125e-07){h=1.0/+D(+((r-p)*(r-p)+(t-s)*(t-s)+(o-q)*(o-q)));g[u+128>>2]=(r-p)*h;g[u+128+4>>2]=(t-s)*h;g[u+128+8>>2]=(o-q)*h;c[u+128+12>>2]=0;m=(o-q)*h;f=(t-s)*h;h=(r-p)*h}else{c[u+128>>2]=1065353216;c[u+128+4>>2]=0;c[u+128+8>>2]=0;g[u+128+12>>2]=0.0;m=0.0;f=0.0;h=1.0}if(+C(+m)>.7071067690849304){w=m*m+f*f;v=1.0/+D(+w);j=-(v*m);m=v*f;n=-(m*h);i=h*j;k=0.0;f=w*v;h=m}else{j=h*h+f*f;i=1.0/+D(+j);k=-(f*i);f=i*h;n=m*k;i=j*i;j=f;f=-(f*m);h=0.0}g[u+128+16>>2]=k;g[u+128+20>>2]=j;g[u+128+24>>2]=h;g[u+128+32>>2]=f;g[u+128+36>>2]=n;g[u+128+40>>2]=i;d=0;while(1){x=c[b+28>>2]|0;c[u+80>>2]=c[x+4>>2];c[u+80+4>>2]=c[x+20>>2];c[u+80+8>>2]=c[x+36>>2];g[u+80+12>>2]=0.0;c[u+80+16>>2]=c[x+8>>2];c[u+80+20>>2]=c[x+24>>2];c[u+80+24>>2]=c[x+40>>2];g[u+80+28>>2]=0.0;c[u+80+32>>2]=c[x+12>>2];c[u+80+36>>2]=c[x+28>>2];c[u+80+40>>2]=c[x+44>>2];g[u+80+44>>2]=0.0;c[u+32>>2]=c[e+4>>2];c[u+32+4>>2]=c[e+20>>2];c[u+32+8>>2]=c[e+36>>2];g[u+32+12>>2]=0.0;c[u+32+16>>2]=c[e+8>>2];c[u+32+20>>2]=c[e+24>>2];c[u+32+24>>2]=c[e+40>>2];g[u+32+28>>2]=0.0;c[u+32+32>>2]=c[e+12>>2];c[u+32+36>>2]=c[e+28>>2];c[u+32+40>>2]=c[e+44>>2];g[u+32+44>>2]=0.0;w=s-+g[x+56>>2];v=q-+g[x+60>>2];g[u+16>>2]=p-+g[x+52>>2];g[u+16+4>>2]=w;g[u+16+8>>2]=v;g[u+16+12>>2]=0.0;v=t-+g[e+56>>2];w=o-+g[e+60>>2];g[u>>2]=r-+g[e+52>>2];g[u+4>>2]=v;g[u+8>>2]=w;g[u+12>>2]=0.0;x=c[b+28>>2]|0;e=c[b+32>>2]|0;Rg(b+48+(d*84|0)|0,u+80|0,u+32|0,u+16|0,u,u+128+(d<<4)|0,x+456|0,+g[x+404>>2],e+456|0,+g[e+404>>2]);d=d+1|0;if((d|0)==3)break;e=c[b+32>>2]|0}d=b+32|0}else d=b+32|0;e=c[b+28>>2]|0;x=c[d>>2]|0;xc(b,e+4|0,x+4|0,e+324|0,x+324|0);l=u;return}function re(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=l;l=l+80|0;c[a+72>>2]=(c[a+72>>2]|0)+1;f=c[a+68>>2]|0;if(f|0){d=c[(c[a+28>>2]|0)+(b*80|0)+76>>2]|0;Ag(f,d)|0;e=c[f+4>>2]|0;if(e|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[f+4>>2]=d;c[f+12>>2]=(c[f+12>>2]|0)+-1}f=(c[a+20>>2]|0)+-1|0;e=c[a+28>>2]|0;c[g>>2]=c[e+(b*80|0)>>2];c[g+4>>2]=c[e+(b*80|0)+4>>2];c[g+8>>2]=c[e+(b*80|0)+8>>2];c[g+12>>2]=c[e+(b*80|0)+12>>2];c[g+16>>2]=c[e+(b*80|0)+16>>2];c[g+16+4>>2]=c[e+(b*80|0)+16+4>>2];c[g+16+8>>2]=c[e+(b*80|0)+16+8>>2];c[g+16+12>>2]=c[e+(b*80|0)+16+12>>2];c[g+32>>2]=c[e+(b*80|0)+32>>2];c[g+32+4>>2]=c[e+(b*80|0)+32+4>>2];c[g+32+8>>2]=c[e+(b*80|0)+32+8>>2];c[g+32+12>>2]=c[e+(b*80|0)+32+12>>2];c[g+48>>2]=c[e+(b*80|0)+48>>2];c[g+48+4>>2]=c[e+(b*80|0)+48+4>>2];c[g+48+8>>2]=c[e+(b*80|0)+48+8>>2];c[g+48+12>>2]=c[e+(b*80|0)+48+12>>2];c[g+64>>2]=c[e+(b*80|0)+64>>2];c[g+64+4>>2]=c[e+(b*80|0)+64+4>>2];c[g+64+8>>2]=c[e+(b*80|0)+64+8>>2];c[g+64+12>>2]=c[e+(b*80|0)+64+12>>2];c[e+(b*80|0)>>2]=c[e+(f*80|0)>>2];c[e+(b*80|0)+4>>2]=c[e+(f*80|0)+4>>2];c[e+(b*80|0)+8>>2]=c[e+(f*80|0)+8>>2];c[e+(b*80|0)+12>>2]=c[e+(f*80|0)+12>>2];c[e+(b*80|0)+16>>2]=c[e+(f*80|0)+16>>2];c[e+(b*80|0)+16+4>>2]=c[e+(f*80|0)+16+4>>2];c[e+(b*80|0)+16+8>>2]=c[e+(f*80|0)+16+8>>2];c[e+(b*80|0)+16+12>>2]=c[e+(f*80|0)+16+12>>2];c[e+(b*80|0)+32>>2]=c[e+(f*80|0)+32>>2];c[e+(b*80|0)+32+4>>2]=c[e+(f*80|0)+32+4>>2];c[e+(b*80|0)+32+8>>2]=c[e+(f*80|0)+32+8>>2];c[e+(b*80|0)+32+12>>2]=c[e+(f*80|0)+32+12>>2];c[e+(b*80|0)+48>>2]=c[e+(f*80|0)+48>>2];c[e+(b*80|0)+48+4>>2]=c[e+(f*80|0)+48+4>>2];c[e+(b*80|0)+48+8>>2]=c[e+(f*80|0)+48+8>>2];c[e+(b*80|0)+48+12>>2]=c[e+(f*80|0)+48+12>>2];c[e+(b*80|0)+64>>2]=c[e+(f*80|0)+64>>2];c[e+(b*80|0)+64+4>>2]=c[e+(f*80|0)+64+4>>2];c[e+(b*80|0)+64+8>>2]=c[e+(f*80|0)+64+8>>2];c[e+(b*80|0)+64+12>>2]=c[e+(f*80|0)+64+12>>2];e=c[a+28>>2]|0;c[e+(f*80|0)>>2]=c[g>>2];c[e+(f*80|0)+4>>2]=c[g+4>>2];c[e+(f*80|0)+8>>2]=c[g+8>>2];c[e+(f*80|0)+12>>2]=c[g+12>>2];c[e+(f*80|0)+16>>2]=c[g+16>>2];c[e+(f*80|0)+16+4>>2]=c[g+16+4>>2];c[e+(f*80|0)+16+8>>2]=c[g+16+8>>2];c[e+(f*80|0)+16+12>>2]=c[g+16+12>>2];c[e+(f*80|0)+32>>2]=c[g+32>>2];c[e+(f*80|0)+32+4>>2]=c[g+32+4>>2];c[e+(f*80|0)+32+8>>2]=c[g+32+8>>2];c[e+(f*80|0)+32+12>>2]=c[g+32+12>>2];c[e+(f*80|0)+48>>2]=c[g+48>>2];c[e+(f*80|0)+48+4>>2]=c[g+48+4>>2];c[e+(f*80|0)+48+8>>2]=c[g+48+8>>2];c[e+(f*80|0)+48+12>>2]=c[g+48+12>>2];c[e+(f*80|0)+64>>2]=c[g+64>>2];c[e+(f*80|0)+64+4>>2]=c[g+64+4>>2];c[e+(f*80|0)+64+8>>2]=c[g+64+8>>2];c[e+(f*80|0)+64+12>>2]=c[g+64+12>>2];if(!(c[a+68>>2]|0)){f=c[a+20>>2]|0;f=f+-1|0;c[a+20>>2]=f;l=g;return}c[(c[(c[a+28>>2]|0)+(b*80|0)+76>>2]|0)+36>>2]=b;f=c[a+20>>2]|0;f=f+-1|0;c[a+20>>2]=f;l=g;return}function se(b,d){b=b|0;d=d|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;o=c[b+92>>2]|0;if(!(xb[c[(c[o>>2]|0)+56>>2]&127](o)|0))return;o=c[b+92>>2]|0;o=xb[c[(c[o>>2]|0)+28>>2]&127](o)|0;f=c[o+4>>2]|0;if((f|0)>1){te(o,0,f+-1|0);j=c[o+4>>2]|0}else j=f;m=c[b+104>>2]|0;f=j-m|0;if((m|0)<0){if((c[o+8>>2]|0)<(f|0)){if(!f){g=0;i=j}else{c[6995]=(c[6995]|0)+1;g=sc((f<<4|3)+16|0)|0;if(!g)g=0;else{c[(g+4+15&-16)+-4>>2]=g;g=g+4+15&-16}i=c[o+4>>2]|0}if((i|0)>0){h=0;do{m=c[o+12>>2]|0;c[g+(h<<4)>>2]=c[m+(h<<4)>>2];c[g+(h<<4)+4>>2]=c[m+(h<<4)+4>>2];c[g+(h<<4)+8>>2]=c[m+(h<<4)+8>>2];c[g+(h<<4)+12>>2]=c[m+(h<<4)+12>>2];h=h+1|0}while((h|0)!=(i|0))}h=c[o+12>>2]|0;if(h|0){if(a[o+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[o+12>>2]=0}a[o+16>>0]=1;c[o+12>>2]=g;c[o+8>>2]=f;h=o+12|0}else h=o+12|0;g=j;do{m=(c[h>>2]|0)+(g<<4)|0;g=g+1|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0}while((g|0)!=(f|0))}c[o+4>>2]=f;c[b+104>>2]=0;if((f|0)>0){l=0;m=0;g=0;h=0;do{k=c[o+12>>2]|0;j=k+(l<<4)|0;p=m;m=c[j>>2]|0;k=k+(l<<4)+4|0;i=c[k>>2]|0;if(!((m|0)==(p|0)&(i|0)==(g|0))){p=m+48|0;if((((((e[m+54>>1]|0)>=(e[i+48>>1]|0)?(e[i+54>>1]|0)>=(e[p>>1]|0):0)?(e[m+56>>1]|0)>=(e[i+48+2>>1]|0):0)?(e[i+56>>1]|0)>=(e[p+2>>1]|0):0)?(e[m+58>>1]|0)>=(e[i+52>>1]|0):0)?(e[i+58>>1]|0)>=(e[m+52>>1]|0):0)g=i;else{f=i;n=29}}else{f=g;n=29}if((n|0)==29){n=0;h=c[b+92>>2]|0;Sb[c[(c[h>>2]|0)+32>>2]&127](h,j,d);c[j>>2]=0;c[k>>2]=0;h=(c[b+104>>2]|0)+1|0;c[b+104>>2]=h;c[6156]=(c[6156]|0)+-1;g=f;f=c[o+4>>2]|0}l=l+1|0}while((l|0)<(f|0));if((f|0)>1){te(o,0,f+-1|0);g=c[o+4>>2]|0;h=c[b+104>>2]|0}else g=f;f=g-h|0;if((h|0)<0){if((c[o+8>>2]|0)<(f|0)){if(!f){h=0;j=g}else{c[6995]=(c[6995]|0)+1;h=sc((f<<4|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}j=c[o+4>>2]|0}if((j|0)>0){i=0;do{p=c[o+12>>2]|0;c[h+(i<<4)>>2]=c[p+(i<<4)>>2];c[h+(i<<4)+4>>2]=c[p+(i<<4)+4>>2];c[h+(i<<4)+8>>2]=c[p+(i<<4)+8>>2];c[h+(i<<4)+12>>2]=c[p+(i<<4)+12>>2];i=i+1|0}while((i|0)!=(j|0))}i=c[o+12>>2]|0;if(i|0){if(a[o+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[o+12>>2]=0}a[o+16>>0]=1;c[o+12>>2]=h;c[o+8>>2]=f}do{p=(c[o+12>>2]|0)+(g<<4)|0;g=g+1|0;c[p>>2]=0;c[p+4>>2]=0;c[p+8>>2]=0;c[p+12>>2]=0}while((g|0)!=(f|0))}}c[o+4>>2]=f;c[b+104>>2]=0;return}function te(a,b,d){a=a|0;b=b|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;while(1){m=c[a+12>>2]|0;o=(b+d|0)/2|0;p=c[m+(o<<4)>>2]|0;n=c[m+(o<<4)+4>>2]|0;o=c[m+(o<<4)+8>>2]|0;e=d;f=b;while(1){a:do if(!p)while(1){j=c[m+(f<<4)>>2]|0;if(!j)g=-1;else g=c[j+12>>2]|0;k=c[m+(f<<4)+4>>2]|0;if(!k)h=-1;else h=c[k+12>>2]|0;if(!n)i=-1;else i=c[n+12>>2]|0;do if((g|0)<=-1){g=(h|0)>(i|0);if(g|(j|0)==0^1)if((j|0)==0&g)break;else break a;if((k|0)!=(n|0))break a;if((c[m+(f<<4)+8>>2]|0)>>>0<=o>>>0)break a}while(0);f=f+1|0}else{l=c[p+12>>2]|0;while(1){j=c[m+(f<<4)>>2]|0;if(!j)g=-1;else g=c[j+12>>2]|0;k=c[m+(f<<4)+4>>2]|0;if(!k)h=-1;else h=c[k+12>>2]|0;if(!n)i=-1;else i=c[n+12>>2]|0;do if((g|0)<=(l|0)){g=(h|0)>(i|0);if(g|(j|0)==(p|0)^1)if((j|0)==(p|0)&g)break;else break a;if((k|0)!=(n|0))break a;if((c[m+(f<<4)+8>>2]|0)>>>0<=o>>>0)break a}while(0);f=f+1|0}}while(0);b:do if(!p)while(1){j=c[m+(e<<4)>>2]|0;if(!j)g=-1;else g=c[j+12>>2]|0;if(!n)h=-1;else h=c[n+12>>2]|0;k=c[m+(e<<4)+4>>2]|0;if(!k)i=-1;else i=c[k+12>>2]|0;do if((g|0)>=-1){g=(h|0)>(i|0);if(g|(j|0)==0^1)if((j|0)==0&g)break;else break b;if((n|0)!=(k|0))break b;if(o>>>0<=(c[m+(e<<4)+8>>2]|0)>>>0)break b}while(0);e=e+-1|0}else{l=c[p+12>>2]|0;while(1){j=c[m+(e<<4)>>2]|0;if(!j)i=-1;else i=c[j+12>>2]|0;if(!n)g=-1;else g=c[n+12>>2]|0;k=c[m+(e<<4)+4>>2]|0;if(!k)h=-1;else h=c[k+12>>2]|0;do if((l|0)<=(i|0)){g=(g|0)>(h|0);if(g|(p|0)==(j|0)^1)if((p|0)==(j|0)&g)break;else break b;if((n|0)!=(k|0))break b;if(o>>>0<=(c[m+(e<<4)+8>>2]|0)>>>0)break b}while(0);e=e+-1|0}}while(0);if((f|0)<=(e|0)){h=m+(f<<4)|0;i=c[h>>2]|0;j=c[m+(f<<4)+4>>2]|0;k=c[m+(f<<4)+8>>2]|0;l=c[m+(f<<4)+12>>2]|0;m=m+(e<<4)|0;c[h>>2]=c[m>>2];c[h+4>>2]=c[m+4>>2];c[h+8>>2]=c[m+8>>2];c[h+12>>2]=c[m+12>>2];m=c[a+12>>2]|0;c[m+(e<<4)>>2]=i;c[m+(e<<4)+4>>2]=j;c[m+(e<<4)+8>>2]=k;c[m+(e<<4)+12>>2]=l;e=e+-1|0;f=f+1|0}if((f|0)>(e|0))break;m=c[a+12>>2]|0}if((e|0)>(b|0))te(a,b,e);if((f|0)<(d|0))b=f;else break}return}function ue(a,d,f,h,i,j,k,m,n){a=a|0;d=d|0;f=f|0;h=+h;i=+i;j=+j;k=k|0;m=m|0;n=n|0;var o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,E=0,F=0.0,G=0,H=0,I=0,J=0,K=0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0,V=0,W=0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0.0;W=l;l=l+32|0;T=+g[f>>2];F=+g[f+4>>2];L=+g[f+8>>2];M=1.0/+D(+((h-T)*(h-T)+(i-F)*(i-F)+(j-L)*(j-L)));Q=(h-T)*M==0.0?999999984306749440.0:1.0/((h-T)*M);R=(i-F)*M==0.0?999999984306749440.0:1.0/((i-F)*M);S=(j-L)*M==0.0?999999984306749440.0:1.0/((j-L)*M);fa=(T>h?h:T)+ +g[k>>2];ea=(F>i?i:F)+ +g[k+4>>2];da=(L>j?j:L)+ +g[k+8>>2];ba=(T>2];Z=(F>2];r=(L>2];aa=+g[a+4>>2];fa=fa>2];ea=ea>2];da=da>2];_=+g[a+24>>2];q=+g[a+28>>2];$=+g[a+36>>2];X=+g[a+40>>2];t=+g[a+44>>2];U=~~(((ca0){B=0;o=0;E=c[a+136>>2]|0;while(1){o=o+1|0;p=E+6|0;u=b[E>>1]|0;v=E+10|0;w=b[E+4>>1]|0;x=E+8|0;y=b[E+2>>1]|0;z=E+12|0;A=(c[z>>2]|0)>-1;do if(((I&65535)>=(u&65535)?(U&65535)<=(e[p>>1]|0):0)&(H&65535)<=(e[v>>1]|0)&(K&65535)>=(w&65535)&(G&65535)<=(e[x>>1]|0)&(J&65535)>=(y&65535)){ba=+g[a+36>>2];da=+g[a+40>>2];fa=+g[a+44>>2];ca=+g[a+4>>2];ea=+g[a+8>>2];s=+g[a+12>>2];g[W+12>>2]=0.0;t=+(e[p>>1]|0)/ba+ca;q=+(e[x>>1]|0)/da+ea;r=+(e[v>>1]|0)/fa+s;g[W+28>>2]=0.0;g[W>>2]=+(u&65535)/ba+ca-+g[m>>2];g[W+4>>2]=+(y&65535)/da+ea-+g[m+4>>2];g[W+8>>2]=+(w&65535)/fa+s-+g[m+8>>2];g[W+16>>2]=t-+g[k>>2];g[W+20>>2]=q-+g[k+4>>2];g[W+24>>2]=r-+g[k+8>>2];r=+g[f>>2];q=Q*(+g[W+((Q<0.0&1)<<4)>>2]-r);r=Q*(+g[W+((Q<0.0^1)<<4)>>2]-r);t=+g[f+4>>2];s=R*(+g[W+((R<0.0&1)<<4)+4>>2]-t);t=R*(+g[W+((R<0.0^1)<<4)+4>>2]-t);if(!(s>r|q>t)?(N=s>q?s:q,C=t>2],O=S*(+g[W+((S<0.0&1)<<4)+8>>2]-P),P=S*(+g[W+((S<0.0^1)<<4)+8>>2]-P),!(O>C|N>P)):0){p=(P0.0?(O>N?O:N)<(j-L)*(j-L)*M+((h-T)*(h-T)*M+(i-F)*(i-F)*M):0;if(!(A&p)){V=9;break}p=c[z>>2]|0;Sb[c[(c[d>>2]|0)+8>>2]&127](d,p>>21,p&2097151);p=1;break}p=0;V=9}else{p=0;V=9}while(0);if((V|0)==9){V=0;if(A|p)p=1;else p=0-(c[z>>2]|0)|0}B=p+B|0;if((B|0)>=(n|0))break;else E=E+(p<<4)|0}}else o=0;if((c[6160]|0)>=(o|0)){l=W;return}c[6160]=o;l=W;return}function ve(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0,s=0,t=0.0;o=l;l=l+80|0;h=+g[b+12>>2];k=+g[a+264>>2];f=+g[b+8>>2];n=+g[a+260>>2];e=+g[b+4>>2];if((k==f?+g[a+268>>2]==h:0)&n==e?+g[a+256>>2]==+g[b>>2]:0){l=o;return}m=+g[a+256>>2];d=+g[b>>2];if(d*d+e*e+f*f>0.0){j=1.0/+D(+(d*d+e*e+f*f));g[a+256>>2]=d*j;g[a+260>>2]=e*j;g[a+264>>2]=f*j;i=d*j;e=e*j;f=f*j;d=h}else{c[a+256>>2]=0;c[a+260>>2]=0;c[a+264>>2]=0;i=0.0;e=0.0;f=0.0;d=0.0}g[a+268>>2]=d;b=c[a+8>>2]|0;if(!b){l=o;return}d=i*i+e*e+f*f;do if(!(d==0.0)?!(m*m+n*n+k*k==0.0):0){d=1.0/+D(+d);j=i*d;g[a+256>>2]=j;h=e*d;g[a+260>>2]=h;d=f*d;g[a+264>>2]=d;e=1.0/+D(+(m*m+n*n+k*k));if(!(d*k*e+(h*n*e+m*e*j)<-.9999998807907104)){p=+D(+((d*k*e+(h*n*e+m*e*j)+1.0)*2.0));i=(d*m*e-k*e*j)*(1.0/p);f=(h*k*e-d*n*e)*(1.0/p);d=(n*e*j-h*m*e)*(1.0/p);e=p*.5;break}if(+C(+d)>.7071067690849304){e=1.0/+D(+(d*d+h*h));i=-(d*e);f=0.0;d=h*e;e=0.0;break}else{f=1.0/+D(+(h*h+j*j));i=j*f;f=-(h*f);d=0.0;e=0.0;break}}else{i=0.0;f=0.0;d=0.0;e=0.0}while(0);c[o+16>>2]=c[b+4>>2];c[o+16+4>>2]=c[b+4+4>>2];c[o+16+8>>2]=c[b+4+8>>2];c[o+16+12>>2]=c[b+4+12>>2];s=o+16+16|0;c[s>>2]=c[b+20>>2];c[s+4>>2]=c[b+20+4>>2];c[s+8>>2]=c[b+20+8>>2];c[s+12>>2]=c[b+20+12>>2];r=o+16+32|0;c[r>>2]=c[b+36>>2];c[r+4>>2]=c[b+36+4>>2];c[r+8>>2]=c[b+36+8>>2];c[r+12>>2]=c[b+36+12>>2];q=o+16+48|0;c[q>>2]=c[b+52>>2];c[q+4>>2]=c[b+52+4>>2];c[q+8>>2]=c[b+52+8>>2];c[q+12>>2]=c[b+52+12>>2];f=-f;p=-i;j=-d;yh(o+16|0,o);d=+g[o>>2];t=+g[o+12>>2];m=+g[o+8>>2];i=+g[o+4>>2];k=e*d+t*f+m*p-i*j;n=d*j+(t*p+e*i)-m*f;h=t*j+e*m+i*f-d*p;j=e*t-d*f-i*p-m*j;m=k*(2.0/(j*j+(h*h+(k*k+n*n))));p=n*(2.0/(j*j+(h*h+(k*k+n*n))));i=h*(2.0/(j*j+(h*h+(k*k+n*n))));g[o+16>>2]=1.0-(n*p+h*i);g[o+16+4>>2]=k*p-j*i;g[o+16+8>>2]=k*i+j*p;g[o+16+12>>2]=0.0;g[o+16+16>>2]=k*p+j*i;g[o+16+20>>2]=1.0-(k*m+h*i);g[o+16+24>>2]=n*i-j*m;g[o+16+28>>2]=0.0;g[o+16+32>>2]=k*i-j*p;g[o+16+36>>2]=n*i+j*m;g[o+16+40>>2]=1.0-(k*m+n*p);g[o+16+44>>2]=0.0;a=c[a+8>>2]|0;c[a+304>>2]=(c[a+304>>2]|0)+1;c[a+4>>2]=c[o+16>>2];c[a+4+4>>2]=c[o+16+4>>2];c[a+4+8>>2]=c[o+16+8>>2];c[a+4+12>>2]=c[o+16+12>>2];c[a+20>>2]=c[s>>2];c[a+20+4>>2]=c[s+4>>2];c[a+20+8>>2]=c[s+8>>2];c[a+20+12>>2]=c[s+12>>2];c[a+36>>2]=c[r>>2];c[a+36+4>>2]=c[r+4>>2];c[a+36+8>>2]=c[r+8>>2];c[a+36+12>>2]=c[r+12>>2];c[a+52>>2]=c[q>>2];c[a+52+4>>2]=c[q+4>>2];c[a+52+8>>2]=c[q+8>>2];c[a+52+12>>2]=c[q+12>>2];l=o;return}function we(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0;h=l;l=l+160|0;e=c[a+4>>2]|0;f=c[e+12>>2]|0;D=+g[f>>2];C=+g[f+4>>2];B=+g[f+8>>2];A=+g[f+16>>2];z=+g[f+20>>2];y=+g[f+24>>2];r=+g[f+32>>2];p=+g[f+36>>2];n=+g[f+40>>2];e=c[(c[e+4>>2]|0)+28>>2]|0;x=+g[e+(d*80|0)>>2];w=+g[e+(d*80|0)+16>>2];v=+g[e+(d*80|0)+32>>2];u=+g[e+(d*80|0)+4>>2];t=+g[e+(d*80|0)+20>>2];s=+g[e+(d*80|0)+36>>2];q=+g[e+(d*80|0)+8>>2];o=+g[e+(d*80|0)+24>>2];m=+g[e+(d*80|0)+40>>2];F=+g[e+(d*80|0)+48>>2];E=+g[e+(d*80|0)+52>>2];i=+g[e+(d*80|0)+56>>2];k=+g[f+48>>2]+(D*F+C*E+B*i);j=+g[f+52>>2]+(A*F+z*E+y*i);i=+g[f+56>>2]+(r*F+p*E+n*i);g[h+88>>2]=D*x+C*w+B*v;g[h+88+4>>2]=D*u+C*t+B*s;g[h+88+8>>2]=D*q+C*o+B*m;g[h+88+12>>2]=0.0;g[h+88+16>>2]=A*x+z*w+y*v;g[h+88+20>>2]=A*u+z*t+y*s;g[h+88+24>>2]=A*q+z*o+y*m;g[h+88+28>>2]=0.0;g[h+88+32>>2]=r*x+p*w+n*v;g[h+88+36>>2]=r*u+p*t+n*s;g[h+88+40>>2]=r*q+p*o+n*m;g[h+88+44>>2]=0.0;g[h+88+48>>2]=k;g[h+88+52>>2]=j;g[h+88+56>>2]=i;g[h+88+60>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,h+88|0,h+72|0,h+56|0);i=+g[(c[a+20>>2]|0)+32>>2];g[h+72>>2]=+g[h+72>>2]-i;g[h+72+4>>2]=+g[h+72+4>>2]-i;g[h+72+8>>2]=+g[h+72+8>>2]-i;g[h+56>>2]=i+ +g[h+56>>2];g[h+56+4>>2]=i+ +g[h+56+4>>2];g[h+56+8>>2]=i+ +g[h+56+8>>2];f=c[a+8>>2]|0;e=c[f+4>>2]|0;Vb[c[(c[e>>2]|0)+8>>2]&127](e,c[f+12>>2]|0,h+40|0,h+24|0);if(!(+g[h+72>>2]>+g[h+24>>2])?!(+g[h+56>>2]<+g[h+40>>2]):0)e=1;else e=0;if(!(!(+g[h+72+8>>2]>+g[h+24+8>>2])?!(+g[h+56+8>>2]<+g[h+40+8>>2]):0))e=0;if(+g[h+72+4>>2]>+g[h+24+4>>2]){l=h;return}if(+g[h+56+4>>2]<+g[h+40+4>>2]|e^1){l=h;return}e=c[a+4>>2]|0;f=c[e+8>>2]|0;c[h>>2]=e;c[h+4>>2]=b;c[h+8>>2]=f;c[h+12>>2]=h+88;c[h+16>>2]=-1;c[h+20>>2]=d;if(!(+g[(c[a+20>>2]|0)+32>>2]>0.0)){e=c[(c[a+24>>2]|0)+(d<<2)>>2]|0;if(!e){f=c[a+12>>2]|0;f=Db[c[(c[f>>2]|0)+8>>2]&1](f,h,c[a+8>>2]|0,c[a+28>>2]|0,1)|0;c[(c[a+24>>2]|0)+(d<<2)>>2]=f;f=c[(c[a+24>>2]|0)+(d<<2)>>2]|0}else f=e}else{f=c[a+12>>2]|0;f=Db[c[(c[f>>2]|0)+8>>2]&1](f,h,c[a+8>>2]|0,0,2)|0}b=c[a+20>>2]|0;e=c[b+8>>2]|0;if((c[e+8>>2]|0)==(c[(c[a+4>>2]|0)+8>>2]|0)){c[b+8>>2]=h;Sb[c[(c[b>>2]|0)+8>>2]&127](b,-1,d)}else{e=c[b+12>>2]|0;c[b+12>>2]=h;Sb[c[(c[b>>2]|0)+12>>2]&127](b,-1,d)}Zb[c[(c[f>>2]|0)+8>>2]&31](f,h,c[a+8>>2]|0,c[a+16>>2]|0,c[a+20>>2]|0);d=c[a+20>>2]|0;c[((c[(c[d+8>>2]|0)+8>>2]|0)==(c[(c[a+4>>2]|0)+8>>2]|0)?d+8|0:d+12|0)>>2]=e;l=h;return}function xe(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,H=0.0,I=0.0,J=0.0;Tg(a,b+(c*284|0)|0,d);m=+g[b+(c*284|0)+52>>2];h=+g[b+(c*284|0)+56>>2];q=+g[b+(c*284|0)+60>>2];J=+g[b+(c*284|0)+76>>2];x=+g[b+(c*284|0)+72>>2];z=+g[b+(c*284|0)+68>>2];w=1.0/+D(+((x*-m-z*-h)*(x*-m-z*-h)+((J*-h-x*-q)*(J*-h-x*-q)+(z*-q-J*-m)*(z*-q-J*-m))));v=(J*-h-x*-q)*w;u=w*(z*-q-J*-m);w=w*(x*-m-z*-h);e=+g[b+(c*284|0)+232>>2]*.5;k=+G(+e)/+D(+(m*m+h*h+q*q));e=+F(+e);l=2.0/(e*e+(k*-q*k*-q+(k*-m*k*-m+k*-h*k*-h)));H=1.0-(k*-h*k*-h*l+k*-q*k*-q*l);E=k*-m*k*-h*l-e*k*-q*l;I=k*-m*k*-q*l+e*k*-h*l;B=k*-m*k*-h*l+e*k*-q*l;A=1.0-(k*-m*k*-m*l+k*-q*k*-q*l);C=k*-h*k*-q*l-e*k*-m*l;j=k*-m*k*-q*l-e*k*-h*l;e=k*-h*k*-q*l+e*k*-m*l;l=1.0-(k*-m*k*-m*l+k*-h*k*-h*l);k=+g[b+(c*284|0)+236>>2]*-.5;y=+G(+k)/+D(+(J*J+(x*x+z*z)));k=+F(+k);r=2.0/(k*k+(J*y*J*y+(z*y*z*y+x*y*x*y)));n=1.0-(x*y*x*y*r+J*y*J*y*r);i=z*y*x*y*r-k*J*y*r;t=z*y*J*y*r+k*x*y*r;o=z*y*x*y*r+k*J*y*r;f=1.0-(z*y*z*y*r+J*y*J*y*r);s=x*y*J*y*r-k*z*y*r;p=z*y*J*y*r-k*x*y*r;k=x*y*J*y*r+k*z*y*r;r=1.0-(z*y*z*y*r+x*y*x*y*r);y=+g[b+(c*284|0)+68>>2];x=+g[b+(c*284|0)+72>>2];z=+g[b+(c*284|0)+76>>2];g[b+(c*284|0)+92>>2]=z*(H*t+E*s+I*r)+(y*(I*p+(E*o+H*n))+x*(I*k+(H*i+E*f)));g[b+(c*284|0)+96>>2]=w*(H*t+E*s+I*r)+(v*(I*p+(E*o+H*n))+u*(I*k+(H*i+E*f)));g[b+(c*284|0)+100>>2]=(H*t+E*s+I*r)*-q+((I*p+(E*o+H*n))*-m+(I*k+(H*i+E*f))*-h);g[b+(c*284|0)+104>>2]=0.0;g[b+(c*284|0)+108>>2]=z*(B*t+A*s+C*r)+(y*(C*p+(A*o+B*n))+x*(C*k+(B*i+A*f)));g[b+(c*284|0)+112>>2]=w*(B*t+A*s+C*r)+(v*(C*p+(A*o+B*n))+u*(C*k+(B*i+A*f)));g[b+(c*284|0)+116>>2]=(B*t+A*s+C*r)*-q+((C*p+(A*o+B*n))*-m+(C*k+(B*i+A*f))*-h);g[b+(c*284|0)+120>>2]=0.0;g[b+(c*284|0)+124>>2]=z*(j*t+e*s+l*r)+(y*(l*p+(e*o+j*n))+x*(l*k+(j*i+e*f)));g[b+(c*284|0)+128>>2]=w*(j*t+e*s+l*r)+(v*(l*p+(e*o+j*n))+u*(l*k+(j*i+e*f)));g[b+(c*284|0)+132>>2]=(j*t+e*s+l*r)*-q+((l*p+(e*o+j*n))*-m+(l*k+(j*i+e*f))*-h);g[b+(c*284|0)+136>>2]=0.0;h=+g[b+(c*284|0)+32>>2];f=h*+g[b+(c*284|0)+56>>2]+ +g[b+(c*284|0)+40>>2];e=h*+g[b+(c*284|0)+60>>2]+ +g[b+(c*284|0)+44>>2];g[b+(c*284|0)+140>>2]=+g[b+(c*284|0)+52>>2]*h+ +g[b+(c*284|0)+36>>2];g[b+(c*284|0)+144>>2]=f;g[b+(c*284|0)+148>>2]=e;g[b+(c*284|0)+152>>2]=0.0;return}function ye(b,d,e,f,h,i,k,l){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;k=k|0;l=l|0;var m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0;c[b+4>>2]=4;c[b+8>>2]=-1;c[b+12>>2]=-1;g[b+16>>2]=3402823466385288598117041.0e14;a[b+20>>0]=1;a[b+21>>0]=0;c[b+24>>2]=-1;c[b+28>>2]=d;c[b+32>>2]=e;g[b+36>>2]=0.0;g[b+40>>2]=.05000000074505806;c[b+44>>2]=0;c[b>>2]=4996;g[b+688>>2]=0.0;g[b+692>>2]=-1.0;g[b+696>>2]=.8999999761581421;g[b+700>>2]=.30000001192092896;g[b+704>>2]=1.0;g[b+708>>2]=0.0;g[b+712>>2]=0.0;a[b+716>>0]=0;a[b+736>>0]=0;a[b+737>>0]=0;a[b+738>>0]=0;a[b+739>>0]=1;a[b+740>>0]=l&1;c[b+748>>2]=0;c[b+748+4>>2]=0;c[b+748+8>>2]=0;c[b+748+12>>2]=0;c[b+748+16>>2]=0;c[b+600>>2]=c[f>>2];c[b+600+4>>2]=c[f+4>>2];c[b+600+8>>2]=c[f+8>>2];c[b+600+12>>2]=c[f+12>>2];m=+g[d+4>>2];n=+g[d+20>>2];o=+g[d+36>>2];p=+g[i>>2];q=+g[i+4>>2];r=+g[i+8>>2];do if(!(m*p+n*q+o*r>=.9999998807907104))if(!(m*p+n*q+o*r<=-.9999998807907104)){e=(g[j>>2]=o*q-n*r,c[j>>2]|0);s=(g[j>>2]=m*r-o*p,c[j>>2]|0);f=(g[j>>2]=n*p-m*q,c[j>>2]|0);x=r*(m*r-o*p)-q*(n*p-m*q);y=p*(n*p-m*q)-r*(o*q-n*r);w=q*(o*q-n*r)-p*(m*r-o*p);break}else{e=c[d+8>>2]|0;f=c[d+40>>2]|0;s=c[d+24>>2]|0;x=+g[d+12>>2];y=+g[d+28>>2];w=+g[d+44>>2];break}else{e=c[d+8>>2]|0;f=c[d+40>>2]|0;s=c[d+24>>2]|0;x=-+g[d+12>>2];y=-+g[d+28>>2];w=-+g[d+44>>2]}while(0);g[b+552>>2]=x;c[b+556>>2]=e;c[b+560>>2]=c[i>>2];g[b+564>>2]=0.0;g[b+568>>2]=y;c[b+572>>2]=s;c[b+576>>2]=c[i+4>>2];g[b+580>>2]=0.0;g[b+584>>2]=w;c[b+588>>2]=f;c[b+592>>2]=c[i+8>>2];g[b+596>>2]=0.0;p=+g[i+4>>2];t=+g[k+8>>2];q=+g[i+8>>2];u=+g[k+4>>2];v=+g[k>>2];m=+g[i>>2];do if(t*q+(p*u+v*m)<-.9999998807907104)if(+C(+q)>.7071067690849304){n=1.0/+D(+(p*p+q*q));o=-(q*n);r=0.0;n=p*n;m=0.0;break}else{q=1.0/+D(+(p*p+m*m));o=m*q;r=0.0;n=0.0;m=-(p*q);break}else{z=+D(+((t*q+(p*u+v*m)+1.0)*2.0));o=(q*v-t*m)*(1.0/z);r=z*.5;n=(u*m-p*v)*(1.0/z);m=(p*t-q*u)*(1.0/z)}while(0);B=w*o+x*r-y*n;q=x*n+y*r-w*m;p=y*m+w*r-x*o;A=-(x*m)-y*o-w*n;x=-m;o=-o;w=-n;z=q*w+(A*x+r*B)-p*o;y=p*x+(A*o+r*q)-B*w;x=B*o+(A*w+r*p)-q*x;c[b+664>>2]=c[h>>2];c[b+664+4>>2]=c[h+4>>2];c[b+664+8>>2]=c[h+8>>2];c[b+664+12>>2]=c[h+12>>2];g[b+616>>2]=z;g[b+620>>2]=u*x-t*y;c[b+624>>2]=c[k>>2];g[b+628>>2]=0.0;g[b+632>>2]=y;g[b+636>>2]=t*z-v*x;c[b+640>>2]=c[k+4>>2];g[b+644>>2]=0.0;g[b+648>>2]=x;g[b+652>>2]=v*y-u*z;c[b+656>>2]=c[k+8>>2];g[b+660>>2]=0.0;g[b+732>>2]=l?-1.0:1.0;return}function ze(b,d,e,f,h,i,j,k,m){b=b|0;d=d|0;e=e|0;f=f|0;h=+h;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0,x=0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,D=0,E=0.0;D=l;l=l+32|0;if(!b){l=D;return}n=c[k+4>>2]|0;if((n|0)<128){if((c[k+8>>2]|0)<128){c[6995]=(c[6995]|0)+1;o=sc(531)|0;if(!o)q=0;else{c[(o+4+15&-16)+-4>>2]=o;q=o+4+15&-16}p=c[k+4>>2]|0;if((p|0)>0){o=0;do{c[q+(o<<2)>>2]=c[(c[k+12>>2]|0)+(o<<2)>>2];o=o+1|0}while((o|0)!=(p|0))}o=c[k+12>>2]|0;if(o|0){if(a[k+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0)}c[k+12>>2]=0}a[k+16>>0]=1;c[k+12>>2]=q;c[k+8>>2]=128;o=k+12|0}else o=k+12|0;do{c[(c[o>>2]|0)+(n<<2)>>2]=0;n=n+1|0}while((n|0)!=128);y=k+8|0}else{o=k+12|0;y=k+8|0}c[k+4>>2]=128;c[c[o>>2]>>2]=b;p=1;n=126;do{w=p+-1|0;q=c[o>>2]|0;x=c[q+(w<<2)>>2]|0;u=+g[x+4>>2]-+g[j+4>>2];s=+g[x+8>>2]-+g[j+8>>2];g[D>>2]=+g[x>>2]-+g[j>>2];g[D+4>>2]=u;g[D+8>>2]=s;g[D+12>>2]=0.0;s=+g[x+20>>2]-+g[i+4>>2];u=+g[x+24>>2]-+g[i+8>>2];g[D+16>>2]=+g[x+16>>2]-+g[i>>2];g[D+20>>2]=s;g[D+24>>2]=u;g[D+28>>2]=0.0;v=c[f>>2]|0;u=+g[d>>2];s=+g[e>>2];t=(+g[D+(v<<4)>>2]-u)*s;u=s*(+g[D+(1-v<<4)>>2]-u);v=c[f+4>>2]|0;s=+g[d+4>>2];E=+g[e+4>>2];r=(+g[D+(v<<4)+4>>2]-s)*E;s=E*(+g[D+(1-v<<4)+4>>2]-s);do if((!(r>u|t>s)?(A=r>t?r:t,z=s>2]|0,C=+g[d+8>>2],E=+g[e+8>>2],B=(+g[D+(v<<4)+8>>2]-C)*E,C=E*(+g[D+(1-v<<4)+8>>2]-C),!(B>z|A>C)):0)?((C0.0?(B>A?B:A)>2]|0)){Ob[c[(c[m>>2]|0)+12>>2]&127](m,x);p=w;break}if((w|0)>(n|0)){v=c[k+4>>2]|0;if((v|0)<(v<<1|0)){if((c[y>>2]|0)<(v<<1|0)){if(v){c[6995]=(c[6995]|0)+1;n=sc((v<<3|3)+16|0)|0;if(!n)q=0;else{c[(n+4+15&-16)+-4>>2]=n;q=n+4+15&-16}b=c[k+4>>2]|0;if((b|0)>0){n=0;do{c[q+(n<<2)>>2]=c[(c[o>>2]|0)+(n<<2)>>2];n=n+1|0}while((n|0)!=(b|0))}}else q=0;n=c[o>>2]|0;if(n|0){if(a[k+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}c[o>>2]=0}a[k+16>>0]=1;c[o>>2]=q;c[y>>2]=v<<1;n=v}else n=v;do{c[q+(n<<2)>>2]=0;n=n+1|0;q=c[o>>2]|0}while((n|0)!=(v<<1|0))}c[k+4>>2]=v<<1;n=(v<<1)+-2|0}c[q+(w<<2)>>2]=c[x+36>>2];c[(c[o>>2]|0)+(p<<2)>>2]=c[x+40>>2];p=p+1|0}else p=w;while(0)}while((p|0)!=0);l=D;return}function Ae(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,k=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0,D=0,E=0.0;D=l;l=l+32|0;q=+g[d>>2];h=(g[j>>2]=q,c[j>>2]|0);t=q<999999984306749440.0?h:1566444395;p=+g[d+4>>2];k=(g[j>>2]=p,c[j>>2]|0);u=p<999999984306749440.0?k:1566444395;E=+g[d+8>>2];n=(g[j>>2]=E,c[j>>2]|0);w=E<999999984306749440.0?n:1566444395;r=+g[d+12>>2];y=r<0.0?r:0.0;h=q>-999999984306749440.0?h:-581039253;k=p>-999999984306749440.0?k:-581039253;n=E>-999999984306749440.0?n:-581039253;r=r>0.0?r:0.0;E=+g[d+16>>2];B=E<(c[j>>2]=t,+g[j>>2]);i=(g[j>>2]=E,c[j>>2]|0);t=B?i:t;p=+g[d+20>>2];B=p<(c[j>>2]=u,+g[j>>2]);m=(g[j>>2]=p,c[j>>2]|0);u=B?m:u;q=+g[d+24>>2];B=q<(c[j>>2]=w,+g[j>>2]);o=(g[j>>2]=q,c[j>>2]|0);w=B?o:w;s=+g[d+28>>2];y=s>2]=h,+g[j>>2])>2]=k,+g[j>>2])>2]=n,+g[j>>2])>2];B=E<(c[j>>2]=t,+g[j>>2]);h=(g[j>>2]=E,c[j>>2]|0);B=B?h:t;q=+g[d+36>>2];A=q<(c[j>>2]=u,+g[j>>2]);i=(g[j>>2]=q,c[j>>2]|0);A=A?i:u;r=+g[d+40>>2];z=r<(c[j>>2]=w,+g[j>>2]);k=(g[j>>2]=r,c[j>>2]|0);z=z?k:w;p=+g[d+44>>2];y=p>2]=x,+g[j>>2])>2]=v,+g[j>>2])>2]=m,+g[j>>2])>2]|0;h=c[t+4>>2]|0;if((h|0)==(c[t+8>>2]|0)?(C=h|0?h<<1:1,(h|0)<(C|0)):0){if(!C)o=0;else{c[6995]=(c[6995]|0)+1;h=sc(C<<6|19)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}o=h;h=c[t+4>>2]|0}if((h|0)>0){i=0;do{k=o+(i<<6)|0;m=(c[t+12>>2]|0)+(i<<6)|0;n=k+64|0;do{c[k>>2]=c[m>>2];k=k+4|0;m=m+4|0}while((k|0)<(n|0));i=i+1|0}while((i|0)!=(h|0))}h=c[t+12>>2]|0;if(h|0){if(a[t+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[t+12>>2]=0}a[t+16>>0]=1;c[t+12>>2]=o;c[t+8>>2]=C;h=c[t+4>>2]|0}C=c[t+12>>2]|0;c[C+(h<<6)>>2]=B;c[C+(h<<6)+4>>2]=A;c[C+(h<<6)+8>>2]=z;g[C+(h<<6)+12>>2]=y;c[C+(h<<6)+16>>2]=w;c[C+(h<<6)+20>>2]=v;c[C+(h<<6)+24>>2]=u;g[C+(h<<6)+28>>2]=p;c[C+(h<<6)+32>>2]=-1;c[C+(h<<6)+36>>2]=e;c[C+(h<<6)+40>>2]=f;f=C+(h<<6)+44|0;c[f>>2]=c[D>>2];c[f+4>>2]=c[D+4>>2];c[f+8>>2]=c[D+8>>2];c[f+12>>2]=c[D+12>>2];c[f+16>>2]=c[D+16>>2];c[t+4>>2]=(c[t+4>>2]|0)+1;l=D;return}function Be(b,d,e,f){b=b|0;d=d|0;e=e|0;f=+f;var h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0;o=l;l=l+16|0;n=+g[d>>2];i=+g[d+4>>2];j=+g[d+8>>2];k=+g[e>>2];m=+g[e+4>>2];h=+g[e+8>>2];if(!(a[b+232>>0]|0)){z=+g[b+104>>2];w=+g[b+120>>2];C=+g[b+136>>2];y=+g[b+108>>2];u=+g[b+124>>2];B=+g[b+140>>2];x=+g[b+112>>2];s=+g[b+128>>2];A=+g[b+144>>2];F=-+g[b+152>>2];E=-+g[b+156>>2];D=-+g[b+160>>2];J=+g[b+168>>2];I=+g[b+172>>2];r=+g[b+176>>2];H=+g[b+184>>2];G=+g[b+188>>2];q=+g[b+192>>2];v=+g[b+200>>2];t=+g[b+204>>2];p=+g[b+208>>2];r=h*(C*J+B*I+A*r)+(k*(z*J+y*I+x*r)+m*(w*J+u*I+s*r))+(J*(z*F+w*E+C*D)+(y*F+u*E+B*D)*I+(x*F+s*E+A*D)*r+ +g[b+216>>2]);q=h*(C*H+B*G+A*q)+(k*(z*H+y*G+x*q)+m*(w*H+u*G+s*q))+((z*F+w*E+C*D)*H+(y*F+u*E+B*D)*G+(x*F+s*E+A*D)*q+ +g[b+220>>2]);p=(z*F+w*E+C*D)*v+(y*F+u*E+B*D)*t+(x*F+s*E+A*D)*p+ +g[b+224>>2]+(h*(C*v+B*t+A*p)+(k*(z*v+y*t+x*p)+m*(w*v+u*t+s*p)));g[o>>2]=r;g[o+4>>2]=q;g[o+8>>2]=p;n=(n*f+k-r)*+g[d>>2]+(i*f+m-q)*+g[d+4>>2]+(j*f+h-p)*+g[d+8>>2];e=o+12|0;g[e>>2]=0.0;b=b+36|0;b=c[b>>2]|0;e=c[b>>2]|0;e=e+16|0;e=c[e>>2]|0;Tb[e&15](b,d,o,n);l=o;return}else{z=+g[b+40>>2];C=+g[b+56>>2];w=+g[b+72>>2];A=+g[b+44>>2];E=+g[b+60>>2];x=+g[b+76>>2];B=+g[b+48>>2];G=+g[b+64>>2];y=+g[b+80>>2];t=-+g[b+88>>2];u=-+g[b+92>>2];v=-+g[b+96>>2];p=+g[b+168>>2];q=+g[b+172>>2];H=+g[b+176>>2];r=+g[b+184>>2];s=+g[b+188>>2];I=+g[b+192>>2];D=+g[b+200>>2];F=+g[b+204>>2];J=+g[b+208>>2];H=(j*f+h)*(w*p+x*q+y*H)+((n*f+k)*(z*p+A*q+B*H)+(i*f+m)*(C*p+E*q+G*H))+(p*(z*t+C*u+w*v)+(A*t+E*u+x*v)*q+(B*t+G*u+y*v)*H+ +g[b+216>>2]);I=(j*f+h)*(w*r+x*s+y*I)+((n*f+k)*(z*r+A*s+B*I)+(i*f+m)*(C*r+E*s+G*I))+((z*t+C*u+w*v)*r+(A*t+E*u+x*v)*s+(B*t+G*u+y*v)*I+ +g[b+220>>2]);J=(z*t+C*u+w*v)*D+(A*t+E*u+x*v)*F+(B*t+G*u+y*v)*J+ +g[b+224>>2]+((j*f+h)*(w*D+x*F+y*J)+((n*f+k)*(z*D+A*F+B*J)+(i*f+m)*(C*D+E*F+G*J)));g[o>>2]=H+n*(n*(H-k)+i*(I-m)+j*(J-h));g[o+4>>2]=I+i*(n*(H-k)+i*(I-m)+j*(J-h));g[o+8>>2]=J+j*(n*(H-k)+i*(I-m)+j*(J-h));J=n*(H-k)+i*(I-m)+j*(J-h);e=o+12|0;g[e>>2]=0.0;b=b+36|0;b=c[b>>2]|0;e=c[b>>2]|0;e=e+16|0;e=c[e>>2]|0;Tb[e&15](b,d,o,J);l=o;return}}function Ce(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0;c[a+556>>2]=c[b>>2];c[a+556+4>>2]=c[b+4>>2];c[a+556+8>>2]=c[b+8>>2];c[a+556+12>>2]=c[b+12>>2];q=+g[a+568>>2];j=+g[5957];r=+g[a+560>>2];e=+g[5959];o=+g[a+564>>2];h=+g[5958];p=+g[a+556>>2];i=(j*o+q*h-e*p)*-o+(q*(q*j+r*e-o*h)+(-(j*p)-r*h-e*o)*-p)-(q*e+h*p-j*r)*-r;k=(q*e+h*p-j*r)*-p+(q*(j*o+q*h-e*p)+(-(j*p)-r*h-e*o)*-r)-(q*j+r*e-o*h)*-o;d=(q*j+r*e-o*h)*-r+((-(j*p)-r*h-e*o)*-o+q*(q*e+h*p-j*r))-(j*o+q*h-e*p)*-p;do if(e*d+(h*k+j*i)<-.9999998807907104)if(+C(+e)>.7071067690849304){d=1.0/+D(+(e*e+h*h));l=-(e*d);f=0.0;d=h*d;e=0.0;break}else{f=1.0/+D(+(j*j+h*h));l=j*f;f=-(h*f);d=0.0;e=0.0;break}else{v=+D(+((e*d+(h*k+j*i)+1.0)*2.0));l=(e*i-j*d)*(1.0/v);f=(h*d-e*k)*(1.0/v);d=(j*k-h*i)*(1.0/v);e=v*.5}while(0);m=1.0/+D(+(f*f+l*l+d*d+e*e));t=f*m;n=l*m;s=d*m;m=e*m;e=1.0/+D(+((m*q-p*-t-r*-n-o*-s)*(m*q-p*-t-r*-n-o*-s)+((q*-s+m*o+r*-t-p*-n)*(q*-s+m*o+r*-t-p*-n)+((p*m+q*-t+o*-n-r*-s)*(p*m+q*-t+o*-n-r*-s)+(p*-s+(q*-n+m*r)-o*-t)*(p*-s+(q*-n+m*r)-o*-t)))));h=(p*m+q*-t+o*-n-r*-s)*e;v=e*(p*-s+(q*-n+m*r)-o*-t);f=e*(q*-s+m*o+r*-t-p*-n);p=e*(m*q-p*-t-r*-n-o*-s);e=+g[a+444>>2];if(e>=.05000000074505806?(u=+g[a+448>>2],u>=.05000000074505806):0){d=m<-1.0?-1.0:m;d=+I(+(d>1.0?1.0:d))*2.0;if(d>1.1920928955078125e-07){i=1.0/+D(+(s*s+(t*t+n*n)));if(+C(+(n*i))>1.1920928955078125e-07){k=t*i;j=n*i;l=s*i;e=+D(+((s*i*s*i/(n*i*n*i)+1.0)/(1.0/(u*u)+s*i*s*i/(n*i*n*i)/(e*e))))}else{k=t*i;j=n*i;l=s*i}}else{k=0.0;j=0.0;l=0.0;e=0.0}if(+C(+d)>1.1920928955078125e-07){if(!(d>e)){e=-e;if(d>2];if(k>=.05000000074505806){d=p<-1.0?-1.0:p;d=+I(+(d>1.0?1.0:d))*2.0;if(d>3.1415927410125732){d=-p<-1.0?-1.0:-p;d=+I(+(d>1.0?1.0:d))*2.0;e=-h;i=-v;j=-f}else{e=h;i=v;j=f}if(d>1.1920928955078125e-07){u=1.0/+D(+(e*e+i*i+j*j));e=e*u;i=i*u;j=j*u}if(+C(+d)>1.1920928955078125e-07){if(!(d>k)){if(d<-k)d=-k}else d=k;v=d*.5;d=+G(+v)/+D(+(j*j+(i*i+e*e)));h=e*d;f=j*d;e=+F(+v);d=i*d}else{e=p;d=v}}else{e=p;d=v}g[a+556>>2]=n*f+(m*h+o*e)-l*d;g[a+560>>2]=l*h+(m*d+n*e)-o*f;g[a+564>>2]=o*d+(m*f+l*e)-n*h;g[a+568>>2]=m*e-o*h-n*d-l*f;return}function De(b,d){b=b|0;d=+d;var e=0,f=0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0;r=l;l=l+32|0;e=c[b+128>>2]|0;if((e|0)>0){f=0;do{xe(c[b+108>>2]|0,c[b+136>>2]|0,f,0);f=f+1|0;e=c[b+128>>2]|0}while((f|0)<(e|0))}q=c[b+108>>2]|0;m=+g[q+372>>2];n=+g[q+376>>2];h=+g[q+380>>2];h=+D(+(m*m+n*n+h*h))*3.5999999046325684;g[b+104>>2]=h;p=c[b+120>>2]|0;if(+g[q+4+(p<<2)>>2]*+g[q+372>>2]+ +g[q+20+(p<<2)>>2]*+g[q+376>>2]+ +g[q+36+(p<<2)>>2]*+g[q+380>>2]<0.0)g[b+104>>2]=-h;if((e|0)>0){e=0;do{+wf(b,(c[b+136>>2]|0)+(e*284|0)|0);e=e+1|0;f=c[b+128>>2]|0}while((e|0)<(f|0));i=1.0/+g[(c[b+108>>2]|0)+404>>2];if((f|0)>0){f=0;do{e=c[b+136>>2]|0;if(!(a[e+(f*284|0)+84>>0]|0))h=0.0;else{h=+g[e+(f*284|0)+272>>2];h=i*(+g[e+(f*284|0)+216>>2]*(+g[e+(f*284|0)+204>>2]-+g[e+(f*284|0)+32>>2])*+g[e+(f*284|0)+268>>2]-h*+g[(h<0.0?e+(f*284|0)+220|0:e+(f*284|0)+224|0)>>2]);h=h<0.0?0.0:h}g[e+(f*284|0)+276>>2]=h;f=f+1|0;e=c[b+128>>2]|0}while((f|0)<(e|0));if((e|0)>0){e=0;do{p=c[b+136>>2]|0;k=+g[p+(e*284|0)+276>>2];n=+g[p+(e*284|0)+248>>2];k=k>n?n:k;n=k*+g[p+(e*284|0)+4>>2]*d;m=k*+g[p+(e*284|0)+8>>2]*d;g[r+16>>2]=+g[p+(e*284|0)>>2]*k*d;g[r+16+4>>2]=n;g[r+16+8>>2]=m;g[r+16+12>>2]=0.0;q=c[b+108>>2]|0;m=+g[p+(e*284|0)+20>>2]-+g[q+56>>2];n=+g[p+(e*284|0)+24>>2]-+g[q+60>>2];g[r>>2]=+g[p+(e*284|0)+16>>2]-+g[q+52>>2];g[r+4>>2]=m;g[r+8>>2]=n;g[r+12>>2]=0.0;ll(q,r+16|0,r);e=e+1|0}while((e|0)<(c[b+128>>2]|0))}}}Jb[c[(c[b>>2]|0)+20>>2]&31](b,d);o=c[b+128>>2]|0;if((o|0)<=0){l=r;return}p=c[b+136>>2]|0;q=c[b+108>>2]|0;f=0;do{h=+g[p+(f*284|0)+36>>2]-+g[q+52>>2];i=+g[p+(f*284|0)+40>>2]-+g[q+56>>2];j=+g[p+(f*284|0)+44>>2]-+g[q+60>>2];k=+g[q+392>>2];m=+g[q+396>>2];n=+g[q+388>>2];if(!(a[p+(f*284|0)+84>>0]|0)){s=p+(f*284|0)+240|0;e=s;h=+g[s>>2]}else{e=c[b+120>>2]|0;y=+g[q+4+(e<<2)>>2];w=+g[q+20+(e<<2)>>2];u=+g[q+36+(e<<2)>>2];x=+g[p+(f*284|0)>>2];v=+g[p+(f*284|0)+4>>2];t=+g[p+(f*284|0)+8>>2];h=((i*n-h*k+ +g[q+380>>2])*(u-t*(y*x+w*v+u*t))+((k*j-i*m+ +g[q+372>>2])*(y-x*(y*x+w*v+u*t))+(h*m-j*n+ +g[q+376>>2])*(w-v*(y*x+w*v+u*t))))*d/+g[p+(f*284|0)+212>>2];e=p+(f*284|0)+240|0;g[e>>2]=h}s=p+(f*284|0)+236|0;g[s>>2]=h+ +g[s>>2];g[e>>2]=h*.9900000095367432;f=f+1|0}while((f|0)!=(o|0));l=r;return}function Ee(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,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(!((a|0)!=0&(b|0)!=0))return;c[6995]=(c[6995]|0)+1;e=sc(1043)|0;if(!e)f=0;else{c[(e+4+15&-16)+-4>>2]=e;f=e+4+15&-16}c[f>>2]=a;c[f+4>>2]=b;e=1;b=124;h=128;a=f;l=128;k=f;i=f;o=f;while(1){r=e+-1|0;p=c[a+(r<<3)>>2]|0;q=c[a+(r<<3)+4>>2]|0;if((r|0)>(b|0)){n=l<<1;do if((l|0)<(n|0)&(h|0)<(n|0)){if(l){c[6995]=(c[6995]|0)+1;b=sc((l<<4|3)+16|0)|0;if(!b)f=0;else{c[(b+4+15&-16)+-4>>2]=b;f=b+4+15&-16}if((l|0)>0){b=0;do{j=a+(b<<3)|0;k=c[j+4>>2]|0;m=f+(b<<3)|0;c[m>>2]=c[j>>2];c[m+4>>2]=k;b=b+1|0}while((b|0)!=(l|0));h=f;a=f}else{h=f;b=f;s=12}}else{h=0;b=0;s=12}if((s|0)==12){s=0;if(!a){j=n;a=b;f=h;i=h;b=h;break}else a=b}if(!o){j=n;f=h;i=h;b=h}else{c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0);j=n;f=h;i=h;b=h}}else{j=h;f=k;b=o}while(0);m=n+-4|0;h=j;l=n;k=f;j=b}else{m=b;j=o}do if((p|0)==(q|0))if(!(c[p+40>>2]|0))e=r;else{q=c[p+36>>2]|0;c[a+(r<<3)>>2]=q;c[a+(r<<3)+4>>2]=q;q=c[p+40>>2]|0;r=e+1|0;c[a+(e<<3)>>2]=q;c[a+(e<<3)+4>>2]=q;q=c[p+40>>2]|0;c[a+(r<<3)>>2]=c[p+36>>2];c[a+(r<<3)+4>>2]=q;e=e+2|0}else if(((((+g[p>>2]<=+g[q+16>>2]?+g[p+16>>2]>=+g[q>>2]:0)?+g[p+4>>2]<=+g[q+20>>2]:0)?+g[p+20>>2]>=+g[q+4>>2]:0)?+g[p+8>>2]<=+g[q+24>>2]:0)?+g[p+24>>2]>=+g[q+8>>2]:0){b=(c[q+40>>2]|0)!=0;if(!(c[p+40>>2]|0))if(b){o=c[q+36>>2]|0;c[a+(r<<3)>>2]=p;c[a+(r<<3)+4>>2]=o;r=c[q+40>>2]|0;c[a+(e<<3)>>2]=p;c[a+(e<<3)+4>>2]=r;e=e+1|0;break}else{Sb[c[(c[d>>2]|0)+8>>2]&127](d,p,q);e=r;break}else{f=c[p+36>>2]|0;if(b){n=c[q+36>>2]|0;c[a+(r<<3)>>2]=f;c[a+(r<<3)+4>>2]=n;n=c[q+36>>2]|0;o=e+1|0;c[a+(e<<3)>>2]=c[p+40>>2];c[a+(e<<3)+4>>2]=n;n=c[q+40>>2]|0;r=e+2|0;c[a+(o<<3)>>2]=c[p+36>>2];c[a+(o<<3)+4>>2]=n;q=c[q+40>>2]|0;c[a+(r<<3)>>2]=c[p+40>>2];c[a+(r<<3)+4>>2]=q;e=e+3|0;break}else{c[a+(r<<3)>>2]=f;c[a+(r<<3)+4>>2]=q;c[a+(e<<3)>>2]=c[p+40>>2];c[a+(e<<3)+4>>2]=q;e=e+1|0;break}}}else e=r;while(0);if(!e)break;else{b=m;o=j}}if((a|0)==0|(k|0)==0)return;c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);return}function Fe(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0,H=0.0,I=0.0,J=0.0;d=l;l=l+96|0;k=+g[b>>2];m=+g[a+28>>2];n=+g[b+4>>2];o=+g[a+32>>2];p=+g[b+8>>2];q=+g[a+36>>2];r=+g[a+44>>2];s=+g[a+48>>2];t=+g[a+52>>2];u=+g[a+60>>2];v=+g[a+64>>2];w=+g[a+68>>2];x=+g[a+76>>2];y=+g[a+80>>2];z=+g[a+84>>2];g[d+80>>2]=k*m+n*o+p*q+x;g[d+80+4>>2]=k*r+n*s+p*t+y;g[d+80+8>>2]=k*u+n*v+p*w+z;g[d+80+12>>2]=0.0;A=+g[b+16>>2];B=+g[b+20>>2];C=+g[b+24>>2];g[d+64>>2]=A*m+B*o+C*q+x;g[d+64+4>>2]=A*r+B*s+C*t+y;g[d+64+8>>2]=A*u+B*v+C*w+z;g[d+64+12>>2]=0.0;E=+g[b+32>>2];F=+g[b+36>>2];j=+g[b+40>>2];g[d+48>>2]=E*m+F*o+j*q+x;g[d+48+4>>2]=E*r+F*s+j*t+y;g[d+48+8>>2]=E*u+F*v+j*w+z;g[d+48+12>>2]=0.0;f=(k*m+n*o+p*q+x+(A*m+B*o+C*q+x)+(E*m+F*o+j*q+x))*.3333333432674408;h=(k*r+n*s+p*t+y+(A*r+B*s+C*t+y)+(E*r+F*s+j*t+y))*.3333333432674408;i=(k*u+n*v+p*w+z+(A*u+B*v+C*w+z)+(E*u+F*v+j*w+z))*.3333333432674408;g[d+32>>2]=f;g[d+32+4>>2]=h;g[d+32+8>>2]=i;g[d+32+12>>2]=0.0;b=c[a+8>>2]|0;if(!((xb[c[(c[b>>2]|0)+56>>2]&127](b)|0)&16384)){e=c[a+8>>2]|0;G=c[e>>2]|0;G=G+16|0;G=c[G>>2]|0;b=a+12|0;Vb[G&127](e,d+80|0,d+64|0,b);e=c[a+8>>2]|0;G=c[e>>2]|0;G=G+16|0;G=c[G>>2]|0;Vb[G&127](e,d+64|0,d+48|0,b);a=c[a+8>>2]|0;e=c[a>>2]|0;e=e+16|0;e=c[e>>2]|0;Vb[e&127](a,d+48|0,d+80|0,b);l=d;return}J=+g[d+80>>2];I=A*r+B*s+C*t+y-(k*r+n*s+p*t+y);H=A*u+B*v+C*w+z-(k*u+n*v+p*w+z);y=E*r+F*s+j*t+y-(k*r+n*s+p*t+y);w=E*u+F*v+j*w+z-(k*u+n*v+p*w+z);z=H*(E*m+F*o+j*q+x-J)-(A*m+B*o+C*q+x-J)*w;F=(A*m+B*o+C*q+x-J)*y-I*(E*m+F*o+j*q+x-J);E=1.0/+D(+(F*F+((I*w-H*y)*(I*w-H*y)+z*z)));c[d+16>>2]=1065353216;c[d+16+4>>2]=1065353216;c[d+16+8>>2]=0;g[d+16+12>>2]=0.0;b=c[a+8>>2]|0;e=c[(c[b>>2]|0)+16>>2]|0;g[d>>2]=E*(I*w-H*y)+f;g[d+4>>2]=E*z+h;g[d+8>>2]=E*F+i;g[d+12>>2]=0.0;Vb[e&127](b,d+32|0,d,d+16|0);b=c[a+8>>2]|0;e=c[b>>2]|0;e=e+16|0;e=c[e>>2]|0;G=a+12|0;Vb[e&127](b,d+80|0,d+64|0,G);b=c[a+8>>2]|0;e=c[b>>2]|0;e=e+16|0;e=c[e>>2]|0;Vb[e&127](b,d+64|0,d+48|0,G);a=c[a+8>>2]|0;b=c[a>>2]|0;b=b+16|0;b=c[b>>2]|0;Vb[b&127](a,d+48|0,d+80|0,G);l=d;return}function Ge(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0,i=0,j=0.0;a=l;l=l+144|0;switch(c[b+448>>2]&15){case 1:{c[a+112>>2]=3572;h=c[d+8>>2]|0;h=(c[h+252>>2]&2|0)==0?0:h;i=c[d+12>>2]|0;j=+g[i+48>>2];e=+g[i+52>>2];f=+g[i+56>>2];f=+D(+((j-j)*(j-j)+(e-e)*(e-e)+(f-f)*(f-f)));i=c[b+192>>2]|0;e=+nb[c[(c[i>>2]|0)+48>>2]&15](i);i=c[d+4>>2]|0;Vb[c[(c[i>>2]|0)+8>>2]&127](i,c[d+12>>2]|0,a+96|0,a+64|0);c[a>>2]=c[a+96>>2];c[a+4>>2]=c[a+96+4>>2];c[a+8>>2]=c[a+96+8>>2];c[a+12>>2]=c[a+96+12>>2];c[a+16>>2]=c[a+64>>2];c[a+16+4>>2]=c[a+64+4>>2];c[a+16+8>>2]=c[a+64+8>>2];c[a+16+12>>2]=c[a+64+12>>2];c[a+32>>2]=c[a>>2];c[a+32+4>>2]=c[a+4>>2];c[a+32+8>>2]=c[a+8>>2];c[a+32+12>>2]=c[a+12>>2];c[a+32+16>>2]=c[a+16>>2];c[a+32+20>>2]=c[a+20>>2];c[a+32+24>>2]=c[a+24>>2];c[a+32+28>>2]=c[a+28>>2];g[a+32>>2]=+g[a+32>>2]-e;g[a+32+4>>2]=+g[a+32+4>>2]-e;g[a+32+8>>2]=+g[a+32+8>>2]-e;g[a+32+16>>2]=e+ +g[a+32+16>>2];g[a+32+20>>2]=e+ +g[a+32+20>>2];g[a+32+24>>2]=e+ +g[a+32+24>>2];c[a+112+4>>2]=b;c[a+112+8>>2]=d;c[a+112+12>>2]=h;g[a+112+16>>2]=f+e;g[a+112+20>>2]=e;Bf(c[b+988>>2]|0,a+32|0,a+112|0);l=a;return}case 2:{g[a+4>>2]=1.0;c[a+8+4>>2]=0;c[a+8+4+4>>2]=0;c[a+8+4+8>>2]=0;c[a>>2]=3608;c[a+24>>2]=b;c[a+28>>2]=d;c[a+8>>2]=c[b+516>>2];i=c[d+4>>2]|0;j=+nb[c[(c[i>>2]|0)+48>>2]&15](i);i=c[b+192>>2]|0;j=j+ +nb[c[(c[i>>2]|0)+48>>2]&15](i);g[a+12>>2]=j;f=+g[(c[d+8>>2]|0)+228>>2];g[a+112>>2]=f;c[a+16>>2]=c[(+g[b+376>>2]>2];i=c[d+4>>2]|0;Vb[c[(c[i>>2]|0)+8>>2]&127](i,c[d+12>>2]|0,a+112|0,a+96|0);c[a+32>>2]=c[a+112>>2];c[a+32+4>>2]=c[a+112+4>>2];c[a+32+8>>2]=c[a+112+8>>2];c[a+32+12>>2]=c[a+112+12>>2];c[a+32+16>>2]=c[a+96>>2];c[a+32+16+4>>2]=c[a+96+4>>2];c[a+32+16+8>>2]=c[a+96+8>>2];c[a+32+16+12>>2]=c[a+96+12>>2];c[a+64>>2]=c[a+32>>2];c[a+64+4>>2]=c[a+32+4>>2];c[a+64+8>>2]=c[a+32+8>>2];c[a+64+12>>2]=c[a+32+12>>2];c[a+64+16>>2]=c[a+32+16>>2];c[a+64+20>>2]=c[a+32+20>>2];c[a+64+24>>2]=c[a+32+24>>2];c[a+64+28>>2]=c[a+32+28>>2];g[a+64>>2]=+g[a+64>>2]-j;g[a+64+4>>2]=+g[a+64+4>>2]-j;g[a+64+8>>2]=+g[a+64+8>>2]-j;g[a+64+16>>2]=j+ +g[a+64+16>>2];g[a+64+20>>2]=j+ +g[a+64+20>>2];g[a+64+24>>2]=j+ +g[a+64+24>>2];Bf(c[b+1068>>2]|0,a+64|0,a);l=a;return}default:{l=a;return}}}function He(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;c[b+4>>2]=6;c[b+8>>2]=-1;c[b+12>>2]=-1;g[b+16>>2]=3402823466385288598117041.0e14;a[b+20>>0]=1;a[b+21>>0]=0;c[b+24>>2]=-1;c[b+28>>2]=d;c[b+32>>2]=e;g[b+36>>2]=0.0;g[b+40>>2]=.05000000074505806;c[b+44>>2]=0;c[b>>2]=4704;c[b+48>>2]=c[f>>2];c[b+48+4>>2]=c[f+4>>2];c[b+48+8>>2]=c[f+8>>2];c[b+48+12>>2]=c[f+12>>2];c[b+64>>2]=c[f+16>>2];c[b+64+4>>2]=c[f+16+4>>2];c[b+64+8>>2]=c[f+16+8>>2];c[b+64+12>>2]=c[f+16+12>>2];c[b+80>>2]=c[f+32>>2];c[b+80+4>>2]=c[f+32+4>>2];c[b+80+8>>2]=c[f+32+8>>2];c[b+80+12>>2]=c[f+32+12>>2];c[b+96>>2]=c[f+48>>2];c[b+96+4>>2]=c[f+48+4>>2];c[b+96+8>>2]=c[f+48+8>>2];c[b+96+12>>2]=c[f+48+12>>2];c[b+112>>2]=c[h>>2];c[b+112+4>>2]=c[h+4>>2];c[b+112+8>>2]=c[h+8>>2];c[b+112+12>>2]=c[h+12>>2];c[b+128>>2]=c[h+16>>2];c[b+128+4>>2]=c[h+16+4>>2];c[b+128+8>>2]=c[h+16+8>>2];c[b+128+12>>2]=c[h+16+12>>2];c[b+144>>2]=c[h+32>>2];c[b+144+4>>2]=c[h+32+4>>2];c[b+144+8>>2]=c[h+32+8>>2];c[b+144+12>>2]=c[h+32+12>>2];c[b+160>>2]=c[h+48>>2];c[b+160+4>>2]=c[h+48+4>>2];c[b+160+8>>2]=c[h+48+8>>2];c[b+160+12>>2]=c[h+48+12>>2];d=b+680|0;e=d+48|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(e|0));c[b+740>>2]=0;c[b+740+4>>2]=0;c[b+740+8>>2]=0;c[b+740+12>>2]=0;c[b+756>>2]=1045220557;c[b+760>>2]=1045220557;c[b+764>>2]=1045220557;c[b+768>>2]=0;c[b+768+4>>2]=0;c[b+768+8>>2]=0;c[b+768+12>>2]=0;c[b+768+16>>2]=0;g[b+728>>2]=.699999988079071;g[b+732>>2]=1.0;g[b+736>>2]=.5;a[b+788>>0]=0;g[b+792>>2]=0.0;g[b+808>>2]=0.0;a[b+789>>0]=0;g[b+796>>2]=0.0;g[b+812>>2]=0.0;a[b+790>>0]=0;g[b+800>>2]=0.0;g[b+816>>2]=0.0;g[b+928>>2]=0.0;g[b+876>>2]=0.0;g[b+880>>2]=.10000000149011612;g[b+884>>2]=300.0;g[b+868>>2]=1.0;g[b+872>>2]=-1.0;g[b+896>>2]=0.0;g[b+900>>2]=.20000000298023224;g[b+904>>2]=0.0;g[b+908>>2]=0.0;g[b+888>>2]=1.0;g[b+892>>2]=.5;c[b+924>>2]=0;g[b+916>>2]=0.0;a[b+912>>0]=0;g[b+992>>2]=0.0;g[b+940>>2]=0.0;g[b+944>>2]=.10000000149011612;g[b+948>>2]=300.0;g[b+932>>2]=1.0;g[b+936>>2]=-1.0;g[b+960>>2]=0.0;g[b+964>>2]=.20000000298023224;g[b+968>>2]=0.0;g[b+972>>2]=0.0;g[b+952>>2]=1.0;g[b+956>>2]=.5;c[b+988>>2]=0;g[b+980>>2]=0.0;a[b+976>>0]=0;g[b+1056>>2]=0.0;g[b+1004>>2]=0.0;g[b+1008>>2]=.10000000149011612;g[b+1012>>2]=300.0;g[b+996>>2]=1.0;g[b+1e3>>2]=-1.0;g[b+1024>>2]=0.0;g[b+1028>>2]=.20000000298023224;g[b+1032>>2]=0.0;g[b+1036>>2]=0.0;g[b+1016>>2]=1.0;g[b+1020>>2]=.5;c[b+1052>>2]=0;g[b+1044>>2]=0.0;a[b+1040>>0]=0;a[b+1300>>0]=i&1;a[b+1301>>0]=1;c[b+1304>>2]=0;a[b+1308>>0]=0;jd(b,(c[b+28>>2]|0)+4|0,(c[b+32>>2]|0)+4|0);return}function Ie(a,e,f){a=a|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;c[e+16>>2]=c[a+20>>2];c[e+20>>2]=c[a+24>>2];c[e+24>>2]=c[a+28>>2];c[e+28>>2]=c[a+32>>2];c[e>>2]=c[a+4>>2];c[e+4>>2]=c[a+8>>2];c[e+8>>2]=c[a+12>>2];c[e+12>>2]=c[a+16>>2];c[e+32>>2]=c[a+36>>2];c[e+36>>2]=c[a+40>>2];c[e+40>>2]=c[a+44>>2];c[e+44>>2]=c[a+48>>2];c[e+48>>2]=c[a+56>>2];c[e+52>>2]=d[a+60>>0];k=c[a+88>>2]|0;c[e+56>>2]=k;if(k){k=zb[c[(c[f>>2]|0)+28>>2]&31](f,c[a+96>>2]|0)|0;c[e+64>>2]=k;if(k|0){i=c[a+88>>2]|0;j=Bb[c[(c[f>>2]|0)+16>>2]&63](f,48,i)|0;if((i|0)>0){g=c[j+8>>2]|0;h=0;while(1){k=c[a+96>>2]|0;c[g+16>>2]=c[k+(h<<6)+16>>2];c[g+20>>2]=c[k+(h<<6)+20>>2];c[g+24>>2]=c[k+(h<<6)+24>>2];c[g+28>>2]=c[k+(h<<6)+28>>2];c[g>>2]=c[k+(h<<6)>>2];c[g+4>>2]=c[k+(h<<6)+4>>2];c[g+8>>2]=c[k+(h<<6)+8>>2];c[g+12>>2]=c[k+(h<<6)+12>>2];c[g+32>>2]=c[k+(h<<6)+32>>2];c[g+36>>2]=c[k+(h<<6)+36>>2];c[g+40>>2]=c[k+(h<<6)+40>>2];c[g+44>>2]=0;h=h+1|0;if((h|0)==(i|0))break;else g=g+48|0}}Zb[c[(c[f>>2]|0)+20>>2]&31](f,j,18364,1497453121,c[a+96>>2]|0)}}else c[e+64>>2]=0;k=c[a+128>>2]|0;c[e+60>>2]=k;if(k){k=zb[c[(c[f>>2]|0)+28>>2]&31](f,c[a+136>>2]|0)|0;c[e+68>>2]=k;if(k|0){j=c[a+128>>2]|0;k=Bb[c[(c[f>>2]|0)+16>>2]&63](f,16,j)|0;if((j|0)>0){g=c[a+136>>2]|0;h=c[k+8>>2]|0;i=0;while(1){c[h+12>>2]=c[g+(i<<4)+12>>2];b[h+6>>1]=b[g+(i<<4)+6>>1]|0;b[h+8>>1]=b[g+(i<<4)+8>>1]|0;b[h+10>>1]=b[g+(i<<4)+10>>1]|0;b[h>>1]=b[g+(i<<4)>>1]|0;b[h+2>>1]=b[g+(i<<4)+2>>1]|0;b[h+4>>1]=b[g+(i<<4)+4>>1]|0;i=i+1|0;if((i|0)==(j|0))break;else h=h+16|0}}else g=c[a+136>>2]|0;Zb[c[(c[f>>2]|0)+20>>2]&31](f,k,18387,1497453121,g)}}else c[e+68>>2]=0;c[e+76>>2]=c[a+144>>2];k=c[a+152>>2]|0;c[e+80>>2]=k;if(!k){c[e+72>>2]=0;return 18431}k=zb[c[(c[f>>2]|0)+28>>2]&31](f,c[a+160>>2]|0)|0;c[e+72>>2]=k;if(!k)return 18431;j=c[a+152>>2]|0;k=Bb[c[(c[f>>2]|0)+16>>2]&63](f,20,j)|0;if((j|0)>0){g=c[a+160>>2]|0;h=c[k+8>>2]|0;i=0;while(1){b[h+14>>1]=b[g+(i<<5)+6>>1]|0;b[h+16>>1]=b[g+(i<<5)+8>>1]|0;b[h+18>>1]=b[g+(i<<5)+10>>1]|0;b[h+8>>1]=b[g+(i<<5)>>1]|0;b[h+10>>1]=b[g+(i<<5)+2>>1]|0;b[h+12>>1]=b[g+(i<<5)+4>>1]|0;c[h>>2]=c[g+(i<<5)+12>>2];c[h+4>>2]=c[g+(i<<5)+16>>2];i=i+1|0;if((i|0)==(j|0))break;else h=h+20|0}}else g=c[a+160>>2]|0;Zb[c[(c[f>>2]|0)+20>>2]&31](f,k,18410,1497453121,g);return 18431}function Je(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0,m=0;if(!b)b=0;else b=(c[b+252>>2]&2|0)==0?0:b;c[a+64>>2]=0;c[a+64+4>>2]=0;c[a+64+8>>2]=0;c[a+64+12>>2]=0;c[a+64+16>>2]=0;c[a+64+20>>2]=0;c[a+64+24>>2]=0;c[a+64+28>>2]=0;c[a+144>>2]=0;c[a+144+4>>2]=0;c[a+144+8>>2]=0;c[a+144+12>>2]=0;c[a+144+16>>2]=0;c[a+144+20>>2]=0;c[a+144+24>>2]=0;c[a+144+28>>2]=0;if(!b){c[a>>2]=1065353216;c[a+4>>2]=0;c[a+4+4>>2]=0;c[a+4+8>>2]=0;c[a+4+12>>2]=0;c[a+20>>2]=1065353216;c[a+24>>2]=0;c[a+24+4>>2]=0;c[a+24+8>>2]=0;c[a+24+12>>2]=0;c[a+40>>2]=1065353216;c[a+44>>2]=0;c[a+44+4>>2]=0;c[a+44+8>>2]=0;c[a+44+12>>2]=0;c[a+44+16>>2]=0;c[a+240>>2]=0;c[a+128>>2]=0;c[a+128+4>>2]=0;c[a+128+8>>2]=0;c[a+128+12>>2]=0;c[a+96>>2]=1065353216;c[a+100>>2]=1065353216;c[a+104>>2]=1065353216;g[a+108>>2]=0.0;c[a+112>>2]=1065353216;c[a+116>>2]=1065353216;c[a+120>>2]=1065353216;g[a+124>>2]=0.0;b=a+176|0;e=b+60|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(e|0));a=a+236|0;g[a>>2]=0.0;return}else{e=b+4|0;c[a>>2]=c[e>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];e=b+20|0;c[a+16>>2]=c[e>>2];c[a+16+4>>2]=c[e+4>>2];c[a+16+8>>2]=c[e+8>>2];c[a+16+12>>2]=c[e+12>>2];e=b+36|0;c[a+32>>2]=c[e>>2];c[a+32+4>>2]=c[e+4>>2];c[a+32+8>>2]=c[e+8>>2];c[a+32+12>>2]=c[e+12>>2];e=b+52|0;c[a+48>>2]=c[e>>2];c[a+48+4>>2]=c[e+4>>2];c[a+48+8>>2]=c[e+8>>2];c[a+48+12>>2]=c[e+12>>2];e=b+404|0;k=+g[e>>2];l=b+408|0;j=k*+g[b+412>>2];i=k*+g[b+416>>2];g[a+128>>2]=k*+g[l>>2];g[a+132>>2]=j;g[a+136>>2]=i;g[a+140>>2]=0.0;c[a+240>>2]=b;m=b+604|0;c[a+96>>2]=c[m>>2];c[a+96+4>>2]=c[m+4>>2];c[a+96+8>>2]=c[m+8>>2];c[a+96+12>>2]=c[m+12>>2];c[a+112>>2]=c[l>>2];c[a+112+4>>2]=c[l+4>>2];c[a+112+8>>2]=c[l+8>>2];c[a+112+12>>2]=c[l+12>>2];l=b+372|0;c[a+176>>2]=c[l>>2];c[a+176+4>>2]=c[l+4>>2];c[a+176+8>>2]=c[l+8>>2];c[a+176+12>>2]=c[l+12>>2];l=b+388|0;c[a+192>>2]=c[l>>2];c[a+192+4>>2]=c[l+4>>2];c[a+192+8>>2]=c[l+8>>2];c[a+192+12>>2]=c[l+12>>2];i=+g[e>>2];j=i*+g[b+476>>2]*d;k=i*+g[b+480>>2]*d;g[a+208>>2]=i*+g[b+472>>2]*d;g[a+212>>2]=j;g[a+216>>2]=k;g[a+220>>2]=0.0;k=+g[b+488>>2];j=+g[b+492>>2];i=+g[b+496>>2];h=(k*+g[b+328>>2]+j*+g[b+344>>2]+i*+g[b+360>>2])*d;f=(k*+g[b+332>>2]+j*+g[b+348>>2]+i*+g[b+364>>2])*d;g[a+224>>2]=(+g[b+324>>2]*k+ +g[b+340>>2]*j+ +g[b+356>>2]*i)*d;g[a+228>>2]=h;g[a+232>>2]=f;a=a+236|0;g[a>>2]=0.0;return}}function Ke(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0.0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0,N=0;M=l;l=l+64|0;c[M+48>>2]=a;c[M+48+4>>2]=b;c[M+48+8>>2]=d;L=+g[a>>2];z=+g[b>>2];A=+g[a+4>>2];B=+g[b+4>>2];C=+g[a+8>>2];E=+g[b+8>>2];g[M>>2]=L-z;g[M+4>>2]=A-B;g[M+8>>2]=C-E;g[M+12>>2]=0.0;F=+g[d>>2];G=+g[d+4>>2];H=+g[d+8>>2];g[M+16>>2]=z-F;g[M+20>>2]=B-G;g[M+24>>2]=E-H;g[M+28>>2]=0.0;g[M+32>>2]=F-L;g[M+36>>2]=G-A;g[M+40>>2]=H-C;g[M+44>>2]=0.0;I=(A-B)*(E-H)-(C-E)*(B-G);J=(C-E)*(z-F)-(E-H)*(L-z);K=(B-G)*(L-z)-(A-B)*(z-F);if(K*K+(I*I+J*J)>0.0){k=0;x=-1.0;y=0;m=0;h=0;o=A-B;p=C-E;i=L-z;u=L;v=A;w=C}else{L=-1.0;l=M;return +L}while(1){if(u*(K*o-J*p)+v*(I*p-K*i)+(J*i-I*o)*w>0.0){n=c[5288+(y<<2)>>2]|0;N=c[M+48+(n<<2)>>2]|0;r=+g[N>>2];i=r-u;s=+g[N+4>>2];p=s-v;t=+g[N+8>>2];q=t-w;do if(i*i+p*p+q*q>0.0){o=-(u*i+v*p+w*q)/(i*i+p*p+q*q);if(o>=1.0){k=2;i=r*r+s*s+t*t;m=0;h=1065353216;break}if(!(o<=0.0)){h=(g[j>>2]=o,c[j>>2]|0);u=u+i*o;i=v+p*o;w=w+q*o;k=3;i=w*w+(u*u+i*i);m=(g[j>>2]=1.0-o,c[j>>2]|0);break}else{k=1;i=u*u+v*v+w*w;m=1065353216;h=0;break}}else i=-1.0;while(0);if(x<0.0|i>2]=(k&1|0?1<>2]=m;c[e+(n<<2)>>2]=h;g[e+(c[5288+(n<<2)>>2]<<2)>>2]=0.0}else i=x}else i=x;n=y+1|0;if((n|0)==3)break;N=c[M+48+(n<<2)>>2]|0;x=i;y=n;o=+g[M+(n<<4)+4>>2];p=+g[M+(n<<4)+8>>2];i=+g[M+(n<<4)>>2];u=+g[N>>2];v=+g[N+4>>2];w=+g[N+8>>2]}if(!(i<0.0)){L=i;l=M;return +L}w=+D(+(K*K+(I*I+J*J)));x=(I*+g[a>>2]+J*+g[a+4>>2]+K*+g[a+8>>2])/(K*K+(I*I+J*J));c[f>>2]=7;u=+g[b>>2]-I*x;t=+g[b+4>>2]-J*x;v=+g[b+8>>2]-K*x;E=+D(+((t*(z-F)-u*(B-G))*(t*(z-F)-u*(B-G))+(((B-G)*v-t*(E-H))*((B-G)*v-t*(E-H))+(u*(E-H)-v*(z-F))*(u*(E-H)-v*(z-F)))))/w;g[e>>2]=E;z=+g[d>>2]-I*x;v=+g[d+4>>2]-J*x;B=+g[d+8>>2]-K*x;L=+D(+((v*(F-L)-z*(G-A))*(v*(F-L)-z*(G-A))+(((G-A)*B-v*(H-C))*((G-A)*B-v*(H-C))+(z*(H-C)-B*(F-L))*(z*(H-C)-B*(F-L)))))/w;g[e+4>>2]=L;g[e+8>>2]=1.0-(L+E);L=K*x*K*x+(I*x*I*x+J*x*J*x);l=M;return +L}function Le(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,i=0.0,k=0.0,m=0.0,n=0.0,o=0.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,G=0,H=0,I=0;d=l;l=l+144|0;g[a+36>>2]=0.0;c[d+128>>2]=0;c[d+128+4>>2]=0;c[d+128+8>>2]=0;c[d+128+12>>2]=0;b=0;do{e=d+128+(b<<2)|0;g[e>>2]=1.0;A=c[a+28>>2]|0;I=c[A+4>>2]|0;c[d+80>>2]=I;F=c[A+20>>2]|0;c[d+80+4>>2]=F;C=c[A+36>>2]|0;c[d+80+8>>2]=C;g[d+80+12>>2]=0.0;H=c[A+8>>2]|0;c[d+80+16>>2]=H;E=c[A+24>>2]|0;c[d+80+20>>2]=E;B=c[A+40>>2]|0;c[d+80+24>>2]=B;g[d+80+28>>2]=0.0;G=c[A+12>>2]|0;c[d+80+32>>2]=G;D=c[A+28>>2]|0;c[d+80+36>>2]=D;z=c[A+44>>2]|0;c[d+80+40>>2]=z;g[d+80+44>>2]=0.0;f=c[a+32>>2]|0;y=c[f+4>>2]|0;c[d+32>>2]=y;v=c[f+20>>2]|0;c[d+32+4>>2]=v;s=c[f+36>>2]|0;c[d+32+8>>2]=s;g[d+32+12>>2]=0.0;x=c[f+8>>2]|0;c[d+32+16>>2]=x;u=c[f+24>>2]|0;c[d+32+20>>2]=u;r=c[f+40>>2]|0;c[d+32+24>>2]=r;g[d+32+28>>2]=0.0;w=c[f+12>>2]|0;c[d+32+32>>2]=w;t=c[f+28>>2]|0;c[d+32+36>>2]=t;h=c[f+44>>2]|0;c[d+32+40>>2]=h;g[d+32+44>>2]=0.0;p=+g[a+300>>2];m=p*(c[j>>2]=I,+g[j>>2]);i=+g[a+304>>2];m=m+i*(c[j>>2]=H,+g[j>>2]);k=+g[a+308>>2];m=m+k*(c[j>>2]=G,+g[j>>2]);q=p*(c[j>>2]=F,+g[j>>2]);q=q+i*(c[j>>2]=E,+g[j>>2]);q=q+k*(c[j>>2]=D,+g[j>>2]);p=p*(c[j>>2]=C,+g[j>>2]);i=p+i*(c[j>>2]=B,+g[j>>2]);p=+g[A+52>>2];o=+g[A+56>>2];n=+g[A+60>>2];n=i+k*(c[j>>2]=z,+g[j>>2])+n-n;g[d+16>>2]=m+p-p;g[d+16+4>>2]=q+o-o;g[d+16+8>>2]=n;g[d+16+12>>2]=0.0;n=+g[a+316>>2];o=n*(c[j>>2]=y,+g[j>>2]);q=+g[a+320>>2];o=o+q*(c[j>>2]=x,+g[j>>2]);p=+g[a+324>>2];o=o+p*(c[j>>2]=w,+g[j>>2]);m=n*(c[j>>2]=v,+g[j>>2]);m=m+q*(c[j>>2]=u,+g[j>>2]);m=m+p*(c[j>>2]=t,+g[j>>2]);n=n*(c[j>>2]=s,+g[j>>2]);q=n+q*(c[j>>2]=r,+g[j>>2]);n=+g[f+52>>2];k=+g[f+56>>2];i=+g[f+60>>2];i=q+p*(c[j>>2]=h,+g[j>>2])+i-i;g[d>>2]=o+n-n;g[d+4>>2]=m+k-k;g[d+8>>2]=i;g[d+12>>2]=0.0;h=c[a+28>>2]|0;f=c[a+32>>2]|0;Rg(a+48+(b*84|0)|0,d+80|0,d+32|0,d+16|0,d,d+128|0,h+456|0,+g[h+404>>2],f+456|0,+g[f+404>>2]);g[e>>2]=0.0;b=b+1|0}while((b|0)!=3);l=d;return}function Me(a,b,d){a=a|0;b=b|0;d=d|0;var f=0.0,i=0.0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+80|0;n=c[a+4>>2]|0;cc[c[(c[n>>2]|0)+16>>2]&3](n,r+28|0,r+24|0,r+20|0,r+16|0,r+12|0,r+8|0,r+4|0,r,b);n=(c[r+12>>2]|0)+(P(c[r+8>>2]|0,d)|0)|0;q=c[a+4>>2]|0;p=(c[r+20>>2]|0)==0;o=c[r+28>>2]|0;do if((c[r>>2]|0)==3){m=c[r+16>>2]|0;k=o+(P(m,e[n+4>>1]|0)|0)|0;if(p){i=+g[k+4>>2]*+g[q+8>>2];j=+g[k>>2]*+g[q+4>>2];f=+g[k+8>>2]}else{i=+h[k+8>>3]*+g[q+8>>2];j=+h[k>>3]*+g[q+4>>2];f=+h[k+16>>3]}f=f*+g[q+12>>2];g[r+32+32>>2]=j;g[r+32+36>>2]=i;g[r+32+40>>2]=f;g[r+32+44>>2]=0.0;k=o+(P(m,e[n+2>>1]|0)|0)|0;if(p){i=+g[k+4>>2]*+g[q+8>>2];j=+g[k>>2]*+g[q+4>>2];f=+g[k+8>>2]}else{i=+h[k+8>>3]*+g[q+8>>2];j=+h[k>>3]*+g[q+4>>2];f=+h[k+16>>3]}f=f*+g[q+12>>2];g[r+32+16>>2]=j;g[r+32+20>>2]=i;g[r+32+24>>2]=f;g[r+32+28>>2]=0.0;k=o+(P(m,e[n>>1]|0)|0)|0;if(p){i=+g[k+4>>2]*+g[q+8>>2];j=+g[k>>2]*+g[q+4>>2];f=+g[k+8>>2];break}else{i=+h[k+8>>3]*+g[q+8>>2];j=+h[k>>3]*+g[q+4>>2];f=+h[k+16>>3];break}}else{k=c[r+16>>2]|0;m=o+(P(k,c[n+8>>2]|0)|0)|0;if(p){i=+g[m+4>>2]*+g[q+8>>2];j=+g[m+8>>2]*+g[q+12>>2];g[r+32+32>>2]=+g[m>>2]*+g[q+4>>2];g[r+32+36>>2]=i;g[r+32+40>>2]=j;g[r+32+44>>2]=0.0;p=o+(P(k,c[n+4>>2]|0)|0)|0;j=+g[p+4>>2]*+g[q+8>>2];i=+g[p+8>>2]*+g[q+12>>2];g[r+32+16>>2]=+g[p>>2]*+g[q+4>>2];g[r+32+20>>2]=j;g[r+32+24>>2]=i;g[r+32+28>>2]=0.0;p=o+(P(k,c[n>>2]|0)|0)|0;i=+g[p+4>>2]*+g[q+8>>2];j=+g[p>>2]*+g[q+4>>2];f=+g[p+8>>2];break}else{i=+h[m+8>>3]*+g[q+8>>2];j=+h[m+16>>3]*+g[q+12>>2];g[r+32+32>>2]=+h[m>>3]*+g[q+4>>2];g[r+32+36>>2]=i;g[r+32+40>>2]=j;g[r+32+44>>2]=0.0;p=o+(P(k,c[n+4>>2]|0)|0)|0;j=+h[p+8>>3]*+g[q+8>>2];i=+h[p+16>>3]*+g[q+12>>2];g[r+32+16>>2]=+h[p>>3]*+g[q+4>>2];g[r+32+20>>2]=j;g[r+32+24>>2]=i;g[r+32+28>>2]=0.0;p=o+(P(k,c[n>>2]|0)|0)|0;i=+h[p+8>>3]*+g[q+8>>2];j=+h[p>>3]*+g[q+4>>2];f=+h[p+16>>3];break}}while(0);f=f*+g[q+12>>2];g[r+32>>2]=j;g[r+32+4>>2]=i;g[r+32+8>>2]=f;g[r+32+12>>2]=0.0;q=c[a+8>>2]|0;Vb[c[(c[q>>2]|0)+8>>2]&127](q,r+32|0,b,d);q=c[a+4>>2]|0;Ob[c[(c[q>>2]|0)+24>>2]&127](q,b);l=r;return}function Ne(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+32|0;c[b>>2]=9184;a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;c[b+12>>2]=-1;c[b+16>>2]=0;c[b+20>>2]=0;a[b+80>>0]=1;c[b+76>>2]=0;c[b+68>>2]=0;c[b+72>>2]=0;c[b+44>>2]=0;c[b+48>>2]=0;c[b+52>>2]=-1;c[b+56>>2]=0;c[b+60>>2]=0;a[b+172>>0]=1;c[b+168>>2]=0;c[b+160>>2]=0;c[b+164>>2]=0;a[b+153>>0]=0;a[b+154>>0]=1;a[b+152>>0]=((d|0)!=0^1)&1;g[b+100>>2]=0.0;c[b+104>>2]=0;c[b+124>>2]=0;c[b+108>>2]=1;c[b+112>>2]=0;c[b+116>>2]=10;c[b+120>>2]=1;c[b+128>>2]=0;c[b+132>>2]=0;g[b+136>>2]=0.0;if(d|0)n=0;else{c[6995]=(c[6995]|0)+1;d=sc(91)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}Li(d);n=c[b+160>>2]|0}c[b+96>>2]=d;c[b+148>>2]=0;c[b+140>>2]=0;c[b+144>>2]=0;c[b+84>>2]=0;c[b+84+4>>2]=0;c[b+84+8>>2]=0;a[o+16>>0]=1;c[o+12>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;if((n|0)<=1){if((n|0)!=1){if((c[b+164>>2]|0)<1){c[6995]=(c[6995]|0)+1;d=sc(39)|0;if(!d)m=0;else{c[(d+4+15&-16)+-4>>2]=d;m=d+4+15&-16}e=c[b+160>>2]|0;if((e|0)>0){d=0;do{pj(m+(d*20|0)|0,(c[b+168>>2]|0)+(d*20|0)|0);d=d+1|0}while((d|0)!=(e|0));e=c[b+160>>2]|0;if((e|0)>0){d=0;do{h=c[b+168>>2]|0;i=h+(d*20|0)+4|0;j=h+(d*20|0)+12|0;k=c[j>>2]|0;f=h+(d*20|0)+16|0;if(k|0){if(a[f>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[j>>2]=0}a[f>>0]=1;c[j>>2]=0;c[i>>2]=0;c[h+(d*20|0)+8>>2]=0;d=d+1|0}while((d|0)!=(e|0))}}d=c[b+168>>2]|0;if(d|0){if(a[b+172>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+168>>2]=0}a[b+172>>0]=1;c[b+168>>2]=m;c[b+164>>2]=1;d=n}else d=n;while(1){pj((c[b+168>>2]|0)+(d*20|0)|0,o);if(!d)break;else d=d+1|0}d=c[o+12>>2]|0;c[b+160>>2]=1;if(!d){l=o;return}if(a[o+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[o+12>>2]=0;l=o;return}}else{d=1;do{f=c[b+168>>2]|0;h=f+(d*20|0)+4|0;i=f+(d*20|0)+12|0;j=c[i>>2]|0;e=f+(d*20|0)+16|0;if(j|0){if(a[e>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[i>>2]=0}a[e>>0]=1;c[i>>2]=0;c[h>>2]=0;c[f+(d*20|0)+8>>2]=0;d=d+1|0}while((d|0)!=(n|0))}c[b+160>>2]=1;l=o;return}function Oe(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0;if(!(c[a+204>>2]&2)){c[a+68>>2]=c[b>>2];c[a+68+4>>2]=c[b+4>>2];c[a+68+8>>2]=c[b+8>>2];c[a+68+12>>2]=c[b+12>>2];c[a+84>>2]=c[b+16>>2];c[a+84+4>>2]=c[b+16+4>>2];c[a+84+8>>2]=c[b+16+8>>2];c[a+84+12>>2]=c[b+16+12>>2];c[a+100>>2]=c[b+32>>2];c[a+100+4>>2]=c[b+32+4>>2];c[a+100+8>>2]=c[b+32+8>>2];c[a+100+12>>2]=c[b+32+12>>2];c[a+116>>2]=c[b+48>>2];c[a+116+4>>2]=c[b+48+4>>2];c[a+116+8>>2]=c[b+48+8>>2];c[a+116+12>>2]=c[b+48+12>>2];d=a+20|0;e=b+16|0;f=a+36|0;h=b+32|0;i=a+52|0;j=b+48|0;k=a+4|0}else{c[a+68>>2]=c[a+4>>2];c[a+68+4>>2]=c[a+4+4>>2];c[a+68+8>>2]=c[a+4+8>>2];c[a+68+12>>2]=c[a+4+12>>2];c[a+84>>2]=c[a+20>>2];c[a+84+4>>2]=c[a+20+4>>2];c[a+84+8>>2]=c[a+20+8>>2];c[a+84+12>>2]=c[a+20+12>>2];c[a+100>>2]=c[a+36>>2];c[a+100+4>>2]=c[a+36+4>>2];c[a+100+8>>2]=c[a+36+8>>2];c[a+100+12>>2]=c[a+36+12>>2];c[a+116>>2]=c[a+52>>2];c[a+116+4>>2]=c[a+52+4>>2];c[a+116+8>>2]=c[a+52+8>>2];c[a+116+12>>2]=c[a+52+12>>2];d=a+20|0;e=b+16|0;f=a+36|0;h=b+32|0;i=a+52|0;j=b+48|0;k=a+4|0}c[a+132>>2]=c[a+372>>2];c[a+132+4>>2]=c[a+372+4>>2];c[a+132+8>>2]=c[a+372+8>>2];c[a+132+12>>2]=c[a+372+12>>2];c[a+148>>2]=c[a+388>>2];c[a+148+4>>2]=c[a+388+4>>2];c[a+148+8>>2]=c[a+388+8>>2];c[a+148+12>>2]=c[a+388+12>>2];c[k>>2]=c[b>>2];c[k+4>>2]=c[b+4>>2];c[k+8>>2]=c[b+8>>2];c[k+12>>2]=c[b+12>>2];c[d>>2]=c[e>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];c[d+12>>2]=c[e+12>>2];c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];w=+g[a+4>>2];q=+g[a+456>>2];v=+g[a+8>>2];o=+g[a+460>>2];u=+g[a+12>>2];m=+g[a+464>>2];t=+g[a+20>>2];s=+g[a+24>>2];r=+g[a+28>>2];p=+g[a+36>>2];n=+g[a+40>>2];l=+g[a+44>>2];g[a+324>>2]=w*w*q+v*v*o+u*u*m;g[a+328>>2]=w*q*t+v*o*s+u*m*r;g[a+332>>2]=w*q*p+v*o*n+u*m*l;g[a+336>>2]=0.0;g[a+340>>2]=w*q*t+v*o*s+u*m*r;g[a+344>>2]=t*q*t+s*o*s+r*m*r;g[a+348>>2]=q*t*p+o*s*n+m*r*l;g[a+352>>2]=0.0;g[a+356>>2]=w*q*p+v*o*n+u*m*l;g[a+360>>2]=t*q*p+s*o*n+r*m*l;g[a+364>>2]=p*q*p+n*o*n+l*m*l;g[a+368>>2]=0.0;return}function Pe(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,h=0.0,i=0,k=0.0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0;if(!(c[a>>2]|0)){c[a>>2]=d;c[d+32>>2]=0;return}f=c[b+40>>2]|0;if(!f)q=b;else{e=+g[d>>2]+ +g[d+16>>2];h=+g[d+4>>2]+ +g[d+20>>2];k=+g[d+8>>2]+ +g[d+24>>2];do{t=c[b+36>>2]|0;l=+C(+(e-(+g[t>>2]+ +g[t+16>>2])))+ +C(+(h-(+g[t+4>>2]+ +g[t+20>>2])))+ +C(+(k-(+g[t+8>>2]+ +g[t+24>>2])));b=c[b+36+((!(l<+C(+(e-(+g[f>>2]+ +g[f+16>>2])))+ +C(+(h-(+g[f+4>>2]+ +g[f+20>>2])))+ +C(+(k-(+g[f+8>>2]+ +g[f+24>>2]))))&1)<<2)>>2]|0;f=c[b+40>>2]|0}while((f|0)!=0);q=b}s=q+32|0;t=c[s>>2]|0;b=c[a+4>>2]|0;if(!b){c[6995]=(c[6995]|0)+1;b=sc(63)|0;if(!b)b=0;else{c[(b+4+15&-16)+-4>>2]=b;b=b+4+15&-16}f=b;i=f+44|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(i|0))}else c[a+4>>2]=0;c[b+32>>2]=t;c[b+36>>2]=0;n=b+40|0;c[n>>2]=0;o=q+16|0;f=c[(+g[d>>2]<+g[q>>2]?d:q)>>2]|0;c[b>>2]=f;i=c[(+g[d+16>>2]>+g[q+16>>2]?d+16|0:o)>>2]|0;c[b+16>>2]=i;r=c[(+g[d+4>>2]<+g[q+4>>2]?d:q)+4>>2]|0;c[b+4>>2]=r;m=c[(+g[d+20>>2]>+g[q+20>>2]?d+16|0:o)+4>>2]|0;c[b+20>>2]=m;p=c[(+g[d+8>>2]<+g[q+8>>2]?d:q)+8>>2]|0;c[b+8>>2]=p;o=c[(+g[d+24>>2]>+g[q+24>>2]?d+16|0:o)+8>>2]|0;c[b+24>>2]=o;if(!t){c[b+36>>2]=q;c[s>>2]=b;c[n>>2]=d;c[d+32>>2]=b;c[a>>2]=b;return}c[t+36+(((c[(c[s>>2]|0)+40>>2]|0)==(q|0)&1)<<2)>>2]=b;c[b+36>>2]=q;c[s>>2]=b;c[n>>2]=d;c[d+32>>2]=b;b=p;n=r;while(1){u=(c[j>>2]=f,+g[j>>2]);l=(c[j>>2]=b,+g[j>>2]);k=(c[j>>2]=i,+g[j>>2]);h=(c[j>>2]=m,+g[j>>2]);e=(c[j>>2]=o,+g[j>>2]);if(+g[t>>2]<=u){b=t+4|0;if((((+g[b>>2]<=(c[j>>2]=n,+g[j>>2])?+g[t+8>>2]<=l:0)?+g[t+16>>2]>=k:0)?+g[t+20>>2]>=h:0)?+g[t+24>>2]>=e:0){b=22;break}}else b=t+4|0;d=c[t+36>>2]|0;o=c[t+40>>2]|0;f=c[(+g[d>>2]<+g[o>>2]?d:o)>>2]|0;c[t>>2]=f;i=c[(+g[d+16>>2]>+g[o+16>>2]?d+16|0:o+16|0)>>2]|0;c[t+16>>2]=i;n=c[(+g[d+4>>2]<+g[o+4>>2]?d:o)+4>>2]|0;c[b>>2]=n;m=c[(+g[d+20>>2]>+g[o+20>>2]?d+16|0:o+16|0)+4>>2]|0;c[t+20>>2]=m;b=c[(+g[d+8>>2]<+g[o+8>>2]?d:o)+8>>2]|0;c[t+8>>2]=b;o=c[(+g[d+24>>2]>+g[o+24>>2]?d+16|0:o+16|0)+8>>2]|0;c[t+24>>2]=o;t=c[t+32>>2]|0;if(!t){b=22;break}}if((b|0)==22)return}function Qe(){if(a[22504]|0)return;if(!(Uz(22504)|0))return;c[6161]=0;c[6162]=-2147483648;c[6163]=-1082130432;g[6164]=0.0;c[6165]=1060716128;c[6166]=-1090087446;c[6167]=-1092290076;g[6168]=0.0;c[6169]=-1098022214;c[6170]=-1084636126;c[6171]=-1092290076;g[6172]=0.0;c[6173]=-1083901670;c[6174]=-2147483648;c[6175]=-1092290177;g[6176]=0.0;c[6177]=-1098022214;c[6178]=1062847522;c[6179]=-1092290043;g[6180]=0.0;c[6181]=1060716128;c[6182]=1057396202;c[6183]=-1092290076;g[6184]=0.0;c[6185]=1049461434;c[6186]=-1084636126;c[6187]=1055193605;g[6188]=0.0;c[6189]=-1086767520;c[6190]=-1090087446;c[6191]=1055193572;g[6192]=0.0;c[6193]=-1086767520;c[6194]=1057396202;c[6195]=1055193572;g[6196]=0.0;c[6197]=1049461434;c[6198]=1062847522;c[6199]=1055193572;g[6200]=0.0;c[6201]=1063581978;c[6202]=0;c[6203]=1055193471;g[6204]=0.0;c[6205]=-2147483648;c[6206]=0;c[6207]=1065353216;g[6208]=0.0;c[6209]=1054458864;c[6210]=-1096927567;c[6211]=-1084636042;g[6212]=0.0;c[6213]=-1104782626;c[6214]=-1090519208;c[6215]=-1084636042;g[6216]=0.0;c[6217]=1049007812;c[6218]=-1085334679;c[6219]=-1090087228;g[6220]=0.0;c[6221]=1054458864;c[6222]=1050556081;c[6223]=-1084636042;g[6224]=0.0;c[6225]=1062847505;c[6226]=-2147483648;c[6227]=-1090087262;g[6228]=0.0;c[6229]=-1090087362;c[6230]=-2147483648;c[6231]=-1084636076;g[6232]=0.0;c[6233]=-1087361736;c[6234]=-1090519141;c[6235]=-1090087262;g[6236]=0.0;c[6237]=-1104782626;c[6238]=1056964440;c[6239]=-1084636042;g[6240]=0.0;c[6241]=-1087361736;c[6242]=1056964507;c[6243]=-1090087262;g[6244]=0.0;c[6245]=1049007812;c[6246]=1062148969;c[6247]=-1090087228;g[6248]=0.0;c[6249]=1064532105;c[6250]=1050556148;c[6251]=0;g[6252]=0.0;c[6253]=1064532105;c[6254]=-1096927500;c[6255]=0;g[6256]=0.0;c[6257]=1058437413;c[6258]=-1085334595;c[6259]=0;g[6260]=0.0;c[6261]=0;c[6262]=-1082130432;c[6263]=0;g[6264]=0.0;c[6265]=-1089046235;c[6266]=-1085334595;c[6267]=0;g[6268]=0.0;c[6269]=-1082951543;c[6270]=-1096927500;c[6271]=-2147483648;g[6272]=0.0;c[6273]=-1082951543;c[6274]=1050556148;c[6275]=-2147483648;g[6276]=0.0;c[6277]=-1089046235;c[6278]=1062149053;c[6279]=-2147483648;g[6280]=0.0;c[6281]=-2147483648;c[6282]=1065353216;c[6283]=-2147483648;g[6284]=0.0;c[6285]=1058437413;c[6286]=1062149053;c[6287]=-2147483648;g[6288]=0.0;c[6289]=1060121912;c[6290]=-1090519141;c[6291]=1057396386;g[6292]=0.0;c[6293]=-1098475836;c[6294]=-1085334679;c[6295]=1057396420;g[6296]=0.0;c[6297]=-1084636143;c[6298]=0;c[6299]=1057396386;g[6300]=0.0;c[6301]=-1098475836;c[6302]=1062148969;c[6303]=1057396420;g[6304]=0.0;c[6305]=1060121912;c[6306]=1056964507;c[6307]=1057396386;g[6308]=0.0;c[6309]=1057396286;c[6310]=0;c[6311]=1062847572;g[6312]=0.0;c[6313]=1042701022;c[6314]=-1090519208;c[6315]=1062847606;g[6316]=0.0;c[6317]=-1093024784;c[6318]=-1096927567;c[6319]=1062847606;g[6320]=0.0;c[6321]=-1093024784;c[6322]=1050556081;c[6323]=1062847606;g[6324]=0.0;c[6325]=1042701022;c[6326]=1056964440;c[6327]=1062847606;g[6328]=0.0;return}function Re(a,b,d,e,f,h,i,j){a=a|0;b=b|0;d=d|0;e=+e;f=+f;h=+h;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0,V=0;V=l;l=l+32|0;z=+g[d>>2];B=+g[d+4>>2];A=+g[d+8>>2];v=+g[i>>2];t=+g[i+4>>2];r=+g[i+8>>2];q=+g[j>>2];s=+g[j+4>>2];u=+g[j+8>>2];K=1.0/+D(+((e-z)*(e-z)+(f-B)*(f-B)+(h-A)*(h-A)));L=(e-z)*K==0.0?999999984306749440.0:1.0/((e-z)*K);M=(f-B)*K==0.0?999999984306749440.0:1.0/((f-B)*K);N=(h-A)*K==0.0?999999984306749440.0:1.0/((h-A)*K);O=(z>e?e:z)+v;P=(B>f?f:B)+t;Q=(A>h?h:A)+r;R=(z>2]|0;a:do if((o|0)>0){x=c[a+96>>2]|0;k=0;w=0;while(1){k=k+1|0;c[V>>2]=c[x>>2];c[V+4>>2]=c[x+4>>2];c[V+8>>2]=c[x+8>>2];c[V+12>>2]=c[x+12>>2];p=x+16|0;c[V+16>>2]=c[p>>2];c[V+16+4>>2]=c[p+4>>2];c[V+16+8>>2]=c[p+8>>2];c[V+16+12>>2]=c[p+12>>2];g[V>>2]=+g[V>>2]-q;g[V+4>>2]=+g[V+4>>2]-s;g[V+8>>2]=+g[V+8>>2]-u;g[V+16>>2]=+g[V+16>>2]-v;g[V+20>>2]=+g[V+20>>2]-t;g[V+24>>2]=+g[V+24>>2]-r;if(!(O>+g[p>>2])?!(R<+g[x>>2]):0)m=1;else m=0;if(!(!(Q>+g[x+24>>2])?!(T<+g[x+8>>2]):0))m=0;if(((!(P>+g[x+20>>2])?!(S<+g[x+4>>2]|m^1):0)?(E=+g[d>>2],C=L*(+g[V+((L<0.0&1)<<4)>>2]-E),E=L*(+g[V+((L<0.0^1)<<4)>>2]-E),G=+g[d+4>>2],F=M*(+g[V+((M<0.0&1)<<4)+4>>2]-G),G=M*(+g[V+((M<0.0^1)<<4)+4>>2]-G),!(F>E|C>G)):0)?(H=F>C?F:C,y=G>2],I=N*(+g[V+((N<0.0&1)<<4)+8>>2]-J),J=N*(+g[V+((N<0.0^1)<<4)+8>>2]-J),!(I>y|H>J)):0){m=(J0.0?(I>H?I:H)<(h-A)*(h-A)*K+((e-z)*(e-z)*K+(f-B)*(f-B)*K):0;n=c[x+32>>2]|0;if(m&(n|0)==-1){Sb[c[(c[b>>2]|0)+8>>2]&127](b,c[x+36>>2]|0,c[x+40>>2]|0);n=1;o=c[a+56>>2]|0}else{p=(n|0)==-1;U=16}}else{n=c[x+32>>2]|0;p=(n|0)==-1;m=0;U=16}if((U|0)==16){U=0;n=p|m?1:n}m=n+w|0;if((m|0)>=(o|0))break a;x=x+(n<<6)|0;w=m;q=+g[j>>2];s=+g[j+4>>2];u=+g[j+8>>2];v=+g[i>>2];t=+g[i+4>>2];r=+g[i+8>>2]}}else k=0;while(0);if((c[6160]|0)>=(k|0)){l=V;return}c[6160]=k;l=V;return}function Se(a,b,d,e,f,h){a=a|0;b=b|0;d=+d;e=+e;f=+f;h=h|0;var i=0,j=0,k=0.0,l=0.0,m=0,n=0,o=0.0,p=0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0.0,y=0.0,z=0.0,A=0,B=0,C=0.0;a:while(1){if((b|0)>0){i=-1;j=0;do{do if(c[h+(j<<2)>>2]|0){if((i|0)!=-1?!(+g[a+(j<<4)>>2]*d+ +g[a+(j<<4)+4>>2]*e+ +g[a+(j<<4)+8>>2]*f>+g[a+(i<<4)>>2]*d+ +g[a+(i<<4)+4>>2]*e+ +g[a+(i<<4)+8>>2]*f):0)break;i=j}while(0);j=j+1|0}while((j|0)!=(b|0))}else i=-1;A=h+(i<<2)|0;if((c[A>>2]|0)==3){B=36;break}k=+D(+((e-f*0.0)*(e-f*0.0)+(f*0.0-d)*(f*0.0-d)+(d*0.0-e*0.0)*(d*0.0-e*0.0)));l=+D(+((d-e*0.0)*(d-e*0.0)+((e*0.0-f)*(e*0.0-f)+(f*0.0-d*0.0)*(f*0.0-d*0.0))));if(k>l){y=(d*0.0-e*0.0)*(1.0/k);z=(f*0.0-d)*(1.0/k);s=(e-f*0.0)*(1.0/k)}else{y=(d-e*0.0)*(1.0/l);z=(f*0.0-d*0.0)*(1.0/l);s=(e*0.0-f)*(1.0/l)}t=z*f-y*e;u=y*d-s*f;v=s*e-z*d;w=(i|0)==-1;r=0;j=-1;while(1){x=+(r|0);q=+G(+(x*.01745329238474369));o=+F(+(x*.01745329238474369));k=(s*q+t*o)*.02500000037252903+d;l=(z*q+u*o)*.02500000037252903+e;o=(y*q+v*o)*.02500000037252903+f;if((b|0)>0){m=-1;n=0;do{do if(c[h+(n<<2)>>2]|0){if((m|0)!=-1?!(k*+g[a+(n<<4)>>2]+l*+g[a+(n<<4)+4>>2]+o*+g[a+(n<<4)+8>>2]>k*+g[a+(m<<4)>>2]+l*+g[a+(m<<4)+4>>2]+o*+g[a+(m<<4)+8>>2]):0)break;m=n}while(0);n=n+1|0}while((n|0)!=(b|0))}else m=-1;if((j|0)==(i|0)&(m|0)==(i|0))break a;b:do if(!((j|0)==-1|(j|0)==(m|0))?x+-40.0<=x:0){if((b|0)>0)q=x+-40.0;else{k=x+-40.0;while(1){if((j|0)==(i|0)&w){i=-1;break a}k=k+5.0;if(!(k<=x))break b;else j=-1}}while(1){o=q*.01745329238474369;C=+G(+o);o=+F(+o);k=(s*C+t*o)*.02500000037252903+d;l=(z*C+u*o)*.02500000037252903+e;o=(y*C+v*o)*.02500000037252903+f;n=-1;p=0;do{do if(c[h+(p<<2)>>2]|0){if((n|0)!=-1?!(k*+g[a+(p<<4)>>2]+l*+g[a+(p<<4)+4>>2]+o*+g[a+(p<<4)+8>>2]>k*+g[a+(n<<4)>>2]+l*+g[a+(n<<4)+4>>2]+o*+g[a+(n<<4)+8>>2]):0)break;n=p}while(0);p=p+1|0}while((p|0)!=(b|0));if((j|0)==(i|0)&(n|0)==(i|0))break a;q=q+5.0;if(!(q<=x))break;else j=n}}while(0);r=r+45|0;if((r|0)>360)break;else j=m}c[A>>2]=0}if((B|0)==36)return i|0;c[h+(i<<2)>>2]=3;B=i;return B|0}function Te(b,d){b=b|0;d=+d;var e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0;m=c[b+472>>2]|0;Sb[c[(c[m>>2]|0)+16>>2]&127](m,b+344|0,0);m=c[b+472>>2]|0;xb[c[(c[m>>2]|0)+12>>2]&127](m)|0;Hj(b,d);m=c[b+348>>2]|0;if((m|0)>0){f=c[b+356>>2]|0;e=0;k=0;do{l=c[(c[f+(e<<2)>>2]|0)+444>>2]|0;k=(k|0)>(l|0)?k:l;e=e+1|0}while((e|0)!=(m|0));e=0;while(1){h=c[f+(e<<2)>>2]|0;if((c[h+912>>2]|0)>0){f=0;do{l=c[(c[h+920>>2]|0)+(f<<2)>>2]|0;Mb[c[(c[l>>2]|0)+8>>2]&15](l,+g[h+512>>2],k);f=f+1|0}while((f|0)<(c[h+912>>2]|0))}e=e+1|0;if((e|0)==(m|0))break;f=c[b+356>>2]|0}if((k|0)>0){h=0;do{e=0;do{i=c[(c[b+356>>2]|0)+(e<<2)>>2]|0;j=c[i+912>>2]|0;if((j|0)>0){f=0;do{l=c[(c[i+920>>2]|0)+(f<<2)>>2]|0;Kb[c[(c[l>>2]|0)+12>>2]&7](l,+g[i+512>>2],1.0);f=f+1|0}while((f|0)!=(j|0))}e=e+1|0}while((e|0)!=(m|0));h=h+1|0}while((h|0)!=(k|0));k=0}else k=0;do{l=c[(c[b+356>>2]|0)+(k<<2)>>2]|0;if((c[l+912>>2]|0)>0){e=0;do{f=c[(c[l+920>>2]|0)+(e<<2)>>2]|0;Jb[c[(c[f>>2]|0)+16>>2]&31](f,+g[l+512>>2]);f=c[l+920>>2]|0;h=c[f+(e<<2)>>2]|0;if(a[h+152>>0]|0){if(!h)j=f;else{c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);j=c[l+920>>2]|0}i=e+-1|0;f=c[l+912>>2]|0;a:do if((f|0)>0){h=c[j+(e<<2)>>2]|0;e=0;while(1){if((c[j+(e<<2)>>2]|0)==(h|0))break a;e=e+1|0;if((e|0)>=(f|0)){e=f;break}}}else e=f;while(0);if((f|0)>(e|0)){h=j+(e<<2)|0;e=c[h>>2]|0;c[h>>2]=c[j+(f+-1<<2)>>2];c[(c[l+920>>2]|0)+(f+-1<<2)>>2]=e;c[l+912>>2]=f+-1;e=i;f=f+-1|0}else e=i}else f=c[l+912>>2]|0;e=e+1|0}while((e|0)<(f|0))}k=k+1|0}while((k|0)!=(m|0))}m=c[b+472>>2]|0;Jb[c[(c[m>>2]|0)+28>>2]&31](m,+g[m+12>>2]*d);if((c[b+348>>2]|0)<=0){b=c[b+472>>2]|0;m=c[b>>2]|0;m=m+32|0;m=c[m>>2]|0;Ib[m&511](b);return}e=0;do{m=c[(c[b+356>>2]|0)+(e<<2)>>2]|0;Wh(m,m);e=e+1|0}while((e|0)<(c[b+348>>2]|0));b=c[b+472>>2]|0;m=c[b>>2]|0;m=m+32|0;m=c[m>>2]|0;Ib[m&511](b);return}function Ue(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0;I=l;l=l+544|0;if(!a){l=I;return}f=+g[b>>2];G=+g[d>>2]-f;k=+g[b+4>>2];B=+g[d+4>>2]-k;v=+g[d+8>>2]-+g[b+8>>2];w=1.0/+D(+(G*G+B*B+v*v));x=G*w==0.0?999999984306749440.0:1.0/(G*w);y=B*w==0.0?999999984306749440.0:1.0/(B*w);z=v*w==0.0?999999984306749440.0:1.0/(v*w);c[I+32>>2]=a;p=1;o=126;h=128;r=I+32|0;i=128;u=0;while(1){s=p+-1|0;t=c[r+(s<<2)>>2]|0;c[I>>2]=c[t>>2];c[I+4>>2]=c[t+4>>2];c[I+8>>2]=c[t+8>>2];c[I+12>>2]=c[t+12>>2];c[I+16>>2]=c[t+16>>2];c[I+16+4>>2]=c[t+16+4>>2];c[I+16+8>>2]=c[t+16+8>>2];c[I+16+12>>2]=c[t+16+12>>2];n=x*(+g[I+((x<0.0&1)<<4)>>2]-f);j=x*(+g[I+((x<0.0^1)<<4)>>2]-f);m=y*(+g[I+((y<0.0&1)<<4)+4>>2]-k);f=y*(+g[I+((y<0.0^1)<<4)+4>>2]-k);do if((!(m>j|n>f)?(C=m>n?m:n,A=f>2],E=z*(+g[I+((z<0.0&1)<<4)+8>>2]-F),F=z*(+g[I+((z<0.0^1)<<4)+8>>2]-F),!(E>A|C>F)):0)?((F0.0?(E>C?E:C)>2]|0)){Ob[c[(c[e>>2]|0)+12>>2]&127](e,t);p=s;d=r;a=u;break}if((s|0)>(o|0)){q=i<<1;if((i|0)<(q|0)){do if((h|0)<(q|0)){if(i){c[6995]=(c[6995]|0)+1;d=sc((i<<3|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}if((i|0)>0){a=0;do{c[d+(a<<2)>>2]=c[r+(a<<2)>>2];a=a+1|0}while((a|0)!=(i|0));if(!(u<<24>>24)){h=q;a=1;break}}else H=15}else{d=0;H=15}if((H|0)==15){H=0;if(u<<24>>24==0|(r|0)==0){h=q;a=1;break}}c[6996]=(c[6996]|0)+1;Cd(c[r+-4>>2]|0);h=q;a=1}else{d=r;a=u}while(0);Yk(d+(i<<2)|0,0,i<<2|0)|0}else{d=r;a=u}o=q+-2|0;i=q}else{d=r;a=u}c[d+(s<<2)>>2]=c[t+36>>2];c[d+(p<<2)>>2]=c[t+40>>2];p=p+1|0}else{p=s;d=r;a=u}while(0);if(!p)break;r=d;u=a;f=+g[b>>2];k=+g[b+4>>2]}if(a<<24>>24==0|(d|0)==0){l=I;return}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);l=I;return}function Ve(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0.0,k=0.0,l=0.0,m=0,n=0.0,o=0;o=c[a+192>>2]|0;n=+nb[c[(c[o>>2]|0)+48>>2]&15](o);o=c[a+772>>2]|0;if((o|0)>0){i=0;do{m=c[a+780>>2]|0;d=m+(i*104|0)+8|0;j=+g[b>>2]*+g[d>>2];g[d>>2]=j;d=m+(i*104|0)+12|0;k=+g[b+4>>2]*+g[d>>2];g[d>>2]=k;d=m+(i*104|0)+16|0;l=+g[b+8>>2]*+g[d>>2];g[d>>2]=l;d=m+(i*104|0)+24|0;g[d>>2]=+g[b>>2]*+g[d>>2];d=m+(i*104|0)+28|0;g[d>>2]=+g[b+4>>2]*+g[d>>2];d=m+(i*104|0)+32|0;g[d>>2]=+g[b+8>>2]*+g[d>>2];m=c[m+(i*104|0)+96>>2]|0;d=Ag(a+988|0,m)|0;a:do if(d){h=c[a+996>>2]|0;if((h|0)<=-1){d=c[a+988>>2]|0;break}if(h){e=0;while(1){f=c[d+32>>2]|0;e=e+1|0;if(!f)break a;if((e|0)>=(h|0)){d=f;break}else d=f}}}else d=0;while(0);g[m>>2]=j-n;g[m+4>>2]=k-n;g[m+8>>2]=l-n;g[m+12>>2]=0.0;g[m+16>>2]=n+j;g[m+20>>2]=n+k;g[m+24>>2]=n+l;g[m+28>>2]=0.0;Pe(a+988|0,d,m);i=i+1|0}while((i|0)!=(o|0))}Eg(a);d=c[a+988>>2]|0;if(d){o=c[a+192>>2]|0;k=+nb[c[(c[o>>2]|0)+48>>2]&15](o);n=+g[d+4>>2]-k;l=+g[d+8>>2]-k;g[a+952>>2]=+g[d>>2]-k;g[a+956>>2]=n;g[a+960>>2]=l;g[a+964>>2]=0.0;l=k+ +g[d+20>>2];n=k+ +g[d+24>>2];g[a+968>>2]=k+ +g[d+16>>2];g[a+972>>2]=l;g[a+976>>2]=n;g[a+980>>2]=0.0;d=c[a+188>>2]|0;if(d|0){o=c[a+744>>2]|0;m=c[o+32>>2]|0;Zb[c[(c[m>>2]|0)+16>>2]&31](m,d,a+952|0,a+968|0,c[o+36>>2]|0)}}else{c[a+952>>2]=0;c[a+952+4>>2]=0;c[a+952+8>>2]=0;c[a+952+12>>2]=0;c[a+952+16>>2]=0;c[a+952+20>>2]=0;c[a+952+24>>2]=0;c[a+952+28>>2]=0}e=c[a+792>>2]|0;if((e|0)<=0){Vf(a);return}f=c[a+800>>2]|0;d=0;do{m=c[f+(d*52|0)+24>>2]|0;o=c[f+(d*52|0)+28>>2]|0;k=+g[m+8>>2]-+g[o+8>>2];l=+g[m+12>>2]-+g[o+12>>2];n=+g[m+16>>2]-+g[o+16>>2];n=+D(+(k*k+l*l+n*n));g[f+(d*52|0)+32>>2]=n;g[f+(d*52|0)+44>>2]=n*n;d=d+1|0}while((d|0)!=(e|0));d=0;do{g[f+(d*52|0)+40>>2]=(+g[(c[f+(d*52|0)+24>>2]|0)+88>>2]+ +g[(c[f+(d*52|0)+28>>2]|0)+88>>2])/+g[(c[f+(d*52|0)+4>>2]|0)+4>>2];d=d+1|0}while((d|0)!=(e|0));Vf(a);return}function We(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0,m=0,n=0,o=0,p=0.0,q=0;o=l;l=l+144|0;i=+g[b>>2];j=+g[b+16>>2];p=i>2];if((p+g[a+20>>2]){l=o;return}m=i>j?b:b+16|0;if(+g[(+g[m>>2]>h?m:b+32|0)>>2]<+g[a+4>>2]){l=o;return}h=+g[b+8>>2];i=+g[b+24>>2];p=h>2];if((p+g[a+28>>2]){l=o;return}m=h>i?b+8|0:b+24|0;if(+g[(+g[m>>2]>j?m:b+40|0)>>2]<+g[a+12>>2]){l=o;return}h=+g[b+4>>2];i=+g[b+20>>2];p=h>2];if((p+g[a+24>>2]){l=o;return}m=h>i?b+4|0:b+20|0;if(+g[(+g[m>>2]>j?m:b+36|0)>>2]<+g[a+8>>2]){l=o;return}m=c[a+48>>2]|0;f=c[a+36>>2]|0;if((c[(c[f+4>>2]|0)+4>>2]|0)>=20){l=o;return}c[o+24+8>>2]=0;c[o+24+12>>2]=-1;c[o+24+16>>2]=1065353216;c[o+24+20>>2]=1065353216;c[o+24+24>>2]=1065353216;g[o+24+28>>2]=0.0;c[o+24+56>>2]=0;c[o+24>>2]=3924;c[o+24+4>>2]=1;c[o+24+60>>2]=c[b>>2];c[o+24+60+4>>2]=c[b+4>>2];c[o+24+60+8>>2]=c[b+8>>2];c[o+24+60+12>>2]=c[b+12>>2];c[o+24+76>>2]=c[b+16>>2];c[o+24+76+4>>2]=c[b+16+4>>2];c[o+24+76+8>>2]=c[b+16+8>>2];c[o+24+76+12>>2]=c[b+16+12>>2];c[o+24+92>>2]=c[b+32>>2];c[o+24+92+4>>2]=c[b+32+4>>2];c[o+24+92+8>>2]=c[b+32+8>>2];c[o+24+92+12>>2]=c[b+32+12>>2];c[o+24+48>>2]=c[a+56>>2];q=c[a+40>>2]|0;k=c[q+8>>2]|0;b=c[q+12>>2]|0;c[o>>2]=q;c[o+4>>2]=o+24;c[o+8>>2]=k;c[o+12>>2]=b;c[o+16>>2]=d;c[o+20>>2]=e;b=c[(c[m>>2]|0)+8>>2]|0;if(+g[(c[a+44>>2]|0)+32>>2]>0.0)k=Db[b&1](m,f,o,0,2)|0;else k=Db[b&1](m,f,o,c[a+64>>2]|0,1)|0;f=c[a+44>>2]|0;b=c[f+8>>2]|0;if((c[b+8>>2]|0)==(c[(c[a+40>>2]|0)+8>>2]|0)){c[f+8>>2]=o;Sb[c[(c[f>>2]|0)+8>>2]&127](f,d,e)}else{b=c[f+12>>2]|0;c[f+12>>2]=o;Sb[c[(c[f>>2]|0)+12>>2]&127](f,d,e)}Zb[c[(c[k>>2]|0)+8>>2]&31](k,c[a+36>>2]|0,o,c[a+52>>2]|0,c[a+44>>2]|0);q=c[a+44>>2]|0;c[((c[(c[q+8>>2]|0)+8>>2]|0)==(c[(c[a+40>>2]|0)+8>>2]|0)?q+8|0:q+12|0)>>2]=b;Ib[c[c[k>>2]>>2]&511](k);Ob[c[(c[m>>2]|0)+60>>2]&127](m,k);c[o+24>>2]=7472;b=c[o+24+56>>2]|0;if(b|0?(Ib[c[c[b>>2]>>2]&511](b),n=c[o+24+56>>2]|0,n|0):0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}l=o;return}function Xe(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0;h=l;l=l+48|0;c[b+8>>2]=0;c[b+12>>2]=-1;g[b+16>>2]=0.0;c[b>>2]=7272;c[b+52>>2]=d;c[b+4>>2]=21;if(xb[c[(c[d>>2]|0)+40>>2]&127](d)|0)Sb[c[(c[d>>2]|0)+48>>2]&127](d,b+20|0,b+36|0);else{d=h+32+4|0;c[d>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;g[h+32>>2]=1.0;Sb[c[(c[b>>2]|0)+68>>2]&127](h+16|0,b,h+32|0);g[b+36>>2]=+g[h+16>>2]+ +g[b+16>>2];g[h+32>>2]=-1.0;Sb[c[(c[b>>2]|0)+68>>2]&127](h,b,h+32|0);c[h+16>>2]=c[h>>2];c[h+16+4>>2]=c[h+4>>2];c[h+16+8>>2]=c[h+8>>2];c[h+16+12>>2]=c[h+12>>2];g[b+20>>2]=+g[h+16>>2]-+g[b+16>>2];c[h+32>>2]=0;c[h+32+4>>2]=0;c[h+32+8>>2]=0;c[h+32+12>>2]=0;g[d>>2]=1.0;Sb[c[(c[b>>2]|0)+68>>2]&127](h+16|0,b,h+32|0);g[b+40>>2]=+g[h+16+4>>2]+ +g[b+16>>2];g[d>>2]=-1.0;Sb[c[(c[b>>2]|0)+68>>2]&127](h,b,h+32|0);c[h+16>>2]=c[h>>2];c[h+16+4>>2]=c[h+4>>2];c[h+16+8>>2]=c[h+8>>2];c[h+16+12>>2]=c[h+12>>2];g[b+24>>2]=+g[h+16+4>>2]-+g[b+16>>2];c[h+32>>2]=0;c[h+32+4>>2]=0;c[h+32+8>>2]=0;c[h+32+12>>2]=0;g[h+32+8>>2]=1.0;Sb[c[(c[b>>2]|0)+68>>2]&127](h+16|0,b,h+32|0);g[b+44>>2]=+g[h+16+8>>2]+ +g[b+16>>2];g[h+32+8>>2]=-1.0;Sb[c[(c[b>>2]|0)+68>>2]&127](h,b,h+32|0);c[h+16>>2]=c[h>>2];c[h+16+4>>2]=c[h+4>>2];c[h+16+8>>2]=c[h+8>>2];c[h+16+12>>2]=c[h+12>>2];g[b+28>>2]=+g[h+16+8>>2]-+g[b+16>>2]}c[b>>2]=7120;c[b+56>>2]=0;c[b+60>>2]=0;a[b+64>>0]=e&1;a[b+65>>0]=0;c[b+4>>2]=21;if(!f){l=h;return}c[6995]=(c[6995]|0)+1;d=sc(191)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}c[d+52>>2]=287;a[d+60>>0]=0;a[d+80>>0]=1;c[d+76>>2]=0;c[d+68>>2]=0;c[d+72>>2]=0;a[d+100>>0]=1;c[d+96>>2]=0;c[d+88>>2]=0;c[d+92>>2]=0;a[d+120>>0]=1;c[d+116>>2]=0;c[d+108>>2]=0;c[d+112>>2]=0;a[d+140>>0]=1;c[d+136>>2]=0;c[d+128>>2]=0;c[d+132>>2]=0;c[d+144>>2]=0;a[d+164>>0]=1;c[d+160>>2]=0;c[d+152>>2]=0;c[d+156>>2]=0;c[d+168>>2]=0;c[d+4>>2]=-8388609;c[d+8>>2]=-8388609;c[d+12>>2]=-8388609;g[d+16>>2]=0.0;c[d+20>>2]=2139095039;c[d+24>>2]=2139095039;c[d+28>>2]=2139095039;g[d+32>>2]=0.0;c[d>>2]=8324;c[b+56>>2]=d;dd(d,c[b+52>>2]|0,(a[b+64>>0]|0)!=0,b+20|0,b+36|0);a[b+65>>0]=1;l=h;return}function Ye(a,b,d,e,f){a=a|0;b=b|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;if(!b)if(!e){if(f|0){c[f>>2]=(a>>>0)%(d>>>0);c[f+4>>2]=0}e=0;f=(a>>>0)/(d>>>0)>>>0;return (A=e,f)|0}else{if(!f){e=0;f=0;return (A=e,f)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;e=0;f=0;return (A=e,f)|0}do if(d){if(e|0){h=(S(e|0)|0)-(S(b|0)|0)|0;if(h>>>0<=31){n=h+1|0;i=a>>>((h+1|0)>>>0)&h-31>>31|b<<31-h;m=b>>>((h+1|0)>>>0)&h-31>>31;g=0;h=a<<31-h;break}if(!f){e=0;f=0;return (A=e,f)|0}c[f>>2]=a|0;c[f+4>>2]=b|b&0;e=0;f=0;return (A=e,f)|0}if(d-1&d|0){h=(S(d|0)|0)+33-(S(b|0)|0)|0;n=h;i=32-h-1>>31&b>>>((h-32|0)>>>0)|(b<<32-h|a>>>(h>>>0))&h-32>>31;m=h-32>>31&b>>>(h>>>0);g=a<<64-h&32-h>>31;h=(b<<64-h|a>>>((h-32|0)>>>0))&32-h>>31|a<<32-h&h-33>>31;break}if(f|0){c[f>>2]=d-1&a;c[f+4>>2]=0}if((d|0)==1){e=b|b&0;f=a|0|0;return (A=e,f)|0}else{f=tq(d|0)|0;e=b>>>(f>>>0)|0;f=b<<32-f|a>>>(f>>>0)|0;return (A=e,f)|0}}else{if(!e){if(f|0){c[f>>2]=(b>>>0)%(d>>>0);c[f+4>>2]=0}e=0;f=(b>>>0)/(d>>>0)>>>0;return (A=e,f)|0}if(!a){if(f|0){c[f>>2]=0;c[f+4>>2]=(b>>>0)%(e>>>0)}d=0;f=(b>>>0)/(e>>>0)>>>0;return (A=d,f)|0}if(!(e-1&e)){if(f|0){c[f>>2]=a|0;c[f+4>>2]=e-1&b|b&0}d=0;f=b>>>((tq(e|0)|0)>>>0);return (A=d,f)|0}h=(S(e|0)|0)-(S(b|0)|0)|0;if(h>>>0<=30){n=h+1|0;i=b<<31-h|a>>>((h+1|0)>>>0);m=b>>>((h+1|0)>>>0);g=0;h=a<<31-h;break}if(!f){e=0;f=0;return (A=e,f)|0}c[f>>2]=a|0;c[f+4>>2]=b|b&0;e=0;f=0;return (A=e,f)|0}while(0);if(!n){j=h;b=m;a=0;h=0}else{k=Ow(d|0|0,e|e&0|0,-1,-1)|0;l=A;j=h;b=m;a=n;h=0;do{p=j;j=g>>>31|j<<1;g=h|g<<1;p=i<<1|p>>>31|0;o=i>>>31|b<<1|0;sw(k|0,l|0,p|0,o|0)|0;n=A;m=n>>31|((n|0)<0?-1:0)<<1;h=m&1;i=sw(p|0,o|0,m&(d|0)|0,(((n|0)<0?-1:0)>>31|((n|0)<0?-1:0)<<1)&(e|e&0)|0)|0;b=A;a=a-1|0}while((a|0)!=0);a=0}if(f|0){c[f>>2]=i;c[f+4>>2]=b}o=(g|0)>>>31|j<<1|(0<<1|g>>>31)&0|a;p=(g<<1|0>>>31)&-2|h;return (A=o,p)|0}function Ze(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0;j=l;l=l+64|0;k=(a[b+76>>0]|0)!=0;i=k?e:d;d=k?d:e;e=c[d+4>>2]|0;if(((c[e+4>>2]|0)+-21|0)>>>0>=9){l=j;return}if((c[(c[i+4>>2]|0)+4>>2]|0)>=20){l=j;return}m=+nb[c[(c[e>>2]|0)+48>>2]&15](e);c[h+4>>2]=c[b+72>>2];c[b+44>>2]=i;c[b+48>>2]=d;c[b+60>>2]=f;g[b+64>>2]=m;c[b+52>>2]=h;k=c[d+12>>2]|0;B=+g[k>>2];A=+g[k+16>>2];z=+g[k+32>>2];y=+g[k+4>>2];x=+g[k+20>>2];w=+g[k+36>>2];s=+g[k+8>>2];q=+g[k+24>>2];o=+g[k+40>>2];v=-+g[k+48>>2];u=-+g[k+52>>2];t=-+g[k+56>>2];k=c[i+12>>2]|0;K=+g[k>>2];J=+g[k+16>>2];I=+g[k+32>>2];H=+g[k+4>>2];G=+g[k+20>>2];F=+g[k+36>>2];E=+g[k+8>>2];D=+g[k+24>>2];C=+g[k+40>>2];r=+g[k+48>>2];p=+g[k+52>>2];n=+g[k+56>>2];g[j>>2]=B*K+A*J+z*I;g[j+4>>2]=B*H+A*G+z*F;g[j+8>>2]=B*E+A*D+z*C;g[j+12>>2]=0.0;g[j+16>>2]=y*K+x*J+w*I;g[j+20>>2]=y*H+x*G+w*F;g[j+24>>2]=y*E+x*D+w*C;g[j+28>>2]=0.0;g[j+32>>2]=s*K+q*J+o*I;g[j+36>>2]=s*H+q*G+o*F;g[j+40>>2]=s*E+q*D+o*C;g[j+44>>2]=0.0;g[j+48>>2]=B*v+A*u+z*t+(B*r+A*p+z*n);g[j+52>>2]=y*v+x*u+w*t+(y*r+x*p+w*n);g[j+56>>2]=s*v+q*u+o*t+(s*r+q*p+o*n);g[j+60>>2]=0.0;k=c[(c[b+44>>2]|0)+4>>2]|0;Vb[c[(c[k>>2]|0)+8>>2]&127](k,j,b+12|0,b+28|0);m=+g[h+32>>2]+m;g[b+28>>2]=m+ +g[b+28>>2];g[b+32>>2]=m+ +g[b+32>>2];g[b+36>>2]=m+ +g[b+36>>2];g[b+12>>2]=+g[b+12>>2]-m;g[b+16>>2]=+g[b+16>>2]-m;g[b+20>>2]=+g[b+20>>2]-m;k=c[b+72>>2]|0;f=c[d+8>>2]|0;c[k+772>>2]=c[i+8>>2];c[k+776>>2]=f;Vb[c[(c[e>>2]|0)+64>>2]&127](e,b+8|0,b+12|0,b+28|0);e=c[h+4>>2]|0;do if(c[e+780>>2]|0){f=c[e+772>>2]|0;i=c[(c[h+8>>2]|0)+8>>2]|0;d=c[(c[h+12>>2]|0)+8>>2]|0;if((f|0)==(i|0)){af(e,f+4|0,d+4|0);break}else{af(e,d+4|0,i+4|0);break}}while(0);c[b+44>>2]=0;c[b+48>>2]=0;l=j;return}function _e(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0;k=l;l=l+128|0;a=c[a+20>>2]|0;n=+g[a+952>>2];x=+g[a+956>>2];v=+g[a+960>>2];w=+g[a+968>>2];f=+g[a+972>>2];i=+g[a+976>>2];z=+g[b>>2];m=+g[b+4>>2];p=v*+g[b+8>>2];q=+g[b+16>>2];r=+g[b+20>>2];t=v*+g[b+24>>2];u=+g[b+32>>2];o=+g[b+36>>2];s=+g[b+40>>2];y=+g[b+48>>2];j=+g[b+52>>2];h=+g[b+56>>2];g[k>>2]=n*z+x*m+p+y;g[k+4>>2]=n*q+x*r+t+j;g[k+8>>2]=n*u+x*o+v*s+h;g[k+12>>2]=0.0;g[k+16>>2]=w*z+x*m+p+y;g[k+20>>2]=w*q+x*r+t+j;g[k+24>>2]=w*u+x*o+v*s+h;g[k+28>>2]=0.0;g[k+32>>2]=w*z+f*m+p+y;g[k+36>>2]=w*q+f*r+t+j;g[k+40>>2]=w*u+f*o+v*s+h;g[k+44>>2]=0.0;g[k+48>>2]=n*z+f*m+p+y;g[k+52>>2]=n*q+f*r+t+j;g[k+56>>2]=n*u+f*o+v*s+h;g[k+60>>2]=0.0;v=+g[b>>2];u=+g[b+4>>2];t=i*+g[b+8>>2];r=+g[b+16>>2];q=+g[b+20>>2];p=i*+g[b+24>>2];m=+g[b+32>>2];g[k+64>>2]=n*v+x*u+t+y;g[k+68>>2]=n*r+x*q+p+j;g[k+72>>2]=n*m+x*o+i*s+h;g[k+76>>2]=0.0;h=+g[b+36>>2];i=i*+g[b+40>>2];s=+g[b+48>>2];o=+g[b+52>>2];j=+g[b+56>>2];g[k+80>>2]=w*v+x*u+t+s;g[k+84>>2]=w*r+x*q+p+o;g[k+88>>2]=w*m+x*h+i+j;g[k+92>>2]=0.0;g[k+96>>2]=w*v+f*u+t+s;g[k+100>>2]=w*r+f*q+p+o;g[k+104>>2]=w*m+f*h+i+j;g[k+108>>2]=0.0;g[k+112>>2]=n*v+f*u+t+s;g[k+116>>2]=n*r+f*q+p+o;g[k+120>>2]=n*m+f*h+i+j;g[k+124>>2]=0.0;c[e>>2]=c[k>>2];c[e+4>>2]=c[k+4>>2];c[e+8>>2]=c[k+8>>2];c[e+12>>2]=c[k+12>>2];c[d>>2]=c[k>>2];c[d+4>>2]=c[k+4>>2];c[d+8>>2]=c[k+8>>2];c[d+12>>2]=c[k+12>>2];a=1;do{f=+g[k+(a<<4)>>2];if(f<+g[d>>2])g[d>>2]=f;h=+g[k+(a<<4)+4>>2];if(h<+g[d+4>>2])g[d+4>>2]=h;i=+g[k+(a<<4)+8>>2];if(i<+g[d+8>>2])g[d+8>>2]=i;j=+g[k+(a<<4)+12>>2];if(j<+g[d+12>>2])g[d+12>>2]=j;if(+g[e>>2]>2]=f;if(+g[e+4>>2]>2]=h;if(+g[e+8>>2]>2]=i;if(+g[e+12>>2]>2]=j;a=a+1|0}while((a|0)!=8);l=k;return}function $e(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;var f=0,h=0.0,i=0.0,j=0.0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0.0,y=0.0,z=0;n=l;l=l+192|0;m=c[(c[a+4>>2]|0)+772>>2]|0;k=c[(c[a+8>>2]|0)+8>>2]|0;y=+g[d>>2];h=+g[b>>2]*e+y;x=+g[d+4>>2];i=+g[b+4>>2]*e+x;o=+g[d+8>>2];j=+g[b+8>>2]*e+o;w=c[(c[a+12>>2]|0)+8>>2]|0;f=(m|0)!=(k|0)?w:m;w=(m|0)!=(k|0)?k:w;v=h-+g[f+52>>2];u=i-+g[f+56>>2];t=j-+g[f+60>>2];s=v*+g[f+8>>2]+u*+g[f+24>>2]+t*+g[f+40>>2];r=v*+g[f+12>>2]+u*+g[f+28>>2]+t*+g[f+44>>2];y=y-+g[w+52>>2];x=x-+g[w+56>>2];o=o-+g[w+60>>2];q=y*+g[w+4>>2]+x*+g[w+20>>2]+o*+g[w+36>>2];p=y*+g[w+8>>2]+x*+g[w+24>>2]+o*+g[w+40>>2];o=y*+g[w+12>>2]+x*+g[w+28>>2]+o*+g[w+44>>2];g[n>>2]=v*+g[f+4>>2]+u*+g[f+20>>2]+t*+g[f+36>>2];g[n+4>>2]=s;g[n+8>>2]=r;g[n+12>>2]=0.0;g[n+16>>2]=q;g[n+20>>2]=p;g[n+24>>2]=o;g[n+28>>2]=0.0;c[n+64>>2]=c[b>>2];c[n+64+4>>2]=c[b+4>>2];c[n+64+8>>2]=c[b+8>>2];c[n+64+12>>2]=c[b+12>>2];g[n+80>>2]=e;c[n+84>>2]=0;c[n+84+4>>2]=0;c[n+84+8>>2]=0;c[n+84+12>>2]=0;b=n+116|0;f=b+44|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(f|0));g[n+48>>2]=h;g[n+52>>2]=i;g[n+56>>2]=j;g[n+60>>2]=0.0;c[n+32>>2]=c[d>>2];c[n+32+4>>2]=c[d+4>>2];c[n+32+8>>2]=c[d+8>>2];c[n+32+12>>2]=c[d+12>>2];b=c[a+16>>2]|0;f=c[a+20>>2]|0;if((m|0)!=(k|0)){c[n+100>>2]=f;z=a+28|0;d=b;w=a+24|0;b=f;f=c[z>>2]|0;z=n+104|0;c[z>>2]=d;z=n+108|0;c[z>>2]=f;w=c[w>>2]|0;z=n+112|0;c[z>>2]=w;z=(m|0)!=(k|0)?a+12|0:a+8|0;z=c[z>>2]|0;m=(m|0)!=(k|0)?a+8|0:a+12|0;m=c[m>>2]|0;k=a+36|0;k=c[k>>2]|0;a=c[k>>2]|0;a=a+12|0;a=c[a>>2]|0;+ub[a&1](k,n,z,b,f,m,d,w);l=n;return}else{c[n+100>>2]=b;d=a+24|0;w=f;z=a+28|0;f=b;d=c[d>>2]|0;b=n+104|0;c[b>>2]=w;b=n+108|0;c[b>>2]=d;z=c[z>>2]|0;b=n+112|0;c[b>>2]=z;b=(m|0)!=(k|0)?a+12|0:a+8|0;b=c[b>>2]|0;m=(m|0)!=(k|0)?a+8|0:a+12|0;m=c[m>>2]|0;k=a+36|0;k=c[k>>2]|0;a=c[k>>2]|0;a=a+12|0;a=c[a>>2]|0;+ub[a&1](k,n,b,f,d,m,w,z);l=n;return}}function af(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0;e=c[a+780>>2]|0;if((e|0)<=0)return;do{j=e;e=e+-1|0;p=+g[a+4+(e*192|0)>>2];q=+g[a+4+(e*192|0)+4>>2];f=+g[a+4+(e*192|0)+8>>2];o=p*+g[b>>2]+q*+g[b+4>>2]+f*+g[b+8>>2]+ +g[b+48>>2];m=p*+g[b+16>>2]+q*+g[b+20>>2]+f*+g[b+24>>2]+ +g[b+52>>2];f=p*+g[b+32>>2]+q*+g[b+36>>2]+f*+g[b+40>>2]+ +g[b+56>>2];g[a+4+(e*192|0)+48>>2]=o;g[a+4+(e*192|0)+52>>2]=m;g[a+4+(e*192|0)+56>>2]=f;g[a+4+(e*192|0)+60>>2]=0.0;q=+g[a+4+(e*192|0)+16>>2];p=+g[a+4+(e*192|0)+20>>2];h=+g[a+4+(e*192|0)+24>>2];n=q*+g[d>>2]+p*+g[d+4>>2]+h*+g[d+8>>2]+ +g[d+48>>2];l=q*+g[d+16>>2]+p*+g[d+20>>2]+h*+g[d+24>>2]+ +g[d+52>>2];h=q*+g[d+32>>2]+p*+g[d+36>>2]+h*+g[d+40>>2]+ +g[d+56>>2];g[a+4+(e*192|0)+32>>2]=n;g[a+4+(e*192|0)+36>>2]=l;g[a+4+(e*192|0)+40>>2]=h;g[a+4+(e*192|0)+44>>2]=0.0;g[a+4+(e*192|0)+80>>2]=(o-n)*+g[a+4+(e*192|0)+64>>2]+(m-l)*+g[a+4+(e*192|0)+68>>2]+(f-h)*+g[a+4+(e*192|0)+72>>2];i=a+4+(e*192|0)+156|0;c[i>>2]=(c[i>>2]|0)+1}while((j|0)>1);e=c[a+780>>2]|0;if((e|0)<=0)return;j=e;do{i=j;j=j+-1|0;d=a+4+(j*192|0)|0;f=+g[a+4+(j*192|0)+80>>2];h=+g[a+784>>2];if(!(f<=h)){b=e+-1|0;if((b|0)==(j|0))k=12;else{gi(d|0,a+4+(b*192|0)|0,192)|0;c[a+4+(b*192|0)+156>>2]=0;c[a+4+(b*192|0)+116>>2]=0;c[a+4+(b*192|0)+116+4>>2]=0;c[a+4+(b*192|0)+116+8>>2]=0;c[a+4+(b*192|0)+116+12>>2]=0;c[a+4+(b*192|0)+116+16>>2]=0;e=c[a+780>>2]|0;k=12}}else{o=+g[a+4+(j*192|0)+32>>2]-(+g[a+4+(j*192|0)+48>>2]-+g[a+4+(j*192|0)+64>>2]*f);p=+g[a+4+(j*192|0)+36>>2]-(+g[a+4+(j*192|0)+52>>2]-f*+g[a+4+(j*192|0)+68>>2]);q=+g[a+4+(j*192|0)+40>>2]-(+g[a+4+(j*192|0)+56>>2]-f*+g[a+4+(j*192|0)+72>>2]);if(o*o+p*p+q*q>h*h){b=e+-1|0;if((b|0)==(j|0))k=12;else{gi(d|0,a+4+(b*192|0)|0,192)|0;c[a+4+(b*192|0)+156>>2]=0;c[a+4+(b*192|0)+116>>2]=0;c[a+4+(b*192|0)+116+4>>2]=0;c[a+4+(b*192|0)+116+8>>2]=0;c[a+4+(b*192|0)+116+12>>2]=0;c[a+4+(b*192|0)+116+16>>2]=0;e=c[a+780>>2]|0;k=12}}}if((k|0)==12){k=0;e=e+-1|0;c[a+780>>2]=e}}while((i|0)>1);return} +function Gc(b,d){b=b|0;d=+d;var e=0,f=0.0,h=0,i=0,j=0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0;s=l;l=l+96|0;p=c[b+128>>2]|0;if(!p){l=s;return}e=c[b+8>>2]|0;if((e|0)<(p|0)){if((c[b+12>>2]|0)<(p|0)){c[6995]=(c[6995]|0)+1;h=sc((p<<4|3)+16|0)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}i=c[b+8>>2]|0;if((i|0)>0){h=0;do{n=j+(h<<4)|0;t=(c[b+16>>2]|0)+(h<<4)|0;c[n>>2]=c[t>>2];c[n+4>>2]=c[t+4>>2];c[n+8>>2]=c[t+8>>2];c[n+12>>2]=c[t+12>>2];h=h+1|0}while((h|0)!=(i|0))}h=c[b+16>>2]|0;if(h|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=j;c[b+12>>2]=p;h=b+16|0}else h=b+16|0;do{t=(c[h>>2]|0)+(e<<4)|0;c[t>>2]=c[s+48>>2];c[t+4>>2]=c[s+48+4>>2];c[t+8>>2]=c[s+48+8>>2];c[t+12>>2]=c[s+48+12>>2];e=e+1|0}while((e|0)!=(p|0))}c[b+8>>2]=p;e=c[b+28>>2]|0;if((e|0)<(p|0)){if((c[b+32>>2]|0)<(p|0)){c[6995]=(c[6995]|0)+1;h=sc((p<<4|3)+16|0)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}i=c[b+28>>2]|0;if((i|0)>0){h=0;do{t=j+(h<<4)|0;n=(c[b+36>>2]|0)+(h<<4)|0;c[t>>2]=c[n>>2];c[t+4>>2]=c[n+4>>2];c[t+8>>2]=c[n+8>>2];c[t+12>>2]=c[n+12>>2];h=h+1|0}while((h|0)!=(i|0))}h=c[b+36>>2]|0;if(h|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=j;c[b+32>>2]=p;h=b+36|0}else h=b+36|0;do{t=(c[h>>2]|0)+(e<<4)|0;c[t>>2]=c[s+48>>2];c[t+4>>2]=c[s+48+4>>2];c[t+8>>2]=c[s+48+8>>2];c[t+12>>2]=c[s+48+12>>2];e=e+1|0}while((e|0)!=(p|0))}c[b+28>>2]=p;n=c[b+48>>2]|0;if((n|0)<(p|0)){if((c[b+52>>2]|0)<(p|0)){c[6995]=(c[6995]|0)+1;e=sc((p<<2|3)+16|0)|0;if(!e)j=0;else{c[(e+4+15&-16)+-4>>2]=e;j=e+4+15&-16}h=c[b+48>>2]|0;i=c[b+56>>2]|0;if((h|0)<=0)if(!i)e=b+60|0;else o=39;else{e=0;do{c[j+(e<<2)>>2]=c[i+(e<<2)>>2];e=e+1|0}while((e|0)!=(h|0));o=39}if((o|0)==39)if(!(a[b+60>>0]|0))e=b+60|0;else{c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);e=b+60|0}a[e>>0]=1;c[b+56>>2]=j;c[b+52>>2]=p;h=p<<2;e=j}else{h=p<<2;e=c[b+56>>2]|0}Yk(e+(n<<2)|0,0,h-(n<<2)|0)|0}c[b+48>>2]=p;n=c[b+68>>2]|0;if((n|0)<(p|0)){if((c[b+72>>2]|0)<(p|0)){c[6995]=(c[6995]|0)+1;e=sc((p<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}i=c[b+68>>2]|0;j=c[b+76>>2]|0;if((i|0)<=0)if(!j)h=b+80|0;else o=52;else{h=0;do{c[e+(h<<2)>>2]=c[j+(h<<2)>>2];h=h+1|0}while((h|0)!=(i|0));o=52}if((o|0)==52)if(!(a[b+80>>0]|0))h=b+80|0;else{c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);h=b+80|0}a[h>>0]=1;c[b+76>>2]=e;c[b+72>>2]=p;h=p<<2}else{h=p<<2;e=c[b+76>>2]|0}Yk(e+(n<<2)|0,0,h-(n<<2)|0)|0}c[b+68>>2]=p;e=c[b+128>>2]|0;if((e|0)<=0){l=s;return}i=c[b+76>>2]|0;j=c[b+56>>2]|0;h=0;do{g[i+(h<<2)>>2]=0.0;g[j+(h<<2)>>2]=0.0;h=h+1|0}while((h|0)!=(e|0));j=0;do{h=c[b+136>>2]|0;i=c[h+(j*284|0)+88>>2]|0;if(i){n=h+(j*284|0)+92|0;c[s+48>>2]=c[n>>2];c[s+48+4>>2]=c[n+4>>2];c[s+48+8>>2]=c[n+8>>2];c[s+48+12>>2]=c[n+12>>2];n=h+(j*284|0)+108|0;c[s+48+16>>2]=c[n>>2];c[s+48+16+4>>2]=c[n+4>>2];c[s+48+16+8>>2]=c[n+8>>2];c[s+48+16+12>>2]=c[n+12>>2];n=h+(j*284|0)+124|0;c[s+48+32>>2]=c[n>>2];c[s+48+32+4>>2]=c[n+4>>2];c[s+48+32+8>>2]=c[n+8>>2];c[s+48+32+12>>2]=c[n+12>>2];n=c[b+112>>2]|0;e=c[s+48+16+(n<<2)>>2]|0;y=c[s+48+32+(n<<2)>>2]|0;o=c[b+36>>2]|0;c[o+(j<<4)>>2]=c[s+48+(n<<2)>>2];c[o+(j<<4)+4>>2]=e;c[o+(j<<4)+8>>2]=y;g[o+(j<<4)+12>>2]=0.0;o=c[b+36>>2]|0;y=o+(j<<4)|0;z=+g[y>>2];e=h+(j*284|0)|0;f=+g[e>>2];n=o+(j<<4)+4|0;x=+g[n>>2];t=h+(j*284|0)+4|0;k=+g[t>>2];o=o+(j<<4)+8|0;u=+g[o>>2];p=h+(j*284|0)+8|0;w=+g[p>>2];m=z-f*(z*f+x*k+u*w);v=x-k*(z*f+x*k+u*w);w=u-w*(z*f+x*k+u*w);u=1.0/+D(+(m*m+v*v+w*w));g[y>>2]=m*u;g[n>>2]=v*u;g[o>>2]=w*u;k=+g[t>>2];x=+g[p>>2];f=+g[e>>2];e=c[b+16>>2]|0;g[e+(j<<4)>>2]=k*w*u-x*v*u;g[e+(j<<4)+4>>2]=x*m*u-w*u*f;g[e+(j<<4)+8>>2]=v*u*f-k*m*u;g[e+(j<<4)+12>>2]=0.0;e=c[b+16>>2]|0;p=e+(j<<4)|0;u=+g[p>>2];t=e+(j<<4)+4|0;m=+g[t>>2];e=e+(j<<4)+8|0;k=+g[e>>2];f=1.0/+D(+(u*u+m*m+k*k));g[p>>2]=u*f;g[t>>2]=m*f;g[e>>2]=k*f;e=c[b+108>>2]|0;t=c[b+36>>2]|0;f=+g[t+(j<<4)>>2];k=+g[t+(j<<4)+4>>2];m=+g[t+(j<<4)+8>>2];if(f*f+k*k+m*m>1.100000023841858)f=0.0;else{C=+g[h+(j*284|0)+16>>2];H=C-+g[e+52>>2];F=+g[h+(j*284|0)+20>>2];J=F-+g[e+56>>2];K=+g[h+(j*284|0)+24>>2];M=K-+g[e+60>>2];C=C-+g[i+52>>2];F=F-+g[i+56>>2];K=K-+g[i+60>>2];G=+g[e+392>>2];N=+g[e+396>>2];I=+g[e+388>>2];B=+g[i+392>>2];L=+g[i+396>>2];E=+g[i+388>>2];A=(m*J-k*M)*+g[e+4>>2]+(f*M-m*H)*+g[e+20>>2]+(k*H-f*J)*+g[e+36>>2];u=(m*J-k*M)*+g[e+8>>2]+(f*M-m*H)*+g[e+24>>2]+(k*H-f*J)*+g[e+40>>2];v=(m*J-k*M)*+g[e+12>>2]+(f*M-m*H)*+g[e+28>>2]+(k*H-f*J)*+g[e+44>>2];w=(F*-m-K*-k)*+g[i+4>>2]+(K*-f-C*-m)*+g[i+20>>2]+(C*-k-F*-f)*+g[i+36>>2];x=(F*-m-K*-k)*+g[i+8>>2]+(K*-f-C*-m)*+g[i+24>>2]+(C*-k-F*-f)*+g[i+40>>2];z=(F*-m-K*-k)*+g[i+12>>2]+(K*-f-C*-m)*+g[i+28>>2]+(C*-k-F*-f)*+g[i+44>>2];f=(f*(M*G-J*N+ +g[e+372>>2]-(K*B-F*L+ +g[i+372>>2]))+k*(+g[e+376>>2]+(H*N-M*I)-(+g[i+376>>2]+(C*L-K*E)))+m*(J*I-H*G+ +g[e+380>>2]-(F*E-C*B+ +g[i+380>>2])))*-.20000000298023224*(1.0/(+g[i+404>>2]+(+g[e+404>>2]+(A*A*+g[e+456>>2]+u*u*+g[e+460>>2]+v*v*+g[e+464>>2]))+(w*w*+g[i+456>>2]+x*x*+g[i+460>>2]+z*z*+g[i+464>>2])))}g[(c[b+76>>2]|0)+(j<<2)>>2]=f;e=c[b+128>>2]|0}j=j+1|0}while((j|0)<(e|0));if((e|0)<=0){l=s;return}i=0;o=0;h=c[b+136>>2]|0;while(1){e=c[h+(o*284|0)+88>>2]|0;if(e){f=+g[h+(o*284|0)+252>>2];if(f!=0.0){f=f*d;p=h}else{N=+g[h+(o*284|0)+256>>2];N=N==0.0?0.0:N;p=c[b+108>>2]|0;y=c[b+16>>2]|0;H=+g[h+(o*284|0)+16>>2];F=+g[h+(o*284|0)+20>>2];A=+g[h+(o*284|0)+24>>2];x=+g[y+(o<<4)>>2];E=+g[y+(o<<4)+4>>2];f=+g[y+(o<<4)+8>>2];P=H-+g[p+52>>2];Q=F-+g[p+56>>2];k=A-+g[p+60>>2];m=+g[p+324>>2]*(Q*f-k*E)+ +g[p+340>>2]*(k*x-P*f)+(P*E-Q*x)*+g[p+356>>2];R=(Q*f-k*E)*+g[p+328>>2]+(k*x-P*f)*+g[p+344>>2]+(P*E-Q*x)*+g[p+360>>2];O=(Q*f-k*E)*+g[p+332>>2]+(k*x-P*f)*+g[p+348>>2]+(P*E-Q*x)*+g[p+364>>2];L=H-+g[e+52>>2];J=F-+g[e+56>>2];C=A-+g[e+60>>2];w=(E*L-x*J)*+g[e+356>>2]+(+g[e+324>>2]*(f*J-E*C)+ +g[e+340>>2]*(x*C-f*L));u=(f*J-E*C)*+g[e+328>>2]+(x*C-f*L)*+g[e+344>>2]+(E*L-x*J)*+g[e+360>>2];v=(f*J-E*C)*+g[e+332>>2]+(x*C-f*L)*+g[e+348>>2]+(E*L-x*J)*+g[e+364>>2];H=H-+g[p+52>>2];F=F-+g[p+56>>2];A=A-+g[p+60>>2];I=+g[p+392>>2];z=+g[p+396>>2];G=+g[p+388>>2];M=+g[e+392>>2];B=+g[e+396>>2];K=+g[e+388>>2];f=-(1.0/(+g[p+404>>2]+(f*(Q*m-P*R)+(x*(k*R-Q*O)+E*(P*O-k*m)))+(+g[e+404>>2]+(f*(J*w-L*u)+(x*(C*u-J*v)+E*(L*v-C*w)))))*((A*I-F*z+ +g[p+372>>2]-(C*M-J*B+ +g[e+372>>2]))*x+(+g[p+376>>2]+(H*z-A*G)-(+g[e+376>>2]+(L*B-C*K)))*E+(F*G-H*I+ +g[p+380>>2]-(J*K-L*M+ +g[e+380>>2]))*f));f=N>2]|0}n=c[b+56>>2]|0;y=n+(o<<2)|0;g[y>>2]=0.0;e=p+(o*284|0)+280|0;g[e>>2]=1.0;m=+g[h+(o*284|0)+276>>2]*d*+g[h+(o*284|0)+228>>2];g[y>>2]=f;f=f*.5;k=+g[(c[b+76>>2]|0)+(o<<2)>>2];if(f*f+k*k>m*m){R=m/+D(+(f*f+k*k));g[e>>2]=R*+g[e>>2];e=1}else e=i}else{n=c[b+56>>2]|0;g[n+(o<<2)>>2]=0.0;g[h+(o*284|0)+280>>2]=1.0;e=i;p=h}o=o+1|0;j=c[b+128>>2]|0;if((o|0)>=(j|0))break;else{i=e;h=p}}if(e){if((j|0)<=0){l=s;return}h=c[b+76>>2]|0;e=0;do{i=h+(e<<2)|0;if(+g[i>>2]!=0.0?(q=p+(e*284|0)+280|0,r=+g[q>>2],r<1.0):0){y=n+(e<<2)|0;g[y>>2]=r*+g[y>>2];g[i>>2]=+g[q>>2]*+g[i>>2]}e=e+1|0}while((e|0)!=(j|0))}if((j|0)<=0){l=s;return}e=0;h=n;while(1){i=c[b+108>>2]|0;j=p+(e*284|0)+16|0;k=+g[j>>2]-+g[i+52>>2];n=p+(e*284|0)+20|0;m=+g[n>>2]-+g[i+56>>2];o=p+(e*284|0)+24|0;d=+g[o>>2]-+g[i+60>>2];g[s+48>>2]=k;g[s+48+4>>2]=m;g[s+48+8>>2]=d;g[s+48+12>>2]=0.0;f=+g[h+(e<<2)>>2];if(f!=0.0){y=c[b+16>>2]|0;Q=f*+g[y+(e<<4)+4>>2];R=f*+g[y+(e<<4)+8>>2];g[s+32>>2]=+g[y+(e<<4)>>2]*f;g[s+32+4>>2]=Q;g[s+32+8>>2]=R;g[s+32+12>>2]=0.0;ll(i,s+32|0,s+48|0)}f=+g[(c[b+76>>2]|0)+(e<<2)>>2];if(f!=0.0){y=c[(c[b+136>>2]|0)+(e*284|0)+88>>2]|0;Q=+g[n>>2]-+g[y+56>>2];P=+g[o>>2]-+g[y+60>>2];g[s+32>>2]=+g[j>>2]-+g[y+52>>2];g[s+32+4>>2]=Q;g[s+32+8>>2]=P;g[s+32+12>>2]=0.0;t=c[b+36>>2]|0;P=+g[t+(e<<4)>>2]*f;Q=f*+g[t+(e<<4)+4>>2];R=f*+g[t+(e<<4)+8>>2];g[s+16>>2]=P;g[s+16+4>>2]=Q;g[s+16+8>>2]=R;g[s+16+12>>2]=0.0;t=c[b+108>>2]|0;q=c[b+116>>2]|0;L=+g[t+4+(q<<2)>>2];M=+g[t+20+(q<<2)>>2];N=+g[t+36+(q<<2)>>2];O=(L*k+M*m+N*d)*(1.0-+g[p+(e*284|0)+244>>2]);g[s+48>>2]=k-L*O;g[s+48+4>>2]=m-M*O;g[s+48+8>>2]=d-N*O;ll(t,s+16|0,s+48|0);g[s>>2]=-P;g[s+4>>2]=-Q;g[s+8>>2]=-R;g[s+12>>2]=0.0;ll(y,s,s+32|0)}e=e+1|0;if((e|0)>=(c[b+128>>2]|0))break;p=c[b+136>>2]|0;h=c[b+56>>2]|0}l=s;return}function Hc(b,e,f,h,i,j,k){b=b|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;var m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0.0,t=0,u=0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0;v=l;l=l+19040|0;p=j;q=p+36|0;do{c[p>>2]=0;p=p+4|0}while((p|0)<(q|0));c[v+18896>>2]=b;c[v+18896+4>>2]=f;x=+g[h>>2];K=+g[e>>2];y=+g[h+16>>2];A=+g[e+16>>2];z=+g[h+32>>2];L=+g[e+32>>2];B=+g[e+4>>2];M=+g[e+20>>2];C=+g[e+36>>2];s=+g[e+8>>2];n=+g[e+24>>2];w=+g[e+40>>2];J=+g[h+4>>2];I=+g[h+20>>2];H=+g[h+36>>2];G=+g[h+8>>2];F=+g[h+24>>2];E=+g[h+40>>2];g[v+18896+8>>2]=x*K+y*A+z*L;g[v+18896+12>>2]=x*B+y*M+z*C;g[v+18896+16>>2]=x*s+y*n+z*w;g[v+18896+20>>2]=0.0;g[v+18896+24>>2]=K*J+A*I+L*H;g[v+18896+28>>2]=B*J+M*I+C*H;g[v+18896+32>>2]=s*J+n*I+w*H;g[v+18896+36>>2]=0.0;g[v+18896+40>>2]=K*G+A*F+L*E;g[v+18896+44>>2]=B*G+M*F+C*E;g[v+18896+48>>2]=s*G+n*F+w*E;g[v+18896+52>>2]=0.0;w=+g[h+48>>2]-+g[e+48>>2];n=+g[h+52>>2]-+g[e+52>>2];s=+g[h+56>>2]-+g[e+56>>2];C=+g[e>>2];M=+g[h>>2];B=+g[e+16>>2];L=+g[h+16>>2];A=+g[e+32>>2];K=+g[h+32>>2];z=+g[e+4>>2];y=+g[e+20>>2];x=+g[e+36>>2];m=+g[e+8>>2];o=+g[e+24>>2];r=+g[e+40>>2];g[v+18896+56>>2]=C*M+B*L+A*K;g[v+18896+60>>2]=C*J+B*I+A*H;g[v+18896+64>>2]=C*G+B*F+A*E;g[v+18896+68>>2]=0.0;g[v+18896+72>>2]=M*z+L*y+K*x;g[v+18896+76>>2]=J*z+I*y+H*x;g[v+18896+80>>2]=G*z+F*y+E*x;g[v+18896+84>>2]=0.0;g[v+18896+88>>2]=M*m+L*o+K*r;g[v+18896+92>>2]=J*m+I*o+H*r;g[v+18896+96>>2]=G*m+F*o+E*r;g[v+18896+100>>2]=0.0;g[v+18896+104>>2]=w*C+n*B+s*A;g[v+18896+108>>2]=w*z+n*y+s*x;g[v+18896+112>>2]=w*m+n*o+s*r;g[v+18896+116>>2]=0.0;c[v+18896+120>>2]=k?81:80;c[v+18896+124>>2]=k?0:0;c[v+18512+364>>2]=0;c[v+18512+128>>2]=0;c[v+18512+128+4>>2]=0;c[v+18512+128+8>>2]=0;c[v+18512+128+12>>2]=0;c[v+18512+376>>2]=2;c[v+18512+368>>2]=0;g[v+18512+144>>2]=0.0;r=-+g[i+4>>2];s=-+g[i+8>>2];g[v+19024>>2]=-+g[i>>2];g[v+19024+4>>2]=r;g[v+19024+8>>2]=s;g[v+19024+12>>2]=0.0;switch(Jc(v+18512|0,v+18896|0,v+19024|0)|0){case 1:{c[v+18496>>2]=0;c[v+18496+4>>2]=0;c[v+18496+8>>2]=0;c[v+18496+12>>2]=0;c[v>>2]=9;c[v+18492>>2]=0;c[v+40>>2]=0;c[v+40+4>>2]=0;c[v+40+8>>2]=0;c[v+40+12>>2]=0;c[v+40+16>>2]=0;b=0;do{f=256-b+-1|0;c[v+4156+(f*56|0)+44>>2]=0;h=c[v+18504>>2]|0;c[v+4156+(f*56|0)+48>>2]=h;if(h|0)c[h+44>>2]=v+4156+(f*56|0);c[v+18504>>2]=v+4156+(f*56|0);c[v+18508>>2]=(c[v+18508>>2]|0)+1;b=b+1|0}while((b|0)!=256);o=+g[i>>2];r=+g[i+4>>2];n=+g[i+8>>2];t=c[v+18512+372>>2]|0;do if((c[t+32>>2]|0)>>>0>1?sd(v+18512|0)|0:0){b=c[v+18496>>2]|0;if(b|0){p=c[v+18500>>2]|0;q=c[v+18508>>2]|0;do{f=b+44|0;k=b+48|0;h=c[k>>2]|0;if(h|0)c[h+44>>2]=c[f>>2];f=c[f>>2]|0;if(f|0)c[f+48>>2]=c[k>>2];if((c[v+18496>>2]|0)==(b|0))c[v+18496>>2]=c[k>>2];p=p+-1|0;c[b+44>>2]=0;c[k>>2]=c[v+18504>>2];f=c[v+18504>>2]|0;if(f|0)c[f+44>>2]=b;c[v+18504>>2]=b;q=q+1|0;b=c[v+18496>>2]|0}while((b|0)!=0);c[v+18500>>2]=p;c[v+18508>>2]=q}c[v>>2]=0;c[v+18492>>2]=0;b=c[t>>2]|0;f=c[t+12>>2]|0;M=+g[f+16>>2];E=+g[b+16>>2]-M;G=+g[f+20>>2];H=+g[b+20>>2]-G;J=+g[f+24>>2];K=+g[b+24>>2]-J;f=c[t+4>>2]|0;I=+g[f+16>>2]-M;L=+g[f+20>>2]-G;F=+g[f+24>>2]-J;h=c[t+8>>2]|0;M=+g[h+16>>2]-M;G=+g[h+20>>2]-G;J=+g[h+24>>2]-J;if(E*L*J+(H*F*M+K*I*G-E*F*G-H*I*J)-K*L*M<0.0){c[t>>2]=f;c[t+4>>2]=b;k=c[t+16>>2]|0;c[t+16>>2]=c[t+20>>2];c[t+20>>2]=k;k=f}else{k=b;b=f}k=lf(v,k,b,h,1)|0;p=lf(v,c[t+4>>2]|0,c[t>>2]|0,c[t+12>>2]|0,1)|0;q=lf(v,c[t+8>>2]|0,c[t+4>>2]|0,c[t+12>>2]|0,1)|0;i=lf(v,c[t>>2]|0,c[t+8>>2]|0,c[t+12>>2]|0,1)|0;if((c[v+18500>>2]|0)==4){f=c[v+18496>>2]|0;m=+g[f+16>>2];b=c[f+48>>2]|0;if(!b)b=f;else{n=m*m;while(1){m=+g[b+16>>2];h=m*m>2]|0;if(!b)break;else n=h?m*m:n}b=f;m=+g[f+16>>2]}o=+g[b>>2];s=+g[b+4>>2];r=+g[b+8>>2];n=+g[b+12>>2];N=c[b+20>>2]|0;f=c[b+24>>2]|0;h=c[b+28>>2]|0;a[k+52>>0]=0;c[k+32>>2]=p;a[p+52>>0]=0;c[p+32>>2]=k;a[k+53>>0]=0;c[k+36>>2]=q;a[q+52>>0]=1;c[q+32>>2]=k;a[k+54>>0]=0;c[k+40>>2]=i;a[i+52>>0]=2;c[i+32>>2]=k;a[p+53>>0]=2;c[p+36>>2]=i;a[i+54>>0]=1;c[i+40>>2]=p;a[p+54>>0]=1;c[p+40>>2]=q;a[q+53>>0]=2;c[q+36>>2]=p;a[q+54>>0]=1;c[q+40>>2]=i;a[i+53>>0]=2;c[i+36>>2]=q;c[v>>2]=0;i=b;t=0;p=N;q=f;k=h;while(1){f=c[v+18492>>2]|0;if(f>>>0>=128){u=44;break}c[v+19024>>2]=0;c[v+19024+4>>2]=0;c[v+19024+8>>2]=0;c[v+18492>>2]=f+1;t=t+1|0;a[i+55>>0]=t;h=i+4|0;N=i+8|0;Fh(v+18512|0,+g[i>>2],+g[h>>2],+g[N>>2],v+60+(f<<5)|0);if(+g[i>>2]*+g[v+60+(f<<5)+16>>2]+ +g[h>>2]*+g[v+60+(f<<5)+20>>2]+ +g[N>>2]*+g[v+60+(f<<5)+24>>2]-+g[i+16>>2]>9.999999747378752e-05)b=0;else{b=7;u=43;break}do{h=nh(v,t,v+60+(f<<5)|0,c[i+32+(b<<2)>>2]|0,d[i+52+b>>0]|0,v+19024|0)|0;b=b+1|0}while(h&b>>>0<3);if(!(h&(c[v+19024+8>>2]|0)>>>0>2)){b=4;u=43;break}h=c[v+19024>>2]|0;b=c[v+19024+4>>2]|0;a[h+53>>0]=2;c[h+36>>2]=b;a[b+54>>0]=1;c[b+40>>2]=h;b=i+44|0;h=i+48|0;f=c[h>>2]|0;if(f|0)c[f+44>>2]=c[b>>2];b=c[b>>2]|0;if(b|0)c[b+48>>2]=c[h>>2];if((c[v+18496>>2]|0)==(i|0))c[v+18496>>2]=c[h>>2];c[v+18500>>2]=(c[v+18500>>2]|0)+-1;c[i+44>>2]=0;c[h>>2]=c[v+18504>>2];b=c[v+18504>>2]|0;if(b|0)c[b+44>>2]=i;c[v+18504>>2]=i;c[v+18508>>2]=(c[v+18508>>2]|0)+1;f=c[v+18496>>2]|0;m=+g[f+16>>2];b=c[f+48>>2]|0;if(b){n=m*m;h=f;while(1){m=+g[b+16>>2];f=m*m>2]|0;if(!b)break;else n=f?m*m:n}f=h;m=+g[h+16>>2]}o=+g[f>>2];s=+g[f+4>>2];r=+g[f+8>>2];n=+g[f+12>>2];b=c[f+20>>2]|0;h=c[f+24>>2]|0;k=c[f+28>>2]|0;if(t>>>0>=255){f=k;break}else{i=f;p=b;q=h}}if((u|0)==43){c[v>>2]=b;b=p;h=q;f=k}else if((u|0)==44){c[v>>2]=6;b=p;h=q;f=k}I=o*m;G=s*m;K=r*m;g[v+40>>2]=o;g[v+44>>2]=s;g[v+48>>2]=r;g[v+52>>2]=n;g[v+56>>2]=m;c[v+36>>2]=3;c[v+4>>2]=b;c[v+8>>2]=h;c[v+12>>2]=f;N=h;L=+g[N+16>>2]-I;E=+g[N+20>>2]-G;C=+g[N+24>>2]-K;t=f;J=+g[t+16>>2]-I;F=+g[t+20>>2]-G;H=+g[t+24>>2]-K;L=+D(+((L*F-E*J)*(L*F-E*J)+((E*H-C*F)*(E*H-C*F)+(C*J-L*H)*(C*J-L*H))));g[v+20>>2]=L;J=+g[t+16>>2]-I;C=+g[t+20>>2]-G;t=b;F=+g[t+16>>2]-I;E=+g[t+20>>2]-G;M=+g[t+24>>2]-K;M=+D(+((J*E-C*F)*(J*E-C*F)+((C*M-H*E)*(C*M-H*E)+(H*F-J*M)*(H*F-J*M))));g[v+24>>2]=M;J=+g[t+16>>2]-I;F=+g[t+20>>2]-G;H=+g[t+24>>2]-K;I=+g[N+16>>2]-I;G=+g[N+20>>2]-G;K=+g[N+24>>2]-K;K=+D(+((J*G-F*I)*(J*G-F*I)+((F*K-H*G)*(F*K-H*G)+(H*I-J*K)*(H*I-J*K))));g[v+20>>2]=L/(K+(L+M));g[v+24>>2]=M/(K+(L+M));g[v+28>>2]=K/(K+(L+M));if((c[v>>2]|0)!=9)if(!(c[v+36>>2]|0)){o=0.0;n=0.0;m=0.0;break}else{k=v+36|0;u=53;break}c[j>>2]=3;N=0;l=v;return N|0}else u=47}else u=47;while(0);if((u|0)==47){c[v>>2]=8;g[v+40>>2]=o;g[v+44>>2]=r;g[v+48>>2]=n;g[v+52>>2]=0.0;m=+D(+(o*o+r*r+n*n));if(m>0.0){g[v+40>>2]=1.0/m*o;g[v+44>>2]=1.0/m*r;g[v+48>>2]=1.0/m*n}else{c[v+40>>2]=1065353216;c[v+44>>2]=0;c[v+48>>2]=0}g[v+52>>2]=0.0;g[v+56>>2]=0.0;c[v+36>>2]=1;c[v+4>>2]=c[t>>2];g[v+20>>2]=1.0;k=v+36|0;u=53}if((u|0)==53){h=0;m=0.0;n=0.0;o=0.0;do{b=c[v+18896+120>>2]|0;N=c[v+18896+124>>2]|0;f=(c[v+18896>>2]|0)+(N>>1)|0;if(N&1)b=c[(c[f>>2]|0)+b>>2]|0;Sb[b&127](v+19024|0,f,c[v+4+(h<<2)>>2]|0);M=+g[v+20+(h<<2)>>2];m=m+ +g[v+19024>>2]*M;n=n+M*+g[v+19024+4>>2];o=o+M*+g[v+19024+8>>2];h=h+1|0}while(h>>>0<(c[k>>2]|0)>>>0)}c[j>>2]=1;M=m*+g[e+16>>2]+n*+g[e+20>>2]+o*+g[e+24>>2]+ +g[e+52>>2];J=m*+g[e+32>>2]+n*+g[e+36>>2]+o*+g[e+40>>2]+ +g[e+56>>2];g[j+4>>2]=m*+g[e>>2]+n*+g[e+4>>2]+o*+g[e+8>>2]+ +g[e+48>>2];g[j+8>>2]=M;g[j+12>>2]=J;g[j+16>>2]=0.0;J=+g[v+40>>2];M=+g[v+56>>2];K=+g[v+44>>2];L=+g[v+48>>2];E=m-J*M;F=n-M*K;G=o-M*L;H=E*+g[e+16>>2]+F*+g[e+20>>2]+G*+g[e+24>>2]+ +g[e+52>>2];I=E*+g[e+32>>2]+F*+g[e+36>>2]+G*+g[e+40>>2]+ +g[e+56>>2];g[j+20>>2]=E*+g[e>>2]+F*+g[e+4>>2]+G*+g[e+8>>2]+ +g[e+48>>2];g[j+24>>2]=H;g[j+28>>2]=I;g[j+32>>2]=0.0;g[j+36>>2]=-J;g[j+40>>2]=-K;g[j+44>>2]=-L;g[j+48>>2]=0.0;g[j+52>>2]=-M;N=1;l=v;return N|0}case 2:{c[j>>2]=2;N=0;l=v;return N|0}default:{N=0;l=v;return N|0}}return 0}function Ic(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0;w=l;l=l+208|0;u=(a[b+68>>0]|0)!=0;t=u?e:d;u=u?d:e;v=c[t+4>>2]|0;if((c[v+72>>2]|0)!=(c[b+80>>2]|0)){j=c[b+52>>2]|0;if((j|0)>0){i=0;do{k=c[(c[b+60>>2]|0)+(i<<2)>>2]|0;if(k|0){Ib[c[c[k>>2]>>2]&511](k);m=c[b+4>>2]|0;Ob[c[(c[m>>2]|0)+60>>2]&127](m,c[(c[b+60>>2]|0)+(i<<2)>>2]|0)}i=i+1|0}while((i|0)!=(j|0))}eh(b,d,e);c[b+80>>2]=c[v+72>>2]}d=c[b+52>>2]|0;if(!d){l=w;return}m=c[v+68>>2]|0;j=c[b+4>>2]|0;k=c[b+60>>2]|0;i=c[b+72>>2]|0;c[w+176>>2]=6540;c[w+176+4>>2]=t;c[w+176+8>>2]=u;c[w+176+12>>2]=j;c[w+176+16>>2]=f;c[w+176+20>>2]=h;c[w+176+24>>2]=k;c[w+176+28>>2]=i;i=c[b+32>>2]|0;if((i|0)<0){if((c[b+36>>2]|0)<0){d=c[b+40>>2]|0;if(d|0){if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+40>>2]=0}a[b+44>>0]=1;c[b+40>>2]=0;c[b+36>>2]=0}do{c[(c[b+40>>2]|0)+(i<<2)>>2]=0;i=i+1|0}while((i|0)!=0);d=c[b+52>>2]|0}c[b+32>>2]=0;if((d|0)>0){f=0;do{i=c[(c[b+60>>2]|0)+(f<<2)>>2]|0;if(i){Ob[c[(c[i>>2]|0)+16>>2]&127](i,b+28|0);i=c[b+32>>2]|0;if((i|0)>0){k=0;do{j=c[(c[b+40>>2]|0)+(k<<2)>>2]|0;if(c[j+780>>2]|0){c[h+4>>2]=j;i=c[j+772>>2]|0;d=c[(c[h+8>>2]|0)+8>>2]|0;e=c[(c[h+12>>2]|0)+8>>2]|0;if((i|0)==(d|0))af(j,i+4|0,e+4|0);else af(j,e+4|0,d+4|0);c[h+4>>2]=0;i=c[b+32>>2]|0}k=k+1|0}while((k|0)<(i|0))}if((i|0)<0){if((c[b+36>>2]|0)<0){d=c[b+40>>2]|0;if(d|0){if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+40>>2]=0}a[b+44>>0]=1;c[b+40>>2]=0;c[b+36>>2]=0}do{c[(c[b+40>>2]|0)+(i<<2)>>2]=0;i=i+1|0}while((i|0)!=0)}c[b+32>>2]=0;d=c[b+52>>2]|0}f=f+1|0}while((f|0)<(d|0))}if(!m){if((d|0)>0){i=0;do{we(w+176|0,c[(c[v+28>>2]|0)+(i*80|0)+64>>2]|0,i);i=i+1|0}while((i|0)<(d|0))}}else{k=c[t+12>>2]|0;F=+g[k>>2];E=+g[k+16>>2];D=+g[k+32>>2];C=+g[k+4>>2];B=+g[k+20>>2];A=+g[k+36>>2];r=+g[k+8>>2];p=+g[k+24>>2];n=+g[k+40>>2];z=-+g[k+48>>2];y=-+g[k+52>>2];x=-+g[k+56>>2];k=c[u+12>>2]|0;O=+g[k>>2];N=+g[k+16>>2];M=+g[k+32>>2];L=+g[k+4>>2];K=+g[k+20>>2];J=+g[k+36>>2];I=+g[k+8>>2];H=+g[k+24>>2];G=+g[k+40>>2];q=+g[k+48>>2];o=+g[k+52>>2];s=+g[k+56>>2];g[w+32>>2]=F*O+E*N+D*M;g[w+32+4>>2]=F*L+E*K+D*J;g[w+32+8>>2]=F*I+E*H+D*G;g[w+32+12>>2]=0.0;g[w+32+16>>2]=C*O+B*N+A*M;g[w+32+20>>2]=C*L+B*K+A*J;g[w+32+24>>2]=C*I+B*H+A*G;g[w+32+28>>2]=0.0;g[w+32+32>>2]=r*O+p*N+n*M;g[w+32+36>>2]=r*L+p*K+n*J;g[w+32+40>>2]=r*I+p*H+n*G;g[w+32+44>>2]=0.0;g[w+32+48>>2]=F*z+E*y+D*x+(F*q+E*o+D*s);g[w+32+52>>2]=C*z+B*y+A*x+(C*q+B*o+A*s);g[w+32+56>>2]=r*z+p*y+n*x+(r*q+p*o+n*s);g[w+32+60>>2]=0.0;k=c[u+4>>2]|0;Vb[c[(c[k>>2]|0)+8>>2]&127](k,w+32|0,w+112|0,w+96|0);s=+g[h+32>>2];n=+g[w+112>>2]-s;g[w+112>>2]=n;o=+g[w+112+4>>2]-s;g[w+112+4>>2]=o;p=+g[w+112+8>>2]-s;g[w+112+8>>2]=p;q=s+ +g[w+96>>2];g[w+96>>2]=q;r=s+ +g[w+96+4>>2];g[w+96+4>>2]=r;s=s+ +g[w+96+8>>2];g[w+96+8>>2]=s;k=c[m>>2]|0;if(k|0){i=c[b+12>>2]|0;d=c[b+16>>2]|0;if((i|0)<0){if((d|0)<0){d=c[b+20>>2]|0;if(d|0){if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+20>>2]=0}a[b+24>>0]=1;c[b+20>>2]=0;c[b+16>>2]=0;d=0}do{c[(c[b+20>>2]|0)+(i<<2)>>2]=0;i=i+1|0}while((i|0)!=0)}c[b+12>>2]=0;if((d|0)<64){c[6995]=(c[6995]|0)+1;i=sc(275)|0;if(!i)e=0;else{c[(i+4+15&-16)+-4>>2]=i;e=i+4+15&-16}i=c[b+12>>2]|0;if((i|0)>0){d=0;do{c[e+(d<<2)>>2]=c[(c[b+20>>2]|0)+(d<<2)>>2];d=d+1|0}while((d|0)!=(i|0))}d=c[b+20>>2]|0;if(d){if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);i=c[b+12>>2]|0}c[b+20>>2]=0}a[b+24>>0]=1;c[b+20>>2]=e;c[b+16>>2]=64;d=64}else i=0;if((i|0)==(d|0)){j=d<<1;if((d|0)<(j|0)){c[6995]=(c[6995]|0)+1;i=sc((d<<3|3)+16|0)|0;if(!i)e=0;else{c[(i+4+15&-16)+-4>>2]=i;e=i+4+15&-16}i=c[b+12>>2]|0;if((i|0)>0){d=0;do{c[e+(d<<2)>>2]=c[(c[b+20>>2]|0)+(d<<2)>>2];d=d+1|0}while((d|0)!=(i|0))}d=c[b+20>>2]|0;if(d){if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);i=c[b+12>>2]|0}c[b+20>>2]=0}a[b+24>>0]=1;c[b+20>>2]=e;c[b+16>>2]=j}else i=d}c[(c[b+20>>2]|0)+(i<<2)>>2]=k;d=i+1|0;c[b+12>>2]=d;while(1){i=d+-1|0;e=c[b+20>>2]|0;f=c[e+(i<<2)>>2]|0;c[b+12>>2]=i;do if(((((+g[f>>2]<=q?+g[f+16>>2]>=n:0)?+g[f+4>>2]<=r:0)?+g[f+20>>2]>=o:0)?+g[f+8>>2]<=s:0)?+g[f+24>>2]>=p:0){if(!(c[f+40>>2]|0)){Ob[c[(c[w+176>>2]|0)+12>>2]&127](w+176|0,f);i=c[b+12>>2]|0;break}k=c[f+36>>2]|0;j=c[b+16>>2]|0;do if((i|0)==(j|0)){j=i|0?i<<1:1;if((d|0)>(j|0)){d=i;break}if(!j)e=0;else{c[6995]=(c[6995]|0)+1;i=sc((j<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}e=i;i=c[b+12>>2]|0}if((i|0)>0){d=0;do{c[e+(d<<2)>>2]=c[(c[b+20>>2]|0)+(d<<2)>>2];d=d+1|0}while((d|0)!=(i|0))}d=c[b+20>>2]|0;if(d){if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);i=c[b+12>>2]|0}c[b+20>>2]=0}a[b+24>>0]=1;c[b+20>>2]=e;c[b+16>>2]=j;d=i;i=j}else{d=i;i=j}while(0);c[e+(d<<2)>>2]=k;d=d+1|0;c[b+12>>2]=d;k=c[f+40>>2]|0;do if((d|0)==(i|0)){j=i|0?i<<1:1;if((i|0)>=(j|0))break;if(!j)e=0;else{c[6995]=(c[6995]|0)+1;i=sc((j<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}e=i;i=c[b+12>>2]|0}if((i|0)>0){d=0;do{c[e+(d<<2)>>2]=c[(c[b+20>>2]|0)+(d<<2)>>2];d=d+1|0}while((d|0)!=(i|0))}d=c[b+20>>2]|0;if(d){if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);i=c[b+12>>2]|0}c[b+20>>2]=0}a[b+24>>0]=1;c[b+20>>2]=e;c[b+16>>2]=j}else i=d;while(0);c[(c[b+20>>2]|0)+(i<<2)>>2]=k;i=i+1|0;c[b+12>>2]=i}while(0);if((i|0)>0)d=i;else break}}}e=c[b+52>>2]|0;i=c[b+32>>2]|0;if((i|0)<0){if((c[b+36>>2]|0)<0){d=c[b+40>>2]|0;if(d|0){if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+40>>2]=0}a[b+44>>0]=1;c[b+40>>2]=0;c[b+36>>2]=0}do{c[(c[b+40>>2]|0)+(i<<2)>>2]=0;i=i+1|0}while((i|0)!=0)}c[b+32>>2]=0;if((e|0)>0){d=0;do{do if(c[(c[b+60>>2]|0)+(d<<2)>>2]|0){f=c[v+28>>2]|0;m=c[f+(d*80|0)+64>>2]|0;h=c[t+12>>2]|0;q=+g[h>>2];r=+g[h+4>>2];s=+g[h+8>>2];x=+g[h+16>>2];y=+g[h+20>>2];z=+g[h+24>>2];G=+g[h+32>>2];I=+g[h+36>>2];K=+g[h+40>>2];A=+g[f+(d*80|0)>>2];B=+g[f+(d*80|0)+16>>2];C=+g[f+(d*80|0)+32>>2];D=+g[f+(d*80|0)+4>>2];E=+g[f+(d*80|0)+20>>2];F=+g[f+(d*80|0)+36>>2];H=+g[f+(d*80|0)+8>>2];J=+g[f+(d*80|0)+24>>2];L=+g[f+(d*80|0)+40>>2];o=+g[f+(d*80|0)+48>>2];p=+g[f+(d*80|0)+52>>2];O=+g[f+(d*80|0)+56>>2];M=+g[h+48>>2]+(q*o+r*p+s*O);N=+g[h+52>>2]+(x*o+y*p+z*O);O=+g[h+56>>2]+(G*o+I*p+K*O);g[w+112>>2]=q*A+r*B+s*C;g[w+112+4>>2]=q*D+r*E+s*F;g[w+112+8>>2]=q*H+r*J+s*L;g[w+112+12>>2]=0.0;g[w+112+16>>2]=x*A+y*B+z*C;g[w+112+20>>2]=x*D+y*E+z*F;g[w+112+24>>2]=x*H+y*J+z*L;g[w+112+28>>2]=0.0;g[w+112+32>>2]=G*A+I*B+K*C;g[w+112+36>>2]=G*D+I*E+K*F;g[w+112+40>>2]=G*H+I*J+K*L;g[w+112+44>>2]=0.0;g[w+112+48>>2]=M;g[w+112+52>>2]=N;g[w+112+56>>2]=O;g[w+112+60>>2]=0.0;Vb[c[(c[m>>2]|0)+8>>2]&127](m,w+112|0,w+96|0,w+32|0);m=c[u+4>>2]|0;Vb[c[(c[m>>2]|0)+8>>2]&127](m,c[u+12>>2]|0,w+16|0,w);if(!(+g[w+96>>2]>+g[w>>2])?!(+g[w+32>>2]<+g[w+16>>2]):0)i=1;else i=0;if(!(!(+g[w+96+8>>2]>+g[w+8>>2])?!(+g[w+32+8>>2]<+g[w+16+8>>2]):0))i=0;if(!(+g[w+96+4>>2]>+g[w+4>>2])?!(+g[w+32+4>>2]<+g[w+16+4>>2]|i^1):0)break;m=c[(c[b+60>>2]|0)+(d<<2)>>2]|0;Ib[c[c[m>>2]>>2]&511](m);m=c[b+4>>2]|0;Ob[c[(c[m>>2]|0)+60>>2]&127](m,c[(c[b+60>>2]|0)+(d<<2)>>2]|0);c[(c[b+60>>2]|0)+(d<<2)>>2]=0}while(0);d=d+1|0}while((d|0)<(e|0))}l=w;return}function Jc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0.0,w=0,x=0,y=0,z=0.0,A=0.0,B=0,C=0,E=0.0,F=0.0,G=0.0;C=l;l=l+176|0;c[a+348>>2]=a+220;c[a+352>>2]=a+252;c[a+356>>2]=a+284;c[a+360>>2]=a+316;c[a+364>>2]=4;c[a+368>>2]=0;c[a+376>>2]=0;y=c[b+4>>2]|0;c[a>>2]=c[b>>2];c[a+4>>2]=y;c[a+8>>2]=c[b+8>>2];c[a+8+4>>2]=c[b+8+4>>2];c[a+8+8>>2]=c[b+8+8>>2];c[a+8+12>>2]=c[b+8+12>>2];c[a+24>>2]=c[b+24>>2];c[a+24+4>>2]=c[b+24+4>>2];c[a+24+8>>2]=c[b+24+8>>2];c[a+24+12>>2]=c[b+24+12>>2];c[a+40>>2]=c[b+40>>2];c[a+40+4>>2]=c[b+40+4>>2];c[a+40+8>>2]=c[b+40+8>>2];c[a+40+12>>2]=c[b+40+12>>2];c[a+56>>2]=c[b+56>>2];c[a+56+4>>2]=c[b+56+4>>2];c[a+56+8>>2]=c[b+56+8>>2];c[a+56+12>>2]=c[b+56+12>>2];c[a+72>>2]=c[b+72>>2];c[a+72+4>>2]=c[b+72+4>>2];c[a+72+8>>2]=c[b+72+8>>2];c[a+72+12>>2]=c[b+72+12>>2];c[a+88>>2]=c[b+88>>2];c[a+88+4>>2]=c[b+88+4>>2];c[a+88+8>>2]=c[b+88+8>>2];c[a+88+12>>2]=c[b+88+12>>2];c[a+104>>2]=c[b+104>>2];c[a+104+4>>2]=c[b+104+4>>2];c[a+104+8>>2]=c[b+104+8>>2];c[a+104+12>>2]=c[b+104+12>>2];y=c[b+124>>2]|0;c[a+120>>2]=c[b+120>>2];c[a+124>>2]=y;g[a+144>>2]=0.0;c[a+180>>2]=0;c[a+128>>2]=c[d>>2];c[a+128+4>>2]=c[d+4>>2];c[a+128+8>>2]=c[d+8>>2];c[a+128+12>>2]=c[d+12>>2];e=+g[a+128>>2];f=+g[a+132>>2];h=+g[a+136>>2];if(e*e+f*f+h*h>0.0){g[a+164>>2]=0.0;c[a+364>>2]=3;c[a+148>>2]=a+316;c[a+180>>2]=1;Fh(a,-e,-f,-h,a+316|0);b=a+148|0;d=a+164|0}else{g[a+164>>2]=0.0;c[a+364>>2]=3;c[a+148>>2]=a+316;c[a+180>>2]=1;Fh(a,1.0,0.0,0.0,a+316|0);b=a+148|0;d=a+164|0}g[d>>2]=1.0;y=(c[b>>2]|0)+16|0;c[a+128>>2]=c[y>>2];c[a+128+4>>2]=c[y+4>>2];c[a+128+8>>2]=c[y+8>>2];c[a+128+12>>2]=c[y+12>>2];c[C+24+48>>2]=c[y>>2];c[C+24+48+4>>2]=c[y+4>>2];c[C+24+48+8>>2]=c[y+8>>2];c[C+24+48+12>>2]=c[y+12>>2];c[C+24+32>>2]=c[y>>2];c[C+24+32+4>>2]=c[y+4>>2];c[C+24+32+8>>2]=c[y+8>>2];c[C+24+32+12>>2]=c[y+12>>2];c[C+24+16>>2]=c[y>>2];c[C+24+16+4>>2]=c[y+4>>2];c[C+24+16+8>>2]=c[y+8>>2];c[C+24+16+12>>2]=c[y+12>>2];c[C+24>>2]=c[y>>2];c[C+24+4>>2]=c[y+4>>2];c[C+24+8>>2]=c[y+8>>2];c[C+24+12>>2]=c[y+12>>2];y=0;z=0.0;e=e*e+f*f+h*h;x=0;a:do{w=c[a+368>>2]|0;f=+g[a+128>>2];h=+g[a+132>>2];i=+g[a+136>>2];o=+D(+(f*f+h*h+i*i));if(o<9.999999747378752e-05){B=6;break}g[a+148+(w*36|0)+16+(c[a+148+(w*36|0)+32>>2]<<2)>>2]=0.0;b=(c[a+364>>2]|0)+-1|0;c[a+364>>2]=b;c[a+148+(w*36|0)+(c[a+148+(w*36|0)+32>>2]<<2)>>2]=c[a+348+(b<<2)>>2];b=c[a+148+(w*36|0)+32>>2]|0;c[a+148+(w*36|0)+32>>2]=b+1;Fh(a,-f,-h,-i,c[a+148+(w*36|0)+(b<<2)>>2]|0);b=c[a+148+(w*36|0)+32>>2]|0;d=c[a+148+(w*36|0)+(b+-1<<2)>>2]|0;f=+g[d+16>>2];h=+g[d+20>>2];i=+g[d+24>>2];r=f-+g[C+24>>2];s=h-+g[C+24+4>>2];v=i-+g[C+24+8>>2];if(r*r+s*s+v*v<9.999999747378752e-05){B=9;break}r=f-+g[C+24+16>>2];s=h-+g[C+24+20>>2];v=i-+g[C+24+24>>2];if(r*r+s*s+v*v<9.999999747378752e-05){B=9;break}r=f-+g[C+24+32>>2];s=h-+g[C+24+36>>2];v=i-+g[C+24+40>>2];if(r*r+s*s+v*v<9.999999747378752e-05){B=9;break}r=f-+g[C+24+48>>2];s=h-+g[C+24+52>>2];v=i-+g[C+24+56>>2];if(r*r+s*s+v*v<9.999999747378752e-05){B=9;break}x=x+1&3;u=C+24+(x<<4)|0;c[u>>2]=c[d+16>>2];c[u+4>>2]=c[d+16+4>>2];c[u+8>>2]=c[d+16+8>>2];c[u+12>>2]=c[d+16+12>>2];v=(+g[a+128>>2]*f+ +g[a+132>>2]*h+ +g[a+136>>2]*i)/o;z=v>z?v:z;if(o-z-o*9.999999747378752e-05<=0.0){B=10;break}c[C>>2]=0;b:do switch(b|0){case 2:{u=c[a+148+(w*36|0)>>2]|0;t=c[a+148+(w*36|0)+4>>2]|0;e=+g[t+16>>2];f=+g[u+16>>2];h=+g[t+20>>2];i=+g[u+20>>2];o=+g[t+24>>2];p=+g[u+24>>2];if(!((e-f)*(e-f)+(h-i)*(h-i)+(o-p)*(o-p)>0.0)){B=38;break a}q=-(f*(e-f)+i*(h-i)+p*(o-p))/((e-f)*(e-f)+(h-i)*(h-i)+(o-p)*(o-p));if(q>=1.0){g[C+8>>2]=0.0;g[C+8+4>>2]=1.0;c[C>>2]=2;e=e*e+h*h+o*o;break b}if(!(q<=0.0)){g[C+8+4>>2]=q;g[C+8>>2]=1.0-q;c[C>>2]=3;e=((e-f)*q+f)*((e-f)*q+f)+((h-i)*q+i)*((h-i)*q+i)+((o-p)*q+p)*((o-p)*q+p);break b}else{g[C+8>>2]=1.0;g[C+8+4>>2]=0.0;c[C>>2]=1;e=f*f+i*i+p*p;break b}}case 3:{e=+Ke((c[a+148+(w*36|0)>>2]|0)+16|0,(c[a+148+(w*36|0)+4>>2]|0)+16|0,(c[a+148+(w*36|0)+8>>2]|0)+16|0,C+8|0,C);break}case 4:{m=c[a+148+(w*36|0)>>2]|0;n=c[a+148+(w*36|0)+4>>2]|0;t=c[a+148+(w*36|0)+8>>2]|0;u=c[a+148+(w*36|0)+12>>2]|0;c[C+152>>2]=m+16;c[C+152+4>>2]=n+16;c[C+152+8>>2]=t+16;c[C+152+12>>2]=u+16;i=+g[m+16>>2];o=+g[u+16>>2];f=+g[m+20>>2];p=+g[u+20>>2];h=+g[m+24>>2];q=+g[u+24>>2];g[C+104>>2]=i-o;g[C+104+4>>2]=f-p;g[C+104+8>>2]=h-q;g[C+104+12>>2]=0.0;e=+g[n+16>>2];F=+g[n+20>>2];s=+g[n+24>>2];g[C+104+16>>2]=e-o;g[C+104+20>>2]=F-p;g[C+104+24>>2]=s-q;g[C+104+28>>2]=0.0;r=+g[t+16>>2];G=+g[t+20>>2];E=+g[t+24>>2];g[C+104+32>>2]=r-o;g[C+104+36>>2]=G-p;g[C+104+40>>2]=E-q;g[C+104+44>>2]=0.0;v=(f-p)*(s-q)*(r-o)+(h-q)*(e-o)*(G-p)-(G-p)*(s-q)*(i-o)-(f-p)*(e-o)*(E-q)+(E-q)*(i-o)*(F-p)-(r-o)*(h-q)*(F-p);if(v!=v|0.0!=0.0|v==0.0|!(v*(h*((e-r)*(f-F)-(F-G)*(i-e))+(i*((F-G)*(h-s)-(s-E)*(f-F))+f*((s-E)*(i-e)-(e-r)*(h-s))))<=0.0))e=-1.0;else{c[C+92>>2]=0;c[C+92+4>>2]=0;c[C+92+8>>2]=0;c[C+88>>2]=0;e=-1.0;k=0;s=f-p;r=h-q;h=i-o;f=q;d=c[C>>2]|0;while(1){b=c[5288+(k<<2)>>2]|0;E=+g[C+104+(b<<4)+8>>2];F=+g[C+104+(b<<4)+4>>2];G=+g[C+104+(b<<4)>>2];if(v*((s*E-r*F)*o+p*(r*G-E*h)+(F*h-s*G)*f)>0.0?(A=+Ke(c[C+152+(k<<2)>>2]|0,c[C+152+(b<<2)>>2]|0,u+16|0,C+92|0,C+88|0),e<0.0|A>2]|0;c[C+8+(k<<2)>>2]=c[C+92>>2];c[C+8+(b<<2)>>2]=c[C+92+4>>2];g[C+8+(c[5288+(b<<2)>>2]<<2)>>2]=0.0;c[C+8+12>>2]=c[C+92+8>>2];e=A;d=(d&2|0?1<>2];r=+g[C+104+(b<<4)+8>>2];h=+g[C+104+(b<<4)>>2];o=+g[u+16>>2];p=+g[u+20>>2];f=+g[u+24>>2]}c[C>>2]=d;if(e<0.0){c[C>>2]=15;i=+g[t+20>>2];G=+g[n+24>>2];F=+g[u+16>>2];f=+g[t+24>>2];E=+g[n+16>>2];o=+g[u+20>>2];h=+g[t+16>>2];s=+g[u+24>>2];q=+g[n+20>>2];g[C+8>>2]=(i*G*F+f*E*o-o*G*h-i*E*s+s*h*q-F*f*q)/v;e=+g[m+20>>2];p=+g[m+24>>2];r=+g[m+16>>2];g[C+8+4>>2]=(e*f*F+p*h*o-o*f*r-e*h*s+s*r*i-F*p*i)/v;g[C+8+8>>2]=(q*p*F+G*r*o-o*p*E-q*r*s+s*E*e-F*G*e)/v;g[C+8+12>>2]=1.0-((i*G*F+f*E*o-o*G*h-i*E*s+s*h*q-F*f*q)/v+(e*f*F+p*h*o-o*f*r-e*h*s+s*r*i-F*p*i)/v+(q*p*F+G*r*o-o*p*E-q*r*s+s*E*e-F*G*e)/v);e=0.0}}break}default:{}}while(0);if(!(e>=0.0)){B=38;break}c[a+148+((1-w|0)*36|0)+32>>2]=0;c[a+128>>2]=0;c[a+128+4>>2]=0;c[a+128+8>>2]=0;c[a+128+12>>2]=0;c[a+368>>2]=1-w;d=c[a+148+(w*36|0)+32>>2]|0;k=c[C>>2]|0;if(d|0){b=0;do{m=a+148+(w*36|0)+(b<<2)|0;n=c[m>>2]|0;if(!(k&1<>2]|0;c[a+364>>2]=u+1;c[a+348+(u<<2)>>2]=n}else{c[a+148+((1-w|0)*36|0)+(c[a+148+((1-w|0)*36|0)+32>>2]<<2)>>2]=n;t=c[C+8+(b<<2)>>2]|0;u=c[a+148+((1-w|0)*36|0)+32>>2]|0;c[a+148+((1-w|0)*36|0)+32>>2]=u+1;c[a+148+((1-w|0)*36|0)+16+(u<<2)>>2]=t;u=c[m>>2]|0;E=(c[j>>2]=t,+g[j>>2]);F=E*+g[u+20>>2];G=E*+g[u+24>>2];g[a+128>>2]=+g[u+16>>2]*E+ +g[a+128>>2];g[a+132>>2]=F+ +g[a+132>>2];g[a+136>>2]=G+ +g[a+136>>2]}b=b+1|0}while((b|0)!=(d|0))}if((k|0)==15)c[a+376>>2]=1;y=y+1|0;if(y>>>0>=128){B=40;break}b=c[a+376>>2]|0}while(!(b|0));if((B|0)==6){c[a+376>>2]=1;B=41}else if((B|0)==9){y=c[a+368>>2]|0;x=(c[a+148+(y*36|0)+32>>2]|0)+-1|0;c[a+148+(y*36|0)+32>>2]=x;x=c[a+148+(y*36|0)+(x<<2)>>2]|0;y=c[a+364>>2]|0;c[a+364>>2]=y+1;c[a+348+(y<<2)>>2]=x;B=41}else if((B|0)==10){y=c[a+368>>2]|0;x=(c[a+148+(y*36|0)+32>>2]|0)+-1|0;c[a+148+(y*36|0)+32>>2]=x;x=c[a+148+(y*36|0)+(x<<2)>>2]|0;y=c[a+364>>2]|0;c[a+364>>2]=y+1;c[a+348+(y<<2)>>2]=x;B=41}else if((B|0)==38){b=c[a+368>>2]|0;y=(c[a+148+(b*36|0)+32>>2]|0)+-1|0;c[a+148+(b*36|0)+32>>2]=y;y=c[a+148+(b*36|0)+(y<<2)>>2]|0;b=c[a+364>>2]|0;c[a+364>>2]=b+1;c[a+348+(b<<2)>>2]=y;b=c[a+376>>2]|0}else if((B|0)==40){c[a+376>>2]=2;c[a+372>>2]=a+148+((c[a+368>>2]|0)*36|0);a=2;l=C;return a|0}if((B|0)==41)b=c[a+376>>2]|0;c[a+372>>2]=a+148+((c[a+368>>2]|0)*36|0);switch(b|0){case 0:{F=+g[a+128>>2];G=+g[a+132>>2];e=+g[a+136>>2];e=+D(+(F*F+G*G+e*e));break}case 1:{e=0.0;break}default:{a=b;l=C;return a|0}}g[a+144>>2]=e;a=b;l=C;return a|0}function Kc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0,H=0,I=0;r=l;l=l+144|0;m=c[b+48>>2]|0;j=c[b+52>>2]|0;if((j|0?(k=c[j+20>>2]|0,k|0):0)?(xb[c[(c[k>>2]|0)+56>>2]&127](k)|0)&1|0:0){c[r+48>>2]=1065353216;c[r+48+4>>2]=1065353216;c[r+48+8>>2]=0;g[r+48+12>>2]=0.0;k=c[b+8>>2]|0;p=c[(c[b+52>>2]|0)+20>>2]|0;o=c[(c[p>>2]|0)+16>>2]|0;x=+g[d>>2];E=+g[d+4>>2];A=+g[d+8>>2];v=+g[k+20>>2];s=+g[k+24>>2];w=+g[k+28>>2];t=+g[k+36>>2];z=+g[k+40>>2];B=+g[k+44>>2];u=+g[k+52>>2];C=+g[k+56>>2];y=+g[k+60>>2];g[r+24>>2]=x*+g[k+4>>2]+E*+g[k+8>>2]+A*+g[k+12>>2]+u;g[r+24+4>>2]=x*v+E*s+A*w+C;g[r+24+8>>2]=x*t+E*z+A*B+y;g[r+24+12>>2]=0.0;A=+g[d+16>>2];E=+g[d+20>>2];x=+g[d+24>>2];g[r>>2]=A*+g[k+4>>2]+E*+g[k+8>>2]+x*+g[k+12>>2]+u;g[r+4>>2]=A*v+E*s+x*w+C;g[r+8>>2]=A*t+E*z+x*B+y;g[r+12>>2]=0.0;Vb[o&127](p,r+24|0,r,r+48|0);p=c[(c[b+52>>2]|0)+20>>2]|0;o=c[(c[p>>2]|0)+16>>2]|0;y=+g[d+16>>2];B=+g[d+20>>2];x=+g[d+24>>2];z=+g[k+20>>2];E=+g[k+24>>2];t=+g[k+28>>2];A=+g[k+36>>2];C=+g[k+40>>2];w=+g[k+44>>2];s=+g[k+52>>2];v=+g[k+56>>2];u=+g[k+60>>2];g[r+24>>2]=y*+g[k+4>>2]+B*+g[k+8>>2]+x*+g[k+12>>2]+s;g[r+24+4>>2]=y*z+B*E+x*t+v;g[r+24+8>>2]=y*A+B*C+x*w+u;g[r+24+12>>2]=0.0;x=+g[d+32>>2];B=+g[d+36>>2];y=+g[d+40>>2];g[r>>2]=x*+g[k+4>>2]+B*+g[k+8>>2]+y*+g[k+12>>2]+s;g[r+4>>2]=x*z+B*E+y*t+v;g[r+8>>2]=x*A+B*C+y*w+u;g[r+12>>2]=0.0;Vb[o&127](p,r+24|0,r,r+48|0);p=c[(c[b+52>>2]|0)+20>>2]|0;o=c[(c[p>>2]|0)+16>>2]|0;u=+g[d+32>>2];w=+g[d+36>>2];y=+g[d+40>>2];C=+g[k+20>>2];B=+g[k+24>>2];A=+g[k+28>>2];x=+g[k+36>>2];v=+g[k+40>>2];t=+g[k+44>>2];E=+g[k+52>>2];z=+g[k+56>>2];s=+g[k+60>>2];g[r+24>>2]=u*+g[k+4>>2]+w*+g[k+8>>2]+y*+g[k+12>>2]+E;g[r+24+4>>2]=u*C+w*B+y*A+z;g[r+24+8>>2]=u*x+w*v+y*t+s;g[r+24+12>>2]=0.0;y=+g[d>>2];w=+g[d+4>>2];u=+g[d+8>>2];g[r>>2]=y*+g[k+4>>2]+w*+g[k+8>>2]+u*+g[k+12>>2]+E;g[r+4>>2]=y*C+w*B+u*A+z;g[r+8>>2]=y*x+w*v+u*t+s;g[r+12>>2]=0.0;Vb[o&127](p,r+24|0,r,r+48|0)}j=(((e<<21|f)+~(f<<15)|0)>>>10^(e<<21|f)+~(f<<15))*9|0;j=(c[b+108>>2]|0)+-1&(((j>>>6^j)+~((j>>>6^j)<<11)|0)>>>16^(j>>>6^j)+~((j>>>6^j)<<11));a:do if(j>>>0<(c[b+64>>2]|0)>>>0?(h=c[(c[b+72>>2]|0)+(j<<2)>>2]|0,(h|0)!=-1):0){j=c[b+132>>2]|0;while(1){if((e<<21|f|0)==(c[j+(h<<2)>>2]|0))break;h=c[(c[b+92>>2]|0)+(h<<2)>>2]|0;if((h|0)==-1)break a}j=c[b+112>>2]|0;if(j+(h<<3)|0){p=c[j+(h<<3)+4>>2]|0;q=c[b+8>>2]|0;c[p+8>>2]=c[(c[q+192>>2]|0)+8>>2];o=c[b+4>>2]|0;n=c[o+192>>2]|0;c[r+48>>2]=0;c[r+48+4>>2]=n;c[r+48+8>>2]=o;c[r+48+12>>2]=o+4;c[r+48+16>>2]=-1;c[r+48+20>>2]=-1;c[r+24>>2]=0;c[r+24+4>>2]=p;c[r+24+8>>2]=q;c[r+24+12>>2]=q+4;c[r+24+16>>2]=e;c[r+24+20>>2]=f;q=Db[c[(c[m>>2]|0)+8>>2]&1](m,r+48|0,r+24|0,0,+g[(c[b+44>>2]|0)+32>>2]>0.0?2:1)|0;Zb[c[(c[q>>2]|0)+8>>2]&31](q,r+48|0,r+24|0,c[b+52>>2]|0,c[b+44>>2]|0);Ib[c[c[q>>2]>>2]&511](q);Ob[c[(c[m>>2]|0)+60>>2]&127](m,q);l=r;return}}while(0);u=+g[d+16>>2];F=+g[d>>2];v=+g[d+20>>2];s=+g[d+4>>2];w=+g[d+24>>2];t=+g[d+8>>2];x=+g[d+32>>2];z=+g[d+36>>2];B=+g[d+40>>2];y=(v-s)*(B-t)-(w-t)*(z-s);A=(w-t)*(x-F)-(u-F)*(B-t);E=(u-F)*(z-s)-(v-s)*(x-F);C=1.0/+D(+(E*E+(y*y+A*A)));g[r+48>>2]=F+C*y*.05999999865889549;g[r+48+4>>2]=s+C*A*.05999999865889549;g[r+48+8>>2]=C*E*.05999999865889549+t;g[r+48+12>>2]=0.0;g[r+48+16>>2]=C*y*.05999999865889549+u;g[r+48+20>>2]=C*A*.05999999865889549+v;g[r+48+24>>2]=C*E*.05999999865889549+w;g[r+48+28>>2]=0.0;g[r+48+32>>2]=C*y*.05999999865889549+x;g[r+48+36>>2]=C*A*.05999999865889549+z;g[r+48+40>>2]=C*E*.05999999865889549+B;g[r+48+44>>2]=0.0;g[r+48+48>>2]=F-C*y*.05999999865889549;g[r+48+52>>2]=s-C*A*.05999999865889549;g[r+48+56>>2]=t-C*E*.05999999865889549;g[r+48+60>>2]=0.0;g[r+48+64>>2]=u-C*y*.05999999865889549;g[r+48+68>>2]=v-C*A*.05999999865889549;g[r+48+72>>2]=w-C*E*.05999999865889549;g[r+48+76>>2]=0.0;g[r+48+80>>2]=x-C*y*.05999999865889549;g[r+48+84>>2]=z-C*A*.05999999865889549;g[r+48+88>>2]=B-C*E*.05999999865889549;g[r+48+92>>2]=0.0;c[6995]=(c[6995]|0)+1;h=sc(135)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}lg(h,r+48|0,6,16);p=c[b+8>>2]|0;c[h+8>>2]=c[(c[p+192>>2]|0)+8>>2];o=c[b+4>>2]|0;d=c[o+192>>2]|0;c[r+24>>2]=0;c[r+24+4>>2]=d;c[r+24+8>>2]=o;c[r+24+12>>2]=o+4;c[r+24+16>>2]=-1;c[r+24+20>>2]=-1;c[r>>2]=0;c[r+4>>2]=h;c[r+8>>2]=p;c[r+12>>2]=p+4;c[r+16>>2]=e;c[r+20>>2]=f;p=Db[c[(c[m>>2]|0)+8>>2]&1](m,r+24|0,r,0,+g[(c[b+44>>2]|0)+32>>2]>0.0?2:1)|0;Zb[c[(c[p>>2]|0)+8>>2]&31](p,r+24|0,r,c[b+52>>2]|0,c[b+44>>2]|0);Ib[c[c[p>>2]>>2]&511](p);Ob[c[(c[m>>2]|0)+60>>2]&127](m,p);p=(((e<<21|f)+~(f<<15)|0)>>>10^(e<<21|f)+~(f<<15))*9|0;p=((p>>>6^p)+~((p>>>6^p)<<11)|0)>>>16^(p>>>6^p)+~((p>>>6^p)<<11);m=c[b+108>>2]|0;b:do if((p&m+-1)>>>0<(c[b+64>>2]|0)>>>0?(i=c[(c[b+72>>2]|0)+((p&m+-1)<<2)>>2]|0,(i|0)!=-1):0){j=c[b+132>>2]|0;while(1){if((e<<21|f|0)==(c[j+(i<<2)>>2]|0))break;i=c[(c[b+92>>2]|0)+(i<<2)>>2]|0;if((i|0)==-1){q=20;break b}}b=c[b+112>>2]|0;c[b+(i<<3)>>2]=e<<21|f;c[b+(i<<3)+4>>2]=h}else q=20;while(0);if((q|0)==20){o=c[b+104>>2]|0;if((o|0)==(m|0)){d=m|0?m<<1:1;if((m|0)<(d|0)){if(!d){i=0;k=m}else{c[6995]=(c[6995]|0)+1;i=sc((d<<3|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}k=c[b+104>>2]|0}if((k|0)>0){j=0;do{I=(c[b+112>>2]|0)+(j<<3)|0;H=c[I+4>>2]|0;G=i+(j<<3)|0;c[G>>2]=c[I>>2];c[G+4>>2]=H;j=j+1|0}while((j|0)!=(k|0))}j=c[b+112>>2]|0;if(j|0){if(a[b+116>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[b+112>>2]=0}a[b+116>>0]=1;c[b+112>>2]=i;c[b+108>>2]=d;i=c[b+104>>2]|0}else i=m}else i=o;I=c[b+112>>2]|0;c[I+(i<<3)>>2]=e<<21|f;c[I+(i<<3)+4>>2]=h;c[b+104>>2]=(c[b+104>>2]|0)+1;h=c[b+124>>2]|0;if((h|0)==(c[b+128>>2]|0)?(n=h|0?h<<1:1,(h|0)<(n|0)):0){if(!n)k=0;else{c[6995]=(c[6995]|0)+1;h=sc((n<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}k=h;h=c[b+124>>2]|0}j=c[b+132>>2]|0;if((h|0)<=0)if(!j)h=b+136|0;else q=43;else{i=0;do{c[k+(i<<2)>>2]=c[j+(i<<2)>>2];i=i+1|0}while((i|0)!=(h|0));q=43}if((q|0)==43){if(a[b+136>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[b+132>>2]=0;h=b+136|0}a[h>>0]=1;c[b+132>>2]=k;c[b+128>>2]=n;h=c[b+124>>2]|0}c[(c[b+132>>2]|0)+(h<<2)>>2]=e<<21|f;c[b+124>>2]=(c[b+124>>2]|0)+1;n=c[b+108>>2]|0;if((m|0)<(n|0)){e=c[b+64>>2]|0;if((e|0)<(n|0)){if((c[b+68>>2]|0)<(n|0)){if(!n){h=0;j=e}else{c[6995]=(c[6995]|0)+1;h=sc((n<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}j=c[b+64>>2]|0}k=c[b+72>>2]|0;if((j|0)<=0)if(!k)i=b+76|0;else q=59;else{i=0;do{c[h+(i<<2)>>2]=c[k+(i<<2)>>2];i=i+1|0}while((i|0)!=(j|0));q=59}if((q|0)==59)if(!(a[b+76>>0]|0))i=b+76|0;else{c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);i=b+76|0}a[i>>0]=1;c[b+72>>2]=h;c[b+68>>2]=n;m=b+72|0}else{m=b+72|0;h=c[b+72>>2]|0}Yk(h+(e<<2)|0,0,(n<<2)-(e<<2)|0)|0;c[b+64>>2]=n;d=c[b+84>>2]|0;if((d|0)<(n|0)){if((c[b+88>>2]|0)<(n|0)){if(!n){h=0;j=d}else{c[6995]=(c[6995]|0)+1;h=sc((n<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}j=c[b+84>>2]|0}k=c[b+92>>2]|0;if((j|0)<=0)if(!k)i=b+96|0;else q=73;else{i=0;do{c[h+(i<<2)>>2]=c[k+(i<<2)>>2];i=i+1|0}while((i|0)!=(j|0));q=73}if((q|0)==73)if(!(a[b+96>>0]|0))i=b+96|0;else{c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);i=b+96|0}a[i>>0]=1;c[b+92>>2]=h;c[b+88>>2]=n}else h=c[b+92>>2]|0;Yk(h+(d<<2)|0,0,(n<<2)-(d<<2)|0)|0}c[b+84>>2]=n;if((n|0)>0){Yk(c[m>>2]|0,-1,n<<2|0)|0;Yk(c[b+92>>2]|0,-1,n<<2|0)|0}if((e|0)>0){k=c[b+132>>2]|0;i=c[m>>2]|0;j=c[b+92>>2]|0;h=0;do{I=c[k+(h<<2)>>2]|0;I=((I+~(I<<15)|0)>>>10^I+~(I<<15))*9|0;I=i+(((((I>>>6^I)+~((I>>>6^I)<<11)|0)>>>16^(I>>>6^I)+~((I>>>6^I)<<11))&(c[b+108>>2]|0)+-1)<<2)|0;c[j+(h<<2)>>2]=c[I>>2];c[I>>2]=h;h=h+1|0}while((h|0)!=(e|0))}}h=p&(c[b+108>>2]|0)+-1}else h=p&m+-1;I=(c[b+72>>2]|0)+(h<<2)|0;c[(c[b+92>>2]|0)+(o<<2)>>2]=c[I>>2];c[I>>2]=o}l=r;return}function Lc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0;u=l;l=l+48|0;A=1.0/+g[b+112>>2];B=1.0/+g[b+116>>2];C=1.0/+g[b+120>>2];v=+g[b+52>>2];w=A*+g[e>>2]+v;p=+g[b+56>>2];o=B*+g[e+4>>2]+p;r=+g[b+60>>2];q=C*+g[e+8>>2]+r;v=A*+g[f>>2]+v;p=B*+g[f+4>>2]+p;r=C*+g[f+8>>2]+r;C=+g[b+20>>2];w=w>2];o=o>2];q=q>2];w=z>2];o=y>2];q=x>2]|0)+-1|0;f=(c[b+72>>2]|0)+-1|0;switch(c[b+108>>2]|0){case 0:{f=(e|0)<(f|0)?e:f;e=(h|0)>0?h:0;k=(j|0)<(k|0)?j:k;n=(n|0)>0?n:0;break}case 1:{f=(e|0)<(f|0)?e:f;e=(h|0)>0?h:0;k=(i|0)<(k|0)?i:k;n=(m|0)>0?m:0;break}case 2:{f=(j|0)<(f|0)?j:f;e=(n|0)>0?n:0;k=(i|0)<(k|0)?i:k;n=(m|0)>0?m:0;break}default:{e=0;n=0}}if((e|0)>=(f|0)){l=u;return}s=(n|0)<(k|0);do if(s){j=(e&1|0)==0;m=e+1|0;r=+(e|0);h=n;while(1){do if(!(a[b+104>>0]|0)){if(a[b+105>>0]|0?(h+e&1|0)==0:0){t=16;break}if(!(j&(a[b+106>>0]|0)!=0)){o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,h,e);switch(c[b+108>>2]|0){case 0:{q=+(h|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=r-+g[b+88>>2]*.5;t=52;break}case 1:{q=o-+g[b+56>>2];p=+(h|0)-+g[b+84>>2]*.5;o=r-+g[b+88>>2]*.5;t=52;break}case 2:{q=r-+g[b+88>>2]*.5;p=+(h|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=52;break}default:{p=+g[u>>2];q=+g[u+4>>2];o=+g[u+8>>2]}}if((t|0)==52){t=0;g[u>>2]=p;g[u+4>>2]=q;g[u+8>>2]=o;g[u+12>>2]=0.0}g[u>>2]=p*+g[b+112>>2];g[u+4>>2]=q*+g[b+116>>2];g[u+8>>2]=o*+g[b+120>>2];o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,h,m);switch(c[b+108>>2]|0){case 0:{q=+(h|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=+(m|0)-+g[b+88>>2]*.5;t=58;break}case 1:{q=o-+g[b+56>>2];p=+(h|0)-+g[b+84>>2]*.5;o=+(m|0)-+g[b+88>>2]*.5;t=58;break}case 2:{q=+(m|0)-+g[b+88>>2]*.5;p=+(h|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=58;break}default:{p=+g[u+16>>2];q=+g[u+20>>2];o=+g[u+24>>2]}}if((t|0)==58){t=0;g[u+16>>2]=p;g[u+20>>2]=q;g[u+24>>2]=o;g[u+28>>2]=0.0}g[u+16>>2]=p*+g[b+112>>2];g[u+20>>2]=q*+g[b+116>>2];g[u+24>>2]=o*+g[b+120>>2];i=h+1|0;o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,i,e);switch(c[b+108>>2]|0){case 0:{q=+(i|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=r-+g[b+88>>2]*.5;t=64;break}case 1:{q=o-+g[b+56>>2];p=+(i|0)-+g[b+84>>2]*.5;o=r-+g[b+88>>2]*.5;t=64;break}case 2:{q=r-+g[b+88>>2]*.5;p=+(i|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=64;break}default:{p=+g[u+32>>2];q=+g[u+36>>2];o=+g[u+40>>2]}}if((t|0)==64){t=0;g[u+32>>2]=p;g[u+36>>2]=q;g[u+40>>2]=o;g[u+44>>2]=0.0}g[u+32>>2]=p*+g[b+112>>2];g[u+36>>2]=q*+g[b+116>>2];g[u+40>>2]=o*+g[b+120>>2];Vb[c[(c[d>>2]|0)+8>>2]&127](d,u,h,e);o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,i,e);switch(c[b+108>>2]|0){case 0:{q=+(i|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=r-+g[b+88>>2]*.5;t=70;break}case 1:{q=o-+g[b+56>>2];p=+(i|0)-+g[b+84>>2]*.5;o=r-+g[b+88>>2]*.5;t=70;break}case 2:{q=r-+g[b+88>>2]*.5;p=+(i|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=70;break}default:{p=+g[u>>2];q=+g[u+4>>2];o=+g[u+8>>2]}}if((t|0)==70){t=0;g[u>>2]=p;g[u+4>>2]=q;g[u+8>>2]=o;g[u+12>>2]=0.0}g[u>>2]=p*+g[b+112>>2];g[u+4>>2]=q*+g[b+116>>2];g[u+8>>2]=o*+g[b+120>>2];o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,i,m);switch(c[b+108>>2]|0){case 0:{q=+(i|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=+(m|0)-+g[b+88>>2]*.5;t=76;break}case 1:{q=o-+g[b+56>>2];p=+(i|0)-+g[b+84>>2]*.5;o=+(m|0)-+g[b+88>>2]*.5;t=76;break}case 2:{q=+(m|0)-+g[b+88>>2]*.5;p=+(i|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=76;break}default:{p=+g[u+32>>2];q=+g[u+36>>2];o=+g[u+40>>2]}}if((t|0)==76){t=0;g[u+32>>2]=p;g[u+36>>2]=q;g[u+40>>2]=o;g[u+44>>2]=0.0}g[u+32>>2]=p*+g[b+112>>2];g[u+36>>2]=q*+g[b+116>>2];g[u+40>>2]=o*+g[b+120>>2];Vb[c[(c[d>>2]|0)+8>>2]&127](d,u,h,e);h=i}else t=16}else t=16;while(0);if((t|0)==16){t=0;o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,h,e);switch(c[b+108>>2]|0){case 0:{q=+(h|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=r-+g[b+88>>2]*.5;t=21;break}case 1:{q=o-+g[b+56>>2];p=+(h|0)-+g[b+84>>2]*.5;o=r-+g[b+88>>2]*.5;t=21;break}case 2:{q=r-+g[b+88>>2]*.5;p=+(h|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=21;break}default:{p=+g[u>>2];q=+g[u+4>>2];o=+g[u+8>>2]}}if((t|0)==21){t=0;g[u>>2]=p;g[u+4>>2]=q;g[u+8>>2]=o;g[u+12>>2]=0.0}g[u>>2]=p*+g[b+112>>2];g[u+4>>2]=q*+g[b+116>>2];g[u+8>>2]=o*+g[b+120>>2];o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,h,m);switch(c[b+108>>2]|0){case 0:{q=+(h|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=+(m|0)-+g[b+88>>2]*.5;t=27;break}case 1:{q=o-+g[b+56>>2];p=+(h|0)-+g[b+84>>2]*.5;o=+(m|0)-+g[b+88>>2]*.5;t=27;break}case 2:{q=+(m|0)-+g[b+88>>2]*.5;p=+(h|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=27;break}default:{p=+g[u+16>>2];q=+g[u+20>>2];o=+g[u+24>>2]}}if((t|0)==27){t=0;g[u+16>>2]=p;g[u+20>>2]=q;g[u+24>>2]=o;g[u+28>>2]=0.0}g[u+16>>2]=p*+g[b+112>>2];g[u+20>>2]=q*+g[b+116>>2];g[u+24>>2]=o*+g[b+120>>2];i=h+1|0;o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,i,m);switch(c[b+108>>2]|0){case 0:{q=+(i|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=+(m|0)-+g[b+88>>2]*.5;t=33;break}case 1:{q=o-+g[b+56>>2];p=+(i|0)-+g[b+84>>2]*.5;o=+(m|0)-+g[b+88>>2]*.5;t=33;break}case 2:{q=+(m|0)-+g[b+88>>2]*.5;p=+(i|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=33;break}default:{p=+g[u+32>>2];q=+g[u+36>>2];o=+g[u+40>>2]}}if((t|0)==33){t=0;g[u+32>>2]=p;g[u+36>>2]=q;g[u+40>>2]=o;g[u+44>>2]=0.0}g[u+32>>2]=p*+g[b+112>>2];g[u+36>>2]=q*+g[b+116>>2];g[u+40>>2]=o*+g[b+120>>2];Vb[c[(c[d>>2]|0)+8>>2]&127](d,u,h,e);o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,i,m);switch(c[b+108>>2]|0){case 0:{q=+(i|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=+(m|0)-+g[b+88>>2]*.5;t=39;break}case 1:{q=o-+g[b+56>>2];p=+(i|0)-+g[b+84>>2]*.5;o=+(m|0)-+g[b+88>>2]*.5;t=39;break}case 2:{q=+(m|0)-+g[b+88>>2]*.5;p=+(i|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=39;break}default:{p=+g[u+16>>2];q=+g[u+20>>2];o=+g[u+24>>2]}}if((t|0)==39){t=0;g[u+16>>2]=p;g[u+20>>2]=q;g[u+24>>2]=o;g[u+28>>2]=0.0}g[u+16>>2]=p*+g[b+112>>2];g[u+20>>2]=q*+g[b+116>>2];g[u+24>>2]=o*+g[b+120>>2];o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,i,e);switch(c[b+108>>2]|0){case 0:{q=+(i|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=r-+g[b+88>>2]*.5;t=45;break}case 1:{q=o-+g[b+56>>2];p=+(i|0)-+g[b+84>>2]*.5;o=r-+g[b+88>>2]*.5;t=45;break}case 2:{q=r-+g[b+88>>2]*.5;p=+(i|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=45;break}default:{p=+g[u+32>>2];q=+g[u+36>>2];o=+g[u+40>>2]}}if((t|0)==45){t=0;g[u+32>>2]=p;g[u+36>>2]=q;g[u+40>>2]=o;g[u+44>>2]=0.0}g[u+32>>2]=p*+g[b+112>>2];g[u+36>>2]=q*+g[b+116>>2];g[u+40>>2]=o*+g[b+120>>2];Vb[c[(c[d>>2]|0)+8>>2]&127](d,u,h,e);h=i}if((h|0)==(k|0)){e=m;break}}}else e=e+1|0;while((e|0)!=(f|0));l=u;return}function Mc(b,d,e,f,h,i,j,k){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=+i;j=+j;k=k|0;var m=0,n=0.0,o=0,p=0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0,K=0.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.0,Y=0.0,Z=0.0,_=0,$=0;W=l;l=l+16|0;m=c[h+4>>2]|0;if((m|0)<0){if((c[h+8>>2]|0)<0){o=c[h+12>>2]|0;if(o|0){if(a[h+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0)}c[h+12>>2]=0}a[h+16>>0]=1;c[h+12>>2]=0;c[h+8>>2]=0}do{V=(c[h+12>>2]|0)+(m<<4)|0;c[V>>2]=c[W>>2];c[V+4>>2]=c[W+4>>2];c[V+8>>2]=c[W+8>>2];c[V+12>>2]=c[W+12>>2];m=m+1|0}while((m|0)!=0)}c[h+4>>2]=0;r=c[f+4>>2]|0;if((c[h+8>>2]|0)<(r|0)){if(r){c[6995]=(c[6995]|0)+1;m=sc((r<<4|3)+16|0)|0;if(!m)m=0;else{c[(m+4+15&-16)+-4>>2]=m;m=m+4+15&-16}p=c[h+4>>2]|0;if((p|0)>0){o=0;do{V=m+(o<<4)|0;U=(c[h+12>>2]|0)+(o<<4)|0;c[V>>2]=c[U>>2];c[V+4>>2]=c[U+4>>2];c[V+8>>2]=c[U+8>>2];c[V+12>>2]=c[U+12>>2];o=o+1|0}while((o|0)!=(p|0));p=h+12|0}else p=h+12|0}else{m=0;p=h+12|0}o=c[p>>2]|0;if(o|0){if(a[h+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0)}c[p>>2]=0}a[h+16>>0]=1;c[p>>2]=m;c[h+8>>2]=r}p=c[d+28>>2]|0;if((p|0)<=0){l=W;return}V=c[d+36>>2]|0;E=+g[e>>2];F=+g[e+4>>2];G=+g[e+8>>2];H=+g[e+16>>2];v=+g[e+20>>2];t=+g[e+24>>2];s=+g[e+32>>2];q=+g[e+36>>2];n=+g[e+40>>2];w=+g[b>>2];x=+g[b+4>>2];y=+g[b+8>>2];U=-1;u=3402823466385288598117041.0e14;m=0;while(1){z=+g[V+(m*36|0)+20>>2];A=+g[V+(m*36|0)+24>>2];B=+g[V+(m*36|0)+28>>2];o=(z*E+A*F+B*G)*w+(z*H+A*v+B*t)*x+(z*s+A*q+B*n)*y>2]|0;if((N|0)>0){O=V+(U*36|0)+12|0;P=V+(U*36|0)+20|0;Q=V+(U*36|0)+24|0;R=V+(U*36|0)+28|0;M=0;x=E;y=F;u=G;w=H;while(1){J=c[O>>2]|0;m=c[J+(M<<2)>>2]|0;I=c[d+16>>2]|0;M=M+1|0;L=(M|0)==(N|0);J=c[J+((L?0:M)<<2)>>2]|0;X=+g[I+(m<<4)>>2];Y=X-+g[I+(J<<4)>>2];z=+g[I+(m<<4)+4>>2];Z=z-+g[I+(J<<4)+4>>2];A=+g[I+(m<<4)+8>>2];F=A-+g[I+(J<<4)+8>>2];B=Y*x+Z*y+F*u;E=Y*w+Z*v+F*t;F=Y*s+Z*q+F*n;Z=+g[P>>2];Y=+g[Q>>2];K=+g[R>>2];G=x*Z+y*Y+u*K;H=w*Z+v*Y+t*K;K=s*Z+q*Y+n*K;A=(X*x+z*y+A*u+ +g[e+48>>2])*-(E*K-F*H)+(X*w+z*v+A*t+ +g[e+52>>2])*-(F*G-B*K)+(X*s+z*q+A*n+ +g[e+56>>2])*-(B*H-E*G);J=f;I=h;m=c[J+4>>2]|0;if((m|0)>=2){p=c[J+12>>2]|0;s=+g[p+(m+-1<<4)>>2];u=+g[p+(m+-1<<4)+4>>2];v=+g[p+(m+-1<<4)+8>>2];o=0;q=s*-(E*K-F*H)+u*-(F*G-B*K)+v*-(B*H-E*G)-A;while(1){x=+g[p+(o<<4)>>2];y=+g[p+(o<<4)+4>>2];z=+g[p+(o<<4)+8>>2];n=+g[p+(o<<4)+12>>2];w=x*-(E*K-F*H)+y*-(F*G-B*K)+z*-(B*H-E*G)-A;do if(q<0.0)if(w<0.0){r=c[I+4>>2]|0;if((r|0)!=(c[I+8>>2]|0)){t=x;s=y;q=z;C=87;break}D=r|0?r<<1:1;if((r|0)>=(D|0)){t=x;s=y;q=z;C=87;break}if(!D)p=0;else{c[6995]=(c[6995]|0)+1;p=sc((D<<4|3)+16|0)|0;if(!p)p=0;else{c[(p+4+15&-16)+-4>>2]=p;p=p+4+15&-16}r=c[I+4>>2]|0}if((r|0)>0){C=0;do{_=p+(C<<4)|0;$=(c[I+12>>2]|0)+(C<<4)|0;c[_>>2]=c[$>>2];c[_+4>>2]=c[$+4>>2];c[_+8>>2]=c[$+8>>2];c[_+12>>2]=c[$+12>>2];C=C+1|0}while((C|0)!=(r|0))}r=c[I+12>>2]|0;if(r|0){if(a[I+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[r+-4>>2]|0)}c[I+12>>2]=0}a[I+16>>0]=1;c[I+12>>2]=p;c[I+8>>2]=D;r=c[I+4>>2]|0;t=x;s=y;q=z;C=87;break}else{q=q/(q-w);t=s+(x-s)*q;s=u+(y-u)*q;q=v+(z-v)*q;r=c[I+4>>2]|0;if((r|0)!=(c[I+8>>2]|0)){n=0.0;C=87;break}D=r|0?r<<1:1;if((r|0)>=(D|0)){n=0.0;C=87;break}if(!D)p=0;else{c[6995]=(c[6995]|0)+1;p=sc((D<<4|3)+16|0)|0;if(!p)p=0;else{c[(p+4+15&-16)+-4>>2]=p;p=p+4+15&-16}r=c[I+4>>2]|0}if((r|0)>0){C=0;do{$=p+(C<<4)|0;_=(c[I+12>>2]|0)+(C<<4)|0;c[$>>2]=c[_>>2];c[$+4>>2]=c[_+4>>2];c[$+8>>2]=c[_+8>>2];c[$+12>>2]=c[_+12>>2];C=C+1|0}while((C|0)!=(r|0))}r=c[I+12>>2]|0;if(r|0){if(a[I+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[r+-4>>2]|0)}c[I+12>>2]=0}a[I+16>>0]=1;c[I+12>>2]=p;c[I+8>>2]=D;r=c[I+4>>2]|0;n=0.0;C=87;break}else if(w<0.0){q=q/(q-w);t=s+(x-s)*q;s=u+(y-u)*q;q=v+(z-v)*q;r=c[I+4>>2]|0;if((r|0)==(c[I+8>>2]|0)?(S=r|0?r<<1:1,(r|0)<(S|0)):0){if(!S)p=0;else{c[6995]=(c[6995]|0)+1;p=sc((S<<4|3)+16|0)|0;if(!p)p=0;else{c[(p+4+15&-16)+-4>>2]=p;p=p+4+15&-16}r=c[I+4>>2]|0}if((r|0)>0){C=0;do{$=p+(C<<4)|0;_=(c[I+12>>2]|0)+(C<<4)|0;c[$>>2]=c[_>>2];c[$+4>>2]=c[_+4>>2];c[$+8>>2]=c[_+8>>2];c[$+12>>2]=c[_+12>>2];C=C+1|0}while((C|0)!=(r|0))}r=c[I+12>>2]|0;if(r|0){if(a[I+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[r+-4>>2]|0)}c[I+12>>2]=0}a[I+16>>0]=1;c[I+12>>2]=p;c[I+8>>2]=S;p=c[I+4>>2]|0}else p=r;r=c[I+12>>2]|0;g[r+(p<<4)>>2]=t;g[r+(p<<4)+4>>2]=s;g[r+(p<<4)+8>>2]=q;g[r+(p<<4)+12>>2]=0.0;r=(c[I+4>>2]|0)+1|0;c[I+4>>2]=r;if((r|0)==(c[I+8>>2]|0)?(T=r|0?r<<1:1,(r|0)<(T|0)):0){if(!T)p=0;else{c[6995]=(c[6995]|0)+1;p=sc((T<<4|3)+16|0)|0;if(!p)p=0;else{c[(p+4+15&-16)+-4>>2]=p;p=p+4+15&-16}r=c[I+4>>2]|0}if((r|0)>0){C=0;do{$=p+(C<<4)|0;_=(c[I+12>>2]|0)+(C<<4)|0;c[$>>2]=c[_>>2];c[$+4>>2]=c[_+4>>2];c[$+8>>2]=c[_+8>>2];c[$+12>>2]=c[_+12>>2];C=C+1|0}while((C|0)!=(r|0))}r=c[I+12>>2]|0;if(r|0){if(a[I+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[r+-4>>2]|0)}c[I+12>>2]=0}a[I+16>>0]=1;c[I+12>>2]=p;c[I+8>>2]=T;r=c[I+4>>2]|0;t=x;s=y;q=z;C=87}else{t=x;s=y;q=z;C=87}}while(0);if((C|0)==87){C=0;$=c[I+12>>2]|0;g[$+(r<<4)>>2]=t;g[$+(r<<4)+4>>2]=s;g[$+(r<<4)+8>>2]=q;g[$+(r<<4)+12>>2]=n;c[I+4>>2]=(c[I+4>>2]|0)+1}o=o+1|0;if((o|0)==(m|0))break;q=w;s=x;v=z;u=y;p=c[J+12>>2]|0}m=c[J+4>>2]|0}if((m|0)<0){if((c[J+8>>2]|0)<0){o=c[J+12>>2]|0;if(o|0){if(a[J+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0)}c[J+12>>2]=0}a[J+16>>0]=1;c[J+12>>2]=0;c[J+8>>2]=0}do{$=(c[J+12>>2]|0)+(m<<4)|0;c[$>>2]=c[W>>2];c[$+4>>2]=c[W+4>>2];c[$+8>>2]=c[W+8>>2];c[$+12>>2]=c[W+12>>2];m=m+1|0}while((m|0)!=0)}c[J+4>>2]=0;x=+g[e>>2];y=+g[e+4>>2];u=+g[e+8>>2];w=+g[e+16>>2];v=+g[e+20>>2];t=+g[e+24>>2];s=+g[e+32>>2];q=+g[e+36>>2];n=+g[e+40>>2];if(L){p=P;o=Q;m=R;C=e+48|0;D=e+52|0;r=e+56|0;break}else{$=f;f=h;h=$}}}else{p=V+(U*36|0)+20|0;o=V+(U*36|0)+24|0;m=V+(U*36|0)+28|0;C=e+48|0;D=e+52|0;r=e+56|0;h=f;x=E;y=F;u=G;w=H}X=+g[p>>2];Y=+g[o>>2];Z=+g[m>>2];u=X*x+Y*y+Z*u;t=X*w+Y*v+Z*t;s=X*s+Y*q+Z*n;q=+g[V+(U*36|0)+32>>2]-(u*+g[C>>2]+t*+g[D>>2]+s*+g[r>>2]);m=c[h+4>>2]|0;if((m|0)<=0){l=W;return}p=0;do{o=c[h+12>>2]|0;n=q+(u*+g[o+(p<<4)>>2]+t*+g[o+(p<<4)+4>>2]+s*+g[o+(p<<4)+8>>2]);n=n<=i?i:n;if(n<=j){m=o+(p<<4)|0;c[W>>2]=c[m>>2];c[W+4>>2]=c[m+4>>2];c[W+8>>2]=c[m+8>>2];c[W+12>>2]=c[m+12>>2];Tb[c[(c[k>>2]|0)+16>>2]&15](k,b,W,n);m=c[h+4>>2]|0}p=p+1|0}while((p|0)<(m|0));l=W;return}function Nc(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=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;x=l;l=l+16|0;j=c[b+228>>2]|0;i=c[b+196>>2]|0;if((i|0)<(j|0)){if((c[b+200>>2]|0)<(j|0)){if(!j){e=0;h=i}else{c[6995]=(c[6995]|0)+1;e=sc((j<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}h=c[b+196>>2]|0}if((h|0)>0){f=0;do{c[e+(f<<2)>>2]=c[(c[b+204>>2]|0)+(f<<2)>>2];f=f+1|0}while((f|0)!=(h|0))}f=c[b+204>>2]|0;if(f|0){if(a[b+208>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+204>>2]=0}a[b+208>>0]=1;c[b+204>>2]=e;c[b+200>>2]=j;f=b+204|0}else f=b+204|0;e=i;do{c[(c[f>>2]|0)+(e<<2)>>2]=0;e=e+1|0}while((e|0)!=(j|0))}else f=b+204|0;c[b+196>>2]=j;e=0;while(1){if((e|0)>=(xb[c[(c[b>>2]|0)+104>>2]&127](b)|0))break;c[(c[f>>2]|0)+(e<<2)>>2]=c[(c[b+236>>2]|0)+(e<<2)>>2];e=e+1|0}e=c[b+196>>2]|0;if((e|0)>1)Ni(b+192|0,0,e+-1|0);if(!(xb[c[(c[b>>2]|0)+104>>2]&127](b)|0))e=0;else e=c[f>>2]|0;h=c[b+212>>2]|0;t=c[b+196>>2]|0;u=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;c[h+4>>2]=d;c[h+12>>2]=e;c[h+16>>2]=t;c[h+20>>2]=u;e=c[h+32>>2]|0;if((e|0)<0){if((c[h+36>>2]|0)<0){f=c[h+40>>2]|0;if(f|0){if(a[h+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[h+40>>2]=0}a[h+44>>0]=1;c[h+40>>2]=0;c[h+36>>2]=0}do{c[(c[h+40>>2]|0)+(e<<2)>>2]=0;e=e+1|0}while((e|0)!=0)}c[h+32>>2]=0;e=c[h+52>>2]|0;if((e|0)<0){if((c[h+56>>2]|0)<0){f=c[h+60>>2]|0;if(f|0){if(a[h+64>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[h+60>>2]=0}a[h+64>>0]=1;c[h+60>>2]=0;c[h+56>>2]=0}do{c[(c[h+60>>2]|0)+(e<<2)>>2]=0;e=e+1|0}while((e|0)!=0)}c[h+52>>2]=0;e=c[h+72>>2]|0;if((e|0)<0){if((c[h+76>>2]|0)<0){f=c[h+80>>2]|0;if(f|0){if(a[h+84>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[h+80>>2]=0}a[h+84>>0]=1;c[h+80>>2]=0;c[h+76>>2]=0}do{c[(c[h+80>>2]|0)+(e<<2)>>2]=0;e=e+1|0}while((e|0)!=0)}c[h+72>>2]=0;u=c[b+216>>2]|0;e=c[(c[u>>2]|0)+8>>2]|0;s=c[b+8>>2]|0;t=c[b+24>>2]|0;t=xb[c[(c[t>>2]|0)+36>>2]&127](t)|0;Sb[e&127](u,s,t);t=c[b+220>>2]|0;s=c[b+24>>2]|0;u=c[b+212>>2]|0;e=c[t+28>>2]|0;if((e|0)<0){if((c[t+32>>2]|0)<0){f=c[t+36>>2]|0;if(f|0){if(a[t+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[t+36>>2]=0}a[t+40>>0]=1;c[t+36>>2]=0;c[t+32>>2]=0}do{c[(c[t+36>>2]|0)+(e<<2)>>2]=0;e=e+1|0}while((e|0)!=0)}c[t+28>>2]=0;j=c[t+8>>2]|0;if((j|0)>0){k=c[t+16>>2]|0;i=0;do{m=k+(i<<3)|0;e=c[m>>2]|0;if((e|0)==(i|0))e=i;else{f=e;h=m;do{e=k+(f<<3)|0;c[h>>2]=c[e>>2];e=c[e>>2]|0;h=k+(e<<3)|0;f=c[h>>2]|0}while((e|0)!=(f|0))}c[m>>2]=e;i=i+1|0}while((i|0)!=(j|0));if((j|0)>1){vj(t+4|0,0,j+-1|0);j=c[t+8>>2]|0}if((j|0)>0){o=c[t+16>>2]|0;e=0;while(1){p=c[o+(e<<3)>>2]|0;m=e;while(1){k=m+1|0;if((k|0)>=(j|0)){n=0;break}if((c[o+(k<<3)>>2]|0)==(p|0))m=k;else{n=1;break}}a:do if((e|0)<=(m|0)){q=c[b+16>>2]|0;f=1;i=e;while(1){h=c[q+(c[o+(i<<3)+4>>2]<<2)>>2]|0;if((c[h+208>>2]|0)==(p|0)){h=c[h+220>>2]|0;f=(h|0)!=4&(f&(h|0)!=1)}if((i|0)<(m|0))i=i+1|0;else break}if(f)while(1){f=c[q+(c[o+(e<<3)+4>>2]<<2)>>2]|0;if((c[f+208>>2]|0)==(p|0)?(c[f+220>>2]&-2|0)!=4:0)c[f+220>>2]=2;if((e|0)>=(m|0))break a;e=e+1|0}else while(1){f=c[q+(c[o+(e<<3)+4>>2]<<2)>>2]|0;if((c[f+208>>2]|0)==(p|0)?(c[f+220>>2]|0)==2:0){c[f+220>>2]=3;g[f+224>>2]=0.0}if((e|0)>=(m|0))break a;e=e+1|0}}while(0);if(n)e=k;else break}}}j=xb[c[(c[s>>2]|0)+36>>2]&127](s)|0;if((j|0)>0){i=0;do{k=zb[c[(c[s>>2]|0)+40>>2]&31](s,i)|0;f=c[k+772>>2]|0;h=c[k+776>>2]|0;if((f|0)!=0?(c[f+220>>2]|0)!=2:0)e=94;else e=92;if(((e|0)==92?(e=0,h|0):0)?(c[h+220>>2]|0)!=2:0)e=94;if((e|0)==94){e=c[f+204>>2]|0;if((e&2|0?((e&4|0)==0?(c[f+220>>2]|0)!=2:0):0)?(c[h+204>>2]&3|0)==0:0){if((c[h+220>>2]&-2|0)!=4)c[h+220>>2]=1;g[h+224>>2]=0.0}q=c[h+204>>2]|0;if(q&2|0?((q&4|e&3|0)==0?(c[h+220>>2]|0)!=2:0):0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}if(a[t+64>>0]|0?Bb[c[(c[s>>2]|0)+28>>2]&63](s,f,h)|0:0){f=c[t+28>>2]|0;if((f|0)==(c[t+32>>2]|0)?(r=f|0?f<<1:1,(f|0)<(r|0)):0){if(!r)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((r<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[t+28>>2]|0}if((f|0)>0){h=0;do{c[e+(h<<2)>>2]=c[(c[t+36>>2]|0)+(h<<2)>>2];h=h+1|0}while((h|0)!=(f|0))}h=c[t+36>>2]|0;if(h){if(a[t+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);f=c[t+28>>2]|0}c[t+36>>2]=0}a[t+40>>0]=1;c[t+36>>2]=e;c[t+32>>2]=r;e=f}else e=f;c[(c[t+36>>2]|0)+(e<<2)>>2]=k;c[t+28>>2]=e+1}}i=i+1|0}while((i|0)<(j|0));e=t+64|0}else e=t+64|0;r=c[t+8>>2]|0;if(!(a[e>>0]|0)){w=xb[c[(c[s>>2]|0)+44>>2]&127](s)|0;v=xb[c[(c[s>>2]|0)+36>>2]&127](s)|0;$b[c[(c[u>>2]|0)+8>>2]&7](u,c[b+16>>2]|0,c[b+8>>2]|0,w,v,-1);v=c[b+212>>2]|0;gh(v);v=c[b+216>>2]|0;u=c[v>>2]|0;u=u+16|0;u=c[u>>2]|0;w=b+72|0;w=c[w>>2]|0;Sb[u&127](v,d,w);l=x;return}q=c[t+28>>2]|0;if((q|0)>1)Ji(t+24|0,0,q+-1|0);if((r|0)<=0){v=c[b+212>>2]|0;gh(v);v=c[b+216>>2]|0;u=c[v>>2]|0;u=u+16|0;u=c[u>>2]|0;w=b+72|0;w=c[w>>2]|0;Sb[u&127](v,d,w);l=x;return}e=0;n=1;p=0;while(1){f=c[t+16>>2]|0;o=c[f+(e<<3)>>2]|0;b:do if((e|0)<(r|0)){i=1;j=c[t+48>>2]|0;h=c[t+52>>2]|0;while(1){m=c[(c[b+16>>2]|0)+(c[f+(e<<3)+4>>2]<<2)>>2]|0;if((j|0)==(h|0)){k=h|0?h<<1:1;if((h|0)<(k|0)){if(!k)f=0;else{c[6995]=(c[6995]|0)+1;f=sc((k<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[t+48>>2]|0}if((h|0)>0){j=0;do{c[f+(j<<2)>>2]=c[(c[t+56>>2]|0)+(j<<2)>>2];j=j+1|0}while((j|0)!=(h|0))}j=c[t+56>>2]|0;if(j){if(a[t+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);h=c[t+48>>2]|0}c[t+56>>2]=0}a[t+60>>0]=1;c[t+56>>2]=f;c[t+52>>2]=k;f=h;h=k}else f=h}else f=j;c[(c[t+56>>2]|0)+(f<<2)>>2]=m;j=f+1|0;c[t+48>>2]=j;s=c[m+220>>2]|0;i=i&((s|0)==2|(s|0)==5);e=e+1|0;if((e|0)>=(r|0)){k=e;f=i;break b}f=c[t+16>>2]|0;if((c[f+(e<<3)>>2]|0)!=(o|0)){k=e;f=i;break}}}else{k=e;f=1}while(0);if((p|0)<(q|0)?(v=c[t+36>>2]|0,w=v+(p<<2)|0,s=c[w>>2]|0,m=c[s+772>>2]|0,(c[((c[m+208>>2]|0)>-1?m:c[s+776>>2]|0)+208>>2]|0)==(o|0)):0){e=p;do{e=e+1|0;if((e|0)>=(q|0))break;s=c[v+(e<<2)>>2]|0;n=c[s+772>>2]|0}while((o|0)==(c[((c[n+208>>2]|0)>-1?n:c[s+776>>2]|0)+208>>2]|0));h=w;i=e-p|0;j=e}else{h=0;i=0;j=n}if(!f)$b[c[(c[u>>2]|0)+8>>2]&7](u,c[t+56>>2]|0,c[t+48>>2]|0,h,i,o);p=(i|0)==0?p:j;e=c[t+48>>2]|0;if((e|0)<0){if((c[t+52>>2]|0)<0){f=c[t+56>>2]|0;if(f|0){if(a[t+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[t+56>>2]=0}a[t+60>>0]=1;c[t+56>>2]=0;c[t+52>>2]=0}do{c[(c[t+56>>2]|0)+(e<<2)>>2]=0;e=e+1|0}while((e|0)!=0)}c[t+48>>2]=0;if((k|0)>=(r|0))break;else{e=k;n=j}}v=c[b+212>>2]|0;gh(v);v=c[b+216>>2]|0;u=c[v>>2]|0;u=u+16|0;u=c[u>>2]|0;w=b+72|0;w=c[w>>2]|0;Sb[u&127](v,d,w);l=x;return}function Oc(b){b=b|0;var d=0.0,e=0.0,f=0,h=0.0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0.0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0;u=l;l=l+176|0;if(!(a[b+738>>0]|0)){l=u;return}g[b+36>>2]=0.0;g[b+744>>2]=0.0;if(!(a[b+736>>0]|0)){f=c[b+28>>2]|0;j=+g[b+600>>2];k=+g[b+604>>2];q=+g[b+608>>2];s=j*+g[f+20>>2]+k*+g[f+24>>2]+q*+g[f+28>>2]+ +g[f+56>>2];i=c[b+32>>2]|0;m=+g[b+664>>2];n=+g[b+668>>2];r=+g[b+672>>2];t=m*+g[i+20>>2]+n*+g[i+24>>2]+r*+g[i+28>>2]+ +g[i+56>>2];o=m*+g[i+36>>2]+n*+g[i+40>>2]+r*+g[i+44>>2]+ +g[i+60>>2];p=j*+g[f+4>>2]+k*+g[f+8>>2]+q*+g[f+12>>2]+ +g[f+52>>2];q=j*+g[f+36>>2]+k*+g[f+40>>2]+q*+g[f+44>>2]+ +g[f+60>>2];r=m*+g[i+4>>2]+n*+g[i+8>>2]+r*+g[i+12>>2]+ +g[i+52>>2];if((r-p)*(r-p)+(t-s)*(t-s)+(o-q)*(o-q)>1.1920928955078125e-07){e=1.0/+D(+((r-p)*(r-p)+(t-s)*(t-s)+(o-q)*(o-q)));g[u+128>>2]=(r-p)*e;g[u+128+4>>2]=(t-s)*e;g[u+128+8>>2]=(o-q)*e;c[u+128+12>>2]=0;m=(o-q)*e;d=(t-s)*e;e=(r-p)*e}else{c[u+128>>2]=1065353216;c[u+128+4>>2]=0;c[u+128+8>>2]=0;g[u+128+12>>2]=0.0;m=0.0;d=0.0;e=1.0}if(+C(+m)>.7071067690849304){w=m*m+d*d;v=1.0/+D(+w);j=-(v*m);m=v*d;n=-(m*e);h=e*j;k=0.0;d=w*v;e=m}else{j=e*e+d*d;h=1.0/+D(+j);k=-(d*h);d=h*e;n=m*k;h=j*h;j=d;d=-(d*m);e=0.0}g[u+128+16>>2]=k;g[u+128+20>>2]=j;g[u+128+24>>2]=e;g[u+128+32>>2]=d;g[u+128+36>>2]=n;g[u+128+40>>2]=h;f=0;while(1){x=c[b+28>>2]|0;c[u+80>>2]=c[x+4>>2];c[u+80+4>>2]=c[x+20>>2];c[u+80+8>>2]=c[x+36>>2];g[u+80+12>>2]=0.0;c[u+80+16>>2]=c[x+8>>2];c[u+80+20>>2]=c[x+24>>2];c[u+80+24>>2]=c[x+40>>2];g[u+80+28>>2]=0.0;c[u+80+32>>2]=c[x+12>>2];c[u+80+36>>2]=c[x+28>>2];c[u+80+40>>2]=c[x+44>>2];g[u+80+44>>2]=0.0;c[u+32>>2]=c[i+4>>2];c[u+32+4>>2]=c[i+20>>2];c[u+32+8>>2]=c[i+36>>2];g[u+32+12>>2]=0.0;c[u+32+16>>2]=c[i+8>>2];c[u+32+20>>2]=c[i+24>>2];c[u+32+24>>2]=c[i+40>>2];g[u+32+28>>2]=0.0;c[u+32+32>>2]=c[i+12>>2];c[u+32+36>>2]=c[i+28>>2];c[u+32+40>>2]=c[i+44>>2];g[u+32+44>>2]=0.0;w=s-+g[x+56>>2];v=q-+g[x+60>>2];g[u+16>>2]=p-+g[x+52>>2];g[u+16+4>>2]=w;g[u+16+8>>2]=v;g[u+16+12>>2]=0.0;v=t-+g[i+56>>2];w=o-+g[i+60>>2];g[u>>2]=r-+g[i+52>>2];g[u+4>>2]=v;g[u+8>>2]=w;g[u+12>>2]=0.0;x=c[b+28>>2]|0;i=c[b+32>>2]|0;Rg(b+48+(f*84|0)|0,u+80|0,u+32|0,u+16|0,u,u+128+(f<<4)|0,x+456|0,+g[x+404>>2],i+456|0,+g[i+404>>2]);f=f+1|0;if((f|0)==3)break;i=c[b+32>>2]|0}}n=+g[b+560>>2];o=+g[b+576>>2];p=+g[b+592>>2];if(+C(+p)>.7071067690849304){m=1.0/+D(+(p*p+o*o));d=n*-(p*m);e=(p*p+o*o)*m;h=0.0;j=o*m;k=-(n*o*m);m=-(p*m)}else{m=1.0/+D(+(n*n+o*o));d=(n*n+o*o)*m;e=-(p*n*m);h=-(o*m);j=0.0;k=p*-(o*m);m=n*m}i=c[b+28>>2]|0;K=+g[i+4>>2];J=+g[i+8>>2];s=+g[i+12>>2];R=h*K+m*J+j*s;I=+g[i+20>>2];H=+g[i+24>>2];v=+g[i+28>>2];T=h*I+m*H+j*v;G=+g[i+36>>2];q=+g[i+40>>2];E=+g[i+44>>2];W=h*G+m*q+j*E;B=e*K+k*J+d*s;M=e*I+k*H+d*v;N=e*G+k*q+d*E;f=c[b+32>>2]|0;A=+g[f+4>>2];z=+g[f+20>>2];y=+g[f+36>>2];k=+g[f+8>>2];m=+g[f+24>>2];t=+g[f+40>>2];P=+g[f+12>>2];S=+g[f+28>>2];V=+g[f+44>>2];c[b+300>>2]=0;c[b+300+4>>2]=0;c[b+300+8>>2]=0;c[b+300+12>>2]=0;g[b+316>>2]=R*K+T*I+W*G;g[b+320>>2]=R*J+T*H+W*q;g[b+324>>2]=R*s+T*v+W*E;g[b+328>>2]=0.0;g[b+332>>2]=A*-R+z*-T+y*-W;g[b+336>>2]=k*-R+m*-T+t*-W;g[b+340>>2]=P*-R+S*-T+V*-W;g[b+344>>2]=0.0;F=(R*K+T*I+W*G)*+g[i+456>>2];L=(R*J+T*H+W*q)*+g[i+460>>2];d=(R*s+T*v+W*E)*+g[i+464>>2];g[b+348>>2]=F;g[b+352>>2]=L;g[b+356>>2]=d;g[b+360>>2]=0.0;j=(A*-R+z*-T+y*-W)*+g[f+456>>2];w=(k*-R+m*-T+t*-W)*+g[f+460>>2];X=(P*-R+S*-T+V*-W)*+g[f+464>>2];g[b+364>>2]=j;g[b+368>>2]=w;g[b+372>>2]=X;g[b+376>>2]=0.0;g[b+380>>2]=(R*K+T*I+W*G)*F+(R*J+T*H+W*q)*L+(R*s+T*v+W*E)*d+((A*-R+z*-T+y*-W)*j+(k*-R+m*-T+t*-W)*w+(P*-R+S*-T+V*-W)*X);f=c[b+28>>2]|0;X=+g[f+4>>2];W=+g[f+20>>2];V=+g[f+36>>2];T=+g[f+8>>2];S=+g[f+24>>2];R=+g[f+40>>2];P=+g[f+12>>2];w=+g[f+28>>2];t=+g[f+44>>2];i=c[b+32>>2]|0;m=+g[i+4>>2];k=+g[i+20>>2];j=+g[i+36>>2];y=+g[i+8>>2];z=+g[i+24>>2];A=+g[i+40>>2];d=+g[i+12>>2];L=+g[i+28>>2];F=+g[i+44>>2];c[b+384>>2]=0;c[b+384+4>>2]=0;c[b+384+8>>2]=0;c[b+384+12>>2]=0;g[b+400>>2]=B*X+M*W+N*V;g[b+404>>2]=B*T+M*S+N*R;g[b+408>>2]=B*P+M*w+N*t;g[b+412>>2]=0.0;g[b+416>>2]=m*-B+k*-M+j*-N;g[b+420>>2]=y*-B+z*-M+A*-N;g[b+424>>2]=d*-B+L*-M+F*-N;g[b+428>>2]=0.0;U=(B*X+M*W+N*V)*+g[f+456>>2];Q=(B*T+M*S+N*R)*+g[f+460>>2];r=(B*P+M*w+N*t)*+g[f+464>>2];g[b+432>>2]=U;g[b+436>>2]=Q;g[b+440>>2]=r;g[b+444>>2]=0.0;e=(m*-B+k*-M+j*-N)*+g[i+456>>2];h=(y*-B+z*-M+A*-N)*+g[i+460>>2];O=(d*-B+L*-M+F*-N)*+g[i+464>>2];g[b+448>>2]=e;g[b+452>>2]=h;g[b+456>>2]=O;g[b+460>>2]=0.0;g[b+464>>2]=(B*X+M*W+N*V)*U+(B*T+M*S+N*R)*Q+(B*P+M*w+N*t)*r+((m*-B+k*-M+j*-N)*e+(y*-B+z*-M+A*-N)*h+(d*-B+L*-M+F*-N)*O);i=c[b+28>>2]|0;O=+g[i+4>>2];N=+g[i+20>>2];F=+g[i+36>>2];M=+g[i+8>>2];L=+g[i+24>>2];B=+g[i+40>>2];d=+g[i+12>>2];h=+g[i+28>>2];A=+g[i+44>>2];f=c[b+32>>2]|0;z=+g[f+4>>2];y=+g[f+20>>2];e=+g[f+36>>2];j=+g[f+8>>2];k=+g[f+24>>2];m=+g[f+40>>2];r=+g[f+12>>2];t=+g[f+28>>2];w=+g[f+44>>2];c[b+468>>2]=0;c[b+468+4>>2]=0;c[b+468+8>>2]=0;c[b+468+12>>2]=0;F=(K*n+J*o+s*p)*O+(I*n+H*o+v*p)*N+(G*n+q*o+E*p)*F;B=(K*n+J*o+s*p)*M+(I*n+H*o+v*p)*L+(G*n+q*o+E*p)*B;A=(K*n+J*o+s*p)*d+(I*n+H*o+v*p)*h+(G*n+q*o+E*p)*A;g[b+484>>2]=F;g[b+488>>2]=B;g[b+492>>2]=A;g[b+496>>2]=0.0;s=-(K*n+J*o+s*p);v=-(I*n+H*o+v*p);h=-(G*n+q*o+E*p);g[b+500>>2]=z*s+y*v+e*h;g[b+504>>2]=j*s+k*v+m*h;g[b+508>>2]=r*s+t*v+w*h;g[b+512>>2]=0.0;E=F*+g[i+456>>2];n=B*+g[i+460>>2];o=A*+g[i+464>>2];g[b+516>>2]=E;g[b+520>>2]=n;g[b+524>>2]=o;g[b+528>>2]=0.0;p=(z*s+y*v+e*h)*+g[f+456>>2];q=(j*s+k*v+m*h)*+g[f+460>>2];d=(r*s+t*v+w*h)*+g[f+464>>2];g[b+532>>2]=p;g[b+536>>2]=q;g[b+540>>2]=d;g[b+544>>2]=0.0;g[b+548>>2]=F*E+B*n+A*o+((z*s+y*v+e*h)*p+(j*s+k*v+m*h)*q+(r*s+t*v+w*h)*d);g[b+724>>2]=0.0;f=c[b+28>>2]|0;i=c[b+32>>2]|0;d=+bj(b,f+4|0,i+4|0);g[b+728>>2]=d;g[b+708>>2]=0.0;g[b+712>>2]=0.0;a[b+716>>0]=0;h=+g[b+692>>2];do if(h>=0.0){d=+mh(d-+g[b+688>>2],6.2831854820251465);if(!(d<-3.1415927410125732)){if(d>3.1415927410125732)d=d+-6.2831854820251465}else d=d+6.2831854820251465;if(d<-h){a[b+716>>0]=1;e=1.0;d=-(d+h)}else{if(!(d>h))break;a[b+716>>0]=1;e=-1.0;d=h-d}g[b+708>>2]=d;g[b+712>>2]=e}while(0);T=+g[b+560>>2];U=+g[b+576>>2];X=+g[b+592>>2];V=T*+g[f+4>>2]+U*+g[f+8>>2]+X*+g[f+12>>2];W=T*+g[f+20>>2]+U*+g[f+24>>2]+X*+g[f+28>>2];X=T*+g[f+36>>2]+U*+g[f+40>>2]+X*+g[f+44>>2];g[b+720>>2]=1.0/(V*(V*+g[f+324>>2]+W*+g[f+340>>2]+X*+g[f+356>>2])+W*(V*+g[f+328>>2]+W*+g[f+344>>2]+X*+g[f+360>>2])+X*(V*+g[f+332>>2]+W*+g[f+348>>2]+X*+g[f+364>>2])+(V*(V*+g[i+324>>2]+W*+g[i+340>>2]+X*+g[i+356>>2])+W*(V*+g[i+328>>2]+W*+g[i+344>>2]+X*+g[i+360>>2])+X*(V*+g[i+332>>2]+W*+g[i+348>>2]+X*+g[i+364>>2])));l=u;return}function Pc(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0,N=0,O=0,P=0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0,ca=0.0,da=0.0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0.0,oa=0.0;M=l;l=l+64|0;if(!(c[b+12>>2]|0)){l=M;return}f=(a[b+16>>0]|0)!=0;P=f?e:d;f=f?d:e;i=c[P+4>>2]|0;j=c[f+4>>2]|0;P=c[P+12>>2]|0;aa=+g[P>>2];$=+g[P+16>>2];_=+g[P+32>>2];Z=+g[P+4>>2];Y=+g[P+20>>2];o=+g[P+36>>2];k=+g[P+8>>2];r=+g[P+24>>2];y=+g[P+40>>2];T=+g[P+48>>2];S=+g[P+52>>2];R=+g[P+56>>2];O=c[f+12>>2]|0;X=+g[O>>2];W=+g[O+16>>2];p=+g[O+32>>2];V=+g[O+4>>2];U=+g[O+20>>2];q=+g[O+36>>2];x=+g[O+8>>2];v=+g[O+24>>2];t=+g[O+40>>2];Q=-+g[O+48>>2];I=-+g[O+52>>2];J=-+g[O+56>>2];K=+g[P>>2];L=+g[P+16>>2];H=+g[P+32>>2];B=+g[P+4>>2];A=+g[P+20>>2];z=+g[P+36>>2];w=+g[P+8>>2];u=+g[P+24>>2];s=+g[P+40>>2];P=c[(c[i>>2]|0)+64>>2]|0;n=-+g[j+52>>2];m=-+g[j+56>>2];E=-+g[j+60>>2];g[M+48>>2]=(aa*X+$*W+_*p)*n+(aa*V+$*U+_*q)*m+(aa*x+$*v+_*t)*E;g[M+48+4>>2]=(Z*X+Y*W+o*p)*n+(Z*V+Y*U+o*q)*m+(Z*x+Y*v+o*t)*E;g[M+48+8>>2]=(k*X+r*W+y*p)*n+(k*V+r*U+y*q)*m+(k*x+r*v+y*t)*E;g[M+48+12>>2]=0.0;Sb[P&127](M,i,M+48|0);E=+g[M>>2];y=+g[M+4>>2];r=+g[M+8>>2];k=+g[j+52>>2];m=+g[j+56>>2];n=+g[j+60>>2];o=n*(T*x+S*v+R*t+(x*Q+v*I+t*J)+((x*K+v*L+t*H)*E+(x*B+v*A+t*z)*y+(x*w+v*u+t*s)*r))+(k*(T*X+S*W+R*p+(X*Q+W*I+p*J)+((X*K+W*L+p*H)*E+(X*B+W*A+p*z)*y+(X*w+W*u+p*s)*r))+m*(T*V+S*U+R*q+(V*Q+U*I+q*J)+((V*K+U*L+q*H)*E+(V*B+U*A+q*z)*y+(V*w+U*u+q*s)*r)))-+g[j+68>>2];p=T*X+S*W+R*p+(X*Q+W*I+p*J)+((X*K+W*L+p*H)*E+(X*B+W*A+p*z)*y+(X*w+W*u+p*s)*r)-k*o;q=T*V+S*U+R*q+(V*Q+U*I+q*J)+((V*K+U*L+q*H)*E+(V*B+U*A+q*z)*y+(V*w+U*u+q*s)*r)-m*o;r=T*x+S*v+R*t+(x*Q+v*I+t*J)+((x*K+v*L+t*H)*E+(x*B+v*A+t*z)*y+(x*w+v*u+t*s)*r)-n*o;P=c[f+12>>2]|0;s=+g[P>>2];t=+g[P+4>>2];u=+g[P+8>>2];v=+g[P+16>>2];w=+g[P+20>>2];x=+g[P+24>>2];y=+g[P+32>>2];z=+g[P+36>>2];A=+g[P+40>>2];B=+g[P+48>>2];E=+g[P+52>>2];H=+g[P+56>>2];P=c[b+12>>2]|0;O=o<+g[P+784>>2];c[h+4>>2]=P;if(O){P=c[f+12>>2]|0;$=k*+g[P+16>>2]+m*+g[P+20>>2]+n*+g[P+24>>2];aa=k*+g[P+32>>2]+m*+g[P+36>>2]+n*+g[P+40>>2];g[M+48>>2]=+g[P>>2]*k+ +g[P+4>>2]*m+ +g[P+8>>2]*n;g[M+48+4>>2]=$;g[M+48+8>>2]=aa;g[M+48+12>>2]=0.0;g[M+32>>2]=u*r+(s*p+t*q)+B;g[M+32+4>>2]=p*v+q*w+r*x+E;g[M+32+8>>2]=p*y+q*z+r*A+H;g[M+32+12>>2]=0.0;Tb[c[(c[h>>2]|0)+16>>2]&15](h,M+48|0,M+32|0,o)}if((c[i+4>>2]|0)<7?(c[(c[h+4>>2]|0)+780>>2]|0)<(c[b+24>>2]|0):0){k=+g[j+60>>2];if(+C(+k)>.7071067690849304){n=+g[j+56>>2];aa=1.0/+D(+(k*k+n*n));m=0.0;n=n*aa;k=-(k*aa)}else{aa=+g[j+52>>2];m=+g[j+56>>2];k=1.0/+D(+(aa*aa+m*m));m=-(m*k);n=0.0;k=aa*k}J=.019999999552965164/+nb[c[(c[i>>2]|0)+16>>2]&15](i);J=(J>.39269909262657166?.39269909262657166:J)*.5;I=+G(+J)/+D(+(m*m+k*k+n*n));L=m*I;K=k*I;I=n*I;J=+F(+J);f=c[b+20>>2]|0;if((f|0)>0){i=0;do{v=+g[j+52>>2];aa=+g[j+56>>2];B=+g[j+60>>2];z=+(i|0)*(6.2831854820251465/+(f|0))*.5;$=+G(+z)/+D(+(v*v+aa*aa+B*B));z=+F(+z);A=I*-(aa*$)+(L*z+J*-(v*$))-K*-(B*$);x=L*-(B*$)+(K*z+J*-(aa*$))-I*-(v*$);da=K*-(v*$)+(I*z+J*-(B*$))-L*-(aa*$);H=J*z-L*-(v*$)-K*-(aa*$)-I*-(B*$);ia=B*$*x+(v*$*H+z*A)-aa*$*da;ha=v*$*da+(z*x+aa*$*H)-B*$*A;la=aa*$*A+(B*$*H+z*da)-v*$*x;da=z*H-v*$*A-aa*$*x-B*$*da;f=(a[b+16>>0]|0)!=0;ba=f?e:d;f=f?d:e;P=c[ba+4>>2]|0;O=c[f+4>>2]|0;ba=c[ba+12>>2]|0;$=+g[ba>>2];B=+g[ba+4>>2];x=+g[ba+8>>2];aa=+g[ba+16>>2];A=+g[ba+20>>2];v=+g[ba+24>>2];H=+g[ba+32>>2];z=+g[ba+36>>2];t=+g[ba+40>>2];V=+g[ba+48>>2];W=+g[ba+52>>2];X=+g[ba+56>>2];ba=c[f+12>>2]|0;R=+g[ba>>2];S=+g[ba+16>>2];p=+g[ba+32>>2];T=+g[ba+4>>2];U=+g[ba+20>>2];q=+g[ba+36>>2];w=+g[ba+8>>2];u=+g[ba+24>>2];s=+g[ba+40>>2];Y=-+g[ba+48>>2];Z=-+g[ba+52>>2];_=-+g[ba+56>>2];ga=ia*(2.0/(ia*ia+ha*ha+la*la+da*da));n=ha*(2.0/(ia*ia+ha*ha+la*la+da*da));ca=la*(2.0/(ia*ia+ha*ha+la*la+da*da));na=x*(ia*ca-da*n)+(B*(ia*n+da*ca)+$*(1.0-(ha*n+la*ca)));ka=x*(ha*ca+da*ga)+($*(ia*n-da*ca)+B*(1.0-(ia*ga+la*ca)));k=$*(ia*ca+da*n)+B*(ha*ca-da*ga)+x*(1.0-(ia*ga+ha*n));ma=v*(ia*ca-da*n)+(A*(ia*n+da*ca)+aa*(1.0-(ha*n+la*ca)));ja=v*(ha*ca+da*ga)+(aa*(ia*n-da*ca)+A*(1.0-(ia*ga+la*ca)));y=aa*(ia*ca+da*n)+A*(ha*ca-da*ga)+v*(1.0-(ia*ga+ha*n));oa=t*(ia*ca-da*n)+(z*(ia*n+da*ca)+H*(1.0-(ha*n+la*ca)));la=t*(ha*ca+da*ga)+(H*(ia*n-da*ca)+z*(1.0-(ia*ga+la*ca)));n=H*(ia*ca+da*n)+z*(ha*ca-da*ga)+t*(1.0-(ia*ga+ha*n));ha=+g[ba>>2];ga=+g[ba+16>>2];ia=+g[ba+32>>2];da=+g[ba+4>>2];ca=+g[ba+20>>2];ea=+g[ba+36>>2];m=+g[ba+8>>2];r=+g[ba+24>>2];o=+g[ba+40>>2];ba=c[(c[P>>2]|0)+64>>2]|0;fa=-+g[O+52>>2];Q=-+g[O+56>>2];E=-+g[O+60>>2];g[M+32>>2]=(ia*oa+(ha*na+ga*ma))*fa+(ea*oa+(da*na+ca*ma))*Q+(o*oa+(m*na+r*ma))*E;g[M+32+4>>2]=(ia*la+(ha*ka+ga*ja))*fa+(ea*la+(da*ka+ca*ja))*Q+(o*la+(m*ka+r*ja))*E;g[M+32+8>>2]=(ia*n+(ha*k+ga*y))*fa+(ea*n+(da*k+ca*y))*Q+(o*n+(m*k+r*y))*E;g[M+32+12>>2]=0.0;Sb[ba&127](M+48|0,P,M+32|0);E=+g[M+48>>2];y=+g[M+48+4>>2];r=+g[M+48+8>>2];k=+g[O+52>>2];m=+g[O+56>>2];n=+g[O+60>>2];o=n*(V*w+W*u+X*s+(w*Y+u*Z+s*_)+(($*w+aa*u+H*s)*E+(B*w+A*u+z*s)*y+(x*w+v*u+t*s)*r))+(k*(V*R+W*S+X*p+(R*Y+S*Z+p*_)+(($*R+aa*S+H*p)*E+(B*R+A*S+z*p)*y+(x*R+v*S+t*p)*r))+m*(V*T+W*U+X*q+(T*Y+U*Z+q*_)+(($*T+aa*U+H*q)*E+(B*T+A*U+z*q)*y+(x*T+v*U+t*q)*r)))-+g[O+68>>2];p=V*R+W*S+X*p+(R*Y+S*Z+p*_)+(($*R+aa*S+H*p)*E+(B*R+A*S+z*p)*y+(x*R+v*S+t*p)*r)-k*o;q=V*T+W*U+X*q+(T*Y+U*Z+q*_)+(($*T+aa*U+H*q)*E+(B*T+A*U+z*q)*y+(x*T+v*U+t*q)*r)-m*o;r=V*w+W*u+X*s+(w*Y+u*Z+s*_)+(($*w+aa*u+H*s)*E+(B*w+A*u+z*s)*y+(x*w+v*u+t*s)*r)-n*o;O=c[f+12>>2]|0;s=+g[O>>2];t=+g[O+4>>2];u=+g[O+8>>2];v=+g[O+16>>2];w=+g[O+20>>2];x=+g[O+24>>2];y=+g[O+32>>2];z=+g[O+36>>2];A=+g[O+40>>2];B=+g[O+48>>2];E=+g[O+52>>2];H=+g[O+56>>2];O=c[b+12>>2]|0;P=o<+g[O+784>>2];c[h+4>>2]=O;if(P){ba=c[f+12>>2]|0;na=k*+g[ba+16>>2]+m*+g[ba+20>>2]+n*+g[ba+24>>2];oa=k*+g[ba+32>>2]+m*+g[ba+36>>2]+n*+g[ba+40>>2];g[M+32>>2]=+g[ba>>2]*k+ +g[ba+4>>2]*m+ +g[ba+8>>2]*n;g[M+32+4>>2]=na;g[M+32+8>>2]=oa;g[M+32+12>>2]=0.0;g[M+16>>2]=u*r+(s*p+t*q)+B;g[M+16+4>>2]=p*v+q*w+r*x+E;g[M+16+8>>2]=p*y+q*z+r*A+H;g[M+16+12>>2]=0.0;Tb[c[(c[h>>2]|0)+16>>2]&15](h,M+32|0,M+16|0,o)}i=i+1|0;f=c[b+20>>2]|0}while((i|0)<(f|0))}}do if((a[b+8>>0]|0?c[(c[b+12>>2]|0)+780>>2]|0:0)?(N=c[h+4>>2]|0,c[N+780>>2]|0):0){i=c[N+772>>2]|0;j=c[(c[h+8>>2]|0)+8>>2]|0;f=c[(c[h+12>>2]|0)+8>>2]|0;if((i|0)==(j|0)){af(N,i+4|0,f+4|0);break}else{af(N,f+4|0,j+4|0);break}}while(0);l=M;return}function Qc(d,e,f,h){d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0;c[d+168>>2]=c[d+152>>2];c[e>>2]=9356;c[e+52>>2]=287;a[e+60>>0]=0;a[e+80>>0]=1;c[e+76>>2]=0;c[e+68>>2]=0;c[e+72>>2]=0;a[e+100>>0]=1;c[e+96>>2]=0;c[e+88>>2]=0;c[e+92>>2]=0;a[e+120>>0]=1;c[e+116>>2]=0;c[e+108>>2]=0;c[e+112>>2]=0;a[e+140>>0]=1;c[e+136>>2]=0;c[e+128>>2]=0;c[e+132>>2]=0;c[e+144>>2]=0;a[e+164>>0]=1;c[e+160>>2]=0;c[e+152>>2]=0;c[e+156>>2]=0;c[e+168>>2]=0;c[e+4>>2]=-8388609;c[e+8>>2]=-8388609;c[e+12>>2]=-8388609;g[e+16>>2]=0.0;c[e+20>>2]=2139095039;c[e+24>>2]=2139095039;c[e+28>>2]=2139095039;g[e+32>>2]=0.0;f=c[d+56>>2]|0;if(h){c[e+56>>2]=KB(f|0)|0;a[e+4>>0]=a[d+4+3>>0]|0;a[e+5>>0]=a[d+4+2>>0]|0;a[e+6>>0]=a[d+4+1>>0]|0;a[e+7>>0]=a[d+4>>0]|0;a[e+8>>0]=a[d+8+3>>0]|0;a[e+9>>0]=a[d+8+2>>0]|0;a[e+10>>0]=a[d+8+1>>0]|0;a[e+11>>0]=a[d+8>>0]|0;a[e+12>>0]=a[d+12+3>>0]|0;a[e+13>>0]=a[d+12+2>>0]|0;a[e+14>>0]=a[d+12+1>>0]|0;a[e+15>>0]=a[d+12>>0]|0;a[e+16>>0]=a[d+16+3>>0]|0;a[e+17>>0]=a[d+16+2>>0]|0;a[e+18>>0]=a[d+16+1>>0]|0;a[e+19>>0]=a[d+16>>0]|0;a[e+20>>0]=a[d+20+3>>0]|0;a[e+21>>0]=a[d+20+2>>0]|0;a[e+22>>0]=a[d+20+1>>0]|0;a[e+23>>0]=a[d+20>>0]|0;a[e+24>>0]=a[d+24+3>>0]|0;a[e+25>>0]=a[d+24+2>>0]|0;a[e+26>>0]=a[d+24+1>>0]|0;a[e+27>>0]=a[d+24>>0]|0;a[e+28>>0]=a[d+28+3>>0]|0;a[e+29>>0]=a[d+28+2>>0]|0;a[e+30>>0]=a[d+28+1>>0]|0;a[e+31>>0]=a[d+28>>0]|0;a[e+32>>0]=a[d+32+3>>0]|0;a[e+33>>0]=a[d+32+2>>0]|0;a[e+34>>0]=a[d+32+1>>0]|0;a[e+35>>0]=a[d+32>>0]|0;a[e+36>>0]=a[d+36+3>>0]|0;a[e+37>>0]=a[d+36+2>>0]|0;a[e+38>>0]=a[d+36+1>>0]|0;a[e+39>>0]=a[d+36>>0]|0;a[e+40>>0]=a[d+40+3>>0]|0;a[e+41>>0]=a[d+40+2>>0]|0;a[e+42>>0]=a[d+40+1>>0]|0;a[e+43>>0]=a[d+40>>0]|0;a[e+44>>0]=a[d+44+3>>0]|0;a[e+45>>0]=a[d+44+2>>0]|0;a[e+46>>0]=a[d+44+1>>0]|0;a[e+47>>0]=a[d+44>>0]|0;a[e+48>>0]=a[d+48+3>>0]|0;a[e+49>>0]=a[d+48+2>>0]|0;a[e+50>>0]=a[d+48+1>>0]|0;a[e+51>>0]=a[d+48>>0]|0;c[e+144>>2]=KB(c[d+144>>2]|0)|0;f=KB(c[d+168>>2]|0)|0}else{c[e+56>>2]=f;c[e+4>>2]=c[d+4>>2];c[e+4+4>>2]=c[d+4+4>>2];c[e+4+8>>2]=c[d+4+8>>2];c[e+4+12>>2]=c[d+4+12>>2];c[e+20>>2]=c[d+20>>2];c[e+20+4>>2]=c[d+20+4>>2];c[e+20+8>>2]=c[d+20+8>>2];c[e+20+12>>2]=c[d+20+12>>2];c[e+36>>2]=c[d+36>>2];c[e+36+4>>2]=c[d+36+4>>2];c[e+36+8>>2]=c[d+36+8>>2];c[e+36+12>>2]=c[d+36+12>>2];c[e+144>>2]=c[d+144>>2];f=c[d+168>>2]|0}c[e+168>>2]=f;a[e+60>>0]=a[d+60>>0]|0;k=c[d+56>>2]|0;if(!(a[d+60>>0]|0)){f=c[e+96>>2]|0;if(f|0){if(a[e+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[e+96>>2]=0}a[e+100>>0]=0;c[e+96>>2]=e+172;c[e+88>>2]=k;c[e+92>>2]=k;if(h)if((k|0)>0){i=0;j=c[d+96>>2]|0;f=e+172|0;do{l=j+(i<<6)|0;n=f+(i<<6)|0;a[n>>0]=a[l+3>>0]|0;a[n+1>>0]=a[l+2>>0]|0;a[n+2>>0]=a[l+1>>0]|0;a[n+3>>0]=a[l>>0]|0;n=j+(i<<6)+4|0;l=f+(i<<6)+4|0;a[l>>0]=a[n+3>>0]|0;a[l+1>>0]=a[n+2>>0]|0;a[l+2>>0]=a[n+1>>0]|0;a[l+3>>0]=a[n>>0]|0;l=j+(i<<6)+8|0;n=f+(i<<6)+8|0;a[n>>0]=a[l+3>>0]|0;a[n+1>>0]=a[l+2>>0]|0;a[n+2>>0]=a[l+1>>0]|0;a[n+3>>0]=a[l>>0]|0;n=j+(i<<6)+12|0;f=f+(i<<6)+12|0;a[f>>0]=a[n+3>>0]|0;a[f+1>>0]=a[n+2>>0]|0;a[f+2>>0]=a[n+1>>0]|0;a[f+3>>0]=a[n>>0]|0;f=c[d+96>>2]|0;n=f+(i<<6)+16|0;l=c[e+96>>2]|0;m=l+(i<<6)+16|0;a[m>>0]=a[n+3>>0]|0;a[m+1>>0]=a[n+2>>0]|0;a[m+2>>0]=a[n+1>>0]|0;a[m+3>>0]=a[n>>0]|0;m=f+(i<<6)+20|0;n=l+(i<<6)+20|0;a[n>>0]=a[m+3>>0]|0;a[n+1>>0]=a[m+2>>0]|0;a[n+2>>0]=a[m+1>>0]|0;a[n+3>>0]=a[m>>0]|0;n=f+(i<<6)+24|0;m=l+(i<<6)+24|0;a[m>>0]=a[n+3>>0]|0;a[m+1>>0]=a[n+2>>0]|0;a[m+2>>0]=a[n+1>>0]|0;a[m+3>>0]=a[n>>0]|0;f=f+(i<<6)+28|0;l=l+(i<<6)+28|0;a[l>>0]=a[f+3>>0]|0;a[l+1>>0]=a[f+2>>0]|0;a[l+2>>0]=a[f+1>>0]|0;a[l+3>>0]=a[f>>0]|0;j=c[d+96>>2]|0;l=KB(c[j+(i<<6)+32>>2]|0)|0;f=c[e+96>>2]|0;c[f+(i<<6)+32>>2]=l;c[f+(i<<6)+36>>2]=KB(c[j+(i<<6)+36>>2]|0)|0;c[f+(i<<6)+40>>2]=KB(c[j+(i<<6)+40>>2]|0)|0;i=i+1|0}while((i|0)!=(k|0))}else f=e+172|0;else if((k|0)>0){i=0;j=c[d+96>>2]|0;f=e+172|0;do{m=j+(i<<6)|0;n=f+(i<<6)|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];c[n+8>>2]=c[m+8>>2];c[n+12>>2]=c[m+12>>2];n=(c[d+96>>2]|0)+(i<<6)+16|0;f=(c[e+96>>2]|0)+(i<<6)+16|0;c[f>>2]=c[n>>2];c[f+4>>2]=c[n+4>>2];c[f+8>>2]=c[n+8>>2];c[f+12>>2]=c[n+12>>2];j=c[d+96>>2]|0;f=c[e+96>>2]|0;c[f+(i<<6)+32>>2]=c[j+(i<<6)+32>>2];c[f+(i<<6)+36>>2]=c[j+(i<<6)+36>>2];c[f+(i<<6)+40>>2]=c[j+(i<<6)+40>>2];i=i+1|0}while((i|0)!=(k|0))}else f=e+172|0;if(!f){f=k<<6;i=e+92|0;j=e+88|0;k=e+96|0;l=e+100|0}else{if(a[e+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[e+96>>2]=0;f=k<<6;i=e+92|0;j=e+88|0;k=e+96|0;l=e+100|0}}else{f=c[e+136>>2]|0;if(f|0){if(a[e+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[e+136>>2]=0}a[e+140>>0]=0;c[e+136>>2]=e+172;c[e+128>>2]=k;c[e+132>>2]=k;if(h){if((k|0)>0){i=c[d+136>>2]|0;f=0;do{b[e+172+(f<<4)>>1]=JH(b[i+(f<<4)>>1]|0)|0;b[e+172+(f<<4)+2>>1]=JH(b[i+(f<<4)+2>>1]|0)|0;b[e+172+(f<<4)+4>>1]=JH(b[i+(f<<4)+4>>1]|0)|0;b[e+172+(f<<4)+6>>1]=JH(b[i+(f<<4)+6>>1]|0)|0;b[e+172+(f<<4)+8>>1]=JH(b[i+(f<<4)+8>>1]|0)|0;b[e+172+(f<<4)+10>>1]=JH(b[i+(f<<4)+10>>1]|0)|0;c[e+172+(f<<4)+12>>2]=KB(c[i+(f<<4)+12>>2]|0)|0;f=f+1|0}while((f|0)!=(k|0))}}else if((k|0)>0){i=c[d+136>>2]|0;f=0;do{b[e+172+(f<<4)>>1]=b[i+(f<<4)>>1]|0;b[e+172+(f<<4)+2>>1]=b[i+(f<<4)+2>>1]|0;b[e+172+(f<<4)+4>>1]=b[i+(f<<4)+4>>1]|0;b[e+172+(f<<4)+6>>1]=b[i+(f<<4)+6>>1]|0;b[e+172+(f<<4)+8>>1]=b[i+(f<<4)+8>>1]|0;b[e+172+(f<<4)+10>>1]=b[i+(f<<4)+10>>1]|0;c[e+172+(f<<4)+12>>2]=c[i+(f<<4)+12>>2];f=f+1|0}while((f|0)!=(k|0))}c[e+136>>2]=0;f=k<<4;i=e+132|0;j=e+128|0;k=e+136|0;l=e+140|0}a[l>>0]=0;c[k>>2]=0;c[j>>2]=0;c[i>>2]=0;k=e+172+f|0;f=c[d+168>>2]|0;i=c[e+160>>2]|0;if(i|0){if(a[e+164>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[e+160>>2]=0}a[e+164>>0]=0;c[e+160>>2]=k;c[e+152>>2]=f;c[e+156>>2]=f;j=c[d+168>>2]|0;if(h){if((j|0)<=0){c[e>>2]=0;c[e+152>>2]=0;c[e+152+4>>2]=0;c[e+152+8>>2]=0;a[e+152+12>>0]=0;return 1}i=c[d+160>>2]|0;f=0;do{b[k+(f<<5)>>1]=JH(b[i+(f<<5)>>1]|0)|0;b[k+(f<<5)+2>>1]=JH(b[i+(f<<5)+2>>1]|0)|0;b[k+(f<<5)+4>>1]=JH(b[i+(f<<5)+4>>1]|0)|0;b[k+(f<<5)+6>>1]=JH(b[i+(f<<5)+6>>1]|0)|0;b[k+(f<<5)+8>>1]=JH(b[i+(f<<5)+8>>1]|0)|0;b[k+(f<<5)+10>>1]=JH(b[i+(f<<5)+10>>1]|0)|0;c[k+(f<<5)+12>>2]=KB(c[i+(f<<5)+12>>2]|0)|0;c[k+(f<<5)+16>>2]=KB(c[i+(f<<5)+16>>2]|0)|0;f=f+1|0}while((f|0)!=(j|0));c[e>>2]=0;c[e+152>>2]=0;c[e+152+4>>2]=0;c[e+152+8>>2]=0;a[e+152+12>>0]=0;return 1}else{if((j|0)<=0){c[e>>2]=0;c[e+152>>2]=0;c[e+152+4>>2]=0;c[e+152+8>>2]=0;a[e+152+12>>0]=0;return 1}i=c[d+160>>2]|0;f=0;do{b[k+(f<<5)>>1]=b[i+(f<<5)>>1]|0;b[k+(f<<5)+2>>1]=b[i+(f<<5)+2>>1]|0;b[k+(f<<5)+4>>1]=b[i+(f<<5)+4>>1]|0;b[k+(f<<5)+6>>1]=b[i+(f<<5)+6>>1]|0;b[k+(f<<5)+8>>1]=b[i+(f<<5)+8>>1]|0;b[k+(f<<5)+10>>1]=b[i+(f<<5)+10>>1]|0;c[k+(f<<5)+12>>2]=c[i+(f<<5)+12>>2];c[k+(f<<5)+16>>2]=c[i+(f<<5)+16>>2];c[k+(f<<5)+20>>2]=0;c[k+(f<<5)+24>>2]=0;c[k+(f<<5)+28>>2]=0;f=f+1|0}while((f|0)<(c[d+168>>2]|0));c[e>>2]=0;c[e+152>>2]=0;c[e+152+4>>2]=0;c[e+152+8>>2]=0;a[e+152+12>>0]=0;return 1}return 0}function Rc(b,d,e,f,h,i,j,k,m,n){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;var o=0.0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0.0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0;C=l;l=l+4224|0;if(((c[e+4>>2]|0)+-17|0)>>>0<2)A=((c[f+4>>2]|0)+-17|0)>>>0<2;else A=0;b=0;do{Qe();v=+g[24644+(b<<4)>>2];w=+g[24644+(b<<4)+4>>2];x=+g[24644+(b<<4)+8>>2];z=+g[h+4>>2]*-v+ +g[h+20>>2]*-w+ +g[h+36>>2]*-x;y=+g[h+8>>2]*-v+ +g[h+24>>2]*-w+ +g[h+40>>2]*-x;g[C+1248+(b<<4)>>2]=+g[h>>2]*-v+ +g[h+16>>2]*-w+ +g[h+32>>2]*-x;g[C+1248+(b<<4)+4>>2]=z;g[C+1248+(b<<4)+8>>2]=y;g[C+1248+(b<<4)+12>>2]=0.0;y=v*+g[i+4>>2]+w*+g[i+20>>2]+x*+g[i+36>>2];z=v*+g[i+8>>2]+w*+g[i+24>>2]+x*+g[i+40>>2];g[C+256+(b<<4)>>2]=v*+g[i>>2]+w*+g[i+16>>2]+x*+g[i+32>>2];g[C+256+(b<<4)+4>>2]=y;g[C+256+(b<<4)+8>>2]=z;g[C+256+(b<<4)+12>>2]=0.0;b=b+1|0}while((b|0)!=42);q=xb[c[(c[e>>2]|0)+84>>2]&127](e)|0;if((q|0)>0){b=0;p=42;while(1){Sb[c[(c[e>>2]|0)+88>>2]&127](e,b,C+176|0);y=+g[C+176>>2];z=+g[C+176+4>>2];x=+g[C+176+8>>2];w=y*+g[h+16>>2]+z*+g[h+20>>2]+x*+g[h+24>>2];v=y*+g[h+32>>2]+z*+g[h+36>>2]+x*+g[h+40>>2];g[C+176>>2]=+g[h>>2]*y+ +g[h+4>>2]*z+ +g[h+8>>2]*x;g[C+176+4>>2]=w;g[C+176+8>>2]=v;g[C+176+12>>2]=0.0;Qe();r=24644+(p<<4)|0;c[r>>2]=c[C+176>>2];c[r+4>>2]=c[C+176+4>>2];c[r+8>>2]=c[C+176+8>>2];c[r+12>>2]=c[C+176+12>>2];v=+g[C+176>>2];w=+g[C+176+4>>2];x=+g[C+176+8>>2];z=+g[h+4>>2]*-v+ +g[h+20>>2]*-w+ +g[h+36>>2]*-x;y=+g[h+8>>2]*-v+ +g[h+24>>2]*-w+ +g[h+40>>2]*-x;g[C+1248+(p<<4)>>2]=+g[h>>2]*-v+ +g[h+16>>2]*-w+ +g[h+32>>2]*-x;g[C+1248+(p<<4)+4>>2]=z;g[C+1248+(p<<4)+8>>2]=y;g[C+1248+(p<<4)+12>>2]=0.0;y=v*+g[i+4>>2]+w*+g[i+20>>2]+x*+g[i+36>>2];z=v*+g[i+8>>2]+w*+g[i+24>>2]+x*+g[i+40>>2];g[C+256+(p<<4)>>2]=+g[i>>2]*v+ +g[i+16>>2]*w+ +g[i+32>>2]*x;g[C+256+(p<<4)+4>>2]=y;g[C+256+(p<<4)+8>>2]=z;g[C+256+(p<<4)+12>>2]=0.0;b=b+1|0;if((b|0)==(q|0))break;else p=p+1|0}p=q+42|0}else p=42;r=xb[c[(c[f>>2]|0)+84>>2]&127](f)|0;if((r|0)>0){b=0;q=p;while(1){Sb[c[(c[f>>2]|0)+88>>2]&127](f,b,C+176|0);y=+g[C+176>>2];z=+g[C+176+4>>2];x=+g[C+176+8>>2];w=y*+g[i+16>>2]+z*+g[i+20>>2]+x*+g[i+24>>2];v=y*+g[i+32>>2]+z*+g[i+36>>2]+x*+g[i+40>>2];g[C+176>>2]=+g[i>>2]*y+ +g[i+4>>2]*z+ +g[i+8>>2]*x;g[C+176+4>>2]=w;g[C+176+8>>2]=v;g[C+176+12>>2]=0.0;Qe();D=24644+(q<<4)|0;c[D>>2]=c[C+176>>2];c[D+4>>2]=c[C+176+4>>2];c[D+8>>2]=c[C+176+8>>2];c[D+12>>2]=c[C+176+12>>2];v=+g[C+176>>2];w=+g[C+176+4>>2];x=+g[C+176+8>>2];z=+g[h+4>>2]*-v+ +g[h+20>>2]*-w+ +g[h+36>>2]*-x;y=+g[h+8>>2]*-v+ +g[h+24>>2]*-w+ +g[h+40>>2]*-x;g[C+1248+(q<<4)>>2]=+g[h>>2]*-v+ +g[h+16>>2]*-w+ +g[h+32>>2]*-x;g[C+1248+(q<<4)+4>>2]=z;g[C+1248+(q<<4)+8>>2]=y;g[C+1248+(q<<4)+12>>2]=0.0;y=v*+g[i+4>>2]+w*+g[i+20>>2]+x*+g[i+36>>2];z=v*+g[i+8>>2]+w*+g[i+24>>2]+x*+g[i+40>>2];g[C+256+(q<<4)>>2]=+g[i>>2]*v+ +g[i+16>>2]*w+ +g[i+32>>2]*x;g[C+256+(q<<4)+4>>2]=y;g[C+256+(q<<4)+8>>2]=z;g[C+256+(q<<4)+12>>2]=0.0;b=b+1|0;if((b|0)==(r|0))break;else q=q+1|0}p=r+p|0}Vb[c[(c[e>>2]|0)+76>>2]&127](e,C+1248|0,C+3232|0,p);Vb[c[(c[f>>2]|0)+76>>2]&127](f,C+256|0,C+2240|0,p);if((p|0)>0){v=999999984306749440.0;b=0;y=0.0;z=0.0;x=0.0;s=0.0;while(1){Qe();u=+g[24644+(b<<4)>>2];w=+g[24644+(b<<4)+4>>2];t=+g[24644+(b<<4)+12>>2];o=A?0.0:+g[24644+(b<<4)+8>>2];if(u*u+w*w+o*o>.01?(F=+g[C+3232+(b<<4)>>2],E=+g[C+3232+(b<<4)+4>>2],B=+g[C+3232+(b<<4)+8>>2],I=+g[C+2240+(b<<4)>>2],H=+g[C+2240+(b<<4)+4>>2],G=+g[C+2240+(b<<4)+8>>2],B=u*(I*+g[i>>2]+H*+g[i+4>>2]+G*+g[i+8>>2]+ +g[i+48>>2]-(F*+g[h>>2]+E*+g[h+4>>2]+B*+g[h+8>>2]+ +g[h+48>>2]))+w*(I*+g[i+16>>2]+H*+g[i+20>>2]+G*+g[i+24>>2]+ +g[i+52>>2]-(F*+g[h+16>>2]+E*+g[h+20>>2]+B*+g[h+24>>2]+ +g[h+52>>2]))+o*((A?0.0:I*+g[i+32>>2]+H*+g[i+36>>2]+G*+g[i+40>>2]+ +g[i+56>>2])-(A?0.0:F*+g[h+32>>2]+E*+g[h+36>>2]+B*+g[h+40>>2]+ +g[h+56>>2])),B>2]|0){case 4:case 5:case 10:case 11:case 13:case 1:case 0:case 8:break;default:+nb[c[(c[e>>2]|0)+48>>2]&15](e)}switch(c[f+4>>2]|0){case 4:case 5:case 10:case 11:case 13:case 1:case 0:case 8:break;default:+nb[c[(c[f>>2]|0)+48>>2]&15](f)}if(v<0.0){D=0;l=C;return D|0}switch(c[e+4>>2]|0){case 8:{o=+g[e+32>>2]*+g[e+16>>2];break}case 0:{o=+g[e+48>>2];break}case 1:{o=+g[e+48>>2];break}case 13:{o=+g[e+48>>2];break}case 11:{o=+g[e+48>>2];break}case 10:{o=+g[e+48>>2];break}case 4:case 5:{o=+g[e+48>>2];break}default:o=+nb[c[(c[e>>2]|0)+48>>2]&15](e)}b=c[f+4>>2]|0;switch(b|0){case 8:{s=+g[f+32>>2]*+g[f+16>>2];b=8;break}case 0:{s=+g[f+48>>2];b=0;break}case 1:{s=+g[f+48>>2];b=1;break}case 13:{s=+g[f+48>>2];b=13;break}case 11:{s=+g[f+48>>2];b=11;break}case 10:{s=+g[f+48>>2];b=10;break}case 4:case 5:{s=+g[f+48>>2];break}default:{s=+nb[c[(c[f>>2]|0)+48>>2]&15](f);b=c[f+4>>2]|0}}o=v+(o+s+.5);c[C+176>>2]=9552;c[C+176+4>>2]=0;c[C+176+8>>2]=1065353216;c[C+176+12>>2]=0;g[C+176+16>>2]=0.0;c[C+176+20>>2]=0;c[C+176+24>>2]=d;c[C+176+28>>2]=e;c[C+176+32>>2]=f;c[C+176+36>>2]=c[e+4>>2];c[C+176+40>>2]=b;g[C+176+44>>2]=+nb[c[(c[e>>2]|0)+48>>2]&15](e);g[C+176+48>>2]=+nb[c[(c[f>>2]|0)+48>>2]&15](f);a[C+176+52>>0]=0;c[C+176+60>>2]=-1;c[C+176+72>>2]=1;c[C+176+76>>2]=1;G=u*o+ +g[h+48>>2];H=w*o+ +g[h+52>>2];I=x*o+ +g[h+56>>2];c[C+44>>2]=c[h>>2];c[C+44+4>>2]=c[h+4>>2];c[C+44+8>>2]=c[h+8>>2];c[C+44+12>>2]=c[h+12>>2];c[C+44+16>>2]=c[h+16>>2];c[C+44+16+4>>2]=c[h+16+4>>2];c[C+44+16+8>>2]=c[h+16+8>>2];c[C+44+16+12>>2]=c[h+16+12>>2];c[C+44+32>>2]=c[h+32>>2];c[C+44+32+4>>2]=c[h+32+4>>2];c[C+44+32+8>>2]=c[h+32+8>>2];c[C+44+32+12>>2]=c[h+32+12>>2];g[C+44+48>>2]=G;g[C+44+52>>2]=H;g[C+44+56>>2]=I;g[C+44+60>>2]=0.0;c[C+44+64>>2]=c[i>>2];c[C+44+64+4>>2]=c[i+4>>2];c[C+44+64+8>>2]=c[i+8>>2];c[C+44+64+12>>2]=c[i+12>>2];c[C+44+80>>2]=c[i+16>>2];c[C+44+80+4>>2]=c[i+16+4>>2];c[C+44+80+8>>2]=c[i+16+8>>2];c[C+44+80+12>>2]=c[i+16+12>>2];c[C+44+96>>2]=c[i+32>>2];c[C+44+96+4>>2]=c[i+32+4>>2];c[C+44+96+8>>2]=c[i+32+8>>2];c[C+44+96+12>>2]=c[i+32+12>>2];c[C+44+112>>2]=c[i+48>>2];c[C+44+112+4>>2]=c[i+48+4>>2];c[C+44+112+8>>2]=c[i+48+8>>2];c[C+44+112+12>>2]=c[i+48+12>>2];g[C+44+128>>2]=999999984306749440.0;c[C>>2]=9436;a[C+40>>0]=0;g[C+176+4>>2]=-u;g[C+176+8>>2]=-w;g[C+176+12>>2]=-x;g[C+176+16>>2]=0.0;Dc(C+176|0,C+44|0,C,n,0);o=o-+g[C+36>>2];b=a[C+40>>0]|0;if(b<<24>>24){H=+g[C+24>>2]-w*o;I=+g[C+28>>2]-x*o;g[k>>2]=+g[C+20>>2]-u*o;g[k+4>>2]=H;g[k+8>>2]=I;g[k+12>>2]=0.0;c[m>>2]=c[C+20>>2];c[m+4>>2]=c[C+20+4>>2];c[m+8>>2]=c[C+20+8>>2];c[m+12>>2]=c[C+20+12>>2];g[j>>2]=u;g[j+4>>2]=w;g[j+8>>2]=x;g[j+12>>2]=t}D=b<<24>>24!=0;l=C;return D|0}function Sc(){var a=0;a=Ds(8)|0;c[6994]=a;eb(a|0,0)|0;c[6417]=19310;c[6418]=0;c[6419]=0;c[6420]=0;c[6421]=0;c[6422]=0;c[6423]=0;c[6424]=0;c[6425]=0;Pr(25668);c[6426]=19310;c[6427]=0;c[6428]=0;c[6429]=0;c[6430]=0;c[6431]=0;c[6432]=0;c[6433]=0;c[6434]=0;Pr(25704);c[6435]=19310;c[6436]=0;c[6437]=0;c[6438]=0;c[6439]=0;c[6440]=0;c[6441]=0;c[6442]=0;c[6443]=0;Pr(25740);c[6444]=19310;c[6445]=0;c[6446]=0;c[6447]=0;c[6448]=0;c[6449]=0;c[6450]=0;c[6451]=0;c[6452]=0;Pr(25776);c[6453]=19310;c[6454]=0;c[6455]=0;c[6456]=0;c[6457]=0;c[6458]=0;c[6459]=0;c[6460]=0;c[6461]=0;Pr(25812);c[6462]=19310;c[6463]=0;c[6464]=0;c[6465]=0;c[6466]=0;c[6467]=0;c[6468]=0;c[6469]=0;c[6470]=0;Pr(25848);c[6471]=19310;c[6472]=0;c[6473]=0;c[6474]=0;c[6475]=0;c[6476]=0;c[6477]=0;c[6478]=0;c[6479]=0;Pr(25884);c[6480]=19310;c[6481]=0;c[6482]=0;c[6483]=0;c[6484]=0;c[6485]=0;c[6486]=0;c[6487]=0;c[6488]=0;Pr(25920);c[6489]=19310;c[6490]=0;c[6491]=0;c[6492]=0;c[6493]=0;c[6494]=0;c[6495]=0;c[6496]=0;c[6497]=0;Pr(25956);c[6498]=19310;c[6499]=0;c[6500]=0;c[6501]=0;c[6502]=0;c[6503]=0;c[6504]=0;c[6505]=0;c[6506]=0;Pr(25992);c[6507]=19310;c[6508]=0;c[6509]=0;c[6510]=0;c[6511]=0;c[6512]=0;c[6513]=0;c[6514]=0;c[6515]=0;Pr(26028);c[6516]=19310;c[6517]=0;c[6518]=0;c[6519]=0;c[6520]=0;c[6521]=0;c[6522]=0;c[6523]=0;c[6524]=0;Pr(26064);c[6525]=19310;c[6526]=0;c[6527]=0;c[6528]=0;c[6529]=0;c[6530]=0;c[6531]=0;c[6532]=0;c[6533]=0;Pr(26100);c[6534]=19310;c[6535]=0;c[6536]=0;c[6537]=0;c[6538]=0;c[6539]=0;c[6540]=0;c[6541]=0;c[6542]=0;Pr(26136);c[6543]=19310;c[6544]=0;c[6545]=0;c[6546]=0;c[6547]=0;c[6548]=0;c[6549]=0;c[6550]=0;c[6551]=0;Pr(26172);c[6552]=19310;c[6553]=0;c[6554]=0;c[6555]=0;c[6556]=0;c[6557]=0;c[6558]=0;c[6559]=0;c[6560]=0;Pr(26208);c[6561]=19310;c[6562]=0;c[6563]=0;c[6564]=0;c[6565]=0;c[6566]=0;c[6567]=0;c[6568]=0;c[6569]=0;Pr(26244);c[6570]=19310;c[6571]=0;c[6572]=0;c[6573]=0;c[6574]=0;c[6575]=0;c[6576]=0;c[6577]=0;c[6578]=0;Pr(26280);c[6579]=19310;c[6580]=0;c[6581]=0;c[6582]=0;c[6583]=0;c[6584]=0;c[6585]=0;c[6586]=0;c[6587]=0;Pr(26316);c[6588]=19310;c[6589]=0;c[6590]=0;c[6591]=0;c[6592]=0;c[6593]=0;c[6594]=0;c[6595]=0;c[6596]=0;Pr(26352);c[6597]=19310;c[6598]=0;c[6599]=0;c[6600]=0;c[6601]=0;c[6602]=0;c[6603]=0;c[6604]=0;c[6605]=0;Pr(26388);c[6606]=19310;c[6607]=0;c[6608]=0;c[6609]=0;c[6610]=0;c[6611]=0;c[6612]=0;c[6613]=0;c[6614]=0;Pr(26424);c[6615]=19310;c[6616]=0;c[6617]=0;c[6618]=0;c[6619]=0;c[6620]=0;c[6621]=0;c[6622]=0;c[6623]=0;Pr(26460);c[6624]=19310;c[6625]=0;c[6626]=0;c[6627]=0;c[6628]=0;c[6629]=0;c[6630]=0;c[6631]=0;c[6632]=0;Pr(26496);c[6633]=19310;c[6634]=0;c[6635]=0;c[6636]=0;c[6637]=0;c[6638]=0;c[6639]=0;c[6640]=0;c[6641]=0;Pr(26532);c[6642]=19310;c[6643]=0;c[6644]=0;c[6645]=0;c[6646]=0;c[6647]=0;c[6648]=0;c[6649]=0;c[6650]=0;Pr(26568);c[6651]=19310;c[6652]=0;c[6653]=0;c[6654]=0;c[6655]=0;c[6656]=0;c[6657]=0;c[6658]=0;c[6659]=0;Pr(26604);c[6660]=19310;c[6661]=0;c[6662]=0;c[6663]=0;c[6664]=0;c[6665]=0;c[6666]=0;c[6667]=0;c[6668]=0;Pr(26640);c[6669]=19310;c[6670]=0;c[6671]=0;c[6672]=0;c[6673]=0;c[6674]=0;c[6675]=0;c[6676]=0;c[6677]=0;Pr(26676);c[6678]=19310;c[6679]=0;c[6680]=0;c[6681]=0;c[6682]=0;c[6683]=0;c[6684]=0;c[6685]=0;c[6686]=0;Pr(26712);c[6687]=19310;c[6688]=0;c[6689]=0;c[6690]=0;c[6691]=0;c[6692]=0;c[6693]=0;c[6694]=0;c[6695]=0;Pr(26748);c[6696]=19310;c[6697]=0;c[6698]=0;c[6699]=0;c[6700]=0;c[6701]=0;c[6702]=0;c[6703]=0;c[6704]=0;Pr(26784);c[6705]=19310;c[6706]=0;c[6707]=0;c[6708]=0;c[6709]=0;c[6710]=0;c[6711]=0;c[6712]=0;c[6713]=0;Pr(26820);c[6714]=19310;c[6715]=0;c[6716]=0;c[6717]=0;c[6718]=0;c[6719]=0;c[6720]=0;c[6721]=0;c[6722]=0;Pr(26856);c[6723]=19310;c[6724]=0;c[6725]=0;c[6726]=0;c[6727]=0;c[6728]=0;c[6729]=0;c[6730]=0;c[6731]=0;Pr(26892);c[6732]=19310;c[6733]=0;c[6734]=0;c[6735]=0;c[6736]=0;c[6737]=0;c[6738]=0;c[6739]=0;c[6740]=0;Pr(26928);c[6741]=19310;c[6742]=0;c[6743]=0;c[6744]=0;c[6745]=0;c[6746]=0;c[6747]=0;c[6748]=0;c[6749]=0;Pr(26964);c[6750]=19310;c[6751]=0;c[6752]=0;c[6753]=0;c[6754]=0;c[6755]=0;c[6756]=0;c[6757]=0;c[6758]=0;Pr(27e3);c[6759]=19310;c[6760]=0;c[6761]=0;c[6762]=0;c[6763]=0;c[6764]=0;c[6765]=0;c[6766]=0;c[6767]=0;Pr(27036);c[6768]=19310;c[6769]=0;c[6770]=0;c[6771]=0;c[6772]=0;c[6773]=0;c[6774]=0;c[6775]=0;c[6776]=0;Pr(27072);c[6777]=19310;c[6778]=0;c[6779]=0;c[6780]=0;c[6781]=0;c[6782]=0;c[6783]=0;c[6784]=0;c[6785]=0;Pr(27108);c[6786]=19310;c[6787]=0;c[6788]=0;c[6789]=0;c[6790]=0;c[6791]=0;c[6792]=0;c[6793]=0;c[6794]=0;Pr(27144);c[6795]=19310;c[6796]=0;c[6797]=0;c[6798]=0;c[6799]=0;c[6800]=0;c[6801]=0;c[6802]=0;c[6803]=0;Pr(27180);c[6804]=19310;c[6805]=0;c[6806]=0;c[6807]=0;c[6808]=0;c[6809]=0;c[6810]=0;c[6811]=0;c[6812]=0;Pr(27216);c[6813]=19310;c[6814]=0;c[6815]=0;c[6816]=0;c[6817]=0;c[6818]=0;c[6819]=0;c[6820]=0;c[6821]=0;Pr(27252);c[6822]=19310;c[6823]=0;c[6824]=0;c[6825]=0;c[6826]=0;c[6827]=0;c[6828]=0;c[6829]=0;c[6830]=0;Pr(27288);c[6831]=19310;c[6832]=0;c[6833]=0;c[6834]=0;c[6835]=0;c[6836]=0;c[6837]=0;c[6838]=0;c[6839]=0;Pr(27324);c[6840]=19310;c[6841]=0;c[6842]=0;c[6843]=0;c[6844]=0;c[6845]=0;c[6846]=0;c[6847]=0;c[6848]=0;Pr(27360);c[6849]=19310;c[6850]=0;c[6851]=0;c[6852]=0;c[6853]=0;c[6854]=0;c[6855]=0;c[6856]=0;c[6857]=0;Pr(27396);c[6858]=19310;c[6859]=0;c[6860]=0;c[6861]=0;c[6862]=0;c[6863]=0;c[6864]=0;c[6865]=0;c[6866]=0;Pr(27432);c[6867]=19310;c[6868]=0;c[6869]=0;c[6870]=0;c[6871]=0;c[6872]=0;c[6873]=0;c[6874]=0;c[6875]=0;Pr(27468);c[6876]=19310;c[6877]=0;c[6878]=0;c[6879]=0;c[6880]=0;c[6881]=0;c[6882]=0;c[6883]=0;c[6884]=0;Pr(27504);c[6885]=19310;c[6886]=0;c[6887]=0;c[6888]=0;c[6889]=0;c[6890]=0;c[6891]=0;c[6892]=0;c[6893]=0;Pr(27540);c[6894]=19310;c[6895]=0;c[6896]=0;c[6897]=0;c[6898]=0;c[6899]=0;c[6900]=0;c[6901]=0;c[6902]=0;Pr(27576);c[6903]=19310;c[6904]=0;c[6905]=0;c[6906]=0;c[6907]=0;c[6908]=0;c[6909]=0;c[6910]=0;c[6911]=0;Pr(27612);c[6912]=19310;c[6913]=0;c[6914]=0;c[6915]=0;c[6916]=0;c[6917]=0;c[6918]=0;c[6919]=0;c[6920]=0;Pr(27648);c[6921]=19310;c[6922]=0;c[6923]=0;c[6924]=0;c[6925]=0;c[6926]=0;c[6927]=0;c[6928]=0;c[6929]=0;Pr(27684);c[6930]=19310;c[6931]=0;c[6932]=0;c[6933]=0;c[6934]=0;c[6935]=0;c[6936]=0;c[6937]=0;c[6938]=0;Pr(27720);c[6939]=19310;c[6940]=0;c[6941]=0;c[6942]=0;c[6943]=0;c[6944]=0;c[6945]=0;c[6946]=0;c[6947]=0;Pr(27756);c[6948]=19310;c[6949]=0;c[6950]=0;c[6951]=0;c[6952]=0;c[6953]=0;c[6954]=0;c[6955]=0;c[6956]=0;Pr(27792);c[6957]=19310;c[6958]=0;c[6959]=0;c[6960]=0;c[6961]=0;c[6962]=0;c[6963]=0;c[6964]=0;c[6965]=0;Pr(27828);c[6966]=19310;c[6967]=0;c[6968]=0;c[6969]=0;c[6970]=0;c[6971]=0;c[6972]=0;c[6973]=0;c[6974]=0;Pr(27864);c[6975]=19310;c[6976]=0;c[6977]=0;c[6978]=0;c[6979]=0;c[6980]=0;c[6981]=0;c[6982]=0;c[6983]=0;Pr(27900);c[6984]=19310;c[6985]=0;c[6986]=0;c[6987]=0;c[6988]=0;c[6989]=0;c[6990]=0;c[6991]=0;c[6992]=0;Pr(27936);return}function Tc(b){b=b|0;var d=0,e=0.0,f=0.0,h=0.0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0,E=0,F=0,G=0,H=0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0;H=l;l=l+192|0;d=c[b+1112>>2]|0;if((d|0)<=0){l=H;return}G=0;do{F=c[(c[b+1120>>2]|0)+(G<<2)>>2]|0;E=c[F+24>>2]|0;if(E){i=H+144+4|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));g[H+144>>2]=9.999999747378752e-05;g[H+144+20>>2]=1.9999999494757503e-04;g[H+144+40>>2]=2.9999998514540493e-04;if((E|0)>0){i=c[F+32>>2]|0;j=c[F+12>>2]|0;d=0;e=0.0;f=0.0;h=0.0;do{D=c[i+(d<<2)>>2]|0;C=+g[j+(d<<2)>>2];e=e+ +g[D+8>>2]*C;f=f+C*+g[D+12>>2];h=h+C*+g[D+16>>2];d=d+1|0}while((d|0)!=(E|0))}else{h=0.0;f=0.0;e=0.0}r=+g[F+128>>2];t=e*r;s=f*r;r=h*r;g[F+228>>2]=t;g[F+232>>2]=s;g[F+236>>2]=r;g[F+240>>2]=0.0;if((E|0)>0){i=c[F+32>>2]|0;j=c[F+52>>2]|0;d=0;e=9.999999747378752e-05;f=0.0;h=0.0;k=0.0;m=1.9999999494757503e-04;n=0.0;o=0.0;p=0.0;q=2.9999998514540493e-04;do{D=c[i+(d<<2)>>2]|0;x=+g[D+8>>2]-t;y=+g[D+12>>2]-s;B=+g[D+16>>2]-r;z=+g[j+(d<<4)>>2];A=+g[j+(d<<4)+4>>2];C=+g[j+(d<<4)+8>>2];e=x*z+e;f=x*A+f;h=x*C+h;k=y*z+k;m=y*A+m;n=y*C+n;o=B*z+o;p=B*A+p;q=B*C+q;d=d+1|0}while((d|0)!=(E|0));g[H+144>>2]=e;g[H+144+4>>2]=f;g[H+144+8>>2]=h;g[H+144+16>>2]=k;g[H+144+20>>2]=m;g[H+144+24>>2]=n;g[H+144+32>>2]=o;g[H+144+36>>2]=p;g[H+144+40>>2]=q}if((a[22456]|0)==0?Uz(22456)|0:0){g[5758]=9.999999747378752e-05;c[5759]=16}bd(H+144|0,H+96|0,H+48|0);c[F+108>>2]=c[F+228>>2];c[F+108+4>>2]=c[F+228+4>>2];c[F+108+8>>2]=c[F+228+8>>2];c[F+108+12>>2]=c[F+228+12>>2];c[F+60>>2]=c[H+96>>2];c[F+60+4>>2]=c[H+96+4>>2];c[F+60+8>>2]=c[H+96+8>>2];c[F+60+12>>2]=c[H+96+12>>2];c[F+76>>2]=c[H+96+16>>2];c[F+76+4>>2]=c[H+96+16+4>>2];c[F+76+8>>2]=c[H+96+16+8>>2];c[F+76+12>>2]=c[H+96+16+12>>2];c[F+92>>2]=c[H+96+32>>2];c[F+92+4>>2]=c[H+96+32+4>>2];c[F+92+8>>2]=c[H+96+32+8>>2];c[F+92+12>>2]=c[H+96+32+12>>2];m=+g[F+132>>2];K=+g[F+60>>2];n=+g[F+148>>2];J=+g[F+64>>2];o=+g[F+164>>2];A=+g[F+68>>2];p=+g[F+136>>2];q=+g[F+152>>2];r=+g[F+168>>2];s=+g[F+140>>2];t=+g[F+156>>2];C=+g[F+172>>2];I=+g[F+76>>2];e=+g[F+80>>2];B=+g[F+84>>2];k=+g[F+92>>2];h=+g[F+96>>2];f=+g[F+100>>2];u=(m*K+n*J+o*A)*K+(K*p+J*q+A*r)*J+(K*s+J*t+A*C)*A;v=(m*K+n*J+o*A)*I+(K*p+J*q+A*r)*e+(K*s+J*t+A*C)*B;w=(m*K+n*J+o*A)*k+(K*p+J*q+A*r)*h+(K*s+J*t+A*C)*f;x=(m*I+n*e+o*B)*K+(p*I+q*e+r*B)*J+(s*I+t*e+C*B)*A;y=(m*I+n*e+o*B)*I+(p*I+q*e+r*B)*e+(s*I+t*e+C*B)*B;z=(m*I+n*e+o*B)*k+(p*I+q*e+r*B)*h+(s*I+t*e+C*B)*f;A=K*(m*k+n*h+o*f)+(p*k+q*h+r*f)*J+(s*k+t*h+C*f)*A;B=I*(m*k+n*h+o*f)+(p*k+q*h+r*f)*e+(s*k+t*h+C*f)*B;C=(m*k+n*h+o*f)*k+(p*k+q*h+r*f)*h+(s*k+t*h+C*f)*f;g[F+180>>2]=u;g[F+184>>2]=v;g[F+188>>2]=w;g[F+192>>2]=0.0;g[F+196>>2]=x;g[F+200>>2]=y;g[F+204>>2]=z;g[F+208>>2]=0.0;g[F+212>>2]=A;g[F+216>>2]=B;g[F+220>>2]=C;g[F+224>>2]=0.0;c[F+316>>2]=0;c[F+316+4>>2]=0;c[F+316+8>>2]=0;c[F+316+12>>2]=0;c[F+316+16>>2]=0;c[F+316+20>>2]=0;c[F+316+24>>2]=0;c[F+316+28>>2]=0;if((E|0)>0){i=c[F+32>>2]|0;j=c[F+12>>2]|0;r=+g[F+228>>2];s=+g[F+232>>2];t=+g[F+236>>2];d=0;q=0.0;p=0.0;o=0.0;n=0.0;m=0.0;e=0.0;do{D=c[i+(d<<2)>>2]|0;M=+g[j+(d<<2)>>2];J=+g[D+40>>2]*M;L=M*+g[D+44>>2];M=M*+g[D+48>>2];q=J+q;g[F+316>>2]=q;p=L+p;g[F+320>>2]=p;o=M+o;g[F+324>>2]=o;I=+g[D+8>>2]-r;K=+g[D+12>>2]-s;N=+g[D+16>>2]-t;n=n+(M*K-L*N);g[F+332>>2]=n;m=J*N-M*I+m;g[F+336>>2]=m;e=L*I-J*K+e;g[F+340>>2]=e;d=d+1|0}while((d|0)!=(E|0));D=F+316|0;d=F+332|0}else{D=F+316|0;d=F+332|0;q=0.0;p=0.0;o=0.0;n=0.0;m=0.0;e=0.0}M=+g[F+128>>2];N=1.0-+g[F+356>>2];g[F+316>>2]=q*M*N;g[F+320>>2]=M*p*N;g[F+324>>2]=M*o*N;g[F+328>>2]=0.0;N=1.0-+g[F+360>>2];g[d>>2]=(u*n+v*m+w*e)*N;g[F+336>>2]=(n*x+m*y+e*z)*N;g[F+340>>2]=N*(n*A+m*B+e*C);g[F+344>>2]=0.0;i=F+244|0;j=i+72|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));e=+g[F+364>>2];a:do if(e>0.0?(c[F+24>>2]|0)>0:0){d=0;while(1){j=c[(c[F+32>>2]|0)+(d<<2)>>2]|0;i=c[F+52>>2]|0;I=+g[i+(d<<4)>>2];J=+g[i+(d<<4)+4>>2];K=+g[i+(d<<4)+8>>2];L=+g[j+8>>2];M=+g[j+12>>2];N=+g[j+16>>2];M=M+e*(I*+g[F+76>>2]+J*+g[F+80>>2]+K*+g[F+84>>2]+ +g[F+112>>2]-M);N=N+e*(I*k+J*h+K*f+ +g[F+116>>2]-N);g[j+8>>2]=L+e*(I*+g[F+60>>2]+J*+g[F+64>>2]+K*+g[F+68>>2]+ +g[F+108>>2]-L);g[j+12>>2]=M;g[j+16>>2]=N;g[j+20>>2]=0.0;d=d+1|0;if((d|0)>=(c[F+24>>2]|0))break a;k=+g[F+92>>2];h=+g[F+96>>2];f=+g[F+100>>2];e=+g[F+364>>2]}}while(0);if(a[F+377>>0]|0){i=c[F+32>>2]|0;j=c[i>>2]|0;e=+g[j+8>>2];q=+g[j+12>>2];r=+g[j+16>>2];f=+g[j+20>>2];if((E|0)>1){d=1;m=e;p=e;n=f;o=r;k=f;h=q;f=q;e=r;do{j=c[i+(d<<2)>>2]|0;K=+g[j+8>>2];p=K>2];f=L>2];o=M>2];k=N>2]=p;g[H+16+4>>2]=f;g[H+16+8>>2]=o;g[H+16+12>>2]=k;g[H+16+16>>2]=m;g[H+16+20>>2]=h;g[H+16+24>>2]=e;g[H+16+28>>2]=n;d=c[F+348>>2]|0;if(!d){d=c[b+1072>>2]|0;if(!d){c[6995]=(c[6995]|0)+1;d=sc(63)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}i=d;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0))}else c[b+1072>>2]=0;c[d+32>>2]=0;c[d+36>>2]=F;c[d+40>>2]=0;c[d>>2]=c[H+16>>2];c[d+4>>2]=c[H+16+4>>2];c[d+8>>2]=c[H+16+8>>2];c[d+12>>2]=c[H+16+12>>2];c[d+16>>2]=c[H+16+16>>2];c[d+20>>2]=c[H+16+20>>2];c[d+24>>2]=c[H+16+24>>2];c[d+28>>2]=c[H+16+28>>2];Pe(b+1068|0,c[b+1068>>2]|0,d);c[b+1080>>2]=(c[b+1080>>2]|0)+1;c[F+348>>2]=d}else{L=+g[b+512>>2];M=L*+g[F+320>>2]*3.0;N=L*+g[F+324>>2]*3.0;g[H>>2]=+g[D>>2]*L*3.0;g[H+4>>2]=M;g[H+8>>2]=N;g[H+12>>2]=0.0;uh(b+1068|0,d,H+16|0,H,+g[b+524>>2])|0}}d=c[b+1112>>2]|0}G=G+1|0}while((G|0)<(d|0));l=H;return}function Uc(a,b){a=a|0;b=+b;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0;o=l;l=l+48|0;d=c[a+24>>2]|0;if((d|0)<=0){l=o;return}n=0;a:while(1){m=c[(c[a+32>>2]|0)+(n<<2)>>2]|0;switch(c[m+220>>2]|0){case 2:case 5:break;default:{ee(m,0);e=c[m+792>>2]|0;if((e|0)>0){d=0;do{k=c[m+800>>2]|0;i=c[k+(d*52|0)+28>>2]|0;j=c[k+(d*52|0)+24>>2]|0;y=+g[i+24>>2]-+g[j+24>>2];x=+g[i+28>>2]-+g[j+28>>2];b=+g[i+32>>2]-+g[j+32>>2];g[k+(d*52|0)+8>>2]=y;g[k+(d*52|0)+12>>2]=x;g[k+(d*52|0)+16>>2]=b;g[k+(d*52|0)+20>>2]=0.0;g[k+(d*52|0)+48>>2]=1.0/(+g[k+(d*52|0)+40>>2]*(y*y+x*x+b*b));d=d+1|0}while((d|0)!=(e|0))}f=c[m+852>>2]|0;if((f|0)>0){d=0;b=+g[m+512>>2];do{k=c[m+860>>2]|0;e=k+(d*96|0)+20|0;i=c[e>>2]|0;H=+g[k+(d*96|0)+4>>2];J=+g[k+(d*96|0)+8>>2];y=+g[k+(d*96|0)+12>>2];z=+g[i+4>>2]*H+ +g[i+8>>2]*J+ +g[i+12>>2]*y;x=H*+g[i+20>>2]+J*+g[i+24>>2]+y*+g[i+28>>2];y=H*+g[i+36>>2]+J*+g[i+40>>2]+y*+g[i+44>>2];j=k+(d*96|0)|0;J=+g[(c[j>>2]|0)+88>>2];H=1.0/b;Uh(o,+g[i+404>>2],i+324|0,z,x,y);C=J+ +g[o>>2];G=+g[o+4>>2]+0.0;E=+g[o+8>>2]+0.0;D=+g[o+16>>2]+0.0;F=J+ +g[o+20>>2];B=+g[o+24>>2]+0.0;I=+g[o+32>>2]+0.0;K=+g[o+36>>2]+0.0;J=J+ +g[o+40>>2];A=1.0/(E*(D*K-F*I)+(C*(F*J-B*K)+G*(B*I-D*J)));g[k+(d*96|0)+28>>2]=(D*K-F*I)*A*0.0+(H*(F*J-B*K)*A+(B*I-D*J)*A*0.0);g[k+(d*96|0)+32>>2]=(G*I-C*K)*A*0.0+(H*(E*K-G*J)*A+(C*J-E*I)*A*0.0);g[k+(d*96|0)+36>>2]=(C*F-G*D)*A*0.0+(H*(G*B-E*F)*A+(E*D-C*B)*A*0.0);g[k+(d*96|0)+40>>2]=0.0;g[k+(d*96|0)+44>>2]=(D*K-F*I)*A*0.0+((F*J-B*K)*A*0.0+H*(B*I-D*J)*A);g[k+(d*96|0)+48>>2]=(G*I-C*K)*A*0.0+((E*K-G*J)*A*0.0+H*(C*J-E*I)*A);g[k+(d*96|0)+52>>2]=(C*F-G*D)*A*0.0+((G*B-E*F)*A*0.0+H*(E*D-C*B)*A);g[k+(d*96|0)+56>>2]=0.0;g[k+(d*96|0)+60>>2]=H*(D*K-F*I)*A+((F*J-B*K)*A*0.0+(B*I-D*J)*A*0.0);g[k+(d*96|0)+64>>2]=H*(G*I-C*K)*A+((E*K-G*J)*A*0.0+(C*J-E*I)*A*0.0);g[k+(d*96|0)+68>>2]=H*(C*F-G*D)*A+((G*B-E*F)*A*0.0+(E*D-C*B)*A*0.0);g[k+(d*96|0)+72>>2]=0.0;g[k+(d*96|0)+76>>2]=z;g[k+(d*96|0)+80>>2]=x;g[k+(d*96|0)+84>>2]=y;g[k+(d*96|0)+88>>2]=0.0;b=+g[m+512>>2];g[k+(d*96|0)+92>>2]=b*+g[(c[j>>2]|0)+88>>2];e=c[e>>2]|0;if(!(c[e+204>>2]&3)){if((c[e+220>>2]&-2|0)!=4)c[e+220>>2]=1;g[e+224>>2]=0.0}d=d+1|0}while((d|0)!=(f|0))}d=c[m+432>>2]|0;if((d|0)>0){f=0;e=c[m+456>>2]|0;do{if((e|0)>0){d=0;do{Jb[((c[(c[m+464>>2]|0)+(d<<2)>>2]|0)==0?25:0)&31](m,1.0);d=d+1|0;e=c[m+456>>2]|0}while((d|0)<(e|0));d=c[m+432>>2]|0}f=f+1|0}while((f|0)<(d|0));e=c[m+772>>2]|0;if((e|0)>0){d=0;do{k=c[m+780>>2]|0;I=+g[m+512>>2];J=I*+g[k+(d*104|0)+44>>2]+ +g[k+(d*104|0)+28>>2];K=I*+g[k+(d*104|0)+48>>2]+ +g[k+(d*104|0)+32>>2];g[k+(d*104|0)+8>>2]=+g[k+(d*104|0)+40>>2]*I+ +g[k+(d*104|0)+24>>2];g[k+(d*104|0)+12>>2]=J;g[k+(d*104|0)+16>>2]=K;g[k+(d*104|0)+20>>2]=0.0;d=d+1|0}while((d|0)!=(e|0))}}d=c[m+436>>2]|0;if((d|0)>0){h=0;e=c[m+476>>2]|0;do{b=+(h|0)/+(d|0);if((e|0)>0){f=0;do{switch(c[(c[m+484>>2]|0)+(f<<2)>>2]|0){case 1:{d=3;break}case 0:{d=4;break}case 2:{d=5;break}case 3:{d=6;break}default:{w=35;break a}}Kb[d&7](m,1.0,b);f=f+1|0;e=c[m+476>>2]|0}while((f|0)<(e|0));d=c[m+436>>2]|0}h=h+1|0}while((h|0)<(d|0));b=+g[m+516>>2]*(1.0-+g[m+356>>2]);e=c[m+772>>2]|0;if((e|0)>0){d=0;do{k=c[m+780>>2]|0;J=b*(+g[k+(d*104|0)+12>>2]-+g[k+(d*104|0)+28>>2]);K=b*(+g[k+(d*104|0)+16>>2]-+g[k+(d*104|0)+32>>2]);g[k+(d*104|0)+40>>2]=b*(+g[k+(d*104|0)+8>>2]-+g[k+(d*104|0)+24>>2]);g[k+(d*104|0)+44>>2]=J;g[k+(d*104|0)+48>>2]=K;k=k+(d*104|0)+52|0;d=d+1|0;c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0}while((d|0)!=(e|0))}}d=c[m+440>>2]|0;if((d|0)>0){b=+g[m+352>>2]*+g[m+516>>2];e=c[m+772>>2]|0;if((e|0)>0){d=0;do{k=c[m+780>>2]|0;j=k+(d*104|0)+8|0;k=k+(d*104|0)+24|0;c[k>>2]=c[j>>2];c[k+4>>2]=c[j+4>>2];c[k+8>>2]=c[j+8>>2];c[k+12>>2]=c[j+12>>2];d=d+1|0}while((d|0)!=(e|0));d=c[m+440>>2]|0;if((d|0)>0)w=42}else w=42;if((w|0)==42){w=0;h=0;e=c[m+496>>2]|0;do{if((e|0)>0){f=0;do{switch(c[(c[m+504>>2]|0)+(f<<2)>>2]|0){case 1:{d=3;break}case 0:{d=4;break}case 2:{d=5;break}case 3:{d=6;break}default:{w=53;break a}}Kb[d&7](m,1.0,0.0);f=f+1|0;e=c[m+496>>2]|0}while((f|0)<(e|0));d=c[m+440>>2]|0}h=h+1|0}while((h|0)<(d|0))}e=c[m+772>>2]|0;if((e|0)>0){f=c[m+780>>2]|0;d=0;do{J=b*(+g[f+(d*104|0)+12>>2]-+g[f+(d*104|0)+28>>2]);K=b*(+g[f+(d*104|0)+16>>2]-+g[f+(d*104|0)+32>>2]);k=f+(d*104|0)+40|0;g[k>>2]=b*(+g[f+(d*104|0)+8>>2]-+g[f+(d*104|0)+24>>2])+ +g[k>>2];k=f+(d*104|0)+44|0;g[k>>2]=J+ +g[k>>2];k=f+(d*104|0)+48|0;g[k>>2]=K+ +g[k>>2];d=d+1|0}while((d|0)!=(e|0))}}f=c[m+1112>>2]|0;if((f|0)>0){h=c[m+1120>>2]|0;e=0;do{i=c[h+(e<<2)>>2]|0;if(+g[i+352>>2]>0.0?(p=c[i+24>>2]|0,(p|0)>0):0){j=c[i+32>>2]|0;d=0;do{k=c[j+(d<<2)>>2]|0;if(+g[k+88>>2]>0.0?(t=+g[k+24>>2]-+g[i+228>>2],v=+g[k+28>>2]-+g[i+232>>2],r=+g[k+32>>2]-+g[i+236>>2],s=+g[i+336>>2],K=+g[i+340>>2],u=+g[i+332>>2],q=+g[i+316>>2]+(s*r-v*K),r=+g[i+320>>2]+(t*K-r*u),s=v*u-t*s+ +g[i+324>>2],t=+g[k+40>>2],u=+g[k+44>>2],v=+g[k+48>>2],q*q+r*r+s*s<=t*t+u*u+v*v):0){K=+g[i+352>>2];g[k+40>>2]=t+(q-t)*K;g[k+44>>2]=(r-u)*K+u;g[k+48>>2]=(s-v)*K+v}d=d+1|0}while((d|0)!=(p|0))}e=e+1|0}while((e|0)!=(f|0))}ee(m,1);d=c[a+24>>2]|0}}n=n+1|0;if((n|0)>=(d|0)){w=3;break}}if((w|0)==3){l=o;return}}function Vc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0,t=0.0;q=l;l=l+80|0;i=c[b+28>>2]|0;d=c[f+72>>2]|0;if((d&4|0)!=0&(i|0)>0){e=c[b+36>>2]|0;h=c[b+76>>2]|0;if(!(d&16)){d=0;do{m=c[e+(d*152|0)+132>>2]|0;c[m+124>>2]=c[e+(d*152|0)+100>>2];c[m+128>>2]=c[h+((c[e+(d*152|0)+140>>2]|0)*152|0)+100>>2];d=d+1|0}while((d|0)!=(i|0))}else{d=0;do{m=c[e+(d*152|0)+132>>2]|0;c[m+124>>2]=c[e+(d*152|0)+100>>2];k=c[e+(d*152|0)+140>>2]|0;c[m+128>>2]=c[h+(k*152|0)+100>>2];c[m+132>>2]=c[h+((k+1|0)*152|0)+100>>2];d=d+1|0}while((d|0)!=(i|0))}}h=c[b+48>>2]|0;if((h|0)>0){d=0;do{i=c[b+56>>2]|0;k=c[i+(d*152|0)+132>>2]|0;m=c[k+44>>2]|0;e=i+(d*152|0)+100|0;if(m|0){p=+g[e>>2];s=c[k+28>>2]|0;o=1.0/+g[f+12>>2];n=p*+g[i+(d*152|0)+20>>2]*+g[s+412>>2]*o;r=p*+g[i+(d*152|0)+24>>2]*+g[s+416>>2]*o;g[m>>2]=+g[m>>2]+ +g[i+(d*152|0)+16>>2]*p*+g[s+408>>2]*o;g[m+4>>2]=n+ +g[m+4>>2];g[m+8>>2]=r+ +g[m+8>>2];r=+g[e>>2];s=c[k+32>>2]|0;n=1.0/+g[f+12>>2];o=r*+g[i+(d*152|0)+52>>2]*+g[s+412>>2]*n;p=r*+g[i+(d*152|0)+56>>2]*+g[s+416>>2]*n;g[m+32>>2]=+g[m+32>>2]+ +g[i+(d*152|0)+48>>2]*r*+g[s+408>>2]*n;g[m+36>>2]=o+ +g[m+36>>2];g[m+40>>2]=p+ +g[m+40>>2];s=c[k+28>>2]|0;p=+g[e>>2];o=1.0/+g[f+12>>2];n=+g[i+(d*152|0)+4>>2]*+g[s+608>>2]*p*o;r=p*+g[i+(d*152|0)+8>>2]*+g[s+612>>2]*o;g[m+16>>2]=+g[m+16>>2]+ +g[i+(d*152|0)>>2]*+g[s+604>>2]*p*o;g[m+20>>2]=n+ +g[m+20>>2];g[m+24>>2]=r+ +g[m+24>>2];s=c[k+32>>2]|0;r=+g[e>>2];n=1.0/+g[f+12>>2];o=+g[i+(d*152|0)+36>>2]*+g[s+608>>2]*r*n;p=r*+g[i+(d*152|0)+40>>2]*+g[s+612>>2]*n;g[m+48>>2]=+g[m+48>>2]+ +g[i+(d*152|0)+32>>2]*+g[s+604>>2]*r*n;g[m+52>>2]=o+ +g[m+52>>2];g[m+56>>2]=p+ +g[m+56>>2]}s=c[e>>2]|0;c[k+36>>2]=s;r=+C(+(c[j>>2]=s,+g[j>>2]));if(r>=+g[k+16>>2])a[k+20>>0]=0;d=d+1|0}while((d|0)!=(h|0))}e=c[b+8>>2]|0;if((e|0)>0){k=0;d=c[b+16>>2]|0;do{h=d+(k*244|0)|0;i=c[d+(k*244|0)+240>>2]|0;if(i){if(!(c[f+52>>2]|0)){h=d+(k*244|0)+176|0;o=+g[d+(k*244|0)+64>>2]+ +g[h>>2];g[h>>2]=o;h=d+(k*244|0)+180|0;p=+g[d+(k*244|0)+68>>2]+ +g[h>>2];g[h>>2]=p;h=d+(k*244|0)+184|0;n=+g[d+(k*244|0)+72>>2]+ +g[h>>2];g[h>>2]=n;h=d+(k*244|0)+192|0;g[h>>2]=+g[d+(k*244|0)+80>>2]+ +g[h>>2];h=d+(k*244|0)+196|0;g[h>>2]=+g[d+(k*244|0)+84>>2]+ +g[h>>2];h=d+(k*244|0)+200|0;g[h>>2]=+g[d+(k*244|0)+88>>2]+ +g[h>>2];h=d;d=i}else{n=+g[f+12>>2];o=+g[f+60>>2];e=d+(k*244|0)+176|0;g[e>>2]=+g[d+(k*244|0)+64>>2]+ +g[e>>2];e=d+(k*244|0)+180|0;g[e>>2]=+g[d+(k*244|0)+68>>2]+ +g[e>>2];e=d+(k*244|0)+184|0;g[e>>2]=+g[d+(k*244|0)+72>>2]+ +g[e>>2];e=d+(k*244|0)+192|0;g[e>>2]=+g[d+(k*244|0)+80>>2]+ +g[e>>2];e=d+(k*244|0)+196|0;g[e>>2]=+g[d+(k*244|0)+84>>2]+ +g[e>>2];e=d+(k*244|0)+200|0;g[e>>2]=+g[d+(k*244|0)+88>>2]+ +g[e>>2];p=+g[d+(k*244|0)+144>>2];e=d+(k*244|0)+148|0;if(((((!(p!=0.0)?!(+g[e>>2]!=0.0):0)?!(+g[d+(k*244|0)+152>>2]!=0.0):0)?!(+g[d+(k*244|0)+160>>2]!=0.0):0)?!(+g[d+(k*244|0)+164>>2]!=0.0):0)?!(+g[d+(k*244|0)+168>>2]!=0.0):0)e=i;else{t=+g[d+(k*244|0)+164>>2]*o;r=+g[d+(k*244|0)+168>>2]*o;g[q>>2]=+g[d+(k*244|0)+160>>2]*o;g[q+4>>2]=t;g[q+8>>2]=r;g[q+12>>2]=0.0;Af(h,p,+g[e>>2],+g[d+(k*244|0)+152>>2],q,n,q+16|0);c[h>>2]=c[q+16>>2];c[h+4>>2]=c[q+16+4>>2];c[h+8>>2]=c[q+16+8>>2];c[h+12>>2]=c[q+16+12>>2];e=d+(k*244|0)+16|0;c[e>>2]=c[q+16+16>>2];c[e+4>>2]=c[q+16+16+4>>2];c[e+8>>2]=c[q+16+16+8>>2];c[e+12>>2]=c[q+16+16+12>>2];e=d+(k*244|0)+32|0;c[e>>2]=c[q+16+32>>2];c[e+4>>2]=c[q+16+32+4>>2];c[e+8>>2]=c[q+16+32+8>>2];c[e+12>>2]=c[q+16+32+12>>2];e=d+(k*244|0)+48|0;c[e>>2]=c[q+16+48>>2];c[e+4>>2]=c[q+16+48+4>>2];c[e+8>>2]=c[q+16+48+8>>2];c[e+12>>2]=c[q+16+48+12>>2];e=c[b+16>>2]|0;d=e;e=c[e+(k*244|0)+240>>2]|0}h=d;o=+g[d+(k*244|0)+176>>2];p=+g[d+(k*244|0)+180>>2];n=+g[d+(k*244|0)+184>>2];d=e}t=o+ +g[h+(k*244|0)+208>>2];r=p+ +g[h+(k*244|0)+212>>2];p=n+ +g[h+(k*244|0)+216>>2];m=d+304|0;c[m>>2]=(c[m>>2]|0)+1;g[d+372>>2]=t;g[d+376>>2]=r;g[d+380>>2]=p;g[d+384>>2]=0.0;m=c[b+16>>2]|0;s=c[m+(k*244|0)+240>>2]|0;p=+g[m+(k*244|0)+192>>2]+ +g[m+(k*244|0)+224>>2];r=+g[m+(k*244|0)+196>>2]+ +g[m+(k*244|0)+228>>2];t=+g[m+(k*244|0)+200>>2]+ +g[m+(k*244|0)+232>>2];c[s+304>>2]=(c[s+304>>2]|0)+1;g[s+388>>2]=p;g[s+392>>2]=r;g[s+396>>2]=t;g[s+400>>2]=0.0;if(c[f+52>>2]|0){m=c[b+16>>2]|0;s=c[m+(k*244|0)+240>>2]|0;i=m+(k*244|0)|0;c[s+304>>2]=(c[s+304>>2]|0)+1;c[s+4>>2]=c[i>>2];c[s+4+4>>2]=c[i+4>>2];c[s+4+8>>2]=c[i+8>>2];c[s+4+12>>2]=c[i+12>>2];i=m+(k*244|0)+16|0;c[s+20>>2]=c[i>>2];c[s+20+4>>2]=c[i+4>>2];c[s+20+8>>2]=c[i+8>>2];c[s+20+12>>2]=c[i+12>>2];i=m+(k*244|0)+32|0;c[s+36>>2]=c[i>>2];c[s+36+4>>2]=c[i+4>>2];c[s+36+8>>2]=c[i+8>>2];c[s+36+12>>2]=c[i+12>>2];m=m+(k*244|0)+48|0;c[s+52>>2]=c[m>>2];c[s+52+4>>2]=c[m+4>>2];c[s+52+8>>2]=c[m+8>>2];c[s+52+12>>2]=c[m+12>>2]}d=c[b+16>>2]|0;c[(c[d+(k*244|0)+240>>2]|0)+212>>2]=-1;e=c[b+8>>2]|0}k=k+1|0}while((k|0)<(e|0))}if((c[b+28>>2]|0)<0?(c[b+32>>2]|0)<0:0){d=c[b+36>>2]|0;if(d|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=0;c[b+32>>2]=0}c[b+28>>2]=0;if((c[b+48>>2]|0)<0?(c[b+52>>2]|0)<0:0){d=c[b+56>>2]|0;if(d|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=0;c[b+52>>2]=0}c[b+48>>2]=0;if((c[b+68>>2]|0)<0?(c[b+72>>2]|0)<0:0){d=c[b+76>>2]|0;if(d|0){if(a[b+80>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+76>>2]=0}a[b+80>>0]=1;c[b+76>>2]=0;c[b+72>>2]=0}c[b+68>>2]=0;if((c[b+88>>2]|0)<0?(c[b+92>>2]|0)<0:0){d=c[b+96>>2]|0;if(d|0){if(a[b+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+96>>2]=0}a[b+100>>0]=1;c[b+96>>2]=0;c[b+92>>2]=0}c[b+88>>2]=0;if((c[b+8>>2]|0)>=0){c[b+8>>2]=0;l=q;return 0.0}if((c[b+12>>2]|0)>=0){c[b+8>>2]=0;l=q;return 0.0}d=c[b+16>>2]|0;if(d|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=0;c[b+12>>2]=0;c[b+8>>2]=0;l=q;return 0.0}function Wc(b,e,f,g,h,i){b=b|0;e=+e;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,B=0,C=0,D=0;D=l;l=l+560|0;C=D+524|0;c[D>>2]=0;B=D+512+12|0;lw(e)|0;if((A|0)<0){e=-e;y=1;x=19796}else{y=(h&2049|0)!=0&1;x=(h&2048|0)==0?((h&1|0)==0?19797:19802):19799}lw(e)|0;z=A&2146435072;do if(z>>>0<2146435072|(z|0)==2146435072&0<0){p=+dI(e,D)*2.0;if(p!=0.0)c[D>>2]=(c[D>>2]|0)+-1;if((i|32|0)==97){o=(i&32|0)==0?x:x+9|0;n=y|2;do if(!(g>>>0>11|(12-g|0)==0)){e=8.0;j=12-g|0;do{j=j+-1|0;e=e*16.0}while((j|0)!=0);if((a[o>>0]|0)==45){e=-(e+(-p-e));break}else{e=p+e-e;break}}else e=p;while(0);k=c[D>>2]|0;j=(k|0)<0?0-k|0:k;j=Om(j,((j|0)<0)<<31>>31,B)|0;if((j|0)==(B|0)){a[D+512+11>>0]=48;j=D+512+11|0}a[j+-1>>0]=(k>>31&2)+43;m=j+-2|0;a[m>>0]=i+15;j=D+524|0;do{z=~~e;k=j+1|0;a[j>>0]=d[19831+z>>0]|i&32;e=(e-+(z|0))*16.0;if((k-C|0)==1?!((h&8|0)==0&((g|0)<1&e==0.0)):0){a[k>>0]=46;j=j+2|0}else j=k}while(e!=0.0);C=j-C|0;j=(g|0)!=0&(C+-2|0)<(g|0)?g+2|0:C;un(b,32,f,B-m+n+j|0,h);fA(b,o,n);un(b,48,f,B-m+n+j|0,h^65536);fA(b,D+524|0,C);un(b,48,j-C|0,0,0);fA(b,m,B-m|0);un(b,32,f,B-m+n+j|0,h^8192);j=B-m+n+j|0;break}k=(g|0)<0?6:g;if(p!=0.0){n=(c[D>>2]|0)+-28|0;c[D>>2]=n;e=p*268435456.0}else{e=p;n=c[D>>2]|0}z=(n|0)<0?D+8|0:D+8+288|0;j=z;do{v=~~e>>>0;c[j>>2]=v;j=j+4|0;e=(e-+(v>>>0))*1.0e9}while(e!=0.0);if((n|0)>0){m=z;do{g=(n|0)<29?n:29;n=j+-4|0;if(n>>>0>=m>>>0){o=0;do{u=wu(c[n>>2]|0,0,g|0)|0;u=Ow(u|0,A|0,o|0,0)|0;v=A;t=xs(u|0,v|0,1e9,0)|0;c[n>>2]=t;o=rB(u|0,v|0,1e9,0)|0;n=n+-4|0}while(n>>>0>=m>>>0);if(o){m=m+-4|0;c[m>>2]=o}}while(1){if(j>>>0<=m>>>0)break;n=j+-4|0;if(!(c[n>>2]|0))j=n;else break}n=(c[D>>2]|0)-g|0;c[D>>2]=n}while((n|0)>0)}else m=z;if((n|0)<0)do{g=0-n|0;g=(g|0)<9?g:9;if(m>>>0>>0){o=0;n=m;do{v=c[n>>2]|0;c[n>>2]=(v>>>g)+o;o=P(v&(1<>>g)|0;n=n+4|0}while(n>>>0>>0);m=(c[m>>2]|0)==0?m+4|0:m;if(o){c[j>>2]=o;j=j+4|0}}else m=(c[m>>2]|0)==0?m+4|0:m;n=(i|32|0)==102?z:m;j=(j-n>>2|0)>(((k+25|0)/9|0)+1|0)?n+(((k+25|0)/9|0)+1<<2)|0:j;n=(c[D>>2]|0)+g|0;c[D>>2]=n}while((n|0)<0);if(m>>>0>>0){n=(z-m>>2)*9|0;g=c[m>>2]|0;if(g>>>0<10)s=n;else{o=10;do{o=o*10|0;n=n+1|0}while(g>>>0>=o>>>0);s=n}}else s=0;o=k-((i|32|0)!=102?s:0)+(((k|0)!=0&(i|32|0)==103)<<31>>31)|0;if((o|0)<(((j-z>>2)*9|0)+-9|0)){n=z+4+(((o+9216|0)/9|0)+-1024<<2)|0;if((((o+9216|0)%9|0)+1|0)<9){g=((o+9216|0)%9|0)+1|0;o=10;do{o=o*10|0;g=g+1|0}while((g|0)!=9)}else o=10;q=c[n>>2]|0;r=(q>>>0)%(o>>>0)|0;g=(n+4|0)==(j|0);if(!(g&(r|0)==0)){p=(((q>>>0)/(o>>>0)|0)&1|0)==0?9007199254740992.0:9007199254740994.0;v=(o|0)/2|0;e=r>>>0>>0?.5:g&(r|0)==(v|0)?1.0:1.5;if(y){v=(a[x>>0]|0)==45;e=v?-e:e;p=v?-p:p}c[n>>2]=q-r;if(p+e!=p){v=q-r+o|0;c[n>>2]=v;if(v>>>0>999999999)while(1){o=n+-4|0;c[n>>2]=0;if(o>>>0>>0){m=m+-4|0;c[m>>2]=0}v=(c[o>>2]|0)+1|0;c[o>>2]=v;if(v>>>0>999999999)n=o;else{n=o;break}}o=(z-m>>2)*9|0;q=c[m>>2]|0;if(q>>>0>=10){g=10;do{g=g*10|0;o=o+1|0}while(q>>>0>=g>>>0)}}else o=s}else o=s;u=n+4|0;j=j>>>0>u>>>0?u:j;u=m}else{o=s;u=m}v=j;while(1){if(v>>>0<=u>>>0){t=0;break}j=v+-4|0;if(!(c[j>>2]|0))v=j;else{t=1;break}}q=0-o|0;do if((i|32|0)==103){if((o|0)>-5?((((k|0)!=0^1)&1)+k|0)>(o|0):0){n=i+-1|0;k=(((k|0)!=0^1)&1)+k+-1-o|0}else{n=i+-2|0;k=(((k|0)!=0^1)&1)+k+-1|0}if(!(h&8)){if(t?(w=c[v+-4>>2]|0,(w|0)!=0):0)if(!((w>>>0)%10|0)){j=0;m=10;do{m=m*10|0;j=j+1|0}while(!((w>>>0)%(m>>>0)|0|0))}else j=0;else j=9;m=((v-z>>2)*9|0)+-9|0;if((n|32|0)==102){g=m-j|0;g=(g|0)>0?g:0;k=(k|0)<(g|0)?k:g;g=0;break}else{g=m+o-j|0;g=(g|0)>0?g:0;k=(k|0)<(g|0)?k:g;g=0;break}}else g=h&8}else{n=i;g=h&8}while(0);s=k|g;m=(n|32|0)==102;if(m){r=0;j=(o|0)>0?o:0}else{j=(o|0)<0?q:o;j=Om(j,((j|0)<0)<<31>>31,B)|0;if((B-j|0)<2)do{j=j+-1|0;a[j>>0]=48}while((B-j|0)<2);a[j+-1>>0]=(o>>31&2)+43;j=j+-2|0;a[j>>0]=n;r=j;j=B-j|0}j=y+1+k+((s|0)!=0&1)+j|0;un(b,32,f,j,h);fA(b,x,y);un(b,48,f,j,h^65536);if(m){o=u>>>0>z>>>0?z:u;n=o;do{m=Om(c[n>>2]|0,0,D+524+9|0)|0;if((n|0)==(o|0)){if((m|0)==(D+524+9|0)){a[D+524+8>>0]=48;m=D+524+8|0}}else if(m>>>0>(D+524|0)>>>0){Yk(D+524|0,48,m-C|0)|0;do m=m+-1|0;while(m>>>0>(D+524|0)>>>0)}fA(b,m,D+524+9-m|0);n=n+4|0}while(n>>>0<=z>>>0);if(s|0)fA(b,19847,1);if(n>>>0>>0&(k|0)>0)while(1){m=Om(c[n>>2]|0,0,D+524+9|0)|0;if(m>>>0>(D+524|0)>>>0){Yk(D+524|0,48,m-C|0)|0;do m=m+-1|0;while(m>>>0>(D+524|0)>>>0)}fA(b,m,(k|0)<9?k:9);n=n+4|0;m=k+-9|0;if(!(n>>>0>>0&(k|0)>9)){k=m;break}else k=m}un(b,48,k+9|0,9,0)}else{q=t?v:u+4|0;if((k|0)>-1){g=(g|0)==0;o=u;do{m=Om(c[o>>2]|0,0,D+524+9|0)|0;if((m|0)==(D+524+9|0)){a[D+524+8>>0]=48;m=D+524+8|0}do if((o|0)==(u|0)){n=m+1|0;fA(b,m,1);if(g&(k|0)<1){m=n;break}fA(b,19847,1);m=n}else{if(m>>>0<=(D+524|0)>>>0)break;Yk(D+524|0,48,m+(0-C)|0)|0;do m=m+-1|0;while(m>>>0>(D+524|0)>>>0)}while(0);z=D+524+9-m|0;fA(b,m,(k|0)>(z|0)?z:k);k=k-z|0;o=o+4|0}while(o>>>0>>0&(k|0)>-1)}un(b,48,k+18|0,18,0);fA(b,r,B-r|0)}un(b,32,f,j,h^8192)}else{j=y+3|0;un(b,32,f,j,h&-65537);fA(b,x,y);fA(b,e!=e|0.0!=0.0?(i&32|0?19823:19827):i&32|0?19815:19819,3);un(b,32,f,j,h^8192)}while(0);l=D;return ((j|0)<(f|0)?f:j)|0}function Xc(d,e,f,g,i){d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=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;x=l;l=l+64|0;c[x+16>>2]=e;w=x+24+40|0;k=0;j=0;p=0;a:while(1){do if((j|0)>-1)if((k|0)>(2147483647-j|0)){c[7137]=75;j=-1;break}else{j=k+j|0;break}while(0);k=a[e>>0]|0;if(!(k<<24>>24)){v=87;break}else m=e;b:while(1){switch(k<<24>>24){case 37:{k=m;v=9;break b}case 0:{k=m;break b}default:{}}u=m+1|0;c[x+16>>2]=u;k=a[u>>0]|0;m=u}c:do if((v|0)==9)while(1){v=0;if((a[m+1>>0]|0)!=37)break c;k=k+1|0;m=m+2|0;c[x+16>>2]=m;if((a[m>>0]|0)==37)v=9;else break}while(0);k=k-e|0;if(d|0)fA(d,e,k);if(k|0){e=m;continue}n=m+1|0;k=(a[n>>0]|0)+-48|0;if(k>>>0<10){u=(a[m+2>>0]|0)==36;s=u?k:-1;p=u?1:p;n=u?m+3|0:n}else s=-1;c[x+16>>2]=n;k=a[n>>0]|0;d:do if(((k<<24>>24)+-32|0)>>>0<32){m=0;q=k;o=(k<<24>>24)+-32|0;while(1){k=1<>2]=n;k=a[n>>0]|0;o=(k<<24>>24)+-32|0;if(o>>>0>=32)break;else q=k}}else m=0;while(0);if(k<<24>>24==42){o=n+1|0;k=(a[o>>0]|0)+-48|0;if(k>>>0<10?(a[n+2>>0]|0)==36:0){c[i+(k<<2)>>2]=10;k=c[g+((a[o>>0]|0)+-48<<3)>>2]|0;p=1;n=n+3|0}else{if(p|0){j=-1;break}if(d|0){p=(c[f>>2]|0)+(4-1)&~(4-1);k=c[p>>2]|0;c[f>>2]=p+4;p=0;n=o}else{k=0;p=0;n=o}}c[x+16>>2]=n;t=(k|0)<0;k=t?0-k|0:k;t=t?m|8192:m}else{k=gq(x+16|0)|0;if((k|0)<0){j=-1;break}t=m;n=c[x+16>>2]|0}do if((a[n>>0]|0)==46){m=n+1|0;if((a[m>>0]|0)!=42){c[x+16>>2]=m;m=gq(x+16|0)|0;n=c[x+16>>2]|0;break}o=n+2|0;m=(a[o>>0]|0)+-48|0;if(m>>>0<10?(a[n+3>>0]|0)==36:0){c[i+(m<<2)>>2]=10;m=c[g+((a[o>>0]|0)+-48<<3)>>2]|0;n=n+4|0;c[x+16>>2]=n;break}if(p|0){j=-1;break a}if(d|0){u=(c[f>>2]|0)+(4-1)&~(4-1);m=c[u>>2]|0;c[f>>2]=u+4}else m=0;c[x+16>>2]=o;n=o}else m=-1;while(0);r=0;while(1){if(((a[n>>0]|0)+-65|0)>>>0>57){j=-1;break a}u=n+1|0;c[x+16>>2]=u;o=a[(a[n>>0]|0)+-65+(19315+(r*58|0))>>0]|0;if(((o&255)+-1|0)>>>0<8){r=o&255;n=u}else break}if(!(o<<24>>24)){j=-1;break}q=(s|0)>-1;do if(o<<24>>24==19)if(q){j=-1;break a}else v=49;else{if(q){c[i+(s<<2)>>2]=o&255;s=g+(s<<3)|0;v=c[s+4>>2]|0;c[x>>2]=c[s>>2];c[x+4>>2]=v;v=49;break}if(!d){j=0;break a}Ug(x,o&255,f)}while(0);if((v|0)==49?(v=0,(d|0)==0):0){k=0;e=u;continue}n=a[n>>0]|0;n=(r|0)!=0&(n&15|0)==3?n&-33:n;s=t&-65537;t=(t&8192|0)==0?t:s;e:do switch(n|0){case 110:switch((r&255)<<24>>24){case 0:{c[c[x>>2]>>2]=j;k=0;e=u;continue a}case 1:{c[c[x>>2]>>2]=j;k=0;e=u;continue a}case 2:{k=c[x>>2]|0;c[k>>2]=j;c[k+4>>2]=((j|0)<0)<<31>>31;k=0;e=u;continue a}case 3:{b[c[x>>2]>>1]=j;k=0;e=u;continue a}case 4:{a[c[x>>2]>>0]=j;k=0;e=u;continue a}case 6:{c[c[x>>2]>>2]=j;k=0;e=u;continue a}case 7:{k=c[x>>2]|0;c[k>>2]=j;c[k+4>>2]=((j|0)<0)<<31>>31;k=0;e=u;continue a}default:{k=0;e=u;continue a}}case 112:{n=120;m=m>>>0>8?m:8;e=t|8;v=61;break}case 88:case 120:{e=t;v=61;break}case 111:{e=c[x>>2]|0;n=c[x+4>>2]|0;s=sr(e,n,w)|0;r=s;o=0;q=19779;m=(t&8|0)==0|(m|0)>(w-s|0)?m:w-s+1|0;s=t;v=67;break}case 105:case 100:{e=c[x>>2]|0;n=c[x+4>>2]|0;if((n|0)<0){e=sw(0,0,e|0,n|0)|0;n=A;c[x>>2]=e;c[x+4>>2]=n;o=1;q=19779;v=66;break e}else{o=(t&2049|0)!=0&1;q=(t&2048|0)==0?((t&1|0)==0?19779:19781):19780;v=66;break e}}case 117:{o=0;q=19779;e=c[x>>2]|0;n=c[x+4>>2]|0;v=66;break}case 99:{a[x+24+39>>0]=c[x>>2];e=x+24+39|0;o=0;q=19779;r=w;n=1;m=s;break}case 109:{n=pI(c[7137]|0)|0;v=71;break}case 115:{n=c[x>>2]|0;n=n|0?n:19789;v=71;break}case 67:{c[x+8>>2]=c[x>>2];c[x+8+4>>2]=0;c[x>>2]=x+8;r=-1;n=x+8|0;v=75;break}case 83:{e=c[x>>2]|0;if(!m){un(d,32,k,0,t);e=0;v=84}else{r=m;n=e;v=75}break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{k=Wc(d,+h[x>>3],k,m,t,n)|0;e=u;continue a}default:{o=0;q=19779;r=w;n=m;m=t}}while(0);f:do if((v|0)==61){y=c[x>>2]|0;t=c[x+4>>2]|0;r=qq(y,t,w,n&32)|0;q=(e&8|0)==0|(y|0)==0&(t|0)==0;o=q?0:2;q=q?19779:19779+(n>>4)|0;s=e;e=y;n=t;v=67}else if((v|0)==66){r=Om(e,n,w)|0;s=t;v=67}else if((v|0)==71){v=0;y=Kj(n,m)|0;e=n;o=0;q=19779;r=(y|0)==0?n+m|0:y;n=(y|0)==0?m:y-n|0;m=s}else if((v|0)==75){v=0;q=n;e=0;m=0;while(1){o=c[q>>2]|0;if(!o)break;m=OA(x+20|0,o)|0;if((m|0)<0|m>>>0>(r-e|0)>>>0)break;e=m+e|0;if(r>>>0>e>>>0)q=q+4|0;else break}if((m|0)<0){j=-1;break a}un(d,32,k,e,t);if(!e){e=0;v=84}else{o=0;while(1){m=c[n>>2]|0;if(!m){v=84;break f}m=OA(x+20|0,m)|0;o=m+o|0;if((o|0)>(e|0)){v=84;break f}fA(d,x+20|0,m);if(o>>>0>=e>>>0){v=84;break}else n=n+4|0}}}while(0);if((v|0)==67){v=0;n=(e|0)!=0|(n|0)!=0;y=(m|0)!=0|n;n=((n^1)&1)+(w-r)|0;e=y?r:w;r=w;n=y?((m|0)>(n|0)?m:n):m;m=(m|0)>-1?s&-65537:s}else if((v|0)==84){v=0;un(d,32,k,e,t^8192);k=(k|0)>(e|0)?k:e;e=u;continue}t=r-e|0;s=(n|0)<(t|0)?t:n;y=s+o|0;k=(k|0)<(y|0)?y:k;un(d,32,k,y,m);fA(d,q,o);un(d,48,k,y,m^65536);un(d,48,s,t,0);fA(d,e,t);un(d,32,k,y,m^8192);e=u}g:do if((v|0)==87)if(!d)if(!p)j=0;else{j=1;while(1){e=c[i+(j<<2)>>2]|0;if(!e){k=0;break}Ug(g+(j<<3)|0,e,f);j=j+1|0;if((j|0)>=10){j=1;break g}}while(1){e=j+1|0;if(k|0){j=-1;break g}if((e|0)>=10){j=1;break g}j=e;k=c[i+(e<<2)>>2]|0}}while(0);l=x;return j|0}function Yc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0;u=l;l=l+672|0;c[u+448+8>>2]=0;c[u+448+12>>2]=-1;m=u+448+28|0;c[u+448>>2]=7020;c[u+448+4>>2]=8;c[u+448+16>>2]=1065353216;c[u+448+20>>2]=1065353216;c[u+448+24>>2]=1065353216;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;c[m+20>>2]=0;c[m+24>>2]=0;g[u+384>>2]=1.0;m=u+384+4|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;g[u+384+20>>2]=1.0;n=u+384+24|0;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;g[u+384+40>>2]=1.0;g[u+384+44>>2]=0.0;c[u+384+48>>2]=c[a>>2];c[u+384+48+4>>2]=c[a+4>>2];c[u+384+48+8>>2]=c[a+8>>2];c[u+384+48+12>>2]=c[a+12>>2];a=e;k=a+36|0;do{c[a>>2]=0;a=a+4|0}while((a|0)<(k|0));c[u+504>>2]=b;c[u+504+4>>2]=u+448;w=+g[d>>2];v=+g[d+16>>2];f=+g[d+32>>2];h=+g[d+4>>2];i=+g[d+20>>2];j=+g[d+36>>2];s=+g[d+8>>2];q=+g[d+24>>2];o=+g[d+40>>2];g[u+504+8>>2]=w+v*0.0+f*0.0;g[u+504+12>>2]=h+i*0.0+j*0.0;g[u+504+16>>2]=s+q*0.0+o*0.0;g[u+504+20>>2]=0.0;g[u+504+24>>2]=w*0.0+v+f*0.0;g[u+504+28>>2]=h*0.0+i+j*0.0;g[u+504+32>>2]=s*0.0+q+o*0.0;g[u+504+36>>2]=0.0;g[u+504+40>>2]=w*0.0+v*0.0+f;g[u+504+44>>2]=h*0.0+i*0.0+j;g[u+504+48>>2]=s*0.0+q*0.0+o;g[u+504+52>>2]=0.0;o=+g[u+384+48>>2]-+g[d+48>>2];q=+g[u+384+52>>2]-+g[d+52>>2];s=+g[u+384+56>>2]-+g[d+56>>2];G=+g[u+384>>2];F=+g[u+384+16>>2];E=+g[u+384+32>>2];C=+g[m>>2];B=+g[u+384+20>>2];A=+g[u+384+36>>2];z=+g[u+384+8>>2];y=+g[n>>2];x=+g[u+384+40>>2];p=+g[d+8>>2];r=+g[d+24>>2];t=+g[d+40>>2];g[u+504+56>>2]=w*G+v*F+f*E;g[u+504+60>>2]=w*C+v*B+f*A;g[u+504+64>>2]=w*z+v*y+f*x;g[u+504+68>>2]=0.0;g[u+504+72>>2]=G*h+F*i+E*j;g[u+504+76>>2]=C*h+B*i+A*j;g[u+504+80>>2]=z*h+y*i+x*j;g[u+504+84>>2]=0.0;g[u+504+88>>2]=G*p+F*r+E*t;g[u+504+92>>2]=C*p+B*r+A*t;g[u+504+96>>2]=z*p+y*r+x*t;g[u+504+100>>2]=0.0;g[u+504+104>>2]=o*w+q*v+s*f;g[u+504+108>>2]=o*h+q*i+s*j;g[u+504+112>>2]=o*p+q*r+s*t;g[u+504+116>>2]=0.0;c[u+504+120>>2]=80;c[u+504+124>>2]=0;c[u+364>>2]=0;c[u+128>>2]=0;c[u+128+4>>2]=0;c[u+128+8>>2]=0;c[u+128+12>>2]=0;c[u+376>>2]=2;c[u+368>>2]=0;g[u+144>>2]=0.0;c[u+648>>2]=1065353216;c[u+648+4>>2]=1065353216;c[u+648+8>>2]=1065353216;g[u+648+12>>2]=0.0;switch(Jc(u,u+504|0,u+648|0)|0){case 0:{a=c[u+372>>2]|0;if(!(c[a+32>>2]|0)){j=0.0;i=0.0;f=0.0;r=0.0;q=0.0;h=0.0}else{n=0;f=0.0;i=0.0;j=0.0;h=0.0;q=0.0;r=0.0;do{t=+g[a+16+(n<<2)>>2];k=c[u+504+120>>2]|0;H=c[u+504+124>>2]|0;m=(c[u+504>>2]|0)+(H>>1)|0;if(H&1)k=c[(c[m>>2]|0)+k>>2]|0;Sb[k&127](u+648|0,m,c[a+(n<<2)>>2]|0);f=f+t*+g[u+648>>2];i=i+t*+g[u+648+4>>2];j=j+t*+g[u+648+8>>2];a=c[(c[u+372>>2]|0)+(n<<2)>>2]|0;o=-+g[a>>2];p=-+g[a+4>>2];s=-+g[a+8>>2];a=c[u+504+120>>2]|0;H=c[u+504+124>>2]|0;k=(c[u+504+4>>2]|0)+(H>>1)|0;if(H&1)a=c[(c[k>>2]|0)+a>>2]|0;F=+g[u+504+24>>2]*o+ +g[u+504+28>>2]*p+ +g[u+504+32>>2]*s;E=+g[u+504+40>>2]*o+ +g[u+504+44>>2]*p+ +g[u+504+48>>2]*s;g[u+632>>2]=+g[u+504+8>>2]*o+ +g[u+504+12>>2]*p+ +g[u+504+16>>2]*s;g[u+632+4>>2]=F;g[u+632+8>>2]=E;g[u+632+12>>2]=0.0;Sb[a&127](u+648|0,k,u+632|0);E=+g[u+648>>2];F=+g[u+648+4>>2];G=+g[u+648+8>>2];h=h+t*(E*+g[u+504+56>>2]+F*+g[u+504+60>>2]+G*+g[u+504+64>>2]+ +g[u+504+104>>2]);q=q+t*(E*+g[u+504+72>>2]+F*+g[u+504+76>>2]+G*+g[u+504+80>>2]+ +g[u+504+108>>2]);r=r+t*(E*+g[u+504+88>>2]+F*+g[u+504+92>>2]+G*+g[u+504+96>>2]+ +g[u+504+112>>2]);n=n+1|0;a=c[u+372>>2]|0}while(n>>>0<(c[a+32>>2]|0)>>>0)}s=f*+g[d>>2]+i*+g[d+4>>2]+j*+g[d+8>>2]+ +g[d+48>>2];t=f*+g[d+16>>2]+i*+g[d+20>>2]+j*+g[d+24>>2]+ +g[d+52>>2];j=f*+g[d+32>>2]+i*+g[d+36>>2]+j*+g[d+40>>2]+ +g[d+56>>2];g[e+4>>2]=s;g[e+8>>2]=t;g[e+12>>2]=j;g[e+16>>2]=0.0;o=h*+g[d>>2]+q*+g[d+4>>2]+r*+g[d+8>>2]+ +g[d+48>>2];p=h*+g[d+16>>2]+q*+g[d+20>>2]+r*+g[d+24>>2]+ +g[d+52>>2];i=h*+g[d+32>>2]+q*+g[d+36>>2]+r*+g[d+40>>2]+ +g[d+56>>2];g[e+20>>2]=o;g[e+24>>2]=p;g[e+28>>2]=i;g[e+32>>2]=0.0;switch(c[b+4>>2]|0){case 8:{f=+g[b+32>>2]*+g[b+16>>2];break}case 0:{f=+g[b+48>>2];break}case 1:{f=+g[b+48>>2];break}case 13:{f=+g[b+48>>2];break}case 11:{f=+g[b+48>>2];break}case 10:{f=+g[b+48>>2];break}case 4:case 5:{f=+g[b+48>>2];break}default:f=+nb[c[(c[b>>2]|0)+48>>2]&15](b)}switch(c[u+448+4>>2]|0){case 8:{h=+g[u+448+32>>2]*+g[u+448+16>>2];break}case 0:{h=+g[u+448+48>>2];break}case 1:{h=+g[u+448+48>>2];break}case 13:{h=+g[u+448+48>>2];break}case 11:{h=+g[u+448+48>>2];break}case 10:{h=+g[u+448+48>>2];break}case 4:case 5:{h=+g[u+448+48>>2];break}default:h=+nb[c[(c[u+448>>2]|0)+48>>2]&15](u+448|0)}G=f+h;F=+D(+((o-s)*(o-s)+(p-t)*(p-t)+(i-j)*(i-j)));g[e+36>>2]=(o-s)*(1.0/F);g[e+40>>2]=(p-t)*(1.0/F);g[e+44>>2]=(i-j)*(1.0/F);g[e+48>>2]=0.0;g[e+4>>2]=G*(o-s)*(1.0/F)+ +g[e+4>>2];g[e+8>>2]=G*(p-t)*(1.0/F)+ +g[e+8>>2];g[e+12>>2]=G*(i-j)*(1.0/F)+ +g[e+12>>2];G=F-G;l=u;return +G}case 1:{if(!(Hc(b,d,u+448|0,u+384|0,u+128|0,e,1)|0)){G=3402823466385288598117041.0e14;l=u;return +G}f=+g[e+4>>2]-+g[e+20>>2];h=+g[e+8>>2]-+g[e+24>>2];i=+g[e+12>>2]-+g[e+28>>2];j=+D(+(f*f+h*h+i*i));if(j>=1.1920928955078125e-07){g[e+36>>2]=f*(1.0/j);g[e+40>>2]=h*(1.0/j);g[e+44>>2]=i*(1.0/j);g[e+48>>2]=0.0}G=-j;l=u;return +G}default:{G=3402823466385288598117041.0e14;l=u;return +G}}return 0.0}function Zc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0;if((a[b+180>>0]|0)==0?(a[b+48>>0]|0)!=0:0){r=+g[b+116>>2];h=+g[e>>2];I=+g[b+132>>2];f=+g[e+4>>2];J=+g[b+148>>2];y=+g[e+8>>2];s=+g[b+120>>2];G=+g[b+136>>2];H=+g[b+152>>2];t=+g[b+124>>2];F=+g[b+140>>2];u=+g[b+156>>2];w=+g[e+16>>2];x=+g[e+20>>2];z=+g[e+24>>2];E=+g[e+32>>2];v=+g[e+36>>2];A=+g[e+40>>2];m=+g[b+164>>2];i=+g[b+168>>2];D=+g[b+172>>2];C=+g[e+48>>2]+(h*m+f*i+y*D);B=w*m+x*i+z*D+ +g[e+52>>2];D=E*m+v*i+A*D+ +g[e+56>>2];g[b+824>>2]=r*h+I*f+J*y;g[b+828>>2]=h*s+f*G+y*H;g[b+832>>2]=h*t+f*F+y*u;g[b+836>>2]=0.0;g[b+840>>2]=r*w+I*x+J*z;g[b+844>>2]=s*w+G*x+H*z;g[b+848>>2]=t*w+F*x+u*z;g[b+852>>2]=0.0;g[b+856>>2]=r*E+I*v+J*A;g[b+860>>2]=s*E+G*v+H*A;g[b+864>>2]=t*E+F*v+u*A;g[b+868>>2]=0.0;g[b+872>>2]=C;g[b+876>>2]=B;g[b+880>>2]=D;g[b+884>>2]=0.0;D=+g[b+52>>2];B=+g[d>>2];C=+g[b+68>>2];A=+g[d+4>>2];u=+g[b+84>>2];v=+g[d+8>>2];F=+g[b+56>>2];E=+g[b+72>>2];t=+g[b+88>>2];H=+g[b+60>>2];G=+g[b+76>>2];s=+g[b+92>>2];J=+g[d+16>>2];I=+g[d+20>>2];r=+g[d+24>>2];z=+g[d+32>>2];x=+g[d+36>>2];w=+g[d+40>>2];y=+g[b+100>>2];f=+g[b+104>>2];h=+g[b+108>>2];k=b+856|0;l=b+840|0;i=J*y+I*f+r*h;m=H*z+G*x+s*w;n=F*z+E*x+t*w;o=D*z+C*x+u*w;p=H*J+G*I+s*r;q=F*J+E*I+t*r;r=D*J+C*I+u*r;s=B*H+A*G+v*s;t=B*F+A*E+v*t;u=D*B+C*A+u*v;v=B*y+A*f+v*h;f=z*y+x*f;h=w*h}else{r=+g[b+52>>2];h=+g[d>>2];x=+g[b+68>>2];f=+g[d+4>>2];w=+g[b+84>>2];H=+g[d+8>>2];s=+g[b+56>>2];z=+g[b+72>>2];y=+g[b+88>>2];t=+g[b+60>>2];A=+g[b+76>>2];u=+g[b+92>>2];J=+g[d+16>>2];I=+g[d+20>>2];G=+g[d+24>>2];B=+g[d+32>>2];v=+g[d+36>>2];F=+g[d+40>>2];m=+g[b+100>>2];i=+g[b+104>>2];C=+g[b+108>>2];D=+g[d+48>>2]+(h*m+f*i+H*C);E=J*m+I*i+G*C+ +g[d+52>>2];C=B*m+v*i+F*C+ +g[d+56>>2];g[b+824>>2]=r*h+x*f+w*H;g[b+828>>2]=h*s+f*z+H*y;g[b+832>>2]=h*t+f*A+H*u;g[b+836>>2]=0.0;g[b+840>>2]=r*J+x*I+w*G;g[b+844>>2]=s*J+z*I+y*G;g[b+848>>2]=t*J+A*I+u*G;g[b+852>>2]=0.0;g[b+856>>2]=r*B+x*v+w*F;g[b+860>>2]=s*B+z*v+y*F;g[b+864>>2]=t*B+A*v+u*F;g[b+868>>2]=0.0;g[b+872>>2]=D;g[b+876>>2]=E;g[b+880>>2]=C;g[b+884>>2]=0.0;C=+g[b+116>>2];E=+g[e>>2];D=+g[b+132>>2];F=+g[e+4>>2];u=+g[b+148>>2];v=+g[e+8>>2];A=+g[b+120>>2];B=+g[b+136>>2];t=+g[b+152>>2];y=+g[b+124>>2];z=+g[b+140>>2];s=+g[b+156>>2];w=+g[e+16>>2];x=+g[e+20>>2];r=+g[e+24>>2];G=+g[e+32>>2];I=+g[e+36>>2];J=+g[e+40>>2];H=+g[b+164>>2];f=+g[b+168>>2];h=+g[b+172>>2];k=b+856|0;l=b+840|0;i=w*H+x*f+r*h;m=y*G+z*I+s*J;n=A*G+B*I+t*J;o=C*G+D*I+u*J;p=y*w+z*x+s*r;q=A*w+B*x+t*r;r=C*w+D*x+u*r;s=E*y+F*z+v*s;t=E*A+F*B+v*t;u=C*E+D*F+u*v;v=E*H+F*f+v*h;d=e;f=G*H+I*f;h=J*h}J=v+ +g[d+48>>2];i=i+ +g[d+52>>2];f=h+f+ +g[d+56>>2];g[b+888>>2]=u;g[b+892>>2]=t;g[b+896>>2]=s;g[b+900>>2]=0.0;g[b+904>>2]=r;g[b+908>>2]=q;g[b+912>>2]=p;g[b+916>>2]=0.0;g[b+920>>2]=o;g[b+924>>2]=n;g[b+928>>2]=m;g[b+932>>2]=0.0;g[b+936>>2]=J;g[b+940>>2]=i;g[b+944>>2]=f;g[b+948>>2]=0.0;c[b+968>>2]=c[b+872>>2];c[b+968+4>>2]=c[b+872+4>>2];c[b+968+8>>2]=c[b+872+8>>2];c[b+968+12>>2]=c[b+872+12>>2];c[b+984>>2]=c[b+936>>2];c[b+984+4>>2]=c[b+936+4>>2];c[b+984+8>>2]=c[b+936+8>>2];c[b+984+12>>2]=c[b+936+12>>2];d=c[b+824>>2]|0;e=c[l>>2]|0;l=c[k>>2]|0;c[b+952>>2]=d;c[b+956>>2]=e;c[b+960>>2]=l;g[b+964>>2]=0.0;f=(c[j>>2]=d,+g[j>>2]);h=(c[j>>2]=e,+g[j>>2]);i=(c[j>>2]=l,+g[j>>2]);if((a[b+180>>0]|0)==0?(a[b+48>>0]|0)==0:0){l=b+984|0;k=b+968|0;H=+g[k>>2];G=+g[l>>2];G=H-G;e=k+4|0;H=+g[e>>2];e=l+4|0;I=+g[e>>2];I=H-I;k=k+8|0;H=+g[k>>2];l=l+8|0;J=+g[l>>2];J=H-J;l=b+1016|0;g[l>>2]=G;l=b+1020|0;g[l>>2]=I;l=b+1024|0;g[l>>2]=J;l=b+1028|0;g[l>>2]=0.0;H=f*G;D=h*I;D=H+D;H=i*J;H=D+H;D=f*H;E=h*H;F=i*H;C=+g[b+968>>2];D=C+D;l=b+972|0;C=+g[l>>2];E=C+E;l=b+976|0;C=+g[l>>2];F=C+F;l=b+1e3|0;g[l>>2]=D;l=b+1004|0;g[l>>2]=E;l=b+1008|0;g[l>>2]=F;l=b+1012|0;g[l>>2]=0.0;l=b+1032|0;g[l>>2]=H;l=b+828|0;k=b+844|0;e=b+860|0;H=+g[l>>2];F=+g[k>>2];E=+g[e>>2];H=H*G;F=F*I;F=H+F;E=E*J;E=F+E;e=b+1036|0;g[e>>2]=E;e=b+832|0;k=b+848|0;l=b+864|0;E=+g[e>>2];F=+g[k>>2];H=+g[l>>2];G=E*G;I=F*I;I=G+I;J=H*J;J=I+J;b=b+1040|0;g[b>>2]=J;return}l=b+968|0;k=b+984|0;H=+g[k>>2];G=+g[l>>2];G=H-G;e=k+4|0;H=+g[e>>2];e=l+4|0;I=+g[e>>2];I=H-I;k=k+8|0;H=+g[k>>2];l=l+8|0;J=+g[l>>2];J=H-J;l=b+1016|0;g[l>>2]=G;l=b+1020|0;g[l>>2]=I;l=b+1024|0;g[l>>2]=J;l=b+1028|0;g[l>>2]=0.0;H=f*G;D=h*I;D=H+D;H=i*J;H=D+H;D=f*H;E=h*H;F=i*H;C=+g[b+968>>2];D=C+D;l=b+972|0;C=+g[l>>2];E=C+E;l=b+976|0;C=+g[l>>2];F=C+F;l=b+1e3|0;g[l>>2]=D;l=b+1004|0;g[l>>2]=E;l=b+1008|0;g[l>>2]=F;l=b+1012|0;g[l>>2]=0.0;l=b+1032|0;g[l>>2]=H;l=b+828|0;k=b+844|0;e=b+860|0;H=+g[l>>2];F=+g[k>>2];E=+g[e>>2];H=H*G;F=F*I;F=H+F;E=E*J;E=F+E;e=b+1036|0;g[e>>2]=E;e=b+832|0;k=b+848|0;l=b+864|0;E=+g[e>>2];F=+g[k>>2];H=+g[l>>2];G=E*G;I=F*I;I=G+I;J=H*J;J=I+J;b=b+1040|0;g[b>>2]=J;return}function _c(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,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,z=0.0,A=0.0;if((d|0)<=1){x=0;return x|0}w=c[b+772>>2]|0;x=P(w,w)|0;x=$I(x>>>0>1073741823?-1:x<<2)|0;if((w|0)>0){h=0;do{i=P(h,w)|0;f=0;do{p=x+((P(f,w)|0)+h<<2)|0;t=(f|0)==(h|0)?0:2147483647;c[p>>2]=t;c[x+(f+i<<2)>>2]=t;f=f+1|0}while((f|0)!=(w|0));h=h+1|0}while((h|0)!=(w|0))}h=c[b+792>>2]|0;if((h|0)>0){i=c[b+800>>2]|0;j=c[b+780>>2]|0;f=0;do{p=((c[i+(f*52|0)+24>>2]|0)-j|0)/104|0;t=((c[i+(f*52|0)+28>>2]|0)-j|0)/104|0;c[x+((P(t,w)|0)+p<<2)>>2]=1;c[x+((P(p,w)|0)+t<<2)>>2]=1;f=f+1|0}while((f|0)!=(h|0))}do if((d|0)!=2)if((w|0)>0){f=0;do{k=P(f,w)|0;h=0;do{i=h;h=h+1|0;if((h|0)<(w|0)){n=P(i,w)|0;l=x+(n+f<<2)|0;j=h;do{m=(c[l>>2]|0)+(c[x+(j+k<<2)>>2]|0)|0;o=x+(j+n<<2)|0;if((c[o>>2]|0)>>>0>m>>>0){c[x+((P(j,w)|0)+i<<2)>>2]=m;c[o>>2]=m}j=j+1|0}while((j|0)!=(w|0))}}while((h|0)!=(w|0));f=f+1|0}while((f|0)!=(w|0));q=79}else f=0;else{if((w|0)<0)gb();if(!w)t=0;else{c[6995]=(c[6995]|0)+1;f=sc((w*20|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=0;do{a[f+(h*20|0)+16>>0]=1;t=f+(h*20|0)+4|0;h=h+1|0;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0}while((h|0)!=(w|0));t=f}if((c[b+792>>2]|0)>0){n=0;do{m=c[b+800>>2]|0;p=c[b+780>>2]|0;o=((c[m+(n*52|0)+24>>2]|0)-p|0)/104|0;p=((c[m+(n*52|0)+28>>2]|0)-p|0)/104|0;m=t+(o*20|0)+4|0;f=c[m>>2]|0;a:do if((f|0)>0){i=c[t+(o*20|0)+12>>2]|0;h=0;while(1){if((c[i+(h<<2)>>2]|0)==(p|0))break;h=h+1|0;if((h|0)>=(f|0)){q=34;break a}}if((h|0)==(f|0))q=34}else q=34;while(0);if((q|0)==34){q=0;l=t+(o*20|0)+8|0;if((f|0)==(c[l>>2]|0)?(r=f|0?f<<1:1,(f|0)<(r|0)):0){if(!r)k=0;else{c[6995]=(c[6995]|0)+1;f=sc((r<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}k=f;f=c[m>>2]|0}j=t+(o*20|0)+12|0;i=c[j>>2]|0;if((f|0)<=0)if(!i)h=t+(o*20|0)+16|0;else q=44;else{h=0;do{c[k+(h<<2)>>2]=c[i+(h<<2)>>2];h=h+1|0}while((h|0)!=(f|0));q=44}if((q|0)==44){q=0;f=t+(o*20|0)+16|0;if(a[f>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[j>>2]=0;h=f;f=c[m>>2]|0}a[h>>0]=1;c[j>>2]=k;c[l>>2]=r}c[(c[t+(o*20|0)+12>>2]|0)+(f<<2)>>2]=p;c[m>>2]=(c[m>>2]|0)+1}m=t+(p*20|0)+4|0;f=c[m>>2]|0;b:do if((f|0)>0){i=c[t+(p*20|0)+12>>2]|0;h=0;while(1){if((c[i+(h<<2)>>2]|0)==(o|0))break;h=h+1|0;if((h|0)>=(f|0)){q=54;break b}}if((h|0)==(f|0))q=54}else q=54;while(0);if((q|0)==54){q=0;l=t+(p*20|0)+8|0;if((f|0)==(c[l>>2]|0)?(s=f|0?f<<1:1,(f|0)<(s|0)):0){if(!s)k=0;else{c[6995]=(c[6995]|0)+1;f=sc((s<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}k=f;f=c[m>>2]|0}j=t+(p*20|0)+12|0;i=c[j>>2]|0;if((f|0)<=0)if(!i)h=t+(p*20|0)+16|0;else q=64;else{h=0;do{c[k+(h<<2)>>2]=c[i+(h<<2)>>2];h=h+1|0}while((h|0)!=(f|0));q=64}if((q|0)==64){q=0;f=t+(p*20|0)+16|0;if(a[f>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[j>>2]=0;h=f;f=c[m>>2]|0}a[h>>0]=1;c[j>>2]=k;c[l>>2]=s}c[(c[t+(p*20|0)+12>>2]|0)+(f<<2)>>2]=o;c[m>>2]=(c[m>>2]|0)+1}n=n+1|0}while((n|0)<(c[b+792>>2]|0))}if((w|0)<=0){if(!t){f=0;break}}else{o=0;do{q=t+(o*20|0)+4|0;f=c[q>>2]|0;if((f|0)>0){r=P(o,w)|0;p=c[t+(o*20|0)+12>>2]|0;n=0;do{l=c[p+(n<<2)>>2]|0;m=t+(l*20|0)+4|0;h=c[m>>2]|0;if((h|0)>0){k=x+((P(l,w)|0)+o<<2)|0;j=c[t+(l*20|0)+12>>2]|0;i=0;f=h;do{h=c[j+(i<<2)>>2]|0;if((o|0)!=(h|0)?(v=P(h,w)|0,u=(c[x+(v+l<<2)>>2]|0)+(c[k>>2]|0)|0,v=x+(v+o<<2)|0,(c[v>>2]|0)>>>0>u>>>0):0){c[x+(h+r<<2)>>2]=u;c[v>>2]=u;f=c[m>>2]|0}i=i+1|0}while((i|0)<(f|0));f=c[q>>2]|0}n=n+1|0}while((n|0)<(f|0))}o=o+1|0}while((o|0)!=(w|0));f=0;do{i=t+(f*20|0)+4|0;j=t+(f*20|0)+12|0;k=c[j>>2]|0;h=t+(f*20|0)+16|0;if(k|0){if(a[h>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[j>>2]=0}a[h>>0]=1;c[j>>2]=0;c[i>>2]=0;c[t+(f*20|0)+8>>2]=0;f=f+1|0}while((f|0)!=(w|0))}c[6996]=(c[6996]|0)+1;Cd(c[t+-4>>2]|0);q=79}while(0);if((q|0)==79)if((w|0)>0){f=0;k=0;do{i=k;k=k+1|0;if((k|0)<(w|0)){j=P(i,w)|0;h=k;do{if((c[x+(h+j<<2)>>2]|0)==(d|0)){t=c[b+780>>2]|0;Xh(b,e);v=(c[b+792>>2]|0)+-1|0;u=c[b+800>>2]|0;c[u+(v*52|0)+24>>2]=t+(h*104|0);c[u+(v*52|0)+28>>2]=t+(i*104|0);A=+g[t+(h*104|0)+8>>2]-+g[t+(i*104|0)+8>>2];z=+g[t+(h*104|0)+12>>2]-+g[t+(i*104|0)+12>>2];y=+g[t+(h*104|0)+16>>2]-+g[t+(i*104|0)+16>>2];g[u+(v*52|0)+32>>2]=+D(+(A*A+z*z+y*y));a[b+984>>0]=1;v=(c[b+800>>2]|0)+(v*52|0)+36|0;a[v>>0]=a[v>>0]|1;f=f+1|0}h=h+1|0}while((h|0)!=(w|0))}}while((k|0)!=(w|0))}else f=0;aJ(x);x=f;return x|0}function $c(b,d,e){b=b|0;d=d|0;e=+e;var f=0,h=0,i=0,j=0,k=0,m=0.0,n=0.0,o=0,p=0,q=0.0,r=0,s=0;s=l;l=l+112|0;j=c[b+776>>2]|0;if((j|0)==(c[b+772>>2]|0)){a:do if(j){i=c[b+780>>2]|0;if((j|0)>0){f=0;h=i;while(1){h=c[h+(f*104|0)+96>>2]|0;if(h|0)c[h+36>>2]=f;f=f+1|0;if((f|0)==(j|0)){o=i;break a}h=c[b+780>>2]|0}}else o=i}else o=0;while(0);h=c[b+792>>2]|0;if((h|0)>0){f=0;do{p=(c[b+800>>2]|0)+(f*52|0)+24|0;c[p>>2]=((c[p>>2]|0)-o|0)/104|0;p=(c[b+800>>2]|0)+(f*52|0)+28|0;c[p>>2]=((c[p>>2]|0)-o|0)/104|0;f=f+1|0}while((f|0)!=(h|0))}h=c[b+812>>2]|0;if((h|0)>0){f=0;do{i=(c[b+820>>2]|0)+(f*44|0)+8|0;c[i>>2]=((c[i>>2]|0)-o|0)/104|0;i=(c[b+820>>2]|0)+(f*44|0)+12|0;c[i>>2]=((c[i>>2]|0)-o|0)/104|0;i=(c[b+820>>2]|0)+(f*44|0)+16|0;c[i>>2]=((c[i>>2]|0)-o|0)/104|0;i=c[(c[b+820>>2]|0)+(f*44|0)+40>>2]|0;if(i|0)c[i+36>>2]=f;f=f+1|0}while((f|0)!=(h|0))}h=c[b+852>>2]|0;if((h|0)>0){i=c[b+860>>2]|0;f=0;do{p=i+(f*96|0)|0;c[p>>2]=((c[p>>2]|0)-o|0)/104|0;f=f+1|0}while((f|0)!=(h|0))}k=c[b+752>>2]|0;if((k|0)>0){i=0;f=c[b+760>>2]|0;do{if((c[f+(i*60|0)+24>>2]|0)>0){h=0;do{f=f+(i*60|0)+28+(h<<2)|0;c[f>>2]=((c[f>>2]|0)-o|0)/104|0;h=h+1|0;f=c[b+760>>2]|0}while((h|0)<(c[f+(i*60|0)+24>>2]|0))}i=i+1|0}while((i|0)!=(k|0))}if((j|0)<(j<<1|1|0)){c[6995]=(c[6995]|0)+1;f=sc(((j<<1|1)*104|3)+16|0)|0;if(!f)i=0;else{c[(f+4+15&-16)+-4>>2]=f;i=f+4+15&-16}h=c[b+772>>2]|0;if((h|0)>0){f=0;do{o=i+(f*104|0)|0;k=(c[b+780>>2]|0)+(f*104|0)|0;p=o+104|0;do{c[o>>2]=c[k>>2];o=o+4|0;k=k+4|0}while((o|0)<(p|0));f=f+1|0}while((f|0)!=(h|0))}f=c[b+780>>2]|0;if(f|0){if(a[b+784>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+780>>2]=0}a[b+784>>0]=1;c[b+780>>2]=i;c[b+776>>2]=j<<1|1;j=c[b+772>>2]|0}b:do if(j){k=c[b+780>>2]|0;if((j|0)>0){f=0;h=k;while(1){i=c[h+(f*104|0)+96>>2]|0;if(i|0)c[i+36>>2]=h+(f*104|0);f=f+1|0;if((f|0)==(j|0))break b;h=c[b+780>>2]|0}}}else k=0;while(0);h=c[b+792>>2]|0;if((h|0)>0){f=0;do{p=(c[b+800>>2]|0)+(f*52|0)+24|0;c[p>>2]=k+((c[p>>2]|0)*104|0);p=(c[b+800>>2]|0)+(f*52|0)+28|0;c[p>>2]=k+((c[p>>2]|0)*104|0);f=f+1|0}while((f|0)!=(h|0))}h=c[b+812>>2]|0;if((h|0)>0){f=0;do{i=(c[b+820>>2]|0)+(f*44|0)+8|0;c[i>>2]=k+((c[i>>2]|0)*104|0);i=(c[b+820>>2]|0)+(f*44|0)+12|0;c[i>>2]=k+((c[i>>2]|0)*104|0);i=(c[b+820>>2]|0)+(f*44|0)+16|0;c[i>>2]=k+((c[i>>2]|0)*104|0);i=c[b+820>>2]|0;j=c[i+(f*44|0)+40>>2]|0;if(j|0)c[j+36>>2]=i+(f*44|0);f=f+1|0}while((f|0)!=(h|0))}i=c[b+852>>2]|0;if((i|0)>0){h=c[b+860>>2]|0;f=0;do{p=h+(f*96|0)|0;c[p>>2]=k+((c[p>>2]|0)*104|0);f=f+1|0}while((f|0)!=(i|0))}j=c[b+752>>2]|0;if((j|0)>0){i=0;f=c[b+760>>2]|0;do{if((c[f+(i*60|0)+24>>2]|0)>0){h=0;do{f=f+(i*60|0)+28+(h<<2)|0;c[f>>2]=k+((c[f>>2]|0)*104|0);h=h+1|0;f=c[b+760>>2]|0}while((h|0)<(c[f+(i*60|0)+24>>2]|0))}i=i+1|0}while((i|0)!=(j|0))}}o=c[b+192>>2]|0;q=+nb[c[(c[o>>2]|0)+48>>2]&15](o);o=s;p=o+100|0;do{c[o>>2]=0;o=o+4|0}while((o|0)<(p|0));f=c[b+772>>2]|0;if((f|0)==(c[b+776>>2]|0)?(r=f|0?f<<1:1,(f|0)<(r|0)):0){if(!r)i=0;else{c[6995]=(c[6995]|0)+1;f=sc((r*104|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=f;f=c[b+772>>2]|0}if((f|0)>0){h=0;do{o=i+(h*104|0)|0;k=(c[b+780>>2]|0)+(h*104|0)|0;p=o+104|0;do{c[o>>2]=c[k>>2];o=o+4|0;k=k+4|0}while((o|0)<(p|0));h=h+1|0}while((h|0)!=(f|0))}f=c[b+780>>2]|0;if(f|0){if(a[b+784>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+780>>2]=0}a[b+784>>0]=1;c[b+780>>2]=i;c[b+776>>2]=r;f=c[b+772>>2]|0}o=c[b+780>>2]|0;c[o+(f*104|0)>>2]=0;o=o+(f*104|0)+4|0;k=s;p=o+100|0;do{c[o>>2]=c[k>>2];o=o+4|0;k=k+4|0}while((o|0)<(p|0));h=c[b+772>>2]|0;c[b+772>>2]=h+1;i=c[b+780>>2]|0;o=i+(h*104|0)|0;p=o+104|0;do{c[o>>2]=0;o=o+4|0}while((o|0)<(p|0));c[i+(h*104|0)+8>>2]=c[d>>2];c[i+(h*104|0)+8+4>>2]=c[d+4>>2];c[i+(h*104|0)+8+8>>2]=c[d+8>>2];c[i+(h*104|0)+8+12>>2]=c[d+12>>2];$p(i+(h*104|0)+24|0,d|0,16)|0;g[i+(h*104|0)+88>>2]=e>0.0?1.0/e:0.0;c[i+(h*104|0)+4>>2]=c[c[b+940>>2]>>2];e=+g[i+(h*104|0)+8>>2];m=+g[i+(h*104|0)+12>>2];n=+g[i+(h*104|0)+16>>2];f=c[b+992>>2]|0;if(f|0){c[b+992>>2]=0;d=f;r=d+32|0;c[r>>2]=0;r=d+36|0;c[r>>2]=i+(h*104|0);r=d+40|0;c[r>>2]=0;g[d>>2]=e-q;r=d+4|0;g[r>>2]=m-q;r=d+8|0;g[r>>2]=n-q;r=d+12|0;g[r>>2]=0.0;r=d+16|0;g[r>>2]=q+e;r=d+20|0;g[r>>2]=q+m;r=d+24|0;g[r>>2]=q+n;r=d+28|0;g[r>>2]=0.0;r=c[b+988>>2]|0;Pe(b+988|0,r,d);b=b+1e3|0;r=c[b>>2]|0;r=r+1|0;c[b>>2]=r;b=i+(h*104|0)+96|0;c[b>>2]=d;l=s;return}c[6995]=(c[6995]|0)+1;f=sc(63)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}o=f;p=o+44|0;do{c[o>>2]=0;o=o+4|0}while((o|0)<(p|0));d=f;r=d+32|0;c[r>>2]=0;r=d+36|0;c[r>>2]=i+(h*104|0);r=d+40|0;c[r>>2]=0;g[d>>2]=e-q;r=d+4|0;g[r>>2]=m-q;r=d+8|0;g[r>>2]=n-q;r=d+12|0;g[r>>2]=0.0;r=d+16|0;g[r>>2]=q+e;r=d+20|0;g[r>>2]=q+m;r=d+24|0;g[r>>2]=q+n;r=d+28|0;g[r>>2]=0.0;r=c[b+988>>2]|0;Pe(b+988|0,r,d);b=b+1e3|0;r=c[b>>2]|0;r=r+1|0;c[b>>2]=r;b=i+(h*104|0)+96|0;c[b>>2]=d;l=s;return}function ad(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0;s=l;l=l+752|0;c[s+136+8>>2]=0;c[s+136+12>>2]=-1;q=s+136+28|0;c[s+136>>2]=7020;c[s+136+4>>2]=8;c[s+136+16>>2]=1065353216;c[s+136+20>>2]=1065353216;c[s+136+24>>2]=1065353216;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[q+16>>2]=0;c[q+20>>2]=0;c[q+24>>2]=0;q=c[e+4>>2]|0;r=c[e+12>>2]|0;h=c[q+4>>2]|0;if((h|0)<20){c[s+568>>2]=3896;c[s+568+168>>2]=0;g[s+568+172>>2]=0.0;c[s+568+164>>2]=c[f+4>>2];g[s+208+308>>2]=9.999999747378752e-05;a[s+208+332>>0]=0;c[s+192>>2]=5276;c[s+192+4>>2]=s+208;c[s+192+8>>2]=s+136;c[s+192+12>>2]=q;c[s+120>>2]=9484;c[s+120+4>>2]=s+208;c[s+120+8>>2]=s+136;c[s+120+12>>2]=q;q=(c[f+20>>2]&8|0)==0?s+192|0:s+120|0;if((Eb[c[(c[q>>2]|0)+8>>2]&3](q,b,d,r,r,s+568|0)|0?(i=s+568+132|0,j=+g[i>>2],k=+g[s+568+136>>2],m=+g[s+568+140>>2],j*j+k*k+m*m>9.999999747378752e-05):0)?(n=+g[s+568+164>>2],n<+g[f+4>>2]):0){p=1.0/+D(+(j*j+k*k+m*m));g[i>>2]=j*p;g[s+568+136>>2]=k*p;g[s+568+140>>2]=m*p;c[s>>2]=c[e+8>>2];c[s+4>>2]=0;c[s+8>>2]=c[i>>2];c[s+8+4>>2]=c[i+4>>2];c[s+8+8>>2]=c[i+8>>2];c[s+8+12>>2]=c[i+12>>2];g[s+24>>2]=n;+qb[c[(c[f>>2]|0)+12>>2]&31](f,s,1)}l=s;return}if((h+-21|0)>>>0>=9){if((h|0)!=31){l=s;return}h=c[q+68>>2]|0;e=c[e+8>>2]|0;c[s+568>>2]=6072;c[s+568+4>>2]=e;c[s+568+8>>2]=q;c[s+568+12>>2]=r;c[s+568+16>>2]=b;c[s+568+20>>2]=d;c[s+568+24>>2]=f;if(!h){i=c[q+20>>2]|0;if((i|0)>0){h=0;do{Wf(s+568|0,h);h=h+1|0}while((h|0)<(i|0))}}else{j=+g[r+48>>2];B=+g[b+48>>2]-j;m=+g[r+52>>2];A=+g[b+52>>2]-m;o=+g[r+56>>2];z=+g[b+56>>2]-o;y=+g[r>>2];x=+g[r+16>>2];w=+g[r+32>>2];v=+g[r+4>>2];u=+g[r+20>>2];t=+g[r+36>>2];k=+g[r+8>>2];n=+g[r+24>>2];p=+g[r+40>>2];g[s+208>>2]=B*y+A*x+z*w;g[s+208+4>>2]=B*v+A*u+z*t;g[s+208+8>>2]=B*k+A*n+z*p;g[s+208+12>>2]=0.0;j=+g[d+48>>2]-j;m=+g[d+52>>2]-m;o=+g[d+56>>2]-o;g[s+192>>2]=j*y+m*x+o*w;g[s+192+4>>2]=j*v+m*u+o*t;g[s+192+8>>2]=j*k+m*n+o*p;g[s+192+12>>2]=0.0;Ue(c[h>>2]|0,s+208|0,s+192|0,s+568|0)}l=s;return}F=+g[r>>2];E=+g[r+16>>2];n=+g[r+32>>2];C=+g[r+4>>2];t=+g[r+20>>2];o=+g[r+36>>2];x=+g[r+8>>2];z=+g[r+24>>2];B=+g[r+40>>2];u=-+g[r+48>>2];v=-+g[r+52>>2];w=-+g[r+56>>2];A=+g[b+48>>2];y=+g[b+52>>2];m=+g[b+56>>2];j=F*u+E*v+n*w+(F*A+E*y+n*m);k=C*u+t*v+o*w+(C*A+t*y+o*m);m=x*u+z*v+B*w+(x*A+z*y+B*m);g[s+120>>2]=j;g[s+120+4>>2]=k;g[s+120+8>>2]=m;g[s+120+12>>2]=0.0;y=+g[d+48>>2];A=+g[d+52>>2];p=+g[d+56>>2];n=F*u+E*v+n*w+(F*y+E*A+n*p);o=C*u+t*v+o*w+(C*y+t*A+o*p);p=x*u+z*v+B*w+(x*y+z*A+B*p);if((c[q+4>>2]|0)==21){h=c[e+8>>2]|0;e=c[f+20>>2]|0;c[s+4>>2]=c[s+120>>2];c[s+4+4>>2]=c[s+120+4>>2];c[s+4+8>>2]=c[s+120+8>>2];c[s+4+12>>2]=c[s+120+12>>2];g[s+20>>2]=n;g[s+24>>2]=o;g[s+28>>2]=p;g[s+32>>2]=0.0;c[s+36>>2]=e;g[s+40>>2]=1.0;c[s>>2]=6024;c[s+44>>2]=f;c[s+48>>2]=h;c[s+52>>2]=q;c[s+56>>2]=c[r>>2];c[s+56+4>>2]=c[r+4>>2];c[s+56+8>>2]=c[r+8>>2];c[s+56+12>>2]=c[r+12>>2];c[s+72>>2]=c[r+16>>2];c[s+72+4>>2]=c[r+16+4>>2];c[s+72+8>>2]=c[r+16+8>>2];c[s+72+12>>2]=c[r+16+12>>2];c[s+88>>2]=c[r+32>>2];c[s+88+4>>2]=c[r+32+4>>2];c[s+88+8>>2]=c[r+32+8>>2];c[s+88+12>>2]=c[r+32+12>>2];c[s+104>>2]=c[r+48>>2];c[s+104+4>>2]=c[r+48+4>>2];c[s+104+8>>2]=c[r+48+8>>2];c[s+104+12>>2]=c[r+48+12>>2];c[s+40>>2]=c[f+4>>2];h=c[q+52>>2]|0;c[s+192>>2]=7232;c[s+192+4>>2]=h;c[s+192+8>>2]=s;h=c[q+56>>2]|0;c[s+568>>2]=0;c[s+568+4>>2]=0;c[s+568+8>>2]=0;c[s+568+12>>2]=0;c[s+208>>2]=0;c[s+208+4>>2]=0;c[s+208+8>>2]=0;c[s+208+12>>2]=0;if(!(a[h+60>>0]|0))Re(h,s+192|0,s+120|0,n,o,p,s+568|0,s+208|0);else ue(h,s+192|0,s+120|0,n,o,p,s+568|0,s+208|0,c[h+56>>2]|0)}else{e=c[e+8>>2]|0;d=c[f+20>>2]|0;g[s+568+4>>2]=j;g[s+568+8>>2]=k;g[s+568+12>>2]=m;g[s+568+16>>2]=0.0;g[s+568+20>>2]=n;g[s+568+24>>2]=o;g[s+568+28>>2]=p;g[s+568+32>>2]=0.0;c[s+568+36>>2]=d;g[s+568+40>>2]=1.0;c[s+568>>2]=6048;c[s+568+44>>2]=f;c[s+568+48>>2]=e;c[s+568+52>>2]=q;c[s+568+56>>2]=c[r>>2];c[s+568+56+4>>2]=c[r+4>>2];c[s+568+56+8>>2]=c[r+8>>2];c[s+568+56+12>>2]=c[r+12>>2];c[s+568+72>>2]=c[r+16>>2];c[s+568+72+4>>2]=c[r+16+4>>2];c[s+568+72+8>>2]=c[r+16+8>>2];c[s+568+72+12>>2]=c[r+16+12>>2];c[s+568+88>>2]=c[r+32>>2];c[s+568+88+4>>2]=c[r+32+4>>2];c[s+568+88+8>>2]=c[r+32+8>>2];c[s+568+88+12>>2]=c[r+32+12>>2];c[s+568+104>>2]=c[r+48>>2];c[s+568+104+4>>2]=c[r+48+4>>2];c[s+568+104+8>>2]=c[r+48+8>>2];c[s+568+104+12>>2]=c[r+48+12>>2];c[s+568+40>>2]=c[f+4>>2];g[s+208>>2]=j;g[s+208+4>>2]=k;g[s+208+8>>2]=m;g[s+208+12>>2]=0.0;if(n>2]=n;if(o>2]=o;if(p>2]=p;g[s+192>>2]=j;g[s+192+4>>2]=k;g[s+192+8>>2]=m;g[s+192+12>>2]=0.0;if(j>2]=n;if(k>2]=o;if(m>2]=p;Vb[c[(c[q>>2]|0)+64>>2]&127](q,s+568|0,s+208|0,s+192|0)}l=s;return}function bd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,D=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0;c[b>>2]=c[a>>2];c[b+4>>2]=c[a+4>>2];c[b+8>>2]=c[a+8>>2];c[b+12>>2]=c[a+12>>2];c[b+16>>2]=c[a+16>>2];c[b+16+4>>2]=c[a+16+4>>2];c[b+16+8>>2]=c[a+16+8>>2];c[b+16+12>>2]=c[a+16+12>>2];c[b+32>>2]=c[a+32>>2];c[b+32+4>>2]=c[a+32+4>>2];c[b+32+8>>2]=c[a+32+8>>2];c[b+32+12>>2]=c[a+32+12>>2];q=+g[a+20>>2];m=+g[a+40>>2];r=+g[a+24>>2];n=+g[a+36>>2];o=+g[a+32>>2];s=+g[a+16>>2];t=+g[a>>2];p=+g[a+4>>2];u=+g[a+8>>2];v=1.0/((q*m-r*n)*t+p*(r*o-m*s)+(n*s-q*o)*u);g[d>>2]=(q*m-r*n)*v;g[d+4>>2]=(n*u-m*p)*v;g[d+8>>2]=(r*p-q*u)*v;g[d+12>>2]=0.0;g[d+16>>2]=(r*o-m*s)*v;g[d+20>>2]=(m*t-o*u)*v;g[d+24>>2]=(s*u-r*t)*v;g[d+28>>2]=0.0;g[d+32>>2]=(n*s-q*o)*v;g[d+36>>2]=(o*p-n*t)*v;g[d+40>>2]=(q*t-s*p)*v;g[d+44>>2]=0.0;a:do if(!(c[5759]|0)){e=b+20|0;f=b+36|0;h=b+8|0;i=b+24|0;j=b+40|0;k=b;l=b+4|0}else{e=0;D=(q*t-s*p)*v;F=(q*m-r*n)*v;G=(r*o-m*s)*v;H=(n*s-q*o)*v;I=(n*u-m*p)*v;B=(m*t-o*u)*v;A=(o*p-n*t)*v;z=(r*p-q*u)*v;y=(s*u-r*t)*v;while(1){o=+C(+F);n=+C(+G);N=+C(+H);W=+C(+I);O=+C(+B);M=+C(+A);Q=+C(+z);P=+C(+y);w=+C(+D);R=o+n+N>W+O+M?o+n+N:W+O+M;O=o+W+Q>n+O+P?o+W+Q:n+O+P;n=+g[b>>2];W=+C(+n);o=+g[b+16>>2];T=+C(+o);p=+g[b+32>>2];K=+C(+p);q=+g[b+4>>2];V=+C(+q);r=+g[b+20>>2];S=+C(+r);s=+g[b+36>>2];J=+C(+s);t=+g[b+8>>2];U=+C(+t);u=+g[b+24>>2];L=+C(+u);v=+g[b+40>>2];x=+C(+v);m=W+T+K>V+S+J?W+T+K:V+S+J;m=m>U+L+x?m:U+L+x;L=W+V+U>T+S+L?W+V+U:T+S+L;w=(R>Q+P+w?R:Q+P+w)*(O>N+M+w?O:N+M+w);x=m*(L>K+J+x?L:K+J+x);if(+C(+w)<1.1920928955078125e-07){e=b+20|0;f=b+36|0;h=b+8|0;i=b+24|0;j=b+40|0;k=b;l=b+4|0;break a}if(+C(+x)<1.1920928955078125e-07){e=b+20|0;f=b+36|0;h=b+8|0;i=b+24|0;j=b+40|0;k=b;l=b+4|0;break a}W=+E(+(w/x),.25);O=(n*(W+-2.0)+F*(1.0/W))*.5;Q=(q*(W+-2.0)+1.0/W*G)*.5;S=(t*(W+-2.0)+1.0/W*H)*.5;P=(o*(W+-2.0)+1.0/W*I)*.5;R=(r*(W+-2.0)+1.0/W*B)*.5;T=(u*(W+-2.0)+1.0/W*A)*.5;U=(p*(W+-2.0)+1.0/W*z)*.5;V=(s*(W+-2.0)+1.0/W*y)*.5;W=(v*(W+-2.0)+1.0/W*D)*.5;g[b>>2]=n+O;g[b+4>>2]=q+Q;g[b+8>>2]=t+S;g[b+12>>2]=0.0;g[b+16>>2]=o+P;g[b+20>>2]=r+R;g[b+24>>2]=u+T;g[b+28>>2]=0.0;g[b+32>>2]=p+U;g[b+36>>2]=s+V;g[b+40>>2]=v+W;g[b+44>>2]=0.0;N=1.0/(((v+W)*(r+R)-(u+T)*(s+V))*(n+O)+(q+Q)*((u+T)*(p+U)-(v+W)*(o+P))+((s+V)*(o+P)-(r+R)*(p+U))*(t+S));F=((v+W)*(r+R)-(u+T)*(s+V))*N;I=((s+V)*(t+S)-(v+W)*(q+Q))*N;z=((u+T)*(q+Q)-(r+R)*(t+S))*N;G=((u+T)*(p+U)-(v+W)*(o+P))*N;B=((v+W)*(n+O)-(p+U)*(t+S))*N;y=((o+P)*(t+S)-(u+T)*(n+O))*N;H=((s+V)*(o+P)-(r+R)*(p+U))*N;A=((p+U)*(q+Q)-(s+V)*(n+O))*N;D=((r+R)*(n+O)-(o+P)*(q+Q))*N;g[d>>2]=F;g[d+4>>2]=I;g[d+8>>2]=z;g[d+12>>2]=0.0;g[d+16>>2]=G;g[d+20>>2]=B;g[d+24>>2]=y;g[d+28>>2]=0.0;g[d+32>>2]=H;g[d+36>>2]=A;g[d+40>>2]=D;g[d+44>>2]=0.0;U=+C(+O)+ +C(+P)+ +C(+U);V=+C(+Q)+ +C(+R)+ +C(+V);W=+C(+S)+ +C(+T)+ +C(+W);V=U>V?U:V;if((V>W?V:W)<=m*+g[5758])break;e=e+1|0;if(e>>>0>=(c[5759]|0)>>>0){e=b+20|0;f=b+36|0;h=b+8|0;i=b+24|0;j=b+40|0;k=b;l=b+4|0;break a}}M=+g[b>>2];O=+g[b+16>>2];Q=+g[b+32>>2];H=+g[b+4>>2];J=+g[b+20>>2];L=+g[b+36>>2];A=+g[b+8>>2];D=+g[b+24>>2];G=+g[b+40>>2];N=+g[a>>2];P=+g[a+16>>2];R=+g[a+32>>2];I=+g[a+4>>2];K=+g[a+20>>2];T=+g[a+36>>2];B=+g[a+8>>2];F=+g[a+24>>2];W=+g[a+40>>2];V=A*I+D*K+G*T+(H*B+J*F+L*W);S=H*N+J*P+L*R+(M*I+O*K+Q*T);U=A*N+D*P+G*R+(M*B+O*F+Q*W);W=A*B+D*F+G*W+(A*B+D*F+G*W);T=H*I+J*K+L*T+(H*I+J*K+L*T);R=M*N+O*P+Q*R+(M*N+O*P+Q*R);S=S*.5;U=U*.5;V=V*.5;R=R*.5;g[d>>2]=R;g[d+4>>2]=S;g[d+8>>2]=U;g[d+12>>2]=0.0;g[d+16>>2]=S;T=T*.5;g[d+20>>2]=T;g[d+24>>2]=V;g[d+28>>2]=0.0;g[d+32>>2]=U;g[d+36>>2]=V;W=W*.5;g[d+40>>2]=W;g[d+44>>2]=0.0;return}while(0);M=+g[k>>2];O=+g[b+16>>2];Q=+g[b+32>>2];H=+g[l>>2];J=+g[e>>2];L=+g[f>>2];A=+g[h>>2];D=+g[i>>2];G=+g[j>>2];N=+g[a>>2];P=+g[a+16>>2];R=+g[a+32>>2];I=+g[a+4>>2];K=+g[a+20>>2];T=+g[a+36>>2];B=+g[a+8>>2];F=+g[a+24>>2];W=+g[a+40>>2];V=A*I+D*K+G*T+(H*B+J*F+L*W);S=H*N+J*P+L*R+(M*I+O*K+Q*T);U=A*N+D*P+G*R+(M*B+O*F+Q*W);W=A*B+D*F+G*W+(A*B+D*F+G*W);T=H*I+J*K+L*T+(H*I+J*K+L*T);R=M*N+O*P+Q*R+(M*N+O*P+Q*R);S=S*.5;U=U*.5;V=V*.5;R=R*.5;g[d>>2]=R;g[d+4>>2]=S;g[d+8>>2]=U;g[d+12>>2]=0.0;g[d+16>>2]=S;T=T*.5;g[d+20>>2]=T;g[d+24>>2]=V;g[d+28>>2]=0.0;g[d+32>>2]=U;g[d+36>>2]=V;W=W*.5;g[d+40>>2]=W;g[d+44>>2]=0.0;return}function cd(a,b,f,i){a=a|0;b=b|0;f=f|0;i=i|0;var j=0.0,k=0.0,m=0.0,n=0,o=0,p=0.0,q=0.0,r=0,s=0,t=0,u=0;o=l;l=l+80|0;n=xb[c[(c[a>>2]|0)+28>>2]&127](a)|0;j=+g[a+4>>2];k=+g[a+8>>2];m=+g[a+12>>2];if((n|0)<=0){l=o;return}i=0;do{cc[c[(c[a>>2]|0)+16>>2]&3](a,o+76|0,o+52|0,o+64|0,o+56|0,o+72|0,o+68|0,o+48|0,o+60|0,i);a:do switch(c[o+64>>2]|0){case 0:{switch(c[o+60>>2]|0){case 2:{if((c[o+48>>2]|0)>0)f=0;else break a;do{r=(c[o+72>>2]|0)+(P(c[o+68>>2]|0,f)|0)|0;t=c[o+76>>2]|0;s=c[o+56>>2]|0;u=t+(P(s,c[r>>2]|0)|0)|0;q=k*+g[u+4>>2];p=m*+g[u+8>>2];g[o>>2]=j*+g[u>>2];g[o+4>>2]=q;g[o+8>>2]=p;g[o+12>>2]=0.0;u=t+(P(s,c[r+4>>2]|0)|0)|0;p=k*+g[u+4>>2];q=m*+g[u+8>>2];g[o+16>>2]=j*+g[u>>2];g[o+20>>2]=p;g[o+24>>2]=q;g[o+28>>2]=0.0;r=t+(P(s,c[r+8>>2]|0)|0)|0;q=k*+g[r+4>>2];p=m*+g[r+8>>2];g[o+32>>2]=j*+g[r>>2];g[o+36>>2]=q;g[o+40>>2]=p;g[o+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,o,i,f);f=f+1|0}while((f|0)<(c[o+48>>2]|0));break}case 3:{if((c[o+48>>2]|0)>0)f=0;else break a;do{t=(c[o+72>>2]|0)+(P(c[o+68>>2]|0,f)|0)|0;s=c[o+76>>2]|0;u=c[o+56>>2]|0;r=s+(P(e[t>>1]|0,u)|0)|0;p=k*+g[r+4>>2];q=m*+g[r+8>>2];g[o>>2]=j*+g[r>>2];g[o+4>>2]=p;g[o+8>>2]=q;g[o+12>>2]=0.0;r=s+(P(e[t+2>>1]|0,u)|0)|0;q=k*+g[r+4>>2];p=m*+g[r+8>>2];g[o+16>>2]=j*+g[r>>2];g[o+20>>2]=q;g[o+24>>2]=p;g[o+28>>2]=0.0;u=s+(P(e[t+4>>1]|0,u)|0)|0;p=k*+g[u+4>>2];q=m*+g[u+8>>2];g[o+32>>2]=j*+g[u>>2];g[o+36>>2]=p;g[o+40>>2]=q;g[o+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,o,i,f);f=f+1|0}while((f|0)<(c[o+48>>2]|0));break}case 5:{if((c[o+48>>2]|0)>0)f=0;else break a;do{t=(c[o+72>>2]|0)+(P(c[o+68>>2]|0,f)|0)|0;s=c[o+76>>2]|0;u=c[o+56>>2]|0;r=s+(P(d[t>>0]|0,u)|0)|0;p=k*+g[r+4>>2];q=m*+g[r+8>>2];g[o>>2]=j*+g[r>>2];g[o+4>>2]=p;g[o+8>>2]=q;g[o+12>>2]=0.0;r=s+(P(d[t+1>>0]|0,u)|0)|0;q=k*+g[r+4>>2];p=m*+g[r+8>>2];g[o+16>>2]=j*+g[r>>2];g[o+20>>2]=q;g[o+24>>2]=p;g[o+28>>2]=0.0;u=s+(P(d[t+2>>0]|0,u)|0)|0;p=k*+g[u+4>>2];q=m*+g[u+8>>2];g[o+32>>2]=j*+g[u>>2];g[o+36>>2]=p;g[o+40>>2]=q;g[o+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,o,i,f);f=f+1|0}while((f|0)<(c[o+48>>2]|0));break}default:break a}break}case 1:{switch(c[o+60>>2]|0){case 2:{if((c[o+48>>2]|0)>0)f=0;else break a;do{u=(c[o+72>>2]|0)+(P(c[o+68>>2]|0,f)|0)|0;s=c[o+76>>2]|0;t=c[o+56>>2]|0;r=s+(P(t,c[u>>2]|0)|0)|0;p=k*+h[r+8>>3];q=m*+h[r+16>>3];g[o>>2]=j*+h[r>>3];g[o+4>>2]=p;g[o+8>>2]=q;g[o+12>>2]=0.0;r=s+(P(t,c[u+4>>2]|0)|0)|0;q=k*+h[r+8>>3];p=m*+h[r+16>>3];g[o+16>>2]=j*+h[r>>3];g[o+20>>2]=q;g[o+24>>2]=p;g[o+28>>2]=0.0;u=s+(P(t,c[u+8>>2]|0)|0)|0;p=k*+h[u+8>>3];q=m*+h[u+16>>3];g[o+32>>2]=j*+h[u>>3];g[o+36>>2]=p;g[o+40>>2]=q;g[o+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,o,i,f);f=f+1|0}while((f|0)<(c[o+48>>2]|0));break}case 3:{if((c[o+48>>2]|0)>0)f=0;else break a;do{t=(c[o+72>>2]|0)+(P(c[o+68>>2]|0,f)|0)|0;s=c[o+76>>2]|0;u=c[o+56>>2]|0;r=s+(P(e[t>>1]|0,u)|0)|0;p=k*+h[r+8>>3];q=m*+h[r+16>>3];g[o>>2]=j*+h[r>>3];g[o+4>>2]=p;g[o+8>>2]=q;g[o+12>>2]=0.0;r=s+(P(e[t+2>>1]|0,u)|0)|0;q=k*+h[r+8>>3];p=m*+h[r+16>>3];g[o+16>>2]=j*+h[r>>3];g[o+20>>2]=q;g[o+24>>2]=p;g[o+28>>2]=0.0;u=s+(P(e[t+4>>1]|0,u)|0)|0;p=k*+h[u+8>>3];q=m*+h[u+16>>3];g[o+32>>2]=j*+h[u>>3];g[o+36>>2]=p;g[o+40>>2]=q;g[o+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,o,i,f);f=f+1|0}while((f|0)<(c[o+48>>2]|0));break}case 5:{if((c[o+48>>2]|0)>0)f=0;else break a;do{t=(c[o+72>>2]|0)+(P(c[o+68>>2]|0,f)|0)|0;s=c[o+76>>2]|0;u=c[o+56>>2]|0;r=s+(P(d[t>>0]|0,u)|0)|0;p=k*+h[r+8>>3];q=m*+h[r+16>>3];g[o>>2]=j*+h[r>>3];g[o+4>>2]=p;g[o+8>>2]=q;g[o+12>>2]=0.0;r=s+(P(d[t+1>>0]|0,u)|0)|0;q=k*+h[r+8>>3];p=m*+h[r+16>>3];g[o+16>>2]=j*+h[r>>3];g[o+20>>2]=q;g[o+24>>2]=p;g[o+28>>2]=0.0;u=s+(P(d[t+2>>0]|0,u)|0)|0;p=k*+h[u+8>>3];q=m*+h[u+16>>3];g[o+32>>2]=j*+h[u>>3];g[o+36>>2]=p;g[o+40>>2]=q;g[o+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,o,i,f);f=f+1|0}while((f|0)<(c[o+48>>2]|0));break}default:break a}break}default:{}}while(0);Ob[c[(c[a>>2]|0)+24>>2]&127](a,i);i=i+1|0}while((i|0)!=(n|0));l=o;return}function dd(d,e,f,h,i){d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0.0,k=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0;y=l;l=l+128|0;a[d+60>>0]=f&1;if(f){r=+g[h>>2]+-1.0;u=+g[h+4>>2]+-1.0;v=+g[h+8>>2]+-1.0;g[d+4>>2]=r;g[d+8>>2]=u;g[d+12>>2]=v;g[d+16>>2]=0.0;x=+g[i>>2]+1.0;m=+g[i+4>>2]+1.0;j=+g[i+8>>2]+1.0;g[d+20>>2]=x;g[d+24>>2]=m;g[d+28>>2]=j;g[d+32>>2]=0.0;g[d+36>>2]=65533.0/(x-r);g[d+40>>2]=65533.0/(m-u);g[d+44>>2]=65533.0/(j-v);g[d+48>>2]=0.0;a[d+60>>0]=1;n=r+ +(~~((r-r)*(65533.0/(x-r)))&65535&-2&65535)/(65533.0/(x-r))+-1.0;o=u+ +(~~((u-u)*(65533.0/(m-u)))&65535&-2&65535)/(65533.0/(m-u))+-1.0;t=v+ +(~~((v-v)*(65533.0/(j-v)))&65535&-2&65535)/(65533.0/(j-v))+-1.0;if(n>2]=n;else n=r;if(o>2]=o;w=o}else w=u;if(t>2]=t;else t=v;o=x-n;r=m-w;u=j-t;g[d+36>>2]=65533.0/o;g[d+40>>2]=65533.0/r;g[d+44>>2]=65533.0/u;g[d+48>>2]=0.0;o=n+ +((~~(o*(65533.0/o)+1.0)&65535|1)&65535)/(65533.0/o)+1.0;r=w+ +((~~(r*(65533.0/r)+1.0)&65535|1)&65535)/(65533.0/r)+1.0;u=t+ +((~~(u*(65533.0/u)+1.0)&65535|1)&65535)/(65533.0/u)+1.0;if(x>2]=o;else o=x;if(m>2]=r;m=r}if(j>2]=u;j=u}g[d+36>>2]=65533.0/(o-n);g[d+40>>2]=65533.0/(m-w);g[d+44>>2]=65533.0/(j-t);g[d+48>>2]=0.0;c[y+96>>2]=8364;c[y+96+4>>2]=d+104;c[y+96+8>>2]=d;Vb[c[(c[e>>2]|0)+8>>2]&127](e,y+96|0,d+4|0,d+20|0);f=c[d+108>>2]|0;c[y+80>>2]=0;c[y+80+4>>2]=0;c[y+80+8>>2]=0;c[y+80+12>>2]=0;k=c[d+128>>2]|0;if((k|0)<(f<<1|0)){if((c[d+132>>2]|0)<(f<<1|0)){if(!f){h=0;e=k}else{c[6995]=(c[6995]|0)+1;h=sc(f<<5|19)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}e=c[d+128>>2]|0}if((e|0)>0){i=0;do{s=h+(i<<4)|0;q=(c[d+136>>2]|0)+(i<<4)|0;c[s>>2]=c[q>>2];c[s+4>>2]=c[q+4>>2];c[s+8>>2]=c[q+8>>2];c[s+12>>2]=c[q+12>>2];i=i+1|0}while((i|0)!=(e|0))}i=c[d+136>>2]|0;if(i|0){if(a[d+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[d+136>>2]=0}a[d+140>>0]=1;c[d+136>>2]=h;c[d+132>>2]=f<<1;i=d+136|0}else i=d+136|0;h=k;do{s=(c[i>>2]|0)+(h<<4)|0;c[s>>2]=c[y+80>>2];c[s+4>>2]=c[y+80+4>>2];c[s+8>>2]=c[y+80+8>>2];c[s+12>>2]=c[y+80+12>>2];h=h+1|0}while((h|0)!=(f<<1|0))}c[d+128>>2]=f<<1}else{c[y+96>>2]=8384;c[y+96+4>>2]=d+64;c[y+80>>2]=-581039253;c[y+80+4>>2]=-581039253;c[y+80+8>>2]=-581039253;g[y+80+12>>2]=0.0;c[y+64>>2]=1566444395;c[y+64+4>>2]=1566444395;c[y+64+8>>2]=1566444395;g[y+64+12>>2]=0.0;Vb[c[(c[e>>2]|0)+8>>2]&127](e,y+96|0,y+80|0,y+64|0);f=c[d+68>>2]|0;k=y;q=k+64|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(q|0));s=c[d+88>>2]|0;if((s|0)<(f<<1|0)){if((c[d+92>>2]|0)<(f<<1|0)){if(!f){h=0;e=s}else{c[6995]=(c[6995]|0)+1;h=sc(f<<7|19)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}e=c[d+88>>2]|0}if((e|0)>0){i=0;do{k=h+(i<<6)|0;p=(c[d+96>>2]|0)+(i<<6)|0;q=k+64|0;do{c[k>>2]=c[p>>2];k=k+4|0;p=p+4|0}while((k|0)<(q|0));i=i+1|0}while((i|0)!=(e|0))}i=c[d+96>>2]|0;if(i|0){if(a[d+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[d+96>>2]=0}a[d+100>>0]=1;c[d+96>>2]=h;c[d+92>>2]=f<<1;i=d+96|0}else i=d+96|0;h=s;do{k=(c[i>>2]|0)+(h<<6)|0;p=y;q=k+64|0;do{c[k>>2]=c[p>>2];k=k+4|0;p=p+4|0}while((k|0)<(q|0));h=h+1|0}while((h|0)!=(f<<1|0))}c[d+88>>2]=f<<1}c[d+56>>2]=0;Cc(d,0,f);if(a[d+60>>0]|0?(c[d+152>>2]|0)==0:0){if(!(c[d+156>>2]|0)){c[6995]=(c[6995]|0)+1;f=sc(51)|0;if(!f)e=0;else{c[(f+4+15&-16)+-4>>2]=f;e=f+4+15&-16}h=c[d+152>>2]|0;if((h|0)>0){f=0;do{s=e+(f<<5)|0;q=(c[d+160>>2]|0)+(f<<5)|0;c[s>>2]=c[q>>2];c[s+4>>2]=c[q+4>>2];c[s+8>>2]=c[q+8>>2];c[s+12>>2]=c[q+12>>2];c[s+16>>2]=c[q+16>>2];c[s+20>>2]=c[q+20>>2];c[s+24>>2]=c[q+24>>2];c[s+28>>2]=c[q+28>>2];f=f+1|0}while((f|0)!=(h|0))}f=c[d+160>>2]|0;if(f|0){if(a[d+164>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[d+160>>2]=0}a[d+164>>0]=1;c[d+160>>2]=e;c[d+156>>2]=1;h=d+160|0;i=(c[d+152>>2]|0)+1|0;f=e}else{h=d+160|0;i=1;f=c[d+160>>2]|0}c[d+152>>2]=i;c[f>>2]=c[y+96>>2];c[f+4>>2]=c[y+96+4>>2];c[f+8>>2]=c[y+96+8>>2];c[f+12>>2]=c[y+96+12>>2];c[f+16>>2]=c[y+96+16>>2];c[f+20>>2]=c[y+96+20>>2];c[f+24>>2]=c[y+96+24>>2];c[f+28>>2]=c[y+96+28>>2];s=c[h>>2]|0;q=c[d+136>>2]|0;b[s>>1]=b[q>>1]|0;b[s+2>>1]=b[q+2>>1]|0;b[s+4>>1]=b[q+4>>1]|0;b[s+6>>1]=b[q+6>>1]|0;b[s+8>>1]=b[q+8>>1]|0;b[s+10>>1]=b[q+10>>1]|0;c[s+12>>2]=0;q=c[q+12>>2]|0;c[s+16>>2]=(q|0)>-1?1:0-q|0}c[d+168>>2]=c[d+152>>2];f=c[d+116>>2]|0;if(f|0){if(a[d+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[d+116>>2]=0}a[d+120>>0]=1;c[d+116>>2]=0;c[d+108>>2]=0;c[d+112>>2]=0;f=c[d+76>>2]|0;if(!f){a[d+80>>0]=1;c[d+76>>2]=0;c[d+68>>2]=0;d=d+72|0;c[d>>2]=0;l=y;return}if(a[d+80>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[d+76>>2]=0;a[d+80>>0]=1;c[d+76>>2]=0;c[d+68>>2]=0;d=d+72|0;c[d>>2]=0;l=y;return}function ed(b,d,e,f,h,i,k,l,m,n,o,p){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;k=k|0;l=l|0;m=+m;n=n|0;o=+o;p=+p;var q=0.0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0,Q=0,R=0.0,S=0.0;Q=c[b+68>>2]|0;if((Q|0)==(c[b+72>>2]|0)?(u=Q|0?Q<<1:1,(Q|0)<(u|0)):0){if(!u){r=0;t=Q}else{c[6995]=(c[6995]|0)+1;r=sc((u*152|3)+16|0)|0;if(!r)r=0;else{c[(r+4+15&-16)+-4>>2]=r;r=r+4+15&-16}t=c[b+68>>2]|0}if((t|0)>0){s=0;do{gi(r+(s*152|0)|0,(c[b+76>>2]|0)+(s*152|0)|0,152)|0;s=s+1|0}while((s|0)!=(t|0))}s=c[b+76>>2]|0;if(s|0){if(a[b+80>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[s+-4>>2]|0)}c[b+76>>2]=0}a[b+80>>0]=1;c[b+76>>2]=r;c[b+72>>2]=u;r=c[b+68>>2]|0}else r=Q;c[b+68>>2]=r+1;P=c[b+76>>2]|0;c[P+(Q*152|0)+140>>2]=h;t=c[b+16>>2]|0;r=c[t+(e*244|0)+240>>2]|0;s=c[t+(f*244|0)+240>>2]|0;c[P+(Q*152|0)+144>>2]=e;c[P+(Q*152|0)+148>>2]=f;u=c[i+84>>2]|0;c[P+(Q*152|0)+104>>2]=u;c[P+(Q*152|0)+132>>2]=0;g[P+(Q*152|0)+100>>2]=0.0;g[P+(Q*152|0)+96>>2]=0.0;O=(c[j>>2]=u,+g[j>>2]);if(r|0){c[P+(Q*152|0)+16>>2]=c[d>>2];c[P+(Q*152|0)+16+4>>2]=c[d+4>>2];c[P+(Q*152|0)+16+8>>2]=c[d+8>>2];c[P+(Q*152|0)+16+12>>2]=c[d+12>>2];N=+g[k+4>>2];J=+g[P+(Q*152|0)+24>>2];H=+g[k+8>>2];L=+g[P+(Q*152|0)+20>>2];K=+g[P+(Q*152|0)+16>>2];M=+g[k>>2];g[P+(Q*152|0)>>2]=N*J-H*L;g[P+(Q*152|0)+4>>2]=H*K-J*M;g[P+(Q*152|0)+8>>2]=L*M-N*K;g[P+(Q*152|0)+12>>2]=0.0;w=((N*J-H*L)*+g[r+324>>2]+(H*K-J*M)*+g[r+328>>2]+(L*M-N*K)*+g[r+332>>2])*+g[r+604>>2];q=((N*J-H*L)*+g[r+340>>2]+(H*K-J*M)*+g[r+344>>2]+(L*M-N*K)*+g[r+348>>2])*+g[r+608>>2];v=((N*J-H*L)*+g[r+356>>2]+(H*K-J*M)*+g[r+360>>2]+(L*M-N*K)*+g[r+364>>2])*+g[r+612>>2];g[P+(Q*152|0)+64>>2]=w;g[P+(Q*152|0)+68>>2]=q;g[P+(Q*152|0)+72>>2]=v;g[P+(Q*152|0)+76>>2]=0.0;C=K;D=L;E=J;I=N*J-H*L;J=H*K-J*M;K=L*M-N*K}else{c[P+(Q*152|0)+64>>2]=0;c[P+(Q*152|0)+64+4>>2]=0;c[P+(Q*152|0)+64+8>>2]=0;c[P+(Q*152|0)+64+12>>2]=0;c[P+(Q*152|0)>>2]=0;c[P+(Q*152|0)+4>>2]=0;c[P+(Q*152|0)+8>>2]=0;c[P+(Q*152|0)+12>>2]=0;c[P+(Q*152|0)+16>>2]=0;c[P+(Q*152|0)+20>>2]=0;c[P+(Q*152|0)+24>>2]=0;c[P+(Q*152|0)+28>>2]=0;q=0.0;v=0.0;w=0.0;C=0.0;D=0.0;E=0.0;I=0.0;J=0.0;K=0.0}if(s|0){N=-+g[d>>2];A=-+g[d+4>>2];M=-+g[d+8>>2];g[P+(Q*152|0)+48>>2]=N;g[P+(Q*152|0)+52>>2]=A;g[P+(Q*152|0)+56>>2]=M;g[P+(Q*152|0)+60>>2]=0.0;B=+g[l+4>>2];S=+g[l+8>>2];R=+g[l>>2];g[P+(Q*152|0)+32>>2]=B*M-S*A;g[P+(Q*152|0)+36>>2]=S*N-R*M;g[P+(Q*152|0)+40>>2]=R*A-B*N;g[P+(Q*152|0)+44>>2]=0.0;x=((B*M-S*A)*+g[s+324>>2]+(S*N-R*M)*+g[s+328>>2]+(R*A-B*N)*+g[s+332>>2])*+g[s+604>>2];y=((B*M-S*A)*+g[s+340>>2]+(S*N-R*M)*+g[s+344>>2]+(R*A-B*N)*+g[s+348>>2])*+g[s+608>>2];z=((B*M-S*A)*+g[s+356>>2]+(S*N-R*M)*+g[s+360>>2]+(R*A-B*N)*+g[s+364>>2])*+g[s+612>>2];g[P+(Q*152|0)+80>>2]=x;g[P+(Q*152|0)+84>>2]=y;g[P+(Q*152|0)+88>>2]=z;g[P+(Q*152|0)+92>>2]=0.0;F=N;G=A;H=M;L=B*M-S*A;M=S*N-R*M;N=R*A-B*N}else{c[P+(Q*152|0)+80>>2]=0;c[P+(Q*152|0)+80+4>>2]=0;c[P+(Q*152|0)+80+8>>2]=0;c[P+(Q*152|0)+80+12>>2]=0;c[P+(Q*152|0)+32>>2]=0;c[P+(Q*152|0)+32+4>>2]=0;c[P+(Q*152|0)+32+8>>2]=0;c[P+(Q*152|0)+32+12>>2]=0;c[P+(Q*152|0)+32+16>>2]=0;c[P+(Q*152|0)+32+20>>2]=0;c[P+(Q*152|0)+32+24>>2]=0;c[P+(Q*152|0)+32+28>>2]=0;x=0.0;y=0.0;z=0.0;F=0.0;G=0.0;H=0.0;L=0.0;M=0.0;N=0.0}if(r|0){B=+g[k+8>>2];R=+g[k+4>>2];S=+g[k>>2];v=+g[r+404>>2]+((q*B-v*R)*+g[d>>2]+(v*S-B*w)*+g[d+4>>2]+(R*w-q*S)*+g[d+8>>2])}else v=0.0;if(s|0){R=-x;q=-y;z=-z;A=+g[l+8>>2];B=+g[l+4>>2];S=+g[l>>2];q=+g[s+404>>2]+((A*q-B*z)*+g[d>>2]+(S*z-A*R)*+g[d+4>>2]+(B*R-S*q)*+g[d+8>>2])}else q=0.0;B=m/(v+q);g[P+(Q*152|0)+108>>2]=B;if(r|0){z=+g[t+(e*244|0)+192>>2];m=+g[t+(e*244|0)+196>>2];A=+g[t+(e*244|0)+200>>2];y=(+g[t+(e*244|0)+176>>2]+ +g[t+(e*244|0)+208>>2])*C+(+g[t+(e*244|0)+180>>2]+ +g[t+(e*244|0)+212>>2])*D+(+g[t+(e*244|0)+184>>2]+ +g[t+(e*244|0)+216>>2])*E}else{z=0.0;m=0.0;A=0.0;y=C*0.0+D*0.0+E*0.0}if(s|0){v=+g[t+(f*244|0)+192>>2];w=+g[t+(f*244|0)+196>>2];x=+g[t+(f*244|0)+200>>2];q=(+g[t+(f*244|0)+176>>2]+ +g[t+(f*244|0)+208>>2])*F+(+g[t+(f*244|0)+180>>2]+ +g[t+(f*244|0)+212>>2])*G+(+g[t+(f*244|0)+184>>2]+ +g[t+(f*244|0)+216>>2])*H}else{v=0.0;w=0.0;x=0.0;q=F*0.0+G*0.0+H*0.0}q=B*(o-(y+(z*I+m*J+A*K)+(q+(v*L+w*M+x*N))));if(!(c[i+120>>2]&16)){S=0.0;S=q+S;n=P+(Q*152|0)+112|0;g[n>>2]=S;n=P+(Q*152|0)+128|0;g[n>>2]=0.0;n=P+(Q*152|0)+116|0;g[n>>2]=p;S=-O;n=P+(Q*152|0)+120|0;g[n>>2]=S;n=P+(Q*152|0)+124|0;c[n>>2]=u;return}S=B*(-(+g[n+44>>2]*((+g[i+48>>2]-+g[i+32>>2])*+g[d>>2]+(+g[i+52>>2]-+g[i+36>>2])*+g[d+4>>2]+(+g[i+56>>2]-+g[i+40>>2])*+g[d+8>>2]))/+g[n+12>>2]);S=q+S;n=P+(Q*152|0)+112|0;g[n>>2]=S;n=P+(Q*152|0)+128|0;g[n>>2]=0.0;n=P+(Q*152|0)+116|0;g[n>>2]=p;S=-O;n=P+(Q*152|0)+120|0;g[n>>2]=S;n=P+(Q*152|0)+124|0;c[n>>2]=u;return}function fd(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0.0,u=0.0,v=0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0,ba=0.0,ca=0.0,da=0.0,ea=0,fa=0.0;ea=l;l=l+32|0;J=c[b+4>>2]|0;a[J+312>>0]=0;c[J>>2]=0;a[J+356>>0]=1;c[J+292>>2]=1566444395;c[J+296>>2]=1566444395;c[J+300>>2]=1566444395;g[J+304>>2]=0.0;c[J+336>>2]=0;c[J+336+4>>2]=0;c[J+336+8>>2]=0;c[J+336+12>>2]=0;a[J+336+16>>0]=0;a[J+332>>0]=a[J+332>>0]&-16;p=+g[d+48>>2];r=+g[d+52>>2];u=+g[d+56>>2];o=+g[f+48>>2];q=+g[f+52>>2];t=+g[f+56>>2];L=+g[d>>2];X=+g[d+4>>2];Z=+g[d+8>>2];$=+g[d+16>>2];N=+g[d+20>>2];P=+g[d+24>>2];R=+g[d+32>>2];T=+g[d+36>>2];V=+g[d+40>>2];K=+g[f>>2];W=+g[f+4>>2];Y=+g[f+8>>2];_=+g[f+16>>2];M=+g[f+20>>2];O=+g[f+24>>2];Q=+g[f+32>>2];S=+g[f+36>>2];U=+g[f+40>>2];ba=+g[e+48>>2]-p-(+g[h+48>>2]-o);ca=+g[e+52>>2]-r-(+g[h+52>>2]-q);da=+g[e+56>>2]-u-(+g[h+56>>2]-t);J=c[b+8>>2]|0;x=c[(c[J>>2]|0)+64>>2]|0;g[ea>>2]=L*-ba+$*-ca+R*-da;g[ea+4>>2]=X*-ba+N*-ca+T*-da;g[ea+8>>2]=Z*-ba+P*-ca+V*-da;g[ea+12>>2]=0.0;Sb[x&127](ea+16|0,J,ea);H=+g[ea+16>>2];I=+g[ea+16+4>>2];G=+g[ea+16+8>>2];m=H*+g[d>>2]+I*+g[d+4>>2]+G*+g[d+8>>2]+ +g[d+48>>2];w=H*+g[d+16>>2]+I*+g[d+20>>2]+G*+g[d+24>>2]+ +g[d+52>>2];G=H*+g[d+32>>2]+I*+g[d+36>>2]+G*+g[d+40>>2]+ +g[d+56>>2];J=c[b+12>>2]|0;x=c[(c[J>>2]|0)+64>>2]|0;I=ba*+g[f+4>>2]+ca*+g[f+20>>2]+da*+g[f+36>>2];H=ba*+g[f+8>>2]+ca*+g[f+24>>2]+da*+g[f+40>>2];g[ea>>2]=ba*+g[f>>2]+ca*+g[f+16>>2]+da*+g[f+32>>2];g[ea+4>>2]=I;g[ea+8>>2]=H;g[ea+12>>2]=0.0;Sb[x&127](ea+16|0,J,ea);H=+g[ea+16>>2];I=+g[ea+16+4>>2];n=+g[ea+16+8>>2];m=m-(H*+g[f>>2]+I*+g[f+4>>2]+n*+g[f+8>>2]+ +g[f+48>>2]);w=w-(H*+g[f+16>>2]+I*+g[f+20>>2]+n*+g[f+24>>2]+ +g[f+52>>2]);n=G-(H*+g[f+32>>2]+I*+g[f+36>>2]+n*+g[f+40>>2]+ +g[f+56>>2]);a:do if(m*m+w*w+n*n>9.999999747378752e-05){k=0.0;J=32;I=m;j=0;H=n;s=0;z=o;o=0.0;n=0.0;m=0.0;while(1){if(!J)break a;J=J+-1|0;x=c[b+8>>2]|0;v=c[(c[x>>2]|0)+64>>2]|0;C=-I;fa=-w;y=-H;g[ea>>2]=L*C+$*fa+R*y;g[ea+4>>2]=X*C+N*fa+T*y;g[ea+8>>2]=Z*C+P*fa+V*y;g[ea+12>>2]=0.0;Sb[v&127](ea+16|0,x,ea);y=+g[ea+16>>2];fa=+g[ea+16+4>>2];C=+g[ea+16+8>>2];A=p+(L*y+X*fa+Z*C);B=r+($*y+N*fa+P*C);C=u+(R*y+T*fa+V*C);x=c[b+12>>2]|0;v=c[(c[x>>2]|0)+64>>2]|0;g[ea>>2]=K*I+_*w+Q*H;g[ea+4>>2]=W*I+M*w+S*H;g[ea+8>>2]=Y*I+O*w+U*H;g[ea+12>>2]=0.0;Sb[v&127](ea+16|0,x,ea);fa=+g[ea+16>>2];y=+g[ea+16+4>>2];G=+g[ea+16+8>>2];E=z+(K*fa+W*y+Y*G);F=q+(_*fa+M*y+O*G);G=t+(Q*fa+S*y+U*G);y=I*(A-E)+w*(B-F)+H*(C-G);if(k>1.0){j=0;aa=25;break}if(y>0.0){m=ba*I+ca*w+da*H;if(m>=-1.4210854715202004e-14){j=0;aa=25;break}u=k-y/m;k=u;j=s;y=(1.0-u)*+g[f+48>>2]+u*+g[h+48>>2];p=(1.0-u)*+g[d+48>>2]+u*+g[e+48>>2];q=(1.0-u)*+g[f+52>>2]+u*+g[h+52>>2];r=(1.0-u)*+g[d+52>>2]+u*+g[e+52>>2];t=(1.0-u)*+g[f+56>>2]+u*+g[h+56>>2];u=(1.0-u)*+g[d+56>>2]+u*+g[e+56>>2];m=I;n=w;o=H}else y=z;s=c[b+4>>2]|0;x=c[s>>2]|0;b:do if((x|0)>0){w=+g[s+308>>2];v=0;while(1){H=A-E-+g[s+4+(v<<4)>>2];I=B-F-+g[s+4+(v<<4)+4>>2];fa=C-G-+g[s+4+(v<<4)+8>>2];v=v+1|0;if(H*H+I*I+fa*fa<=w){v=1;break b}if((v|0)>=(x|0)){v=0;break}}}else v=0;while(0);if((+g[s+304>>2]==0.0?C-G==+g[s+300>>2]:0)?B-F==+g[s+296>>2]:0){if(!(A-E==+g[s+292>>2]|v))aa=17}else if(!v)aa=17;if((aa|0)==17){aa=0;g[s+292>>2]=A-E;g[s+296>>2]=B-F;g[s+300>>2]=C-G;g[s+304>>2]=0.0;a[s+356>>0]=1;g[s+4+(x<<4)>>2]=A-E;g[s+4+(x<<4)+4>>2]=B-F;g[s+4+(x<<4)+8>>2]=C-G;g[s+4+(x<<4)+12>>2]=0.0;x=c[s>>2]|0;g[s+84+(x<<4)>>2]=A;g[s+84+(x<<4)+4>>2]=B;g[s+84+(x<<4)+8>>2]=C;g[s+84+(x<<4)+12>>2]=0.0;x=c[s>>2]|0;g[s+164+(x<<4)>>2]=E;g[s+164+(x<<4)+4>>2]=F;g[s+164+(x<<4)+8>>2]=G;g[s+164+(x<<4)+12>>2]=0.0;c[s>>2]=(c[s>>2]|0)+1;s=c[b+4>>2]|0}x=wc(s)|0;I=+g[s+276>>2];w=+g[s+280>>2];H=+g[s+284>>2];if(!x)break a;if(!(I*I+w*w+H*H>9.999999747378752e-05))break a;else{s=c[s+288>>2]|0;z=y}}if((aa|0)==25){l=ea;return j|0}}else{k=0.0;o=0.0;n=0.0;m=0.0;j=0}while(0);g[i+164>>2]=k;k=m*m+n*n+o*o;if(!(k>=1.4210854715202004e-14)){c[i+132>>2]=0;c[i+132+4>>2]=0;c[i+132+8>>2]=0;c[i+132+12>>2]=0;k=0.0;m=0.0;n=0.0}else{fa=1.0/+D(+k);k=m*fa;m=n*fa;n=o*fa;g[i+132>>2]=k;g[i+136>>2]=m;g[i+140>>2]=n;c[i+144>>2]=j}if(ba*k+ca*m+da*n>=-+g[i+172>>2]){i=0;l=ea;return i|0}b=c[b+4>>2]|0;wc(b)|0;$p(i+148|0,b+260|0,16)|0;i=1;l=ea;return i|0}function gd(b,d,e,f,h,i,j,k,l,m,n){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0,A=0,B=0,C=0,E=0.0,F=0,G=0,H=0;if((j|0)<2|(k|0)<2){m=0;return m|0}y=P(k,j)|0;c[6995]=(c[6995]|0)+1;b=sc(y>>>0>268435455?18:(y<<4|3)+16|0)|0;if(!b)q=0;else{c[(b+4+15&-16)+-4>>2]=b;q=b+4+15&-16}s=$I(y>>>0>1073741823?-1:y<<2)|0;if((k|0)>0?(j|0)>0:0){b=0;do{E=+(b|0)/+(k+-1|0);r=+g[e>>2];r=r+E*(+g[h>>2]-r);t=+g[e+4>>2];t=t+E*(+g[h+4>>2]-t);u=+g[e+8>>2];u=u+E*(+g[h+8>>2]-u);v=+g[f>>2];w=+g[f+4>>2];x=+g[f+8>>2];v=v+E*(+g[i>>2]-v)-r;w=w+E*(+g[i+4>>2]-w)-t;x=x+E*(+g[i+8>>2]-x)-u;p=P(b,j)|0;o=0;do{E=+(o|0)/+(j+-1|0);C=o+p|0;g[q+(C<<4)>>2]=r+v*E;g[q+(C<<4)+4>>2]=t+w*E;g[q+(C<<4)+8>>2]=u+x*E;g[q+(C<<4)+12>>2]=0.0;g[s+(C<<2)>>2]=1.0;o=o+1|0}while((o|0)!=(j|0));b=b+1|0}while((b|0)!=(k|0))}c[6995]=(c[6995]|0)+1;b=sc(1271)|0;if(!b)b=0;else{c[(b+4+15&-16)+-4>>2]=b;b=b+4+15&-16}Bc(b,d,y,q,s);if(l&1|0){g[(c[b+780>>2]|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&2|0){g[(c[b+780>>2]|0)+((j+-1|0)*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&4|0){C=P(k+-1|0,j)|0;g[(c[b+780>>2]|0)+(C*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&8|0){C=j+-1+(P(k+-1|0,j)|0)|0;g[(c[b+780>>2]|0)+(C*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&16|0){g[(c[b+780>>2]|0)+(((j+-1|0)/2|0)*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&32|0){C=P((k+-1|0)/2|0,j)|0;g[(c[b+780>>2]|0)+(C*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&64|0){C=j+-1+(P((k+-1|0)/2|0,j)|0)|0;g[(c[b+780>>2]|0)+(C*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&128|0){C=(P(k+-1|0,j)|0)+((j+-1|0)/2|0)|0;g[(c[b+780>>2]|0)+(C*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&256|0){C=(P((k+-1|0)/2|0,j)|0)+((j+-1|0)/2|0)|0;g[(c[b+780>>2]|0)+(C*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(q|0){c[6996]=(c[6996]|0)+1;Cd(c[q+-4>>2]|0)}aJ(s);if((k|0)<=0){m=b;return m|0}d=b+780|0;l=b+792|0;z=b+800|0;A=b+984|0;o=0;y=0;B=j+-1|0;C=(j<<1)+-1|0;while(1){p=y;y=y+1|0;a:do if((j|0)>0){i=P(p,j)|0;h=P(y,j)|0;t=1.0/+(k+-1|0)*+(k+-1-p|0);r=1.0/+(k+-1|0)*+(k+-2-p|0);if((y|0)<(k|0)){p=0;q=o}else{p=0;while(1){q=p;p=p+1|0;if((p|0)<(j|0)){s=p+i|0;e=c[d>>2]|0;Xh(b,0);h=(c[l>>2]|0)+-1|0;f=c[z>>2]|0;c[f+(h*52|0)+24>>2]=e+((q+i|0)*104|0);c[f+(h*52|0)+28>>2]=e+(s*104|0);w=+g[e+((q+i|0)*104|0)+8>>2]-+g[e+(s*104|0)+8>>2];x=+g[e+((q+i|0)*104|0)+12>>2]-+g[e+(s*104|0)+12>>2];E=+g[e+((q+i|0)*104|0)+16>>2]-+g[e+(s*104|0)+16>>2];g[f+(h*52|0)+32>>2]=+D(+(w*w+x*x+E*E));a[A>>0]=1}if((p|0)==(j|0))break a}}while(1){e=p+1|0;s=p+i|0;f=p+h|0;if((p|0)==(j+-1|0))break;G=c[d>>2]|0;Xh(b,0);H=(c[l>>2]|0)+-1|0;F=c[z>>2]|0;c[F+(H*52|0)+24>>2]=G+(s*104|0);c[F+(H*52|0)+28>>2]=G+((e+i|0)*104|0);E=+g[G+(s*104|0)+8>>2]-+g[G+((e+i|0)*104|0)+8>>2];x=+g[G+(s*104|0)+12>>2]-+g[G+((e+i|0)*104|0)+12>>2];w=+g[G+(s*104|0)+16>>2]-+g[G+((e+i|0)*104|0)+16>>2];g[F+(H*52|0)+32>>2]=+D(+(E*E+x*x+w*w));a[A>>0]=1;H=c[d>>2]|0;Xh(b,0);F=(c[l>>2]|0)+-1|0;G=c[z>>2]|0;c[G+(F*52|0)+24>>2]=H+(s*104|0);c[G+(F*52|0)+28>>2]=H+(f*104|0);w=+g[H+(s*104|0)+8>>2]-+g[H+(f*104|0)+8>>2];x=+g[H+(s*104|0)+12>>2]-+g[H+(f*104|0)+12>>2];E=+g[H+(s*104|0)+16>>2]-+g[H+(f*104|0)+16>>2];g[G+(F*52|0)+32>>2]=+D(+(w*w+x*x+E*E));a[A>>0]=1;bg(b,s,f,e+h|0,0);if(!n)bg(b,e+h|0,e+i|0,s,0);else{E=1.0/+(j+-1|0)*+(p|0);g[n+(q<<2)>>2]=E;g[n+(q+1<<2)>>2]=t;g[n+(q+2<<2)>>2]=E;g[n+(q+3<<2)>>2]=r;x=1.0/+(j+-1|0)*+(e|0);g[n+(q+4<<2)>>2]=x;g[n+(q+5<<2)>>2]=r;bg(b,e+h|0,e+i|0,s,0);g[n+(q+6<<2)>>2]=x;g[n+(q+7<<2)>>2]=r;g[n+(q+8<<2)>>2]=x;g[n+(q+9<<2)>>2]=t;g[n+(q+10<<2)>>2]=E;g[n+(q+11<<2)>>2]=t}if(m){F=c[d>>2]|0;Xh(b,0);H=(c[l>>2]|0)+-1|0;G=c[z>>2]|0;c[G+(H*52|0)+24>>2]=F+(s*104|0);c[G+(H*52|0)+28>>2]=F+((e+h|0)*104|0);w=+g[F+(s*104|0)+8>>2]-+g[F+((e+h|0)*104|0)+8>>2];x=+g[F+(s*104|0)+12>>2]-+g[F+((e+h|0)*104|0)+12>>2];E=+g[F+(s*104|0)+16>>2]-+g[F+((e+h|0)*104|0)+16>>2];g[G+(H*52|0)+32>>2]=+D(+(w*w+x*x+E*E));a[A>>0]=1}p=e;q=q+12|0}F=c[d>>2]|0;Xh(b,0);H=(c[l>>2]|0)+-1|0;G=c[z>>2]|0;c[G+(H*52|0)+24>>2]=F+(B*104|0);c[G+(H*52|0)+28>>2]=F+(C*104|0);w=+g[F+(B*104|0)+8>>2]-+g[F+(C*104|0)+8>>2];x=+g[F+(B*104|0)+12>>2]-+g[F+(C*104|0)+12>>2];E=+g[F+(B*104|0)+16>>2]-+g[F+(C*104|0)+16>>2];g[G+(H*52|0)+32>>2]=+D(+(w*w+x*x+E*E));a[A>>0]=1;o=(j*12|0)+-12+o|0}while(0);if((y|0)==(k|0))break;else{B=B+j|0;C=C+j|0}}return b|0}function hd(b,d,e,f,h){b=b|0;d=d|0;e=+e;f=+f;h=+h;var i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.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=0.0,B=0.0,C=0.0,E=0.0,F=0.0;y=l;l=l+240|0;n=+g[b+136>>2]+f;o=+g[b+140>>2]+h;g[b+152>>2]=+g[b+132>>2]+e;g[b+156>>2]=n;g[b+160>>2]=o;g[b+164>>2]=0.0;c[y+176>>2]=1065353216;q=y+176+4|0;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[y+176+20>>2]=1065353216;r=y+176+24|0;c[r>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;c[y+176+40>>2]=1065353216;s=y+176+44|0;c[s>>2]=0;c[s+4>>2]=0;c[s+8>>2]=0;c[s+12>>2]=0;c[s+16>>2]=0;c[y+112>>2]=1065353216;t=y+112+4|0;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[y+112+20>>2]=1065353216;u=y+112+24|0;c[u>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;c[u+12>>2]=0;c[y+112+40>>2]=1065353216;v=y+112+44|0;c[v>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;c[v+16>>2]=0;o=1.0;p=10;while(1){if((p|0)<=0){x=29;break}p=p+-1|0;c[y+176+48>>2]=c[b+132>>2];c[y+176+48+4>>2]=c[b+132+4>>2];c[y+176+48+8>>2]=c[b+132+8>>2];c[y+176+48+12>>2]=c[b+132+12>>2];c[y+112+48>>2]=c[b+152>>2];c[y+112+48+4>>2]=c[b+152+4>>2];c[y+112+48+8>>2]=c[b+152+8>>2];c[y+112+48+12>>2]=c[b+152+12>>2];m=+g[b+132>>2]-+g[b+152>>2];n=+g[b+136>>2]-+g[b+156>>2];e=+g[b+140>>2]-+g[b+160>>2];z=+g[b+168>>2];j=+g[b+172>>2];A=+g[b+176>>2];h=+g[b+180>>2];B=z*(2.0/(z*z+j*j+A*A+h*h));f=j*(2.0/(z*z+j*j+A*A+h*h));k=A*(2.0/(z*z+j*j+A*A+h*h));g[y+176>>2]=1.0-(j*f+A*k);g[q>>2]=z*f-h*k;g[y+176+8>>2]=z*k+h*f;g[y+176+12>>2]=0.0;g[y+176+16>>2]=z*f+h*k;g[y+176+20>>2]=1.0-(z*B+A*k);g[r>>2]=j*k-h*B;g[y+176+28>>2]=0.0;g[y+176+32>>2]=z*k-h*f;g[y+176+36>>2]=j*k+h*B;g[y+176+40>>2]=1.0-(z*B+j*f);g[s>>2]=0.0;f=+g[b+184>>2];j=+g[b+188>>2];B=+g[b+192>>2];z=+g[b+196>>2];h=f*(2.0/(f*f+j*j+B*B+z*z));k=j*(2.0/(f*f+j*j+B*B+z*z));A=B*(2.0/(f*f+j*j+B*B+z*z));g[y+112>>2]=1.0-(j*k+B*A);g[t>>2]=f*k-z*A;g[y+112+8>>2]=f*A+z*k;g[y+112+12>>2]=0.0;g[y+112+16>>2]=f*k+z*A;g[y+112+20>>2]=1.0-(f*h+B*A);g[u>>2]=j*A-z*h;g[y+112+28>>2]=0.0;g[y+112+32>>2]=f*A-z*k;g[y+112+36>>2]=j*A+z*h;g[y+112+40>>2]=1.0-(f*h+j*k);g[v>>2]=0.0;i=c[b+8>>2]|0;g[y+4>>2]=1.0;c[y+80>>2]=0;c[y+16>>2]=0;c[y+16+4>>2]=0;c[y+16+8>>2]=0;c[y+16+12>>2]=0;c[y+16+16>>2]=0;c[y+16+20>>2]=0;c[y+16+24>>2]=0;c[y+16+28>>2]=0;c[y>>2]=5252;c[y+84>>2]=i;g[y+88>>2]=m;g[y+92>>2]=n;g[y+96>>2]=e;g[y+100>>2]=0.0;g[y+104>>2]=0.0;i=c[i+188>>2]|0;c[y+8>>2]=c[i+4>>2];c[y+12>>2]=c[i+8>>2];i=c[b+12>>2]|0;e=+nb[c[(c[i>>2]|0)+48>>2]&15](i);i=c[b+12>>2]|0;Jb[c[(c[i>>2]|0)+44>>2]&31](i,e+ +g[b+64>>2]);if(!((((((((((((+g[y+176>>2]==+g[y+112>>2]?+g[y+176+16>>2]==+g[y+112+16>>2]:0)?+g[y+176+32>>2]==+g[y+112+32>>2]:0)?+g[q>>2]==+g[t>>2]:0)?+g[y+176+20>>2]==+g[y+112+20>>2]:0)?+g[y+176+36>>2]==+g[y+112+36>>2]:0)?+g[y+176+8>>2]==+g[y+112+8>>2]:0)?+g[r>>2]==+g[u>>2]:0)?+g[y+176+40>>2]==+g[y+112+40>>2]:0)?+g[y+176+60>>2]==+g[y+112+60>>2]:0)?+g[y+176+56>>2]==+g[y+112+56>>2]:0)?+g[y+176+52>>2]==+g[y+112+52>>2]:0)?+g[y+176+48>>2]==+g[y+112+48>>2]:0))x=16;do if((x|0)==16){x=0;i=c[b+12>>2]|0;if(!(a[b+250>>0]|0)){Ud(d,i,y+176|0,y+112|0,y,+g[d+56>>2]);break}else{pd(c[b+8>>2]|0,i,y+176|0,y+112|0,y,+g[d+56>>2]);break}}while(0);i=c[b+12>>2]|0;Jb[c[(c[i>>2]|0)+44>>2]&31](i,e);B=+g[y+4>>2];o=o-B;if((B<1.0?(w=c[b+8>>2]|0,(c[w+204>>2]&4|0)==0):0)?Bb[c[(c[b>>2]|0)+56>>2]&63](b,w,c[y+80>>2]|0)|0:0){e=+g[b+152>>2];k=+g[b+132>>2];h=+g[b+156>>2];m=+g[b+136>>2];j=+g[b+160>>2];n=+g[b+140>>2];f=+D(+((e-k)*(e-k)+(h-m)*(h-m)+(j-n)*(j-n)));if(f>1.1920928955078125e-07){E=+g[y+48>>2];z=+g[y+52>>2];F=+g[y+56>>2];B=((e-k)*(1.0/f)*E+(h-m)*(1.0/f)*z+(j-n)*(1.0/f)*F)*2.0;C=(e-k)*(1.0/f)-E*B;A=(h-m)*(1.0/f)-z*B;h=(j-n)*(1.0/f)-F*B;j=1.0/+D(+(h*h+(C*C+A*A)));c[b+152>>2]=c[b+132>>2];c[b+152+4>>2]=c[b+132+4>>2];c[b+152+8>>2]=c[b+132+8>>2];c[b+152+12>>2]=c[b+132+12>>2];e=f*(j*C-E*(F*j*h+(E*j*C+z*j*A)))+ +g[b+152>>2];g[b+152>>2]=e;B=f*(j*A-z*(F*j*h+(E*j*C+z*j*A)))+ +g[b+156>>2];g[b+156>>2]=B;j=f*(j*h-F*(F*j*h+(E*j*C+z*j*A)))+ +g[b+160>>2];g[b+160>>2]=j;f=B}else f=h;h=e-k;f=f-m;e=j-n;if(!(h*h+f*f+e*e>1.1920928955078125e-07)){x=26;break}F=1.0/+D(+(h*h+f*f+e*e));if(+g[b+84>>2]*h*F+f*F*+g[b+88>>2]+e*F*+g[b+92>>2]<=0.0){x=26;break}}else{c[b+132>>2]=c[b+152>>2];c[b+132+4>>2]=c[b+152+4>>2];c[b+132+8>>2]=c[b+152+8>>2];c[b+132+12>>2]=c[b+152+12>>2]}if(!(o>.009999999776482582)){x=29;break}}if((x|0)==26){l=y;return}else if((x|0)==29){l=y;return}}function id(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=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;x=l;l=l+80|0;a[x+16>>0]=1;c[x+12>>2]=0;c[x+4>>2]=0;c[x+8>>2]=0;a[x+36>>0]=1;c[x+32>>2]=0;c[x+24>>2]=0;c[x+28>>2]=0;a[x+56>>0]=1;c[x+52>>2]=0;c[x+44>>2]=0;c[x+48>>2]=0;a[x+76>>0]=1;c[x+72>>2]=0;c[x+64>>2]=0;c[x+68>>2]=0;e=c[b+8>>2]|0;if((e|0)<=0){kj(x);l=x;return}f=0;o=0;i=0;h=0;n=0;while(1){r=c[(c[(c[b+16>>2]|0)+(f<<2)>>2]|0)+192>>2]|0;q=((r+~(r<<15)|0)>>>10^r+~(r<<15))*9|0;q=((q>>>6^q)+~((q>>>6^q)<<11)|0)>>>16^(q>>>6^q)+~((q>>>6^q)<<11);g=q&o+-1;k=g>>>0>>0;a:do if(k){i=c[h+(g<<2)>>2]|0;if((i|0)!=-1){m=c[x+72>>2]|0;while(1){if((r|0)==(c[m+(i<<3)>>2]|0)){p=9;break}j=c[n+(i<<2)>>2]|0;if((j|0)==-1)break;else i=j}if((p|0)==9?(p=0,(c[x+52>>2]|0)+(i<<2)|0):0){i=o;g=n;break}if(!k){p=16;break}}e=c[h+(g<<2)>>2]|0;if((e|0)!=-1){i=c[x+72>>2]|0;while(1){if((r|0)==(c[i+(e<<3)>>2]|0))break;e=c[n+(e<<2)>>2]|0;if((e|0)==-1){p=16;break a}}c[(c[x+52>>2]|0)+(e<<2)>>2]=r;e=o;g=n;p=74}else p=16}else p=16;while(0);if((p|0)==16){p=0;n=c[x+44>>2]|0;if((n|0)==(o|0)){e=o|0?o<<1:1;if((o|0)<(e|0)){if((e|0)!=0?(c[6995]=(c[6995]|0)+1,w=sc((e<<2|3)+16|0)|0,(w|0)!=0):0){c[(w+4+15&-16)+-4>>2]=w;i=w+4+15&-16}else i=0;if((o|0)>0){h=0;do{c[i+(h<<2)>>2]=c[(c[x+52>>2]|0)+(h<<2)>>2];h=h+1|0}while((h|0)!=(o|0))}h=c[x+52>>2]|0;if(h|0){if(a[x+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[x+52>>2]=0}a[x+56>>0]=1;c[x+52>>2]=i;c[x+48>>2]=e;h=o}else{h=o;e=o}}else{h=n;e=o}c[(c[x+52>>2]|0)+(h<<2)>>2]=r;c[x+44>>2]=h+1;h=c[x+64>>2]|0;if((h|0)==(c[x+68>>2]|0)?(s=h|0?h<<1:1,(h|0)<(s|0)):0){if((s|0)!=0?(c[6995]=(c[6995]|0)+1,t=sc((s<<3|3)+16|0)|0,(t|0)!=0):0){c[(t+4+15&-16)+-4>>2]=t;i=t+4+15&-16}else i=0;if((h|0)>0){e=0;do{j=(c[x+72>>2]|0)+(e<<3)|0;k=c[j+4>>2]|0;m=i+(e<<3)|0;c[m>>2]=c[j>>2];c[m+4>>2]=k;e=e+1|0}while((e|0)!=(h|0))}e=c[x+72>>2]|0;if(e|0){if(a[x+76>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[x+72>>2]=0}a[x+76>>0]=1;c[x+72>>2]=i;c[x+68>>2]=s;h=c[x+64>>2]|0;e=c[x+48>>2]|0}m=(c[x+72>>2]|0)+(h<<3)|0;c[m>>2]=r;c[m+4>>2]=0;c[x+64>>2]=h+1;if((o|0)<(e|0)){m=c[x+4>>2]|0;do if((m|0)<(e|0)){if((c[x+8>>2]|0)<(e|0)){if((e|0)!=0?(c[6995]=(c[6995]|0)+1,u=sc((e<<2|3)+16|0)|0,(u|0)!=0):0){c[(u+4+15&-16)+-4>>2]=u;g=u+4+15&-16}else g=0;i=c[x+12>>2]|0;if((m|0)>0){h=0;do{c[g+(h<<2)>>2]=c[i+(h<<2)>>2];h=h+1|0}while((h|0)!=(m|0));if(a[x+16>>0]|0)p=51}else if(!((i|0)==0|(a[x+16>>0]|0)==0))p=51;if((p|0)==51){p=0;c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}a[x+16>>0]=1;c[x+12>>2]=g;c[x+8>>2]=e}else g=c[x+12>>2]|0;k=e<<2;Yk(g+(m<<2)|0,0,k-(m<<2)|0)|0;c[x+4>>2]=e;j=c[x+24>>2]|0;if((j|0)<(e|0)){if((c[x+28>>2]|0)<(e|0)){if((e|0)!=0?(c[6995]=(c[6995]|0)+1,v=sc((k|3)+16|0)|0,(v|0)!=0):0){c[(v+4+15&-16)+-4>>2]=v;g=v+4+15&-16}else g=0;i=c[x+32>>2]|0;if((j|0)>0){h=0;do{c[g+(h<<2)>>2]=c[i+(h<<2)>>2];h=h+1|0}while((h|0)!=(j|0));if(a[x+36>>0]|0)p=63}else if(!((i|0)==0|(a[x+36>>0]|0)==0))p=63;if((p|0)==63){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}a[x+36>>0]=1;c[x+32>>2]=g;c[x+28>>2]=e}else g=c[x+32>>2]|0;Yk(g+(j<<2)|0,0,k-(j<<2)|0)|0}c[x+24>>2]=e;if((e|0)>0){Yk(c[x+12>>2]|0,-1,k|0)|0;Yk(c[x+32>>2]|0,-1,k|0)|0}if((m|0)<=0){e=c[x+48>>2]|0;break}h=c[x+72>>2]|0;i=c[x+12>>2]|0;j=c[x+32>>2]|0;e=c[x+48>>2]|0;g=0;do{p=c[h+(g<<3)>>2]|0;p=((p+~(p<<15)|0)>>>10^p+~(p<<15))*9|0;p=i+(((((p>>>6^p)+~((p>>>6^p)<<11)|0)>>>16^(p>>>6^p)+~((p>>>6^p)<<11))&e+-1)<<2)|0;c[j+(g<<2)>>2]=c[p>>2];c[p>>2]=g;g=g+1|0}while((g|0)!=(m|0))}while(0);g=q&e+-1}h=c[x+12>>2]|0;p=h+(g<<2)|0;g=c[x+32>>2]|0;c[g+(n<<2)>>2]=c[p>>2];c[p>>2]=n;p=74}if((p|0)==74){p=0;Ob[c[(c[r>>2]|0)+60>>2]&127](r,d);i=e;e=c[b+8>>2]|0}f=f+1|0;if((f|0)>=(e|0))break;o=i;i=c[x+4>>2]|0;n=g}if((e|0)>0)g=0;else{kj(x);l=x;return}do{f=c[(c[b+16>>2]|0)+(g<<2)>>2]|0;switch(c[f+252>>2]|0){case 64:case 1:{Ob[c[(c[f>>2]|0)+24>>2]&127](f,d);e=c[b+8>>2]|0;break}default:{}}g=g+1|0}while((g|0)<(e|0));kj(x);l=x;return}function jd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0;A=+g[b+48>>2];i=+g[d>>2];B=+g[b+64>>2];j=+g[d+4>>2];H=+g[b+80>>2];p=+g[d+8>>2];s=+g[b+52>>2];r=+g[b+68>>2];q=+g[b+84>>2];w=+g[b+56>>2];G=+g[b+72>>2];x=+g[b+88>>2];v=+g[d+16>>2];u=+g[d+20>>2];t=+g[d+24>>2];F=+g[d+32>>2];C=+g[d+36>>2];E=+g[d+40>>2];k=+g[b+96>>2];h=+g[b+100>>2];z=+g[b+104>>2];y=+g[d+48>>2]+(i*k+j*h+p*z);f=v*k+u*h+t*z+ +g[d+52>>2];z=F*k+C*h+E*z+ +g[d+56>>2];g[b+1064>>2]=A*i+B*j+H*p;g[b+1068>>2]=i*s+j*r+p*q;g[b+1072>>2]=i*w+j*G+p*x;g[b+1076>>2]=0.0;g[b+1080>>2]=A*v+B*u+H*t;g[b+1084>>2]=s*v+r*u+q*t;g[b+1088>>2]=w*v+G*u+x*t;g[b+1092>>2]=0.0;g[b+1096>>2]=A*F+B*C+H*E;g[b+1100>>2]=s*F+r*C+q*E;g[b+1104>>2]=w*F+G*C+x*E;g[b+1108>>2]=0.0;g[b+1112>>2]=y;g[b+1116>>2]=f;g[b+1120>>2]=z;g[b+1124>>2]=0.0;z=+g[b+112>>2];f=+g[e>>2];y=+g[b+128>>2];E=+g[e+4>>2];x=+g[b+144>>2];C=+g[e+8>>2];G=+g[b+116>>2];F=+g[b+132>>2];w=+g[b+148>>2];q=+g[b+120>>2];r=+g[b+136>>2];s=+g[b+152>>2];H=+g[e+16>>2];B=+g[e+20>>2];A=+g[e+24>>2];t=+g[e+32>>2];u=+g[e+36>>2];v=+g[e+40>>2];p=+g[b+160>>2];j=+g[b+164>>2];i=+g[b+168>>2];h=+g[e+48>>2]+(f*p+E*j+C*i);k=H*p+B*j+A*i+ +g[e+52>>2];i=t*p+u*j+v*i+ +g[e+56>>2];g[b+1128>>2]=z*f+y*E+x*C;g[b+1132>>2]=f*G+E*F+C*w;g[b+1136>>2]=f*q+E*r+C*s;g[b+1140>>2]=0.0;g[b+1144>>2]=z*H+y*B+x*A;g[b+1148>>2]=G*H+F*B+w*A;g[b+1152>>2]=q*H+r*B+s*A;g[b+1156>>2]=0.0;g[b+1160>>2]=z*t+y*u+x*v;g[b+1164>>2]=G*t+F*u+w*v;g[b+1168>>2]=q*t+r*u+s*v;g[b+1172>>2]=0.0;g[b+1176>>2]=h;g[b+1180>>2]=k;g[b+1184>>2]=i;g[b+1188>>2]=0.0;h=h-+g[b+1112>>2];k=k-+g[b+1116>>2];i=i-+g[b+1120>>2];w=+g[b+1084>>2];F=+g[b+1104>>2];G=+g[b+1088>>2];x=+g[b+1100>>2];y=+g[b+1096>>2];z=+g[b+1080>>2];A=+g[b+1064>>2];B=+g[b+1068>>2];H=+g[b+1072>>2];C=1.0/((w*F-G*x)*A+B*(G*y-F*z)+(x*z-w*y)*H);E=(x*z-w*y)*C;f=i*(G*B-w*H)*C+(h*(w*F-G*x)*C+k*(x*H-F*B)*C);j=i*(z*H-G*A)*C+(h*(G*y-F*z)*C+k*(F*A-y*H)*C);k=i*(w*A-z*B)*C+(h*E+k*(y*B-x*A)*C);g[b+1256>>2]=f;g[b+1260>>2]=j;g[b+1264>>2]=k;g[b+1268>>2]=0.0;g[b+840>>2]=f;h=+g[b+680>>2];i=+g[b+696>>2];do if(!(h>i)){if(h>f){c[b+856>>2]=2;f=f-h;break}if(i>2]=1;f=f-i;break}else{c[b+856>>2]=0;f=0.0;break}}else{c[b+856>>2]=0;f=0.0}while(0);g[b+824>>2]=f;g[b+844>>2]=j;f=+g[b+684>>2];h=+g[b+700>>2];do if(!(f>h)){if(f>j){c[b+860>>2]=2;f=j-f;break}if(h>2]=1;f=j-h;break}else{c[b+860>>2]=0;f=0.0;break}}else{c[b+860>>2]=0;f=0.0}while(0);g[b+828>>2]=f;g[b+848>>2]=k;f=+g[b+688>>2];h=+g[b+704>>2];do if(!(f>h)){if(f>k){c[b+864>>2]=2;f=k-f;break}if(h>2]=1;f=k-h;break}else{c[b+864>>2]=0;f=0.0;break}}else{c[b+864>>2]=0;f=0.0}while(0);g[b+832>>2]=f;n=+g[b+1128>>2];o=+g[b+1144>>2];p=+g[b+1160>>2];h=+g[b+1132>>2];i=+g[b+1148>>2];j=+g[b+1164>>2];k=(w*F-G*x)*C*h+(x*H-F*B)*C*i+(G*B-w*H)*C*j;l=h*(G*y-F*z)*C+(F*A-y*H)*C*i+(z*H-G*A)*C*j;m=p*(w*A-z*B)*C+(n*E+o*(y*B-x*A)*C);f=E*+g[b+1136>>2]+(y*B-x*A)*C*+g[b+1152>>2]+(w*A-z*B)*C*(q*t+r*u+s*v);do if(m<1.0)if(m>-1.0){g[b+1192>>2]=+L(+-(h*E+(y*B-x*A)*C*i+(w*A-z*B)*C*j),+f);f=m<-1.0?-1.0:m;g[b+1196>>2]=+J(+(f>1.0?1.0:f));f=+L(+-(p*(z*H-G*A)*C+(n*(G*y-F*z)*C+o*(F*A-y*H)*C)),+(p*(G*B-w*H)*C+(n*(w*F-G*x)*C+o*(x*H-F*B)*C)));break}else{g[b+1192>>2]=-+L(+k,+l);g[b+1196>>2]=-1.5707963705062866;f=0.0;break}else{g[b+1192>>2]=+L(+k,+l);g[b+1196>>2]=1.5707963705062866;f=0.0}while(0);g[b+1200>>2]=f;g[b+1236>>2]=0.0;x=F*(n*F-p*H)-G*(o*H-n*G);y=H*(o*H-n*G)-F*(p*G-o*F);z=G*(p*G-o*F)-H*(n*F-p*H);g[b+1220>>2]=0.0;B=o*(o*H-n*G)-p*(n*F-p*H);C=p*(p*G-o*F)-n*(o*H-n*G);E=n*(n*F-p*H)-o*(p*G-o*F);g[b+1252>>2]=0.0;A=1.0/+D(+(x*x+y*y+z*z));g[b+1208>>2]=x*A;g[b+1212>>2]=y*A;g[b+1216>>2]=z*A;A=1.0/+D(+((p*G-o*F)*(p*G-o*F)+(n*F-p*H)*(n*F-p*H)+(o*H-n*G)*(o*H-n*G)));g[b+1224>>2]=(p*G-o*F)*A;g[b+1228>>2]=(n*F-p*H)*A;g[b+1232>>2]=(o*H-n*G)*A;H=1.0/+D(+(B*B+C*C+E*E));g[b+1240>>2]=B*H;g[b+1244>>2]=C*H;g[b+1248>>2]=E*H;if(!(a[b+1301>>0]|0))return;G=+g[(c[b+28>>2]|0)+404>>2];H=+g[(c[b+32>>2]|0)+404>>2];a[b+1280>>0]=(G<1.1920928955078125e-07|H<1.1920928955078125e-07)&1;H=G+H>0.0?H/(G+H):.5;g[b+1272>>2]=H;g[b+1276>>2]=1.0-H;return}function kd(b,d){b=b|0;d=+d;var e=0,f=0,h=0.0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0;E=l;l=l+480|0;e=c[b+332>>2]|0;if((c[b+324>>2]|0)>0){f=0;do{v=c[b+24>>2]|0;Ob[c[(c[v>>2]|0)+16>>2]&127](v,c[e+(f<<2)>>2]|0);f=f+1|0;e=c[b+332>>2]|0}while((f|0)<(c[b+324>>2]|0))}if(e|0){if(a[b+336>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+332>>2]=0}a[b+336>>0]=1;c[b+332>>2]=0;c[b+324>>2]=0;c[b+328>>2]=0;q=c[b+248>>2]|0;if((q|0)<=0){l=E;return}r=c[b+256>>2]|0;s=E+416+48|0;t=E+256+28|0;u=E+312+48|0;o=0;do{v=c[r+(o<<2)>>2]|0;g[v+268>>2]=1.0;switch(c[v+220>>2]|0){case 2:case 5:break;default:if(((((c[v+204>>2]&3|0)==0?(Af(v+4|0,+g[v+372>>2],+g[v+376>>2],+g[v+380>>2],v+388|0,d,E+416|0),y=+g[s>>2],z=y-+g[v+52>>2],A=+g[E+416+52>>2],B=A-+g[v+56>>2],C=+g[E+416+56>>2],D=C-+g[v+60>>2],a[b+44>>0]|0):0)?(n=+g[v+276>>2],n*n!=0.0?n*n>2]|0)+4>>2]|0)<20:0)?(c[5787]=(c[5787]|0)+1,i=c[b+68>>2]|0,i=xb[c[(c[i>>2]|0)+36>>2]&127](i)|0,p=c[b+24>>2]|0,g[E+312+4>>2]=1.0,c[E+312+16>>2]=c[v+52>>2],c[E+312+16+4>>2]=c[v+52+4>>2],c[E+312+16+8>>2]=c[v+52+8>>2],c[E+312+16+12>>2]=c[v+52+12>>2],c[E+312+32>>2]=c[s>>2],c[E+312+32+4>>2]=c[s+4>>2],c[E+312+32+8>>2]=c[s+8>>2],c[E+312+32+12>>2]=c[s+12>>2],c[E+312+80>>2]=0,c[E+312>>2]=4556,c[E+312+84>>2]=v,c[E+312+92>>2]=i,c[E+312+96>>2]=p,p=c[v+272>>2]|0,c[E+256+8>>2]=0,c[E+256+12>>2]=-1,c[E+256>>2]=7020,c[E+256+4>>2]=8,c[E+256+16>>2]=1065353216,c[E+256+20>>2]=1065353216,c[E+256+24>>2]=1065353216,c[t>>2]=0,c[t+4>>2]=0,c[t+8>>2]=0,c[t+12>>2]=0,c[t+16>>2]=0,c[E+256+32>>2]=p,c[E+256+48>>2]=p,g[E+256+52>>2]=0.0,c[E+312+88>>2]=c[b+56>>2],p=c[v+188>>2]|0,c[E+312+8>>2]=c[p+4>>2],c[E+312+12>>2]=c[p+8>>2],c[E+192+48>>2]=c[s>>2],c[E+192+48+4>>2]=c[s+4>>2],c[E+192+48+8>>2]=c[s+8>>2],c[E+192+48+12>>2]=c[s+12>>2],c[E+192>>2]=c[v+4>>2],c[E+192+4>>2]=c[v+4+4>>2],c[E+192+8>>2]=c[v+4+8>>2],c[E+192+12>>2]=c[v+4+12>>2],c[E+192+16>>2]=c[v+20>>2],c[E+192+16+4>>2]=c[v+20+4>>2],c[E+192+16+8>>2]=c[v+20+8>>2],c[E+192+16+12>>2]=c[v+20+12>>2],c[E+192+32>>2]=c[v+36>>2],c[E+192+32+4>>2]=c[v+36+4>>2],c[E+192+32+8>>2]=c[v+36+8>>2],c[E+192+32+12>>2]=c[v+36+12>>2],Ud(b,E+256|0,v+4|0,E+192|0,E+312|0,0.0),w=+g[E+312+4>>2],w<1.0):0){h=w*(y-+g[v+52>>2]);j=w*(A-+g[v+56>>2]);m=w*(C-+g[v+60>>2]);n=-(j*+g[E+312+52>>2])-h*+g[u>>2]-m*+g[E+312+56>>2];p=c[b+24>>2]|0;p=Bb[c[(c[p>>2]|0)+12>>2]&63](p,v,c[E+312+80>>2]|0)|0;f=c[b+324>>2]|0;if((f|0)==(c[b+328>>2]|0)?(x=f|0?f<<1:1,(f|0)<(x|0)):0){if(!x)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((x<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[b+324>>2]|0}if((f|0)>0){i=0;do{c[e+(i<<2)>>2]=c[(c[b+332>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(f|0))}i=c[b+332>>2]|0;if(i){if(a[b+336>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);f=c[b+324>>2]|0}c[b+332>>2]=0}a[b+336>>0]=1;c[b+332>>2]=e;c[b+328>>2]=x;e=f}else e=f;c[(c[b+332>>2]|0)+(e<<2)>>2]=p;c[b+324>>2]=e+1;k=h+ +g[v+52>>2];j=j+ +g[v+56>>2];h=m+ +g[v+60>>2];e=c[E+312+80>>2]|0;P=+g[e+4>>2];O=+g[e+20>>2];N=+g[e+36>>2];M=+g[e+8>>2];L=+g[e+24>>2];K=+g[e+40>>2];J=+g[e+12>>2];H=+g[e+28>>2];F=+g[e+44>>2];I=-+g[e+52>>2];G=-+g[e+56>>2];m=-+g[e+60>>2];c[E>>2]=0;c[E+4>>2]=0;c[E+8>>2]=0;c[E+12>>2]=0;g[E+16>>2]=k*P+j*O+h*N+(P*I+O*G+N*m);g[E+20>>2]=k*M+j*L+h*K+(M*I+L*G+K*m);g[E+24>>2]=k*J+j*H+h*F+(J*I+H*G+F*m);g[E+28>>2]=0.0;c[E+64>>2]=c[u>>2];c[E+64+4>>2]=c[u+4>>2];c[E+64+8>>2]=c[u+8>>2];c[E+64+12>>2]=c[u+12>>2];g[E+80>>2]=n;c[E+84>>2]=0;c[E+84+4>>2]=0;c[E+84+8>>2]=0;c[E+84+12>>2]=0;e=E+116|0;f=e+44|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));i=kf(p,E)|0;g[p+4+(i*192|0)+96>>2]=0.0;P=+g[v+228>>2]*+g[(c[E+312+80>>2]|0)+228>>2];P=P<-10.0?-10.0:P;g[p+4+(i*192|0)+84>>2]=P>10.0?10.0:P;c[p+4+(i*192|0)+48>>2]=c[v+52>>2];c[p+4+(i*192|0)+48+4>>2]=c[v+52+4>>2];c[p+4+(i*192|0)+48+8>>2]=c[v+52+8>>2];c[p+4+(i*192|0)+48+12>>2]=c[v+52+12>>2];g[p+4+(i*192|0)+32>>2]=k;g[p+4+(i*192|0)+36>>2]=j;g[p+4+(i*192|0)+40>>2]=h;g[p+4+(i*192|0)+44>>2]=0.0}}o=o+1|0}while((o|0)<(q|0));l=E;return}function ld(a,d,f,h,i,j,k,l){a=a|0;d=d|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0.0,q=0,r=0,s=0.0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0.0,B=0.0,C=0,D=0,E=0,F=0,G=0;v=+g[a+8>>2];x=+g[a+12>>2];A=+g[a+16>>2];w=+g[a+40>>2];p=(+g[d>>2]-v)*w;y=+g[a+44>>2];s=(+g[d+4>>2]-x)*y;B=+g[a+48>>2];u=(+g[d+8>>2]-A)*B;if(!(p<=0.0)){t=b[a+6>>1]|0;t=(!(p>=+(t&65535))?~~p&65535:t)&b[a+4>>1]}else t=0;if(!(s<=0.0)){r=b[a+6>>1]|0;r=(!(s>=+(r&65535))?~~s&65535:r)&b[a+4>>1]}else r=0;if(!(u<=0.0)){q=b[a+6>>1]|0;q=(!(u>=+(q&65535))?~~u&65535:q)&b[a+4>>1]}else q=0;u=(+g[f>>2]-v)*w;s=(+g[f+4>>2]-x)*y;p=(+g[f+8>>2]-A)*B;if(!(u<=0.0)){o=b[a+6>>1]|0;o=(!(u>=+(o&65535))?~~u&65535:o)&b[a+4>>1]|1}else o=1;if(!(s<=0.0)){n=b[a+6>>1]|0;n=(!(s>=+(n&65535))?~~s&65535:n)&b[a+4>>1]|1}else n=1;if(!(p<=0.0)){m=b[a+6>>1]|0;m=(!(p>=+(m&65535))?~~p&65535:m)&b[a+4>>1]|1}else m=1;D=b[a+64>>1]|0;C=c[a+60>>2]|0;b[a+64>>1]=b[C+((D&65535)<<6)+48>>1]|0;z=(b[a+56>>1]|0)+1<<16>>16;b[a+56>>1]=z;c[C+((D&65535)<<6)+12>>2]=D&65535;c[C+((D&65535)<<6)>>2]=i;c[C+((D&65535)<<6)+4>>2]=j;c[C+((D&65535)<<6)+8>>2]=k;E=(z&65535)<<1&65534;b[C+54>>1]=(e[C+54>>1]|0)+2;F=c[a+68>>2]|0;G=e[F+(E+-1<<2)>>1]|e[F+(E+-1<<2)+2>>1]<<16;b[F+((E|1)<<2)>>1]=G;b[F+((E|1)<<2)+2>>1]=G>>>16;F=c[a+68>>2]|0;b[F+(E+-1<<2)>>1]=t;b[F+(E+-1<<2)+2>>1]=D;b[F+(E<<2)>>1]=o;b[F+(E<<2)+2>>1]=D;b[C+((D&65535)<<6)+48>>1]=E+-1;b[C+((D&65535)<<6)+54>>1]=(z&65535)<<1;o=(c[a+60>>2]|0)+56|0;b[o>>1]=(e[o>>1]|0)+2;o=c[a+72>>2]|0;t=e[o+(E+-1<<2)>>1]|e[o+(E+-1<<2)+2>>1]<<16;b[o+((E|1)<<2)>>1]=t;b[o+((E|1)<<2)+2>>1]=t>>>16;o=c[a+72>>2]|0;b[o+(E+-1<<2)>>1]=r;b[o+(E+-1<<2)+2>>1]=D;b[o+(E<<2)>>1]=n;b[o+(E<<2)+2>>1]=D;b[C+((D&65535)<<6)+50>>1]=E+-1;b[C+((D&65535)<<6)+56>>1]=(z&65535)<<1;n=(c[a+60>>2]|0)+58|0;b[n>>1]=(e[n>>1]|0)+2;n=c[a+76>>2]|0;o=e[n+(E+-1<<2)>>1]|e[n+(E+-1<<2)+2>>1]<<16;b[n+((E|1)<<2)>>1]=o;b[n+((E|1)<<2)+2>>1]=o>>>16;n=c[a+76>>2]|0;b[n+(E+-1<<2)>>1]=q;b[n+(E+-1<<2)+2>>1]=D;b[n+(E<<2)>>1]=m;b[n+(E<<2)+2>>1]=D;b[C+((D&65535)<<6)+52>>1]=E+-1;b[C+((D&65535)<<6)+58>>1]=(z&65535)<<1;n=c[a+68>>2]|0;o=e[C+((D&65535)<<6)+48>>1]|0;t=c[a+60>>2]|0;q=b[n+(o<<2)+-4>>1]|0;if((e[n+(o<<2)>>1]|0)<(q&65535)){z=t+((e[n+(o<<2)+2>>1]|0)<<6)+48|0;m=n+(o<<2)+-4|0;r=n+(o<<2)|0;o=q;n=t;while(1){G=e[r+-2>>1]|0;n=(o&1)==0?n+(G<<6)+48|0:n+(G<<6)+54|0;b[n>>1]=(b[n>>1]|0)+1<<16>>16;b[z>>1]=(b[z>>1]|0)+-1<<16>>16;n=e[r>>1]|e[r+2>>1]<<16;o=e[m>>1]|e[m+2>>1]<<16;b[r>>1]=o;b[r+2>>1]=o>>>16;b[m>>1]=n;b[m+2>>1]=n>>>16;n=r+-4|0;m=m+-4|0;o=b[m>>1]|0;if((e[n>>1]|0)>=(o&65535))break;r=n;n=c[a+60>>2]|0}n=c[a+68>>2]|0}m=e[C+((D&65535)<<6)+54>>1]|0;o=n+(m<<2)|0;r=b[o+-4>>1]|0;a:do if((e[o>>1]|0)<(r&65535)){G=c[a+60>>2]|0;t=G+((e[n+(m<<2)+2>>1]|0)<<6)+54|0;m=o+-4|0;q=o;n=r;o=G;while(1){G=e[q+-2>>1]|0;o=(n&1)==0?o+(G<<6)+48|0:o+(G<<6)+54|0;b[o>>1]=(b[o>>1]|0)+1<<16>>16;b[t>>1]=(b[t>>1]|0)+-1<<16>>16;o=e[q>>1]|e[q+2>>1]<<16;n=e[m>>1]|e[m+2>>1]<<16;b[q>>1]=n;b[q+2>>1]=n>>>16;b[m>>1]=o;b[m+2>>1]=o>>>16;o=q+-4|0;m=m+-4|0;n=b[m>>1]|0;if((e[o>>1]|0)>=(n&65535))break a;q=o;o=c[a+60>>2]|0}}while(0);n=c[a+72>>2]|0;o=e[C+((D&65535)<<6)+50>>1]|0;t=c[a+60>>2]|0;q=b[n+(o<<2)+-4>>1]|0;if((e[n+(o<<2)>>1]|0)<(q&65535)){z=t+((e[n+(o<<2)+2>>1]|0)<<6)+50|0;m=n+(o<<2)+-4|0;r=n+(o<<2)|0;o=q;n=t;while(1){G=e[r+-2>>1]|0;n=(o&1)==0?n+(G<<6)+50|0:n+(G<<6)+56|0;b[n>>1]=(b[n>>1]|0)+1<<16>>16;b[z>>1]=(b[z>>1]|0)+-1<<16>>16;n=e[r>>1]|e[r+2>>1]<<16;o=e[m>>1]|e[m+2>>1]<<16;b[r>>1]=o;b[r+2>>1]=o>>>16;b[m>>1]=n;b[m+2>>1]=n>>>16;n=r+-4|0;m=m+-4|0;o=b[m>>1]|0;if((e[n>>1]|0)>=(o&65535))break;r=n;n=c[a+60>>2]|0}n=c[a+72>>2]|0}m=e[C+((D&65535)<<6)+56>>1]|0;o=n+(m<<2)|0;r=b[o+-4>>1]|0;b:do if((e[o>>1]|0)<(r&65535)){G=c[a+60>>2]|0;t=G+((e[n+(m<<2)+2>>1]|0)<<6)+56|0;m=o+-4|0;q=o;n=r;o=G;while(1){G=e[q+-2>>1]|0;o=(n&1)==0?o+(G<<6)+50|0:o+(G<<6)+56|0;b[o>>1]=(b[o>>1]|0)+1<<16>>16;b[t>>1]=(b[t>>1]|0)+-1<<16>>16;o=e[q>>1]|e[q+2>>1]<<16;n=e[m>>1]|e[m+2>>1]<<16;b[q>>1]=n;b[q+2>>1]=n>>>16;b[m>>1]=o;b[m+2>>1]=o>>>16;o=q+-4|0;m=m+-4|0;n=b[m>>1]|0;if((e[o>>1]|0)>=(n&65535))break b;q=o;o=c[a+60>>2]|0}}while(0);xh(a,2,b[C+((D&65535)<<6)+52>>1]|0);sh(a,2,b[C+((D&65535)<<6)+58>>1]|0,l);n=c[a+60>>2]|0;m=c[a+108>>2]|0;if(!m){G=n+((D&65535)<<6)|0;return G|0}c[n+((D&65535)<<6)+60>>2]=Fb[c[(c[m>>2]|0)+8>>2]&3](m,d,f,h,i,j,k,l)|0;G=n+((D&65535)<<6)|0;return G|0}function md(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;q=l;l=l+32|0;ng(b+4|0,((P(c[b+112>>2]|0,c[b+16>>2]|0)|0)/100|0)+1|0);if(c[b+124>>2]|0){o=((P(c[b+108>>2]|0,c[b+56>>2]|0)|0)/100|0)+1|0;ng(b+44|0,o);o=(c[b+124>>2]|0)-o|0;c[b+124>>2]=(o|0)>0?o:0}f=((c[b+104>>2]|0)+1|0)%2|0;c[b+104>>2]=f;f=c[b+84+(f<<2)>>2]|0;if(f|0){do{h=f+56|0;k=f;f=c[h>>2]|0;i=c[k+52>>2]|0;c[((i|0)==0?b+84+(c[k+60>>2]<<2)|0:i+56|0)>>2]=f;i=c[h>>2]|0;if(i|0)c[i+52>>2]=c[k+52>>2];c[k+52>>2]=0;c[h>>2]=c[b+92>>2];h=c[b+92>>2]|0;if(h|0)c[h+52>>2]=k;c[b+92>>2]=k;h=c[k+48>>2]|0;Ag(b+4|0,h)|0;i=c[b+8>>2]|0;if(i|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[b+8>>2]=h;c[b+16>>2]=(c[b+16>>2]|0)+-1;c[q>>2]=c[k+16>>2];c[q+4>>2]=c[k+16+4>>2];c[q+8>>2]=c[k+16+8>>2];c[q+12>>2]=c[k+16+12>>2];c[q+16>>2]=c[k+32>>2];c[q+16+4>>2]=c[k+32+4>>2];c[q+16+8>>2]=c[k+32+8>>2];c[q+16+12>>2]=c[k+32+12>>2];h=c[b+48>>2]|0;if(!h){c[6995]=(c[6995]|0)+1;h=sc(63)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}i=h;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0))}else c[b+48>>2]=0;c[h+32>>2]=0;c[h+36>>2]=k;c[h+40>>2]=0;c[h>>2]=c[q>>2];c[h+4>>2]=c[q+4>>2];c[h+8>>2]=c[q+8>>2];c[h+12>>2]=c[q+12>>2];c[h+16>>2]=c[q+16>>2];c[h+20>>2]=c[q+20>>2];c[h+24>>2]=c[q+24>>2];c[h+28>>2]=c[q+28>>2];Pe(b+44|0,c[b+44>>2]|0,h);i=(c[b+56>>2]|0)+1|0;c[b+56>>2]=i;c[k+48>>2]=h;c[k+60>>2]=2}while((f|0)!=0);c[b+124>>2]=i;a[b+154>>0]=1}c[q>>2]=9248;c[q+4>>2]=b;if(a[b+153>>0]|0?(ne(b+4|0,c[b+4>>2]|0,c[b+44>>2]|0,q),a[b+153>>0]|0):0){o=c[b+4>>2]|0;ne(b+4|0,o,o,q)}if(a[b+154>>0]|0?(m=c[b+96>>2]|0,m=xb[c[(c[m>>2]|0)+28>>2]&127](m)|0,e=c[m+4>>2]|0,(e|0)>0):0){f=(P(c[b+116>>2]|0,e)|0)/100|0;o=c[b+120>>2]|0;f=(o|0)>(f|0)?o:f;f=(e|0)<(f|0)?e:f;if((f|0)>0){h=0;do{j=((c[b+144>>2]|0)+h|0)%(e|0)|0;n=c[m+12>>2]|0;i=c[n+(j<<4)>>2]|0;j=c[n+(j<<4)+4>>2]|0;n=c[i+48>>2]|0;o=c[j+48>>2]|0;if(!(((((+g[n>>2]<=+g[o+16>>2]?+g[n+16>>2]>=+g[o>>2]:0)?+g[n+4>>2]<=+g[o+20>>2]:0)?+g[n+20>>2]>=+g[o+4>>2]:0)?+g[n+8>>2]<=+g[o+24>>2]:0)?+g[n+24>>2]>=+g[o+8>>2]:0)){e=c[b+96>>2]|0;Cb[c[(c[e>>2]|0)+12>>2]&31](e,i,j,d)|0;f=f+-1|0;h=h+-1|0;e=c[m+4>>2]|0}h=h+1|0}while((h|0)<(f|0));if((e|0)>0)p=34;else e=0}else p=34;if((p|0)==34)e=((c[b+144>>2]|0)+f|0)%(e|0)|0;c[b+144>>2]=e}c[b+140>>2]=(c[b+140>>2]|0)+1;c[b+120>>2]=1;a[b+154>>0]=0;o=c[b+128>>2]|0;n=c[b+132>>2]|0;g[b+136>>2]=(o|0)==0?0.0:+(n>>>0)/+(o>>>0);c[b+132>>2]=n>>>1;c[b+128>>2]=o>>>1;o=c[b+96>>2]|0;if(!(xb[c[(c[o>>2]|0)+56>>2]&127](o)|0)){l=q;return}o=c[b+96>>2]|0;o=xb[c[(c[o>>2]|0)+28>>2]&127](o)|0;e=c[o+4>>2]|0;if((e|0)>1){te(o,0,e+-1|0);e=c[o+4>>2]|0}if((e|0)>0){m=0;k=0;n=0;f=0;while(1){i=c[o+12>>2]|0;h=i+(m<<4)|0;r=n;n=c[h>>2]|0;i=i+(m<<4)+4|0;j=c[i>>2]|0;if(!((n|0)==(r|0)&(j|0)==(f|0))){f=c[n+48>>2]|0;r=c[j+48>>2]|0;if(((((+g[f>>2]<=+g[r+16>>2]?+g[f+16>>2]>=+g[r>>2]:0)?+g[f+4>>2]<=+g[r+20>>2]:0)?+g[f+20>>2]>=+g[r+4>>2]:0)?+g[f+8>>2]<=+g[r+24>>2]:0)?+g[f+24>>2]>=+g[r+8>>2]:0){h=k;f=j}else{f=j;p=48}}else p=48;if((p|0)==48){p=0;e=c[b+96>>2]|0;Sb[c[(c[e>>2]|0)+32>>2]&127](e,h,d);c[h>>2]=0;c[i>>2]=0;h=k+1|0;e=c[o+4>>2]|0}m=m+1|0;if((m|0)>=(e|0))break;else k=h}if((e|0)>1){te(o,0,e+-1|0);e=c[o+4>>2]|0}j=e-h|0;if((h|0)<0){if((c[o+8>>2]|0)<(j|0)){if(!j){f=0;i=e}else{c[6995]=(c[6995]|0)+1;f=sc((j<<4|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=c[o+4>>2]|0}if((i|0)>0){h=0;do{r=c[o+12>>2]|0;c[f+(h<<4)>>2]=c[r+(h<<4)>>2];c[f+(h<<4)+4>>2]=c[r+(h<<4)+4>>2];c[f+(h<<4)+8>>2]=c[r+(h<<4)+8>>2];c[f+(h<<4)+12>>2]=c[r+(h<<4)+12>>2];h=h+1|0}while((h|0)!=(i|0))}h=c[o+12>>2]|0;if(h|0){if(a[o+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[o+12>>2]=0}a[o+16>>0]=1;c[o+12>>2]=f;c[o+8>>2]=j}do{r=(c[o+12>>2]|0)+(e<<4)|0;e=e+1|0;c[r>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0}while((e|0)!=(j|0));e=j}else e=j}c[o+4>>2]=e;l=q;return}function nd(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,h=0,i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0;r=c[b+28>>2]|0;k=c[b+32>>2]|0;xc(b,r+4|0,k+4|0,r+324|0,k+324|0);j=c[d+8>>2]|0;g[j>>2]=1.0;l=c[d+24>>2]|0;g[j+(l+1<<2)>>2]=1.0;g[j+((l<<1)+2<<2)>>2]=1.0;n=+g[b+348>>2];v=+g[b+352>>2];p=+g[b+356>>2];t=+g[r+4>>2]*n+ +g[r+8>>2]*v+ +g[r+12>>2]*p;o=n*+g[r+20>>2]+v*+g[r+24>>2]+p*+g[r+28>>2];p=n*+g[r+36>>2]+v*+g[r+40>>2]+p*+g[r+44>>2];j=c[d+12>>2]|0;c[j>>2]=0;g[j+4>>2]=p;g[j+8>>2]=-o;g[j+12>>2]=0.0;g[j+(l<<2)>>2]=-p;c[j+(l<<2)+4>>2]=0;g[j+(l<<2)+8>>2]=t;g[j+(l<<2)+12>>2]=0.0;g[j+(l<<1<<2)>>2]=o;g[j+(l<<1<<2)+4>>2]=-t;c[j+(l<<1<<2)+8>>2]=0;g[j+(l<<1<<2)+12>>2]=0.0;j=c[d+16>>2]|0;g[j>>2]=-1.0;g[j+(l+1<<2)>>2]=-1.0;g[j+((l<<1)+2<<2)>>2]=-1.0;v=+g[b+412>>2];n=+g[b+416>>2];m=+g[b+420>>2];u=+g[k+4>>2]*v+ +g[k+8>>2]*n+ +g[k+12>>2]*m;f=v*+g[k+20>>2]+n*+g[k+24>>2]+m*+g[k+28>>2];m=v*+g[k+36>>2]+n*+g[k+40>>2]+m*+g[k+44>>2];l=c[d+20>>2]|0;j=c[d+24>>2]|0;c[l>>2]=0;g[l+4>>2]=-m;g[l+8>>2]=f;g[l+12>>2]=0.0;g[l+(j<<2)>>2]=m;c[l+(j<<2)+4>>2]=0;g[l+(j<<2)+8>>2]=-u;g[l+(j<<2)+12>>2]=0.0;g[l+(j<<1<<2)>>2]=-f;g[l+(j<<1<<2)+4>>2]=u;c[l+(j<<1<<2)+8>>2]=0;g[l+(j<<1<<2)+12>>2]=0.0;q=c[b+592>>2]|0;n=+g[(q&2|0?b+600|0:d+4|0)>>2]*+g[d>>2];i=c[d+28>>2]|0;s=c[d+36>>2]|0;h=c[d+40>>2]|0;g[i>>2]=n*(u+ +g[k+52>>2]-t-+g[r+52>>2]);g[s>>2]=-3402823466385288598117041.0e14;g[h>>2]=3402823466385288598117041.0e14;if(!(q&1)){g[i+(j<<2)>>2]=n*(f+ +g[k+56>>2]-o-+g[r+56>>2]);g[s+(j<<2)>>2]=-3402823466385288598117041.0e14;g[h+(j<<2)>>2]=3402823466385288598117041.0e14;g[i+(j<<1<<2)>>2]=n*(m+ +g[k+60>>2]-p-+g[r+60>>2]);g[s+(j<<1<<2)>>2]=-3402823466385288598117041.0e14;g[h+(j<<1<<2)>>2]=3402823466385288598117041.0e14}else{w=c[d+32>>2]|0;c[w>>2]=c[b+596>>2];g[i+(j<<2)>>2]=n*(f+ +g[k+56>>2]-o-+g[r+56>>2]);g[s+(j<<2)>>2]=-3402823466385288598117041.0e14;g[h+(j<<2)>>2]=3402823466385288598117041.0e14;c[w+(j<<2)>>2]=c[b+596>>2];g[i+(j<<1<<2)>>2]=n*(m+ +g[k+60>>2]-p-+g[r+60>>2]);g[s+(j<<1<<2)>>2]=-3402823466385288598117041.0e14;g[h+(j<<1<<2)>>2]=3402823466385288598117041.0e14;c[w+(j<<1<<2)>>2]=c[b+596>>2]}if(!(a[b+526>>0]|0)){l=j*3|0;j=s}else{k=c[d+12>>2]|0;v=+g[b+456>>2];if(+g[b+444>>2]>2]>2];y=+g[r+8>>2];x=+g[r+12>>2];D=+g[b+304>>2];C=+g[b+320>>2];B=+g[b+336>>2];o=+g[b+308>>2];t=+g[b+324>>2];v=+g[b+340>>2];f=+g[r+20>>2];m=+g[r+24>>2];n=+g[r+28>>2];p=+g[r+36>>2];u=+g[r+40>>2];e=+g[r+44>>2];g[k+(j*3<<2)>>2]=z*D+y*C+x*B;g[k+((j*3|0)+1<<2)>>2]=D*f+C*m+B*n;g[k+((j*3|0)+2<<2)>>2]=D*p+C*u+B*e;g[k+(j<<2<<2)>>2]=z*o+y*t+x*v;g[k+((j<<2|1)<<2)>>2]=o*f+t*m+v*n;g[k+((j<<2|2)<<2)>>2]=o*p+t*u+v*e;g[l+(j*3<<2)>>2]=-(z*D+y*C+x*B);g[l+((j*3|0)+1<<2)>>2]=-(D*f+C*m+B*n);g[l+((j*3|0)+2<<2)>>2]=-(D*p+C*u+B*e);g[l+(j<<2<<2)>>2]=-(z*o+y*t+x*v);g[l+((j<<2|1)<<2)>>2]=-(o*f+t*m+v*n);g[l+((j<<2|2)<<2)>>2]=-(o*p+t*u+v*e);A=+g[d>>2]*+g[b+436>>2];i=c[d+28>>2]|0;g[i+(j*3<<2)>>2]=A*((z*D+y*C+x*B)*+g[b+460>>2]+(D*f+C*m+B*n)*+g[b+464>>2]+(D*p+C*u+B*e)*+g[b+468>>2]);g[i+(j<<2<<2)>>2]=A*((z*o+y*t+x*v)*+g[b+460>>2]+(o*f+t*m+v*n)*+g[b+464>>2]+(o*p+t*u+v*e)*+g[b+468>>2]);k=c[d+36>>2]|0;g[k+(j*3<<2)>>2]=-3402823466385288598117041.0e14;h=c[d+40>>2]|0;g[h+(j*3<<2)>>2]=3402823466385288598117041.0e14;g[k+(j<<2<<2)>>2]=-3402823466385288598117041.0e14;e=3402823466385288598117041.0e14;l=j<<2;j=c[d+24>>2]|0}else{D=+g[b+436>>2];B=D*+g[b+460>>2]*D;C=D*D*+g[b+464>>2];D=D*D*+g[b+468>>2];g[k+(j*3<<2)>>2]=B;g[k+((j*3|0)+1<<2)>>2]=C;g[k+((j*3|0)+2<<2)>>2]=D;g[l+(j*3<<2)>>2]=-B;g[l+((j*3|0)+1<<2)>>2]=-C;g[l+((j*3|0)+2<<2)>>2]=-D;g[i+(j*3<<2)>>2]=+g[d>>2]*+g[b+432>>2]*+g[b+504>>2];if(q&4|0)c[(c[d+32>>2]|0)+(j*3<<2)>>2]=c[b+604>>2];g[s+(j*3<<2)>>2]=0.0;if((a[b+552>>0]|0)!=0?(e=+g[b+572>>2],e>=0.0):0){l=j*3|0;k=s}else{e=3402823466385288598117041.0e14;l=j*3|0;k=s}}g[h+(l<<2)>>2]=e;l=j+l|0;j=k}if(!(a[b+525>>0]|0))return;D=+g[b+436>>2];B=D*+g[b+476>>2]*D;C=D*D*+g[b+480>>2];D=D*D*+g[b+484>>2];q=c[d+12>>2]|0;s=c[d+20>>2]|0;g[q+(l<<2)>>2]=B;r=l+1|0;g[q+(r<<2)>>2]=C;w=l+2|0;g[q+(w<<2)>>2]=D;g[s+(l<<2)>>2]=-B;g[s+(r<<2)>>2]=-C;g[s+(w<<2)>>2]=-D;g[i+(l<<2)>>2]=+g[d>>2]*+g[b+432>>2]*+g[b+508>>2];if(c[b+592>>2]&4|0)c[(c[d+32>>2]|0)+(l<<2)>>2]=c[b+604>>2];if(+g[b+452>>2]>0.0){w=+g[b+508>>2]>0.0;e=w?0.0:-3402823466385288598117041.0e14;f=w?3402823466385288598117041.0e14:0.0}else{e=-3402823466385288598117041.0e14;f=3402823466385288598117041.0e14}g[j+(l<<2)>>2]=e;g[h+(l<<2)>>2]=f;return}function od(b,d,e,f,h,i,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0;if((j|0)<2|(k|0)<2){m=0;return m|0}r=P(k,j)|0;c[6995]=(c[6995]|0)+1;b=sc(r>>>0>268435455?18:(r<<4|3)+16|0)|0;if(!b)p=0;else{c[(b+4+15&-16)+-4>>2]=b;p=b+4+15&-16}q=$I(r>>>0>1073741823?-1:r<<2)|0;if((k|0)>0?(j|0)>0:0){b=0;do{A=+(b|0)/+(k+-1|0);u=+g[e>>2];u=u+A*(+g[h>>2]-u);v=+g[e+4>>2];v=v+A*(+g[h+4>>2]-v);w=+g[e+8>>2];w=w+A*(+g[h+8>>2]-w);x=+g[f>>2];y=+g[f+4>>2];z=+g[f+8>>2];x=x+A*(+g[i>>2]-x)-u;y=y+A*(+g[i+4>>2]-y)-v;z=z+A*(+g[i+8>>2]-z)-w;o=P(b,j)|0;n=0;do{A=+(n|0)/+(j+-1|0);t=n+o|0;g[p+(t<<4)>>2]=u+x*A;g[p+(t<<4)+4>>2]=v+y*A;g[p+(t<<4)+8>>2]=w+z*A;g[p+(t<<4)+12>>2]=0.0;g[q+(t<<2)>>2]=1.0;n=n+1|0}while((n|0)!=(j|0));b=b+1|0}while((b|0)!=(k|0))}c[6995]=(c[6995]|0)+1;b=sc(1271)|0;if(!b)b=0;else{c[(b+4+15&-16)+-4>>2]=b;b=b+4+15&-16}Bc(b,d,r,p,q);if(l&1|0){g[(c[b+780>>2]|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&2|0){g[(c[b+780>>2]|0)+((j+-1|0)*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&4|0){t=P(k+-1|0,j)|0;g[(c[b+780>>2]|0)+(t*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&8|0){t=j+-1+(P(k+-1|0,j)|0)|0;g[(c[b+780>>2]|0)+(t*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(p|0){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}aJ(q);if((k|0)<=0){m=b;return m|0}r=b+780|0;d=b+792|0;l=b+800|0;s=b+984|0;i=0;do{p=i;i=i+1|0;a:do if((j|0)>0){t=P(p,j)|0;e=P(i,j)|0;if((i|0)<(k|0))n=0;else{n=0;while(1){o=n;n=n+1|0;if((n|0)<(j|0)){q=n+t|0;e=c[r>>2]|0;Xh(b,0);h=(c[d>>2]|0)+-1|0;f=c[l>>2]|0;c[f+(h*52|0)+24>>2]=e+((o+t|0)*104|0);c[f+(h*52|0)+28>>2]=e+(q*104|0);y=+g[e+((o+t|0)*104|0)+8>>2]-+g[e+(q*104|0)+8>>2];z=+g[e+((o+t|0)*104|0)+12>>2]-+g[e+(q*104|0)+12>>2];A=+g[e+((o+t|0)*104|0)+16>>2]-+g[e+(q*104|0)+16>>2];g[f+(h*52|0)+32>>2]=+D(+(y*y+z*z+A*A));a[s>>0]=1}if((n|0)==(j|0))break a}}do{q=n+t|0;o=n;n=n+1|0;do if((n|0)<(j|0)){f=n+t|0;B=c[r>>2]|0;Xh(b,0);C=(c[d>>2]|0)+-1|0;h=c[l>>2]|0;c[h+(C*52|0)+24>>2]=B+(q*104|0);c[h+(C*52|0)+28>>2]=B+(f*104|0);A=+g[B+(q*104|0)+8>>2]-+g[B+(f*104|0)+8>>2];z=+g[B+(q*104|0)+12>>2]-+g[B+(f*104|0)+12>>2];y=+g[B+(q*104|0)+16>>2]-+g[B+(f*104|0)+16>>2];g[h+(C*52|0)+32>>2]=+D(+(A*A+z*z+y*y));a[s>>0]=1;C=c[r>>2]|0;Xh(b,0);h=(c[d>>2]|0)+-1|0;B=c[l>>2]|0;c[B+(h*52|0)+24>>2]=C+(q*104|0);c[B+(h*52|0)+28>>2]=C+((o+e|0)*104|0);y=+g[C+(q*104|0)+8>>2]-+g[C+((o+e|0)*104|0)+8>>2];z=+g[C+(q*104|0)+12>>2]-+g[C+((o+e|0)*104|0)+12>>2];A=+g[C+(q*104|0)+16>>2]-+g[C+((o+e|0)*104|0)+16>>2];g[B+(h*52|0)+32>>2]=+D(+(y*y+z*z+A*A));a[s>>0]=1;if(!(o+p&1)){bg(b,o+e|0,q,f,0);bg(b,o+e|0,f,n+e|0,0);if(!m)break;h=c[r>>2]|0;Xh(b,0);C=(c[d>>2]|0)+-1|0;B=c[l>>2]|0;c[B+(C*52|0)+24>>2]=h+(f*104|0);c[B+(C*52|0)+28>>2]=h+((o+e|0)*104|0);y=+g[h+(f*104|0)+8>>2]-+g[h+((o+e|0)*104|0)+8>>2];z=+g[h+(f*104|0)+12>>2]-+g[h+((o+e|0)*104|0)+12>>2];A=+g[h+(f*104|0)+16>>2]-+g[h+((o+e|0)*104|0)+16>>2];g[B+(C*52|0)+32>>2]=+D(+(y*y+z*z+A*A));a[s>>0]=1;break}else{h=n+e|0;bg(b,q,f,h,0);bg(b,q,h,o+e|0,0);if(!m)break;f=c[r>>2]|0;Xh(b,0);C=(c[d>>2]|0)+-1|0;B=c[l>>2]|0;c[B+(C*52|0)+24>>2]=f+(q*104|0);c[B+(C*52|0)+28>>2]=f+(h*104|0);y=+g[f+(q*104|0)+8>>2]-+g[f+(h*104|0)+8>>2];z=+g[f+(q*104|0)+12>>2]-+g[f+(h*104|0)+12>>2];A=+g[f+(q*104|0)+16>>2]-+g[f+(h*104|0)+16>>2];g[B+(C*52|0)+32>>2]=+D(+(y*y+z*z+A*A));a[s>>0]=1;break}}else{h=c[r>>2]|0;Xh(b,0);C=(c[d>>2]|0)+-1|0;B=c[l>>2]|0;c[B+(C*52|0)+24>>2]=h+(q*104|0);c[B+(C*52|0)+28>>2]=h+((o+e|0)*104|0);y=+g[h+(q*104|0)+8>>2]-+g[h+((o+e|0)*104|0)+8>>2];z=+g[h+(q*104|0)+12>>2]-+g[h+((o+e|0)*104|0)+12>>2];A=+g[h+(q*104|0)+16>>2]-+g[h+((o+e|0)*104|0)+16>>2];g[B+(C*52|0)+32>>2]=+D(+(y*y+z*z+A*A));a[s>>0]=1}while(0)}while((n|0)!=(j|0))}while(0)}while((i|0)!=(k|0));return b|0}function pd(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=+h;var i=0.0,j=0.0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0,B=0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0;B=l;l=l+272|0;c[B+128>>2]=c[d>>2];c[B+128+4>>2]=c[d+4>>2];c[B+128+8>>2]=c[d+8>>2];c[B+128+12>>2]=c[d+12>>2];c[B+128+16>>2]=c[d+16>>2];c[B+128+16+4>>2]=c[d+16+4>>2];c[B+128+16+8>>2]=c[d+16+8>>2];c[B+128+16+12>>2]=c[d+16+12>>2];c[B+128+32>>2]=c[d+32>>2];c[B+128+32+4>>2]=c[d+32+4>>2];c[B+128+32+8>>2]=c[d+32+8>>2];c[B+128+32+12>>2]=c[d+32+12>>2];c[B+128+48>>2]=c[d+48>>2];c[B+128+48+4>>2]=c[d+48+4>>2];c[B+128+48+8>>2]=c[d+48+8>>2];c[B+128+48+12>>2]=c[d+48+12>>2];c[B+64>>2]=c[e>>2];c[B+64+4>>2]=c[e+4>>2];c[B+64+8>>2]=c[e+8>>2];c[B+64+12>>2]=c[e+12>>2];c[B+64+16>>2]=c[e+16>>2];c[B+64+16+4>>2]=c[e+16+4>>2];c[B+64+16+8>>2]=c[e+16+8>>2];c[B+64+16+12>>2]=c[e+16+12>>2];c[B+64+32>>2]=c[e+32>>2];c[B+64+32+4>>2]=c[e+32+4>>2];c[B+64+32+8>>2]=c[e+32+8>>2];c[B+64+32+12>>2]=c[e+32+12>>2];c[B+64+48>>2]=c[e+48>>2];c[B+64+48+4>>2]=c[e+48+4>>2];c[B+64+48+8>>2]=c[e+48+8>>2];c[B+64+48+12>>2]=c[e+48+12>>2];i=+g[B+64+52>>2]-+g[B+128+52>>2];G=+g[B+64+56>>2]-+g[B+128+56>>2];g[B+16>>2]=+g[B+64+48>>2]-+g[B+128+48>>2];g[B+16+4>>2]=i;g[B+16+8>>2]=G;g[B+16+12>>2]=0.0;If(B+128|0,B+64|0,B+208|0,B+192|0);G=+g[B+192>>2];i=G*+g[B+208+4>>2];D=G*+g[B+208+8>>2];g[B>>2]=+g[B+208>>2]*G;g[B+4>>2]=i;g[B+8>>2]=D;g[B+12>>2]=0.0;c[B+208+48>>2]=0;c[B+208+48+4>>2]=0;c[B+208+48+8>>2]=0;c[B+208+48+12>>2]=0;yh(B+128|0,B+192|0);D=+g[B+192>>2];i=+g[B+192+4>>2];G=+g[B+192+8>>2];E=+g[B+192+12>>2];C=D*(2.0/(D*D+i*i+G*G+E*E));j=i*(2.0/(D*D+i*i+G*G+E*E));F=G*(2.0/(D*D+i*i+G*G+E*E));g[B+208>>2]=1.0-(i*j+G*F);g[B+208+4>>2]=D*j-E*F;g[B+208+8>>2]=D*F+E*j;g[B+208+12>>2]=0.0;g[B+208+16>>2]=D*j+E*F;g[B+208+20>>2]=1.0-(D*C+G*F);g[B+208+24>>2]=i*F-E*C;g[B+208+28>>2]=0.0;g[B+208+32>>2]=D*F-E*j;g[B+208+36>>2]=i*F+E*C;g[B+208+40>>2]=1.0-(D*C+i*j);g[B+208+44>>2]=0.0;kh(b,B+208|0,B+16|0,B,B+48|0,B+32|0);if((c[a+328>>2]|0)<=0){l=B;return}k=0;do{m=c[(c[a+336>>2]|0)+(k<<2)>>2]|0;if(zb[c[(c[f>>2]|0)+8>>2]&31](f,c[m+188>>2]|0)|0?(z=c[m+192>>2]|0,Vb[c[(c[z>>2]|0)+8>>2]&127](z,m+4|0,B+192|0,B+16|0),n=+g[B+192>>2]+ +g[B+48>>2],o=+g[B+192+4>>2]+ +g[B+48+4>>2],p=+g[B+192+8>>2]+ +g[B+48+8>>2],g[B+192>>2]=n,g[B+192+4>>2]=o,g[B+192+8>>2]=p,g[B+192+12>>2]=0.0,q=+g[B+16>>2]+ +g[B+32>>2],r=+g[B+16+4>>2]+ +g[B+32+4>>2],s=+g[B+16+8>>2]+ +g[B+32+8>>2],g[B+16>>2]=q,g[B+16+4>>2]=r,g[B+16+8>>2]=s,g[B+16+12>>2]=0.0,t=+g[d+48>>2]-(q+n)*.5,u=+g[d+52>>2]-(r+o)*.5,v=+g[d+56>>2]-(s+p)*.5,w=+g[e+48>>2]-(q+n)*.5,x=+g[e+52>>2]-(r+o)*.5,y=+g[e+56>>2]-(s+p)*.5,z=t<-((q-n)*.5)|(t>(q-n)*.5?8:0)|(u<-((r-o)*.5)?2:0)|(u>(r-o)*.5?16:0)|(v<-((s-p)*.5)?4:0)|(v>(s-p)*.5?32:0),A=w<-((q-n)*.5)|(w>(q-n)*.5?8:0)|(x<-((r-o)*.5)?2:0)|(x>(r-o)*.5?16:0)|(y<-((s-p)*.5)?4:0)|(y>(s-p)*.5?32:0),(z&A|0)==0):0){if(t<-((q-n)*.5))if(!((-t-(q-n)*.5)/(w-t)>=0.0)){i=0.0;j=1.0}else{i=(-t-(q-n)*.5)/(w-t);j=1.0}else if(w<-((q-n)*.5)?(-t-(q-n)*.5)/(w-t)<1.0:0){i=0.0;j=(-t-(q-n)*.5)/(w-t)}else{i=0.0;j=1.0}if(u<-((r-o)*.5)){if(i<=(-u-(r-o)*.5)/(x-u))i=(-u-(r-o)*.5)/(x-u)}else if(x<-((r-o)*.5)?(-u-(r-o)*.5)/(x-u)(q-n)*.5){if(i<=((q-n)*.5-t)/(w-t))i=((q-n)*.5-t)/(w-t)}else if(w>(q-n)*.5?((q-n)*.5-t)/(w-t)(r-o)*.5){if(i<=((r-o)*.5-u)/(x-u))i=((r-o)*.5-u)/(x-u)}else if(x>(r-o)*.5?((r-o)*.5-u)/(x-u)>2]|0;c[B+208>>2]=0;c[B+208+4>>2]=H;c[B+208+8>>2]=m;c[B+208+12>>2]=m+4;c[B+208+16>>2]=-1;c[B+208+20>>2]=-1;vc(b,B+128|0,B+64|0,B+208|0,f,h)}}k=k+1|0}while((k|0)<(c[a+328>>2]|0));l=B;return}function qd(b,d,e,f,h,i,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0;h=c[b+48>>2]|0;r=c[b+28>>2]|0;s=c[b+68>>2]|0;if(c[l+72>>2]&1|0){if((h|0)>0){i=c[b+136>>2]|0;f=0;q=c[b+232>>2]|0;do{m=i+(f<<2)|0;p=c[m>>2]|0;f=f+1|0;q=(P(q,1664525)|0)+1013904223|0;if(f>>>0<65537){e=q>>>16^q;if(f>>>0<257)if(f>>>0<17){e=(e>>>8^e)>>>4^(e>>>8^e);e=f>>>0<5?(f>>>0<3?(e>>>2^e)>>>1:0)^(e>>>2^e):e}else e=e>>>8^e}else e=q;e=i+(((e>>>0)%(f>>>0)|0)<<2)|0;c[m>>2]=c[e>>2];c[e>>2]=p}while((f|0)!=(h|0));c[b+232>>2]=q}if((c[l+20>>2]|0)>(d|0)){if((r|0)>0){h=c[b+116>>2]|0;f=0;p=c[b+232>>2]|0;do{i=h+(f<<2)|0;m=c[i>>2]|0;f=f+1|0;p=(P(p,1664525)|0)+1013904223|0;if(f>>>0<65537){e=p>>>16^p;if(f>>>0<257)if(f>>>0<17){e=(e>>>8^e)>>>4^(e>>>8^e);e=f>>>0<5?(f>>>0<3?(e>>>2^e)>>>1:0)^(e>>>2^e):e}else e=e>>>8^e}else e=p;q=h+(((e>>>0)%(f>>>0)|0)<<2)|0;c[i>>2]=c[q>>2];c[q>>2]=m}while((f|0)!=(r|0));c[b+232>>2]=p}if((s|0)>0){h=c[b+156>>2]|0;f=0;p=c[b+232>>2]|0;do{i=h+(f<<2)|0;m=c[i>>2]|0;f=f+1|0;p=(P(p,1664525)|0)+1013904223|0;if(f>>>0<65537){e=p>>>16^p;if(f>>>0<257)if(f>>>0<17){e=(e>>>8^e)>>>4^(e>>>8^e);e=f>>>0<5?(f>>>0<3?(e>>>2^e)>>>1:0)^(e>>>2^e):e}else e=e>>>8^e}else e=p;r=h+(((e>>>0)%(f>>>0)|0)<<2)|0;c[i>>2]=c[r>>2];c[r>>2]=m}while((f|0)!=(s|0));c[b+232>>2]=p}}}e=c[b+48>>2]|0;if((e|0)>0){i=0;n=0.0;do{f=c[(c[b+136>>2]|0)+(i<<2)>>2]|0;h=c[b+56>>2]|0;if((c[h+(f*152|0)+136>>2]|0)>(d|0)){e=c[b+16>>2]|0;o=+qb[c[b+212>>2]&31](e+((c[h+(f*152|0)+144>>2]|0)*244|0)|0,e+((c[h+(f*152|0)+148>>2]|0)*244|0)|0,h+(f*152|0)|0);n=n+o*o;e=c[b+48>>2]|0}i=i+1|0}while((i|0)<(e|0))}else n=0.0;if((c[l+20>>2]|0)<=(d|0)){o=n;return +o}if((k|0)>0){e=0;do{f=j+(e<<2)|0;h=c[f>>2]|0;if(a[h+20>>0]|0){r=Rj(b,c[h+28>>2]|0,+g[l+12>>2])|0;d=Rj(b,c[(c[f>>2]|0)+32>>2]|0,+g[l+12>>2])|0;s=c[b+16>>2]|0;q=c[f>>2]|0;Tb[c[(c[q>>2]|0)+24>>2]&15](q,s+(r*244|0)|0,s+(d*244|0)|0,+g[l+12>>2])}e=e+1|0}while((e|0)!=(k|0))}m=c[l+72>>2]|0;p=c[b+28>>2]|0;if(!(m&512)){if((p|0)>0){e=0;do{l=c[(c[b+116>>2]|0)+(e<<2)>>2]|0;u=c[b+36>>2]|0;t=c[b+16>>2]|0;o=+qb[c[b+216>>2]&31](t+((c[u+(l*152|0)+144>>2]|0)*244|0)|0,t+((c[u+(l*152|0)+148>>2]|0)*244|0)|0,u+(l*152|0)|0);n=n+o*o;e=e+1|0}while((e|0)!=(p|0))}i=c[b+68>>2]|0;if((i|0)>0){h=0;do{e=c[(c[b+156>>2]|0)+(h<<2)>>2]|0;f=c[b+76>>2]|0;o=+g[(c[b+36>>2]|0)+((c[f+(e*152|0)+140>>2]|0)*152|0)+100>>2];if(o>0.0){o=o*+g[f+(e*152|0)+104>>2];g[f+(e*152|0)+120>>2]=-o;g[f+(e*152|0)+124>>2]=o;l=c[b+16>>2]|0;o=+qb[c[b+212>>2]&31](l+((c[f+(e*152|0)+144>>2]|0)*244|0)|0,l+((c[f+(e*152|0)+148>>2]|0)*244|0)|0,f+(e*152|0)|0);n=n+o*o}h=h+1|0}while((h|0)!=(i|0))}}else if((p|0)>0){i=0;do{h=c[(c[b+116>>2]|0)+(i<<2)>>2]|0;e=c[b+36>>2]|0;f=c[b+16>>2]|0;o=+qb[c[b+216>>2]&31](f+((c[e+(h*152|0)+144>>2]|0)*244|0)|0,f+((c[e+(h*152|0)+148>>2]|0)*244|0)|0,e+(h*152|0)|0);n=n+o*o;o=+g[e+(h*152|0)+100>>2];h=P(i,(m>>>4&1)+1|0)|0;e=c[(c[b+156>>2]|0)+(h<<2)>>2]|0;f=c[b+76>>2]|0;if(o>0.0){v=o*+g[f+(e*152|0)+104>>2];g[f+(e*152|0)+120>>2]=-v;g[f+(e*152|0)+124>>2]=v;k=c[b+16>>2]|0;v=+qb[c[b+212>>2]&31](k+((c[f+(e*152|0)+144>>2]|0)*244|0)|0,k+((c[f+(e*152|0)+148>>2]|0)*244|0)|0,f+(e*152|0)|0);n=n+v*v}if((c[l+72>>2]&16|0)!=0?(t=c[(c[b+156>>2]|0)+(h+1<<2)>>2]|0,u=c[b+76>>2]|0,o>0.0):0){v=o*+g[u+(t*152|0)+104>>2];g[u+(t*152|0)+120>>2]=-v;g[u+(t*152|0)+124>>2]=v;k=c[b+16>>2]|0;v=+qb[c[b+212>>2]&31](k+((c[u+(t*152|0)+144>>2]|0)*244|0)|0,k+((c[u+(t*152|0)+148>>2]|0)*244|0)|0,u+(t*152|0)|0);n=n+v*v}i=i+1|0}while((i|0)!=(p|0))}h=c[b+88>>2]|0;if((h|0)<=0){v=n;return +v}f=0;do{e=c[b+96>>2]|0;o=+g[(c[b+36>>2]|0)+((c[e+(f*152|0)+140>>2]|0)*152|0)+100>>2];if(o>0.0){v=+g[e+(f*152|0)+104>>2];v=o*v>v?v:o*v;g[e+(f*152|0)+120>>2]=-v;g[e+(f*152|0)+124>>2]=v;l=c[b+16>>2]|0;v=+qb[c[b+212>>2]&31](l+((c[e+(f*152|0)+144>>2]|0)*244|0)|0,l+((c[e+(f*152|0)+148>>2]|0)*244|0)|0,e+(f*152|0)|0);n=n+v*v}f=f+1|0}while((f|0)!=(h|0));return +n}function rd(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;c[b>>2]=3356;d=c[b+192>>2]|0;if(d|0)Ib[c[(c[d>>2]|0)+4>>2]&511](d);if((c[b+1112>>2]|0)>0)do{g=c[c[b+1120>>2]>>2]|0;d=c[g+348>>2]|0;if(d|0){Ag(b+1068|0,d)|0;e=c[b+1072>>2]|0;if(e|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+1072>>2]=d;c[b+1080>>2]=(c[b+1080>>2]|0)+-1}d=c[g+52>>2]|0;if(d|0){if(a[g+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[g+52>>2]=0}a[g+56>>0]=1;c[g+52>>2]=0;c[g+44>>2]=0;c[g+48>>2]=0;d=c[g+32>>2]|0;if(d|0){if(a[g+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[g+32>>2]=0}a[g+36>>0]=1;c[g+32>>2]=0;c[g+24>>2]=0;c[g+28>>2]=0;d=c[g+12>>2]|0;if(d|0){if(a[g+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[g+12>>2]=0}a[g+16>>0]=1;c[g+12>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);d=c[b+1112>>2]|0;a:do if((d|0)>0){f=c[b+1120>>2]|0;e=0;while(1){if((c[f+(e<<2)>>2]|0)==(g|0))break a;e=e+1|0;if((e|0)>=(d|0)){e=d;break}}}else e=d;while(0);if((d|0)>(e|0)){h=c[b+1120>>2]|0;f=h+(e<<2)|0;g=c[f>>2]|0;c[f>>2]=c[h+(d+-1<<2)>>2];c[(c[b+1120>>2]|0)+(d+-1<<2)>>2]=g;c[b+1112>>2]=d+-1;d=d+-1|0}}while((d|0)>0);d=c[b+932>>2]|0;if((d|0)>0){f=0;do{e=c[(c[b+940>>2]|0)+(f<<2)>>2]|0;if(e){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[b+932>>2]|0}f=f+1|0}while((f|0)<(d|0))}d=c[b+912>>2]|0;if((d|0)>0){f=0;do{e=c[(c[b+920>>2]|0)+(f<<2)>>2]|0;if(e){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[b+912>>2]|0}f=f+1|0}while((f|0)<(d|0))}d=c[b+1244>>2]|0;if(d|0){if(a[b+1248>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+1244>>2]=0}a[b+1248>>0]=1;c[b+1244>>2]=0;c[b+1236>>2]=0;c[b+1240>>2]=0;d=c[b+1140>>2]|0;if(d|0){if(a[b+1144>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+1140>>2]=0}a[b+1144>>0]=1;c[b+1140>>2]=0;c[b+1132>>2]=0;c[b+1136>>2]=0;d=c[b+1120>>2]|0;if(d|0){if(a[b+1124>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+1120>>2]=0}a[b+1124>>0]=1;c[b+1120>>2]=0;c[b+1112>>2]=0;c[b+1116>>2]=0;Bl(b+1068|0);Bl(b+1028|0);Bl(b+988|0);d=c[b+940>>2]|0;if(d|0){if(a[b+944>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+940>>2]=0}a[b+944>>0]=1;c[b+940>>2]=0;c[b+932>>2]=0;c[b+936>>2]=0;d=c[b+920>>2]|0;if(d|0){if(a[b+924>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+920>>2]=0}a[b+924>>0]=1;c[b+920>>2]=0;c[b+912>>2]=0;c[b+916>>2]=0;d=c[b+900>>2]|0;if(d|0){if(a[b+904>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+900>>2]=0}a[b+904>>0]=1;c[b+900>>2]=0;c[b+892>>2]=0;c[b+896>>2]=0;d=c[b+880>>2]|0;if(d|0){if(a[b+884>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+880>>2]=0}a[b+884>>0]=1;c[b+880>>2]=0;c[b+872>>2]=0;c[b+876>>2]=0;d=c[b+860>>2]|0;if(d|0){if(a[b+864>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+860>>2]=0}a[b+864>>0]=1;c[b+860>>2]=0;c[b+852>>2]=0;c[b+856>>2]=0;d=c[b+840>>2]|0;if(d|0){if(a[b+844>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+840>>2]=0}a[b+844>>0]=1;c[b+840>>2]=0;c[b+832>>2]=0;c[b+836>>2]=0;d=c[b+820>>2]|0;if(d|0){if(a[b+824>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+820>>2]=0}a[b+824>>0]=1;c[b+820>>2]=0;c[b+812>>2]=0;c[b+816>>2]=0;d=c[b+800>>2]|0;if(d|0){if(a[b+804>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+800>>2]=0}a[b+804>>0]=1;c[b+800>>2]=0;c[b+792>>2]=0;c[b+796>>2]=0;d=c[b+780>>2]|0;if(d|0){if(a[b+784>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+780>>2]=0}a[b+784>>0]=1;c[b+780>>2]=0;c[b+772>>2]=0;c[b+776>>2]=0;d=c[b+760>>2]|0;if(d|0){if(a[b+764>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+760>>2]=0}a[b+764>>0]=1;c[b+760>>2]=0;c[b+752>>2]=0;c[b+756>>2]=0;d=c[b+572>>2]|0;if(d|0){if(a[b+576>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+572>>2]=0}a[b+576>>0]=1;c[b+572>>2]=0;c[b+564>>2]=0;c[b+568>>2]=0;d=c[b+552>>2]|0;if(d|0){if(a[b+556>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+552>>2]=0}a[b+556>>0]=1;c[b+552>>2]=0;c[b+544>>2]=0;c[b+548>>2]=0;Ju(b+348|0);d=c[b+336>>2]|0;if(d|0){if(a[b+340>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+336>>2]=0}a[b+340>>0]=1;c[b+336>>2]=0;c[b+328>>2]=0;c[b+332>>2]=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(!d){a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;h=b+292|0;c[h>>2]=0;return}if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;h=b+292|0;c[h>>2]=0;return}function sd(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,h=0.0,i=0,j=0.0,k=0.0,m=0.0,n=0,o=0,p=0.0,q=0.0,r=0.0;n=l;l=l+16|0;i=c[a+372>>2]|0;a:do switch(c[i+32>>2]|0){case 1:{b=0;d=1;while(1){c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;g[n+(b<<2)>>2]=1.0;o=i+32|0;g[i+16+(d<<2)>>2]=0.0;d=(c[a+364>>2]|0)+-1|0;c[a+364>>2]=d;c[i+(c[o>>2]<<2)>>2]=c[a+348+(d<<2)>>2];d=c[o>>2]|0;c[o>>2]=d+1;e=+g[n>>2];f=+g[n+4>>2];h=+g[n+8>>2];Fh(a,e,f,h,c[i+(d<<2)>>2]|0);if(sd(a)|0)break;i=c[a+372>>2]|0;o=(c[i+32>>2]|0)+-1|0;c[i+32>>2]=o;o=c[i+(o<<2)>>2]|0;i=c[a+364>>2]|0;c[a+364>>2]=i+1;c[a+348+(i<<2)>>2]=o;i=c[a+372>>2]|0;g[i+16+(c[i+32>>2]<<2)>>2]=0.0;o=(c[a+364>>2]|0)+-1|0;c[a+364>>2]=o;c[i+(c[i+32>>2]<<2)>>2]=c[a+348+(o<<2)>>2];o=c[i+32>>2]|0;c[i+32>>2]=o+1;Fh(a,-e,-f,-h,c[i+(o<<2)>>2]|0);if(sd(a)|0)break;o=c[a+372>>2]|0;i=(c[o+32>>2]|0)+-1|0;c[o+32>>2]=i;i=c[o+(i<<2)>>2]|0;o=c[a+364>>2]|0;c[a+364>>2]=o+1;c[a+348+(o<<2)>>2]=i;b=b+1|0;if(b>>>0>=3)break a;d=c[a+372>>2]|0;i=d;d=c[d+32>>2]|0}o=1;l=n;return o|0}case 2:{o=c[i+4>>2]|0;b=c[i>>2]|0;e=+g[o+16>>2]-+g[b+16>>2];f=+g[o+20>>2]-+g[b+20>>2];h=+g[o+24>>2]-+g[b+24>>2];b=0;while(1){c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;g[n+(b<<2)>>2]=1.0;j=+g[n+8>>2];k=+g[n+4>>2];m=+g[n>>2];if((f*j-h*k)*(f*j-h*k)+(h*m-e*j)*(h*m-e*j)+(e*k-f*m)*(e*k-f*m)>0.0){i=c[a+372>>2]|0;g[i+16+(c[i+32>>2]<<2)>>2]=0.0;o=(c[a+364>>2]|0)+-1|0;c[a+364>>2]=o;c[i+(c[i+32>>2]<<2)>>2]=c[a+348+(o<<2)>>2];o=c[i+32>>2]|0;c[i+32>>2]=o+1;Fh(a,f*j-h*k,h*m-e*j,e*k-f*m,c[i+(o<<2)>>2]|0);if(sd(a)|0)break;i=c[a+372>>2]|0;o=(c[i+32>>2]|0)+-1|0;c[i+32>>2]=o;o=c[i+(o<<2)>>2]|0;i=c[a+364>>2]|0;c[a+364>>2]=i+1;c[a+348+(i<<2)>>2]=o;i=c[a+372>>2]|0;g[i+16+(c[i+32>>2]<<2)>>2]=0.0;o=(c[a+364>>2]|0)+-1|0;c[a+364>>2]=o;c[i+(c[i+32>>2]<<2)>>2]=c[a+348+(o<<2)>>2];o=c[i+32>>2]|0;c[i+32>>2]=o+1;Fh(a,-(f*j-h*k),-(h*m-e*j),-(e*k-f*m),c[i+(o<<2)>>2]|0);if(sd(a)|0)break;o=c[a+372>>2]|0;i=(c[o+32>>2]|0)+-1|0;c[o+32>>2]=i;i=c[o+(i<<2)>>2]|0;o=c[a+364>>2]|0;c[a+364>>2]=o+1;c[a+348+(o<<2)>>2]=i}b=b+1|0;if(b>>>0>=3)break a}o=1;l=n;return o|0}case 3:{o=c[i+4>>2]|0;d=c[i>>2]|0;j=+g[d+16>>2];e=+g[o+16>>2]-j;k=+g[d+20>>2];f=+g[o+20>>2]-k;m=+g[d+24>>2];h=+g[o+24>>2]-m;o=c[i+8>>2]|0;j=+g[o+16>>2]-j;k=+g[o+20>>2]-k;m=+g[o+24>>2]-m;if((f*m-h*k)*(f*m-h*k)+(h*j-e*m)*(h*j-e*m)+(e*k-f*j)*(e*k-f*j)>0.0){g[i+28>>2]=0.0;o=(c[a+364>>2]|0)+-1|0;c[a+364>>2]=o;c[i+12>>2]=c[a+348+(o<<2)>>2];o=c[i+32>>2]|0;c[i+32>>2]=o+1;Fh(a,f*m-h*k,h*j-e*m,e*k-f*j,c[i+(o<<2)>>2]|0);if(sd(a)|0){o=1;l=n;return o|0}i=c[a+372>>2]|0;o=(c[i+32>>2]|0)+-1|0;c[i+32>>2]=o;o=c[i+(o<<2)>>2]|0;i=c[a+364>>2]|0;c[a+364>>2]=i+1;c[a+348+(i<<2)>>2]=o;i=c[a+372>>2]|0;g[i+16+(c[i+32>>2]<<2)>>2]=0.0;o=(c[a+364>>2]|0)+-1|0;c[a+364>>2]=o;c[i+(c[i+32>>2]<<2)>>2]=c[a+348+(o<<2)>>2];o=c[i+32>>2]|0;c[i+32>>2]=o+1;Fh(a,-(f*m-h*k),-(h*j-e*m),-(e*k-f*j),c[i+(o<<2)>>2]|0);if(sd(a)|0){o=1;l=n;return o|0}else{o=c[a+372>>2]|0;i=(c[o+32>>2]|0)+-1|0;c[o+32>>2]=i;i=c[o+(i<<2)>>2]|0;o=c[a+364>>2]|0;c[a+364>>2]=o+1;c[a+348+(o<<2)>>2]=i;break a}}break}case 4:{o=c[i>>2]|0;a=c[i+12>>2]|0;m=+g[a+16>>2];r=+g[o+16>>2]-m;p=+g[a+20>>2];e=+g[o+20>>2]-p;h=+g[a+24>>2];j=+g[o+24>>2]-h;o=c[i+4>>2]|0;f=+g[o+16>>2]-m;k=+g[o+20>>2]-p;q=+g[o+24>>2]-h;o=c[i+8>>2]|0;m=+g[o+16>>2]-m;p=+g[o+20>>2]-p;h=+g[o+24>>2]-h;if(!((0.0!=0.0?1:r*k*h+(e*q*m+j*f*p-r*q*p-e*f*h)-j*k*m!=r*k*h+(e*q*m+j*f*p-r*q*p-e*f*h)-j*k*m)|r*k*h+(e*q*m+j*f*p-r*q*p-e*f*h)-j*k*m==0.0)){o=1;l=n;return o|0}break}default:{}}while(0);o=0;l=n;return o|0}function td(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,h=0,i=0,j=0,k=0.0,l=0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0,Y=0,Z=0;Z=c[d+36>>2]|0;X=c[e+36>>2]|0;L=+g[Z+8>>2];N=+g[Z+12>>2];M=+g[Z+16>>2];h=c[X+8>>2]|0;R=+g[h+8>>2];S=+g[h+12>>2];T=+g[h+16>>2];d=c[X+12>>2]|0;O=+g[d+8>>2];P=+g[d+12>>2];Q=+g[d+16>>2];e=c[X+16>>2]|0;U=+g[e+8>>2];V=+g[e+12>>2];W=+g[e+16>>2];t=O-L-(R-L);A=P-N-(S-N);v=Q-M-(T-M);u=A*(W-M-(T-M))-v*(V-N-(S-N));B=v*(U-L-(R-L))-t*(W-M-(T-M));w=t*(V-N-(S-N))-A*(U-L-(R-L));do if(w*w+(u*u+B*B)>1.1920928955078125e-07?(E=1.0/+D(+(w*w+(u*u+B*B))),F=(T-M)*w*E+((R-L)*u*E+(S-N)*B*E),F*F<3402823466385288598117041.0e14):0){f=R-L-u*E*F;k=S-N-B*E*F;n=T-M-w*E*F;p=O-L-u*E*F;r=P-N-B*E*F;s=Q-M-w*E*F;if((w*(r*f-k*p)+(u*(k*s-n*r)+B*(n*p-s*f))>0.0?(x=U-L-u*E*F,y=V-N-B*E*F,z=W-M-w*E*F,w*(y*p-r*x)+(u*(r*z-s*y)+B*(s*x-z*p))>0.0):0)?w*(k*x-y*f)+(u*(y*n-z*k)+B*(z*f-n*x))>0.0:0){q=F*F;p=u*E*F;n=w*E*F;m=B*E*F;break}if(t*t+A*A+v*v>1.1920928955078125e-07?(C=-((R-L)*t+(S-N)*A+(T-M)*v)/(t*t+A*A+v*v),C=C<0.0?0.0:C>1.0?1.0:C,q=(T-M+v*C)*(T-M+v*C)+((R-L+t*C)*(R-L+t*C)+(S-N+A*C)*(S-N+A*C)),q<3402823466385288598117041.0e14):0){p=R-L+t*C;n=T-M+v*C;k=S-N+A*C}else{q=3402823466385288598117041.0e14;p=0.0;n=0.0;k=0.0}f=(U-L-(O-L))*(U-L-(O-L))+(V-N-(P-N))*(V-N-(P-N))+(W-M-(Q-M))*(W-M-(Q-M));if(f>1.1920928955078125e-07?(H=-((O-L)*(U-L-(O-L))+(P-N)*(V-N-(P-N))+(Q-M)*(W-M-(Q-M)))/f,H=H<0.0?0.0:H>1.0?1.0:H,G=O-L+(U-L-(O-L))*H,I=P-N+(V-N-(P-N))*H,H=Q-M+(W-M-(Q-M))*H,H*H+(G*G+I*I)1.1920928955078125e-07?(K=-((U-L)*(R-L-(U-L))+(V-N)*(S-N-(V-N))+(W-M)*(T-M-(W-M)))/f,K=K<0.0?0.0:K>1.0?1.0:K,J=U-L+(R-L-(U-L))*K,m=V-N+(S-N-(V-N))*K,K=W-M+(T-M-(W-M))*K,K*K+(J*J+m*m)>2];K=N-+g[Z+28>>2];u=M-+g[Z+32>>2];u=+g[b+12>>2]+ +D(+(J*J+K*K+u*u))*2.0;if(!(q>2];V=+g[h+88>>2];W=+g[d+88>>2];f=+g[e+88>>2];f=!(V<=0.0)&!(W<=0.0)&!(f<=0.0)?V*s*(1.0/(t+s+r))+W*r*(1.0/(t+s+r))+t*(1.0/(t+s+r))*f:0.0;if(!(k+f>0.0))return;W=1.0/-+D(+q);q=p*W;p=m*W;n=n*W;o=c[b+4>>2]|0;d=c[b+8>>2]|0;l=c[(+g[o+376>>2]>+g[d+376>>2]?o+376|0:d+376|0)>>2]|0;m=k/(k+f)*+g[o+392>>2];f=f/(k+f)*+g[d+392>>2];d=c[o+892>>2]|0;if((d|0)==(c[o+896>>2]|0)?(Y=d|0?d<<1:1,(d|0)<(Y|0)):0){if(!Y)j=0;else{c[6995]=(c[6995]|0)+1;d=sc((Y*56|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}j=d;d=c[o+892>>2]|0}if((d|0)>0){e=0;do{h=j+(e*56|0)|0;b=(c[o+900>>2]|0)+(e*56|0)|0;i=h+56|0;do{c[h>>2]=c[b>>2];h=h+4|0;b=b+4|0}while((h|0)<(i|0));e=e+1|0}while((e|0)!=(d|0))}d=c[o+900>>2]|0;if(d|0){if(a[o+904>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[o+900>>2]=0}a[o+904>>0]=1;c[o+900>>2]=j;c[o+896>>2]=Y;d=c[o+892>>2]|0}Y=c[o+900>>2]|0;c[Y+(d*56|0)>>2]=Z;c[Y+(d*56|0)+4>>2]=X;g[Y+(d*56|0)+8>>2]=s*(1.0/(t+s+r));g[Y+(d*56|0)+12>>2]=r*(1.0/(t+s+r));g[Y+(d*56|0)+16>>2]=t*(1.0/(t+s+r));g[Y+(d*56|0)+20>>2]=0.0;g[Y+(d*56|0)+24>>2]=q;g[Y+(d*56|0)+28>>2]=p;g[Y+(d*56|0)+32>>2]=n;g[Y+(d*56|0)+36>>2]=0.0;g[Y+(d*56|0)+40>>2]=u;c[Y+(d*56|0)+44>>2]=l;g[Y+(d*56|0)+48>>2]=m;g[Y+(d*56|0)+52>>2]=f;c[o+892>>2]=(c[o+892>>2]|0)+1;return}function ud(d,e){d=d|0;e=e|0;var f=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+64|0;g[d+20>>2]=+h[e+32>>3];g[d+24>>2]=+h[e+40>>3];g[d+28>>2]=+h[e+48>>3];g[d+32>>2]=+h[e+56>>3];g[d+4>>2]=+h[e>>3];g[d+8>>2]=+h[e+8>>3];g[d+12>>2]=+h[e+16>>3];g[d+16>>2]=+h[e+24>>3];g[d+36>>2]=+h[e+64>>3];g[d+40>>2]=+h[e+72>>3];g[d+44>>2]=+h[e+80>>3];g[d+48>>2]=+h[e+88>>3];c[d+56>>2]=c[e+96>>2];a[d+60>>0]=(c[e+100>>2]|0)!=0&1;p=c[e+104>>2]|0;k=q;n=k+64|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(n|0));o=c[d+88>>2]|0;if((o|0)<(p|0)){if((c[d+92>>2]|0)<(p|0)){if(!p){f=0;j=o}else{c[6995]=(c[6995]|0)+1;f=sc(p<<6|19)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=c[d+88>>2]|0}if((j|0)>0){i=0;do{k=f+(i<<6)|0;m=(c[d+96>>2]|0)+(i<<6)|0;n=k+64|0;do{c[k>>2]=c[m>>2];k=k+4|0;m=m+4|0}while((k|0)<(n|0));i=i+1|0}while((i|0)!=(j|0))}i=c[d+96>>2]|0;if(i|0){if(a[d+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[d+96>>2]=0}a[d+100>>0]=1;c[d+96>>2]=f;c[d+92>>2]=p;i=d+96|0}else i=d+96|0;f=o;do{k=(c[i>>2]|0)+(f<<6)|0;m=q;n=k+64|0;do{c[k>>2]=c[m>>2];k=k+4|0;m=m+4|0}while((k|0)<(n|0));f=f+1|0}while((f|0)!=(p|0))}c[d+88>>2]=p;if((p|0)>0){j=c[d+96>>2]|0;f=c[e+112>>2]|0;i=0;while(1){g[j+(i<<6)+16>>2]=+h[f+32>>3];g[j+(i<<6)+20>>2]=+h[f+40>>3];g[j+(i<<6)+24>>2]=+h[f+48>>3];g[j+(i<<6)+28>>2]=+h[f+56>>3];g[j+(i<<6)>>2]=+h[f>>3];g[j+(i<<6)+4>>2]=+h[f+8>>3];g[j+(i<<6)+8>>2]=+h[f+16>>3];g[j+(i<<6)+12>>2]=+h[f+24>>3];c[j+(i<<6)+32>>2]=c[f+64>>2];c[j+(i<<6)+36>>2]=c[f+68>>2];c[j+(i<<6)+40>>2]=c[f+72>>2];i=i+1|0;if((i|0)==(p|0))break;else f=f+80|0}}m=c[e+108>>2]|0;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;k=c[d+128>>2]|0;if((k|0)<(m|0)){if((c[d+132>>2]|0)<(m|0)){if(!m){f=0;j=k}else{c[6995]=(c[6995]|0)+1;f=sc((m<<4|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=c[d+128>>2]|0}if((j|0)>0){i=0;do{p=f+(i<<4)|0;o=(c[d+136>>2]|0)+(i<<4)|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];i=i+1|0}while((i|0)!=(j|0))}i=c[d+136>>2]|0;if(i|0){if(a[d+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[d+136>>2]=0}a[d+140>>0]=1;c[d+136>>2]=f;c[d+132>>2]=m;i=d+136|0}else i=d+136|0;f=k;do{p=(c[i>>2]|0)+(f<<4)|0;c[p>>2]=c[q>>2];c[p+4>>2]=c[q+4>>2];c[p+8>>2]=c[q+8>>2];c[p+12>>2]=c[q+12>>2];f=f+1|0}while((f|0)!=(m|0))}c[d+128>>2]=m;if((m|0)>0){j=c[d+136>>2]|0;f=0;i=c[e+116>>2]|0;while(1){c[j+(f<<4)+12>>2]=c[i+12>>2];b[j+(f<<4)+6>>1]=b[i+6>>1]|0;b[j+(f<<4)+8>>1]=b[i+8>>1]|0;b[j+(f<<4)+10>>1]=b[i+10>>1]|0;b[j+(f<<4)>>1]=b[i>>1]|0;b[j+(f<<4)+2>>1]=b[i+2>>1]|0;b[j+(f<<4)+4>>1]=b[i+4>>1]|0;f=f+1|0;if((f|0)==(m|0))break;else i=i+16|0}}c[d+144>>2]=c[e+120>>2];m=c[e+124>>2]|0;k=c[d+152>>2]|0;if((k|0)<(m|0)){if((c[d+156>>2]|0)<(m|0)){if(!m){f=0;j=k}else{c[6995]=(c[6995]|0)+1;f=sc(m<<5|19)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=c[d+152>>2]|0}if((j|0)>0){i=0;do{p=f+(i<<5)|0;o=(c[d+160>>2]|0)+(i<<5)|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];c[p+16>>2]=c[o+16>>2];c[p+20>>2]=c[o+20>>2];c[p+24>>2]=c[o+24>>2];c[p+28>>2]=c[o+28>>2];i=i+1|0}while((i|0)!=(j|0))}i=c[d+160>>2]|0;if(i|0){if(a[d+164>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[d+160>>2]=0}a[d+164>>0]=1;c[d+160>>2]=f;c[d+156>>2]=m;i=d+160|0}else i=d+160|0;f=k;do{p=(c[i>>2]|0)+(f<<5)|0;c[p>>2]=c[q>>2];c[p+4>>2]=c[q+4>>2];c[p+8>>2]=c[q+8>>2];c[p+12>>2]=c[q+12>>2];c[p+16>>2]=c[q+16>>2];c[p+20>>2]=c[q+20>>2];c[p+24>>2]=c[q+24>>2];c[p+28>>2]=c[q+28>>2];f=f+1|0}while((f|0)!=(m|0))}c[d+152>>2]=m;if((m|0)<=0){l=q;return}j=c[d+160>>2]|0;i=0;f=c[e+128>>2]|0;while(1){b[j+(i<<5)+6>>1]=b[f+14>>1]|0;b[j+(i<<5)+8>>1]=b[f+16>>1]|0;b[j+(i<<5)+10>>1]=b[f+18>>1]|0;b[j+(i<<5)>>1]=b[f+8>>1]|0;b[j+(i<<5)+2>>1]=b[f+10>>1]|0;b[j+(i<<5)+4>>1]=b[f+12>>1]|0;c[j+(i<<5)+12>>2]=c[f>>2];c[j+(i<<5)+16>>2]=c[f+4>>2];i=i+1|0;if((i|0)==(m|0))break;else f=f+20|0}l=q;return}function vd(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+64|0;c[d+20>>2]=c[e+16>>2];c[d+24>>2]=c[e+20>>2];c[d+28>>2]=c[e+24>>2];c[d+32>>2]=c[e+28>>2];c[d+4>>2]=c[e>>2];c[d+8>>2]=c[e+4>>2];c[d+12>>2]=c[e+8>>2];c[d+16>>2]=c[e+12>>2];c[d+36>>2]=c[e+32>>2];c[d+40>>2]=c[e+36>>2];c[d+44>>2]=c[e+40>>2];c[d+48>>2]=c[e+44>>2];c[d+56>>2]=c[e+48>>2];a[d+60>>0]=(c[e+52>>2]|0)!=0&1;n=c[e+56>>2]|0;i=o;k=i+64|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(k|0));m=c[d+88>>2]|0;if((m|0)<(n|0)){if((c[d+92>>2]|0)<(n|0)){if(!n){f=0;h=m}else{c[6995]=(c[6995]|0)+1;f=sc(n<<6|19)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[d+88>>2]|0}if((h|0)>0){g=0;do{i=f+(g<<6)|0;j=(c[d+96>>2]|0)+(g<<6)|0;k=i+64|0;do{c[i>>2]=c[j>>2];i=i+4|0;j=j+4|0}while((i|0)<(k|0));g=g+1|0}while((g|0)!=(h|0))}g=c[d+96>>2]|0;if(g|0){if(a[d+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0)}c[d+96>>2]=0}a[d+100>>0]=1;c[d+96>>2]=f;c[d+92>>2]=n;g=d+96|0}else g=d+96|0;f=m;do{i=(c[g>>2]|0)+(f<<6)|0;j=o;k=i+64|0;do{c[i>>2]=c[j>>2];i=i+4|0;j=j+4|0}while((i|0)<(k|0));f=f+1|0}while((f|0)!=(n|0))}c[d+88>>2]=n;if((n|0)>0){h=c[d+96>>2]|0;f=c[e+64>>2]|0;g=0;while(1){c[h+(g<<6)+16>>2]=c[f+16>>2];c[h+(g<<6)+20>>2]=c[f+20>>2];c[h+(g<<6)+24>>2]=c[f+24>>2];c[h+(g<<6)+28>>2]=c[f+28>>2];c[h+(g<<6)>>2]=c[f>>2];c[h+(g<<6)+4>>2]=c[f+4>>2];c[h+(g<<6)+8>>2]=c[f+8>>2];c[h+(g<<6)+12>>2]=c[f+12>>2];c[h+(g<<6)+32>>2]=c[f+32>>2];c[h+(g<<6)+36>>2]=c[f+36>>2];c[h+(g<<6)+40>>2]=c[f+40>>2];g=g+1|0;if((g|0)==(n|0))break;else f=f+48|0}}j=c[e+60>>2]|0;c[o>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;i=c[d+128>>2]|0;if((i|0)<(j|0)){if((c[d+132>>2]|0)<(j|0)){if(!j){f=0;h=i}else{c[6995]=(c[6995]|0)+1;f=sc((j<<4|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[d+128>>2]|0}if((h|0)>0){g=0;do{n=f+(g<<4)|0;m=(c[d+136>>2]|0)+(g<<4)|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];c[n+8>>2]=c[m+8>>2];c[n+12>>2]=c[m+12>>2];g=g+1|0}while((g|0)!=(h|0))}g=c[d+136>>2]|0;if(g|0){if(a[d+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0)}c[d+136>>2]=0}a[d+140>>0]=1;c[d+136>>2]=f;c[d+132>>2]=j;g=d+136|0}else g=d+136|0;f=i;do{n=(c[g>>2]|0)+(f<<4)|0;c[n>>2]=c[o>>2];c[n+4>>2]=c[o+4>>2];c[n+8>>2]=c[o+8>>2];c[n+12>>2]=c[o+12>>2];f=f+1|0}while((f|0)!=(j|0))}c[d+128>>2]=j;if((j|0)>0){h=c[d+136>>2]|0;f=0;g=c[e+68>>2]|0;while(1){c[h+(f<<4)+12>>2]=c[g+12>>2];b[h+(f<<4)+6>>1]=b[g+6>>1]|0;b[h+(f<<4)+8>>1]=b[g+8>>1]|0;b[h+(f<<4)+10>>1]=b[g+10>>1]|0;b[h+(f<<4)>>1]=b[g>>1]|0;b[h+(f<<4)+2>>1]=b[g+2>>1]|0;b[h+(f<<4)+4>>1]=b[g+4>>1]|0;f=f+1|0;if((f|0)==(j|0))break;else g=g+16|0}}c[d+144>>2]=c[e+76>>2];j=c[e+80>>2]|0;i=c[d+152>>2]|0;if((i|0)<(j|0)){if((c[d+156>>2]|0)<(j|0)){if(!j){f=0;h=i}else{c[6995]=(c[6995]|0)+1;f=sc(j<<5|19)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[d+152>>2]|0}if((h|0)>0){g=0;do{n=f+(g<<5)|0;m=(c[d+160>>2]|0)+(g<<5)|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];c[n+8>>2]=c[m+8>>2];c[n+12>>2]=c[m+12>>2];c[n+16>>2]=c[m+16>>2];c[n+20>>2]=c[m+20>>2];c[n+24>>2]=c[m+24>>2];c[n+28>>2]=c[m+28>>2];g=g+1|0}while((g|0)!=(h|0))}g=c[d+160>>2]|0;if(g|0){if(a[d+164>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0)}c[d+160>>2]=0}a[d+164>>0]=1;c[d+160>>2]=f;c[d+156>>2]=j;g=d+160|0}else g=d+160|0;f=i;do{n=(c[g>>2]|0)+(f<<5)|0;c[n>>2]=c[o>>2];c[n+4>>2]=c[o+4>>2];c[n+8>>2]=c[o+8>>2];c[n+12>>2]=c[o+12>>2];c[n+16>>2]=c[o+16>>2];c[n+20>>2]=c[o+20>>2];c[n+24>>2]=c[o+24>>2];c[n+28>>2]=c[o+28>>2];f=f+1|0}while((f|0)!=(j|0))}c[d+152>>2]=j;if((j|0)<=0){l=o;return}h=c[d+160>>2]|0;g=0;f=c[e+72>>2]|0;while(1){b[h+(g<<5)+6>>1]=b[f+14>>1]|0;b[h+(g<<5)+8>>1]=b[f+16>>1]|0;b[h+(g<<5)+10>>1]=b[f+18>>1]|0;b[h+(g<<5)>>1]=b[f+8>>1]|0;b[h+(g<<5)+2>>1]=b[f+10>>1]|0;b[h+(g<<5)+4>>1]=b[f+12>>1]|0;c[h+(g<<5)+12>>2]=c[f>>2];c[h+(g<<5)+16>>2]=c[f+4>>2];g=g+1|0;if((g|0)==(j|0))break;else f=f+20|0}l=o;return} +function nc(b,d){b=b|0;d=+d;var e=0,f=0,h=0,i=0.0,k=0.0,m=0.0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0.0,P=0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0,W=0,X=0,Y=0.0,Z=0.0,_=0.0,$=0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0,fa=0,ga=0,ha=0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0.0,oa=0.0,pa=0.0,qa=0.0,ra=0.0;ea=l;l=l+240|0;e=c[b+24>>2]|0;if((e|0)<=0){l=ea;return}K=ea+128+76|0;L=ea+80+16|0;P=ea+80+32|0;J=0;do{I=c[(c[b+32>>2]|0)+(J<<2)>>2]|0;switch(c[I+220>>2]|0){case 2:case 5:break;default:{if(a[I+984>>0]|0){a[I+984>>0]=0;f=c[I+792>>2]|0;if((f|0)>0){h=c[I+800>>2]|0;e=0;do{x=c[h+(e*52|0)+24>>2]|0;H=c[h+(e*52|0)+28>>2]|0;E=+g[x+8>>2]-+g[H+8>>2];F=+g[x+12>>2]-+g[H+12>>2];G=+g[x+16>>2]-+g[H+16>>2];G=+D(+(E*E+F*F+G*G));g[h+(e*52|0)+32>>2]=G;g[h+(e*52|0)+44>>2]=G*G;e=e+1|0}while((e|0)!=(f|0));e=0;do{g[h+(e*52|0)+40>>2]=(+g[(c[h+(e*52|0)+24>>2]|0)+88>>2]+ +g[(c[h+(e*52|0)+28>>2]|0)+88>>2])/+g[(c[h+(e*52|0)+4>>2]|0)+4>>2];e=e+1|0}while((e|0)!=(f|0))}Vf(I);Dl(I+1028|0);if(c[I+448>>2]&16|0)$g(I)}m=+g[I+428>>2]*d;g[I+512>>2]=m;g[I+516>>2]=1.0/m;g[I+520>>2]=m*3.0;x=c[I+192>>2]|0;m=+nb[c[(c[x>>2]|0)+48>>2]&15](x);g[I+524>>2]=m;g[I+528>>2]=m*.25;x=c[I+744>>2]|0;m=+g[I+512>>2];i=+g[x+40>>2]*m;k=m*+g[x+44>>2];m=m*+g[x+48>>2];H=c[I+772>>2]|0;if((H|0)>0){f=c[I+780>>2]|0;e=0;do{if(+g[f+(e*104|0)+88>>2]>0.0){n=f+(e*104|0)+40|0;g[n>>2]=i+ +g[n>>2];n=f+(e*104|0)+44|0;g[n>>2]=k+ +g[n>>2];n=f+(e*104|0)+48|0;g[n>>2]=m+ +g[n>>2]}e=e+1|0}while((e|0)!=(H|0))}F=+g[I+368>>2];G=+g[I+372>>2];n=+g[I+364>>2]>0.0?1:+g[I+360>>2]>0.0;if(F!=0.0|G>0.0){if((H|0)>0){f=c[I+780>>2]|0;k=+g[f+8>>2];m=+g[f+12>>2];o=+g[f+16>>2];f=c[I+812>>2]|0;if((f|0)>0){h=c[I+820>>2]|0;e=0;i=0.0;do{fa=c[h+(e*44|0)+8>>2]|0;ga=c[h+(e*44|0)+12>>2]|0;B=+g[ga+8>>2]-k;w=+g[ga+12>>2]-m;z=+g[ga+16>>2]-o;ga=c[h+(e*44|0)+16>>2]|0;A=+g[ga+8>>2]-k;y=+g[ga+12>>2]-m;E=+g[ga+16>>2]-o;i=i+((+g[fa+16>>2]-o)*(B*y-w*A)+((+g[fa+8>>2]-k)*(w*E-z*y)+(+g[fa+12>>2]-m)*(z*A-B*E)));e=e+1|0}while((e|0)!=(f|0))}else i=0.0;i=i/6.0}else i=0.0;E=F*(1.0/+C(+i));B=G*(+g[I+536>>2]-i)}else{B=0.0;E=0.0}a:do if((H|0)>0){if(!n){f=c[I+780>>2]|0;e=0;while(1){if(+g[f+(e*104|0)+88>>2]>0.0){if(F!=0.0){y=E*+g[f+(e*104|0)+92>>2];z=y*+g[f+(e*104|0)+76>>2];A=y*+g[f+(e*104|0)+80>>2];ga=f+(e*104|0)+56|0;g[ga>>2]=+g[f+(e*104|0)+72>>2]*y+ +g[ga>>2];ga=f+(e*104|0)+60|0;g[ga>>2]=z+ +g[ga>>2];ga=f+(e*104|0)+64|0;g[ga>>2]=A+ +g[ga>>2]}if(G>0.0){y=B*+g[f+(e*104|0)+92>>2];z=y*+g[f+(e*104|0)+76>>2];A=y*+g[f+(e*104|0)+80>>2];ga=f+(e*104|0)+56|0;g[ga>>2]=+g[f+(e*104|0)+72>>2]*y+ +g[ga>>2];ga=f+(e*104|0)+60|0;g[ga>>2]=z+ +g[ga>>2];ga=f+(e*104|0)+64|0;g[ga>>2]=A+ +g[ga>>2]}}e=e+1|0;if((e|0)==(H|0))break a}}f=c[I+780>>2]|0;e=0;do{w=+g[f+(e*104|0)+88>>2];if(w>0.0){y=+g[I+512>>2];u=+g[I+364>>2];s=+g[I+360>>2];b:do if((u>0.0|s>0.0?(M=c[x>>2]|0,(c[I+348>>2]|0)<4):0)?(N=+g[f+(e*104|0)+40>>2],O=N-+g[I+1212>>2],Q=+g[f+(e*104|0)+44>>2],R=Q-+g[I+1216>>2],S=+g[f+(e*104|0)+48>>2],T=S-+g[I+1220>>2],U=+D(+(O*O+R*R+T*T)),O*O+R*R+T*T>1.1920928955078125e-07):0){v=O*(1.0/U);z=R*(1.0/U);A=T*(1.0/U);k=+g[f+(e*104|0)+72>>2];o=+g[f+(e*104|0)+76>>2];p=+g[f+(e*104|0)+80>>2];switch(c[I+348>>2]|0){case 2:{r=O*k+R*o+T*p<0.0?-1.0:1.0;i=A*p*r+(v*k*r+z*o*r);m=+g[f+(e*104|0)+92>>2]*.5;q=(c[j>>2]=M,+g[j>>2]);t=i*s*.5*q*(O*O+R*R+T*T)*m;if(i>0.0&i<.9847999811172485){u=u*.5*q*U*m*+D(+(1.0-i*i));q=(A*(v*p*r-A*k*r)-z*(z*k*r-v*o*r))*u;s=(v*(z*k*r-v*o*r)-A*(A*o*r-z*p*r))*u;o=(z*(A*o*r-z*p*r)-v*(v*p*r-A*k*r))*u}else{q=0.0;s=0.0;o=0.0}i=y*w*-(A*t)*y*w*-(A*t)+(w*-(v*t)*y*w*-(v*t)*y+y*w*-(z*t)*y*w*-(z*t));if(i>0.0?i>=N*N+Q*Q+S*S:0){i=+D(+(N*N+Q*Q+S*S))/+D(+i)*.800000011920929;m=i*-(v*t);k=i*-(A*t);i=i*-(z*t)}else{m=-(v*t);k=-(A*t);i=-(z*t)}n=f+(e*104|0)+56|0;fa=f+(e*104|0)+60|0;z=i+ +g[fa>>2];ga=f+(e*104|0)+64|0;A=k+ +g[ga>>2];g[n>>2]=q+(m+ +g[n>>2]);g[fa>>2]=s+z;g[ga>>2]=o+A;break b}case 1:{t=O*k+R*o+T*p<0.0?-1.0:1.0;k=k*t;o=o*t;p=p*t;break}case 3:case 0:break;default:break b}i=O*k+R*o+T*p;if(i>0.0){i=-((c[j>>2]=M,+g[j>>2])*(O*O+R*R+T*T)*i*+g[f+(e*104|0)+92>>2]*.5);m=v*s*i+(k*u*i+0.0);k=z*s*i+(o*u*i+0.0);i=A*s*i+(p*u*i+0.0);if(y*w*i*y*w*i+(y*w*m*y*w*m+y*w*k*y*w*k)>N*N+Q*Q+S*S){A=1.0/+D(+(i*i+(m*m+k*k)));ga=f+(e*104|0)+56|0;g[ga>>2]=+g[ga>>2]-1.0/(y*w)*m*A*(S*i*A+(N*m*A+Q*k*A));ga=f+(e*104|0)+60|0;g[ga>>2]=+g[ga>>2]-1.0/(y*w)*k*A*(S*i*A+(N*m*A+Q*k*A));ga=f+(e*104|0)+64|0;g[ga>>2]=+g[ga>>2]-1.0/(y*w)*i*A*(S*i*A+(N*m*A+Q*k*A));break}else{ga=f+(e*104|0)+56|0;g[ga>>2]=m+ +g[ga>>2];ga=f+(e*104|0)+60|0;g[ga>>2]=k+ +g[ga>>2];ga=f+(e*104|0)+64|0;g[ga>>2]=i+ +g[ga>>2];break}}}while(0);if(F!=0.0){y=E*+g[f+(e*104|0)+92>>2];z=y*+g[f+(e*104|0)+76>>2];A=y*+g[f+(e*104|0)+80>>2];ga=f+(e*104|0)+56|0;g[ga>>2]=+g[f+(e*104|0)+72>>2]*y+ +g[ga>>2];ga=f+(e*104|0)+60|0;g[ga>>2]=z+ +g[ga>>2];ga=f+(e*104|0)+64|0;g[ga>>2]=A+ +g[ga>>2]}if(G>0.0){y=B*+g[f+(e*104|0)+92>>2];z=y*+g[f+(e*104|0)+76>>2];A=y*+g[f+(e*104|0)+80>>2];ga=f+(e*104|0)+56|0;g[ga>>2]=+g[f+(e*104|0)+72>>2]*y+ +g[ga>>2];ga=f+(e*104|0)+60|0;g[ga>>2]=z+ +g[ga>>2];ga=f+(e*104|0)+64|0;g[ga>>2]=A+ +g[ga>>2]}}e=e+1|0}while((e|0)!=(H|0))}while(0);n=c[I+812>>2]|0;if((n|0)>0){h=0;do{u=+g[I+512>>2];t=+g[I+364>>2];s=+g[I+360>>2];c:do if((t>0.0|s>0.0?(V=c[I+348>>2]|0,(V|0)>3):0)?(W=c[I+820>>2]|0,X=c[W+(h*44|0)+8>>2]|0,fa=c[W+(h*44|0)+12>>2]|0,Y=+g[X+40>>2],Z=+g[X+44>>2],_=+g[X+48>>2],ga=c[W+(h*44|0)+16>>2]|0,$=c[x>>2]|0,aa=(Y+ +g[fa+40>>2]+ +g[ga+40>>2])*.3333333432674408-+g[I+1212>>2],ba=(Z+ +g[fa+44>>2]+ +g[ga+44>>2])*.3333333432674408-+g[I+1216>>2],ca=(_+ +g[fa+48>>2]+ +g[ga+48>>2])*.3333333432674408-+g[I+1220>>2],da=+D(+(aa*aa+ba*ba+ca*ca)),aa*aa+ba*ba+ca*ca>1.1920928955078125e-07):0){v=aa*(1.0/da);w=ba*(1.0/da);z=ca*(1.0/da);k=+g[W+(h*44|0)+20>>2];m=+g[W+(h*44|0)+24>>2];o=+g[W+(h*44|0)+28>>2];switch(V|0){case 5:{r=aa*k+ba*m+ca*o<0.0?-1.0:1.0;i=z*o*r+(v*k*r+w*m*r);p=+g[W+(h*44|0)+36>>2]*.5;q=(c[j>>2]=$,+g[j>>2]);s=i*(aa*aa+ba*ba+ca*ca)*s*.5*q*p;if(i>0.0&i<.9847999811172485){A=da*t*.5*q*p*+D(+(1.0-i*i));B=(z*(v*o*r-z*k*r)-w*(w*k*r-v*m*r))*A*.3333333432674408;E=(v*(w*k*r-v*m*r)-z*(z*m*r-w*o*r))*A*.3333333432674408;A=(w*(z*m*r-w*o*r)-v*(v*o*r-z*k*r))*A*.3333333432674408}else{B=0.0;E=0.0;A=0.0}f=0;i=z*s*-.3333333432674408;m=w*s*-.3333333432674408;y=v*s*-.3333333432674408;e=X;o=v*s*-.3333333432674408;p=w*s*-.3333333432674408;v=z*s*-.3333333432674408;while(1){k=+g[e+88>>2];if(k>0.0){q=+g[I+512>>2];t=o*k*q;u=p*k*q;k=v*k*q;q=+g[e+40>>2];r=+g[e+44>>2];s=+g[e+48>>2];if(k*k+(t*t+u*u)>0.0?k*k+(t*t+u*u)>=q*q+r*r+s*s:0){i=+D(+(q*q+r*r+s*s))/+D(+(k*k+(t*t+u*u)))*.800000011920929;k=o*i;m=p*i;i=v*i;o=k;p=m;q=i}else{q=v;k=y}ha=e+56|0;fa=e+60|0;F=m+ +g[fa>>2];ga=e+64|0;G=i+ +g[ga>>2];g[ha>>2]=B+(k+ +g[ha>>2]);g[fa>>2]=E+F;g[ga>>2]=A+G}else{k=y;q=v}e=f+1|0;if((e|0)==3)break c;f=e;y=k;e=c[W+(h*44|0)+8+(e<<2)>>2]|0;v=q}}case 4:{G=aa*k+ba*m+ca*o<0.0?-1.0:1.0;k=k*G;m=m*G;o=o*G;break}case 6:break;default:break c}i=aa*k+ba*m+ca*o;if(i>0.0){p=-((c[j>>2]=$,+g[j>>2])*(aa*aa+ba*ba+ca*ca)*i*+g[W+(h*44|0)+36>>2]);r=(v*s*p+(k*t*p+0.0))*.3333333432674408;q=(w*s*p+(m*t*p+0.0))*.3333333432674408;p=(z*s*p+(o*t*p+0.0))*.3333333432674408;e=0;f=X;k=Y;m=Z;o=_;while(1){i=u*+g[f+88>>2];if(p*i*p*i+(r*i*r*i+q*i*q*i)>k*k+m*m+o*o){F=1.0/+D(+(p*p+(r*r+q*q)));G=o*p*F+(k*r*F+m*q*F);ha=f+56|0;g[ha>>2]=+g[ha>>2]-1.0/i*r*F*G;ha=f+60|0;g[ha>>2]=+g[ha>>2]-1.0/i*q*F*G;ha=f+64|0;g[ha>>2]=+g[ha>>2]-1.0/i*p*F*G}else{ha=f+56|0;g[ha>>2]=r+ +g[ha>>2];ha=f+60|0;g[ha>>2]=q+ +g[ha>>2];ha=f+64|0;g[ha>>2]=p+ +g[ha>>2]}e=e+1|0;if((e|0)==3)break c;ha=c[W+(h*44|0)+8+(e<<2)>>2]|0;f=ha;k=+g[ha+40>>2];m=+g[ha+44>>2];o=+g[ha+48>>2]}}}while(0);h=h+1|0}while((h|0)!=(n|0))}if((H|0)>0){e=0;do{ga=c[I+780>>2]|0;fa=ga+(e*104|0)+8|0;ha=ga+(e*104|0)+24|0;c[ha>>2]=c[fa>>2];c[ha+4>>2]=c[fa+4>>2];c[ha+8>>2]=c[fa+8>>2];c[ha+12>>2]=c[fa+12>>2];ha=ga+(e*104|0)+56|0;F=+g[ga+(e*104|0)+88>>2];G=+g[I+512>>2];B=+g[ha>>2]*F*G;E=F*+g[ga+(e*104|0)+60>>2]*G;F=G*F*+g[ga+(e*104|0)+64>>2];G=+g[(c[I+744>>2]|0)+12>>2]/G;B=B>G?G:B;E=E>G?G:E;F=F>G?G:F;x=ga+(e*104|0)+40|0;B=(B<-G?-G:B)+ +g[x>>2];g[x>>2]=B;x=ga+(e*104|0)+44|0;E=(E<-G?-G:E)+ +g[x>>2];g[x>>2]=E;x=ga+(e*104|0)+48|0;F=(F<-G?-G:F)+ +g[x>>2];g[x>>2]=F;G=+g[I+512>>2];g[fa>>2]=B*G+ +g[fa>>2];fa=ga+(e*104|0)+12|0;g[fa>>2]=G*E+ +g[fa>>2];ga=ga+(e*104|0)+16|0;g[ga>>2]=F*G+ +g[ga>>2];c[ha>>2]=0;c[ha+4>>2]=0;c[ha+8>>2]=0;c[ha+12>>2]=0;e=e+1|0}while((e|0)!=(H|0))}Tc(I);e=c[I+988>>2]|0;if(e){ha=c[I+192>>2]|0;E=+nb[c[(c[ha>>2]|0)+48>>2]&15](ha);G=+g[e+4>>2]-E;F=+g[e+8>>2]-E;g[I+952>>2]=+g[e>>2]-E;g[I+956>>2]=G;g[I+960>>2]=F;g[I+964>>2]=0.0;F=E+ +g[e+20>>2];G=E+ +g[e+24>>2];g[I+968>>2]=E+ +g[e+16>>2];g[I+972>>2]=F;g[I+976>>2]=G;g[I+980>>2]=0.0;e=c[I+188>>2]|0;if(e|0){ha=c[I+744>>2]|0;ga=c[ha+32>>2]|0;Zb[c[(c[ga>>2]|0)+16>>2]&31](ga,e,I+952|0,I+968|0,c[ha+36>>2]|0)}}else{c[I+952>>2]=0;c[I+952+4>>2]=0;c[I+952+8>>2]=0;c[I+952+12>>2]=0;c[I+952+16>>2]=0;c[I+952+20>>2]=0;c[I+952+24>>2]=0;c[I+952+28>>2]=0}f=c[I+772>>2]|0;if((f|0)>0){e=0;do{ga=c[I+780>>2]|0;F=+g[I+524>>2];B=+g[ga+(e*104|0)+8>>2];G=+g[ga+(e*104|0)+12>>2];E=+g[ga+(e*104|0)+16>>2];g[ea>>2]=B-F;g[ea+4>>2]=G-F;g[ea+8>>2]=E-F;g[ea+12>>2]=0.0;g[ea+16>>2]=F+B;g[ea+20>>2]=F+G;g[ea+24>>2]=F+E;g[ea+28>>2]=0.0;ha=c[ga+(e*104|0)+96>>2]|0;E=+g[I+520>>2];F=E*+g[ga+(e*104|0)+44>>2];G=E*+g[ga+(e*104|0)+48>>2];g[ea+128>>2]=+g[ga+(e*104|0)+40>>2]*E;g[ea+128+4>>2]=F;g[ea+128+8>>2]=G;g[ea+128+12>>2]=0.0;uh(I+988|0,ha,ea,ea+128|0,+g[I+528>>2])|0;e=e+1|0}while((e|0)!=(f|0))}if(c[I+1028>>2]|0?(c[I+812>>2]|0)>0:0){e=0;do{ha=c[I+820>>2]|0;H=c[ha+(e*44|0)+8>>2]|0;fa=c[ha+(e*44|0)+12>>2]|0;ga=c[ha+(e*44|0)+16>>2]|0;B=(+g[H+40>>2]+ +g[fa+40>>2]+ +g[ga+40>>2])*.3333333432674408;E=(+g[H+44>>2]+ +g[fa+44>>2]+ +g[ga+44>>2])*.3333333432674408;F=(+g[H+48>>2]+ +g[fa+48>>2]+ +g[ga+48>>2])*.3333333432674408;w=+g[I+524>>2];t=+g[H+8>>2];v=+g[H+12>>2];z=+g[H+16>>2];G=+g[H+20>>2];A=+g[fa+8>>2];o=A>2];p=y>2];q=u>2];r=s>2];u=+g[ga+12>>2];y=+g[ga+16>>2];A=+g[ga+20>>2];g[ea>>2]=(s>2]=(u>2]=(y>2]=A>2]=w+(t>2]=w+(v>2]=w+(z>2]=G>2]|0;G=+g[I+520>>2];g[ea+128>>2]=B*G;g[ea+128+4>>2]=E*G;g[ea+128+8>>2]=F*G;g[ea+128+12>>2]=0.0;uh(I+1028|0,ha,ea,ea+128|0,+g[I+528>>2])|0;e=e+1|0}while((e|0)<(c[I+812>>2]|0))}do if(a[I+533>>0]|0){x=c[I+772>>2]|0;if((x|0)>0){f=c[I+780>>2]|0;h=c[I+572>>2]|0;e=0;i=0.0;k=0.0;m=0.0;do{G=+g[h+(e<<2)>>2];i=i+ +g[f+(e*104|0)+8>>2]*G;k=k+G*+g[f+(e*104|0)+12>>2];m=m+G*+g[f+(e*104|0)+16>>2];e=e+1|0}while((e|0)!=(x|0))}else{i=0.0;k=0.0;m=0.0}g[I+580>>2]=i;g[I+584>>2]=k;g[I+588>>2]=m;g[I+592>>2]=0.0;h=ea+128+4|0;n=h+44|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(n|0));g[ea+128>>2]=1.1920928955078125e-07;g[ea+128+20>>2]=2.384185791015625e-07;g[ea+128+40>>2]=3.5762786865234375e-07;if((x|0)>0){f=c[I+572>>2]|0;h=c[I+780>>2]|0;n=c[I+552>>2]|0;e=0;o=1.1920928955078125e-07;p=0.0;q=0.0;r=0.0;s=2.384185791015625e-07;t=0.0;u=0.0;v=0.0;w=3.5762786865234375e-07;do{F=+g[f+(e<<2)>>2];z=(+g[h+(e*104|0)+8>>2]-i)*F;A=(+g[h+(e*104|0)+12>>2]-k)*F;F=F*(+g[h+(e*104|0)+16>>2]-m);B=+g[n+(e<<4)>>2];E=+g[n+(e<<4)+4>>2];G=+g[n+(e<<4)+8>>2];o=z*B+o;p=z*E+p;q=z*G+q;r=A*B+r;s=A*E+s;t=A*G+t;u=F*B+u;v=F*E+v;w=F*G+w;e=e+1|0}while((e|0)!=(x|0));g[ea+128>>2]=o;g[ea+128+4>>2]=p;g[ea+128+8>>2]=q;g[ea+128+16>>2]=r;g[ea+128+20>>2]=s;g[ea+128+24>>2]=t;g[ea+128+32>>2]=u;g[ea+128+36>>2]=v;g[ea+128+40>>2]=w}if((a[22456]|0)==0?Uz(22456)|0:0){g[5758]=9.999999747378752e-05;c[5759]=16}bd(ea+128|0,ea+80|0,ea+32|0);c[I+596>>2]=c[ea+80>>2];c[I+596+4>>2]=c[ea+80+4>>2];c[I+596+8>>2]=c[ea+80+8>>2];c[I+596+12>>2]=c[ea+80+12>>2];c[I+612>>2]=c[L>>2];c[I+612+4>>2]=c[L+4>>2];c[I+612+8>>2]=c[L+8>>2];c[I+612+12>>2]=c[L+12>>2];c[I+628>>2]=c[P>>2];c[I+628+4>>2]=c[P+4>>2];c[I+628+8>>2]=c[P+8>>2];c[I+628+12>>2]=c[P+12>>2];la=+g[ea+80>>2];v=+g[L>>2];A=+g[P>>2];ka=+g[ea+80+4>>2];w=+g[ea+80+20>>2];E=+g[ea+80+36>>2];ja=+g[ea+80+8>>2];y=+g[ea+80+24>>2];G=+g[ea+80+40>>2];p=+g[I+692>>2];o=+g[I+696>>2];m=+g[I+700>>2];ra=+g[I+708>>2];qa=+g[I+712>>2];q=+g[I+716>>2];B=+g[I+724>>2];F=+g[I+728>>2];u=+g[I+732>>2];pa=+g[ea+128>>2];oa=+g[ea+128+16>>2];r=+g[ea+128+32>>2];i=(la*p+ka*o+ja*m)*pa+(v*p+w*o+y*m)*oa+(A*p+E*o+G*m)*r;na=+g[ea+128+4>>2];ma=+g[ea+128+20>>2];s=+g[ea+128+36>>2];k=(la*p+ka*o+ja*m)*na+(v*p+w*o+y*m)*ma+(A*p+E*o+G*m)*s;ia=+g[ea+128+8>>2];z=+g[ea+128+24>>2];t=+g[ea+128+40>>2];m=(la*p+ka*o+ja*m)*ia+(v*p+w*o+y*m)*z+(A*p+E*o+G*m)*t;o=(la*ra+ka*qa+ja*q)*pa+(v*ra+w*qa+y*q)*oa+(A*ra+E*qa+G*q)*r;p=(la*ra+ka*qa+ja*q)*na+(v*ra+w*qa+y*q)*ma+(A*ra+E*qa+G*q)*s;q=(la*ra+ka*qa+ja*q)*ia+(v*ra+w*qa+y*q)*z+(A*ra+E*qa+G*q)*t;r=pa*(la*B+ka*F+ja*u)+oa*(v*B+w*F+y*u)+(A*B+E*F+G*u)*r;s=(la*B+ka*F+ja*u)*na+(v*B+w*F+y*u)*ma+(A*B+E*F+G*u)*s;t=(la*B+ka*F+ja*u)*ia+(v*B+w*F+y*u)*z+(A*B+E*F+G*u)*t;g[I+644>>2]=i;g[I+648>>2]=k;g[I+652>>2]=m;g[I+656>>2]=0.0;g[I+660>>2]=o;g[I+664>>2]=p;g[I+668>>2]=q;g[I+672>>2]=0.0;g[I+676>>2]=r;g[I+680>>2]=s;g[I+684>>2]=t;g[I+688>>2]=0.0;u=+g[I+424>>2];if(u>1.0){ra=1.0/(m*(s*o-p*r)+(i*(p*t-q*s)+k*(q*r-t*o)))<1.0?1.0:1.0/(m*(s*o-p*r)+(i*(p*t-q*s)+k*(q*r-t*o)))>u?u:1.0/(m*(s*o-p*r)+(i*(p*t-q*s)+k*(q*r-t*o)));g[I+644>>2]=i*ra;g[I+648>>2]=k*ra;g[I+652>>2]=m*ra;g[I+656>>2]=0.0;g[I+660>>2]=o*ra;g[I+664>>2]=p*ra;g[I+668>>2]=q*ra;g[I+672>>2]=0.0;g[I+676>>2]=r*ra;g[I+680>>2]=s*ra;g[I+684>>2]=ra*t;g[I+688>>2]=0.0}if(a[I+533>>0]|0?+g[I+380>>2]>0.0:0){i=+g[I+596>>2];p=+g[I+600>>2];q=+g[I+604>>2];r=+g[I+612>>2];s=+g[I+616>>2];t=+g[I+620>>2];k=+g[I+628>>2];m=+g[I+632>>2];o=+g[I+636>>2];f=c[I+772>>2]|0;if((f|0)<=0)break;e=0;do{h=c[I+780>>2]|0;if(+g[h+(e*104|0)+88>>2]>0.0){fa=c[I+552>>2]|0;ma=+g[fa+(e<<4)>>2];na=+g[fa+(e<<4)+4>>2];oa=+g[fa+(e<<4)+8>>2];la=+g[I+380>>2];fa=h+(e*104|0)+8|0;pa=+g[fa>>2];ga=h+(e*104|0)+12|0;qa=+g[ga>>2];ha=h+(e*104|0)+16|0;ra=+g[ha>>2];qa=qa+la*(r*ma+s*na+t*oa+ +g[I+584>>2]-qa);ra=ra+la*(k*ma+m*na+o*oa+ +g[I+588>>2]-ra);g[fa>>2]=pa+la*(+g[I+580>>2]+(i*ma+p*na+q*oa)-pa);g[ga>>2]=qa;g[ha>>2]=ra;g[h+(e*104|0)+20>>2]=0.0}e=e+1|0}while((e|0)!=(f|0))}}while(0);h=ea+128|0;n=h+104|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(n|0));e=c[I+872>>2]|0;if((e|0)<0){if((c[I+876>>2]|0)<0){f=c[I+880>>2]|0;if(f|0){if(a[I+884>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[I+880>>2]=0}a[I+884>>0]=1;c[I+880>>2]=0;c[I+876>>2]=0}do{ha=c[I+880>>2]|0;ga=ha+(e*104|0)|0;c[ga>>2]=c[ea+128>>2];c[ga+4>>2]=c[ea+128+4>>2];c[ga+8>>2]=c[ea+128+8>>2];c[ga+12>>2]=c[ea+128+12>>2];c[ga+16>>2]=c[ea+128+16>>2];c[ga+20>>2]=c[ea+128+20>>2];c[ga+24>>2]=c[ea+128+24>>2];ga=ha+(e*104|0)+28|0;c[ga>>2]=c[ea+128+28>>2];c[ga+4>>2]=c[ea+128+28+4>>2];c[ga+8>>2]=c[ea+128+28+8>>2];c[ga+12>>2]=c[ea+128+28+12>>2];ga=ha+(e*104|0)+44|0;c[ga>>2]=c[ea+128+44>>2];c[ga+4>>2]=c[ea+128+44+4>>2];c[ga+8>>2]=c[ea+128+44+8>>2];c[ga+12>>2]=c[ea+128+44+12>>2];ga=ha+(e*104|0)+60|0;c[ga>>2]=c[ea+128+60>>2];c[ga+4>>2]=c[ea+128+60+4>>2];c[ga+8>>2]=c[ea+128+60+8>>2];c[ga+12>>2]=c[ea+128+60+12>>2];ha=ha+(e*104|0)+76|0;c[ha>>2]=c[K>>2];c[ha+4>>2]=c[K+4>>2];c[ha+8>>2]=c[K+8>>2];c[ha+12>>2]=c[K+12>>2];c[ha+16>>2]=c[K+16>>2];c[ha+20>>2]=c[K+20>>2];c[ha+24>>2]=c[K+24>>2];e=e+1|0}while((e|0)!=0)}c[I+872>>2]=0;h=ea+128|0;n=h+56|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(n|0));e=c[I+892>>2]|0;if((e|0)<0){if((c[I+896>>2]|0)<0){f=c[I+900>>2]|0;if(f|0){if(a[I+904>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[I+900>>2]=0}a[I+904>>0]=1;c[I+900>>2]=0;c[I+896>>2]=0}do{h=(c[I+900>>2]|0)+(e*56|0)|0;f=ea+128|0;n=h+56|0;do{c[h>>2]=c[f>>2];h=h+4|0;f=f+4|0}while((h|0)<(n|0));e=e+1|0}while((e|0)!=0)}c[I+892>>2]=0;ng(I+988|0,1);ng(I+1028|0,1);ng(I+1068|0,1);e=c[b+24>>2]|0}}J=J+1|0}while((J|0)<(e|0));l=ea;return}function oc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=+f;var h=0,i=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0;Q=l;l=l+448|0;if(!(a[b+527>>0]|0)){l=Q;return}P=c[b+28>>2]|0;C=+g[b+348>>2];B=+g[b+352>>2];J=+g[b+356>>2];E=+g[P+52>>2];F=C*+g[P+4>>2]+B*+g[P+8>>2]+J*+g[P+12>>2]+E;G=+g[P+56>>2];H=C*+g[P+20>>2]+B*+g[P+24>>2]+J*+g[P+28>>2]+G;I=+g[P+60>>2];J=C*+g[P+36>>2]+B*+g[P+40>>2]+J*+g[P+44>>2]+I;P=c[b+32>>2]|0;B=+g[b+412>>2];C=+g[b+416>>2];r=+g[b+420>>2];k=+g[P+52>>2];m=B*+g[P+4>>2]+C*+g[P+8>>2]+r*+g[P+12>>2]+k;n=+g[P+56>>2];o=B*+g[P+20>>2]+C*+g[P+24>>2]+r*+g[P+28>>2]+n;q=+g[P+60>>2];r=B*+g[P+36>>2]+C*+g[P+40>>2]+r*+g[P+44>>2]+q;if(!(a[b+524>>0]|0)){A=+g[d+192>>2]+ +g[d+80>>2];B=+g[d+196>>2]+ +g[d+84>>2];z=+g[d+200>>2]+ +g[d+88>>2];C=+g[e+192>>2]+ +g[e+80>>2];y=+g[e+196>>2]+ +g[e+84>>2];w=+g[e+200>>2]+ +g[e+88>>2];s=+g[d+176>>2]+ +g[d+64>>2]+((J-I)*B-(H-G)*z)-(+g[e+176>>2]+ +g[e+64>>2]+((r-q)*y-(o-n)*w));w=+g[d+180>>2]+ +g[d+68>>2]+((F-E)*z-(J-I)*A)-(+g[e+180>>2]+ +g[e+68>>2]+((m-k)*w-(r-q)*C));y=+g[d+184>>2]+ +g[d+72>>2]+((H-G)*A-(F-E)*B)-(+g[e+184>>2]+ +g[e+72>>2]+((o-n)*C-(m-k)*y));t=(c[d+240>>2]|0)==0;p=0;do{C=1.0/+g[b+48+(p*84|0)+80>>2];u=b+48+(p*84|0)|0;B=+g[u>>2];v=b+48+(p*84|0)+4|0;A=+g[v>>2];x=b+48+(p*84|0)+8|0;z=+g[x>>2];z=C*(((F-m)*B+(H-o)*A+(J-r)*z)*-.30000001192092896/f)-C*(s*B+w*A+y*z);g[b+36>>2]=+g[b+36>>2]+z;A=+g[x>>2];B=+g[v>>2];C=+g[u>>2];h=c[b+28>>2]|0;i=+g[h+404>>2];if(!t){T=((H-G)*A-(J-I)*B)*+g[h+356>>2]+((J-I)*C-(F-E)*A)*+g[h+360>>2]+((F-E)*B-(H-G)*C)*+g[h+364>>2];R=((H-G)*A-(J-I)*B)*+g[h+340>>2]+((J-I)*C-(F-E)*A)*+g[h+344>>2]+((F-E)*B-(H-G)*C)*+g[h+348>>2];S=((H-G)*A-(J-I)*B)*+g[h+324>>2]+((J-I)*C-(F-E)*A)*+g[h+328>>2]+((F-E)*B-(H-G)*C)*+g[h+332>>2];V=z*B*i*+g[d+116>>2];U=z*A*i*+g[d+120>>2];g[d+64>>2]=z*C*i*+g[d+112>>2]+ +g[d+64>>2];g[d+68>>2]=V+ +g[d+68>>2];g[d+72>>2]=U+ +g[d+72>>2];R=R*z*+g[d+100>>2];i=T*z*+g[d+104>>2];g[d+80>>2]=S*z*+g[d+96>>2]+ +g[d+80>>2];g[d+84>>2]=R+ +g[d+84>>2];g[d+88>>2]=i+ +g[d+88>>2]}h=c[b+32>>2]|0;i=+g[h+404>>2];if(c[e+240>>2]|0){V=((o-n)*A-(r-q)*B)*+g[h+356>>2]+((r-q)*C-(m-k)*A)*+g[h+360>>2]+((m-k)*B-(o-n)*C)*+g[h+364>>2];U=((o-n)*A-(r-q)*B)*+g[h+340>>2]+((r-q)*C-(m-k)*A)*+g[h+344>>2]+((m-k)*B-(o-n)*C)*+g[h+348>>2];T=((o-n)*A-(r-q)*B)*+g[h+324>>2]+((r-q)*C-(m-k)*A)*+g[h+328>>2]+((m-k)*B-(o-n)*C)*+g[h+332>>2];R=i*+g[v>>2]*-z*+g[e+116>>2];S=i*+g[x>>2]*-z*+g[e+120>>2];g[e+64>>2]=+g[e+112>>2]*i*+g[u>>2]*-z+ +g[e+64>>2];g[e+68>>2]=R+ +g[e+68>>2];g[e+72>>2]=S+ +g[e+72>>2];U=U*+g[e+100>>2]*-z;V=V*+g[e+104>>2]*-z;g[e+80>>2]=T*+g[e+96>>2]*-z+ +g[e+80>>2];g[e+84>>2]=U+ +g[e+84>>2];g[e+88>>2]=V+ +g[e+88>>2]}p=p+1|0}while((p|0)!=3)}do if(!(a[b+552>>0]|0)){i=+g[b+440>>2];if(!(i>1.1920928955078125e-07)){K=d+80|0;p=d+196|0;L=d+84|0;t=d+200|0;M=d+88|0;u=e+192|0;N=e+80|0;v=e+196|0;O=e+84|0;x=e+200|0;P=e+88|0;h=d+192|0;break}k=+g[e+192>>2]+ +g[e+80>>2]-(+g[d+192>>2]+ +g[d+80>>2]);m=+g[e+196>>2]+ +g[e+84>>2]-(+g[d+196>>2]+ +g[d+84>>2]);n=+g[e+200>>2]+ +g[e+88>>2]-(+g[d+200>>2]+ +g[d+88>>2]);if(k*k+m*m+n*n>1.1920928955078125e-07){E=1.0/+D(+(k*k+m*m+n*n));h=c[b+28>>2]|0;q=+g[h+324>>2];r=+g[h+340>>2];s=+g[h+356>>2];w=+g[h+328>>2];y=+g[h+344>>2];z=+g[h+360>>2];A=+g[h+332>>2];B=+g[h+348>>2];C=+g[h+364>>2];h=c[b+32>>2]|0;i=i*(1.0/(k*E*(q*k*E+m*E*r+n*E*s)+m*E*(k*E*w+m*E*y+n*E*z)+n*E*(k*E*A+m*E*B+n*E*C)+(k*E*(k*E*+g[h+324>>2]+m*E*+g[h+340>>2]+n*E*+g[h+356>>2])+m*E*(k*E*+g[h+328>>2]+m*E*+g[h+344>>2]+n*E*+g[h+360>>2])+n*E*(k*E*+g[h+332>>2]+m*E*+g[h+348>>2]+n*E*+g[h+364>>2]))));E=+D(+(n*i*n*i+(k*i*k*i+m*i*m*i)));o=1.0/E*k*i;k=1.0/E*m*i;i=1.0/E*n*i;if(c[d+240>>2]|0){V=E*0.0*+g[d+116>>2];U=E*0.0*+g[d+120>>2];g[d+64>>2]=E*0.0*+g[d+112>>2]+ +g[d+64>>2];g[d+68>>2]=V+ +g[d+68>>2];g[d+72>>2]=U+ +g[d+72>>2];U=(o*r+k*y+i*B)*E*+g[d+100>>2];V=(o*s+k*z+i*C)*E*+g[d+104>>2];g[d+80>>2]=(o*q+k*w+i*A)*E*+g[d+96>>2]+ +g[d+80>>2];g[d+84>>2]=U+ +g[d+84>>2];g[d+88>>2]=V+ +g[d+88>>2];h=c[b+32>>2]|0}if(c[e+240>>2]|0){V=o*+g[h+356>>2]+k*+g[h+360>>2]+i*+g[h+364>>2];U=o*+g[h+340>>2]+k*+g[h+344>>2]+i*+g[h+348>>2];T=o*+g[h+324>>2]+k*+g[h+328>>2]+i*+g[h+332>>2];R=E*-0.0*+g[e+116>>2];S=E*-0.0*+g[e+120>>2];g[e+64>>2]=E*-0.0*+g[e+112>>2]+ +g[e+64>>2];g[e+68>>2]=R+ +g[e+68>>2];g[e+72>>2]=S+ +g[e+72>>2];U=U*+g[e+100>>2]*-E;V=V*+g[e+104>>2]*-E;g[e+80>>2]=T*+g[e+96>>2]*-E+ +g[e+80>>2];g[e+84>>2]=U+ +g[e+84>>2];g[e+88>>2]=V+ +g[e+88>>2];K=d+80|0;p=d+196|0;L=d+84|0;t=d+200|0;M=d+88|0;u=e+192|0;N=e+80|0;v=e+196|0;O=e+84|0;x=e+200|0;P=e+88|0;h=d+192|0}else{K=d+80|0;p=d+196|0;L=d+84|0;t=d+200|0;M=d+88|0;u=e+192|0;N=e+80|0;v=e+196|0;O=e+84|0;x=e+200|0;P=e+88|0;h=d+192|0}}else{K=d+80|0;p=d+196|0;L=d+84|0;t=d+200|0;M=d+88|0;u=e+192|0;N=e+80|0;v=e+196|0;O=e+84|0;x=e+200|0;P=e+88|0;h=d+192|0}}else{O=c[b+28>>2]|0;c[Q+352>>2]=c[O+4>>2];c[Q+352+4>>2]=c[O+4+4>>2];c[Q+352+8>>2]=c[O+4+8>>2];c[Q+352+12>>2]=c[O+4+12>>2];c[Q+352+16>>2]=c[O+20>>2];c[Q+352+16+4>>2]=c[O+20+4>>2];c[Q+352+16+8>>2]=c[O+20+8>>2];c[Q+352+16+12>>2]=c[O+20+12>>2];c[Q+352+32>>2]=c[O+36>>2];c[Q+352+32+4>>2]=c[O+36+4>>2];c[Q+352+32+8>>2]=c[O+36+8>>2];c[Q+352+32+12>>2]=c[O+36+12>>2];c[Q+352+48>>2]=c[O+52>>2];c[Q+352+48+4>>2]=c[O+52+4>>2];c[Q+352+48+8>>2]=c[O+52+8>>2];c[Q+352+48+12>>2]=c[O+52+12>>2];O=c[b+32>>2]|0;c[Q+288>>2]=c[O+4>>2];c[Q+288+4>>2]=c[O+4+4>>2];c[Q+288+8>>2]=c[O+4+8>>2];c[Q+288+12>>2]=c[O+4+12>>2];c[Q+288+16>>2]=c[O+20>>2];c[Q+288+16+4>>2]=c[O+20+4>>2];c[Q+288+16+8>>2]=c[O+20+8>>2];c[Q+288+16+12>>2]=c[O+20+12>>2];c[Q+288+32>>2]=c[O+36>>2];c[Q+288+32+4>>2]=c[O+36+4>>2];c[Q+288+32+8>>2]=c[O+36+8>>2];c[Q+288+32+12>>2]=c[O+36+12>>2];c[Q+288+48>>2]=c[O+52>>2];c[Q+288+48+4>>2]=c[O+52+4>>2];c[Q+288+48+8>>2]=c[O+52+8>>2];c[Q+288+48+12>>2]=c[O+52+12>>2];T=+g[d+196>>2]+ +g[d+84>>2];s=+g[d+200>>2]+ +g[d+88>>2];g[Q+272>>2]=+g[d+192>>2]+ +g[d+80>>2];g[Q+272+4>>2]=T;g[Q+272+8>>2]=s;g[Q+272+12>>2]=0.0;s=+g[e+196>>2]+ +g[e+84>>2];T=+g[e+200>>2]+ +g[e+88>>2];g[Q+256>>2]=+g[e+192>>2]+ +g[e+80>>2];g[Q+256+4>>2]=s;g[Q+256+8>>2]=T;g[Q+256+12>>2]=0.0;c[Q+192>>2]=1065353216;O=Q+192+4|0;c[O>>2]=0;c[O+4>>2]=0;c[O+8>>2]=0;c[O+12>>2]=0;c[Q+192+20>>2]=1065353216;P=Q+192+24|0;c[P>>2]=0;c[P+4>>2]=0;c[P+8>>2]=0;c[P+12>>2]=0;c[Q+192+40>>2]=1065353216;M=Q+192+44|0;c[M>>2]=0;c[M+4>>2]=0;c[M+8>>2]=0;c[M+12>>2]=0;c[M+16>>2]=0;Af(Q+352|0,0.0,0.0,0.0,Q+272|0,f,Q+192|0);c[Q+128>>2]=1065353216;M=Q+128+4|0;c[M>>2]=0;c[M+4>>2]=0;c[M+8>>2]=0;c[M+12>>2]=0;c[Q+128+20>>2]=1065353216;N=Q+128+24|0;c[N>>2]=0;c[N+4>>2]=0;c[N+8>>2]=0;c[N+12>>2]=0;c[Q+128+40>>2]=1065353216;L=Q+128+44|0;c[L>>2]=0;c[L+4>>2]=0;c[L+8>>2]=0;c[L+12>>2]=0;c[L+16>>2]=0;Af(Q+288|0,0.0,0.0,0.0,Q+256|0,f,Q+128|0);T=+g[b+556>>2];s=+g[b+560>>2];U=+g[b+564>>2];w=+g[b+568>>2];H=T*(2.0/(T*T+s*s+U*U+w*w));B=s*(2.0/(T*T+s*s+U*U+w*w));I=U*(2.0/(T*T+s*s+U*U+w*w));X=+g[b+364>>2];W=+g[b+368>>2];_=+g[b+372>>2];k=_*(T*I-w*B)+(W*(T*B+w*I)+X*(1.0-(s*B+U*I)));m=_*(s*I+w*H)+(X*(T*B-w*I)+W*(1.0-(T*H+U*I)));n=X*(T*I+w*B)+W*(s*I-w*H)+_*(1.0-(T*H+s*B));i=+g[b+380>>2];G=+g[b+384>>2];C=+g[b+388>>2];o=(T*I-w*B)*C+(G*(T*B+w*I)+i*(1.0-(s*B+U*I)));q=(s*I+w*H)*C+(i*(T*B-w*I)+G*(1.0-(T*H+U*I)));r=i*(T*I+w*B)+G*(s*I-w*H)+C*(1.0-(T*H+s*B));R=+g[b+396>>2];E=+g[b+400>>2];A=+g[b+404>>2];S=(1.0-(s*B+U*I))*R+(T*B+w*I)*E+(T*I-w*B)*A;U=(T*B-w*I)*R+(1.0-(T*H+U*I))*E+(s*I+w*H)*A;B=(T*I+w*B)*R+(s*I-w*H)*E+(1.0-(T*H+s*B))*A;s=+g[b+300>>2];H=+g[b+316>>2];T=+g[b+332>>2];w=+g[b+304>>2];I=+g[b+320>>2];V=+g[b+336>>2];F=+g[b+308>>2];J=+g[b+324>>2];z=+g[b+340>>2];y=-+g[b+348>>2];ba=-+g[b+352>>2];Z=-+g[b+356>>2];_=X*0.0+W*0.0+_*0.0+ +g[b+412>>2]+(n*(F*y+J*ba+z*Z)+(k*(s*y+H*ba+T*Z)+m*(w*y+I*ba+V*Z)));C=i*0.0+G*0.0+C*0.0+ +g[b+416>>2]+(r*(F*y+J*ba+z*Z)+(o*(s*y+H*ba+T*Z)+q*(w*y+I*ba+V*Z)));Z=R*0.0+E*0.0+A*0.0+ +g[b+420>>2]+(B*(F*y+J*ba+z*Z)+(S*(s*y+H*ba+T*Z)+U*(w*y+I*ba+V*Z)));ba=+g[Q+128>>2];y=+g[M>>2];A=+g[Q+128+8>>2];E=+g[Q+128+16>>2];R=+g[Q+128+20>>2];G=+g[N>>2];i=+g[Q+128+32>>2];W=+g[Q+128+36>>2];X=+g[Q+128+40>>2];Y=A*Z+(ba*_+y*C)+ +g[Q+128+48>>2];$=E*_+C*R+Z*G+ +g[Q+128+52>>2];aa=_*i+C*W+Z*X+ +g[Q+128+56>>2];g[Q+64>>2]=(k*s+m*w+n*F)*ba+(o*s+q*w+r*F)*y+(S*s+U*w+B*F)*A;g[Q+64+4>>2]=(k*H+m*I+n*J)*ba+(o*H+q*I+r*J)*y+(S*H+U*I+B*J)*A;g[Q+64+8>>2]=(k*T+m*V+n*z)*ba+(o*T+q*V+r*z)*y+(S*T+U*V+B*z)*A;g[Q+64+12>>2]=0.0;g[Q+64+16>>2]=(k*s+m*w+n*F)*E+(o*s+q*w+r*F)*R+(S*s+U*w+B*F)*G;g[Q+64+20>>2]=(k*H+m*I+n*J)*E+(o*H+q*I+r*J)*R+(S*H+U*I+B*J)*G;g[Q+64+24>>2]=(k*T+m*V+n*z)*E+(o*T+q*V+r*z)*R+(S*T+U*V+B*z)*G;g[Q+64+28>>2]=0.0;g[Q+64+32>>2]=(k*s+m*w+n*F)*i+(o*s+q*w+r*F)*W+(S*s+U*w+B*F)*X;g[Q+64+36>>2]=(k*H+m*I+n*J)*i+(o*H+q*I+r*J)*W+(S*H+U*I+B*J)*X;g[Q+64+40>>2]=(k*T+m*V+n*z)*i+(o*T+q*V+r*z)*W+(S*T+U*V+B*z)*X;g[Q+64+44>>2]=0.0;g[Q+64+48>>2]=Y;g[Q+64+52>>2]=$;g[Q+64+56>>2]=aa;g[Q+64+60>>2]=0.0;aa=(S*s+U*w+B*F)*-Z+((k*s+m*w+n*F)*-_+(o*s+q*w+r*F)*-C);$=(S*H+U*I+B*J)*-Z+((k*H+m*I+n*J)*-_+(o*H+q*I+r*J)*-C);C=(S*T+U*V+B*z)*-Z+((k*T+m*V+n*z)*-_+(o*T+q*V+r*z)*-C);_=+g[Q+192>>2];Z=+g[O>>2];Y=+g[Q+192+8>>2];X=+g[Q+192+16>>2];W=+g[Q+192+20>>2];i=+g[P>>2];G=+g[Q+192+32>>2];R=+g[Q+192+36>>2];E=+g[Q+192+40>>2];A=aa*_+$*Z+C*Y+ +g[Q+192+48>>2];y=aa*X+$*W+C*i+ +g[Q+192+52>>2];C=aa*G+$*R+C*E+ +g[Q+192+56>>2];g[Q>>2]=(k*s+m*w+n*F)*_+(k*H+m*I+n*J)*Z+(k*T+m*V+n*z)*Y;g[Q+4>>2]=(o*s+q*w+r*F)*_+(o*H+q*I+r*J)*Z+(o*T+q*V+r*z)*Y;g[Q+8>>2]=(S*s+U*w+B*F)*_+(S*H+U*I+B*J)*Z+(S*T+U*V+B*z)*Y;g[Q+12>>2]=0.0;g[Q+16>>2]=(k*s+m*w+n*F)*X+(k*H+m*I+n*J)*W+(k*T+m*V+n*z)*i;g[Q+20>>2]=(o*s+q*w+r*F)*X+(o*H+q*I+r*J)*W+(o*T+q*V+r*z)*i;g[Q+24>>2]=(S*s+U*w+B*F)*X+(S*H+U*I+B*J)*W+(S*T+U*V+B*z)*i;g[Q+28>>2]=0.0;g[Q+32>>2]=(k*s+m*w+n*F)*G+(k*H+m*I+n*J)*R+(k*T+m*V+n*z)*E;g[Q+36>>2]=(o*s+q*w+r*F)*G+(o*H+q*I+r*J)*R+(o*T+q*V+r*z)*E;g[Q+40>>2]=(S*s+U*w+B*F)*G+(S*H+U*I+B*J)*R+(S*T+U*V+B*z)*E;g[Q+44>>2]=0.0;g[Q+48>>2]=A;g[Q+52>>2]=y;g[Q+56>>2]=C;g[Q+60>>2]=0.0;If(Q+352|0,Q+64|0,Q+424|0,Q+416|0);C=+g[Q+416>>2];y=1.0/f*+g[Q+424>>2]*C;A=1.0/f*C*+g[Q+424+4>>2];C=1.0/f*C*+g[Q+424+8>>2];If(Q+288|0,Q,Q+424|0,Q+416|0);E=+g[Q+416>>2];y=y-+g[Q+272>>2];A=A-+g[Q+272+4>>2];C=C-+g[Q+272+8>>2];z=1.0/f*+g[Q+424>>2]*E-+g[Q+256>>2];B=1.0/f*E*+g[Q+424+4>>2]-+g[Q+256+4>>2];E=1.0/f*E*+g[Q+424+8>>2]-+g[Q+256+8>>2];if(y*y+A*A+C*C>1.1920928955078125e-07){s=1.0/+D(+(y*y+A*A+C*C));P=c[b+28>>2]|0;o=y*s*(+g[P+324>>2]*y*s+A*s*+g[P+340>>2]+C*s*+g[P+356>>2])+A*s*(y*s*+g[P+328>>2]+A*s*+g[P+344>>2]+C*s*+g[P+360>>2])+C*s*(y*s*+g[P+332>>2]+A*s*+g[P+348>>2]+C*s*+g[P+364>>2]);k=y*s;n=A*s;s=C*s}else{o=0.0;k=0.0;n=0.0;s=0.0}if(z*z+B*B+E*E>1.1920928955078125e-07){r=1.0/+D(+(z*z+B*B+E*E));P=c[b+32>>2]|0;q=z*r*(+g[P+324>>2]*z*r+B*r*+g[P+340>>2]+E*r*+g[P+356>>2])+B*r*(z*r*+g[P+328>>2]+B*r*+g[P+344>>2]+E*r*+g[P+360>>2])+E*r*(z*r*+g[P+332>>2]+B*r*+g[P+348>>2]+E*r*+g[P+364>>2]);i=z*r;m=B*r;r=E*r}else{q=0.0;i=0.0;m=0.0;r=0.0}w=o*k+q*i;k=o*n+q*m;i=o*s+q*r;if(w*w+k*k+i*i>1.1920928955078125e-07){n=1.0/+D(+(w*w+k*k+i*i));p=c[b+28>>2]|0;m=w*n*(+g[p+324>>2]*w*n+k*n*+g[p+340>>2]+i*n*+g[p+356>>2])+k*n*(w*n*+g[p+328>>2]+k*n*+g[p+344>>2]+i*n*+g[p+360>>2])+i*n*(w*n*+g[p+332>>2]+k*n*+g[p+348>>2]+i*n*+g[p+364>>2]);h=c[b+32>>2]|0;n=w*n*(w*n*+g[h+324>>2]+k*n*+g[h+340>>2]+i*n*+g[h+356>>2])+k*n*(w*n*+g[h+328>>2]+k*n*+g[h+344>>2]+i*n*+g[h+360>>2])+i*n*(w*n*+g[h+332>>2]+k*n*+g[h+348>>2]+i*n*+g[h+364>>2]);w=(y*m-z*n)*(1.0/((m+n)*(m+n)));i=(A*m-B*n)*(1.0/((m+n)*(m+n)));n=(C*m-E*n)*(1.0/((m+n)*(m+n)));k=+g[b+572>>2];if(!(k>=0.0))k=w;else{m=(a[b+553>>0]|0)==0?k:k/m;q=+g[b+576>>2];r=+g[b+580>>2];s=+g[b+584>>2];o=+D(+((w+q)*(w+q)+(i+r)*(i+r)+(n+s)*(n+s)));if(o>m){k=m*(w+q)*(1.0/o)-q;n=m*(n+s)*(1.0/o)-s;i=m*(i+r)*(1.0/o)-r}else k=w;g[b+576>>2]=k+q;g[b+580>>2]=i+r;g[b+584>>2]=n+s}o=+D(+(k*k+i*i+n*n));m=k*(1.0/o);k=i*(1.0/o);i=n*(1.0/o);if(c[d+240>>2]|0){ba=m*+g[p+356>>2]+k*+g[p+360>>2]+i*+g[p+364>>2];aa=m*+g[p+340>>2]+k*+g[p+344>>2]+i*+g[p+348>>2];$=m*+g[p+324>>2]+k*+g[p+328>>2]+i*+g[p+332>>2];Z=o*0.0*+g[d+116>>2];_=o*0.0*+g[d+120>>2];g[d+64>>2]=o*0.0*+g[d+112>>2]+ +g[d+64>>2];g[d+68>>2]=Z+ +g[d+68>>2];g[d+72>>2]=_+ +g[d+72>>2];aa=aa*o*+g[d+100>>2];ba=ba*o*+g[d+104>>2];g[d+80>>2]=$*o*+g[d+96>>2]+ +g[d+80>>2];g[d+84>>2]=aa+ +g[d+84>>2];g[d+88>>2]=ba+ +g[d+88>>2];h=c[b+32>>2]|0}if(c[e+240>>2]|0){ba=m*+g[h+356>>2]+k*+g[h+360>>2]+i*+g[h+364>>2];aa=m*+g[h+340>>2]+k*+g[h+344>>2]+i*+g[h+348>>2];$=m*+g[h+324>>2]+k*+g[h+328>>2]+i*+g[h+332>>2];Z=o*-0.0*+g[e+116>>2];_=o*-0.0*+g[e+120>>2];g[e+64>>2]=o*-0.0*+g[e+112>>2]+ +g[e+64>>2];g[e+68>>2]=Z+ +g[e+68>>2];g[e+72>>2]=_+ +g[e+72>>2];aa=aa*+g[e+100>>2]*-o;ba=ba*+g[e+104>>2]*-o;g[e+80>>2]=$*+g[e+96>>2]*-o+ +g[e+80>>2];g[e+84>>2]=aa+ +g[e+84>>2];g[e+88>>2]=ba+ +g[e+88>>2]}}K=d+80|0;p=d+196|0;L=d+84|0;t=d+200|0;M=d+88|0;u=e+192|0;N=e+80|0;v=e+196|0;O=e+84|0;x=e+200|0;P=e+88|0;h=d+192|0}while(0);z=+g[h>>2]+ +g[K>>2];y=+g[p>>2]+ +g[L>>2];w=+g[t>>2]+ +g[M>>2];s=+g[u>>2]+ +g[N>>2];r=+g[v>>2]+ +g[O>>2];q=+g[x>>2]+ +g[P>>2];if(a[b+526>>0]|0){k=+g[b+528>>2];i=k*+g[b+504>>2]*+g[b+432>>2]/f;m=+g[b+460>>2];n=+g[b+464>>2];o=+g[b+468>>2];if((s-z)*m+(r-y)*n+(q-w)*o>0.0)i=i+k*((s-z)*m+(r-y)*n+(q-w)*o)*+g[b+436>>2];aa=+g[b+516>>2];_=aa+i*+g[b+492>>2];g[Q+424>>2]=_;g[Q+416>>2]=0.0;h=c[(_>0.0?Q+424|0:Q+416|0)>>2]|0;c[b+516>>2]=h;aa=(c[j>>2]=h,+g[j>>2])-aa;_=+g[b+536>>2];$=+g[b+540>>2];i=+g[b+544>>2];k=aa*m-_*(aa*m*_+aa*n*$+aa*o*i);ba=aa*n-$*(aa*m*_+aa*n*$+aa*o*i);n=aa*o-i*(aa*m*_+aa*n*$+aa*o*i);i=+D(+(n*n+(k*k+ba*ba)));k=1.0/i*k;m=1.0/i*ba;n=1.0/i*n;h=c[b+28>>2]|0;if(c[d+240>>2]|0){ba=k*+g[h+356>>2]+m*+g[h+360>>2]+n*+g[h+364>>2];aa=k*+g[h+340>>2]+m*+g[h+344>>2]+n*+g[h+348>>2];$=k*+g[h+324>>2]+m*+g[h+328>>2]+n*+g[h+332>>2];Z=i*0.0*+g[d+116>>2];_=i*0.0*+g[d+120>>2];g[d+64>>2]=i*0.0*+g[d+112>>2]+ +g[d+64>>2];g[d+68>>2]=Z+ +g[d+68>>2];g[d+72>>2]=_+ +g[d+72>>2];aa=aa*i*+g[d+100>>2];ba=ba*i*+g[d+104>>2];g[K>>2]=$*i*+g[d+96>>2]+ +g[K>>2];g[L>>2]=aa+ +g[L>>2];g[M>>2]=ba+ +g[M>>2]}h=c[b+32>>2]|0;if(c[e+240>>2]|0){ba=k*+g[h+356>>2]+m*+g[h+360>>2]+n*+g[h+364>>2];aa=k*+g[h+340>>2]+m*+g[h+344>>2]+n*+g[h+348>>2];$=k*+g[h+324>>2]+m*+g[h+328>>2]+n*+g[h+332>>2];Z=i*-0.0*+g[e+116>>2];_=i*-0.0*+g[e+120>>2];g[e+64>>2]=i*-0.0*+g[e+112>>2]+ +g[e+64>>2];g[e+68>>2]=Z+ +g[e+68>>2];g[e+72>>2]=_+ +g[e+72>>2];aa=aa*+g[e+100>>2]*-i;ba=ba*+g[e+104>>2]*-i;g[N>>2]=$*+g[e+96>>2]*-i+ +g[N>>2];g[O>>2]=aa+ +g[O>>2];g[P>>2]=ba+ +g[P>>2]}}if(!(a[b+525>>0]|0)){l=Q;return}o=+g[b+532>>2];n=o*+g[b+508>>2]*+g[b+432>>2]/f;m=+g[b+476>>2];k=+g[b+480>>2];i=+g[b+484>>2];if((s-z)*m+(r-y)*k+(q-w)*i>0.0)n=n+o*((s-z)*m+(r-y)*k+(q-w)*i)*+g[b+436>>2];ba=+g[b+520>>2];n=ba+n*+g[b+496>>2];g[Q+424>>2]=n;g[Q+416>>2]=0.0;h=c[(n>0.0?Q+424|0:Q+416|0)>>2]|0;c[b+520>>2]=h;n=(c[j>>2]=h,+g[j>>2])-ba;h=c[b+28>>2]|0;if(c[d+240>>2]|0){ba=m*+g[h+356>>2]+k*+g[h+360>>2]+i*+g[h+364>>2];aa=m*+g[h+340>>2]+k*+g[h+344>>2]+i*+g[h+348>>2];i=m*+g[h+324>>2]+k*+g[h+328>>2]+i*+g[h+332>>2];m=n*0.0*+g[d+116>>2];k=n*0.0*+g[d+120>>2];g[d+64>>2]=n*0.0*+g[d+112>>2]+ +g[d+64>>2];g[d+68>>2]=m+ +g[d+68>>2];g[d+72>>2]=k+ +g[d+72>>2];k=aa*n*+g[d+100>>2];m=ba*n*+g[d+104>>2];g[K>>2]=i*n*+g[d+96>>2]+ +g[K>>2];g[L>>2]=k+ +g[L>>2];g[M>>2]=m+ +g[M>>2];m=+g[b+476>>2];k=+g[b+480>>2];i=+g[b+484>>2]}h=c[b+32>>2]|0;if(!(c[e+240>>2]|0)){l=Q;return}ba=m*+g[h+356>>2]+k*+g[h+360>>2]+i*+g[h+364>>2];aa=m*+g[h+340>>2]+k*+g[h+344>>2]+i*+g[h+348>>2];$=m*+g[h+324>>2]+k*+g[h+328>>2]+i*+g[h+332>>2];Z=n*-0.0*+g[e+116>>2];_=n*-0.0*+g[e+120>>2];g[e+64>>2]=n*-0.0*+g[e+112>>2]+ +g[e+64>>2];g[e+68>>2]=Z+ +g[e+68>>2];g[e+72>>2]=_+ +g[e+72>>2];aa=aa*+g[e+100>>2]*-n;ba=ba*+g[e+104>>2]*-n;g[N>>2]=$*+g[e+96>>2]*-n+ +g[N>>2];g[O>>2]=aa+ +g[O>>2];g[P>>2]=ba+ +g[P>>2];l=Q;return}function pc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0.0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0.0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,M=0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0,Z=0.0,_=0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0,fa=0.0,ga=0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0.0,oa=0.0,pa=0.0,qa=0.0,ra=0.0,sa=0.0,ta=0.0,ua=0.0,va=0.0,wa=0.0,xa=0.0,ya=0.0,za=0.0,Aa=0,Ba=0.0,Ca=0.0,Da=0.0,Ea=0;Ea=l;l=l+528|0;c[Ea+56>>2]=c[b>>2];c[Ea+8>>2]=c[b+64>>2];k=Ea+56+4|0;c[k>>2]=c[b+4>>2];c[Ea+8+4>>2]=c[b+68>>2];c[Ea+56+8>>2]=c[b+8>>2];c[Ea+8+8>>2]=c[b+72>>2];c[Ea+56+16>>2]=c[b+16>>2];c[Ea+8+16>>2]=c[b+80>>2];c[Ea+56+20>>2]=c[b+20>>2];c[Ea+8+20>>2]=c[b+84>>2];c[Ea+56+24>>2]=c[b+24>>2];c[Ea+8+24>>2]=c[b+88>>2];c[Ea+56+32>>2]=c[b+32>>2];c[Ea+8+32>>2]=c[b+96>>2];c[Ea+56+36>>2]=c[b+36>>2];c[Ea+8+36>>2]=c[b+100>>2];c[Ea+56+40>>2]=c[b+40>>2];c[Ea+8+40>>2]=c[b+104>>2];Aa=c[a+4>>2]|0;ia=+g[Aa+32>>2];ja=+g[Aa+36>>2];ma=+g[Aa+40>>2];ka=+nb[c[(c[Aa>>2]|0)+48>>2]&15](Aa);la=+nb[c[(c[Aa>>2]|0)+48>>2]&15](Aa);ma=(ma+ +nb[c[(c[Aa>>2]|0)+48>>2]&15](Aa))*2.0;Aa=c[a+8>>2]|0;qa=+g[Aa+32>>2];ra=+g[Aa+36>>2];wa=+g[Aa+40>>2];ta=+nb[c[(c[Aa>>2]|0)+48>>2]&15](Aa);sa=+nb[c[(c[Aa>>2]|0)+48>>2]&15](Aa);wa=(wa+ +nb[c[(c[Aa>>2]|0)+48>>2]&15](Aa))*2.0;R=+g[b+112>>2]-+g[b+48>>2];S=+g[b+116>>2]-+g[b+52>>2];T=+g[b+120>>2]-+g[b+56>>2];da=+g[Ea+56>>2];ba=+g[Ea+56+16>>2];ca=+g[Ea+56+32>>2];aa=+g[k>>2];Z=+g[Ea+56+20>>2];$=+g[Ea+56+36>>2];fa=+g[Ea+56+8>>2];ha=+g[Ea+56+24>>2];na=+g[Ea+56+40>>2];g[Ea+412>>2]=(ia+ka)*2.0*.5;g[Ea+412+4>>2]=(ja+la)*2.0*.5;g[Ea+412+8>>2]=ma*.5;g[Ea+400>>2]=(qa+ta)*2.0*.5;g[Ea+400+4>>2]=(ra+sa)*2.0*.5;g[Ea+400+8>>2]=wa*.5;za=+g[Ea+8>>2];pa=+g[Ea+8+16>>2];va=+g[Ea+8+32>>2];ya=+g[Ea+8+4>>2];oa=+g[Ea+8+20>>2];ua=+g[Ea+8+36>>2];xa=+g[Ea+8+8>>2];Ba=+g[Ea+8+24>>2];Ca=+g[Ea+8+40>>2];B=+C(+(da*za+ba*pa+ca*va));O=+C(+(da*ya+ba*oa+ca*ua));U=+C(+(da*xa+ba*Ba+ca*Ca));N=+C(+(za*aa+pa*Z+va*$));P=+C(+(ya*aa+oa*Z+ua*$));V=+C(+(xa*aa+Ba*Z+Ca*$));W=+C(+(za*fa+pa*ha+va*na));X=+C(+(ya*fa+oa*ha+ua*na));Q=+C(+(xa*fa+Ba*ha+Ca*na));i=+C(+(R*da+S*ba+T*ca))-(wa*.5*U+((ia+ka)*2.0*.5+B*(qa+ta)*2.0*.5+O*(ra+sa)*2.0*.5));if(i>0.0){l=Ea;return}if(i>-3402823466385288598117041.0e14){a=Ea+56|0;e=1;f=R*da+S*ba+T*ca<0.0&1}else{a=0;e=0;f=0;i=-3402823466385288598117041.0e14}h=+C(+(R*aa+S*Z+T*$))-((ja+la)*2.0*.5+N*(qa+ta)*2.0*.5+P*(ra+sa)*2.0*.5+V*wa*.5);if(h>0.0){l=Ea;return}if(h>i){a=k;e=2;f=R*aa+S*Z+T*$<0.0&1;i=h}h=+C(+(R*fa+S*ha+T*na))-(ma*.5+W*(qa+ta)*2.0*.5+X*(ra+sa)*2.0*.5+Q*wa*.5);if(h>0.0){l=Ea;return}if(h>i){a=Ea+56+8|0;e=3;f=R*fa+S*ha+T*na<0.0&1;i=h}h=+C(+(R*za+S*pa+T*va))-((qa+ta)*2.0*.5+(B*(ia+ka)*2.0*.5+N*(ja+la)*2.0*.5+W*ma*.5));if(h>0.0){l=Ea;return}if(h>i){a=Ea+8|0;e=4;f=R*za+S*pa+T*va<0.0&1;i=h}h=+C(+(R*ya+S*oa+T*ua))-((ra+sa)*2.0*.5+(O*(ia+ka)*2.0*.5+P*(ja+la)*2.0*.5+X*ma*.5));if(h>0.0){l=Ea;return}if(h>i){a=Ea+8+4|0;e=5;f=R*ya+S*oa+T*ua<0.0&1;i=h}h=+C(+(R*xa+S*Ba+T*Ca))-(wa*.5+(U*(ia+ka)*2.0*.5+V*(ja+la)*2.0*.5+Q*ma*.5));if(h>0.0){l=Ea;return}if(h>i){a=Ea+8+8|0;e=6;f=R*xa+S*Ba+T*Ca<0.0&1;i=h}h=(R*fa+S*ha+T*na)*(za*aa+pa*Z+va*$)-(R*aa+S*Z+T*$)*(za*fa+pa*ha+va*na);n=+C(+h)-((W+9.999999747378752e-06)*(ja+la)*2.0*.5+(N+9.999999747378752e-06)*ma*.5+(U+9.999999747378752e-06)*(ra+sa)*2.0*.5+(O+9.999999747378752e-06)*wa*.5);if(n>1.1920928955078125e-07){l=Ea;return}s=(za*fa+pa*ha+va*na)*(za*fa+pa*ha+va*na)+0.0;x=(za*aa+pa*Z+va*$)*(za*aa+pa*Z+va*$);q=+D(+(x+s));if(q>1.1920928955078125e-07?n/q*1.0499999523162842>i:0){a=0;e=7;f=h<0.0&1;i=n/q;p=0.0/q;o=-(za*fa+pa*ha+va*na)/q;h=(za*aa+pa*Z+va*$)/q}else{p=0.0;o=0.0;h=0.0}n=(R*fa+S*ha+T*na)*(ya*aa+oa*Z+ua*$)-(R*aa+S*Z+T*$)*(ya*fa+oa*ha+ua*na);q=+C(+n)-((X+9.999999747378752e-06)*(ja+la)*2.0*.5+(P+9.999999747378752e-06)*ma*.5+(U+9.999999747378752e-06)*(qa+ta)*2.0*.5+(B+9.999999747378752e-06)*wa*.5);if(q>1.1920928955078125e-07){l=Ea;return}t=(ya*fa+oa*ha+ua*na)*(ya*fa+oa*ha+ua*na)+0.0;y=(ya*aa+oa*Z+ua*$)*(ya*aa+oa*Z+ua*$);r=+D(+(y+t));if(r>1.1920928955078125e-07?q/r*1.0499999523162842>i:0){a=0;e=8;f=n<0.0&1;i=q/r;p=0.0/r;o=-(ya*fa+oa*ha+ua*na)/r;h=(ya*aa+oa*Z+ua*$)/r}n=(R*fa+S*ha+T*na)*(xa*aa+Ba*Z+Ca*$)-(R*aa+S*Z+T*$)*(xa*fa+Ba*ha+Ca*na);q=+C(+n)-((Q+9.999999747378752e-06)*(ja+la)*2.0*.5+(V+9.999999747378752e-06)*ma*.5+(O+9.999999747378752e-06)*(qa+ta)*2.0*.5+(B+9.999999747378752e-06)*(ra+sa)*2.0*.5);if(q>1.1920928955078125e-07){l=Ea;return}v=(xa*fa+Ba*ha+Ca*na)*(xa*fa+Ba*ha+Ca*na)+0.0;z=(xa*aa+Ba*Z+Ca*$)*(xa*aa+Ba*Z+Ca*$);r=+D(+(z+v));if(r>1.1920928955078125e-07?q/r*1.0499999523162842>i:0){a=0;e=9;f=n<0.0&1;i=q/r;p=0.0/r;o=-(xa*fa+Ba*ha+Ca*na)/r;h=(xa*aa+Ba*Z+Ca*$)/r}n=(R*da+S*ba+T*ca)*(za*fa+pa*ha+va*na)-(R*fa+S*ha+T*na)*(da*za+ba*pa+ca*va);q=+C(+n)-((W+9.999999747378752e-06)*(ia+ka)*2.0*.5+(B+9.999999747378752e-06)*ma*.5+(V+9.999999747378752e-06)*(ra+sa)*2.0*.5+(P+9.999999747378752e-06)*wa*.5);if(q>1.1920928955078125e-07){l=Ea;return}w=(da*za+ba*pa+ca*va)*(da*za+ba*pa+ca*va);r=+D(+(w+s));do if(r>1.1920928955078125e-07){if(!(q/r*1.0499999523162842>i))break;a=0;e=10;f=n<0.0&1;i=q/r;p=(za*fa+pa*ha+va*na)/r;o=0.0/r;h=-(da*za+ba*pa+ca*va)/r}while(0);n=(R*da+S*ba+T*ca)*(ya*fa+oa*ha+ua*na)-(R*fa+S*ha+T*na)*(da*ya+ba*oa+ca*ua);q=+C(+n)-((X+9.999999747378752e-06)*(ia+ka)*2.0*.5+(O+9.999999747378752e-06)*ma*.5+(V+9.999999747378752e-06)*(qa+ta)*2.0*.5+(N+9.999999747378752e-06)*wa*.5);if(q>1.1920928955078125e-07){l=Ea;return}u=(da*ya+ba*oa+ca*ua)*(da*ya+ba*oa+ca*ua);r=+D(+(u+t));do if(r>1.1920928955078125e-07){if(!(q/r*1.0499999523162842>i))break;a=0;e=11;f=n<0.0&1;i=q/r;p=(ya*fa+oa*ha+ua*na)/r;o=0.0/r;h=-(da*ya+ba*oa+ca*ua)/r}while(0);n=(R*da+S*ba+T*ca)*(xa*fa+Ba*ha+Ca*na)-(R*fa+S*ha+T*na)*(da*xa+ba*Ba+ca*Ca);q=+C(+n)-((Q+9.999999747378752e-06)*(ia+ka)*2.0*.5+(U+9.999999747378752e-06)*ma*.5+(P+9.999999747378752e-06)*(qa+ta)*2.0*.5+(N+9.999999747378752e-06)*(ra+sa)*2.0*.5);if(q>1.1920928955078125e-07){l=Ea;return}s=(da*xa+ba*Ba+ca*Ca)*(da*xa+ba*Ba+ca*Ca);r=+D(+(s+v));do if(r>1.1920928955078125e-07){if(!(q/r*1.0499999523162842>i))break;a=0;e=12;f=n<0.0&1;i=q/r;p=(xa*fa+Ba*ha+Ca*na)/r;o=0.0/r;h=-(da*xa+ba*Ba+ca*Ca)/r}while(0);q=(R*aa+S*Z+T*$)*(da*za+ba*pa+ca*va)-(R*da+S*ba+T*ca)*(za*aa+pa*Z+va*$);n=+C(+q)-((N+9.999999747378752e-06)*(ia+ka)*2.0*.5+(B+9.999999747378752e-06)*(ja+la)*2.0*.5+(Q+9.999999747378752e-06)*(ra+sa)*2.0*.5+(X+9.999999747378752e-06)*wa*.5);if(n>1.1920928955078125e-07){l=Ea;return}r=+D(+(w+x+0.0));do if(r>1.1920928955078125e-07){if(!(n/r*1.0499999523162842>i))break;a=0;e=13;f=q<0.0&1;i=n/r;p=-(za*aa+pa*Z+va*$)/r;o=(da*za+ba*pa+ca*va)/r;h=0.0/r}while(0);r=(R*aa+S*Z+T*$)*(da*ya+ba*oa+ca*ua)-(R*da+S*ba+T*ca)*(ya*aa+oa*Z+ua*$);n=+C(+r)-((P+9.999999747378752e-06)*(ia+ka)*2.0*.5+(O+9.999999747378752e-06)*(ja+la)*2.0*.5+(Q+9.999999747378752e-06)*(qa+ta)*2.0*.5+(W+9.999999747378752e-06)*wa*.5);if(n>1.1920928955078125e-07){l=Ea;return}q=+D(+(u+y+0.0));do if(q>1.1920928955078125e-07){if(!(n/q*1.0499999523162842>i))break;a=0;e=14;f=r<0.0&1;i=n/q;p=-(ya*aa+oa*Z+ua*$)/q;o=(da*ya+ba*oa+ca*ua)/q;h=0.0/q}while(0);r=(R*aa+S*Z+T*$)*(da*xa+ba*Ba+ca*Ca)-(R*da+S*ba+T*ca)*(xa*aa+Ba*Z+Ca*$);n=+C(+r)-((V+9.999999747378752e-06)*(ia+ka)*2.0*.5+(U+9.999999747378752e-06)*(ja+la)*2.0*.5+(X+9.999999747378752e-06)*(qa+ta)*2.0*.5+(W+9.999999747378752e-06)*(ra+sa)*2.0*.5);if(n>1.1920928955078125e-07){l=Ea;return}q=+D(+(s+z+0.0));do if(q>1.1920928955078125e-07){if(!(n/q*1.0499999523162842>i)){Aa=55;break}e=15;f=r<0.0&1;i=n/q;p=-(xa*aa+Ba*Z+Ca*$)/q;o=(da*xa+ba*Ba+ca*Ca)/q;h=0.0/q;Aa=58}else Aa=55;while(0);do if((Aa|0)==55){if(!e){l=Ea;return}if(!a){Aa=58;break}m=c[a>>2]|0;c[Ea>>2]=m;ga=c[a+16>>2]|0;n=(c[j>>2]=m,+g[j>>2]);m=e;B=i;e=ga;i=(c[j>>2]=ga,+g[j>>2]);h=+g[a+32>>2]}while(0);if((Aa|0)==58){n=p*+g[Ea+56>>2]+o*+g[k>>2]+h*fa;g[Ea>>2]=n;Da=p*+g[Ea+56+16>>2]+o*+g[Ea+56+20>>2]+h*ha;m=e;B=i;e=(g[j>>2]=Da,c[j>>2]|0);i=Da;h=p*+g[Ea+56+32>>2]+o*+g[Ea+56+36>>2]+h*na}if(!f)Da=h;else{n=-n;g[Ea>>2]=n;Da=-h;e=(g[j>>2]=-i,c[j>>2]|0)}if((m|0)>6){z=(c[j>>2]=e,+g[j>>2]);i=+g[Ea+56>>2];t=+g[Ea+56+16>>2];v=+g[Ea+56+32>>2];u=(n*i+z*t+Da*v>0.0?1.0:-1.0)*(ia+ka)*2.0*.5;y=+g[k>>2];x=+g[Ea+56+20>>2];h=+g[Ea+56+36>>2];s=(n*y+z*x+Da*h>0.0?1.0:-1.0)*(ja+la)*2.0*.5;w=(n*fa+z*ha+Da*na>0.0?1.0:-1.0)*ma*.5;y=+g[b+48>>2]+u*i+s*y+w*fa;x=+g[b+52>>2]+u*t+s*x+w*ha;w=+g[b+56>>2]+u*v+s*h+w*na;c[Ea+456>>2]=c[b+112>>2];c[Ea+456+4>>2]=c[b+112+4>>2];c[Ea+456+8>>2]=c[b+112+8>>2];h=(n*za+z*pa+Da*va>0.0?-1.0:1.0)*(qa+ta)*2.0*.5;s=(n*ya+z*oa+Da*ua>0.0?-1.0:1.0)*(ra+sa)*2.0*.5;v=+g[Ea+456+4>>2]+h*pa+s*oa;u=+g[Ea+456+8>>2]+h*va+s*ua;t=(n*xa+z*Ba+Da*Ca>0.0?-1.0:1.0)*wa*.5;s=+g[Ea+456>>2]+h*za+s*ya+t*xa;g[Ea+456>>2]=s;g[Ea+456+4>>2]=v+t*Ba;g[Ea+456+8>>2]=u+t*Ca;Aa=m+-7|0;h=+g[Ea+56+(((Aa|0)/3|0)<<2)>>2];i=+g[Ea+56+(((Aa|0)/3|0)+4<<2)>>2];n=+g[Ea+56+(((Aa|0)/3|0)+8<<2)>>2];p=+g[Ea+8+(((Aa|0)%3|0)<<2)>>2];q=+g[Ea+8+(((Aa|0)%3|0)+4<<2)>>2];r=+g[Ea+8+(((Aa|0)%3|0)+8<<2)>>2];o=1.0-(h*p+i*q+n*r)*(h*p+i*q+n*r);if(!(o<=9.999999747378752e-05))h=(((s-y)*h+(v+t*Ba-x)*i+(u+t*Ca-w)*n)*(h*p+i*q+n*r)-((s-y)*p+(v+t*Ba-x)*q+(u+t*Ca-w)*r))*(1.0/o);else h=0.0;g[Ea+456>>2]=s+h*p;g[Ea+456+4>>2]=v+t*Ba+h*q;g[Ea+456+8>>2]=u+t*Ca+h*r;Aa=c[(c[d>>2]|0)+16>>2]|0;g[Ea+424>>2]=-+g[Ea>>2];g[Ea+424+4>>2]=-z;g[Ea+424+8>>2]=-Da;g[Ea+424+12>>2]=0.0;Tb[Aa&15](d,Ea+424|0,Ea+456|0,B);l=Ea;return}ea=(m|0)<4;ga=ea?b+48|0:b+112|0;f=ea?b+112|0:b+48|0;a=ea?Ea+56|0:Ea+8|0;_=ea?Ea+8|0:Ea+56|0;M=ea?Ea+412|0:Ea+400|0;k=ea?Ea+400|0:Ea+412|0;fa=(c[j>>2]=e,+g[j>>2]);if(ea){da=Da;ba=n;ca=fa}else{da=-Da;ba=-n;ca=-fa}U=ba*+g[_>>2]+ca*+g[_+16>>2]+da*+g[_+32>>2];g[Ea+384>>2]=U;V=ba*+g[_+4>>2]+ca*+g[_+20>>2]+da*+g[_+36>>2];g[Ea+384+4>>2]=V;W=ba*+g[_+8>>2]+ca*+g[_+24>>2]+da*+g[_+40>>2];g[Ea+384+8>>2]=W;U=+C(+U);V=+C(+V);W=+C(+W);e=V>U?(V>W?1:2):U>W?0:2;Y=(V>U?V>W:U>W)?2:1;n=+g[k+(e<<2)>>2];h=+g[f>>2]-+g[ga>>2];i=n*+g[_+(e<<2)>>2];o=+g[f+4>>2];p=+g[ga+4>>2];if(+g[Ea+384+(e<<2)>>2]<0.0){aa=+g[f+8>>2]-+g[ga+8>>2]+n*+g[_+((e|8)<<2)>>2];$=h+i;Z=o-p+n*+g[_+((e|4)<<2)>>2]}else{aa=+g[f+8>>2]-+g[ga+8>>2]-n*+g[_+((e|8)<<2)>>2];$=h-i;Z=o-p-n*+g[_+((e|4)<<2)>>2]}J=(ea?-1:-4)+m|0;switch(J|0){case 0:{e=2;f=1;break}case 1:{e=2;f=0;break}default:{e=1;f=0}}K=a+(f<<2)|0;T=+g[K>>2];R=+g[K+16>>2];S=+g[K+32>>2];X=$*T+Z*R+aa*S;K=a+(e<<2)|0;N=+g[K>>2];v=+g[K+16>>2];w=+g[K+32>>2];Q=$*N+Z*v+aa*w;K=_+((U>W&(V>U^1)&1)<<2)|0;P=+g[K>>2];z=+g[K+16>>2];B=+g[K+32>>2];O=+g[_+(Y<<2)>>2];x=+g[_+(Y<<2)+16>>2];y=+g[_+(Y<<2)+32>>2];Ba=+g[k+((U>W&(V>U^1)&1)<<2)>>2];Ca=+g[k+(Y<<2)>>2];za=(T*O+R*x+S*y)*Ca;Ca=(N*O+v*x+w*y)*Ca;g[Ea+352>>2]=X-(T*P+R*z+S*B)*Ba-za;g[Ea+352+4>>2]=Q-(N*P+v*z+w*B)*Ba-Ca;g[Ea+352+8>>2]=X-(T*P+R*z+S*B)*Ba+za;g[Ea+352+12>>2]=Q-(N*P+v*z+w*B)*Ba+Ca;g[Ea+352+16>>2]=X+(T*P+R*z+S*B)*Ba+za;g[Ea+352+20>>2]=Q+(N*P+v*z+w*B)*Ba+Ca;g[Ea+352+24>>2]=X+(T*P+R*z+S*B)*Ba-za;g[Ea+352+28>>2]=Q+(N*P+v*z+w*B)*Ba-Ca;c[Ea+344>>2]=c[M+(f<<2)>>2];c[Ea+344+4>>2]=c[M+(e<<2)>>2];H=0;I=Ea+280|0;e=Ea+352|0;f=4;a:while(1){F=Ea+344+(H<<2)|0;G=1-H|0;do if((f|0)>0){a=I;E=e;k=0;while(1){m=E+(H<<2)|0;h=+g[m>>2];i=+g[F>>2];if(i>-h){c[a>>2]=c[E>>2];c[a+4>>2]=c[E+4>>2];k=k+1|0;if(k&8|0){e=I;f=k;break a}a=a+8|0;h=+g[m>>2];i=+g[F>>2]}A=(f|0)>1;m=E;E=E+8|0;b=A?E:e;n=+g[b+(H<<2)>>2];if(i>-h^i>-n){Ca=+g[m+(G<<2)>>2];g[a+(G<<2)>>2]=Ca+(-i-h)*((+g[b+(G<<2)>>2]-Ca)/(n-h));g[a+(H<<2)>>2]=-+g[F>>2];k=k+1|0;if(!(k&8))a=a+8|0;else{e=I;f=k;break a}}if(!A)break;else f=f+-1|0}e=(I|0)==(Ea+280|0)?Ea+456|0:Ea+280|0;if((k|0)<=0){f=0;break}a=e;E=I;f=0;while(1){m=E+(H<<2)|0;h=+g[m>>2];i=+g[F>>2];if(h>2]=c[E>>2];c[a+4>>2]=c[E+4>>2];f=f+1|0;if(f&8|0)break a;a=a+8|0;h=+g[m>>2];i=+g[F>>2]}A=(k|0)>1;m=E;E=E+8|0;b=A?E:I;n=+g[b+(H<<2)>>2];if(h>2];g[a+(G<<2)>>2]=Ca+(i-h)*((+g[b+(G<<2)>>2]-Ca)/(n-h));c[a+(H<<2)>>2]=c[F>>2];f=f+1|0;if(!(f&8))a=a+8|0;else break a}if(!A)break;else k=k+-1|0}}else{f=0;e=(I|0)==(Ea+280|0)?Ea+456|0:Ea+280|0}while(0);H=H+1|0;if((H|0)>=2)break;else I=(e|0)==(Ea+280|0)?Ea+456|0:Ea+280|0}if((e|0)!=(Ea+280|0))gi(Ea+280|0,e|0,f<<3|0)|0;if((f|0)>=1){u=1.0/((T*P+R*z+S*B)*(N*O+v*x+w*y)-(N*P+v*z+w*B)*(T*O+R*x+S*y));t=+g[M+(J<<2)>>2];p=+g[K>>2];q=+g[_+(Y<<2)>>2];r=+g[_+((U>W&(V>U^1)&1|4)<<2)>>2];s=+g[_+((Y|4)<<2)>>2];o=+g[_+((U>W&(V>U^1)&1|8)<<2)>>2];n=+g[_+((Y|8)<<2)>>2];b=0;a=0;do{e=a<<1;i=+g[Ea+280+(e<<2)>>2];h=+g[Ea+280+((e|1)<<2)>>2];ya=(N*O+v*x+w*y)*u*(i-X)-(T*O+R*x+S*y)*u*(h-Q);Ca=(T*P+R*z+S*B)*u*(h-Q)-(N*P+v*z+w*B)*u*(i-X);e=b*3|0;za=$+ya*p+Ca*q;g[Ea+184+(e<<2)>>2]=za;Ba=Z+ya*r+Ca*s;g[Ea+184+(e+1<<2)>>2]=Ba;Ca=aa+ya*o+Ca*n;g[Ea+184+(e+2<<2)>>2]=Ca;Ca=t-(ba*za+ca*Ba+da*Ca);g[Ea+152+(b<<2)>>2]=Ca;e=b<<1;if(Ca>=0.0){g[Ea+280+(e<<2)>>2]=i;g[Ea+280+((e|1)<<2)>>2]=h;b=b+1|0}a=a+1|0}while((a|0)!=(f|0));b:do if((b|0)>=1){A=(b|0)<4?b:4;E=(A|0)>1?A:1;if((b|0)<=(E|0))if(ea){h=-Da;e=0;while(1){Aa=e*3|0;g[Ea+456>>2]=+g[Ea+184+(Aa<<2)>>2]+ +g[ga>>2];g[Ea+456+4>>2]=+g[Ea+184+(Aa+1<<2)>>2]+ +g[ga+4>>2];g[Ea+456+8>>2]=+g[Ea+184+(Aa+2<<2)>>2]+ +g[ga+8>>2];Aa=c[(c[d>>2]|0)+16>>2]|0;g[Ea+424>>2]=-+g[Ea>>2];g[Ea+424+4>>2]=-fa;g[Ea+424+8>>2]=h;g[Ea+424+12>>2]=0.0;Tb[Aa&15](d,Ea+424|0,Ea+456|0,-+g[Ea+152+(e<<2)>>2]);e=e+1|0;if((e|0)==(b|0))break b}}else{h=-Da;e=0;while(1){Aa=e*3|0;Ca=+g[Ea+152+(e<<2)>>2];Ba=+g[Ea>>2];g[Ea+456>>2]=+g[Ea+184+(Aa<<2)>>2]+ +g[ga>>2]-Ba*Ca;g[Ea+456+4>>2]=+g[Ea+184+(Aa+1<<2)>>2]+ +g[ga+4>>2]-fa*Ca;g[Ea+456+8>>2]=+g[Ea+184+(Aa+2<<2)>>2]+ +g[ga+8>>2]-Da*Ca;Aa=c[(c[d>>2]|0)+16>>2]|0;g[Ea+424>>2]=-Ba;g[Ea+424+4>>2]=-fa;g[Ea+424+8>>2]=h;g[Ea+424+12>>2]=0.0;Tb[Aa&15](d,Ea+424|0,Ea+456|0,-Ca);e=e+1|0;if((e|0)==(b|0))break b}}c:do if((b|0)>1){h=+g[Ea+152>>2];e=0;f=1;while(1){i=+g[Ea+152+(f<<2)>>2];a=i>h;e=a?f:e;f=f+1|0;if((f|0)==(b|0))break;else h=a?i:h}switch(b|0){case 1:{f=1;a=Ea+120|0;k=Ea+120|0;Aa=111;break c}case 2:{h=(+g[Ea+280+4>>2]+ +g[Ea+280+12>>2])*.5;i=(+g[Ea+280>>2]+ +g[Ea+280+8>>2])*.5;f=2;a=Ea+120|0;k=Ea+120|0;Aa=114;break c}default:{}}a=b+-1|0;r=0.0;s=0.0;h=0.0;f=0;do{_=f<<1;ya=+g[Ea+280+(_<<2)>>2];za=+g[Ea+280+(_+3<<2)>>2];Ba=+g[Ea+280+(_+2<<2)>>2];Ca=+g[Ea+280+((_|1)<<2)>>2];h=h+(ya*za-Ba*Ca);s=s+(ya+Ba)*(ya*za-Ba*Ca);r=r+(za+Ca)*(ya*za-Ba*Ca);f=f+1|0}while((f|0)!=(a|0));_=b<<1;n=+g[Ea+280+(_+-2<<2)>>2];o=+g[Ea+280+4>>2];p=+g[Ea+280>>2];q=+g[Ea+280+(_+-1<<2)>>2];i=h+(n*o-p*q);_=+C(+i)>1.1920928955078125e-07;i=_?1.0/(i*3.0):999999984306749440.0;if((b|0)>0){h=i*(r+(n*o-p*q)*(q+o));i=i*(s+(n*o-p*q)*(n+p));a=Ea+120|0;k=Ea+120|0;m=Ea+456|0;Aa=117;break}m=e;e=Ea+120|0;f=0}else{e=0;f=b;a=Ea+120|0;k=Ea+120|0;Aa=111}while(0);if((Aa|0)==111){h=+g[Ea+280+4>>2];i=+g[Ea+280>>2];Aa=114}if((Aa|0)==114){b=f;m=Ea+456|0;Aa=117}if((Aa|0)==117){f=0;do{Aa=f<<1;g[Ea+456+(f<<2)>>2]=+L(+(+g[Ea+280+((Aa|1)<<2)>>2]-h),+(+g[Ea+280+(Aa<<2)>>2]-i));f=f+1|0}while((f|0)!=(b|0));f=0;do{c[Ea+424+(f<<2)>>2]=1;f=f+1|0}while((f|0)!=(b|0));m=e;e=a;f=1}a=Ea+424+(m<<2)|0;c[a>>2]=0;c[e>>2]=m;d:do if((A|0)>1){o=+g[Ea+456+(m<<2)>>2];if(f){f=1;a=Ea+120+4|0}else{e=1;f=Ea+120+4|0;while(1){c[f>>2]=m;c[a>>2]=0;e=e+1|0;if((e|0)==(E|0))break d;else f=f+4|0}}while(1){n=6.2831854820251465/+(E|0)*+(f|0)+o;n=n>3.1415927410125732?n+-6.2831854820251465:n;c[a>>2]=m;i=1.0e9;k=0;e=m;while(1){do if(!(c[Ea+424+(k<<2)>>2]|0))h=i;else{h=+C(+(+g[Ea+456+(k<<2)>>2]-n));h=h>3.1415927410125732?6.2831854820251465-h:h;if(!(h>2]=k;e=k}while(0);k=k+1|0;if((k|0)==(b|0))break;else i=h}c[Ea+424+(e<<2)>>2]=0;f=f+1|0;if((f|0)==(E|0))break;else a=a+4|0}}while(0);if((E|0)>0){h=-Da;if(ea){e=0;do{Aa=c[Ea+120+(e<<2)>>2]|0;g[Ea+456>>2]=+g[Ea+184+(Aa*3<<2)>>2]+ +g[ga>>2];g[Ea+456+4>>2]=+g[Ea+184+((Aa*3|0)+1<<2)>>2]+ +g[ga+4>>2];g[Ea+456+8>>2]=+g[Ea+184+((Aa*3|0)+2<<2)>>2]+ +g[ga+8>>2];ea=c[(c[d>>2]|0)+16>>2]|0;g[Ea+424>>2]=-+g[Ea>>2];g[Ea+424+4>>2]=-fa;g[Ea+424+8>>2]=h;g[Ea+424+12>>2]=0.0;Tb[ea&15](d,Ea+424|0,Ea+456|0,-+g[Ea+152+(Aa<<2)>>2]);e=e+1|0}while((e|0)<(E|0))}else{e=0;do{ea=c[Ea+120+(e<<2)>>2]|0;xa=+g[Ea+184+(ea*3<<2)>>2]+ +g[ga>>2];g[Ea+456>>2]=xa;za=+g[Ea+184+((ea*3|0)+1<<2)>>2]+ +g[ga+4>>2];g[Ea+456+4>>2]=za;Ba=+g[Ea+184+((ea*3|0)+2<<2)>>2]+ +g[ga+8>>2];g[Ea+456+8>>2]=Ba;Aa=c[(c[d>>2]|0)+16>>2]|0;ya=+g[Ea>>2];g[Ea+424>>2]=-ya;g[Ea+424+4>>2]=-fa;g[Ea+424+8>>2]=h;g[Ea+424+12>>2]=0.0;Ca=+g[Ea+152+(ea<<2)>>2];g[Ea+104>>2]=xa-ya*Ca;g[Ea+104+4>>2]=za-Ca*fa;g[Ea+104+8>>2]=Ba-Ca*Da;g[Ea+104+12>>2]=0.0;Tb[Aa&15](d,Ea+424|0,Ea+104|0,-Ca);e=e+1|0}while((e|0)<(E|0))}}}while(0)}l=Ea;return}function qc(b,d,e,f,h,i,j,k,m){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0.0,_=0.0,$=0.0,aa=0,ba=0;Y=l;l=l+256|0;c[b+188>>2]=-1;m=c[k+72>>2]|0;if((m|0)!=(c[b+224>>2]|0)){c[b+212>>2]=14;c[b+216>>2]=15;c[b+220>>2]=16;c[b+224>>2]=m}c[b+184>>2]=0;if((e|0)>0){m=0;do{c[(c[d+(m<<2)>>2]|0)+212>>2]=-1;m=m+1|0}while((m|0)!=(e|0))}m=c[b+12>>2]|0;if((m|0)>(e|0)){o=b+8|0;n=m}else{if((e+1|0)!=0?(c[6995]=(c[6995]|0)+1,n=sc(((e+1|0)*244|3)+16|0)|0,(n|0)!=0):0){c[(n+4+15&-16)+-4>>2]=n;o=n+4+15&-16}else o=0;n=c[b+8>>2]|0;if((n|0)>0){m=0;do{V=o+(m*244|0)|0;W=c[b+16>>2]|0;U=W+(m*244|0)|0;c[V>>2]=c[U>>2];c[V+4>>2]=c[U+4>>2];c[V+8>>2]=c[U+8>>2];c[V+12>>2]=c[U+12>>2];V=W+(m*244|0)+16|0;U=o+(m*244|0)+16|0;c[U>>2]=c[V>>2];c[U+4>>2]=c[V+4>>2];c[U+8>>2]=c[V+8>>2];c[U+12>>2]=c[V+12>>2];U=W+(m*244|0)+32|0;V=o+(m*244|0)+32|0;c[V>>2]=c[U>>2];c[V+4>>2]=c[U+4>>2];c[V+8>>2]=c[U+8>>2];c[V+12>>2]=c[U+12>>2];V=o+(m*244|0)+48|0;U=W+(m*244|0)+48|0;c[V>>2]=c[U>>2];c[V+4>>2]=c[U+4>>2];c[V+8>>2]=c[U+8>>2];c[V+12>>2]=c[U+12>>2];gi(o+(m*244|0)+64|0,W+(m*244|0)+64|0,180)|0;m=m+1|0}while((m|0)!=(n|0))}m=c[b+16>>2]|0;if(m|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[m+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=o;c[b+12>>2]=e+1;o=b+8|0;n=e+1|0}Yk(Y|0,0,244)|0;m=c[o>>2]|0;if((m|0)<0){if((n|0)<0){n=c[b+16>>2]|0;if(n|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=0;c[b+12>>2]=0}do{W=c[b+16>>2]|0;V=W+(m*244|0)|0;c[V>>2]=c[Y>>2];c[V+4>>2]=c[Y+4>>2];c[V+8>>2]=c[Y+8>>2];c[V+12>>2]=c[Y+12>>2];V=W+(m*244|0)+16|0;c[V>>2]=c[Y+16>>2];c[V+4>>2]=c[Y+16+4>>2];c[V+8>>2]=c[Y+16+8>>2];c[V+12>>2]=c[Y+16+12>>2];V=W+(m*244|0)+32|0;c[V>>2]=c[Y+32>>2];c[V+4>>2]=c[Y+32+4>>2];c[V+8>>2]=c[Y+32+8>>2];c[V+12>>2]=c[Y+32+12>>2];V=W+(m*244|0)+48|0;c[V>>2]=c[Y+48>>2];c[V+4>>2]=c[Y+48+4>>2];c[V+8>>2]=c[Y+48+8>>2];c[V+12>>2]=c[Y+48+12>>2];gi(W+(m*244|0)+64|0,Y+64|0,180)|0;m=m+1|0}while((m|0)!=0)}c[o>>2]=0;if((e|0)>0){n=0;do{p=d+(n<<2)|0;o=Rj(b,c[p>>2]|0,+g[k+12>>2])|0;p=c[p>>2]|0;if(!((p|0)==0?1:(c[p+252>>2]&2|0)==0)?+g[p+404>>2]!=0.0:0){r=c[b+16>>2]|0;m=c[p+564>>2]|0;if(m&2){q=+g[k+84>>2];M=+g[p+456>>2];O=+g[p+460>>2];s=+g[p+464>>2];G=+g[p+4>>2];M=M!=0.0?1.0/M:0.0;H=+g[p+8>>2];O=O!=0.0?1.0/O:0.0;I=+g[p+12>>2];s=s!=0.0?1.0/s:0.0;J=+g[p+20>>2];K=+g[p+24>>2];L=+g[p+28>>2];N=+g[p+36>>2];P=+g[p+40>>2];v=+g[p+44>>2];w=+g[p+388>>2];x=+g[p+392>>2];u=+g[p+396>>2];y=(M*G*G+O*H*H+s*I*I)*w+(M*G*J+O*H*K+s*I*L)*x+(M*G*N+O*H*P+s*I*v)*u;z=(M*J*G+O*K*H+s*L*I)*w+(M*J*J+O*K*K+s*L*L)*x+(M*J*N+O*K*P+s*L*v)*u;v=(M*N*G+O*P*H+s*v*I)*w+(M*N*J+O*P*K+s*v*L)*x+(M*N*N+O*P*P+s*v*v)*u;s=(x*v-u*z)*(x*v-u*z)+(u*y-w*v)*(u*y-w*v)+(w*z-x*y)*(w*z-x*y);if(s>q*q){q=1.0/+D(+s)*q;t=(x*v-u*z)*q;s=q*(u*y-w*v);q=q*(w*z-x*y)}else{t=x*v-u*z;s=u*y-w*v;q=w*z-x*y}N=+g[k+12>>2];O=(t*+g[p+328>>2]+s*+g[p+344>>2]+q*+g[p+360>>2])*N;P=N*(t*+g[p+332>>2]+s*+g[p+348>>2]+q*+g[p+364>>2]);g[r+(o*244|0)+224>>2]=+g[r+(o*244|0)+224>>2]-(t*+g[p+324>>2]+s*+g[p+340>>2]+q*+g[p+356>>2])*N;g[r+(o*244|0)+228>>2]=+g[r+(o*244|0)+228>>2]-O;g[r+(o*244|0)+232>>2]=+g[r+(o*244|0)+232>>2]-P;m=c[p+564>>2]|0}if(m&4){H=+g[k+12>>2];s=+g[p+456>>2];N=+g[p+460>>2];L=+g[p+464>>2];E=+g[p+388>>2];x=+g[p+392>>2];P=+g[p+396>>2];K=+g[p+4>>2];s=s!=0.0?1.0/s:0.0;w=+g[p+8>>2];N=N!=0.0?1.0/N:0.0;y=+g[p+12>>2];L=L!=0.0?1.0/L:0.0;q=+g[p+20>>2];J=+g[p+24>>2];B=+g[p+28>>2];M=+g[p+36>>2];I=+g[p+40>>2];t=+g[p+44>>2];z=s*K*K+N*w*w+L*y*y;G=s*K*q+N*w*J+L*y*B;u=s*K*M+N*w*I+L*y*t;A=s*q*K+N*J*w+L*B*y;F=s*q*q+N*J*J+L*B*B;v=s*q*M+N*J*I+L*B*t;y=s*M*K+N*I*w+L*t*y;B=s*M*q+N*I*J+L*t*B;t=s*M*M+N*I*I+L*t*t;L=E*z+x*G+P*u+(x*(E*y+x*B+P*t)-P*(E*A+x*F+P*v))*H-(H*0.0+(E*z+x*G+P*u));I=E*A+x*F+P*v+(P*(E*z+x*G+P*u)-E*(E*y+x*B+P*t))*H-(H*0.0+(E*A+x*F+P*v));N=E*y+x*B+P*t+(E*(E*A+x*F+P*v)-x*(E*z+x*G+P*u))*H-(H*0.0+(E*y+x*B+P*t));M=G+(E*y+x*B+P*t+(x*B+(G*0.0+F*-P)))*H;s=u+(x*t+(u*0.0+v*-P)-(E*A+x*F+P*v))*H;J=A+(y*-E+(A*0.0+P*z)-(E*y+x*B+P*t))*H;q=v+(E*z+x*G+P*u+(t*-E+(v*0.0+P*u)))*H;w=y+(y*0.0+(z*-x+E*A)+(E*A+x*F+P*v))*H;K=B+(B*0.0+(G*-x+E*F)-(E*z+x*G+P*u))*H;_=(F+(B*-E+(F*0.0+P*G))*H)*(t+(t*0.0+(u*-x+E*v))*H)-K*q;Z=K*s-M*(t+(t*0.0+(u*-x+E*v))*H);$=M*q-(F+(B*-E+(F*0.0+P*G))*H)*s;O=w*$+((z+(x*y+(z*0.0+A*-P))*H)*_+J*Z);m=+C(+O)>1.1920928955078125e-07;O=m?1.0/O:O;g[r+(o*244|0)+224>>2]=E-(N*$+(L*_+I*Z))*O-E+ +g[r+(o*244|0)+224>>2];g[r+(o*244|0)+228>>2]=x-(w*(q*L-s*I)+((z+(x*y+(z*0.0+A*-P))*H)*((t+(t*0.0+(u*-x+E*v))*H)*I-q*N)+J*(s*N-(t+(t*0.0+(u*-x+E*v))*H)*L)))*O-x+ +g[r+(o*244|0)+228>>2];g[r+(o*244|0)+232>>2]=P-(w*(M*I-(F+(B*-E+(F*0.0+P*G))*H)*L)+((z+(x*y+(z*0.0+A*-P))*H)*((F+(B*-E+(F*0.0+P*G))*H)*N-K*I)+J*(K*L-M*N)))*O-P+ +g[r+(o*244|0)+232>>2];m=c[p+564>>2]|0}if(m&8|0){O=+g[k+12>>2];z=+g[p+456>>2];A=+g[p+460>>2];w=+g[p+464>>2];J=+g[p+388>>2];K=+g[p+392>>2];$=+g[p+396>>2];yh(p+4|0,Y);_=+g[Y>>2];L=+g[Y+4>>2];M=+g[Y+8>>2];B=+g[Y+12>>2];F=M*(J*-M+K*B-$*-_)+(_*(-(J*-_)-K*-L-$*-M)+B*($*-L+J*B-K*-M))-L*(K*-_+$*B-J*-L);H=_*(K*-_+$*B-J*-L)+(L*(-(J*-_)-K*-L-$*-M)+B*(J*-M+K*B-$*-_))-M*($*-L+J*B-K*-M);B=L*($*-L+J*B-K*-M)+(M*(-(J*-_)-K*-L-$*-M)+B*(K*-_+$*B-J*-L))-_*(J*-M+K*B-$*-_);z=z!=0.0?1.0/z:0.0;I=B*0.0+(z*F+H*0.0);A=A!=0.0?1.0/A:0.0;G=B*0.0+(F*0.0+A*H);w=w!=0.0?1.0/w:0.0;E=w*B+(F*0.0+H*0.0);x=z+(H*0.0+(z*0.0+B*-0.0))*O;y=A+(F*-0.0+(A*0.0+B*0.0))*O;P=w+(w*0.0+(H*-0.0+F*0.0))*O;v=y*P-((H*-0.0+A*F+0.0-I)*O+0.0)*((B*0.0+0.0-w*F+I)*O+0.0);N=((H*-0.0+A*F+0.0-I)*O+0.0)*((w*H+(B*-0.0+0.0)-G)*O+0.0)-P*((H*0.0+(0.0-A*B)+E)*O+0.0);u=((H*0.0+(0.0-A*B)+E)*O+0.0)*((B*0.0+0.0-w*F+I)*O+0.0)-y*((w*H+(B*-0.0+0.0)-G)*O+0.0);Z=((F*0.0-z*H+0.0+G)*O+0.0)*u+(x*v+((F*-0.0+(z*B+0.0)-E)*O+0.0)*N);W=+C(+Z)>1.1920928955078125e-07;Z=W?1.0/Z:Z;N=F-((F*G-H*I)*O*u+((H*E-B*G)*O*v+(B*I-F*E)*O*N))*Z;P=H-(((F*0.0-z*H+0.0+G)*O+0.0)*(((B*0.0+0.0-w*F+I)*O+0.0)*(H*E-B*G)*O-((w*H+(B*-0.0+0.0)-G)*O+0.0)*(B*I-F*E)*O)+(x*(P*(B*I-F*E)*O-((B*0.0+0.0-w*F+I)*O+0.0)*(F*G-H*I)*O)+((F*-0.0+(z*B+0.0)-E)*O+0.0)*(((w*H+(B*-0.0+0.0)-G)*O+0.0)*(F*G-H*I)*O-P*(H*E-B*G)*O)))*Z;Z=B-(((F*0.0-z*H+0.0+G)*O+0.0)*(((H*0.0+(0.0-A*B)+E)*O+0.0)*(B*I-F*E)*O-y*(H*E-B*G)*O)+(x*(y*(F*G-H*I)*O-((H*-0.0+A*F+0.0-I)*O+0.0)*(B*I-F*E)*O)+((F*-0.0+(z*B+0.0)-E)*O+0.0)*(((H*-0.0+A*F+0.0-I)*O+0.0)*(H*E-B*G)*O-((H*0.0+(0.0-A*B)+E)*O+0.0)*(F*G-H*I)*O)))*Z;O=+g[Y+12>>2];g[r+(o*244|0)+224>>2]=(M*N+O*P-_*Z)*-M+(O*(O*N+L*Z-M*P)+(-(_*N)-L*P-M*Z)*-_)-(O*Z+_*P-L*N)*-L-J+ +g[r+(o*244|0)+224>>2];g[r+(o*244|0)+228>>2]=(O*Z+_*P-L*N)*-_+(O*(M*N+O*P-_*Z)+(-(_*N)-L*P-M*Z)*-L)-(O*N+L*Z-M*P)*-M-K+ +g[r+(o*244|0)+228>>2];g[r+(o*244|0)+232>>2]=(O*N+L*Z-M*P)*-L+((-(_*N)-L*P-M*Z)*-M+O*(O*Z+_*P-L*N))-(M*N+O*P-_*Z)*-_-$+ +g[r+(o*244|0)+232>>2]}}n=n+1|0}while((n|0)!=(e|0))}if((j|0)>0){m=0;do{W=c[i+(m<<2)>>2]|0;Ib[c[(c[W>>2]|0)+8>>2]&511](W);g[W+36>>2]=0.0;m=m+1|0}while((m|0)<(j|0))}n=c[b+168>>2]|0;if((n|0)<(j|0)?(c[b+172>>2]|0)<(j|0):0){if(!j)m=0;else{c[6995]=(c[6995]|0)+1;m=sc((j<<3|3)+16|0)|0;if(!m)m=0;else{c[(m+4+15&-16)+-4>>2]=m;m=m+4+15&-16}n=c[b+168>>2]|0}if((n|0)>0){o=0;do{U=(c[b+176>>2]|0)+(o<<3)|0;V=c[U+4>>2]|0;W=m+(o<<3)|0;c[W>>2]=c[U>>2];c[W+4>>2]=V;o=o+1|0}while((o|0)!=(n|0))}n=c[b+176>>2]|0;if(n|0){if(a[b+180>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}c[b+176>>2]=0}a[b+180>>0]=1;c[b+176>>2]=m;c[b+172>>2]=j}c[b+168>>2]=j;if((j|0)>0){m=0;e=0;do{r=c[b+176>>2]|0;d=r+(e<<3)|0;p=i+(e<<2)|0;n=c[p>>2]|0;o=c[n+44>>2]|0;if(o){n=o+64|0;do{c[o>>2]=0;o=o+4|0}while((o|0)<(n|0));n=c[p>>2]|0}if(!(a[n+20>>0]|0)){c[d>>2]=0;c[r+(e<<3)+4>>2]=0;n=0}else{Ob[c[(c[n>>2]|0)+16>>2]&127](n,d);n=c[d>>2]|0}m=n+m|0;e=e+1|0}while((e|0)<(j|0));p=m}else p=0;n=c[b+48>>2]|0;if((n|0)<(p|0)?(c[b+52>>2]|0)<(p|0):0){if(!p)m=0;else{c[6995]=(c[6995]|0)+1;m=sc((p*152|3)+16|0)|0;if(!m)m=0;else{c[(m+4+15&-16)+-4>>2]=m;m=m+4+15&-16}n=c[b+48>>2]|0}if((n|0)>0){o=0;do{gi(m+(o*152|0)|0,(c[b+56>>2]|0)+(o*152|0)|0,152)|0;o=o+1|0}while((o|0)!=(n|0))}n=c[b+56>>2]|0;if(n|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=m;c[b+52>>2]=p}c[b+48>>2]=p;if((j|0)>0){V=0;W=0;m=c[b+176>>2]|0;while(1){U=m+(W<<3)|0;if(!(c[U>>2]|0))n=0;else{n=c[b+56>>2]|0;p=n+(V*152|0)|0;r=i+(W<<2)|0;d=c[r>>2]|0;e=c[d+28>>2]|0;Q=c[d+32>>2]|0;R=Rj(b,e,+g[k+12>>2])|0;S=Rj(b,Q,+g[k+12>>2])|0;T=c[b+16>>2]|0;o=c[d+24>>2]|0;o=(o|0)>0?o:c[k+20>>2]|0;if((o|0)>(c[b+184>>2]|0))c[b+184>>2]=o;if((c[U>>2]|0)>0){m=0;do{Yk(p+(m*152|0)|0,0,152)|0;g[p+(m*152|0)+120>>2]=-3402823466385288598117041.0e14;g[p+(m*152|0)+124>>2]=3402823466385288598117041.0e14;g[p+(m*152|0)+100>>2]=0.0;g[p+(m*152|0)+96>>2]=0.0;c[p+(m*152|0)+144>>2]=R;c[p+(m*152|0)+148>>2]=S;c[p+(m*152|0)+136>>2]=o;m=m+1|0}while((m|0)<(c[U>>2]|0))}c[T+(R*244|0)+64>>2]=0;c[T+(R*244|0)+64+4>>2]=0;c[T+(R*244|0)+64+8>>2]=0;c[T+(R*244|0)+64+12>>2]=0;c[T+(R*244|0)+64+16>>2]=0;c[T+(R*244|0)+64+20>>2]=0;c[T+(R*244|0)+64+24>>2]=0;c[T+(R*244|0)+64+28>>2]=0;c[T+(R*244|0)+144>>2]=0;c[T+(R*244|0)+144+4>>2]=0;c[T+(R*244|0)+144+8>>2]=0;c[T+(R*244|0)+144+12>>2]=0;c[T+(R*244|0)+144+16>>2]=0;c[T+(R*244|0)+144+20>>2]=0;c[T+(R*244|0)+144+24>>2]=0;c[T+(R*244|0)+144+28>>2]=0;c[T+(S*244|0)+64>>2]=0;c[T+(S*244|0)+64+4>>2]=0;c[T+(S*244|0)+64+8>>2]=0;c[T+(S*244|0)+64+12>>2]=0;c[T+(S*244|0)+64+16>>2]=0;c[T+(S*244|0)+64+20>>2]=0;c[T+(S*244|0)+64+24>>2]=0;c[T+(S*244|0)+64+28>>2]=0;c[T+(S*244|0)+144>>2]=0;c[T+(S*244|0)+144+4>>2]=0;c[T+(S*244|0)+144+8>>2]=0;c[T+(S*244|0)+144+12>>2]=0;c[T+(S*244|0)+144+16>>2]=0;c[T+(S*244|0)+144+20>>2]=0;c[T+(S*244|0)+144+24>>2]=0;c[T+(S*244|0)+144+28>>2]=0;g[Y>>2]=1.0/+g[k+12>>2];c[Y+4>>2]=c[k+32>>2];c[Y+8>>2]=n+(V*152|0)+16;c[Y+12>>2]=p;c[Y+16>>2]=n+(V*152|0)+48;c[Y+20>>2]=n+(V*152|0)+32;c[Y+24>>2]=38;c[Y+28>>2]=n+(V*152|0)+112;o=n+(V*152|0)+116|0;c[o>>2]=c[k+40>>2];c[Y+48>>2]=c[k+4>>2];c[Y+32>>2]=o;c[Y+36>>2]=n+(V*152|0)+120;c[Y+40>>2]=n+(V*152|0)+124;c[Y+44>>2]=c[k+20>>2];o=c[r>>2]|0;Ob[c[(c[o>>2]|0)+20>>2]&127](o,Y);if((c[U>>2]|0)>0){n=0;do{m=p+(n*152|0)+124|0;q=+g[(c[r>>2]|0)+16>>2];if(+g[m>>2]>=q)g[m>>2]=q;m=p+(n*152|0)+120|0;if(+g[m>>2]<=-q)g[m>>2]=-q;c[p+(n*152|0)+132>>2]=d;aa=p+(n*152|0)|0;ba=c[d+28>>2]|0;$=+g[aa>>2];Z=+g[aa+4>>2];_=+g[aa+8>>2];q=($*+g[ba+340>>2]+Z*+g[ba+344>>2]+_*+g[ba+348>>2])*+g[ba+608>>2];s=($*+g[ba+356>>2]+Z*+g[ba+360>>2]+_*+g[ba+364>>2])*+g[ba+612>>2];o=p+(n*152|0)+64|0;g[o>>2]=(+g[ba+324>>2]*$+ +g[ba+328>>2]*Z+ +g[ba+332>>2]*_)*+g[ba+604>>2];g[o+4>>2]=q;g[o+8>>2]=s;g[o+12>>2]=0.0;o=p+(n*152|0)+32|0;ba=c[d+32>>2]|0;s=+g[o>>2];q=+g[o+4>>2];_=+g[o+8>>2];Z=(s*+g[ba+340>>2]+q*+g[ba+344>>2]+_*+g[ba+348>>2])*+g[ba+608>>2];$=(s*+g[ba+356>>2]+q*+g[ba+360>>2]+_*+g[ba+364>>2])*+g[ba+612>>2];m=p+(n*152|0)+80|0;g[m>>2]=(+g[ba+324>>2]*s+ +g[ba+328>>2]*q+ +g[ba+332>>2]*_)*+g[ba+604>>2];g[m+4>>2]=Z;g[m+8>>2]=$;g[m+12>>2]=0.0;m=p+(n*152|0)+16|0;$=+g[e+404>>2];Z=+g[m>>2];_=+g[m+4>>2];q=+g[m+8>>2];s=+g[aa>>2];t=+g[aa+4>>2];u=+g[aa+8>>2];aa=p+(n*152|0)+48|0;B=+g[Q+404>>2];v=+g[aa>>2];w=+g[aa+4>>2];x=+g[aa+8>>2];y=+g[o>>2];z=+g[o+4>>2];A=+g[o+8>>2];B=Z*$*Z+_*$*_+q*$*q+(s*(+g[e+324>>2]*s+ +g[e+328>>2]*t+ +g[e+332>>2]*u)+t*(s*+g[e+340>>2]+t*+g[e+344>>2]+u*+g[e+348>>2])+u*(s*+g[e+356>>2]+t*+g[e+360>>2]+u*+g[e+364>>2]))+(v*B*v+w*B*w+x*B*x)+(y*(+g[Q+324>>2]*y+ +g[Q+328>>2]*z+ +g[Q+332>>2]*A)+z*(y*+g[Q+340>>2]+z*+g[Q+344>>2]+A*+g[Q+348>>2])+A*(y*+g[Q+356>>2]+z*+g[Q+360>>2]+A*+g[Q+364>>2]));o=+C(+B)>1.1920928955078125e-07;B=o?1.0/B:0.0;g[p+(n*152|0)+108>>2]=B;if(!(c[T+(R*244|0)+240>>2]|0)){E=0.0;F=0.0;G=0.0;H=0.0;I=0.0;J=0.0}else{E=+g[T+(R*244|0)+208>>2];F=+g[T+(R*244|0)+212>>2];G=+g[T+(R*244|0)+216>>2];H=+g[T+(R*244|0)+224>>2];I=+g[T+(R*244|0)+228>>2];J=+g[T+(R*244|0)+232>>2]}if(!(c[T+(S*244|0)+240>>2]|0)){K=0.0;L=0.0;M=0.0;N=0.0;O=0.0;P=0.0}else{K=+g[T+(S*244|0)+208>>2];L=+g[T+(S*244|0)+212>>2];M=+g[T+(S*244|0)+216>>2];N=+g[T+(S*244|0)+224>>2];O=+g[T+(S*244|0)+228>>2];P=+g[T+(S*244|0)+232>>2]}ba=p+(n*152|0)+112|0;g[ba>>2]=+g[ba>>2]*B+B*(0.0-+g[Y+48>>2]*((E+ +g[e+372>>2])*+g[m>>2]+(F+ +g[e+376>>2])*+g[m+4>>2]+(G+ +g[e+380>>2])*q+((H+ +g[e+388>>2])*s+(I+ +g[e+392>>2])*t+(J+ +g[e+396>>2])*u)+((K+ +g[Q+372>>2])*v+(L+ +g[Q+376>>2])*w+(M+ +g[Q+380>>2])*x+((N+ +g[Q+388>>2])*y+(O+ +g[Q+392>>2])*z+(P+ +g[Q+396>>2])*A))));g[p+(n*152|0)+100>>2]=0.0;n=n+1|0}while((n|0)<(c[U>>2]|0))}m=c[b+176>>2]|0;n=c[m+(W<<3)>>2]|0}W=W+1|0;if((W|0)>=(j|0))break;else V=n+V|0}}Vb[c[(c[b>>2]|0)+28>>2]&127](b,f,h,k);r=c[b+48>>2]|0;d=c[b+28>>2]|0;e=c[b+68>>2]|0;n=c[b+128>>2]|0;if((n|0)<(r|0)?(c[b+132>>2]|0)<(r|0):0){if(!r)m=0;else{c[6995]=(c[6995]|0)+1;m=sc((r<<2|3)+16|0)|0;if(!m)m=0;else{c[(m+4+15&-16)+-4>>2]=m;m=m+4+15&-16}n=c[b+128>>2]|0}p=c[b+136>>2]|0;if((n|0)<=0)if(!p)n=b+140|0;else X=105;else{o=0;do{c[m+(o<<2)>>2]=c[p+(o<<2)>>2];o=o+1|0}while((o|0)!=(n|0));X=105}if((X|0)==105){if(a[b+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}c[b+136>>2]=0;n=b+140|0}a[n>>0]=1;c[b+136>>2]=m;c[b+132>>2]=r}c[b+128>>2]=r;if(!(c[k+72>>2]&16)){n=c[b+108>>2]|0;if((n|0)<(d|0)?(c[b+112>>2]|0)<(d|0):0){if(!d)m=0;else{c[6995]=(c[6995]|0)+1;m=sc((d<<2|3)+16|0)|0;if(!m)m=0;else{c[(m+4+15&-16)+-4>>2]=m;m=m+4+15&-16}n=c[b+108>>2]|0}p=c[b+116>>2]|0;if((n|0)<=0)if(!p)n=b+120|0;else X=135;else{o=0;do{c[m+(o<<2)>>2]=c[p+(o<<2)>>2];o=o+1|0}while((o|0)!=(n|0));X=135}if((X|0)==135){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}c[b+116>>2]=0;n=b+120|0}a[n>>0]=1;c[b+116>>2]=m;c[b+112>>2]=d}c[b+108>>2]=d}else{n=c[b+108>>2]|0;if((n|0)<(d<<1|0)?(c[b+112>>2]|0)<(d<<1|0):0){if(!d)m=0;else{c[6995]=(c[6995]|0)+1;m=sc((d<<3|3)+16|0)|0;if(!m)m=0;else{c[(m+4+15&-16)+-4>>2]=m;m=m+4+15&-16}n=c[b+108>>2]|0}p=c[b+116>>2]|0;if((n|0)<=0)if(!p)n=b+120|0;else X=120;else{o=0;do{c[m+(o<<2)>>2]=c[p+(o<<2)>>2];o=o+1|0}while((o|0)!=(n|0));X=120}if((X|0)==120){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}c[b+116>>2]=0;n=b+120|0}a[n>>0]=1;c[b+116>>2]=m;c[b+112>>2]=d<<1}c[b+108>>2]=d<<1}n=c[b+148>>2]|0;if((n|0)<(e|0)?(c[b+152>>2]|0)<(e|0):0){if(!e)m=0;else{c[6995]=(c[6995]|0)+1;m=sc((e<<2|3)+16|0)|0;if(!m)m=0;else{c[(m+4+15&-16)+-4>>2]=m;m=m+4+15&-16}n=c[b+148>>2]|0}p=c[b+156>>2]|0;if((n|0)<=0)if(!p)n=b+160|0;else X=150;else{o=0;do{c[m+(o<<2)>>2]=c[p+(o<<2)>>2];o=o+1|0}while((o|0)!=(n|0));X=150}if((X|0)==150){if(a[b+160>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}c[b+156>>2]=0;n=b+160|0}a[n>>0]=1;c[b+156>>2]=m;c[b+152>>2]=e}c[b+148>>2]=e;if((r|0)>0){n=c[b+136>>2]|0;m=0;do{c[n+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(r|0))}if((d|0)>0){n=c[b+116>>2]|0;m=0;do{c[n+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(d|0))}if((e|0)<=0){l=Y;return 0.0}n=c[b+156>>2]|0;m=0;do{c[n+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(e|0));l=Y;return 0.0}function rc(a,b,d,e,f){a=a|0;b=b|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,v=0,w=0,x=0,y=0,z=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,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;V=c[e>>2]|0;fa=c[f>>2]|0;if(V|0)g=c[V+12>>2]|0;else g=b;h=c[g+88>>2]|0;i=c[g+92>>2]|0;j=c[g+96>>2]|0;if(!fa)g=d;else g=c[fa+12>>2]|0;r=c[g+88>>2]|0;p=c[g+92>>2]|0;q=c[g+96>>2]|0;Z=c[b+88>>2]|0;da=(c[d+88>>2]|0)-Z|0;u=c[b+92>>2]|0;ea=(c[d+92>>2]|0)-u|0;l=c[b+96>>2]|0;W=(c[d+96>>2]|0)-l|0;Y=c[(V|0?V:fa)+12>>2]|0;_=(c[Y+88>>2]|0)-Z|0;U=(c[Y+92>>2]|0)-u|0;Y=(c[Y+96>>2]|0)-l|0;X=(P(U,W)|0)-(P(Y,ea)|0)|0;Y=(P(Y,da)|0)-(P(_,W)|0)|0;U=(P(_,ea)|0)-(P(U,da)|0)|0;Z=ct(X|0,((X|0)<0)<<31>>31|0,Z|0,((Z|0)<0)<<31>>31|0)|0;_=A;u=ct(Y|0,((Y|0)<0)<<31>>31|0,u|0,((u|0)<0)<<31>>31|0)|0;t=A;l=ct(U|0,((U|0)<0)<<31>>31|0,l|0,((l|0)<0)<<31>>31|0)|0;l=Ow(Z|0,_|0,l|0,A|0)|0;t=Ow(l|0,A|0,u|0,t|0)|0;u=A;l=ct(U|0,((U|0)<0)<<31>>31|0,ea|0,((ea|0)<0)<<31>>31|0)|0;_=A;Z=ct(Y|0,((Y|0)<0)<<31>>31|0,W|0,((W|0)<0)<<31>>31|0)|0;Z=sw(l|0,_|0,Z|0,A|0)|0;_=A;l=ct(X|0,((X|0)<0)<<31>>31|0,W|0,((W|0)<0)<<31>>31|0)|0;aa=A;$=ct(U|0,((U|0)<0)<<31>>31|0,da|0,((da|0)<0)<<31>>31|0)|0;$=sw(l|0,aa|0,$|0,A|0)|0;aa=A;l=ct(Y|0,((Y|0)<0)<<31>>31|0,da|0,((da|0)<0)<<31>>31|0)|0;ca=A;ba=ct(X|0,((X|0)<0)<<31>>31|0,ea|0,((ea|0)<0)<<31>>31|0)|0;ba=sw(l|0,ca|0,ba|0,A|0)|0;ca=A;l=ct(Z|0,_|0,h|0,((h|0)<0)<<31>>31|0)|0;T=A;k=ct($|0,aa|0,i|0,((i|0)<0)<<31>>31|0)|0;T=Ow(k|0,A|0,l|0,T|0)|0;l=A;k=ct(ba|0,ca|0,j|0,((j|0)<0)<<31>>31|0)|0;k=Ow(T|0,l|0,k|0,A|0)|0;l=A;if((V|0)!=0?(c[V+12>>2]|0)!=0:0){g=h;b=i;d=j;n=V;o=l;m=k;while(1){n=c[(c[n+8>>2]|0)+4>>2]|0;l=n+12|0;j=c[l>>2]|0;h=c[j+88>>2]|0;S=ct(h|0,((h|0)<0)<<31>>31|0,X|0,((X|0)<0)<<31>>31|0)|0;R=A;i=c[j+92>>2]|0;T=ct(i|0,((i|0)<0)<<31>>31|0,Y|0,((Y|0)<0)<<31>>31|0)|0;R=Ow(T|0,A|0,S|0,R|0)|0;S=A;j=c[j+96>>2]|0;T=ct(j|0,((j|0)<0)<<31>>31|0,U|0,((U|0)<0)<<31>>31|0)|0;T=Ow(R|0,S|0,T|0,A|0)|0;S=A;if((S|0)<(u|0)|(S|0)==(u|0)&T>>>0>>0){k=m;j=o;break}if((c[n+20>>2]|0)==(c[a+100>>2]|0)){k=m;j=o;break}T=ct(h|0,((h|0)<0)<<31>>31|0,Z|0,_|0)|0;S=A;k=ct(i|0,((i|0)<0)<<31>>31|0,$|0,aa|0)|0;S=Ow(k|0,A|0,T|0,S|0)|0;T=A;k=ct(j|0,((j|0)<0)<<31>>31|0,ba|0,ca|0)|0;k=Ow(S|0,T|0,k|0,A|0)|0;j=A;if(!((j|0)>(o|0)|(j|0)==(o|0)&k>>>0>m>>>0)){k=m;j=o;break}c[e>>2]=n;T=c[l>>2]|0;g=c[T+88>>2]|0;b=c[T+92>>2]|0;d=c[T+96>>2]|0;if(!T)break;else{o=j;m=k}}h=g;i=c[f>>2]|0;s=j}else{b=i;d=j;i=fa;s=l}g=ct(Z|0,_|0,r|0,((r|0)<0)<<31>>31|0)|0;T=A;j=ct($|0,aa|0,p|0,((p|0)<0)<<31>>31|0)|0;T=Ow(j|0,A|0,g|0,T|0)|0;g=A;j=ct(ba|0,ca|0,q|0,((q|0)<0)<<31>>31|0)|0;j=Ow(T|0,g|0,j|0,A|0)|0;g=A;a:do if(i)if(!(c[i+12>>2]|0))o=q;else{o=q;while(1){q=c[c[i+8>>2]>>2]|0;n=c[q+12>>2]|0;l=c[n+88>>2]|0;S=ct(l|0,((l|0)<0)<<31>>31|0,X|0,((X|0)<0)<<31>>31|0)|0;R=A;m=c[n+92>>2]|0;T=ct(m|0,((m|0)<0)<<31>>31|0,Y|0,((Y|0)<0)<<31>>31|0)|0;R=Ow(T|0,A|0,S|0,R|0)|0;S=A;n=c[n+96>>2]|0;T=ct(n|0,((n|0)<0)<<31>>31|0,U|0,((U|0)<0)<<31>>31|0)|0;T=Ow(R|0,S|0,T|0,A|0)|0;S=A;if((S|0)<(u|0)|(S|0)==(u|0)&T>>>0>>0)break a;if((c[q+20>>2]|0)==(c[a+100>>2]|0))break a;l=ct(l|0,((l|0)<0)<<31>>31|0,Z|0,_|0)|0;T=A;m=ct(m|0,((m|0)<0)<<31>>31|0,$|0,aa|0)|0;T=Ow(m|0,A|0,l|0,T|0)|0;m=A;l=ct(n|0,((n|0)<0)<<31>>31|0,ba|0,ca|0)|0;l=Ow(T|0,m|0,l|0,A|0)|0;m=A;if(!((m|0)>(g|0)|(m|0)==(g|0)&l>>>0>j>>>0))break a;c[f>>2]=q;T=c[q+12>>2]|0;g=c[T+88>>2]|0;i=c[T+92>>2]|0;j=c[T+96>>2]|0;if(!T){r=g;p=i;o=j;i=q;j=l;g=m;break}else{r=g;p=i;o=j;i=q;g=m;j=l}}}else{o=q;i=0}while(0);j=sw(j|0,g|0,k|0,s|0)|0;T=A;if((T|0)>0|(T|0)==0&j>>>0>0){R=sw(0,0,U|0,((U|0)<0)<<31>>31|0)|0;S=A;N=r;k=h;O=p;m=b;Q=o;n=d;l=i;u=j;q=T;while(1){s=(P(O-m|0,ea)|0)+(P(N-k|0,da)|0)+(P(Q-n|0,W)|0)|0;g=c[e>>2]|0;if(!g){E=s;I=k;H=m;B=s;g=((s|0)<0)<<31>>31;C=q;z=u}else{K=k;t=s;M=s;L=((s|0)<0)<<31>>31;b:while(1){if(!(c[g+12>>2]|0)){s=K;k=M;g=L;break}G=c[(c[g>>2]|0)+8>>2]|0;if((c[G+20>>2]|0)<=(c[a+100>>2]|0)){s=K;k=M;g=L;break}J=c[G+12>>2]|0;H=c[J+88>>2]|0;F=H-K|0;I=c[J+92>>2]|0;E=I-m|0;J=c[J+96>>2]|0;k=J-n|0;s=ct(F|0,((F|0)<0)<<31>>31|0,Z|0,_|0)|0;D=A;l=ct(E|0,((E|0)<0)<<31>>31|0,$|0,aa|0)|0;D=Ow(l|0,A|0,s|0,D|0)|0;s=A;l=ct(k|0,((k|0)<0)<<31>>31|0,ba|0,ca|0)|0;l=Ow(D|0,s|0,l|0,A|0)|0;s=A;k=(P(E,ea)|0)+(P(F,da)|0)+(P(k,W)|0)|0;do if((l|0)==0&(s|0)==0){if((k|0)>=0){s=K;k=M;g=L;break b}}else{if((s|0)>=0){s=K;k=M;g=L;break b}if((k|0)>0){w=1;x=k;v=((k|0)<0)<<31>>31}else{x=sw(0,0,k|0,((k|0)<0)<<31>>31|0)|0;w=((k|0)!=0)<<31>>31;x=k|0?x:0;v=k|0?A:0}B=sw(0,0,l|0,s|0)|0;C=A;F=0-w|0;if((t|0)>0){k=1;D=M;E=L}else{E=(t|0)!=0;D=sw(0,0,M|0,L|0)|0;k=E<<31>>31;D=E?D:0;E=E?A:0}if((q|0)>0|(q|0)==0&u>>>0>0){l=u;s=q}else{s=(u|0)!=0|(q|0)!=0;l=sw(0,0,u|0,q|0)|0;k=s?0-k|0:k;l=s?l:0;s=s?A:0}if((k|0)==(F|0)){if(!w)break;k=ct(l|0,0,x|0,0)|0;w=A;ja=ct(s|0,0,x|0,0)|0;ia=A;y=ct(l|0,0,v|0,0)|0;z=A;ha=ct(s|0,0,v|0,0)|0;x=A;y=Ow(ja|0,0,y|0,0)|0;l=A;x=Ow(ia|0,0,ha|0,x|0)|0;z=Ow(x|0,A|0,z|0,0)|0;l=Ow(z|0,A|0,l|0,0)|0;z=A;w=Ow(0,y|0,k|0,w|0)|0;x=A;y=Ow(l|0,z|0,(x>>>0>>0|(x|0)==(y|0)&w>>>0<0)&1|0,0)|0;z=A;l=ct(D|0,0,B|0,0)|0;k=A;ha=ct(E|0,0,B|0,0)|0;B=A;s=ct(D|0,0,C|0,0)|0;v=A;C=ct(E|0,0,C|0,0)|0;D=A;s=Ow(ha|0,0,s|0,0)|0;E=A;D=Ow(B|0,0,C|0,D|0)|0;v=Ow(D|0,A|0,v|0,0)|0;E=Ow(v|0,A|0,E|0,0)|0;v=A;k=Ow(0,s|0,l|0,k|0)|0;l=A;s=Ow(E|0,v|0,(l>>>0>>0|(l|0)==(s|0)&k>>>0<0)&1|0,0)|0;v=A;if(z>>>0>>0|(z|0)==(v|0)&y>>>0>>0)k=-1;else k=z>>>0>v>>>0|(z|0)==(v|0)&y>>>0>s>>>0?1:x>>>0>>0|(x|0)==(l|0)&w>>>0>>0?-1:(x>>>0>l>>>0|(x|0)==(l|0)&w>>>0>k>>>0)&1;k=P(k,F)|0}else k=F-k|0;if((k|0)<=-1){s=K;k=M;g=L;break b}}while(0);ja=N-H|0;ia=O-I|0;l=Q-J|0;q=ct(ja|0,((ja|0)<0)<<31>>31|0,Z|0,_|0)|0;ha=A;k=ct(ia|0,((ia|0)<0)<<31>>31|0,$|0,aa|0)|0;ha=Ow(k|0,A|0,q|0,ha|0)|0;q=A;k=ct(l|0,((l|0)<0)<<31>>31|0,ba|0,ca|0)|0;k=Ow(ha|0,q|0,k|0,A|0)|0;q=A;g=(g|0)==(V|0)?0:G;c[e>>2]=g;l=(P(ia,ea)|0)+(P(ja,da)|0)+(P(l,W)|0)|0;if(!g){t=l;s=H;m=I;n=J;u=k;k=l;g=((l|0)<0)<<31>>31;break}else{K=H;m=I;n=J;t=l;M=l;L=((l|0)<0)<<31>>31;u=k}}E=t;I=s;H=m;l=c[f>>2]|0;B=k;C=q;z=u}if(!l){g=110;break}if(!(c[l+12>>2]|0)){g=110;break}G=c[c[l+8>>2]>>2]|0;if((c[G+20>>2]|0)<=(c[a+100>>2]|0)){g=110;break}q=c[G+12>>2]|0;t=c[q+88>>2]|0;m=t-N|0;s=c[q+92>>2]|0;l=s-O|0;q=c[q+96>>2]|0;k=q-Q|0;ja=ct(m|0,((m|0)<0)<<31>>31|0,X|0,((X|0)<0)<<31>>31|0)|0;ha=A;ia=ct(l|0,((l|0)<0)<<31>>31|0,Y|0,((Y|0)<0)<<31>>31|0)|0;ha=Ow(ia|0,A|0,ja|0,ha|0)|0;ja=A;ia=ct(k|0,((k|0)<0)<<31>>31|0,R|0,S|0)|0;if(!((ha|0)==(ia|0)&(ja|0)==(A|0))){g=110;break}v=ct(m|0,((m|0)<0)<<31>>31|0,Z|0,_|0)|0;F=A;u=ct(l|0,((l|0)<0)<<31>>31|0,$|0,aa|0)|0;F=Ow(u|0,A|0,v|0,F|0)|0;v=A;u=ct(k|0,((k|0)<0)<<31>>31|0,ba|0,ca|0)|0;u=Ow(F|0,v|0,u|0,A|0)|0;v=A;k=(P(l,ea)|0)+(P(m,da)|0)+(P(k,W)|0)|0;F=t-I|0;ia=s-H|0;D=q-n|0;F=ct(F|0,((F|0)<0)<<31>>31|0,Z|0,_|0)|0;ja=A;ia=ct(ia|0,((ia|0)<0)<<31>>31|0,$|0,aa|0)|0;ja=Ow(ia|0,A|0,F|0,ja|0)|0;F=A;D=ct(D|0,((D|0)<0)<<31>>31|0,ba|0,ca|0)|0;D=Ow(ja|0,F|0,D|0,A|0)|0;F=A;if(!((F|0)>0|(F|0)==0&D>>>0>0)){g=110;break}if((u|0)==0&(v|0)==0){if((k|0)>=0){g=110;break}}else{if((v|0)>=0){g=110;break}if((k|0)>0){s=1;t=k;q=((k|0)<0)<<31>>31}else{t=sw(0,0,k|0,((k|0)<0)<<31>>31|0)|0;s=((k|0)!=0)<<31>>31;t=k|0?t:0;q=k|0?A:0}w=sw(0,0,u|0,v|0)|0;x=A;y=0-s|0;if((E|0)>0){k=1;v=B}else{ja=(E|0)!=0;v=sw(0,0,B|0,g|0)|0;k=ja<<31>>31;v=ja?v:0;g=ja?A:0}if((C|0)>0|(C|0)==0&z>>>0>0){m=k;l=z;k=C}else{ja=(z|0)!=0|(C|0)!=0;l=sw(0,0,z|0,C|0)|0;m=ja?0-k|0:k;l=ja?l:0;k=ja?A:0}if((m|0)==(y|0)){if(!s){g=110;break}ja=ct(l|0,0,t|0,0)|0;s=A;ia=ct(k|0,0,t|0,0)|0;Q=A;t=ct(l|0,0,q|0,0)|0;u=A;k=ct(k|0,0,q|0,0)|0;q=A;t=Ow(ia|0,0,t|0,0)|0;ia=A;q=Ow(Q|0,0,k|0,q|0)|0;u=Ow(q|0,A|0,u|0,0)|0;ia=Ow(u|0,A|0,ia|0,0)|0;u=A;q=Ow(0,t|0,ja|0,s|0)|0;s=A;t=Ow(ia|0,u|0,(s>>>0>>0|(s|0)==(t|0)&q>>>0<0)&1|0,0)|0;u=A;ia=ct(v|0,0,w|0,0)|0;k=A;ja=ct(g|0,0,w|0,0)|0;Q=A;l=ct(v|0,0,x|0,0)|0;m=A;ha=ct(g|0,0,x|0,0)|0;g=A;l=Ow(ja|0,0,l|0,0)|0;ja=A;g=Ow(Q|0,0,ha|0,g|0)|0;m=Ow(g|0,A|0,m|0,0)|0;ja=Ow(m|0,A|0,ja|0,0)|0;m=A;g=Ow(0,l|0,ia|0,k|0)|0;k=A;l=Ow(ja|0,m|0,(k>>>0>>0|(k|0)==(l|0)&g>>>0<0)&1|0,0)|0;m=A;if(u>>>0>>0|(u|0)==(m|0)&t>>>0>>0)g=-1;else g=u>>>0>m>>>0|(u|0)==(m|0)&t>>>0>l>>>0?1:s>>>0>>0|(s|0)==(k|0)&q>>>0>>0?-1:(s>>>0>k>>>0|(s|0)==(k|0)&q>>>0>g>>>0)&1;g=P(g,y)|0}else g=y-m|0;if((g|0)<=0){g=110;break}}c[f>>2]=G;Q=c[G+12>>2]|0;N=c[Q+88>>2]|0;k=I;O=c[Q+92>>2]|0;m=H;Q=c[Q+96>>2]|0;l=G;u=D;q=F}if((g|0)==110)return}if((T|0)>=0)return;F=sw(0,0,U|0,((U|0)<0)<<31>>31|0)|0;G=A;E=r;g=T;c:while(1){D=g;d:while(1){C=(P(p-b|0,ea)|0)+(P(E-h|0,da)|0)+(P(o-d|0,W)|0)|0;do if((i|0?c[i+12>>2]|0:0)?(ga=c[(c[i+4>>2]|0)+8>>2]|0,(c[ga+20>>2]|0)>(c[a+100>>2]|0)):0){B=c[ga+12>>2]|0;y=c[B+88>>2]|0;ja=y-E|0;z=c[B+92>>2]|0;ia=z-p|0;B=c[B+96>>2]|0;g=B-o|0;l=ct(ja|0,((ja|0)<0)<<31>>31|0,Z|0,_|0)|0;ha=A;k=ct(ia|0,((ia|0)<0)<<31>>31|0,$|0,aa|0)|0;ha=Ow(k|0,A|0,l|0,ha|0)|0;l=A;k=ct(g|0,((g|0)<0)<<31>>31|0,ba|0,ca|0)|0;k=Ow(ha|0,l|0,k|0,A|0)|0;l=A;g=(P(ia,ea)|0)+(P(ja,da)|0)+(P(g,W)|0)|0;if((k|0)==0&(l|0)==0)if((g|0)>0)break d;else break;if((l|0)<0){if((g|0)>0){n=1;q=g;m=((g|0)<0)<<31>>31}else{q=sw(0,0,g|0,((g|0)<0)<<31>>31|0)|0;n=((g|0)!=0)<<31>>31;q=g|0?q:0;m=g|0?A:0}t=sw(0,0,k|0,l|0)|0;u=A;x=0-n|0;if((C|0)>0){g=1;v=C;w=((C|0)<0)<<31>>31}else{v=sw(0,0,C|0,((C|0)<0)<<31>>31|0)|0;g=((C|0)!=0)<<31>>31;v=C|0?v:0;w=C|0?A:0}if((D|0)>0|(D|0)==0&j>>>0>0){k=j;l=D}else{l=(j|0)!=0|(D|0)!=0;k=sw(0,0,j|0,D|0)|0;g=l?0-g|0:g;k=l?k:0;l=l?A:0}if((g|0)==(x|0)){if(!n)break d;g=ct(k|0,0,q|0,0)|0;n=A;ha=ct(l|0,0,q|0,0)|0;V=A;r=ct(k|0,0,m|0,0)|0;s=A;ja=ct(l|0,0,m|0,0)|0;q=A;r=Ow(ha|0,0,r|0,0)|0;k=A;q=Ow(V|0,0,ja|0,q|0)|0;s=Ow(q|0,A|0,s|0,0)|0;k=Ow(s|0,A|0,k|0,0)|0;s=A;n=Ow(0,r|0,g|0,n|0)|0;q=A;r=Ow(k|0,s|0,(q>>>0>>0|(q|0)==(r|0)&n>>>0<0)&1|0,0)|0;s=A;k=ct(v|0,0,t|0,0)|0;g=A;ja=ct(w|0,0,t|0,0)|0;V=A;l=ct(v|0,0,u|0,0)|0;m=A;ha=ct(w|0,0,u|0,0)|0;ia=A;l=Ow(ja|0,0,l|0,0)|0;ja=A;ia=Ow(V|0,0,ha|0,ia|0)|0;m=Ow(ia|0,A|0,m|0,0)|0;ja=Ow(m|0,A|0,ja|0,0)|0;m=A;g=Ow(0,l|0,k|0,g|0)|0;k=A;l=Ow(ja|0,m|0,(k>>>0>>0|(k|0)==(l|0)&g>>>0<0)&1|0,0)|0;m=A;if(s>>>0>>0|(s|0)==(m|0)&r>>>0>>0)g=-1;else g=s>>>0>m>>>0|(s|0)==(m|0)&r>>>0>l>>>0?1:q>>>0>>0|(q|0)==(k|0)&n>>>0>>0?-1:(q>>>0>k>>>0|(q|0)==(k|0)&n>>>0>g>>>0)&1;g=P(g,x)|0}else g=x-g|0;if((g|0)<1)break d}}while(0);g=c[e>>2]|0;if(!g){g=110;break c}if(!(c[g+12>>2]|0)){g=110;break c}v=c[(c[g+8>>2]|0)+4>>2]|0;if((c[v+20>>2]|0)<=(c[a+100>>2]|0)){g=110;break c}i=c[v+12>>2]|0;l=c[i+88>>2]|0;h=l-h|0;k=c[i+92>>2]|0;b=k-b|0;i=c[i+96>>2]|0;g=i-d|0;ja=ct(h|0,((h|0)<0)<<31>>31|0,X|0,((X|0)<0)<<31>>31|0)|0;ha=A;ia=ct(b|0,((b|0)<0)<<31>>31|0,Y|0,((Y|0)<0)<<31>>31|0)|0;ha=Ow(ia|0,A|0,ja|0,ha|0)|0;ja=A;ia=ct(g|0,((g|0)<0)<<31>>31|0,F|0,G|0)|0;if(!((ha|0)==(ia|0)&(ja|0)==(A|0))){g=110;break c}m=ct(h|0,((h|0)<0)<<31>>31|0,Z|0,_|0)|0;u=A;d=ct(b|0,((b|0)<0)<<31>>31|0,$|0,aa|0)|0;u=Ow(d|0,A|0,m|0,u|0)|0;m=A;d=ct(g|0,((g|0)<0)<<31>>31|0,ba|0,ca|0)|0;d=Ow(u|0,m|0,d|0,A|0)|0;m=A;g=(P(b,ea)|0)+(P(h,da)|0)+(P(g,W)|0)|0;u=E-l|0;ia=p-k|0;t=o-i|0;u=ct(u|0,((u|0)<0)<<31>>31|0,Z|0,_|0)|0;ja=A;ia=ct(ia|0,((ia|0)<0)<<31>>31|0,$|0,aa|0)|0;ja=Ow(ia|0,A|0,u|0,ja|0)|0;u=A;t=ct(t|0,((t|0)<0)<<31>>31|0,ba|0,ca|0)|0;t=Ow(ja|0,u|0,t|0,A|0)|0;u=A;if((u|0)>=0){g=110;break c}if((d|0)==0&(m|0)==0){if((g|0)<=0){g=110;break c}}else{if((m|0)>=0){g=110;break c}if((g|0)>0){h=((g|0)<0)<<31>>31;i=1}else{ja=sw(0,0,g|0,((g|0)<0)<<31>>31|0)|0;h=g|0?A:0;i=((g|0)!=0)<<31>>31;g=g|0?ja:0}q=sw(0,0,d|0,m|0)|0;r=A;s=0-i|0;if((C|0)>0){b=1;n=C;m=((C|0)<0)<<31>>31}else{n=sw(0,0,C|0,((C|0)<0)<<31>>31|0)|0;b=((C|0)!=0)<<31>>31;n=C|0?n:0;m=C|0?A:0}if((D|0)>0|(D|0)==0&j>>>0>0){d=b;b=D}else{ja=(j|0)!=0|(D|0)!=0;j=sw(0,0,j|0,D|0)|0;d=ja?0-b|0:b;j=ja?j:0;b=ja?A:0}if((d|0)==(s|0)){if(!i){g=110;break c}ja=ct(j|0,0,g|0,0)|0;i=A;d=ct(b|0,0,g|0,0)|0;V=A;k=ct(j|0,0,h|0,0)|0;l=A;g=ct(b|0,0,h|0,0)|0;j=A;k=Ow(d|0,0,k|0,0)|0;b=A;j=Ow(V|0,0,g|0,j|0)|0;l=Ow(j|0,A|0,l|0,0)|0;b=Ow(l|0,A|0,b|0,0)|0;l=A;i=Ow(0,k|0,ja|0,i|0)|0;j=A;k=Ow(b|0,l|0,(j>>>0>>0|(j|0)==(k|0)&i>>>0<0)&1|0,0)|0;l=A;b=ct(n|0,0,q|0,0)|0;g=A;ja=ct(m|0,0,q|0,0)|0;V=A;d=ct(n|0,0,r|0,0)|0;h=A;ha=ct(m|0,0,r|0,0)|0;ia=A;d=Ow(ja|0,0,d|0,0)|0;ja=A;ia=Ow(V|0,0,ha|0,ia|0)|0;h=Ow(ia|0,A|0,h|0,0)|0;ja=Ow(h|0,A|0,ja|0,0)|0;h=A;g=Ow(0,d|0,b|0,g|0)|0;b=A;d=Ow(ja|0,h|0,(b>>>0>>0|(b|0)==(d|0)&g>>>0<0)&1|0,0)|0;h=A;if(l>>>0>>0|(l|0)==(h|0)&k>>>0>>0)g=-1;else g=l>>>0>h>>>0|(l|0)==(h|0)&k>>>0>d>>>0?1:j>>>0>>0|(j|0)==(b|0)&i>>>0>>0?-1:(j>>>0>b>>>0|(j|0)==(b|0)&i>>>0>g>>>0)&1;g=P(g,s)|0}else g=s-d|0;if((g|0)>=0){g=110;break c}}c[e>>2]=v;d=c[v+12>>2]|0;h=c[d+88>>2]|0;b=c[d+92>>2]|0;d=c[d+96>>2]|0;i=c[f>>2]|0;D=u;j=t}E=y-h|0;o=z-b|0;j=B-d|0;E=ct(E|0,((E|0)<0)<<31>>31|0,Z|0,_|0)|0;p=A;o=ct(o|0,((o|0)<0)<<31>>31|0,$|0,aa|0)|0;p=Ow(o|0,A|0,E|0,p|0)|0;E=A;j=ct(j|0,((j|0)<0)<<31>>31|0,ba|0,ca|0)|0;j=Ow(p|0,E|0,j|0,A|0)|0;i=(i|0)==(fa|0)?0:ga;c[f>>2]=i;E=y;p=z;o=B;g=A}if((g|0)==110)return}function sc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=l;l=l+16|0;do if(a>>>0<245){o=a>>>0<11?16:a+11&-8;m=c[6997]|0;if(m>>>(o>>>3)&3|0){a=28028+((m>>>(o>>>3)&1^1)+(o>>>3)<<1<<2)|0;b=c[a+8>>2]|0;d=c[b+8>>2]|0;if((a|0)==(d|0))c[6997]=m&~(1<<(m>>>(o>>>3)&1^1)+(o>>>3));else{c[d+12>>2]=a;c[a+8>>2]=d}v=(m>>>(o>>>3)&1^1)+(o>>>3)<<3;c[b+4>>2]=v|3;c[b+v+4>>2]=c[b+v+4>>2]|1;v=b+8|0;l=w;return v|0}n=c[6999]|0;if(o>>>0>n>>>0){if(m>>>(o>>>3)|0){a=m>>>(o>>>3)<<(o>>>3)&(2<<(o>>>3)|0-(2<<(o>>>3)));f=((a&0-a)+-1|0)>>>(((a&0-a)+-1|0)>>>12&16);e=f>>>(f>>>5&8)>>>(f>>>(f>>>5&8)>>>2&4);e=(f>>>5&8|((a&0-a)+-1|0)>>>12&16|f>>>(f>>>5&8)>>>2&4|e>>>1&2|e>>>(e>>>1&2)>>>1&1)+(e>>>(e>>>1&2)>>>(e>>>(e>>>1&2)>>>1&1))|0;f=c[28028+(e<<1<<2)+8>>2]|0;a=c[f+8>>2]|0;if((28028+(e<<1<<2)|0)==(a|0)){c[6997]=m&~(1<>2]=28028+(e<<1<<2);c[28028+(e<<1<<2)+8>>2]=a;a=m}c[f+4>>2]=o|3;c[f+o+4>>2]=(e<<3)-o|1;c[f+o+((e<<3)-o)>>2]=(e<<3)-o;if(n|0){d=c[7002]|0;if(!(a&1<<(n>>>3))){c[6997]=a|1<<(n>>>3);a=28028+(n>>>3<<1<<2)|0;b=28028+(n>>>3<<1<<2)+8|0}else{a=c[28028+(n>>>3<<1<<2)+8>>2]|0;b=28028+(n>>>3<<1<<2)+8|0}c[b>>2]=d;c[a+12>>2]=d;c[d+8>>2]=a;c[d+12>>2]=28028+(n>>>3<<1<<2)}c[6999]=(e<<3)-o;c[7002]=f+o;v=f+8|0;l=w;return v|0}k=c[6998]|0;if(k){b=((k&0-k)+-1|0)>>>(((k&0-k)+-1|0)>>>12&16);a=b>>>(b>>>5&8)>>>(b>>>(b>>>5&8)>>>2&4);a=c[28292+((b>>>5&8|((k&0-k)+-1|0)>>>12&16|b>>>(b>>>5&8)>>>2&4|a>>>1&2|a>>>(a>>>1&2)>>>1&1)+(a>>>(a>>>1&2)>>>(a>>>(a>>>1&2)>>>1&1))<<2)>>2]|0;b=(c[a+4>>2]&-8)-o|0;d=c[a+16+(((c[a+16>>2]|0)==0&1)<<2)>>2]|0;if(!d){j=a;h=b}else{do{i=(c[d+4>>2]&-8)-o|0;j=i>>>0>>0;b=j?i:b;a=j?d:a;d=c[d+16+(((c[d+16>>2]|0)==0&1)<<2)>>2]|0}while((d|0)!=0);j=a;h=b}i=j+o|0;if(j>>>0>>0){f=c[j+24>>2]|0;a=c[j+12>>2]|0;do if((a|0)==(j|0)){b=j+20|0;a=c[b>>2]|0;if(!a){b=j+16|0;a=c[b>>2]|0;if(!a){b=0;break}}while(1){d=a+20|0;e=c[d>>2]|0;if(e|0){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}c[b>>2]=0;b=a}else{b=c[j+8>>2]|0;c[b+12>>2]=a;c[a+8>>2]=b;b=a}while(0);do if(f|0){a=c[j+28>>2]|0;if((j|0)==(c[28292+(a<<2)>>2]|0)){c[28292+(a<<2)>>2]=b;if(!b){c[6998]=k&~(1<>2]|0)!=(j|0)&1)<<2)>>2]=b;if(!b)break}c[b+24>>2]=f;a=c[j+16>>2]|0;if(a|0){c[b+16>>2]=a;c[a+24>>2]=b}a=c[j+20>>2]|0;if(a|0){c[b+20>>2]=a;c[a+24>>2]=b}}while(0);if(h>>>0<16){v=h+o|0;c[j+4>>2]=v|3;v=j+v+4|0;c[v>>2]=c[v>>2]|1}else{c[j+4>>2]=o|3;c[i+4>>2]=h|1;c[i+h>>2]=h;if(n|0){d=c[7002]|0;if(!(m&1<<(n>>>3))){c[6997]=m|1<<(n>>>3);a=28028+(n>>>3<<1<<2)|0;b=28028+(n>>>3<<1<<2)+8|0}else{a=c[28028+(n>>>3<<1<<2)+8>>2]|0;b=28028+(n>>>3<<1<<2)+8|0}c[b>>2]=d;c[a+12>>2]=d;c[d+8>>2]=a;c[d+12>>2]=28028+(n>>>3<<1<<2)}c[6999]=h;c[7002]=i}v=j+8|0;l=w;return v|0}}}}else if(a>>>0<=4294967231){o=a+11&-8;j=c[6998]|0;if(j){if((a+11|0)>>>8)if(o>>>0>16777215)i=31;else{i=(a+11|0)>>>8<<((((a+11|0)>>>8)+1048320|0)>>>16&8);i=14-((i+520192|0)>>>16&4|(((a+11|0)>>>8)+1048320|0)>>>16&8|((i<<((i+520192|0)>>>16&4))+245760|0)>>>16&2)+(i<<((i+520192|0)>>>16&4)<<(((i<<((i+520192|0)>>>16&4))+245760|0)>>>16&2)>>>15)|0;i=o>>>(i+7|0)&1|i<<1}else i=0;b=c[28292+(i<<2)>>2]|0;a:do if(!b){b=0;a=0;d=0-o|0;u=57}else{a=0;d=0-o|0;h=o<<((i|0)==31?0:25-(i>>>1)|0);f=0;while(1){e=(c[b+4>>2]&-8)-o|0;if(e>>>0>>0)if(!e){a=b;d=0;e=b;u=61;break a}else{a=b;d=e}e=c[b+20>>2]|0;b=c[b+16+(h>>>31<<2)>>2]|0;f=(e|0)==0|(e|0)==(b|0)?f:e;e=(b|0)==0;if(e){b=f;u=57;break}else h=h<<((e^1)&1)}}while(0);if((u|0)==57){if((b|0)==0&(a|0)==0){a=2<>>(m>>>12&16)>>>(m>>>(m>>>12&16)>>>5&8);b=n>>>(n>>>2&4)>>>(n>>>(n>>>2&4)>>>1&2);a=0;b=c[28292+((m>>>(m>>>12&16)>>>5&8|m>>>12&16|n>>>2&4|n>>>(n>>>2&4)>>>1&2|b>>>1&1)+(b>>>(b>>>1&1))<<2)>>2]|0}if(!b){i=a;h=d}else{e=b;u=61}}if((u|0)==61)while(1){u=0;b=(c[e+4>>2]&-8)-o|0;n=b>>>0>>0;b=n?b:d;a=n?e:a;e=c[e+16+(((c[e+16>>2]|0)==0&1)<<2)>>2]|0;if(!e){i=a;h=b;break}else{d=b;u=61}}if((i|0)!=0?h>>>0<((c[6999]|0)-o|0)>>>0:0){g=i+o|0;if(i>>>0>=g>>>0){v=0;l=w;return v|0}f=c[i+24>>2]|0;a=c[i+12>>2]|0;do if((a|0)==(i|0)){b=i+20|0;a=c[b>>2]|0;if(!a){b=i+16|0;a=c[b>>2]|0;if(!a){a=0;break}}while(1){d=a+20|0;e=c[d>>2]|0;if(e|0){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}c[b>>2]=0}else{v=c[i+8>>2]|0;c[v+12>>2]=a;c[a+8>>2]=v}while(0);do if(f){b=c[i+28>>2]|0;if((i|0)==(c[28292+(b<<2)>>2]|0)){c[28292+(b<<2)>>2]=a;if(!a){c[6998]=j&~(1<>2]|0)!=(i|0)&1)<<2)>>2]=a;if(!a){e=j;break}}c[a+24>>2]=f;b=c[i+16>>2]|0;if(b|0){c[a+16>>2]=b;c[b+24>>2]=a}b=c[i+20>>2]|0;if(b){c[a+20>>2]=b;c[b+24>>2]=a;e=j}else e=j}else e=j;while(0);do if(h>>>0>=16){c[i+4>>2]=o|3;c[g+4>>2]=h|1;c[g+h>>2]=h;d=h>>>3;if(h>>>0<256){a=c[6997]|0;if(!(a&1<>2]|0;b=28028+(d<<1<<2)+8|0}c[b>>2]=g;c[a+12>>2]=g;c[g+8>>2]=a;c[g+12>>2]=28028+(d<<1<<2);break}a=h>>>8;if(a)if(h>>>0>16777215)a=31;else{v=a<<((a+1048320|0)>>>16&8)<<(((a<<((a+1048320|0)>>>16&8))+520192|0)>>>16&4);a=14-(((a<<((a+1048320|0)>>>16&8))+520192|0)>>>16&4|(a+1048320|0)>>>16&8|(v+245760|0)>>>16&2)+(v<<((v+245760|0)>>>16&2)>>>15)|0;a=h>>>(a+7|0)&1|a<<1}else a=0;d=28292+(a<<2)|0;c[g+28>>2]=a;c[g+16+4>>2]=0;c[g+16>>2]=0;b=1<>2]=g;c[g+24>>2]=d;c[g+12>>2]=g;c[g+8>>2]=g;break}b=h<<((a|0)==31?0:25-(a>>>1)|0);d=c[d>>2]|0;while(1){if((c[d+4>>2]&-8|0)==(h|0)){u=97;break}e=d+16+(b>>>31<<2)|0;a=c[e>>2]|0;if(!a){u=96;break}else{b=b<<1;d=a}}if((u|0)==96){c[e>>2]=g;c[g+24>>2]=d;c[g+12>>2]=g;c[g+8>>2]=g;break}else if((u|0)==97){u=d+8|0;v=c[u>>2]|0;c[v+12>>2]=g;c[u>>2]=g;c[g+8>>2]=v;c[g+12>>2]=d;c[g+24>>2]=0;break}}else{v=h+o|0;c[i+4>>2]=v|3;v=i+v+4|0;c[v>>2]=c[v>>2]|1}while(0);v=i+8|0;l=w;return v|0}}}else o=-1;while(0);d=c[6999]|0;if(d>>>0>=o>>>0){a=d-o|0;b=c[7002]|0;if(a>>>0>15){v=b+o|0;c[7002]=v;c[6999]=a;c[v+4>>2]=a|1;c[v+a>>2]=a;c[b+4>>2]=o|3}else{c[6999]=0;c[7002]=0;c[b+4>>2]=d|3;c[b+d+4>>2]=c[b+d+4>>2]|1}v=b+8|0;l=w;return v|0}f=c[7e3]|0;if(f>>>0>o>>>0){t=f-o|0;c[7e3]=t;v=c[7003]|0;u=v+o|0;c[7003]=u;c[u+4>>2]=t|1;c[v+4>>2]=o|3;v=v+8|0;l=w;return v|0}if(!(c[7115]|0)){c[7117]=4096;c[7116]=4096;c[7118]=-1;c[7119]=-1;c[7120]=0;c[7108]=0;c[w>>2]=w&-16^1431655768;c[7115]=w&-16^1431655768;a=4096}else a=c[7117]|0;h=o+48|0;i=o+47|0;k=a+i|0;j=0-a|0;if((k&j)>>>0<=o>>>0){v=0;l=w;return v|0}a=c[7107]|0;if(a|0?(n=c[7105]|0,(n+(k&j)|0)>>>0<=n>>>0?1:(n+(k&j)|0)>>>0>a>>>0):0){v=0;l=w;return v|0}b:do if(!(c[7108]&4)){d=c[7003]|0;c:do if(d){b=28436;while(1){a=c[b>>2]|0;if(a>>>0<=d>>>0?(p=b+4|0,(a+(c[p>>2]|0)|0)>>>0>d>>>0):0)break;a=c[b+8>>2]|0;if(!a){u=118;break c}else b=a}if((k-f&j)>>>0<2147483647){a=_o(k-f&j|0)|0;if((a|0)==((c[b>>2]|0)+(c[p>>2]|0)|0))if((a|0)==(-1|0))a=k-f&j;else{h=k-f&j;g=a;u=135;break b}else{e=a;d=k-f&j;u=126}}else a=0}else u=118;while(0);do if((u|0)==118){b=_o(0)|0;if((b|0)!=(-1|0)?(r=c[7116]|0,r=((r+-1&b|0)==0?0:(r+-1+b&0-r)-b|0)+(k&j)|0,q=c[7105]|0,r>>>0>o>>>0&r>>>0<2147483647):0){p=c[7107]|0;if(p|0?(r+q|0)>>>0<=q>>>0|(r+q|0)>>>0>p>>>0:0){a=0;break}a=_o(r|0)|0;if((a|0)==(b|0)){h=r;g=b;u=135;break b}else{e=a;d=r;u=126}}else a=0}while(0);do if((u|0)==126){b=0-d|0;if(!(h>>>0>d>>>0&(d>>>0<2147483647&(e|0)!=(-1|0))))if((e|0)==(-1|0)){a=0;break}else{h=d;g=e;u=135;break b}a=c[7117]|0;a=i-d+a&0-a;if(a>>>0>=2147483647){h=d;g=e;u=135;break b}if((_o(a|0)|0)==(-1|0)){_o(b|0)|0;a=0;break}else{h=a+d|0;g=e;u=135;break b}}while(0);c[7108]=c[7108]|4;u=133}else{a=0;u=133}while(0);if(((u|0)==133?(k&j)>>>0<2147483647:0)?(g=_o(k&j|0)|0,s=_o(0)|0,t=(s-g|0)>>>0>(o+40|0)>>>0,!((g|0)==(-1|0)|t^1|g>>>0>>0&((g|0)!=(-1|0)&(s|0)!=(-1|0))^1)):0){h=t?s-g|0:a;u=135}if((u|0)==135){a=(c[7105]|0)+h|0;c[7105]=a;if(a>>>0>(c[7106]|0)>>>0)c[7106]=a;j=c[7003]|0;do if(j){a=28436;while(1){b=c[a>>2]|0;d=a+4|0;e=c[d>>2]|0;if((g|0)==(b+e|0)){u=145;break}f=c[a+8>>2]|0;if(!f)break;else a=f}if(((u|0)==145?(c[a+12>>2]&8|0)==0:0)?j>>>0>>0&j>>>0>=b>>>0:0){c[d>>2]=e+h;u=(j+8&7|0)==0?0:0-(j+8)&7;v=(c[7e3]|0)+(h-u)|0;c[7003]=j+u;c[7e3]=v;c[j+u+4>>2]=v|1;c[j+u+v+4>>2]=40;c[7004]=c[7119];break}if(g>>>0<(c[7001]|0)>>>0)c[7001]=g;d=g+h|0;a=28436;while(1){if((c[a>>2]|0)==(d|0)){u=153;break}b=c[a+8>>2]|0;if(!b)break;else a=b}if((u|0)==153?(c[a+12>>2]&8|0)==0:0){c[a>>2]=g;m=a+4|0;c[m>>2]=(c[m>>2]|0)+h;m=g+8|0;m=g+((m&7|0)==0?0:0-m&7)|0;a=d+((d+8&7|0)==0?0:0-(d+8)&7)|0;k=m+o|0;i=a-m-o|0;c[m+4>>2]=o|3;do if((a|0)!=(j|0)){if((a|0)==(c[7002]|0)){v=(c[6999]|0)+i|0;c[6999]=v;c[7002]=k;c[k+4>>2]=v|1;c[k+v>>2]=v;break}h=c[a+4>>2]|0;if((h&3|0)==1){d:do if(h>>>0<256){b=c[a+8>>2]|0;d=c[a+12>>2]|0;if((d|0)==(b|0)){c[6997]=c[6997]&~(1<<(h>>>3));break}else{c[b+12>>2]=d;c[d+8>>2]=b;break}}else{g=c[a+24>>2]|0;b=c[a+12>>2]|0;do if((b|0)==(a|0)){b=c[a+16+4>>2]|0;if(!b){b=c[a+16>>2]|0;if(!b){b=0;break}else f=a+16|0}else f=a+16+4|0;while(1){d=b+20|0;e=c[d>>2]|0;if(e|0){b=e;f=d;continue}d=b+16|0;e=c[d>>2]|0;if(!e)break;else{b=e;f=d}}c[f>>2]=0}else{v=c[a+8>>2]|0;c[v+12>>2]=b;c[b+8>>2]=v}while(0);if(!g)break;d=c[a+28>>2]|0;do if((a|0)!=(c[28292+(d<<2)>>2]|0)){c[g+16+(((c[g+16>>2]|0)!=(a|0)&1)<<2)>>2]=b;if(!b)break d}else{c[28292+(d<<2)>>2]=b;if(b|0)break;c[6998]=c[6998]&~(1<>2]=g;d=c[a+16>>2]|0;if(d|0){c[b+16>>2]=d;c[d+24>>2]=b}d=c[a+16+4>>2]|0;if(!d)break;c[b+20>>2]=d;c[d+24>>2]=b}while(0);a=a+(h&-8)|0;f=(h&-8)+i|0}else f=i;d=a+4|0;c[d>>2]=c[d>>2]&-2;c[k+4>>2]=f|1;c[k+f>>2]=f;d=f>>>3;if(f>>>0<256){a=c[6997]|0;if(!(a&1<>2]|0;b=28028+(d<<1<<2)+8|0}c[b>>2]=k;c[a+12>>2]=k;c[k+8>>2]=a;c[k+12>>2]=28028+(d<<1<<2);break}a=f>>>8;do if(!a)a=0;else{if(f>>>0>16777215){a=31;break}v=a<<((a+1048320|0)>>>16&8)<<(((a<<((a+1048320|0)>>>16&8))+520192|0)>>>16&4);a=14-(((a<<((a+1048320|0)>>>16&8))+520192|0)>>>16&4|(a+1048320|0)>>>16&8|(v+245760|0)>>>16&2)+(v<<((v+245760|0)>>>16&2)>>>15)|0;a=f>>>(a+7|0)&1|a<<1}while(0);e=28292+(a<<2)|0;c[k+28>>2]=a;c[k+16+4>>2]=0;c[k+16>>2]=0;b=c[6998]|0;d=1<>2]=k;c[k+24>>2]=e;c[k+12>>2]=k;c[k+8>>2]=k;break}b=f<<((a|0)==31?0:25-(a>>>1)|0);d=c[e>>2]|0;while(1){if((c[d+4>>2]&-8|0)==(f|0)){u=194;break}e=d+16+(b>>>31<<2)|0;a=c[e>>2]|0;if(!a){u=193;break}else{b=b<<1;d=a}}if((u|0)==193){c[e>>2]=k;c[k+24>>2]=d;c[k+12>>2]=k;c[k+8>>2]=k;break}else if((u|0)==194){u=d+8|0;v=c[u>>2]|0;c[v+12>>2]=k;c[u>>2]=k;c[k+8>>2]=v;c[k+12>>2]=d;c[k+24>>2]=0;break}}else{v=(c[7e3]|0)+i|0;c[7e3]=v;c[7003]=k;c[k+4>>2]=v|1}while(0);v=m+8|0;l=w;return v|0}a=28436;while(1){b=c[a>>2]|0;if(b>>>0<=j>>>0?(v=b+(c[a+4>>2]|0)|0,v>>>0>j>>>0):0)break;a=c[a+8>>2]|0}f=v+-47+((v+-47+8&7|0)==0?0:0-(v+-47+8)&7)|0;f=f>>>0<(j+16|0)>>>0?j:f;a=g+8|0;a=(a&7|0)==0?0:0-a&7;u=g+a|0;a=h+-40-a|0;c[7003]=u;c[7e3]=a;c[u+4>>2]=a|1;c[u+a+4>>2]=40;c[7004]=c[7119];c[f+4>>2]=27;c[f+8>>2]=c[7109];c[f+8+4>>2]=c[7110];c[f+8+8>>2]=c[7111];c[f+8+12>>2]=c[7112];c[7109]=g;c[7110]=h;c[7112]=0;c[7111]=f+8;a=f+24|0;do{u=a;a=a+4|0;c[a>>2]=7}while((u+8|0)>>>0>>0);if((f|0)!=(j|0)){c[f+4>>2]=c[f+4>>2]&-2;c[j+4>>2]=f-j|1;c[f>>2]=f-j;if((f-j|0)>>>0<256){d=28028+((f-j|0)>>>3<<1<<2)|0;a=c[6997]|0;if(!(a&1<<((f-j|0)>>>3))){c[6997]=a|1<<((f-j|0)>>>3);a=d;b=d+8|0}else{a=c[d+8>>2]|0;b=d+8|0}c[b>>2]=j;c[a+12>>2]=j;c[j+8>>2]=a;c[j+12>>2]=d;break}if((f-j|0)>>>8)if((f-j|0)>>>0>16777215)a=31;else{a=(f-j|0)>>>8<<((((f-j|0)>>>8)+1048320|0)>>>16&8);a=14-((a+520192|0)>>>16&4|(((f-j|0)>>>8)+1048320|0)>>>16&8|((a<<((a+520192|0)>>>16&4))+245760|0)>>>16&2)+(a<<((a+520192|0)>>>16&4)<<(((a<<((a+520192|0)>>>16&4))+245760|0)>>>16&2)>>>15)|0;a=(f-j|0)>>>(a+7|0)&1|a<<1}else a=0;e=28292+(a<<2)|0;c[j+28>>2]=a;c[j+20>>2]=0;c[j+16>>2]=0;b=c[6998]|0;d=1<>2]=j;c[j+24>>2]=e;c[j+12>>2]=j;c[j+8>>2]=j;break}b=f-j<<((a|0)==31?0:25-(a>>>1)|0);d=c[e>>2]|0;while(1){if((c[d+4>>2]&-8|0)==(f-j|0)){u=216;break}e=d+16+(b>>>31<<2)|0;a=c[e>>2]|0;if(!a){u=215;break}else{b=b<<1;d=a}}if((u|0)==215){c[e>>2]=j;c[j+24>>2]=d;c[j+12>>2]=j;c[j+8>>2]=j;break}else if((u|0)==216){u=d+8|0;v=c[u>>2]|0;c[v+12>>2]=j;c[u>>2]=j;c[j+8>>2]=v;c[j+12>>2]=d;c[j+24>>2]=0;break}}}else{v=c[7001]|0;if((v|0)==0|g>>>0>>0)c[7001]=g;c[7109]=g;c[7110]=h;c[7112]=0;c[7006]=c[7115];c[7005]=-1;a=0;do{v=28028+(a<<1<<2)|0;c[v+12>>2]=v;c[v+8>>2]=v;a=a+1|0}while((a|0)!=32);v=g+8|0;v=(v&7|0)==0?0:0-v&7;u=g+v|0;v=h+-40-v|0;c[7003]=u;c[7e3]=v;c[u+4>>2]=v|1;c[u+v+4>>2]=40;c[7004]=c[7119]}while(0);a=c[7e3]|0;if(a>>>0>o>>>0){t=a-o|0;c[7e3]=t;v=c[7003]|0;u=v+o|0;c[7003]=u;c[u+4>>2]=t|1;c[v+4>>2]=o|3;v=v+8|0;l=w;return v|0}}c[7137]=12;v=0;l=w;return v|0}function tc(b,d,e){b=b|0;d=d|0;e=+e;var f=0.0,h=0.0,i=0,j=0,k=0.0,m=0.0,n=0,o=0,p=0.0,q=0,r=0.0,s=0.0,t=0,u=0,v=0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,H=0.0,I=0.0,J=0.0,K=0.0;x=l;l=l+544|0;f=+g[b+100>>2];k=+g[b+104>>2];h=+g[b+108>>2];if(f*f+k*k+h*h>0.0){m=+E(+(1.0-+g[b+244>>2]),+e);g[b+100>>2]=f*m;g[b+104>>2]=m*k;g[b+108>>2]=m*h;f=f*m;k=m*k;h=m*h}m=f*f+k*k+h*h;if(m>0.0){q=c[b+8>>2]|0;c[x+472>>2]=c[q+4>>2];c[x+472+4>>2]=c[q+4+4>>2];c[x+472+8>>2]=c[q+4+8>>2];c[x+472+12>>2]=c[q+4+12>>2];i=x+472+16|0;c[i>>2]=c[q+20>>2];c[i+4>>2]=c[q+20+4>>2];c[i+8>>2]=c[q+20+8>>2];c[i+12>>2]=c[q+20+12>>2];j=x+472+32|0;c[j>>2]=c[q+36>>2];c[j+4>>2]=c[q+36+4>>2];c[j+8>>2]=c[q+36+8>>2];c[j+12>>2]=c[q+36+12>>2];o=x+472+48|0;c[o>>2]=c[q+52>>2];c[o+4>>2]=c[q+52+4>>2];c[o+8>>2]=c[q+52+8>>2];c[o+12>>2]=c[q+52+12>>2];K=+D(+m);I=f*(1.0/K);B=k*(1.0/K);m=h*(1.0/K);h=+G(+(K*e*.5))/+D(+(m*m+(I*I+B*B)));K=+F(+(K*e*.5));yh(x+472|0,x+408|0);H=+g[x+408>>2];J=+g[x+408+12>>2];y=+g[x+408+8>>2];z=+g[x+408+4>>2];f=K*H+I*h*J+B*h*y-m*h*z;k=m*h*H+(B*h*J+K*z)-I*h*y;A=m*h*J+K*y+I*h*z-B*h*H;y=K*J-I*h*H-B*h*z-m*h*y;h=f*(2.0/(y*y+(A*A+(f*f+k*k))));m=k*(2.0/(y*y+(A*A+(f*f+k*k))));z=A*(2.0/(y*y+(A*A+(f*f+k*k))));g[x+472>>2]=1.0-(k*m+A*z);g[x+472+4>>2]=f*m-y*z;g[x+472+8>>2]=f*z+y*m;g[x+472+12>>2]=0.0;g[x+472+16>>2]=f*m+y*z;g[x+472+20>>2]=1.0-(f*h+A*z);g[x+472+24>>2]=k*z-y*h;g[x+472+28>>2]=0.0;g[x+472+32>>2]=f*z-y*m;g[x+472+36>>2]=k*z+y*h;g[x+472+40>>2]=1.0-(f*h+k*m);g[x+472+44>>2]=0.0;q=c[b+8>>2]|0;c[q+304>>2]=(c[q+304>>2]|0)+1;c[q+4>>2]=c[x+472>>2];c[q+4+4>>2]=c[x+472+4>>2];c[q+4+8>>2]=c[x+472+8>>2];c[q+4+12>>2]=c[x+472+12>>2];c[q+20>>2]=c[i>>2];c[q+20+4>>2]=c[i+4>>2];c[q+20+8>>2]=c[i+8>>2];c[q+20+12>>2]=c[i+12>>2];c[q+36>>2]=c[j>>2];c[q+36+4>>2]=c[j+4>>2];c[q+36+8>>2]=c[j+8>>2];c[q+36+12>>2]=c[j+12>>2];c[q+52>>2]=c[o>>2];c[q+52+4>>2]=c[o+4>>2];c[q+52+8>>2]=c[o+8>>2];c[q+52+12>>2]=c[o+12>>2];q=c[b+8>>2]|0;c[b+132>>2]=c[q+52>>2];c[b+132+4>>2]=c[q+52+4>>2];c[b+132+8>>2]=c[q+52+8>>2];c[b+132+12>>2]=c[q+52+12>>2];$p(b+152|0,q+52|0,16)|0;yh(q+4|0,x+408|0);c[b+168>>2]=c[x+408>>2];c[b+168+4>>2]=c[x+408+4>>2];c[b+168+8>>2]=c[x+408+8>>2];c[b+168+12>>2]=c[x+408+12>>2];c[b+184>>2]=c[b+168>>2];c[b+184+4>>2]=c[b+168+4>>2];c[b+184+8>>2]=c[b+168+8>>2];c[b+184+12>>2]=c[b+168+12>>2]}if((a[b+251>>0]|0)==0?+g[b+252>>2]<=0.0:0){l=x;return}a[b+248>>0]=(xb[c[(c[b>>2]|0)+48>>2]&127](b)|0)&1;f=+g[b+68>>2];h=+g[b+72>>2];k=+g[b+76>>2];m=+E(+(1.0-+g[b+240>>2]),+e);if(f*f+h*h+k*k>0.0){g[b+68>>2]=f*m;g[b+72>>2]=m*h;g[b+76>>2]=m*k}f=m*+g[b+20>>2]-+g[b+52>>2]*e;g[b+20>>2]=f;if(f>0.0?(p=+g[b+32>>2],f>p):0){g[b+20>>2]=p;f=p}if(f<0.0?(K=+C(+f),r=+C(+(+g[b+28>>2])),K>r):0){g[b+20>>2]=-r;f=-r}h=f*e;g[b+24>>2]=h;q=c[b+8>>2]|0;c[x>>2]=c[q+4>>2];c[x+4>>2]=c[q+4+4>>2];c[x+8>>2]=c[q+4+8>>2];c[x+12>>2]=c[q+4+12>>2];c[x+16>>2]=c[q+20>>2];c[x+16+4>>2]=c[q+20+4>>2];c[x+16+8>>2]=c[q+20+8>>2];c[x+16+12>>2]=c[q+20+12>>2];c[x+32>>2]=c[q+36>>2];c[x+32+4>>2]=c[q+36+4>>2];c[x+32+8>>2]=c[q+36+8>>2];c[x+32+12>>2]=c[q+36+12>>2];c[x+48>>2]=c[q+52>>2];c[x+48+4>>2]=c[q+52+4>>2];c[x+48+8>>2]=c[q+52+8>>2];c[x+48+12>>2]=c[q+52+12>>2];if(f<0.0)k=+g[b+60>>2];else k=0.0;c[x+472>>2]=1065353216;o=x+472+4|0;c[o>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;c[x+472+20>>2]=1065353216;q=x+472+24|0;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[x+472+40>>2]=1065353216;c[x+472+44>>2]=0;c[x+408>>2]=1065353216;j=x+408+4|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[x+408+20>>2]=1065353216;i=x+408+24|0;c[i>>2]=0;c[i+4>>2]=0;c[i+8>>2]=0;c[i+12>>2]=0;c[x+408+40>>2]=1065353216;c[x+408+44>>2]=0;c[x+472+48>>2]=c[b+132>>2];c[x+472+48+4>>2]=c[b+132+4>>2];c[x+472+48+8>>2]=c[b+132+8>>2];c[x+472+48+12>>2]=c[b+132+12>>2];A=h>0.0?h:0.0;J=k*+g[b+260>>2]+ +g[b+136>>2]+A*+g[b+276>>2];B=k*+g[b+264>>2]+ +g[b+140>>2]+A*+g[b+280>>2];g[b+152>>2]=k*+g[b+256>>2]+ +g[b+132>>2]+ +g[b+272>>2]*A;g[b+156>>2]=J;g[b+160>>2]=B;g[b+164>>2]=0.0;c[b+132>>2]=c[b+152>>2];c[b+132+4>>2]=c[b+152+4>>2];c[b+132+8>>2]=c[b+152+8>>2];c[b+132+12>>2]=c[b+152+12>>2];c[x+408+48>>2]=c[b+152>>2];c[x+408+48+4>>2]=c[b+152+4>>2];c[x+408+48+8>>2]=c[b+152+8>>2];c[x+408+48+12>>2]=c[b+152+12>>2];B=+g[b+168>>2];J=+g[b+172>>2];A=+g[b+176>>2];K=+g[b+180>>2];z=B*(2.0/(B*B+J*J+A*A+K*K));H=J*(2.0/(B*B+J*J+A*A+K*K));I=A*(2.0/(B*B+J*J+A*A+K*K));g[x+472>>2]=1.0-(J*H+A*I);g[o>>2]=B*H-K*I;g[x+472+8>>2]=B*I+K*H;g[x+472+12>>2]=0.0;g[x+472+16>>2]=B*H+K*I;g[x+472+20>>2]=1.0-(B*z+A*I);g[q>>2]=J*I-K*z;g[x+472+28>>2]=0.0;g[x+472+32>>2]=B*I-K*H;g[x+472+36>>2]=J*I+K*z;g[x+472+40>>2]=1.0-(B*z+J*H);g[x+472+44>>2]=0.0;H=+g[b+184>>2];J=+g[b+188>>2];z=+g[b+192>>2];B=+g[b+196>>2];K=H*(2.0/(H*H+J*J+z*z+B*B));I=J*(2.0/(H*H+J*J+z*z+B*B));A=z*(2.0/(H*H+J*J+z*z+B*B));g[x+408>>2]=1.0-(J*I+z*A);g[j>>2]=H*I-B*A;g[x+408+8>>2]=H*A+B*I;g[x+408+12>>2]=0.0;g[x+408+16>>2]=H*I+B*A;g[x+408+20>>2]=1.0-(H*K+z*A);g[i>>2]=J*A-B*K;g[x+408+28>>2]=0.0;g[x+408+32>>2]=H*A-B*I;g[x+408+36>>2]=J*A+B*K;g[x+408+40>>2]=1.0-(H*K+J*I);g[x+408+44>>2]=0.0;i=c[b+8>>2]|0;I=-+g[b+256>>2];J=-+g[b+260>>2];K=-+g[b+264>>2];j=c[b+48>>2]|0;g[x+296+4>>2]=1.0;q=x+296+16|0;c[x+296+80>>2]=0;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[q+16>>2]=0;c[q+20>>2]=0;c[q+24>>2]=0;c[q+28>>2]=0;c[x+296>>2]=5252;c[x+296+84>>2]=i;g[x+296+88>>2]=I;g[x+296+92>>2]=J;g[x+296+96>>2]=K;g[x+296+100>>2]=0.0;c[x+296+104>>2]=j;j=c[i+188>>2]|0;c[x+296+8>>2]=c[j+4>>2];c[x+296+12>>2]=c[j+8>>2];j=c[b+12>>2]|0;if(!(a[b+250>>0]|0))Ud(d,j,x+472|0,x+408|0,x+296|0,+g[d+56>>2]);else pd(i,j,x+472|0,x+408|0,x+296|0,+g[d+56>>2]);if((+g[x+296+4>>2]<1.0?(n=c[b+8>>2]|0,(c[n+204>>2]&4|0)==0):0)?Bb[c[(c[b>>2]|0)+56>>2]&63](b,n,c[x+296+80>>2]|0)|0:0){do if(+g[x+296+48>>2]*+g[b+256>>2]+ +g[x+296+52>>2]*+g[b+260>>2]+ +g[x+296+56>>2]*+g[b+264>>2]>0.0){f=+g[x+296+4>>2];g[b+148>>2]=k*f;if(!(a[b+288>>0]|0)){c[b+132>>2]=c[b+152>>2];c[b+132+4>>2]=c[b+152+4>>2];c[b+132+8>>2]=c[b+152+8>>2];c[b+132+12>>2]=c[b+152+12>>2];break}else{g[b+132>>2]=(1.0-f)*+g[b+132>>2]+f*+g[b+152>>2];g[b+136>>2]=(1.0-f)*+g[b+136>>2]+f*+g[b+156>>2];g[b+140>>2]=(1.0-f)*+g[b+140>>2]+f*+g[b+160>>2];break}}while(0);o=c[b+8>>2]|0;c[o+52>>2]=c[b+132>>2];c[o+52+4>>2]=c[b+132+4>>2];c[o+52+8>>2]=c[b+132+8>>2];c[o+52+12>>2]=c[b+132+12>>2];q=c[b+8>>2]|0;c[q+304>>2]=(c[q+304>>2]|0)+1;c[q+4>>2]=c[o+4>>2];c[q+4+4>>2]=c[o+4+4>>2];c[q+4+8>>2]=c[o+4+8>>2];c[q+4+12>>2]=c[o+4+12>>2];c[q+20>>2]=c[o+20>>2];c[q+20+4>>2]=c[o+20+4>>2];c[q+20+8>>2]=c[o+20+8>>2];c[q+20+12>>2]=c[o+20+12>>2];c[q+36>>2]=c[o+36>>2];c[q+36+4>>2]=c[o+36+4>>2];c[q+36+8>>2]=c[o+36+8>>2];c[q+36+12>>2]=c[o+36+12>>2];c[q+52>>2]=c[o+52>>2];c[q+52+4>>2]=c[o+52+4>>2];c[q+52+8>>2]=c[o+52+8>>2];c[q+52+12>>2]=c[o+52+12>>2];a[b+220>>0]=0;if((((ge(b,d)|0?(a[b+220>>0]=1,ge(b,d)|0):0)?(a[b+220>>0]=1,ge(b,d)|0):0)?(a[b+220>>0]=1,ge(b,d)|0):0)?(a[b+220>>0]=1,ge(b,d)|0):0)a[b+220>>0]=1;q=(c[b+8>>2]|0)+52|0;c[b+152>>2]=c[q>>2];c[b+152+4>>2]=c[q+4>>2];c[b+152+8>>2]=c[q+8>>2];c[b+152+12>>2]=c[q+12>>2];$p(b+132|0,q|0,16)|0;if(+g[b+24>>2]>0.0){g[b+24>>2]=0.0;g[b+20>>2]=0.0;c[b+148>>2]=c[b+60>>2]}}else{g[b+148>>2]=k;c[b+132>>2]=c[b+152>>2];c[b+132+4>>2]=c[b+152+4>>2];c[b+132+8>>2]=c[b+152+8>>2];c[b+132+12>>2]=c[b+152+12>>2]}if(!(a[b+251>>0]|0)){J=+g[b+252>>2];K=J>e?e:J;g[b+252>>2]=J-e;hd(b,d,K*+g[b+68>>2],K*+g[b+72>>2],K*+g[b+76>>2])}else hd(b,d,+g[b+68>>2],+g[b+72>>2],+g[b+76>>2]);c[x+280>>2]=c[b+152>>2];c[x+280+4>>2]=c[b+152+4>>2];c[x+280+8>>2]=c[b+152+8>>2];c[x+280+12>>2]=c[b+152+12>>2];K=+g[b+20>>2];f=(K<0.0?-K:0.0)*e;if(!(K>0.0)){do if(f>0.0?(s=+g[b+28>>2],f>s):0){if((a[b+248>>0]|0)==0?a[b+249>>0]|0:0)break;f=s}while(0);p=f+ +g[b+148>>2];k=+g[b+256>>2]*p;m=p*+g[b+260>>2];p=p*+g[b+264>>2];g[b+152>>2]=+g[b+152>>2]-k;g[b+156>>2]=+g[b+156>>2]-m;g[b+160>>2]=+g[b+160>>2]-p;i=c[b+8>>2]|0;o=c[b+48>>2]|0;q=x+172+4|0;g[q>>2]=1.0;n=x+172+16|0;c[x+172+80>>2]=0;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;c[n+16>>2]=0;c[n+20>>2]=0;c[n+24>>2]=0;c[n+28>>2]=0;c[x+172>>2]=5252;c[x+172+84>>2]=i;c[x+172+88>>2]=c[b+256>>2];c[x+172+88+4>>2]=c[b+256+4>>2];c[x+172+88+8>>2]=c[b+256+8>>2];c[x+172+88+12>>2]=c[b+256+12>>2];c[x+172+104>>2]=o;n=c[i+188>>2]|0;c[x+172+8>>2]=c[n+4>>2];c[x+172+12>>2]=c[n+8>>2];g[x+64+4>>2]=1.0;j=x+64+16|0;c[x+64+80>>2]=0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;c[j+20>>2]=0;c[j+24>>2]=0;c[j+28>>2]=0;c[x+64>>2]=5252;c[x+64+84>>2]=i;c[x+64+88>>2]=c[b+256>>2];c[x+64+88+4>>2]=c[b+256+4>>2];c[x+64+88+8>>2]=c[b+256+8>>2];c[x+64+88+12>>2]=c[b+256+12>>2];c[x+64+104>>2]=o;c[x+64+8>>2]=c[n+4>>2];c[x+64+12>>2]=c[n+8>>2];n=x+408+24|0;o=x+296+44|0;i=0;while(1){c[x+408+12>>2]=0;c[x+408+12+4>>2]=0;c[x+408+20>>2]=1065353216;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;c[x+408+40>>2]=1065353216;c[x+408+44>>2]=0;c[x+296>>2]=1065353216;c[x+296+4>>2]=0;c[x+296+4+4>>2]=0;c[x+296+4+8>>2]=0;c[x+296+4+12>>2]=0;c[x+296+20>>2]=1065353216;c[x+296+24>>2]=0;c[x+296+24+4>>2]=0;c[x+296+24+8>>2]=0;c[x+296+24+12>>2]=0;c[x+296+40>>2]=1065353216;c[o>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;c[o+16>>2]=0;c[x+472+48>>2]=c[b+132>>2];c[x+472+48+4>>2]=c[b+132+4>>2];c[x+472+48+8>>2]=c[b+132+8>>2];c[x+472+48+12>>2]=c[b+132+12>>2];c[x+408+48>>2]=c[b+152>>2];c[x+408+48+4>>2]=c[b+152+4>>2];c[x+408+48+8>>2]=c[b+152+8>>2];c[x+408+48+12>>2]=c[b+152+12>>2];B=+g[b+168>>2];K=+g[b+172>>2];A=+g[b+176>>2];I=+g[b+180>>2];z=B*(2.0/(B*B+K*K+A*A+I*I));H=K*(2.0/(B*B+K*K+A*A+I*I));J=A*(2.0/(B*B+K*K+A*A+I*I));g[x+472>>2]=1.0-(K*H+A*J);g[x+472+4>>2]=B*H-I*J;g[x+472+8>>2]=B*J+I*H;g[x+472+12>>2]=0.0;g[x+472+16>>2]=B*H+I*J;g[x+472+20>>2]=1.0-(B*z+A*J);g[x+472+24>>2]=K*J-I*z;g[x+472+28>>2]=0.0;g[x+472+32>>2]=B*J-I*H;g[x+472+36>>2]=K*J+I*z;g[x+472+40>>2]=1.0-(B*z+K*H);g[x+472+44>>2]=0.0;H=+g[b+184>>2];K=+g[b+188>>2];z=+g[b+192>>2];B=+g[b+196>>2];I=H*(2.0/(H*H+K*K+z*z+B*B));J=K*(2.0/(H*H+K*K+z*z+B*B));A=z*(2.0/(H*H+K*K+z*z+B*B));g[x+408>>2]=1.0-(K*J+z*A);g[x+408+4>>2]=H*J-B*A;g[x+408+8>>2]=H*A+B*J;g[x+408+12>>2]=0.0;g[x+408+16>>2]=H*J+B*A;g[x+408+20>>2]=1.0-(H*I+z*A);g[n>>2]=K*A-B*I;g[x+408+28>>2]=0.0;g[x+408+32>>2]=H*A-B*J;g[x+408+36>>2]=K*A+B*I;g[x+408+40>>2]=1.0-(H*I+K*J);g[x+408+44>>2]=0.0;J=+g[b+156>>2]-m;K=+g[b+160>>2]-p;g[x+296+48>>2]=+g[b+152>>2]-k;g[x+296+52>>2]=J;g[x+296+56>>2]=K;g[x+296+60>>2]=0.0;if(!(a[b+250>>0]|0)){Ud(d,c[b+12>>2]|0,x+472|0,x+408|0,x+172|0,+g[d+56>>2]);if(!(+g[q>>2]<1.0)?(c[(c[b+8>>2]|0)+204>>2]&4|0)==0:0)Ud(d,c[b+12>>2]|0,x+472|0,x+296|0,x+64|0,+g[d+56>>2])}else{pd(c[b+8>>2]|0,c[b+12>>2]|0,x+472|0,x+408|0,x+172|0,+g[d+56>>2]);if(!(+g[q>>2]<1.0)?(t=c[b+8>>2]|0,(c[t+204>>2]&4|0)==0):0)pd(t,c[b+12>>2]|0,x+472|0,x+296|0,x+64|0,+g[d+56>>2])}h=+g[b+20>>2];h=(h<0.0?-h:0.0)*e;if(!(a[b+290>>0]|0))if(+g[x+64+4>>2]<1.0?(v=c[b+8>>2]|0,(c[v+204>>2]&4|0)==0):0)j=Bb[c[(c[b>>2]|0)+56>>2]&63](b,v,c[x+64+80>>2]|0)|0;else j=0;else if((+g[q>>2]<1.0?1:+g[x+64+4>>2]<1.0)?(u=c[b+8>>2]|0,(c[u+204>>2]&4|0)==0):0)j=Bb[c[(c[b>>2]|0)+56>>2]&63](b,u,c[x+172+80>>2]|0)|0;else j=0;if(+g[b+20>>2]<0.0)f=+g[b+60>>2];else f=0.0;if(i|(!(h>0.0)|!(h>0]|0)==0?a[b+249>>0]|0:0){i=0;break}c[b+152>>2]=c[x+280>>2];c[b+152+4>>2]=c[x+280+4>>2];c[b+152+8>>2]=c[x+280+8>>2];c[b+152+12>>2]=c[x+280+12>>2];p=f+ +g[b+148>>2];k=+g[b+256>>2]*p;m=p*+g[b+260>>2];p=p*+g[b+264>>2];g[b+152>>2]=+g[b+152>>2]-k;g[b+156>>2]=+g[b+156>>2]-m;g[b+160>>2]=+g[b+160>>2]-p;i=1}j=c[b+8>>2]|0;if(+g[q>>2]<1.0?(c[j+204>>2]&4|0)==0:0)if(i|(Bb[c[(c[b>>2]|0)+56>>2]&63](b,j,c[x+172+80>>2]|0)|0))i=69;else i=73;else if(i)i=69;else i=73;if((i|0)==69){if(!(a[b+290>>0]|0)){i=b+289|0;f=+g[q>>2];h=+g[b+136>>2]}else{h=+g[b+136>>2];i=b+289|0;f=(a[b+289>>0]|0)==0?(h-+g[x+172+68>>2])*.5:+g[q>>2]}K=1.0-f;g[b+132>>2]=K*+g[b+132>>2]+f*+g[b+152>>2];g[b+136>>2]=K*h+f*+g[b+156>>2];g[b+140>>2]=K*+g[b+140>>2]+f*+g[b+160>>2];a[i>>0]=0;g[b+20>>2]=0.0;g[b+24>>2]=0.0;a[b+249>>0]=0}else if((i|0)==73){a[b+289>>0]=1;do if(a[b+290>>0]|0?(K=+g[b+20>>2],w=+g[b+28>>2],(K<0.0?-K:0.0)*e>w):0){if((a[b+248>>0]|0)==0?a[b+249>>0]|0:0)break;H=m+ +g[b+156>>2];J=p+ +g[b+160>>2];B=w+ +g[b+148>>2];I=B*+g[b+260>>2];K=B*+g[b+264>>2];g[b+152>>2]=k+ +g[b+152>>2]-+g[b+256>>2]*B;g[b+156>>2]=H-I;g[b+160>>2]=J-K}while(0);c[b+132>>2]=c[b+152>>2];c[b+132+4>>2]=c[b+152+4>>2];c[b+132+8>>2]=c[b+152+8>>2];c[b+132+12>>2]=c[b+152+12>>2]}}c[x+48>>2]=c[b+132>>2];c[x+48+4>>2]=c[b+132+4>>2];c[x+48+8>>2]=c[b+132+8>>2];c[x+48+12>>2]=c[b+132+12>>2];v=c[b+8>>2]|0;c[v+304>>2]=(c[v+304>>2]|0)+1;c[v+4>>2]=c[x>>2];c[v+4+4>>2]=c[x+4>>2];c[v+4+8>>2]=c[x+8>>2];c[v+4+12>>2]=c[x+12>>2];c[v+20>>2]=c[x+16>>2];c[v+20+4>>2]=c[x+16+4>>2];c[v+20+8>>2]=c[x+16+8>>2];c[v+20+12>>2]=c[x+16+12>>2];c[v+36>>2]=c[x+32>>2];c[v+36+4>>2]=c[x+32+4>>2];c[v+36+8>>2]=c[x+32+8>>2];c[v+36+12>>2]=c[x+32+12>>2];c[v+52>>2]=c[x+48>>2];c[v+52+4>>2]=c[x+48+4>>2];c[v+52+8>>2]=c[x+48+8>>2];c[v+52+12>>2]=c[x+48+12>>2];a[b+220>>0]=0;if((((ge(b,d)|0?(a[b+220>>0]=1,ge(b,d)|0):0)?(a[b+220>>0]=1,ge(b,d)|0):0)?(a[b+220>>0]=1,ge(b,d)|0):0)?(a[b+220>>0]=1,ge(b,d)|0):0)a[b+220>>0]=1;l=x;return}function uc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,k=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0,t=0.0,u=0.0,v=0,w=0,x=0.0,y=0,z=0.0,A=0,B=0.0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;I=l;l=l+192|0;if((e|0)<1){f=c[b+12>>2]|0;if(f|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;f=c[b+32>>2]|0;if(f|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;f=c[b+52>>2]|0;if(f|0){if(a[b+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+52>>2]=0}a[b+56>>0]=1;c[b+52>>2]=0;c[b+44>>2]=0;c[b+48>>2]=0;l=I;return}c[I+32>>2]=0;c[I+36>>2]=0;c[I+40>>2]=0;c[I+44>>2]=256;c[I+48>>2]=0;c[I+52>>2]=0;c[I+56>>2]=0;c[I+60>>2]=256;c[I+64>>2]=0;c[I+68>>2]=0;c[I+72>>2]=0;c[I+76>>2]=256;a[I+96>>0]=1;c[I+92>>2]=0;c[I+84>>2]=0;c[I+88>>2]=0;f=0;h=d;i=-246811958;s=1900671690;v=-246811958;w=1900671690;y=-246811958;A=1900671690;while(1){k=c[h>>2]|0;p=c[h+4>>2]|0;q=c[h+8>>2]|0;m=(c[j>>2]=k,+g[j>>2]);s=m<(c[j>>2]=s,+g[j>>2])?k:s;n=(c[j>>2]=p,+g[j>>2]);w=n<(c[j>>2]=w,+g[j>>2])?p:w;o=(c[j>>2]=q,+g[j>>2]);A=o<(c[j>>2]=A,+g[j>>2])?q:A;i=(c[j>>2]=i,+g[j>>2])>2]=v,+g[j>>2])>2]=y,+g[j>>2])>2]=i,+g[j>>2]);z=(c[j>>2]=s,+g[j>>2]);x=(c[j>>2]=v,+g[j>>2]);u=(c[j>>2]=w,+g[j>>2]);t=(c[j>>2]=y,+g[j>>2]);r=(c[j>>2]=A,+g[j>>2]);g[I+168>>2]=B-z;s=I+168+4|0;g[s>>2]=x-u;v=I+168+8|0;g[v>>2]=t-r;g[I+168+12>>2]=0.0;h=+g[I+168+((B-z>2]>2]=h;f=+g[I+168+((!(B-z>2]>>0)%3|0;c[I+104>>2]=f;G=(h^3)-f|0;c[I+108>>2]=G;g[I+168>>2]=(B-z)*9.788566967472434e-05;g[s>>2]=(x-u)*9.788566967472434e-05;g[v>>2]=(t-r)*9.788566967472434e-05;if(((G+1|0)%3|0|0)==(h|0)){m=(B-z)*9.788566967472434e-05;n=(x-u)*9.788566967472434e-05;o=(t-r)*9.788566967472434e-05}else{g[I+168>>2]=-((B-z)*9.788566967472434e-05);g[s>>2]=-((x-u)*9.788566967472434e-05);g[v>>2]=-((t-r)*9.788566967472434e-05);m=-((B-z)*9.788566967472434e-05);n=-((x-u)*9.788566967472434e-05);o=-((t-r)*9.788566967472434e-05)}c[I>>2]=c[I+168>>2];c[I+4>>2]=c[I+168+4>>2];c[I+8>>2]=c[I+168+8>>2];c[I+12>>2]=c[I+168+12>>2];if(m!=0.0)g[I+168>>2]=1.0/m;if(n!=0.0)g[s>>2]=1.0/n;if(o!=0.0)g[v>>2]=1.0/o;g[I+16>>2]=(B+z)*.5;g[I+20>>2]=(x+u)*.5;g[I+24>>2]=(t+r)*.5;g[I+28>>2]=0.0;w=I+144+16|0;a[w>>0]=1;y=I+144+12|0;c[y>>2]=0;c[I+144+4>>2]=0;c[I+144+8>>2]=0;c[6995]=(c[6995]|0)+1;f=sc((e<<4|3)+16|0)|0;if(!f)h=0;else{c[(f+4+15&-16)+-4>>2]=f;h=f+4+15&-16}i=c[I+144+4>>2]|0;k=c[y>>2]|0;if((i|0)<=0){if(k|0)H=32}else{f=0;do{H=h+(f<<4)|0;G=k+(f<<4)|0;c[H>>2]=c[G>>2];c[H+4>>2]=c[G+4>>2];c[H+8>>2]=c[G+8>>2];c[H+12>>2]=c[G+12>>2];f=f+1|0}while((f|0)!=(i|0));H=32}if((H|0)==32){if(a[w>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[y>>2]=0}a[w>>0]=1;c[y>>2]=h;c[I+144+8>>2]=e;c[h>>2]=c[I+128>>2];c[h+4>>2]=c[I+128+4>>2];c[h+8>>2]=c[I+128+8>>2];c[h+12>>2]=c[I+128+12>>2];if((e|0)!=1){f=1;do{G=(c[y>>2]|0)+(f<<4)|0;c[G>>2]=c[I+128>>2];c[G+4>>2]=c[I+128+4>>2];c[G+8>>2]=c[I+128+8>>2];c[G+12>>2]=c[I+128+12>>2];f=f+1|0}while((f|0)!=(e|0))}c[I+144+4>>2]=e;i=I+128+(c[I+108>>2]<<2)|0;k=c[y>>2]|0;p=I+128+(c[I+112>>2]<<2)|0;q=I+128+(c[I+104>>2]<<2)|0;o=+g[I+16>>2];r=+g[I+20>>2];t=+g[I+24>>2];u=+g[I+168>>2];n=+g[s>>2];m=+g[v>>2];h=0;f=d;while(1){z=(+g[f+4>>2]-r)*n;B=(+g[f+8>>2]-t)*m;g[I+128>>2]=(+g[f>>2]-o)*u;g[I+128+4>>2]=z;g[I+128+8>>2]=B;g[I+128+12>>2]=0.0;c[k+(h<<4)>>2]=~~+g[i>>2];c[k+(h<<4)+4>>2]=~~+g[p>>2];c[k+(h<<4)+8>>2]=~~+g[q>>2];c[k+(h<<4)+12>>2]=h;h=h+1|0;if((h|0)==(e|0))break;else f=f+16|0}if((e|0)>1)ah(I+144|0,0,e+-1|0);c[I+36>>2]=c[I+32>>2];c[I+40>>2]=0;c[I+44>>2]=e;f=c[I+84>>2]|0;if((f|0)<(e|0)){if((c[I+88>>2]|0)<(e|0)){if(!e){h=0;k=f}else{c[6995]=(c[6995]|0)+1;h=sc((e<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}k=c[I+84>>2]|0}if((k|0)>0){i=0;do{c[h+(i<<2)>>2]=c[(c[I+92>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(k|0))}i=c[I+92>>2]|0;if(i|0){if(a[I+96>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[I+92>>2]=0}a[I+96>>0]=1;c[I+92>>2]=h;c[I+88>>2]=e}do{c[(c[I+92>>2]|0)+(f<<2)>>2]=0;f=f+1|0}while((f|0)!=(e|0))}c[I+84>>2]=e;p=0;do{f=c[I+40>>2]|0;if(!f){f=c[I+36>>2]|0;if(!f){c[6995]=(c[6995]|0)+1;f=sc(31)|0;if(!f)h=0;else{c[(f+4+15&-16)+-4>>2]=f;h=f+4+15&-16}f=c[I+44>>2]|0;c[h+4>>2]=f;i=h+8|0;c[i>>2]=0;c[6995]=(c[6995]|0)+1;f=sc((f*112|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}c[h>>2]=f;c[i>>2]=c[I+32>>2];c[I+32>>2]=h}else{c[I+36>>2]=c[f+8>>2];h=f}f=c[h>>2]|0;k=c[h+4>>2]|0;if((k|0)>0){h=0;i=f;do{h=h+1|0;G=i;i=i+112|0;c[G>>2]=(h|0)<(k|0)?i:0}while((h|0)!=(k|0))}}c[I+40>>2]=c[f>>2];G=f+104|0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[G>>2]=-1;c[f+8>>2]=0;E=(c[y>>2]|0)+(p<<4)|0;F=f+88|0;c[F>>2]=c[E>>2];c[F+4>>2]=c[E+4>>2];c[F+8>>2]=c[E+8>>2];c[F+12>>2]=c[E+12>>2];c[G>>2]=-1;c[(c[I+92>>2]|0)+(p<<2)>>2]=f;p=p+1|0}while((p|0)<(e|0));f=c[y>>2]|0;if(f|0){if(a[w>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[y>>2]=0}a[w>>0]=1;c[y>>2]=0;c[I+144+4>>2]=0;c[I+144+8>>2]=0;c[I+52>>2]=c[I+48>>2];c[I+56>>2]=0;c[I+60>>2]=e*6;c[I+116>>2]=0;c[I+120>>2]=0;c[I+100>>2]=-3;c[I+128>>2]=0;c[I+128+4>>2]=0;c[I+128+8>>2]=0;c[I+128+12>>2]=0;mc(I,0,e,I+128|0);c[I+124>>2]=c[I+128>>2];f=c[y>>2]|0;if(f|0){if(a[w>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[y>>2]=0}f=c[b+4>>2]|0;if((f|0)<0){if((c[b+8>>2]|0)<0){h=c[b+12>>2]|0;if(h|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=0;c[b+8>>2]=0}do{G=(c[b+12>>2]|0)+(f<<4)|0;c[G>>2]=c[I+168>>2];c[G+4>>2]=c[I+168+4>>2];c[G+8>>2]=c[I+168+8>>2];c[G+12>>2]=c[I+168+12>>2];f=f+1|0}while((f|0)!=0)}c[b+4>>2]=0;c[I+168>>2]=0;c[I+168+4>>2]=0;c[I+168+8>>2]=0;f=c[b+24>>2]|0;if((f|0)<0){if((c[b+28>>2]|0)<0){h=c[b+32>>2]|0;if(h|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+28>>2]=0}do{G=(c[b+32>>2]|0)+(f*12|0)|0;c[G>>2]=c[I+168>>2];c[G+4>>2]=c[I+168+4>>2];c[G+8>>2]=c[I+168+8>>2];f=f+1|0}while((f|0)!=0)}c[b+24>>2]=0;h=c[b+44>>2]|0;if((h|0)<0){f=c[b+52>>2]|0;if((c[b+48>>2]|0)<0){do if(f|0){if(!(a[b+56>>0]|0))break;c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}while(0);a[b+56>>0]=1;c[b+52>>2]=0;c[b+48>>2]=0;f=0}Yk(f+(h<<2)|0,0,P(h,-4)|0)|0}c[b+44>>2]=0;h=c[I+124>>2]|0;do if((c[h+104>>2]|0)<0){c[h+104>>2]=0;c[6995]=(c[6995]|0)+1;f=sc(23)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}c[f>>2]=h;G=0;s=1;v=f;w=1;i=f;y=f;while(1){if((c[h+100>>2]|0)>-1){g[I+168+(c[I+108>>2]<<2)>>2]=+(c[h+88>>2]|0);g[I+168+(c[I+112>>2]<<2)>>2]=+(c[h+92>>2]|0);m=+(c[h+96>>2]|0)}else{F=h+24|0;E=h+32|0;B=+ln(c[F>>2]|0,c[F+4>>2]|0,c[E>>2]|0,c[E+4>>2]|0);E=h+72|0;F=h+80|0;m=+ln(c[E>>2]|0,c[E+4>>2]|0,c[F>>2]|0,c[F+4>>2]|0);g[I+168+(c[I+108>>2]<<2)>>2]=B/m;F=h+40|0;E=h+48|0;B=+ln(c[F>>2]|0,c[F+4>>2]|0,c[E>>2]|0,c[E+4>>2]|0)/m;g[I+168+(c[I+112>>2]<<2)>>2]=B;E=h+56|0;F=h+64|0;m=+ln(c[E>>2]|0,c[E+4>>2]|0,c[F>>2]|0,c[F+4>>2]|0)/m}g[I+168+(c[I+104>>2]<<2)>>2]=m;m=+g[I+168>>2]*+g[I>>2]+ +g[I+16>>2];n=+g[I+168+4>>2]*+g[I+4>>2]+ +g[I+20>>2];o=+g[I+168+8>>2]*+g[I+8>>2]+ +g[I+24>>2];f=c[b+4>>2]|0;do if((f|0)==(c[b+8>>2]|0)){q=f|0?f<<1:1;if((f|0)>=(q|0))break;if(!q)p=0;else{c[6995]=(c[6995]|0)+1;f=sc((q<<4|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}p=f;f=c[b+4>>2]|0}if((f|0)>0){k=0;do{F=p+(k<<4)|0;E=(c[b+12>>2]|0)+(k<<4)|0;c[F>>2]=c[E>>2];c[F+4>>2]=c[E+4>>2];c[F+8>>2]=c[E+8>>2];c[F+12>>2]=c[E+12>>2];k=k+1|0}while((k|0)!=(f|0))}f=c[b+12>>2]|0;if(f|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=p;c[b+8>>2]=q;f=c[b+4>>2]|0}while(0);F=c[b+12>>2]|0;g[F+(f<<4)>>2]=m;g[F+(f<<4)+4>>2]=n;g[F+(f<<4)+8>>2]=o;g[F+(f<<4)+12>>2]=0.0;c[b+4>>2]=(c[b+4>>2]|0)+1;F=c[h+8>>2]|0;if(!F){k=s;A=v;h=w}else{D=F;E=-1;f=-1;A=s;e=v;h=w;while(1){C=D+20|0;p=c[C>>2]|0;if((p|0)<0){d=c[b+24>>2]|0;c[I+168>>2]=0;c[I+168+4>>2]=0;c[I+168+8>>2]=0;do if((d|0)==(c[b+28>>2]|0)){s=d|0?d<<1:1;if((d|0)>=(s|0)){k=d;break}if(!s){k=0;q=d}else{c[6995]=(c[6995]|0)+1;k=sc((s*12|3)+16|0)|0;if(!k)k=0;else{c[(k+4+15&-16)+-4>>2]=k;k=k+4+15&-16}q=c[b+24>>2]|0}if((q|0)>0){p=0;do{w=k+(p*12|0)|0;v=(c[b+32>>2]|0)+(p*12|0)|0;c[w>>2]=c[v>>2];c[w+4>>2]=c[v+4>>2];c[w+8>>2]=c[v+8>>2];p=p+1|0}while((p|0)!=(q|0))}p=c[b+32>>2]|0;if(p|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=k;c[b+28>>2]=s;k=c[b+24>>2]|0}else k=d;while(0);k=(c[b+32>>2]|0)+(k*12|0)|0;c[k>>2]=c[I+168>>2];c[k+4>>2]=c[I+168+4>>2];c[k+8>>2]=c[I+168+8>>2];k=(c[b+24>>2]|0)+1|0;c[b+24>>2]=k;c[I+168>>2]=0;c[I+168+4>>2]=0;c[I+168+8>>2]=0;do if((k|0)==(c[b+28>>2]|0)){s=k|0?k<<1:1;if((k|0)>=(s|0))break;if(!s)q=0;else{c[6995]=(c[6995]|0)+1;k=sc((s*12|3)+16|0)|0;if(!k)k=0;else{c[(k+4+15&-16)+-4>>2]=k;k=k+4+15&-16}q=k;k=c[b+24>>2]|0}if((k|0)>0){p=0;do{w=q+(p*12|0)|0;v=(c[b+32>>2]|0)+(p*12|0)|0;c[w>>2]=c[v>>2];c[w+4>>2]=c[v+4>>2];c[w+8>>2]=c[v+8>>2];p=p+1|0}while((p|0)!=(k|0))}k=c[b+32>>2]|0;if(k|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=q;c[b+28>>2]=s;k=c[b+24>>2]|0}while(0);w=(c[b+32>>2]|0)+(k*12|0)|0;c[w>>2]=c[I+168>>2];c[w+4>>2]=c[I+168+4>>2];c[w+8>>2]=c[I+168+8>>2];c[b+24>>2]=(c[b+24>>2]|0)+1;w=c[b+32>>2]|0;c[C>>2]=d;c[(c[D+8>>2]|0)+20>>2]=d+1;c[w+(d*12|0)+4>>2]=1;c[w+((d+1|0)*12|0)+4>>2]=-1;v=c[D+12>>2]|0;k=c[v+104>>2]|0;if((k|0)<0){c[v+104>>2]=h;do if((h|0)==(A|0)){k=A|0?A<<1:1;if((A|0)>=(k|0)){k=A;p=e;s=y;break}do if(!k)q=0;else{c[6995]=(c[6995]|0)+1;p=sc((k<<2|3)+16|0)|0;if(!p){q=0;break}c[(p+4+15&-16)+-4>>2]=p;q=p+4+15&-16}while(0);if((A|0)>0){p=0;do{c[q+(p<<2)>>2]=c[e+(p<<2)>>2];p=p+1|0}while((p|0)!=(A|0));if(!i){p=q;s=q;i=q;break}}else if((e|0)==0|(i|0)==0){p=q;s=q;i=q;break}c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);p=q;s=q;i=q}else{k=A;p=e;s=y}while(0);c[p+(h<<2)>>2]=v;v=h;h=h+1|0;q=s}else{v=k;k=A;p=e;q=y}c[w+(d*12|0)+8>>2]=v;c[w+((d+1|0)*12|0)+8>>2]=G;s=p;p=c[C>>2]|0}else{k=A;s=e;q=y}if((E|0)>-1)c[(c[b+32>>2]|0)+(p*12|0)>>2]=E-p;else f=p;D=c[D>>2]|0;if((D|0)==(F|0))break;else{E=p;A=k;e=s;y=q}}c[(c[b+32>>2]|0)+(f*12|0)>>2]=p-f;A=s;y=q}f=G+1|0;if((f|0)>=(h|0))break;G=f;s=k;v=A;w=h;h=c[A+(f<<2)>>2]|0}if((G|0)>-1){v=0;while(1){w=c[(c[A+(v<<2)>>2]|0)+8>>2]|0;if(w|0){s=w;do{q=s+20|0;f=c[q>>2]|0;if((f|0)>-1){h=c[b+44>>2]|0;do if((h|0)==(c[b+48>>2]|0)){p=h|0?h<<1:1;if((h|0)>=(p|0))break;if(!p)f=0;else{c[6995]=(c[6995]|0)+1;f=sc((p<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[b+44>>2]|0}k=c[b+52>>2]|0;if((h|0)<=0){if(k)H=180}else{i=0;do{c[f+(i<<2)>>2]=c[k+(i<<2)>>2];i=i+1|0}while((i|0)!=(h|0));H=180}if((H|0)==180){H=0;if(a[b+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[b+52>>2]=0;h=c[b+44>>2]|0}a[b+56>>0]=1;c[b+52>>2]=f;c[b+48>>2]=p;f=c[q>>2]|0}while(0);c[(c[b+52>>2]|0)+(h<<2)>>2]=f;c[b+44>>2]=(c[b+44>>2]|0)+1;f=s;do{c[f+20>>2]=-1;f=c[(c[f+8>>2]|0)+4>>2]|0}while((f|0)!=(s|0))}s=c[s>>2]|0}while((s|0)!=(w|0))}if((v|0)==(G|0))break;else v=v+1|0}}if((A|0)==0|(y|0)==0)break;c[6996]=(c[6996]|0)+1;Cd(c[y+-4>>2]|0)}while(0);Ri(I);l=I;return}function vc(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=+i;var j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0,E=0,F=0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0;F=l;l=l+960|0;E=c[f+4>>2]|0;C=c[f+12>>2]|0;j=c[E+4>>2]|0;if((j|0)<20){c[F+776>>2]=3896;c[F+776+168>>2]=0;g[F+776+172>>2]=i;c[F+776+164>>2]=c[h+4>>2];g[F+416+308>>2]=9.999999747378752e-05;a[F+416+332>>0]=0;c[F+352>>2]=9464;c[F+128>>2]=9532;c[F+128+4>>2]=F+416;c[F+128+8>>2]=F+352;c[F+128+12>>2]=b;c[F+128+16>>2]=E;c[F+128+20>>2]=0;if((Wd(F+128|0,d,e,C,C,F+776|0)|0?(u=F+776+132|0,p=+g[u>>2],q=+g[F+776+136>>2],r=+g[F+776+140>>2],p*p+q*q+r*r>9.999999747378752e-05):0)?(s=+g[F+776+164>>2],s<+g[h+4>>2]):0){i=1.0/+D(+(p*p+q*q+r*r));g[u>>2]=p*i;g[F+776+136>>2]=q*i;g[F+776+140>>2]=r*i;c[F+64>>2]=c[f+8>>2];c[F+64+4>>2]=0;c[F+64+8>>2]=c[u>>2];c[F+64+8+4>>2]=c[u+4>>2];c[F+64+8+8>>2]=c[u+8>>2];c[F+64+8+12>>2]=c[u+12>>2];c[F+64+24>>2]=c[F+776+148>>2];c[F+64+24+4>>2]=c[F+776+148+4>>2];c[F+64+24+8>>2]=c[F+776+148+8>>2];c[F+64+24+12>>2]=c[F+776+148+12>>2];g[F+64+40>>2]=s;+qb[c[(c[h>>2]|0)+12>>2]&31](h,F+64|0,1)}l=F;return}if((j+-21|0)>>>0>=9){if((j|0)!=31){l=F;return}u=c[(c[b>>2]|0)+8>>2]|0;M=+g[C>>2];N=+g[C+16>>2];O=+g[C+32>>2];w=+g[C+4>>2];v=+g[C+20>>2];s=+g[C+36>>2];r=+g[C+8>>2];p=+g[C+24>>2];n=+g[C+40>>2];B=-+g[C+48>>2];z=-+g[C+52>>2];x=-+g[C+56>>2];k=+g[d>>2];A=+g[d+16>>2];y=+g[d+32>>2];G=+g[d+4>>2];H=+g[d+20>>2];I=+g[d+36>>2];J=+g[d+8>>2];K=+g[d+24>>2];L=+g[d+40>>2];q=+g[d+48>>2];o=+g[d+52>>2];m=+g[d+56>>2];g[F+64>>2]=M*k+N*A+O*y;g[F+64+4>>2]=M*G+N*H+O*I;g[F+64+8>>2]=M*J+N*K+O*L;g[F+64+12>>2]=0.0;g[F+64+16>>2]=w*k+v*A+s*y;g[F+64+20>>2]=w*G+v*H+s*I;g[F+64+24>>2]=w*J+v*K+s*L;g[F+64+28>>2]=0.0;g[F+64+32>>2]=r*k+p*A+n*y;g[F+64+36>>2]=r*G+p*H+n*I;g[F+64+40>>2]=r*J+p*K+n*L;g[F+64+44>>2]=0.0;g[F+64+48>>2]=M*B+N*z+O*x+(M*q+N*o+O*m);g[F+64+52>>2]=w*B+v*z+s*x+(w*q+v*o+s*m);g[F+64+56>>2]=r*B+p*z+n*x+(r*q+p*o+n*m);g[F+64+60>>2]=0.0;Vb[u&127](b,F+64|0,F+776|0,F+416|0);u=c[(c[b>>2]|0)+8>>2]|0;m=+g[C>>2];n=+g[C+16>>2];o=+g[C+32>>2];p=+g[C+4>>2];q=+g[C+20>>2];r=+g[C+36>>2];x=+g[C+8>>2];z=+g[C+24>>2];B=+g[C+40>>2];s=-+g[C+48>>2];v=-+g[C+52>>2];w=-+g[C+56>>2];O=+g[e>>2];N=+g[e+16>>2];M=+g[e+32>>2];L=+g[e+4>>2];K=+g[e+20>>2];J=+g[e+36>>2];I=+g[e+8>>2];H=+g[e+24>>2];G=+g[e+40>>2];y=+g[e+48>>2];A=+g[e+52>>2];k=+g[e+56>>2];g[F+64>>2]=m*O+n*N+o*M;g[F+64+4>>2]=m*L+n*K+o*J;g[F+64+8>>2]=m*I+n*H+o*G;g[F+64+12>>2]=0.0;g[F+64+16>>2]=p*O+q*N+r*M;g[F+64+20>>2]=p*L+q*K+r*J;g[F+64+24>>2]=p*I+q*H+r*G;g[F+64+28>>2]=0.0;g[F+64+32>>2]=x*O+z*N+B*M;g[F+64+36>>2]=x*L+z*K+B*J;g[F+64+40>>2]=x*I+z*H+B*G;g[F+64+44>>2]=0.0;g[F+64+48>>2]=m*s+n*v+o*w+(m*y+n*A+o*k);g[F+64+52>>2]=p*s+q*v+r*w+(p*y+q*A+r*k);g[F+64+56>>2]=x*s+z*v+B*w+(x*y+z*A+B*k);g[F+64+60>>2]=0.0;Vb[u&127](b,F+64|0,F+352|0,F+128|0);k=+g[F+352>>2];if(k<+g[F+776>>2])g[F+776>>2]=k;k=+g[F+352+4>>2];if(k<+g[F+776+4>>2])g[F+776+4>>2]=k;k=+g[F+352+8>>2];if(k<+g[F+776+8>>2])g[F+776+8>>2]=k;k=+g[F+352+12>>2];if(k<+g[F+776+12>>2])g[F+776+12>>2]=k;k=+g[F+128>>2];if(+g[F+416>>2]>2]=k;k=+g[F+128+4>>2];if(+g[F+416+4>>2]>2]=k;k=+g[F+128+8>>2];if(+g[F+416+8>>2]>2]=k;k=+g[F+128+12>>2];if(+g[F+416+12>>2]>2]=k;c[F+64>>2]=6224;c[F+64+4>>2]=f;c[F+64+8>>2]=b;c[F+64+12>>2]=d;c[F+64+16>>2]=e;g[F+64+20>>2]=i;c[F+64+24>>2]=E;c[F+64+28>>2]=C;c[F+64+32>>2]=h;j=c[E+68>>2]|0;if(!j){if((c[E+20>>2]|0)>0){j=0;do{f=c[E+28>>2]|0;h=c[f+(j*80|0)+64>>2]|0;e=f+(j*80|0)|0;c[F>>2]=c[e>>2];c[F+4>>2]=c[e+4>>2];c[F+8>>2]=c[e+8>>2];c[F+12>>2]=c[e+12>>2];e=f+(j*80|0)+16|0;c[F+16>>2]=c[e>>2];c[F+16+4>>2]=c[e+4>>2];c[F+16+8>>2]=c[e+8>>2];c[F+16+12>>2]=c[e+12>>2];e=f+(j*80|0)+32|0;c[F+32>>2]=c[e>>2];c[F+32+4>>2]=c[e+4>>2];c[F+32+8>>2]=c[e+8>>2];c[F+32+12>>2]=c[e+12>>2];f=f+(j*80|0)+48|0;c[F+48>>2]=c[f>>2];c[F+48+4>>2]=c[f+4>>2];c[F+48+8>>2]=c[f+8>>2];c[F+48+12>>2]=c[f+12>>2];jg(F+64|0,j,F,h);j=j+1|0}while((j|0)<(c[E+20>>2]|0))}}else{c[F>>2]=c[F+776>>2];c[F+4>>2]=c[F+776+4>>2];c[F+8>>2]=c[F+776+8>>2];c[F+12>>2]=c[F+776+12>>2];c[F+16>>2]=c[F+416>>2];c[F+16+4>>2]=c[F+416+4>>2];c[F+16+8>>2]=c[F+416+8>>2];c[F+16+12>>2]=c[F+416+12>>2];Bf(c[j>>2]|0,F,F+64|0)}l=F;return}switch(j|0){case 21:{o=+g[C>>2];p=+g[C+16>>2];q=+g[C+32>>2];r=+g[C+4>>2];s=+g[C+20>>2];v=+g[C+36>>2];w=+g[C+8>>2];x=+g[C+24>>2];y=+g[C+40>>2];z=-+g[C+48>>2];A=-+g[C+52>>2];B=-+g[C+56>>2];n=+g[d+48>>2];m=+g[d+52>>2];k=+g[d+56>>2];g[F+416>>2]=o*z+p*A+q*B+(o*n+p*m+q*k);g[F+416+4>>2]=r*z+s*A+v*B+(r*n+s*m+v*k);g[F+416+8>>2]=w*z+x*A+y*B+(w*n+x*m+y*k);g[F+416+12>>2]=0.0;k=+g[e+48>>2];m=+g[e+52>>2];n=+g[e+56>>2];G=+g[e>>2];H=+g[e+16>>2];I=+g[e+32>>2];J=+g[e+4>>2];K=+g[e+20>>2];L=+g[e+36>>2];M=+g[e+8>>2];N=+g[e+24>>2];O=+g[e+40>>2];g[F+352>>2]=o*G+p*H+q*I;g[F+352+4>>2]=o*J+p*K+q*L;g[F+352+8>>2]=o*M+p*N+q*O;g[F+352+12>>2]=0.0;g[F+352+16>>2]=r*G+s*H+v*I;g[F+352+20>>2]=r*J+s*K+v*L;g[F+352+24>>2]=r*M+s*N+v*O;g[F+352+28>>2]=0.0;g[F+352+32>>2]=w*G+x*H+y*I;g[F+352+36>>2]=w*J+x*K+y*L;g[F+352+40>>2]=w*M+x*N+y*O;j=F+352+44|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;j=c[f+8>>2]|0;O=+nb[c[(c[E>>2]|0)+48>>2]&15](E);c[F+128>>2]=9392;c[F+128+4>>2]=b;c[F+128+8>>2]=c[d>>2];c[F+128+8+4>>2]=c[d+4>>2];c[F+128+8+8>>2]=c[d+8>>2];c[F+128+8+12>>2]=c[d+12>>2];c[F+128+24>>2]=c[d+16>>2];c[F+128+24+4>>2]=c[d+16+4>>2];c[F+128+24+8>>2]=c[d+16+8>>2];c[F+128+24+12>>2]=c[d+16+12>>2];c[F+128+40>>2]=c[d+32>>2];c[F+128+40+4>>2]=c[d+32+4>>2];c[F+128+40+8>>2]=c[d+32+8>>2];c[F+128+40+12>>2]=c[d+32+12>>2];c[F+128+56>>2]=c[d+48>>2];c[F+128+56+4>>2]=c[d+48+4>>2];c[F+128+56+8>>2]=c[d+48+8>>2];c[F+128+56+12>>2]=c[d+48+12>>2];c[F+128+72>>2]=c[e>>2];c[F+128+72+4>>2]=c[e+4>>2];c[F+128+72+8>>2]=c[e+8>>2];c[F+128+72+12>>2]=c[e+12>>2];c[F+128+88>>2]=c[e+16>>2];c[F+128+88+4>>2]=c[e+16+4>>2];c[F+128+88+8>>2]=c[e+16+8>>2];c[F+128+88+12>>2]=c[e+16+12>>2];c[F+128+104>>2]=c[e+32>>2];c[F+128+104+4>>2]=c[e+32+4>>2];c[F+128+104+8>>2]=c[e+32+8>>2];c[F+128+104+12>>2]=c[e+32+12>>2];c[F+128+120>>2]=c[e+48>>2];c[F+128+120+4>>2]=c[e+48+4>>2];c[F+128+120+8>>2]=c[e+48+8>>2];c[F+128+120+12>>2]=c[e+48+12>>2];c[F+128+136>>2]=c[C>>2];c[F+128+136+4>>2]=c[C+4>>2];c[F+128+136+8>>2]=c[C+8>>2];c[F+128+136+12>>2]=c[C+12>>2];c[F+128+152>>2]=c[C+16>>2];c[F+128+152+4>>2]=c[C+16+4>>2];c[F+128+152+8>>2]=c[C+16+8>>2];c[F+128+152+12>>2]=c[C+16+12>>2];c[F+128+168>>2]=c[C+32>>2];c[F+128+168+4>>2]=c[C+32+4>>2];c[F+128+168+8>>2]=c[C+32+8>>2];c[F+128+168+12>>2]=c[C+32+12>>2];c[F+128+184>>2]=c[C+48>>2];c[F+128+184+4>>2]=c[C+48+4>>2];c[F+128+184+8>>2]=c[C+48+8>>2];c[F+128+184+12>>2]=c[C+48+12>>2];g[F+128+204>>2]=O;c[F+128>>2]=6176;c[F+128+212>>2]=h;c[F+128+216>>2]=j;c[F+128+220>>2]=E;c[F+128+200>>2]=c[h+4>>2];g[F+128+208>>2]=i;Vb[c[(c[b>>2]|0)+8>>2]&127](b,F+352|0,F+64|0,F);j=c[E+52>>2]|0;c[F+776>>2]=7252;c[F+776+4>>2]=j;c[F+776+8>>2]=F+128;j=c[E+56>>2]|0;if(!(a[j+60>>0]|0))Re(j,F+776|0,F+416|0,o*z+p*A+q*B+(o*k+p*m+q*n),r*z+s*A+v*B+(r*k+s*m+v*n),w*z+x*A+y*B+(w*k+x*m+y*n),F+64|0,F);else ue(j,F+776|0,F+416|0,o*z+p*A+q*B+(o*k+p*m+q*n),r*z+s*A+v*B+(r*k+s*m+v*n),w*z+x*A+y*B+(w*k+x*m+y*n),F+64|0,F,c[j+56>>2]|0);l=F;return}case 28:{c[F+776>>2]=3896;c[F+776+168>>2]=0;g[F+776+172>>2]=i;c[F+776+164>>2]=c[h+4>>2];c[F+416>>2]=9532;c[F+416+4>>2]=0;c[F+416+8>>2]=0;c[F+416+12>>2]=b;c[F+416+16>>2]=0;c[F+416+20>>2]=E;if((Wd(F+416|0,d,e,C,C,F+776|0)|0?(t=F+776+132|0,k=+g[t>>2],m=+g[F+776+136>>2],n=+g[F+776+140>>2],k*k+m*m+n*n>9.999999747378752e-05):0)?(o=+g[F+776+164>>2],o<+g[h+4>>2]):0){O=1.0/+D(+(k*k+m*m+n*n));g[t>>2]=k*O;g[F+776+136>>2]=m*O;g[F+776+140>>2]=n*O;c[F+352>>2]=c[f+8>>2];c[F+352+4>>2]=0;c[F+352+8>>2]=c[t>>2];c[F+352+8+4>>2]=c[t+4>>2];c[F+352+8+8>>2]=c[t+8>>2];c[F+352+8+12>>2]=c[t+12>>2];c[F+352+24>>2]=c[F+776+148>>2];c[F+352+24+4>>2]=c[F+776+148+4>>2];c[F+352+24+8>>2]=c[F+776+148+8>>2];c[F+352+24+12>>2]=c[F+776+148+12>>2];g[F+352+40>>2]=o;+qb[c[(c[h>>2]|0)+12>>2]&31](h,F+352|0,1)}l=F;return}default:{o=+g[C>>2];p=+g[C+16>>2];q=+g[C+32>>2];w=+g[C+4>>2];x=+g[C+20>>2];y=+g[C+36>>2];J=+g[C+8>>2];L=+g[C+24>>2];N=+g[C+40>>2];H=-+g[C+48>>2];G=-+g[C+52>>2];B=-+g[C+56>>2];z=+g[d+48>>2];A=+g[d+52>>2];k=+g[d+56>>2];n=o*H+p*G+q*B+(o*z+p*A+q*k);m=w*H+x*G+y*B+(w*z+x*A+y*k);k=J*H+L*G+N*B+(J*z+L*A+N*k);A=+g[e+48>>2];z=+g[e+52>>2];v=+g[e+56>>2];r=o*H+p*G+q*B+(o*A+p*z+q*v);s=w*H+x*G+y*B+(w*A+x*z+y*v);v=J*H+L*G+N*B+(J*A+L*z+N*v);z=+g[e>>2];A=+g[e+16>>2];B=+g[e+32>>2];G=+g[e+4>>2];H=+g[e+20>>2];I=+g[e+36>>2];K=+g[e+8>>2];M=+g[e+24>>2];O=+g[e+40>>2];g[F+776>>2]=o*z+p*A+q*B;g[F+776+4>>2]=o*G+p*H+q*I;g[F+776+8>>2]=o*K+p*M+q*O;g[F+776+12>>2]=0.0;g[F+776+16>>2]=w*z+x*A+y*B;g[F+776+20>>2]=w*G+x*H+y*I;g[F+776+24>>2]=w*K+x*M+y*O;g[F+776+28>>2]=0.0;g[F+776+32>>2]=J*z+L*A+N*B;g[F+776+36>>2]=J*G+L*H+N*I;g[F+776+40>>2]=J*K+L*M+N*O;u=F+776+44|0;c[u>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;c[u+12>>2]=0;c[u+16>>2]=0;f=c[f+8>>2]|0;O=+nb[c[(c[E>>2]|0)+48>>2]&15](E);c[F+416>>2]=9392;c[F+416+4>>2]=b;c[F+416+8>>2]=c[d>>2];c[F+416+8+4>>2]=c[d+4>>2];c[F+416+8+8>>2]=c[d+8>>2];c[F+416+8+12>>2]=c[d+12>>2];c[F+416+24>>2]=c[d+16>>2];c[F+416+24+4>>2]=c[d+16+4>>2];c[F+416+24+8>>2]=c[d+16+8>>2];c[F+416+24+12>>2]=c[d+16+12>>2];c[F+416+40>>2]=c[d+32>>2];c[F+416+40+4>>2]=c[d+32+4>>2];c[F+416+40+8>>2]=c[d+32+8>>2];c[F+416+40+12>>2]=c[d+32+12>>2];c[F+416+56>>2]=c[d+48>>2];c[F+416+56+4>>2]=c[d+48+4>>2];c[F+416+56+8>>2]=c[d+48+8>>2];c[F+416+56+12>>2]=c[d+48+12>>2];c[F+416+72>>2]=c[e>>2];c[F+416+72+4>>2]=c[e+4>>2];c[F+416+72+8>>2]=c[e+8>>2];c[F+416+72+12>>2]=c[e+12>>2];c[F+416+88>>2]=c[e+16>>2];c[F+416+88+4>>2]=c[e+16+4>>2];c[F+416+88+8>>2]=c[e+16+8>>2];c[F+416+88+12>>2]=c[e+16+12>>2];c[F+416+104>>2]=c[e+32>>2];c[F+416+104+4>>2]=c[e+32+4>>2];c[F+416+104+8>>2]=c[e+32+8>>2];c[F+416+104+12>>2]=c[e+32+12>>2];c[F+416+120>>2]=c[e+48>>2];c[F+416+120+4>>2]=c[e+48+4>>2];c[F+416+120+8>>2]=c[e+48+8>>2];c[F+416+120+12>>2]=c[e+48+12>>2];c[F+416+136>>2]=c[C>>2];c[F+416+136+4>>2]=c[C+4>>2];c[F+416+136+8>>2]=c[C+8>>2];c[F+416+136+12>>2]=c[C+12>>2];c[F+416+152>>2]=c[C+16>>2];c[F+416+152+4>>2]=c[C+16+4>>2];c[F+416+152+8>>2]=c[C+16+8>>2];c[F+416+152+12>>2]=c[C+16+12>>2];c[F+416+168>>2]=c[C+32>>2];c[F+416+168+4>>2]=c[C+32+4>>2];c[F+416+168+8>>2]=c[C+32+8>>2];c[F+416+168+12>>2]=c[C+32+12>>2];c[F+416+184>>2]=c[C+48>>2];c[F+416+184+4>>2]=c[C+48+4>>2];c[F+416+184+8>>2]=c[C+48+8>>2];c[F+416+184+12>>2]=c[C+48+12>>2];g[F+416+204>>2]=O;c[F+416>>2]=6200;c[F+416+212>>2]=h;c[F+416+216>>2]=f;c[F+416+220>>2]=E;c[F+416+200>>2]=c[h+4>>2];g[F+416+208>>2]=i;Vb[c[(c[b>>2]|0)+8>>2]&127](b,F+776|0,F+352|0,F+128|0);g[F+64>>2]=n;g[F+64+4>>2]=m;g[F+64+8>>2]=k;g[F+64+12>>2]=0.0;if(r>2]=r;o=r}else o=n;if(s>2]=s;p=s}else p=m;if(v>2]=v;q=v}else q=k;g[F>>2]=n;g[F+4>>2]=m;g[F+8>>2]=k;g[F+12>>2]=0.0;if(n>2]=r;n=r}if(m>2]=s;m=s}if(k>2]=v;k=v}g[F+64>>2]=+g[F+352>>2]+o;g[F+64+4>>2]=+g[F+352+4>>2]+p;g[F+64+8>>2]=+g[F+352+8>>2]+q;g[F>>2]=+g[F+128>>2]+n;g[F+4>>2]=+g[F+128+4>>2]+m;g[F+8>>2]=+g[F+128+8>>2]+k;Vb[c[(c[E>>2]|0)+64>>2]&127](E,F+416|0,F+64|0,F);l=F;return}}}function wc(b){b=b|0;var d=0,e=0,f=0.0,h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0,J=0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0;J=l;l=l+64|0;if(!(a[b+356>>0]|0)){b=a[b+312>>0]|0;b=b<<24>>24!=0;l=J;return b|0}c[b+336>>2]=0;c[b+336+4>>2]=0;c[b+336+8>>2]=0;c[b+336+12>>2]=0;a[b+336+16>>0]=0;p=a[b+332>>0]|0;a[b+332>>0]=p&-16;a[b+356>>0]=0;switch(c[b>>2]|0){case 0:{a[b+312>>0]=0;b=0;b=b<<24>>24!=0;l=J;return b|0}case 1:{c[b+244>>2]=c[b+84>>2];c[b+244+4>>2]=c[b+84+4>>2];c[b+244+8>>2]=c[b+84+8>>2];c[b+244+12>>2]=c[b+84+12>>2];c[b+260>>2]=c[b+164>>2];c[b+260+4>>2]=c[b+164+4>>2];c[b+260+8>>2]=c[b+164+8>>2];c[b+260+12>>2]=c[b+164+12>>2];F=+g[b+248>>2]-+g[b+264>>2];G=+g[b+252>>2]-+g[b+268>>2];g[b+276>>2]=+g[b+244>>2]-+g[b+260>>2];g[b+280>>2]=F;g[b+284>>2]=G;g[b+288>>2]=0.0;a[b+352>>0]=0;a[b+332>>0]=p&-16;g[b+336>>2]=1.0;g[b+340>>2]=0.0;g[b+344>>2]=0.0;g[b+348>>2]=0.0;a[b+312>>0]=1;b=1;b=b<<24>>24!=0;l=J;return b|0}case 2:{f=+g[b+4>>2];i=+g[b+8>>2];j=+g[b+12>>2];k=+g[b+20>>2]-f;m=+g[b+24>>2]-i;n=+g[b+28>>2]-j;if((0.0-f)*k+(0.0-i)*m+(0.0-j)*n>0.0)if((0.0-f)*k+(0.0-i)*m+(0.0-j)*n>0]=p&-16|1;e=2;d=p&-16|1;i=((0.0-f)*k+(0.0-i)*m+(0.0-j)*n)/(k*k+m*m+n*n)}else{e=2;d=p&-16;i=1.0}else{e=1;d=p&-16;i=0.0}e=d|e;a[b+332>>0]=e;f=1.0-i;g[b+336>>2]=f;g[b+340>>2]=i;g[b+344>>2]=0.0;g[b+348>>2]=0.0;B=+g[b+84>>2];D=+g[b+88>>2];F=+g[b+92>>2];B=B+i*(+g[b+100>>2]-B);D=D+i*(+g[b+104>>2]-D);F=F+i*(+g[b+108>>2]-F);g[b+244>>2]=B;g[b+248>>2]=D;g[b+252>>2]=F;g[b+256>>2]=0.0;C=+g[b+164>>2];E=+g[b+168>>2];G=+g[b+172>>2];C=C+i*(+g[b+180>>2]-C);E=E+i*(+g[b+184>>2]-E);G=G+i*(+g[b+188>>2]-G);g[b+260>>2]=C;g[b+264>>2]=E;g[b+268>>2]=G;g[b+272>>2]=0.0;g[b+276>>2]=B-C;g[b+280>>2]=D-E;g[b+284>>2]=F-G;g[b+288>>2]=0.0;if(!(e&2)){c[b>>2]=1;d=0}else d=1;if(!(e&1)){I=b+164+(d<<4)|0;H=b+84+(d<<4)|0;r=b+4+(d<<4)|0;c[b>>2]=d;c[b+4>>2]=c[r>>2];c[b+4+4>>2]=c[r+4>>2];c[b+4+8>>2]=c[r+8>>2];c[b+4+12>>2]=c[r+12>>2];c[b+84>>2]=c[H>>2];c[b+84+4>>2]=c[H+4>>2];c[b+84+8>>2]=c[H+8>>2];c[b+84+12>>2]=c[H+12>>2];c[b+164>>2]=c[I>>2];c[b+164+4>>2]=c[I+4>>2];c[b+164+8>>2]=c[I+8>>2];c[b+164+12>>2]=c[I+12>>2]}I=i>=0.0&f>=0.0&1;a[b+312>>0]=I;b=I;b=b<<24>>24!=0;l=J;return b|0}case 3:{c[J+16>>2]=0;c[J+16+4>>2]=0;c[J+16+8>>2]=0;c[J+16+12>>2]=0;cf(J+16|0,b+4|0,b+20|0,b+36|0,b+316|0);G=+g[b+336>>2];f=+g[b+340>>2];i=+g[b+344>>2];B=+g[b+84>>2]*G+ +g[b+100>>2]*f+ +g[b+116>>2]*i;D=G*+g[b+88>>2]+f*+g[b+104>>2]+i*+g[b+120>>2];F=G*+g[b+92>>2]+f*+g[b+108>>2]+i*+g[b+124>>2];g[b+244>>2]=B;g[b+248>>2]=D;g[b+252>>2]=F;g[b+256>>2]=0.0;C=+g[b+164>>2]*G+ +g[b+180>>2]*f+ +g[b+196>>2]*i;E=G*+g[b+168>>2]+f*+g[b+184>>2]+i*+g[b+200>>2];G=G*+g[b+172>>2]+f*+g[b+188>>2]+i*+g[b+204>>2];g[b+260>>2]=C;g[b+264>>2]=E;g[b+268>>2]=G;g[b+272>>2]=0.0;g[b+276>>2]=B-C;g[b+280>>2]=D-E;g[b+284>>2]=F-G;g[b+288>>2]=0.0;e=c[b>>2]|0;do if((e|0)>3){d=a[b+332>>0]|0;if(!(d&8)){h=b+164+(e+-1<<4)|0;I=b+84+(e+-1<<4)|0;H=b+4+(e+-1<<4)|0;c[b>>2]=e+-1;c[b+52>>2]=c[H>>2];c[b+52+4>>2]=c[H+4>>2];c[b+52+8>>2]=c[H+8>>2];c[b+52+12>>2]=c[H+12>>2];c[b+132>>2]=c[I>>2];c[b+132+4>>2]=c[I+4>>2];c[b+132+8>>2]=c[I+8>>2];c[b+132+12>>2]=c[I+12>>2];c[b+212>>2]=c[h>>2];c[b+212+4>>2]=c[h+4>>2];c[b+212+8>>2]=c[h+8>>2];c[b+212+12>>2]=c[h+12>>2];h=e+-1|0;I=19}else{h=e;I=19}}else{if((e|0)==3){d=a[b+332>>0]|0;h=3;I=19;break}if((e|0)>1){d=a[b+332>>0]|0;e=2;I=23;break}if((e|0)==1){o=a[b+332>>0]|0;h=1;I=27}}while(0);if((I|0)==19){e=h+-1|0;if(!(d&4)){c[b>>2]=e;c[b+36>>2]=c[b+4+(e<<4)>>2];c[b+36+4>>2]=c[b+4+(e<<4)+4>>2];c[b+36+8>>2]=c[b+4+(e<<4)+8>>2];c[b+36+12>>2]=c[b+4+(e<<4)+12>>2];c[b+116>>2]=c[b+84+(e<<4)>>2];c[b+116+4>>2]=c[b+84+(e<<4)+4>>2];c[b+116+8>>2]=c[b+84+(e<<4)+8>>2];c[b+116+12>>2]=c[b+84+(e<<4)+12>>2];c[b+196>>2]=c[b+164+(e<<4)>>2];c[b+196+4>>2]=c[b+164+(e<<4)+4>>2];c[b+196+8>>2]=c[b+164+(e<<4)+8>>2];c[b+196+12>>2]=c[b+164+(e<<4)+12>>2];I=23}else{e=h;I=23}}if((I|0)==23){h=e+-1|0;if(!(d&2)){c[b>>2]=h;c[b+20>>2]=c[b+4+(h<<4)>>2];c[b+20+4>>2]=c[b+4+(h<<4)+4>>2];c[b+20+8>>2]=c[b+4+(h<<4)+8>>2];c[b+20+12>>2]=c[b+4+(h<<4)+12>>2];c[b+100>>2]=c[b+84+(h<<4)>>2];c[b+100+4>>2]=c[b+84+(h<<4)+4>>2];c[b+100+8>>2]=c[b+84+(h<<4)+8>>2];c[b+100+12>>2]=c[b+84+(h<<4)+12>>2];c[b+180>>2]=c[b+164+(h<<4)>>2];c[b+180+4>>2]=c[b+164+(h<<4)+4>>2];c[b+180+8>>2]=c[b+164+(h<<4)+8>>2];c[b+180+12>>2]=c[b+164+(h<<4)+12>>2];o=d;I=27}else{o=d;h=e;I=27}}if((I|0)==27?(q=h+-1|0,(o&1)==0):0){c[b>>2]=q;c[b+4>>2]=c[b+4+(q<<4)>>2];c[b+4+4>>2]=c[b+4+(q<<4)+4>>2];c[b+4+8>>2]=c[b+4+(q<<4)+8>>2];c[b+4+12>>2]=c[b+4+(q<<4)+12>>2];c[b+84>>2]=c[b+84+(q<<4)>>2];c[b+84+4>>2]=c[b+84+(q<<4)+4>>2];c[b+84+8>>2]=c[b+84+(q<<4)+8>>2];c[b+84+12>>2]=c[b+84+(q<<4)+12>>2];c[b+164>>2]=c[b+164+(q<<4)>>2];c[b+164+4>>2]=c[b+164+(q<<4)+4>>2];c[b+164+8>>2]=c[b+164+(q<<4)+8>>2];c[b+164+12>>2]=c[b+164+(q<<4)+12>>2]}if((f>=0.0?!(+g[b+336>>2]>=0.0):1)|!(i>=0.0))d=0;else d=+g[b+348>>2]>=0.0&1;a[b+312>>0]=d;b=d;b=b<<24>>24!=0;l=J;return b|0}case 4:{c[J>>2]=0;c[J+4>>2]=0;c[J+8>>2]=0;c[J+12>>2]=0;r=J+16+16|0;a[r>>0]=0;c[b+316>>2]=0;c[b+316+4>>2]=0;c[b+316+8>>2]=0;c[b+316+12>>2]=0;a[b+332>>0]=p|15;L=+g[b+20>>2];U=+g[b+4>>2];R=+g[b+24>>2];K=+g[b+8>>2];N=+g[b+28>>2];V=+g[b+12>>2];Q=+g[b+36>>2];S=+g[b+40>>2];O=+g[b+44>>2];M=+g[b+52>>2];T=+g[b+56>>2];P=+g[b+60>>2];W=((R-K)*(O-V)-(N-V)*(S-K))*(M-U)+((N-V)*(Q-U)-(L-U)*(O-V))*(T-K)+((L-U)*(S-K)-(R-K)*(Q-U))*(P-V);h=W*W<9.99999905104687e-09?-1:((0.0-U)*((R-K)*(O-V)-(N-V)*(S-K))+(0.0-K)*((N-V)*(Q-U)-(L-U)*(O-V))+((L-U)*(S-K)-(R-K)*(Q-U))*(0.0-V))*W<0.0&1;W=(N-V)*((Q-U)*(T-K)-(S-K)*(M-U))+((L-U)*((S-K)*(P-V)-(O-V)*(T-K))+(R-K)*((O-V)*(M-U)-(Q-U)*(P-V)));o=W*W<9.99999905104687e-09?-1:((0.0-V)*((Q-U)*(T-K)-(S-K)*(M-U))+((0.0-U)*((S-K)*(P-V)-(O-V)*(T-K))+(0.0-K)*((O-V)*(M-U)-(Q-U)*(P-V))))*W<0.0&1;W=(O-V)*((R-K)*(M-U)-(L-U)*(T-K))+((Q-U)*((N-V)*(T-K)-(R-K)*(P-V))+(S-K)*((L-U)*(P-V)-(N-V)*(M-U)));p=W*W<9.99999905104687e-09?-1:((0.0-V)*((R-K)*(M-U)-(L-U)*(T-K))+((0.0-U)*((N-V)*(T-K)-(R-K)*(P-V))+(0.0-K)*((L-U)*(P-V)-(N-V)*(M-U))))*W<0.0&1;K=(V-N)*((S-R)*(M-L)-(Q-L)*(T-R))+((U-L)*((O-N)*(T-R)-(S-R)*(P-N))+(K-R)*((Q-L)*(P-N)-(O-N)*(M-L)));q=K*K<9.99999905104687e-09?-1:((0.0-N)*((S-R)*(M-L)-(Q-L)*(T-R))+((0.0-L)*((O-N)*(T-R)-(S-R)*(P-N))+(0.0-R)*((Q-L)*(P-N)-(O-N)*(M-L))))*K<0.0&1;do if((o|h|p|q|0)<0){a[b+352>>0]=1;d=b+312|0;I=68}else{if(!(o|h|p|q)){if(a[b+352>>0]|0){d=b+312|0;I=68;break}a[b+312>>0]=1;c[b+276>>2]=0;c[b+276+4>>2]=0;c[b+276+8>>2]=0;c[b+276+12>>2]=0;d=1;break}if((h|0)!=0?(cf(J,b+4|0,b+20|0,b+36|0,J+16|0),f=+g[J+16>>2],i=+g[J+16+4>>2],j=+g[J+16+8>>2],k=f-+g[J>>2],m=i-+g[J+4>>2],n=j-+g[J+8>>2],k*k+m*m+n*n<3402823466385288598117041.0e14):0){X=c[J+16+12>>2]|0;g[b+316>>2]=f;g[b+320>>2]=i;g[b+324>>2]=j;c[b+328>>2]=X;X=a[r>>0]|0;a[b+332>>0]=X&1|a[b+332>>0]&-16|X&2|X&4;X=c[J+16+24>>2]|0;h=c[J+16+28>>2]|0;c[b+336>>2]=c[J+16+20>>2];c[b+340>>2]=X;c[b+344>>2]=h;g[b+348>>2]=0.0;f=k*k+m*m+n*n}else f=3402823466385288598117041.0e14;if((o|0)!=0?(cf(J,b+4|0,b+36|0,b+52|0,J+16|0),s=+g[J+16>>2],t=+g[J+16+4>>2],u=+g[J+16+8>>2],v=s-+g[J>>2],w=t-+g[J+4>>2],x=u-+g[J+8>>2],v*v+w*w+x*x>2]|0;g[b+316>>2]=s;g[b+320>>2]=t;g[b+324>>2]=u;c[b+328>>2]=o;o=a[r>>0]|0;a[b+332>>0]=o<<1&8|(o&1|a[b+332>>0]&-16|o<<1&4);o=c[J+16+24>>2]|0;X=c[J+16+28>>2]|0;c[b+336>>2]=c[J+16+20>>2];g[b+340>>2]=0.0;c[b+344>>2]=o;c[b+348>>2]=X;f=v*v+w*w+x*x}if((p|0)!=0?(cf(J,b+4|0,b+52|0,b+20|0,J+16|0),y=+g[J+16>>2],z=+g[J+16+4>>2],A=+g[J+16+8>>2],B=y-+g[J>>2],C=z-+g[J+4>>2],D=A-+g[J+8>>2],B*B+C*C+D*D>2]|0;g[b+316>>2]=y;g[b+320>>2]=z;g[b+324>>2]=A;c[b+328>>2]=p;p=a[r>>0]|0;a[b+332>>0]=p<<2&8|(p&1|a[b+332>>0]&-16|(p&255)>>>1&2);p=c[J+16+28>>2]|0;X=c[J+16+24>>2]|0;c[b+336>>2]=c[J+16+20>>2];c[b+340>>2]=p;g[b+344>>2]=0.0;c[b+348>>2]=X;f=B*B+C*C+D*D}if(q|0?(cf(J,b+20|0,b+52|0,b+36|0,J+16|0),E=+g[J+16>>2],F=+g[J+16+4>>2],G=+g[J+16+8>>2],U=E-+g[J>>2],V=F-+g[J+4>>2],W=G-+g[J+8>>2],U*U+V*V+W*W>2]|0;g[b+316>>2]=E;g[b+320>>2]=F;g[b+324>>2]=G;c[b+328>>2]=q;q=a[r>>0]|0;a[b+332>>0]=q&4|a[b+332>>0]&-16|q<<1&2|q<<2&8;q=c[J+16+20>>2]|0;r=c[J+16+28>>2]|0;X=c[J+16+24>>2]|0;g[b+336>>2]=0.0;c[b+340>>2]=q;c[b+344>>2]=r;c[b+348>>2]=X}P=+g[b+336>>2];Q=+g[b+340>>2];W=+g[b+344>>2];f=+g[b+348>>2];R=+g[b+84>>2]*P+ +g[b+100>>2]*Q+ +g[b+116>>2]*W+ +g[b+132>>2]*f;T=P*+g[b+88>>2]+Q*+g[b+104>>2]+W*+g[b+120>>2]+f*+g[b+136>>2];V=P*+g[b+92>>2]+Q*+g[b+108>>2]+W*+g[b+124>>2]+f*+g[b+140>>2];g[b+244>>2]=R;g[b+248>>2]=T;g[b+252>>2]=V;g[b+256>>2]=0.0;S=+g[b+164>>2]*P+ +g[b+180>>2]*Q+ +g[b+196>>2]*W+ +g[b+212>>2]*f;U=P*+g[b+168>>2]+Q*+g[b+184>>2]+W*+g[b+200>>2]+f*+g[b+216>>2];W=P*+g[b+172>>2]+Q*+g[b+188>>2]+W*+g[b+204>>2]+f*+g[b+220>>2];g[b+260>>2]=S;g[b+264>>2]=U;g[b+268>>2]=W;g[b+272>>2]=0.0;g[b+276>>2]=R-S;g[b+280>>2]=T-U;g[b+284>>2]=V-W;g[b+288>>2]=0.0;h=c[b>>2]|0;do if((h|0)>3){d=a[b+332>>0]|0;if(!(d&8)){I=b+164+(h+-1<<4)|0;X=b+84+(h+-1<<4)|0;r=b+4+(h+-1<<4)|0;c[b>>2]=h+-1;c[b+52>>2]=c[r>>2];c[b+52+4>>2]=c[r+4>>2];c[b+52+8>>2]=c[r+8>>2];c[b+52+12>>2]=c[r+12>>2];c[b+132>>2]=c[X>>2];c[b+132+4>>2]=c[X+4>>2];c[b+132+8>>2]=c[X+8>>2];c[b+132+12>>2]=c[X+12>>2];c[b+212>>2]=c[I>>2];c[b+212+4>>2]=c[I+4>>2];c[b+212+8>>2]=c[I+8>>2];c[b+212+12>>2]=c[I+12>>2];h=h+-1|0;I=52}else I=52}else{if((h|0)==3){d=a[b+332>>0]|0;h=3;I=52;break}if((h|0)>1){d=a[b+332>>0]|0;e=2;I=56;break}if((h|0)==1){d=a[b+332>>0]|0;e=1;I=60}}while(0);if((I|0)==52){e=h+-1|0;if(!(d&4)){c[b>>2]=e;c[b+36>>2]=c[b+4+(e<<4)>>2];c[b+36+4>>2]=c[b+4+(e<<4)+4>>2];c[b+36+8>>2]=c[b+4+(e<<4)+8>>2];c[b+36+12>>2]=c[b+4+(e<<4)+12>>2];c[b+116>>2]=c[b+84+(e<<4)>>2];c[b+116+4>>2]=c[b+84+(e<<4)+4>>2];c[b+116+8>>2]=c[b+84+(e<<4)+8>>2];c[b+116+12>>2]=c[b+84+(e<<4)+12>>2];c[b+196>>2]=c[b+164+(e<<4)>>2];c[b+196+4>>2]=c[b+164+(e<<4)+4>>2];c[b+196+8>>2]=c[b+164+(e<<4)+8>>2];c[b+196+12>>2]=c[b+164+(e<<4)+12>>2];I=56}else{e=h;I=56}}if((I|0)==56){h=e+-1|0;if(!(d&2)){c[b>>2]=h;c[b+20>>2]=c[b+4+(h<<4)>>2];c[b+20+4>>2]=c[b+4+(h<<4)+4>>2];c[b+20+8>>2]=c[b+4+(h<<4)+8>>2];c[b+20+12>>2]=c[b+4+(h<<4)+12>>2];c[b+100>>2]=c[b+84+(h<<4)>>2];c[b+100+4>>2]=c[b+84+(h<<4)+4>>2];c[b+100+8>>2]=c[b+84+(h<<4)+8>>2];c[b+100+12>>2]=c[b+84+(h<<4)+12>>2];c[b+180>>2]=c[b+164+(h<<4)>>2];c[b+180+4>>2]=c[b+164+(h<<4)+4>>2];c[b+180+8>>2]=c[b+164+(h<<4)+8>>2];c[b+180+12>>2]=c[b+164+(h<<4)+12>>2];e=h;I=60}else I=60}if((I|0)==60?(H=e+-1|0,(d&1)==0):0){c[b>>2]=H;c[b+4>>2]=c[b+4+(H<<4)>>2];c[b+4+4>>2]=c[b+4+(H<<4)+4>>2];c[b+4+8>>2]=c[b+4+(H<<4)+8>>2];c[b+4+12>>2]=c[b+4+(H<<4)+12>>2];c[b+84>>2]=c[b+84+(H<<4)>>2];c[b+84+4>>2]=c[b+84+(H<<4)+4>>2];c[b+84+8>>2]=c[b+84+(H<<4)+8>>2];c[b+84+12>>2]=c[b+84+(H<<4)+12>>2];c[b+164>>2]=c[b+164+(H<<4)>>2];c[b+164+4>>2]=c[b+164+(H<<4)+4>>2];c[b+164+8>>2]=c[b+164+(H<<4)+8>>2];c[b+164+12>>2]=c[b+164+(H<<4)+12>>2]}if((+g[b+336>>2]>=0.0?+g[b+340>>2]>=0.0:0)?+g[b+344>>2]>=0.0:0)d=f>=0.0&1;else d=0;a[b+312>>0]=d}while(0);if((I|0)==68){a[d>>0]=0;d=0}X=d;X=X<<24>>24!=0;l=J;return X|0}default:{a[b+312>>0]=0;X=0;X=X<<24>>24!=0;l=J;return X|0}}return 0}function xc(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0,H=0.0,J=0.0,K=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0,ma=0.0,na=0.0,oa=0.0,pa=0.0,qa=0.0,ra=0.0,sa=0.0;la=l;l=l+80|0;g[b+504>>2]=0.0;g[b+500>>2]=0.0;a[b+525>>0]=0;a[b+526>>0]=0;if(a[b+552>>0]|0?(a[b+527>>0]|0)==0:0){sa=+g[b+556>>2];qa=+g[b+560>>2];ka=+g[b+564>>2];pa=+g[b+568>>2];$=sa*(2.0/(sa*sa+qa*qa+ka*ka+pa*pa));ra=qa*(2.0/(sa*sa+qa*qa+ka*ka+pa*pa));oa=ka*(2.0/(sa*sa+qa*qa+ka*ka+pa*pa));aa=+g[b+300>>2];S=+g[d>>2];ba=+g[b+316>>2];T=+g[d+4>>2];ca=+g[b+332>>2];U=+g[d+8>>2];ea=+g[b+304>>2];ga=+g[b+320>>2];ia=+g[b+336>>2];Y=+g[b+308>>2];Z=+g[b+324>>2];_=+g[b+340>>2];V=+g[d+16>>2];W=+g[d+20>>2];X=+g[d+24>>2];fa=+g[d+32>>2];ha=+g[d+36>>2];ja=+g[d+40>>2];q=+g[b+348>>2];p=+g[b+352>>2];o=+g[b+356>>2];u=+g[b+364>>2];na=+g[e>>2];v=+g[b+380>>2];ma=+g[e+4>>2];w=+g[b+396>>2];k=+g[e+8>>2];x=+g[b+368>>2];y=+g[b+384>>2];z=+g[b+400>>2];r=+g[b+372>>2];s=+g[b+388>>2];t=+g[b+404>>2];m=+g[e+16>>2];n=+g[e+20>>2];j=+g[e+24>>2];A=+g[e+32>>2];E=+g[e+36>>2];J=+g[e+40>>2];B=+g[b+412>>2];H=+g[b+416>>2];i=+g[b+420>>2];M=(1.0-(qa*ra+ka*oa))*(u*na+v*ma+w*k)+(sa*ra+pa*oa)*(na*x+ma*y+k*z)+(sa*oa-pa*ra)*(na*r+ma*s+k*t);N=(sa*ra-pa*oa)*(u*na+v*ma+w*k)+(1.0-(sa*$+ka*oa))*(na*x+ma*y+k*z)+(qa*oa+pa*$)*(na*r+ma*s+k*t);K=(sa*oa+pa*ra)*(u*na+v*ma+w*k)+(qa*oa-pa*$)*(na*x+ma*y+k*z)+(1.0-(sa*$+qa*ra))*(na*r+ma*s+k*t);P=(sa*oa-pa*ra)*(r*m+s*n+t*j)+((1.0-(qa*ra+ka*oa))*(u*m+v*n+w*j)+(sa*ra+pa*oa)*(x*m+y*n+z*j));R=(qa*oa+pa*$)*(r*m+s*n+t*j)+((sa*ra-pa*oa)*(u*m+v*n+w*j)+(1.0-(sa*$+ka*oa))*(x*m+y*n+z*j));O=(1.0-(sa*$+qa*ra))*(r*m+s*n+t*j)+((sa*oa+pa*ra)*(u*m+v*n+w*j)+(qa*oa-pa*$)*(x*m+y*n+z*j));da=(sa*oa-pa*ra)*(r*A+s*E+t*J)+((1.0-(qa*ra+ka*oa))*(u*A+v*E+w*J)+(sa*ra+pa*oa)*(x*A+y*E+z*J));ka=(qa*oa+pa*$)*(r*A+s*E+t*J)+((sa*ra-pa*oa)*(u*A+v*E+w*J)+(1.0-(sa*$+ka*oa))*(x*A+y*E+z*J));$=(1.0-(sa*$+qa*ra))*(r*A+s*E+t*J)+((sa*oa+pa*ra)*(u*A+v*E+w*J)+(qa*oa-pa*$)*(x*A+y*E+z*J));pa=-(+g[d+48>>2]+(S*q+T*p+U*o));oa=-(V*q+W*p+X*o+ +g[d+52>>2]);o=-(fa*q+ha*p+ja*o+ +g[d+56>>2]);p=(aa*S+ba*T+ca*U)*pa+(aa*V+ba*W+ca*X)*oa+(aa*fa+ba*ha+ca*ja)*o;q=(S*ea+T*ga+U*ia)*pa+(ea*V+ga*W+ia*X)*oa+(ea*fa+ga*ha+ia*ja)*o;o=(S*Y+T*Z+U*_)*pa+(Y*V+Z*W+_*X)*oa+(Y*fa+Z*ha+_*ja)*o;k=o*K+(p*M+q*N)+((u*na+v*ma+w*k)*0.0+(na*x+ma*y+k*z)*0.0+(na*r+ma*s+k*t)*0.0+(+g[e+48>>2]+(na*B+ma*H+k*i)));j=o*O+(p*P+q*R)+((r*m+s*n+t*j)*0.0+((u*m+v*n+w*j)*0.0+(x*m+y*n+z*j)*0.0)+(m*B+n*H+j*i+ +g[e+52>>2]));i=o*$+(p*da+q*ka)+((r*A+s*E+t*J)*0.0+((u*A+v*E+w*J)*0.0+(x*A+y*E+z*J)*0.0)+(A*B+E*H+J*i+ +g[e+56>>2]));g[la+16>>2]=(S*Y+T*Z+U*_)*K+((aa*S+ba*T+ca*U)*M+(S*ea+T*ga+U*ia)*N);g[la+16+4>>2]=(Y*V+Z*W+_*X)*K+((aa*V+ba*W+ca*X)*M+(ea*V+ga*W+ia*X)*N);g[la+16+8>>2]=(Y*fa+Z*ha+_*ja)*K+((aa*fa+ba*ha+ca*ja)*M+(ea*fa+ga*ha+ia*ja)*N);g[la+16+12>>2]=0.0;g[la+16+16>>2]=(S*Y+T*Z+U*_)*O+((aa*S+ba*T+ca*U)*P+(S*ea+T*ga+U*ia)*R);g[la+16+20>>2]=(Y*V+Z*W+_*X)*O+((aa*V+ba*W+ca*X)*P+(ea*V+ga*W+ia*X)*R);g[la+16+24>>2]=(Y*fa+Z*ha+_*ja)*O+((aa*fa+ba*ha+ca*ja)*P+(ea*fa+ga*ha+ia*ja)*R);g[la+16+28>>2]=0.0;g[la+16+32>>2]=(S*Y+T*Z+U*_)*$+((aa*S+ba*T+ca*U)*da+(S*ea+T*ga+U*ia)*ka);g[la+16+36>>2]=(Y*V+Z*W+_*X)*$+((aa*V+ba*W+ca*X)*da+(ea*V+ga*W+ia*X)*ka);g[la+16+40>>2]=(Y*fa+Z*ha+_*ja)*$+((aa*fa+ba*ha+ca*ja)*da+(ea*fa+ga*ha+ia*ja)*ka);g[la+16+44>>2]=0.0;g[la+16+48>>2]=k;g[la+16+52>>2]=j;g[la+16+56>>2]=i;g[la+16+60>>2]=0.0;yh(la+16|0,la);i=+g[la>>2];j=+g[la+4>>2];k=+g[la+8>>2];if(!(+C(+(i*i+j*j+k*k))<1.1920928955078125e-07)?(g[b+472>>2]=0.0,sa=1.0/+D(+(i*i+j*j+k*k)),g[b+460>>2]=i*sa,g[b+464>>2]=j*sa,g[b+468>>2]=k*sa,sa=+g[la+12>>2],sa=sa<-1.0?-1.0:sa,sa=+I(+(sa>1.0?1.0:sa))*2.0,g[b+504>>2]=sa,!(+C(+sa)<1.1920928955078125e-07)):0)a[b+526>>0]=1;l=la;return}yh(d,la+16|0);yh(b+300|0,la);U=+g[la+16+12>>2];V=+g[la>>2];W=+g[la+16>>2];X=+g[la+12>>2];Y=+g[la+16+4>>2];Z=+g[la+8>>2];_=+g[la+16+8>>2];$=+g[la+4>>2];yh(e,la+16|0);yh(b+364|0,la);aa=+g[la+16+12>>2];ba=+g[la>>2];ca=+g[la+16>>2];da=+g[la+12>>2];ea=+g[la+16+4>>2];fa=+g[la+8>>2];ga=+g[la+16+8>>2];ha=+g[la+4>>2];ia=-(aa*ba+ca*da+ea*fa-ga*ha);ja=-(ba*ga+(da*ea+aa*ha)-ca*fa);ka=-(aa*fa+da*ga+ca*ha-ba*ea);s=(U*X-V*W-Y*$-Z*_)*ia+(U*V+W*X+Y*Z-_*$)*(aa*da-ba*ca-ea*ha-fa*ga)+(U*Z+X*_+W*$-V*Y)*ja-(V*_+(X*Y+U*$)-W*Z)*ka;t=(U*V+W*X+Y*Z-_*$)*ka+((V*_+(X*Y+U*$)-W*Z)*(aa*da-ba*ca-ea*ha-fa*ga)+(U*X-V*W-Y*$-Z*_)*ja)-(U*Z+X*_+W*$-V*Y)*ia;u=(V*_+(X*Y+U*$)-W*Z)*ia+((U*Z+X*_+W*$-V*Y)*(aa*da-ba*ca-ea*ha-fa*ga)+(U*X-V*W-Y*$-Z*_)*ka)-(U*V+W*X+Y*Z-_*$)*ja;v=(U*X-V*W-Y*$-Z*_)*(aa*da-ba*ca-ea*ha-fa*ga)-(U*V+W*X+Y*Z-_*$)*ia-(V*_+(X*Y+U*$)-W*Z)*ja-(U*Z+X*_+W*$-V*Y)*ka;k=+g[5957];i=+g[5959];m=+g[5958];n=(k*u+m*v-i*s)*-u+(v*(k*v+i*t-m*u)+(-(k*s)-m*t-i*u)*-s)-(i*v+m*s-k*t)*-t;o=(i*v+m*s-k*t)*-s+(v*(k*u+m*v-i*s)+(-(k*s)-m*t-i*u)*-t)-(k*v+i*t-m*u)*-u;j=(k*v+i*t-m*u)*-t+(v*(i*v+m*s-k*t)+(-(k*s)-m*t-i*u)*-u)-(k*u+m*v-i*s)*-s;p=1.0/+D(+(j*j+(n*n+o*o)));do if(i*p*j+(m*p*o+k*p*n)<-.9999998807907104)if(+C(+i)>.7071067690849304){j=1.0/+D(+(i*i+m*m));r=-(i*j);q=0.0;i=m*j;j=0.0;break}else{q=1.0/+D(+(k*k+m*m));r=k*q;q=-(m*q);i=0.0;j=0.0;break}else{sa=+D(+((i*p*j+(m*p*o+k*p*n)+1.0)*2.0));r=(i*p*n-k*p*j)*(1.0/sa);q=(m*p*j-i*p*o)*(1.0/sa);i=(k*p*o-m*p*n)*(1.0/sa);j=sa*.5}while(0);m=1.0/+D(+(q*q+r*r+i*i+j*j));o=q*m;r=r*m;q=i*m;m=j*m;T=1.0/+D(+((v*m-s*-o-t*-r-u*-q)*(v*m-s*-o-t*-r-u*-q)+((t*-o+(u*m+v*-q)-s*-r)*(t*-o+(u*m+v*-q)-s*-r)+((u*-r+(s*m+v*-o)-t*-q)*(u*-r+(s*m+v*-o)-t*-q)+(s*-q+(v*-r+t*m)-u*-o)*(s*-q+(v*-r+t*m)-u*-o)))));k=T*(u*-r+(s*m+v*-o)-t*-q);n=T*(s*-q+(v*-r+t*m)-u*-o);j=T*(t*-o+(u*m+v*-q)-s*-r);T=T*(v*m-s*-o-t*-r-u*-q);t=+g[b+444>>2];i=+g[b+456>>2];if(t>=i?(w=+g[b+448>>2],w>=i):0){s=m<-1.0?-1.0:m;s=+I(+(s>1.0?1.0:s))*2.0;if(s>1.1920928955078125e-07){p=1.0/+D(+(q*q+(o*o+r*r)));if(+C(+(r*p))>1.1920928955078125e-07){o=o*p;m=q*p;i=r*p;q=+D(+((q*p*q*p/(r*p*r*p)+1.0)/(1.0/(w*w)+q*p*q*p/(r*p*r*p)/(t*t))))}else{o=o*p;m=q*p;i=r*p;q=t}}else{o=0.0;m=0.0;i=0.0;q=0.0}p=+g[b+428>>2];r=q*p;if(s>r){a[b+526>>0]=1;if(s>2]=p;g[b+504>>2]=s-r;if(+C(+i)>1.1920928955078125e-07){sa=+C(+(i*-m/i*(w/t)));m=m<-0.0?sa:-sa;sa=1.0/+D(+(o*o+i*i+m*m));o=o*sa;m=-(m*sa);i=i*sa}ra=-o;qa=-i;oa=-m;na=(aa*da-ba*ca-ea*ha-fa*ga)*ra+(ba*ga+(da*ea+aa*ha)-ca*fa)*oa-(aa*fa+da*ga+ca*ha-ba*ea)*qa;sa=(aa*fa+da*ga+ca*ha-ba*ea)*ra+(aa*da-ba*ca-ea*ha-fa*ga)*qa-(aa*ba+ca*da+ea*fa-ga*ha)*oa;pa=(aa*ba+ca*da+ea*fa-ga*ha)*qa+(aa*da-ba*ca-ea*ha-fa*ga)*oa-(ba*ga+(da*ea+aa*ha)-ca*fa)*ra;oa=-((aa*ba+ca*da+ea*fa-ga*ha)*ra)-(ba*ga+(da*ea+aa*ha)-ca*fa)*qa-(aa*fa+da*ga+ca*ha-ba*ea)*oa;qa=sa*ka+(oa*ia+(aa*da-ba*ca-ea*ha-fa*ga)*na)-pa*ja;ra=pa*ia+((aa*da-ba*ca-ea*ha-fa*ga)*sa+oa*ja)-na*ka;sa=na*ja+(oa*ka+(aa*da-ba*ca-ea*ha-fa*ga)*pa)-sa*ia;g[b+460>>2]=qa;g[b+464>>2]=ra;g[b+468>>2]=sa;g[b+472>>2]=0.0;c[b+536>>2]=0;c[b+536+4>>2]=0;c[b+536+8>>2]=0;c[b+536+12>>2]=0;g[b+492>>2]=1.0/(qa*(+g[f>>2]*qa+ +g[f+16>>2]*ra+ +g[f+32>>2]*sa)+ra*(qa*+g[f+4>>2]+ra*+g[f+20>>2]+sa*+g[f+36>>2])+sa*(qa*+g[f+8>>2]+ra*+g[f+24>>2]+sa*+g[f+40>>2])+(qa*(qa*+g[h>>2]+ra*+g[h+16>>2]+sa*+g[h+32>>2])+ra*(qa*+g[h+4>>2]+ra*+g[h+20>>2]+sa*+g[h+36>>2])+sa*(qa*+g[h+8>>2]+ra*+g[h+24>>2]+sa*+g[h+40>>2])))}}else Q=23;a:do if((Q|0)==23){J=+g[b+300>>2];K=+g[b+316>>2];M=+g[b+332>>2];r=+g[d>>2];s=+g[d+4>>2];t=+g[d+8>>2];u=+g[d+16>>2];v=+g[d+20>>2];w=+g[d+24>>2];N=+g[d+32>>2];O=+g[d+36>>2];x=+g[d+40>>2];y=+g[b+304>>2];z=+g[b+320>>2];A=+g[b+336>>2];B=+g[b+308>>2];E=+g[b+324>>2];H=+g[b+340>>2];o=+g[b+364>>2];q=+g[b+380>>2];P=+g[b+396>>2];R=o*+g[e>>2]+q*+g[e+4>>2]+P*+g[e+8>>2];S=o*+g[e+16>>2]+q*+g[e+20>>2]+P*+g[e+24>>2];P=o*+g[e+32>>2]+q*+g[e+36>>2]+P*+g[e+40>>2];q=(J*r+K*s+M*t)*R+(J*u+K*v+M*w)*S+(J*N+K*O+M*x)*P;o=(r*y+s*z+t*A)*R+(u*y+v*z+w*A)*S+(N*y+O*z+x*A)*P;m=(r*B+s*E+t*H)*R+(u*B+v*E+w*H)*S+(N*B+O*E+x*H)*P;p=+g[b+444>>2];i=+g[b+456>>2];do if(p>2];if(p>0]=1;g[b+460>>2]=-((J*N+K*O+M*x)*S-(J*u+K*v+M*w)*P);g[b+464>>2]=-((J*r+K*s+M*t)*P-(J*N+K*O+M*x)*R);g[b+468>>2]=-((J*u+K*v+M*w)*R-(J*r+K*s+M*t)*S);g[b+472>>2]=0.0;break a}if(+C(+q)<1.1920928955078125e-07?+C(+m)<1.1920928955078125e-07:0){i=q;break}a[b+526>>0]=1;if(p>=i){i=+L(+m,+q);if(i>p){m=+G(+p);o=0.0;i=+F(+p);break}if(i<-p){m=-+G(+p);o=0.0;i=+F(+p)}else{o=0.0;i=q}}else i=q}else{if(+C(+q)<1.1920928955078125e-07?+C(+o)<1.1920928955078125e-07:0){i=q;break}a[b+526>>0]=1;if(p>=i){i=+L(+o,+q);if(i>p){m=0.0;o=+G(+p);i=+F(+p);break}if(i<-p){m=0.0;o=-+G(+p);i=+F(+p)}else{m=0.0;i=q}}else i=q}while(0);q=(r*B+s*E+t*H)*m+((r*y+s*z+t*A)*o+(J*r+K*s+M*t)*i);p=(u*B+v*E+w*H)*m+((u*y+v*z+w*A)*o+(J*u+K*v+M*w)*i);i=(N*B+O*E+x*H)*m+((N*y+O*z+x*A)*o+(J*N+K*O+M*x)*i);m=1.0/+D(+(i*i+(q*q+p*p)));g[b+460>>2]=-(S*m*i-P*m*p);g[b+464>>2]=-(P*m*q-R*m*i);g[b+468>>2]=-(R*m*p-S*m*q);g[b+472>>2]=0.0;o=+D(+((S*m*i-P*m*p)*(S*m*i-P*m*p)+(P*m*q-R*m*i)*(P*m*q-R*m*i)+(R*m*p-S*m*q)*(R*m*p-S*m*q)));g[b+504>>2]=o;if(!(+C(+o)<1.1920928955078125e-07)){g[b+460>>2]=1.0/o*-(S*m*i-P*m*p);g[b+464>>2]=1.0/o*-(P*m*q-R*m*i);g[b+468>>2]=1.0/o*-(R*m*p-S*m*q)}}while(0);p=+g[b+452>>2];if(!(p>=0.0)){g[b+512>>2]=0.0;l=la;return}i=T<-1.0?-1.0:T;i=+I(+(i>1.0?1.0:i))*2.0;if(i>3.1415927410125732){i=-T<-1.0?-1.0:-T;i=+I(+(i>1.0?1.0:i))*2.0;k=-k;n=-n;j=-j}g[b+512>>2]=i;if(i>1.1920928955078125e-07){sa=1.0/+D(+(k*k+n*n+j*j));k=k*sa;j=j*sa;n=n*sa}m=+g[b+428>>2];if(i>p*m){a[b+525>>0]=1;o=i-p*m;if(i>2]=i;g[b+508>>2]=o;ra=-k;qa=-n;oa=-j;na=(aa*da-ba*ca-ea*ha-fa*ga)*ra+(ba*ga+(da*ea+aa*ha)-ca*fa)*oa-(aa*fa+da*ga+ca*ha-ba*ea)*qa;sa=(aa*fa+da*ga+ca*ha-ba*ea)*ra+(aa*da-ba*ca-ea*ha-fa*ga)*qa-(aa*ba+ca*da+ea*fa-ga*ha)*oa;pa=(aa*ba+ca*da+ea*fa-ga*ha)*qa+(aa*da-ba*ca-ea*ha-fa*ga)*oa-(ba*ga+(da*ea+aa*ha)-ca*fa)*ra;oa=-((aa*ba+ca*da+ea*fa-ga*ha)*ra)-(ba*ga+(da*ea+aa*ha)-ca*fa)*qa-(aa*fa+da*ga+ca*ha-ba*ea)*oa;qa=sa*ka+(oa*ia+(aa*da-ba*ca-ea*ha-fa*ga)*na)-pa*ja;ra=pa*ia+((aa*da-ba*ca-ea*ha-fa*ga)*sa+oa*ja)-na*ka;sa=na*ja+(oa*ka+(aa*da-ba*ca-ea*ha-fa*ga)*pa)-sa*ia;g[b+476>>2]=qa;g[b+480>>2]=ra;g[b+484>>2]=sa;g[b+488>>2]=0.0;g[b+496>>2]=1.0/(qa*(+g[f>>2]*qa+ +g[f+16>>2]*ra+ +g[f+32>>2]*sa)+ra*(qa*+g[f+4>>2]+ra*+g[f+20>>2]+sa*+g[f+36>>2])+sa*(qa*+g[f+8>>2]+ra*+g[f+24>>2]+sa*+g[f+40>>2])+(qa*(qa*+g[h>>2]+ra*+g[h+16>>2]+sa*+g[h+32>>2])+ra*(qa*+g[h+4>>2]+ra*+g[h+20>>2]+sa*+g[h+36>>2])+sa*(qa*+g[h+8>>2]+ra*+g[h+24>>2]+sa*+g[h+40>>2])))}if(!(a[b+526>>0]|0)){l=la;return}na=-k;sa=-n;oa=-j;ma=(U*X-V*W-Y*$-Z*_)*na+(V*_+(X*Y+U*$)-W*Z)*oa-(U*Z+X*_+W*$-V*Y)*sa;ra=(U*Z+X*_+W*$-V*Y)*na+(U*X-V*W-Y*$-Z*_)*sa-(U*V+W*X+Y*Z-_*$)*oa;qa=(U*V+W*X+Y*Z-_*$)*sa+(U*X-V*W-Y*$-Z*_)*oa-(V*_+(X*Y+U*$)-W*Z)*na;oa=-((U*V+W*X+Y*Z-_*$)*na)-(V*_+(X*Y+U*$)-W*Z)*sa-(U*Z+X*_+W*$-V*Y)*oa;sa=-(U*V+W*X+Y*Z-_*$);na=-(V*_+(X*Y+U*$)-W*Z);pa=-(U*Z+X*_+W*$-V*Y);g[b+536>>2]=ra*pa+(oa*sa+(U*X-V*W-Y*$-Z*_)*ma)-qa*na;g[b+540>>2]=qa*sa+((U*X-V*W-Y*$-Z*_)*ra+oa*na)-ma*pa;g[b+544>>2]=ma*na+(oa*pa+(U*X-V*W-Y*$-Z*_)*qa)-ra*sa;g[b+548>>2]=0.0;l=la;return}function yc(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0.0,oa=0.0,pa=0.0,qa=0.0,ra=0.0;ga=l;l=l+4352|0;da=c[d+4>>2]|0;ea=c[e+4>>2]|0;s=c[da+68>>2]|0;t=c[ea+68>>2]|0;if(!((s|0)!=0&(t|0)!=0)){Ic(b,d,e,f,h);l=ga;return}if(!((c[da+72>>2]|0)==(c[b+108>>2]|0)?(c[ea+72>>2]|0)==(c[b+112>>2]|0):0)){i=c[b+84>>2]|0;k=c[i+8>>2]|0;if((k|0)>0){j=0;do{m=c[(c[i+16>>2]|0)+(j*12|0)+8>>2]|0;if(m|0){Ib[c[c[m>>2]>>2]&511](m);u=c[b+4>>2]|0;Ob[c[(c[u>>2]|0)+60>>2]&127](u,m)}j=j+1|0}while((j|0)!=(k|0));i=c[b+84>>2]|0}Rh(i);c[b+108>>2]=c[da+72>>2];c[b+112>>2]=c[ea+72>>2]}a[ga+3328+16>>0]=1;r=ga+3328+12|0;c[r>>2]=0;q=ga+3328+4|0;c[q>>2]=0;c[ga+3328+8>>2]=0;c[ga+112>>2]=1025;i=ga+112+120|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+312|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+504|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+696|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));c[ga+112+772>>2]=0;c[ga+112+776>>2]=0;c[ga+112+780>>2]=0;c[ga+112+800>>2]=0;c[ga+112+804>>2]=1025;i=ga+112+924|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+1116|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+1308|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+1500|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));c[ga+112+1576>>2]=0;c[ga+112+1580>>2]=0;c[ga+112+1584>>2]=0;c[ga+112+1604>>2]=0;c[ga+112+1608>>2]=1025;i=ga+112+1728|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+1920|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+2112|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+2304|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));c[ga+112+2380>>2]=0;c[ga+112+2384>>2]=0;c[ga+112+2388>>2]=0;c[ga+112+2408>>2]=0;c[ga+112+2412>>2]=1025;i=ga+112+2532|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+2724|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+2916|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+3108|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));c[ga+112+3184>>2]=0;c[ga+112+3188>>2]=0;c[ga+112+3192>>2]=0;c[ga+112+3212>>2]=0;a[q+12>>0]=0;c[r>>2]=ga+112;c[q>>2]=0;c[ga+3328+8>>2]=4;p=c[b+84>>2]|0;i=c[p+8>>2]|0;if((i|0)>0){o=0;do{j=c[(c[p+16>>2]|0)+(o*12|0)+8>>2]|0;if(j){Ob[c[(c[j>>2]|0)+16>>2]&127](j,ga+3328|0);i=c[q>>2]|0;if((i|0)>0){n=0;do{m=c[(c[r>>2]|0)+(n<<2)>>2]|0;if(c[m+780>>2]|0){c[h+4>>2]=m;j=c[m+772>>2]|0;k=c[(c[h+8>>2]|0)+8>>2]|0;i=c[(c[h+12>>2]|0)+8>>2]|0;if((j|0)==(k|0))af(m,j+4|0,i+4|0);else af(m,i+4|0,k+4|0);c[h+4>>2]=0;i=c[q>>2]|0}n=n+1|0}while((n|0)<(i|0))}if((i|0)<0){if((c[ga+3328+8>>2]|0)<0){j=c[r>>2]|0;if(j|0){if(a[ga+3328+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[r>>2]=0}a[ga+3328+16>>0]=1;c[r>>2]=0;c[ga+3328+8>>2]=0}do{c[(c[r>>2]|0)+(i<<2)>>2]=0;i=i+1|0}while((i|0)!=0)}c[q>>2]=0;i=c[p+8>>2]|0}o=o+1|0}while((o|0)<(i|0));i=c[r>>2]|0;if(i|0)if((a[ga+3328+16>>0]|0)==0|(i|0)==0)ca=35;else{c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);ca=35}}else ca=35;if((ca|0)==35)c[r>>2]=0;u=c[b+4>>2]|0;i=c[b+84>>2]|0;j=c[b+72>>2]|0;c[ga+112>>2]=6604;c[ga+112+4>>2]=0;c[ga+112+8>>2]=d;c[ga+112+12>>2]=e;c[ga+112+16>>2]=u;c[ga+112+20>>2]=f;c[ga+112+24>>2]=h;c[ga+112+28>>2]=i;c[ga+112+32>>2]=j;j=c[d+12>>2]|0;G=+g[j>>2];H=+g[j+16>>2];I=+g[j+32>>2];J=+g[j+4>>2];K=+g[j+20>>2];L=+g[j+36>>2];M=+g[j+8>>2];N=+g[j+24>>2];O=+g[j+40>>2];P=-+g[j+48>>2];Q=-+g[j+52>>2];R=-+g[j+56>>2];j=c[e+12>>2]|0;S=+g[j>>2];T=+g[j+16>>2];U=+g[j+32>>2];V=+g[j+4>>2];W=+g[j+20>>2];X=+g[j+36>>2];Y=+g[j+8>>2];Z=+g[j+24>>2];_=+g[j+40>>2];$=+g[j+48>>2];aa=+g[j+52>>2];ba=+g[j+56>>2];j=c[s>>2]|0;i=c[t>>2]|0;F=+g[h+32>>2];if((j|0)!=0&(i|0)!=0){c[ga+3328>>2]=j;c[ga+3328+4>>2]=i;v=+C(+(G*S+H*T+I*U));w=+C(+(G*V+H*W+I*X));x=+C(+(G*Y+H*Z+I*_));y=+C(+(J*S+K*T+L*U));z=+C(+(J*V+K*W+L*X));A=+C(+(J*Y+K*Z+L*_));B=+C(+(M*S+N*T+O*U));D=+C(+(M*V+N*W+O*X));E=+C(+(M*Y+N*Z+O*_));o=1;m=124;n=128;r=ga+3328|0;k=128;t=0;while(1){u=o+-1|0;f=c[r+(u<<3)>>2]|0;s=c[r+(u<<3)+4>>2]|0;ra=+g[s+16>>2];qa=+g[s>>2];pa=+g[s+20>>2];oa=+g[s+4>>2];na=+g[s+24>>2];ha=+g[s+8>>2];ma=G*P+H*Q+I*R+(G*$+H*aa+I*ba)+((G*S+H*T+I*U)*(ra+qa)*.5+(G*V+H*W+I*X)*(pa+oa)*.5+(G*Y+H*Z+I*_)*(na+ha)*.5);ka=J*P+K*Q+L*R+(J*$+K*aa+L*ba)+((J*S+K*T+L*U)*(ra+qa)*.5+(J*V+K*W+L*X)*(pa+oa)*.5+(J*Y+K*Z+L*_)*(na+ha)*.5);ia=M*P+N*Q+O*R+(M*$+N*aa+O*ba)+((M*S+N*T+O*U)*(ra+qa)*.5+(M*V+N*W+O*X)*(pa+oa)*.5+(M*Y+N*Z+O*_)*(na+ha)*.5);la=((ra-qa)*.5+0.0)*v+((pa-oa)*.5+0.0)*w+((na-ha)*.5+0.0)*x;ja=((ra-qa)*.5+0.0)*y+((pa-oa)*.5+0.0)*z+((na-ha)*.5+0.0)*A;ha=((ra-qa)*.5+0.0)*B+((pa-oa)*.5+0.0)*D+((na-ha)*.5+0.0)*E;do if(((((+g[f>>2]<=F+(la+ma)?+g[f+16>>2]>=ma-la-F:0)?+g[f+4>>2]<=F+(ka+ja):0)?+g[f+20>>2]>=ka-ja-F:0)?+g[f+8>>2]<=F+(ia+ha):0)?+g[f+24>>2]>=ia-ha-F:0){if((u|0)>(m|0)){p=k<<1;a:do if((k|0)<(p|0)&(n|0)<(p|0)){do if(k){c[6995]=(c[6995]|0)+1;i=sc((k<<4|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}if((k|0)>0)j=0;else{ca=51;break}do{m=r+(j<<3)|0;n=c[m+4>>2]|0;q=i+(j<<3)|0;c[q>>2]=c[m>>2];c[q+4>>2]=n;j=j+1|0}while((j|0)!=(k|0));if(!(t<<24>>24)){k=p;j=1;break a}}else{i=0;ca=51}while(0);if((ca|0)==51){ca=0;if((r|0)==0|t<<24>>24==0){k=p;j=1;break}}c[6996]=(c[6996]|0)+1;Cd(c[r+-4>>2]|0);k=p;j=1}else{k=n;i=r;j=t}while(0);q=p+-4|0;n=k}else{q=m;i=r;p=k;j=t}k=(c[s+40>>2]|0)!=0;if(!(c[f+40>>2]|0))if(k){m=c[s+36>>2]|0;c[i+(u<<3)>>2]=f;c[i+(u<<3)+4>>2]=m;m=c[s+40>>2]|0;c[i+(o<<3)>>2]=f;c[i+(o<<3)+4>>2]=m;o=o+1|0;m=q;k=p;break}else{Sb[c[(c[ga+112>>2]|0)+8>>2]&127](ga+112|0,f,s);o=u;m=q;k=p;break}else{m=c[f+36>>2]|0;if(k){k=c[s+36>>2]|0;c[i+(u<<3)>>2]=m;c[i+(u<<3)+4>>2]=k;u=c[s+36>>2]|0;k=o+1|0;c[i+(o<<3)>>2]=c[f+40>>2];c[i+(o<<3)+4>>2]=u;u=c[s+40>>2]|0;m=o+2|0;c[i+(k<<3)>>2]=c[f+36>>2];c[i+(k<<3)+4>>2]=u;k=c[s+40>>2]|0;c[i+(m<<3)>>2]=c[f+40>>2];c[i+(m<<3)+4>>2]=k;o=o+3|0;m=q;k=p;break}else{c[i+(u<<3)>>2]=m;c[i+(u<<3)+4>>2]=s;c[i+(o<<3)>>2]=c[f+40>>2];c[i+(o<<3)+4>>2]=s;o=o+1|0;m=q;k=p;break}}}else{o=u;i=r;j=t}while(0);if(!o)break;else{r=i;t=j}}if(!((i|0)==0|j<<24>>24==0)){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}}p=c[b+84>>2]|0;if((c[p+8>>2]|0)>0){o=0;do{i=c[p+16>>2]|0;j=c[i+(o*12|0)+8>>2]|0;do if(j|0){ca=c[i+(o*12|0)>>2]|0;u=c[da+28>>2]|0;t=c[u+(ca*80|0)+64>>2]|0;s=c[d+12>>2]|0;S=+g[s>>2];R=+g[s+4>>2];qa=+g[s+8>>2];la=+g[s+16>>2];ja=+g[s+20>>2];ha=+g[s+24>>2];ka=+g[s+32>>2];Y=+g[s+36>>2];W=+g[s+40>>2];ba=+g[u+(ca*80|0)>>2];aa=+g[u+(ca*80|0)+16>>2];$=+g[u+(ca*80|0)+32>>2];_=+g[u+(ca*80|0)+4>>2];Z=+g[u+(ca*80|0)+20>>2];ma=+g[u+(ca*80|0)+36>>2];ia=+g[u+(ca*80|0)+8>>2];X=+g[u+(ca*80|0)+24>>2];V=+g[u+(ca*80|0)+40>>2];pa=+g[u+(ca*80|0)+48>>2];ra=+g[u+(ca*80|0)+52>>2];oa=+g[u+(ca*80|0)+56>>2];U=+g[s+48>>2]+(S*pa+R*ra+qa*oa);T=+g[s+52>>2]+(la*pa+ja*ra+ha*oa);oa=+g[s+56>>2]+(ka*pa+Y*ra+W*oa);g[ga>>2]=S*ba+R*aa+qa*$;g[ga+4>>2]=S*_+R*Z+qa*ma;g[ga+8>>2]=S*ia+R*X+qa*V;g[ga+12>>2]=0.0;g[ga+16>>2]=la*ba+ja*aa+ha*$;g[ga+20>>2]=la*_+ja*Z+ha*ma;g[ga+24>>2]=la*ia+ja*X+ha*V;g[ga+28>>2]=0.0;g[ga+32>>2]=ka*ba+Y*aa+W*$;g[ga+36>>2]=ka*_+Y*Z+W*ma;g[ga+40>>2]=ka*ia+Y*X+W*V;g[ga+44>>2]=0.0;g[ga+48>>2]=U;g[ga+52>>2]=T;g[ga+56>>2]=oa;g[ga+60>>2]=0.0;Vb[c[(c[t>>2]|0)+8>>2]&127](t,ga,ga+3328|0,ga+96|0);oa=+g[h+32>>2];g[ga+3328>>2]=+g[ga+3328>>2]-oa;g[ga+3328+4>>2]=+g[ga+3328+4>>2]-oa;g[ga+3328+8>>2]=+g[ga+3328+8>>2]-oa;g[ga+96>>2]=oa+ +g[ga+96>>2];g[ga+96+4>>2]=oa+ +g[ga+96+4>>2];g[ga+96+8>>2]=oa+ +g[ga+96+8>>2];t=c[(c[p+16>>2]|0)+(o*12|0)+4>>2]|0;s=c[ea+28>>2]|0;ca=c[s+(t*80|0)+64>>2]|0;u=c[e+12>>2]|0;T=+g[u>>2];U=+g[u+4>>2];V=+g[u+8>>2];W=+g[u+16>>2];X=+g[u+20>>2];Y=+g[u+24>>2];ia=+g[u+32>>2];ka=+g[u+36>>2];ma=+g[u+40>>2];Z=+g[s+(t*80|0)>>2];_=+g[s+(t*80|0)+16>>2];$=+g[s+(t*80|0)+32>>2];aa=+g[s+(t*80|0)+4>>2];ba=+g[s+(t*80|0)+20>>2];ha=+g[s+(t*80|0)+36>>2];ja=+g[s+(t*80|0)+8>>2];la=+g[s+(t*80|0)+24>>2];qa=+g[s+(t*80|0)+40>>2];R=+g[s+(t*80|0)+48>>2];S=+g[s+(t*80|0)+52>>2];ra=+g[s+(t*80|0)+56>>2];pa=+g[u+48>>2]+(T*R+U*S+V*ra);na=+g[u+52>>2]+(W*R+X*S+Y*ra);ra=+g[u+56>>2]+(ia*R+ka*S+ma*ra);g[ga>>2]=T*Z+U*_+V*$;g[ga+4>>2]=T*aa+U*ba+V*ha;g[ga+8>>2]=T*ja+U*la+V*qa;g[ga+12>>2]=0.0;g[ga+16>>2]=W*Z+X*_+Y*$;g[ga+20>>2]=W*aa+X*ba+Y*ha;g[ga+24>>2]=W*ja+X*la+Y*qa;g[ga+28>>2]=0.0;g[ga+32>>2]=ia*Z+ka*_+ma*$;g[ga+36>>2]=ia*aa+ka*ba+ma*ha;g[ga+40>>2]=ia*ja+ka*la+ma*qa;g[ga+44>>2]=0.0;g[ga+48>>2]=pa;g[ga+52>>2]=na;g[ga+56>>2]=ra;g[ga+60>>2]=0.0;Vb[c[(c[ca>>2]|0)+8>>2]&127](ca,ga,ga+80|0,ga+64|0);ra=+g[ga+80>>2]-oa;g[ga+80>>2]=ra;na=+g[ga+80+4>>2]-oa;g[ga+80+4>>2]=na;pa=+g[ga+80+8>>2]-oa;g[ga+80+8>>2]=pa;qa=oa+ +g[ga+64>>2];g[ga+64>>2]=qa;ma=oa+ +g[ga+64+4>>2];g[ga+64+4>>2]=ma;oa=oa+ +g[ga+64+8>>2];g[ga+64+8>>2]=oa;if(!(+g[ga+3328+4>>2]>ma)?!(+g[ga+96+4>>2]>2]>oa?1:+g[ga+96+8>>2]>2]>qa?1:+g[ga+96>>2]>2]>>2]&511](j);n=c[b+4>>2]|0;Ob[c[(c[n>>2]|0)+60>>2]&127](n,j);n=c[p+16>>2]|0;m=c[n+(o*12|0)>>2]|0;n=c[n+(o*12|0)+4>>2]|0;j=c[b+92>>2]|0;if((j|0)==(c[b+96>>2]|0)?(fa=j|0?j<<1:1,(j|0)<(fa|0)):0){if(!fa)i=0;else{c[6995]=(c[6995]|0)+1;i=sc((fa*12|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}j=c[b+92>>2]|0}if((j|0)>0){k=0;do{ca=i+(k*12|0)|0;u=(c[b+100>>2]|0)+(k*12|0)|0;c[ca>>2]=c[u>>2];c[ca+4>>2]=c[u+4>>2];c[ca+8>>2]=c[u+8>>2];k=k+1|0}while((k|0)!=(j|0))}j=c[b+100>>2]|0;if(j|0){if(a[b+104>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[b+100>>2]=0}a[b+104>>0]=1;c[b+100>>2]=i;c[b+96>>2]=fa;i=c[b+92>>2]|0}else i=j;ca=c[b+100>>2]|0;c[ca+(i*12|0)>>2]=m;c[ca+(i*12|0)+4>>2]=n;c[ca+(i*12|0)+8>>2]=0;c[b+92>>2]=(c[b+92>>2]|0)+1}while(0);o=o+1|0}while((o|0)<(c[p+8>>2]|0));j=b+100|0;k=b+92|0}else{j=b+100|0;k=b+92|0}if((c[k>>2]|0)>0){i=0;do{h=c[b+84>>2]|0;fa=c[j>>2]|0;Bb[c[(c[h>>2]|0)+8>>2]&63](h,c[fa+(i*12|0)>>2]|0,c[fa+(i*12|0)+4>>2]|0)|0;i=i+1|0}while((i|0)<(c[k>>2]|0))}i=c[j>>2]|0;if(i|0){if(a[b+104>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[j>>2]=0}a[b+104>>0]=1;c[j>>2]=0;c[k>>2]=0;c[b+96>>2]=0;l=ga;return}function zc(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0,m=0,n=0,o=0.0,p=0.0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0,T=0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0.0,oa=0.0,pa=0.0,qa=0,ra=0;qa=c[b+28>>2]|0;ra=c[b+32>>2]|0;n=c[d+24>>2]|0;if(!(a[b+739>>0]|0)){z=+g[b+552>>2];U=+g[qa+4>>2];A=+g[b+568>>2];V=+g[qa+8>>2];B=+g[b+584>>2];W=+g[qa+12>>2];C=+g[b+556>>2];E=+g[b+572>>2];F=+g[b+588>>2];X=+g[b+560>>2];Y=+g[b+576>>2];Z=+g[b+592>>2];_=+g[qa+20>>2];$=+g[qa+24>>2];aa=+g[qa+28>>2];ba=+g[qa+36>>2];ca=+g[qa+40>>2];da=+g[qa+44>>2];k=+g[b+600>>2];o=+g[b+604>>2];p=+g[b+608>>2];t=+g[qa+52>>2];u=+g[qa+56>>2];v=+g[qa+60>>2];G=+g[ra+4>>2];H=+g[ra+8>>2];I=+g[ra+12>>2];J=+g[b+624>>2];K=+g[b+640>>2];L=+g[b+656>>2];M=+g[ra+20>>2];N=+g[ra+24>>2];O=+g[ra+28>>2];P=+g[ra+36>>2];Q=+g[ra+40>>2];R=+g[ra+44>>2];oa=+g[b+664>>2];pa=+g[b+668>>2];y=+g[b+672>>2];w=+g[ra+52>>2]+(G*oa+H*pa+I*y);x=M*oa+N*pa+O*y+ +g[ra+56>>2];y=P*oa+Q*pa+R*y+ +g[ra+60>>2];l=(a[b+736>>0]|0)==0;if(l){e=c[d+8>>2]|0;g[e>>2]=1.0;g[e+(n+1<<2)>>2]=1.0;g[e+((n<<1)+2<<2)>>2]=1.0;e=c[d+16>>2]|0;g[e>>2]=-1.0;g[e+(n+1<<2)>>2]=-1.0;g[e+((n<<1)+2<<2)>>2]=-1.0;e=n<<1;f=+g[qa+52>>2];h=+g[qa+56>>2];i=+g[qa+60>>2]}else{e=n<<1;f=t;h=u;i=v}j=t+(U*k+V*o+W*p)-f;f=_*k+$*o+aa*p+u-h;pa=ba*k+ca*o+da*p+v-i;m=c[d+12>>2]|0;r=m+(e<<2)|0;c[m>>2]=0;g[m+4>>2]=pa;g[m+8>>2]=-f;g[m+12>>2]=0.0;g[m+(n<<2)>>2]=-pa;c[m+(n<<2)+4>>2]=0;g[m+(n<<2)+8>>2]=j;g[m+(n<<2)+12>>2]=0.0;g[r>>2]=f;g[r+4>>2]=-j;c[r+8>>2]=0;g[r+12>>2]=0.0;j=w-+g[ra+52>>2];f=x-+g[ra+56>>2];pa=y-+g[ra+60>>2];r=c[d+20>>2]|0;S=r+(e<<2)|0;c[r>>2]=0;g[r+4>>2]=-pa;g[r+8>>2]=f;g[r+12>>2]=0.0;g[r+(n<<2)>>2]=pa;c[r+(n<<2)+4>>2]=0;g[r+(n<<2)+8>>2]=-j;g[r+(n<<2)+12>>2]=0.0;g[S>>2]=-f;g[S+4>>2]=j;c[S+8>>2]=0;g[S+12>>2]=0.0;S=c[b+748>>2]|0;j=+g[(S&8|0?b+756|0:d+4|0)>>2];f=j*+g[d>>2];e=c[d+28>>2]|0;if(l){g[e>>2]=f*(w-(t+(U*k+V*o+W*p)));g[e+(n<<2)>>2]=f*(x-(_*k+$*o+aa*p+u));g[e+(n<<1<<2)>>2]=f*(y-(ba*k+ca*o+da*p+v))}s=c[d+24>>2]|0;g[m+(s*3<<2)>>2]=z*U+A*V+B*W;g[m+((s*3|0)+1<<2)>>2]=z*_+A*$+B*aa;g[m+((s*3|0)+2<<2)>>2]=z*ba+A*ca+B*da;g[m+(s<<2<<2)>>2]=U*C+V*E+W*F;g[m+((s<<2|1)<<2)>>2]=C*_+E*$+F*aa;g[m+((s<<2|2)<<2)>>2]=C*ba+E*ca+F*da;g[r+(s*3<<2)>>2]=-(z*U+A*V+B*W);g[r+((s*3|0)+1<<2)>>2]=-(z*_+A*$+B*aa);g[r+((s*3|0)+2<<2)>>2]=-(z*ba+A*ca+B*da);g[r+(s<<2<<2)>>2]=-(U*C+V*E+W*F);g[r+((s<<2|1)<<2)>>2]=-(C*_+E*$+F*aa);g[r+((s<<2|2)<<2)>>2]=-(C*ba+E*ca+F*da);oa=(X*_+Y*$+Z*aa)*(J*P+K*Q+L*R)-(X*ba+Y*ca+Z*da)*(J*M+K*N+L*O);pa=(X*ba+Y*ca+Z*da)*(G*J+H*K+I*L)-(U*X+V*Y+W*Z)*(J*P+K*Q+L*R);na=(U*X+V*Y+W*Z)*(J*M+K*N+L*O)-(X*_+Y*$+Z*aa)*(G*J+H*K+I*L);g[e+(s*3<<2)>>2]=((z*ba+A*ca+B*da)*na+((z*U+A*V+B*W)*oa+(z*_+A*$+B*aa)*pa))*f;g[e+(s<<2<<2)>>2]=((C*ba+E*ca+F*da)*na+((U*C+V*E+W*F)*oa+(C*_+E*$+F*aa)*pa))*f;if(!(a[b+716>>0]|0))if(!(a[b+737>>0]|0))return;else{p=0.0;q=0;n=0;l=1}else{pa=+g[b+708>>2]*+g[b+732>>2];p=pa;q=pa>0.0?1:2;n=1;l=(a[b+737>>0]|0)!=0}g[m+(s*5<<2)>>2]=U*X+V*Y+W*Z;g[m+((s*5|0)+1<<2)>>2]=X*_+Y*$+Z*aa;g[m+((s*5|0)+2<<2)>>2]=X*ba+Y*ca+Z*da;g[r+(s*5<<2)>>2]=-(U*X+V*Y+W*Z);g[r+((s*5|0)+1<<2)>>2]=-(X*_+Y*$+Z*aa);g[r+((s*5|0)+2<<2)>>2]=-(X*ba+Y*ca+Z*da);h=+g[b+688>>2];i=+g[b+692>>2];f=+mh(h-i,6.2831854820251465);if(!(f<-3.1415927410125732))if(f>3.1415927410125732)o=f+-6.2831854820251465;else o=f;else o=f+6.2831854820251465;f=+mh(h+i,6.2831854820251465);if(!(f<-3.1415927410125732))if(f>3.1415927410125732)k=f+-6.2831854820251465;else k=f;else k=f+6.2831854820251465;m=o==k;e=e+(s*5<<2)|0;g[e>>2]=0.0;if(S&2)j=+g[b+764>>2];if(l&(n&m^1)){if(S&4|0)c[(c[d+32>>2]|0)+(s*5<<2)>>2]=c[b+752>>2];h=+g[b+728>>2];i=+g[b+680>>2];f=o>k?1.0:0.0;do if(!(o>=k)){f=i/(j*+g[d>>2]);if(f<0.0)if(h>=o&o-f>h){f=(o-h)/f;break}else{f=h0.0)if(h<=k&k-fk?0.0:1.0;break}else f=0.0}while(0);g[e>>2]=f*i*+g[b+732>>2]+ +g[e>>2];g[(c[d+36>>2]|0)+(s*5<<2)>>2]=-+g[b+684>>2];c[(c[d+40>>2]|0)+(s*5<<2)>>2]=c[b+684>>2]}if(!n)return;g[e>>2]=+g[e>>2]+p*j*+g[d>>2];if(S&1|0)c[(c[d+32>>2]|0)+(s*5<<2)>>2]=c[b+760>>2];e=c[d+40>>2]|0;if(m){f=3402823466385288598117041.0e14;h=-3402823466385288598117041.0e14}else{T=(q|0)==1;f=T?3402823466385288598117041.0e14:0.0;h=T?0.0:-3402823466385288598117041.0e14}g[(c[d+36>>2]|0)+(s*5<<2)>>2]=h;g[e+(s*5<<2)>>2]=f;h=+g[b+704>>2];do if(h>0.0){f=(U*X+V*Y+W*Z)*+g[qa+388>>2]+(X*_+Y*$+Z*aa)*+g[qa+392>>2]+(X*ba+Y*ca+Z*da)*+g[qa+396>>2]-((U*X+V*Y+W*Z)*+g[ra+388>>2]+(X*_+Y*$+Z*aa)*+g[ra+392>>2]+(X*ba+Y*ca+Z*da)*+g[ra+396>>2]);if((q|0)==1){if(!(f<0.0))break;e=(c[d+28>>2]|0)+(s*5<<2)|0;if(!(+g[e>>2]<-(h*f)))break;g[e>>2]=-(h*f);break}else{if(!(f>0.0))break;e=(c[d+28>>2]|0)+(s*5<<2)|0;if(!(+g[e>>2]>-(h*f)))break;g[e>>2]=-(h*f);break}}while(0);d=(c[d+28>>2]|0)+(s*5<<2)|0;g[d>>2]=+g[b+700>>2]*+g[d>>2];return}X=+g[qa+4>>2];Y=+g[qa+8>>2];Z=+g[qa+12>>2];v=+g[b+556>>2];x=+g[b+572>>2];y=+g[b+588>>2];_=+g[b+560>>2];$=+g[b+576>>2];aa=+g[b+592>>2];ba=+g[qa+20>>2];ca=+g[qa+24>>2];da=+g[qa+28>>2];ea=+g[qa+36>>2];fa=+g[qa+40>>2];ga=+g[qa+44>>2];ia=+g[b+600>>2];ha=+g[b+604>>2];o=+g[b+608>>2];h=+g[qa+52>>2]+(X*ia+Y*ha+Z*o);u=ba*ia+ca*ha+da*o+ +g[qa+56>>2];o=ea*ia+fa*ha+ga*o+ +g[qa+60>>2];ha=+g[ra+4>>2];ia=+g[ra+8>>2];ja=+g[ra+12>>2];ka=+g[b+624>>2];la=+g[b+640>>2];O=+g[b+656>>2];P=+g[ra+20>>2];Q=+g[ra+24>>2];R=+g[ra+28>>2];U=+g[ra+36>>2];V=+g[ra+40>>2];W=+g[ra+44>>2];p=+g[b+664>>2];w=+g[b+668>>2];i=+g[b+672>>2];f=+g[ra+52>>2];t=+g[ra+56>>2];k=+g[ra+60>>2];J=f+(ha*p+ia*w+ja*i)-h;K=P*p+Q*w+R*i+t-u;L=U*p+V*w+W*i+k-o;z=+g[(c[b+28>>2]|0)+404>>2];A=+g[(c[b+32>>2]|0)+404>>2];I=z+A>0.0?A/(z+A):.5;ma=(X*_+Y*$+Z*aa)*I+(ha*ka+ia*la+ja*O)*(1.0-I);na=(_*ba+$*ca+aa*da)*I+(ka*P+la*Q+O*R)*(1.0-I);oa=(_*ea+$*fa+aa*ga)*I+(ka*U+la*V+O*W)*(1.0-I);pa=1.0/+D(+(ma*ma+na*na+oa*oa));F=(f+(ha*p+ia*w+ja*i)-f)*ma*pa+(P*p+Q*w+R*i+t-t)*na*pa+(U*p+V*w+W*i+k-k)*oa*pa;f=f+(ha*p+ia*w+ja*i)-f-ma*pa*F;t=P*p+Q*w+R*i+t-t-na*pa*F;k=U*p+V*w+W*i+k-k-oa*pa*F;h=h-+g[qa+52>>2];u=u-+g[qa+56>>2];o=o-+g[qa+60>>2];i=ma*pa*(h*ma*pa+u*na*pa+o*oa*pa);w=na*pa*(h*ma*pa+u*na*pa+o*oa*pa);p=oa*pa*(h*ma*pa+u*na*pa+o*oa*pa);C=h-i+I*(i-ma*pa*F);E=u-w+I*(w-na*pa*F);B=o-p+I*(p-oa*pa*F);G=f-(1.0-I)*(i-ma*pa*F);H=t-(1.0-I)*(w-na*pa*F);F=k-(1.0-I)*(p-oa*pa*F);j=(I*f+(1.0-I)*(h-i))*(I*f+(1.0-I)*(h-i))+(I*t+(1.0-I)*(u-w))*(I*t+(1.0-I)*(u-w))+(I*k+(1.0-I)*(o-p))*(I*k+(1.0-I)*(o-p));if(j>1.1920928955078125e-07){y=1.0/+D(+j);N=(I*f+(1.0-I)*(h-i))*y;M=y*(I*k+(1.0-I)*(o-p));p=y*(I*t+(1.0-I)*(u-w))}else{N=X*v+Y*x+Z*y;M=v*ea+x*fa+y*ga;p=v*ba+x*ca+y*da}t=na*pa*M-oa*pa*p;u=oa*pa*N-M*ma*pa;v=p*ma*pa-na*pa*N;T=c[d+12>>2]|0;g[T>>2]=E*M-B*p;g[T+4>>2]=B*N-C*M;g[T+8>>2]=C*p-E*N;T=c[d+20>>2]|0;g[T>>2]=-(H*M-F*p);g[T+4>>2]=-(F*N-G*M);g[T+8>>2]=-(G*p-H*N);if(z<1.1920928955078125e-07|A<1.1920928955078125e-07?(a[b+716>>0]|0)!=0:0){f=I*(E*v-B*u);h=I*(B*t-C*v);i=I*(C*u-E*t);j=(1.0-I)*(H*v-F*u);k=(1.0-I)*(F*t-G*v);o=(1.0-I)*(G*u-H*t)}else{f=E*v-B*u;h=B*t-C*v;i=C*u-E*t;j=H*v-F*u;k=F*t-G*v;o=G*u-H*t}T=(c[d+12>>2]|0)+(n<<2)|0;g[T>>2]=f;g[T+4>>2]=h;g[T+8>>2]=i;T=c[d+20>>2]|0;g[T+(n<<2)>>2]=-j;g[T+(n+1<<2)>>2]=-k;g[T+(n+2<<2)>>2]=-o;if(z<1.1920928955078125e-07|A<1.1920928955078125e-07){o=I*(E*oa*pa-B*na*pa);k=I*(B*ma*pa-C*oa*pa);h=I*(C*na*pa-E*ma*pa);j=(1.0-I)*(H*oa*pa-F*na*pa);i=(1.0-I)*(F*ma*pa-G*oa*pa);f=(1.0-I)*(G*na*pa-H*ma*pa)}else{o=E*oa*pa-B*na*pa;k=B*ma*pa-C*oa*pa;h=C*na*pa-E*ma*pa;j=H*oa*pa-F*na*pa;i=F*ma*pa-G*oa*pa;f=G*na*pa-H*ma*pa}e=(c[d+12>>2]|0)+(n<<1<<2)|0;g[e>>2]=o;g[e+4>>2]=k;g[e+8>>2]=h;e=c[d+20>>2]|0;g[e+(n<<1<<2)>>2]=-j;g[e+((n<<1|1)<<2)>>2]=-i;g[e+((n<<1)+2<<2)>>2]=-f;k=+g[(c[b+748>>2]&8|0?b+756|0:d+4|0)>>2];f=k*+g[d>>2];if(!(a[b+736>>0]|0)){S=c[d+8>>2]|0;g[S>>2]=N;g[S+4>>2]=p;g[S+8>>2]=M;S=(c[d+8>>2]|0)+(n<<2)|0;g[S>>2]=t;g[S+4>>2]=u;g[S+8>>2]=v;S=(c[d+8>>2]|0)+(n<<1<<2)|0;g[S>>2]=ma*pa;g[S+4>>2]=na*pa;g[S+8>>2]=oa*pa;S=c[d+16>>2]|0;h=-N;g[S>>2]=h;g[S+4>>2]=-p;g[S+8>>2]=-M;g[S+(n<<2)>>2]=-t;g[S+(n+1<<2)>>2]=-u;g[S+(n+2<<2)>>2]=-v;g[S+(n<<1<<2)>>2]=-(ma*pa);g[S+((n<<1|1)<<2)>>2]=-(na*pa);g[S+((n<<1)+2<<2)>>2]=-(oa*pa);S=c[d+28>>2]|0;g[S>>2]=f*(J*N+K*p+L*M);g[S+(n<<2)>>2]=f*(J*t+K*u+L*v);g[S+(n<<1<<2)>>2]=f*(J*ma*pa+K*na*pa+L*oa*pa);f=h;h=-t;i=-u;j=-v;T=d+28|0;e=c[d+20>>2]|0}else{f=-N;h=-t;i=-u;j=-v;T=d+28|0;S=c[d+28>>2]|0}l=c[d+12>>2]|0;g[l+(n*3<<2)>>2]=N;g[l+((n*3|0)+1<<2)>>2]=p;g[l+((n*3|0)+2<<2)>>2]=M;g[l+(n<<2<<2)>>2]=t;g[l+((n<<2|1)<<2)>>2]=u;g[l+((n<<2|2)<<2)>>2]=v;g[e+(n*3<<2)>>2]=f;g[e+((n*3|0)+1<<2)>>2]=-p;g[e+((n*3|0)+2<<2)>>2]=-M;g[e+(n<<2<<2)>>2]=h;g[e+((n<<2|1)<<2)>>2]=i;g[e+((n<<2|2)<<2)>>2]=j;K=k*+g[d>>2];L=(_*ba+$*ca+aa*da)*(ka*U+la*V+O*W)-(_*ea+$*fa+aa*ga)*(ka*P+la*Q+O*R);ga=(_*ea+$*fa+aa*ga)*(ha*ka+ia*la+ja*O)-(X*_+Y*$+Z*aa)*(ka*U+la*V+O*W);la=(X*_+Y*$+Z*aa)*(ka*P+la*Q+O*R)-(_*ba+$*ca+aa*da)*(ha*ka+ia*la+ja*O);g[S+(n*3<<2)>>2]=K*(L*N+ga*p+la*M);g[S+(n<<2<<2)>>2]=K*(L*t+ga*u+la*v);if(!(a[b+716>>0]|0))if(!(a[b+737>>0]|0))return;else{p=0.0;r=0;q=0;n=1}else{la=+g[b+708>>2]*+g[b+732>>2];p=la;r=la>0.0?1:2;q=1;n=(a[b+737>>0]|0)!=0}s=(c[d+24>>2]|0)*5|0;g[l+(s<<2)>>2]=ma*pa;g[l+(s+1<<2)>>2]=na*pa;g[l+(s+2<<2)>>2]=oa*pa;g[e+(s<<2)>>2]=-(ma*pa);g[e+(s+1<<2)>>2]=-(na*pa);g[e+(s+2<<2)>>2]=-(oa*pa);h=+g[b+688>>2];i=+g[b+692>>2];f=+mh(h-i,6.2831854820251465);if(!(f<-3.1415927410125732))if(f>3.1415927410125732)o=f+-6.2831854820251465;else o=f;else o=f+6.2831854820251465;f=+mh(h+i,6.2831854820251465);if(!(f<-3.1415927410125732)){if(f>3.1415927410125732)f=f+-6.2831854820251465}else f=f+6.2831854820251465;m=o==f;e=S+(s<<2)|0;g[e>>2]=0.0;l=c[b+748>>2]|0;if(l&2)k=+g[b+764>>2];if(n&(q&m^1)){if(l&4|0)c[(c[d+32>>2]|0)+(s<<2)>>2]=c[b+752>>2];i=+g[b+728>>2];j=+g[b+680>>2];h=o>f?1.0:0.0;do if(!(o>=f)){h=j/(k*+g[d>>2]);if(h<0.0)if(i>=o&o-h>i){f=(o-i)/h;break}else{f=i0.0)if(i<=f&f-hf?0.0:1.0;break}else f=0.0}else f=h;while(0);g[e>>2]=f*j*+g[b+732>>2]+ +g[e>>2];g[(c[d+36>>2]|0)+(s<<2)>>2]=-+g[b+684>>2];c[(c[d+40>>2]|0)+(s<<2)>>2]=c[b+684>>2]}if(!q)return;g[e>>2]=+g[e>>2]+p*k*+g[d>>2];if(l&1|0)c[(c[d+32>>2]|0)+(s<<2)>>2]=c[b+760>>2];if(m){f=3402823466385288598117041.0e14;h=-3402823466385288598117041.0e14}else{S=(r|0)==1;f=S?3402823466385288598117041.0e14:0.0;h=S?0.0:-3402823466385288598117041.0e14}g[(c[d+36>>2]|0)+(s<<2)>>2]=h;g[(c[d+40>>2]|0)+(s<<2)>>2]=f;h=+g[b+704>>2];do if(h>0.0){f=+g[qa+388>>2]*ma*pa+ +g[qa+392>>2]*na*pa+ +g[qa+396>>2]*oa*pa-(ma*pa*+g[ra+388>>2]+na*pa*+g[ra+392>>2]+oa*pa*+g[ra+396>>2]);if((r|0)==1){if(!(f<0.0))break;e=(c[T>>2]|0)+(s<<2)|0;if(!(+g[e>>2]<-(h*f)))break;g[e>>2]=-(h*f);break}else{if(!(f>0.0))break;e=(c[T>>2]|0)+(s<<2)|0;if(!(+g[e>>2]>-(h*f)))break;g[e>>2]=-(h*f);break}}while(0);d=(c[T>>2]|0)+(s<<2)|0;g[d>>2]=+g[b+700>>2]*+g[d>>2];return}function Ac(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,k=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0.0,x=0,y=0,z=0,A=0,B=0,E=0,F=0,G=0,H=0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,Q=0.0,R=0.0,S=0,T=0,U=0,V=0,W=0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0,ca=0.0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0;ia=l;l=l+32|0;da=c[b+28>>2]|0;ea=c[b+32>>2]|0;$=+g[da+404>>2];_=+g[ea+404>>2];W=c[d+24>>2]|0;ca=a[b+180>>0]|0?1.0:-1.0;X=+g[b+936>>2]-+g[b+872>>2];Y=+g[b+940>>2]-+g[b+876>>2];Z=+g[b+944>>2]-+g[b+880>>2];aa=$+_>0.0?_/($+_):.5;A=c[b+824>>2]|0;B=c[b+840>>2]|0;E=c[b+856>>2]|0;F=c[b+888>>2]|0;G=c[b+904>>2]|0;H=c[b+920>>2]|0;S=(a[b+49>>0]|0)==0;do if(!S){f=aa*(c[j>>2]=A,+g[j>>2]);k=aa*(c[j>>2]=B,+g[j>>2]);i=aa*(c[j>>2]=E,+g[j>>2]);h=(1.0-aa)*(c[j>>2]=F,+g[j>>2]);n=(1.0-aa)*(c[j>>2]=G,+g[j>>2]);i=i+(1.0-aa)*(c[j>>2]=H,+g[j>>2]);o=1.0/+D(+((f+h)*(f+h)+(k+n)*(k+n)+i*i));e=(g[j>>2]=(f+h)*o,c[j>>2]|0);m=(g[j>>2]=(k+n)*o,c[j>>2]|0);v=(g[j>>2]=i*o,c[j>>2]|0);if(+C(+(i*o))>.7071067690849304){R=1.0/+D(+(i*o*i*o+(k+n)*o*(k+n)*o));c[ia+24>>2]=0;g[ia+20>>2]=-(i*o*R);g[ia+16>>2]=(k+n)*o*R;g[ia>>2]=(i*o*i*o+(k+n)*o*(k+n)*o)*R;g[ia+4>>2]=-((f+h)*o*(k+n)*o*R);U=ia;V=ia+4|0;f=(f+h)*o*-(i*o*R);q=2;fa=e;ga=m;ha=v;e=0;h=0.0;break}else{Q=(f+h)*o*(f+h)*o+(k+n)*o*(k+n)*o;R=1.0/+D(+Q);T=(g[j>>2]=-((k+n)*o*R),c[j>>2]|0);g[ia+24>>2]=-((k+n)*o*R);g[ia+20>>2]=(f+h)*o*R;c[ia+16>>2]=0;g[ia>>2]=-(i*o*(f+h)*o*R);g[ia+4>>2]=i*o*-((k+n)*o*R);U=ia;V=ia+4|0;f=Q*R;q=2;fa=e;ga=m;ha=v;e=T;h=-((k+n)*o*R);break}}else{T=c[b+828>>2]|0;U=c[b+844>>2]|0;V=c[b+860>>2]|0;c[ia+24>>2]=T;c[ia+20>>2]=U;c[ia+16>>2]=V;V=c[b+848>>2]|0;U=c[b+864>>2]|0;c[ia>>2]=c[b+832>>2];c[ia+4>>2]=V;c[ia+8>>2]=U;U=ia;V=ia+4|0;f=0.0;q=3;fa=A;ga=B;ha=E;e=T;h=(c[j>>2]=T,+g[j>>2])}while(0);g[ia+(q<<2)>>2]=f;T=c[d+12>>2]|0;c[T>>2]=e;m=c[ia+20>>2]|0;c[T+4>>2]=m;q=c[ia+16>>2]|0;c[T+8>>2]=q;v=c[ia>>2]|0;c[T+(W<<2)>>2]=v;x=c[V>>2]|0;c[T+(W+1<<2)>>2]=x;y=c[ia+8>>2]|0;c[T+(W+2<<2)>>2]=y;z=c[d+20>>2]|0;g[z>>2]=-h;s=(c[j>>2]=m,+g[j>>2]);g[z+4>>2]=-s;w=(c[j>>2]=q,+g[j>>2]);g[z+8>>2]=-w;t=(c[j>>2]=v,+g[j>>2]);g[z+(W<<2)>>2]=-t;p=(c[j>>2]=x,+g[j>>2]);g[z+(W+1<<2)>>2]=-p;u=(c[j>>2]=y,+g[j>>2]);g[z+(W+2<<2)>>2]=-u;e=c[b+300>>2]|0;f=+g[b+280>>2];if(!(e&128))f=f*+g[d+4>>2];K=f*+g[d>>2];Q=(c[j>>2]=B,+g[j>>2]);M=(c[j>>2]=H,+g[j>>2]);L=(c[j>>2]=E,+g[j>>2]);O=(c[j>>2]=G,+g[j>>2]);R=(c[j>>2]=F,+g[j>>2]);N=(c[j>>2]=A,+g[j>>2]);H=c[d+28>>2]|0;g[H>>2]=K*((Q*M-L*O)*h+(L*R-N*M)*s+(N*O-Q*R)*w);g[H+(W<<2)>>2]=K*((Q*M-L*O)*t+(L*R-N*M)*p+(N*O-Q*R)*u);if(e&64|0){H=c[d+32>>2]|0;c[H>>2]=c[b+292>>2];c[H+(W<<2)>>2]=c[b+292>>2]}R=+g[da+52>>2];L=+g[da+56>>2];O=+g[da+60>>2];J=+g[ea+52>>2];f=+g[ea+56>>2];i=+g[ea+60>>2];if(S){N=(i-O)*h-(J-R)*w;r=(J-R)*s-(f-L)*h;g[T+(W<<1<<2)>>2]=aa*((f-L)*w-(i-O)*s);g[T+((W<<1|1)<<2)>>2]=aa*N;g[T+((W<<1)+2<<2)>>2]=aa*r;g[z+(W<<1<<2)>>2]=(1.0-aa)*((f-L)*w-(i-O)*s);g[z+((W<<1|1)<<2)>>2]=(1.0-aa)*N;g[z+((W<<1)+2<<2)>>2]=(1.0-aa)*r;g[T+(W*3<<2)>>2]=aa*((f-L)*u-(i-O)*p);g[T+((W*3|0)+1<<2)>>2]=aa*((i-O)*t-(J-R)*u);g[T+((W*3|0)+2<<2)>>2]=aa*((J-R)*p-(f-L)*t);g[z+(W*3<<2)>>2]=(1.0-aa)*((f-L)*u-(i-O)*p);g[z+((W*3|0)+1<<2)>>2]=(1.0-aa)*((i-O)*t-(J-R)*u);g[z+((W*3|0)+2<<2)>>2]=(1.0-aa)*((J-R)*p-(f-L)*t);e=c[d+8>>2]|0;V=c[ia+24>>2]|0;c[e+(W<<1<<2)>>2]=V;c[e+((W<<1|1)<<2)>>2]=m;c[e+((W<<1)+2<<2)>>2]=q;c[e+(W*3<<2)>>2]=v;c[e+((W*3|0)+1<<2)>>2]=x;c[e+((W*3|0)+2<<2)>>2]=y;q=c[d+16>>2]|0;r=(c[j>>2]=V,+g[j>>2]);g[q+(W<<1<<2)>>2]=-r;g[q+((W<<1|1)<<2)>>2]=-s;g[q+((W<<1)+2<<2)>>2]=-w;g[q+(W*3<<2)>>2]=-t;g[q+((W*3|0)+1<<2)>>2]=-p;N=-u;m=q+((W*3|0)+2<<2)|0;Q=0.0;M=0.0;K=0.0;I=0.0;o=0.0;n=0.0;k=f-L;i=i-O;h=J-R}else{u=+g[b+936>>2]-J;w=+g[b+940>>2]-f;M=+g[b+944>>2]-i;n=(c[j>>2]=fa,+g[j>>2]);k=(c[j>>2]=ga,+g[j>>2]);o=(c[j>>2]=ha,+g[j>>2]);N=+g[b+872>>2]-R;Q=+g[b+876>>2]-L;i=+g[b+880>>2]-O;O=+g[b+1080>>2]-+g[b+1032>>2];R=n*(n*N+k*Q+o*i)+n*O-n*(n*u+k*w+o*M);I=k*(n*N+k*Q+o*i)+k*O-k*(n*u+k*w+o*M);O=o*(n*N+k*Q+o*i)+o*O-o*(n*u+k*w+o*M);K=N-n*(n*N+k*Q+o*i)+aa*R;J=Q-k*(n*N+k*Q+o*i)+aa*I;L=i-o*(n*N+k*Q+o*i)+aa*O;R=u-n*(n*u+k*w+o*M)-(1.0-aa)*R;I=w-k*(n*u+k*w+o*M)-(1.0-aa)*I;O=M-o*(n*u+k*w+o*M)-(1.0-aa)*O;h=aa*(u-n*(n*u+k*w+o*M))+(1.0-aa)*(N-n*(n*N+k*Q+o*i));f=aa*(w-k*(n*u+k*w+o*M))+(1.0-aa)*(Q-k*(n*N+k*Q+o*i));i=aa*(M-o*(n*u+k*w+o*M))+(1.0-aa)*(i-o*(n*N+k*Q+o*i));g[ia+24>>2]=h;g[ia+20>>2]=f;g[ia+16>>2]=i;if(i*i+(h*h+f*f)>1.1920928955078125e-07){Q=1.0/+D(+(i*i+(h*h+f*f)));g[ia+24>>2]=h*Q;g[ia+20>>2]=Q*f;g[ia+16>>2]=Q*i;m=(g[j>>2]=h*Q,c[j>>2]|0);q=(g[j>>2]=Q*f,c[j>>2]|0);w=Q*i;s=Q*f;r=h*Q;e=(g[j>>2]=Q*i,c[j>>2]|0)}else{m=c[b+828>>2]|0;q=c[b+844>>2]|0;e=c[b+860>>2]|0;c[ia+24>>2]=m;c[ia+20>>2]=q;c[ia+16>>2]=e;w=(c[j>>2]=e,+g[j>>2]);s=(c[j>>2]=q,+g[j>>2]);r=(c[j>>2]=m,+g[j>>2])}t=k*w-o*s;u=n*s-k*r;g[U>>2]=t;g[V>>2]=o*r-n*w;g[ia+8>>2]=u;g[ia+12>>2]=0.0;g[T+(W<<1<<2)>>2]=J*w-L*s;g[T+(W<<1<<2)+4>>2]=L*r-K*w;g[T+(W<<1<<2)+8>>2]=K*s-J*r;U=c[d+20>>2]|0;g[U+(W<<1<<2)>>2]=-(I*w-O*s);g[U+((W<<1|1)<<2)>>2]=-(O*r-R*w);g[U+((W<<1)+2<<2)>>2]=-(R*s-I*r);p=+g[V>>2];if($<1.1920928955078125e-07|_<1.1920928955078125e-07?(a[b+297>>0]|0)!=0:0){f=aa*(J*u-L*p);h=aa*(K*p-J*t);i=aa*(L*t-K*u);k=(1.0-aa)*(I*u-O*p);n=(1.0-aa)*(O*t-R*u);o=(1.0-aa)*(R*p-I*t)}else{f=J*u-L*p;h=K*p-J*t;i=L*t-K*u;k=I*u-O*p;n=O*t-R*u;o=R*p-I*t}V=(c[d+12>>2]|0)+(W*3<<2)|0;g[V>>2]=f;g[V+4>>2]=i;g[V+8>>2]=h;V=c[d+20>>2]|0;g[V+(W*3<<2)>>2]=-k;g[V+((W*3|0)+1<<2)>>2]=-n;g[V+((W*3|0)+2<<2)>>2]=-o;V=c[d+8>>2]|0;c[V+(W<<1<<2)>>2]=m;c[V+((W<<1|1)<<2)>>2]=q;c[V+((W<<1)+2<<2)>>2]=e;g[V+(W*3<<2)>>2]=t;g[V+((W*3|0)+1<<2)>>2]=p;g[V+((W*3|0)+2<<2)>>2]=u;q=c[d+16>>2]|0;g[q+(W<<1<<2)>>2]=-r;g[q+((W<<1|1)<<2)>>2]=-s;g[q+((W<<1)+2<<2)>>2]=-w;g[q+(W*3<<2)>>2]=-t;g[q+((W*3|0)+1<<2)>>2]=-p;N=-u;m=q+((W*3|0)+2<<2)|0;e=V;Q=J;M=L;o=O;n=R;k=0.0;i=0.0;h=0.0}g[m>>2]=N;A=c[b+300>>2]|0;f=+g[b+264>>2];if(!(A&32))f=f*+g[d+4>>2];R=f*+g[d>>2];B=c[d+28>>2]|0;g[B+(W<<1<<2)>>2]=R*(X*r+Y*s+Z*w);g[B+(W*3<<2)>>2]=R*(X*t+Y*p+Z*u);if(A&16|0){V=c[d+32>>2]|0;c[V+(W<<1<<2)>>2]=c[b+276>>2];c[V+(W*3<<2)>>2]=c[b+276>>2]}if(!(a[b+296>>0]|0))if(!(a[b+1096>>0]|0))e=4;else{p=0.0;y=0;x=0;v=1;ba=26}else{Z=ca*+g[b+1032>>2];p=Z;y=Z>0.0?2:1;x=1;v=(a[b+1096>>0]|0)!=0;ba=26}if((ba|0)==26){z=c[d+24>>2]<<2;c[e+(z<<2)>>2]=fa;c[e+((z|1)<<2)>>2]=ga;c[e+((z|2)<<2)>>2]=ha;r=(c[j>>2]=fa,+g[j>>2]);g[q+(z<<2)>>2]=-r;s=(c[j>>2]=ga,+g[j>>2]);g[q+((z|1)<<2)>>2]=-s;t=(c[j>>2]=ha,+g[j>>2]);g[q+((z|2)<<2)>>2]=-t;if(a[b+49>>0]|0){if(!($<1.1920928955078125e-07|_<1.1920928955078125e-07)){e=c[d+12>>2]|0;g[e+(z<<2)>>2]=t*Q-s*M;g[e+((z|1)<<2)>>2]=r*M-t*K;g[e+((z|2)<<2)>>2]=s*K-r*Q;e=c[d+20>>2]|0;g[e+(z<<2)>>2]=-(t*I-s*o);g[e+((z|1)<<2)>>2]=-(r*o-t*n);f=-(s*n-r*I);ba=30}}else{_=t*k-s*i;$=r*i-t*h;f=s*h-r*k;e=c[d+12>>2]|0;g[e+(z<<2)>>2]=aa*_;g[e+((z|1)<<2)>>2]=aa*$;g[e+((z|2)<<2)>>2]=aa*f;e=c[d+20>>2]|0;g[e+(z<<2)>>2]=(1.0-aa)*_;g[e+((z|1)<<2)>>2]=(1.0-aa)*$;f=(1.0-aa)*f;ba=30}if((ba|0)==30)g[e+((z|2)<<2)>>2]=f;e=+g[b+184>>2]==+g[b+188>>2];g[B+(z<<2)>>2]=0.0;m=(c[d+36>>2]|0)+(z<<2)|0;g[m>>2]=0.0;q=(c[d+40>>2]|0)+(z<<2)|0;g[q>>2]=0.0;o=+g[(A&512|0?b+232|0:d+4|0)>>2];if(v&(x&e^1)){if(A&1|0)c[(c[d+32>>2]|0)+(z<<2)>>2]=c[b+212>>2];n=+g[b+1100>>2];f=+g[b+1080>>2];h=+g[b+184>>2];i=+g[b+188>>2];k=o*+g[d>>2];do if(!(h>i))if(!(h==i)){if(n/k<0.0)if(f>=h?h-n/k>f:0){f=(h-f)/(n/k);break}else{f=f0.0)if(f<=i?i-n/ki?0.0:1.0;break}else f=0.0}else f=0.0;else f=1.0;while(0);g[B+(z<<2)>>2]=+g[B+(z<<2)>>2]-ca*f*n;g[m>>2]=-+g[b+1104>>2]/+g[d>>2]+ +g[m>>2];g[q>>2]=+g[b+1104>>2]/+g[d>>2]+ +g[q>>2]}if(x){g[B+(z<<2)>>2]=+g[B+(z<<2)>>2]+p*o*+g[d>>2];if(A&256|0)c[(c[d+32>>2]|0)+(z<<2)>>2]=c[b+244>>2];if(e){f=-3402823466385288598117041.0e14;h=3402823466385288598117041.0e14}else{ba=(y|0)==1;f=ba?-3402823466385288598117041.0e14:0.0;h=ba?0.0:3402823466385288598117041.0e14}g[m>>2]=f;g[q>>2]=h;aa=1.0-+g[b+240>>2];h=+C(+aa);do if(!(aa!=aa|0.0!=0.0|aa==0.0)){f=ca*(r*+g[da+372>>2]+s*+g[da+376>>2]+t*+g[da+380>>2]-(r*+g[ea+372>>2]+s*+g[ea+376>>2]+t*+g[ea+380>>2]));if((y|0)==1){if(!(f<0.0))break;if(!(+g[B+(z<<2)>>2]<-(h*f)))break;g[B+(z<<2)>>2]=-(h*f);break}else{if(!(f>0.0))break;if(!(+g[B+(z<<2)>>2]>-(h*f)))break;g[B+(z<<2)>>2]=-(h*f);break}}while(0);g[B+(z<<2)>>2]=+g[b+232>>2]*+g[B+(z<<2)>>2];e=5}else e=5}if(!(a[b+297>>0]|0))if(!(a[b+1112>>0]|0)){l=ia;return}else{t=0.0;x=0;v=0;m=1}else{ca=+g[b+1088>>2];t=ca;x=ca>0.0?1:2;v=1;m=(a[b+1112>>0]|0)!=0}y=P(c[d+24>>2]|0,e)|0;q=c[d+12>>2]|0;c[q+(y<<2)>>2]=fa;c[q+(y+1<<2)>>2]=ga;c[q+(y+2<<2)>>2]=ha;w=(c[j>>2]=fa,+g[j>>2]);q=c[d+20>>2]|0;g[q+(y<<2)>>2]=-w;u=(c[j>>2]=ga,+g[j>>2]);g[q+(y+1<<2)>>2]=-u;s=(c[j>>2]=ha,+g[j>>2]);g[q+(y+2<<2)>>2]=-s;o=+g[b+192>>2];p=+g[b+196>>2];q=c[b+300>>2]|0;r=+g[(q&2048|0?b+248|0:d+4|0)>>2];if(m&(v&o==p^1)){if(!(q&4)){i=o;k=p}else{c[(c[d+32>>2]|0)+(y<<2)>>2]=c[b+228>>2];i=+g[b+192>>2];k=+g[b+196>>2]}f=+g[b+1084>>2];n=+g[b+1116>>2];h=r*+g[d>>2];do if(!(i>k))if(!(i==k)){if(n/h<0.0)if(f>=i?i-n/h>f:0){f=(i-f)/(n/h);break}else{f=f0.0)if(f<=k?k-n/hk?0.0:1.0;break}else f=0.0}else f=0.0;else f=1.0;while(0);e=c[d+28>>2]|0;g[e+(y<<2)>>2]=f*n;g[(c[d+36>>2]|0)+(y<<2)>>2]=-+g[b+1120>>2]/+g[d>>2];g[(c[d+40>>2]|0)+(y<<2)>>2]=+g[b+1120>>2]/+g[d>>2]}else e=B;if(!v){l=ia;return}ha=e+(y<<2)|0;g[ha>>2]=+g[ha>>2]+t*r*+g[d>>2];if(q&1024|0)c[(c[d+32>>2]|0)+(y<<2)>>2]=c[b+260>>2];if(o==p){f=-3402823466385288598117041.0e14;h=3402823466385288598117041.0e14}else{ha=(x|0)==1;f=ha?0.0:-3402823466385288598117041.0e14;h=ha?3402823466385288598117041.0e14:0.0}g[(c[d+36>>2]|0)+(y<<2)>>2]=f;g[(c[d+40>>2]|0)+(y<<2)>>2]=h;ca=1.0-+g[b+256>>2];h=+C(+ca);do if(!(ca!=ca|0.0!=0.0|ca==0.0)){ga=c[b+28>>2]|0;ha=c[b+32>>2]|0;f=w*+g[ga+388>>2]+u*+g[ga+392>>2]+s*+g[ga+396>>2]-(w*+g[ha+388>>2]+u*+g[ha+392>>2]+s*+g[ha+396>>2]);if((x|0)==1){if(!(f<0.0))break;e=(c[d+28>>2]|0)+(y<<2)|0;if(!(+g[e>>2]<-(h*f)))break;g[e>>2]=-(h*f);break}else{if(!(f>0.0))break;e=(c[d+28>>2]|0)+(y<<2)|0;if(!(+g[e>>2]>-(h*f)))break;g[e>>2]=-(h*f);break}}while(0);d=(c[d+28>>2]|0)+(y<<2)|0;g[d>>2]=+g[b+248>>2]*+g[d>>2];l=ia;return}function Bc(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0.0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0,z=0,A=0.0,B=0;B=l;l=l+112|0;c[b>>2]=5320;c[b+132>>2]=0;c[b+132+4>>2]=0;c[b+132+8>>2]=0;c[b+132+12>>2]=0;c[b+132+16>>2]=0;c[b+132+20>>2]=0;c[b+132+24>>2]=0;c[b+132+28>>2]=0;c[b+164>>2]=1065353216;c[b+168>>2]=1065353216;c[b+172>>2]=1065353216;g[b+176>>2]=0.0;c[b+180>>2]=0;g[b+184>>2]=999999984306749440.0;c[b+188>>2]=0;c[b+188+4>>2]=0;c[b+188+8>>2]=0;c[b+188+12>>2]=0;c[b+204>>2]=1;c[b+208>>2]=-1;c[b+212>>2]=-1;c[b+216>>2]=-1;c[b+220>>2]=1;g[b+224>>2]=0.0;g[b+228>>2]=.5;g[b+232>>2]=0.0;g[b+236>>2]=0.0;g[b+240>>2]=0.0;g[b+244>>2]=.10000000149011612;g[b+248>>2]=1.0e4;c[b+252>>2]=1;c[b+256>>2]=0;c[b+260>>2]=-1;c[b+264>>2]=-1;g[b+268>>2]=1.0;g[b+272>>2]=0.0;g[b+276>>2]=0.0;c[b+280>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;c[b+304>>2]=0;c[b+4>>2]=1065353216;c[b+8>>2]=0;c[b+8+4>>2]=0;c[b+8+8>>2]=0;c[b+8+12>>2]=0;c[b+24>>2]=1065353216;c[b+28>>2]=0;c[b+28+4>>2]=0;c[b+28+8>>2]=0;c[b+28+12>>2]=0;c[b+44>>2]=1065353216;c[b+48>>2]=0;c[b+48+4>>2]=0;c[b+48+8>>2]=0;c[b+48+12>>2]=0;c[b+48+16>>2]=0;c[b+68>>2]=1065353216;c[b+72>>2]=0;c[b+72+4>>2]=0;c[b+72+8>>2]=0;c[b+72+12>>2]=0;c[b+88>>2]=1065353216;c[b+92>>2]=0;c[b+92+4>>2]=0;c[b+92+8>>2]=0;c[b+92+12>>2]=0;c[b+108>>2]=1065353216;c[b+112>>2]=0;c[b+112+4>>2]=0;c[b+112+8>>2]=0;c[b+112+12>>2]=0;c[b+112+16>>2]=0;c[b>>2]=3356;a[b+340>>0]=1;c[b+336>>2]=0;c[b+328>>2]=0;c[b+332>>2]=0;c[b+344>>2]=0;a[b+468>>0]=1;c[b+464>>2]=0;c[b+456>>2]=0;c[b+460>>2]=0;a[b+488>>0]=1;c[b+484>>2]=0;c[b+476>>2]=0;c[b+480>>2]=0;a[b+508>>0]=1;c[b+504>>2]=0;c[b+496>>2]=0;c[b+500>>2]=0;a[b+556>>0]=1;c[b+552>>2]=0;c[b+544>>2]=0;c[b+548>>2]=0;a[b+576>>0]=1;c[b+572>>2]=0;c[b+564>>2]=0;c[b+568>>2]=0;c[b+744>>2]=d;a[b+764>>0]=1;c[b+760>>2]=0;c[b+752>>2]=0;c[b+756>>2]=0;a[b+784>>0]=1;c[b+780>>2]=0;c[b+772>>2]=0;c[b+776>>2]=0;a[b+804>>0]=1;c[b+800>>2]=0;c[b+792>>2]=0;c[b+796>>2]=0;a[b+824>>0]=1;c[b+820>>2]=0;c[b+812>>2]=0;c[b+816>>2]=0;a[b+844>>0]=1;c[b+840>>2]=0;c[b+832>>2]=0;c[b+836>>2]=0;a[b+864>>0]=1;c[b+860>>2]=0;c[b+852>>2]=0;c[b+856>>2]=0;a[b+884>>0]=1;c[b+880>>2]=0;c[b+872>>2]=0;c[b+876>>2]=0;a[b+904>>0]=1;c[b+900>>2]=0;c[b+892>>2]=0;c[b+896>>2]=0;a[b+924>>0]=1;c[b+920>>2]=0;c[b+912>>2]=0;c[b+916>>2]=0;a[b+944>>0]=1;c[b+940>>2]=0;c[b+932>>2]=0;c[b+936>>2]=0;a[b+1024>>0]=1;c[b+1020>>2]=0;c[b+1012>>2]=0;c[b+1016>>2]=0;c[b+988>>2]=0;c[b+992>>2]=0;c[b+996>>2]=-1;c[b+1e3>>2]=0;c[b+1004>>2]=0;a[b+1064>>0]=1;c[b+1060>>2]=0;c[b+1052>>2]=0;c[b+1056>>2]=0;c[b+1028>>2]=0;c[b+1032>>2]=0;c[b+1036>>2]=-1;c[b+1040>>2]=0;c[b+1044>>2]=0;a[b+1104>>0]=1;c[b+1100>>2]=0;c[b+1092>>2]=0;c[b+1096>>2]=0;c[b+1068>>2]=0;c[b+1072>>2]=0;c[b+1076>>2]=-1;c[b+1080>>2]=0;c[b+1084>>2]=0;a[b+1124>>0]=1;c[b+1120>>2]=0;c[b+1112>>2]=0;c[b+1116>>2]=0;a[b+1144>>0]=1;c[b+1140>>2]=0;c[b+1132>>2]=0;c[b+1136>>2]=0;a[b+1248>>0]=1;c[b+1244>>2]=0;c[b+1236>>2]=0;c[b+1240>>2]=0;c[b+252>>2]=8;c[b+348>>2]=0;g[b+352>>2]=1.0;c[b+356>>2]=0;c[b+356+4>>2]=0;c[b+356+8>>2]=0;c[b+356+12>>2]=0;c[b+356+16>>2]=0;g[b+376>>2]=.20000000298023224;g[b+380>>2]=0.0;g[b+384>>2]=1.0;g[b+388>>2]=.10000000149011612;g[b+392>>2]=1.0;g[b+396>>2]=.699999988079071;g[b+400>>2]=.10000000149011612;g[b+404>>2]=1.0;g[b+408>>2]=.5;g[b+412>>2]=.5;g[b+416>>2]=.5;g[b+420>>2]=.5;g[b+424>>2]=1.0;g[b+428>>2]=1.0;c[b+432>>2]=0;c[b+436>>2]=1;c[b+440>>2]=0;c[b+444>>2]=4;c[b+448>>2]=1;a[b+532>>0]=0;a[b+533>>0]=0;g[b+536>>2]=0.0;c[b+580>>2]=0;c[b+580+4>>2]=0;c[b+580+8>>2]=0;c[b+580+12>>2]=0;c[b+596>>2]=1065353216;c[b+600>>2]=0;c[b+600+4>>2]=0;c[b+600+8>>2]=0;c[b+600+12>>2]=0;c[b+616>>2]=1065353216;c[b+620>>2]=0;c[b+620+4>>2]=0;c[b+620+8>>2]=0;c[b+620+12>>2]=0;c[b+636>>2]=1065353216;g[b+640>>2]=0.0;c[b+644>>2]=1065353216;c[b+648>>2]=0;c[b+648+4>>2]=0;c[b+648+8>>2]=0;c[b+648+12>>2]=0;c[b+664>>2]=1065353216;c[b+668>>2]=0;c[b+668+4>>2]=0;c[b+668+8>>2]=0;c[b+668+12>>2]=0;c[b+684>>2]=1065353216;g[b+688>>2]=0.0;c[b+740>>2]=0;g[b+948>>2]=0.0;a[b+984>>0]=1;c[b+952>>2]=0;c[b+952+4>>2]=0;c[b+952+8>>2]=0;c[b+952+12>>2]=0;c[b+952+16>>2]=0;c[b+952+20>>2]=0;c[b+952+24>>2]=0;c[b+952+28>>2]=0;c[b+4>>2]=1065353216;c[b+8>>2]=0;c[b+8+4>>2]=0;c[b+8+8>>2]=0;c[b+8+12>>2]=0;c[b+24>>2]=1065353216;c[b+28>>2]=0;c[b+28+4>>2]=0;c[b+28+8>>2]=0;c[b+28+12>>2]=0;c[b+44>>2]=1065353216;c[b+48>>2]=0;c[b+48+4>>2]=0;c[b+48+8>>2]=0;c[b+48+12>>2]=0;c[b+48+16>>2]=0;d=c[b+464>>2]|0;if(d|0){if(a[b+468>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+464>>2]=0}a[b+468>>0]=1;c[b+464>>2]=0;c[b+456>>2]=0;c[b+460>>2]=0;d=c[b+484>>2]|0;if(d|0){if(a[b+488>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+484>>2]=0}a[b+488>>0]=1;c[b+484>>2]=0;c[b+476>>2]=0;c[b+480>>2]=0;d=c[b+504>>2]|0;do if(d)if(a[b+508>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);d=c[b+476>>2]|0;i=c[b+480>>2]|0;c[b+504>>2]=0;a[b+508>>0]=1;c[b+504>>2]=0;c[b+496>>2]=0;c[b+500>>2]=0;if((d|0)==(i|0)){w=14;break}else break}else{c[b+504>>2]=0;w=13;break}else w=13;while(0);if((w|0)==13){a[b+508>>0]=1;c[b+504>>2]=0;c[b+496>>2]=0;c[b+500>>2]=0;i=0;w=14}if((w|0)==14){n=i|0?i<<1:1;if((i|0)<(n|0)){if(!n)d=0;else{c[6995]=(c[6995]|0)+1;d=sc((n<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}i=c[b+476>>2]|0}k=c[b+484>>2]|0;if((i|0)<=0){if(k)w=22}else{j=0;do{c[d+(j<<2)>>2]=c[k+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0));w=22}if((w|0)==22){if(a[b+488>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);i=c[b+476>>2]|0}c[b+484>>2]=0}a[b+488>>0]=1;c[b+484>>2]=d;c[b+480>>2]=n;d=i;i=n}else d=i}k=c[b+484>>2]|0;c[k+(d<<2)>>2]=1;d=d+1|0;c[b+476>>2]=d;if((d|0)==(i|0)){n=i|0?i<<1:1;if((i|0)<(n|0)){if(!n)d=0;else{c[6995]=(c[6995]|0)+1;d=sc((n<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}i=c[b+476>>2]|0;k=c[b+484>>2]|0}if((i|0)<=0){if(k)w=35}else{j=0;do{c[d+(j<<2)>>2]=c[k+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0));w=35}if((w|0)==35){if(a[b+488>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);i=c[b+476>>2]|0}c[b+484>>2]=0}a[b+488>>0]=1;c[b+484>>2]=d;c[b+480>>2]=n;o=d;j=i;i=n}else{o=k;j=i;d=k}}else{o=k;j=d;d=k}c[o+(j<<2)>>2]=2;j=j+1|0;c[b+476>>2]=j;if((j|0)==(i|0)){n=i|0?i<<1:1;if((i|0)<(n|0)){if(!n){d=0;k=o}else{c[6995]=(c[6995]|0)+1;d=sc((n<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}i=c[b+476>>2]|0;k=c[b+484>>2]|0}if((i|0)<=0){if(k)w=48}else{j=0;do{c[d+(j<<2)>>2]=c[k+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0));w=48}if((w|0)==48){if(a[b+488>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);i=c[b+476>>2]|0}c[b+484>>2]=0}a[b+488>>0]=1;c[b+484>>2]=d;c[b+480>>2]=n;k=d;j=i;i=n}else{k=o;j=i}}else k=o;c[k+(j<<2)>>2]=3;j=j+1|0;c[b+476>>2]=j;if((j|0)==(i|0)){n=i|0?i<<1:1;if((i|0)<(n|0)){if(!n)d=0;else{c[6995]=(c[6995]|0)+1;d=sc((n<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}i=c[b+476>>2]|0;k=c[b+484>>2]|0}if((i|0)<=0){if(k)w=61}else{j=0;do{c[d+(j<<2)>>2]=c[k+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0));w=61}if((w|0)==61){if(a[b+488>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);i=c[b+476>>2]|0}c[b+484>>2]=0}a[b+488>>0]=1;c[b+484>>2]=d;c[b+480>>2]=n}}else i=j;c[d+(i<<2)>>2]=0;c[b+476>>2]=i+1;c[6995]=(c[6995]|0)+1;d=sc(43)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}c[d+8>>2]=0;c[d+12>>2]=-1;c[d>>2]=3496;c[d+4>>2]=32;c[d+20>>2]=b;c[b+192>>2]=d;g[d+16>>2]=.25;c[b+1148>>2]=1065353216;c[b+1152>>2]=0;c[b+1152+4>>2]=0;c[b+1152+8>>2]=0;c[b+1152+12>>2]=0;c[b+1168>>2]=1065353216;c[b+1172>>2]=0;c[b+1172+4>>2]=0;c[b+1172+8>>2]=0;c[b+1172+12>>2]=0;c[b+1188>>2]=1065353216;x=b+1192|0;y=x+36|0;do{c[x>>2]=0;x=x+4|0}while((x|0)<(y|0));g[b+1228>>2]=1.0;z=hh(b)|0;g[z+4>>2]=1.0;g[z+8>>2]=1.0;g[z+12>>2]=1.0;c[z+16>>2]=1;x=c[b+192>>2]|0;A=+nb[c[(c[x>>2]|0)+48>>2]&15](x);x=B;y=x+100|0;do{c[x>>2]=0;x=x+4|0}while((x|0)<(y|0));n=c[b+772>>2]|0;if((n|0)<(e|0)){if((c[b+776>>2]|0)<(e|0)){if(!e){d=0;j=n}else{c[6995]=(c[6995]|0)+1;d=sc((e*104|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}j=c[b+772>>2]|0}if((j|0)>0){i=0;do{x=d+(i*104|0)|0;k=(c[b+780>>2]|0)+(i*104|0)|0;y=x+104|0;do{c[x>>2]=c[k>>2];x=x+4|0;k=k+4|0}while((x|0)<(y|0));i=i+1|0}while((i|0)!=(j|0))}i=c[b+780>>2]|0;if(i|0){if(a[b+784>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[b+780>>2]=0}a[b+784>>0]=1;c[b+780>>2]=d;c[b+776>>2]=e;d=n}else d=n;do{x=c[b+780>>2]|0;c[x+(d*104|0)>>2]=0;x=x+(d*104|0)+4|0;k=B;y=x+100|0;do{c[x>>2]=c[k>>2];x=x+4|0;k=k+4|0}while((x|0)<(y|0));d=d+1|0}while((d|0)!=(e|0))}c[b+772>>2]=e;if((e|0)>0){d=f;i=h;k=0;while(1){o=c[b+780>>2]|0;w=o+(k*104|0)|0;x=w;y=x+104|0;do{c[x>>2]=0;x=x+4|0}while((x|0)<(y|0));if(!d){n=0;m=0.0;p=0.0;q=0.0;r=0.0}else{n=d+16|0;m=+g[d+12>>2];p=+g[d>>2];q=+g[d+4>>2];r=+g[d+8>>2]}f=o+(k*104|0)+8|0;g[f>>2]=p;g[o+(k*104|0)+12>>2]=q;g[o+(k*104|0)+16>>2]=r;g[o+(k*104|0)+20>>2]=m;h=o+(k*104|0)+24|0;c[h>>2]=c[f>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];c[h+12>>2]=c[f+12>>2];if(!i){j=0;m=1.0}else{j=i+4|0;m=+g[i>>2]}g[o+(k*104|0)+88>>2]=m>0.0?1.0/m:0.0;t=p-A;u=q-A;v=r-A;s=A+p;p=A+q;m=A+r;d=c[b+992>>2]|0;if(!d){c[6995]=(c[6995]|0)+1;d=sc(63)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}x=d;y=x+44|0;do{c[x>>2]=0;x=x+4|0}while((x|0)<(y|0))}else c[b+992>>2]=0;c[d+32>>2]=0;c[d+36>>2]=w;c[d+40>>2]=0;g[d>>2]=t;g[d+4>>2]=u;g[d+8>>2]=v;g[d+12>>2]=0.0;g[d+16>>2]=s;g[d+20>>2]=p;g[d+24>>2]=m;g[d+28>>2]=0.0;Pe(b+988|0,c[b+988>>2]|0,d);c[b+1e3>>2]=(c[b+1e3>>2]|0)+1;c[o+(k*104|0)+96>>2]=d;c[o+(k*104|0)+4>>2]=z;k=k+1|0;if((k|0)==(e|0))break;else{d=n;i=j}}}d=c[b+988>>2]|0;if(!d){c[b+952>>2]=0;c[b+952+4>>2]=0;c[b+952+8>>2]=0;c[b+952+12>>2]=0;c[b+952+16>>2]=0;c[b+952+20>>2]=0;c[b+952+24>>2]=0;c[b+952+28>>2]=0;l=B;return}e=c[b+192>>2]|0;u=+nb[c[(c[e>>2]|0)+48>>2]&15](e);A=+g[d+4>>2]-u;v=+g[d+8>>2]-u;g[b+952>>2]=+g[d>>2]-u;g[b+956>>2]=A;g[b+960>>2]=v;g[b+964>>2]=0.0;v=u+ +g[d+20>>2];A=u+ +g[d+24>>2];g[b+968>>2]=u+ +g[d+16>>2];g[b+972>>2]=v;g[b+976>>2]=A;g[b+980>>2]=0.0;d=c[b+188>>2]|0;if(!d){l=B;return}e=c[b+744>>2]|0;h=c[e+32>>2]|0;Zb[c[(c[h>>2]|0)+16>>2]&31](h,d,b+952|0,b+968|0,c[e+36>>2]|0);l=B;return}function Cc(d,f,h){d=d|0;f=f|0;h=h|0;var i=0,j=0,k=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0.0,u=0.0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0,B=0,C=0.0,D=0.0,E=0.0,F=0,G=0,H=0,I=0,J=0,K=0,L=0.0,M=0.0,N=0.0;K=l;l=l+96|0;H=c[d+56>>2]|0;if((h-f|0)==1){if(!(a[d+60>>0]|0)){q=(c[d+96>>2]|0)+(H<<6)|0;r=(c[d+76>>2]|0)+(f<<6)|0;s=q+64|0;do{c[q>>2]=c[r>>2];q=q+4|0;r=r+4|0}while((q|0)<(s|0))}else{I=(c[d+116>>2]|0)+(f<<4)|0;J=(c[d+136>>2]|0)+(H<<4)|0;c[J>>2]=c[I>>2];c[J+4>>2]=c[I+4>>2];c[J+8>>2]=c[I+8>>2];c[J+12>>2]=c[I+12>>2]}c[d+56>>2]=(c[d+56>>2]|0)+1;l=K;return}c[K+32>>2]=0;c[K+32+4>>2]=0;c[K+32+8>>2]=0;c[K+32+12>>2]=0;if((h|0)>(f|0)){m=(a[d+60>>0]|0)==0;if(m){j=c[d+76>>2]|0;i=f;k=0.0;n=0.0;o=0.0;do{k=k+(+g[j+(i<<6)+16>>2]+ +g[j+(i<<6)>>2])*.5;n=n+(+g[j+(i<<6)+20>>2]+ +g[j+(i<<6)+4>>2])*.5;o=o+(+g[j+(i<<6)+24>>2]+ +g[j+(i<<6)+8>>2])*.5;i=i+1|0}while((i|0)!=(h|0))}else{j=c[d+116>>2]|0;p=+g[d+36>>2];t=+g[d+40>>2];u=+g[d+44>>2];x=+g[d+4>>2];y=+g[d+8>>2];z=+g[d+12>>2];i=f;k=0.0;n=0.0;o=0.0;do{k=k+(+(e[j+(i<<4)+6>>1]|0)/p+x+(+(e[j+(i<<4)>>1]|0)/p+x))*.5;n=n+(+(e[j+(i<<4)+8>>1]|0)/t+y+(+(e[j+(i<<4)+2>>1]|0)/t+y))*.5;o=o+(+(e[j+(i<<4)+10>>1]|0)/u+z+(+(e[j+(i<<4)+4>>1]|0)/u+z))*.5;i=i+1|0}while((i|0)!=(h|0))}C=1.0/+(h-f|0);E=C*k;D=C*n;C=C*o;if(m){j=c[d+76>>2]|0;i=f;o=0.0;n=0.0;k=0.0;do{x=(+g[j+(i<<6)+16>>2]+ +g[j+(i<<6)>>2])*.5-E;y=(+g[j+(i<<6)+20>>2]+ +g[j+(i<<6)+4>>2])*.5-D;z=(+g[j+(i<<6)+24>>2]+ +g[j+(i<<6)+8>>2])*.5-C;o=o+x*x;n=y*y+n;k=z*z+k;i=i+1|0}while((i|0)!=(h|0))}else{j=c[d+116>>2]|0;p=+g[d+36>>2];t=+g[d+40>>2];u=+g[d+44>>2];x=+g[d+4>>2];y=+g[d+8>>2];z=+g[d+12>>2];i=f;o=0.0;n=0.0;k=0.0;do{N=(+(e[j+(i<<4)+6>>1]|0)/p+x+(+(e[j+(i<<4)>>1]|0)/p+x))*.5-E;M=(+(e[j+(i<<4)+8>>1]|0)/t+y+(+(e[j+(i<<4)+2>>1]|0)/t+y))*.5-D;L=(+(e[j+(i<<4)+10>>1]|0)/u+z+(+(e[j+(i<<4)+4>>1]|0)/u+z))*.5-C;o=o+N*N;n=M*M+n;k=L*L+k;i=i+1|0}while((i|0)!=(h|0))}g[K+32>>2]=o;g[K+32+4>>2]=n;g[K+32+8>>2]=k;i=K+32|0;p=+(h-f|0)}else{i=K+32|0;p=+(h-f|0);o=0.0;n=0.0;k=0.0}L=1.0/(p+-1.0);M=L*o;g[i>>2]=M;N=L*n;g[K+32+4>>2]=N;L=L*k;g[K+32+8>>2]=L;w=+g[K+32+((M>2]>2]=0;c[K+16+4>>2]=0;c[K+16+8>>2]=0;c[K+16+12>>2]=0;if((h|0)>(f|0)){if(!(a[d+60>>0]|0)){j=c[d+76>>2]|0;i=f;o=0.0;n=0.0;k=0.0;do{o=(+g[j+(i<<6)+16>>2]+ +g[j+(i<<6)>>2])*.5+o;n=(+g[j+(i<<6)+20>>2]+ +g[j+(i<<6)+4>>2])*.5+n;k=(+g[j+(i<<6)+24>>2]+ +g[j+(i<<6)+8>>2])*.5+k;i=i+1|0}while((i|0)!=(h|0))}else{j=c[d+116>>2]|0;p=+g[d+36>>2];t=+g[d+40>>2];u=+g[d+44>>2];x=+g[d+4>>2];y=+g[d+8>>2];z=+g[d+12>>2];i=f;o=0.0;n=0.0;k=0.0;do{o=(+(e[j+(i<<4)+6>>1]|0)/p+x+(+(e[j+(i<<4)>>1]|0)/p+x))*.5+o;n=(+(e[j+(i<<4)+8>>1]|0)/t+y+(+(e[j+(i<<4)+2>>1]|0)/t+y))*.5+n;k=(+(e[j+(i<<4)+10>>1]|0)/u+z+(+(e[j+(i<<4)+4>>1]|0)/u+z))*.5+k;i=i+1|0}while((i|0)!=(h|0))}g[K+16>>2]=o;g[K+16+4>>2]=n;g[K+16+8>>2]=k;i=K+16|0}else{i=K+16|0;o=0.0;n=0.0;k=0.0}g[i>>2]=1.0/+(h-f|0)*o;g[K+16+4>>2]=1.0/+(h-f|0)*n;g[K+16+8>>2]=1.0/+(h-f|0)*k;x=+g[K+16+(w<<2)>>2];if((h|0)>(f|0)){i=f;v=f;do{j=(a[d+60>>0]|0)==0;if(j){G=c[d+76>>2]|0;k=+g[G+(v<<6)>>2];n=+g[G+(v<<6)+16>>2];o=+g[G+(v<<6)+4>>2];p=+g[G+(v<<6)+20>>2];t=+g[G+(v<<6)+8>>2];u=+g[G+(v<<6)+24>>2]}else{G=c[d+116>>2]|0;o=+g[d+36>>2];t=+g[d+40>>2];N=+g[d+44>>2];n=+g[d+4>>2];p=+g[d+8>>2];u=+g[d+12>>2];k=+(e[G+(v<<4)>>1]|0)/o+n;n=+(e[G+(v<<4)+6>>1]|0)/o+n;o=+(e[G+(v<<4)+2>>1]|0)/t+p;p=+(e[G+(v<<4)+8>>1]|0)/t+p;t=+(e[G+(v<<4)+4>>1]|0)/N+u;u=+(e[G+(v<<4)+10>>1]|0)/N+u}g[K>>2]=(n+k)*.5;g[K+4>>2]=(p+o)*.5;g[K+8>>2]=(u+t)*.5;g[K+12>>2]=0.0;if(+g[K+(w<<2)>>2]>x){if(j){j=c[d+76>>2]|0;m=j+(v<<6)|0;q=K+32|0;r=m;s=q+64|0;do{c[q>>2]=c[r>>2];q=q+4|0;r=r+4|0}while((q|0)<(s|0));q=m;r=j+(i<<6)|0;s=q+64|0;do{c[q>>2]=c[r>>2];q=q+4|0;r=r+4|0}while((q|0)<(s|0));q=(c[d+76>>2]|0)+(i<<6)|0;r=K+32|0;s=q+64|0;do{c[q>>2]=c[r>>2];q=q+4|0;r=r+4|0}while((q|0)<(s|0))}else{F=c[d+116>>2]|0;G=F+(v<<4)|0;c[K+32>>2]=c[G>>2];c[K+32+4>>2]=c[G+4>>2];c[K+32+8>>2]=c[G+8>>2];c[K+32+12>>2]=c[G+12>>2];F=F+(i<<4)|0;c[G>>2]=c[F>>2];c[G+4>>2]=c[F+4>>2];c[G+8>>2]=c[F+8>>2];c[G+12>>2]=c[F+12>>2];G=(c[d+116>>2]|0)+(i<<4)|0;c[G>>2]=c[K+32>>2];c[G+4>>2]=c[K+32+4>>2];c[G+8>>2]=c[K+32+8>>2];c[G+12>>2]=c[K+32+12>>2]}i=i+1|0}v=v+1|0}while((v|0)!=(h|0))}else i=f;if(!((i|0)>(((h-f|0)/3|0)+f|0)?(i|0)<(h+-1-((h-f|0)/3|0)|0):0))i=(h-f>>1)+f|0;G=c[d+56>>2]|0;if(!(a[d+60>>0]|0)){F=(c[d+96>>2]|0)+(G<<6)|0;c[F>>2]=c[d+20>>2];c[F+4>>2]=c[d+20+4>>2];c[F+8>>2]=c[d+20+8>>2];c[F+12>>2]=c[d+20+12>>2]}else{F=c[d+136>>2]|0;M=(+g[d+24>>2]-+g[d+8>>2])*+g[d+40>>2];N=(+g[d+28>>2]-+g[d+12>>2])*+g[d+44>>2];b[F+(G<<4)>>1]=~~((+g[d+20>>2]-+g[d+4>>2])*+g[d+36>>2])&65535&-2;b[F+(G<<4)+2>>1]=~~M&65535&-2;b[F+(G<<4)+4>>1]=~~N&65535&-2}j=c[d+56>>2]|0;if(!(a[d+60>>0]|0)){F=(c[d+96>>2]|0)+(j<<6)+16|0;c[F>>2]=c[d+4>>2];c[F+4>>2]=c[d+4+4>>2];c[F+8>>2]=c[d+4+8>>2];c[F+12>>2]=c[d+4+12>>2]}else{F=c[d+136>>2]|0;L=+g[d+4>>2];M=+g[d+8>>2];N=+g[d+12>>2];M=(M-M)*+g[d+40>>2];N=(N-N)*+g[d+44>>2];b[F+(j<<4)+6>>1]=~~((L-L)*+g[d+36>>2]+1.0)&65535|1;b[F+(j<<4)+8>>1]=~~(M+1.0)&65535|1;b[F+(j<<4)+10>>1]=~~(N+1.0)&65535|1}F=c[d+56>>2]|0;if((h|0)>(f|0)){B=a[d+60>>0]|0;A=f;do{if(!(B<<24>>24)){j=c[d+76>>2]|0;n=+g[j+(A<<6)>>2];u=+g[j+(A<<6)+4>>2];y=+g[j+(A<<6)+8>>2];p=+g[j+(A<<6)+12>>2];k=+g[j+(A<<6)+16>>2];x=+g[j+(A<<6)+20>>2];o=+g[j+(A<<6)+24>>2];t=+g[j+(A<<6)+28>>2];j=c[d+96>>2]|0;if(n<+g[j+(F<<6)>>2])g[j+(F<<6)>>2]=n;if(u<+g[j+(F<<6)+4>>2])g[j+(F<<6)+4>>2]=u;if(y<+g[j+(F<<6)+8>>2])g[j+(F<<6)+8>>2]=y;if(p<+g[j+(F<<6)+12>>2])g[j+(F<<6)+12>>2]=p;if(+g[j+(F<<6)+16>>2]>2]=k;if(+g[j+(F<<6)+20>>2]>2]=x;if(+g[j+(F<<6)+24>>2]>2]=o;if(+g[j+(F<<6)+28>>2]>2]=t}else{v=c[d+116>>2]|0;p=+g[d+36>>2];y=+g[d+40>>2];E=+g[d+44>>2];t=+g[d+4>>2];z=+g[d+8>>2];L=+g[d+12>>2];u=+g[d+4>>2];C=+g[d+8>>2];M=+g[d+12>>2];x=+g[d+36>>2];D=+g[d+40>>2];N=+g[d+44>>2];j=~~((+(e[v+(A<<4)>>1]|0)/p+t-u)*x)&65535&-2;m=~~((+(e[v+(A<<4)+2>>1]|0)/y+z-C)*D)&65535&-2;q=~~((+(e[v+(A<<4)+4>>1]|0)/E+L-M)*N)&65535&-2;r=~~((+(e[v+(A<<4)+6>>1]|0)/p+t-u)*x+1.0)&65535|1;s=~~((+(e[v+(A<<4)+8>>1]|0)/y+z-C)*D+1.0)&65535|1;v=~~((+(e[v+(A<<4)+10>>1]|0)/E+L-M)*N+1.0)&65535|1;w=c[d+136>>2]|0;if((e[w+(F<<4)>>1]|0)>(j&65535))b[w+(F<<4)>>1]=j;if((e[w+(F<<4)+6>>1]|0)<(r&65535))b[w+(F<<4)+6>>1]=r;if((e[w+(F<<4)+2>>1]|0)>(m&65535))b[w+(F<<4)+2>>1]=m;if((e[w+(F<<4)+8>>1]|0)<(s&65535))b[w+(F<<4)+8>>1]=s;if((e[w+(F<<4)+4>>1]|0)>(q&65535))b[w+(F<<4)+4>>1]=q;if((e[w+(F<<4)+10>>1]|0)<(v&65535))b[w+(F<<4)+10>>1]=v}A=A+1|0}while((A|0)!=(h|0))}c[d+56>>2]=F+1;Cc(d,f,i);A=c[d+56>>2]|0;Cc(d,i,h);w=(c[d+56>>2]|0)-H|0;i=a[d+60>>0]|0;if(i<<24>>24!=0&(w<<4|0)>2048){s=c[d+136>>2]|0;q=c[s+(F+1<<4)+12>>2]|0;q=(q|0)>-1?1:0-q|0;v=c[s+(A<<4)+12>>2]|0;v=(v|0)>-1?1:0-v|0;if((q<<4|0)<2049){r=c[d+152>>2]|0;if((r|0)==(c[d+156>>2]|0)?(I=r|0?r<<1:1,(r|0)<(I|0)):0){if(!I){i=0;m=r}else{c[6995]=(c[6995]|0)+1;i=sc(I<<5|19)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}m=c[d+152>>2]|0}if((m|0)>0){j=0;do{H=i+(j<<5)|0;h=(c[d+160>>2]|0)+(j<<5)|0;c[H>>2]=c[h>>2];c[H+4>>2]=c[h+4>>2];c[H+8>>2]=c[h+8>>2];c[H+12>>2]=c[h+12>>2];c[H+16>>2]=c[h+16>>2];c[H+20>>2]=c[h+20>>2];c[H+24>>2]=c[h+24>>2];c[H+28>>2]=c[h+28>>2];j=j+1|0}while((j|0)!=(m|0))}j=c[d+160>>2]|0;if(j|0){if(a[d+164>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[d+160>>2]=0}a[d+164>>0]=1;c[d+160>>2]=i;c[d+156>>2]=I;i=c[d+152>>2]|0}else i=r;c[d+152>>2]=i+1;I=(c[d+160>>2]|0)+(r<<5)|0;c[I>>2]=c[K+32>>2];c[I+4>>2]=c[K+32+4>>2];c[I+8>>2]=c[K+32+8>>2];c[I+12>>2]=c[K+32+12>>2];c[I+16>>2]=c[K+32+16>>2];c[I+20>>2]=c[K+32+20>>2];c[I+24>>2]=c[K+32+24>>2];c[I+28>>2]=c[K+32+28>>2];I=c[d+160>>2]|0;b[I+(r<<5)>>1]=b[s+(F+1<<4)>>1]|0;b[I+(r<<5)+2>>1]=b[s+(F+1<<4)+2>>1]|0;b[I+(r<<5)+4>>1]=b[s+(F+1<<4)+4>>1]|0;b[I+(r<<5)+6>>1]=b[s+(F+1<<4)+6>>1]|0;b[I+(r<<5)+8>>1]=b[s+(F+1<<4)+8>>1]|0;b[I+(r<<5)+10>>1]=b[s+(F+1<<4)+10>>1]|0;c[I+(r<<5)+12>>2]=F+1;c[I+(r<<5)+16>>2]=q}if((v<<4|0)<2049){q=c[d+152>>2]|0;if((q|0)==(c[d+156>>2]|0)?(J=q|0?q<<1:1,(q|0)<(J|0)):0){if(!J){i=0;m=q}else{c[6995]=(c[6995]|0)+1;i=sc(J<<5|19)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}m=c[d+152>>2]|0}if((m|0)>0){j=0;do{I=i+(j<<5)|0;H=(c[d+160>>2]|0)+(j<<5)|0;c[I>>2]=c[H>>2];c[I+4>>2]=c[H+4>>2];c[I+8>>2]=c[H+8>>2];c[I+12>>2]=c[H+12>>2];c[I+16>>2]=c[H+16>>2];c[I+20>>2]=c[H+20>>2];c[I+24>>2]=c[H+24>>2];c[I+28>>2]=c[H+28>>2];j=j+1|0}while((j|0)!=(m|0))}j=c[d+160>>2]|0;if(j|0){if(a[d+164>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[d+160>>2]=0}a[d+164>>0]=1;c[d+160>>2]=i;c[d+156>>2]=J;i=c[d+152>>2]|0}else i=q;c[d+152>>2]=i+1;i=(c[d+160>>2]|0)+(q<<5)|0;c[i>>2]=c[K+32>>2];c[i+4>>2]=c[K+32+4>>2];c[i+8>>2]=c[K+32+8>>2];c[i+12>>2]=c[K+32+12>>2];c[i+16>>2]=c[K+32+16>>2];c[i+20>>2]=c[K+32+20>>2];c[i+24>>2]=c[K+32+24>>2];c[i+28>>2]=c[K+32+28>>2];i=c[d+160>>2]|0;b[i+(q<<5)>>1]=b[s+(A<<4)>>1]|0;b[i+(q<<5)+2>>1]=b[s+(A<<4)+2>>1]|0;b[i+(q<<5)+4>>1]=b[s+(A<<4)+4>>1]|0;b[i+(q<<5)+6>>1]=b[s+(A<<4)+6>>1]|0;b[i+(q<<5)+8>>1]=b[s+(A<<4)+8>>1]|0;b[i+(q<<5)+10>>1]=b[s+(A<<4)+10>>1]|0;c[i+(q<<5)+12>>2]=A;c[i+(q<<5)+16>>2]=v;i=d+152|0}else i=d+152|0;c[d+168>>2]=c[i>>2];i=a[d+60>>0]|0}if(!(i<<24>>24)){c[(c[d+96>>2]|0)+(G<<6)+32>>2]=w;l=K;return}else{c[(c[d+136>>2]|0)+(G<<4)+12>>2]=0-w;l=K;return}}function Dc(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0,B=0.0,C=0,E=0,F=0,G=0,H=0,I=0,J=0.0,K=0.0,L=0,M=0.0,N=0,O=0.0,P=0,Q=0.0,R=0,S=0.0,T=0;T=l;l=l+208|0;g[b+56>>2]=0.0;H=T+192+4|0;I=T+192+8|0;c[T+192>>2]=0;c[T+192+4>>2]=0;c[T+192+8>>2]=0;c[T+192+12>>2]=0;c[T+128>>2]=c[d>>2];c[T+128+4>>2]=c[d+4>>2];c[T+128+8>>2]=c[d+8>>2];c[T+128+12>>2]=c[d+12>>2];c[T+128+16>>2]=c[d+16>>2];c[T+128+16+4>>2]=c[d+16+4>>2];c[T+128+16+8>>2]=c[d+16+8>>2];c[T+128+16+12>>2]=c[d+16+12>>2];c[T+128+32>>2]=c[d+32>>2];c[T+128+32+4>>2]=c[d+32+4>>2];c[T+128+32+8>>2]=c[d+32+8>>2];c[T+128+32+12>>2]=c[d+32+12>>2];C=T+128+48|0;c[C>>2]=c[d+48>>2];c[C+4>>2]=c[d+48+4>>2];c[C+8>>2]=c[d+48+8>>2];c[C+12>>2]=c[d+48+12>>2];c[T+64>>2]=c[d+64>>2];c[T+64+4>>2]=c[d+64+4>>2];c[T+64+8>>2]=c[d+64+8>>2];c[T+64+12>>2]=c[d+64+12>>2];c[T+64+16>>2]=c[d+80>>2];c[T+64+16+4>>2]=c[d+80+4>>2];c[T+64+16+8>>2]=c[d+80+8>>2];c[T+64+16+12>>2]=c[d+80+12>>2];c[T+64+32>>2]=c[d+96>>2];c[T+64+32+4>>2]=c[d+96+4>>2];c[T+64+32+8>>2]=c[d+96+8>>2];c[T+64+32+12>>2]=c[d+96+12>>2];E=T+64+48|0;c[E>>2]=c[d+112>>2];c[E+4>>2]=c[d+112+4>>2];c[E+8>>2]=c[d+112+8>>2];c[E+12>>2]=c[d+112+12>>2];J=+g[C>>2];K=+g[E>>2];L=T+128+52|0;M=+g[L>>2];N=T+64+52|0;O=+g[N>>2];P=T+128+56|0;Q=+g[P>>2];R=T+64+56|0;S=+g[R>>2];g[C>>2]=J-(J+K)*.5;g[L>>2]=M-(M+O)*.5;g[P>>2]=Q-(Q+S)*.5;g[E>>2]=K-(J+K)*.5;g[N>>2]=O-(M+O)*.5;g[R>>2]=S-(Q+S)*.5;if(((c[(c[b+28>>2]|0)+4>>2]|0)+-17|0)>>>0<2)C=((c[(c[b+32>>2]|0)+4>>2]|0)+-17|0)>>>0<2;else C=0;v=+g[b+44>>2];u=+g[b+48>>2];c[6413]=(c[6413]|0)+1;E=a[b+52>>0]|0;c[b+64>>2]=0;c[b+4>>2]=0;c[b+8>>2]=1065353216;c[b+12>>2]=0;g[b+16>>2]=0.0;c[b+68>>2]=0;c[b+60>>2]=-1;n=c[b+24>>2]|0;a[n+312>>0]=0;c[n>>2]=0;a[n+356>>0]=1;c[n+292>>2]=1566444395;c[n+296>>2]=1566444395;c[n+300>>2]=1566444395;g[n+304>>2]=0.0;c[n+336>>2]=0;c[n+336+4>>2]=0;c[n+336+8>>2]=0;c[n+336+12>>2]=0;a[n+336+16>>0]=0;a[n+332>>0]=a[n+332>>0]&-16;n=0;p=999999984306749440.0;do{q=+g[b+4>>2];o=+g[b+8>>2];j=+g[b+12>>2];k=+g[d+4>>2]*-q+ +g[d+20>>2]*-o+ +g[d+36>>2]*-j;m=+g[d+8>>2]*-q+ +g[d+24>>2]*-o+ +g[d+40>>2]*-j;g[T+48>>2]=+g[d>>2]*-q+ +g[d+16>>2]*-o+ +g[d+32>>2]*-j;g[T+48+4>>2]=k;g[T+48+8>>2]=m;g[T+48+12>>2]=0.0;m=q*+g[d+68>>2]+o*+g[d+84>>2]+j*+g[d+100>>2];k=q*+g[d+72>>2]+o*+g[d+88>>2]+j*+g[d+104>>2];g[T+32>>2]=+g[d+64>>2]*q+ +g[d+80>>2]*o+ +g[d+96>>2]*j;g[T+32+4>>2]=m;g[T+32+8>>2]=k;g[T+32+12>>2]=0.0;Nd(T+16|0,c[b+28>>2]|0,T+48|0);Nd(T,c[b+32>>2]|0,T+32|0);k=+g[T+16>>2];m=+g[T+16+4>>2];j=+g[T+16+8>>2];o=k*+g[T+128>>2]+m*+g[T+128+4>>2]+j*+g[T+128+8>>2]+ +g[T+128+48>>2];q=k*+g[T+128+16>>2]+m*+g[T+128+20>>2]+j*+g[T+128+24>>2]+ +g[L>>2];j=k*+g[T+128+32>>2]+m*+g[T+128+36>>2]+j*+g[T+128+40>>2]+ +g[P>>2];m=+g[T>>2];k=+g[T+4>>2];t=+g[T+8>>2];r=m*+g[T+64>>2]+k*+g[T+64+4>>2]+t*+g[T+64+8>>2]+ +g[T+64+48>>2];s=m*+g[T+64+16>>2]+k*+g[T+64+20>>2]+t*+g[T+64+24>>2]+ +g[N>>2];t=m*+g[T+64+32>>2]+k*+g[T+64+36>>2]+t*+g[T+64+40>>2]+ +g[R>>2];k=C?0.0:t;m=C?0.0:j;t=(C?0.0:j)-(C?0.0:t);j=+g[b+4>>2]*(o-r)+ +g[b+8>>2]*(q-s)+ +g[b+12>>2]*t;if(j>0.0?j*j>p*+g[d+128>>2]:0){c[b+68>>2]=10;n=1;h=0}else G=7;do if((G|0)==7){G=0;z=c[b+24>>2]|0;A=c[z>>2]|0;a:do if((A|0)>0){i=+g[z+308>>2];h=0;while(1){x=o-r-+g[z+4+(h<<4)>>2];y=q-s-+g[z+4+(h<<4)+4>>2];B=t-+g[z+4+(h<<4)+8>>2];h=h+1|0;if(x*x+y*y+B*B<=i){h=1;break a}if((h|0)>=(A|0)){h=0;break}}}else h=0;while(0);if((+g[z+304>>2]==0.0?t==+g[z+300>>2]:0)?q-s==+g[z+296>>2]:0){if(o-r==+g[z+292>>2]|h)G=16}else G=15;if((G|0)==15?(G=0,h):0)G=16;if((G|0)==16){G=0;c[b+68>>2]=1;n=1;h=0;break}i=p-j;if(i<=p*9.999999974752427e-07){c[b+68>>2]=i<=0.0?2:11;n=1;h=0;break}g[z+292>>2]=o-r;g[z+296>>2]=q-s;g[z+300>>2]=t;g[z+304>>2]=0.0;a[z+356>>0]=1;g[z+4+(A<<4)>>2]=o-r;g[z+4+(A<<4)+4>>2]=q-s;g[z+4+(A<<4)+8>>2]=t;g[z+4+(A<<4)+12>>2]=0.0;h=c[z>>2]|0;g[z+84+(h<<4)>>2]=o;g[z+84+(h<<4)+4>>2]=q;g[z+84+(h<<4)+8>>2]=m;g[z+84+(h<<4)+12>>2]=0.0;h=c[z>>2]|0;g[z+164+(h<<4)>>2]=r;g[z+164+(h<<4)+4>>2]=s;g[z+164+(h<<4)+8>>2]=k;g[z+164+(h<<4)+12>>2]=0.0;c[z>>2]=(c[z>>2]|0)+1;h=c[b+24>>2]|0;A=wc(h)|0;i=+g[h+276>>2];j=+g[h+280>>2];k=+g[h+284>>2];h=c[h+288>>2]|0;if(!A){c[b+68>>2]=3;n=1;h=0;break}if(i*i+j*j+k*k<9.999999974752427e-07){g[b+4>>2]=i;g[b+8>>2]=j;g[b+12>>2]=k;c[b+16>>2]=h;c[b+68>>2]=6;n=1;h=0;break}if(p-(i*i+j*j+k*k)<=p*1.1920928955078125e-07){c[b+68>>2]=12;p=i*i+j*j+k*k;n=1;h=0;break}g[b+4>>2]=i;g[b+8>>2]=j;g[b+12>>2]=k;c[b+16>>2]=h;A=c[b+64>>2]|0;c[b+64>>2]=A+1;if((A|0)<=1e3)if((c[c[b+24>>2]>>2]|0)==4){c[b+68>>2]=13;p=i*i+j*j+k*k;h=0}else{p=i*i+j*j+k*k;h=1}else{p=i*i+j*j+k*k;h=0}}while(0)}while(h);w=E<<24>>24==0?u:0.0;v=(E<<24>>24==0?v:0.0)+w;if(n){E=c[b+24>>2]|0;wc(E)|0;i=+g[E+260>>2];o=+g[E+264>>2];m=+g[E+268>>2];c[T+192>>2]=c[b+4>>2];c[T+192+4>>2]=c[b+4+4>>2];c[T+192+8>>2]=c[b+4+8>>2];c[T+192+12>>2]=c[b+4+12>>2];j=+g[b+4>>2];k=+g[b+8>>2];q=+g[b+12>>2];if(j*j+k*k+q*q<9.999999974752427e-07)c[b+68>>2]=5;if(j*j+k*k+q*q>1.4210854715202004e-14){y=1.0/+D(+(j*j+k*k+q*q));g[T+192>>2]=y*+g[T+192>>2];g[H>>2]=y*+g[H>>2];g[I>>2]=y*+g[I>>2];B=w/+D(+p);p=1.0/y-v;n=1;h=1;i=B*j+i;o=B*k+o;m=B*q+m}else{p=0.0;n=0;h=2}c[b+60>>2]=h}else{p=0.0;n=0;i=0.0;o=0.0;m=0.0}if(((c[b+72>>2]|0)!=0?(c[b+20>>2]|0)!=0:0)?(c[b+68>>2]|0)!=0:0)h=v+p<1.0000000474974513e-03;else h=0;z=n^1;do if(h|z?(F=c[b+20>>2]|0,(F|0)!=0):0){c[6412]=(c[6412]|0)+1;c[b+4>>2]=0;c[b+4+4>>2]=0;c[b+4+8>>2]=0;c[b+4+12>>2]=0;if(!(Gb[c[(c[F>>2]|0)+8>>2]&3](F,c[b+24>>2]|0,c[b+28>>2]|0,c[b+32>>2]|0,T+128|0,T+64|0,b+4|0,T+48|0,T+32|0,f)|0)){k=+g[b+4>>2];r=+g[b+8>>2];t=+g[b+12>>2];if(!(k*k+r*r+t*t>0.0)){if(n){q=i;break}l=T;return}q=+g[T+32>>2];y=+g[T+48>>2]-q;s=+g[T+32+4>>2];B=+g[T+48+4>>2]-s;u=+g[T+32+8>>2];j=+g[T+48+8>>2]-u;j=+D(+(y*y+B*B+j*j))-v;if(j>2]=c[b+4>>2];c[T+192+4>>2]=c[b+4+4>>2];c[T+192+8>>2]=c[b+4+8>>2];c[T+192+12>>2]=c[b+4+12>>2];B=+g[T+192>>2];m=+g[H>>2];o=+g[I>>2];p=1.0/+D(+(B*B+m*m+o*o));g[T+192>>2]=B*p;g[H>>2]=m*p;g[I>>2]=o*p;c[b+60>>2]=6;p=j;q=w*k+q;o=w*r+s;m=w*t+u;break}c[b+60>>2]=5;if(n){q=i;break}l=T;return}q=+g[T+32>>2];k=+g[T+48>>2];y=+g[T+32+4>>2];r=+g[T+48+4>>2];B=+g[T+32+8>>2];s=+g[T+48+8>>2];if(!((q-k)*(q-k)+(y-r)*(y-r)+(B-s)*(B-s)<=1.4210854715202004e-14)){j=(q-k)*(q-k)+(y-r)*(y-r)+(B-s)*(B-s);u=q-k;v=B-s;w=0.0;x=y-r}else{u=+g[b+4>>2];x=+g[b+8>>2];v=+g[b+12>>2];j=u*u+x*x+v*v;w=+g[b+16>>2]}if(!(j>1.4210854715202004e-14)){c[b+60>>2]=9;if(n){q=i;break}l=T;return}t=1.0/+D(+j);j=-+D(+((k-q)*(k-q)+(r-y)*(r-y)+(s-B)*(s-B)));c[b+60>>2]=3;if(p>j|z){g[T+192>>2]=u*t;g[H>>2]=x*t;g[I>>2]=v*t;g[T+192+12>>2]=w;p=j;o=y;m=B;break}c[b+60>>2]=8;if(n)q=i;else{l=T;return}}else G=54;while(0);if((G|0)==54)if(n)q=i;else{l=T;return}if(!(p<0.0)?!(p*p<+g[d+128>>2]):0){l=T;return}c[b+4>>2]=c[T+192>>2];c[b+4+4>>2]=c[T+192+4>>2];c[b+4+8>>2]=c[T+192+8>>2];c[b+4+12>>2]=c[T+192+12>>2];g[b+56>>2]=p;u=+g[T+192>>2];v=+g[H>>2];B=+g[I>>2];j=u*+g[d+4>>2]+v*+g[d+20>>2]+B*+g[d+36>>2];i=u*+g[d+8>>2]+v*+g[d+24>>2]+B*+g[d+40>>2];g[T+48>>2]=+g[d>>2]*u+ +g[d+16>>2]*v+ +g[d+32>>2]*B;g[T+48+4>>2]=j;g[T+48+8>>2]=i;g[T+48+12>>2]=0.0;i=+g[d+68>>2]*-u+ +g[d+84>>2]*-v+ +g[d+100>>2]*-B;j=+g[d+72>>2]*-u+ +g[d+88>>2]*-v+ +g[d+104>>2]*-B;g[T+32>>2]=+g[d+64>>2]*-u+ +g[d+80>>2]*-v+ +g[d+96>>2]*-B;g[T+32+4>>2]=i;g[T+32+8>>2]=j;g[T+32+12>>2]=0.0;Nd(T+16|0,c[b+28>>2]|0,T+48|0);Nd(T,c[b+32>>2]|0,T+32|0);j=+g[T+16>>2];i=+g[T+16+4>>2];B=+g[T+16+8>>2];v=+g[T>>2];u=+g[T+4>>2];t=+g[T+8>>2];y=+g[T+192>>2];x=+g[H>>2];w=+g[I>>2];t=-((j*+g[T+128+16>>2]+i*+g[T+128+20>>2]+B*+g[T+128+24>>2]+ +g[L>>2]-(v*+g[T+64+16>>2]+u*+g[T+64+20>>2]+t*+g[T+64+24>>2]+ +g[N>>2]))*x)-(j*+g[T+128>>2]+i*+g[T+128+4>>2]+B*+g[T+128+8>>2]+ +g[T+128+48>>2]-(v*+g[T+64>>2]+u*+g[T+64+4>>2]+t*+g[T+64+8>>2]+ +g[T+64+48>>2]))*y-(j*+g[T+128+32>>2]+i*+g[T+128+36>>2]+B*+g[T+128+40>>2]+ +g[P>>2]-(v*+g[T+64+32>>2]+u*+g[T+64+36>>2]+t*+g[T+64+40>>2]+ +g[R>>2]))*w;u=+g[d+4>>2]*-y+ +g[d+20>>2]*-x+ +g[d+36>>2]*-w;v=+g[d+8>>2]*-y+ +g[d+24>>2]*-x+ +g[d+40>>2]*-w;g[T+48>>2]=+g[d>>2]*-y+ +g[d+16>>2]*-x+ +g[d+32>>2]*-w;g[T+48+4>>2]=u;g[T+48+8>>2]=v;g[T+48+12>>2]=0.0;v=y*+g[d+68>>2]+x*+g[d+84>>2]+w*+g[d+100>>2];u=y*+g[d+72>>2]+x*+g[d+88>>2]+w*+g[d+104>>2];g[T+32>>2]=+g[d+64>>2]*y+ +g[d+80>>2]*x+ +g[d+96>>2]*w;g[T+32+4>>2]=v;g[T+32+8>>2]=u;g[T+32+12>>2]=0.0;Nd(T+16|0,c[b+28>>2]|0,T+48|0);Nd(T,c[b+32>>2]|0,T+32|0);u=+g[T+16>>2];v=+g[T+16+4>>2];w=+g[T+16+8>>2];x=+g[T>>2];y=+g[T+4>>2];B=+g[T+8>>2];i=+g[T+192>>2];j=+g[H>>2];k=+g[I>>2];if(t>(u*+g[T+128>>2]+v*+g[T+128+4>>2]+w*+g[T+128+8>>2]+ +g[T+128+48>>2]-(x*+g[T+64>>2]+y*+g[T+64+4>>2]+B*+g[T+64+8>>2]+ +g[T+64+48>>2]))*i+(u*+g[T+128+16>>2]+v*+g[T+128+20>>2]+w*+g[T+128+24>>2]+ +g[L>>2]-(x*+g[T+64+16>>2]+y*+g[T+64+20>>2]+B*+g[T+64+24>>2]+ +g[N>>2]))*j+(u*+g[T+128+32>>2]+v*+g[T+128+36>>2]+w*+g[T+128+40>>2]+ +g[P>>2]-(x*+g[T+64+32>>2]+y*+g[T+64+36>>2]+B*+g[T+64+40>>2]+ +g[R>>2]))*k){c[b+60>>2]=10;g[T+192>>2]=-i;g[H>>2]=-j;g[I>>2]=-k}b=c[(c[e>>2]|0)+16>>2]|0;g[T+48>>2]=(J+K)*.5+q;g[T+48+4>>2]=(M+O)*.5+o;g[T+48+8>>2]=(Q+S)*.5+m;g[T+48+12>>2]=0.0;Tb[b&15](e,T+192|0,T+48|0,p);l=T;return}function Ec(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0,O=0;t=l;l=l+208|0;if(xb[c[(c[a>>2]|0)+20>>2]&127](a)|0?(r=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0,(xb[c[(c[r>>2]|0)+56>>2]&127](r)|0)&32768|0):0){r=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Pb[c[(c[r>>2]|0)+64>>2]&7](r,b,.10000000149011612)}f=c[d+4>>2]|0;switch(f|0){case 31:{f=c[d+20>>2]|0;if((f|0)<=0){l=t;return}do{s=f;f=f+-1|0;r=c[d+28>>2]|0;E=+g[r+(f*80|0)>>2];B=+g[r+(f*80|0)+4>>2];y=+g[r+(f*80|0)+8>>2];D=+g[r+(f*80|0)+16>>2];A=+g[r+(f*80|0)+20>>2];w=+g[r+(f*80|0)+24>>2];C=+g[r+(f*80|0)+32>>2];z=+g[r+(f*80|0)+36>>2];u=+g[r+(f*80|0)+40>>2];M=+g[r+(f*80|0)+48>>2];L=+g[r+(f*80|0)+52>>2];k=+g[r+(f*80|0)+56>>2];r=c[r+(f*80|0)+64>>2]|0;q=c[(c[a>>2]|0)+28>>2]|0;K=+g[b>>2];J=+g[b+4>>2];I=+g[b+8>>2];H=+g[b+16>>2];G=+g[b+20>>2];F=+g[b+24>>2];x=+g[b+32>>2];v=+g[b+36>>2];h=+g[b+40>>2];i=M*K+L*J+k*I+ +g[b+48>>2];j=M*H+L*G+k*F+ +g[b+52>>2];k=M*x+L*v+k*h+ +g[b+56>>2];g[t+144>>2]=E*K+D*J+C*I;g[t+144+4>>2]=B*K+A*J+z*I;g[t+144+8>>2]=y*K+w*J+u*I;g[t+144+12>>2]=0.0;g[t+144+16>>2]=E*H+D*G+C*F;g[t+144+20>>2]=B*H+A*G+z*F;g[t+144+24>>2]=y*H+w*G+u*F;g[t+144+28>>2]=0.0;g[t+144+32>>2]=E*x+D*v+C*h;g[t+144+36>>2]=B*x+A*v+z*h;g[t+144+40>>2]=y*x+w*v+u*h;g[t+144+44>>2]=0.0;g[t+144+48>>2]=i;g[t+144+52>>2]=j;g[t+144+56>>2]=k;g[t+144+60>>2]=0.0;Vb[q&127](a,t+144|0,r,e)}while((s|0)>1);l=t;return}case 0:{c[t+144>>2]=c[d+32>>2];c[t+144+4>>2]=c[d+32+4>>2];c[t+144+8>>2]=c[d+32+8>>2];c[t+144+12>>2]=c[d+32+12>>2];K=+nb[c[(c[d>>2]|0)+48>>2]&15](d);L=+nb[c[(c[d>>2]|0)+48>>2]&15](d);M=+nb[c[(c[d>>2]|0)+48>>2]&15](d);K=K+ +g[t+144>>2];g[t+144>>2]=K;L=L+ +g[t+144+4>>2];g[t+144+4>>2]=L;M=M+ +g[t+144+8>>2];g[t+144+8>>2]=M;d=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;a=c[(c[d>>2]|0)+80>>2]|0;g[t+112>>2]=-K;g[t+112+4>>2]=-L;g[t+112+8>>2]=-M;g[t+112+12>>2]=0.0;Zb[a&31](d,t+112|0,t+144|0,b,e);l=t;return}case 8:{M=+nb[c[(c[d>>2]|0)+48>>2]&15](d);d=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Nb[c[(c[d>>2]|0)+24>>2]&0](d,M,b,e);l=t;return}case 9:{f=c[d+96>>2]|0;if((f|0)<=0){l=t;return}do{s=f;f=f+-1|0;r=c[d+104>>2]|0;y=+g[r+(f<<4)>>2];z=+g[r+(f<<4)+4>>2];L=+g[r+(f<<4)+8>>2];r=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;q=c[(c[r>>2]|0)+24>>2]|0;M=+g[(c[d+124>>2]|0)+(f<<2)>>2];B=+g[b>>2];C=+g[b+4>>2];A=+g[b+8>>2];E=+g[b+16>>2];F=+g[b+20>>2];D=+g[b+24>>2];H=+g[b+32>>2];I=+g[b+36>>2];G=+g[b+40>>2];J=y*B+z*C+L*A+ +g[b+48>>2];K=y*E+z*F+L*D+ +g[b+52>>2];L=y*H+z*I+L*G+ +g[b+56>>2];g[t+144>>2]=B+C*0.0+A*0.0;g[t+144+4>>2]=B*0.0+C+A*0.0;g[t+144+8>>2]=A+(B*0.0+C*0.0);g[t+144+12>>2]=0.0;g[t+144+16>>2]=E+F*0.0+D*0.0;g[t+144+20>>2]=E*0.0+F+D*0.0;g[t+144+24>>2]=D+(E*0.0+F*0.0);g[t+144+28>>2]=0.0;g[t+144+32>>2]=H+I*0.0+G*0.0;g[t+144+36>>2]=H*0.0+I+G*0.0;g[t+144+40>>2]=G+(H*0.0+I*0.0);g[t+144+44>>2]=0.0;g[t+144+48>>2]=J;g[t+144+52>>2]=K;g[t+144+56>>2]=L;g[t+144+60>>2]=0.0;Nb[q&0](r,M,t+144|0,e)}while((s|0)>1);l=t;return}case 10:{s=c[d+56>>2]|0;L=+g[d+32+(((s+2|0)%3|0)<<2)>>2];M=+g[d+32+(s<<2)>>2];d=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Lb[c[(c[d>>2]|0)+84>>2]&0](d,L,M,s,b,e);l=t;return}case 11:{L=+g[d+60>>2];M=+g[d+64>>2];d=c[d+72>>2]|0;a=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Lb[c[(c[a>>2]|0)+92>>2]&0](a,L,M,d,b,e);l=t;return}case 13:{s=c[d+56>>2]|0;L=+nb[c[(c[d>>2]|0)+92>>2]&15](d);c[t+128>>2]=c[d+32>>2];c[t+128+4>>2]=c[d+32+4>>2];c[t+128+8>>2]=c[d+32+8>>2];c[t+128+12>>2]=c[d+32+12>>2];J=+nb[c[(c[d>>2]|0)+48>>2]&15](d);K=+nb[c[(c[d>>2]|0)+48>>2]&15](d);M=+nb[c[(c[d>>2]|0)+48>>2]&15](d);g[t+128>>2]=J+ +g[t+128>>2];g[t+128+4>>2]=K+ +g[t+128+4>>2];g[t+128+8>>2]=M+ +g[t+128+8>>2];M=+g[t+128+(s<<2)>>2];d=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Lb[c[(c[d>>2]|0)+88>>2]&0](d,L,M,s,b,e);l=t;return}case 28:{M=+g[d+68>>2];a=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Rb[c[(c[a>>2]|0)+96>>2]&0](a,d+52|0,M,b,e);l=t;return}default:{a:do if((f|0)<7){r=c[d+56>>2]|0;if(!r){if((xb[c[(c[d>>2]|0)+100>>2]&127](d)|0)<=0)break;f=0;while(1){Vb[c[(c[d>>2]|0)+104>>2]&127](d,f,t+144|0,t+112|0);K=+g[t+144>>2];y=+g[b>>2];I=+g[t+144+4>>2];z=+g[b+4>>2];G=+g[t+144+8>>2];A=+g[b+8>>2];C=+g[b+16>>2];D=+g[b+20>>2];E=+g[b+24>>2];H=+g[b+32>>2];J=+g[b+36>>2];L=+g[b+40>>2];B=+g[b+48>>2];F=+g[b+52>>2];M=+g[b+56>>2];g[t+16>>2]=K*y+I*z+G*A+B;g[t+16+4>>2]=K*C+I*D+G*E+F;g[t+16+8>>2]=K*H+I*J+G*L+M;g[t+16+12>>2]=0.0;G=+g[t+112>>2];I=+g[t+112+4>>2];K=+g[t+112+8>>2];g[t>>2]=G*y+I*z+K*A+B;g[t+4>>2]=G*C+I*D+K*E+F;g[t+8>>2]=G*H+I*J+K*L+M;g[t+12>>2]=0.0;s=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Vb[c[(c[s>>2]|0)+16>>2]&127](s,t+16|0,t,e);f=f+1|0;if((f|0)>=(xb[c[(c[d>>2]|0)+100>>2]&127](d)|0))break a}}if((c[r+28>>2]|0)>0){q=0;do{f=c[r+36>>2]|0;p=c[f+(q*36|0)+4>>2]|0;b:do if((p|0)!=0?(s=c[f+(q*36|0)+12>>2]|0,(p|0)>0):0){f=0;n=c[s+(p+-1<<2)>>2]|0;m=s;h=0.0;i=0.0;k=0.0;while(1){o=c[m+(f<<2)>>2]|0;m=c[r+16>>2]|0;h=h+ +g[m+(o<<4)>>2];i=i+ +g[m+(o<<4)+4>>2];k=k+ +g[m+(o<<4)+8>>2];m=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;N=c[(c[m>>2]|0)+16>>2]|0;O=c[r+16>>2]|0;K=+g[O+(n<<4)>>2];y=+g[b>>2];I=+g[O+(n<<4)+4>>2];z=+g[b+4>>2];G=+g[O+(n<<4)+8>>2];A=+g[b+8>>2];C=+g[b+16>>2];D=+g[b+20>>2];E=+g[b+24>>2];H=+g[b+32>>2];J=+g[b+36>>2];L=+g[b+40>>2];B=+g[b+48>>2];F=+g[b+52>>2];M=+g[b+56>>2];g[t+144>>2]=K*y+I*z+G*A+B;g[t+144+4>>2]=K*C+I*D+G*E+F;g[t+144+8>>2]=K*H+I*J+G*L+M;g[t+144+12>>2]=0.0;G=+g[O+(o<<4)>>2];I=+g[O+(o<<4)+4>>2];K=+g[O+(o<<4)+8>>2];g[t+112>>2]=G*y+I*z+K*A+B;g[t+112+4>>2]=G*C+I*D+K*E+F;g[t+112+8>>2]=G*H+I*J+K*L+M;g[t+112+12>>2]=0.0;Vb[N&127](m,t+144|0,t+112|0,e);f=f+1|0;m=c[r+36>>2]|0;if((f|0)>=(c[m+(q*36|0)+4>>2]|0))break b;n=o;m=c[m+(q*36|0)+12>>2]|0}}else{h=0.0;i=0.0;k=0.0}while(0);j=1.0/+(p|0)*h;i=1.0/+(p|0)*i;h=1.0/+(p|0)*k;O=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;if((xb[c[(c[O>>2]|0)+56>>2]&127](O)|0)&16384|0){c[t+144>>2]=1065353216;c[t+144+4>>2]=1065353216;c[t+144+8>>2]=0;g[t+144+12>>2]=0.0;O=c[r+36>>2]|0;G=+g[O+(q*36|0)+20>>2];I=+g[O+(q*36|0)+24>>2];K=+g[O+(q*36|0)+28>>2];O=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;N=c[(c[O>>2]|0)+16>>2]|0;y=+g[b>>2];z=+g[b+4>>2];A=+g[b+8>>2];C=+g[b+16>>2];D=+g[b+20>>2];E=+g[b+24>>2];H=+g[b+32>>2];J=+g[b+36>>2];L=+g[b+40>>2];B=+g[b+48>>2];F=+g[b+52>>2];M=+g[b+56>>2];g[t+112>>2]=j*y+i*z+h*A+B;g[t+112+4>>2]=j*C+i*D+h*E+F;g[t+112+8>>2]=j*H+i*J+h*L+M;g[t+112+12>>2]=0.0;g[t+16>>2]=(j+G)*y+(i+I)*z+(h+K)*A+B;g[t+16+4>>2]=(j+G)*C+(i+I)*D+(h+K)*E+F;g[t+16+8>>2]=(j+G)*H+(i+I)*J+(h+K)*L+M;g[t+16+12>>2]=0.0;Vb[N&127](O,t+112|0,t+16|0,t+144|0)}q=q+1|0}while((q|0)<(c[r+28>>2]|0))}}while(0);f=c[d+4>>2]|0;if((f+-21|0)>>>0<9){c[t+144>>2]=1566444395;c[t+144+4>>2]=1566444395;c[t+144+8>>2]=1566444395;g[t+144+12>>2]=0.0;c[t+112>>2]=-581039253;c[t+112+4>>2]=-581039253;c[t+112+8>>2]=-581039253;g[t+112+12>>2]=0.0;f=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;c[t+16>>2]=6132;c[t+16+4>>2]=6156;c[t+16+8>>2]=f;c[t+16+12>>2]=c[e>>2];c[t+16+12+4>>2]=c[e+4>>2];c[t+16+12+8>>2]=c[e+8>>2];c[t+16+12+12>>2]=c[e+12>>2];c[t+16+28>>2]=c[b>>2];c[t+16+28+4>>2]=c[b+4>>2];c[t+16+28+8>>2]=c[b+8>>2];c[t+16+28+12>>2]=c[b+12>>2];c[t+16+44>>2]=c[b+16>>2];c[t+16+44+4>>2]=c[b+16+4>>2];c[t+16+44+8>>2]=c[b+16+8>>2];c[t+16+44+12>>2]=c[b+16+12>>2];c[t+16+60>>2]=c[b+32>>2];c[t+16+60+4>>2]=c[b+32+4>>2];c[t+16+60+8>>2]=c[b+32+8>>2];c[t+16+60+12>>2]=c[b+32+12>>2];c[t+16+76>>2]=c[b+48>>2];c[t+16+76+4>>2]=c[b+48+4>>2];c[t+16+76+8>>2]=c[b+48+8>>2];c[t+16+76+12>>2]=c[b+48+12>>2];Vb[c[(c[d>>2]|0)+64>>2]&127](d,t+16|0,t+112|0,t+144|0);f=c[d+4>>2]|0}if((f|0)!=3){l=t;return}c[t+144>>2]=1566444395;c[t+144+4>>2]=1566444395;c[t+144+8>>2]=1566444395;g[t+144+12>>2]=0.0;c[t+112>>2]=-581039253;c[t+112+4>>2]=-581039253;c[t+112+8>>2]=-581039253;g[t+112+12>>2]=0.0;O=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;c[t+16>>2]=6132;c[t+16+4>>2]=6156;c[t+16+8>>2]=O;c[t+16+12>>2]=c[e>>2];c[t+16+12+4>>2]=c[e+4>>2];c[t+16+12+8>>2]=c[e+8>>2];c[t+16+12+12>>2]=c[e+12>>2];c[t+16+28>>2]=c[b>>2];c[t+16+28+4>>2]=c[b+4>>2];c[t+16+28+8>>2]=c[b+8>>2];c[t+16+28+12>>2]=c[b+12>>2];c[t+16+44>>2]=c[b+16>>2];c[t+16+44+4>>2]=c[b+16+4>>2];c[t+16+44+8>>2]=c[b+16+8>>2];c[t+16+44+12>>2]=c[b+16+12>>2];c[t+16+60>>2]=c[b+32>>2];c[t+16+60+4>>2]=c[b+32+4>>2];c[t+16+60+8>>2]=c[b+32+8>>2];c[t+16+60+12>>2]=c[b+32+12>>2];c[t+16+76>>2]=c[b+48>>2];c[t+16+76+4>>2]=c[b+48+4>>2];c[t+16+76+8>>2]=c[b+48+8>>2];c[t+16+76+12>>2]=c[b+48+12>>2];O=c[d+96>>2]|0;Vb[c[(c[O>>2]|0)+8>>2]&127](O,t+16+4|0,t+112|0,t+144|0);l=t;return}}}function Fc(b,d){b=b|0;d=d|0;var e=0,f=0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0.0,P=0,Q=0,R=0,S=0,T=0,U=0.0,V=0.0,W=0.0;T=l;l=l+144|0;R=c[d+36>>2]|0;o=+g[(+g[R+88>>2]>0.0?b+16|0:b+20|0)>>2];if(a[R+100>>0]&1){l=T;return}P=c[b+8>>2]|0;t=c[P+4>>2]|0;Q=c[P+12>>2]|0;L=c[(c[b+4>>2]|0)+744>>2]|0;N=+g[R+8>>2]-+g[Q+48>>2];q=+g[R+12>>2]-+g[Q+52>>2];O=+g[R+16>>2]-+g[Q+56>>2];F=1.0/+g[L+76>>2];E=(N*+g[Q>>2]+q*+g[Q+16>>2]+O*+g[Q+32>>2])*F/3.0;I=E<0.0?~~(1.0-E):0;M=~~((E+ +(I|0)-+(~~(E+ +(I|0))|0))*3.0);u=(E+ +(I|0)-+(~~(E+ +(I|0))|0))*3.0-+(M|0);I=~~(E+ +(I|0))-I|0;E=F*(N*+g[Q+4>>2]+q*+g[Q+20>>2]+O*+g[Q+36>>2])/3.0;G=E<0.0?~~(1.0-E):0;J=~~((E+ +(G|0)-+(~~(E+ +(G|0))|0))*3.0);n=(E+ +(G|0)-+(~~(E+ +(G|0))|0))*3.0-+(J|0);G=~~(E+ +(G|0))-G|0;O=F*(N*+g[Q+8>>2]+q*+g[Q+24>>2]+O*+g[Q+40>>2])/3.0;H=O<0.0?~~(1.0-O):0;K=~~((O+ +(H|0)-+(~~(O+ +(H|0))|0))*3.0);q=(O+ +(H|0)-+(~~(O+ +(H|0))|0))*3.0-+(K|0);H=~~(O+ +(H|0))-H|0;p=(I>>>16<<11^(I&65535)+16^(I&65535)+16<<16)+(G&65535)+((I>>>16<<11^(I&65535)+16^(I&65535)+16<<16)>>>11)|0;p=(p^G>>>16<<11^p<<16)+(H&65535)+((p^G>>>16<<11^p<<16)>>>11)|0;p=(p^H>>>16<<11^p<<16)+(t&65535)+((p^H>>>16<<11^p<<16)>>>11)|0;p=((p^t>>>16<<11^p<<16)>>>11)+(p^t>>>16<<11^p<<16)|0;p=((p<<3^p)>>>5)+(p<<3^p)<<4^((p<<3^p)>>>5)+(p<<3^p);p=(((p>>>17)+p<<25^(p>>>17)+p)>>>6)+((p>>>17)+p<<25^(p>>>17)+p)|0;r=c[L+60>>2]|0;s=c[L+68>>2]|0;d=c[s+(((p>>>0)%(r>>>0)|0)<<2)>>2]|0;c[L+96>>2]=(c[L+96>>2]|0)+1;e=(c[L+92>>2]|0)+1|0;c[L+92>>2]=e;a:do if(!d)f=9;else while(1){if(((((c[d+272>>2]|0)==(p|0)?(c[d+256>>2]|0)==(I|0):0)?(c[d+260>>2]|0)==(G|0):0)?(c[d+264>>2]|0)==(H|0):0)?(c[d+276>>2]|0)==(t|0):0)break a;d=c[d+280>>2]|0;e=e+1|0;c[L+92>>2]=e;if(!d){f=9;break}}while(0);b:do if((f|0)==9){f=c[L+84>>2]|0;c[L+84>>2]=f+1;if((f|0)>=(c[L+88>>2]|0)){c[5760]=(c[5760]|0)+1;c:do if((r|0)>0){d=0;e=s;while(1){f=e+(d<<2)|0;e=c[f>>2]|0;c[f>>2]=0;if(e|0)do{f=e;e=c[e+280>>2]|0;cJ(f)}while((e|0)!=0);d=d+1|0;if((d|0)==(r|0))break c;e=c[L+68>>2]|0}}while(0);g[L+76>>2]=.25;c[L+80>>2]=0;c[L+84>>2]=0;c[L+92>>2]=1;c[L+96>>2]=1}d=Ds(284)|0;Yk(d|0,0,284)|0;c[d+280>>2]=c[s+(((p>>>0)%(r>>>0)|0)<<2)>>2];c[s+(((p>>>0)%(r>>>0)|0)<<2)>>2]=d;c[d+276>>2]=t;c[d+272>>2]=p;c[d+256>>2]=I;c[d+260>>2]=G;c[d+264>>2]=H;k=+g[L+76>>2];r=T+72+4|0;s=T+72+24|0;t=T+72+44|0;e=0;h=k;while(1){j=k*+(H|0)*3.0+ +(e|0)*h;f=0;while(1){i=k*+(G|0)*3.0+ +(f|0)*h;g[T>>2]=+(I|0)*3.0*k+h*0.0;g[T+4>>2]=i;g[T+8>>2]=j;g[T+12>>2]=0.0;p=c[d+276>>2]|0;c[T+72>>2]=1065353216;c[r>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;c[T+72+20>>2]=1065353216;c[s>>2]=0;c[s+4>>2]=0;c[s+8>>2]=0;c[s+12>>2]=0;c[T+72+40>>2]=1065353216;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;if((c[p+4>>2]|0)<20)h=+Yc(T,p,T+72|0,T+16|0);else h=0.0;g[d+(f<<4)+(e<<2)>>2]=h;g[T>>2]=+(I|0)*3.0*k+ +g[L+76>>2];g[T+4>>2]=i;g[T+8>>2]=j;g[T+12>>2]=0.0;p=c[d+276>>2]|0;c[T+72>>2]=1065353216;c[r>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;c[T+72+20>>2]=1065353216;c[s>>2]=0;c[s+4>>2]=0;c[s+8>>2]=0;c[s+12>>2]=0;c[T+72+40>>2]=1065353216;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;if((c[p+4>>2]|0)<20)h=+Yc(T,p,T+72|0,T+16|0);else h=0.0;g[d+64+(f<<4)+(e<<2)>>2]=h;g[T>>2]=+(I|0)*3.0*k+ +g[L+76>>2]*2.0;g[T+4>>2]=i;g[T+8>>2]=j;g[T+12>>2]=0.0;p=c[d+276>>2]|0;c[T+72>>2]=1065353216;c[r>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;c[T+72+20>>2]=1065353216;c[s>>2]=0;c[s+4>>2]=0;c[s+8>>2]=0;c[s+12>>2]=0;c[T+72+40>>2]=1065353216;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;if((c[p+4>>2]|0)<20)h=+Yc(T,p,T+72|0,T+16|0);else h=0.0;g[d+128+(f<<4)+(e<<2)>>2]=h;g[T>>2]=+(I|0)*3.0*k+ +g[L+76>>2]*3.0;g[T+4>>2]=i;g[T+8>>2]=j;g[T+12>>2]=0.0;p=c[d+276>>2]|0;c[T+72>>2]=1065353216;c[r>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;c[T+72+20>>2]=1065353216;c[s>>2]=0;c[s+4>>2]=0;c[s+8>>2]=0;c[s+12>>2]=0;c[T+72+40>>2]=1065353216;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;if((c[p+4>>2]|0)<20)h=+Yc(T,p,T+72|0,T+16|0);else h=0.0;g[d+192+(f<<4)+(e<<2)>>2]=h;f=f+1|0;if((f|0)==4)break;h=+g[L+76>>2]}e=e+1|0;if((e|0)==4)break b;h=+g[L+76>>2]}}while(0);c[d+268>>2]=c[L+80>>2];h=+g[d+(M<<6)+(J<<4)+(K<<2)>>2];C=+g[d+(M+1<<6)+(J<<4)+(K<<2)>>2];A=+g[d+(M+1<<6)+(J+1<<4)+(K<<2)>>2];B=+g[d+(M<<6)+(J+1<<4)+(K<<2)>>2];O=+g[d+(M<<6)+(J<<4)+(K+1<<2)>>2];N=+g[d+(M+1<<6)+(J<<4)+(K+1<<2)>>2];E=+g[d+(M+1<<6)+(J+1<<4)+(K+1<<2)>>2];F=+g[d+(M<<6)+(J+1<<4)+(K+1<<2)>>2];i=C-h+n*(A-B-(C-h))+q*(N-O+n*(E-F-(N-O))-(C-h+n*(A-B-(C-h))));j=B-h+u*(A-C-(B-h))+q*(F-O+u*(E-N-(F-O))-(B-h+u*(A-C-(B-h))));k=O-h+u*(N-C-(O-h))+n*(F-B+u*(E-A-(F-B))-(O-h+u*(N-C-(O-h))));m=1.0/+D(+(i*i+j*j+k*k));h=h+u*(C-h)+n*(B+u*(A-B)-(h+u*(C-h)));h=h+q*(O+u*(N-O)+n*(F+u*(E-F)-(O+u*(N-O)))-h)-o;if(!(h<0.0)){l=T;return}s=c[P+8>>2]|0;N=+g[Q>>2]*i*m+ +g[Q+4>>2]*j*m+ +g[Q+8>>2]*k*m;O=i*m*+g[Q+16>>2]+j*m*+g[Q+20>>2]+k*m*+g[Q+24>>2];F=i*m*+g[Q+32>>2]+j*m*+g[Q+36>>2]+k*m*+g[Q+40>>2];E=-(N*(+g[R+8>>2]-h*N)+O*(+g[R+12>>2]-h*O)+F*(+g[R+16>>2]-h*F));z=+g[R+88>>2];d=c[b+12>>2]|0;if(!d)q=0.0;else q=+g[d+404>>2];if(!(z+q>0.0)){l=T;return}if(!d)d=c[(c[b+8>>2]|0)+8>>2]|0;if((a[22464]|0)==0?Uz(22464)|0:0){e=23044;f=e+48|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0))}e=c[b+12>>2]|0;m=+g[R+8>>2];B=m-+g[d+52>>2];n=+g[R+12>>2];C=n-+g[d+56>>2];o=+g[R+16>>2];A=o-+g[d+60>>2];if(!e){Q=c[b+4>>2]|0;h=0.0;i=0.0;j=0.0;d=Q;k=+g[Q+512>>2]}else{j=+g[e+392>>2];i=+g[e+396>>2];y=+g[e+388>>2];d=c[b+4>>2]|0;k=+g[d+512>>2];h=(j*A-i*C+ +g[e+372>>2])*k;i=(+g[e+376>>2]+(i*B-A*y))*k;j=(C*y-j*B+ +g[e+380>>2])*k}W=m-+g[R+24>>2]-h;V=n-+g[R+28>>2]-i;U=o-+g[R+32>>2]-j;i=+g[d+376>>2]*+g[(c[(c[b+8>>2]|0)+8>>2]|0)+228>>2];y=1.0/k;Uh(T+72|0,q,(e|0)==0?23044:e+324|0,B,C,A);j=z+ +g[T+72>>2];k=+g[T+72+4>>2]+0.0;m=+g[T+72+8>>2]+0.0;n=+g[T+72+16>>2]+0.0;o=z+ +g[T+72+20>>2];q=+g[T+72+24>>2]+0.0;u=+g[T+72+32>>2]+0.0;v=+g[T+72+36>>2]+0.0;w=z+ +g[T+72+40>>2];x=1.0/(m*(n*v-o*u)+(j*(o*w-q*v)+k*(q*u-n*w)));r=c[b+4>>2]|0;h=z*+g[r+512>>2];i=(U-F*(W*N+V*O+U*F))*(U-F*(W*N+V*O+U*F))+((W-N*(W*N+V*O+U*F))*(W-N*(W*N+V*O+U*F))+(V-O*(W*N+V*O+U*F))*(V-O*(W*N+V*O+U*F)))>2]|0)+8>>2]|0)+204>>2]&3|0?r+388|0:r+384|0)>>2]|0;d=c[r+872>>2]|0;if((d|0)==(c[r+876>>2]|0)?(S=d|0?d<<1:1,(d|0)<(S|0)):0){if(!S)f=0;else{c[6995]=(c[6995]|0)+1;d=sc((S*104|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=d;d=c[r+872>>2]|0}if((d|0)>0){e=0;do{Q=f+(e*104|0)|0;P=c[r+880>>2]|0;M=P+(e*104|0)|0;c[Q>>2]=c[M>>2];c[Q+4>>2]=c[M+4>>2];c[Q+8>>2]=c[M+8>>2];c[Q+12>>2]=c[M+12>>2];c[Q+16>>2]=c[M+16>>2];c[Q+20>>2]=c[M+20>>2];c[Q+24>>2]=c[M+24>>2];Q=f+(e*104|0)+28|0;M=P+(e*104|0)+28|0;c[Q>>2]=c[M>>2];c[Q+4>>2]=c[M+4>>2];c[Q+8>>2]=c[M+8>>2];c[Q+12>>2]=c[M+12>>2];Q=P+(e*104|0)+44|0;M=f+(e*104|0)+44|0;c[M>>2]=c[Q>>2];c[M+4>>2]=c[Q+4>>2];c[M+8>>2]=c[Q+8>>2];c[M+12>>2]=c[Q+12>>2];M=P+(e*104|0)+60|0;Q=f+(e*104|0)+60|0;c[Q>>2]=c[M>>2];c[Q+4>>2]=c[M+4>>2];c[Q+8>>2]=c[M+8>>2];c[Q+12>>2]=c[M+12>>2];Q=f+(e*104|0)+76|0;P=P+(e*104|0)+76|0;c[Q>>2]=c[P>>2];c[Q+4>>2]=c[P+4>>2];c[Q+8>>2]=c[P+8>>2];c[Q+12>>2]=c[P+12>>2];c[Q+16>>2]=c[P+16>>2];c[Q+20>>2]=c[P+20>>2];c[Q+24>>2]=c[P+24>>2];e=e+1|0}while((e|0)!=(d|0))}d=c[r+880>>2]|0;if(d|0){if(a[r+884>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[r+880>>2]=0}a[r+884>>0]=1;c[r+880>>2]=f;c[r+876>>2]=S;d=c[r+872>>2]|0}Q=c[r+880>>2]|0;c[Q+(d*104|0)>>2]=s;g[Q+(d*104|0)+4>>2]=N;g[Q+(d*104|0)+8>>2]=O;g[Q+(d*104|0)+12>>2]=F;g[Q+(d*104|0)+16>>2]=0.0;g[Q+(d*104|0)+20>>2]=E;c[Q+(d*104|0)+24>>2]=R;g[Q+(d*104|0)+28>>2]=(n*v-o*u)*x*0.0+(y*(o*w-q*v)*x+(q*u-n*w)*x*0.0);g[Q+(d*104|0)+32>>2]=(k*u-j*v)*x*0.0+(y*(m*v-k*w)*x+(j*w-m*u)*x*0.0);g[Q+(d*104|0)+36>>2]=(j*o-k*n)*x*0.0+(y*(k*q-m*o)*x+(m*n-j*q)*x*0.0);g[Q+(d*104|0)+40>>2]=0.0;g[Q+(d*104|0)+44>>2]=(n*v-o*u)*x*0.0+((o*w-q*v)*x*0.0+y*(q*u-n*w)*x);g[Q+(d*104|0)+48>>2]=(k*u-j*v)*x*0.0+((m*v-k*w)*x*0.0+y*(j*w-m*u)*x);g[Q+(d*104|0)+52>>2]=(j*o-k*n)*x*0.0+((k*q-m*o)*x*0.0+y*(m*n-j*q)*x);g[Q+(d*104|0)+56>>2]=0.0;g[Q+(d*104|0)+60>>2]=y*(n*v-o*u)*x+((o*w-q*v)*x*0.0+(q*u-n*w)*x*0.0);g[Q+(d*104|0)+64>>2]=y*(k*u-j*v)*x+((m*v-k*w)*x*0.0+(j*w-m*u)*x*0.0);g[Q+(d*104|0)+68>>2]=y*(j*o-k*n)*x+((k*q-m*o)*x*0.0+(m*n-j*q)*x*0.0);g[Q+(d*104|0)+72>>2]=0.0;S=Q+(d*104|0)+76|0;g[S>>2]=B;g[Q+(d*104|0)+80>>2]=C;g[Q+(d*104|0)+84>>2]=A;g[Q+(d*104|0)+88>>2]=0.0;g[S+16>>2]=h;g[S+20>>2]=i;c[S+24>>2]=p;c[r+872>>2]=(c[r+872>>2]|0)+1;d=c[b+12>>2]|0;if(!d){l=T;return}if(c[d+204>>2]&3|0){l=T;return}if((c[d+220>>2]&-2|0)!=4)c[d+220>>2]=1;g[d+224>>2]=0.0;l=T;return} +function Ki(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;c[b>>2]=9184;if(a[b+152>>0]|0?(d=c[b+96>>2]|0,Ib[c[c[d>>2]>>2]&511](d),d=c[b+96>>2]|0,d|0):0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}f=c[b+160>>2]|0;if((f|0)>0){d=0;do{g=c[b+168>>2]|0;h=g+(d*20|0)+4|0;i=g+(d*20|0)+12|0;j=c[i>>2]|0;e=g+(d*20|0)+16|0;if(j|0){if(a[e>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[i>>2]=0}a[e>>0]=1;c[i>>2]=0;c[h>>2]=0;c[g+(d*20|0)+8>>2]=0;d=d+1|0}while((d|0)!=(f|0))}d=c[b+168>>2]|0;if(!d){a[b+172>>0]=1;c[b+168>>2]=0;c[b+160>>2]=0;j=b+164|0;c[j>>2]=0;j=b+4|0;b=b+44|0;Bl(b);Bl(j);return}if(a[b+172>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+168>>2]=0;a[b+172>>0]=1;c[b+168>>2]=0;c[b+160>>2]=0;j=b+164|0;c[j>>2]=0;j=b+4|0;b=b+44|0;Bl(b);Bl(j);return}function Li(b){b=b|0;var d=0,e=0,f=0,g=0;c[b>>2]=9068;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[b+24>>2]=0;a[b+44>>0]=1;c[b+40>>2]=0;c[b+32>>2]=0;c[b+36>>2]=0;a[b+64>>0]=1;c[b+60>>2]=0;c[b+52>>2]=0;c[b+56>>2]=0;c[b+68>>2]=0;c[6995]=(c[6995]|0)+1;d=sc(51)|0;if(!d)f=0;else{c[(d+4+15&-16)+-4>>2]=d;f=d+4+15&-16}e=c[b+8>>2]|0;if((e|0)>0){d=0;do{g=c[b+16>>2]|0;c[f+(d<<4)>>2]=c[g+(d<<4)>>2];c[f+(d<<4)+4>>2]=c[g+(d<<4)+4>>2];c[f+(d<<4)+8>>2]=c[g+(d<<4)+8>>2];c[f+(d<<4)+12>>2]=c[g+(d<<4)+12>>2];d=d+1|0}while((d|0)!=(e|0))}d=c[b+16>>2]|0;if(!d){a[b+20>>0]=1;c[b+16>>2]=f;c[b+12>>2]=2;Kf(b);return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;a[b+20>>0]=1;c[b+16>>2]=f;c[b+12>>2]=2;Kf(b);return}function Mi(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=c[d>>2]|0;d=c[b+328>>2]|0;a:do if((d|0)>0){f=c[b+336>>2]|0;e=0;while(1){if((c[f+(e<<2)>>2]|0)==(g|0))break;e=e+1|0;if((e|0)>=(d|0))break a}if((e|0)!=(d|0))return}while(0);if((d|0)==(c[b+332>>2]|0)?(h=d|0?d<<1:1,(d|0)<(h|0)):0){if(!h)f=0;else{c[6995]=(c[6995]|0)+1;d=sc((h<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=d;d=c[b+328>>2]|0}if((d|0)>0){e=0;do{c[f+(e<<2)>>2]=c[(c[b+336>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(d|0))}e=c[b+336>>2]|0;if(e){if(a[b+340>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[b+328>>2]|0}c[b+336>>2]=0}a[b+340>>0]=1;c[b+336>>2]=f;c[b+332>>2]=h}c[(c[b+336>>2]|0)+(d<<2)>>2]=g;c[b+328>>2]=d+1;return}function Ni(a,b,d){a=a|0;b=b|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;while(1){m=c[a+12>>2]|0;n=c[m+(((b+d|0)/2|0)<<2)>>2]|0;f=b;e=d;while(1){l=c[n+28>>2]|0;l=c[((c[l+208>>2]|0)>-1?l:c[n+32>>2]|0)+208>>2]|0;while(1){h=m+(f<<2)|0;i=c[h>>2]|0;k=c[i+28>>2]|0;j=f+1|0;if((c[((c[k+208>>2]|0)>-1?k:c[i+32>>2]|0)+208>>2]|0)<(l|0))f=j;else break}while(1){g=c[m+(e<<2)>>2]|0;o=c[g+28>>2]|0;k=e+-1|0;if((l|0)<(c[((c[o+208>>2]|0)>-1?o:c[g+32>>2]|0)+208>>2]|0))e=k;else break}if((f|0)<=(e|0)){c[h>>2]=g;c[(c[a+12>>2]|0)+(e<<2)>>2]=i;f=j;e=k}if((f|0)>(e|0))break;m=c[a+12>>2]|0}if((e|0)>(b|0))Ni(a,b,e);if((f|0)<(d|0))b=f;else break}return}function Oi(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;do if(!(qD(b,c[d+8>>2]|0)|0)){if(!(qD(b,c[d>>2]|0)|0)){h=c[b+8>>2]|0;Zb[c[(c[h>>2]|0)+24>>2]&31](h,d,e,f,g);break}if((c[d+16>>2]|0)!=(e|0)?(c[d+20>>2]|0)!=(e|0):0){c[d+32>>2]=f;if((c[d+44>>2]|0)==4)break;a[d+52>>0]=0;a[d+53>>0]=0;f=c[b+8>>2]|0;$b[c[(c[f>>2]|0)+20>>2]&7](f,d,e,e,1,g);if(a[d+53>>0]|0)if(!(a[d+52>>0]|0)){b=3;h=11}else b=3;else{b=4;h=11}if((h|0)==11){c[d+20>>2]=e;c[d+40>>2]=(c[d+40>>2]|0)+1;if((c[d+36>>2]|0)==1?(c[d+24>>2]|0)==2:0)a[d+54>>0]=1}c[d+44>>2]=b;break}if((f|0)==1)c[d+32>>2]=1}else qs(d,e,f);while(0);return}function Pi(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0,h=0,i=0,k=0.0,m=0.0,n=0.0;i=l;l=l+16|0;c[i>>2]=c[a+32>>2];c[i+4>>2]=c[a+32+4>>2];c[i+8>>2]=c[a+32+8>>2];c[i+12>>2]=c[a+32+12>>2];n=+nb[c[(c[a>>2]|0)+48>>2]&15](a);m=+nb[c[(c[a>>2]|0)+48>>2]&15](a);k=+nb[c[(c[a>>2]|0)+48>>2]&15](a);g[i>>2]=n+ +g[i>>2];g[i+4>>2]=m+ +g[i+4>>2];g[i+8>>2]=k+ +g[i+8>>2];f=c[a+56>>2]|0;switch(f|0){case 0:{a=0;e=1;break}case 2:{a=2;e=0;break}default:{a=1;e=0}}n=+g[i+(e<<2)>>2];m=+g[i+(a<<2)>>2];h=(g[j>>2]=b*.25*n*n+b/12.0*m*m*4.0,c[j>>2]|0);a=(g[j>>2]=b*.5*n*n,c[j>>2]|0);switch(f|0){case 0:{e=h;f=h;break}case 2:{e=a;f=h;a=h;break}default:{e=h;f=a;a=h}}c[d>>2]=a;c[d+4>>2]=f;c[d+8>>2]=e;g[d+12>>2]=0.0;l=i;return}function Qi(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;c[a>>2]=4060;if((c[a+104>>2]|0)<=0){a=a+60|0;gj(a);kj(a);return}k=0;do{j=c[(c[a+4>>2]|0)+744>>2]|0;h=(c[a+112>>2]|0)+(k<<3)+4|0;b=c[h>>2]|0;if((c[j+60>>2]|0)>0){g=0;do{i=(c[j+68>>2]|0)+(g<<2)|0;d=c[i>>2]|0;a:do if(d|0){e=0;do{f=e|0?e+280|0:i;e=d;while(1){d=c[e+280>>2]|0;if((c[e+276>>2]|0)!=(b|0))break;c[f>>2]=d;cJ(e);if(!d)break a;else e=d}}while((d|0)!=0)}while(0);g=g+1|0}while((g|0)<(c[j+60>>2]|0));b=c[h>>2]|0}if(b|0)Ib[c[(c[b>>2]|0)+4>>2]&511](b);k=k+1|0}while((k|0)<(c[a+104>>2]|0));a=a+60|0;gj(a);kj(a);return}function Ri(b){b=b|0;var d=0,e=0;d=c[b+92>>2]|0;if(d|0){if(a[b+96>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+92>>2]=0}a[b+96>>0]=1;c[b+92>>2]=0;c[b+84>>2]=0;c[b+88>>2]=0;d=c[b+64>>2]|0;if(d|0)do{c[b+64>>2]=c[d+8>>2];e=c[d>>2]|0;if(e|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);d=c[b+64>>2]|0}while((d|0)!=0);d=c[b+48>>2]|0;if(d|0)do{c[b+48>>2]=c[d+8>>2];e=c[d>>2]|0;if(e|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);d=c[b+48>>2]|0}while((d|0)!=0);d=c[b+32>>2]|0;if(!d)return;do{c[b+32>>2]=c[d+8>>2];e=c[d>>2]|0;if(e|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);d=c[b+32>>2]|0}while((d|0)!=0);return}function Si(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;i=c[d>>2]|0;i=zb[c[(c[i>>2]|0)+56>>2]&31](i,28)|0;j=(a[b+4>>0]|0)==0;h=c[b+8>>2]|0;g=c[b+12>>2]|0;b=c[d>>2]|0;c[i+4>>2]=b;c[i>>2]=5792;a[i+8>>0]=0;c[i+12>>2]=0;if(j){a[i+16>>0]=0;c[i+20>>2]=h;c[i+24>>2]=g;if(!(Bb[c[(c[b>>2]|0)+24>>2]&63](b,c[e+8>>2]|0,c[f+8>>2]|0)|0))return i|0;j=c[i+4>>2]|0;c[i+12>>2]=Bb[c[(c[j>>2]|0)+12>>2]&63](j,c[e+8>>2]|0,c[f+8>>2]|0)|0;a[i+8>>0]=1;return i|0}else{a[i+16>>0]=1;c[i+20>>2]=h;c[i+24>>2]=g;if(!(Bb[c[(c[b>>2]|0)+24>>2]&63](b,c[f+8>>2]|0,c[e+8>>2]|0)|0))return i|0;j=c[i+4>>2]|0;c[i+12>>2]=Bb[c[(c[j>>2]|0)+12>>2]&63](j,c[f+8>>2]|0,c[e+8>>2]|0)|0;a[i+8>>0]=1;return i|0}return 0}function Ti(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0;if(qD(b,c[d+8>>2]|0)|0)ml(d,e,f,g);else{j=a[d+52>>0]|0;k=a[d+53>>0]|0;l=c[b+12>>2]|0;a[d+52>>0]=0;a[d+53>>0]=0;ao(b+16|0,d,e,f,g,h);a:do if((l|0)>1){i=b+24|0;do{if(a[d+54>>0]|0)break a;if(!(a[d+52>>0]|0)){if(a[d+53>>0]|0?(c[b+8>>2]&1|0)==0:0)break a}else{if((c[d+24>>2]|0)==1)break a;if(!(c[b+8>>2]&2))break a}a[d+52>>0]=0;a[d+53>>0]=0;ao(i,d,e,f,g,h);i=i+8|0}while(i>>>0<(b+16+(l<<3)|0)>>>0)}while(0);a[d+52>>0]=j;a[d+53>>0]=k}return}function Ui(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;n=(c[b>>2]|0)+1794895138|0;f=mB(c[b+8>>2]|0,n)|0;k=mB(c[b+12>>2]|0,n)|0;m=mB(c[b+16>>2]|0,n)|0;a:do if((f>>>0>>2>>>0?k>>>0<(d-(f<<2)|0)>>>0&m>>>0<(d-(f<<2)|0)>>>0:0)?((m|k)&3|0)==0:0){j=0;while(1){i=f>>>1;l=j+i|0;g=mB(c[b+((l<<1)+(k>>>2)<<2)>>2]|0,n)|0;h=mB(c[b+((l<<1)+(k>>>2)+1<<2)>>2]|0,n)|0;if(!(h>>>0>>0&g>>>0<(d-h|0)>>>0)){f=0;break a}if(a[b+(h+g)>>0]|0){f=0;break a}g=Vo(e,b+h|0)|0;if(!g)break;if((f|0)==1){f=0;break a}else{j=(g|0)<0?j:l;f=(g|0)<0?i:f-i|0}}g=mB(c[b+((l<<1)+(m>>>2)<<2)>>2]|0,n)|0;f=mB(c[b+((l<<1)+(m>>>2)+1<<2)>>2]|0,n)|0;if(f>>>0>>0&g>>>0<(d-f|0)>>>0)f=(a[b+(f+g)>>0]|0)==0?b+f|0:0;else f=0}else f=0;while(0);return f|0}function Vi(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,i=0.0,j=0.0,k=0,m=0;f=l;l=l+48|0;if((c[b+128>>2]|0)<=0){l=f;return}e=0;do{m=c[b+136>>2]|0;c[f+32>>2]=(a[m+(e*284|0)+84>>0]|0)==0?1065353216:0;c[f+32+4>>2]=0;c[f+32+8>>2]=1065353216;g[f+32+12>>2]=0.0;k=m+(e*284|0)+140|0;c[f+16>>2]=c[k>>2];c[f+16+4>>2]=c[k+4>>2];c[f+16+8>>2]=c[k+8>>2];c[f+16+12>>2]=c[k+12>>2];k=c[b+112>>2]|0;h=c[(c[d>>2]|0)+16>>2]|0;j=+g[m+(e*284|0)+108+(k<<2)>>2]+ +g[f+16+4>>2];i=+g[m+(e*284|0)+124+(k<<2)>>2]+ +g[f+16+8>>2];g[f>>2]=+g[m+(e*284|0)+92+(k<<2)>>2]+ +g[f+16>>2];g[f+4>>2]=j;g[f+8>>2]=i;g[f+12>>2]=0.0;Vb[h&127](d,f+16|0,f,f+32|0);Vb[c[(c[d>>2]|0)+16>>2]&127](d,f+16|0,(c[b+136>>2]|0)+(e*284|0)+16|0,f+32|0);e=e+1|0}while((e|0)<(c[b+128>>2]|0));l=f;return}function Wi(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;switch(b|0){case 2:{if((e|0)<1){g[a+232>>2]=d;c[a+300>>2]=c[a+300>>2]|512;return}if((e|0)<3){g[a+264>>2]=d;c[a+300>>2]=c[a+300>>2]|32;return}if((e|0)==3){g[a+248>>2]=d;c[a+300>>2]=c[a+300>>2]|2048;return}if((e|0)>=6)return;g[a+280>>2]=d;c[a+300>>2]=c[a+300>>2]|128;return}case 3:{if((e|0)<1){g[a+212>>2]=d;c[a+300>>2]=c[a+300>>2]|1;return}if((e|0)!=3)return;g[a+228>>2]=d;c[a+300>>2]=c[a+300>>2]|4;return}case 4:{if((e|0)<1){g[a+244>>2]=d;c[a+300>>2]=c[a+300>>2]|256;return}if((e|0)<3){g[a+276>>2]=d;c[a+300>>2]=c[a+300>>2]|16;return}if((e|0)==3){g[a+260>>2]=d;c[a+300>>2]=c[a+300>>2]|1024;return}if((e|0)>=6)return;g[a+292>>2]=d;c[a+300>>2]=c[a+300>>2]|64;return}default:return}}function Xi(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0;e=l;l=l+96|0;c[e+32>>2]=1065353216;c[e+32+4>>2]=0;c[e+32+4+4>>2]=0;c[e+32+4+8>>2]=0;c[e+32+4+12>>2]=0;c[e+32+20>>2]=1065353216;c[e+32+24>>2]=0;c[e+32+24+4>>2]=0;c[e+32+24+8>>2]=0;c[e+32+24+12>>2]=0;c[e+32+40>>2]=1065353216;k=e+32+44|0;c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0;Vb[c[(c[a>>2]|0)+8>>2]&127](a,e+32|0,e+16|0,e);i=(+g[e>>2]-+g[e+16>>2])*.5;h=(+g[e+4>>2]-+g[e+16+4>>2])*.5;j=(+g[e+8>>2]-+g[e+16+8>>2])*.5;f=+nb[c[(c[a>>2]|0)+48>>2]&15](a);g[d>>2]=b*.0833333283662796*((h+f)*2.0*(h+f)*2.0+(j+f)*2.0*(j+f)*2.0);g[d+4>>2]=b*.0833333283662796*((i+f)*2.0*(i+f)*2.0+(j+f)*2.0*(j+f)*2.0);g[d+8>>2]=b*.0833333283662796*((i+f)*2.0*(i+f)*2.0+(h+f)*2.0*(h+f)*2.0);g[d+12>>2]=0.0;l=e;return}function Yi(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0;l=c[b+780>>2]|0;a:do if(h?(k=c[b+792>>2]|0,(k|0)>0):0){i=c[b+800>>2]|0;h=0;while(1){j=c[i+(h*52|0)+24>>2]|0;if((j|0)==(l+(d*104|0)|0)?(c[i+(h*52|0)+28>>2]|0)==(l+(e*104|0)|0):0){h=10;break}if((j|0)==(l+(e*104|0)|0)?(c[i+(h*52|0)+28>>2]|0)==(l+(d*104|0)|0):0){h=10;break}h=h+1|0;if((h|0)>=(k|0))break a}if((h|0)==10)return}while(0);Xh(b,f);f=(c[b+792>>2]|0)+-1|0;k=c[b+800>>2]|0;c[k+(f*52|0)+24>>2]=l+(d*104|0);c[k+(f*52|0)+28>>2]=l+(e*104|0);o=+g[l+(d*104|0)+8>>2]-+g[l+(e*104|0)+8>>2];n=+g[l+(d*104|0)+12>>2]-+g[l+(e*104|0)+12>>2];m=+g[l+(d*104|0)+16>>2]-+g[l+(e*104|0)+16>>2];g[k+(f*52|0)+32>>2]=+D(+(o*o+n*n+m*m));a[b+984>>0]=1;return}function Zi(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;h=+g[b+52>>2];i=+g[b+56>>2];f=+g[b+60>>2];if(!(a[b+84>>0]|0)){c[b+32>>2]=c[b+204>>2];g[b>>2]=-h;g[b+4>>2]=-i;g[b+8>>2]=-f;g[b+12>>2]=0.0;h=0.0;i=1.0;d=b+272|0;g[d>>2]=h;d=b+268|0;g[d>>2]=i;return}else{m=+g[b>>2];l=+g[b+4>>2];k=+g[b+8>>2];n=+g[b+16>>2]-+g[d+52>>2];p=+g[b+20>>2]-+g[d+56>>2];q=+g[b+24>>2]-+g[d+60>>2];j=+g[d+392>>2];r=+g[d+396>>2];o=+g[d+388>>2];j=!(m*h+l*i+k*f>=-.10000000149011612)?-1.0/(m*h+l*i+k*f)*(m*(j*q-p*r+ +g[d+372>>2])+l*(+g[d+376>>2]+(n*r-q*o))+k*(p*o-n*j+ +g[d+380>>2])):0.0;i=!(m*h+l*i+k*f>=-.10000000149011612)?-1.0/(m*h+l*i+k*f):10.0;d=b+272|0;g[d>>2]=j;d=b+268|0;g[d>>2]=i;return}}function _i(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0;e=l;l=l+96|0;j=+g[c>>2];k=+g[c+4>>2];m=+g[c+8>>2];Qq(e+80|0,j,k,m,+Iy(j,k,m,+g[b>>2],+g[b+4>>2],+g[b+8>>2]));m=+g[e+80>>2];k=+g[e+80+4>>2];j=+g[e+80+8>>2];kq(e+64|0,+g[b>>2],+g[b+4>>2],+g[b+8>>2],m,k,j);Ap(e+48|0,+g[c>>2],+g[c+4>>2],+g[c+8>>2],+g[b>>2],+g[b+4>>2],+g[b+8>>2]);i=+g[e+48>>2];h=+g[e+48+4>>2];f=+g[e+48+8>>2];n=+XI(d);Qq(e+16|0,+g[e+64>>2],+g[e+64+4>>2],+g[e+64+8>>2],n);iq(e+32|0,m,k,j,+g[e+16>>2],+g[e+16+4>>2],+g[e+16+8>>2]);Qq(e,i,h,f,+WI(d));iq(a,+g[e+32>>2],+g[e+32+4>>2],+g[e+32+8>>2],+g[e>>2],+g[e+4>>2],+g[e+8>>2]);l=e;return}function $i(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=c[b+228>>2]|0;if((f|0)==(c[b+232>>2]|0)?(i=f|0?f<<1:1,(f|0)<(i|0)):0){if(!i)h=0;else{c[6995]=(c[6995]|0)+1;f=sc((i<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=f;f=c[b+228>>2]|0}if((f|0)>0){g=0;do{c[h+(g<<2)>>2]=c[(c[b+236>>2]|0)+(g<<2)>>2];g=g+1|0}while((g|0)!=(f|0))}g=c[b+236>>2]|0;if(g){if(a[b+240>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);f=c[b+228>>2]|0}c[b+236>>2]=0}a[b+240>>0]=1;c[b+236>>2]=h;c[b+232>>2]=i}c[(c[b+236>>2]|0)+(f<<2)>>2]=d;c[b+228>>2]=f+1;if(!e)return;ff(c[d+28>>2]|0,d);ff(c[d+32>>2]|0,d);return}function aj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0;e=c[a+4>>2]|0;if(e|0)ll(e,b,d);a=c[a>>2]|0;if(!a)return;m=+g[b>>2];k=+g[a+128>>2];l=+g[b+4>>2];j=+g[b+8>>2];f=+g[d+4>>2];o=+g[d+8>>2];n=+g[d>>2];i=+g[a+180>>2]*(j*f-l*o)+ +g[a+184>>2]*(m*o-j*n)+(l*n-m*f)*+g[a+188>>2];h=(j*f-l*o)*+g[a+196>>2]+(m*o-j*n)*+g[a+200>>2]+(l*n-m*f)*+g[a+204>>2];f=(j*f-l*o)*+g[a+212>>2]+(m*o-j*n)*+g[a+216>>2]+(l*n-m*f)*+g[a+220>>2];g[a+276>>2]=m*k+ +g[a+276>>2];g[a+280>>2]=k*l+ +g[a+280>>2];g[a+284>>2]=k*j+ +g[a+284>>2];g[a+292>>2]=i+ +g[a+292>>2];g[a+296>>2]=h+ +g[a+296>>2];g[a+300>>2]=f+ +g[a+300>>2];c[a+312>>2]=(c[a+312>>2]|0)+1;return}function bj(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0;v=+g[a+552>>2];u=+g[a+568>>2];t=+g[a+584>>2];s=+g[b>>2];r=+g[b+4>>2];q=+g[b+8>>2];o=+g[b+16>>2];n=+g[b+20>>2];m=+g[b+24>>2];k=+g[b+32>>2];i=+g[b+36>>2];f=+g[b+40>>2];j=+g[a+556>>2];h=+g[a+572>>2];e=+g[a+588>>2];x=+g[a+620>>2];w=+g[a+636>>2];d=+g[a+652>>2];p=x*+g[c>>2]+w*+g[c+4>>2]+d*+g[c+8>>2];l=x*+g[c+16>>2]+w*+g[c+20>>2]+d*+g[c+24>>2];d=x*+g[c+32>>2]+w*+g[c+36>>2]+d*+g[c+40>>2];d=+L(+((v*s+u*r+t*q)*p+(v*o+u*n+t*m)*l+(v*k+u*i+t*f)*d),+((s*j+r*h+q*e)*p+(o*j+n*h+m*e)*l+(k*j+i*h+f*e)*d));return +(d*+g[a+732>>2])}function cj(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;c[b>>2]=6576;d=c[b+84>>2]|0;g=c[d+8>>2]|0;if((g|0)>0){e=0;do{f=c[(c[d+16>>2]|0)+(e*12|0)+8>>2]|0;if(f|0){Ib[c[c[f>>2]>>2]&511](f);h=c[b+4>>2]|0;Ob[c[(c[h>>2]|0)+60>>2]&127](h,f)}e=e+1|0}while((e|0)!=(g|0));d=c[b+84>>2]|0}Rh(d);d=c[b+84>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+84>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+100>>2]|0;if(!d){a[b+104>>0]=1;c[b+100>>2]=0;c[b+92>>2]=0;h=b+96|0;c[h>>2]=0;Gi(b);return}if(a[b+104>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+100>>2]=0;a[b+104>>0]=1;c[b+100>>2]=0;c[b+92>>2]=0;h=b+96|0;c[h>>2]=0;Gi(b);return}function dj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=c[a+8>>2]|0;if((d|0)>0){f=0;do{e=c[(c[a+16>>2]|0)+(f<<2)>>2]|0;if(c[e+252>>2]&2){g=xb[c[(c[e>>2]|0)+16>>2]&127](e)|0;g=Bb[c[(c[b>>2]|0)+16>>2]&63](b,g,1)|0;d=Bb[c[(c[e>>2]|0)+20>>2]&63](e,c[g+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,g,d,1497645650,e);d=c[a+8>>2]|0}f=f+1|0}while((f|0)<(d|0))}if((c[a+228>>2]|0)<=0)return;d=0;do{g=c[(c[a+236>>2]|0)+(d<<2)>>2]|0;e=xb[c[(c[g>>2]|0)+36>>2]&127](g)|0;e=Bb[c[(c[b>>2]|0)+16>>2]&63](b,e,1)|0;f=Bb[c[(c[g>>2]|0)+40>>2]&63](g,c[e+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,f,1397641027,g);d=d+1|0}while((d|0)<(c[a+228>>2]|0));return}function ej(a){a=a|0;var b=0.0,d=0,e=0,f=0,h=0;e=l;l=l+32|0;c[a+36>>2]=1566444395;c[a+40>>2]=1566444395;c[a+44>>2]=1566444395;g[a+48>>2]=0.0;c[a+52>>2]=-581039253;c[a+56>>2]=-581039253;c[a+60>>2]=-581039253;g[a+64>>2]=0.0;if((c[a+20>>2]|0)<=0){l=e;return}d=0;do{f=c[a+28>>2]|0;h=c[f+(d*80|0)+64>>2]|0;Vb[c[(c[h>>2]|0)+8>>2]&127](h,f+(d*80|0)|0,e+16|0,e);b=+g[e+16>>2];if(+g[a+36>>2]>b)g[a+36>>2]=b;b=+g[e>>2];if(+g[a+52>>2]>2]=b;b=+g[e+16+4>>2];if(+g[a+40>>2]>b)g[a+40>>2]=b;b=+g[e+4>>2];if(+g[a+56>>2]>2]=b;b=+g[e+16+8>>2];if(+g[a+44>>2]>b)g[a+44>>2]=b;b=+g[e+8>>2];if(+g[a+60>>2]>2]=b;d=d+1|0}while((d|0)<(c[a+20>>2]|0));l=e;return}function fj(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+64|0;h=c[d>>2]|0;g=d+(c[h+-8>>2]|0)|0;h=c[h+-4>>2]|0;c[i>>2]=e;c[i+4>>2]=d;c[i+8>>2]=2808;d=qD(h,e)|0;e=i+12|0;f=e+40|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));b[i+12+40>>1]=0;a[i+12+42>>0]=0;a:do if(d){c[i+48>>2]=1;$b[c[(c[h>>2]|0)+20>>2]&7](h,i,g,g,1,0);d=(c[i+24>>2]|0)==1?g:0}else{Zb[c[(c[h>>2]|0)+24>>2]&31](h,i,g,1,0);switch(c[i+36>>2]|0){case 0:{d=((c[i+40>>2]|0)==1?(c[i+28>>2]|0)==1:0)&(c[i+32>>2]|0)==1?c[i+20>>2]|0:0;break a}case 1:break;default:{d=0;break a}}if((c[i+24>>2]|0)!=1?!(((c[i+40>>2]|0)==0?(c[i+28>>2]|0)==1:0)&(c[i+32>>2]|0)==1):0){d=0;break}d=c[i+16>>2]|0}while(0);l=i;return d|0}function gj(b){b=b|0;var d=0;d=c[b+12>>2]|0;if(d|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;d=c[b+32>>2]|0;if(d|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;d=c[b+52>>2]|0;if(d|0){if(a[b+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+52>>2]=0}a[b+56>>0]=1;c[b+52>>2]=0;c[b+44>>2]=0;c[b+48>>2]=0;d=c[b+72>>2]|0;if(!d){a[b+76>>0]=1;c[b+72>>2]=0;c[b+64>>2]=0;b=b+68|0;c[b>>2]=0;return}if(a[b+76>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+72>>2]=0;a[b+76>>0]=1;c[b+72>>2]=0;c[b+64>>2]=0;b=b+68|0;c[b>>2]=0;return}function hj(){var b=0;b=Os()|0;c[b>>2]=5052;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;a[b+80>>0]=1;c[b+76>>2]=0;c[b+68>>2]=0;c[b+72>>2]=0;a[b+100>>0]=1;c[b+96>>2]=0;c[b+88>>2]=0;c[b+92>>2]=0;a[b+120>>0]=1;c[b+116>>2]=0;c[b+108>>2]=0;c[b+112>>2]=0;a[b+140>>0]=1;c[b+136>>2]=0;c[b+128>>2]=0;c[b+132>>2]=0;a[b+160>>0]=1;c[b+156>>2]=0;c[b+148>>2]=0;c[b+152>>2]=0;a[b+180>>0]=1;c[b+176>>2]=0;c[b+168>>2]=0;c[b+172>>2]=0;a[b+208>>0]=1;c[b+204>>2]=0;c[b+196>>2]=0;c[b+200>>2]=0;c[b+232>>2]=0;c[b+224>>2]=0;c[b+212>>2]=14;c[b+216>>2]=15;c[b+220>>2]=16;return b|0}function ij(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=c[b+348>>2]|0;if((g|0)==(c[b+352>>2]|0)?(j=g|0?g<<1:1,(g|0)<(j|0)):0){if(!j)i=0;else{c[6995]=(c[6995]|0)+1;g=sc((j<<2|3)+16|0)|0;if(!g)g=0;else{c[(g+4+15&-16)+-4>>2]=g;g=g+4+15&-16}i=g;g=c[b+348>>2]|0}if((g|0)>0){h=0;do{c[i+(h<<2)>>2]=c[(c[b+356>>2]|0)+(h<<2)>>2];h=h+1|0}while((h|0)!=(g|0))}h=c[b+356>>2]|0;if(h){if(a[b+360>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);g=c[b+348>>2]|0}c[b+356>>2]=0}a[b+360>>0]=1;c[b+356>>2]=i;c[b+352>>2]=j}c[(c[b+356>>2]|0)+(g<<2)>>2]=d;c[b+348>>2]=g+1;c[d+344>>2]=c[b+472>>2];Og(b,d,e<<16>>16,f<<16>>16);return}function jj(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0;e=l;l=l+96|0;i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);c[e+32>>2]=1065353216;c[e+32+4>>2]=0;c[e+32+4+4>>2]=0;c[e+32+4+8>>2]=0;c[e+32+4+12>>2]=0;c[e+32+20>>2]=1065353216;c[e+32+24>>2]=0;c[e+32+24+4>>2]=0;c[e+32+24+8>>2]=0;c[e+32+24+12>>2]=0;c[e+32+40>>2]=1065353216;j=e+32+44|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;Vb[c[(c[a>>2]|0)+8>>2]&127](a,e+32|0,e+16|0,e);h=(i+(+g[e>>2]-+g[e+16>>2])*.5)*2.0;f=(i+(+g[e+4>>2]-+g[e+16+4>>2])*.5)*2.0;i=(i+(+g[e+8>>2]-+g[e+16+8>>2])*.5)*2.0;g[d>>2]=b*.0833333283662796*(f*f+i*i);g[d+4>>2]=b*.0833333283662796*(h*h+i*i);g[d+8>>2]=b*.0833333283662796*(h*h+f*f);g[d+12>>2]=0.0;l=e;return}function kj(b){b=b|0;var d=0;d=c[b+72>>2]|0;if(d|0){if(a[b+76>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+72>>2]=0}a[b+76>>0]=1;c[b+72>>2]=0;c[b+64>>2]=0;c[b+68>>2]=0;d=c[b+52>>2]|0;if(d|0){if(a[b+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+52>>2]=0}a[b+56>>0]=1;c[b+52>>2]=0;c[b+44>>2]=0;c[b+48>>2]=0;d=c[b+32>>2]|0;if(d|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;d=c[b+12>>2]|0;if(!d){a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;b=b+8|0;c[b>>2]=0;return}if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+12>>2]=0;a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;b=b+8|0;c[b>>2]=0;return}function lj(a,b){a=a|0;b=+b;var d=0,e=0,f=0,h=0.0,i=0.0,j=0.0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0;e=c[a+792>>2]|0;if((e|0)<=0)return;d=c[a+800>>2]|0;a=0;do{n=c[d+(a*52|0)+24>>2]|0;f=c[d+(a*52|0)+28>>2]|0;s=+g[n+40>>2];q=+g[n+44>>2];i=+g[n+48>>2];k=d+(a*52|0)+8|0;r=+g[k>>2];m=d+(a*52|0)+12|0;p=+g[m>>2];l=d+(a*52|0)+16|0;o=+g[l>>2];j=-(+g[d+(a*52|0)+48>>2]*((s-+g[f+40>>2])*r+(q-+g[f+44>>2])*p+(i-+g[f+48>>2])*o)*b);h=+g[n+88>>2]*j;g[n+40>>2]=s+r*h;g[n+44>>2]=q+p*h;g[n+48>>2]=o*h+i;j=+g[f+88>>2]*j;i=j*+g[m>>2];h=j*+g[l>>2];g[f+40>>2]=+g[f+40>>2]-+g[k>>2]*j;g[f+44>>2]=+g[f+44>>2]-i;g[f+48>>2]=+g[f+48>>2]-h;a=a+1|0}while((a|0)!=(e|0));return}function mj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=c[b+12>>2]|0;if(!e)return;if(!(a[b+8>>0]|0))return;f=c[d+4>>2]|0;if((f|0)==(c[d+8>>2]|0)?(h=f|0?f<<1:1,(f|0)<(h|0)):0){if(!h)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((h<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[d+4>>2]|0}if((f|0)>0){g=0;do{c[e+(g<<2)>>2]=c[(c[d+12>>2]|0)+(g<<2)>>2];g=g+1|0}while((g|0)!=(f|0))}g=c[d+12>>2]|0;if(g){if(a[d+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);f=c[d+4>>2]|0}c[d+12>>2]=0}a[d+16>>0]=1;c[d+12>>2]=e;c[d+8>>2]=h;e=c[b+12>>2]|0}c[(c[d+12>>2]|0)+(f<<2)>>2]=e;c[d+4>>2]=f+1;return}function nj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=c[b+56>>2]|0;if(!e)return;if(!(a[b+52>>0]|0))return;f=c[d+4>>2]|0;if((f|0)==(c[d+8>>2]|0)?(h=f|0?f<<1:1,(f|0)<(h|0)):0){if(!h)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((h<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[d+4>>2]|0}if((f|0)>0){g=0;do{c[e+(g<<2)>>2]=c[(c[d+12>>2]|0)+(g<<2)>>2];g=g+1|0}while((g|0)!=(f|0))}g=c[d+12>>2]|0;if(g){if(a[d+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);f=c[d+4>>2]|0}c[d+12>>2]=0}a[d+16>>0]=1;c[d+12>>2]=e;c[d+8>>2]=h;e=c[b+56>>2]|0}c[(c[d+12>>2]|0)+(f<<2)>>2]=e;c[d+4>>2]=f+1;return}function oj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;k=+g[a+24>>2];i=+g[a+28>>2];j=+g[a+32>>2];f=k*+g[b>>2]+i*+g[b+4>>2]+j*+g[b+8>>2];h=+g[a+20>>2];if(f>h){g[a+20>>2]=f;c[a+4>>2]=c[b>>2];c[a+4+4>>2]=c[b+4>>2];c[a+4+8>>2]=c[b+8>>2];c[a+4+12>>2]=c[b+12>>2]}else f=h;h=k*+g[b+16>>2]+i*+g[b+20>>2]+j*+g[b+24>>2];if(h>f){g[a+20>>2]=h;c[a+4>>2]=c[b+16>>2];c[a+4+4>>2]=c[b+16+4>>2];c[a+4+8>>2]=c[b+16+8>>2];c[a+4+12>>2]=c[b+16+12>>2]}else h=f;f=k*+g[b+32>>2]+i*+g[b+36>>2]+j*+g[b+40>>2];if(!(f>h))return;g[a+20>>2]=f;c[a+4>>2]=c[b+32>>2];c[a+4+4>>2]=c[b+32+4>>2];c[a+4+8>>2]=c[b+32+8>>2];c[a+4+12>>2]=c[b+32+12>>2];return}function pj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;h=c[d+4>>2]|0;if((h|0)<=0){c[b+4>>2]=h;return}c[6995]=(c[6995]|0)+1;e=sc((h<<2|3)+16|0)|0;if(!e)g=0;else{c[(e+4+15&-16)+-4>>2]=e;g=e+4+15&-16}f=c[b+4>>2]|0;if((f|0)>0){e=0;do{c[g+(e<<2)>>2]=c[(c[b+12>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0))}e=c[b+12>>2]|0;if(e|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=g;c[b+8>>2]=h;e=0;f=g;do{c[f+(e<<2)>>2]=0;e=e+1|0;f=c[b+12>>2]|0}while((e|0)!=(h|0));c[b+4>>2]=h;e=0;do{c[f+(e<<2)>>2]=c[(c[d+12>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(h|0));return}function qj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;k=+g[a+88>>2];i=+g[a+92>>2];j=+g[a+96>>2];f=k*+g[b>>2]+i*+g[b+4>>2]+j*+g[b+8>>2];h=+g[a+84>>2];if(f>h){g[a+84>>2]=f;c[a+4>>2]=c[b>>2];c[a+4+4>>2]=c[b+4>>2];c[a+4+8>>2]=c[b+8>>2];c[a+4+12>>2]=c[b+12>>2]}else f=h;h=k*+g[b+16>>2]+i*+g[b+20>>2]+j*+g[b+24>>2];if(h>f){g[a+84>>2]=h;c[a+4>>2]=c[b+16>>2];c[a+4+4>>2]=c[b+16+4>>2];c[a+4+8>>2]=c[b+16+8>>2];c[a+4+12>>2]=c[b+16+12>>2]}else h=f;f=k*+g[b+32>>2]+i*+g[b+36>>2]+j*+g[b+40>>2];if(!(f>h))return;g[a+84>>2]=f;c[a+4>>2]=c[b+32>>2];c[a+4+4>>2]=c[b+32+4>>2];c[a+4+8>>2]=c[b+32+8>>2];c[a+4+12>>2]=c[b+32+12>>2];return}function rj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0;i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);m=i+ +g[a+32>>2];k=i+ +g[a+36>>2];i=i+ +g[a+40>>2];u=+C(+(+g[b>>2]));t=+C(+(+g[b+4>>2]));s=+C(+(+g[b+8>>2]));q=+C(+(+g[b+16>>2]));p=+C(+(+g[b+20>>2]));o=+C(+(+g[b+24>>2]));l=+C(+(+g[b+32>>2]));j=+C(+(+g[b+36>>2]));h=+C(+(+g[b+40>>2]));r=+g[b+48>>2];n=+g[b+52>>2];f=+g[b+56>>2];g[d>>2]=r-(m*u+k*t+i*s);g[d+4>>2]=n-(m*q+k*p+i*o);g[d+8>>2]=f-(m*l+k*j+i*h);g[d+12>>2]=0.0;g[e>>2]=m*u+k*t+i*s+r;g[e+4>>2]=m*q+k*p+i*o+n;g[e+8>>2]=m*l+k*j+i*h+f;g[e+12>>2]=0.0;return}function sj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=l;l=l+96|0;g=c[b+192>>2]|0;c[f+64>>2]=0;c[f+64+4>>2]=g;c[f+64+8>>2]=b;c[f+64+12>>2]=b+4;c[f+64+16>>2]=-1;c[f+64+20>>2]=-1;b=c[d+192>>2]|0;c[f+40>>2]=0;c[f+40+4>>2]=b;c[f+40+8>>2]=d;c[f+40+12>>2]=d+4;c[f+40+16>>2]=-1;c[f+40+20>>2]=-1;b=c[a+24>>2]|0;b=Db[c[(c[b>>2]|0)+8>>2]&1](b,f+64|0,f+40|0,0,2)|0;if(!b){l=f;return}c[f+4>>2]=0;c[f+8>>2]=f+64;c[f+12>>2]=f+40;c[f>>2]=6324;c[f+36>>2]=e;c[f+32>>2]=c[e+12>>2];Zb[c[(c[b>>2]|0)+8>>2]&31](b,f+64|0,f+40|0,a+28|0,f);Ib[c[c[b>>2]>>2]&511](b);g=c[a+24>>2]|0;Ob[c[(c[g>>2]|0)+60>>2]&127](g,b);l=f;return}function tj(b){b=b|0;var d=0;c[b>>2]=8928;if(c[b+108>>2]|0){d=c[b+112>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+112>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+108>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+108>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}}d=c[b+88>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+84>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+80>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+60>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}if(!(a[b+100>>0]|0))return;d=c[b+92>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+92>>2]|0;if(!d)return;c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);return}function uj(b){b=b|0;var d=0,e=0,f=0,h=0.0;e=l;l=l+96|0;a[b+92>>0]=1;if((a[22496]|0)==0?Uz(22496)|0:0){c[6132]=1065353216;c[6133]=0;c[6134]=0;c[6135]=0;c[6136]=0;c[6137]=1065353216;c[6138]=0;c[6139]=0;c[6140]=0;c[6141]=0;c[6142]=1065353216;g[6143]=0.0;c[6144]=-1082130432;c[6145]=0;c[6146]=0;c[6147]=0;c[6148]=0;c[6149]=-1082130432;c[6150]=0;c[6151]=0;c[6152]=0;c[6153]=0;c[6154]=-1082130432;g[6155]=0.0}d=e;f=d+96|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(f|0));Vb[c[(c[b>>2]|0)+76>>2]&127](b,24528,e,6);h=+g[b+48>>2];g[b+76>>2]=+g[e>>2]+h;g[b+60>>2]=+g[e+48>>2]-h;g[b+80>>2]=+g[e+20>>2]+h;g[b+64>>2]=+g[e+68>>2]-h;g[b+84>>2]=+g[e+40>>2]+h;g[b+68>>2]=+g[e+88>>2]-h;l=e;return}function vj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;while(1){i=c[a+12>>2]|0;k=c[i+(((b+d|0)/2|0)<<3)>>2]|0;f=d;e=b;while(1){while(1){j=e+1|0;if((c[i+(e<<3)>>2]|0)<(k|0))e=j;else break}while(1){g=i+(f<<3)|0;h=f+-1|0;if((k|0)<(c[g>>2]|0))f=h;else break}if((e|0)<=(f|0)){l=i+(e<<3)|0;i=c[l>>2]|0;e=c[l+4>>2]|0;m=c[g+4>>2]|0;c[l>>2]=c[g>>2];c[l+4>>2]=m;f=(c[a+12>>2]|0)+(f<<3)|0;c[f>>2]=i;c[f+4>>2]=e;f=h;e=j}if((e|0)>(f|0))break;i=c[a+12>>2]|0}if((f|0)>(b|0))vj(a,b,f);if((e|0)<(d|0))b=e;else break}return}function wj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=c[b+72>>2]|0;if(!e)return;f=c[d+4>>2]|0;if((f|0)==(c[d+8>>2]|0)?(h=f|0?f<<1:1,(f|0)<(h|0)):0){if(!h)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((h<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[d+4>>2]|0}if((f|0)>0){g=0;do{c[e+(g<<2)>>2]=c[(c[d+12>>2]|0)+(g<<2)>>2];g=g+1|0}while((g|0)!=(f|0))}g=c[d+12>>2]|0;if(g){if(a[d+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);f=c[d+4>>2]|0}c[d+12>>2]=0}a[d+16>>0]=1;c[d+12>>2]=e;c[d+8>>2]=h;e=c[b+72>>2]|0}c[(c[d+12>>2]|0)+(f<<2)>>2]=e;c[d+4>>2]=f+1;return}function xj(a,b,d){a=a|0;b=+b;d=+d;var e=0,f=0,h=0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0;f=c[a+792>>2]|0;if((f|0)<=0)return;e=c[a+800>>2]|0;a=0;do{d=+g[e+(a*52|0)+40>>2];if(d>0.0?(h=c[e+(a*52|0)+24>>2]|0,i=c[e+(a*52|0)+28>>2]|0,j=+g[h+8>>2],k=+g[i+8>>2]-j,l=+g[h+12>>2],m=+g[i+12>>2]-l,n=+g[h+16>>2],o=+g[i+16>>2]-n,p=+g[e+(a*52|0)+44>>2],p+(k*k+m*m+o*o)>1.1920928955078125e-07):0){d=(p-(k*k+m*m+o*o))/(d*(p+(k*k+m*m+o*o)))*b;q=d*+g[h+88>>2];g[h+8>>2]=j-k*q;g[h+12>>2]=l-m*q;g[h+16>>2]=n-o*q;d=d*+g[i+88>>2];g[i+8>>2]=+g[i+8>>2]+k*d;g[i+12>>2]=m*d+ +g[i+12>>2];g[i+16>>2]=o*d+ +g[i+16>>2]}a=a+1|0}while((a|0)!=(f|0));return}function yj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0;e=l;l=l+96|0;c[e+32>>2]=1065353216;c[e+32+4>>2]=0;c[e+32+4+4>>2]=0;c[e+32+4+8>>2]=0;c[e+32+4+12>>2]=0;c[e+32+20>>2]=1065353216;c[e+32+24>>2]=0;c[e+32+24+4>>2]=0;c[e+32+24+8>>2]=0;c[e+32+24+12>>2]=0;c[e+32+40>>2]=1065353216;n=e+32+44|0;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;c[n+16>>2]=0;Vb[c[(c[a>>2]|0)+8>>2]&127](a,e+32|0,e+16|0,e);k=+g[e>>2];m=+g[e+16>>2];i=+g[e+4>>2];j=+g[e+16+4>>2];f=+g[e+8>>2];h=+g[e+16+8>>2];g[d>>2]=+D(+((k-m)*(k-m)+(i-j)*(i-j)+(f-h)*(f-h)))*.5;g[b>>2]=(m+k)*.5;g[b+4>>2]=(j+i)*.5;g[b+8>>2]=(h+f)*.5;g[b+12>>2]=0.0;l=e;return}function zj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=c[d+48>>2]|0;if((c[d+60>>2]|0)==2){Ag(b+44|0,h)|0;f=c[b+48>>2]|0;if(!f){f=b+48|0;g=1}else{c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);f=b+48|0;g=1}}else{Ag(b+4|0,h)|0;f=c[b+8>>2]|0;if(!f){f=b+8|0;g=0}else{c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);f=b+8|0;g=0}}c[f>>2]=h;f=b+4+(g*40|0)+12|0;c[f>>2]=(c[f>>2]|0)+-1;f=c[d+52>>2]|0;c[((f|0)==0?b+84+(c[d+60>>2]<<2)|0:f+56|0)>>2]=c[d+56>>2];f=c[d+56>>2]|0;if(f|0)c[f+52>>2]=c[d+52>>2];h=c[b+96>>2]|0;Sb[c[(c[h>>2]|0)+16>>2]&127](h,d,e);c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);a[b+154>>0]=1;return}function Aj(a,d,f,h){a=a|0;d=d|0;f=f|0;h=h|0;var i=0,j=0,k=0,l=0,m=0;i=c[a+108>>2]|0;if(i|0){Vb[c[(c[i>>2]|0)+28>>2]&127](i,d,f,h);return}i=b[a+56>>1]|0;if(!(i<<16>>16))return;m=1;k=1;do{j=c[a+68>>2]|0;if(b[j+(k<<2)>>1]&1){l=c[a+60>>2]|0;k=e[j+(k<<2)+2>>1]|0;if(!(+g[d>>2]>+g[l+(k<<6)+32>>2])?!(+g[f>>2]<+g[l+(k<<6)+16>>2]):0)j=1;else j=0;if(!(!(+g[d+8>>2]>+g[l+(k<<6)+40>>2])?!(+g[f+8>>2]<+g[l+(k<<6)+24>>2]):0))j=0;if(!(+g[d+4>>2]>+g[l+(k<<6)+36>>2])?!(+g[f+4>>2]<+g[l+(k<<6)+20>>2]|j^1):0){zb[c[(c[h>>2]|0)+8>>2]&31](h,l+(k<<6)|0)|0;i=b[a+56>>1]|0}}m=m+1<<16>>16;k=m&65535}while(k>>>0<((i&65535)<<1|1)>>>0);return}function Bj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0;h=+g[b>>2];i=+g[b+16>>2];j=h>2];if((j+g[a+24>>2])return;k=h>i?b:b+16|0;if(+g[(+g[k>>2]>f?k:b+32|0)>>2]<+g[a+8>>2])return;f=+g[b+8>>2];h=+g[b+24>>2];j=f>2];if((j+g[a+32>>2])return;k=f>h?b+8|0:b+24|0;if(+g[(+g[k>>2]>i?k:b+40|0)>>2]<+g[a+16>>2])return;f=+g[b+4>>2];h=+g[b+20>>2];j=f>2];if((j+g[a+28>>2])return;k=f>h?b+4|0:b+20|0;if(+g[(+g[k>>2]>i?k:b+36|0)>>2]<+g[a+12>>2])return;k=c[a+4>>2]|0;Vb[c[(c[k>>2]|0)+8>>2]&127](k,b,d,e);return}function Cj(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0;if(!(a[b+738>>0]|0)){c[d>>2]=5;c[d+4>>2]=1;e=+bj(b,(c[b+28>>2]|0)+4|0,(c[b+32>>2]|0)+4|0);g[b+728>>2]=e;g[b+708>>2]=0.0;g[b+712>>2]=0.0;a[b+716>>0]=0;h=+g[b+692>>2];do if(!(h>=0.0))i=13;else{e=+mh(e-+g[b+688>>2],6.2831854820251465);if(!(e<-3.1415927410125732)){if(e>3.1415927410125732)e=e+-6.2831854820251465}else e=e+6.2831854820251465;if(e<-h){a[b+716>>0]=1;f=1.0;e=-(e+h)}else{if(!(e>h)){i=13;break}a[b+716>>0]=1;f=-1.0;e=h-e}g[b+708>>2]=e;g[b+712>>2]=f}while(0);if((i|0)==13?(a[b+737>>0]|0)==0:0)return;c[d>>2]=6;b=d+4|0}else{c[d>>2]=0;b=d+4|0}c[b>>2]=0;return}function Dj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0.0,i=0;f=l;l=l+16|0;c[a+4>>2]=c[b+24>>2];e=c[b>>2]|0;c[a+8>>2]=e;if(d){c[a+56>>2]=c[b+8>>2];c[a+56+4>>2]=c[b+8+4>>2];c[a+56+8>>2]=c[b+8+8>>2];c[a+56+12>>2]=c[b+8+12>>2];i=a+72|0;d=a+24|0;e=a+40|0;h=+g[b+24>>2];hq(i,d,e,h);h=+g[b+24>>2];l=f;return +h}else{d=gJ(OI(e)|0)|0;fm(f,d,+g[b+8>>2],+g[b+12>>2],+g[b+16>>2]);c[a+56>>2]=c[f>>2];c[a+56+4>>2]=c[f+4>>2];c[a+56+8>>2]=c[f+8>>2];c[a+56+12>>2]=c[f+12>>2];d=a+72|0;e=a+24|0;i=a+40|0;h=+g[b+24>>2];hq(d,e,i,h);h=+g[b+24>>2];l=f;return +h}return 0.0}function Ej(b,d,e,f){b=b|0;d=d|0;e=e|0;f=+f;var h=0,i=0.0,j=0.0,k=0.0;h=l;l=l+16|0;g[b+32>>2]=f;c[b+8>>2]=c[d>>2];c[b+8+4>>2]=c[d+4>>2];c[b+8+8>>2]=c[d+8>>2];c[b+8+12>>2]=c[d+12>>2];i=+g[b+28>>2];k=+g[e+4>>2]-i*+g[d+4>>2];j=+g[e+8>>2]-i*+g[d+8>>2];g[h>>2]=+g[e>>2]-+g[d>>2]*i;g[h+4>>2]=k;g[h+8>>2]=j;g[h+12>>2]=0.0;f=+g[b+24>>2]+i+f;g[b+32>>2]=f;if(!(f<0.0)){b=b+4|0;b=c[b>>2]|0;e=c[b>>2]|0;e=e+16|0;e=c[e>>2]|0;Tb[e&15](b,d,h,f);l=h;return}a[b+36>>0]=1;b=b+4|0;b=c[b>>2]|0;e=c[b>>2]|0;e=e+16|0;e=c[e>>2]|0;Tb[e&15](b,d,h,f);l=h;return}function Fj(a,b,d,e,f,h,i,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0.0,m=0.0;if(!(c[j+52>>2]|0))return;if((c[j+20>>2]|0)<=0)return;e=0;while(1){d=c[a+28>>2]|0;if((d|0)>0){l=0.0;b=0;do{k=c[(c[a+116>>2]|0)+(b<<2)>>2]|0;i=c[a+36>>2]|0;h=c[a+16>>2]|0;m=+qb[c[a+220>>2]&31](h+((c[i+(k*152|0)+144>>2]|0)*244|0)|0,h+((c[i+(k*152|0)+148>>2]|0)*244|0)|0,i+(k*152|0)|0);l=l+m*m;b=b+1|0}while((b|0)!=(d|0))}else l=0.0;if(l<=+g[j+92>>2]){b=8;break}k=c[j+20>>2]|0;i=e;e=e+1|0;if(!((i|0)<(k+-1|0)&(e|0)<(k|0))){b=8;break}}if((b|0)==8)return}function Gj(b,d){b=b|0;d=d|0;c[b+204>>2]=c[d+48>>2];c[b+208>>2]=c[d+52>>2];c[b+212>>2]=c[d+56>>2];c[b+216>>2]=c[d+60>>2];c[b+220>>2]=c[d+64>>2];c[b+224>>2]=c[d+68>>2];c[b+156>>2]=c[d>>2];c[b+156+4>>2]=c[d+4>>2];c[b+156+8>>2]=c[d+8>>2];c[b+156+12>>2]=c[d+12>>2];c[b+172>>2]=c[d+16>>2];c[b+172+4>>2]=c[d+16+4>>2];c[b+172+8>>2]=c[d+16+8>>2];c[b+172+12>>2]=c[d+16+12>>2];c[b+188>>2]=c[d+32>>2];c[b+188+4>>2]=c[d+32+4>>2];c[b+188+8>>2]=c[d+32+8>>2];c[b+188+12>>2]=c[d+32+12>>2];c[b+228>>2]=c[d+72>>2];g[b+232>>2]=0.0;g[b+252>>2]=0.0;g[b+236>>2]=0.0;g[b+240>>2]=0.0;g[b+256>>2]=0.0;g[b+244>>2]=.10000000149011612;a[b+260>>0]=a[d+80>>0]&1;c[b+248>>2]=c[d+76>>2];return}function Hj(a,b){a=a|0;b=+b;var d=0,e=0;d=c[a+84>>2]|0;if(d|0)Jb[d&31](a,b);Jb[c[(c[a>>2]|0)+140>>2]&31](a,b);g[a+28>>2]=b;c[a+32>>2]=0;c[a+48>>2]=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Jb[c[(c[a>>2]|0)+164>>2]&31](a,b);Ib[c[(c[a>>2]|0)+44>>2]&511](a);Ib[c[(c[a>>2]|0)+148>>2]&511](a);g[a+104>>2]=b;Ob[c[(c[a>>2]|0)+152>>2]&127](a,a+92|0);Jb[c[(c[a>>2]|0)+144>>2]&31](a,b);if((c[a+296>>2]|0)>0){d=0;do{e=c[(c[a+304>>2]|0)+(d<<2)>>2]|0;Pb[c[(c[e>>2]|0)+8>>2]&7](e,a,b);d=d+1|0}while((d|0)<(c[a+296>>2]|0))}Jb[c[(c[a>>2]|0)+156>>2]&31](a,b);d=c[a+80>>2]|0;if(!d)return;Jb[d&31](a,b);return}function Ij(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0;f=l;l=l+16|0;c[b+4>>2]=d;c[b>>2]=4652;c[b+8>>2]=-1;c[b+12>>2]=-1;g[b+16>>2]=3402823466385288598117041.0e14;a[b+20>>0]=1;a[b+21>>0]=0;c[b+24>>2]=-1;c[b+28>>2]=e;if((a[22480]|0)==0?Uz(22480)|0:0){c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;ef(23152,0.0,0,0,f)}c[5839]=c[5839]|1;g[5889]=0.0;h=+g[5899]*0.0;i=+g[5900]*0.0;g[5894]=+g[5898]*0.0;g[5895]=h;g[5896]=i;g[5897]=0.0;c[5902]=0;c[5903]=0;c[5904]=0;c[5905]=0;i=+g[5891]*0.0;h=+g[5892]*0.0;g[5943]=+g[5890]*0.0;g[5944]=i;g[5945]=h;g[5946]=0.0;c[b+32>>2]=23152;g[b+36>>2]=0.0;g[b+40>>2]=.05000000074505806;c[b+44>>2]=0;l=f;return}function Jj(a){a=a|0;var b=0;c[a>>2]=3244;b=c[a+88>>2]|0;Ib[c[c[b>>2]>>2]&511](b);b=c[a+88>>2]|0;if(b|0){c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0)}b=c[a+92>>2]|0;Ib[c[c[b>>2]>>2]&511](b);b=c[a+92>>2]|0;if(b|0){c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0)}b=c[a+96>>2]|0;Ib[c[c[b>>2]>>2]&511](b);b=c[a+96>>2]|0;if(b|0){c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0)}b=c[a+100>>2]|0;Ib[c[c[b>>2]>>2]&511](b);b=c[a+100>>2]|0;if(b|0){c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0)}b=c[a+104>>2]|0;Ib[c[c[b>>2]>>2]&511](b);b=c[a+104>>2]|0;if(!b){nf(a);return}c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);nf(a);return}function Kj(b,d){b=b|0;d=d|0;var e=0,f=0;a:do if((d|0)!=0&(b&3|0)!=0){e=d;while(1){if(!(a[b>>0]|0))break a;b=b+1|0;d=e+-1|0;if((d|0)!=0&(b&3|0)!=0)e=d;else{e=d;d=(d|0)!=0;f=4;break}}}else{e=d;d=(d|0)!=0;f=4}while(0);b:do if((f|0)==4)if(d){if(a[b>>0]|0){c:do if(e>>>0>3)while(1){d=c[b>>2]|0;if((d&-2139062144^-2139062144)&d+-16843009|0)break;b=b+4|0;e=e+-4|0;if(e>>>0<=3){f=10;break c}}else f=10;while(0);if((f|0)==10)if(!e){e=0;break}while(1){if(!(a[b>>0]|0))break b;b=b+1|0;e=e+-1|0;if(!e){e=0;break}}}}else e=0;while(0);return (e|0?b:0)|0}function Lj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0,i=0.0,j=0.0,k=0.0,l=0,m=0;m=c[b+56>>2]|0;l=c[m+32>>2]|0;b=c[l>>2]|0;m=c[m+24>>2]|0;if((m|0)<=1){m=b;m=m+8|0;c[a>>2]=c[m>>2];c[a+4>>2]=c[m+4>>2];c[a+8>>2]=c[m+8>>2];c[a+12>>2]=c[m+12>>2];return}j=+g[d>>2];k=+g[d+4>>2];i=+g[d+8>>2];d=0;h=1;e=j*+g[b+8>>2]+k*+g[b+12>>2]+i*+g[b+16>>2];while(1){b=c[l+(h<<2)>>2]|0;f=j*+g[b+8>>2]+k*+g[b+12>>2]+i*+g[b+16>>2];b=f>e;d=b?h:d;h=h+1|0;if((h|0)==(m|0))break;else e=b?f:e}m=c[l+(d<<2)>>2]|0;m=m+8|0;c[a>>2]=c[m>>2];c[a+4>>2]=c[m+4>>2];c[a+8>>2]=c[m+8>>2];c[a+12>>2]=c[m+12>>2];return}function Mj(a){a=a|0;var b=0.0,c=0.0,d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0;n=+g[a+4>>2];h=+g[a+456>>2];m=+g[a+8>>2];e=+g[a+460>>2];l=+g[a+12>>2];c=+g[a+464>>2];k=+g[a+20>>2];j=+g[a+24>>2];i=+g[a+28>>2];f=+g[a+36>>2];d=+g[a+40>>2];b=+g[a+44>>2];g[a+324>>2]=n*h*n+m*e*m+l*c*l;g[a+328>>2]=n*h*k+m*e*j+l*c*i;g[a+332>>2]=n*h*f+m*e*d+l*c*b;g[a+336>>2]=0.0;g[a+340>>2]=h*k*n+e*j*m+c*i*l;g[a+344>>2]=h*k*k+e*j*j+c*i*i;g[a+348>>2]=h*k*f+e*j*d+c*i*b;g[a+352>>2]=0.0;g[a+356>>2]=h*f*n+e*d*m+c*b*l;g[a+360>>2]=h*f*k+e*d*j+c*b*i;g[a+364>>2]=h*f*f+e*d*d+c*b*b;g[a+368>>2]=0.0;return}function Nj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0;h=l;l=l+16|0;if((e|0)<=0){l=h;return}f=0;do{p=+g[b+(f<<4)>>2];o=+g[b+(f<<4)+4>>2];n=+g[b+(f<<4)+8>>2];m=p*+g[a+60>>2]+o*+g[a+64>>2]+n*+g[a+68>>2];k=p*+g[a+76>>2]+o*+g[a+80>>2]+n*+g[a+84>>2];n=p*+g[a+92>>2]+o*+g[a+96>>2]+n*+g[a+100>>2];g[h>>2]=m;g[h+4>>2]=k;g[h+8>>2]=n;g[h+12>>2]=0.0;j=a+60+((+g[h+((m>2]>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];f=f+1|0}while((f|0)!=(e|0));l=h;return}function Oj(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;c[b>>2]=5944;e=c[b+8>>2]|0;d=c[b+16>>2]|0;if((e|0)>0){h=0;do{f=(c[d+(h<<2)>>2]|0)+188|0;g=c[f>>2]|0;if(g){e=c[b+68>>2]|0;e=xb[c[(c[e>>2]|0)+36>>2]&127](e)|0;Sb[c[(c[e>>2]|0)+40>>2]&127](e,g,c[b+24>>2]|0);e=c[b+68>>2]|0;Sb[c[(c[e>>2]|0)+12>>2]&127](e,g,c[b+24>>2]|0);c[f>>2]=0;e=c[b+8>>2]|0;d=c[b+16>>2]|0}h=h+1|0}while((h|0)<(e|0))}if(!d){a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}function Pj(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0,h=0,i=0.0,j=0.0;c[a+264>>2]=c[b>>2];c[a+264+4>>2]=c[b+4>>2];c[a+264+8>>2]=c[b+8>>2];c[a+264+12>>2]=c[b+12>>2];d=c[a+248>>2]|0;if((d|0)<=0)return;h=0;do{f=c[(c[a+256>>2]|0)+(h<<2)>>2]|0;switch(c[f+220>>2]|0){case 2:case 5:break;default:if(!(c[f+564>>2]&1)){e=+g[f+404>>2];if(e!=0.0){j=1.0/e*+g[b+4>>2];i=1.0/e*+g[b+8>>2];g[f+424>>2]=1.0/e*+g[b>>2];g[f+428>>2]=j;g[f+432>>2]=i;g[f+436>>2]=0.0}c[f+440>>2]=c[b>>2];c[f+440+4>>2]=c[b+4>>2];c[f+440+8>>2]=c[b+8>>2];c[f+440+12>>2]=c[b+12>>2];d=c[a+248>>2]|0}}h=h+1|0}while((h|0)<(d|0));return}function Qj(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0,h=0.0,i=0.0,k=0.0;e=c[a+204>>2]|0;if(b==0.0){c[a+204>>2]=e|1;h=0.0}else{c[a+204>>2]=e&-2;h=1.0/b}g[a+404>>2]=h;k=+g[a+444>>2]*b;i=+g[a+448>>2]*b;g[a+424>>2]=+g[a+440>>2]*b;g[a+428>>2]=k;g[a+432>>2]=i;g[a+436>>2]=0.0;b=+g[d>>2];f=b!=0.0?(g[j>>2]=1.0/b,c[j>>2]|0):0;b=+g[d+4>>2];e=b!=0.0?(g[j>>2]=1.0/b,c[j>>2]|0):0;b=+g[d+8>>2];d=b!=0.0?(g[j>>2]=1.0/b,c[j>>2]|0):0;c[a+456>>2]=f;c[a+460>>2]=e;c[a+464>>2]=d;g[a+468>>2]=0.0;i=h*+g[a+412>>2];k=h*+g[a+416>>2];g[a+620>>2]=+g[a+408>>2]*h;g[a+624>>2]=i;g[a+628>>2]=k;g[a+632>>2]=0.0;return}function Rj(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,h=0;f=l;l=l+256|0;e=c[b+212>>2]|0;if((e|0)>-1){a=e;l=f;return a|0}h=(c[b+252>>2]&2|0)==0;e=h?0:b;do if(!h){if(!(+g[e+404>>2]!=0.0)?(c[e+204>>2]&2|0)==0:0)break;h=c[a+8>>2]|0;Yk(f|0,0,244)|0;Je(Gf(a+4|0,f)|0,b,d);c[b+212>>2]=h;l=f;return h|0}while(0);e=c[a+188>>2]|0;if((e|0)>=0){h=e;l=f;return h|0}c[a+188>>2]=c[a+8>>2];Yk(f|0,0,244)|0;Je(Gf(a+4|0,f)|0,0,d);h=c[a+188>>2]|0;l=f;return h|0}function Sj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0,i=0.0,j=0,k=0.0,l=0;k=+g[b+64>>2]*.5;l=c[b+72>>2]|0;e=+g[d>>2];f=+g[d+4>>2];i=+g[d+8>>2];i=+D(+(e*e+f*f+i*i));h=c[b+68>>2]|0;if(+g[d+(l<<2)>>2]>i*+g[b+56>>2]){g[a+(h<<2)>>2]=0.0;g[a+(l<<2)>>2]=k;k=0.0;l=c[b+76>>2]|0;l=a+(l<<2)|0;g[l>>2]=k;return}i=+g[d+(h<<2)>>2];j=c[b+76>>2]|0;e=+g[d+(j<<2)>>2];f=+D(+(i*i+e*e));if(f>1.1920928955078125e-07){f=+g[b+60>>2]/f;g[a+(h<<2)>>2]=i*f;g[a+(l<<2)>>2]=-k;k=e*f;l=j;l=a+(l<<2)|0;g[l>>2]=k;return}else{g[a+(h<<2)>>2]=0.0;g[a+(l<<2)>>2]=-k;k=0.0;l=j;l=a+(l<<2)|0;g[l>>2]=k;return}}function Tj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=c[b+296>>2]|0;if((e|0)==(c[b+300>>2]|0)?(h=e|0?e<<1:1,(e|0)<(h|0)):0){if(!h)g=0;else{c[6995]=(c[6995]|0)+1;e=sc((h<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}g=e;e=c[b+296>>2]|0}if((e|0)>0){f=0;do{c[g+(f<<2)>>2]=c[(c[b+304>>2]|0)+(f<<2)>>2];f=f+1|0}while((f|0)!=(e|0))}f=c[b+304>>2]|0;if(f){if(a[b+308>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);e=c[b+296>>2]|0}c[b+304>>2]=0}a[b+308>>0]=1;c[b+304>>2]=g;c[b+300>>2]=h}c[(c[b+304>>2]|0)+(e<<2)>>2]=d;c[b+296>>2]=e+1;return}function Uj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,h=0.0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0.0,p=0.0;n=c[b+100>>2]|0;if((n|0)<=0){c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;n=a+12|0;g[n>>2]=0.0;return}o=+g[b+16>>2];p=+g[d>>2]*o;k=+g[b+20>>2];l=+g[d+4>>2]*k;m=+g[b+24>>2];j=+g[d+8>>2]*m;f=c[b+108>>2]|0;d=-1;b=0;e=-3402823466385288598117041.0e14;while(1){h=p*+g[f+(b<<4)>>2]+l*+g[f+(b<<4)+4>>2]+j*+g[f+(b<<4)+8>>2];i=h>e;d=i?b:d;b=b+1|0;if((b|0)==(n|0))break;else e=i?h:e}l=+g[f+(d<<4)+4>>2]*k;p=+g[f+(d<<4)+8>>2]*m;g[a>>2]=+g[f+(d<<4)>>2]*o;g[a+4>>2]=l;g[a+8>>2]=p;n=a+12|0;g[n>>2]=0.0;return}function Vj(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0;e=l;l=l+96|0;c[e+32>>2]=1065353216;c[e+32+4>>2]=0;c[e+32+4+4>>2]=0;c[e+32+4+8>>2]=0;c[e+32+4+12>>2]=0;c[e+32+20>>2]=1065353216;c[e+32+24>>2]=0;c[e+32+24+4>>2]=0;c[e+32+24+8>>2]=0;c[e+32+24+12>>2]=0;c[e+32+40>>2]=1065353216;j=e+32+44|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;Vb[c[(c[a>>2]|0)+8>>2]&127](a,e+32|0,e+16|0,e);h=(+g[e>>2]-+g[e+16>>2])*.5*2.0;f=(+g[e+4>>2]-+g[e+16+4>>2])*.5*2.0;i=(+g[e+8>>2]-+g[e+16+8>>2])*.5*2.0;g[d>>2]=b/12.0*(f*f+i*i);g[d+4>>2]=b/12.0*(h*h+i*i);g[d+8>>2]=b/12.0*(h*h+f*f);l=e;return}function Wj(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;e=gt()|0;Ij(e,3,b);c[e>>2]=4828;c[e+300>>2]=c[d>>2];c[e+300+4>>2]=c[d+4>>2];c[e+300+8>>2]=c[d+8>>2];c[e+300+12>>2]=c[d+12>>2];k=+g[d>>2];j=+g[d+4>>2];i=+g[d+8>>2];h=k*+g[b+20>>2]+j*+g[b+24>>2]+i*+g[b+28>>2]+ +g[b+56>>2];f=k*+g[b+36>>2]+j*+g[b+40>>2]+i*+g[b+44>>2]+ +g[b+60>>2];g[e+316>>2]=k*+g[b+4>>2]+j*+g[b+8>>2]+i*+g[b+12>>2]+ +g[b+52>>2];g[e+320>>2]=h;g[e+324>>2]=f;g[e+328>>2]=0.0;c[e+332>>2]=0;a[e+344>>0]=0;g[e+348>>2]=.30000001192092896;g[e+352>>2]=1.0;g[e+356>>2]=0.0;return e|0}function Xj(a,b,c){a=+a;b=+b;c=+c;var d=0.0,e=0.0,f=0;if(b>=c)return +a;if(a3.1415927410125732)d=d+-6.2831854820251465}else d=d+6.2831854820251465;e=+C(+d);d=+mh(c-a,6.2831854820251465);if(!(d<-3.1415927410125732)){if(d>3.1415927410125732)d=d+-6.2831854820251465}else d=d+6.2831854820251465;f=e<+C(+d);a=f?a:a+6.2831854820251465;return +a}if(!(a>c))return +a;d=+mh(a-c,6.2831854820251465);if(!(d<-3.1415927410125732)){if(d>3.1415927410125732)d=d+-6.2831854820251465}else d=d+6.2831854820251465;e=+C(+d);d=+mh(a-b,6.2831854820251465);if(!(d<-3.1415927410125732)){if(d>3.1415927410125732)d=d+-6.2831854820251465}else d=d+6.2831854820251465;f=+C(+d)>2]|0)>(c[d+12>>2]|0);f=c[(e?d:b)+12>>2]|0;e=c[(e?b:d)+12>>2]|0;b=(((e<<16|f)+~((e<<16|f)<<15)|0)>>>10^(e<<16|f)+~((e<<16|f)<<15))*9|0;b=(((b>>>6^b)+~((b>>>6^b)<<11)|0)>>>16^(b>>>6^b)+~((b>>>6^b)<<11))&(c[a+12>>2]|0)+-1;if((b|0)>=(c[a+32>>2]|0)){g=0;return g|0}b=c[(c[a+40>>2]|0)+(b<<2)>>2]|0;if((b|0)==-1){g=0;return g|0}d=c[a+16>>2]|0;while(1){if((c[(c[d+(b<<4)>>2]|0)+12>>2]|0)==(f|0)?(c[(c[d+(b<<4)+4>>2]|0)+12>>2]|0)==(e|0):0)break;b=c[(c[a+60>>2]|0)+(b<<2)>>2]|0;if((b|0)==-1){b=0;g=8;break}}if((g|0)==8)return b|0;g=d+(b<<4)|0;return g|0}function Zj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;e=l;l=l+16|0;Sb[c[(c[b>>2]|0)+68>>2]&127](e,b,d);c[a>>2]=c[e>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];if(!(+nb[c[(c[b>>2]|0)+48>>2]&15](b)!=0.0)){l=e;return}i=+g[d>>2];h=+g[d+4>>2];f=+g[d+8>>2];k=i*i+h*h+f*f<1.4210854715202004e-14?-1.0:i;j=i*i+h*h+f*f<1.4210854715202004e-14?-1.0:h;f=i*i+h*h+f*f<1.4210854715202004e-14?-1.0:f;h=1.0/+D(+(f*f+(k*k+j*j)));i=+nb[c[(c[b>>2]|0)+48>>2]&15](b);g[a>>2]=+g[a>>2]+i*h*k;g[a+4>>2]=i*h*j+ +g[a+4>>2];g[a+8>>2]=i*h*f+ +g[a+8>>2];l=e;return}function _j(a,b,d){a=a|0;b=+b;d=+d;var e=0.0,f=0.0,h=0.0;f=+g[a+692>>2];do if(f>0.0){h=+g[a+688>>2];e=+mh(b-h,6.2831854820251465);if(!(e<-3.1415927410125732)){if(e>3.1415927410125732)e=e+-6.2831854820251465}else e=e+6.2831854820251465;if(!(!(e<-f)&e<=f))if(e>0.0){b=+mh(f+h,6.2831854820251465);if(b<-3.1415927410125732){b=b+6.2831854820251465;break}if(!(b>3.1415927410125732))break;b=b+-6.2831854820251465;break}else{b=+mh(h-f,6.2831854820251465);if(b<-3.1415927410125732){b=b+6.2831854820251465;break}if(!(b>3.1415927410125732))break;b=b+-6.2831854820251465;break}}while(0);g[a+680>>2]=(b-+bj(a,(c[a+28>>2]|0)+4|0,(c[a+32>>2]|0)+4|0))/d;return}function $j(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;a:do switch(b|0){case 2:{if((c|0)<1){d=+g[a+232>>2];break a}if((c|0)<3){d=+g[a+264>>2];break a}if((c|0)==3){d=+g[a+248>>2];break a}if((c|0)<6)d=+g[a+280>>2];else d=3402823466385288598117041.0e14;break}case 3:{if((c|0)<1){d=+g[a+212>>2];break a}if((c|0)==3)d=+g[a+228>>2];else d=3402823466385288598117041.0e14;break}case 4:{if((c|0)<1){d=+g[a+244>>2];break a}if((c|0)<3){d=+g[a+276>>2];break a}if((c|0)==3){d=+g[a+260>>2];break a}if((c|0)<6)d=+g[a+292>>2];else d=3402823466385288598117041.0e14;break}default:d=3402823466385288598117041.0e14}while(0);return +d}function ak(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;e=+g[d>>2];f=+g[d+4>>2];h=+g[d+8>>2];if(e*e+f*f+h*h==0.0)e=+g[b+36>>2];else e=+D(+(e*e+f*f+h*h));g[b+32>>2]=e;g[b+20>>2]=e;a[b+249>>0]=1;e=+g[d>>2];f=+g[d+4>>2];h=+g[d+8>>2];if(e*e+f*f+h*h==0.0){i=+g[b+256>>2];f=+g[b+260>>2];e=+g[b+264>>2];d=b+268|0}else{j=1.0/+D(+(e*e+f*f+h*h));i=e*j;f=f*j;e=h*j;d=d+12|0}d=c[d>>2]|0;g[b+272>>2]=i;g[b+276>>2]=f;g[b+280>>2]=e;c[b+284>>2]=d;d=(c[b+8>>2]|0)+52|0;c[b+116>>2]=c[d>>2];c[b+116+4>>2]=c[d+4>>2];c[b+116+8>>2]=c[d+8>>2];c[b+116+12>>2]=c[d+12>>2];return}function bk(b){b=b|0;var d=0;c[b>>2]=4080;if(a[b+476>>0]|0?(d=c[b+472>>2]|0,Ib[c[c[d>>2]>>2]&511](d),d=c[b+472>>2]|0,d|0):0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+440>>2]|0;if(d|0){if(a[b+444>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+440>>2]=0}a[b+444>>0]=1;c[b+440>>2]=0;c[b+432>>2]=0;c[b+436>>2]=0;d=c[b+356>>2]|0;if(!d){a[b+360>>0]=1;c[b+356>>2]=0;c[b+348>>2]=0;d=b+352|0;c[d>>2]=0;Qg(b);return}if(a[b+360>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+356>>2]=0;a[b+360>>0]=1;c[b+356>>2]=0;c[b+348>>2]=0;d=b+352|0;c[d>>2]=0;Qg(b);return}function ck(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0;d=l;l=l+64|0;c[d+48>>2]=0;c[d+48+4>>2]=0;c[d+48+8>>2]=0;c[d+48+12>>2]=0;i=+g[b>>2];f=+g[b+4>>2];m=+g[b+8>>2];j=+g[b+12>>2];h=i*(2.0/(i*i+f*f+m*m+j*j));e=f*(2.0/(i*i+f*f+m*m+j*j));k=m*(2.0/(i*i+f*f+m*m+j*j));g[d>>2]=1.0-(f*e+m*k);g[d+4>>2]=i*e-j*k;g[d+8>>2]=i*k+j*e;g[d+12>>2]=0.0;g[d+16>>2]=i*e+j*k;g[d+20>>2]=1.0-(i*h+m*k);g[d+24>>2]=f*k-j*h;g[d+28>>2]=0.0;g[d+32>>2]=i*k-j*e;g[d+36>>2]=f*k+j*h;g[d+40>>2]=1.0-(i*h+f*e);g[d+44>>2]=0.0;Ld(a,d);l=d;return}function dk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,k=0.0,m=0,n=0,o=0;f=l;l=l+48|0;Sb[c[(c[a>>2]|0)+124>>2]&127](a,f+32|0,e);o=c[f+32>>2]|0;n=c[f+32+4>>2]|0;m=c[f+32+8>>2]|0;c[b>>2]=o;c[b+4>>2]=n;c[b+8>>2]=m;g[b+12>>2]=0.0;e=c[(c[a>>2]|0)+64>>2]|0;k=-(c[j>>2]=o,+g[j>>2]);i=-(c[j>>2]=n,+g[j>>2]);h=-(c[j>>2]=m,+g[j>>2]);g[f>>2]=k;g[f+4>>2]=i;g[f+8>>2]=h;g[f+12>>2]=0.0;Sb[e&127](f+16|0,a,f);c[d>>2]=c[f+16>>2];c[d+4>>2]=c[f+16+4>>2];c[d+8>>2]=c[f+16+8>>2];c[d+12>>2]=c[f+16+12>>2];l=f;return}function ek(a,b,d){a=a|0;b=b|0;d=d|0;do if(!((b|0)==8&(d|0)==8)){if((b|0)==8&(d|0)==1){a=a+72|0;break}if((b|0)==1&(d|0)==8){a=a+76|0;break}if(!(d|b)){a=a+68|0;break}if((b|0)<20&(d|0)==28){a=a+84|0;break}if((b|0)==28&(d|0)<20){a=a+80|0;break}if((b|0)<20){if((d|0)<20){a=a+28|0;break}if((d+-21|0)>>>0<9){a=a+32|0;break}}else{if((d|0)<20&(b+-21|0)>>>0<9){a=a+36|0;break}if((b|0)==31)if((d|0)==31){a=a+44|0;break}else{a=a+40|0;break}}if((d|0)==31){a=a+48|0;break}else{a=a+52|0;break}}else a=a+56|0;while(0);return c[a>>2]|0}function fk(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=e|0;f=f|0;var h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0;h=l;l=l+48|0;c[h+32>>2]=e;c[h+32+4>>2]=f;n=+g[b>>2];m=+g[b+4>>2];i=+g[b+8>>2];k=+g[a+56>>2]*n+ +g[a+60>>2]*m+ +g[a+64>>2]*i;j=n*+g[a+72>>2]+m*+g[a+76>>2]+i*+g[a+80>>2];i=n*+g[a+88>>2]+m*+g[a+92>>2]+i*+g[a+96>>2];c[h>>2]=c[a+48>>2];c[h+4>>2]=h+32;g[h+8>>2]=k;g[h+12>>2]=j;g[h+16>>2]=i;g[h+20>>2]=0.0;g[h+24>>2]=d;f=c[a+44>>2]|0;d=+qb[c[(c[f>>2]|0)+12>>2]&31](f,h,1);l=h;return +d}function gk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=l;l=l+16|0;c[a+4>>2]=c[b+40>>2];e=c[b>>2]|0;c[a+80>>2]=e;if(d){c[a+48>>2]=c[b+8>>2];c[a+48+4>>2]=c[b+8+4>>2];c[a+48+8>>2]=c[b+8+8>>2];c[a+48+12>>2]=c[b+8+12>>2]}else{e=gJ(OI(e)|0)|0;fm(f,e,+g[b+8>>2],+g[b+12>>2],+g[b+16>>2]);c[a+48>>2]=c[f>>2];c[a+48+4>>2]=c[f+4>>2];c[a+48+8>>2]=c[f+8>>2];c[a+48+12>>2]=c[f+12>>2]}c[a+64>>2]=c[b+24>>2];c[a+64+4>>2]=c[b+24+4>>2];c[a+64+8>>2]=c[b+24+8>>2];c[a+64+12>>2]=c[b+24+12>>2];l=f;return +(+g[b+40>>2])}function hk(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;if(e>>>0<3)switch(b|0){case 2:{g[a+756+(e<<2)>>2]=d;c[a+1304>>2]=c[a+1304>>2]|4<>2]=d;c[a+1304>>2]=c[a+1304>>2]|2<>2]=d;c[a+1304>>2]=c[a+1304>>2]|1<>>0>=3)return;switch(b|0){case 2:{g[a+868+(e+-3<<6)+32>>2]=d;c[a+1304>>2]=c[a+1304>>2]|4<>2]=d;c[a+1304>>2]=c[a+1304>>2]|2<>2]=d;c[a+1304>>2]=c[a+1304>>2]|1<>2]=3;c[h+8>>2]=-1;c[h+12>>2]=-1;g[h+16>>2]=3402823466385288598117041.0e14;a[h+20>>0]=1;a[h+21>>0]=0;c[h+24>>2]=-1;c[h+28>>2]=b;c[h+32>>2]=d;g[h+36>>2]=0.0;g[h+40>>2]=.05000000074505806;c[h+44>>2]=0;c[h>>2]=4828;c[h+300>>2]=c[e>>2];c[h+300+4>>2]=c[e+4>>2];c[h+300+8>>2]=c[e+8>>2];c[h+300+12>>2]=c[e+12>>2];c[h+316>>2]=c[f>>2];c[h+316+4>>2]=c[f+4>>2];c[h+316+8>>2]=c[f+8>>2];c[h+316+12>>2]=c[f+12>>2];c[h+332>>2]=0;a[h+344>>0]=0;g[h+348>>2]=.30000001192092896;g[h+352>>2]=1.0;g[h+356>>2]=0.0;return h|0}function jk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=c[b+252>>2]|0;if((b|0)==0|(d|0)!=8)if((b|0)==0|(d&2|0)==0){ki(a,b);return}else{Ob[c[(c[a>>2]|0)+92>>2]&127](a,b);return}f=c[a+348>>2]|0;a:do if((f|0)>0){e=c[a+356>>2]|0;d=0;while(1){if((c[e+(d<<2)>>2]|0)==(b|0))break a;d=d+1|0;if((d|0)>=(f|0)){d=f;break}}}else d=f;while(0);if((f|0)>(d|0)){g=c[a+356>>2]|0;d=g+(d<<2)|0;e=c[d>>2]|0;c[d>>2]=c[g+(f+-1<<2)>>2];c[(c[a+356>>2]|0)+(f+-1<<2)>>2]=e;c[a+348>>2]=f+-1}ki(a,b);return}function kk(b){b=b|0;var d=0;c[b>>2]=4580;d=c[b+80>>2]|0;if(d|0){if(a[b+84>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+80>>2]=0}a[b+84>>0]=1;c[b+80>>2]=0;c[b+72>>2]=0;c[b+76>>2]=0;d=c[b+60>>2]|0;if(d|0){if(a[b+64>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+60>>2]=0}a[b+64>>0]=1;c[b+60>>2]=0;c[b+52>>2]=0;c[b+56>>2]=0;d=c[b+40>>2]|0;if(!d){a[b+44>>0]=1;c[b+40>>2]=0;c[b+32>>2]=0;b=b+36|0;c[b>>2]=0;return}if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+40>>2]=0;a[b+44>>0]=1;c[b+40>>2]=0;c[b+32>>2]=0;b=b+36|0;c[b>>2]=0;return}function lk(b){b=b|0;var d=0;c[b>>2]=9068;d=c[b+60>>2]|0;if(d|0){if(a[b+64>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+60>>2]=0}a[b+64>>0]=1;c[b+60>>2]=0;c[b+52>>2]=0;c[b+56>>2]=0;d=c[b+40>>2]|0;if(d|0){if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+40>>2]=0}a[b+44>>0]=1;c[b+40>>2]=0;c[b+32>>2]=0;c[b+36>>2]=0;d=c[b+16>>2]|0;if(!d){a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}function mk(b){b=b|0;var d=0;c[b>>2]=5768;d=c[b+56>>2]|0;if(d|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;d=c[b+36>>2]|0;if(d|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;d=c[b+16>>2]|0;if(!d){d=b+12|0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[d>>2]=0;return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;d=b+12|0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[d>>2]=0;return}function nk(b){b=b|0;var d=0;c[b>>2]=9668;d=c[b+56>>2]|0;if(d|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;d=c[b+36>>2]|0;if(d|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;d=c[b+16>>2]|0;if(!d){a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}function ok(b){b=b|0;var d=0,e=0,f=0;e=Ds(10448)|0;c[e>>2]=5444;c[e+4>>2]=2;a[e+24>>0]=1;c[e+20>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+28>>2]=5916;g[e+60>>2]=0.0;c[e+10444>>2]=b;c[e+64>>2]=79;c[e+68>>2]=xb[c[(c[b>>2]|0)+12>>2]&127](b)|0;c[e+72>>2]=xb[c[(c[b>>2]|0)+8>>2]&127](b)|0;b=0;do{d=0;do{f=c[e+10444>>2]|0;c[e+76+(b*144|0)+(d<<2)>>2]=Bb[c[(c[f>>2]|0)+16>>2]&63](f,b,d)|0;f=c[e+10444>>2]|0;c[e+5260+(b*144|0)+(d<<2)>>2]=Bb[c[(c[f>>2]|0)+20>>2]&63](f,b,d)|0;d=d+1|0}while((d|0)<36);b=b+1|0}while((b|0)<36);return e|0}function pk(){var a=0,b=0,d=0,e=0;e=l;l=l+48|0;a=ts()|0;if(a|0?(d=c[a>>2]|0,d|0):0){b=c[d+48>>2]|0;a=c[d+48+4>>2]|0;if(!((b&-256|0)==1126902528&(a|0)==1129074247)){c[e+24>>2]=21877;Ww(21827,e+24|0)}if((b|0)==1126902529&(a|0)==1129074247)a=c[d+44>>2]|0;else a=d+80|0;c[e+36>>2]=a;d=c[d>>2]|0;a=c[d+4>>2]|0;if(ql(2784,d,e+36|0)|0){d=c[e+36>>2]|0;d=xb[c[(c[d>>2]|0)+8>>2]&127](d)|0;c[e>>2]=21877;c[e+4>>2]=a;c[e+8>>2]=d;Ww(21741,e)}else{c[e+16>>2]=21877;c[e+16+4>>2]=a;Ww(21786,e+16|0)}}Ww(21865,e+32|0)}function qk(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[d>>2]|0;b=zb[c[(c[b>>2]|0)+56>>2]&31](b,156)|0;d=c[d>>2]|0;c[b+4>>2]=d;c[b>>2]=3848;a[b+8>>0]=1;c[b+12>>2]=4060;c[b+60>>2]=d;c[b+64>>2]=0;a[b+88>>0]=1;c[b+84>>2]=0;c[b+76>>2]=0;c[b+80>>2]=0;a[b+108>>0]=1;c[b+104>>2]=0;c[b+96>>2]=0;c[b+100>>2]=0;a[b+128>>0]=1;c[b+124>>2]=0;c[b+116>>2]=0;c[b+120>>2]=0;a[b+148>>0]=1;c[b+144>>2]=0;c[b+136>>2]=0;c[b+140>>2]=0;c[b+16>>2]=c[f+8>>2];c[b+20>>2]=c[e+8>>2];gj(b+72|0);return b|0}function rk(b){b=b|0;var d=0;c[b>>2]=5400;d=c[b+344>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+344>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b>>2]=5356;d=c[b+336>>2]|0;if(d|0){if(a[b+340>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+336>>2]=0}a[b+340>>0]=1;c[b+336>>2]=0;c[b+328>>2]=0;c[b+332>>2]=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(!d){a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;b=b+292|0;c[b>>2]=0;return}if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;b=b+292|0;c[b>>2]=0;return}function sk(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[d>>2]|0;b=zb[c[(c[b>>2]|0)+56>>2]&31](b,156)|0;d=c[d>>2]|0;c[b+4>>2]=d;c[b>>2]=3848;a[b+8>>0]=0;c[b+12>>2]=4060;c[b+60>>2]=d;c[b+64>>2]=0;a[b+88>>0]=1;c[b+84>>2]=0;c[b+76>>2]=0;c[b+80>>2]=0;a[b+108>>0]=1;c[b+104>>2]=0;c[b+96>>2]=0;c[b+100>>2]=0;a[b+128>>0]=1;c[b+124>>2]=0;c[b+116>>2]=0;c[b+120>>2]=0;a[b+148>>0]=1;c[b+144>>2]=0;c[b+136>>2]=0;c[b+140>>2]=0;c[b+16>>2]=c[e+8>>2];c[b+20>>2]=c[f+8>>2];gj(b+72|0);return b|0}function tk(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=+e;f=f|0;h=h|0;var i=0;i=l;l=l+64|0;c[i+48>>2]=f;c[i+48+4>>2]=h;f=c[a+212>>2]|0;if(!(+g[f+4>>2]>=e)){l=i;return +e}c[i>>2]=c[a+216>>2];c[i+4>>2]=i+48;c[i+8>>2]=c[b>>2];c[i+8+4>>2]=c[b+4>>2];c[i+8+8>>2]=c[b+8>>2];c[i+8+12>>2]=c[b+12>>2];c[i+24>>2]=c[d>>2];c[i+24+4>>2]=c[d+4>>2];c[i+24+8>>2]=c[d+8>>2];c[i+24+12>>2]=c[d+12>>2];g[i+40>>2]=e;e=+qb[c[(c[f>>2]|0)+12>>2]&31](f,i,1);l=i;return +e}function uk(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0;i=Ts()|0;He(i,b,d,e,f,h);c[i>>2]=4764;c[i+4>>2]=9;a[i+1309>>0]=0;g[i+1316>>2]=0.0;g[i+1340>>2]=0.0;g[i+1364>>2]=1.0;a[i+1310>>0]=0;g[i+1320>>2]=0.0;g[i+1344>>2]=0.0;g[i+1368>>2]=1.0;a[i+1311>>0]=0;g[i+1324>>2]=0.0;g[i+1348>>2]=0.0;g[i+1372>>2]=1.0;a[i+1312>>0]=0;g[i+1328>>2]=0.0;g[i+1352>>2]=0.0;g[i+1376>>2]=1.0;a[i+1313>>0]=0;g[i+1332>>2]=0.0;g[i+1356>>2]=0.0;g[i+1380>>2]=1.0;a[i+1314>>0]=0;g[i+1336>>2]=0.0;g[i+1360>>2]=0.0;g[i+1384>>2]=1.0;return i|0}function vk(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0.0,f=0.0,h=0.0,i=0.0;c=l;l=l+48|0;d=2.0/+EF(b);f=+g[(gJ(b)|0)>>2];e=+g[(OI(b)|0)>>2];i=+g[(NI(b)|0)>>2];h=+g[(MI(b)|0)>>2];g[c+32>>2]=1.0-(e*e*d+i*i*d);g[c+28>>2]=f*e*d-h*i*d;g[c+24>>2]=f*i*d+h*e*d;g[c+20>>2]=f*e*d+h*i*d;g[c+16>>2]=1.0-(f*f*d+i*i*d);g[c+12>>2]=e*i*d-h*f*d;g[c+8>>2]=f*i*d-h*e*d;g[c+4>>2]=e*i*d+h*f*d;g[c>>2]=1.0-(f*f*d+e*e*d);Ip(a,c+32|0,c+28|0,c+24|0,c+20|0,c+16|0,c+12|0,c+8|0,c+4|0,c);l=c;return}function wk(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=c[e+16>>2]|0;if(!f){if(!(bp(e)|0)){g=c[e+16>>2]|0;h=5}}else{g=f;h=5}a:do if((h|0)==5){f=c[e+20>>2]|0;if((g-f|0)>>>0>>0){Bb[c[e+36>>2]&63](e,b,d)|0;break}b:do if((a[e+75>>0]|0)>-1){h=d;while(1){if(!h){g=b;break b}g=h+-1|0;if((a[b+g>>0]|0)==10)break;else h=g}if((Bb[c[e+36>>2]&63](e,b,h)|0)>>>0>>0)break a;g=b+h|0;d=d-h|0;f=c[e+20>>2]|0}else g=b;while(0);gi(f|0,g|0,d|0)|0;c[e+20>>2]=(c[e+20>>2]|0)+d}while(0);return}function xk(a,b,d){a=a|0;b=b|0;d=d|0;do if(!((b|0)==8&(d|0)==8)){if((b|0)==8&(d|0)==1){a=a+72|0;break}if((b|0)==1&(d|0)==8){a=a+76|0;break}if((b|0)<20&(d|0)==28){a=a+84|0;break}if((b|0)==28&(d|0)<20){a=a+80|0;break}if((b|0)<20){if((d|0)<20){a=a+28|0;break}if((d+-21|0)>>>0<9){a=a+32|0;break}}else{if((d|0)<20&(b+-21|0)>>>0<9){a=a+36|0;break}if((b|0)==31)if((d|0)==31){a=a+44|0;break}else{a=a+40|0;break}}if((d|0)==31){a=a+48|0;break}else{a=a+52|0;break}}else a=a+56|0;while(0);return c[a>>2]|0}function yk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;e=l;l=l+16|0;Sb[c[(c[b>>2]|0)+68>>2]&127](e,b,d);c[a>>2]=c[e>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];i=+g[d>>2];h=+g[d+4>>2];f=+g[d+8>>2];k=i*i+h*h+f*f<1.4210854715202004e-14?-1.0:i;j=i*i+h*h+f*f<1.4210854715202004e-14?-1.0:h;f=i*i+h*h+f*f<1.4210854715202004e-14?-1.0:f;h=1.0/+D(+(f*f+(k*k+j*j)));i=+nb[c[(c[b>>2]|0)+48>>2]&15](b);g[a>>2]=+g[a>>2]+i*h*k;g[a+4>>2]=i*h*j+ +g[a+4>>2];g[a+8>>2]=i*h*f+ +g[a+8>>2];l=e;return}function zk(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=l;l=l+48|0;e=$G(b,0)|0;g[d+32>>2]=+Dp(c,e);g[d+28>>2]=+ep(c,e);g[d+24>>2]=+dp(c,e);e=$G(b,1)|0;g[d+20>>2]=+Dp(c,e);g[d+16>>2]=+ep(c,e);g[d+12>>2]=+dp(c,e);b=$G(b,2)|0;g[d+8>>2]=+Dp(c,b);g[d+4>>2]=+ep(c,b);g[d>>2]=+dp(c,b);Sq(a,d+32|0,d+28|0,d+24|0,d+20|0,d+16|0,d+12|0,d+8|0,d+4|0,d);l=d;return}function Ak(a,b,c,d){a=a|0;b=b|0;c=+c;d=+d;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;i=+F(+c);h=+G(+c);c=+g[b+444>>2];if(+C(+i)>1.1920928955078125e-07){j=+g[b+448>>2];e=h*h;f=i*i;c=+D(+((h*h/(i*i)+1.0)/(1.0/(j*j)+h*h/(i*i)/(c*c))))}else{e=h*h;f=i*i}c=c*.5;j=+G(+c)/+D(+(f+0.0+e));c=+F(+c);k=c*d+i*j*0.0-h*j*-0.0;f=c*0.0-h*j*d-j*0.0*0.0;e=c*0.0+j*0.0*0.0-i*j*d;d=-(j*0.0*d)-i*j*0.0-h*j*-0.0;g[a>>2]=h*j*f+(c*k+d*-(j*0.0))-e*-(i*j);g[a+4>>2]=e*-(j*0.0)+(c*f+d*-(i*j))-h*j*k;g[a+8>>2]=k*-(i*j)+(h*j*d+c*e)-f*-(j*0.0);g[a+12>>2]=0.0;return}function Bk(b,d){b=b|0;d=d|0;var e=0,f=0,h=0;g[b+20>>2]=0.0;g[b+24>>2]=0.0;a[b+248>>0]=0;a[b+249>>0]=0;g[b+252>>2]=0.0;c[b+68>>2]=0;c[b+68+4>>2]=0;c[b+68+8>>2]=0;c[b+68+12>>2]=0;b=c[(c[b+8>>2]|0)+344>>2]|0;if((c[(xb[c[(c[b>>2]|0)+28>>2]&127](b)|0)+4>>2]|0)<=0)return;do{f=c[b>>2]|0;h=c[f+12>>2]|0;f=c[c[(xb[c[f+28>>2]&127](b)|0)+12>>2]>>2]|0;e=c[(c[(xb[c[(c[b>>2]|0)+28>>2]&127](b)|0)+12>>2]|0)+4>>2]|0;Cb[h&31](b,f,e,c[d+24>>2]|0)|0}while((c[(xb[c[(c[b>>2]|0)+28>>2]&127](b)|0)+4>>2]|0)>0);return}function Ck(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;c[6131]=(c[6131]|0)+-1;Ob[c[(c[a>>2]|0)+20>>2]&127](a,b);e=c[b+800>>2]|0;d=(c[a+12>>2]|0)+-1|0;g=c[a+20>>2]|0;f=c[g+(e<<2)>>2]|0;c[g+(e<<2)>>2]=c[g+(d<<2)>>2];c[(c[a+20>>2]|0)+(d<<2)>>2]=f;c[(c[(c[a+20>>2]|0)+(e<<2)>>2]|0)+800>>2]=e;c[a+12>>2]=d;a=c[a+72>>2]|0;if(!b)return;g=c[a+16>>2]|0;if(g>>>0<=b>>>0?(g+(P(c[a>>2]|0,c[a+4>>2]|0)|0)|0)>>>0>b>>>0:0){c[b>>2]=c[a+12>>2];c[a+12>>2]=b;c[a+8>>2]=(c[a+8>>2]|0)+1;return}c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function Dk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=c[b+8>>2]|0;if((k|0)<=0)return;j=c[b+16>>2]|0;i=0;b=0;do{h=c[j+(i<<2)>>2]|0;if(!(c[h+204>>2]&3)){g=c[a+16>>2]|0;e=g+(b<<3)|0;d=c[e>>2]|0;if((d|0)==(b|0))d=b;else{f=d;do{d=g+(f<<3)|0;c[e>>2]=c[d>>2];d=c[d>>2]|0;e=g+(d<<3)|0;f=c[e>>2]|0}while((d|0)!=(f|0))}c[h+208>>2]=d;c[g+(b<<3)+4>>2]=i;c[h+212>>2]=-1;b=b+1|0}else{c[h+208>>2]=-1;c[h+212>>2]=-2}i=i+1|0}while((i|0)!=(k|0));return}function Ek(a,b,d,f){a=a|0;b=b|0;d=d|0;f=f|0;var g=0,h=0,i=0;while(1){g=c[a+12>>2]|0;if(!(((e[f>>1]|0)>=(e[a>>1]|0)?(e[d>>1]|0)<=(e[a+6>>1]|0):0)&(e[d+4>>1]|0)<=(e[a+10>>1]|0)&(e[f+4>>1]|0)>=(e[a+4>>1]|0)&(e[d+2>>1]|0)<=(e[a+8>>1]|0)&(e[f+2>>1]|0)>=(e[a+2>>1]|0))){h=6;break}if((g|0)>-1)break;i=a+16|0;Ek(i,b,d,f);g=c[a+28>>2]|0;a=i+(((g|0)>-1?1:0-g|0)<<4)|0}if((h|0)==6)return;Sb[c[(c[b>>2]|0)+8>>2]&127](b,g>>>21,g&2097151);return}function Fk(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=Ts()|0;Yd(f,b,d,e);c[f>>2]=4764;c[f+4>>2]=9;a[f+1309>>0]=0;g[f+1316>>2]=0.0;g[f+1340>>2]=0.0;g[f+1364>>2]=1.0;a[f+1310>>0]=0;g[f+1320>>2]=0.0;g[f+1344>>2]=0.0;g[f+1368>>2]=1.0;a[f+1311>>0]=0;g[f+1324>>2]=0.0;g[f+1348>>2]=0.0;g[f+1372>>2]=1.0;a[f+1312>>0]=0;g[f+1328>>2]=0.0;g[f+1352>>2]=0.0;g[f+1376>>2]=1.0;a[f+1313>>0]=0;g[f+1332>>2]=0.0;g[f+1356>>2]=0.0;g[f+1380>>2]=1.0;a[f+1314>>0]=0;g[f+1336>>2]=0.0;g[f+1360>>2]=0.0;g[f+1384>>2]=1.0;return f|0}function Gk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0;h=+g[a+60>>2];k=+g[a+76>>2]-h;j=+g[a+64>>2];i=+g[a+80>>2]-j;l=+g[a+68>>2];m=+g[a+84>>2]-l;h=+g[a+92>>2]-h;j=+g[a+96>>2]-j;l=+g[a+100>>2]-l;g[d+12>>2]=0.0;f=1.0/+D(+((k*j-i*h)*(k*j-i*h)+((i*l-m*j)*(i*l-m*j)+(m*h-k*l)*(m*h-k*l))));g[d>>2]=(i*l-m*j)*f;g[d+4>>2]=(m*h-k*l)*f;g[d+8>>2]=(k*j-i*h)*f;c[e>>2]=c[a+60>>2];c[e+4>>2]=c[a+60+4>>2];c[e+8>>2]=c[a+60+8>>2];c[e+12>>2]=c[a+60+12>>2];return}function Hk(b){b=b|0;var d=0,e=0;c[b>>2]=6400;if(a[b+52>>0]|0?(d=c[b+56>>2]|0,d|0):0){e=c[b+4>>2]|0;Ob[c[(c[e>>2]|0)+16>>2]&127](e,d)}d=c[b+44>>2]|0;if(d|0){if(a[b+48>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+44>>2]=0}a[b+48>>0]=1;c[b+44>>2]=0;c[b+36>>2]=0;c[b+40>>2]=0;d=c[b+24>>2]|0;if(!d){a[b+28>>0]=1;c[b+24>>2]=0;c[b+16>>2]=0;e=b+20|0;c[e>>2]=0;return}if(a[b+28>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+24>>2]=0;a[b+28>>0]=1;c[b+24>>2]=0;c[b+16>>2]=0;e=b+20|0;c[e>>2]=0;return}function Ik(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+224|0;e=g+80|0;f=e+40|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));c[g+120>>2]=c[d>>2];if((Xc(0,b,g+120|0,g,g+80|0)|0)>=0){e=c[2444]|0;if((a[9850]|0)<1)c[2444]=e&-33;if(!(c[2456]|0)){d=c[2455]|0;c[2455]=g+136;c[2451]=g+136;c[2449]=g+136;c[2456]=80;c[2448]=g+136+80;Xc(9776,b,g+120|0,g,g+80|0)|0;if(d|0){Bb[c[9812>>2]&63](9776,0,0)|0;c[2455]=d;c[2456]=0;c[2448]=0;c[2451]=0;c[2449]=0}}else Xc(9776,b,g+120|0,g,g+80|0)|0;c[2444]=c[2444]|e&32}l=g;return}function Jk(b,d){b=b|0;d=d|0;do if(b){if(d>>>0<128){a[b>>0]=d;b=1;break}if(!(c[7131]|0))if((d&-128|0)==57216){a[b>>0]=d;b=1;break}else{c[7137]=84;b=-1;break}if(d>>>0<2048){a[b>>0]=d>>>6|192;a[b+1>>0]=d&63|128;b=2;break}if(d>>>0<55296|(d&-8192|0)==57344){a[b>>0]=d>>>12|224;a[b+1>>0]=d>>>6&63|128;a[b+2>>0]=d&63|128;b=3;break}if((d+-65536|0)>>>0<1048576){a[b>>0]=d>>>18|240;a[b+1>>0]=d>>>12&63|128;a[b+2>>0]=d>>>6&63|128;a[b+3>>0]=d&63|128;b=4;break}else{c[7137]=84;b=-1;break}}else b=1;while(0);return b|0}function Kk(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;i=+g[a+60>>2];k=+g[a+76>>2]-i;j=+g[a+64>>2];f=+g[a+80>>2]-j;d=+g[a+68>>2];h=+g[a+84>>2]-d;i=+g[a+92>>2]-i;j=+g[a+96>>2]-j;d=+g[a+100>>2]-d;g[c+12>>2]=0.0;e=1.0/+D(+((k*j-f*i)*(k*j-f*i)+((f*d-h*j)*(f*d-h*j)+(h*i-k*d)*(h*i-k*d))));g[c>>2]=(f*d-h*j)*e;g[c+4>>2]=(h*i-k*d)*e;g[c+8>>2]=(k*j-f*i)*e;if(!b)return;g[c>>2]=-((f*d-h*j)*e);g[c+4>>2]=-((h*i-k*d)*e);g[c+8>>2]=-((k*j-f*i)*e);return}function Lk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=c[a+780>>2]|0;g=c[a+812>>2]|0;if((g|0)<=0){h=0;return h|0}f=c[a+820>>2]|0;a=0;while(1){i=c[f+(a*44|0)+8>>2]|0;if(((i|0)==(h+(e*104|0)|0)|((i|0)==(h+(b*104|0)|0)|(i|0)==(h+(d*104|0)|0))?(i=c[f+(a*44|0)+12>>2]|0,(i|0)==(h+(e*104|0)|0)|((i|0)==(h+(b*104|0)|0)|(i|0)==(h+(d*104|0)|0))):0)?(i=c[f+(a*44|0)+16>>2]|0,(i|0)==(h+(e*104|0)|0)|((i|0)==(h+(b*104|0)|0)|(i|0)==(h+(d*104|0)|0))):0){a=1;f=7;break}a=a+1|0;if((a|0)>=(g|0)){a=0;f=7;break}}if((f|0)==7)return a|0;return 0}function Mk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;f=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=f;if(f|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;c[b+28>>2]=c[a+32>>2];c[b+32>>2]=c[a+36>>2];c[b+36>>2]=c[a+40>>2];c[b+40>>2]=c[a+44>>2];c[b+12>>2]=c[a+16>>2];c[b+16>>2]=c[a+20>>2];c[b+20>>2]=c[a+24>>2];c[b+24>>2]=c[a+28>>2];c[b+44>>2]=c[a+48>>2];c[b+48>>2]=0;c[b+52>>2]=c[a+56>>2];c[b+56>>2]=0;return 17763}function Nk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0,j=0;i=c[a+100>>2]|0;j=c[a+108>>2]|0;f=+g[j+(((b|0)%(i|0)|0)<<4)+4>>2]*+g[a+20>>2];h=+g[j+(((b|0)%(i|0)|0)<<4)+8>>2]*+g[a+24>>2];g[d>>2]=+g[j+(((b|0)%(i|0)|0)<<4)>>2]*+g[a+16>>2];g[d+4>>2]=f;g[d+8>>2]=h;g[d+12>>2]=0.0;d=c[a+108>>2]|0;h=+g[d+(((b+1|0)%(i|0)|0)<<4)+4>>2]*+g[a+20>>2];f=+g[d+(((b+1|0)%(i|0)|0)<<4)+8>>2]*+g[a+24>>2];g[e>>2]=+g[d+(((b+1|0)%(i|0)|0)<<4)>>2]*+g[a+16>>2];g[e+4>>2]=h;g[e+8>>2]=f;g[e+12>>2]=0.0;return}function Ok(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;f=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=f;if(f|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;c[b+28>>2]=c[a+32>>2];c[b+32>>2]=c[a+36>>2];c[b+36>>2]=c[a+40>>2];c[b+40>>2]=c[a+44>>2];c[b+12>>2]=c[a+16>>2];c[b+16>>2]=c[a+20>>2];c[b+20>>2]=c[a+24>>2];c[b+24>>2]=c[a+28>>2];c[b+44>>2]=c[a+48>>2];c[b+48>>2]=0;c[b+52>>2]=c[a+56>>2];c[b+56>>2]=0;return 17307}function Pk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,h=0,i=0;e=l;l=l+32|0;d=c[a+184>>2]|0;if(+g[d+4>>2]==0.0){d=0;l=e;return d|0}b=c[b>>2]|0;if(!(zb[c[(c[d>>2]|0)+8>>2]&31](d,c[b+188>>2]|0)|0)){d=1;l=e;return d|0}h=c[a+192>>2]|0;i=c[b+192>>2]|0;d=c[a+184>>2]|0;f=+g[a+188>>2];c[e>>2]=0;c[e+4>>2]=i;c[e+8>>2]=b;c[e+12>>2]=b+4;c[e+16>>2]=-1;c[e+20>>2]=-1;vc(h,a+36|0,a+100|0,e,d,f);d=1;l=e;return d|0}function Qk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;f=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=f;if(f|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;c[b+28>>2]=c[a+32>>2];c[b+32>>2]=c[a+36>>2];c[b+36>>2]=c[a+40>>2];c[b+40>>2]=c[a+44>>2];c[b+12>>2]=c[a+16>>2];c[b+16>>2]=c[a+20>>2];c[b+20>>2]=c[a+24>>2];c[b+24>>2]=c[a+28>>2];c[b+44>>2]=c[a+48>>2];c[b+48>>2]=0;c[b+52>>2]=c[a+72>>2];c[b+56>>2]=0;return 16327}function Rk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;e=l;l=l+16|0;k=+g[d>>2];j=+g[d+4>>2];i=+g[d+8>>2];h=k*+g[b+60>>2]+j*+g[b+64>>2]+i*+g[b+68>>2];f=k*+g[b+76>>2]+j*+g[b+80>>2]+i*+g[b+84>>2];i=k*+g[b+92>>2]+j*+g[b+96>>2]+i*+g[b+100>>2];g[e>>2]=h;g[e+4>>2]=f;g[e+8>>2]=i;g[e+12>>2]=0.0;d=b+60+((+g[e+((h>2]>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];l=e;return}function Sk(a,b){a=a|0;b=b|0;var d=0;d=l;l=l+16|0;c[d>>2]=c[b>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];b=c[a+8>>2]|0;c[b+304>>2]=(c[b+304>>2]|0)+1;c[b+4>>2]=1065353216;c[b+8>>2]=0;c[b+8+4>>2]=0;c[b+8+8>>2]=0;c[b+8+12>>2]=0;c[b+24>>2]=1065353216;c[b+28>>2]=0;c[b+28+4>>2]=0;c[b+28+8>>2]=0;c[b+28+12>>2]=0;c[b+44>>2]=1065353216;c[b+48>>2]=0;c[b+52>>2]=c[d>>2];c[b+52+4>>2]=c[d+4>>2];c[b+52+8>>2]=c[d+8>>2];c[b+52+12>>2]=c[d+12>>2];l=d;return}function Tk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;do switch(b|0){case 0:{b=1;f=0;break}case 1:{b=2;f=0;break}case 2:{b=3;f=1;break}case 3:{f=2;break}case 4:{f=0;break}case 5:{f=1;break}case 6:{f=2;break}case 7:{f=3;break}case 8:{b=5;f=4;break}case 9:{b=6;f=4;break}case 10:{b=7;f=5;break}case 11:{b=7;f=6;break}default:{b=0;f=0}}while(0);Sb[c[(c[a>>2]|0)+108>>2]&127](a,f,d);Sb[c[(c[a>>2]|0)+108>>2]&127](a,b,e);return}function Uk(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0;k=+nb[c[(c[a>>2]|0)+48>>2]&15](a);h=+nb[c[(c[a>>2]|0)+48>>2]&15](a);d=+nb[c[(c[a>>2]|0)+48>>2]&15](a);m=(k+ +g[a+32>>2])/+g[a+16>>2];j=(h+ +g[a+36>>2])/+g[a+20>>2];f=(d+ +g[a+40>>2])/+g[a+24>>2];l=+C(+(+g[b>>2]));i=+C(+(+g[b+4>>2]));e=+C(+(+g[b+8>>2]));g[a+16>>2]=l;g[a+20>>2]=i;g[a+24>>2]=e;g[a+28>>2]=0.0;g[a+32>>2]=m*l-k;g[a+36>>2]=j*i-h;g[a+40>>2]=f*e-d;g[a+44>>2]=0.0;return}function Vk(a,b,d,e,f,h,i,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0,m=0,n=0.0,o=0;bc[c[(c[a>>2]|0)+32>>2]&1](a,b,d,e,f,h,i,j,k);l=c[a+184>>2]|0;m=c[j+20>>2]|0;m=(l|0)>(m|0)?l:m;if((m|0)<=0)return 0.0;l=0;do{n=+wb[c[(c[a>>2]|0)+40>>2]&3](a,l,b,d,e,f,h,i,j,k);g[a+228>>2]=n;o=l;l=l+1|0}while(((o|0)<(m+-1|0)?!(n<=+g[j+92>>2]):0)&(l|0)<(m|0));return 0.0}function Wk(b,d){b=b|0;d=d|0;var e=0,f=0,h=0.0,i=0,j=0;if(a[b+527>>0]|0){c[d>>2]=0;c[d+4>>2]=0;return}c[d>>2]=3;c[d+4>>2]=3;j=c[b+28>>2]|0;i=c[b+32>>2]|0;xc(b,j+4|0,i+4|0,j+324|0,i+324|0);if((a[b+526>>0]|0?(e=c[d>>2]|0,c[d>>2]=e+1,f=c[d+4>>2]|0,c[d+4>>2]=f+-1,h=+g[b+456>>2],+g[b+444>>2]>2]>2]=e+2;c[d+4>>2]=f+-2}if(!(a[b+525>>0]|0))return;c[d>>2]=(c[d>>2]|0)+1;c[d+4>>2]=(c[d+4>>2]|0)+-1;return}function Xk(b,d,e,f,h){b=b|0;d=+d;e=e|0;f=f|0;h=h|0;g[b>>2]=d;c[b+4>>2]=e;c[b+72>>2]=f;c[b+76>>2]=c[h>>2];c[b+76+4>>2]=c[h+4>>2];c[b+76+8>>2]=c[h+8>>2];c[b+76+12>>2]=c[h+12>>2];g[b+92>>2]=0.0;g[b+96>>2]=0.0;g[b+100>>2]=.5;g[b+104>>2]=0.0;g[b+108>>2]=0.0;g[b+112>>2]=0.0;g[b+116>>2]=.800000011920929;g[b+120>>2]=1.0;a[b+124>>0]=0;g[b+128>>2]=.004999999888241291;g[b+132>>2]=.009999999776482582;g[b+136>>2]=.009999999776482582;g[b+140>>2]=.009999999776482582;kr(b+8|0);return}function Yk(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;f=b+e|0;d=d&255;if((e|0)>=67){while(b&3){a[b>>0]=d;b=b+1|0}g=d|d<<8|d<<16|d<<24;while((b|0)<=((f&-4)-64|0)){c[b>>2]=g;c[b+4>>2]=g;c[b+8>>2]=g;c[b+12>>2]=g;c[b+16>>2]=g;c[b+20>>2]=g;c[b+24>>2]=g;c[b+28>>2]=g;c[b+32>>2]=g;c[b+36>>2]=g;c[b+40>>2]=g;c[b+44>>2]=g;c[b+48>>2]=g;c[b+52>>2]=g;c[b+56>>2]=g;c[b+60>>2]=g;b=b+64|0}while((b|0)<(f&-4|0)){c[b>>2]=g;b=b+4|0}}while((b|0)<(f|0)){a[b>>0]=d;b=b+1|0}return f-e|0}function Zk(a,b,c,d,e,f,h,i,j,k){a=+a;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;i=+i;j=+j;k=k|0;if(!(((h-d)*b-(i-e)*a)*f+(((i-e)*c-(j-f)*b)*d+((j-f)*a-(h-d)*c)*e)<0.0)){k=0;return k|0}do if(!((h-d)*d+(i-e)*e+(j-f)*f>0.0))if((h-d)*h+(i-e)*i+(j-f)*j<0.0){a=h*h+i*i+j*j;break}else{a=((h*h+i*i+j*j)*(d*d+e*e+f*f)-(h*d+i*e+j*f)*(h*d+i*e+j*f))/((h-d)*(h-d)+(i-e)*(i-e)+(j-f)*(j-f));a=a>0.0?a:0.0;break}else a=d*d+e*e+f*f;while(0);g[k>>2]=+D(+a);k=1;return k|0}function _k(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0,h=0,i=0;b=c[b+36>>2]|0;i=c[b+8>>2]|0;h=c[b+12>>2]|0;f=c[b+16>>2]|0;e=+g[a+52>>2];d=+Gh(a+4|0,+g[a+36>>2],+g[a+40>>2],+g[a+44>>2],+g[i+8>>2],+g[i+12>>2],+g[i+16>>2],+g[h+8>>2],+g[h+12>>2],+g[h+16>>2],+g[f+8>>2],+g[f+12>>2],+g[f+16>>2],e);if(!(d>0.0&d>2]|0;h=h+1|0;c[i>>2]=h;return}g[a+52>>2]=d;c[a+56>>2]=b;i=a+60|0;h=c[i>>2]|0;h=h+1|0;c[i>>2]=h;return}function $k(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;a:do if(c>>>0>=3)if((c+-3|0)>>>0<3)switch(b|0){case 2:{d=+g[a+868+(c+-3<<6)+32>>2];break a}case 4:{d=+g[a+868+(c+-3<<6)+36>>2];break a}case 3:{d=+g[a+868+(c+-3<<6)+28>>2];break a}default:{d=0.0;break a}}else d=0.0;else switch(b|0){case 2:{d=+g[a+756+(c<<2)>>2];break a}case 4:{d=+g[a+772+(c<<2)>>2];break a}case 3:{d=+g[a+740+(c<<2)>>2];break a}default:{d=0.0;break a}}while(0);return +d}function al(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;Sb[c[(c[b>>2]|0)+68>>2]&127](a,b,d);if(!(+nb[c[(c[b>>2]|0)+48>>2]&15](b)!=0.0))return;h=+g[d>>2];f=+g[d+4>>2];e=+g[d+8>>2];j=h*h+f*f+e*e<1.4210854715202004e-14?-1.0:h;i=h*h+f*f+e*e<1.4210854715202004e-14?-1.0:f;e=h*h+f*f+e*e<1.4210854715202004e-14?-1.0:e;f=1.0/+D(+(e*e+(j*j+i*i)));h=+nb[c[(c[b>>2]|0)+48>>2]&15](b);g[a>>2]=+g[a>>2]+h*f*j;g[a+4>>2]=h*f*i+ +g[a+4>>2];g[a+8>>2]=h*f*e+ +g[a+8>>2];return}function bl(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;do if(!(qD(b,c[d+8>>2]|0)|0)){if(qD(b,c[d>>2]|0)|0){if((c[d+16>>2]|0)!=(e|0)?(c[d+20>>2]|0)!=(e|0):0){c[d+32>>2]=f;c[d+20>>2]=e;c[d+40>>2]=(c[d+40>>2]|0)+1;if((c[d+36>>2]|0)==1?(c[d+24>>2]|0)==2:0)a[d+54>>0]=1;c[d+44>>2]=4;break}if((f|0)==1)c[d+32>>2]=1}}else qs(d,e,f);while(0);return}function cl(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0;j=l;l=l+16|0;h=+g[b>>2];i=+g[b+4>>2];e=+g[b+8>>2];if(h*h+i*i+e*e>0.0?(f=+g[a+52>>2],f>0.0):0){c=1.0/+D(+(h*h+i*i+e*e));d=e*c*-f*e*c*-f+(h*c*-f*h*c*-f+i*c*-f*i*c*-f);if(d>0.0){g[j>>2]=-(h*c*-f);g[j+4>>2]=-(i*c*-f);g[j+8>>2]=-(e*c*-f);g[j+12>>2]=0.0;ve(a,j)}g[a+52>>2]=+D(+d);l=j;return}ve(a,b);l=j;return}function dl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;a:do if(!(qD(b,c[d+8>>2]|0)|0)){h=c[b+12>>2]|0;Co(b+16|0,d,e,f);if((h|0)>1){g=b+24|0;do{Co(g,d,e,f);if(a[d+54>>0]|0)break a;g=g+8|0}while(g>>>0<(b+16+(h<<3)|0)>>>0)}}else on(d,e,f);while(0);return}function el(a,b){a=a|0;b=b|0;var d=0;b=l;l=l+16|0;d=c[a+8>>2]|0;c[a+132>>2]=c[d+52>>2];c[a+132+4>>2]=c[d+52+4>>2];c[a+132+8>>2]=c[d+52+8>>2];c[a+132+12>>2]=c[d+52+12>>2];$p(a+152|0,d+52|0,16)|0;yh(d+4|0,b);c[a+168>>2]=c[b>>2];c[a+168+4>>2]=c[b+4>>2];c[a+168+8>>2]=c[b+8>>2];c[a+168+12>>2]=c[b+12>>2];c[a+184>>2]=c[a+168>>2];c[a+184+4>>2]=c[a+168+4>>2];c[a+184+8>>2]=c[a+168+8>>2];c[a+184+12>>2]=c[a+168+12>>2];l=b;return}function fl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=c[a+228>>2]|0;a:do if((f|0)>0){e=c[a+236>>2]|0;d=0;while(1){if((c[e+(d<<2)>>2]|0)==(b|0))break a;d=d+1|0;if((d|0)>=(f|0)){d=f;break}}}else d=f;while(0);if((f|0)>(d|0)){g=c[a+236>>2]|0;d=g+(d<<2)|0;e=c[d>>2]|0;c[d>>2]=c[g+(f+-1<<2)>>2];c[(c[a+236>>2]|0)+(f+-1<<2)>>2]=e;c[a+228>>2]=f+-1}ch(c[b+28>>2]|0,b);ch(c[b+32>>2]|0,b);return}function gl(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;f=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=f;if(f|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;c[b+28>>2]=c[a+32>>2];c[b+32>>2]=c[a+36>>2];c[b+36>>2]=c[a+40>>2];c[b+40>>2]=c[a+44>>2];c[b+12>>2]=c[a+16>>2];c[b+16>>2]=c[a+20>>2];c[b+20>>2]=c[a+24>>2];c[b+24>>2]=c[a+28>>2];c[b+44>>2]=c[a+48>>2];c[b+48>>2]=0;return 11372}function hl(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;f=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=f;if(f|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;c[b+12>>2]=c[a+72>>2];c[b+16>>2]=c[a+76>>2];c[b+20>>2]=c[a+80>>2];c[b+24>>2]=c[a+84>>2];c[b+28>>2]=c[a+52>>2];c[b+32>>2]=c[a+56>>2];c[b+36>>2]=c[a+60>>2];c[b+40>>2]=c[a+64>>2];c[b+44>>2]=c[a+68>>2];c[b+48>>2]=0;return 17004}function il(b,d,e){b=b|0;d=d|0;e=e|0;b=Ds(144)|0;c[b>>2]=5112;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;a[b+80>>0]=1;c[b+76>>2]=0;c[b+68>>2]=0;c[b+72>>2]=0;c[b+92>>2]=e;g[b+96>>2]=0.0;a[b+140>>0]=1;c[b+136>>2]=0;c[b+128>>2]=0;c[b+132>>2]=0;c[b+108>>2]=d;c[b+112>>2]=0;c[b+116>>2]=2;c[b+120>>2]=1;g[b+104>>2]=0.0;g[b+100>>2]=0.0;return b|0}function jl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;f=c[d>>2]|0;f=zb[c[(c[f>>2]|0)+56>>2]&31](f,72)|0;h=c[d+4>>2]|0;i=c[b+8>>2]|0;g=c[b+12>>2]|0;e=c[b+16>>2]|0;c[f+4>>2]=c[d>>2];c[f>>2]=6400;c[f+8>>2]=i;a[f+28>>0]=1;c[f+24>>2]=0;c[f+16>>2]=0;c[f+20>>2]=0;a[f+48>>0]=1;c[f+44>>2]=0;c[f+36>>2]=0;c[f+40>>2]=0;a[f+52>>0]=0;c[f+56>>2]=h;a[f+60>>0]=0;c[f+64>>2]=g;c[f+68>>2]=e;return f|0}function kl(b,d){b=b|0;d=d|0;var e=0;e=bt()|0;c[e+8>>2]=0;c[e+12>>2]=-1;c[e+16>>2]=1065353216;c[e+20>>2]=1065353216;c[e+24>>2]=1065353216;g[e+28>>2]=0.0;g[e+48>>2]=.03999999910593033;c[e+56>>2]=0;c[e+60>>2]=1065353216;c[e+64>>2]=1065353216;c[e+68>>2]=1065353216;g[e+72>>2]=0.0;c[e+76>>2]=-1082130432;c[e+80>>2]=-1082130432;c[e+84>>2]=-1082130432;g[e+88>>2]=0.0;a[e+92>>0]=0;c[e>>2]=8036;c[e+96>>2]=b;c[e+4>>2]=3;if(!d)return e|0;uj(e);return e|0}function ll(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=l;l=l+32|0;if(!(+g[a+404>>2]!=0.0)){l=d;return}wo(a,+g[b>>2],+g[b+4>>2],+g[b+8>>2]);if(!(gJ(a+604|0)|0)){l=d;return}jq(d,+g[b>>2],+g[b+4>>2],+g[b+8>>2],+g[a+408>>2],+g[a+412>>2],+g[a+416>>2]);Ap(d+16|0,+g[c>>2],+g[c+4>>2],+g[c+8>>2],+g[d>>2],+g[d+4>>2],+g[d+8>>2]);xo(a,+g[d+16>>2],+g[d+16+4>>2],+g[d+16+8>>2]);l=d;return}function ml(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;a[b+53>>0]=1;do if((c[b+4>>2]|0)==(e|0)){a[b+52>>0]=1;e=c[b+16>>2]|0;if(!e){c[b+16>>2]=d;c[b+24>>2]=f;c[b+36>>2]=1;if(!((f|0)==1?(c[b+48>>2]|0)==1:0))break;a[b+54>>0]=1;break}if((e|0)!=(d|0)){c[b+36>>2]=(c[b+36>>2]|0)+1;a[b+54>>0]=1;break}e=c[b+24>>2]|0;if((e|0)==2){c[b+24>>2]=f;e=f}if((e|0)==1?(c[b+48>>2]|0)==1:0)a[b+54>>0]=1}while(0);return}function nl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=c[a+248>>2]|0;a:do if((f|0)>0){e=c[a+256>>2]|0;d=0;while(1){if((c[e+(d<<2)>>2]|0)==(b|0))break a;d=d+1|0;if((d|0)>=(f|0)){d=f;break}}}else d=f;while(0);if((f|0)<=(d|0)){ki(a,b);return}g=c[a+256>>2]|0;d=g+(d<<2)|0;e=c[d>>2]|0;c[d>>2]=c[g+(f+-1<<2)>>2];c[(c[a+256>>2]|0)+(f+-1<<2)>>2]=e;c[a+248>>2]=f+-1;ki(a,b);return}function ol(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=c[a+348>>2]|0;a:do if((f|0)>0){e=c[a+356>>2]|0;d=0;while(1){if((c[e+(d<<2)>>2]|0)==(b|0))break a;d=d+1|0;if((d|0)>=(f|0)){d=f;break}}}else d=f;while(0);if((f|0)<=(d|0)){ki(a,b);return}g=c[a+356>>2]|0;d=g+(d<<2)|0;e=c[d>>2]|0;c[d>>2]=c[g+(f+-1<<2)>>2];c[(c[a+356>>2]|0)+(f+-1<<2)>>2]=e;c[a+348>>2]=f+-1;ki(a,b);return}function pl(b,d,e){b=b|0;d=d|0;e=+e;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;a[b+251>>0]=0;c[b+68>>2]=c[d>>2];c[b+68+4>>2]=c[d+4>>2];c[b+68+8>>2]=c[d+8>>2];c[b+68+12>>2]=c[d+12>>2];f=+g[b+68>>2];h=+g[b+72>>2];i=+g[b+76>>2];j=+D(+(f*f+h*h+i*i));if(j>1.1920928955078125e-07){k=f*(1.0/j);h=h*(1.0/j);f=i*(1.0/j);d=c[b+80>>2]|0}else{k=0.0;h=0.0;f=0.0;d=0}g[b+84>>2]=k;g[b+88>>2]=h;g[b+92>>2]=f;c[b+96>>2]=d;g[b+252>>2]=+g[b+252>>2]+e;return}function ql(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+64|0;if(!(qD(a,b)|0))if((b|0)!=0?(f=fj(b,2792)|0,(f|0)!=0):0){b=g+4|0;e=b+52|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(e|0));c[g>>2]=f;c[g+8>>2]=a;c[g+12>>2]=-1;c[g+48>>2]=1;Vb[c[(c[f>>2]|0)+28>>2]&127](f,g,c[d>>2]|0,1);if((c[g+24>>2]|0)==1){c[d>>2]=c[g+16>>2];b=1}else b=0}else b=0;else b=1;l=g;return b|0}function rl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0,j=0.0,k=0.0,l=0.0,m=0;if((d|0)<=0)return;m=0;do{e=+g[a+36>>2];h=+g[a+32>>2];i=b+(m<<4)|0;k=+g[b+(m<<4)+4>>2];f=+g[b+(m<<4)+8>>2];l=+D(+(k*k+f*f));if(l!=0.0){j=f*(e/l);f=+g[i>>2]<0.0?-h:h;e=k*(e/l)}else{j=0.0;f=+g[i>>2]<0.0?-h:h}g[c+(m<<4)>>2]=f;g[c+(m<<4)+4>>2]=e;g[c+(m<<4)+8>>2]=j;m=m+1|0}while((m|0)!=(d|0));return}function sl(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;j=c[b>>2]|0;if(!e)e=c[a+188>>2]|0;i=c[a+328>>2]|0;if((i|0)<=0)return;h=c[a+336>>2]|0;f=0;while(1){g=h+(f<<2)|0;if((c[g>>2]|0)==(j|0))break;f=f+1|0;if((f|0)>=(i|0)){k=9;break}}if((k|0)==9)return;if((f|0)>=(i|0))return;c[g>>2]=c[h+(i+-1<<2)>>2];c[a+328>>2]=i+-1;k=c[a+344>>2]|0;Cb[c[(c[k>>2]|0)+12>>2]&31](k,e,b,d)|0;return}function tl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;e=l;l=l+32|0;d=c[a+216>>2]|0;if(+g[d+4>>2]==0.0){d=0;l=e;return d|0}b=c[b>>2]|0;if(!(zb[c[(c[d>>2]|0)+8>>2]&31](d,c[b+188>>2]|0)|0)){d=1;l=e;return d|0}f=c[b+192>>2]|0;d=c[a+216>>2]|0;c[e>>2]=0;c[e+4>>2]=f;c[e+8>>2]=b;c[e+12>>2]=b+4;c[e+16>>2]=-1;c[e+20>>2]=-1;ad(a+68|0,a+132|0,e,d);d=1;l=e;return d|0}function ul(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;c[b+4>>2]=c[d>>2];c[b>>2]=6512;a[b+24>>0]=1;c[b+20>>2]=0;c[b+12>>2]=0;c[b+16>>2]=0;a[b+44>>0]=1;c[b+40>>2]=0;c[b+32>>2]=0;c[b+36>>2]=0;a[b+64>>0]=1;c[b+60>>2]=0;c[b+52>>2]=0;c[b+56>>2]=0;a[b+68>>0]=g&1;c[b+72>>2]=c[d+4>>2];a[b+76>>0]=0;c[b+80>>2]=c[(c[(g?f:e)+4>>2]|0)+72>>2];eh(b,e,f);return}function vl(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0,h=0,i=0,j=0;j=c[a+72>>2]|0;i=c[a+68>>2]|0;h=c[a+76>>2]|0;e=+g[a+64>>2]*(+g[b+(j<<2)>>2]/+g[a+16+(j<<2)>>2]);g[a+64>>2]=e;f=+g[a+60>>2]*(+g[b+(i<<2)>>2]/+g[a+16+(i<<2)>>2]+ +g[b+(h<<2)>>2]/+g[a+16+(h<<2)>>2])*.5;g[a+60>>2]=f;g[a+56>>2]=f/+D(+(e*e+f*f));f=+C(+(+g[b>>2]));e=+C(+(+g[b+4>>2]));d=+C(+(+g[b+8>>2]));g[a+16>>2]=f;g[a+20>>2]=e;g[a+24>>2]=d;g[a+28>>2]=0.0;return}function wl(b){b=b|0;var d=0;c[b>>2]=5356;d=c[b+336>>2]|0;if(d|0){if(a[b+340>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+336>>2]=0}a[b+340>>0]=1;c[b+336>>2]=0;c[b+328>>2]=0;c[b+332>>2]=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(!d){a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;b=b+292|0;c[b>>2]=0;return}if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;b=b+292|0;c[b>>2]=0;return}function xl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0;if((d|0)<=0)return;m=0;do{e=+g[a+32>>2];i=+g[a+40>>2];k=+g[b+(m<<4)>>2];f=+g[b+(m<<4)+4>>2];l=+D(+(k*k+f*f));h=+g[b+(m<<4)+8>>2];if(l!=0.0){j=f*(e/l);f=h<0.0?-i:i;e=k*(e/l)}else{j=0.0;f=h<0.0?-i:i}g[c+(m<<4)>>2]=e;g[c+(m<<4)+4>>2]=j;g[c+(m<<4)+8>>2]=f;m=m+1|0}while((m|0)!=(d|0));return}function yl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0;if((d|0)<=0)return;m=0;do{e=+g[a+32>>2];i=+g[a+36>>2];k=+g[b+(m<<4)>>2];f=+g[b+(m<<4)+8>>2];l=+D(+(k*k+f*f));h=+g[b+(m<<4)+4>>2];if(l!=0.0){j=f*(e/l);f=h<0.0?-i:i;e=k*(e/l)}else{j=0.0;f=h<0.0?-i:i}g[c+(m<<4)>>2]=e;g[c+(m<<4)+4>>2]=f;g[c+(m<<4)+8>>2]=j;m=m+1|0}while((m|0)!=(d|0));return}function zl(b){b=b|0;var d=0;c[b>>2]=4324;d=c[b+556>>2]|0;if(d|0){if(a[b+560>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+556>>2]=0}a[b+560>>0]=1;c[b+556>>2]=0;c[b+548>>2]=0;c[b+552>>2]=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(!d){a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;b=b+292|0;c[b>>2]=0;return}if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;b=b+292|0;c[b>>2]=0;return}function Al(b){b=b|0;var d=0;d=bt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;g[d+48>>2]=.03999999910593033;c[d+56>>2]=0;c[d+60>>2]=1065353216;c[d+64>>2]=1065353216;c[d+68>>2]=1065353216;g[d+72>>2]=0.0;c[d+76>>2]=-1082130432;c[d+80>>2]=-1082130432;c[d+84>>2]=-1082130432;g[d+88>>2]=0.0;a[d+92>>0]=0;c[d>>2]=8036;c[d+96>>2]=b;c[d+4>>2]=3;uj(d);return d|0}function Bl(b){b=b|0;var d=0,e=0;d=c[b>>2]|0;if(d|0)Hn(b,d);d=c[b+4>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+4>>2]=0;c[b+8>>2]=-1;d=c[b+32>>2]|0;if(!d){d=b+28|0;e=b+16|0;c[e>>2]=0;a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[d>>2]=0;return}if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0;e=b+28|0;d=b+16|0;c[d>>2]=0;a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[e>>2]=0;return}function Cl(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=l;l=l+48|0;c[f+32>>2]=9284;c[f+32+4>>2]=e;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];c[f+16>>2]=c[d>>2];c[f+16+4>>2]=c[d+4>>2];c[f+16+8>>2]=c[d+8>>2];c[f+16+12>>2]=c[d+12>>2];Bf(c[a+4>>2]|0,f,f+32|0);Bf(c[a+44>>2]|0,f,f+32|0);l=f;return}function Dl(b){b=b|0;var d=0;d=c[b>>2]|0;if(d|0)Hn(b,d);d=c[b+4>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+4>>2]=0;c[b+8>>2]=-1;d=c[b+32>>2]|0;if(!d){a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;d=b+28|0;c[d>>2]=0;b=b+16|0;c[b>>2]=0;return}if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0;a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;d=b+28|0;c[d>>2]=0;b=b+16|0;c[b>>2]=0;return}function El(b,d){b=b|0;d=+d;var e=0,f=0,h=0.0;d=1.0/+g[(c[b+108>>2]|0)+404>>2];if((c[b+128>>2]|0)<=0)return;e=0;do{f=c[b+136>>2]|0;if(!(a[f+(e*284|0)+84>>0]|0))h=0.0;else{h=+g[f+(e*284|0)+272>>2];h=d*(+g[f+(e*284|0)+216>>2]*(+g[f+(e*284|0)+204>>2]-+g[f+(e*284|0)+32>>2])*+g[f+(e*284|0)+268>>2]-h*+g[(h<0.0?f+(e*284|0)+220|0:f+(e*284|0)+224|0)>>2]);h=h<0.0?0.0:h}g[f+(e*284|0)+276>>2]=h;e=e+1|0}while((e|0)<(c[b+128>>2]|0));return}function Fl(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0,f=0.0,h=0.0,i=0.0;e=l;l=l+48|0;f=+XI(b);h=+XI(c);i=+XI(d);b=+WI(b);c=+WI(c);d=+WI(d);g[e+32>>2]=h*i;g[e+28>>2]=c*b*i-f*d;g[e+24>>2]=c*f*i+b*d;g[e+20>>2]=h*d;g[e+16>>2]=c*b*d+f*i;g[e+12>>2]=c*f*d-b*i;g[e+8>>2]=-c;g[e+4>>2]=h*b;g[e>>2]=h*f;Ip(a,e+32|0,e+28|0,e+24|0,e+20|0,e+16|0,e+12|0,e+8|0,e+4|0,e);l=e;return}function Gl(a,d,f,g,h,i){a=a|0;d=d|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0;j=c[a+108>>2]|0;if(j|0){$b[c[(c[j>>2]|0)+24>>2]&7](j,d,f,g,h,i);return}d=b[a+56>>1]|0;if(!(d<<16>>16))return;h=1;i=1;do{f=c[a+68>>2]|0;if(b[f+(i<<2)>>1]&1){zb[c[(c[g>>2]|0)+8>>2]&31](g,(c[a+60>>2]|0)+((e[f+(i<<2)+2>>1]|0)<<6)|0)|0;d=b[a+56>>1]|0}h=h+1<<16>>16;i=h&65535}while(i>>>0<((d&65535)<<1|1)>>>0);return}function Hl(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;f=+g[a+32>>2]/+g[a+16>>2];e=+g[a+36>>2]/+g[a+20>>2];d=+g[a+40>>2]/+g[a+24>>2];j=+C(+(+g[b>>2]));i=+C(+(+g[b+4>>2]));h=+C(+(+g[b+8>>2]));g[a+16>>2]=j;g[a+20>>2]=i;g[a+24>>2]=h;g[a+28>>2]=0.0;e=e*+g[b+4>>2];d=d*+g[b+8>>2];g[a+32>>2]=f*+g[b>>2];g[a+36>>2]=e;g[a+40>>2]=d;g[a+44>>2]=0.0;c[a+48>>2]=c[a+32+((((c[a+56>>2]|0)+2|0)%3|0)<<2)>>2];return}function Il(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[d>>2]|0;b=zb[c[(c[b>>2]|0)+56>>2]&31](b,80)|0;d=c[d>>2]|0;c[b+4>>2]=d;c[b>>2]=5820;c[b+8>>2]=5868;c[b+56>>2]=d;c[b+60>>2]=0;c[b+44>>2]=f;c[b+48>>2]=e;f=Bb[c[(c[d>>2]|0)+12>>2]&63](d,c[f+8>>2]|0,c[e+8>>2]|0)|0;c[b+72>>2]=f;e=c[b+56>>2]|0;Ob[c[(c[e>>2]|0)+20>>2]&127](e,f);a[b+76>>0]=1;return b|0}function Jl(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=l;l=l+16|0;c[h>>2]=a;c[h+4>>2]=e;e=c[(c[b+4>>2]|0)+4>>2]|0;g=c[(c[d+4>>2]|0)+4>>2]|0;if((f|0)==1){f=c[a+76+(e*144|0)+(g<<2)>>2]|0;f=Cb[c[(c[f>>2]|0)+8>>2]&31](f,h,b,d)|0;l=h;return f|0}else{f=c[a+5260+(e*144|0)+(g<<2)>>2]|0;f=Cb[c[(c[f>>2]|0)+8>>2]&31](f,h,b,d)|0;l=h;return f|0}return 0}function Kl(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,h=0.0,i=0.0;e=+g[a+32>>2];i=+g[a+36>>2];h=+g[a+40>>2];switch(d|0){case 0:{a=0;d=0;f=1065353216;break}case 1:{a=0;d=0;f=-1082130432;break}case 2:{a=0;d=1065353216;f=0;e=i;break}case 3:{a=0;d=-1082130432;f=0;e=i;break}case 4:{a=1065353216;d=0;f=0;e=h;break}case 5:{a=-1082130432;d=0;f=0;e=h;break}default:return}c[b>>2]=f;c[b+4>>2]=d;c[b+8>>2]=a;g[b+12>>2]=-e;return}function Ll(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[d>>2]|0;b=zb[c[(c[b>>2]|0)+56>>2]&31](b,80)|0;d=c[d>>2]|0;c[b+4>>2]=d;c[b>>2]=5820;c[b+8>>2]=5868;c[b+56>>2]=d;c[b+60>>2]=0;c[b+44>>2]=e;c[b+48>>2]=f;f=Bb[c[(c[d>>2]|0)+12>>2]&63](d,c[e+8>>2]|0,c[f+8>>2]|0)|0;c[b+72>>2]=f;e=c[b+56>>2]|0;Ob[c[(c[e>>2]|0)+20>>2]&127](e,f);a[b+76>>0]=0;return b|0}function Ml(a){a=a|0;var b=0,d=0,e=0,f=0.0,h=0.0;e=c[a+248>>2]|0;if((e|0)<=0)return;b=c[a+256>>2]|0;a=0;do{d=c[b+(a<<2)>>2]|0;switch(c[d+220>>2]|0){case 2:case 5:break;default:if(!(c[d+204>>2]&3)){h=+g[d+428>>2]*+g[d+412>>2];f=+g[d+432>>2]*+g[d+416>>2];g[d+472>>2]=+g[d+424>>2]*+g[d+408>>2]+ +g[d+472>>2];g[d+476>>2]=h+ +g[d+476>>2];g[d+480>>2]=f+ +g[d+480>>2]}}a=a+1|0}while((a|0)!=(e|0));return}function Nl(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0;c=l;l=l+16|0;m=+g[a+12>>2];i=+g[(gJ(b)|0)>>2];j=+g[a>>2];k=+g[b+12>>2];h=+g[a+4>>2];d=+g[(NI(b)|0)>>2];e=+g[a+8>>2];f=+g[(OI(b)|0)>>2];g[c+12>>2]=m*i+j*k+h*d-e*f;g[c+8>>2]=m*f+h*k+e*i-j*d;g[c+4>>2]=m*d+e*k+j*f-h*i;g[c>>2]=m*k-j*i-h*f-e*d;as(a,c+12|0,c+8|0,c+4|0,c);l=c;return a|0}function Ol(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0,k=0;e=l;l=l+16|0;j=c[a+56>>2]|0;k=c[a+32+(((j+2|0)%3|0)<<2)>>2]|0;c[e>>2]=k;c[e+4>>2]=k;c[e+8>>2]=k;g[e+12>>2]=0.0;g[e+(j<<2)>>2]=+g[a+32+(j<<2)>>2]+ +g[e+(j<<2)>>2];h=+g[e>>2]*2.0;f=+g[e+4>>2]*2.0;i=+g[e+8>>2]*2.0;g[d>>2]=b*.0833333283662796*(f*f+i*i);g[d+4>>2]=b*.0833333283662796*(h*h+i*i);g[d+8>>2]=b*.0833333283662796*(h*h+f*f);l=e;return}function Pl(a,b){a=a|0;b=+b;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0;h=+nb[c[(c[a>>2]|0)+48>>2]&15](a);e=+nb[c[(c[a>>2]|0)+48>>2]&15](a);i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);h=h+ +g[a+32>>2];e=e+ +g[a+36>>2];i=i+ +g[a+40>>2];g[a+48>>2]=b;f=+nb[c[(c[a>>2]|0)+48>>2]&15](a);d=+nb[c[(c[a>>2]|0)+48>>2]&15](a);b=i-+nb[c[(c[a>>2]|0)+48>>2]&15](a);g[a+32>>2]=h-f;g[a+36>>2]=e-d;g[a+40>>2]=b;g[a+44>>2]=0.0;return}function Ql(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;if((c[a+8>>2]|0)<=0)return;e=0;a:while(1){while(1){f=c[a+16>>2]|0;g=f+(e<<4)|0;if(!(zb[c[(c[b>>2]|0)+8>>2]&31](b,g)|0))break;Cb[c[(c[a>>2]|0)+12>>2]&31](a,c[g>>2]|0,c[f+(e<<4)+4>>2]|0,d)|0;c[6156]=(c[6156]|0)+-1;if((e|0)>=(c[a+8>>2]|0)){e=7;break a}}e=e+1|0;if((e|0)>=(c[a+8>>2]|0)){e=7;break}}if((e|0)==7)return}function Rl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[d>>2]|0;b=zb[c[(c[b>>2]|0)+56>>2]&31](b,16)|0;d=c[d>>2]|0;c[b+4>>2]=d;c[b>>2]=5888;a[b+8>>0]=0;c[b+12>>2]=0;if(!(Bb[c[(c[d>>2]|0)+24>>2]&63](d,c[e+8>>2]|0,c[f+8>>2]|0)|0))return b|0;d=c[b+4>>2]|0;c[b+12>>2]=Bb[c[(c[d>>2]|0)+12>>2]&63](d,c[e+8>>2]|0,c[f+8>>2]|0)|0;a[b+8>>0]=1;return b|0}function Sl(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;f=(a[b+8>>0]|0)!=0;h=c[(f?e:d)+8>>2]|0;f=f?d:e;g=c[f+8>>2]|0;d=c[h+328>>2]|0;a:do if((d|0)>0){e=c[h+336>>2]|0;b=0;while(1){if((c[e+(b<<2)>>2]|0)==(g|0))break;b=b+1|0;if((b|0)>=(d|0))break a}if((b|0)!=(d|0))return}while(0);e=c[h+344>>2]|0;Sb[c[(c[e>>2]|0)+36>>2]&127](e,h,f);return}function Tl(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;a[b+251>>0]=1;c[b+68>>2]=c[d>>2];c[b+68+4>>2]=c[d+4>>2];c[b+68+8>>2]=c[d+8>>2];c[b+68+12>>2]=c[d+12>>2];e=+g[b+68>>2];f=+g[b+72>>2];h=+g[b+76>>2];i=+D(+(e*e+f*f+h*h));if(i>1.1920928955078125e-07){j=e*(1.0/i);f=f*(1.0/i);e=h*(1.0/i);d=c[b+80>>2]|0}else{j=0.0;f=0.0;e=0.0;d=0}g[b+84>>2]=j;g[b+88>>2]=f;g[b+92>>2]=e;c[b+96>>2]=d;return}function Ul(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);h=+nb[c[(c[a>>2]|0)+48>>2]&15](a);f=+nb[c[(c[a>>2]|0)+48>>2]&15](a);k=+g[b+52>>2]-h;j=+g[b+56>>2]-f;g[d>>2]=+g[b+48>>2]-i;g[d+4>>2]=k;g[d+8>>2]=j;g[d+12>>2]=0.0;h=h+ +g[b+52>>2];f=f+ +g[b+56>>2];g[e>>2]=i+ +g[b+48>>2];g[e+4>>2]=h;g[e+8>>2]=f;g[e+12>>2]=0.0;return}function Vl(a,b){a=a|0;b=+b;var d=0,e=0.0,f=0.0,h=0.0,i=0.0;d=nt()|0;c[d+4>>2]=35;c[d+8>>2]=0;c[d+12>>2]=-1;g[d+16>>2]=0.0;c[d>>2]=7396;i=+g[a>>2];h=+g[a+4>>2];f=+g[a+8>>2];a=c[a+12>>2]|0;e=1.0/+D(+(i*i+h*h+f*f));g[d+52>>2]=i*e;g[d+56>>2]=h*e;g[d+60>>2]=f*e;c[d+64>>2]=a;g[d+68>>2]=b;c[d+72>>2]=1065353216;c[d+76>>2]=1065353216;c[d+80>>2]=1065353216;g[d+84>>2]=0.0;c[d+4>>2]=28;return d|0}function Wl(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=c[a+780>>2]|0;h=c[a+792>>2]|0;if((h|0)<=0){h=0;return h|0}e=c[a+800>>2]|0;a=0;while(1){f=c[e+(a*52|0)+24>>2]|0;if((f|0)==(g+(b*104|0)|0)?(c[e+(a*52|0)+28>>2]|0)==(g+(d*104|0)|0):0){a=1;e=8;break}if((f|0)==(g+(d*104|0)|0)?(c[e+(a*52|0)+28>>2]|0)==(g+(b*104|0)|0):0){a=1;e=8;break}a=a+1|0;if((a|0)>=(h|0)){a=0;e=8;break}}if((e|0)==8)return a|0;return 0}function Xl(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=Rs()|0;Ra(f|0,a|0,b|0,d|0,e|0,0);c[f>>2]=4600;g[f+968>>2]=0.0;g[f+1056>>2]=0.0;g[f+1144>>2]=0.0;g[f+972>>2]=0.0;g[f+1060>>2]=0.0;g[f+1148>>2]=0.0;c[f+680>>2]=0;c[f+680+4>>2]=0;c[f+680+8>>2]=0;c[f+680+12>>2]=0;c[f+680+16>>2]=0;c[f+680+20>>2]=0;c[f+680+24>>2]=0;c[f+680+28>>2]=0;return f|0}function Yl(a){a=a|0;var b=0,d=0,e=0.0,f=0.0;if((c[a+128>>2]|0)<=0)return;b=0;do{d=c[a+136>>2]|0;c[d+(b*284|0)+32>>2]=c[d+(b*284|0)+204>>2];g[d+(b*284|0)+272>>2]=0.0;f=-+g[d+(b*284|0)+56>>2];e=-+g[d+(b*284|0)+60>>2];g[d+(b*284|0)>>2]=-+g[d+(b*284|0)+52>>2];g[d+(b*284|0)+4>>2]=f;g[d+(b*284|0)+8>>2]=e;g[d+(b*284|0)+12>>2]=0.0;g[d+(b*284|0)+268>>2]=1.0;b=b+1|0}while((b|0)<(c[a+128>>2]|0));return}function Zl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=c[d>>2]|0;g=zb[c[(c[g>>2]|0)+56>>2]&31](g,20)|0;h=c[d+4>>2]|0;i=a[b+4>>0]|0;b=c[d>>2]|0;c[g+4>>2]=b;c[g>>2]=6352;a[g+8>>0]=0;c[g+12>>2]=h;a[g+16>>0]=i;if(h|0)return g|0;c[g+12>>2]=Bb[c[(c[b>>2]|0)+12>>2]&63](b,c[e+8>>2]|0,c[f+8>>2]|0)|0;a[g+8>>0]=1;return g|0}function _l(b){b=b|0;var d=0;c[b>>2]=5356;d=c[b+336>>2]|0;if(d|0){if(a[b+340>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+336>>2]=0}a[b+340>>0]=1;c[b+336>>2]=0;c[b+328>>2]=0;c[b+332>>2]=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(d|0){if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0}a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function $l(b){b=b|0;var d=0;c[b>>2]=4324;d=c[b+556>>2]|0;if(d|0){if(a[b+560>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+556>>2]=0}a[b+560>>0]=1;c[b+556>>2]=0;c[b+548>>2]=0;c[b+552>>2]=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(d|0){if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0}a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function am(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=l;l=l+48|0;c[f>>2]=7376;c[f+4>>2]=b;c[f+8>>2]=c[d>>2];c[f+8+4>>2]=c[d+4>>2];c[f+8+8>>2]=c[d+8>>2];c[f+8+12>>2]=c[d+12>>2];c[f+24>>2]=c[e>>2];c[f+24+4>>2]=c[e+4>>2];c[f+24+8>>2]=c[e+8>>2];c[f+24+12>>2]=c[e+12>>2];b=c[a+52>>2]|0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,f,d,e);l=f;return}function bm(a,b,d){a=a|0;b=+b;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;i=+g[a+32>>2];f=+g[a+36>>2];j=+g[a+40>>2];h=+nb[c[(c[a>>2]|0)+48>>2]&15](a);e=+nb[c[(c[a>>2]|0)+48>>2]&15](a);j=(j+ +nb[c[(c[a>>2]|0)+48>>2]&15](a))*2.0;g[d>>2]=b/12.0*((f+e)*2.0*(f+e)*2.0+j*j);g[d+4>>2]=b/12.0*((i+h)*2.0*(i+h)*2.0+j*j);g[d+8>>2]=b/12.0*((i+h)*2.0*(i+h)*2.0+(f+e)*2.0*(f+e)*2.0);g[d+12>>2]=0.0;return}function cm(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0;d=l;l=l+16|0;c[d>>2]=9320;c[d+4>>2]=e;i=c[a+168>>2]|0;ze(c[a+4>>2]|0,b,e+4|0,e+20|0,+g[e+32>>2],f,h,i,d);ze(c[a+44>>2]|0,b,e+4|0,e+20|0,+g[e+32>>2],f,h,i,d);l=d;return}function dm(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=l;l=l+32|0;uq(a,+g[b>>2],+g[b+4>>2],+g[b+8>>2]);jq(d,+g[b>>2],+g[b+4>>2],+g[b+8>>2],+g[a+408>>2],+g[a+412>>2],+g[a+416>>2]);Ap(d+16|0,+g[c>>2],+g[c+4>>2],+g[c+8>>2],+g[d>>2],+g[d+4>>2],+g[d+8>>2]);yq(a,+g[d+16>>2],+g[d+16+4>>2],+g[d+16+8>>2]);l=d;return}function em(a,b){a=a|0;b=b|0;var d=0;d=l;l=l+64|0;c[d>>2]=1065353216;c[d+4>>2]=0;c[d+4+4>>2]=0;c[d+4+8>>2]=0;c[d+4+12>>2]=0;c[d+20>>2]=1065353216;c[d+24>>2]=0;c[d+24+4>>2]=0;c[d+24+8>>2]=0;c[d+24+12>>2]=0;c[d+40>>2]=1065353216;c[d+44>>2]=0;c[d+48>>2]=c[b>>2];c[d+48+4>>2]=c[b+4>>2];c[d+48+8>>2]=c[b+8>>2];c[d+48+12>>2]=c[b+12>>2];Ld(a,d);l=d;return}function fm(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=+d;e=+e;var f=0,h=0;f=l;l=l+16|0;h=$G(b,0)|0;g[f+8>>2]=+Iy(+g[h>>2],+g[h+4>>2],+g[h+8>>2],c,d,e);h=$G(b,1)|0;g[f+4>>2]=+Iy(+g[h>>2],+g[h+4>>2],+g[h+8>>2],c,d,e);b=$G(b,2)|0;g[f>>2]=+Iy(+g[b>>2],+g[b+4>>2],+g[b+8>>2],c,d,e);$s(a,f+8|0,f+4|0,f);l=f;return}function gm(){var a=0,b=0,d=0;a=it()|0;c[a>>2]=1025;b=a+120|0;d=b+44|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(d|0));b=a+312|0;d=b+44|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(d|0));b=a+504|0;d=b+44|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(d|0));b=a+696|0;d=b+44|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(d|0));c[a+772>>2]=0;c[a+776>>2]=0;c[a+780>>2]=0;c[a+800>>2]=0;return a|0}function hm(a,b,d){a=a|0;b=b|0;d=d|0;a:do switch(c[b+220>>2]|0){case 2:case 5:{switch(c[d+220>>2]|0){case 2:case 5:{a=0;break}default:break a}return a|0}default:{}}while(0);if(!((c[b+280>>2]|0)!=0?!(zb[c[(c[b>>2]|0)+12>>2]&31](b,d)|0):0)){if(!(c[d+280>>2]|0)){d=1;return d|0}if(zb[c[(c[d>>2]|0)+12>>2]&31](d,b)|0){d=1;return d|0}}d=0;return d|0}function im(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=c[a+296>>2]|0;a:do if((f|0)>0){e=c[a+304>>2]|0;d=0;while(1){if((c[e+(d<<2)>>2]|0)==(b|0))break a;d=d+1|0;if((d|0)>=(f|0)){d=f;break}}}else d=f;while(0);if((f|0)<=(d|0))return;g=c[a+304>>2]|0;b=g+(d<<2)|0;e=c[b>>2]|0;c[b>>2]=c[g+(f+-1<<2)>>2];c[(c[a+304>>2]|0)+(f+-1<<2)>>2]=e;c[a+296>>2]=f+-1;return}function jm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;j=+g[a+32>>2];h=+g[a+36>>2];e=+g[a+40>>2];i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);f=+nb[c[(c[a>>2]|0)+48>>2]&15](a);e=e+ +nb[c[(c[a>>2]|0)+48>>2]&15](a);g[d>>2]=+(b&1^1|0)*(j+i)-+(b&1|0)*(j+i);g[d+4>>2]=+(b>>>1&1^1|0)*(h+f)-+(b>>>1&1|0)*(h+f);g[d+8>>2]=+(b>>>2&1^1|0)*e-+(b>>>2&1|0)*e;g[d+12>>2]=0.0;return}function km(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=+d;e=+e;var f=0,h=0,i=0,j=0;f=l;l=l+16|0;j=$G(b,0)|0;i=$G(b,1)|0;h=$G(b,2)|0;an(f,c,d,e,+g[j>>2],+g[j+4>>2],+g[j+8>>2],+g[i>>2],+g[i+4>>2],+g[i+8>>2],+g[h>>2],+g[h+4>>2],+g[h+8>>2]);iq(a,+g[f>>2],+g[f+4>>2],+g[f+8>>2],+g[b+48>>2],+g[b+52>>2],+g[b+56>>2]);l=f;return}function lm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0;e=l;l=l+16|0;c[e>>2]=-1;c[e+4>>2]=c[a+20>>2];if(!(c[b+4>>2]|0))c[b+4>>2]=e;g=c[a+16>>2]|0;f=+qb[c[(c[g>>2]|0)+12>>2]&31](g,b,d);c[a+4>>2]=c[(c[a+16>>2]|0)+4>>2];l=e;return +f}function mm(b,d){b=b|0;d=d|0;if((c[b+16>>2]|0)!=(0-(c[b+56>>2]|0)|0))return;Dl(b+4|0);Dl(b+44|0);a[b+153>>0]=0;a[b+154>>0]=1;c[b+104>>2]=0;c[b+124>>2]=0;c[b+108>>2]=1;c[b+112>>2]=0;c[b+116>>2]=10;c[b+120>>2]=1;c[b+84>>2]=0;c[b+84+4>>2]=0;c[b+84+8>>2]=0;c[b+128>>2]=0;c[b+128+4>>2]=0;c[b+128+8>>2]=0;c[b+128+12>>2]=0;c[b+128+16>>2]=0;c[b+128+20>>2]=0;return}function nm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;i=+g[b+32>>2];j=+g[b+36>>2];e=+g[b+40>>2];h=+nb[c[(c[b>>2]|0)+48>>2]&15](b);f=+nb[c[(c[b>>2]|0)+48>>2]&15](b);e=e+ +nb[c[(c[b>>2]|0)+48>>2]&15](b);f=+g[d+4>>2]>=0.0?j+f:-(j+f);e=+g[d+8>>2]>=0.0?e:-e;g[a>>2]=+g[d>>2]>=0.0?i+h:-(i+h);g[a+4>>2]=f;g[a+8>>2]=e;g[a+12>>2]=0.0;return}function om(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0;if((d|0)<=0)return;e=0;do{i=+g[a+32>>2];h=+g[a+36>>2];h=+g[b+(e<<4)+4>>2]>=0.0?h:-h;f=+g[a+40>>2];f=+g[b+(e<<4)+8>>2]>=0.0?f:-f;g[c+(e<<4)>>2]=+g[b+(e<<4)>>2]>=0.0?i:-i;g[c+(e<<4)+4>>2]=h;g[c+(e<<4)+8>>2]=f;g[c+(e<<4)+12>>2]=0.0;e=e+1|0}while((e|0)!=(d|0));return}function pm(a,b,d,e,f,g,h,i,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;a=c[a+32>>2]|0;c[d>>2]=c[a+(k<<5)+12>>2];c[b>>2]=c[a+(k<<5)+16>>2];c[e>>2]=c[a+(k<<5)+28>>2];c[f>>2]=c[a+(k<<5)+20>>2];c[i>>2]=c[a+(k<<5)>>2];c[g>>2]=c[a+(k<<5)+4>>2];c[h>>2]=c[a+(k<<5)+8>>2];c[j>>2]=c[a+(k<<5)+24>>2];return}function qm(b){b=b|0;var d=0,e=0;c[b>>2]=6640;d=c[b+68>>2]|0;if(d|0?(Bl(d),e=c[b+68>>2]|0,e|0):0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}d=c[b+28>>2]|0;if(!d){a[b+32>>0]=1;c[b+28>>2]=0;c[b+20>>2]=0;b=b+24|0;c[b>>2]=0;return}if(a[b+32>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+28>>2]=0;a[b+32>>0]=1;c[b+28>>2]=0;c[b+20>>2]=0;b=b+24|0;c[b>>2]=0;return}function rm(b){b=b|0;var d=0,e=0;c[b>>2]=7604;d=c[b+108>>2]|0;if(d|0){if(a[b+112>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+108>>2]=0}a[b+112>>0]=1;c[b+108>>2]=0;c[b+100>>2]=0;c[b+104>>2]=0;c[b>>2]=7472;d=c[b+56>>2]|0;if(d|0?(Ib[c[c[d>>2]>>2]&511](d),e=c[b+56>>2]|0,e|0):0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function sm(a,b){a=a|0;b=+b;var d=0;d=l;l=l+16|0;c[a+8>>2]=0;c[a+12>>2]=-1;c[a+16>>2]=1065353216;c[a+20>>2]=1065353216;c[a+24>>2]=1065353216;g[a+28>>2]=0.0;g[a+48>>2]=.03999999910593033;c[a>>2]=7020;c[a+4>>2]=8;g[d+8>>2]=1.0;g[d+4>>2]=1.0;g[d>>2]=1.0;$s(a+16|0,d+8|0,d+4|0,d);Fs(a+32|0);MG(a+32|0,b);g[a+48>>2]=b;g[a+52>>2]=0.0;l=d;return}function tm(a,b){a=+a;b=+b;var d=0;d=Jt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;g[d+48>>2]=.03999999910593033;g[d+60>>2]=a;g[d+64>>2]=b;c[d+4>>2]=11;g[d+56>>2]=a/+D(+(a*a+b*b));c[d>>2]=6820;c[d+68>>2]=0;c[d+72>>2]=2;c[d+76>>2]=1;g[d+32>>2]=a;g[d+40>>2]=b;g[d+36>>2]=a;return d|0}function um(a,b){a=+a;b=+b;var d=0;d=Jt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;g[d+48>>2]=.03999999910593033;g[d+60>>2]=a;g[d+64>>2]=b;c[d+4>>2]=11;g[d+56>>2]=a/+D(+(a*a+b*b));c[d>>2]=6920;c[d+68>>2]=1;c[d+72>>2]=0;c[d+76>>2]=2;g[d+36>>2]=a;g[d+32>>2]=b;g[d+40>>2]=a;return d|0}function vm(a,b){a=+a;b=+b;var d=0;d=Jt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;g[d+48>>2]=.03999999910593033;c[d>>2]=6720;g[d+60>>2]=a;g[d+64>>2]=b;c[d+4>>2]=11;c[d+68>>2]=0;c[d+72>>2]=1;c[d+76>>2]=2;g[d+32>>2]=a;g[d+36>>2]=b;g[d+40>>2]=a;g[d+56>>2]=a/+D(+(a*a+b*b));return d|0}function wm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;switch(b|0){case 0:{a=0;b=0;e=1065353216;break}case 1:{a=0;b=0;e=-1082130432;break}case 2:{a=0;b=1065353216;e=0;break}case 3:{a=0;b=-1082130432;e=0;break}case 4:{a=1065353216;b=0;e=0;break}case 5:{a=-1082130432;b=0;e=0;break}default:return}c[d>>2]=e;c[d+4>>2]=b;c[d+8>>2]=a;g[d+12>>2]=0.0;return}function xm(b,d,e,f){b=b|0;d=d|0;e=e|0;f=+f;c[b+4>>2]=c[d>>2];c[b+4+4>>2]=c[d+4>>2];c[b+4+8>>2]=c[d+8>>2];c[b+4+12>>2]=c[d+12>>2];c[b+20>>2]=c[e>>2];c[b+20+4>>2]=c[e+4>>2];c[b+20+8>>2]=c[e+8>>2];c[b+20+12>>2]=c[e+12>>2];g[b+36>>2]=f;a[b+40>>0]=1;return}function ym(a,e,f){a=a|0;e=e|0;f=f|0;var h=0.0;switch(c[a+100>>2]|0){case 0:{h=+g[(c[a+96>>2]|0)+((P(c[a+68>>2]|0,f)|0)+e<<2)>>2];return +h}case 5:{h=+(d[(c[a+96>>2]|0)+((P(c[a+68>>2]|0,f)|0)+e)>>0]|0)*+g[a+92>>2];return +h}case 3:{h=+(b[(c[a+96>>2]|0)+((P(c[a+68>>2]|0,f)|0)+e<<1)>>1]|0)*+g[a+92>>2];return +h}default:{h=0.0;return +h}}return 0.0}function zm(a,b){a=a|0;b=b|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];c[a+16>>2]=c[b+16>>2];c[a+20>>2]=c[b+20>>2];c[a+24>>2]=c[b+24>>2];Vm(a+28|0,b+28|0);c[a+76>>2]=c[b+76>>2];c[a+76+4>>2]=c[b+76+4>>2];c[a+76+8>>2]=c[b+76+8>>2];c[a+76+12>>2]=c[b+76+12>>2];c[a+76+16>>2]=c[b+76+16>>2];return}function Am(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;switch(e|0){case 5:case -1:break;default:return}switch(b|0){case 2:{g[a+764>>2]=d;c[a+748>>2]=c[a+748>>2]|2;return}case 4:{g[a+760>>2]=d;c[a+748>>2]=c[a+748>>2]|1;return}case 3:{g[a+752>>2]=d;c[a+748>>2]=c[a+748>>2]|4;return}case 1:{g[a+756>>2]=d;c[a+748>>2]=c[a+748>>2]|8;return}default:return}}function Bm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=gJ(c[a+4>>2]|0)|0;if((e|0)>(b|0)){c[a+4>>2]=b;return}if((e|0)<(b|0))ko(a,b);while(1){if((e|0)>=(b|0))break;f=gJ((c[a+12>>2]|0)+(e*52|0)|0)|0;g=d;h=f+52|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));e=e+1|0}c[a+4>>2]=b;return}function Cm(a,b){a=a|0;b=b|0;var c=0.0,d=0;d=l;l=l+32|0;c=+g[b+12>>2];if(1.0-c*c<1.1920928955078125e-06){g[d+20>>2]=1.0;g[d+16>>2]=0.0;g[d+12>>2]=0.0;$s(a,d+20|0,d+16|0,d+12|0);l=d;return}else{c=1.0/+VI(1.0-c*c);g[d+8>>2]=+g[b>>2]*c;g[d+4>>2]=+g[b+4>>2]*c;g[d>>2]=+g[b+8>>2]*c;$s(a,d+8|0,d+4|0,d);l=d;return}}function Dm(b){b=b|0;var d=0;c[b>>2]=7604;d=c[b+108>>2]|0;if(d|0){if(a[b+112>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+108>>2]=0}a[b+112>>0]=1;c[b+108>>2]=0;c[b+100>>2]=0;c[b+104>>2]=0;c[b>>2]=7472;d=c[b+56>>2]|0;if(!d)return;Ib[c[c[d>>2]>>2]&511](d);d=c[b+56>>2]|0;if(!d)return;c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);return}function Em(a,b){a=+a;b=b|0;var d=0,e=0,f=0;h[j>>3]=a;d=c[j>>2]|0;e=c[j+4>>2]|0;f=Mu(d|0,e|0,52)|0;switch(f&2047){case 0:{if(a!=0.0){a=+Em(a*18446744073709551616.0,b);d=(c[b>>2]|0)+-64|0}else d=0;c[b>>2]=d;break}case 2047:break;default:{c[b>>2]=(f&2047)+-1022;c[j>>2]=d;c[j+4>>2]=e&-2146435073|1071644672;a=+h[j>>3]}}return +a}function Fm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=gJ(c[a+4>>2]|0)|0;if((e|0)>(b|0)){c[a+4>>2]=b;return}if((e|0)<(b|0))jo(a,b);while(1){if((e|0)>=(b|0))break;f=(c[a+12>>2]|0)+(e*104|0)|0;g=d;h=f+104|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));e=e+1|0}c[a+4>>2]=b;return}function Gm(b,e){b=b|0;e=e|0;var f=0,g=0;g=0;while(1){if((d[19849+g>>0]|0)==(b|0)){b=2;break}f=g+1|0;if((f|0)==87){f=19937;g=87;b=5;break}else g=f}if((b|0)==2)if(!g)f=19937;else{f=19937;b=5}if((b|0)==5)while(1){do{b=f;f=f+1|0}while((a[b>>0]|0)!=0);g=g+-1|0;if(!g)break;else b=5}return mH(f,c[e+20>>2]|0)|0}function Hm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=gJ(c[a+4>>2]|0)|0;if((e|0)>(b|0)){c[a+4>>2]=b;return}if((e|0)<(b|0))lo(a,b);while(1){if((e|0)>=(b|0))break;f=(c[a+12>>2]|0)+(e*44|0)|0;g=d;h=f+44|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));e=e+1|0}c[a+4>>2]=b;return}function Im(a,b){a=a|0;b=b|0;var d=0;d=l;l=l+16|0;c[a+408>>2]=c[b>>2];c[a+408+4>>2]=c[b+4>>2];c[a+408+8>>2]=c[b+8>>2];c[a+408+12>>2]=c[b+12>>2];Qq(d,+g[a+408>>2],+g[a+412>>2],+g[a+416>>2],+g[a+404>>2]);c[a+620>>2]=c[d>>2];c[a+620+4>>2]=c[d+4>>2];c[a+620+8>>2]=c[d+8>>2];c[a+620+12>>2]=c[d+12>>2];l=d;return}function Jm(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0;f=l;l=l+16|0;d=+g[b>>2];e=+g[b+4>>2];c=+g[b+8>>2];if(d*d+e*e+c*c>0.0){g[f>>2]=-d;g[f+4>>2]=-e;g[f+8>>2]=-c;g[f+12>>2]=0.0;ve(a,f);d=+g[b>>2];e=+g[b+4>>2];c=+g[b+8>>2]}g[a+52>>2]=+D(+(d*d+e*e+c*c));l=f;return}function Km(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=c[a+328>>2]|0;if((g|0)<=0)return;b=c[b>>2]|0;f=c[a+336>>2]|0;d=0;while(1){e=f+(d<<2)|0;if((c[e>>2]|0)==(b|0))break;d=d+1|0;if((d|0)>=(g|0)){h=7;break}}if((h|0)==7)return;if((d|0)>=(g|0))return;c[e>>2]=c[f+(g+-1<<2)>>2];c[a+328>>2]=g+-1;return}function Lm(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0,f=0.0,h=0.0,i=0.0;e=l;l=l+16|0;f=+XI(b*.5);b=+WI(b*.5);h=+XI(c*.5);c=+WI(c*.5);i=+XI(d*.5);d=+WI(d*.5);g[e+12>>2]=d*h*f-i*c*b;g[e+8>>2]=i*c*f+d*h*b;g[e+4>>2]=i*h*b-d*c*f;g[e>>2]=i*h*f+d*c*b;as(a,e+12|0,e+8|0,e+4|0,e);l=e;return}function Mm(a){a=a|0;var b=0;b=l;l=l+32|0;g[a>>2]=1.2000000476837158;g[a+4>>2]=0.0;g[a+8>>2]=0.0;g[a+12>>2]=1.0e3;g[b+20>>2]=0.0;g[b+16>>2]=0.0;g[b+12>>2]=0.0;$s(a+16|0,b+20|0,b+16|0,b+12|0);c[a+32>>2]=0;c[a+36>>2]=0;g[b+8>>2]=0.0;g[b+4>>2]=-10.0;g[b>>2]=0.0;$s(a+40|0,b+8|0,b+4|0,b);zC(a+56|0);l=b;return}function Nm(a,b,d,e,f,g,h,i,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;+vb[c[(c[a>>2]|0)+44>>2]&3](a,b,d,e,f,g,h,i,j);+vb[c[(c[a>>2]|0)+48>>2]&3](a,b,d,e,f,g,h,i,j);+sb[c[(c[a>>2]|0)+36>>2]&1](a,b,d,i);return 0.0}function Om(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if(c>>>0>0|(c|0)==0&b>>>0>4294967295){while(1){e=xs(b|0,c|0,10,0)|0;d=d+-1|0;a[d>>0]=e&255|48;e=b;b=rB(b|0,c|0,10,0)|0;if(!(c>>>0>9|(c|0)==9&e>>>0>4294967295))break;else c=A}c=b}else c=b;if(c)while(1){d=d+-1|0;a[d>>0]=(c>>>0)%10|0|48;if(c>>>0<10)break;else c=(c>>>0)/10|0}return d|0}function Pm(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0,f=0.0,h=0.0,i=0.0;e=l;l=l+16|0;f=+XI(b*.5);b=+WI(b*.5);h=+XI(c*.5);c=+WI(c*.5);i=+XI(d*.5);d=+WI(d*.5);g[e+12>>2]=i*c*f+d*h*b;g[e+8>>2]=i*h*b-d*c*f;g[e+4>>2]=d*h*f-i*c*b;g[e>>2]=i*h*f+d*c*b;as(a,e+12|0,e+8|0,e+4|0,e);l=e;return}function Qm(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=+h;c[a>>2]=b;c[a+4>>2]=d;c[a+8>>2]=c[e>>2];c[a+8+4>>2]=c[e+4>>2];c[a+8+8>>2]=c[e+8>>2];c[a+8+12>>2]=c[e+12>>2];c[a+24>>2]=c[f>>2];c[a+24+4>>2]=c[f+4>>2];c[a+24+8>>2]=c[f+8>>2];c[a+24+12>>2]=c[f+12>>2];g[a+40>>2]=h;return}function Rm(){var b=0;b=l;l=l+48|0;if(a[22392]|0){l=b;return}if(!(Uz(22392)|0)){l=b;return}g[b+32>>2]=1.0;g[b+28>>2]=0.0;g[b+24>>2]=0.0;g[b+20>>2]=0.0;g[b+16>>2]=1.0;g[b+12>>2]=0.0;g[b+8>>2]=0.0;g[b+4>>2]=0.0;g[b>>2]=1.0;Sq(22792,b+32|0,b+28|0,b+24|0,b+20|0,b+16|0,b+12|0,b+8|0,b+4|0,b);l=b;return}function Sm(){var b=0,e=0,f=0;f=l;l=l+16|0;a[f>>0]=10;b=c[2448]|0;if(!b)if(!(bp(9776)|0)){b=c[2448]|0;e=4}else b=-1;else e=4;do if((e|0)==4){e=c[2449]|0;if(!(e>>>0>=b>>>0|(a[9851]|0)==10)){c[2449]=e+1;a[e>>0]=10;b=10;break}if((Bb[c[9812>>2]&63](9776,f,1)|0)==1)b=d[f>>0]|0;else b=-1}while(0);l=f;return b|0}function Tm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0;e=l;l=l+16|0;c[e>>2]=-1;c[e+4>>2]=c[a+28>>2];if(!(c[b+4>>2]|0))c[b+4>>2]=e;g=c[a+24>>2]|0;f=+qb[c[(c[g>>2]|0)+12>>2]&31](g,b,d);c[a+4>>2]=c[(c[a+24>>2]|0)+4>>2];l=e;return +f}function Um(a,b,c){a=a|0;b=b|0;c=+c;var d=0,e=0.0;d=l;l=l+16|0;e=+MA(+g[b>>2],+g[b+4>>2],+g[b+8>>2]);e=+WI(c*.5)/e;g[d+12>>2]=+g[(gJ(b)|0)>>2]*e;g[d+8>>2]=+g[(OI(b)|0)>>2]*e;g[d+4>>2]=+g[(NI(b)|0)>>2]*e;g[d>>2]=+XI(c*.5);as(a,d+12|0,d+8|0,d+4|0,d);l=d;return}function Vm(a,b){a=a|0;b=b|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];c[a+16>>2]=c[b+16>>2];c[a+16+4>>2]=c[b+16+4>>2];c[a+16+8>>2]=c[b+16+8>>2];c[a+16+12>>2]=c[b+16+12>>2];c[a+32>>2]=c[b+32>>2];c[a+32+4>>2]=c[b+32+4>>2];c[a+32+8>>2]=c[b+32+8>>2];c[a+32+12>>2]=c[b+32+12>>2];return}function Wm(b){b=b|0;var d=0,e=0,f=0,g=0;d=c[b+8>>2]|0;if((d|0)<=0)return;f=0;do{e=c[(c[b+16>>2]|0)+(f<<2)>>2]|0;if(!(a[b+76>>0]|0))switch(c[e+220>>2]|0){case 2:case 5:break;default:g=6}else g=6;if((g|0)==6){g=0;xf(b,e);d=c[b+8>>2]|0}f=f+1|0}while((f|0)<(d|0));return}function Xm(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;a:do switch(b|0){case 2:case 1:{if(c>>>0<3){d=+g[a+600>>2];break a}if((c+-3|0)>>>0<3)d=+g[a+432>>2];else d=0.0;break}case 4:case 3:{if(c>>>0<3){d=+g[a+596>>2];break a}if((c+-3|0)>>>0<3)d=+g[a+604>>2];else d=0.0;break}default:d=0.0}while(0);return +d}function Ym(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[d>>2]|0;b=zb[c[(c[b>>2]|0)+56>>2]&31](b,16)|0;d=c[d>>2]|0;c[b+4>>2]=d;c[b>>2]=9600;a[b+8>>0]=0;c[b+12>>2]=0;c[b+12>>2]=Bb[c[(c[d>>2]|0)+12>>2]&63](d,c[e+8>>2]|0,c[f+8>>2]|0)|0;a[b+8>>0]=1;return b|0}function Zm(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[a+60>>2]|0;if(!d)return;e=xb[c[(c[d>>2]|0)+8>>2]&127](d)|0;e=Bb[c[(c[b>>2]|0)+16>>2]&63](b,e,1)|0;d=c[a+60>>2]|0;d=Bb[c[(c[d>>2]|0)+12>>2]&63](d,c[e+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,d,1346456916,c[a+60>>2]|0);return}function _m(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;a:do switch(c|0){case 5:case -1:switch(b|0){case 2:{d=+g[a+764>>2];break a}case 4:{d=+g[a+760>>2];break a}case 3:{d=+g[a+752>>2];break a}case 1:{d=+g[a+756>>2];break a}default:{d=0.0;break a}}default:d=0.0}while(0);return +d}function $m(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[a+56>>2]|0;if(!d)return;e=xb[c[(c[d>>2]|0)+12>>2]&127](d)|0;e=Bb[c[(c[b>>2]|0)+16>>2]&63](b,e,1)|0;d=c[a+56>>2]|0;d=Bb[c[(c[d>>2]|0)+16>>2]&63](d,c[e+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,d,1213612625,c[a+56>>2]|0);return}function an(a,b,c,d,e,f,h,i,j,k,m,n,o){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;i=+i;j=+j;k=+k;m=+m;n=+n;o=+o;var p=0;p=l;l=l+16|0;g[p+8>>2]=+Iy(b,c,d,e,f,h);g[p+4>>2]=+Iy(b,c,d,i,j,k);g[p>>2]=+Iy(b,c,d,m,n,o);$s(a,p+8|0,p+4|0,p);l=p;return}function bn(a,b,c){a=a|0;b=b|0;c=+c;var d=0.0,e=0.0,f=0.0,h=0.0;e=+g[a+32>>2];f=+g[a+36>>2];h=+g[a+40>>2];d=+g[b>>2];if(!(d<=e+c)){b=0;return b|0}if(!(d>=-e-c)){b=0;return b|0}d=+g[b+4>>2];if(!(d<=f+c)){b=0;return b|0}if(!(d>=-f-c)){b=0;return b|0}d=+g[b+8>>2];if(!(d<=h+c)){b=0;return b|0}b=d>=-h-c;return b|0}function cn(b,d){b=b|0;d=d|0;c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+24>>2]=c[d+24>>2];c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+28>>2]=c[d+28>>2];c[b+32>>2]=c[d+32>>2];c[b+36>>2]=c[d+36>>2];c[b+40>>2]=c[d+40>>2];c[b+56>>2]=c[d+56>>2];c[b+48>>2]=c[d+48>>2];a[b+44>>0]=a[d+44>>0]&1;return}function dn(a,b,d){a=a|0;b=b|0;d=d|0;rw(a);c[a>>2]=3124;c[a+16>>2]=c[b>>2];c[a+16+4>>2]=c[b+4>>2];c[a+16+8>>2]=c[b+8>>2];c[a+16+12>>2]=c[b+12>>2];c[a+32>>2]=c[d>>2];c[a+32+4>>2]=c[d+4>>2];c[a+32+8>>2]=c[d+8>>2];c[a+32+12>>2]=c[d+12>>2];c[a+80>>2]=0;return}function en(b,d,e,f){b=b|0;d=d|0;e=e|0;f=+f;if(!(+g[b+36>>2]>f))return;a[b+40>>0]=1;c[b+4>>2]=c[d>>2];c[b+4+4>>2]=c[d+4>>2];c[b+4+8>>2]=c[d+8>>2];c[b+4+12>>2]=c[d+12>>2];c[b+20>>2]=c[e>>2];c[b+20+4>>2]=c[e+4>>2];c[b+20+8>>2]=c[e+8>>2];c[b+20+12>>2]=c[e+12>>2];g[b+36>>2]=f;return}function fn(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;d=+g[b+32>>2];i=+g[b+40>>2];k=+g[c>>2];e=+g[c+4>>2];j=+D(+(k*k+e*e));f=+g[c+8>>2];if(j!=0.0){h=e*(d/j);e=f<0.0?-i:i;d=k*(d/j)}else{h=0.0;e=f<0.0?-i:i}g[a>>2]=d;g[a+8>>2]=e;g[a+4>>2]=h;return}function gn(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;d=+g[b+32>>2];i=+g[b+36>>2];k=+g[c>>2];e=+g[c+8>>2];j=+D(+(k*k+e*e));f=+g[c+4>>2];if(j!=0.0){h=e*(d/j);e=f<0.0?-i:i;d=k*(d/j)}else{h=0.0;e=f<0.0?-i:i}g[a>>2]=d;g[a+4>>2]=e;g[a+8>>2]=h;return}function hn(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;d=+g[b+36>>2];f=+g[b+32>>2];j=+g[c+4>>2];e=+g[c+8>>2];i=+D(+(j*j+e*e));if(i!=0.0){h=e*(d/i);e=+g[c>>2]<0.0?-f:f;d=j*(d/i)}else{h=0.0;e=+g[c>>2]<0.0?-f:f}g[a+4>>2]=d;g[a>>2]=e;g[a+8>>2]=h;return}function jn(a,b){a=a|0;b=+b;var c=0,d=0.0;c=l;l=l+16|0;if(!(+g[a+68>>2]>0.0)){l=c;return}d=-+g[a+92>>2];b=-+g[a+96>>2];g[c>>2]=-+g[a+88>>2];g[c+4>>2]=d;g[c+8>>2]=b;g[c+12>>2]=0.0;aj(a+4|0,c,a+156|0);aj(a+16|0,a+88|0,a+172|0);l=c;return}function kn(a,b){a=a|0;b=+b;var c=0,d=0.0;c=l;l=l+16|0;if(!(+g[a+68>>2]>0.0)){l=c;return}d=-+g[a+92>>2];b=-+g[a+96>>2];g[c>>2]=-+g[a+88>>2];g[c+4>>2]=d;g[c+8>>2]=b;g[c+12>>2]=0.0;aj(a+4|0,c,a+164|0);aj(a+16|0,a+88|0,a+180|0);l=c;return}function ln(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0,g=0;if((d|0)>-1|(d|0)==-1&c>>>0>4294967295){e=(+(c>>>0)+4294967296.0*+(d>>>0))*18446744073709551616.0+(+(a>>>0)+4294967296.0*+(b>>>0));return +e}else{g=sw(0,0,a|0,b|0)|0;f=A;d=Ow((a|0)==0&(b|0)==0&1|0,0,~c|0,~d|0)|0;e=-+ln(g,f,d,A);return +e}return 0.0}function mn(a){a=a|0;var b=0.0,d=0.0,e=0.0;d=+g[(c[a+28>>2]|0)+404>>2];e=+g[(c[a+32>>2]|0)+404>>2];e=e==0.0?1.0:d/(d+e);d=+g[a+1116>>2]*e+(1.0-e)*+g[a+1180>>2];b=e*+g[a+1120>>2]+(1.0-e)*+g[a+1184>>2];g[a+1284>>2]=+g[a+1112>>2]*e+ +g[a+1176>>2]*(1.0-e);g[a+1288>>2]=d;g[a+1292>>2]=b;g[a+1296>>2]=0.0;return}function nn(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0;d=+g[a+404>>2];if(d!=0.0){f=1.0/d*+g[b+4>>2];e=1.0/d*+g[b+8>>2];g[a+424>>2]=1.0/d*+g[b>>2];g[a+428>>2]=f;g[a+432>>2]=e;g[a+436>>2]=0.0}c[a+440>>2]=c[b>>2];c[a+440+4>>2]=c[b+4>>2];c[a+440+8>>2]=c[b+8>>2];c[a+440+12>>2]=c[b+12>>2];return}function on(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=c[b+16>>2]|0;do if(f){if((f|0)!=(d|0)){c[b+36>>2]=(c[b+36>>2]|0)+1;c[b+24>>2]=2;a[b+54>>0]=1;break}if((c[b+24>>2]|0)==2)c[b+24>>2]=e}else{c[b+16>>2]=d;c[b+24>>2]=e;c[b+36>>2]=1}while(0);return}function pn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=c[a+84>>2]|0;a=c[f+8>>2]|0;if((a|0)<=0)return;e=0;do{d=c[(c[f+16>>2]|0)+(e*12|0)+8>>2]|0;if(d){Ob[c[(c[d>>2]|0)+16>>2]&127](d,b);a=c[f+8>>2]|0}e=e+1|0}while((e|0)<(a|0));return}function qn(a,b,d){a=a|0;b=b|0;d=d|0;Ut(a);c[a>>2]=2952;c[a+24>>2]=c[b>>2];c[a+24+4>>2]=c[b+4>>2];c[a+24+8>>2]=c[b+8>>2];c[a+24+12>>2]=c[b+12>>2];c[a+40>>2]=c[d>>2];c[a+40+4>>2]=c[d+4>>2];c[a+40+8>>2]=c[d+8>>2];c[a+40+12>>2]=c[d+12>>2];return}function rn(){var b=0,d=0,e=0;do if((c[2463]|0)>=0?(kJ()|0)!=0:0){if((a[9851]|0)!=10?(b=c[2449]|0,b>>>0<(c[2448]|0)>>>0):0){c[2449]=b+1;a[b>>0]=10;break}Sm()|0}else e=3;while(0);do if((e|0)==3){if((a[9851]|0)!=10?(d=c[2449]|0,d>>>0<(c[2448]|0)>>>0):0){c[2449]=d+1;a[d>>0]=10;break}Sm()|0}while(0);return}function sn(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[d>>2]|0;a=vy(c[b>>2]|0)|0;f=vy(f)|0;if(a|0)Vb[c[(c[a>>2]|0)+32>>2]&127](a,d,e,b);if(!f)return 0;Vb[c[(c[f>>2]|0)+32>>2]&127](f,b,e,d);return 0}function tn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+48|0;f=c[b+192>>2]|0;Vb[c[(c[f>>2]|0)+8>>2]&127](f,b+4|0,e+32|0,e+16|0);c[e>>2]=6304;c[e+4>>2]=b;c[e+8>>2]=a;c[e+12>>2]=d;d=c[a+68>>2]|0;Vb[c[(c[d>>2]|0)+28>>2]&127](d,e+32|0,e+16|0,e);l=e;return}function un(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=l;l=l+256|0;if((c|0)>(d|0)&(e&73728|0)==0){Yk(f|0,b|0,((c-d|0)>>>0<256?c-d|0:256)|0)|0;if((c-d|0)>>>0>255){b=c-d|0;do{fA(a,f,256);b=b+-256|0}while(b>>>0>255);b=c-d&255}else b=c-d|0;fA(a,f,b)}l=f;return}function vn(a,b,d){a=a|0;b=b|0;d=d|0;fi(a,b,d)|0;c[b+52>>2]=c[a+300>>2];c[b+56>>2]=c[a+304>>2];c[b+60>>2]=c[a+308>>2];c[b+64>>2]=c[a+312>>2];c[b+68>>2]=c[a+316>>2];c[b+72>>2]=c[a+320>>2];c[b+76>>2]=c[a+324>>2];c[b+80>>2]=c[a+328>>2];return 12513}function wn(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[b>>2]|0;e=c[a+84>>2]|0;if((d|0)==(e|0)){e=0;return e|0}if(!(c[a+12>>2]&c[b+4>>2])){e=0;return e|0}if(!(c[b+8>>2]&c[a+8>>2])){e=0;return e|0}b=c[a+96>>2]|0;e=Bb[c[(c[b>>2]|0)+28>>2]&63](b,e,d)|0;return e|0}function xn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=l;l=l+112|0;d=gJ(c[b+4>>2]|0)|0;e=f;g=e+104|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(g|0));PG(f);Fm(a,d,f);Jo(b,d,c[a+12>>2]|0);l=f;return}function yn(a){a=a|0;c[5650]=c[a>>2];c[5651]=c[a+4>>2];c[5652]=c[a+8>>2];c[5653]=c[a+12>>2];c[5654]=c[a+16>>2];c[5655]=c[a+20>>2];c[5656]=c[a+24>>2];Vm(22628,a+28|0);c[5669]=c[a+76>>2];c[5670]=c[a+76+4>>2];c[5671]=c[a+76+8>>2];c[5672]=c[a+76+12>>2];c[5673]=c[a+76+16>>2];return}function zn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=l;l=l+64|0;d=gJ(c[b+4>>2]|0)|0;e=f;g=e+52|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(g|0));PG(f);Bm(a,d,f);Eo(b,d,c[a+12>>2]|0);l=f;return}function An(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=l;l=l+48|0;d=gJ(c[b+4>>2]|0)|0;e=f;g=e+44|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(g|0));PG(f);Hm(a,d,f);Oo(b,d,c[a+12>>2]|0);l=f;return}function Bn(a){a=a|0;var b=0,d=0,e=0;Ib[c[(c[a>>2]|0)+8>>2]&511](a);Ib[c[(c[a>>2]|0)+12>>2]&511](a);b=c[a+24>>2]|0;if(!b)return;e=c[(c[b>>2]|0)+32>>2]|0;d=c[a+68>>2]|0;d=xb[c[(c[d>>2]|0)+36>>2]&127](d)|0;Vb[e&127](b,d,a+28|0,c[a+24>>2]|0);return}function Cn(a,b){a=+a;b=+b;var d=0;d=Nt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;c[d+4>>2]=10;c[d>>2]=7936;g[d+48>>2]=a;c[d+56>>2]=2;g[d+32>>2]=a;g[d+36>>2]=a;g[d+40>>2]=b*.5;g[d+44>>2]=0.0;return d|0}function Dn(a,b){a=+a;b=+b;var d=0;d=Nt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;c[d+4>>2]=10;c[d>>2]=7836;g[d+48>>2]=a;c[d+56>>2]=0;g[d+32>>2]=b*.5;g[d+36>>2]=a;g[d+40>>2]=a;g[d+44>>2]=0.0;return d|0}function En(a,b,c){a=a|0;b=b|0;c=+c;var d=0,e=0;e=l;l=l+32|0;d=Ss()|0;g[e+8>>2]=1.0;g[e+4>>2]=0.0;g[e>>2]=0.0;$s(e+16|0,e+8|0,e+4|0,e);Hg(d,a,b,c,e+16|0);l=e;return d|0}function Fn(a,b){a=+a;b=+b;var d=0;d=Nt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;c[d>>2]=7736;g[d+48>>2]=a;c[d+4>>2]=10;c[d+56>>2]=1;g[d+32>>2]=a;g[d+36>>2]=b*.5;g[d+40>>2]=a;g[d+44>>2]=0.0;return d|0}function Gn(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;j=gJ(b)|0;i=gJ(b+16|0)|0;h=gJ(b+32|0)|0;g=OI(b)|0;f=OI(b+16|0)|0;e=OI(b+32|0)|0;d=NI(b)|0;c=NI(b+16|0)|0;Sq(a,j,i,h,g,f,e,d,c,NI(b+32|0)|0);return}function Hn(a,b){a=a|0;b=b|0;var d=0;if(c[b+40>>2]|0){Hn(a,c[b+36>>2]|0);Hn(a,c[b+40>>2]|0)}if((c[a>>2]|0)==(b|0))c[a>>2]=0;d=c[a+4>>2]|0;if(!d){c[a+4>>2]=b;return}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);c[a+4>>2]=b;return}function In(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=c[a+32>>2]|0;c[g>>2]=(c[g>>2]|0)+1;qg(a,Qd(a,b,f)|0);qg(a,Qd(a,d,f)|0);qg(a,Qd(a,e,f)|0);return}function Jn(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;if(qD(a,c[b+8>>2]|0)|0)ml(b,d,e,f);else{a=c[a+8>>2]|0;$b[c[(c[a>>2]|0)+20>>2]&7](a,b,d,e,f,g)}return}function Kn(a){a=a|0;var b=0;b=l;l=l+48|0;g[b+32>>2]=1.0;g[b+28>>2]=0.0;g[b+24>>2]=0.0;g[b+20>>2]=0.0;g[b+16>>2]=1.0;g[b+12>>2]=0.0;g[b+8>>2]=0.0;g[b+4>>2]=0.0;g[b>>2]=1.0;Ip(a,b+32|0,b+28|0,b+24|0,b+20|0,b+16|0,b+12|0,b+8|0,b+4|0,b);l=b;return}function Ln(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[a+4>>2]|0;e=gJ(d)|0;if((e|0)==(gJ(c[a+8>>2]|0)|0)){eo(a,$B(e)|0);d=c[a+4>>2]|0}zm((c[a+12>>2]|0)+(d*96|0)|0,b);c[a+4>>2]=(c[a+4>>2]|0)+1;return}function Mn(a,b){a=a|0;b=b|0;var d=0,e=0;c[a+72>>2]=(c[a+72>>2]|0)+1;d=c[a+20>>2]|0;if((d|0)>0)do{e=d;d=d+-1|0;if((c[(c[a+28>>2]|0)+(d*80|0)+64>>2]|0)==(b|0))re(a,d)}while((e|0)>1);Ib[c[(c[a>>2]|0)+68>>2]&511](a);return}function Nn(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;switch(b|0){case 2:case 1:if(e>>>0<3){g[a+600>>2]=d;c[a+592>>2]=c[a+592>>2]|2;return}else{g[a+432>>2]=d;return}case 4:case 3:{g[(e>>>0<3?a+596|0:a+604|0)>>2]=d;c[a+592>>2]=c[a+592>>2]|(e>>>0<3?1:4);return}default:return}}function On(a,b){a=a|0;b=b|0;var d=0;a=c[a+68>>2]|0;if(!b)return;d=c[a+16>>2]|0;if(d>>>0<=b>>>0?(d+(P(c[a>>2]|0,c[a+4>>2]|0)|0)|0)>>>0>b>>>0:0){c[b>>2]=c[a+12>>2];c[a+12>>2]=b;c[a+8>>2]=(c[a+8>>2]|0)+1;return}c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function Pn(a){a=a|0;var b=0,d=0;if((c[a+248>>2]|0)<=0)return;b=0;do{d=(c[(c[a+256>>2]|0)+(b<<2)>>2]|0)+472|0;c[d>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;c[d+24>>2]=0;c[d+28>>2]=0;b=b+1|0}while((b|0)<(c[a+248>>2]|0));return}function Qn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=gJ(c[a+4>>2]|0)|0;if((e|0)>(b|0)){c[a+4>>2]=b;return}if((e|0)<(b|0))eo(a,b);while(1){if((e|0)>=(b|0))break;zm((c[a+12>>2]|0)+(e*96|0)|0,d);e=e+1|0}c[a+4>>2]=b;return}function Rn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=l;l=l+96|0;d=gJ(c[b+4>>2]|0)|0;e=f;g=e+96|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(g|0));Qn(a,d,f);Zq(b,d,c[a+12>>2]|0);l=f;return}function Sn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=c[a+52>>2]|0;if((d|0)<=0)return;f=0;do{e=c[(c[a+60>>2]|0)+(f<<2)>>2]|0;if(e){Ob[c[(c[e>>2]|0)+16>>2]&127](e,b);d=c[a+52>>2]|0}f=f+1|0}while((f|0)<(d|0));return}function Tn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=gJ(c[a+4>>2]|0)|0;if((e|0)>(b|0)){c[a+4>>2]=b;return}if((e|0)<(b|0))$n(a,b);while(1){if((e|0)>=(b|0))break;c[(c[a+12>>2]|0)+(e<<2)>>2]=c[d>>2];e=e+1|0}c[a+4>>2]=b;return}function Un(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[a+32>>2]|0;c[f>>2]=(c[f>>2]|0)+1;qg(a,Qd(a,b,0)|0);qg(a,Qd(a,d,0)|0);qg(a,Qd(a,e,0)|0);return}function Vn(a,b,d){a=a|0;b=b|0;d=d|0;c[a+52>>2]=c[b>>2];c[a+52+4>>2]=c[b+4>>2];c[a+52+8>>2]=c[b+8>>2];c[a+52+12>>2]=c[b+12>>2];c[a+68>>2]=c[d>>2];c[a+68+4>>2]=c[d+4>>2];c[a+68+8>>2]=c[d+8>>2];c[a+68+12>>2]=c[d+12>>2];c[a+48>>2]=1;return}function Wn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=c[d>>2]|0;a=vy(c[b>>2]|0)|0;e=vy(e)|0;if(a|0)Sb[c[(c[a>>2]|0)+28>>2]&127](a,d,b);if(!e)return 0;Sb[c[(c[e>>2]|0)+28>>2]&127](e,b,d);return 0}function Xn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=a;e=b;f=d+104|0;do{c[d>>2]=c[e>>2];d=d+4|0;e=e+4|0}while((d|0)<(f|0));Sv(a+104|0,b+104|0);Tv(a+124|0,b+124|0);Tv(a+144|0,b+144|0);return}function Yn(a,d){a=a|0;d=d|0;var e=0,f=0;if(b[a+56>>1]|0)return;b[a+64>>1]=1;d=b[a+58>>1]|0;f=c[a+60>>2]|0;if((d&65535)>1){e=1;do{d=e;e=e+1|0;b[f+(d<<6)+48>>1]=e;d=b[a+58>>1]|0}while(e>>>0<(d&65535)>>>0)}b[f+((d&65535)+-1<<6)+48>>1]=0;return}function Zn(a,b,c){a=+a;b=b|0;c=c|0;var d=0,e=0;e=l;l=l+32|0;d=Ds(144)|0;g[e+8>>2]=0.0;g[e+4>>2]=0.0;g[e>>2]=0.0;$s(e+16|0,e+8|0,e+4|0,e);Xk(d,a,b,c,e+16|0);l=e;return d|0}function _n(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[d>>2]=c[b+16>>2];c[d+4>>2]=c[b+16+4>>2];c[d+8>>2]=c[b+16+8>>2];c[d+12>>2]=c[b+16+12>>2];c[e>>2]=c[b+32>>2];c[e+4>>2]=c[b+32+4>>2];c[e+8>>2]=c[b+32+8>>2];c[e+12>>2]=c[b+32+12>>2];return}function $n(b,d){b=b|0;d=d|0;var e=0;if((gJ(c[b+8>>2]|0)|0)>=(d|0))return;e=It(d)|0;tr(b,gJ(c[b+4>>2]|0)|0,e);et(b);a[b+16>>0]=1;c[b+12>>2]=e;c[b+8>>2]=d;return}function ao(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;i=c[a+4>>2]|0;if(!(i&1))h=i>>8;else h=c[(c[e>>2]|0)+(i>>8)>>2]|0;a=c[a>>2]|0;$b[c[(c[a>>2]|0)+20>>2]&7](a,b,d,e+h|0,i&2|0?f:2,g);return}function bo(a,b){a=a|0;b=b|0;var d=0;a=c[a+68>>2]|0;d=c[a+12>>2]|0;if(d|0){c[a+12>>2]=c[d>>2];c[a+8>>2]=(c[a+8>>2]|0)+-1;b=d;return b|0}c[6995]=(c[6995]|0)+1;a=sc(b+19|0)|0;if(!a){b=0;return b|0}c[(a+4+15&-16)+-4>>2]=a;b=a+4+15&-16;return b|0}function co(b){b=b|0;g[b+60>>2]=0.0;g[b+8>>2]=0.0;g[b+12>>2]=.10000000149011612;g[b+16>>2]=300.0;g[b>>2]=1.0;g[b+4>>2]=-1.0;g[b+28>>2]=0.0;g[b+32>>2]=.20000000298023224;g[b+36>>2]=0.0;g[b+40>>2]=0.0;g[b+20>>2]=1.0;g[b+24>>2]=.5;c[b+56>>2]=0;g[b+48>>2]=0.0;a[b+44>>0]=0;return}function eo(b,d){b=b|0;d=d|0;var e=0;if((gJ(c[b+8>>2]|0)|0)>=(d|0))return;e=$t(d)|0;Zq(b,gJ(c[b+4>>2]|0)|0,e);et(b);a[b+16>>0]=1;c[b+12>>2]=e;c[b+8>>2]=d;return}function fo(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;g[a+692>>2]=(c-b)*.5;b=+mh((c-b)*.5+b,6.2831854820251465);if(!(b<-3.1415927410125732)){if(b>3.1415927410125732)b=b+-6.2831854820251465}else b=b+6.2831854820251465;g[a+688>>2]=b;g[a+696>>2]=d;g[a+700>>2]=e;g[a+704>>2]=f;return}function go(a,b,d){a=a|0;b=+b;d=+d;var e=0;e=l;l=l+16|0;g[e+12>>2]=b;g[e+8>>2]=d;g[e+4>>2]=0.0;g[e>>2]=1.0;c[a+504>>2]=c[(b<0.0?e+4|0:b>1.0?e:e+12|0)>>2];g[e+4>>2]=0.0;g[e>>2]=1.0;c[a+508>>2]=c[(d<0.0?e+4|0:d>1.0?e:e+8|0)>>2];l=e;return}function ho(){var b=0;b=l;l=l+32|0;if(a[22384]|0){l=b;return}if(!(Uz(22384)|0)){l=b;return}Rm();g[b+8>>2]=0.0;g[b+4>>2]=0.0;g[b>>2]=0.0;$s(b+16|0,b+8|0,b+4|0,b);Xq(22728,22792,b+16|0);l=b;return}function io(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[(c[b>>2]|0)+16>>2]|0;e=xb[c[(c[a>>2]|0)+16>>2]&127](a)|0;e=Bb[d&63](b,e,1)|0;d=Bb[c[(c[a>>2]|0)+20>>2]&63](a,c[e+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,d,1497645650,a);return}function jo(b,d){b=b|0;d=d|0;var e=0;if((gJ(c[b+8>>2]|0)|0)>=(d|0))return;e=du(d)|0;Jo(b,gJ(c[b+4>>2]|0)|0,e);et(b);a[b+16>>0]=1;c[b+12>>2]=e;c[b+8>>2]=d;return}function ko(b,d){b=b|0;d=d|0;var e=0;if((gJ(c[b+8>>2]|0)|0)>=(d|0))return;e=eu(d)|0;Eo(b,gJ(c[b+4>>2]|0)|0,e);et(b);a[b+16>>0]=1;c[b+12>>2]=e;c[b+8>>2]=d;return}function lo(b,d){b=b|0;d=d|0;var e=0;if((gJ(c[b+8>>2]|0)|0)>=(d|0))return;e=fu(d)|0;Oo(b,gJ(c[b+4>>2]|0)|0,e);et(b);a[b+16>>0]=1;c[b+12>>2]=e;c[b+8>>2]=d;return}function mo(a,b,d){a=a|0;b=b|0;d=d|0;c[b>>2]=c[a+52>>2];c[b+4>>2]=c[a+52+4>>2];c[b+8>>2]=c[a+52+8>>2];c[b+12>>2]=c[a+52+12>>2];c[d>>2]=c[a+68>>2];c[d+4>>2]=c[a+68+4>>2];c[d+8>>2]=c[a+68+8>>2];c[d+12>>2]=c[a+68+12>>2];return}function no(a){a=a|0;var b=0,d=0,e=0;b=c[a+24>>2]|0;if((b|0)<=0)return;e=0;do{d=c[(c[a+32>>2]|0)+(e<<2)>>2]|0;switch(c[d+220>>2]|0){case 2:case 5:break;default:{Eg(d);b=c[a+24>>2]|0}}e=e+1|0}while((e|0)<(b|0));return}function oo(a,b){a=a|0;b=b|0;var d=0,e=0;e=xb[c[(c[a>>2]|0)+16>>2]&127](a)|0;e=Bb[c[(c[b>>2]|0)+16>>2]&63](b,e,1)|0;d=Bb[c[(c[a>>2]|0)+20>>2]&63](a,c[e+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,d,1245859651,a);return}function po(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;if(qD(a,c[b+8>>2]|0)|0)on(b,d,e);else{a=c[a+8>>2]|0;Vb[c[(c[a>>2]|0)+28>>2]&127](a,b,d,e)}return}function qo(a,b,c){a=a|0;b=b|0;c=+c;var d=0;d=l;l=l+16|0;g[d+12>>2]=+g[(gJ(b)|0)>>2]*c;g[d+8>>2]=+g[(OI(b)|0)>>2]*c;g[d+4>>2]=+g[(NI(b)|0)>>2]*c;g[d>>2]=+g[b+12>>2]*c;dw(a,d+12|0,d+8|0,d+4|0,d);l=d;return}function ro(a,b,d){a=a|0;b=b|0;d=d|0;c[b>>2]=c[a+8>>2];c[b+4>>2]=c[a+8+4>>2];c[b+8>>2]=c[a+8+8>>2];c[b+12>>2]=c[a+8+12>>2];c[d>>2]=c[a+24>>2];c[d+4>>2]=c[a+24+4>>2];c[d+8>>2]=c[a+24+8>>2];c[d+12>>2]=c[a+24+12>>2];return}function so(a,b){a=a|0;b=b|0;var d=0,e=0;e=xb[c[(c[a>>2]|0)+52>>2]&127](a)|0;e=Bb[c[(c[b>>2]|0)+16>>2]&63](b,e,1)|0;d=Bb[c[(c[a>>2]|0)+56>>2]&63](a,c[e+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,d,1346455635,a);return}function to(a,b){a=a|0;b=b|0;var c=0;c=l;l=l+80|0;Gn(c+32|0,b);Br(c,+g[b+48>>2],+g[b+52>>2],+g[b+56>>2]);fm(c+16|0,c+32|0,+g[c>>2],+g[c+4>>2],+g[c+8>>2]);Xq(a,c+32|0,c+16|0);l=c;return}function uo(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=c[a+4>>2]|0;if(!(h&1))g=h>>8;else g=c[(c[d>>2]|0)+(h>>8)>>2]|0;a=c[a>>2]|0;Zb[c[(c[a>>2]|0)+24>>2]&31](a,b,d+g|0,h&2|0?e:2,f);return}function vo(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;f=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=f;if(f|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;return 17123}function wo(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0;e=l;l=l+32|0;jq(e,b,c,d,+g[a+408>>2],+g[a+412>>2],+g[a+416>>2]);Qq(e+16|0,+g[e>>2],+g[e+4>>2],+g[e+8>>2],+g[a+404>>2]);us(a+372|0,e+16|0)|0;l=e;return}function xo(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0;e=l;l=l+32|0;fm(e,a+324|0,b,c,d);jq(e+16|0,+g[e>>2],+g[e+4>>2],+g[e+8>>2],+g[a+604>>2],+g[a+608>>2],+g[a+612>>2]);us(a+388|0,e+16|0)|0;l=e;return}function yo(a,b,d){a=a|0;b=b|0;d=d|0;c[a+164>>2]=c[b>>2];c[a+164+4>>2]=c[b+4>>2];c[a+164+8>>2]=c[b+8>>2];c[a+164+12>>2]=c[b+12>>2];b=gJ(b)|0;if((!(+g[b>>2]!=1.0)?!(+g[b+4>>2]!=1.0):0)?!(+g[b+8>>2]!=1.0):0)d=0;c[a+180>>2]=d;return}function zo(a,b,d){a=a|0;b=b|0;d=d|0;c[b>>2]=c[a+952>>2];c[b+4>>2]=c[a+952+4>>2];c[b+8>>2]=c[a+952+8>>2];c[b+12>>2]=c[a+952+12>>2];c[d>>2]=c[a+968>>2];c[d+4>>2]=c[a+968+4>>2];c[d+8>>2]=c[a+968+8>>2];c[d+12>>2]=c[a+968+12>>2];return}function Ao(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;a:do if((c|0)==-1)switch(b|0){case 2:case 1:{d=+g[a+336>>2];break a}case 4:case 3:{d=+g[a+340>>2];break a}default:{d=3402823466385288598117041.0e14;break a}}else d=3402823466385288598117041.0e14;while(0);return +d}function Bo(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0;f=+g[b+32>>2];e=+g[b+36>>2];e=+g[c+4>>2]>=0.0?e:-e;d=+g[b+40>>2];d=+g[c+8>>2]>=0.0?d:-d;g[a>>2]=+g[c>>2]>=0.0?f:-f;g[a+4>>2]=e;g[a+8>>2]=d;g[a+12>>2]=0.0;return}function Co(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=c[a+4>>2]|0;if(!(g&1))f=g>>8;else f=c[(c[d>>2]|0)+(g>>8)>>2]|0;a=c[a>>2]|0;Vb[c[(c[a>>2]|0)+28>>2]&127](a,b,d+f|0,g&2|0?e:2);return}function Do(b){b=b|0;var d=0;c[b>>2]=5168;d=c[b+212>>2]|0;if(d|0){if(a[b+216>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+212>>2]=0}a[b+216>>0]=1;c[b+212>>2]=0;c[b+204>>2]=0;c[b+208>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function Eo(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=0;while(1){if((e|0)>=(b|0))break;f=gJ(d+(e*52|0)|0)|0;g=(c[a+12>>2]|0)+(e*52|0)|0;h=f+52|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));e=e+1|0}return}function Fo(a,b){a=a|0;b=b|0;var d=0,e=0;e=c[a+288>>2]|0;a:do if((e|0)>0){d=c[a+296>>2]|0;a=0;while(1){if((c[d+(a<<2)>>2]|0)==(b|0))break a;a=a+1|0;if((a|0)>=(e|0)){a=e;break}}}else a=e;while(0);return (a|0)>=(e|0)|0}function Go(b){b=b|0;var d=0;d=l;l=l+16|0;if(!(a[22368]|0))Uz(22368)|0;Bp(d,c[b+108>>2]|0,c[b+120>>2]|0);c[5674]=c[d>>2];c[5675]=c[d+4>>2];c[5676]=c[d+8>>2];c[5677]=c[d+12>>2];l=d;return 22696}function Ho(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=c[b>>2]|0;a=zb[c[(c[a>>2]|0)+56>>2]&31](a,84)|0;ul(a,b,d,e,1);return a|0}function Io(a,b){a=a|0;b=b|0;var d=0;d=c[a+4>>2]|0;if((c[b>>2]|0)!=(d|0)?(c[b+4>>2]|0)!=(d|0):0)return 0;d=c[a+8>>2]|0;Sb[c[(c[d>>2]|0)+32>>2]&127](d,b,c[a+12>>2]|0);return 0}function Jo(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=0;while(1){if((e|0)>=(b|0))break;f=d+(e*104|0)|0;g=(c[a+12>>2]|0)+(e*104|0)|0;h=f+104|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));e=e+1|0}return}function Ko(b){b=b|0;var d=0;c[b>>2]=9712;d=c[b+32>>2]|0;if(d|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function Lo(a){a=a|0;var b=0.0,d=0.0;if(c[a+204>>2]&3|0)return;d=+g[a+428>>2]*+g[a+412>>2];b=+g[a+432>>2]*+g[a+416>>2];g[a+472>>2]=+g[a+424>>2]*+g[a+408>>2]+ +g[a+472>>2];g[a+476>>2]=d+ +g[a+476>>2];g[a+480>>2]=b+ +g[a+480>>2];return}function Mo(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=c[b>>2]|0;a=zb[c[(c[a>>2]|0)+56>>2]&31](a,84)|0;ul(a,b,d,e,0);return a|0}function No(b){b=b|0;var d=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(d|0){if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0}a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function Oo(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=0;while(1){if((e|0)>=(b|0))break;f=d+(e*44|0)|0;g=(c[a+12>>2]|0)+(e*44|0)|0;h=f+44|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));e=e+1|0}return}function Po(a,b){a=a|0;b=b|0;var c=0;c=l;l=l+16|0;g[c+12>>2]=-+g[(gJ(b)|0)>>2];g[c+8>>2]=-+g[(OI(b)|0)>>2];g[c+4>>2]=-+g[(NI(b)|0)>>2];g[c>>2]=-+g[b+12>>2];dw(a,c+12|0,c+8|0,c+4|0,c);l=c;return}function Qo(a){a=a|0;var b=0;c[a>>2]=5820;c[a+8>>2]=5868;b=c[a+56>>2]|0;Ob[c[(c[b>>2]|0)+20>>2]&127](b,c[a+72>>2]|0);b=c[a+56>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,c[a+72>>2]|0);c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Ro(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0;e=l;l=l+16|0;d=+EF(a);d=+VI(d*+EF(b));c=+Gp(a,b);if(c<0.0){Po(e,b);c=+Gp(a,e)}d=+$A(c/d)*2.0;l=e;return +d}function So(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0;h=c[a+108>>2]|0;f=+g[h+(b<<4)+4>>2]*+g[a+20>>2];e=+g[h+(b<<4)+8>>2]*+g[a+24>>2];g[d>>2]=+g[h+(b<<4)>>2]*+g[a+16>>2];g[d+4>>2]=f;g[d+8>>2]=e;g[d+12>>2]=0.0;return}function To(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=l;l=l+32|0;c[e>>2]=c[a+60>>2];c[e+4>>2]=0;c[e+8>>2]=b;c[e+12>>2]=e+20;c[e+16>>2]=d;if((SC(_a(140,e|0)|0)|0)<0){c[e+20>>2]=-1;a=-1}else a=c[e+20>>2]|0;l=e;return a|0}function Uo(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;f=c[d>>2]|0;f=zb[c[(c[f>>2]|0)+56>>2]&31](f,12)|0;e=a[b+4>>0]|0;c[f+4>>2]=c[d>>2];c[f>>2]=3820;a[f+8>>0]=e;return f|0}function Vo(b,c){b=b|0;c=c|0;var d=0,e=0;d=a[b>>0]|0;e=a[c>>0]|0;if(d<<24>>24==0?1:d<<24>>24!=e<<24>>24)b=e;else{do{b=b+1|0;c=c+1|0;d=a[b>>0]|0;e=a[c>>0]|0}while(!(d<<24>>24==0?1:d<<24>>24!=e<<24>>24));b=e}return (d&255)-(b&255)|0}function Wo(a,b){a=a|0;b=b|0;var c=0.0;c=+g[(gJ(b)|0)>>2];g[a>>2]=+g[a>>2]+c;c=+g[(OI(b)|0)>>2];g[a+4>>2]=+g[a+4>>2]+c;c=+g[(NI(b)|0)>>2];g[a+8>>2]=+g[a+8>>2]+c;g[a+12>>2]=+g[a+12>>2]+ +g[b+12>>2];return a|0}function Xo(a,b){a=a|0;b=b|0;var c=0.0;c=+g[(gJ(b)|0)>>2];g[a>>2]=+g[a>>2]-c;c=+g[(OI(b)|0)>>2];g[a+4>>2]=+g[a+4>>2]-c;c=+g[(NI(b)|0)>>2];g[a+8>>2]=+g[a+8>>2]-c;g[a+12>>2]=+g[a+12>>2]-+g[b+12>>2];return a|0}function Yo(b){b=b|0;var d=0;d=l;l=l+16|0;if(!(a[22352]|0))Uz(22352)|0;Ob[c[(c[b>>2]|0)+76>>2]&127](d,b);c[5646]=c[d>>2];c[5647]=c[d+4>>2];c[5648]=c[d+8>>2];c[5649]=c[d+12>>2];l=d;return 22584}function Zo(b){b=b|0;var d=0;d=l;l=l+16|0;if(!(a[22416]|0))Uz(22416)|0;Ob[c[(c[b>>2]|0)+76>>2]&127](d,b);c[5718]=c[d>>2];c[5719]=c[d+4>>2];c[5720]=c[d+8>>2];c[5721]=c[d+12>>2];l=d;return 22872}function _o(a){a=a|0;var b=0,d=0;d=a+15&-16|0;b=c[i>>2]|0;a=b+d|0;if((d|0)>0&(a|0)<(b|0)|(a|0)<0){X()|0;Za(12);return -1}c[i>>2]=a;if((a|0)>(W()|0)?(V()|0)==0:0){c[i>>2]=b;Za(12);return -1}return b|0}function $o(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=gJ(c[b+4>>2]|0)|0;c[d>>2]=0;Tn(a,e,d);tr(b,e,c[a+12>>2]|0);l=d;return}function ap(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0;e=+g[b+20>>2];d=e*+g[b+260>>2]+ +g[b+72>>2];c=e*+g[b+264>>2]+ +g[b+76>>2];g[a>>2]=+g[b+256>>2]*e+ +g[b+68>>2];g[a+4>>2]=d;g[a+8>>2]=c;g[a+12>>2]=0.0;return}function bp(b){b=b|0;var d=0;d=a[b+74>>0]|0;a[b+74>>0]=d+255|d;d=c[b>>2]|0;if(!(d&8)){c[b+8>>2]=0;c[b+4>>2]=0;d=c[b+44>>2]|0;c[b+28>>2]=d;c[b+20>>2]=d;c[b+16>>2]=d+(c[b+48>>2]|0);b=0}else{c[b>>2]=d|32;b=-1}return b|0}function cp(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;if((e|0)!=-1)return;switch(b|0){case 2:case 1:{g[a+336>>2]=d;c[a+332>>2]=c[a+332>>2]|1;return}case 4:case 3:{g[a+340>>2]=d;c[a+332>>2]=c[a+332>>2]|2;return}default:return}}function dp(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+g[(NI(a)|0)>>2];c=c*+g[(gJ(b)|0)>>2];d=+g[(NI(a+16|0)|0)>>2];d=c+d*+g[(OI(b)|0)>>2];c=+g[(NI(a+32|0)|0)>>2];return +(d+c*+g[(NI(b)|0)>>2])}function ep(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+g[(OI(a)|0)>>2];c=c*+g[(gJ(b)|0)>>2];d=+g[(OI(a+16|0)|0)>>2];d=c+d*+g[(OI(b)|0)>>2];c=+g[(OI(a+32|0)|0)>>2];return +(d+c*+g[(NI(b)|0)>>2])}function fp(b,d,e){b=b|0;d=d|0;e=+e;var f=0;f=l;l=l+16|0;if(!(a[22376]|0))Uz(22376)|0;_i(f,b,d,e);c[5678]=c[f>>2];c[5679]=c[f+4>>2];c[5680]=c[f+8>>2];c[5681]=c[f+12>>2];l=f;return 22712}function gp(b,d,e){b=b|0;d=d|0;e=+e;var f=0;f=l;l=l+16|0;if(!(a[22424]|0))Uz(22424)|0;_i(f,b,d,e);c[5722]=c[f>>2];c[5723]=c[f+4>>2];c[5724]=c[f+8>>2];c[5725]=c[f+12>>2];l=f;return 22888}function hp(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;if((b|0)==(d|0))return;e=c[(c[a+4>>2]|0)+96>>2]|0;Bb[c[(c[e>>2]|0)+8>>2]&63](e,c[b+36>>2]|0,c[d+36>>2]|0)|0;d=(c[a+4>>2]|0)+120|0;c[d>>2]=(c[d>>2]|0)+1;return}function ip(a){a=a|0;var b=0,d=0.0,e=0.0,f=0.0;b=l;l=l+32|0;Sb[c[(c[a>>2]|0)+12>>2]&127](a,b+8|0,b);f=+g[b+8>>2];e=+g[b+8+4>>2];d=+g[b+8+8>>2];d=+D(+(f*f+e*e+d*d));l=b;return +(d+ +g[b>>2])}function jp(a){a=a|0;var b=0;c[a>>2]=5868;b=c[a+48>>2]|0;Ob[c[(c[b>>2]|0)+20>>2]&127](b,c[a+64>>2]|0);b=c[a+48>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,c[a+64>>2]|0);c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function kp(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=l;l=l+16|0;c[f>>2]=5516;c[f+4>>2]=d;c[f+8>>2]=a;Sb[c[(c[b>>2]|0)+48>>2]&127](b,f,e);l=f;return}function lp(a,b,d){a=a|0;b=b|0;d=d|0;a=c[b+8>>2]|0;if(!((d|0)!=0&(a|0)!=0))return;Ib[c[c[a>>2]>>2]&511](a);Ob[c[(c[d>>2]|0)+60>>2]&127](d,c[b+8>>2]|0);c[b+8>>2]=0;return}function mp(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=l;l=l+16|0;c[e>>2]=9144;c[e+4>>2]=b;c[e+8>>2]=a;c[e+12>>2]=d;Sb[c[(c[a>>2]|0)+48>>2]&127](a,e,d);l=e;return}function np(b){b=b|0;var d=0;c[b>>2]=7120;if(a[b+65>>0]|0?(d=c[b+56>>2]|0,Ib[c[c[d>>2]>>2]&511](d),d=c[b+56>>2]|0,d|0):0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function op(a,b){a=a|0;b=b|0;a=c[a+16>>2]|0;return zb[c[(c[a>>2]|0)+8>>2]&31](a,b)|0}function pp(a,b,c,d){a=+a;b=+b;c=+c;d=+d;var e=0,f=0;f=l;l=l+16|0;g[f+12>>2]=a;g[f+8>>2]=b;g[f+4>>2]=c;g[f>>2]=d;e=Pt()|0;Su(e,f+12|0,f+8|0,f+4|0,f);l=f;return e|0}function qp(a,b,c,d){a=+a;b=+b;c=+c;d=+d;var e=0,f=0;f=l;l=l+16|0;g[f+12>>2]=a;g[f+8>>2]=b;g[f+4>>2]=c;g[f>>2]=d;e=Ds(16)|0;dw(e,f+12|0,f+8|0,f+4|0,f);l=f;return e|0}function rp(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;if(qD(a,c[b+8>>2]|0)|0)ml(b,d,e,f);return}function sp(a,b){a=a|0;b=+b;var d=0,e=0;if((c[a+296>>2]|0)<=0)return;d=0;do{e=c[(c[a+304>>2]|0)+(d<<2)>>2]|0;Pb[c[(c[e>>2]|0)+8>>2]&7](e,a,b);d=d+1|0}while((d|0)<(c[a+296>>2]|0));return}function tp(a){a=a|0;var b=0.0,d=0,e=0,f=0.0;e=c[a+772>>2]|0;if((e|0)<=0){b=0.0;return +b}d=c[a+780>>2]|0;a=0;b=0.0;do{f=+g[d+(a*104|0)+88>>2];b=b+(f>0.0?1.0/f:0.0);a=a+1|0}while((a|0)!=(e|0));return +b}function up(b){b=b|0;var d=0;c[b>>2]=5168;d=c[b+212>>2]|0;if(d|0){if(a[b+216>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+212>>2]=0}a[b+216>>0]=1;c[b+212>>2]=0;c[b+204>>2]=0;c[b+208>>2]=0;return}function vp(b){b=b|0;var d=0;d=l;l=l+16|0;if(!(a[22344]|0))Uz(22344)|0;BA(d,b);c[5642]=c[d>>2];c[5643]=c[d+4>>2];c[5644]=c[d+8>>2];c[5645]=c[d+12>>2];l=d;return 22568}function wp(b){b=b|0;var d=0;d=l;l=l+16|0;if(!(a[22336]|0))Uz(22336)|0;kz(d,b);c[5638]=c[d>>2];c[5639]=c[d+4>>2];c[5640]=c[d+8>>2];c[5641]=c[d+12>>2];l=d;return 22552}function xp(b){b=b|0;var c=0.0,d=0.0,e=0.0;if(!(a[22400]|0))Uz(22400)|0;e=-+g[b+52>>2];d=+g[b+260>>2]*e;c=+g[b+264>>2]*e;g[5710]=+g[b+256>>2]*e;g[5711]=d;g[5712]=c;g[5713]=0.0;return 22840}function yp(a,b,d){a=a|0;b=+b;d=d|0;b=b*.4000000059604645*+nb[c[(c[a>>2]|0)+48>>2]&15](a);b=b*+nb[c[(c[a>>2]|0)+48>>2]&15](a);g[d>>2]=b;g[d+4>>2]=b;g[d+8>>2]=b;g[d+12>>2]=0.0;return}function zp(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;e=c[b>>2]|0;e=zb[c[(c[e>>2]|0)+56>>2]&31](e,16)|0;c[e+4>>2]=c[b>>2];c[e>>2]=4296;return e|0}function Ap(a,b,c,d,e,f,h){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;var i=0;i=l;l=l+16|0;g[i+8>>2]=c*h-d*f;g[i+4>>2]=d*e-b*h;g[i>>2]=b*f-c*e;$s(a,i+8|0,i+4|0,i);l=i;return}function Bp(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;b=gJ(b+4|0)|0;e=(gJ($G(b,0)|0)|0)+(c<<2)|0;d=(gJ($G(b,1)|0)|0)+(c<<2)|0;$s(a,e,d,(gJ($G(b,2)|0)|0)+(c<<2)|0);return}function Cp(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[d>>2]=-581039253;c[d+4>>2]=-581039253;c[d+8>>2]=-581039253;g[d+12>>2]=0.0;c[e>>2]=1566444395;c[e+4>>2]=1566444395;c[e+8>>2]=1566444395;g[e+12>>2]=0.0;return}function Dp(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+g[(gJ(a)|0)>>2];c=c*+g[(gJ(b)|0)>>2];d=+g[(gJ(a+16|0)|0)>>2];d=c+d*+g[(OI(b)|0)>>2];c=+g[(gJ(a+32|0)|0)>>2];return +(d+c*+g[(NI(b)|0)>>2])}function Ep(b){b=b|0;var d=0;d=l;l=l+16|0;if(!(a[22320]|0))Uz(22320)|0;lq(d,b);c[5630]=c[d>>2];c[5631]=c[d+4>>2];c[5632]=c[d+8>>2];c[5633]=c[d+12>>2];l=d;return 22520}function Fp(b){b=b|0;var d=0;d=l;l=l+16|0;if(!(a[22328]|0))Uz(22328)|0;Cm(d,b);c[5634]=c[d>>2];c[5635]=c[d+4>>2];c[5636]=c[d+8>>2];c[5637]=c[d+12>>2];l=d;return 22536}function Gp(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+g[a>>2];c=c*+g[(gJ(b)|0)>>2];d=+g[a+4>>2];d=c+d*+g[(OI(b)|0)>>2];c=+g[a+8>>2];c=d+c*+g[(NI(b)|0)>>2];return +(c+ +g[a+12>>2]*+g[b+12>>2])}function Hp(b){b=b|0;var d=0;c[b>>2]=9712;d=c[b+32>>2]|0;if(d|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;return}function Ip(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;$s(a,b,c,d);$s(a+16|0,e,f,g);$s(a+32|0,h,i,j);return}function Jp(b){b=b|0;var d=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(d|0){if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0}a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;return}function Kp(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=l;l=l+64|0;zk(d+16|0,b,c);km(d,b,+g[c+48>>2],+g[c+52>>2],+g[c+56>>2]);Xq(a,d+16|0,d);l=d;return}function Lp(b){b=b|0;var d=0;c[b>>2]=3172;d=c[b+32>>2]|0;if(d|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;return}function Mp(a){a=a|0;var b=0,d=0;c[a>>2]=7472;b=c[a+56>>2]|0;if(b|0?(Ib[c[c[b>>2]>>2]&511](b),d=c[a+56>>2]|0,d|0):0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Np(a){a=a|0;var b=0;c[a>>2]=5820;c[a+8>>2]=5868;b=c[a+56>>2]|0;Ob[c[(c[b>>2]|0)+20>>2]&127](b,c[a+72>>2]|0);b=c[a+56>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,c[a+72>>2]|0);return}function Op(a,b){a=a|0;b=b|0;var d=0;d=(c[a+96>>2]|0)+4|0;c[d>>2]=c[b>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];uj(a);return}function Pp(b,d){b=b|0;d=d|0;var e=0;if(a[b+289>>0]|0?(e=c[b+216>>2]|0,e|0):0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}a[b+289>>0]=0;c[b+216>>2]=d;c[(c[b+212>>2]|0)+8>>2]=d;return}function Qp(b){b=b|0;var d=0;c[b>>2]=5444;d=c[b+20>>2]|0;if(d|0){if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+20>>2]=0}a[b+24>>0]=1;c[b+20>>2]=0;c[b+12>>2]=0;c[b+16>>2]=0;return}function Rp(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;e=c[b>>2]|0;e=zb[c[(c[e>>2]|0)+56>>2]&31](e,8)|0;c[e+4>>2]=c[b>>2];c[e>>2]=9572;return e|0}function Sp(b){b=b|0;var d=0;c[b>>2]=8992;d=c[b+16>>2]|0;if(d|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;return}function Tp(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;var f=0;f=l;l=l+16|0;g[f+12>>2]=b;g[f+8>>2]=c;g[f+4>>2]=d;g[f>>2]=e;as(a,f+12|0,f+8|0,f+4|0,f);l=f;return}function Up(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;f=c[b+8>>2]|0;e=c[f+344>>2]|0;Sb[c[(c[e>>2]|0)+40>>2]&127](e,f,c[d+8>>2]|0);return}function Vp(b){b=b|0;var d=0,e=0;c[b>>2]=6352;if(!(a[b+8>>0]|0)){cJ(b);return}d=c[b+12>>2]|0;if(!d){cJ(b);return}e=c[b+4>>2]|0;Ob[c[(c[e>>2]|0)+16>>2]&127](e,d);cJ(b);return}function Wp(b){b=b|0;var d=0,e=0;c[b>>2]=9600;if(!(a[b+8>>0]|0)){cJ(b);return}d=c[b+12>>2]|0;if(!d){cJ(b);return}e=c[b+4>>2]|0;Ob[c[(c[e>>2]|0)+16>>2]&127](e,d);cJ(b);return}function Xp(b){b=b|0;var d=0,e=0;c[b>>2]=5792;if(!(a[b+8>>0]|0)){cJ(b);return}d=c[b+12>>2]|0;if(!d){cJ(b);return}e=c[b+4>>2]|0;Ob[c[(c[e>>2]|0)+16>>2]&127](e,d);cJ(b);return}function Yp(b){b=b|0;var d=0;c[b>>2]=7120;if(!(a[b+65>>0]|0))return;d=c[b+56>>2]|0;Ib[c[c[d>>2]>>2]&511](d);b=c[b+56>>2]|0;if(!b)return;c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function Zp(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=l;l=l+16|0;c[e>>2]=9164;c[e+4>>2]=b;Sb[c[(c[a>>2]|0)+48>>2]&127](a,e,d);l=e;return}function _p(b){b=b|0;var d=0,e=0;c[b>>2]=5888;if(!(a[b+8>>0]|0)){cJ(b);return}d=c[b+12>>2]|0;if(!d){cJ(b);return}e=c[b+4>>2]|0;Ob[c[(c[e>>2]|0)+16>>2]&127](e,d);cJ(b);return}function $p(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if((c|0)<(b|0)&(b|0)<(c+d|0)){e=b;c=c+d|0;b=b+d|0;while((d|0)>0){b=b-1|0;c=c-1|0;d=d-1|0;a[b>>0]=a[c>>0]|0}b=e}else gi(b,c,d)|0;return b|0}function aq(){var a=0,b=0;b=l;l=l+32|0;a=Ds(108)|0;Xt(b);rg(a,b);l=b;return a|0}function bq(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=P(b&65535,a&65535)|0;e=(c>>>16)+(P(b&65535,a>>>16)|0)|0;d=P(b>>>16,a&65535)|0;return (A=(e>>>16)+(P(b>>>16,a>>>16)|0)+(((e&65535)+d|0)>>>16)|0,e+d<<16|c&65535|0)|0}function cq(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0;e=+C(+(+g[b>>2]));d=+C(+(+g[b+4>>2]));c=+C(+(+g[b+8>>2]));g[a+16>>2]=e;g[a+20>>2]=d;g[a+24>>2]=c;g[a+28>>2]=0.0;return}function dq(a,b){a=a|0;b=b|0;Wf(a,c[b+36>>2]|0);return}function eq(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;if(qD(a,c[b+8>>2]|0)|0)on(b,d,e);return}function fq(a,b,c,d,e,f,g,h,i,j,k,l,m){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=+j;k=k|0;l=+l;m=m|0;Xb[a&0](b|0,c|0,d|0,e|0,+f,+g,+h,+i,+j,k|0,+l,m|0)}function gq(b){b=b|0;var d=0,e=0,f=0;e=c[b>>2]|0;f=(a[e>>0]|0)+-48|0;if(f>>>0<10){d=0;do{d=f+(d*10|0)|0;e=e+1|0;c[b>>2]=e;f=(a[e>>0]|0)+-48|0}while(f>>>0<10)}else d=0;return d|0}function hq(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;g[a>>2]=(1.0-d)*+g[b>>2]+ +g[c>>2]*d;g[a+4>>2]=(1.0-d)*+g[b+4>>2]+ +g[c+4>>2]*d;g[a+8>>2]=(1.0-d)*+g[b+8>>2]+ +g[c+8>>2]*d;return}function iq(a,b,c,d,e,f,h){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;var i=0;i=l;l=l+16|0;g[i+8>>2]=b+e;g[i+4>>2]=c+f;g[i>>2]=d+h;$s(a,i+8|0,i+4|0,i);l=i;return}function jq(a,b,c,d,e,f,h){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;var i=0;i=l;l=l+16|0;g[i+8>>2]=b*e;g[i+4>>2]=c*f;g[i>>2]=d*h;$s(a,i+8|0,i+4|0,i);l=i;return}function kq(a,b,c,d,e,f,h){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;var i=0;i=l;l=l+16|0;g[i+8>>2]=b-e;g[i+4>>2]=c-f;g[i>>2]=d-h;$s(a,i+8|0,i+4|0,i);l=i;return}function lq(a,b){a=a|0;b=b|0;var c=0;c=l;l=l+16|0;g[c+8>>2]=-+g[b>>2];g[c+4>>2]=-+g[b+4>>2];g[c>>2]=-+g[b+8>>2];dw(a,c+8|0,c+4|0,c,b+12|0);l=c;return}function mq(a){a=a|0;var b=0;c[a>>2]=7472;b=c[a+56>>2]|0;if(!b)return;Ib[c[c[b>>2]>>2]&511](b);a=c[a+56>>2]|0;if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function nq(a,b,d){a=a|0;b=b|0;d=d|0;b=c[b+188>>2]|0;a=c[d+188>>2]|0;if(!(c[a+8>>2]&c[b+4>>2])){d=0;return d|0}d=(c[b+8>>2]&c[a+4>>2]|0)!=0;return d|0}function oq(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;return +(+cb(0,a|0,b|0,c|0,d|0,e|0,f|0,g|0,h|0))}function pq(a,b){a=a|0;b=b|0;if((b|0)==0?1:(c[b+252>>2]&2|0)==0){ki(a,b);return}else{Ob[c[(c[a>>2]|0)+92>>2]&127](a,b);return}}function qq(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;if(!((b|0)==0&(c|0)==0))do{e=e+-1|0;a[e>>0]=d[19831+(b&15)>>0]|0|f;b=Mu(b|0,c|0,4)|0;c=A}while(!((b|0)==0&(c|0)==0));return e|0}function rq(a){a=a|0;var b=0;c[a>>2]=5868;b=c[a+48>>2]|0;Ob[c[(c[b>>2]|0)+20>>2]&127](b,c[a+64>>2]|0);b=c[a+48>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,c[a+64>>2]|0);return}function sq(){var b=0;b=Ds(40)|0;g[b+12>>2]=1.0;c[b+8>>2]=0;c[b+4>>2]=5;c[b>>2]=3172;a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;a[b+16>>0]=1;return b|0}function tq(b){b=b|0;var c=0;c=a[n+(b&255)>>0]|0;if((c|0)<8)return c|0;c=a[n+(b>>8&255)>>0]|0;if((c|0)<8)return c+8|0;c=a[n+(b>>16&255)>>0]|0;if((c|0)<8)return c+16|0;return (a[n+(b>>>24)>>0]|0)+24|0}function uq(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0;e=l;l=l+16|0;jq(e,b,c,d,+g[a+408>>2],+g[a+412>>2],+g[a+416>>2]);us(a+472|0,e)|0;l=e;return}function vq(a,b,c){a=+a;b=+b;c=+c;var d=0,e=0;e=l;l=l+16|0;g[e+8>>2]=a;g[e+4>>2]=b;g[e>>2]=c;d=Pt()|0;$s(d,e+8|0,e+4|0,e);l=e;return d|0}function wq(a,b){a=a|0;b=b|0;c[a+16>>2]=c[b>>2];c[a+16+4>>2]=c[b+4>>2];c[a+16+8>>2]=c[b+8>>2];c[a+16+12>>2]=c[b+12>>2];uj(a);return}function xq(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;return Gb[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0,k|0)|0}function yq(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0;e=l;l=l+16|0;jq(e,b,c,d,+g[a+604>>2],+g[a+608>>2],+g[a+612>>2]);us(a+488|0,e)|0;l=e;return}function zq(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;return +wb[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0,k|0)}function Aq(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;var e=0;e=Ss()|0;Hg(e,a,b,c,d);return e|0}function Bq(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;var h=0;h=qt()|0;ye(h,a,b,c,d,e,f,g);return h|0}function Cq(){var a=0,b=0;a=ts()|0;if((a|0?(b=c[a>>2]|0,b|0):0)?((c[b+48>>2]&-256|0)==1126902528?(c[b+48+4>>2]|0)==1129074247:0):0)qy(c[b+12>>2]|0);qy(nF()|0)}function Dq(a,b,d){a=a|0;b=b|0;d=d|0;mA(a,b);c[a+48>>2]=c[d>>2];c[a+48+4>>2]=c[d+4>>2];c[a+48+8>>2]=c[d+8>>2];c[a+48+12>>2]=c[d+12>>2];return}function Eq(a,b){a=a|0;b=b|0;c[a+304>>2]=(c[a+304>>2]|0)+1;c[a+388>>2]=c[b>>2];c[a+388+4>>2]=c[b+4>>2];c[a+388+8>>2]=c[b+8>>2];c[a+388+12>>2]=c[b+12>>2];return}function Fq(){var a=0,b=0;b=l;l=l+32|0;a=Ds(88)|0;Xt(b);ce(a,b);l=b;return a|0}function Gq(a,b,d){a=a|0;b=b|0;d=d|0;c[d>>2]=c[a+60+(b<<4)>>2];c[d+4>>2]=c[a+60+(b<<4)+4>>2];c[d+8>>2]=c[a+60+(b<<4)+8>>2];c[d+12>>2]=c[a+60+(b<<4)+12>>2];return}function Hq(a,b){a=a|0;b=b|0;c[a+304>>2]=(c[a+304>>2]|0)+1;c[a+372>>2]=c[b>>2];c[a+372+4>>2]=c[b+4>>2];c[a+372+8>>2]=c[b+8>>2];c[a+372+12>>2]=c[b+12>>2];return}function Iq(b,d){b=b|0;d=d|0;if(!(a[22408]|0))Uz(22408)|0;d=$G(b,d)|0;c[5714]=c[d>>2];c[5715]=c[d+4>>2];c[5716]=c[d+8>>2];c[5717]=c[d+12>>2];return 22856}function Jq(a,b){a=a|0;b=b|0;c[a+304>>2]=(c[a+304>>2]|0)+1;c[a+604>>2]=c[b>>2];c[a+604+4>>2]=c[b+4>>2];c[a+604+8>>2]=c[b+8>>2];c[a+604+12>>2]=c[b+12>>2];return}function Kq(a,b,c,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=j|0;k=k|0;l=+l;Yb[a&0](b|0,c|0,d|0,e|0,+f,+g,+h,+i,j|0,k|0,+l)}function Lq(a){a=a|0;var b=0.0,d=0.0;d=+g[a+36>>2];+nb[c[(c[a>>2]|0)+48>>2]&15](a);b=+nb[c[(c[a>>2]|0)+48>>2]&15](a);+nb[c[(c[a>>2]|0)+48>>2]&15](a);return +(d+b)}function Mq(a){a=a|0;var b=0.0,d=0.0;d=+g[a+32>>2];b=+nb[c[(c[a>>2]|0)+48>>2]&15](a);+nb[c[(c[a>>2]|0)+48>>2]&15](a);+nb[c[(c[a>>2]|0)+48>>2]&15](a);return +(d+b)}function Nq(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;cc[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0,k|0)}function Oq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=l;l=l+16|0;c[e>>2]=c[d>>2];a=Bb[c[(c[a>>2]|0)+16>>2]&63](a,b,e)|0;if(a)c[d>>2]=c[e>>2];l=e;return a&1|0}function Pq(a,b,d){a=a|0;b=b|0;d=d|0;c[a+156+(b<<4)>>2]=c[d>>2];c[a+156+(b<<4)+4>>2]=c[d+4>>2];c[a+156+(b<<4)+8>>2]=c[d+8>>2];c[a+156+(b<<4)+12>>2]=c[d+12>>2];return}function Qq(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;var f=0;f=l;l=l+16|0;g[f+8>>2]=b*e;g[f+4>>2]=c*e;g[f>>2]=d*e;$s(a,f+8|0,f+4|0,f);l=f;return}function Rq(a,b){a=a|0;b=b|0;g[a>>2]=+g[a>>2]*+g[b>>2];g[a+4>>2]=+g[a+4>>2]*+g[b>>2];g[a+8>>2]=+g[a+8>>2]*+g[b>>2];g[a+12>>2]=+g[a+12>>2]*+g[b>>2];return a|0}function Sq(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;Ip(a,b,c,d,e,f,g,h,i,j);return}function Tq(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=Us(344)|0;Vd(d,a,b,c);return d|0}function Uq(a,b,d){a=a|0;b=b|0;d=d|0;c[a+28+(b<<4)>>2]=c[d>>2];c[a+28+(b<<4)+4>>2]=c[d+4>>2];c[a+28+(b<<4)+8>>2]=c[d+8>>2];c[a+28+(b<<4)+12>>2]=c[d+12>>2];return}function Vq(b){b=b|0;var d=0;c[b>>2]=3172;d=c[b+32>>2]|0;if(!d){cJ(b);return}if(!(a[b+36>>0]|0)){cJ(b);return}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);cJ(b);return}function Wq(a,b,d){a=a|0;b=b|0;d=d|0;b=c[b+204>>2]|0;if(b&4|0)return 0;a=c[d+204>>2]|0;if(!(a&4))return (b&3|0)==0|(a&3|0)==0|0;else return 0;return 0}function Xq(a,b,d){a=a|0;b=b|0;d=d|0;Vm(a,b);c[a+48>>2]=c[d>>2];c[a+48+4>>2]=c[d+4>>2];c[a+48+8>>2]=c[d+8>>2];c[a+48+12>>2]=c[d+12>>2];return}function Yq(b){b=b|0;var d=0;c[b>>2]=6352;if(!(a[b+8>>0]|0))return;d=c[b+12>>2]|0;if(!d)return;b=c[b+4>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,d);return}function Zq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=0;while(1){if((e|0)>=(b|0))break;zm(d+(e*96|0)|0,(c[a+12>>2]|0)+(e*96|0)|0);e=e+1|0}return}function _q(b){b=b|0;var d=0;c[b>>2]=5444;d=c[b+20>>2]|0;if(!d){cJ(b);return}if(!(a[b+24>>0]|0)){cJ(b);return}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);cJ(b);return}function $q(a,b){a=a|0;b=b|0;var c=0;c=l;l=l+128|0;to(c,a+68|0);Kp(c+64|0,a+4|0,c);ur(b,c+64|0);l=c;return}function ar(b){b=b|0;var d=0;c[b>>2]=9600;if(!(a[b+8>>0]|0))return;d=c[b+12>>2]|0;if(!d)return;b=c[b+4>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,d);return}function br(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;g=qt()|0;ye(g,a,b,c,d,e,f,0);return g|0}function cr(b){b=b|0;var d=0;c[b>>2]=5792;if(!(a[b+8>>0]|0))return;d=c[b+12>>2]|0;if(!d)return;b=c[b+4>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,d);return}function dr(a,b){a=a|0;b=b|0;a=c[a+4>>2]|0;return ((c[b>>2]|0)==(a|0)?1:(c[b+4>>2]|0)==(a|0))|0}function er(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=dt()|0;He(f,a,b,c,d,e);return f|0}function fr(a,b){a=a|0;b=b|0;a=c[a+24>>2]|0;return zb[c[(c[a>>2]|0)+8>>2]&31](a,b)|0}function gr(b){b=b|0;var d=0;c[b>>2]=8992;d=c[b+16>>2]|0;if(!d){cJ(b);return}if(!(a[b+20>>0]|0)){cJ(b);return}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);cJ(b);return}function hr(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0;e=l;l=l+16|0;g[e+8>>2]=b;g[e+4>>2]=c;g[e>>2]=d;$s(a,e+8|0,e+4|0,e);l=e;return}function ir(b){b=b|0;var d=0;c[b>>2]=5888;if(!(a[b+8>>0]|0))return;d=c[b+12>>2]|0;if(!d)return;b=c[b+4>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,d);return}function jr(a,b,d){a=a|0;b=b|0;d=d|0;TH(a);c[a>>2]=3056;ur(a+4|0,b);ur(a+68|0,d);ur(a+132|0,b);c[a+196>>2]=0;return}function kr(a){a=a|0;var b=0;b=l;l=l+16|0;Kn(a);g[b+8>>2]=0.0;g[b+4>>2]=0.0;g[b>>2]=0.0;$s(a+48|0,b+8|0,b+4|0,b);l=b;return}function lr(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;var f=0;f=Ds(44)|0;Qm(f,a,b,c,d,e);return f|0}function mr(a,b,c){a=a|0;b=b|0;c=+c;switch(b|0){case 3:{a=a+452|0;break}case 4:{a=a+448|0;break}case 5:{a=a+444|0;break}default:return}g[a>>2]=c;return}function nr(a,b){a=a|0;b=b|0;b=c[b+36>>2]|0;we(a,c[(c[(c[(c[a+4>>2]|0)+4>>2]|0)+28>>2]|0)+(b*80|0)+64>>2]|0,b);return}function or(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;return +vb[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0)}function pr(a,b){a=a|0;b=b|0;var c=0;c=0;while(1){if((c|0)==3)break;g[a+868+(c<<6)+4>>2]=+ot(+g[(gJ(b)|0)+(c<<2)>>2]);c=c+1|0}return}function qr(a,b,c,d){a=+a;b=b|0;c=c|0;d=d|0;var e=0;e=Ds(144)|0;Xk(e,a,b,c,d);return e|0}function rr(a,b,d,e,f,g,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;return +(+ub[c[(c[a>>2]|0)+12>>2]&1](a,b,d,e,f,g,h,i))}function sr(b,c,d){b=b|0;c=c|0;d=d|0;if(!((b|0)==0&(c|0)==0))do{d=d+-1|0;a[d>>0]=b&7|48;b=Mu(b|0,c|0,3)|0;c=A}while(!((b|0)==0&(c|0)==0));return d|0}function tr(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=0;while(1){if((e|0)>=(b|0))break;c[d+(e<<2)>>2]=c[(c[a+12>>2]|0)+(e<<2)>>2];e=e+1|0}return}function ur(a,b){a=a|0;b=b|0;Vm(a,b);c[a+48>>2]=c[b+48>>2];c[a+48+4>>2]=c[b+48+4>>2];c[a+48+8>>2]=c[b+48+8>>2];c[a+48+12>>2]=c[b+48+12>>2];return}function vr(a,b){a=a|0;b=b|0;$s(a,b,b+16|0,b+32|0);$s(a+16|0,b+4|0,b+20|0,b+36|0);$s(a+32|0,b+8|0,b+24|0,b+40|0);return}function wr(a,b){a=a|0;b=b|0;var c=0;c=0;while(1){if((c|0)==3)break;g[a+868+(c<<6)>>2]=+ot(+g[(gJ(b)|0)+(c<<2)>>2]);c=c+1|0}return}function xr(a){a=a|0;c[6995]=(c[6995]|0)+1;a=sc((a<<2|3)+16|0)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function yr(a,b){a=a|0;b=b|0;Ib[c[(c[b>>2]|0)+32>>2]&511](b);id(a,b);Ib[c[(c[b>>2]|0)+36>>2]&511](b);return}function zr(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;bc[a&1](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0)}function Ar(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Sb[c[(c[a>>2]|0)+108>>2]&127](a,b,d);Sb[c[(c[a>>2]|0)+108>>2]&127](a,(b+1|0)%3|0,e);return}function Br(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0;e=l;l=l+16|0;g[e+8>>2]=-b;g[e+4>>2]=-c;g[e>>2]=-d;$s(a,e+8|0,e+4|0,e);l=e;return}function Cr(a,b){a=a|0;b=b|0;c[a+100>>2]=c[b>>2];c[a+100+4>>2]=c[b+4>>2];c[a+100+8>>2]=c[b+8>>2];c[a+100+12>>2]=c[b+12>>2];return}function Dr(a){a=a|0;c[6995]=(c[6995]|0)+1;a=sc((a*104|3)+16|0)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Er(a){a=a|0;c[6995]=(c[6995]|0)+1;a=sc((a*52|3)+16|0)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Fr(a){a=a|0;c[6995]=(c[6995]|0)+1;a=sc((a*44|3)+16|0)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Gr(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=rt()|0;he(f,a,b,c&65535,d,e);return f|0}function Hr(a,b){a=a|0;b=b|0;c[a+696>>2]=c[b>>2];c[a+696+4>>2]=c[b+4>>2];c[a+696+8>>2]=c[b+8>>2];c[a+696+12>>2]=c[b+12>>2];return}function Ir(a,b){a=a|0;b=b|0;c[a+680>>2]=c[b>>2];c[a+680+4>>2]=c[b+4>>2];c[a+680+8>>2]=c[b+8>>2];c[a+680+12>>2]=c[b+12>>2];return}function Jr(a,b){a=a|0;b=b|0;c[a+156>>2]=c[b>>2];c[a+156+4>>2]=c[b+4>>2];c[a+156+8>>2]=c[b+8>>2];c[a+156+12>>2]=c[b+12>>2];return}function Kr(b,c,d){b=b|0;c=c|0;d=d|0;a[b+1309+c>>0]=d&1;if((c|0)<3){a[b+788+c>>0]=d&1;return}else{a[b+868+(c+-3<<6)+44>>0]=d&1;return}}function Lr(a,b){a=a|0;b=b|0;c[a+112>>2]=c[b>>2];c[a+112+4>>2]=c[b+4>>2];c[a+112+8>>2]=c[b+8>>2];c[a+112+12>>2]=c[b+12>>2];return}function Mr(a,b){a=a|0;b=b|0;c[a+56>>2]=c[b>>2];c[a+56+4>>2]=c[b+4>>2];c[a+56+8>>2]=c[b+8>>2];c[a+56+12>>2]=c[b+12>>2];return}function Nr(b){b=b|0;if(a[22448]|0)return 23016;if(!(Uz(22448)|0))return 23016;c[5754]=1065353216;c[5755]=1065353216;c[5756]=1065353216;g[5757]=0.0;return 23016}function Or(a){a=a|0;c[6995]=(c[6995]|0)+1;a=sc(a*96|19)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Pr(a){a=a|0;var b=0;do{c[a+4>>2]=0;g[a+8>>2]=0.0;b=c[a+24>>2]|0;if(b|0)Pr(b);a=c[a+28>>2]|0}while((a|0)!=0);return}function Qr(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;Ud(a,b,c,d,e,f);return}function Rr(a,b){a=a|0;b=b|0;c[a+172>>2]=c[b>>2];c[a+172+4>>2]=c[b+4>>2];c[a+172+8>>2]=c[b+8>>2];c[a+172+12>>2]=c[b+12>>2];return}function Sr(a,b){a=a|0;b=b|0;c[a+32>>2]=c[b>>2];c[a+32+4>>2]=c[b+4>>2];c[a+32+8>>2]=c[b+8>>2];c[a+32+12>>2]=c[b+12>>2];return}function Tr(a){a=a|0;g[a>>2]=5.880000114440918;g[a+4>>2]=.8299999833106995;g[a+8>>2]=.8799999952316284;g[a+12>>2]=500.0;g[a+16>>2]=10.5;g[a+20>>2]=6.0e3;return}function Ur(a,b){a=a|0;b=b|0;c[a+24>>2]=c[b>>2];c[a+24+4>>2]=c[b+4>>2];c[a+24+8>>2]=c[b+8>>2];c[a+24+12>>2]=c[b+12>>2];return}function Vr(a,b){a=a|0;b=b|0;c[a+316>>2]=c[b>>2];c[a+316+4>>2]=c[b+4>>2];c[a+316+8>>2]=c[b+8>>2];c[a+316+12>>2]=c[b+12>>2];return}function Wr(a,b){a=a|0;b=b|0;c[a+300>>2]=c[b>>2];c[a+300+4>>2]=c[b+4>>2];c[a+300+8>>2]=c[b+8>>2];c[a+300+12>>2]=c[b+12>>2];return}function Xr(a,b){a=a|0;b=b|0;c[a+64>>2]=c[b>>2];c[a+64+4>>2]=c[b+4>>2];c[a+64+8>>2]=c[b+8>>2];c[a+64+12>>2]=c[b+12>>2];return}function Yr(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;return Fb[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0)|0}function Zr(a,b){a=a|0;b=b|0;c[a+52>>2]=c[b>>2];c[a+52+4>>2]=c[b+4>>2];c[a+52+8>>2]=c[b+8>>2];c[a+52+12>>2]=c[b+12>>2];return}function _r(a,b){a=a|0;b=b|0;c[a+188>>2]=c[b>>2];c[a+188+4>>2]=c[b+4>>2];c[a+188+8>>2]=c[b+8>>2];c[a+188+12>>2]=c[b+12>>2];return}function $r(a,b){a=a|0;b=b|0;c[a+40>>2]=c[b>>2];c[a+40+4>>2]=c[b+4>>2];c[a+40+8>>2]=c[b+8>>2];c[a+40+12>>2]=c[b+12>>2];return}function as(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[d>>2];c[a+8>>2]=c[e>>2];c[a+12>>2]=c[f>>2];return}function bs(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;return +ub[a&1](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0)}function cs(a,b){a=a|0;b=b|0;c[a+16>>2]=c[b>>2];c[a+16+4>>2]=c[b+4>>2];c[a+16+8>>2]=c[b+8>>2];c[a+16+12>>2]=c[b+12>>2];return}function ds(a,b){a=a|0;b=b|0;if(!(c[b+4>>2]&c[a+8>>2])){b=0;return b|0}b=(c[a+4>>2]&c[b+8>>2]|0)!=0;return b|0}function es(a,b){a=a|0;b=b|0;if(!(c[b+4>>2]&c[a+12>>2])){b=0;return b|0}b=(c[a+8>>2]&c[b+8>>2]|0)!=0;return b|0}function fs(a,b,d){a=a|0;b=b|0;d=+d;Ob[c[(c[a>>2]|0)+32>>2]&127](a,b);Pb[c[(c[a>>2]|0)+36>>2]&7](a,b,d);return}function gs(a,b){a=a|0;b=b|0;if(!(c[b+4>>2]&c[a+16>>2])){b=0;return b|0}b=(c[a+12>>2]&c[b+8>>2]|0)!=0;return b|0}function hs(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=rt()|0;he(e,a,b,c&65535,d,0);return e|0}function is(a,b){a=a|0;b=b|0;c[a+68>>2]=c[b>>2];c[a+68+4>>2]=c[b+4>>2];c[a+68+8>>2]=c[b+8>>2];c[a+68+12>>2]=c[b+12>>2];return}function js(a,b){a=a|0;b=b|0;c[a+36>>2]=c[b>>2];c[a+36+4>>2]=c[b+4>>2];c[a+36+8>>2]=c[b+8>>2];c[a+36+12>>2]=c[b+12>>2];return}function ks(a,b){a=a|0;b=b|0;c[a>>2]=c[b+264>>2];c[a+4>>2]=c[b+264+4>>2];c[a+8>>2]=c[b+264+8>>2];c[a+12>>2]=c[b+264+12>>2];return}function ls(b,d){b=b|0;d=d|0;if(!(a[22360]|0))Uz(22360)|0;yn(aC(c[b+12>>2]|0,d)|0);return 22600}function ms(){var a=0;a=Ds(16)|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;Dz(a);return a|0}function ns(a,b){a=a|0;b=+b;dg(a,b);a=c[a+472>>2]|0;Jb[c[(c[a>>2]|0)+24>>2]&31](a,b);return}function os(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=dt()|0;Yd(d,a,b,c);return d|0}function ps(){var a=0;a=jt()|0;ho();ho();jr(a,22728,22728);return a|0}function qs(a,b,d){a=a|0;b=b|0;d=d|0;if((c[a+4>>2]|0)==(b|0)?(c[a+28>>2]|0)!=1:0)c[a+28>>2]=d;return}function rs(){var a=0,b=0;b=ct(c[5628]|0,c[5629]|0,1284865837,1481765933)|0;b=Ow(b|0,A|0,1,0)|0;a=A;c[5628]=b;c[5629]=a;a=Mu(b|0,a|0,33)|0;return a|0}function ss(a,b){a=a|0;b=b|0;c[a+48>>2]=c[b>>2];c[a+48+4>>2]=c[b+4>>2];c[a+48+8>>2]=c[b+8>>2];c[a+48+12>>2]=c[b+12>>2];return}function ts(){var a=0,b=0;a=l;l=l+16|0;if(!(jb(28552,3)|0)){b=hb(c[7139]|0)|0;l=a;return b|0}else Ww(22016,a);return 0}function us(a,b){a=a|0;b=b|0;g[a>>2]=+g[a>>2]+ +g[b>>2];g[a+4>>2]=+g[a+4>>2]+ +g[b+4>>2];g[a+8>>2]=+g[a+8>>2]+ +g[b+8>>2];return a|0}function vs(a,b){a=a|0;b=b|0;g[a>>2]=+g[a>>2]-+g[b>>2];g[a+4>>2]=+g[a+4>>2]-+g[b+4>>2];g[a+8>>2]=+g[a+8>>2]-+g[b+8>>2];return a|0}function ws(a,b){a=a|0;b=b|0;var c=0;c=l;l=l+64|0;Kp(c,b,a+68|0);ur(a+4|0,c);l=c;return}function xs(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=l;l=l+16|0;Ye(a,b,d,e,f|0)|0;l=f;return (A=c[f+4>>2]|0,c[f>>2]|0)|0}function ys(a,b){a=a|0;b=b|0;c[a+12>>2]=c[b>>2];c[a+12+4>>2]=c[b+4>>2];c[a+12+8>>2]=c[b+8>>2];c[a+12+12>>2]=c[b+12>>2];return}function zs(a,b){a=a|0;b=b|0;c[a+88>>2]=c[b>>2];c[a+88+4>>2]=c[b+4>>2];c[a+88+8>>2]=c[b+8>>2];c[a+88+12>>2]=c[b+12>>2];return}function As(a){a=a|0;var b=0;b=Ds(108)|0;rg(b,a);return b|0}function Bs(a,b){a=a|0;b=b|0;c[a+20>>2]=c[b>>2];c[a+20+4>>2]=c[b+4>>2];c[a+20+8>>2]=c[b+8>>2];c[a+20+12>>2]=c[b+12>>2];return}function Cs(a,b){a=a|0;b=b|0;c[a+76>>2]=c[b>>2];c[a+76+4>>2]=c[b+4>>2];c[a+76+8>>2]=c[b+8>>2];c[a+76+12>>2]=c[b+12>>2];return}function Ds(a){a=a|0;var b=0;b=(a|0)==0?1:a;while(1){a=sc(b)|0;if(a|0)break;a=iF()|0;if(!a){a=0;break}Hb[a&3]()}return a|0}function Es(a,b){a=a|0;b=b|0;c[a+4>>2]=c[b>>2];c[a+4+4>>2]=c[b+4>>2];c[a+4+8>>2]=c[b+8>>2];c[a+4+12>>2]=c[b+12>>2];return}function Fs(a){a=a|0;var b=0;b=l;l=l+16|0;g[b+8>>2]=0.0;g[b+4>>2]=0.0;g[b>>2]=0.0;$s(a,b+8|0,b+4|0,b);l=b;return}function Gs(a,b){a=a|0;b=b|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];return}function Hs(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=Us(1252)|0;Bc(e,a,b,c,d);return e|0}function Is(a,b){a=a|0;b=b|0;c[a+72>>2]=c[b>>2];c[a+72+4>>2]=c[b+4>>2];c[a+72+8>>2]=c[b+8>>2];c[a+72+12>>2]=c[b+12>>2];return}function Js(a,b){a=a|0;b=b|0;g[a>>2]=+g[a>>2]*+g[b>>2];g[a+4>>2]=+g[a+4>>2]*+g[b>>2];g[a+8>>2]=+g[a+8>>2]*+g[b>>2];return a|0}function Ks(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=rt()|0;he(d,a,b,c&65535,0,0);return d|0}function Ls(a,b){a=a|0;b=b|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;g[a+(c[b+56>>2]<<2)>>2]=1.0;return}function Ms(a){a=a|0;var b=0;b=l;l=l+16|0;Cd(a);if(!(kb(c[7139]|0,0)|0)){l=b;return}else Ww(22115,b)}function Ns(a,b){a=a|0;b=b|0;c[a+8>>2]=c[b>>2];c[a+8+4>>2]=c[b+4>>2];c[a+8+8>>2]=c[b+8>>2];c[a+8+12>>2]=c[b+12>>2];return}function Os(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(255)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Ps(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=Jt()|0;Xe(d,a,b,c);return d|0}function Qs(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return ic(b,c,d,e)|0}function Rs(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(1479)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Ss(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(311)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Ts(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(1407)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Us(a){a=a|0;c[6995]=(c[6995]|0)+1;a=sc(a+19|0)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Vs(a){a=a|0;if(!(+C(+(+g[a+20>>2]))<1.1920928955078125e-07)){a=0;return a|0}a=+C(+(+g[a+24>>2]))<1.1920928955078125e-07;return a|0}function Ws(a){a=a|0;var b=0;b=jt()|0;ho();jr(b,a,22728);return b|0}function Xs(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(191)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Ys(a,b){a=a|0;b=b|0;if(!b?c[a+204>>2]&3|0:0)return;if((c[a+220>>2]&-2|0)!=4)c[a+220>>2]=1;g[a+224>>2]=0.0;return}function Zs(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a+-4>>2]|0)+8>>2]&127](a+-4|0,b,d,e);return}function _s(a,b){a=a|0;b=b|0;var c=0.0;c=+EF(a);c=+VI(c*+EF(b));return +(+$A(+Gp(a,b)/c))}function $s(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[d>>2];c[a+8>>2]=c[e>>2];g[a+12>>2]=0.0;return}function at(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(147)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function bt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(119)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function ct(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=bq(a,c)|0;f=A;return (A=(P(b,c)|0)+(P(d,a)|0)+f|f&0,e|0|0)|0}function dt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(1331)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function et(b){b=b|0;var d=0;d=c[b+12>>2]|0;if(!d)return;if(a[b+16>>0]&1)Ey(d);c[b+12>>2]=0;return}function ft(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;ac[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0)}function gt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(379)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function ht(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(627)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function it(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(823)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function jt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(219)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function kt(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a>>2]|0)+88>>2]&127](a,b,d<<16>>16,e<<16>>16);return}function lt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(1147)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function mt(a,b){a=a|0;b=b|0;var c=0;c=Ds(84)|0;dn(c,a,b);return c|0}function nt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(107)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function ot(a){a=+a;a=+$H(a);if(a<-3.1415927410125732){a=a+6.2831854820251465;return +a}if(!(a>3.1415927410125732))return +a;a=a+-6.2831854820251465;return +a}function pt(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a>>2]|0)+36>>2]&127](a,b,d<<16>>16,e<<16>>16);return}function qt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(787)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function rt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(135)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function st(a,b){a=a|0;b=b|0;c[a+348>>2]=c[b>>2];c[a+348+4>>2]=c[b+4>>2];c[a+348+8>>2]=c[b+8>>2];return}function tt(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((d|0)<=0)return;Yk(c|0,0,d<<4|0)|0;return}function ut(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(115)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function vt(a,b){a=a|0;b=b|0;c[a+540>>2]=b;if(!b)return;Ob[c[(c[b>>2]|0)+8>>2]&127](b,a+4|0);return}function wt(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;sj(a,b,c,d);return}function xt(a,b){a=a|0;b=b|0;var c=0;c=Jt()|0;Xe(c,a,b,1);return c|0}function yt(a,b){a=a|0;b=b|0;var c=0;c=rt()|0;he(c,a,b,16384,0,0);return c|0}function zt(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=c[a+192>>2]|0;Vb[c[(c[e>>2]|0)+8>>2]&127](e,a+4|0,b,d);return}function At(a){a=a|0;var b=0;b=Ds(88)|0;ce(b,a);return b|0}function Bt(a,b){a=a|0;b=b|0;c[a>>2]=1065353216;c[a+4>>2]=1065353216;c[a+8>>2]=1065353216;g[a+12>>2]=0.0;return}function Ct(a,b){a=a|0;b=b|0;var d=0;d=c[a+8>>2]|0;Sb[c[d+64>>2]&127](b,d,c[a+4>>2]|0);return 0}function Dt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(75)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Et(a,b){a=a|0;b=b|0;var d=0;d=a+92|0;do{c[a>>2]=c[b>>2];a=a+4|0;b=b+4|0}while((a|0)<(d|0));return}function Ft(a,b){a=a|0;b=b|0;Pa(a|0,b|0)}function Gt(a,b){a=a|0;b=b|0;Oa(a|0,b|0)}function Ht(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Og(a,b,c,d);return}function It(a){a=a|0;if(!a){a=0;return a|0}a=xr(a)|0;return a|0}function Jt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(99)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Kt(a,b){a=a|0;b=b|0;return +(+Iy(+g[a>>2],+g[a+4>>2],+g[a+8>>2],+g[b>>2],+g[b+4>>2],+g[b+8>>2]))}function Lt(a,b){a=a|0;b=b|0;var c=0;c=Ds(88)|0;qn(c,a,b);return c|0}function Mt(a,b,d){a=a|0;b=b|0;d=d|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;return}function Nt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(79)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Ot(a){a=a|0;var b=0;b=l;l=l+16|0;c[b>>2]=gJ(c[a+60>>2]|0)|0;a=SC(ab(6,b|0)|0)|0;l=b;return a|0}function Pt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(35)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Qt(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 Eb[a&3](b|0,c|0,d|0,e|0,f|0,g|0)|0}function Rt(a){a=a|0;var b=0;b=l;l=l+16|0;Ob[c[(c[a>>2]|0)+44>>2]&127](a,b);l=b;return}function St(a){a=a|0;Tf(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Tt(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a>>2]|0)+8>>2]&127](a,b,d,e);return}function Ut(a){a=a|0;c[a>>2]=2976;g[a+4>>2]=1.0;c[a+8>>2]=0;c[a+12>>2]=1;c[a+16>>2]=-1;c[a+20>>2]=0;return}function Vt(a){a=a|0;var b=0;b=Nt()|0;Ai(b,a);c[b>>2]=8692;c[b+56>>2]=2;return b|0}function Wt(a){a=a|0;var b=0;b=Nt()|0;Ai(b,a);c[b>>2]=8588;c[b+56>>2]=0;return b|0}function Xt(a){a=a|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=4096;c[a+12>>2]=4096;c[a+16>>2]=0;c[a+20>>2]=1;return}function Yt(a,b,d){a=a|0;b=b|0;d=d|0;xe(c[a+108>>2]|0,c[a+136>>2]|0,b,d);return}function Zt(a,b){a=a|0;b=+b;var c=0;c=l;l=l+16|0;g[c>>2]=b;a=Rq(a,c)|0;l=c;return a|0}function _t(a,b){a=a|0;b=b|0;var c=0;c=jt()|0;jr(c,a,b);return c|0}function $t(a){a=a|0;if(!a){a=0;return a|0}a=Or(a)|0;return a|0}function au(a,b,d){a=a|0;b=b|0;d=d|0;Sb[c[(c[b>>2]|0)+64>>2]&127](a,b,d);return}function bu(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return 0.0}function cu(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a>>2]|0)+80>>2]&127](a,b,d,e);return}function du(a){a=a|0;if(!a){a=0;return a|0}a=Dr(a)|0;return a|0}function eu(a){a=a|0;if(!a){a=0;return a|0}a=Er(a)|0;return a|0}function fu(a){a=a|0;if(!a){a=0;return a|0}a=Fr(a)|0;return a|0}function gu(){var a=0;a=l;l=l+16|0;if(!(ib(28556,265)|0)){l=a;return}else Ww(22065,a)}function hu(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=f|0;g=g|0;return +rb[a&3](b|0,c|0,d|0,+e,f|0,g|0)}function iu(a,b){a=a|0;b=+b;var c=0;c=l;l=l+16|0;g[c>>2]=b;a=Js(a,c)|0;l=c;return a|0}function ju(a){a=a|0;if(c[a+204>>2]&3|0)return;if((c[a+220>>2]&-2|0)!=4)c[a+220>>2]=1;g[a+224>>2]=0.0;return}function ku(a,b){a=a|0;b=b|0;a=c[a+4>>2]|0;zb[c[(c[a>>2]|0)+8>>2]&31](a,c[b+36>>2]|0)|0;return}function lu(a,b){a=a|0;b=b|0;vr(a,b);$s(a+48|0,b+48|0,b+52|0,b+56|0);return}function mu(a,b,d){a=a|0;b=b|0;d=d|0;Tg(c[a+108>>2]|0,b,d);return}function nu(a,b){a=a|0;b=b|0;c[a+304>>2]=(c[a+304>>2]|0)+1;c[a+192>>2]=b;c[a+200>>2]=b;return}function ou(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;$b[a&7](b|0,c|0,d|0,e|0,f|0,g|0)}function pu(a,b,c,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=+f;g=+g;h=+h;i=+i;j=j|0;k=+k;l=l|0;T(36)}function qu(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a>>2]|0)+24>>2]&127](a,b,d,e);return}function ru(a,b,d){a=a|0;b=b|0;d=d|0;Vb[c[(c[a>>2]|0)+36>>2]&127](a,b,d<<16>>16,-3);return}function su(a,b,d){a=a|0;b=b|0;d=d|0;Sb[c[(c[b>>2]|0)+68>>2]&127](a,b,d);return}function tu(b,d){b=b|0;d=d|0;b=(a[b+344>>0]|0)==0?3:0;c[d>>2]=b;c[d+4>>2]=b;return}function uu(a,b){a=a|0;b=+b;var c=0;c=l;l=l+16|0;g[c>>2]=1.0/b;a=Rq(a,c)|0;l=c;return a|0}function vu(a,b,d){a=a|0;b=+b;d=d|0;return yb[c[(c[a>>2]|0)+52>>2]&1](a,b,d,.01666666753590107)|0}function wu(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){A=b<>>32-c;return a<>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;return}function yu(a){a=a|0;lk(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function zu(a){a=a|0;var b=0;b=c[a+68>>2]|0;Ob[c[(c[b>>2]|0)+32>>2]&127](b,c[a+24>>2]|0);return}function Au(a,b){a=a|0;b=b|0;wo(a,+g[b>>2],+g[b+4>>2],+g[b+8>>2]);return}function Bu(a,b,d,e){a=a|0;b=+b;d=d|0;e=+e;return yb[c[(c[a>>2]|0)+52>>2]&1](a,b,d,e)|0}function Cu(a,b){a=a|0;b=b|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=1065353216;g[a+12>>2]=0.0;return}function Du(a,b){a=a|0;b=b|0;c[a>>2]=1065353216;c[a+4>>2]=0;c[a+8>>2]=0;g[a+12>>2]=0.0;return}function Eu(a,b){a=a|0;b=b|0;c[a>>2]=0;c[a+4>>2]=1065353216;c[a+8>>2]=0;g[a+12>>2]=0.0;return}function Fu(a,b){a=a|0;b=b|0;Sb[c[(c[a>>2]|0)+8>>2]&127](a,b,c[(c[a+8>>2]|0)+48>>2]|0);return}function Gu(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;_b[a&0](b|0,c|0,d|0,e|0,f|0,+g)}function Hu(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=f|0;g=g|0;Ub[a&0](b|0,c|0,d|0,+e,f|0,g|0)}function Iu(a,b){a=a|0;b=b|0;xo(a,+g[b>>2],+g[b+4>>2],+g[b+8>>2]);return}function Ju(a){a=a|0;qC(a+144|0);qC(a+124|0);qC(a+104|0);return}function Ku(b,d,e){b=b|0;d=d|0;e=+e;g[(c[b+780>>2]|0)+(d*104|0)+88>>2]=e>0.0?1.0/e:0.0;a[b+984>>0]=1;return}function Lu(a,b,d){a=a|0;b=b|0;d=+d;Pb[c[(c[a>>2]|0)+20>>2]&7](a,b,d);return}function Mu(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){A=b>>>c;return a>>>c|(b&(1<>>c-32|0}function Nu(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a>>2]|0)+124>>2]&127](a,e,b,d);return}function Ou(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[a+112>>2]=b;c[a+116>>2]=d;c[a+120>>2]=e;return}function Pu(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Cb[c[(c[a>>2]|0)+8>>2]&31](a,b,d,e)|0;return}function Qu(a,b){a=a|0;b=b|0;uq(a,+g[b>>2],+g[b+4>>2],+g[b+8>>2]);return}function Ru(a,b,d){a=a|0;b=b|0;d=d|0;Vb[c[(c[a>>2]|0)+36>>2]&127](a,b,d<<16>>16,-1);return}function Su(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;$s(a,b,d,e);c[a+12>>2]=c[f>>2];return}function Tu(b,c,d,e){b=b|0;c=c|0;d=+d;e=+e;a[b+737>>0]=c&1;g[b+680>>2]=d;g[b+684>>2]=e;return}function Uu(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;fo(a,b,c,d,e,f);return}function Vu(a){a=a|0;bk(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Wu(a){a=a|0;rk(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Xu(a,b,c,d,e,f,g){a=a|0;b=b|0;c=+c;d=+d;e=e|0;f=f|0;g=g|0;Lb[a&0](b|0,+c,+d,e|0,f|0,g|0)}function Yu(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return 1.0}function Zu(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return}function _u(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;T(19);return 0}function $u(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a>>2]|0)+32>>2]&127](a,b,d,e);return}function av(a){a=a|0;Qg(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function bv(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;T(9);return 0.0}function cv(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Yi(a,b,c,d,e);return}function dv(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;bg(a,b,c,d,e);return}function ev(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;Qa(a|0,b|0,+c,d|0)}function fv(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;Qb[c[(c[a>>2]|0)+28>>2]&7](a,b,d,e);return}function gv(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 Db[a&1](b|0,c|0,d|0,e|0,f|0)|0}function hv(a,b){a=a|0;b=b|0;Ce(a,b);return}function iv(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=+f;g=+g;h=+h;i=i|0;j=j|0;k=+k;T(37)}function jv(a,b){a=a|0;b=b|0;Tg(c[a+108>>2]|0,b,1);return}function kv(a,b){a=a|0;b=b|0;c[a+304>>2]=(c[a+304>>2]|0)+1;ur(a+4|0,b);return}function lv(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 +tb[a&15](b|0,c|0,d|0,e|0,f|0)}function mv(a,b){a=a|0;b=b|0;var c=0;c=Xs()|0;ig(c,a,b);return c|0}function nv(a,b){a=a|0;b=b|0;if(!b)b=0;else b=Ui(c[b>>2]|0,c[b+4>>2]|0,a)|0;return (b|0?b:a)|0}function ov(a,b){a=a|0;b=b|0;yq(a,+g[b>>2],+g[b+4>>2],+g[b+8>>2]);return}function pv(a,b){a=a|0;b=+b;var c=0;c=l;l=l+16|0;g[c>>2]=1.0/b;Js(a,c)|0;l=c;return}function qv(a,b){a=a|0;b=+b;return yb[c[(c[a>>2]|0)+52>>2]&1](a,b,1,.01666666753590107)|0}function rv(a){a=a|0;var b=0;b=Ds(8)|0;hw(b,a);return b|0}function sv(a,b,d){a=a|0;b=b|0;d=d|0;Sb[c[(c[a>>2]|0)+56>>2]&127](a,b,d);return}function tv(a,b,d){a=a|0;b=b|0;d=+d;Pb[c[(c[a>>2]|0)+36>>2]&7](a,b,d);return}function uv(b){b=b|0;if((c[b+56>>2]|0)==0?(a[b+44>>0]&1)==0:0){b=0;return b|0}b=1;return b|0}function vv(a){a=a|0;ii(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function wv(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;T(43)}function xv(a){a=a|0;tj(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function yv(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;fo(a,b,c,d,e,1.0);return}function zv(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;f=f|0;return +pb[a&3](b|0,c|0,+d,e|0,f|0)}function Av(a,b,c,d){a=a|0;b=b|0;c=+c;d=+d;Tu(a,b,c,d);return}function Bv(a,b,c){a=a|0;b=b|0;c=c|0;return +Sa(a|0,b|0,c|0)}function Cv(a){a=a|0;c[a>>2]=8404;if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Dv(a,b){a=a|0;b=b|0;return c[(bC(c[a+28>>2]|0,b)|0)+64>>2]|0}function Ev(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;Zb[a&31](b|0,c|0,d|0,e|0,f|0)}function Fv(a){a=a|0;if(!(c[a+12>>2]|0)){a=0;return a|0}a=c[a+20>>2]|0;return a|0}function Gv(a){a=a|0;et(a);Dw(a);return}function Hv(a){a=a|0;qm(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Iv(a,b){a=a|0;b=b|0;var c=0;c=Ds(64)|0;Dq(c,a,b);return c|0}function Jv(){var a=0;a=Ds(24)|0;Xt(a);return a|0}function Kv(a,b,d){a=a|0;b=b|0;d=+d;Jb[c[(c[a>>2]|0)+16>>2]&31](a,d);return}function Lv(a,b,c){a=a|0;b=b|0;c=c|0;yo(a,b,c);return}function Mv(a,b){a=a|0;b=b|0;Vb[c[(c[a>>2]|0)+36>>2]&127](a,b,2,-3);return}function Nv(a,b,d){a=a|0;b=+b;d=d|0;Mb[c[(c[a>>2]|0)+32>>2]&15](a,b,d);return}function Ov(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;return}function Pv(a){a=a|0;ji(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Qv(a){a=a|0;ni(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Rv(a,b,d){a=a|0;b=b|0;d=d|0;return +(+qb[c[(c[a>>2]|0)+32>>2]&31](a,b,d))}function Sv(a,b){a=a|0;b=b|0;$o(a,b);return}function Tv(a,b){a=a|0;b=b|0;$o(a,b);return}function Uv(a,b){a=a|0;b=b|0;$o(a,b);return}function Vv(a,b){a=a|0;b=b|0;return c[(aE(c[a+336>>2]|0,b)|0)>>2]|0}function Wv(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;Wb[a&1](b|0,c|0,d|0,e|0,+f)}function Xv(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;f=f|0;Rb[a&0](b|0,c|0,+d,e|0,f|0)}function Yv(a){a=a|0;c[a>>2]=4652;if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Zv(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;T(8);return 0.0}function _v(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+16>>2]&127](a,b);return}function $v(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+52>>2]&127](a,b);return}function aw(a,b,d){a=a|0;b=b|0;d=+d;Pb[c[(c[a>>2]|0)+8>>2]&7](a,b,d);return}function bw(a,b){a=a|0;b=b|0;wA(a,b);return}function cw(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Qc(a,b,c,d)|0;return 1}function dw(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;as(a,b,c,d,e);return}function ew(a){a=a|0;var b=0;b=Xs()|0;ig(b,a,1);return b|0}function fw(a,b,d){a=a|0;b=+b;d=d|0;g[(c[a+136>>2]|0)+(d*284|0)+232>>2]=b;return}function gw(a,b,d){a=a|0;b=+b;d=d|0;g[(c[a+136>>2]|0)+(d*284|0)+252>>2]=b;return}function hw(a,b){a=a|0;b=b|0;CH(a);c[a>>2]=5148;c[a+4>>2]=b;return}function iw(a,b){a=a|0;b=b|0;pr(a,b);return}function jw(a,b){a=a|0;b=b|0;wr(a,b);return}function kw(a,b){a=a|0;b=b|0;Vb[c[(c[a>>2]|0)+36>>2]&127](a,b,1,-1);return}function lw(a){a=+a;var b=0;h[j>>3]=a;b=c[j>>2]|0;A=c[j+4>>2]|0;return b|0}function mw(a,b,c){a=a|0;b=b|0;c=c|0;Wh(b,c);return}function nw(a,b){a=a|0;b=b|0;Rn(a,b);return}function ow(a){a=a|0;c[a>>2]=2928;c[a+4>>2]=1;c[a+8>>2]=-1;g[a+12>>2]=0.0;return}function pw(a){a=a|0;rd(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function qw(a){a=a|0;var b=0;b=((c[a+56>>2]|0)+2|0)%3|0;return +(+g[(gJ(a+32|0)|0)+(b<<2)>>2])}function rw(a){a=a|0;c[a>>2]=3148;g[a+4>>2]=1.0;c[a+8>>2]=1;c[a+12>>2]=-1;return}function sw(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=b-d-(c>>>0>a>>>0|0)>>>0;return (A=d,a-c>>>0|0)|0}function tw(a,b){a=a|0;b=b|0;return c[(aE(c[a+12>>2]|0,b)|0)>>2]|0}function uw(a,b){a=a|0;b=b|0;if((c[a+220>>2]&-2|0)==4)return;c[a+220>>2]=b;return}function vw(a,b){a=a|0;b=b|0;Hr(a,b);return}function ww(a,b){a=a|0;b=b|0;Ir(a,b);return}function xw(a,b){a=a|0;b=b|0;Sb[c[(c[a>>2]|0)+56>>2]&127](a,b,0);return}function yw(a,b){a=a|0;b=+b;ry(a,b);return}function zw(a,b){a=a|0;b=b|0;return BB(a,b)|0}function Aw(a,b){a=a|0;b=b|0;return zb[c[(c[a>>2]|0)+40>>2]&31](a,b)|0}function Bw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+60>>2]&127](a,b);return}function Cw(a,b,d){a=a|0;b=b|0;d=+d;Ob[c[(c[a>>2]|0)+12>>2]&127](a,b);return}function Dw(b){b=b|0;a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;return}function Ew(a){a=a|0;var b=0;b=Ds(64)|0;cn(b,a);return b|0}function Fw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+92>>2]&127](a,b);return}function Gw(a,b){a=a|0;b=b|0;xn(a,b);return}function Hw(a,b){a=a|0;b=b|0;zn(a,b);return}function Iw(a,b){a=a|0;b=b|0;An(a,b);return}function Jw(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return Cb[a&31](b|0,c|0,d|0,e|0)|0}function Kw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+32>>2]&127](a,b);return}function Lw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+128>>2]&127](a,b);return}function Mw(a){a=a|0;var b=0;b=Nt()|0;Ai(b,a);return b|0}function Nw(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;T(42)}function Ow(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return (A=b+d+(a+c>>>0>>>0>>0|0)>>>0,a+c>>>0|0)|0}function Pw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+40>>2]&127](a,b);return}function Qw(a,b,d){a=a|0;b=+b;d=d|0;g[(c[a+136>>2]|0)+(d*284|0)+256>>2]=b;return}function Rw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+84>>2]&127](a,b);return}function Sw(a){a=a|0;var b=0;b=ut()|0;Rf(b,a,0);return b|0}function Tw(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;Lm(a,b,c,d);return}function Uw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+28>>2]&127](a,b);return}function Vw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+124>>2]&127](a,b);return}function Ww(a,b){a=a|0;b=b|0;var d=0;d=l;l=l+16|0;c[d>>2]=b;Ik(a,d);rn();bb()}function Xw(a,b){a=a|0;b=+b;c[a+304>>2]=(c[a+304>>2]|0)+1;g[a+236>>2]=b;return}function Yw(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return +sb[a&1](b|0,c|0,d|0,e|0)}function Zw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+72>>2]&127](a,b);return}function _w(){var a=0;a=rt()|0;lg(a,0,0,16);return a|0}function $w(a){a=a|0;var b=0;b=Ds(284)|0;Gj(b,a);return b|0}function ax(a,b){a=a|0;b=+b;g[a+44>>2]=b;g[a+48>>2]=+F(+b);return}function bx(a,b){a=a|0;b=+b;return +(+nb[c[(c[a>>2]|0)+16>>2]&15](a)*b)}function cx(a){a=a|0;pv(a,+MA(+g[a>>2],+g[a+4>>2],+g[a+8>>2]));return}function dx(a,b){a=a|0;b=b|0;Uv(a+928|0,b);return}function ex(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+12>>2]&127](a,b);return}function fx(a,b){a=a|0;b=+b;c[a+304>>2]=(c[a+304>>2]|0)+1;g[a+232>>2]=b;return}function gx(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;T(18);return 0}function hx(a,b){a=a|0;b=b|0;Oe(a,b);return}function ix(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;T(7);return 0.0}function jx(a,b,c){a=a|0;b=b|0;c=c|0;xi(a,b,c);return}function kx(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Vb[a&127](b|0,c|0,d|0,e|0)}function lx(a,b,c){a=a|0;b=b|0;c=c|0;ll(a,b,c);return}function mx(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;Pm(a,b,c,d);return}function nx(a,b){a=a|0;b=b|0;xf(a,b);return}function ox(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+68>>2]&127](a,b);return}function px(a){a=a|0;if(!a)return;Ib[c[(c[a>>2]|0)+4>>2]&511](a);return}function qx(a,b){a=a|0;b=+b;c[a+304>>2]=(c[a+304>>2]|0)+1;g[a+228>>2]=b;return}function rx(){var a=0;a=Xs()|0;ig(a,1,1);return a|0}function sx(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+8>>2]&127](a,b);return}function tx(a){a=a|0;return jF(c[a+204>>2]|0)|0}function ux(a,b,c){a=a|0;b=+b;c=+c;my(a,b,c);return}function vx(a,b){a=a|0;b=+b;Jb[c[(c[a>>2]|0)+20>>2]&31](a,b);return}function wx(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;Fl(a,b,c,d);return}function xx(a,b){a=a|0;b=b|0;nw(a+848|0,b);return}function yx(a){a=a|0;return MF(+g[a>>2],+g[a+4>>2])|0}function zx(a,b){a=a|0;b=+b;Jb[c[(c[a>>2]|0)+16>>2]&31](a,b);return}function Ax(a,b){a=a|0;b=b|0;return +(+g[(c[a+136>>2]|0)+(b*284|0)+232>>2])}function Bx(){var a=0;a=Ds(176)|0;Ne(a,0);return a|0}function Cx(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+24>>2]&127](a,b);return}function Dx(a,b){a=a|0;b=b|0;c[a+68>>2]=b;return}function Ex(a,b,d){a=a|0;b=b|0;d=d|0;c[a+20>>2]=b;c[a+28>>2]=d;return}function Fx(a,b,d){a=a|0;b=b|0;d=d|0;c[a+16>>2]=b;c[a+24>>2]=d;return}function Gx(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return 0}function Hx(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=d|0;e=+e;return yb[a&1](b|0,+c,d|0,+e)|0}function Ix(a,b,c){a=a|0;b=b|0;c=+c;Um(a,b,c);return}function Jx(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+64>>2]&127](a,b);return}function Kx(a){a=a|0;var b=0;b=((gJ(c[a+252>>2]|0)|0)&2|0)==0;return (b?0:a)|0}function Lx(a,b){a=a|0;b=b|0;return nC(c[a+12>>2]|0,b)|0}function Mx(a,b){a=a|0;b=b|0;return wC(c[a+12>>2]|0,b)|0}function Nx(a,b){a=a|0;b=b|0;return xC(c[a+12>>2]|0,b)|0}function Ox(a,b,c){a=a|0;b=b|0;c=c|0;dm(a,b,c);return}function Px(a,b,c){a=a|0;b=b|0;c=+c;g[a+1340+(b<<2)>>2]=c;return}function Qx(a,b,c){a=a|0;b=b|0;c=c|0;return jc(a,b,c)|0}function Rx(a,b,c){a=a|0;b=b|0;c=+c;mr(a,b,c);return}function Sx(a){a=a|0;c[a>>2]=3848;Qi(a+12|0);cJ(a);return}function Tx(a,b){a=a|0;b=b|0;Ln(a,b);return}function Ux(a,b){a=a|0;b=b|0;Gw(a+768|0,b);return}function Vx(a,b){a=a|0;b=b|0;Hw(a+788|0,b);return}function Wx(a,b){a=a|0;b=b|0;Iw(a+808|0,b);return}function Xx(a){a=a|0;if(!a)return;yF(a);cJ(a);return}function Yx(a,b){a=a|0;b=+b;g[a+32>>2]=b;g[a+36>>2]=b;return}function Zx(a,b,c){a=a|0;b=b|0;c=+c;g[a+1364+(b<<2)>>2]=c;return}function _x(a,b){a=a|0;b=b|0;re(a,b);return}function $x(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;Tb[a&15](b|0,c|0,d|0,+e)}function ay(a){a=a|0;if(!a)return;qC(a);cJ(a);return}function by(a){a=+a;var b=0;b=Dt()|0;sm(b,a);return b|0}function cy(a,b){a=a|0;b=b|0;kv(a,b);return}function dy(a,b){a=a|0;b=+b;g[a+136>>2]=b;return}function ey(a,b){a=a|0;b=+b;uz(a,b);return}function fy(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;Qb[a&7](b|0,c|0,+d,e|0)}function gy(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=d|0;e=e|0;Nb[a&0](b|0,+c,d|0,e|0)}function hy(a,b){a=a|0;b=+b;g[a+132>>2]=b;return}function iy(a,b){a=a|0;b=b|0;Vr(a,b);return}function jy(a,b){a=a|0;b=b|0;Wr(a,b);return}function ky(a){a=a|0;var b=0;b=gJ(a+32|0)|0;return +(+g[b+(c[a+56>>2]<<2)>>2])}function ly(a,b){a=a|0;b=b|0;c[a+24>>2]=b;return}function my(a,b,c){a=a|0;b=+b;c=+c;g[a+532>>2]=b;g[a+536>>2]=c;return}function ny(){var a=0;a=ut()|0;Rf(a,1,0);return a|0}function oy(a,b){a=a|0;b=b|0;return IC(a,b)|0}function py(a,b){a=a|0;b=b|0;g[a+56>>2]=+(b|0);return}function qy(a){a=a|0;var b=0;b=l;l=l+16|0;Hb[a&3]();Ww(22168,b)}function ry(b,c){b=b|0;c=+c;g[b+572>>2]=c;a[b+553>>0]=1;return}function sy(a,b){a=a|0;b=b|0;return c[(c[a+20>>2]|0)+(b<<2)>>2]|0}function ty(a){a=a|0;return +(+rI(+g[a+16>>2]))}function uy(a){a=a|0;return xb[c[(c[a>>2]|0)+40>>2]&127](a)|0}function vy(a){a=a|0;var b=0;b=(gJ(c[a+252>>2]|0)|0)==4;return (b?a:0)|0}function wy(a){a=a|0;return +(+MA(+g[a>>2],+g[a+4>>2],+g[a+8>>2]))}function xy(a,b){a=a|0;b=+b;dC(a,b);return}function yy(){var a=0;a=Ds(64)|0;co(a);return a|0}function zy(a,b){a=a|0;b=b|0;_B(a,b);return}function Ay(a,b){a=a|0;b=+b;Jb[c[(c[a>>2]|0)+44>>2]&31](a,b);return}function By(a,b){a=a|0;b=b|0;Eq(a,b);return}function Cy(a,b){a=a|0;b=+b;g[a+140>>2]=b;return}function Dy(a){a=a|0;return nG(+g[a+4>>2])|0}function Ey(a){a=a|0;if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Fy(a,b){a=a|0;b=b|0;iD(a,b);return}function Gy(a,b){a=a|0;b=b|0;return (c[a+136>>2]|0)+(b*284|0)+92|0}function Hy(a,b){a=a|0;b=b|0;return Vv(a,b)|0}function Iy(a,b,c,d,e,f){a=+a;b=+b;c=+c;d=+d;e=+e;f=+f;return +(a*d+b*e+c*f)}function Jy(a){a=a|0;var b=0;b=(gJ(c[a+252>>2]|0)|0)==8;return (b?a:0)|0}function Ky(){var a=0;a=Ds(24)|0;Tr(a);return a|0}function Ly(a,b){a=a|0;b=b|0;Hq(a,b);return}function My(a,b){a=a|0;b=+b;UC(a,b);return}function Ny(a){a=a|0;g[a>>2]=.30000001192092896;g[a+4>>2]=1.0;g[a+8>>2]=0.0;return}function Oy(a,b){a=a|0;b=+b;yC(a,b);return}function Py(a,b){a=a|0;b=b|0;jD(a,b);return}function Qy(a,b){a=a|0;b=b|0;ur(a+4|0,b);return}function Ry(a){a=a|0;return QF(c[a+204>>2]|0)|0}function Sy(a,b){a=a|0;b=+b;WC(a,b);return}function Ty(a,b){a=a|0;b=+b;cA(a,b);return}function Uy(a,b){a=a|0;b=+b;XC(a,b);return}function Vy(a,b){a=a|0;b=+b;dA(a,b);return}function Wy(a,b){a=a|0;b=b|0;vt(a,b);return}function Xy(a,b){a=a|0;b=b|0;Jq(a,b);return}function Yy(a){a=a|0;return +(+rI(+g[a+104>>2]))}function Zy(a){a=a|0;return +(+RD(+g[a+12>>2]))}function _y(b,c){b=b|0;c=c|0;a[b+32>>0]=c&1;return}function $y(a){a=a|0;return HF(c[a+8>>2]|0)|0}function az(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Bb[a&63](b|0,c|0,d|0)|0}function bz(a,b){a=a|0;b=b|0;return +(+Ro(a,b))}function cz(a,b){a=a|0;b=b|0;xi(a,b,1);return}function dz(a,b){a=a|0;b=b|0;DC(a,b);return}function ez(a,b){a=a|0;b=b|0;c[a+8>>2]=b<<16>>16;return}function fz(a){a=a|0;if(!a)a=0;else a=(fj(a,2864)|0)!=0;return a&1|0}function gz(a){a=a|0;Jj(a);cJ(a);return}function hz(a,b){a=a|0;b=+b;bF(a,b);return}function iz(a,b){a=a|0;b=b|0;Im(a,b);return}function jz(a,b){a=a|0;b=+b;g[a+120>>2]=b;return}function kz(a,b){a=a|0;b=b|0;kB(a,b,+uE(b));return}function lz(a){a=a|0;c[a>>2]=3848;Qi(a+12|0);return}function mz(a,b){a=a|0;b=b|0;TC(a,b);return}function nz(a,b){a=a|0;b=b|0;lu(a,b);return}function oz(){var a=0;a=Ds(100)|0;Mm(a);return a|0}function pz(a,b){a=a|0;b=+b;g[a+116>>2]=b;return}function qz(a,b){a=a|0;b=+b;g[a+128>>2]=b;return}function rz(a,b){a=a|0;b=b|0;JC(a,b);return}function sz(a,b){a=a|0;b=b|0;c[a+12>>2]=b<<16>>16;return}function tz(a,b){a=a|0;b=b|0;return c[(c[a+236>>2]|0)+(b<<2)>>2]|0}function uz(b,c){b=b|0;c=+c;g[b+572>>2]=c;a[b+553>>0]=0;return}function vz(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return +qb[a&31](b|0,c|0,d|0)}function wz(a,b){a=a|0;b=b|0;KC(a,b);return}function xz(a,b){a=a|0;b=b|0;return jc(a,b,8192)|0}function yz(b,c){b=b|0;c=c|0;a[b+124>>0]=c&1;return}function zz(){var a=0;a=Ds(12)|0;Ny(a);return a|0}function Az(a,b){a=a|0;b=b|0;c[a+16>>2]=b<<16>>16;return}function Bz(a){a=a|0;if(!a)return;Ju(a);cJ(a);return}function Cz(a){a=a|0;return xb[c[(c[a>>2]|0)+48>>2]&127](a)|0}function Dz(a){a=a|0;ow(a);c[a>>2]=2904;return}function Ez(a){a=a|0;return pG(a)|0}function Fz(a,b){a=a|0;b=+b;Xw(a,b);return}function Gz(a,b){a=a|0;b=b|0;return +(+wf(a,b))}function Hz(a){a=a|0;return +(+rI(+g[a+124>>2]))}function Iz(){var a=0;a=Ds(4)|0;cC(a);return a|0}function Jz(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;return}function Kz(a){a=a|0;return kG(c[a+204>>2]|0)|0}function Lz(a,b){a=a|0;b=+b;SD(a,b);return}function Mz(a,b){a=a|0;b=b|0;yh(a,b);return}function Nz(a,b){a=a|0;b=+b;BD(a,b);return}function Oz(a){a=a|0;return xb[c[(c[a>>2]|0)+28>>2]&127](a)|0}function Pz(a,b){a=a|0;b=b|0;return Dv(a,b)|0}function Qz(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;return Ab[a&7](b|0,c|0,+d)|0}function Rz(a){a=a|0;return uv(a)|0}function Sz(a){a=a|0;return +(+g[a+136>>2])}function Tz(a){a=a|0;return qA(c[a+68>>2]|0)|0}function Uz(b){b=b|0;if((a[b>>0]|0)==1)b=0;else{a[b>>0]=1;b=1}return b|0}function Vz(b,c){b=b|0;c=c|0;a[b+80>>0]=c&1;return}function Wz(a,b){a=a|0;b=b|0;YC(a,b);return}function Xz(a){a=a|0;return +(+g[a+132>>2])}function Yz(a,b){a=a|0;b=b|0;return (c[a+136>>2]|0)+(b*284|0)|0}function Zz(a,b){a=a|0;b=b|0;bD(a,b);return}function _z(a){a=a|0;c[a+4>>2]=(c[a+4>>2]|0)+-1;return}function $z(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;T(41)}function aA(a){a=a|0;return AD(a)|0}function bA(a){a=a|0;Dw(a);return}function cA(a,b){a=a|0;b=+b;g[a+196>>2]=+ot(b);return}function dA(a,b){a=a|0;b=+b;g[a+192>>2]=+ot(b);return}function eA(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Sb[a&127](b|0,c|0,d|0)}function fA(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[a>>2]&32))wk(b,d,a);return}function gA(a,b){a=a|0;b=b|0;ur(a+92|0,b);return}function hA(a,b){a=a|0;b=+b;g[a+104>>2]=b;return}function iA(a){a=a|0;cj(a);cJ(a);return}function jA(a,b){a=a|0;b=+b;g[a+268>>2]=b;return}function kA(a){a=a|0;return +(+rI(+g[a+80>>2]))}function lA(a,b){a=a|0;b=b|0;c[b+780>>2]=0;return}function mA(a,b){a=a|0;b=b|0;vk(a,b);return}function nA(){c[5957]=1065353216;c[5958]=0;c[5959]=0;g[5960]=0.0;return}function oA(a,b){a=a|0;b=+b;fx(a,b);return}function pA(a){a=a|0;return +(+nb[c[(c[a>>2]|0)+48>>2]&15](a))}function qA(a){a=a|0;return xb[c[(c[a>>2]|0)+36>>2]&127](a)|0}function rA(a){a=a|0;var b=0;b=l;l=l+a|0;l=l+15&-16;return b|0}function sA(a,b){a=a|0;b=b|0;Ld(a,b);return}function tA(a,b){a=a|0;b=b|0;CD(a,b);return}function uA(a){a=a|0;return +(+g[a+140>>2])}function vA(b){b=b|0;return (a[b+32>>0]&1)!=0|0}function wA(b,c){b=b|0;c=c|0;a[b+250>>0]=c&1;return}function xA(a,b){a=a|0;b=b|0;ss(a,b);return}function yA(a,b){a=a|0;b=b|0;Xn(a+348|0,b);return}function zA(a,b){a=a|0;b=b|0;return Kx(b)|0}function AA(a,b){a=a|0;b=+b;g[a+112>>2]=b;return}function BA(a,b){a=a|0;b=b|0;yh(b,a);return}function CA(b,c){b=b|0;c=c|0;a[b+44>>0]=c&1;return}function DA(a){a=a|0;return cH(a)|0}function EA(a){a=a|0;return dH(a)|0}function FA(a){a=a|0;return iH(a)|0}function GA(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;T(17);return 0}function HA(a){a=a|0;_z(a);return}function IA(a,b){a=a|0;b=b|0;mA(a,b);return}function JA(a,b){a=a|0;b=b|0;return Jy(b)|0}function KA(a,b){a=a|0;b=b|0;c[a+52>>2]=b&1;return}function LA(a,b,d){a=a|0;b=b|0;d=d|0;c[a+24+(b<<2)>>2]=d;return}function MA(a,b,c){a=+a;b=+b;c=+c;return +(+VI(+_A(a,b,c)))}function NA(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;Mb[a&15](b|0,+c,d|0)}function OA(a,b){a=a|0;b=b|0;if(!a)a=0;else a=Jk(a,b)|0;return a|0}function PA(a,b){a=a|0;b=+b;g[a+220>>2]=b;return}function QA(a,b){a=a|0;b=+b;g[a+100>>2]=b;return}function RA(b){b=b|0;return (a[b+124>>0]&1)!=0|0}function SA(b,c){b=b|0;c=c|0;a[b+24>>0]=c&1;return}function TA(a){a=a|0;return ~~+g[a+56>>2]|0}function UA(a,b,d){a=a|0;b=b|0;d=d|0;c[a+8+(b<<2)>>2]=d;return}function VA(b,c){b=b|0;c=c|0;a[b+288>>0]=c&1;return}function WA(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;Pb[a&7](b|0,c|0,+d)}function XA(a,b){a=a|0;b=+b;g[a+224>>2]=b;return}function YA(a,b){a=a|0;b=+b;qx(a,b);return}function ZA(a){a=a|0;return GC(c[a+220>>2]|0)|0}function _A(a,b,c){a=+a;b=+b;c=+c;return +(+Iy(a,b,c,a,b,c))}function $A(a){a=+a;if(!(a<-1.0)){if(a>1.0)a=1.0}else a=-1.0;return +(+I(+a))}function aB(a){a=a|0;return +(+g[a+120>>2])}function bB(b,c){b=b|0;c=c|0;a[b+16>>0]=c&1;return}function cB(a){a=a|0;return tE(a)|0}function dB(a,b){a=a|0;b=b|0;Vm(a+104|0,b);return}function eB(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;f=f|0;T(4);return 0.0}function fB(a,b){a=a|0;b=+b;g[a+204>>2]=b;return}function gB(a,b){a=a|0;b=+b;g[a+208>>2]=b;return}function hB(a){a=a|0;return +(+g[a+116>>2])}function iB(a){a=a|0;return +(+g[a+128>>2])}function jB(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return}function kB(a,b,c){a=a|0;b=b|0;c=+c;qo(a,b,1.0/c);return}function lB(a){a=a|0;nf(a);cJ(a);return}function mB(a,b){a=a|0;b=b|0;var c=0;c=KB(a|0)|0;return ((b|0)==0?a:c)|0}function nB(a,b){a=a|0;b=+b;g[a+216>>2]=b;return}function oB(b){b=b|0;return (a[b+80>>0]&1)!=0|0}function pB(a,b){a=a|0;b=b|0;c[a+36>>2]=b;return}function qB(a,b){a=a|0;b=b|0;c[a+32>>2]=b;return}function rB(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Ye(a,b,c,d,0)|0}function sB(a,b){a=a|0;b=+b;g[a+248>>2]=b;return}function tB(b,c){b=b|0;c=c|0;a[b+260>>0]=c&1;return}function uB(b,c){b=b|0;c=c|0;a[b+25>>0]=c&1;return}function vB(a,b,c){a=a|0;b=+b;c=c|0;return}function wB(a,b){a=a|0;b=b|0;c[a+72>>2]=b;return}function xB(a){a=a|0;uu(a,+uE(a))|0;return}function yB(a,b,c,d){a=a|0;b=b|0;c=+c;d=+d;Kb[a&7](b|0,+c,+d)}function zB(a){a=a|0;return +(+GH(+g[a+12>>2]))}function AB(a,b){a=a|0;b=b|0;c[a+8>>2]=b;return}function BB(a,b){a=a|0;b=b|0;return a+868+(b<<6)|0}function CB(a){a=a|0;return zH(a)|0}function DB(a,b){a=a|0;b=b|0;return +(+_s(a,b))}function EB(a){a=a|0;return c[a+8>>2]&65535|0}function FB(a,b){a=a|0;b=b|0;c[a+220>>2]=b;return}function GB(b,c){b=b|0;c=c|0;a[b+26>>0]=c&1;return}function HB(b,c){b=b|0;c=c|0;a[b+84>>0]=c&1;return}function IB(a){a=a|0;Gi(a);cJ(a);return}function JB(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;T(40)}function KB(a){a=a|0;return (a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function LB(a){a=a|0;return HH(a)|0}function MB(a){a=a|0;return VE(a)|0}function NB(a){a=a|0;return (c[a+108>>2]|0)+4|0}function OB(a,b){a=a|0;b=b|0;c[a+4>>2]=b;return}function PB(a){a=a|0;return c[a+12>>2]&65535|0}function QB(a){a=a|0;if(!a)return;Ey(a);return}function RB(a,b){a=a|0;b=b|0;Vm(a+28|0,b);return}function SB(a,b,c){a=a|0;b=b|0;c=c|0;return zb[a&31](b|0,c|0)|0}function TB(a,b){a=a|0;b=+b;g[a+244>>2]=b;return}function UB(a,b){a=a|0;b=+b;g[a+240>>2]=b;return}function VB(a){a=a|0;return +(+g[a+104>>2])}function WB(a,b){a=a|0;b=b|0;return Nl(a,b)|0}function XB(a){a=a|0;return MH(a)|0}function YB(a){a=a|0;return c[a+16>>2]&65535|0}function ZB(a){a=a|0;kk(a);cJ(a);return}function _B(b,c){b=b|0;c=c|0;a[b+524>>0]=c&1;return}function $B(a){a=a|0;return ((a|0)==0?1:a<<1)|0}function aC(a,b){a=a|0;b=b|0;return a+(b*96|0)|0}function bC(a,b){a=a|0;b=b|0;return a+(b*80|0)|0}function cC(a){a=a|0;NG(a);c[a>>2]=3e3;return}function dC(a,b){a=a|0;b=+b;g[a+272>>2]=b;return}function eC(a,b){a=a|0;b=+b;g[a+212>>2]=b;return}function fC(a,b){a=a|0;b=+b;g[a+228>>2]=b;return}function gC(a){a=a|0;return +(+g[a+268>>2])}function hC(b){b=b|0;return (a[b+44>>0]&1)!=0|0}function iC(a){a=a|0;return gJ(c[a+84>>2]|0)|0}function jC(a,b){a=a|0;b=b|0;return Xo(a,b)|0}function kC(a,b){a=a|0;b=b|0;return Wo(a,b)|0}function lC(a,b){a=a|0;b=b|0;return +(+Gp(a,b))}function mC(a){a=a|0;return +(+ky(a))}function nC(a,b){a=a|0;b=b|0;return a+(b*104|0)|0}function oC(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;T(39)}function pC(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;f=f|0;T(33)}function qC(a){a=a|0;Gv(a);return}function rC(a,b){a=a|0;b=+b;g[a+252>>2]=b;return}function sC(a){a=a|0;return +(+g[a+96>>2])}function tC(a){a=a|0;return YH(a)|0}function uC(a){a=a|0;return (c[a+52>>2]|0)!=0|0}function vC(a){a=a|0;Qi(a);cJ(a);return}function wC(a,b){a=a|0;b=b|0;return a+(b*52|0)|0}function xC(a,b){a=a|0;b=b|0;return a+(b*44|0)|0}function yC(a,b){a=a|0;b=+b;g[a+276>>2]=b;return}function zC(a){a=a|0;bA(a);return}function AC(a){a=a|0;return gJ(c[a+88>>2]|0)|0}function BC(a){a=a|0;return gJ(c[a+780>>2]|0)|0}function CC(b){b=b|0;return (a[b+24>>0]&1)!=0|0}function DC(b,c){b=b|0;c=c|0;a[b+552>>0]=c&1;return}function EC(a,b,c){a=a|0;b=b|0;c=c|0;return 0}function FC(a){a=a|0;return +(+g[a+112>>2])}function GC(a){a=a|0;a=gJ(a)|0;return (a|0)!=5&(a|0)!=2|0}function HC(a){a=a|0;mk(a);cJ(a);return}function IC(a,b){a=a|0;b=b|0;return a+4+(b*192|0)|0}function JC(b,c){b=b|0;c=c|0;a[b+736>>0]=c&1;return}function KC(a,b){a=a|0;b=b|0;c[a+204>>2]=b;return}function LC(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=d|0;e=e|0;f=f|0;T(24)}function MC(a,b){a=a|0;b=+b;g[a+232>>2]=b;return}function NC(a,b){a=a|0;b=+b;g[a+280>>2]=b;return}function OC(a,b){a=a|0;b=+b;g[a+236>>2]=b;return}function PC(a){a=a|0;return +(+g[a+272>>2])}function QC(a,b){a=a|0;b=+b;return uu(a,b)|0}function RC(b){b=b|0;return (a[b+16>>0]&1)!=0|0}function SC(a){a=a|0;if(a>>>0>4294963200){c[7137]=0-a;a=-1}return a|0}function TC(b,c){b=b|0;c=c|0;a[b+21>>0]=c&1;return}function UC(a,b){a=a|0;b=+b;g[a+684>>2]=b;return}function VC(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;T(16);return 0}function WC(a,b){a=a|0;b=+b;g[a+188>>2]=b;return}function XC(a,b){a=a|0;b=+b;g[a+184>>2]=b;return}function YC(a,b){a=a|0;b=b|0;c[a+256>>2]=b;return}function ZC(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;T(6);return 0.0}function _C(a){a=a|0;return +(+g[a+220>>2])}function $C(a){a=a|0;return +(+g[a+100>>2])}function aD(a){a=a|0;return gJ(c[a+120>>2]|0)|0}function bD(b,c){b=b|0;c=c|0;a[b+737>>0]=c&1;return}function cD(a,b){a=a|0;b=+b;g[a+256>>2]=b;return}function dD(a){a=a|0;return +(+g[a+224>>2])}function eD(a,b){a=a|0;b=b|0;return vs(a,b)|0}function fD(a,b){a=a|0;b=b|0;return us(a,b)|0}function gD(a){a=a|0;return hh(a)|0}function hD(b,c){b=b|0;c=c|0;a[b+152>>0]=c&1;return}function iD(a,b){a=a|0;b=b|0;c[a+84>>2]=b;return}function jD(a,b){a=a|0;b=b|0;c[a+88>>2]=b;return}function kD(a,b){a=a|0;b=b|0;c[a+92>>2]=b;return}function lD(a,b){a=a|0;b=b|0;c[a+100>>2]=b;return}function mD(a,b){a=a|0;b=b|0;c[a+96>>2]=b;return}function nD(a){a=a|0;return (c[a+48>>2]|0)==1|0}function oD(a){a=a|0;nk(a);cJ(a);return}function pD(a){a=a|0;Hk(a);cJ(a);return}function qD(a,b){a=a|0;b=b|0;return (a|0)==(b|0)|0}function rD(a,b){a=a|0;b=b|0;if(!p){p=a;q=b}}function sD(b){b=b|0;return (a[b+260>>0]&1)!=0|0}function tD(a){a=a|0;return gJ(c[a+108>>2]|0)|0}function uD(a){a=a|0;return gJ(c[a+112>>2]|0)|0}function vD(a){a=a|0;return gJ(c[a+776>>2]|0)|0}function wD(a){a=a|0;return gJ(c[a+772>>2]|0)|0}function xD(b){b=b|0;return (a[b+25>>0]&1)!=0|0}function yD(a,b){a=a|0;b=b|0;return c[a+24+(b<<2)>>2]|0}function zD(a){a=a|0;return (c[a+96>>2]|0)+4|0}function AD(a){a=a|0;return gJ(c[a+328>>2]|0)|0}function BD(a,b){a=a|0;b=+b;g[a+440>>2]=b;return}function CD(a,b){a=a|0;b=b|0;c[a+264>>2]=b;return}function DD(a,b,c){a=a|0;b=b|0;c=c|0;Ob[a&127](b|0,c|0)}function ED(a,b,c){a=a|0;b=b|0;c=+c;return +ob[a&1](b|0,+c)}function FD(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=d|0;e=e|0;T(2);return 0.0}function GD(a){a=a|0;return +(+g[a+276>>2])}function HD(a){a=a|0;return +(+g[a+208>>2])}function ID(a){a=a|0;return gJ(c[a+192>>2]|0)|0}function JD(a){a=a|0;return gJ(c[a+204>>2]|0)|0}function KD(a){a=a|0;return gJ(c[a+24>>2]|0)|0}function LD(a){a=a|0;return gJ(c[a+68>>2]|0)|0}function MD(a){a=a|0;return +(+qw(a))}function ND(a,b){a=a|0;b=b|0;c[a+16>>2]=b;return}function OD(a,b){a=a|0;b=b|0;return c[a+8+(b<<2)>>2]|0}function PD(a,b){a=a|0;b=+b;g[a+72>>2]=b;return}function QD(a){a=+a;return (g[j>>2]=a,c[j>>2]|0)|0}function RD(a){a=+a;return +(+$A(!(a>=0.0)?-a:a)*2.0)}function SD(a,b){a=a|0;b=+b;g[a+96>>2]=b;return}function TD(a){a=a|0;if(!a)return;cJ(a);return}function UD(a){a=a|0;return +(+g[a+216>>2])}function VD(a){a=a|0;return gJ(c[a+540>>2]|0)|0}function WD(a){a=a|0;return gJ(c[a+116>>2]|0)|0}function XD(a,b){a=a|0;b=+b;RF(a,b);return}function YD(b){b=b|0;return (a[b+26>>0]&1)!=0|0}function ZD(b){b=b|0;return (a[b+84>>0]&1)!=0|0}function _D(a,b){a=a|0;b=+b;g[a+80>>2]=b;return}function $D(a){a=a|0;return +(+g[a+32>>2]*+g[a+16>>2])}function aE(a,b){a=a|0;b=b|0;return a+(b<<2)|0}function bE(a){a=a|0;return +(+g[a+248>>2])}function cE(a){a=a|0;return gJ(c[a+256>>2]|0)|0}function dE(a){a=a|0;return _H(a)|0}function eE(a,b){a=a|0;b=+b;g[a+52>>2]=b;return}function fE(a,b){a=a|0;b=+b;g[a+56>>2]=b;return}function gE(a,b){a=a|0;b=b|0;c[a+20>>2]=b;return}function hE(a,b,c){a=a|0;b=b|0;c=+c;return 0}function iE(a){a=a|0;return +(+g[a+204>>2])}function jE(a){a=a|0;kr(a);return}function kE(a,b){a=a|0;b=+b;lG(a,b);return}function lE(a,b){a=a|0;b=+b;mG(a,b);return}function mE(a,b){a=a|0;b=+b;MG(a,b);return}function nE(a){a=a|0;return gJ(c[a+264>>2]|0)|0}function oE(a){a=a|0;return c[a+36>>2]|0}function pE(a){a=a|0;return c[a+32>>2]|0}function qE(a){a=a|0;return gJ(c[a+56>>2]|0)|0}function rE(a,b){a=a|0;b=+b;g[a+68>>2]=b;return}function sE(a){a=a|0;return (c[a+52>>2]|0)+4|0}function tE(a){a=a|0;return gJ(c[a+20>>2]|0)|0}function uE(a){a=a|0;return +(+VI(+EF(a)))}function vE(a,b){a=a|0;b=b|0;return a+156+(b<<4)|0}function wE(a,b,c){a=a|0;b=b|0;c=+c;Jb[a&31](b|0,+c)}function xE(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;T(38)}function yE(a){a=a|0;return +(+g[(NI(a)|0)>>2])}function zE(a){a=a|0;return +(+g[(OI(a)|0)>>2])}function AE(a){a=a|0;return +(+g[(MI(a)|0)>>2])}function BE(a){a=a|0;return gI(a)|0}function CE(a){a=a|0;xB(a);return}function DE(a){a=a|0;return c[a+8>>2]|0}function EE(a,b){a=a|0;b=+b;g[a+64>>2]=b;return}function FE(a,b){a=a|0;b=+b;g[a+60>>2]=b;return}function GE(a,b){a=a|0;b=+b;g[a+44>>2]=b;return}function HE(a,b){a=a|0;b=+b;g[a+40>>2]=b;return}function IE(a,b){a=a|0;b=+b;g[a+36>>2]=b;return}function JE(a,b){a=a|0;b=+b;g[a+92>>2]=b;return}function KE(a){a=a|0;return c[a+216>>2]|0}function LE(a){a=a|0;return +(+g[a+244>>2])}function ME(a){a=a|0;return +(+g[a+240>>2])}function NE(a){a=a|0;return +(+EF(a))}function OE(a,b){a=a|0;b=b|0;return a+28+(b<<4)|0}function PE(a,b){a=a|0;b=+b;g[a+24>>2]=b;return}function QE(a,b){a=a|0;b=+b;g[a+20>>2]=b;return}function RE(a,b){a=a|0;b=+b;g[a+32>>2]=b;return}function SE(a,b){a=a|0;b=+b;g[a+28>>2]=b;return}function TE(a,b){a=a|0;b=b|0;c[a>>2]=b;return}function UE(a){a=a|0;return c[a+228>>2]|0}function VE(a){a=a|0;return gJ(c[a+128>>2]|0)|0}function WE(a){a=a|0;c[a+232>>2]=0;return}function XE(a,b,c){a=a|0;b=b|0;c=c|0;return}function YE(a,b){a=a|0;b=+b;g[a+76>>2]=b;return}function ZE(a){a=a|0;return +(+g[a+212>>2])}function _E(a){a=a|0;return +(+g[a+228>>2])}function $E(a){a=a|0;return a+56|0}function aF(a){a=a|0;return c[a+24>>2]|0}function bF(a,b){a=a|0;b=+b;g[a+16>>2]=b;return}function cF(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;T(35)}function dF(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=d|0;e=e|0;T(30)}function eF(a){a=a|0;return +(+g[a+252>>2])}function fF(a){a=a|0;return OI(a)|0}function gF(a){a=a|0;return +(+uE(a))}function hF(a){a=a|0;return c[a+4>>2]|0}function iF(){var a=0;a=c[7140]|0;c[7140]=a+0;return a|0}function jF(a){a=a|0;return (a&3|0)!=0|0}function kF(a,b){a=a|0;b=+b;g[a+48>>2]=b;return}function lF(a){a=a|0;return a+156|0}function mF(b){b=b|0;return (a[b+152>>0]&1)!=0|0}function nF(){var a=0;a=c[2475]|0;c[2475]=a+0;return a|0}function oF(a){a=a|0;return 644}function pF(a){a=a|0;pi(a);cJ(a);return}function qF(a){a=a|0;Ki(a);cJ(a);return}function rF(a){a=a|0;Oj(a);cJ(a);return}function sF(a){a=a|0;return +(+g[a+232>>2])}function tF(a){a=a|0;return +(+g[a+280>>2])}function uF(a){a=a|0;return +(+g[a+236>>2])}function vF(a){a=a|0;return a+100|0}function wF(a){a=a|0;return 348}function xF(a){a=a|0;return c[a+12>>2]|0}function yF(a){a=a|0;BF(a+56|0);return}function zF(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;T(15);return 0}function AF(a){a=a|0;cx(a);return}function BF(a){a=a|0;qC(a);return}function CF(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;T(5);return 0.0}function DF(a){a=a|0;return gJ(c[a+4>>2]|0)|0}function EF(a){a=a|0;return +(+Gp(a,a))}function FF(a){a=a|0;return +(+g[a+256>>2])}function GF(a){a=a|0;return +(+g[a>>2])}function HF(a){a=a|0;return (a|0)!=0|0}function IF(a,b){a=a|0;b=b|0;return xb[a&127](b|0)|0}function JF(a){a=a|0;return a+24|0}function KF(a){a=a|0;Ua(a|0)|0;Cq()}function LF(a){a=a|0;return c[a+1304>>2]|0}function MF(a,b){a=+a;b=+b;return !(a>b)|0}function NF(a){a=a|0;return a+64|0}function OF(a){a=a|0;return +(+g[a+72>>2])}function PF(a){a=a|0;return c[a+332>>2]|0}function QF(a){a=a|0;return (a&2|0)!=0|0}function RF(a,b){a=a|0;b=+b;g[a+12>>2]=b;return}function SF(a){a=a|0;return a+172|0}function TF(a){a=a|0;return c[a+84>>2]|0}function UF(a){a=a|0;return c[a+88>>2]|0}function VF(a){a=a|0;return c[a+92>>2]|0}function WF(a){a=a|0;return c[a+96>>2]|0}function XF(a){a=a|0;return 252}function YF(a,b,c,d){a=a|0;b=+b;c=c|0;d=+d;T(11);return 0}function ZF(a){a=a|0;return +(+g[(gJ(a)|0)>>2])}function _F(a){a=a|0;return a+52|0}function $F(a){a=a|0;return +(+g[a+80>>2])}function aG(a){a=a|0;return 28}function bG(a){a=a|0;return c[a+100>>2]|0}function cG(a){a=a|0;return c[a+72>>2]|0}function dG(a,b){a=a|0;b=b|0;return +nb[a&15](b|0)}function eG(a){a=a|0;return a+40|0}function fG(a){a=a|0;return c[a+16>>2]|0}function gG(a){a=a|0;return +(+g[a+52>>2])}function hG(a){a=a|0;return +(+g[a+56>>2])}function iG(a){a=a|0;return a+112|0}function jG(a){a=a|0;return 212}function kG(a){a=a|0;return (a&1|0)!=0|0}function lG(a,b){a=a|0;b=+b;g[a+8>>2]=b;return}function mG(a,b){a=a|0;b=+b;g[a+4>>2]=b;return}function nG(a){a=+a;return a<1.0|0}function oG(a,b){a=a|0;b=b|0;return 1}function pG(a){a=a|0;return a+344|0}function qG(a){a=a|0;NH(a);return}function rG(a){a=a|0;return +(+g[a+68>>2])}function sG(a){a=a|0;return c[a+300>>2]|0}function tG(a,b){a=a|0;b=b|0;l=a;m=b}function uG(a){a=a|0;return a+188|0}function vG(a){a=a|0;return c[a+20>>2]|0}function wG(a){a=a|0;return 204}function xG(a){a=a|0;return c[a+748>>2]|0}function yG(a,b){a=a|0;b=b|0;return}function zG(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;T(34)}function AG(a){a=a|0;return a+68|0}function BG(a){a=a|0;return a+36|0}function CG(a){a=a|0;return +(+g[a+64>>2])}function DG(a){a=a|0;return +(+g[a+60>>2])}function EG(a){a=a|0;return +(+g[a+44>>2])}function FG(a){a=a|0;return +(+g[a+40>>2])}function GG(a){a=a|0;return +(+g[a+36>>2])}function HG(a){a=a|0;return +(+g[a+48>>2])}function IG(a){a=a|0;return +(+g[a+92>>2])}function JG(a){a=a|0;return 220}function KG(a){a=a|0;return 264}function LG(a){a=a|0;return +(+g[a+76>>2])}function MG(a,b){a=a|0;b=+b;g[a>>2]=b;return}function NG(a){a=a|0;c[a>>2]=3028;return}function OG(a){a=a|0;c[a>>2]=8404;return}function PG(a){a=a|0;qG(a);return}function QG(a){a=a|0;return +(+g[a+24>>2])}function RG(a){a=a|0;return +(+g[a+4>>2])}function SG(a){a=a|0;return +(+g[a+20>>2])}function TG(a){a=a|0;return +(+g[a+32>>2])}function UG(a){a=a|0;return +(+g[a+16>>2])}function VG(a){a=a|0;return +(+g[a+12>>2])}function WG(a){a=a|0;return +(+g[a+28>>2])}function XG(a){a=a|0;return a+16|0}function YG(a){a=a|0;return 52}function ZG(a){a=a|0;return 68}function _G(a){a=a|0;return 84}function $G(a,b){a=a|0;b=b|0;return a+(b<<4)|0}function aH(a){a=a|0;return a+928|0}function bH(a){a=a|0;return +(+g[a+8>>2])}function cH(a){a=a|0;return a+316|0}function dH(a){a=a|0;return a+300|0}function eH(a,b){a=a|0;b=b|0;Ib[a&511](b|0)}function fH(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;T(32)}function gH(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;T(29)}function hH(a,b,c,d){a=a|0;b=+b;c=c|0;d=d|0;T(26)}function iH(a){a=a|0;return a+32|0}function jH(a){a=a|0;return 24}function kH(a){a=a|0;return a+848|0}function lH(a){a=a|0;return c[a>>2]|0}function mH(a,b){a=a|0;b=b|0;return nv(a,b)|0}function nH(a){a=a|0;Ey(a);return}function oH(a){a=a|0;cJ(a+-4|0);return}function pH(a){a=a|0;ni(a);return}function qH(a){a=a|0;return gJ(a)|0}function rH(a){a=a|0;return a+768|0}function sH(a){a=a|0;return a+788|0}function tH(a){a=a|0;return a+808|0}function uH(a){a=a|0;return a+104|0}function vH(a){a=a|0;return 496}function wH(a,b,c){a=a|0;b=b|0;c=c|0;T(14);return 0}function xH(a){a=a|0;return 32}function yH(a){a=a|0;return a+80|0}function zH(a){a=a|0;return a+388|0}function AH(a){a=a|0;return 60}function BH(a){a=a|0;return 436}function CH(a){a=a|0;c[a>>2]=3104;return}function DH(a,b,c){a=a|0;b=b|0;c=c|0;T(3);return 0.0}function EH(a){a=a|0;return a+348|0}function FH(){return Ds(1)|0}function GH(a){a=+a;return +(+$A(a)*2.0)}function HH(a){a=a|0;return a+372|0}function IH(a){a=a|0;c[a>>2]=4652;return}function JH(a){a=a|0;return (a&255)<<8|a>>8&255|0}function KH(a,b,c){a=a|0;b=b|0;c=+c;T(13);return 0}function LH(a){a=a|0;return 11398}function MH(a){a=a|0;return a+92|0}function NH(a){a=a|0;c[a>>2]=0;return}function OH(a){a=a|0;return a+88|0}function PH(a){a=a|0;return 4}function QH(a){a=a|0;return a+20|0}function RH(a){a=a|0;return 17723}function SH(a){a=a|0;return 17439}function TH(a){a=a|0;c[a>>2]=3080;return}function UH(){return Pt()|0}function VH(a){a=a|0;return 11336}function WH(a,b){a=a|0;b=+b;return}function XH(a){a=a|0;return a+76|0}function YH(a){a=a|0;return a+28|0}function ZH(a){a=a|0;return 16585}function _H(a){a=a|0;return a+440|0}function $H(a){a=+a;return +(+mh(a,6.2831854820251465))}function aI(a){a=a|0;return a+72|0}function bI(a,b,c){a=a|0;b=b|0;c=c|0;T(31)}function cI(a){a=a|0;return 16969}function dI(a,b){a=+a;b=b|0;return +(+Em(a,b))}function eI(){return Ds(64)|0}function fI(a){a=a|0;return 17027}function gI(a){a=a|0;return a+48|0}function hI(){c[176]=o}function iI(a){a=a|0;return 17225}function jI(a){a=a|0;return 1}function kI(a,b,c){a=a|0;b=b|0;c=+c;T(28)}function lI(a,b,c){a=a|0;b=+b;c=c|0;T(25)}function mI(a){a=a|0;return 17840}function nI(a){a=a|0;return 17811}function oI(a){a=a|0;return 3}function pI(a){a=a|0;return Gm(a,28524)|0}function qI(a){a=a|0;return 11665}function rI(a){a=+a;return +a}function sI(a){a=a|0;return 17783}function tI(a){a=a|0;return 16300}function uI(a){a=a|0;return 17383}function vI(a){a=a|0;return 17356}function wI(a){a=a|0;return 17326}function xI(a){a=a|0;return 8}function yI(a,b,c){a=a|0;b=+b;c=+c;T(23)}function zI(a){a=a|0;return 16404}function AI(a,b){a=a|0;b=b|0;T(12);return 0}function BI(a){a=a|0;return 16362}function CI(a){a=a|0;return 16383}function DI(a){a=a|0;return 6}function EI(a){a=a|0;return 12}function FI(){return 4}function GI(a){a=a|0;return 16343}function HI(a){a=a|0;return 0}function II(a){a=a|0;return 2}function JI(a){a=a|0;return 17498}function KI(a,b){a=a|0;b=+b;T(1);return 0.0}function LI(){c[5628]=1805;c[5629]=0;return}function MI(a){a=a|0;return a+12|0}function NI(a){a=a|0;return a+8|0}function OI(a){a=a|0;return a+4|0}function PI(a){a=a|0;Hb[a&3]()}function QI(){return 2}function RI(){return 1}function SI(){return 5}function TI(){return 3}function UI(){Wa()}function VI(a){a=+a;return +(+D(+a))}function WI(a){a=+a;return +(+G(+a))}function XI(a){a=+a;return +(+F(+a))}function YI(a,b){a=a|0;b=b|0;T(27)}function ZI(a){a=a|0;return}function _I(a,b){a=a|0;b=+b;T(22)}function $I(a){a=a|0;return Ds(a)|0}function aJ(a){a=a|0;cJ(a);return}function bJ(a){a=a|0;l=a}function cJ(a){a=a|0;Cd(a);return}function dJ(a){a=a|0;A=a}function eJ(a){a=a|0;T(10);return 0}function fJ(a){a=a|0;T(0);return 0.0}function gJ(a){a=a|0;return a|0}function hJ(){return A|0}function iJ(){return l|0}function jJ(a){a=a|0;T(21)}function kJ(){return 0}function lJ(){T(20)} +function dc(d,f){d=d|0;f=f|0;var h=0,i=0,k=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0.0,E=0.0,F=0.0,G=0,H=0.0,I=0,J=0,K=0,L=0.0,M=0,N=0,O=0.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.0,ja=0.0,ka=0,la=0;ha=l;l=l+192|0;i=c[d+56>>2]|0;if(i|0?(Ib[c[c[i>>2]>>2]&511](i),h=c[d+56>>2]|0,h|0):0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[6995]=(c[6995]|0)+1;h=sc(151)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}c[h>>2]=9696;a[h+20>>0]=1;c[h+16>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;a[h+40>>0]=1;c[h+36>>2]=0;c[h+28>>2]=0;c[h+32>>2]=0;a[h+60>>0]=1;c[h+56>>2]=0;c[h+48>>2]=0;c[h+52>>2]=0;c[d+56>>2]=h;n=0;o=0;ga=0;K=0;h=0;while(1){if((n|0)>=(xb[c[(c[d>>2]|0)+96>>2]&127](d)|0))break;do if((K|0)==(o|0)){i=o|0?o<<1:1;if((o|0)<(i|0)){if((i|0)!=0?(c[6995]=(c[6995]|0)+1,p=sc((i<<4|3)+16|0)|0,(p|0)!=0):0){c[(p+4+15&-16)+-4>>2]=p;k=p+4+15&-16}else k=0;if((o|0)<=0){if(!ga){m=k;h=k;k=o;break}}else{h=0;do{fa=k+(h<<4)|0;ea=ga+(h<<4)|0;c[fa>>2]=c[ea>>2];c[fa+4>>2]=c[ea+4>>2];c[fa+8>>2]=c[ea+8>>2];c[fa+12>>2]=c[ea+12>>2];h=h+1|0}while((h|0)!=(o|0))}c[6996]=(c[6996]|0)+1;Cd(c[ga+-4>>2]|0);m=k;h=k;k=o}else{i=o;m=ga;k=o}}else{i=o;m=ga;k=K}while(0);o=m+(K<<4)|0;c[o>>2]=c[ha+136>>2];c[o+4>>2]=c[ha+136+4>>2];c[o+8>>2]=c[ha+136+8>>2];c[o+12>>2]=c[ha+136+12>>2];Sb[c[(c[d>>2]|0)+108>>2]&127](d,n,o);n=n+1|0;o=i;ga=m;K=k+1|0}a[ha+76+16>>0]=1;fa=ha+76+12|0;c[fa>>2]=0;c[ha+76+4>>2]=0;c[ha+76+8>>2]=0;a[ha+76+36>>0]=1;ea=ha+76+32|0;c[ea>>2]=0;c[ha+76+24>>2]=0;c[ha+76+28>>2]=0;a[ha+76+56>>0]=1;da=ha+76+52|0;c[da>>2]=0;c[ha+76+44>>2]=0;c[ha+76+48>>2]=0;if(f){if((K|0)>0){J=0;i=0;k=0;m=0;while(1){h=J;J=J+1|0;if((J|0)<(K|0)){G=ga+(h<<4)|0;I=ga+(h<<4)+4|0;A=ga+(h<<4)+8|0;z=J;h=m;do{m=z;z=z+1|0;if((z|0)<(K|0)){x=ga+(m<<4)|0;y=ga+(m<<4)+4|0;w=ga+(m<<4)+8|0;f=z;do{F=+g[G>>2];v=+g[x>>2]-F;H=+g[I>>2];B=+g[y>>2]-H;L=+g[A>>2];E=+g[w>>2]-L;F=+g[ga+(f<<4)>>2]-F;H=+g[ga+(f<<4)+4>>2]-H;L=+g[ga+(f<<4)+8>>2]-L;q=1.0;p=0;while(1){t=(B*L-E*H)*q;u=(E*F-v*L)*q;r=(v*H-B*F)*q;a:do if(r*r+(t*t+u*u)>9.999999747378752e-05){s=1.0/+D(+(r*r+(t*t+u*u)));if((h|0)>0){m=0;do{if(t*s*+g[k+(m<<4)>>2]+u*s*+g[k+(m<<4)+4>>2]+r*s*+g[k+(m<<4)+8>>2]>.9990000128746033)break a;m=m+1|0}while((m|0)<(h|0))}q=t*s*+g[G>>2]+u*s*+g[I>>2]+r*s*+g[A>>2];m=0;do{if(t*s*+g[ga+(m<<4)>>2]+u*s*+g[ga+(m<<4)+4>>2]+r*s*+g[ga+(m<<4)+8>>2]-q+-.009999999776482582>0.0)break a;m=m+1|0}while((m|0)<(K|0));do if((h|0)==(i|0)){o=i|0?i<<1:1;if((i|0)<(o|0)){do if(!o)n=0;else{c[6995]=(c[6995]|0)+1;m=sc((o<<4|3)+16|0)|0;if(!m){n=0;break}c[(m+4+15&-16)+-4>>2]=m;n=m+4+15&-16}while(0);if((i|0)<=0){if(!k){m=o;k=n;break}}else{m=0;do{aa=n+(m<<4)|0;$=k+(m<<4)|0;c[aa>>2]=c[$>>2];c[aa+4>>2]=c[$+4>>2];c[aa+8>>2]=c[$+8>>2];c[aa+12>>2]=c[$+12>>2];m=m+1|0}while((m|0)!=(i|0))}c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);m=o;k=n}else m=i}else{m=i;i=h}while(0);g[k+(i<<4)>>2]=t*s;g[k+(i<<4)+4>>2]=u*s;g[k+(i<<4)+8>>2]=r*s;g[k+(i<<4)+12>>2]=-q;i=m;h=h+1|0}while(0);p=p+1|0;if((p|0)==2)break;else q=-1.0}f=f+1|0}while((f|0)!=(K|0))}}while((z|0)!=(K|0))}else h=m;if((J|0)==(K|0)){f=h;break}else m=h}if((f|0)>0){h=0;o=0;p=0;while(1){aa=k+(p<<4)|0;c[ha+136>>2]=c[aa>>2];c[ha+136+4>>2]=c[aa+4>>2];c[ha+136+8>>2]=c[aa+8>>2];q=+g[k+(p<<4)+12>>2];q=q-+nb[c[(c[d>>2]|0)+48>>2]&15](d);do if((p|0)==(h|0)){n=h|0?h<<1:1;if((h|0)<(n|0)){if((n|0)!=0?(c[6995]=(c[6995]|0)+1,M=sc((n<<4|3)+16|0)|0,(M|0)!=0):0){c[(M+4+15&-16)+-4>>2]=M;m=M+4+15&-16}else m=0;if((h|0)<=0){if(!o)break}else{i=0;do{aa=m+(i<<4)|0;$=o+(i<<4)|0;c[aa>>2]=c[$>>2];c[aa+4>>2]=c[$+4>>2];c[aa+8>>2]=c[$+8>>2];c[aa+12>>2]=c[$+12>>2];i=i+1|0}while((i|0)!=(h|0))}c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0)}else{n=h;m=o}}else{n=h;m=o;h=p}while(0);aa=m+(h<<4)|0;c[aa>>2]=c[ha+136>>2];c[aa+4>>2]=c[ha+136+4>>2];c[aa+8>>2]=c[ha+136+8>>2];g[m+(h<<4)+12>>2]=q;p=p+1|0;if((p|0)<(f|0)){h=n;o=m}else break}if((p|0)>0){G=0;o=0;n=0;i=0;h=0;do{z=G;G=G+1|0;if((G|0)<(p|0)){A=G;do{y=A;A=A+1|0;if((A|0)<(p|0)){x=A;do{t=+g[m+(y<<4)+4>>2];q=+g[m+(x<<4)+8>>2];r=+g[m+(y<<4)+8>>2];u=+g[m+(x<<4)+4>>2];v=+g[m+(x<<4)>>2];B=+g[m+(y<<4)>>2];s=+g[m+(z<<4)+8>>2];E=+g[m+(z<<4)+4>>2];F=+g[m+(z<<4)>>2];b:do if((((u*B-t*v)*(u*B-t*v)+((t*q-r*u)*(t*q-r*u)+(r*v-q*B)*(r*v-q*B))>9.999999747378752e-05?(v*E-u*F)*(v*E-u*F)+((u*s-q*E)*(u*s-q*E)+(q*F-v*s)*(q*F-v*s))>9.999999747378752e-05:0)?(t*F-B*E)*(t*F-B*E)+((r*E-t*s)*(r*E-t*s)+(B*s-r*F)*(B*s-r*F))>9.999999747378752e-05:0)?(O=s*(u*B-t*v)+(E*(r*v-q*B)+(t*q-r*u)*F),+C(+O)>9.999999974752427e-07):0){ia=+g[m+(z<<4)+12>>2];L=+g[m+(y<<4)+12>>2];ja=+g[m+(x<<4)+12>>2];H=-1.0/O*((r*E-t*s)*ja+((t*q-r*u)*ia+(u*s-q*E)*L));r=-1.0/O*((B*s-r*F)*ja+((r*v-q*B)*ia+(q*F-v*s)*L));q=-1.0/O*((t*F-B*E)*ja+((u*B-t*v)*ia+(v*E-u*F)*L));f=0;do{if(+g[m+(f<<4)+12>>2]+(H*+g[m+(f<<4)>>2]+r*+g[m+(f<<4)+4>>2]+q*+g[m+(f<<4)+8>>2])+-.009999999776482582>0.0)break b;f=f+1|0}while((f|0)<(p|0));do if((i|0)==(o|0)){w=o|0?o<<1:1;if((o|0)>=(w|0)){w=o;break}do if(!w)f=0;else{c[6995]=(c[6995]|0)+1;h=sc((w<<4|3)+16|0)|0;if(!h){f=0;break}c[(h+4+15&-16)+-4>>2]=h;f=h+4+15&-16}while(0);if((o|0)<=0){if(!n){n=f;h=f;break}}else{h=0;do{aa=f+(h<<4)|0;$=n+(h<<4)|0;c[aa>>2]=c[$>>2];c[aa+4>>2]=c[$+4>>2];c[aa+8>>2]=c[$+8>>2];c[aa+12>>2]=c[$+12>>2];h=h+1|0}while((h|0)!=(o|0))}c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0);n=f;h=f}else{w=o;o=i}while(0);g[n+(o<<4)>>2]=H;g[n+(o<<4)+4>>2]=r;g[n+(o<<4)+8>>2]=q;g[n+(o<<4)+12>>2]=0.0;o=w;i=i+1|0}while(0);x=x+1|0}while((x|0)!=(p|0))}}while((A|0)!=(p|0))}}while((G|0)!=(p|0))}else{n=0;i=0;h=0}}else{n=0;m=0;i=0;h=0}}else{n=0;m=0;k=0;i=0;h=0}uc(ha+76|0,h,i);if(n|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}if(m|0){c[6996]=(c[6996]|0)+1;Cd(c[m+-4>>2]|0)}if(k|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}}else uc(ha+76|0,h,K);I=c[ha+76+44>>2]|0;if((I|0)>0){c[6995]=(c[6995]|0)+1;h=sc((I<<4|3)+16|0)|0;if(!h)i=0;else{c[(h+4+15&-16)+-4>>2]=h;i=h+4+15&-16}h=0;do{aa=i+(h<<4)|0;c[aa>>2]=c[ha+136>>2];c[aa+4>>2]=c[ha+136+4>>2];c[aa+8>>2]=c[ha+136+8>>2];c[aa+12>>2]=c[ha+136+12>>2];h=h+1|0}while((h|0)!=(I|0));aa=i;_=i}else{aa=0;_=0}a[ha+56+16>>0]=1;$=ha+56+12|0;c[$>>2]=0;Z=ha+56+4|0;c[Z>>2]=0;c[ha+56+8>>2]=0;k=ha+136|0;n=k+19|0;do{a[k>>0]=0;k=k+1|0}while((k|0)<(n|0));if((I|0)<0)gb();if(I|0){Of(ha+56|0,I);i=c[$>>2]|0;h=0;do{a[i+(h*36|0)+16>>0]=1;k=i+(h*36|0)+4|0;c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;k=i+(h*36|0)+20|0;m=ha+136+3|0;n=k+16|0;do{a[k>>0]=a[m>>0]|0;k=k+1|0;m=m+1|0}while((k|0)<(n|0));h=h+1|0}while((h|0)!=(I|0))}c[Z>>2]=I;o=c[ha+76+4>>2]|0;n=c[d+56>>2]|0;m=c[n+8>>2]|0;if((m|0)<(o|0)){if((c[n+12>>2]|0)<(o|0)){if(!o){h=0;k=m}else{c[6995]=(c[6995]|0)+1;h=sc((o<<4|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}k=c[n+8>>2]|0}if((k|0)>0){i=0;do{Y=h+(i<<4)|0;X=(c[n+16>>2]|0)+(i<<4)|0;c[Y>>2]=c[X>>2];c[Y+4>>2]=c[X+4>>2];c[Y+8>>2]=c[X+8>>2];c[Y+12>>2]=c[X+12>>2];i=i+1|0}while((i|0)!=(k|0))}i=c[n+16>>2]|0;if(i|0){if(a[n+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[n+16>>2]=0}a[n+20>>0]=1;c[n+16>>2]=h;c[n+12>>2]=o;i=n+16|0}else i=n+16|0;h=m;do{Y=(c[i>>2]|0)+(h<<4)|0;c[Y>>2]=c[ha+136>>2];c[Y+4>>2]=c[ha+136+4>>2];c[Y+8>>2]=c[ha+136+8>>2];c[Y+12>>2]=c[ha+136+12>>2];h=h+1|0}while((h|0)!=(o|0))}c[n+8>>2]=o;if((o|0)>0){h=0;do{X=(c[fa>>2]|0)+(h<<4)|0;Y=(c[(c[d+56>>2]|0)+16>>2]|0)+(h<<4)|0;c[Y>>2]=c[X>>2];c[Y+4>>2]=c[X+4>>2];c[Y+8>>2]=c[X+8>>2];c[Y+12>>2]=c[X+12>>2];h=h+1|0}while((h|0)!=(o|0))}if((I|0)>0){G=0;do{z=(c[ea>>2]|0)+((c[(c[da>>2]|0)+(G<<2)>>2]|0)*12|0)|0;y=z;h=0;do{A=y+4|0;x=c[y+((c[A>>2]|0)*12|0)+8>>2]|0;f=c[$>>2]|0;w=f+(G*36|0)+4|0;i=c[w>>2]|0;p=f+(G*36|0)+8|0;if((i|0)==(c[p>>2]|0)?(N=i|0?i<<1:1,(i|0)<(N|0)):0){if(!N)o=0;else{c[6995]=(c[6995]|0)+1;i=sc((N<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}o=i;i=c[w>>2]|0}n=f+(G*36|0)+12|0;m=c[n>>2]|0;if((i|0)<=0)if(!m)k=f+(G*36|0)+16|0;else ba=132;else{k=0;do{c[o+(k<<2)>>2]=c[m+(k<<2)>>2];k=k+1|0}while((k|0)!=(i|0));ba=132}if((ba|0)==132){ba=0;i=f+(G*36|0)+16|0;if(a[i>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[m+-4>>2]|0)}c[n>>2]=0;k=i;i=c[w>>2]|0}a[k>>0]=1;c[n>>2]=o;c[p>>2]=N}c[(c[f+(G*36|0)+12>>2]|0)+(i<<2)>>2]=x;c[w>>2]=(c[w>>2]|0)+1;X=c[y+8>>2]|0;Y=c[fa>>2]|0;s=+g[Y+(X<<4)>>2]-+g[Y+(x<<4)>>2];t=+g[Y+(X<<4)+4>>2]-+g[Y+(x<<4)+4>>2];q=+g[Y+(X<<4)+8>>2]-+g[Y+(x<<4)+8>>2];r=1.0/+D(+(s*s+t*t+q*q));if((h|0)<2){g[ha+136+(h<<4)>>2]=s*r;g[ha+136+(h<<4)+4>>2]=t*r;g[ha+136+(h<<4)+8>>2]=q*r;g[ha+136+(h<<4)+12>>2]=0.0;h=h+1|0}Y=y+((c[A>>2]|0)*12|0)|0;y=Y+((c[Y>>2]|0)*12|0)|0}while((y|0)!=(z|0));if((h|0)==2){H=+g[ha+136+4>>2];L=+g[ha+136+24>>2];O=+g[ha+136+8>>2];ia=+g[ha+136+20>>2];F=+g[ha+136+16>>2];E=+g[ha+136>>2];X=aa+(G<<4)+4|0;Y=aa+(G<<4)+8|0;g[aa+(G<<4)+12>>2]=0.0;ja=1.0/+D(+((H*L-O*ia)*(H*L-O*ia)+(O*F-L*E)*(O*F-L*E)+(ia*E-H*F)*(ia*E-H*F)));g[aa+(G<<4)>>2]=(H*L-O*ia)*ja;g[X>>2]=(O*F-L*E)*ja;g[Y>>2]=(ia*E-H*F)*ja;n=c[$>>2]|0;g[n+(G*36|0)+20>>2]=(H*L-O*ia)*ja;c[n+(G*36|0)+24>>2]=c[X>>2];c[n+(G*36|0)+28>>2]=c[Y>>2];g[n+(G*36|0)+32>>2]=1000000015047466219876688.0e6}else{n=aa+(G<<4)|0;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;n=c[$>>2]|0}k=c[n+(G*36|0)+4>>2]|0;if((k|0)>0){m=c[(c[d+56>>2]|0)+16>>2]|0;r=+g[aa+(G<<4)>>2];s=+g[aa+(G<<4)+4>>2];t=+g[aa+(G<<4)+8>>2];i=c[n+(G*36|0)+12>>2]|0;h=0;q=1000000015047466219876688.0e6;do{Y=c[i+(h<<2)>>2]|0;ja=+g[m+(Y<<4)>>2]*r+ +g[m+(Y<<4)+4>>2]*s+ +g[m+(Y<<4)+8>>2]*t;q=q>ja?ja:q;h=h+1|0}while((h|0)!=(k|0))}else q=1000000015047466219876688.0e6;g[n+(G*36|0)+32>>2]=-q;G=G+1|0}while((G|0)!=(I|0))}if((c[Z>>2]|0)>0){i=0;m=0;k=0;n=0;o=0;while(1){do if((o|0)==(i|0)){i=o|0?o<<1:1;if((o|0)<(i|0)){if((i|0)!=0?(c[6995]=(c[6995]|0)+1,P=sc((i<<2|3)+16|0)|0,(P|0)!=0):0){c[(P+4+15&-16)+-4>>2]=P;k=P+4+15&-16}else k=0;if((o|0)>0){h=0;do{c[k+(h<<2)>>2]=c[m+(h<<2)>>2];h=h+1|0}while((h|0)!=(o|0));if(!n){m=k;Y=k;h=k;break}}else if((m|0)==0|(n|0)==0){m=k;Y=k;h=k;break}c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0);m=k;Y=k;h=k}else{i=o;Y=k;h=n}}else{Y=k;h=n}while(0);c[m+(o<<2)>>2]=o;o=o+1|0;if((o|0)>=(c[Z>>2]|0))break;else{k=Y;n=h}}M=ha+36+12|0;N=ha+36+4|0;P=ha+136+12|0;k=o;do{w=k+-1|0;i=c[m+(w<<2)>>2]|0;c[6995]=(c[6995]|0)+1;h=sc(23)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}c[h>>2]=i;X=c[$>>2]|0;r=+g[X+(i*36|0)+20>>2];s=+g[X+(i*36|0)+24>>2];q=+g[X+(i*36|0)+28>>2];c:do if((k|0)>1){o=w;i=h;f=h;n=1;p=h;h=1;y=w;while(1){z=h;while(1){h=c[$>>2]|0;x=o;do{X=x;x=x+-1|0;if((X|0)<=0){K=i;J=p;I=z;k=y;break c}w=c[m+(x<<2)>>2]|0}while(!(r*+g[h+(w*36|0)+20>>2]+s*+g[h+(w*36|0)+24>>2]+q*+g[h+(w*36|0)+28>>2]>.9990000128746033));do if((z|0)==(n|0)){k=z|0?z<<1:1;if((z|0)<(k|0)){do if(!k)o=0;else{c[6995]=(c[6995]|0)+1;h=sc((k<<2|3)+16|0)|0;if(!h){o=0;break}c[(h+4+15&-16)+-4>>2]=h;o=h+4+15&-16}while(0);if((z|0)>0){h=0;do{c[o+(h<<2)>>2]=c[p+(h<<2)>>2];h=h+1|0}while((h|0)!=(z|0));if(!f){n=k;p=o;i=o;f=o;break}}else if((p|0)==0|(f|0)==0){n=k;p=o;i=o;f=o;break}c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);n=k;p=o;i=o;f=o}else n=z}while(0);c[p+(z<<2)>>2]=w;z=z+1|0;h=0;while(1){if((c[m+(h<<2)>>2]|0)==(w|0))break;h=h+1|0;if((h|0)>=(y|0)){h=y;break}}if((y|0)>(h|0))break;else o=x}V=m+(h<<2)|0;W=c[V>>2]|0;k=y+-1|0;X=m+(k<<2)|0;c[V>>2]=c[X>>2];c[X>>2]=W;if((y|0)>1){o=x;h=z;y=k}else{o=x;h=z;ba=162;break}}}else{o=w;i=h;f=h;n=1;p=h;h=1;k=w;ba=162}while(0);d:do if((ba|0)==162){ba=0;y=h;while(1){h=c[$>>2]|0;w=o;do{X=w;w=w+-1|0;if((X|0)<=0){K=i;J=p;I=y;break d}x=c[m+(w<<2)>>2]|0}while(!(r*+g[h+(x*36|0)+20>>2]+s*+g[h+(x*36|0)+24>>2]+q*+g[h+(x*36|0)+28>>2]>.9990000128746033));do if((y|0)==(n|0)){n=y|0?y<<1:1;if((y|0)<(n|0)){do if(!n)o=0;else{c[6995]=(c[6995]|0)+1;h=sc((n<<2|3)+16|0)|0;if(!h){o=0;break}c[(h+4+15&-16)+-4>>2]=h;o=h+4+15&-16}while(0);if((y|0)>0){h=0;do{c[o+(h<<2)>>2]=c[p+(h<<2)>>2];h=h+1|0}while((h|0)!=(y|0));if(!f){p=o;i=o;h=o;break}}else if((p|0)==0|(f|0)==0){p=o;i=o;h=o;break}c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);p=o;i=o;h=o}else{n=y;h=f}}else h=f;while(0);c[p+(y<<2)>>2]=x;o=w;f=h;y=y+1|0}}while(0);if((I|0)>1){a[ha+36+16>>0]=1;c[M>>2]=0;c[N>>2]=0;c[ha+36+8>>2]=0;z=0;q=0.0;r=0.0;s=0.0;n=0;do{i=c[J+(z<<2)>>2]|0;q=+g[h+(i*36|0)+20>>2]+q;r=+g[h+(i*36|0)+24>>2]+r;s=+g[h+(i*36|0)+28>>2]+s;y=h+(i*36|0)+4|0;if((c[y>>2]|0)>0){x=h+(i*36|0)+12|0;w=0;h=n;while(1){f=c[(c[x>>2]|0)+(w<<2)>>2]|0;X=(c[(c[d+56>>2]|0)+16>>2]|0)+(f<<4)|0;c[ha+136>>2]=c[X>>2];c[ha+136+4>>2]=c[X+4>>2];c[ha+136+8>>2]=c[X+8>>2];c[ha+136+12>>2]=c[X+12>>2];e:do if((h|0)>0){n=c[M>>2]|0;i=0;while(1){if((c[n+(i*24|0)+20>>2]|0)==(f|0))break e;i=i+1|0;if((i|0)>=(h|0)){ba=261;break}}}else ba=261;while(0);if((ba|0)==261){ba=0;c[ha>>2]=c[ha+136>>2];c[ha+4>>2]=c[ha+136+4>>2];c[ha+8>>2]=c[ha+136+8>>2];c[ha+12>>2]=c[ha+136+12>>2];do if((h|0)==(c[ha+36+8>>2]|0)){p=h|0?h<<1:1;if((h|0)>=(p|0))break;if(!p)o=0;else{c[6995]=(c[6995]|0)+1;h=sc((p*24|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}o=h;h=c[N>>2]|0}n=c[M>>2]|0;if((h|0)<=0){if(n)ba=270}else{i=0;do{ba=o+(i*24|0)|0;X=n+(i*24|0)|0;c[ba>>2]=c[X>>2];c[ba+4>>2]=c[X+4>>2];c[ba+8>>2]=c[X+8>>2];c[ba+12>>2]=c[X+12>>2];c[ba+16>>2]=c[X+16>>2];c[ba+20>>2]=c[X+20>>2];i=i+1|0}while((i|0)!=(h|0));ba=270}if((ba|0)==270){ba=0;if(a[ha+36+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0);h=c[N>>2]|0}c[M>>2]=0}a[ha+36+16>>0]=1;c[M>>2]=o;c[ha+36+8>>2]=p}while(0);X=c[M>>2]|0;W=X+(h*24|0)|0;c[W>>2]=c[ha>>2];c[W+4>>2]=c[ha+4>>2];c[W+8>>2]=c[ha+8>>2];c[W+12>>2]=c[ha+12>>2];c[W+16>>2]=c[ha+16>>2];c[X+(h*24|0)+20>>2]=f;h=(c[N>>2]|0)+1|0;c[N>>2]=h}w=w+1|0;if((w|0)>=(c[y>>2]|0)){n=h;break}}}z=z+1|0;h=c[$>>2]|0}while((z|0)!=(I|0));a[ha+16>>0]=1;c[ha+12>>2]=0;c[ha+4>>2]=0;c[ha+8>>2]=0;X=c[J>>2]|0;c[ha+20>>2]=c[h+(X*36|0)+20>>2];c[ha+24>>2]=c[h+(X*36|0)+24>>2];c[ha+28>>2]=c[h+(X*36|0)+28>>2];c[ha+32>>2]=c[h+(X*36|0)+32>>2];H=1.0/+D(+(q*q+r*r+s*s));O=q*H;L=r*H;H=s*H;if(+C(+H)>.7071067690849304){F=1.0/+D(+(H*H+L*L));t=O*-(H*F);u=(H*H+L*L)*F;v=0.0;B=L*F;E=-(O*L*F);F=-(H*F)}else{F=1.0/+D(+(O*O+L*L));t=(O*O+L*L)*F;u=-(H*O*F);v=-(L*F);B=0.0;E=H*-(L*F);F=O*F}if((n|0)<2)if((n|0)==1){n=0;o=0;f=0;i=1;while(1){w=c[M>>2]|0;do if((n|0)==(o|0)){p=o|0?o<<1:1;if((o|0)>=(p|0)){p=o;h=f;break}do if(!p)h=0;else{c[6995]=(c[6995]|0)+1;h=sc((p*24|3)+16|0)|0;if(!h){h=0;o=n;break}c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16;o=n}while(0);if((o|0)<=0){if(f|0)ba=212}else{i=0;do{ba=h+(i*24|0)|0;X=f+(i*24|0)|0;c[ba>>2]=c[X>>2];c[ba+4>>2]=c[X+4>>2];c[ba+8>>2]=c[X+8>>2];c[ba+12>>2]=c[X+12>>2];c[ba+16>>2]=c[X+16>>2];c[ba+20>>2]=c[X+20>>2];i=i+1|0}while((i|0)!=(o|0));ba=212}if((ba|0)==212){ba=0;c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}o=n;i=c[N>>2]|0}else{p=o;h=f;o=n}while(0);X=h+(o*24|0)|0;c[X>>2]=c[w>>2];c[X+4>>2]=c[w+4>>2];c[X+8>>2]=c[w+8>>2];c[X+12>>2]=c[w+12>>2];c[X+16>>2]=c[w+16>>2];c[X+20>>2]=c[w+20>>2];n=n+1|0;if((n|0)<(i|0)){o=p;f=h}else{ba=276;break}}}else{h=0;ba=315}else{o=c[M>>2]|0;i=0;h=n;do{if(v*+g[o+(i*24|0)>>2]+F*+g[o+(i*24|0)+4>>2]+B*+g[o+(i*24|0)+8>>2]>2]+F*+g[o+4>>2]+B*+g[o+8>>2]){c[ha+136>>2]=c[o>>2];c[ha+136+4>>2]=c[o+4>>2];c[ha+136+8>>2]=c[o+8>>2];c[ha+136+12>>2]=c[o+12>>2];c[ha+136+16>>2]=c[o+16>>2];c[ha+136+20>>2]=c[o+20>>2];h=o+(i*24|0)|0;c[o>>2]=c[h>>2];c[o+4>>2]=c[h+4>>2];c[o+8>>2]=c[h+8>>2];c[o+12>>2]=c[h+12>>2];c[o+16>>2]=c[h+16>>2];c[o+20>>2]=c[h+20>>2];h=o+(i*24|0)|0;c[h>>2]=c[ha+136>>2];c[h+4>>2]=c[ha+136+4>>2];c[h+8>>2]=c[ha+136+8>>2];c[h+12>>2]=c[ha+136+12>>2];c[h+16>>2]=c[ha+136+16>>2];c[h+20>>2]=c[ha+136+20>>2];h=n}i=i+1|0}while((i|0)<(h|0));g[o+16>>2]=-1000000015047466219876688.0e6;if((h|0)>1){s=+g[o+4>>2];i=1;do{ia=+g[o+(i*24|0)>>2]-+g[o>>2];ja=+g[o+(i*24|0)+4>>2]-s;r=+g[o+(i*24|0)+8>>2]-+g[o+8>>2];q=u*ia+E*ja+t*r;r=v*ia+F*ja+B*r;if(q*q+r*r<1.1920928955078125e-07)q=0.0;else{ja=+C(+q);ja=(!(r>=0.0)?2.356194496154785:.7853981852531433)-(!(r>=0.0)?r+ja:r-ja)/(!(r>=0.0)?ja-r:r+ja)*.7853981852531433;q=q<0.0?-ja:ja}g[o+(i*24|0)+16>>2]=q;i=i+1|0}while((i|0)!=(h|0))}c[ha+136>>2]=c[o>>2];c[ha+136+4>>2]=c[o+4>>2];c[ha+136+8>>2]=c[o+8>>2];c[ha+136+12>>2]=c[o+12>>2];rf(ha+36|0,ha+136|0,1,h+-1|0);i=c[M>>2]|0;c[6995]=(c[6995]|0)+1;h=sc(43)|0;if(!h)n=0;else{c[(h+4+15&-16)+-4>>2]=h;n=h+4+15&-16}o=c[M>>2]|0;c[n>>2]=c[i>>2];c[n+4>>2]=c[i+4>>2];c[n+8>>2]=c[i+8>>2];c[n+12>>2]=c[i+12>>2];c[n+16>>2]=c[i+16>>2];c[n+20>>2]=c[i+20>>2];c[6995]=(c[6995]|0)+1;h=sc(67)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}c[h>>2]=c[n>>2];c[h+4>>2]=c[n+4>>2];c[h+8>>2]=c[n+8>>2];c[h+12>>2]=c[n+12>>2];c[h+16>>2]=c[n+16>>2];c[h+20>>2]=c[n+20>>2];if(n|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}ba=h+24|0;c[ba>>2]=c[o+24>>2];c[ba+4>>2]=c[o+24+4>>2];c[ba+8>>2]=c[o+24+8>>2];c[ba+12>>2]=c[o+24+12>>2];c[ba+16>>2]=c[o+24+16>>2];c[ba+20>>2]=c[o+24+20>>2];if((c[N>>2]|0)==2){i=2;n=2}else{i=2;n=2;f=2;o=2;do{f:do if((o|0)>1){w=c[M>>2]|0;x=w+(i*24|0)|0;q=+g[x>>2];r=+g[w+(i*24|0)+4>>2];s=+g[w+(i*24|0)+8>>2];while(1){ba=o+-2|0;p=o+-1|0;F=+g[h+(ba*24|0)>>2];ia=F-+g[h+(p*24|0)>>2];B=+g[h+(ba*24|0)+4>>2];v=B-+g[h+(p*24|0)+4>>2];ja=+g[h+(ba*24|0)+8>>2];E=ja-+g[h+(p*24|0)+8>>2];if((ia*(B-r)-v*(F-q))*H+(O*(v*(ja-s)-E*(B-r))+L*(E*(F-q)-ia*(ja-s)))>0.0)break;if((p|0)>1){n=p;o=p}else{n=p;o=w;ba=240;break f}}do if((o|0)==(f|0)){w=f<<1;if((f|0)>=(w|0)){w=f;o=f;break}c[6995]=(c[6995]|0)+1;o=sc((f*48|3)+16|0)|0;if(!o)p=0;else{c[(o+4+15&-16)+-4>>2]=o;p=o+4+15&-16}if((n|0)>0){o=0;do{ba=p+(o*24|0)|0;X=h+(o*24|0)|0;c[ba>>2]=c[X>>2];c[ba+4>>2]=c[X+4>>2];c[ba+8>>2]=c[X+8>>2];c[ba+12>>2]=c[X+12>>2];c[ba+16>>2]=c[X+16>>2];c[ba+20>>2]=c[X+20>>2];o=o+1|0}while((o|0)!=(n|0))}c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);h=p;o=n}else w=f;while(0);o=h+(o*24|0)|0;c[o>>2]=c[x>>2];c[o+4>>2]=c[x+4>>2];c[o+8>>2]=c[x+8>>2];c[o+12>>2]=c[x+12>>2];c[o+16>>2]=c[x+16>>2];c[o+20>>2]=c[x+20>>2];o=n+1|0;n=o;f=w;ba=238}else ba=238;while(0);do if((ba|0)==238){ba=0;if((o|0)!=1)break;o=c[M>>2]|0;ba=240}while(0);if((ba|0)==240){w=o+(i*24|0)|0;do if((f|0)==1){c[6995]=(c[6995]|0)+1;o=sc(67)|0;if(!o)p=0;else{c[(o+4+15&-16)+-4>>2]=o;p=o+4+15&-16}if((n|0)<=0){if(!h){f=2;h=p;o=n;break}}else{o=0;do{ba=p+(o*24|0)|0;X=h+(o*24|0)|0;c[ba>>2]=c[X>>2];c[ba+4>>2]=c[X+4>>2];c[ba+8>>2]=c[X+8>>2];c[ba+12>>2]=c[X+12>>2];c[ba+16>>2]=c[X+16>>2];c[ba+20>>2]=c[X+20>>2];o=o+1|0}while((o|0)!=(n|0))}c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);f=2;h=p;o=n}else o=1;while(0);o=h+(o*24|0)|0;c[o>>2]=c[w>>2];c[o+4>>2]=c[w+4>>2];c[o+8>>2]=c[w+8>>2];c[o+12>>2]=c[w+12>>2];c[o+16>>2]=c[w+16>>2];c[o+20>>2]=c[w+20>>2];o=n+1|0;n=o}i=i+1|0}while((i|0)!=(c[N>>2]|0))}ba=276}g:do if((ba|0)==276){ba=0;if((n|0)>0){G=0;o=c[ha+4>>2]|0;i=c[ha+8>>2]|0;w=a[ha+16>>0]|0;while(1){A=h+(G*24|0)+20|0;do if((o|0)==(i|0)){y=i|0?i<<1:1;if((i|0)>=(y|0)){z=w;o=i;y=i;break}do if(!y)f=0;else{c[6995]=(c[6995]|0)+1;o=sc((y<<2|3)+16|0)|0;if(!o){f=0;break}c[(o+4+15&-16)+-4>>2]=o;f=o+4+15&-16}while(0);p=c[ha+12>>2]|0;if((i|0)<=0){if(p)ba=305}else{o=0;do{c[f+(o<<2)>>2]=c[p+(o<<2)>>2];o=o+1|0}while((o|0)!=(i|0));ba=305}if((ba|0)==305){ba=0;if(w<<24>>24){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}c[ha+12>>2]=0;i=c[ha+4>>2]|0}c[ha+12>>2]=f;c[ha+8>>2]=y;z=1;o=i}else{z=w;y=i}while(0);c[(c[ha+12>>2]|0)+(o<<2)>>2]=c[A>>2];o=o+1|0;c[ha+4>>2]=o;i=c[N>>2]|0;h:do if((i|0)>0){x=c[M>>2]|0;f=c[A>>2]|0;p=0;while(1){w=x+(p*24|0)+20|0;p=p+1|0;if((c[w>>2]|0)==(f|0))break;if((p|0)>=(i|0))break h}c[w>>2]=-1}while(0);G=G+1|0;if((G|0)>=(n|0))break;else{i=y;w=z}}a[ha+16>>0]=z}if((i|0)<=0){ba=315;break}x=c[M>>2]|0;y=c[Z>>2]|0;z=c[$>>2]|0;A=(I|0)>0;if((y|0)>0)w=0;else{ba=315;break}while(1){G=c[x+(w*24|0)+20>>2]|0;i:do if((G|0)!=-1){if(A)f=0;else{o=0;while(1){p=c[z+(o*36|0)+4>>2]|0;if((p|0)>0){f=c[z+(o*36|0)+12>>2]|0;n=0;do{if((c[f+(n<<2)>>2]|0)==(G|0)){i=1;break g}n=n+1|0}while((n|0)<(p|0))}o=o+1|0;if((o|0)>=(y|0))break i}}do{n=0;while(1){if((c[J+(n<<2)>>2]|0)==(f|0))break;n=n+1|0;if((n|0)>=(I|0)){ba=291;break}}do if((ba|0)==291){ba=0;o=c[z+(f*36|0)+4>>2]|0;if((o|0)<=0)break;p=c[z+(f*36|0)+12>>2]|0;n=0;do{if((c[p+(n<<2)>>2]|0)==(G|0)){i=1;break g}n=n+1|0}while((n|0)<(o|0))}while(0);f=f+1|0}while((f|0)<(y|0))}while(0);w=w+1|0;if((w|0)>=(i|0)){ba=315;break}}}while(0);if((ba|0)==315){ba=0;ih((c[d+56>>2]|0)+24|0,ha);i=0}if(h|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}h=c[ha+12>>2]|0;if(h|0){if(a[ha+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[ha+12>>2]=0}h=c[M>>2]|0;if(h|0){if(a[ha+36+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[M>>2]=0}if(i&(I|0)>0){p=0;ba=327}}else if((I|0)==1){p=0;ba=327}if((ba|0)==327)while(1){ba=0;f=c[J+(p<<2)>>2]|0;w=c[$>>2]|0;a[ha+136+16>>0]=1;c[P>>2]=0;c[ha+136+4>>2]=0;c[ha+136+8>>2]=0;o=c[w+(f*36|0)+4>>2]|0;if((o|0)>0){c[6995]=(c[6995]|0)+1;i=sc((o<<2|3)+16|0)|0;do if(!i){h=0;n=0}else{c[(i+4+15&-16)+-4>>2]=i;h=c[P>>2]|0;if((h|0)==0|(a[ha+136+16>>0]|0)==0){h=i+4+15&-16;n=i+4+15&-16;break}c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);h=i+4+15&-16;n=i+4+15&-16}while(0);a[ha+136+16>>0]=1;c[P>>2]=h;c[ha+136+8>>2]=o;Yk(h|0,0,o<<2|0)|0;c[ha+136+4>>2]=o;i=c[w+(f*36|0)+12>>2]|0;h=0;do{c[n+(h<<2)>>2]=c[i+(h<<2)>>2];h=h+1|0}while((h|0)!=(o|0));h=c[P>>2]|0}else{c[ha+136+4>>2]=o;h=0}c[ha+136+20>>2]=c[w+(f*36|0)+20>>2];c[ha+136+20+4>>2]=c[w+(f*36|0)+20+4>>2];c[ha+136+20+8>>2]=c[w+(f*36|0)+20+8>>2];c[ha+136+20+12>>2]=c[w+(f*36|0)+20+12>>2];ih((c[d+56>>2]|0)+24|0,ha+136|0);if(h|0){if(a[ha+136+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[P>>2]=0}p=p+1|0;if((p|0)>=(I|0))break;else ba=327}if(!((J|0)==0|(K|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[K+-4>>2]|0)}}while((k|0)!=0)}else{Y=0;m=0}X=c[d+56>>2]|0;c[X+64>>2]=0;c[X+64+4>>2]=0;c[X+64+8>>2]=0;c[X+64+12>>2]=0;h=c[X+28>>2]|0;if((h|0)>0){W=0;i=0;k=0;I=0;K=0;f=0;n=0;J=0;w=0;o=0;G=0;z=0;x=0;y=0;p=0;while(1){A=c[X+36>>2]|0;V=c[A+(W*36|0)+4>>2]|0;if((V|0)>0){U=W&65535;T=W|-65536;N=0;S=J;P=w;h=A;M=p;while(1){R=N+1|0;d=c[h+(W*36|0)+12>>2]|0;w=c[d+(N<<2)>>2]&65535;N=c[d+(((R|0)==(V|0)?0:R)<<2)>>2]&65535;d=N<<16>>16>w<<16>>16?w:N;Q=N<<16>>16>w<<16>>16?N:w;p=N<<16>>16>w<<16>>16?w:N;w=N<<16>>16>w<<16>>16?N:w;N=P+-1|0;j:do if((((p&65535)<<16)+(w<<16>>16)&N)>>>0>>0?(ca=c[k+((((p&65535)<<16)+(w<<16>>16)&N)<<2)>>2]|0,(ca|0)!=-1):0){h=ca;while(1){if(w<<16>>16==(b[i+(h<<2)>>1]|0)?p<<16>>16==(b[i+(h<<2)+2>>1]|0):0)break;h=c[n+(h<<2)>>2]|0;if((h|0)==-1){J=0;break j}}J=o+(h<<2)|0}else J=0;while(0);h=c[X+16>>2]|0;u=+g[h+(p<<16>>16<<4)>>2]-+g[h+(w<<16>>16<<4)>>2];v=+g[h+(p<<16>>16<<4)+4>>2]-+g[h+(w<<16>>16<<4)+4>>2];s=+g[h+(p<<16>>16<<4)+8>>2]-+g[h+(w<<16>>16<<4)+8>>2];t=1.0/+D(+(u*u+v*v+s*s));h=c[X+48>>2]|0;k:do if((h|0)>0){w=c[X+56>>2]|0;p=0;while(1){q=+g[w+(p<<4)>>2];r=+g[w+(p<<4)+8>>2];do if(!(+C(+(q-u*t))>1.0e-06)){if(+C(+(+g[w+(p<<4)+4>>2]-v*t))>1.0e-06)break;if(!(+C(+(r-s*t))>1.0e-06))break k}while(0);do if(!(+C(+(u*t+q))>1.0e-06)){if(+C(+(v*t+ +g[w+(p<<4)+4>>2]))>1.0e-06)break;if(!(+C(+(s*t+r))>1.0e-06))break k}while(0);p=p+1|0;if((p|0)>=(h|0)){ba=367;break}}}else ba=367;while(0);if((ba|0)==367){ba=0;do if((h|0)==(c[X+52>>2]|0)){A=h|0?h<<1:1;if((h|0)>=(A|0))break;if(!A)w=0;else{c[6995]=(c[6995]|0)+1;h=sc((A<<4|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}w=h;h=c[X+48>>2]|0}if((h|0)>0){p=0;do{ka=w+(p<<4)|0;la=(c[X+56>>2]|0)+(p<<4)|0;c[ka>>2]=c[la>>2];c[ka+4>>2]=c[la+4>>2];c[ka+8>>2]=c[la+8>>2];c[ka+12>>2]=c[la+12>>2];p=p+1|0}while((p|0)!=(h|0))}h=c[X+56>>2]|0;if(h|0){if(a[X+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[X+56>>2]=0}a[X+60>>0]=1;c[X+56>>2]=w;c[X+52>>2]=A;h=c[X+48>>2]|0}while(0);la=c[X+56>>2]|0;g[la+(h<<4)>>2]=u*t;g[la+(h<<4)+4>>2]=v*t;g[la+(h<<4)+8>>2]=s*t;g[la+(h<<4)+12>>2]=0.0;c[X+48>>2]=(c[X+48>>2]|0)+1}l:do if(!J){J=((d&65535)<<16)+(Q<<16>>16)&N;m:do if(J>>>0>>0){h=c[k+(J<<2)>>2]|0;if((h|0)==-1)break;while(1){if(Q<<16>>16==(b[i+(h<<2)>>1]|0)?d<<16>>16==(b[i+(h<<2)+2>>1]|0):0)break;h=c[n+(h<<2)>>2]|0;if((h|0)==-1)break m}A=o+(h<<2)|0;b[A>>1]=T;b[A+2>>1]=T>>>16;A=K;J=S;w=P;h=z;p=M;break l}while(0);do if((S|0)==(P|0)){w=S|0?S<<1:1;if((S|0)>=(w|0)){w=S;break}do if(!w)p=0;else{c[6995]=(c[6995]|0)+1;h=sc((w<<2|3)+16|0)|0;if(!h){p=0;break}c[(h+4+15&-16)+-4>>2]=h;p=h+4+15&-16}while(0);if((S|0)<=0){if(!o){o=p;break}}else{h=0;do{la=p+(h<<2)|0;ka=o+(h<<2)|0;ka=e[ka>>1]|e[ka+2>>1]<<16;b[la>>1]=ka;b[la+2>>1]=ka>>>16;h=h+1|0}while((h|0)!=(S|0))}c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0);o=p}else w=P;while(0);N=o+(S<<2)|0;b[N>>1]=T;b[N+2>>1]=T>>>16;N=S+1|0;do if((G|0)==(x|0)){x=G|0?G<<1:1;if((G|0)>=(x|0)){x=G;break}do if(!x)h=0;else{c[6995]=(c[6995]|0)+1;h=sc((x<<2|3)+16|0)|0;if(!h){h=0;break}c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}while(0);if((G|0)<=0){if(!i){i=h;break}}else{p=0;do{la=h+(p<<2)|0;ka=i+(p<<2)|0;ka=e[ka>>1]|e[ka+2>>1]<<16;b[la>>1]=ka;b[la+2>>1]=ka>>>16;p=p+1|0}while((p|0)!=(G|0))}c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);i=h}while(0);la=i+(G<<2)|0;b[la>>1]=(d&65535)<<16|Q&65535;b[la+2>>1]=((d&65535)<<16|Q&65535)>>>16;G=G+1|0;if((P|0)<(w|0)){do if((I|0)<(w|0)){do if((z|0)<(w|0)){do if(!w)p=0;else{c[6995]=(c[6995]|0)+1;h=sc((w<<2|3)+16|0)|0;if(!h){p=0;break}c[(h+4+15&-16)+-4>>2]=h;p=h+4+15&-16}while(0);if((I|0)<=0){if(!k){k=p;J=w;M=p;break}}else{h=0;do{c[p+(h<<2)>>2]=c[k+(h<<2)>>2];h=h+1|0}while((h|0)!=(I|0))}c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);k=p;J=w;M=p}else J=z;while(0);z=w<<2;Yk(k+(I<<2)|0,0,z-(I<<2)|0)|0;if((K|0)<(w|0)){do if((f|0)<(w|0)){do if(!w)p=0;else{c[6995]=(c[6995]|0)+1;h=sc((z|3)+16|0)|0;if(!h){p=0;break}c[(h+4+15&-16)+-4>>2]=h;p=h+4+15&-16}while(0);if((K|0)<=0){if(!n){f=w;n=p;h=p;break}}else{h=0;do{c[p+(h<<2)>>2]=c[n+(h<<2)>>2];h=h+1|0}while((h|0)!=(K|0))}c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0);f=w;n=p;h=p}else h=y;while(0);Yk(n+(K<<2)|0,0,z-(K<<2)|0)|0;y=h}if((w|0)>0){Yk(M|0,-1,z|0)|0;Yk(y|0,-1,z|0)|0}if((I|0)<=0){I=w;A=w;h=J;p=M;break}p=w+-1|0;h=0;do{la=k+(((e[i+(h<<2)+2>>1]<<16)+(b[i+(h<<2)>>1]|0)&p)<<2)|0;c[n+(h<<2)>>2]=c[la>>2];c[la>>2]=h;h=h+1|0}while((h|0)!=(I|0));I=w;A=w;h=J;p=M}else{A=K;h=z;p=M}while(0);J=((d&65535)<<16)+(Q<<16>>16)&w+-1}else{A=K;h=z;p=M}J=k+(J<<2)|0;c[n+(S<<2)>>2]=c[J>>2];c[J>>2]=S;J=N}else{b[J+2>>1]=U;A=K;J=S;w=P;h=z;p=M}while(0);if((R|0)>=(V|0))break;N=R;K=A;S=J;P=w;z=h;h=c[X+36>>2]|0;M=p}z=h;h=c[X+28>>2]|0}else A=K;W=W+1|0;if((W|0)>=(h|0))break;else K=A}if((h|0)>0){z=c[X+36>>2]|0;A=c[X+16>>2]|0;y=0;q=0.0;do{f=c[z+(y*36|0)+4>>2]|0;w=c[z+(y*36|0)+12>>2]|0;x=c[w>>2]|0;if((f+-2|0)>=1){p=1;r=+g[X+64>>2];s=+g[X+68>>2];t=+g[X+72>>2];do{ka=c[w+(p<<2)>>2]|0;p=p+1|0;la=c[w+(((p|0)%(f|0)|0)<<2)>>2]|0;u=+g[A+(x<<4)>>2];v=+g[A+(ka<<4)>>2];E=+g[A+(x<<4)+4>>2];F=+g[A+(ka<<4)+4>>2];L=+g[A+(x<<4)+8>>2];O=+g[A+(ka<<4)+8>>2];B=+g[A+(la<<4)>>2];H=+g[A+(la<<4)+4>>2];ia=+g[A+(la<<4)+8>>2];ja=+D(+(((u-v)*(E-H)-(E-F)*(u-B))*((u-v)*(E-H)-(E-F)*(u-B))+(((E-F)*(L-ia)-(L-O)*(E-H))*((E-F)*(L-ia)-(L-O)*(E-H))+((L-O)*(u-B)-(u-v)*(L-ia))*((L-O)*(u-B)-(u-v)*(L-ia)))))*.5;r=r+(u+v+B)*.3333333432674408*ja;g[X+64>>2]=r;s=(E+F+H)*.3333333432674408*ja+s;g[X+68>>2]=s;t=ja*(L+O+ia)*.3333333432674408+t;g[X+72>>2]=t;q=q+ja}while((p|0)!=(f+-1|0))}y=y+1|0}while((y|0)!=(h|0));p=X+64|0;w=i;f=k;i=1}else ba=346}else{i=0;k=0;n=0;o=0;ba=346}if((ba|0)==346){q=0.0;p=X+64|0;w=i;f=k;i=0}t=1.0/q;u=t*+g[p>>2];g[p>>2]=u;s=t*+g[X+68>>2];g[X+68>>2]=s;t=t*+g[X+72>>2];g[X+72>>2]=t;g[X+96>>2]=3402823466385288598117041.0e14;if(i){k=c[X+36>>2]|0;i=0;r=3402823466385288598117041.0e14;while(1){q=+C(+(+g[k+(i*36|0)+32>>2]+(+g[k+(i*36|0)+20>>2]*u+ +g[k+(i*36|0)+24>>2]*s+ +g[k+(i*36|0)+28>>2]*t)));if(q>2]=q;else q=r;i=i+1|0;if((i|0)>=(h|0)){B=q;break}else r=q}}else B=3402823466385288598117041.0e14;i=c[X+8>>2]|0;if((i|0)>0){k=c[X+16>>2]|0;h=0;u=-3402823466385288598117041.0e14;v=-3402823466385288598117041.0e14;t=-3402823466385288598117041.0e14;s=3402823466385288598117041.0e14;r=3402823466385288598117041.0e14;q=3402823466385288598117041.0e14;do{ja=+g[k+(h<<4)>>2];q=jat?ja:t;ja=+g[k+(h<<4)+4>>2];r=jav?ja:v;ja=+g[k+(h<<4)+8>>2];s=jau?ja:u;h=h+1|0}while((h|0)!=(i|0))}else{u=-3402823466385288598117041.0e14;v=-3402823466385288598117041.0e14;t=-3402823466385288598117041.0e14;s=3402823466385288598117041.0e14;r=3402823466385288598117041.0e14;q=3402823466385288598117041.0e14}g[X+100>>2]=q+t;g[X+104>>2]=r+v;g[X+108>>2]=s+u;g[X+112>>2]=0.0;ja=t-q;q=v-r;r=u-s;g[X+116>>2]=ja;g[X+120>>2]=q;g[X+124>>2]=r;g[X+128>>2]=0.0;s=B/1.7320507764816284;p=+g[X+116+((ja>2]>2]*.5-s)*.0009765625;g[X+88>>2]=s;g[X+84>>2]=s;g[X+80>>2]=s;r=+g[X+116+(p<<2)>>2]*.5;g[X+80+(p<<2)>>2]=r;h=0;while(1){if(dh(X)|0){ba=452;break}r=r-q;g[X+80+(p<<2)>>2]=r;h=h+1|0;if((h|0)>=1024){ba=451;break}}n:do if((ba|0)==451){g[X+88>>2]=s;g[X+84>>2]=s;g[X+80>>2]=s}else if((ba|0)==452){q=(+g[X+96>>2]-s)*.0009765625;h=0;k=c[X+80+((1<<(1<>2]|0;while(1){i=c[X+80+((1<>2]|0;g[X+80+((1<>2]=q+(c[j>>2]=i,+g[j>>2]);r=q+ +g[X+80+((1<<(1<>2];g[X+80+((1<<(1<>2]=r;h=h+1|0;if(!(dh(X)|0))break;if((h|0)>=1024)break n;else k=(g[j>>2]=r,c[j>>2]|0)}c[X+80+((1<>2]=i;c[X+80+((1<<(1<>2]=k}while(0);if(w|0){c[6996]=(c[6996]|0)+1;Cd(c[w+-4>>2]|0)}if(o|0){c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0)}if(n|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}if(f|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}if(!((m|0)==0|(Y|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[Y+-4>>2]|0)}o=c[Z>>2]|0;p=c[$>>2]|0;if((o|0)<=0){if(p|0)ba=473}else{h=0;do{k=p+(h*36|0)+4|0;m=p+(h*36|0)+12|0;n=c[m>>2]|0;i=p+(h*36|0)+16|0;if(n|0){if(a[i>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}c[m>>2]=0}a[i>>0]=1;c[m>>2]=0;c[k>>2]=0;c[p+(h*36|0)+8>>2]=0;h=h+1|0}while((h|0)!=(o|0));ba=473}if((ba|0)==473){if(a[ha+56+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}c[$>>2]=0}if(!((aa|0)==0|(_|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[_+-4>>2]|0)}h=c[da>>2]|0;if(h|0){if(a[ha+76+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[da>>2]=0}a[ha+76+56>>0]=1;c[da>>2]=0;c[ha+76+44>>2]=0;c[ha+76+48>>2]=0;h=c[ea>>2]|0;if(h|0){if(a[ha+76+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[ea>>2]=0}a[ha+76+36>>0]=1;c[ea>>2]=0;c[ha+76+24>>2]=0;c[ha+76+28>>2]=0;h=c[fa>>2]|0;if(h|0){if(a[ha+76+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[fa>>2]=0}if(!ga){l=ha;return 1}c[6996]=(c[6996]|0)+1;Cd(c[ga+-4>>2]|0);l=ha;return 1}function ec(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0,M=0,N=0,O=0,P=0.0,Q=0.0,R=0.0,S=0,T=0.0,U=0.0,V=0.0,W=0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0,ja=0,ka=0.0,la=0.0,ma=0.0,na=0,oa=0.0,pa=0,qa=0,ra=0,sa=0,ta=0;ta=l;l=l+1072|0;j=c[b+56>>2]|0;if(!j){j=c[b+4>>2]|0;j=Bb[c[(c[j>>2]|0)+12>>2]&63](j,c[d+8>>2]|0,c[e+8>>2]|0)|0;c[b+56>>2]=j;a[b+52>>0]=1}c[h+4>>2]=j;ra=c[d+4>>2]|0;pa=c[e+4>>2]|0;a:do switch(c[ra+4>>2]|0){case 10:switch(c[pa+4>>2]|0){case 10:{oa=+g[j+784>>2];sa=c[ra+56>>2]|0;b=c[pa+56>>2]|0;i=+fg(ta+640|0,ta+624|0,+g[ra+32+(sa<<2)>>2],+g[ra+32+(((sa+2|0)%3|0)<<2)>>2],+g[pa+32+(b<<2)>>2],+g[pa+32+(((b+2|0)%3|0)<<2)>>2],sa,b,c[d+12>>2]|0,c[e+12>>2]|0,oa);if(i>2]|0)+16>>2]&15](h,ta+640|0,ta+624|0,i);k=c[h+4>>2]|0;if(!(c[k+780>>2]|0)){l=ta;return}m=c[k+772>>2]|0;n=c[(c[h+8>>2]|0)+8>>2]|0;j=c[(c[h+12>>2]|0)+8>>2]|0;if((m|0)==(n|0)){af(k,m+4|0,j+4|0);l=ta;return}else{af(k,j+4|0,n+4|0);l=ta;return}}case 8:{oa=+g[j+784>>2];b=c[ra+56>>2]|0;i=+fg(ta+640|0,ta+624|0,+g[ra+32+(b<<2)>>2],+g[ra+32+(((b+2|0)%3|0)<<2)>>2],0.0,+g[pa+32>>2]*+g[pa+16>>2],b,1,c[d+12>>2]|0,c[e+12>>2]|0,oa);if(i>2]|0)+16>>2]&15](h,ta+640|0,ta+624|0,i);k=c[h+4>>2]|0;if(!(c[k+780>>2]|0)){l=ta;return}m=c[k+772>>2]|0;n=c[(c[h+8>>2]|0)+8>>2]|0;j=c[(c[h+12>>2]|0)+8>>2]|0;if((m|0)==(n|0)){af(k,m+4|0,j+4|0);l=ta;return}else{af(k,j+4|0,n+4|0);l=ta;return}}default:{m=pa+4|0;break a}}case 8:{if((c[pa+4>>2]|0)==10){oa=+g[j+784>>2];b=c[pa+56>>2]|0;i=+fg(ta+640|0,ta+624|0,0.0,+g[ra+32>>2]*+g[ra+16>>2],+g[pa+32+(b<<2)>>2],+g[pa+32+(((b+2|0)%3|0)<<2)>>2],1,b,c[d+12>>2]|0,c[e+12>>2]|0,oa);if(i>2]|0)+16>>2]&15](h,ta+640|0,ta+624|0,i);k=c[h+4>>2]|0;if(!(c[k+780>>2]|0)){l=ta;return}m=c[k+772>>2]|0;n=c[(c[h+8>>2]|0)+8>>2]|0;j=c[(c[h+12>>2]|0)+8>>2]|0;if((m|0)==(n|0)){af(k,m+4|0,j+4|0);l=ta;return}else{af(k,j+4|0,n+4|0);l=ta;return}}else m=pa+4|0;break}default:m=pa+4|0}while(0);g[ta+488+128>>2]=999999984306749440.0;g[ta+128+308>>2]=9.999999747378752e-05;a[ta+128+332>>0]=0;j=c[b+8>>2]|0;c[ta+48>>2]=9552;c[ta+48+4>>2]=0;c[ta+48+8>>2]=1065353216;c[ta+48+12>>2]=0;g[ta+48+16>>2]=0.0;c[ta+48+20>>2]=j;c[ta+48+24>>2]=ta+128;c[ta+48+28>>2]=ra;c[ta+48+32>>2]=pa;c[ta+48+36>>2]=c[ra+4>>2];c[ta+48+40>>2]=c[m>>2];g[ta+48+44>>2]=+nb[c[(c[ra>>2]|0)+48>>2]&15](ra);g[ta+48+48>>2]=+nb[c[(c[pa>>2]|0)+48>>2]&15](pa);a[ta+48+52>>0]=0;c[ta+48+60>>2]=-1;c[ta+48+72>>2]=1;c[ta+48+76>>2]=1;c[ta+48+28>>2]=ra;c[ta+48+32>>2]=pa;ma=+nb[c[(c[ra>>2]|0)+48>>2]&15](ra);oa=+nb[c[(c[pa>>2]|0)+48>>2]&15](pa);oa=ma+oa+ +g[(c[b+56>>2]|0)+784>>2]+ +g[h+32>>2];g[ta+488+128>>2]=oa*oa;j=c[d+12>>2]|0;c[ta+488>>2]=c[j>>2];c[ta+488+4>>2]=c[j+4>>2];c[ta+488+8>>2]=c[j+8>>2];c[ta+488+12>>2]=c[j+12>>2];n=ta+488+16|0;c[n>>2]=c[j+16>>2];c[n+4>>2]=c[j+16+4>>2];c[n+8>>2]=c[j+16+8>>2];c[n+12>>2]=c[j+16+12>>2];s=ta+488+32|0;c[s>>2]=c[j+32>>2];c[s+4>>2]=c[j+32+4>>2];c[s+8>>2]=c[j+32+8>>2];c[s+12>>2]=c[j+32+12>>2];t=ta+488+48|0;c[t>>2]=c[j+48>>2];c[t+4>>2]=c[j+48+4>>2];c[t+8>>2]=c[j+48+8>>2];c[t+12>>2]=c[j+48+12>>2];j=c[e+12>>2]|0;u=ta+488+64|0;c[u>>2]=c[j>>2];c[u+4>>2]=c[j+4>>2];c[u+8>>2]=c[j+8>>2];c[u+12>>2]=c[j+12>>2];L=ta+488+80|0;c[L>>2]=c[j+16>>2];c[L+4>>2]=c[j+16+4>>2];c[L+8>>2]=c[j+16+8>>2];c[L+12>>2]=c[j+16+12>>2];M=ta+488+96|0;c[M>>2]=c[j+32>>2];c[M+4>>2]=c[j+32+4>>2];c[M+8>>2]=c[j+32+8>>2];c[M+12>>2]=c[j+32+12>>2];N=ta+488+112|0;c[N>>2]=c[j+48>>2];c[N+4>>2]=c[j+48+4>>2];c[N+8>>2]=c[j+48+8>>2];c[N+12>>2]=c[j+48+12>>2];j=c[ra+4>>2]|0;if((j|0)<7?(k=c[m>>2]|0,(k|0)<7):0){c[ta+40>>2]=6428;if(!j){j=k;o=0.0}else{o=+nb[c[(c[ra>>2]|0)+48>>2]&15](ra);j=c[m>>2]|0}if(!j)i=0.0;else i=+nb[c[(c[pa>>2]|0)+48>>2]&15](pa);c[ta>>2]=6456;c[ta+4>>2]=h;g[ta+24>>2]=o;g[ta+28>>2]=i;a[ta+36>>0]=0;ia=c[ra+56>>2]|0;b:do if(ia|0){ja=c[pa+56>>2]|0;do if(!ja){if((c[m>>2]|0)!=1)break b;t=ta+1e3+16|0;a[t>>0]=1;u=ta+1e3+12|0;c[u>>2]=0;s=ta+1e3+4|0;c[s>>2]=0;n=ta+1e3+8|0;c[n>>2]=0;j=c[e+12>>2]|0;ma=+g[pa+60>>2];oa=+g[pa+60+4>>2];p=+g[pa+60+8>>2];i=ma*+g[j>>2]+oa*+g[j+4>>2]+p*+g[j+8>>2]+ +g[j+48>>2];o=ma*+g[j+16>>2]+oa*+g[j+20>>2]+p*+g[j+24>>2]+ +g[j+52>>2];p=ma*+g[j+32>>2]+oa*+g[j+36>>2]+p*+g[j+40>>2]+ +g[j+56>>2];c[6995]=(c[6995]|0)+1;j=sc(35)|0;if(!j)k=0;else{c[(j+4+15&-16)+-4>>2]=j;k=j+4+15&-16}j=c[u>>2]|0;if(!j)j=0;else{c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);j=c[s>>2]|0;c[u>>2]=0}a[t>>0]=1;c[u>>2]=k;c[n>>2]=1;g[k+(j<<4)>>2]=i;g[k+(j<<4)+4>>2]=o;g[k+(j<<4)+8>>2]=p;g[k+(j<<4)+12>>2]=0.0;j=(c[s>>2]|0)+1|0;c[s>>2]=j;sa=c[e+12>>2]|0;ma=+g[pa+60+16>>2];oa=+g[pa+60+20>>2];p=+g[pa+60+24>>2];i=ma*+g[sa>>2]+oa*+g[sa+4>>2]+p*+g[sa+8>>2]+ +g[sa+48>>2];o=ma*+g[sa+16>>2]+oa*+g[sa+20>>2]+p*+g[sa+24>>2]+ +g[sa+52>>2];p=ma*+g[sa+32>>2]+oa*+g[sa+36>>2]+p*+g[sa+40>>2]+ +g[sa+56>>2];if((j|0)==(c[n>>2]|0)?(O=j|0?j<<1:1,(j|0)<(O|0)):0){if(!O)m=0;else{c[6995]=(c[6995]|0)+1;j=sc((O<<4|3)+16|0)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}m=j;j=c[s>>2]|0}if((j|0)>0){k=0;do{sa=m+(k<<4)|0;qa=(c[u>>2]|0)+(k<<4)|0;c[sa>>2]=c[qa>>2];c[sa+4>>2]=c[qa+4>>2];c[sa+8>>2]=c[qa+8>>2];c[sa+12>>2]=c[qa+12>>2];k=k+1|0}while((k|0)!=(j|0))}j=c[u>>2]|0;if(j|0){if(a[t>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[u>>2]=0}a[t>>0]=1;c[u>>2]=m;c[n>>2]=O;j=c[s>>2]|0}sa=c[u>>2]|0;g[sa+(j<<4)>>2]=i;g[sa+(j<<4)+4>>2]=o;g[sa+(j<<4)+8>>2]=p;g[sa+(j<<4)+12>>2]=0.0;j=(c[s>>2]|0)+1|0;c[s>>2]=j;e=c[e+12>>2]|0;ma=+g[pa+60+32>>2];oa=+g[pa+60+36>>2];p=+g[pa+60+40>>2];i=ma*+g[e>>2]+oa*+g[e+4>>2]+p*+g[e+8>>2]+ +g[e+48>>2];o=ma*+g[e+16>>2]+oa*+g[e+20>>2]+p*+g[e+24>>2]+ +g[e+52>>2];p=ma*+g[e+32>>2]+oa*+g[e+36>>2]+p*+g[e+40>>2]+ +g[e+56>>2];if((j|0)==(c[n>>2]|0)?(S=j|0?j<<1:1,(j|0)<(S|0)):0){if(!S)m=0;else{c[6995]=(c[6995]|0)+1;j=sc((S<<4|3)+16|0)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}m=j;j=c[s>>2]|0}if((j|0)>0){k=0;do{e=m+(k<<4)|0;sa=(c[u>>2]|0)+(k<<4)|0;c[e>>2]=c[sa>>2];c[e+4>>2]=c[sa+4>>2];c[e+8>>2]=c[sa+8>>2];c[e+12>>2]=c[sa+12>>2];k=k+1|0}while((k|0)!=(j|0))}j=c[u>>2]|0;if(j|0){if(a[t>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[u>>2]=0}a[t>>0]=1;c[u>>2]=m;c[n>>2]=S;j=c[s>>2]|0}e=c[u>>2]|0;g[e+(j<<4)>>2]=i;g[e+(j<<4)+4>>2]=o;g[e+(j<<4)+8>>2]=p;g[e+(j<<4)+12>>2]=0.0;c[s>>2]=(c[s>>2]|0)+1;q=+g[(c[b+56>>2]|0)+784>>2];Dc(ta+48|0,ta+488|0,ta+40|0,c[f+20>>2]|0,0);i=+g[ta+48+4>>2];o=+g[ta+48+8>>2];p=+g[ta+48+12>>2];if(i*i+o*o+p*p>1.1920928955078125e-07){oa=1.0/(i*i+o*o+p*p);g[ta+760>>2]=i*oa;g[ta+760+4>>2]=o*oa;g[ta+760+8>>2]=p*oa;g[ta+760+12>>2]=0.0;oa=+g[ta+48+56>>2];i=+nb[c[(c[ra>>2]|0)+48>>2]&15](ra);i=oa-i-+nb[c[(c[pa>>2]|0)+48>>2]&15](pa);j=c[b+36>>2]|0;if((j|0)<0){if((c[b+40>>2]|0)<0){k=c[b+44>>2]|0;if(k|0){if(a[b+48>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[b+44>>2]=0}a[b+48>>0]=1;c[b+44>>2]=0;c[b+40>>2]=0}do{e=(c[b+44>>2]|0)+(j<<4)|0;c[e>>2]=c[ta+744>>2];c[e+4>>2]=c[ta+744+4>>2];c[e+8>>2]=c[ta+744+8>>2];c[e+12>>2]=c[ta+744+12>>2];j=j+1|0}while((j|0)!=0)}c[b+36>>2]=0;Mc(ta+760|0,c[ra+56>>2]|0,c[d+12>>2]|0,ta+1e3|0,b+32|0,i-q,q,h)}do if(a[b+52>>0]|0?(W=c[h+4>>2]|0,c[W+780>>2]|0):0){k=c[W+772>>2]|0;m=c[(c[h+8>>2]|0)+8>>2]|0;j=c[(c[h+12>>2]|0)+8>>2]|0;if((k|0)==(m|0)){af(W,k+4|0,j+4|0);break}else{af(W,j+4|0,m+4|0);break}}while(0);j=c[u>>2]|0;if(j|0){if(a[t>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[u>>2]=0}}else{oa=+g[(c[b+56>>2]|0)+784>>2];c:do if(!(a[f+24>>0]|0)){Dc(ta+48|0,ta+488|0,ta,c[f+20>>2]|0,0);i=+g[ta+32>>2];if(i<0.0&(a[ta+36>>0]|0)!=0){o=+g[ta+8>>2];p=+g[ta+12>>2];q=+g[ta+16>>2];m=c[ta+20>>2]|0;na=107}}else{u=c[d+12>>2]|0;L=c[e+12>>2]|0;c[6411]=(c[6411]|0)+1;da=+g[ia+64>>2];ea=+g[ia+68>>2];r=+g[u+4>>2];fa=+g[ia+72>>2];v=+g[u+8>>2];x=+g[u+16>>2];z=+g[u+20>>2];B=+g[u+24>>2];E=+g[u+32>>2];A=+g[u+36>>2];y=+g[u+40>>2];ga=+g[ja+64>>2];ha=+g[ja+68>>2];ma=+g[ja+72>>2];ka=da*+g[u>>2]+ea*r+fa*v+ +g[u+48>>2]-(ga*+g[L>>2]+ha*+g[L+4>>2]+ma*+g[L+8>>2]+ +g[L+48>>2]);la=da*x+ea*z+fa*B+ +g[u+52>>2]-(ga*+g[L+16>>2]+ha*+g[L+20>>2]+ma*+g[L+24>>2]+ +g[L+52>>2]);ma=da*E+ea*A+fa*y+ +g[u+56>>2]-(ga*+g[L+32>>2]+ha*+g[L+36>>2]+ma*+g[L+40>>2]+ +g[L+56>>2]);m=c[ia+28>>2]|0;d:do if((m|0)>0){i=3402823466385288598117041.0e14;j=0;w=0.0;o=0.0;p=0.0;q=0.0;H=x;while(1){f=c[ia+36>>2]|0;fa=+g[f+(j*36|0)+20>>2];ga=+g[f+(j*36|0)+24>>2];ha=+g[f+(j*36|0)+28>>2];x=fa*+g[u>>2]+ga*r+ha*v;v=fa*H+ga*z+ha*B;r=fa*E+ga*A+ha*y;g[ta+656>>2]=x;g[ta+656+4>>2]=v;g[ta+656+8>>2]=r;g[ta+656+12>>2]=0.0;if(ka*x+la*v+ma*r<0.0){g[ta+656>>2]=-x;g[ta+656+4>>2]=-v;g[ta+656+8>>2]=-r;B=-x;v=-v;r=-r}else B=x;c[6409]=(c[6409]|0)+1;if(Ii(u,L,ka,la,ma,B,v,r,ia,ja,i)|0){c[6410]=(c[6410]|0)+1;bh(ia,u,ta+656|0,ta+1e3|0,ta+760|0,ta+720|0,ta+704|0);bh(ja,L,ta+656|0,ta+744|0,ta+736|0,ta+688|0,ta+672|0);x=+g[ta+760>>2];y=+g[ta+744>>2];do if(x>2];A=+g[ta+1e3>>2];if(z=(m|0))break d;r=+g[u+4>>2];v=+g[u+8>>2];H=+g[u+16>>2];z=+g[u+20>>2];B=+g[u+24>>2];E=+g[u+32>>2];A=+g[u+36>>2];y=+g[u+40>>2]}break c}else{i=3402823466385288598117041.0e14;o=0.0;p=0.0;q=0.0}while(0);m=c[ja+28>>2]|0;e:do if((m|0)>0){k=0;x=0.0;while(1){f=c[ja+36>>2]|0;ga=+g[f+(k*36|0)+20>>2];ha=+g[f+(k*36|0)+24>>2];w=+g[f+(k*36|0)+28>>2];r=ga*+g[L>>2]+ha*+g[L+4>>2]+w*+g[L+8>>2];v=ga*+g[L+16>>2]+ha*+g[L+20>>2]+w*+g[L+24>>2];w=ga*+g[L+32>>2]+ha*+g[L+36>>2]+w*+g[L+40>>2];g[ta+656>>2]=r;g[ta+656+4>>2]=v;g[ta+656+8>>2]=w;g[ta+656+12>>2]=0.0;if(ka*r+la*v+ma*w<0.0){g[ta+656>>2]=-r;g[ta+656+4>>2]=-v;g[ta+656+8>>2]=-w;r=-r;v=-v;w=-w}c[6409]=(c[6409]|0)+1;if(Ii(u,L,ka,la,ma,r,v,w,ia,ja,i)|0){c[6410]=(c[6410]|0)+1;bh(ia,u,ta+656|0,ta+1e3|0,ta+760|0,ta+720|0,ta+704|0);bh(ja,L,ta+656|0,ta+744|0,ta+736|0,ta+688|0,ta+672|0);y=+g[ta+760>>2];z=+g[ta+744>>2];do if(y>2];B=+g[ta+1e3>>2];if(A=(m|0))break e}break c}while(0);j=c[ia+48>>2]|0;f:do if((j|0)>0){t=0;k=-1;n=-1;w=0.0;z=0.0;K=0.0;y=0.0;J=0.0;H=0.0;I=0.0;x=0.0;A=0.0;B=0.0;v=0.0;r=0.0;E=0.0;V=0.0;U=0.0;T=0.0;R=0.0;Q=0.0;P=0.0;m=c[ja+48>>2]|0;g:while(1){f=c[ia+56>>2]|0;da=+g[f+(t<<4)>>2];ea=+g[f+(t<<4)+4>>2];ha=+g[f+(t<<4)+8>>2];fa=da*+g[u>>2]+ea*+g[u+4>>2]+ha*+g[u+8>>2];ga=da*+g[u+16>>2]+ea*+g[u+20>>2]+ha*+g[u+24>>2];ha=da*+g[u+32>>2]+ea*+g[u+36>>2]+ha*+g[u+40>>2];if((m|0)>0){s=0;ba=w;ea=o;da=p;ca=q;aa=x;$=A;_=B;Z=E;while(1){f=c[ja+56>>2]|0;A=+g[f+(s<<4)>>2];B=+g[f+(s<<4)+4>>2];Y=+g[f+(s<<4)+8>>2];E=A*+g[L>>2]+B*+g[L+4>>2]+Y*+g[L+8>>2];X=A*+g[L+16>>2]+B*+g[L+20>>2]+Y*+g[L+24>>2];Y=A*+g[L+32>>2]+B*+g[L+36>>2]+Y*+g[L+40>>2];g[ta+656>>2]=ga*Y-ha*X;g[ta+656+4>>2]=ha*E-fa*Y;g[ta+656+8>>2]=fa*X-ga*E;g[ta+656+12>>2]=0.0;do if(!(+C(+(ga*Y-ha*X))>1.0e-06)){if(+C(+(ha*E-fa*Y))>1.0e-06){na=71;break}if(!(+C(+(fa*X-ga*E))>1.0e-06)){w=ba;o=ea;p=da;q=ca;E=Z;B=_;A=$;x=aa}else na=71}else na=71;while(0);do if((na|0)==71){na=0;q=1.0/+D(+((ga*Y-ha*X)*(ga*Y-ha*X)+(ha*E-fa*Y)*(ha*E-fa*Y)+(fa*X-ga*E)*(fa*X-ga*E)));o=(ga*Y-ha*X)*q;g[ta+656>>2]=o;p=(ha*E-fa*Y)*q;g[ta+656+4>>2]=p;q=(fa*X-ga*E)*q;g[ta+656+8>>2]=q;if(o*ka+p*la+ma*q<0.0){g[ta+656>>2]=-o;g[ta+656+4>>2]=-p;g[ta+656+8>>2]=-q;o=-o;p=-p;q=-q}c[6409]=(c[6409]|0)+1;if(!(Ii(u,L,ka,la,ma,o,p,q,ia,ja,i)|0)){w=ba;o=ea;p=da;q=ca;E=Z;B=_;A=$;x=aa;break}c[6410]=(c[6410]|0)+1;bh(ia,u,ta+656|0,ta+1e3|0,ta+760|0,ta+720|0,ta+704|0);bh(ja,L,ta+656|0,ta+744|0,ta+736|0,ta+688|0,ta+672|0);w=+g[ta+760>>2];x=+g[ta+744>>2];do if(!(w>2];B=+g[ta+1e3>>2];if(A>2];U=+g[ta+688+4>>2];V=+g[ta+688+8>>2];B=+g[ta+704>>2];A=+g[ta+704+4>>2];x=+g[ta+704+8>>2];break}else{j=1;w=A-B;T=+g[ta+672>>2];U=+g[ta+672+4>>2];V=+g[ta+672+8>>2];B=+g[ta+720>>2];A=+g[ta+720+4>>2];x=+g[ta+720+8>>2];break}}else{j=0;w=ba;B=_;A=$;x=aa}while(0);if(!j)break g;if(!(w>2]|0;if((s|0)>=(m|0))break;else{ba=w;ea=o;da=p;ca=q;aa=x;$=A;_=B;Z=E}}j=c[ia+48>>2]|0}t=t+1|0;if((t|0)>=(j|0)){j=n;i=E;break f}}break c}else{k=-1;j=-1;v=0.0;r=0.0;i=0.0;R=0.0;Q=0.0;P=0.0;z=0.0;K=0.0;y=0.0;J=0.0;H=0.0;I=0.0}while(0);if((k|j|0)>-1){A=P-i;B=Q-r;E=R-v;w=z*K+y*J+H*I;x=A*K+B*J+E*I;r=A*z+B*y+E*H;if(!(1.0-w*w==0.0))if(!((x-r*w)/(1.0-w*w)<-1000000015047466219876688.0e6))if((x-r*w)/(1.0-w*w)>1000000015047466219876688.0e6){i=1000000015047466219876688.0e6;na=90}else v=(x-r*w)/(1.0-w*w);else{i=-1000000015047466219876688.0e6;na=90}else{i=0.0;na=90}if((na|0)==90)v=i;i=w*v-r;do if(i<-1000000015047466219876688.0e6){if(x-w*1000000015047466219876688.0e6<-1000000015047466219876688.0e6){i=-1000000015047466219876688.0e6;r=-1000000015047466219876688.0e6;break}if(!(x-w*1000000015047466219876688.0e6>1000000015047466219876688.0e6)){i=-1000000015047466219876688.0e6;r=x-w*1000000015047466219876688.0e6;break}i=-1000000015047466219876688.0e6;r=1000000015047466219876688.0e6}else{if(!(i>1000000015047466219876688.0e6)){r=v;break}if(x+w*1000000015047466219876688.0e6<-1000000015047466219876688.0e6){i=1000000015047466219876688.0e6;r=-1000000015047466219876688.0e6;break}if(!(x+w*1000000015047466219876688.0e6>1000000015047466219876688.0e6)){i=1000000015047466219876688.0e6;r=x+w*1000000015047466219876688.0e6;break}i=1000000015047466219876688.0e6;r=1000000015047466219876688.0e6}while(0);z=z*i;y=y*i;x=H*i;w=z+(A-K*r);v=y+(B-J*r);i=x+(E-I*r);g[ta+1e3>>2]=w;g[ta+1e3+4>>2]=v;g[ta+1e3+8>>2]=i;g[ta+1e3+12>>2]=0.0;if(w*w+v*v+i*i>1.1920928955078125e-07){r=+D(+(w*w+v*v+i*i));g[ta+1e3>>2]=w*(1.0/r);g[ta+1e3+4>>2]=1.0/r*v;g[ta+1e3+8>>2]=1.0/r*i;if(w*(1.0/r)*ka+1.0/r*v*la+1.0/r*i*ma<0.0){g[ta+1e3>>2]=-(w*(1.0/r));g[ta+1e3+4>>2]=-(1.0/r*v);g[ta+1e3+8>>2]=-(1.0/r*i)}g[ta+760>>2]=P+z;g[ta+760+4>>2]=Q+y;g[ta+760+8>>2]=R+x;g[ta+760+12>>2]=0.0;Tb[c[(c[h>>2]|0)+16>>2]&15](h,ta+1e3|0,ta+760|0,-r)}}if(ka*o+la*p+ma*q<0.0){i=-1000000015047466219876688.0e6;o=-o;p=-p;q=-q;m=0;na=107}else{i=-1000000015047466219876688.0e6;m=0;na=107}}while(0);if((na|0)==107){j=c[b+16>>2]|0;if((j|0)<0){if((c[b+20>>2]|0)<0){k=c[b+24>>2]|0;if(k|0){if(a[b+28>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[b+24>>2]=0}a[b+28>>0]=1;c[b+24>>2]=0;c[b+20>>2]=0}do{na=(c[b+24>>2]|0)+(j<<4)|0;c[na>>2]=c[ta+1e3>>2];c[na+4>>2]=c[ta+1e3+4>>2];c[na+8>>2]=c[ta+1e3+8>>2];c[na+12>>2]=c[ta+1e3+12>>2];j=j+1|0}while((j|0)!=0)}c[b+16>>2]=0;O=c[ra+56>>2]|0;N=c[pa+56>>2]|0;M=c[d+12>>2]|0;L=c[e+12>>2]|0;K=i-oa;H=1.0/+D(+(o*o+p*p+q*q));J=o*H;I=p*H;H=q*H;g[ta+1e3>>2]=J;g[ta+1e3+4>>2]=I;g[ta+1e3+8>>2]=H;c[ta+1e3+12>>2]=m;k=c[N+28>>2]|0;if((k|0)>0){m=c[N+36>>2]|0;o=+g[L>>2];p=+g[L+4>>2];q=+g[L+8>>2];r=+g[L+16>>2];v=+g[L+20>>2];w=+g[L+24>>2];x=+g[L+32>>2];y=+g[L+36>>2];z=+g[L+40>>2];i=-3402823466385288598117041.0e14;j=0;t=-1;while(1){A=+g[m+(j*36|0)+20>>2];B=+g[m+(j*36|0)+24>>2];E=+g[m+(j*36|0)+28>>2];n=(A*o+B*p+E*q)*J+(A*r+B*v+E*w)*I+(A*x+B*y+E*z)*H>i;t=n?j:t;j=j+1|0;if((j|0)==(k|0))break;else i=n?(A*o+B*p+E*q)*J+(A*r+B*v+E*w)*I+(A*x+B*y+E*z)*H:i}}else t=-1;j=c[N+36>>2]|0;c[b+16>>2]=0;u=c[j+(t*36|0)+4>>2]|0;if((u|0)>0){s=j+(t*36|0)+12|0;n=0;k=0;do{d=c[(c[s>>2]|0)+(n<<2)>>2]|0;e=c[N+16>>2]|0;la=+g[e+(d<<4)>>2];ma=+g[e+(d<<4)+4>>2];p=+g[e+(d<<4)+8>>2];i=la*+g[L>>2]+ma*+g[L+4>>2]+p*+g[L+8>>2]+ +g[L+48>>2];o=la*+g[L+16>>2]+ma*+g[L+20>>2]+p*+g[L+24>>2]+ +g[L+52>>2];p=la*+g[L+32>>2]+ma*+g[L+36>>2]+p*+g[L+40>>2]+ +g[L+56>>2];if((k|0)==(c[b+20>>2]|0)?(qa=k|0?k<<1:1,(k|0)<(qa|0)):0){if(!qa)j=0;else{c[6995]=(c[6995]|0)+1;j=sc((qa<<4|3)+16|0)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}k=c[b+16>>2]|0}if((k|0)>0){m=0;do{d=j+(m<<4)|0;e=(c[b+24>>2]|0)+(m<<4)|0;c[d>>2]=c[e>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];c[d+12>>2]=c[e+12>>2];m=m+1|0}while((m|0)!=(k|0))}k=c[b+24>>2]|0;if(k|0){if(a[b+28>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[b+24>>2]=0}a[b+28>>0]=1;c[b+24>>2]=j;c[b+20>>2]=qa;j=c[b+16>>2]|0}else j=k;k=c[b+24>>2]|0;g[k+(j<<4)>>2]=i;g[k+(j<<4)+4>>2]=o;g[k+(j<<4)+8>>2]=p;g[k+(j<<4)+12>>2]=0.0;k=(c[b+16>>2]|0)+1|0;c[b+16>>2]=k;n=n+1|0}while((n|0)!=(u|0))}if((t|0)>-1)Mc(ta+1e3|0,O,M,b+12|0,b+32|0,K,oa,h)}if(a[b+52>>0]|0?(sa=c[h+4>>2]|0,c[sa+780>>2]|0):0){k=c[sa+772>>2]|0;m=c[(c[h+8>>2]|0)+8>>2]|0;j=c[(c[h+12>>2]|0)+8>>2]|0;if((k|0)==(m|0)){af(sa,k+4|0,j+4|0);break}else{af(sa,j+4|0,m+4|0);break}}}while(0);l=ta;return}while(0)}Dc(ta+48|0,ta+488|0,h,c[f+20>>2]|0,0);if((c[b+64>>2]|0?(c[(c[h+4>>2]|0)+780>>2]|0)<(c[b+68>>2]|0):0)?(K=+g[ta+48+4>>2],P=+g[ta+48+8>>2],Q=+g[ta+48+12>>2],K*K+P*P+Q*Q>1.1920928955078125e-07):0){J=1.0/(K*K+P*P+Q*Q);if(+C(+(Q*J))>.7071067690849304){I=1.0/+D(+(Q*J*Q*J+P*J*P*J));E=0.0;H=P*J*I;I=-(Q*J*I)}else{I=1.0/+D(+(K*J*K*J+P*J*P*J));E=-(P*J*I);H=0.0;I=K*J*I}B=+nb[c[(c[ra>>2]|0)+16>>2]&15](ra);z=+nb[c[(c[pa>>2]|0)+16>>2]&15](pa);i=.019999999552965164/(B>2]=c[ta+488>>2];c[ta+1e3+4>>2]=c[ta+488+4>>2];c[ta+1e3+8>>2]=c[ta+488+8>>2];c[ta+1e3+12>>2]=c[ta+488+12>>2];c[ta+1e3+16>>2]=c[n>>2];c[ta+1e3+16+4>>2]=c[n+4>>2];c[ta+1e3+16+8>>2]=c[n+8>>2];c[ta+1e3+16+12>>2]=c[n+12>>2];c[ta+1e3+32>>2]=c[s>>2];c[ta+1e3+32+4>>2]=c[s+4>>2];c[ta+1e3+32+8>>2]=c[s+8>>2];c[ta+1e3+32+12>>2]=c[s+12>>2];c[ta+1e3+48>>2]=c[t>>2];c[ta+1e3+48+4>>2]=c[t+4>>2];c[ta+1e3+48+8>>2]=c[t+8>>2];c[ta+1e3+48+12>>2]=c[t+12>>2]}else{c[ta+1e3>>2]=c[u>>2];c[ta+1e3+4>>2]=c[u+4>>2];c[ta+1e3+8>>2]=c[u+8>>2];c[ta+1e3+12>>2]=c[u+12>>2];c[ta+1e3+16>>2]=c[L>>2];c[ta+1e3+16+4>>2]=c[L+4>>2];c[ta+1e3+16+8>>2]=c[L+8>>2];c[ta+1e3+16+12>>2]=c[L+12>>2];c[ta+1e3+32>>2]=c[M>>2];c[ta+1e3+32+4>>2]=c[M+4>>2];c[ta+1e3+32+8>>2]=c[M+8>>2];c[ta+1e3+32+12>>2]=c[M+12>>2];c[ta+1e3+48>>2]=c[N>>2];c[ta+1e3+48+4>>2]=c[N+4>>2];c[ta+1e3+48+8>>2]=c[N+8>>2];c[ta+1e3+48+12>>2]=c[N+12>>2]}j=c[b+64>>2]|0;if((j|0)>0){A=E*E+I*I+H*H;y=(i>.39269909262657166?.39269909262657166:i)*.5;k=0;do{if(A>1.1920928955078125e-07){w=+G(+y)/+D(+A);r=E*w;v=I*w;w=H*w;x=+F(+y);q=+(k|0)*(6.2831854820251465/+(j|0))*.5;p=+G(+q)/+D(+(Q*J*Q*J+(K*J*K*J+P*J*P*J)));i=K*J*p;o=P*J*p;p=Q*J*p;q=+F(+q);if(B>2]|0;Z=+g[sa>>2];_=+g[sa+16>>2];$=+g[sa+32>>2];aa=+g[sa+4>>2];ba=+g[sa+20>>2];ca=+g[sa+36>>2];da=+g[sa+8>>2];ga=+g[sa+24>>2];oa=+g[sa+40>>2];g[ta+488>>2]=(1.0-(la*ma+Y*ea))*Z+(ha*ma-fa*ea)*_+(ha*ea+fa*ma)*$;g[ta+488+4>>2]=(1.0-(la*ma+Y*ea))*aa+(ha*ma-fa*ea)*ba+(ha*ea+fa*ma)*ca;g[ta+488+8>>2]=(1.0-(la*ma+Y*ea))*da+(ha*ma-fa*ea)*ga+(ha*ea+fa*ma)*oa;g[ta+488+12>>2]=0.0;g[ta+488+16>>2]=(ha*ma+fa*ea)*Z+(1.0-(ha*ka+Y*ea))*_+(la*ea-fa*ka)*$;g[ta+488+20>>2]=(ha*ma+fa*ea)*aa+(1.0-(ha*ka+Y*ea))*ba+(la*ea-fa*ka)*ca;g[ta+488+24>>2]=(ha*ma+fa*ea)*da+(1.0-(ha*ka+Y*ea))*ga+(la*ea-fa*ka)*oa;g[ta+488+28>>2]=0.0;g[ta+488+32>>2]=(ha*ea-fa*ma)*Z+(la*ea+fa*ka)*_+(1.0-(ha*ka+la*ma))*$;g[ta+488+36>>2]=(ha*ea-fa*ma)*aa+(la*ea+fa*ka)*ba+(1.0-(ha*ka+la*ma))*ca;g[ta+488+40>>2]=(ha*ea-fa*ma)*da+(la*ea+fa*ka)*ga+(1.0-(ha*ka+la*ma))*oa;g[ta+488+44>>2]=0.0;sa=c[e+12>>2]|0;c[u>>2]=c[sa>>2];c[u+4>>2]=c[sa+4>>2];c[u+8>>2]=c[sa+8>>2];c[u+12>>2]=c[sa+12>>2];c[L>>2]=c[sa+16>>2];c[L+4>>2]=c[sa+16+4>>2];c[L+8>>2]=c[sa+16+8>>2];c[L+12>>2]=c[sa+16+12>>2];c[M>>2]=c[sa+32>>2];c[M+4>>2]=c[sa+32+4>>2];c[M+8>>2]=c[sa+32+8>>2];c[M+12>>2]=c[sa+32+12>>2];c[N>>2]=c[sa+48>>2];c[N+4>>2]=c[sa+48+4>>2];c[N+8>>2]=c[sa+48+8>>2];c[N+12>>2]=c[sa+48+12>>2]}else{sa=c[d+12>>2]|0;c[ta+488>>2]=c[sa>>2];c[ta+488+4>>2]=c[sa+4>>2];c[ta+488+8>>2]=c[sa+8>>2];c[ta+488+12>>2]=c[sa+12>>2];c[n>>2]=c[sa+16>>2];c[n+4>>2]=c[sa+16+4>>2];c[n+8>>2]=c[sa+16+8>>2];c[n+12>>2]=c[sa+16+12>>2];c[s>>2]=c[sa+32>>2];c[s+4>>2]=c[sa+32+4>>2];c[s+8>>2]=c[sa+32+8>>2];c[s+12>>2]=c[sa+32+12>>2];c[t>>2]=c[sa+48>>2];c[t+4>>2]=c[sa+48+4>>2];c[t+8>>2]=c[sa+48+8>>2];c[t+12>>2]=c[sa+48+12>>2];ha=p*(r*-p+(v*q+x*-o)-w*-i)+(i*(x*q-r*-i-v*-o-w*-p)+q*(w*-o+(r*q+x*-i)-v*-p))-o*(v*-i+(w*q+x*-p)-r*-o);la=i*(v*-i+(w*q+x*-p)-r*-o)+(q*(r*-p+(v*q+x*-o)-w*-i)+o*(x*q-r*-i-v*-o-w*-p))-p*(w*-o+(r*q+x*-i)-v*-p);Y=o*(w*-o+(r*q+x*-i)-v*-p)+(p*(x*q-r*-i-v*-o-w*-p)+q*(v*-i+(w*q+x*-p)-r*-o))-i*(r*-p+(v*q+x*-o)-w*-i);fa=q*(x*q-r*-i-v*-o-w*-p)-i*(w*-o+(r*q+x*-i)-v*-p)-o*(r*-p+(v*q+x*-o)-w*-i)-p*(v*-i+(w*q+x*-p)-r*-o);ka=ha*(2.0/(fa*fa+(Y*Y+(ha*ha+la*la))));ma=la*(2.0/(fa*fa+(Y*Y+(ha*ha+la*la))));ea=Y*(2.0/(fa*fa+(Y*Y+(ha*ha+la*la))));sa=c[e+12>>2]|0;Z=+g[sa>>2];_=+g[sa+16>>2];$=+g[sa+32>>2];aa=+g[sa+4>>2];ba=+g[sa+20>>2];ca=+g[sa+36>>2];da=+g[sa+8>>2];ga=+g[sa+24>>2];oa=+g[sa+40>>2];g[ta+488+64>>2]=(1.0-(la*ma+Y*ea))*Z+(ha*ma-fa*ea)*_+(ha*ea+fa*ma)*$;g[ta+488+68>>2]=(1.0-(la*ma+Y*ea))*aa+(ha*ma-fa*ea)*ba+(ha*ea+fa*ma)*ca;g[ta+488+72>>2]=(1.0-(la*ma+Y*ea))*da+(ha*ma-fa*ea)*ga+(ha*ea+fa*ma)*oa;g[ta+488+76>>2]=0.0;g[ta+488+80>>2]=(ha*ma+fa*ea)*Z+(1.0-(ha*ka+Y*ea))*_+(la*ea-fa*ka)*$;g[ta+488+84>>2]=(ha*ma+fa*ea)*aa+(1.0-(ha*ka+Y*ea))*ba+(la*ea-fa*ka)*ca;g[ta+488+88>>2]=(ha*ma+fa*ea)*da+(1.0-(ha*ka+Y*ea))*ga+(la*ea-fa*ka)*oa;g[ta+488+92>>2]=0.0;g[ta+488+96>>2]=(ha*ea-fa*ma)*Z+(la*ea+fa*ka)*_+(1.0-(ha*ka+la*ma))*$;g[ta+488+100>>2]=(ha*ea-fa*ma)*aa+(la*ea+fa*ka)*ba+(1.0-(ha*ka+la*ma))*ca;g[ta+488+104>>2]=(ha*ea-fa*ma)*da+(la*ea+fa*ka)*ga+(1.0-(ha*ka+la*ma))*oa;g[ta+488+108>>2]=0.0}j=c[f+20>>2]|0;g[ta+760+32>>2]=0.0;c[ta+760>>2]=6484;c[ta+760+36>>2]=h;c[ta+760+40>>2]=c[ta+488>>2];c[ta+760+40+4>>2]=c[ta+488+4>>2];c[ta+760+40+8>>2]=c[ta+488+8>>2];c[ta+760+40+12>>2]=c[ta+488+12>>2];c[ta+760+56>>2]=c[n>>2];c[ta+760+56+4>>2]=c[n+4>>2];c[ta+760+56+8>>2]=c[n+8>>2];c[ta+760+56+12>>2]=c[n+12>>2];c[ta+760+72>>2]=c[s>>2];c[ta+760+72+4>>2]=c[s+4>>2];c[ta+760+72+8>>2]=c[s+8>>2];c[ta+760+72+12>>2]=c[s+12>>2];c[ta+760+88>>2]=c[t>>2];c[ta+760+88+4>>2]=c[t+4>>2];c[ta+760+88+8>>2]=c[t+8>>2];c[ta+760+88+12>>2]=c[t+12>>2];c[ta+760+104>>2]=c[u>>2];c[ta+760+104+4>>2]=c[u+4>>2];c[ta+760+104+8>>2]=c[u+8>>2];c[ta+760+104+12>>2]=c[u+12>>2];c[ta+760+120>>2]=c[L>>2];c[ta+760+120+4>>2]=c[L+4>>2];c[ta+760+120+8>>2]=c[L+8>>2];c[ta+760+120+12>>2]=c[L+12>>2];c[ta+760+136>>2]=c[M>>2];c[ta+760+136+4>>2]=c[M+4>>2];c[ta+760+136+8>>2]=c[M+8>>2];c[ta+760+136+12>>2]=c[M+12>>2];c[ta+760+152>>2]=c[N>>2];c[ta+760+152+4>>2]=c[N+4>>2];c[ta+760+152+8>>2]=c[N+8>>2];c[ta+760+152+12>>2]=c[N+12>>2];c[ta+760+168>>2]=c[ta+1e3>>2];c[ta+760+168+4>>2]=c[ta+1e3+4>>2];c[ta+760+168+8>>2]=c[ta+1e3+8>>2];c[ta+760+168+12>>2]=c[ta+1e3+12>>2];c[ta+760+184>>2]=c[ta+1e3+16>>2];c[ta+760+184+4>>2]=c[ta+1e3+16+4>>2];c[ta+760+184+8>>2]=c[ta+1e3+16+8>>2];c[ta+760+184+12>>2]=c[ta+1e3+16+12>>2];c[ta+760+200>>2]=c[ta+1e3+32>>2];c[ta+760+200+4>>2]=c[ta+1e3+32+4>>2];c[ta+760+200+8>>2]=c[ta+1e3+32+8>>2];c[ta+760+200+12>>2]=c[ta+1e3+32+12>>2];c[ta+760+216>>2]=c[ta+1e3+48>>2];c[ta+760+216+4>>2]=c[ta+1e3+48+4>>2];c[ta+760+216+8>>2]=c[ta+1e3+48+8>>2];c[ta+760+216+12>>2]=c[ta+1e3+48+12>>2];a[ta+760+232>>0]=B>2]=j;Dc(ta+48|0,ta+488|0,ta+760|0,j,0);j=c[b+64>>2]|0}k=k+1|0}while((k|0)<(j|0))}}if(!(a[b+52>>0]|0)){l=ta;return}k=c[h+4>>2]|0;if(!(c[k+780>>2]|0)){l=ta;return}m=c[k+772>>2]|0;n=c[(c[h+8>>2]|0)+8>>2]|0;j=c[(c[h+12>>2]|0)+8>>2]|0;if((m|0)==(n|0)){af(k,m+4|0,j+4|0);l=ta;return}else{af(k,j+4|0,n+4|0);l=ta;return}}function fc(b){b=b|0;var d=0,e=0,f=0,h=0,i=0.0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,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.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0.0,ga=0.0;W=l;l=l+176|0;ci(b);if(!(xb[c[(c[b>>2]|0)+20>>2]&127](b)|0)){l=W;return}if((c[b+348>>2]|0)<=0){l=W;return}Q=W+96+32|0;R=W+96+52|0;N=0;do{S=c[(c[b+356>>2]|0)+(N<<2)>>2]|0;if(xb[c[(c[b>>2]|0)+20>>2]&127](b)|0?(M=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0,(xb[c[(c[M>>2]|0)+56>>2]&127](M)|0)&1|0):0){e=c[b+72>>2]|0;if(!(a[S+533>>0]|0))M=e;else{c[W+80>>2]=c[S+580>>2];c[W+80+4>>2]=c[S+580+4>>2];c[W+80+8>>2]=c[S+580+8>>2];c[W+80+12>>2]=c[S+580+12>>2];i=+g[S+644>>2];k=+g[S+596>>2];m=+g[S+660>>2];s=+g[S+600>>2];t=+g[S+676>>2];u=+g[S+604>>2];v=+g[S+648>>2];w=+g[S+664>>2];x=+g[S+680>>2];y=+g[S+652>>2];z=+g[S+668>>2];A=+g[S+684>>2];B=+g[S+612>>2];C=+g[S+616>>2];E=+g[S+620>>2];F=+g[S+628>>2];G=+g[S+632>>2];H=+g[S+636>>2];ga=i*k+m*s+t*u+(k*v+s*w+u*x)*0.0+(k*y+s*z+u*A)*0.0;ea=(y*B+z*C+A*E)*0.0+(i*B+m*C+t*E+(v*B+w*C+x*E)*0.0);da=(y*F+z*G+A*H)*0.0+(i*F+m*G+t*H+(v*F+w*G+x*H)*0.0);fa=1.0/+D(+(ga*ga+ea*ea+da*da));ca=(i*k+m*s+t*u)*0.0+(k*v+s*w+u*x)+(k*y+s*z+u*A)*0.0;aa=(y*B+z*C+A*E)*0.0+(v*B+w*C+x*E+(i*B+m*C+t*E)*0.0);$=(y*F+z*G+A*H)*0.0+(v*F+w*G+x*H+(i*F+m*G+t*H)*0.0);ba=1.0/+D(+(ca*ca+aa*aa+$*$));_=(i*k+m*s+t*u)*0.0+(k*v+s*w+u*x)*0.0+(k*y+s*z+u*A);Y=y*B+z*C+A*E+((i*B+m*C+t*E)*0.0+(v*B+w*C+x*E)*0.0);X=y*F+z*G+A*H+((i*F+m*G+t*H)*0.0+(v*F+w*G+x*H)*0.0);Z=1.0/+D(+(_*_+Y*Y+X*X));M=c[(c[e>>2]|0)+16>>2]|0;ea=ea*fa*10.0+ +g[W+80+4>>2];da=fa*da*10.0+ +g[W+80+8>>2];g[W+160>>2]=ga*fa*10.0+ +g[W+80>>2];g[W+160+4>>2]=ea;g[W+160+8>>2]=da;g[W+160+12>>2]=0.0;c[W+96>>2]=1065353216;c[W+96+4>>2]=0;c[W+96+8>>2]=0;g[W+96+12>>2]=0.0;Vb[M&127](e,W+80|0,W+160|0,W+96|0);M=c[(c[e>>2]|0)+16>>2]|0;aa=aa*ba*10.0+ +g[W+80+4>>2];$=ba*$*10.0+ +g[W+80+8>>2];g[W+160>>2]=ca*ba*10.0+ +g[W+80>>2];g[W+160+4>>2]=aa;g[W+160+8>>2]=$;g[W+160+12>>2]=0.0;c[W+96>>2]=0;c[W+96+4>>2]=1065353216;c[W+96+8>>2]=0;g[W+96+12>>2]=0.0;Vb[M&127](e,W+80|0,W+160|0,W+96|0);M=c[(c[e>>2]|0)+16>>2]|0;Y=Y*Z*10.0+ +g[W+80+4>>2];X=Z*X*10.0+ +g[W+80+8>>2];g[W+160>>2]=_*Z*10.0+ +g[W+80>>2];g[W+160+4>>2]=Y;g[W+160+8>>2]=X;g[W+160+12>>2]=0.0;c[W+96>>2]=0;c[W+96+4>>2]=0;c[W+96+8>>2]=1065353216;g[W+96+12>>2]=0.0;Vb[M&127](e,W+80|0,W+160|0,W+96|0);if((c[S+544>>2]|0)>0){d=0;do{M=c[S+552>>2]|0;ca=+g[M+(d<<4)>>2];da=+g[M+(d<<4)+4>>2];ga=+g[M+(d<<4)+8>>2];ea=+g[W+80>>2]+((i*k+m*s+t*u)*ca+(k*v+s*w+u*x)*da+(k*y+s*z+u*A)*ga);fa=+g[W+80+4>>2]+((i*B+m*C+t*E)*ca+(v*B+w*C+x*E)*da+(y*B+z*C+A*E)*ga);ga=(i*F+m*G+t*H)*ca+(v*F+w*G+x*H)*da+(y*F+z*G+A*H)*ga+ +g[W+80+8>>2];c[W+64>>2]=1065353216;c[W+64+4>>2]=0;c[W+64+8>>2]=1065353216;g[W+64+12>>2]=0.0;M=c[(c[e>>2]|0)+16>>2]|0;g[W+160>>2]=ea+-.10000000149011612;g[W+160+4>>2]=fa;g[W+160+8>>2]=ga;g[W+160+12>>2]=0.0;g[W+96>>2]=ea+.10000000149011612;g[W+96+4>>2]=fa+0.0;g[W+96+8>>2]=ga+0.0;g[W+96+12>>2]=0.0;Vb[M&127](e,W+160|0,W+96|0,W+64|0);M=c[(c[e>>2]|0)+16>>2]|0;g[W+160>>2]=ea;g[W+160+4>>2]=fa+-.10000000149011612;g[W+160+8>>2]=ga;g[W+160+12>>2]=0.0;g[W+96>>2]=ea+0.0;g[W+96+4>>2]=fa+.10000000149011612;g[W+96+8>>2]=ga+0.0;g[W+96+12>>2]=0.0;Vb[M&127](e,W+160|0,W+96|0,W+64|0);M=c[(c[e>>2]|0)+16>>2]|0;g[W+160>>2]=ea;g[W+160+4>>2]=fa;g[W+160+8>>2]=ga+-.10000000149011612;g[W+160+12>>2]=0.0;g[W+96>>2]=ea+0.0;g[W+96+4>>2]=fa+0.0;g[W+96+8>>2]=ga+.10000000149011612;g[W+96+12>>2]=0.0;Vb[M&127](e,W+160|0,W+96|0,W+64|0);d=d+1|0}while((d|0)<(c[S+544>>2]|0))}M=c[b+72>>2]|0}L=c[b+364>>2]|0;c[W+80>>2]=0;c[W+80+4>>2]=0;c[W+80+8>>2]=0;c[W+80+12>>2]=0;c[W+64>>2]=1065353216;c[W+64+4>>2]=1065353216;c[W+64+8>>2]=1065353216;g[W+64+12>>2]=0.0;c[W+48>>2]=1065353216;c[W+48+4>>2]=0;c[W+48+8>>2]=0;g[W+48+12>>2]=0.0;if(!(L&256)){if(L&1|0?(T=c[S+772>>2]|0,(T|0)>0):0){f=0;d=T;do{e=c[S+780>>2]|0;if(c[(c[e+(f*104|0)+4>>2]|0)+16>>2]&1){d=c[(c[M>>2]|0)+16>>2]|0;K=e+(f*104|0)+8|0;I=e+(f*104|0)+12|0;q=c[I>>2]|0;J=e+(f*104|0)+16|0;r=c[J>>2]|0;g[W+160>>2]=+g[K>>2]+-.10000000149011612;c[W+160+4>>2]=q;c[W+160+8>>2]=r;g[W+160+12>>2]=0.0;fa=+g[I>>2]+0.0;ga=+g[J>>2]+0.0;g[W+96>>2]=+g[K>>2]+.10000000149011612;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;c[W+32>>2]=1065353216;c[W+32+4>>2]=0;c[W+32+8>>2]=0;g[W+32+12>>2]=0.0;Vb[d&127](M,W+160|0,W+96|0,W+32|0);d=c[(c[M>>2]|0)+16>>2]|0;ga=+g[I>>2]+-.10000000149011612;r=c[J>>2]|0;c[W+160>>2]=c[K>>2];g[W+160+4>>2]=ga;c[W+160+8>>2]=r;g[W+160+12>>2]=0.0;ga=+g[I>>2]+.10000000149011612;fa=+g[J>>2]+0.0;g[W+96>>2]=+g[K>>2]+0.0;g[W+96+4>>2]=ga;g[W+96+8>>2]=fa;g[W+96+12>>2]=0.0;c[W+32>>2]=0;c[W+32+4>>2]=1065353216;c[W+32+8>>2]=0;g[W+32+12>>2]=0.0;Vb[d&127](M,W+160|0,W+96|0,W+32|0);d=c[(c[M>>2]|0)+16>>2]|0;r=c[I>>2]|0;fa=+g[J>>2]+-.10000000149011612;c[W+160>>2]=c[K>>2];c[W+160+4>>2]=r;g[W+160+8>>2]=fa;g[W+160+12>>2]=0.0;fa=+g[I>>2]+0.0;ga=+g[J>>2]+.10000000149011612;g[W+96>>2]=+g[K>>2]+0.0;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;c[W+32>>2]=0;c[W+32+4>>2]=0;c[W+32+8>>2]=1065353216;g[W+32+12>>2]=0.0;Vb[d&127](M,W+160|0,W+96|0,W+32|0);d=c[S+772>>2]|0}f=f+1|0}while((f|0)<(d|0))}if(L&2|0?(U=c[S+792>>2]|0,(U|0)>0):0){f=0;d=U;do{e=c[S+800>>2]|0;if(c[(c[e+(f*52|0)+4>>2]|0)+16>>2]&1){Vb[c[(c[M>>2]|0)+16>>2]&127](M,(c[e+(f*52|0)+24>>2]|0)+8|0,(c[e+(f*52|0)+28>>2]|0)+8|0,W+80|0);d=c[S+792>>2]|0}f=f+1|0}while((f|0)<(d|0))}if(L&16|0?(V=c[S+772>>2]|0,(V|0)>0):0){f=0;d=V;do{e=c[S+780>>2]|0;if(c[(c[e+(f*104|0)+4>>2]|0)+16>>2]&1){ea=+g[e+(f*104|0)+72>>2]*.5;ga=+g[e+(f*104|0)+76>>2]*.5;fa=+g[e+(f*104|0)+80>>2]*.5;K=c[(c[M>>2]|0)+16>>2]|0;d=e+(f*104|0)+8|0;I=e+(f*104|0)+12|0;ca=ga+ +g[I>>2];J=e+(f*104|0)+16|0;da=fa+ +g[J>>2];g[W+160>>2]=ea+ +g[d>>2];g[W+160+4>>2]=ca;g[W+160+8>>2]=da;g[W+160+12>>2]=0.0;Vb[K&127](M,d,W+160|0,W+64|0);K=c[(c[M>>2]|0)+16>>2]|0;ga=+g[I>>2]-ga;fa=+g[J>>2]-fa;g[W+160>>2]=+g[d>>2]-ea;g[W+160+4>>2]=ga;g[W+160+8>>2]=fa;g[W+160+12>>2]=0.0;fa=+g[W+64+4>>2]*.5;ga=+g[W+64+8>>2]*.5;g[W+96>>2]=+g[W+64>>2]*.5;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;Vb[K&127](M,d,W+160|0,W+96|0);d=c[S+772>>2]|0}f=f+1|0}while((f|0)<(d|0))}if(L&32|0){if((a[22472]|0)==0?Uz(22472)|0:0){c[5774]=1065353216;c[5775]=0;c[5776]=0;c[5777]=0;c[5778]=0;c[5779]=1065353216;c[5780]=0;c[5781]=0;c[5782]=0;c[5783]=0;c[5784]=1065353216;g[5785]=0.0}if((c[S+872>>2]|0)>0){d=0;do{K=c[S+880>>2]|0;I=c[K+(d*104|0)+24>>2]|0;B=+g[I+8>>2];J=K+(d*104|0)+4|0;C=+g[J>>2];G=+g[I+12>>2];r=K+(d*104|0)+8|0;H=+g[r>>2];fa=+g[I+16>>2];I=K+(d*104|0)+12|0;da=+g[I>>2];ba=+g[K+(d*104|0)+20>>2]+(B*C+G*H+fa*da);g[W+160>>2]=B-C*ba;g[W+160+4>>2]=G-H*ba;g[W+160+8>>2]=fa-da*ba;g[W+160+12>>2]=0.0;X=+g[J>>2];Z=+g[r>>2];E=+g[I>>2];K=+g[K+(d*104|0)+4+((!(X>2]>2];Y=+g[23096+(K<<4)+4>>2];_=+g[23096+(K<<4)>>2];$=1.0/+D(+((X*Y-Z*_)*(X*Y-Z*_)+((Z*F-E*Y)*(Z*F-E*Y)+(E*_-X*F)*(E*_-X*F))));aa=E*(E*_-X*F)*$-Z*(X*Y-Z*_)*$;ca=X*(X*Y-Z*_)*$-E*(Z*F-E*Y)*$;ga=Z*(Z*F-E*Y)*$-X*(E*_-X*F)*$;ea=1.0/+D(+(ga*ga+(aa*aa+ca*ca)));K=c[(c[M>>2]|0)+16>>2]|0;g[W+96>>2]=B-C*ba-(Z*F-E*Y)*$*.5;g[W+96+4>>2]=G-H*ba-(E*_-X*F)*$*.5;g[W+96+8>>2]=fa-da*ba-(X*Y-Z*_)*$*.5;g[W+96+12>>2]=0.0;g[W+32>>2]=(Z*F-E*Y)*$*.5+(B-C*ba);g[W+32+4>>2]=(E*_-X*F)*$*.5+(G-H*ba);g[W+32+8>>2]=(X*Y-Z*_)*$*.5+(fa-da*ba);g[W+32+12>>2]=0.0;Vb[K&127](M,W+96|0,W+32|0,W+48|0);K=c[(c[M>>2]|0)+16>>2]|0;ba=+g[W+160>>2];da=+g[W+160+4>>2];fa=+g[W+160+8>>2];g[W+96>>2]=ba-ea*aa*.5;g[W+96+4>>2]=da-ea*ca*.5;g[W+96+8>>2]=fa-ea*ga*.5;g[W+96+12>>2]=0.0;g[W+32>>2]=ea*aa*.5+ba;g[W+32+4>>2]=ea*ca*.5+da;g[W+32+8>>2]=ea*ga*.5+fa;g[W+32+12>>2]=0.0;Vb[K&127](M,W+96|0,W+32|0,W+48|0);K=c[(c[M>>2]|0)+16>>2]|0;fa=+g[r>>2]*.5*3.0+ +g[W+160+4>>2];ga=+g[I>>2]*.5*3.0+ +g[W+160+8>>2];g[W+96>>2]=+g[J>>2]*.5*3.0+ +g[W+160>>2];g[W+96+4>>2]=fa;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;c[W+32>>2]=1065353216;c[W+32+4>>2]=1065353216;c[W+32+8>>2]=0;g[W+32+12>>2]=0.0;Vb[K&127](M,W+160|0,W+96|0,W+32|0);d=d+1|0}while((d|0)<(c[S+872>>2]|0))}}if(L&4|0?(c[W+160>>2]=0,c[W+160+4>>2]=1060320051,c[W+160+8>>2]=0,g[W+160+12>>2]=0.0,O=c[S+812>>2]|0,(O|0)>0):0){f=0;d=O;do{e=c[S+820>>2]|0;if(c[(c[e+(f*44|0)+4>>2]|0)+16>>2]&1){d=c[e+(f*44|0)+8>>2]|0;_=+g[d+8>>2];ba=+g[d+12>>2];ea=+g[d+16>>2];d=c[e+(f*44|0)+12>>2]|0;$=+g[d+8>>2];ca=+g[d+12>>2];fa=+g[d+16>>2];d=c[e+(f*44|0)+16>>2]|0;aa=+g[d+8>>2];da=+g[d+12>>2];ga=+g[d+16>>2];d=c[(c[M>>2]|0)+36>>2]|0;g[W+96>>2]=(_+$+aa)*.3333333432674408+(_-(_+$+aa)*.3333333432674408)*.800000011920929;g[W+96+4>>2]=(ba+ca+da)*.3333333432674408+(ba-(ba+ca+da)*.3333333432674408)*.800000011920929;g[W+96+8>>2]=(ea+fa+ga)*.3333333432674408+(ea-(ea+fa+ga)*.3333333432674408)*.800000011920929;g[W+96+12>>2]=0.0;g[W+32>>2]=(_+$+aa)*.3333333432674408+($-(_+$+aa)*.3333333432674408)*.800000011920929;g[W+32+4>>2]=(ba+ca+da)*.3333333432674408+(ca-(ba+ca+da)*.3333333432674408)*.800000011920929;g[W+32+8>>2]=(ea+fa+ga)*.3333333432674408+(fa-(ea+fa+ga)*.3333333432674408)*.800000011920929;g[W+32+12>>2]=0.0;g[W+16>>2]=(_+$+aa)*.3333333432674408+(aa-(_+$+aa)*.3333333432674408)*.800000011920929;g[W+16+4>>2]=(ba+ca+da)*.3333333432674408+(da-(ba+ca+da)*.3333333432674408)*.800000011920929;g[W+16+8>>2]=(ea+fa+ga)*.3333333432674408+(ga-(ea+fa+ga)*.3333333432674408)*.800000011920929;g[W+16+12>>2]=0.0;_b[d&0](M,W+96|0,W+32|0,W+16|0,W+160|0,1.0);d=c[S+812>>2]|0}f=f+1|0}while((f|0)<(d|0))}if(L&8|0?(c[W+160>>2]=1050253722,c[W+160+4>>2]=1050253722,c[W+160+8>>2]=1060320051,g[W+160+12>>2]=0.0,P=c[S+832>>2]|0,(P|0)>0):0){f=0;d=P;do{e=c[S+840>>2]|0;if(c[(c[e+(f*104|0)+4>>2]|0)+16>>2]&1){d=c[e+(f*104|0)+8>>2]|0;y=+g[d+8>>2];B=+g[d+12>>2];F=+g[d+16>>2];d=c[e+(f*104|0)+12>>2]|0;z=+g[d+8>>2];C=+g[d+12>>2];G=+g[d+16>>2];d=c[e+(f*104|0)+16>>2]|0;A=+g[d+8>>2];E=+g[d+12>>2];H=+g[d+16>>2];d=c[e+(f*104|0)+20>>2]|0;ea=+g[d+8>>2];fa=+g[d+12>>2];ga=+g[d+16>>2];d=c[(c[M>>2]|0)+36>>2]|0;ba=(y+z+A+ea)*.25+(y-(y+z+A+ea)*.25)*.800000011920929;ca=(B+C+E+fa)*.25+(B-(B+C+E+fa)*.25)*.800000011920929;da=(F+G+H+ga)*.25+(F-(F+G+H+ga)*.25)*.800000011920929;g[W+96>>2]=ba;g[W+96+4>>2]=ca;g[W+96+8>>2]=da;g[W+96+12>>2]=0.0;X=(y+z+A+ea)*.25+(z-(y+z+A+ea)*.25)*.800000011920929;Y=(B+C+E+fa)*.25+(C-(B+C+E+fa)*.25)*.800000011920929;Z=(F+G+H+ga)*.25+(G-(F+G+H+ga)*.25)*.800000011920929;g[W+32>>2]=X;g[W+32+4>>2]=Y;g[W+32+8>>2]=Z;g[W+32+12>>2]=0.0;_=(y+z+A+ea)*.25+(A-(y+z+A+ea)*.25)*.800000011920929;$=(B+C+E+fa)*.25+(E-(B+C+E+fa)*.25)*.800000011920929;aa=(F+G+H+ga)*.25+(H-(F+G+H+ga)*.25)*.800000011920929;g[W+16>>2]=_;g[W+16+4>>2]=$;g[W+16+8>>2]=aa;g[W+16+12>>2]=0.0;_b[d&0](M,W+96|0,W+32|0,W+16|0,W+160|0,1.0);d=c[(c[M>>2]|0)+36>>2]|0;g[W+96>>2]=ba;g[W+96+4>>2]=ca;g[W+96+8>>2]=da;g[W+96+12>>2]=0.0;g[W+32>>2]=X;g[W+32+4>>2]=Y;g[W+32+8>>2]=Z;g[W+32+12>>2]=0.0;ea=(y+z+A+ea)*.25+(ea-(y+z+A+ea)*.25)*.800000011920929;fa=(B+C+E+fa)*.25+(fa-(B+C+E+fa)*.25)*.800000011920929;ga=(F+G+H+ga)*.25+(ga-(F+G+H+ga)*.25)*.800000011920929;g[W+16>>2]=ea;g[W+16+4>>2]=fa;g[W+16+8>>2]=ga;g[W+16+12>>2]=0.0;_b[d&0](M,W+96|0,W+32|0,W+16|0,W+160|0,1.0);d=c[(c[M>>2]|0)+36>>2]|0;g[W+96>>2]=X;g[W+96+4>>2]=Y;g[W+96+8>>2]=Z;g[W+96+12>>2]=0.0;g[W+32>>2]=_;g[W+32+4>>2]=$;g[W+32+8>>2]=aa;g[W+32+12>>2]=0.0;g[W+16>>2]=ea;g[W+16+4>>2]=fa;g[W+16+8>>2]=ga;g[W+16+12>>2]=0.0;_b[d&0](M,W+96|0,W+32|0,W+16|0,W+160|0,1.0);d=c[(c[M>>2]|0)+36>>2]|0;g[W+96>>2]=_;g[W+96+4>>2]=$;g[W+96+8>>2]=aa;g[W+96+12>>2]=0.0;g[W+32>>2]=ba;g[W+32+4>>2]=ca;g[W+32+8>>2]=da;g[W+32+12>>2]=0.0;g[W+16>>2]=ea;g[W+16+4>>2]=fa;g[W+16+8>>2]=ga;g[W+16+12>>2]=0.0;_b[d&0](M,W+96|0,W+32|0,W+16|0,W+160|0,1.0);d=c[S+832>>2]|0}f=f+1|0}while((f|0)<(d|0))}}else{LI();d=c[S+1112>>2]|0;if((d|0)>0){K=0;do{if(a[(c[(c[S+1120>>2]|0)+(K<<2)>>2]|0)+377>>0]|0){da=+(rs()|0)*4.656612873077393e-10;ea=+(rs()|0)*4.656612873077393e-10;fa=+(rs()|0)*4.656612873077393e-10;ga=1.0/+D(+(fa*fa+(da*da+ea*ea)));g[W+160>>2]=da*ga*.75;g[W+160+4>>2]=ea*ga*.75;g[W+160+8>>2]=fa*ga*.75;g[W+160+12>>2]=0.0;f=c[(c[(c[S+1120>>2]|0)+(K<<2)>>2]|0)+24>>2]|0;if((f|0)>0){c[6995]=(c[6995]|0)+1;d=sc((f<<4|3)+16|0)|0;if(!d)e=0;else{c[(d+4+15&-16)+-4>>2]=d;e=d+4+15&-16}d=0;do{J=e+(d<<4)|0;c[J>>2]=c[W+96>>2];c[J+4>>2]=c[W+96+4>>2];c[J+8>>2]=c[W+96+8>>2];c[J+12>>2]=c[W+96+12>>2];d=d+1|0}while((d|0)!=(f|0));d=0;do{I=(c[(c[(c[(c[S+1120>>2]|0)+(K<<2)>>2]|0)+32>>2]|0)+(d<<2)>>2]|0)+8|0;J=e+(d<<4)|0;c[J>>2]=c[I>>2];c[J+4>>2]=c[I+4>>2];c[J+8>>2]=c[I+8>>2];c[J+12>>2]=c[I+12>>2];d=d+1|0}while((d|0)!=(f|0));J=e;I=e}else{J=0;I=0}a[W+96+16>>0]=1;c[W+96+12>>2]=0;c[W+96+4>>2]=0;c[W+96+8>>2]=0;a[W+96+36>>0]=1;c[Q>>2]=0;c[W+96+24>>2]=0;c[W+96+28>>2]=0;a[W+96+56>>0]=1;c[R>>2]=0;c[W+96+44>>2]=0;c[W+96+48>>2]=0;uc(W+96|0,I,f);q=c[W+96+44>>2]|0;if((q|0)>0){o=c[Q>>2]|0;n=0;do{r=c[(c[R>>2]|0)+(n<<2)>>2]|0;e=c[o+(r*12|0)+4>>2]|0;d=o+(r*12|0)+(e*12|0)+((c[o+(r*12|0)+(e*12|0)>>2]|0)*12|0)|0;if((d|0)!=(o+(r*12|0)|0)){p=c[W+96+12>>2]|0;e=c[o+(r*12|0)+(e*12|0)+8>>2]|0;f=c[o+(r*12|0)+8>>2]|0;while(1){h=c[d+8>>2]|0;_b[c[(c[M>>2]|0)+36>>2]&0](M,p+(e<<4)|0,p+(f<<4)|0,p+(h<<4)|0,W+160|0,1.0);e=d+((c[d+4>>2]|0)*12|0)|0;d=e+((c[e>>2]|0)*12|0)|0;if((d|0)==(o+(r*12|0)|0))break;else{e=f;f=h}}}n=n+1|0}while((n|0)<(q|0))}d=c[R>>2]|0;if(d|0){if(a[W+96+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[R>>2]=0}a[W+96+56>>0]=1;c[R>>2]=0;c[W+96+44>>2]=0;c[W+96+48>>2]=0;d=c[Q>>2]|0;if(d|0){if(a[W+96+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[Q>>2]=0}a[W+96+36>>0]=1;c[Q>>2]=0;c[W+96+24>>2]=0;c[W+96+28>>2]=0;d=c[W+96+12>>2]|0;if(d|0){if(a[W+96+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[W+96+12>>2]=0}if(!((J|0)==0|(I|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[I+-4>>2]|0)}d=c[S+1112>>2]|0}K=K+1|0}while((K|0)<(d|0))}}if(L&64|0){if((c[S+852>>2]|0)>0){d=0;do{K=c[S+860>>2]|0;q=c[K+(d*96|0)+20>>2]|0;ca=+g[K+(d*96|0)+4>>2];da=+g[K+(d*96|0)+8>>2];ea=+g[K+(d*96|0)+12>>2];fa=ca*+g[q+20>>2]+da*+g[q+24>>2]+ea*+g[q+28>>2]+ +g[q+56>>2];ga=ca*+g[q+36>>2]+da*+g[q+40>>2]+ea*+g[q+44>>2]+ +g[q+60>>2];g[W+32>>2]=ca*+g[q+4>>2]+da*+g[q+8>>2]+ea*+g[q+12>>2]+ +g[q+52>>2];g[W+32+4>>2]=fa;g[W+32+8>>2]=ga;g[W+32+12>>2]=0.0;K=K+(d*96|0)|0;q=c[K>>2]|0;c[W+16>>2]=1065353216;c[W+16+4>>2]=0;c[W+16+8>>2]=0;g[W+16+12>>2]=0.0;J=c[(c[M>>2]|0)+16>>2]|0;ga=+g[q+8>>2];I=c[q+12>>2]|0;r=c[q+16>>2]|0;g[W+160>>2]=ga+-.25;c[W+160+4>>2]=I;c[W+160+8>>2]=r;g[W+160+12>>2]=0.0;fa=(c[j>>2]=I,+g[j>>2])+0.0;ea=(c[j>>2]=r,+g[j>>2])+0.0;g[W+96>>2]=ga+.25;g[W+96+4>>2]=fa;g[W+96+8>>2]=ea;g[W+96+12>>2]=0.0;Vb[J&127](M,W+160|0,W+96|0,W+16|0);J=c[(c[M>>2]|0)+16>>2]|0;r=c[q+8>>2]|0;ea=+g[q+12>>2];I=c[q+16>>2]|0;c[W+160>>2]=r;g[W+160+4>>2]=ea+-.25;c[W+160+8>>2]=I;g[W+160+12>>2]=0.0;fa=(c[j>>2]=r,+g[j>>2])+0.0;ga=(c[j>>2]=I,+g[j>>2])+0.0;g[W+96>>2]=fa;g[W+96+4>>2]=ea+.25;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;Vb[J&127](M,W+160|0,W+96|0,W+16|0);J=c[(c[M>>2]|0)+16>>2]|0;I=c[q+8>>2]|0;r=c[q+12>>2]|0;ga=+g[q+16>>2];c[W+160>>2]=I;c[W+160+4>>2]=r;g[W+160+8>>2]=ga+-.25;g[W+160+12>>2]=0.0;ea=(c[j>>2]=I,+g[j>>2])+0.0;fa=(c[j>>2]=r,+g[j>>2])+0.0;g[W+96>>2]=ea;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga+.25;g[W+96+12>>2]=0.0;Vb[J&127](M,W+160|0,W+96|0,W+16|0);c[W+16>>2]=0;c[W+16+4>>2]=1065353216;c[W+16+8>>2]=0;g[W+16+12>>2]=0.0;J=c[(c[M>>2]|0)+16>>2]|0;ga=+g[W+32>>2];r=c[W+32+4>>2]|0;I=c[W+32+8>>2]|0;g[W+160>>2]=ga+-.25;c[W+160+4>>2]=r;c[W+160+8>>2]=I;g[W+160+12>>2]=0.0;fa=(c[j>>2]=r,+g[j>>2])+0.0;ea=(c[j>>2]=I,+g[j>>2])+0.0;g[W+96>>2]=ga+.25;g[W+96+4>>2]=fa;g[W+96+8>>2]=ea;g[W+96+12>>2]=0.0;Vb[J&127](M,W+160|0,W+96|0,W+16|0);J=c[(c[M>>2]|0)+16>>2]|0;I=c[W+32>>2]|0;ea=+g[W+32+4>>2];r=c[W+32+8>>2]|0;c[W+160>>2]=I;g[W+160+4>>2]=ea+-.25;c[W+160+8>>2]=r;g[W+160+12>>2]=0.0;fa=(c[j>>2]=I,+g[j>>2])+0.0;ga=(c[j>>2]=r,+g[j>>2])+0.0;g[W+96>>2]=fa;g[W+96+4>>2]=ea+.25;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;Vb[J&127](M,W+160|0,W+96|0,W+16|0);J=c[(c[M>>2]|0)+16>>2]|0;r=c[W+32>>2]|0;I=c[W+32+4>>2]|0;ga=+g[W+32+8>>2];c[W+160>>2]=r;c[W+160+4>>2]=I;g[W+160+8>>2]=ga+-.25;g[W+160+12>>2]=0.0;ea=(c[j>>2]=r,+g[j>>2])+0.0;fa=(c[j>>2]=I,+g[j>>2])+0.0;g[W+96>>2]=ea;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga+.25;g[W+96+12>>2]=0.0;Vb[J&127](M,W+160|0,W+96|0,W+16|0);J=c[(c[M>>2]|0)+16>>2]|0;K=(c[K>>2]|0)+8|0;c[W+160>>2]=1065353216;c[W+160+4>>2]=1065353216;c[W+160+8>>2]=1065353216;g[W+160+12>>2]=0.0;Vb[J&127](M,K,W+32|0,W+160|0);d=d+1|0}while((d|0)<(c[S+852>>2]|0))}d=c[S+772>>2]|0;if((d|0)>0){f=0;do{e=c[S+780>>2]|0;if((c[(c[e+(f*104|0)+4>>2]|0)+16>>2]&1|0)!=0?+g[e+(f*104|0)+88>>2]<=0.0:0){J=e+(f*104|0)+8|0;c[W+32>>2]=1065353216;c[W+32+4>>2]=0;c[W+32+8>>2]=0;g[W+32+12>>2]=0.0;d=c[(c[M>>2]|0)+16>>2]|0;ga=+g[J>>2];K=e+(f*104|0)+12|0;r=c[K>>2]|0;I=e+(f*104|0)+16|0;q=c[I>>2]|0;g[W+160>>2]=ga+-.25;c[W+160+4>>2]=r;c[W+160+8>>2]=q;g[W+160+12>>2]=0.0;fa=(c[j>>2]=r,+g[j>>2])+0.0;ea=(c[j>>2]=q,+g[j>>2])+0.0;g[W+96>>2]=ga+.25;g[W+96+4>>2]=fa;g[W+96+8>>2]=ea;g[W+96+12>>2]=0.0;Vb[d&127](M,W+160|0,W+96|0,W+32|0);d=c[(c[M>>2]|0)+16>>2]|0;q=c[J>>2]|0;ea=+g[K>>2];r=c[I>>2]|0;c[W+160>>2]=q;g[W+160+4>>2]=ea+-.25;c[W+160+8>>2]=r;g[W+160+12>>2]=0.0;fa=(c[j>>2]=q,+g[j>>2])+0.0;ga=(c[j>>2]=r,+g[j>>2])+0.0;g[W+96>>2]=fa;g[W+96+4>>2]=ea+.25;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;Vb[d&127](M,W+160|0,W+96|0,W+32|0);d=c[(c[M>>2]|0)+16>>2]|0;J=c[J>>2]|0;K=c[K>>2]|0;ga=+g[I>>2];c[W+160>>2]=J;c[W+160+4>>2]=K;g[W+160+8>>2]=ga+-.25;g[W+160+12>>2]=0.0;ea=(c[j>>2]=J,+g[j>>2])+0.0;fa=(c[j>>2]=K,+g[j>>2])+0.0;g[W+96>>2]=ea;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga+.25;g[W+96+12>>2]=0.0;Vb[d&127](M,W+160|0,W+96|0,W+32|0);d=c[S+772>>2]|0}f=f+1|0}while((f|0)<(d|0))}}if(L&128|0?(c[S+752>>2]|0)>0:0){e=0;do{f=c[S+760>>2]|0;h=f+(e*60|0)+8|0;c[W+160>>2]=c[h>>2];c[W+160+4>>2]=c[h+4>>2];c[W+160+8>>2]=c[h+8>>2];c[W+160+12>>2]=c[h+12>>2];h=c[f+(e*60|0)+24>>2]|0;if((h|0)>0){d=0;i=+g[W+160>>2];k=+g[W+160+4>>2];m=+g[W+160+8>>2];do{K=c[f+(e*60|0)+28+(d<<2)>>2]|0;ga=+g[f+(e*60|0)+44+(d<<2)>>2];i=+g[K+8>>2]*ga+i;k=ga*+g[K+12>>2]+k;m=ga*+g[K+16>>2]+m;g[W+160+8>>2]=m;d=d+1|0}while((d|0)!=(h|0));g[W+160>>2]=i;g[W+160+4>>2]=k}Sb[c[(c[M>>2]|0)+48>>2]&127](M,W+160|0,c[f+(e*60|0)+4>>2]|0);e=e+1|0}while((e|0)<(c[S+752>>2]|0))}if(L&512|0){K=c[S+988>>2]|0;c[W+160>>2]=1065353216;c[W+160+4>>2]=0;c[W+160+8>>2]=1065353216;g[W+160+12>>2]=0.0;c[W+96>>2]=1065353216;c[W+96+4>>2]=1065353216;c[W+96+8>>2]=1065353216;g[W+96+12>>2]=0.0;Qf(M,K,0,W+160|0,W+96|0)}if(L&1024|0){K=c[S+1028>>2]|0;c[W+160>>2]=0;c[W+160+4>>2]=1065353216;c[W+160+8>>2]=0;g[W+160+12>>2]=0.0;c[W+96>>2]=1065353216;c[W+96+4>>2]=0;c[W+96+8>>2]=0;g[W+96+12>>2]=0.0;Qf(M,K,0,W+160|0,W+96|0)}if(L&2048|0){K=c[S+1068>>2]|0;c[W+160>>2]=0;c[W+160+4>>2]=1065353216;c[W+160+8>>2]=1065353216;g[W+160+12>>2]=0.0;c[W+96>>2]=1065353216;c[W+96+4>>2]=0;c[W+96+8>>2]=0;g[W+96+12>>2]=0.0;Qf(M,K,0,W+160|0,W+96|0)}a:do if(L&4096|0?(c[S+912>>2]|0)>0:0){d=0;while(1){e=c[(c[S+920>>2]|0)+(d<<2)>>2]|0;switch(xb[c[(c[e>>2]|0)+20>>2]&127](e)|0){case 0:{L=ui(e+4|0)|0;ga=+g[e+28>>2];fa=+g[e+32>>2];ea=+g[e+36>>2];da=ga*+g[L+16>>2]+fa*+g[L+20>>2]+ea*+g[L+24>>2]+ +g[L+52>>2];ca=ga*+g[L+32>>2]+fa*+g[L+36>>2]+ea*+g[L+40>>2]+ +g[L+56>>2];g[W+32>>2]=ga*+g[L>>2]+fa*+g[L+4>>2]+ea*+g[L+8>>2]+ +g[L+48>>2];g[W+32+4>>2]=da;g[W+32+8>>2]=ca;g[W+32+12>>2]=0.0;L=ui(e+16|0)|0;ca=+g[e+44>>2];da=+g[e+48>>2];ea=+g[e+52>>2];fa=ca*+g[L+16>>2]+da*+g[L+20>>2]+ea*+g[L+24>>2]+ +g[L+52>>2];ga=ca*+g[L+32>>2]+da*+g[L+36>>2]+ea*+g[L+40>>2]+ +g[L+56>>2];g[W+16>>2]=ca*+g[L>>2]+da*+g[L+4>>2]+ea*+g[L+8>>2]+ +g[L+48>>2];g[W+16+4>>2]=fa;g[W+16+8>>2]=ga;g[W+16+12>>2]=0.0;L=c[(c[M>>2]|0)+16>>2]|0;K=(ui(e+4|0)|0)+48|0;c[W+160>>2]=1065353216;c[W+160+4>>2]=1065353216;c[W+160+8>>2]=0;g[W+160+12>>2]=0.0;Vb[L&127](M,K,W+32|0,W+160|0);K=c[(c[M>>2]|0)+16>>2]|0;L=(ui(e+16|0)|0)+48|0;c[W+160>>2]=0;c[W+160+4>>2]=1065353216;c[W+160+8>>2]=1065353216;g[W+160+12>>2]=0.0;Vb[K&127](M,L,W+16|0,W+160|0);c[W>>2]=1065353216;c[W+4>>2]=1065353216;c[W+8>>2]=0;g[W+12>>2]=0.0;L=c[(c[M>>2]|0)+16>>2]|0;ga=+g[W+32>>2];K=c[W+32+4>>2]|0;J=c[W+32+8>>2]|0;g[W+160>>2]=ga+-.25;c[W+160+4>>2]=K;c[W+160+8>>2]=J;g[W+160+12>>2]=0.0;fa=(c[j>>2]=K,+g[j>>2])+0.0;ea=(c[j>>2]=J,+g[j>>2])+0.0;g[W+96>>2]=ga+.25;g[W+96+4>>2]=fa;g[W+96+8>>2]=ea;g[W+96+12>>2]=0.0;Vb[L&127](M,W+160|0,W+96|0,W);L=c[(c[M>>2]|0)+16>>2]|0;J=c[W+32>>2]|0;ea=+g[W+32+4>>2];K=c[W+32+8>>2]|0;c[W+160>>2]=J;g[W+160+4>>2]=ea+-.25;c[W+160+8>>2]=K;g[W+160+12>>2]=0.0;fa=(c[j>>2]=J,+g[j>>2])+0.0;ga=(c[j>>2]=K,+g[j>>2])+0.0;g[W+96>>2]=fa;g[W+96+4>>2]=ea+.25;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;Vb[L&127](M,W+160|0,W+96|0,W);L=c[(c[M>>2]|0)+16>>2]|0;K=c[W+32>>2]|0;J=c[W+32+4>>2]|0;ga=+g[W+32+8>>2];c[W+160>>2]=K;c[W+160+4>>2]=J;g[W+160+8>>2]=ga+-.25;g[W+160+12>>2]=0.0;ea=(c[j>>2]=K,+g[j>>2])+0.0;fa=(c[j>>2]=J,+g[j>>2])+0.0;g[W+96>>2]=ea;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga+.25;g[W+96+12>>2]=0.0;Vb[L&127](M,W+160|0,W+96|0,W);c[W>>2]=0;c[W+4>>2]=1065353216;c[W+8>>2]=1065353216;g[W+12>>2]=0.0;L=c[(c[M>>2]|0)+16>>2]|0;ga=+g[W+16>>2];J=c[W+16+4>>2]|0;K=c[W+16+8>>2]|0;g[W+160>>2]=ga+-.25;c[W+160+4>>2]=J;c[W+160+8>>2]=K;g[W+160+12>>2]=0.0;fa=(c[j>>2]=J,+g[j>>2])+0.0;ea=(c[j>>2]=K,+g[j>>2])+0.0;g[W+96>>2]=ga+.25;g[W+96+4>>2]=fa;g[W+96+8>>2]=ea;g[W+96+12>>2]=0.0;Vb[L&127](M,W+160|0,W+96|0,W);L=c[(c[M>>2]|0)+16>>2]|0;K=c[W+16>>2]|0;ea=+g[W+16+4>>2];J=c[W+16+8>>2]|0;c[W+160>>2]=K;g[W+160+4>>2]=ea+-.25;c[W+160+8>>2]=J;g[W+160+12>>2]=0.0;fa=(c[j>>2]=K,+g[j>>2])+0.0;ga=(c[j>>2]=J,+g[j>>2])+0.0;g[W+96>>2]=fa;g[W+96+4>>2]=ea+.25;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;Vb[L&127](M,W+160|0,W+96|0,W);L=c[(c[M>>2]|0)+16>>2]|0;J=c[W+16>>2]|0;K=c[W+16+4>>2]|0;ga=+g[W+16+8>>2];c[W+160>>2]=J;c[W+160+4>>2]=K;g[W+160+8>>2]=ga+-.25;g[W+160+12>>2]=0.0;ea=(c[j>>2]=J,+g[j>>2])+0.0;fa=(c[j>>2]=K,+g[j>>2])+0.0;g[W+96>>2]=ea;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga+.25;g[W+96+12>>2]=0.0;Vb[L&127](M,W+160|0,W+96|0,W);break}case 1:{L=(ui(e+4|0)|0)+48|0;c[W+160>>2]=c[L>>2];c[W+160+4>>2]=c[L+4>>2];c[W+160+8>>2]=c[L+8>>2];c[W+160+12>>2]=c[L+12>>2];L=(ui(e+16|0)|0)+48|0;c[W+96>>2]=c[L>>2];c[W+96+4>>2]=c[L+4>>2];c[W+96+8>>2]=c[L+8>>2];c[W+96+12>>2]=c[L+12>>2];L=ui(e+4|0)|0;aa=+g[e+28>>2];$=+g[e+32>>2];da=+g[e+36>>2];ba=+g[L>>2]*aa+ +g[L+4>>2]*$+ +g[L+8>>2]*da;ca=aa*+g[L+16>>2]+$*+g[L+20>>2]+da*+g[L+24>>2];da=aa*+g[L+32>>2]+$*+g[L+36>>2]+da*+g[L+40>>2];L=ui(e+16|0)|0;$=+g[e+44>>2];aa=+g[e+48>>2];ga=+g[e+52>>2];ea=+g[L>>2]*$+ +g[L+4>>2]*aa+ +g[L+8>>2]*ga;fa=$*+g[L+16>>2]+aa*+g[L+20>>2]+ga*+g[L+24>>2];ga=$*+g[L+32>>2]+aa*+g[L+36>>2]+ga*+g[L+40>>2];L=c[(c[M>>2]|0)+16>>2]|0;aa=ca*10.0+ +g[W+160+4>>2];$=da*10.0+ +g[W+160+8>>2];g[W+32>>2]=ba*10.0+ +g[W+160>>2];g[W+32+4>>2]=aa;g[W+32+8>>2]=$;g[W+32+12>>2]=0.0;c[W+16>>2]=1065353216;c[W+16+4>>2]=1065353216;c[W+16+8>>2]=0;g[W+16+12>>2]=0.0;Vb[L&127](M,W+160|0,W+32|0,W+16|0);L=c[(c[M>>2]|0)+16>>2]|0;$=fa*10.0+ +g[W+160+4>>2];aa=ga*10.0+ +g[W+160+8>>2];g[W+32>>2]=ea*10.0+ +g[W+160>>2];g[W+32+4>>2]=$;g[W+32+8>>2]=aa;g[W+32+12>>2]=0.0;c[W+16>>2]=1065353216;c[W+16+4>>2]=1065353216;c[W+16+8>>2]=0;g[W+16+12>>2]=0.0;Vb[L&127](M,W+160|0,W+32|0,W+16|0);L=c[(c[M>>2]|0)+16>>2]|0;ca=ca*10.0+ +g[W+96+4>>2];da=da*10.0+ +g[W+96+8>>2];g[W+32>>2]=ba*10.0+ +g[W+96>>2];g[W+32+4>>2]=ca;g[W+32+8>>2]=da;g[W+32+12>>2]=0.0;c[W+16>>2]=0;c[W+16+4>>2]=1065353216;c[W+16+8>>2]=1065353216;g[W+16+12>>2]=0.0;Vb[L&127](M,W+96|0,W+32|0,W+16|0);L=c[(c[M>>2]|0)+16>>2]|0;fa=fa*10.0+ +g[W+96+4>>2];ga=ga*10.0+ +g[W+96+8>>2];g[W+32>>2]=ea*10.0+ +g[W+96>>2];g[W+32+4>>2]=fa;g[W+32+8>>2]=ga;g[W+32+12>>2]=0.0;c[W+16>>2]=0;c[W+16+4>>2]=1065353216;c[W+16+8>>2]=1065353216;g[W+16+12>>2]=0.0;Vb[L&127](M,W+96|0,W+32|0,W+16|0);break}default:{}}d=d+1|0;if((d|0)>=(c[S+912>>2]|0))break a}}while(0)}d=c[b+72>>2]|0;if(d|0?(xb[c[(c[d>>2]|0)+56>>2]&127](d)|0)&2|0:0){if(a[b+368>>0]|0){L=c[b+72>>2]|0;M=c[S+988>>2]|0;c[W+160>>2]=1065353216;c[W+160+4>>2]=0;c[W+160+8>>2]=1065353216;g[W+160+12>>2]=0.0;c[W+96>>2]=1065353216;c[W+96+4>>2]=1065353216;c[W+96+8>>2]=1065353216;g[W+96+12>>2]=0.0;Qf(L,M,0,W+160|0,W+96|0)}if(a[b+369>>0]|0){L=c[b+72>>2]|0;M=c[S+1028>>2]|0;c[W+160>>2]=0;c[W+160+4>>2]=1065353216;c[W+160+8>>2]=0;g[W+160+12>>2]=0.0;c[W+96>>2]=1065353216;c[W+96+4>>2]=0;c[W+96+8>>2]=0;g[W+96+12>>2]=0.0;Qf(L,M,0,W+160|0,W+96|0)}if(a[b+370>>0]|0){M=c[b+72>>2]|0;S=c[S+1068>>2]|0;c[W+160>>2]=0;c[W+160+4>>2]=1065353216;c[W+160+8>>2]=1065353216;g[W+160+12>>2]=0.0;c[W+96>>2]=1065353216;c[W+96+4>>2]=0;c[W+96+8>>2]=0;g[W+96+12>>2]=0.0;Qf(M,S,0,W+160|0,W+96|0)}}N=N+1|0}while((N|0)<(c[b+348>>2]|0));l=W;return}function gc(b,d,e){b=b|0;d=+d;e=+e;var f=0,h=0.0,i=0,j=0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0.0,Q=0.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.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.0,xa=0,ya=0,za=0.0,Aa=0.0,Ba=0.0,Ca=0.0,Da=0.0,Ea=0.0,Fa=0.0,Ga=0.0,Ha=0.0,Ia=0.0,Ja=0.0,Ka=0.0,La=0.0,Ma=0.0,Na=0.0,Oa=0.0,Pa=0.0,Qa=0.0,Ra=0.0,Sa=0.0,Ta=0.0,Ua=0.0,Va=0.0,Wa=0.0,Xa=0.0,Ya=0.0,Za=0.0,_a=0.0,$a=0.0,ab=0.0,bb=0.0,cb=0.0,db=0.0,eb=0.0,fb=0.0,gb=0.0,hb=0.0,ib=0.0,jb=0.0,kb=0.0,lb=0.0;ua=l;l=l+208|0;ta=+g[b+512>>2];ha=c[b+192>>2]|0;ga=+nb[c[(c[ha>>2]|0)+48>>2]&15](ha);a[ua+48+16>>0]=1;ha=ua+48+12|0;c[ha>>2]=0;c[ua+48+4>>2]=0;c[ua+48+8>>2]=0;a[ua+48+36>>0]=1;ia=ua+48+32|0;c[ia>>2]=0;c[ua+48+24>>2]=0;c[ua+48+28>>2]=0;a[ua+48+56>>0]=1;c[ua+48+52>>2]=0;c[ua+48+44>>2]=0;c[ua+48+48>>2]=0;ja=ua+48+76|0;a[ja>>0]=1;ka=ua+48+72|0;c[ka>>2]=0;la=ua+48+64|0;c[la>>2]=0;ma=ua+48+68|0;c[ma>>2]=0;na=ua+48+96|0;a[na>>0]=1;oa=ua+48+92|0;c[oa>>2]=0;pa=ua+48+84|0;c[pa>>2]=0;qa=ua+48+88|0;c[qa>>2]=0;a[ua+48+116>>0]=1;ra=ua+48+112|0;c[ra>>2]=0;c[ua+48+104>>2]=0;c[ua+48+108>>2]=0;sa=c[b+872>>2]|0;if((sa|0)<=0){Ph(ua+48|0);l=ua;return}fa=0;f=0;do{ea=c[b+880>>2]|0;da=ea+(fa*104|0)|0;ca=c[da>>2]|0;if(!(c[ca+204>>2]&4)){switch(c[ca+252>>2]|0){case 2:{Q=+g[ca+392>>2];n=+g[ea+(fa*104|0)+84>>2];H=+g[ca+396>>2];N=+g[ea+(fa*104|0)+80>>2];e=+g[ea+(fa*104|0)+76>>2];O=+g[ca+388>>2];j=0;k=ca;h=ta*(Q*n-H*N+ +g[ca+372>>2]);n=ta*(+g[ca+376>>2]+(H*e-n*O));e=ta*(N*O-Q*e+ +g[ca+380>>2]);break}case 64:{ba=c[(c[ca+324>>2]|0)+468>>2]|0;m=c[ua+48+4>>2]|0;if((ba+6|0)>(m|0)){if((c[ua+48+8>>2]|0)<(ba+6|0)){if(!(ba+6|0)){f=0;j=m}else{c[6995]=(c[6995]|0)+1;f=sc((ba+6<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=c[ua+48+4>>2]|0}k=c[ha>>2]|0;if((j|0)>0){i=0;do{c[f+(i<<2)>>2]=c[k+(i<<2)>>2];i=i+1|0}while((i|0)!=(j|0));if(a[ua+48+16>>0]|0)ya=18}else if(!((k|0)==0|(a[ua+48+16>>0]|0)==0))ya=18;if((ya|0)==18){ya=0;c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}a[ua+48+16>>0]=1;c[ha>>2]=f;c[ua+48+8>>2]=ba+6}else f=c[ha>>2]|0;Yk(f+(m<<2)|0,0,ba+6-m<<2|0)|0}c[ua+48+4>>2]=ba+6;m=c[ua+48+24>>2]|0;if((ba+6|0)>(m|0)){if((c[ua+48+28>>2]|0)<(ba+6|0)){if(!(ba+6|0)){f=0;j=m}else{c[6995]=(c[6995]|0)+1;f=sc((ba+6<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=c[ua+48+24>>2]|0}k=c[ia>>2]|0;if((j|0)>0){i=0;do{c[f+(i<<2)>>2]=c[k+(i<<2)>>2];i=i+1|0}while((i|0)!=(j|0));if(a[ua+48+36>>0]|0)ya=32}else if(!((k|0)==0|(a[ua+48+36>>0]|0)==0))ya=32;if((ya|0)==32){ya=0;c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}a[ua+48+36>>0]=1;c[ia>>2]=f;c[ua+48+28>>2]=ba+6}else f=c[ia>>2]|0;Yk(f+(m<<2)|0,0,ba+6-m<<2|0)|0}c[ua+48+24>>2]=ba+6;$=c[ha>>2]|0;I=c[ca+324>>2]|0;J=c[ca+328>>2]|0;u=c[ea+(fa*104|0)+24>>2]|0;aa=ea+(fa*104|0)+4|0;K=c[I+132>>2]|0;v=c[I+468>>2]|0;f=c[pa>>2]|0;if((f|0)<((K*3|0)+3|0)){if((c[qa>>2]|0)<((K*3|0)+3|0)){if(!((K*3|0)+3|0)){i=0;k=f}else{c[6995]=(c[6995]|0)+1;i=sc(((K*3|0)+3<<4|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}k=c[pa>>2]|0}if((k|0)>0){j=0;do{_=i+(j<<4)|0;Z=(c[oa>>2]|0)+(j<<4)|0;c[_>>2]=c[Z>>2];c[_+4>>2]=c[Z+4>>2];c[_+8>>2]=c[Z+8>>2];c[_+12>>2]=c[Z+12>>2];j=j+1|0}while((j|0)!=(k|0))}j=c[oa>>2]|0;if(j|0){if(a[na>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[oa>>2]=0}a[na>>0]=1;c[oa>>2]=i;c[qa>>2]=(K*3|0)+3}do{_=(c[oa>>2]|0)+(f<<4)|0;c[_>>2]=c[ua>>2];c[_+4>>2]=c[ua+4>>2];c[_+8>>2]=c[ua+8>>2];c[_+12>>2]=c[ua+12>>2];f=f+1|0}while((f|0)!=((K*3|0)+3|0))}c[pa>>2]=(K*3|0)+3;f=c[ua+48+104>>2]|0;if((f|0)<=(K+1|0)&(f|0)<=(K|0)){if((c[ua+48+108>>2]|0)<=(K|0)){if(!(K+1|0)){i=0;k=f}else{c[6995]=(c[6995]|0)+1;i=sc(((K+1|0)*48|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}k=c[ua+48+104>>2]|0}if((k|0)>0){j=0;do{Y=i+(j*48|0)|0;Z=c[ra>>2]|0;_=Z+(j*48|0)|0;c[Y>>2]=c[_>>2];c[Y+4>>2]=c[_+4>>2];c[Y+8>>2]=c[_+8>>2];c[Y+12>>2]=c[_+12>>2];Y=Z+(j*48|0)+16|0;_=i+(j*48|0)+16|0;c[_>>2]=c[Y>>2];c[_+4>>2]=c[Y+4>>2];c[_+8>>2]=c[Y+8>>2];c[_+12>>2]=c[Y+12>>2];Z=Z+(j*48|0)+32|0;_=i+(j*48|0)+32|0;c[_>>2]=c[Z>>2];c[_+4>>2]=c[Z+4>>2];c[_+8>>2]=c[Z+8>>2];c[_+12>>2]=c[Z+12>>2];j=j+1|0}while((j|0)!=(k|0))}j=c[ra>>2]|0;if(j|0){if(a[ua+48+116>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[ra>>2]=0}a[ua+48+116>>0]=1;c[ra>>2]=i;c[ua+48+108>>2]=K+1}do{_=c[ra>>2]|0;Z=_+(f*48|0)|0;c[Z>>2]=c[ua>>2];c[Z+4>>2]=c[ua+4>>2];c[Z+8>>2]=c[ua+8>>2];c[Z+12>>2]=c[ua+12>>2];Z=_+(f*48|0)+16|0;c[Z>>2]=c[ua+16>>2];c[Z+4>>2]=c[ua+16+4>>2];c[Z+8>>2]=c[ua+16+8>>2];c[Z+12>>2]=c[ua+16+12>>2];_=_+(f*48|0)+32|0;c[_>>2]=c[ua+32>>2];c[_+4>>2]=c[ua+32+4>>2];c[_+8>>2]=c[ua+32+8>>2];c[_+12>>2]=c[ua+32+12>>2];f=f+1|0}while((f|0)!=(K+1|0))}c[ua+48+104>>2]=K+1;z=c[oa>>2]|0;A=z+(K+1<<4)+(K+1<<4)|0;m=c[la>>2]|0;if((v|0)>(m|0)){if((c[ma>>2]|0)<(v|0)){if(!v){f=0;j=m}else{c[6995]=(c[6995]|0)+1;f=sc((v<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=c[la>>2]|0}k=c[ka>>2]|0;if((j|0)>0){i=0;do{c[f+(i<<2)>>2]=c[k+(i<<2)>>2];i=i+1|0}while((i|0)!=(j|0));if(a[ja>>0]|0)ya=74}else if(!((k|0)==0|(a[ja>>0]|0)==0))ya=74;if((ya|0)==74){ya=0;c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}a[ja>>0]=1;c[ka>>2]=f;c[ma>>2]=v}else f=c[ka>>2]|0;Yk(f+(m<<2)|0,0,v-m<<2|0)|0}c[la>>2]=v;y=(v|0)>0?c[ka>>2]|0:0;x=c[ra>>2]|0;O=+g[u+8>>2]-+g[I+12>>2];Q=+g[u+12>>2]-+g[I+16>>2];N=+g[u+16>>2]-+g[I+20>>2];E=+g[I+28>>2];G=+g[I+32>>2];t=+g[I+36>>2];C=+g[I+40>>2];H=E*(2.0/(E*E+G*G+t*t+C*C));F=G*(2.0/(E*E+G*G+t*t+C*C));B=t*(2.0/(E*E+G*G+t*t+C*C));g[x>>2]=1.0-(G*F+t*B);g[x+4>>2]=E*F-C*B;g[x+8>>2]=E*B+C*F;g[x+12>>2]=0.0;g[x+16>>2]=E*F+C*B;g[x+20>>2]=1.0-(E*H+t*B);g[x+24>>2]=G*B-C*H;g[x+28>>2]=0.0;g[x+32>>2]=E*B-C*F;g[x+36>>2]=G*B+C*H;g[x+40>>2]=1.0-(E*H+G*F);g[x+44>>2]=0.0;_=ea+(fa*104|0)+12|0;F=+g[_>>2];Z=ea+(fa*104|0)+8|0;G=+g[Z>>2];H=+g[aa>>2];g[$>>2]=Q*F-N*G+0.0;g[$+4>>2]=N*H-O*F+0.0;g[$+8>>2]=O*G-Q*H+0.0;c[$+12>>2]=c[aa>>2];c[$+16>>2]=c[Z>>2];c[$+20>>2]=c[_>>2];H=O*+g[x+16>>2]+Q*+g[x+20>>2]+N*+g[x+24>>2];G=O*+g[x+32>>2]+Q*+g[x+36>>2]+N*+g[x+40>>2];g[z>>2]=O*+g[x>>2]+Q*+g[x+4>>2]+N*+g[x+8>>2];g[z+4>>2]=H;g[z+8>>2]=G;g[z+12>>2]=0.0;G=+g[aa>>2];H=+g[Z>>2];N=+g[_>>2];Q=G*+g[x+16>>2]+H*+g[x+20>>2]+N*+g[x+24>>2];O=G*+g[x+32>>2]+H*+g[x+36>>2]+N*+g[x+40>>2];g[z+(K+1<<4)>>2]=+g[x>>2]*G+ +g[x+4>>2]*H+ +g[x+8>>2]*N;g[z+(K+1<<4)+4>>2]=Q;g[z+(K+1<<4)+8>>2]=O;g[z+(K+1<<4)+12>>2]=0.0;O=+g[x+16>>2]*0.0+ +g[x+20>>2]*0.0+ +g[x+24>>2]*0.0;Q=+g[x+32>>2]*0.0+ +g[x+36>>2]*0.0+ +g[x+40>>2]*0.0;g[A>>2]=+g[x>>2]*0.0+ +g[x+4>>2]*0.0+ +g[x+8>>2]*0.0;g[A+4>>2]=O;g[A+8>>2]=Q;g[A+12>>2]=0.0;if((v|0)>0)Yk($+24|0,0,(((v+5|0)>6?v+5|0:6)<<2)+-20|0)|0;if((J|0)>-1&(K|0)>0){w=0;f=c[I+140>>2]|0;while(1){q=+g[f+(w*608|0)+336>>2];o=+g[f+(w*608|0)+340>>2];F=+g[f+(w*608|0)+344>>2];N=+g[f+(w*608|0)+348>>2];p=q*(2.0/(q*q+o*o+F*F+N*N));Q=o*(2.0/(q*q+o*o+F*F+N*N));r=F*(2.0/(q*q+o*o+F*F+N*N));B=1.0-(o*Q+F*r);C=q*Q-N*r;e=q*r+N*Q;E=q*Q+N*r;F=1.0-(q*p+F*r);h=o*r-N*p;G=q*r-N*Q;N=o*r+N*p;Q=1.0-(q*p+o*Q);i=(c[f+(w*608|0)+20>>2]|0)+1|0;o=+g[x+(i*48|0)>>2];p=+g[x+(i*48|0)+16>>2];q=+g[x+(i*48|0)+32>>2];r=+g[x+(i*48|0)+4>>2];s=+g[x+(i*48|0)+20>>2];t=+g[x+(i*48|0)+36>>2];n=+g[x+(i*48|0)+8>>2];O=+g[x+(i*48|0)+24>>2];H=+g[x+(i*48|0)+40>>2];f=w;w=w+1|0;g[x+(w*48|0)>>2]=q*e+(p*C+o*B);g[x+(w*48|0)+4>>2]=e*t+(s*C+r*B);g[x+(w*48|0)+8>>2]=B*n+C*O+e*H;g[x+(w*48|0)+12>>2]=0.0;g[x+(w*48|0)+16>>2]=q*h+(o*E+p*F);g[x+(w*48|0)+20>>2]=t*h+(r*E+s*F);g[x+(w*48|0)+24>>2]=E*n+F*O+h*H;g[x+(w*48|0)+28>>2]=0.0;g[x+(w*48|0)+32>>2]=o*G+p*N+q*Q;g[x+(w*48|0)+36>>2]=r*G+s*N+t*Q;g[x+(w*48|0)+40>>2]=G*n+N*O+Q*H;g[x+(w*48|0)+44>>2]=0.0;u=z+(K+1<<4)+(i<<4)|0;H=+g[u>>2];O=+g[u+4>>2];n=+g[u+8>>2];u=z+(K+1<<4)+(w<<4)|0;g[u>>2]=B*H+C*O+e*n;g[u+4>>2]=E*H+F*O+h*n;g[u+8>>2]=G*H+N*O+Q*n;g[u+12>>2]=0.0;n=+g[A+(i<<4)>>2];O=+g[A+(i<<4)+4>>2];H=+g[A+(i<<4)+8>>2];v=A+(w<<4)|0;g[v>>2]=B*n+C*O+e*H;g[v+4>>2]=E*n+F*O+h*H;g[v+8>>2]=G*n+N*O+Q*H;g[v+12>>2]=0.0;H=+g[z+(i<<4)>>2];O=+g[z+(i<<4)+4>>2];n=+g[z+(i<<4)+8>>2];i=c[I+140>>2]|0;e=B*H+C*O+e*n-+g[i+(f*608|0)+352>>2];h=E*H+F*O+h*n-+g[i+(f*608|0)+356>>2];n=G*H+N*O+Q*n-+g[i+(f*608|0)+360>>2];i=z+(w<<4)|0;g[i>>2]=e;j=z+(w<<4)+4|0;g[j>>2]=h;k=z+(w<<4)+8|0;g[k>>2]=n;g[z+(w<<4)+12>>2]=0.0;m=c[I+140>>2]|0;switch(c[m+(f*608|0)+500>>2]|0){case 0:{Q=+g[m+(f*608|0)+140>>2];N=+g[m+(f*608|0)+144>>2];O=+g[m+(f*608|0)+136>>2];Q=(Q*n-N*h+ +g[m+(f*608|0)+152>>2])*+g[u>>2]+(N*e-n*O+ +g[m+(f*608|0)+156>>2])*+g[u+4>>2]+(h*O-Q*e+ +g[m+(f*608|0)+160>>2])*+g[u+8>>2];Y=y+(c[m+(f*608|0)+328>>2]<<2)|0;g[Y>>2]=Q;g[Y>>2]=Q+(+g[v>>2]*+g[m+(f*608|0)+136>>2]+ +g[v+4>>2]*+g[m+(f*608|0)+140>>2]+ +g[v+8>>2]*+g[m+(f*608|0)+144>>2]);break}case 1:{g[y+(c[m+(f*608|0)+328>>2]<<2)>>2]=+g[u>>2]*+g[m+(f*608|0)+152>>2]+ +g[u+4>>2]*+g[m+(f*608|0)+156>>2]+ +g[u+8>>2]*+g[m+(f*608|0)+160>>2];break}case 2:{G=+g[m+(f*608|0)+140>>2];N=+g[m+(f*608|0)+144>>2];Q=+g[m+(f*608|0)+136>>2];Y=c[m+(f*608|0)+328>>2]|0;g[y+(Y<<2)>>2]=(G*n-N*h+ +g[m+(f*608|0)+152>>2])*+g[u>>2]+(N*e-n*Q+ +g[m+(f*608|0)+156>>2])*+g[u+4>>2]+(h*Q-G*e+ +g[m+(f*608|0)+160>>2])*+g[u+8>>2];G=+g[m+(f*608|0)+172>>2];Q=+g[k>>2];N=+g[m+(f*608|0)+176>>2];H=+g[j>>2];O=+g[i>>2];F=+g[m+(f*608|0)+168>>2];g[y+(Y+1<<2)>>2]=(G*Q-N*H+ +g[m+(f*608|0)+184>>2])*+g[u>>2]+(N*O-Q*F+ +g[m+(f*608|0)+188>>2])*+g[u+4>>2]+(H*F-G*O+ +g[m+(f*608|0)+192>>2])*+g[u+8>>2];O=+g[m+(f*608|0)+204>>2];G=+g[k>>2];F=+g[m+(f*608|0)+208>>2];H=+g[j>>2];Q=+g[i>>2];N=+g[m+(f*608|0)+200>>2];g[y+(Y+2<<2)>>2]=(O*G-F*H+ +g[m+(f*608|0)+216>>2])*+g[u>>2]+(F*Q-G*N+ +g[m+(f*608|0)+220>>2])*+g[u+4>>2]+(H*N-O*Q+ +g[m+(f*608|0)+224>>2])*+g[u+8>>2];m=c[I+140>>2]|0;Y=c[m+(f*608|0)+328>>2]|0;g[y+(Y<<2)>>2]=+g[y+(Y<<2)>>2]+(+g[v>>2]*+g[m+(f*608|0)+136>>2]+ +g[v+4>>2]*+g[m+(f*608|0)+140>>2]+ +g[v+8>>2]*+g[m+(f*608|0)+144>>2]);g[y+(Y+1<<2)>>2]=+g[y+(Y+1<<2)>>2]+(+g[v>>2]*+g[m+(f*608|0)+168>>2]+ +g[v+4>>2]*+g[m+(f*608|0)+172>>2]+ +g[v+8>>2]*+g[m+(f*608|0)+176>>2]);g[y+(Y+2<<2)>>2]=+g[y+(Y+2<<2)>>2]+(+g[v>>2]*+g[m+(f*608|0)+200>>2]+ +g[v+4>>2]*+g[m+(f*608|0)+204>>2]+ +g[v+8>>2]*+g[m+(f*608|0)+208>>2]);break}case 3:{Q=+g[m+(f*608|0)+140>>2];N=+g[m+(f*608|0)+144>>2];O=+g[m+(f*608|0)+136>>2];Y=c[m+(f*608|0)+328>>2]|0;g[y+(Y<<2)>>2]=(Q*n-N*h)*+g[u>>2]+ +g[u+4>>2]*(N*e-n*O)+(h*O-Q*e)*+g[u+8>>2];g[y+(Y+1<<2)>>2]=+g[u>>2]*+g[m+(f*608|0)+184>>2]+ +g[u+4>>2]*+g[m+(f*608|0)+188>>2]+ +g[u+8>>2]*+g[m+(f*608|0)+192>>2];g[y+(Y+2<<2)>>2]=+g[u>>2]*+g[m+(f*608|0)+216>>2]+ +g[u+4>>2]*+g[m+(f*608|0)+220>>2]+ +g[u+8>>2]*+g[m+(f*608|0)+224>>2];break}default:{}}if((w|0)==(K|0))break;else f=m}if((J|0)!=-1){f=J;do{k=c[m+(f*608|0)+492>>2]|0;if((k|0)>0){j=c[m+(f*608|0)+328>>2]|0;i=0;do{c[$+(i+6+j<<2)>>2]=c[y+(j+i<<2)>>2];i=i+1|0}while((i|0)!=(k|0))}f=c[m+(f*608|0)+20>>2]|0}while((f|0)!=-1)}}f=c[ia>>2]|0;X=c[ca+324>>2]|0;I=c[ha>>2]|0;Y=c[X+132>>2]|0;u=c[X+468>>2]|0;v=c[la>>2]|0;if((u|0)>(v|0)){if((c[ma>>2]|0)<(u|0)){if(!u){i=0;k=v}else{c[6995]=(c[6995]|0)+1;i=sc((u<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}k=c[la>>2]|0}m=c[ka>>2]|0;if((k|0)>0){j=0;do{c[i+(j<<2)>>2]=c[m+(j<<2)>>2];j=j+1|0}while((j|0)!=(k|0));if(a[ja>>0]|0)ya=103}else if(!((m|0)==0|(a[ja>>0]|0)==0))ya=103;if((ya|0)==103){ya=0;c[6996]=(c[6996]|0)+1;Cd(c[m+-4>>2]|0)}a[ja>>0]=1;c[ka>>2]=i;c[ma>>2]=u}else i=c[ka>>2]|0;Yk(i+(v<<2)|0,0,u-v<<2|0)|0}c[la>>2]=u;i=c[pa>>2]|0;if((i|0)<((Y<<2)+4|0)){if((c[qa>>2]|0)<((Y<<2)+4|0)){if(!((Y<<2)+4|0)){j=0;m=i}else{c[6995]=(c[6995]|0)+1;j=sc((Y<<2)+4<<4|19)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}m=c[pa>>2]|0}if((m|0)>0){k=0;do{W=j+(k<<4)|0;V=(c[oa>>2]|0)+(k<<4)|0;c[W>>2]=c[V>>2];c[W+4>>2]=c[V+4>>2];c[W+8>>2]=c[V+8>>2];c[W+12>>2]=c[V+12>>2];k=k+1|0}while((k|0)!=(m|0))}k=c[oa>>2]|0;if(k|0){if(a[na>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[oa>>2]=0}a[na>>0]=1;c[oa>>2]=j;c[qa>>2]=(Y<<2)+4}do{W=(c[oa>>2]|0)+(i<<4)|0;c[W>>2]=c[ua>>2];c[W+4>>2]=c[ua+4>>2];c[W+8>>2]=c[ua+8>>2];c[W+12>>2]=c[ua+12>>2];i=i+1|0}while((i|0)!=((Y<<2)+4|0))}c[pa>>2]=(Y<<2)+4;i=c[X+468>>2]|0;T=(i|0)==0?0:c[ka>>2]|0;U=c[oa>>2]|0;V=U+((Y<<1)+2<<4)|0;W=c[X+220>>2]|0;if((i|0)>0){R=(c[X+180>>2]|0)+(i+6<<2)|0;S=c[X+200>>2]|0}else{R=0;S=0}if(!(a[X+421>>0]|0)){r=+g[W>>2];s=+g[W+4>>2];t=+g[W+8>>2];B=+g[W+16>>2];C=+g[W+20>>2];E=+g[W+24>>2];F=+g[W+32>>2];H=+g[W+36>>2];O=+g[W+40>>2];G=-+g[I>>2];N=-+g[I+4>>2];Q=-+g[I+8>>2];o=-+g[I+12>>2];p=-+g[I+16>>2];q=-+g[I+20>>2];g[U>>2]=r*o+s*p+t*q;g[U+4>>2]=B*o+C*p+E*q;g[U+8>>2]=F*o+H*p+O*q;g[U+12>>2]=0.0;g[U+16>>2]=r*G+s*N+t*Q;g[U+20>>2]=B*G+C*N+E*Q;g[U+24>>2]=F*G+H*N+O*Q;g[U+28>>2]=0.0}else{c[U>>2]=0;c[U+4>>2]=0;c[U+8>>2]=0;c[U+12>>2]=0;c[U+16>>2]=0;c[U+20>>2]=0;c[U+24>>2]=0;c[U+28>>2]=0}if((Y|0)>0){Yk(U+32|0,0,Y<<5|0)|0;z=c[X+140>>2]|0;x=Y;do{y=x;x=x+-1|0;A=c[z+(x*608|0)+20>>2]|0;r=+g[W+(y*48|0)>>2];s=+g[W+(y*48|0)+4>>2];t=+g[W+(y*48|0)+8>>2];B=+g[W+(y*48|0)+16>>2];C=+g[W+(y*48|0)+20>>2];E=+g[W+(y*48|0)+24>>2];F=+g[W+(y*48|0)+32>>2];G=+g[W+(y*48|0)+36>>2];H=+g[W+(y*48|0)+40>>2];N=+g[z+(x*608|0)+352>>2];O=+g[z+(x*608|0)+356>>2];Q=+g[z+(x*608|0)+360>>2];v=c[z+(x*608|0)+492>>2]|0;w=c[z+(x*608|0)+328>>2]|0;if((v|0)>0){i=0;do{g[T+(w+i<<2)>>2]=+g[I+(i+6+w<<2)>>2]-(+g[z+(x*608|0)+136+(i<<5)+16>>2]*+g[U+(y<<5)>>2]+ +g[z+(x*608|0)+136+(i<<5)+20>>2]*+g[U+(y<<5)+4>>2]+ +g[z+(x*608|0)+136+(i<<5)+24>>2]*+g[U+(y<<5)+8>>2]+(+g[z+(x*608|0)+136+(i<<5)>>2]*+g[U+(y<<5)+16>>2]+ +g[z+(x*608|0)+136+(i<<5)+4>>2]*+g[U+(y<<5)+20>>2]+ +g[z+(x*608|0)+136+(i<<5)+8>>2]*+g[U+(y<<5)+24>>2]));i=i+1|0}while((i|0)!=(v|0));k=R+((P(w,w)|0)<<2)|0;j=0;do{m=ua+(j<<2)|0;g[m>>2]=0.0;u=P(v,j)|0;i=0;e=0.0;do{e=e+ +g[k+(u+i<<2)>>2]*+g[T+(w+i<<2)>>2];i=i+1|0}while((i|0)!=(v|0));g[m>>2]=e;j=j+1|0}while((j|0)!=(v|0));i=0;q=+g[U+(y<<5)>>2];p=+g[U+(y<<5)+4>>2];o=+g[U+(y<<5)+8>>2];n=+g[U+(y<<5)+16>>2];h=+g[U+(y<<5)+20>>2];e=+g[U+(y<<5)+24>>2];do{M=w+i|0;za=+g[ua+(i<<2)>>2];q=za*+g[S+(M<<5)>>2]+q;p=za*+g[S+(M<<5)+4>>2]+p;o=za*+g[S+(M<<5)+8>>2]+o;n=+g[S+(M<<5)+16>>2]*za+n;h=za*+g[S+(M<<5)+20>>2]+h;e=za*+g[S+(M<<5)+24>>2]+e;i=i+1|0}while((i|0)!=(v|0))}else{q=+g[U+(y<<5)>>2];p=+g[U+(y<<5)+4>>2];o=+g[U+(y<<5)+8>>2];n=+g[U+(y<<5)+16>>2];h=+g[U+(y<<5)+20>>2];e=+g[U+(y<<5)+24>>2]}n=O*o-Q*p+n;Q=h+(Q*q-N*o);za=N*p-O*q+e;g[U+(A+1<<5)>>2]=r*q+B*p+F*o+ +g[U+(A+1<<5)>>2];g[U+(A+1<<5)+4>>2]=s*q+C*p+G*o+ +g[U+(A+1<<5)+4>>2];g[U+(A+1<<5)+8>>2]=t*q+E*p+H*o+ +g[U+(A+1<<5)+8>>2];g[U+(A+1<<5)+16>>2]=r*n+B*Q+F*za+ +g[U+(A+1<<5)+16>>2];g[U+(A+1<<5)+20>>2]=s*n+C*Q+G*za+ +g[U+(A+1<<5)+20>>2];g[U+(A+1<<5)+24>>2]=t*n+E*Q+H*za+ +g[U+(A+1<<5)+24>>2]}while((y|0)>1)}if(!(a[X+421>>0]|0)){do if(!(c[X+132>>2]|0)){p=1.0/+g[X+44>>2];e=+g[U+16>>2]/+g[X+48>>2];h=+g[U+24>>2]/+g[X+56>>2];n=+g[U>>2]*p;o=p*+g[U+4>>2];p=p*+g[U+8>>2];q=+g[U+20>>2]/+g[X+52>>2]}else{if(!(a[X+420>>0]|0)){e=0.0;h=0.0;n=0.0;o=0.0;p=0.0;q=0.0;break}Va=+g[X+296>>2];cb=+g[X+316>>2];db=+g[X+300>>2];Ja=+g[X+312>>2];La=+g[X+308>>2];Ua=+g[X+292>>2];Ia=+g[X+276>>2];Ka=+g[X+280>>2];o=+g[X+284>>2];p=1.0/((Va*cb-db*Ja)*Ia+Ka*(db*La-cb*Ua)+(Ja*Ua-Va*La)*o);N=-((Va*cb-db*Ja)*p);Q=-((db*La-cb*Ua)*p);G=-((Ja*Ua-Va*La)*p);Pa=+g[X+372>>2];q=+g[X+376>>2];Na=+g[X+380>>2];Ga=Na*-((La*Ka-Ja*Ia)*p)+(Pa*-((Ja*o-cb*Ka)*p)+q*-((cb*Ia-La*o)*p));r=Na*-((Va*Ia-Ua*Ka)*p)+(Pa*-((db*Ka-Va*o)*p)+q*-((Ua*o-db*Ia)*p));hb=+g[X+388>>2];gb=+g[X+392>>2];ib=+g[X+396>>2];s=hb*-((Ja*o-cb*Ka)*p)+gb*-((cb*Ia-La*o)*p)+ib*-((La*Ka-Ja*Ia)*p);Fa=hb*-((db*Ka-Va*o)*p)+gb*-((Ua*o-db*Ia)*p)+ib*-((Va*Ia-Ua*Ka)*p);bb=+g[X+404>>2];C=+g[X+408>>2];ab=+g[X+412>>2];t=bb*-((Ja*o-cb*Ka)*p)+C*-((cb*Ia-La*o)*p)+ab*-((La*Ka-Ja*Ia)*p);Aa=bb*-((db*Ka-Va*o)*p)+C*-((Ua*o-db*Ia)*p)+ab*-((Va*Ia-Ua*Ka)*p);Sa=+g[X+228>>2];Oa=+g[X+244>>2];Xa=+g[X+260>>2];Ra=+g[X+232>>2];Ma=+g[X+248>>2];Wa=+g[X+264>>2];Ta=+g[X+236>>2];Qa=+g[X+252>>2];Ya=+g[X+268>>2];Ba=(Na*G+(Pa*N+q*Q))*Sa+Ga*Oa+r*Xa+ +g[X+324>>2];jb=(Na*G+(Pa*N+q*Q))*Ra+Ga*Ma+r*Wa+ +g[X+328>>2];r=(Na*G+(Pa*N+q*Q))*Ta+Ga*Qa+r*Ya+ +g[X+332>>2];Ga=(hb*N+gb*Q+ib*G)*Sa+s*Oa+Fa*Xa+ +g[X+340>>2];lb=(hb*N+gb*Q+ib*G)*Ra+s*Ma+Fa*Wa+ +g[X+344>>2];Fa=(hb*N+gb*Q+ib*G)*Ta+s*Qa+Fa*Ya+ +g[X+348>>2];s=Sa*(bb*N+C*Q+ab*G)+Oa*t+Aa*Xa+ +g[X+356>>2];h=(bb*N+C*Q+ab*G)*Ra+t*Ma+Aa*Wa+ +g[X+360>>2];Aa=(bb*N+C*Q+ab*G)*Ta+t*Qa+Aa*Ya+ +g[X+364>>2];t=1.0/(r*(Ga*h-lb*s)+(Ba*(lb*Aa-Fa*h)+jb*(Fa*s-Ga*Aa)));e=(lb*Aa-Fa*h)*t;Da=(Fa*s-Ga*Aa)*t;kb=(Ga*h-lb*s)*t;eb=bb*(jb*Fa-r*lb)*t+(Pa*e+hb*(r*h-jb*Aa)*t);n=C*(jb*Fa-r*lb)*t+(q*e+gb*(r*h-jb*Aa)*t);fb=ab*(jb*Fa-r*lb)*t+(Na*e+ib*(r*h-jb*Aa)*t);H=bb*(r*Ga-Ba*Fa)*t+(Pa*Da+hb*(Ba*Aa-r*s)*t);O=C*(r*Ga-Ba*Fa)*t+(q*Da+gb*(Ba*Aa-r*s)*t);F=ab*(r*Ga-Ba*Fa)*t+(Na*Da+ib*(Ba*Aa-r*s)*t);hb=bb*(Ba*lb-jb*Ga)*t+(Pa*kb+hb*(jb*s-Ba*h)*t);gb=C*(Ba*lb-jb*Ga)*t+(q*kb+gb*(jb*s-Ba*h)*t);ib=ab*(Ba*lb-jb*Ga)*t+(Na*kb+ib*(jb*s-Ba*h)*t);Na=fb*-((La*Ka-Ja*Ia)*p)+(eb*-((Ja*o-cb*Ka)*p)+n*-((cb*Ia-La*o)*p));ab=fb*-((Va*Ia-Ua*Ka)*p)+(eb*-((db*Ka-Va*o)*p)+n*-((Ua*o-db*Ia)*p));q=F*-((La*Ka-Ja*Ia)*p)+(H*-((Ja*o-cb*Ka)*p)+O*-((cb*Ia-La*o)*p));C=F*-((Va*Ia-Ua*Ka)*p)+(H*-((db*Ka-Va*o)*p)+O*-((Ua*o-db*Ia)*p));Pa=ib*-((La*Ka-Ja*Ia)*p)+(hb*-((Ja*o-cb*Ka)*p)+gb*-((cb*Ia-La*o)*p));bb=ib*-((Va*Ia-Ua*Ka)*p)+(hb*-((db*Ka-Va*o)*p)+gb*-((Ua*o-db*Ia)*p));_a=Qa*(ib*G+(hb*N+gb*Q))+(Oa*(fb*G+(eb*N+n*Q))+Ma*(F*G+(H*N+O*Q)));$a=Ya*(ib*G+(hb*N+gb*Q))+(Xa*(fb*G+(eb*N+n*Q))+Wa*(F*G+(H*N+O*Q)));Za=Ta*(ib*G+(hb*N+gb*Q))+(Sa*(fb*G+(eb*N+n*Q))+Ra*(F*G+(H*N+O*Q)))+-1.0;E=+g[U>>2];za=+g[U+4>>2];B=+g[U+8>>2];Ea=+g[U+16>>2];Ca=+g[U+20>>2];Ha=+g[U+24>>2];e=Ha*(jb*Fa-r*lb)*t+(Ea*e+Ca*(r*h-jb*Aa)*t)+(B*ab+(E*(fb*G+(eb*N+n*Q))+za*Na));h=Ha*(Ba*lb-jb*Ga)*t+(Ea*kb+Ca*(jb*s-Ba*h)*t)+(B*bb+(E*(ib*G+(hb*N+gb*Q))+za*Pa));n=Ha*(ib*G+(hb*N+gb*Q))+(Ea*(fb*G+(eb*N+n*Q))+Ca*(F*G+(H*N+O*Q)))+(B*((Ta*bb+(Sa*ab+Ra*C))*N+(Qa*bb+(Oa*ab+Ma*C))*-((Ja*o-cb*Ka)*p)+(Ya*bb+(Xa*ab+Wa*C)+-1.0)*-((db*Ka-Va*o)*p))+(E*($a*-((db*Ka-Va*o)*p)+(_a*-((Ja*o-cb*Ka)*p)+Za*N))+za*((Ya*Pa+(Xa*Na+Wa*q))*-((db*Ka-Va*o)*p)+((Ta*Pa+(Sa*Na+Ra*q))*N+(Qa*Pa+(Oa*Na+Ma*q)+-1.0)*-((Ja*o-cb*Ka)*p)))));o=Ha*Pa+(Ea*Na+Ca*q)+(B*((Ta*bb+(Sa*ab+Ra*C))*Q+(Qa*bb+(Oa*ab+Ma*C))*-((cb*Ia-La*o)*p)+(Ya*bb+(Xa*ab+Wa*C)+-1.0)*-((Ua*o-db*Ia)*p))+(E*($a*-((Ua*o-db*Ia)*p)+(_a*-((cb*Ia-La*o)*p)+Za*Q))+za*((Ya*Pa+(Xa*Na+Wa*q))*-((Ua*o-db*Ia)*p)+((Ta*Pa+(Sa*Na+Ra*q))*Q+(Qa*Pa+(Oa*Na+Ma*q)+-1.0)*-((cb*Ia-La*o)*p)))));p=Ha*bb+(Ea*ab+Ca*C)+(B*((Ta*bb+(Sa*ab+Ra*C))*G+(Qa*bb+(Oa*ab+Ma*C))*-((La*Ka-Ja*Ia)*p)+(Ya*bb+(Xa*ab+Wa*C)+-1.0)*-((Va*Ia-Ua*Ka)*p))+(E*($a*-((Va*Ia-Ua*Ka)*p)+(_a*-((La*Ka-Ja*Ia)*p)+Za*G))+za*((Ya*Pa+(Xa*Na+Wa*q))*-((Va*Ia-Ua*Ka)*p)+((Ta*Pa+(Sa*Na+Ra*q))*G+(Qa*Pa+(Oa*Na+Ma*q)+-1.0)*-((La*Ka-Ja*Ia)*p)))));q=Ha*(r*Ga-Ba*Fa)*t+(Ea*Da+Ca*(Ba*Aa-r*s)*t)+(B*C+(E*(F*G+(H*N+O*Q))+za*q))}while(0);e=-e;g[V>>2]=e;g[U+((Y<<1)+2<<4)+4>>2]=-q;g[U+((Y<<1)+2<<4)+8>>2]=-h;g[U+((Y<<1)+2<<4)+12>>2]=0.0;g[V+16>>2]=-n;g[V+20>>2]=-o;g[V+24>>2]=-p;g[V+28>>2]=0.0}else{c[V>>2]=0;c[V+4>>2]=0;c[V+8>>2]=0;c[V+12>>2]=0;c[V+16>>2]=0;c[V+20>>2]=0;c[V+24>>2]=0;c[V+28>>2]=0;e=0.0}if((Y|0)>0){v=0;K=c[X+140>>2]|0;do{w=v;v=v+1|0;e=+g[W+(v*48|0)>>2];h=+g[W+(v*48|0)+4>>2];n=+g[W+(v*48|0)+8>>2];o=+g[W+(v*48|0)+16>>2];p=+g[W+(v*48|0)+20>>2];q=+g[W+(v*48|0)+24>>2];r=+g[W+(v*48|0)+32>>2];s=+g[W+(v*48|0)+36>>2];t=+g[W+(v*48|0)+40>>2];lb=+g[K+(w*608|0)+352>>2];H=+g[K+(w*608|0)+356>>2];G=+g[K+(w*608|0)+360>>2];x=(c[K+(w*608|0)+20>>2]|0)+1|0;B=+g[V+(x<<5)>>2];C=+g[V+(x<<5)+4>>2];E=+g[V+(x<<5)+8>>2];y=V+(v<<5)|0;g[y>>2]=e*B+h*C+n*E;A=V+(v<<5)+4|0;g[A>>2]=o*B+p*C+q*E;J=V+(v<<5)+8|0;g[J>>2]=r*B+s*C+t*E;g[V+(v<<5)+12>>2]=0.0;ib=+g[V+(x<<5)+16>>2];jb=+g[V+(x<<5)+20>>2];kb=+g[V+(x<<5)+24>>2];F=e*ib+h*jb+n*kb-(H*(r*B+s*C+t*E)-G*(o*B+p*C+q*E));G=o*ib+p*jb+q*kb-(G*(e*B+h*C+n*E)-lb*(r*B+s*C+t*E));H=r*ib+s*jb+t*kb-(lb*(o*B+p*C+q*E)-H*(e*B+h*C+n*E));x=V+(v<<5)+16|0;g[x>>2]=F;z=V+(v<<5)+20|0;g[z>>2]=G;I=V+(v<<5)+24|0;g[I>>2]=H;g[V+(v<<5)+28>>2]=0.0;K=c[X+140>>2]|0;L=c[K+(w*608|0)+492>>2]|0;M=c[K+(w*608|0)+328>>2]|0;if((L|0)>0){i=0;do{u=M+i|0;g[ua+176+(i<<2)>>2]=+g[T+(u<<2)>>2]-(F*+g[S+(u<<5)>>2]+G*+g[S+(u<<5)+4>>2]+H*+g[S+(u<<5)+8>>2]+((e*B+h*C+n*E)*+g[S+(u<<5)+16>>2]+(o*B+p*C+q*E)*+g[S+(u<<5)+20>>2]+(r*B+s*C+t*E)*+g[S+(u<<5)+24>>2]));i=i+1|0}while((i|0)!=(L|0));k=R+((P(M,M)|0)<<2)|0;i=0;do{m=P(i,L)|0;u=f+24+(M<<2)+(i<<2)|0;g[u>>2]=0.0;j=0;e=0.0;do{e=e+ +g[k+(j+m<<2)>>2]*+g[ua+176+(j<<2)>>2];g[u>>2]=e;j=j+1|0}while((j|0)!=(L|0));i=i+1|0}while((i|0)!=(L|0));i=0;e=+g[y>>2];h=+g[A>>2];n=+g[J>>2];o=+g[x>>2];p=+g[z>>2];q=+g[I>>2];do{gb=+g[f+24+(M+i<<2)>>2];hb=gb*+g[K+(w*608|0)+136+(i<<5)+4>>2];ib=gb*+g[K+(w*608|0)+136+(i<<5)+8>>2];jb=gb*+g[K+(w*608|0)+136+(i<<5)+16>>2];kb=gb*+g[K+(w*608|0)+136+(i<<5)+20>>2];lb=gb*+g[K+(w*608|0)+136+(i<<5)+24>>2];e=+g[K+(w*608|0)+136+(i<<5)>>2]*gb+e;g[y>>2]=e;h=hb+h;g[A>>2]=h;n=ib+n;g[J>>2]=n;o=jb+o;g[x>>2]=o;p=kb+p;g[z>>2]=p;q=lb+q;g[I>>2]=q;i=i+1|0}while((i|0)!=(L|0))}}while((v|0)!=(Y|0));e=+g[V>>2]}kb=+g[U+((Y<<1)+2<<4)+4>>2];jb=+g[U+((Y<<1)+2<<4)+8>>2];ib=+g[W+4>>2]*e+ +g[W+20>>2]*kb+ +g[W+36>>2]*jb;hb=+g[W+8>>2]*e+ +g[W+24>>2]*kb+ +g[W+40>>2]*jb;g[f>>2]=+g[W>>2]*e+ +g[W+16>>2]*kb+ +g[W+32>>2]*jb;g[f+4>>2]=ib;g[f+8>>2]=hb;hb=+g[V+16>>2];ib=+g[V+20>>2];jb=+g[V+24>>2];kb=+g[W+4>>2]*hb+ +g[W+20>>2]*ib+ +g[W+36>>2]*jb;lb=+g[W+8>>2]*hb+ +g[W+24>>2]*ib+ +g[W+40>>2]*jb;g[f+12>>2]=+g[W>>2]*hb+ +g[W+16>>2]*ib+ +g[W+32>>2]*jb;g[f+16>>2]=kb;g[f+20>>2]=lb;if((ba|0)>-6){j=c[(c[ca+324>>2]|0)+180>>2]|0;i=0;e=0.0;do{e=e+ +g[j+(i<<2)>>2]*+g[$+(i<<2)>>2];i=i+1|0}while((i|0)<(ba+6|0))}else e=0.0;j=ca;k=0;h=ta*e*+g[aa>>2];n=ta*e*+g[Z>>2];e=ta*e*+g[_>>2];break}default:{j=0;k=0;h=0.0;n=0.0;e=0.0}}i=c[ea+(fa*104|0)+24>>2]|0;r=+g[i+8>>2];s=+g[i+12>>2];t=+g[i+16>>2];q=r-+g[i+24>>2]-h;p=s-+g[i+28>>2]-n;e=t-+g[i+32>>2]-e;h=+g[ea+(fa*104|0)+4>>2];n=+g[ea+(fa*104|0)+8>>2];o=+g[ea+(fa*104|0)+12>>2];if(q*h+p*n+e*o<=1.1920928955078125e-07){jb=r*h+s*n+t*o+ +g[ea+(fa*104|0)+20>>2];ib=+g[ea+(fa*104|0)+96>>2];jb=(jb>2];kb=(q-(q-h*(q*h+p*n+e*o))*ib+h*jb)*d;lb=(p-(p-n*(q*h+p*n+e*o))*ib+jb*n)*d;n=(e-(e-o*(q*h+p*n+e*o))*ib+jb*o)*d;e=+g[ea+(fa*104|0)+28>>2]*kb+ +g[ea+(fa*104|0)+32>>2]*lb+ +g[ea+(fa*104|0)+36>>2]*n;h=kb*+g[ea+(fa*104|0)+44>>2]+lb*+g[ea+(fa*104|0)+48>>2]+n*+g[ea+(fa*104|0)+52>>2];n=kb*+g[ea+(fa*104|0)+60>>2]+lb*+g[ea+(fa*104|0)+64>>2]+n*+g[ea+(fa*104|0)+68>>2];g[ua>>2]=e;g[ua+4>>2]=h;g[ua+8>>2]=n;g[ua+12>>2]=0.0;lb=+g[ea+(fa*104|0)+92>>2];g[i+8>>2]=r-e*lb;g[i+12>>2]=s-lb*h;g[i+16>>2]=t-lb*n;i=c[(c[da>>2]|0)+252>>2]|0;if((i|0)==2){if(k|0)ll(k,ua,ea+(fa*104|0)+76|0)}else if((j|0)!=0&(i|0)==64?(va=c[j+324>>2]|0,wa=+D(+(e*e+h*h+n*n))*-.5,xa=c[va+468>>2]|0,(xa|0)>-6):0){j=c[va+180>>2]|0;i=0;while(1){k=j+(i<<2)|0;h=wa*+g[f+(i<<2)>>2]+ +g[k>>2];g[k>>2]=h;e=+g[va+460>>2];if(!(h<-e)){if(e>2]=e}if((i|0)<(xa+5|0))i=i+1|0;else break}}}}fa=fa+1|0}while((fa|0)!=(sa|0));Ph(ua+48|0);l=ua;return}function hc(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,h=0,i=0,k=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0.0,D=0.0,E=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0;O=l;l=l+176|0;B=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;B=((xb[c[(c[B>>2]|0)+56>>2]&127](B)|0)&2048|0)!=0;M=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;M=((xb[c[(c[M>>2]|0)+56>>2]&127](M)|0)&4096|0)!=0;N=+g[d+40>>2];if(N<=0.0){l=O;return}switch(c[d+4>>2]|0){case 3:{c[O+112>>2]=1065353216;c[O+112+4>>2]=0;c[O+112+4+4>>2]=0;c[O+112+4+8>>2]=0;c[O+112+4+12>>2]=0;c[O+112+20>>2]=1065353216;c[O+112+24>>2]=0;c[O+112+24+4>>2]=0;c[O+112+24+8>>2]=0;c[O+112+24+12>>2]=0;c[O+112+40>>2]=1065353216;M=O+112+44|0;c[M>>2]=0;c[M+4>>2]=0;c[M+8>>2]=0;c[M+12>>2]=0;c[M+16>>2]=0;D=+g[d+300>>2];C=+g[d+304>>2];A=+g[d+308>>2];M=c[d+28>>2]|0;z=D*+g[M+20>>2]+C*+g[M+24>>2]+A*+g[M+28>>2]+ +g[M+56>>2];y=D*+g[M+36>>2]+C*+g[M+40>>2]+A*+g[M+44>>2]+ +g[M+60>>2];g[O+112+48>>2]=D*+g[M+4>>2]+C*+g[M+8>>2]+A*+g[M+12>>2]+ +g[M+52>>2];g[O+112+52>>2]=z;g[O+112+56>>2]=y;g[O+112+60>>2]=0.0;M=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[M>>2]|0)+64>>2]&7](M,O+112|0,N);y=+g[d+316>>2];z=+g[d+320>>2];A=+g[d+324>>2];d=c[d+32>>2]|0;C=y*+g[d+20>>2]+z*+g[d+24>>2]+A*+g[d+28>>2]+ +g[d+56>>2];D=y*+g[d+36>>2]+z*+g[d+40>>2]+A*+g[d+44>>2]+ +g[d+60>>2];g[O+112+48>>2]=y*+g[d+4>>2]+z*+g[d+8>>2]+A*+g[d+12>>2]+ +g[d+52>>2];g[O+112+52>>2]=C;g[O+112+56>>2]=D;g[O+112+60>>2]=0.0;if(B){b=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[b>>2]|0)+64>>2]&7](b,O+112|0,N)}l=O;return}case 4:{L=c[d+28>>2]|0;e=+g[d+552>>2];U=+g[L+4>>2];f=+g[d+552+16>>2];T=+g[L+8>>2];m=+g[d+552+32>>2];S=+g[L+12>>2];n=+g[d+552+4>>2];s=+g[d+552+20>>2];t=+g[d+552+36>>2];u=+g[d+552+8>>2];w=+g[d+552+24>>2];y=+g[d+552+40>>2];R=+g[L+20>>2];Q=+g[L+24>>2];P=+g[L+28>>2];v=+g[L+36>>2];x=+g[L+40>>2];z=+g[L+44>>2];W=+g[d+552+48>>2];V=+g[d+552+52>>2];D=+g[d+552+56>>2];A=+g[L+52>>2]+(U*W+T*V+S*D);C=R*W+Q*V+P*D+ +g[L+56>>2];D=v*W+x*V+z*D+ +g[L+60>>2];g[O+112>>2]=e*U+f*T+m*S;g[O+112+4>>2]=U*n+T*s+S*t;g[O+112+8>>2]=U*u+T*w+S*y;g[O+112+12>>2]=0.0;g[O+112+16>>2]=e*R+f*Q+m*P;g[O+112+20>>2]=n*R+s*Q+t*P;g[O+112+24>>2]=u*R+w*Q+y*P;g[O+112+28>>2]=0.0;g[O+112+32>>2]=e*v+f*x+m*z;g[O+112+36>>2]=n*v+s*x+t*z;g[O+112+40>>2]=u*v+w*x+y*z;g[O+112+44>>2]=0.0;g[O+112+48>>2]=A;g[O+112+52>>2]=C;g[O+112+56>>2]=D;g[O+112+60>>2]=0.0;if(B){L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N);L=c[d+32>>2]|0;w=+g[d+616>>2];m=+g[L+4>>2];x=+g[d+616+16>>2];n=+g[L+8>>2];y=+g[d+616+32>>2];s=+g[L+12>>2];z=+g[d+616+4>>2];A=+g[d+616+20>>2];C=+g[d+616+36>>2];D=+g[d+616+8>>2];Q=+g[d+616+24>>2];S=+g[d+616+40>>2];t=+g[L+20>>2];u=+g[L+24>>2];v=+g[L+28>>2];P=+g[L+36>>2];R=+g[L+40>>2];T=+g[L+44>>2];e=+g[d+616+48>>2];f=+g[d+616+52>>2];W=+g[d+616+56>>2];U=+g[L+52>>2]+(m*e+n*f+s*W);V=t*e+u*f+v*W+ +g[L+56>>2];W=P*e+R*f+T*W+ +g[L+60>>2];g[O+112>>2]=w*m+x*n+y*s;g[O+112+4>>2]=m*z+n*A+s*C;g[O+112+8>>2]=m*D+n*Q+s*S;g[O+112+12>>2]=0.0;g[O+112+16>>2]=w*t+x*u+y*v;g[O+112+20>>2]=z*t+A*u+C*v;g[O+112+24>>2]=D*t+Q*u+S*v;g[O+112+28>>2]=0.0;g[O+112+32>>2]=w*P+x*R+y*T;g[O+112+36>>2]=z*P+A*R+C*T;g[O+112+40>>2]=D*P+Q*R+S*T;g[O+112+44>>2]=0.0;g[O+112+48>>2]=U;g[O+112+52>>2]=V;g[O+112+56>>2]=W;g[O+112+60>>2]=0.0;L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N)}else{L=c[d+32>>2]|0;w=+g[d+616>>2];m=+g[L+4>>2];x=+g[d+616+16>>2];n=+g[L+8>>2];y=+g[d+616+32>>2];s=+g[L+12>>2];z=+g[d+616+4>>2];A=+g[d+616+20>>2];C=+g[d+616+36>>2];D=+g[d+616+8>>2];Q=+g[d+616+24>>2];S=+g[d+616+40>>2];t=+g[L+20>>2];u=+g[L+24>>2];v=+g[L+28>>2];P=+g[L+36>>2];R=+g[L+40>>2];T=+g[L+44>>2];e=+g[d+616+48>>2];f=+g[d+616+52>>2];W=+g[d+616+56>>2];U=+g[L+52>>2]+(m*e+n*f+s*W);V=t*e+u*f+v*W+ +g[L+56>>2];W=P*e+R*f+T*W+ +g[L+60>>2];g[O+112>>2]=w*m+x*n+y*s;g[O+112+4>>2]=m*z+n*A+s*C;g[O+112+8>>2]=m*D+n*Q+s*S;g[O+112+12>>2]=0.0;g[O+112+16>>2]=w*t+x*u+y*v;g[O+112+20>>2]=z*t+A*u+C*v;g[O+112+24>>2]=D*t+Q*u+S*v;g[O+112+28>>2]=0.0;g[O+112+32>>2]=w*P+x*R+y*T;g[O+112+36>>2]=z*P+A*R+C*T;g[O+112+40>>2]=D*P+Q*R+S*T;g[O+112+44>>2]=0.0;g[O+112+48>>2]=U;g[O+112+52>>2]=V;g[O+112+56>>2]=W;g[O+112+60>>2]=0.0}m=+g[d+688>>2];n=+g[d+688+4>>2];e=+mh(m-n,6.2831854820251465);if(!(e<-3.1415927410125732))if(e>3.1415927410125732)f=e+-6.2831854820251465;else f=e;else f=e+6.2831854820251465;e=+mh(m+n,6.2831854820251465);if(!(e<-3.1415927410125732)){if(e>3.1415927410125732)e=e+-6.2831854820251465}else e=e+6.2831854820251465;if(!(f==e)?M:0){c[O+96>>2]=c[O+112+8>>2];c[O+96+4>>2]=c[O+112+24>>2];c[O+96+8>>2]=c[O+112+40>>2];g[O+96+12>>2]=0.0;c[O+80>>2]=c[O+112>>2];c[O+80+4>>2]=c[O+112+16>>2];c[O+80+8>>2]=c[O+112+32>>2];g[O+80+12>>2]=0.0;b=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;d=c[(c[b>>2]|0)+68>>2]|0;c[O+64>>2]=0;c[O+64+4>>2]=0;c[O+64+8>>2]=0;c[O+64+12>>2]=0;Yb[d&0](b,O+112+48|0,O+96|0,O+80|0,N,N,n>0.0?f:0.0,n>0.0?e:6.2831854820251465,O+64|0,n>0.0,10.0)}l=O;return}case 5:{H=c[d+28>>2]|0;w=+g[d+300>>2];m=+g[H+4>>2];x=+g[d+300+16>>2];n=+g[H+8>>2];y=+g[d+300+32>>2];s=+g[H+12>>2];z=+g[d+300+4>>2];A=+g[d+300+20>>2];C=+g[d+300+36>>2];D=+g[d+300+8>>2];Q=+g[d+300+24>>2];S=+g[d+300+40>>2];t=+g[H+20>>2];u=+g[H+24>>2];v=+g[H+28>>2];P=+g[H+36>>2];R=+g[H+40>>2];T=+g[H+44>>2];e=+g[d+300+48>>2];f=+g[d+300+52>>2];W=+g[d+300+56>>2];U=+g[H+52>>2]+(m*e+n*f+s*W);V=t*e+u*f+v*W+ +g[H+56>>2];W=P*e+R*f+T*W+ +g[H+60>>2];g[O+112>>2]=w*m+x*n+y*s;H=O+112+4|0;g[H>>2]=m*z+n*A+s*C;J=O+112+8|0;g[J>>2]=m*D+n*Q+s*S;g[O+112+12>>2]=0.0;K=O+112+16|0;g[K>>2]=w*t+x*u+y*v;L=O+112+20|0;g[L>>2]=z*t+A*u+C*v;o=O+112+24|0;g[o>>2]=D*t+Q*u+S*v;g[O+112+28>>2]=0.0;p=O+112+32|0;g[p>>2]=w*P+x*R+y*T;q=O+112+36|0;g[q>>2]=z*P+A*R+C*T;r=O+112+40|0;g[r>>2]=D*P+Q*R+S*T;g[O+112+44>>2]=0.0;k=O+112+48|0;g[k>>2]=U;E=O+112+52|0;g[E>>2]=V;I=O+112+56|0;g[I>>2]=W;g[O+112+60>>2]=0.0;if(B){B=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[B>>2]|0)+64>>2]&7](B,O+112|0,N);B=c[d+32>>2]|0;w=+g[d+364>>2];m=+g[B+4>>2];x=+g[d+364+16>>2];n=+g[B+8>>2];y=+g[d+364+32>>2];s=+g[B+12>>2];z=+g[d+364+4>>2];A=+g[d+364+20>>2];C=+g[d+364+36>>2];D=+g[d+364+8>>2];Q=+g[d+364+24>>2];S=+g[d+364+40>>2];t=+g[B+20>>2];u=+g[B+24>>2];v=+g[B+28>>2];P=+g[B+36>>2];R=+g[B+40>>2];T=+g[B+44>>2];e=+g[d+364+48>>2];f=+g[d+364+52>>2];W=+g[d+364+56>>2];U=+g[B+52>>2]+(m*e+n*f+s*W);V=t*e+u*f+v*W+ +g[B+56>>2];W=P*e+R*f+T*W+ +g[B+60>>2];g[O+112>>2]=w*m+x*n+y*s;g[H>>2]=m*z+n*A+s*C;g[J>>2]=m*D+n*Q+s*S;g[O+112+12>>2]=0.0;g[K>>2]=w*t+x*u+y*v;g[L>>2]=z*t+A*u+C*v;g[o>>2]=D*t+Q*u+S*v;g[O+112+28>>2]=0.0;g[p>>2]=w*P+x*R+y*T;g[q>>2]=z*P+A*R+C*T;g[r>>2]=D*P+Q*R+S*T;g[O+112+44>>2]=0.0;g[k>>2]=U;g[E>>2]=V;g[I>>2]=W;g[O+112+60>>2]=0.0;B=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[B>>2]|0)+64>>2]&7](B,O+112|0,N)}else{B=c[d+32>>2]|0;w=+g[d+364>>2];m=+g[B+4>>2];x=+g[d+364+16>>2];n=+g[B+8>>2];y=+g[d+364+32>>2];s=+g[B+12>>2];z=+g[d+364+4>>2];A=+g[d+364+20>>2];C=+g[d+364+36>>2];D=+g[d+364+8>>2];Q=+g[d+364+24>>2];S=+g[d+364+40>>2];t=+g[B+20>>2];u=+g[B+24>>2];v=+g[B+28>>2];P=+g[B+36>>2];R=+g[B+40>>2];T=+g[B+44>>2];e=+g[d+364+48>>2];f=+g[d+364+52>>2];W=+g[d+364+56>>2];U=+g[B+52>>2]+(m*e+n*f+s*W);V=t*e+u*f+v*W+ +g[B+56>>2];W=P*e+R*f+T*W+ +g[B+60>>2];g[O+112>>2]=w*m+x*n+y*s;g[H>>2]=m*z+n*A+s*C;g[J>>2]=m*D+n*Q+s*S;g[O+112+12>>2]=0.0;g[K>>2]=w*t+x*u+y*v;g[L>>2]=z*t+A*u+C*v;g[o>>2]=D*t+Q*u+S*v;g[O+112+28>>2]=0.0;g[p>>2]=w*P+x*R+y*T;g[q>>2]=z*P+A*R+C*T;g[r>>2]=D*P+Q*R+S*T;g[O+112+44>>2]=0.0;g[k>>2]=U;g[E>>2]=V;g[I>>2]=W;g[O+112+60>>2]=0.0}if(M){Ak(O+96|0,d,6.0868353843688965,N);S=+g[O+96>>2];T=+g[O+96+4>>2];U=+g[O+96+8>>2];V=S*+g[K>>2]+T*+g[L>>2]+U*+g[o>>2]+ +g[E>>2];W=S*+g[p>>2]+T*+g[q>>2]+U*+g[r>>2]+ +g[I>>2];g[O+96>>2]=S*+g[O+112>>2]+T*+g[H>>2]+U*+g[J>>2]+ +g[k>>2];g[O+96+4>>2]=V;g[O+96+8>>2]=W;g[O+96+12>>2]=0.0;i=O+112+48|0;h=0;do{Ak(O+80|0,d,+(h|0)*6.283185005187988*.03125,N);S=+g[O+80>>2];T=+g[O+80+4>>2];U=+g[O+80+8>>2];V=S*+g[K>>2]+T*+g[L>>2]+U*+g[o>>2]+ +g[E>>2];W=S*+g[p>>2]+T*+g[q>>2]+U*+g[r>>2]+ +g[I>>2];g[O+80>>2]=S*+g[O+112>>2]+T*+g[H>>2]+U*+g[J>>2]+ +g[k>>2];g[O+80+4>>2]=V;g[O+80+8>>2]=W;g[O+80+12>>2]=0.0;M=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;B=c[(c[M>>2]|0)+16>>2]|0;c[O+64>>2]=0;c[O+64+4>>2]=0;c[O+64+8>>2]=0;c[O+64+12>>2]=0;Vb[B&127](M,O+96|0,O+80|0,O+64|0);if(!(h&3)){M=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;B=c[(c[M>>2]|0)+16>>2]|0;c[O+64>>2]=0;c[O+64+4>>2]=0;c[O+64+8>>2]=0;c[O+64+12>>2]=0;Vb[B&127](M,i,O+80|0,O+64|0)}c[O+96>>2]=c[O+80>>2];c[O+96+4>>2]=c[O+80+4>>2];c[O+96+8>>2]=c[O+80+8>>2];c[O+96+12>>2]=c[O+80+12>>2];h=h+1|0}while((h|0)!=32);C=+g[d+452>>2];D=+g[d+512>>2];h=c[d+32>>2]|0;if(+g[h+404>>2]>0.0){P=+g[d+364>>2];R=+g[h+4>>2];Q=+g[d+364+16>>2];S=+g[h+8>>2];z=+g[d+364+32>>2];A=+g[h+12>>2];Y=+g[d+364+4>>2];X=+g[d+364+20>>2];y=+g[d+364+36>>2];_=+g[d+364+8>>2];Z=+g[d+364+24>>2];x=+g[d+364+40>>2];aa=+g[h+20>>2];$=+g[h+24>>2];w=+g[h+28>>2];T=+g[h+36>>2];V=+g[h+40>>2];W=+g[h+44>>2];U=+g[d+364+48>>2];e=+g[d+364+52>>2];f=+g[d+364+56>>2];m=aa*U+$*e+w*f;n=_*T+Z*V+x*W;s=Y*T+X*V+y*W;t=P*T+Q*V+z*W;u=_*aa+Z*$+x*w;v=Y*aa+X*$+y*w;w=P*aa+Q*$+z*w;x=R*_+S*Z+A*x;y=R*Y+S*X+A*y;z=P*R+Q*S+z*A;A=R*U+S*e+A*f;h=h+4|0;e=T*U+V*e;f=W*f}else{h=c[d+28>>2]|0;V=+g[d+300>>2];X=+g[h+4>>2];W=+g[d+300+16>>2];Y=+g[h+8>>2];z=+g[d+300+32>>2];A=+g[h+12>>2];T=+g[d+300+4>>2];U=+g[d+300+20>>2];y=+g[d+300+36>>2];R=+g[d+300+8>>2];S=+g[d+300+24>>2];x=+g[d+300+40>>2];P=+g[h+20>>2];Q=+g[h+24>>2];w=+g[h+28>>2];Z=+g[h+36>>2];$=+g[h+40>>2];aa=+g[h+44>>2];_=+g[d+300+48>>2];e=+g[d+300+52>>2];f=+g[d+300+56>>2];m=P*_+Q*e+w*f;n=R*Z+S*$+x*aa;s=T*Z+U*$+y*aa;t=V*Z+W*$+z*aa;u=R*P+S*Q+x*w;v=T*P+U*Q+y*w;w=V*P+W*Q+z*w;x=X*R+Y*S+A*x;y=X*T+Y*U+A*y;z=V*X+W*Y+z*A;A=X*_+Y*e+A*f;h=h+4|0;e=Z*_+$*e;f=aa*f}_=A+ +g[h+48>>2];$=m+ +g[h+52>>2];aa=f+e+ +g[h+56>>2];g[O+112>>2]=z;g[H>>2]=y;g[J>>2]=x;g[O+112+12>>2]=0.0;g[K>>2]=w;g[L>>2]=v;g[o>>2]=u;g[O+112+28>>2]=0.0;g[p>>2]=t;g[q>>2]=s;g[r>>2]=n;g[O+112+44>>2]=0.0;g[k>>2]=_;g[E>>2]=$;g[I>>2]=aa;g[O+112+60>>2]=0.0;c[O+80>>2]=c[i>>2];c[O+80+4>>2]=c[i+4>>2];c[O+80+8>>2]=c[i+8>>2];c[O+80+12>>2]=c[i+12>>2];g[O+64>>2]=z;g[O+64+4>>2]=w;g[O+64+8>>2]=t;g[O+64+12>>2]=0.0;g[O+48>>2]=y;g[O+48+4>>2]=v;g[O+48+8>>2]=s;g[O+48+12>>2]=0.0;b=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;d=c[(c[b>>2]|0)+68>>2]|0;c[O+32>>2]=0;c[O+32+4>>2]=0;c[O+32+8>>2]=0;c[O+32+12>>2]=0;Yb[d&0](b,O+80|0,O+64|0,O+48|0,N,N,-D-C,C-D,O+32|0,1,10.0)}l=O;return}case 6:case 9:{c[O+112>>2]=c[d+1064>>2];c[O+112+4>>2]=c[d+1064+4>>2];c[O+112+8>>2]=c[d+1064+8>>2];c[O+112+12>>2]=c[d+1064+12>>2];i=d+1064+16|0;k=O+112+16|0;c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];o=d+1064+32|0;p=O+112+32|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];q=O+112+48|0;r=d+1064+48|0;c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];if(B){L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N);c[O+112>>2]=c[d+1128>>2];c[O+112+4>>2]=c[d+1128+4>>2];c[O+112+8>>2]=c[d+1128+8>>2];c[O+112+12>>2]=c[d+1128+12>>2];c[k>>2]=c[d+1128+16>>2];c[k+4>>2]=c[d+1128+16+4>>2];c[k+8>>2]=c[d+1128+16+8>>2];c[k+12>>2]=c[d+1128+16+12>>2];c[p>>2]=c[d+1128+32>>2];c[p+4>>2]=c[d+1128+32+4>>2];c[p+8>>2]=c[d+1128+32+8>>2];c[p+12>>2]=c[d+1128+32+12>>2];c[q>>2]=c[d+1128+48>>2];c[q+4>>2]=c[d+1128+48+4>>2];c[q+8>>2]=c[d+1128+48+8>>2];c[q+12>>2]=c[d+1128+48+12>>2];L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N)}else{c[O+112>>2]=c[d+1128>>2];c[O+112+4>>2]=c[d+1128+4>>2];c[O+112+8>>2]=c[d+1128+8>>2];c[O+112+12>>2]=c[d+1128+12>>2];c[k>>2]=c[d+1128+16>>2];c[k+4>>2]=c[d+1128+16+4>>2];c[k+8>>2]=c[d+1128+16+8>>2];c[k+12>>2]=c[d+1128+16+12>>2];c[p>>2]=c[d+1128+32>>2];c[p+4>>2]=c[d+1128+32+4>>2];c[p+8>>2]=c[d+1128+32+8>>2];c[p+12>>2]=c[d+1128+32+12>>2];c[q>>2]=c[d+1128+48>>2];c[q+4>>2]=c[d+1128+48+4>>2];c[q+8>>2]=c[d+1128+48+8>>2];c[q+12>>2]=c[d+1128+48+12>>2]}if(M){c[O+112>>2]=c[d+1064>>2];c[O+112+4>>2]=c[d+1064+4>>2];c[O+112+8>>2]=c[d+1064+8>>2];c[O+112+12>>2]=c[d+1064+12>>2];c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];h=d+1128+48|0;c[O+96>>2]=c[O+112+8>>2];c[O+96+4>>2]=c[O+112+24>>2];c[O+96+8>>2]=c[O+112+40>>2];g[O+96+12>>2]=0.0;c[O+80>>2]=c[O+112>>2];c[O+80+4>>2]=c[O+112+16>>2];c[O+80+8>>2]=c[O+112+32>>2];g[O+80+12>>2]=0.0;Y=+g[d+932>>2];e=+g[d+932+4>>2];$=+g[d+996>>2];_=+g[d+996+4>>2];K=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;L=c[(c[K>>2]|0)+72>>2]|0;c[O+64>>2]=0;c[O+64+4>>2]=0;c[O+64+8>>2]=0;c[O+64+12>>2]=0;Xb[L&0](K,h,O+96|0,O+80|0,N*.8999999761581421,Y,e,$,_,O+64|0,10.0,1);K=c[O+112+4>>2]|0;L=c[O+112+20>>2]|0;M=c[O+112+36>>2]|0;c[O+80>>2]=K;c[O+80+4>>2]=L;c[O+80+8>>2]=M;g[O+80+12>>2]=0.0;_=+g[d+1196>>2];$=+g[d+1200>>2];e=+F(+_);_=+G(+_);Y=+F(+$);$=+G(+$);Z=(c[j>>2]=K,+g[j>>2]);aa=(c[j>>2]=L,+g[j>>2]);f=(c[j>>2]=M,+g[j>>2]);g[O+64>>2]=e*Y*Z+e*$*aa-_*f;g[O+64+4>>2]=Y*aa-$*Z;g[O+64+8>>2]=_*Y*Z+_*$*aa+e*f;c[O+112>>2]=c[d+1128>>2];c[O+112+4>>2]=c[d+1128+4>>2];c[O+112+8>>2]=c[d+1128+8>>2];c[O+112+12>>2]=c[d+1128+12>>2];c[k>>2]=c[d+1128+16>>2];c[k+4>>2]=c[d+1128+16+4>>2];c[k+8>>2]=c[d+1128+16+8>>2];c[k+12>>2]=c[d+1128+16+12>>2];c[p>>2]=c[d+1128+32>>2];c[p+4>>2]=c[d+1128+32+4>>2];c[p+8>>2]=c[d+1128+32+8>>2];c[p+12>>2]=c[d+1128+32+12>>2];c[q>>2]=c[h>>2];c[q+4>>2]=c[h+4>>2];c[q+8>>2]=c[h+8>>2];c[q+12>>2]=c[h+12>>2];f=-+g[O+112+16>>2];e=-+g[O+112+32>>2];g[O+48>>2]=-+g[O+112>>2];g[O+48+4>>2]=f;g[O+48+8>>2]=e;g[O+48+12>>2]=0.0;e=+g[d+868>>2];f=+g[d+868+4>>2];if(!(e>f)){if(e>2]|0)+20>>2]&127](b)|0;L=c[(c[M>>2]|0)+68>>2]|0;c[O+32>>2]=0;c[O+32+4>>2]=0;c[O+32+8>>2]=0;c[O+32+12>>2]=0;Yb[L&0](M,h,O+48|0,O+64|0,N,N,e,f,O+32|0,1,10.0)}}else{M=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;L=c[(c[M>>2]|0)+68>>2]|0;c[O+32>>2]=0;c[O+32+4>>2]=0;c[O+32+8>>2]=0;c[O+32+12>>2]=0;Yb[L&0](M,h,O+48|0,O+64|0,N,N,-3.1415927410125732,3.1415927410125732,O+32|0,0,10.0)}c[O+112>>2]=c[d+1064>>2];c[O+112+4>>2]=c[d+1064+4>>2];c[O+112+8>>2]=c[d+1064+8>>2];c[O+112+12>>2]=c[d+1064+12>>2];c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];c[O+32>>2]=c[d+680>>2];c[O+32+4>>2]=c[d+680+4>>2];c[O+32+8>>2]=c[d+680+8>>2];c[O+32+12>>2]=c[d+680+12>>2];c[O+16>>2]=c[d+680+16>>2];c[O+16+4>>2]=c[d+680+16+4>>2];c[O+16+8>>2]=c[d+680+16+8>>2];c[O+16+12>>2]=c[d+680+16+12>>2];b=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;d=c[(c[b>>2]|0)+80>>2]|0;c[O>>2]=0;c[O+4>>2]=0;c[O+8>>2]=0;c[O+12>>2]=0;Zb[d&31](b,O+32|0,O+16|0,O+112|0,O)}l=O;return}case 12:{c[O+112>>2]=c[d+1236>>2];c[O+112+4>>2]=c[d+1236+4>>2];c[O+112+8>>2]=c[d+1236+8>>2];c[O+112+12>>2]=c[d+1236+12>>2];i=d+1236+16|0;k=O+112+16|0;c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];o=d+1236+32|0;p=O+112+32|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];q=O+112+48|0;r=d+1236+48|0;c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];if(B){L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N);c[O+112>>2]=c[d+1300>>2];c[O+112+4>>2]=c[d+1300+4>>2];c[O+112+8>>2]=c[d+1300+8>>2];c[O+112+12>>2]=c[d+1300+12>>2];c[k>>2]=c[d+1300+16>>2];c[k+4>>2]=c[d+1300+16+4>>2];c[k+8>>2]=c[d+1300+16+8>>2];c[k+12>>2]=c[d+1300+16+12>>2];c[p>>2]=c[d+1300+32>>2];c[p+4>>2]=c[d+1300+32+4>>2];c[p+8>>2]=c[d+1300+32+8>>2];c[p+12>>2]=c[d+1300+32+12>>2];c[q>>2]=c[d+1300+48>>2];c[q+4>>2]=c[d+1300+48+4>>2];c[q+8>>2]=c[d+1300+48+8>>2];c[q+12>>2]=c[d+1300+48+12>>2];L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N)}else{c[O+112>>2]=c[d+1300>>2];c[O+112+4>>2]=c[d+1300+4>>2];c[O+112+8>>2]=c[d+1300+8>>2];c[O+112+12>>2]=c[d+1300+12>>2];c[k>>2]=c[d+1300+16>>2];c[k+4>>2]=c[d+1300+16+4>>2];c[k+8>>2]=c[d+1300+16+8>>2];c[k+12>>2]=c[d+1300+16+12>>2];c[p>>2]=c[d+1300+32>>2];c[p+4>>2]=c[d+1300+32+4>>2];c[p+8>>2]=c[d+1300+32+8>>2];c[p+12>>2]=c[d+1300+32+12>>2];c[q>>2]=c[d+1300+48>>2];c[q+4>>2]=c[d+1300+48+4>>2];c[q+8>>2]=c[d+1300+48+8>>2];c[q+12>>2]=c[d+1300+48+12>>2]}if(M){c[O+112>>2]=c[d+1236>>2];c[O+112+4>>2]=c[d+1236+4>>2];c[O+112+8>>2]=c[d+1236+8>>2];c[O+112+12>>2]=c[d+1236+12>>2];c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];h=d+1300+48|0;c[O+96>>2]=c[O+112+8>>2];c[O+96+4>>2]=c[O+112+24>>2];c[O+96+8>>2]=c[O+112+40>>2];g[O+96+12>>2]=0.0;c[O+80>>2]=c[O+112>>2];c[O+80+4>>2]=c[O+112+16>>2];c[O+80+8>>2]=c[O+112+32>>2];g[O+80+12>>2]=0.0;Y=+g[d+1056>>2];e=+g[d+1060>>2];$=+g[d+1144>>2];_=+g[d+1144+4>>2];K=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;L=c[(c[K>>2]|0)+72>>2]|0;c[O+64>>2]=0;c[O+64+4>>2]=0;c[O+64+8>>2]=0;c[O+64+12>>2]=0;Xb[L&0](K,h,O+96|0,O+80|0,N*.8999999761581421,Y,e,$,_,O+64|0,10.0,1);K=c[O+112+4>>2]|0;L=c[O+112+20>>2]|0;M=c[O+112+36>>2]|0;c[O+80>>2]=K;c[O+80+4>>2]=L;c[O+80+8>>2]=M;g[O+80+12>>2]=0.0;_=+g[d+1368>>2];$=+g[d+1372>>2];e=+F(+_);_=+G(+_);Y=+F(+$);$=+G(+$);Z=(c[j>>2]=K,+g[j>>2]);aa=(c[j>>2]=L,+g[j>>2]);f=(c[j>>2]=M,+g[j>>2]);g[O+64>>2]=e*Y*Z+e*$*aa-_*f;g[O+64+4>>2]=Y*aa-$*Z;g[O+64+8>>2]=_*Y*Z+_*$*aa+e*f;c[O+112>>2]=c[d+1300>>2];c[O+112+4>>2]=c[d+1300+4>>2];c[O+112+8>>2]=c[d+1300+8>>2];c[O+112+12>>2]=c[d+1300+12>>2];c[k>>2]=c[d+1300+16>>2];c[k+4>>2]=c[d+1300+16+4>>2];c[k+8>>2]=c[d+1300+16+8>>2];c[k+12>>2]=c[d+1300+16+12>>2];c[p>>2]=c[d+1300+32>>2];c[p+4>>2]=c[d+1300+32+4>>2];c[p+8>>2]=c[d+1300+32+8>>2];c[p+12>>2]=c[d+1300+32+12>>2];c[q>>2]=c[h>>2];c[q+4>>2]=c[h+4>>2];c[q+8>>2]=c[h+8>>2];c[q+12>>2]=c[h+12>>2];f=-+g[O+112+16>>2];e=-+g[O+112+32>>2];g[O+48>>2]=-+g[O+112>>2];g[O+48+4>>2]=f;g[O+48+8>>2]=e;g[O+48+12>>2]=0.0;e=+g[d+968>>2];f=+g[d+968+4>>2];if(!(e>f)){if(e>2]|0)+20>>2]&127](b)|0;L=c[(c[M>>2]|0)+68>>2]|0;c[O+32>>2]=0;c[O+32+4>>2]=0;c[O+32+8>>2]=0;c[O+32+12>>2]=0;Yb[L&0](M,h,O+48|0,O+64|0,N,N,e,f,O+32|0,1,10.0)}}else{M=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;L=c[(c[M>>2]|0)+68>>2]|0;c[O+32>>2]=0;c[O+32+4>>2]=0;c[O+32+8>>2]=0;c[O+32+12>>2]=0;Yb[L&0](M,h,O+48|0,O+64|0,N,N,-3.1415927410125732,3.1415927410125732,O+32|0,0,10.0)}c[O+112>>2]=c[d+1236>>2];c[O+112+4>>2]=c[d+1236+4>>2];c[O+112+8>>2]=c[d+1236+8>>2];c[O+112+12>>2]=c[d+1236+12>>2];c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];c[O+32>>2]=c[d+680>>2];c[O+32+4>>2]=c[d+680+4>>2];c[O+32+8>>2]=c[d+680+8>>2];c[O+32+12>>2]=c[d+680+12>>2];c[O+16>>2]=c[d+680+16>>2];c[O+16+4>>2]=c[d+680+16+4>>2];c[O+16+8>>2]=c[d+680+16+8>>2];c[O+16+12>>2]=c[d+680+16+12>>2];b=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;d=c[(c[b>>2]|0)+80>>2]|0;c[O>>2]=0;c[O+4>>2]=0;c[O+8>>2]=0;c[O+12>>2]=0;Zb[d&31](b,O+32|0,O+16|0,O+112|0,O)}l=O;return}case 7:{c[O+112>>2]=c[d+824>>2];c[O+112+4>>2]=c[d+824+4>>2];c[O+112+8>>2]=c[d+824+8>>2];c[O+112+12>>2]=c[d+824+12>>2];h=O+112+16|0;c[h>>2]=c[d+824+16>>2];c[h+4>>2]=c[d+824+16+4>>2];c[h+8>>2]=c[d+824+16+8>>2];c[h+12>>2]=c[d+824+16+12>>2];i=O+112+32|0;c[i>>2]=c[d+824+32>>2];c[i+4>>2]=c[d+824+32+4>>2];c[i+8>>2]=c[d+824+32+8>>2];c[i+12>>2]=c[d+824+32+12>>2];k=O+112+48|0;c[k>>2]=c[d+824+48>>2];c[k+4>>2]=c[d+824+48+4>>2];c[k+8>>2]=c[d+824+48+8>>2];c[k+12>>2]=c[d+824+48+12>>2];if(B){L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N);c[O+112>>2]=c[d+888>>2];c[O+112+4>>2]=c[d+888+4>>2];c[O+112+8>>2]=c[d+888+8>>2];c[O+112+12>>2]=c[d+888+12>>2];c[h>>2]=c[d+888+16>>2];c[h+4>>2]=c[d+888+16+4>>2];c[h+8>>2]=c[d+888+16+8>>2];c[h+12>>2]=c[d+888+16+12>>2];c[i>>2]=c[d+888+32>>2];c[i+4>>2]=c[d+888+32+4>>2];c[i+8>>2]=c[d+888+32+8>>2];c[i+12>>2]=c[d+888+32+12>>2];c[k>>2]=c[d+888+48>>2];c[k+4>>2]=c[d+888+48+4>>2];c[k+8>>2]=c[d+888+48+8>>2];c[k+12>>2]=c[d+888+48+12>>2];L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N)}else{c[O+112>>2]=c[d+888>>2];c[O+112+4>>2]=c[d+888+4>>2];c[O+112+8>>2]=c[d+888+8>>2];c[O+112+12>>2]=c[d+888+12>>2];c[h>>2]=c[d+888+16>>2];c[h+4>>2]=c[d+888+16+4>>2];c[h+8>>2]=c[d+888+16+8>>2];c[h+12>>2]=c[d+888+16+12>>2];c[i>>2]=c[d+888+32>>2];c[i+4>>2]=c[d+888+32+4>>2];c[i+8>>2]=c[d+888+32+8>>2];c[i+12>>2]=c[d+888+32+12>>2];c[k>>2]=c[d+888+48>>2];c[k+4>>2]=c[d+888+48+4>>2];c[k+8>>2]=c[d+888+48+8>>2];c[k+12>>2]=c[d+888+48+12>>2]}if(M){E=a[d+180>>0]|0?d+824|0:d+888|0;H=c[E>>2]|0;K=c[E+4>>2]|0;I=c[E+16>>2]|0;L=c[E+20>>2]|0;J=c[E+32>>2]|0;M=c[E+36>>2]|0;Q=+g[E+48>>2];U=+g[E+52>>2];Y=+g[E+56>>2];$=+g[d+184>>2];T=(c[j>>2]=H,+g[j>>2]);S=(c[j>>2]=K,+g[j>>2])*0.0;R=+g[E+8>>2]*0.0;X=(c[j>>2]=I,+g[j>>2]);W=(c[j>>2]=L,+g[j>>2])*0.0;V=+g[E+24>>2]*0.0;aa=(c[j>>2]=J,+g[j>>2]);_=(c[j>>2]=M,+g[j>>2])*0.0;Z=+g[E+40>>2]*0.0;g[O+96>>2]=Q+(R+(S+T*$));g[O+96+4>>2]=U+(V+(W+X*$));g[O+96+8>>2]=Y+(Z+(_+aa*$));g[O+96+12>>2]=0.0;$=+g[d+188>>2];g[O+80>>2]=Q+(R+(S+T*$));g[O+80+4>>2]=U+(V+(W+X*$));g[O+80+8>>2]=Y+(Z+(_+aa*$));g[O+80+12>>2]=0.0;E=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;B=c[(c[E>>2]|0)+16>>2]|0;c[O+64>>2]=0;c[O+64+4>>2]=0;c[O+64+8>>2]=0;c[O+64+12>>2]=0;Vb[B&127](E,O+96|0,O+80|0,O+64|0);c[O+64>>2]=H;c[O+64+4>>2]=I;c[O+64+8>>2]=J;g[O+64+12>>2]=0.0;c[O+48>>2]=K;c[O+48+4>>2]=L;c[O+48+8>>2]=M;g[O+48+12>>2]=0.0;$=+g[d+192>>2];aa=+g[d+196>>2];b=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;M=c[(c[b>>2]|0)+68>>2]|0;c[O+32>>2]=0;c[O+32+4>>2]=0;c[O+32+8>>2]=0;c[O+32+12>>2]=0;Yb[M&0](b,d+888+48|0,O+64|0,O+48|0,N,N,$,aa,O+32|0,1,10.0)}l=O;return}default:{l=O;return}}}function ic(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0,F=0,G=0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0,Q=0,R=0,S=0,T=0.0,U=0,V=0,W=0,X=0,Y=0,Z=0;Z=l;l=l+112|0;c[Z+40>>2]=0;a[Z+16>>0]=1;c[Z+12>>2]=0;c[Z+4>>2]=0;c[Z+8>>2]=0;a[Z+36>>0]=1;c[Z+32>>2]=0;c[Z+24>>2]=0;c[Z+28>>2]=0;i=e>>>0>8?e:8;if((i|0)>0){c[6995]=(c[6995]|0)+1;h=sc((i<<4|3)+16|0)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}h=0;do{Y=j+(h<<4)|0;c[Y>>2]=c[Z+48>>2];c[Y+4>>2]=c[Z+48+4>>2];c[Y+8>>2]=c[Z+48+8>>2];c[Y+12>>2]=c[Z+48+12>>2];h=h+1|0}while((h|0)!=(i|0));Y=j;X=j}else{Y=0;X=0}do if(!e){w=0;h=0;q=0;u=0;v=0}else{i=c[Z+24>>2]|0;if((i|0)<0){h=c[Z+32>>2]|0;if((c[Z+28>>2]|0)<0){if(!((h|0)==0|(a[Z+36>>0]|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}a[Z+36>>0]=1;c[Z+32>>2]=0;c[Z+28>>2]=0;h=0}Yk(h+(i<<2)|0,0,P(i,-4)|0)|0}c[Z+24>>2]=0;h=d;i=0;x=3402823466385288598117041.0e14;p=-3402823466385288598117041.0e14;y=3402823466385288598117041.0e14;r=-3402823466385288598117041.0e14;z=3402823466385288598117041.0e14;t=-3402823466385288598117041.0e14;while(1){T=+g[h>>2];x=Tp?T:p;T=+g[h+4>>2];y=Tr?T:r;T=+g[h+8>>2];z=Tt?T:t;i=i+1|0;if((i|0)==(e|0))break;else h=h+16|0}s=p-x;T=r-y;p=t-z;K=x+s*.5;J=y+T*.5;E=z+p*.5;do if(e>>>0<3|(s<9.999999974752427e-07|T<9.999999974752427e-07|p<9.999999974752427e-07)){t=s>9.999999974752427e-07&s<3402823466385288598117041.0e14?s:3402823466385288598117041.0e14;t=T>9.999999974752427e-07&T9.999999974752427e-07&p>2];z=1.0/T*+g[n+4>>2];A=1.0/p*+g[n+8>>2];n=n+16|0;a:do if(h){j=0;while(1){d=Y+(j<<4)|0;r=+g[d>>2];k=Y+(j<<4)+4|0;t=+g[k>>2];m=Y+(j<<4)+8|0;x=+g[m>>2];if(+C(+(r-y))<1.0000000474974513e-03&+C(+(t-z))<1.0000000474974513e-03&+C(+(x-A))<1.0000000474974513e-03)break;j=j+1|0;if(j>>>0>=h>>>0){m=j;break a}}if((y-1.0/s*K)*(y-1.0/s*K)+(z-1.0/T*J)*(z-1.0/T*J)+(A-1.0/p*E)*(A-1.0/p*E)>(r-1.0/s*K)*(r-1.0/s*K)+(t-1.0/T*J)*(t-1.0/T*J)+(x-1.0/p*E)*(x-1.0/p*E)){g[d>>2]=y;g[k>>2]=z;g[m>>2]=A;m=j}else m=j}else m=0;while(0);if((m|0)==(h|0)){g[Y+(h<<4)>>2]=y;g[Y+(h<<4)+4>>2]=z;g[Y+(h<<4)+8>>2]=A;h=h+1|0}if((i|0)==(c[Z+28>>2]|0)?(q=i|0?i<<1:1,(i|0)<(q|0)):0){if((q|0)!=0?(c[6995]=(c[6995]|0)+1,u=sc((q<<2|3)+16|0)|0,(u|0)!=0):0){c[(u+4+15&-16)+-4>>2]=u;k=u+4+15&-16}else k=0;d=c[Z+32>>2]|0;if((i|0)<=0){if(d)W=37}else{j=0;do{c[k+(j<<2)>>2]=c[d+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0));W=37}if((W|0)==37){W=0;if(a[Z+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[Z+32>>2]=0;i=c[Z+24>>2]|0}a[Z+36>>0]=1;c[Z+32>>2]=k;c[Z+28>>2]=q}c[(c[Z+32>>2]|0)+(i<<2)>>2]=m;i=(c[Z+24>>2]|0)+1|0;c[Z+24>>2]=i;o=o+1|0}while((o|0)!=(e|0));if(!h){i=1;x=-3402823466385288598117041.0e14;E=3402823466385288598117041.0e14;t=-3402823466385288598117041.0e14;A=3402823466385288598117041.0e14;r=-3402823466385288598117041.0e14;y=3402823466385288598117041.0e14}else{i=0;B=3402823466385288598117041.0e14;E=3402823466385288598117041.0e14;H=-3402823466385288598117041.0e14;x=-3402823466385288598117041.0e14;J=3402823466385288598117041.0e14;A=3402823466385288598117041.0e14;K=-3402823466385288598117041.0e14;t=-3402823466385288598117041.0e14;M=3402823466385288598117041.0e14;y=3402823466385288598117041.0e14;N=-3402823466385288598117041.0e14;r=-3402823466385288598117041.0e14;while(1){z=+g[Y+(i<<4)>>2];j=zH;x=d?z:x;I=+g[Y+(i<<4)+4>>2];k=IK;t=m?I:t;L=+g[Y+(i<<4)+8>>2];n=LN;r=o?L:r;i=i+1|0;if((i|0)==(h|0))break;else{B=j?z:B;H=d?z:H;J=k?I:J;K=m?I:K;M=n?L:M;N=o?L:N}}i=h>>>0<3}x=x-E;z=t-A;B=r-y;if(!(i|(x<9.999999974752427e-07|z<9.999999974752427e-07|B<9.999999974752427e-07))){if(h|0){r=T;U=h;W=52;break}break}E=E+x*.5;A=A+z*.5;y=y+B*.5;t=x>=9.999999974752427e-07&x<3402823466385288598117041.0e14?x:3402823466385288598117041.0e14;t=z>=9.999999974752427e-07&z=9.999999974752427e-07&B>2]=t;g[Y+4>>2]=y;g[Y+8>>2]=z;g[Y+16>>2]=I;g[Y+20>>2]=y;g[Y+24>>2]=z;g[Y+32>>2]=I;g[Y+36>>2]=H;g[Y+40>>2]=z;g[Y+48>>2]=t;g[Y+52>>2]=H;g[Y+56>>2]=z;g[Y+64>>2]=t;g[Y+68>>2]=y;g[Y+72>>2]=B;g[Y+80>>2]=I;g[Y+84>>2]=y;g[Y+88>>2]=B;g[Y+96>>2]=I;g[Y+100>>2]=H;g[Y+104>>2]=B;g[Y+112>>2]=t;g[Y+116>>2]=H;g[Y+120>>2]=B;U=8;W=52}if((W|0)==52){h=0;do{V=Y+(h<<4)|0;g[V>>2]=s*+g[V>>2];V=Y+(h<<4)+4|0;g[V>>2]=r*+g[V>>2];V=Y+(h<<4)+8|0;g[V>>2]=p*+g[V>>2];h=h+1|0}while(h>>>0>>0);if((U|0)>=4){p=+g[Y>>2];s=+g[Y+4>>2];r=+g[Y+8>>2];V=U<<2;c[6995]=(c[6995]|0)+1;h=sc((V|3)+16|0)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}c[Z+48>>2]=0;c[6995]=(c[6995]|0)+1;i=sc((V|3)+16|0)|0;if(i){c[(i+4+15&-16)+-4>>2]=i;h=c[Z+48>>2]|0;if(!h)h=i+4+15&-16;else{c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);h=i+4+15&-16}}else h=0;c[Z+48>>2]=h;z=p;x=p;y=r;n=U;q=j;u=0;t=s;p=s;h=U;o=j;d=j;while(1){if((u|0)==(h|0)?(v=u|0?u<<1:1,(u|0)<(v|0)):0){if((v|0)!=0?(c[6995]=(c[6995]|0)+1,w=sc((v<<2|3)+16|0)|0,(w|0)!=0):0){c[(w+4+15&-16)+-4>>2]=w;i=w+4+15&-16}else i=0;j=c[Z+48>>2]|0;if((u|0)<=0){if(j|0)W=68}else{h=0;do{c[i+(h<<2)>>2]=c[j+(h<<2)>>2];h=h+1|0}while((h|0)!=(u|0));W=68}if((W|0)==68){W=0;c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);c[Z+48>>2]=0}c[Z+48>>2]=i;m=v}else m=h;c[(c[Z+48>>2]|0)+(u<<2)>>2]=1;k=u;u=u+1|0;do if((k|0)==(n|0)){i=k|0?k<<1:1;if((k|0)<(i|0)){if((i|0)!=0?(c[6995]=(c[6995]|0)+1,F=sc((i<<2|3)+16|0)|0,(F|0)!=0):0){c[(F+4+15&-16)+-4>>2]=F;j=F+4+15&-16}else j=0;if((k|0)>0){h=0;do{c[j+(h<<2)>>2]=c[q+(h<<2)>>2];h=h+1|0}while((h|0)!=(k|0));if(!d){q=j;d=j;o=j;break}}else if((q|0)==0|(d|0)==0){q=j;d=j;o=j;break}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);q=j;d=j;o=j}else i=k}else i=n;while(0);c[q+(k<<2)>>2]=0;M=+g[Y+(k<<4)>>2];x=M>2];p=N>2];r=T=(U|0))break;else{n=i;h=m}}z=z-x;x=t-p;I=y-r;I=+D(+(z*z+x*x+I*I))*1.0000000474974513e-03;O=Se(Y,U,.009999999776482582,.019999999552965164,1.0,c[Z+48>>2]|0)|0;m=c[Z+48>>2]|0;Q=Se(Y,U,-.009999999776482582,-.019999999552965164,-1.0,m)|0;n=Y+(O<<4)|0;u=Y+(Q<<4)|0;x=+g[n>>2]-+g[u>>2];v=Y+(O<<4)+4|0;w=Y+(Q<<4)+4|0;y=+g[v>>2]-+g[w>>2];F=Y+(O<<4)+8|0;G=Y+(Q<<4)+8|0;z=+g[F>>2]-+g[G>>2];b:do if((O|0)!=(Q|0)?!(z==0.0&y==0.0&x==0.0):0){p=+D(+((z*.019999999552965164-y*0.0)*(z*.019999999552965164-y*0.0)+(x*0.0-z)*(x*0.0-z)+(y-x*.019999999552965164)*(y-x*.019999999552965164)));r=+D(+((z-y*0.0)*(z-y*0.0)+(z*.019999999552965164+x*0.0)*(z*.019999999552965164+x*0.0)+(y*-.019999999552965164-x)*(y*-.019999999552965164-x)));if(p>r){s=(y-x*.019999999552965164)*(1.0/p);t=(z*.019999999552965164-y*0.0)*(1.0/p);p=(x*0.0-z)*(1.0/p)}else{s=(y*-.019999999552965164-x)*(1.0/r);t=(z-y*0.0)*(1.0/r);p=(z*.019999999552965164+x*0.0)*(1.0/r)}h=Se(Y,U,t,p,s,m)|0;if((h|0)==(O|0)|(h|0)==(Q|0))i=Se(Y,U,-t,-p,-s,m)|0;else i=h;if(!((i|0)==(O|0)|(i|0)==(Q|0))){j=Y+(i<<4)|0;p=+g[j>>2]-+g[n>>2];d=Y+(i<<4)+4|0;r=+g[d>>2]-+g[v>>2];k=Y+(i<<4)+8|0;s=+g[k>>2]-+g[F>>2];t=1.0/+D(+((y*p-r*x)*(y*p-r*x)+((r*z-s*y)*(r*z-s*y)+(s*x-z*p)*(s*x-z*p))));h=Se(Y,U,(r*z-s*y)*t,(s*x-z*p)*t,(y*p-r*x)*t,m)|0;if((h|0)==(i|0)|((h|0)==(O|0)|(h|0)==(Q|0)))h=Se(Y,U,-((r*z-s*y)*t),-((s*x-z*p)*t),-((y*p-r*x)*t),m)|0;if(!((h|0)==(i|0)|((h|0)==(O|0)|(h|0)==(Q|0)))?(E=+g[n>>2],K=+g[v>>2],B=+g[F>>2],N=+g[u>>2]-E,H=+g[w>>2]-K,L=+g[G>>2]-B,M=+g[j>>2]-E,J=+g[d>>2]-K,T=+g[k>>2]-B,R=(+g[Y+(h<<4)+8>>2]-B)*(N*J-H*M)+((+g[Y+(h<<4)>>2]-E)*(H*T-L*J)+(+g[Y+(h<<4)+4>>2]-K)*(L*M-N*T))<0.0,S=R?i:h,R=R?h:i,(O|0)!=-1):0){B=(+g[Y+(O<<4)>>2]+ +g[Y+(Q<<4)>>2]+ +g[Y+(R<<4)>>2]+ +g[Y+(S<<4)>>2])*.25;E=(+g[Y+(O<<4)+4>>2]+ +g[Y+(Q<<4)+4>>2]+ +g[Y+(R<<4)+4>>2]+ +g[Y+(S<<4)+4>>2])*.25;H=(+g[Y+(O<<4)+8>>2]+ +g[Y+(Q<<4)+8>>2]+ +g[Y+(R<<4)+8>>2]+ +g[Y+(S<<4)+8>>2])*.25;h=Lh(Z,R,S,Q)|0;c[h+12>>2]=2;c[h+16>>2]=3;c[h+20>>2]=1;h=Lh(Z,S,R,O)|0;c[h+12>>2]=3;c[h+16>>2]=2;c[h+20>>2]=0;h=Lh(Z,O,Q,S)|0;c[h+12>>2]=0;c[h+16>>2]=1;c[h+20>>2]=3;h=Lh(Z,Q,O,R)|0;c[h+12>>2]=1;c[h+16>>2]=0;c[h+20>>2]=2;c[q+(S<<2)>>2]=1;c[q+(R<<2)>>2]=1;c[q+(Q<<2)>>2]=1;c[q+(O<<2)>>2]=1;h=c[Z+4>>2]|0;if((h|0)>0){j=c[Z+12>>2]|0;i=0;do{h=c[j+(i<<2)>>2]|0;R=c[h>>2]|0;Q=c[h+4>>2]|0;S=c[h+8>>2]|0;x=+g[Y+(Q<<4)>>2];s=x-+g[Y+(R<<4)>>2];y=+g[Y+(Q<<4)+4>>2];t=y-+g[Y+(R<<4)+4>>2];r=+g[Y+(Q<<4)+8>>2];p=r-+g[Y+(R<<4)+8>>2];x=+g[Y+(S<<4)>>2]-x;y=+g[Y+(S<<4)+4>>2]-y;r=+g[Y+(S<<4)+8>>2]-r;z=+D(+((s*y-t*x)*(s*y-t*x)+((t*r-p*y)*(t*r-p*y)+(p*x-s*r)*(p*x-s*r))));if(z==0.0){A=1.0;r=0.0;p=0.0}else{A=1.0/z*(t*r-p*y);r=1.0/z*(p*x-s*r);p=1.0/z*(s*y-t*x)}R=Se(Y,U,A,r,p,c[Z+48>>2]|0)|0;c[h+28>>2]=R;S=c[h>>2]|0;g[h+32>>2]=(+g[Y+(R<<4)>>2]-+g[Y+(S<<4)>>2])*A+(+g[Y+(R<<4)+4>>2]-+g[Y+(S<<4)+4>>2])*r+(+g[Y+(R<<4)+8>>2]-+g[Y+(S<<4)+8>>2])*p;i=i+1|0;h=c[Z+4>>2]|0}while((i|0)<(h|0))}if((e+-4|0)>0){u=e+-4|0;while(1){m=c[Z+12>>2]|0;d=0;i=0;do{j=c[m+(d<<2)>>2]|0;do if(i){if(!j)break;if(+g[i+32>>2]<+g[j+32>>2])W=104}else W=104;while(0);if((W|0)==104){W=0;i=j}d=d+1|0}while((d|0)<(h|0));if((i|0)==0?1:!(+g[i+32>>2]>I)){h=1;break b}n=c[i+28>>2]|0;c[q+(n<<2)>>2]=1;h=c[Z+4>>2]|0;c:do if(h|0){j=Y+(n<<4)|0;d=Y+(n<<4)+4|0;k=Y+(n<<4)+8|0;i=m;while(1){h=h+-1|0;i=c[i+(h<<2)>>2]|0;do if(i|0){S=c[i>>2]|0;R=c[i+4>>2]|0;e=c[i+8>>2]|0;M=+g[Y+(R<<4)>>2];N=+g[Y+(S<<4)>>2];x=+g[Y+(R<<4)+4>>2];z=+g[Y+(S<<4)+4>>2];J=+g[Y+(R<<4)+8>>2];K=+g[Y+(S<<4)+8>>2];L=+g[Y+(e<<4)>>2]-M;y=+g[Y+(e<<4)+4>>2]-x;T=+g[Y+(e<<4)+8>>2]-J;A=+D(+(((M-N)*y-(x-z)*L)*((M-N)*y-(x-z)*L)+(((x-z)*T-(J-K)*y)*((x-z)*T-(J-K)*y)+((J-K)*L-(M-N)*T)*((J-K)*L-(M-N)*T))));if(!((A==0.0?0.0:1.0/A*((M-N)*y-(x-z)*L))*(+g[k>>2]-K)+((+g[j>>2]-N)*(A==0.0?1.0:1.0/A*((x-z)*T-(J-K)*y))+(+g[d>>2]-z)*(A==0.0?0.0:1.0/A*((J-K)*L-(M-N)*T)))>I*.009999999776482582))break;me(Z,i,n)}while(0);if(!h)break;i=c[Z+12>>2]|0}h=c[Z+4>>2]|0;if(!h)break;else i=h;d:do{i=i+-1|0;d=c[Z+12>>2]|0;k=c[d+(i<<2)>>2]|0;do if(k){m=c[k>>2]|0;do if((m|0)!=(n|0)){j=c[k+4>>2]|0;if((j|0)==(n|0)){j=n;break}if((c[k+8>>2]|0)!=(n|0))break d}else j=c[k+4>>2]|0;while(0);e=c[k+8>>2]|0;M=+g[Y+(j<<4)>>2];N=+g[Y+(m<<4)>>2];x=+g[Y+(j<<4)+4>>2];z=+g[Y+(m<<4)+4>>2];J=+g[Y+(j<<4)+8>>2];K=+g[Y+(m<<4)+8>>2];L=+g[Y+(e<<4)>>2]-M;y=+g[Y+(e<<4)+4>>2]-x;T=+g[Y+(e<<4)+8>>2]-J;A=+D(+(((M-N)*y-(x-z)*L)*((M-N)*y-(x-z)*L)+(((x-z)*T-(J-K)*y)*((x-z)*T-(J-K)*y)+((J-K)*L-(M-N)*T)*((J-K)*L-(M-N)*T))));if(!(AI*.009999999776482582))break;me(Z,c[d+(c[k+12>>2]<<2)>>2]|0,n);h=c[Z+4>>2]|0;i=h}while(0)}while((i|0)!=0);if(!h)break;d=c[Z+12>>2]|0;do{h=h+-1|0;j=c[d+(h<<2)>>2]|0;do if(j|0){if((c[j+28>>2]|0)>-1)break c;S=c[j>>2]|0;R=c[j+4>>2]|0;e=c[j+8>>2]|0;x=+g[Y+(R<<4)>>2];s=x-+g[Y+(S<<4)>>2];y=+g[Y+(R<<4)+4>>2];t=y-+g[Y+(S<<4)+4>>2];r=+g[Y+(R<<4)+8>>2];p=r-+g[Y+(S<<4)+8>>2];x=+g[Y+(e<<4)>>2]-x;y=+g[Y+(e<<4)+4>>2]-y;r=+g[Y+(e<<4)+8>>2]-r;z=+D(+((s*y-t*x)*(s*y-t*x)+((t*r-p*y)*(t*r-p*y)+(p*x-s*r)*(p*x-s*r))));if(z==0.0){A=1.0;r=0.0;p=0.0}else{A=1.0/z*(t*r-p*y);r=1.0/z*(p*x-s*r);p=1.0/z*(s*y-t*x)}i=Se(Y,U,A,r,p,c[Z+48>>2]|0)|0;c[j+28>>2]=i;if(!(c[q+(i<<2)>>2]|0)){e=c[j>>2]|0;g[j+32>>2]=(+g[Y+(i<<4)>>2]-+g[Y+(e<<4)>>2])*A+(+g[Y+(i<<4)+4>>2]-+g[Y+(e<<4)+4>>2])*r+(+g[Y+(i<<4)+8>>2]-+g[Y+(e<<4)+8>>2])*p;break}else{c[j+28>>2]=-1;break}}while(0)}while((h|0)!=0)}while(0);if((u|0)<=1){h=1;break b}u=u+-1|0;h=c[Z+4>>2]|0}}else h=1}else h=0}else h=0}else h=0;while(0);i=c[Z+48>>2]|0;if(i|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);c[Z+48>>2]=0}if(!((q|0)==0|(o|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0)}if(h){h=c[Z+4>>2]|0;if((h|0)>0){v=0;m=0;j=0;k=0;i=0;d=c[Z+12>>2]|0;n=0;do{o=c[d+(v<<2)>>2]|0;if(o){do if((k|0)==(m|0)){d=m|0?m<<1:1;if((m|0)>=(d|0)){d=m;break}do if(!d)i=0;else{c[6995]=(c[6995]|0)+1;h=sc((d<<2|3)+16|0)|0;if(!h){i=0;break}c[(h+4+15&-16)+-4>>2]=h;i=h+4+15&-16}while(0);if((m|0)>0){h=0;do{c[i+(h<<2)>>2]=c[j+(h<<2)>>2];h=h+1|0}while((h|0)!=(m|0));if(!n){j=i;n=i;break}}else if((j|0)==0|(n|0)==0){j=i;n=i;break}c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0);j=i;n=i}else d=m;while(0);c[j+(k<<2)>>2]=c[o>>2];o=k+1|0;q=(c[(c[Z+12>>2]|0)+(v<<2)>>2]|0)+4|0;do if((o|0)==(d|0)){m=d|0?d<<1:1;if((d|0)>=(m|0)){u=n;break}do if(!m)i=0;else{c[6995]=(c[6995]|0)+1;h=sc((m<<2|3)+16|0)|0;if(!h){i=0;break}c[(h+4+15&-16)+-4>>2]=h;i=h+4+15&-16}while(0);if((d|0)>0){h=0;do{c[i+(h<<2)>>2]=c[j+(h<<2)>>2];h=h+1|0}while((h|0)!=(d|0));if(!n){d=m;j=i;u=i;break}}else if((j|0)==0|(n|0)==0){d=m;j=i;u=i;break}c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0);d=m;j=i;u=i}else u=n;while(0);c[j+(o<<2)>>2]=c[q>>2];o=k+2|0;q=(c[(c[Z+12>>2]|0)+(v<<2)>>2]|0)+8|0;do if((o|0)==(d|0)){m=d|0?d<<1:1;if((d|0)>=(m|0)){m=d;n=u;break}do if(!m)n=0;else{c[6995]=(c[6995]|0)+1;h=sc((m<<2|3)+16|0)|0;if(!h){n=0;break}c[(h+4+15&-16)+-4>>2]=h;n=h+4+15&-16}while(0);if((d|0)>0){h=0;do{c[n+(h<<2)>>2]=c[j+(h<<2)>>2];h=h+1|0}while((h|0)!=(d|0));if(!u){j=n;i=n;break}}else if((j|0)==0|(u|0)==0){j=n;i=n;break}c[6996]=(c[6996]|0)+1;Cd(c[u+-4>>2]|0);j=n;i=n}else{m=d;n=u}while(0);c[j+(o<<2)>>2]=c[q>>2];d=c[Z+12>>2]|0;h=c[d+(v<<2)>>2]|0;c[d+(c[h+24>>2]<<2)>>2]=0;if(h|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}k=k+3|0;h=c[Z+4>>2]|0}v=v+1|0}while((v|0)<(h|0));c[Z+44>>2]=(k|0)/3|0;if((k|0)>0){c[6995]=(c[6995]|0)+1;h=sc((k<<2|3)+16|0)|0;if(!h)d=0;else{c[(h+4+15&-16)+-4>>2]=h;d=h+4+15&-16}Yk(d|0,0,k<<2|0)|0;h=0;do{c[d+(h<<2)>>2]=c[j+(h<<2)>>2];h=h+1|0}while((h|0)!=(k|0));n=i;m=j;h=d;S=d}else{n=i;m=j;h=0;S=0}}else{c[Z+44>>2]=0;n=0;m=0;h=0;k=0;S=0}i=c[Z+4>>2]|0;if((i|0)<0){if((c[Z+8>>2]|0)<0){j=c[Z+12>>2]|0;if(j|0){if(a[Z+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[Z+12>>2]=0}a[Z+16>>0]=1;c[Z+12>>2]=0;c[Z+8>>2]=0}do{c[(c[Z+12>>2]|0)+(i<<2)>>2]=0;i=i+1|0}while((i|0)!=0)}c[Z+4>>2]=0;if(!((m|0)==0|(n|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}R=c[Z+44>>2]|0;m=(U|0)>0;if(m){c[6995]=(c[6995]|0)+1;i=sc((U<<4|3)+16|0)|0;if(!i)j=0;else{c[(i+4+15&-16)+-4>>2]=i;j=i+4+15&-16}i=0;do{e=j+(i<<4)|0;c[e>>2]=c[Z+48>>2];c[e+4>>2]=c[Z+48+4>>2];c[e+8>>2]=c[Z+48+8>>2];c[e+12>>2]=c[Z+48+12>>2];i=i+1|0}while((i|0)!=(U|0));Q=j;O=j}else{Q=0;O=0}j=c[Z+24>>2]|0;do if((j|0)>0){c[6995]=(c[6995]|0)+1;i=sc((j<<2|3)+16|0)|0;if(!i)d=0;else{c[(i+4+15&-16)+-4>>2]=i;d=i+4+15&-16}Yk(d|0,0,j<<2|0)|0;if((c[Z+24>>2]|0)<=0){G=d;F=d;break}j=c[Z+32>>2]|0;i=0;do{c[d+(i<<2)>>2]=c[j+(i<<2)>>2];i=i+1|0}while((i|0)<(c[Z+24>>2]|0));G=d;F=d}else{G=0;F=0}while(0);if(m){c[6995]=(c[6995]|0)+1;i=sc((V|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}Yk(i|0,0,V|0)|0;u=i;v=i}else{u=0;v=0}Yk(v|0,0,V|0)|0;if((R|0)<=0)if(!u)w=0;else{i=0;W=221}else{q=c[Z+32>>2]|0;o=0;i=0;do{j=h+(o<<2)|0;m=c[j>>2]|0;n=u+(m<<2)|0;d=c[n>>2]|0;if(!d){c[j>>2]=i;c[Q+(i<<4)>>2]=c[X+(m<<4)>>2];c[Q+(i<<4)+4>>2]=c[X+(m<<4)+4>>2];c[Q+(i<<4)+8>>2]=c[X+(m<<4)+8>>2];d=c[Z+24>>2]|0;if((d|0)>0){j=0;do{if((c[G+(j<<2)>>2]|0)==(m|0))c[q+(j<<2)>>2]=i;j=j+1|0}while((j|0)!=(d|0))}i=i+1|0;c[n>>2]=i}else c[j>>2]=d+-1;o=o+1|0}while((o|0)!=(R*3|0));W=221}do if((W|0)==221){if(!v){w=i;break}c[6996]=(c[6996]|0)+1;Cd(c[v+-4>>2]|0);w=i}while(0);if(!((G|0)==0|(F|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[F+-4>>2]|0)}if((w|0)>0){c[6995]=(c[6995]|0)+1;i=sc((w<<4|3)+16|0)|0;if(!i)j=0;else{c[(i+4+15&-16)+-4>>2]=i;j=i+4+15&-16}i=0;do{W=j+(i<<4)|0;c[W>>2]=c[Z+48>>2];c[W+4>>2]=c[Z+48+4>>2];c[W+8>>2]=c[Z+48+8>>2];c[W+12>>2]=c[Z+48+12>>2];i=i+1|0}while((i|0)!=(w|0));m=j;d=j}else{m=0;d=0}if((R|0)>0){c[6995]=(c[6995]|0)+1;i=sc((R*12|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}j=c[Z+40>>2]|0;if(j|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[Z+40>>2]=i;Yk(i|0,0,R*12|0)|0}gi(d|0,O|0,w<<4|0)|0;gi(c[Z+40>>2]|0,S|0,R*12|0)|0;do if(k){if(!h){h=0;break}c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);h=0}while(0);if((Q|0)==0|(O|0)==0){q=m;u=R;v=R*3|0;break}c[6996]=(c[6996]|0)+1;Cd(c[O+-4>>2]|0);q=m;u=R;v=R*3|0;break}}}w=0;h=0;q=0;u=0;v=0}while(0);if(!((Y|0)==0|(X|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[X+-4>>2]|0)}if(h|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[6995]=(c[6995]|0)+1;h=sc(1271)|0;if(!h)F=0;else{c[(h+4+15&-16)+-4>>2]=h;F=h+4+15&-16}Bc(F,b,w,q,0);if((u|0)>0){i=F+780|0;j=F+792|0;d=F+800|0;k=F+984|0;h=0;do{o=h*3|0;b=c[Z+40>>2]|0;m=c[b+(o<<2)>>2]|0;n=c[b+(o+1<<2)>>2]|0;o=c[b+(o+2<<2)>>2]|0;if((m|0)<(n|0)){X=c[i>>2]|0;Xh(F,0);b=(c[j>>2]|0)+-1|0;Y=c[d>>2]|0;c[Y+(b*52|0)+24>>2]=X+(m*104|0);c[Y+(b*52|0)+28>>2]=X+(n*104|0);M=+g[X+(m*104|0)+8>>2]-+g[X+(n*104|0)+8>>2];N=+g[X+(m*104|0)+12>>2]-+g[X+(n*104|0)+12>>2];T=+g[X+(m*104|0)+16>>2]-+g[X+(n*104|0)+16>>2];g[Y+(b*52|0)+32>>2]=+D(+(M*M+N*N+T*T));a[k>>0]=1}if((n|0)<(o|0)){X=c[i>>2]|0;Xh(F,0);b=(c[j>>2]|0)+-1|0;Y=c[d>>2]|0;c[Y+(b*52|0)+24>>2]=X+(n*104|0);c[Y+(b*52|0)+28>>2]=X+(o*104|0);M=+g[X+(n*104|0)+8>>2]-+g[X+(o*104|0)+8>>2];N=+g[X+(n*104|0)+12>>2]-+g[X+(o*104|0)+12>>2];T=+g[X+(n*104|0)+16>>2]-+g[X+(o*104|0)+16>>2];g[Y+(b*52|0)+32>>2]=+D(+(M*M+N*N+T*T));a[k>>0]=1}if((o|0)<(m|0)){X=c[i>>2]|0;Xh(F,0);b=(c[j>>2]|0)+-1|0;Y=c[d>>2]|0;c[Y+(b*52|0)+24>>2]=X+(o*104|0);c[Y+(b*52|0)+28>>2]=X+(m*104|0);M=+g[X+(o*104|0)+8>>2]-+g[X+(m*104|0)+8>>2];N=+g[X+(o*104|0)+12>>2]-+g[X+(m*104|0)+12>>2];T=+g[X+(o*104|0)+16>>2]-+g[X+(m*104|0)+16>>2];g[Y+(b*52|0)+32>>2]=+D(+(M*M+N*N+T*T));a[k>>0]=1}bg(F,m,n,o,0);h=h+1|0}while((h|0)!=(u|0))}if(w)if(!q)u=0;else{c[6996]=(c[6996]|0)+1;Cd(c[q+-4>>2]|0);u=0}else u=q;if(v|0){h=c[Z+40>>2]|0;if(h|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);c[Z+40>>2]=0}c[Z+40>>2]=0}if(f){j=c[F+792>>2]|0;if((j|0)>0){d=F+800|0;h=243703;i=0;do{k=c[d>>2]|0;m=k+(i*52|0)|0;h=(P(h,1664525)|0)+1013904223|0;n=Z+48|0;o=m;q=n+52|0;do{c[n>>2]=c[o>>2];n=n+4|0;o=o+4|0}while((n|0)<(q|0));n=m;o=k+(((h>>>0)%(j>>>0)|0)*52|0)|0;q=n+52|0;do{c[n>>2]=c[o>>2];n=n+4|0;o=o+4|0}while((n|0)<(q|0));n=k+(((h>>>0)%(j>>>0)|0)*52|0)|0;o=Z+48|0;q=n+52|0;do{c[n>>2]=c[o>>2];n=n+4|0;o=o+4|0}while((n|0)<(q|0));i=i+1|0}while((i|0)!=(j|0))}else h=243703;k=c[F+812>>2]|0;if((k|0)>0){m=F+820|0;i=0;do{d=c[m>>2]|0;j=d+(i*44|0)|0;h=(P(h,1664525)|0)+1013904223|0;d=d+(((h>>>0)%(k>>>0)|0)*44|0)|0;n=Z+48|0;o=j;q=n+44|0;do{c[n>>2]=c[o>>2];n=n+4|0;o=o+4|0}while((n|0)<(q|0));n=j;o=d;q=n+44|0;do{c[n>>2]=c[o>>2];n=n+4|0;o=o+4|0}while((n|0)<(q|0));n=d;o=Z+48|0;q=n+44|0;do{c[n>>2]=c[o>>2];n=n+4|0;o=o+4|0}while((n|0)<(q|0));i=i+1|0}while((i|0)!=(k|0))}}h=c[Z+32>>2]|0;if(h|0){if(a[Z+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[Z+32>>2]=0}a[Z+36>>0]=1;c[Z+32>>2]=0;c[Z+24>>2]=0;c[Z+28>>2]=0;h=c[Z+12>>2]|0;if(h|0){if(a[Z+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[Z+12>>2]=0}h=c[Z+40>>2]|0;if(h|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);c[Z+40>>2]=0}c[Z+40>>2]=0;if(!u){l=Z;return F|0}c[6996]=(c[6996]|0)+1;Cd(c[u+-4>>2]|0);l=Z;return F|0}function jc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0.0,M=0.0,N=0.0,O=0.0;K=l;l=l+16|0;f=c[b+1112>>2]|0;if((f|0)>0)while(1){j=c[c[b+1120>>2]>>2]|0;f=c[j+348>>2]|0;if(f|0){Ag(b+1068|0,f)|0;h=c[b+1072>>2]|0;if(h|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+1072>>2]=f;c[b+1080>>2]=(c[b+1080>>2]|0)+-1}f=c[j+52>>2]|0;if(f|0){if(a[j+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[j+52>>2]=0}a[j+56>>0]=1;c[j+52>>2]=0;c[j+44>>2]=0;c[j+48>>2]=0;f=c[j+32>>2]|0;if(f|0){if(a[j+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[j+32>>2]=0}a[j+36>>0]=1;c[j+32>>2]=0;c[j+24>>2]=0;c[j+28>>2]=0;f=c[j+12>>2]|0;if(f|0){if(a[j+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[j+12>>2]=0}a[j+16>>0]=1;c[j+12>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);f=c[b+1112>>2]|0;a:do if((f|0)>0){i=c[b+1120>>2]|0;h=0;while(1){if((c[i+(h<<2)>>2]|0)==(j|0))break a;h=h+1|0;if((h|0)>=(f|0)){h=f;break}}}else h=f;while(0);if((f|0)>(h|0)){E=c[b+1120>>2]|0;F=E+(h<<2)|0;G=c[F>>2]|0;c[F>>2]=c[E+(f+-1<<2)>>2];c[(c[b+1120>>2]|0)+(f+-1<<2)>>2]=G;c[b+1112>>2]=f+-1;f=f+-1|0}if((f|0)<=0){h=f;break}}else h=f;f=c[b+772>>2]|0;f=(f|0)>(d|0)?d:f;if((h|0)<(f|0)){if((c[b+1116>>2]|0)<(f|0)){if(f){c[6995]=(c[6995]|0)+1;i=sc((f<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}d=c[b+1112>>2]|0;if((d|0)>0){j=0;do{c[i+(j<<2)>>2]=c[(c[b+1120>>2]|0)+(j<<2)>>2];j=j+1|0}while((j|0)!=(d|0));j=i;i=b+1120|0}else{j=i;i=b+1120|0}}else{j=0;i=b+1120|0}d=c[i>>2]|0;if(d|0){if(a[b+1124>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[i>>2]=0}a[b+1124>>0]=1;c[i>>2]=j;c[b+1116>>2]=f}else i=b+1120|0;do{c[(c[i>>2]|0)+(h<<2)>>2]=0;h=h+1|0}while((h|0)!=(f|0))}c[b+1112>>2]=f;if((f|0)>0){h=0;do{c[6995]=(c[6995]|0)+1;f=sc(403)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}a[f+16>>0]=1;c[f+12>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;a[f+36>>0]=1;c[f+32>>2]=0;c[f+24>>2]=0;c[f+28>>2]=0;a[f+56>>0]=1;c[f+52>>2]=0;c[f+44>>2]=0;c[f+48>>2]=0;j=f+348|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;g[f+368>>2]=100.0;g[f+372>>2]=.009999999776482582;a[f+376>>0]=0;c[(c[b+1120>>2]|0)+(h<<2)>>2]=f;j=c[b+1120>>2]|0;a[(c[j+(h<<2)>>2]|0)+377>>0]=1;h=h+1|0;f=c[b+1112>>2]|0}while((h|0)<(f|0));if((f|0)>0){h=c[b+772>>2]|0;if((h|0)>0){i=0;k=0.0;m=0.0;n=0.0;d=f;while(1){p=c[b+780>>2]|0;v=k+ +g[p+(i*104|0)+8>>2];m=m+ +g[p+(i*104|0)+12>>2];w=n+ +g[p+(i*104|0)+16>>2];o=c[j+(((i*29873|0)%(d|0)|0)<<2)>>2]|0;p=p+(i*104|0)|0;j=c[o+24>>2]|0;if((j|0)==(c[o+28>>2]|0)?(q=j|0?j<<1:1,(j|0)<(q|0)):0){if(!q)h=0;else{c[6995]=(c[6995]|0)+1;h=sc((q<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}j=c[o+24>>2]|0}if((j|0)>0){d=0;do{c[h+(d<<2)>>2]=c[(c[o+32>>2]|0)+(d<<2)>>2];d=d+1|0}while((d|0)!=(j|0))}d=c[o+32>>2]|0;if(d){if(a[o+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);j=c[o+24>>2]|0}c[o+32>>2]=0}a[o+36>>0]=1;c[o+32>>2]=h;c[o+28>>2]=q;h=c[b+772>>2]|0}c[(c[o+32>>2]|0)+(j<<2)>>2]=p;c[o+24>>2]=j+1;i=i+1|0;if((i|0)>=(h|0))break;k=v;n=w;d=c[b+1112>>2]|0;j=c[b+1120>>2]|0}k=1.0/+(h|0);if((f|0)>=0)if(!f){i=0;n=v*k;m=m*k;k=w*k;J=70}else{n=v*k;m=m*k;k=w*k;J=68}else{E=b+780|0;G=0;F=0}}else{n=1.0/+(h|0)*0.0;m=1.0/+(h|0)*0.0;k=1.0/+(h|0)*0.0;J=68}if((J|0)==68){c[6995]=(c[6995]|0)+1;h=sc((f<<4|3)+16|0)|0;if(!h){i=0;J=70}else{c[(h+4+15&-16)+-4>>2]=h;i=h+4+15&-16;J=70}}if((J|0)==70){h=0;do{g[i+(h<<4)>>2]=n;g[i+(h<<4)+4>>2]=m;g[i+(h<<4)+8>>2]=k;g[i+(h<<4)+12>>2]=0.0;h=h+1|0}while((h|0)!=(f|0));E=b+780|0;G=i;F=i}t=G+4|0;u=G+8|0;s=0;do{z=+(s|0)*.0625;z=2.0-(z>1.0?1.0:z);d=0;o=0;while(1){h=c[(c[b+1120>>2]|0)+(o<<2)>>2]|0;j=c[h+24>>2]|0;if((j|0)>0){i=c[h+32>>2]|0;h=0;k=0.0;m=0.0;n=0.0;do{r=c[i+(h<<2)>>2]|0;k=k+ +g[r+8>>2];m=m+ +g[r+12>>2];n=n+ +g[r+16>>2];h=h+1|0}while((h|0)!=(j|0))}else{n=0.0;m=0.0;k=0.0}if(!j)r=d;else{q=G+(o<<4)|0;w=+g[q>>2];r=G+(o<<4)+4|0;x=+g[r>>2];h=G+(o<<4)+8|0;y=+g[h>>2];v=w+z*(k*(1.0/+(j|0))-w);m=x+z*(m*(1.0/+(j|0))-x);k=y+z*(n*(1.0/+(j|0))-y);g[q>>2]=v;g[r>>2]=m;g[h>>2]=k;g[G+(o<<4)+12>>2]=0.0;j=c[(c[b+1120>>2]|0)+(o<<2)>>2]|0;h=c[j+24>>2]|0;if((h|0)<0){if((c[j+28>>2]|0)<0){i=c[j+32>>2]|0;if(i|0){if(a[j+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[j+32>>2]=0}a[j+36>>0]=1;c[j+32>>2]=0;c[j+28>>2]=0}do{c[(c[j+32>>2]|0)+(h<<2)>>2]=0;h=h+1|0}while((h|0)!=0)}c[j+24>>2]=0;r=d|(v-w)*(v-w)+(m-x)*(m-x)+(k-y)*(k-y)>1.1920928955078125e-07}o=o+1|0;if((o|0)>=(f|0))break;else d=r}s=s+1|0;h=c[b+772>>2]|0;b:do if((h|0)>0){if((f|0)>1)q=0;else{p=0;while(1){d=c[c[b+1120>>2]>>2]|0;o=(c[E>>2]|0)+(p*104|0)|0;i=c[d+24>>2]|0;if((i|0)==(c[d+28>>2]|0)?(D=i|0?i<<1:1,(i|0)<(D|0)):0){if(!D)h=0;else{c[6995]=(c[6995]|0)+1;h=sc((D<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}i=c[d+24>>2]|0}if((i|0)>0){j=0;do{c[h+(j<<2)>>2]=c[(c[d+32>>2]|0)+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0))}j=c[d+32>>2]|0;if(j){if(a[d+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);i=c[d+24>>2]|0}c[d+32>>2]=0}a[d+36>>0]=1;c[d+32>>2]=h;c[d+28>>2]=D;h=c[b+772>>2]|0}c[(c[d+32>>2]|0)+(i<<2)>>2]=o;c[d+24>>2]=i+1;p=p+1|0;if((p|0)>=(h|0))break b}}do{o=c[E>>2]|0;m=+g[o+(q*104|0)+8>>2];n=+g[o+(q*104|0)+12>>2];v=+g[o+(q*104|0)+16>>2];i=1;k=+C(+(+g[G>>2]-m))+ +C(+(+g[t>>2]-n))+ +C(+(+g[u>>2]-v));j=0;while(1){w=+C(+(+g[G+(i<<4)>>2]-m))+ +C(+(+g[G+(i<<4)+4>>2]-n))+ +C(+(+g[G+(i<<4)+8>>2]-v));d=w>2]|0)+(j<<2)>>2]|0;d=o+(q*104|0)|0;i=c[p+24>>2]|0;if((i|0)==(c[p+28>>2]|0)?(B=i|0?i<<1:1,(i|0)<(B|0)):0){if(!B)h=0;else{c[6995]=(c[6995]|0)+1;h=sc((B<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}i=c[p+24>>2]|0}if((i|0)>0){j=0;do{c[h+(j<<2)>>2]=c[(c[p+32>>2]|0)+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0))}j=c[p+32>>2]|0;if(j){if(a[p+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);i=c[p+24>>2]|0}c[p+32>>2]=0}a[p+36>>0]=1;c[p+32>>2]=h;c[p+28>>2]=B;h=c[b+772>>2]|0}c[(c[p+32>>2]|0)+(i<<2)>>2]=d;c[p+24>>2]=i+1;q=q+1|0}while((q|0)<(h|0))}while(0)}while((s|0)<(e|0)&r);if((h|0)>0){h=h<<2;c[6995]=(c[6995]|0)+1;f=sc((h|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}Yk(f|0,-1,h|0)|0;e=f;u=f}else{e=0;u=0}f=c[b+1112>>2]|0;if((f|0)>0){o=c[b+1120>>2]|0;d=0;do{j=c[o+(d<<2)>>2]|0;if((c[j+24>>2]|0)>0){i=c[E>>2]|0;h=c[j+32>>2]|0;f=0;do{c[e+((((c[h+(f<<2)>>2]|0)-i|0)/104|0)<<2)>>2]=d;f=f+1|0}while((f|0)<(c[j+24>>2]|0));f=c[b+1112>>2]|0}d=d+1|0}while((d|0)<(f|0))}if((c[b+812>>2]|0)>0){r=0;do{D=c[b+820>>2]|0;q=c[E>>2]|0;f=((c[D+(r*44|0)+8>>2]|0)-q|0)/104|0;c[K>>2]=f;c[K+4>>2]=((c[D+(r*44|0)+12>>2]|0)-q|0)/104|0;c[K+8>>2]=((c[D+(r*44|0)+16>>2]|0)-q|0)/104|0;q=0;while(1){o=c[e+(f<<2)>>2]|0;d=1;do{f=c[K+(((d+q|0)%3|0)<<2)>>2]|0;c:do if((c[e+(f<<2)>>2]|0)!=(o|0)){p=c[(c[b+1120>>2]|0)+(o<<2)>>2]|0;j=(c[E>>2]|0)+(f*104|0)|0;h=c[p+24>>2]|0;d:do if((h|0)>0){i=c[p+32>>2]|0;f=0;while(1){if((c[i+(f<<2)>>2]|0)==(j|0))break;f=f+1|0;if((f|0)>=(h|0))break d}if((f|0)!=(h|0))break c}while(0);if((h|0)==(c[p+28>>2]|0)?(H=h|0?h<<1:1,(h|0)<(H|0)):0){if(!H)f=0;else{c[6995]=(c[6995]|0)+1;f=sc((H<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[p+24>>2]|0}if((h|0)>0){i=0;do{c[f+(i<<2)>>2]=c[(c[p+32>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(h|0))}i=c[p+32>>2]|0;if(i){if(a[p+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);h=c[p+24>>2]|0}c[p+32>>2]=0}a[p+36>>0]=1;c[p+32>>2]=f;c[p+28>>2]=H;f=h}else f=h;c[(c[p+32>>2]|0)+(f<<2)>>2]=j;c[p+24>>2]=f+1}while(0);d=d+1|0}while((d|0)!=3);f=q+1|0;if((f|0)>=3)break;q=f;f=c[K+(f<<2)>>2]|0}r=r+1|0}while((r|0)<(c[b+812>>2]|0));f=c[b+1112>>2]|0}if((f|0)>1){c[6995]=(c[6995]|0)+1;f=sc(403)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}a[f+16>>0]=1;c[f+12>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;p=f+36|0;a[p>>0]=1;q=f+32|0;c[q>>2]=0;r=f+24|0;c[r>>2]=0;s=f+28|0;c[s>>2]=0;a[f+56>>0]=1;c[f+52>>2]=0;c[f+44>>2]=0;c[f+48>>2]=0;t=f+348|0;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;g[f+368>>2]=100.0;g[f+372>>2]=.009999999776482582;a[f+376>>0]=0;t=f;a[f+377>>0]=0;j=c[b+772>>2]|0;if((j|0)>0){c[6995]=(c[6995]|0)+1;f=sc((j<<2|3)+16|0)|0;if(!f)i=0;else{c[(f+4+15&-16)+-4>>2]=f;i=f+4+15&-16}h=c[r>>2]|0;if((h|0)>0){f=0;do{c[i+(f<<2)>>2]=c[(c[q>>2]|0)+(f<<2)>>2];f=f+1|0}while((f|0)!=(h|0))}f=c[q>>2]|0;if(f|0){if(a[p>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[q>>2]=0}a[p>>0]=1;c[q>>2]=i;c[s>>2]=j;f=c[b+772>>2]|0;if((f|0)>0){o=0;i=c[r>>2]|0;h=j;while(1){d=(c[E>>2]|0)+(o*104|0)|0;do if((i|0)==(h|0)){j=h|0?h<<1:1;if((h|0)>=(j|0)){j=h;break}if(!j)f=0;else{c[6995]=(c[6995]|0)+1;f=sc((j<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[r>>2]|0}if((h|0)>0){i=0;do{c[f+(i<<2)>>2]=c[(c[q>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(h|0))}i=c[q>>2]|0;if(i){if(a[p>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);h=c[r>>2]|0}c[q>>2]=0}a[p>>0]=1;c[q>>2]=f;c[s>>2]=j;f=c[b+772>>2]|0}else{j=h;h=i}while(0);c[(c[q>>2]|0)+(h<<2)>>2]=d;i=h+1|0;c[r>>2]=i;o=o+1|0;if((o|0)>=(f|0))break;else h=j}}}f=c[b+1112>>2]|0;if((f|0)==(c[b+1116>>2]|0)?(I=f|0?f<<1:1,(f|0)<(I|0)):0){if(!I)i=0;else{c[6995]=(c[6995]|0)+1;f=sc((I<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=f;f=c[b+1112>>2]|0}if((f|0)>0){h=0;do{c[i+(h<<2)>>2]=c[(c[b+1120>>2]|0)+(h<<2)>>2];h=h+1|0}while((h|0)!=(f|0))}h=c[b+1120>>2]|0;if(h){if(a[b+1124>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);f=c[b+1112>>2]|0}c[b+1120>>2]=0}a[b+1124>>0]=1;c[b+1120>>2]=i;c[b+1116>>2]=I}c[(c[b+1120>>2]|0)+(f<<2)>>2]=t;I=f+1|0;c[b+1112>>2]=I;E=c[b+1120>>2]|0;f=E+(f<<2)|0;H=c[E>>2]|0;c[E>>2]=c[f>>2];c[f>>2]=H;f=I}if((f|0)>0){h=0;do{d=c[(c[b+1120>>2]|0)+(h<<2)>>2]|0;do if(!(c[d+24>>2]|0)){j=h+-1|0;f=c[d+348>>2]|0;if(f|0){Ag(b+1068|0,f)|0;h=c[b+1072>>2]|0;if(h|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+1072>>2]=f;c[b+1080>>2]=(c[b+1080>>2]|0)+-1}f=c[d+52>>2]|0;if(f|0){if(a[d+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[d+52>>2]=0}a[d+56>>0]=1;c[d+52>>2]=0;c[d+44>>2]=0;c[d+48>>2]=0;f=c[d+32>>2]|0;if(f|0){if(a[d+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[d+32>>2]=0}a[d+36>>0]=1;c[d+32>>2]=0;c[d+24>>2]=0;c[d+28>>2]=0;f=c[d+12>>2]|0;if(f|0){if(a[d+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[d+12>>2]=0}a[d+16>>0]=1;c[d+12>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);f=c[b+1112>>2]|0;e:do if((f|0)>0){i=c[b+1120>>2]|0;h=0;while(1){if((c[i+(h<<2)>>2]|0)==(d|0))break e;h=h+1|0;if((h|0)>=(f|0)){h=f;break}}}else h=f;while(0);if((f|0)<=(h|0)){h=j;break}H=c[b+1120>>2]|0;I=H+(h<<2)|0;h=c[I>>2]|0;c[I>>2]=c[H+(f+-1<<2)>>2];c[(c[b+1120>>2]|0)+(f+-1<<2)>>2]=h;c[b+1112>>2]=f+-1;h=j;f=f+-1|0}while(0);h=h+1|0}while((h|0)<(f|0))}if(!((e|0)==0|(u|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[u+-4>>2]|0)}if(!((G|0)==0|(F|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[F+-4>>2]|0)}}else J=234}else J=234;f:do if((J|0)==234){d=c[b+832>>2]|0;if(d|0){if((f|0)<(d|0)){if((c[b+1116>>2]|0)<(d|0)){c[6995]=(c[6995]|0)+1;h=sc((d<<2|3)+16|0)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}i=c[b+1112>>2]|0;if((i|0)>0){h=0;do{c[j+(h<<2)>>2]=c[(c[b+1120>>2]|0)+(h<<2)>>2];h=h+1|0}while((h|0)!=(i|0))}h=c[b+1120>>2]|0;if(h|0){if(a[b+1124>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+1120>>2]=0}a[b+1124>>0]=1;c[b+1120>>2]=j;c[b+1116>>2]=d;h=b+1120|0}else h=b+1120|0;do{c[(c[h>>2]|0)+(f<<2)>>2]=0;f=f+1|0}while((f|0)!=(d|0))}c[b+1112>>2]=d;if((d|0)>0){h=0;do{c[6995]=(c[6995]|0)+1;f=sc(403)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}a[f+16>>0]=1;c[f+12>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;a[f+36>>0]=1;c[f+32>>2]=0;c[f+24>>2]=0;c[f+28>>2]=0;a[f+56>>0]=1;c[f+52>>2]=0;c[f+44>>2]=0;c[f+48>>2]=0;I=f+348|0;c[I>>2]=0;c[I+4>>2]=0;c[I+8>>2]=0;c[I+12>>2]=0;c[I+16>>2]=0;g[f+368>>2]=100.0;g[f+372>>2]=.009999999776482582;a[f+376>>0]=0;c[(c[b+1120>>2]|0)+(h<<2)>>2]=f;a[(c[(c[b+1120>>2]|0)+(h<<2)>>2]|0)+377>>0]=1;h=h+1|0}while((h|0)<(c[b+1112>>2]|0))}if((c[b+832>>2]|0)<=0)break;d=0;while(1){j=0;do{o=c[(c[b+1120>>2]|0)+(d<<2)>>2]|0;p=(c[b+840>>2]|0)+(d*104|0)+8+(j<<2)|0;h=c[o+24>>2]|0;if((h|0)==(c[o+28>>2]|0)?(r=h|0?h<<1:1,(h|0)<(r|0)):0){if(!r)f=0;else{c[6995]=(c[6995]|0)+1;f=sc((r<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[o+24>>2]|0}if((h|0)>0){i=0;do{c[f+(i<<2)>>2]=c[(c[o+32>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(h|0))}i=c[o+32>>2]|0;if(i){if(a[o+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);h=c[o+24>>2]|0}c[o+32>>2]=0}a[o+36>>0]=1;c[o+32>>2]=f;c[o+28>>2]=r;f=h}else f=h;c[(c[o+32>>2]|0)+(f<<2)>>2]=c[p>>2];c[o+24>>2]=f+1;j=j+1|0}while((j|0)!=4);d=d+1|0;if((d|0)>=(c[b+832>>2]|0))break f}}d=c[b+812>>2]|0;if((f|0)<(d|0)){if((c[b+1116>>2]|0)<(d|0)){if(d){c[6995]=(c[6995]|0)+1;h=sc((d<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}j=c[b+1112>>2]|0;if((j|0)>0){i=0;do{c[h+(i<<2)>>2]=c[(c[b+1120>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(j|0));j=b+1120|0}else j=b+1120|0}else{h=0;j=b+1120|0}i=c[j>>2]|0;if(i|0){if(a[b+1124>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[j>>2]=0}a[b+1124>>0]=1;c[j>>2]=h;c[b+1116>>2]=d}do{c[(c[b+1120>>2]|0)+(f<<2)>>2]=0;f=f+1|0}while((f|0)!=(d|0))}c[b+1112>>2]=d;if((d|0)>0){h=0;do{c[6995]=(c[6995]|0)+1;f=sc(403)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}a[f+16>>0]=1;c[f+12>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;a[f+36>>0]=1;c[f+32>>2]=0;c[f+24>>2]=0;c[f+28>>2]=0;a[f+56>>0]=1;c[f+52>>2]=0;c[f+44>>2]=0;c[f+48>>2]=0;I=f+348|0;c[I>>2]=0;c[I+4>>2]=0;c[I+8>>2]=0;c[I+12>>2]=0;c[I+16>>2]=0;g[f+368>>2]=100.0;g[f+372>>2]=.009999999776482582;a[f+376>>0]=0;c[(c[b+1120>>2]|0)+(h<<2)>>2]=f;a[(c[(c[b+1120>>2]|0)+(h<<2)>>2]|0)+377>>0]=1;h=h+1|0}while((h|0)<(c[b+1112>>2]|0))}if((c[b+812>>2]|0)>0){d=0;do{j=0;do{o=c[(c[b+1120>>2]|0)+(d<<2)>>2]|0;p=(c[b+820>>2]|0)+(d*44|0)+8+(j<<2)|0;h=c[o+24>>2]|0;if((h|0)==(c[o+28>>2]|0)?(s=h|0?h<<1:1,(h|0)<(s|0)):0){if(!s)f=0;else{c[6995]=(c[6995]|0)+1;f=sc((s<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[o+24>>2]|0}if((h|0)>0){i=0;do{c[f+(i<<2)>>2]=c[(c[o+32>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(h|0))}i=c[o+32>>2]|0;if(i){if(a[o+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);h=c[o+24>>2]|0}c[o+32>>2]=0}a[o+36>>0]=1;c[o+32>>2]=f;c[o+28>>2]=s;f=h}else f=h;c[(c[o+32>>2]|0)+(f<<2)>>2]=c[p>>2];c[o+24>>2]=f+1;j=j+1|0}while((j|0)!=3);d=d+1|0}while((d|0)<(c[b+812>>2]|0))}}while(0);f=c[b+1112>>2]|0;if(!f){b=0;l=K;return b|0}if((f|0)>0){p=0;do{q=c[(c[b+1120>>2]|0)+(p<<2)>>2]|0;g[q+128>>2]=0.0;o=c[q+24>>2]|0;d=c[q+4>>2]|0;if((o|0)>(d|0)){if((c[q+8>>2]|0)<(o|0)){if(!o){f=0;i=d}else{c[6995]=(c[6995]|0)+1;f=sc((o<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=c[q+4>>2]|0}j=c[q+12>>2]|0;if((i|0)<=0)if(!j)h=q+16|0;else J=324;else{h=0;do{c[f+(h<<2)>>2]=c[j+(h<<2)>>2];h=h+1|0}while((h|0)!=(i|0));J=324}if((J|0)==324){J=0;if(!(a[q+16>>0]|0))h=q+16|0;else{c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);h=q+16|0}}a[h>>0]=1;c[q+12>>2]=f;c[q+8>>2]=o}else f=c[q+12>>2]|0;Yk(f+(d<<2)|0,0,o-d<<2|0)|0;d=c[q+24>>2]|0}else d=o;c[q+4>>2]=o;j=(d|0)>0;if(j){h=c[q+32>>2]|0;i=c[q+12>>2]|0;f=0;do{k=+g[(c[h+(f<<2)>>2]|0)+88>>2];if(k==0.0){a[q+376>>0]=1;k=999999984306749440.0}else k=1.0/k;g[i+(f<<2)>>2]=k;m=k+ +g[q+128>>2];g[q+128>>2]=m;f=f+1|0}while((f|0)!=(d|0));g[q+128>>2]=1.0/m;f=0;k=0.0;n=0.0;v=0.0;do{I=c[h+(f<<2)>>2]|0;A=+g[i+(f<<2)>>2];k=k+ +g[I+8>>2]*A;n=n+A*+g[I+12>>2];v=v+A*+g[I+16>>2];f=f+1|0}while((f|0)!=(d|0));m=1.0/m}else{m=1.0/+g[q+128>>2];g[q+128>>2]=m;v=0.0;n=0.0;k=0.0}A=k*m;z=n*m;y=v*m;g[q+228>>2]=A;g[q+232>>2]=z;g[q+236>>2]=y;g[q+240>>2]=0.0;f=q+316|0;h=f+36|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(h|0));f=q+132|0;h=f+48|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(h|0));if(j){h=c[q+32>>2]|0;i=c[q+12>>2]|0;f=0;k=0.0;x=0.0;w=0.0;m=0.0;n=0.0;v=0.0;do{I=c[h+(f<<2)>>2]|0;O=+g[I+8>>2]-A;M=+g[I+12>>2]-z;N=+g[I+16>>2]-y;L=+g[i+(f<<2)>>2];k=k+L*(M*M+N*N);g[q+132>>2]=k;x=L*(O*O+N*N)+x;g[q+152>>2]=x;w=(O*O+M*M)*L+w;g[q+172>>2]=w;m=m-M*O*L;g[q+136>>2]=m;n=n-N*O*L;g[q+140>>2]=n;v=v-N*M*L;g[q+156>>2]=v;f=f+1|0}while((f|0)!=(d|0));f=q+136|0;h=q+140|0;i=q+156|0;j=q+152|0}else{f=q+136|0;h=q+140|0;i=q+156|0;j=q+152|0;x=0.0;w=0.0;v=0.0;n=0.0;m=0.0;k=0.0}L=x*w-v*v;M=v*n-w*m;N=v*m-x*n;O=1.0/(L*k+m*M+N*n);g[q+132>>2]=L*O;g[f>>2]=(v*n-w*m)*O;g[h>>2]=(v*m-x*n)*O;g[q+144>>2]=0.0;g[q+148>>2]=M*O;g[j>>2]=(w*k-n*n)*O;g[i>>2]=(m*n-v*k)*O;g[q+160>>2]=0.0;g[q+164>>2]=N*O;g[q+168>>2]=(n*m-v*k)*O;g[q+172>>2]=(x*k-m*m)*O;g[q+176>>2]=0.0;c[q+60>>2]=1065353216;c[q+64>>2]=0;c[q+64+4>>2]=0;c[q+64+8>>2]=0;c[q+64+12>>2]=0;c[q+80>>2]=1065353216;c[q+84>>2]=0;c[q+84+4>>2]=0;c[q+84+8>>2]=0;c[q+84+12>>2]=0;c[q+100>>2]=1065353216;c[q+104>>2]=0;c[q+108>>2]=c[q+228>>2];c[q+108+4>>2]=c[q+228+4>>2];c[q+108+8>>2]=c[q+228+8>>2];c[q+108+12>>2]=c[q+228+12>>2];d=c[q+24>>2]|0;j=c[q+44>>2]|0;if((j|0)<(d|0)){if((c[q+48>>2]|0)<(d|0)){if(!d){f=0;i=j}else{c[6995]=(c[6995]|0)+1;f=sc((d<<4|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=c[q+44>>2]|0}if((i|0)>0){h=0;do{I=f+(h<<4)|0;H=(c[q+52>>2]|0)+(h<<4)|0;c[I>>2]=c[H>>2];c[I+4>>2]=c[H+4>>2];c[I+8>>2]=c[H+8>>2];c[I+12>>2]=c[H+12>>2];h=h+1|0}while((h|0)!=(i|0))}h=c[q+52>>2]|0;if(h|0){if(a[q+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[q+52>>2]=0}a[q+56>>0]=1;c[q+52>>2]=f;c[q+48>>2]=d;h=q+52|0}else h=q+52|0;f=j;do{I=(c[h>>2]|0)+(f<<4)|0;c[I>>2]=c[K>>2];c[I+4>>2]=c[K+4>>2];c[I+8>>2]=c[K+8>>2];c[I+12>>2]=c[K+12>>2];f=f+1|0}while((f|0)!=(d|0))}c[q+44>>2]=d;if((d|0)>0){f=0;do{H=c[(c[q+32>>2]|0)+(f<<2)>>2]|0;N=+g[H+12>>2]-+g[q+232>>2];O=+g[H+16>>2]-+g[q+236>>2];I=c[q+52>>2]|0;g[I+(f<<4)>>2]=+g[H+8>>2]-+g[q+228>>2];g[I+(f<<4)+4>>2]=N;g[I+(f<<4)+8>>2]=O;g[I+(f<<4)+12>>2]=0.0;f=f+1|0}while((f|0)<(c[q+44>>2]|0))}p=p+1|0}while((p|0)<(c[b+1112>>2]|0))}Tc(b);f=c[b+1112>>2]|0;o=P(f,f)|0;d=c[b+1132>>2]|0;if((o|0)>(d|0)){if((c[b+1136>>2]|0)<(o|0)){if(!o){f=0;i=d}else{c[6995]=(c[6995]|0)+1;f=sc(o+19|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=c[b+1132>>2]|0}j=c[b+1140>>2]|0;if((i|0)<=0)if(!j)h=b+1144|0;else J=372;else{h=0;do{a[f+h>>0]=a[j+h>>0]|0;h=h+1|0}while((h|0)!=(i|0));J=372}if((J|0)==372)if(!(a[b+1144>>0]|0))h=b+1144|0;else{c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);h=b+1144|0}a[h>>0]=1;c[b+1140>>2]=f;c[b+1136>>2]=o}else f=c[b+1140>>2]|0;Yk(f+d|0,0,o-d|0)|0;f=c[b+1112>>2]|0}c[b+1132>>2]=o;if((f|0)<=0){b=f;l=K;return b|0}e=c[b+1120>>2]|0;s=c[b+1140>>2]|0;r=0;do{t=c[e+(r<<2)>>2]|0;c[t+380>>2]=r;u=c[t+24>>2]|0;q=0;do{j=c[e+(q<<2)>>2]|0;g:do if((u|0)>0){d=c[j+24>>2]|0;h=0;while(1){if((d|0)>0){p=c[(c[t+32>>2]|0)+(h<<2)>>2]|0;o=c[j+32>>2]|0;i=0;do{if((p|0)==(c[o+(i<<2)>>2]|0)){h=1;break g}i=i+1|0}while((i|0)<(d|0))}h=h+1|0;if((h|0)>=(u|0)){h=0;break}}}else h=0;while(0);a[s+((P(f,q)|0)+r)>>0]=h;q=q+1|0}while((q|0)!=(f|0));r=r+1|0}while((r|0)!=(f|0));l=K;return f|0}function kc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0.0,k=0.0,m=0,n=0.0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.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,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0;ja=l;l=l+64|0;if((e|0)<=0){l=ja;return}$=ja+16+4|0;aa=ja+16+8|0;Y=0;do{ba=c[d+(Y<<2)>>2]|0;ca=c[ba+772>>2]|0;da=c[ba+776>>2]|0;ea=Rj(b,ca,+g[f+12>>2])|0;fa=Rj(b,da,+g[f+12>>2])|0;ga=c[b+16>>2]|0;O=+g[ga+(ea*244|0)+128>>2];P=+g[ga+(ea*244|0)+132>>2];U=+g[ga+(ea*244|0)+136>>2];if(!(O*O+P*P+U*U<1.4210854715202004e-14?(O=+g[ga+(fa*244|0)+128>>2],P=+g[ga+(fa*244|0)+132>>2],U=+g[ga+(fa*244|0)+136>>2],O*O+P*P+U*U<1.4210854715202004e-14):0))ia=5;if((ia|0)==5?(ia=0,ha=c[ba+780>>2]|0,(ha|0)>0):0){Z=0;h=ha;do{W=ba+4+(Z*192|0)|0;o=ba+4+(Z*192|0)+80|0;if(+g[o>>2]<=+g[ba+788>>2]){X=c[b+28>>2]|0;if((X|0)==(c[b+32>>2]|0)?(_=X|0?X<<1:1,(X|0)<(_|0)):0){if(!_){h=0;m=X}else{c[6995]=(c[6995]|0)+1;h=sc((_*152|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}m=c[b+28>>2]|0}if((m|0)>0){i=0;do{gi(h+(i*152|0)|0,(c[b+36>>2]|0)+(i*152|0)|0,152)|0;i=i+1|0}while((i|0)!=(m|0))}i=c[b+36>>2]|0;if(i|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=h;c[b+32>>2]=_;h=c[b+28>>2]|0}else h=X;c[b+28>>2]=h+1;V=c[b+36>>2]|0;c[V+(X*152|0)+144>>2]=ea;c[V+(X*152|0)+148>>2]=fa;c[V+(X*152|0)+132>>2]=W;y=+g[ba+4+(Z*192|0)+48>>2]-+g[ca+52>>2];z=+g[ba+4+(Z*192|0)+52>>2]-+g[ca+56>>2];x=+g[ba+4+(Z*192|0)+56>>2]-+g[ca+60>>2];g[ja+48>>2]=y;g[ja+48+4>>2]=z;g[ja+48+8>>2]=x;g[ja+48+12>>2]=0.0;F=+g[ba+4+(Z*192|0)+32>>2]-+g[da+52>>2];G=+g[ba+4+(Z*192|0)+36>>2]-+g[da+56>>2];B=+g[ba+4+(Z*192|0)+40>>2]-+g[da+60>>2];g[ja+32>>2]=F;g[ja+32+4>>2]=G;g[ja+32+8>>2]=B;g[ja+32+12>>2]=0.0;if(!(c[ga+(ea*244|0)+240>>2]|0)){j=0.0;n=0.0;s=0.0}else{U=+g[ga+(ea*244|0)+192>>2]+ +g[ga+(ea*244|0)+224>>2];s=+g[ga+(ea*244|0)+196>>2]+ +g[ga+(ea*244|0)+228>>2];n=+g[ga+(ea*244|0)+200>>2]+ +g[ga+(ea*244|0)+232>>2];j=+g[ga+(ea*244|0)+176>>2]+ +g[ga+(ea*244|0)+208>>2]+(s*x-n*z);n=+g[ga+(ea*244|0)+180>>2]+ +g[ga+(ea*244|0)+212>>2]+(n*y-U*x);s=+g[ga+(ea*244|0)+184>>2]+ +g[ga+(ea*244|0)+216>>2]+(U*z-s*y)}if(!(c[ga+(fa*244|0)+240>>2]|0)){k=0.0;r=0.0;t=0.0}else{U=+g[ga+(fa*244|0)+192>>2]+ +g[ga+(fa*244|0)+224>>2];t=+g[ga+(fa*244|0)+196>>2]+ +g[ga+(fa*244|0)+228>>2];r=+g[ga+(fa*244|0)+200>>2]+ +g[ga+(fa*244|0)+232>>2];k=+g[ga+(fa*244|0)+176>>2]+ +g[ga+(fa*244|0)+208>>2]+(t*B-r*G);r=+g[ga+(fa*244|0)+180>>2]+ +g[ga+(fa*244|0)+212>>2]+(r*F-U*B);t=+g[ga+(fa*244|0)+184>>2]+ +g[ga+(fa*244|0)+216>>2]+(U*G-t*F)}P=j-k;O=n-r;K=s-t;Q=ba+4+(Z*192|0)+64|0;L=+g[Q>>2];R=ba+4+(Z*192|0)+68|0;M=+g[R>>2];S=ba+4+(Z*192|0)+72|0;N=+g[S>>2];p=c[b+16>>2]|0;i=c[p+(ea*244|0)+240>>2]|0;m=c[p+(fa*244|0)+240>>2]|0;U=+g[f+28>>2];J=+g[f+12>>2];j=+g[f+40>>2];k=+g[f+36>>2];T=ba+4+(Z*192|0)+120|0;h=c[T>>2]|0;if(!(h&6))if(!(h&8))I=k;else{I=J*+g[ba+4+(Z*192|0)+144>>2];j=I+ +g[ba+4+(Z*192|0)+148>>2];j=j<1.1920928955078125e-07?1.1920928955078125e-07:j;I=I/j;j=1.0/j}else{j=(h&2|0)==0?j:+g[ba+4+(Z*192|0)+144>>2];if(!(h&4))I=k;else I=+g[ba+4+(Z*192|0)+148>>2]}H=1.0/J*j;if(i|0){j=((z*N-x*M)*+g[i+324>>2]+(x*L-N*y)*+g[i+328>>2]+(M*y-z*L)*+g[i+332>>2])*+g[i+604>>2];k=((z*N-x*M)*+g[i+340>>2]+(x*L-N*y)*+g[i+344>>2]+(M*y-z*L)*+g[i+348>>2])*+g[i+608>>2];n=((z*N-x*M)*+g[i+356>>2]+(x*L-N*y)*+g[i+360>>2]+(M*y-z*L)*+g[i+364>>2])*+g[i+612>>2]}else{j=0.0;k=0.0;n=0.0}g[V+(X*152|0)+64>>2]=j;g[V+(X*152|0)+68>>2]=k;g[V+(X*152|0)+72>>2]=n;g[V+(X*152|0)+76>>2]=0.0;u=+g[S>>2];v=+g[R>>2];w=+g[Q>>2];if(m|0){r=(+g[m+324>>2]*-(G*u-B*v)+ +g[m+328>>2]*-(B*w-u*F)+ +g[m+332>>2]*-(v*F-G*w))*+g[m+604>>2];s=(+g[m+340>>2]*-(G*u-B*v)+ +g[m+344>>2]*-(B*w-u*F)+ +g[m+348>>2]*-(v*F-G*w))*+g[m+608>>2];t=(+g[m+356>>2]*-(G*u-B*v)+ +g[m+360>>2]*-(B*w-u*F)+ +g[m+364>>2]*-(v*F-G*w))*+g[m+612>>2]}else{r=0.0;s=0.0;t=0.0}g[V+(X*152|0)+80>>2]=r;g[V+(X*152|0)+84>>2]=s;g[V+(X*152|0)+88>>2]=t;g[V+(X*152|0)+92>>2]=0.0;if(i|0)k=+g[i+404>>2]+((k*x-n*z)*+g[Q>>2]+(n*y-x*j)*+g[R>>2]+(z*j-k*y)*+g[S>>2]);else k=0.0;if(m|0){E=-r;j=-s;t=-t;j=+g[m+404>>2]+((B*j-G*t)*+g[Q>>2]+(F*t-B*E)*+g[R>>2]+(G*E-F*j)*+g[S>>2])}else j=0.0;g[V+(X*152|0)+108>>2]=U/(H+(k+j));if(i|0){c[V+(X*152|0)+16>>2]=c[Q>>2];c[V+(X*152|0)+16+4>>2]=c[Q+4>>2];c[V+(X*152|0)+16+8>>2]=c[Q+8>>2];c[V+(X*152|0)+16+12>>2]=c[Q+12>>2];g[V+(X*152|0)>>2]=z*N-x*M;g[V+(X*152|0)+4>>2]=x*L-N*y;g[V+(X*152|0)+8>>2]=M*y-z*L;g[V+(X*152|0)+12>>2]=0.0}else{c[V+(X*152|0)>>2]=0;c[V+(X*152|0)+4>>2]=0;c[V+(X*152|0)+8>>2]=0;c[V+(X*152|0)+12>>2]=0;c[V+(X*152|0)+16>>2]=0;c[V+(X*152|0)+20>>2]=0;c[V+(X*152|0)+24>>2]=0;c[V+(X*152|0)+28>>2]=0}if(m|0){t=-+g[R>>2];E=-+g[S>>2];g[V+(X*152|0)+48>>2]=-+g[Q>>2];g[V+(X*152|0)+52>>2]=t;g[V+(X*152|0)+56>>2]=E;g[V+(X*152|0)+60>>2]=0.0;g[V+(X*152|0)+32>>2]=-(G*u-B*v);g[V+(X*152|0)+36>>2]=-(B*w-u*F);g[V+(X*152|0)+40>>2]=-(v*F-G*w);g[V+(X*152|0)+44>>2]=0.0}else{c[V+(X*152|0)+32>>2]=0;c[V+(X*152|0)+32+4>>2]=0;c[V+(X*152|0)+32+8>>2]=0;c[V+(X*152|0)+32+12>>2]=0;c[V+(X*152|0)+32+16>>2]=0;c[V+(X*152|0)+32+20>>2]=0;c[V+(X*152|0)+32+24>>2]=0;c[V+(X*152|0)+32+28>>2]=0}E=+g[o>>2]+ +g[f+64>>2];if(i|0){r=+g[i+392>>2];s=+g[i+396>>2];w=+g[i+388>>2];t=r*x-s*z+ +g[i+372>>2];s=+g[i+376>>2]+(s*y-x*w);r=z*w-r*y+ +g[i+380>>2]}else{t=0.0;s=0.0;r=0.0}if(m|0){j=+g[m+392>>2];k=+g[m+396>>2];z=+g[m+388>>2];n=j*B-k*G+ +g[m+372>>2];k=+g[m+376>>2]+(k*F-B*z);j=G*z-j*F+ +g[m+380>>2]}else{n=0.0;k=0.0;j=0.0}B=(t-n)*+g[Q>>2]+(s-k)*+g[R>>2]+(r-j)*+g[S>>2];c[V+(X*152|0)+104>>2]=c[ba+4+(Z*192|0)+84>>2];h=+C(+B)<+g[f+96>>2];B=h?0.0:-(B*+g[ba+4+(Z*192|0)+96>>2]);B=B<=0.0?0.0:B;h=c[f+72>>2]|0;do if(!(h&4))g[V+(X*152|0)+100>>2]=0.0;else{j=+g[ba+4+(Z*192|0)+124>>2]*+g[f+68>>2];g[V+(X*152|0)+100>>2]=j;do if(i|0){if(!(c[p+(ea*244|0)+240>>2]|0))break;G=j*+g[V+(X*152|0)+20>>2]*+g[p+(ea*244|0)+132>>2]*+g[i+412>>2]*+g[p+(ea*244|0)+116>>2];F=j*+g[V+(X*152|0)+24>>2]*+g[p+(ea*244|0)+136>>2]*+g[i+416>>2]*+g[p+(ea*244|0)+120>>2];g[p+(ea*244|0)+64>>2]=+g[p+(ea*244|0)+112>>2]*j*+g[V+(X*152|0)+16>>2]*+g[p+(ea*244|0)+128>>2]*+g[i+408>>2]+ +g[p+(ea*244|0)+64>>2];g[p+(ea*244|0)+68>>2]=G+ +g[p+(ea*244|0)+68>>2];g[p+(ea*244|0)+72>>2]=F+ +g[p+(ea*244|0)+72>>2];F=j*+g[p+(ea*244|0)+100>>2]*+g[V+(X*152|0)+68>>2];G=j*+g[p+(ea*244|0)+104>>2]*+g[V+(X*152|0)+72>>2];g[p+(ea*244|0)+80>>2]=j*+g[p+(ea*244|0)+96>>2]*+g[V+(X*152|0)+64>>2]+ +g[p+(ea*244|0)+80>>2];g[p+(ea*244|0)+84>>2]=F+ +g[p+(ea*244|0)+84>>2];g[p+(ea*244|0)+88>>2]=G+ +g[p+(ea*244|0)+88>>2]}while(0);if(!m)break;j=+g[V+(X*152|0)+100>>2];if(!(c[p+(fa*244|0)+240>>2]|0))break;G=+g[V+(X*152|0)+88>>2];F=+g[V+(X*152|0)+84>>2];z=+g[V+(X*152|0)+80>>2];x=j*+g[V+(X*152|0)+52>>2]*+g[p+(fa*244|0)+132>>2]*+g[m+412>>2]*+g[p+(fa*244|0)+116>>2];y=j*+g[V+(X*152|0)+56>>2]*+g[p+(fa*244|0)+136>>2]*+g[m+416>>2]*+g[p+(fa*244|0)+120>>2];g[p+(fa*244|0)+64>>2]=+g[p+(fa*244|0)+112>>2]*j*+g[V+(X*152|0)+48>>2]*+g[p+(fa*244|0)+128>>2]*+g[m+408>>2]+ +g[p+(fa*244|0)+64>>2];g[p+(fa*244|0)+68>>2]=x+ +g[p+(fa*244|0)+68>>2];g[p+(fa*244|0)+72>>2]=y+ +g[p+(fa*244|0)+72>>2];F=F*+g[p+(fa*244|0)+100>>2]*-j;G=G*+g[p+(fa*244|0)+104>>2]*-j;g[p+(fa*244|0)+80>>2]=+g[p+(fa*244|0)+80>>2]-z*+g[p+(fa*244|0)+96>>2]*-j;g[p+(fa*244|0)+84>>2]=+g[p+(fa*244|0)+84>>2]-F;g[p+(fa*244|0)+88>>2]=+g[p+(fa*244|0)+88>>2]-G}while(0);g[V+(X*152|0)+96>>2]=0.0;if(!(c[p+(ea*244|0)+240>>2]|0)){j=0.0;k=0.0;n=0.0;r=0.0;s=0.0;t=0.0}else{j=+g[p+(ea*244|0)+208>>2];k=+g[p+(ea*244|0)+212>>2];n=+g[p+(ea*244|0)+216>>2];r=+g[p+(ea*244|0)+224>>2];s=+g[p+(ea*244|0)+228>>2];t=+g[p+(ea*244|0)+232>>2]}if(!(c[p+(fa*244|0)+240>>2]|0)){u=0.0;v=0.0;w=0.0;x=0.0;y=0.0;z=0.0}else{u=+g[p+(fa*244|0)+208>>2];v=+g[p+(fa*244|0)+212>>2];w=+g[p+(fa*244|0)+216>>2];x=+g[p+(fa*244|0)+224>>2];y=+g[p+(fa*244|0)+228>>2];z=+g[p+(fa*244|0)+232>>2]}j=B-((j+ +g[p+(ea*244|0)+176>>2])*+g[V+(X*152|0)+16>>2]+(k+ +g[p+(ea*244|0)+180>>2])*+g[V+(X*152|0)+20>>2]+(n+ +g[p+(ea*244|0)+184>>2])*+g[V+(X*152|0)+24>>2]+((r+ +g[p+(ea*244|0)+192>>2])*+g[V+(X*152|0)>>2]+(s+ +g[p+(ea*244|0)+196>>2])*+g[V+(X*152|0)+4>>2]+(t+ +g[p+(ea*244|0)+200>>2])*+g[V+(X*152|0)+8>>2])+((u+ +g[p+(fa*244|0)+176>>2])*+g[V+(X*152|0)+48>>2]+(v+ +g[p+(fa*244|0)+180>>2])*+g[V+(X*152|0)+52>>2]+(w+ +g[p+(fa*244|0)+184>>2])*+g[V+(X*152|0)+56>>2]+((x+ +g[p+(fa*244|0)+192>>2])*+g[V+(X*152|0)+32>>2]+(y+ +g[p+(fa*244|0)+196>>2])*+g[V+(X*152|0)+36>>2]+(z+ +g[p+(fa*244|0)+200>>2])*+g[V+(X*152|0)+40>>2])));if(E>0.0){k=j-1.0/J*E;j=0.0}else{k=j;j=-(1.0/J*I*E)}J=+g[V+(X*152|0)+108>>2];I=j*J;G=k*J;m=(c[f+52>>2]|0)==0?1:E>+g[f+56>>2];g[V+(X*152|0)+112>>2]=m?I+G:G;g[V+(X*152|0)+128>>2]=m?0.0:I;g[V+(X*152|0)+116>>2]=H*J;g[V+(X*152|0)+120>>2]=0.0;g[V+(X*152|0)+124>>2]=1.0e10;c[V+(X*152|0)+140>>2]=c[b+68>>2];m=ba+4+(Z*192|0)+88|0;if(+g[m>>2]>0.0){Md(b,Q,ea,fa,X,+g[ba+4+(Z*192|0)+92>>2]);j=+g[S>>2];if(+C(+j)>.7071067690849304){I=+g[R>>2];H=1.0/+D(+(j*j+I*I));g[ja+16>>2]=0.0;g[$>>2]=-(H*j);g[aa>>2]=H*I;g[ja>>2]=(j*j+I*I)*H;J=+g[Q>>2];g[ja+4>>2]=-(H*I*J);u=J*-(H*j);k=0.0;n=-(H*j);r=H*I;s=(j*j+I*I)*H;j=-(H*I*J)}else{s=+g[Q>>2];I=+g[R>>2];J=1.0/+D(+(s*s+I*I));g[ja+16>>2]=-(I*J);g[$>>2]=J*s;g[aa>>2]=0.0;g[ja>>2]=-(J*s*j);g[ja+4>>2]=j*-(I*J);u=(s*s+I*I)*J;k=-(I*J);n=J*s;r=0.0;s=-(J*s*j);j=j*-(I*J)}t=1.0/+D(+(k*k+n*n+r*r));v=k*t;g[ja+16>>2]=v;w=n*t;g[$>>2]=w;t=r*t;g[aa>>2]=t;J=1.0/+D(+(s*s+j*j+u*u));n=s*J;g[ja>>2]=n;k=j*J;g[ja+4>>2]=k;j=u*J;g[ja+8>>2]=j;h=(c[ca+180>>2]&2|0)==0;if(h){r=v;s=w}else{y=+g[ca+4>>2];B=+g[ca+20>>2];F=+g[ca+36>>2];z=+g[ca+8>>2];E=+g[ca+24>>2];H=+g[ca+40>>2];r=+g[ca+12>>2];s=+g[ca+28>>2];J=+g[ca+44>>2];G=(y*v+B*w+F*t)*+g[ca+164>>2];I=(v*z+w*E+t*H)*+g[ca+168>>2];t=(v*r+w*s+t*J)*+g[ca+172>>2];g[ja+16>>2]=y*G+z*I+r*t;g[$>>2]=B*G+E*I+s*t;g[aa>>2]=F*G+H*I+J*t;g[ja+16+12>>2]=0.0;r=y*G+z*I+r*t;s=B*G+E*I+s*t;t=F*G+H*I+J*t}i=(c[da+180>>2]&2|0)==0;if(!i){w=+g[da+4>>2];z=+g[da+20>>2];F=+g[da+36>>2];x=+g[da+8>>2];B=+g[da+24>>2];H=+g[da+40>>2];y=+g[da+12>>2];E=+g[da+28>>2];J=+g[da+44>>2];G=(w*r+z*s+F*t)*+g[da+164>>2];I=(r*x+s*B+t*H)*+g[da+168>>2];t=(r*y+s*E+t*J)*+g[da+172>>2];g[ja+16>>2]=w*G+x*I+y*t;g[$>>2]=z*G+B*I+E*t;g[aa>>2]=F*G+H*I+J*t;g[ja+16+12>>2]=0.0;r=w*G+x*I+y*t;s=z*G+B*I+E*t;t=F*G+H*I+J*t}if(!((ca|0)==0|h)){w=+g[ca+4>>2];z=+g[ca+20>>2];F=+g[ca+36>>2];x=+g[ca+8>>2];B=+g[ca+24>>2];H=+g[ca+40>>2];y=+g[ca+12>>2];E=+g[ca+28>>2];J=+g[ca+44>>2];G=(w*n+z*k+F*j)*+g[ca+164>>2];I=(n*x+k*B+j*H)*+g[ca+168>>2];j=(n*y+k*E+j*J)*+g[ca+172>>2];g[ja>>2]=w*G+x*I+y*j;g[ja+4>>2]=z*G+B*I+E*j;g[ja+8>>2]=F*G+H*I+J*j;g[ja+12>>2]=0.0;n=w*G+x*I+y*j;k=z*G+B*I+E*j;j=F*G+H*I+J*j}if(!((da|0)==0|i)){w=+g[da+4>>2];z=+g[da+20>>2];F=+g[da+36>>2];x=+g[da+8>>2];B=+g[da+24>>2];H=+g[da+40>>2];y=+g[da+12>>2];E=+g[da+28>>2];J=+g[da+44>>2];G=(w*n+z*k+F*j)*+g[da+164>>2];I=(n*x+k*B+j*H)*+g[da+168>>2];j=(n*y+k*E+j*J)*+g[da+172>>2];g[ja>>2]=w*G+x*I+y*j;g[ja+4>>2]=z*G+B*I+E*j;g[ja+8>>2]=F*G+H*I+J*j;g[ja+12>>2]=0.0;n=w*G+x*I+y*j;k=z*G+B*I+E*j;j=F*G+H*I+J*j}if(+D(+(r*r+s*s+t*t))>.001)Md(b,ja+16|0,ea,fa,X,+g[m>>2]);if(+D(+(n*n+k*k+j*j))>.001)Md(b,ja,ea,fa,X,+g[m>>2]);h=c[f+72>>2]|0}do if(!(h&32))ia=82;else{if(!(c[T>>2]&1)){ia=82;break}h=ba+4+(Z*192|0)+152|0;ed(b,ba+4+(Z*192|0)+160|0,ea,fa,X,W,ja+48|0,ja+32|0,U,f,+g[ba+4+(Z*192|0)+136>>2],+g[h>>2]);if(!(c[f+72>>2]&16))break;ed(b,ba+4+(Z*192|0)+176|0,ea,fa,X,W,ja+48|0,ja+32|0,U,f,+g[ba+4+(Z*192|0)+140>>2],+g[h>>2])}while(0);do if((ia|0)==82){ia=0;j=+g[Q>>2];v=+g[R>>2];u=+g[S>>2];k=P-(P*L+O*M+K*N)*j;s=O-(P*L+O*M+K*N)*v;r=K-(P*L+O*M+K*N)*u;A=ba+4+(Z*192|0)+160|0;g[ba+4+(Z*192|0)+160>>2]=k;h=ba+4+(Z*192|0)+164|0;g[h>>2]=s;p=ba+4+(Z*192|0)+168|0;g[p>>2]=r;q=ba+4+(Z*192|0)+172|0;g[q>>2]=0.0;if((c[f+72>>2]&64|0)==0?k*k+s*s+r*r>1.1920928955078125e-07:0){j=1.0/+D(+(k*k+s*s+r*r));g[A>>2]=k*j;g[h>>2]=j*s;g[p>>2]=j*r;do if(!ca){n=k*j;k=j*s;j=j*r}else{if(!(c[ca+180>>2]&1)){n=k*j;k=j*s;j=j*r;break}G=+g[ca+4>>2];I=+g[ca+20>>2];L=+g[ca+36>>2];H=+g[ca+8>>2];J=+g[ca+24>>2];N=+g[ca+40>>2];n=+g[ca+12>>2];K=+g[ca+28>>2];P=+g[ca+44>>2];M=(G*k*j+I*j*s+j*r*L)*+g[ca+164>>2];O=(k*j*H+j*s*J+j*r*N)*+g[ca+168>>2];j=(k*j*n+j*s*K+j*r*P)*+g[ca+172>>2];g[A>>2]=G*M+H*O+n*j;g[h>>2]=I*M+J*O+K*j;g[p>>2]=L*M+N*O+P*j;g[q>>2]=0.0;n=G*M+H*O+n*j;k=I*M+J*O+K*j;j=L*M+N*O+P*j}while(0);do if(da|0){if(!(c[da+180>>2]&1))break;E=+g[da+4>>2];H=+g[da+20>>2];K=+g[da+36>>2];F=+g[da+8>>2];I=+g[da+24>>2];M=+g[da+40>>2];G=+g[da+12>>2];J=+g[da+28>>2];O=+g[da+44>>2];L=(E*n+H*k+K*j)*+g[da+164>>2];N=(n*F+k*I+j*M)*+g[da+168>>2];P=(n*G+k*J+j*O)*+g[da+172>>2];g[A>>2]=E*L+F*N+G*P;g[h>>2]=H*L+I*N+J*P;g[p>>2]=K*L+M*N+O*P;g[q>>2]=0.0}while(0);ed(b,A,ea,fa,X,W,ja+48|0,ja+32|0,U,f,0.0,0.0);if(!(c[f+72>>2]&16))break;O=+g[h>>2];n=+g[S>>2];L=+g[p>>2];M=+g[R>>2];P=+g[Q>>2];N=+g[A>>2];o=ba+4+(Z*192|0)+176|0;g[ba+4+(Z*192|0)+176>>2]=O*n-L*M;h=ba+4+(Z*192|0)+180|0;i=ba+4+(Z*192|0)+184|0;m=ba+4+(Z*192|0)+188|0;g[m>>2]=0.0;k=1.0/+D(+((O*n-L*M)*(O*n-L*M)+(L*P-n*N)*(L*P-n*N)+(M*N-O*P)*(M*N-O*P)));j=(O*n-L*M)*k;g[o>>2]=j;n=(L*P-n*N)*k;g[h>>2]=n;k=(M*N-O*P)*k;g[i>>2]=k;do if(ca){if(!(c[ca+180>>2]&1))break;F=+g[ca+4>>2];I=+g[ca+20>>2];L=+g[ca+36>>2];G=+g[ca+8>>2];J=+g[ca+24>>2];N=+g[ca+40>>2];H=+g[ca+12>>2];K=+g[ca+28>>2];P=+g[ca+44>>2];M=(F*j+I*n+k*L)*+g[ca+164>>2];O=(j*G+n*J+k*N)*+g[ca+168>>2];k=(j*H+n*K+k*P)*+g[ca+172>>2];g[o>>2]=F*M+G*O+H*k;g[h>>2]=I*M+J*O+K*k;g[i>>2]=L*M+N*O+P*k;g[m>>2]=0.0;j=F*M+G*O+H*k;n=I*M+J*O+K*k;k=L*M+N*O+P*k}while(0);do if(da|0){if(!(c[da+180>>2]&1))break;E=+g[da+4>>2];H=+g[da+20>>2];K=+g[da+36>>2];F=+g[da+8>>2];I=+g[da+24>>2];M=+g[da+40>>2];G=+g[da+12>>2];J=+g[da+28>>2];O=+g[da+44>>2];L=(E*j+H*n+K*k)*+g[da+164>>2];N=(j*F+n*I+k*M)*+g[da+168>>2];P=(j*G+n*J+k*O)*+g[da+172>>2];g[o>>2]=E*L+F*N+G*P;g[h>>2]=H*L+I*N+J*P;g[i>>2]=K*L+M*N+O*P;g[m>>2]=0.0}while(0);ed(b,o,ea,fa,X,W,ja+48|0,ja+32|0,U,f,0.0,0.0);break}o=ba+4+(Z*192|0)+176|0;if(+C(+u)>.7071067690849304){P=1.0/+D(+(u*u+v*v));g[A>>2]=0.0;g[h>>2]=-(P*u);g[p>>2]=P*v;s=-(P*v*j);t=j*-(P*u);r=(u*u+v*v)*P;n=0.0;k=-(P*u);j=P*v}else{k=1.0/+D(+(j*j+v*v));g[A>>2]=-(v*k);g[h>>2]=k*j;g[p>>2]=0.0;s=u*-(v*k);t=(j*j+v*v)*k;r=-(k*j*u);n=-(v*k);k=k*j;j=0.0}g[o>>2]=r;m=ba+4+(Z*192|0)+180|0;g[m>>2]=s;i=ba+4+(Z*192|0)+184|0;g[i>>2]=t;do if(ca){if(!(c[ca+180>>2]&1))break;F=+g[ca+4>>2];I=+g[ca+20>>2];L=+g[ca+36>>2];G=+g[ca+8>>2];J=+g[ca+24>>2];N=+g[ca+40>>2];H=+g[ca+12>>2];K=+g[ca+28>>2];P=+g[ca+44>>2];M=(F*n+I*k+L*j)*+g[ca+164>>2];O=(n*G+k*J+j*N)*+g[ca+168>>2];j=(n*H+k*K+j*P)*+g[ca+172>>2];g[A>>2]=F*M+G*O+H*j;g[h>>2]=I*M+J*O+K*j;g[p>>2]=L*M+N*O+P*j;g[q>>2]=0.0;n=F*M+G*O+H*j;k=I*M+J*O+K*j;j=L*M+N*O+P*j}while(0);do if(da|0){if(!(c[da+180>>2]&1))break;E=+g[da+4>>2];H=+g[da+20>>2];K=+g[da+36>>2];F=+g[da+8>>2];I=+g[da+24>>2];M=+g[da+40>>2];G=+g[da+12>>2];J=+g[da+28>>2];O=+g[da+44>>2];L=(E*n+H*k+K*j)*+g[da+164>>2];N=(n*F+k*I+j*M)*+g[da+168>>2];P=(n*G+k*J+j*O)*+g[da+172>>2];g[A>>2]=E*L+F*N+G*P;g[h>>2]=H*L+I*N+J*P;g[p>>2]=K*L+M*N+O*P;g[q>>2]=0.0}while(0);ed(b,A,ea,fa,X,W,ja+48|0,ja+32|0,U,f,0.0,0.0);h=c[f+72>>2]|0;if(h&16){do if(ca|0){if(!(c[ca+180>>2]&1))break;E=+g[ca+4>>2];z=+g[o>>2];H=+g[ca+20>>2];B=+g[m>>2];K=+g[ca+36>>2];P=+g[i>>2];F=+g[ca+8>>2];I=+g[ca+24>>2];M=+g[ca+40>>2];G=+g[ca+12>>2];J=+g[ca+28>>2];O=+g[ca+44>>2];L=(E*z+H*B+K*P)*+g[ca+164>>2];N=(z*F+B*I+P*M)*+g[ca+168>>2];P=(z*G+B*J+P*O)*+g[ca+172>>2];g[o>>2]=E*L+F*N+G*P;g[m>>2]=H*L+I*N+J*P;g[i>>2]=K*L+M*N+O*P;g[ba+4+(Z*192|0)+188>>2]=0.0}while(0);do if(da|0){if(!(c[da+180>>2]&1))break;E=+g[da+4>>2];z=+g[o>>2];H=+g[da+20>>2];B=+g[m>>2];K=+g[da+36>>2];P=+g[i>>2];F=+g[da+8>>2];I=+g[da+24>>2];M=+g[da+40>>2];G=+g[da+12>>2];J=+g[da+28>>2];O=+g[da+44>>2];L=(E*z+H*B+K*P)*+g[da+164>>2];N=(z*F+B*I+P*M)*+g[da+168>>2];P=(z*G+B*J+P*O)*+g[da+172>>2];g[o>>2]=E*L+F*N+G*P;g[m>>2]=H*L+I*N+J*P;g[i>>2]=K*L+M*N+O*P;g[ba+4+(Z*192|0)+188>>2]=0.0}while(0);ed(b,o,ea,fa,X,W,ja+48|0,ja+32|0,U,f,0.0,0.0);h=c[f+72>>2]|0}if((h&80|0)!=80)break;c[T>>2]=c[T>>2]|1}while(0);q=c[b+16>>2]|0;i=c[q+(ea*244|0)+240>>2]|0;m=c[q+(fa*244|0)+240>>2]|0;o=c[V+(X*152|0)+140>>2]|0;p=c[b+76>>2]|0;h=c[f+72>>2]|0;do if(!(h&4))g[p+(o*152|0)+100>>2]=0.0;else{j=+g[ba+4+(Z*192|0)+128>>2]*+g[f+68>>2];g[p+(o*152|0)+100>>2]=j;if(i|0){O=+g[i+404>>2];U=j*O*+g[p+(o*152|0)+20>>2]*+g[i+412>>2]*+g[q+(ea*244|0)+116>>2];P=j*O*+g[p+(o*152|0)+24>>2]*+g[i+416>>2]*+g[q+(ea*244|0)+120>>2];g[q+(ea*244|0)+64>>2]=+g[q+(ea*244|0)+112>>2]*j*O*+g[p+(o*152|0)+16>>2]*+g[i+408>>2]+ +g[q+(ea*244|0)+64>>2];g[q+(ea*244|0)+68>>2]=U+ +g[q+(ea*244|0)+68>>2];g[q+(ea*244|0)+72>>2]=P+ +g[q+(ea*244|0)+72>>2];P=j*+g[q+(ea*244|0)+100>>2]*+g[p+(o*152|0)+68>>2];U=j*+g[q+(ea*244|0)+104>>2]*+g[p+(o*152|0)+72>>2];g[q+(ea*244|0)+80>>2]=j*+g[q+(ea*244|0)+96>>2]*+g[p+(o*152|0)+64>>2]+ +g[q+(ea*244|0)+80>>2];g[q+(ea*244|0)+84>>2]=P+ +g[q+(ea*244|0)+84>>2];g[q+(ea*244|0)+88>>2]=U+ +g[q+(ea*244|0)+88>>2]}if(!m)break;j=+g[m+404>>2];k=+g[p+(o*152|0)+100>>2];if(!(c[q+(fa*244|0)+240>>2]|0))break;U=+g[p+(o*152|0)+88>>2];P=+g[p+(o*152|0)+84>>2];O=+g[p+(o*152|0)+80>>2];M=k*j*+g[p+(o*152|0)+52>>2]*+g[m+412>>2]*+g[q+(fa*244|0)+116>>2];N=k*j*+g[p+(o*152|0)+56>>2]*+g[m+416>>2]*+g[q+(fa*244|0)+120>>2];g[q+(fa*244|0)+64>>2]=+g[q+(fa*244|0)+112>>2]*k*j*+g[p+(o*152|0)+48>>2]*+g[m+408>>2]+ +g[q+(fa*244|0)+64>>2];g[q+(fa*244|0)+68>>2]=M+ +g[q+(fa*244|0)+68>>2];g[q+(fa*244|0)+72>>2]=N+ +g[q+(fa*244|0)+72>>2];P=P*+g[q+(fa*244|0)+100>>2]*-k;U=U*+g[q+(fa*244|0)+104>>2]*-k;g[q+(fa*244|0)+80>>2]=+g[q+(fa*244|0)+80>>2]-O*+g[q+(fa*244|0)+96>>2]*-k;g[q+(fa*244|0)+84>>2]=+g[q+(fa*244|0)+84>>2]-P;g[q+(fa*244|0)+88>>2]=+g[q+(fa*244|0)+88>>2]-U}while(0);do if(h&16|0){if(!(h&4)){g[p+((o+1|0)*152|0)+100>>2]=0.0;break}k=+g[ba+4+(Z*192|0)+132>>2]*+g[f+68>>2];g[p+((o+1|0)*152|0)+100>>2]=k;do if(i|0){j=+g[i+404>>2];if(!(c[q+(ea*244|0)+240>>2]|0))break;U=k*j*+g[p+((o+1|0)*152|0)+20>>2]*+g[q+(ea*244|0)+116>>2];P=k*j*+g[p+((o+1|0)*152|0)+24>>2]*+g[q+(ea*244|0)+120>>2];g[q+(ea*244|0)+64>>2]=+g[q+(ea*244|0)+112>>2]*k*j*+g[p+((o+1|0)*152|0)+16>>2]+ +g[q+(ea*244|0)+64>>2];g[q+(ea*244|0)+68>>2]=U+ +g[q+(ea*244|0)+68>>2];g[q+(ea*244|0)+72>>2]=P+ +g[q+(ea*244|0)+72>>2];P=k*+g[q+(ea*244|0)+100>>2]*+g[p+((o+1|0)*152|0)+68>>2];U=k*+g[q+(ea*244|0)+104>>2]*+g[p+((o+1|0)*152|0)+72>>2];g[q+(ea*244|0)+80>>2]=k*+g[q+(ea*244|0)+96>>2]*+g[p+((o+1|0)*152|0)+64>>2]+ +g[q+(ea*244|0)+80>>2];g[q+(ea*244|0)+84>>2]=P+ +g[q+(ea*244|0)+84>>2];g[q+(ea*244|0)+88>>2]=U+ +g[q+(ea*244|0)+88>>2]}while(0);if(!m)break;j=+g[m+404>>2];k=+g[p+((o+1|0)*152|0)+100>>2];if(!(c[q+(fa*244|0)+240>>2]|0))break;U=+g[p+((o+1|0)*152|0)+88>>2];P=+g[p+((o+1|0)*152|0)+84>>2];O=+g[p+((o+1|0)*152|0)+80>>2];M=k*j*+g[p+((o+1|0)*152|0)+52>>2]*+g[q+(fa*244|0)+116>>2];N=k*j*+g[p+((o+1|0)*152|0)+56>>2]*+g[q+(fa*244|0)+120>>2];g[q+(fa*244|0)+64>>2]=+g[q+(fa*244|0)+112>>2]*k*j*+g[p+((o+1|0)*152|0)+48>>2]+ +g[q+(fa*244|0)+64>>2];g[q+(fa*244|0)+68>>2]=M+ +g[q+(fa*244|0)+68>>2];g[q+(fa*244|0)+72>>2]=N+ +g[q+(fa*244|0)+72>>2];P=P*+g[q+(fa*244|0)+100>>2]*-k;U=U*+g[q+(fa*244|0)+104>>2]*-k;g[q+(fa*244|0)+80>>2]=+g[q+(fa*244|0)+80>>2]-O*+g[q+(fa*244|0)+96>>2]*-k;g[q+(fa*244|0)+84>>2]=+g[q+(fa*244|0)+84>>2]-P;g[q+(fa*244|0)+88>>2]=+g[q+(fa*244|0)+88>>2]-U}while(0);h=c[ba+780>>2]|0}Z=Z+1|0}while((Z|0)<(h|0))}Y=Y+1|0}while((Y|0)!=(e|0));l=ja;return}function lc(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=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;A=l;l=l+80|0;bf(b,e,f)|0;a[A+16>>0]=1;c[A+12>>2]=0;c[A+4>>2]=0;c[A+8>>2]=0;a[A+36>>0]=1;c[A+32>>2]=0;c[A+24>>2]=0;c[A+28>>2]=0;a[A+56>>0]=1;c[A+52>>2]=0;c[A+44>>2]=0;c[A+48>>2]=0;a[A+76>>0]=1;c[A+72>>2]=0;c[A+64>>2]=0;c[A+68>>2]=0;y=c[b+932>>2]|0;c[e+300>>2]=y;if(y){y=zb[c[(c[f>>2]|0)+28>>2]&31](f,b+928|0)|0;c[e+268>>2]=y;if(y|0){i=c[e+300>>2]|0;m=Bb[c[(c[f>>2]|0)+16>>2]&63](f,4,i)|0;if((i|0)>0){g=c[m+8>>2]|0;h=0;while(1){j=c[(c[b+940>>2]|0)+(h<<2)>>2]|0;if(!j)k=0;else k=zb[c[(c[f>>2]|0)+28>>2]&31](f,j)|0;c[g>>2]=k;if(!(zb[c[(c[f>>2]|0)+24>>2]&31](f,j)|0)){y=Bb[c[(c[f>>2]|0)+16>>2]&63](f,16,1)|0;t=c[y+8>>2]|0;c[t+12>>2]=c[j+16>>2];c[t+4>>2]=c[j+8>>2];c[t>>2]=c[j+4>>2];c[t+8>>2]=c[j+12>>2];Zb[c[(c[f>>2]|0)+20>>2]&31](f,y,11010,1414349395,j)}h=h+1|0;if((h|0)>=(i|0)){g=f;break}else g=g+4|0}}else g=f;Zb[c[(c[g>>2]|0)+20>>2]&31](f,m,11010,1497453121,b+928|0)}}else c[e+268>>2]=0;y=c[b+772>>2]|0;c[e+304>>2]=y;if(y){y=zb[c[(c[f>>2]|0)+28>>2]&31](f,b+768|0)|0;c[e+272>>2]=y;if(y|0){s=c[e+304>>2]|0;t=Bb[c[(c[f>>2]|0)+16>>2]&63](f,100,s)|0;if((s|0)>0){q=0;r=c[t+8>>2]|0;while(1){h=c[b+780>>2]|0;c[r+52>>2]=c[h+(q*104|0)+56>>2];c[r+56>>2]=c[h+(q*104|0)+60>>2];c[r+60>>2]=c[h+(q*104|0)+64>>2];c[r+64>>2]=c[h+(q*104|0)+68>>2];c[r+88>>2]=c[h+(q*104|0)+92>>2];c[r+92>>2]=(a[h+(q*104|0)+100>>0]<<7&255)<<24>>24>>7<<24>>24;c[r+84>>2]=c[h+(q*104|0)+88>>2];g=c[h+(q*104|0)+4>>2]|0;if(!g){i=0;g=h}else{i=zb[c[(c[f>>2]|0)+28>>2]&31](f,g)|0;g=c[b+780>>2]|0}c[r>>2]=i;c[r+68>>2]=c[g+(q*104|0)+72>>2];c[r+72>>2]=c[g+(q*104|0)+76>>2];c[r+76>>2]=c[g+(q*104|0)+80>>2];c[r+80>>2]=c[g+(q*104|0)+84>>2];c[r+4>>2]=c[g+(q*104|0)+8>>2];c[r+8>>2]=c[g+(q*104|0)+12>>2];c[r+12>>2]=c[g+(q*104|0)+16>>2];c[r+16>>2]=c[g+(q*104|0)+20>>2];c[r+20>>2]=c[g+(q*104|0)+24>>2];c[r+24>>2]=c[g+(q*104|0)+28>>2];c[r+28>>2]=c[g+(q*104|0)+32>>2];c[r+32>>2]=c[g+(q*104|0)+36>>2];c[r+36>>2]=c[g+(q*104|0)+40>>2];c[r+40>>2]=c[g+(q*104|0)+44>>2];c[r+44>>2]=c[g+(q*104|0)+48>>2];c[r+48>>2]=c[g+(q*104|0)+52>>2];m=(c[b+780>>2]|0)+(q*104|0)|0;p=((m+~(m<<15)|0)>>>10^m+~(m<<15))*9|0;p=((p>>>6^p)+~((p>>>6^p)<<11)|0)>>>16^(p>>>6^p)+~((p>>>6^p)<<11);n=c[A+48>>2]|0;a:do if((p&n+-1)>>>0<(c[A+4>>2]|0)>>>0?(u=c[(c[A+12>>2]|0)+((p&n+-1)<<2)>>2]|0,(u|0)!=-1):0){h=c[A+72>>2]|0;i=c[A+32>>2]|0;g=u;while(1){if((m|0)==(c[h+(g<<3)>>2]|0))break;g=c[i+(g<<2)>>2]|0;if((g|0)==-1){z=27;break a}}h=q;i=c[A+52>>2]|0}else z=27;while(0);if((z|0)==27){z=0;h=c[A+44>>2]|0;if((h|0)==(n|0)){g=n|0?n<<1:1;if((n|0)<(g|0)){if((g|0)!=0?(c[6995]=(c[6995]|0)+1,v=sc((g<<2|3)+16|0)|0,(v|0)!=0):0){c[(v+4+15&-16)+-4>>2]=v;k=v+4+15&-16}else k=0;j=c[A+52>>2]|0;if((n|0)<=0)if(!j)i=n;else z=35;else{i=0;do{c[k+(i<<2)>>2]=c[j+(i<<2)>>2];i=i+1|0}while((i|0)!=(n|0));z=35}if((z|0)==35){z=0;if(a[A+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[A+52>>2]=0;i=c[A+44>>2]|0}a[A+56>>0]=1;c[A+52>>2]=k;c[A+48>>2]=g}else{g=n;i=n}}else{g=n;i=h}c[(c[A+52>>2]|0)+(i<<2)>>2]=q;c[A+44>>2]=i+1;i=c[A+64>>2]|0;if((i|0)==(c[A+68>>2]|0)?(w=i|0?i<<1:1,(i|0)<(w|0)):0){if((w|0)!=0?(c[6995]=(c[6995]|0)+1,x=sc((w<<3|3)+16|0)|0,(x|0)!=0):0){c[(x+4+15&-16)+-4>>2]=x;j=x+4+15&-16}else j=0;if((i|0)>0){g=0;do{k=(c[A+72>>2]|0)+(g<<3)|0;o=c[k+4>>2]|0;y=j+(g<<3)|0;c[y>>2]=c[k>>2];c[y+4>>2]=o;g=g+1|0}while((g|0)!=(i|0))}g=c[A+72>>2]|0;if(g|0){if(a[A+76>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0)}c[A+72>>2]=0}a[A+76>>0]=1;c[A+72>>2]=j;c[A+68>>2]=w;i=c[A+64>>2]|0;g=c[A+48>>2]|0}c[(c[A+72>>2]|0)+(i<<3)>>2]=m;c[A+64>>2]=i+1;if((n|0)<(g|0)){o=c[A+4>>2]|0;do if((o|0)<(g|0)){if((c[A+8>>2]|0)<(g|0)){do if(!g)i=0;else{c[6995]=(c[6995]|0)+1;i=sc((g<<2|3)+16|0)|0;if(!i){i=0;break}c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}while(0);k=c[A+12>>2]|0;if((o|0)>0){j=0;do{c[i+(j<<2)>>2]=c[k+(j<<2)>>2];j=j+1|0}while((j|0)!=(o|0));if(a[A+16>>0]|0)z=62}else if(!((k|0)==0|(a[A+16>>0]|0)==0))z=62;if((z|0)==62){z=0;c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}a[A+16>>0]=1;c[A+12>>2]=i;c[A+8>>2]=g}else i=c[A+12>>2]|0;n=g<<2;Yk(i+(o<<2)|0,0,n-(o<<2)|0)|0;c[A+4>>2]=g;m=c[A+24>>2]|0;if((m|0)<(g|0)){if((c[A+28>>2]|0)<(g|0)){do if(!g)i=0;else{c[6995]=(c[6995]|0)+1;i=sc((n|3)+16|0)|0;if(!i){i=0;break}c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}while(0);k=c[A+32>>2]|0;if((m|0)>0){j=0;do{c[i+(j<<2)>>2]=c[k+(j<<2)>>2];j=j+1|0}while((j|0)!=(m|0));if(a[A+36>>0]|0)z=74}else if(!((k|0)==0|(a[A+36>>0]|0)==0))z=74;if((z|0)==74){z=0;c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}a[A+36>>0]=1;c[A+32>>2]=i;c[A+28>>2]=g}else i=c[A+32>>2]|0;Yk(i+(m<<2)|0,0,n-(m<<2)|0)|0}c[A+24>>2]=g;if((g|0)>0){Yk(c[A+12>>2]|0,-1,n|0)|0;Yk(c[A+32>>2]|0,-1,n|0)|0}if((o|0)<=0){g=c[A+48>>2]|0;break}j=c[A+72>>2]|0;k=c[A+12>>2]|0;m=c[A+32>>2]|0;g=c[A+48>>2]|0;i=0;do{y=c[j+(i<<3)>>2]|0;y=((y+~(y<<15)|0)>>>10^y+~(y<<15))*9|0;y=k+(((((y>>>6^y)+~((y>>>6^y)<<11)|0)>>>16^(y>>>6^y)+~((y>>>6^y)<<11))&g+-1)<<2)|0;c[m+(i<<2)>>2]=c[y>>2];c[y>>2]=i;i=i+1|0}while((i|0)!=(o|0))}while(0);g=p&g+-1}else g=p&n+-1;i=c[A+12>>2]|0;c[(c[A+32>>2]|0)+(h<<2)>>2]=c[i+(g<<2)>>2]}c[i+(g<<2)>>2]=h;q=q+1|0;if((q|0)>=(s|0))break;else r=r+100|0}}Zb[c[(c[f>>2]|0)+20>>2]&31](f,t,11031,1145979475,b+768|0)}}else c[e+272>>2]=0;y=c[b+792>>2]|0;c[e+308>>2]=y;if(y){y=zb[c[(c[f>>2]|0)+28>>2]&31](f,c[b+800>>2]|0)|0;c[e+276>>2]=y;if(y|0){m=c[e+308>>2]|0;n=Bb[c[(c[f>>2]|0)+16>>2]&63](f,20,m)|0;if((m|0)>0){i=c[b+800>>2]|0;j=c[n+8>>2]|0;k=0;g=i;while(1){c[j+16>>2]=(a[i+(k*52|0)+36>>0]<<7&255)<<24>>24>>7<<24>>24;h=c[i+(k*52|0)+4>>2]|0;if(!h)h=0;else{h=zb[c[(c[f>>2]|0)+28>>2]&31](f,h)|0;i=c[b+800>>2]|0;g=i}c[j>>2]=h;h=c[i+(k*52|0)+24>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+4>>2]=h;h=c[i+(k*52|0)+28>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+8>>2]=h;c[j+12>>2]=c[i+(k*52|0)+32>>2];k=k+1|0;if((k|0)>=(m|0))break;else j=j+20|0}}else g=c[b+800>>2]|0;Zb[c[(c[f>>2]|0)+20>>2]&31](f,n,11048,1497453121,g)}}else c[e+276>>2]=0;y=c[b+812>>2]|0;c[e+312>>2]=y;if(y){y=zb[c[(c[f>>2]|0)+28>>2]&31](f,c[b+820>>2]|0)|0;c[e+280>>2]=y;if(y|0){m=c[e+312>>2]|0;n=Bb[c[(c[f>>2]|0)+16>>2]&63](f,36,m)|0;if((m|0)>0){i=c[b+820>>2]|0;j=c[n+8>>2]|0;k=0;g=i;while(1){h=c[i+(k*44|0)+4>>2]|0;if(!h)h=0;else{h=zb[c[(c[f>>2]|0)+28>>2]&31](f,h)|0;i=c[b+820>>2]|0;g=i}c[j+16>>2]=h;c[j>>2]=c[i+(k*44|0)+20>>2];c[j+4>>2]=c[i+(k*44|0)+24>>2];c[j+8>>2]=c[i+(k*44|0)+28>>2];c[j+12>>2]=c[i+(k*44|0)+32>>2];h=c[i+(k*44|0)+8>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+20>>2]=h;h=c[i+(k*44|0)+12>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+24>>2]=h;h=c[i+(k*44|0)+16>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+28>>2]=h;c[j+32>>2]=c[i+(k*44|0)+36>>2];k=k+1|0;if((k|0)>=(m|0))break;else j=j+36|0}}else g=c[b+820>>2]|0;Zb[c[(c[f>>2]|0)+20>>2]&31](f,n,11065,1497453121,g)}}else c[e+280>>2]=0;y=c[b+832>>2]|0;c[e+316>>2]=y;if(y){y=zb[c[(c[f>>2]|0)+28>>2]&31](f,c[b+840>>2]|0)|0;c[e+284>>2]=y;if(y|0){m=c[e+316>>2]|0;n=Bb[c[(c[f>>2]|0)+16>>2]&63](f,100,m)|0;if((m|0)>0){i=c[b+840>>2]|0;j=c[n+8>>2]|0;k=0;g=i;while(1){c[j>>2]=c[i+(k*104|0)+32>>2];c[j+4>>2]=c[i+(k*104|0)+36>>2];c[j+8>>2]=c[i+(k*104|0)+40>>2];c[j+12>>2]=c[i+(k*104|0)+44>>2];h=c[i+8>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+68>>2]=h;c[j+16>>2]=c[i+(k*104|0)+48>>2];c[j+20>>2]=c[i+(k*104|0)+52>>2];c[j+24>>2]=c[i+(k*104|0)+56>>2];c[j+28>>2]=c[i+(k*104|0)+60>>2];h=c[i+116>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+72>>2]=h;c[j+32>>2]=c[i+(k*104|0)+64>>2];c[j+36>>2]=c[i+(k*104|0)+68>>2];c[j+40>>2]=c[i+(k*104|0)+72>>2];c[j+44>>2]=c[i+(k*104|0)+76>>2];h=c[i+224>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+76>>2]=h;c[j+48>>2]=c[i+(k*104|0)+80>>2];c[j+52>>2]=c[i+(k*104|0)+84>>2];c[j+56>>2]=c[i+(k*104|0)+88>>2];c[j+60>>2]=c[i+(k*104|0)+92>>2];h=c[i+332>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+80>>2]=h;c[j+88>>2]=c[i+(k*104|0)+96>>2];c[j+92>>2]=c[i+(k*104|0)+100>>2];h=c[i+(k*104|0)+4>>2]|0;if(!h)h=0;else{h=zb[c[(c[f>>2]|0)+28>>2]&31](f,h)|0;i=c[b+840>>2]|0;g=i}c[j+64>>2]=h;c[j+84>>2]=c[i+(k*104|0)+24>>2];k=k+1|0;if((k|0)>=(m|0))break;else j=j+100|0}}else g=c[b+840>>2]|0;Zb[c[(c[f>>2]|0)+20>>2]&31](f,n,11082,1497453121,g)}}else c[e+284>>2]=0;y=c[b+852>>2]|0;c[e+320>>2]=y;if(y){y=zb[c[(c[f>>2]|0)+28>>2]&31](f,c[b+860>>2]|0)|0;c[e+288>>2]=y;if(!y)y=f;else{k=c[e+320>>2]|0;m=Bb[c[(c[f>>2]|0)+16>>2]&63](f,92,k)|0;if((k|0)>0){i=c[m+8>>2]|0;j=0;while(1){h=c[b+860>>2]|0;c[i>>2]=c[h+(j*96|0)+28>>2];c[i+4>>2]=c[h+(j*96|0)+32>>2];c[i+8>>2]=c[h+(j*96|0)+36>>2];c[i+12>>2]=c[h+(j*96|0)+40>>2];c[i+16>>2]=c[h+(j*96|0)+44>>2];c[i+20>>2]=c[h+(j*96|0)+48>>2];c[i+24>>2]=c[h+(j*96|0)+52>>2];c[i+28>>2]=c[h+(j*96|0)+56>>2];c[i+32>>2]=c[h+(j*96|0)+60>>2];c[i+36>>2]=c[h+(j*96|0)+64>>2];c[i+40>>2]=c[h+(j*96|0)+68>>2];c[i+44>>2]=c[h+(j*96|0)+72>>2];c[i+48>>2]=c[h+(j*96|0)+76>>2];c[i+52>>2]=c[h+(j*96|0)+80>>2];c[i+56>>2]=c[h+(j*96|0)+84>>2];c[i+60>>2]=c[h+(j*96|0)+88>>2];c[i+88>>2]=c[h+(j*96|0)+92>>2];h=c[b+860>>2]|0;c[i+64>>2]=c[h+(j*96|0)+4>>2];c[i+68>>2]=c[h+(j*96|0)+8>>2];c[i+72>>2]=c[h+(j*96|0)+12>>2];c[i+76>>2]=c[h+(j*96|0)+16>>2];g=c[h+(j*96|0)>>2]|0;if(!g)g=-1;else g=(g-(c[b+780>>2]|0)|0)/104|0;c[i+84>>2]=g;g=c[h+(j*96|0)+20>>2]|0;if(!g)g=0;else g=zb[c[(c[f>>2]|0)+28>>2]&31](f,g)|0;c[i+80>>2]=g;j=j+1|0;if((j|0)>=(k|0))break;else i=i+92|0}}Zb[c[(c[f>>2]|0)+20>>2]&31](f,m,11100,1497453121,c[b+860>>2]|0);y=f}}else{c[e+288>>2]=0;y=f}c[e+360>>2]=c[b+376>>2];c[e+336>>2]=c[b+352>>2];c[e+352>>2]=c[b+368>>2];c[e+332>>2]=c[b+348>>2];c[e+348>>2]=c[b+364>>2];c[e+344>>2]=c[b+360>>2];c[e+420>>2]=c[b+436>>2];c[e+424>>2]=c[b+440>>2];c[e+428>>2]=c[b+444>>2];c[e+416>>2]=c[b+432>>2];n=c[b+424>>2]|0;c[e+340>>2]=c[b+356>>2];c[e+364>>2]=c[b+380>>2];c[e+432>>2]=c[b+448>>2];c[e+356>>2]=c[b+372>>2];c[e+368>>2]=c[b+384>>2];c[e+372>>2]=c[b+388>>2];c[e+376>>2]=c[b+392>>2];c[e+380>>2]=c[b+396>>2];c[e+412>>2]=c[b+428>>2];c[e+408>>2]=n;c[e+384>>2]=c[b+400>>2];c[e+388>>2]=c[b+404>>2];c[e+392>>2]=c[b+408>>2];c[e+396>>2]=c[b+412>>2];c[e+400>>2]=c[b+416>>2];c[e+404>>2]=c[b+420>>2];c[e+264>>2]=zb[c[(c[y>>2]|0)+28>>2]&31](f,b+532|0)|0;n=Bb[c[(c[f>>2]|0)+16>>2]&63](f,192,1)|0;m=c[n+8>>2]|0;c[m+96>>2]=c[b+692>>2];c[m+100>>2]=c[b+696>>2];c[m+104>>2]=c[b+700>>2];c[m+108>>2]=c[b+704>>2];c[m+112>>2]=c[b+708>>2];c[m+116>>2]=c[b+712>>2];c[m+120>>2]=c[b+716>>2];c[m+124>>2]=c[b+720>>2];c[m+128>>2]=c[b+724>>2];c[m+132>>2]=c[b+728>>2];c[m+136>>2]=c[b+732>>2];c[m+140>>2]=c[b+736>>2];c[m+180>>2]=d[b+533>>0];c[m+176>>2]=d[b+532>>0];c[m+144>>2]=c[b+580>>2];c[m+148>>2]=c[b+584>>2];c[m+152>>2]=c[b+588>>2];c[m+156>>2]=c[b+592>>2];x=c[b+544>>2]|0;c[m+168>>2]=x;if(x){x=zb[c[(c[y>>2]|0)+28>>2]&31](f,c[b+552>>2]|0)|0;j=c[m+168>>2]|0;c[m+160>>2]=x;if(j|0){k=Bb[c[(c[f>>2]|0)+16>>2]&63](f,16,j)|0;if((j|0)>0){g=c[b+552>>2]|0;h=c[k+8>>2]|0;i=0;while(1){c[h>>2]=c[g+(i<<4)>>2];c[h+4>>2]=c[g+(i<<4)+4>>2];c[h+8>>2]=c[g+(i<<4)+8>>2];c[h+12>>2]=c[g+(i<<4)+12>>2];i=i+1|0;if((i|0)==(j|0))break;else h=h+16|0}}else g=c[b+552>>2]|0;Zb[c[(c[f>>2]|0)+20>>2]&31](f,k,19202,1497453121,g)}}else c[m+160>>2]=0;c[m+184>>2]=c[b+536>>2];c[m>>2]=c[b+596>>2];c[m+4>>2]=c[b+600>>2];c[m+8>>2]=c[b+604>>2];c[m+12>>2]=c[b+608>>2];c[m+16>>2]=c[b+612>>2];c[m+20>>2]=c[b+616>>2];c[m+24>>2]=c[b+620>>2];c[m+28>>2]=c[b+624>>2];c[m+32>>2]=c[b+628>>2];c[m+36>>2]=c[b+632>>2];c[m+40>>2]=c[b+636>>2];c[m+44>>2]=c[b+640>>2];c[m+48>>2]=c[b+644>>2];c[m+52>>2]=c[b+648>>2];c[m+56>>2]=c[b+652>>2];c[m+60>>2]=c[b+656>>2];c[m+64>>2]=c[b+660>>2];c[m+68>>2]=c[b+664>>2];c[m+72>>2]=c[b+668>>2];c[m+76>>2]=c[b+672>>2];c[m+80>>2]=c[b+676>>2];c[m+84>>2]=c[b+680>>2];c[m+88>>2]=c[b+684>>2];c[m+92>>2]=c[b+688>>2];x=c[b+564>>2]|0;c[m+172>>2]=x;if(x){x=zb[c[(c[y>>2]|0)+28>>2]&31](f,c[b+572>>2]|0)|0;j=c[m+172>>2]|0;c[m+164>>2]=x;if(!j)z=147;else{k=Bb[c[(c[f>>2]|0)+16>>2]&63](f,4,j)|0;if((j|0)>0){g=c[b+572>>2]|0;h=0;i=c[k+8>>2]|0;while(1){c[i>>2]=c[g+(h<<2)>>2];h=h+1|0;if((h|0)==(j|0))break;else i=i+4|0}}else g=c[b+572>>2]|0;Zb[c[(c[f>>2]|0)+20>>2]&31](f,k,11120,1497453121,g);x=f}}else{c[m+164>>2]=0;z=147}if((z|0)==147)x=f;Zb[c[(c[x>>2]|0)+20>>2]&31](f,n,11126,1497453121,b+532|0);z=c[b+1112>>2]|0;c[e+324>>2]=z;if(z){z=zb[c[(c[y>>2]|0)+28>>2]&31](f,c[c[b+1120>>2]>>2]|0)|0;v=c[e+324>>2]|0;c[e+292>>2]=z;if(v|0){w=Bb[c[(c[f>>2]|0)+16>>2]&63](f,348,v)|0;if((v|0)>0){t=0;u=c[w+8>>2]|0;while(1){h=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;z=u+320|0;c[z>>2]=c[h+360>>2];c[u+256>>2]=c[h+332>>2];c[u+260>>2]=c[h+336>>2];c[u+264>>2]=c[h+340>>2];c[u+268>>2]=c[h+344>>2];c[u+344>>2]=c[h+380>>2];c[u+340>>2]=d[h+377>>0];c[u+160>>2]=c[h+228>>2];c[u+164>>2]=c[h+232>>2];c[u+168>>2]=c[h+236>>2];c[u+172>>2]=c[h+240>>2];c[u+336>>2]=d[h+376>>0];c[u+208>>2]=c[h+276>>2];c[u+212>>2]=c[h+280>>2];c[u+216>>2]=c[h+284>>2];c[u+220>>2]=c[h+288>>2];c[u+224>>2]=c[h+292>>2];c[u+228>>2]=c[h+296>>2];c[u+232>>2]=c[h+300>>2];c[u+236>>2]=c[h+304>>2];h=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;c[u>>2]=c[h+60>>2];c[u+4>>2]=c[h+64>>2];c[u+8>>2]=c[h+68>>2];c[u+12>>2]=c[h+72>>2];c[u+16>>2]=c[h+76>>2];c[u+20>>2]=c[h+80>>2];c[u+24>>2]=c[h+84>>2];c[u+28>>2]=c[h+88>>2];c[u+32>>2]=c[h+92>>2];c[u+36>>2]=c[h+96>>2];c[u+40>>2]=c[h+100>>2];c[u+44>>2]=c[h+104>>2];c[u+48>>2]=c[h+108>>2];c[u+52>>2]=c[h+112>>2];c[u+56>>2]=c[h+116>>2];c[u+60>>2]=c[h+120>>2];c[u+296>>2]=c[h+124>>2];h=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;c[u+300>>2]=c[h+128>>2];c[u+112>>2]=c[h+180>>2];c[u+116>>2]=c[h+184>>2];c[u+120>>2]=c[h+188>>2];c[u+124>>2]=c[h+192>>2];c[u+128>>2]=c[h+196>>2];c[u+132>>2]=c[h+200>>2];c[u+136>>2]=c[h+204>>2];c[u+140>>2]=c[h+208>>2];c[u+144>>2]=c[h+212>>2];c[u+148>>2]=c[h+216>>2];c[u+152>>2]=c[h+220>>2];c[u+156>>2]=c[h+224>>2];g=u+316|0;c[g>>2]=c[h+356>>2];c[u+64>>2]=c[h+132>>2];c[u+68>>2]=c[h+136>>2];c[u+72>>2]=c[h+140>>2];c[u+76>>2]=c[h+144>>2];c[u+80>>2]=c[h+148>>2];c[u+84>>2]=c[h+152>>2];c[u+88>>2]=c[h+156>>2];c[u+92>>2]=c[h+160>>2];c[u+96>>2]=c[h+164>>2];c[u+100>>2]=c[h+168>>2];c[u+104>>2]=c[h+172>>2];c[u+108>>2]=c[h+176>>2];h=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;c[u+240>>2]=c[h+316>>2];c[u+244>>2]=c[h+320>>2];c[u+248>>2]=c[h+324>>2];c[u+252>>2]=c[h+328>>2];c[u+324>>2]=c[h+364>>2];c[u+328>>2]=c[h+368>>2];c[u+312>>2]=c[h+352>>2];c[g>>2]=c[h+356>>2];c[z>>2]=c[h+360>>2];c[u+332>>2]=c[h+372>>2];z=c[h+44>>2]|0;g=u+284|0;c[g>>2]=z;n=u+292|0;c[n>>2]=c[h+4>>2];o=u+288|0;c[o>>2]=c[h+24>>2];c[u+304>>2]=c[h+308>>2];c[u+176>>2]=c[h+244>>2];c[u+180>>2]=c[h+248>>2];c[u+184>>2]=c[h+252>>2];c[u+188>>2]=c[h+256>>2];c[u+192>>2]=c[h+260>>2];c[u+196>>2]=c[h+264>>2];c[u+200>>2]=c[h+268>>2];c[u+204>>2]=c[h+272>>2];h=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;c[u+308>>2]=c[h+312>>2];if(z){z=zb[c[(c[y>>2]|0)+28>>2]&31](f,c[h+52>>2]|0)|0;c[u+272>>2]=z;if(z|0){j=c[g>>2]|0;m=Bb[c[(c[f>>2]|0)+16>>2]&63](f,16,j)|0;if((j|0)>0){g=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;k=c[g+52>>2]|0;h=0;i=c[m+8>>2]|0;while(1){c[i>>2]=c[k+(h<<4)>>2];c[i+4>>2]=c[k+(h<<4)+4>>2];c[i+8>>2]=c[k+(h<<4)+8>>2];c[i+12>>2]=c[k+(h<<4)+12>>2];h=h+1|0;if((h|0)==(j|0))break;else i=i+16|0}}else g=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;Zb[c[(c[x>>2]|0)+20>>2]&31](f,m,19202,1497453121,c[g+52>>2]|0)}}else c[u+272>>2]=0;if(c[n>>2]|0){z=zb[c[(c[y>>2]|0)+28>>2]&31](f,c[(c[(c[b+1120>>2]|0)+(t<<2)>>2]|0)+12>>2]|0)|0;c[u+280>>2]=z;if(z|0){j=c[n>>2]|0;m=Bb[c[(c[f>>2]|0)+16>>2]&63](f,4,j)|0;if((j|0)>0){g=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;k=c[g+12>>2]|0;h=0;i=c[m+8>>2]|0;while(1){c[i>>2]=c[k+(h<<2)>>2];h=h+1|0;if((h|0)==(j|0))break;else i=i+4|0}}else g=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;Zb[c[(c[x>>2]|0)+20>>2]&31](f,m,11120,1497453121,c[g+12>>2]|0)}}else c[u+280>>2]=0;if(c[o>>2]|0){z=zb[c[(c[y>>2]|0)+28>>2]&31](f,(c[(c[b+1120>>2]|0)+(t<<2)>>2]|0)+20|0)|0;c[u+276>>2]=z;if(z|0){m=c[n>>2]|0;s=Bb[c[(c[f>>2]|0)+16>>2]&63](f,4,m)|0;if((m|0)>0){g=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;n=c[g+32>>2]|0;o=c[A+12>>2]|0;p=c[A+72>>2]|0;q=c[A+52>>2]|0;r=c[A+32>>2]|0;j=0;k=c[s+8>>2]|0;while(1){i=c[n+(j<<2)>>2]|0;h=((i+~(i<<15)|0)>>>10^i+~(i<<15))*9|0;h=c[o+(((((h>>>6^h)+~((h>>>6^h)<<11)|0)>>>16^(h>>>6^h)+~((h>>>6^h)<<11))&(c[A+48>>2]|0)+-1)<<2)>>2]|0;if((i|0)!=(c[p+(h<<3)>>2]|0))do h=c[r+(h<<2)>>2]|0;while((i|0)!=(c[p+(h<<3)>>2]|0));c[k>>2]=c[q+(h<<2)>>2];j=j+1|0;if((j|0)==(m|0))break;else k=k+4|0}}else g=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;Zb[c[(c[x>>2]|0)+20>>2]&31](f,s,11163,1497453121,g+20|0)}}else c[u+276>>2]=0;t=t+1|0;if((t|0)>=(v|0))break;else u=u+348|0}}Zb[c[(c[x>>2]|0)+20>>2]&31](f,w,11143,1497453121,c[c[b+1120>>2]>>2]|0)}}else c[e+292>>2]=0;z=c[b+912>>2]|0;c[e+328>>2]=z;if(!z){c[e+296>>2]=0;kj(A);l=A;return 11187}z=zb[c[(c[y>>2]|0)+28>>2]&31](f,c[b+920>>2]|0)|0;c[e+296>>2]=z;if(!z){kj(A);l=A;return 11187}k=c[b+912>>2]|0;m=Bb[c[(c[f>>2]|0)+16>>2]&63](f,104,k)|0;if((k|0)>0){i=0;j=c[m+8>>2]|0;while(1){g=c[(c[b+920>>2]|0)+(i<<2)>>2]|0;c[j+96>>2]=xb[c[(c[g>>2]|0)+20>>2]&127](g)|0;g=(c[b+920>>2]|0)+(i<<2)|0;h=c[g>>2]|0;c[j+8>>2]=c[h+28>>2];c[j+12>>2]=c[h+32>>2];c[j+16>>2]=c[h+36>>2];c[j+20>>2]=c[h+40>>2];c[j+24>>2]=c[h+44>>2];c[j+28>>2]=c[h+48>>2];c[j+32>>2]=c[h+52>>2];c[j+36>>2]=c[h+56>>2];c[j+40>>2]=c[h+60>>2];c[j+44>>2]=c[h+64>>2];c[j+48>>2]=c[h+68>>2];c[j+52>>2]=d[h+152>>0];h=j+56|0;c[j>>2]=0;n=j+4|0;c[n>>2]=0;c[h>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;c[h+16>>2]=0;c[h+20>>2]=0;c[h+24>>2]=0;c[h+28>>2]=0;g=c[g>>2]|0;h=c[g+4>>2]|0;if(h){c[j+88>>2]=1;c[j>>2]=zb[c[(c[y>>2]|0)+28>>2]&31](f,h)|0;g=c[(c[b+920>>2]|0)+(i<<2)>>2]|0}if(c[g+12>>2]|0){c[j+88>>2]=3;c[j>>2]=zb[c[(c[y>>2]|0)+28>>2]&31](f,c[(c[(c[b+920>>2]|0)+(i<<2)>>2]|0)+12>>2]|0)|0}g=c[(c[b+920>>2]|0)+(i<<2)>>2]|0;h=c[g+8>>2]|0;if(h){c[j+88>>2]=2;c[j>>2]=zb[c[(c[y>>2]|0)+28>>2]&31](f,h)|0;g=c[(c[b+920>>2]|0)+(i<<2)>>2]|0}h=c[g+16>>2]|0;if(h){c[j+92>>2]=1;c[n>>2]=zb[c[(c[y>>2]|0)+28>>2]&31](f,h)|0;g=c[(c[b+920>>2]|0)+(i<<2)>>2]|0}h=c[g+24>>2]|0;if(h){c[j+92>>2]=3;c[n>>2]=zb[c[(c[y>>2]|0)+28>>2]&31](f,h)|0;g=c[(c[b+920>>2]|0)+(i<<2)>>2]|0}g=c[g+20>>2]|0;if(g|0){c[j+92>>2]=2;c[n>>2]=zb[c[(c[y>>2]|0)+28>>2]&31](f,g)|0}i=i+1|0;if((i|0)>=(k|0))break;else j=j+104|0}}Zb[c[(c[x>>2]|0)+20>>2]&31](f,m,11167,1497453121,c[b+920>>2]|0);kj(A);l=A;return 11187}function mc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=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,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;K=l;l=l+144|0;switch(d-b|0){case 0:{c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;l=K;return}case 2:{m=c[(c[a+92>>2]|0)+(b<<2)>>2]|0;b=c[m+88>>2]|0;d=c[m+200>>2]|0;g=c[m+92>>2]|0;f=c[m+204>>2]|0;if((b|0)==(d|0)&(g|0)==(f|0))if((c[m+96>>2]|0)==(c[m+208>>2]|0)){c[m+8>>2]=0;c[m>>2]=m;c[m+4>>2]=m;c[e>>2]=m;c[e+4>>2]=m;c[e+8>>2]=m;c[e+12>>2]=m;l=K;return}else f=g;f=g-f|0;if(!(f|b-d)){h=(c[m+96>>2]|0)>(c[m+208>>2]|0);f=h?m+112|0:m;c[f>>2]=f;c[f+4>>2]=f;g=f;h=h?m:m+112|0;i=f;j=f;k=f}else{c[m>>2]=m+112;c[m+4>>2]=m+112;c[m+112>>2]=m;c[m+116>>2]=m;j=(b-d|0)<0|(b-d|0)==0&(f|0)<0;g=m;h=m+112|0;i=j?m+112|0:m;j=j?m:m+112|0;k=(f|0)<0|(b-d|0)<0&(f|0)==0?m:m+112|0;f=(f|0)<0|(b-d|0)<0&(f|0)==0?m+112|0:m}c[e>>2]=j;c[e+4>>2]=i;c[e+8>>2]=k;c[e+12>>2]=f;a=hg(a,g,h)|0;c[a>>2]=a;c[a+4>>2]=a;c[g+8>>2]=a;a=c[a+8>>2]|0;c[a>>2]=a;c[a+4>>2]=a;c[h+8>>2]=a;l=K;return}case 1:{a=c[(c[a+92>>2]|0)+(b<<2)>>2]|0;c[a+8>>2]=0;c[a>>2]=a;c[a+4>>2]=a;c[e>>2]=a;c[e+4>>2]=a;c[e+8>>2]=a;c[e+12>>2]=a;l=K;return}default:{n=((d-b|0)/2|0)+b|0;m=c[a+92>>2]|0;k=c[m+(n+-1<<2)>>2]|0;i=c[k+88>>2]|0;j=c[k+92>>2]|0;k=c[k+96>>2]|0;a:do if((n|0)<(d|0)){f=n;do{g=c[m+(f<<2)>>2]|0;if((c[g+88>>2]|0)!=(i|0))break a;if((c[g+92>>2]|0)!=(j|0))break a;if((c[g+96>>2]|0)!=(k|0))break a;f=f+1|0}while((f|0)<(d|0))}else f=n;while(0);mc(a,b,n,e);c[K+96>>2]=0;c[K+96+4>>2]=0;c[K+96+8>>2]=0;c[K+96+12>>2]=0;mc(a,f,d,K+96|0);k=c[K+96+4>>2]|0;b:do if(k|0){B=c[e+4>>2]|0;if(!B){c[e>>2]=c[K+96>>2];c[e+4>>2]=c[K+96+4>>2];c[e+8>>2]=c[K+96+8>>2];c[e+12>>2]=c[K+96+12>>2];break}c[a+100>>2]=(c[a+100>>2]|0)+-1;i=c[e+12>>2]|0;j=c[K+96+8>>2]|0;g=c[i+88>>2]|0;do if((g|0)==(c[j+88>>2]|0)?(h=c[i+92>>2]|0,(h|0)==(c[j+92>>2]|0)):0){f=c[j+4>>2]|0;if((f|0)==(j|0)){f=c[j+8>>2]|0;if(!f)f=g;else{h=c[f+12>>2]|0;j=h;f=c[h+88>>2]|0;h=c[h+92>>2]|0}b=j;n=f+1|0;g=i;o=c[j+96>>2]|0;break}i=c[j>>2]|0;c[f>>2]=i;c[i+4>>2]=f;if((j|0)==(c[K+96>>2]|0)){g=c[i+88>>2]|0;h=c[f+88>>2]|0;do if((g|0)<(h|0))g=i;else{if((g|0)==(h|0)?(c[i+92>>2]|0)<(c[f+92>>2]|0):0){g=i;break}g=f}while(0);c[K+96>>2]=g}if((j|0)==(k|0)){g=c[i+88>>2]|0;h=c[f+88>>2]|0;do if((g|0)>(h|0))f=i;else if((g|0)==(h|0)?(c[i+92>>2]|0)>(c[f+92>>2]|0):0){f=i;break}while(0);c[K+96+4>>2]=f;H=36}else{f=k;H=36}}else{f=k;H=36}while(0);if((H|0)==36){y=c[e>>2]|0;z=c[K+96>>2]|0;d=B;h=0;j=0;w=1;x=0;o=f;while(1){m=c[o+88>>2]|0;n=c[d+88>>2]|0;i=P(m-n|0,w)|0;c:do if((i|0)<=0){if((i|0)<0){v=(x|0)!=0;k=d;g=o;b=c[d+92>>2]|0;u=c[o+92>>2]|0;while(1){r=c[(v?g+4|0:g)>>2]|0;s=(r|0)==(g|0);t=g+88|0;while(1){d=k+88|0;p=u-b|0;if(!s?(C=c[r+88>>2]|0,D=P(C-m|0,w)|0,E=c[r+92>>2]|0,F=E-u|0,(F|0)>-1):0){if(!D)break;if((D|0)<0?(P(F,i)|0)<=(P(D,p)|0):0)break}q=c[(v?k+4|0:k)>>2]|0;if((q|0)==(k|0))break c;G=c[q+88>>2]|0;n=P(G-(c[d>>2]|0)|0,w)|0;o=c[q+92>>2]|0;d=o-b|0;m=c[t>>2]|0;b=i;i=P(m-G|0,w)|0;if(!((d|0)>0&(i|0)<0))break c;if(!n){k=q;b=o;continue}if((n|0)>=0)break c;if((P(d,b)|0)>=(P(n,p)|0))break c;else{k=q;b=o}}g=r;i=P(C-(c[d>>2]|0)|0,w)|0;u=E;m=C}}g=c[d+92>>2]|0;b=(x|0)!=0;d:do if(b){k=d;while(1){i=c[k>>2]|0;if((i|0)==(d|0)){m=k;break d}if((c[i+88>>2]|0)!=(n|0)){m=k;break d}G=g;g=c[i+92>>2]|0;if((g|0)>(G|0)){m=k;break}else k=i}}else{k=d;while(1){i=c[k+4>>2]|0;if((i|0)==(d|0)){m=k;break d}if((c[i+88>>2]|0)!=(n|0)){m=k;break d}G=g;g=c[i+92>>2]|0;if((g|0)>(G|0)){m=k;break}else k=i}}while(0);i=c[o+92>>2]|0;if(b){g=o;while(1){k=c[g+4>>2]|0;if((k|0)==(o|0)){k=m;break c}if((c[k+88>>2]|0)!=(n|0)){k=m;break c}G=i;i=c[k+92>>2]|0;if((i|0)<(G|0)){k=m;break}else g=k}}else{g=o;while(1){k=c[g>>2]|0;if((k|0)==(o|0)){k=m;break c}if((c[k+88>>2]|0)!=(n|0)){k=m;break c}G=i;i=c[k+92>>2]|0;if((i|0)<(G|0)){k=m;break}else g=k}}}else{u=(x|0)!=0;k=d;g=o;t=n;s=c[o+92>>2]|0;while(1){r=g+88|0;b=c[k+92>>2]|0;d=s-b|0;m=c[(u?k:k+4|0)>>2]|0;e:do if((m|0)!=(k|0))if(u){p=i;q=m;o=t;n=b;while(1){m=o;o=c[q+88>>2]|0;m=P(o-m|0,w)|0;b=n;n=c[q+92>>2]|0;b=n-b|0;if((b|0)>=1)break e;if(m|0){if((m|0)>=0)break e;if((P(b,p)|0)>(P(m,d)|0))break e}k=P((c[r>>2]|0)-o|0,w)|0;d=s-n|0;m=c[q>>2]|0;if((m|0)==(q|0)){p=k;k=q;break}else{G=q;p=k;q=m;k=G}}}else{p=i;q=m;o=t;n=b;while(1){m=o;o=c[q+88>>2]|0;m=P(o-m|0,w)|0;b=n;n=c[q+92>>2]|0;b=n-b|0;if((b|0)>=1)break e;if(m|0){if((m|0)>=0)break e;if((P(b,p)|0)>(P(m,d)|0))break e}k=P((c[r>>2]|0)-o|0,w)|0;d=s-n|0;m=c[q+4>>2]|0;if((m|0)==(q|0)){p=k;k=q;break}else{G=q;p=k;q=m;k=G}}}else p=i;while(0);n=c[(u?g:g+4|0)>>2]|0;if((n|0)==(g|0))break c;i=c[n+88>>2]|0;m=P(i-(c[r>>2]|0)|0,w)|0;b=s;s=c[n+92>>2]|0;b=s-b|0;t=c[k+88>>2]|0;i=P(i-t|0,w)|0;if(!((b|0)<0&(i|0)>0))break c;if(!m){g=n;continue}if((m|0)>=0)break c;if((P(b,p)|0)>=(P(m,d)|0))break;else g=n}}while(0);i=(x|0)==0;j=i?g:j;h=i?k:h;o=i?z:g;d=i?y:k;x=x+1|0;if((x|0)==2)break;else w=i?-1:w}c[d+4>>2]=o;c[o>>2]=d;c[h>>2]=j;c[j+4>>2]=h;if((c[z+88>>2]|0)<(c[y+88>>2]|0))c[e>>2]=z;if((c[f+88>>2]|0)>=(c[B+88>>2]|0))c[e+4>>2]=f;c[e+12>>2]=c[K+96+12>>2];g=h;F=j;s=c[j+88>>2]|0;n=c[h+88>>2]|0;t=c[j+92>>2]|0;u=c[h+92>>2]|0;v=c[j+96>>2]|0;o=c[h+96>>2]|0;w=((t-u|0)<0)<<31>>31;x=0-(s-n)|0;y=sw(0,0,x|0,((x|0)<0)<<31>>31|0)|0;y=ct(v-o|0,((v-o|0)<0)<<31>>31|0,y|0,A|0)|0;z=A;B=ct(v-o|0,((v-o|0)<0)<<31>>31|0,t-u|0,w|0)|0;C=A;p=ct(s-n|0,((s-n|0)<0)<<31>>31|0,x|0,((x|0)<0)<<31>>31|0)|0;E=A;D=ct(t-u|0,w|0,t-u|0,w|0)|0;D=sw(p|0,E|0,D|0,A|0)|0;E=A;p=c[h+8>>2]|0;c[K+120>>2]=0;if(!p)p=0;else{q=sw(0,0,t-u|0,w|0)|0;r=A;d=p;f=0;do{m=c[d+12>>2]|0;i=c[m+88>>2]|0;k=c[m+92>>2]|0;m=c[m+96>>2]|0;b=ct(k-u|0,((k-u|0)<0)<<31>>31|0,x|0,((x|0)<0)<<31>>31|0)|0;G=A;e=ct(i-n|0,((i-n|0)<0)<<31>>31|0,q|0,r|0)|0;f:do if((b|0)==(e|0)&(G|0)==(A|0)?(e=ct(i-n|0,((i-n|0)<0)<<31>>31|0,y|0,z|0)|0,b=A,G=ct(k-u|0,((k-u|0)<0)<<31>>31|0,B|0,C|0)|0,b=Ow(G|0,A|0,e|0,b|0)|0,e=A,G=ct(m-o|0,((m-o|0)<0)<<31>>31|0,D|0,E|0)|0,G=Ow(b|0,e|0,G|0,A|0)|0,e=A,(e|0)>0|(e|0)==0&G>>>0>0):0){do if(f|0){b=(c[f+4>>2]|0)==(d|0);if((c[f>>2]|0)!=(d|0))if(b)break;else break f;if(!b)break f;e=c[f+12>>2]|0;L=c[(c[d+8>>2]|0)+12>>2]|0;G=c[L+88>>2]|0;b=c[L+92>>2]|0;L=c[L+96>>2]|0;M=(c[e+96>>2]|0)-L|0;b=(P(m-L|0,(c[e+92>>2]|0)-b|0)|0)-(P(M,k-b|0)|0)|0;G=(P(M,i-G|0)|0)-(P(m-L|0,(c[e+88>>2]|0)-G|0)|0)|0;b=ct(b|0,((b|0)<0)<<31>>31|0,t-u|0,w|0)|0;e=A;G=ct(G|0,((G|0)<0)<<31>>31|0,x|0,((x|0)<0)<<31>>31|0)|0;G=Ow(b|0,e|0,G|0,A|0)|0;e=A;if((e|0)>0|(e|0)==0&G>>>0>0)break f}while(0);f=d}while(0);d=c[d>>2]|0}while((d|0)!=(p|0));c[K+120>>2]=f;p=f}d=c[j+8>>2]|0;c[K+72>>2]=0;if(!d)f=0;else{n=sw(0,0,t-u|0,w|0)|0;o=A;b=d;f=0;do{m=c[b+12>>2]|0;i=c[m+88>>2]|0;k=c[m+92>>2]|0;m=c[m+96>>2]|0;G=ct(k-t|0,((k-t|0)<0)<<31>>31|0,x|0,((x|0)<0)<<31>>31|0)|0;M=A;L=ct(i-s|0,((i-s|0)<0)<<31>>31|0,n|0,o|0)|0;do if((G|0)==(L|0)&(M|0)==(A|0)?(L=ct(i-s|0,((i-s|0)<0)<<31>>31|0,y|0,z|0)|0,G=A,M=ct(k-t|0,((k-t|0)<0)<<31>>31|0,B|0,C|0)|0,G=Ow(M|0,A|0,L|0,G|0)|0,L=A,M=ct(m-v|0,((m-v|0)<0)<<31>>31|0,D|0,E|0)|0,M=Ow(G|0,L|0,M|0,A|0)|0,L=A,(L|0)>0|(L|0)==0&M>>>0>0):0){if(f|0){if((c[f>>2]|0)!=(b|0))break;if((c[f+4>>2]|0)==(b|0)?(L=c[f+12>>2]|0,e=c[(c[b+8>>2]|0)+12>>2]|0,M=c[e+88>>2]|0,G=c[e+92>>2]|0,e=c[e+96>>2]|0,r=(c[L+96>>2]|0)-e|0,G=(P(m-e|0,(c[L+92>>2]|0)-G|0)|0)-(P(r,k-G|0)|0)|0,M=(P(r,i-M|0)|0)-(P(m-e|0,(c[L+88>>2]|0)-M|0)|0)|0,G=ct(G|0,((G|0)<0)<<31>>31|0,t-u|0,w|0)|0,L=A,M=ct(M|0,((M|0)<0)<<31>>31|0,x|0,((x|0)<0)<<31>>31|0)|0,M=Ow(G|0,L|0,M|0,A|0)|0,L=A,!((L|0)>0|(L|0)==0&M>>>0>0)):0)break}f=b}while(0);b=c[b>>2]|0}while((b|0)!=(d|0));c[K+72>>2]=f}if((p|0)!=0|(f|0)!=0){rc(a,h,j,K+120|0,K+72|0);f=c[K+120>>2]|0;if(f){h=c[f+12>>2]|0;g=h}f=c[K+72>>2]|0;if(!f){f=F;i=h}else{j=c[f+12>>2]|0;f=j;i=h}}else{f=F;i=h}b=f;n=c[j+88>>2]|0;o=(c[j+96>>2]|0)+1|0;h=c[j+92>>2]|0}f=0;e=0;k=0;z=0;G=1;D=0;m=0;d=0;B=0;F=b;C=o;x=j;w=i;while(1){y=c[w+88>>2]|0;u=(c[x+88>>2]|0)-y|0;M=c[w+92>>2]|0;E=(c[x+92>>2]|0)-M|0;t=c[w+96>>2]|0;r=(c[x+96>>2]|0)-t|0;c[K+120>>2]=u;c[K+120+4>>2]=E;c[K+120+8>>2]=r;c[K+120+12>>2]=-1;y=n-y|0;M=h-M|0;t=C-t|0;s=(P(r,M)|0)-(P(E,t)|0)|0;t=(P(u,t)|0)-(P(r,y)|0)|0;M=(P(E,y)|0)-(P(u,M)|0)|0;c[K+72>>2]=s;c[K+72+4>>2]=((s|0)<0)<<31>>31;c[K+72+8>>2]=t;c[K+72+8+4>>2]=((t|0)<0)<<31>>31;c[K+72+16>>2]=M;c[K+72+16+4>>2]=((M|0)<0)<<31>>31;y=ct(E|0,((E|0)<0)<<31>>31|0,M|0,((M|0)<0)<<31>>31|0)|0;L=A;v=ct(r|0,((r|0)<0)<<31>>31|0,t|0,((t|0)<0)<<31>>31|0)|0;v=sw(y|0,L|0,v|0,A|0)|0;L=A;r=ct(s|0,((s|0)<0)<<31>>31|0,r|0,((r|0)<0)<<31>>31|0)|0;y=A;M=ct(u|0,((u|0)<0)<<31>>31|0,M|0,((M|0)<0)<<31>>31|0)|0;M=sw(r|0,y|0,M|0,A|0)|0;y=A;t=ct(u|0,((u|0)<0)<<31>>31|0,t|0,((t|0)<0)<<31>>31|0)|0;u=A;E=ct(s|0,((s|0)<0)<<31>>31|0,E|0,((E|0)<0)<<31>>31|0)|0;E=sw(t|0,u|0,E|0,A|0)|0;c[K+48>>2]=v;c[K+48+4>>2]=L;c[K+48+8>>2]=M;c[K+48+8+4>>2]=y;c[K+48+16>>2]=E;c[K+48+16+4>>2]=A;c[K+24>>2]=0;c[K+24+4>>2]=0;c[K+24+8>>2]=0;c[K+24+12>>2]=0;c[K+24+16>>2]=0;E=Fd(a,0,w,K+120|0,K+72|0,K+48|0,K+24|0)|0;c[K>>2]=0;c[K+4>>2]=0;c[K+8>>2]=0;c[K+12>>2]=0;c[K+16>>2]=0;y=Fd(a,1,x,K+120|0,K+72|0,K+48|0,K)|0;do if((E|0)!=0|(y|0)!=0){b=E|0?-1:1;do if((E|0)!=0&(y|0)!=0){v=c[K+24+16>>2]|0;b=c[K+16>>2]|0;if((v|0)!=(b|0)){u=v-b|0;break}if(!v)u=0;else{M=c[K+24>>2]|0;t=c[K+24+4>>2]|0;p=c[K+8>>2]|0;N=c[K+8+4>>2]|0;o=ct(p|0,0,M|0,0)|0;b=A;M=ct(N|0,0,M|0,0)|0;L=A;p=ct(p|0,0,t|0,0)|0;q=A;t=ct(N|0,0,t|0,0)|0;N=A;p=Ow(M|0,0,p|0,0)|0;M=A;N=Ow(L|0,0,t|0,N|0)|0;q=Ow(N|0,A|0,q|0,0)|0;M=Ow(q|0,A|0,M|0,0)|0;q=A;b=Ow(0,p|0,o|0,b|0)|0;o=A;p=Ow(M|0,q|0,(o>>>0

    >>0|(o|0)==(p|0)&b>>>0<0)&1|0,0)|0;q=A;M=c[K+24+8>>2]|0;N=c[K+24+8+4>>2]|0;t=c[K>>2]|0;L=c[K+4>>2]|0;s=ct(t|0,0,M|0,0)|0;r=A;M=ct(L|0,0,M|0,0)|0;O=A;t=ct(t|0,0,N|0,0)|0;u=A;N=ct(L|0,0,N|0,0)|0;L=A;t=Ow(M|0,0,t|0,0)|0;M=A;L=Ow(O|0,0,N|0,L|0)|0;u=Ow(L|0,A|0,u|0,0)|0;M=Ow(u|0,A|0,M|0,0)|0;u=A;r=Ow(0,t|0,s|0,r|0)|0;s=A;t=Ow(M|0,u|0,(s>>>0>>0|(s|0)==(t|0)&r>>>0<0)&1|0,0)|0;u=A;if(q>>>0>>0|(q|0)==(u|0)&p>>>0>>0)b=-1;else b=q>>>0>u>>>0|(q|0)==(u|0)&p>>>0>t>>>0?1:o>>>0>>0|(o|0)==(s|0)&b>>>0>>0?-1:(o>>>0>s>>>0|(o|0)==(s|0)&b>>>0>r>>>0)&1;u=P(b,v)|0}}else u=b;while(0);do if(!G)if((u|0)>-1)if((c[K+16>>2]|0)<0&((c[K+8>>2]|0)==0?(c[K+8+4>>2]|0)==0:0)){o=z;s=B;break}else{H=133;break}else if((c[K+24+16>>2]|0)<0&((c[K+24+8>>2]|0)==0?(c[K+24+8+4>>2]|0)==0:0)){o=z;s=B;break}else{H=133;break}else H=133;while(0);if((H|0)==133){H=0;o=hg(a,w,x)|0;if(!z)k=o;else c[z+4>>2]=o;c[o>>2]=z;b=c[o+8>>2]|0;if(!B)d=b;else c[B>>2]=b;c[b+4>>2]=B;s=b}c[K+116>>2]=E;c[K+112>>2]=y;if(!u){rc(a,g,F,K+116|0,K+112|0);b=c[K+112>>2]|0}else b=y;if((u|0)>-1&(b|0)!=0){q=(D|0)!=0;if(q?(I=c[D>>2]|0,(I|0)!=(y|0)):0){n=I;do{p=n;n=c[n>>2]|0;r=c[p+8>>2]|0;if((n|0)==(p|0))h=0;else{c[n+4>>2]=c[p+4>>2];c[c[p+4>>2]>>2]=n;h=n}c[(c[r+12>>2]|0)+8>>2]=h;h=c[r>>2]|0;if((h|0)==(r|0))h=0;else{c[h+4>>2]=c[r+4>>2];c[c[r+4>>2]>>2]=h}c[(c[p+12>>2]|0)+8>>2]=h;c[p+4>>2]=0;c[p+4+4>>2]=0;c[p+4+8>>2]=0;c[p+4+12>>2]=0;c[p>>2]=c[a+56>>2];c[a+56>>2]=p;c[r+4>>2]=0;c[r+4+4>>2]=0;c[r+4+8>>2]=0;c[r+4+12>>2]=0;c[r>>2]=c[a+56>>2];c[a+56>>2]=r;c[a+116>>2]=(c[a+116>>2]|0)+-1}while((n|0)!=(y|0))}if(!s){m=q?m:y;h=d}else{if(q)h=D;else{m=d;h=c[y+4>>2]|0}c[h>>2]=d;c[d+4>>2]=h;c[s>>2]=y;c[y+4>>2]=s;h=0;b=c[K+112>>2]|0}O=F;t=c[b+8>>2]|0;s=0;B=h;z=c[b+12>>2]|0;n=c[O+88>>2]|0;d=c[O+96>>2]|0;h=c[O+92>>2]|0}else{t=D;B=d;z=F;d=C}b=c[K+116>>2]|0;if((u|0)<1&(b|0)!=0){p=(f|0)!=0;if(p?(J=c[f+4>>2]|0,(J|0)!=(E|0)):0){d=J;do{q=d+4|0;n=d;d=c[q>>2]|0;h=c[n>>2]|0;r=c[n+8>>2]|0;if((h|0)==(n|0))h=0;else{c[h+4>>2]=d;c[c[q>>2]>>2]=h}c[(c[r+12>>2]|0)+8>>2]=h;h=c[r>>2]|0;if((h|0)==(r|0))h=0;else{c[h+4>>2]=c[r+4>>2];c[c[r+4>>2]>>2]=h}c[(c[n+12>>2]|0)+8>>2]=h;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[n>>2]=c[a+56>>2];c[a+56>>2]=n;c[r+4>>2]=0;c[r+4+4>>2]=0;c[r+4+8>>2]=0;c[r+4+12>>2]=0;c[r>>2]=c[a+56>>2];c[a+56>>2]=r;c[a+116>>2]=(c[a+116>>2]|0)+-1}while((d|0)!=(E|0))}if(!o)h=p?e:E;else{if(p)h=e;else{h=k;f=c[E>>2]|0}c[k>>2]=f;c[f+4>>2]=k;c[E>>2]=o;c[o+4>>2]=E;k=0;b=c[K+116>>2]|0}O=g;f=c[b+8>>2]|0;r=h;w=0;y=c[O+88>>2]|0;g=c[b+12>>2]|0;x=c[O+96>>2]|0;h=c[O+92>>2]|0}else{r=e;w=o;y=n;x=d}if((g|0)==(i|0)&(z|0)==(j|0)){if(f){q=f+4|0;b=c[q>>2]|0;if((b|0)!=(r|0))do{o=b+4|0;n=b;b=c[o>>2]|0;d=c[n>>2]|0;p=c[n+8>>2]|0;if((d|0)==(n|0))d=0;else{c[d+4>>2]=b;c[c[o>>2]>>2]=d}c[(c[p+12>>2]|0)+8>>2]=d;d=c[p>>2]|0;if((d|0)==(p|0))d=0;else{c[d+4>>2]=c[p+4>>2];c[c[p+4>>2]>>2]=d}c[(c[n+12>>2]|0)+8>>2]=d;c[o>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;c[n>>2]=c[a+56>>2];c[a+56>>2]=n;c[p+4>>2]=0;c[p+4+4>>2]=0;c[p+4+8>>2]=0;c[p+4+12>>2]=0;c[p>>2]=c[a+56>>2];c[a+56>>2]=p;c[a+116>>2]=(c[a+116>>2]|0)+-1}while((b|0)!=(r|0));if(w|0){c[k>>2]=f;c[q>>2]=k;c[r>>2]=w;c[w+4>>2]=r}}else{c[k>>2]=w;c[w+4>>2]=k;c[g+8>>2]=w}if(!t){c[s>>2]=B;c[B+4>>2]=s;c[j+8>>2]=s;v=0;u=G;t=0;q=w;d=B;p=z;n=y;o=g;b=x;break}b=c[t>>2]|0;if((b|0)!=(m|0))do{n=b;b=c[b>>2]|0;o=c[n+8>>2]|0;if((b|0)==(n|0))d=0;else{c[b+4>>2]=c[n+4>>2];c[c[n+4>>2]>>2]=b;d=b}c[(c[o+12>>2]|0)+8>>2]=d;d=c[o>>2]|0;if((d|0)==(o|0))d=0;else{c[d+4>>2]=c[o+4>>2];c[c[o+4>>2]>>2]=d}c[(c[n+12>>2]|0)+8>>2]=d;c[n+4>>2]=0;c[n+4+4>>2]=0;c[n+4+8>>2]=0;c[n+4+12>>2]=0;c[n>>2]=c[a+56>>2];c[a+56>>2]=n;c[o+4>>2]=0;c[o+4+4>>2]=0;c[o+4+8>>2]=0;c[o+4+12>>2]=0;c[o>>2]=c[a+56>>2];c[a+56>>2]=o;c[a+116>>2]=(c[a+116>>2]|0)+-1}while((b|0)!=(m|0));if(!s){v=0;u=G;q=w;s=0;d=B;p=z;n=y;o=g;b=x}else{c[t>>2]=B;c[B+4>>2]=t;c[s>>2]=m;c[m+4>>2]=s;v=0;u=G;q=w;d=B;p=z;n=y;o=g;b=x}}else{v=1;u=0;q=w;d=B;p=z;n=y;o=g;b=x}}else{v=hg(a,w,x)|0;c[v>>2]=v;c[v+4>>2]=v;c[w+8>>2]=v;v=c[v+8>>2]|0;c[v>>2]=v;c[v+4>>2]=v;c[x+8>>2]=v;v=0;u=G;t=D;r=e;q=z;s=B;p=F;o=g;b=C}while(0);if(!v)break b;e=r;z=q;G=u;D=t;B=s;F=p;g=o;C=b;x=p;w=o}}while(0);l=K;return}}} + +// EMSCRIPTEN_END_FUNCS +var nb=[fJ,ip,UG,HG,HG,LG,$D,Mq,Lq,Mq,fJ,fJ,fJ,fJ,fJ,fJ];var ob=[KI,bx];var pb=[FD,fk,fk,FD];var qb=[DH,Dj,gk,vi,Bv,$k,Ao,$j,Xm,_m,Qh,Tm,lm,ym,Ig,Ng,Gg,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH,DH];var rb=[eB,tk,tk,eB];var sb=[CF,Vc];var tb=[ZC,Yu,ie,Yu,Yu,je,Yu,Yu,yf,uf,bu,Yu,Yu,ZC,ZC,ZC];var ub=[ix,oq];var vb=[Zv,qc,Vk,Zv];var wb=[bv,Nm,qd,bv];var xb=[eJ,HI,jI,hF,DE,DE,fG,BH,II,HI,Nr,VH,EI,XG,LH,YG,HI,xH,qI,II,oI,oI,jI,cG,KE,UE,PH,vH,II,oF,YG,XF,LF,wF,_G,PF,wG,sG,jG,JG,xG,jI,Cz,Vs,vF,KG,xF,Fv,cG,cG,yH,tI,jH,GI,AH,BI,CI,zI,sE,ZH,AH,cI,aI,fI,YG,iI,ZG,bG,bG,HI,wI,AH,vI,uI,zD,SH,HI,HI,HI,JI,DI,xI,EI,DI,_G,iG,RH,sI,AH,nI,mI,aF,nD,aG,VF,VF,fG,fG,OI,HI,jI,fG,fG,OI,DE,HI,WF,WF,fG,Ot,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ,eJ];var yb=[YF,Di];var zb=[AI,ds,gs,es,Fo,oG,oG,dc,tz,tz,Pd,wn,sy,bo,Ct,tl,fr,op,Pk,yi,Io,dr,AI,AI,AI,AI,AI,AI,AI,AI,AI,AI];var Ab=[KH,Kh,hE,hE,bn,KH,KH,KH];var Bb=[wH,Wn,Fi,xk,lc,vo,gl,sg,yd,fi,fh,Cf,vn,Sh,Jh,Hf,nq,bf,tg,hm,Wq,ek,Mf,Qk,xg,hl,Oh,Ok,Ie,Mk,Ed,EC,EC,pf,Yj,Sg,Jg,ti,To,ql,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH,wH];var Cb=[zF,sn,zp,Uo,sk,qk,Vh,Ll,Il,Mo,wg,Ho,Rp,Ym,Zl,Rl,Si,jl,Qc,cw,Gx,Ef,zF,zF,zF,zF,zF,zF,zF,zF,zF,zF];var Db=[VC,Jl];var Eb=[GA,fd,Ad,Wd];var Fb=[gx,ld,Yf,gx];var Gb=[_u,Rc,oh,_u];var Hb=[lJ,UI,pk,gu];var Ib=[jJ,ZI,aJ,ZI,aJ,ZI,aJ,ZI,aJ,ZI,aJ,ZI,aJ,ZI,nH,ZI,aJ,ZI,aJ,ZI,aJ,ZI,aJ,Lp,Vq,no,Jj,gz,ZI,aJ,aJ,aJ,aJ,rd,pw,ZI,aJ,ZI,aJ,aJ,ZI,Ey,aJ,aJ,ZI,Ey,aJ,aJ,ZI,aJ,lz,Sx,ZI,aJ,ZI,aJ,mq,Mp,Qi,vC,bk,Vu,Wm,zu,fc,Bn,qh,Pn,Df,Ml,ZI,aJ,ZI,aJ,zl,$l,Qg,av,ci,aJ,kk,ZB,IH,Yv,ZI,IH,Yv,ZI,Yv,Td,mn,Yv,Yv,Le,Yv,Yv,qe,Yv,Oc,Tf,St,WE,pi,pF,aJ,up,Do,aJ,ZI,aJ,Jp,No,wl,_l,rk,Wu,Qp,_q,ZI,aJ,nf,lB,aJ,aJ,aJ,aJ,aJ,aJ,aJ,aJ,aJ,aJ,mk,HC,cr,Xp,Np,Qo,aJ,rq,jp,ir,_p,ZI,aJ,Oj,rF,Dd,aJ,aJ,aJ,aJ,aJ,ZI,aJ,ZI,oH,aJ,aJ,aJ,aJ,aJ,aJ,aJ,Yq,Vp,ZI,aJ,Hk,pD,aJ,aJ,aJ,Gi,IB,aJ,cj,iA,aJ,qm,Hv,ej,Ey,Ey,Ey,Ey,Yp,np,ZI,aJ,aJ,aJ,ZI,Ey,aJ,ZI,aJ,ZI,Ey,Mp,Dm,rm,Ey,Ey,Ey,Mp,aJ,Mp,pH,Qv,aJ,aJ,OG,Cv,Ey,Ey,Ey,ji,Pv,tj,xv,ZI,xv,Sp,gr,lk,yu,aJ,aJ,Ki,qF,ZI,aJ,aJ,aJ,ni,Qv,aJ,ZI,aJ,aJ,aJ,aJ,aJ,aJ,ZI,aJ,ZI,aJ,ar,Wp,aJ,aJ,nk,oD,ii,vv,Hp,Ko,ZI,aJ,ZI,ZI,aJ,aJ,Ms,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ,jJ];var Jb=[_I,nc,Uc,kn,jn,bF,kF,WH,kF,ns,wd,jh,Te,kd,yg,sp,dg,Hj,De,Gc,YE,kF,WH,Pl,Pl,lj,_I,_I,_I,_I,_I,_I];var Kb=[yI,be,jf,Bg,xj,gc,Jf,yI];var Lb=[LC];var Mb=[lI,Zg,Kd,vB,vB,xu,Vj,Xi,yp,xu,xu,jj,Ol,bm,xu,Pi];var Nb=[hH];var Ob=[YI,$q,ws,yG,OB,AB,yG,oo,_k,yG,Bt,so,Fc,le,cq,yG,yG,yG,yG,wB,jk,vg,fl,Tj,im,Pj,ks,rh,nl,Pp,Jx,ox,Jx,ox,Nc,hc,yG,mj,nu,io,pq,Th,Gt,Ft,Mg,gg,Ah,tu,sf,Dh,Ac,Wk,nd,Cj,zc,Vi,yG,Tl,Bk,Sk,el,ak,VA,Cr,mi,ap,Ck,lA,On,Dk,mj,wj,mj,ki,yr,dq,si,mj,nj,Sn,nr,pn,fe,Mn,vl,Eu,Cu,Du,zh,$m,Zm,Yg,Is,wq,Hl,Ls,Op,Uk,vd,ud,Lr,Uk,Ls,yG,yG,Hh,Ih,se,Yn,yG,yG,yG,ly,Dx,tf,md,mm,Fu,ku,ku,yG,mj,yG,yG,YI,YI,YI,YI];var Pb=[kI,Cw,Kv,fs,pl,tc,kI,kI];var Qb=[gH,ev,hk,cp,Wi,Nn,Am,gH];var Rb=[dF];var Sb=[bI,XE,Ei,Ge,mw,hi,zo,XE,yj,Lj,au,XE,Rd,td,XE,al,Rk,Kk,Gq,$i,of,bi,XE,XE,Mi,ei,mf,Fx,Ex,XE,XE,XE,XE,xd,ai,Sj,yk,Mt,Bh,su,gf,Me,Me,ph,al,Uj,So,li,al,Zh,XE,nm,Bo,wm,jm,Kl,Zj,gn,hn,fn,Vn,mo,qf,ro,XE,XE,XE,XE,Zp,lp,mp,Ql,zj,$h,hp,XE,XE,XE,XE,zi,Nd,Yh,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI,bI];var Tb=[fH,Jz,oc,ae,$e,Jz,Ej,Be,xm,en,fH,fH,fH,fH,fH,fH];var Ub=[pC];var Vb=[zG,_e,jB,jB,jB,Xf,Ff,cu,Nj,Ar,Nu,Gk,Kc,Ec,Lf,Ht,th,Pf,kc,Ou,Km,sl,kp,Ff,We,Og,_f,Fe,Tt,Zs,Cg,wh,cu,oi,Ul,tt,vh,$d,am,qj,Bj,Cp,pg,Vg,Mh,Hi,Nk,jB,ri,Eh,wi,jB,jB,oj,rj,om,Tk,dk,ke,Ae,qi,Lc,rj,yl,rl,xl,cd,_n,Aj,_n,Cl,eq,po,dl,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG,zG];var Wb=[cF,Ov];var Xb=[pu];var Yb=[iv];var Zb=[xE,Sl,og,Up,Pc,Ze,$f,Uf,ec,Ic,yc,Bd,de,Dc,Zu,_h,pc,Xd,bl,Oi,hf,xE,xE,xE,xE,xE,xE,xE,xE,xE,xE,xE];var _b=[oC];var $b=[JB,_d,Gl,cm,rp,Jn,Ti,JB];var ac=[$z,mg,Xg,$z];var bc=[Nw,Fj];var cc=[wv,pm,pm,wv];return{__GLOBAL__sub_I_btConeTwistConstraint_cpp:nA,__GLOBAL__sub_I_btQuickprof_cpp:Sc,___cxa_can_catch:Oq,___cxa_is_pointer_type:fz,___muldi3:ct,___udivdi3:rB,___uremdi3:xs,_bitshift64Lshr:Mu,_bitshift64Shl:wu,_emscripten_bind_Anchor___destroy___0:TD,_emscripten_bind_Anchor_get_m_body_0:vG,_emscripten_bind_Anchor_get_m_c0_0:YH,_emscripten_bind_Anchor_get_m_c1_0:XH,_emscripten_bind_Anchor_get_m_c2_0:IG,_emscripten_bind_Anchor_get_m_influence_0:QG,_emscripten_bind_Anchor_get_m_local_0:OI,_emscripten_bind_Anchor_get_m_node_0:lH,_emscripten_bind_Anchor_set_m_body_1:gE,_emscripten_bind_Anchor_set_m_c0_1:RB,_emscripten_bind_Anchor_set_m_c1_1:Cs,_emscripten_bind_Anchor_set_m_c2_1:JE,_emscripten_bind_Anchor_set_m_influence_1:PE,_emscripten_bind_Anchor_set_m_local_1:Es,_emscripten_bind_Anchor_set_m_node_1:TE,_emscripten_bind_ClosestConvexResultCallback_ClosestConvexResultCallback_2:mt,_emscripten_bind_ClosestConvexResultCallback___destroy___0:px,_emscripten_bind_ClosestConvexResultCallback_get_m_closestHitFraction_0:RG,_emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterGroup_0:EB,_emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterMask_0:PB,_emscripten_bind_ClosestConvexResultCallback_get_m_convexFromWorld_0:XG,_emscripten_bind_ClosestConvexResultCallback_get_m_convexToWorld_0:iH,_emscripten_bind_ClosestConvexResultCallback_get_m_hitNormalWorld_0:gI,_emscripten_bind_ClosestConvexResultCallback_get_m_hitPointWorld_0:NF,_emscripten_bind_ClosestConvexResultCallback_hasHit_0:Dy,_emscripten_bind_ClosestConvexResultCallback_set_m_closestHitFraction_1:mG,_emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterGroup_1:ez,_emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterMask_1:sz,_emscripten_bind_ClosestConvexResultCallback_set_m_convexFromWorld_1:cs,_emscripten_bind_ClosestConvexResultCallback_set_m_convexToWorld_1:Sr,_emscripten_bind_ClosestConvexResultCallback_set_m_hitNormalWorld_1:ss,_emscripten_bind_ClosestConvexResultCallback_set_m_hitPointWorld_1:Xr,_emscripten_bind_ClosestRayResultCallback_ClosestRayResultCallback_2:Lt,_emscripten_bind_ClosestRayResultCallback___destroy___0:px,_emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterGroup_0:PB,_emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterMask_0:YB,_emscripten_bind_ClosestRayResultCallback_get_m_collisionObject_0:DE,_emscripten_bind_ClosestRayResultCallback_get_m_hitNormalWorld_0:$E,_emscripten_bind_ClosestRayResultCallback_get_m_hitPointWorld_0:aI,_emscripten_bind_ClosestRayResultCallback_get_m_rayFromWorld_0:JF,_emscripten_bind_ClosestRayResultCallback_get_m_rayToWorld_0:eG,_emscripten_bind_ClosestRayResultCallback_hasHit_0:$y,_emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterGroup_1:sz,_emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterMask_1:Az,_emscripten_bind_ClosestRayResultCallback_set_m_collisionObject_1:AB,_emscripten_bind_ClosestRayResultCallback_set_m_hitNormalWorld_1:Mr,_emscripten_bind_ClosestRayResultCallback_set_m_hitPointWorld_1:Is,_emscripten_bind_ClosestRayResultCallback_set_m_rayFromWorld_1:Ur,_emscripten_bind_ClosestRayResultCallback_set_m_rayToWorld_1:$r,_emscripten_bind_ConcreteContactResultCallback_ConcreteContactResultCallback_0:ms,_emscripten_bind_ConcreteContactResultCallback___destroy___0:px,_emscripten_bind_ConcreteContactResultCallback_addSingleResult_7:rr,_emscripten_bind_Config___destroy___0:Bz,_emscripten_bind_Config_get_citerations_0:WF,_emscripten_bind_Config_get_collisions_0:bG,_emscripten_bind_Config_get_diterations_0:VF,_emscripten_bind_Config_get_kAHR_0:HG,_emscripten_bind_Config_get_kCHR_0:GG,_emscripten_bind_Config_get_kDF_0:WG,_emscripten_bind_Config_get_kDG_0:VG,_emscripten_bind_Config_get_kDP_0:bH,_emscripten_bind_Config_get_kKHR_0:FG,_emscripten_bind_Config_get_kLF_0:UG,_emscripten_bind_Config_get_kMT_0:TG,_emscripten_bind_Config_get_kPR_0:SG,_emscripten_bind_Config_get_kSHR_0:EG,_emscripten_bind_Config_get_kSKHR_CL_0:hG,_emscripten_bind_Config_get_kSK_SPLT_CL_0:rG,_emscripten_bind_Config_get_kSRHR_CL_0:gG,_emscripten_bind_Config_get_kSR_SPLT_CL_0:CG,_emscripten_bind_Config_get_kSSHR_CL_0:DG,_emscripten_bind_Config_get_kSS_SPLT_CL_0:OF,_emscripten_bind_Config_get_kVCF_0:RG,_emscripten_bind_Config_get_kVC_0:QG,_emscripten_bind_Config_get_maxvolume_0:LG,_emscripten_bind_Config_get_piterations_0:UF,_emscripten_bind_Config_get_timescale_0:$F,_emscripten_bind_Config_get_viterations_0:TF,_emscripten_bind_Config_set_citerations_1:mD,_emscripten_bind_Config_set_collisions_1:lD,_emscripten_bind_Config_set_diterations_1:kD,_emscripten_bind_Config_set_kAHR_1:kF,_emscripten_bind_Config_set_kCHR_1:IE,_emscripten_bind_Config_set_kDF_1:SE,_emscripten_bind_Config_set_kDG_1:RF,_emscripten_bind_Config_set_kDP_1:lG,_emscripten_bind_Config_set_kKHR_1:HE,_emscripten_bind_Config_set_kLF_1:bF,_emscripten_bind_Config_set_kMT_1:RE,_emscripten_bind_Config_set_kPR_1:QE,_emscripten_bind_Config_set_kSHR_1:GE,_emscripten_bind_Config_set_kSKHR_CL_1:fE,_emscripten_bind_Config_set_kSK_SPLT_CL_1:rE,_emscripten_bind_Config_set_kSRHR_CL_1:eE,_emscripten_bind_Config_set_kSR_SPLT_CL_1:EE,_emscripten_bind_Config_set_kSSHR_CL_1:FE,_emscripten_bind_Config_set_kSS_SPLT_CL_1:PD,_emscripten_bind_Config_set_kVCF_1:mG,_emscripten_bind_Config_set_kVC_1:PE,_emscripten_bind_Config_set_maxvolume_1:YE,_emscripten_bind_Config_set_piterations_1:jD,_emscripten_bind_Config_set_timescale_1:_D,_emscripten_bind_Config_set_viterations_1:iD,_emscripten_bind_ContactResultCallback___destroy___0:px,_emscripten_bind_ContactResultCallback_addSingleResult_7:rr,_emscripten_bind_ConvexResultCallback___destroy___0:px,_emscripten_bind_ConvexResultCallback_get_m_closestHitFraction_0:RG,_emscripten_bind_ConvexResultCallback_get_m_collisionFilterGroup_0:EB,_emscripten_bind_ConvexResultCallback_get_m_collisionFilterMask_0:PB,_emscripten_bind_ConvexResultCallback_hasHit_0:Dy,_emscripten_bind_ConvexResultCallback_set_m_closestHitFraction_1:mG,_emscripten_bind_ConvexResultCallback_set_m_collisionFilterGroup_1:ez,_emscripten_bind_ConvexResultCallback_set_m_collisionFilterMask_1:sz,_emscripten_bind_Face___destroy___0:TD,_emscripten_bind_Face_get_m_n_1:OD,_emscripten_bind_Face_get_m_normal_0:QH,_emscripten_bind_Face_set_m_n_2:UA,_emscripten_bind_Face_set_m_normal_1:Bs,_emscripten_bind_Joint___destroy___0:px,_emscripten_bind_Joint_get_m_cfm_0:DG,_emscripten_bind_Joint_get_m_delete_0:mF,_emscripten_bind_Joint_get_m_drift_0:aI,_emscripten_bind_Joint_get_m_erp_0:CG,_emscripten_bind_Joint_get_m_massmatrix_0:uH,_emscripten_bind_Joint_get_m_refs_1:OE,_emscripten_bind_Joint_get_m_sdrift_0:OH,_emscripten_bind_Joint_get_m_split_0:rG,_emscripten_bind_Joint_set_m_cfm_1:FE,_emscripten_bind_Joint_set_m_delete_1:hD,_emscripten_bind_Joint_set_m_drift_1:Is,_emscripten_bind_Joint_set_m_erp_1:EE,_emscripten_bind_Joint_set_m_massmatrix_1:dB,_emscripten_bind_Joint_set_m_refs_2:Uq,_emscripten_bind_Joint_set_m_sdrift_1:zs,_emscripten_bind_Joint_set_m_split_1:rE,_emscripten_bind_LJoint___destroy___0:px,_emscripten_bind_LJoint_get_m_rpos_1:vE,_emscripten_bind_LJoint_set_m_rpos_2:Pq,_emscripten_bind_Link___destroy___0:QB,_emscripten_bind_Link_get_m_n_1:yD,_emscripten_bind_Link_set_m_n_2:LA,_emscripten_bind_LocalConvexResult_LocalConvexResult_5:lr,_emscripten_bind_LocalConvexResult___destroy___0:TD,_emscripten_bind_LocalConvexResult_get_m_hitCollisionObject_0:lH,_emscripten_bind_LocalConvexResult_get_m_hitFraction_0:FG,_emscripten_bind_LocalConvexResult_get_m_hitNormalLocal_0:NI,_emscripten_bind_LocalConvexResult_get_m_hitPointLocal_0:JF,_emscripten_bind_LocalConvexResult_get_m_localShapeInfo_0:hF,_emscripten_bind_LocalConvexResult_set_m_hitCollisionObject_1:TE,_emscripten_bind_LocalConvexResult_set_m_hitFraction_1:HE,_emscripten_bind_LocalConvexResult_set_m_hitNormalLocal_1:Ns,_emscripten_bind_LocalConvexResult_set_m_hitPointLocal_1:Ur,_emscripten_bind_LocalConvexResult_set_m_localShapeInfo_1:OB,_emscripten_bind_LocalShapeInfo___destroy___0:TD,_emscripten_bind_LocalShapeInfo_get_m_shapePart_0:lH,_emscripten_bind_LocalShapeInfo_get_m_triangleIndex_0:hF,_emscripten_bind_LocalShapeInfo_set_m_shapePart_1:TE,_emscripten_bind_LocalShapeInfo_set_m_triangleIndex_1:OB,_emscripten_bind_Material___destroy___0:TD,_emscripten_bind_Material_get_m_flags_0:fG,_emscripten_bind_Material_get_m_kAST_0:bH,_emscripten_bind_Material_get_m_kLST_0:RG,_emscripten_bind_Material_get_m_kVST_0:VG,_emscripten_bind_Material_set_m_flags_1:ND,_emscripten_bind_Material_set_m_kAST_1:lG,_emscripten_bind_Material_set_m_kLST_1:mG,_emscripten_bind_Material_set_m_kVST_1:RF,_emscripten_bind_Node___destroy___0:TD,_emscripten_bind_Node_get_m_n_0:aI,_emscripten_bind_Node_get_m_x_0:NI,_emscripten_bind_Node_set_m_n_1:Is,_emscripten_bind_Node_set_m_x_1:Ns,_emscripten_bind_RayResultCallback___destroy___0:px,_emscripten_bind_RayResultCallback_get_m_collisionFilterGroup_0:PB,_emscripten_bind_RayResultCallback_get_m_collisionFilterMask_0:YB,_emscripten_bind_RayResultCallback_get_m_collisionObject_0:DE,_emscripten_bind_RayResultCallback_hasHit_0:$y,_emscripten_bind_RayResultCallback_set_m_collisionFilterGroup_1:sz,_emscripten_bind_RayResultCallback_set_m_collisionFilterMask_1:Az,_emscripten_bind_RayResultCallback_set_m_collisionObject_1:AB,_emscripten_bind_RaycastInfo___destroy___0:TD,_emscripten_bind_RaycastInfo_get_m_contactNormalWS_0:gJ,_emscripten_bind_RaycastInfo_get_m_contactPointWS_0:XG,_emscripten_bind_RaycastInfo_get_m_groundObject_0:UF,_emscripten_bind_RaycastInfo_get_m_hardPointWS_0:BG,_emscripten_bind_RaycastInfo_get_m_isInContact_0:ZD,_emscripten_bind_RaycastInfo_get_m_suspensionLength_0:TG,_emscripten_bind_RaycastInfo_get_m_wheelAxleWS_0:AG,_emscripten_bind_RaycastInfo_get_m_wheelDirectionWS_0:_F,_emscripten_bind_RaycastInfo_set_m_contactNormalWS_1:Gs,_emscripten_bind_RaycastInfo_set_m_contactPointWS_1:cs,_emscripten_bind_RaycastInfo_set_m_groundObject_1:jD,_emscripten_bind_RaycastInfo_set_m_hardPointWS_1:js,_emscripten_bind_RaycastInfo_set_m_isInContact_1:HB,_emscripten_bind_RaycastInfo_set_m_suspensionLength_1:RE,_emscripten_bind_RaycastInfo_set_m_wheelAxleWS_1:is,_emscripten_bind_RaycastInfo_set_m_wheelDirectionWS_1:Zr,_emscripten_bind_Specs___destroy___0:TD,_emscripten_bind_Specs_get_position_0:MI,_emscripten_bind_Specs_set_position_1:ys,_emscripten_bind_VoidPtr___destroy___0:TD,_emscripten_bind_btActionInterface___destroy___0:px,_emscripten_bind_btActionInterface_updateAction_2:aw,_emscripten_bind_btAxisSweep3___destroy___0:px,_emscripten_bind_btAxisSweep3_btAxisSweep3_2:yt,_emscripten_bind_btAxisSweep3_btAxisSweep3_3:Ks,_emscripten_bind_btAxisSweep3_btAxisSweep3_4:hs,_emscripten_bind_btAxisSweep3_btAxisSweep3_5:Gr,_emscripten_bind_btBoxShape___destroy___0:px,_emscripten_bind_btBoxShape_btBoxShape_1:Ci,_emscripten_bind_btBoxShape_calculateLocalInertia_2:Nv,_emscripten_bind_btBoxShape_getLocalScaling_0:Oz,_emscripten_bind_btBoxShape_getMargin_0:pA,_emscripten_bind_btBoxShape_setLocalScaling_1:Cx,_emscripten_bind_btBoxShape_setMargin_1:Ay,_emscripten_bind_btBroadphaseInterface___destroy___0:px,_emscripten_bind_btBvhTriangleMeshShape___destroy___0:px,_emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_2:xt,_emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_3:Ps,_emscripten_bind_btBvhTriangleMeshShape_calculateLocalInertia_2:Nv,_emscripten_bind_btBvhTriangleMeshShape_getLocalScaling_0:Oz,_emscripten_bind_btBvhTriangleMeshShape_setLocalScaling_1:Cx,_emscripten_bind_btCapsuleShapeX___destroy___0:px,_emscripten_bind_btCapsuleShapeX_btCapsuleShapeX_2:Dn,_emscripten_bind_btCapsuleShapeX_calculateLocalInertia_2:Nv,_emscripten_bind_btCapsuleShapeX_getHalfHeight_0:mC,_emscripten_bind_btCapsuleShapeX_getLocalScaling_0:Oz,_emscripten_bind_btCapsuleShapeX_getMargin_0:pA,_emscripten_bind_btCapsuleShapeX_getRadius_0:MD,_emscripten_bind_btCapsuleShapeX_getUpAxis_0:qE,_emscripten_bind_btCapsuleShapeX_setLocalScaling_1:Cx,_emscripten_bind_btCapsuleShapeX_setMargin_1:Ay,_emscripten_bind_btCapsuleShapeZ___destroy___0:px,_emscripten_bind_btCapsuleShapeZ_btCapsuleShapeZ_2:Cn,_emscripten_bind_btCapsuleShapeZ_calculateLocalInertia_2:Nv,_emscripten_bind_btCapsuleShapeZ_getHalfHeight_0:mC,_emscripten_bind_btCapsuleShapeZ_getLocalScaling_0:Oz,_emscripten_bind_btCapsuleShapeZ_getMargin_0:pA,_emscripten_bind_btCapsuleShapeZ_getRadius_0:MD,_emscripten_bind_btCapsuleShapeZ_getUpAxis_0:qE,_emscripten_bind_btCapsuleShapeZ_setLocalScaling_1:Cx,_emscripten_bind_btCapsuleShapeZ_setMargin_1:Ay,_emscripten_bind_btCapsuleShape___destroy___0:px,_emscripten_bind_btCapsuleShape_btCapsuleShape_2:Fn,_emscripten_bind_btCapsuleShape_calculateLocalInertia_2:Nv,_emscripten_bind_btCapsuleShape_getHalfHeight_0:mC,_emscripten_bind_btCapsuleShape_getLocalScaling_0:Oz,_emscripten_bind_btCapsuleShape_getMargin_0:pA,_emscripten_bind_btCapsuleShape_getRadius_0:MD,_emscripten_bind_btCapsuleShape_getUpAxis_0:qE,_emscripten_bind_btCapsuleShape_setLocalScaling_1:Cx,_emscripten_bind_btCapsuleShape_setMargin_1:Ay,_emscripten_bind_btCollisionConfiguration___destroy___0:px,_emscripten_bind_btCollisionDispatcher___destroy___0:px,_emscripten_bind_btCollisionDispatcher_btCollisionDispatcher_1:ok,_emscripten_bind_btCollisionDispatcher_getManifoldByIndexInternal_1:Aw,_emscripten_bind_btCollisionDispatcher_getNumManifolds_0:qA,_emscripten_bind_btCollisionObject___destroy___0:px,_emscripten_bind_btCollisionObject_activate_0:ju,_emscripten_bind_btCollisionObject_activate_1:Ys,_emscripten_bind_btCollisionObject_forceActivationState_1:FB,_emscripten_bind_btCollisionObject_getCollisionFlags_0:JD,_emscripten_bind_btCollisionObject_getCollisionShape_0:ID,_emscripten_bind_btCollisionObject_getUserIndex_0:nE,_emscripten_bind_btCollisionObject_getUserPointer_0:cE,_emscripten_bind_btCollisionObject_getWorldTransform_0:fF,_emscripten_bind_btCollisionObject_isActive_0:ZA,_emscripten_bind_btCollisionObject_isKinematicObject_0:Ry,_emscripten_bind_btCollisionObject_isStaticObject_0:Kz,_emscripten_bind_btCollisionObject_isStaticOrKinematicObject_0:tx,_emscripten_bind_btCollisionObject_setActivationState_1:uw,_emscripten_bind_btCollisionObject_setAnisotropicFriction_2:Lv,_emscripten_bind_btCollisionObject_setCcdMotionThreshold_1:Oy,_emscripten_bind_btCollisionObject_setCcdSweptSphereRadius_1:xy,_emscripten_bind_btCollisionObject_setCollisionFlags_1:wz,_emscripten_bind_btCollisionObject_setCollisionShape_1:sx,_emscripten_bind_btCollisionObject_setContactProcessingThreshold_1:Uy,_emscripten_bind_btCollisionObject_setFriction_1:YA,_emscripten_bind_btCollisionObject_setRestitution_1:oA,_emscripten_bind_btCollisionObject_setRollingFriction_1:Fz,_emscripten_bind_btCollisionObject_setUserIndex_1:tA,_emscripten_bind_btCollisionObject_setUserPointer_1:Wz,_emscripten_bind_btCollisionObject_setWorldTransform_1:cy,_emscripten_bind_btCollisionShape___destroy___0:px,_emscripten_bind_btCollisionShape_calculateLocalInertia_2:Nv,_emscripten_bind_btCollisionShape_getLocalScaling_0:Oz,_emscripten_bind_btCollisionShape_getMargin_0:pA,_emscripten_bind_btCollisionShape_setLocalScaling_1:Cx,_emscripten_bind_btCollisionShape_setMargin_1:Ay,_emscripten_bind_btCollisionWorld___destroy___0:px,_emscripten_bind_btCollisionWorld_addCollisionObject_1:kw,_emscripten_bind_btCollisionWorld_addCollisionObject_2:Ru,_emscripten_bind_btCollisionWorld_addCollisionObject_3:pt,_emscripten_bind_btCollisionWorld_contactPairTest_3:wt,_emscripten_bind_btCollisionWorld_contactTest_2:tn,_emscripten_bind_btCollisionWorld_convexSweepTest_5:Qr,_emscripten_bind_btCollisionWorld_getBroadphase_0:LD,_emscripten_bind_btCollisionWorld_getDispatchInfo_0:tC,_emscripten_bind_btCollisionWorld_getDispatcher_0:KD,_emscripten_bind_btCollisionWorld_getPairCache_0:Tz,_emscripten_bind_btCollisionWorld_rayTest_3:$u,_emscripten_bind_btCollisionWorld_removeCollisionObject_1:Pw,_emscripten_bind_btCollisionWorld_updateSingleAabb_1:nx,_emscripten_bind_btCompoundShape___destroy___0:px,_emscripten_bind_btCompoundShape_addChildShape_2:Sd,_emscripten_bind_btCompoundShape_btCompoundShape_0:ny,_emscripten_bind_btCompoundShape_btCompoundShape_1:Sw,_emscripten_bind_btCompoundShape_calculateLocalInertia_2:Nv,_emscripten_bind_btCompoundShape_getChildShape_1:Pz,_emscripten_bind_btCompoundShape_getLocalScaling_0:Oz,_emscripten_bind_btCompoundShape_getMargin_0:pA,_emscripten_bind_btCompoundShape_getNumChildShapes_0:cB,_emscripten_bind_btCompoundShape_removeChildShapeByIndex_1:_x,_emscripten_bind_btCompoundShape_setLocalScaling_1:Cx,_emscripten_bind_btCompoundShape_setMargin_1:Ay,_emscripten_bind_btConcaveShape___destroy___0:px,_emscripten_bind_btConcaveShape_calculateLocalInertia_2:Nv,_emscripten_bind_btConcaveShape_getLocalScaling_0:Oz,_emscripten_bind_btConcaveShape_setLocalScaling_1:Cx,_emscripten_bind_btConeShapeX___destroy___0:px,_emscripten_bind_btConeShapeX_btConeShapeX_2:um,_emscripten_bind_btConeShapeX_calculateLocalInertia_2:Nv,_emscripten_bind_btConeShapeX_getLocalScaling_0:Oz,_emscripten_bind_btConeShapeX_setLocalScaling_1:Cx,_emscripten_bind_btConeShapeZ___destroy___0:px,_emscripten_bind_btConeShapeZ_btConeShapeZ_2:tm,_emscripten_bind_btConeShapeZ_calculateLocalInertia_2:Nv,_emscripten_bind_btConeShapeZ_getLocalScaling_0:Oz,_emscripten_bind_btConeShapeZ_setLocalScaling_1:Cx,_emscripten_bind_btConeShape___destroy___0:px,_emscripten_bind_btConeShape_btConeShape_2:vm,_emscripten_bind_btConeShape_calculateLocalInertia_2:Nv,_emscripten_bind_btConeShape_getLocalScaling_0:Oz,_emscripten_bind_btConeShape_setLocalScaling_1:Cx,_emscripten_bind_btConeTwistConstraint___destroy___0:px,_emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_2:Wg,_emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_4:Fg,_emscripten_bind_btConeTwistConstraint_enableFeedback_1:mz,_emscripten_bind_btConeTwistConstraint_enableMotor_1:dz,_emscripten_bind_btConeTwistConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btConeTwistConstraint_getParam_2:Rv,_emscripten_bind_btConeTwistConstraint_setAngularOnly_1:zy,_emscripten_bind_btConeTwistConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btConeTwistConstraint_setDamping_1:Nz,_emscripten_bind_btConeTwistConstraint_setLimit_2:Rx,_emscripten_bind_btConeTwistConstraint_setMaxMotorImpulseNormalized_1:yw,_emscripten_bind_btConeTwistConstraint_setMaxMotorImpulse_1:ey,_emscripten_bind_btConeTwistConstraint_setMotorTargetInConstraintSpace_1:hv,_emscripten_bind_btConeTwistConstraint_setMotorTarget_1:di,_emscripten_bind_btConeTwistConstraint_setParam_3:fv,_emscripten_bind_btConstraintSetting___destroy___0:TD,_emscripten_bind_btConstraintSetting_btConstraintSetting_0:zz,_emscripten_bind_btConstraintSetting_get_m_damping_0:RG,_emscripten_bind_btConstraintSetting_get_m_impulseClamp_0:bH,_emscripten_bind_btConstraintSetting_get_m_tau_0:GF,_emscripten_bind_btConstraintSetting_set_m_damping_1:mG,_emscripten_bind_btConstraintSetting_set_m_impulseClamp_1:lG,_emscripten_bind_btConstraintSetting_set_m_tau_1:MG,_emscripten_bind_btConstraintSolver___destroy___0:px,_emscripten_bind_btContactSolverInfo___destroy___0:TD,_emscripten_bind_btContactSolverInfo_get_m_numIterations_0:vG,_emscripten_bind_btContactSolverInfo_get_m_splitImpulsePenetrationThreshold_0:TA,_emscripten_bind_btContactSolverInfo_get_m_splitImpulse_0:uC,_emscripten_bind_btContactSolverInfo_set_m_numIterations_1:gE,_emscripten_bind_btContactSolverInfo_set_m_splitImpulsePenetrationThreshold_1:py,_emscripten_bind_btContactSolverInfo_set_m_splitImpulse_1:KA,_emscripten_bind_btConvexHullShape___destroy___0:px,_emscripten_bind_btConvexHullShape_addPoint_1:cz,_emscripten_bind_btConvexHullShape_addPoint_2:jx,_emscripten_bind_btConvexHullShape_btConvexHullShape_0:_w,_emscripten_bind_btConvexHullShape_calculateLocalInertia_2:Nv,_emscripten_bind_btConvexHullShape_getLocalScaling_0:Oz,_emscripten_bind_btConvexHullShape_getMargin_0:pA,_emscripten_bind_btConvexHullShape_setLocalScaling_1:Cx,_emscripten_bind_btConvexHullShape_setMargin_1:Ay,_emscripten_bind_btConvexShape___destroy___0:px,_emscripten_bind_btConvexShape_calculateLocalInertia_2:Nv,_emscripten_bind_btConvexShape_getLocalScaling_0:Oz,_emscripten_bind_btConvexShape_getMargin_0:pA,_emscripten_bind_btConvexShape_setLocalScaling_1:Cx,_emscripten_bind_btConvexShape_setMargin_1:Ay,_emscripten_bind_btConvexTriangleMeshShape___destroy___0:px,_emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_1:Al,_emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_2:kl,_emscripten_bind_btConvexTriangleMeshShape_calculateLocalInertia_2:Nv,_emscripten_bind_btConvexTriangleMeshShape_getLocalScaling_0:Oz,_emscripten_bind_btConvexTriangleMeshShape_getMargin_0:pA,_emscripten_bind_btConvexTriangleMeshShape_setLocalScaling_1:Cx,_emscripten_bind_btConvexTriangleMeshShape_setMargin_1:Ay,_emscripten_bind_btCylinderShapeX___destroy___0:px,_emscripten_bind_btCylinderShapeX_btCylinderShapeX_1:Wt,_emscripten_bind_btCylinderShapeX_calculateLocalInertia_2:Nv,_emscripten_bind_btCylinderShapeX_getLocalScaling_0:Oz,_emscripten_bind_btCylinderShapeX_getMargin_0:pA,_emscripten_bind_btCylinderShapeX_setLocalScaling_1:Cx,_emscripten_bind_btCylinderShapeX_setMargin_1:Ay,_emscripten_bind_btCylinderShapeZ___destroy___0:px,_emscripten_bind_btCylinderShapeZ_btCylinderShapeZ_1:Vt,_emscripten_bind_btCylinderShapeZ_calculateLocalInertia_2:Nv,_emscripten_bind_btCylinderShapeZ_getLocalScaling_0:Oz,_emscripten_bind_btCylinderShapeZ_getMargin_0:pA,_emscripten_bind_btCylinderShapeZ_setLocalScaling_1:Cx,_emscripten_bind_btCylinderShapeZ_setMargin_1:Ay,_emscripten_bind_btCylinderShape___destroy___0:px,_emscripten_bind_btCylinderShape_btCylinderShape_1:Mw,_emscripten_bind_btCylinderShape_calculateLocalInertia_2:Nv,_emscripten_bind_btCylinderShape_getLocalScaling_0:Oz,_emscripten_bind_btCylinderShape_getMargin_0:pA,_emscripten_bind_btCylinderShape_setLocalScaling_1:Cx,_emscripten_bind_btCylinderShape_setMargin_1:Ay,_emscripten_bind_btDbvtBroadphase___destroy___0:px,_emscripten_bind_btDbvtBroadphase_btDbvtBroadphase_0:Bx,_emscripten_bind_btDefaultCollisionConfiguration___destroy___0:px,_emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_0:Fq,_emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_1:At,_emscripten_bind_btDefaultCollisionConstructionInfo___destroy___0:TD,_emscripten_bind_btDefaultCollisionConstructionInfo_btDefaultCollisionConstructionInfo_0:Jv,_emscripten_bind_btDefaultMotionState___destroy___0:px,_emscripten_bind_btDefaultMotionState_btDefaultMotionState_0:ps,_emscripten_bind_btDefaultMotionState_btDefaultMotionState_1:Ws,_emscripten_bind_btDefaultMotionState_btDefaultMotionState_2:_t,_emscripten_bind_btDefaultMotionState_getWorldTransform_1:sx,_emscripten_bind_btDefaultMotionState_get_m_graphicsWorldTrans_0:OI,_emscripten_bind_btDefaultMotionState_setWorldTransform_1:ex,_emscripten_bind_btDefaultMotionState_set_m_graphicsWorldTrans_1:Qy,_emscripten_bind_btDefaultSoftBodySolver___destroy___0:px,_emscripten_bind_btDefaultSoftBodySolver_btDefaultSoftBodySolver_0:sq,_emscripten_bind_btDefaultVehicleRaycaster___destroy___0:px,_emscripten_bind_btDefaultVehicleRaycaster_btDefaultVehicleRaycaster_1:rv,_emscripten_bind_btDefaultVehicleRaycaster_castRay_3:Pu,_emscripten_bind_btDiscreteDynamicsWorld___destroy___0:px,_emscripten_bind_btDiscreteDynamicsWorld_addAction_1:Jx,_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_1:Mv,_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_2:ru,_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_3:pt,_emscripten_bind_btDiscreteDynamicsWorld_addConstraint_1:xw,_emscripten_bind_btDiscreteDynamicsWorld_addConstraint_2:sv,_emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_1:Rw,_emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_3:kt,_emscripten_bind_btDiscreteDynamicsWorld_addVehicle_1:Vw,_emscripten_bind_btDiscreteDynamicsWorld_btDiscreteDynamicsWorld_4:Tq,_emscripten_bind_btDiscreteDynamicsWorld_contactPairTest_3:wt,_emscripten_bind_btDiscreteDynamicsWorld_contactTest_2:tn,_emscripten_bind_btDiscreteDynamicsWorld_convexSweepTest_5:Qr,_emscripten_bind_btDiscreteDynamicsWorld_getBroadphase_0:LD,_emscripten_bind_btDiscreteDynamicsWorld_getDispatchInfo_0:tC,_emscripten_bind_btDiscreteDynamicsWorld_getDispatcher_0:KD,_emscripten_bind_btDiscreteDynamicsWorld_getGravity_0:Zo,_emscripten_bind_btDiscreteDynamicsWorld_getPairCache_0:Tz,_emscripten_bind_btDiscreteDynamicsWorld_getSolverInfo_0:XB,_emscripten_bind_btDiscreteDynamicsWorld_rayTest_3:$u,_emscripten_bind_btDiscreteDynamicsWorld_removeAction_1:ox,_emscripten_bind_btDiscreteDynamicsWorld_removeCollisionObject_1:Pw,_emscripten_bind_btDiscreteDynamicsWorld_removeConstraint_1:Bw,_emscripten_bind_btDiscreteDynamicsWorld_removeRigidBody_1:Fw,_emscripten_bind_btDiscreteDynamicsWorld_removeVehicle_1:Lw,_emscripten_bind_btDiscreteDynamicsWorld_setGravity_1:Zw,_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_1:qv,_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_2:vu,_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_3:Bu,_emscripten_bind_btDiscreteDynamicsWorld_updateSingleAabb_1:nx,_emscripten_bind_btDispatcherInfo___destroy___0:TD,_emscripten_bind_btDispatcherInfo_get_m_allowedCcdPenetration_0:WG,_emscripten_bind_btDispatcherInfo_get_m_convexConservativeDistanceThreshold_0:GG,_emscripten_bind_btDispatcherInfo_get_m_dispatchFunc_0:DE,_emscripten_bind_btDispatcherInfo_get_m_enableSPU_0:xD,_emscripten_bind_btDispatcherInfo_get_m_enableSatConvex_0:CC,_emscripten_bind_btDispatcherInfo_get_m_stepCount_0:hF,_emscripten_bind_btDispatcherInfo_get_m_timeOfImpact_0:VG,_emscripten_bind_btDispatcherInfo_get_m_timeStep_0:GF,_emscripten_bind_btDispatcherInfo_get_m_useContinuous_0:RC,_emscripten_bind_btDispatcherInfo_get_m_useConvexConservativeDistanceUtil_0:vA,_emscripten_bind_btDispatcherInfo_get_m_useEpa_0:YD,_emscripten_bind_btDispatcherInfo_set_m_allowedCcdPenetration_1:SE,_emscripten_bind_btDispatcherInfo_set_m_convexConservativeDistanceThreshold_1:IE,_emscripten_bind_btDispatcherInfo_set_m_dispatchFunc_1:AB,_emscripten_bind_btDispatcherInfo_set_m_enableSPU_1:uB,_emscripten_bind_btDispatcherInfo_set_m_enableSatConvex_1:SA,_emscripten_bind_btDispatcherInfo_set_m_stepCount_1:OB,_emscripten_bind_btDispatcherInfo_set_m_timeOfImpact_1:RF,_emscripten_bind_btDispatcherInfo_set_m_timeStep_1:MG,_emscripten_bind_btDispatcherInfo_set_m_useContinuous_1:bB,_emscripten_bind_btDispatcherInfo_set_m_useConvexConservativeDistanceUtil_1:_y,_emscripten_bind_btDispatcherInfo_set_m_useEpa_1:GB,_emscripten_bind_btDispatcher___destroy___0:px,_emscripten_bind_btDispatcher_getManifoldByIndexInternal_1:Aw,_emscripten_bind_btDispatcher_getNumManifolds_0:qA,_emscripten_bind_btDynamicsWorld___destroy___0:px,_emscripten_bind_btDynamicsWorld_addAction_1:Jx,_emscripten_bind_btDynamicsWorld_addCollisionObject_1:kw,_emscripten_bind_btDynamicsWorld_addCollisionObject_2:Ru,_emscripten_bind_btDynamicsWorld_addCollisionObject_3:pt,_emscripten_bind_btDynamicsWorld_contactPairTest_3:wt,_emscripten_bind_btDynamicsWorld_contactTest_2:tn,_emscripten_bind_btDynamicsWorld_convexSweepTest_5:Qr,_emscripten_bind_btDynamicsWorld_getBroadphase_0:LD,_emscripten_bind_btDynamicsWorld_getDispatchInfo_0:tC,_emscripten_bind_btDynamicsWorld_getDispatcher_0:KD,_emscripten_bind_btDynamicsWorld_getPairCache_0:Tz,_emscripten_bind_btDynamicsWorld_getSolverInfo_0:XB,_emscripten_bind_btDynamicsWorld_rayTest_3:$u,_emscripten_bind_btDynamicsWorld_removeAction_1:ox,_emscripten_bind_btDynamicsWorld_removeCollisionObject_1:Pw,_emscripten_bind_btDynamicsWorld_updateSingleAabb_1:nx,_emscripten_bind_btFixedConstraint___destroy___0:px,_emscripten_bind_btFixedConstraint_btFixedConstraint_4:Xl,_emscripten_bind_btFixedConstraint_enableFeedback_1:mz,_emscripten_bind_btFixedConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btFixedConstraint_getParam_2:Rv,_emscripten_bind_btFixedConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btFixedConstraint_setParam_3:fv,_emscripten_bind_btGeneric6DofConstraint___destroy___0:px,_emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_3:os,_emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_5:er,_emscripten_bind_btGeneric6DofConstraint_enableFeedback_1:mz,_emscripten_bind_btGeneric6DofConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btGeneric6DofConstraint_getParam_2:Rv,_emscripten_bind_btGeneric6DofConstraint_getRotationalLimitMotor_1:zw,_emscripten_bind_btGeneric6DofConstraint_setAngularLowerLimit_1:jw,_emscripten_bind_btGeneric6DofConstraint_setAngularUpperLimit_1:iw,_emscripten_bind_btGeneric6DofConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btGeneric6DofConstraint_setLinearLowerLimit_1:ww,_emscripten_bind_btGeneric6DofConstraint_setLinearUpperLimit_1:vw,_emscripten_bind_btGeneric6DofConstraint_setParam_3:fv,_emscripten_bind_btGeneric6DofSpringConstraint___destroy___0:px,_emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_3:Fk,_emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_5:uk,_emscripten_bind_btGeneric6DofSpringConstraint_enableFeedback_1:mz,_emscripten_bind_btGeneric6DofSpringConstraint_enableSpring_2:Kr,_emscripten_bind_btGeneric6DofSpringConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btGeneric6DofSpringConstraint_getParam_2:Rv,_emscripten_bind_btGeneric6DofSpringConstraint_getRotationalLimitMotor_1:zw,_emscripten_bind_btGeneric6DofSpringConstraint_setAngularLowerLimit_1:jw,_emscripten_bind_btGeneric6DofSpringConstraint_setAngularUpperLimit_1:iw,_emscripten_bind_btGeneric6DofSpringConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btGeneric6DofSpringConstraint_setDamping_2:Zx,_emscripten_bind_btGeneric6DofSpringConstraint_setLinearLowerLimit_1:ww,_emscripten_bind_btGeneric6DofSpringConstraint_setLinearUpperLimit_1:vw,_emscripten_bind_btGeneric6DofSpringConstraint_setParam_3:fv,_emscripten_bind_btGeneric6DofSpringConstraint_setStiffness_2:Px,_emscripten_bind_btGhostObject___destroy___0:px,_emscripten_bind_btGhostObject_activate_0:ju,_emscripten_bind_btGhostObject_activate_1:Ys,_emscripten_bind_btGhostObject_btGhostObject_0:Pg,_emscripten_bind_btGhostObject_forceActivationState_1:FB,_emscripten_bind_btGhostObject_getCollisionFlags_0:JD,_emscripten_bind_btGhostObject_getCollisionShape_0:ID,_emscripten_bind_btGhostObject_getNumOverlappingObjects_0:aA,_emscripten_bind_btGhostObject_getOverlappingObject_1:Hy,_emscripten_bind_btGhostObject_getUserIndex_0:nE,_emscripten_bind_btGhostObject_getUserPointer_0:cE,_emscripten_bind_btGhostObject_getWorldTransform_0:fF,_emscripten_bind_btGhostObject_isActive_0:ZA,_emscripten_bind_btGhostObject_isKinematicObject_0:Ry,_emscripten_bind_btGhostObject_isStaticObject_0:Kz,_emscripten_bind_btGhostObject_isStaticOrKinematicObject_0:tx,_emscripten_bind_btGhostObject_setActivationState_1:uw,_emscripten_bind_btGhostObject_setAnisotropicFriction_2:Lv,_emscripten_bind_btGhostObject_setCcdMotionThreshold_1:Oy,_emscripten_bind_btGhostObject_setCcdSweptSphereRadius_1:xy,_emscripten_bind_btGhostObject_setCollisionFlags_1:wz,_emscripten_bind_btGhostObject_setCollisionShape_1:sx,_emscripten_bind_btGhostObject_setContactProcessingThreshold_1:Uy,_emscripten_bind_btGhostObject_setFriction_1:YA,_emscripten_bind_btGhostObject_setRestitution_1:oA,_emscripten_bind_btGhostObject_setRollingFriction_1:Fz,_emscripten_bind_btGhostObject_setUserIndex_1:tA,_emscripten_bind_btGhostObject_setUserPointer_1:Wz,_emscripten_bind_btGhostObject_setWorldTransform_1:cy,_emscripten_bind_btGhostPairCallback___destroy___0:px,_emscripten_bind_btGhostPairCallback_btGhostPairCallback_0:Iz,_emscripten_bind_btHeightfieldTerrainShape___destroy___0:px,_emscripten_bind_btHeightfieldTerrainShape_btHeightfieldTerrainShape_9:ug,_emscripten_bind_btHeightfieldTerrainShape_calculateLocalInertia_2:Nv,_emscripten_bind_btHeightfieldTerrainShape_getLocalScaling_0:Oz,_emscripten_bind_btHeightfieldTerrainShape_getMargin_0:pA,_emscripten_bind_btHeightfieldTerrainShape_setLocalScaling_1:Cx,_emscripten_bind_btHeightfieldTerrainShape_setMargin_1:Ay,_emscripten_bind_btHingeConstraint___destroy___0:px,_emscripten_bind_btHingeConstraint_btHingeConstraint_2:eg,_emscripten_bind_btHingeConstraint_btHingeConstraint_3:ag,_emscripten_bind_btHingeConstraint_btHingeConstraint_4:Dg,_emscripten_bind_btHingeConstraint_btHingeConstraint_5:zg,_emscripten_bind_btHingeConstraint_btHingeConstraint_6:br,_emscripten_bind_btHingeConstraint_btHingeConstraint_7:Bq,_emscripten_bind_btHingeConstraint_enableAngularMotor_3:Av,_emscripten_bind_btHingeConstraint_enableFeedback_1:mz,_emscripten_bind_btHingeConstraint_enableMotor_1:Zz,_emscripten_bind_btHingeConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btHingeConstraint_getParam_2:Rv,_emscripten_bind_btHingeConstraint_setAngularOnly_1:rz,_emscripten_bind_btHingeConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btHingeConstraint_setLimit_4:yv,_emscripten_bind_btHingeConstraint_setLimit_5:Uu,_emscripten_bind_btHingeConstraint_setMaxMotorImpulse_1:My,_emscripten_bind_btHingeConstraint_setMotorTarget_2:_j,_emscripten_bind_btHingeConstraint_setParam_3:fv,_emscripten_bind_btKinematicCharacterController___destroy___0:px,_emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_3:En,_emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_4:Aq,_emscripten_bind_btKinematicCharacterController_canJump_0:uy,_emscripten_bind_btKinematicCharacterController_getGhostObject_0:DE,_emscripten_bind_btKinematicCharacterController_getGravity_0:xp,_emscripten_bind_btKinematicCharacterController_getMaxSlope_0:EG,_emscripten_bind_btKinematicCharacterController_jump_0:Rt,_emscripten_bind_btKinematicCharacterController_onGround_0:Cz,_emscripten_bind_btKinematicCharacterController_playerStep_2:tv,_emscripten_bind_btKinematicCharacterController_preStep_1:Kw,_emscripten_bind_btKinematicCharacterController_setFallSpeed_1:SE,_emscripten_bind_btKinematicCharacterController_setGravity_1:Jm,_emscripten_bind_btKinematicCharacterController_setJumpSpeed_1:Yx,_emscripten_bind_btKinematicCharacterController_setMaxJumpHeight_1:HE,_emscripten_bind_btKinematicCharacterController_setMaxSlope_1:ax,_emscripten_bind_btKinematicCharacterController_setUpInterpolate_1:$v,_emscripten_bind_btKinematicCharacterController_setUp_1:cl,_emscripten_bind_btKinematicCharacterController_setUseGhostSweepTest_1:bw,_emscripten_bind_btKinematicCharacterController_setVelocityForTimeInterval_2:Lu,_emscripten_bind_btKinematicCharacterController_setWalkDirection_1:_v,_emscripten_bind_btKinematicCharacterController_updateAction_2:aw,_emscripten_bind_btKinematicCharacterController_warp_1:Uw,_emscripten_bind_btManifoldPoint___destroy___0:TD,_emscripten_bind_btManifoldPoint_getAppliedImpulse_0:Hz,_emscripten_bind_btManifoldPoint_getDistance_0:kA,_emscripten_bind_btManifoldPoint_getPositionWorldOnA_0:BE,_emscripten_bind_btManifoldPoint_getPositionWorldOnB_0:FA,_emscripten_bind_btManifoldPoint_get_m_localPointA_0:gJ,_emscripten_bind_btManifoldPoint_get_m_localPointB_0:XG,_emscripten_bind_btManifoldPoint_get_m_normalWorldOnB_0:NF,_emscripten_bind_btManifoldPoint_get_m_positionWorldOnA_0:gI,_emscripten_bind_btManifoldPoint_get_m_positionWorldOnB_0:iH,_emscripten_bind_btManifoldPoint_set_m_localPointA_1:Gs,_emscripten_bind_btManifoldPoint_set_m_localPointB_1:cs,_emscripten_bind_btManifoldPoint_set_m_normalWorldOnB_1:Xr,_emscripten_bind_btManifoldPoint_set_m_positionWorldOnA_1:ss,_emscripten_bind_btManifoldPoint_set_m_positionWorldOnB_1:Sr,_emscripten_bind_btMatrix3x3___destroy___0:TD,_emscripten_bind_btMatrix3x3_getRotation_1:Mz,_emscripten_bind_btMatrix3x3_getRow_1:Iq,_emscripten_bind_btMatrix3x3_setEulerZYX_3:wx,_emscripten_bind_btMotionState___destroy___0:px,_emscripten_bind_btMotionState_getWorldTransform_1:sx,_emscripten_bind_btMotionState_setWorldTransform_1:ex,_emscripten_bind_btOverlappingPairCache___destroy___0:px,_emscripten_bind_btOverlappingPairCache_setInternalGhostPairCallback_1:Bw,_emscripten_bind_btOverlappingPairCallback___destroy___0:px,_emscripten_bind_btPairCachingGhostObject___destroy___0:px,_emscripten_bind_btPairCachingGhostObject_activate_0:ju,_emscripten_bind_btPairCachingGhostObject_activate_1:Ys,_emscripten_bind_btPairCachingGhostObject_btPairCachingGhostObject_0:kg,_emscripten_bind_btPairCachingGhostObject_forceActivationState_1:FB,_emscripten_bind_btPairCachingGhostObject_getCollisionFlags_0:JD,_emscripten_bind_btPairCachingGhostObject_getCollisionShape_0:ID,_emscripten_bind_btPairCachingGhostObject_getNumOverlappingObjects_0:aA,_emscripten_bind_btPairCachingGhostObject_getOverlappingObject_1:Hy,_emscripten_bind_btPairCachingGhostObject_getUserIndex_0:nE,_emscripten_bind_btPairCachingGhostObject_getUserPointer_0:cE,_emscripten_bind_btPairCachingGhostObject_getWorldTransform_0:fF,_emscripten_bind_btPairCachingGhostObject_isActive_0:ZA,_emscripten_bind_btPairCachingGhostObject_isKinematicObject_0:Ry,_emscripten_bind_btPairCachingGhostObject_isStaticObject_0:Kz,_emscripten_bind_btPairCachingGhostObject_isStaticOrKinematicObject_0:tx,_emscripten_bind_btPairCachingGhostObject_setActivationState_1:uw,_emscripten_bind_btPairCachingGhostObject_setAnisotropicFriction_2:Lv,_emscripten_bind_btPairCachingGhostObject_setCcdMotionThreshold_1:Oy,_emscripten_bind_btPairCachingGhostObject_setCcdSweptSphereRadius_1:xy,_emscripten_bind_btPairCachingGhostObject_setCollisionFlags_1:wz,_emscripten_bind_btPairCachingGhostObject_setCollisionShape_1:sx,_emscripten_bind_btPairCachingGhostObject_setContactProcessingThreshold_1:Uy,_emscripten_bind_btPairCachingGhostObject_setFriction_1:YA,_emscripten_bind_btPairCachingGhostObject_setRestitution_1:oA,_emscripten_bind_btPairCachingGhostObject_setRollingFriction_1:Fz,_emscripten_bind_btPairCachingGhostObject_setUserIndex_1:tA,_emscripten_bind_btPairCachingGhostObject_setUserPointer_1:Wz,_emscripten_bind_btPairCachingGhostObject_setWorldTransform_1:cy,_emscripten_bind_btPersistentManifold___destroy___0:QB,_emscripten_bind_btPersistentManifold_btPersistentManifold_0:gm,_emscripten_bind_btPersistentManifold_getBody0_0:wD,_emscripten_bind_btPersistentManifold_getBody1_0:vD,_emscripten_bind_btPersistentManifold_getContactPoint_1:oy,_emscripten_bind_btPersistentManifold_getNumContacts_0:BC,_emscripten_bind_btPoint2PointConstraint___destroy___0:px,_emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_2:Wj,_emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_4:ik,_emscripten_bind_btPoint2PointConstraint_enableFeedback_1:mz,_emscripten_bind_btPoint2PointConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btPoint2PointConstraint_getParam_2:Rv,_emscripten_bind_btPoint2PointConstraint_getPivotInA_0:EA,_emscripten_bind_btPoint2PointConstraint_getPivotInB_0:DA,_emscripten_bind_btPoint2PointConstraint_get_m_setting_0:EH,_emscripten_bind_btPoint2PointConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btPoint2PointConstraint_setParam_3:fv,_emscripten_bind_btPoint2PointConstraint_setPivotA_1:jy,_emscripten_bind_btPoint2PointConstraint_setPivotB_1:iy,_emscripten_bind_btPoint2PointConstraint_set_m_setting_1:st,_emscripten_bind_btQuadWord___destroy___0:TD,_emscripten_bind_btQuadWord_setW_1:XD,_emscripten_bind_btQuadWord_setX_1:mE,_emscripten_bind_btQuadWord_setY_1:lE,_emscripten_bind_btQuadWord_setZ_1:kE,_emscripten_bind_btQuadWord_w_0:AE,_emscripten_bind_btQuadWord_x_0:ZF,_emscripten_bind_btQuadWord_y_0:zE,_emscripten_bind_btQuadWord_z_0:yE,_emscripten_bind_btQuaternion___destroy___0:TD,_emscripten_bind_btQuaternion_angleShortestPath_1:bz,_emscripten_bind_btQuaternion_angle_1:DB,_emscripten_bind_btQuaternion_btQuaternion_4:qp,_emscripten_bind_btQuaternion_dot_1:lC,_emscripten_bind_btQuaternion_getAngleShortestPath_0:Zy,_emscripten_bind_btQuaternion_getAngle_0:zB,_emscripten_bind_btQuaternion_getAxis_0:Fp,_emscripten_bind_btQuaternion_inverse_0:Ep,_emscripten_bind_btQuaternion_length2_0:NE,_emscripten_bind_btQuaternion_length_0:gF,_emscripten_bind_btQuaternion_normalize_0:CE,_emscripten_bind_btQuaternion_normalized_0:wp,_emscripten_bind_btQuaternion_op_add_1:kC,_emscripten_bind_btQuaternion_op_div_1:QC,_emscripten_bind_btQuaternion_op_mul_1:Zt,_emscripten_bind_btQuaternion_op_mulq_1:WB,_emscripten_bind_btQuaternion_op_sub_1:jC,_emscripten_bind_btQuaternion_setEulerZYX_3:Tw,_emscripten_bind_btQuaternion_setEuler_3:mx,_emscripten_bind_btQuaternion_setRotation_2:Ix,_emscripten_bind_btQuaternion_setValue_4:Tp,_emscripten_bind_btQuaternion_setW_1:XD,_emscripten_bind_btQuaternion_setX_1:mE,_emscripten_bind_btQuaternion_setY_1:lE,_emscripten_bind_btQuaternion_setZ_1:kE,_emscripten_bind_btQuaternion_w_0:AE,_emscripten_bind_btQuaternion_x_0:ZF,_emscripten_bind_btQuaternion_y_0:zE,_emscripten_bind_btQuaternion_z_0:yE,_emscripten_bind_btRaycastVehicle___destroy___0:px,_emscripten_bind_btRaycastVehicle_addWheel_7:Zd,_emscripten_bind_btRaycastVehicle_applyEngineForce_2:gw,_emscripten_bind_btRaycastVehicle_btRaycastVehicle_3:il,_emscripten_bind_btRaycastVehicle_getChassisWorldTransform_0:NB,_emscripten_bind_btRaycastVehicle_getCurrentSpeedKmHour_0:Yy,_emscripten_bind_btRaycastVehicle_getForwardAxis_0:aD,_emscripten_bind_btRaycastVehicle_getForwardVector_0:Go,_emscripten_bind_btRaycastVehicle_getNumWheels_0:MB,_emscripten_bind_btRaycastVehicle_getRightAxis_0:uD,_emscripten_bind_btRaycastVehicle_getRigidBody_0:tD,_emscripten_bind_btRaycastVehicle_getSteeringValue_1:Ax,_emscripten_bind_btRaycastVehicle_getUpAxis_0:WD,_emscripten_bind_btRaycastVehicle_getUserConstraintId_0:AC,_emscripten_bind_btRaycastVehicle_getUserConstraintType_0:iC,_emscripten_bind_btRaycastVehicle_getWheelInfo_1:Yz,_emscripten_bind_btRaycastVehicle_getWheelTransformWS_1:Gy,_emscripten_bind_btRaycastVehicle_rayCast_1:Gz,_emscripten_bind_btRaycastVehicle_resetSuspension_0:Yl,_emscripten_bind_btRaycastVehicle_setBrake_2:Qw,_emscripten_bind_btRaycastVehicle_setCoordinateSystem_3:qu,_emscripten_bind_btRaycastVehicle_setPitchControl_1:Lz,_emscripten_bind_btRaycastVehicle_setSteeringValue_2:fw,_emscripten_bind_btRaycastVehicle_setUserConstraintId_1:Py,_emscripten_bind_btRaycastVehicle_setUserConstraintType_1:Fy,_emscripten_bind_btRaycastVehicle_updateAction_2:aw,_emscripten_bind_btRaycastVehicle_updateFriction_1:vx,_emscripten_bind_btRaycastVehicle_updateSuspension_1:El,_emscripten_bind_btRaycastVehicle_updateVehicle_1:zx,_emscripten_bind_btRaycastVehicle_updateWheelTransform_2:Yt,_emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_1:jv,_emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_2:mu,_emscripten_bind_btRigidBodyConstructionInfo___destroy___0:TD,_emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_3:Zn,_emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_4:qr,_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingFactor_0:uA,_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingThresholdSqr_0:Sz,_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDampingFactor_0:iB,_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDamping_0:RA,_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalLinearDampingThresholdSqr_0:Xz,_emscripten_bind_btRigidBodyConstructionInfo_get_m_angularDamping_0:sC,_emscripten_bind_btRigidBodyConstructionInfo_get_m_angularSleepingThreshold_0:aB,_emscripten_bind_btRigidBodyConstructionInfo_get_m_friction_0:$C,_emscripten_bind_btRigidBodyConstructionInfo_get_m_linearDamping_0:IG,_emscripten_bind_btRigidBodyConstructionInfo_get_m_linearSleepingThreshold_0:hB,_emscripten_bind_btRigidBodyConstructionInfo_get_m_restitution_0:FC,_emscripten_bind_btRigidBodyConstructionInfo_get_m_rollingFriction_0:VB,_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingFactor_1:Cy,_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingThresholdSqr_1:dy,_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDampingFactor_1:qz,_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDamping_1:yz,_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalLinearDampingThresholdSqr_1:hy,_emscripten_bind_btRigidBodyConstructionInfo_set_m_angularDamping_1:SD,_emscripten_bind_btRigidBodyConstructionInfo_set_m_angularSleepingThreshold_1:jz,_emscripten_bind_btRigidBodyConstructionInfo_set_m_friction_1:QA,_emscripten_bind_btRigidBodyConstructionInfo_set_m_linearDamping_1:JE,_emscripten_bind_btRigidBodyConstructionInfo_set_m_linearSleepingThreshold_1:pz,_emscripten_bind_btRigidBodyConstructionInfo_set_m_restitution_1:AA,_emscripten_bind_btRigidBodyConstructionInfo_set_m_rollingFriction_1:hA,_emscripten_bind_btRigidBody___destroy___0:px,_emscripten_bind_btRigidBody_activate_0:ju,_emscripten_bind_btRigidBody_activate_1:Ys,_emscripten_bind_btRigidBody_applyCentralForce_1:Qu,_emscripten_bind_btRigidBody_applyCentralImpulse_1:Au,_emscripten_bind_btRigidBody_applyForce_2:Ox,_emscripten_bind_btRigidBody_applyGravity_0:Lo,_emscripten_bind_btRigidBody_applyImpulse_2:lx,_emscripten_bind_btRigidBody_applyTorqueImpulse_1:Iu,_emscripten_bind_btRigidBody_applyTorque_1:ov,_emscripten_bind_btRigidBody_btRigidBody_1:Kg,_emscripten_bind_btRigidBody_forceActivationState_1:FB,_emscripten_bind_btRigidBody_getAabb_2:zt,_emscripten_bind_btRigidBody_getAngularVelocity_0:CB,_emscripten_bind_btRigidBody_getCenterOfMassTransform_0:fF,_emscripten_bind_btRigidBody_getCollisionFlags_0:JD,_emscripten_bind_btRigidBody_getCollisionShape_0:ID,_emscripten_bind_btRigidBody_getGravity_0:dE,_emscripten_bind_btRigidBody_getLinearVelocity_0:LB,_emscripten_bind_btRigidBody_getMotionState_0:VD,_emscripten_bind_btRigidBody_getUserIndex_0:nE,_emscripten_bind_btRigidBody_getUserPointer_0:cE,_emscripten_bind_btRigidBody_getWorldTransform_0:fF,_emscripten_bind_btRigidBody_isActive_0:ZA,_emscripten_bind_btRigidBody_isKinematicObject_0:Ry,_emscripten_bind_btRigidBody_isStaticObject_0:Kz,_emscripten_bind_btRigidBody_isStaticOrKinematicObject_0:tx,_emscripten_bind_btRigidBody_setActivationState_1:uw,_emscripten_bind_btRigidBody_setAngularFactor_1:Xy,_emscripten_bind_btRigidBody_setAngularVelocity_1:By,_emscripten_bind_btRigidBody_setAnisotropicFriction_2:Lv,_emscripten_bind_btRigidBody_setCcdMotionThreshold_1:Oy,_emscripten_bind_btRigidBody_setCcdSweptSphereRadius_1:xy,_emscripten_bind_btRigidBody_setCenterOfMassTransform_1:hx,_emscripten_bind_btRigidBody_setCollisionFlags_1:wz,_emscripten_bind_btRigidBody_setCollisionShape_1:sx,_emscripten_bind_btRigidBody_setContactProcessingThreshold_1:Uy,_emscripten_bind_btRigidBody_setDamping_2:go,_emscripten_bind_btRigidBody_setFriction_1:YA,_emscripten_bind_btRigidBody_setGravity_1:nn,_emscripten_bind_btRigidBody_setLinearFactor_1:iz,_emscripten_bind_btRigidBody_setLinearVelocity_1:Ly,_emscripten_bind_btRigidBody_setMassProps_2:Qj,_emscripten_bind_btRigidBody_setMotionState_1:Wy,_emscripten_bind_btRigidBody_setRestitution_1:oA,_emscripten_bind_btRigidBody_setRollingFriction_1:Fz,_emscripten_bind_btRigidBody_setSleepingThresholds_2:ux,_emscripten_bind_btRigidBody_setUserIndex_1:tA,_emscripten_bind_btRigidBody_setUserPointer_1:Wz,_emscripten_bind_btRigidBody_setWorldTransform_1:cy,_emscripten_bind_btRigidBody_upcast_1:zA,_emscripten_bind_btRigidBody_updateInertiaTensor_0:Mj,_emscripten_bind_btRotationalLimitMotor___destroy___0:TD,_emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_0:yy,_emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_1:Ew,_emscripten_bind_btRotationalLimitMotor_get_m_enableMotor_0:hC,_emscripten_bind_btRotationalLimitMotor_get_m_hiLimit_0:RG,_emscripten_bind_btRotationalLimitMotor_get_m_loLimit_0:GF,_emscripten_bind_btRotationalLimitMotor_get_m_maxMotorForce_0:VG,_emscripten_bind_btRotationalLimitMotor_get_m_targetVelocity_0:bH,_emscripten_bind_btRotationalLimitMotor_isLimited_0:yx,_emscripten_bind_btRotationalLimitMotor_needApplyTorques_0:Rz,_emscripten_bind_btRotationalLimitMotor_set_m_enableMotor_1:CA,_emscripten_bind_btRotationalLimitMotor_set_m_hiLimit_1:mG,_emscripten_bind_btRotationalLimitMotor_set_m_loLimit_1:MG,_emscripten_bind_btRotationalLimitMotor_set_m_maxMotorForce_1:RF,_emscripten_bind_btRotationalLimitMotor_set_m_targetVelocity_1:lG,_emscripten_bind_btSequentialImpulseConstraintSolver___destroy___0:px,_emscripten_bind_btSequentialImpulseConstraintSolver_btSequentialImpulseConstraintSolver_0:hj,_emscripten_bind_btSliderConstraint___destroy___0:px,_emscripten_bind_btSliderConstraint_btSliderConstraint_3:oe,_emscripten_bind_btSliderConstraint_btSliderConstraint_5:vf,_emscripten_bind_btSliderConstraint_enableFeedback_1:mz,_emscripten_bind_btSliderConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btSliderConstraint_getParam_2:Rv,_emscripten_bind_btSliderConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btSliderConstraint_setLowerAngLimit_1:Vy,_emscripten_bind_btSliderConstraint_setLowerLinLimit_1:Uy,_emscripten_bind_btSliderConstraint_setParam_3:fv,_emscripten_bind_btSliderConstraint_setUpperAngLimit_1:Ty,_emscripten_bind_btSliderConstraint_setUpperLinLimit_1:Sy,_emscripten_bind_btSoftBodyArray___destroy___0:ay,_emscripten_bind_btSoftBodyArray_at_1:tw,_emscripten_bind_btSoftBodyArray_size_0:DF,_emscripten_bind_btSoftBodyHelpers_CreateEllipsoid_4:_g,_emscripten_bind_btSoftBodyHelpers_CreateFromConvexHull_4:Qs,_emscripten_bind_btSoftBodyHelpers_CreateFromTriMesh_5:Od,_emscripten_bind_btSoftBodyHelpers_CreatePatchUV_10:gd,_emscripten_bind_btSoftBodyHelpers_CreatePatch_9:od,_emscripten_bind_btSoftBodyHelpers_CreateRope_5:Lg,_emscripten_bind_btSoftBodyHelpers___destroy___0:TD,_emscripten_bind_btSoftBodyHelpers_btSoftBodyHelpers_0:FH,_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration___destroy___0:px,_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_0:aq,_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_1:As,_emscripten_bind_btSoftBodySolver___destroy___0:px,_emscripten_bind_btSoftBodyWorldInfo___destroy___0:Xx,_emscripten_bind_btSoftBodyWorldInfo_btSoftBodyWorldInfo_0:oz,_emscripten_bind_btSoftBodyWorldInfo_get_air_density_0:GF,_emscripten_bind_btSoftBodyWorldInfo_get_m_broadphase_0:pE,_emscripten_bind_btSoftBodyWorldInfo_get_m_dispatcher_0:oE,_emscripten_bind_btSoftBodyWorldInfo_get_m_gravity_0:eG,_emscripten_bind_btSoftBodyWorldInfo_get_m_maxDisplacement_0:VG,_emscripten_bind_btSoftBodyWorldInfo_get_water_density_0:RG,_emscripten_bind_btSoftBodyWorldInfo_get_water_normal_0:XG,_emscripten_bind_btSoftBodyWorldInfo_get_water_offset_0:bH,_emscripten_bind_btSoftBodyWorldInfo_set_air_density_1:MG,_emscripten_bind_btSoftBodyWorldInfo_set_m_broadphase_1:qB,_emscripten_bind_btSoftBodyWorldInfo_set_m_dispatcher_1:pB,_emscripten_bind_btSoftBodyWorldInfo_set_m_gravity_1:$r,_emscripten_bind_btSoftBodyWorldInfo_set_m_maxDisplacement_1:RF,_emscripten_bind_btSoftBodyWorldInfo_set_water_density_1:mG,_emscripten_bind_btSoftBodyWorldInfo_set_water_normal_1:cs,_emscripten_bind_btSoftBodyWorldInfo_set_water_offset_1:lG,_emscripten_bind_btSoftBody___destroy___0:px,_emscripten_bind_btSoftBody_activate_0:ju,_emscripten_bind_btSoftBody_activate_1:Ys,_emscripten_bind_btSoftBody_appendAnchor_4:Zf,_emscripten_bind_btSoftBody_appendFace_4:dv,_emscripten_bind_btSoftBody_appendLinearJoint_2:df,_emscripten_bind_btSoftBody_appendLink_4:cv,_emscripten_bind_btSoftBody_appendMaterial_0:gD,_emscripten_bind_btSoftBody_appendNode_2:$c,_emscripten_bind_btSoftBody_appendTetra_5:Sf,_emscripten_bind_btSoftBody_btSoftBody_4:Hs,_emscripten_bind_btSoftBody_checkFace_3:Lk,_emscripten_bind_btSoftBody_checkLink_2:Wl,_emscripten_bind_btSoftBody_forceActivationState_1:FB,_emscripten_bind_btSoftBody_generateBendingConstraints_2:_c,_emscripten_bind_btSoftBody_generateClusters_1:xz,_emscripten_bind_btSoftBody_generateClusters_2:Qx,_emscripten_bind_btSoftBody_getCollisionFlags_0:JD,_emscripten_bind_btSoftBody_getCollisionShape_0:ID,_emscripten_bind_btSoftBody_getTotalMass_0:tp,_emscripten_bind_btSoftBody_getUserIndex_0:nE,_emscripten_bind_btSoftBody_getUserPointer_0:cE,_emscripten_bind_btSoftBody_getWorldTransform_0:fF,_emscripten_bind_btSoftBody_get_m_anchors_0:kH,_emscripten_bind_btSoftBody_get_m_cfg_0:EH,_emscripten_bind_btSoftBody_get_m_faces_0:tH,_emscripten_bind_btSoftBody_get_m_links_0:sH,_emscripten_bind_btSoftBody_get_m_materials_0:aH,_emscripten_bind_btSoftBody_get_m_nodes_0:rH,_emscripten_bind_btSoftBody_isActive_0:ZA,_emscripten_bind_btSoftBody_isKinematicObject_0:Ry,_emscripten_bind_btSoftBody_isStaticObject_0:Kz,_emscripten_bind_btSoftBody_isStaticOrKinematicObject_0:tx,_emscripten_bind_btSoftBody_rotate_1:ck,_emscripten_bind_btSoftBody_scale_1:Ve,_emscripten_bind_btSoftBody_setActivationState_1:uw,_emscripten_bind_btSoftBody_setAnisotropicFriction_2:Lv,_emscripten_bind_btSoftBody_setCcdMotionThreshold_1:Oy,_emscripten_bind_btSoftBody_setCcdSweptSphereRadius_1:xy,_emscripten_bind_btSoftBody_setCollisionFlags_1:wz,_emscripten_bind_btSoftBody_setCollisionShape_1:sx,_emscripten_bind_btSoftBody_setContactProcessingThreshold_1:Uy,_emscripten_bind_btSoftBody_setFriction_1:YA,_emscripten_bind_btSoftBody_setMass_2:Ku,_emscripten_bind_btSoftBody_setRestitution_1:oA,_emscripten_bind_btSoftBody_setRollingFriction_1:Fz,_emscripten_bind_btSoftBody_setTotalMass_2:lh,_emscripten_bind_btSoftBody_setUserIndex_1:tA,_emscripten_bind_btSoftBody_setUserPointer_1:Wz,_emscripten_bind_btSoftBody_setWorldTransform_1:cy,_emscripten_bind_btSoftBody_set_m_anchors_1:xx,_emscripten_bind_btSoftBody_set_m_cfg_1:yA,_emscripten_bind_btSoftBody_set_m_faces_1:Wx,_emscripten_bind_btSoftBody_set_m_links_1:Vx,_emscripten_bind_btSoftBody_set_m_materials_1:dx,_emscripten_bind_btSoftBody_set_m_nodes_1:Ux,_emscripten_bind_btSoftBody_transform_1:sA,_emscripten_bind_btSoftBody_translate_1:em,_emscripten_bind_btSoftBody_upcast_1:JA,_emscripten_bind_btSoftRigidDynamicsWorld___destroy___0:px,_emscripten_bind_btSoftRigidDynamicsWorld_addAction_1:Jx,_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_1:Mv,_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_2:ru,_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_3:pt,_emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_1:xw,_emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_2:sv,_emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_1:Rw,_emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_3:kt,_emscripten_bind_btSoftRigidDynamicsWorld_addSoftBody_3:ij,_emscripten_bind_btSoftRigidDynamicsWorld_addVehicle_1:Vw,_emscripten_bind_btSoftRigidDynamicsWorld_btSoftRigidDynamicsWorld_5:zf,_emscripten_bind_btSoftRigidDynamicsWorld_contactPairTest_3:wt,_emscripten_bind_btSoftRigidDynamicsWorld_contactTest_2:tn,_emscripten_bind_btSoftRigidDynamicsWorld_convexSweepTest_5:Qr,_emscripten_bind_btSoftRigidDynamicsWorld_getBroadphase_0:LD,_emscripten_bind_btSoftRigidDynamicsWorld_getDispatchInfo_0:tC,_emscripten_bind_btSoftRigidDynamicsWorld_getDispatcher_0:KD,_emscripten_bind_btSoftRigidDynamicsWorld_getGravity_0:Yo,_emscripten_bind_btSoftRigidDynamicsWorld_getPairCache_0:Tz,_emscripten_bind_btSoftRigidDynamicsWorld_getSoftBodyArray_0:Ez,_emscripten_bind_btSoftRigidDynamicsWorld_getSolverInfo_0:XB,_emscripten_bind_btSoftRigidDynamicsWorld_getWorldInfo_0:LB,_emscripten_bind_btSoftRigidDynamicsWorld_rayTest_3:$u,_emscripten_bind_btSoftRigidDynamicsWorld_removeAction_1:ox,_emscripten_bind_btSoftRigidDynamicsWorld_removeCollisionObject_1:Pw,_emscripten_bind_btSoftRigidDynamicsWorld_removeConstraint_1:Bw,_emscripten_bind_btSoftRigidDynamicsWorld_removeRigidBody_1:Fw,_emscripten_bind_btSoftRigidDynamicsWorld_removeSoftBody_1:ol,_emscripten_bind_btSoftRigidDynamicsWorld_removeVehicle_1:Lw,_emscripten_bind_btSoftRigidDynamicsWorld_setGravity_1:Zw,_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_1:qv,_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_2:vu,_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_3:Bu,_emscripten_bind_btSoftRigidDynamicsWorld_updateSingleAabb_1:nx,_emscripten_bind_btSphereShape___destroy___0:px,_emscripten_bind_btSphereShape_btSphereShape_1:by,_emscripten_bind_btSphereShape_calculateLocalInertia_2:Nv,_emscripten_bind_btSphereShape_getLocalScaling_0:Oz,_emscripten_bind_btSphereShape_getMargin_0:pA,_emscripten_bind_btSphereShape_setLocalScaling_1:Cx,_emscripten_bind_btSphereShape_setMargin_1:Ay,_emscripten_bind_btStaticPlaneShape___destroy___0:px,_emscripten_bind_btStaticPlaneShape_btStaticPlaneShape_2:Vl,_emscripten_bind_btStaticPlaneShape_calculateLocalInertia_2:Nv,_emscripten_bind_btStaticPlaneShape_getLocalScaling_0:Oz,_emscripten_bind_btStaticPlaneShape_setLocalScaling_1:Cx,_emscripten_bind_btStridingMeshInterface___destroy___0:px,_emscripten_bind_btTransform___destroy___0:TD,_emscripten_bind_btTransform_btTransform_0:eI,_emscripten_bind_btTransform_btTransform_2:Iv,_emscripten_bind_btTransform_getBasis_0:qH,_emscripten_bind_btTransform_getOrigin_0:BE,_emscripten_bind_btTransform_getRotation_0:vp,_emscripten_bind_btTransform_setFromOpenGLMatrix_1:nz,_emscripten_bind_btTransform_setIdentity_0:jE,_emscripten_bind_btTransform_setOrigin_1:xA,_emscripten_bind_btTransform_setRotation_1:IA,_emscripten_bind_btTriangleMeshShape___destroy___0:px,_emscripten_bind_btTriangleMeshShape_calculateLocalInertia_2:Nv,_emscripten_bind_btTriangleMeshShape_getLocalScaling_0:Oz,_emscripten_bind_btTriangleMeshShape_setLocalScaling_1:Cx,_emscripten_bind_btTriangleMesh___destroy___0:px,_emscripten_bind_btTriangleMesh_addTriangle_3:Un,_emscripten_bind_btTriangleMesh_addTriangle_4:In,_emscripten_bind_btTriangleMesh_btTriangleMesh_0:rx,_emscripten_bind_btTriangleMesh_btTriangleMesh_1:ew,_emscripten_bind_btTriangleMesh_btTriangleMesh_2:mv,_emscripten_bind_btTypedConstraint___destroy___0:px,_emscripten_bind_btTypedConstraint_enableFeedback_1:mz,_emscripten_bind_btTypedConstraint_getBreakingImpulseThreshold_0:ty,_emscripten_bind_btTypedConstraint_getParam_2:Rv,_emscripten_bind_btTypedConstraint_setBreakingImpulseThreshold_1:hz,_emscripten_bind_btTypedConstraint_setParam_3:fv,_emscripten_bind_btVector3___destroy___0:QB,_emscripten_bind_btVector3_btVector3_0:UH,_emscripten_bind_btVector3_btVector3_3:vq,_emscripten_bind_btVector3_dot_1:Kt,_emscripten_bind_btVector3_length_0:wy,_emscripten_bind_btVector3_normalize_0:AF,_emscripten_bind_btVector3_op_add_1:fD,_emscripten_bind_btVector3_op_mul_1:iu,_emscripten_bind_btVector3_op_sub_1:eD,_emscripten_bind_btVector3_rotate_2:gp,_emscripten_bind_btVector3_setValue_3:hr,_emscripten_bind_btVector3_setX_1:mE,_emscripten_bind_btVector3_setY_1:lE,_emscripten_bind_btVector3_setZ_1:kE,_emscripten_bind_btVector3_x_0:ZF,_emscripten_bind_btVector3_y_0:zE,_emscripten_bind_btVector3_z_0:yE,_emscripten_bind_btVector4___destroy___0:QB,_emscripten_bind_btVector4_btVector4_0:UH,_emscripten_bind_btVector4_btVector4_4:pp,_emscripten_bind_btVector4_dot_1:Kt,_emscripten_bind_btVector4_length_0:wy,_emscripten_bind_btVector4_normalize_0:AF,_emscripten_bind_btVector4_op_add_1:fD,_emscripten_bind_btVector4_op_mul_1:iu,_emscripten_bind_btVector4_op_sub_1:eD,_emscripten_bind_btVector4_rotate_2:fp,_emscripten_bind_btVector4_setValue_4:Tp,_emscripten_bind_btVector4_setX_1:mE,_emscripten_bind_btVector4_setY_1:lE,_emscripten_bind_btVector4_setZ_1:kE,_emscripten_bind_btVector4_w_0:AE,_emscripten_bind_btVector4_x_0:ZF,_emscripten_bind_btVector4_y_0:zE,_emscripten_bind_btVector4_z_0:yE,_emscripten_bind_btVehicleRaycasterResult___destroy___0:TD,_emscripten_bind_btVehicleRaycasterResult_get_m_distFraction_0:TG,_emscripten_bind_btVehicleRaycasterResult_get_m_hitNormalInWorld_0:XG,_emscripten_bind_btVehicleRaycasterResult_get_m_hitPointInWorld_0:gJ,_emscripten_bind_btVehicleRaycasterResult_set_m_distFraction_1:RE,_emscripten_bind_btVehicleRaycasterResult_set_m_hitNormalInWorld_1:cs,_emscripten_bind_btVehicleRaycasterResult_set_m_hitPointInWorld_1:Gs,_emscripten_bind_btVehicleRaycaster___destroy___0:px,_emscripten_bind_btVehicleRaycaster_castRay_3:Pu,_emscripten_bind_btVehicleTuning_btVehicleTuning_0:Ky,_emscripten_bind_btVehicleTuning_get_m_frictionSlip_0:UG,_emscripten_bind_btVehicleTuning_get_m_maxSuspensionForce_0:SG,_emscripten_bind_btVehicleTuning_get_m_maxSuspensionTravelCm_0:VG,_emscripten_bind_btVehicleTuning_get_m_suspensionCompression_0:RG,_emscripten_bind_btVehicleTuning_get_m_suspensionDamping_0:bH,_emscripten_bind_btVehicleTuning_get_m_suspensionStiffness_0:GF,_emscripten_bind_btVehicleTuning_set_m_frictionSlip_1:bF,_emscripten_bind_btVehicleTuning_set_m_maxSuspensionForce_1:QE,_emscripten_bind_btVehicleTuning_set_m_maxSuspensionTravelCm_1:RF,_emscripten_bind_btVehicleTuning_set_m_suspensionCompression_1:mG,_emscripten_bind_btVehicleTuning_set_m_suspensionDamping_1:lG,_emscripten_bind_btVehicleTuning_set_m_suspensionStiffness_1:MG,_emscripten_bind_btWheelInfoConstructionInfo___destroy___0:TD,_emscripten_bind_btWheelInfoConstructionInfo_get_m_bIsFrontWheel_0:oB,_emscripten_bind_btWheelInfoConstructionInfo_get_m_chassisConnectionCS_0:gJ,_emscripten_bind_btWheelInfoConstructionInfo_get_m_frictionSlip_0:OF,_emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionForce_0:LG,_emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionTravelCm_0:gG,_emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionRestLength_0:HG,_emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionStiffness_0:DG,_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelAxleCS_0:iH,_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelDirectionCS_0:XG,_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelRadius_0:hG,_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingCompression_0:CG,_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingRelaxation_0:rG,_emscripten_bind_btWheelInfoConstructionInfo_set_m_bIsFrontWheel_1:Vz,_emscripten_bind_btWheelInfoConstructionInfo_set_m_chassisConnectionCS_1:Gs,_emscripten_bind_btWheelInfoConstructionInfo_set_m_frictionSlip_1:PD,_emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionForce_1:YE,_emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionTravelCm_1:eE,_emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionRestLength_1:kF,_emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionStiffness_1:FE,_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelAxleCS_1:Sr,_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelDirectionCS_1:cs,_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelRadius_1:fE,_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingCompression_1:EE,_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingRelaxation_1:rE,_emscripten_bind_btWheelInfo___destroy___0:TD,_emscripten_bind_btWheelInfo_btWheelInfo_1:$w,_emscripten_bind_btWheelInfo_getSuspensionRestLength_0:iE,_emscripten_bind_btWheelInfo_get_m_bIsFrontWheel_0:sD,_emscripten_bind_btWheelInfo_get_m_brake_0:FF,_emscripten_bind_btWheelInfo_get_m_chassisConnectionPointCS_0:lF,_emscripten_bind_btWheelInfo_get_m_clippedInvContactDotSuspension_0:gC,_emscripten_bind_btWheelInfo_get_m_deltaRotation_0:ME,_emscripten_bind_btWheelInfo_get_m_engineForce_0:eF,_emscripten_bind_btWheelInfo_get_m_frictionSlip_0:_E,_emscripten_bind_btWheelInfo_get_m_maxSuspensionForce_0:bE,_emscripten_bind_btWheelInfo_get_m_maxSuspensionTravelCm_0:HD,_emscripten_bind_btWheelInfo_get_m_raycastInfo_0:gJ,_emscripten_bind_btWheelInfo_get_m_rollInfluence_0:LE,_emscripten_bind_btWheelInfo_get_m_rotation_0:uF,_emscripten_bind_btWheelInfo_get_m_skidInfo_0:tF,_emscripten_bind_btWheelInfo_get_m_steering_0:sF,_emscripten_bind_btWheelInfo_get_m_suspensionRelativeVelocity_0:PC,_emscripten_bind_btWheelInfo_get_m_suspensionRestLength1_0:iE,_emscripten_bind_btWheelInfo_get_m_suspensionStiffness_0:UD,_emscripten_bind_btWheelInfo_get_m_wheelAxleCS_0:uG,_emscripten_bind_btWheelInfo_get_m_wheelDirectionCS_0:SF,_emscripten_bind_btWheelInfo_get_m_wheelsDampingCompression_0:_C,_emscripten_bind_btWheelInfo_get_m_wheelsDampingRelaxation_0:dD,_emscripten_bind_btWheelInfo_get_m_wheelsRadius_0:ZE,_emscripten_bind_btWheelInfo_get_m_wheelsSuspensionForce_0:GD,_emscripten_bind_btWheelInfo_get_m_worldTransform_0:MH,_emscripten_bind_btWheelInfo_set_m_bIsFrontWheel_1:tB,_emscripten_bind_btWheelInfo_set_m_brake_1:cD,_emscripten_bind_btWheelInfo_set_m_chassisConnectionPointCS_1:Jr,_emscripten_bind_btWheelInfo_set_m_clippedInvContactDotSuspension_1:jA,_emscripten_bind_btWheelInfo_set_m_deltaRotation_1:UB,_emscripten_bind_btWheelInfo_set_m_engineForce_1:rC,_emscripten_bind_btWheelInfo_set_m_frictionSlip_1:fC,_emscripten_bind_btWheelInfo_set_m_maxSuspensionForce_1:sB,_emscripten_bind_btWheelInfo_set_m_maxSuspensionTravelCm_1:gB,_emscripten_bind_btWheelInfo_set_m_raycastInfo_1:Et,_emscripten_bind_btWheelInfo_set_m_rollInfluence_1:TB,_emscripten_bind_btWheelInfo_set_m_rotation_1:OC,_emscripten_bind_btWheelInfo_set_m_skidInfo_1:NC,_emscripten_bind_btWheelInfo_set_m_steering_1:MC,_emscripten_bind_btWheelInfo_set_m_suspensionRelativeVelocity_1:dC,_emscripten_bind_btWheelInfo_set_m_suspensionRestLength1_1:fB,_emscripten_bind_btWheelInfo_set_m_suspensionStiffness_1:nB,_emscripten_bind_btWheelInfo_set_m_wheelAxleCS_1:_r,_emscripten_bind_btWheelInfo_set_m_wheelDirectionCS_1:Rr,_emscripten_bind_btWheelInfo_set_m_wheelsDampingCompression_1:PA,_emscripten_bind_btWheelInfo_set_m_wheelsDampingRelaxation_1:XA,_emscripten_bind_btWheelInfo_set_m_wheelsRadius_1:eC,_emscripten_bind_btWheelInfo_set_m_wheelsSuspensionForce_1:yC,_emscripten_bind_btWheelInfo_set_m_worldTransform_1:gA,_emscripten_bind_btWheelInfo_updateWheel_2:Zi,_emscripten_bind_tAnchorArray___destroy___0:ay,_emscripten_bind_tAnchorArray_at_1:ls,_emscripten_bind_tAnchorArray_clear_0:qC,_emscripten_bind_tAnchorArray_pop_back_0:HA,_emscripten_bind_tAnchorArray_push_back_1:Tx,_emscripten_bind_tAnchorArray_size_0:DF,_emscripten_bind_tFaceArray___destroy___0:ay,_emscripten_bind_tFaceArray_at_1:Nx,_emscripten_bind_tFaceArray_size_0:DF,_emscripten_bind_tLinkArray___destroy___0:ay,_emscripten_bind_tLinkArray_at_1:Mx,_emscripten_bind_tLinkArray_size_0:DF,_emscripten_bind_tMaterialArray___destroy___0:ay,_emscripten_bind_tMaterialArray_at_1:tw,_emscripten_bind_tMaterialArray_size_0:DF,_emscripten_bind_tNodeArray___destroy___0:ay,_emscripten_bind_tNodeArray_at_1:Lx,_emscripten_bind_tNodeArray_size_0:DF,_emscripten_enum_PHY_ScalarType_PHY_DOUBLE:RI,_emscripten_enum_PHY_ScalarType_PHY_FIXEDPOINT88:FI,_emscripten_enum_PHY_ScalarType_PHY_FLOAT:kJ,_emscripten_enum_PHY_ScalarType_PHY_INTEGER:QI,_emscripten_enum_PHY_ScalarType_PHY_SHORT:TI,_emscripten_enum_PHY_ScalarType_PHY_UCHAR:SI,_emscripten_enum_btConstraintParams_BT_CONSTRAINT_CFM:TI,_emscripten_enum_btConstraintParams_BT_CONSTRAINT_ERP:RI,_emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_CFM:FI,_emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_ERP:QI,_free:Cd,_i64Add:Ow,_i64Subtract:sw,_llvm_bswap_i16:JH,_llvm_bswap_i32:KB,_malloc:sc,_memcpy:gi,_memmove:$p,_memset:Yk,_sbrk:_o,dynCall_di:dG,dynCall_did:ED,dynCall_diidii:zv,dynCall_diii:vz,dynCall_diiidii:hu,dynCall_diiii:Yw,dynCall_diiiii:lv,dynCall_diiiiiiii:bs,dynCall_diiiiiiiii:or,dynCall_diiiiiiiiii:zq,dynCall_ii:IF,dynCall_iidid:Hx,dynCall_iii:SB,dynCall_iiid:Qz,dynCall_iiii:az,dynCall_iiiii:Jw,dynCall_iiiiii:gv,dynCall_iiiiiii:Qt,dynCall_iiiiiiiii:Yr,dynCall_iiiiiiiiiii:xq,dynCall_v:PI,dynCall_vi:eH,dynCall_vid:wE,dynCall_vidd:yB,dynCall_viddiii:Xu,dynCall_vidi:NA,dynCall_vidii:gy,dynCall_vii:DD,dynCall_viid:WA,dynCall_viidi:fy,dynCall_viidii:Xv,dynCall_viii:eA,dynCall_viiid:$x,dynCall_viiidii:Hu,dynCall_viiii:kx,dynCall_viiiid:Wv,dynCall_viiiidddddidi:fq,dynCall_viiiiddddiid:Kq,dynCall_viiiii:Ev,dynCall_viiiiid:Gu,dynCall_viiiiii:ou,dynCall_viiiiiii:ft,dynCall_viiiiiiiii:zr,dynCall_viiiiiiiiii:Nq,establishStackSpace:tG,getTempRet0:hJ,runPostSets:hI,setTempRet0:dJ,setThrew:rD,stackAlloc:rA,stackRestore:bJ,stackSave:iJ}}) + + +// EMSCRIPTEN_END_ASM +(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var __GLOBAL__sub_I_btConeTwistConstraint_cpp=Module["__GLOBAL__sub_I_btConeTwistConstraint_cpp"]=asm["__GLOBAL__sub_I_btConeTwistConstraint_cpp"];var __GLOBAL__sub_I_btQuickprof_cpp=Module["__GLOBAL__sub_I_btQuickprof_cpp"]=asm["__GLOBAL__sub_I_btQuickprof_cpp"];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 ___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_Anchor___destroy___0=Module["_emscripten_bind_Anchor___destroy___0"]=asm["_emscripten_bind_Anchor___destroy___0"];var _emscripten_bind_Anchor_get_m_body_0=Module["_emscripten_bind_Anchor_get_m_body_0"]=asm["_emscripten_bind_Anchor_get_m_body_0"];var _emscripten_bind_Anchor_get_m_c0_0=Module["_emscripten_bind_Anchor_get_m_c0_0"]=asm["_emscripten_bind_Anchor_get_m_c0_0"];var _emscripten_bind_Anchor_get_m_c1_0=Module["_emscripten_bind_Anchor_get_m_c1_0"]=asm["_emscripten_bind_Anchor_get_m_c1_0"];var _emscripten_bind_Anchor_get_m_c2_0=Module["_emscripten_bind_Anchor_get_m_c2_0"]=asm["_emscripten_bind_Anchor_get_m_c2_0"];var _emscripten_bind_Anchor_get_m_influence_0=Module["_emscripten_bind_Anchor_get_m_influence_0"]=asm["_emscripten_bind_Anchor_get_m_influence_0"];var _emscripten_bind_Anchor_get_m_local_0=Module["_emscripten_bind_Anchor_get_m_local_0"]=asm["_emscripten_bind_Anchor_get_m_local_0"];var _emscripten_bind_Anchor_get_m_node_0=Module["_emscripten_bind_Anchor_get_m_node_0"]=asm["_emscripten_bind_Anchor_get_m_node_0"];var _emscripten_bind_Anchor_set_m_body_1=Module["_emscripten_bind_Anchor_set_m_body_1"]=asm["_emscripten_bind_Anchor_set_m_body_1"];var _emscripten_bind_Anchor_set_m_c0_1=Module["_emscripten_bind_Anchor_set_m_c0_1"]=asm["_emscripten_bind_Anchor_set_m_c0_1"];var _emscripten_bind_Anchor_set_m_c1_1=Module["_emscripten_bind_Anchor_set_m_c1_1"]=asm["_emscripten_bind_Anchor_set_m_c1_1"];var _emscripten_bind_Anchor_set_m_c2_1=Module["_emscripten_bind_Anchor_set_m_c2_1"]=asm["_emscripten_bind_Anchor_set_m_c2_1"];var _emscripten_bind_Anchor_set_m_influence_1=Module["_emscripten_bind_Anchor_set_m_influence_1"]=asm["_emscripten_bind_Anchor_set_m_influence_1"];var _emscripten_bind_Anchor_set_m_local_1=Module["_emscripten_bind_Anchor_set_m_local_1"]=asm["_emscripten_bind_Anchor_set_m_local_1"];var _emscripten_bind_Anchor_set_m_node_1=Module["_emscripten_bind_Anchor_set_m_node_1"]=asm["_emscripten_bind_Anchor_set_m_node_1"];var _emscripten_bind_ClosestConvexResultCallback_ClosestConvexResultCallback_2=Module["_emscripten_bind_ClosestConvexResultCallback_ClosestConvexResultCallback_2"]=asm["_emscripten_bind_ClosestConvexResultCallback_ClosestConvexResultCallback_2"];var _emscripten_bind_ClosestConvexResultCallback___destroy___0=Module["_emscripten_bind_ClosestConvexResultCallback___destroy___0"]=asm["_emscripten_bind_ClosestConvexResultCallback___destroy___0"];var _emscripten_bind_ClosestConvexResultCallback_get_m_closestHitFraction_0=Module["_emscripten_bind_ClosestConvexResultCallback_get_m_closestHitFraction_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_get_m_closestHitFraction_0"];var _emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterGroup_0=Module["_emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterGroup_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterGroup_0"];var _emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterMask_0=Module["_emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterMask_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterMask_0"];var _emscripten_bind_ClosestConvexResultCallback_get_m_convexFromWorld_0=Module["_emscripten_bind_ClosestConvexResultCallback_get_m_convexFromWorld_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_get_m_convexFromWorld_0"];var _emscripten_bind_ClosestConvexResultCallback_get_m_convexToWorld_0=Module["_emscripten_bind_ClosestConvexResultCallback_get_m_convexToWorld_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_get_m_convexToWorld_0"];var _emscripten_bind_ClosestConvexResultCallback_get_m_hitNormalWorld_0=Module["_emscripten_bind_ClosestConvexResultCallback_get_m_hitNormalWorld_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_get_m_hitNormalWorld_0"];var _emscripten_bind_ClosestConvexResultCallback_get_m_hitPointWorld_0=Module["_emscripten_bind_ClosestConvexResultCallback_get_m_hitPointWorld_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_get_m_hitPointWorld_0"];var _emscripten_bind_ClosestConvexResultCallback_hasHit_0=Module["_emscripten_bind_ClosestConvexResultCallback_hasHit_0"]=asm["_emscripten_bind_ClosestConvexResultCallback_hasHit_0"];var _emscripten_bind_ClosestConvexResultCallback_set_m_closestHitFraction_1=Module["_emscripten_bind_ClosestConvexResultCallback_set_m_closestHitFraction_1"]=asm["_emscripten_bind_ClosestConvexResultCallback_set_m_closestHitFraction_1"];var _emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterGroup_1=Module["_emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterGroup_1"]=asm["_emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterGroup_1"];var _emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterMask_1=Module["_emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterMask_1"]=asm["_emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterMask_1"];var _emscripten_bind_ClosestConvexResultCallback_set_m_convexFromWorld_1=Module["_emscripten_bind_ClosestConvexResultCallback_set_m_convexFromWorld_1"]=asm["_emscripten_bind_ClosestConvexResultCallback_set_m_convexFromWorld_1"];var _emscripten_bind_ClosestConvexResultCallback_set_m_convexToWorld_1=Module["_emscripten_bind_ClosestConvexResultCallback_set_m_convexToWorld_1"]=asm["_emscripten_bind_ClosestConvexResultCallback_set_m_convexToWorld_1"];var _emscripten_bind_ClosestConvexResultCallback_set_m_hitNormalWorld_1=Module["_emscripten_bind_ClosestConvexResultCallback_set_m_hitNormalWorld_1"]=asm["_emscripten_bind_ClosestConvexResultCallback_set_m_hitNormalWorld_1"];var _emscripten_bind_ClosestConvexResultCallback_set_m_hitPointWorld_1=Module["_emscripten_bind_ClosestConvexResultCallback_set_m_hitPointWorld_1"]=asm["_emscripten_bind_ClosestConvexResultCallback_set_m_hitPointWorld_1"];var _emscripten_bind_ClosestRayResultCallback_ClosestRayResultCallback_2=Module["_emscripten_bind_ClosestRayResultCallback_ClosestRayResultCallback_2"]=asm["_emscripten_bind_ClosestRayResultCallback_ClosestRayResultCallback_2"];var _emscripten_bind_ClosestRayResultCallback___destroy___0=Module["_emscripten_bind_ClosestRayResultCallback___destroy___0"]=asm["_emscripten_bind_ClosestRayResultCallback___destroy___0"];var _emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterGroup_0=Module["_emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterGroup_0"]=asm["_emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterGroup_0"];var _emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterMask_0=Module["_emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterMask_0"]=asm["_emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterMask_0"];var _emscripten_bind_ClosestRayResultCallback_get_m_collisionObject_0=Module["_emscripten_bind_ClosestRayResultCallback_get_m_collisionObject_0"]=asm["_emscripten_bind_ClosestRayResultCallback_get_m_collisionObject_0"];var _emscripten_bind_ClosestRayResultCallback_get_m_hitNormalWorld_0=Module["_emscripten_bind_ClosestRayResultCallback_get_m_hitNormalWorld_0"]=asm["_emscripten_bind_ClosestRayResultCallback_get_m_hitNormalWorld_0"];var _emscripten_bind_ClosestRayResultCallback_get_m_hitPointWorld_0=Module["_emscripten_bind_ClosestRayResultCallback_get_m_hitPointWorld_0"]=asm["_emscripten_bind_ClosestRayResultCallback_get_m_hitPointWorld_0"];var _emscripten_bind_ClosestRayResultCallback_get_m_rayFromWorld_0=Module["_emscripten_bind_ClosestRayResultCallback_get_m_rayFromWorld_0"]=asm["_emscripten_bind_ClosestRayResultCallback_get_m_rayFromWorld_0"];var _emscripten_bind_ClosestRayResultCallback_get_m_rayToWorld_0=Module["_emscripten_bind_ClosestRayResultCallback_get_m_rayToWorld_0"]=asm["_emscripten_bind_ClosestRayResultCallback_get_m_rayToWorld_0"];var _emscripten_bind_ClosestRayResultCallback_hasHit_0=Module["_emscripten_bind_ClosestRayResultCallback_hasHit_0"]=asm["_emscripten_bind_ClosestRayResultCallback_hasHit_0"];var _emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterGroup_1=Module["_emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterGroup_1"]=asm["_emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterGroup_1"];var _emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterMask_1=Module["_emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterMask_1"]=asm["_emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterMask_1"];var _emscripten_bind_ClosestRayResultCallback_set_m_collisionObject_1=Module["_emscripten_bind_ClosestRayResultCallback_set_m_collisionObject_1"]=asm["_emscripten_bind_ClosestRayResultCallback_set_m_collisionObject_1"];var _emscripten_bind_ClosestRayResultCallback_set_m_hitNormalWorld_1=Module["_emscripten_bind_ClosestRayResultCallback_set_m_hitNormalWorld_1"]=asm["_emscripten_bind_ClosestRayResultCallback_set_m_hitNormalWorld_1"];var _emscripten_bind_ClosestRayResultCallback_set_m_hitPointWorld_1=Module["_emscripten_bind_ClosestRayResultCallback_set_m_hitPointWorld_1"]=asm["_emscripten_bind_ClosestRayResultCallback_set_m_hitPointWorld_1"];var _emscripten_bind_ClosestRayResultCallback_set_m_rayFromWorld_1=Module["_emscripten_bind_ClosestRayResultCallback_set_m_rayFromWorld_1"]=asm["_emscripten_bind_ClosestRayResultCallback_set_m_rayFromWorld_1"];var _emscripten_bind_ClosestRayResultCallback_set_m_rayToWorld_1=Module["_emscripten_bind_ClosestRayResultCallback_set_m_rayToWorld_1"]=asm["_emscripten_bind_ClosestRayResultCallback_set_m_rayToWorld_1"];var _emscripten_bind_ConcreteContactResultCallback_ConcreteContactResultCallback_0=Module["_emscripten_bind_ConcreteContactResultCallback_ConcreteContactResultCallback_0"]=asm["_emscripten_bind_ConcreteContactResultCallback_ConcreteContactResultCallback_0"];var _emscripten_bind_ConcreteContactResultCallback___destroy___0=Module["_emscripten_bind_ConcreteContactResultCallback___destroy___0"]=asm["_emscripten_bind_ConcreteContactResultCallback___destroy___0"];var _emscripten_bind_ConcreteContactResultCallback_addSingleResult_7=Module["_emscripten_bind_ConcreteContactResultCallback_addSingleResult_7"]=asm["_emscripten_bind_ConcreteContactResultCallback_addSingleResult_7"];var _emscripten_bind_Config___destroy___0=Module["_emscripten_bind_Config___destroy___0"]=asm["_emscripten_bind_Config___destroy___0"];var _emscripten_bind_Config_get_citerations_0=Module["_emscripten_bind_Config_get_citerations_0"]=asm["_emscripten_bind_Config_get_citerations_0"];var _emscripten_bind_Config_get_collisions_0=Module["_emscripten_bind_Config_get_collisions_0"]=asm["_emscripten_bind_Config_get_collisions_0"];var _emscripten_bind_Config_get_diterations_0=Module["_emscripten_bind_Config_get_diterations_0"]=asm["_emscripten_bind_Config_get_diterations_0"];var _emscripten_bind_Config_get_kAHR_0=Module["_emscripten_bind_Config_get_kAHR_0"]=asm["_emscripten_bind_Config_get_kAHR_0"];var _emscripten_bind_Config_get_kCHR_0=Module["_emscripten_bind_Config_get_kCHR_0"]=asm["_emscripten_bind_Config_get_kCHR_0"];var _emscripten_bind_Config_get_kDF_0=Module["_emscripten_bind_Config_get_kDF_0"]=asm["_emscripten_bind_Config_get_kDF_0"];var _emscripten_bind_Config_get_kDG_0=Module["_emscripten_bind_Config_get_kDG_0"]=asm["_emscripten_bind_Config_get_kDG_0"];var _emscripten_bind_Config_get_kDP_0=Module["_emscripten_bind_Config_get_kDP_0"]=asm["_emscripten_bind_Config_get_kDP_0"];var _emscripten_bind_Config_get_kKHR_0=Module["_emscripten_bind_Config_get_kKHR_0"]=asm["_emscripten_bind_Config_get_kKHR_0"];var _emscripten_bind_Config_get_kLF_0=Module["_emscripten_bind_Config_get_kLF_0"]=asm["_emscripten_bind_Config_get_kLF_0"];var _emscripten_bind_Config_get_kMT_0=Module["_emscripten_bind_Config_get_kMT_0"]=asm["_emscripten_bind_Config_get_kMT_0"];var _emscripten_bind_Config_get_kPR_0=Module["_emscripten_bind_Config_get_kPR_0"]=asm["_emscripten_bind_Config_get_kPR_0"];var _emscripten_bind_Config_get_kSHR_0=Module["_emscripten_bind_Config_get_kSHR_0"]=asm["_emscripten_bind_Config_get_kSHR_0"];var _emscripten_bind_Config_get_kSKHR_CL_0=Module["_emscripten_bind_Config_get_kSKHR_CL_0"]=asm["_emscripten_bind_Config_get_kSKHR_CL_0"];var _emscripten_bind_Config_get_kSK_SPLT_CL_0=Module["_emscripten_bind_Config_get_kSK_SPLT_CL_0"]=asm["_emscripten_bind_Config_get_kSK_SPLT_CL_0"];var _emscripten_bind_Config_get_kSRHR_CL_0=Module["_emscripten_bind_Config_get_kSRHR_CL_0"]=asm["_emscripten_bind_Config_get_kSRHR_CL_0"];var _emscripten_bind_Config_get_kSR_SPLT_CL_0=Module["_emscripten_bind_Config_get_kSR_SPLT_CL_0"]=asm["_emscripten_bind_Config_get_kSR_SPLT_CL_0"];var _emscripten_bind_Config_get_kSSHR_CL_0=Module["_emscripten_bind_Config_get_kSSHR_CL_0"]=asm["_emscripten_bind_Config_get_kSSHR_CL_0"];var _emscripten_bind_Config_get_kSS_SPLT_CL_0=Module["_emscripten_bind_Config_get_kSS_SPLT_CL_0"]=asm["_emscripten_bind_Config_get_kSS_SPLT_CL_0"];var _emscripten_bind_Config_get_kVCF_0=Module["_emscripten_bind_Config_get_kVCF_0"]=asm["_emscripten_bind_Config_get_kVCF_0"];var _emscripten_bind_Config_get_kVC_0=Module["_emscripten_bind_Config_get_kVC_0"]=asm["_emscripten_bind_Config_get_kVC_0"];var _emscripten_bind_Config_get_maxvolume_0=Module["_emscripten_bind_Config_get_maxvolume_0"]=asm["_emscripten_bind_Config_get_maxvolume_0"];var _emscripten_bind_Config_get_piterations_0=Module["_emscripten_bind_Config_get_piterations_0"]=asm["_emscripten_bind_Config_get_piterations_0"];var _emscripten_bind_Config_get_timescale_0=Module["_emscripten_bind_Config_get_timescale_0"]=asm["_emscripten_bind_Config_get_timescale_0"];var _emscripten_bind_Config_get_viterations_0=Module["_emscripten_bind_Config_get_viterations_0"]=asm["_emscripten_bind_Config_get_viterations_0"];var _emscripten_bind_Config_set_citerations_1=Module["_emscripten_bind_Config_set_citerations_1"]=asm["_emscripten_bind_Config_set_citerations_1"];var _emscripten_bind_Config_set_collisions_1=Module["_emscripten_bind_Config_set_collisions_1"]=asm["_emscripten_bind_Config_set_collisions_1"];var _emscripten_bind_Config_set_diterations_1=Module["_emscripten_bind_Config_set_diterations_1"]=asm["_emscripten_bind_Config_set_diterations_1"];var _emscripten_bind_Config_set_kAHR_1=Module["_emscripten_bind_Config_set_kAHR_1"]=asm["_emscripten_bind_Config_set_kAHR_1"];var _emscripten_bind_Config_set_kCHR_1=Module["_emscripten_bind_Config_set_kCHR_1"]=asm["_emscripten_bind_Config_set_kCHR_1"];var _emscripten_bind_Config_set_kDF_1=Module["_emscripten_bind_Config_set_kDF_1"]=asm["_emscripten_bind_Config_set_kDF_1"];var _emscripten_bind_Config_set_kDG_1=Module["_emscripten_bind_Config_set_kDG_1"]=asm["_emscripten_bind_Config_set_kDG_1"];var _emscripten_bind_Config_set_kDP_1=Module["_emscripten_bind_Config_set_kDP_1"]=asm["_emscripten_bind_Config_set_kDP_1"];var _emscripten_bind_Config_set_kKHR_1=Module["_emscripten_bind_Config_set_kKHR_1"]=asm["_emscripten_bind_Config_set_kKHR_1"];var _emscripten_bind_Config_set_kLF_1=Module["_emscripten_bind_Config_set_kLF_1"]=asm["_emscripten_bind_Config_set_kLF_1"];var _emscripten_bind_Config_set_kMT_1=Module["_emscripten_bind_Config_set_kMT_1"]=asm["_emscripten_bind_Config_set_kMT_1"];var _emscripten_bind_Config_set_kPR_1=Module["_emscripten_bind_Config_set_kPR_1"]=asm["_emscripten_bind_Config_set_kPR_1"];var _emscripten_bind_Config_set_kSHR_1=Module["_emscripten_bind_Config_set_kSHR_1"]=asm["_emscripten_bind_Config_set_kSHR_1"];var _emscripten_bind_Config_set_kSKHR_CL_1=Module["_emscripten_bind_Config_set_kSKHR_CL_1"]=asm["_emscripten_bind_Config_set_kSKHR_CL_1"];var _emscripten_bind_Config_set_kSK_SPLT_CL_1=Module["_emscripten_bind_Config_set_kSK_SPLT_CL_1"]=asm["_emscripten_bind_Config_set_kSK_SPLT_CL_1"];var _emscripten_bind_Config_set_kSRHR_CL_1=Module["_emscripten_bind_Config_set_kSRHR_CL_1"]=asm["_emscripten_bind_Config_set_kSRHR_CL_1"];var _emscripten_bind_Config_set_kSR_SPLT_CL_1=Module["_emscripten_bind_Config_set_kSR_SPLT_CL_1"]=asm["_emscripten_bind_Config_set_kSR_SPLT_CL_1"];var _emscripten_bind_Config_set_kSSHR_CL_1=Module["_emscripten_bind_Config_set_kSSHR_CL_1"]=asm["_emscripten_bind_Config_set_kSSHR_CL_1"];var _emscripten_bind_Config_set_kSS_SPLT_CL_1=Module["_emscripten_bind_Config_set_kSS_SPLT_CL_1"]=asm["_emscripten_bind_Config_set_kSS_SPLT_CL_1"];var _emscripten_bind_Config_set_kVCF_1=Module["_emscripten_bind_Config_set_kVCF_1"]=asm["_emscripten_bind_Config_set_kVCF_1"];var _emscripten_bind_Config_set_kVC_1=Module["_emscripten_bind_Config_set_kVC_1"]=asm["_emscripten_bind_Config_set_kVC_1"];var _emscripten_bind_Config_set_maxvolume_1=Module["_emscripten_bind_Config_set_maxvolume_1"]=asm["_emscripten_bind_Config_set_maxvolume_1"];var _emscripten_bind_Config_set_piterations_1=Module["_emscripten_bind_Config_set_piterations_1"]=asm["_emscripten_bind_Config_set_piterations_1"];var _emscripten_bind_Config_set_timescale_1=Module["_emscripten_bind_Config_set_timescale_1"]=asm["_emscripten_bind_Config_set_timescale_1"];var _emscripten_bind_Config_set_viterations_1=Module["_emscripten_bind_Config_set_viterations_1"]=asm["_emscripten_bind_Config_set_viterations_1"];var _emscripten_bind_ContactResultCallback___destroy___0=Module["_emscripten_bind_ContactResultCallback___destroy___0"]=asm["_emscripten_bind_ContactResultCallback___destroy___0"];var _emscripten_bind_ContactResultCallback_addSingleResult_7=Module["_emscripten_bind_ContactResultCallback_addSingleResult_7"]=asm["_emscripten_bind_ContactResultCallback_addSingleResult_7"];var _emscripten_bind_ConvexResultCallback___destroy___0=Module["_emscripten_bind_ConvexResultCallback___destroy___0"]=asm["_emscripten_bind_ConvexResultCallback___destroy___0"];var _emscripten_bind_ConvexResultCallback_get_m_closestHitFraction_0=Module["_emscripten_bind_ConvexResultCallback_get_m_closestHitFraction_0"]=asm["_emscripten_bind_ConvexResultCallback_get_m_closestHitFraction_0"];var _emscripten_bind_ConvexResultCallback_get_m_collisionFilterGroup_0=Module["_emscripten_bind_ConvexResultCallback_get_m_collisionFilterGroup_0"]=asm["_emscripten_bind_ConvexResultCallback_get_m_collisionFilterGroup_0"];var _emscripten_bind_ConvexResultCallback_get_m_collisionFilterMask_0=Module["_emscripten_bind_ConvexResultCallback_get_m_collisionFilterMask_0"]=asm["_emscripten_bind_ConvexResultCallback_get_m_collisionFilterMask_0"];var _emscripten_bind_ConvexResultCallback_hasHit_0=Module["_emscripten_bind_ConvexResultCallback_hasHit_0"]=asm["_emscripten_bind_ConvexResultCallback_hasHit_0"];var _emscripten_bind_ConvexResultCallback_set_m_closestHitFraction_1=Module["_emscripten_bind_ConvexResultCallback_set_m_closestHitFraction_1"]=asm["_emscripten_bind_ConvexResultCallback_set_m_closestHitFraction_1"];var _emscripten_bind_ConvexResultCallback_set_m_collisionFilterGroup_1=Module["_emscripten_bind_ConvexResultCallback_set_m_collisionFilterGroup_1"]=asm["_emscripten_bind_ConvexResultCallback_set_m_collisionFilterGroup_1"];var _emscripten_bind_ConvexResultCallback_set_m_collisionFilterMask_1=Module["_emscripten_bind_ConvexResultCallback_set_m_collisionFilterMask_1"]=asm["_emscripten_bind_ConvexResultCallback_set_m_collisionFilterMask_1"];var _emscripten_bind_Face___destroy___0=Module["_emscripten_bind_Face___destroy___0"]=asm["_emscripten_bind_Face___destroy___0"];var _emscripten_bind_Face_get_m_n_1=Module["_emscripten_bind_Face_get_m_n_1"]=asm["_emscripten_bind_Face_get_m_n_1"];var _emscripten_bind_Face_get_m_normal_0=Module["_emscripten_bind_Face_get_m_normal_0"]=asm["_emscripten_bind_Face_get_m_normal_0"];var _emscripten_bind_Face_set_m_n_2=Module["_emscripten_bind_Face_set_m_n_2"]=asm["_emscripten_bind_Face_set_m_n_2"];var _emscripten_bind_Face_set_m_normal_1=Module["_emscripten_bind_Face_set_m_normal_1"]=asm["_emscripten_bind_Face_set_m_normal_1"];var _emscripten_bind_Joint___destroy___0=Module["_emscripten_bind_Joint___destroy___0"]=asm["_emscripten_bind_Joint___destroy___0"];var _emscripten_bind_Joint_get_m_cfm_0=Module["_emscripten_bind_Joint_get_m_cfm_0"]=asm["_emscripten_bind_Joint_get_m_cfm_0"];var _emscripten_bind_Joint_get_m_delete_0=Module["_emscripten_bind_Joint_get_m_delete_0"]=asm["_emscripten_bind_Joint_get_m_delete_0"];var _emscripten_bind_Joint_get_m_drift_0=Module["_emscripten_bind_Joint_get_m_drift_0"]=asm["_emscripten_bind_Joint_get_m_drift_0"];var _emscripten_bind_Joint_get_m_erp_0=Module["_emscripten_bind_Joint_get_m_erp_0"]=asm["_emscripten_bind_Joint_get_m_erp_0"];var _emscripten_bind_Joint_get_m_massmatrix_0=Module["_emscripten_bind_Joint_get_m_massmatrix_0"]=asm["_emscripten_bind_Joint_get_m_massmatrix_0"];var _emscripten_bind_Joint_get_m_refs_1=Module["_emscripten_bind_Joint_get_m_refs_1"]=asm["_emscripten_bind_Joint_get_m_refs_1"];var _emscripten_bind_Joint_get_m_sdrift_0=Module["_emscripten_bind_Joint_get_m_sdrift_0"]=asm["_emscripten_bind_Joint_get_m_sdrift_0"];var _emscripten_bind_Joint_get_m_split_0=Module["_emscripten_bind_Joint_get_m_split_0"]=asm["_emscripten_bind_Joint_get_m_split_0"];var _emscripten_bind_Joint_set_m_cfm_1=Module["_emscripten_bind_Joint_set_m_cfm_1"]=asm["_emscripten_bind_Joint_set_m_cfm_1"];var _emscripten_bind_Joint_set_m_delete_1=Module["_emscripten_bind_Joint_set_m_delete_1"]=asm["_emscripten_bind_Joint_set_m_delete_1"];var _emscripten_bind_Joint_set_m_drift_1=Module["_emscripten_bind_Joint_set_m_drift_1"]=asm["_emscripten_bind_Joint_set_m_drift_1"];var _emscripten_bind_Joint_set_m_erp_1=Module["_emscripten_bind_Joint_set_m_erp_1"]=asm["_emscripten_bind_Joint_set_m_erp_1"];var _emscripten_bind_Joint_set_m_massmatrix_1=Module["_emscripten_bind_Joint_set_m_massmatrix_1"]=asm["_emscripten_bind_Joint_set_m_massmatrix_1"];var _emscripten_bind_Joint_set_m_refs_2=Module["_emscripten_bind_Joint_set_m_refs_2"]=asm["_emscripten_bind_Joint_set_m_refs_2"];var _emscripten_bind_Joint_set_m_sdrift_1=Module["_emscripten_bind_Joint_set_m_sdrift_1"]=asm["_emscripten_bind_Joint_set_m_sdrift_1"];var _emscripten_bind_Joint_set_m_split_1=Module["_emscripten_bind_Joint_set_m_split_1"]=asm["_emscripten_bind_Joint_set_m_split_1"];var _emscripten_bind_LJoint___destroy___0=Module["_emscripten_bind_LJoint___destroy___0"]=asm["_emscripten_bind_LJoint___destroy___0"];var _emscripten_bind_LJoint_get_m_rpos_1=Module["_emscripten_bind_LJoint_get_m_rpos_1"]=asm["_emscripten_bind_LJoint_get_m_rpos_1"];var _emscripten_bind_LJoint_set_m_rpos_2=Module["_emscripten_bind_LJoint_set_m_rpos_2"]=asm["_emscripten_bind_LJoint_set_m_rpos_2"];var _emscripten_bind_Link___destroy___0=Module["_emscripten_bind_Link___destroy___0"]=asm["_emscripten_bind_Link___destroy___0"];var _emscripten_bind_Link_get_m_n_1=Module["_emscripten_bind_Link_get_m_n_1"]=asm["_emscripten_bind_Link_get_m_n_1"];var _emscripten_bind_Link_set_m_n_2=Module["_emscripten_bind_Link_set_m_n_2"]=asm["_emscripten_bind_Link_set_m_n_2"];var _emscripten_bind_LocalConvexResult_LocalConvexResult_5=Module["_emscripten_bind_LocalConvexResult_LocalConvexResult_5"]=asm["_emscripten_bind_LocalConvexResult_LocalConvexResult_5"];var _emscripten_bind_LocalConvexResult___destroy___0=Module["_emscripten_bind_LocalConvexResult___destroy___0"]=asm["_emscripten_bind_LocalConvexResult___destroy___0"];var _emscripten_bind_LocalConvexResult_get_m_hitCollisionObject_0=Module["_emscripten_bind_LocalConvexResult_get_m_hitCollisionObject_0"]=asm["_emscripten_bind_LocalConvexResult_get_m_hitCollisionObject_0"];var _emscripten_bind_LocalConvexResult_get_m_hitFraction_0=Module["_emscripten_bind_LocalConvexResult_get_m_hitFraction_0"]=asm["_emscripten_bind_LocalConvexResult_get_m_hitFraction_0"];var _emscripten_bind_LocalConvexResult_get_m_hitNormalLocal_0=Module["_emscripten_bind_LocalConvexResult_get_m_hitNormalLocal_0"]=asm["_emscripten_bind_LocalConvexResult_get_m_hitNormalLocal_0"];var _emscripten_bind_LocalConvexResult_get_m_hitPointLocal_0=Module["_emscripten_bind_LocalConvexResult_get_m_hitPointLocal_0"]=asm["_emscripten_bind_LocalConvexResult_get_m_hitPointLocal_0"];var _emscripten_bind_LocalConvexResult_get_m_localShapeInfo_0=Module["_emscripten_bind_LocalConvexResult_get_m_localShapeInfo_0"]=asm["_emscripten_bind_LocalConvexResult_get_m_localShapeInfo_0"];var _emscripten_bind_LocalConvexResult_set_m_hitCollisionObject_1=Module["_emscripten_bind_LocalConvexResult_set_m_hitCollisionObject_1"]=asm["_emscripten_bind_LocalConvexResult_set_m_hitCollisionObject_1"];var _emscripten_bind_LocalConvexResult_set_m_hitFraction_1=Module["_emscripten_bind_LocalConvexResult_set_m_hitFraction_1"]=asm["_emscripten_bind_LocalConvexResult_set_m_hitFraction_1"];var _emscripten_bind_LocalConvexResult_set_m_hitNormalLocal_1=Module["_emscripten_bind_LocalConvexResult_set_m_hitNormalLocal_1"]=asm["_emscripten_bind_LocalConvexResult_set_m_hitNormalLocal_1"];var _emscripten_bind_LocalConvexResult_set_m_hitPointLocal_1=Module["_emscripten_bind_LocalConvexResult_set_m_hitPointLocal_1"]=asm["_emscripten_bind_LocalConvexResult_set_m_hitPointLocal_1"];var _emscripten_bind_LocalConvexResult_set_m_localShapeInfo_1=Module["_emscripten_bind_LocalConvexResult_set_m_localShapeInfo_1"]=asm["_emscripten_bind_LocalConvexResult_set_m_localShapeInfo_1"];var _emscripten_bind_LocalShapeInfo___destroy___0=Module["_emscripten_bind_LocalShapeInfo___destroy___0"]=asm["_emscripten_bind_LocalShapeInfo___destroy___0"];var _emscripten_bind_LocalShapeInfo_get_m_shapePart_0=Module["_emscripten_bind_LocalShapeInfo_get_m_shapePart_0"]=asm["_emscripten_bind_LocalShapeInfo_get_m_shapePart_0"];var _emscripten_bind_LocalShapeInfo_get_m_triangleIndex_0=Module["_emscripten_bind_LocalShapeInfo_get_m_triangleIndex_0"]=asm["_emscripten_bind_LocalShapeInfo_get_m_triangleIndex_0"];var _emscripten_bind_LocalShapeInfo_set_m_shapePart_1=Module["_emscripten_bind_LocalShapeInfo_set_m_shapePart_1"]=asm["_emscripten_bind_LocalShapeInfo_set_m_shapePart_1"];var _emscripten_bind_LocalShapeInfo_set_m_triangleIndex_1=Module["_emscripten_bind_LocalShapeInfo_set_m_triangleIndex_1"]=asm["_emscripten_bind_LocalShapeInfo_set_m_triangleIndex_1"];var _emscripten_bind_Material___destroy___0=Module["_emscripten_bind_Material___destroy___0"]=asm["_emscripten_bind_Material___destroy___0"];var _emscripten_bind_Material_get_m_flags_0=Module["_emscripten_bind_Material_get_m_flags_0"]=asm["_emscripten_bind_Material_get_m_flags_0"];var _emscripten_bind_Material_get_m_kAST_0=Module["_emscripten_bind_Material_get_m_kAST_0"]=asm["_emscripten_bind_Material_get_m_kAST_0"];var _emscripten_bind_Material_get_m_kLST_0=Module["_emscripten_bind_Material_get_m_kLST_0"]=asm["_emscripten_bind_Material_get_m_kLST_0"];var _emscripten_bind_Material_get_m_kVST_0=Module["_emscripten_bind_Material_get_m_kVST_0"]=asm["_emscripten_bind_Material_get_m_kVST_0"];var _emscripten_bind_Material_set_m_flags_1=Module["_emscripten_bind_Material_set_m_flags_1"]=asm["_emscripten_bind_Material_set_m_flags_1"];var _emscripten_bind_Material_set_m_kAST_1=Module["_emscripten_bind_Material_set_m_kAST_1"]=asm["_emscripten_bind_Material_set_m_kAST_1"];var _emscripten_bind_Material_set_m_kLST_1=Module["_emscripten_bind_Material_set_m_kLST_1"]=asm["_emscripten_bind_Material_set_m_kLST_1"];var _emscripten_bind_Material_set_m_kVST_1=Module["_emscripten_bind_Material_set_m_kVST_1"]=asm["_emscripten_bind_Material_set_m_kVST_1"];var _emscripten_bind_Node___destroy___0=Module["_emscripten_bind_Node___destroy___0"]=asm["_emscripten_bind_Node___destroy___0"];var _emscripten_bind_Node_get_m_n_0=Module["_emscripten_bind_Node_get_m_n_0"]=asm["_emscripten_bind_Node_get_m_n_0"];var _emscripten_bind_Node_get_m_x_0=Module["_emscripten_bind_Node_get_m_x_0"]=asm["_emscripten_bind_Node_get_m_x_0"];var _emscripten_bind_Node_set_m_n_1=Module["_emscripten_bind_Node_set_m_n_1"]=asm["_emscripten_bind_Node_set_m_n_1"];var _emscripten_bind_Node_set_m_x_1=Module["_emscripten_bind_Node_set_m_x_1"]=asm["_emscripten_bind_Node_set_m_x_1"];var _emscripten_bind_RayResultCallback___destroy___0=Module["_emscripten_bind_RayResultCallback___destroy___0"]=asm["_emscripten_bind_RayResultCallback___destroy___0"];var _emscripten_bind_RayResultCallback_get_m_collisionFilterGroup_0=Module["_emscripten_bind_RayResultCallback_get_m_collisionFilterGroup_0"]=asm["_emscripten_bind_RayResultCallback_get_m_collisionFilterGroup_0"];var _emscripten_bind_RayResultCallback_get_m_collisionFilterMask_0=Module["_emscripten_bind_RayResultCallback_get_m_collisionFilterMask_0"]=asm["_emscripten_bind_RayResultCallback_get_m_collisionFilterMask_0"];var _emscripten_bind_RayResultCallback_get_m_collisionObject_0=Module["_emscripten_bind_RayResultCallback_get_m_collisionObject_0"]=asm["_emscripten_bind_RayResultCallback_get_m_collisionObject_0"];var _emscripten_bind_RayResultCallback_hasHit_0=Module["_emscripten_bind_RayResultCallback_hasHit_0"]=asm["_emscripten_bind_RayResultCallback_hasHit_0"];var _emscripten_bind_RayResultCallback_set_m_collisionFilterGroup_1=Module["_emscripten_bind_RayResultCallback_set_m_collisionFilterGroup_1"]=asm["_emscripten_bind_RayResultCallback_set_m_collisionFilterGroup_1"];var _emscripten_bind_RayResultCallback_set_m_collisionFilterMask_1=Module["_emscripten_bind_RayResultCallback_set_m_collisionFilterMask_1"]=asm["_emscripten_bind_RayResultCallback_set_m_collisionFilterMask_1"];var _emscripten_bind_RayResultCallback_set_m_collisionObject_1=Module["_emscripten_bind_RayResultCallback_set_m_collisionObject_1"]=asm["_emscripten_bind_RayResultCallback_set_m_collisionObject_1"];var _emscripten_bind_RaycastInfo___destroy___0=Module["_emscripten_bind_RaycastInfo___destroy___0"]=asm["_emscripten_bind_RaycastInfo___destroy___0"];var _emscripten_bind_RaycastInfo_get_m_contactNormalWS_0=Module["_emscripten_bind_RaycastInfo_get_m_contactNormalWS_0"]=asm["_emscripten_bind_RaycastInfo_get_m_contactNormalWS_0"];var _emscripten_bind_RaycastInfo_get_m_contactPointWS_0=Module["_emscripten_bind_RaycastInfo_get_m_contactPointWS_0"]=asm["_emscripten_bind_RaycastInfo_get_m_contactPointWS_0"];var _emscripten_bind_RaycastInfo_get_m_groundObject_0=Module["_emscripten_bind_RaycastInfo_get_m_groundObject_0"]=asm["_emscripten_bind_RaycastInfo_get_m_groundObject_0"];var _emscripten_bind_RaycastInfo_get_m_hardPointWS_0=Module["_emscripten_bind_RaycastInfo_get_m_hardPointWS_0"]=asm["_emscripten_bind_RaycastInfo_get_m_hardPointWS_0"];var _emscripten_bind_RaycastInfo_get_m_isInContact_0=Module["_emscripten_bind_RaycastInfo_get_m_isInContact_0"]=asm["_emscripten_bind_RaycastInfo_get_m_isInContact_0"];var _emscripten_bind_RaycastInfo_get_m_suspensionLength_0=Module["_emscripten_bind_RaycastInfo_get_m_suspensionLength_0"]=asm["_emscripten_bind_RaycastInfo_get_m_suspensionLength_0"];var _emscripten_bind_RaycastInfo_get_m_wheelAxleWS_0=Module["_emscripten_bind_RaycastInfo_get_m_wheelAxleWS_0"]=asm["_emscripten_bind_RaycastInfo_get_m_wheelAxleWS_0"];var _emscripten_bind_RaycastInfo_get_m_wheelDirectionWS_0=Module["_emscripten_bind_RaycastInfo_get_m_wheelDirectionWS_0"]=asm["_emscripten_bind_RaycastInfo_get_m_wheelDirectionWS_0"];var _emscripten_bind_RaycastInfo_set_m_contactNormalWS_1=Module["_emscripten_bind_RaycastInfo_set_m_contactNormalWS_1"]=asm["_emscripten_bind_RaycastInfo_set_m_contactNormalWS_1"];var _emscripten_bind_RaycastInfo_set_m_contactPointWS_1=Module["_emscripten_bind_RaycastInfo_set_m_contactPointWS_1"]=asm["_emscripten_bind_RaycastInfo_set_m_contactPointWS_1"];var _emscripten_bind_RaycastInfo_set_m_groundObject_1=Module["_emscripten_bind_RaycastInfo_set_m_groundObject_1"]=asm["_emscripten_bind_RaycastInfo_set_m_groundObject_1"];var _emscripten_bind_RaycastInfo_set_m_hardPointWS_1=Module["_emscripten_bind_RaycastInfo_set_m_hardPointWS_1"]=asm["_emscripten_bind_RaycastInfo_set_m_hardPointWS_1"];var _emscripten_bind_RaycastInfo_set_m_isInContact_1=Module["_emscripten_bind_RaycastInfo_set_m_isInContact_1"]=asm["_emscripten_bind_RaycastInfo_set_m_isInContact_1"];var _emscripten_bind_RaycastInfo_set_m_suspensionLength_1=Module["_emscripten_bind_RaycastInfo_set_m_suspensionLength_1"]=asm["_emscripten_bind_RaycastInfo_set_m_suspensionLength_1"];var _emscripten_bind_RaycastInfo_set_m_wheelAxleWS_1=Module["_emscripten_bind_RaycastInfo_set_m_wheelAxleWS_1"]=asm["_emscripten_bind_RaycastInfo_set_m_wheelAxleWS_1"];var _emscripten_bind_RaycastInfo_set_m_wheelDirectionWS_1=Module["_emscripten_bind_RaycastInfo_set_m_wheelDirectionWS_1"]=asm["_emscripten_bind_RaycastInfo_set_m_wheelDirectionWS_1"];var _emscripten_bind_Specs___destroy___0=Module["_emscripten_bind_Specs___destroy___0"]=asm["_emscripten_bind_Specs___destroy___0"];var _emscripten_bind_Specs_get_position_0=Module["_emscripten_bind_Specs_get_position_0"]=asm["_emscripten_bind_Specs_get_position_0"];var _emscripten_bind_Specs_set_position_1=Module["_emscripten_bind_Specs_set_position_1"]=asm["_emscripten_bind_Specs_set_position_1"];var _emscripten_bind_VoidPtr___destroy___0=Module["_emscripten_bind_VoidPtr___destroy___0"]=asm["_emscripten_bind_VoidPtr___destroy___0"];var _emscripten_bind_btActionInterface___destroy___0=Module["_emscripten_bind_btActionInterface___destroy___0"]=asm["_emscripten_bind_btActionInterface___destroy___0"];var _emscripten_bind_btActionInterface_updateAction_2=Module["_emscripten_bind_btActionInterface_updateAction_2"]=asm["_emscripten_bind_btActionInterface_updateAction_2"];var _emscripten_bind_btAxisSweep3___destroy___0=Module["_emscripten_bind_btAxisSweep3___destroy___0"]=asm["_emscripten_bind_btAxisSweep3___destroy___0"];var _emscripten_bind_btAxisSweep3_btAxisSweep3_2=Module["_emscripten_bind_btAxisSweep3_btAxisSweep3_2"]=asm["_emscripten_bind_btAxisSweep3_btAxisSweep3_2"];var _emscripten_bind_btAxisSweep3_btAxisSweep3_3=Module["_emscripten_bind_btAxisSweep3_btAxisSweep3_3"]=asm["_emscripten_bind_btAxisSweep3_btAxisSweep3_3"];var _emscripten_bind_btAxisSweep3_btAxisSweep3_4=Module["_emscripten_bind_btAxisSweep3_btAxisSweep3_4"]=asm["_emscripten_bind_btAxisSweep3_btAxisSweep3_4"];var _emscripten_bind_btAxisSweep3_btAxisSweep3_5=Module["_emscripten_bind_btAxisSweep3_btAxisSweep3_5"]=asm["_emscripten_bind_btAxisSweep3_btAxisSweep3_5"];var _emscripten_bind_btBoxShape___destroy___0=Module["_emscripten_bind_btBoxShape___destroy___0"]=asm["_emscripten_bind_btBoxShape___destroy___0"];var _emscripten_bind_btBoxShape_btBoxShape_1=Module["_emscripten_bind_btBoxShape_btBoxShape_1"]=asm["_emscripten_bind_btBoxShape_btBoxShape_1"];var _emscripten_bind_btBoxShape_calculateLocalInertia_2=Module["_emscripten_bind_btBoxShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btBoxShape_calculateLocalInertia_2"];var _emscripten_bind_btBoxShape_getLocalScaling_0=Module["_emscripten_bind_btBoxShape_getLocalScaling_0"]=asm["_emscripten_bind_btBoxShape_getLocalScaling_0"];var _emscripten_bind_btBoxShape_getMargin_0=Module["_emscripten_bind_btBoxShape_getMargin_0"]=asm["_emscripten_bind_btBoxShape_getMargin_0"];var _emscripten_bind_btBoxShape_setLocalScaling_1=Module["_emscripten_bind_btBoxShape_setLocalScaling_1"]=asm["_emscripten_bind_btBoxShape_setLocalScaling_1"];var _emscripten_bind_btBoxShape_setMargin_1=Module["_emscripten_bind_btBoxShape_setMargin_1"]=asm["_emscripten_bind_btBoxShape_setMargin_1"];var _emscripten_bind_btBroadphaseInterface___destroy___0=Module["_emscripten_bind_btBroadphaseInterface___destroy___0"]=asm["_emscripten_bind_btBroadphaseInterface___destroy___0"];var _emscripten_bind_btBvhTriangleMeshShape___destroy___0=Module["_emscripten_bind_btBvhTriangleMeshShape___destroy___0"]=asm["_emscripten_bind_btBvhTriangleMeshShape___destroy___0"];var _emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_2=Module["_emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_2"]=asm["_emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_2"];var _emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_3=Module["_emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_3"]=asm["_emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_3"];var _emscripten_bind_btBvhTriangleMeshShape_calculateLocalInertia_2=Module["_emscripten_bind_btBvhTriangleMeshShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btBvhTriangleMeshShape_calculateLocalInertia_2"];var _emscripten_bind_btBvhTriangleMeshShape_getLocalScaling_0=Module["_emscripten_bind_btBvhTriangleMeshShape_getLocalScaling_0"]=asm["_emscripten_bind_btBvhTriangleMeshShape_getLocalScaling_0"];var _emscripten_bind_btBvhTriangleMeshShape_setLocalScaling_1=Module["_emscripten_bind_btBvhTriangleMeshShape_setLocalScaling_1"]=asm["_emscripten_bind_btBvhTriangleMeshShape_setLocalScaling_1"];var _emscripten_bind_btCapsuleShapeX___destroy___0=Module["_emscripten_bind_btCapsuleShapeX___destroy___0"]=asm["_emscripten_bind_btCapsuleShapeX___destroy___0"];var _emscripten_bind_btCapsuleShapeX_btCapsuleShapeX_2=Module["_emscripten_bind_btCapsuleShapeX_btCapsuleShapeX_2"]=asm["_emscripten_bind_btCapsuleShapeX_btCapsuleShapeX_2"];var _emscripten_bind_btCapsuleShapeX_calculateLocalInertia_2=Module["_emscripten_bind_btCapsuleShapeX_calculateLocalInertia_2"]=asm["_emscripten_bind_btCapsuleShapeX_calculateLocalInertia_2"];var _emscripten_bind_btCapsuleShapeX_getHalfHeight_0=Module["_emscripten_bind_btCapsuleShapeX_getHalfHeight_0"]=asm["_emscripten_bind_btCapsuleShapeX_getHalfHeight_0"];var _emscripten_bind_btCapsuleShapeX_getLocalScaling_0=Module["_emscripten_bind_btCapsuleShapeX_getLocalScaling_0"]=asm["_emscripten_bind_btCapsuleShapeX_getLocalScaling_0"];var _emscripten_bind_btCapsuleShapeX_getMargin_0=Module["_emscripten_bind_btCapsuleShapeX_getMargin_0"]=asm["_emscripten_bind_btCapsuleShapeX_getMargin_0"];var _emscripten_bind_btCapsuleShapeX_getRadius_0=Module["_emscripten_bind_btCapsuleShapeX_getRadius_0"]=asm["_emscripten_bind_btCapsuleShapeX_getRadius_0"];var _emscripten_bind_btCapsuleShapeX_getUpAxis_0=Module["_emscripten_bind_btCapsuleShapeX_getUpAxis_0"]=asm["_emscripten_bind_btCapsuleShapeX_getUpAxis_0"];var _emscripten_bind_btCapsuleShapeX_setLocalScaling_1=Module["_emscripten_bind_btCapsuleShapeX_setLocalScaling_1"]=asm["_emscripten_bind_btCapsuleShapeX_setLocalScaling_1"];var _emscripten_bind_btCapsuleShapeX_setMargin_1=Module["_emscripten_bind_btCapsuleShapeX_setMargin_1"]=asm["_emscripten_bind_btCapsuleShapeX_setMargin_1"];var _emscripten_bind_btCapsuleShapeZ___destroy___0=Module["_emscripten_bind_btCapsuleShapeZ___destroy___0"]=asm["_emscripten_bind_btCapsuleShapeZ___destroy___0"];var _emscripten_bind_btCapsuleShapeZ_btCapsuleShapeZ_2=Module["_emscripten_bind_btCapsuleShapeZ_btCapsuleShapeZ_2"]=asm["_emscripten_bind_btCapsuleShapeZ_btCapsuleShapeZ_2"];var _emscripten_bind_btCapsuleShapeZ_calculateLocalInertia_2=Module["_emscripten_bind_btCapsuleShapeZ_calculateLocalInertia_2"]=asm["_emscripten_bind_btCapsuleShapeZ_calculateLocalInertia_2"];var _emscripten_bind_btCapsuleShapeZ_getHalfHeight_0=Module["_emscripten_bind_btCapsuleShapeZ_getHalfHeight_0"]=asm["_emscripten_bind_btCapsuleShapeZ_getHalfHeight_0"];var _emscripten_bind_btCapsuleShapeZ_getLocalScaling_0=Module["_emscripten_bind_btCapsuleShapeZ_getLocalScaling_0"]=asm["_emscripten_bind_btCapsuleShapeZ_getLocalScaling_0"];var _emscripten_bind_btCapsuleShapeZ_getMargin_0=Module["_emscripten_bind_btCapsuleShapeZ_getMargin_0"]=asm["_emscripten_bind_btCapsuleShapeZ_getMargin_0"];var _emscripten_bind_btCapsuleShapeZ_getRadius_0=Module["_emscripten_bind_btCapsuleShapeZ_getRadius_0"]=asm["_emscripten_bind_btCapsuleShapeZ_getRadius_0"];var _emscripten_bind_btCapsuleShapeZ_getUpAxis_0=Module["_emscripten_bind_btCapsuleShapeZ_getUpAxis_0"]=asm["_emscripten_bind_btCapsuleShapeZ_getUpAxis_0"];var _emscripten_bind_btCapsuleShapeZ_setLocalScaling_1=Module["_emscripten_bind_btCapsuleShapeZ_setLocalScaling_1"]=asm["_emscripten_bind_btCapsuleShapeZ_setLocalScaling_1"];var _emscripten_bind_btCapsuleShapeZ_setMargin_1=Module["_emscripten_bind_btCapsuleShapeZ_setMargin_1"]=asm["_emscripten_bind_btCapsuleShapeZ_setMargin_1"];var _emscripten_bind_btCapsuleShape___destroy___0=Module["_emscripten_bind_btCapsuleShape___destroy___0"]=asm["_emscripten_bind_btCapsuleShape___destroy___0"];var _emscripten_bind_btCapsuleShape_btCapsuleShape_2=Module["_emscripten_bind_btCapsuleShape_btCapsuleShape_2"]=asm["_emscripten_bind_btCapsuleShape_btCapsuleShape_2"];var _emscripten_bind_btCapsuleShape_calculateLocalInertia_2=Module["_emscripten_bind_btCapsuleShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btCapsuleShape_calculateLocalInertia_2"];var _emscripten_bind_btCapsuleShape_getHalfHeight_0=Module["_emscripten_bind_btCapsuleShape_getHalfHeight_0"]=asm["_emscripten_bind_btCapsuleShape_getHalfHeight_0"];var _emscripten_bind_btCapsuleShape_getLocalScaling_0=Module["_emscripten_bind_btCapsuleShape_getLocalScaling_0"]=asm["_emscripten_bind_btCapsuleShape_getLocalScaling_0"];var _emscripten_bind_btCapsuleShape_getMargin_0=Module["_emscripten_bind_btCapsuleShape_getMargin_0"]=asm["_emscripten_bind_btCapsuleShape_getMargin_0"];var _emscripten_bind_btCapsuleShape_getRadius_0=Module["_emscripten_bind_btCapsuleShape_getRadius_0"]=asm["_emscripten_bind_btCapsuleShape_getRadius_0"];var _emscripten_bind_btCapsuleShape_getUpAxis_0=Module["_emscripten_bind_btCapsuleShape_getUpAxis_0"]=asm["_emscripten_bind_btCapsuleShape_getUpAxis_0"];var _emscripten_bind_btCapsuleShape_setLocalScaling_1=Module["_emscripten_bind_btCapsuleShape_setLocalScaling_1"]=asm["_emscripten_bind_btCapsuleShape_setLocalScaling_1"];var _emscripten_bind_btCapsuleShape_setMargin_1=Module["_emscripten_bind_btCapsuleShape_setMargin_1"]=asm["_emscripten_bind_btCapsuleShape_setMargin_1"];var _emscripten_bind_btCollisionConfiguration___destroy___0=Module["_emscripten_bind_btCollisionConfiguration___destroy___0"]=asm["_emscripten_bind_btCollisionConfiguration___destroy___0"];var _emscripten_bind_btCollisionDispatcher___destroy___0=Module["_emscripten_bind_btCollisionDispatcher___destroy___0"]=asm["_emscripten_bind_btCollisionDispatcher___destroy___0"];var _emscripten_bind_btCollisionDispatcher_btCollisionDispatcher_1=Module["_emscripten_bind_btCollisionDispatcher_btCollisionDispatcher_1"]=asm["_emscripten_bind_btCollisionDispatcher_btCollisionDispatcher_1"];var _emscripten_bind_btCollisionDispatcher_getManifoldByIndexInternal_1=Module["_emscripten_bind_btCollisionDispatcher_getManifoldByIndexInternal_1"]=asm["_emscripten_bind_btCollisionDispatcher_getManifoldByIndexInternal_1"];var _emscripten_bind_btCollisionDispatcher_getNumManifolds_0=Module["_emscripten_bind_btCollisionDispatcher_getNumManifolds_0"]=asm["_emscripten_bind_btCollisionDispatcher_getNumManifolds_0"];var _emscripten_bind_btCollisionObject___destroy___0=Module["_emscripten_bind_btCollisionObject___destroy___0"]=asm["_emscripten_bind_btCollisionObject___destroy___0"];var _emscripten_bind_btCollisionObject_activate_0=Module["_emscripten_bind_btCollisionObject_activate_0"]=asm["_emscripten_bind_btCollisionObject_activate_0"];var _emscripten_bind_btCollisionObject_activate_1=Module["_emscripten_bind_btCollisionObject_activate_1"]=asm["_emscripten_bind_btCollisionObject_activate_1"];var _emscripten_bind_btCollisionObject_forceActivationState_1=Module["_emscripten_bind_btCollisionObject_forceActivationState_1"]=asm["_emscripten_bind_btCollisionObject_forceActivationState_1"];var _emscripten_bind_btCollisionObject_getCollisionFlags_0=Module["_emscripten_bind_btCollisionObject_getCollisionFlags_0"]=asm["_emscripten_bind_btCollisionObject_getCollisionFlags_0"];var _emscripten_bind_btCollisionObject_getCollisionShape_0=Module["_emscripten_bind_btCollisionObject_getCollisionShape_0"]=asm["_emscripten_bind_btCollisionObject_getCollisionShape_0"];var _emscripten_bind_btCollisionObject_getUserIndex_0=Module["_emscripten_bind_btCollisionObject_getUserIndex_0"]=asm["_emscripten_bind_btCollisionObject_getUserIndex_0"];var _emscripten_bind_btCollisionObject_getUserPointer_0=Module["_emscripten_bind_btCollisionObject_getUserPointer_0"]=asm["_emscripten_bind_btCollisionObject_getUserPointer_0"];var _emscripten_bind_btCollisionObject_getWorldTransform_0=Module["_emscripten_bind_btCollisionObject_getWorldTransform_0"]=asm["_emscripten_bind_btCollisionObject_getWorldTransform_0"];var _emscripten_bind_btCollisionObject_isActive_0=Module["_emscripten_bind_btCollisionObject_isActive_0"]=asm["_emscripten_bind_btCollisionObject_isActive_0"];var _emscripten_bind_btCollisionObject_isKinematicObject_0=Module["_emscripten_bind_btCollisionObject_isKinematicObject_0"]=asm["_emscripten_bind_btCollisionObject_isKinematicObject_0"];var _emscripten_bind_btCollisionObject_isStaticObject_0=Module["_emscripten_bind_btCollisionObject_isStaticObject_0"]=asm["_emscripten_bind_btCollisionObject_isStaticObject_0"];var _emscripten_bind_btCollisionObject_isStaticOrKinematicObject_0=Module["_emscripten_bind_btCollisionObject_isStaticOrKinematicObject_0"]=asm["_emscripten_bind_btCollisionObject_isStaticOrKinematicObject_0"];var _emscripten_bind_btCollisionObject_setActivationState_1=Module["_emscripten_bind_btCollisionObject_setActivationState_1"]=asm["_emscripten_bind_btCollisionObject_setActivationState_1"];var _emscripten_bind_btCollisionObject_setAnisotropicFriction_2=Module["_emscripten_bind_btCollisionObject_setAnisotropicFriction_2"]=asm["_emscripten_bind_btCollisionObject_setAnisotropicFriction_2"];var _emscripten_bind_btCollisionObject_setCcdMotionThreshold_1=Module["_emscripten_bind_btCollisionObject_setCcdMotionThreshold_1"]=asm["_emscripten_bind_btCollisionObject_setCcdMotionThreshold_1"];var _emscripten_bind_btCollisionObject_setCcdSweptSphereRadius_1=Module["_emscripten_bind_btCollisionObject_setCcdSweptSphereRadius_1"]=asm["_emscripten_bind_btCollisionObject_setCcdSweptSphereRadius_1"];var _emscripten_bind_btCollisionObject_setCollisionFlags_1=Module["_emscripten_bind_btCollisionObject_setCollisionFlags_1"]=asm["_emscripten_bind_btCollisionObject_setCollisionFlags_1"];var _emscripten_bind_btCollisionObject_setCollisionShape_1=Module["_emscripten_bind_btCollisionObject_setCollisionShape_1"]=asm["_emscripten_bind_btCollisionObject_setCollisionShape_1"];var _emscripten_bind_btCollisionObject_setContactProcessingThreshold_1=Module["_emscripten_bind_btCollisionObject_setContactProcessingThreshold_1"]=asm["_emscripten_bind_btCollisionObject_setContactProcessingThreshold_1"];var _emscripten_bind_btCollisionObject_setFriction_1=Module["_emscripten_bind_btCollisionObject_setFriction_1"]=asm["_emscripten_bind_btCollisionObject_setFriction_1"];var _emscripten_bind_btCollisionObject_setRestitution_1=Module["_emscripten_bind_btCollisionObject_setRestitution_1"]=asm["_emscripten_bind_btCollisionObject_setRestitution_1"];var _emscripten_bind_btCollisionObject_setRollingFriction_1=Module["_emscripten_bind_btCollisionObject_setRollingFriction_1"]=asm["_emscripten_bind_btCollisionObject_setRollingFriction_1"];var _emscripten_bind_btCollisionObject_setUserIndex_1=Module["_emscripten_bind_btCollisionObject_setUserIndex_1"]=asm["_emscripten_bind_btCollisionObject_setUserIndex_1"];var _emscripten_bind_btCollisionObject_setUserPointer_1=Module["_emscripten_bind_btCollisionObject_setUserPointer_1"]=asm["_emscripten_bind_btCollisionObject_setUserPointer_1"];var _emscripten_bind_btCollisionObject_setWorldTransform_1=Module["_emscripten_bind_btCollisionObject_setWorldTransform_1"]=asm["_emscripten_bind_btCollisionObject_setWorldTransform_1"];var _emscripten_bind_btCollisionShape___destroy___0=Module["_emscripten_bind_btCollisionShape___destroy___0"]=asm["_emscripten_bind_btCollisionShape___destroy___0"];var _emscripten_bind_btCollisionShape_calculateLocalInertia_2=Module["_emscripten_bind_btCollisionShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btCollisionShape_calculateLocalInertia_2"];var _emscripten_bind_btCollisionShape_getLocalScaling_0=Module["_emscripten_bind_btCollisionShape_getLocalScaling_0"]=asm["_emscripten_bind_btCollisionShape_getLocalScaling_0"];var _emscripten_bind_btCollisionShape_getMargin_0=Module["_emscripten_bind_btCollisionShape_getMargin_0"]=asm["_emscripten_bind_btCollisionShape_getMargin_0"];var _emscripten_bind_btCollisionShape_setLocalScaling_1=Module["_emscripten_bind_btCollisionShape_setLocalScaling_1"]=asm["_emscripten_bind_btCollisionShape_setLocalScaling_1"];var _emscripten_bind_btCollisionShape_setMargin_1=Module["_emscripten_bind_btCollisionShape_setMargin_1"]=asm["_emscripten_bind_btCollisionShape_setMargin_1"];var _emscripten_bind_btCollisionWorld___destroy___0=Module["_emscripten_bind_btCollisionWorld___destroy___0"]=asm["_emscripten_bind_btCollisionWorld___destroy___0"];var _emscripten_bind_btCollisionWorld_addCollisionObject_1=Module["_emscripten_bind_btCollisionWorld_addCollisionObject_1"]=asm["_emscripten_bind_btCollisionWorld_addCollisionObject_1"];var _emscripten_bind_btCollisionWorld_addCollisionObject_2=Module["_emscripten_bind_btCollisionWorld_addCollisionObject_2"]=asm["_emscripten_bind_btCollisionWorld_addCollisionObject_2"];var _emscripten_bind_btCollisionWorld_addCollisionObject_3=Module["_emscripten_bind_btCollisionWorld_addCollisionObject_3"]=asm["_emscripten_bind_btCollisionWorld_addCollisionObject_3"];var _emscripten_bind_btCollisionWorld_contactPairTest_3=Module["_emscripten_bind_btCollisionWorld_contactPairTest_3"]=asm["_emscripten_bind_btCollisionWorld_contactPairTest_3"];var _emscripten_bind_btCollisionWorld_contactTest_2=Module["_emscripten_bind_btCollisionWorld_contactTest_2"]=asm["_emscripten_bind_btCollisionWorld_contactTest_2"];var _emscripten_bind_btCollisionWorld_convexSweepTest_5=Module["_emscripten_bind_btCollisionWorld_convexSweepTest_5"]=asm["_emscripten_bind_btCollisionWorld_convexSweepTest_5"];var _emscripten_bind_btCollisionWorld_getBroadphase_0=Module["_emscripten_bind_btCollisionWorld_getBroadphase_0"]=asm["_emscripten_bind_btCollisionWorld_getBroadphase_0"];var _emscripten_bind_btCollisionWorld_getDispatchInfo_0=Module["_emscripten_bind_btCollisionWorld_getDispatchInfo_0"]=asm["_emscripten_bind_btCollisionWorld_getDispatchInfo_0"];var _emscripten_bind_btCollisionWorld_getDispatcher_0=Module["_emscripten_bind_btCollisionWorld_getDispatcher_0"]=asm["_emscripten_bind_btCollisionWorld_getDispatcher_0"];var _emscripten_bind_btCollisionWorld_getPairCache_0=Module["_emscripten_bind_btCollisionWorld_getPairCache_0"]=asm["_emscripten_bind_btCollisionWorld_getPairCache_0"];var _emscripten_bind_btCollisionWorld_rayTest_3=Module["_emscripten_bind_btCollisionWorld_rayTest_3"]=asm["_emscripten_bind_btCollisionWorld_rayTest_3"];var _emscripten_bind_btCollisionWorld_removeCollisionObject_1=Module["_emscripten_bind_btCollisionWorld_removeCollisionObject_1"]=asm["_emscripten_bind_btCollisionWorld_removeCollisionObject_1"];var _emscripten_bind_btCollisionWorld_updateSingleAabb_1=Module["_emscripten_bind_btCollisionWorld_updateSingleAabb_1"]=asm["_emscripten_bind_btCollisionWorld_updateSingleAabb_1"];var _emscripten_bind_btCompoundShape___destroy___0=Module["_emscripten_bind_btCompoundShape___destroy___0"]=asm["_emscripten_bind_btCompoundShape___destroy___0"];var _emscripten_bind_btCompoundShape_addChildShape_2=Module["_emscripten_bind_btCompoundShape_addChildShape_2"]=asm["_emscripten_bind_btCompoundShape_addChildShape_2"];var _emscripten_bind_btCompoundShape_btCompoundShape_0=Module["_emscripten_bind_btCompoundShape_btCompoundShape_0"]=asm["_emscripten_bind_btCompoundShape_btCompoundShape_0"];var _emscripten_bind_btCompoundShape_btCompoundShape_1=Module["_emscripten_bind_btCompoundShape_btCompoundShape_1"]=asm["_emscripten_bind_btCompoundShape_btCompoundShape_1"];var _emscripten_bind_btCompoundShape_calculateLocalInertia_2=Module["_emscripten_bind_btCompoundShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btCompoundShape_calculateLocalInertia_2"];var _emscripten_bind_btCompoundShape_getChildShape_1=Module["_emscripten_bind_btCompoundShape_getChildShape_1"]=asm["_emscripten_bind_btCompoundShape_getChildShape_1"];var _emscripten_bind_btCompoundShape_getLocalScaling_0=Module["_emscripten_bind_btCompoundShape_getLocalScaling_0"]=asm["_emscripten_bind_btCompoundShape_getLocalScaling_0"];var _emscripten_bind_btCompoundShape_getMargin_0=Module["_emscripten_bind_btCompoundShape_getMargin_0"]=asm["_emscripten_bind_btCompoundShape_getMargin_0"];var _emscripten_bind_btCompoundShape_getNumChildShapes_0=Module["_emscripten_bind_btCompoundShape_getNumChildShapes_0"]=asm["_emscripten_bind_btCompoundShape_getNumChildShapes_0"];var _emscripten_bind_btCompoundShape_removeChildShapeByIndex_1=Module["_emscripten_bind_btCompoundShape_removeChildShapeByIndex_1"]=asm["_emscripten_bind_btCompoundShape_removeChildShapeByIndex_1"];var _emscripten_bind_btCompoundShape_setLocalScaling_1=Module["_emscripten_bind_btCompoundShape_setLocalScaling_1"]=asm["_emscripten_bind_btCompoundShape_setLocalScaling_1"];var _emscripten_bind_btCompoundShape_setMargin_1=Module["_emscripten_bind_btCompoundShape_setMargin_1"]=asm["_emscripten_bind_btCompoundShape_setMargin_1"];var _emscripten_bind_btConcaveShape___destroy___0=Module["_emscripten_bind_btConcaveShape___destroy___0"]=asm["_emscripten_bind_btConcaveShape___destroy___0"];var _emscripten_bind_btConcaveShape_calculateLocalInertia_2=Module["_emscripten_bind_btConcaveShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btConcaveShape_calculateLocalInertia_2"];var _emscripten_bind_btConcaveShape_getLocalScaling_0=Module["_emscripten_bind_btConcaveShape_getLocalScaling_0"]=asm["_emscripten_bind_btConcaveShape_getLocalScaling_0"];var _emscripten_bind_btConcaveShape_setLocalScaling_1=Module["_emscripten_bind_btConcaveShape_setLocalScaling_1"]=asm["_emscripten_bind_btConcaveShape_setLocalScaling_1"];var _emscripten_bind_btConeShapeX___destroy___0=Module["_emscripten_bind_btConeShapeX___destroy___0"]=asm["_emscripten_bind_btConeShapeX___destroy___0"];var _emscripten_bind_btConeShapeX_btConeShapeX_2=Module["_emscripten_bind_btConeShapeX_btConeShapeX_2"]=asm["_emscripten_bind_btConeShapeX_btConeShapeX_2"];var _emscripten_bind_btConeShapeX_calculateLocalInertia_2=Module["_emscripten_bind_btConeShapeX_calculateLocalInertia_2"]=asm["_emscripten_bind_btConeShapeX_calculateLocalInertia_2"];var _emscripten_bind_btConeShapeX_getLocalScaling_0=Module["_emscripten_bind_btConeShapeX_getLocalScaling_0"]=asm["_emscripten_bind_btConeShapeX_getLocalScaling_0"];var _emscripten_bind_btConeShapeX_setLocalScaling_1=Module["_emscripten_bind_btConeShapeX_setLocalScaling_1"]=asm["_emscripten_bind_btConeShapeX_setLocalScaling_1"];var _emscripten_bind_btConeShapeZ___destroy___0=Module["_emscripten_bind_btConeShapeZ___destroy___0"]=asm["_emscripten_bind_btConeShapeZ___destroy___0"];var _emscripten_bind_btConeShapeZ_btConeShapeZ_2=Module["_emscripten_bind_btConeShapeZ_btConeShapeZ_2"]=asm["_emscripten_bind_btConeShapeZ_btConeShapeZ_2"];var _emscripten_bind_btConeShapeZ_calculateLocalInertia_2=Module["_emscripten_bind_btConeShapeZ_calculateLocalInertia_2"]=asm["_emscripten_bind_btConeShapeZ_calculateLocalInertia_2"];var _emscripten_bind_btConeShapeZ_getLocalScaling_0=Module["_emscripten_bind_btConeShapeZ_getLocalScaling_0"]=asm["_emscripten_bind_btConeShapeZ_getLocalScaling_0"];var _emscripten_bind_btConeShapeZ_setLocalScaling_1=Module["_emscripten_bind_btConeShapeZ_setLocalScaling_1"]=asm["_emscripten_bind_btConeShapeZ_setLocalScaling_1"];var _emscripten_bind_btConeShape___destroy___0=Module["_emscripten_bind_btConeShape___destroy___0"]=asm["_emscripten_bind_btConeShape___destroy___0"];var _emscripten_bind_btConeShape_btConeShape_2=Module["_emscripten_bind_btConeShape_btConeShape_2"]=asm["_emscripten_bind_btConeShape_btConeShape_2"];var _emscripten_bind_btConeShape_calculateLocalInertia_2=Module["_emscripten_bind_btConeShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btConeShape_calculateLocalInertia_2"];var _emscripten_bind_btConeShape_getLocalScaling_0=Module["_emscripten_bind_btConeShape_getLocalScaling_0"]=asm["_emscripten_bind_btConeShape_getLocalScaling_0"];var _emscripten_bind_btConeShape_setLocalScaling_1=Module["_emscripten_bind_btConeShape_setLocalScaling_1"]=asm["_emscripten_bind_btConeShape_setLocalScaling_1"];var _emscripten_bind_btConeTwistConstraint___destroy___0=Module["_emscripten_bind_btConeTwistConstraint___destroy___0"]=asm["_emscripten_bind_btConeTwistConstraint___destroy___0"];var _emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_2=Module["_emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_2"]=asm["_emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_2"];var _emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_4=Module["_emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_4"]=asm["_emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_4"];var _emscripten_bind_btConeTwistConstraint_enableFeedback_1=Module["_emscripten_bind_btConeTwistConstraint_enableFeedback_1"]=asm["_emscripten_bind_btConeTwistConstraint_enableFeedback_1"];var _emscripten_bind_btConeTwistConstraint_enableMotor_1=Module["_emscripten_bind_btConeTwistConstraint_enableMotor_1"]=asm["_emscripten_bind_btConeTwistConstraint_enableMotor_1"];var _emscripten_bind_btConeTwistConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btConeTwistConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btConeTwistConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btConeTwistConstraint_getParam_2=Module["_emscripten_bind_btConeTwistConstraint_getParam_2"]=asm["_emscripten_bind_btConeTwistConstraint_getParam_2"];var _emscripten_bind_btConeTwistConstraint_setAngularOnly_1=Module["_emscripten_bind_btConeTwistConstraint_setAngularOnly_1"]=asm["_emscripten_bind_btConeTwistConstraint_setAngularOnly_1"];var _emscripten_bind_btConeTwistConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btConeTwistConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btConeTwistConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btConeTwistConstraint_setDamping_1=Module["_emscripten_bind_btConeTwistConstraint_setDamping_1"]=asm["_emscripten_bind_btConeTwistConstraint_setDamping_1"];var _emscripten_bind_btConeTwistConstraint_setLimit_2=Module["_emscripten_bind_btConeTwistConstraint_setLimit_2"]=asm["_emscripten_bind_btConeTwistConstraint_setLimit_2"];var _emscripten_bind_btConeTwistConstraint_setMaxMotorImpulseNormalized_1=Module["_emscripten_bind_btConeTwistConstraint_setMaxMotorImpulseNormalized_1"]=asm["_emscripten_bind_btConeTwistConstraint_setMaxMotorImpulseNormalized_1"];var _emscripten_bind_btConeTwistConstraint_setMaxMotorImpulse_1=Module["_emscripten_bind_btConeTwistConstraint_setMaxMotorImpulse_1"]=asm["_emscripten_bind_btConeTwistConstraint_setMaxMotorImpulse_1"];var _emscripten_bind_btConeTwistConstraint_setMotorTargetInConstraintSpace_1=Module["_emscripten_bind_btConeTwistConstraint_setMotorTargetInConstraintSpace_1"]=asm["_emscripten_bind_btConeTwistConstraint_setMotorTargetInConstraintSpace_1"];var _emscripten_bind_btConeTwistConstraint_setMotorTarget_1=Module["_emscripten_bind_btConeTwistConstraint_setMotorTarget_1"]=asm["_emscripten_bind_btConeTwistConstraint_setMotorTarget_1"];var _emscripten_bind_btConeTwistConstraint_setParam_3=Module["_emscripten_bind_btConeTwistConstraint_setParam_3"]=asm["_emscripten_bind_btConeTwistConstraint_setParam_3"];var _emscripten_bind_btConstraintSetting___destroy___0=Module["_emscripten_bind_btConstraintSetting___destroy___0"]=asm["_emscripten_bind_btConstraintSetting___destroy___0"];var _emscripten_bind_btConstraintSetting_btConstraintSetting_0=Module["_emscripten_bind_btConstraintSetting_btConstraintSetting_0"]=asm["_emscripten_bind_btConstraintSetting_btConstraintSetting_0"];var _emscripten_bind_btConstraintSetting_get_m_damping_0=Module["_emscripten_bind_btConstraintSetting_get_m_damping_0"]=asm["_emscripten_bind_btConstraintSetting_get_m_damping_0"];var _emscripten_bind_btConstraintSetting_get_m_impulseClamp_0=Module["_emscripten_bind_btConstraintSetting_get_m_impulseClamp_0"]=asm["_emscripten_bind_btConstraintSetting_get_m_impulseClamp_0"];var _emscripten_bind_btConstraintSetting_get_m_tau_0=Module["_emscripten_bind_btConstraintSetting_get_m_tau_0"]=asm["_emscripten_bind_btConstraintSetting_get_m_tau_0"];var _emscripten_bind_btConstraintSetting_set_m_damping_1=Module["_emscripten_bind_btConstraintSetting_set_m_damping_1"]=asm["_emscripten_bind_btConstraintSetting_set_m_damping_1"];var _emscripten_bind_btConstraintSetting_set_m_impulseClamp_1=Module["_emscripten_bind_btConstraintSetting_set_m_impulseClamp_1"]=asm["_emscripten_bind_btConstraintSetting_set_m_impulseClamp_1"];var _emscripten_bind_btConstraintSetting_set_m_tau_1=Module["_emscripten_bind_btConstraintSetting_set_m_tau_1"]=asm["_emscripten_bind_btConstraintSetting_set_m_tau_1"];var _emscripten_bind_btConstraintSolver___destroy___0=Module["_emscripten_bind_btConstraintSolver___destroy___0"]=asm["_emscripten_bind_btConstraintSolver___destroy___0"];var _emscripten_bind_btContactSolverInfo___destroy___0=Module["_emscripten_bind_btContactSolverInfo___destroy___0"]=asm["_emscripten_bind_btContactSolverInfo___destroy___0"];var _emscripten_bind_btContactSolverInfo_get_m_numIterations_0=Module["_emscripten_bind_btContactSolverInfo_get_m_numIterations_0"]=asm["_emscripten_bind_btContactSolverInfo_get_m_numIterations_0"];var _emscripten_bind_btContactSolverInfo_get_m_splitImpulsePenetrationThreshold_0=Module["_emscripten_bind_btContactSolverInfo_get_m_splitImpulsePenetrationThreshold_0"]=asm["_emscripten_bind_btContactSolverInfo_get_m_splitImpulsePenetrationThreshold_0"];var _emscripten_bind_btContactSolverInfo_get_m_splitImpulse_0=Module["_emscripten_bind_btContactSolverInfo_get_m_splitImpulse_0"]=asm["_emscripten_bind_btContactSolverInfo_get_m_splitImpulse_0"];var _emscripten_bind_btContactSolverInfo_set_m_numIterations_1=Module["_emscripten_bind_btContactSolverInfo_set_m_numIterations_1"]=asm["_emscripten_bind_btContactSolverInfo_set_m_numIterations_1"];var _emscripten_bind_btContactSolverInfo_set_m_splitImpulsePenetrationThreshold_1=Module["_emscripten_bind_btContactSolverInfo_set_m_splitImpulsePenetrationThreshold_1"]=asm["_emscripten_bind_btContactSolverInfo_set_m_splitImpulsePenetrationThreshold_1"];var _emscripten_bind_btContactSolverInfo_set_m_splitImpulse_1=Module["_emscripten_bind_btContactSolverInfo_set_m_splitImpulse_1"]=asm["_emscripten_bind_btContactSolverInfo_set_m_splitImpulse_1"];var _emscripten_bind_btConvexHullShape___destroy___0=Module["_emscripten_bind_btConvexHullShape___destroy___0"]=asm["_emscripten_bind_btConvexHullShape___destroy___0"];var _emscripten_bind_btConvexHullShape_addPoint_1=Module["_emscripten_bind_btConvexHullShape_addPoint_1"]=asm["_emscripten_bind_btConvexHullShape_addPoint_1"];var _emscripten_bind_btConvexHullShape_addPoint_2=Module["_emscripten_bind_btConvexHullShape_addPoint_2"]=asm["_emscripten_bind_btConvexHullShape_addPoint_2"];var _emscripten_bind_btConvexHullShape_btConvexHullShape_0=Module["_emscripten_bind_btConvexHullShape_btConvexHullShape_0"]=asm["_emscripten_bind_btConvexHullShape_btConvexHullShape_0"];var _emscripten_bind_btConvexHullShape_calculateLocalInertia_2=Module["_emscripten_bind_btConvexHullShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btConvexHullShape_calculateLocalInertia_2"];var _emscripten_bind_btConvexHullShape_getLocalScaling_0=Module["_emscripten_bind_btConvexHullShape_getLocalScaling_0"]=asm["_emscripten_bind_btConvexHullShape_getLocalScaling_0"];var _emscripten_bind_btConvexHullShape_getMargin_0=Module["_emscripten_bind_btConvexHullShape_getMargin_0"]=asm["_emscripten_bind_btConvexHullShape_getMargin_0"];var _emscripten_bind_btConvexHullShape_setLocalScaling_1=Module["_emscripten_bind_btConvexHullShape_setLocalScaling_1"]=asm["_emscripten_bind_btConvexHullShape_setLocalScaling_1"];var _emscripten_bind_btConvexHullShape_setMargin_1=Module["_emscripten_bind_btConvexHullShape_setMargin_1"]=asm["_emscripten_bind_btConvexHullShape_setMargin_1"];var _emscripten_bind_btConvexShape___destroy___0=Module["_emscripten_bind_btConvexShape___destroy___0"]=asm["_emscripten_bind_btConvexShape___destroy___0"];var _emscripten_bind_btConvexShape_calculateLocalInertia_2=Module["_emscripten_bind_btConvexShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btConvexShape_calculateLocalInertia_2"];var _emscripten_bind_btConvexShape_getLocalScaling_0=Module["_emscripten_bind_btConvexShape_getLocalScaling_0"]=asm["_emscripten_bind_btConvexShape_getLocalScaling_0"];var _emscripten_bind_btConvexShape_getMargin_0=Module["_emscripten_bind_btConvexShape_getMargin_0"]=asm["_emscripten_bind_btConvexShape_getMargin_0"];var _emscripten_bind_btConvexShape_setLocalScaling_1=Module["_emscripten_bind_btConvexShape_setLocalScaling_1"]=asm["_emscripten_bind_btConvexShape_setLocalScaling_1"];var _emscripten_bind_btConvexShape_setMargin_1=Module["_emscripten_bind_btConvexShape_setMargin_1"]=asm["_emscripten_bind_btConvexShape_setMargin_1"];var _emscripten_bind_btConvexTriangleMeshShape___destroy___0=Module["_emscripten_bind_btConvexTriangleMeshShape___destroy___0"]=asm["_emscripten_bind_btConvexTriangleMeshShape___destroy___0"];var _emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_1=Module["_emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_1"]=asm["_emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_1"];var _emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_2=Module["_emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_2"]=asm["_emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_2"];var _emscripten_bind_btConvexTriangleMeshShape_calculateLocalInertia_2=Module["_emscripten_bind_btConvexTriangleMeshShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btConvexTriangleMeshShape_calculateLocalInertia_2"];var _emscripten_bind_btConvexTriangleMeshShape_getLocalScaling_0=Module["_emscripten_bind_btConvexTriangleMeshShape_getLocalScaling_0"]=asm["_emscripten_bind_btConvexTriangleMeshShape_getLocalScaling_0"];var _emscripten_bind_btConvexTriangleMeshShape_getMargin_0=Module["_emscripten_bind_btConvexTriangleMeshShape_getMargin_0"]=asm["_emscripten_bind_btConvexTriangleMeshShape_getMargin_0"];var _emscripten_bind_btConvexTriangleMeshShape_setLocalScaling_1=Module["_emscripten_bind_btConvexTriangleMeshShape_setLocalScaling_1"]=asm["_emscripten_bind_btConvexTriangleMeshShape_setLocalScaling_1"];var _emscripten_bind_btConvexTriangleMeshShape_setMargin_1=Module["_emscripten_bind_btConvexTriangleMeshShape_setMargin_1"]=asm["_emscripten_bind_btConvexTriangleMeshShape_setMargin_1"];var _emscripten_bind_btCylinderShapeX___destroy___0=Module["_emscripten_bind_btCylinderShapeX___destroy___0"]=asm["_emscripten_bind_btCylinderShapeX___destroy___0"];var _emscripten_bind_btCylinderShapeX_btCylinderShapeX_1=Module["_emscripten_bind_btCylinderShapeX_btCylinderShapeX_1"]=asm["_emscripten_bind_btCylinderShapeX_btCylinderShapeX_1"];var _emscripten_bind_btCylinderShapeX_calculateLocalInertia_2=Module["_emscripten_bind_btCylinderShapeX_calculateLocalInertia_2"]=asm["_emscripten_bind_btCylinderShapeX_calculateLocalInertia_2"];var _emscripten_bind_btCylinderShapeX_getLocalScaling_0=Module["_emscripten_bind_btCylinderShapeX_getLocalScaling_0"]=asm["_emscripten_bind_btCylinderShapeX_getLocalScaling_0"];var _emscripten_bind_btCylinderShapeX_getMargin_0=Module["_emscripten_bind_btCylinderShapeX_getMargin_0"]=asm["_emscripten_bind_btCylinderShapeX_getMargin_0"];var _emscripten_bind_btCylinderShapeX_setLocalScaling_1=Module["_emscripten_bind_btCylinderShapeX_setLocalScaling_1"]=asm["_emscripten_bind_btCylinderShapeX_setLocalScaling_1"];var _emscripten_bind_btCylinderShapeX_setMargin_1=Module["_emscripten_bind_btCylinderShapeX_setMargin_1"]=asm["_emscripten_bind_btCylinderShapeX_setMargin_1"];var _emscripten_bind_btCylinderShapeZ___destroy___0=Module["_emscripten_bind_btCylinderShapeZ___destroy___0"]=asm["_emscripten_bind_btCylinderShapeZ___destroy___0"];var _emscripten_bind_btCylinderShapeZ_btCylinderShapeZ_1=Module["_emscripten_bind_btCylinderShapeZ_btCylinderShapeZ_1"]=asm["_emscripten_bind_btCylinderShapeZ_btCylinderShapeZ_1"];var _emscripten_bind_btCylinderShapeZ_calculateLocalInertia_2=Module["_emscripten_bind_btCylinderShapeZ_calculateLocalInertia_2"]=asm["_emscripten_bind_btCylinderShapeZ_calculateLocalInertia_2"];var _emscripten_bind_btCylinderShapeZ_getLocalScaling_0=Module["_emscripten_bind_btCylinderShapeZ_getLocalScaling_0"]=asm["_emscripten_bind_btCylinderShapeZ_getLocalScaling_0"];var _emscripten_bind_btCylinderShapeZ_getMargin_0=Module["_emscripten_bind_btCylinderShapeZ_getMargin_0"]=asm["_emscripten_bind_btCylinderShapeZ_getMargin_0"];var _emscripten_bind_btCylinderShapeZ_setLocalScaling_1=Module["_emscripten_bind_btCylinderShapeZ_setLocalScaling_1"]=asm["_emscripten_bind_btCylinderShapeZ_setLocalScaling_1"];var _emscripten_bind_btCylinderShapeZ_setMargin_1=Module["_emscripten_bind_btCylinderShapeZ_setMargin_1"]=asm["_emscripten_bind_btCylinderShapeZ_setMargin_1"];var _emscripten_bind_btCylinderShape___destroy___0=Module["_emscripten_bind_btCylinderShape___destroy___0"]=asm["_emscripten_bind_btCylinderShape___destroy___0"];var _emscripten_bind_btCylinderShape_btCylinderShape_1=Module["_emscripten_bind_btCylinderShape_btCylinderShape_1"]=asm["_emscripten_bind_btCylinderShape_btCylinderShape_1"];var _emscripten_bind_btCylinderShape_calculateLocalInertia_2=Module["_emscripten_bind_btCylinderShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btCylinderShape_calculateLocalInertia_2"];var _emscripten_bind_btCylinderShape_getLocalScaling_0=Module["_emscripten_bind_btCylinderShape_getLocalScaling_0"]=asm["_emscripten_bind_btCylinderShape_getLocalScaling_0"];var _emscripten_bind_btCylinderShape_getMargin_0=Module["_emscripten_bind_btCylinderShape_getMargin_0"]=asm["_emscripten_bind_btCylinderShape_getMargin_0"];var _emscripten_bind_btCylinderShape_setLocalScaling_1=Module["_emscripten_bind_btCylinderShape_setLocalScaling_1"]=asm["_emscripten_bind_btCylinderShape_setLocalScaling_1"];var _emscripten_bind_btCylinderShape_setMargin_1=Module["_emscripten_bind_btCylinderShape_setMargin_1"]=asm["_emscripten_bind_btCylinderShape_setMargin_1"];var _emscripten_bind_btDbvtBroadphase___destroy___0=Module["_emscripten_bind_btDbvtBroadphase___destroy___0"]=asm["_emscripten_bind_btDbvtBroadphase___destroy___0"];var _emscripten_bind_btDbvtBroadphase_btDbvtBroadphase_0=Module["_emscripten_bind_btDbvtBroadphase_btDbvtBroadphase_0"]=asm["_emscripten_bind_btDbvtBroadphase_btDbvtBroadphase_0"];var _emscripten_bind_btDefaultCollisionConfiguration___destroy___0=Module["_emscripten_bind_btDefaultCollisionConfiguration___destroy___0"]=asm["_emscripten_bind_btDefaultCollisionConfiguration___destroy___0"];var _emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_0=Module["_emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_0"]=asm["_emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_0"];var _emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_1=Module["_emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_1"]=asm["_emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_1"];var _emscripten_bind_btDefaultCollisionConstructionInfo___destroy___0=Module["_emscripten_bind_btDefaultCollisionConstructionInfo___destroy___0"]=asm["_emscripten_bind_btDefaultCollisionConstructionInfo___destroy___0"];var _emscripten_bind_btDefaultCollisionConstructionInfo_btDefaultCollisionConstructionInfo_0=Module["_emscripten_bind_btDefaultCollisionConstructionInfo_btDefaultCollisionConstructionInfo_0"]=asm["_emscripten_bind_btDefaultCollisionConstructionInfo_btDefaultCollisionConstructionInfo_0"];var _emscripten_bind_btDefaultMotionState___destroy___0=Module["_emscripten_bind_btDefaultMotionState___destroy___0"]=asm["_emscripten_bind_btDefaultMotionState___destroy___0"];var _emscripten_bind_btDefaultMotionState_btDefaultMotionState_0=Module["_emscripten_bind_btDefaultMotionState_btDefaultMotionState_0"]=asm["_emscripten_bind_btDefaultMotionState_btDefaultMotionState_0"];var _emscripten_bind_btDefaultMotionState_btDefaultMotionState_1=Module["_emscripten_bind_btDefaultMotionState_btDefaultMotionState_1"]=asm["_emscripten_bind_btDefaultMotionState_btDefaultMotionState_1"];var _emscripten_bind_btDefaultMotionState_btDefaultMotionState_2=Module["_emscripten_bind_btDefaultMotionState_btDefaultMotionState_2"]=asm["_emscripten_bind_btDefaultMotionState_btDefaultMotionState_2"];var _emscripten_bind_btDefaultMotionState_getWorldTransform_1=Module["_emscripten_bind_btDefaultMotionState_getWorldTransform_1"]=asm["_emscripten_bind_btDefaultMotionState_getWorldTransform_1"];var _emscripten_bind_btDefaultMotionState_get_m_graphicsWorldTrans_0=Module["_emscripten_bind_btDefaultMotionState_get_m_graphicsWorldTrans_0"]=asm["_emscripten_bind_btDefaultMotionState_get_m_graphicsWorldTrans_0"];var _emscripten_bind_btDefaultMotionState_setWorldTransform_1=Module["_emscripten_bind_btDefaultMotionState_setWorldTransform_1"]=asm["_emscripten_bind_btDefaultMotionState_setWorldTransform_1"];var _emscripten_bind_btDefaultMotionState_set_m_graphicsWorldTrans_1=Module["_emscripten_bind_btDefaultMotionState_set_m_graphicsWorldTrans_1"]=asm["_emscripten_bind_btDefaultMotionState_set_m_graphicsWorldTrans_1"];var _emscripten_bind_btDefaultSoftBodySolver___destroy___0=Module["_emscripten_bind_btDefaultSoftBodySolver___destroy___0"]=asm["_emscripten_bind_btDefaultSoftBodySolver___destroy___0"];var _emscripten_bind_btDefaultSoftBodySolver_btDefaultSoftBodySolver_0=Module["_emscripten_bind_btDefaultSoftBodySolver_btDefaultSoftBodySolver_0"]=asm["_emscripten_bind_btDefaultSoftBodySolver_btDefaultSoftBodySolver_0"];var _emscripten_bind_btDefaultVehicleRaycaster___destroy___0=Module["_emscripten_bind_btDefaultVehicleRaycaster___destroy___0"]=asm["_emscripten_bind_btDefaultVehicleRaycaster___destroy___0"];var _emscripten_bind_btDefaultVehicleRaycaster_btDefaultVehicleRaycaster_1=Module["_emscripten_bind_btDefaultVehicleRaycaster_btDefaultVehicleRaycaster_1"]=asm["_emscripten_bind_btDefaultVehicleRaycaster_btDefaultVehicleRaycaster_1"];var _emscripten_bind_btDefaultVehicleRaycaster_castRay_3=Module["_emscripten_bind_btDefaultVehicleRaycaster_castRay_3"]=asm["_emscripten_bind_btDefaultVehicleRaycaster_castRay_3"];var _emscripten_bind_btDiscreteDynamicsWorld___destroy___0=Module["_emscripten_bind_btDiscreteDynamicsWorld___destroy___0"]=asm["_emscripten_bind_btDiscreteDynamicsWorld___destroy___0"];var _emscripten_bind_btDiscreteDynamicsWorld_addAction_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_addAction_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addAction_1"];var _emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_1"];var _emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_2=Module["_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_2"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_2"];var _emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_3=Module["_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_3"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_3"];var _emscripten_bind_btDiscreteDynamicsWorld_addConstraint_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_addConstraint_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addConstraint_1"];var _emscripten_bind_btDiscreteDynamicsWorld_addConstraint_2=Module["_emscripten_bind_btDiscreteDynamicsWorld_addConstraint_2"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addConstraint_2"];var _emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_1"];var _emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_3=Module["_emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_3"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_3"];var _emscripten_bind_btDiscreteDynamicsWorld_addVehicle_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_addVehicle_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_addVehicle_1"];var _emscripten_bind_btDiscreteDynamicsWorld_btDiscreteDynamicsWorld_4=Module["_emscripten_bind_btDiscreteDynamicsWorld_btDiscreteDynamicsWorld_4"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_btDiscreteDynamicsWorld_4"];var _emscripten_bind_btDiscreteDynamicsWorld_contactPairTest_3=Module["_emscripten_bind_btDiscreteDynamicsWorld_contactPairTest_3"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_contactPairTest_3"];var _emscripten_bind_btDiscreteDynamicsWorld_contactTest_2=Module["_emscripten_bind_btDiscreteDynamicsWorld_contactTest_2"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_contactTest_2"];var _emscripten_bind_btDiscreteDynamicsWorld_convexSweepTest_5=Module["_emscripten_bind_btDiscreteDynamicsWorld_convexSweepTest_5"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_convexSweepTest_5"];var _emscripten_bind_btDiscreteDynamicsWorld_getBroadphase_0=Module["_emscripten_bind_btDiscreteDynamicsWorld_getBroadphase_0"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_getBroadphase_0"];var _emscripten_bind_btDiscreteDynamicsWorld_getDispatchInfo_0=Module["_emscripten_bind_btDiscreteDynamicsWorld_getDispatchInfo_0"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_getDispatchInfo_0"];var _emscripten_bind_btDiscreteDynamicsWorld_getDispatcher_0=Module["_emscripten_bind_btDiscreteDynamicsWorld_getDispatcher_0"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_getDispatcher_0"];var _emscripten_bind_btDiscreteDynamicsWorld_getGravity_0=Module["_emscripten_bind_btDiscreteDynamicsWorld_getGravity_0"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_getGravity_0"];var _emscripten_bind_btDiscreteDynamicsWorld_getPairCache_0=Module["_emscripten_bind_btDiscreteDynamicsWorld_getPairCache_0"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_getPairCache_0"];var _emscripten_bind_btDiscreteDynamicsWorld_getSolverInfo_0=Module["_emscripten_bind_btDiscreteDynamicsWorld_getSolverInfo_0"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_getSolverInfo_0"];var _emscripten_bind_btDiscreteDynamicsWorld_rayTest_3=Module["_emscripten_bind_btDiscreteDynamicsWorld_rayTest_3"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_rayTest_3"];var _emscripten_bind_btDiscreteDynamicsWorld_removeAction_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_removeAction_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_removeAction_1"];var _emscripten_bind_btDiscreteDynamicsWorld_removeCollisionObject_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_removeCollisionObject_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_removeCollisionObject_1"];var _emscripten_bind_btDiscreteDynamicsWorld_removeConstraint_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_removeConstraint_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_removeConstraint_1"];var _emscripten_bind_btDiscreteDynamicsWorld_removeRigidBody_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_removeRigidBody_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_removeRigidBody_1"];var _emscripten_bind_btDiscreteDynamicsWorld_removeVehicle_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_removeVehicle_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_removeVehicle_1"];var _emscripten_bind_btDiscreteDynamicsWorld_setGravity_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_setGravity_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_setGravity_1"];var _emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_1"];var _emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_2=Module["_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_2"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_2"];var _emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_3=Module["_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_3"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_3"];var _emscripten_bind_btDiscreteDynamicsWorld_updateSingleAabb_1=Module["_emscripten_bind_btDiscreteDynamicsWorld_updateSingleAabb_1"]=asm["_emscripten_bind_btDiscreteDynamicsWorld_updateSingleAabb_1"];var _emscripten_bind_btDispatcherInfo___destroy___0=Module["_emscripten_bind_btDispatcherInfo___destroy___0"]=asm["_emscripten_bind_btDispatcherInfo___destroy___0"];var _emscripten_bind_btDispatcherInfo_get_m_allowedCcdPenetration_0=Module["_emscripten_bind_btDispatcherInfo_get_m_allowedCcdPenetration_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_allowedCcdPenetration_0"];var _emscripten_bind_btDispatcherInfo_get_m_convexConservativeDistanceThreshold_0=Module["_emscripten_bind_btDispatcherInfo_get_m_convexConservativeDistanceThreshold_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_convexConservativeDistanceThreshold_0"];var _emscripten_bind_btDispatcherInfo_get_m_dispatchFunc_0=Module["_emscripten_bind_btDispatcherInfo_get_m_dispatchFunc_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_dispatchFunc_0"];var _emscripten_bind_btDispatcherInfo_get_m_enableSPU_0=Module["_emscripten_bind_btDispatcherInfo_get_m_enableSPU_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_enableSPU_0"];var _emscripten_bind_btDispatcherInfo_get_m_enableSatConvex_0=Module["_emscripten_bind_btDispatcherInfo_get_m_enableSatConvex_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_enableSatConvex_0"];var _emscripten_bind_btDispatcherInfo_get_m_stepCount_0=Module["_emscripten_bind_btDispatcherInfo_get_m_stepCount_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_stepCount_0"];var _emscripten_bind_btDispatcherInfo_get_m_timeOfImpact_0=Module["_emscripten_bind_btDispatcherInfo_get_m_timeOfImpact_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_timeOfImpact_0"];var _emscripten_bind_btDispatcherInfo_get_m_timeStep_0=Module["_emscripten_bind_btDispatcherInfo_get_m_timeStep_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_timeStep_0"];var _emscripten_bind_btDispatcherInfo_get_m_useContinuous_0=Module["_emscripten_bind_btDispatcherInfo_get_m_useContinuous_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_useContinuous_0"];var _emscripten_bind_btDispatcherInfo_get_m_useConvexConservativeDistanceUtil_0=Module["_emscripten_bind_btDispatcherInfo_get_m_useConvexConservativeDistanceUtil_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_useConvexConservativeDistanceUtil_0"];var _emscripten_bind_btDispatcherInfo_get_m_useEpa_0=Module["_emscripten_bind_btDispatcherInfo_get_m_useEpa_0"]=asm["_emscripten_bind_btDispatcherInfo_get_m_useEpa_0"];var _emscripten_bind_btDispatcherInfo_set_m_allowedCcdPenetration_1=Module["_emscripten_bind_btDispatcherInfo_set_m_allowedCcdPenetration_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_allowedCcdPenetration_1"];var _emscripten_bind_btDispatcherInfo_set_m_convexConservativeDistanceThreshold_1=Module["_emscripten_bind_btDispatcherInfo_set_m_convexConservativeDistanceThreshold_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_convexConservativeDistanceThreshold_1"];var _emscripten_bind_btDispatcherInfo_set_m_dispatchFunc_1=Module["_emscripten_bind_btDispatcherInfo_set_m_dispatchFunc_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_dispatchFunc_1"];var _emscripten_bind_btDispatcherInfo_set_m_enableSPU_1=Module["_emscripten_bind_btDispatcherInfo_set_m_enableSPU_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_enableSPU_1"];var _emscripten_bind_btDispatcherInfo_set_m_enableSatConvex_1=Module["_emscripten_bind_btDispatcherInfo_set_m_enableSatConvex_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_enableSatConvex_1"];var _emscripten_bind_btDispatcherInfo_set_m_stepCount_1=Module["_emscripten_bind_btDispatcherInfo_set_m_stepCount_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_stepCount_1"];var _emscripten_bind_btDispatcherInfo_set_m_timeOfImpact_1=Module["_emscripten_bind_btDispatcherInfo_set_m_timeOfImpact_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_timeOfImpact_1"];var _emscripten_bind_btDispatcherInfo_set_m_timeStep_1=Module["_emscripten_bind_btDispatcherInfo_set_m_timeStep_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_timeStep_1"];var _emscripten_bind_btDispatcherInfo_set_m_useContinuous_1=Module["_emscripten_bind_btDispatcherInfo_set_m_useContinuous_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_useContinuous_1"];var _emscripten_bind_btDispatcherInfo_set_m_useConvexConservativeDistanceUtil_1=Module["_emscripten_bind_btDispatcherInfo_set_m_useConvexConservativeDistanceUtil_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_useConvexConservativeDistanceUtil_1"];var _emscripten_bind_btDispatcherInfo_set_m_useEpa_1=Module["_emscripten_bind_btDispatcherInfo_set_m_useEpa_1"]=asm["_emscripten_bind_btDispatcherInfo_set_m_useEpa_1"];var _emscripten_bind_btDispatcher___destroy___0=Module["_emscripten_bind_btDispatcher___destroy___0"]=asm["_emscripten_bind_btDispatcher___destroy___0"];var _emscripten_bind_btDispatcher_getManifoldByIndexInternal_1=Module["_emscripten_bind_btDispatcher_getManifoldByIndexInternal_1"]=asm["_emscripten_bind_btDispatcher_getManifoldByIndexInternal_1"];var _emscripten_bind_btDispatcher_getNumManifolds_0=Module["_emscripten_bind_btDispatcher_getNumManifolds_0"]=asm["_emscripten_bind_btDispatcher_getNumManifolds_0"];var _emscripten_bind_btDynamicsWorld___destroy___0=Module["_emscripten_bind_btDynamicsWorld___destroy___0"]=asm["_emscripten_bind_btDynamicsWorld___destroy___0"];var _emscripten_bind_btDynamicsWorld_addAction_1=Module["_emscripten_bind_btDynamicsWorld_addAction_1"]=asm["_emscripten_bind_btDynamicsWorld_addAction_1"];var _emscripten_bind_btDynamicsWorld_addCollisionObject_1=Module["_emscripten_bind_btDynamicsWorld_addCollisionObject_1"]=asm["_emscripten_bind_btDynamicsWorld_addCollisionObject_1"];var _emscripten_bind_btDynamicsWorld_addCollisionObject_2=Module["_emscripten_bind_btDynamicsWorld_addCollisionObject_2"]=asm["_emscripten_bind_btDynamicsWorld_addCollisionObject_2"];var _emscripten_bind_btDynamicsWorld_addCollisionObject_3=Module["_emscripten_bind_btDynamicsWorld_addCollisionObject_3"]=asm["_emscripten_bind_btDynamicsWorld_addCollisionObject_3"];var _emscripten_bind_btDynamicsWorld_contactPairTest_3=Module["_emscripten_bind_btDynamicsWorld_contactPairTest_3"]=asm["_emscripten_bind_btDynamicsWorld_contactPairTest_3"];var _emscripten_bind_btDynamicsWorld_contactTest_2=Module["_emscripten_bind_btDynamicsWorld_contactTest_2"]=asm["_emscripten_bind_btDynamicsWorld_contactTest_2"];var _emscripten_bind_btDynamicsWorld_convexSweepTest_5=Module["_emscripten_bind_btDynamicsWorld_convexSweepTest_5"]=asm["_emscripten_bind_btDynamicsWorld_convexSweepTest_5"];var _emscripten_bind_btDynamicsWorld_getBroadphase_0=Module["_emscripten_bind_btDynamicsWorld_getBroadphase_0"]=asm["_emscripten_bind_btDynamicsWorld_getBroadphase_0"];var _emscripten_bind_btDynamicsWorld_getDispatchInfo_0=Module["_emscripten_bind_btDynamicsWorld_getDispatchInfo_0"]=asm["_emscripten_bind_btDynamicsWorld_getDispatchInfo_0"];var _emscripten_bind_btDynamicsWorld_getDispatcher_0=Module["_emscripten_bind_btDynamicsWorld_getDispatcher_0"]=asm["_emscripten_bind_btDynamicsWorld_getDispatcher_0"];var _emscripten_bind_btDynamicsWorld_getPairCache_0=Module["_emscripten_bind_btDynamicsWorld_getPairCache_0"]=asm["_emscripten_bind_btDynamicsWorld_getPairCache_0"];var _emscripten_bind_btDynamicsWorld_getSolverInfo_0=Module["_emscripten_bind_btDynamicsWorld_getSolverInfo_0"]=asm["_emscripten_bind_btDynamicsWorld_getSolverInfo_0"];var _emscripten_bind_btDynamicsWorld_rayTest_3=Module["_emscripten_bind_btDynamicsWorld_rayTest_3"]=asm["_emscripten_bind_btDynamicsWorld_rayTest_3"];var _emscripten_bind_btDynamicsWorld_removeAction_1=Module["_emscripten_bind_btDynamicsWorld_removeAction_1"]=asm["_emscripten_bind_btDynamicsWorld_removeAction_1"];var _emscripten_bind_btDynamicsWorld_removeCollisionObject_1=Module["_emscripten_bind_btDynamicsWorld_removeCollisionObject_1"]=asm["_emscripten_bind_btDynamicsWorld_removeCollisionObject_1"];var _emscripten_bind_btDynamicsWorld_updateSingleAabb_1=Module["_emscripten_bind_btDynamicsWorld_updateSingleAabb_1"]=asm["_emscripten_bind_btDynamicsWorld_updateSingleAabb_1"];var _emscripten_bind_btFixedConstraint___destroy___0=Module["_emscripten_bind_btFixedConstraint___destroy___0"]=asm["_emscripten_bind_btFixedConstraint___destroy___0"];var _emscripten_bind_btFixedConstraint_btFixedConstraint_4=Module["_emscripten_bind_btFixedConstraint_btFixedConstraint_4"]=asm["_emscripten_bind_btFixedConstraint_btFixedConstraint_4"];var _emscripten_bind_btFixedConstraint_enableFeedback_1=Module["_emscripten_bind_btFixedConstraint_enableFeedback_1"]=asm["_emscripten_bind_btFixedConstraint_enableFeedback_1"];var _emscripten_bind_btFixedConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btFixedConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btFixedConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btFixedConstraint_getParam_2=Module["_emscripten_bind_btFixedConstraint_getParam_2"]=asm["_emscripten_bind_btFixedConstraint_getParam_2"];var _emscripten_bind_btFixedConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btFixedConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btFixedConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btFixedConstraint_setParam_3=Module["_emscripten_bind_btFixedConstraint_setParam_3"]=asm["_emscripten_bind_btFixedConstraint_setParam_3"];var _emscripten_bind_btGeneric6DofConstraint___destroy___0=Module["_emscripten_bind_btGeneric6DofConstraint___destroy___0"]=asm["_emscripten_bind_btGeneric6DofConstraint___destroy___0"];var _emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_3=Module["_emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_3"]=asm["_emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_3"];var _emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_5=Module["_emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_5"]=asm["_emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_5"];var _emscripten_bind_btGeneric6DofConstraint_enableFeedback_1=Module["_emscripten_bind_btGeneric6DofConstraint_enableFeedback_1"]=asm["_emscripten_bind_btGeneric6DofConstraint_enableFeedback_1"];var _emscripten_bind_btGeneric6DofConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btGeneric6DofConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btGeneric6DofConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btGeneric6DofConstraint_getParam_2=Module["_emscripten_bind_btGeneric6DofConstraint_getParam_2"]=asm["_emscripten_bind_btGeneric6DofConstraint_getParam_2"];var _emscripten_bind_btGeneric6DofConstraint_getRotationalLimitMotor_1=Module["_emscripten_bind_btGeneric6DofConstraint_getRotationalLimitMotor_1"]=asm["_emscripten_bind_btGeneric6DofConstraint_getRotationalLimitMotor_1"];var _emscripten_bind_btGeneric6DofConstraint_setAngularLowerLimit_1=Module["_emscripten_bind_btGeneric6DofConstraint_setAngularLowerLimit_1"]=asm["_emscripten_bind_btGeneric6DofConstraint_setAngularLowerLimit_1"];var _emscripten_bind_btGeneric6DofConstraint_setAngularUpperLimit_1=Module["_emscripten_bind_btGeneric6DofConstraint_setAngularUpperLimit_1"]=asm["_emscripten_bind_btGeneric6DofConstraint_setAngularUpperLimit_1"];var _emscripten_bind_btGeneric6DofConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btGeneric6DofConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btGeneric6DofConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btGeneric6DofConstraint_setLinearLowerLimit_1=Module["_emscripten_bind_btGeneric6DofConstraint_setLinearLowerLimit_1"]=asm["_emscripten_bind_btGeneric6DofConstraint_setLinearLowerLimit_1"];var _emscripten_bind_btGeneric6DofConstraint_setLinearUpperLimit_1=Module["_emscripten_bind_btGeneric6DofConstraint_setLinearUpperLimit_1"]=asm["_emscripten_bind_btGeneric6DofConstraint_setLinearUpperLimit_1"];var _emscripten_bind_btGeneric6DofConstraint_setParam_3=Module["_emscripten_bind_btGeneric6DofConstraint_setParam_3"]=asm["_emscripten_bind_btGeneric6DofConstraint_setParam_3"];var _emscripten_bind_btGeneric6DofSpringConstraint___destroy___0=Module["_emscripten_bind_btGeneric6DofSpringConstraint___destroy___0"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint___destroy___0"];var _emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_3=Module["_emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_3"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_3"];var _emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_5=Module["_emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_5"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_5"];var _emscripten_bind_btGeneric6DofSpringConstraint_enableFeedback_1=Module["_emscripten_bind_btGeneric6DofSpringConstraint_enableFeedback_1"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_enableFeedback_1"];var _emscripten_bind_btGeneric6DofSpringConstraint_enableSpring_2=Module["_emscripten_bind_btGeneric6DofSpringConstraint_enableSpring_2"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_enableSpring_2"];var _emscripten_bind_btGeneric6DofSpringConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btGeneric6DofSpringConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btGeneric6DofSpringConstraint_getParam_2=Module["_emscripten_bind_btGeneric6DofSpringConstraint_getParam_2"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_getParam_2"];var _emscripten_bind_btGeneric6DofSpringConstraint_getRotationalLimitMotor_1=Module["_emscripten_bind_btGeneric6DofSpringConstraint_getRotationalLimitMotor_1"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_getRotationalLimitMotor_1"];var _emscripten_bind_btGeneric6DofSpringConstraint_setAngularLowerLimit_1=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setAngularLowerLimit_1"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setAngularLowerLimit_1"];var _emscripten_bind_btGeneric6DofSpringConstraint_setAngularUpperLimit_1=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setAngularUpperLimit_1"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setAngularUpperLimit_1"];var _emscripten_bind_btGeneric6DofSpringConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btGeneric6DofSpringConstraint_setDamping_2=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setDamping_2"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setDamping_2"];var _emscripten_bind_btGeneric6DofSpringConstraint_setLinearLowerLimit_1=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setLinearLowerLimit_1"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setLinearLowerLimit_1"];var _emscripten_bind_btGeneric6DofSpringConstraint_setLinearUpperLimit_1=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setLinearUpperLimit_1"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setLinearUpperLimit_1"];var _emscripten_bind_btGeneric6DofSpringConstraint_setParam_3=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setParam_3"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setParam_3"];var _emscripten_bind_btGeneric6DofSpringConstraint_setStiffness_2=Module["_emscripten_bind_btGeneric6DofSpringConstraint_setStiffness_2"]=asm["_emscripten_bind_btGeneric6DofSpringConstraint_setStiffness_2"];var _emscripten_bind_btGhostObject___destroy___0=Module["_emscripten_bind_btGhostObject___destroy___0"]=asm["_emscripten_bind_btGhostObject___destroy___0"];var _emscripten_bind_btGhostObject_activate_0=Module["_emscripten_bind_btGhostObject_activate_0"]=asm["_emscripten_bind_btGhostObject_activate_0"];var _emscripten_bind_btGhostObject_activate_1=Module["_emscripten_bind_btGhostObject_activate_1"]=asm["_emscripten_bind_btGhostObject_activate_1"];var _emscripten_bind_btGhostObject_btGhostObject_0=Module["_emscripten_bind_btGhostObject_btGhostObject_0"]=asm["_emscripten_bind_btGhostObject_btGhostObject_0"];var _emscripten_bind_btGhostObject_forceActivationState_1=Module["_emscripten_bind_btGhostObject_forceActivationState_1"]=asm["_emscripten_bind_btGhostObject_forceActivationState_1"];var _emscripten_bind_btGhostObject_getCollisionFlags_0=Module["_emscripten_bind_btGhostObject_getCollisionFlags_0"]=asm["_emscripten_bind_btGhostObject_getCollisionFlags_0"];var _emscripten_bind_btGhostObject_getCollisionShape_0=Module["_emscripten_bind_btGhostObject_getCollisionShape_0"]=asm["_emscripten_bind_btGhostObject_getCollisionShape_0"];var _emscripten_bind_btGhostObject_getNumOverlappingObjects_0=Module["_emscripten_bind_btGhostObject_getNumOverlappingObjects_0"]=asm["_emscripten_bind_btGhostObject_getNumOverlappingObjects_0"];var _emscripten_bind_btGhostObject_getOverlappingObject_1=Module["_emscripten_bind_btGhostObject_getOverlappingObject_1"]=asm["_emscripten_bind_btGhostObject_getOverlappingObject_1"];var _emscripten_bind_btGhostObject_getUserIndex_0=Module["_emscripten_bind_btGhostObject_getUserIndex_0"]=asm["_emscripten_bind_btGhostObject_getUserIndex_0"];var _emscripten_bind_btGhostObject_getUserPointer_0=Module["_emscripten_bind_btGhostObject_getUserPointer_0"]=asm["_emscripten_bind_btGhostObject_getUserPointer_0"];var _emscripten_bind_btGhostObject_getWorldTransform_0=Module["_emscripten_bind_btGhostObject_getWorldTransform_0"]=asm["_emscripten_bind_btGhostObject_getWorldTransform_0"];var _emscripten_bind_btGhostObject_isActive_0=Module["_emscripten_bind_btGhostObject_isActive_0"]=asm["_emscripten_bind_btGhostObject_isActive_0"];var _emscripten_bind_btGhostObject_isKinematicObject_0=Module["_emscripten_bind_btGhostObject_isKinematicObject_0"]=asm["_emscripten_bind_btGhostObject_isKinematicObject_0"];var _emscripten_bind_btGhostObject_isStaticObject_0=Module["_emscripten_bind_btGhostObject_isStaticObject_0"]=asm["_emscripten_bind_btGhostObject_isStaticObject_0"];var _emscripten_bind_btGhostObject_isStaticOrKinematicObject_0=Module["_emscripten_bind_btGhostObject_isStaticOrKinematicObject_0"]=asm["_emscripten_bind_btGhostObject_isStaticOrKinematicObject_0"];var _emscripten_bind_btGhostObject_setActivationState_1=Module["_emscripten_bind_btGhostObject_setActivationState_1"]=asm["_emscripten_bind_btGhostObject_setActivationState_1"];var _emscripten_bind_btGhostObject_setAnisotropicFriction_2=Module["_emscripten_bind_btGhostObject_setAnisotropicFriction_2"]=asm["_emscripten_bind_btGhostObject_setAnisotropicFriction_2"];var _emscripten_bind_btGhostObject_setCcdMotionThreshold_1=Module["_emscripten_bind_btGhostObject_setCcdMotionThreshold_1"]=asm["_emscripten_bind_btGhostObject_setCcdMotionThreshold_1"];var _emscripten_bind_btGhostObject_setCcdSweptSphereRadius_1=Module["_emscripten_bind_btGhostObject_setCcdSweptSphereRadius_1"]=asm["_emscripten_bind_btGhostObject_setCcdSweptSphereRadius_1"];var _emscripten_bind_btGhostObject_setCollisionFlags_1=Module["_emscripten_bind_btGhostObject_setCollisionFlags_1"]=asm["_emscripten_bind_btGhostObject_setCollisionFlags_1"];var _emscripten_bind_btGhostObject_setCollisionShape_1=Module["_emscripten_bind_btGhostObject_setCollisionShape_1"]=asm["_emscripten_bind_btGhostObject_setCollisionShape_1"];var _emscripten_bind_btGhostObject_setContactProcessingThreshold_1=Module["_emscripten_bind_btGhostObject_setContactProcessingThreshold_1"]=asm["_emscripten_bind_btGhostObject_setContactProcessingThreshold_1"];var _emscripten_bind_btGhostObject_setFriction_1=Module["_emscripten_bind_btGhostObject_setFriction_1"]=asm["_emscripten_bind_btGhostObject_setFriction_1"];var _emscripten_bind_btGhostObject_setRestitution_1=Module["_emscripten_bind_btGhostObject_setRestitution_1"]=asm["_emscripten_bind_btGhostObject_setRestitution_1"];var _emscripten_bind_btGhostObject_setRollingFriction_1=Module["_emscripten_bind_btGhostObject_setRollingFriction_1"]=asm["_emscripten_bind_btGhostObject_setRollingFriction_1"];var _emscripten_bind_btGhostObject_setUserIndex_1=Module["_emscripten_bind_btGhostObject_setUserIndex_1"]=asm["_emscripten_bind_btGhostObject_setUserIndex_1"];var _emscripten_bind_btGhostObject_setUserPointer_1=Module["_emscripten_bind_btGhostObject_setUserPointer_1"]=asm["_emscripten_bind_btGhostObject_setUserPointer_1"];var _emscripten_bind_btGhostObject_setWorldTransform_1=Module["_emscripten_bind_btGhostObject_setWorldTransform_1"]=asm["_emscripten_bind_btGhostObject_setWorldTransform_1"];var _emscripten_bind_btGhostPairCallback___destroy___0=Module["_emscripten_bind_btGhostPairCallback___destroy___0"]=asm["_emscripten_bind_btGhostPairCallback___destroy___0"];var _emscripten_bind_btGhostPairCallback_btGhostPairCallback_0=Module["_emscripten_bind_btGhostPairCallback_btGhostPairCallback_0"]=asm["_emscripten_bind_btGhostPairCallback_btGhostPairCallback_0"];var _emscripten_bind_btHeightfieldTerrainShape___destroy___0=Module["_emscripten_bind_btHeightfieldTerrainShape___destroy___0"]=asm["_emscripten_bind_btHeightfieldTerrainShape___destroy___0"];var _emscripten_bind_btHeightfieldTerrainShape_btHeightfieldTerrainShape_9=Module["_emscripten_bind_btHeightfieldTerrainShape_btHeightfieldTerrainShape_9"]=asm["_emscripten_bind_btHeightfieldTerrainShape_btHeightfieldTerrainShape_9"];var _emscripten_bind_btHeightfieldTerrainShape_calculateLocalInertia_2=Module["_emscripten_bind_btHeightfieldTerrainShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btHeightfieldTerrainShape_calculateLocalInertia_2"];var _emscripten_bind_btHeightfieldTerrainShape_getLocalScaling_0=Module["_emscripten_bind_btHeightfieldTerrainShape_getLocalScaling_0"]=asm["_emscripten_bind_btHeightfieldTerrainShape_getLocalScaling_0"];var _emscripten_bind_btHeightfieldTerrainShape_getMargin_0=Module["_emscripten_bind_btHeightfieldTerrainShape_getMargin_0"]=asm["_emscripten_bind_btHeightfieldTerrainShape_getMargin_0"];var _emscripten_bind_btHeightfieldTerrainShape_setLocalScaling_1=Module["_emscripten_bind_btHeightfieldTerrainShape_setLocalScaling_1"]=asm["_emscripten_bind_btHeightfieldTerrainShape_setLocalScaling_1"];var _emscripten_bind_btHeightfieldTerrainShape_setMargin_1=Module["_emscripten_bind_btHeightfieldTerrainShape_setMargin_1"]=asm["_emscripten_bind_btHeightfieldTerrainShape_setMargin_1"];var _emscripten_bind_btHingeConstraint___destroy___0=Module["_emscripten_bind_btHingeConstraint___destroy___0"]=asm["_emscripten_bind_btHingeConstraint___destroy___0"];var _emscripten_bind_btHingeConstraint_btHingeConstraint_2=Module["_emscripten_bind_btHingeConstraint_btHingeConstraint_2"]=asm["_emscripten_bind_btHingeConstraint_btHingeConstraint_2"];var _emscripten_bind_btHingeConstraint_btHingeConstraint_3=Module["_emscripten_bind_btHingeConstraint_btHingeConstraint_3"]=asm["_emscripten_bind_btHingeConstraint_btHingeConstraint_3"];var _emscripten_bind_btHingeConstraint_btHingeConstraint_4=Module["_emscripten_bind_btHingeConstraint_btHingeConstraint_4"]=asm["_emscripten_bind_btHingeConstraint_btHingeConstraint_4"];var _emscripten_bind_btHingeConstraint_btHingeConstraint_5=Module["_emscripten_bind_btHingeConstraint_btHingeConstraint_5"]=asm["_emscripten_bind_btHingeConstraint_btHingeConstraint_5"];var _emscripten_bind_btHingeConstraint_btHingeConstraint_6=Module["_emscripten_bind_btHingeConstraint_btHingeConstraint_6"]=asm["_emscripten_bind_btHingeConstraint_btHingeConstraint_6"];var _emscripten_bind_btHingeConstraint_btHingeConstraint_7=Module["_emscripten_bind_btHingeConstraint_btHingeConstraint_7"]=asm["_emscripten_bind_btHingeConstraint_btHingeConstraint_7"];var _emscripten_bind_btHingeConstraint_enableAngularMotor_3=Module["_emscripten_bind_btHingeConstraint_enableAngularMotor_3"]=asm["_emscripten_bind_btHingeConstraint_enableAngularMotor_3"];var _emscripten_bind_btHingeConstraint_enableFeedback_1=Module["_emscripten_bind_btHingeConstraint_enableFeedback_1"]=asm["_emscripten_bind_btHingeConstraint_enableFeedback_1"];var _emscripten_bind_btHingeConstraint_enableMotor_1=Module["_emscripten_bind_btHingeConstraint_enableMotor_1"]=asm["_emscripten_bind_btHingeConstraint_enableMotor_1"];var _emscripten_bind_btHingeConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btHingeConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btHingeConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btHingeConstraint_getParam_2=Module["_emscripten_bind_btHingeConstraint_getParam_2"]=asm["_emscripten_bind_btHingeConstraint_getParam_2"];var _emscripten_bind_btHingeConstraint_setAngularOnly_1=Module["_emscripten_bind_btHingeConstraint_setAngularOnly_1"]=asm["_emscripten_bind_btHingeConstraint_setAngularOnly_1"];var _emscripten_bind_btHingeConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btHingeConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btHingeConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btHingeConstraint_setLimit_4=Module["_emscripten_bind_btHingeConstraint_setLimit_4"]=asm["_emscripten_bind_btHingeConstraint_setLimit_4"];var _emscripten_bind_btHingeConstraint_setLimit_5=Module["_emscripten_bind_btHingeConstraint_setLimit_5"]=asm["_emscripten_bind_btHingeConstraint_setLimit_5"];var _emscripten_bind_btHingeConstraint_setMaxMotorImpulse_1=Module["_emscripten_bind_btHingeConstraint_setMaxMotorImpulse_1"]=asm["_emscripten_bind_btHingeConstraint_setMaxMotorImpulse_1"];var _emscripten_bind_btHingeConstraint_setMotorTarget_2=Module["_emscripten_bind_btHingeConstraint_setMotorTarget_2"]=asm["_emscripten_bind_btHingeConstraint_setMotorTarget_2"];var _emscripten_bind_btHingeConstraint_setParam_3=Module["_emscripten_bind_btHingeConstraint_setParam_3"]=asm["_emscripten_bind_btHingeConstraint_setParam_3"];var _emscripten_bind_btKinematicCharacterController___destroy___0=Module["_emscripten_bind_btKinematicCharacterController___destroy___0"]=asm["_emscripten_bind_btKinematicCharacterController___destroy___0"];var _emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_3=Module["_emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_3"]=asm["_emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_3"];var _emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_4=Module["_emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_4"]=asm["_emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_4"];var _emscripten_bind_btKinematicCharacterController_canJump_0=Module["_emscripten_bind_btKinematicCharacterController_canJump_0"]=asm["_emscripten_bind_btKinematicCharacterController_canJump_0"];var _emscripten_bind_btKinematicCharacterController_getGhostObject_0=Module["_emscripten_bind_btKinematicCharacterController_getGhostObject_0"]=asm["_emscripten_bind_btKinematicCharacterController_getGhostObject_0"];var _emscripten_bind_btKinematicCharacterController_getGravity_0=Module["_emscripten_bind_btKinematicCharacterController_getGravity_0"]=asm["_emscripten_bind_btKinematicCharacterController_getGravity_0"];var _emscripten_bind_btKinematicCharacterController_getMaxSlope_0=Module["_emscripten_bind_btKinematicCharacterController_getMaxSlope_0"]=asm["_emscripten_bind_btKinematicCharacterController_getMaxSlope_0"];var _emscripten_bind_btKinematicCharacterController_jump_0=Module["_emscripten_bind_btKinematicCharacterController_jump_0"]=asm["_emscripten_bind_btKinematicCharacterController_jump_0"];var _emscripten_bind_btKinematicCharacterController_onGround_0=Module["_emscripten_bind_btKinematicCharacterController_onGround_0"]=asm["_emscripten_bind_btKinematicCharacterController_onGround_0"];var _emscripten_bind_btKinematicCharacterController_playerStep_2=Module["_emscripten_bind_btKinematicCharacterController_playerStep_2"]=asm["_emscripten_bind_btKinematicCharacterController_playerStep_2"];var _emscripten_bind_btKinematicCharacterController_preStep_1=Module["_emscripten_bind_btKinematicCharacterController_preStep_1"]=asm["_emscripten_bind_btKinematicCharacterController_preStep_1"];var _emscripten_bind_btKinematicCharacterController_setFallSpeed_1=Module["_emscripten_bind_btKinematicCharacterController_setFallSpeed_1"]=asm["_emscripten_bind_btKinematicCharacterController_setFallSpeed_1"];var _emscripten_bind_btKinematicCharacterController_setGravity_1=Module["_emscripten_bind_btKinematicCharacterController_setGravity_1"]=asm["_emscripten_bind_btKinematicCharacterController_setGravity_1"];var _emscripten_bind_btKinematicCharacterController_setJumpSpeed_1=Module["_emscripten_bind_btKinematicCharacterController_setJumpSpeed_1"]=asm["_emscripten_bind_btKinematicCharacterController_setJumpSpeed_1"];var _emscripten_bind_btKinematicCharacterController_setMaxJumpHeight_1=Module["_emscripten_bind_btKinematicCharacterController_setMaxJumpHeight_1"]=asm["_emscripten_bind_btKinematicCharacterController_setMaxJumpHeight_1"];var _emscripten_bind_btKinematicCharacterController_setMaxSlope_1=Module["_emscripten_bind_btKinematicCharacterController_setMaxSlope_1"]=asm["_emscripten_bind_btKinematicCharacterController_setMaxSlope_1"];var _emscripten_bind_btKinematicCharacterController_setUpInterpolate_1=Module["_emscripten_bind_btKinematicCharacterController_setUpInterpolate_1"]=asm["_emscripten_bind_btKinematicCharacterController_setUpInterpolate_1"];var _emscripten_bind_btKinematicCharacterController_setUp_1=Module["_emscripten_bind_btKinematicCharacterController_setUp_1"]=asm["_emscripten_bind_btKinematicCharacterController_setUp_1"];var _emscripten_bind_btKinematicCharacterController_setUseGhostSweepTest_1=Module["_emscripten_bind_btKinematicCharacterController_setUseGhostSweepTest_1"]=asm["_emscripten_bind_btKinematicCharacterController_setUseGhostSweepTest_1"];var _emscripten_bind_btKinematicCharacterController_setVelocityForTimeInterval_2=Module["_emscripten_bind_btKinematicCharacterController_setVelocityForTimeInterval_2"]=asm["_emscripten_bind_btKinematicCharacterController_setVelocityForTimeInterval_2"];var _emscripten_bind_btKinematicCharacterController_setWalkDirection_1=Module["_emscripten_bind_btKinematicCharacterController_setWalkDirection_1"]=asm["_emscripten_bind_btKinematicCharacterController_setWalkDirection_1"];var _emscripten_bind_btKinematicCharacterController_updateAction_2=Module["_emscripten_bind_btKinematicCharacterController_updateAction_2"]=asm["_emscripten_bind_btKinematicCharacterController_updateAction_2"];var _emscripten_bind_btKinematicCharacterController_warp_1=Module["_emscripten_bind_btKinematicCharacterController_warp_1"]=asm["_emscripten_bind_btKinematicCharacterController_warp_1"];var _emscripten_bind_btManifoldPoint___destroy___0=Module["_emscripten_bind_btManifoldPoint___destroy___0"]=asm["_emscripten_bind_btManifoldPoint___destroy___0"];var _emscripten_bind_btManifoldPoint_getAppliedImpulse_0=Module["_emscripten_bind_btManifoldPoint_getAppliedImpulse_0"]=asm["_emscripten_bind_btManifoldPoint_getAppliedImpulse_0"];var _emscripten_bind_btManifoldPoint_getDistance_0=Module["_emscripten_bind_btManifoldPoint_getDistance_0"]=asm["_emscripten_bind_btManifoldPoint_getDistance_0"];var _emscripten_bind_btManifoldPoint_getPositionWorldOnA_0=Module["_emscripten_bind_btManifoldPoint_getPositionWorldOnA_0"]=asm["_emscripten_bind_btManifoldPoint_getPositionWorldOnA_0"];var _emscripten_bind_btManifoldPoint_getPositionWorldOnB_0=Module["_emscripten_bind_btManifoldPoint_getPositionWorldOnB_0"]=asm["_emscripten_bind_btManifoldPoint_getPositionWorldOnB_0"];var _emscripten_bind_btManifoldPoint_get_m_localPointA_0=Module["_emscripten_bind_btManifoldPoint_get_m_localPointA_0"]=asm["_emscripten_bind_btManifoldPoint_get_m_localPointA_0"];var _emscripten_bind_btManifoldPoint_get_m_localPointB_0=Module["_emscripten_bind_btManifoldPoint_get_m_localPointB_0"]=asm["_emscripten_bind_btManifoldPoint_get_m_localPointB_0"];var _emscripten_bind_btManifoldPoint_get_m_normalWorldOnB_0=Module["_emscripten_bind_btManifoldPoint_get_m_normalWorldOnB_0"]=asm["_emscripten_bind_btManifoldPoint_get_m_normalWorldOnB_0"];var _emscripten_bind_btManifoldPoint_get_m_positionWorldOnA_0=Module["_emscripten_bind_btManifoldPoint_get_m_positionWorldOnA_0"]=asm["_emscripten_bind_btManifoldPoint_get_m_positionWorldOnA_0"];var _emscripten_bind_btManifoldPoint_get_m_positionWorldOnB_0=Module["_emscripten_bind_btManifoldPoint_get_m_positionWorldOnB_0"]=asm["_emscripten_bind_btManifoldPoint_get_m_positionWorldOnB_0"];var _emscripten_bind_btManifoldPoint_set_m_localPointA_1=Module["_emscripten_bind_btManifoldPoint_set_m_localPointA_1"]=asm["_emscripten_bind_btManifoldPoint_set_m_localPointA_1"];var _emscripten_bind_btManifoldPoint_set_m_localPointB_1=Module["_emscripten_bind_btManifoldPoint_set_m_localPointB_1"]=asm["_emscripten_bind_btManifoldPoint_set_m_localPointB_1"];var _emscripten_bind_btManifoldPoint_set_m_normalWorldOnB_1=Module["_emscripten_bind_btManifoldPoint_set_m_normalWorldOnB_1"]=asm["_emscripten_bind_btManifoldPoint_set_m_normalWorldOnB_1"];var _emscripten_bind_btManifoldPoint_set_m_positionWorldOnA_1=Module["_emscripten_bind_btManifoldPoint_set_m_positionWorldOnA_1"]=asm["_emscripten_bind_btManifoldPoint_set_m_positionWorldOnA_1"];var _emscripten_bind_btManifoldPoint_set_m_positionWorldOnB_1=Module["_emscripten_bind_btManifoldPoint_set_m_positionWorldOnB_1"]=asm["_emscripten_bind_btManifoldPoint_set_m_positionWorldOnB_1"];var _emscripten_bind_btMatrix3x3___destroy___0=Module["_emscripten_bind_btMatrix3x3___destroy___0"]=asm["_emscripten_bind_btMatrix3x3___destroy___0"];var _emscripten_bind_btMatrix3x3_getRotation_1=Module["_emscripten_bind_btMatrix3x3_getRotation_1"]=asm["_emscripten_bind_btMatrix3x3_getRotation_1"];var _emscripten_bind_btMatrix3x3_getRow_1=Module["_emscripten_bind_btMatrix3x3_getRow_1"]=asm["_emscripten_bind_btMatrix3x3_getRow_1"];var _emscripten_bind_btMatrix3x3_setEulerZYX_3=Module["_emscripten_bind_btMatrix3x3_setEulerZYX_3"]=asm["_emscripten_bind_btMatrix3x3_setEulerZYX_3"];var _emscripten_bind_btMotionState___destroy___0=Module["_emscripten_bind_btMotionState___destroy___0"]=asm["_emscripten_bind_btMotionState___destroy___0"];var _emscripten_bind_btMotionState_getWorldTransform_1=Module["_emscripten_bind_btMotionState_getWorldTransform_1"]=asm["_emscripten_bind_btMotionState_getWorldTransform_1"];var _emscripten_bind_btMotionState_setWorldTransform_1=Module["_emscripten_bind_btMotionState_setWorldTransform_1"]=asm["_emscripten_bind_btMotionState_setWorldTransform_1"];var _emscripten_bind_btOverlappingPairCache___destroy___0=Module["_emscripten_bind_btOverlappingPairCache___destroy___0"]=asm["_emscripten_bind_btOverlappingPairCache___destroy___0"];var _emscripten_bind_btOverlappingPairCache_setInternalGhostPairCallback_1=Module["_emscripten_bind_btOverlappingPairCache_setInternalGhostPairCallback_1"]=asm["_emscripten_bind_btOverlappingPairCache_setInternalGhostPairCallback_1"];var _emscripten_bind_btOverlappingPairCallback___destroy___0=Module["_emscripten_bind_btOverlappingPairCallback___destroy___0"]=asm["_emscripten_bind_btOverlappingPairCallback___destroy___0"];var _emscripten_bind_btPairCachingGhostObject___destroy___0=Module["_emscripten_bind_btPairCachingGhostObject___destroy___0"]=asm["_emscripten_bind_btPairCachingGhostObject___destroy___0"];var _emscripten_bind_btPairCachingGhostObject_activate_0=Module["_emscripten_bind_btPairCachingGhostObject_activate_0"]=asm["_emscripten_bind_btPairCachingGhostObject_activate_0"];var _emscripten_bind_btPairCachingGhostObject_activate_1=Module["_emscripten_bind_btPairCachingGhostObject_activate_1"]=asm["_emscripten_bind_btPairCachingGhostObject_activate_1"];var _emscripten_bind_btPairCachingGhostObject_btPairCachingGhostObject_0=Module["_emscripten_bind_btPairCachingGhostObject_btPairCachingGhostObject_0"]=asm["_emscripten_bind_btPairCachingGhostObject_btPairCachingGhostObject_0"];var _emscripten_bind_btPairCachingGhostObject_forceActivationState_1=Module["_emscripten_bind_btPairCachingGhostObject_forceActivationState_1"]=asm["_emscripten_bind_btPairCachingGhostObject_forceActivationState_1"];var _emscripten_bind_btPairCachingGhostObject_getCollisionFlags_0=Module["_emscripten_bind_btPairCachingGhostObject_getCollisionFlags_0"]=asm["_emscripten_bind_btPairCachingGhostObject_getCollisionFlags_0"];var _emscripten_bind_btPairCachingGhostObject_getCollisionShape_0=Module["_emscripten_bind_btPairCachingGhostObject_getCollisionShape_0"]=asm["_emscripten_bind_btPairCachingGhostObject_getCollisionShape_0"];var _emscripten_bind_btPairCachingGhostObject_getNumOverlappingObjects_0=Module["_emscripten_bind_btPairCachingGhostObject_getNumOverlappingObjects_0"]=asm["_emscripten_bind_btPairCachingGhostObject_getNumOverlappingObjects_0"];var _emscripten_bind_btPairCachingGhostObject_getOverlappingObject_1=Module["_emscripten_bind_btPairCachingGhostObject_getOverlappingObject_1"]=asm["_emscripten_bind_btPairCachingGhostObject_getOverlappingObject_1"];var _emscripten_bind_btPairCachingGhostObject_getUserIndex_0=Module["_emscripten_bind_btPairCachingGhostObject_getUserIndex_0"]=asm["_emscripten_bind_btPairCachingGhostObject_getUserIndex_0"];var _emscripten_bind_btPairCachingGhostObject_getUserPointer_0=Module["_emscripten_bind_btPairCachingGhostObject_getUserPointer_0"]=asm["_emscripten_bind_btPairCachingGhostObject_getUserPointer_0"];var _emscripten_bind_btPairCachingGhostObject_getWorldTransform_0=Module["_emscripten_bind_btPairCachingGhostObject_getWorldTransform_0"]=asm["_emscripten_bind_btPairCachingGhostObject_getWorldTransform_0"];var _emscripten_bind_btPairCachingGhostObject_isActive_0=Module["_emscripten_bind_btPairCachingGhostObject_isActive_0"]=asm["_emscripten_bind_btPairCachingGhostObject_isActive_0"];var _emscripten_bind_btPairCachingGhostObject_isKinematicObject_0=Module["_emscripten_bind_btPairCachingGhostObject_isKinematicObject_0"]=asm["_emscripten_bind_btPairCachingGhostObject_isKinematicObject_0"];var _emscripten_bind_btPairCachingGhostObject_isStaticObject_0=Module["_emscripten_bind_btPairCachingGhostObject_isStaticObject_0"]=asm["_emscripten_bind_btPairCachingGhostObject_isStaticObject_0"];var _emscripten_bind_btPairCachingGhostObject_isStaticOrKinematicObject_0=Module["_emscripten_bind_btPairCachingGhostObject_isStaticOrKinematicObject_0"]=asm["_emscripten_bind_btPairCachingGhostObject_isStaticOrKinematicObject_0"];var _emscripten_bind_btPairCachingGhostObject_setActivationState_1=Module["_emscripten_bind_btPairCachingGhostObject_setActivationState_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setActivationState_1"];var _emscripten_bind_btPairCachingGhostObject_setAnisotropicFriction_2=Module["_emscripten_bind_btPairCachingGhostObject_setAnisotropicFriction_2"]=asm["_emscripten_bind_btPairCachingGhostObject_setAnisotropicFriction_2"];var _emscripten_bind_btPairCachingGhostObject_setCcdMotionThreshold_1=Module["_emscripten_bind_btPairCachingGhostObject_setCcdMotionThreshold_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setCcdMotionThreshold_1"];var _emscripten_bind_btPairCachingGhostObject_setCcdSweptSphereRadius_1=Module["_emscripten_bind_btPairCachingGhostObject_setCcdSweptSphereRadius_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setCcdSweptSphereRadius_1"];var _emscripten_bind_btPairCachingGhostObject_setCollisionFlags_1=Module["_emscripten_bind_btPairCachingGhostObject_setCollisionFlags_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setCollisionFlags_1"];var _emscripten_bind_btPairCachingGhostObject_setCollisionShape_1=Module["_emscripten_bind_btPairCachingGhostObject_setCollisionShape_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setCollisionShape_1"];var _emscripten_bind_btPairCachingGhostObject_setContactProcessingThreshold_1=Module["_emscripten_bind_btPairCachingGhostObject_setContactProcessingThreshold_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setContactProcessingThreshold_1"];var _emscripten_bind_btPairCachingGhostObject_setFriction_1=Module["_emscripten_bind_btPairCachingGhostObject_setFriction_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setFriction_1"];var _emscripten_bind_btPairCachingGhostObject_setRestitution_1=Module["_emscripten_bind_btPairCachingGhostObject_setRestitution_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setRestitution_1"];var _emscripten_bind_btPairCachingGhostObject_setRollingFriction_1=Module["_emscripten_bind_btPairCachingGhostObject_setRollingFriction_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setRollingFriction_1"];var _emscripten_bind_btPairCachingGhostObject_setUserIndex_1=Module["_emscripten_bind_btPairCachingGhostObject_setUserIndex_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setUserIndex_1"];var _emscripten_bind_btPairCachingGhostObject_setUserPointer_1=Module["_emscripten_bind_btPairCachingGhostObject_setUserPointer_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setUserPointer_1"];var _emscripten_bind_btPairCachingGhostObject_setWorldTransform_1=Module["_emscripten_bind_btPairCachingGhostObject_setWorldTransform_1"]=asm["_emscripten_bind_btPairCachingGhostObject_setWorldTransform_1"];var _emscripten_bind_btPersistentManifold___destroy___0=Module["_emscripten_bind_btPersistentManifold___destroy___0"]=asm["_emscripten_bind_btPersistentManifold___destroy___0"];var _emscripten_bind_btPersistentManifold_btPersistentManifold_0=Module["_emscripten_bind_btPersistentManifold_btPersistentManifold_0"]=asm["_emscripten_bind_btPersistentManifold_btPersistentManifold_0"];var _emscripten_bind_btPersistentManifold_getBody0_0=Module["_emscripten_bind_btPersistentManifold_getBody0_0"]=asm["_emscripten_bind_btPersistentManifold_getBody0_0"];var _emscripten_bind_btPersistentManifold_getBody1_0=Module["_emscripten_bind_btPersistentManifold_getBody1_0"]=asm["_emscripten_bind_btPersistentManifold_getBody1_0"];var _emscripten_bind_btPersistentManifold_getContactPoint_1=Module["_emscripten_bind_btPersistentManifold_getContactPoint_1"]=asm["_emscripten_bind_btPersistentManifold_getContactPoint_1"];var _emscripten_bind_btPersistentManifold_getNumContacts_0=Module["_emscripten_bind_btPersistentManifold_getNumContacts_0"]=asm["_emscripten_bind_btPersistentManifold_getNumContacts_0"];var _emscripten_bind_btPoint2PointConstraint___destroy___0=Module["_emscripten_bind_btPoint2PointConstraint___destroy___0"]=asm["_emscripten_bind_btPoint2PointConstraint___destroy___0"];var _emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_2=Module["_emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_2"]=asm["_emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_2"];var _emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_4=Module["_emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_4"]=asm["_emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_4"];var _emscripten_bind_btPoint2PointConstraint_enableFeedback_1=Module["_emscripten_bind_btPoint2PointConstraint_enableFeedback_1"]=asm["_emscripten_bind_btPoint2PointConstraint_enableFeedback_1"];var _emscripten_bind_btPoint2PointConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btPoint2PointConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btPoint2PointConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btPoint2PointConstraint_getParam_2=Module["_emscripten_bind_btPoint2PointConstraint_getParam_2"]=asm["_emscripten_bind_btPoint2PointConstraint_getParam_2"];var _emscripten_bind_btPoint2PointConstraint_getPivotInA_0=Module["_emscripten_bind_btPoint2PointConstraint_getPivotInA_0"]=asm["_emscripten_bind_btPoint2PointConstraint_getPivotInA_0"];var _emscripten_bind_btPoint2PointConstraint_getPivotInB_0=Module["_emscripten_bind_btPoint2PointConstraint_getPivotInB_0"]=asm["_emscripten_bind_btPoint2PointConstraint_getPivotInB_0"];var _emscripten_bind_btPoint2PointConstraint_get_m_setting_0=Module["_emscripten_bind_btPoint2PointConstraint_get_m_setting_0"]=asm["_emscripten_bind_btPoint2PointConstraint_get_m_setting_0"];var _emscripten_bind_btPoint2PointConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btPoint2PointConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btPoint2PointConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btPoint2PointConstraint_setParam_3=Module["_emscripten_bind_btPoint2PointConstraint_setParam_3"]=asm["_emscripten_bind_btPoint2PointConstraint_setParam_3"];var _emscripten_bind_btPoint2PointConstraint_setPivotA_1=Module["_emscripten_bind_btPoint2PointConstraint_setPivotA_1"]=asm["_emscripten_bind_btPoint2PointConstraint_setPivotA_1"];var _emscripten_bind_btPoint2PointConstraint_setPivotB_1=Module["_emscripten_bind_btPoint2PointConstraint_setPivotB_1"]=asm["_emscripten_bind_btPoint2PointConstraint_setPivotB_1"];var _emscripten_bind_btPoint2PointConstraint_set_m_setting_1=Module["_emscripten_bind_btPoint2PointConstraint_set_m_setting_1"]=asm["_emscripten_bind_btPoint2PointConstraint_set_m_setting_1"];var _emscripten_bind_btQuadWord___destroy___0=Module["_emscripten_bind_btQuadWord___destroy___0"]=asm["_emscripten_bind_btQuadWord___destroy___0"];var _emscripten_bind_btQuadWord_setW_1=Module["_emscripten_bind_btQuadWord_setW_1"]=asm["_emscripten_bind_btQuadWord_setW_1"];var _emscripten_bind_btQuadWord_setX_1=Module["_emscripten_bind_btQuadWord_setX_1"]=asm["_emscripten_bind_btQuadWord_setX_1"];var _emscripten_bind_btQuadWord_setY_1=Module["_emscripten_bind_btQuadWord_setY_1"]=asm["_emscripten_bind_btQuadWord_setY_1"];var _emscripten_bind_btQuadWord_setZ_1=Module["_emscripten_bind_btQuadWord_setZ_1"]=asm["_emscripten_bind_btQuadWord_setZ_1"];var _emscripten_bind_btQuadWord_w_0=Module["_emscripten_bind_btQuadWord_w_0"]=asm["_emscripten_bind_btQuadWord_w_0"];var _emscripten_bind_btQuadWord_x_0=Module["_emscripten_bind_btQuadWord_x_0"]=asm["_emscripten_bind_btQuadWord_x_0"];var _emscripten_bind_btQuadWord_y_0=Module["_emscripten_bind_btQuadWord_y_0"]=asm["_emscripten_bind_btQuadWord_y_0"];var _emscripten_bind_btQuadWord_z_0=Module["_emscripten_bind_btQuadWord_z_0"]=asm["_emscripten_bind_btQuadWord_z_0"];var _emscripten_bind_btQuaternion___destroy___0=Module["_emscripten_bind_btQuaternion___destroy___0"]=asm["_emscripten_bind_btQuaternion___destroy___0"];var _emscripten_bind_btQuaternion_angleShortestPath_1=Module["_emscripten_bind_btQuaternion_angleShortestPath_1"]=asm["_emscripten_bind_btQuaternion_angleShortestPath_1"];var _emscripten_bind_btQuaternion_angle_1=Module["_emscripten_bind_btQuaternion_angle_1"]=asm["_emscripten_bind_btQuaternion_angle_1"];var _emscripten_bind_btQuaternion_btQuaternion_4=Module["_emscripten_bind_btQuaternion_btQuaternion_4"]=asm["_emscripten_bind_btQuaternion_btQuaternion_4"];var _emscripten_bind_btQuaternion_dot_1=Module["_emscripten_bind_btQuaternion_dot_1"]=asm["_emscripten_bind_btQuaternion_dot_1"];var _emscripten_bind_btQuaternion_getAngleShortestPath_0=Module["_emscripten_bind_btQuaternion_getAngleShortestPath_0"]=asm["_emscripten_bind_btQuaternion_getAngleShortestPath_0"];var _emscripten_bind_btQuaternion_getAngle_0=Module["_emscripten_bind_btQuaternion_getAngle_0"]=asm["_emscripten_bind_btQuaternion_getAngle_0"];var _emscripten_bind_btQuaternion_getAxis_0=Module["_emscripten_bind_btQuaternion_getAxis_0"]=asm["_emscripten_bind_btQuaternion_getAxis_0"];var _emscripten_bind_btQuaternion_inverse_0=Module["_emscripten_bind_btQuaternion_inverse_0"]=asm["_emscripten_bind_btQuaternion_inverse_0"];var _emscripten_bind_btQuaternion_length2_0=Module["_emscripten_bind_btQuaternion_length2_0"]=asm["_emscripten_bind_btQuaternion_length2_0"];var _emscripten_bind_btQuaternion_length_0=Module["_emscripten_bind_btQuaternion_length_0"]=asm["_emscripten_bind_btQuaternion_length_0"];var _emscripten_bind_btQuaternion_normalize_0=Module["_emscripten_bind_btQuaternion_normalize_0"]=asm["_emscripten_bind_btQuaternion_normalize_0"];var _emscripten_bind_btQuaternion_normalized_0=Module["_emscripten_bind_btQuaternion_normalized_0"]=asm["_emscripten_bind_btQuaternion_normalized_0"];var _emscripten_bind_btQuaternion_op_add_1=Module["_emscripten_bind_btQuaternion_op_add_1"]=asm["_emscripten_bind_btQuaternion_op_add_1"];var _emscripten_bind_btQuaternion_op_div_1=Module["_emscripten_bind_btQuaternion_op_div_1"]=asm["_emscripten_bind_btQuaternion_op_div_1"];var _emscripten_bind_btQuaternion_op_mul_1=Module["_emscripten_bind_btQuaternion_op_mul_1"]=asm["_emscripten_bind_btQuaternion_op_mul_1"];var _emscripten_bind_btQuaternion_op_mulq_1=Module["_emscripten_bind_btQuaternion_op_mulq_1"]=asm["_emscripten_bind_btQuaternion_op_mulq_1"];var _emscripten_bind_btQuaternion_op_sub_1=Module["_emscripten_bind_btQuaternion_op_sub_1"]=asm["_emscripten_bind_btQuaternion_op_sub_1"];var _emscripten_bind_btQuaternion_setEulerZYX_3=Module["_emscripten_bind_btQuaternion_setEulerZYX_3"]=asm["_emscripten_bind_btQuaternion_setEulerZYX_3"];var _emscripten_bind_btQuaternion_setEuler_3=Module["_emscripten_bind_btQuaternion_setEuler_3"]=asm["_emscripten_bind_btQuaternion_setEuler_3"];var _emscripten_bind_btQuaternion_setRotation_2=Module["_emscripten_bind_btQuaternion_setRotation_2"]=asm["_emscripten_bind_btQuaternion_setRotation_2"];var _emscripten_bind_btQuaternion_setValue_4=Module["_emscripten_bind_btQuaternion_setValue_4"]=asm["_emscripten_bind_btQuaternion_setValue_4"];var _emscripten_bind_btQuaternion_setW_1=Module["_emscripten_bind_btQuaternion_setW_1"]=asm["_emscripten_bind_btQuaternion_setW_1"];var _emscripten_bind_btQuaternion_setX_1=Module["_emscripten_bind_btQuaternion_setX_1"]=asm["_emscripten_bind_btQuaternion_setX_1"];var _emscripten_bind_btQuaternion_setY_1=Module["_emscripten_bind_btQuaternion_setY_1"]=asm["_emscripten_bind_btQuaternion_setY_1"];var _emscripten_bind_btQuaternion_setZ_1=Module["_emscripten_bind_btQuaternion_setZ_1"]=asm["_emscripten_bind_btQuaternion_setZ_1"];var _emscripten_bind_btQuaternion_w_0=Module["_emscripten_bind_btQuaternion_w_0"]=asm["_emscripten_bind_btQuaternion_w_0"];var _emscripten_bind_btQuaternion_x_0=Module["_emscripten_bind_btQuaternion_x_0"]=asm["_emscripten_bind_btQuaternion_x_0"];var _emscripten_bind_btQuaternion_y_0=Module["_emscripten_bind_btQuaternion_y_0"]=asm["_emscripten_bind_btQuaternion_y_0"];var _emscripten_bind_btQuaternion_z_0=Module["_emscripten_bind_btQuaternion_z_0"]=asm["_emscripten_bind_btQuaternion_z_0"];var _emscripten_bind_btRaycastVehicle___destroy___0=Module["_emscripten_bind_btRaycastVehicle___destroy___0"]=asm["_emscripten_bind_btRaycastVehicle___destroy___0"];var _emscripten_bind_btRaycastVehicle_addWheel_7=Module["_emscripten_bind_btRaycastVehicle_addWheel_7"]=asm["_emscripten_bind_btRaycastVehicle_addWheel_7"];var _emscripten_bind_btRaycastVehicle_applyEngineForce_2=Module["_emscripten_bind_btRaycastVehicle_applyEngineForce_2"]=asm["_emscripten_bind_btRaycastVehicle_applyEngineForce_2"];var _emscripten_bind_btRaycastVehicle_btRaycastVehicle_3=Module["_emscripten_bind_btRaycastVehicle_btRaycastVehicle_3"]=asm["_emscripten_bind_btRaycastVehicle_btRaycastVehicle_3"];var _emscripten_bind_btRaycastVehicle_getChassisWorldTransform_0=Module["_emscripten_bind_btRaycastVehicle_getChassisWorldTransform_0"]=asm["_emscripten_bind_btRaycastVehicle_getChassisWorldTransform_0"];var _emscripten_bind_btRaycastVehicle_getCurrentSpeedKmHour_0=Module["_emscripten_bind_btRaycastVehicle_getCurrentSpeedKmHour_0"]=asm["_emscripten_bind_btRaycastVehicle_getCurrentSpeedKmHour_0"];var _emscripten_bind_btRaycastVehicle_getForwardAxis_0=Module["_emscripten_bind_btRaycastVehicle_getForwardAxis_0"]=asm["_emscripten_bind_btRaycastVehicle_getForwardAxis_0"];var _emscripten_bind_btRaycastVehicle_getForwardVector_0=Module["_emscripten_bind_btRaycastVehicle_getForwardVector_0"]=asm["_emscripten_bind_btRaycastVehicle_getForwardVector_0"];var _emscripten_bind_btRaycastVehicle_getNumWheels_0=Module["_emscripten_bind_btRaycastVehicle_getNumWheels_0"]=asm["_emscripten_bind_btRaycastVehicle_getNumWheels_0"];var _emscripten_bind_btRaycastVehicle_getRightAxis_0=Module["_emscripten_bind_btRaycastVehicle_getRightAxis_0"]=asm["_emscripten_bind_btRaycastVehicle_getRightAxis_0"];var _emscripten_bind_btRaycastVehicle_getRigidBody_0=Module["_emscripten_bind_btRaycastVehicle_getRigidBody_0"]=asm["_emscripten_bind_btRaycastVehicle_getRigidBody_0"];var _emscripten_bind_btRaycastVehicle_getSteeringValue_1=Module["_emscripten_bind_btRaycastVehicle_getSteeringValue_1"]=asm["_emscripten_bind_btRaycastVehicle_getSteeringValue_1"];var _emscripten_bind_btRaycastVehicle_getUpAxis_0=Module["_emscripten_bind_btRaycastVehicle_getUpAxis_0"]=asm["_emscripten_bind_btRaycastVehicle_getUpAxis_0"];var _emscripten_bind_btRaycastVehicle_getUserConstraintId_0=Module["_emscripten_bind_btRaycastVehicle_getUserConstraintId_0"]=asm["_emscripten_bind_btRaycastVehicle_getUserConstraintId_0"];var _emscripten_bind_btRaycastVehicle_getUserConstraintType_0=Module["_emscripten_bind_btRaycastVehicle_getUserConstraintType_0"]=asm["_emscripten_bind_btRaycastVehicle_getUserConstraintType_0"];var _emscripten_bind_btRaycastVehicle_getWheelInfo_1=Module["_emscripten_bind_btRaycastVehicle_getWheelInfo_1"]=asm["_emscripten_bind_btRaycastVehicle_getWheelInfo_1"];var _emscripten_bind_btRaycastVehicle_getWheelTransformWS_1=Module["_emscripten_bind_btRaycastVehicle_getWheelTransformWS_1"]=asm["_emscripten_bind_btRaycastVehicle_getWheelTransformWS_1"];var _emscripten_bind_btRaycastVehicle_rayCast_1=Module["_emscripten_bind_btRaycastVehicle_rayCast_1"]=asm["_emscripten_bind_btRaycastVehicle_rayCast_1"];var _emscripten_bind_btRaycastVehicle_resetSuspension_0=Module["_emscripten_bind_btRaycastVehicle_resetSuspension_0"]=asm["_emscripten_bind_btRaycastVehicle_resetSuspension_0"];var _emscripten_bind_btRaycastVehicle_setBrake_2=Module["_emscripten_bind_btRaycastVehicle_setBrake_2"]=asm["_emscripten_bind_btRaycastVehicle_setBrake_2"];var _emscripten_bind_btRaycastVehicle_setCoordinateSystem_3=Module["_emscripten_bind_btRaycastVehicle_setCoordinateSystem_3"]=asm["_emscripten_bind_btRaycastVehicle_setCoordinateSystem_3"];var _emscripten_bind_btRaycastVehicle_setPitchControl_1=Module["_emscripten_bind_btRaycastVehicle_setPitchControl_1"]=asm["_emscripten_bind_btRaycastVehicle_setPitchControl_1"];var _emscripten_bind_btRaycastVehicle_setSteeringValue_2=Module["_emscripten_bind_btRaycastVehicle_setSteeringValue_2"]=asm["_emscripten_bind_btRaycastVehicle_setSteeringValue_2"];var _emscripten_bind_btRaycastVehicle_setUserConstraintId_1=Module["_emscripten_bind_btRaycastVehicle_setUserConstraintId_1"]=asm["_emscripten_bind_btRaycastVehicle_setUserConstraintId_1"];var _emscripten_bind_btRaycastVehicle_setUserConstraintType_1=Module["_emscripten_bind_btRaycastVehicle_setUserConstraintType_1"]=asm["_emscripten_bind_btRaycastVehicle_setUserConstraintType_1"];var _emscripten_bind_btRaycastVehicle_updateAction_2=Module["_emscripten_bind_btRaycastVehicle_updateAction_2"]=asm["_emscripten_bind_btRaycastVehicle_updateAction_2"];var _emscripten_bind_btRaycastVehicle_updateFriction_1=Module["_emscripten_bind_btRaycastVehicle_updateFriction_1"]=asm["_emscripten_bind_btRaycastVehicle_updateFriction_1"];var _emscripten_bind_btRaycastVehicle_updateSuspension_1=Module["_emscripten_bind_btRaycastVehicle_updateSuspension_1"]=asm["_emscripten_bind_btRaycastVehicle_updateSuspension_1"];var _emscripten_bind_btRaycastVehicle_updateVehicle_1=Module["_emscripten_bind_btRaycastVehicle_updateVehicle_1"]=asm["_emscripten_bind_btRaycastVehicle_updateVehicle_1"];var _emscripten_bind_btRaycastVehicle_updateWheelTransform_2=Module["_emscripten_bind_btRaycastVehicle_updateWheelTransform_2"]=asm["_emscripten_bind_btRaycastVehicle_updateWheelTransform_2"];var _emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_1=Module["_emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_1"]=asm["_emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_1"];var _emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_2=Module["_emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_2"]=asm["_emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_2"];var _emscripten_bind_btRigidBodyConstructionInfo___destroy___0=Module["_emscripten_bind_btRigidBodyConstructionInfo___destroy___0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo___destroy___0"];var _emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_3=Module["_emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_3"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_3"];var _emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_4=Module["_emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_4"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_4"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingFactor_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingFactor_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingFactor_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingThresholdSqr_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingThresholdSqr_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingThresholdSqr_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDampingFactor_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDampingFactor_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDampingFactor_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDamping_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDamping_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDamping_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalLinearDampingThresholdSqr_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalLinearDampingThresholdSqr_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalLinearDampingThresholdSqr_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_angularDamping_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_angularDamping_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_angularDamping_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_angularSleepingThreshold_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_angularSleepingThreshold_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_angularSleepingThreshold_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_friction_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_friction_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_friction_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_linearDamping_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_linearDamping_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_linearDamping_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_linearSleepingThreshold_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_linearSleepingThreshold_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_linearSleepingThreshold_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_restitution_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_restitution_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_restitution_0"];var _emscripten_bind_btRigidBodyConstructionInfo_get_m_rollingFriction_0=Module["_emscripten_bind_btRigidBodyConstructionInfo_get_m_rollingFriction_0"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_get_m_rollingFriction_0"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingFactor_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingFactor_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingFactor_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingThresholdSqr_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingThresholdSqr_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingThresholdSqr_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDampingFactor_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDampingFactor_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDampingFactor_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDamping_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDamping_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDamping_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalLinearDampingThresholdSqr_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalLinearDampingThresholdSqr_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalLinearDampingThresholdSqr_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_angularDamping_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_angularDamping_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_angularDamping_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_angularSleepingThreshold_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_angularSleepingThreshold_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_angularSleepingThreshold_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_friction_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_friction_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_friction_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_linearDamping_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_linearDamping_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_linearDamping_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_linearSleepingThreshold_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_linearSleepingThreshold_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_linearSleepingThreshold_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_restitution_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_restitution_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_restitution_1"];var _emscripten_bind_btRigidBodyConstructionInfo_set_m_rollingFriction_1=Module["_emscripten_bind_btRigidBodyConstructionInfo_set_m_rollingFriction_1"]=asm["_emscripten_bind_btRigidBodyConstructionInfo_set_m_rollingFriction_1"];var _emscripten_bind_btRigidBody___destroy___0=Module["_emscripten_bind_btRigidBody___destroy___0"]=asm["_emscripten_bind_btRigidBody___destroy___0"];var _emscripten_bind_btRigidBody_activate_0=Module["_emscripten_bind_btRigidBody_activate_0"]=asm["_emscripten_bind_btRigidBody_activate_0"];var _emscripten_bind_btRigidBody_activate_1=Module["_emscripten_bind_btRigidBody_activate_1"]=asm["_emscripten_bind_btRigidBody_activate_1"];var _emscripten_bind_btRigidBody_applyCentralForce_1=Module["_emscripten_bind_btRigidBody_applyCentralForce_1"]=asm["_emscripten_bind_btRigidBody_applyCentralForce_1"];var _emscripten_bind_btRigidBody_applyCentralImpulse_1=Module["_emscripten_bind_btRigidBody_applyCentralImpulse_1"]=asm["_emscripten_bind_btRigidBody_applyCentralImpulse_1"];var _emscripten_bind_btRigidBody_applyForce_2=Module["_emscripten_bind_btRigidBody_applyForce_2"]=asm["_emscripten_bind_btRigidBody_applyForce_2"];var _emscripten_bind_btRigidBody_applyGravity_0=Module["_emscripten_bind_btRigidBody_applyGravity_0"]=asm["_emscripten_bind_btRigidBody_applyGravity_0"];var _emscripten_bind_btRigidBody_applyImpulse_2=Module["_emscripten_bind_btRigidBody_applyImpulse_2"]=asm["_emscripten_bind_btRigidBody_applyImpulse_2"];var _emscripten_bind_btRigidBody_applyTorqueImpulse_1=Module["_emscripten_bind_btRigidBody_applyTorqueImpulse_1"]=asm["_emscripten_bind_btRigidBody_applyTorqueImpulse_1"];var _emscripten_bind_btRigidBody_applyTorque_1=Module["_emscripten_bind_btRigidBody_applyTorque_1"]=asm["_emscripten_bind_btRigidBody_applyTorque_1"];var _emscripten_bind_btRigidBody_btRigidBody_1=Module["_emscripten_bind_btRigidBody_btRigidBody_1"]=asm["_emscripten_bind_btRigidBody_btRigidBody_1"];var _emscripten_bind_btRigidBody_forceActivationState_1=Module["_emscripten_bind_btRigidBody_forceActivationState_1"]=asm["_emscripten_bind_btRigidBody_forceActivationState_1"];var _emscripten_bind_btRigidBody_getAabb_2=Module["_emscripten_bind_btRigidBody_getAabb_2"]=asm["_emscripten_bind_btRigidBody_getAabb_2"];var _emscripten_bind_btRigidBody_getAngularVelocity_0=Module["_emscripten_bind_btRigidBody_getAngularVelocity_0"]=asm["_emscripten_bind_btRigidBody_getAngularVelocity_0"];var _emscripten_bind_btRigidBody_getCenterOfMassTransform_0=Module["_emscripten_bind_btRigidBody_getCenterOfMassTransform_0"]=asm["_emscripten_bind_btRigidBody_getCenterOfMassTransform_0"];var _emscripten_bind_btRigidBody_getCollisionFlags_0=Module["_emscripten_bind_btRigidBody_getCollisionFlags_0"]=asm["_emscripten_bind_btRigidBody_getCollisionFlags_0"];var _emscripten_bind_btRigidBody_getCollisionShape_0=Module["_emscripten_bind_btRigidBody_getCollisionShape_0"]=asm["_emscripten_bind_btRigidBody_getCollisionShape_0"];var _emscripten_bind_btRigidBody_getGravity_0=Module["_emscripten_bind_btRigidBody_getGravity_0"]=asm["_emscripten_bind_btRigidBody_getGravity_0"];var _emscripten_bind_btRigidBody_getLinearVelocity_0=Module["_emscripten_bind_btRigidBody_getLinearVelocity_0"]=asm["_emscripten_bind_btRigidBody_getLinearVelocity_0"];var _emscripten_bind_btRigidBody_getMotionState_0=Module["_emscripten_bind_btRigidBody_getMotionState_0"]=asm["_emscripten_bind_btRigidBody_getMotionState_0"];var _emscripten_bind_btRigidBody_getUserIndex_0=Module["_emscripten_bind_btRigidBody_getUserIndex_0"]=asm["_emscripten_bind_btRigidBody_getUserIndex_0"];var _emscripten_bind_btRigidBody_getUserPointer_0=Module["_emscripten_bind_btRigidBody_getUserPointer_0"]=asm["_emscripten_bind_btRigidBody_getUserPointer_0"];var _emscripten_bind_btRigidBody_getWorldTransform_0=Module["_emscripten_bind_btRigidBody_getWorldTransform_0"]=asm["_emscripten_bind_btRigidBody_getWorldTransform_0"];var _emscripten_bind_btRigidBody_isActive_0=Module["_emscripten_bind_btRigidBody_isActive_0"]=asm["_emscripten_bind_btRigidBody_isActive_0"];var _emscripten_bind_btRigidBody_isKinematicObject_0=Module["_emscripten_bind_btRigidBody_isKinematicObject_0"]=asm["_emscripten_bind_btRigidBody_isKinematicObject_0"];var _emscripten_bind_btRigidBody_isStaticObject_0=Module["_emscripten_bind_btRigidBody_isStaticObject_0"]=asm["_emscripten_bind_btRigidBody_isStaticObject_0"];var _emscripten_bind_btRigidBody_isStaticOrKinematicObject_0=Module["_emscripten_bind_btRigidBody_isStaticOrKinematicObject_0"]=asm["_emscripten_bind_btRigidBody_isStaticOrKinematicObject_0"];var _emscripten_bind_btRigidBody_setActivationState_1=Module["_emscripten_bind_btRigidBody_setActivationState_1"]=asm["_emscripten_bind_btRigidBody_setActivationState_1"];var _emscripten_bind_btRigidBody_setAngularFactor_1=Module["_emscripten_bind_btRigidBody_setAngularFactor_1"]=asm["_emscripten_bind_btRigidBody_setAngularFactor_1"];var _emscripten_bind_btRigidBody_setAngularVelocity_1=Module["_emscripten_bind_btRigidBody_setAngularVelocity_1"]=asm["_emscripten_bind_btRigidBody_setAngularVelocity_1"];var _emscripten_bind_btRigidBody_setAnisotropicFriction_2=Module["_emscripten_bind_btRigidBody_setAnisotropicFriction_2"]=asm["_emscripten_bind_btRigidBody_setAnisotropicFriction_2"];var _emscripten_bind_btRigidBody_setCcdMotionThreshold_1=Module["_emscripten_bind_btRigidBody_setCcdMotionThreshold_1"]=asm["_emscripten_bind_btRigidBody_setCcdMotionThreshold_1"];var _emscripten_bind_btRigidBody_setCcdSweptSphereRadius_1=Module["_emscripten_bind_btRigidBody_setCcdSweptSphereRadius_1"]=asm["_emscripten_bind_btRigidBody_setCcdSweptSphereRadius_1"];var _emscripten_bind_btRigidBody_setCenterOfMassTransform_1=Module["_emscripten_bind_btRigidBody_setCenterOfMassTransform_1"]=asm["_emscripten_bind_btRigidBody_setCenterOfMassTransform_1"];var _emscripten_bind_btRigidBody_setCollisionFlags_1=Module["_emscripten_bind_btRigidBody_setCollisionFlags_1"]=asm["_emscripten_bind_btRigidBody_setCollisionFlags_1"];var _emscripten_bind_btRigidBody_setCollisionShape_1=Module["_emscripten_bind_btRigidBody_setCollisionShape_1"]=asm["_emscripten_bind_btRigidBody_setCollisionShape_1"];var _emscripten_bind_btRigidBody_setContactProcessingThreshold_1=Module["_emscripten_bind_btRigidBody_setContactProcessingThreshold_1"]=asm["_emscripten_bind_btRigidBody_setContactProcessingThreshold_1"];var _emscripten_bind_btRigidBody_setDamping_2=Module["_emscripten_bind_btRigidBody_setDamping_2"]=asm["_emscripten_bind_btRigidBody_setDamping_2"];var _emscripten_bind_btRigidBody_setFriction_1=Module["_emscripten_bind_btRigidBody_setFriction_1"]=asm["_emscripten_bind_btRigidBody_setFriction_1"];var _emscripten_bind_btRigidBody_setGravity_1=Module["_emscripten_bind_btRigidBody_setGravity_1"]=asm["_emscripten_bind_btRigidBody_setGravity_1"];var _emscripten_bind_btRigidBody_setLinearFactor_1=Module["_emscripten_bind_btRigidBody_setLinearFactor_1"]=asm["_emscripten_bind_btRigidBody_setLinearFactor_1"];var _emscripten_bind_btRigidBody_setLinearVelocity_1=Module["_emscripten_bind_btRigidBody_setLinearVelocity_1"]=asm["_emscripten_bind_btRigidBody_setLinearVelocity_1"];var _emscripten_bind_btRigidBody_setMassProps_2=Module["_emscripten_bind_btRigidBody_setMassProps_2"]=asm["_emscripten_bind_btRigidBody_setMassProps_2"];var _emscripten_bind_btRigidBody_setMotionState_1=Module["_emscripten_bind_btRigidBody_setMotionState_1"]=asm["_emscripten_bind_btRigidBody_setMotionState_1"];var _emscripten_bind_btRigidBody_setRestitution_1=Module["_emscripten_bind_btRigidBody_setRestitution_1"]=asm["_emscripten_bind_btRigidBody_setRestitution_1"];var _emscripten_bind_btRigidBody_setRollingFriction_1=Module["_emscripten_bind_btRigidBody_setRollingFriction_1"]=asm["_emscripten_bind_btRigidBody_setRollingFriction_1"];var _emscripten_bind_btRigidBody_setSleepingThresholds_2=Module["_emscripten_bind_btRigidBody_setSleepingThresholds_2"]=asm["_emscripten_bind_btRigidBody_setSleepingThresholds_2"];var _emscripten_bind_btRigidBody_setUserIndex_1=Module["_emscripten_bind_btRigidBody_setUserIndex_1"]=asm["_emscripten_bind_btRigidBody_setUserIndex_1"];var _emscripten_bind_btRigidBody_setUserPointer_1=Module["_emscripten_bind_btRigidBody_setUserPointer_1"]=asm["_emscripten_bind_btRigidBody_setUserPointer_1"];var _emscripten_bind_btRigidBody_setWorldTransform_1=Module["_emscripten_bind_btRigidBody_setWorldTransform_1"]=asm["_emscripten_bind_btRigidBody_setWorldTransform_1"];var _emscripten_bind_btRigidBody_upcast_1=Module["_emscripten_bind_btRigidBody_upcast_1"]=asm["_emscripten_bind_btRigidBody_upcast_1"];var _emscripten_bind_btRigidBody_updateInertiaTensor_0=Module["_emscripten_bind_btRigidBody_updateInertiaTensor_0"]=asm["_emscripten_bind_btRigidBody_updateInertiaTensor_0"];var _emscripten_bind_btRotationalLimitMotor___destroy___0=Module["_emscripten_bind_btRotationalLimitMotor___destroy___0"]=asm["_emscripten_bind_btRotationalLimitMotor___destroy___0"];var _emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_0=Module["_emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_0"]=asm["_emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_0"];var _emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_1=Module["_emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_1"]=asm["_emscripten_bind_btRotationalLimitMotor_btRotationalLimitMotor_1"];var _emscripten_bind_btRotationalLimitMotor_get_m_enableMotor_0=Module["_emscripten_bind_btRotationalLimitMotor_get_m_enableMotor_0"]=asm["_emscripten_bind_btRotationalLimitMotor_get_m_enableMotor_0"];var _emscripten_bind_btRotationalLimitMotor_get_m_hiLimit_0=Module["_emscripten_bind_btRotationalLimitMotor_get_m_hiLimit_0"]=asm["_emscripten_bind_btRotationalLimitMotor_get_m_hiLimit_0"];var _emscripten_bind_btRotationalLimitMotor_get_m_loLimit_0=Module["_emscripten_bind_btRotationalLimitMotor_get_m_loLimit_0"]=asm["_emscripten_bind_btRotationalLimitMotor_get_m_loLimit_0"];var _emscripten_bind_btRotationalLimitMotor_get_m_maxMotorForce_0=Module["_emscripten_bind_btRotationalLimitMotor_get_m_maxMotorForce_0"]=asm["_emscripten_bind_btRotationalLimitMotor_get_m_maxMotorForce_0"];var _emscripten_bind_btRotationalLimitMotor_get_m_targetVelocity_0=Module["_emscripten_bind_btRotationalLimitMotor_get_m_targetVelocity_0"]=asm["_emscripten_bind_btRotationalLimitMotor_get_m_targetVelocity_0"];var _emscripten_bind_btRotationalLimitMotor_isLimited_0=Module["_emscripten_bind_btRotationalLimitMotor_isLimited_0"]=asm["_emscripten_bind_btRotationalLimitMotor_isLimited_0"];var _emscripten_bind_btRotationalLimitMotor_needApplyTorques_0=Module["_emscripten_bind_btRotationalLimitMotor_needApplyTorques_0"]=asm["_emscripten_bind_btRotationalLimitMotor_needApplyTorques_0"];var _emscripten_bind_btRotationalLimitMotor_set_m_enableMotor_1=Module["_emscripten_bind_btRotationalLimitMotor_set_m_enableMotor_1"]=asm["_emscripten_bind_btRotationalLimitMotor_set_m_enableMotor_1"];var _emscripten_bind_btRotationalLimitMotor_set_m_hiLimit_1=Module["_emscripten_bind_btRotationalLimitMotor_set_m_hiLimit_1"]=asm["_emscripten_bind_btRotationalLimitMotor_set_m_hiLimit_1"];var _emscripten_bind_btRotationalLimitMotor_set_m_loLimit_1=Module["_emscripten_bind_btRotationalLimitMotor_set_m_loLimit_1"]=asm["_emscripten_bind_btRotationalLimitMotor_set_m_loLimit_1"];var _emscripten_bind_btRotationalLimitMotor_set_m_maxMotorForce_1=Module["_emscripten_bind_btRotationalLimitMotor_set_m_maxMotorForce_1"]=asm["_emscripten_bind_btRotationalLimitMotor_set_m_maxMotorForce_1"];var _emscripten_bind_btRotationalLimitMotor_set_m_targetVelocity_1=Module["_emscripten_bind_btRotationalLimitMotor_set_m_targetVelocity_1"]=asm["_emscripten_bind_btRotationalLimitMotor_set_m_targetVelocity_1"];var _emscripten_bind_btSequentialImpulseConstraintSolver___destroy___0=Module["_emscripten_bind_btSequentialImpulseConstraintSolver___destroy___0"]=asm["_emscripten_bind_btSequentialImpulseConstraintSolver___destroy___0"];var _emscripten_bind_btSequentialImpulseConstraintSolver_btSequentialImpulseConstraintSolver_0=Module["_emscripten_bind_btSequentialImpulseConstraintSolver_btSequentialImpulseConstraintSolver_0"]=asm["_emscripten_bind_btSequentialImpulseConstraintSolver_btSequentialImpulseConstraintSolver_0"];var _emscripten_bind_btSliderConstraint___destroy___0=Module["_emscripten_bind_btSliderConstraint___destroy___0"]=asm["_emscripten_bind_btSliderConstraint___destroy___0"];var _emscripten_bind_btSliderConstraint_btSliderConstraint_3=Module["_emscripten_bind_btSliderConstraint_btSliderConstraint_3"]=asm["_emscripten_bind_btSliderConstraint_btSliderConstraint_3"];var _emscripten_bind_btSliderConstraint_btSliderConstraint_5=Module["_emscripten_bind_btSliderConstraint_btSliderConstraint_5"]=asm["_emscripten_bind_btSliderConstraint_btSliderConstraint_5"];var _emscripten_bind_btSliderConstraint_enableFeedback_1=Module["_emscripten_bind_btSliderConstraint_enableFeedback_1"]=asm["_emscripten_bind_btSliderConstraint_enableFeedback_1"];var _emscripten_bind_btSliderConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btSliderConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btSliderConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btSliderConstraint_getParam_2=Module["_emscripten_bind_btSliderConstraint_getParam_2"]=asm["_emscripten_bind_btSliderConstraint_getParam_2"];var _emscripten_bind_btSliderConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btSliderConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btSliderConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btSliderConstraint_setLowerAngLimit_1=Module["_emscripten_bind_btSliderConstraint_setLowerAngLimit_1"]=asm["_emscripten_bind_btSliderConstraint_setLowerAngLimit_1"];var _emscripten_bind_btSliderConstraint_setLowerLinLimit_1=Module["_emscripten_bind_btSliderConstraint_setLowerLinLimit_1"]=asm["_emscripten_bind_btSliderConstraint_setLowerLinLimit_1"];var _emscripten_bind_btSliderConstraint_setParam_3=Module["_emscripten_bind_btSliderConstraint_setParam_3"]=asm["_emscripten_bind_btSliderConstraint_setParam_3"];var _emscripten_bind_btSliderConstraint_setUpperAngLimit_1=Module["_emscripten_bind_btSliderConstraint_setUpperAngLimit_1"]=asm["_emscripten_bind_btSliderConstraint_setUpperAngLimit_1"];var _emscripten_bind_btSliderConstraint_setUpperLinLimit_1=Module["_emscripten_bind_btSliderConstraint_setUpperLinLimit_1"]=asm["_emscripten_bind_btSliderConstraint_setUpperLinLimit_1"];var _emscripten_bind_btSoftBodyArray___destroy___0=Module["_emscripten_bind_btSoftBodyArray___destroy___0"]=asm["_emscripten_bind_btSoftBodyArray___destroy___0"];var _emscripten_bind_btSoftBodyArray_at_1=Module["_emscripten_bind_btSoftBodyArray_at_1"]=asm["_emscripten_bind_btSoftBodyArray_at_1"];var _emscripten_bind_btSoftBodyArray_size_0=Module["_emscripten_bind_btSoftBodyArray_size_0"]=asm["_emscripten_bind_btSoftBodyArray_size_0"];var _emscripten_bind_btSoftBodyHelpers_CreateEllipsoid_4=Module["_emscripten_bind_btSoftBodyHelpers_CreateEllipsoid_4"]=asm["_emscripten_bind_btSoftBodyHelpers_CreateEllipsoid_4"];var _emscripten_bind_btSoftBodyHelpers_CreateFromConvexHull_4=Module["_emscripten_bind_btSoftBodyHelpers_CreateFromConvexHull_4"]=asm["_emscripten_bind_btSoftBodyHelpers_CreateFromConvexHull_4"];var _emscripten_bind_btSoftBodyHelpers_CreateFromTriMesh_5=Module["_emscripten_bind_btSoftBodyHelpers_CreateFromTriMesh_5"]=asm["_emscripten_bind_btSoftBodyHelpers_CreateFromTriMesh_5"];var _emscripten_bind_btSoftBodyHelpers_CreatePatchUV_10=Module["_emscripten_bind_btSoftBodyHelpers_CreatePatchUV_10"]=asm["_emscripten_bind_btSoftBodyHelpers_CreatePatchUV_10"];var _emscripten_bind_btSoftBodyHelpers_CreatePatch_9=Module["_emscripten_bind_btSoftBodyHelpers_CreatePatch_9"]=asm["_emscripten_bind_btSoftBodyHelpers_CreatePatch_9"];var _emscripten_bind_btSoftBodyHelpers_CreateRope_5=Module["_emscripten_bind_btSoftBodyHelpers_CreateRope_5"]=asm["_emscripten_bind_btSoftBodyHelpers_CreateRope_5"];var _emscripten_bind_btSoftBodyHelpers___destroy___0=Module["_emscripten_bind_btSoftBodyHelpers___destroy___0"]=asm["_emscripten_bind_btSoftBodyHelpers___destroy___0"];var _emscripten_bind_btSoftBodyHelpers_btSoftBodyHelpers_0=Module["_emscripten_bind_btSoftBodyHelpers_btSoftBodyHelpers_0"]=asm["_emscripten_bind_btSoftBodyHelpers_btSoftBodyHelpers_0"];var _emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration___destroy___0=Module["_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration___destroy___0"]=asm["_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration___destroy___0"];var _emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_0=Module["_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_0"]=asm["_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_0"];var _emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_1=Module["_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_1"]=asm["_emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_1"];var _emscripten_bind_btSoftBodySolver___destroy___0=Module["_emscripten_bind_btSoftBodySolver___destroy___0"]=asm["_emscripten_bind_btSoftBodySolver___destroy___0"];var _emscripten_bind_btSoftBodyWorldInfo___destroy___0=Module["_emscripten_bind_btSoftBodyWorldInfo___destroy___0"]=asm["_emscripten_bind_btSoftBodyWorldInfo___destroy___0"];var _emscripten_bind_btSoftBodyWorldInfo_btSoftBodyWorldInfo_0=Module["_emscripten_bind_btSoftBodyWorldInfo_btSoftBodyWorldInfo_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_btSoftBodyWorldInfo_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_air_density_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_air_density_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_air_density_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_m_broadphase_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_m_broadphase_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_m_broadphase_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_m_dispatcher_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_m_dispatcher_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_m_dispatcher_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_m_gravity_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_m_gravity_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_m_gravity_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_m_maxDisplacement_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_m_maxDisplacement_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_m_maxDisplacement_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_water_density_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_water_density_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_water_density_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_water_normal_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_water_normal_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_water_normal_0"];var _emscripten_bind_btSoftBodyWorldInfo_get_water_offset_0=Module["_emscripten_bind_btSoftBodyWorldInfo_get_water_offset_0"]=asm["_emscripten_bind_btSoftBodyWorldInfo_get_water_offset_0"];var _emscripten_bind_btSoftBodyWorldInfo_set_air_density_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_air_density_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_air_density_1"];var _emscripten_bind_btSoftBodyWorldInfo_set_m_broadphase_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_m_broadphase_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_m_broadphase_1"];var _emscripten_bind_btSoftBodyWorldInfo_set_m_dispatcher_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_m_dispatcher_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_m_dispatcher_1"];var _emscripten_bind_btSoftBodyWorldInfo_set_m_gravity_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_m_gravity_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_m_gravity_1"];var _emscripten_bind_btSoftBodyWorldInfo_set_m_maxDisplacement_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_m_maxDisplacement_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_m_maxDisplacement_1"];var _emscripten_bind_btSoftBodyWorldInfo_set_water_density_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_water_density_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_water_density_1"];var _emscripten_bind_btSoftBodyWorldInfo_set_water_normal_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_water_normal_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_water_normal_1"];var _emscripten_bind_btSoftBodyWorldInfo_set_water_offset_1=Module["_emscripten_bind_btSoftBodyWorldInfo_set_water_offset_1"]=asm["_emscripten_bind_btSoftBodyWorldInfo_set_water_offset_1"];var _emscripten_bind_btSoftBody___destroy___0=Module["_emscripten_bind_btSoftBody___destroy___0"]=asm["_emscripten_bind_btSoftBody___destroy___0"];var _emscripten_bind_btSoftBody_activate_0=Module["_emscripten_bind_btSoftBody_activate_0"]=asm["_emscripten_bind_btSoftBody_activate_0"];var _emscripten_bind_btSoftBody_activate_1=Module["_emscripten_bind_btSoftBody_activate_1"]=asm["_emscripten_bind_btSoftBody_activate_1"];var _emscripten_bind_btSoftBody_appendAnchor_4=Module["_emscripten_bind_btSoftBody_appendAnchor_4"]=asm["_emscripten_bind_btSoftBody_appendAnchor_4"];var _emscripten_bind_btSoftBody_appendFace_4=Module["_emscripten_bind_btSoftBody_appendFace_4"]=asm["_emscripten_bind_btSoftBody_appendFace_4"];var _emscripten_bind_btSoftBody_appendLinearJoint_2=Module["_emscripten_bind_btSoftBody_appendLinearJoint_2"]=asm["_emscripten_bind_btSoftBody_appendLinearJoint_2"];var _emscripten_bind_btSoftBody_appendLink_4=Module["_emscripten_bind_btSoftBody_appendLink_4"]=asm["_emscripten_bind_btSoftBody_appendLink_4"];var _emscripten_bind_btSoftBody_appendMaterial_0=Module["_emscripten_bind_btSoftBody_appendMaterial_0"]=asm["_emscripten_bind_btSoftBody_appendMaterial_0"];var _emscripten_bind_btSoftBody_appendNode_2=Module["_emscripten_bind_btSoftBody_appendNode_2"]=asm["_emscripten_bind_btSoftBody_appendNode_2"];var _emscripten_bind_btSoftBody_appendTetra_5=Module["_emscripten_bind_btSoftBody_appendTetra_5"]=asm["_emscripten_bind_btSoftBody_appendTetra_5"];var _emscripten_bind_btSoftBody_btSoftBody_4=Module["_emscripten_bind_btSoftBody_btSoftBody_4"]=asm["_emscripten_bind_btSoftBody_btSoftBody_4"];var _emscripten_bind_btSoftBody_checkFace_3=Module["_emscripten_bind_btSoftBody_checkFace_3"]=asm["_emscripten_bind_btSoftBody_checkFace_3"];var _emscripten_bind_btSoftBody_checkLink_2=Module["_emscripten_bind_btSoftBody_checkLink_2"]=asm["_emscripten_bind_btSoftBody_checkLink_2"];var _emscripten_bind_btSoftBody_forceActivationState_1=Module["_emscripten_bind_btSoftBody_forceActivationState_1"]=asm["_emscripten_bind_btSoftBody_forceActivationState_1"];var _emscripten_bind_btSoftBody_generateBendingConstraints_2=Module["_emscripten_bind_btSoftBody_generateBendingConstraints_2"]=asm["_emscripten_bind_btSoftBody_generateBendingConstraints_2"];var _emscripten_bind_btSoftBody_generateClusters_1=Module["_emscripten_bind_btSoftBody_generateClusters_1"]=asm["_emscripten_bind_btSoftBody_generateClusters_1"];var _emscripten_bind_btSoftBody_generateClusters_2=Module["_emscripten_bind_btSoftBody_generateClusters_2"]=asm["_emscripten_bind_btSoftBody_generateClusters_2"];var _emscripten_bind_btSoftBody_getCollisionFlags_0=Module["_emscripten_bind_btSoftBody_getCollisionFlags_0"]=asm["_emscripten_bind_btSoftBody_getCollisionFlags_0"];var _emscripten_bind_btSoftBody_getCollisionShape_0=Module["_emscripten_bind_btSoftBody_getCollisionShape_0"]=asm["_emscripten_bind_btSoftBody_getCollisionShape_0"];var _emscripten_bind_btSoftBody_getTotalMass_0=Module["_emscripten_bind_btSoftBody_getTotalMass_0"]=asm["_emscripten_bind_btSoftBody_getTotalMass_0"];var _emscripten_bind_btSoftBody_getUserIndex_0=Module["_emscripten_bind_btSoftBody_getUserIndex_0"]=asm["_emscripten_bind_btSoftBody_getUserIndex_0"];var _emscripten_bind_btSoftBody_getUserPointer_0=Module["_emscripten_bind_btSoftBody_getUserPointer_0"]=asm["_emscripten_bind_btSoftBody_getUserPointer_0"];var _emscripten_bind_btSoftBody_getWorldTransform_0=Module["_emscripten_bind_btSoftBody_getWorldTransform_0"]=asm["_emscripten_bind_btSoftBody_getWorldTransform_0"];var _emscripten_bind_btSoftBody_get_m_anchors_0=Module["_emscripten_bind_btSoftBody_get_m_anchors_0"]=asm["_emscripten_bind_btSoftBody_get_m_anchors_0"];var _emscripten_bind_btSoftBody_get_m_cfg_0=Module["_emscripten_bind_btSoftBody_get_m_cfg_0"]=asm["_emscripten_bind_btSoftBody_get_m_cfg_0"];var _emscripten_bind_btSoftBody_get_m_faces_0=Module["_emscripten_bind_btSoftBody_get_m_faces_0"]=asm["_emscripten_bind_btSoftBody_get_m_faces_0"];var _emscripten_bind_btSoftBody_get_m_links_0=Module["_emscripten_bind_btSoftBody_get_m_links_0"]=asm["_emscripten_bind_btSoftBody_get_m_links_0"];var _emscripten_bind_btSoftBody_get_m_materials_0=Module["_emscripten_bind_btSoftBody_get_m_materials_0"]=asm["_emscripten_bind_btSoftBody_get_m_materials_0"];var _emscripten_bind_btSoftBody_get_m_nodes_0=Module["_emscripten_bind_btSoftBody_get_m_nodes_0"]=asm["_emscripten_bind_btSoftBody_get_m_nodes_0"];var _emscripten_bind_btSoftBody_isActive_0=Module["_emscripten_bind_btSoftBody_isActive_0"]=asm["_emscripten_bind_btSoftBody_isActive_0"];var _emscripten_bind_btSoftBody_isKinematicObject_0=Module["_emscripten_bind_btSoftBody_isKinematicObject_0"]=asm["_emscripten_bind_btSoftBody_isKinematicObject_0"];var _emscripten_bind_btSoftBody_isStaticObject_0=Module["_emscripten_bind_btSoftBody_isStaticObject_0"]=asm["_emscripten_bind_btSoftBody_isStaticObject_0"];var _emscripten_bind_btSoftBody_isStaticOrKinematicObject_0=Module["_emscripten_bind_btSoftBody_isStaticOrKinematicObject_0"]=asm["_emscripten_bind_btSoftBody_isStaticOrKinematicObject_0"];var _emscripten_bind_btSoftBody_rotate_1=Module["_emscripten_bind_btSoftBody_rotate_1"]=asm["_emscripten_bind_btSoftBody_rotate_1"];var _emscripten_bind_btSoftBody_scale_1=Module["_emscripten_bind_btSoftBody_scale_1"]=asm["_emscripten_bind_btSoftBody_scale_1"];var _emscripten_bind_btSoftBody_setActivationState_1=Module["_emscripten_bind_btSoftBody_setActivationState_1"]=asm["_emscripten_bind_btSoftBody_setActivationState_1"];var _emscripten_bind_btSoftBody_setAnisotropicFriction_2=Module["_emscripten_bind_btSoftBody_setAnisotropicFriction_2"]=asm["_emscripten_bind_btSoftBody_setAnisotropicFriction_2"];var _emscripten_bind_btSoftBody_setCcdMotionThreshold_1=Module["_emscripten_bind_btSoftBody_setCcdMotionThreshold_1"]=asm["_emscripten_bind_btSoftBody_setCcdMotionThreshold_1"];var _emscripten_bind_btSoftBody_setCcdSweptSphereRadius_1=Module["_emscripten_bind_btSoftBody_setCcdSweptSphereRadius_1"]=asm["_emscripten_bind_btSoftBody_setCcdSweptSphereRadius_1"];var _emscripten_bind_btSoftBody_setCollisionFlags_1=Module["_emscripten_bind_btSoftBody_setCollisionFlags_1"]=asm["_emscripten_bind_btSoftBody_setCollisionFlags_1"];var _emscripten_bind_btSoftBody_setCollisionShape_1=Module["_emscripten_bind_btSoftBody_setCollisionShape_1"]=asm["_emscripten_bind_btSoftBody_setCollisionShape_1"];var _emscripten_bind_btSoftBody_setContactProcessingThreshold_1=Module["_emscripten_bind_btSoftBody_setContactProcessingThreshold_1"]=asm["_emscripten_bind_btSoftBody_setContactProcessingThreshold_1"];var _emscripten_bind_btSoftBody_setFriction_1=Module["_emscripten_bind_btSoftBody_setFriction_1"]=asm["_emscripten_bind_btSoftBody_setFriction_1"];var _emscripten_bind_btSoftBody_setMass_2=Module["_emscripten_bind_btSoftBody_setMass_2"]=asm["_emscripten_bind_btSoftBody_setMass_2"];var _emscripten_bind_btSoftBody_setRestitution_1=Module["_emscripten_bind_btSoftBody_setRestitution_1"]=asm["_emscripten_bind_btSoftBody_setRestitution_1"];var _emscripten_bind_btSoftBody_setRollingFriction_1=Module["_emscripten_bind_btSoftBody_setRollingFriction_1"]=asm["_emscripten_bind_btSoftBody_setRollingFriction_1"];var _emscripten_bind_btSoftBody_setTotalMass_2=Module["_emscripten_bind_btSoftBody_setTotalMass_2"]=asm["_emscripten_bind_btSoftBody_setTotalMass_2"];var _emscripten_bind_btSoftBody_setUserIndex_1=Module["_emscripten_bind_btSoftBody_setUserIndex_1"]=asm["_emscripten_bind_btSoftBody_setUserIndex_1"];var _emscripten_bind_btSoftBody_setUserPointer_1=Module["_emscripten_bind_btSoftBody_setUserPointer_1"]=asm["_emscripten_bind_btSoftBody_setUserPointer_1"];var _emscripten_bind_btSoftBody_setWorldTransform_1=Module["_emscripten_bind_btSoftBody_setWorldTransform_1"]=asm["_emscripten_bind_btSoftBody_setWorldTransform_1"];var _emscripten_bind_btSoftBody_set_m_anchors_1=Module["_emscripten_bind_btSoftBody_set_m_anchors_1"]=asm["_emscripten_bind_btSoftBody_set_m_anchors_1"];var _emscripten_bind_btSoftBody_set_m_cfg_1=Module["_emscripten_bind_btSoftBody_set_m_cfg_1"]=asm["_emscripten_bind_btSoftBody_set_m_cfg_1"];var _emscripten_bind_btSoftBody_set_m_faces_1=Module["_emscripten_bind_btSoftBody_set_m_faces_1"]=asm["_emscripten_bind_btSoftBody_set_m_faces_1"];var _emscripten_bind_btSoftBody_set_m_links_1=Module["_emscripten_bind_btSoftBody_set_m_links_1"]=asm["_emscripten_bind_btSoftBody_set_m_links_1"];var _emscripten_bind_btSoftBody_set_m_materials_1=Module["_emscripten_bind_btSoftBody_set_m_materials_1"]=asm["_emscripten_bind_btSoftBody_set_m_materials_1"];var _emscripten_bind_btSoftBody_set_m_nodes_1=Module["_emscripten_bind_btSoftBody_set_m_nodes_1"]=asm["_emscripten_bind_btSoftBody_set_m_nodes_1"];var _emscripten_bind_btSoftBody_transform_1=Module["_emscripten_bind_btSoftBody_transform_1"]=asm["_emscripten_bind_btSoftBody_transform_1"];var _emscripten_bind_btSoftBody_translate_1=Module["_emscripten_bind_btSoftBody_translate_1"]=asm["_emscripten_bind_btSoftBody_translate_1"];var _emscripten_bind_btSoftBody_upcast_1=Module["_emscripten_bind_btSoftBody_upcast_1"]=asm["_emscripten_bind_btSoftBody_upcast_1"];var _emscripten_bind_btSoftRigidDynamicsWorld___destroy___0=Module["_emscripten_bind_btSoftRigidDynamicsWorld___destroy___0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld___destroy___0"];var _emscripten_bind_btSoftRigidDynamicsWorld_addAction_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addAction_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addAction_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_2=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_2"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_2"];var _emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_3=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_3"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_3"];var _emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_2=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_2"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_2"];var _emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_3=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_3"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_3"];var _emscripten_bind_btSoftRigidDynamicsWorld_addSoftBody_3=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addSoftBody_3"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addSoftBody_3"];var _emscripten_bind_btSoftRigidDynamicsWorld_addVehicle_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_addVehicle_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_addVehicle_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_btSoftRigidDynamicsWorld_5=Module["_emscripten_bind_btSoftRigidDynamicsWorld_btSoftRigidDynamicsWorld_5"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_btSoftRigidDynamicsWorld_5"];var _emscripten_bind_btSoftRigidDynamicsWorld_contactPairTest_3=Module["_emscripten_bind_btSoftRigidDynamicsWorld_contactPairTest_3"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_contactPairTest_3"];var _emscripten_bind_btSoftRigidDynamicsWorld_contactTest_2=Module["_emscripten_bind_btSoftRigidDynamicsWorld_contactTest_2"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_contactTest_2"];var _emscripten_bind_btSoftRigidDynamicsWorld_convexSweepTest_5=Module["_emscripten_bind_btSoftRigidDynamicsWorld_convexSweepTest_5"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_convexSweepTest_5"];var _emscripten_bind_btSoftRigidDynamicsWorld_getBroadphase_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getBroadphase_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getBroadphase_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_getDispatchInfo_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getDispatchInfo_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getDispatchInfo_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_getDispatcher_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getDispatcher_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getDispatcher_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_getGravity_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getGravity_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getGravity_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_getPairCache_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getPairCache_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getPairCache_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_getSoftBodyArray_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getSoftBodyArray_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getSoftBodyArray_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_getSolverInfo_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getSolverInfo_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getSolverInfo_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_getWorldInfo_0=Module["_emscripten_bind_btSoftRigidDynamicsWorld_getWorldInfo_0"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_getWorldInfo_0"];var _emscripten_bind_btSoftRigidDynamicsWorld_rayTest_3=Module["_emscripten_bind_btSoftRigidDynamicsWorld_rayTest_3"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_rayTest_3"];var _emscripten_bind_btSoftRigidDynamicsWorld_removeAction_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_removeAction_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_removeAction_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_removeCollisionObject_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_removeCollisionObject_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_removeCollisionObject_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_removeConstraint_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_removeConstraint_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_removeConstraint_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_removeRigidBody_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_removeRigidBody_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_removeRigidBody_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_removeSoftBody_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_removeSoftBody_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_removeSoftBody_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_removeVehicle_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_removeVehicle_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_removeVehicle_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_setGravity_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_setGravity_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_setGravity_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_1"];var _emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_2=Module["_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_2"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_2"];var _emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_3=Module["_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_3"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_3"];var _emscripten_bind_btSoftRigidDynamicsWorld_updateSingleAabb_1=Module["_emscripten_bind_btSoftRigidDynamicsWorld_updateSingleAabb_1"]=asm["_emscripten_bind_btSoftRigidDynamicsWorld_updateSingleAabb_1"];var _emscripten_bind_btSphereShape___destroy___0=Module["_emscripten_bind_btSphereShape___destroy___0"]=asm["_emscripten_bind_btSphereShape___destroy___0"];var _emscripten_bind_btSphereShape_btSphereShape_1=Module["_emscripten_bind_btSphereShape_btSphereShape_1"]=asm["_emscripten_bind_btSphereShape_btSphereShape_1"];var _emscripten_bind_btSphereShape_calculateLocalInertia_2=Module["_emscripten_bind_btSphereShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btSphereShape_calculateLocalInertia_2"];var _emscripten_bind_btSphereShape_getLocalScaling_0=Module["_emscripten_bind_btSphereShape_getLocalScaling_0"]=asm["_emscripten_bind_btSphereShape_getLocalScaling_0"];var _emscripten_bind_btSphereShape_getMargin_0=Module["_emscripten_bind_btSphereShape_getMargin_0"]=asm["_emscripten_bind_btSphereShape_getMargin_0"];var _emscripten_bind_btSphereShape_setLocalScaling_1=Module["_emscripten_bind_btSphereShape_setLocalScaling_1"]=asm["_emscripten_bind_btSphereShape_setLocalScaling_1"];var _emscripten_bind_btSphereShape_setMargin_1=Module["_emscripten_bind_btSphereShape_setMargin_1"]=asm["_emscripten_bind_btSphereShape_setMargin_1"];var _emscripten_bind_btStaticPlaneShape___destroy___0=Module["_emscripten_bind_btStaticPlaneShape___destroy___0"]=asm["_emscripten_bind_btStaticPlaneShape___destroy___0"];var _emscripten_bind_btStaticPlaneShape_btStaticPlaneShape_2=Module["_emscripten_bind_btStaticPlaneShape_btStaticPlaneShape_2"]=asm["_emscripten_bind_btStaticPlaneShape_btStaticPlaneShape_2"];var _emscripten_bind_btStaticPlaneShape_calculateLocalInertia_2=Module["_emscripten_bind_btStaticPlaneShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btStaticPlaneShape_calculateLocalInertia_2"];var _emscripten_bind_btStaticPlaneShape_getLocalScaling_0=Module["_emscripten_bind_btStaticPlaneShape_getLocalScaling_0"]=asm["_emscripten_bind_btStaticPlaneShape_getLocalScaling_0"];var _emscripten_bind_btStaticPlaneShape_setLocalScaling_1=Module["_emscripten_bind_btStaticPlaneShape_setLocalScaling_1"]=asm["_emscripten_bind_btStaticPlaneShape_setLocalScaling_1"];var _emscripten_bind_btStridingMeshInterface___destroy___0=Module["_emscripten_bind_btStridingMeshInterface___destroy___0"]=asm["_emscripten_bind_btStridingMeshInterface___destroy___0"];var _emscripten_bind_btTransform___destroy___0=Module["_emscripten_bind_btTransform___destroy___0"]=asm["_emscripten_bind_btTransform___destroy___0"];var _emscripten_bind_btTransform_btTransform_0=Module["_emscripten_bind_btTransform_btTransform_0"]=asm["_emscripten_bind_btTransform_btTransform_0"];var _emscripten_bind_btTransform_btTransform_2=Module["_emscripten_bind_btTransform_btTransform_2"]=asm["_emscripten_bind_btTransform_btTransform_2"];var _emscripten_bind_btTransform_getBasis_0=Module["_emscripten_bind_btTransform_getBasis_0"]=asm["_emscripten_bind_btTransform_getBasis_0"];var _emscripten_bind_btTransform_getOrigin_0=Module["_emscripten_bind_btTransform_getOrigin_0"]=asm["_emscripten_bind_btTransform_getOrigin_0"];var _emscripten_bind_btTransform_getRotation_0=Module["_emscripten_bind_btTransform_getRotation_0"]=asm["_emscripten_bind_btTransform_getRotation_0"];var _emscripten_bind_btTransform_setFromOpenGLMatrix_1=Module["_emscripten_bind_btTransform_setFromOpenGLMatrix_1"]=asm["_emscripten_bind_btTransform_setFromOpenGLMatrix_1"];var _emscripten_bind_btTransform_setIdentity_0=Module["_emscripten_bind_btTransform_setIdentity_0"]=asm["_emscripten_bind_btTransform_setIdentity_0"];var _emscripten_bind_btTransform_setOrigin_1=Module["_emscripten_bind_btTransform_setOrigin_1"]=asm["_emscripten_bind_btTransform_setOrigin_1"];var _emscripten_bind_btTransform_setRotation_1=Module["_emscripten_bind_btTransform_setRotation_1"]=asm["_emscripten_bind_btTransform_setRotation_1"];var _emscripten_bind_btTriangleMeshShape___destroy___0=Module["_emscripten_bind_btTriangleMeshShape___destroy___0"]=asm["_emscripten_bind_btTriangleMeshShape___destroy___0"];var _emscripten_bind_btTriangleMeshShape_calculateLocalInertia_2=Module["_emscripten_bind_btTriangleMeshShape_calculateLocalInertia_2"]=asm["_emscripten_bind_btTriangleMeshShape_calculateLocalInertia_2"];var _emscripten_bind_btTriangleMeshShape_getLocalScaling_0=Module["_emscripten_bind_btTriangleMeshShape_getLocalScaling_0"]=asm["_emscripten_bind_btTriangleMeshShape_getLocalScaling_0"];var _emscripten_bind_btTriangleMeshShape_setLocalScaling_1=Module["_emscripten_bind_btTriangleMeshShape_setLocalScaling_1"]=asm["_emscripten_bind_btTriangleMeshShape_setLocalScaling_1"];var _emscripten_bind_btTriangleMesh___destroy___0=Module["_emscripten_bind_btTriangleMesh___destroy___0"]=asm["_emscripten_bind_btTriangleMesh___destroy___0"];var _emscripten_bind_btTriangleMesh_addTriangle_3=Module["_emscripten_bind_btTriangleMesh_addTriangle_3"]=asm["_emscripten_bind_btTriangleMesh_addTriangle_3"];var _emscripten_bind_btTriangleMesh_addTriangle_4=Module["_emscripten_bind_btTriangleMesh_addTriangle_4"]=asm["_emscripten_bind_btTriangleMesh_addTriangle_4"];var _emscripten_bind_btTriangleMesh_btTriangleMesh_0=Module["_emscripten_bind_btTriangleMesh_btTriangleMesh_0"]=asm["_emscripten_bind_btTriangleMesh_btTriangleMesh_0"];var _emscripten_bind_btTriangleMesh_btTriangleMesh_1=Module["_emscripten_bind_btTriangleMesh_btTriangleMesh_1"]=asm["_emscripten_bind_btTriangleMesh_btTriangleMesh_1"];var _emscripten_bind_btTriangleMesh_btTriangleMesh_2=Module["_emscripten_bind_btTriangleMesh_btTriangleMesh_2"]=asm["_emscripten_bind_btTriangleMesh_btTriangleMesh_2"];var _emscripten_bind_btTypedConstraint___destroy___0=Module["_emscripten_bind_btTypedConstraint___destroy___0"]=asm["_emscripten_bind_btTypedConstraint___destroy___0"];var _emscripten_bind_btTypedConstraint_enableFeedback_1=Module["_emscripten_bind_btTypedConstraint_enableFeedback_1"]=asm["_emscripten_bind_btTypedConstraint_enableFeedback_1"];var _emscripten_bind_btTypedConstraint_getBreakingImpulseThreshold_0=Module["_emscripten_bind_btTypedConstraint_getBreakingImpulseThreshold_0"]=asm["_emscripten_bind_btTypedConstraint_getBreakingImpulseThreshold_0"];var _emscripten_bind_btTypedConstraint_getParam_2=Module["_emscripten_bind_btTypedConstraint_getParam_2"]=asm["_emscripten_bind_btTypedConstraint_getParam_2"];var _emscripten_bind_btTypedConstraint_setBreakingImpulseThreshold_1=Module["_emscripten_bind_btTypedConstraint_setBreakingImpulseThreshold_1"]=asm["_emscripten_bind_btTypedConstraint_setBreakingImpulseThreshold_1"];var _emscripten_bind_btTypedConstraint_setParam_3=Module["_emscripten_bind_btTypedConstraint_setParam_3"]=asm["_emscripten_bind_btTypedConstraint_setParam_3"];var _emscripten_bind_btVector3___destroy___0=Module["_emscripten_bind_btVector3___destroy___0"]=asm["_emscripten_bind_btVector3___destroy___0"];var _emscripten_bind_btVector3_btVector3_0=Module["_emscripten_bind_btVector3_btVector3_0"]=asm["_emscripten_bind_btVector3_btVector3_0"];var _emscripten_bind_btVector3_btVector3_3=Module["_emscripten_bind_btVector3_btVector3_3"]=asm["_emscripten_bind_btVector3_btVector3_3"];var _emscripten_bind_btVector3_dot_1=Module["_emscripten_bind_btVector3_dot_1"]=asm["_emscripten_bind_btVector3_dot_1"];var _emscripten_bind_btVector3_length_0=Module["_emscripten_bind_btVector3_length_0"]=asm["_emscripten_bind_btVector3_length_0"];var _emscripten_bind_btVector3_normalize_0=Module["_emscripten_bind_btVector3_normalize_0"]=asm["_emscripten_bind_btVector3_normalize_0"];var _emscripten_bind_btVector3_op_add_1=Module["_emscripten_bind_btVector3_op_add_1"]=asm["_emscripten_bind_btVector3_op_add_1"];var _emscripten_bind_btVector3_op_mul_1=Module["_emscripten_bind_btVector3_op_mul_1"]=asm["_emscripten_bind_btVector3_op_mul_1"];var _emscripten_bind_btVector3_op_sub_1=Module["_emscripten_bind_btVector3_op_sub_1"]=asm["_emscripten_bind_btVector3_op_sub_1"];var _emscripten_bind_btVector3_rotate_2=Module["_emscripten_bind_btVector3_rotate_2"]=asm["_emscripten_bind_btVector3_rotate_2"];var _emscripten_bind_btVector3_setValue_3=Module["_emscripten_bind_btVector3_setValue_3"]=asm["_emscripten_bind_btVector3_setValue_3"];var _emscripten_bind_btVector3_setX_1=Module["_emscripten_bind_btVector3_setX_1"]=asm["_emscripten_bind_btVector3_setX_1"];var _emscripten_bind_btVector3_setY_1=Module["_emscripten_bind_btVector3_setY_1"]=asm["_emscripten_bind_btVector3_setY_1"];var _emscripten_bind_btVector3_setZ_1=Module["_emscripten_bind_btVector3_setZ_1"]=asm["_emscripten_bind_btVector3_setZ_1"];var _emscripten_bind_btVector3_x_0=Module["_emscripten_bind_btVector3_x_0"]=asm["_emscripten_bind_btVector3_x_0"];var _emscripten_bind_btVector3_y_0=Module["_emscripten_bind_btVector3_y_0"]=asm["_emscripten_bind_btVector3_y_0"];var _emscripten_bind_btVector3_z_0=Module["_emscripten_bind_btVector3_z_0"]=asm["_emscripten_bind_btVector3_z_0"];var _emscripten_bind_btVector4___destroy___0=Module["_emscripten_bind_btVector4___destroy___0"]=asm["_emscripten_bind_btVector4___destroy___0"];var _emscripten_bind_btVector4_btVector4_0=Module["_emscripten_bind_btVector4_btVector4_0"]=asm["_emscripten_bind_btVector4_btVector4_0"];var _emscripten_bind_btVector4_btVector4_4=Module["_emscripten_bind_btVector4_btVector4_4"]=asm["_emscripten_bind_btVector4_btVector4_4"];var _emscripten_bind_btVector4_dot_1=Module["_emscripten_bind_btVector4_dot_1"]=asm["_emscripten_bind_btVector4_dot_1"];var _emscripten_bind_btVector4_length_0=Module["_emscripten_bind_btVector4_length_0"]=asm["_emscripten_bind_btVector4_length_0"];var _emscripten_bind_btVector4_normalize_0=Module["_emscripten_bind_btVector4_normalize_0"]=asm["_emscripten_bind_btVector4_normalize_0"];var _emscripten_bind_btVector4_op_add_1=Module["_emscripten_bind_btVector4_op_add_1"]=asm["_emscripten_bind_btVector4_op_add_1"];var _emscripten_bind_btVector4_op_mul_1=Module["_emscripten_bind_btVector4_op_mul_1"]=asm["_emscripten_bind_btVector4_op_mul_1"];var _emscripten_bind_btVector4_op_sub_1=Module["_emscripten_bind_btVector4_op_sub_1"]=asm["_emscripten_bind_btVector4_op_sub_1"];var _emscripten_bind_btVector4_rotate_2=Module["_emscripten_bind_btVector4_rotate_2"]=asm["_emscripten_bind_btVector4_rotate_2"];var _emscripten_bind_btVector4_setValue_4=Module["_emscripten_bind_btVector4_setValue_4"]=asm["_emscripten_bind_btVector4_setValue_4"];var _emscripten_bind_btVector4_setX_1=Module["_emscripten_bind_btVector4_setX_1"]=asm["_emscripten_bind_btVector4_setX_1"];var _emscripten_bind_btVector4_setY_1=Module["_emscripten_bind_btVector4_setY_1"]=asm["_emscripten_bind_btVector4_setY_1"];var _emscripten_bind_btVector4_setZ_1=Module["_emscripten_bind_btVector4_setZ_1"]=asm["_emscripten_bind_btVector4_setZ_1"];var _emscripten_bind_btVector4_w_0=Module["_emscripten_bind_btVector4_w_0"]=asm["_emscripten_bind_btVector4_w_0"];var _emscripten_bind_btVector4_x_0=Module["_emscripten_bind_btVector4_x_0"]=asm["_emscripten_bind_btVector4_x_0"];var _emscripten_bind_btVector4_y_0=Module["_emscripten_bind_btVector4_y_0"]=asm["_emscripten_bind_btVector4_y_0"];var _emscripten_bind_btVector4_z_0=Module["_emscripten_bind_btVector4_z_0"]=asm["_emscripten_bind_btVector4_z_0"];var _emscripten_bind_btVehicleRaycasterResult___destroy___0=Module["_emscripten_bind_btVehicleRaycasterResult___destroy___0"]=asm["_emscripten_bind_btVehicleRaycasterResult___destroy___0"];var _emscripten_bind_btVehicleRaycasterResult_get_m_distFraction_0=Module["_emscripten_bind_btVehicleRaycasterResult_get_m_distFraction_0"]=asm["_emscripten_bind_btVehicleRaycasterResult_get_m_distFraction_0"];var _emscripten_bind_btVehicleRaycasterResult_get_m_hitNormalInWorld_0=Module["_emscripten_bind_btVehicleRaycasterResult_get_m_hitNormalInWorld_0"]=asm["_emscripten_bind_btVehicleRaycasterResult_get_m_hitNormalInWorld_0"];var _emscripten_bind_btVehicleRaycasterResult_get_m_hitPointInWorld_0=Module["_emscripten_bind_btVehicleRaycasterResult_get_m_hitPointInWorld_0"]=asm["_emscripten_bind_btVehicleRaycasterResult_get_m_hitPointInWorld_0"];var _emscripten_bind_btVehicleRaycasterResult_set_m_distFraction_1=Module["_emscripten_bind_btVehicleRaycasterResult_set_m_distFraction_1"]=asm["_emscripten_bind_btVehicleRaycasterResult_set_m_distFraction_1"];var _emscripten_bind_btVehicleRaycasterResult_set_m_hitNormalInWorld_1=Module["_emscripten_bind_btVehicleRaycasterResult_set_m_hitNormalInWorld_1"]=asm["_emscripten_bind_btVehicleRaycasterResult_set_m_hitNormalInWorld_1"];var _emscripten_bind_btVehicleRaycasterResult_set_m_hitPointInWorld_1=Module["_emscripten_bind_btVehicleRaycasterResult_set_m_hitPointInWorld_1"]=asm["_emscripten_bind_btVehicleRaycasterResult_set_m_hitPointInWorld_1"];var _emscripten_bind_btVehicleRaycaster___destroy___0=Module["_emscripten_bind_btVehicleRaycaster___destroy___0"]=asm["_emscripten_bind_btVehicleRaycaster___destroy___0"];var _emscripten_bind_btVehicleRaycaster_castRay_3=Module["_emscripten_bind_btVehicleRaycaster_castRay_3"]=asm["_emscripten_bind_btVehicleRaycaster_castRay_3"];var _emscripten_bind_btVehicleTuning_btVehicleTuning_0=Module["_emscripten_bind_btVehicleTuning_btVehicleTuning_0"]=asm["_emscripten_bind_btVehicleTuning_btVehicleTuning_0"];var _emscripten_bind_btVehicleTuning_get_m_frictionSlip_0=Module["_emscripten_bind_btVehicleTuning_get_m_frictionSlip_0"]=asm["_emscripten_bind_btVehicleTuning_get_m_frictionSlip_0"];var _emscripten_bind_btVehicleTuning_get_m_maxSuspensionForce_0=Module["_emscripten_bind_btVehicleTuning_get_m_maxSuspensionForce_0"]=asm["_emscripten_bind_btVehicleTuning_get_m_maxSuspensionForce_0"];var _emscripten_bind_btVehicleTuning_get_m_maxSuspensionTravelCm_0=Module["_emscripten_bind_btVehicleTuning_get_m_maxSuspensionTravelCm_0"]=asm["_emscripten_bind_btVehicleTuning_get_m_maxSuspensionTravelCm_0"];var _emscripten_bind_btVehicleTuning_get_m_suspensionCompression_0=Module["_emscripten_bind_btVehicleTuning_get_m_suspensionCompression_0"]=asm["_emscripten_bind_btVehicleTuning_get_m_suspensionCompression_0"];var _emscripten_bind_btVehicleTuning_get_m_suspensionDamping_0=Module["_emscripten_bind_btVehicleTuning_get_m_suspensionDamping_0"]=asm["_emscripten_bind_btVehicleTuning_get_m_suspensionDamping_0"];var _emscripten_bind_btVehicleTuning_get_m_suspensionStiffness_0=Module["_emscripten_bind_btVehicleTuning_get_m_suspensionStiffness_0"]=asm["_emscripten_bind_btVehicleTuning_get_m_suspensionStiffness_0"];var _emscripten_bind_btVehicleTuning_set_m_frictionSlip_1=Module["_emscripten_bind_btVehicleTuning_set_m_frictionSlip_1"]=asm["_emscripten_bind_btVehicleTuning_set_m_frictionSlip_1"];var _emscripten_bind_btVehicleTuning_set_m_maxSuspensionForce_1=Module["_emscripten_bind_btVehicleTuning_set_m_maxSuspensionForce_1"]=asm["_emscripten_bind_btVehicleTuning_set_m_maxSuspensionForce_1"];var _emscripten_bind_btVehicleTuning_set_m_maxSuspensionTravelCm_1=Module["_emscripten_bind_btVehicleTuning_set_m_maxSuspensionTravelCm_1"]=asm["_emscripten_bind_btVehicleTuning_set_m_maxSuspensionTravelCm_1"];var _emscripten_bind_btVehicleTuning_set_m_suspensionCompression_1=Module["_emscripten_bind_btVehicleTuning_set_m_suspensionCompression_1"]=asm["_emscripten_bind_btVehicleTuning_set_m_suspensionCompression_1"];var _emscripten_bind_btVehicleTuning_set_m_suspensionDamping_1=Module["_emscripten_bind_btVehicleTuning_set_m_suspensionDamping_1"]=asm["_emscripten_bind_btVehicleTuning_set_m_suspensionDamping_1"];var _emscripten_bind_btVehicleTuning_set_m_suspensionStiffness_1=Module["_emscripten_bind_btVehicleTuning_set_m_suspensionStiffness_1"]=asm["_emscripten_bind_btVehicleTuning_set_m_suspensionStiffness_1"];var _emscripten_bind_btWheelInfoConstructionInfo___destroy___0=Module["_emscripten_bind_btWheelInfoConstructionInfo___destroy___0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo___destroy___0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_bIsFrontWheel_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_bIsFrontWheel_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_bIsFrontWheel_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_chassisConnectionCS_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_chassisConnectionCS_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_chassisConnectionCS_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_frictionSlip_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_frictionSlip_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_frictionSlip_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionForce_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionForce_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionForce_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionTravelCm_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionTravelCm_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionTravelCm_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionRestLength_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionRestLength_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionRestLength_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionStiffness_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionStiffness_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionStiffness_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelAxleCS_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelAxleCS_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelAxleCS_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelDirectionCS_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelDirectionCS_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelDirectionCS_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelRadius_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelRadius_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelRadius_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingCompression_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingCompression_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingCompression_0"];var _emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingRelaxation_0=Module["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingRelaxation_0"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingRelaxation_0"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_bIsFrontWheel_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_bIsFrontWheel_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_bIsFrontWheel_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_chassisConnectionCS_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_chassisConnectionCS_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_chassisConnectionCS_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_frictionSlip_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_frictionSlip_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_frictionSlip_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionForce_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionForce_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionForce_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionTravelCm_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionTravelCm_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionTravelCm_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionRestLength_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionRestLength_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionRestLength_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionStiffness_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionStiffness_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionStiffness_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelAxleCS_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelAxleCS_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelAxleCS_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelDirectionCS_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelDirectionCS_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelDirectionCS_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelRadius_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelRadius_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelRadius_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingCompression_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingCompression_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingCompression_1"];var _emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingRelaxation_1=Module["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingRelaxation_1"]=asm["_emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingRelaxation_1"];var _emscripten_bind_btWheelInfo___destroy___0=Module["_emscripten_bind_btWheelInfo___destroy___0"]=asm["_emscripten_bind_btWheelInfo___destroy___0"];var _emscripten_bind_btWheelInfo_btWheelInfo_1=Module["_emscripten_bind_btWheelInfo_btWheelInfo_1"]=asm["_emscripten_bind_btWheelInfo_btWheelInfo_1"];var _emscripten_bind_btWheelInfo_getSuspensionRestLength_0=Module["_emscripten_bind_btWheelInfo_getSuspensionRestLength_0"]=asm["_emscripten_bind_btWheelInfo_getSuspensionRestLength_0"];var _emscripten_bind_btWheelInfo_get_m_bIsFrontWheel_0=Module["_emscripten_bind_btWheelInfo_get_m_bIsFrontWheel_0"]=asm["_emscripten_bind_btWheelInfo_get_m_bIsFrontWheel_0"];var _emscripten_bind_btWheelInfo_get_m_brake_0=Module["_emscripten_bind_btWheelInfo_get_m_brake_0"]=asm["_emscripten_bind_btWheelInfo_get_m_brake_0"];var _emscripten_bind_btWheelInfo_get_m_chassisConnectionPointCS_0=Module["_emscripten_bind_btWheelInfo_get_m_chassisConnectionPointCS_0"]=asm["_emscripten_bind_btWheelInfo_get_m_chassisConnectionPointCS_0"];var _emscripten_bind_btWheelInfo_get_m_clippedInvContactDotSuspension_0=Module["_emscripten_bind_btWheelInfo_get_m_clippedInvContactDotSuspension_0"]=asm["_emscripten_bind_btWheelInfo_get_m_clippedInvContactDotSuspension_0"];var _emscripten_bind_btWheelInfo_get_m_deltaRotation_0=Module["_emscripten_bind_btWheelInfo_get_m_deltaRotation_0"]=asm["_emscripten_bind_btWheelInfo_get_m_deltaRotation_0"];var _emscripten_bind_btWheelInfo_get_m_engineForce_0=Module["_emscripten_bind_btWheelInfo_get_m_engineForce_0"]=asm["_emscripten_bind_btWheelInfo_get_m_engineForce_0"];var _emscripten_bind_btWheelInfo_get_m_frictionSlip_0=Module["_emscripten_bind_btWheelInfo_get_m_frictionSlip_0"]=asm["_emscripten_bind_btWheelInfo_get_m_frictionSlip_0"];var _emscripten_bind_btWheelInfo_get_m_maxSuspensionForce_0=Module["_emscripten_bind_btWheelInfo_get_m_maxSuspensionForce_0"]=asm["_emscripten_bind_btWheelInfo_get_m_maxSuspensionForce_0"];var _emscripten_bind_btWheelInfo_get_m_maxSuspensionTravelCm_0=Module["_emscripten_bind_btWheelInfo_get_m_maxSuspensionTravelCm_0"]=asm["_emscripten_bind_btWheelInfo_get_m_maxSuspensionTravelCm_0"];var _emscripten_bind_btWheelInfo_get_m_raycastInfo_0=Module["_emscripten_bind_btWheelInfo_get_m_raycastInfo_0"]=asm["_emscripten_bind_btWheelInfo_get_m_raycastInfo_0"];var _emscripten_bind_btWheelInfo_get_m_rollInfluence_0=Module["_emscripten_bind_btWheelInfo_get_m_rollInfluence_0"]=asm["_emscripten_bind_btWheelInfo_get_m_rollInfluence_0"];var _emscripten_bind_btWheelInfo_get_m_rotation_0=Module["_emscripten_bind_btWheelInfo_get_m_rotation_0"]=asm["_emscripten_bind_btWheelInfo_get_m_rotation_0"];var _emscripten_bind_btWheelInfo_get_m_skidInfo_0=Module["_emscripten_bind_btWheelInfo_get_m_skidInfo_0"]=asm["_emscripten_bind_btWheelInfo_get_m_skidInfo_0"];var _emscripten_bind_btWheelInfo_get_m_steering_0=Module["_emscripten_bind_btWheelInfo_get_m_steering_0"]=asm["_emscripten_bind_btWheelInfo_get_m_steering_0"];var _emscripten_bind_btWheelInfo_get_m_suspensionRelativeVelocity_0=Module["_emscripten_bind_btWheelInfo_get_m_suspensionRelativeVelocity_0"]=asm["_emscripten_bind_btWheelInfo_get_m_suspensionRelativeVelocity_0"];var _emscripten_bind_btWheelInfo_get_m_suspensionRestLength1_0=Module["_emscripten_bind_btWheelInfo_get_m_suspensionRestLength1_0"]=asm["_emscripten_bind_btWheelInfo_get_m_suspensionRestLength1_0"];var _emscripten_bind_btWheelInfo_get_m_suspensionStiffness_0=Module["_emscripten_bind_btWheelInfo_get_m_suspensionStiffness_0"]=asm["_emscripten_bind_btWheelInfo_get_m_suspensionStiffness_0"];var _emscripten_bind_btWheelInfo_get_m_wheelAxleCS_0=Module["_emscripten_bind_btWheelInfo_get_m_wheelAxleCS_0"]=asm["_emscripten_bind_btWheelInfo_get_m_wheelAxleCS_0"];var _emscripten_bind_btWheelInfo_get_m_wheelDirectionCS_0=Module["_emscripten_bind_btWheelInfo_get_m_wheelDirectionCS_0"]=asm["_emscripten_bind_btWheelInfo_get_m_wheelDirectionCS_0"];var _emscripten_bind_btWheelInfo_get_m_wheelsDampingCompression_0=Module["_emscripten_bind_btWheelInfo_get_m_wheelsDampingCompression_0"]=asm["_emscripten_bind_btWheelInfo_get_m_wheelsDampingCompression_0"];var _emscripten_bind_btWheelInfo_get_m_wheelsDampingRelaxation_0=Module["_emscripten_bind_btWheelInfo_get_m_wheelsDampingRelaxation_0"]=asm["_emscripten_bind_btWheelInfo_get_m_wheelsDampingRelaxation_0"];var _emscripten_bind_btWheelInfo_get_m_wheelsRadius_0=Module["_emscripten_bind_btWheelInfo_get_m_wheelsRadius_0"]=asm["_emscripten_bind_btWheelInfo_get_m_wheelsRadius_0"];var _emscripten_bind_btWheelInfo_get_m_wheelsSuspensionForce_0=Module["_emscripten_bind_btWheelInfo_get_m_wheelsSuspensionForce_0"]=asm["_emscripten_bind_btWheelInfo_get_m_wheelsSuspensionForce_0"];var _emscripten_bind_btWheelInfo_get_m_worldTransform_0=Module["_emscripten_bind_btWheelInfo_get_m_worldTransform_0"]=asm["_emscripten_bind_btWheelInfo_get_m_worldTransform_0"];var _emscripten_bind_btWheelInfo_set_m_bIsFrontWheel_1=Module["_emscripten_bind_btWheelInfo_set_m_bIsFrontWheel_1"]=asm["_emscripten_bind_btWheelInfo_set_m_bIsFrontWheel_1"];var _emscripten_bind_btWheelInfo_set_m_brake_1=Module["_emscripten_bind_btWheelInfo_set_m_brake_1"]=asm["_emscripten_bind_btWheelInfo_set_m_brake_1"];var _emscripten_bind_btWheelInfo_set_m_chassisConnectionPointCS_1=Module["_emscripten_bind_btWheelInfo_set_m_chassisConnectionPointCS_1"]=asm["_emscripten_bind_btWheelInfo_set_m_chassisConnectionPointCS_1"];var _emscripten_bind_btWheelInfo_set_m_clippedInvContactDotSuspension_1=Module["_emscripten_bind_btWheelInfo_set_m_clippedInvContactDotSuspension_1"]=asm["_emscripten_bind_btWheelInfo_set_m_clippedInvContactDotSuspension_1"];var _emscripten_bind_btWheelInfo_set_m_deltaRotation_1=Module["_emscripten_bind_btWheelInfo_set_m_deltaRotation_1"]=asm["_emscripten_bind_btWheelInfo_set_m_deltaRotation_1"];var _emscripten_bind_btWheelInfo_set_m_engineForce_1=Module["_emscripten_bind_btWheelInfo_set_m_engineForce_1"]=asm["_emscripten_bind_btWheelInfo_set_m_engineForce_1"];var _emscripten_bind_btWheelInfo_set_m_frictionSlip_1=Module["_emscripten_bind_btWheelInfo_set_m_frictionSlip_1"]=asm["_emscripten_bind_btWheelInfo_set_m_frictionSlip_1"];var _emscripten_bind_btWheelInfo_set_m_maxSuspensionForce_1=Module["_emscripten_bind_btWheelInfo_set_m_maxSuspensionForce_1"]=asm["_emscripten_bind_btWheelInfo_set_m_maxSuspensionForce_1"];var _emscripten_bind_btWheelInfo_set_m_maxSuspensionTravelCm_1=Module["_emscripten_bind_btWheelInfo_set_m_maxSuspensionTravelCm_1"]=asm["_emscripten_bind_btWheelInfo_set_m_maxSuspensionTravelCm_1"];var _emscripten_bind_btWheelInfo_set_m_raycastInfo_1=Module["_emscripten_bind_btWheelInfo_set_m_raycastInfo_1"]=asm["_emscripten_bind_btWheelInfo_set_m_raycastInfo_1"];var _emscripten_bind_btWheelInfo_set_m_rollInfluence_1=Module["_emscripten_bind_btWheelInfo_set_m_rollInfluence_1"]=asm["_emscripten_bind_btWheelInfo_set_m_rollInfluence_1"];var _emscripten_bind_btWheelInfo_set_m_rotation_1=Module["_emscripten_bind_btWheelInfo_set_m_rotation_1"]=asm["_emscripten_bind_btWheelInfo_set_m_rotation_1"];var _emscripten_bind_btWheelInfo_set_m_skidInfo_1=Module["_emscripten_bind_btWheelInfo_set_m_skidInfo_1"]=asm["_emscripten_bind_btWheelInfo_set_m_skidInfo_1"];var _emscripten_bind_btWheelInfo_set_m_steering_1=Module["_emscripten_bind_btWheelInfo_set_m_steering_1"]=asm["_emscripten_bind_btWheelInfo_set_m_steering_1"];var _emscripten_bind_btWheelInfo_set_m_suspensionRelativeVelocity_1=Module["_emscripten_bind_btWheelInfo_set_m_suspensionRelativeVelocity_1"]=asm["_emscripten_bind_btWheelInfo_set_m_suspensionRelativeVelocity_1"];var _emscripten_bind_btWheelInfo_set_m_suspensionRestLength1_1=Module["_emscripten_bind_btWheelInfo_set_m_suspensionRestLength1_1"]=asm["_emscripten_bind_btWheelInfo_set_m_suspensionRestLength1_1"];var _emscripten_bind_btWheelInfo_set_m_suspensionStiffness_1=Module["_emscripten_bind_btWheelInfo_set_m_suspensionStiffness_1"]=asm["_emscripten_bind_btWheelInfo_set_m_suspensionStiffness_1"];var _emscripten_bind_btWheelInfo_set_m_wheelAxleCS_1=Module["_emscripten_bind_btWheelInfo_set_m_wheelAxleCS_1"]=asm["_emscripten_bind_btWheelInfo_set_m_wheelAxleCS_1"];var _emscripten_bind_btWheelInfo_set_m_wheelDirectionCS_1=Module["_emscripten_bind_btWheelInfo_set_m_wheelDirectionCS_1"]=asm["_emscripten_bind_btWheelInfo_set_m_wheelDirectionCS_1"];var _emscripten_bind_btWheelInfo_set_m_wheelsDampingCompression_1=Module["_emscripten_bind_btWheelInfo_set_m_wheelsDampingCompression_1"]=asm["_emscripten_bind_btWheelInfo_set_m_wheelsDampingCompression_1"];var _emscripten_bind_btWheelInfo_set_m_wheelsDampingRelaxation_1=Module["_emscripten_bind_btWheelInfo_set_m_wheelsDampingRelaxation_1"]=asm["_emscripten_bind_btWheelInfo_set_m_wheelsDampingRelaxation_1"];var _emscripten_bind_btWheelInfo_set_m_wheelsRadius_1=Module["_emscripten_bind_btWheelInfo_set_m_wheelsRadius_1"]=asm["_emscripten_bind_btWheelInfo_set_m_wheelsRadius_1"];var _emscripten_bind_btWheelInfo_set_m_wheelsSuspensionForce_1=Module["_emscripten_bind_btWheelInfo_set_m_wheelsSuspensionForce_1"]=asm["_emscripten_bind_btWheelInfo_set_m_wheelsSuspensionForce_1"];var _emscripten_bind_btWheelInfo_set_m_worldTransform_1=Module["_emscripten_bind_btWheelInfo_set_m_worldTransform_1"]=asm["_emscripten_bind_btWheelInfo_set_m_worldTransform_1"];var _emscripten_bind_btWheelInfo_updateWheel_2=Module["_emscripten_bind_btWheelInfo_updateWheel_2"]=asm["_emscripten_bind_btWheelInfo_updateWheel_2"];var _emscripten_bind_tAnchorArray___destroy___0=Module["_emscripten_bind_tAnchorArray___destroy___0"]=asm["_emscripten_bind_tAnchorArray___destroy___0"];var _emscripten_bind_tAnchorArray_at_1=Module["_emscripten_bind_tAnchorArray_at_1"]=asm["_emscripten_bind_tAnchorArray_at_1"];var _emscripten_bind_tAnchorArray_clear_0=Module["_emscripten_bind_tAnchorArray_clear_0"]=asm["_emscripten_bind_tAnchorArray_clear_0"];var _emscripten_bind_tAnchorArray_pop_back_0=Module["_emscripten_bind_tAnchorArray_pop_back_0"]=asm["_emscripten_bind_tAnchorArray_pop_back_0"];var _emscripten_bind_tAnchorArray_push_back_1=Module["_emscripten_bind_tAnchorArray_push_back_1"]=asm["_emscripten_bind_tAnchorArray_push_back_1"];var _emscripten_bind_tAnchorArray_size_0=Module["_emscripten_bind_tAnchorArray_size_0"]=asm["_emscripten_bind_tAnchorArray_size_0"];var _emscripten_bind_tFaceArray___destroy___0=Module["_emscripten_bind_tFaceArray___destroy___0"]=asm["_emscripten_bind_tFaceArray___destroy___0"];var _emscripten_bind_tFaceArray_at_1=Module["_emscripten_bind_tFaceArray_at_1"]=asm["_emscripten_bind_tFaceArray_at_1"];var _emscripten_bind_tFaceArray_size_0=Module["_emscripten_bind_tFaceArray_size_0"]=asm["_emscripten_bind_tFaceArray_size_0"];var _emscripten_bind_tLinkArray___destroy___0=Module["_emscripten_bind_tLinkArray___destroy___0"]=asm["_emscripten_bind_tLinkArray___destroy___0"];var _emscripten_bind_tLinkArray_at_1=Module["_emscripten_bind_tLinkArray_at_1"]=asm["_emscripten_bind_tLinkArray_at_1"];var _emscripten_bind_tLinkArray_size_0=Module["_emscripten_bind_tLinkArray_size_0"]=asm["_emscripten_bind_tLinkArray_size_0"];var _emscripten_bind_tMaterialArray___destroy___0=Module["_emscripten_bind_tMaterialArray___destroy___0"]=asm["_emscripten_bind_tMaterialArray___destroy___0"];var _emscripten_bind_tMaterialArray_at_1=Module["_emscripten_bind_tMaterialArray_at_1"]=asm["_emscripten_bind_tMaterialArray_at_1"];var _emscripten_bind_tMaterialArray_size_0=Module["_emscripten_bind_tMaterialArray_size_0"]=asm["_emscripten_bind_tMaterialArray_size_0"];var _emscripten_bind_tNodeArray___destroy___0=Module["_emscripten_bind_tNodeArray___destroy___0"]=asm["_emscripten_bind_tNodeArray___destroy___0"];var _emscripten_bind_tNodeArray_at_1=Module["_emscripten_bind_tNodeArray_at_1"]=asm["_emscripten_bind_tNodeArray_at_1"];var _emscripten_bind_tNodeArray_size_0=Module["_emscripten_bind_tNodeArray_size_0"]=asm["_emscripten_bind_tNodeArray_size_0"];var _emscripten_enum_PHY_ScalarType_PHY_DOUBLE=Module["_emscripten_enum_PHY_ScalarType_PHY_DOUBLE"]=asm["_emscripten_enum_PHY_ScalarType_PHY_DOUBLE"];var _emscripten_enum_PHY_ScalarType_PHY_FIXEDPOINT88=Module["_emscripten_enum_PHY_ScalarType_PHY_FIXEDPOINT88"]=asm["_emscripten_enum_PHY_ScalarType_PHY_FIXEDPOINT88"];var _emscripten_enum_PHY_ScalarType_PHY_FLOAT=Module["_emscripten_enum_PHY_ScalarType_PHY_FLOAT"]=asm["_emscripten_enum_PHY_ScalarType_PHY_FLOAT"];var _emscripten_enum_PHY_ScalarType_PHY_INTEGER=Module["_emscripten_enum_PHY_ScalarType_PHY_INTEGER"]=asm["_emscripten_enum_PHY_ScalarType_PHY_INTEGER"];var _emscripten_enum_PHY_ScalarType_PHY_SHORT=Module["_emscripten_enum_PHY_ScalarType_PHY_SHORT"]=asm["_emscripten_enum_PHY_ScalarType_PHY_SHORT"];var _emscripten_enum_PHY_ScalarType_PHY_UCHAR=Module["_emscripten_enum_PHY_ScalarType_PHY_UCHAR"]=asm["_emscripten_enum_PHY_ScalarType_PHY_UCHAR"];var _emscripten_enum_btConstraintParams_BT_CONSTRAINT_CFM=Module["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_CFM"]=asm["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_CFM"];var _emscripten_enum_btConstraintParams_BT_CONSTRAINT_ERP=Module["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_ERP"]=asm["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_ERP"];var _emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_CFM=Module["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_CFM"]=asm["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_CFM"];var _emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_ERP=Module["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_ERP"]=asm["_emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_ERP"];var _free=Module["_free"]=asm["_free"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var _llvm_bswap_i16=Module["_llvm_bswap_i16"]=asm["_llvm_bswap_i16"];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_di=Module["dynCall_di"]=asm["dynCall_di"];var dynCall_did=Module["dynCall_did"]=asm["dynCall_did"];var dynCall_diidii=Module["dynCall_diidii"]=asm["dynCall_diidii"];var dynCall_diii=Module["dynCall_diii"]=asm["dynCall_diii"];var dynCall_diiidii=Module["dynCall_diiidii"]=asm["dynCall_diiidii"];var dynCall_diiii=Module["dynCall_diiii"]=asm["dynCall_diiii"];var dynCall_diiiii=Module["dynCall_diiiii"]=asm["dynCall_diiiii"];var dynCall_diiiiiiii=Module["dynCall_diiiiiiii"]=asm["dynCall_diiiiiiii"];var dynCall_diiiiiiiii=Module["dynCall_diiiiiiiii"]=asm["dynCall_diiiiiiiii"];var dynCall_diiiiiiiiii=Module["dynCall_diiiiiiiiii"]=asm["dynCall_diiiiiiiiii"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_iidid=Module["dynCall_iidid"]=asm["dynCall_iidid"];var dynCall_iii=Module["dynCall_iii"]=asm["dynCall_iii"];var dynCall_iiid=Module["dynCall_iiid"]=asm["dynCall_iiid"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];var dynCall_iiiii=Module["dynCall_iiiii"]=asm["dynCall_iiiii"];var dynCall_iiiiii=Module["dynCall_iiiiii"]=asm["dynCall_iiiiii"];var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=asm["dynCall_iiiiiii"];var dynCall_iiiiiiiii=Module["dynCall_iiiiiiiii"]=asm["dynCall_iiiiiiiii"];var dynCall_iiiiiiiiiii=Module["dynCall_iiiiiiiiiii"]=asm["dynCall_iiiiiiiiiii"];var dynCall_v=Module["dynCall_v"]=asm["dynCall_v"];var dynCall_vi=Module["dynCall_vi"]=asm["dynCall_vi"];var dynCall_vid=Module["dynCall_vid"]=asm["dynCall_vid"];var dynCall_vidd=Module["dynCall_vidd"]=asm["dynCall_vidd"];var dynCall_viddiii=Module["dynCall_viddiii"]=asm["dynCall_viddiii"];var dynCall_vidi=Module["dynCall_vidi"]=asm["dynCall_vidi"];var dynCall_vidii=Module["dynCall_vidii"]=asm["dynCall_vidii"];var dynCall_vii=Module["dynCall_vii"]=asm["dynCall_vii"];var dynCall_viid=Module["dynCall_viid"]=asm["dynCall_viid"];var dynCall_viidi=Module["dynCall_viidi"]=asm["dynCall_viidi"];var dynCall_viidii=Module["dynCall_viidii"]=asm["dynCall_viidii"];var dynCall_viii=Module["dynCall_viii"]=asm["dynCall_viii"];var dynCall_viiid=Module["dynCall_viiid"]=asm["dynCall_viiid"];var dynCall_viiidii=Module["dynCall_viiidii"]=asm["dynCall_viiidii"];var dynCall_viiii=Module["dynCall_viiii"]=asm["dynCall_viiii"];var dynCall_viiiid=Module["dynCall_viiiid"]=asm["dynCall_viiiid"];var dynCall_viiiidddddidi=Module["dynCall_viiiidddddidi"]=asm["dynCall_viiiidddddidi"];var dynCall_viiiiddddiid=Module["dynCall_viiiiddddiid"]=asm["dynCall_viiiiddddiid"];var dynCall_viiiii=Module["dynCall_viiiii"]=asm["dynCall_viiiii"];var dynCall_viiiiid=Module["dynCall_viiiiid"]=asm["dynCall_viiiiid"];var dynCall_viiiiii=Module["dynCall_viiiiii"]=asm["dynCall_viiiiii"];var dynCall_viiiiiii=Module["dynCall_viiiiiii"]=asm["dynCall_viiiiiii"];var dynCall_viiiiiiiii=Module["dynCall_viiiiiiiii"]=asm["dynCall_viiiiiiiii"];var dynCall_viiiiiiiiii=Module["dynCall_viiiiiiiiii"]=asm["dynCall_viiiiiiiiii"];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;var preloadStartTime=null;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};function run(args){args=args||Module["arguments"];if(preloadStartTime===null)preloadStartTime=Date.now();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;var abortDecorators=[];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 zero effective time scale + this.enabled = true; // false -> zero effective weight + + this.clampWhenFinished = false; // keep feeding the last frame? + + this.zeroSlopeAtStart = true; // for smooth interpolation w/o separate + this.zeroSlopeAtEnd = true; // clips for start, loop and end + +} + +Object.assign( AnimationAction.prototype, { + + // State & Scheduling + + play: function () { + + this._mixer._activateAction( this ); + + return this; + + }, + + stop: function () { + + this._mixer._deactivateAction( this ); + + return this.reset(); + + }, + + reset: function () { + + this.paused = false; + this.enabled = true; + + this.time = 0; // restart clip + this._loopCount = - 1; // forget previous loops + this._startTime = null; // forget scheduling + + return this.stopFading().stopWarping(); + + }, + + isRunning: function () { + + return this.enabled && ! this.paused && this.timeScale !== 0 && + this._startTime === null && this._mixer._isActiveAction( this ); + + }, + + // return true when play has been called + isScheduled: function () { + + return this._mixer._isActiveAction( this ); + + }, + + startAt: function ( time ) { + + this._startTime = time; + + return this; + + }, + + setLoop: function ( mode, repetitions ) { + + this.loop = mode; + this.repetitions = repetitions; + + return this; + + }, + + // Weight + + // set the weight stopping any scheduled fading + // although .enabled = false yields an effective weight of zero, this + // method does *not* change .enabled, because it would be confusing + setEffectiveWeight: function ( weight ) { + + this.weight = weight; + + // note: same logic as when updated at runtime + this._effectiveWeight = this.enabled ? weight : 0; + + return this.stopFading(); + + }, + + // return the weight considering fading and .enabled + getEffectiveWeight: function () { + + return this._effectiveWeight; + + }, + + fadeIn: function ( duration ) { + + return this._scheduleFading( duration, 0, 1 ); + + }, + + fadeOut: function ( duration ) { + + return this._scheduleFading( duration, 1, 0 ); + + }, + + crossFadeFrom: function ( fadeOutAction, duration, warp ) { + + fadeOutAction.fadeOut( duration ); + this.fadeIn( duration ); + + if ( warp ) { + + var fadeInDuration = this._clip.duration, + fadeOutDuration = fadeOutAction._clip.duration, + + startEndRatio = fadeOutDuration / fadeInDuration, + endStartRatio = fadeInDuration / fadeOutDuration; + + fadeOutAction.warp( 1.0, startEndRatio, duration ); + this.warp( endStartRatio, 1.0, duration ); + + } + + return this; + + }, + + crossFadeTo: function ( fadeInAction, duration, warp ) { + + return fadeInAction.crossFadeFrom( this, duration, warp ); + + }, + + stopFading: function () { + + var weightInterpolant = this._weightInterpolant; + + if ( weightInterpolant !== null ) { + + this._weightInterpolant = null; + this._mixer._takeBackControlInterpolant( weightInterpolant ); + + } + + return this; + + }, + + // Time Scale Control + + // set the time scale stopping any scheduled warping + // although .paused = true yields an effective time scale of zero, this + // method does *not* change .paused, because it would be confusing + setEffectiveTimeScale: function ( timeScale ) { + + this.timeScale = timeScale; + this._effectiveTimeScale = this.paused ? 0 : timeScale; + + return this.stopWarping(); + + }, + + // return the time scale considering warping and .paused + getEffectiveTimeScale: function () { + + return this._effectiveTimeScale; + + }, + + setDuration: function ( duration ) { + + this.timeScale = this._clip.duration / duration; + + return this.stopWarping(); + + }, + + syncWith: function ( action ) { + + this.time = action.time; + this.timeScale = action.timeScale; + + return this.stopWarping(); + + }, + + halt: function ( duration ) { + + return this.warp( this._effectiveTimeScale, 0, duration ); + + }, + + warp: function ( startTimeScale, endTimeScale, duration ) { + + var mixer = this._mixer, now = mixer.time, + interpolant = this._timeScaleInterpolant, + + timeScale = this.timeScale; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(); + this._timeScaleInterpolant = interpolant; + + } + + var times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; + times[ 1 ] = now + duration; + + values[ 0 ] = startTimeScale / timeScale; + values[ 1 ] = endTimeScale / timeScale; + + return this; + + }, + + stopWarping: function () { + + var timeScaleInterpolant = this._timeScaleInterpolant; + + if ( timeScaleInterpolant !== null ) { + + this._timeScaleInterpolant = null; + this._mixer._takeBackControlInterpolant( timeScaleInterpolant ); + + } + + return this; + + }, + + // Object Accessors + + getMixer: function () { + + return this._mixer; + + }, + + getClip: function () { + + return this._clip; + + }, + + getRoot: function () { + + return this._localRoot || this._mixer._root; + + }, + + // Interna + + _update: function ( time, deltaTime, timeDirection, accuIndex ) { + + // called by the mixer + + if ( ! this.enabled ) { + + // call ._updateWeight() to update ._effectiveWeight + + this._updateWeight( time ); + return; + + } + + var startTime = this._startTime; + + if ( startTime !== null ) { + + // check for scheduled start of action + + var timeRunning = ( time - startTime ) * timeDirection; + if ( timeRunning < 0 || timeDirection === 0 ) { + + return; // yet to come / don't decide when delta = 0 + + } + + // start + + this._startTime = null; // unschedule + deltaTime = timeDirection * timeRunning; + + } + + // apply time scale and advance time + + deltaTime *= this._updateTimeScale( time ); + var clipTime = this._updateTime( deltaTime ); + + // note: _updateTime may disable the action resulting in + // an effective weight of 0 + + var weight = this._updateWeight( time ); + + if ( weight > 0 ) { + + var interpolants = this._interpolants; + var propertyMixers = this._propertyBindings; + + for ( var j = 0, m = interpolants.length; j !== m; ++ j ) { + + interpolants[ j ].evaluate( clipTime ); + propertyMixers[ j ].accumulate( accuIndex, weight ); + + } + + } + + }, + + _updateWeight: function ( time ) { + + var weight = 0; + + if ( this.enabled ) { + + weight = this.weight; + var interpolant = this._weightInterpolant; + + if ( interpolant !== null ) { + + var interpolantValue = interpolant.evaluate( time )[ 0 ]; + + weight *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopFading(); + + if ( interpolantValue === 0 ) { + + // faded out, disable + this.enabled = false; + + } + + } + + } + + } + + this._effectiveWeight = weight; + return weight; + + }, + + _updateTimeScale: function ( time ) { + + var timeScale = 0; + + if ( ! this.paused ) { + + timeScale = this.timeScale; + + var interpolant = this._timeScaleInterpolant; + + if ( interpolant !== null ) { + + var interpolantValue = interpolant.evaluate( time )[ 0 ]; + + timeScale *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopWarping(); + + if ( timeScale === 0 ) { + + // motion has halted, pause + this.paused = true; + + } else { + + // warp done - apply final time scale + this.timeScale = timeScale; + + } + + } + + } + + } + + this._effectiveTimeScale = timeScale; + return timeScale; + + }, + + _updateTime: function ( deltaTime ) { + + var time = this.time + deltaTime; + var duration = this._clip.duration; + var loop = this.loop; + var loopCount = this._loopCount; + + var pingPong = ( loop === LoopPingPong ); + + if ( deltaTime === 0 ) { + + if ( loopCount === - 1 ) return time; + + return ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time; + + } + + if ( loop === LoopOnce ) { + + if ( loopCount === - 1 ) { + + // just started + + this._loopCount = 0; + this._setEndings( true, true, false ); + + } + + handle_stop: { + + if ( time >= duration ) { + + time = duration; + + } else if ( time < 0 ) { + + time = 0; + + } else break handle_stop; + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime < 0 ? - 1 : 1 + } ); + + } + + } else { // repetitive Repeat or PingPong + + if ( loopCount === - 1 ) { + + // just started + + if ( deltaTime >= 0 ) { + + loopCount = 0; + + this._setEndings( true, this.repetitions === 0, pingPong ); + + } else { + + // when looping in reverse direction, the initial + // transition through zero counts as a repetition, + // so leave loopCount at -1 + + this._setEndings( this.repetitions === 0, true, pingPong ); + + } + + } + + if ( time >= duration || time < 0 ) { + + // wrap around + + var loopDelta = Math.floor( time / duration ); // signed + time -= duration * loopDelta; + + loopCount += Math.abs( loopDelta ); + + var pending = this.repetitions - loopCount; + + if ( pending <= 0 ) { + + // have to stop (switch state, clamp time, fire event) + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + time = deltaTime > 0 ? duration : 0; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime > 0 ? 1 : - 1 + } ); + + } else { + + // keep running + + if ( pending === 1 ) { + + // entering the last round + + var atStart = deltaTime < 0; + this._setEndings( atStart, ! atStart, pingPong ); + + } else { + + this._setEndings( false, false, pingPong ); + + } + + this._loopCount = loopCount; + + this._mixer.dispatchEvent( { + type: 'loop', action: this, loopDelta: loopDelta + } ); + + } + + } + + if ( pingPong && ( loopCount & 1 ) === 1 ) { + + // invert time for the "pong round" + + this.time = time; + return duration - time; + + } + + } + + this.time = time; + return time; + + }, + + _setEndings: function ( atStart, atEnd, pingPong ) { + + var settings = this._interpolantSettings; + + if ( pingPong ) { + + settings.endingStart = ZeroSlopeEnding; + settings.endingEnd = ZeroSlopeEnding; + + } else { + + // assuming for LoopOnce atStart == atEnd == true + + if ( atStart ) { + + settings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingStart = WrapAroundEnding; + + } + + if ( atEnd ) { + + settings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingEnd = WrapAroundEnding; + + } + + } + + }, + + _scheduleFading: function ( duration, weightNow, weightThen ) { + + var mixer = this._mixer, now = mixer.time, + interpolant = this._weightInterpolant; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(); + this._weightInterpolant = interpolant; + + } + + var times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; values[ 0 ] = weightNow; + times[ 1 ] = now + duration; values[ 1 ] = weightThen; + + return this; + + } + +} ); + + +export { AnimationAction }; diff --git a/lib/animation/AnimationClip.js b/lib/animation/AnimationClip.js new file mode 100644 index 0000000..810bc4b --- /dev/null +++ b/lib/animation/AnimationClip.js @@ -0,0 +1,453 @@ +import { AnimationUtils } from './AnimationUtils.js'; +import { KeyframeTrack } from './KeyframeTrack.js'; +import { BooleanKeyframeTrack } from './tracks/BooleanKeyframeTrack.js'; +import { ColorKeyframeTrack } from './tracks/ColorKeyframeTrack.js'; +import { NumberKeyframeTrack } from './tracks/NumberKeyframeTrack.js'; +import { QuaternionKeyframeTrack } from './tracks/QuaternionKeyframeTrack.js'; +import { StringKeyframeTrack } from './tracks/StringKeyframeTrack.js'; +import { VectorKeyframeTrack } from './tracks/VectorKeyframeTrack.js'; +import { _Math } from '../math/Math.js'; + +/** + * + * Reusable set of Tracks that represent an animation. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + +function AnimationClip( name, duration, tracks ) { + + this.name = name; + this.tracks = tracks; + this.duration = ( duration !== undefined ) ? duration : - 1; + + this.uuid = _Math.generateUUID(); + + // this means it should figure out its duration by scanning the tracks + if ( this.duration < 0 ) { + + this.resetDuration(); + + } + +} + +function getTrackTypeForValueTypeName( typeName ) { + + switch ( typeName.toLowerCase() ) { + + case 'scalar': + case 'double': + case 'float': + case 'number': + case 'integer': + + return NumberKeyframeTrack; + + case 'vector': + case 'vector2': + case 'vector3': + case 'vector4': + + return VectorKeyframeTrack; + + case 'color': + + return ColorKeyframeTrack; + + case 'quaternion': + + return QuaternionKeyframeTrack; + + case 'bool': + case 'boolean': + + return BooleanKeyframeTrack; + + case 'string': + + return StringKeyframeTrack; + + } + + throw new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName ); + +} + +function parseKeyframeTrack( json ) { + + if ( json.type === undefined ) { + + throw new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' ); + + } + + var trackType = getTrackTypeForValueTypeName( json.type ); + + if ( json.times === undefined ) { + + var times = [], values = []; + + AnimationUtils.flattenJSON( json.keys, times, values, 'value' ); + + json.times = times; + json.values = values; + + } + + // derived classes can define a static parse method + if ( trackType.parse !== undefined ) { + + return trackType.parse( json ); + + } else { + + // by default, we assume a constructor compatible with the base + return new trackType( json.name, json.times, json.values, json.interpolation ); + + } + +} + +Object.assign( AnimationClip, { + + parse: function ( json ) { + + var tracks = [], + jsonTracks = json.tracks, + frameTime = 1.0 / ( json.fps || 1.0 ); + + for ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) { + + tracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) ); + + } + + return new AnimationClip( json.name, json.duration, tracks ); + + }, + + toJSON: function ( clip ) { + + var tracks = [], + clipTracks = clip.tracks; + + var json = { + + 'name': clip.name, + 'duration': clip.duration, + 'tracks': tracks, + 'uuid': clip.uuid + + }; + + for ( var i = 0, n = clipTracks.length; i !== n; ++ i ) { + + tracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) ); + + } + + return json; + + }, + + CreateFromMorphTargetSequence: function ( name, morphTargetSequence, fps, noLoop ) { + + var numMorphTargets = morphTargetSequence.length; + var tracks = []; + + for ( var i = 0; i < numMorphTargets; i ++ ) { + + var times = []; + var values = []; + + times.push( + ( i + numMorphTargets - 1 ) % numMorphTargets, + i, + ( i + 1 ) % numMorphTargets ); + + values.push( 0, 1, 0 ); + + var order = AnimationUtils.getKeyframeOrder( times ); + times = AnimationUtils.sortedArray( times, 1, order ); + values = AnimationUtils.sortedArray( values, 1, order ); + + // if there is a key at the first frame, duplicate it as the + // last frame as well for perfect loop. + if ( ! noLoop && times[ 0 ] === 0 ) { + + times.push( numMorphTargets ); + values.push( values[ 0 ] ); + + } + + tracks.push( + new NumberKeyframeTrack( + '.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']', + times, values + ).scale( 1.0 / fps ) ); + + } + + return new AnimationClip( name, - 1, tracks ); + + }, + + findByName: function ( objectOrClipArray, name ) { + + var clipArray = objectOrClipArray; + + if ( ! Array.isArray( objectOrClipArray ) ) { + + var o = objectOrClipArray; + clipArray = o.geometry && o.geometry.animations || o.animations; + + } + + for ( var i = 0; i < clipArray.length; i ++ ) { + + if ( clipArray[ i ].name === name ) { + + return clipArray[ i ]; + + } + + } + + return null; + + }, + + CreateClipsFromMorphTargetSequences: function ( morphTargets, fps, noLoop ) { + + var animationToMorphTargets = {}; + + // tested with https://regex101.com/ on trick sequences + // such flamingo_flyA_003, flamingo_run1_003, crdeath0059 + var pattern = /^([\w-]*?)([\d]+)$/; + + // sort morph target names into animation groups based + // patterns like Walk_001, Walk_002, Run_001, Run_002 + for ( var i = 0, il = morphTargets.length; i < il; i ++ ) { + + var morphTarget = morphTargets[ i ]; + var parts = morphTarget.name.match( pattern ); + + if ( parts && parts.length > 1 ) { + + var name = parts[ 1 ]; + + var animationMorphTargets = animationToMorphTargets[ name ]; + if ( ! animationMorphTargets ) { + + animationToMorphTargets[ name ] = animationMorphTargets = []; + + } + + animationMorphTargets.push( morphTarget ); + + } + + } + + var clips = []; + + for ( var name in animationToMorphTargets ) { + + clips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) ); + + } + + return clips; + + }, + + // parse the animation.hierarchy format + parseAnimation: function ( animation, bones ) { + + if ( ! animation ) { + + console.error( 'THREE.AnimationClip: No animation in JSONLoader data.' ); + return null; + + } + + var addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) { + + // only return track if there are actually keys. + if ( animationKeys.length !== 0 ) { + + var times = []; + var values = []; + + AnimationUtils.flattenJSON( animationKeys, times, values, propertyName ); + + // empty keys are filtered out, so check again + if ( times.length !== 0 ) { + + destTracks.push( new trackType( trackName, times, values ) ); + + } + + } + + }; + + var tracks = []; + + var clipName = animation.name || 'default'; + // automatic length determination in AnimationClip. + var duration = animation.length || - 1; + var fps = animation.fps || 30; + + var hierarchyTracks = animation.hierarchy || []; + + for ( var h = 0; h < hierarchyTracks.length; h ++ ) { + + var animationKeys = hierarchyTracks[ h ].keys; + + // skip empty tracks + if ( ! animationKeys || animationKeys.length === 0 ) continue; + + // process morph targets + if ( animationKeys[ 0 ].morphTargets ) { + + // figure out all morph targets used in this track + var morphTargetNames = {}; + + for ( var k = 0; k < animationKeys.length; k ++ ) { + + if ( animationKeys[ k ].morphTargets ) { + + for ( var m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) { + + morphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1; + + } + + } + + } + + // create a track for each morph target with all zero + // morphTargetInfluences except for the keys in which + // the morphTarget is named. + for ( var morphTargetName in morphTargetNames ) { + + var times = []; + var values = []; + + for ( var m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) { + + var animationKey = animationKeys[ k ]; + + times.push( animationKey.time ); + values.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 ); + + } + + tracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) ); + + } + + duration = morphTargetNames.length * ( fps || 1.0 ); + + } else { + + // ...assume skeletal animation + + var boneName = '.bones[' + bones[ h ].name + ']'; + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.position', + animationKeys, 'pos', tracks ); + + addNonemptyTrack( + QuaternionKeyframeTrack, boneName + '.quaternion', + animationKeys, 'rot', tracks ); + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.scale', + animationKeys, 'scl', tracks ); + + } + + } + + if ( tracks.length === 0 ) { + + return null; + + } + + var clip = new AnimationClip( clipName, duration, tracks ); + + return clip; + + } + +} ); + +Object.assign( AnimationClip.prototype, { + + resetDuration: function () { + + var tracks = this.tracks, duration = 0; + + for ( var i = 0, n = tracks.length; i !== n; ++ i ) { + + var track = this.tracks[ i ]; + + duration = Math.max( duration, track.times[ track.times.length - 1 ] ); + + } + + this.duration = duration; + + return this; + + }, + + trim: function () { + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].trim( 0, this.duration ); + + } + + return this; + + }, + + validate: function () { + + var valid = true; + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + valid = valid && this.tracks[ i ].validate(); + + } + + return valid; + + }, + + optimize: function () { + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].optimize(); + + } + + return this; + + } + +} ); + + +export { AnimationClip }; diff --git a/lib/animation/AnimationMixer.js b/lib/animation/AnimationMixer.js new file mode 100644 index 0000000..76d03ac --- /dev/null +++ b/lib/animation/AnimationMixer.js @@ -0,0 +1,761 @@ +import { AnimationAction } from './AnimationAction.js'; +import { EventDispatcher } from '../core/EventDispatcher.js'; +import { LinearInterpolant } from '../math/interpolants/LinearInterpolant.js'; +import { PropertyBinding } from './PropertyBinding.js'; +import { PropertyMixer } from './PropertyMixer.js'; +import { AnimationClip } from './AnimationClip.js'; + +/** + * + * Player for AnimationClips. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + +function AnimationMixer( root ) { + + this._root = root; + this._initMemoryManager(); + this._accuIndex = 0; + + this.time = 0; + + this.timeScale = 1.0; + +} + +AnimationMixer.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: AnimationMixer, + + _bindAction: function ( action, prototypeAction ) { + + var root = action._localRoot || this._root, + tracks = action._clip.tracks, + nTracks = tracks.length, + bindings = action._propertyBindings, + interpolants = action._interpolants, + rootUuid = root.uuid, + bindingsByRoot = this._bindingsByRootAndName, + bindingsByName = bindingsByRoot[ rootUuid ]; + + if ( bindingsByName === undefined ) { + + bindingsByName = {}; + bindingsByRoot[ rootUuid ] = bindingsByName; + + } + + for ( var i = 0; i !== nTracks; ++ i ) { + + var track = tracks[ i ], + trackName = track.name, + binding = bindingsByName[ trackName ]; + + if ( binding !== undefined ) { + + bindings[ i ] = binding; + + } else { + + binding = bindings[ i ]; + + if ( binding !== undefined ) { + + // existing binding, make sure the cache knows + + if ( binding._cacheIndex === null ) { + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + } + + continue; + + } + + var path = prototypeAction && prototypeAction. + _propertyBindings[ i ].binding.parsedPath; + + binding = new PropertyMixer( + PropertyBinding.create( root, trackName, path ), + track.ValueTypeName, track.getValueSize() ); + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + bindings[ i ] = binding; + + } + + interpolants[ i ].resultBuffer = binding.buffer; + + } + + }, + + _activateAction: function ( action ) { + + if ( ! this._isActiveAction( action ) ) { + + if ( action._cacheIndex === null ) { + + // this action has been forgotten by the cache, but the user + // appears to be still using it -> rebind + + var rootUuid = ( action._localRoot || this._root ).uuid, + clipUuid = action._clip.uuid, + actionsForClip = this._actionsByClip[ clipUuid ]; + + this._bindAction( action, + actionsForClip && actionsForClip.knownActions[ 0 ] ); + + this._addInactiveAction( action, clipUuid, rootUuid ); + + } + + var bindings = action._propertyBindings; + + // increment reference counts / sort out state + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( binding.useCount ++ === 0 ) { + + this._lendBinding( binding ); + binding.saveOriginalState(); + + } + + } + + this._lendAction( action ); + + } + + }, + + _deactivateAction: function ( action ) { + + if ( this._isActiveAction( action ) ) { + + var bindings = action._propertyBindings; + + // decrement reference counts / sort out state + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( -- binding.useCount === 0 ) { + + binding.restoreOriginalState(); + this._takeBackBinding( binding ); + + } + + } + + this._takeBackAction( action ); + + } + + }, + + // Memory manager + + _initMemoryManager: function () { + + this._actions = []; // 'nActiveActions' followed by inactive ones + this._nActiveActions = 0; + + this._actionsByClip = {}; + // inside: + // { + // knownActions: Array< AnimationAction > - used as prototypes + // actionByRoot: AnimationAction - lookup + // } + + + this._bindings = []; // 'nActiveBindings' followed by inactive ones + this._nActiveBindings = 0; + + this._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer > + + + this._controlInterpolants = []; // same game as above + this._nActiveControlInterpolants = 0; + + var scope = this; + + this.stats = { + + actions: { + get total() { + + return scope._actions.length; + + }, + get inUse() { + + return scope._nActiveActions; + + } + }, + bindings: { + get total() { + + return scope._bindings.length; + + }, + get inUse() { + + return scope._nActiveBindings; + + } + }, + controlInterpolants: { + get total() { + + return scope._controlInterpolants.length; + + }, + get inUse() { + + return scope._nActiveControlInterpolants; + + } + } + + }; + + }, + + // Memory management for AnimationAction objects + + _isActiveAction: function ( action ) { + + var index = action._cacheIndex; + return index !== null && index < this._nActiveActions; + + }, + + _addInactiveAction: function ( action, clipUuid, rootUuid ) { + + var actions = this._actions, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip === undefined ) { + + actionsForClip = { + + knownActions: [ action ], + actionByRoot: {} + + }; + + action._byClipCacheIndex = 0; + + actionsByClip[ clipUuid ] = actionsForClip; + + } else { + + var knownActions = actionsForClip.knownActions; + + action._byClipCacheIndex = knownActions.length; + knownActions.push( action ); + + } + + action._cacheIndex = actions.length; + actions.push( action ); + + actionsForClip.actionByRoot[ rootUuid ] = action; + + }, + + _removeInactiveAction: function ( action ) { + + var actions = this._actions, + lastInactiveAction = actions[ actions.length - 1 ], + cacheIndex = action._cacheIndex; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + action._cacheIndex = null; + + + var clipUuid = action._clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ], + knownActionsForClip = actionsForClip.knownActions, + + lastKnownAction = + knownActionsForClip[ knownActionsForClip.length - 1 ], + + byClipCacheIndex = action._byClipCacheIndex; + + lastKnownAction._byClipCacheIndex = byClipCacheIndex; + knownActionsForClip[ byClipCacheIndex ] = lastKnownAction; + knownActionsForClip.pop(); + + action._byClipCacheIndex = null; + + + var actionByRoot = actionsForClip.actionByRoot, + rootUuid = ( action._localRoot || this._root ).uuid; + + delete actionByRoot[ rootUuid ]; + + if ( knownActionsForClip.length === 0 ) { + + delete actionsByClip[ clipUuid ]; + + } + + this._removeInactiveBindingsForAction( action ); + + }, + + _removeInactiveBindingsForAction: function ( action ) { + + var bindings = action._propertyBindings; + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( -- binding.referenceCount === 0 ) { + + this._removeInactiveBinding( binding ); + + } + + } + + }, + + _lendAction: function ( action ) { + + // [ active actions | inactive actions ] + // [ active actions >| inactive actions ] + // s a + // <-swap-> + // a s + + var actions = this._actions, + prevIndex = action._cacheIndex, + + lastActiveIndex = this._nActiveActions ++, + + firstInactiveAction = actions[ lastActiveIndex ]; + + action._cacheIndex = lastActiveIndex; + actions[ lastActiveIndex ] = action; + + firstInactiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = firstInactiveAction; + + }, + + _takeBackAction: function ( action ) { + + // [ active actions | inactive actions ] + // [ active actions |< inactive actions ] + // a s + // <-swap-> + // s a + + var actions = this._actions, + prevIndex = action._cacheIndex, + + firstInactiveIndex = -- this._nActiveActions, + + lastActiveAction = actions[ firstInactiveIndex ]; + + action._cacheIndex = firstInactiveIndex; + actions[ firstInactiveIndex ] = action; + + lastActiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = lastActiveAction; + + }, + + // Memory management for PropertyMixer objects + + _addInactiveBinding: function ( binding, rootUuid, trackName ) { + + var bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ], + + bindings = this._bindings; + + if ( bindingByName === undefined ) { + + bindingByName = {}; + bindingsByRoot[ rootUuid ] = bindingByName; + + } + + bindingByName[ trackName ] = binding; + + binding._cacheIndex = bindings.length; + bindings.push( binding ); + + }, + + _removeInactiveBinding: function ( binding ) { + + var bindings = this._bindings, + propBinding = binding.binding, + rootUuid = propBinding.rootNode.uuid, + trackName = propBinding.path, + bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ], + + lastInactiveBinding = bindings[ bindings.length - 1 ], + cacheIndex = binding._cacheIndex; + + lastInactiveBinding._cacheIndex = cacheIndex; + bindings[ cacheIndex ] = lastInactiveBinding; + bindings.pop(); + + delete bindingByName[ trackName ]; + + remove_empty_map: { + + for ( var _ in bindingByName ) break remove_empty_map; // eslint-disable-line no-unused-vars + + delete bindingsByRoot[ rootUuid ]; + + } + + }, + + _lendBinding: function ( binding ) { + + var bindings = this._bindings, + prevIndex = binding._cacheIndex, + + lastActiveIndex = this._nActiveBindings ++, + + firstInactiveBinding = bindings[ lastActiveIndex ]; + + binding._cacheIndex = lastActiveIndex; + bindings[ lastActiveIndex ] = binding; + + firstInactiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = firstInactiveBinding; + + }, + + _takeBackBinding: function ( binding ) { + + var bindings = this._bindings, + prevIndex = binding._cacheIndex, + + firstInactiveIndex = -- this._nActiveBindings, + + lastActiveBinding = bindings[ firstInactiveIndex ]; + + binding._cacheIndex = firstInactiveIndex; + bindings[ firstInactiveIndex ] = binding; + + lastActiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = lastActiveBinding; + + }, + + + // Memory management of Interpolants for weight and time scale + + _lendControlInterpolant: function () { + + var interpolants = this._controlInterpolants, + lastActiveIndex = this._nActiveControlInterpolants ++, + interpolant = interpolants[ lastActiveIndex ]; + + if ( interpolant === undefined ) { + + interpolant = new LinearInterpolant( + new Float32Array( 2 ), new Float32Array( 2 ), + 1, this._controlInterpolantsResultBuffer ); + + interpolant.__cacheIndex = lastActiveIndex; + interpolants[ lastActiveIndex ] = interpolant; + + } + + return interpolant; + + }, + + _takeBackControlInterpolant: function ( interpolant ) { + + var interpolants = this._controlInterpolants, + prevIndex = interpolant.__cacheIndex, + + firstInactiveIndex = -- this._nActiveControlInterpolants, + + lastActiveInterpolant = interpolants[ firstInactiveIndex ]; + + interpolant.__cacheIndex = firstInactiveIndex; + interpolants[ firstInactiveIndex ] = interpolant; + + lastActiveInterpolant.__cacheIndex = prevIndex; + interpolants[ prevIndex ] = lastActiveInterpolant; + + }, + + _controlInterpolantsResultBuffer: new Float32Array( 1 ), + + // return an action for a clip optionally using a custom root target + // object (this method allocates a lot of dynamic memory in case a + // previously unknown clip/root combination is specified) + clipAction: function ( clip, optionalRoot ) { + + var root = optionalRoot || this._root, + rootUuid = root.uuid, + + clipObject = typeof clip === 'string' ? + AnimationClip.findByName( root, clip ) : clip, + + clipUuid = clipObject !== null ? clipObject.uuid : clip, + + actionsForClip = this._actionsByClip[ clipUuid ], + prototypeAction = null; + + if ( actionsForClip !== undefined ) { + + var existingAction = + actionsForClip.actionByRoot[ rootUuid ]; + + if ( existingAction !== undefined ) { + + return existingAction; + + } + + // we know the clip, so we don't have to parse all + // the bindings again but can just copy + prototypeAction = actionsForClip.knownActions[ 0 ]; + + // also, take the clip from the prototype action + if ( clipObject === null ) + clipObject = prototypeAction._clip; + + } + + // clip must be known when specified via string + if ( clipObject === null ) return null; + + // allocate all resources required to run it + var newAction = new AnimationAction( this, clipObject, optionalRoot ); + + this._bindAction( newAction, prototypeAction ); + + // and make the action known to the memory manager + this._addInactiveAction( newAction, clipUuid, rootUuid ); + + return newAction; + + }, + + // get an existing action + existingAction: function ( clip, optionalRoot ) { + + var root = optionalRoot || this._root, + rootUuid = root.uuid, + + clipObject = typeof clip === 'string' ? + AnimationClip.findByName( root, clip ) : clip, + + clipUuid = clipObject ? clipObject.uuid : clip, + + actionsForClip = this._actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + return actionsForClip.actionByRoot[ rootUuid ] || null; + + } + + return null; + + }, + + // deactivates all previously scheduled actions + stopAllAction: function () { + + var actions = this._actions, + nActions = this._nActiveActions, + bindings = this._bindings, + nBindings = this._nActiveBindings; + + this._nActiveActions = 0; + this._nActiveBindings = 0; + + for ( var i = 0; i !== nActions; ++ i ) { + + actions[ i ].reset(); + + } + + for ( var i = 0; i !== nBindings; ++ i ) { + + bindings[ i ].useCount = 0; + + } + + return this; + + }, + + // advance the time and update apply the animation + update: function ( deltaTime ) { + + deltaTime *= this.timeScale; + + var actions = this._actions, + nActions = this._nActiveActions, + + time = this.time += deltaTime, + timeDirection = Math.sign( deltaTime ), + + accuIndex = this._accuIndex ^= 1; + + // run active actions + + for ( var i = 0; i !== nActions; ++ i ) { + + var action = actions[ i ]; + + action._update( time, deltaTime, timeDirection, accuIndex ); + + } + + // update scene graph + + var bindings = this._bindings, + nBindings = this._nActiveBindings; + + for ( var i = 0; i !== nBindings; ++ i ) { + + bindings[ i ].apply( accuIndex ); + + } + + return this; + + }, + + // return this mixer's root target object + getRoot: function () { + + return this._root; + + }, + + // free all resources specific to a particular clip + uncacheClip: function ( clip ) { + + var actions = this._actions, + clipUuid = clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + // note: just calling _removeInactiveAction would mess up the + // iteration state and also require updating the state we can + // just throw away + + var actionsToRemove = actionsForClip.knownActions; + + for ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) { + + var action = actionsToRemove[ i ]; + + this._deactivateAction( action ); + + var cacheIndex = action._cacheIndex, + lastInactiveAction = actions[ actions.length - 1 ]; + + action._cacheIndex = null; + action._byClipCacheIndex = null; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + this._removeInactiveBindingsForAction( action ); + + } + + delete actionsByClip[ clipUuid ]; + + } + + }, + + // free all resources specific to a particular root target object + uncacheRoot: function ( root ) { + + var rootUuid = root.uuid, + actionsByClip = this._actionsByClip; + + for ( var clipUuid in actionsByClip ) { + + var actionByRoot = actionsByClip[ clipUuid ].actionByRoot, + action = actionByRoot[ rootUuid ]; + + if ( action !== undefined ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + + var bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ]; + + if ( bindingByName !== undefined ) { + + for ( var trackName in bindingByName ) { + + var binding = bindingByName[ trackName ]; + binding.restoreOriginalState(); + this._removeInactiveBinding( binding ); + + } + + } + + }, + + // remove a targeted clip from the cache + uncacheAction: function ( clip, optionalRoot ) { + + var action = this.existingAction( clip, optionalRoot ); + + if ( action !== null ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + +} ); + + +export { AnimationMixer }; diff --git a/lib/animation/AnimationObjectGroup.js b/lib/animation/AnimationObjectGroup.js new file mode 100644 index 0000000..5ede859 --- /dev/null +++ b/lib/animation/AnimationObjectGroup.js @@ -0,0 +1,381 @@ +import { PropertyBinding } from './PropertyBinding.js'; +import { _Math } from '../math/Math.js'; + +/** + * + * A group of objects that receives a shared animation state. + * + * Usage: + * + * - Add objects you would otherwise pass as 'root' to the + * constructor or the .clipAction method of AnimationMixer. + * + * - Instead pass this object as 'root'. + * + * - You can also add and remove objects later when the mixer + * is running. + * + * Note: + * + * Objects of this class appear as one object to the mixer, + * so cache control of the individual objects must be done + * on the group. + * + * Limitation: + * + * - The animated properties must be compatible among the + * all objects in the group. + * + * - A single property can either be controlled through a + * target group or directly, but not both. + * + * @author tschw + */ + +function AnimationObjectGroup() { + + this.uuid = _Math.generateUUID(); + + // cached objects followed by the active ones + this._objects = Array.prototype.slice.call( arguments ); + + this.nCachedObjects_ = 0; // threshold + // note: read by PropertyBinding.Composite + + var indices = {}; + this._indicesByUUID = indices; // for bookkeeping + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + indices[ arguments[ i ].uuid ] = i; + + } + + this._paths = []; // inside: string + this._parsedPaths = []; // inside: { we don't care, here } + this._bindings = []; // inside: Array< PropertyBinding > + this._bindingsIndicesByPath = {}; // inside: indices in these arrays + + var scope = this; + + this.stats = { + + objects: { + get total() { + + return scope._objects.length; + + }, + get inUse() { + + return this.total - scope.nCachedObjects_; + + } + }, + get bindingsPerObject() { + + return scope._bindings.length; + + } + + }; + +} + +Object.assign( AnimationObjectGroup.prototype, { + + isAnimationObjectGroup: true, + + add: function () { + + var objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + nBindings = bindings.length, + knownObject = undefined; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index === undefined ) { + + // unknown object -> add it to the ACTIVE region + + index = nObjects ++; + indicesByUUID[ uuid ] = index; + objects.push( object ); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + bindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) ); + + } + + } else if ( index < nCachedObjects ) { + + knownObject = objects[ index ]; + + // move existing object to the ACTIVE region + + var firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ]; + + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + indicesByUUID[ uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ], + binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = lastCached; + + if ( binding === undefined ) { + + // since we do not bother to create new bindings + // for objects that are cached, the binding may + // or may not exist + + binding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ); + + } + + bindingsForPath[ firstActiveIndex ] = binding; + + } + + } else if ( objects[ index ] !== knownObject ) { + + console.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID ' + + 'detected. Clean the caches or recreate your infrastructure when reloading scenes.' ); + + } // else the object is already where we want it to be + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + remove: function () { + + var objects = this._objects, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined && index >= nCachedObjects ) { + + // move existing object into the CACHED region + + var lastCachedIndex = nCachedObjects ++, + firstActiveObject = objects[ lastCachedIndex ]; + + indicesByUUID[ firstActiveObject.uuid ] = index; + objects[ index ] = firstActiveObject; + + indicesByUUID[ uuid ] = lastCachedIndex; + objects[ lastCachedIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + firstActive = bindingsForPath[ lastCachedIndex ], + binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = firstActive; + bindingsForPath[ lastCachedIndex ] = binding; + + } + + } + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + // remove & forget + uncache: function () { + + var objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined ) { + + delete indicesByUUID[ uuid ]; + + if ( index < nCachedObjects ) { + + // object is cached, shrink the CACHED region + + var firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ], + lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + // last cached object takes this object's place + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + // last object goes to the activated slot and pop + indicesByUUID[ lastObject.uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ], + last = bindingsForPath[ lastIndex ]; + + bindingsForPath[ index ] = lastCached; + bindingsForPath[ firstActiveIndex ] = last; + bindingsForPath.pop(); + + } + + } else { + + // object is active, just swap with the last and pop + + var lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + indicesByUUID[ lastObject.uuid ] = index; + objects[ index ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ]; + + bindingsForPath[ index ] = bindingsForPath[ lastIndex ]; + bindingsForPath.pop(); + + } + + } // cached or active + + } // if object is known + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + // Internal interface used by befriended PropertyBinding.Composite: + + subscribe_: function ( path, parsedPath ) { + + // returns an array of bindings for the given path that is changed + // according to the contained objects in the group + + var indicesByPath = this._bindingsIndicesByPath, + index = indicesByPath[ path ], + bindings = this._bindings; + + if ( index !== undefined ) return bindings[ index ]; + + var paths = this._paths, + parsedPaths = this._parsedPaths, + objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + bindingsForPath = new Array( nObjects ); + + index = bindings.length; + + indicesByPath[ path ] = index; + + paths.push( path ); + parsedPaths.push( parsedPath ); + bindings.push( bindingsForPath ); + + for ( var i = nCachedObjects, n = objects.length; i !== n; ++ i ) { + + var object = objects[ i ]; + bindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath ); + + } + + return bindingsForPath; + + }, + + unsubscribe_: function ( path ) { + + // tells the group to forget about a property path and no longer + // update the array previously obtained with 'subscribe_' + + var indicesByPath = this._bindingsIndicesByPath, + index = indicesByPath[ path ]; + + if ( index !== undefined ) { + + var paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + lastBindingsIndex = bindings.length - 1, + lastBindings = bindings[ lastBindingsIndex ], + lastBindingsPath = path[ lastBindingsIndex ]; + + indicesByPath[ lastBindingsPath ] = index; + + bindings[ index ] = lastBindings; + bindings.pop(); + + parsedPaths[ index ] = parsedPaths[ lastBindingsIndex ]; + parsedPaths.pop(); + + paths[ index ] = paths[ lastBindingsIndex ]; + paths.pop(); + + } + + } + +} ); + + +export { AnimationObjectGroup }; diff --git a/lib/animation/AnimationUtils.js b/lib/animation/AnimationUtils.js new file mode 100644 index 0000000..07b6892 --- /dev/null +++ b/lib/animation/AnimationUtils.js @@ -0,0 +1,166 @@ +/** + * @author tschw + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + +var AnimationUtils = { + + // same as Array.prototype.slice, but also works on typed arrays + arraySlice: function ( array, from, to ) { + + if ( AnimationUtils.isTypedArray( array ) ) { + + // in ios9 array.subarray(from, undefined) will return empty array + // but array.subarray(from) or array.subarray(from, len) is correct + return new array.constructor( array.subarray( from, to !== undefined ? to : array.length ) ); + + } + + return array.slice( from, to ); + + }, + + // converts an array to a specific type + convertArray: function ( array, type, forceClone ) { + + if ( ! array || // let 'undefined' and 'null' pass + ! forceClone && array.constructor === type ) return array; + + if ( typeof type.BYTES_PER_ELEMENT === 'number' ) { + + return new type( array ); // create typed array + + } + + return Array.prototype.slice.call( array ); // create Array + + }, + + isTypedArray: function ( object ) { + + return ArrayBuffer.isView( object ) && + ! ( object instanceof DataView ); + + }, + + // returns an array by which times and values can be sorted + getKeyframeOrder: function ( times ) { + + function compareTime( i, j ) { + + return times[ i ] - times[ j ]; + + } + + var n = times.length; + var result = new Array( n ); + for ( var i = 0; i !== n; ++ i ) result[ i ] = i; + + result.sort( compareTime ); + + return result; + + }, + + // uses the array previously returned by 'getKeyframeOrder' to sort data + sortedArray: function ( values, stride, order ) { + + var nValues = values.length; + var result = new values.constructor( nValues ); + + for ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) { + + var srcOffset = order[ i ] * stride; + + for ( var j = 0; j !== stride; ++ j ) { + + result[ dstOffset ++ ] = values[ srcOffset + j ]; + + } + + } + + return result; + + }, + + // function for parsing AOS keyframe formats + flattenJSON: function ( jsonKeys, times, values, valuePropertyName ) { + + var i = 1, key = jsonKeys[ 0 ]; + + while ( key !== undefined && key[ valuePropertyName ] === undefined ) { + + key = jsonKeys[ i ++ ]; + + } + + if ( key === undefined ) return; // no data + + var value = key[ valuePropertyName ]; + if ( value === undefined ) return; // no data + + if ( Array.isArray( value ) ) { + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push.apply( values, value ); // push all elements + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else if ( value.toArray !== undefined ) { + + // ...assume THREE.Math-ish + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + value.toArray( values, values.length ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else { + + // otherwise push as-is + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push( value ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } + + } + +}; + + +export { AnimationUtils }; diff --git a/lib/animation/KeyframeTrack.js b/lib/animation/KeyframeTrack.js new file mode 100644 index 0000000..06b4bde --- /dev/null +++ b/lib/animation/KeyframeTrack.js @@ -0,0 +1,454 @@ +import { + InterpolateLinear, + InterpolateSmooth, + InterpolateDiscrete +} from '../constants.js'; +import { CubicInterpolant } from '../math/interpolants/CubicInterpolant.js'; +import { LinearInterpolant } from '../math/interpolants/LinearInterpolant.js'; +import { DiscreteInterpolant } from '../math/interpolants/DiscreteInterpolant.js'; +import { AnimationUtils } from './AnimationUtils.js'; + +/** + * + * A timed sequence of keyframes for a specific property. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + +function KeyframeTrack( name, times, values, interpolation ) { + + if ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' ); + if ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name ); + + this.name = name; + + this.times = AnimationUtils.convertArray( times, this.TimeBufferType ); + this.values = AnimationUtils.convertArray( values, this.ValueBufferType ); + + this.setInterpolation( interpolation || this.DefaultInterpolation ); + +} + +// Static methods + +Object.assign( KeyframeTrack, { + + // Serialization (in static context, because of constructor invocation + // and automatic invocation of .toJSON): + + toJSON: function ( track ) { + + var trackType = track.constructor; + + var json; + + // derived classes can define a static toJSON method + if ( trackType.toJSON !== undefined ) { + + json = trackType.toJSON( track ); + + } else { + + // by default, we assume the data can be serialized as-is + json = { + + 'name': track.name, + 'times': AnimationUtils.convertArray( track.times, Array ), + 'values': AnimationUtils.convertArray( track.values, Array ) + + }; + + var interpolation = track.getInterpolation(); + + if ( interpolation !== track.DefaultInterpolation ) { + + json.interpolation = interpolation; + + } + + } + + json.type = track.ValueTypeName; // mandatory + + return json; + + } + +} ); + +Object.assign( KeyframeTrack.prototype, { + + constructor: KeyframeTrack, + + TimeBufferType: Float32Array, + + ValueBufferType: Float32Array, + + DefaultInterpolation: InterpolateLinear, + + InterpolantFactoryMethodDiscrete: function ( result ) { + + return new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodLinear: function ( result ) { + + return new LinearInterpolant( this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodSmooth: function ( result ) { + + return new CubicInterpolant( this.times, this.values, this.getValueSize(), result ); + + }, + + setInterpolation: function ( interpolation ) { + + var factoryMethod; + + switch ( interpolation ) { + + case InterpolateDiscrete: + + factoryMethod = this.InterpolantFactoryMethodDiscrete; + + break; + + case InterpolateLinear: + + factoryMethod = this.InterpolantFactoryMethodLinear; + + break; + + case InterpolateSmooth: + + factoryMethod = this.InterpolantFactoryMethodSmooth; + + break; + + } + + if ( factoryMethod === undefined ) { + + var message = "unsupported interpolation for " + + this.ValueTypeName + " keyframe track named " + this.name; + + if ( this.createInterpolant === undefined ) { + + // fall back to default, unless the default itself is messed up + if ( interpolation !== this.DefaultInterpolation ) { + + this.setInterpolation( this.DefaultInterpolation ); + + } else { + + throw new Error( message ); // fatal, in this case + + } + + } + + console.warn( 'THREE.KeyframeTrack:', message ); + return this; + + } + + this.createInterpolant = factoryMethod; + + return this; + + }, + + getInterpolation: function () { + + switch ( this.createInterpolant ) { + + case this.InterpolantFactoryMethodDiscrete: + + return InterpolateDiscrete; + + case this.InterpolantFactoryMethodLinear: + + return InterpolateLinear; + + case this.InterpolantFactoryMethodSmooth: + + return InterpolateSmooth; + + } + + }, + + getValueSize: function () { + + return this.values.length / this.times.length; + + }, + + // move all keyframes either forwards or backwards in time + shift: function ( timeOffset ) { + + if ( timeOffset !== 0.0 ) { + + var times = this.times; + + for ( var i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] += timeOffset; + + } + + } + + return this; + + }, + + // scale all keyframe times by a factor (useful for frame <-> seconds conversions) + scale: function ( timeScale ) { + + if ( timeScale !== 1.0 ) { + + var times = this.times; + + for ( var i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] *= timeScale; + + } + + } + + return this; + + }, + + // removes keyframes before and after animation without changing any values within the range [startTime, endTime]. + // IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values + trim: function ( startTime, endTime ) { + + var times = this.times, + nKeys = times.length, + from = 0, + to = nKeys - 1; + + while ( from !== nKeys && times[ from ] < startTime ) { + + ++ from; + + } + + while ( to !== - 1 && times[ to ] > endTime ) { + + -- to; + + } + + ++ to; // inclusive -> exclusive bound + + if ( from !== 0 || to !== nKeys ) { + + // empty tracks are forbidden, so keep at least one keyframe + if ( from >= to ) to = Math.max( to, 1 ), from = to - 1; + + var stride = this.getValueSize(); + this.times = AnimationUtils.arraySlice( times, from, to ); + this.values = AnimationUtils.arraySlice( this.values, from * stride, to * stride ); + + } + + return this; + + }, + + // ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable + validate: function () { + + var valid = true; + + var valueSize = this.getValueSize(); + if ( valueSize - Math.floor( valueSize ) !== 0 ) { + + console.error( 'THREE.KeyframeTrack: Invalid value size in track.', this ); + valid = false; + + } + + var times = this.times, + values = this.values, + + nKeys = times.length; + + if ( nKeys === 0 ) { + + console.error( 'THREE.KeyframeTrack: Track is empty.', this ); + valid = false; + + } + + var prevTime = null; + + for ( var i = 0; i !== nKeys; i ++ ) { + + var currTime = times[ i ]; + + if ( typeof currTime === 'number' && isNaN( currTime ) ) { + + console.error( 'THREE.KeyframeTrack: Time is not a valid number.', this, i, currTime ); + valid = false; + break; + + } + + if ( prevTime !== null && prevTime > currTime ) { + + console.error( 'THREE.KeyframeTrack: Out of order keys.', this, i, currTime, prevTime ); + valid = false; + break; + + } + + prevTime = currTime; + + } + + if ( values !== undefined ) { + + if ( AnimationUtils.isTypedArray( values ) ) { + + for ( var i = 0, n = values.length; i !== n; ++ i ) { + + var value = values[ i ]; + + if ( isNaN( value ) ) { + + console.error( 'THREE.KeyframeTrack: Value is not a valid number.', this, i, value ); + valid = false; + break; + + } + + } + + } + + } + + return valid; + + }, + + // removes equivalent sequential keys as common in morph target sequences + // (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0) + optimize: function () { + + var times = this.times, + values = this.values, + stride = this.getValueSize(), + + smoothInterpolation = this.getInterpolation() === InterpolateSmooth, + + writeIndex = 1, + lastIndex = times.length - 1; + + for ( var i = 1; i < lastIndex; ++ i ) { + + var keep = false; + + var time = times[ i ]; + var timeNext = times[ i + 1 ]; + + // remove adjacent keyframes scheduled at the same time + + if ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) { + + if ( ! smoothInterpolation ) { + + // remove unnecessary keyframes same as their neighbors + + var offset = i * stride, + offsetP = offset - stride, + offsetN = offset + stride; + + for ( var j = 0; j !== stride; ++ j ) { + + var value = values[ offset + j ]; + + if ( value !== values[ offsetP + j ] || + value !== values[ offsetN + j ] ) { + + keep = true; + break; + + } + + } + + } else { + + keep = true; + + } + + } + + // in-place compaction + + if ( keep ) { + + if ( i !== writeIndex ) { + + times[ writeIndex ] = times[ i ]; + + var readOffset = i * stride, + writeOffset = writeIndex * stride; + + for ( var j = 0; j !== stride; ++ j ) { + + values[ writeOffset + j ] = values[ readOffset + j ]; + + } + + } + + ++ writeIndex; + + } + + } + + // flush last keyframe (compaction looks ahead) + + if ( lastIndex > 0 ) { + + times[ writeIndex ] = times[ lastIndex ]; + + for ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) { + + values[ writeOffset + j ] = values[ readOffset + j ]; + + } + + ++ writeIndex; + + } + + if ( writeIndex !== times.length ) { + + this.times = AnimationUtils.arraySlice( times, 0, writeIndex ); + this.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride ); + + } + + return this; + + } + +} ); + +export { KeyframeTrack }; diff --git a/lib/animation/PropertyBinding.js b/lib/animation/PropertyBinding.js new file mode 100644 index 0000000..d9fe744 --- /dev/null +++ b/lib/animation/PropertyBinding.js @@ -0,0 +1,726 @@ +/** + * + * A reference to a real property in the scene graph. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + +// Characters [].:/ are reserved for track binding syntax. +var RESERVED_CHARS_RE = '\\[\\]\\.:\\/'; + +function Composite( targetGroup, path, optionalParsedPath ) { + + var parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path ); + + this._targetGroup = targetGroup; + this._bindings = targetGroup.subscribe_( path, parsedPath ); + +} + +Object.assign( Composite.prototype, { + + getValue: function ( array, offset ) { + + this.bind(); // bind all binding + + var firstValidIndex = this._targetGroup.nCachedObjects_, + binding = this._bindings[ firstValidIndex ]; + + // and only call .getValue on the first + if ( binding !== undefined ) binding.getValue( array, offset ); + + }, + + setValue: function ( array, offset ) { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].setValue( array, offset ); + + } + + }, + + bind: function () { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].bind(); + + } + + }, + + unbind: function () { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].unbind(); + + } + + } + +} ); + + +function PropertyBinding( rootNode, path, parsedPath ) { + + this.path = path; + this.parsedPath = parsedPath || PropertyBinding.parseTrackName( path ); + + this.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ) || rootNode; + + this.rootNode = rootNode; + +} + +Object.assign( PropertyBinding, { + + Composite: Composite, + + create: function ( root, path, parsedPath ) { + + if ( ! ( root && root.isAnimationObjectGroup ) ) { + + return new PropertyBinding( root, path, parsedPath ); + + } else { + + return new PropertyBinding.Composite( root, path, parsedPath ); + + } + + }, + + /** + * Replaces spaces with underscores and removes unsupported characters from + * node names, to ensure compatibility with parseTrackName(). + * + * @param {string} name Node name to be sanitized. + * @return {string} + */ + sanitizeNodeName: ( function () { + + var reservedRe = new RegExp( '[' + RESERVED_CHARS_RE + ']', 'g' ); + + return function sanitizeNodeName( name ) { + + return name.replace( /\s/g, '_' ).replace( reservedRe, '' ); + + }; + + }() ), + + parseTrackName: function () { + + // Attempts to allow node names from any language. ES5's `\w` regexp matches + // only latin characters, and the unicode \p{L} is not yet supported. So + // instead, we exclude reserved characters and match everything else. + var wordChar = '[^' + RESERVED_CHARS_RE + ']'; + var wordCharOrDot = '[^' + RESERVED_CHARS_RE.replace( '\\.', '' ) + ']'; + + // Parent directories, delimited by '/' or ':'. Currently unused, but must + // be matched to parse the rest of the track name. + var directoryRe = /((?:WC+[\/:])*)/.source.replace( 'WC', wordChar ); + + // Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'. + var nodeRe = /(WCOD+)?/.source.replace( 'WCOD', wordCharOrDot ); + + // Object on target node, and accessor. May not contain reserved + // characters. Accessor may contain any character except closing bracket. + var objectRe = /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace( 'WC', wordChar ); + + // Property and accessor. May not contain reserved characters. Accessor may + // contain any non-bracket characters. + var propertyRe = /\.(WC+)(?:\[(.+)\])?/.source.replace( 'WC', wordChar ); + + var trackRe = new RegExp( '' + + '^' + + directoryRe + + nodeRe + + objectRe + + propertyRe + + '$' + ); + + var supportedObjectNames = [ 'material', 'materials', 'bones' ]; + + return function parseTrackName( trackName ) { + + var matches = trackRe.exec( trackName ); + + if ( ! matches ) { + + throw new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName ); + + } + + var results = { + // directoryName: matches[ 1 ], // (tschw) currently unused + nodeName: matches[ 2 ], + objectName: matches[ 3 ], + objectIndex: matches[ 4 ], + propertyName: matches[ 5 ], // required + propertyIndex: matches[ 6 ] + }; + + var lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' ); + + if ( lastDot !== undefined && lastDot !== - 1 ) { + + var objectName = results.nodeName.substring( lastDot + 1 ); + + // Object names must be checked against a whitelist. Otherwise, there + // is no way to parse 'foo.bar.baz': 'baz' must be a property, but + // 'bar' could be the objectName, or part of a nodeName (which can + // include '.' characters). + if ( supportedObjectNames.indexOf( objectName ) !== - 1 ) { + + results.nodeName = results.nodeName.substring( 0, lastDot ); + results.objectName = objectName; + + } + + } + + if ( results.propertyName === null || results.propertyName.length === 0 ) { + + throw new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName ); + + } + + return results; + + }; + + }(), + + findNode: function ( root, nodeName ) { + + if ( ! nodeName || nodeName === "" || nodeName === "root" || nodeName === "." || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) { + + return root; + + } + + // search into skeleton bones. + if ( root.skeleton ) { + + var bone = root.skeleton.getBoneByName( nodeName ); + + if ( bone !== undefined ) { + + return bone; + + } + + } + + // search into node subtree. + if ( root.children ) { + + var searchNodeSubtree = function ( children ) { + + for ( var i = 0; i < children.length; i ++ ) { + + var childNode = children[ i ]; + + if ( childNode.name === nodeName || childNode.uuid === nodeName ) { + + return childNode; + + } + + var result = searchNodeSubtree( childNode.children ); + + if ( result ) return result; + + } + + return null; + + }; + + var subTreeNode = searchNodeSubtree( root.children ); + + if ( subTreeNode ) { + + return subTreeNode; + + } + + } + + return null; + + } + +} ); + +Object.assign( PropertyBinding.prototype, { // prototype, continued + + // these are used to "bind" a nonexistent property + _getValue_unavailable: function () {}, + _setValue_unavailable: function () {}, + + BindingType: { + Direct: 0, + EntireArray: 1, + ArrayElement: 2, + HasFromToArray: 3 + }, + + Versioning: { + None: 0, + NeedsUpdate: 1, + MatrixWorldNeedsUpdate: 2 + }, + + GetterByBindingType: [ + + function getValue_direct( buffer, offset ) { + + buffer[ offset ] = this.node[ this.propertyName ]; + + }, + + function getValue_array( buffer, offset ) { + + var source = this.resolvedProperty; + + for ( var i = 0, n = source.length; i !== n; ++ i ) { + + buffer[ offset ++ ] = source[ i ]; + + } + + }, + + function getValue_arrayElement( buffer, offset ) { + + buffer[ offset ] = this.resolvedProperty[ this.propertyIndex ]; + + }, + + function getValue_toArray( buffer, offset ) { + + this.resolvedProperty.toArray( buffer, offset ); + + } + + ], + + SetterByBindingTypeAndVersioning: [ + + [ + // Direct + + function setValue_direct( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + + }, + + function setValue_direct_setNeedsUpdate( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + }, + + function setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // EntireArray + + function setValue_array( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + }, + + function setValue_array_setNeedsUpdate( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.needsUpdate = true; + + }, + + function setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // ArrayElement + + function setValue_arrayElement( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + + }, + + function setValue_arrayElement_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + }, + + function setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // HasToFromArray + + function setValue_fromArray( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + + }, + + function setValue_fromArray_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.needsUpdate = true; + + }, + + function setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ] + + ], + + getValue: function getValue_unbound( targetArray, offset ) { + + this.bind(); + this.getValue( targetArray, offset ); + + // Note: This class uses a State pattern on a per-method basis: + // 'bind' sets 'this.getValue' / 'setValue' and shadows the + // prototype version of these methods with one that represents + // the bound state. When the property is not found, the methods + // become no-ops. + + }, + + setValue: function getValue_unbound( sourceArray, offset ) { + + this.bind(); + this.setValue( sourceArray, offset ); + + }, + + // create getter / setter pair for a property in the scene graph + bind: function () { + + var targetObject = this.node, + parsedPath = this.parsedPath, + + objectName = parsedPath.objectName, + propertyName = parsedPath.propertyName, + propertyIndex = parsedPath.propertyIndex; + + if ( ! targetObject ) { + + targetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName ) || this.rootNode; + + this.node = targetObject; + + } + + // set fail state so we can just 'return' on error + this.getValue = this._getValue_unavailable; + this.setValue = this._setValue_unavailable; + + // ensure there is a value node + if ( ! targetObject ) { + + console.error( 'THREE.PropertyBinding: Trying to update node for track: ' + this.path + ' but it wasn\'t found.' ); + return; + + } + + if ( objectName ) { + + var objectIndex = parsedPath.objectIndex; + + // special cases were we need to reach deeper into the hierarchy to get the face materials.... + switch ( objectName ) { + + case 'materials': + + if ( ! targetObject.material ) { + + console.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this ); + return; + + } + + if ( ! targetObject.material.materials ) { + + console.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this ); + return; + + } + + targetObject = targetObject.material.materials; + + break; + + case 'bones': + + if ( ! targetObject.skeleton ) { + + console.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this ); + return; + + } + + // potential future optimization: skip this if propertyIndex is already an integer + // and convert the integer string to a true integer. + + targetObject = targetObject.skeleton.bones; + + // support resolving morphTarget names into indices. + for ( var i = 0; i < targetObject.length; i ++ ) { + + if ( targetObject[ i ].name === objectIndex ) { + + objectIndex = i; + break; + + } + + } + + break; + + default: + + if ( targetObject[ objectName ] === undefined ) { + + console.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this ); + return; + + } + + targetObject = targetObject[ objectName ]; + + } + + + if ( objectIndex !== undefined ) { + + if ( targetObject[ objectIndex ] === undefined ) { + + console.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject ); + return; + + } + + targetObject = targetObject[ objectIndex ]; + + } + + } + + // resolve property + var nodeProperty = targetObject[ propertyName ]; + + if ( nodeProperty === undefined ) { + + var nodeName = parsedPath.nodeName; + + console.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName + + '.' + propertyName + ' but it wasn\'t found.', targetObject ); + return; + + } + + // determine versioning scheme + var versioning = this.Versioning.None; + + this.targetObject = targetObject; + + if ( targetObject.needsUpdate !== undefined ) { // material + + versioning = this.Versioning.NeedsUpdate; + + } else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform + + versioning = this.Versioning.MatrixWorldNeedsUpdate; + + } + + // determine how the property gets bound + var bindingType = this.BindingType.Direct; + + if ( propertyIndex !== undefined ) { + + // access a sub element of the property array (only primitives are supported right now) + + if ( propertyName === "morphTargetInfluences" ) { + + // potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer. + + // support resolving morphTarget names into indices. + if ( ! targetObject.geometry ) { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this ); + return; + + } + + if ( targetObject.geometry.isBufferGeometry ) { + + if ( ! targetObject.geometry.morphAttributes ) { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this ); + return; + + } + + for ( var i = 0; i < this.node.geometry.morphAttributes.position.length; i ++ ) { + + if ( targetObject.geometry.morphAttributes.position[ i ].name === propertyIndex ) { + + propertyIndex = i; + break; + + } + + } + + + } else { + + if ( ! targetObject.geometry.morphTargets ) { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.', this ); + return; + + } + + for ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) { + + if ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) { + + propertyIndex = i; + break; + + } + + } + + } + + } + + bindingType = this.BindingType.ArrayElement; + + this.resolvedProperty = nodeProperty; + this.propertyIndex = propertyIndex; + + } else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) { + + // must use copy for Object3D.Euler/Quaternion + + bindingType = this.BindingType.HasFromToArray; + + this.resolvedProperty = nodeProperty; + + } else if ( Array.isArray( nodeProperty ) ) { + + bindingType = this.BindingType.EntireArray; + + this.resolvedProperty = nodeProperty; + + } else { + + this.propertyName = propertyName; + + } + + // select getter / setter + this.getValue = this.GetterByBindingType[ bindingType ]; + this.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ]; + + }, + + unbind: function () { + + this.node = null; + + // back to the prototype version of getValue / setValue + // note: avoiding to mutate the shape of 'this' via 'delete' + this.getValue = this._getValue_unbound; + this.setValue = this._setValue_unbound; + + } + +} ); + +//!\ DECLARE ALIAS AFTER assign prototype ! +Object.assign( PropertyBinding.prototype, { + + // initial state of these methods that calls 'bind' + _getValue_unbound: PropertyBinding.prototype.getValue, + _setValue_unbound: PropertyBinding.prototype.setValue, + +} ); + +export { PropertyBinding }; diff --git a/lib/animation/PropertyMixer.js b/lib/animation/PropertyMixer.js new file mode 100644 index 0000000..a4c0bbf --- /dev/null +++ b/lib/animation/PropertyMixer.js @@ -0,0 +1,209 @@ +import { Quaternion } from '../math/Quaternion.js'; + +/** + * + * Buffered scene graph property that allows weighted accumulation. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + +function PropertyMixer( binding, typeName, valueSize ) { + + this.binding = binding; + this.valueSize = valueSize; + + var bufferType = Float64Array, + mixFunction; + + switch ( typeName ) { + + case 'quaternion': + mixFunction = this._slerp; + break; + + case 'string': + case 'bool': + bufferType = Array; + mixFunction = this._select; + break; + + default: + mixFunction = this._lerp; + + } + + this.buffer = new bufferType( valueSize * 4 ); + // layout: [ incoming | accu0 | accu1 | orig ] + // + // interpolators can use .buffer as their .result + // the data then goes to 'incoming' + // + // 'accu0' and 'accu1' are used frame-interleaved for + // the cumulative result and are compared to detect + // changes + // + // 'orig' stores the original state of the property + + this._mixBufferRegion = mixFunction; + + this.cumulativeWeight = 0; + + this.useCount = 0; + this.referenceCount = 0; + +} + +Object.assign( PropertyMixer.prototype, { + + // accumulate data in the 'incoming' region into 'accu' + accumulate: function ( accuIndex, weight ) { + + // note: happily accumulating nothing when weight = 0, the caller knows + // the weight and shouldn't have made the call in the first place + + var buffer = this.buffer, + stride = this.valueSize, + offset = accuIndex * stride + stride, + + currentWeight = this.cumulativeWeight; + + if ( currentWeight === 0 ) { + + // accuN := incoming * weight + + for ( var i = 0; i !== stride; ++ i ) { + + buffer[ offset + i ] = buffer[ i ]; + + } + + currentWeight = weight; + + } else { + + // accuN := accuN + incoming * weight + + currentWeight += weight; + var mix = weight / currentWeight; + this._mixBufferRegion( buffer, offset, 0, mix, stride ); + + } + + this.cumulativeWeight = currentWeight; + + }, + + // apply the state of 'accu' to the binding when accus differ + apply: function ( accuIndex ) { + + var stride = this.valueSize, + buffer = this.buffer, + offset = accuIndex * stride + stride, + + weight = this.cumulativeWeight, + + binding = this.binding; + + this.cumulativeWeight = 0; + + if ( weight < 1 ) { + + // accuN := accuN + original * ( 1 - cumulativeWeight ) + + var originalValueOffset = stride * 3; + + this._mixBufferRegion( + buffer, offset, originalValueOffset, 1 - weight, stride ); + + } + + for ( var i = stride, e = stride + stride; i !== e; ++ i ) { + + if ( buffer[ i ] !== buffer[ i + stride ] ) { + + // value has changed -> update scene graph + + binding.setValue( buffer, offset ); + break; + + } + + } + + }, + + // remember the state of the bound property and copy it to both accus + saveOriginalState: function () { + + var binding = this.binding; + + var buffer = this.buffer, + stride = this.valueSize, + + originalValueOffset = stride * 3; + + binding.getValue( buffer, originalValueOffset ); + + // accu[0..1] := orig -- initially detect changes against the original + for ( var i = stride, e = originalValueOffset; i !== e; ++ i ) { + + buffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ]; + + } + + this.cumulativeWeight = 0; + + }, + + // apply the state previously taken via 'saveOriginalState' to the binding + restoreOriginalState: function () { + + var originalValueOffset = this.valueSize * 3; + this.binding.setValue( this.buffer, originalValueOffset ); + + }, + + + // mix functions + + _select: function ( buffer, dstOffset, srcOffset, t, stride ) { + + if ( t >= 0.5 ) { + + for ( var i = 0; i !== stride; ++ i ) { + + buffer[ dstOffset + i ] = buffer[ srcOffset + i ]; + + } + + } + + }, + + _slerp: function ( buffer, dstOffset, srcOffset, t ) { + + Quaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t ); + + }, + + _lerp: function ( buffer, dstOffset, srcOffset, t, stride ) { + + var s = 1 - t; + + for ( var i = 0; i !== stride; ++ i ) { + + var j = dstOffset + i; + + buffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t; + + } + + } + +} ); + + +export { PropertyMixer }; diff --git a/lib/animation/tracks/BooleanKeyframeTrack.js b/lib/animation/tracks/BooleanKeyframeTrack.js new file mode 100644 index 0000000..bec2d2d --- /dev/null +++ b/lib/animation/tracks/BooleanKeyframeTrack.js @@ -0,0 +1,38 @@ +import { InterpolateDiscrete } from '../../constants.js'; +import { KeyframeTrack } from '../KeyframeTrack.js'; + +/** + * + * A Track of Boolean keyframe values. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + +function BooleanKeyframeTrack( name, times, values ) { + + KeyframeTrack.call( this, name, times, values ); + +} + +BooleanKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: BooleanKeyframeTrack, + + ValueTypeName: 'bool', + ValueBufferType: Array, + + DefaultInterpolation: InterpolateDiscrete, + + InterpolantFactoryMethodLinear: undefined, + InterpolantFactoryMethodSmooth: undefined + + // Note: Actually this track could have a optimized / compressed + // representation of a single value and a custom interpolant that + // computes "firstValue ^ isOdd( index )". + +} ); + +export { BooleanKeyframeTrack }; diff --git a/lib/animation/tracks/ColorKeyframeTrack.js b/lib/animation/tracks/ColorKeyframeTrack.js new file mode 100644 index 0000000..c409645 --- /dev/null +++ b/lib/animation/tracks/ColorKeyframeTrack.js @@ -0,0 +1,34 @@ +import { KeyframeTrack } from '../KeyframeTrack.js'; + +/** + * + * A Track of keyframe values that represent color. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + +function ColorKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + +} + +ColorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: ColorKeyframeTrack, + + ValueTypeName: 'color' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + // Note: Very basic implementation and nothing special yet. + // However, this is the place for color space parameterization. + +} ); + +export { ColorKeyframeTrack }; diff --git a/lib/animation/tracks/NumberKeyframeTrack.js b/lib/animation/tracks/NumberKeyframeTrack.js new file mode 100644 index 0000000..f717221 --- /dev/null +++ b/lib/animation/tracks/NumberKeyframeTrack.js @@ -0,0 +1,30 @@ +import { KeyframeTrack } from '../KeyframeTrack.js'; + +/** + * + * A Track of numeric keyframe values. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + +function NumberKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + +} + +NumberKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: NumberKeyframeTrack, + + ValueTypeName: 'number' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + +} ); + +export { NumberKeyframeTrack }; diff --git a/lib/animation/tracks/QuaternionKeyframeTrack.js b/lib/animation/tracks/QuaternionKeyframeTrack.js new file mode 100644 index 0000000..9594959 --- /dev/null +++ b/lib/animation/tracks/QuaternionKeyframeTrack.js @@ -0,0 +1,40 @@ +import { InterpolateLinear } from '../../constants.js'; +import { KeyframeTrack } from '../KeyframeTrack.js'; +import { QuaternionLinearInterpolant } from '../../math/interpolants/QuaternionLinearInterpolant.js'; + +/** + * + * A Track of quaternion keyframe values. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + +function QuaternionKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + +} + +QuaternionKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: QuaternionKeyframeTrack, + + ValueTypeName: 'quaternion', + + // ValueBufferType is inherited + + DefaultInterpolation: InterpolateLinear, + + InterpolantFactoryMethodLinear: function ( result ) { + + return new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodSmooth: undefined // not yet implemented + +} ); + +export { QuaternionKeyframeTrack }; diff --git a/lib/animation/tracks/StringKeyframeTrack.js b/lib/animation/tracks/StringKeyframeTrack.js new file mode 100644 index 0000000..5d021d2 --- /dev/null +++ b/lib/animation/tracks/StringKeyframeTrack.js @@ -0,0 +1,35 @@ +import { InterpolateDiscrete } from '../../constants.js'; +import { KeyframeTrack } from '../KeyframeTrack.js'; + +/** + * + * A Track that interpolates Strings + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + +function StringKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + +} + +StringKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: StringKeyframeTrack, + + ValueTypeName: 'string', + ValueBufferType: Array, + + DefaultInterpolation: InterpolateDiscrete, + + InterpolantFactoryMethodLinear: undefined, + + InterpolantFactoryMethodSmooth: undefined + +} ); + +export { StringKeyframeTrack }; diff --git a/lib/animation/tracks/VectorKeyframeTrack.js b/lib/animation/tracks/VectorKeyframeTrack.js new file mode 100644 index 0000000..cff8c9f --- /dev/null +++ b/lib/animation/tracks/VectorKeyframeTrack.js @@ -0,0 +1,31 @@ +import { KeyframeTrack } from '../KeyframeTrack.js'; + +/** + * + * A Track of vectored keyframe values. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + +function VectorKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + +} + +VectorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: VectorKeyframeTrack, + + ValueTypeName: 'vector' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + +} ); + +export { VectorKeyframeTrack }; diff --git a/lib/audio/Audio.js b/lib/audio/Audio.js new file mode 100644 index 0000000..9932428 --- /dev/null +++ b/lib/audio/Audio.js @@ -0,0 +1,319 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author Reece Aaron Lecrivain / http://reecenotes.com/ + */ + +import { Object3D } from '../core/Object3D.js'; + +function Audio( listener ) { + + Object3D.call( this ); + + this.type = 'Audio'; + + this.context = listener.context; + + this.gain = this.context.createGain(); + this.gain.connect( listener.getInput() ); + + this.autoplay = false; + + this.buffer = null; + this.loop = false; + this.startTime = 0; + this.offset = 0; + this.playbackRate = 1; + this.isPlaying = false; + this.hasPlaybackControl = true; + this.sourceType = 'empty'; + + this.filters = []; + +} + +Audio.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Audio, + + getOutput: function () { + + return this.gain; + + }, + + setNodeSource: function ( audioNode ) { + + this.hasPlaybackControl = false; + this.sourceType = 'audioNode'; + this.source = audioNode; + this.connect(); + + return this; + + }, + + setMediaElementSource: function ( mediaElement ) { + + this.hasPlaybackControl = false; + this.sourceType = 'mediaNode'; + this.source = this.context.createMediaElementSource( mediaElement ); + this.connect(); + + return this; + + }, + + setBuffer: function ( audioBuffer ) { + + this.buffer = audioBuffer; + this.sourceType = 'buffer'; + + if ( this.autoplay ) this.play(); + + return this; + + }, + + play: function () { + + if ( this.isPlaying === true ) { + + console.warn( 'THREE.Audio: Audio is already playing.' ); + return; + + } + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + var source = this.context.createBufferSource(); + + source.buffer = this.buffer; + source.loop = this.loop; + source.onended = this.onEnded.bind( this ); + source.playbackRate.setValueAtTime( this.playbackRate, this.startTime ); + this.startTime = this.context.currentTime; + source.start( this.startTime, this.offset ); + + this.isPlaying = true; + + this.source = source; + + return this.connect(); + + }, + + pause: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + if ( this.isPlaying === true ) { + + this.source.stop(); + this.source.onended = null; + this.offset += ( this.context.currentTime - this.startTime ) * this.playbackRate; + this.isPlaying = false; + + } + + return this; + + }, + + stop: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.source.stop(); + this.source.onended = null; + this.offset = 0; + this.isPlaying = false; + + return this; + + }, + + connect: function () { + + if ( this.filters.length > 0 ) { + + this.source.connect( this.filters[ 0 ] ); + + for ( var i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].connect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].connect( this.getOutput() ); + + } else { + + this.source.connect( this.getOutput() ); + + } + + return this; + + }, + + disconnect: function () { + + if ( this.filters.length > 0 ) { + + this.source.disconnect( this.filters[ 0 ] ); + + for ( var i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].disconnect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].disconnect( this.getOutput() ); + + } else { + + this.source.disconnect( this.getOutput() ); + + } + + return this; + + }, + + getFilters: function () { + + return this.filters; + + }, + + setFilters: function ( value ) { + + if ( ! value ) value = []; + + if ( this.isPlaying === true ) { + + this.disconnect(); + this.filters = value; + this.connect(); + + } else { + + this.filters = value; + + } + + return this; + + }, + + getFilter: function () { + + return this.getFilters()[ 0 ]; + + }, + + setFilter: function ( filter ) { + + return this.setFilters( filter ? [ filter ] : [] ); + + }, + + setPlaybackRate: function ( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.playbackRate = value; + + if ( this.isPlaying === true ) { + + this.source.playbackRate.setValueAtTime( this.playbackRate, this.context.currentTime ); + + } + + return this; + + }, + + getPlaybackRate: function () { + + return this.playbackRate; + + }, + + onEnded: function () { + + this.isPlaying = false; + + }, + + getLoop: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return false; + + } + + return this.loop; + + }, + + setLoop: function ( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.loop = value; + + if ( this.isPlaying === true ) { + + this.source.loop = this.loop; + + } + + return this; + + }, + + getVolume: function () { + + return this.gain.gain.value; + + }, + + setVolume: function ( value ) { + + this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 ); + + return this; + + } + +} ); + +export { Audio }; diff --git a/lib/audio/AudioAnalyser.js b/lib/audio/AudioAnalyser.js new file mode 100644 index 0000000..ce21a4a --- /dev/null +++ b/lib/audio/AudioAnalyser.js @@ -0,0 +1,42 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function AudioAnalyser( audio, fftSize ) { + + this.analyser = audio.context.createAnalyser(); + this.analyser.fftSize = fftSize !== undefined ? fftSize : 2048; + + this.data = new Uint8Array( this.analyser.frequencyBinCount ); + + audio.getOutput().connect( this.analyser ); + +} + +Object.assign( AudioAnalyser.prototype, { + + getFrequencyData: function () { + + this.analyser.getByteFrequencyData( this.data ); + + return this.data; + + }, + + getAverageFrequency: function () { + + var value = 0, data = this.getFrequencyData(); + + for ( var i = 0; i < data.length; i ++ ) { + + value += data[ i ]; + + } + + return value / data.length; + + } + +} ); + +export { AudioAnalyser }; diff --git a/lib/audio/AudioContext.js b/lib/audio/AudioContext.js new file mode 100644 index 0000000..29def01 --- /dev/null +++ b/lib/audio/AudioContext.js @@ -0,0 +1,29 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +var context; + +var AudioContext = { + + getContext: function () { + + if ( context === undefined ) { + + context = new ( window.AudioContext || window.webkitAudioContext )(); + + } + + return context; + + }, + + setContext: function ( value ) { + + context = value; + + } + +}; + +export { AudioContext }; diff --git a/lib/audio/AudioListener.js b/lib/audio/AudioListener.js new file mode 100644 index 0000000..78173ee --- /dev/null +++ b/lib/audio/AudioListener.js @@ -0,0 +1,135 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { Vector3 } from '../math/Vector3.js'; +import { Quaternion } from '../math/Quaternion.js'; +import { Object3D } from '../core/Object3D.js'; +import { AudioContext } from './AudioContext.js'; + +function AudioListener() { + + Object3D.call( this ); + + this.type = 'AudioListener'; + + this.context = AudioContext.getContext(); + + this.gain = this.context.createGain(); + this.gain.connect( this.context.destination ); + + this.filter = null; + +} + +AudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: AudioListener, + + getInput: function () { + + return this.gain; + + }, + + removeFilter: function ( ) { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + this.gain.connect( this.context.destination ); + this.filter = null; + + } + + return this; + + }, + + getFilter: function () { + + return this.filter; + + }, + + setFilter: function ( value ) { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + + } else { + + this.gain.disconnect( this.context.destination ); + + } + + this.filter = value; + this.gain.connect( this.filter ); + this.filter.connect( this.context.destination ); + + return this; + + }, + + getMasterVolume: function () { + + return this.gain.gain.value; + + }, + + setMasterVolume: function ( value ) { + + this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 ); + + return this; + + }, + + updateMatrixWorld: ( function () { + + var position = new Vector3(); + var quaternion = new Quaternion(); + var scale = new Vector3(); + + var orientation = new Vector3(); + + return function updateMatrixWorld( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + var listener = this.context.listener; + var up = this.up; + + this.matrixWorld.decompose( position, quaternion, scale ); + + orientation.set( 0, 0, - 1 ).applyQuaternion( quaternion ); + + if ( listener.positionX ) { + + listener.positionX.setValueAtTime( position.x, this.context.currentTime ); + listener.positionY.setValueAtTime( position.y, this.context.currentTime ); + listener.positionZ.setValueAtTime( position.z, this.context.currentTime ); + listener.forwardX.setValueAtTime( orientation.x, this.context.currentTime ); + listener.forwardY.setValueAtTime( orientation.y, this.context.currentTime ); + listener.forwardZ.setValueAtTime( orientation.z, this.context.currentTime ); + listener.upX.setValueAtTime( up.x, this.context.currentTime ); + listener.upY.setValueAtTime( up.y, this.context.currentTime ); + listener.upZ.setValueAtTime( up.z, this.context.currentTime ); + + } else { + + listener.setPosition( position.x, position.y, position.z ); + listener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z ); + + } + + }; + + } )() + +} ); + +export { AudioListener }; diff --git a/lib/audio/PositionalAudio.js b/lib/audio/PositionalAudio.js new file mode 100644 index 0000000..c37c75f --- /dev/null +++ b/lib/audio/PositionalAudio.js @@ -0,0 +1,122 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { Vector3 } from '../math/Vector3.js'; +import { Quaternion } from '../math/Quaternion.js'; +import { Audio } from './Audio.js'; +import { Object3D } from '../core/Object3D.js'; + +function PositionalAudio( listener ) { + + Audio.call( this, listener ); + + this.panner = this.context.createPanner(); + this.panner.connect( this.gain ); + +} + +PositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), { + + constructor: PositionalAudio, + + getOutput: function () { + + return this.panner; + + }, + + getRefDistance: function () { + + return this.panner.refDistance; + + }, + + setRefDistance: function ( value ) { + + this.panner.refDistance = value; + + return this; + + }, + + getRolloffFactor: function () { + + return this.panner.rolloffFactor; + + }, + + setRolloffFactor: function ( value ) { + + this.panner.rolloffFactor = value; + + return this; + + }, + + getDistanceModel: function () { + + return this.panner.distanceModel; + + }, + + setDistanceModel: function ( value ) { + + this.panner.distanceModel = value; + + return this; + + }, + + getMaxDistance: function () { + + return this.panner.maxDistance; + + }, + + setMaxDistance: function ( value ) { + + this.panner.maxDistance = value; + + return this; + + }, + + setDirectionalCone: function ( coneInnerAngle, coneOuterAngle, coneOuterGain ) { + + this.panner.coneInnerAngle = coneInnerAngle; + this.panner.coneOuterAngle = coneOuterAngle; + this.panner.coneOuterGain = coneOuterGain; + + return this; + + }, + + updateMatrixWorld: ( function () { + + var position = new Vector3(); + var quaternion = new Quaternion(); + var scale = new Vector3(); + + var orientation = new Vector3(); + + return function updateMatrixWorld( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + var panner = this.panner; + this.matrixWorld.decompose( position, quaternion, scale ); + + orientation.set( 0, 0, 1 ).applyQuaternion( quaternion ); + + panner.setPosition( position.x, position.y, position.z ); + panner.setOrientation( orientation.x, orientation.y, orientation.z ); + + }; + + } )() + + +} ); + +export { PositionalAudio }; diff --git a/lib/cameras/ArrayCamera.js b/lib/cameras/ArrayCamera.js new file mode 100644 index 0000000..fc98224 --- /dev/null +++ b/lib/cameras/ArrayCamera.js @@ -0,0 +1,24 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { PerspectiveCamera } from './PerspectiveCamera.js'; + +function ArrayCamera( array ) { + + PerspectiveCamera.call( this ); + + this.cameras = array || []; + +} + +ArrayCamera.prototype = Object.assign( Object.create( PerspectiveCamera.prototype ), { + + constructor: ArrayCamera, + + isArrayCamera: true + +} ); + + +export { ArrayCamera }; diff --git a/lib/cameras/Camera.js b/lib/cameras/Camera.js new file mode 100644 index 0000000..cb992a6 --- /dev/null +++ b/lib/cameras/Camera.js @@ -0,0 +1,76 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author WestLangley / http://github.com/WestLangley +*/ + +import { Matrix4 } from '../math/Matrix4.js'; +import { Object3D } from '../core/Object3D.js'; +import { Vector3 } from '../math/Vector3.js'; + +function Camera() { + + Object3D.call( this ); + + this.type = 'Camera'; + + this.matrixWorldInverse = new Matrix4(); + + this.projectionMatrix = new Matrix4(); + this.projectionMatrixInverse = new Matrix4(); + +} + +Camera.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Camera, + + isCamera: true, + + copy: function ( source, recursive ) { + + Object3D.prototype.copy.call( this, source, recursive ); + + this.matrixWorldInverse.copy( source.matrixWorldInverse ); + + this.projectionMatrix.copy( source.projectionMatrix ); + this.projectionMatrixInverse.copy( source.projectionMatrixInverse ); + + return this; + + }, + + getWorldDirection: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Camera: .getWorldDirection() target is now required' ); + target = new Vector3(); + + } + + this.updateMatrixWorld( true ); + + var e = this.matrixWorld.elements; + + return target.set( - e[ 8 ], - e[ 9 ], - e[ 10 ] ).normalize(); + + }, + + updateMatrixWorld: function ( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + this.matrixWorldInverse.getInverse( this.matrixWorld ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + } + +} ); + +export { Camera }; diff --git a/lib/cameras/CubeCamera.js b/lib/cameras/CubeCamera.js new file mode 100644 index 0000000..c475380 --- /dev/null +++ b/lib/cameras/CubeCamera.js @@ -0,0 +1,113 @@ +import { Object3D } from '../core/Object3D.js'; +import { WebGLRenderTargetCube } from '../renderers/WebGLRenderTargetCube.js'; +import { LinearFilter, RGBFormat } from '../constants.js'; +import { Vector3 } from '../math/Vector3.js'; +import { PerspectiveCamera } from './PerspectiveCamera.js'; + +/** + * Camera for rendering cube maps + * - renders scene into axis-aligned cube + * + * @author alteredq / http://alteredqualia.com/ + */ + +function CubeCamera( near, far, cubeResolution, options ) { + + Object3D.call( this ); + + this.type = 'CubeCamera'; + + var fov = 90, aspect = 1; + + var cameraPX = new PerspectiveCamera( fov, aspect, near, far ); + cameraPX.up.set( 0, - 1, 0 ); + cameraPX.lookAt( new Vector3( 1, 0, 0 ) ); + this.add( cameraPX ); + + var cameraNX = new PerspectiveCamera( fov, aspect, near, far ); + cameraNX.up.set( 0, - 1, 0 ); + cameraNX.lookAt( new Vector3( - 1, 0, 0 ) ); + this.add( cameraNX ); + + var cameraPY = new PerspectiveCamera( fov, aspect, near, far ); + cameraPY.up.set( 0, 0, 1 ); + cameraPY.lookAt( new Vector3( 0, 1, 0 ) ); + this.add( cameraPY ); + + var cameraNY = new PerspectiveCamera( fov, aspect, near, far ); + cameraNY.up.set( 0, 0, - 1 ); + cameraNY.lookAt( new Vector3( 0, - 1, 0 ) ); + this.add( cameraNY ); + + var cameraPZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraPZ.up.set( 0, - 1, 0 ); + cameraPZ.lookAt( new Vector3( 0, 0, 1 ) ); + this.add( cameraPZ ); + + var cameraNZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraNZ.up.set( 0, - 1, 0 ); + cameraNZ.lookAt( new Vector3( 0, 0, - 1 ) ); + this.add( cameraNZ ); + + options = options || { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter }; + + this.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options ); + this.renderTarget.texture.name = "CubeCamera"; + + this.update = function ( renderer, scene ) { + + if ( this.parent === null ) this.updateMatrixWorld(); + + var renderTarget = this.renderTarget; + var generateMipmaps = renderTarget.texture.generateMipmaps; + + renderTarget.texture.generateMipmaps = false; + + renderTarget.activeCubeFace = 0; + renderer.render( scene, cameraPX, renderTarget ); + + renderTarget.activeCubeFace = 1; + renderer.render( scene, cameraNX, renderTarget ); + + renderTarget.activeCubeFace = 2; + renderer.render( scene, cameraPY, renderTarget ); + + renderTarget.activeCubeFace = 3; + renderer.render( scene, cameraNY, renderTarget ); + + renderTarget.activeCubeFace = 4; + renderer.render( scene, cameraPZ, renderTarget ); + + renderTarget.texture.generateMipmaps = generateMipmaps; + + renderTarget.activeCubeFace = 5; + renderer.render( scene, cameraNZ, renderTarget ); + + renderer.setRenderTarget( null ); + + }; + + this.clear = function ( renderer, color, depth, stencil ) { + + var renderTarget = this.renderTarget; + + for ( var i = 0; i < 6; i ++ ) { + + renderTarget.activeCubeFace = i; + renderer.setRenderTarget( renderTarget ); + + renderer.clear( color, depth, stencil ); + + } + + renderer.setRenderTarget( null ); + + }; + +} + +CubeCamera.prototype = Object.create( Object3D.prototype ); +CubeCamera.prototype.constructor = CubeCamera; + + +export { CubeCamera }; diff --git a/lib/cameras/OrthographicCamera.js b/lib/cameras/OrthographicCamera.js new file mode 100755 index 0000000..532da01 --- /dev/null +++ b/lib/cameras/OrthographicCamera.js @@ -0,0 +1,147 @@ +import { Camera } from './Camera.js'; +import { Object3D } from '../core/Object3D.js'; + +/** + * @author alteredq / http://alteredqualia.com/ + * @author arose / http://github.com/arose + */ + +function OrthographicCamera( left, right, top, bottom, near, far ) { + + Camera.call( this ); + + this.type = 'OrthographicCamera'; + + this.zoom = 1; + this.view = null; + + this.left = ( left !== undefined ) ? left : - 1; + this.right = ( right !== undefined ) ? right : 1; + this.top = ( top !== undefined ) ? top : 1; + this.bottom = ( bottom !== undefined ) ? bottom : - 1; + + this.near = ( near !== undefined ) ? near : 0.1; + this.far = ( far !== undefined ) ? far : 2000; + + this.updateProjectionMatrix(); + +} + +OrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), { + + constructor: OrthographicCamera, + + isOrthographicCamera: true, + + copy: function ( source, recursive ) { + + Camera.prototype.copy.call( this, source, recursive ); + + 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.zoom = source.zoom; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + return this; + + }, + + setViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) { + + if ( this.view === null ) { + + this.view = { + enabled: true, + fullWidth: 1, + fullHeight: 1, + offsetX: 0, + offsetY: 0, + width: 1, + height: 1 + }; + + } + + this.view.enabled = true; + this.view.fullWidth = fullWidth; + this.view.fullHeight = fullHeight; + this.view.offsetX = x; + this.view.offsetY = y; + this.view.width = width; + this.view.height = height; + + this.updateProjectionMatrix(); + + }, + + clearViewOffset: function () { + + if ( this.view !== null ) { + + this.view.enabled = false; + + } + + this.updateProjectionMatrix(); + + }, + + updateProjectionMatrix: function () { + + var dx = ( this.right - this.left ) / ( 2 * this.zoom ); + var dy = ( this.top - this.bottom ) / ( 2 * this.zoom ); + var cx = ( this.right + this.left ) / 2; + var cy = ( this.top + this.bottom ) / 2; + + var left = cx - dx; + var right = cx + dx; + var top = cy + dy; + var bottom = cy - dy; + + if ( this.view !== null && this.view.enabled ) { + + var zoomW = this.zoom / ( this.view.width / this.view.fullWidth ); + var zoomH = this.zoom / ( this.view.height / this.view.fullHeight ); + var scaleW = ( this.right - this.left ) / this.view.width; + var scaleH = ( this.top - this.bottom ) / this.view.height; + + left += scaleW * ( this.view.offsetX / zoomW ); + right = left + scaleW * ( this.view.width / zoomW ); + top -= scaleH * ( this.view.offsetY / zoomH ); + bottom = top - scaleH * ( this.view.height / zoomH ); + + } + + this.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far ); + + this.projectionMatrixInverse.getInverse( this.projectionMatrix ); + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.zoom = this.zoom; + data.object.left = this.left; + data.object.right = this.right; + data.object.top = this.top; + data.object.bottom = this.bottom; + data.object.near = this.near; + data.object.far = this.far; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + return data; + + } + +} ); + + +export { OrthographicCamera }; diff --git a/lib/cameras/PerspectiveCamera.js b/lib/cameras/PerspectiveCamera.js new file mode 100755 index 0000000..b9e9e23 --- /dev/null +++ b/lib/cameras/PerspectiveCamera.js @@ -0,0 +1,244 @@ +import { Camera } from './Camera.js'; +import { Object3D } from '../core/Object3D.js'; +import { _Math } from '../math/Math.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author greggman / http://games.greggman.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author tschw + */ + +function PerspectiveCamera( fov, aspect, near, far ) { + + Camera.call( this ); + + this.type = 'PerspectiveCamera'; + + this.fov = fov !== undefined ? fov : 50; + this.zoom = 1; + + this.near = near !== undefined ? near : 0.1; + this.far = far !== undefined ? far : 2000; + this.focus = 10; + + this.aspect = aspect !== undefined ? aspect : 1; + this.view = null; + + this.filmGauge = 35; // width of the film (default in millimeters) + this.filmOffset = 0; // horizontal film offset (same unit as gauge) + + this.updateProjectionMatrix(); + +} + +PerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), { + + constructor: PerspectiveCamera, + + isPerspectiveCamera: true, + + copy: function ( source, recursive ) { + + Camera.prototype.copy.call( this, source, recursive ); + + this.fov = source.fov; + this.zoom = source.zoom; + + this.near = source.near; + this.far = source.far; + this.focus = source.focus; + + this.aspect = source.aspect; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + this.filmGauge = source.filmGauge; + this.filmOffset = source.filmOffset; + + return this; + + }, + + /** + * Sets the FOV by focal length in respect to the current .filmGauge. + * + * The default film gauge is 35, so that the focal length can be specified for + * a 35mm (full frame) camera. + * + * Values for focal length and film gauge must have the same unit. + */ + setFocalLength: function ( focalLength ) { + + // see http://www.bobatkins.com/photography/technical/field_of_view.html + var vExtentSlope = 0.5 * this.getFilmHeight() / focalLength; + + this.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope ); + this.updateProjectionMatrix(); + + }, + + /** + * Calculates the focal length from the current .fov and .filmGauge. + */ + getFocalLength: function () { + + var vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov ); + + return 0.5 * this.getFilmHeight() / vExtentSlope; + + }, + + getEffectiveFOV: function () { + + return _Math.RAD2DEG * 2 * Math.atan( + Math.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom ); + + }, + + getFilmWidth: function () { + + // film not completely covered in portrait format (aspect < 1) + return this.filmGauge * Math.min( this.aspect, 1 ); + + }, + + getFilmHeight: function () { + + // film not completely covered in landscape format (aspect > 1) + return this.filmGauge / Math.max( this.aspect, 1 ); + + }, + + /** + * Sets an offset in a larger frustum. This is useful for multi-window or + * multi-monitor/multi-machine setups. + * + * For example, if you have 3x2 monitors and each monitor is 1920x1080 and + * the monitors are in grid like this + * + * +---+---+---+ + * | A | B | C | + * +---+---+---+ + * | D | E | F | + * +---+---+---+ + * + * then for each monitor you would call it like this + * + * var w = 1920; + * var h = 1080; + * var fullWidth = w * 3; + * var fullHeight = h * 2; + * + * --A-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h ); + * --B-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h ); + * --C-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h ); + * --D-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h ); + * --E-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h ); + * --F-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h ); + * + * Note there is no reason monitors have to be the same size or in a grid. + */ + setViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) { + + this.aspect = fullWidth / fullHeight; + + if ( this.view === null ) { + + this.view = { + enabled: true, + fullWidth: 1, + fullHeight: 1, + offsetX: 0, + offsetY: 0, + width: 1, + height: 1 + }; + + } + + this.view.enabled = true; + this.view.fullWidth = fullWidth; + this.view.fullHeight = fullHeight; + this.view.offsetX = x; + this.view.offsetY = y; + this.view.width = width; + this.view.height = height; + + this.updateProjectionMatrix(); + + }, + + clearViewOffset: function () { + + if ( this.view !== null ) { + + this.view.enabled = false; + + } + + this.updateProjectionMatrix(); + + }, + + updateProjectionMatrix: function () { + + var near = this.near, + top = near * Math.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom, + height = 2 * top, + width = this.aspect * height, + left = - 0.5 * width, + view = this.view; + + if ( this.view !== null && this.view.enabled ) { + + var fullWidth = view.fullWidth, + fullHeight = view.fullHeight; + + left += view.offsetX * width / fullWidth; + top -= view.offsetY * height / fullHeight; + width *= view.width / fullWidth; + height *= view.height / fullHeight; + + } + + var skew = this.filmOffset; + if ( skew !== 0 ) left += near * skew / this.getFilmWidth(); + + this.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far ); + + this.projectionMatrixInverse.getInverse( this.projectionMatrix ); + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.fov = this.fov; + data.object.zoom = this.zoom; + + data.object.near = this.near; + data.object.far = this.far; + data.object.focus = this.focus; + + data.object.aspect = this.aspect; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + data.object.filmGauge = this.filmGauge; + data.object.filmOffset = this.filmOffset; + + return data; + + } + +} ); + + +export { PerspectiveCamera }; diff --git a/lib/cameras/StereoCamera.js b/lib/cameras/StereoCamera.js new file mode 100644 index 0000000..14aebe6 --- /dev/null +++ b/lib/cameras/StereoCamera.js @@ -0,0 +1,98 @@ +import { Matrix4 } from '../math/Matrix4.js'; +import { _Math } from '../math/Math.js'; +import { PerspectiveCamera } from './PerspectiveCamera.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function StereoCamera() { + + this.type = 'StereoCamera'; + + this.aspect = 1; + + this.eyeSep = 0.064; + + this.cameraL = new PerspectiveCamera(); + this.cameraL.layers.enable( 1 ); + this.cameraL.matrixAutoUpdate = false; + + this.cameraR = new PerspectiveCamera(); + this.cameraR.layers.enable( 2 ); + this.cameraR.matrixAutoUpdate = false; + +} + +Object.assign( StereoCamera.prototype, { + + update: ( function () { + + var instance, focus, fov, aspect, near, far, zoom, eyeSep; + + var eyeRight = new Matrix4(); + var eyeLeft = new Matrix4(); + + return function update( camera ) { + + var needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov || + aspect !== camera.aspect * this.aspect || near !== camera.near || + far !== camera.far || zoom !== camera.zoom || eyeSep !== this.eyeSep; + + if ( needsUpdate ) { + + instance = this; + focus = camera.focus; + fov = camera.fov; + aspect = camera.aspect * this.aspect; + near = camera.near; + far = camera.far; + zoom = camera.zoom; + + // Off-axis stereoscopic effect based on + // http://paulbourke.net/stereographics/stereorender/ + + var projectionMatrix = camera.projectionMatrix.clone(); + eyeSep = this.eyeSep / 2; + var eyeSepOnProjection = eyeSep * near / focus; + var ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom; + var xmin, xmax; + + // translate xOffset + + eyeLeft.elements[ 12 ] = - eyeSep; + eyeRight.elements[ 12 ] = eyeSep; + + // 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 ); + + this.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 ); + + this.cameraR.projectionMatrix.copy( projectionMatrix ); + + } + + this.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft ); + this.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight ); + + }; + + } )() + +} ); + + +export { StereoCamera }; diff --git a/lib/constants.js b/lib/constants.js new file mode 100644 index 0000000..8a3b744 --- /dev/null +++ b/lib/constants.js @@ -0,0 +1,142 @@ +export var REVISION = '98dev'; +export var MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 }; +export var CullFaceNone = 0; +export var CullFaceBack = 1; +export var CullFaceFront = 2; +export var CullFaceFrontBack = 3; +export var FrontFaceDirectionCW = 0; +export var FrontFaceDirectionCCW = 1; +export var BasicShadowMap = 0; +export var PCFShadowMap = 1; +export var PCFSoftShadowMap = 2; +export var FrontSide = 0; +export var BackSide = 1; +export var DoubleSide = 2; +export var FlatShading = 1; +export var SmoothShading = 2; +export var NoColors = 0; +export var FaceColors = 1; +export var VertexColors = 2; +export var NoBlending = 0; +export var NormalBlending = 1; +export var AdditiveBlending = 2; +export var SubtractiveBlending = 3; +export var MultiplyBlending = 4; +export var CustomBlending = 5; +export var AddEquation = 100; +export var SubtractEquation = 101; +export var ReverseSubtractEquation = 102; +export var MinEquation = 103; +export var MaxEquation = 104; +export var ZeroFactor = 200; +export var OneFactor = 201; +export var SrcColorFactor = 202; +export var OneMinusSrcColorFactor = 203; +export var SrcAlphaFactor = 204; +export var OneMinusSrcAlphaFactor = 205; +export var DstAlphaFactor = 206; +export var OneMinusDstAlphaFactor = 207; +export var DstColorFactor = 208; +export var OneMinusDstColorFactor = 209; +export var SrcAlphaSaturateFactor = 210; +export var NeverDepth = 0; +export var AlwaysDepth = 1; +export var LessDepth = 2; +export var LessEqualDepth = 3; +export var EqualDepth = 4; +export var GreaterEqualDepth = 5; +export var GreaterDepth = 6; +export var NotEqualDepth = 7; +export var MultiplyOperation = 0; +export var MixOperation = 1; +export var AddOperation = 2; +export var NoToneMapping = 0; +export var LinearToneMapping = 1; +export var ReinhardToneMapping = 2; +export var Uncharted2ToneMapping = 3; +export var CineonToneMapping = 4; +export var UVMapping = 300; +export var CubeReflectionMapping = 301; +export var CubeRefractionMapping = 302; +export var EquirectangularReflectionMapping = 303; +export var EquirectangularRefractionMapping = 304; +export var SphericalReflectionMapping = 305; +export var CubeUVReflectionMapping = 306; +export var CubeUVRefractionMapping = 307; +export var RepeatWrapping = 1000; +export var ClampToEdgeWrapping = 1001; +export var MirroredRepeatWrapping = 1002; +export var NearestFilter = 1003; +export var NearestMipMapNearestFilter = 1004; +export var NearestMipMapLinearFilter = 1005; +export var LinearFilter = 1006; +export var LinearMipMapNearestFilter = 1007; +export var LinearMipMapLinearFilter = 1008; +export var UnsignedByteType = 1009; +export var ByteType = 1010; +export var ShortType = 1011; +export var UnsignedShortType = 1012; +export var IntType = 1013; +export var UnsignedIntType = 1014; +export var FloatType = 1015; +export var HalfFloatType = 1016; +export var UnsignedShort4444Type = 1017; +export var UnsignedShort5551Type = 1018; +export var UnsignedShort565Type = 1019; +export var UnsignedInt248Type = 1020; +export var AlphaFormat = 1021; +export var RGBFormat = 1022; +export var RGBAFormat = 1023; +export var LuminanceFormat = 1024; +export var LuminanceAlphaFormat = 1025; +export var RGBEFormat = RGBAFormat; +export var DepthFormat = 1026; +export var DepthStencilFormat = 1027; +export var RedFormat = 1028; +export var RGB_S3TC_DXT1_Format = 33776; +export var RGBA_S3TC_DXT1_Format = 33777; +export var RGBA_S3TC_DXT3_Format = 33778; +export var RGBA_S3TC_DXT5_Format = 33779; +export var RGB_PVRTC_4BPPV1_Format = 35840; +export var RGB_PVRTC_2BPPV1_Format = 35841; +export var RGBA_PVRTC_4BPPV1_Format = 35842; +export var RGBA_PVRTC_2BPPV1_Format = 35843; +export var RGB_ETC1_Format = 36196; +export var RGBA_ASTC_4x4_Format = 37808; +export var RGBA_ASTC_5x4_Format = 37809; +export var RGBA_ASTC_5x5_Format = 37810; +export var RGBA_ASTC_6x5_Format = 37811; +export var RGBA_ASTC_6x6_Format = 37812; +export var RGBA_ASTC_8x5_Format = 37813; +export var RGBA_ASTC_8x6_Format = 37814; +export var RGBA_ASTC_8x8_Format = 37815; +export var RGBA_ASTC_10x5_Format = 37816; +export var RGBA_ASTC_10x6_Format = 37817; +export var RGBA_ASTC_10x8_Format = 37818; +export var RGBA_ASTC_10x10_Format = 37819; +export var RGBA_ASTC_12x10_Format = 37820; +export var RGBA_ASTC_12x12_Format = 37821; +export var LoopOnce = 2200; +export var LoopRepeat = 2201; +export var LoopPingPong = 2202; +export var InterpolateDiscrete = 2300; +export var InterpolateLinear = 2301; +export var InterpolateSmooth = 2302; +export var ZeroCurvatureEnding = 2400; +export var ZeroSlopeEnding = 2401; +export var WrapAroundEnding = 2402; +export var TrianglesDrawMode = 0; +export var TriangleStripDrawMode = 1; +export var TriangleFanDrawMode = 2; +export var LinearEncoding = 3000; +export var sRGBEncoding = 3001; +export var GammaEncoding = 3007; +export var RGBEEncoding = 3002; +export var LogLuvEncoding = 3003; +export var RGBM7Encoding = 3004; +export var RGBM16Encoding = 3005; +export var RGBDEncoding = 3006; +export var BasicDepthPacking = 3200; +export var RGBADepthPacking = 3201; +export var TangentSpaceNormalMap = 0; +export var ObjectSpaceNormalMap = 1; diff --git a/lib/core/BufferAttribute.js b/lib/core/BufferAttribute.js new file mode 100644 index 0000000..ec5b754 --- /dev/null +++ b/lib/core/BufferAttribute.js @@ -0,0 +1,430 @@ +import { Vector4 } from '../math/Vector4.js'; +import { Vector3 } from '../math/Vector3.js'; +import { Vector2 } from '../math/Vector2.js'; +import { Color } from '../math/Color.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function BufferAttribute( array, itemSize, normalized ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.name = ''; + + this.array = array; + this.itemSize = itemSize; + this.count = array !== undefined ? array.length / itemSize : 0; + this.normalized = normalized === true; + + this.dynamic = false; + this.updateRange = { offset: 0, count: - 1 }; + + this.version = 0; + +} + +Object.defineProperty( BufferAttribute.prototype, 'needsUpdate', { + + set: function ( value ) { + + if ( value === true ) this.version ++; + + } + +} ); + +Object.assign( BufferAttribute.prototype, { + + isBufferAttribute: true, + + onUploadCallback: function () {}, + + setArray: function ( array ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.count = array !== undefined ? array.length / this.itemSize : 0; + this.array = array; + + return this; + + }, + + setDynamic: function ( value ) { + + this.dynamic = value; + + return this; + + }, + + copy: function ( source ) { + + this.name = source.name; + this.array = new source.array.constructor( source.array ); + this.itemSize = source.itemSize; + this.count = source.count; + this.normalized = source.normalized; + + this.dynamic = source.dynamic; + + return this; + + }, + + copyAt: function ( index1, attribute, index2 ) { + + index1 *= this.itemSize; + index2 *= attribute.itemSize; + + for ( var i = 0, l = this.itemSize; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + }, + + copyArray: function ( array ) { + + this.array.set( array ); + + return this; + + }, + + copyColorsArray: function ( colors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = colors.length; i < l; i ++ ) { + + var color = colors[ i ]; + + if ( color === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i ); + color = new Color(); + + } + + array[ offset ++ ] = color.r; + array[ offset ++ ] = color.g; + array[ offset ++ ] = color.b; + + } + + return this; + + }, + + copyVector2sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i ); + vector = new Vector2(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + + } + + return this; + + }, + + copyVector3sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i ); + vector = new Vector3(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + + } + + return this; + + }, + + copyVector4sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i ); + vector = new Vector4(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + array[ offset ++ ] = vector.w; + + } + + return this; + + }, + + set: function ( value, offset ) { + + if ( offset === undefined ) offset = 0; + + this.array.set( value, offset ); + + return this; + + }, + + getX: function ( index ) { + + return this.array[ index * this.itemSize ]; + + }, + + setX: function ( index, x ) { + + this.array[ index * this.itemSize ] = x; + + return this; + + }, + + getY: function ( index ) { + + return this.array[ index * this.itemSize + 1 ]; + + }, + + setY: function ( index, y ) { + + this.array[ index * this.itemSize + 1 ] = y; + + return this; + + }, + + getZ: function ( index ) { + + return this.array[ index * this.itemSize + 2 ]; + + }, + + setZ: function ( index, z ) { + + this.array[ index * this.itemSize + 2 ] = z; + + return this; + + }, + + getW: function ( index ) { + + return this.array[ index * this.itemSize + 3 ]; + + }, + + setW: function ( index, w ) { + + this.array[ index * this.itemSize + 3 ] = w; + + return this; + + }, + + setXY: function ( index, x, y ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + + return this; + + }, + + setXYZ: function ( index, x, y, z ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + + return this; + + }, + + setXYZW: function ( index, x, y, z, w ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + this.array[ index + 3 ] = w; + + return this; + + }, + + onUpload: function ( callback ) { + + this.onUploadCallback = callback; + + return this; + + }, + + clone: function () { + + return new this.constructor( this.array, this.itemSize ).copy( this ); + + } + +} ); + +// + +function Int8BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Int8Array( array ), itemSize, normalized ); + +} + +Int8BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); +Int8BufferAttribute.prototype.constructor = Int8BufferAttribute; + + +function Uint8BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Uint8Array( array ), itemSize, normalized ); + +} + +Uint8BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); +Uint8BufferAttribute.prototype.constructor = Uint8BufferAttribute; + + +function Uint8ClampedBufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Uint8ClampedArray( array ), itemSize, normalized ); + +} + +Uint8ClampedBufferAttribute.prototype = Object.create( BufferAttribute.prototype ); +Uint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute; + + +function Int16BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Int16Array( array ), itemSize, normalized ); + +} + +Int16BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); +Int16BufferAttribute.prototype.constructor = Int16BufferAttribute; + + +function Uint16BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Uint16Array( array ), itemSize, normalized ); + +} + +Uint16BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); +Uint16BufferAttribute.prototype.constructor = Uint16BufferAttribute; + + +function Int32BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Int32Array( array ), itemSize, normalized ); + +} + +Int32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); +Int32BufferAttribute.prototype.constructor = Int32BufferAttribute; + + +function Uint32BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Uint32Array( array ), itemSize, normalized ); + +} + +Uint32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); +Uint32BufferAttribute.prototype.constructor = Uint32BufferAttribute; + + +function Float32BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Float32Array( array ), itemSize, normalized ); + +} + +Float32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); +Float32BufferAttribute.prototype.constructor = Float32BufferAttribute; + + +function Float64BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Float64Array( array ), itemSize, normalized ); + +} + +Float64BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); +Float64BufferAttribute.prototype.constructor = Float64BufferAttribute; + +// + +export { + Float64BufferAttribute, + Float32BufferAttribute, + Uint32BufferAttribute, + Int32BufferAttribute, + Uint16BufferAttribute, + Int16BufferAttribute, + Uint8ClampedBufferAttribute, + Uint8BufferAttribute, + Int8BufferAttribute, + BufferAttribute +}; diff --git a/lib/core/BufferGeometry.js b/lib/core/BufferGeometry.js new file mode 100644 index 0000000..a200245 --- /dev/null +++ b/lib/core/BufferGeometry.js @@ -0,0 +1,1129 @@ +import { Vector3 } from '../math/Vector3.js'; +import { Box3 } from '../math/Box3.js'; +import { EventDispatcher } from './EventDispatcher.js'; +import { BufferAttribute, Float32BufferAttribute, Uint16BufferAttribute, Uint32BufferAttribute } from './BufferAttribute.js'; +import { Sphere } from '../math/Sphere.js'; +import { DirectGeometry } from './DirectGeometry.js'; +import { Object3D } from './Object3D.js'; +import { Matrix4 } from '../math/Matrix4.js'; +import { Matrix3 } from '../math/Matrix3.js'; +import { _Math } from '../math/Math.js'; +import { arrayMax } from '../utils.js'; + +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + +var bufferGeometryId = 1; // BufferGeometry uses odd numbers as Id + +function BufferGeometry() { + + Object.defineProperty( this, 'id', { value: bufferGeometryId += 2 } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'BufferGeometry'; + + this.index = null; + this.attributes = {}; + + this.morphAttributes = {}; + + this.groups = []; + + this.boundingBox = null; + this.boundingSphere = null; + + this.drawRange = { start: 0, count: Infinity }; + + this.userData = {}; + +} + +BufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: BufferGeometry, + + isBufferGeometry: true, + + getIndex: function () { + + return this.index; + + }, + + setIndex: function ( index ) { + + if ( Array.isArray( index ) ) { + + this.index = new ( arrayMax( index ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 ); + + } else { + + this.index = index; + + } + + }, + + addAttribute: function ( name, attribute ) { + + if ( ! ( attribute && attribute.isBufferAttribute ) && ! ( attribute && attribute.isInterleavedBufferAttribute ) ) { + + console.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' ); + + return this.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) ); + + } + + if ( name === 'index' ) { + + console.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' ); + this.setIndex( attribute ); + + return this; + + } + + this.attributes[ name ] = attribute; + + return this; + + }, + + getAttribute: function ( name ) { + + return this.attributes[ name ]; + + }, + + removeAttribute: function ( name ) { + + delete this.attributes[ name ]; + + return this; + + }, + + addGroup: function ( start, count, materialIndex ) { + + this.groups.push( { + + start: start, + count: count, + materialIndex: materialIndex !== undefined ? materialIndex : 0 + + } ); + + }, + + clearGroups: function () { + + this.groups = []; + + }, + + setDrawRange: function ( start, count ) { + + this.drawRange.start = start; + this.drawRange.count = count; + + }, + + applyMatrix: function ( matrix ) { + + var position = this.attributes.position; + + if ( position !== undefined ) { + + matrix.applyToBufferAttribute( position ); + position.needsUpdate = true; + + } + + var normal = this.attributes.normal; + + if ( normal !== undefined ) { + + var normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + normalMatrix.applyToBufferAttribute( normal ); + normal.needsUpdate = true; + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + return this; + + }, + + rotateX: function () { + + // rotate geometry around world x-axis + + var m1 = new Matrix4(); + + return function rotateX( angle ) { + + m1.makeRotationX( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateY: function () { + + // rotate geometry around world y-axis + + var m1 = new Matrix4(); + + return function rotateY( angle ) { + + m1.makeRotationY( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateZ: function () { + + // rotate geometry around world z-axis + + var m1 = new Matrix4(); + + return function rotateZ( angle ) { + + m1.makeRotationZ( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + translate: function () { + + // translate geometry + + var m1 = new Matrix4(); + + return function translate( x, y, z ) { + + m1.makeTranslation( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + scale: function () { + + // scale geometry + + var m1 = new Matrix4(); + + return function scale( x, y, z ) { + + m1.makeScale( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + lookAt: function () { + + var obj = new Object3D(); + + return function lookAt( vector ) { + + obj.lookAt( vector ); + + obj.updateMatrix(); + + this.applyMatrix( obj.matrix ); + + }; + + }(), + + center: function () { + + var offset = new Vector3(); + + return function center() { + + this.computeBoundingBox(); + + this.boundingBox.getCenter( offset ).negate(); + + this.translate( offset.x, offset.y, offset.z ); + + return this; + + }; + + }(), + + setFromObject: function ( object ) { + + // console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this ); + + var geometry = object.geometry; + + if ( object.isPoints || object.isLine ) { + + var positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 ); + var colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 ); + + this.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) ); + this.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) ); + + if ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) { + + var lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 ); + + this.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) ); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + } else if ( object.isMesh ) { + + if ( geometry && geometry.isGeometry ) { + + this.fromGeometry( geometry ); + + } + + } + + return this; + + }, + + setFromPoints: function ( points ) { + + var position = []; + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + var point = points[ i ]; + position.push( point.x, point.y, point.z || 0 ); + + } + + this.addAttribute( 'position', new Float32BufferAttribute( position, 3 ) ); + + return this; + + }, + + updateFromObject: function ( object ) { + + var geometry = object.geometry; + + if ( object.isMesh ) { + + var direct = geometry.__directGeometry; + + if ( geometry.elementsNeedUpdate === true ) { + + direct = undefined; + geometry.elementsNeedUpdate = false; + + } + + if ( direct === undefined ) { + + return this.fromGeometry( geometry ); + + } + + direct.verticesNeedUpdate = geometry.verticesNeedUpdate; + direct.normalsNeedUpdate = geometry.normalsNeedUpdate; + direct.colorsNeedUpdate = geometry.colorsNeedUpdate; + direct.uvsNeedUpdate = geometry.uvsNeedUpdate; + direct.groupsNeedUpdate = geometry.groupsNeedUpdate; + + geometry.verticesNeedUpdate = false; + geometry.normalsNeedUpdate = false; + geometry.colorsNeedUpdate = false; + geometry.uvsNeedUpdate = false; + geometry.groupsNeedUpdate = false; + + geometry = direct; + + } + + var attribute; + + if ( geometry.verticesNeedUpdate === true ) { + + attribute = this.attributes.position; + + if ( attribute !== undefined ) { + + attribute.copyVector3sArray( geometry.vertices ); + attribute.needsUpdate = true; + + } + + geometry.verticesNeedUpdate = false; + + } + + if ( geometry.normalsNeedUpdate === true ) { + + attribute = this.attributes.normal; + + if ( attribute !== undefined ) { + + attribute.copyVector3sArray( geometry.normals ); + attribute.needsUpdate = true; + + } + + geometry.normalsNeedUpdate = false; + + } + + if ( geometry.colorsNeedUpdate === true ) { + + attribute = this.attributes.color; + + if ( attribute !== undefined ) { + + attribute.copyColorsArray( geometry.colors ); + attribute.needsUpdate = true; + + } + + geometry.colorsNeedUpdate = false; + + } + + if ( geometry.uvsNeedUpdate ) { + + attribute = this.attributes.uv; + + if ( attribute !== undefined ) { + + attribute.copyVector2sArray( geometry.uvs ); + attribute.needsUpdate = true; + + } + + geometry.uvsNeedUpdate = false; + + } + + if ( geometry.lineDistancesNeedUpdate ) { + + attribute = this.attributes.lineDistance; + + if ( attribute !== undefined ) { + + attribute.copyArray( geometry.lineDistances ); + attribute.needsUpdate = true; + + } + + geometry.lineDistancesNeedUpdate = false; + + } + + if ( geometry.groupsNeedUpdate ) { + + geometry.computeGroups( object.geometry ); + this.groups = geometry.groups; + + geometry.groupsNeedUpdate = false; + + } + + return this; + + }, + + fromGeometry: function ( geometry ) { + + geometry.__directGeometry = new DirectGeometry().fromGeometry( geometry ); + + return this.fromDirectGeometry( geometry.__directGeometry ); + + }, + + fromDirectGeometry: function ( geometry ) { + + var positions = new Float32Array( geometry.vertices.length * 3 ); + this.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) ); + + if ( geometry.normals.length > 0 ) { + + var normals = new Float32Array( geometry.normals.length * 3 ); + this.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) ); + + } + + if ( geometry.colors.length > 0 ) { + + var colors = new Float32Array( geometry.colors.length * 3 ); + this.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) ); + + } + + if ( geometry.uvs.length > 0 ) { + + var uvs = new Float32Array( geometry.uvs.length * 2 ); + this.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) ); + + } + + if ( geometry.uvs2.length > 0 ) { + + var uvs2 = new Float32Array( geometry.uvs2.length * 2 ); + this.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) ); + + } + + // groups + + this.groups = geometry.groups; + + // morphs + + for ( var name in geometry.morphTargets ) { + + var array = []; + var morphTargets = geometry.morphTargets[ name ]; + + for ( var i = 0, l = morphTargets.length; i < l; i ++ ) { + + var morphTarget = morphTargets[ i ]; + + var attribute = new Float32BufferAttribute( morphTarget.data.length * 3, 3 ); + attribute.name = morphTarget.name; + + array.push( attribute.copyVector3sArray( morphTarget.data ) ); + + } + + this.morphAttributes[ name ] = array; + + } + + // skinning + + if ( geometry.skinIndices.length > 0 ) { + + var skinIndices = new Float32BufferAttribute( geometry.skinIndices.length * 4, 4 ); + this.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) ); + + } + + if ( geometry.skinWeights.length > 0 ) { + + var skinWeights = new Float32BufferAttribute( geometry.skinWeights.length * 4, 4 ); + this.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) ); + + } + + // + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + return this; + + }, + + computeBoundingBox: function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + var position = this.attributes.position; + + if ( position !== undefined ) { + + this.boundingBox.setFromBufferAttribute( position ); + + } else { + + this.boundingBox.makeEmpty(); + + } + + if ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this ); + + } + + }, + + computeBoundingSphere: function () { + + var box = new Box3(); + var vector = new Vector3(); + + return function computeBoundingSphere() { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + var position = this.attributes.position; + + if ( position ) { + + var center = this.boundingSphere.center; + + box.setFromBufferAttribute( position ); + box.getCenter( center ); + + // hoping to find a boundingSphere with a radius smaller than the + // boundingSphere of the boundingBox: sqrt(3) smaller in the best case + + var maxRadiusSq = 0; + + for ( var i = 0, il = position.count; i < il; i ++ ) { + + vector.x = position.getX( i ); + vector.y = position.getY( i ); + vector.z = position.getZ( i ); + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) ); + + } + + this.boundingSphere.radius = Math.sqrt( maxRadiusSq ); + + if ( isNaN( this.boundingSphere.radius ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this ); + + } + + } + + }; + + }(), + + computeFaceNormals: function () { + + // backwards compatibility + + }, + + computeVertexNormals: function () { + + var index = this.index; + var attributes = this.attributes; + + if ( attributes.position ) { + + var positions = attributes.position.array; + + if ( attributes.normal === undefined ) { + + this.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) ); + + } else { + + // reset existing normals to zero + + var array = attributes.normal.array; + + for ( var i = 0, il = array.length; i < il; i ++ ) { + + array[ i ] = 0; + + } + + } + + var normals = attributes.normal.array; + + var vA, vB, vC; + var pA = new Vector3(), pB = new Vector3(), pC = new Vector3(); + var cb = new Vector3(), ab = new Vector3(); + + // indexed elements + + if ( index ) { + + var indices = index.array; + + for ( var i = 0, il = index.count; i < il; i += 3 ) { + + vA = indices[ i + 0 ] * 3; + vB = indices[ i + 1 ] * 3; + vC = indices[ i + 2 ] * 3; + + pA.fromArray( positions, vA ); + pB.fromArray( positions, vB ); + pC.fromArray( positions, vC ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normals[ vA ] += cb.x; + normals[ vA + 1 ] += cb.y; + normals[ vA + 2 ] += cb.z; + + normals[ vB ] += cb.x; + normals[ vB + 1 ] += cb.y; + normals[ vB + 2 ] += cb.z; + + normals[ vC ] += cb.x; + normals[ vC + 1 ] += cb.y; + normals[ vC + 2 ] += cb.z; + + } + + } else { + + // non-indexed elements (unconnected triangle soup) + + for ( var i = 0, il = positions.length; i < il; i += 9 ) { + + pA.fromArray( positions, i ); + pB.fromArray( positions, i + 3 ); + pC.fromArray( positions, i + 6 ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normals[ i ] = cb.x; + normals[ i + 1 ] = cb.y; + normals[ i + 2 ] = cb.z; + + normals[ i + 3 ] = cb.x; + normals[ i + 4 ] = cb.y; + normals[ i + 5 ] = cb.z; + + normals[ i + 6 ] = cb.x; + normals[ i + 7 ] = cb.y; + normals[ i + 8 ] = cb.z; + + } + + } + + this.normalizeNormals(); + + attributes.normal.needsUpdate = true; + + } + + }, + + merge: function ( geometry, offset ) { + + if ( ! ( geometry && geometry.isBufferGeometry ) ) { + + console.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry ); + return; + + } + + if ( offset === undefined ) { + + offset = 0; + + console.warn( + 'THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. ' + + 'Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge.' + ); + + } + + var attributes = this.attributes; + + for ( var key in attributes ) { + + if ( geometry.attributes[ key ] === undefined ) continue; + + var attribute1 = attributes[ key ]; + var attributeArray1 = attribute1.array; + + var attribute2 = geometry.attributes[ key ]; + var attributeArray2 = attribute2.array; + + var attributeSize = attribute2.itemSize; + + for ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) { + + attributeArray1[ j ] = attributeArray2[ i ]; + + } + + } + + return this; + + }, + + normalizeNormals: function () { + + var vector = new Vector3(); + + return function normalizeNormals() { + + var normals = this.attributes.normal; + + for ( var i = 0, il = normals.count; i < il; i ++ ) { + + vector.x = normals.getX( i ); + vector.y = normals.getY( i ); + vector.z = normals.getZ( i ); + + vector.normalize(); + + normals.setXYZ( i, vector.x, vector.y, vector.z ); + + } + + }; + + }(), + + toNonIndexed: function () { + + if ( this.index === null ) { + + console.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' ); + return this; + + } + + var geometry2 = new BufferGeometry(); + + var indices = this.index.array; + var attributes = this.attributes; + + for ( var name in attributes ) { + + var attribute = attributes[ name ]; + + var array = attribute.array; + var itemSize = attribute.itemSize; + + var array2 = new array.constructor( indices.length * itemSize ); + + var index = 0, index2 = 0; + + for ( var i = 0, l = indices.length; i < l; i ++ ) { + + index = indices[ i ] * itemSize; + + for ( var j = 0; j < itemSize; j ++ ) { + + array2[ index2 ++ ] = array[ index ++ ]; + + } + + } + + geometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) ); + + } + + var groups = this.groups; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + geometry2.addGroup( group.start, group.count, group.materialIndex ); + + } + + return geometry2; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.5, + type: 'BufferGeometry', + generator: 'BufferGeometry.toJSON' + } + }; + + // standard BufferGeometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + if ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData; + + if ( this.parameters !== undefined ) { + + var parameters = this.parameters; + + for ( var key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + data.data = { attributes: {} }; + + var index = this.index; + + if ( index !== null ) { + + var array = Array.prototype.slice.call( index.array ); + + data.data.index = { + type: index.array.constructor.name, + array: array + }; + + } + + var attributes = this.attributes; + + for ( var key in attributes ) { + + var attribute = attributes[ key ]; + + var array = Array.prototype.slice.call( attribute.array ); + + data.data.attributes[ key ] = { + itemSize: attribute.itemSize, + type: attribute.array.constructor.name, + array: array, + normalized: attribute.normalized + }; + + } + + var groups = this.groups; + + if ( groups.length > 0 ) { + + data.data.groups = JSON.parse( JSON.stringify( groups ) ); + + } + + var boundingSphere = this.boundingSphere; + + if ( boundingSphere !== null ) { + + data.data.boundingSphere = { + center: boundingSphere.center.toArray(), + radius: boundingSphere.radius + }; + + } + + return data; + + }, + + clone: function () { + + /* + // Handle primitives + + var parameters = this.parameters; + + if ( parameters !== undefined ) { + + var values = []; + + for ( var key in parameters ) { + + values.push( parameters[ key ] ); + + } + + var geometry = Object.create( this.constructor.prototype ); + this.constructor.apply( geometry, values ); + return geometry; + + } + + return new this.constructor().copy( this ); + */ + + return new BufferGeometry().copy( this ); + + }, + + copy: function ( source ) { + + var name, i, l; + + // reset + + this.index = null; + this.attributes = {}; + this.morphAttributes = {}; + this.groups = []; + this.boundingBox = null; + this.boundingSphere = null; + + // name + + this.name = source.name; + + // index + + var index = source.index; + + if ( index !== null ) { + + this.setIndex( index.clone() ); + + } + + // attributes + + var attributes = source.attributes; + + for ( name in attributes ) { + + var attribute = attributes[ name ]; + this.addAttribute( name, attribute.clone() ); + + } + + // morph attributes + + var morphAttributes = source.morphAttributes; + + for ( name in morphAttributes ) { + + var array = []; + var morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes + + for ( i = 0, l = morphAttribute.length; i < l; i ++ ) { + + array.push( morphAttribute[ i ].clone() ); + + } + + this.morphAttributes[ name ] = array; + + } + + // groups + + var groups = source.groups; + + for ( i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + this.addGroup( group.start, group.count, group.materialIndex ); + + } + + // bounding box + + var boundingBox = source.boundingBox; + + if ( boundingBox !== null ) { + + this.boundingBox = boundingBox.clone(); + + } + + // bounding sphere + + var boundingSphere = source.boundingSphere; + + if ( boundingSphere !== null ) { + + this.boundingSphere = boundingSphere.clone(); + + } + + // draw range + + this.drawRange.start = source.drawRange.start; + this.drawRange.count = source.drawRange.count; + + // user data + + this.userData = source.userData; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + +} ); + + +export { BufferGeometry }; diff --git a/lib/core/Clock.js b/lib/core/Clock.js new file mode 100644 index 0000000..a0bc86f --- /dev/null +++ b/lib/core/Clock.js @@ -0,0 +1,73 @@ +/** + * @author alteredq / http://alteredqualia.com/ + */ + +function Clock( autoStart ) { + + this.autoStart = ( autoStart !== undefined ) ? autoStart : true; + + this.startTime = 0; + this.oldTime = 0; + this.elapsedTime = 0; + + this.running = false; + +} + +Object.assign( Clock.prototype, { + + start: function () { + + this.startTime = ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732 + + this.oldTime = this.startTime; + this.elapsedTime = 0; + this.running = true; + + }, + + stop: function () { + + this.getElapsedTime(); + this.running = false; + this.autoStart = false; + + }, + + getElapsedTime: function () { + + this.getDelta(); + return this.elapsedTime; + + }, + + getDelta: function () { + + var diff = 0; + + if ( this.autoStart && ! this.running ) { + + this.start(); + return 0; + + } + + if ( this.running ) { + + var newTime = ( typeof performance === 'undefined' ? Date : performance ).now(); + + diff = ( newTime - this.oldTime ) / 1000; + this.oldTime = newTime; + + this.elapsedTime += diff; + + } + + return diff; + + } + +} ); + + +export { Clock }; diff --git a/lib/core/DirectGeometry.js b/lib/core/DirectGeometry.js new file mode 100644 index 0000000..006a37b --- /dev/null +++ b/lib/core/DirectGeometry.js @@ -0,0 +1,274 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { Vector2 } from '../math/Vector2.js'; + +function DirectGeometry() { + + this.vertices = []; + this.normals = []; + this.colors = []; + this.uvs = []; + this.uvs2 = []; + + this.groups = []; + + this.morphTargets = {}; + + this.skinWeights = []; + this.skinIndices = []; + + // this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.verticesNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.uvsNeedUpdate = false; + this.groupsNeedUpdate = false; + +} + +Object.assign( DirectGeometry.prototype, { + + computeGroups: function ( geometry ) { + + var group; + var groups = []; + var materialIndex = undefined; + + var faces = geometry.faces; + + for ( var i = 0; i < faces.length; i ++ ) { + + var face = faces[ i ]; + + // materials + + if ( face.materialIndex !== materialIndex ) { + + materialIndex = face.materialIndex; + + if ( group !== undefined ) { + + group.count = ( i * 3 ) - group.start; + groups.push( group ); + + } + + group = { + start: i * 3, + materialIndex: materialIndex + }; + + } + + } + + if ( group !== undefined ) { + + group.count = ( i * 3 ) - group.start; + groups.push( group ); + + } + + this.groups = groups; + + }, + + fromGeometry: function ( geometry ) { + + var faces = geometry.faces; + var vertices = geometry.vertices; + var faceVertexUvs = geometry.faceVertexUvs; + + var hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0; + var hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0; + + // morphs + + var morphTargets = geometry.morphTargets; + var morphTargetsLength = morphTargets.length; + + var morphTargetsPosition; + + if ( morphTargetsLength > 0 ) { + + morphTargetsPosition = []; + + for ( var i = 0; i < morphTargetsLength; i ++ ) { + + morphTargetsPosition[ i ] = { + name: morphTargets[ i ].name, + data: [] + }; + + } + + this.morphTargets.position = morphTargetsPosition; + + } + + var morphNormals = geometry.morphNormals; + var morphNormalsLength = morphNormals.length; + + var morphTargetsNormal; + + if ( morphNormalsLength > 0 ) { + + morphTargetsNormal = []; + + for ( var i = 0; i < morphNormalsLength; i ++ ) { + + morphTargetsNormal[ i ] = { + name: morphNormals[ i ].name, + data: [] + }; + + } + + this.morphTargets.normal = morphTargetsNormal; + + } + + // skins + + var skinIndices = geometry.skinIndices; + var skinWeights = geometry.skinWeights; + + var hasSkinIndices = skinIndices.length === vertices.length; + var hasSkinWeights = skinWeights.length === vertices.length; + + // + + if ( vertices.length > 0 && faces.length === 0 ) { + + console.error( 'THREE.DirectGeometry: Faceless geometries are not supported.' ); + + } + + for ( var i = 0; i < faces.length; i ++ ) { + + var face = faces[ i ]; + + this.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] ); + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + this.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] ); + + } else { + + var normal = face.normal; + + this.normals.push( normal, normal, normal ); + + } + + var vertexColors = face.vertexColors; + + if ( vertexColors.length === 3 ) { + + this.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] ); + + } else { + + var color = face.color; + + this.colors.push( color, color, color ); + + } + + if ( hasFaceVertexUv === true ) { + + var vertexUvs = faceVertexUvs[ 0 ][ i ]; + + if ( vertexUvs !== undefined ) { + + this.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i ); + + this.uvs.push( new Vector2(), new Vector2(), new Vector2() ); + + } + + } + + if ( hasFaceVertexUv2 === true ) { + + var vertexUvs = faceVertexUvs[ 1 ][ i ]; + + if ( vertexUvs !== undefined ) { + + this.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i ); + + this.uvs2.push( new Vector2(), new Vector2(), new Vector2() ); + + } + + } + + // morphs + + for ( var j = 0; j < morphTargetsLength; j ++ ) { + + var morphTarget = morphTargets[ j ].vertices; + + morphTargetsPosition[ j ].data.push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] ); + + } + + for ( var j = 0; j < morphNormalsLength; j ++ ) { + + var morphNormal = morphNormals[ j ].vertexNormals[ i ]; + + morphTargetsNormal[ j ].data.push( morphNormal.a, morphNormal.b, morphNormal.c ); + + } + + // skins + + if ( hasSkinIndices ) { + + this.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] ); + + } + + if ( hasSkinWeights ) { + + this.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] ); + + } + + } + + this.computeGroups( geometry ); + + this.verticesNeedUpdate = geometry.verticesNeedUpdate; + this.normalsNeedUpdate = geometry.normalsNeedUpdate; + this.colorsNeedUpdate = geometry.colorsNeedUpdate; + this.uvsNeedUpdate = geometry.uvsNeedUpdate; + this.groupsNeedUpdate = geometry.groupsNeedUpdate; + + return this; + + } + +} ); + + +export { DirectGeometry }; diff --git a/lib/core/EventDispatcher.js b/lib/core/EventDispatcher.js new file mode 100644 index 0000000..de5ca8e --- /dev/null +++ b/lib/core/EventDispatcher.js @@ -0,0 +1,86 @@ +/** + * https://github.com/mrdoob/eventdispatcher.js/ + */ + +function EventDispatcher() {} + +Object.assign( EventDispatcher.prototype, { + + 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 ); + + } + + }, + + hasEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) return false; + + var listeners = this._listeners; + + return listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1; + + }, + + removeEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) return; + + var listeners = this._listeners; + var listenerArray = listeners[ type ]; + + if ( listenerArray !== undefined ) { + + var index = listenerArray.indexOf( listener ); + + if ( index !== - 1 ) { + + listenerArray.splice( index, 1 ); + + } + + } + + }, + + dispatchEvent: function ( event ) { + + if ( this._listeners === undefined ) return; + + var listeners = this._listeners; + var listenerArray = listeners[ event.type ]; + + if ( listenerArray !== undefined ) { + + event.target = this; + + var array = listenerArray.slice( 0 ); + + for ( var i = 0, l = array.length; i < l; i ++ ) { + + array[ i ].call( this, event ); + + } + + } + + } + +} ); + + +export { EventDispatcher }; diff --git a/lib/core/Face3.js b/lib/core/Face3.js new file mode 100644 index 0000000..b2d76f6 --- /dev/null +++ b/lib/core/Face3.js @@ -0,0 +1,63 @@ +import { Color } from '../math/Color.js'; +import { Vector3 } from '../math/Vector3.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +function Face3( a, b, c, normal, color, materialIndex ) { + + this.a = a; + this.b = b; + this.c = c; + + this.normal = ( normal && normal.isVector3 ) ? normal : new Vector3(); + this.vertexNormals = Array.isArray( normal ) ? normal : []; + + this.color = ( color && color.isColor ) ? color : new Color(); + this.vertexColors = Array.isArray( color ) ? color : []; + + this.materialIndex = materialIndex !== undefined ? materialIndex : 0; + +} + +Object.assign( Face3.prototype, { + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( 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; + + for ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) { + + this.vertexNormals[ i ] = source.vertexNormals[ i ].clone(); + + } + + for ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) { + + this.vertexColors[ i ] = source.vertexColors[ i ].clone(); + + } + + return this; + + } + +} ); + + +export { Face3 }; diff --git a/lib/core/Geometry.js b/lib/core/Geometry.js new file mode 100644 index 0000000..c9a3d74 --- /dev/null +++ b/lib/core/Geometry.js @@ -0,0 +1,1435 @@ +import { EventDispatcher } from './EventDispatcher.js'; +import { Face3 } from './Face3.js'; +import { Matrix3 } from '../math/Matrix3.js'; +import { Sphere } from '../math/Sphere.js'; +import { Box3 } from '../math/Box3.js'; +import { Vector3 } from '../math/Vector3.js'; +import { Matrix4 } from '../math/Matrix4.js'; +import { Vector2 } from '../math/Vector2.js'; +import { Color } from '../math/Color.js'; +import { Object3D } from './Object3D.js'; +import { _Math } from '../math/Math.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author kile / http://kile.stravaganza.org/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author bhouston / http://clara.io + */ + +var geometryId = 0; // Geometry uses even numbers as Id + +function Geometry() { + + Object.defineProperty( this, 'id', { value: geometryId += 2 } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Geometry'; + + this.vertices = []; + this.colors = []; + this.faces = []; + this.faceVertexUvs = [[]]; + + this.morphTargets = []; + this.morphNormals = []; + + this.skinWeights = []; + this.skinIndices = []; + + this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.elementsNeedUpdate = false; + this.verticesNeedUpdate = false; + this.uvsNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.lineDistancesNeedUpdate = false; + this.groupsNeedUpdate = false; + +} + +Geometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: Geometry, + + isGeometry: true, + + applyMatrix: function ( matrix ) { + + var normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + for ( var i = 0, il = this.vertices.length; i < il; i ++ ) { + + var vertex = this.vertices[ i ]; + vertex.applyMatrix4( matrix ); + + } + + for ( var i = 0, il = this.faces.length; i < il; i ++ ) { + + var face = this.faces[ i ]; + face.normal.applyMatrix3( normalMatrix ).normalize(); + + for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + face.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize(); + + } + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + this.verticesNeedUpdate = true; + this.normalsNeedUpdate = true; + + return this; + + }, + + rotateX: function () { + + // rotate geometry around world x-axis + + var m1 = new Matrix4(); + + return function rotateX( angle ) { + + m1.makeRotationX( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateY: function () { + + // rotate geometry around world y-axis + + var m1 = new Matrix4(); + + return function rotateY( angle ) { + + m1.makeRotationY( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateZ: function () { + + // rotate geometry around world z-axis + + var m1 = new Matrix4(); + + return function rotateZ( angle ) { + + m1.makeRotationZ( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + translate: function () { + + // translate geometry + + var m1 = new Matrix4(); + + return function translate( x, y, z ) { + + m1.makeTranslation( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + scale: function () { + + // scale geometry + + var m1 = new Matrix4(); + + return function scale( x, y, z ) { + + m1.makeScale( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + lookAt: function () { + + var obj = new Object3D(); + + return function lookAt( vector ) { + + obj.lookAt( vector ); + + obj.updateMatrix(); + + this.applyMatrix( obj.matrix ); + + }; + + }(), + + fromBufferGeometry: function ( geometry ) { + + var scope = this; + + var indices = geometry.index !== null ? geometry.index.array : undefined; + var attributes = geometry.attributes; + + var positions = attributes.position.array; + var normals = attributes.normal !== undefined ? attributes.normal.array : undefined; + var colors = attributes.color !== undefined ? attributes.color.array : undefined; + var uvs = attributes.uv !== undefined ? attributes.uv.array : undefined; + var uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined; + + if ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = []; + + for ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) { + + scope.vertices.push( new Vector3().fromArray( positions, i ) ); + + if ( colors !== undefined ) { + + scope.colors.push( new Color().fromArray( colors, i ) ); + + } + + } + + function addFace( a, b, c, materialIndex ) { + + var vertexColors = ( colors === undefined ) ? [] : [ + scope.colors[ a ].clone(), + scope.colors[ b ].clone(), + scope.colors[ c ].clone() ]; + + var vertexNormals = ( normals === undefined ) ? [] : [ + new Vector3().fromArray( normals, a * 3 ), + new Vector3().fromArray( normals, b * 3 ), + new Vector3().fromArray( normals, c * 3 ) + ]; + + var face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex ); + + scope.faces.push( face ); + + if ( uvs !== undefined ) { + + scope.faceVertexUvs[ 0 ].push( [ + new Vector2().fromArray( uvs, a * 2 ), + new Vector2().fromArray( uvs, b * 2 ), + new Vector2().fromArray( uvs, c * 2 ) + ] ); + + } + + if ( uvs2 !== undefined ) { + + scope.faceVertexUvs[ 1 ].push( [ + new Vector2().fromArray( uvs2, a * 2 ), + new Vector2().fromArray( uvs2, b * 2 ), + new Vector2().fromArray( uvs2, c * 2 ) + ] ); + + } + + } + + var groups = geometry.groups; + + if ( groups.length > 0 ) { + + for ( var i = 0; i < groups.length; i ++ ) { + + var group = groups[ i ]; + + var start = group.start; + var count = group.count; + + for ( var j = start, jl = start + count; j < jl; j += 3 ) { + + if ( indices !== undefined ) { + + addFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex ); + + } else { + + addFace( j, j + 1, j + 2, group.materialIndex ); + + } + + } + + } + + } else { + + if ( indices !== undefined ) { + + for ( var i = 0; i < indices.length; i += 3 ) { + + addFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] ); + + } + + } else { + + for ( var i = 0; i < positions.length / 3; i += 3 ) { + + addFace( i, i + 1, i + 2 ); + + } + + } + + } + + this.computeFaceNormals(); + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + return this; + + }, + + center: function () { + + var offset = new Vector3(); + + return function center() { + + this.computeBoundingBox(); + + this.boundingBox.getCenter( offset ).negate(); + + this.translate( offset.x, offset.y, offset.z ); + + return this; + + }; + + }(), + + normalize: function () { + + this.computeBoundingSphere(); + + var center = this.boundingSphere.center; + var radius = this.boundingSphere.radius; + + var s = radius === 0 ? 1 : 1.0 / radius; + + var matrix = new Matrix4(); + matrix.set( + s, 0, 0, - s * center.x, + 0, s, 0, - s * center.y, + 0, 0, s, - s * center.z, + 0, 0, 0, 1 + ); + + this.applyMatrix( matrix ); + + return this; + + }, + + computeFaceNormals: function () { + + var cb = new Vector3(), ab = new Vector3(); + + for ( var f = 0, fl = this.faces.length; f < fl; f ++ ) { + + var face = this.faces[ f ]; + + var vA = this.vertices[ face.a ]; + var vB = this.vertices[ face.b ]; + var vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + cb.normalize(); + + face.normal.copy( cb ); + + } + + }, + + computeVertexNormals: function ( areaWeighted ) { + + if ( areaWeighted === undefined ) areaWeighted = true; + + var v, vl, f, fl, face, vertices; + + vertices = new Array( this.vertices.length ); + + for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ] = new Vector3(); + + } + + if ( areaWeighted ) { + + // vertex normals weighted by triangle areas + // http://www.iquilezles.org/www/articles/normals/normals.htm + + var vA, vB, vC; + var cb = new Vector3(), ab = new Vector3(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + vA = this.vertices[ face.a ]; + vB = this.vertices[ face.b ]; + vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + vertices[ face.a ].add( cb ); + vertices[ face.b ].add( cb ); + vertices[ face.c ].add( cb ); + + } + + } else { + + this.computeFaceNormals(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + vertices[ face.a ].add( face.normal ); + vertices[ face.b ].add( face.normal ); + vertices[ face.c ].add( face.normal ); + + } + + } + + for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ].normalize(); + + } + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + vertexNormals[ 0 ].copy( vertices[ face.a ] ); + vertexNormals[ 1 ].copy( vertices[ face.b ] ); + vertexNormals[ 2 ].copy( vertices[ face.c ] ); + + } else { + + vertexNormals[ 0 ] = vertices[ face.a ].clone(); + vertexNormals[ 1 ] = vertices[ face.b ].clone(); + vertexNormals[ 2 ] = vertices[ face.c ].clone(); + + } + + } + + if ( this.faces.length > 0 ) { + + this.normalsNeedUpdate = true; + + } + + }, + + computeFlatVertexNormals: function () { + + var f, fl, face; + + this.computeFaceNormals(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + vertexNormals[ 0 ].copy( face.normal ); + vertexNormals[ 1 ].copy( face.normal ); + vertexNormals[ 2 ].copy( face.normal ); + + } else { + + vertexNormals[ 0 ] = face.normal.clone(); + vertexNormals[ 1 ] = face.normal.clone(); + vertexNormals[ 2 ] = face.normal.clone(); + + } + + } + + if ( this.faces.length > 0 ) { + + this.normalsNeedUpdate = true; + + } + + }, + + computeMorphNormals: function () { + + var i, il, f, fl, face; + + // save original normals + // - create temp variables on first access + // otherwise just copy (for faster repeated calls) + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + if ( ! face.__originalFaceNormal ) { + + face.__originalFaceNormal = face.normal.clone(); + + } else { + + face.__originalFaceNormal.copy( face.normal ); + + } + + if ( ! face.__originalVertexNormals ) face.__originalVertexNormals = []; + + for ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) { + + if ( ! face.__originalVertexNormals[ i ] ) { + + face.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone(); + + } else { + + face.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] ); + + } + + } + + } + + // use temp geometry to compute face and vertex normals for each morph + + var tmpGeo = new Geometry(); + tmpGeo.faces = this.faces; + + for ( i = 0, il = this.morphTargets.length; i < il; i ++ ) { + + // create on first access + + if ( ! this.morphNormals[ i ] ) { + + this.morphNormals[ i ] = {}; + this.morphNormals[ i ].faceNormals = []; + this.morphNormals[ i ].vertexNormals = []; + + var dstNormalsFace = this.morphNormals[ i ].faceNormals; + var dstNormalsVertex = this.morphNormals[ i ].vertexNormals; + + var faceNormal, vertexNormals; + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + faceNormal = new Vector3(); + vertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() }; + + dstNormalsFace.push( faceNormal ); + dstNormalsVertex.push( vertexNormals ); + + } + + } + + var morphNormals = this.morphNormals[ i ]; + + // set vertices to morph target + + tmpGeo.vertices = this.morphTargets[ i ].vertices; + + // compute morph normals + + tmpGeo.computeFaceNormals(); + tmpGeo.computeVertexNormals(); + + // store morph normals + + var faceNormal, vertexNormals; + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + faceNormal = morphNormals.faceNormals[ f ]; + vertexNormals = morphNormals.vertexNormals[ f ]; + + faceNormal.copy( face.normal ); + + vertexNormals.a.copy( face.vertexNormals[ 0 ] ); + vertexNormals.b.copy( face.vertexNormals[ 1 ] ); + vertexNormals.c.copy( face.vertexNormals[ 2 ] ); + + } + + } + + // restore original normals + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + face.normal = face.__originalFaceNormal; + face.vertexNormals = face.__originalVertexNormals; + + } + + }, + + computeBoundingBox: function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + this.boundingBox.setFromPoints( this.vertices ); + + }, + + computeBoundingSphere: function () { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + this.boundingSphere.setFromPoints( this.vertices ); + + }, + + merge: function ( geometry, matrix, materialIndexOffset ) { + + if ( ! ( geometry && geometry.isGeometry ) ) { + + console.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry ); + return; + + } + + var normalMatrix, + vertexOffset = this.vertices.length, + vertices1 = this.vertices, + vertices2 = geometry.vertices, + faces1 = this.faces, + faces2 = geometry.faces, + uvs1 = this.faceVertexUvs[ 0 ], + uvs2 = geometry.faceVertexUvs[ 0 ], + colors1 = this.colors, + colors2 = geometry.colors; + + if ( materialIndexOffset === undefined ) materialIndexOffset = 0; + + if ( matrix !== undefined ) { + + normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + } + + // vertices + + for ( var i = 0, il = vertices2.length; i < il; i ++ ) { + + var vertex = vertices2[ i ]; + + var vertexCopy = vertex.clone(); + + if ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix ); + + vertices1.push( vertexCopy ); + + } + + // colors + + for ( var i = 0, il = colors2.length; i < il; i ++ ) { + + colors1.push( colors2[ i ].clone() ); + + } + + // faces + + for ( i = 0, il = faces2.length; i < il; i ++ ) { + + var face = faces2[ i ], faceCopy, normal, color, + faceVertexNormals = face.vertexNormals, + faceVertexColors = face.vertexColors; + + faceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset ); + faceCopy.normal.copy( face.normal ); + + if ( normalMatrix !== undefined ) { + + faceCopy.normal.applyMatrix3( normalMatrix ).normalize(); + + } + + for ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) { + + normal = faceVertexNormals[ j ].clone(); + + if ( normalMatrix !== undefined ) { + + normal.applyMatrix3( normalMatrix ).normalize(); + + } + + faceCopy.vertexNormals.push( normal ); + + } + + faceCopy.color.copy( face.color ); + + for ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) { + + color = faceVertexColors[ j ]; + faceCopy.vertexColors.push( color.clone() ); + + } + + faceCopy.materialIndex = face.materialIndex + materialIndexOffset; + + faces1.push( faceCopy ); + + } + + // uvs + + for ( i = 0, il = uvs2.length; i < il; i ++ ) { + + var uv = uvs2[ i ], uvCopy = []; + + if ( uv === undefined ) { + + continue; + + } + + for ( var j = 0, jl = uv.length; j < jl; j ++ ) { + + uvCopy.push( uv[ j ].clone() ); + + } + + uvs1.push( uvCopy ); + + } + + }, + + mergeMesh: function ( mesh ) { + + if ( ! ( mesh && mesh.isMesh ) ) { + + console.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh ); + return; + + } + + if ( mesh.matrixAutoUpdate ) mesh.updateMatrix(); + + this.merge( mesh.geometry, mesh.matrix ); + + }, + + /* + * Checks for duplicate vertices with hashmap. + * Duplicated vertices are removed + * and faces' vertices are updated. + */ + + mergeVertices: function () { + + var verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique) + var unique = [], changes = []; + + var v, key; + var precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001 + var precision = Math.pow( 10, precisionPoints ); + var i, il, face; + var 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. + var 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 ( var n = 0; n < 3; n ++ ) { + + if ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) { + + faceIndicesToRemove.push( i ); + break; + + } + + } + + } + + for ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) { + + var 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 + + var diff = this.vertices.length - unique.length; + this.vertices = unique; + return diff; + + }, + + setFromPoints: function ( points ) { + + this.vertices = []; + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + var point = points[ i ]; + this.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) ); + + } + + return this; + + }, + + sortFacesByMaterialIndex: function () { + + var faces = this.faces; + var length = faces.length; + + // tag faces + + for ( var i = 0; i < length; i ++ ) { + + faces[ i ]._id = i; + + } + + // sort faces + + function materialIndexSort( a, b ) { + + return a.materialIndex - b.materialIndex; + + } + + faces.sort( materialIndexSort ); + + // sort uvs + + var uvs1 = this.faceVertexUvs[ 0 ]; + var uvs2 = this.faceVertexUvs[ 1 ]; + + var newUvs1, newUvs2; + + if ( uvs1 && uvs1.length === length ) newUvs1 = []; + if ( uvs2 && uvs2.length === length ) newUvs2 = []; + + for ( var i = 0; i < length; i ++ ) { + + var id = faces[ i ]._id; + + if ( newUvs1 ) newUvs1.push( uvs1[ id ] ); + if ( newUvs2 ) newUvs2.push( uvs2[ id ] ); + + } + + if ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1; + if ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.5, + type: 'Geometry', + generator: 'Geometry.toJSON' + } + }; + + // standard Geometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + + if ( this.parameters !== undefined ) { + + var parameters = this.parameters; + + for ( var key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + var vertices = []; + + for ( var i = 0; i < this.vertices.length; i ++ ) { + + var vertex = this.vertices[ i ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + var faces = []; + var normals = []; + var normalsHash = {}; + var colors = []; + var colorsHash = {}; + var uvs = []; + var uvsHash = {}; + + for ( var i = 0; i < this.faces.length; i ++ ) { + + var face = this.faces[ i ]; + + var hasMaterial = true; + var hasFaceUv = false; // deprecated + var hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined; + var hasFaceNormal = face.normal.length() > 0; + var hasFaceVertexNormal = face.vertexNormals.length > 0; + var hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1; + var hasFaceVertexColor = face.vertexColors.length > 0; + + var faceType = 0; + + faceType = setBit( faceType, 0, 0 ); // isQuad + faceType = setBit( faceType, 1, hasMaterial ); + faceType = setBit( faceType, 2, hasFaceUv ); + faceType = setBit( faceType, 3, hasFaceVertexUv ); + faceType = setBit( faceType, 4, hasFaceNormal ); + faceType = setBit( faceType, 5, hasFaceVertexNormal ); + faceType = setBit( faceType, 6, hasFaceColor ); + faceType = setBit( faceType, 7, hasFaceVertexColor ); + + faces.push( faceType ); + faces.push( face.a, face.b, face.c ); + faces.push( face.materialIndex ); + + if ( hasFaceVertexUv ) { + + var faceVertexUvs = this.faceVertexUvs[ 0 ][ i ]; + + faces.push( + getUvIndex( faceVertexUvs[ 0 ] ), + getUvIndex( faceVertexUvs[ 1 ] ), + getUvIndex( faceVertexUvs[ 2 ] ) + ); + + } + + if ( hasFaceNormal ) { + + faces.push( getNormalIndex( face.normal ) ); + + } + + if ( hasFaceVertexNormal ) { + + var vertexNormals = face.vertexNormals; + + faces.push( + getNormalIndex( vertexNormals[ 0 ] ), + getNormalIndex( vertexNormals[ 1 ] ), + getNormalIndex( vertexNormals[ 2 ] ) + ); + + } + + if ( hasFaceColor ) { + + faces.push( getColorIndex( face.color ) ); + + } + + if ( hasFaceVertexColor ) { + + var vertexColors = face.vertexColors; + + faces.push( + getColorIndex( vertexColors[ 0 ] ), + getColorIndex( vertexColors[ 1 ] ), + getColorIndex( vertexColors[ 2 ] ) + ); + + } + + } + + function setBit( value, position, enabled ) { + + return enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) ); + + } + + function getNormalIndex( normal ) { + + var hash = normal.x.toString() + normal.y.toString() + normal.z.toString(); + + if ( normalsHash[ hash ] !== undefined ) { + + return normalsHash[ hash ]; + + } + + normalsHash[ hash ] = normals.length / 3; + normals.push( normal.x, normal.y, normal.z ); + + return normalsHash[ hash ]; + + } + + function getColorIndex( color ) { + + var hash = color.r.toString() + color.g.toString() + color.b.toString(); + + if ( colorsHash[ hash ] !== undefined ) { + + return colorsHash[ hash ]; + + } + + colorsHash[ hash ] = colors.length; + colors.push( color.getHex() ); + + return colorsHash[ hash ]; + + } + + function getUvIndex( uv ) { + + var hash = uv.x.toString() + uv.y.toString(); + + if ( uvsHash[ hash ] !== undefined ) { + + return uvsHash[ hash ]; + + } + + uvsHash[ hash ] = uvs.length / 2; + uvs.push( uv.x, uv.y ); + + return uvsHash[ hash ]; + + } + + data.data = {}; + + data.data.vertices = vertices; + data.data.normals = normals; + if ( colors.length > 0 ) data.data.colors = colors; + if ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility + data.data.faces = faces; + + return data; + + }, + + clone: function () { + + /* + // Handle primitives + + var parameters = this.parameters; + + if ( parameters !== undefined ) { + + var values = []; + + for ( var key in parameters ) { + + values.push( parameters[ key ] ); + + } + + var geometry = Object.create( this.constructor.prototype ); + this.constructor.apply( geometry, values ); + return geometry; + + } + + return new this.constructor().copy( this ); + */ + + return new Geometry().copy( this ); + + }, + + copy: function ( source ) { + + var i, il, j, jl, k, kl; + + // reset + + this.vertices = []; + this.colors = []; + this.faces = []; + this.faceVertexUvs = [[]]; + this.morphTargets = []; + this.morphNormals = []; + this.skinWeights = []; + this.skinIndices = []; + this.lineDistances = []; + this.boundingBox = null; + this.boundingSphere = null; + + // name + + this.name = source.name; + + // vertices + + var vertices = source.vertices; + + for ( i = 0, il = vertices.length; i < il; i ++ ) { + + this.vertices.push( vertices[ i ].clone() ); + + } + + // colors + + var colors = source.colors; + + for ( i = 0, il = colors.length; i < il; i ++ ) { + + this.colors.push( colors[ i ].clone() ); + + } + + // faces + + var faces = source.faces; + + for ( i = 0, il = faces.length; i < il; i ++ ) { + + this.faces.push( faces[ i ].clone() ); + + } + + // face vertex uvs + + for ( i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) { + + var faceVertexUvs = source.faceVertexUvs[ i ]; + + if ( this.faceVertexUvs[ i ] === undefined ) { + + this.faceVertexUvs[ i ] = []; + + } + + for ( j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) { + + var uvs = faceVertexUvs[ j ], uvsCopy = []; + + for ( k = 0, kl = uvs.length; k < kl; k ++ ) { + + var uv = uvs[ k ]; + + uvsCopy.push( uv.clone() ); + + } + + this.faceVertexUvs[ i ].push( uvsCopy ); + + } + + } + + // morph targets + + var morphTargets = source.morphTargets; + + for ( i = 0, il = morphTargets.length; i < il; i ++ ) { + + var morphTarget = {}; + morphTarget.name = morphTargets[ i ].name; + + // vertices + + if ( morphTargets[ i ].vertices !== undefined ) { + + morphTarget.vertices = []; + + for ( j = 0, jl = morphTargets[ i ].vertices.length; j < jl; j ++ ) { + + morphTarget.vertices.push( morphTargets[ i ].vertices[ j ].clone() ); + + } + + } + + // normals + + if ( morphTargets[ i ].normals !== undefined ) { + + morphTarget.normals = []; + + for ( j = 0, jl = morphTargets[ i ].normals.length; j < jl; j ++ ) { + + morphTarget.normals.push( morphTargets[ i ].normals[ j ].clone() ); + + } + + } + + this.morphTargets.push( morphTarget ); + + } + + // morph normals + + var morphNormals = source.morphNormals; + + for ( i = 0, il = morphNormals.length; i < il; i ++ ) { + + var morphNormal = {}; + + // vertex normals + + if ( morphNormals[ i ].vertexNormals !== undefined ) { + + morphNormal.vertexNormals = []; + + for ( j = 0, jl = morphNormals[ i ].vertexNormals.length; j < jl; j ++ ) { + + var srcVertexNormal = morphNormals[ i ].vertexNormals[ j ]; + var destVertexNormal = {}; + + destVertexNormal.a = srcVertexNormal.a.clone(); + destVertexNormal.b = srcVertexNormal.b.clone(); + destVertexNormal.c = srcVertexNormal.c.clone(); + + morphNormal.vertexNormals.push( destVertexNormal ); + + } + + } + + // face normals + + if ( morphNormals[ i ].faceNormals !== undefined ) { + + morphNormal.faceNormals = []; + + for ( j = 0, jl = morphNormals[ i ].faceNormals.length; j < jl; j ++ ) { + + morphNormal.faceNormals.push( morphNormals[ i ].faceNormals[ j ].clone() ); + + } + + } + + this.morphNormals.push( morphNormal ); + + } + + // skin weights + + var skinWeights = source.skinWeights; + + for ( i = 0, il = skinWeights.length; i < il; i ++ ) { + + this.skinWeights.push( skinWeights[ i ].clone() ); + + } + + // skin indices + + var skinIndices = source.skinIndices; + + for ( i = 0, il = skinIndices.length; i < il; i ++ ) { + + this.skinIndices.push( skinIndices[ i ].clone() ); + + } + + // line distances + + var lineDistances = source.lineDistances; + + for ( i = 0, il = lineDistances.length; i < il; i ++ ) { + + this.lineDistances.push( lineDistances[ i ] ); + + } + + // bounding box + + var boundingBox = source.boundingBox; + + if ( boundingBox !== null ) { + + this.boundingBox = boundingBox.clone(); + + } + + // bounding sphere + + var boundingSphere = source.boundingSphere; + + if ( boundingSphere !== null ) { + + this.boundingSphere = boundingSphere.clone(); + + } + + // update flags + + this.elementsNeedUpdate = source.elementsNeedUpdate; + this.verticesNeedUpdate = source.verticesNeedUpdate; + this.uvsNeedUpdate = source.uvsNeedUpdate; + this.normalsNeedUpdate = source.normalsNeedUpdate; + this.colorsNeedUpdate = source.colorsNeedUpdate; + this.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate; + this.groupsNeedUpdate = source.groupsNeedUpdate; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + +} ); + + +export { Geometry }; diff --git a/lib/core/InstancedBufferAttribute.js b/lib/core/InstancedBufferAttribute.js new file mode 100644 index 0000000..75144f2 --- /dev/null +++ b/lib/core/InstancedBufferAttribute.js @@ -0,0 +1,45 @@ +import { BufferAttribute } from './BufferAttribute.js'; + +/** + * @author benaadams / https://twitter.com/ben_a_adams + */ + +function InstancedBufferAttribute( array, itemSize, normalized, meshPerAttribute ) { + + if ( typeof ( normalized ) === 'number' ) { + + meshPerAttribute = normalized; + + normalized = false; + + console.error( 'THREE.InstancedBufferAttribute: The constructor now expects normalized as the third argument.' ); + + } + + BufferAttribute.call( this, array, itemSize, normalized ); + + this.meshPerAttribute = meshPerAttribute || 1; + +} + +InstancedBufferAttribute.prototype = Object.assign( Object.create( BufferAttribute.prototype ), { + + constructor: InstancedBufferAttribute, + + isInstancedBufferAttribute: true, + + copy: function ( source ) { + + BufferAttribute.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + } + +} ); + + + +export { InstancedBufferAttribute }; diff --git a/lib/core/InstancedBufferGeometry.js b/lib/core/InstancedBufferGeometry.js new file mode 100644 index 0000000..a021bbf --- /dev/null +++ b/lib/core/InstancedBufferGeometry.js @@ -0,0 +1,40 @@ +import { BufferGeometry } from './BufferGeometry.js'; + +/** + * @author benaadams / https://twitter.com/ben_a_adams + */ + +function InstancedBufferGeometry() { + + BufferGeometry.call( this ); + + this.type = 'InstancedBufferGeometry'; + this.maxInstancedCount = undefined; + +} + +InstancedBufferGeometry.prototype = Object.assign( Object.create( BufferGeometry.prototype ), { + + constructor: InstancedBufferGeometry, + + isInstancedBufferGeometry: true, + + copy: function ( source ) { + + BufferGeometry.prototype.copy.call( this, source ); + + this.maxInstancedCount = source.maxInstancedCount; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + } + +} ); + +export { InstancedBufferGeometry }; diff --git a/lib/core/InstancedInterleavedBuffer.js b/lib/core/InstancedInterleavedBuffer.js new file mode 100644 index 0000000..12bc90b --- /dev/null +++ b/lib/core/InstancedInterleavedBuffer.js @@ -0,0 +1,33 @@ +import { InterleavedBuffer } from './InterleavedBuffer.js'; + +/** + * @author benaadams / https://twitter.com/ben_a_adams + */ + +function InstancedInterleavedBuffer( array, stride, meshPerAttribute ) { + + InterleavedBuffer.call( this, array, stride ); + + this.meshPerAttribute = meshPerAttribute || 1; + +} + +InstancedInterleavedBuffer.prototype = Object.assign( Object.create( InterleavedBuffer.prototype ), { + + constructor: InstancedInterleavedBuffer, + + isInstancedInterleavedBuffer: true, + + copy: function ( source ) { + + InterleavedBuffer.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + } + +} ); + +export { InstancedInterleavedBuffer }; diff --git a/lib/core/InterleavedBuffer.js b/lib/core/InterleavedBuffer.js new file mode 100644 index 0000000..dd63120 --- /dev/null +++ b/lib/core/InterleavedBuffer.js @@ -0,0 +1,111 @@ + +/** + * @author benaadams / https://twitter.com/ben_a_adams + */ + +function InterleavedBuffer( array, stride ) { + + this.array = array; + this.stride = stride; + this.count = array !== undefined ? array.length / stride : 0; + + this.dynamic = false; + this.updateRange = { offset: 0, count: - 1 }; + + this.version = 0; + +} + +Object.defineProperty( InterleavedBuffer.prototype, 'needsUpdate', { + + set: function ( value ) { + + if ( value === true ) this.version ++; + + } + +} ); + +Object.assign( InterleavedBuffer.prototype, { + + isInterleavedBuffer: true, + + onUploadCallback: function () {}, + + setArray: function ( array ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.count = array !== undefined ? array.length / this.stride : 0; + this.array = array; + + return this; + + }, + + setDynamic: function ( value ) { + + this.dynamic = value; + + return this; + + }, + + copy: function ( source ) { + + this.array = new source.array.constructor( source.array ); + this.count = source.count; + this.stride = source.stride; + this.dynamic = source.dynamic; + + return this; + + }, + + copyAt: function ( index1, attribute, index2 ) { + + index1 *= this.stride; + index2 *= attribute.stride; + + for ( var i = 0, l = this.stride; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + }, + + set: function ( value, offset ) { + + if ( offset === undefined ) offset = 0; + + this.array.set( value, offset ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + onUpload: function ( callback ) { + + this.onUploadCallback = callback; + + return this; + + } + +} ); + + +export { InterleavedBuffer }; diff --git a/lib/core/InterleavedBufferAttribute.js b/lib/core/InterleavedBufferAttribute.js new file mode 100644 index 0000000..3cfefca --- /dev/null +++ b/lib/core/InterleavedBufferAttribute.js @@ -0,0 +1,139 @@ + +/** + * @author benaadams / https://twitter.com/ben_a_adams + */ + +function InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) { + + this.data = interleavedBuffer; + this.itemSize = itemSize; + this.offset = offset; + + this.normalized = normalized === true; + +} + +Object.defineProperties( InterleavedBufferAttribute.prototype, { + + count: { + + get: function () { + + return this.data.count; + + } + + }, + + array: { + + get: function () { + + return this.data.array; + + } + + } + +} ); + +Object.assign( InterleavedBufferAttribute.prototype, { + + isInterleavedBufferAttribute: true, + + setX: function ( index, x ) { + + this.data.array[ index * this.data.stride + this.offset ] = x; + + return this; + + }, + + setY: function ( index, y ) { + + this.data.array[ index * this.data.stride + this.offset + 1 ] = y; + + return this; + + }, + + setZ: function ( index, z ) { + + this.data.array[ index * this.data.stride + this.offset + 2 ] = z; + + return this; + + }, + + setW: function ( index, w ) { + + this.data.array[ index * this.data.stride + this.offset + 3 ] = w; + + return this; + + }, + + getX: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset ]; + + }, + + getY: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 1 ]; + + }, + + getZ: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 2 ]; + + }, + + getW: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 3 ]; + + }, + + setXY: function ( index, x, y ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + + return this; + + }, + + setXYZ: function ( index, x, y, z ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + + return this; + + }, + + setXYZW: function ( index, x, y, z, w ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + this.data.array[ index + 3 ] = w; + + return this; + + } + +} ); + + +export { InterleavedBufferAttribute }; diff --git a/lib/core/Layers.js b/lib/core/Layers.js new file mode 100644 index 0000000..345b9cb --- /dev/null +++ b/lib/core/Layers.js @@ -0,0 +1,46 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function Layers() { + + this.mask = 1 | 0; + +} + +Object.assign( Layers.prototype, { + + set: function ( channel ) { + + this.mask = 1 << channel | 0; + + }, + + enable: function ( channel ) { + + this.mask |= 1 << channel | 0; + + }, + + toggle: function ( channel ) { + + this.mask ^= 1 << channel | 0; + + }, + + disable: function ( channel ) { + + this.mask &= ~ ( 1 << channel | 0 ); + + }, + + test: function ( layers ) { + + return ( this.mask & layers.mask ) !== 0; + + } + +} ); + + +export { Layers }; diff --git a/lib/core/Object3D.js b/lib/core/Object3D.js new file mode 100644 index 0000000..f7a47a2 --- /dev/null +++ b/lib/core/Object3D.js @@ -0,0 +1,893 @@ +import { Quaternion } from '../math/Quaternion.js'; +import { Vector3 } from '../math/Vector3.js'; +import { Matrix4 } from '../math/Matrix4.js'; +import { EventDispatcher } from './EventDispatcher.js'; +import { Euler } from '../math/Euler.js'; +import { Layers } from './Layers.js'; +import { Matrix3 } from '../math/Matrix3.js'; +import { _Math } from '../math/Math.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author elephantatwork / www.elephantatwork.ch + */ + +var object3DId = 0; + +function Object3D() { + + Object.defineProperty( this, 'id', { value: object3DId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Object3D'; + + this.parent = null; + this.children = []; + + this.up = Object3D.DefaultUp.clone(); + + var position = new Vector3(); + var rotation = new Euler(); + var quaternion = new Quaternion(); + var scale = new Vector3( 1, 1, 1 ); + + function onRotationChange() { + + quaternion.setFromEuler( rotation, false ); + + } + + function onQuaternionChange() { + + rotation.setFromQuaternion( quaternion, undefined, false ); + + } + + rotation.onChange( onRotationChange ); + quaternion.onChange( onQuaternionChange ); + + Object.defineProperties( this, { + position: { + configurable: true, + enumerable: true, + value: position + }, + rotation: { + configurable: true, + enumerable: true, + value: rotation + }, + quaternion: { + configurable: true, + enumerable: true, + value: quaternion + }, + scale: { + configurable: true, + enumerable: true, + value: scale + }, + modelViewMatrix: { + value: new Matrix4() + }, + normalMatrix: { + value: new Matrix3() + } + } ); + + this.matrix = new Matrix4(); + this.matrixWorld = new Matrix4(); + + this.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate; + this.matrixWorldNeedsUpdate = false; + + this.layers = new Layers(); + this.visible = true; + + this.castShadow = false; + this.receiveShadow = false; + + this.frustumCulled = true; + this.renderOrder = 0; + + this.userData = {}; + +} + +Object3D.DefaultUp = new Vector3( 0, 1, 0 ); +Object3D.DefaultMatrixAutoUpdate = true; + +Object3D.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: Object3D, + + isObject3D: true, + + onBeforeRender: function () {}, + onAfterRender: function () {}, + + applyMatrix: function ( matrix ) { + + this.matrix.multiplyMatrices( matrix, this.matrix ); + + this.matrix.decompose( this.position, this.quaternion, this.scale ); + + }, + + applyQuaternion: function ( q ) { + + this.quaternion.premultiply( q ); + + return this; + + }, + + setRotationFromAxisAngle: function ( axis, angle ) { + + // assumes axis is normalized + + this.quaternion.setFromAxisAngle( axis, angle ); + + }, + + setRotationFromEuler: function ( euler ) { + + this.quaternion.setFromEuler( euler, true ); + + }, + + setRotationFromMatrix: function ( m ) { + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + this.quaternion.setFromRotationMatrix( m ); + + }, + + setRotationFromQuaternion: function ( q ) { + + // assumes q is normalized + + this.quaternion.copy( q ); + + }, + + rotateOnAxis: function () { + + // rotate object on axis in object space + // axis is assumed to be normalized + + var q1 = new Quaternion(); + + return function rotateOnAxis( axis, angle ) { + + q1.setFromAxisAngle( axis, angle ); + + this.quaternion.multiply( q1 ); + + return this; + + }; + + }(), + + rotateOnWorldAxis: function () { + + // rotate object on axis in world space + // axis is assumed to be normalized + // method assumes no rotated parent + + var q1 = new Quaternion(); + + return function rotateOnWorldAxis( axis, angle ) { + + q1.setFromAxisAngle( axis, angle ); + + this.quaternion.premultiply( q1 ); + + return this; + + }; + + }(), + + rotateX: function () { + + var v1 = new Vector3( 1, 0, 0 ); + + return function rotateX( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + rotateY: function () { + + var v1 = new Vector3( 0, 1, 0 ); + + return function rotateY( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + rotateZ: function () { + + var v1 = new Vector3( 0, 0, 1 ); + + return function rotateZ( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + translateOnAxis: function () { + + // translate object by distance along axis in object space + // axis is assumed to be normalized + + var v1 = new Vector3(); + + return function translateOnAxis( axis, distance ) { + + v1.copy( axis ).applyQuaternion( this.quaternion ); + + this.position.add( v1.multiplyScalar( distance ) ); + + return this; + + }; + + }(), + + translateX: function () { + + var v1 = new Vector3( 1, 0, 0 ); + + return function translateX( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + translateY: function () { + + var v1 = new Vector3( 0, 1, 0 ); + + return function translateY( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + translateZ: function () { + + var v1 = new Vector3( 0, 0, 1 ); + + return function translateZ( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + localToWorld: function ( vector ) { + + return vector.applyMatrix4( this.matrixWorld ); + + }, + + worldToLocal: function () { + + var m1 = new Matrix4(); + + return function worldToLocal( vector ) { + + return vector.applyMatrix4( m1.getInverse( this.matrixWorld ) ); + + }; + + }(), + + lookAt: function () { + + // This method does not support objects having non-uniformly-scaled parent(s) + + var q1 = new Quaternion(); + var m1 = new Matrix4(); + var target = new Vector3(); + var position = new Vector3(); + + return function lookAt( x, y, z ) { + + if ( x.isVector3 ) { + + target.copy( x ); + + } else { + + target.set( x, y, z ); + + } + + var parent = this.parent; + + this.updateWorldMatrix( true, false ); + + position.setFromMatrixPosition( this.matrixWorld ); + + if ( this.isCamera ) { + + m1.lookAt( position, target, this.up ); + + } else { + + m1.lookAt( target, position, this.up ); + + } + + this.quaternion.setFromRotationMatrix( m1 ); + + if ( parent ) { + + m1.extractRotation( parent.matrixWorld ); + q1.setFromRotationMatrix( m1 ); + this.quaternion.premultiply( q1.inverse() ); + + } + + }; + + }(), + + add: function ( object ) { + + if ( arguments.length > 1 ) { + + for ( var i = 0; i < arguments.length; i ++ ) { + + this.add( arguments[ i ] ); + + } + + return this; + + } + + if ( object === this ) { + + console.error( "THREE.Object3D.add: object can't be added as a child of itself.", object ); + return this; + + } + + if ( ( object && object.isObject3D ) ) { + + if ( object.parent !== null ) { + + object.parent.remove( object ); + + } + + object.parent = this; + object.dispatchEvent( { type: 'added' } ); + + this.children.push( object ); + + } else { + + console.error( "THREE.Object3D.add: object not an instance of THREE.Object3D.", object ); + + } + + return this; + + }, + + remove: function ( object ) { + + if ( arguments.length > 1 ) { + + for ( var i = 0; i < arguments.length; i ++ ) { + + this.remove( arguments[ i ] ); + + } + + return this; + + } + + var index = this.children.indexOf( object ); + + if ( index !== - 1 ) { + + object.parent = null; + + object.dispatchEvent( { type: 'removed' } ); + + this.children.splice( index, 1 ); + + } + + return this; + + }, + + getObjectById: function ( id ) { + + return this.getObjectByProperty( 'id', id ); + + }, + + getObjectByName: function ( name ) { + + return this.getObjectByProperty( 'name', name ); + + }, + + getObjectByProperty: function ( name, value ) { + + if ( this[ name ] === value ) return this; + + for ( var i = 0, l = this.children.length; i < l; i ++ ) { + + var child = this.children[ i ]; + var object = child.getObjectByProperty( name, value ); + + if ( object !== undefined ) { + + return object; + + } + + } + + return undefined; + + }, + + getWorldPosition: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Object3D: .getWorldPosition() target is now required' ); + target = new Vector3(); + + } + + this.updateMatrixWorld( true ); + + return target.setFromMatrixPosition( this.matrixWorld ); + + }, + + getWorldQuaternion: function () { + + var position = new Vector3(); + var scale = new Vector3(); + + return function getWorldQuaternion( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Object3D: .getWorldQuaternion() target is now required' ); + target = new Quaternion(); + + } + + this.updateMatrixWorld( true ); + + this.matrixWorld.decompose( position, target, scale ); + + return target; + + }; + + }(), + + getWorldScale: function () { + + var position = new Vector3(); + var quaternion = new Quaternion(); + + return function getWorldScale( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Object3D: .getWorldScale() target is now required' ); + target = new Vector3(); + + } + + this.updateMatrixWorld( true ); + + this.matrixWorld.decompose( position, quaternion, target ); + + return target; + + }; + + }(), + + getWorldDirection: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Object3D: .getWorldDirection() target is now required' ); + target = new Vector3(); + + } + + this.updateMatrixWorld( true ); + + var e = this.matrixWorld.elements; + + return target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize(); + + }, + + raycast: function () {}, + + traverse: function ( callback ) { + + callback( this ); + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverse( callback ); + + } + + }, + + traverseVisible: function ( callback ) { + + if ( this.visible === false ) return; + + callback( this ); + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverseVisible( callback ); + + } + + }, + + traverseAncestors: function ( callback ) { + + var parent = this.parent; + + if ( parent !== null ) { + + callback( parent ); + + parent.traverseAncestors( callback ); + + } + + }, + + updateMatrix: function () { + + this.matrix.compose( this.position, this.quaternion, this.scale ); + + this.matrixWorldNeedsUpdate = true; + + }, + + updateMatrixWorld: function ( force ) { + + if ( this.matrixAutoUpdate ) this.updateMatrix(); + + if ( this.matrixWorldNeedsUpdate || force ) { + + if ( this.parent === null ) { + + this.matrixWorld.copy( this.matrix ); + + } else { + + this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); + + } + + this.matrixWorldNeedsUpdate = false; + + force = true; + + } + + // update children + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].updateMatrixWorld( force ); + + } + + }, + + updateWorldMatrix: function ( updateParents, updateChildren ) { + + var parent = this.parent; + + if ( updateParents === true && parent !== null ) { + + parent.updateWorldMatrix( true, false ); + + } + + if ( this.matrixAutoUpdate ) this.updateMatrix(); + + if ( this.parent === null ) { + + this.matrixWorld.copy( this.matrix ); + + } else { + + this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); + + } + + // update children + + if ( updateChildren === true ) { + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].updateWorldMatrix( false, true ); + + } + + } + + }, + + toJSON: function ( meta ) { + + // meta is a string when called from JSON.stringify + var isRootObject = ( meta === undefined || typeof meta === 'string' ); + + var output = {}; + + // meta is a hash used to collect geometries, materials. + // not providing it implies that this is the root object + // being serialized. + if ( isRootObject ) { + + // initialize meta obj + meta = { + geometries: {}, + materials: {}, + textures: {}, + images: {}, + shapes: {} + }; + + output.metadata = { + version: 4.5, + type: 'Object', + generator: 'Object3D.toJSON' + }; + + } + + // standard Object3D serialization + + var object = {}; + + object.uuid = this.uuid; + object.type = this.type; + + if ( this.name !== '' ) object.name = this.name; + if ( this.castShadow === true ) object.castShadow = true; + if ( this.receiveShadow === true ) object.receiveShadow = true; + if ( this.visible === false ) object.visible = false; + if ( this.frustumCulled === false ) object.frustumCulled = false; + if ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder; + if ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData; + + object.layers = this.layers.mask; + object.matrix = this.matrix.toArray(); + + if ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false; + + // + + function serialize( library, element ) { + + if ( library[ element.uuid ] === undefined ) { + + library[ element.uuid ] = element.toJSON( meta ); + + } + + return element.uuid; + + } + + if ( this.isMesh || this.isLine || this.isPoints ) { + + object.geometry = serialize( meta.geometries, this.geometry ); + + var parameters = this.geometry.parameters; + + if ( parameters !== undefined && parameters.shapes !== undefined ) { + + var shapes = parameters.shapes; + + if ( Array.isArray( shapes ) ) { + + for ( var i = 0, l = shapes.length; i < l; i ++ ) { + + var shape = shapes[ i ]; + + serialize( meta.shapes, shape ); + + } + + } else { + + serialize( meta.shapes, shapes ); + + } + + } + + } + + if ( this.material !== undefined ) { + + if ( Array.isArray( this.material ) ) { + + var uuids = []; + + for ( var i = 0, l = this.material.length; i < l; i ++ ) { + + uuids.push( serialize( meta.materials, this.material[ i ] ) ); + + } + + object.material = uuids; + + } else { + + object.material = serialize( meta.materials, this.material ); + + } + + } + + // + + if ( this.children.length > 0 ) { + + object.children = []; + + for ( var i = 0; i < this.children.length; i ++ ) { + + object.children.push( this.children[ i ].toJSON( meta ).object ); + + } + + } + + if ( isRootObject ) { + + var geometries = extractFromCache( meta.geometries ); + var materials = extractFromCache( meta.materials ); + var textures = extractFromCache( meta.textures ); + var images = extractFromCache( meta.images ); + var shapes = extractFromCache( meta.shapes ); + + if ( geometries.length > 0 ) output.geometries = geometries; + if ( materials.length > 0 ) output.materials = materials; + if ( textures.length > 0 ) output.textures = textures; + if ( images.length > 0 ) output.images = images; + if ( shapes.length > 0 ) output.shapes = shapes; + + } + + output.object = object; + + return output; + + // extract data from the cache hash + // remove metadata on each item + // and return as array + function extractFromCache( cache ) { + + var values = []; + for ( var key in cache ) { + + var data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + return values; + + } + + }, + + clone: function ( recursive ) { + + return new this.constructor().copy( this, recursive ); + + }, + + copy: function ( source, recursive ) { + + if ( recursive === undefined ) recursive = true; + + this.name = source.name; + + this.up.copy( source.up ); + + this.position.copy( source.position ); + this.quaternion.copy( source.quaternion ); + this.scale.copy( source.scale ); + + this.matrix.copy( source.matrix ); + this.matrixWorld.copy( source.matrixWorld ); + + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate; + + this.layers.mask = source.layers.mask; + this.visible = source.visible; + + this.castShadow = source.castShadow; + this.receiveShadow = source.receiveShadow; + + this.frustumCulled = source.frustumCulled; + this.renderOrder = source.renderOrder; + + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + if ( recursive === true ) { + + for ( var i = 0; i < source.children.length; i ++ ) { + + var child = source.children[ i ]; + this.add( child.clone() ); + + } + + } + + return this; + + } + +} ); + + +export { Object3D }; diff --git a/lib/core/Raycaster.js b/lib/core/Raycaster.js new file mode 100644 index 0000000..30ca4d9 --- /dev/null +++ b/lib/core/Raycaster.js @@ -0,0 +1,134 @@ +import { Ray } from '../math/Ray.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author bhouston / http://clara.io/ + * @author stephomi / http://stephaneginier.com/ + */ + +function Raycaster( origin, direction, near, far ) { + + this.ray = new Ray( origin, direction ); + // direction is assumed to be normalized (for accurate distance calculations) + + this.near = near || 0; + this.far = far || Infinity; + + this.params = { + Mesh: {}, + Line: {}, + LOD: {}, + Points: { threshold: 1 }, + Sprite: {} + }; + + Object.defineProperties( this.params, { + PointCloud: { + get: function () { + + console.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' ); + return this.Points; + + } + } + } ); + +} + +function ascSort( a, b ) { + + return a.distance - b.distance; + +} + +function intersectObject( object, raycaster, intersects, recursive ) { + + if ( object.visible === false ) return; + + object.raycast( raycaster, intersects ); + + if ( recursive === true ) { + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + intersectObject( children[ i ], raycaster, intersects, true ); + + } + + } + +} + +Object.assign( Raycaster.prototype, { + + linePrecision: 1, + + set: function ( origin, direction ) { + + // direction is assumed to be normalized (for accurate distance calculations) + + this.ray.set( origin, direction ); + + }, + + setFromCamera: function ( coords, camera ) { + + if ( ( camera && camera.isPerspectiveCamera ) ) { + + this.ray.origin.setFromMatrixPosition( camera.matrixWorld ); + this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize(); + + } else if ( ( camera && camera.isOrthographicCamera ) ) { + + this.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera + this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ); + + } else { + + console.error( 'THREE.Raycaster: Unsupported camera type.' ); + + } + + }, + + intersectObject: function ( object, recursive, optionalTarget ) { + + var intersects = optionalTarget || []; + + intersectObject( object, this, intersects, recursive ); + + intersects.sort( ascSort ); + + return intersects; + + }, + + intersectObjects: function ( objects, recursive, optionalTarget ) { + + var intersects = optionalTarget || []; + + if ( Array.isArray( objects ) === false ) { + + console.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' ); + return intersects; + + } + + for ( var i = 0, l = objects.length; i < l; i ++ ) { + + intersectObject( objects[ i ], this, intersects, recursive ); + + } + + intersects.sort( ascSort ); + + return intersects; + + } + +} ); + + +export { Raycaster }; diff --git a/lib/core/Uniform.js b/lib/core/Uniform.js new file mode 100644 index 0000000..8c53319 --- /dev/null +++ b/lib/core/Uniform.js @@ -0,0 +1,24 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function Uniform( value ) { + + if ( typeof value === 'string' ) { + + console.warn( 'THREE.Uniform: Type parameter is no longer needed.' ); + value = arguments[ 1 ]; + + } + + this.value = value; + +} + +Uniform.prototype.clone = function () { + + return new Uniform( this.value.clone === undefined ? this.value : this.value.clone() ); + +}; + +export { Uniform }; diff --git a/lib/extras/Earcut.js b/lib/extras/Earcut.js new file mode 100644 index 0000000..7f7a412 --- /dev/null +++ b/lib/extras/Earcut.js @@ -0,0 +1,810 @@ +/** + * @author Mugen87 / https://github.com/Mugen87 + * Port from https://github.com/mapbox/earcut (v2.1.2) + */ + +var Earcut = { + + triangulate: function ( data, holeIndices, dim ) { + + dim = dim || 2; + + var hasHoles = holeIndices && holeIndices.length, + outerLen = hasHoles ? holeIndices[ 0 ] * dim : data.length, + outerNode = linkedList( data, 0, outerLen, dim, true ), + triangles = []; + + if ( ! outerNode ) return triangles; + + var 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 ( var 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 ) { + + var 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; + + var 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 ); + + var 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 vertice 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( 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 ) { + + var 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 + var 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 ) { + + var 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 + + var 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; + + var minZ = zOrder( minTX, minTY, minX, minY, invSize ), + maxZ = zOrder( maxTX, maxTY, minX, minY, invSize ); + + // first look for points inside the triangle in increasing z-order + + var p = ear.nextZ; + + while ( p && p.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.nextZ; + + } + + // then look for points in decreasing z-order + + p = ear.prevZ; + + 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; + + } + + return true; + +} + +// go through all polygon nodes and cure small local self-intersections + +function cureLocalIntersections( start, triangles, dim ) { + + var p = start; + + do { + + var 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 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 + + var a = start; + + do { + + var b = a.next.next; + + while ( b !== a.prev ) { + + if ( a.i !== b.i && isValidDiagonal( a, b ) ) { + + // split the polygon in two by the diagonal + + var 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 ) { + + var queue = [], 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 ) { + + var b = splitPolygon( outerNode, hole ); + + filterPoints( b, b.next ); + + } + +} + +// David Eberly's algorithm for finding a bridge between hole and outer polygon + +function findHoleBridge( hole, outerNode ) { + + var p = outerNode, + hx = hole.x, + hy = hole.y, + 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 ) { + + var 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.prev; // hole touches outer segment; pick lower 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 + + var stop = m, + mx = m.x, + my = m.y, + tanMin = Infinity, + tan; + + p = m.next; + + while ( p !== stop ) { + + 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 ( ( tan < tanMin || ( tan === tanMin && p.x > m.x ) ) && locallyInside( p, hole ) ) { + + m = p; + tanMin = tan; + + } + + } + + p = p.next; + + } + + return m; + +} + +// interlink polygon nodes in z-order + +function indexCurve( start, minX, minY, invSize ) { + + var 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 ) { + + var 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 ) { + + var p = start, leftmost = start; + + do { + + if ( p.x < leftmost.x ) 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 ) && + locallyInside( a, b ) && locallyInside( b, a ) && middleInside( a, b ); + +} + +// 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 ) { + + if ( ( equals( p1, q1 ) && equals( p2, q2 ) ) || + ( equals( p1, q2 ) && equals( p2, q1 ) ) ) return true; + + return area( p1, q1, p2 ) > 0 !== area( p1, q1, q2 ) > 0 && + area( p2, q2, p1 ) > 0 !== area( p2, q2, q1 ) > 0; + +} + +// check if a polygon diagonal intersects any polygon segments + +function intersectsPolygon( a, b ) { + + var 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 ) { + + var p = a, + inside = false, + 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 ) { + + var 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 ) { + + var 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 ) { + + // vertice index in coordinates array + this.i = i; + + // vertex coordinates + this.x = x; + this.y = y; + + // previous and next vertice 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 ) { + + var sum = 0; + + for ( var 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 }; diff --git a/lib/extras/ImageUtils.js b/lib/extras/ImageUtils.js new file mode 100644 index 0000000..e575c0d --- /dev/null +++ b/lib/extras/ImageUtils.js @@ -0,0 +1,55 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + */ + +var ImageUtils = { + + getDataURL: function ( image ) { + + var canvas; + + if ( typeof HTMLCanvasElement == 'undefined' ) { + + return image.src; + + } else if ( image instanceof HTMLCanvasElement ) { + + canvas = image; + + } else { + + canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = image.width; + canvas.height = image.height; + + var context = canvas.getContext( '2d' ); + + if ( image instanceof ImageData ) { + + context.putImageData( image, 0, 0 ); + + } else { + + context.drawImage( image, 0, 0, image.width, image.height ); + + } + + } + + if ( canvas.width > 2048 || canvas.height > 2048 ) { + + return canvas.toDataURL( 'image/jpeg', 0.6 ); + + } else { + + return canvas.toDataURL( 'image/png' ); + + } + + } + +}; + +export { ImageUtils }; diff --git a/lib/extras/ShapeUtils.js b/lib/extras/ShapeUtils.js new file mode 100644 index 0000000..ec050af --- /dev/null +++ b/lib/extras/ShapeUtils.js @@ -0,0 +1,96 @@ +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + +import { Earcut } from './Earcut.js'; + +var ShapeUtils = { + + // calculate area of the contour polygon + + area: function ( contour ) { + + var n = contour.length; + var a = 0.0; + + for ( var 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; + + }, + + isClockWise: function ( pts ) { + + return ShapeUtils.area( pts ) < 0; + + }, + + triangulateShape: function ( contour, holes ) { + + var vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ] + var holeIndices = []; // array of hole indices + var faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ] + + removeDupEndPts( contour ); + addContour( vertices, contour ); + + // + + var holeIndex = contour.length; + + holes.forEach( removeDupEndPts ); + + for ( var i = 0; i < holes.length; i ++ ) { + + holeIndices.push( holeIndex ); + holeIndex += holes[ i ].length; + addContour( vertices, holes[ i ] ); + + } + + // + + var triangles = Earcut.triangulate( vertices, holeIndices ); + + // + + for ( var i = 0; i < triangles.length; i += 3 ) { + + faces.push( triangles.slice( i, i + 3 ) ); + + } + + return faces; + + } + +}; + +function removeDupEndPts( points ) { + + var l = points.length; + + if ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) { + + points.pop(); + + } + +} + +function addContour( vertices, contour ) { + + for ( var i = 0; i < contour.length; i ++ ) { + + vertices.push( contour[ i ].x ); + vertices.push( contour[ i ].y ); + + } + +} + +export { ShapeUtils }; diff --git a/lib/extras/core/Curve.js b/lib/extras/core/Curve.js new file mode 100644 index 0000000..4aac16a --- /dev/null +++ b/lib/extras/core/Curve.js @@ -0,0 +1,425 @@ +import { _Math } from '../../math/Math.js'; +import { Vector3 } from '../../math/Vector3.js'; +import { Matrix4 } from '../../math/Matrix4.js'; + +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Extensible curve object + * + * Some common of curve methods: + * .getPoint( t, optionalTarget ), .getTangent( t ) + * .getPointAt( u, optionalTarget ), .getTangentAt( u ) + * .getPoints(), .getSpacedPoints() + * .getLength() + * .updateArcLengths() + * + * This following curves inherit from THREE.Curve: + * + * -- 2D curves -- + * THREE.ArcCurve + * THREE.CubicBezierCurve + * THREE.EllipseCurve + * THREE.LineCurve + * THREE.QuadraticBezierCurve + * THREE.SplineCurve + * + * -- 3D curves -- + * THREE.CatmullRomCurve3 + * THREE.CubicBezierCurve3 + * THREE.LineCurve3 + * THREE.QuadraticBezierCurve3 + * + * A series of curves can be represented as a THREE.CurvePath. + * + **/ + +/************************************************************** + * Abstract Curve base class + **************************************************************/ + +function Curve() { + + this.type = 'Curve'; + + this.arcLengthDivisions = 200; + +} + +Object.assign( Curve.prototype, { + + // Virtual base class method to overwrite and implement in subclasses + // - t [0 .. 1] + + getPoint: function ( /* t, optionalTarget */ ) { + + console.warn( 'THREE.Curve: .getPoint() not implemented.' ); + return null; + + }, + + // Get point at relative position in curve according to arc length + // - u [0 .. 1] + + getPointAt: function ( u, optionalTarget ) { + + var t = this.getUtoTmapping( u ); + return this.getPoint( t, optionalTarget ); + + }, + + // Get sequence of points using getPoint( t ) + + getPoints: function ( divisions ) { + + if ( divisions === undefined ) divisions = 5; + + var points = []; + + for ( var d = 0; d <= divisions; d ++ ) { + + points.push( this.getPoint( d / divisions ) ); + + } + + return points; + + }, + + // Get sequence of points using getPointAt( u ) + + getSpacedPoints: function ( divisions ) { + + if ( divisions === undefined ) divisions = 5; + + var points = []; + + for ( var d = 0; d <= divisions; d ++ ) { + + points.push( this.getPointAt( d / divisions ) ); + + } + + return points; + + }, + + // Get total curve arc length + + getLength: function () { + + var lengths = this.getLengths(); + return lengths[ lengths.length - 1 ]; + + }, + + // Get list of cumulative segment lengths + + getLengths: function ( divisions ) { + + if ( divisions === undefined ) divisions = this.arcLengthDivisions; + + if ( this.cacheArcLengths && + ( this.cacheArcLengths.length === divisions + 1 ) && + ! this.needsUpdate ) { + + return this.cacheArcLengths; + + } + + this.needsUpdate = false; + + var cache = []; + var current, last = this.getPoint( 0 ); + var p, sum = 0; + + cache.push( 0 ); + + for ( p = 1; p <= divisions; p ++ ) { + + current = this.getPoint( p / divisions ); + sum += current.distanceTo( last ); + cache.push( sum ); + last = current; + + } + + this.cacheArcLengths = cache; + + return cache; // { sums: cache, sum: sum }; Sum is in the last element. + + }, + + updateArcLengths: function () { + + this.needsUpdate = true; + this.getLengths(); + + }, + + // Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant + + getUtoTmapping: function ( u, distance ) { + + var arcLengths = this.getLengths(); + + var i = 0, il = arcLengths.length; + + var 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 + + var 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 + + var lengthBefore = arcLengths[ i ]; + var lengthAfter = arcLengths[ i + 1 ]; + + var segmentLength = lengthAfter - lengthBefore; + + // determine where we are between the 'before' and 'after' points + + var segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength; + + // add that fractional amount to t + + var t = ( i + segmentFraction ) / ( il - 1 ); + + return t; + + }, + + // Returns a unit vector tangent at t + // In case any sub curve does not implement its tangent derivation, + // 2 points a small delta apart will be used to find its gradient + // which seems to give a reasonable approximation + + getTangent: function ( t ) { + + var delta = 0.0001; + var t1 = t - delta; + var t2 = t + delta; + + // Capping in case of danger + + if ( t1 < 0 ) t1 = 0; + if ( t2 > 1 ) t2 = 1; + + var pt1 = this.getPoint( t1 ); + var pt2 = this.getPoint( t2 ); + + var vec = pt2.clone().sub( pt1 ); + return vec.normalize(); + + }, + + getTangentAt: function ( u ) { + + var t = this.getUtoTmapping( u ); + return this.getTangent( t ); + + }, + + computeFrenetFrames: function ( segments, closed ) { + + // see http://www.cs.indiana.edu/pub/techreports/TR425.pdf + + var normal = new Vector3(); + + var tangents = []; + var normals = []; + var binormals = []; + + var vec = new Vector3(); + var mat = new Matrix4(); + + var i, u, theta; + + // compute the tangent vectors for each segment on the curve + + for ( i = 0; i <= segments; i ++ ) { + + u = i / segments; + + tangents[ i ] = this.getTangentAt( u ); + tangents[ i ].normalize(); + + } + + // select an initial normal vector perpendicular to the first tangent vector, + // and in the direction of the minimum tangent xyz component + + normals[ 0 ] = new Vector3(); + binormals[ 0 ] = new Vector3(); + var min = Number.MAX_VALUE; + var tx = Math.abs( tangents[ 0 ].x ); + var ty = Math.abs( tangents[ 0 ].y ); + var tz = Math.abs( tangents[ 0 ].z ); + + if ( tx <= min ) { + + min = tx; + normal.set( 1, 0, 0 ); + + } + + if ( ty <= min ) { + + min = ty; + normal.set( 0, 1, 0 ); + + } + + if ( tz <= min ) { + + normal.set( 0, 0, 1 ); + + } + + vec.crossVectors( tangents[ 0 ], normal ).normalize(); + + normals[ 0 ].crossVectors( tangents[ 0 ], vec ); + binormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ); + + + // compute the slowly-varying normal and binormal vectors for each segment on the curve + + for ( i = 1; i <= segments; i ++ ) { + + normals[ i ] = normals[ i - 1 ].clone(); + + binormals[ i ] = binormals[ i - 1 ].clone(); + + vec.crossVectors( tangents[ i - 1 ], tangents[ i ] ); + + if ( vec.length() > Number.EPSILON ) { + + vec.normalize(); + + theta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors + + normals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) ); + + } + + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + // if the curve is closed, postprocess the vectors so the first and last normal vectors are the same + + if ( closed === true ) { + + theta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) ); + theta /= segments; + + if ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) { + + theta = - theta; + + } + + for ( i = 1; i <= segments; i ++ ) { + + // twist a little... + normals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) ); + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + } + + return { + tangents: tangents, + normals: normals, + binormals: binormals + }; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.arcLengthDivisions = source.arcLengthDivisions; + + return this; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.5, + type: 'Curve', + generator: 'Curve.toJSON' + } + }; + + data.arcLengthDivisions = this.arcLengthDivisions; + data.type = this.type; + + return data; + + }, + + fromJSON: function ( json ) { + + this.arcLengthDivisions = json.arcLengthDivisions; + + return this; + + } + +} ); + + +export { Curve }; diff --git a/lib/extras/core/CurvePath.js b/lib/extras/core/CurvePath.js new file mode 100644 index 0000000..c739130 --- /dev/null +++ b/lib/extras/core/CurvePath.js @@ -0,0 +1,261 @@ +import { Curve } from './Curve.js'; +import * as Curves from '../curves/Curves.js'; + +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + **/ + +/************************************************************** + * Curved Path - a curve path is simply a array of connected + * curves, but retains the api of a curve + **************************************************************/ + +function CurvePath() { + + Curve.call( this ); + + this.type = 'CurvePath'; + + this.curves = []; + this.autoClose = false; // Automatically closes the path + +} + +CurvePath.prototype = Object.assign( Object.create( Curve.prototype ), { + + constructor: CurvePath, + + add: function ( curve ) { + + this.curves.push( curve ); + + }, + + closePath: function () { + + // Add a line curve if start and end of lines are not connected + var startPoint = this.curves[ 0 ].getPoint( 0 ); + var endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 ); + + if ( ! startPoint.equals( endPoint ) ) { + + this.curves.push( new Curves[ 'LineCurve' ]( endPoint, startPoint ) ); + + } + + }, + + // To get accurate point with reference to + // entire path distance at time t, + // following has to be done: + + // 1. Length of each sub path have to be known + // 2. Locate and identify type of curve + // 3. Get t for the curve + // 4. Return curve.getPointAt(t') + + getPoint: function ( t ) { + + var d = t * this.getLength(); + var curveLengths = this.getCurveLengths(); + var i = 0; + + // To think about boundaries points. + + while ( i < curveLengths.length ) { + + if ( curveLengths[ i ] >= d ) { + + var diff = curveLengths[ i ] - d; + var curve = this.curves[ i ]; + + var segmentLength = curve.getLength(); + var u = segmentLength === 0 ? 0 : 1 - diff / segmentLength; + + return curve.getPointAt( u ); + + } + + i ++; + + } + + return null; + + // loop where sum != 0, sum > d , sum+1 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) { + + points.push( points[ 0 ] ); + + } + + return points; + + }, + + copy: function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.curves = []; + + for ( var i = 0, l = source.curves.length; i < l; i ++ ) { + + var curve = source.curves[ i ]; + + this.curves.push( curve.clone() ); + + } + + this.autoClose = source.autoClose; + + return this; + + }, + + toJSON: function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.autoClose = this.autoClose; + data.curves = []; + + for ( var i = 0, l = this.curves.length; i < l; i ++ ) { + + var curve = this.curves[ i ]; + data.curves.push( curve.toJSON() ); + + } + + return data; + + }, + + fromJSON: function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.autoClose = json.autoClose; + this.curves = []; + + for ( var i = 0, l = json.curves.length; i < l; i ++ ) { + + var curve = json.curves[ i ]; + this.curves.push( new Curves[ curve.type ]().fromJSON( curve ) ); + + } + + return this; + + } + +} ); + + +export { CurvePath }; diff --git a/lib/extras/core/Font.js b/lib/extras/core/Font.js new file mode 100644 index 0000000..e75573b --- /dev/null +++ b/lib/extras/core/Font.js @@ -0,0 +1,145 @@ +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author mrdoob / http://mrdoob.com/ + */ + +import { ShapePath } from './ShapePath.js'; + + +function Font( data ) { + + this.type = 'Font'; + + this.data = data; + +} + +Object.assign( Font.prototype, { + + isFont: true, + + generateShapes: function ( text, size ) { + + if ( size === undefined ) size = 100; + + var shapes = []; + var paths = createPaths( text, size, this.data ); + + for ( var p = 0, pl = paths.length; p < pl; p ++ ) { + + Array.prototype.push.apply( shapes, paths[ p ].toShapes() ); + + } + + return shapes; + + } + +} ); + +function createPaths( text, size, data ) { + + var chars = Array.from ? Array.from( text ) : String( text ).split( '' ); // see #13988 + var scale = size / data.resolution; + var line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale; + + var paths = []; + + var offsetX = 0, offsetY = 0; + + for ( var i = 0; i < chars.length; i ++ ) { + + var char = chars[ i ]; + + if ( char === '\n' ) { + + offsetX = 0; + offsetY -= line_height; + + } else { + + var ret = createPath( char, scale, offsetX, offsetY, data ); + offsetX += ret.offsetX; + paths.push( ret.path ); + + } + + } + + return paths; + +} + +function createPath( char, scale, offsetX, offsetY, data ) { + + var glyph = data.glyphs[ char ] || data.glyphs[ '?' ]; + + if ( ! glyph ) return; + + var path = new ShapePath(); + + var x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2; + + if ( glyph.o ) { + + var outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) ); + + for ( var i = 0, l = outline.length; i < l; ) { + + var action = outline[ i ++ ]; + + switch ( action ) { + + case 'm': // moveTo + + x = outline[ i ++ ] * scale + offsetX; + y = outline[ i ++ ] * scale + offsetY; + + path.moveTo( x, y ); + + break; + + case 'l': // lineTo + + x = outline[ i ++ ] * scale + offsetX; + y = outline[ i ++ ] * scale + offsetY; + + path.lineTo( x, y ); + + break; + + case 'q': // quadraticCurveTo + + cpx = outline[ i ++ ] * scale + offsetX; + cpy = outline[ i ++ ] * scale + offsetY; + cpx1 = outline[ i ++ ] * scale + offsetX; + cpy1 = outline[ i ++ ] * scale + offsetY; + + path.quadraticCurveTo( cpx1, cpy1, cpx, cpy ); + + break; + + case 'b': // bezierCurveTo + + 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; + + path.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy ); + + break; + + } + + } + + } + + return { offsetX: glyph.ha * scale, path: path }; + +} + +export { Font }; diff --git a/lib/extras/core/Interpolations.js b/lib/extras/core/Interpolations.js new file mode 100644 index 0000000..0fb812c --- /dev/null +++ b/lib/extras/core/Interpolations.js @@ -0,0 +1,81 @@ +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + * Bezier Curves formulas obtained from + * http://en.wikipedia.org/wiki/Bézier_curve + */ + +function CatmullRom( t, p0, p1, p2, p3 ) { + + var v0 = ( p2 - p0 ) * 0.5; + var v1 = ( p3 - p1 ) * 0.5; + var t2 = t * t; + var t3 = t * t2; + return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1; + +} + +// + +function QuadraticBezierP0( t, p ) { + + var 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 QuadraticBezier( t, p0, p1, p2 ) { + + return QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) + + QuadraticBezierP2( t, p2 ); + +} + +// + +function CubicBezierP0( t, p ) { + + var k = 1 - t; + return k * k * k * p; + +} + +function CubicBezierP1( t, p ) { + + var 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; + +} + +function CubicBezier( t, p0, p1, p2, p3 ) { + + return CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) + + CubicBezierP3( t, p3 ); + +} + +export { CatmullRom, QuadraticBezier, CubicBezier }; diff --git a/lib/extras/core/Path.js b/lib/extras/core/Path.js new file mode 100644 index 0000000..d2b978c --- /dev/null +++ b/lib/extras/core/Path.js @@ -0,0 +1,183 @@ +import { Vector2 } from '../../math/Vector2.js'; +import { CurvePath } from './CurvePath.js'; +import { EllipseCurve } from '../curves/EllipseCurve.js'; +import { SplineCurve } from '../curves/SplineCurve.js'; +import { CubicBezierCurve } from '../curves/CubicBezierCurve.js'; +import { QuadraticBezierCurve } from '../curves/QuadraticBezierCurve.js'; +import { LineCurve } from '../curves/LineCurve.js'; + +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Creates free form 2d path using series of points, lines or curves. + **/ + +function Path( points ) { + + CurvePath.call( this ); + + this.type = 'Path'; + + this.currentPoint = new Vector2(); + + if ( points ) { + + this.setFromPoints( points ); + + } + +} + +Path.prototype = Object.assign( Object.create( CurvePath.prototype ), { + + constructor: Path, + + setFromPoints: function ( points ) { + + this.moveTo( points[ 0 ].x, points[ 0 ].y ); + + for ( var i = 1, l = points.length; i < l; i ++ ) { + + this.lineTo( points[ i ].x, points[ i ].y ); + + } + + }, + + moveTo: function ( x, y ) { + + this.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying? + + }, + + lineTo: function ( x, y ) { + + var curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) ); + this.curves.push( curve ); + + this.currentPoint.set( x, y ); + + }, + + quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) { + + var curve = new QuadraticBezierCurve( + this.currentPoint.clone(), + new Vector2( aCPx, aCPy ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + }, + + bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + + var curve = new CubicBezierCurve( + this.currentPoint.clone(), + new Vector2( aCP1x, aCP1y ), + new Vector2( aCP2x, aCP2y ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + }, + + splineThru: function ( pts /*Array of Vector*/ ) { + + var npts = [ this.currentPoint.clone() ].concat( pts ); + + var curve = new SplineCurve( npts ); + this.curves.push( curve ); + + this.currentPoint.copy( pts[ pts.length - 1 ] ); + + }, + + arc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + var x0 = this.currentPoint.x; + var y0 = this.currentPoint.y; + + this.absarc( aX + x0, aY + y0, aRadius, + aStartAngle, aEndAngle, aClockwise ); + + }, + + absarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + this.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + }, + + ellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + var x0 = this.currentPoint.x; + var y0 = this.currentPoint.y; + + this.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + }, + + absellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + var curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + if ( this.curves.length > 0 ) { + + // if a previous curve is present, attempt to join + var firstPoint = curve.getPoint( 0 ); + + if ( ! firstPoint.equals( this.currentPoint ) ) { + + this.lineTo( firstPoint.x, firstPoint.y ); + + } + + } + + this.curves.push( curve ); + + var lastPoint = curve.getPoint( 1 ); + this.currentPoint.copy( lastPoint ); + + }, + + copy: function ( source ) { + + CurvePath.prototype.copy.call( this, source ); + + this.currentPoint.copy( source.currentPoint ); + + return this; + + }, + + toJSON: function () { + + var data = CurvePath.prototype.toJSON.call( this ); + + data.currentPoint = this.currentPoint.toArray(); + + return data; + + }, + + fromJSON: function ( json ) { + + CurvePath.prototype.fromJSON.call( this, json ); + + this.currentPoint.fromArray( json.currentPoint ); + + return this; + + } + +} ); + + +export { Path }; diff --git a/lib/extras/core/Shape.js b/lib/extras/core/Shape.js new file mode 100644 index 0000000..539415c --- /dev/null +++ b/lib/extras/core/Shape.js @@ -0,0 +1,115 @@ +import { Path } from './Path.js'; +import { _Math } from '../../math/Math.js'; + +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Defines a 2d shape plane using paths. + **/ + +// STEP 1 Create a path. +// STEP 2 Turn path into shape. +// STEP 3 ExtrudeGeometry takes in Shape/Shapes +// STEP 3a - Extract points from each shape, turn to vertices +// STEP 3b - Triangulate each shape, add faces. + +function Shape( points ) { + + Path.call( this, points ); + + this.uuid = _Math.generateUUID(); + + this.type = 'Shape'; + + this.holes = []; + +} + +Shape.prototype = Object.assign( Object.create( Path.prototype ), { + + constructor: Shape, + + getPointsHoles: function ( divisions ) { + + var holesPts = []; + + for ( var i = 0, l = this.holes.length; i < l; i ++ ) { + + holesPts[ i ] = this.holes[ i ].getPoints( divisions ); + + } + + return holesPts; + + }, + + // get points of shape and holes (keypoints based on segments parameter) + + extractPoints: function ( divisions ) { + + return { + + shape: this.getPoints( divisions ), + holes: this.getPointsHoles( divisions ) + + }; + + }, + + copy: function ( source ) { + + Path.prototype.copy.call( this, source ); + + this.holes = []; + + for ( var i = 0, l = source.holes.length; i < l; i ++ ) { + + var hole = source.holes[ i ]; + + this.holes.push( hole.clone() ); + + } + + return this; + + }, + + toJSON: function () { + + var data = Path.prototype.toJSON.call( this ); + + data.uuid = this.uuid; + data.holes = []; + + for ( var i = 0, l = this.holes.length; i < l; i ++ ) { + + var hole = this.holes[ i ]; + data.holes.push( hole.toJSON() ); + + } + + return data; + + }, + + fromJSON: function ( json ) { + + Path.prototype.fromJSON.call( this, json ); + + this.uuid = json.uuid; + this.holes = []; + + for ( var i = 0, l = json.holes.length; i < l; i ++ ) { + + var hole = json.holes[ i ]; + this.holes.push( new Path().fromJSON( hole ) ); + + } + + return this; + + } + +} ); + + +export { Shape }; diff --git a/lib/extras/core/ShapePath.js b/lib/extras/core/ShapePath.js new file mode 100644 index 0000000..a5f7344 --- /dev/null +++ b/lib/extras/core/ShapePath.js @@ -0,0 +1,286 @@ +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + * minimal class for proxing functions to Path. Replaces old "extractSubpaths()" + **/ + +import { Color } from '../../math/Color.js'; +import { Path } from './Path.js'; +import { Shape } from './Shape.js'; +import { ShapeUtils } from '../ShapeUtils.js'; + +function ShapePath() { + + this.type = 'ShapePath'; + + this.color = new Color(); + + this.subPaths = []; + this.currentPath = null; + +} + +Object.assign( ShapePath.prototype, { + + moveTo: function ( x, y ) { + + this.currentPath = new Path(); + this.subPaths.push( this.currentPath ); + this.currentPath.moveTo( x, y ); + + }, + + lineTo: function ( x, y ) { + + this.currentPath.lineTo( x, y ); + + }, + + quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) { + + this.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY ); + + }, + + bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + + this.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ); + + }, + + splineThru: function ( pts ) { + + this.currentPath.splineThru( pts ); + + }, + + toShapes: function ( isCCW, noHoles ) { + + function toShapesNoHoles( inSubpaths ) { + + var shapes = []; + + for ( var i = 0, l = inSubpaths.length; i < l; i ++ ) { + + var tmpPath = inSubpaths[ i ]; + + var tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + + shapes.push( tmpShape ); + + } + + return shapes; + + } + + function isPointInsidePolygon( inPt, inPolygon ) { + + var polyLen = inPolygon.length; + + // inPt on polygon contour => immediate success or + // toggling of inside/outside at every single! intersection point of an edge + // with the horizontal line through inPt, left of inPt + // not counting lowerY endpoints of edges and whole edges on that line + var inside = false; + for ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) { + + var edgeLowPt = inPolygon[ p ]; + var edgeHighPt = inPolygon[ q ]; + + var edgeDx = edgeHighPt.x - edgeLowPt.x; + var edgeDy = edgeHighPt.y - edgeLowPt.y; + + if ( Math.abs( edgeDy ) > Number.EPSILON ) { + + // not parallel + if ( edgeDy < 0 ) { + + edgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx; + edgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy; + + } + if ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) continue; + + if ( inPt.y === edgeLowPt.y ) { + + if ( inPt.x === edgeLowPt.x ) return true; // inPt is on contour ? + // continue; // no intersection or edgeLowPt => doesn't count !!! + + } else { + + var perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y ); + if ( perpEdge === 0 ) return true; // inPt is on contour ? + if ( perpEdge < 0 ) continue; + inside = ! inside; // true intersection left of inPt + + } + + } else { + + // parallel or collinear + if ( inPt.y !== edgeLowPt.y ) continue; // parallel + // edge lies on the same horizontal line as inPt + if ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) || + ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) ) return true; // inPt: Point on contour ! + // continue; + + } + + } + + return inside; + + } + + var isClockWise = ShapeUtils.isClockWise; + + var subPaths = this.subPaths; + if ( subPaths.length === 0 ) return []; + + if ( noHoles === true ) return toShapesNoHoles( subPaths ); + + + var solid, tmpPath, tmpShape, shapes = []; + + if ( subPaths.length === 1 ) { + + tmpPath = subPaths[ 0 ]; + tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + shapes.push( tmpShape ); + return shapes; + + } + + var holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() ); + holesFirst = isCCW ? ! holesFirst : holesFirst; + + // console.log("Holes first", holesFirst); + + var betterShapeHoles = []; + var newShapes = []; + var newShapeHoles = []; + var mainIdx = 0; + var tmpPoints; + + newShapes[ mainIdx ] = undefined; + newShapeHoles[ mainIdx ] = []; + + for ( var i = 0, l = subPaths.length; i < l; i ++ ) { + + tmpPath = subPaths[ i ]; + tmpPoints = tmpPath.getPoints(); + solid = isClockWise( tmpPoints ); + solid = isCCW ? ! solid : solid; + + if ( solid ) { + + if ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) ) mainIdx ++; + + newShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints }; + newShapes[ mainIdx ].s.curves = tmpPath.curves; + + if ( holesFirst ) mainIdx ++; + newShapeHoles[ mainIdx ] = []; + + //console.log('cw', i); + + } else { + + newShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } ); + + //console.log('ccw', i); + + } + + } + + // only Holes? -> probably all Shapes with wrong orientation + if ( ! newShapes[ 0 ] ) return toShapesNoHoles( subPaths ); + + + if ( newShapes.length > 1 ) { + + var ambiguous = false; + var toChange = []; + + for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + betterShapeHoles[ sIdx ] = []; + + } + + for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + var sho = newShapeHoles[ sIdx ]; + + for ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) { + + var ho = sho[ hIdx ]; + var hole_unassigned = true; + + for ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) { + + if ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) { + + if ( sIdx !== s2Idx ) toChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } ); + if ( hole_unassigned ) { + + hole_unassigned = false; + betterShapeHoles[ s2Idx ].push( ho ); + + } else { + + ambiguous = true; + + } + + } + + } + if ( hole_unassigned ) { + + betterShapeHoles[ sIdx ].push( ho ); + + } + + } + + } + // console.log("ambiguous: ", ambiguous); + if ( toChange.length > 0 ) { + + // console.log("to change: ", toChange); + if ( ! ambiguous ) newShapeHoles = betterShapeHoles; + + } + + } + + var tmpHoles; + + for ( var i = 0, il = newShapes.length; i < il; i ++ ) { + + tmpShape = newShapes[ i ].s; + shapes.push( tmpShape ); + tmpHoles = newShapeHoles[ i ]; + + for ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) { + + tmpShape.holes.push( tmpHoles[ j ].h ); + + } + + } + + //console.log("shape", shapes); + + return shapes; + + } + +} ); + + +export { ShapePath }; diff --git a/lib/extras/curves/ArcCurve.js b/lib/extras/curves/ArcCurve.js new file mode 100644 index 0000000..54b8848 --- /dev/null +++ b/lib/extras/curves/ArcCurve.js @@ -0,0 +1,18 @@ +import { EllipseCurve } from './EllipseCurve.js'; + + +function ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + EllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + this.type = 'ArcCurve'; + +} + +ArcCurve.prototype = Object.create( EllipseCurve.prototype ); +ArcCurve.prototype.constructor = ArcCurve; + +ArcCurve.prototype.isArcCurve = true; + + +export { ArcCurve }; diff --git a/lib/extras/curves/CatmullRomCurve3.js b/lib/extras/curves/CatmullRomCurve3.js new file mode 100644 index 0000000..5f53a36 --- /dev/null +++ b/lib/extras/curves/CatmullRomCurve3.js @@ -0,0 +1,255 @@ +import { Vector3 } from '../../math/Vector3.js'; +import { Curve } from '../core/Curve.js'; + +/** + * @author zz85 https://github.com/zz85 + * + * Centripetal CatmullRom Curve - which is useful for avoiding + * cusps and self-intersections in non-uniform catmull rom curves. + * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf + * + * curve.type accepts centripetal(default), chordal and catmullrom + * curve.tension is used for catmullrom which defaults to 0.5 + */ + + +/* +Based on an optimized c++ solution in + - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/ + - http://ideone.com/NoEbVM + +This CubicPoly class could be used for reusing some variables and calculations, +but for three.js curve use, it could be possible inlined and flatten into a single function call +which can be placed in CurveUtils. +*/ + +function CubicPoly() { + + var c0 = 0, c1 = 0, c2 = 0, c3 = 0; + + /* + * Compute coefficients for a cubic polynomial + * p(s) = c0 + c1*s + c2*s^2 + c3*s^3 + * such that + * p(0) = x0, p(1) = x1 + * and + * p'(0) = t0, p'(1) = t1. + */ + function init( x0, x1, t0, t1 ) { + + c0 = x0; + c1 = t0; + c2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1; + c3 = 2 * x0 - 2 * x1 + t0 + t1; + + } + + return { + + initCatmullRom: function ( x0, x1, x2, x3, tension ) { + + init( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) ); + + }, + + initNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) { + + // compute tangents when parameterized in [t1,t2] + var t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1; + var t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2; + + // rescale tangents for parametrization in [0,1] + t1 *= dt1; + t2 *= dt1; + + init( x1, x2, t1, t2 ); + + }, + + calc: function ( t ) { + + var t2 = t * t; + var t3 = t2 * t; + return c0 + c1 * t + c2 * t2 + c3 * t3; + + } + + }; + +} + +// + +var tmp = new Vector3(); +var px = new CubicPoly(), py = new CubicPoly(), pz = new CubicPoly(); + +function CatmullRomCurve3( points, closed, curveType, tension ) { + + Curve.call( this ); + + this.type = 'CatmullRomCurve3'; + + this.points = points || []; + this.closed = closed || false; + this.curveType = curveType || 'centripetal'; + this.tension = tension || 0.5; + +} + +CatmullRomCurve3.prototype = Object.create( Curve.prototype ); +CatmullRomCurve3.prototype.constructor = CatmullRomCurve3; + +CatmullRomCurve3.prototype.isCatmullRomCurve3 = true; + +CatmullRomCurve3.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector3(); + + var points = this.points; + var l = points.length; + + var p = ( l - ( this.closed ? 0 : 1 ) ) * t; + var intPoint = Math.floor( p ); + var weight = p - intPoint; + + if ( this.closed ) { + + intPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l; + + } else if ( weight === 0 && intPoint === l - 1 ) { + + intPoint = l - 2; + weight = 1; + + } + + var p0, p1, p2, p3; // 4 points + + if ( this.closed || intPoint > 0 ) { + + p0 = points[ ( intPoint - 1 ) % l ]; + + } else { + + // extrapolate first point + tmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] ); + p0 = tmp; + + } + + p1 = points[ intPoint % l ]; + p2 = points[ ( intPoint + 1 ) % l ]; + + if ( this.closed || intPoint + 2 < l ) { + + p3 = points[ ( intPoint + 2 ) % l ]; + + } else { + + // extrapolate last point + tmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] ); + p3 = tmp; + + } + + if ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) { + + // init Centripetal / Chordal Catmull-Rom + var pow = this.curveType === 'chordal' ? 0.5 : 0.25; + var dt0 = Math.pow( p0.distanceToSquared( p1 ), pow ); + var dt1 = Math.pow( p1.distanceToSquared( p2 ), pow ); + var dt2 = Math.pow( p2.distanceToSquared( p3 ), pow ); + + // safety check for repeated points + if ( dt1 < 1e-4 ) dt1 = 1.0; + if ( dt0 < 1e-4 ) dt0 = dt1; + if ( dt2 < 1e-4 ) dt2 = dt1; + + px.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 ); + py.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 ); + pz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 ); + + } else if ( this.curveType === 'catmullrom' ) { + + px.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension ); + py.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension ); + pz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension ); + + } + + point.set( + px.calc( weight ), + py.calc( weight ), + pz.calc( weight ) + ); + + return point; + +}; + +CatmullRomCurve3.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.points = []; + + for ( var i = 0, l = source.points.length; i < l; i ++ ) { + + var point = source.points[ i ]; + + this.points.push( point.clone() ); + + } + + this.closed = source.closed; + this.curveType = source.curveType; + this.tension = source.tension; + + return this; + +}; + +CatmullRomCurve3.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.points = []; + + for ( var i = 0, l = this.points.length; i < l; i ++ ) { + + var point = this.points[ i ]; + data.points.push( point.toArray() ); + + } + + data.closed = this.closed; + data.curveType = this.curveType; + data.tension = this.tension; + + return data; + +}; + +CatmullRomCurve3.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.points = []; + + for ( var i = 0, l = json.points.length; i < l; i ++ ) { + + var point = json.points[ i ]; + this.points.push( new Vector3().fromArray( point ) ); + + } + + this.closed = json.closed; + this.curveType = json.curveType; + this.tension = json.tension; + + return this; + +}; + + +export { CatmullRomCurve3 }; diff --git a/lib/extras/curves/CubicBezierCurve.js b/lib/extras/curves/CubicBezierCurve.js new file mode 100644 index 0000000..719bc2f --- /dev/null +++ b/lib/extras/curves/CubicBezierCurve.js @@ -0,0 +1,79 @@ +import { Curve } from '../core/Curve.js'; +import { CubicBezier } from '../core/Interpolations.js'; +import { Vector2 } from '../../math/Vector2.js'; + + +function CubicBezierCurve( v0, v1, v2, v3 ) { + + Curve.call( this ); + + this.type = 'CubicBezierCurve'; + + this.v0 = v0 || new Vector2(); + this.v1 = v1 || new Vector2(); + this.v2 = v2 || new Vector2(); + this.v3 = v3 || new Vector2(); + +} + +CubicBezierCurve.prototype = Object.create( Curve.prototype ); +CubicBezierCurve.prototype.constructor = CubicBezierCurve; + +CubicBezierCurve.prototype.isCubicBezierCurve = true; + +CubicBezierCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + + point.set( + CubicBezier( t, v0.x, v1.x, v2.x, v3.x ), + CubicBezier( t, v0.y, v1.y, v2.y, v3.y ) + ); + + return point; + +}; + +CubicBezierCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + this.v3.copy( source.v3 ); + + return this; + +}; + +CubicBezierCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + data.v3 = this.v3.toArray(); + + return data; + +}; + +CubicBezierCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + this.v3.fromArray( json.v3 ); + + return this; + +}; + + +export { CubicBezierCurve }; diff --git a/lib/extras/curves/CubicBezierCurve3.js b/lib/extras/curves/CubicBezierCurve3.js new file mode 100644 index 0000000..3864f01 --- /dev/null +++ b/lib/extras/curves/CubicBezierCurve3.js @@ -0,0 +1,80 @@ +import { Curve } from '../core/Curve.js'; +import { CubicBezier } from '../core/Interpolations.js'; +import { Vector3 } from '../../math/Vector3.js'; + + +function CubicBezierCurve3( v0, v1, v2, v3 ) { + + Curve.call( this ); + + this.type = 'CubicBezierCurve3'; + + this.v0 = v0 || new Vector3(); + this.v1 = v1 || new Vector3(); + this.v2 = v2 || new Vector3(); + this.v3 = v3 || new Vector3(); + +} + +CubicBezierCurve3.prototype = Object.create( Curve.prototype ); +CubicBezierCurve3.prototype.constructor = CubicBezierCurve3; + +CubicBezierCurve3.prototype.isCubicBezierCurve3 = true; + +CubicBezierCurve3.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector3(); + + var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + + point.set( + CubicBezier( t, v0.x, v1.x, v2.x, v3.x ), + CubicBezier( t, v0.y, v1.y, v2.y, v3.y ), + CubicBezier( t, v0.z, v1.z, v2.z, v3.z ) + ); + + return point; + +}; + +CubicBezierCurve3.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + this.v3.copy( source.v3 ); + + return this; + +}; + +CubicBezierCurve3.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + data.v3 = this.v3.toArray(); + + return data; + +}; + +CubicBezierCurve3.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + this.v3.fromArray( json.v3 ); + + return this; + +}; + + +export { CubicBezierCurve3 }; diff --git a/lib/extras/curves/Curves.js b/lib/extras/curves/Curves.js new file mode 100644 index 0000000..c984a85 --- /dev/null +++ b/lib/extras/curves/Curves.js @@ -0,0 +1,10 @@ +export { ArcCurve } from './ArcCurve.js'; +export { CatmullRomCurve3 } from './CatmullRomCurve3.js'; +export { CubicBezierCurve } from './CubicBezierCurve.js'; +export { CubicBezierCurve3 } from './CubicBezierCurve3.js'; +export { EllipseCurve } from './EllipseCurve.js'; +export { LineCurve } from './LineCurve.js'; +export { LineCurve3 } from './LineCurve3.js'; +export { QuadraticBezierCurve } from './QuadraticBezierCurve.js'; +export { QuadraticBezierCurve3 } from './QuadraticBezierCurve3.js'; +export { SplineCurve } from './SplineCurve.js'; diff --git a/lib/extras/curves/EllipseCurve.js b/lib/extras/curves/EllipseCurve.js new file mode 100644 index 0000000..ea536e6 --- /dev/null +++ b/lib/extras/curves/EllipseCurve.js @@ -0,0 +1,158 @@ +import { Curve } from '../core/Curve.js'; +import { Vector2 } from '../../math/Vector2.js'; + + +function EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + Curve.call( this ); + + this.type = 'EllipseCurve'; + + this.aX = aX || 0; + this.aY = aY || 0; + + this.xRadius = xRadius || 1; + this.yRadius = yRadius || 1; + + this.aStartAngle = aStartAngle || 0; + this.aEndAngle = aEndAngle || 2 * Math.PI; + + this.aClockwise = aClockwise || false; + + this.aRotation = aRotation || 0; + +} + +EllipseCurve.prototype = Object.create( Curve.prototype ); +EllipseCurve.prototype.constructor = EllipseCurve; + +EllipseCurve.prototype.isEllipseCurve = true; + +EllipseCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + var twoPi = Math.PI * 2; + var deltaAngle = this.aEndAngle - this.aStartAngle; + var samePoints = Math.abs( deltaAngle ) < Number.EPSILON; + + // ensures that deltaAngle is 0 .. 2 PI + while ( deltaAngle < 0 ) deltaAngle += twoPi; + while ( deltaAngle > twoPi ) deltaAngle -= twoPi; + + if ( deltaAngle < Number.EPSILON ) { + + if ( samePoints ) { + + deltaAngle = 0; + + } else { + + deltaAngle = twoPi; + + } + + } + + if ( this.aClockwise === true && ! samePoints ) { + + if ( deltaAngle === twoPi ) { + + deltaAngle = - twoPi; + + } else { + + deltaAngle = deltaAngle - twoPi; + + } + + } + + var angle = this.aStartAngle + t * deltaAngle; + var x = this.aX + this.xRadius * Math.cos( angle ); + var y = this.aY + this.yRadius * Math.sin( angle ); + + if ( this.aRotation !== 0 ) { + + var cos = Math.cos( this.aRotation ); + var sin = Math.sin( this.aRotation ); + + var tx = x - this.aX; + var ty = y - this.aY; + + // Rotate the point about the center of the ellipse. + x = tx * cos - ty * sin + this.aX; + y = tx * sin + ty * cos + this.aY; + + } + + return point.set( x, y ); + +}; + +EllipseCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.aX = source.aX; + this.aY = source.aY; + + this.xRadius = source.xRadius; + this.yRadius = source.yRadius; + + this.aStartAngle = source.aStartAngle; + this.aEndAngle = source.aEndAngle; + + this.aClockwise = source.aClockwise; + + this.aRotation = source.aRotation; + + return this; + +}; + + +EllipseCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.aX = this.aX; + data.aY = this.aY; + + data.xRadius = this.xRadius; + data.yRadius = this.yRadius; + + data.aStartAngle = this.aStartAngle; + data.aEndAngle = this.aEndAngle; + + data.aClockwise = this.aClockwise; + + data.aRotation = this.aRotation; + + return data; + +}; + +EllipseCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.aX = json.aX; + this.aY = json.aY; + + this.xRadius = json.xRadius; + this.yRadius = json.yRadius; + + this.aStartAngle = json.aStartAngle; + this.aEndAngle = json.aEndAngle; + + this.aClockwise = json.aClockwise; + + this.aRotation = json.aRotation; + + return this; + +}; + + +export { EllipseCurve }; diff --git a/lib/extras/curves/LineCurve.js b/lib/extras/curves/LineCurve.js new file mode 100644 index 0000000..6185f35 --- /dev/null +++ b/lib/extras/curves/LineCurve.js @@ -0,0 +1,90 @@ +import { Vector2 } from '../../math/Vector2.js'; +import { Curve } from '../core/Curve.js'; + + +function LineCurve( v1, v2 ) { + + Curve.call( this ); + + this.type = 'LineCurve'; + + this.v1 = v1 || new Vector2(); + this.v2 = v2 || new Vector2(); + +} + +LineCurve.prototype = Object.create( Curve.prototype ); +LineCurve.prototype.constructor = LineCurve; + +LineCurve.prototype.isLineCurve = true; + +LineCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + 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 + +LineCurve.prototype.getPointAt = function ( u, optionalTarget ) { + + return this.getPoint( u, optionalTarget ); + +}; + +LineCurve.prototype.getTangent = function ( /* t */ ) { + + var tangent = this.v2.clone().sub( this.v1 ); + + return tangent.normalize(); + +}; + +LineCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + +}; + +LineCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + +}; + +LineCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + +}; + + +export { LineCurve }; diff --git a/lib/extras/curves/LineCurve3.js b/lib/extras/curves/LineCurve3.js new file mode 100644 index 0000000..5ee830a --- /dev/null +++ b/lib/extras/curves/LineCurve3.js @@ -0,0 +1,82 @@ +import { Vector3 } from '../../math/Vector3.js'; +import { Curve } from '../core/Curve.js'; + + +function LineCurve3( v1, v2 ) { + + Curve.call( this ); + + this.type = 'LineCurve3'; + + this.v1 = v1 || new Vector3(); + this.v2 = v2 || new Vector3(); + +} + +LineCurve3.prototype = Object.create( Curve.prototype ); +LineCurve3.prototype.constructor = LineCurve3; + +LineCurve3.prototype.isLineCurve3 = true; + +LineCurve3.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector3(); + + 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 + +LineCurve3.prototype.getPointAt = function ( u, optionalTarget ) { + + return this.getPoint( u, optionalTarget ); + +}; + +LineCurve3.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + +}; + +LineCurve3.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + +}; + +LineCurve3.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + +}; + + +export { LineCurve3 }; diff --git a/lib/extras/curves/QuadraticBezierCurve.js b/lib/extras/curves/QuadraticBezierCurve.js new file mode 100644 index 0000000..71db153 --- /dev/null +++ b/lib/extras/curves/QuadraticBezierCurve.js @@ -0,0 +1,75 @@ +import { Curve } from '../core/Curve.js'; +import { QuadraticBezier } from '../core/Interpolations.js'; +import { Vector2 } from '../../math/Vector2.js'; + + +function QuadraticBezierCurve( v0, v1, v2 ) { + + Curve.call( this ); + + this.type = 'QuadraticBezierCurve'; + + this.v0 = v0 || new Vector2(); + this.v1 = v1 || new Vector2(); + this.v2 = v2 || new Vector2(); + +} + +QuadraticBezierCurve.prototype = Object.create( Curve.prototype ); +QuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve; + +QuadraticBezierCurve.prototype.isQuadraticBezierCurve = true; + +QuadraticBezierCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + var v0 = this.v0, v1 = this.v1, v2 = this.v2; + + point.set( + QuadraticBezier( t, v0.x, v1.x, v2.x ), + QuadraticBezier( t, v0.y, v1.y, v2.y ) + ); + + return point; + +}; + +QuadraticBezierCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + +}; + +QuadraticBezierCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + +}; + +QuadraticBezierCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + +}; + + +export { QuadraticBezierCurve }; diff --git a/lib/extras/curves/QuadraticBezierCurve3.js b/lib/extras/curves/QuadraticBezierCurve3.js new file mode 100644 index 0000000..ab2042d --- /dev/null +++ b/lib/extras/curves/QuadraticBezierCurve3.js @@ -0,0 +1,76 @@ +import { Curve } from '../core/Curve.js'; +import { QuadraticBezier } from '../core/Interpolations.js'; +import { Vector3 } from '../../math/Vector3.js'; + + +function QuadraticBezierCurve3( v0, v1, v2 ) { + + Curve.call( this ); + + this.type = 'QuadraticBezierCurve3'; + + this.v0 = v0 || new Vector3(); + this.v1 = v1 || new Vector3(); + this.v2 = v2 || new Vector3(); + +} + +QuadraticBezierCurve3.prototype = Object.create( Curve.prototype ); +QuadraticBezierCurve3.prototype.constructor = QuadraticBezierCurve3; + +QuadraticBezierCurve3.prototype.isQuadraticBezierCurve3 = true; + +QuadraticBezierCurve3.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector3(); + + var v0 = this.v0, v1 = this.v1, v2 = this.v2; + + point.set( + QuadraticBezier( t, v0.x, v1.x, v2.x ), + QuadraticBezier( t, v0.y, v1.y, v2.y ), + QuadraticBezier( t, v0.z, v1.z, v2.z ) + ); + + return point; + +}; + +QuadraticBezierCurve3.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + +}; + +QuadraticBezierCurve3.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + +}; + +QuadraticBezierCurve3.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + +}; + + +export { QuadraticBezierCurve3 }; diff --git a/lib/extras/curves/SplineCurve.js b/lib/extras/curves/SplineCurve.js new file mode 100644 index 0000000..e844b00 --- /dev/null +++ b/lib/extras/curves/SplineCurve.js @@ -0,0 +1,98 @@ +import { Curve } from '../core/Curve.js'; +import { CatmullRom } from '../core/Interpolations.js'; +import { Vector2 } from '../../math/Vector2.js'; + + +function SplineCurve( points /* array of Vector2 */ ) { + + Curve.call( this ); + + this.type = 'SplineCurve'; + + this.points = points || []; + +} + +SplineCurve.prototype = Object.create( Curve.prototype ); +SplineCurve.prototype.constructor = SplineCurve; + +SplineCurve.prototype.isSplineCurve = true; + +SplineCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + var points = this.points; + var p = ( points.length - 1 ) * t; + + var intPoint = Math.floor( p ); + var weight = p - intPoint; + + var p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ]; + var p1 = points[ intPoint ]; + var p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ]; + var p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ]; + + point.set( + CatmullRom( weight, p0.x, p1.x, p2.x, p3.x ), + CatmullRom( weight, p0.y, p1.y, p2.y, p3.y ) + ); + + return point; + +}; + +SplineCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.points = []; + + for ( var i = 0, l = source.points.length; i < l; i ++ ) { + + var point = source.points[ i ]; + + this.points.push( point.clone() ); + + } + + return this; + +}; + +SplineCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.points = []; + + for ( var i = 0, l = this.points.length; i < l; i ++ ) { + + var point = this.points[ i ]; + data.points.push( point.toArray() ); + + } + + return data; + +}; + +SplineCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.points = []; + + for ( var i = 0, l = json.points.length; i < l; i ++ ) { + + var point = json.points[ i ]; + this.points.push( new Vector2().fromArray( point ) ); + + } + + return this; + +}; + + +export { SplineCurve }; diff --git a/lib/extras/objects/ImmediateRenderObject.js b/lib/extras/objects/ImmediateRenderObject.js new file mode 100644 index 0000000..f10becf --- /dev/null +++ b/lib/extras/objects/ImmediateRenderObject.js @@ -0,0 +1,22 @@ +import { Object3D } from '../../core/Object3D.js'; + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +function ImmediateRenderObject( material ) { + + Object3D.call( this ); + + this.material = material; + this.render = function ( /* renderCallback */ ) {}; + +} + +ImmediateRenderObject.prototype = Object.create( Object3D.prototype ); +ImmediateRenderObject.prototype.constructor = ImmediateRenderObject; + +ImmediateRenderObject.prototype.isImmediateRenderObject = true; + + +export { ImmediateRenderObject }; diff --git a/lib/geometries/BoxGeometry.js b/lib/geometries/BoxGeometry.js new file mode 100644 index 0000000..b4dc014 --- /dev/null +++ b/lib/geometries/BoxGeometry.js @@ -0,0 +1,203 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { Geometry } from '../core/Geometry.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { Vector3 } from '../math/Vector3.js'; + +// BoxGeometry + +function BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) { + + Geometry.call( this ); + + this.type = 'BoxGeometry'; + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + this.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) ); + this.mergeVertices(); + +} + +BoxGeometry.prototype = Object.create( Geometry.prototype ); +BoxGeometry.prototype.constructor = BoxGeometry; + +// BoxBufferGeometry + +function BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) { + + BufferGeometry.call( this ); + + this.type = 'BoxBufferGeometry'; + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + var scope = this; + + width = width || 1; + height = height || 1; + depth = depth || 1; + + // segments + + widthSegments = Math.floor( widthSegments ) || 1; + heightSegments = Math.floor( heightSegments ) || 1; + depthSegments = Math.floor( depthSegments ) || 1; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var numberOfVertices = 0; + var 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( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + function buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) { + + var segmentWidth = width / gridX; + var segmentHeight = height / gridY; + + var widthHalf = width / 2; + var heightHalf = height / 2; + var depthHalf = depth / 2; + + var gridX1 = gridX + 1; + var gridY1 = gridY + 1; + + var vertexCounter = 0; + var groupCount = 0; + + var ix, iy; + + var vector = new Vector3(); + + // generate vertices, normals and uvs + + for ( iy = 0; iy < gridY1; iy ++ ) { + + var y = iy * segmentHeight - heightHalf; + + for ( ix = 0; ix < gridX1; ix ++ ) { + + var 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 ( iy = 0; iy < gridY; iy ++ ) { + + for ( ix = 0; ix < gridX; ix ++ ) { + + var a = numberOfVertices + ix + gridX1 * iy; + var b = numberOfVertices + ix + gridX1 * ( iy + 1 ); + var c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 ); + var 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; + + } + +} + +BoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); +BoxBufferGeometry.prototype.constructor = BoxBufferGeometry; + + +export { BoxGeometry, BoxBufferGeometry }; diff --git a/lib/geometries/CircleGeometry.js b/lib/geometries/CircleGeometry.js new file mode 100644 index 0000000..20904b9 --- /dev/null +++ b/lib/geometries/CircleGeometry.js @@ -0,0 +1,121 @@ +/** + * @author benaadams / https://twitter.com/ben_a_adams + * @author Mugen87 / https://github.com/Mugen87 + * @author hughes + */ + +import { Geometry } from '../core/Geometry.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { Vector3 } from '../math/Vector3.js'; +import { Vector2 } from '../math/Vector2.js'; + +// CircleGeometry + +function CircleGeometry( radius, segments, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'CircleGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) ); + this.mergeVertices(); + +} + +CircleGeometry.prototype = Object.create( Geometry.prototype ); +CircleGeometry.prototype.constructor = CircleGeometry; + +// CircleBufferGeometry + +function CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'CircleBufferGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radius = radius || 1; + segments = segments !== undefined ? Math.max( 3, segments ) : 8; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var i, s; + var vertex = new Vector3(); + var uv = new Vector2(); + + // center point + + vertices.push( 0, 0, 0 ); + normals.push( 0, 0, 1 ); + uvs.push( 0.5, 0.5 ); + + for ( s = 0, i = 3; s <= segments; s ++, i += 3 ) { + + var 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 ( i = 1; i <= segments; i ++ ) { + + indices.push( i, i + 1, 0 ); + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + +} + +CircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); +CircleBufferGeometry.prototype.constructor = CircleBufferGeometry; + + +export { CircleGeometry, CircleBufferGeometry }; diff --git a/lib/geometries/ConeGeometry.js b/lib/geometries/ConeGeometry.js new file mode 100644 index 0000000..21df9ac --- /dev/null +++ b/lib/geometries/ConeGeometry.js @@ -0,0 +1,55 @@ +/** + * @author abelnation / http://github.com/abelnation + */ + +import { CylinderGeometry } from './CylinderGeometry.js'; +import { CylinderBufferGeometry } from './CylinderGeometry.js'; + +// ConeGeometry + +function ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + CylinderGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); + + this.type = 'ConeGeometry'; + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + +} + +ConeGeometry.prototype = Object.create( CylinderGeometry.prototype ); +ConeGeometry.prototype.constructor = ConeGeometry; + +// ConeBufferGeometry + +function ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + CylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); + + this.type = 'ConeBufferGeometry'; + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + +} + +ConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype ); +ConeBufferGeometry.prototype.constructor = ConeBufferGeometry; + + +export { ConeGeometry, ConeBufferGeometry }; diff --git a/lib/geometries/CylinderGeometry.js b/lib/geometries/CylinderGeometry.js new file mode 100644 index 0000000..e345a03 --- /dev/null +++ b/lib/geometries/CylinderGeometry.js @@ -0,0 +1,316 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { Geometry } from '../core/Geometry.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { Vector3 } from '../math/Vector3.js'; +import { Vector2 } from '../math/Vector2.js'; + +// CylinderGeometry + +function CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'CylinderGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) ); + this.mergeVertices(); + +} + +CylinderGeometry.prototype = Object.create( Geometry.prototype ); +CylinderGeometry.prototype.constructor = CylinderGeometry; + +// CylinderBufferGeometry + +function CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'CylinderBufferGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + var scope = this; + + radiusTop = radiusTop !== undefined ? radiusTop : 1; + radiusBottom = radiusBottom !== undefined ? radiusBottom : 1; + height = height || 1; + + radialSegments = Math.floor( radialSegments ) || 8; + heightSegments = Math.floor( heightSegments ) || 1; + + openEnded = openEnded !== undefined ? openEnded : false; + thetaStart = thetaStart !== undefined ? thetaStart : 0.0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var index = 0; + var indexArray = []; + var halfHeight = height / 2; + var groupStart = 0; + + // generate geometry + + generateTorso(); + + if ( openEnded === false ) { + + if ( radiusTop > 0 ) generateCap( true ); + if ( radiusBottom > 0 ) generateCap( false ); + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + function generateTorso() { + + var x, y; + var normal = new Vector3(); + var vertex = new Vector3(); + + var groupCount = 0; + + // this will be used to calculate the normal + var slope = ( radiusBottom - radiusTop ) / height; + + // generate vertices, normals and uvs + + for ( y = 0; y <= heightSegments; y ++ ) { + + var indexRow = []; + + var v = y / heightSegments; + + // calculate the radius of the current row + + var radius = v * ( radiusBottom - radiusTop ) + radiusTop; + + for ( x = 0; x <= radialSegments; x ++ ) { + + var u = x / radialSegments; + + var theta = u * thetaLength + thetaStart; + + var sinTheta = Math.sin( theta ); + var 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 + + var a = indexArray[ y ][ x ]; + var b = indexArray[ y + 1 ][ x ]; + var c = indexArray[ y + 1 ][ x + 1 ]; + var d = indexArray[ y ][ x + 1 ]; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + // update group counter + + groupCount += 6; + + } + + } + + // 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 ) { + + var x, centerIndexStart, centerIndexEnd; + + var uv = new Vector2(); + var vertex = new Vector3(); + + var groupCount = 0; + + var radius = ( top === true ) ? radiusTop : radiusBottom; + var sign = ( top === true ) ? 1 : - 1; + + // save the index of the first center vertex + centerIndexStart = index; + + // 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 + + centerIndexEnd = index; + + // now we generate the surrounding vertices, normals and uvs + + for ( x = 0; x <= radialSegments; x ++ ) { + + var u = x / radialSegments; + var theta = u * thetaLength + thetaStart; + + var cosTheta = Math.cos( theta ); + var 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 ++ ) { + + var c = centerIndexStart + x; + var 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; + + } + +} + +CylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); +CylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry; + + +export { CylinderGeometry, CylinderBufferGeometry }; diff --git a/lib/geometries/DodecahedronGeometry.js b/lib/geometries/DodecahedronGeometry.js new file mode 100644 index 0000000..384ee81 --- /dev/null +++ b/lib/geometries/DodecahedronGeometry.js @@ -0,0 +1,88 @@ +/** + * @author Abe Pazos / https://hamoid.com + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { Geometry } from '../core/Geometry.js'; +import { PolyhedronBufferGeometry } from './PolyhedronGeometry.js'; + +// DodecahedronGeometry + +function DodecahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'DodecahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + +} + +DodecahedronGeometry.prototype = Object.create( Geometry.prototype ); +DodecahedronGeometry.prototype.constructor = DodecahedronGeometry; + +// DodecahedronBufferGeometry + +function DodecahedronBufferGeometry( radius, detail ) { + + var t = ( 1 + Math.sqrt( 5 ) ) / 2; + var r = 1 / t; + + var 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 + ]; + + var 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 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'DodecahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + +} + +DodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); +DodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry; + + +export { DodecahedronGeometry, DodecahedronBufferGeometry }; diff --git a/lib/geometries/EdgesGeometry.js b/lib/geometries/EdgesGeometry.js new file mode 100644 index 0000000..aef6085 --- /dev/null +++ b/lib/geometries/EdgesGeometry.js @@ -0,0 +1,113 @@ +/** + * @author WestLangley / http://github.com/WestLangley + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { Geometry } from '../core/Geometry.js'; +import { _Math } from '../math/Math.js'; + +function EdgesGeometry( geometry, thresholdAngle ) { + + BufferGeometry.call( this ); + + this.type = 'EdgesGeometry'; + + this.parameters = { + thresholdAngle: thresholdAngle + }; + + thresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1; + + // buffer + + var vertices = []; + + // helper variables + + var thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle ); + var edge = [ 0, 0 ], edges = {}, edge1, edge2; + var key, keys = [ 'a', 'b', 'c' ]; + + // prepare source geometry + + var geometry2; + + if ( geometry.isBufferGeometry ) { + + geometry2 = new Geometry(); + geometry2.fromBufferGeometry( geometry ); + + } else { + + geometry2 = geometry.clone(); + + } + + geometry2.mergeVertices(); + geometry2.computeFaceNormals(); + + var sourceVertices = geometry2.vertices; + var faces = geometry2.faces; + + // now create a data structure where each entry represents an edge with its adjoining faces + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0; j < 3; j ++ ) { + + edge1 = face[ keys[ j ] ]; + edge2 = face[ keys[ ( 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; + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + var 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 || faces[ e.face1 ].normal.dot( faces[ e.face2 ].normal ) <= thresholdDot ) { + + var vertex = sourceVertices[ e.index1 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex = sourceVertices[ e.index2 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + // build geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + +} + +EdgesGeometry.prototype = Object.create( BufferGeometry.prototype ); +EdgesGeometry.prototype.constructor = EdgesGeometry; + + +export { EdgesGeometry }; diff --git a/lib/geometries/ExtrudeGeometry.js b/lib/geometries/ExtrudeGeometry.js new file mode 100644 index 0000000..513f18f --- /dev/null +++ b/lib/geometries/ExtrudeGeometry.js @@ -0,0 +1,832 @@ +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + * Creates extruded geometry from a path shape. + * + * parameters = { + * + * curveSegments: , // number of points on the curves + * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too + * depth: , // Depth to extrude the shape + * + * bevelEnabled: , // turn on bevel + * bevelThickness: , // how deep into the original shape bevel goes + * bevelSize: , // how far from shape outline is bevel + * bevelSegments: , // number of bevel layers + * + * extrudePath: // curve to extrude shape along + * + * UVGenerator: // object that provides UV generator functions + * + * } + */ + +import { Geometry } from '../core/Geometry.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { Vector2 } from '../math/Vector2.js'; +import { Vector3 } from '../math/Vector3.js'; +import { ShapeUtils } from '../extras/ShapeUtils.js'; + +// ExtrudeGeometry + +function ExtrudeGeometry( shapes, options ) { + + Geometry.call( this ); + + this.type = 'ExtrudeGeometry'; + + this.parameters = { + shapes: shapes, + options: options + }; + + this.fromBufferGeometry( new ExtrudeBufferGeometry( shapes, options ) ); + this.mergeVertices(); + +} + +ExtrudeGeometry.prototype = Object.create( Geometry.prototype ); +ExtrudeGeometry.prototype.constructor = ExtrudeGeometry; + +ExtrudeGeometry.prototype.toJSON = function () { + + var data = Geometry.prototype.toJSON.call( this ); + + var shapes = this.parameters.shapes; + var options = this.parameters.options; + + return toJSON( shapes, options, data ); + +}; + +// ExtrudeBufferGeometry + +function ExtrudeBufferGeometry( shapes, options ) { + + BufferGeometry.call( this ); + + this.type = 'ExtrudeBufferGeometry'; + + this.parameters = { + shapes: shapes, + options: options + }; + + shapes = Array.isArray( shapes ) ? shapes : [ shapes ]; + + var scope = this; + + var verticesArray = []; + var uvArray = []; + + for ( var i = 0, l = shapes.length; i < l; i ++ ) { + + var shape = shapes[ i ]; + addShape( shape ); + + } + + // build geometry + + this.addAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) ); + + this.computeVertexNormals(); + + // functions + + function addShape( shape ) { + + var placeholder = []; + + // options + + var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12; + var steps = options.steps !== undefined ? options.steps : 1; + var depth = options.depth !== undefined ? options.depth : 100; + + var bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; + var bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; + var bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; + var bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3; + + var extrudePath = options.extrudePath; + + var uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator; + + // deprecated options + + if ( options.amount !== undefined ) { + + console.warn( 'THREE.ExtrudeBufferGeometry: amount has been renamed to depth.' ); + depth = options.amount; + + } + + // + + var extrudePts, extrudeByPath = false; + var splineTube, binormal, normal, position2; + + if ( extrudePath ) { + + extrudePts = extrudePath.getSpacedPoints( steps ); + + extrudeByPath = true; + bevelEnabled = false; // bevels not supported for path extrusion + + // SETUP TNB variables + + // TODO1 - have a .isClosed in spline? + + splineTube = extrudePath.computeFrenetFrames( steps, false ); + + // console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length); + + binormal = new Vector3(); + normal = new Vector3(); + position2 = new Vector3(); + + } + + // Safeguards if bevels are not enabled + + if ( ! bevelEnabled ) { + + bevelSegments = 0; + bevelThickness = 0; + bevelSize = 0; + + } + + // Variables initialization + + var ahole, h, hl; // looping of holes + + var shapePoints = shape.extractPoints( curveSegments ); + + var vertices = shapePoints.shape; + var holes = shapePoints.holes; + + var reverse = ! ShapeUtils.isClockWise( vertices ); + + if ( reverse ) { + + vertices = vertices.reverse(); + + // Maybe we should also check if holes are in the opposite direction, just to be safe ... + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + if ( ShapeUtils.isClockWise( ahole ) ) { + + holes[ h ] = ahole.reverse(); + + } + + } + + } + + + var faces = ShapeUtils.triangulateShape( vertices, holes ); + + /* Vertices */ + + var contour = vertices; // vertices has all points but contour has only points of circumference + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + vertices = vertices.concat( ahole ); + + } + + + function scalePt2( pt, vec, size ) { + + if ( ! vec ) console.error( "THREE.ExtrudeGeometry: vec does not exist" ); + + return vec.clone().multiplyScalar( size ).add( pt ); + + } + + var b, bs, t, z, + vert, vlen = vertices.length, + face, flen = faces.length; + + + // Find directions for point movement + + + function getBevelVec( inPt, inPrev, inNext ) { + + // computes for inPt the corresponding point inPt' on a new contour + // shifted by 1 unit (length of normalized vector) to the left + // if we walk along contour clockwise, this new contour is outside the old one + // + // inPt' is the intersection of the two lines parallel to the two + // adjacent edges of inPt at a distance of 1 unit on the left side. + + var v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt + + // good reading for geometry algorithms (here: line-line intersection) + // http://geomalgorithms.com/a05-_intersect-1.html + + var v_prev_x = inPt.x - inPrev.x, + v_prev_y = inPt.y - inPrev.y; + var v_next_x = inNext.x - inPt.x, + v_next_y = inNext.y - inPt.y; + + var v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y ); + + // check for collinear edges + var collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + if ( Math.abs( collinear0 ) > Number.EPSILON ) { + + // not collinear + + // length of vectors for normalizing + + var v_prev_len = Math.sqrt( v_prev_lensq ); + var v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y ); + + // shift adjacent points by unit vectors to the left + + var ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len ); + var ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len ); + + var ptNextShift_x = ( inNext.x - v_next_y / v_next_len ); + var ptNextShift_y = ( inNext.y + v_next_x / v_next_len ); + + // scaling factor for v_prev to intersection point + + var sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y - + ( ptNextShift_y - ptPrevShift_y ) * v_next_x ) / + ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + // vector from inPt to intersection point + + v_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x ); + v_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y ); + + // Don't normalize!, otherwise sharp corners become ugly + // but prevent crazy spikes + var v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y ); + if ( v_trans_lensq <= 2 ) { + + return new Vector2( v_trans_x, v_trans_y ); + + } else { + + shrink_by = Math.sqrt( v_trans_lensq / 2 ); + + } + + } else { + + // handle special case of collinear edges + + var direction_eq = false; // assumes: opposite + if ( v_prev_x > Number.EPSILON ) { + + if ( v_next_x > Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( v_prev_x < - Number.EPSILON ) { + + if ( v_next_x < - Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) { + + direction_eq = true; + + } + + } + + } + + if ( direction_eq ) { + + // console.log("Warning: lines are a straight sequence"); + v_trans_x = - v_prev_y; + v_trans_y = v_prev_x; + shrink_by = Math.sqrt( v_prev_lensq ); + + } else { + + // console.log("Warning: lines are a straight spike"); + v_trans_x = v_prev_x; + v_trans_y = v_prev_y; + shrink_by = Math.sqrt( v_prev_lensq / 2 ); + + } + + } + + return new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by ); + + } + + + var contourMovements = []; + + for ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + // console.log('i,j,k', i, j , k) + + contourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] ); + + } + + var holesMovements = [], + oneHoleMovements, verticesMovements = contourMovements.concat(); + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + oneHoleMovements = []; + + for ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + oneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] ); + + } + + holesMovements.push( oneHoleMovements ); + verticesMovements = verticesMovements.concat( oneHoleMovements ); + + } + + + // Loop bevelSegments, 1 for the front, 1 for the back + + for ( b = 0; b < bevelSegments; b ++ ) { + + //for ( b = bevelSegments; b > 0; b -- ) { + + t = b / bevelSegments; + z = bevelThickness * Math.cos( t * Math.PI / 2 ); + bs = bevelSize * Math.sin( t * Math.PI / 2 ); + + // contract shape + + for ( i = 0, il = contour.length; i < il; i ++ ) { + + vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + // expand holes + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( i = 0, il = ahole.length; i < il; i ++ ) { + + vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + } + + } + + bs = bevelSize; + + // Back facing vertices + + for ( i = 0; i < vlen; i ++ ) { + + vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, 0 ); + + } else { + + // v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x ); + + normal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + // Add stepped vertices... + // Including front facing vertices + + var s; + + for ( s = 1; s <= steps; s ++ ) { + + for ( i = 0; i < vlen; i ++ ) { + + vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, depth / steps * s ); + + } else { + + // v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x ); + + normal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ s ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + } + + + // Add bevel segments planes + + //for ( b = 1; b <= bevelSegments; b ++ ) { + for ( b = bevelSegments - 1; b >= 0; b -- ) { + + t = b / bevelSegments; + z = bevelThickness * Math.cos( t * Math.PI / 2 ); + bs = bevelSize * Math.sin( t * Math.PI / 2 ); + + // contract shape + + for ( i = 0, il = contour.length; i < il; i ++ ) { + + vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + v( vert.x, vert.y, depth + z ); + + } + + // expand holes + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( i = 0, il = ahole.length; i < il; i ++ ) { + + vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, depth + z ); + + } else { + + v( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z ); + + } + + } + + } + + } + + /* Faces */ + + // Top and bottom faces + + buildLidFaces(); + + // Sides faces + + buildSideFaces(); + + + ///// Internal functions + + function buildLidFaces() { + + var start = verticesArray.length / 3; + + if ( bevelEnabled ) { + + var layer = 0; // steps + 1 + var offset = vlen * layer; + + // Bottom faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset ); + + } + + layer = steps + bevelSegments * 2; + offset = vlen * layer; + + // Top faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset ); + + } + + } else { + + // Bottom faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 2 ], face[ 1 ], face[ 0 ] ); + + } + + // Top faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps ); + + } + + } + + scope.addGroup( start, verticesArray.length / 3 - start, 0 ); + + } + + // Create faces for the z-sides of the shape + + function buildSideFaces() { + + var start = verticesArray.length / 3; + var layeroffset = 0; + sidewalls( contour, layeroffset ); + layeroffset += contour.length; + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + sidewalls( ahole, layeroffset ); + + //, true + layeroffset += ahole.length; + + } + + + scope.addGroup( start, verticesArray.length / 3 - start, 1 ); + + + } + + function sidewalls( contour, layeroffset ) { + + var j, k; + i = contour.length; + + while ( -- i >= 0 ) { + + j = i; + k = i - 1; + if ( k < 0 ) k = contour.length - 1; + + //console.log('b', i,j, i-1, k,vertices.length); + + var s = 0, + sl = steps + bevelSegments * 2; + + for ( s = 0; s < sl; s ++ ) { + + var slen1 = vlen * s; + var slen2 = vlen * ( s + 1 ); + + var a = layeroffset + j + slen1, + b = layeroffset + k + slen1, + c = layeroffset + k + slen2, + d = layeroffset + j + slen2; + + f4( a, b, c, d ); + + } + + } + + } + + function v( x, y, z ) { + + placeholder.push( x ); + placeholder.push( y ); + placeholder.push( z ); + + } + + + function f3( a, b, c ) { + + addVertex( a ); + addVertex( b ); + addVertex( c ); + + var nextIndex = verticesArray.length / 3; + var uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 ); + + addUV( uvs[ 0 ] ); + addUV( uvs[ 1 ] ); + addUV( uvs[ 2 ] ); + + } + + function f4( a, b, c, d ) { + + addVertex( a ); + addVertex( b ); + addVertex( d ); + + addVertex( b ); + addVertex( c ); + addVertex( d ); + + + var nextIndex = verticesArray.length / 3; + var uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 ); + + addUV( uvs[ 0 ] ); + addUV( uvs[ 1 ] ); + addUV( uvs[ 3 ] ); + + addUV( uvs[ 1 ] ); + addUV( uvs[ 2 ] ); + addUV( uvs[ 3 ] ); + + } + + function addVertex( index ) { + + verticesArray.push( placeholder[ index * 3 + 0 ] ); + verticesArray.push( placeholder[ index * 3 + 1 ] ); + verticesArray.push( placeholder[ index * 3 + 2 ] ); + + } + + + function addUV( vector2 ) { + + uvArray.push( vector2.x ); + uvArray.push( vector2.y ); + + } + + } + +} + +ExtrudeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); +ExtrudeBufferGeometry.prototype.constructor = ExtrudeBufferGeometry; + +ExtrudeBufferGeometry.prototype.toJSON = function () { + + var data = BufferGeometry.prototype.toJSON.call( this ); + + var shapes = this.parameters.shapes; + var options = this.parameters.options; + + return toJSON( shapes, options, data ); + +}; + +// + +var WorldUVGenerator = { + + generateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) { + + var a_x = vertices[ indexA * 3 ]; + var a_y = vertices[ indexA * 3 + 1 ]; + var b_x = vertices[ indexB * 3 ]; + var b_y = vertices[ indexB * 3 + 1 ]; + var c_x = vertices[ indexC * 3 ]; + var c_y = vertices[ indexC * 3 + 1 ]; + + return [ + new Vector2( a_x, a_y ), + new Vector2( b_x, b_y ), + new Vector2( c_x, c_y ) + ]; + + }, + + generateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) { + + var a_x = vertices[ indexA * 3 ]; + var a_y = vertices[ indexA * 3 + 1 ]; + var a_z = vertices[ indexA * 3 + 2 ]; + var b_x = vertices[ indexB * 3 ]; + var b_y = vertices[ indexB * 3 + 1 ]; + var b_z = vertices[ indexB * 3 + 2 ]; + var c_x = vertices[ indexC * 3 ]; + var c_y = vertices[ indexC * 3 + 1 ]; + var c_z = vertices[ indexC * 3 + 2 ]; + var d_x = vertices[ indexD * 3 ]; + var d_y = vertices[ indexD * 3 + 1 ]; + var d_z = vertices[ indexD * 3 + 2 ]; + + if ( Math.abs( a_y - b_y ) < 0.01 ) { + + return [ + new Vector2( a_x, 1 - a_z ), + new Vector2( b_x, 1 - b_z ), + new Vector2( c_x, 1 - c_z ), + new Vector2( d_x, 1 - d_z ) + ]; + + } else { + + return [ + new Vector2( a_y, 1 - a_z ), + new Vector2( b_y, 1 - b_z ), + new Vector2( c_y, 1 - c_z ), + new Vector2( d_y, 1 - d_z ) + ]; + + } + + } +}; + +function toJSON( shapes, options, data ) { + + // + + data.shapes = []; + + if ( Array.isArray( shapes ) ) { + + for ( var i = 0, l = shapes.length; i < l; i ++ ) { + + var shape = shapes[ i ]; + + data.shapes.push( shape.uuid ); + + } + + } else { + + data.shapes.push( shapes.uuid ); + + } + + // + + if ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON(); + + return data; + +} + + +export { ExtrudeGeometry, ExtrudeBufferGeometry }; diff --git a/lib/geometries/Geometries.js b/lib/geometries/Geometries.js new file mode 100644 index 0000000..c374cb5 --- /dev/null +++ b/lib/geometries/Geometries.js @@ -0,0 +1,22 @@ +export { WireframeGeometry } from './WireframeGeometry.js'; +export { ParametricGeometry, ParametricBufferGeometry } from './ParametricGeometry.js'; +export { TetrahedronGeometry, TetrahedronBufferGeometry } from './TetrahedronGeometry.js'; +export { OctahedronGeometry, OctahedronBufferGeometry } from './OctahedronGeometry.js'; +export { IcosahedronGeometry, IcosahedronBufferGeometry } from './IcosahedronGeometry.js'; +export { DodecahedronGeometry, DodecahedronBufferGeometry } from './DodecahedronGeometry.js'; +export { PolyhedronGeometry, PolyhedronBufferGeometry } from './PolyhedronGeometry.js'; +export { TubeGeometry, TubeBufferGeometry } from './TubeGeometry.js'; +export { TorusKnotGeometry, TorusKnotBufferGeometry } from './TorusKnotGeometry.js'; +export { TorusGeometry, TorusBufferGeometry } from './TorusGeometry.js'; +export { TextGeometry, TextBufferGeometry } from './TextGeometry.js'; +export { SphereGeometry, SphereBufferGeometry } from './SphereGeometry.js'; +export { RingGeometry, RingBufferGeometry } from './RingGeometry.js'; +export { PlaneGeometry, PlaneBufferGeometry } from './PlaneGeometry.js'; +export { LatheGeometry, LatheBufferGeometry } from './LatheGeometry.js'; +export { ShapeGeometry, ShapeBufferGeometry } from './ShapeGeometry.js'; +export { ExtrudeGeometry, ExtrudeBufferGeometry } from './ExtrudeGeometry.js'; +export { EdgesGeometry } from './EdgesGeometry.js'; +export { ConeGeometry, ConeBufferGeometry } from './ConeGeometry.js'; +export { CylinderGeometry, CylinderBufferGeometry } from './CylinderGeometry.js'; +export { CircleGeometry, CircleBufferGeometry } from './CircleGeometry.js'; +export { BoxGeometry, BoxBufferGeometry } from './BoxGeometry.js'; diff --git a/lib/geometries/IcosahedronGeometry.js b/lib/geometries/IcosahedronGeometry.js new file mode 100644 index 0000000..00f5249 --- /dev/null +++ b/lib/geometries/IcosahedronGeometry.js @@ -0,0 +1,64 @@ +/** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { Geometry } from '../core/Geometry.js'; +import { PolyhedronBufferGeometry } from './PolyhedronGeometry.js'; + +// IcosahedronGeometry + +function IcosahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'IcosahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + +} + +IcosahedronGeometry.prototype = Object.create( Geometry.prototype ); +IcosahedronGeometry.prototype.constructor = IcosahedronGeometry; + +// IcosahedronBufferGeometry + +function IcosahedronBufferGeometry( radius, detail ) { + + var t = ( 1 + Math.sqrt( 5 ) ) / 2; + + var 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 + ]; + + var 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 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'IcosahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + +} + +IcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); +IcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry; + + +export { IcosahedronGeometry, IcosahedronBufferGeometry }; diff --git a/lib/geometries/LatheGeometry.js b/lib/geometries/LatheGeometry.js new file mode 100644 index 0000000..907de87 --- /dev/null +++ b/lib/geometries/LatheGeometry.js @@ -0,0 +1,186 @@ +/** + * @author zz85 / https://github.com/zz85 + * @author bhouston / http://clara.io + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { Geometry } from '../core/Geometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Vector3 } from '../math/Vector3.js'; +import { Vector2 } from '../math/Vector2.js'; +import { _Math } from '../math/Math.js'; + +// LatheGeometry + +function LatheGeometry( points, segments, phiStart, phiLength ) { + + Geometry.call( this ); + + this.type = 'LatheGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + this.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) ); + this.mergeVertices(); + +} + +LatheGeometry.prototype = Object.create( Geometry.prototype ); +LatheGeometry.prototype.constructor = LatheGeometry; + +// LatheBufferGeometry + +function LatheBufferGeometry( points, segments, phiStart, phiLength ) { + + BufferGeometry.call( this ); + + this.type = 'LatheBufferGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + segments = Math.floor( segments ) || 12; + phiStart = phiStart || 0; + phiLength = phiLength || Math.PI * 2; + + // clamp phiLength so it's in range of [ 0, 2PI ] + + phiLength = _Math.clamp( phiLength, 0, Math.PI * 2 ); + + + // buffers + + var indices = []; + var vertices = []; + var uvs = []; + + // helper variables + + var base; + var inverseSegments = 1.0 / segments; + var vertex = new Vector3(); + var uv = new Vector2(); + var i, j; + + // generate vertices and uvs + + for ( i = 0; i <= segments; i ++ ) { + + var phi = phiStart + i * inverseSegments * phiLength; + + var sin = Math.sin( phi ); + var cos = Math.cos( phi ); + + for ( j = 0; j <= ( points.length - 1 ); j ++ ) { + + // vertex + + vertex.x = points[ j ].x * sin; + vertex.y = points[ j ].y; + vertex.z = points[ j ].x * cos; + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // uv + + uv.x = i / segments; + uv.y = j / ( points.length - 1 ); + + uvs.push( uv.x, uv.y ); + + + } + + } + + // indices + + for ( i = 0; i < segments; i ++ ) { + + for ( j = 0; j < ( points.length - 1 ); j ++ ) { + + base = j + i * points.length; + + var a = base; + var b = base + points.length; + var c = base + points.length + 1; + var d = base + 1; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // generate normals + + this.computeVertexNormals(); + + // if the geometry is closed, we need to average the normals along the seam. + // because the corresponding vertices are identical (but still have different UVs). + + if ( phiLength === Math.PI * 2 ) { + + var normals = this.attributes.normal.array; + var n1 = new Vector3(); + var n2 = new Vector3(); + var n = new Vector3(); + + // this is the buffer offset for the last line of vertices + + base = segments * points.length * 3; + + for ( i = 0, j = 0; i < points.length; i ++, j += 3 ) { + + // select the normal of the vertex in the first line + + n1.x = normals[ j + 0 ]; + n1.y = normals[ j + 1 ]; + n1.z = normals[ j + 2 ]; + + // select the normal of the vertex in the last line + + n2.x = normals[ base + j + 0 ]; + n2.y = normals[ base + j + 1 ]; + n2.z = normals[ base + j + 2 ]; + + // average normals + + n.addVectors( n1, n2 ).normalize(); + + // assign the new values to both normals + + normals[ j + 0 ] = normals[ base + j + 0 ] = n.x; + normals[ j + 1 ] = normals[ base + j + 1 ] = n.y; + normals[ j + 2 ] = normals[ base + j + 2 ] = n.z; + + } + + } + +} + +LatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); +LatheBufferGeometry.prototype.constructor = LatheBufferGeometry; + + +export { LatheGeometry, LatheBufferGeometry }; diff --git a/lib/geometries/OctahedronGeometry.js b/lib/geometries/OctahedronGeometry.js new file mode 100644 index 0000000..4513a7d --- /dev/null +++ b/lib/geometries/OctahedronGeometry.js @@ -0,0 +1,60 @@ +/** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { Geometry } from '../core/Geometry.js'; +import { PolyhedronBufferGeometry } from './PolyhedronGeometry.js'; + +// OctahedronGeometry + +function OctahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'OctahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + +} + +OctahedronGeometry.prototype = Object.create( Geometry.prototype ); +OctahedronGeometry.prototype.constructor = OctahedronGeometry; + +// OctahedronBufferGeometry + +function OctahedronBufferGeometry( radius, detail ) { + + var vertices = [ + 1, 0, 0, - 1, 0, 0, 0, 1, 0, + 0, - 1, 0, 0, 0, 1, 0, 0, - 1 + ]; + + var 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 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'OctahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + +} + +OctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); +OctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry; + + +export { OctahedronGeometry, OctahedronBufferGeometry }; diff --git a/lib/geometries/ParametricGeometry.js b/lib/geometries/ParametricGeometry.js new file mode 100644 index 0000000..329230c --- /dev/null +++ b/lib/geometries/ParametricGeometry.js @@ -0,0 +1,163 @@ +/** + * @author zz85 / https://github.com/zz85 + * @author Mugen87 / https://github.com/Mugen87 + * + * Parametric Surfaces Geometry + * based on the brilliant article by @prideout http://prideout.net/blog/?p=44 + */ + +import { Geometry } from '../core/Geometry.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { Vector3 } from '../math/Vector3.js'; + +// ParametricGeometry + +function ParametricGeometry( func, slices, stacks ) { + + Geometry.call( this ); + + this.type = 'ParametricGeometry'; + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + }; + + this.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) ); + this.mergeVertices(); + +} + +ParametricGeometry.prototype = Object.create( Geometry.prototype ); +ParametricGeometry.prototype.constructor = ParametricGeometry; + +// ParametricBufferGeometry + +function ParametricBufferGeometry( func, slices, stacks ) { + + BufferGeometry.call( this ); + + this.type = 'ParametricBufferGeometry'; + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + }; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + var EPS = 0.00001; + + var normal = new Vector3(); + + var p0 = new Vector3(), p1 = new Vector3(); + var pu = new Vector3(), pv = new Vector3(); + + var i, j; + + if ( func.length < 3 ) { + + console.error( 'THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter.' ); + + } + + // generate vertices, normals and uvs + + var sliceCount = slices + 1; + + for ( i = 0; i <= stacks; i ++ ) { + + var v = i / stacks; + + for ( j = 0; j <= slices; j ++ ) { + + var u = j / slices; + + // vertex + + func( u, v, p0 ); + vertices.push( p0.x, p0.y, p0.z ); + + // normal + + // approximate tangent vectors via finite differences + + if ( u - EPS >= 0 ) { + + func( u - EPS, v, p1 ); + pu.subVectors( p0, p1 ); + + } else { + + func( u + EPS, v, p1 ); + pu.subVectors( p1, p0 ); + + } + + if ( v - EPS >= 0 ) { + + func( u, v - EPS, p1 ); + pv.subVectors( p0, p1 ); + + } else { + + func( u, v + EPS, p1 ); + pv.subVectors( p1, p0 ); + + } + + // cross product of tangent vectors returns surface normal + + normal.crossVectors( pu, pv ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, v ); + + } + + } + + // generate indices + + for ( i = 0; i < stacks; i ++ ) { + + for ( j = 0; j < slices; j ++ ) { + + var a = i * sliceCount + j; + var b = i * sliceCount + j + 1; + var c = ( i + 1 ) * sliceCount + j + 1; + var d = ( i + 1 ) * sliceCount + j; + + // faces one and two + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + +} + +ParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); +ParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry; + + +export { ParametricGeometry, ParametricBufferGeometry }; diff --git a/lib/geometries/PlaneGeometry.js b/lib/geometries/PlaneGeometry.js new file mode 100644 index 0000000..6b4fb3f --- /dev/null +++ b/lib/geometries/PlaneGeometry.js @@ -0,0 +1,126 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { Geometry } from '../core/Geometry.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; + +// PlaneGeometry + +function PlaneGeometry( width, height, widthSegments, heightSegments ) { + + Geometry.call( this ); + + this.type = 'PlaneGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + this.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) ); + this.mergeVertices(); + +} + +PlaneGeometry.prototype = Object.create( Geometry.prototype ); +PlaneGeometry.prototype.constructor = PlaneGeometry; + +// PlaneBufferGeometry + +function PlaneBufferGeometry( width, height, widthSegments, heightSegments ) { + + BufferGeometry.call( this ); + + this.type = 'PlaneBufferGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + width = width || 1; + height = height || 1; + + var width_half = width / 2; + var height_half = height / 2; + + var gridX = Math.floor( widthSegments ) || 1; + var gridY = Math.floor( heightSegments ) || 1; + + var gridX1 = gridX + 1; + var gridY1 = gridY + 1; + + var segment_width = width / gridX; + var segment_height = height / gridY; + + var ix, iy; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // generate vertices, normals and uvs + + for ( iy = 0; iy < gridY1; iy ++ ) { + + var y = iy * segment_height - height_half; + + for ( ix = 0; ix < gridX1; ix ++ ) { + + var x = ix * segment_width - width_half; + + vertices.push( x, - y, 0 ); + + normals.push( 0, 0, 1 ); + + uvs.push( ix / gridX ); + uvs.push( 1 - ( iy / gridY ) ); + + } + + } + + // indices + + for ( iy = 0; iy < gridY; iy ++ ) { + + for ( ix = 0; ix < gridX; ix ++ ) { + + var a = ix + gridX1 * iy; + var b = ix + gridX1 * ( iy + 1 ); + var c = ( ix + 1 ) + gridX1 * ( iy + 1 ); + var d = ( ix + 1 ) + gridX1 * iy; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + +} + +PlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); +PlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry; + + +export { PlaneGeometry, PlaneBufferGeometry }; diff --git a/lib/geometries/PolyhedronGeometry.js b/lib/geometries/PolyhedronGeometry.js new file mode 100644 index 0000000..b06d0c4 --- /dev/null +++ b/lib/geometries/PolyhedronGeometry.js @@ -0,0 +1,341 @@ +/** + * @author clockworkgeek / https://github.com/clockworkgeek + * @author timothypratley / https://github.com/timothypratley + * @author WestLangley / http://github.com/WestLangley + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { Geometry } from '../core/Geometry.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { Vector3 } from '../math/Vector3.js'; +import { Vector2 } from '../math/Vector2.js'; + +// PolyhedronGeometry + +function PolyhedronGeometry( vertices, indices, radius, detail ) { + + Geometry.call( this ); + + this.type = 'PolyhedronGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) ); + this.mergeVertices(); + +} + +PolyhedronGeometry.prototype = Object.create( Geometry.prototype ); +PolyhedronGeometry.prototype.constructor = PolyhedronGeometry; + +// PolyhedronBufferGeometry + +function PolyhedronBufferGeometry( vertices, indices, radius, detail ) { + + BufferGeometry.call( this ); + + this.type = 'PolyhedronBufferGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + radius = radius || 1; + detail = detail || 0; + + // default buffer data + + var vertexBuffer = []; + var uvBuffer = []; + + // the subdivision creates the vertex buffer data + + subdivide( detail ); + + // all vertices should lie on a conceptual sphere with a given radius + + appplyRadius( radius ); + + // finally, create the uv data + + generateUVs(); + + // build non-indexed geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) ); + + if ( detail === 0 ) { + + this.computeVertexNormals(); // flat normals + + } else { + + this.normalizeNormals(); // smooth normals + + } + + // helper functions + + function subdivide( detail ) { + + var a = new Vector3(); + var b = new Vector3(); + var c = new Vector3(); + + // iterate over all faces and apply a subdivison with the given detail value + + for ( var 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 ) { + + var cols = Math.pow( 2, detail ); + + // we use this multidimensional array as a data structure for creating the subdivision + + var v = []; + + var i, j; + + // construct all of the vertices for this subdivision + + for ( i = 0; i <= cols; i ++ ) { + + v[ i ] = []; + + var aj = a.clone().lerp( c, i / cols ); + var bj = b.clone().lerp( c, i / cols ); + + var rows = cols - i; + + for ( 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 ( i = 0; i < cols; i ++ ) { + + for ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) { + + var 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 appplyRadius( radius ) { + + var vertex = new Vector3(); + + // iterate over the entire buffer and apply the radius to each vertex + + for ( var 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() { + + var vertex = new Vector3(); + + for ( var i = 0; i < vertexBuffer.length; i += 3 ) { + + vertex.x = vertexBuffer[ i + 0 ]; + vertex.y = vertexBuffer[ i + 1 ]; + vertex.z = vertexBuffer[ i + 2 ]; + + var u = azimuth( vertex ) / 2 / Math.PI + 0.5; + var 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 ( var i = 0; i < uvBuffer.length; i += 6 ) { + + // uv data of a single face + + var x0 = uvBuffer[ i + 0 ]; + var x1 = uvBuffer[ i + 2 ]; + var x2 = uvBuffer[ i + 4 ]; + + var max = Math.max( x0, x1, x2 ); + var 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 ) { + + var stride = index * 3; + + vertex.x = vertices[ stride + 0 ]; + vertex.y = vertices[ stride + 1 ]; + vertex.z = vertices[ stride + 2 ]; + + } + + function correctUVs() { + + var a = new Vector3(); + var b = new Vector3(); + var c = new Vector3(); + + var centroid = new Vector3(); + + var uvA = new Vector2(); + var uvB = new Vector2(); + var uvC = new Vector2(); + + for ( var 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 ).divideScalar( 3 ); + + var 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 ) ) ); + + } + +} + +PolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); +PolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry; + + +export { PolyhedronGeometry, PolyhedronBufferGeometry }; diff --git a/lib/geometries/RingGeometry.js b/lib/geometries/RingGeometry.js new file mode 100644 index 0000000..8acbda1 --- /dev/null +++ b/lib/geometries/RingGeometry.js @@ -0,0 +1,152 @@ +/** + * @author Kaleb Murphy + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { Geometry } from '../core/Geometry.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { Vector2 } from '../math/Vector2.js'; +import { Vector3 } from '../math/Vector3.js'; + +// RingGeometry + +function RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'RingGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) ); + this.mergeVertices(); + +} + +RingGeometry.prototype = Object.create( Geometry.prototype ); +RingGeometry.prototype.constructor = RingGeometry; + +// RingBufferGeometry + +function RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'RingBufferGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + innerRadius = innerRadius || 0.5; + outerRadius = outerRadius || 1; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + thetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8; + phiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // some helper variables + + var segment; + var radius = innerRadius; + var radiusStep = ( ( outerRadius - innerRadius ) / phiSegments ); + var vertex = new Vector3(); + var uv = new Vector2(); + var j, i; + + // generate vertices, normals and uvs + + for ( j = 0; j <= phiSegments; j ++ ) { + + for ( i = 0; i <= thetaSegments; i ++ ) { + + // values are generate from the inside of the ring to the outside + + segment = thetaStart + i / thetaSegments * 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 ); + + // uv + + uv.x = ( vertex.x / outerRadius + 1 ) / 2; + uv.y = ( vertex.y / outerRadius + 1 ) / 2; + + uvs.push( uv.x, uv.y ); + + } + + // increase the radius for next row of vertices + + radius += radiusStep; + + } + + // indices + + for ( j = 0; j < phiSegments; j ++ ) { + + var thetaSegmentLevel = j * ( thetaSegments + 1 ); + + for ( i = 0; i < thetaSegments; i ++ ) { + + segment = i + thetaSegmentLevel; + + var a = segment; + var b = segment + thetaSegments + 1; + var c = segment + thetaSegments + 2; + var d = segment + 1; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + +} + +RingBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); +RingBufferGeometry.prototype.constructor = RingBufferGeometry; + + +export { RingGeometry, RingBufferGeometry }; diff --git a/lib/geometries/ShapeGeometry.js b/lib/geometries/ShapeGeometry.js new file mode 100644 index 0000000..4f59dfa --- /dev/null +++ b/lib/geometries/ShapeGeometry.js @@ -0,0 +1,222 @@ +/** + * @author jonobr1 / http://jonobr1.com + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { Geometry } from '../core/Geometry.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { ShapeUtils } from '../extras/ShapeUtils.js'; + +// ShapeGeometry + +function ShapeGeometry( shapes, curveSegments ) { + + Geometry.call( this ); + + this.type = 'ShapeGeometry'; + + if ( typeof curveSegments === 'object' ) { + + console.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' ); + + curveSegments = curveSegments.curveSegments; + + } + + this.parameters = { + shapes: shapes, + curveSegments: curveSegments + }; + + this.fromBufferGeometry( new ShapeBufferGeometry( shapes, curveSegments ) ); + this.mergeVertices(); + +} + +ShapeGeometry.prototype = Object.create( Geometry.prototype ); +ShapeGeometry.prototype.constructor = ShapeGeometry; + +ShapeGeometry.prototype.toJSON = function () { + + var data = Geometry.prototype.toJSON.call( this ); + + var shapes = this.parameters.shapes; + + return toJSON( shapes, data ); + +}; + +// ShapeBufferGeometry + +function ShapeBufferGeometry( shapes, curveSegments ) { + + BufferGeometry.call( this ); + + this.type = 'ShapeBufferGeometry'; + + this.parameters = { + shapes: shapes, + curveSegments: curveSegments + }; + + curveSegments = curveSegments || 12; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var groupStart = 0; + var groupCount = 0; + + // allow single and array values for "shapes" parameter + + if ( Array.isArray( shapes ) === false ) { + + addShape( shapes ); + + } else { + + for ( var i = 0; i < shapes.length; i ++ ) { + + addShape( shapes[ i ] ); + + this.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support + + groupStart += groupCount; + groupCount = 0; + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + + // helper functions + + function addShape( shape ) { + + var i, l, shapeHole; + + var indexOffset = vertices.length / 3; + var points = shape.extractPoints( curveSegments ); + + var shapeVertices = points.shape; + var shapeHoles = points.holes; + + // check direction of vertices + + if ( ShapeUtils.isClockWise( shapeVertices ) === false ) { + + shapeVertices = shapeVertices.reverse(); + + // also check if holes are in the opposite direction + + for ( i = 0, l = shapeHoles.length; i < l; i ++ ) { + + shapeHole = shapeHoles[ i ]; + + if ( ShapeUtils.isClockWise( shapeHole ) === true ) { + + shapeHoles[ i ] = shapeHole.reverse(); + + } + + } + + } + + var faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles ); + + // join vertices of inner and outer paths to a single array + + for ( i = 0, l = shapeHoles.length; i < l; i ++ ) { + + shapeHole = shapeHoles[ i ]; + shapeVertices = shapeVertices.concat( shapeHole ); + + } + + // vertices, normals, uvs + + for ( i = 0, l = shapeVertices.length; i < l; i ++ ) { + + var vertex = shapeVertices[ i ]; + + vertices.push( vertex.x, vertex.y, 0 ); + normals.push( 0, 0, 1 ); + uvs.push( vertex.x, vertex.y ); // world uvs + + } + + // incides + + for ( i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + var a = face[ 0 ] + indexOffset; + var b = face[ 1 ] + indexOffset; + var c = face[ 2 ] + indexOffset; + + indices.push( a, b, c ); + groupCount += 3; + + } + + } + +} + +ShapeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); +ShapeBufferGeometry.prototype.constructor = ShapeBufferGeometry; + +ShapeBufferGeometry.prototype.toJSON = function () { + + var data = BufferGeometry.prototype.toJSON.call( this ); + + var shapes = this.parameters.shapes; + + return toJSON( shapes, data ); + +}; + +// + +function toJSON( shapes, data ) { + + data.shapes = []; + + if ( Array.isArray( shapes ) ) { + + for ( var i = 0, l = shapes.length; i < l; i ++ ) { + + var shape = shapes[ i ]; + + data.shapes.push( shape.uuid ); + + } + + } else { + + data.shapes.push( shapes.uuid ); + + } + + return data; + +} + + +export { ShapeGeometry, ShapeBufferGeometry }; diff --git a/lib/geometries/SphereGeometry.js b/lib/geometries/SphereGeometry.js new file mode 100644 index 0000000..287d12f --- /dev/null +++ b/lib/geometries/SphereGeometry.js @@ -0,0 +1,152 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author benaadams / https://twitter.com/ben_a_adams + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { Geometry } from '../core/Geometry.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { Vector3 } from '../math/Vector3.js'; + +// SphereGeometry + +function SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'SphereGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) ); + this.mergeVertices(); + +} + +SphereGeometry.prototype = Object.create( Geometry.prototype ); +SphereGeometry.prototype.constructor = SphereGeometry; + +// SphereBufferGeometry + +function SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'SphereBufferGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radius = radius || 1; + + widthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 ); + heightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 ); + + phiStart = phiStart !== undefined ? phiStart : 0; + phiLength = phiLength !== undefined ? phiLength : Math.PI * 2; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI; + + var thetaEnd = thetaStart + thetaLength; + + var ix, iy; + + var index = 0; + var grid = []; + + var vertex = new Vector3(); + var normal = new Vector3(); + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // generate vertices, normals and uvs + + for ( iy = 0; iy <= heightSegments; iy ++ ) { + + var verticesRow = []; + + var v = iy / heightSegments; + + for ( ix = 0; ix <= widthSegments; ix ++ ) { + + var 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.set( vertex.x, vertex.y, vertex.z ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, 1 - v ); + + verticesRow.push( index ++ ); + + } + + grid.push( verticesRow ); + + } + + // indices + + for ( iy = 0; iy < heightSegments; iy ++ ) { + + for ( ix = 0; ix < widthSegments; ix ++ ) { + + var a = grid[ iy ][ ix + 1 ]; + var b = grid[ iy ][ ix ]; + var c = grid[ iy + 1 ][ ix ]; + var 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 ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + +} + +SphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); +SphereBufferGeometry.prototype.constructor = SphereBufferGeometry; + + +export { SphereGeometry, SphereBufferGeometry }; diff --git a/lib/geometries/TetrahedronGeometry.js b/lib/geometries/TetrahedronGeometry.js new file mode 100644 index 0000000..7f4a7cd --- /dev/null +++ b/lib/geometries/TetrahedronGeometry.js @@ -0,0 +1,57 @@ +/** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { Geometry } from '../core/Geometry.js'; +import { PolyhedronBufferGeometry } from './PolyhedronGeometry.js'; + +// TetrahedronGeometry + +function TetrahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'TetrahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + +} + +TetrahedronGeometry.prototype = Object.create( Geometry.prototype ); +TetrahedronGeometry.prototype.constructor = TetrahedronGeometry; + +// TetrahedronBufferGeometry + +function TetrahedronBufferGeometry( radius, detail ) { + + var vertices = [ + 1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1 + ]; + + var indices = [ + 2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'TetrahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + +} + +TetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); +TetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry; + + +export { TetrahedronGeometry, TetrahedronBufferGeometry }; diff --git a/lib/geometries/TextGeometry.js b/lib/geometries/TextGeometry.js new file mode 100644 index 0000000..bd8ba8a --- /dev/null +++ b/lib/geometries/TextGeometry.js @@ -0,0 +1,81 @@ +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author alteredq / http://alteredqualia.com/ + * + * Text = 3D Text + * + * parameters = { + * font: , // font + * + * size: , // size of the text + * height: , // thickness to extrude text + * curveSegments: , // number of points on the curves + * + * bevelEnabled: , // turn on bevel + * bevelThickness: , // how deep into text bevel goes + * bevelSize: // how far from text outline is bevel + * } + */ + +import { Geometry } from '../core/Geometry.js'; +import { ExtrudeBufferGeometry } from './ExtrudeGeometry.js'; + +// TextGeometry + +function TextGeometry( text, parameters ) { + + Geometry.call( this ); + + this.type = 'TextGeometry'; + + this.parameters = { + text: text, + parameters: parameters + }; + + this.fromBufferGeometry( new TextBufferGeometry( text, parameters ) ); + this.mergeVertices(); + +} + +TextGeometry.prototype = Object.create( Geometry.prototype ); +TextGeometry.prototype.constructor = TextGeometry; + +// TextBufferGeometry + +function TextBufferGeometry( text, parameters ) { + + parameters = parameters || {}; + + var font = parameters.font; + + if ( ! ( font && font.isFont ) ) { + + console.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' ); + return new Geometry(); + + } + + var shapes = font.generateShapes( text, parameters.size ); + + // translate parameters to ExtrudeGeometry API + + parameters.depth = parameters.height !== undefined ? parameters.height : 50; + + // defaults + + if ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10; + if ( parameters.bevelSize === undefined ) parameters.bevelSize = 8; + if ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false; + + ExtrudeBufferGeometry.call( this, shapes, parameters ); + + this.type = 'TextBufferGeometry'; + +} + +TextBufferGeometry.prototype = Object.create( ExtrudeBufferGeometry.prototype ); +TextBufferGeometry.prototype.constructor = TextBufferGeometry; + + +export { TextGeometry, TextBufferGeometry }; diff --git a/lib/geometries/TorusGeometry.js b/lib/geometries/TorusGeometry.js new file mode 100644 index 0000000..401d34b --- /dev/null +++ b/lib/geometries/TorusGeometry.js @@ -0,0 +1,142 @@ +/** + * @author oosmoxiecode + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { Geometry } from '../core/Geometry.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { Vector3 } from '../math/Vector3.js'; + +// TorusGeometry + +function TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) { + + Geometry.call( this ); + + this.type = 'TorusGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + this.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) ); + this.mergeVertices(); + +} + +TorusGeometry.prototype = Object.create( Geometry.prototype ); +TorusGeometry.prototype.constructor = TorusGeometry; + +// TorusBufferGeometry + +function TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) { + + BufferGeometry.call( this ); + + this.type = 'TorusBufferGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + radius = radius || 1; + tube = tube || 0.4; + radialSegments = Math.floor( radialSegments ) || 8; + tubularSegments = Math.floor( tubularSegments ) || 6; + arc = arc || Math.PI * 2; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var center = new Vector3(); + var vertex = new Vector3(); + var normal = new Vector3(); + + var j, i; + + // generate vertices, normals and uvs + + for ( j = 0; j <= radialSegments; j ++ ) { + + for ( i = 0; i <= tubularSegments; i ++ ) { + + var u = i / tubularSegments * arc; + var 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 ); + + vertices.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 ( j = 1; j <= radialSegments; j ++ ) { + + for ( i = 1; i <= tubularSegments; i ++ ) { + + // indices + + 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; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + +} + +TorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); +TorusBufferGeometry.prototype.constructor = TorusBufferGeometry; + + +export { TorusGeometry, TorusBufferGeometry }; diff --git a/lib/geometries/TorusKnotGeometry.js b/lib/geometries/TorusKnotGeometry.js new file mode 100644 index 0000000..6041d99 --- /dev/null +++ b/lib/geometries/TorusKnotGeometry.js @@ -0,0 +1,194 @@ +/** + * @author oosmoxiecode + * @author Mugen87 / https://github.com/Mugen87 + * + * based on http://www.blackpawn.com/texts/pqtorus/ + */ + +import { Geometry } from '../core/Geometry.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { Vector3 } from '../math/Vector3.js'; + +// TorusKnotGeometry + +function TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) { + + Geometry.call( this ); + + this.type = 'TorusKnotGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + }; + + if ( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' ); + + this.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) ); + this.mergeVertices(); + +} + +TorusKnotGeometry.prototype = Object.create( Geometry.prototype ); +TorusKnotGeometry.prototype.constructor = TorusKnotGeometry; + +// TorusKnotBufferGeometry + +function TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) { + + BufferGeometry.call( this ); + + this.type = 'TorusKnotBufferGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + }; + + radius = radius || 1; + tube = tube || 0.4; + tubularSegments = Math.floor( tubularSegments ) || 64; + radialSegments = Math.floor( radialSegments ) || 8; + p = p || 2; + q = q || 3; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var i, j; + + var vertex = new Vector3(); + var normal = new Vector3(); + + var P1 = new Vector3(); + var P2 = new Vector3(); + + var B = new Vector3(); + var T = new Vector3(); + var 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 + + var 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. + + var v = j / radialSegments * Math.PI * 2; + var cx = - tube * Math.cos( v ); + var 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 + + var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + var b = ( radialSegments + 1 ) * j + ( i - 1 ); + var c = ( radialSegments + 1 ) * j + i; + var d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // this function calculates the current position on the torus curve + + function calculatePositionOnCurve( u, p, q, radius, position ) { + + var cu = Math.cos( u ); + var su = Math.sin( u ); + var quOverP = q / p * u; + var 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; + + } + +} + +TorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); +TorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry; + + +export { TorusKnotGeometry, TorusKnotBufferGeometry }; diff --git a/lib/geometries/TubeGeometry.js b/lib/geometries/TubeGeometry.js new file mode 100644 index 0000000..2a8080c --- /dev/null +++ b/lib/geometries/TubeGeometry.js @@ -0,0 +1,223 @@ +/** + * @author oosmoxiecode / https://github.com/oosmoxiecode + * @author WestLangley / https://github.com/WestLangley + * @author zz85 / https://github.com/zz85 + * @author miningold / https://github.com/miningold + * @author jonobr1 / https://github.com/jonobr1 + * @author Mugen87 / https://github.com/Mugen87 + * + */ + +import { Geometry } from '../core/Geometry.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { Vector2 } from '../math/Vector2.js'; +import { Vector3 } from '../math/Vector3.js'; + +// TubeGeometry + +function TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) { + + Geometry.call( this ); + + this.type = 'TubeGeometry'; + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + }; + + if ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' ); + + var bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ); + + // expose internals + + this.tangents = bufferGeometry.tangents; + this.normals = bufferGeometry.normals; + this.binormals = bufferGeometry.binormals; + + // create geometry + + this.fromBufferGeometry( bufferGeometry ); + this.mergeVertices(); + +} + +TubeGeometry.prototype = Object.create( Geometry.prototype ); +TubeGeometry.prototype.constructor = TubeGeometry; + +// TubeBufferGeometry + +function TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) { + + BufferGeometry.call( this ); + + this.type = 'TubeBufferGeometry'; + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + }; + + tubularSegments = tubularSegments || 64; + radius = radius || 1; + radialSegments = radialSegments || 8; + closed = closed || false; + + var frames = path.computeFrenetFrames( tubularSegments, closed ); + + // expose internals + + this.tangents = frames.tangents; + this.normals = frames.normals; + this.binormals = frames.binormals; + + // helper variables + + var vertex = new Vector3(); + var normal = new Vector3(); + var uv = new Vector2(); + var P = new Vector3(); + + var i, j; + + // buffer + + var vertices = []; + var normals = []; + var uvs = []; + var indices = []; + + // create buffer data + + generateBufferData(); + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // functions + + function generateBufferData() { + + for ( i = 0; i < tubularSegments; i ++ ) { + + generateSegment( i ); + + } + + // if the geometry is not closed, generate the last row of vertices and normals + // at the regular position on the given path + // + // if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ) + + generateSegment( ( closed === false ) ? tubularSegments : 0 ); + + // uvs are generated in a separate function. + // this makes it easy compute correct values for closed geometries + + generateUVs(); + + // finally create faces + + generateIndices(); + + } + + function generateSegment( i ) { + + // we use getPointAt to sample evenly distributed points from the given path + + P = path.getPointAt( i / tubularSegments, P ); + + // retrieve corresponding normal and binormal + + var N = frames.normals[ i ]; + var B = frames.binormals[ i ]; + + // generate normals and vertices for the current segment + + for ( j = 0; j <= radialSegments; j ++ ) { + + var v = j / radialSegments * Math.PI * 2; + + var sin = Math.sin( v ); + var cos = - Math.cos( v ); + + // normal + + normal.x = ( cos * N.x + sin * B.x ); + normal.y = ( cos * N.y + sin * B.y ); + normal.z = ( cos * N.z + sin * B.z ); + normal.normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // vertex + + vertex.x = P.x + radius * normal.x; + vertex.y = P.y + radius * normal.y; + vertex.z = P.z + radius * normal.z; + + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + function generateIndices() { + + for ( j = 1; j <= tubularSegments; j ++ ) { + + for ( i = 1; i <= radialSegments; i ++ ) { + + var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + var b = ( radialSegments + 1 ) * j + ( i - 1 ); + var c = ( radialSegments + 1 ) * j + i; + var d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + } + + function generateUVs() { + + for ( i = 0; i <= tubularSegments; i ++ ) { + + for ( j = 0; j <= radialSegments; j ++ ) { + + uv.x = i / tubularSegments; + uv.y = j / radialSegments; + + uvs.push( uv.x, uv.y ); + + } + + } + + } + +} + +TubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); +TubeBufferGeometry.prototype.constructor = TubeBufferGeometry; + + +export { TubeGeometry, TubeBufferGeometry }; diff --git a/lib/geometries/WireframeGeometry.js b/lib/geometries/WireframeGeometry.js new file mode 100644 index 0000000..521b4c6 --- /dev/null +++ b/lib/geometries/WireframeGeometry.js @@ -0,0 +1,179 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { Vector3 } from '../math/Vector3.js'; + +function WireframeGeometry( geometry ) { + + BufferGeometry.call( this ); + + this.type = 'WireframeGeometry'; + + // buffer + + var vertices = []; + + // helper variables + + var i, j, l, o, ol; + var edge = [ 0, 0 ], edges = {}, e, edge1, edge2; + var key, keys = [ 'a', 'b', 'c' ]; + var vertex; + + // different logic for Geometry and BufferGeometry + + if ( geometry && geometry.isGeometry ) { + + // create a data structure that contains all edges without duplicates + + var faces = geometry.faces; + + for ( i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( j = 0; j < 3; j ++ ) { + + edge1 = face[ keys[ j ] ]; + edge2 = face[ keys[ ( j + 1 ) % 3 ] ]; + edge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates + edge[ 1 ] = Math.max( edge1, edge2 ); + + key = edge[ 0 ] + ',' + edge[ 1 ]; + + if ( edges[ key ] === undefined ) { + + edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] }; + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + e = edges[ key ]; + + vertex = geometry.vertices[ e.index1 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex = geometry.vertices[ e.index2 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } else if ( geometry && geometry.isBufferGeometry ) { + + var position, indices, groups; + var group, start, count; + var index1, index2; + + vertex = new Vector3(); + + if ( geometry.index !== null ) { + + // indexed BufferGeometry + + position = geometry.attributes.position; + indices = geometry.index; + groups = geometry.groups; + + if ( groups.length === 0 ) { + + groups = [ { start: 0, count: indices.count, materialIndex: 0 } ]; + + } + + // create a data structure that contains all eges without duplicates + + for ( o = 0, ol = groups.length; o < ol; ++ o ) { + + group = groups[ o ]; + + start = group.start; + count = group.count; + + for ( i = start, l = ( start + count ); i < l; i += 3 ) { + + for ( j = 0; j < 3; j ++ ) { + + edge1 = indices.getX( i + j ); + edge2 = indices.getX( i + ( j + 1 ) % 3 ); + edge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates + edge[ 1 ] = Math.max( edge1, edge2 ); + + key = edge[ 0 ] + ',' + edge[ 1 ]; + + if ( edges[ key ] === undefined ) { + + edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] }; + + } + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + e = edges[ key ]; + + vertex.fromBufferAttribute( position, e.index1 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex.fromBufferAttribute( position, e.index2 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } else { + + // non-indexed BufferGeometry + + position = geometry.attributes.position; + + for ( i = 0, l = ( position.count / 3 ); i < l; i ++ ) { + + for ( j = 0; j < 3; j ++ ) { + + // three edges per triangle, an edge is represented as (index1, index2) + // e.g. the first triangle has the following edges: (0,1),(1,2),(2,0) + + index1 = 3 * i + j; + vertex.fromBufferAttribute( position, index1 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + index2 = 3 * i + ( ( j + 1 ) % 3 ); + vertex.fromBufferAttribute( position, index2 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + } + + } + + // build geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + +} + +WireframeGeometry.prototype = Object.create( BufferGeometry.prototype ); +WireframeGeometry.prototype.constructor = WireframeGeometry; + + +export { WireframeGeometry }; diff --git a/lib/helpers/ArrowHelper.js b/lib/helpers/ArrowHelper.js new file mode 100644 index 0000000..36c3160 --- /dev/null +++ b/lib/helpers/ArrowHelper.js @@ -0,0 +1,139 @@ +/** + * @author WestLangley / http://github.com/WestLangley + * @author zz85 / http://github.com/zz85 + * @author bhouston / http://clara.io + * + * Creates an arrow for visualizing directions + * + * Parameters: + * dir - Vector3 + * origin - Vector3 + * length - Number + * color - color in hex value + * headLength - Number + * headWidth - Number + */ + +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Object3D } from '../core/Object3D.js'; +import { CylinderBufferGeometry } from '../geometries/CylinderGeometry.js'; +import { MeshBasicMaterial } from '../materials/MeshBasicMaterial.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; +import { Mesh } from '../objects/Mesh.js'; +import { Line } from '../objects/Line.js'; +import { Vector3 } from '../math/Vector3.js'; + +var lineGeometry, coneGeometry; + +function ArrowHelper( dir, origin, length, color, headLength, headWidth ) { + + // dir is assumed to be normalized + + Object3D.call( this ); + + if ( dir === undefined ) dir = new THREE.Vector3( 0, 0, 1 ); + if ( origin === undefined ) origin = new THREE.Vector3( 0, 0, 0 ); + if ( length === undefined ) length = 1; + if ( color === undefined ) color = 0xffff00; + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + if ( lineGeometry === undefined ) { + + lineGeometry = new BufferGeometry(); + lineGeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) ); + + coneGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 ); + coneGeometry.translate( 0, - 0.5, 0 ); + + } + + this.position.copy( origin ); + + this.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) ); + this.line.matrixAutoUpdate = false; + this.add( this.line ); + + this.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) ); + this.cone.matrixAutoUpdate = false; + this.add( this.cone ); + + this.setDirection( dir ); + this.setLength( length, headLength, headWidth ); + +} + +ArrowHelper.prototype = Object.create( Object3D.prototype ); +ArrowHelper.prototype.constructor = ArrowHelper; + +ArrowHelper.prototype.setDirection = ( function () { + + var axis = new Vector3(); + var radians; + + return function setDirection( dir ) { + + // dir is assumed to be normalized + + if ( dir.y > 0.99999 ) { + + this.quaternion.set( 0, 0, 0, 1 ); + + } else if ( dir.y < - 0.99999 ) { + + this.quaternion.set( 1, 0, 0, 0 ); + + } else { + + axis.set( dir.z, 0, - dir.x ).normalize(); + + radians = Math.acos( dir.y ); + + this.quaternion.setFromAxisAngle( axis, radians ); + + } + + }; + +}() ); + +ArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) { + + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + this.line.scale.set( 1, Math.max( 0, length - headLength ), 1 ); + this.line.updateMatrix(); + + this.cone.scale.set( headWidth, headLength, headWidth ); + this.cone.position.y = length; + this.cone.updateMatrix(); + +}; + +ArrowHelper.prototype.setColor = function ( color ) { + + this.line.material.color.copy( color ); + this.cone.material.color.copy( color ); + +}; + +ArrowHelper.prototype.copy = function ( source ) { + + Object3D.prototype.copy.call( this, source, false ); + + this.line.copy( source.line ); + this.cone.copy( source.cone ); + + return this; + +}; + +ArrowHelper.prototype.clone = function () { + + return new this.constructor().copy( this ); + +}; + +export { ArrowHelper }; diff --git a/lib/helpers/AxesHelper.js b/lib/helpers/AxesHelper.js new file mode 100644 index 0000000..34a7f42 --- /dev/null +++ b/lib/helpers/AxesHelper.js @@ -0,0 +1,42 @@ +/** + * @author sroucheray / http://sroucheray.org/ + * @author mrdoob / http://mrdoob.com/ + */ + +import { LineSegments } from '../objects/LineSegments.js'; +import { VertexColors } from '../constants.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; + +function AxesHelper( size ) { + + size = size || 1; + + var vertices = [ + 0, 0, 0, size, 0, 0, + 0, 0, 0, 0, size, 0, + 0, 0, 0, 0, 0, size + ]; + + var colors = [ + 1, 0, 0, 1, 0.6, 0, + 0, 1, 0, 0.6, 1, 0, + 0, 0, 1, 0, 0.6, 1 + ]; + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + +} + +AxesHelper.prototype = Object.create( LineSegments.prototype ); +AxesHelper.prototype.constructor = AxesHelper; + + +export { AxesHelper }; diff --git a/lib/helpers/Box3Helper.js b/lib/helpers/Box3Helper.js new file mode 100644 index 0000000..44288b5 --- /dev/null +++ b/lib/helpers/Box3Helper.js @@ -0,0 +1,55 @@ +/** + * @author WestLangley / http://github.com/WestLangley + */ + +import { LineSegments } from '../objects/LineSegments.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; +import { BufferAttribute } from '../core/BufferAttribute.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Object3D } from '../core/Object3D.js'; + +function Box3Helper( box, hex ) { + + this.type = 'Box3Helper'; + + this.box = box; + + var color = ( hex !== undefined ) ? hex : 0xffff00; + + var 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 ] ); + + var 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 ]; + + var geometry = new BufferGeometry(); + + geometry.setIndex( new BufferAttribute( indices, 1 ) ); + + geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) ); + + this.geometry.computeBoundingSphere(); + +} + +Box3Helper.prototype = Object.create( LineSegments.prototype ); +Box3Helper.prototype.constructor = Box3Helper; + +Box3Helper.prototype.updateMatrixWorld = function ( force ) { + + var box = this.box; + + if ( box.isEmpty() ) return; + + box.getCenter( this.position ); + + box.getSize( this.scale ); + + this.scale.multiplyScalar( 0.5 ); + + Object3D.prototype.updateMatrixWorld.call( this, force ); + +}; + +export { Box3Helper }; diff --git a/lib/helpers/BoxHelper.js b/lib/helpers/BoxHelper.js new file mode 100644 index 0000000..6486e7d --- /dev/null +++ b/lib/helpers/BoxHelper.js @@ -0,0 +1,120 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / http://github.com/Mugen87 + */ + +import { Box3 } from '../math/Box3.js'; +import { LineSegments } from '../objects/LineSegments.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; +import { BufferAttribute } from '../core/BufferAttribute.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; + +function BoxHelper( object, color ) { + + this.object = object; + + if ( color === undefined ) color = 0xffff00; + + var 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 ] ); + var positions = new Float32Array( 8 * 3 ); + + var geometry = new BufferGeometry(); + geometry.setIndex( new BufferAttribute( indices, 1 ) ); + geometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) ); + + this.matrixAutoUpdate = false; + + this.update(); + +} + +BoxHelper.prototype = Object.create( LineSegments.prototype ); +BoxHelper.prototype.constructor = BoxHelper; + +BoxHelper.prototype.update = ( function () { + + var box = new Box3(); + + return function update( object ) { + + if ( object !== undefined ) { + + console.warn( 'THREE.BoxHelper: .update() has no longer arguments.' ); + + } + + if ( this.object !== undefined ) { + + box.setFromObject( this.object ); + + } + + if ( box.isEmpty() ) return; + + var min = box.min; + var max = box.max; + + /* + 5____4 + 1/___0/| + | 6__|_7 + 2/___3/ + + 0: max.x, max.y, max.z + 1: min.x, max.y, max.z + 2: min.x, min.y, max.z + 3: max.x, min.y, max.z + 4: max.x, max.y, min.z + 5: min.x, max.y, min.z + 6: min.x, min.y, min.z + 7: max.x, min.y, min.z + */ + + var position = this.geometry.attributes.position; + var 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.needsUpdate = true; + + this.geometry.computeBoundingSphere(); + + }; + +} )(); + +BoxHelper.prototype.setFromObject = function ( object ) { + + this.object = object; + this.update(); + + return this; + +}; + +BoxHelper.prototype.copy = function ( source ) { + + LineSegments.prototype.copy.call( this, source ); + + this.object = source.object; + + return this; + +}; + +BoxHelper.prototype.clone = function () { + + return new this.constructor().copy( this ); + +}; + +export { BoxHelper }; diff --git a/lib/helpers/CameraHelper.js b/lib/helpers/CameraHelper.js new file mode 100644 index 0000000..dc06797 --- /dev/null +++ b/lib/helpers/CameraHelper.js @@ -0,0 +1,210 @@ +/** + * @author alteredq / http://alteredqualia.com/ + * @author Mugen87 / https://github.com/Mugen87 + * + * - shows frustum, line of sight and up of the camera + * - suitable for fast updates + * - based on frustum visualization in lightgl.js shadowmap example + * http://evanw.github.com/lightgl.js/tests/shadowmap.html + */ + +import { Camera } from '../cameras/Camera.js'; +import { Vector3 } from '../math/Vector3.js'; +import { LineSegments } from '../objects/LineSegments.js'; +import { Color } from '../math/Color.js'; +import { FaceColors } from '../constants.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; + +function CameraHelper( camera ) { + + var geometry = new BufferGeometry(); + var material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } ); + + var vertices = []; + var colors = []; + + var pointMap = {}; + + // colors + + var colorFrustum = new Color( 0xffaa00 ); + var colorCone = new Color( 0xff0000 ); + var colorUp = new Color( 0x00aaff ); + var colorTarget = new Color( 0xffffff ); + var colorCross = new Color( 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', colorCross ); + + // 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 ) { + + vertices.push( 0, 0, 0 ); + colors.push( color.r, color.g, color.b ); + + if ( pointMap[ id ] === undefined ) { + + pointMap[ id ] = []; + + } + + pointMap[ id ].push( ( vertices.length / 3 ) - 1 ); + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + LineSegments.call( this, geometry, material ); + + this.camera = camera; + if ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix(); + + this.matrix = camera.matrixWorld; + this.matrixAutoUpdate = false; + + this.pointMap = pointMap; + + this.update(); + +} + +CameraHelper.prototype = Object.create( LineSegments.prototype ); +CameraHelper.prototype.constructor = CameraHelper; + +CameraHelper.prototype.update = function () { + + var geometry, pointMap; + + var vector = new Vector3(); + var camera = new Camera(); + + function setPoint( point, x, y, z ) { + + vector.set( x, y, z ).unproject( camera ); + + var points = pointMap[ point ]; + + if ( points !== undefined ) { + + var position = geometry.getAttribute( 'position' ); + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + position.setXYZ( points[ i ], vector.x, vector.y, vector.z ); + + } + + } + + } + + return function update() { + + geometry = this.geometry; + pointMap = this.pointMap; + + var w = 1, h = 1; + + // we need just camera projection matrix + // world matrix must be identity + + camera.projectionMatrix.copy( this.camera.projectionMatrix ); + + // center / target + + setPoint( 'c', 0, 0, - 1 ); + setPoint( 't', 0, 0, 1 ); + + // near + + setPoint( 'n1', - w, - h, - 1 ); + setPoint( 'n2', w, - h, - 1 ); + setPoint( 'n3', - w, h, - 1 ); + setPoint( 'n4', w, h, - 1 ); + + // far + + setPoint( 'f1', - w, - h, 1 ); + setPoint( 'f2', w, - h, 1 ); + setPoint( 'f3', - w, h, 1 ); + setPoint( 'f4', w, h, 1 ); + + // up + + setPoint( 'u1', w * 0.7, h * 1.1, - 1 ); + setPoint( 'u2', - w * 0.7, h * 1.1, - 1 ); + setPoint( 'u3', 0, h * 2, - 1 ); + + // cross + + setPoint( 'cf1', - w, 0, 1 ); + setPoint( 'cf2', w, 0, 1 ); + setPoint( 'cf3', 0, - h, 1 ); + setPoint( 'cf4', 0, h, 1 ); + + setPoint( 'cn1', - w, 0, - 1 ); + setPoint( 'cn2', w, 0, - 1 ); + setPoint( 'cn3', 0, - h, - 1 ); + setPoint( 'cn4', 0, h, - 1 ); + + geometry.getAttribute( 'position' ).needsUpdate = true; + + }; + +}(); + + +export { CameraHelper }; diff --git a/lib/helpers/DirectionalLightHelper.js b/lib/helpers/DirectionalLightHelper.js new file mode 100644 index 0000000..e920d53 --- /dev/null +++ b/lib/helpers/DirectionalLightHelper.js @@ -0,0 +1,98 @@ +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + +import { Vector3 } from '../math/Vector3.js'; +import { Object3D } from '../core/Object3D.js'; +import { Line } from '../objects/Line.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; + +function DirectionalLightHelper( light, size, color ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + if ( size === undefined ) size = 1; + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( [ + - size, size, 0, + size, size, 0, + size, - size, 0, + - size, - size, 0, + - size, size, 0 + ], 3 ) ); + + var material = new LineBasicMaterial( { fog: false } ); + + this.lightPlane = new Line( geometry, material ); + this.add( this.lightPlane ); + + geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) ); + + this.targetLine = new Line( geometry, material ); + this.add( this.targetLine ); + + this.update(); + +} + +DirectionalLightHelper.prototype = Object.create( Object3D.prototype ); +DirectionalLightHelper.prototype.constructor = DirectionalLightHelper; + +DirectionalLightHelper.prototype.dispose = function () { + + this.lightPlane.geometry.dispose(); + this.lightPlane.material.dispose(); + this.targetLine.geometry.dispose(); + this.targetLine.material.dispose(); + +}; + +DirectionalLightHelper.prototype.update = function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var v3 = new Vector3(); + + return function update() { + + v1.setFromMatrixPosition( this.light.matrixWorld ); + v2.setFromMatrixPosition( this.light.target.matrixWorld ); + v3.subVectors( v2, v1 ); + + this.lightPlane.lookAt( v3 ); + + if ( this.color !== undefined ) { + + this.lightPlane.material.color.set( this.color ); + this.targetLine.material.color.set( this.color ); + + } else { + + this.lightPlane.material.color.copy( this.light.color ); + this.targetLine.material.color.copy( this.light.color ); + + } + + this.targetLine.lookAt( v3 ); + this.targetLine.scale.z = v3.length(); + + }; + +}(); + + +export { DirectionalLightHelper }; diff --git a/lib/helpers/FaceNormalsHelper.js b/lib/helpers/FaceNormalsHelper.js new file mode 100644 index 0000000..ae78a78 --- /dev/null +++ b/lib/helpers/FaceNormalsHelper.js @@ -0,0 +1,118 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + +import { Matrix3 } from '../math/Matrix3.js'; +import { Vector3 } from '../math/Vector3.js'; +import { LineSegments } from '../objects/LineSegments.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; + +function FaceNormalsHelper( object, size, hex, linewidth ) { + + // FaceNormalsHelper only supports THREE.Geometry + + this.object = object; + + this.size = ( size !== undefined ) ? size : 1; + + var color = ( hex !== undefined ) ? hex : 0xffff00; + + var width = ( linewidth !== undefined ) ? linewidth : 1; + + // + + var nNormals = 0; + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + nNormals = objGeometry.faces.length; + + } else { + + console.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' ); + + } + + // + + var geometry = new BufferGeometry(); + + var positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 ); + + geometry.addAttribute( 'position', positions ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) ); + + // + + this.matrixAutoUpdate = false; + this.update(); + +} + +FaceNormalsHelper.prototype = Object.create( LineSegments.prototype ); +FaceNormalsHelper.prototype.constructor = FaceNormalsHelper; + +FaceNormalsHelper.prototype.update = ( function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var normalMatrix = new Matrix3(); + + return function update() { + + this.object.updateMatrixWorld( true ); + + normalMatrix.getNormalMatrix( this.object.matrixWorld ); + + var matrixWorld = this.object.matrixWorld; + + var position = this.geometry.attributes.position; + + // + + var objGeometry = this.object.geometry; + + var vertices = objGeometry.vertices; + + var faces = objGeometry.faces; + + var idx = 0; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + var normal = face.normal; + + v1.copy( vertices[ face.a ] ) + .add( vertices[ face.b ] ) + .add( vertices[ face.c ] ) + .divideScalar( 3 ) + .applyMatrix4( matrixWorld ); + + v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + position.needsUpdate = true; + + }; + +}() ); + + +export { FaceNormalsHelper }; diff --git a/lib/helpers/GridHelper.js b/lib/helpers/GridHelper.js new file mode 100644 index 0000000..2b38bab --- /dev/null +++ b/lib/helpers/GridHelper.js @@ -0,0 +1,52 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { LineSegments } from '../objects/LineSegments.js'; +import { VertexColors } from '../constants.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Color } from '../math/Color.js'; + +function GridHelper( size, divisions, color1, color2 ) { + + size = size || 10; + divisions = divisions || 10; + color1 = new Color( color1 !== undefined ? color1 : 0x444444 ); + color2 = new Color( color2 !== undefined ? color2 : 0x888888 ); + + var center = divisions / 2; + var step = size / divisions; + var halfSize = size / 2; + + var vertices = [], colors = []; + + for ( var 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 ); + + var color = i === center ? color1 : color2; + + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + + } + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + +} + +GridHelper.prototype = Object.create( LineSegments.prototype ); +GridHelper.prototype.constructor = GridHelper; + +export { GridHelper }; diff --git a/lib/helpers/HemisphereLightHelper.js b/lib/helpers/HemisphereLightHelper.js new file mode 100644 index 0000000..32da691 --- /dev/null +++ b/lib/helpers/HemisphereLightHelper.js @@ -0,0 +1,96 @@ +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { Vector3 } from '../math/Vector3.js'; +import { Color } from '../math/Color.js'; +import { Object3D } from '../core/Object3D.js'; +import { Mesh } from '../objects/Mesh.js'; +import { VertexColors } from '../constants.js'; +import { MeshBasicMaterial } from '../materials/MeshBasicMaterial.js'; +import { OctahedronBufferGeometry } from '../geometries/OctahedronGeometry.js'; +import { BufferAttribute } from '../core/BufferAttribute.js'; + +function HemisphereLightHelper( light, size, color ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + var geometry = new OctahedronBufferGeometry( size ); + geometry.rotateY( Math.PI * 0.5 ); + + this.material = new MeshBasicMaterial( { wireframe: true, fog: false } ); + if ( this.color === undefined ) this.material.vertexColors = VertexColors; + + var position = geometry.getAttribute( 'position' ); + var colors = new Float32Array( position.count * 3 ); + + geometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) ); + + this.add( new Mesh( geometry, this.material ) ); + + this.update(); + +} + +HemisphereLightHelper.prototype = Object.create( Object3D.prototype ); +HemisphereLightHelper.prototype.constructor = HemisphereLightHelper; + +HemisphereLightHelper.prototype.dispose = function () { + + this.children[ 0 ].geometry.dispose(); + this.children[ 0 ].material.dispose(); + +}; + +HemisphereLightHelper.prototype.update = function () { + + var vector = new Vector3(); + + var color1 = new Color(); + var color2 = new Color(); + + return function update() { + + var mesh = this.children[ 0 ]; + + if ( this.color !== undefined ) { + + this.material.color.set( this.color ); + + } else { + + var colors = mesh.geometry.getAttribute( 'color' ); + + color1.copy( this.light.color ); + color2.copy( this.light.groundColor ); + + for ( var i = 0, l = colors.count; i < l; i ++ ) { + + var color = ( i < ( l / 2 ) ) ? color1 : color2; + + colors.setXYZ( i, color.r, color.g, color.b ); + + } + + colors.needsUpdate = true; + + } + + mesh.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() ); + + }; + +}(); + + +export { HemisphereLightHelper }; diff --git a/lib/helpers/PlaneHelper.js b/lib/helpers/PlaneHelper.js new file mode 100644 index 0000000..edb9433 --- /dev/null +++ b/lib/helpers/PlaneHelper.js @@ -0,0 +1,63 @@ +/** + * @author WestLangley / http://github.com/WestLangley + */ + +import { Line } from '../objects/Line.js'; +import { Mesh } from '../objects/Mesh.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; +import { MeshBasicMaterial } from '../materials/MeshBasicMaterial.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Object3D } from '../core/Object3D.js'; +import { FrontSide, BackSide } from '../constants.js'; + +function PlaneHelper( plane, size, hex ) { + + this.type = 'PlaneHelper'; + + this.plane = plane; + + this.size = ( size === undefined ) ? 1 : size; + + var color = ( hex !== undefined ) ? hex : 0xffff00; + + var 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, 0, 0, 1, 0, 0, 0 ]; + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + geometry.computeBoundingSphere(); + + Line.call( this, geometry, new LineBasicMaterial( { color: color } ) ); + + // + + var positions2 = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, - 1, 1, 1, - 1, 1 ]; + + var geometry2 = new BufferGeometry(); + geometry2.addAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) ); + geometry2.computeBoundingSphere(); + + this.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false } ) ) ); + +} + +PlaneHelper.prototype = Object.create( Line.prototype ); +PlaneHelper.prototype.constructor = PlaneHelper; + +PlaneHelper.prototype.updateMatrixWorld = function ( force ) { + + var scale = - this.plane.constant; + + if ( Math.abs( scale ) < 1e-8 ) scale = 1e-8; // sign does not matter + + this.scale.set( 0.5 * this.size, 0.5 * this.size, scale ); + + this.children[ 0 ].material.side = ( scale < 0 ) ? BackSide : FrontSide; // renderer flips side when determinant < 0; flipping not wanted here + + this.lookAt( this.plane.normal ); + + Object3D.prototype.updateMatrixWorld.call( this, force ); + +}; + +export { PlaneHelper }; diff --git a/lib/helpers/PointLightHelper.js b/lib/helpers/PointLightHelper.js new file mode 100644 index 0000000..c5290e4 --- /dev/null +++ b/lib/helpers/PointLightHelper.js @@ -0,0 +1,92 @@ +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + +import { Mesh } from '../objects/Mesh.js'; +import { MeshBasicMaterial } from '../materials/MeshBasicMaterial.js'; +import { SphereBufferGeometry } from '../geometries/SphereGeometry.js'; + +function PointLightHelper( light, sphereSize, color ) { + + this.light = light; + this.light.updateMatrixWorld(); + + this.color = color; + + var geometry = new SphereBufferGeometry( sphereSize, 4, 2 ); + var material = new MeshBasicMaterial( { wireframe: true, fog: false } ); + + Mesh.call( this, geometry, material ); + + this.matrix = this.light.matrixWorld; + this.matrixAutoUpdate = false; + + this.update(); + + + /* + var distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 ); + var distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } ); + + this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial ); + this.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial ); + + var d = light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.scale.set( d, d, d ); + + } + + this.add( this.lightDistance ); + */ + +} + +PointLightHelper.prototype = Object.create( Mesh.prototype ); +PointLightHelper.prototype.constructor = PointLightHelper; + +PointLightHelper.prototype.dispose = function () { + + this.geometry.dispose(); + this.material.dispose(); + +}; + +PointLightHelper.prototype.update = function () { + + if ( this.color !== undefined ) { + + this.material.color.set( this.color ); + + } else { + + this.material.color.copy( this.light.color ); + + } + + /* + var d = this.light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.visible = true; + this.lightDistance.scale.set( d, d, d ); + + } + */ + +}; + + +export { PointLightHelper }; diff --git a/lib/helpers/PolarGridHelper.js b/lib/helpers/PolarGridHelper.js new file mode 100644 index 0000000..bfbb0f0 --- /dev/null +++ b/lib/helpers/PolarGridHelper.js @@ -0,0 +1,95 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / http://github.com/Mugen87 + * @author Hectate / http://www.github.com/Hectate + */ + +import { LineSegments } from '../objects/LineSegments.js'; +import { VertexColors } from '../constants.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Color } from '../math/Color.js'; + +function PolarGridHelper( radius, radials, circles, divisions, color1, color2 ) { + + radius = radius || 10; + radials = radials || 16; + circles = circles || 8; + divisions = divisions || 64; + color1 = new Color( color1 !== undefined ? color1 : 0x444444 ); + color2 = new Color( color2 !== undefined ? color2 : 0x888888 ); + + var vertices = []; + var colors = []; + + var x, z; + var v, i, j, r, color; + + // create the radials + + for ( i = 0; i <= radials; i ++ ) { + + v = ( i / radials ) * ( Math.PI * 2 ); + + x = Math.sin( v ) * radius; + z = Math.cos( v ) * radius; + + vertices.push( 0, 0, 0 ); + vertices.push( x, 0, z ); + + color = ( i & 1 ) ? color1 : color2; + + colors.push( color.r, color.g, color.b ); + colors.push( color.r, color.g, color.b ); + + } + + // create the circles + + for ( i = 0; i <= circles; i ++ ) { + + color = ( i & 1 ) ? color1 : color2; + + r = radius - ( radius / circles * i ); + + for ( j = 0; j < divisions; j ++ ) { + + // first vertex + + v = ( j / 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 ); + + // 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 ); + + } + + } + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + +} + +PolarGridHelper.prototype = Object.create( LineSegments.prototype ); +PolarGridHelper.prototype.constructor = PolarGridHelper; + +export { PolarGridHelper }; diff --git a/lib/helpers/RectAreaLightHelper.js b/lib/helpers/RectAreaLightHelper.js new file mode 100644 index 0000000..dfeca0e --- /dev/null +++ b/lib/helpers/RectAreaLightHelper.js @@ -0,0 +1,81 @@ +/** + * @author abelnation / http://github.com/abelnation + * @author Mugen87 / http://github.com/Mugen87 + * @author WestLangley / http://github.com/WestLangley + */ + +import { Object3D } from '../core/Object3D.js'; +import { Line } from '../objects/Line.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { BufferAttribute } from '../core/BufferAttribute.js'; + +function RectAreaLightHelper( light, color ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + var material = new LineBasicMaterial( { fog: false } ); + + var geometry = new BufferGeometry(); + + geometry.addAttribute( 'position', new BufferAttribute( new Float32Array( 5 * 3 ), 3 ) ); + + this.line = new Line( geometry, material ); + this.add( this.line ); + + + this.update(); + +} + +RectAreaLightHelper.prototype = Object.create( Object3D.prototype ); +RectAreaLightHelper.prototype.constructor = RectAreaLightHelper; + +RectAreaLightHelper.prototype.dispose = function () { + + this.children[ 0 ].geometry.dispose(); + this.children[ 0 ].material.dispose(); + +}; + +RectAreaLightHelper.prototype.update = function () { + + // calculate new dimensions of the helper + + var hx = this.light.width * 0.5; + var hy = this.light.height * 0.5; + + var position = this.line.geometry.attributes.position; + var array = position.array; + + // update vertices + + array[ 0 ] = hx; array[ 1 ] = - hy; array[ 2 ] = 0; + array[ 3 ] = hx; array[ 4 ] = hy; array[ 5 ] = 0; + array[ 6 ] = - hx; array[ 7 ] = hy; array[ 8 ] = 0; + array[ 9 ] = - hx; array[ 10 ] = - hy; array[ 11 ] = 0; + array[ 12 ] = hx; array[ 13 ] = - hy; array[ 14 ] = 0; + + position.needsUpdate = true; + + if ( this.color !== undefined ) { + + this.line.material.color.set( this.color ); + + } else { + + this.line.material.color.copy( this.light.color ); + + } + +}; + +export { RectAreaLightHelper }; diff --git a/lib/helpers/SkeletonHelper.js b/lib/helpers/SkeletonHelper.js new file mode 100644 index 0000000..0756de3 --- /dev/null +++ b/lib/helpers/SkeletonHelper.js @@ -0,0 +1,128 @@ +/** + * @author Sean Griffin / http://twitter.com/sgrif + * @author Michael Guerrero / http://realitymeltdown.com + * @author mrdoob / http://mrdoob.com/ + * @author ikerr / http://verold.com + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { LineSegments } from '../objects/LineSegments.js'; +import { Matrix4 } from '../math/Matrix4.js'; +import { VertexColors } from '../constants.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; +import { Color } from '../math/Color.js'; +import { Vector3 } from '../math/Vector3.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { Object3D } from '../core/Object3D.js'; + +function getBoneList( object ) { + + var boneList = []; + + if ( object && object.isBone ) { + + boneList.push( object ); + + } + + for ( var i = 0; i < object.children.length; i ++ ) { + + boneList.push.apply( boneList, getBoneList( object.children[ i ] ) ); + + } + + return boneList; + +} + +function SkeletonHelper( object ) { + + var bones = getBoneList( object ); + + var geometry = new BufferGeometry(); + + var vertices = []; + var colors = []; + + var color1 = new Color( 0, 0, 1 ); + var color2 = new Color( 0, 1, 0 ); + + for ( var i = 0; i < bones.length; i ++ ) { + + var 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 ); + colors.push( color2.r, color2.g, color2.b ); + + } + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } ); + + LineSegments.call( this, geometry, material ); + + this.root = object; + this.bones = bones; + + this.matrix = object.matrixWorld; + this.matrixAutoUpdate = false; + +} + +SkeletonHelper.prototype = Object.create( LineSegments.prototype ); +SkeletonHelper.prototype.constructor = SkeletonHelper; + +SkeletonHelper.prototype.updateMatrixWorld = function () { + + var vector = new Vector3(); + + var boneMatrix = new Matrix4(); + var matrixWorldInv = new Matrix4(); + + return function updateMatrixWorld( force ) { + + var bones = this.bones; + + var geometry = this.geometry; + var position = geometry.getAttribute( 'position' ); + + matrixWorldInv.getInverse( this.root.matrixWorld ); + + for ( var i = 0, j = 0; i < bones.length; i ++ ) { + + var bone = bones[ i ]; + + if ( bone.parent && bone.parent.isBone ) { + + boneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld ); + vector.setFromMatrixPosition( boneMatrix ); + position.setXYZ( j, vector.x, vector.y, vector.z ); + + boneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld ); + vector.setFromMatrixPosition( boneMatrix ); + position.setXYZ( j + 1, vector.x, vector.y, vector.z ); + + j += 2; + + } + + } + + geometry.getAttribute( 'position' ).needsUpdate = true; + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + }; + +}(); + +export { SkeletonHelper }; diff --git a/lib/helpers/SpotLightHelper.js b/lib/helpers/SpotLightHelper.js new file mode 100644 index 0000000..4d006d8 --- /dev/null +++ b/lib/helpers/SpotLightHelper.js @@ -0,0 +1,103 @@ +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + +import { Vector3 } from '../math/Vector3.js'; +import { Object3D } from '../core/Object3D.js'; +import { LineSegments } from '../objects/LineSegments.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; + +function SpotLightHelper( light, color ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + var geometry = new BufferGeometry(); + + var 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 ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) { + + var p1 = ( i / l ) * Math.PI * 2; + var p2 = ( j / l ) * Math.PI * 2; + + positions.push( + Math.cos( p1 ), Math.sin( p1 ), 1, + Math.cos( p2 ), Math.sin( p2 ), 1 + ); + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + + var material = new LineBasicMaterial( { fog: false } ); + + this.cone = new LineSegments( geometry, material ); + this.add( this.cone ); + + this.update(); + +} + +SpotLightHelper.prototype = Object.create( Object3D.prototype ); +SpotLightHelper.prototype.constructor = SpotLightHelper; + +SpotLightHelper.prototype.dispose = function () { + + this.cone.geometry.dispose(); + this.cone.material.dispose(); + +}; + +SpotLightHelper.prototype.update = function () { + + var vector = new Vector3(); + var vector2 = new Vector3(); + + return function update() { + + this.light.updateMatrixWorld(); + + var coneLength = this.light.distance ? this.light.distance : 1000; + var coneWidth = coneLength * Math.tan( this.light.angle ); + + this.cone.scale.set( coneWidth, coneWidth, coneLength ); + + vector.setFromMatrixPosition( this.light.matrixWorld ); + vector2.setFromMatrixPosition( this.light.target.matrixWorld ); + + this.cone.lookAt( vector2.sub( vector ) ); + + if ( this.color !== undefined ) { + + this.cone.material.color.set( this.color ); + + } else { + + this.cone.material.color.copy( this.light.color ); + + } + + }; + +}(); + + +export { SpotLightHelper }; diff --git a/lib/helpers/VertexNormalsHelper.js b/lib/helpers/VertexNormalsHelper.js new file mode 100644 index 0000000..fb16909 --- /dev/null +++ b/lib/helpers/VertexNormalsHelper.js @@ -0,0 +1,153 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + +import { Matrix3 } from '../math/Matrix3.js'; +import { Vector3 } from '../math/Vector3.js'; +import { LineSegments } from '../objects/LineSegments.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; + +function VertexNormalsHelper( object, size, hex, linewidth ) { + + this.object = object; + + this.size = ( size !== undefined ) ? size : 1; + + var color = ( hex !== undefined ) ? hex : 0xff0000; + + var width = ( linewidth !== undefined ) ? linewidth : 1; + + // + + var nNormals = 0; + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + nNormals = objGeometry.faces.length * 3; + + } else if ( objGeometry && objGeometry.isBufferGeometry ) { + + nNormals = objGeometry.attributes.normal.count; + + } + + // + + var geometry = new BufferGeometry(); + + var positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 ); + + geometry.addAttribute( 'position', positions ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) ); + + // + + this.matrixAutoUpdate = false; + + this.update(); + +} + +VertexNormalsHelper.prototype = Object.create( LineSegments.prototype ); +VertexNormalsHelper.prototype.constructor = VertexNormalsHelper; + +VertexNormalsHelper.prototype.update = ( function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var normalMatrix = new Matrix3(); + + return function update() { + + var keys = [ 'a', 'b', 'c' ]; + + this.object.updateMatrixWorld( true ); + + normalMatrix.getNormalMatrix( this.object.matrixWorld ); + + var matrixWorld = this.object.matrixWorld; + + var position = this.geometry.attributes.position; + + // + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + var vertices = objGeometry.vertices; + + var faces = objGeometry.faces; + + var idx = 0; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + var vertex = vertices[ face[ keys[ j ] ] ]; + + var normal = face.vertexNormals[ j ]; + + v1.copy( vertex ).applyMatrix4( matrixWorld ); + + v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + } + + } else if ( objGeometry && objGeometry.isBufferGeometry ) { + + var objPos = objGeometry.attributes.position; + + var objNorm = objGeometry.attributes.normal; + + var idx = 0; + + // for simplicity, ignore index and drawcalls, and render every normal + + for ( var j = 0, jl = objPos.count; j < jl; j ++ ) { + + v1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld ); + + v2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) ); + + v2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + } + + position.needsUpdate = true; + + }; + +}() ); + + +export { VertexNormalsHelper }; diff --git a/lib/lights/AmbientLight.js b/lib/lights/AmbientLight.js new file mode 100644 index 0000000..1c52837 --- /dev/null +++ b/lib/lights/AmbientLight.js @@ -0,0 +1,26 @@ +import { Light } from './Light.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function AmbientLight( color, intensity ) { + + Light.call( this, color, intensity ); + + this.type = 'AmbientLight'; + + this.castShadow = undefined; + +} + +AmbientLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: AmbientLight, + + isAmbientLight: true + +} ); + + +export { AmbientLight }; diff --git a/lib/lights/DirectionalLight.js b/lib/lights/DirectionalLight.js new file mode 100644 index 0000000..396a2a2 --- /dev/null +++ b/lib/lights/DirectionalLight.js @@ -0,0 +1,46 @@ +import { Light } from './Light.js'; +import { DirectionalLightShadow } from './DirectionalLightShadow.js'; +import { Object3D } from '../core/Object3D.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +function DirectionalLight( color, intensity ) { + + Light.call( this, color, intensity ); + + this.type = 'DirectionalLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.target = new Object3D(); + + this.shadow = new DirectionalLightShadow(); + +} + +DirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: DirectionalLight, + + isDirectionalLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + + } + +} ); + + +export { DirectionalLight }; diff --git a/lib/lights/DirectionalLightShadow.js b/lib/lights/DirectionalLightShadow.js new file mode 100644 index 0000000..7c2a5fc --- /dev/null +++ b/lib/lights/DirectionalLightShadow.js @@ -0,0 +1,21 @@ +import { LightShadow } from './LightShadow.js'; +import { OrthographicCamera } from '../cameras/OrthographicCamera.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function DirectionalLightShadow( ) { + + LightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) ); + +} + +DirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), { + + constructor: DirectionalLightShadow + +} ); + + +export { DirectionalLightShadow }; diff --git a/lib/lights/HemisphereLight.js b/lib/lights/HemisphereLight.js new file mode 100644 index 0000000..84ccacb --- /dev/null +++ b/lib/lights/HemisphereLight.js @@ -0,0 +1,43 @@ +import { Light } from './Light.js'; +import { Color } from '../math/Color.js'; +import { Object3D } from '../core/Object3D.js'; + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +function HemisphereLight( skyColor, groundColor, intensity ) { + + Light.call( this, skyColor, intensity ); + + this.type = 'HemisphereLight'; + + this.castShadow = undefined; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.groundColor = new Color( groundColor ); + +} + +HemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: HemisphereLight, + + isHemisphereLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.groundColor.copy( source.groundColor ); + + return this; + + } + +} ); + + +export { HemisphereLight }; diff --git a/lib/lights/Light.js b/lib/lights/Light.js new file mode 100644 index 0000000..e4db9c0 --- /dev/null +++ b/lib/lights/Light.js @@ -0,0 +1,62 @@ +import { Object3D } from '../core/Object3D.js'; +import { Color } from '../math/Color.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +function Light( color, intensity ) { + + Object3D.call( this ); + + this.type = 'Light'; + + this.color = new Color( color ); + this.intensity = intensity !== undefined ? intensity : 1; + + this.receiveShadow = undefined; + +} + +Light.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Light, + + isLight: true, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.intensity = source.intensity; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.color = this.color.getHex(); + data.object.intensity = this.intensity; + + if ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex(); + + if ( this.distance !== undefined ) data.object.distance = this.distance; + if ( this.angle !== undefined ) data.object.angle = this.angle; + if ( this.decay !== undefined ) data.object.decay = this.decay; + if ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra; + + if ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON(); + + return data; + + } + +} ); + + +export { Light }; diff --git a/lib/lights/LightShadow.js b/lib/lights/LightShadow.js new file mode 100644 index 0000000..294781c --- /dev/null +++ b/lib/lights/LightShadow.js @@ -0,0 +1,61 @@ +import { Matrix4 } from '../math/Matrix4.js'; +import { Vector2 } from '../math/Vector2.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function LightShadow( camera ) { + + this.camera = camera; + + this.bias = 0; + this.radius = 1; + + this.mapSize = new Vector2( 512, 512 ); + + this.map = null; + this.matrix = new Matrix4(); + +} + +Object.assign( LightShadow.prototype, { + + copy: function ( source ) { + + this.camera = source.camera.clone(); + + this.bias = source.bias; + this.radius = source.radius; + + this.mapSize.copy( source.mapSize ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + toJSON: function () { + + var object = {}; + + if ( this.bias !== 0 ) object.bias = this.bias; + if ( this.radius !== 1 ) object.radius = this.radius; + if ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray(); + + object.camera = this.camera.toJSON( false ).object; + delete object.camera.matrix; + + return object; + + } + +} ); + + +export { LightShadow }; diff --git a/lib/lights/PointLight.js b/lib/lights/PointLight.js new file mode 100644 index 0000000..1620787 --- /dev/null +++ b/lib/lights/PointLight.js @@ -0,0 +1,62 @@ +import { Light } from './Light.js'; +import { PerspectiveCamera } from '../cameras/PerspectiveCamera.js'; +import { LightShadow } from './LightShadow.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + + +function PointLight( color, intensity, distance, decay ) { + + Light.call( this, color, intensity ); + + this.type = 'PointLight'; + + Object.defineProperty( this, 'power', { + get: function () { + + // intensity = power per solid angle. + // ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + return this.intensity * 4 * Math.PI; + + }, + set: function ( power ) { + + // intensity = power per solid angle. + // ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + this.intensity = power / ( 4 * Math.PI ); + + } + } ); + + this.distance = ( distance !== undefined ) ? distance : 0; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) ); + +} + +PointLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: PointLight, + + isPointLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.distance = source.distance; + this.decay = source.decay; + + this.shadow = source.shadow.clone(); + + return this; + + } + +} ); + + +export { PointLight }; diff --git a/lib/lights/RectAreaLight.js b/lib/lights/RectAreaLight.js new file mode 100644 index 0000000..d65f35b --- /dev/null +++ b/lib/lights/RectAreaLight.js @@ -0,0 +1,48 @@ +import { Light } from './Light.js'; + +/** + * @author abelnation / http://github.com/abelnation + */ + +function RectAreaLight( color, intensity, width, height ) { + + Light.call( this, color, intensity ); + + this.type = 'RectAreaLight'; + + this.width = ( width !== undefined ) ? width : 10; + this.height = ( height !== undefined ) ? height : 10; + +} + +RectAreaLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: RectAreaLight, + + isRectAreaLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.width = source.width; + this.height = source.height; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Light.prototype.toJSON.call( this, meta ); + + data.object.width = this.width; + data.object.height = this.height; + + return data; + + } + +} ); + +export { RectAreaLight }; diff --git a/lib/lights/SpotLight.js b/lib/lights/SpotLight.js new file mode 100644 index 0000000..90d891a --- /dev/null +++ b/lib/lights/SpotLight.js @@ -0,0 +1,72 @@ +import { Light } from './Light.js'; +import { SpotLightShadow } from './SpotLightShadow.js'; +import { Object3D } from '../core/Object3D.js'; + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +function SpotLight( color, intensity, distance, angle, penumbra, decay ) { + + Light.call( this, color, intensity ); + + this.type = 'SpotLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.target = new Object3D(); + + Object.defineProperty( this, 'power', { + get: function () { + + // intensity = power per solid angle. + // ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + return this.intensity * Math.PI; + + }, + set: function ( power ) { + + // intensity = power per solid angle. + // ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + this.intensity = power / Math.PI; + + } + } ); + + this.distance = ( distance !== undefined ) ? distance : 0; + this.angle = ( angle !== undefined ) ? angle : Math.PI / 3; + this.penumbra = ( penumbra !== undefined ) ? penumbra : 0; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new SpotLightShadow(); + +} + +SpotLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: SpotLight, + + isSpotLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.distance = source.distance; + this.angle = source.angle; + this.penumbra = source.penumbra; + this.decay = source.decay; + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + + } + +} ); + + +export { SpotLight }; diff --git a/lib/lights/SpotLightShadow.js b/lib/lights/SpotLightShadow.js new file mode 100644 index 0000000..0a80e7b --- /dev/null +++ b/lib/lights/SpotLightShadow.js @@ -0,0 +1,43 @@ +import { LightShadow } from './LightShadow.js'; +import { _Math } from '../math/Math.js'; +import { PerspectiveCamera } from '../cameras/PerspectiveCamera.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function SpotLightShadow() { + + LightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) ); + +} + +SpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), { + + constructor: SpotLightShadow, + + isSpotLightShadow: true, + + update: function ( light ) { + + var camera = this.camera; + + var fov = _Math.RAD2DEG * 2 * light.angle; + var aspect = this.mapSize.width / this.mapSize.height; + var far = light.distance || camera.far; + + if ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) { + + camera.fov = fov; + camera.aspect = aspect; + camera.far = far; + camera.updateProjectionMatrix(); + + } + + } + +} ); + + +export { SpotLightShadow }; diff --git a/lib/loaders/AnimationLoader.js b/lib/loaders/AnimationLoader.js new file mode 100644 index 0000000..161ebf9 --- /dev/null +++ b/lib/loaders/AnimationLoader.js @@ -0,0 +1,57 @@ +import { AnimationClip } from '../animation/AnimationClip.js'; +import { FileLoader } from './FileLoader.js'; +import { DefaultLoadingManager } from './LoadingManager.js'; + +/** + * @author bhouston / http://clara.io/ + */ + +function AnimationLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + +} + +Object.assign( AnimationLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.setPath( scope.path ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + }, onProgress, onError ); + + }, + + parse: function ( json, onLoad ) { + + var animations = []; + + for ( var i = 0; i < json.length; i ++ ) { + + var clip = AnimationClip.parse( json[ i ] ); + + animations.push( clip ); + + } + + onLoad( animations ); + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + +} ); + + +export { AnimationLoader }; diff --git a/lib/loaders/AudioLoader.js b/lib/loaders/AudioLoader.js new file mode 100644 index 0000000..b9a5d61 --- /dev/null +++ b/lib/loaders/AudioLoader.js @@ -0,0 +1,49 @@ +import { AudioContext } from '../audio/AudioContext.js'; +import { FileLoader } from './FileLoader.js'; +import { DefaultLoadingManager } from './LoadingManager.js'; + +/** + * @author Reece Aaron Lecrivain / http://reecenotes.com/ + */ + +function AudioLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + +} + +Object.assign( AudioLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var loader = new FileLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + loader.setPath( this.path ); + loader.load( url, function ( buffer ) { + + // Create a copy of the buffer. The `decodeAudioData` method + // detaches the buffer when complete, preventing reuse. + var bufferCopy = buffer.slice( 0 ); + + var context = AudioContext.getContext(); + context.decodeAudioData( bufferCopy, function ( audioBuffer ) { + + onLoad( audioBuffer ); + + } ); + + }, onProgress, onError ); + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + +} ); + + +export { AudioLoader }; diff --git a/lib/loaders/BufferGeometryLoader.js b/lib/loaders/BufferGeometryLoader.js new file mode 100644 index 0000000..381c224 --- /dev/null +++ b/lib/loaders/BufferGeometryLoader.js @@ -0,0 +1,114 @@ +import { Sphere } from '../math/Sphere.js'; +import { Vector3 } from '../math/Vector3.js'; +import { BufferAttribute } from '../core/BufferAttribute.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { FileLoader } from './FileLoader.js'; +import { DefaultLoadingManager } from './LoadingManager.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function BufferGeometryLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + +} + +Object.assign( BufferGeometryLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.setPath( scope.path ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + var geometry = new BufferGeometry(); + + var index = json.data.index; + + if ( index !== undefined ) { + + var typedArray = new TYPED_ARRAYS[ index.type ]( index.array ); + geometry.setIndex( new BufferAttribute( typedArray, 1 ) ); + + } + + var attributes = json.data.attributes; + + for ( var key in attributes ) { + + var attribute = attributes[ key ]; + var typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array ); + + geometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) ); + + } + + var groups = json.data.groups || json.data.drawcalls || json.data.offsets; + + if ( groups !== undefined ) { + + for ( var i = 0, n = groups.length; i !== n; ++ i ) { + + var group = groups[ i ]; + + geometry.addGroup( group.start, group.count, group.materialIndex ); + + } + + } + + var boundingSphere = json.data.boundingSphere; + + if ( boundingSphere !== undefined ) { + + var center = new Vector3(); + + if ( boundingSphere.center !== undefined ) { + + center.fromArray( boundingSphere.center ); + + } + + geometry.boundingSphere = new Sphere( center, boundingSphere.radius ); + + } + + return geometry; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + +} ); + +var TYPED_ARRAYS = { + Int8Array: Int8Array, + Uint8Array: Uint8Array, + // Workaround for IE11 pre KB2929437. See #11440 + Uint8ClampedArray: typeof Uint8ClampedArray !== 'undefined' ? Uint8ClampedArray : Uint8Array, + Int16Array: Int16Array, + Uint16Array: Uint16Array, + Int32Array: Int32Array, + Uint32Array: Uint32Array, + Float32Array: Float32Array, + Float64Array: Float64Array +}; + +export { BufferGeometryLoader }; diff --git a/lib/loaders/Cache.js b/lib/loaders/Cache.js new file mode 100644 index 0000000..9f63c8d --- /dev/null +++ b/lib/loaders/Cache.js @@ -0,0 +1,46 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +var Cache = { + + enabled: false, + + files: {}, + + add: function ( key, file ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Adding key:', key ); + + this.files[ key ] = file; + + }, + + get: function ( key ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Checking key:', key ); + + return this.files[ key ]; + + }, + + remove: function ( key ) { + + delete this.files[ key ]; + + }, + + clear: function () { + + this.files = {}; + + } + +}; + + +export { Cache }; diff --git a/lib/loaders/CompressedTextureLoader.js b/lib/loaders/CompressedTextureLoader.js new file mode 100644 index 0000000..6f298d7 --- /dev/null +++ b/lib/loaders/CompressedTextureLoader.js @@ -0,0 +1,141 @@ +import { LinearFilter } from '../constants.js'; +import { FileLoader } from './FileLoader.js'; +import { CompressedTexture } from '../textures/CompressedTexture.js'; +import { DefaultLoadingManager } from './LoadingManager.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * + * Abstract Base class to block based textures loader (dds, pvr, ...) + */ + +function CompressedTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + // override in sub classes + this._parser = null; + +} + +Object.assign( CompressedTextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var images = []; + + var texture = new CompressedTexture(); + texture.image = images; + + var loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.setResponseType( 'arraybuffer' ); + + function loadTexture( i ) { + + loader.load( url[ i ], function ( buffer ) { + + var texDatas = scope._parser( buffer, true ); + + images[ i ] = { + width: texDatas.width, + height: texDatas.height, + format: texDatas.format, + mipmaps: texDatas.mipmaps + }; + + loaded += 1; + + if ( loaded === 6 ) { + + if ( texDatas.mipmapCount === 1 ) + texture.minFilter = LinearFilter; + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, onProgress, onError ); + + } + + if ( Array.isArray( url ) ) { + + var loaded = 0; + + for ( var i = 0, il = url.length; i < il; ++ i ) { + + loadTexture( i ); + + } + + } else { + + // compressed cubemap texture stored in a single DDS file + + loader.load( url, function ( buffer ) { + + var texDatas = scope._parser( buffer, true ); + + if ( texDatas.isCubemap ) { + + var faces = texDatas.mipmaps.length / texDatas.mipmapCount; + + for ( var f = 0; f < faces; f ++ ) { + + images[ f ] = { mipmaps: [] }; + + for ( var i = 0; i < texDatas.mipmapCount; i ++ ) { + + images[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] ); + images[ f ].format = texDatas.format; + images[ f ].width = texDatas.width; + images[ f ].height = texDatas.height; + + } + + } + + } else { + + texture.image.width = texDatas.width; + texture.image.height = texDatas.height; + texture.mipmaps = texDatas.mipmaps; + + } + + if ( texDatas.mipmapCount === 1 ) { + + texture.minFilter = LinearFilter; + + } + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + }, onProgress, onError ); + + } + + return texture; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + +} ); + + +export { CompressedTextureLoader }; diff --git a/lib/loaders/CubeTextureLoader.js b/lib/loaders/CubeTextureLoader.js new file mode 100644 index 0000000..187d55d --- /dev/null +++ b/lib/loaders/CubeTextureLoader.js @@ -0,0 +1,77 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { ImageLoader } from './ImageLoader.js'; +import { CubeTexture } from '../textures/CubeTexture.js'; +import { DefaultLoadingManager } from './LoadingManager.js'; + + +function CubeTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + +} + +Object.assign( CubeTextureLoader.prototype, { + + crossOrigin: 'anonymous', + + load: function ( urls, onLoad, onProgress, onError ) { + + var texture = new CubeTexture(); + + var loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setPath( this.path ); + + var loaded = 0; + + function loadTexture( i ) { + + loader.load( urls[ i ], function ( image ) { + + texture.images[ i ] = image; + + loaded ++; + + if ( loaded === 6 ) { + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, undefined, onError ); + + } + + for ( var i = 0; i < urls.length; ++ i ) { + + loadTexture( i ); + + } + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + +} ); + + +export { CubeTextureLoader }; diff --git a/lib/loaders/DataTextureLoader.js b/lib/loaders/DataTextureLoader.js new file mode 100644 index 0000000..49f4d90 --- /dev/null +++ b/lib/loaders/DataTextureLoader.js @@ -0,0 +1,102 @@ +import { LinearFilter, LinearMipMapLinearFilter, ClampToEdgeWrapping } from '../constants.js'; +import { FileLoader } from './FileLoader.js'; +import { DataTexture } from '../textures/DataTexture.js'; +import { DefaultLoadingManager } from './LoadingManager.js'; + +/** + * @author Nikos M. / https://github.com/foo123/ + * + * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...) + */ + +function DataTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + // override in sub classes + this._parser = null; + +} + +Object.assign( DataTextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var texture = new DataTexture(); + + var loader = new FileLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + loader.setPath( this.path ); + loader.load( url, function ( buffer ) { + + var texData = scope._parser( buffer ); + + if ( ! texData ) return; + + if ( undefined !== texData.image ) { + + texture.image = texData.image; + + } else if ( undefined !== texData.data ) { + + texture.image.width = texData.width; + texture.image.height = texData.height; + texture.image.data = texData.data; + + } + + texture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping; + texture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping; + + texture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter; + texture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter; + + texture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1; + + if ( undefined !== texData.format ) { + + texture.format = texData.format; + + } + if ( undefined !== texData.type ) { + + texture.type = texData.type; + + } + + if ( undefined !== texData.mipmaps ) { + + texture.mipmaps = texData.mipmaps; + + } + + if ( 1 === texData.mipmapCount ) { + + texture.minFilter = LinearFilter; + + } + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture, texData ); + + }, onProgress, onError ); + + + return texture; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + +} ); + + +export { DataTextureLoader }; diff --git a/lib/loaders/FileLoader.js b/lib/loaders/FileLoader.js new file mode 100644 index 0000000..d41fe75 --- /dev/null +++ b/lib/loaders/FileLoader.js @@ -0,0 +1,319 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { Cache } from './Cache.js'; +import { DefaultLoadingManager } from './LoadingManager.js'; + +var loading = {}; + +function FileLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + +} + +Object.assign( FileLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + url = this.manager.resolveURL( url ); + + var scope = this; + + var cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + // Check if request is duplicate + + if ( loading[ url ] !== undefined ) { + + loading[ url ].push( { + + onLoad: onLoad, + onProgress: onProgress, + onError: onError + + } ); + + return; + + } + + // Check for data: URI + var dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/; + var dataUriRegexResult = url.match( dataUriRegex ); + + // Safari can not handle Data URIs through XMLHttpRequest so process manually + if ( dataUriRegexResult ) { + + var mimeType = dataUriRegexResult[ 1 ]; + var isBase64 = !! dataUriRegexResult[ 2 ]; + var data = dataUriRegexResult[ 3 ]; + + data = decodeURIComponent( data ); + + if ( isBase64 ) data = atob( data ); + + try { + + var response; + var responseType = ( this.responseType || '' ).toLowerCase(); + + switch ( responseType ) { + + case 'arraybuffer': + case 'blob': + + var view = new Uint8Array( data.length ); + + for ( var i = 0; i < data.length; i ++ ) { + + view[ i ] = data.charCodeAt( i ); + + } + + if ( responseType === 'blob' ) { + + response = new Blob( [ view.buffer ], { type: mimeType } ); + + } else { + + response = view.buffer; + + } + + break; + + case 'document': + + var parser = new DOMParser(); + response = parser.parseFromString( data, mimeType ); + + break; + + case 'json': + + response = JSON.parse( data ); + + break; + + default: // 'text' or other + + response = data; + + break; + + } + + // Wait for next browser tick like standard XMLHttpRequest event dispatching does + setTimeout( function () { + + if ( onLoad ) onLoad( response ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + } catch ( error ) { + + // Wait for next browser tick like standard XMLHttpRequest event dispatching does + setTimeout( function () { + + if ( onError ) onError( error ); + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + }, 0 ); + + } + + } else { + + // Initialise array for duplicate requests + + loading[ url ] = []; + + loading[ url ].push( { + + onLoad: onLoad, + onProgress: onProgress, + onError: onError + + } ); + + var request = new XMLHttpRequest(); + + request.open( 'GET', url, true ); + + request.addEventListener( 'load', function ( event ) { + + var response = this.response; + + Cache.add( url, response ); + + var callbacks = loading[ url ]; + + delete loading[ url ]; + + if ( this.status === 200 || this.status === 0 ) { + + // Some browsers return HTTP Status 0 when using non-http protocol + // e.g. 'file://' or 'data://'. Handle as success. + + if ( this.status === 0 ) console.warn( 'THREE.FileLoader: HTTP Status 0 received.' ); + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onLoad ) callback.onLoad( response ); + + } + + scope.manager.itemEnd( url ); + + } else { + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onError ) callback.onError( event ); + + } + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + } + + }, false ); + + request.addEventListener( 'progress', function ( event ) { + + var callbacks = loading[ url ]; + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onProgress ) callback.onProgress( event ); + + } + + }, false ); + + request.addEventListener( 'error', function ( event ) { + + var callbacks = loading[ url ]; + + delete loading[ url ]; + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onError ) callback.onError( event ); + + } + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + }, false ); + + request.addEventListener( 'abort', function ( event ) { + + var callbacks = loading[ url ]; + + delete loading[ url ]; + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onError ) callback.onError( event ); + + } + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + }, false ); + + if ( this.responseType !== undefined ) request.responseType = this.responseType; + if ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials; + + if ( request.overrideMimeType ) request.overrideMimeType( this.mimeType !== undefined ? this.mimeType : 'text/plain' ); + + for ( var header in this.requestHeader ) { + + request.setRequestHeader( header, this.requestHeader[ header ] ); + + } + + request.send( null ); + + } + + scope.manager.itemStart( url ); + + return request; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + }, + + setResponseType: function ( value ) { + + this.responseType = value; + return this; + + }, + + setWithCredentials: function ( value ) { + + this.withCredentials = value; + return this; + + }, + + setMimeType: function ( value ) { + + this.mimeType = value; + return this; + + }, + + setRequestHeader: function ( value ) { + + this.requestHeader = value; + return this; + + } + +} ); + + +export { FileLoader }; diff --git a/lib/loaders/FontLoader.js b/lib/loaders/FontLoader.js new file mode 100644 index 0000000..6cb6a0d --- /dev/null +++ b/lib/loaders/FontLoader.js @@ -0,0 +1,62 @@ +import { Font } from '../extras/core/Font.js'; +import { FileLoader } from './FileLoader.js'; +import { DefaultLoadingManager } from './LoadingManager.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function FontLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + +} + +Object.assign( FontLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.load( url, function ( text ) { + + var json; + + try { + + json = JSON.parse( text ); + + } catch ( e ) { + + console.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' ); + json = JSON.parse( text.substring( 65, text.length - 2 ) ); + + } + + var font = scope.parse( json ); + + if ( onLoad ) onLoad( font ); + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + return new Font( json ); + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + +} ); + + +export { FontLoader }; diff --git a/lib/loaders/ImageBitmapLoader.js b/lib/loaders/ImageBitmapLoader.js new file mode 100644 index 0000000..8256a30 --- /dev/null +++ b/lib/loaders/ImageBitmapLoader.js @@ -0,0 +1,110 @@ +/** + * @author thespite / http://clicktorelease.com/ + */ + +import { Cache } from './Cache.js'; +import { DefaultLoadingManager } from './LoadingManager.js'; + + +function ImageBitmapLoader( manager ) { + + if ( typeof createImageBitmap === 'undefined' ) { + + console.warn( 'THREE.ImageBitmapLoader: createImageBitmap() not supported.' ); + + } + + if ( typeof fetch === 'undefined' ) { + + console.warn( 'THREE.ImageBitmapLoader: fetch() not supported.' ); + + } + + this.manager = manager !== undefined ? manager : DefaultLoadingManager; + this.options = undefined; + +} + +ImageBitmapLoader.prototype = { + + constructor: ImageBitmapLoader, + + setOptions: function setOptions( options ) { + + this.options = options; + + return this; + + }, + + load: function ( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + url = this.manager.resolveURL( url ); + + var scope = this; + + var cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + fetch( url ).then( function ( res ) { + + return res.blob(); + + } ).then( function ( blob ) { + + return createImageBitmap( blob, scope.options ); + + } ).then( function ( imageBitmap ) { + + Cache.add( url, imageBitmap ); + + if ( onLoad ) onLoad( imageBitmap ); + + scope.manager.itemEnd( url ); + + } ).catch( function ( e ) { + + if ( onError ) onError( e ); + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + } ); + + }, + + setCrossOrigin: function ( /* value */ ) { + + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + +}; + +export { ImageBitmapLoader }; diff --git a/lib/loaders/ImageLoader.js b/lib/loaders/ImageLoader.js new file mode 100644 index 0000000..be6321d --- /dev/null +++ b/lib/loaders/ImageLoader.js @@ -0,0 +1,108 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { Cache } from './Cache.js'; +import { DefaultLoadingManager } from './LoadingManager.js'; + + +function ImageLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + +} + +Object.assign( ImageLoader.prototype, { + + crossOrigin: 'anonymous', + + load: function ( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + url = this.manager.resolveURL( url ); + + var scope = this; + + var cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + var image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' ); + + function onImageLoad() { + + image.removeEventListener( 'load', onImageLoad, false ); + image.removeEventListener( 'error', onImageError, false ); + + Cache.add( url, this ); + + if ( onLoad ) onLoad( this ); + + scope.manager.itemEnd( url ); + + } + + function onImageError( event ) { + + image.removeEventListener( 'load', onImageLoad, false ); + image.removeEventListener( 'error', onImageError, false ); + + if ( onError ) onError( event ); + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + } + + image.addEventListener( 'load', onImageLoad, false ); + image.addEventListener( 'error', onImageError, false ); + + if ( url.substr( 0, 5 ) !== 'data:' ) { + + if ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin; + + } + + scope.manager.itemStart( url ); + + image.src = url; + + return image; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + +} ); + + +export { ImageLoader }; diff --git a/lib/loaders/JSONLoader.js b/lib/loaders/JSONLoader.js new file mode 100644 index 0000000..800b5af --- /dev/null +++ b/lib/loaders/JSONLoader.js @@ -0,0 +1,587 @@ +import { Loader } from './Loader.js'; +import { LoaderUtils } from './LoaderUtils.js'; +import { AnimationClip } from '../animation/AnimationClip.js'; +import { Vector3 } from '../math/Vector3.js'; +import { Vector4 } from '../math/Vector4.js'; +import { Color } from '../math/Color.js'; +import { Vector2 } from '../math/Vector2.js'; +import { Face3 } from '../core/Face3.js'; +import { Geometry } from '../core/Geometry.js'; +import { FileLoader } from './FileLoader.js'; +import { DefaultLoadingManager } from './LoadingManager.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +function JSONLoader( manager ) { + + if ( typeof manager === 'boolean' ) { + + console.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' ); + manager = undefined; + + } + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + this.withCredentials = false; + +} + +Object.assign( JSONLoader.prototype, { + + crossOrigin: 'anonymous', + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var path = ( this.path === undefined ) ? LoaderUtils.extractUrlBase( url ) : this.path; + + var loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.setWithCredentials( this.withCredentials ); + loader.load( url, function ( text ) { + + var json = JSON.parse( text ); + var metadata = json.metadata; + + if ( metadata !== undefined ) { + + var type = metadata.type; + + if ( type !== undefined ) { + + if ( type.toLowerCase() === 'object' ) { + + console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' ); + return; + + } + + } + + } + + var object = scope.parse( json, path ); + onLoad( object.geometry, object.materials ); + + }, onProgress, onError ); + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + }, + + setResourcePath: function ( value ) { + + this.resourcePath = value; + return this; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + parse: ( function () { + + function parseModel( json, geometry ) { + + function isBitSet( value, position ) { + + return value & ( 1 << position ); + + } + + var i, j, fi, + + offset, zLength, + + colorIndex, normalIndex, uvIndex, materialIndex, + + type, + isQuad, + hasMaterial, + hasFaceVertexUv, + hasFaceNormal, hasFaceVertexNormal, + hasFaceColor, hasFaceVertexColor, + + vertex, face, faceA, faceB, hex, normal, + + uvLayer, uv, u, v, + + faces = json.faces, + vertices = json.vertices, + normals = json.normals, + colors = json.colors, + + scale = json.scale, + + nUvLayers = 0; + + + if ( json.uvs !== undefined ) { + + // disregard empty arrays + + for ( i = 0; i < json.uvs.length; i ++ ) { + + if ( json.uvs[ i ].length ) nUvLayers ++; + + } + + for ( i = 0; i < nUvLayers; i ++ ) { + + geometry.faceVertexUvs[ i ] = []; + + } + + } + + offset = 0; + zLength = vertices.length; + + while ( offset < zLength ) { + + vertex = new Vector3(); + + vertex.x = vertices[ offset ++ ] * scale; + vertex.y = vertices[ offset ++ ] * scale; + vertex.z = vertices[ offset ++ ] * scale; + + geometry.vertices.push( vertex ); + + } + + offset = 0; + zLength = faces.length; + + while ( offset < zLength ) { + + type = faces[ offset ++ ]; + + isQuad = isBitSet( type, 0 ); + hasMaterial = isBitSet( type, 1 ); + hasFaceVertexUv = isBitSet( type, 3 ); + hasFaceNormal = isBitSet( type, 4 ); + hasFaceVertexNormal = isBitSet( type, 5 ); + hasFaceColor = isBitSet( type, 6 ); + hasFaceVertexColor = isBitSet( type, 7 ); + + // console.log("type", type, "bits", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor); + + if ( isQuad ) { + + faceA = new Face3(); + faceA.a = faces[ offset ]; + faceA.b = faces[ offset + 1 ]; + faceA.c = faces[ offset + 3 ]; + + faceB = new Face3(); + faceB.a = faces[ offset + 1 ]; + faceB.b = faces[ offset + 2 ]; + faceB.c = faces[ offset + 3 ]; + + offset += 4; + + if ( hasMaterial ) { + + materialIndex = faces[ offset ++ ]; + faceA.materialIndex = materialIndex; + faceB.materialIndex = materialIndex; + + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length; + + if ( hasFaceVertexUv ) { + + for ( i = 0; i < nUvLayers; i ++ ) { + + uvLayer = json.uvs[ i ]; + + geometry.faceVertexUvs[ i ][ fi ] = []; + geometry.faceVertexUvs[ i ][ fi + 1 ] = []; + + for ( j = 0; j < 4; j ++ ) { + + uvIndex = faces[ offset ++ ]; + + u = uvLayer[ uvIndex * 2 ]; + v = uvLayer[ uvIndex * 2 + 1 ]; + + uv = new Vector2( u, v ); + + if ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv ); + if ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv ); + + } + + } + + } + + if ( hasFaceNormal ) { + + normalIndex = faces[ offset ++ ] * 3; + + faceA.normal.set( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + faceB.normal.copy( faceA.normal ); + + } + + if ( hasFaceVertexNormal ) { + + for ( i = 0; i < 4; i ++ ) { + + normalIndex = faces[ offset ++ ] * 3; + + normal = new Vector3( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + + if ( i !== 2 ) faceA.vertexNormals.push( normal ); + if ( i !== 0 ) faceB.vertexNormals.push( normal ); + + } + + } + + + if ( hasFaceColor ) { + + colorIndex = faces[ offset ++ ]; + hex = colors[ colorIndex ]; + + faceA.color.setHex( hex ); + faceB.color.setHex( hex ); + + } + + + if ( hasFaceVertexColor ) { + + for ( i = 0; i < 4; i ++ ) { + + colorIndex = faces[ offset ++ ]; + hex = colors[ colorIndex ]; + + if ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) ); + if ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) ); + + } + + } + + geometry.faces.push( faceA ); + geometry.faces.push( faceB ); + + } else { + + face = new Face3(); + face.a = faces[ offset ++ ]; + face.b = faces[ offset ++ ]; + face.c = faces[ offset ++ ]; + + if ( hasMaterial ) { + + materialIndex = faces[ offset ++ ]; + face.materialIndex = materialIndex; + + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length; + + if ( hasFaceVertexUv ) { + + for ( i = 0; i < nUvLayers; i ++ ) { + + uvLayer = json.uvs[ i ]; + + geometry.faceVertexUvs[ i ][ fi ] = []; + + for ( j = 0; j < 3; j ++ ) { + + uvIndex = faces[ offset ++ ]; + + u = uvLayer[ uvIndex * 2 ]; + v = uvLayer[ uvIndex * 2 + 1 ]; + + uv = new Vector2( u, v ); + + geometry.faceVertexUvs[ i ][ fi ].push( uv ); + + } + + } + + } + + if ( hasFaceNormal ) { + + normalIndex = faces[ offset ++ ] * 3; + + face.normal.set( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + } + + if ( hasFaceVertexNormal ) { + + for ( i = 0; i < 3; i ++ ) { + + normalIndex = faces[ offset ++ ] * 3; + + normal = new Vector3( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + face.vertexNormals.push( normal ); + + } + + } + + + if ( hasFaceColor ) { + + colorIndex = faces[ offset ++ ]; + face.color.setHex( colors[ colorIndex ] ); + + } + + + if ( hasFaceVertexColor ) { + + for ( i = 0; i < 3; i ++ ) { + + colorIndex = faces[ offset ++ ]; + face.vertexColors.push( new Color( colors[ colorIndex ] ) ); + + } + + } + + geometry.faces.push( face ); + + } + + } + + } + + function parseSkin( json, geometry ) { + + var influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2; + + if ( json.skinWeights ) { + + for ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) { + + var x = json.skinWeights[ i ]; + var y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0; + var z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0; + var w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0; + + geometry.skinWeights.push( new Vector4( x, y, z, w ) ); + + } + + } + + if ( json.skinIndices ) { + + for ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) { + + var a = json.skinIndices[ i ]; + var b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0; + var c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0; + var d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0; + + geometry.skinIndices.push( new Vector4( a, b, c, d ) ); + + } + + } + + geometry.bones = json.bones; + + if ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) { + + console.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' + + geometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' ); + + } + + } + + function parseMorphing( json, geometry ) { + + var scale = json.scale; + + if ( json.morphTargets !== undefined ) { + + for ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) { + + geometry.morphTargets[ i ] = {}; + geometry.morphTargets[ i ].name = json.morphTargets[ i ].name; + geometry.morphTargets[ i ].vertices = []; + + var dstVertices = geometry.morphTargets[ i ].vertices; + var srcVertices = json.morphTargets[ i ].vertices; + + for ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) { + + var vertex = new Vector3(); + vertex.x = srcVertices[ v ] * scale; + vertex.y = srcVertices[ v + 1 ] * scale; + vertex.z = srcVertices[ v + 2 ] * scale; + + dstVertices.push( vertex ); + + } + + } + + } + + if ( json.morphColors !== undefined && json.morphColors.length > 0 ) { + + console.warn( 'THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.' ); + + var faces = geometry.faces; + var morphColors = json.morphColors[ 0 ].colors; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + faces[ i ].color.fromArray( morphColors, i * 3 ); + + } + + } + + } + + function parseAnimations( json, geometry ) { + + var outputAnimations = []; + + // parse old style Bone/Hierarchy animations + var animations = []; + + if ( json.animation !== undefined ) { + + animations.push( json.animation ); + + } + + if ( json.animations !== undefined ) { + + if ( json.animations.length ) { + + animations = animations.concat( json.animations ); + + } else { + + animations.push( json.animations ); + + } + + } + + for ( var i = 0; i < animations.length; i ++ ) { + + var clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones ); + if ( clip ) outputAnimations.push( clip ); + + } + + // parse implicit morph animations + if ( geometry.morphTargets ) { + + // TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary. + var morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 ); + outputAnimations = outputAnimations.concat( morphAnimationClips ); + + } + + if ( outputAnimations.length > 0 ) geometry.animations = outputAnimations; + + } + + return function parse( json, path ) { + + if ( json.data !== undefined ) { + + // Geometry 4.0 spec + json = json.data; + + } + + if ( json.scale !== undefined ) { + + json.scale = 1.0 / json.scale; + + } else { + + json.scale = 1.0; + + } + + var geometry = new Geometry(); + + parseModel( json, geometry ); + parseSkin( json, geometry ); + parseMorphing( json, geometry ); + parseAnimations( json, geometry ); + + geometry.computeFaceNormals(); + geometry.computeBoundingSphere(); + + if ( json.materials === undefined || json.materials.length === 0 ) { + + return { geometry: geometry }; + + } else { + + var materials = Loader.prototype.initMaterials( json.materials, this.resourcePath || path, this.crossOrigin ); + + return { geometry: geometry, materials: materials }; + + } + + }; + + } )() + +} ); + + +export { JSONLoader }; diff --git a/lib/loaders/Loader.js b/lib/loaders/Loader.js new file mode 100644 index 0000000..d1c9726 --- /dev/null +++ b/lib/loaders/Loader.js @@ -0,0 +1,342 @@ +import { + NoBlending, + NormalBlending, + AdditiveBlending, + SubtractiveBlending, + MultiplyBlending, + CustomBlending, + + FaceColors, + VertexColors, + + DoubleSide, + BackSide, + + MirroredRepeatWrapping, + RepeatWrapping +} from '../constants.js'; +import { _Math } from '../math/Math.js'; +import { MaterialLoader } from './MaterialLoader.js'; +import { TextureLoader } from './TextureLoader.js'; +import { Color } from '../math/Color.js'; + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +function Loader() {} + +Loader.Handlers = { + + handlers: [], + + add: function ( regex, loader ) { + + this.handlers.push( regex, loader ); + + }, + + get: function ( file ) { + + var handlers = this.handlers; + + for ( var i = 0, l = handlers.length; i < l; i += 2 ) { + + var regex = handlers[ i ]; + var loader = handlers[ i + 1 ]; + + if ( regex.test( file ) ) { + + return loader; + + } + + } + + return null; + + } + +}; + +Object.assign( Loader.prototype, { + + crossOrigin: 'anonymous', + + onLoadStart: function () {}, + + onLoadProgress: function () {}, + + onLoadComplete: function () {}, + + initMaterials: function ( materials, texturePath, crossOrigin ) { + + var array = []; + + for ( var i = 0; i < materials.length; ++ i ) { + + array[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin ); + + } + + return array; + + }, + + createMaterial: ( function () { + + var BlendingMode = { + NoBlending: NoBlending, + NormalBlending: NormalBlending, + AdditiveBlending: AdditiveBlending, + SubtractiveBlending: SubtractiveBlending, + MultiplyBlending: MultiplyBlending, + CustomBlending: CustomBlending + }; + + var color = new Color(); + var textureLoader = new TextureLoader(); + var materialLoader = new MaterialLoader(); + + return function createMaterial( m, texturePath, crossOrigin ) { + + // convert from old material format + + var textures = {}; + + function loadTexture( path, repeat, offset, wrap, anisotropy ) { + + var fullPath = texturePath + path; + var loader = Loader.Handlers.get( fullPath ); + + var texture; + + if ( loader !== null ) { + + texture = loader.load( fullPath ); + + } else { + + textureLoader.setCrossOrigin( crossOrigin ); + texture = textureLoader.load( fullPath ); + + } + + if ( repeat !== undefined ) { + + texture.repeat.fromArray( repeat ); + + if ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping; + if ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping; + + } + + if ( offset !== undefined ) { + + texture.offset.fromArray( offset ); + + } + + if ( wrap !== undefined ) { + + if ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping; + if ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping; + + if ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping; + if ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping; + + } + + if ( anisotropy !== undefined ) { + + texture.anisotropy = anisotropy; + + } + + var uuid = _Math.generateUUID(); + + textures[ uuid ] = texture; + + return uuid; + + } + + // + + var json = { + uuid: _Math.generateUUID(), + type: 'MeshLambertMaterial' + }; + + for ( var name in m ) { + + var value = m[ name ]; + + switch ( name ) { + + case 'DbgColor': + case 'DbgIndex': + case 'opticalDensity': + case 'illumination': + break; + case 'DbgName': + json.name = value; + break; + case 'blending': + json.blending = BlendingMode[ value ]; + break; + case 'colorAmbient': + case 'mapAmbient': + console.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' ); + break; + case 'colorDiffuse': + json.color = color.fromArray( value ).getHex(); + break; + case 'colorSpecular': + json.specular = color.fromArray( value ).getHex(); + break; + case 'colorEmissive': + json.emissive = color.fromArray( value ).getHex(); + break; + case 'specularCoef': + json.shininess = value; + break; + case 'shading': + if ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial'; + if ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial'; + if ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial'; + break; + case 'mapDiffuse': + json.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy ); + break; + case 'mapDiffuseRepeat': + case 'mapDiffuseOffset': + case 'mapDiffuseWrap': + case 'mapDiffuseAnisotropy': + break; + case 'mapEmissive': + json.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy ); + break; + case 'mapEmissiveRepeat': + case 'mapEmissiveOffset': + case 'mapEmissiveWrap': + case 'mapEmissiveAnisotropy': + break; + case 'mapLight': + json.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy ); + break; + case 'mapLightRepeat': + case 'mapLightOffset': + case 'mapLightWrap': + case 'mapLightAnisotropy': + break; + case 'mapAO': + json.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy ); + break; + case 'mapAORepeat': + case 'mapAOOffset': + case 'mapAOWrap': + case 'mapAOAnisotropy': + break; + case 'mapBump': + json.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy ); + break; + case 'mapBumpScale': + json.bumpScale = value; + break; + case 'mapBumpRepeat': + case 'mapBumpOffset': + case 'mapBumpWrap': + case 'mapBumpAnisotropy': + break; + case 'mapNormal': + json.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy ); + break; + case 'mapNormalFactor': + json.normalScale = value; + break; + case 'mapNormalRepeat': + case 'mapNormalOffset': + case 'mapNormalWrap': + case 'mapNormalAnisotropy': + break; + case 'mapSpecular': + json.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy ); + break; + case 'mapSpecularRepeat': + case 'mapSpecularOffset': + case 'mapSpecularWrap': + case 'mapSpecularAnisotropy': + break; + case 'mapMetalness': + json.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy ); + break; + case 'mapMetalnessRepeat': + case 'mapMetalnessOffset': + case 'mapMetalnessWrap': + case 'mapMetalnessAnisotropy': + break; + case 'mapRoughness': + json.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy ); + break; + case 'mapRoughnessRepeat': + case 'mapRoughnessOffset': + case 'mapRoughnessWrap': + case 'mapRoughnessAnisotropy': + break; + case 'mapAlpha': + json.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy ); + break; + case 'mapAlphaRepeat': + case 'mapAlphaOffset': + case 'mapAlphaWrap': + case 'mapAlphaAnisotropy': + break; + case 'flipSided': + json.side = BackSide; + break; + case 'doubleSided': + json.side = DoubleSide; + break; + case 'transparency': + console.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' ); + json.opacity = value; + break; + case 'depthTest': + case 'depthWrite': + case 'colorWrite': + case 'opacity': + case 'reflectivity': + case 'transparent': + case 'visible': + case 'wireframe': + json[ name ] = value; + break; + case 'vertexColors': + if ( value === true ) json.vertexColors = VertexColors; + if ( value === 'face' ) json.vertexColors = FaceColors; + break; + default: + console.error( 'THREE.Loader.createMaterial: Unsupported', name, value ); + break; + + } + + } + + if ( json.type === 'MeshBasicMaterial' ) delete json.emissive; + if ( json.type !== 'MeshPhongMaterial' ) delete json.specular; + + if ( json.opacity < 1 ) json.transparent = true; + + materialLoader.setTextures( textures ); + + return materialLoader.parse( json ); + + }; + + } )() + +} ); + +export { Loader }; diff --git a/lib/loaders/LoaderUtils.js b/lib/loaders/LoaderUtils.js new file mode 100644 index 0000000..ba13d4b --- /dev/null +++ b/lib/loaders/LoaderUtils.js @@ -0,0 +1,44 @@ +/** + * @author Don McCurdy / https://www.donmccurdy.com + */ + +var LoaderUtils = { + + decodeText: function ( 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. + + var s = ''; + + for ( var i = 0, il = array.length; i < il; i ++ ) { + + // Implicitly assumes little-endian. + s += String.fromCharCode( array[ i ] ); + + } + + // Merges multi-byte utf-8 characters. + return decodeURIComponent( escape( s ) ); + + }, + + extractUrlBase: function ( url ) { + + var index = url.lastIndexOf( '/' ); + + if ( index === - 1 ) return './'; + + return url.substr( 0, index + 1 ); + + } + +}; + +export { LoaderUtils }; diff --git a/lib/loaders/LoadingManager.js b/lib/loaders/LoadingManager.js new file mode 100644 index 0000000..07a0cd6 --- /dev/null +++ b/lib/loaders/LoadingManager.js @@ -0,0 +1,98 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function LoadingManager( onLoad, onProgress, onError ) { + + var scope = this; + + var isLoading = false; + var itemsLoaded = 0; + var itemsTotal = 0; + var urlModifier = undefined; + + // Refer to #5689 for the reason why we don't set .onStart + // in the constructor + + this.onStart = undefined; + this.onLoad = onLoad; + this.onProgress = onProgress; + this.onError = onError; + + this.itemStart = function ( url ) { + + itemsTotal ++; + + if ( isLoading === false ) { + + if ( scope.onStart !== undefined ) { + + scope.onStart( url, itemsLoaded, itemsTotal ); + + } + + } + + isLoading = true; + + }; + + this.itemEnd = function ( url ) { + + itemsLoaded ++; + + if ( scope.onProgress !== undefined ) { + + scope.onProgress( url, itemsLoaded, itemsTotal ); + + } + + if ( itemsLoaded === itemsTotal ) { + + isLoading = false; + + if ( scope.onLoad !== undefined ) { + + scope.onLoad(); + + } + + } + + }; + + this.itemError = function ( url ) { + + if ( scope.onError !== undefined ) { + + scope.onError( url ); + + } + + }; + + this.resolveURL = function ( url ) { + + if ( urlModifier ) { + + return urlModifier( url ); + + } + + return url; + + }; + + this.setURLModifier = function ( transform ) { + + urlModifier = transform; + return this; + + }; + +} + +var DefaultLoadingManager = new LoadingManager(); + + +export { DefaultLoadingManager, LoadingManager }; diff --git a/lib/loaders/MaterialLoader.js b/lib/loaders/MaterialLoader.js new file mode 100644 index 0000000..fbd7540 --- /dev/null +++ b/lib/loaders/MaterialLoader.js @@ -0,0 +1,236 @@ +import { Color } from '../math/Color.js'; +import { Vector2 } from '../math/Vector2.js'; +import { Vector3 } from '../math/Vector3.js'; +import { Vector4 } from '../math/Vector4.js'; +import { Matrix4 } from '../math/Matrix4.js'; +import { FileLoader } from './FileLoader.js'; +import { DefaultLoadingManager } from './LoadingManager.js'; +import * as Materials from '../materials/Materials.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function MaterialLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + this.textures = {}; + +} + +Object.assign( MaterialLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.setPath( scope.path ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + var textures = this.textures; + + function getTexture( name ) { + + if ( textures[ name ] === undefined ) { + + console.warn( 'THREE.MaterialLoader: Undefined texture', name ); + + } + + return textures[ name ]; + + } + + var material = new Materials[ json.type ](); + + if ( json.uuid !== undefined ) material.uuid = json.uuid; + if ( json.name !== undefined ) material.name = json.name; + if ( json.color !== undefined ) material.color.setHex( json.color ); + if ( json.roughness !== undefined ) material.roughness = json.roughness; + if ( json.metalness !== undefined ) material.metalness = json.metalness; + if ( json.emissive !== undefined ) material.emissive.setHex( json.emissive ); + if ( json.specular !== undefined ) material.specular.setHex( json.specular ); + if ( json.shininess !== undefined ) material.shininess = json.shininess; + if ( json.clearCoat !== undefined ) material.clearCoat = json.clearCoat; + if ( json.clearCoatRoughness !== undefined ) material.clearCoatRoughness = json.clearCoatRoughness; + if ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors; + if ( json.fog !== undefined ) material.fog = json.fog; + if ( json.flatShading !== undefined ) material.flatShading = json.flatShading; + if ( json.blending !== undefined ) material.blending = json.blending; + if ( json.combine !== undefined ) material.combine = json.combine; + if ( json.side !== undefined ) material.side = json.side; + if ( json.opacity !== undefined ) material.opacity = json.opacity; + if ( json.transparent !== undefined ) material.transparent = json.transparent; + if ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest; + if ( json.depthTest !== undefined ) material.depthTest = json.depthTest; + if ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite; + if ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite; + if ( json.wireframe !== undefined ) material.wireframe = json.wireframe; + if ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth; + if ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap; + if ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin; + + if ( json.rotation !== undefined ) material.rotation = json.rotation; + + if ( json.linewidth !== 1 ) material.linewidth = json.linewidth; + if ( json.dashSize !== undefined ) material.dashSize = json.dashSize; + if ( json.gapSize !== undefined ) material.gapSize = json.gapSize; + if ( json.scale !== undefined ) material.scale = json.scale; + + if ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset; + if ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor; + if ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits; + + if ( json.skinning !== undefined ) material.skinning = json.skinning; + if ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets; + if ( json.dithering !== undefined ) material.dithering = json.dithering; + + if ( json.visible !== undefined ) material.visible = json.visible; + if ( json.userData !== undefined ) material.userData = json.userData; + + // Shader Material + + if ( json.uniforms !== undefined ) { + + for ( var name in json.uniforms ) { + + var uniform = json.uniforms[ name ]; + + material.uniforms[ name ] = {}; + + switch ( uniform.type ) { + + case 't': + material.uniforms[ name ].value = getTexture( uniform.value ); + break; + + case 'c': + material.uniforms[ name ].value = new Color().setHex( uniform.value ); + break; + + case 'v2': + material.uniforms[ name ].value = new Vector2().fromArray( uniform.value ); + break; + + case 'v3': + material.uniforms[ name ].value = new Vector3().fromArray( uniform.value ); + break; + + case 'v4': + material.uniforms[ name ].value = new Vector4().fromArray( uniform.value ); + break; + + case 'm4': + material.uniforms[ name ].value = new Matrix4().fromArray( uniform.value ); + break; + + default: + material.uniforms[ name ].value = uniform.value; + + } + + } + + } + + if ( json.defines !== undefined ) material.defines = json.defines; + if ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader; + if ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader; + + // Deprecated + + if ( json.shading !== undefined ) material.flatShading = json.shading === 1; // THREE.FlatShading + + // for PointsMaterial + + if ( json.size !== undefined ) material.size = json.size; + if ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation; + + // maps + + if ( json.map !== undefined ) material.map = getTexture( json.map ); + + if ( json.alphaMap !== undefined ) { + + material.alphaMap = getTexture( json.alphaMap ); + material.transparent = true; + + } + + if ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap ); + if ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale; + + if ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap ); + if ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType; + if ( json.normalScale !== undefined ) { + + var normalScale = json.normalScale; + + if ( Array.isArray( normalScale ) === false ) { + + // Blender exporter used to export a scalar. See #7459 + + normalScale = [ normalScale, normalScale ]; + + } + + material.normalScale = new Vector2().fromArray( normalScale ); + + } + + if ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap ); + if ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale; + if ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias; + + if ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap ); + if ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap ); + + if ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap ); + if ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity; + + if ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap ); + + if ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap ); + if ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity; + + if ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity; + + if ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap ); + if ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity; + + if ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap ); + if ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity; + + if ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap ); + + return material; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + }, + + setTextures: function ( value ) { + + this.textures = value; + return this; + + } + +} ); + + +export { MaterialLoader }; diff --git a/lib/loaders/ObjectLoader.js b/lib/loaders/ObjectLoader.js new file mode 100644 index 0000000..b951a64 --- /dev/null +++ b/lib/loaders/ObjectLoader.js @@ -0,0 +1,978 @@ +import { + UVMapping, + CubeReflectionMapping, + CubeRefractionMapping, + EquirectangularReflectionMapping, + EquirectangularRefractionMapping, + SphericalReflectionMapping, + CubeUVReflectionMapping, + CubeUVRefractionMapping, + + RepeatWrapping, + ClampToEdgeWrapping, + MirroredRepeatWrapping, + + NearestFilter, + NearestMipMapNearestFilter, + NearestMipMapLinearFilter, + LinearFilter, + LinearMipMapNearestFilter, + LinearMipMapLinearFilter +} from '../constants.js'; +import { Color } from '../math/Color.js'; +import { Object3D } from '../core/Object3D.js'; +import { Group } from '../objects/Group.js'; +import { Sprite } from '../objects/Sprite.js'; +import { Points } from '../objects/Points.js'; +import { Line } from '../objects/Line.js'; +import { LineLoop } from '../objects/LineLoop.js'; +import { LineSegments } from '../objects/LineSegments.js'; +import { LOD } from '../objects/LOD.js'; +import { Mesh } from '../objects/Mesh.js'; +import { SkinnedMesh } from '../objects/SkinnedMesh.js'; +import { Shape } from '../extras/core/Shape.js'; +import { Fog } from '../scenes/Fog.js'; +import { FogExp2 } from '../scenes/FogExp2.js'; +import { HemisphereLight } from '../lights/HemisphereLight.js'; +import { SpotLight } from '../lights/SpotLight.js'; +import { PointLight } from '../lights/PointLight.js'; +import { DirectionalLight } from '../lights/DirectionalLight.js'; +import { AmbientLight } from '../lights/AmbientLight.js'; +import { RectAreaLight } from '../lights/RectAreaLight.js'; +import { OrthographicCamera } from '../cameras/OrthographicCamera.js'; +import { PerspectiveCamera } from '../cameras/PerspectiveCamera.js'; +import { Scene } from '../scenes/Scene.js'; +import { CubeTexture } from '../textures/CubeTexture.js'; +import { Texture } from '../textures/Texture.js'; +import { ImageLoader } from './ImageLoader.js'; +import { LoadingManager, DefaultLoadingManager } from './LoadingManager.js'; +import { AnimationClip } from '../animation/AnimationClip.js'; +import { MaterialLoader } from './MaterialLoader.js'; +import { LoaderUtils } from './LoaderUtils.js'; +import { BufferGeometryLoader } from './BufferGeometryLoader.js'; +import { JSONLoader } from './JSONLoader.js'; +import { FileLoader } from './FileLoader.js'; +import * as Geometries from '../geometries/Geometries.js'; +import * as Curves from '../extras/curves/Curves.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function ObjectLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + this.resourcePath = ''; + +} + +Object.assign( ObjectLoader.prototype, { + + crossOrigin: 'anonymous', + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var path = ( this.path === undefined ) ? LoaderUtils.extractUrlBase( url ) : this.path; + this.resourcePath = this.resourcePath || path; + + var loader = new FileLoader( scope.manager ); + loader.setPath( this.path ); + loader.load( url, function ( text ) { + + var json = null; + + try { + + json = JSON.parse( text ); + + } catch ( error ) { + + if ( onError !== undefined ) onError( error ); + + console.error( 'THREE:ObjectLoader: Can\'t parse ' + url + '.', error.message ); + + return; + + } + + var metadata = json.metadata; + + if ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) { + + console.error( 'THREE.ObjectLoader: Can\'t load ' + url + '. Use THREE.JSONLoader instead.' ); + return; + + } + + scope.parse( json, onLoad ); + + }, onProgress, onError ); + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + }, + + setResourcePath: function ( value ) { + + this.resourcePath = value; + return this; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + parse: function ( json, onLoad ) { + + var shapes = this.parseShape( json.shapes ); + var geometries = this.parseGeometries( json.geometries, shapes ); + + var images = this.parseImages( json.images, function () { + + if ( onLoad !== undefined ) onLoad( object ); + + } ); + + var textures = this.parseTextures( json.textures, images ); + var materials = this.parseMaterials( json.materials, textures ); + + var object = this.parseObject( json.object, geometries, materials ); + + if ( json.animations ) { + + object.animations = this.parseAnimations( json.animations ); + + } + + if ( json.images === undefined || json.images.length === 0 ) { + + if ( onLoad !== undefined ) onLoad( object ); + + } + + return object; + + }, + + parseShape: function ( json ) { + + var shapes = {}; + + if ( json !== undefined ) { + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var shape = new Shape().fromJSON( json[ i ] ); + + shapes[ shape.uuid ] = shape; + + } + + } + + return shapes; + + }, + + parseGeometries: function ( json, shapes ) { + + var geometries = {}; + + if ( json !== undefined ) { + + var geometryLoader = new JSONLoader(); + var bufferGeometryLoader = new BufferGeometryLoader(); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var geometry; + var data = json[ i ]; + + switch ( data.type ) { + + case 'PlaneGeometry': + case 'PlaneBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.width, + data.height, + data.widthSegments, + data.heightSegments + ); + + break; + + case 'BoxGeometry': + case 'BoxBufferGeometry': + case 'CubeGeometry': // backwards compatible + + geometry = new Geometries[ data.type ]( + data.width, + data.height, + data.depth, + data.widthSegments, + data.heightSegments, + data.depthSegments + ); + + break; + + case 'CircleGeometry': + case 'CircleBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.segments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'CylinderGeometry': + case 'CylinderBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radiusTop, + data.radiusBottom, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'ConeGeometry': + case 'ConeBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'SphereGeometry': + case 'SphereBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.widthSegments, + data.heightSegments, + data.phiStart, + data.phiLength, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'DodecahedronGeometry': + case 'DodecahedronBufferGeometry': + case 'IcosahedronGeometry': + case 'IcosahedronBufferGeometry': + case 'OctahedronGeometry': + case 'OctahedronBufferGeometry': + case 'TetrahedronGeometry': + case 'TetrahedronBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.detail + ); + + break; + + case 'RingGeometry': + case 'RingBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.innerRadius, + data.outerRadius, + data.thetaSegments, + data.phiSegments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'TorusGeometry': + case 'TorusBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.tube, + data.radialSegments, + data.tubularSegments, + data.arc + ); + + break; + + case 'TorusKnotGeometry': + case 'TorusKnotBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.tube, + data.tubularSegments, + data.radialSegments, + data.p, + data.q + ); + + break; + + case 'LatheGeometry': + case 'LatheBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.points, + data.segments, + data.phiStart, + data.phiLength + ); + + break; + + case 'PolyhedronGeometry': + case 'PolyhedronBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.vertices, + data.indices, + data.radius, + data.details + ); + + break; + + case 'ShapeGeometry': + case 'ShapeBufferGeometry': + + var geometryShapes = []; + + for ( var j = 0, jl = data.shapes.length; j < jl; j ++ ) { + + var shape = shapes[ data.shapes[ j ] ]; + + geometryShapes.push( shape ); + + } + + geometry = new Geometries[ data.type ]( + geometryShapes, + data.curveSegments + ); + + break; + + + case 'ExtrudeGeometry': + case 'ExtrudeBufferGeometry': + + var geometryShapes = []; + + for ( var j = 0, jl = data.shapes.length; j < jl; j ++ ) { + + var shape = shapes[ data.shapes[ j ] ]; + + geometryShapes.push( shape ); + + } + + var extrudePath = data.options.extrudePath; + + if ( extrudePath !== undefined ) { + + data.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath ); + + } + + geometry = new Geometries[ data.type ]( + geometryShapes, + data.options + ); + + break; + + case 'BufferGeometry': + + geometry = bufferGeometryLoader.parse( data ); + + break; + + case 'Geometry': + + geometry = geometryLoader.parse( data, this.resourcePath ).geometry; + + break; + + default: + + console.warn( 'THREE.ObjectLoader: Unsupported geometry type "' + data.type + '"' ); + + continue; + + } + + geometry.uuid = data.uuid; + + if ( data.name !== undefined ) geometry.name = data.name; + if ( geometry.isBufferGeometry === true && data.userData !== undefined ) geometry.userData = data.userData; + + geometries[ data.uuid ] = geometry; + + } + + } + + return geometries; + + }, + + parseMaterials: function ( json, textures ) { + + var materials = {}; + + if ( json !== undefined ) { + + var loader = new MaterialLoader(); + loader.setTextures( textures ); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var data = json[ i ]; + + if ( data.type === 'MultiMaterial' ) { + + // Deprecated + + var array = []; + + for ( var j = 0; j < data.materials.length; j ++ ) { + + array.push( loader.parse( data.materials[ j ] ) ); + + } + + materials[ data.uuid ] = array; + + } else { + + materials[ data.uuid ] = loader.parse( data ); + + } + + } + + } + + return materials; + + }, + + parseAnimations: function ( json ) { + + var animations = []; + + for ( var i = 0; i < json.length; i ++ ) { + + var data = json[ i ]; + + var clip = AnimationClip.parse( data ); + + if ( data.uuid !== undefined ) clip.uuid = data.uuid; + + animations.push( clip ); + + } + + return animations; + + }, + + parseImages: function ( json, onLoad ) { + + var scope = this; + var images = {}; + + function loadImage( url ) { + + scope.manager.itemStart( url ); + + return loader.load( url, function () { + + scope.manager.itemEnd( url ); + + }, undefined, function () { + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + } ); + + } + + if ( json !== undefined && json.length > 0 ) { + + var manager = new LoadingManager( onLoad ); + + var loader = new ImageLoader( manager ); + loader.setCrossOrigin( this.crossOrigin ); + + for ( var i = 0, il = json.length; i < il; i ++ ) { + + var image = json[ i ]; + var url = image.url; + + if ( Array.isArray( url ) ) { + + // load array of images e.g CubeTexture + + images[ image.uuid ] = []; + + for ( var j = 0, jl = url.length; j < jl; j ++ ) { + + var currentUrl = url[ j ]; + + var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( currentUrl ) ? currentUrl : scope.resourcePath + currentUrl; + + images[ image.uuid ].push( loadImage( path ) ); + + } + + } else { + + // load single image + + var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( image.url ) ? image.url : scope.resourcePath + image.url; + + images[ image.uuid ] = loadImage( path ); + + } + + } + + } + + return images; + + }, + + parseTextures: function ( json, images ) { + + function parseConstant( value, type ) { + + if ( typeof value === 'number' ) return value; + + console.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value ); + + return type[ value ]; + + } + + var textures = {}; + + if ( json !== undefined ) { + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var data = json[ i ]; + + if ( data.image === undefined ) { + + console.warn( 'THREE.ObjectLoader: No "image" specified for', data.uuid ); + + } + + if ( images[ data.image ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined image', data.image ); + + } + + var texture; + + if ( Array.isArray( images[ data.image ] ) ) { + + texture = new CubeTexture( images[ data.image ] ); + + } else { + + texture = new Texture( images[ data.image ] ); + + } + + texture.needsUpdate = true; + + texture.uuid = data.uuid; + + if ( data.name !== undefined ) texture.name = data.name; + + if ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING ); + + if ( data.offset !== undefined ) texture.offset.fromArray( data.offset ); + if ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat ); + if ( data.center !== undefined ) texture.center.fromArray( data.center ); + if ( data.rotation !== undefined ) texture.rotation = data.rotation; + + if ( data.wrap !== undefined ) { + + texture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING ); + texture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING ); + + } + + if ( data.format !== undefined ) texture.format = data.format; + + if ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER ); + if ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER ); + if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy; + + if ( data.flipY !== undefined ) texture.flipY = data.flipY; + + textures[ data.uuid ] = texture; + + } + + } + + return textures; + + }, + + parseObject: function ( data, geometries, materials ) { + + var object; + + function getGeometry( name ) { + + if ( geometries[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined geometry', name ); + + } + + return geometries[ name ]; + + } + + function getMaterial( name ) { + + if ( name === undefined ) return undefined; + + if ( Array.isArray( name ) ) { + + var array = []; + + for ( var i = 0, l = name.length; i < l; i ++ ) { + + var uuid = name[ i ]; + + if ( materials[ uuid ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', uuid ); + + } + + array.push( materials[ uuid ] ); + + } + + return array; + + } + + if ( materials[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', name ); + + } + + return materials[ name ]; + + } + + switch ( data.type ) { + + case 'Scene': + + object = new Scene(); + + if ( data.background !== undefined ) { + + if ( Number.isInteger( data.background ) ) { + + object.background = new Color( data.background ); + + } + + } + + if ( data.fog !== undefined ) { + + if ( data.fog.type === 'Fog' ) { + + object.fog = new Fog( data.fog.color, data.fog.near, data.fog.far ); + + } else if ( data.fog.type === 'FogExp2' ) { + + object.fog = new FogExp2( data.fog.color, data.fog.density ); + + } + + } + + break; + + case 'PerspectiveCamera': + + object = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far ); + + if ( data.focus !== undefined ) object.focus = data.focus; + if ( data.zoom !== undefined ) object.zoom = data.zoom; + if ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge; + if ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset; + if ( data.view !== undefined ) object.view = Object.assign( {}, data.view ); + + break; + + case 'OrthographicCamera': + + object = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far ); + + if ( data.zoom !== undefined ) object.zoom = data.zoom; + if ( data.view !== undefined ) object.view = Object.assign( {}, data.view ); + + break; + + case 'AmbientLight': + + object = new AmbientLight( data.color, data.intensity ); + + break; + + case 'DirectionalLight': + + object = new DirectionalLight( data.color, data.intensity ); + + break; + + case 'PointLight': + + object = new PointLight( data.color, data.intensity, data.distance, data.decay ); + + break; + + case 'RectAreaLight': + + object = new RectAreaLight( data.color, data.intensity, data.width, data.height ); + + break; + + case 'SpotLight': + + object = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay ); + + break; + + case 'HemisphereLight': + + object = new HemisphereLight( data.color, data.groundColor, data.intensity ); + + break; + + case 'SkinnedMesh': + + console.warn( 'THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.' ); + + case 'Mesh': + + var geometry = getGeometry( data.geometry ); + var material = getMaterial( data.material ); + + if ( geometry.bones && geometry.bones.length > 0 ) { + + object = new SkinnedMesh( geometry, material ); + + } else { + + object = new Mesh( geometry, material ); + + } + + break; + + case 'LOD': + + object = new LOD(); + + break; + + case 'Line': + + object = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode ); + + break; + + case 'LineLoop': + + object = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'LineSegments': + + object = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'PointCloud': + case 'Points': + + object = new Points( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'Sprite': + + object = new Sprite( getMaterial( data.material ) ); + + break; + + case 'Group': + + object = new Group(); + + break; + + default: + + object = new Object3D(); + + } + + object.uuid = data.uuid; + + if ( data.name !== undefined ) object.name = data.name; + + if ( data.matrix !== undefined ) { + + object.matrix.fromArray( data.matrix ); + + if ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate; + if ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale ); + + } else { + + if ( data.position !== undefined ) object.position.fromArray( data.position ); + if ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation ); + if ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion ); + if ( data.scale !== undefined ) object.scale.fromArray( data.scale ); + + } + + if ( data.castShadow !== undefined ) object.castShadow = data.castShadow; + if ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow; + + if ( data.shadow ) { + + if ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias; + if ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius; + if ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize ); + if ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera ); + + } + + if ( data.visible !== undefined ) object.visible = data.visible; + if ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled; + if ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder; + if ( data.userData !== undefined ) object.userData = data.userData; + if ( data.layers !== undefined ) object.layers.mask = data.layers; + + if ( data.children !== undefined ) { + + var children = data.children; + + for ( var i = 0; i < children.length; i ++ ) { + + object.add( this.parseObject( children[ i ], geometries, materials ) ); + + } + + } + + if ( data.type === 'LOD' ) { + + var levels = data.levels; + + for ( var l = 0; l < levels.length; l ++ ) { + + var level = levels[ l ]; + var child = object.getObjectByProperty( 'uuid', level.object ); + + if ( child !== undefined ) { + + object.addLevel( child, level.distance ); + + } + + } + + } + + return object; + + } + +} ); + +var TEXTURE_MAPPING = { + UVMapping: UVMapping, + CubeReflectionMapping: CubeReflectionMapping, + CubeRefractionMapping: CubeRefractionMapping, + EquirectangularReflectionMapping: EquirectangularReflectionMapping, + EquirectangularRefractionMapping: EquirectangularRefractionMapping, + SphericalReflectionMapping: SphericalReflectionMapping, + CubeUVReflectionMapping: CubeUVReflectionMapping, + CubeUVRefractionMapping: CubeUVRefractionMapping +}; + +var TEXTURE_WRAPPING = { + RepeatWrapping: RepeatWrapping, + ClampToEdgeWrapping: ClampToEdgeWrapping, + MirroredRepeatWrapping: MirroredRepeatWrapping +}; + +var TEXTURE_FILTER = { + NearestFilter: NearestFilter, + NearestMipMapNearestFilter: NearestMipMapNearestFilter, + NearestMipMapLinearFilter: NearestMipMapLinearFilter, + LinearFilter: LinearFilter, + LinearMipMapNearestFilter: LinearMipMapNearestFilter, + LinearMipMapLinearFilter: LinearMipMapLinearFilter +}; + + +export { ObjectLoader }; diff --git a/lib/loaders/TextureLoader.js b/lib/loaders/TextureLoader.js new file mode 100644 index 0000000..385d541 --- /dev/null +++ b/lib/loaders/TextureLoader.js @@ -0,0 +1,68 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { RGBAFormat, RGBFormat } from '../constants.js'; +import { ImageLoader } from './ImageLoader.js'; +import { Texture } from '../textures/Texture.js'; +import { DefaultLoadingManager } from './LoadingManager.js'; + + +function TextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + +} + +Object.assign( TextureLoader.prototype, { + + crossOrigin: 'anonymous', + + load: function ( url, onLoad, onProgress, onError ) { + + var texture = new Texture(); + + var loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setPath( this.path ); + + loader.load( url, function ( image ) { + + texture.image = image; + + // JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB. + var isJPEG = url.search( /\.jpe?g$/i ) > 0 || url.search( /^data\:image\/jpeg/ ) === 0; + + texture.format = isJPEG ? RGBFormat : RGBAFormat; + texture.needsUpdate = true; + + if ( onLoad !== undefined ) { + + onLoad( texture ); + + } + + }, onProgress, onError ); + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + +} ); + + +export { TextureLoader }; diff --git a/lib/materials/LineBasicMaterial.js b/lib/materials/LineBasicMaterial.js new file mode 100644 index 0000000..56463ac --- /dev/null +++ b/lib/materials/LineBasicMaterial.js @@ -0,0 +1,56 @@ +import { Material } from './Material.js'; +import { Color } from '../math/Color.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * linewidth: , + * linecap: "round", + * linejoin: "round" + * } + */ + +function LineBasicMaterial( parameters ) { + + Material.call( this ); + + this.type = 'LineBasicMaterial'; + + this.color = new Color( 0xffffff ); + + this.linewidth = 1; + this.linecap = 'round'; + this.linejoin = 'round'; + + this.lights = false; + + this.setValues( parameters ); + +} + +LineBasicMaterial.prototype = Object.create( Material.prototype ); +LineBasicMaterial.prototype.constructor = LineBasicMaterial; + +LineBasicMaterial.prototype.isLineBasicMaterial = true; + +LineBasicMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.linewidth = source.linewidth; + this.linecap = source.linecap; + this.linejoin = source.linejoin; + + return this; + +}; + + +export { LineBasicMaterial }; diff --git a/lib/materials/LineDashedMaterial.js b/lib/materials/LineDashedMaterial.js new file mode 100644 index 0000000..9fc30d4 --- /dev/null +++ b/lib/materials/LineDashedMaterial.js @@ -0,0 +1,50 @@ +/** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * linewidth: , + * + * scale: , + * dashSize: , + * gapSize: + * } + */ + +import { LineBasicMaterial } from './LineBasicMaterial.js'; + +function LineDashedMaterial( parameters ) { + + LineBasicMaterial.call( this ); + + this.type = 'LineDashedMaterial'; + + this.scale = 1; + this.dashSize = 3; + this.gapSize = 1; + + this.setValues( parameters ); + +} + +LineDashedMaterial.prototype = Object.create( LineBasicMaterial.prototype ); +LineDashedMaterial.prototype.constructor = LineDashedMaterial; + +LineDashedMaterial.prototype.isLineDashedMaterial = true; + +LineDashedMaterial.prototype.copy = function ( source ) { + + LineBasicMaterial.prototype.copy.call( this, source ); + + this.scale = source.scale; + this.dashSize = source.dashSize; + this.gapSize = source.gapSize; + + return this; + +}; + + +export { LineDashedMaterial }; diff --git a/lib/materials/Material.js b/lib/materials/Material.js new file mode 100644 index 0000000..b099f37 --- /dev/null +++ b/lib/materials/Material.js @@ -0,0 +1,381 @@ +import { EventDispatcher } from '../core/EventDispatcher.js'; +import { NoColors, FrontSide, FlatShading, NormalBlending, LessEqualDepth, AddEquation, OneMinusSrcAlphaFactor, SrcAlphaFactor } from '../constants.js'; +import { _Math } from '../math/Math.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +var materialId = 0; + +function Material() { + + Object.defineProperty( this, 'id', { value: materialId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Material'; + + this.fog = true; + this.lights = true; + + this.blending = NormalBlending; + this.side = FrontSide; + this.flatShading = false; + this.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors + + this.opacity = 1; + this.transparent = false; + + this.blendSrc = SrcAlphaFactor; + this.blendDst = OneMinusSrcAlphaFactor; + this.blendEquation = AddEquation; + this.blendSrcAlpha = null; + this.blendDstAlpha = null; + this.blendEquationAlpha = null; + + this.depthFunc = LessEqualDepth; + this.depthTest = true; + this.depthWrite = true; + + this.clippingPlanes = null; + this.clipIntersection = false; + this.clipShadows = false; + + this.shadowSide = null; + + this.colorWrite = true; + + this.precision = null; // override the renderer's default precision for this material + + this.polygonOffset = false; + this.polygonOffsetFactor = 0; + this.polygonOffsetUnits = 0; + + this.dithering = false; + + this.alphaTest = 0; + this.premultipliedAlpha = false; + + this.visible = true; + + this.userData = {}; + + this.needsUpdate = true; + +} + +Material.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: Material, + + isMaterial: true, + + onBeforeCompile: function () {}, + + setValues: function ( values ) { + + if ( values === undefined ) return; + + for ( var key in values ) { + + var newValue = values[ key ]; + + if ( newValue === undefined ) { + + console.warn( "THREE.Material: '" + key + "' parameter is undefined." ); + continue; + + } + + // for backward compatability if shading is set in the constructor + if ( key === 'shading' ) { + + console.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' ); + this.flatShading = ( newValue === FlatShading ) ? true : false; + continue; + + } + + var currentValue = this[ key ]; + + if ( currentValue === undefined ) { + + console.warn( "THREE." + this.type + ": '" + key + "' is not a property of this material." ); + continue; + + } + + if ( currentValue && currentValue.isColor ) { + + currentValue.set( newValue ); + + } else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) { + + currentValue.copy( newValue ); + + } else { + + this[ key ] = newValue; + + } + + } + + }, + + toJSON: function ( meta ) { + + var isRoot = ( meta === undefined || typeof meta === 'string' ); + + if ( isRoot ) { + + meta = { + textures: {}, + images: {} + }; + + } + + var data = { + metadata: { + version: 4.5, + type: 'Material', + generator: 'Material.toJSON' + } + }; + + // standard Material serialization + data.uuid = this.uuid; + data.type = this.type; + + if ( this.name !== '' ) data.name = this.name; + + if ( this.color && this.color.isColor ) data.color = this.color.getHex(); + + if ( this.roughness !== undefined ) data.roughness = this.roughness; + if ( this.metalness !== undefined ) data.metalness = this.metalness; + + if ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex(); + if ( this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity; + + if ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex(); + if ( this.shininess !== undefined ) data.shininess = this.shininess; + if ( this.clearCoat !== undefined ) data.clearCoat = this.clearCoat; + if ( this.clearCoatRoughness !== undefined ) data.clearCoatRoughness = this.clearCoatRoughness; + + if ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid; + if ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid; + if ( this.lightMap && this.lightMap.isTexture ) data.lightMap = this.lightMap.toJSON( meta ).uuid; + + if ( this.aoMap && this.aoMap.isTexture ) { + + data.aoMap = this.aoMap.toJSON( meta ).uuid; + data.aoMapIntensity = this.aoMapIntensity; + + } + + if ( this.bumpMap && this.bumpMap.isTexture ) { + + data.bumpMap = this.bumpMap.toJSON( meta ).uuid; + data.bumpScale = this.bumpScale; + + } + + if ( this.normalMap && this.normalMap.isTexture ) { + + data.normalMap = this.normalMap.toJSON( meta ).uuid; + data.normalMapType = this.normalMapType; + data.normalScale = this.normalScale.toArray(); + + } + + if ( this.displacementMap && this.displacementMap.isTexture ) { + + data.displacementMap = this.displacementMap.toJSON( meta ).uuid; + data.displacementScale = this.displacementScale; + data.displacementBias = this.displacementBias; + + } + + if ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid; + if ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid; + + if ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid; + if ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid; + + if ( this.envMap && this.envMap.isTexture ) { + + data.envMap = this.envMap.toJSON( meta ).uuid; + data.reflectivity = this.reflectivity; // Scale behind envMap + + if ( this.combine !== undefined ) data.combine = this.combine; + if ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity; + + } + + if ( this.gradientMap && this.gradientMap.isTexture ) { + + data.gradientMap = this.gradientMap.toJSON( meta ).uuid; + + } + + if ( this.size !== undefined ) data.size = this.size; + if ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation; + + if ( this.blending !== NormalBlending ) data.blending = this.blending; + if ( this.flatShading === true ) data.flatShading = this.flatShading; + if ( this.side !== FrontSide ) data.side = this.side; + if ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors; + + if ( this.opacity < 1 ) data.opacity = this.opacity; + if ( this.transparent === true ) data.transparent = this.transparent; + + data.depthFunc = this.depthFunc; + data.depthTest = this.depthTest; + data.depthWrite = this.depthWrite; + + // rotation (SpriteMaterial) + if ( this.rotation !== 0 ) data.rotation = this.rotation; + + if ( this.polygonOffset === true ) data.polygonOffset = true; + if ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor; + if ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits; + + if ( this.linewidth !== 1 ) data.linewidth = this.linewidth; + if ( this.dashSize !== undefined ) data.dashSize = this.dashSize; + if ( this.gapSize !== undefined ) data.gapSize = this.gapSize; + if ( this.scale !== undefined ) data.scale = this.scale; + + if ( this.dithering === true ) data.dithering = true; + + if ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest; + if ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha; + + if ( this.wireframe === true ) data.wireframe = this.wireframe; + if ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth; + if ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap; + if ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin; + + if ( this.morphTargets === true ) data.morphTargets = true; + if ( this.skinning === true ) data.skinning = true; + + if ( this.visible === false ) data.visible = false; + if ( JSON.stringify( this.userData ) !== '{}' ) data.userData = this.userData; + + // TODO: Copied from Object3D.toJSON + + function extractFromCache( cache ) { + + var values = []; + + for ( var key in cache ) { + + var data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + + return values; + + } + + if ( isRoot ) { + + var textures = extractFromCache( meta.textures ); + var images = extractFromCache( meta.images ); + + if ( textures.length > 0 ) data.textures = textures; + if ( images.length > 0 ) data.images = images; + + } + + return data; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.name = source.name; + + this.fog = source.fog; + this.lights = source.lights; + + this.blending = source.blending; + this.side = source.side; + this.flatShading = source.flatShading; + this.vertexColors = source.vertexColors; + + this.opacity = source.opacity; + this.transparent = source.transparent; + + 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.depthFunc = source.depthFunc; + this.depthTest = source.depthTest; + this.depthWrite = source.depthWrite; + + this.colorWrite = source.colorWrite; + + this.precision = source.precision; + + this.polygonOffset = source.polygonOffset; + this.polygonOffsetFactor = source.polygonOffsetFactor; + this.polygonOffsetUnits = source.polygonOffsetUnits; + + this.dithering = source.dithering; + + this.alphaTest = source.alphaTest; + this.premultipliedAlpha = source.premultipliedAlpha; + + this.visible = source.visible; + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + this.clipShadows = source.clipShadows; + this.clipIntersection = source.clipIntersection; + + var srcPlanes = source.clippingPlanes, + dstPlanes = null; + + if ( srcPlanes !== null ) { + + var n = srcPlanes.length; + dstPlanes = new Array( n ); + + for ( var i = 0; i !== n; ++ i ) + dstPlanes[ i ] = srcPlanes[ i ].clone(); + + } + + this.clippingPlanes = dstPlanes; + + this.shadowSide = source.shadowSide; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + +} ); + + +export { Material }; diff --git a/lib/materials/Materials.js b/lib/materials/Materials.js new file mode 100644 index 0000000..28844e9 --- /dev/null +++ b/lib/materials/Materials.js @@ -0,0 +1,18 @@ +export { ShadowMaterial } from './ShadowMaterial.js'; +export { SpriteMaterial } from './SpriteMaterial.js'; +export { RawShaderMaterial } from './RawShaderMaterial.js'; +export { ShaderMaterial } from './ShaderMaterial.js'; +export { PointsMaterial } from './PointsMaterial.js'; +export { MeshPhysicalMaterial } from './MeshPhysicalMaterial.js'; +export { MeshStandardMaterial } from './MeshStandardMaterial.js'; +export { MeshPhongMaterial } from './MeshPhongMaterial.js'; +export { MeshToonMaterial } from './MeshToonMaterial.js'; +export { MeshNormalMaterial } from './MeshNormalMaterial.js'; +export { MeshLambertMaterial } from './MeshLambertMaterial.js'; +export { MeshDepthMaterial } from './MeshDepthMaterial.js'; +export { MeshDistanceMaterial } from './MeshDistanceMaterial.js'; +export { MeshBasicMaterial } from './MeshBasicMaterial.js'; +export { MeshMatcapMaterial } from './MeshMatcapMaterial.js'; +export { LineDashedMaterial } from './LineDashedMaterial.js'; +export { LineBasicMaterial } from './LineBasicMaterial.js'; +export { Material } from './Material.js'; diff --git a/lib/materials/MeshBasicMaterial.js b/lib/materials/MeshBasicMaterial.js new file mode 100644 index 0000000..207cf6a --- /dev/null +++ b/lib/materials/MeshBasicMaterial.js @@ -0,0 +1,120 @@ +import { Material } from './Material.js'; +import { MultiplyOperation } from '../constants.js'; +import { Color } from '../math/Color.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * depthTest: , + * depthWrite: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: + * } + */ + +function MeshBasicMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshBasicMaterial'; + + this.color = new Color( 0xffffff ); // emissive + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + + this.lights = false; + + this.setValues( parameters ); + +} + +MeshBasicMaterial.prototype = Object.create( Material.prototype ); +MeshBasicMaterial.prototype.constructor = MeshBasicMaterial; + +MeshBasicMaterial.prototype.isMeshBasicMaterial = true; + +MeshBasicMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + return this; + +}; + + +export { MeshBasicMaterial }; diff --git a/lib/materials/MeshDepthMaterial.js b/lib/materials/MeshDepthMaterial.js new file mode 100644 index 0000000..2a143df --- /dev/null +++ b/lib/materials/MeshDepthMaterial.js @@ -0,0 +1,86 @@ +import { Material } from './Material.js'; +import { BasicDepthPacking } from '../constants.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author bhouston / https://clara.io + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * + * opacity: , + * + * map: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * wireframe: , + * wireframeLinewidth: + * } + */ + +function MeshDepthMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshDepthMaterial'; + + this.depthPacking = BasicDepthPacking; + + this.skinning = false; + this.morphTargets = false; + + this.map = null; + + this.alphaMap = null; + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; + this.lights = false; + + this.setValues( parameters ); + +} + +MeshDepthMaterial.prototype = Object.create( Material.prototype ); +MeshDepthMaterial.prototype.constructor = MeshDepthMaterial; + +MeshDepthMaterial.prototype.isMeshDepthMaterial = true; + +MeshDepthMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.depthPacking = source.depthPacking; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + return this; + +}; + + +export { MeshDepthMaterial }; diff --git a/lib/materials/MeshDistanceMaterial.js b/lib/materials/MeshDistanceMaterial.js new file mode 100644 index 0000000..2fa54c5 --- /dev/null +++ b/lib/materials/MeshDistanceMaterial.js @@ -0,0 +1,84 @@ +import { Material } from './Material.js'; +import { Vector3 } from '../math/Vector3.js'; + +/** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * + * referencePosition: , + * nearDistance: , + * farDistance: , + * + * skinning: , + * morphTargets: , + * + * map: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: + * + * } + */ + +function MeshDistanceMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshDistanceMaterial'; + + this.referencePosition = new Vector3(); + this.nearDistance = 1; + this.farDistance = 1000; + + this.skinning = false; + this.morphTargets = false; + + this.map = null; + + this.alphaMap = null; + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.fog = false; + this.lights = false; + + this.setValues( parameters ); + +} + +MeshDistanceMaterial.prototype = Object.create( Material.prototype ); +MeshDistanceMaterial.prototype.constructor = MeshDistanceMaterial; + +MeshDistanceMaterial.prototype.isMeshDistanceMaterial = true; + +MeshDistanceMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.referencePosition.copy( source.referencePosition ); + this.nearDistance = source.nearDistance; + this.farDistance = source.farDistance; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + return this; + +}; + + +export { MeshDistanceMaterial }; diff --git a/lib/materials/MeshLambertMaterial.js b/lib/materials/MeshLambertMaterial.js new file mode 100644 index 0000000..949310e --- /dev/null +++ b/lib/materials/MeshLambertMaterial.js @@ -0,0 +1,131 @@ +import { Material } from './Material.js'; +import { MultiplyOperation } from '../constants.js'; +import { Color } from '../math/Color.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + +function MeshLambertMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshLambertMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + +} + +MeshLambertMaterial.prototype = Object.create( Material.prototype ); +MeshLambertMaterial.prototype.constructor = MeshLambertMaterial; + +MeshLambertMaterial.prototype.isMeshLambertMaterial = true; + +MeshLambertMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + +}; + + +export { MeshLambertMaterial }; diff --git a/lib/materials/MeshMatcapMaterial.js b/lib/materials/MeshMatcapMaterial.js new file mode 100644 index 0000000..6ccbab8 --- /dev/null +++ b/lib/materials/MeshMatcapMaterial.js @@ -0,0 +1,129 @@ +import { TangentSpaceNormalMap } from '../constants.js'; +import { Material } from './Material.js'; +import { Vector2 } from '../math/Vector2.js'; +import { Color } from '../math/Color.js'; + +/** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * color: , + * opacity: , + * + * matcap: new THREE.Texture( ), + * + * map: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalMapType: THREE.TangentSpaceNormalMap, + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * alphaMap: new THREE.Texture( ), + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + +function MeshMatcapMaterial( parameters ) { + + Material.call( this ); + + this.defines = { 'MATCAP': '' }; + + this.type = 'MeshMatcapMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + + this.matcap = null; + + this.map = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.alphaMap = null; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.lights = false; + + this.setValues( parameters ); + + // a matcap is required + + if ( this.matcap === null ) { + + var canvas = document.createElement( 'canvas' ); + canvas.width = 1; + canvas.height = 1; + + var context = canvas.getContext( '2d' ); + + context.fillStyle = '#fff'; + context.fillRect( 0, 0, 1, 1 ); + + this.matcap = new THREE.CanvasTexture( canvas ); + + } + +} + +MeshMatcapMaterial.prototype = Object.create( Material.prototype ); +MeshMatcapMaterial.prototype.constructor = MeshMatcapMaterial; + +MeshMatcapMaterial.prototype.isMeshMatcapMaterial = true; + +MeshMatcapMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.defines = { 'MATCAP': '' }; + + this.color.copy( source.color ); + + this.matcap = source.matcap; + + this.map = source.map; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.alphaMap = source.alphaMap; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + +}; + + +export { MeshMatcapMaterial }; diff --git a/lib/materials/MeshNormalMaterial.js b/lib/materials/MeshNormalMaterial.js new file mode 100644 index 0000000..c95f335 --- /dev/null +++ b/lib/materials/MeshNormalMaterial.js @@ -0,0 +1,95 @@ +import { TangentSpaceNormalMap } from '../constants.js'; +import { Material } from './Material.js'; +import { Vector2 } from '../math/Vector2.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * opacity: , + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalMapType: THREE.TangentSpaceNormalMap, + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * wireframe: , + * wireframeLinewidth: + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + +function MeshNormalMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshNormalMaterial'; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; + this.lights = false; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + +} + +MeshNormalMaterial.prototype = Object.create( Material.prototype ); +MeshNormalMaterial.prototype.constructor = MeshNormalMaterial; + +MeshNormalMaterial.prototype.isMeshNormalMaterial = true; + +MeshNormalMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + +}; + + +export { MeshNormalMaterial }; diff --git a/lib/materials/MeshPhongMaterial.js b/lib/materials/MeshPhongMaterial.js new file mode 100644 index 0000000..e040b1f --- /dev/null +++ b/lib/materials/MeshPhongMaterial.js @@ -0,0 +1,171 @@ +import { MultiplyOperation, TangentSpaceNormalMap } from '../constants.js'; +import { Material } from './Material.js'; +import { Vector2 } from '../math/Vector2.js'; +import { Color } from '../math/Color.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * specular: , + * shininess: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalMapType: THREE.TangentSpaceNormalMap, + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + +function MeshPhongMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshPhongMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.specular = new Color( 0x111111 ); + this.shininess = 30; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + +} + +MeshPhongMaterial.prototype = Object.create( Material.prototype ); +MeshPhongMaterial.prototype.constructor = MeshPhongMaterial; + +MeshPhongMaterial.prototype.isMeshPhongMaterial = true; + +MeshPhongMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.specular.copy( source.specular ); + this.shininess = source.shininess; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + +}; + + +export { MeshPhongMaterial }; diff --git a/lib/materials/MeshPhysicalMaterial.js b/lib/materials/MeshPhysicalMaterial.js new file mode 100644 index 0000000..24ee7f9 --- /dev/null +++ b/lib/materials/MeshPhysicalMaterial.js @@ -0,0 +1,49 @@ +import { MeshStandardMaterial } from './MeshStandardMaterial.js'; + +/** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * reflectivity: + * } + */ + +function MeshPhysicalMaterial( parameters ) { + + MeshStandardMaterial.call( this ); + + this.defines = { 'PHYSICAL': '' }; + + this.type = 'MeshPhysicalMaterial'; + + this.reflectivity = 0.5; // maps to F0 = 0.04 + + this.clearCoat = 0.0; + this.clearCoatRoughness = 0.0; + + this.setValues( parameters ); + +} + +MeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype ); +MeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial; + +MeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true; + +MeshPhysicalMaterial.prototype.copy = function ( source ) { + + MeshStandardMaterial.prototype.copy.call( this, source ); + + this.defines = { 'PHYSICAL': '' }; + + this.reflectivity = source.reflectivity; + + this.clearCoat = source.clearCoat; + this.clearCoatRoughness = source.clearCoatRoughness; + + return this; + +}; + + +export { MeshPhysicalMaterial }; diff --git a/lib/materials/MeshStandardMaterial.js b/lib/materials/MeshStandardMaterial.js new file mode 100644 index 0000000..cbbe32d --- /dev/null +++ b/lib/materials/MeshStandardMaterial.js @@ -0,0 +1,180 @@ +import { TangentSpaceNormalMap } from '../constants.js'; +import { Material } from './Material.js'; +import { Vector2 } from '../math/Vector2.js'; +import { Color } from '../math/Color.js'; + +/** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * color: , + * roughness: , + * metalness: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalMapType: THREE.TangentSpaceNormalMap, + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * roughnessMap: new THREE.Texture( ), + * + * metalnessMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * envMapIntensity: + * + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + +function MeshStandardMaterial( parameters ) { + + Material.call( this ); + + this.defines = { 'STANDARD': '' }; + + this.type = 'MeshStandardMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.roughness = 0.5; + this.metalness = 0.5; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.roughnessMap = null; + + this.metalnessMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.envMapIntensity = 1.0; + + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + +} + +MeshStandardMaterial.prototype = Object.create( Material.prototype ); +MeshStandardMaterial.prototype.constructor = MeshStandardMaterial; + +MeshStandardMaterial.prototype.isMeshStandardMaterial = true; + +MeshStandardMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.defines = { 'STANDARD': '' }; + + this.color.copy( source.color ); + this.roughness = source.roughness; + this.metalness = source.metalness; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.roughnessMap = source.roughnessMap; + + this.metalnessMap = source.metalnessMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.envMapIntensity = source.envMapIntensity; + + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + +}; + + +export { MeshStandardMaterial }; diff --git a/lib/materials/MeshToonMaterial.js b/lib/materials/MeshToonMaterial.js new file mode 100644 index 0000000..fbb77e1 --- /dev/null +++ b/lib/materials/MeshToonMaterial.js @@ -0,0 +1,41 @@ +import { MeshPhongMaterial } from './MeshPhongMaterial.js'; + +/** + * @author takahirox / http://github.com/takahirox + * + * parameters = { + * gradientMap: new THREE.Texture( ) + * } + */ + +function MeshToonMaterial( parameters ) { + + MeshPhongMaterial.call( this ); + + this.defines = { 'TOON': '' }; + + this.type = 'MeshToonMaterial'; + + this.gradientMap = null; + + this.setValues( parameters ); + +} + +MeshToonMaterial.prototype = Object.create( MeshPhongMaterial.prototype ); +MeshToonMaterial.prototype.constructor = MeshToonMaterial; + +MeshToonMaterial.prototype.isMeshToonMaterial = true; + +MeshToonMaterial.prototype.copy = function ( source ) { + + MeshPhongMaterial.prototype.copy.call( this, source ); + + this.gradientMap = source.gradientMap; + + return this; + +}; + + +export { MeshToonMaterial }; diff --git a/lib/materials/PointsMaterial.js b/lib/materials/PointsMaterial.js new file mode 100644 index 0000000..ec4cae4 --- /dev/null +++ b/lib/materials/PointsMaterial.js @@ -0,0 +1,64 @@ +import { Material } from './Material.js'; +import { Color } from '../math/Color.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * size: , + * sizeAttenuation: + * + * morphTargets: + * } + */ + +function PointsMaterial( parameters ) { + + Material.call( this ); + + this.type = 'PointsMaterial'; + + this.color = new Color( 0xffffff ); + + this.map = null; + + this.size = 1; + this.sizeAttenuation = true; + + this.morphTargets = false; + + this.lights = false; + + this.setValues( parameters ); + +} + +PointsMaterial.prototype = Object.create( Material.prototype ); +PointsMaterial.prototype.constructor = PointsMaterial; + +PointsMaterial.prototype.isPointsMaterial = true; + +PointsMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.size = source.size; + this.sizeAttenuation = source.sizeAttenuation; + + this.morphTargets = source.morphTargets; + + return this; + +}; + + +export { PointsMaterial }; diff --git a/lib/materials/RawShaderMaterial.js b/lib/materials/RawShaderMaterial.js new file mode 100644 index 0000000..1f35bac --- /dev/null +++ b/lib/materials/RawShaderMaterial.js @@ -0,0 +1,21 @@ +import { ShaderMaterial } from './ShaderMaterial.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function RawShaderMaterial( parameters ) { + + ShaderMaterial.call( this, parameters ); + + this.type = 'RawShaderMaterial'; + +} + +RawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype ); +RawShaderMaterial.prototype.constructor = RawShaderMaterial; + +RawShaderMaterial.prototype.isRawShaderMaterial = true; + + +export { RawShaderMaterial }; diff --git a/lib/materials/ShaderMaterial.js b/lib/materials/ShaderMaterial.js new file mode 100644 index 0000000..a9ad084 --- /dev/null +++ b/lib/materials/ShaderMaterial.js @@ -0,0 +1,190 @@ +import { Material } from './Material.js'; +import { UniformsUtils } from '../renderers/shaders/UniformsUtils.js'; + +/** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * defines: { "label" : "value" }, + * uniforms: { "parameter1": { value: 1.0 }, "parameter2": { value2: 2 } }, + * + * fragmentShader: , + * vertexShader: , + * + * wireframe: , + * wireframeLinewidth: , + * + * lights: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + +function ShaderMaterial( parameters ) { + + Material.call( this ); + + this.type = 'ShaderMaterial'; + + this.defines = {}; + this.uniforms = {}; + + this.vertexShader = 'void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}'; + this.fragmentShader = 'void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}'; + + this.linewidth = 1; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; // set to use scene fog + this.lights = false; // set to use scene lights + this.clipping = false; // set to use user-defined clipping planes + + this.skinning = false; // set to use skinning attribute streams + this.morphTargets = false; // set to use morph targets + this.morphNormals = false; // set to use morph normals + + this.extensions = { + derivatives: false, // set to use derivatives + fragDepth: false, // set to use fragment depth values + drawBuffers: false, // set to use draw buffers + shaderTextureLOD: false // set to use shader texture LOD + }; + + // When rendered geometry doesn't include these attributes but the material does, + // use these default values in WebGL. This avoids errors when buffer data is missing. + this.defaultAttributeValues = { + 'color': [ 1, 1, 1 ], + 'uv': [ 0, 0 ], + 'uv2': [ 0, 0 ] + }; + + this.index0AttributeName = undefined; + this.uniformsNeedUpdate = false; + + if ( parameters !== undefined ) { + + if ( parameters.attributes !== undefined ) { + + console.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' ); + + } + + this.setValues( parameters ); + + } + +} + +ShaderMaterial.prototype = Object.create( Material.prototype ); +ShaderMaterial.prototype.constructor = ShaderMaterial; + +ShaderMaterial.prototype.isShaderMaterial = true; + +ShaderMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.fragmentShader = source.fragmentShader; + this.vertexShader = source.vertexShader; + + this.uniforms = UniformsUtils.clone( source.uniforms ); + + this.defines = Object.assign( {}, source.defines ); + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.lights = source.lights; + this.clipping = source.clipping; + + this.skinning = source.skinning; + + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + this.extensions = source.extensions; + + return this; + +}; + +ShaderMaterial.prototype.toJSON = function ( meta ) { + + var data = Material.prototype.toJSON.call( this, meta ); + + data.uniforms = {}; + + for ( var name in this.uniforms ) { + + var uniform = this.uniforms[ name ]; + var value = uniform.value; + + if ( value.isTexture ) { + + data.uniforms[ name ] = { + type: 't', + value: value.toJSON( meta ).uuid + }; + + } else if ( value.isColor ) { + + data.uniforms[ name ] = { + type: 'c', + value: value.getHex() + }; + + } else if ( value.isVector2 ) { + + data.uniforms[ name ] = { + type: 'v2', + value: value.toArray() + }; + + } else if ( value.isVector3 ) { + + data.uniforms[ name ] = { + type: 'v3', + value: value.toArray() + }; + + } else if ( value.isVector4 ) { + + data.uniforms[ name ] = { + type: 'v4', + value: value.toArray() + }; + + } else if ( value.isMatrix4 ) { + + data.uniforms[ name ] = { + type: 'm4', + value: value.toArray() + }; + + } else { + + data.uniforms[ name ] = { + value: value + }; + + // note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far + + } + + } + + if ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines; + + data.vertexShader = this.vertexShader; + data.fragmentShader = this.fragmentShader; + + return data; + +}; + + +export { ShaderMaterial }; diff --git a/lib/materials/ShadowMaterial.js b/lib/materials/ShadowMaterial.js new file mode 100644 index 0000000..b4622c1 --- /dev/null +++ b/lib/materials/ShadowMaterial.js @@ -0,0 +1,41 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * + * parameters = { + * color: + * } + */ + +import { Material } from './Material.js'; +import { Color } from '../math/Color.js'; + +function ShadowMaterial( parameters ) { + + Material.call( this ); + + this.type = 'ShadowMaterial'; + + this.color = new Color( 0x000000 ); + this.transparent = true; + + this.setValues( parameters ); + +} + +ShadowMaterial.prototype = Object.create( Material.prototype ); +ShadowMaterial.prototype.constructor = ShadowMaterial; + +ShadowMaterial.prototype.isShadowMaterial = true; + +ShadowMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + return this; + +}; + + +export { ShadowMaterial }; diff --git a/lib/materials/SpriteMaterial.js b/lib/materials/SpriteMaterial.js new file mode 100644 index 0000000..73e9d52 --- /dev/null +++ b/lib/materials/SpriteMaterial.js @@ -0,0 +1,55 @@ +import { Material } from './Material.js'; +import { Color } from '../math/Color.js'; + +/** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * map: new THREE.Texture( ), + * rotation: , + * sizeAttenuation: + * } + */ + +function SpriteMaterial( parameters ) { + + Material.call( this ); + + this.type = 'SpriteMaterial'; + + this.color = new Color( 0xffffff ); + this.map = null; + + this.rotation = 0; + + this.sizeAttenuation = true; + + this.lights = false; + this.transparent = true; + + this.setValues( parameters ); + +} + +SpriteMaterial.prototype = Object.create( Material.prototype ); +SpriteMaterial.prototype.constructor = SpriteMaterial; +SpriteMaterial.prototype.isSpriteMaterial = true; + +SpriteMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.map = source.map; + + this.rotation = source.rotation; + + this.sizeAttenuation = source.sizeAttenuation; + + return this; + +}; + + +export { SpriteMaterial }; diff --git a/lib/math/Box2.js b/lib/math/Box2.js new file mode 100644 index 0000000..0010260 --- /dev/null +++ b/lib/math/Box2.js @@ -0,0 +1,244 @@ +import { Vector2 } from './Vector2.js'; + +/** + * @author bhouston / http://clara.io + */ + +function Box2( min, max ) { + + this.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity ); + this.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity ); + +} + +Object.assign( Box2.prototype, { + + set: function ( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + }, + + setFromPoints: function ( points ) { + + this.makeEmpty(); + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + }, + + setFromCenterAndSize: function () { + + var v1 = new Vector2(); + + return function setFromCenterAndSize( center, size ) { + + var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + }, + + makeEmpty: function () { + + this.min.x = this.min.y = + Infinity; + this.max.x = this.max.y = - Infinity; + + return this; + + }, + + isEmpty: function () { + + // 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 ); + + }, + + getCenter: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box2: .getCenter() target is now required' ); + target = new Vector2(); + + } + + return this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + }, + + getSize: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box2: .getSize() target is now required' ); + target = new Vector2(); + + } + + return this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min ); + + }, + + expandByPoint: function ( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + }, + + expandByVector: function ( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + }, + + expandByScalar: function ( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + }, + + containsPoint: function ( point ) { + + return point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y ? false : true; + + }, + + containsBox: function ( box ) { + + return this.min.x <= box.min.x && box.max.x <= this.max.x && + this.min.y <= box.min.y && box.max.y <= this.max.y; + + }, + + getParameter: function ( point, target ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + if ( target === undefined ) { + + console.warn( 'THREE.Box2: .getParameter() target is now required' ); + target = new Vector2(); + + } + + return target.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ) + ); + + }, + + intersectsBox: function ( box ) { + + // using 4 splitting planes to rule out intersections + + return box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y ? false : true; + + }, + + clampPoint: function ( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box2: .clampPoint() target is now required' ); + target = new Vector2(); + + } + + return target.copy( point ).clamp( this.min, this.max ); + + }, + + distanceToPoint: function () { + + var v1 = new Vector2(); + + return function distanceToPoint( point ) { + + var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + }; + + }(), + + intersect: function ( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + return this; + + }, + + union: function ( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + }, + + translate: function ( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + }, + + equals: function ( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + +} ); + + +export { Box2 }; diff --git a/lib/math/Box3.js b/lib/math/Box3.js new file mode 100644 index 0000000..ef2c17c --- /dev/null +++ b/lib/math/Box3.js @@ -0,0 +1,616 @@ +import { Vector3 } from './Vector3.js'; +import { Sphere } from './Sphere.js'; + +/** + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + +function Box3( min, max ) { + + this.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity ); + this.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity ); + +} + +Object.assign( Box3.prototype, { + + isBox3: true, + + set: function ( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + }, + + setFromArray: function ( array ) { + + var minX = + Infinity; + var minY = + Infinity; + var minZ = + Infinity; + + var maxX = - Infinity; + var maxY = - Infinity; + var maxZ = - Infinity; + + for ( var i = 0, l = array.length; i < l; i += 3 ) { + + var x = array[ i ]; + var y = array[ i + 1 ]; + var z = array[ i + 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; + + } + + this.min.set( minX, minY, minZ ); + this.max.set( maxX, maxY, maxZ ); + + return this; + + }, + + setFromBufferAttribute: function ( attribute ) { + + var minX = + Infinity; + var minY = + Infinity; + var minZ = + Infinity; + + var maxX = - Infinity; + var maxY = - Infinity; + var maxZ = - Infinity; + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + var x = attribute.getX( i ); + var y = attribute.getY( i ); + var z = attribute.getZ( i ); + + 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; + + }, + + setFromPoints: function ( points ) { + + this.makeEmpty(); + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + }, + + setFromCenterAndSize: function () { + + var v1 = new Vector3(); + + return function setFromCenterAndSize( center, size ) { + + var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); + + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + }; + + }(), + + setFromObject: function ( object ) { + + this.makeEmpty(); + + return this.expandByObject( object ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + }, + + makeEmpty: function () { + + this.min.x = this.min.y = this.min.z = + Infinity; + this.max.x = this.max.y = this.max.z = - Infinity; + + return this; + + }, + + isEmpty: function () { + + // 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 ); + + }, + + getCenter: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .getCenter() target is now required' ); + target = new Vector3(); + + } + + return this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + }, + + getSize: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .getSize() target is now required' ); + target = new Vector3(); + + } + + return this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min ); + + }, + + expandByPoint: function ( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + }, + + expandByVector: function ( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + }, + + expandByScalar: function ( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + }, + + expandByObject: function () { + + // Computes the world-axis-aligned bounding box of an object (including its children), + // accounting for both the object's, and children's, world transforms + + var scope, i, l; + + var v1 = new Vector3(); + + function traverse( node ) { + + var geometry = node.geometry; + + if ( geometry !== undefined ) { + + if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + + for ( i = 0, l = vertices.length; i < l; i ++ ) { + + v1.copy( vertices[ i ] ); + v1.applyMatrix4( node.matrixWorld ); + + scope.expandByPoint( v1 ); + + } + + } else if ( geometry.isBufferGeometry ) { + + var attribute = geometry.attributes.position; + + if ( attribute !== undefined ) { + + for ( i = 0, l = attribute.count; i < l; i ++ ) { + + v1.fromBufferAttribute( attribute, i ).applyMatrix4( node.matrixWorld ); + + scope.expandByPoint( v1 ); + + } + + } + + } + + } + + } + + return function expandByObject( object ) { + + scope = this; + + object.updateMatrixWorld( true ); + + object.traverse( traverse ); + + return this; + + }; + + }(), + + containsPoint: function ( 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; + + }, + + containsBox: function ( box ) { + + return this.min.x <= box.min.x && box.max.x <= this.max.x && + this.min.y <= box.min.y && box.max.y <= this.max.y && + this.min.z <= box.min.z && box.max.z <= this.max.z; + + }, + + getParameter: function ( point, target ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .getParameter() target is now required' ); + target = new Vector3(); + + } + + return target.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ), + ( point.z - this.min.z ) / ( this.max.z - this.min.z ) + ); + + }, + + intersectsBox: function ( box ) { + + // using 6 splitting planes to rule out intersections. + return box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y || + box.max.z < this.min.z || box.min.z > this.max.z ? false : true; + + }, + + intersectsSphere: ( function () { + + var closestPoint = new Vector3(); + + return function intersectsSphere( sphere ) { + + // Find the point on the AABB closest to the sphere center. + this.clampPoint( sphere.center, closestPoint ); + + // If that point is inside the sphere, the AABB and sphere intersect. + return closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius ); + + }; + + } )(), + + intersectsPlane: function ( plane ) { + + // We compute the minimum and maximum dot product values. If those values + // are on the same side (back or front) of the plane, then there is no intersection. + + var min, max; + + if ( plane.normal.x > 0 ) { + + min = plane.normal.x * this.min.x; + max = plane.normal.x * this.max.x; + + } else { + + min = plane.normal.x * this.max.x; + max = plane.normal.x * this.min.x; + + } + + if ( plane.normal.y > 0 ) { + + min += plane.normal.y * this.min.y; + max += plane.normal.y * this.max.y; + + } else { + + min += plane.normal.y * this.max.y; + max += plane.normal.y * this.min.y; + + } + + if ( plane.normal.z > 0 ) { + + min += plane.normal.z * this.min.z; + max += plane.normal.z * this.max.z; + + } else { + + min += plane.normal.z * this.max.z; + max += plane.normal.z * this.min.z; + + } + + return ( min <= - plane.constant && max >= - plane.constant ); + + }, + + intersectsTriangle: ( function () { + + // triangle centered vertices + var v0 = new Vector3(); + var v1 = new Vector3(); + var v2 = new Vector3(); + + // triangle edge vectors + var f0 = new Vector3(); + var f1 = new Vector3(); + var f2 = new Vector3(); + + var testAxis = new Vector3(); + + var center = new Vector3(); + var extents = new Vector3(); + + var triangleNormal = new Vector3(); + + function satForAxes( axes ) { + + var i, j; + + for ( i = 0, j = axes.length - 3; i <= j; i += 3 ) { + + testAxis.fromArray( axes, i ); + // project the aabb onto the seperating axis + var 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 seperating axis + var p0 = v0.dot( testAxis ); + var p1 = v1.dot( testAxis ); + var 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 seperating and we can exit + return false; + + } + + } + + return true; + + } + + return function 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) + var 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 ) ) { + + return false; + + } + + // test 3 face normals from the aabb + axes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ]; + if ( ! satForAxes( axes ) ) { + + 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 ); + + }; + + } )(), + + clampPoint: function ( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .clampPoint() target is now required' ); + target = new Vector3(); + + } + + return target.copy( point ).clamp( this.min, this.max ); + + }, + + distanceToPoint: function () { + + var v1 = new Vector3(); + + return function distanceToPoint( point ) { + + var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + }; + + }(), + + getBoundingSphere: function () { + + var v1 = new Vector3(); + + return function getBoundingSphere( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .getBoundingSphere() target is now required' ); + target = new Sphere(); + + } + + this.getCenter( target.center ); + + target.radius = this.getSize( v1 ).length() * 0.5; + + return target; + + }; + + }(), + + intersect: function ( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + // ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values. + if ( this.isEmpty() ) this.makeEmpty(); + + return this; + + }, + + union: function ( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + }, + + applyMatrix4: function () { + + var points = [ + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3() + ]; + + return function 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; + + }; + + }(), + + translate: function ( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + }, + + equals: function ( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + +} ); + + +export { Box3 }; diff --git a/lib/math/Color.js b/lib/math/Color.js new file mode 100644 index 0000000..5590100 --- /dev/null +++ b/lib/math/Color.js @@ -0,0 +1,606 @@ +import { _Math } from './Math.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +var ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF, + 'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2, + 'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50, + 'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B, + 'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B, + 'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F, + 'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3, + 'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222, + 'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700, + 'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4, + 'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00, + 'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3, + 'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA, + 'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32, + 'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3, + 'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC, + 'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD, + 'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6, + 'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9, + 'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F, + 'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE, + 'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA, + 'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0, + 'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 }; + +function Color( r, g, b ) { + + if ( g === undefined && b === undefined ) { + + // r is THREE.Color, hex or string + return this.set( r ); + + } + + return this.setRGB( r, g, b ); + +} + +Object.assign( Color.prototype, { + + isColor: true, + + r: 1, g: 1, b: 1, + + set: function ( value ) { + + if ( value && value.isColor ) { + + this.copy( value ); + + } else if ( typeof value === 'number' ) { + + this.setHex( value ); + + } else if ( typeof value === 'string' ) { + + this.setStyle( value ); + + } + + return this; + + }, + + setScalar: function ( scalar ) { + + this.r = scalar; + this.g = scalar; + this.b = scalar; + + return this; + + }, + + setHex: function ( hex ) { + + hex = Math.floor( hex ); + + this.r = ( hex >> 16 & 255 ) / 255; + this.g = ( hex >> 8 & 255 ) / 255; + this.b = ( hex & 255 ) / 255; + + return this; + + }, + + setRGB: function ( r, g, b ) { + + this.r = r; + this.g = g; + this.b = b; + + return this; + + }, + + setHSL: function () { + + 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; + + } + + return function setHSL( h, s, l ) { + + // h,s,l ranges are in 0.0 - 1.0 + h = _Math.euclideanModulo( h, 1 ); + s = _Math.clamp( s, 0, 1 ); + l = _Math.clamp( l, 0, 1 ); + + if ( s === 0 ) { + + this.r = this.g = this.b = l; + + } else { + + var p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s ); + var 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; + + }; + + }(), + + setStyle: function ( style ) { + + function handleAlpha( string ) { + + if ( string === undefined ) return; + + if ( parseFloat( string ) < 1 ) { + + console.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' ); + + } + + } + + + var m; + + if ( m = /^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec( style ) ) { + + // rgb / hsl + + var color; + var name = m[ 1 ]; + var components = m[ 2 ]; + + switch ( name ) { + + case 'rgb': + case 'rgba': + + if ( color = /^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // rgb(255,0,0) rgba(255,0,0,0.5) + this.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255; + this.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255; + this.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255; + + handleAlpha( color[ 5 ] ); + + return this; + + } + + if ( color = /^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // rgb(100%,0%,0%) rgba(100%,0%,0%,0.5) + this.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100; + this.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100; + this.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100; + + handleAlpha( color[ 5 ] ); + + return this; + + } + + break; + + case 'hsl': + case 'hsla': + + if ( color = /^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // hsl(120,50%,50%) hsla(120,50%,50%,0.5) + var h = parseFloat( color[ 1 ] ) / 360; + var s = parseInt( color[ 2 ], 10 ) / 100; + var l = parseInt( color[ 3 ], 10 ) / 100; + + handleAlpha( color[ 5 ] ); + + return this.setHSL( h, s, l ); + + } + + break; + + } + + } else if ( m = /^\#([A-Fa-f0-9]+)$/.exec( style ) ) { + + // hex color + + var hex = m[ 1 ]; + var size = hex.length; + + if ( size === 3 ) { + + // #ff0 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255; + + return this; + + } else if ( size === 6 ) { + + // #ff0000 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255; + + return this; + + } + + } + + if ( style && style.length > 0 ) { + + // color keywords + var hex = ColorKeywords[ style ]; + + if ( hex !== undefined ) { + + // red + this.setHex( hex ); + + } else { + + // unknown color + console.warn( 'THREE.Color: Unknown color ' + style ); + + } + + } + + return this; + + }, + + clone: function () { + + return new this.constructor( this.r, this.g, this.b ); + + }, + + copy: function ( color ) { + + this.r = color.r; + this.g = color.g; + this.b = color.b; + + return this; + + }, + + copyGammaToLinear: function ( color, gammaFactor ) { + + if ( gammaFactor === undefined ) gammaFactor = 2.0; + + this.r = Math.pow( color.r, gammaFactor ); + this.g = Math.pow( color.g, gammaFactor ); + this.b = Math.pow( color.b, gammaFactor ); + + return this; + + }, + + copyLinearToGamma: function ( color, gammaFactor ) { + + if ( gammaFactor === undefined ) gammaFactor = 2.0; + + var safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0; + + this.r = Math.pow( color.r, safeInverse ); + this.g = Math.pow( color.g, safeInverse ); + this.b = Math.pow( color.b, safeInverse ); + + return this; + + }, + + convertGammaToLinear: function ( gammaFactor ) { + + this.copyGammaToLinear( this, gammaFactor ); + + return this; + + }, + + convertLinearToGamma: function ( gammaFactor ) { + + this.copyLinearToGamma( this, gammaFactor ); + + return this; + + }, + + copySRGBToLinear: function () { + + function SRGBToLinear( c ) { + + return ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 ); + + } + + return function copySRGBToLinear( color ) { + + this.r = SRGBToLinear( color.r ); + this.g = SRGBToLinear( color.g ); + this.b = SRGBToLinear( color.b ); + + return this; + + }; + + }(), + + copyLinearToSRGB: function () { + + function LinearToSRGB( c ) { + + return ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055; + + } + + return function copyLinearToSRGB( color ) { + + this.r = LinearToSRGB( color.r ); + this.g = LinearToSRGB( color.g ); + this.b = LinearToSRGB( color.b ); + + return this; + + }; + + }(), + + convertSRGBToLinear: function () { + + this.copySRGBToLinear( this ); + + return this; + + }, + + convertLinearToSRGB: function () { + + this.copyLinearToSRGB( this ); + + return this; + + }, + + getHex: function () { + + return ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0; + + }, + + getHexString: function () { + + return ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 ); + + }, + + getHSL: function ( target ) { + + // h,s,l ranges are in 0.0 - 1.0 + + if ( target === undefined ) { + + console.warn( 'THREE.Color: .getHSL() target is now required' ); + target = { h: 0, s: 0, l: 0 }; + + } + + var r = this.r, g = this.g, b = this.b; + + var max = Math.max( r, g, b ); + var min = Math.min( r, g, b ); + + var hue, saturation; + var lightness = ( min + max ) / 2.0; + + if ( min === max ) { + + hue = 0; + saturation = 0; + + } else { + + var delta = max - min; + + saturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min ); + + switch ( max ) { + + case r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break; + case g: hue = ( b - r ) / delta + 2; break; + case b: hue = ( r - g ) / delta + 4; break; + + } + + hue /= 6; + + } + + target.h = hue; + target.s = saturation; + target.l = lightness; + + return target; + + }, + + getStyle: function () { + + return 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')'; + + }, + + offsetHSL: function () { + + var hsl = {}; + + return function ( h, s, l ) { + + this.getHSL( hsl ); + + hsl.h += h; hsl.s += s; hsl.l += l; + + this.setHSL( hsl.h, hsl.s, hsl.l ); + + return this; + + }; + + }(), + + add: function ( color ) { + + this.r += color.r; + this.g += color.g; + this.b += color.b; + + return this; + + }, + + addColors: function ( color1, color2 ) { + + this.r = color1.r + color2.r; + this.g = color1.g + color2.g; + this.b = color1.b + color2.b; + + return this; + + }, + + addScalar: function ( s ) { + + this.r += s; + this.g += s; + this.b += s; + + return this; + + }, + + sub: function ( color ) { + + this.r = Math.max( 0, this.r - color.r ); + this.g = Math.max( 0, this.g - color.g ); + this.b = Math.max( 0, this.b - color.b ); + + return this; + + }, + + multiply: function ( color ) { + + this.r *= color.r; + this.g *= color.g; + this.b *= color.b; + + return this; + + }, + + multiplyScalar: function ( s ) { + + this.r *= s; + this.g *= s; + this.b *= s; + + return this; + + }, + + lerp: function ( color, alpha ) { + + this.r += ( color.r - this.r ) * alpha; + this.g += ( color.g - this.g ) * alpha; + this.b += ( color.b - this.b ) * alpha; + + return this; + + }, + + lerpHSL: function () { + + var hslA = { h: 0, s: 0, l: 0 }; + var hslB = { h: 0, s: 0, l: 0 }; + + return function lerpHSL( color, alpha ) { + + this.getHSL( hslA ); + color.getHSL( hslB ); + + var h = _Math.lerp( hslA.h, hslB.h, alpha ); + var s = _Math.lerp( hslA.s, hslB.s, alpha ); + var l = _Math.lerp( hslA.l, hslB.l, alpha ); + + this.setHSL( h, s, l ); + + return this; + + }; + + }(), + + equals: function ( c ) { + + return ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.r = array[ offset ]; + this.g = array[ offset + 1 ]; + this.b = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.r; + array[ offset + 1 ] = this.g; + array[ offset + 2 ] = this.b; + + return array; + + }, + + toJSON: function () { + + return this.getHex(); + + } + +} ); + + +export { Color }; diff --git a/lib/math/Cylindrical.js b/lib/math/Cylindrical.js new file mode 100644 index 0000000..8b7452f --- /dev/null +++ b/lib/math/Cylindrical.js @@ -0,0 +1,65 @@ +/** + * @author Mugen87 / https://github.com/Mugen87 + * + * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system + * + */ + +function Cylindrical( radius, theta, y ) { + + this.radius = ( radius !== undefined ) ? radius : 1.0; // distance from the origin to a point in the x-z plane + this.theta = ( theta !== undefined ) ? theta : 0; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis + this.y = ( y !== undefined ) ? y : 0; // height above the x-z plane + + return this; + +} + +Object.assign( Cylindrical.prototype, { + + set: function ( radius, theta, y ) { + + this.radius = radius; + this.theta = theta; + this.y = y; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( other ) { + + this.radius = other.radius; + this.theta = other.theta; + this.y = other.y; + + return this; + + }, + + setFromVector3: function ( v ) { + + return this.setFromCartesianCoords( v.x, v.y, v.z ); + + }, + + setFromCartesianCoords: function ( x, y, z ) { + + this.radius = Math.sqrt( x * x + z * z ); + this.theta = Math.atan2( x, z ); + this.y = y; + + return this; + + } + +} ); + + +export { Cylindrical }; diff --git a/lib/math/Euler.js b/lib/math/Euler.js new file mode 100644 index 0000000..8f8d3b6 --- /dev/null +++ b/lib/math/Euler.js @@ -0,0 +1,352 @@ +import { Quaternion } from './Quaternion.js'; +import { Vector3 } from './Vector3.js'; +import { Matrix4 } from './Matrix4.js'; +import { _Math } from './Math.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + +function Euler( x, y, z, order ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._order = order || Euler.DefaultOrder; + +} + +Euler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ]; + +Euler.DefaultOrder = 'XYZ'; + +Object.defineProperties( Euler.prototype, { + + x: { + + get: function () { + + return this._x; + + }, + + set: function ( value ) { + + this._x = value; + this.onChangeCallback(); + + } + + }, + + y: { + + get: function () { + + return this._y; + + }, + + set: function ( value ) { + + this._y = value; + this.onChangeCallback(); + + } + + }, + + z: { + + get: function () { + + return this._z; + + }, + + set: function ( value ) { + + this._z = value; + this.onChangeCallback(); + + } + + }, + + order: { + + get: function () { + + return this._order; + + }, + + set: function ( value ) { + + this._order = value; + this.onChangeCallback(); + + } + + } + +} ); + +Object.assign( Euler.prototype, { + + isEuler: true, + + set: function ( x, y, z, order ) { + + this._x = x; + this._y = y; + this._z = z; + this._order = order || this._order; + + this.onChangeCallback(); + + return this; + + }, + + clone: function () { + + return new this.constructor( this._x, this._y, this._z, this._order ); + + }, + + copy: function ( euler ) { + + this._x = euler._x; + this._y = euler._y; + this._z = euler._z; + this._order = euler._order; + + this.onChangeCallback(); + + return this; + + }, + + setFromRotationMatrix: function ( m, order, update ) { + + var clamp = _Math.clamp; + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements; + var m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ]; + var m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ]; + var m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + order = order || this._order; + + if ( order === 'XYZ' ) { + + this._y = Math.asin( 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( - 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( 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( - 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( 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( - 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( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order ); + + } + + this._order = order; + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromQuaternion: function () { + + var matrix = new Matrix4(); + + return function setFromQuaternion( q, order, update ) { + + matrix.makeRotationFromQuaternion( q ); + + return this.setFromRotationMatrix( matrix, order, update ); + + }; + + }(), + + setFromVector3: function ( v, order ) { + + return this.set( v.x, v.y, v.z, order || this._order ); + + }, + + reorder: function () { + + // WARNING: this discards revolution information -bhouston + + var q = new Quaternion(); + + return function reorder( newOrder ) { + + q.setFromEuler( this ); + + return this.setFromQuaternion( q, newOrder ); + + }; + + }(), + + equals: function ( euler ) { + + return ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order ); + + }, + + fromArray: function ( array ) { + + this._x = array[ 0 ]; + this._y = array[ 1 ]; + this._z = array[ 2 ]; + if ( array[ 3 ] !== undefined ) this._order = array[ 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._order; + + return array; + + }, + + toVector3: function ( optionalResult ) { + + if ( optionalResult ) { + + return optionalResult.set( this._x, this._y, this._z ); + + } else { + + return new Vector3( this._x, this._y, this._z ); + + } + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {} + +} ); + + +export { Euler }; diff --git a/lib/math/Frustum.js b/lib/math/Frustum.js new file mode 100644 index 0000000..6c0f15e --- /dev/null +++ b/lib/math/Frustum.js @@ -0,0 +1,194 @@ +import { Vector3 } from './Vector3.js'; +import { Sphere } from './Sphere.js'; +import { Plane } from './Plane.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author bhouston / http://clara.io + */ + +function Frustum( p0, p1, p2, p3, p4, p5 ) { + + this.planes = [ + + ( p0 !== undefined ) ? p0 : new Plane(), + ( p1 !== undefined ) ? p1 : new Plane(), + ( p2 !== undefined ) ? p2 : new Plane(), + ( p3 !== undefined ) ? p3 : new Plane(), + ( p4 !== undefined ) ? p4 : new Plane(), + ( p5 !== undefined ) ? p5 : new Plane() + + ]; + +} + +Object.assign( Frustum.prototype, { + + set: function ( p0, p1, p2, p3, p4, p5 ) { + + var 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; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( frustum ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + planes[ i ].copy( frustum.planes[ i ] ); + + } + + return this; + + }, + + setFromMatrix: function ( m ) { + + var planes = this.planes; + var me = m.elements; + var me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ]; + var me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ]; + var me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ]; + var 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; + + }, + + intersectsObject: function () { + + var sphere = new Sphere(); + + return function intersectsObject( object ) { + + var geometry = object.geometry; + + if ( geometry.boundingSphere === null ) + geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ) + .applyMatrix4( object.matrixWorld ); + + return this.intersectsSphere( sphere ); + + }; + + }(), + + intersectsSprite: function () { + + var sphere = new Sphere(); + + return function intersectsSprite( sprite ) { + + sphere.center.set( 0, 0, 0 ); + sphere.radius = 0.7071067811865476; + sphere.applyMatrix4( sprite.matrixWorld ); + + return this.intersectsSphere( sphere ); + + }; + + }(), + + intersectsSphere: function ( sphere ) { + + var planes = this.planes; + var center = sphere.center; + var negRadius = - sphere.radius; + + for ( var i = 0; i < 6; i ++ ) { + + var distance = planes[ i ].distanceToPoint( center ); + + if ( distance < negRadius ) { + + return false; + + } + + } + + return true; + + }, + + intersectsBox: function () { + + var p = new Vector3(); + + return function intersectsBox( box ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + var plane = planes[ i ]; + + // corner at max distance + + p.x = plane.normal.x > 0 ? box.max.x : box.min.x; + p.y = plane.normal.y > 0 ? box.max.y : box.min.y; + p.z = plane.normal.z > 0 ? box.max.z : box.min.z; + + if ( plane.distanceToPoint( p ) < 0 ) { + + return false; + + } + + } + + return true; + + }; + + }(), + + containsPoint: function ( point ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + if ( planes[ i ].distanceToPoint( point ) < 0 ) { + + return false; + + } + + } + + return true; + + } + +} ); + + +export { Frustum }; diff --git a/lib/math/Interpolant.js b/lib/math/Interpolant.js new file mode 100644 index 0000000..4fbe74b --- /dev/null +++ b/lib/math/Interpolant.js @@ -0,0 +1,259 @@ +/** + * Abstract base class of interpolants over parametric samples. + * + * The parameter domain is one dimensional, typically the time or a path + * along a curve defined by the data. + * + * The sample values can have any dimensionality and derived classes may + * apply special interpretations to the data. + * + * This class provides the interval seek in a Template Method, deferring + * the actual interpolation to derived classes. + * + * Time complexity is O(1) for linear access crossing at most two points + * and O(log N) for random access, where N is the number of positions. + * + * References: + * + * http://www.oodesign.com/template-method-pattern.html + * + * @author tschw + */ + +function Interpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + this.parameterPositions = parameterPositions; + this._cachedIndex = 0; + + this.resultBuffer = resultBuffer !== undefined ? + resultBuffer : new sampleValues.constructor( sampleSize ); + this.sampleValues = sampleValues; + this.valueSize = sampleSize; + +} + +Object.assign( Interpolant.prototype, { + + evaluate: function ( t ) { + + var pp = this.parameterPositions, + i1 = this._cachedIndex, + + t1 = pp[ i1 ], + t0 = pp[ i1 - 1 ]; + + validate_interval: { + + seek: { + + var right; + + linear_scan: { + + //- See http://jsperf.com/comparison-to-undefined/3 + //- slower code: + //- + //- if ( t >= t1 || t1 === undefined ) { + forward_scan: if ( ! ( t < t1 ) ) { + + for ( var giveUpAt = i1 + 2; ; ) { + + if ( t1 === undefined ) { + + if ( t < t0 ) break forward_scan; + + // after end + + i1 = pp.length; + this._cachedIndex = i1; + return this.afterEnd_( i1 - 1, t, t0 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t0 = t1; + t1 = pp[ ++ i1 ]; + + if ( t < t1 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the right side of the index + right = pp.length; + break linear_scan; + + } + + //- slower code: + //- if ( t < t0 || t0 === undefined ) { + if ( ! ( t >= t0 ) ) { + + // looping? + + var t1global = pp[ 1 ]; + + if ( t < t1global ) { + + i1 = 2; // + 1, using the scan for the details + t0 = t1global; + + } + + // linear reverse scan + + for ( var giveUpAt = i1 - 2; ; ) { + + if ( t0 === undefined ) { + + // before start + + this._cachedIndex = 0; + return this.beforeStart_( 0, t, t1 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t1 = t0; + t0 = pp[ -- i1 - 1 ]; + + if ( t >= t0 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the left side of the index + right = i1; + i1 = 0; + break linear_scan; + + } + + // the interval is valid + + break validate_interval; + + } // linear scan + + // binary search + + while ( i1 < right ) { + + var mid = ( i1 + right ) >>> 1; + + if ( t < pp[ mid ] ) { + + right = mid; + + } else { + + i1 = mid + 1; + + } + + } + + t1 = pp[ i1 ]; + t0 = pp[ i1 - 1 ]; + + // check boundary cases, again + + if ( t0 === undefined ) { + + this._cachedIndex = 0; + return this.beforeStart_( 0, t, t1 ); + + } + + if ( t1 === undefined ) { + + i1 = pp.length; + this._cachedIndex = i1; + return this.afterEnd_( i1 - 1, t0, t ); + + } + + } // seek + + this._cachedIndex = i1; + + this.intervalChanged_( i1, t0, t1 ); + + } // validate_interval + + return this.interpolate_( i1, t0, t, t1 ); + + }, + + settings: null, // optional, subclass-specific settings structure + // Note: The indirection allows central control of many interpolants. + + // --- Protected interface + + DefaultSettings_: {}, + + getSettings_: function () { + + return this.settings || this.DefaultSettings_; + + }, + + copySampleValue_: function ( index ) { + + // copies a sample value to the result buffer + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + offset = index * stride; + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = values[ offset + i ]; + + } + + return result; + + }, + + // Template methods for derived classes: + + interpolate_: function ( /* i1, t0, t, t1 */ ) { + + throw new Error( 'call to abstract method' ); + // implementations shall return this.resultBuffer + + }, + + intervalChanged_: function ( /* i1, t0, t1 */ ) { + + // empty + + } + +} ); + +//!\ DECLARE ALIAS AFTER assign prototype ! +Object.assign( Interpolant.prototype, { + + //( 0, t, t0 ), returns this.resultBuffer + beforeStart_: Interpolant.prototype.copySampleValue_, + + //( N-1, tN-1, t ), returns this.resultBuffer + afterEnd_: Interpolant.prototype.copySampleValue_, + +} ); + + +export { Interpolant }; diff --git a/lib/math/Line3.js b/lib/math/Line3.js new file mode 100644 index 0000000..4afb80c --- /dev/null +++ b/lib/math/Line3.js @@ -0,0 +1,152 @@ +import { Vector3 } from './Vector3.js'; +import { _Math } from './Math.js'; + +/** + * @author bhouston / http://clara.io + */ + +function Line3( start, end ) { + + this.start = ( start !== undefined ) ? start : new Vector3(); + this.end = ( end !== undefined ) ? end : new Vector3(); + +} + +Object.assign( Line3.prototype, { + + set: function ( start, end ) { + + this.start.copy( start ); + this.end.copy( end ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( line ) { + + this.start.copy( line.start ); + this.end.copy( line.end ); + + return this; + + }, + + getCenter: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Line3: .getCenter() target is now required' ); + target = new Vector3(); + + } + + return target.addVectors( this.start, this.end ).multiplyScalar( 0.5 ); + + }, + + delta: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Line3: .delta() target is now required' ); + target = new Vector3(); + + } + + return target.subVectors( this.end, this.start ); + + }, + + distanceSq: function () { + + return this.start.distanceToSquared( this.end ); + + }, + + distance: function () { + + return this.start.distanceTo( this.end ); + + }, + + at: function ( t, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Line3: .at() target is now required' ); + target = new Vector3(); + + } + + return this.delta( target ).multiplyScalar( t ).add( this.start ); + + }, + + closestPointToPointParameter: function () { + + var startP = new Vector3(); + var startEnd = new Vector3(); + + return function closestPointToPointParameter( point, clampToLine ) { + + startP.subVectors( point, this.start ); + startEnd.subVectors( this.end, this.start ); + + var startEnd2 = startEnd.dot( startEnd ); + var startEnd_startP = startEnd.dot( startP ); + + var t = startEnd_startP / startEnd2; + + if ( clampToLine ) { + + t = _Math.clamp( t, 0, 1 ); + + } + + return t; + + }; + + }(), + + closestPointToPoint: function ( point, clampToLine, target ) { + + var t = this.closestPointToPointParameter( point, clampToLine ); + + if ( target === undefined ) { + + console.warn( 'THREE.Line3: .closestPointToPoint() target is now required' ); + target = new Vector3(); + + } + + return this.delta( target ).multiplyScalar( t ).add( this.start ); + + }, + + applyMatrix4: function ( matrix ) { + + this.start.applyMatrix4( matrix ); + this.end.applyMatrix4( matrix ); + + return this; + + }, + + equals: function ( line ) { + + return line.start.equals( this.start ) && line.end.equals( this.end ); + + } + +} ); + + +export { Line3 }; diff --git a/lib/math/Math.js b/lib/math/Math.js new file mode 100644 index 0000000..6b03033 --- /dev/null +++ b/lib/math/Math.js @@ -0,0 +1,153 @@ +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + +var _Math = { + + DEG2RAD: Math.PI / 180, + RAD2DEG: 180 / Math.PI, + + generateUUID: ( function () { + + // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136 + + var lut = []; + + for ( var i = 0; i < 256; i ++ ) { + + lut[ i ] = ( i < 16 ? '0' : '' ) + ( i ).toString( 16 ); + + } + + return function generateUUID() { + + var d0 = Math.random() * 0xffffffff | 0; + var d1 = Math.random() * 0xffffffff | 0; + var d2 = Math.random() * 0xffffffff | 0; + var d3 = Math.random() * 0xffffffff | 0; + var 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(); + + }; + + } )(), + + clamp: function ( value, min, max ) { + + return Math.max( min, Math.min( max, value ) ); + + }, + + // compute euclidian modulo of m % n + // https://en.wikipedia.org/wiki/Modulo_operation + + euclideanModulo: function ( n, m ) { + + return ( ( n % m ) + m ) % m; + + }, + + // Linear mapping from range to range + + mapLinear: function ( x, a1, a2, b1, b2 ) { + + return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 ); + + }, + + // https://en.wikipedia.org/wiki/Linear_interpolation + + lerp: function ( x, y, t ) { + + return ( 1 - t ) * x + t * y; + + }, + + // http://en.wikipedia.org/wiki/Smoothstep + + smoothstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * ( 3 - 2 * x ); + + }, + + smootherstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * x * ( x * ( x * 6 - 15 ) + 10 ); + + }, + + // Random integer from interval + + randInt: function ( low, high ) { + + return low + Math.floor( Math.random() * ( high - low + 1 ) ); + + }, + + // Random float from interval + + randFloat: function ( low, high ) { + + return low + Math.random() * ( high - low ); + + }, + + // Random float from <-range/2, range/2> interval + + randFloatSpread: function ( range ) { + + return range * ( 0.5 - Math.random() ); + + }, + + degToRad: function ( degrees ) { + + return degrees * _Math.DEG2RAD; + + }, + + radToDeg: function ( radians ) { + + return radians * _Math.RAD2DEG; + + }, + + isPowerOfTwo: function ( value ) { + + return ( value & ( value - 1 ) ) === 0 && value !== 0; + + }, + + ceilPowerOfTwo: function ( value ) { + + return Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) ); + + }, + + floorPowerOfTwo: function ( value ) { + + return Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) ); + + } + +}; + + +export { _Math }; diff --git a/lib/math/Matrix3.js b/lib/math/Matrix3.js new file mode 100644 index 0000000..5918293 --- /dev/null +++ b/lib/math/Matrix3.js @@ -0,0 +1,388 @@ +import { Vector3 } from './Vector3.js'; + +/** + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + * @author tschw + */ + +function Matrix3() { + + this.elements = [ + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ]; + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' ); + + } + +} + +Object.assign( Matrix3.prototype, { + + isMatrix3: true, + + set: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) { + + var te = this.elements; + + te[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31; + te[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32; + te[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33; + + return this; + + }, + + identity: function () { + + this.set( + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ); + + return this; + + }, + + clone: function () { + + return new this.constructor().fromArray( this.elements ); + + }, + + copy: function ( m ) { + + var te = this.elements; + var 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; + + }, + + setFromMatrix4: function ( m ) { + + var me = m.elements; + + this.set( + + me[ 0 ], me[ 4 ], me[ 8 ], + me[ 1 ], me[ 5 ], me[ 9 ], + me[ 2 ], me[ 6 ], me[ 10 ] + + ); + + return this; + + }, + + applyToBufferAttribute: function () { + + var v1 = new Vector3(); + + return function applyToBufferAttribute( attribute ) { + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + v1.x = attribute.getX( i ); + v1.y = attribute.getY( i ); + v1.z = attribute.getZ( i ); + + v1.applyMatrix3( this ); + + attribute.setXYZ( i, v1.x, v1.y, v1.z ); + + } + + return attribute; + + }; + + }(), + + multiply: function ( m ) { + + return this.multiplyMatrices( this, m ); + + }, + + premultiply: function ( m ) { + + return this.multiplyMatrices( m, this ); + + }, + + multiplyMatrices: function ( a, b ) { + + var ae = a.elements; + var be = b.elements; + var te = this.elements; + + var a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ]; + var a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ]; + var a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ]; + + var b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ]; + var b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ]; + var 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; + + }, + + multiplyScalar: function ( s ) { + + var te = this.elements; + + te[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s; + te[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s; + te[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s; + + return this; + + }, + + determinant: function () { + + var te = this.elements; + + var 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; + + }, + + getInverse: function ( matrix, throwOnDegenerate ) { + + if ( matrix && matrix.isMatrix4 ) { + + console.error( "THREE.Matrix3: .getInverse() no longer takes a Matrix4 argument." ); + + } + + var me = matrix.elements, + te = this.elements, + + n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], + n12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ], + n13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 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 ) { + + var msg = "THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0"; + + if ( throwOnDegenerate === true ) { + + throw new Error( msg ); + + } else { + + console.warn( msg ); + + } + + return this.identity(); + + } + + var 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; + + }, + + transpose: function () { + + var tmp, 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; + + }, + + getNormalMatrix: function ( matrix4 ) { + + return this.setFromMatrix4( matrix4 ).getInverse( this ).transpose(); + + }, + + transposeIntoArray: function ( r ) { + + var m = this.elements; + + r[ 0 ] = m[ 0 ]; + r[ 1 ] = m[ 3 ]; + r[ 2 ] = m[ 6 ]; + r[ 3 ] = m[ 1 ]; + r[ 4 ] = m[ 4 ]; + r[ 5 ] = m[ 7 ]; + r[ 6 ] = m[ 2 ]; + r[ 7 ] = m[ 5 ]; + r[ 8 ] = m[ 8 ]; + + return this; + + }, + + setUvTransform: function ( tx, ty, sx, sy, rotation, cx, cy ) { + + var c = Math.cos( rotation ); + var s = Math.sin( rotation ); + + 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 + ); + + }, + + scale: function ( sx, sy ) { + + var te = this.elements; + + te[ 0 ] *= sx; te[ 3 ] *= sx; te[ 6 ] *= sx; + te[ 1 ] *= sy; te[ 4 ] *= sy; te[ 7 ] *= sy; + + return this; + + }, + + rotate: function ( theta ) { + + var c = Math.cos( theta ); + var s = Math.sin( theta ); + + var te = this.elements; + + var a11 = te[ 0 ], a12 = te[ 3 ], a13 = te[ 6 ]; + var a21 = te[ 1 ], a22 = te[ 4 ], a23 = te[ 7 ]; + + te[ 0 ] = c * a11 + s * a21; + te[ 3 ] = c * a12 + s * a22; + te[ 6 ] = c * a13 + s * a23; + + te[ 1 ] = - s * a11 + c * a21; + te[ 4 ] = - s * a12 + c * a22; + te[ 7 ] = - s * a13 + c * a23; + + return this; + + }, + + translate: function ( tx, ty ) { + + var te = this.elements; + + te[ 0 ] += tx * te[ 2 ]; te[ 3 ] += tx * te[ 5 ]; te[ 6 ] += tx * te[ 8 ]; + te[ 1 ] += ty * te[ 2 ]; te[ 4 ] += ty * te[ 5 ]; te[ 7 ] += ty * te[ 8 ]; + + return this; + + }, + + equals: function ( matrix ) { + + var te = this.elements; + var me = matrix.elements; + + for ( var i = 0; i < 9; i ++ ) { + + if ( te[ i ] !== me[ i ] ) return false; + + } + + return true; + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + for ( var i = 0; i < 9; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + var 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; + + } + +} ); + + +export { Matrix3 }; diff --git a/lib/math/Matrix4.js b/lib/math/Matrix4.js new file mode 100644 index 0000000..53a1b50 --- /dev/null +++ b/lib/math/Matrix4.js @@ -0,0 +1,938 @@ +import { Vector3 } from './Vector3.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author jordi_ros / http://plattsoft.com + * @author D1plo1d / http://github.com/D1plo1d + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author timknip / http://www.floorplanner.com/ + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + +function Matrix4() { + + this.elements = [ + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ]; + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' ); + + } + +} + +Object.assign( Matrix4.prototype, { + + isMatrix4: true, + + set: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) { + + var te = this.elements; + + te[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14; + te[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24; + te[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34; + te[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44; + + return this; + + }, + + identity: function () { + + this.set( + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + clone: function () { + + return new Matrix4().fromArray( this.elements ); + + }, + + copy: function ( m ) { + + var te = this.elements; + var 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; + + }, + + copyPosition: function ( m ) { + + var te = this.elements, me = m.elements; + + te[ 12 ] = me[ 12 ]; + te[ 13 ] = me[ 13 ]; + te[ 14 ] = me[ 14 ]; + + return this; + + }, + + extractBasis: function ( xAxis, yAxis, zAxis ) { + + xAxis.setFromMatrixColumn( this, 0 ); + yAxis.setFromMatrixColumn( this, 1 ); + zAxis.setFromMatrixColumn( this, 2 ); + + return this; + + }, + + makeBasis: function ( 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; + + }, + + extractRotation: function () { + + var v1 = new Vector3(); + + return function extractRotation( m ) { + + // this method does not support reflection matrices + + var te = this.elements; + var me = m.elements; + + var scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length(); + var scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length(); + var scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length(); + + 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; + + }; + + }(), + + makeRotationFromEuler: function ( euler ) { + + if ( ! ( euler && euler.isEuler ) ) { + + console.error( 'THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' ); + + } + + var te = this.elements; + + var x = euler.x, y = euler.y, z = euler.z; + var a = Math.cos( x ), b = Math.sin( x ); + var c = Math.cos( y ), d = Math.sin( y ); + var e = Math.cos( z ), f = Math.sin( z ); + + if ( euler.order === 'XYZ' ) { + + var 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' ) { + + var 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' ) { + + var 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' ) { + + var 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' ) { + + var 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' ) { + + var 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; + + }, + + makeRotationFromQuaternion: function () { + + var zero = new Vector3( 0, 0, 0 ); + var one = new Vector3( 1, 1, 1 ); + + return function makeRotationFromQuaternion( q ) { + + return this.compose( zero, q, one ); + + }; + + }(), + + lookAt: function () { + + var x = new Vector3(); + var y = new Vector3(); + var z = new Vector3(); + + return function lookAt( eye, target, up ) { + + var te = this.elements; + + z.subVectors( eye, target ); + + if ( z.lengthSq() === 0 ) { + + // eye and target are in the same position + + z.z = 1; + + } + + z.normalize(); + x.crossVectors( up, z ); + + if ( x.lengthSq() === 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; + + }; + + }(), + + multiply: function ( m, n ) { + + if ( n !== undefined ) { + + console.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' ); + return this.multiplyMatrices( m, n ); + + } + + return this.multiplyMatrices( this, m ); + + }, + + premultiply: function ( m ) { + + return this.multiplyMatrices( m, this ); + + }, + + multiplyMatrices: function ( a, b ) { + + var ae = a.elements; + var be = b.elements; + var te = this.elements; + + var a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ]; + var a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ]; + var a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ]; + var a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ]; + + var b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ]; + var b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ]; + var b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ]; + var 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; + + }, + + multiplyScalar: function ( s ) { + + var te = this.elements; + + te[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s; + te[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s; + te[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s; + te[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s; + + return this; + + }, + + applyToBufferAttribute: function () { + + var v1 = new Vector3(); + + return function applyToBufferAttribute( attribute ) { + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + v1.x = attribute.getX( i ); + v1.y = attribute.getY( i ); + v1.z = attribute.getZ( i ); + + v1.applyMatrix4( this ); + + attribute.setXYZ( i, v1.x, v1.y, v1.z ); + + } + + return attribute; + + }; + + }(), + + determinant: function () { + + var te = this.elements; + + var n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ]; + var n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ]; + var n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ]; + var n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ]; + + //TODO: make this more efficient + //( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm ) + + 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 + ) + + ); + + }, + + transpose: function () { + + var te = this.elements; + var 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; + + }, + + setPosition: function ( v ) { + + var te = this.elements; + + te[ 12 ] = v.x; + te[ 13 ] = v.y; + te[ 14 ] = v.z; + + return this; + + }, + + getInverse: function ( m, throwOnDegenerate ) { + + // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm + var te = this.elements, + me = m.elements, + + n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ], + n12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ], + n13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ], + n14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 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; + + var det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14; + + if ( det === 0 ) { + + var msg = "THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0"; + + if ( throwOnDegenerate === true ) { + + throw new Error( msg ); + + } else { + + console.warn( msg ); + + } + + return this.identity(); + + } + + var 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; + + }, + + scale: function ( v ) { + + var te = this.elements; + var x = v.x, y = v.y, z = v.z; + + te[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z; + te[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z; + te[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z; + te[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z; + + return this; + + }, + + getMaxScaleOnAxis: function () { + + var te = this.elements; + + var scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ]; + var scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ]; + var scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ]; + + return Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) ); + + }, + + makeTranslation: function ( x, y, z ) { + + this.set( + + 1, 0, 0, x, + 0, 1, 0, y, + 0, 0, 1, z, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationX: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + 1, 0, 0, 0, + 0, c, - s, 0, + 0, s, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationY: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationZ: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, - s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationAxis: function ( axis, angle ) { + + // Based on http://www.gamedev.net/reference/articles/article1199.asp + + var c = Math.cos( angle ); + var s = Math.sin( angle ); + var t = 1 - c; + var x = axis.x, y = axis.y, z = axis.z; + var tx = t * x, ty = t * y; + + 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 + + ); + + return this; + + }, + + makeScale: function ( x, y, z ) { + + this.set( + + x, 0, 0, 0, + 0, y, 0, 0, + 0, 0, z, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeShear: function ( x, y, z ) { + + this.set( + + 1, y, z, 0, + x, 1, z, 0, + x, y, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + compose: function ( position, quaternion, scale ) { + + var te = this.elements; + + var x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w; + var x2 = x + x, y2 = y + y, z2 = z + z; + var xx = x * x2, xy = x * y2, xz = x * z2; + var yy = y * y2, yz = y * z2, zz = z * z2; + var wx = w * x2, wy = w * y2, wz = w * z2; + + var 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; + + }, + + decompose: function () { + + var vector = new Vector3(); + var matrix = new Matrix4(); + + return function decompose( position, quaternion, scale ) { + + var te = this.elements; + + var sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length(); + var sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length(); + var sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length(); + + // if determine is negative, we need to invert one scale + var det = this.determinant(); + if ( det < 0 ) sx = - sx; + + position.x = te[ 12 ]; + position.y = te[ 13 ]; + position.z = te[ 14 ]; + + // scale the rotation part + matrix.copy( this ); + + var invSX = 1 / sx; + var invSY = 1 / sy; + var invSZ = 1 / sz; + + matrix.elements[ 0 ] *= invSX; + matrix.elements[ 1 ] *= invSX; + matrix.elements[ 2 ] *= invSX; + + matrix.elements[ 4 ] *= invSY; + matrix.elements[ 5 ] *= invSY; + matrix.elements[ 6 ] *= invSY; + + matrix.elements[ 8 ] *= invSZ; + matrix.elements[ 9 ] *= invSZ; + matrix.elements[ 10 ] *= invSZ; + + quaternion.setFromRotationMatrix( matrix ); + + scale.x = sx; + scale.y = sy; + scale.z = sz; + + return this; + + }; + + }(), + + makePerspective: function ( left, right, top, bottom, near, far ) { + + if ( far === undefined ) { + + console.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' ); + + } + + var te = this.elements; + var x = 2 * near / ( right - left ); + var y = 2 * near / ( top - bottom ); + + var a = ( right + left ) / ( right - left ); + var b = ( top + bottom ) / ( top - bottom ); + var c = - ( far + near ) / ( far - near ); + var d = - 2 * far * near / ( far - near ); + + te[ 0 ] = x; te[ 4 ] = 0; te[ 8 ] = a; te[ 12 ] = 0; + te[ 1 ] = 0; te[ 5 ] = y; te[ 9 ] = b; te[ 13 ] = 0; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = c; te[ 14 ] = d; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = - 1; te[ 15 ] = 0; + + return this; + + }, + + makeOrthographic: function ( left, right, top, bottom, near, far ) { + + var te = this.elements; + var w = 1.0 / ( right - left ); + var h = 1.0 / ( top - bottom ); + var p = 1.0 / ( far - near ); + + var x = ( right + left ) * w; + var y = ( top + bottom ) * h; + var z = ( far + near ) * p; + + te[ 0 ] = 2 * w; te[ 4 ] = 0; te[ 8 ] = 0; te[ 12 ] = - x; + te[ 1 ] = 0; te[ 5 ] = 2 * h; te[ 9 ] = 0; te[ 13 ] = - y; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = - 2 * p; te[ 14 ] = - z; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = 0; te[ 15 ] = 1; + + return this; + + }, + + equals: function ( matrix ) { + + var te = this.elements; + var me = matrix.elements; + + for ( var i = 0; i < 16; i ++ ) { + + if ( te[ i ] !== me[ i ] ) return false; + + } + + return true; + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + for ( var i = 0; i < 16; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + var 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; + + } + +} ); + + +export { Matrix4 }; diff --git a/lib/math/Plane.js b/lib/math/Plane.js new file mode 100644 index 0000000..2f20965 --- /dev/null +++ b/lib/math/Plane.js @@ -0,0 +1,245 @@ +import { Matrix3 } from './Matrix3.js'; +import { Vector3 } from './Vector3.js'; + +/** + * @author bhouston / http://clara.io + */ + +function Plane( normal, constant ) { + + // normal is assumed to be normalized + + this.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 ); + this.constant = ( constant !== undefined ) ? constant : 0; + +} + +Object.assign( Plane.prototype, { + + set: function ( normal, constant ) { + + this.normal.copy( normal ); + this.constant = constant; + + return this; + + }, + + setComponents: function ( x, y, z, w ) { + + this.normal.set( x, y, z ); + this.constant = w; + + return this; + + }, + + setFromNormalAndCoplanarPoint: function ( normal, point ) { + + this.normal.copy( normal ); + this.constant = - point.dot( this.normal ); + + return this; + + }, + + setFromCoplanarPoints: function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function setFromCoplanarPoints( a, b, c ) { + + var normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize(); + + // Q: should an error be thrown if normal is zero (e.g. degenerate plane)? + + this.setFromNormalAndCoplanarPoint( normal, a ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( plane ) { + + this.normal.copy( plane.normal ); + this.constant = plane.constant; + + return this; + + }, + + normalize: function () { + + // Note: will lead to a divide by zero if the plane is invalid. + + var inverseNormalLength = 1.0 / this.normal.length(); + this.normal.multiplyScalar( inverseNormalLength ); + this.constant *= inverseNormalLength; + + return this; + + }, + + negate: function () { + + this.constant *= - 1; + this.normal.negate(); + + return this; + + }, + + distanceToPoint: function ( point ) { + + return this.normal.dot( point ) + this.constant; + + }, + + distanceToSphere: function ( sphere ) { + + return this.distanceToPoint( sphere.center ) - sphere.radius; + + }, + + projectPoint: function ( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Plane: .projectPoint() target is now required' ); + target = new Vector3(); + + } + + return target.copy( this.normal ).multiplyScalar( - this.distanceToPoint( point ) ).add( point ); + + }, + + intersectLine: function () { + + var v1 = new Vector3(); + + return function intersectLine( line, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Plane: .intersectLine() target is now required' ); + target = new Vector3(); + + } + + var direction = line.delta( v1 ); + + var denominator = this.normal.dot( direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( this.distanceToPoint( line.start ) === 0 ) { + + return target.copy( line.start ); + + } + + // Unsure if this is the correct method to handle this case. + return undefined; + + } + + var t = - ( line.start.dot( this.normal ) + this.constant ) / denominator; + + if ( t < 0 || t > 1 ) { + + return undefined; + + } + + return target.copy( direction ).multiplyScalar( t ).add( line.start ); + + }; + + }(), + + intersectsLine: function ( line ) { + + // Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it. + + var startSign = this.distanceToPoint( line.start ); + var endSign = this.distanceToPoint( line.end ); + + return ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsPlane( this ); + + }, + + intersectsSphere: function ( sphere ) { + + return sphere.intersectsPlane( this ); + + }, + + coplanarPoint: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Plane: .coplanarPoint() target is now required' ); + target = new Vector3(); + + } + + return target.copy( this.normal ).multiplyScalar( - this.constant ); + + }, + + applyMatrix4: function () { + + var v1 = new Vector3(); + var m1 = new Matrix3(); + + return function applyMatrix4( matrix, optionalNormalMatrix ) { + + var normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix ); + + var referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix ); + + var normal = this.normal.applyMatrix3( normalMatrix ).normalize(); + + this.constant = - referencePoint.dot( normal ); + + return this; + + }; + + }(), + + translate: function ( offset ) { + + this.constant -= offset.dot( this.normal ); + + return this; + + }, + + equals: function ( plane ) { + + return plane.normal.equals( this.normal ) && ( plane.constant === this.constant ); + + } + +} ); + + +export { Plane }; diff --git a/lib/math/Quaternion.js b/lib/math/Quaternion.js new file mode 100644 index 0000000..f2aee0d --- /dev/null +++ b/lib/math/Quaternion.js @@ -0,0 +1,637 @@ +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + +import { _Math } from './Math.js'; +import { Vector3 } from './Vector3.js'; + +function Quaternion( x, y, z, w ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._w = ( w !== undefined ) ? w : 1; + +} + +Object.assign( Quaternion, { + + slerp: function ( qa, qb, qm, t ) { + + return qm.copy( qa ).slerp( qb, t ); + + }, + + slerpFlat: function ( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) { + + // fuzz-free, array-based Quaternion SLERP operation + + var x0 = src0[ srcOffset0 + 0 ], + y0 = src0[ srcOffset0 + 1 ], + z0 = src0[ srcOffset0 + 2 ], + w0 = src0[ srcOffset0 + 3 ], + + x1 = src1[ srcOffset1 + 0 ], + y1 = src1[ srcOffset1 + 1 ], + z1 = src1[ srcOffset1 + 2 ], + w1 = src1[ srcOffset1 + 3 ]; + + if ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) { + + var s = 1 - t, + + cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1, + + dir = ( cos >= 0 ? 1 : - 1 ), + sqrSin = 1 - cos * cos; + + // Skip the Slerp for tiny steps to avoid numeric problems: + if ( sqrSin > Number.EPSILON ) { + + var sin = Math.sqrt( sqrSin ), + len = Math.atan2( sin, cos * dir ); + + s = Math.sin( s * len ) / sin; + t = Math.sin( t * len ) / sin; + + } + + var tDir = t * dir; + + x0 = x0 * s + x1 * tDir; + y0 = y0 * s + y1 * tDir; + z0 = z0 * s + z1 * tDir; + w0 = w0 * s + w1 * tDir; + + // Normalize in case we just did a lerp: + if ( s === 1 - t ) { + + var 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; + + } + +} ); + +Object.defineProperties( Quaternion.prototype, { + + x: { + + get: function () { + + return this._x; + + }, + + set: function ( value ) { + + this._x = value; + this.onChangeCallback(); + + } + + }, + + y: { + + get: function () { + + return this._y; + + }, + + set: function ( value ) { + + this._y = value; + this.onChangeCallback(); + + } + + }, + + z: { + + get: function () { + + return this._z; + + }, + + set: function ( value ) { + + this._z = value; + this.onChangeCallback(); + + } + + }, + + w: { + + get: function () { + + return this._w; + + }, + + set: function ( value ) { + + this._w = value; + this.onChangeCallback(); + + } + + } + +} ); + +Object.assign( Quaternion.prototype, { + + isQuaternion: true, + + set: function ( x, y, z, w ) { + + this._x = x; + this._y = y; + this._z = z; + this._w = w; + + this.onChangeCallback(); + + return this; + + }, + + clone: function () { + + return new this.constructor( this._x, this._y, this._z, this._w ); + + }, + + copy: function ( quaternion ) { + + this._x = quaternion.x; + this._y = quaternion.y; + this._z = quaternion.z; + this._w = quaternion.w; + + this.onChangeCallback(); + + return this; + + }, + + setFromEuler: function ( euler, update ) { + + if ( ! ( euler && euler.isEuler ) ) { + + throw new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' ); + + } + + var x = euler._x, y = euler._y, z = euler._z, order = euler.order; + + // http://www.mathworks.com/matlabcentral/fileexchange/ + // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/ + // content/SpinCalc.m + + var cos = Math.cos; + var sin = Math.sin; + + var c1 = cos( x / 2 ); + var c2 = cos( y / 2 ); + var c3 = cos( z / 2 ); + + var s1 = sin( x / 2 ); + var s2 = sin( y / 2 ); + var s3 = 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; + + } + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromAxisAngle: function ( axis, angle ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm + + // assumes axis is normalized + + var 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; + + }, + + setFromRotationMatrix: function ( 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) + + var 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, + 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; + + }, + + setFromUnitVectors: function () { + + // assumes direction vectors vFrom and vTo are normalized + + var v1 = new Vector3(); + var r; + + var EPS = 0.000001; + + return function setFromUnitVectors( vFrom, vTo ) { + + if ( v1 === undefined ) v1 = new Vector3(); + + r = vFrom.dot( vTo ) + 1; + + if ( r < EPS ) { + + r = 0; + + if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) { + + v1.set( - vFrom.y, vFrom.x, 0 ); + + } else { + + v1.set( 0, - vFrom.z, vFrom.y ); + + } + + } else { + + v1.crossVectors( vFrom, vTo ); + + } + + this._x = v1.x; + this._y = v1.y; + this._z = v1.z; + this._w = r; + + return this.normalize(); + + }; + + }(), + + angleTo: function ( q ) { + + return 2 * Math.acos( Math.abs( _Math.clamp( this.dot( q ), - 1, 1 ) ) ); + + }, + + rotateTowards: function ( q, step ) { + + var angle = this.angleTo( q ); + + if ( angle === 0 ) return this; + + var t = Math.min( 1, step / angle ); + + this.slerp( q, t ); + + return this; + + }, + + inverse: function () { + + // quaternion is assumed to have unit length + + return this.conjugate(); + + }, + + conjugate: function () { + + this._x *= - 1; + this._y *= - 1; + this._z *= - 1; + + this.onChangeCallback(); + + return this; + + }, + + dot: function ( v ) { + + return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w; + + }, + + lengthSq: function () { + + return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w; + + }, + + length: function () { + + return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w ); + + }, + + normalize: function () { + + var 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; + + }, + + multiply: function ( q, p ) { + + if ( p !== undefined ) { + + console.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' ); + return this.multiplyQuaternions( q, p ); + + } + + return this.multiplyQuaternions( this, q ); + + }, + + premultiply: function ( q ) { + + return this.multiplyQuaternions( q, this ); + + }, + + multiplyQuaternions: function ( a, b ) { + + // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm + + var qax = a._x, qay = a._y, qaz = a._z, qaw = a._w; + var 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; + + }, + + slerp: function ( qb, t ) { + + if ( t === 0 ) return this; + if ( t === 1 ) return this.copy( qb ); + + var x = this._x, y = this._y, z = this._z, w = this._w; + + // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/ + + var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z; + + if ( cosHalfTheta < 0 ) { + + this._w = - qb._w; + this._x = - qb._x; + this._y = - qb._y; + this._z = - qb._z; + + cosHalfTheta = - cosHalfTheta; + + } else { + + this.copy( qb ); + + } + + if ( cosHalfTheta >= 1.0 ) { + + this._w = w; + this._x = x; + this._y = y; + this._z = z; + + return this; + + } + + var sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta; + + if ( sqrSinHalfTheta <= Number.EPSILON ) { + + var s = 1 - t; + this._w = s * w + t * this._w; + this._x = s * x + t * this._x; + this._y = s * y + t * this._y; + this._z = s * z + t * this._z; + + return this.normalize(); + + } + + var sinHalfTheta = Math.sqrt( sqrSinHalfTheta ); + var halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta ); + var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta, + ratioB = Math.sin( t * halfTheta ) / sinHalfTheta; + + this._w = ( w * ratioA + this._w * ratioB ); + this._x = ( x * ratioA + this._x * ratioB ); + this._y = ( y * ratioA + this._y * ratioB ); + this._z = ( z * ratioA + this._z * ratioB ); + + this.onChangeCallback(); + + return this; + + }, + + equals: function ( quaternion ) { + + return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this._x = array[ offset ]; + this._y = array[ offset + 1 ]; + this._z = array[ offset + 2 ]; + this._w = array[ offset + 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._w; + + return array; + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {} + +} ); + + +export { Quaternion }; diff --git a/lib/math/Ray.js b/lib/math/Ray.js new file mode 100644 index 0000000..27d1fc2 --- /dev/null +++ b/lib/math/Ray.js @@ -0,0 +1,546 @@ +import { Vector3 } from './Vector3.js'; + +/** + * @author bhouston / http://clara.io + */ + +function Ray( origin, direction ) { + + this.origin = ( origin !== undefined ) ? origin : new Vector3(); + this.direction = ( direction !== undefined ) ? direction : new Vector3(); + +} + +Object.assign( Ray.prototype, { + + set: function ( origin, direction ) { + + this.origin.copy( origin ); + this.direction.copy( direction ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( ray ) { + + this.origin.copy( ray.origin ); + this.direction.copy( ray.direction ); + + return this; + + }, + + at: function ( t, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Ray: .at() target is now required' ); + target = new Vector3(); + + } + + return target.copy( this.direction ).multiplyScalar( t ).add( this.origin ); + + }, + + lookAt: function ( v ) { + + this.direction.copy( v ).sub( this.origin ).normalize(); + + return this; + + }, + + recast: function () { + + var v1 = new Vector3(); + + return function recast( t ) { + + this.origin.copy( this.at( t, v1 ) ); + + return this; + + }; + + }(), + + closestPointToPoint: function ( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Ray: .closestPointToPoint() target is now required' ); + target = new Vector3(); + + } + + target.subVectors( point, this.origin ); + + var directionDistance = target.dot( this.direction ); + + if ( directionDistance < 0 ) { + + return target.copy( this.origin ); + + } + + return target.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + }, + + distanceToPoint: function ( point ) { + + return Math.sqrt( this.distanceSqToPoint( point ) ); + + }, + + distanceSqToPoint: function () { + + var v1 = new Vector3(); + + return function distanceSqToPoint( point ) { + + var directionDistance = v1.subVectors( point, this.origin ).dot( this.direction ); + + // point behind the ray + + if ( directionDistance < 0 ) { + + return this.origin.distanceToSquared( point ); + + } + + v1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + return v1.distanceToSquared( point ); + + }; + + }(), + + distanceSqToSegment: function () { + + var segCenter = new Vector3(); + var segDir = new Vector3(); + var diff = new Vector3(); + + return function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) { + + // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h + // It returns the min distance between the ray and the segment + // defined by v0 and v1 + // It can also set two optional targets : + // - The closest point on the ray + // - The closest point on the segment + + segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 ); + segDir.copy( v1 ).sub( v0 ).normalize(); + diff.copy( this.origin ).sub( segCenter ); + + var segExtent = v0.distanceTo( v1 ) * 0.5; + var a01 = - this.direction.dot( segDir ); + var b0 = diff.dot( this.direction ); + var b1 = - diff.dot( segDir ); + var c = diff.lengthSq(); + var det = Math.abs( 1 - a01 * a01 ); + var s0, s1, sqrDist, extDet; + + if ( det > 0 ) { + + // The ray and segment are not parallel. + + s0 = a01 * b1 - b0; + s1 = a01 * b0 - b1; + extDet = segExtent * det; + + if ( s0 >= 0 ) { + + if ( s1 >= - extDet ) { + + if ( s1 <= extDet ) { + + // region 0 + // Minimum at interior points of ray and segment. + + var invDet = 1 / det; + s0 *= invDet; + s1 *= invDet; + sqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c; + + } else { + + // region 1 + + s1 = segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + // region 5 + + s1 = - segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + if ( s1 <= - extDet ) { + + // region 4 + + s0 = Math.max( 0, - ( - a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } else if ( s1 <= extDet ) { + + // region 3 + + s0 = 0; + s1 = Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = s1 * ( s1 + 2 * b1 ) + c; + + } else { + + // region 2 + + s0 = Math.max( 0, - ( a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } + + } else { + + // Ray and segment are parallel. + + s1 = ( a01 > 0 ) ? - segExtent : segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + if ( optionalPointOnRay ) { + + optionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin ); + + } + + if ( optionalPointOnSegment ) { + + optionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter ); + + } + + return sqrDist; + + }; + + }(), + + intersectSphere: function () { + + var v1 = new Vector3(); + + return function intersectSphere( sphere, target ) { + + v1.subVectors( sphere.center, this.origin ); + var tca = v1.dot( this.direction ); + var d2 = v1.dot( v1 ) - tca * tca; + var radius2 = sphere.radius * sphere.radius; + + if ( d2 > radius2 ) return null; + + var thc = Math.sqrt( radius2 - d2 ); + + // t0 = first intersect point - entrance on front of sphere + var t0 = tca - thc; + + // t1 = second intersect point - exit point on back of sphere + var 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 ); + + }; + + }(), + + intersectsSphere: function ( sphere ) { + + return this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius ); + + }, + + distanceToPlane: function ( plane ) { + + var 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; + + } + + var t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator; + + // Return if the ray never intersects the plane + + return t >= 0 ? t : null; + + }, + + intersectPlane: function ( plane, target ) { + + var t = this.distanceToPlane( plane ); + + if ( t === null ) { + + return null; + + } + + return this.at( t, target ); + + }, + + intersectsPlane: function ( plane ) { + + // check if the ray lies on the plane first + + var distToPoint = plane.distanceToPoint( this.origin ); + + if ( distToPoint === 0 ) { + + return true; + + } + + var 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; + + }, + + intersectBox: function ( box, target ) { + + var tmin, tmax, tymin, tymax, tzmin, tzmax; + + var invdirx = 1 / this.direction.x, + invdiry = 1 / this.direction.y, + invdirz = 1 / this.direction.z; + + var 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 ); + + }, + + intersectsBox: ( function () { + + var v = new Vector3(); + + return function intersectsBox( box ) { + + return this.intersectBox( box, v ) !== null; + + }; + + } )(), + + intersectTriangle: function () { + + // Compute the offset origin, edges, and normal. + var diff = new Vector3(); + var edge1 = new Vector3(); + var edge2 = new Vector3(); + var normal = new Vector3(); + + return function intersectTriangle( a, b, c, backfaceCulling, target ) { + + // from http://www.geometrictools.com/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) + var DdN = this.direction.dot( normal ); + var 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 ); + var DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) ); + + // b1 < 0, no intersection + if ( DdQxE2 < 0 ) { + + return null; + + } + + var 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. + var QdN = - sign * diff.dot( normal ); + + // t < 0, no intersection + if ( QdN < 0 ) { + + return null; + + } + + // Ray intersects triangle. + return this.at( QdN / DdN, target ); + + }; + + }(), + + applyMatrix4: function ( matrix4 ) { + + this.origin.applyMatrix4( matrix4 ); + this.direction.transformDirection( matrix4 ); + + return this; + + }, + + equals: function ( ray ) { + + return ray.origin.equals( this.origin ) && ray.direction.equals( this.direction ); + + } + +} ); + + +export { Ray }; diff --git a/lib/math/Sphere.js b/lib/math/Sphere.js new file mode 100644 index 0000000..430c836 --- /dev/null +++ b/lib/math/Sphere.js @@ -0,0 +1,180 @@ +import { Box3 } from './Box3.js'; +import { Vector3 } from './Vector3.js'; + +/** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + +function Sphere( center, radius ) { + + this.center = ( center !== undefined ) ? center : new Vector3(); + this.radius = ( radius !== undefined ) ? radius : 0; + +} + +Object.assign( Sphere.prototype, { + + set: function ( center, radius ) { + + this.center.copy( center ); + this.radius = radius; + + return this; + + }, + + setFromPoints: function () { + + var box = new Box3(); + + return function setFromPoints( points, optionalCenter ) { + + var center = this.center; + + if ( optionalCenter !== undefined ) { + + center.copy( optionalCenter ); + + } else { + + box.setFromPoints( points ).getCenter( center ); + + } + + var maxRadiusSq = 0; + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) ); + + } + + this.radius = Math.sqrt( maxRadiusSq ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( sphere ) { + + this.center.copy( sphere.center ); + this.radius = sphere.radius; + + return this; + + }, + + empty: function () { + + return ( this.radius <= 0 ); + + }, + + containsPoint: function ( point ) { + + return ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) ); + + }, + + distanceToPoint: function ( point ) { + + return ( point.distanceTo( this.center ) - this.radius ); + + }, + + intersectsSphere: function ( sphere ) { + + var radiusSum = this.radius + sphere.radius; + + return sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsSphere( this ); + + }, + + intersectsPlane: function ( plane ) { + + return Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius; + + }, + + clampPoint: function ( point, target ) { + + var deltaLengthSq = this.center.distanceToSquared( point ); + + if ( target === undefined ) { + + console.warn( 'THREE.Sphere: .clampPoint() target is now required' ); + target = new Vector3(); + + } + + target.copy( point ); + + if ( deltaLengthSq > ( this.radius * this.radius ) ) { + + target.sub( this.center ).normalize(); + target.multiplyScalar( this.radius ).add( this.center ); + + } + + return target; + + }, + + getBoundingBox: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Sphere: .getBoundingBox() target is now required' ); + target = new Box3(); + + } + + target.set( this.center, this.center ); + target.expandByScalar( this.radius ); + + return target; + + }, + + applyMatrix4: function ( matrix ) { + + this.center.applyMatrix4( matrix ); + this.radius = this.radius * matrix.getMaxScaleOnAxis(); + + return this; + + }, + + translate: function ( offset ) { + + this.center.add( offset ); + + return this; + + }, + + equals: function ( sphere ) { + + return sphere.center.equals( this.center ) && ( sphere.radius === this.radius ); + + } + +} ); + + +export { Sphere }; diff --git a/lib/math/Spherical.js b/lib/math/Spherical.js new file mode 100644 index 0000000..75fd25e --- /dev/null +++ b/lib/math/Spherical.js @@ -0,0 +1,90 @@ +import { _Math } from './Math.js'; + +/** + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + * + * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system + * + * The polar angle (phi) is measured from the positive y-axis. The positive y-axis is up. + * The azimuthal angle (theta) is measured from the positive z-axiz. + */ + +function Spherical( radius, phi, theta ) { + + this.radius = ( radius !== undefined ) ? radius : 1.0; + this.phi = ( phi !== undefined ) ? phi : 0; // polar angle + this.theta = ( theta !== undefined ) ? theta : 0; // azimuthal angle + + return this; + +} + +Object.assign( Spherical.prototype, { + + set: function ( radius, phi, theta ) { + + this.radius = radius; + this.phi = phi; + this.theta = theta; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( other ) { + + this.radius = other.radius; + this.phi = other.phi; + this.theta = other.theta; + + return this; + + }, + + // restrict phi to be betwee EPS and PI-EPS + makeSafe: function () { + + var EPS = 0.000001; + this.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) ); + + return this; + + }, + + setFromVector3: function ( v ) { + + return this.setFromCartesianCoords( v.x, v.y, v.z ); + + }, + + setFromCartesianCoords: function ( x, y, z ) { + + this.radius = Math.sqrt( x * x + y * y + z * z ); + + if ( this.radius === 0 ) { + + this.theta = 0; + this.phi = 0; + + } else { + + this.theta = Math.atan2( x, z ); + this.phi = Math.acos( _Math.clamp( y / this.radius, - 1, 1 ) ); + + } + + return this; + + } + +} ); + + +export { Spherical }; diff --git a/lib/math/Triangle.js b/lib/math/Triangle.js new file mode 100644 index 0000000..328604d --- /dev/null +++ b/lib/math/Triangle.js @@ -0,0 +1,349 @@ +import { Vector3 } from './Vector3.js'; + +/** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + +function Triangle( a, b, c ) { + + this.a = ( a !== undefined ) ? a : new Vector3(); + this.b = ( b !== undefined ) ? b : new Vector3(); + this.c = ( c !== undefined ) ? c : new Vector3(); + +} + +Object.assign( Triangle, { + + getNormal: function () { + + var v0 = new Vector3(); + + return function getNormal( a, b, c, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .getNormal() target is now required' ); + target = new Vector3(); + + } + + target.subVectors( c, b ); + v0.subVectors( a, b ); + target.cross( v0 ); + + var targetLengthSq = target.lengthSq(); + if ( targetLengthSq > 0 ) { + + return target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) ); + + } + + return target.set( 0, 0, 0 ); + + }; + + }(), + + // static/instance method to calculate barycentric coordinates + // based on: http://www.blackpawn.com/texts/pointinpoly/default.html + getBarycoord: function () { + + var v0 = new Vector3(); + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function getBarycoord( point, a, b, c, target ) { + + v0.subVectors( c, a ); + v1.subVectors( b, a ); + v2.subVectors( point, a ); + + 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 denom = ( dot00 * dot11 - dot01 * dot01 ); + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .getBarycoord() target is now required' ); + 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 target.set( - 2, - 1, - 1 ); + + } + + var invDenom = 1 / denom; + var u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom; + var v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom; + + // barycentric coordinates must always sum to 1 + return target.set( 1 - u - v, v, u ); + + }; + + }(), + + containsPoint: function () { + + var v1 = new Vector3(); + + return function containsPoint( point, a, b, c ) { + + Triangle.getBarycoord( point, a, b, c, v1 ); + + return ( v1.x >= 0 ) && ( v1.y >= 0 ) && ( ( v1.x + v1.y ) <= 1 ); + + }; + + }(), + + getUV: function () { + + var barycoord = new Vector3(); + + return function getUV( point, p1, p2, p3, uv1, uv2, uv3, target ) { + + this.getBarycoord( point, p1, p2, p3, barycoord ); + + target.set( 0, 0 ); + target.addScaledVector( uv1, barycoord.x ); + target.addScaledVector( uv2, barycoord.y ); + target.addScaledVector( uv3, barycoord.z ); + + return target; + + }; + + }() + +} ); + +Object.assign( Triangle.prototype, { + + set: function ( a, b, c ) { + + this.a.copy( a ); + this.b.copy( b ); + this.c.copy( c ); + + return this; + + }, + + setFromPointsAndIndices: function ( points, i0, i1, i2 ) { + + this.a.copy( points[ i0 ] ); + this.b.copy( points[ i1 ] ); + this.c.copy( points[ i2 ] ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( triangle ) { + + this.a.copy( triangle.a ); + this.b.copy( triangle.b ); + this.c.copy( triangle.c ); + + return this; + + }, + + getArea: function () { + + var v0 = new Vector3(); + var v1 = new Vector3(); + + return function getArea() { + + v0.subVectors( this.c, this.b ); + v1.subVectors( this.a, this.b ); + + return v0.cross( v1 ).length() * 0.5; + + }; + + }(), + + getMidpoint: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .getMidpoint() target is now required' ); + target = new Vector3(); + + } + + return target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 ); + + }, + + getNormal: function ( target ) { + + return Triangle.getNormal( this.a, this.b, this.c, target ); + + }, + + getPlane: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .getPlane() target is now required' ); + target = new Vector3(); + + } + + return target.setFromCoplanarPoints( this.a, this.b, this.c ); + + }, + + getBarycoord: function ( point, target ) { + + return Triangle.getBarycoord( point, this.a, this.b, this.c, target ); + + }, + + containsPoint: function ( point ) { + + return Triangle.containsPoint( point, this.a, this.b, this.c ); + + }, + + getUV: function ( point, uv1, uv2, uv3, result ) { + + return Triangle.getUV( point, this.a, this.b, this.c, uv1, uv2, uv3, result ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsTriangle( this ); + + }, + + closestPointToPoint: function () { + + var vab = new Vector3(); + var vac = new Vector3(); + var vbc = new Vector3(); + var vap = new Vector3(); + var vbp = new Vector3(); + var vcp = new Vector3(); + + return function closestPointToPoint( p, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .closestPointToPoint() target is now required' ); + target = new Vector3(); + + } + + var a = this.a, b = this.b, c = this.c; + var v, w; + + // algorithm thanks to Real-Time Collision Detection by Christer Ericson, + // published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc., + // under the accompanying license; see chapter 5.1.5 for detailed explanation. + // basically, we're distinguishing which of the voronoi regions of the triangle + // the point lies in with the minimum amount of redundant computation. + + vab.subVectors( b, a ); + vac.subVectors( c, a ); + vap.subVectors( p, a ); + var d1 = vab.dot( vap ); + var d2 = vac.dot( vap ); + if ( d1 <= 0 && d2 <= 0 ) { + + // vertex region of A; barycentric coords (1, 0, 0) + return target.copy( a ); + + } + + vbp.subVectors( p, b ); + var d3 = vab.dot( vbp ); + var d4 = vac.dot( vbp ); + if ( d3 >= 0 && d4 <= d3 ) { + + // vertex region of B; barycentric coords (0, 1, 0) + return target.copy( b ); + + } + + var vc = d1 * d4 - d3 * d2; + if ( vc <= 0 && d1 >= 0 && d3 <= 0 ) { + + v = d1 / ( d1 - d3 ); + // edge region of AB; barycentric coords (1-v, v, 0) + return target.copy( a ).addScaledVector( vab, v ); + + } + + vcp.subVectors( p, c ); + var d5 = vab.dot( vcp ); + var d6 = vac.dot( vcp ); + if ( d6 >= 0 && d5 <= d6 ) { + + // vertex region of C; barycentric coords (0, 0, 1) + return target.copy( c ); + + } + + var vb = d5 * d2 - d1 * d6; + if ( vb <= 0 && d2 >= 0 && d6 <= 0 ) { + + w = d2 / ( d2 - d6 ); + // edge region of AC; barycentric coords (1-w, 0, w) + return target.copy( a ).addScaledVector( vac, w ); + + } + + var va = d3 * d6 - d5 * d4; + if ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) { + + vbc.subVectors( c, b ); + w = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) ); + // edge region of BC; barycentric coords (0, 1-w, w) + return target.copy( b ).addScaledVector( vbc, w ); // edge region of BC + + } + + // face region + var denom = 1 / ( va + vb + vc ); + // u = va * denom + v = vb * denom; + w = vc * denom; + return target.copy( a ).addScaledVector( vab, v ).addScaledVector( vac, w ); + + }; + + }(), + + equals: function ( triangle ) { + + return triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c ); + + } + +} ); + + +export { Triangle }; diff --git a/lib/math/Vector2.js b/lib/math/Vector2.js new file mode 100644 index 0000000..2e6de62 --- /dev/null +++ b/lib/math/Vector2.js @@ -0,0 +1,499 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author philogb / http://blog.thejit.org/ + * @author egraether / http://egraether.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + +function Vector2( x, y ) { + + this.x = x || 0; + this.y = y || 0; + +} + +Object.defineProperties( Vector2.prototype, { + + "width": { + + get: function () { + + return this.x; + + }, + + set: function ( value ) { + + this.x = value; + + } + + }, + + "height": { + + get: function () { + + return this.y; + + }, + + set: function ( value ) { + + this.y = value; + + } + + } + +} ); + +Object.assign( Vector2.prototype, { + + isVector2: true, + + set: function ( x, y ) { + + this.x = x; + this.y = y; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + + return this; + + }, + + multiply: function ( v ) { + + this.x *= v.x; + this.y *= v.y; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + this.x *= scalar; + this.y *= scalar; + + return this; + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + applyMatrix3: function ( m ) { + + var x = this.x, y = this.y; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ]; + this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ]; + + return this; + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + + return this; + + }, + + clamp: function ( min, max ) { + + // assumes min < max, componentwise + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + + return this; + + }, + + clampScalar: function () { + + var min = new Vector2(); + var max = new Vector2(); + + return function clampScalar( minVal, maxVal ) { + + min.set( minVal, minVal ); + max.set( maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y; + + }, + + cross: function ( v ) { + + return this.x * v.y - this.y * v.x; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y ); + + }, + + manhattanLength: function () { + + return Math.abs( this.x ) + Math.abs( this.y ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() || 1 ); + + }, + + angle: function () { + + // computes the angle in radians with respect to the positive x-axis + + var angle = Math.atan2( this.y, this.x ); + + if ( angle < 0 ) angle += 2 * Math.PI; + + return angle; + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x, dy = this.y - v.y; + return dx * dx + dy * dy; + + }, + + manhattanDistanceTo: function ( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ); + + }, + + setLength: function ( length ) { + + return this.normalize().multiplyScalar( length ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + + return this; + + }, + + rotateAround: function ( center, angle ) { + + var c = Math.cos( angle ), s = Math.sin( angle ); + + var x = this.x - center.x; + var y = this.y - center.y; + + this.x = x * c - y * s + center.x; + this.y = x * s + y * c + center.y; + + return this; + + } + +} ); + + +export { Vector2 }; diff --git a/lib/math/Vector3.js b/lib/math/Vector3.js new file mode 100644 index 0000000..3036f9c --- /dev/null +++ b/lib/math/Vector3.js @@ -0,0 +1,734 @@ +import { _Math } from './Math.js'; +import { Matrix4 } from './Matrix4.js'; +import { Quaternion } from './Quaternion.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author kile / http://kile.stravaganza.org/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + +function Vector3( x, y, z ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + +} + +Object.assign( Vector3.prototype, { + + isVector3: true, + + set: function ( x, y, z ) { + + this.x = x; + this.y = y; + this.z = z; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y, this.z ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + + return this; + + }, + + multiply: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' ); + return this.multiplyVectors( v, w ); + + } + + this.x *= v.x; + this.y *= v.y; + this.z *= v.z; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + + return this; + + }, + + multiplyVectors: function ( a, b ) { + + this.x = a.x * b.x; + this.y = a.y * b.y; + this.z = a.z * b.z; + + return this; + + }, + + applyEuler: function () { + + var quaternion = new Quaternion(); + + return function applyEuler( euler ) { + + if ( ! ( euler && euler.isEuler ) ) { + + console.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' ); + + } + + return this.applyQuaternion( quaternion.setFromEuler( euler ) ); + + }; + + }(), + + applyAxisAngle: function () { + + var quaternion = new Quaternion(); + + return function applyAxisAngle( axis, angle ) { + + return this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) ); + + }; + + }(), + + applyMatrix3: function ( m ) { + + var x = this.x, y = this.y, z = this.z; + var 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; + + }, + + applyMatrix4: function ( m ) { + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + var 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; + + }, + + applyQuaternion: function ( q ) { + + var x = this.x, y = this.y, z = this.z; + var qx = q.x, qy = q.y, qz = q.z, qw = q.w; + + // calculate quat * vector + + var ix = qw * x + qy * z - qz * y; + var iy = qw * y + qz * x - qx * z; + var iz = qw * z + qx * y - qy * x; + var 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; + + }, + + project: function ( camera ) { + + return this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix ); + + }, + + unproject: function () { + + var matrix = new Matrix4(); + + return function unproject( camera ) { + + return this.applyMatrix4( matrix.getInverse( camera.projectionMatrix ) ).applyMatrix4( camera.matrixWorld ); + + }; + + }(), + + transformDirection: function ( m ) { + + // input: THREE.Matrix4 affine matrix + // vector interpreted as a direction + + var x = this.x, y = this.y, z = this.z; + var 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(); + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + this.z /= v.z; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + min: function ( 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; + + }, + + max: function ( 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; + + }, + + clamp: function ( min, max ) { + + // assumes min < max, componentwise + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + + return this; + + }, + + clampScalar: function () { + + var min = new Vector3(); + var max = new Vector3(); + + return function clampScalar( minVal, maxVal ) { + + min.set( minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z; + + }, + + // TODO lengthSquared? + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z ); + + }, + + manhattanLength: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() || 1 ); + + }, + + setLength: function ( length ) { + + return this.normalize().multiplyScalar( length ); + + }, + + lerp: function ( 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; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + cross: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' ); + return this.crossVectors( v, w ); + + } + + return this.crossVectors( this, v ); + + }, + + crossVectors: function ( a, b ) { + + var ax = a.x, ay = a.y, az = a.z; + var 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; + + }, + + projectOnVector: function ( vector ) { + + var scalar = vector.dot( this ) / vector.lengthSq(); + + return this.copy( vector ).multiplyScalar( scalar ); + + }, + + projectOnPlane: function () { + + var v1 = new Vector3(); + + return function projectOnPlane( planeNormal ) { + + v1.copy( this ).projectOnVector( planeNormal ); + + return this.sub( v1 ); + + }; + + }(), + + reflect: function () { + + // reflect incident vector off plane orthogonal to normal + // normal is assumed to have unit length + + var v1 = new Vector3(); + + return function reflect( normal ) { + + return this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) ); + + }; + + }(), + + angleTo: function ( v ) { + + var theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) ); + + // clamp, to handle numerical problems + + return Math.acos( _Math.clamp( theta, - 1, 1 ) ); + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z; + + return dx * dx + dy * dy + dz * dz; + + }, + + manhattanDistanceTo: function ( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z ); + + }, + + setFromSpherical: function ( s ) { + + return this.setFromSphericalCoords( s.radius, s.phi, s.theta ); + + }, + + setFromSphericalCoords: function ( radius, phi, theta ) { + + var sinPhiRadius = Math.sin( phi ) * radius; + + this.x = sinPhiRadius * Math.sin( theta ); + this.y = Math.cos( phi ) * radius; + this.z = sinPhiRadius * Math.cos( theta ); + + return this; + + }, + + setFromCylindrical: function ( c ) { + + return this.setFromCylindricalCoords( c.radius, c.theta, c.y ); + + }, + + setFromCylindricalCoords: function ( radius, theta, y ) { + + this.x = radius * Math.sin( theta ); + this.y = y; + this.z = radius * Math.cos( theta ); + + return this; + + }, + + setFromMatrixPosition: function ( m ) { + + var e = m.elements; + + this.x = e[ 12 ]; + this.y = e[ 13 ]; + this.z = e[ 14 ]; + + return this; + + }, + + setFromMatrixScale: function ( m ) { + + var sx = this.setFromMatrixColumn( m, 0 ).length(); + var sy = this.setFromMatrixColumn( m, 1 ).length(); + var sz = this.setFromMatrixColumn( m, 2 ).length(); + + this.x = sx; + this.y = sy; + this.z = sz; + + return this; + + }, + + setFromMatrixColumn: function ( m, index ) { + + return this.fromArray( m.elements, index * 4 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + this.z = attribute.getZ( index ); + + return this; + + } + +} ); + + +export { Vector3 }; diff --git a/lib/math/Vector4.js b/lib/math/Vector4.js new file mode 100644 index 0000000..7b148ae --- /dev/null +++ b/lib/math/Vector4.js @@ -0,0 +1,629 @@ +/** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + +function Vector4( x, y, z, w ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + this.w = ( w !== undefined ) ? w : 1; + +} + +Object.assign( Vector4.prototype, { + + isVector4: true, + + set: function ( x, y, z, w ) { + + this.x = x; + this.y = y; + this.z = z; + this.w = w; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + this.w = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setW: function ( w ) { + + this.w = w; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + case 3: this.w = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + case 3: return this.w; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y, this.z, this.w ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + this.w = ( v.w !== undefined ) ? v.w : 1; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + this.w += v.w; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + this.w += s; + + return this; + + }, + + addVectors: function ( 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; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + this.w += v.w * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + this.w -= v.w; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + this.w -= s; + + return this; + + }, + + subVectors: function ( 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; + + }, + + multiplyScalar: function ( scalar ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + this.w *= scalar; + + return this; + + }, + + applyMatrix4: function ( m ) { + + var x = this.x, y = this.y, z = this.z, w = this.w; + var 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; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + setAxisAngleFromQuaternion: function ( q ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm + + // q is assumed to be normalized + + this.w = 2 * Math.acos( q.w ); + + var s = Math.sqrt( 1 - q.w * q.w ); + + if ( s < 0.0001 ) { + + this.x = 1; + this.y = 0; + this.z = 0; + + } else { + + this.x = q.x / s; + this.y = q.y / s; + this.z = q.z / s; + + } + + return this; + + }, + + setAxisAngleFromRotationMatrix: function ( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var angle, x, y, z, // variables for result + epsilon = 0.01, // margin to allow for rounding errors + epsilon2 = 0.1, // margin to distinguish between 0 and 180 degrees + + 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 ]; + + if ( ( Math.abs( m12 - m21 ) < epsilon ) && + ( Math.abs( m13 - m31 ) < epsilon ) && + ( Math.abs( m23 - m32 ) < epsilon ) ) { + + // singularity found + // first check for identity matrix which must have +1 for all terms + // in leading diagonal and zero in other terms + + if ( ( Math.abs( m12 + m21 ) < epsilon2 ) && + ( Math.abs( m13 + m31 ) < epsilon2 ) && + ( Math.abs( m23 + m32 ) < epsilon2 ) && + ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) { + + // this singularity is identity matrix so angle = 0 + + this.set( 1, 0, 0, 0 ); + + return this; // zero angle, arbitrary axis + + } + + // otherwise this singularity is angle = 180 + + angle = Math.PI; + + var xx = ( m11 + 1 ) / 2; + var yy = ( m22 + 1 ) / 2; + var zz = ( m33 + 1 ) / 2; + var xy = ( m12 + m21 ) / 4; + var xz = ( m13 + m31 ) / 4; + var yz = ( m23 + m32 ) / 4; + + if ( ( xx > yy ) && ( xx > zz ) ) { + + // m11 is the largest diagonal term + + if ( xx < epsilon ) { + + x = 0; + y = 0.707106781; + z = 0.707106781; + + } else { + + x = Math.sqrt( xx ); + y = xy / x; + z = xz / x; + + } + + } else if ( yy > zz ) { + + // m22 is the largest diagonal term + + if ( yy < epsilon ) { + + x = 0.707106781; + y = 0; + z = 0.707106781; + + } else { + + y = Math.sqrt( yy ); + x = xy / y; + z = yz / y; + + } + + } else { + + // m33 is the largest diagonal term so base result on this + + if ( zz < epsilon ) { + + x = 0.707106781; + y = 0.707106781; + z = 0; + + } else { + + z = Math.sqrt( zz ); + x = xz / z; + y = yz / z; + + } + + } + + this.set( x, y, z, angle ); + + return this; // return 180 deg rotation + + } + + // as we have reached here there are no singularities so we can handle normally + + var s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) + + ( m13 - m31 ) * ( m13 - m31 ) + + ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize + + if ( Math.abs( s ) < 0.001 ) s = 1; + + // prevent divide by zero, should not happen if matrix is orthogonal and should be + // caught by singularity test above, but I've left it in just in case + + this.x = ( m32 - m23 ) / s; + this.y = ( m13 - m31 ) / s; + this.z = ( m21 - m12 ) / s; + this.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 ); + + return this; + + }, + + min: function ( 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 ); + this.w = Math.min( this.w, v.w ); + + return this; + + }, + + max: function ( 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 ); + this.w = Math.max( this.w, v.w ); + + return this; + + }, + + clamp: function ( min, max ) { + + // assumes min < max, componentwise + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + this.w = Math.max( min.w, Math.min( max.w, this.w ) ); + + return this; + + }, + + clampScalar: function () { + + var min, max; + + return function clampScalar( minVal, maxVal ) { + + if ( min === undefined ) { + + min = new Vector4(); + max = new Vector4(); + + } + + min.set( minVal, minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + this.w = Math.floor( this.w ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + this.w = Math.ceil( this.w ); + + return this; + + }, + + round: function () { + + 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; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + this.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + this.w = - this.w; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w ); + + }, + + manhattanLength: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() || 1 ); + + }, + + setLength: function ( length ) { + + return this.normalize().multiplyScalar( length ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + this.w += ( v.w - this.w ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + this.w = array[ offset + 3 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + array[ offset + 3 ] = this.w; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + this.z = attribute.getZ( index ); + this.w = attribute.getW( index ); + + return this; + + } + +} ); + + +export { Vector4 }; diff --git a/lib/math/interpolants/CubicInterpolant.js b/lib/math/interpolants/CubicInterpolant.js new file mode 100644 index 0000000..152505d --- /dev/null +++ b/lib/math/interpolants/CubicInterpolant.js @@ -0,0 +1,156 @@ +import { ZeroCurvatureEnding } from '../../constants.js'; +import { Interpolant } from '../Interpolant.js'; +import { WrapAroundEnding, ZeroSlopeEnding } from '../../constants.js'; + +/** + * Fast and simple cubic spline interpolant. + * + * It was derived from a Hermitian construction setting the first derivative + * at each sample position to the linear slope between neighboring positions + * over their parameter interval. + * + * @author tschw + */ + +function CubicInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + this._weightPrev = - 0; + this._offsetPrev = - 0; + this._weightNext = - 0; + this._offsetNext = - 0; + +} + +CubicInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: CubicInterpolant, + + DefaultSettings_: { + + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + + }, + + intervalChanged_: function ( i1, t0, t1 ) { + + var pp = this.parameterPositions, + iPrev = i1 - 2, + iNext = i1 + 1, + + tPrev = pp[ iPrev ], + tNext = pp[ iNext ]; + + if ( tPrev === undefined ) { + + switch ( this.getSettings_().endingStart ) { + + case ZeroSlopeEnding: + + // f'(t0) = 0 + iPrev = i1; + tPrev = 2 * t0 - t1; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iPrev = pp.length - 2; + tPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(t0) = 0 a.k.a. Natural Spline + iPrev = i1; + tPrev = t1; + + } + + } + + if ( tNext === undefined ) { + + switch ( this.getSettings_().endingEnd ) { + + case ZeroSlopeEnding: + + // f'(tN) = 0 + iNext = i1; + tNext = 2 * t1 - t0; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iNext = 1; + tNext = t1 + pp[ 1 ] - pp[ 0 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(tN) = 0, a.k.a. Natural Spline + iNext = i1 - 1; + tNext = t0; + + } + + } + + var halfDt = ( t1 - t0 ) * 0.5, + stride = this.valueSize; + + this._weightPrev = halfDt / ( t0 - tPrev ); + this._weightNext = halfDt / ( tNext - t1 ); + this._offsetPrev = iPrev * stride; + this._offsetNext = iNext * stride; + + }, + + interpolate_: function ( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + o1 = i1 * stride, o0 = o1 - stride, + oP = this._offsetPrev, oN = this._offsetNext, + wP = this._weightPrev, wN = this._weightNext, + + p = ( t - t0 ) / ( t1 - t0 ), + pp = p * p, + ppp = pp * p; + + // evaluate polynomials + + var sP = - wP * ppp + 2 * wP * pp - wP * p; + var s0 = ( 1 + wP ) * ppp + ( - 1.5 - 2 * wP ) * pp + ( - 0.5 + wP ) * p + 1; + var s1 = ( - 1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p; + var sN = wN * ppp - wN * pp; + + // combine data linearly + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = + sP * values[ oP + i ] + + s0 * values[ o0 + i ] + + s1 * values[ o1 + i ] + + sN * values[ oN + i ]; + + } + + return result; + + } + +} ); + + +export { CubicInterpolant }; diff --git a/lib/math/interpolants/DiscreteInterpolant.js b/lib/math/interpolants/DiscreteInterpolant.js new file mode 100644 index 0000000..5d3f8e6 --- /dev/null +++ b/lib/math/interpolants/DiscreteInterpolant.js @@ -0,0 +1,30 @@ +import { Interpolant } from '../Interpolant.js'; + +/** + * + * Interpolant that evaluates to the sample value at the position preceeding + * the parameter. + * + * @author tschw + */ + +function DiscreteInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + +} + +DiscreteInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: DiscreteInterpolant, + + interpolate_: function ( i1 /*, t0, t, t1 */ ) { + + return this.copySampleValue_( i1 - 1 ); + + } + +} ); + + +export { DiscreteInterpolant }; diff --git a/lib/math/interpolants/LinearInterpolant.js b/lib/math/interpolants/LinearInterpolant.js new file mode 100644 index 0000000..32d6aee --- /dev/null +++ b/lib/math/interpolants/LinearInterpolant.js @@ -0,0 +1,44 @@ +import { Interpolant } from '../Interpolant.js'; + +/** + * @author tschw + */ + +function LinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + +} + +LinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: LinearInterpolant, + + interpolate_: function ( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + offset1 = i1 * stride, + offset0 = offset1 - stride, + + weight1 = ( t - t0 ) / ( t1 - t0 ), + weight0 = 1 - weight1; + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = + values[ offset0 + i ] * weight0 + + values[ offset1 + i ] * weight1; + + } + + return result; + + } + +} ); + + +export { LinearInterpolant }; diff --git a/lib/math/interpolants/QuaternionLinearInterpolant.js b/lib/math/interpolants/QuaternionLinearInterpolant.js new file mode 100644 index 0000000..d90bbff --- /dev/null +++ b/lib/math/interpolants/QuaternionLinearInterpolant.js @@ -0,0 +1,43 @@ +import { Interpolant } from '../Interpolant.js'; +import { Quaternion } from '../Quaternion.js'; + +/** + * Spherical linear unit quaternion interpolant. + * + * @author tschw + */ + +function QuaternionLinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + +} + +QuaternionLinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: QuaternionLinearInterpolant, + + interpolate_: function ( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + offset = i1 * stride, + + alpha = ( t - t0 ) / ( t1 - t0 ); + + for ( var end = offset + stride; offset !== end; offset += 4 ) { + + Quaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha ); + + } + + return result; + + } + +} ); + + +export { QuaternionLinearInterpolant }; diff --git a/lib/moment.min.js b/lib/moment.min.js new file mode 100644 index 0000000..2a3358f --- /dev/null +++ b/lib/moment.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.moment=t()}(this,function(){"use strict";var e,i;function c(){return e.apply(null,arguments)}function o(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function u(e){return null!=e&&"[object Object]"===Object.prototype.toString.call(e)}function l(e){return void 0===e}function d(e){return"number"==typeof e||"[object Number]"===Object.prototype.toString.call(e)}function h(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function f(e,t){var n,s=[];for(n=0;n>>0,s=0;sDe(e)?(r=e+1,o-De(e)):(r=e,o),{year:r,dayOfYear:a}}function Ie(e,t,n){var s,i,r=Ve(e.year(),t,n),a=Math.floor((e.dayOfYear()-r-1)/7)+1;return a<1?s=a+Ae(i=e.year()-1,t,n):a>Ae(e.year(),t,n)?(s=a-Ae(e.year(),t,n),i=e.year()+1):(i=e.year(),s=a),{week:s,year:i}}function Ae(e,t,n){var s=Ve(e,t,n),i=Ve(e+1,t,n);return(De(e)-s+i)/7}I("w",["ww",2],"wo","week"),I("W",["WW",2],"Wo","isoWeek"),H("week","w"),H("isoWeek","W"),L("week",5),L("isoWeek",5),ue("w",B),ue("ww",B,z),ue("W",B),ue("WW",B,z),fe(["w","ww","W","WW"],function(e,t,n,s){t[s.substr(0,1)]=k(e)});I("d",0,"do","day"),I("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),I("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),I("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),I("e",0,0,"weekday"),I("E",0,0,"isoWeekday"),H("day","d"),H("weekday","e"),H("isoWeekday","E"),L("day",11),L("weekday",11),L("isoWeekday",11),ue("d",B),ue("e",B),ue("E",B),ue("dd",function(e,t){return t.weekdaysMinRegex(e)}),ue("ddd",function(e,t){return t.weekdaysShortRegex(e)}),ue("dddd",function(e,t){return t.weekdaysRegex(e)}),fe(["dd","ddd","dddd"],function(e,t,n,s){var i=n._locale.weekdaysParse(e,s,n._strict);null!=i?t.d=i:g(n).invalidWeekday=e}),fe(["d","e","E"],function(e,t,n,s){t[s]=k(e)});var je="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_");var Ze="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_");var ze="Su_Mo_Tu_We_Th_Fr_Sa".split("_");var $e=ae;var qe=ae;var Je=ae;function Be(){function e(e,t){return t.length-e.length}var t,n,s,i,r,a=[],o=[],u=[],l=[];for(t=0;t<7;t++)n=y([2e3,1]).day(t),s=this.weekdaysMin(n,""),i=this.weekdaysShort(n,""),r=this.weekdays(n,""),a.push(s),o.push(i),u.push(r),l.push(s),l.push(i),l.push(r);for(a.sort(e),o.sort(e),u.sort(e),l.sort(e),t=0;t<7;t++)o[t]=de(o[t]),u[t]=de(u[t]),l[t]=de(l[t]);this._weekdaysRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+o.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+a.join("|")+")","i")}function Qe(){return this.hours()%12||12}function Xe(e,t){I(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function Ke(e,t){return t._meridiemParse}I("H",["HH",2],0,"hour"),I("h",["hh",2],0,Qe),I("k",["kk",2],0,function(){return this.hours()||24}),I("hmm",0,0,function(){return""+Qe.apply(this)+U(this.minutes(),2)}),I("hmmss",0,0,function(){return""+Qe.apply(this)+U(this.minutes(),2)+U(this.seconds(),2)}),I("Hmm",0,0,function(){return""+this.hours()+U(this.minutes(),2)}),I("Hmmss",0,0,function(){return""+this.hours()+U(this.minutes(),2)+U(this.seconds(),2)}),Xe("a",!0),Xe("A",!1),H("hour","h"),L("hour",13),ue("a",Ke),ue("A",Ke),ue("H",B),ue("h",B),ue("k",B),ue("HH",B,z),ue("hh",B,z),ue("kk",B,z),ue("hmm",Q),ue("hmmss",X),ue("Hmm",Q),ue("Hmmss",X),ce(["H","HH"],ge),ce(["k","kk"],function(e,t,n){var s=k(e);t[ge]=24===s?0:s}),ce(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),ce(["h","hh"],function(e,t,n){t[ge]=k(e),g(n).bigHour=!0}),ce("hmm",function(e,t,n){var s=e.length-2;t[ge]=k(e.substr(0,s)),t[pe]=k(e.substr(s)),g(n).bigHour=!0}),ce("hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[ge]=k(e.substr(0,s)),t[pe]=k(e.substr(s,2)),t[ve]=k(e.substr(i)),g(n).bigHour=!0}),ce("Hmm",function(e,t,n){var s=e.length-2;t[ge]=k(e.substr(0,s)),t[pe]=k(e.substr(s))}),ce("Hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[ge]=k(e.substr(0,s)),t[pe]=k(e.substr(s,2)),t[ve]=k(e.substr(i))});var et,tt=Te("Hours",!0),nt={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:He,monthsShort:Re,week:{dow:0,doy:6},weekdays:je,weekdaysMin:ze,weekdaysShort:Ze,meridiemParse:/[ap]\.?m?\.?/i},st={},it={};function rt(e){return e?e.toLowerCase().replace("_","-"):e}function at(e){var t=null;if(!st[e]&&"undefined"!=typeof module&&module&&module.exports)try{t=et._abbr,require("./locale/"+e),ot(t)}catch(e){}return st[e]}function ot(e,t){var n;return e&&((n=l(t)?lt(e):ut(e,t))?et=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),et._abbr}function ut(e,t){if(null===t)return delete st[e],null;var n,s=nt;if(t.abbr=e,null!=st[e])T("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),s=st[e]._config;else if(null!=t.parentLocale)if(null!=st[t.parentLocale])s=st[t.parentLocale]._config;else{if(null==(n=at(t.parentLocale)))return it[t.parentLocale]||(it[t.parentLocale]=[]),it[t.parentLocale].push({name:e,config:t}),null;s=n._config}return st[e]=new P(b(s,t)),it[e]&&it[e].forEach(function(e){ut(e.name,e.config)}),ot(e),st[e]}function lt(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return et;if(!o(e)){if(t=at(e))return t;e=[e]}return function(e){for(var t,n,s,i,r=0;r=t&&a(i,n,!0)>=t-1)break;t--}r++}return et}(e)}function dt(e){var t,n=e._a;return n&&-2===g(e).overflow&&(t=n[_e]<0||11Pe(n[me],n[_e])?ye:n[ge]<0||24Ae(n,r,a)?g(e)._overflowWeeks=!0:null!=u?g(e)._overflowWeekday=!0:(o=Ee(n,s,i,r,a),e._a[me]=o.year,e._dayOfYear=o.dayOfYear)}(e),null!=e._dayOfYear&&(r=ht(e._a[me],s[me]),(e._dayOfYear>De(r)||0===e._dayOfYear)&&(g(e)._overflowDayOfYear=!0),n=Ge(r,0,e._dayOfYear),e._a[_e]=n.getUTCMonth(),e._a[ye]=n.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=a[t]=s[t];for(;t<7;t++)e._a[t]=a[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[ge]&&0===e._a[pe]&&0===e._a[ve]&&0===e._a[we]&&(e._nextDay=!0,e._a[ge]=0),e._d=(e._useUTC?Ge:function(e,t,n,s,i,r,a){var o=new Date(e,t,n,s,i,r,a);return e<100&&0<=e&&isFinite(o.getFullYear())&&o.setFullYear(e),o}).apply(null,a),i=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[ge]=24),e._w&&void 0!==e._w.d&&e._w.d!==i&&(g(e).weekdayMismatch=!0)}}var ft=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,mt=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,_t=/Z|[+-]\d\d(?::?\d\d)?/,yt=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],gt=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],pt=/^\/?Date\((\-?\d+)/i;function vt(e){var t,n,s,i,r,a,o=e._i,u=ft.exec(o)||mt.exec(o);if(u){for(g(e).iso=!0,t=0,n=yt.length;tn.valueOf():n.valueOf()this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},ln.isLocal=function(){return!!this.isValid()&&!this._isUTC},ln.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},ln.isUtc=Vt,ln.isUTC=Vt,ln.zoneAbbr=function(){return this._isUTC?"UTC":""},ln.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},ln.dates=n("dates accessor is deprecated. Use date instead.",nn),ln.months=n("months accessor is deprecated. Use month instead",Fe),ln.years=n("years accessor is deprecated. Use year instead",Oe),ln.zone=n("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,t){return null!=e?("string"!=typeof e&&(e=-e),this.utcOffset(e,t),this):-this.utcOffset()}),ln.isDSTShifted=n("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!l(this._isDSTShifted))return this._isDSTShifted;var e={};if(w(e,this),(e=Yt(e))._a){var t=e._isUTC?y(e._a):Tt(e._a);this._isDSTShifted=this.isValid()&&0h||m.hasOwnProperty(h)&&(n[m[h]]=h)}d=n[c]?"keydown":"keypress"}"keypress"==d&&e.length&&(d="keydown");return{key:k,modifiers:e,action:d}}function C(a,b){return null===a||a===t?!1:a===b?!0:C(a.parentNode,b)}function e(a){function b(a){a= +a||{};var b=!1,l;for(l in n)a[l]?b=!0:n[l]=0;b||(w=!1)}function d(a,b,r,g,F,e){var l,D=[],h=r.type;if(!f._callbacks[a])return[];"keyup"==h&&v(a)&&(b=[a]);for(l=0;l":".","?":"/","|":"\\"},A={option:"alt",command:"meta","return":"enter", +escape:"esc",plus:"+",mod:/Mac|iPod|iPhone|iPad/.test(navigator.platform)?"meta":"ctrl"},n;for(h=1;20>h;++h)m[111+h]="f"+h;for(h=0;9>=h;++h)m[h+96]=h.toString();e.prototype.bind=function(a,b,d){a=a instanceof Array?a:[a];this._bindMultiple.call(this,a,b,d);return this};e.prototype.unbind=function(a,b){return this.bind.call(this,a,function(){},b)};e.prototype.trigger=function(a,b){if(this._directMap[a+":"+b])this._directMap[a+":"+b]({},a);return this};e.prototype.reset=function(){this._callbacks={}; +this._directMap={};return this};e.prototype.stopCallback=function(a,b){return-1<(" "+b.className+" ").indexOf(" mousetrap ")||C(b,this.target)?!1:"INPUT"==b.tagName||"SELECT"==b.tagName||"TEXTAREA"==b.tagName||b.isContentEditable};e.prototype.handleKey=function(){return this._handleKey.apply(this,arguments)};e.addKeycodes=function(a){for(var b in a)a.hasOwnProperty(b)&&(m[b]=a[b]);n=null};e.init=function(){var a=e(t),b;for(b in a)"_"!==b.charAt(0)&&(e[b]=function(b){return function(){return a[b].apply(a, +arguments)}}(b))};e.init();p.Mousetrap=e;"undefined"!==typeof module&&module.exports&&(module.exports=e);"function"===typeof define&&define.amd&&define(function(){return e})}})("undefined"!==typeof window?window:null,"undefined"!==typeof window?document:null); diff --git a/lib/objects/Bone.js b/lib/objects/Bone.js new file mode 100644 index 0000000..bbe66db --- /dev/null +++ b/lib/objects/Bone.js @@ -0,0 +1,26 @@ +import { Object3D } from '../core/Object3D.js'; + +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + +function Bone() { + + Object3D.call( this ); + + this.type = 'Bone'; + +} + +Bone.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Bone, + + isBone: true + +} ); + + +export { Bone }; diff --git a/lib/objects/Group.js b/lib/objects/Group.js new file mode 100644 index 0000000..d4ded34 --- /dev/null +++ b/lib/objects/Group.js @@ -0,0 +1,24 @@ +import { Object3D } from '../core/Object3D.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function Group() { + + Object3D.call( this ); + + this.type = 'Group'; + +} + +Group.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Group, + + isGroup: true + +} ); + + +export { Group }; diff --git a/lib/objects/LOD.js b/lib/objects/LOD.js new file mode 100644 index 0000000..1c64296 --- /dev/null +++ b/lib/objects/LOD.js @@ -0,0 +1,176 @@ +import { Vector3 } from '../math/Vector3.js'; +import { Object3D } from '../core/Object3D.js'; + +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + +function LOD() { + + Object3D.call( this ); + + this.type = 'LOD'; + + Object.defineProperties( this, { + levels: { + enumerable: true, + value: [] + } + } ); + +} + +LOD.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: LOD, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source, false ); + + var levels = source.levels; + + for ( var i = 0, l = levels.length; i < l; i ++ ) { + + var level = levels[ i ]; + + this.addLevel( level.object.clone(), level.distance ); + + } + + return this; + + }, + + addLevel: function ( object, distance ) { + + if ( distance === undefined ) distance = 0; + + distance = Math.abs( distance ); + + var levels = this.levels; + + for ( var l = 0; l < levels.length; l ++ ) { + + if ( distance < levels[ l ].distance ) { + + break; + + } + + } + + levels.splice( l, 0, { distance: distance, object: object } ); + + this.add( object ); + + }, + + getObjectForDistance: function ( distance ) { + + var levels = this.levels; + + for ( var i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance < levels[ i ].distance ) { + + break; + + } + + } + + return levels[ i - 1 ].object; + + }, + + raycast: ( function () { + + var matrixPosition = new Vector3(); + + return function raycast( raycaster, intersects ) { + + matrixPosition.setFromMatrixPosition( this.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( matrixPosition ); + + this.getObjectForDistance( distance ).raycast( raycaster, intersects ); + + }; + + }() ), + + update: function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function update( camera ) { + + var levels = this.levels; + + if ( levels.length > 1 ) { + + v1.setFromMatrixPosition( camera.matrixWorld ); + v2.setFromMatrixPosition( this.matrixWorld ); + + var distance = v1.distanceTo( v2 ); + + levels[ 0 ].object.visible = true; + + for ( var i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance >= levels[ i ].distance ) { + + levels[ i - 1 ].object.visible = false; + levels[ i ].object.visible = true; + + } else { + + break; + + } + + } + + for ( ; i < l; i ++ ) { + + levels[ i ].object.visible = false; + + } + + } + + }; + + }(), + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.levels = []; + + var levels = this.levels; + + for ( var i = 0, l = levels.length; i < l; i ++ ) { + + var level = levels[ i ]; + + data.object.levels.push( { + object: level.object.uuid, + distance: level.distance + } ); + + } + + return data; + + } + +} ); + + +export { LOD }; diff --git a/lib/objects/Line.js b/lib/objects/Line.js new file mode 100644 index 0000000..4a84890 --- /dev/null +++ b/lib/objects/Line.js @@ -0,0 +1,267 @@ +import { Sphere } from '../math/Sphere.js'; +import { Ray } from '../math/Ray.js'; +import { Matrix4 } from '../math/Matrix4.js'; +import { Object3D } from '../core/Object3D.js'; +import { Vector3 } from '../math/Vector3.js'; +import { LineBasicMaterial } from '../materials/LineBasicMaterial.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function Line( geometry, material, mode ) { + + if ( mode === 1 ) { + + console.error( 'THREE.Line: parameter THREE.LinePieces no longer supported. Use THREE.LineSegments instead.' ); + + } + + Object3D.call( this ); + + this.type = 'Line'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } ); + +} + +Line.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Line, + + isLine: true, + + computeLineDistances: ( function () { + + var start = new Vector3(); + var end = new Vector3(); + + return function computeLineDistances() { + + var geometry = this.geometry; + + if ( geometry.isBufferGeometry ) { + + // we assume non-indexed geometry + + if ( geometry.index === null ) { + + var positionAttribute = geometry.attributes.position; + var lineDistances = [ 0 ]; + + for ( var i = 1, l = positionAttribute.count; i < l; i ++ ) { + + start.fromBufferAttribute( positionAttribute, i - 1 ); + end.fromBufferAttribute( positionAttribute, i ); + + lineDistances[ i ] = lineDistances[ i - 1 ]; + lineDistances[ i ] += start.distanceTo( end ); + + } + + geometry.addAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) ); + + } else { + + console.warn( 'THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' ); + + } + + } else if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + var lineDistances = geometry.lineDistances; + + lineDistances[ 0 ] = 0; + + for ( var i = 1, l = vertices.length; i < l; i ++ ) { + + lineDistances[ i ] = lineDistances[ i - 1 ]; + lineDistances[ i ] += vertices[ i - 1 ].distanceTo( vertices[ i ] ); + + } + + } + + return this; + + }; + + }() ), + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + return function raycast( raycaster, intersects ) { + + var precision = raycaster.linePrecision; + + var geometry = this.geometry; + var matrixWorld = this.matrixWorld; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + sphere.radius += precision; + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + var localPrecision = precision / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 ); + var localPrecisionSq = localPrecision * localPrecision; + + var vStart = new Vector3(); + var vEnd = new Vector3(); + var interSegment = new Vector3(); + var interRay = new Vector3(); + var step = ( this && this.isLineSegments ) ? 2 : 1; + + if ( geometry.isBufferGeometry ) { + + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, l = indices.length - 1; i < l; i += step ) { + + var a = indices[ i ]; + var b = indices[ i + 1 ]; + + vStart.fromArray( positions, a * 3 ); + vEnd.fromArray( positions, b * 3 ); + + var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > localPrecisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } else { + + for ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) { + + vStart.fromArray( positions, 3 * i ); + vEnd.fromArray( positions, 3 * i + 3 ); + + var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > localPrecisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + } else if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + var nbVertices = vertices.length; + + for ( var i = 0; i < nbVertices - 1; i += step ) { + + var distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment ); + + if ( distSq > localPrecisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + }; + + }() ), + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.geometry.copy( source.geometry ); + this.material.copy( source.material ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + } + +} ); + + +export { Line }; diff --git a/lib/objects/LineLoop.js b/lib/objects/LineLoop.js new file mode 100644 index 0000000..9fc29cd --- /dev/null +++ b/lib/objects/LineLoop.js @@ -0,0 +1,24 @@ +import { Line } from './Line.js'; + +/** + * @author mgreter / http://github.com/mgreter + */ + +function LineLoop( geometry, material ) { + + Line.call( this, geometry, material ); + + this.type = 'LineLoop'; + +} + +LineLoop.prototype = Object.assign( Object.create( Line.prototype ), { + + constructor: LineLoop, + + isLineLoop: true, + +} ); + + +export { LineLoop }; diff --git a/lib/objects/LineSegments.js b/lib/objects/LineSegments.js new file mode 100644 index 0000000..30f38c5 --- /dev/null +++ b/lib/objects/LineSegments.js @@ -0,0 +1,85 @@ +import { Line } from './Line.js'; +import { Vector3 } from '../math/Vector3.js'; +import { Float32BufferAttribute } from '../core/BufferAttribute.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function LineSegments( geometry, material ) { + + Line.call( this, geometry, material ); + + this.type = 'LineSegments'; + +} + +LineSegments.prototype = Object.assign( Object.create( Line.prototype ), { + + constructor: LineSegments, + + isLineSegments: true, + + computeLineDistances: ( function () { + + var start = new Vector3(); + var end = new Vector3(); + + return function computeLineDistances() { + + var geometry = this.geometry; + + if ( geometry.isBufferGeometry ) { + + // we assume non-indexed geometry + + if ( geometry.index === null ) { + + var positionAttribute = geometry.attributes.position; + var lineDistances = []; + + for ( var i = 0, l = positionAttribute.count; i < l; i += 2 ) { + + start.fromBufferAttribute( positionAttribute, i ); + end.fromBufferAttribute( positionAttribute, i + 1 ); + + lineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ]; + lineDistances[ i + 1 ] = lineDistances[ i ] + start.distanceTo( end ); + + } + + geometry.addAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) ); + + } else { + + console.warn( 'THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' ); + + } + + } else if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + var lineDistances = geometry.lineDistances; + + for ( var i = 0, l = vertices.length; i < l; i += 2 ) { + + start.copy( vertices[ i ] ); + end.copy( vertices[ i + 1 ] ); + + lineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ]; + lineDistances[ i + 1 ] = lineDistances[ i ] + start.distanceTo( end ); + + } + + } + + return this; + + }; + + }() ) + +} ); + + +export { LineSegments }; diff --git a/lib/objects/Mesh.js b/lib/objects/Mesh.js new file mode 100644 index 0000000..f796876 --- /dev/null +++ b/lib/objects/Mesh.js @@ -0,0 +1,462 @@ +import { Vector3 } from '../math/Vector3.js'; +import { Vector2 } from '../math/Vector2.js'; +import { Sphere } from '../math/Sphere.js'; +import { Ray } from '../math/Ray.js'; +import { Matrix4 } from '../math/Matrix4.js'; +import { Object3D } from '../core/Object3D.js'; +import { Triangle } from '../math/Triangle.js'; +import { Face3 } from '../core/Face3.js'; +import { DoubleSide, BackSide, TrianglesDrawMode } from '../constants.js'; +import { MeshBasicMaterial } from '../materials/MeshBasicMaterial.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author jonobr1 / http://jonobr1.com/ + */ + +function Mesh( geometry, material ) { + + Object3D.call( this ); + + this.type = 'Mesh'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } ); + + this.drawMode = TrianglesDrawMode; + + this.updateMorphTargets(); + +} + +Mesh.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Mesh, + + isMesh: true, + + setDrawMode: function ( value ) { + + this.drawMode = value; + + }, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.drawMode = source.drawMode; + + if ( source.morphTargetInfluences !== undefined ) { + + this.morphTargetInfluences = source.morphTargetInfluences.slice(); + + } + + if ( source.morphTargetDictionary !== undefined ) { + + this.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary ); + + } + + return this; + + }, + + updateMorphTargets: function () { + + var geometry = this.geometry; + var m, ml, name; + + if ( geometry.isBufferGeometry ) { + + var morphAttributes = geometry.morphAttributes; + var keys = Object.keys( morphAttributes ); + + if ( keys.length > 0 ) { + + var morphAttribute = morphAttributes[ keys[ 0 ] ]; + + if ( morphAttribute !== undefined ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( m = 0, ml = morphAttribute.length; m < ml; m ++ ) { + + name = morphAttribute[ m ].name || String( m ); + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ name ] = m; + + } + + } + + } + + } else { + + var morphTargets = geometry.morphTargets; + + if ( morphTargets !== undefined && morphTargets.length > 0 ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( m = 0, ml = morphTargets.length; m < ml; m ++ ) { + + name = morphTargets[ m ].name || String( m ); + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ name ] = m; + + } + + } + + } + + }, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + var vA = new Vector3(); + var vB = new Vector3(); + var vC = new Vector3(); + + var tempA = new Vector3(); + var tempB = new Vector3(); + var tempC = new Vector3(); + + var uvA = new Vector2(); + var uvB = new Vector2(); + var uvC = new Vector2(); + + var intersectionPoint = new Vector3(); + var intersectionPointWorld = new Vector3(); + + function checkIntersection( object, material, raycaster, ray, pA, pB, pC, point ) { + + var intersect; + + if ( material.side === BackSide ) { + + intersect = ray.intersectTriangle( pC, pB, pA, true, point ); + + } else { + + intersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point ); + + } + + if ( intersect === null ) return null; + + intersectionPointWorld.copy( point ); + intersectionPointWorld.applyMatrix4( object.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( intersectionPointWorld ); + + if ( distance < raycaster.near || distance > raycaster.far ) return null; + + return { + distance: distance, + point: intersectionPointWorld.clone(), + object: object + }; + + } + + function checkBufferGeometryIntersection( object, material, raycaster, ray, position, uv, a, b, c ) { + + vA.fromBufferAttribute( position, a ); + vB.fromBufferAttribute( position, b ); + vC.fromBufferAttribute( position, c ); + + var intersection = checkIntersection( object, material, raycaster, ray, vA, vB, vC, intersectionPoint ); + + if ( intersection ) { + + if ( uv ) { + + uvA.fromBufferAttribute( uv, a ); + uvB.fromBufferAttribute( uv, b ); + uvC.fromBufferAttribute( uv, c ); + + intersection.uv = Triangle.getUV( intersectionPoint, vA, vB, vC, uvA, uvB, uvC, new Vector2() ); + + } + + var face = new Face3( a, b, c ); + Triangle.getNormal( vA, vB, vC, face.normal ); + + intersection.face = face; + + } + + return intersection; + + } + + return function raycast( raycaster, intersects ) { + + var geometry = this.geometry; + var material = this.material; + var matrixWorld = this.matrixWorld; + + if ( material === undefined ) return; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + // Check boundingBox before continuing + + if ( geometry.boundingBox !== null ) { + + if ( ray.intersectsBox( geometry.boundingBox ) === false ) return; + + } + + var intersection; + + if ( geometry.isBufferGeometry ) { + + var a, b, c; + var index = geometry.index; + var position = geometry.attributes.position; + var uv = geometry.attributes.uv; + var groups = geometry.groups; + var drawRange = geometry.drawRange; + var i, j, il, jl; + var group, groupMaterial; + var start, end; + + if ( index !== null ) { + + // indexed buffer geometry + + if ( Array.isArray( material ) ) { + + for ( i = 0, il = groups.length; i < il; i ++ ) { + + group = groups[ i ]; + groupMaterial = material[ group.materialIndex ]; + + start = Math.max( group.start, drawRange.start ); + end = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ); + + for ( j = start, jl = end; j < jl; j += 3 ) { + + a = index.getX( j ); + b = index.getX( j + 1 ); + c = index.getX( j + 2 ); + + intersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, ray, position, uv, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } else { + + start = Math.max( 0, drawRange.start ); + end = Math.min( index.count, ( drawRange.start + drawRange.count ) ); + + for ( i = start, il = end; i < il; i += 3 ) { + + a = index.getX( i ); + b = index.getX( i + 1 ); + c = index.getX( i + 2 ); + + intersection = checkBufferGeometryIntersection( this, material, raycaster, ray, position, uv, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } else if ( position !== undefined ) { + + // non-indexed buffer geometry + + if ( Array.isArray( material ) ) { + + for ( i = 0, il = groups.length; i < il; i ++ ) { + + group = groups[ i ]; + groupMaterial = material[ group.materialIndex ]; + + start = Math.max( group.start, drawRange.start ); + end = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ); + + for ( j = start, jl = end; j < jl; j += 3 ) { + + a = j; + b = j + 1; + c = j + 2; + + intersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, ray, position, uv, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } else { + + start = Math.max( 0, drawRange.start ); + end = Math.min( position.count, ( drawRange.start + drawRange.count ) ); + + for ( i = start, il = end; i < il; i += 3 ) { + + a = i; + b = i + 1; + c = i + 2; + + intersection = checkBufferGeometryIntersection( this, material, raycaster, ray, position, uv, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } + + } else if ( geometry.isGeometry ) { + + var fvA, fvB, fvC; + var isMultiMaterial = Array.isArray( material ); + + var vertices = geometry.vertices; + var faces = geometry.faces; + var uvs; + + var faceVertexUvs = geometry.faceVertexUvs[ 0 ]; + if ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs; + + for ( var f = 0, fl = faces.length; f < fl; f ++ ) { + + var face = faces[ f ]; + var faceMaterial = isMultiMaterial ? material[ face.materialIndex ] : material; + + if ( faceMaterial === undefined ) continue; + + fvA = vertices[ face.a ]; + fvB = vertices[ face.b ]; + fvC = vertices[ face.c ]; + + if ( faceMaterial.morphTargets === true ) { + + var morphTargets = geometry.morphTargets; + var morphInfluences = this.morphTargetInfluences; + + vA.set( 0, 0, 0 ); + vB.set( 0, 0, 0 ); + vC.set( 0, 0, 0 ); + + for ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) { + + var influence = morphInfluences[ t ]; + + if ( influence === 0 ) continue; + + var targets = morphTargets[ t ].vertices; + + vA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence ); + vB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence ); + vC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence ); + + } + + vA.add( fvA ); + vB.add( fvB ); + vC.add( fvC ); + + fvA = vA; + fvB = vB; + fvC = vC; + + } + + intersection = checkIntersection( this, faceMaterial, raycaster, ray, fvA, fvB, fvC, intersectionPoint ); + + if ( intersection ) { + + if ( uvs && uvs[ f ] ) { + + var uvs_f = uvs[ f ]; + uvA.copy( uvs_f[ 0 ] ); + uvB.copy( uvs_f[ 1 ] ); + uvC.copy( uvs_f[ 2 ] ); + + intersection.uv = Triangle.getUV( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC, new Vector2() ); + + } + + intersection.face = face; + intersection.faceIndex = f; + intersects.push( intersection ); + + } + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + +} ); + + +export { Mesh }; diff --git a/lib/objects/Points.js b/lib/objects/Points.js new file mode 100644 index 0000000..5e81384 --- /dev/null +++ b/lib/objects/Points.js @@ -0,0 +1,148 @@ +import { Sphere } from '../math/Sphere.js'; +import { Ray } from '../math/Ray.js'; +import { Matrix4 } from '../math/Matrix4.js'; +import { Object3D } from '../core/Object3D.js'; +import { Vector3 } from '../math/Vector3.js'; +import { PointsMaterial } from '../materials/PointsMaterial.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +function Points( geometry, material ) { + + Object3D.call( this ); + + this.type = 'Points'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } ); + +} + +Points.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Points, + + isPoints: true, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + return function raycast( raycaster, intersects ) { + + var object = this; + var geometry = this.geometry; + var matrixWorld = this.matrixWorld; + var threshold = raycaster.params.Points.threshold; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + sphere.radius += threshold; + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + var localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 ); + var localThresholdSq = localThreshold * localThreshold; + var position = new Vector3(); + var intersectPoint = new Vector3(); + + function testPoint( point, index ) { + + var rayPointDistanceSq = ray.distanceSqToPoint( point ); + + if ( rayPointDistanceSq < localThresholdSq ) { + + ray.closestPointToPoint( point, intersectPoint ); + intersectPoint.applyMatrix4( matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + distanceToRay: Math.sqrt( rayPointDistanceSq ), + point: intersectPoint.clone(), + index: index, + face: null, + object: object + + } ); + + } + + } + + if ( geometry.isBufferGeometry ) { + + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, il = indices.length; i < il; i ++ ) { + + var a = indices[ i ]; + + position.fromArray( positions, a * 3 ); + + testPoint( position, a ); + + } + + } else { + + for ( var i = 0, l = positions.length / 3; i < l; i ++ ) { + + position.fromArray( positions, i * 3 ); + + testPoint( position, i ); + + } + + } + + } else { + + var vertices = geometry.vertices; + + for ( var i = 0, l = vertices.length; i < l; i ++ ) { + + testPoint( vertices[ i ], i ); + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + +} ); + + +export { Points }; diff --git a/lib/objects/Skeleton.js b/lib/objects/Skeleton.js new file mode 100644 index 0000000..8764e93 --- /dev/null +++ b/lib/objects/Skeleton.js @@ -0,0 +1,178 @@ +import { Matrix4 } from '../math/Matrix4.js'; + +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author michael guerrero / http://realitymeltdown.com + * @author ikerr / http://verold.com + */ + +function Skeleton( bones, boneInverses ) { + + // copy the bone array + + bones = bones || []; + + this.bones = bones.slice( 0 ); + this.boneMatrices = new Float32Array( this.bones.length * 16 ); + + // use the supplied bone inverses or calculate the inverses + + if ( boneInverses === undefined ) { + + this.calculateInverses(); + + } else { + + if ( this.bones.length === boneInverses.length ) { + + this.boneInverses = boneInverses.slice( 0 ); + + } else { + + console.warn( 'THREE.Skeleton boneInverses is the wrong length.' ); + + this.boneInverses = []; + + for ( var i = 0, il = this.bones.length; i < il; i ++ ) { + + this.boneInverses.push( new Matrix4() ); + + } + + } + + } + +} + +Object.assign( Skeleton.prototype, { + + calculateInverses: function () { + + this.boneInverses = []; + + for ( var i = 0, il = this.bones.length; i < il; i ++ ) { + + var inverse = new Matrix4(); + + if ( this.bones[ i ] ) { + + inverse.getInverse( this.bones[ i ].matrixWorld ); + + } + + this.boneInverses.push( inverse ); + + } + + }, + + pose: function () { + + var bone, i, il; + + // recover the bind-time world matrices + + for ( i = 0, il = this.bones.length; i < il; i ++ ) { + + bone = this.bones[ i ]; + + if ( bone ) { + + bone.matrixWorld.getInverse( this.boneInverses[ i ] ); + + } + + } + + // compute the local matrices, positions, rotations and scales + + for ( i = 0, il = this.bones.length; i < il; i ++ ) { + + bone = this.bones[ i ]; + + if ( bone ) { + + if ( bone.parent && bone.parent.isBone ) { + + bone.matrix.getInverse( bone.parent.matrixWorld ); + bone.matrix.multiply( bone.matrixWorld ); + + } else { + + bone.matrix.copy( bone.matrixWorld ); + + } + + bone.matrix.decompose( bone.position, bone.quaternion, bone.scale ); + + } + + } + + }, + + update: ( function () { + + var offsetMatrix = new Matrix4(); + var identityMatrix = new Matrix4(); + + return function update() { + + var bones = this.bones; + var boneInverses = this.boneInverses; + var boneMatrices = this.boneMatrices; + var boneTexture = this.boneTexture; + + // flatten bone matrices to array + + for ( var i = 0, il = bones.length; i < il; i ++ ) { + + // compute the offset between the current and the original transform + + var matrix = bones[ i ] ? bones[ i ].matrixWorld : identityMatrix; + + offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] ); + offsetMatrix.toArray( boneMatrices, i * 16 ); + + } + + if ( boneTexture !== undefined ) { + + boneTexture.needsUpdate = true; + + } + + }; + + } )(), + + clone: function () { + + return new Skeleton( this.bones, this.boneInverses ); + + }, + + getBoneByName: function ( name ) { + + for ( var i = 0, il = this.bones.length; i < il; i ++ ) { + + var bone = this.bones[ i ]; + + if ( bone.name === name ) { + + return bone; + + } + + } + + return undefined; + + } + +} ); + + +export { Skeleton }; diff --git a/lib/objects/SkinnedMesh.js b/lib/objects/SkinnedMesh.js new file mode 100644 index 0000000..cb1af1d --- /dev/null +++ b/lib/objects/SkinnedMesh.js @@ -0,0 +1,209 @@ +import { Mesh } from './Mesh.js'; +import { Vector4 } from '../math/Vector4.js'; +import { Skeleton } from './Skeleton.js'; +import { Bone } from './Bone.js'; +import { Matrix4 } from '../math/Matrix4.js'; + +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + +function SkinnedMesh( geometry, material ) { + + Mesh.call( this, geometry, material ); + + this.type = 'SkinnedMesh'; + + this.bindMode = 'attached'; + this.bindMatrix = new Matrix4(); + this.bindMatrixInverse = new Matrix4(); + + var bones = this.initBones(); + var skeleton = new Skeleton( bones ); + + this.bind( skeleton, this.matrixWorld ); + + this.normalizeSkinWeights(); + +} + +SkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), { + + constructor: SkinnedMesh, + + isSkinnedMesh: true, + + initBones: function () { + + var bones = [], bone, gbone; + var i, il; + + if ( this.geometry && this.geometry.bones !== undefined ) { + + // first, create array of 'Bone' objects from geometry data + + for ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) { + + gbone = this.geometry.bones[ i ]; + + // create new 'Bone' object + + bone = new Bone(); + bones.push( bone ); + + // apply values + + bone.name = gbone.name; + bone.position.fromArray( gbone.pos ); + bone.quaternion.fromArray( gbone.rotq ); + if ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl ); + + } + + // second, create bone hierarchy + + for ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) { + + gbone = this.geometry.bones[ i ]; + + if ( ( gbone.parent !== - 1 ) && ( gbone.parent !== null ) && ( bones[ gbone.parent ] !== undefined ) ) { + + // subsequent bones in the hierarchy + + bones[ gbone.parent ].add( bones[ i ] ); + + } else { + + // topmost bone, immediate child of the skinned mesh + + this.add( bones[ i ] ); + + } + + } + + } + + // now the bones are part of the scene graph and children of the skinned mesh. + // let's update the corresponding matrices + + this.updateMatrixWorld( true ); + + return bones; + + }, + + bind: function ( skeleton, bindMatrix ) { + + this.skeleton = skeleton; + + if ( bindMatrix === undefined ) { + + this.updateMatrixWorld( true ); + + this.skeleton.calculateInverses(); + + bindMatrix = this.matrixWorld; + + } + + this.bindMatrix.copy( bindMatrix ); + this.bindMatrixInverse.getInverse( bindMatrix ); + + }, + + pose: function () { + + this.skeleton.pose(); + + }, + + normalizeSkinWeights: function () { + + var scale, i; + + if ( this.geometry && this.geometry.isGeometry ) { + + for ( i = 0; i < this.geometry.skinWeights.length; i ++ ) { + + var sw = this.geometry.skinWeights[ i ]; + + scale = 1.0 / sw.manhattanLength(); + + if ( scale !== Infinity ) { + + sw.multiplyScalar( scale ); + + } else { + + sw.set( 1, 0, 0, 0 ); // do something reasonable + + } + + } + + } else if ( this.geometry && this.geometry.isBufferGeometry ) { + + var vec = new Vector4(); + + var skinWeight = this.geometry.attributes.skinWeight; + + for ( i = 0; i < skinWeight.count; i ++ ) { + + vec.x = skinWeight.getX( i ); + vec.y = skinWeight.getY( i ); + vec.z = skinWeight.getZ( i ); + vec.w = skinWeight.getW( i ); + + scale = 1.0 / vec.manhattanLength(); + + if ( scale !== Infinity ) { + + vec.multiplyScalar( scale ); + + } else { + + vec.set( 1, 0, 0, 0 ); // do something reasonable + + } + + skinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w ); + + } + + } + + }, + + updateMatrixWorld: function ( force ) { + + Mesh.prototype.updateMatrixWorld.call( this, force ); + + if ( this.bindMode === 'attached' ) { + + this.bindMatrixInverse.getInverse( this.matrixWorld ); + + } else if ( this.bindMode === 'detached' ) { + + this.bindMatrixInverse.getInverse( this.bindMatrix ); + + } else { + + console.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode ); + + } + + }, + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + +} ); + + +export { SkinnedMesh }; diff --git a/lib/objects/Sky.js b/lib/objects/Sky.js new file mode 100644 index 0000000..2adb3ad --- /dev/null +++ b/lib/objects/Sky.js @@ -0,0 +1,222 @@ +/** + * @author zz85 / https://github.com/zz85 + * + * 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 +*/ + +THREE.Sky = function () { + + var shader = THREE.Sky.SkyShader; + + var material = new THREE.ShaderMaterial( { + fragmentShader: shader.fragmentShader, + vertexShader: shader.vertexShader, + uniforms: THREE.UniformsUtils.clone( shader.uniforms ), + side: THREE.BackSide + } ); + + THREE.Mesh.call( this, new THREE.BoxBufferGeometry( 1, 1, 1 ), material ); + +}; + +THREE.Sky.prototype = Object.create( THREE.Mesh.prototype ); + +THREE.Sky.SkyShader = { + + uniforms: { + luminance: { value: 1 }, + turbidity: { value: 2 }, + rayleigh: { value: 1 }, + mieCoefficient: { value: 0.005 }, + mieDirectionalG: { value: 0.8 }, + sunPosition: { value: new THREE.Vector3() } + }, + + vertexShader: [ + '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() {', + + ' vec4 worldPosition = modelMatrix * vec4( position, 1.0 );', + ' vWorldPosition = worldPosition.xyz;', + + ' gl_Position = projectionMatrix * modelViewMatrix * vec4( 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;', + + '}' + ].join( '\n' ), + + 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 );', + + '}' + ].join( '\n' ) + +}; diff --git a/lib/objects/Sprite.js b/lib/objects/Sprite.js new file mode 100644 index 0000000..e653fc1 --- /dev/null +++ b/lib/objects/Sprite.js @@ -0,0 +1,181 @@ +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + +import { Vector2 } from '../math/Vector2.js'; +import { Vector3 } from '../math/Vector3.js'; +import { Matrix4 } from '../math/Matrix4.js'; +import { Triangle } from '../math/Triangle.js'; +import { Object3D } from '../core/Object3D.js'; +import { BufferGeometry } from '../core/BufferGeometry.js'; +import { InterleavedBuffer } from '../core/InterleavedBuffer.js'; +import { InterleavedBufferAttribute } from '../core/InterleavedBufferAttribute.js'; +import { SpriteMaterial } from '../materials/SpriteMaterial.js'; + +var geometry; + +function Sprite( material ) { + + Object3D.call( this ); + + this.type = 'Sprite'; + + if ( geometry === undefined ) { + + geometry = new BufferGeometry(); + + var float32Array = new Float32Array( [ + - 0.5, - 0.5, 0, 0, 0, + 0.5, - 0.5, 0, 1, 0, + 0.5, 0.5, 0, 1, 1, + - 0.5, 0.5, 0, 0, 1 + ] ); + + var interleavedBuffer = new InterleavedBuffer( float32Array, 5 ); + + geometry.setIndex( [ 0, 1, 2, 0, 2, 3 ] ); + geometry.addAttribute( 'position', new InterleavedBufferAttribute( interleavedBuffer, 3, 0, false ) ); + geometry.addAttribute( 'uv', new InterleavedBufferAttribute( interleavedBuffer, 2, 3, false ) ); + + } + + this.geometry = geometry; + this.material = ( material !== undefined ) ? material : new SpriteMaterial(); + + this.center = new Vector2( 0.5, 0.5 ); + +} + +Sprite.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Sprite, + + isSprite: true, + + raycast: ( function () { + + var intersectPoint = new Vector3(); + var worldScale = new Vector3(); + var mvPosition = new Vector3(); + + var alignedPosition = new Vector2(); + var rotatedPosition = new Vector2(); + var viewWorldMatrix = new Matrix4(); + + var vA = new Vector3(); + var vB = new Vector3(); + var vC = new Vector3(); + + var uvA = new Vector2(); + var uvB = new Vector2(); + var uvC = new Vector2(); + + function transformVertex( vertexPosition, mvPosition, center, scale, sin, cos ) { + + // compute position in camera space + alignedPosition.subVectors( vertexPosition, center ).addScalar( 0.5 ).multiply( scale ); + + // to check if rotation is not zero + if ( sin !== undefined ) { + + rotatedPosition.x = ( cos * alignedPosition.x ) - ( sin * alignedPosition.y ); + rotatedPosition.y = ( sin * alignedPosition.x ) + ( cos * alignedPosition.y ); + + } else { + + rotatedPosition.copy( alignedPosition ); + + } + + + vertexPosition.copy( mvPosition ); + vertexPosition.x += rotatedPosition.x; + vertexPosition.y += rotatedPosition.y; + + // transform to world space + vertexPosition.applyMatrix4( viewWorldMatrix ); + + } + + return function raycast( raycaster, intersects ) { + + worldScale.setFromMatrixScale( this.matrixWorld ); + viewWorldMatrix.getInverse( this.modelViewMatrix ).premultiply( this.matrixWorld ); + mvPosition.setFromMatrixPosition( this.modelViewMatrix ); + + var rotation = this.material.rotation; + var sin, cos; + if ( rotation !== 0 ) { + + cos = Math.cos( rotation ); + sin = Math.sin( rotation ); + + } + + var center = this.center; + + transformVertex( vA.set( - 0.5, - 0.5, 0 ), mvPosition, center, worldScale, sin, cos ); + transformVertex( vB.set( 0.5, - 0.5, 0 ), mvPosition, center, worldScale, sin, cos ); + transformVertex( vC.set( 0.5, 0.5, 0 ), mvPosition, center, worldScale, sin, cos ); + + uvA.set( 0, 0 ); + uvB.set( 1, 0 ); + uvC.set( 1, 1 ); + + // check first triangle + var intersect = raycaster.ray.intersectTriangle( vA, vB, vC, false, intersectPoint ); + + if ( intersect === null ) { + + // check second triangle + transformVertex( vB.set( - 0.5, 0.5, 0 ), mvPosition, center, worldScale, sin, cos ); + uvB.set( 0, 1 ); + + intersect = raycaster.ray.intersectTriangle( vA, vC, vB, false, intersectPoint ); + if ( intersect === null ) { + + return; + + } + + } + + var distance = raycaster.ray.origin.distanceTo( intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + point: intersectPoint.clone(), + uv: Triangle.getUV( intersectPoint, vA, vB, vC, uvA, uvB, uvC, new Vector2() ), + face: null, + object: this + + } ); + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.material ).copy( this ); + + }, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + if ( source.center !== undefined ) this.center.copy( source.center ); + + return this; + + } + + +} ); + +export { Sprite }; diff --git a/lib/physi.js b/lib/physi.js new file mode 100644 index 0000000..9d5b716 --- /dev/null +++ b/lib/physi.js @@ -0,0 +1,1403 @@ +window.Physijs = (function() { + 'use strict'; + + var SUPPORT_TRANSFERABLE, + _is_simulating = false, + _Physijs = Physijs, // used for noConflict method + Physijs = {}, // object assigned to window.Physijs + Eventable, // class to provide simple event methods + getObjectId, // returns a unique ID for a Physijs mesh object + getEulerXYZFromQuaternion, getQuatertionFromEuler, + convertWorldPositionToObject, // Converts a world-space position to object-space + addObjectChildren, + + _temp1, _temp2, + _temp_vector3_1 = new THREE.Vector3, + _temp_vector3_2 = new THREE.Vector3, + _temp_matrix4_1 = new THREE.Matrix4, + _quaternion_1 = new THREE.Quaternion, + + // constants + MESSAGE_TYPES = { + WORLDREPORT: 0, + COLLISIONREPORT: 1, + VEHICLEREPORT: 2, + CONSTRAINTREPORT: 3 + }, + REPORT_ITEMSIZE = 14, + COLLISIONREPORT_ITEMSIZE = 5, + VEHICLEREPORT_ITEMSIZE = 9, + CONSTRAINTREPORT_ITEMSIZE = 6; + + Physijs.scripts = {}; + + Eventable = function() { + this._eventListeners = {}; + }; + Eventable.prototype.addEventListener = function( event_name, callback ) { + if ( !this._eventListeners.hasOwnProperty( event_name ) ) { + this._eventListeners[event_name] = []; + } + this._eventListeners[event_name].push( callback ); + }; + Eventable.prototype.removeEventListener = function( event_name, callback ) { + var index; + + if ( !this._eventListeners.hasOwnProperty( event_name ) ) return false; + + if ( (index = this._eventListeners[event_name].indexOf( callback )) >= 0 ) { + this._eventListeners[event_name].splice( index, 1 ); + return true; + } + + return false; + }; + Eventable.prototype.dispatchEvent = function( event_name ) { + var i, + parameters = Array.prototype.splice.call( arguments, 1 ); + + if ( this._eventListeners.hasOwnProperty( event_name ) ) { + for ( i = 0; i < this._eventListeners[event_name].length; i++ ) { + this._eventListeners[event_name][i].apply( this, parameters ); + } + } + }; + Eventable.make = function( obj ) { + obj.prototype.addEventListener = Eventable.prototype.addEventListener; + obj.prototype.removeEventListener = Eventable.prototype.removeEventListener; + obj.prototype.dispatchEvent = Eventable.prototype.dispatchEvent; + }; + + getObjectId = (function() { + var _id = 1; + return function() { + return _id++; + }; + })(); + + getEulerXYZFromQuaternion = function ( x, y, z, w ) { + return new THREE.Vector3( + Math.atan2( 2 * ( x * w - y * z ), ( w * w - x * x - y * y + z * z ) ), + Math.asin( 2 * ( x * z + y * w ) ), + Math.atan2( 2 * ( z * w - x * y ), ( w * w + x * x - y * y - z * z ) ) + ); + }; + + getQuatertionFromEuler = function( x, y, z ) { + var c1, s1, c2, s2, c3, s3, c1c2, s1s2; + c1 = Math.cos( y ); + s1 = Math.sin( y ); + c2 = Math.cos( -z ); + s2 = Math.sin( -z ); + c3 = Math.cos( x ); + s3 = Math.sin( x ); + + c1c2 = c1 * c2; + s1s2 = s1 * s2; + + return { + w: c1c2 * c3 - s1s2 * s3, + x: c1c2 * s3 + s1s2 * c3, + y: s1 * c2 * c3 + c1 * s2 * s3, + z: c1 * s2 * c3 - s1 * c2 * s3 + }; + }; + + convertWorldPositionToObject = function( position, object ) { + _temp_matrix4_1.identity(); // reset temp matrix + + // Set the temp matrix's rotation to the object's rotation + _temp_matrix4_1.identity().makeRotationFromQuaternion( object.quaternion ); + + // Invert rotation matrix in order to "unrotate" a point back to object space + _temp_matrix4_1.getInverse( _temp_matrix4_1 ); + + // Yay! Temp vars! + _temp_vector3_1.copy( position ); + _temp_vector3_2.copy( object.position ); + + // Apply the rotation + + return _temp_vector3_1.sub( _temp_vector3_2 ).applyMatrix4( _temp_matrix4_1 ); + }; + + + + // Physijs.noConflict + Physijs.noConflict = function() { + window.Physijs = _Physijs; + return Physijs; + }; + + + // Physijs.createMaterial + Physijs.createMaterial = function( material, friction, restitution ) { + var physijs_material = function(){}; + physijs_material.prototype = material; + physijs_material = new physijs_material; + + physijs_material._physijs = { + id: material.id, + friction: friction === undefined ? .8 : friction, + restitution: restitution === undefined ? .2 : restitution + }; + + return physijs_material; + }; + + + // Constraints + Physijs.PointConstraint = function( objecta, objectb, position ) { + if ( position === undefined ) { + position = objectb; + objectb = undefined; + } + + this.type = 'point'; + this.appliedImpulse = 0; + this.id = getObjectId(); + this.objecta = objecta._physijs.id; + this.positiona = convertWorldPositionToObject( position, objecta ).clone(); + + if ( objectb ) { + this.objectb = objectb._physijs.id; + this.positionb = convertWorldPositionToObject( position, objectb ).clone(); + } + }; + Physijs.PointConstraint.prototype.getDefinition = function() { + return { + type: this.type, + id: this.id, + objecta: this.objecta, + objectb: this.objectb, + positiona: this.positiona, + positionb: this.positionb + }; + }; + + Physijs.HingeConstraint = function( objecta, objectb, position, axis ) { + if ( axis === undefined ) { + axis = position; + position = objectb; + objectb = undefined; + } + + this.type = 'hinge'; + this.appliedImpulse = 0; + this.id = getObjectId(); + this.scene = objecta.parent; + this.objecta = objecta._physijs.id; + this.positiona = convertWorldPositionToObject( position, objecta ).clone(); + this.position = position.clone(); + this.axis = axis; + + if ( objectb ) { + this.objectb = objectb._physijs.id; + this.positionb = convertWorldPositionToObject( position, objectb ).clone(); + } + }; + Physijs.HingeConstraint.prototype.getDefinition = function() { + return { + type: this.type, + id: this.id, + objecta: this.objecta, + objectb: this.objectb, + positiona: this.positiona, + positionb: this.positionb, + axis: this.axis + }; + }; + /* + * low = minimum angle in radians + * high = maximum angle in radians + * bias_factor = applied as a factor to constraint error + * relaxation_factor = controls bounce (0.0 == no bounce) + */ + Physijs.HingeConstraint.prototype.setLimits = function( low, high, bias_factor, relaxation_factor ) { + this.scene.execute( 'hinge_setLimits', { constraint: this.id, low: low, high: high, bias_factor: bias_factor, relaxation_factor: relaxation_factor } ); + }; + Physijs.HingeConstraint.prototype.enableAngularMotor = function( velocity, acceleration ) { + this.scene.execute( 'hinge_enableAngularMotor', { constraint: this.id, velocity: velocity, acceleration: acceleration } ); + }; + Physijs.HingeConstraint.prototype.disableMotor = function( velocity, acceleration ) { + this.scene.execute( 'hinge_disableMotor', { constraint: this.id } ); + }; + + Physijs.SliderConstraint = function( objecta, objectb, position, axis ) { + if ( axis === undefined ) { + axis = position; + position = objectb; + objectb = undefined; + } + + this.type = 'slider'; + this.appliedImpulse = 0; + this.id = getObjectId(); + this.scene = objecta.parent; + this.objecta = objecta._physijs.id; + this.positiona = convertWorldPositionToObject( position, objecta ).clone(); + this.axis = axis; + + if ( objectb ) { + this.objectb = objectb._physijs.id; + this.positionb = convertWorldPositionToObject( position, objectb ).clone(); + } + }; + Physijs.SliderConstraint.prototype.getDefinition = function() { + return { + type: this.type, + id: this.id, + objecta: this.objecta, + objectb: this.objectb, + positiona: this.positiona, + positionb: this.positionb, + axis: this.axis + }; + }; + Physijs.SliderConstraint.prototype.setLimits = function( lin_lower, lin_upper, ang_lower, ang_upper ) { + this.scene.execute( 'slider_setLimits', { constraint: this.id, lin_lower: lin_lower, lin_upper: lin_upper, ang_lower: ang_lower, ang_upper: ang_upper } ); + }; + Physijs.SliderConstraint.prototype.setRestitution = function( linear, angular ) { + this.scene.execute( + 'slider_setRestitution', + { + constraint: this.id, + linear: linear, + angular: angular + } + ); + }; + Physijs.SliderConstraint.prototype.enableLinearMotor = function( velocity, acceleration) { + this.scene.execute( 'slider_enableLinearMotor', { constraint: this.id, velocity: velocity, acceleration: acceleration } ); + }; + Physijs.SliderConstraint.prototype.disableLinearMotor = function() { + this.scene.execute( 'slider_disableLinearMotor', { constraint: this.id } ); + }; + Physijs.SliderConstraint.prototype.enableAngularMotor = function( velocity, acceleration ) { + this.scene.execute( 'slider_enableAngularMotor', { constraint: this.id, velocity: velocity, acceleration: acceleration } ); + }; + Physijs.SliderConstraint.prototype.disableAngularMotor = function() { + this.scene.execute( 'slider_disableAngularMotor', { constraint: this.id } ); + }; + + Physijs.ConeTwistConstraint = function( objecta, objectb, position ) { + if ( position === undefined ) { + throw 'Both objects must be defined in a ConeTwistConstraint.'; + } + this.type = 'conetwist'; + this.appliedImpulse = 0; + this.id = getObjectId(); + this.scene = objecta.parent; + this.objecta = objecta._physijs.id; + this.positiona = convertWorldPositionToObject( position, objecta ).clone(); + this.objectb = objectb._physijs.id; + this.positionb = convertWorldPositionToObject( position, objectb ).clone(); + this.axisa = { x: objecta.rotation.x, y: objecta.rotation.y, z: objecta.rotation.z }; + this.axisb = { x: objectb.rotation.x, y: objectb.rotation.y, z: objectb.rotation.z }; + }; + Physijs.ConeTwistConstraint.prototype.getDefinition = function() { + return { + type: this.type, + id: this.id, + objecta: this.objecta, + objectb: this.objectb, + positiona: this.positiona, + positionb: this.positionb, + axisa: this.axisa, + axisb: this.axisb + }; + }; + Physijs.ConeTwistConstraint.prototype.setLimit = function( x, y, z ) { + this.scene.execute( 'conetwist_setLimit', { constraint: this.id, x: x, y: y, z: z } ); + }; + Physijs.ConeTwistConstraint.prototype.enableMotor = function() { + this.scene.execute( 'conetwist_enableMotor', { constraint: this.id } ); + }; + Physijs.ConeTwistConstraint.prototype.setMaxMotorImpulse = function( max_impulse ) { + this.scene.execute( 'conetwist_setMaxMotorImpulse', { constraint: this.id, max_impulse: max_impulse } ); + }; + Physijs.ConeTwistConstraint.prototype.setMotorTarget = function( target ) { + if ( target instanceof THREE.Vector3 ) { + target = new THREE.Quaternion().setFromEuler( new THREE.Euler( target.x, target.y, target.z ) ); + } else if ( target instanceof THREE.Euler ) { + target = new THREE.Quaternion().setFromEuler( target ); + } else if ( target instanceof THREE.Matrix4 ) { + target = new THREE.Quaternion().setFromRotationMatrix( target ); + } + this.scene.execute( 'conetwist_setMotorTarget', { constraint: this.id, x: target.x, y: target.y, z: target.z, w: target.w } ); + }; + Physijs.ConeTwistConstraint.prototype.disableMotor = function() { + this.scene.execute( 'conetwist_disableMotor', { constraint: this.id } ); + }; + + Physijs.DOFConstraint = function( objecta, objectb, position ) { + if ( position === undefined ) { + position = objectb; + objectb = undefined; + } + this.type = 'dof'; + this.appliedImpulse = 0; + this.id = getObjectId(); + this.scene = objecta.parent; + this.objecta = objecta._physijs.id; + this.positiona = convertWorldPositionToObject( position, objecta ).clone(); + this.axisa = { x: objecta.rotation.x, y: objecta.rotation.y, z: objecta.rotation.z }; + + if ( objectb ) { + this.objectb = objectb._physijs.id; + this.positionb = convertWorldPositionToObject( position, objectb ).clone(); + this.axisb = { x: objectb.rotation.x, y: objectb.rotation.y, z: objectb.rotation.z }; + } + }; + Physijs.DOFConstraint.prototype.getDefinition = function() { + return { + type: this.type, + id: this.id, + objecta: this.objecta, + objectb: this.objectb, + positiona: this.positiona, + positionb: this.positionb, + axisa: this.axisa, + axisb: this.axisb + }; + }; + Physijs.DOFConstraint.prototype.setLinearLowerLimit = function( limit ) { + this.scene.execute( 'dof_setLinearLowerLimit', { constraint: this.id, x: limit.x, y: limit.y, z: limit.z } ); + }; + Physijs.DOFConstraint.prototype.setLinearUpperLimit = function( limit ) { + this.scene.execute( 'dof_setLinearUpperLimit', { constraint: this.id, x: limit.x, y: limit.y, z: limit.z } ); + }; + Physijs.DOFConstraint.prototype.setAngularLowerLimit = function( limit ) { + this.scene.execute( 'dof_setAngularLowerLimit', { constraint: this.id, x: limit.x, y: limit.y, z: limit.z } ); + }; + Physijs.DOFConstraint.prototype.setAngularUpperLimit = function( limit ) { + this.scene.execute( 'dof_setAngularUpperLimit', { constraint: this.id, x: limit.x, y: limit.y, z: limit.z } ); + }; + Physijs.DOFConstraint.prototype.enableAngularMotor = function( which ) { + this.scene.execute( 'dof_enableAngularMotor', { constraint: this.id, which: which } ); + }; + Physijs.DOFConstraint.prototype.configureAngularMotor = function( which, low_angle, high_angle, velocity, max_force ) { + this.scene.execute( 'dof_configureAngularMotor', { constraint: this.id, which: which, low_angle: low_angle, high_angle: high_angle, velocity: velocity, max_force: max_force } ); + }; + Physijs.DOFConstraint.prototype.disableAngularMotor = function( which ) { + this.scene.execute( 'dof_disableAngularMotor', { constraint: this.id, which: which } ); + }; + + // Physijs.Scene + Physijs.Scene = function( params ) { + var self = this; + + Eventable.call( this ); + THREE.Scene.call( this ); + + this._worker = new Worker( Physijs.scripts.worker || 'physijs_worker.js' ); + this._worker.transferableMessage = this._worker.webkitPostMessage || this._worker.postMessage; + this._materials_ref_counts = {}; + this._objects = {}; + this._vehicles = {}; + this._constraints = {}; + + var ab = new ArrayBuffer( 1 ); + this._worker.transferableMessage( ab, [ab] ); + SUPPORT_TRANSFERABLE = ( ab.byteLength === 0 ); + + this._worker.onmessage = function ( event ) { + var _temp, + data = event.data; + + if ( data instanceof ArrayBuffer && data.byteLength !== 1 ) { // byteLength === 1 is the worker making a SUPPORT_TRANSFERABLE test + data = new Float32Array( data ); + } + + if ( data instanceof Float32Array ) { + + // transferable object + switch ( data[0] ) { + case MESSAGE_TYPES.WORLDREPORT: + self._updateScene( data ); + break; + + case MESSAGE_TYPES.COLLISIONREPORT: + self._updateCollisions( data ); + break; + + case MESSAGE_TYPES.VEHICLEREPORT: + self._updateVehicles( data ); + break; + + case MESSAGE_TYPES.CONSTRAINTREPORT: + self._updateConstraints( data ); + break; + } + + } else { + + if ( data.cmd ) { + + // non-transferable object + switch ( data.cmd ) { + case 'objectReady': + _temp = data.params; + if ( self._objects[ _temp ] ) { + self._objects[ _temp ].dispatchEvent( 'ready' ); + } + break; + + case 'worldReady': + self.dispatchEvent( 'ready' ); + break; + + case 'vehicle': + window.test = data; + break; + + default: + // Do nothing, just show the message + console.debug('Received: ' + data.cmd); + console.dir(data.params); + break; + } + + } else { + + switch ( data[0] ) { + case MESSAGE_TYPES.WORLDREPORT: + self._updateScene( data ); + break; + + case MESSAGE_TYPES.COLLISIONREPORT: + self._updateCollisions( data ); + break; + + case MESSAGE_TYPES.VEHICLEREPORT: + self._updateVehicles( data ); + break; + + case MESSAGE_TYPES.CONSTRAINTREPORT: + self._updateConstraints( data ); + break; + } + + } + + } + }; + + + params = params || {}; + params.ammo = Physijs.scripts.ammo || 'ammo.js'; + params.fixedTimeStep = params.fixedTimeStep || 1 / 60; + params.rateLimit = params.rateLimit || true; + this.execute( 'init', params ); + }; + Physijs.Scene.prototype = new THREE.Scene; + Physijs.Scene.prototype.constructor = Physijs.Scene; + Eventable.make( Physijs.Scene ); + + Physijs.Scene.prototype._updateScene = function( data ) { + var num_objects = data[1], + object, + i, offset; + + for ( i = 0; i < num_objects; i++ ) { + offset = 2 + i * REPORT_ITEMSIZE; + object = this._objects[ data[ offset ] ]; + + if ( object === undefined ) { + continue; + } + + if ( object.__dirtyPosition === false ) { + object.position.set( + data[ offset + 1 ], + data[ offset + 2 ], + data[ offset + 3 ] + ); + } + + if ( object.__dirtyRotation === false ) { + object.quaternion.set( + data[ offset + 4 ], + data[ offset + 5 ], + data[ offset + 6 ], + data[ offset + 7 ] + ); + } + + object._physijs.linearVelocity.set( + data[ offset + 8 ], + data[ offset + 9 ], + data[ offset + 10 ] + ); + + object._physijs.angularVelocity.set( + data[ offset + 11 ], + data[ offset + 12 ], + data[ offset + 13 ] + ); + + } + + if ( SUPPORT_TRANSFERABLE ) { + // Give the typed array back to the worker + this._worker.transferableMessage( data.buffer, [data.buffer] ); + } + + _is_simulating = false; + this.dispatchEvent( 'update' ); + }; + + Physijs.Scene.prototype._updateVehicles = function( data ) { + var vehicle, wheel, + i, offset; + + for ( i = 0; i < ( data.length - 1 ) / VEHICLEREPORT_ITEMSIZE; i++ ) { + offset = 1 + i * VEHICLEREPORT_ITEMSIZE; + vehicle = this._vehicles[ data[ offset ] ]; + + if ( vehicle === undefined ) { + continue; + } + + wheel = vehicle.wheels[ data[ offset + 1 ] ]; + + wheel.position.set( + data[ offset + 2 ], + data[ offset + 3 ], + data[ offset + 4 ] + ); + + wheel.quaternion.set( + data[ offset + 5 ], + data[ offset + 6 ], + data[ offset + 7 ], + data[ offset + 8 ] + ); + } + + if ( SUPPORT_TRANSFERABLE ) { + // Give the typed array back to the worker + this._worker.transferableMessage( data.buffer, [data.buffer] ); + } + }; + + Physijs.Scene.prototype._updateConstraints = function( data ) { + var constraint, object, + i, offset; + + for ( i = 0; i < ( data.length - 1 ) / CONSTRAINTREPORT_ITEMSIZE; i++ ) { + offset = 1 + i * CONSTRAINTREPORT_ITEMSIZE; + constraint = this._constraints[ data[ offset ] ]; + object = this._objects[ data[ offset + 1 ] ]; + + if ( constraint === undefined || object === undefined ) { + continue; + } + + _temp_vector3_1.set( + data[ offset + 2 ], + data[ offset + 3 ], + data[ offset + 4 ] + ); + _temp_matrix4_1.extractRotation( object.matrix ); + _temp_vector3_1.applyMatrix4( _temp_matrix4_1 ); + + constraint.positiona.addVectors( object.position, _temp_vector3_1 ); + constraint.appliedImpulse = data[ offset + 5 ] ; + } + + if ( SUPPORT_TRANSFERABLE ) { + // Give the typed array back to the worker + this._worker.transferableMessage( data.buffer, [data.buffer] ); + } + }; + + Physijs.Scene.prototype._updateCollisions = function( data ) { + /** + * #TODO + * This is probably the worst way ever to handle collisions. The inherent evilness is a residual + * effect from the previous version's evilness which mutated when switching to transferable objects. + * + * If you feel inclined to make this better, please do so. + */ + + var i, j, offset, object, object2, id1, id2, + collisions = {}, normal_offsets = {}; + + // Build collision manifest + for ( i = 0; i < data[1]; i++ ) { + offset = 2 + i * COLLISIONREPORT_ITEMSIZE; + object = data[ offset ]; + object2 = data[ offset + 1 ]; + + normal_offsets[ object + '-' + object2 ] = offset + 2; + normal_offsets[ object2 + '-' + object ] = -1 * ( offset + 2 ); + + // Register collisions for both the object colliding and the object being collided with + if ( !collisions[ object ] ) collisions[ object ] = []; + collisions[ object ].push( object2 ); + + if ( !collisions[ object2 ] ) collisions[ object2 ] = []; + collisions[ object2 ].push( object ); + } + + // Deal with collisions + for ( id1 in this._objects ) { + if ( !this._objects.hasOwnProperty( id1 ) ) continue; + object = this._objects[ id1 ]; + + // If object touches anything, ... + if ( collisions[ id1 ] ) { + + // Clean up touches array + for ( j = 0; j < object._physijs.touches.length; j++ ) { + if ( collisions[ id1 ].indexOf( object._physijs.touches[j] ) === -1 ) { + object._physijs.touches.splice( j--, 1 ); + } + } + + // Handle each colliding object + for ( j = 0; j < collisions[ id1 ].length; j++ ) { + id2 = collisions[ id1 ][ j ]; + object2 = this._objects[ id2 ]; + + if ( object2 ) { + // If object was not already touching object2, notify object + if ( object._physijs.touches.indexOf( id2 ) === -1 ) { + object._physijs.touches.push( id2 ); + + _temp_vector3_1.subVectors( object.getLinearVelocity(), object2.getLinearVelocity() ); + _temp1 = _temp_vector3_1.clone(); + + _temp_vector3_1.subVectors( object.getAngularVelocity(), object2.getAngularVelocity() ); + _temp2 = _temp_vector3_1.clone(); + + var normal_offset = normal_offsets[ object._physijs.id + '-' + object2._physijs.id ]; + if ( normal_offset > 0 ) { + _temp_vector3_1.set( + -data[ normal_offset ], + -data[ normal_offset + 1 ], + -data[ normal_offset + 2 ] + ); + } else { + normal_offset *= -1; + _temp_vector3_1.set( + data[ normal_offset ], + data[ normal_offset + 1 ], + data[ normal_offset + 2 ] + ); + } + + object.dispatchEvent( 'collision', object2, _temp1, _temp2, _temp_vector3_1 ); + } + } + } + + } else { + + // not touching other objects + object._physijs.touches.length = 0; + + } + + } + + this.collisions = collisions; + + if ( SUPPORT_TRANSFERABLE ) { + // Give the typed array back to the worker + this._worker.transferableMessage( data.buffer, [data.buffer] ); + } + }; + + Physijs.Scene.prototype.addConstraint = function ( constraint, show_marker ) { + this._constraints[ constraint.id ] = constraint; + this.execute( 'addConstraint', constraint.getDefinition() ); + + if ( show_marker ) { + var marker; + + switch ( constraint.type ) { + case 'point': + marker = new THREE.Mesh( + new THREE.SphereGeometry( 1.5 ), + new THREE.MeshNormalMaterial + ); + marker.position.copy( constraint.positiona ); + this._objects[ constraint.objecta ].add( marker ); + break; + + case 'hinge': + marker = new THREE.Mesh( + new THREE.SphereGeometry( 1.5 ), + new THREE.MeshNormalMaterial + ); + marker.position.copy( constraint.positiona ); + this._objects[ constraint.objecta ].add( marker ); + break; + + case 'slider': + marker = new THREE.Mesh( + new THREE.BoxGeometry( 10, 1, 1 ), + new THREE.MeshNormalMaterial + ); + marker.position.copy( constraint.positiona ); + // This rotation isn't right if all three axis are non-0 values + // TODO: change marker's rotation order to ZYX + marker.rotation.set( + constraint.axis.y, // yes, y and + constraint.axis.x, // x axis are swapped + constraint.axis.z + ); + this._objects[ constraint.objecta ].add( marker ); + break; + + case 'conetwist': + marker = new THREE.Mesh( + new THREE.SphereGeometry( 1.5 ), + new THREE.MeshNormalMaterial + ); + marker.position.copy( constraint.positiona ); + this._objects[ constraint.objecta ].add( marker ); + break; + + case 'dof': + marker = new THREE.Mesh( + new THREE.SphereGeometry( 1.5 ), + new THREE.MeshNormalMaterial + ); + marker.position.copy( constraint.positiona ); + this._objects[ constraint.objecta ].add( marker ); + break; + } + } + + return constraint; + }; + + Physijs.Scene.prototype.onSimulationResume = function() { + this.execute( 'onSimulationResume', { } ); + }; + + Physijs.Scene.prototype.removeConstraint = function( constraint ) { + if ( this._constraints[constraint.id ] !== undefined ) { + this.execute( 'removeConstraint', { id: constraint.id } ); + delete this._constraints[ constraint.id ]; + } + }; + + Physijs.Scene.prototype.execute = function( cmd, params ) { + this._worker.postMessage({ cmd: cmd, params: params }); + }; + + addObjectChildren = function( parent, object ) { + var i; + + for ( i = 0; i < object.children.length; i++ ) { + if ( object.children[i]._physijs ) { + object.children[i].updateMatrix(); + object.children[i].updateMatrixWorld(); + + _temp_vector3_1.setFromMatrixPosition( object.children[i].matrixWorld ); + _quaternion_1.setFromRotationMatrix( object.children[i].matrixWorld ); + + object.children[i]._physijs.position_offset = { + x: _temp_vector3_1.x, + y: _temp_vector3_1.y, + z: _temp_vector3_1.z + }; + + object.children[i]._physijs.rotation = { + x: _quaternion_1.x, + y: _quaternion_1.y, + z: _quaternion_1.z, + w: _quaternion_1.w + }; + + parent._physijs.children.push( object.children[i]._physijs ); + } + + addObjectChildren( parent, object.children[i] ); + } + }; + + Physijs.Scene.prototype.add = function( object ) { + THREE.Mesh.prototype.add.call( this, object ); + + if ( object._physijs ) { + + object.world = this; + + if ( object instanceof Physijs.Vehicle ) { + + this.add( object.mesh ); + this._vehicles[ object._physijs.id ] = object; + this.execute( 'addVehicle', object._physijs ); + + } else { + + object.__dirtyPosition = false; + object.__dirtyRotation = false; + this._objects[object._physijs.id] = object; + + if ( object.children.length ) { + object._physijs.children = []; + addObjectChildren( object, object ); + } + + if ( object.material._physijs ) { + if ( !this._materials_ref_counts.hasOwnProperty( object.material._physijs.id ) ) { + this.execute( 'registerMaterial', object.material._physijs ); + object._physijs.materialId = object.material._physijs.id; + this._materials_ref_counts[object.material._physijs.id] = 1; + } else { + this._materials_ref_counts[object.material._physijs.id]++; + } + } + + // Object starting position + rotation + object._physijs.position = { x: object.position.x, y: object.position.y, z: object.position.z }; + object._physijs.rotation = { x: object.quaternion.x, y: object.quaternion.y, z: object.quaternion.z, w: object.quaternion.w }; + + // Check for scaling + var mass_scaling = new THREE.Vector3( 1, 1, 1 ); + if ( object._physijs.width ) { + object._physijs.width *= object.scale.x; + } + if ( object._physijs.height ) { + object._physijs.height *= object.scale.y; + } + if ( object._physijs.depth ) { + object._physijs.depth *= object.scale.z; + } + + this.execute( 'addObject', object._physijs ); + + } + } + }; + + Physijs.Scene.prototype.remove = function( object ) { + if ( object instanceof Physijs.Vehicle ) { + this.execute( 'removeVehicle', { id: object._physijs.id } ); + while( object.wheels.length ) { + this.remove( object.wheels.pop() ); + } + this.remove( object.mesh ); + delete this._vehicles[ object._physijs.id ]; + } else { + THREE.Mesh.prototype.remove.call( this, object ); + if ( object._physijs ) { + delete this._objects[object._physijs.id]; + this.execute( 'removeObject', { id: object._physijs.id } ); + } + } + if ( object.material && object.material._physijs && this._materials_ref_counts.hasOwnProperty( object.material._physijs.id ) ) { + this._materials_ref_counts[object.material._physijs.id]--; + if(this._materials_ref_counts[object.material._physijs.id] == 0) { + this.execute( 'unRegisterMaterial', object.material._physijs ); + delete this._materials_ref_counts[object.material._physijs.id]; + } + } + }; + + Physijs.Scene.prototype.setFixedTimeStep = function( fixedTimeStep ) { + if ( fixedTimeStep ) { + this.execute( 'setFixedTimeStep', fixedTimeStep ); + } + }; + + Physijs.Scene.prototype.setGravity = function( gravity ) { + if ( gravity ) { + this.execute( 'setGravity', gravity ); + } + }; + + Physijs.Scene.prototype.simulate = function( timeStep, maxSubSteps ) { + var object_id, object, update; + + if ( _is_simulating ) { + return false; + } + + _is_simulating = true; + + for ( object_id in this._objects ) { + if ( !this._objects.hasOwnProperty( object_id ) ) continue; + + object = this._objects[object_id]; + + if ( object.__dirtyPosition || object.__dirtyRotation ) { + update = { id: object._physijs.id }; + + if ( object.__dirtyPosition ) { + update.pos = { x: object.position.x, y: object.position.y, z: object.position.z }; + object.__dirtyPosition = false; + } + + if ( object.__dirtyRotation ) { + update.quat = { x: object.quaternion.x, y: object.quaternion.y, z: object.quaternion.z, w: object.quaternion.w }; + object.__dirtyRotation = false; + } + + this.execute( 'updateTransform', update ); + } + } + + this.execute( 'simulate', { timeStep: timeStep, maxSubSteps: maxSubSteps } ); + + return true; + }; + + + // Phsijs.Mesh + Physijs.Mesh = function ( geometry, material, mass ) { + var index; + + if ( !geometry ) { + return; + } + + Eventable.call( this ); + THREE.Mesh.call( this, geometry, material ); + + if ( !geometry.boundingBox ) { + geometry.computeBoundingBox(); + } + + this._physijs = { + type: null, + id: getObjectId(), + mass: mass || 0, + touches: [], + linearVelocity: new THREE.Vector3, + angularVelocity: new THREE.Vector3 + }; + }; + Physijs.Mesh.prototype = new THREE.Mesh; + Physijs.Mesh.prototype.constructor = Physijs.Mesh; + Eventable.make( Physijs.Mesh ); + + // Physijs.Mesh.mass + Physijs.Mesh.prototype.__defineGetter__('mass', function() { + return this._physijs.mass; + }); + Physijs.Mesh.prototype.__defineSetter__('mass', function( mass ) { + this._physijs.mass = mass; + if ( this.world ) { + this.world.execute( 'updateMass', { id: this._physijs.id, mass: mass } ); + } + }); + + // Physijs.Mesh.applyCentralImpulse + Physijs.Mesh.prototype.applyCentralImpulse = function ( force ) { + if ( this.world ) { + this.world.execute( 'applyCentralImpulse', { id: this._physijs.id, x: force.x, y: force.y, z: force.z } ); + } + }; + + // Physijs.Mesh.applyImpulse + Physijs.Mesh.prototype.applyImpulse = function ( force, offset ) { + if ( this.world ) { + this.world.execute( 'applyImpulse', { id: this._physijs.id, impulse_x: force.x, impulse_y: force.y, impulse_z: force.z, x: offset.x, y: offset.y, z: offset.z } ); + } + }; + + // Physijs.Mesh.applyTorque + Physijs.Mesh.prototype.applyTorque = function ( force ) { + if ( this.world ) { + this.world.execute( 'applyTorque', { id: this._physijs.id, torque_x: force.x, torque_y: force.y, torque_z: force.z } ); + } + }; + + // Physijs.Mesh.applyCentralForce + Physijs.Mesh.prototype.applyCentralForce = function ( force ) { + if ( this.world ) { + this.world.execute( 'applyCentralForce', { id: this._physijs.id, x: force.x, y: force.y, z: force.z } ); + } + }; + + // Physijs.Mesh.applyForce + Physijs.Mesh.prototype.applyForce = function ( force, offset ) { + if ( this.world ) { + this.world.execute( 'applyForce', { id: this._physijs.id, force_x: force.x, force_y : force.y, force_z : force.z, x: offset.x, y: offset.y, z: offset.z } ); + } + }; + + // Physijs.Mesh.getAngularVelocity + Physijs.Mesh.prototype.getAngularVelocity = function () { + return this._physijs.angularVelocity; + }; + + // Physijs.Mesh.setAngularVelocity + Physijs.Mesh.prototype.setAngularVelocity = function ( velocity ) { + if ( this.world ) { + this.world.execute( 'setAngularVelocity', { id: this._physijs.id, x: velocity.x, y: velocity.y, z: velocity.z } ); + } + }; + + // Physijs.Mesh.getLinearVelocity + Physijs.Mesh.prototype.getLinearVelocity = function () { + return this._physijs.linearVelocity; + }; + + // Physijs.Mesh.setLinearVelocity + Physijs.Mesh.prototype.setLinearVelocity = function ( velocity ) { + if ( this.world ) { + this.world.execute( 'setLinearVelocity', { id: this._physijs.id, x: velocity.x, y: velocity.y, z: velocity.z } ); + } + }; + + // Physijs.Mesh.setAngularFactor + Physijs.Mesh.prototype.setAngularFactor = function ( factor ) { + if ( this.world ) { + this.world.execute( 'setAngularFactor', { id: this._physijs.id, x: factor.x, y: factor.y, z: factor.z } ); + } + }; + + // Physijs.Mesh.setLinearFactor + Physijs.Mesh.prototype.setLinearFactor = function ( factor ) { + if ( this.world ) { + this.world.execute( 'setLinearFactor', { id: this._physijs.id, x: factor.x, y: factor.y, z: factor.z } ); + } + }; + + // Physijs.Mesh.setDamping + Physijs.Mesh.prototype.setDamping = function ( linear, angular ) { + if ( this.world ) { + this.world.execute( 'setDamping', { id: this._physijs.id, linear: linear, angular: angular } ); + } + }; + + // Physijs.Mesh.setCcdMotionThreshold + Physijs.Mesh.prototype.setCcdMotionThreshold = function ( threshold ) { + if ( this.world ) { + this.world.execute( 'setCcdMotionThreshold', { id: this._physijs.id, threshold: threshold } ); + } + }; + + // Physijs.Mesh.setCcdSweptSphereRadius + Physijs.Mesh.prototype.setCcdSweptSphereRadius = function ( radius ) { + if ( this.world ) { + this.world.execute( 'setCcdSweptSphereRadius', { id: this._physijs.id, radius: radius } ); + } + }; + + + // Physijs.PlaneMesh + Physijs.PlaneMesh = function ( geometry, material, mass ) { + var width, height; + + Physijs.Mesh.call( this, geometry, material, mass ); + + if ( !geometry.boundingBox ) { + geometry.computeBoundingBox(); + } + + width = geometry.boundingBox.max.x - geometry.boundingBox.min.x; + height = geometry.boundingBox.max.y - geometry.boundingBox.min.y; + + this._physijs.type = 'plane'; + this._physijs.normal = geometry.faces[0].normal.clone(); + this._physijs.mass = (typeof mass === 'undefined') ? width * height : mass; + }; + Physijs.PlaneMesh.prototype = new Physijs.Mesh; + Physijs.PlaneMesh.prototype.constructor = Physijs.PlaneMesh; + + // Physijs.HeightfieldMesh + Physijs.HeightfieldMesh = function ( geometry, material, mass, xdiv, ydiv) { + Physijs.Mesh.call( this, geometry, material, mass ); + + this._physijs.type = 'heightfield'; + this._physijs.xsize = geometry.boundingBox.max.x - geometry.boundingBox.min.x; + this._physijs.ysize = geometry.boundingBox.max.y - geometry.boundingBox.min.y; + this._physijs.xpts = (typeof xdiv === 'undefined') ? Math.sqrt(geometry.vertices.length) : xdiv + 1; + this._physijs.ypts = (typeof ydiv === 'undefined') ? Math.sqrt(geometry.vertices.length) : ydiv + 1; + // note - this assumes our plane geometry is square, unless we pass in specific xdiv and ydiv + this._physijs.absMaxHeight = Math.max(geometry.boundingBox.max.z,Math.abs(geometry.boundingBox.min.z)); + + var points = []; + + var a, b; + for ( var i = 0; i < geometry.vertices.length; i++ ) { + + a = i % this._physijs.xpts; + b = Math.round( ( i / this._physijs.xpts ) - ( (i % this._physijs.xpts) / this._physijs.xpts ) ); + points[i] = geometry.vertices[ a + ( ( this._physijs.ypts - b - 1 ) * this._physijs.ypts ) ].z; + + //points[i] = geometry.vertices[i]; + } + + this._physijs.points = points; + }; + Physijs.HeightfieldMesh.prototype = new Physijs.Mesh; + Physijs.HeightfieldMesh.prototype.constructor = Physijs.HeightfieldMesh; + + // Physijs.BoxMesh + Physijs.BoxMesh = function( geometry, material, mass ) { + var width, height, depth; + + Physijs.Mesh.call( this, geometry, material, mass ); + + if ( !geometry.boundingBox ) { + geometry.computeBoundingBox(); + } + + width = geometry.boundingBox.max.x - geometry.boundingBox.min.x; + height = geometry.boundingBox.max.y - geometry.boundingBox.min.y; + depth = geometry.boundingBox.max.z - geometry.boundingBox.min.z; + + this._physijs.type = 'box'; + this._physijs.width = width; + this._physijs.height = height; + this._physijs.depth = depth; + this._physijs.mass = (typeof mass === 'undefined') ? width * height * depth : mass; + }; + Physijs.BoxMesh.prototype = new Physijs.Mesh; + Physijs.BoxMesh.prototype.constructor = Physijs.BoxMesh; + + + // Physijs.SphereMesh + Physijs.SphereMesh = function( geometry, material, mass ) { + Physijs.Mesh.call( this, geometry, material, mass ); + + if ( !geometry.boundingSphere ) { + geometry.computeBoundingSphere(); + } + + this._physijs.type = 'sphere'; + this._physijs.radius = geometry.boundingSphere.radius; + this._physijs.mass = (typeof mass === 'undefined') ? (4/3) * Math.PI * Math.pow(this._physijs.radius, 3) : mass; + }; + Physijs.SphereMesh.prototype = new Physijs.Mesh; + Physijs.SphereMesh.prototype.constructor = Physijs.SphereMesh; + + + // Physijs.CylinderMesh + Physijs.CylinderMesh = function( geometry, material, mass ) { + var width, height, depth; + + Physijs.Mesh.call( this, geometry, material, mass ); + + if ( !geometry.boundingBox ) { + geometry.computeBoundingBox(); + } + + width = geometry.boundingBox.max.x - geometry.boundingBox.min.x; + height = geometry.boundingBox.max.y - geometry.boundingBox.min.y; + depth = geometry.boundingBox.max.z - geometry.boundingBox.min.z; + + this._physijs.type = 'cylinder'; + this._physijs.width = width; + this._physijs.height = height; + this._physijs.depth = depth; + this._physijs.mass = (typeof mass === 'undefined') ? width * height * depth : mass; + }; + Physijs.CylinderMesh.prototype = new Physijs.Mesh; + Physijs.CylinderMesh.prototype.constructor = Physijs.CylinderMesh; + + + // Physijs.CapsuleMesh + Physijs.CapsuleMesh = function( geometry, material, mass ) { + var width, height, depth; + + Physijs.Mesh.call( this, geometry, material, mass ); + + if ( !geometry.boundingBox ) { + geometry.computeBoundingBox(); + } + + width = geometry.boundingBox.max.x - geometry.boundingBox.min.x; + height = geometry.boundingBox.max.y - geometry.boundingBox.min.y; + depth = geometry.boundingBox.max.z - geometry.boundingBox.min.z; + + this._physijs.type = 'capsule'; + this._physijs.radius = Math.max(width / 2, depth / 2); + this._physijs.height = height; + this._physijs.mass = (typeof mass === 'undefined') ? width * height * depth : mass; + }; + Physijs.CapsuleMesh.prototype = new Physijs.Mesh; + Physijs.CapsuleMesh.prototype.constructor = Physijs.CapsuleMesh; + + + // Physijs.ConeMesh + Physijs.ConeMesh = function( geometry, material, mass ) { + var width, height, depth; + + Physijs.Mesh.call( this, geometry, material, mass ); + + if ( !geometry.boundingBox ) { + geometry.computeBoundingBox(); + } + + width = geometry.boundingBox.max.x - geometry.boundingBox.min.x; + height = geometry.boundingBox.max.y - geometry.boundingBox.min.y; + + this._physijs.type = 'cone'; + this._physijs.radius = width / 2; + this._physijs.height = height; + this._physijs.mass = (typeof mass === 'undefined') ? width * height : mass; + }; + Physijs.ConeMesh.prototype = new Physijs.Mesh; + Physijs.ConeMesh.prototype.constructor = Physijs.ConeMesh; + + + // Physijs.ConcaveMesh + Physijs.ConcaveMesh = function( geometry, material, mass ) { + var i, + width, height, depth, + vertices, face, triangles = []; + + Physijs.Mesh.call( this, geometry, material, mass ); + + if ( !geometry.boundingBox ) { + geometry.computeBoundingBox(); + } + + vertices = geometry.vertices; + + for ( i = 0; i < geometry.faces.length; i++ ) { + face = geometry.faces[i]; + if ( face instanceof THREE.Face3) { + + triangles.push([ + { x: vertices[face.a].x, y: vertices[face.a].y, z: vertices[face.a].z }, + { x: vertices[face.b].x, y: vertices[face.b].y, z: vertices[face.b].z }, + { x: vertices[face.c].x, y: vertices[face.c].y, z: vertices[face.c].z } + ]); + + } else if ( face instanceof THREE.Face4 ) { + + triangles.push([ + { x: vertices[face.a].x, y: vertices[face.a].y, z: vertices[face.a].z }, + { x: vertices[face.b].x, y: vertices[face.b].y, z: vertices[face.b].z }, + { x: vertices[face.d].x, y: vertices[face.d].y, z: vertices[face.d].z } + ]); + triangles.push([ + { x: vertices[face.b].x, y: vertices[face.b].y, z: vertices[face.b].z }, + { x: vertices[face.c].x, y: vertices[face.c].y, z: vertices[face.c].z }, + { x: vertices[face.d].x, y: vertices[face.d].y, z: vertices[face.d].z } + ]); + + } + } + + width = geometry.boundingBox.max.x - geometry.boundingBox.min.x; + height = geometry.boundingBox.max.y - geometry.boundingBox.min.y; + depth = geometry.boundingBox.max.z - geometry.boundingBox.min.z; + + this._physijs.type = 'concave'; + this._physijs.triangles = triangles; + this._physijs.mass = (typeof mass === 'undefined') ? width * height * depth : mass; + }; + Physijs.ConcaveMesh.prototype = new Physijs.Mesh; + Physijs.ConcaveMesh.prototype.constructor = Physijs.ConcaveMesh; + + + // Physijs.ConvexMesh + Physijs.ConvexMesh = function( geometry, material, mass ) { + var i, + width, height, depth, + points = []; + + Physijs.Mesh.call( this, geometry, material, mass ); + + if ( !geometry.boundingBox ) { + geometry.computeBoundingBox(); + } + + for ( i = 0; i < geometry.vertices.length; i++ ) { + points.push({ + x: geometry.vertices[i].x, + y: geometry.vertices[i].y, + z: geometry.vertices[i].z + }); + } + + + width = geometry.boundingBox.max.x - geometry.boundingBox.min.x; + height = geometry.boundingBox.max.y - geometry.boundingBox.min.y; + depth = geometry.boundingBox.max.z - geometry.boundingBox.min.z; + + this._physijs.type = 'convex'; + this._physijs.points = points; + this._physijs.mass = (typeof mass === 'undefined') ? width * height * depth : mass; + }; + Physijs.ConvexMesh.prototype = new Physijs.Mesh; + Physijs.ConvexMesh.prototype.constructor = Physijs.ConvexMesh; + + + // Physijs.Vehicle + Physijs.Vehicle = function( mesh, tuning ) { + tuning = tuning || new Physijs.VehicleTuning; + this.mesh = mesh; + this.wheels = []; + this._physijs = { + id: getObjectId(), + rigidBody: mesh._physijs.id, + suspension_stiffness: tuning.suspension_stiffness, + suspension_compression: tuning.suspension_compression, + suspension_damping: tuning.suspension_damping, + max_suspension_travel: tuning.max_suspension_travel, + friction_slip: tuning.friction_slip, + max_suspension_force: tuning.max_suspension_force + }; + }; + Physijs.Vehicle.prototype.addWheel = function( wheel_geometry, wheel_material, connection_point, wheel_direction, wheel_axle, suspension_rest_length, wheel_radius, is_front_wheel, tuning ) { + var wheel = new THREE.Mesh( wheel_geometry, wheel_material ); + wheel.castShadow = wheel.receiveShadow = true; + wheel.position.copy( wheel_direction ).multiplyScalar( suspension_rest_length / 100 ).add( connection_point ); + this.world.add( wheel ); + this.wheels.push( wheel ); + + this.world.execute( 'addWheel', { + id: this._physijs.id, + connection_point: { x: connection_point.x, y: connection_point.y, z: connection_point.z }, + wheel_direction: { x: wheel_direction.x, y: wheel_direction.y, z: wheel_direction.z }, + wheel_axle: { x: wheel_axle.x, y: wheel_axle.y, z: wheel_axle.z }, + suspension_rest_length: suspension_rest_length, + wheel_radius: wheel_radius, + is_front_wheel: is_front_wheel, + tuning: tuning + }); + }; + Physijs.Vehicle.prototype.setSteering = function( amount, wheel ) { + if ( wheel !== undefined && this.wheels[ wheel ] !== undefined ) { + this.world.execute( 'setSteering', { id: this._physijs.id, wheel: wheel, steering: amount } ); + } else if ( this.wheels.length > 0 ) { + for ( var i = 0; i < this.wheels.length; i++ ) { + this.world.execute( 'setSteering', { id: this._physijs.id, wheel: i, steering: amount } ); + } + } + }; + Physijs.Vehicle.prototype.setBrake = function( amount, wheel ) { + if ( wheel !== undefined && this.wheels[ wheel ] !== undefined ) { + this.world.execute( 'setBrake', { id: this._physijs.id, wheel: wheel, brake: amount } ); + } else if ( this.wheels.length > 0 ) { + for ( var i = 0; i < this.wheels.length; i++ ) { + this.world.execute( 'setBrake', { id: this._physijs.id, wheel: i, brake: amount } ); + } + } + }; + Physijs.Vehicle.prototype.applyEngineForce = function( amount, wheel ) { + if ( wheel !== undefined && this.wheels[ wheel ] !== undefined ) { + this.world.execute( 'applyEngineForce', { id: this._physijs.id, wheel: wheel, force: amount } ); + } else if ( this.wheels.length > 0 ) { + for ( var i = 0; i < this.wheels.length; i++ ) { + this.world.execute( 'applyEngineForce', { id: this._physijs.id, wheel: i, force: amount } ); + } + } + }; + + // Physijs.VehicleTuning + Physijs.VehicleTuning = function( suspension_stiffness, suspension_compression, suspension_damping, max_suspension_travel, friction_slip, max_suspension_force ) { + this.suspension_stiffness = suspension_stiffness !== undefined ? suspension_stiffness : 5.88; + this.suspension_compression = suspension_compression !== undefined ? suspension_compression : 0.83; + this.suspension_damping = suspension_damping !== undefined ? suspension_damping : 0.88; + this.max_suspension_travel = max_suspension_travel !== undefined ? max_suspension_travel : 500; + this.friction_slip = friction_slip !== undefined ? friction_slip : 10.5; + this.max_suspension_force = max_suspension_force !== undefined ? max_suspension_force : 6000; + }; + + return Physijs; +})(); diff --git a/lib/physics-module.js b/lib/physics-module.js new file mode 100644 index 0000000..f4731eb --- /dev/null +++ b/lib/physics-module.js @@ -0,0 +1,4504 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('three'), require('whs')) : + typeof define === 'function' && define.amd ? define(['exports', 'three', 'whs'], factory) : + (factory((global.PHYSICS = {}),global.THREE,global.WHS)); +}(this, (function (exports,three,whs) { 'use strict'; + + var MESSAGE_TYPES = { + WORLDREPORT: 0, + COLLISIONREPORT: 1, + VEHICLEREPORT: 2, + CONSTRAINTREPORT: 3, + SOFTREPORT: 4 + }; + + var REPORT_ITEMSIZE = 14, + COLLISIONREPORT_ITEMSIZE = 5, + VEHICLEREPORT_ITEMSIZE = 9, + CONSTRAINTREPORT_ITEMSIZE = 6; + + var temp1Vector3 = new three.Vector3(), + temp2Vector3 = new three.Vector3(), + temp1Matrix4 = new three.Matrix4(), + temp1Quat = new three.Quaternion(); + + var getEulerXYZFromQuaternion = function getEulerXYZFromQuaternion(x, y, z, w) { + return new three.Vector3(Math.atan2(2 * (x * w - y * z), w * w - x * x - y * y + z * z), Math.asin(2 * (x * z + y * w)), Math.atan2(2 * (z * w - x * y), w * w + x * x - y * y - z * z)); + }; + + var getQuatertionFromEuler = function getQuatertionFromEuler(x, y, z) { + var c1 = Math.cos(y); + var s1 = Math.sin(y); + var c2 = Math.cos(-z); + var s2 = Math.sin(-z); + var c3 = Math.cos(x); + var s3 = Math.sin(x); + var c1c2 = c1 * c2; + var s1s2 = s1 * s2; + + return { + w: c1c2 * c3 - s1s2 * s3, + x: c1c2 * s3 + s1s2 * c3, + y: s1 * c2 * c3 + c1 * s2 * s3, + z: c1 * s2 * c3 - s1 * c2 * s3 + }; + }; + + var convertWorldPositionToObject = function convertWorldPositionToObject(position, object) { + temp1Matrix4.identity(); // reset temp matrix + + // Set the temp matrix's rotation to the object's rotation + temp1Matrix4.identity().makeRotationFromQuaternion(object.quaternion); + + // Invert rotation matrix in order to "unrotate" a point back to object space + temp1Matrix4.getInverse(temp1Matrix4); + + // Yay! Temp vars! + temp1Vector3.copy(position); + temp2Vector3.copy(object.position); + + // Apply the rotation + return temp1Vector3.sub(temp2Vector3).applyMatrix4(temp1Matrix4); + }; + + var addObjectChildren = function addObjectChildren(parent, object) { + for (var i = 0; i < object.children.length; i++) { + var child = object.children[i]; + var physics = child.component ? child.component.use('physics') : false; + + if (physics) { + var data = physics.data; + + child.updateMatrix(); + child.updateMatrixWorld(); + + temp1Vector3.setFromMatrixPosition(child.matrixWorld); + temp1Quat.setFromRotationMatrix(child.matrixWorld); + + data.position_offset = { + x: temp1Vector3.x, + y: temp1Vector3.y, + z: temp1Vector3.z + }; + + data.rotation = { + x: temp1Quat.x, + y: temp1Quat.y, + z: temp1Quat.z, + w: temp1Quat.w + }; + + parent.component.use('physics').data.children.push(data); + } + + addObjectChildren(parent, child); + } + }; + + var classCallCheck = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + }; + + var createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + + var _extends = Object.assign || function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; + }; + + var inherits = function (subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; + }; + + var possibleConstructorReturn = function (self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; + }; + + var toConsumableArray = function (arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; + + return arr2; + } else { + return Array.from(arr); + } + }; + + var Eventable = function () { + function Eventable() { + classCallCheck(this, Eventable); + + this._eventListeners = {}; + } + + createClass(Eventable, [{ + key: "addEventListener", + value: function addEventListener(event_name, callback) { + if (!this._eventListeners.hasOwnProperty(event_name)) this._eventListeners[event_name] = []; + + this._eventListeners[event_name].push(callback); + } + }, { + key: "removeEventListener", + value: function removeEventListener(event_name, callback) { + var index = void 0; + + if (!this._eventListeners.hasOwnProperty(event_name)) return false; + + if ((index = this._eventListeners[event_name].indexOf(callback)) >= 0) { + this._eventListeners[event_name].splice(index, 1); + return true; + } + + return false; + } + }, { + key: "dispatchEvent", + value: function dispatchEvent(event_name) { + var i = void 0; + var parameters = Array.prototype.splice.call(arguments, 1); + + if (this._eventListeners.hasOwnProperty(event_name)) { + for (i = 0; i < this._eventListeners[event_name].length; i++) { + this._eventListeners[event_name][i].apply(this, parameters); + } + } + } + }], [{ + key: "make", + value: function make(obj) { + obj.prototype.addEventListener = Eventable.prototype.addEventListener; + obj.prototype.removeEventListener = Eventable.prototype.removeEventListener; + obj.prototype.dispatchEvent = Eventable.prototype.dispatchEvent; + } + }]); + return Eventable; + }(); + + var ConeTwistConstraint = function () { + function ConeTwistConstraint(obja, objb, position) { + classCallCheck(this, ConeTwistConstraint); + + var objecta = obja; + var objectb = obja; + + if (position === undefined) console.error('Both objects must be defined in a ConeTwistConstraint.'); + + this.type = 'conetwist'; + this.appliedImpulse = 0; + this.worldModule = null; // Will be redefined by .addConstraint + this.objecta = objecta.use('physics').data.id; + this.positiona = convertWorldPositionToObject(position, objecta).clone(); + this.objectb = objectb.use('physics').data.id; + this.positionb = convertWorldPositionToObject(position, objectb).clone(); + this.axisa = { x: objecta.rotation.x, y: objecta.rotation.y, z: objecta.rotation.z }; + this.axisb = { x: objectb.rotation.x, y: objectb.rotation.y, z: objectb.rotation.z }; + } + + createClass(ConeTwistConstraint, [{ + key: 'getDefinition', + value: function getDefinition() { + return { + type: this.type, + id: this.id, + objecta: this.objecta, + objectb: this.objectb, + positiona: this.positiona, + positionb: this.positionb, + axisa: this.axisa, + axisb: this.axisb + }; + } + }, { + key: 'setLimit', + value: function setLimit(x, y, z) { + if (this.worldModule) this.worldModule.execute('conetwist_setLimit', { constraint: this.id, x: x, y: y, z: z }); + } + }, { + key: 'enableMotor', + value: function enableMotor() { + if (this.worldModule) this.worldModule.execute('conetwist_enableMotor', { constraint: this.id }); + } + }, { + key: 'setMaxMotorImpulse', + value: function setMaxMotorImpulse(max_impulse) { + if (this.worldModule) this.worldModule.execute('conetwist_setMaxMotorImpulse', { constraint: this.id, max_impulse: max_impulse }); + } + }, { + key: 'setMotorTarget', + value: function setMotorTarget(target) { + if (target instanceof three.Vector3) target = new three.Quaternion().setFromEuler(new three.Euler(target.x, target.y, target.z));else if (target instanceof three.Euler) target = new three.Quaternion().setFromEuler(target);else if (target instanceof three.Matrix4) target = new three.Quaternion().setFromRotationMatrix(target); + + if (this.worldModule) this.worldModule.execute('conetwist_setMotorTarget', { + constraint: this.id, + x: target.x, + y: target.y, + z: target.z, + w: target.w + }); + } + }]); + return ConeTwistConstraint; + }(); + + var HingeConstraint = function () { + function HingeConstraint(obja, objb, position, axis) { + classCallCheck(this, HingeConstraint); + + var objecta = obja; + var objectb = objb; + + if (axis === undefined) { + axis = position; + position = objectb; + objectb = undefined; + } + + this.type = 'hinge'; + this.appliedImpulse = 0; + this.worldModule = null; // Will be redefined by .addConstraint + this.objecta = objecta.use('physics').data.id; + this.positiona = convertWorldPositionToObject(position, objecta).clone(); + this.position = position.clone(); + this.axis = axis; + + if (objectb) { + this.objectb = objectb.use('physics').data.id; + this.positionb = convertWorldPositionToObject(position, objectb).clone(); + } + } + + createClass(HingeConstraint, [{ + key: 'getDefinition', + value: function getDefinition() { + return { + type: this.type, + id: this.id, + objecta: this.objecta, + objectb: this.objectb, + positiona: this.positiona, + positionb: this.positionb, + axis: this.axis + }; + } + }, { + key: 'setLimits', + value: function setLimits(low, high, bias_factor, relaxation_factor) { + if (this.worldModule) this.worldModule.execute('hinge_setLimits', { + constraint: this.id, + low: low, + high: high, + bias_factor: bias_factor, + relaxation_factor: relaxation_factor + }); + } + }, { + key: 'enableAngularMotor', + value: function enableAngularMotor(velocity, acceleration) { + if (this.worldModule) this.worldModule.execute('hinge_enableAngularMotor', { + constraint: this.id, + velocity: velocity, + acceleration: acceleration + }); + } + }, { + key: 'disableMotor', + value: function disableMotor() { + if (this.worldModule) this.worldModule.execute('hinge_disableMotor', { constraint: this.id }); + } + }]); + return HingeConstraint; + }(); + + var PointConstraint = function () { + function PointConstraint(obja, objb, position) { + classCallCheck(this, PointConstraint); + + var objecta = obja; + var objectb = objb; + + if (position === undefined) { + position = objectb; + objectb = undefined; + } + + this.type = 'point'; + this.appliedImpulse = 0; + this.objecta = objecta.use('physics').data.id; + this.positiona = convertWorldPositionToObject(position, objecta).clone(); + + if (objectb) { + this.objectb = objectb.use('physics').data.id; + this.positionb = convertWorldPositionToObject(position, objectb).clone(); + } + } + + createClass(PointConstraint, [{ + key: 'getDefinition', + value: function getDefinition() { + return { + type: this.type, + id: this.id, + objecta: this.objecta, + objectb: this.objectb, + positiona: this.positiona, + positionb: this.positionb + }; + } + }]); + return PointConstraint; + }(); + + var SliderConstraint = function () { + function SliderConstraint(obja, objb, position, axis) { + classCallCheck(this, SliderConstraint); + + var objecta = obja; + var objectb = objb; + + if (axis === undefined) { + axis = position; + position = objectb; + objectb = undefined; + } + + this.type = 'slider'; + this.appliedImpulse = 0; + this.worldModule = null; // Will be redefined by .addConstraint + this.objecta = objecta.use('physics').data.id; + this.positiona = convertWorldPositionToObject(position, objecta).clone(); + this.axis = axis; + + if (objectb) { + this.objectb = objectb.use('physics').data.id; + this.positionb = convertWorldPositionToObject(position, objectb).clone(); + } + } + + createClass(SliderConstraint, [{ + key: 'getDefinition', + value: function getDefinition() { + return { + type: this.type, + id: this.id, + objecta: this.objecta, + objectb: this.objectb, + positiona: this.positiona, + positionb: this.positionb, + axis: this.axis + }; + } + }, { + key: 'setLimits', + value: function setLimits(lin_lower, lin_upper, ang_lower, ang_upper) { + if (this.worldModule) this.worldModule.execute('slider_setLimits', { + constraint: this.id, + lin_lower: lin_lower, + lin_upper: lin_upper, + ang_lower: ang_lower, + ang_upper: ang_upper + }); + } + }, { + key: 'setRestitution', + value: function setRestitution(linear, angular) { + if (this.worldModule) this.worldModule.execute('slider_setRestitution', { + constraint: this.id, + linear: linear, + angular: angular + }); + } + }, { + key: 'enableLinearMotor', + value: function enableLinearMotor(velocity, acceleration) { + if (this.worldModule) this.worldModule.execute('slider_enableLinearMotor', { + constraint: this.id, + velocity: velocity, + acceleration: acceleration + }); + } + }, { + key: 'disableLinearMotor', + value: function disableLinearMotor() { + if (this.worldModule) this.worldModule.execute('slider_disableLinearMotor', { constraint: this.id }); + } + }, { + key: 'enableAngularMotor', + value: function enableAngularMotor(velocity, acceleration) { + this.scene.execute('slider_enableAngularMotor', { + constraint: this.id, + velocity: velocity, + acceleration: acceleration + }); + } + }, { + key: 'disableAngularMotor', + value: function disableAngularMotor() { + if (this.worldModule) this.worldModule.execute('slider_disableAngularMotor', { constraint: this.id }); + } + }]); + return SliderConstraint; + }(); + + var DOFConstraint = function () { + function DOFConstraint(obja, objb, position) { + classCallCheck(this, DOFConstraint); + + var objecta = obja; + var objectb = objb; + + if (position === undefined) { + position = objectb; + objectb = undefined; + } + + this.type = 'dof'; + this.appliedImpulse = 0; + this.worldModule = null; // Will be redefined by .addConstraint + this.objecta = objecta.use('physics').data.id; + this.positiona = convertWorldPositionToObject(position, objecta).clone(); + this.axisa = { x: objecta.rotation.x, y: objecta.rotation.y, z: objecta.rotation.z }; + + if (objectb) { + this.objectb = objectb.use('physics').data.id; + this.positionb = convertWorldPositionToObject(position, objectb).clone(); + this.axisb = { x: objectb.rotation.x, y: objectb.rotation.y, z: objectb.rotation.z }; + } + } + + createClass(DOFConstraint, [{ + key: 'getDefinition', + value: function getDefinition() { + return { + type: this.type, + id: this.id, + objecta: this.objecta, + objectb: this.objectb, + positiona: this.positiona, + positionb: this.positionb, + axisa: this.axisa, + axisb: this.axisb + }; + } + }, { + key: 'setLinearLowerLimit', + value: function setLinearLowerLimit(limit) { + if (this.worldModule) this.worldModule.execute('dof_setLinearLowerLimit', { constraint: this.id, x: limit.x, y: limit.y, z: limit.z }); + } + }, { + key: 'setLinearUpperLimit', + value: function setLinearUpperLimit(limit) { + if (this.worldModule) this.worldModule.execute('dof_setLinearUpperLimit', { constraint: this.id, x: limit.x, y: limit.y, z: limit.z }); + } + }, { + key: 'setAngularLowerLimit', + value: function setAngularLowerLimit(limit) { + if (this.worldModule) this.worldModule.execute('dof_setAngularLowerLimit', { constraint: this.id, x: limit.x, y: limit.y, z: limit.z }); + } + }, { + key: 'setAngularUpperLimit', + value: function setAngularUpperLimit(limit) { + if (this.worldModule) this.worldModule.execute('dof_setAngularUpperLimit', { constraint: this.id, x: limit.x, y: limit.y, z: limit.z }); + } + }, { + key: 'enableAngularMotor', + value: function enableAngularMotor(which) { + if (this.worldModule) this.worldModule.execute('dof_enableAngularMotor', { constraint: this.id, which: which }); + } + }, { + key: 'configureAngularMotor', + value: function configureAngularMotor(which, low_angle, high_angle, velocity, max_force) { + if (this.worldModule) this.worldModule.execute('dof_configureAngularMotor', { constraint: this.id, which: which, low_angle: low_angle, high_angle: high_angle, velocity: velocity, max_force: max_force }); + } + }, { + key: 'disableAngularMotor', + value: function disableAngularMotor(which) { + if (this.worldModule) this.worldModule.execute('dof_disableAngularMotor', { constraint: this.id, which: which }); + } + }]); + return DOFConstraint; + }(); + + var Vehicle = function () { + function Vehicle(mesh) { + var tuning = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new VehicleTuning(); + classCallCheck(this, Vehicle); + + this.mesh = mesh; + this.wheels = []; + + this._physijs = { + id: getObjectId(), + rigidBody: mesh._physijs.id, + suspension_stiffness: tuning.suspension_stiffness, + suspension_compression: tuning.suspension_compression, + suspension_damping: tuning.suspension_damping, + max_suspension_travel: tuning.max_suspension_travel, + friction_slip: tuning.friction_slip, + max_suspension_force: tuning.max_suspension_force + }; + } + + createClass(Vehicle, [{ + key: 'addWheel', + value: function addWheel(wheel_geometry, wheel_material, connection_point, wheel_direction, wheel_axle, suspension_rest_length, wheel_radius, is_front_wheel, tuning) { + var wheel = new three.Mesh(wheel_geometry, wheel_material); + + wheel.castShadow = wheel.receiveShadow = true; + wheel.position.copy(wheel_direction).multiplyScalar(suspension_rest_length / 100).add(connection_point); + + this.world.add(wheel); + this.wheels.push(wheel); + + this.world.execute('addWheel', { + id: this._physijs.id, + connection_point: { x: connection_point.x, y: connection_point.y, z: connection_point.z }, + wheel_direction: { x: wheel_direction.x, y: wheel_direction.y, z: wheel_direction.z }, + wheel_axle: { x: wheel_axle.x, y: wheel_axle.y, z: wheel_axle.z }, + suspension_rest_length: suspension_rest_length, + wheel_radius: wheel_radius, + is_front_wheel: is_front_wheel, + tuning: tuning + }); + } + }, { + key: 'setSteering', + value: function setSteering(amount, wheel) { + if (wheel !== undefined && this.wheels[wheel] !== undefined) this.world.execute('setSteering', { id: this._physijs.id, wheel: wheel, steering: amount });else if (this.wheels.length > 0) { + for (var i = 0; i < this.wheels.length; i++) { + this.world.execute('setSteering', { id: this._physijs.id, wheel: i, steering: amount }); + } + } + } + }, { + key: 'setBrake', + value: function setBrake(amount, wheel) { + if (wheel !== undefined && this.wheels[wheel] !== undefined) this.world.execute('setBrake', { id: this._physijs.id, wheel: wheel, brake: amount });else if (this.wheels.length > 0) { + for (var i = 0; i < this.wheels.length; i++) { + this.world.execute('setBrake', { id: this._physijs.id, wheel: i, brake: amount }); + } + } + } + }, { + key: 'applyEngineForce', + value: function applyEngineForce(amount, wheel) { + if (wheel !== undefined && this.wheels[wheel] !== undefined) this.world.execute('applyEngineForce', { id: this._physijs.id, wheel: wheel, force: amount });else if (this.wheels.length > 0) { + for (var i = 0; i < this.wheels.length; i++) { + this.world.execute('applyEngineForce', { id: this._physijs.id, wheel: i, force: amount }); + } + } + } + }]); + return Vehicle; + }(); + + var _class, _temp2; + + var WorldModuleBase = (_temp2 = _class = function (_Eventable) { + inherits(WorldModuleBase, _Eventable); + + function WorldModuleBase(options) { + classCallCheck(this, WorldModuleBase); + + var _this = possibleConstructorReturn(this, (WorldModuleBase.__proto__ || Object.getPrototypeOf(WorldModuleBase)).call(this)); + + _this.bridge = { + onAdd: function onAdd(component, self) { + if (component.use('physics')) return self.defer(self.onAddCallback.bind(self), [component]); + return; + }, + onRemove: function onRemove(component, self) { + if (component.use('physics')) return self.defer(self.onRemoveCallback.bind(self), [component]); + return; + } + }; + + + _this.options = Object.assign(WorldModuleBase.defaults, options); + + _this.objects = {}; + _this.vehicles = {}; + _this.constraints = {}; + _this.isSimulating = false; + + _this.getObjectId = function () { + var id = 1; + return function () { + return id++; + }; + }(); + return _this; + } + + createClass(WorldModuleBase, [{ + key: 'setup', + value: function setup() { + var _this2 = this; + + this.receive(function (event) { + var _temp = void 0, + data = event.data; + + if (data instanceof ArrayBuffer && data.byteLength !== 1) // byteLength === 1 is the worker making a SUPPORT_TRANSFERABLE test + data = new Float32Array(data); + + if (data instanceof Float32Array) { + // transferable object + switch (data[0]) { + case MESSAGE_TYPES.WORLDREPORT: + _this2.updateScene(data); + break; + + case MESSAGE_TYPES.SOFTREPORT: + _this2.updateSoftbodies(data); + break; + + case MESSAGE_TYPES.COLLISIONREPORT: + _this2.updateCollisions(data); + break; + + case MESSAGE_TYPES.VEHICLEREPORT: + _this2.updateVehicles(data); + break; + + case MESSAGE_TYPES.CONSTRAINTREPORT: + _this2.updateConstraints(data); + break; + default: + } + } else if (data.cmd) { + // non-transferable object + switch (data.cmd) { + case 'objectReady': + _temp = data.params; + if (_this2.objects[_temp]) _this2.objects[_temp].dispatchEvent('ready'); + break; + + case 'worldReady': + _this2.dispatchEvent('ready'); + break; + + case 'ammoLoaded': + _this2.dispatchEvent('loaded'); + // console.log("Physics loading time: " + (performance.now() - start) + "ms"); + break; + + case 'vehicle': + window.test = data; + break; + + default: + // Do nothing, just show the message + console.debug('Received: ' + data.cmd); + console.dir(data.params); + break; + } + } else { + switch (data[0]) { + case MESSAGE_TYPES.WORLDREPORT: + _this2.updateScene(data); + break; + + case MESSAGE_TYPES.COLLISIONREPORT: + _this2.updateCollisions(data); + break; + + case MESSAGE_TYPES.VEHICLEREPORT: + _this2.updateVehicles(data); + break; + + case MESSAGE_TYPES.CONSTRAINTREPORT: + _this2.updateConstraints(data); + break; + default: + } + } + }); + } + }, { + key: 'updateScene', + value: function updateScene(info) { + var index = info[1]; + + while (index--) { + var offset = 2 + index * REPORT_ITEMSIZE; + var object = this.objects[info[offset]]; + var component = object.component; + var data = component.use('physics').data; + + if (object === null) continue; + + if (component.__dirtyPosition === false) { + object.position.set(info[offset + 1], info[offset + 2], info[offset + 3]); + + component.__dirtyPosition = false; + } + + if (component.__dirtyRotation === false) { + object.quaternion.set(info[offset + 4], info[offset + 5], info[offset + 6], info[offset + 7]); + + component.__dirtyRotation = false; + } + + data.linearVelocity.set(info[offset + 8], info[offset + 9], info[offset + 10]); + + data.angularVelocity.set(info[offset + 11], info[offset + 12], info[offset + 13]); + } + + if (this.SUPPORT_TRANSFERABLE) this.send(info.buffer, [info.buffer]); // Give the typed array back to the worker + + this.isSimulating = false; + this.dispatchEvent('update'); + } + }, { + key: 'updateSoftbodies', + value: function updateSoftbodies(info) { + var index = info[1], + offset = 2; + + while (index--) { + var size = info[offset + 1]; + var object = this.objects[info[offset]]; + + if (object === null) continue; + + var data = object.component.use('physics').data; + + var attributes = object.geometry.attributes; + var volumePositions = attributes.position.array; + + var offsetVert = offset + 2; + + // console.log(data.id); + if (!data.isSoftBodyReset) { + object.position.set(0, 0, 0); + object.quaternion.set(0, 0, 0, 0); + + data.isSoftBodyReset = true; + } + + if (data.type === "softTrimesh") { + var volumeNormals = attributes.normal.array; + + for (var i = 0; i < size; i++) { + var offs = offsetVert + i * 18; + + var x1 = info[offs]; + var y1 = info[offs + 1]; + var z1 = info[offs + 2]; + + var nx1 = info[offs + 3]; + var ny1 = info[offs + 4]; + var nz1 = info[offs + 5]; + + var x2 = info[offs + 6]; + var y2 = info[offs + 7]; + var z2 = info[offs + 8]; + + var nx2 = info[offs + 9]; + var ny2 = info[offs + 10]; + var nz2 = info[offs + 11]; + + var x3 = info[offs + 12]; + var y3 = info[offs + 13]; + var z3 = info[offs + 14]; + + var nx3 = info[offs + 15]; + var ny3 = info[offs + 16]; + var nz3 = info[offs + 17]; + + var i9 = i * 9; + + volumePositions[i9] = x1; + volumePositions[i9 + 1] = y1; + volumePositions[i9 + 2] = z1; + + volumePositions[i9 + 3] = x2; + volumePositions[i9 + 4] = y2; + volumePositions[i9 + 5] = z2; + + volumePositions[i9 + 6] = x3; + volumePositions[i9 + 7] = y3; + volumePositions[i9 + 8] = z3; + + volumeNormals[i9] = nx1; + volumeNormals[i9 + 1] = ny1; + volumeNormals[i9 + 2] = nz1; + + volumeNormals[i9 + 3] = nx2; + volumeNormals[i9 + 4] = ny2; + volumeNormals[i9 + 5] = nz2; + + volumeNormals[i9 + 6] = nx3; + volumeNormals[i9 + 7] = ny3; + volumeNormals[i9 + 8] = nz3; + } + + attributes.normal.needsUpdate = true; + offset += 2 + size * 18; + } else if (data.type === "softRopeMesh") { + for (var _i = 0; _i < size; _i++) { + var _offs = offsetVert + _i * 3; + + var x = info[_offs]; + var y = info[_offs + 1]; + var z = info[_offs + 2]; + + volumePositions[_i * 3] = x; + volumePositions[_i * 3 + 1] = y; + volumePositions[_i * 3 + 2] = z; + } + + offset += 2 + size * 3; + } else { + var _volumeNormals = attributes.normal.array; + + for (var _i2 = 0; _i2 < size; _i2++) { + var _offs2 = offsetVert + _i2 * 6; + + var _x = info[_offs2]; + var _y = info[_offs2 + 1]; + var _z = info[_offs2 + 2]; + + var nx = info[_offs2 + 3]; + var ny = info[_offs2 + 4]; + var nz = info[_offs2 + 5]; + + volumePositions[_i2 * 3] = _x; + volumePositions[_i2 * 3 + 1] = _y; + volumePositions[_i2 * 3 + 2] = _z; + + // FIXME: Normals are pointed to look inside; + _volumeNormals[_i2 * 3] = nx; + _volumeNormals[_i2 * 3 + 1] = ny; + _volumeNormals[_i2 * 3 + 2] = nz; + } + + attributes.normal.needsUpdate = true; + offset += 2 + size * 6; + } + + attributes.position.needsUpdate = true; + } + + // if (this.SUPPORT_TRANSFERABLE) + // this.send(info.buffer, [info.buffer]); // Give the typed array back to the worker + + this.isSimulating = false; + } + }, { + key: 'updateVehicles', + value: function updateVehicles(data) { + var vehicle = void 0, + wheel = void 0; + + for (var i = 0; i < (data.length - 1) / VEHICLEREPORT_ITEMSIZE; i++) { + var offset = 1 + i * VEHICLEREPORT_ITEMSIZE; + vehicle = this.vehicles[data[offset]]; + + if (vehicle === null) continue; + + wheel = vehicle.wheels[data[offset + 1]]; + + wheel.position.set(data[offset + 2], data[offset + 3], data[offset + 4]); + + wheel.quaternion.set(data[offset + 5], data[offset + 6], data[offset + 7], data[offset + 8]); + } + + if (this.SUPPORT_TRANSFERABLE) this.send(data.buffer, [data.buffer]); // Give the typed array back to the worker + } + }, { + key: 'updateConstraints', + value: function updateConstraints(data) { + var constraint = void 0, + object = void 0; + + for (var i = 0; i < (data.length - 1) / CONSTRAINTREPORT_ITEMSIZE; i++) { + var offset = 1 + i * CONSTRAINTREPORT_ITEMSIZE; + constraint = this.constraints[data[offset]]; + object = this.objects[data[offset + 1]]; + + if (constraint === undefined || object === undefined) continue; + + temp1Vector3.set(data[offset + 2], data[offset + 3], data[offset + 4]); + + temp1Matrix4.extractRotation(object.matrix); + temp1Vector3.applyMatrix4(temp1Matrix4); + + constraint.positiona.addVectors(object.position, temp1Vector3); + constraint.appliedImpulse = data[offset + 5]; + } + + if (this.SUPPORT_TRANSFERABLE) this.send(data.buffer, [data.buffer]); // Give the typed array back to the worker + } + }, { + key: 'updateCollisions', + value: function updateCollisions(info) { + /** + * #TODO + * This is probably the worst way ever to handle collisions. The inherent evilness is a residual + * effect from the previous version's evilness which mutated when switching to transferable objects. + * + * If you feel inclined to make this better, please do so. + */ + + var collisions = {}, + normal_offsets = {}; + + // Build collision manifest + for (var i = 0; i < info[1]; i++) { + var offset = 2 + i * COLLISIONREPORT_ITEMSIZE; + var object = info[offset]; + var object2 = info[offset + 1]; + + normal_offsets[object + '-' + object2] = offset + 2; + normal_offsets[object2 + '-' + object] = -1 * (offset + 2); + + // Register collisions for both the object colliding and the object being collided with + if (!collisions[object]) collisions[object] = []; + collisions[object].push(object2); + + if (!collisions[object2]) collisions[object2] = []; + collisions[object2].push(object); + } + + // Deal with collisions + for (var id1 in this.objects) { + if (!this.objects.hasOwnProperty(id1)) continue; + var _object = this.objects[id1]; + var component = _object.component; + var data = component.use('physics').data; + + if (_object === null) continue; + + // If object touches anything, ... + if (collisions[id1]) { + // Clean up touches array + for (var j = 0; j < data.touches.length; j++) { + if (collisions[id1].indexOf(data.touches[j]) === -1) data.touches.splice(j--, 1); + } + + // Handle each colliding object + for (var _j = 0; _j < collisions[id1].length; _j++) { + var id2 = collisions[id1][_j]; + var _object2 = this.objects[id2]; + + if (_object2) { + var component2 = _object2.component; + var data2 = component2.use('physics').data; + // If object was not already touching object2, notify object + if (data.touches.indexOf(id2) === -1) { + data.touches.push(id2); + + var vel = component.use('physics').getLinearVelocity(); + var vel2 = component2.use('physics').getLinearVelocity(); + + temp1Vector3.subVectors(vel, vel2); + var temp1 = temp1Vector3.clone(); + + temp1Vector3.subVectors(vel, vel2); + var temp2 = temp1Vector3.clone(); + + var normal_offset = normal_offsets[data.id + '-' + data2.id]; + + if (normal_offset > 0) { + temp1Vector3.set(-info[normal_offset], -info[normal_offset + 1], -info[normal_offset + 2]); + } else { + normal_offset *= -1; + + temp1Vector3.set(info[normal_offset], info[normal_offset + 1], info[normal_offset + 2]); + } + + component.emit('collision', _object2, temp1, temp2, temp1Vector3); + } + } + } + } else data.touches.length = 0; // not touching other objects + } + + this.collisions = collisions; + + if (this.SUPPORT_TRANSFERABLE) this.send(info.buffer, [info.buffer]); // Give the typed array back to the worker + } + }, { + key: 'addConstraint', + value: function addConstraint(constraint, show_marker) { + constraint.id = this.getObjectId(); + this.constraints[constraint.id] = constraint; + constraint.worldModule = this; + this.execute('addConstraint', constraint.getDefinition()); + + if (show_marker) { + var marker = void 0; + + switch (constraint.type) { + case 'point': + marker = new three.Mesh(new three.SphereGeometry(1.5), new three.MeshNormalMaterial()); + + marker.position.copy(constraint.positiona); + this.objects[constraint.objecta].add(marker); + break; + + case 'hinge': + marker = new three.Mesh(new three.SphereGeometry(1.5), new three.MeshNormalMaterial()); + + marker.position.copy(constraint.positiona); + this.objects[constraint.objecta].add(marker); + break; + + case 'slider': + marker = new three.Mesh(new three.BoxGeometry(10, 1, 1), new three.MeshNormalMaterial()); + + marker.position.copy(constraint.positiona); + + // This rotation isn't right if all three axis are non-0 values + // TODO: change marker's rotation order to ZYX + marker.rotation.set(constraint.axis.y, // yes, y and + constraint.axis.x, // x axis are swapped + constraint.axis.z); + this.objects[constraint.objecta].add(marker); + break; + + case 'conetwist': + marker = new three.Mesh(new three.SphereGeometry(1.5), new three.MeshNormalMaterial()); + + marker.position.copy(constraint.positiona); + this.objects[constraint.objecta].add(marker); + break; + + case 'dof': + marker = new three.Mesh(new three.SphereGeometry(1.5), new three.MeshNormalMaterial()); + + marker.position.copy(constraint.positiona); + this.objects[constraint.objecta].add(marker); + break; + default: + } + } + + return constraint; + } + }, { + key: 'onSimulationResume', + value: function onSimulationResume() { + this.execute('onSimulationResume', {}); + } + }, { + key: 'removeConstraint', + value: function removeConstraint(constraint) { + if (this.constraints[constraint.id] !== undefined) { + this.execute('removeConstraint', { id: constraint.id }); + delete this.constraints[constraint.id]; + } + } + }, { + key: 'execute', + value: function execute(cmd, params) { + this.send({ cmd: cmd, params: params }); + } + }, { + key: 'onAddCallback', + value: function onAddCallback(component) { + var object = component.native; + var data = object.component.use('physics').data; + + if (data) { + component.manager.set('module:world', this); + data.id = this.getObjectId(); + object.component.use('physics').data = data; + + if (object instanceof Vehicle) { + this.onAddCallback(object.mesh); + this.vehicles[data.id] = object; + this.execute('addVehicle', data); + } else { + component.__dirtyPosition = false; + component.__dirtyRotation = false; + this.objects[data.id] = object; + + if (object.children.length) { + data.children = []; + addObjectChildren(object, object); + } + + // object.quaternion.setFromEuler(object.rotation); + // + // console.log(object.component); + // console.log(object.rotation); + + // Object starting position + rotation + data.position = { + x: object.position.x, + y: object.position.y, + z: object.position.z + }; + + data.rotation = { + x: object.quaternion.x, + y: object.quaternion.y, + z: object.quaternion.z, + w: object.quaternion.w + }; + + if (data.width) data.width *= object.scale.x; + if (data.height) data.height *= object.scale.y; + if (data.depth) data.depth *= object.scale.z; + + this.execute('addObject', data); + } + + component.emit('physics:added'); + } + } + }, { + key: 'onRemoveCallback', + value: function onRemoveCallback(component) { + var object = component.native; + + if (object instanceof Vehicle) { + this.execute('removeVehicle', { id: object._physijs.id }); + while (object.wheels.length) { + this.remove(object.wheels.pop()); + }this.remove(object.mesh); + this.vehicles[object._physijs.id] = null; + } else { + // Mesh.prototype.remove.call(this, object); + + if (object._physijs) { + component.manager.remove('module:world'); + this.objects[object._physijs.id] = null; + this.execute('removeObject', { id: object._physijs.id }); + } + } + } + }, { + key: 'defer', + value: function defer(func, args) { + var _this3 = this; + + return new Promise(function (resolve) { + if (_this3.isLoaded) { + func.apply(undefined, toConsumableArray(args)); + resolve(); + } else _this3.loader.then(function () { + func.apply(undefined, toConsumableArray(args)); + resolve(); + }); + }); + } + }, { + key: 'manager', + value: function manager(_manager) { + _manager.define('physics'); + _manager.set('physicsWorker', this.worker); + } + }, { + key: 'integrate', + value: function integrate(self) { + var _this4 = this; + + // ... + + this.setFixedTimeStep = function (fixedTimeStep) { + if (fixedTimeStep) self.execute('setFixedTimeStep', fixedTimeStep); + }; + + this.setGravity = function (gravity) { + if (gravity) self.execute('setGravity', gravity); + }; + + this.addConstraint = self.addConstraint.bind(self); + + this.simulate = function (timeStep, maxSubSteps) { + if (self._stats) self._stats.begin(); + + if (self.isSimulating) return false; + self.isSimulating = true; + + for (var object_id in self.objects) { + if (!self.objects.hasOwnProperty(object_id)) continue; + + var object = self.objects[object_id]; + var component = object.component; + var data = component.use('physics').data; + + if (object !== null && (component.__dirtyPosition || component.__dirtyRotation)) { + var update = { id: data.id }; + + if (component.__dirtyPosition) { + update.pos = { + x: object.position.x, + y: object.position.y, + z: object.position.z + }; + + if (data.isSoftbody) object.position.set(0, 0, 0); + + component.__dirtyPosition = false; + } + + if (component.__dirtyRotation) { + update.quat = { + x: object.quaternion.x, + y: object.quaternion.y, + z: object.quaternion.z, + w: object.quaternion.w + }; + + if (data.isSoftbody) object.rotation.set(0, 0, 0); + + component.__dirtyRotation = false; + } + + self.execute('updateTransform', update); + } + } + + self.execute('simulate', { timeStep: timeStep, maxSubSteps: maxSubSteps }); + + if (self._stats) self._stats.end(); + return true; + }; + + // const simulateProcess = (t) => { + // window.requestAnimationFrame(simulateProcess); + + // this.simulate(1/60, 1); // delta, 1 + // } + + // simulateProcess(); + + self.loader.then(function () { + self.simulateLoop = new whs.Loop(function (clock) { + _this4.simulate(clock.getDelta(), 1); // delta, 1 + }); + + self.simulateLoop.start(_this4); + + console.log(self.options.gravity); + _this4.setGravity(self.options.gravity); + }); + } + }]); + return WorldModuleBase; + }(Eventable), _class.defaults = { + fixedTimeStep: 1 / 60, + rateLimit: true, + ammo: "", + softbody: false, + gravity: new three.Vector3(0, -100, 0) + }, _temp2); + + var TARGET = typeof Symbol === 'undefined' ? '__target' : Symbol(), + SCRIPT_TYPE = 'application/javascript', + BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder, + URL = window.URL || window.webkitURL, + Worker = window.Worker; + + /** + * Returns a wrapper around Web Worker code that is constructible. + * + * @function shimWorker + * + * @param { String } filename The name of the file + * @param { Function } fn Function wrapping the code of the worker + */ + function shimWorker(filename, fn) { + return function ShimWorker(forceFallback) { + var o = this; + + if (!fn) { + return new Worker(filename); + } else if (Worker && !forceFallback) { + // Convert the function's inner code to a string to construct the worker + var source = fn.toString().replace(/^function.+?{/, '').slice(0, -1), + objURL = createSourceObject(source); + + this[TARGET] = new Worker(objURL); + URL.revokeObjectURL(objURL); + return this[TARGET]; + } else { + var selfShim = { + postMessage: function postMessage(m) { + if (o.onmessage) { + setTimeout(function () { + o.onmessage({ data: m, target: selfShim }); + }); + } + } + }; + + fn.call(selfShim); + this.postMessage = function (m) { + setTimeout(function () { + selfShim.onmessage({ data: m, target: o }); + }); + }; + this.isThisThread = true; + } + }; + } + // Test Worker capabilities + if (Worker) { + var testWorker, + objURL = createSourceObject('self.onmessage = function () {}'), + testArray = new Uint8Array(1); + + try { + // No workers via blobs in Edge 12 and IE 11 and lower :( + if (/(?:Trident|Edge)\/(?:[567]|12)/i.test(navigator.userAgent)) { + throw new Error('Not available'); + } + testWorker = new Worker(objURL); + + // Native browser on some Samsung devices throws for transferables, let's detect it + testWorker.postMessage(testArray, [testArray.buffer]); + } catch (e) { + Worker = null; + } finally { + URL.revokeObjectURL(objURL); + if (testWorker) { + testWorker.terminate(); + } + } + } + + function createSourceObject(str) { + try { + return URL.createObjectURL(new Blob([str], { type: SCRIPT_TYPE })); + } catch (e) { + var blob = new BlobBuilder(); + blob.append(str); + return URL.createObjectURL(blob.getBlob(type)); + } + } + + var PhysicsWorker = new shimWorker("../worker.js", function (window, document) { + var self = this; + function Events(target) { + var events = {}, + empty = []; + target = target || this; + /** + * On: listen to events + */ + target.on = function (type, func, ctx) { + (events[type] = events[type] || []).push([func, ctx]); + return target; + }; + /** + * Off: stop listening to event / specific callback + */ + target.off = function (type, func) { + type || (events = {}); + var list = events[type] || empty, + i = list.length = func ? list.length : 0; + while (i--) { + func == list[i][0] && list.splice(i, 1); + }return target; + }; + /** + * Emit: send event, callbacks will be triggered + */ + target.emit = function (type) { + var e = events[type] || empty, + list = e.length > 0 ? e.slice(0, e.length) : e, + i = 0, + j; + while (j = list[i++]) { + j[0].apply(j[1], empty.slice.call(arguments, 1)); + }return target; + }; + } + var insideWorker = !self.document; + if (!insideWorker) self = new Events(); + + var send = insideWorker ? self.webkitPostMessage || self.postMessage : function (data) { + self.emit('message', { data: data }); + }; + + self.send = send; + + var SUPPORT_TRANSFERABLE = void 0; + + if (insideWorker) { + var ab = new ArrayBuffer(1); + + send(ab, [ab]); + SUPPORT_TRANSFERABLE = ab.byteLength === 0; + } + + var MESSAGE_TYPES = { + WORLDREPORT: 0, + COLLISIONREPORT: 1, + VEHICLEREPORT: 2, + CONSTRAINTREPORT: 3, + SOFTREPORT: 4 + }; + + // temp variables + var _object = void 0, + _vector = void 0, + _transform = void 0, + _transform_pos = void 0, + _softbody_enabled = false, + _num_objects = 0, + _num_rigidbody_objects = 0, + _num_softbody_objects = 0, + _num_wheels = 0, + _num_constraints = 0, + _softbody_report_size = 0, + + + // world variables + fixedTimeStep = void 0, + world = void 0, + _vec3_1 = void 0, + _vec3_2 = void 0, + _vec3_3 = void 0, + _quat = void 0; + + // private cache + var public_functions = {}, + _objects = [], + _vehicles = [], + _constraints = [], + _objects_ammo = {}, + _object_shapes = {}, + + + // The following objects are to track objects that ammo.js doesn't clean + // up. All are cleaned up when they're corresponding body is destroyed. + // Unfortunately, it's very difficult to get at these objects from the + // body, so we have to track them ourselves. + _motion_states = {}, + + // Don't need to worry about it for cached shapes. + _noncached_shapes = {}, + + // A body with a compound shape always has a regular shape as well, so we + // have track them separately. + _compound_shapes = {}; + + // object reporting + var REPORT_CHUNKSIZE = void 0, + // report array is increased in increments of this chunk size + worldreport = void 0, + softreport = void 0, + collisionreport = void 0, + vehiclereport = void 0, + constraintreport = void 0; + + var WORLDREPORT_ITEMSIZE = 14, + // how many float values each reported item needs + COLLISIONREPORT_ITEMSIZE = 5, + // one float for each object id, and a Vec3 contact normal + VEHICLEREPORT_ITEMSIZE = 9, + // vehicle id, wheel index, 3 for position, 4 for rotation + CONSTRAINTREPORT_ITEMSIZE = 6; // constraint id, offset object, offset, applied impulse + + var getShapeFromCache = function getShapeFromCache(cache_key) { + if (_object_shapes[cache_key] !== undefined) return _object_shapes[cache_key]; + + return null; + }; + + var setShapeCache = function setShapeCache(cache_key, shape) { + _object_shapes[cache_key] = shape; + }; + + var createShape = function createShape(description) { + var shape = void 0; + + _transform.setIdentity(); + switch (description.type) { + case 'compound': + { + shape = new Ammo.btCompoundShape(); + + break; + } + case 'plane': + { + var cache_key = 'plane_' + description.normal.x + '_' + description.normal.y + '_' + description.normal.z; + + if ((shape = getShapeFromCache(cache_key)) === null) { + _vec3_1.setX(description.normal.x); + _vec3_1.setY(description.normal.y); + _vec3_1.setZ(description.normal.z); + shape = new Ammo.btStaticPlaneShape(_vec3_1, 0); + setShapeCache(cache_key, shape); + } + + break; + } + case 'box': + { + var _cache_key = 'box_' + description.width + '_' + description.height + '_' + description.depth; + + if ((shape = getShapeFromCache(_cache_key)) === null) { + _vec3_1.setX(description.width / 2); + _vec3_1.setY(description.height / 2); + _vec3_1.setZ(description.depth / 2); + shape = new Ammo.btBoxShape(_vec3_1); + setShapeCache(_cache_key, shape); + } + + break; + } + case 'sphere': + { + var _cache_key2 = 'sphere_' + description.radius; + + if ((shape = getShapeFromCache(_cache_key2)) === null) { + shape = new Ammo.btSphereShape(description.radius); + setShapeCache(_cache_key2, shape); + } + + break; + } + case 'cylinder': + { + var _cache_key3 = 'cylinder_' + description.width + '_' + description.height + '_' + description.depth; + + if ((shape = getShapeFromCache(_cache_key3)) === null) { + _vec3_1.setX(description.width / 2); + _vec3_1.setY(description.height / 2); + _vec3_1.setZ(description.depth / 2); + shape = new Ammo.btCylinderShape(_vec3_1); + setShapeCache(_cache_key3, shape); + } + + break; + } + case 'capsule': + { + var _cache_key4 = 'capsule_' + description.radius + '_' + description.height; + + if ((shape = getShapeFromCache(_cache_key4)) === null) { + // In Bullet, capsule height excludes the end spheres + shape = new Ammo.btCapsuleShape(description.radius, description.height - 2 * description.radius); + setShapeCache(_cache_key4, shape); + } + + break; + } + case 'cone': + { + var _cache_key5 = 'cone_' + description.radius + '_' + description.height; + + if ((shape = getShapeFromCache(_cache_key5)) === null) { + shape = new Ammo.btConeShape(description.radius, description.height); + setShapeCache(_cache_key5, shape); + } + + break; + } + case 'concave': + { + var triangle_mesh = new Ammo.btTriangleMesh(); + if (!description.data.length) return false; + var data = description.data; + + for (var i = 0; i < data.length / 9; i++) { + _vec3_1.setX(data[i * 9]); + _vec3_1.setY(data[i * 9 + 1]); + _vec3_1.setZ(data[i * 9 + 2]); + + _vec3_2.setX(data[i * 9 + 3]); + _vec3_2.setY(data[i * 9 + 4]); + _vec3_2.setZ(data[i * 9 + 5]); + + _vec3_3.setX(data[i * 9 + 6]); + _vec3_3.setY(data[i * 9 + 7]); + _vec3_3.setZ(data[i * 9 + 8]); + + triangle_mesh.addTriangle(_vec3_1, _vec3_2, _vec3_3, false); + } + + shape = new Ammo.btBvhTriangleMeshShape(triangle_mesh, true, true); + + _noncached_shapes[description.id] = shape; + + break; + } + case 'convex': + { + shape = new Ammo.btConvexHullShape(); + var _data = description.data; + + for (var _i = 0; _i < _data.length / 3; _i++) { + _vec3_1.setX(_data[_i * 3]); + _vec3_1.setY(_data[_i * 3 + 1]); + _vec3_1.setZ(_data[_i * 3 + 2]); + + shape.addPoint(_vec3_1); + } + + _noncached_shapes[description.id] = shape; + + break; + } + case 'heightfield': + { + var xpts = description.xpts, + ypts = description.ypts, + points = description.points, + ptr = Ammo._malloc(4 * xpts * ypts); + + for (var _i2 = 0, p = 0, p2 = 0; _i2 < xpts; _i2++) { + for (var j = 0; j < ypts; j++) { + Ammo.HEAPF32[ptr + p2 >> 2] = points[p]; + + p++; + p2 += 4; + } + } + + shape = new Ammo.btHeightfieldTerrainShape(description.xpts, description.ypts, ptr, 1, -description.absMaxHeight, description.absMaxHeight, 1, 'PHY_FLOAT', false); + + _noncached_shapes[description.id] = shape; + break; + } + default: + // Not recognized + return; + } + + return shape; + }; + + var createSoftBody = function createSoftBody(description) { + var body = void 0; + + var softBodyHelpers = new Ammo.btSoftBodyHelpers(); + + switch (description.type) { + case 'softTrimesh': + { + if (!description.aVertices.length) return false; + + body = softBodyHelpers.CreateFromTriMesh(world.getWorldInfo(), description.aVertices, description.aIndices, description.aIndices.length / 3, false); + + break; + } + case 'softClothMesh': + { + var cr = description.corners; + + body = softBodyHelpers.CreatePatch(world.getWorldInfo(), new Ammo.btVector3(cr[0], cr[1], cr[2]), new Ammo.btVector3(cr[3], cr[4], cr[5]), new Ammo.btVector3(cr[6], cr[7], cr[8]), new Ammo.btVector3(cr[9], cr[10], cr[11]), description.segments[0], description.segments[1], 0, true); + + break; + } + case 'softRopeMesh': + { + var data = description.data; + + body = softBodyHelpers.CreateRope(world.getWorldInfo(), new Ammo.btVector3(data[0], data[1], data[2]), new Ammo.btVector3(data[3], data[4], data[5]), data[6] - 1, 0); + + break; + } + default: + // Not recognized + return; + } + + return body; + }; + + public_functions.init = function () { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + if (params.noWorker) { + window.Ammo = new params.ammo(); + public_functions.makeWorld(params); + return; + } + + if (params.wasmBuffer) { + importScripts(params.ammo); + + self.Ammo = new loadAmmoFromBinary(params.wasmBuffer)(); + send({ cmd: 'ammoLoaded' }); + public_functions.makeWorld(params); + } else { + importScripts(params.ammo); + send({ cmd: 'ammoLoaded' }); + + self.Ammo = new Ammo(); + public_functions.makeWorld(params); + } + }; + + public_functions.makeWorld = function () { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + _transform = new Ammo.btTransform(); + _transform_pos = new Ammo.btTransform(); + _vec3_1 = new Ammo.btVector3(0, 0, 0); + _vec3_2 = new Ammo.btVector3(0, 0, 0); + _vec3_3 = new Ammo.btVector3(0, 0, 0); + _quat = new Ammo.btQuaternion(0, 0, 0, 0); + + REPORT_CHUNKSIZE = params.reportsize || 50; + + if (SUPPORT_TRANSFERABLE) { + // Transferable messages are supported, take advantage of them with TypedArrays + worldreport = new Float32Array(2 + REPORT_CHUNKSIZE * WORLDREPORT_ITEMSIZE); // message id + # of objects to report + chunk size * # of values per object + collisionreport = new Float32Array(2 + REPORT_CHUNKSIZE * COLLISIONREPORT_ITEMSIZE); // message id + # of collisions to report + chunk size * # of values per object + vehiclereport = new Float32Array(2 + REPORT_CHUNKSIZE * VEHICLEREPORT_ITEMSIZE); // message id + # of vehicles to report + chunk size * # of values per object + constraintreport = new Float32Array(2 + REPORT_CHUNKSIZE * CONSTRAINTREPORT_ITEMSIZE); // message id + # of constraints to report + chunk size * # of values per object + } else { + // Transferable messages are not supported, send data as normal arrays + worldreport = []; + collisionreport = []; + vehiclereport = []; + constraintreport = []; + } + + worldreport[0] = MESSAGE_TYPES.WORLDREPORT; + collisionreport[0] = MESSAGE_TYPES.COLLISIONREPORT; + vehiclereport[0] = MESSAGE_TYPES.VEHICLEREPORT; + constraintreport[0] = MESSAGE_TYPES.CONSTRAINTREPORT; + + var collisionConfiguration = params.softbody ? new Ammo.btSoftBodyRigidBodyCollisionConfiguration() : new Ammo.btDefaultCollisionConfiguration(), + dispatcher = new Ammo.btCollisionDispatcher(collisionConfiguration), + solver = new Ammo.btSequentialImpulseConstraintSolver(); + + var broadphase = void 0; + + if (!params.broadphase) params.broadphase = { type: 'dynamic' }; + // TODO!!! + /* if (params.broadphase.type === 'sweepprune') { + extend(params.broadphase, { + aabbmin: { + x: -50, + y: -50, + z: -50 + }, + aabbmax: { + x: 50, + y: 50, + z: 50 + }, + }); + }*/ + + switch (params.broadphase.type) { + case 'sweepprune': + _vec3_1.setX(params.broadphase.aabbmin.x); + _vec3_1.setY(params.broadphase.aabbmin.y); + _vec3_1.setZ(params.broadphase.aabbmin.z); + + _vec3_2.setX(params.broadphase.aabbmax.x); + _vec3_2.setY(params.broadphase.aabbmax.y); + _vec3_2.setZ(params.broadphase.aabbmax.z); + + broadphase = new Ammo.btAxisSweep3(_vec3_1, _vec3_2); + + break; + case 'dynamic': + default: + broadphase = new Ammo.btDbvtBroadphase(); + break; + } + + world = params.softbody ? new Ammo.btSoftRigidDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration, new Ammo.btDefaultSoftBodySolver()) : new Ammo.btDiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration); + fixedTimeStep = params.fixedTimeStep; + + if (params.softbody) _softbody_enabled = true; + + send({ cmd: 'worldReady' }); + }; + + public_functions.setFixedTimeStep = function (description) { + fixedTimeStep = description; + }; + + public_functions.setGravity = function (description) { + _vec3_1.setX(description.x); + _vec3_1.setY(description.y); + _vec3_1.setZ(description.z); + world.setGravity(_vec3_1); + }; + + public_functions.appendAnchor = function (description) { + _objects[description.obj].appendAnchor(description.node, _objects[description.obj2], description.collisionBetweenLinkedBodies, description.influence); + }; + + public_functions.linkNodes = function (description) { + var self_body = _objects[description.self]; + var other_body = _objects[description.body]; + + var self_node = self_body.get_m_nodes().at(description.n1); + var other_node = other_body.get_m_nodes().at(description.n2); + + var self_vec = self_node.get_m_x(); + var other_vec = other_node.get_m_x(); + + var force_x = other_vec.x() - self_vec.x(); + var force_y = other_vec.y() - self_vec.y(); + var force_z = other_vec.z() - self_vec.z(); + + // var modifier = 30; + + var cached_distance = void 0, + linked = false; + + var _loop = setInterval(function () { + force_x = other_vec.x() - self_vec.x(); + force_y = other_vec.y() - self_vec.y(); + force_z = other_vec.z() - self_vec.z(); + + var distance = Math.sqrt(force_x * force_x + force_y * force_y + force_z * force_z); + + if (cached_distance && !linked && cached_distance < distance) { + // cached_distance && !linked && cached_distance < distance + + linked = true; + + // let self_vel = self_node.get_m_v(); + // + // _vec3_1.setX(-self_vel.x()); + // _vec3_1.setY(-self_vel.y()); + // _vec3_1.setZ(-self_vel.z()); + // + // let other_vel = other_node.get_m_v(); + // + // _vec3_2.setX(-other_vel.x()); + // _vec3_2.setY(-other_vel.y()); + // _vec3_2.setZ(-other_vel.z()); + + console.log('link!'); + + _vec3_1.setX(0); + _vec3_1.setY(0); + _vec3_1.setZ(0); + + self_body.setVelocity(_vec3_1); + + other_body.setVelocity(_vec3_1); + + // self_body.addVelocity(_vec3_1); + // other_body.addVelocity(_vec3_2); + + // self_relative_x = self_node.x(); + // self_relative_y = self_node.y(); + // self_relative_z = self_node.z(); + // + // other_relative_x = other_node.x(); + // other_relative_y = other_node.y(); + // other_relative_z = other_node.z(); + + // self_relative = new Ammo.btVector3(); + // self_relative.setX(); + + // console.log('link!'); + // self_body.appendAnchor(description.n1, connector, true, 0.5); + // other_body.appendAnchor(description.n2, connector, true, 0.5); + // clearInterval(_loop); + + // _vec3_1.setX(0); + // _vec3_1.setY(0); + // _vec3_1.setZ(0); + + // self_body.setVelocity(_vec3_1); + // other_body.setVelocity(_vec3_1); + + // other_body.addForce( + // _vec3_2, + // description.n2 + // ); + + // description.modifier *= 1.6; + } + + var modifer2 = linked ? 40 : 1; + + force_x *= Math.max(distance, 1) * description.modifier * modifer2; + force_y *= Math.max(distance, 1) * description.modifier * modifer2; + force_z *= Math.max(distance, 1) * description.modifier * modifer2; + + _vec3_1.setX(force_x); + _vec3_1.setY(force_y); + _vec3_1.setZ(force_z); + + _vec3_2.setX(-force_x); + _vec3_2.setY(-force_y); + _vec3_2.setZ(-force_z); + + self_body.addVelocity(_vec3_1, description.n1); + + other_body.addVelocity(_vec3_2, description.n2); + + // } else { + // // self_relative_x = null; + // } + + + // if (self_relative_x) { + // _vec3_1.setX(self_relative_x - self_node.x()); + // _vec3_1.setY(self_relative_y - self_node.y()); + // _vec3_1.setZ(self_relative_z - self_node.z()); + // + // _vec3_2.setX(other_relative_x - other_node.x()); + // _vec3_2.setY(other_relative_y - other_node.y()); + // _vec3_2.setZ(other_relative_z - other_node.z()); + // } else { + + // } + + + cached_distance = distance; + }, 10); + }; + + public_functions.appendLink = function (description) { + // console.log(Ammo); + // console.log(new Ammo.Material()); + + // var _mat = new Ammo.Material(); + // + // _mat.set_m_kAST(0); + // _mat.set_m_kLST(0); + // _mat.set_m_kVST(0); + // + // _objects[description.self].appendLink( + // description.n1, + // description.n2, + // _mat, + // false + // ); + + _vec3_1.setX(1000); + _vec3_1.setY(0); + _vec3_1.setZ(0); + + _objects[description.self].addForce(_vec3_1, description.n1); + }; + + public_functions.appendLinearJoint = function (description) { + // console.log('Ammo', Ammo); + var specs = new Ammo.Specs(); + var _pos = description.specs.position; + + specs.set_position(new Ammo.btVector3(_pos[0], _pos[1], _pos[2])); + if (description.specs.erp) specs.set_erp(description.specs.erp); + if (description.specs.cfm) specs.set_cfm(description.specs.cfm); + if (description.specs.split) specs.set_split(description.specs.split); + + // console.log(specs); + // + // // ljoint.set_m_rpos( + // // new Ammo.btVector3(_pos1[0], _pos1[1], _pos1[2]), + // // new Ammo.btVector3(_pos2[0], _pos2[1], _pos2[2]) + // // ); + // + // // console.log('ljoint', ljoint); + // + + // console.log('body', _objects[description.body]); + _objects[description.self].appendLinearJoint(specs, _objects[description.body]); + }; + + public_functions.addObject = function (description) { + var body = void 0, + motionState = void 0; + + if (description.type.indexOf('soft') !== -1) { + body = createSoftBody(description); + + var sbConfig = body.get_m_cfg(); + + if (description.viterations) sbConfig.set_viterations(description.viterations); + if (description.piterations) sbConfig.set_piterations(description.piterations); + if (description.diterations) sbConfig.set_diterations(description.diterations); + if (description.citerations) sbConfig.set_citerations(description.citerations); + sbConfig.set_collisions(0x11); + sbConfig.set_kDF(description.friction); + sbConfig.set_kDP(description.damping); + if (description.pressure) sbConfig.set_kPR(description.pressure); + if (description.drag) sbConfig.set_kDG(description.drag); + if (description.lift) sbConfig.set_kLF(description.lift); + if (description.anchorHardness) sbConfig.set_kAHR(description.anchorHardness); + if (description.rigidHardness) sbConfig.set_kCHR(description.rigidHardness); + + if (description.klst) body.get_m_materials().at(0).set_m_kLST(description.klst); + if (description.kast) body.get_m_materials().at(0).set_m_kAST(description.kast); + if (description.kvst) body.get_m_materials().at(0).set_m_kVST(description.kvst); + + Ammo.castObject(body, Ammo.btCollisionObject).getCollisionShape().setMargin(typeof description.margin !== 'undefined' ? description.margin : 0.1); + + // Ammo.castObject(body, Ammo.btCollisionObject).getCollisionShape().setMargin(0); + + // Ammo.castObject(body, Ammo.btCollisionObject).getCollisionShape().setLocalScaling(_vec3_1); + body.setActivationState(description.state || 4); + body.type = 0; // SoftBody. + if (description.type === 'softRopeMesh') body.rope = true; + if (description.type === 'softClothMesh') body.cloth = true; + + _transform.setIdentity(); + + // @test + _quat.setX(description.rotation.x); + _quat.setY(description.rotation.y); + _quat.setZ(description.rotation.z); + _quat.setW(description.rotation.w); + body.rotate(_quat); + + _vec3_1.setX(description.position.x); + _vec3_1.setY(description.position.y); + _vec3_1.setZ(description.position.z); + body.translate(_vec3_1); + + _vec3_1.setX(description.scale.x); + _vec3_1.setY(description.scale.y); + _vec3_1.setZ(description.scale.z); + body.scale(_vec3_1); + + body.setTotalMass(description.mass, false); + world.addSoftBody(body, 1, -1); + if (description.type === 'softTrimesh') _softbody_report_size += body.get_m_faces().size() * 3;else if (description.type === 'softRopeMesh') _softbody_report_size += body.get_m_nodes().size();else _softbody_report_size += body.get_m_nodes().size() * 3; + + _num_softbody_objects++; + } else { + var shape = createShape(description); + + if (!shape) return; + + // If there are children then this is a compound shape + if (description.children) { + var compound_shape = new Ammo.btCompoundShape(); + compound_shape.addChildShape(_transform, shape); + + for (var i = 0; i < description.children.length; i++) { + var _child = description.children[i]; + + var trans = new Ammo.btTransform(); + trans.setIdentity(); + + _vec3_1.setX(_child.position_offset.x); + _vec3_1.setY(_child.position_offset.y); + _vec3_1.setZ(_child.position_offset.z); + trans.setOrigin(_vec3_1); + + _quat.setX(_child.rotation.x); + _quat.setY(_child.rotation.y); + _quat.setZ(_child.rotation.z); + _quat.setW(_child.rotation.w); + trans.setRotation(_quat); + + shape = createShape(description.children[i]); + compound_shape.addChildShape(trans, shape); + Ammo.destroy(trans); + } + + shape = compound_shape; + _compound_shapes[description.id] = shape; + } + + _vec3_1.setX(description.scale.x); + _vec3_1.setY(description.scale.y); + _vec3_1.setZ(description.scale.z); + + shape.setLocalScaling(_vec3_1); + shape.setMargin(typeof description.margin !== 'undefined' ? description.margin : 0); + + _vec3_1.setX(0); + _vec3_1.setY(0); + _vec3_1.setZ(0); + shape.calculateLocalInertia(description.mass, _vec3_1); + + _transform.setIdentity(); + + _vec3_2.setX(description.position.x); + _vec3_2.setY(description.position.y); + _vec3_2.setZ(description.position.z); + _transform.setOrigin(_vec3_2); + + _quat.setX(description.rotation.x); + _quat.setY(description.rotation.y); + _quat.setZ(description.rotation.z); + _quat.setW(description.rotation.w); + _transform.setRotation(_quat); + + motionState = new Ammo.btDefaultMotionState(_transform); // #TODO: btDefaultMotionState supports center of mass offset as second argument - implement + var rbInfo = new Ammo.btRigidBodyConstructionInfo(description.mass, motionState, shape, _vec3_1); + + rbInfo.set_m_friction(description.friction); + rbInfo.set_m_restitution(description.restitution); + rbInfo.set_m_linearDamping(description.damping); + rbInfo.set_m_angularDamping(description.damping); + + body = new Ammo.btRigidBody(rbInfo); + body.setActivationState(description.state || 4); + Ammo.destroy(rbInfo); + + if (typeof description.collision_flags !== 'undefined') body.setCollisionFlags(description.collision_flags); + + if (description.group && description.mask) world.addRigidBody(body, description.group, description.mask);else world.addRigidBody(body); + body.type = 1; // RigidBody. + _num_rigidbody_objects++; + } + + body.activate(); + + body.id = description.id; + _objects[body.id] = body; + _motion_states[body.id] = motionState; + + _objects_ammo[body.a === undefined ? body.ptr : body.a] = body.id; + _num_objects++; + + send({ cmd: 'objectReady', params: body.id }); + }; + + public_functions.addVehicle = function (description) { + var vehicle_tuning = new Ammo.btVehicleTuning(); + + vehicle_tuning.set_m_suspensionStiffness(description.suspension_stiffness); + vehicle_tuning.set_m_suspensionCompression(description.suspension_compression); + vehicle_tuning.set_m_suspensionDamping(description.suspension_damping); + vehicle_tuning.set_m_maxSuspensionTravelCm(description.max_suspension_travel); + vehicle_tuning.set_m_maxSuspensionForce(description.max_suspension_force); + + var vehicle = new Ammo.btRaycastVehicle(vehicle_tuning, _objects[description.rigidBody], new Ammo.btDefaultVehicleRaycaster(world)); + + vehicle.tuning = vehicle_tuning; + _objects[description.rigidBody].setActivationState(4); + vehicle.setCoordinateSystem(0, 1, 2); + + world.addVehicle(vehicle); + _vehicles[description.id] = vehicle; + }; + public_functions.removeVehicle = function (description) { + _vehicles[description.id] = null; + }; + + public_functions.addWheel = function (description) { + if (_vehicles[description.id] !== undefined) { + var tuning = _vehicles[description.id].tuning; + if (description.tuning !== undefined) { + tuning = new Ammo.btVehicleTuning(); + tuning.set_m_suspensionStiffness(description.tuning.suspension_stiffness); + tuning.set_m_suspensionCompression(description.tuning.suspension_compression); + tuning.set_m_suspensionDamping(description.tuning.suspension_damping); + tuning.set_m_maxSuspensionTravelCm(description.tuning.max_suspension_travel); + tuning.set_m_maxSuspensionForce(description.tuning.max_suspension_force); + } + + _vec3_1.setX(description.connection_point.x); + _vec3_1.setY(description.connection_point.y); + _vec3_1.setZ(description.connection_point.z); + + _vec3_2.setX(description.wheel_direction.x); + _vec3_2.setY(description.wheel_direction.y); + _vec3_2.setZ(description.wheel_direction.z); + + _vec3_3.setX(description.wheel_axle.x); + _vec3_3.setY(description.wheel_axle.y); + _vec3_3.setZ(description.wheel_axle.z); + + _vehicles[description.id].addWheel(_vec3_1, _vec3_2, _vec3_3, description.suspension_rest_length, description.wheel_radius, tuning, description.is_front_wheel); + } + + _num_wheels++; + + if (SUPPORT_TRANSFERABLE) { + vehiclereport = new Float32Array(1 + _num_wheels * VEHICLEREPORT_ITEMSIZE); // message id & ( # of objects to report * # of values per object ) + vehiclereport[0] = MESSAGE_TYPES.VEHICLEREPORT; + } else vehiclereport = [MESSAGE_TYPES.VEHICLEREPORT]; + }; + + public_functions.setSteering = function (details) { + if (_vehicles[details.id] !== undefined) _vehicles[details.id].setSteeringValue(details.steering, details.wheel); + }; + + public_functions.setBrake = function (details) { + if (_vehicles[details.id] !== undefined) _vehicles[details.id].setBrake(details.brake, details.wheel); + }; + + public_functions.applyEngineForce = function (details) { + if (_vehicles[details.id] !== undefined) _vehicles[details.id].applyEngineForce(details.force, details.wheel); + }; + + public_functions.removeObject = function (details) { + if (_objects[details.id].type === 0) { + _num_softbody_objects--; + _softbody_report_size -= _objects[details.id].get_m_nodes().size(); + world.removeSoftBody(_objects[details.id]); + } else if (_objects[details.id].type === 1) { + _num_rigidbody_objects--; + world.removeRigidBody(_objects[details.id]); + Ammo.destroy(_motion_states[details.id]); + } + + Ammo.destroy(_objects[details.id]); + if (_compound_shapes[details.id]) Ammo.destroy(_compound_shapes[details.id]); + if (_noncached_shapes[details.id]) Ammo.destroy(_noncached_shapes[details.id]); + + _objects_ammo[_objects[details.id].a === undefined ? _objects[details.id].a : _objects[details.id].ptr] = null; + _objects[details.id] = null; + _motion_states[details.id] = null; + + if (_compound_shapes[details.id]) _compound_shapes[details.id] = null; + if (_noncached_shapes[details.id]) _noncached_shapes[details.id] = null; + _num_objects--; + }; + + public_functions.updateTransform = function (details) { + _object = _objects[details.id]; + + if (_object.type === 1) { + _object.getMotionState().getWorldTransform(_transform); + + if (details.pos) { + _vec3_1.setX(details.pos.x); + _vec3_1.setY(details.pos.y); + _vec3_1.setZ(details.pos.z); + _transform.setOrigin(_vec3_1); + } + + if (details.quat) { + _quat.setX(details.quat.x); + _quat.setY(details.quat.y); + _quat.setZ(details.quat.z); + _quat.setW(details.quat.w); + _transform.setRotation(_quat); + } + + _object.setWorldTransform(_transform); + _object.activate(); + } else if (_object.type === 0) { + // _object.getWorldTransform(_transform); + + if (details.pos) { + _vec3_1.setX(details.pos.x); + _vec3_1.setY(details.pos.y); + _vec3_1.setZ(details.pos.z); + _transform.setOrigin(_vec3_1); + } + + if (details.quat) { + _quat.setX(details.quat.x); + _quat.setY(details.quat.y); + _quat.setZ(details.quat.z); + _quat.setW(details.quat.w); + _transform.setRotation(_quat); + } + + _object.transform(_transform); + } + }; + + public_functions.updateMass = function (details) { + // #TODO: changing a static object into dynamic is buggy + _object = _objects[details.id]; + + // Per http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?p=&f=9&t=3663#p13816 + world.removeRigidBody(_object); + + _vec3_1.setX(0); + _vec3_1.setY(0); + _vec3_1.setZ(0); + + _object.setMassProps(details.mass, _vec3_1); + world.addRigidBody(_object); + _object.activate(); + }; + + public_functions.applyCentralImpulse = function (details) { + _vec3_1.setX(details.x); + _vec3_1.setY(details.y); + _vec3_1.setZ(details.z); + + _objects[details.id].applyCentralImpulse(_vec3_1); + _objects[details.id].activate(); + }; + + public_functions.applyImpulse = function (details) { + _vec3_1.setX(details.impulse_x); + _vec3_1.setY(details.impulse_y); + _vec3_1.setZ(details.impulse_z); + + _vec3_2.setX(details.x); + _vec3_2.setY(details.y); + _vec3_2.setZ(details.z); + + _objects[details.id].applyImpulse(_vec3_1, _vec3_2); + _objects[details.id].activate(); + }; + + public_functions.applyTorque = function (details) { + _vec3_1.setX(details.torque_x); + _vec3_1.setY(details.torque_y); + _vec3_1.setZ(details.torque_z); + + _objects[details.id].applyTorque(_vec3_1); + _objects[details.id].activate(); + }; + + public_functions.applyCentralForce = function (details) { + _vec3_1.setX(details.x); + _vec3_1.setY(details.y); + _vec3_1.setZ(details.z); + + _objects[details.id].applyCentralForce(_vec3_1); + _objects[details.id].activate(); + }; + + public_functions.applyForce = function (details) { + _vec3_1.setX(details.force_x); + _vec3_1.setY(details.force_y); + _vec3_1.setZ(details.force_z); + + _vec3_2.setX(details.x); + _vec3_2.setY(details.y); + _vec3_2.setZ(details.z); + + _objects[details.id].applyForce(_vec3_1, _vec3_2); + _objects[details.id].activate(); + }; + + public_functions.onSimulationResume = function () { + }; + + public_functions.setAngularVelocity = function (details) { + _vec3_1.setX(details.x); + _vec3_1.setY(details.y); + _vec3_1.setZ(details.z); + + _objects[details.id].setAngularVelocity(_vec3_1); + _objects[details.id].activate(); + }; + + public_functions.setLinearVelocity = function (details) { + _vec3_1.setX(details.x); + _vec3_1.setY(details.y); + _vec3_1.setZ(details.z); + + _objects[details.id].setLinearVelocity(_vec3_1); + _objects[details.id].activate(); + }; + + public_functions.setAngularFactor = function (details) { + _vec3_1.setX(details.x); + _vec3_1.setY(details.y); + _vec3_1.setZ(details.z); + + _objects[details.id].setAngularFactor(_vec3_1); + }; + + public_functions.setLinearFactor = function (details) { + _vec3_1.setX(details.x); + _vec3_1.setY(details.y); + _vec3_1.setZ(details.z); + + _objects[details.id].setLinearFactor(_vec3_1); + }; + + public_functions.setDamping = function (details) { + _objects[details.id].setDamping(details.linear, details.angular); + }; + + public_functions.setCcdMotionThreshold = function (details) { + _objects[details.id].setCcdMotionThreshold(details.threshold); + }; + + public_functions.setCcdSweptSphereRadius = function (details) { + _objects[details.id].setCcdSweptSphereRadius(details.radius); + }; + + public_functions.addConstraint = function (details) { + var constraint = void 0; + + switch (details.type) { + + case 'point': + { + if (details.objectb === undefined) { + _vec3_1.setX(details.positiona.x); + _vec3_1.setY(details.positiona.y); + _vec3_1.setZ(details.positiona.z); + + constraint = new Ammo.btPoint2PointConstraint(_objects[details.objecta], _vec3_1); + } else { + _vec3_1.setX(details.positiona.x); + _vec3_1.setY(details.positiona.y); + _vec3_1.setZ(details.positiona.z); + + _vec3_2.setX(details.positionb.x); + _vec3_2.setY(details.positionb.y); + _vec3_2.setZ(details.positionb.z); + + constraint = new Ammo.btPoint2PointConstraint(_objects[details.objecta], _objects[details.objectb], _vec3_1, _vec3_2); + } + break; + } + case 'hinge': + { + if (details.objectb === undefined) { + _vec3_1.setX(details.positiona.x); + _vec3_1.setY(details.positiona.y); + _vec3_1.setZ(details.positiona.z); + + _vec3_2.setX(details.axis.x); + _vec3_2.setY(details.axis.y); + _vec3_2.setZ(details.axis.z); + + constraint = new Ammo.btHingeConstraint(_objects[details.objecta], _vec3_1, _vec3_2); + } else { + _vec3_1.setX(details.positiona.x); + _vec3_1.setY(details.positiona.y); + _vec3_1.setZ(details.positiona.z); + + _vec3_2.setX(details.positionb.x); + _vec3_2.setY(details.positionb.y); + _vec3_2.setZ(details.positionb.z); + + _vec3_3.setX(details.axis.x); + _vec3_3.setY(details.axis.y); + _vec3_3.setZ(details.axis.z); + + constraint = new Ammo.btHingeConstraint(_objects[details.objecta], _objects[details.objectb], _vec3_1, _vec3_2, _vec3_3, _vec3_3); + } + break; + } + case 'slider': + { + var transformb = void 0; + var transforma = new Ammo.btTransform(); + + _vec3_1.setX(details.positiona.x); + _vec3_1.setY(details.positiona.y); + _vec3_1.setZ(details.positiona.z); + + transforma.setOrigin(_vec3_1); + + var rotation = transforma.getRotation(); + rotation.setEuler(details.axis.x, details.axis.y, details.axis.z); + transforma.setRotation(rotation); + + if (details.objectb) { + transformb = new Ammo.btTransform(); + + _vec3_2.setX(details.positionb.x); + _vec3_2.setY(details.positionb.y); + _vec3_2.setZ(details.positionb.z); + + transformb.setOrigin(_vec3_2); + + rotation = transformb.getRotation(); + rotation.setEuler(details.axis.x, details.axis.y, details.axis.z); + transformb.setRotation(rotation); + + constraint = new Ammo.btSliderConstraint(_objects[details.objecta], _objects[details.objectb], transforma, transformb, true); + } else { + constraint = new Ammo.btSliderConstraint(_objects[details.objecta], transforma, true); + } + + constraint.ta = transforma; + constraint.tb = transformb; + + Ammo.destroy(transforma); + if (transformb !== undefined) Ammo.destroy(transformb); + + break; + } + case 'conetwist': + { + var _transforma = new Ammo.btTransform(); + _transforma.setIdentity(); + + var _transformb = new Ammo.btTransform(); + _transformb.setIdentity(); + + _vec3_1.setX(details.positiona.x); + _vec3_1.setY(details.positiona.y); + _vec3_1.setZ(details.positiona.z); + + _vec3_2.setX(details.positionb.x); + _vec3_2.setY(details.positionb.y); + _vec3_2.setZ(details.positionb.z); + + _transforma.setOrigin(_vec3_1); + _transformb.setOrigin(_vec3_2); + + var _rotation = _transforma.getRotation(); + _rotation.setEulerZYX(-details.axisa.z, -details.axisa.y, -details.axisa.x); + _transforma.setRotation(_rotation); + + _rotation = _transformb.getRotation(); + _rotation.setEulerZYX(-details.axisb.z, -details.axisb.y, -details.axisb.x); + _transformb.setRotation(_rotation); + + constraint = new Ammo.btConeTwistConstraint(_objects[details.objecta], _objects[details.objectb], _transforma, _transformb); + + constraint.setLimit(Math.PI, 0, Math.PI); + + constraint.ta = _transforma; + constraint.tb = _transformb; + + Ammo.destroy(_transforma); + Ammo.destroy(_transformb); + + break; + } + case 'dof': + { + var _transformb2 = void 0; + + var _transforma2 = new Ammo.btTransform(); + _transforma2.setIdentity(); + + _vec3_1.setX(details.positiona.x); + _vec3_1.setY(details.positiona.y); + _vec3_1.setZ(details.positiona.z); + + _transforma2.setOrigin(_vec3_1); + + var _rotation2 = _transforma2.getRotation(); + _rotation2.setEulerZYX(-details.axisa.z, -details.axisa.y, -details.axisa.x); + _transforma2.setRotation(_rotation2); + + if (details.objectb) { + _transformb2 = new Ammo.btTransform(); + _transformb2.setIdentity(); + + _vec3_2.setX(details.positionb.x); + _vec3_2.setY(details.positionb.y); + _vec3_2.setZ(details.positionb.z); + + _transformb2.setOrigin(_vec3_2); + + _rotation2 = _transformb2.getRotation(); + _rotation2.setEulerZYX(-details.axisb.z, -details.axisb.y, -details.axisb.x); + _transformb2.setRotation(_rotation2); + + constraint = new Ammo.btGeneric6DofConstraint(_objects[details.objecta], _objects[details.objectb], _transforma2, _transformb2, true); + } else { + constraint = new Ammo.btGeneric6DofConstraint(_objects[details.objecta], _transforma2, true); + } + + constraint.ta = _transforma2; + constraint.tb = _transformb2; + + Ammo.destroy(_transforma2); + if (_transformb2 !== undefined) Ammo.destroy(_transformb2); + + break; + } + default: + return; + } + + world.addConstraint(constraint); + + constraint.a = _objects[details.objecta]; + constraint.b = _objects[details.objectb]; + + constraint.enableFeedback(); + _constraints[details.id] = constraint; + _num_constraints++; + + if (SUPPORT_TRANSFERABLE) { + constraintreport = new Float32Array(1 + _num_constraints * CONSTRAINTREPORT_ITEMSIZE); // message id & ( # of objects to report * # of values per object ) + constraintreport[0] = MESSAGE_TYPES.CONSTRAINTREPORT; + } else constraintreport = [MESSAGE_TYPES.CONSTRAINTREPORT]; + }; + + public_functions.removeConstraint = function (details) { + var constraint = _constraints[details.id]; + + if (constraint !== undefined) { + world.removeConstraint(constraint); + _constraints[details.id] = null; + _num_constraints--; + } + }; + + public_functions.constraint_setBreakingImpulseThreshold = function (details) { + var constraint = _constraints[details.id]; + if (constraint !== undefined) constraint.setBreakingImpulseThreshold(details.threshold); + }; + + public_functions.simulate = function () { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + if (world) { + if (params.timeStep && params.timeStep < fixedTimeStep) params.timeStep = fixedTimeStep; + + params.maxSubSteps = params.maxSubSteps || Math.ceil(params.timeStep / fixedTimeStep); // If maxSubSteps is not defined, keep the simulation fully up to date + + world.stepSimulation(params.timeStep, params.maxSubSteps, fixedTimeStep); + + if (_vehicles.length > 0) reportVehicles(); + reportCollisions(); + if (_constraints.length > 0) reportConstraints(); + reportWorld(); + if (_softbody_enabled) reportWorld_softbodies(); + } + }; + + // Constraint functions + public_functions.hinge_setLimits = function (params) { + _constraints[params.constraint].setLimit(params.low, params.high, 0, params.bias_factor, params.relaxation_factor); + }; + + public_functions.hinge_enableAngularMotor = function (params) { + var constraint = _constraints[params.constraint]; + constraint.enableAngularMotor(true, params.velocity, params.acceleration); + constraint.a.activate(); + if (constraint.b) constraint.b.activate(); + }; + + public_functions.hinge_disableMotor = function (params) { + _constraints[params.constraint].enableMotor(false); + if (constraint.b) constraint.b.activate(); + }; + + public_functions.slider_setLimits = function (params) { + var constraint = _constraints[params.constraint]; + constraint.setLowerLinLimit(params.lin_lower || 0); + constraint.setUpperLinLimit(params.lin_upper || 0); + + constraint.setLowerAngLimit(params.ang_lower || 0); + constraint.setUpperAngLimit(params.ang_upper || 0); + }; + + public_functions.slider_setRestitution = function (params) { + var constraint = _constraints[params.constraint]; + constraint.setSoftnessLimLin(params.linear || 0); + constraint.setSoftnessLimAng(params.angular || 0); + }; + + public_functions.slider_enableLinearMotor = function (params) { + var constraint = _constraints[params.constraint]; + constraint.setTargetLinMotorVelocity(params.velocity); + constraint.setMaxLinMotorForce(params.acceleration); + constraint.setPoweredLinMotor(true); + constraint.a.activate(); + if (constraint.b) constraint.b.activate(); + }; + + public_functions.slider_disableLinearMotor = function (params) { + var constraint = _constraints[params.constraint]; + constraint.setPoweredLinMotor(false); + if (constraint.b) constraint.b.activate(); + }; + + public_functions.slider_enableAngularMotor = function (params) { + var constraint = _constraints[params.constraint]; + constraint.setTargetAngMotorVelocity(params.velocity); + constraint.setMaxAngMotorForce(params.acceleration); + constraint.setPoweredAngMotor(true); + constraint.a.activate(); + if (constraint.b) constraint.b.activate(); + }; + + public_functions.slider_disableAngularMotor = function (params) { + var constraint = _constraints[params.constraint]; + constraint.setPoweredAngMotor(false); + constraint.a.activate(); + if (constraint.b) constraint.b.activate(); + }; + + public_functions.conetwist_setLimit = function (params) { + _constraints[params.constraint].setLimit(params.z, params.y, params.x); // ZYX order + }; + + public_functions.conetwist_enableMotor = function (params) { + var constraint = _constraints[params.constraint]; + constraint.enableMotor(true); + constraint.a.activate(); + constraint.b.activate(); + }; + + public_functions.conetwist_setMaxMotorImpulse = function (params) { + var constraint = _constraints[params.constraint]; + constraint.setMaxMotorImpulse(params.max_impulse); + constraint.a.activate(); + constraint.b.activate(); + }; + + public_functions.conetwist_setMotorTarget = function (params) { + var constraint = _constraints[params.constraint]; + + _quat.setX(params.x); + _quat.setY(params.y); + _quat.setZ(params.z); + _quat.setW(params.w); + + constraint.setMotorTarget(_quat); + + constraint.a.activate(); + constraint.b.activate(); + }; + + public_functions.conetwist_disableMotor = function (params) { + var constraint = _constraints[params.constraint]; + constraint.enableMotor(false); + constraint.a.activate(); + constraint.b.activate(); + }; + + public_functions.dof_setLinearLowerLimit = function (params) { + var constraint = _constraints[params.constraint]; + + _vec3_1.setX(params.x); + _vec3_1.setY(params.y); + _vec3_1.setZ(params.z); + + constraint.setLinearLowerLimit(_vec3_1); + constraint.a.activate(); + + if (constraint.b) constraint.b.activate(); + }; + + public_functions.dof_setLinearUpperLimit = function (params) { + var constraint = _constraints[params.constraint]; + + _vec3_1.setX(params.x); + _vec3_1.setY(params.y); + _vec3_1.setZ(params.z); + + constraint.setLinearUpperLimit(_vec3_1); + constraint.a.activate(); + + if (constraint.b) constraint.b.activate(); + }; + + public_functions.dof_setAngularLowerLimit = function (params) { + var constraint = _constraints[params.constraint]; + + _vec3_1.setX(params.x); + _vec3_1.setY(params.y); + _vec3_1.setZ(params.z); + + constraint.setAngularLowerLimit(_vec3_1); + constraint.a.activate(); + + if (constraint.b) constraint.b.activate(); + }; + + public_functions.dof_setAngularUpperLimit = function (params) { + var constraint = _constraints[params.constraint]; + + _vec3_1.setX(params.x); + _vec3_1.setY(params.y); + _vec3_1.setZ(params.z); + + constraint.setAngularUpperLimit(_vec3_1); + constraint.a.activate(); + + if (constraint.b) constraint.b.activate(); + }; + + public_functions.dof_enableAngularMotor = function (params) { + var constraint = _constraints[params.constraint]; + + var motor = constraint.getRotationalLimitMotor(params.which); + motor.set_m_enableMotor(true); + constraint.a.activate(); + + if (constraint.b) constraint.b.activate(); + }; + + public_functions.dof_configureAngularMotor = function (params) { + var constraint = _constraints[params.constraint], + motor = constraint.getRotationalLimitMotor(params.which); + + motor.set_m_loLimit(params.low_angle); + motor.set_m_hiLimit(params.high_angle); + motor.set_m_targetVelocity(params.velocity); + motor.set_m_maxMotorForce(params.max_force); + constraint.a.activate(); + + if (constraint.b) constraint.b.activate(); + }; + + public_functions.dof_disableAngularMotor = function (params) { + var constraint = _constraints[params.constraint], + motor = constraint.getRotationalLimitMotor(params.which); + + motor.set_m_enableMotor(false); + constraint.a.activate(); + + if (constraint.b) constraint.b.activate(); + }; + + var reportWorld = function reportWorld() { + if (SUPPORT_TRANSFERABLE && worldreport.length < 2 + _num_rigidbody_objects * WORLDREPORT_ITEMSIZE) { + worldreport = new Float32Array(2 // message id & # objects in report + + Math.ceil(_num_rigidbody_objects / REPORT_CHUNKSIZE) * REPORT_CHUNKSIZE * WORLDREPORT_ITEMSIZE // # of values needed * item size + ); + + worldreport[0] = MESSAGE_TYPES.WORLDREPORT; + } + + worldreport[1] = _num_rigidbody_objects; // record how many objects we're reporting on + + { + var i = 0, + index = _objects.length; + + while (index--) { + var object = _objects[index]; + + if (object && object.type === 1) { + // RigidBodies. + // #TODO: we can't use center of mass transform when center of mass can change, + // but getMotionState().getWorldTransform() screws up on objects that have been moved + // object.getMotionState().getWorldTransform( transform ); + // object.getMotionState().getWorldTransform(_transform); + + var transform = object.getCenterOfMassTransform(); + var origin = transform.getOrigin(); + var rotation = transform.getRotation(); + + // add values to report + var offset = 2 + i++ * WORLDREPORT_ITEMSIZE; + + worldreport[offset] = object.id; + + worldreport[offset + 1] = origin.x(); + worldreport[offset + 2] = origin.y(); + worldreport[offset + 3] = origin.z(); + + worldreport[offset + 4] = rotation.x(); + worldreport[offset + 5] = rotation.y(); + worldreport[offset + 6] = rotation.z(); + worldreport[offset + 7] = rotation.w(); + + _vector = object.getLinearVelocity(); + worldreport[offset + 8] = _vector.x(); + worldreport[offset + 9] = _vector.y(); + worldreport[offset + 10] = _vector.z(); + + _vector = object.getAngularVelocity(); + worldreport[offset + 11] = _vector.x(); + worldreport[offset + 12] = _vector.y(); + worldreport[offset + 13] = _vector.z(); + } + } + } + + if (SUPPORT_TRANSFERABLE) send(worldreport.buffer, [worldreport.buffer]);else send(worldreport); + }; + + var reportWorld_softbodies = function reportWorld_softbodies() { + // TODO: Add SUPPORTTRANSFERABLE. + + softreport = new Float32Array(2 // message id & # objects in report + + _num_softbody_objects * 2 + _softbody_report_size * 6); + + softreport[0] = MESSAGE_TYPES.SOFTREPORT; + softreport[1] = _num_softbody_objects; // record how many objects we're reporting on + + { + var offset = 2, + index = _objects.length; + + while (index--) { + var object = _objects[index]; + + if (object && object.type === 0) { + // SoftBodies. + + softreport[offset] = object.id; + + var offsetVert = offset + 2; + + if (object.rope === true) { + var nodes = object.get_m_nodes(); + var size = nodes.size(); + softreport[offset + 1] = size; + + for (var i = 0; i < size; i++) { + var node = nodes.at(i); + var vert = node.get_m_x(); + var off = offsetVert + i * 3; + + softreport[off] = vert.x(); + softreport[off + 1] = vert.y(); + softreport[off + 2] = vert.z(); + } + + offset += size * 3 + 2; + } else if (object.cloth) { + var _nodes = object.get_m_nodes(); + var _size = _nodes.size(); + softreport[offset + 1] = _size; + + for (var _i3 = 0; _i3 < _size; _i3++) { + var _node = _nodes.at(_i3); + var _vert = _node.get_m_x(); + var normal = _node.get_m_n(); + var _off = offsetVert + _i3 * 6; + + softreport[_off] = _vert.x(); + softreport[_off + 1] = _vert.y(); + softreport[_off + 2] = _vert.z(); + + softreport[_off + 3] = -normal.x(); + softreport[_off + 4] = -normal.y(); + softreport[_off + 5] = -normal.z(); + } + + offset += _size * 6 + 2; + } else { + var faces = object.get_m_faces(); + var _size2 = faces.size(); + softreport[offset + 1] = _size2; + + for (var _i4 = 0; _i4 < _size2; _i4++) { + var face = faces.at(_i4); + + var node1 = face.get_m_n(0); + var node2 = face.get_m_n(1); + var node3 = face.get_m_n(2); + + var vert1 = node1.get_m_x(); + var vert2 = node2.get_m_x(); + var vert3 = node3.get_m_x(); + + var normal1 = node1.get_m_n(); + var normal2 = node2.get_m_n(); + var normal3 = node3.get_m_n(); + + var _off2 = offsetVert + _i4 * 18; + + softreport[_off2] = vert1.x(); + softreport[_off2 + 1] = vert1.y(); + softreport[_off2 + 2] = vert1.z(); + + softreport[_off2 + 3] = normal1.x(); + softreport[_off2 + 4] = normal1.y(); + softreport[_off2 + 5] = normal1.z(); + + softreport[_off2 + 6] = vert2.x(); + softreport[_off2 + 7] = vert2.y(); + softreport[_off2 + 8] = vert2.z(); + + softreport[_off2 + 9] = normal2.x(); + softreport[_off2 + 10] = normal2.y(); + softreport[_off2 + 11] = normal2.z(); + + softreport[_off2 + 12] = vert3.x(); + softreport[_off2 + 13] = vert3.y(); + softreport[_off2 + 14] = vert3.z(); + + softreport[_off2 + 15] = normal3.x(); + softreport[_off2 + 16] = normal3.y(); + softreport[_off2 + 17] = normal3.z(); + } + + offset += _size2 * 18 + 2; + } + } + } + } + + // if (SUPPORT_TRANSFERABLE) send(softreport.buffer, [softreport.buffer]); + // else send(softreport); + send(softreport); + }; + + var reportCollisions = function reportCollisions() { + var dp = world.getDispatcher(), + num = dp.getNumManifolds(); + // _collided = false; + + if (SUPPORT_TRANSFERABLE) { + if (collisionreport.length < 2 + num * COLLISIONREPORT_ITEMSIZE) { + collisionreport = new Float32Array(2 // message id & # objects in report + + Math.ceil(_num_objects / REPORT_CHUNKSIZE) * REPORT_CHUNKSIZE * COLLISIONREPORT_ITEMSIZE // # of values needed * item size + ); + collisionreport[0] = MESSAGE_TYPES.COLLISIONREPORT; + } + } + + collisionreport[1] = 0; // how many collisions we're reporting on + + for (var i = 0; i < num; i++) { + var manifold = dp.getManifoldByIndexInternal(i), + num_contacts = manifold.getNumContacts(); + + if (num_contacts === 0) continue; + + for (var j = 0; j < num_contacts; j++) { + var pt = manifold.getContactPoint(j); + + // if ( pt.getDistance() < 0 ) { + var offset = 2 + collisionreport[1]++ * COLLISIONREPORT_ITEMSIZE; + collisionreport[offset] = _objects_ammo[manifold.getBody0().ptr]; + collisionreport[offset + 1] = _objects_ammo[manifold.getBody1().ptr]; + + _vector = pt.get_m_normalWorldOnB(); + collisionreport[offset + 2] = _vector.x(); + collisionreport[offset + 3] = _vector.y(); + collisionreport[offset + 4] = _vector.z(); + break; + // } + // send(_objects_ammo); + } + } + + if (SUPPORT_TRANSFERABLE) send(collisionreport.buffer, [collisionreport.buffer]);else send(collisionreport); + }; + + var reportVehicles = function reportVehicles() { + if (SUPPORT_TRANSFERABLE) { + if (vehiclereport.length < 2 + _num_wheels * VEHICLEREPORT_ITEMSIZE) { + vehiclereport = new Float32Array(2 // message id & # objects in report + + Math.ceil(_num_wheels / REPORT_CHUNKSIZE) * REPORT_CHUNKSIZE * VEHICLEREPORT_ITEMSIZE // # of values needed * item size + ); + vehiclereport[0] = MESSAGE_TYPES.VEHICLEREPORT; + } + } + + { + var i = 0, + j = 0, + index = _vehicles.length; + + while (index--) { + if (_vehicles[index]) { + var vehicle = _vehicles[index]; + + for (j = 0; j < vehicle.getNumWheels(); j++) { + // vehicle.updateWheelTransform( j, true ); + // transform = vehicle.getWheelTransformWS( j ); + var transform = vehicle.getWheelInfo(j).get_m_worldTransform(); + + var origin = transform.getOrigin(); + var rotation = transform.getRotation(); + + // add values to report + var offset = 1 + i++ * VEHICLEREPORT_ITEMSIZE; + + vehiclereport[offset] = index; + vehiclereport[offset + 1] = j; + + vehiclereport[offset + 2] = origin.x(); + vehiclereport[offset + 3] = origin.y(); + vehiclereport[offset + 4] = origin.z(); + + vehiclereport[offset + 5] = rotation.x(); + vehiclereport[offset + 6] = rotation.y(); + vehiclereport[offset + 7] = rotation.z(); + vehiclereport[offset + 8] = rotation.w(); + } + } + } + + if (SUPPORT_TRANSFERABLE && j !== 0) send(vehiclereport.buffer, [vehiclereport.buffer]);else if (j !== 0) send(vehiclereport); + } + }; + + var reportConstraints = function reportConstraints() { + if (SUPPORT_TRANSFERABLE) { + if (constraintreport.length < 2 + _num_constraints * CONSTRAINTREPORT_ITEMSIZE) { + constraintreport = new Float32Array(2 // message id & # objects in report + + Math.ceil(_num_constraints / REPORT_CHUNKSIZE) * REPORT_CHUNKSIZE * CONSTRAINTREPORT_ITEMSIZE // # of values needed * item size + ); + constraintreport[0] = MESSAGE_TYPES.CONSTRAINTREPORT; + } + } + + { + var offset = 0, + i = 0, + index = _constraints.lenght; + + while (index--) { + if (_constraints[index]) { + var _constraint = _constraints[index]; + var offset_body = _constraint.a; + var transform = _constraint.ta; + var origin = transform.getOrigin(); + + // add values to report + offset = 1 + i++ * CONSTRAINTREPORT_ITEMSIZE; + + constraintreport[offset] = index; + constraintreport[offset + 1] = offset_body.id; + constraintreport[offset + 2] = origin.x; + constraintreport[offset + 3] = origin.y; + constraintreport[offset + 4] = origin.z; + constraintreport[offset + 5] = _constraint.getBreakingImpulseThreshold(); + } + } + + if (SUPPORT_TRANSFERABLE && i !== 0) send(constraintreport.buffer, [constraintreport.buffer]);else if (i !== 0) send(constraintreport); + } + }; + + self.onmessage = function (event) { + if (event.data instanceof Float32Array) { + // transferable object + switch (event.data[0]) { + case MESSAGE_TYPES.WORLDREPORT: + { + worldreport = new Float32Array(event.data); + break; + } + case MESSAGE_TYPES.COLLISIONREPORT: + { + collisionreport = new Float32Array(event.data); + break; + } + case MESSAGE_TYPES.VEHICLEREPORT: + { + vehiclereport = new Float32Array(event.data); + break; + } + case MESSAGE_TYPES.CONSTRAINTREPORT: + { + constraintreport = new Float32Array(event.data); + break; + } + default: + } + + return; + } else if (event.data.cmd && public_functions[event.data.cmd]) public_functions[event.data.cmd](event.data.params); + }; + + self.receive = self.onmessage; + }); + + var WorldModule = function (_WorldModuleBase) { + inherits(WorldModule, _WorldModuleBase); + + function WorldModule() { + var _ref; + + classCallCheck(this, WorldModule); + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + var _this = possibleConstructorReturn(this, (_ref = WorldModule.__proto__ || Object.getPrototypeOf(WorldModule)).call.apply(_ref, [this].concat(args))); + + _this.worker = new PhysicsWorker(); + _this.worker.transferableMessage = _this.worker.webkitPostMessage || _this.worker.postMessage; + + _this.isLoaded = false; + + var options = _this.options; + + _this.loader = new Promise(function (resolve, reject) { + // if (options.wasm) { + // fetch(options.wasm) + // .then(response => response.arrayBuffer()) + // .then(buffer => { + // options.wasmBuffer = buffer; + // + // this.execute('init', options); + // resolve(); + // }); + // } else { + _this.execute('init', options); + resolve(); + // } + }); + + _this.loader.then(function () { + _this.isLoaded = true; + }); + + // Test SUPPORT_TRANSFERABLE + + var ab = new ArrayBuffer(1); + _this.worker.transferableMessage(ab, [ab]); + _this.SUPPORT_TRANSFERABLE = ab.byteLength === 0; + + _this.setup(); + return _this; + } + + createClass(WorldModule, [{ + key: 'send', + value: function send() { + var _worker; + + (_worker = this.worker).transferableMessage.apply(_worker, arguments); + } + }, { + key: 'receive', + value: function receive(callback) { + this.worker.addEventListener('message', callback); + } + }]); + return WorldModule; + }(WorldModuleBase); + + var _class$1, _temp; + + var properties = { + position: { + get: function get$$1() { + return this._native.position; + }, + set: function set$$1(vector3) { + var pos = this._native.position; + var scope = this; + + Object.defineProperties(pos, { + x: { + get: function get$$1() { + return this._x; + }, + set: function set$$1(x) { + scope.__dirtyPosition = true; + this._x = x; + } + }, + y: { + get: function get$$1() { + return this._y; + }, + set: function set$$1(y) { + scope.__dirtyPosition = true; + this._y = y; + } + }, + z: { + get: function get$$1() { + return this._z; + }, + set: function set$$1(z) { + scope.__dirtyPosition = true; + this._z = z; + } + } + }); + + scope.__dirtyPosition = true; + + pos.copy(vector3); + } + }, + + quaternion: { + get: function get$$1() { + this.__c_rot = true; + return this.native.quaternion; + }, + set: function set$$1(quaternion) { + var _this = this; + + var quat = this._native.quaternion, + native = this._native; + + quat.copy(quaternion); + + quat.onChange(function () { + if (_this.__c_rot) { + if (native.__dirtyRotation === true) { + _this.__c_rot = false; + native.__dirtyRotation = false; + } + native.__dirtyRotation = true; + } + }); + } + }, + + rotation: { + get: function get$$1() { + this.__c_rot = true; + return this._native.rotation; + }, + set: function set$$1(euler) { + var _this2 = this; + + var rot = this._native.rotation, + native = this._native; + + this.quaternion.copy(new three.Quaternion().setFromEuler(euler)); + + rot.onChange(function () { + if (_this2.__c_rot) { + _this2.quaternion.copy(new three.Quaternion().setFromEuler(rot)); + native.__dirtyRotation = true; + } + }); + } + } + }; + + function wrapPhysicsPrototype(scope) { + for (var key in properties) { + Object.defineProperty(scope, key, { + get: properties[key].get.bind(scope), + set: properties[key].set.bind(scope), + configurable: true, + enumerable: true + }); + } + } + + function onCopy(source) { + wrapPhysicsPrototype(this); + + var physics = this.use('physics'); + var sourcePhysics = source.use('physics'); + + this.manager.modules.physics = physics.clone(this.manager); + + physics.data = _extends({}, sourcePhysics.data); + physics.data.isSoftBodyReset = false; + if (physics.data.isSoftbody) physics.data.isSoftBodyReset = false; + + this.position = this.position.clone(); + this.rotation = this.rotation.clone(); + this.quaternion = this.quaternion.clone(); + + return source; + } + + function onWrap() { + this.position = this.position.clone(); + this.rotation = this.rotation.clone(); + this.quaternion = this.quaternion.clone(); + } + + var API = function () { + function API() { + classCallCheck(this, API); + } + + createClass(API, [{ + key: 'applyCentralImpulse', + value: function applyCentralImpulse(force) { + this.execute('applyCentralImpulse', { id: this.data.id, x: force.x, y: force.y, z: force.z }); + } + }, { + key: 'applyImpulse', + value: function applyImpulse(force, offset) { + this.execute('applyImpulse', { + id: this.data.id, + impulse_x: force.x, + impulse_y: force.y, + impulse_z: force.z, + x: offset.x, + y: offset.y, + z: offset.z + }); + } + }, { + key: 'applyTorque', + value: function applyTorque(force) { + this.execute('applyTorque', { + id: this.data.id, + torque_x: force.x, + torque_y: force.y, + torque_z: force.z + }); + } + }, { + key: 'applyCentralForce', + value: function applyCentralForce(force) { + this.execute('applyCentralForce', { + id: this.data.id, + x: force.x, + y: force.y, + z: force.z + }); + } + }, { + key: 'applyForce', + value: function applyForce(force, offset) { + this.execute('applyForce', { + id: this.data.id, + force_x: force.x, + force_y: force.y, + force_z: force.z, + x: offset.x, + y: offset.y, + z: offset.z + }); + } + }, { + key: 'getAngularVelocity', + value: function getAngularVelocity() { + return this.data.angularVelocity; + } + }, { + key: 'setAngularVelocity', + value: function setAngularVelocity(velocity) { + this.execute('setAngularVelocity', { id: this.data.id, x: velocity.x, y: velocity.y, z: velocity.z }); + } + }, { + key: 'getLinearVelocity', + value: function getLinearVelocity() { + return this.data.linearVelocity; + } + }, { + key: 'setLinearVelocity', + value: function setLinearVelocity(velocity) { + this.execute('setLinearVelocity', { id: this.data.id, x: velocity.x, y: velocity.y, z: velocity.z }); + } + }, { + key: 'setAngularFactor', + value: function setAngularFactor(factor) { + this.execute('setAngularFactor', { id: this.data.id, x: factor.x, y: factor.y, z: factor.z }); + } + }, { + key: 'setLinearFactor', + value: function setLinearFactor(factor) { + this.execute('setLinearFactor', { id: this.data.id, x: factor.x, y: factor.y, z: factor.z }); + } + }, { + key: 'setDamping', + value: function setDamping(linear, angular) { + this.execute('setDamping', { id: this.data.id, linear: linear, angular: angular }); + } + }, { + key: 'setCcdMotionThreshold', + value: function setCcdMotionThreshold(threshold) { + this.execute('setCcdMotionThreshold', { id: this.data.id, threshold: threshold }); + } + }, { + key: 'setCcdSweptSphereRadius', + value: function setCcdSweptSphereRadius(radius) { + this.execute('setCcdSweptSphereRadius', { id: this.data.id, radius: radius }); + } + }]); + return API; + }(); + + var _default = (_temp = _class$1 = function (_API) { + inherits(_default, _API); + + function _default(defaults$$1, data) { + classCallCheck(this, _default); + + var _this3 = possibleConstructorReturn(this, (_default.__proto__ || Object.getPrototypeOf(_default)).call(this)); + + _this3.bridge = { + onCopy: onCopy, + onWrap: onWrap + }; + + _this3.data = Object.assign(defaults$$1, data); + return _this3; + } + + createClass(_default, [{ + key: 'integrate', + value: function integrate(self) { + wrapPhysicsPrototype(this); + } + }, { + key: 'manager', + value: function manager(_manager) { + _manager.define('physics'); + + this.execute = function () { + var _manager$get; + + return _manager.has('module:world') ? (_manager$get = _manager.get('module:world')).execute.apply(_manager$get, arguments) : function () {}; + }; + } + }, { + key: 'updateData', + value: function updateData(callback) { + this.bridge.geometry = function (geometry, module) { + if (!callback) return geometry; + + var result = callback(geometry, module); + return result ? result : geometry; + }; + } + }, { + key: 'clone', + value: function clone(manager) { + var clone = new this.constructor(); + clone.data = _extends({}, this.data); + clone.bridge.geometry = this.bridge.geometry; + this.manager.apply(clone, [manager]); + + return clone; + } + }]); + return _default; + }(API), _class$1.rigidbody = function () { + return { + touches: [], + linearVelocity: new three.Vector3(), + angularVelocity: new three.Vector3(), + mass: 10, + scale: new three.Vector3(1, 1, 1), + restitution: 0.3, + friction: 0.8, + damping: 0, + margin: 0 + }; + }, _class$1.softbody = function () { + return { + touches: [], + restitution: 0.3, + friction: 0.8, + damping: 0, + scale: new three.Vector3(1, 1, 1), + pressure: 100, + margin: 0, + klst: 0.9, + kvst: 0.9, + kast: 0.9, + piterations: 1, + viterations: 0, + diterations: 0, + citerations: 4, + anchorHardness: 0.7, + rigidHardness: 1, + isSoftbody: true, + isSoftBodyReset: false + }; + }, _class$1.rope = function () { + return { + touches: [], + friction: 0.8, + scale: new three.Vector3(1, 1, 1), + damping: 0, + margin: 0, + klst: 0.9, + kvst: 0.9, + kast: 0.9, + piterations: 1, + viterations: 0, + diterations: 0, + citerations: 4, + anchorHardness: 0.7, + rigidHardness: 1, + isSoftbody: true + }; + }, _class$1.cloth = function () { + return { + touches: [], + friction: 0.8, + damping: 0, + margin: 0, + scale: new three.Vector3(1, 1, 1), + klst: 0.9, + kvst: 0.9, + kast: 0.9, + piterations: 1, + viterations: 0, + diterations: 0, + citerations: 4, + anchorHardness: 0.7, + rigidHardness: 1 + }; + }, _temp); + + var BoxModule = function (_PhysicsModule) { + inherits(BoxModule, _PhysicsModule); + + function BoxModule(params) { + classCallCheck(this, BoxModule); + + var _this = possibleConstructorReturn(this, (BoxModule.__proto__ || Object.getPrototypeOf(BoxModule)).call(this, _extends({ + type: 'box' + }, _default.rigidbody()), params)); + + _this.updateData(function (geometry, _ref) { + var data = _ref.data; + + if (!geometry.boundingBox) geometry.computeBoundingBox(); + + data.width = data.width || geometry.boundingBox.max.x - geometry.boundingBox.min.x; + data.height = data.height || geometry.boundingBox.max.y - geometry.boundingBox.min.y; + data.depth = data.depth || geometry.boundingBox.max.z - geometry.boundingBox.min.z; + }); + return _this; + } + + return BoxModule; + }(_default); + + var CompoundModule = function (_PhysicsModule) { + inherits(CompoundModule, _PhysicsModule); + + function CompoundModule(params) { + classCallCheck(this, CompoundModule); + return possibleConstructorReturn(this, (CompoundModule.__proto__ || Object.getPrototypeOf(CompoundModule)).call(this, _extends({ + type: 'compound' + }, _default.rigidbody()), params)); + } + + return CompoundModule; + }(_default); + + // TODO: Test CapsuleModule in action. + var CapsuleModule = function (_PhysicsModule) { + inherits(CapsuleModule, _PhysicsModule); + + function CapsuleModule(params) { + classCallCheck(this, CapsuleModule); + + var _this = possibleConstructorReturn(this, (CapsuleModule.__proto__ || Object.getPrototypeOf(CapsuleModule)).call(this, _extends({ + type: 'capsule' + }, _default.rigidbody()), params)); + + _this.updateData(function (geometry, _ref) { + var data = _ref.data; + + if (!geometry.boundingBox) geometry.computeBoundingBox(); + + data.width = data.width || geometry.boundingBox.max.x - geometry.boundingBox.min.x; + data.height = data.height || geometry.boundingBox.max.y - geometry.boundingBox.min.y; + data.depth = data.depth || geometry.boundingBox.max.z - geometry.boundingBox.min.z; + }); + return _this; + } + + return CapsuleModule; + }(_default); + + var ConcaveModule = function (_PhysicsModule) { + inherits(ConcaveModule, _PhysicsModule); + + function ConcaveModule(params) { + classCallCheck(this, ConcaveModule); + + var _this = possibleConstructorReturn(this, (ConcaveModule.__proto__ || Object.getPrototypeOf(ConcaveModule)).call(this, _extends({ + type: 'concave' + }, _default.rigidbody()), params)); + + _this.updateData(function (geometry, _ref) { + var data = _ref.data; + + data.data = _this.geometryProcessor(geometry); + }); + return _this; + } + + createClass(ConcaveModule, [{ + key: 'geometryProcessor', + value: function geometryProcessor(geometry) { + if (!geometry.boundingBox) geometry.computeBoundingBox(); + + var data = geometry.isBufferGeometry ? geometry.attributes.position.array : new Float32Array(geometry.faces.length * 9); + + if (!geometry.isBufferGeometry) { + var vertices = geometry.vertices; + + for (var i = 0; i < geometry.faces.length; i++) { + var face = geometry.faces[i]; + + var vA = vertices[face.a]; + var vB = vertices[face.b]; + var vC = vertices[face.c]; + + var i9 = i * 9; + + data[i9] = vA.x; + data[i9 + 1] = vA.y; + data[i9 + 2] = vA.z; + + data[i9 + 3] = vB.x; + data[i9 + 4] = vB.y; + data[i9 + 5] = vB.z; + + data[i9 + 6] = vC.x; + data[i9 + 7] = vC.y; + data[i9 + 8] = vC.z; + } + } + + return data; + } + }]); + return ConcaveModule; + }(_default); + + var ConeModule = function (_PhysicsModule) { + inherits(ConeModule, _PhysicsModule); + + function ConeModule(params) { + classCallCheck(this, ConeModule); + + var _this = possibleConstructorReturn(this, (ConeModule.__proto__ || Object.getPrototypeOf(ConeModule)).call(this, _extends({ + type: 'cone' + }, _default.rigidbody()), params)); + + _this.updateData(function (geometry, _ref) { + var data = _ref.data; + + if (!geometry.boundingBox) geometry.computeBoundingBox(); + + data.radius = data.radius || (geometry.boundingBox.max.x - geometry.boundingBox.min.x) / 2; + data.height = data.height || geometry.boundingBox.max.y - geometry.boundingBox.min.y; + }); + return _this; + } + + return ConeModule; + }(_default); + + var ConvexModule = function (_PhysicsModule) { + inherits(ConvexModule, _PhysicsModule); + + function ConvexModule(params) { + classCallCheck(this, ConvexModule); + + var _this = possibleConstructorReturn(this, (ConvexModule.__proto__ || Object.getPrototypeOf(ConvexModule)).call(this, _extends({ + type: 'convex' + }, _default.rigidbody()), params)); + + _this.updateData(function (geometry, _ref) { + var data = _ref.data; + + if (!geometry.boundingBox) geometry.computeBoundingBox(); + if (!geometry.isBufferGeometry) geometry._bufferGeometry = new three.BufferGeometry().fromGeometry(geometry); + + data.data = geometry.isBufferGeometry ? geometry.attributes.position.array : geometry._bufferGeometry.attributes.position.array; + }); + return _this; + } + + return ConvexModule; + }(_default); + + var CylinderModule = function (_PhysicsModule) { + inherits(CylinderModule, _PhysicsModule); + + function CylinderModule(params) { + classCallCheck(this, CylinderModule); + + var _this = possibleConstructorReturn(this, (CylinderModule.__proto__ || Object.getPrototypeOf(CylinderModule)).call(this, _extends({ + type: 'cylinder' + }, _default.rigidbody()), params)); + + _this.updateData(function (geometry, _ref) { + var data = _ref.data; + + if (!geometry.boundingBox) geometry.computeBoundingBox(); + + data.width = data.width || geometry.boundingBox.max.x - geometry.boundingBox.min.x; + data.height = data.height || geometry.boundingBox.max.y - geometry.boundingBox.min.y; + data.depth = data.depth || geometry.boundingBox.max.z - geometry.boundingBox.min.z; + }); + return _this; + } + + return CylinderModule; + }(_default); + + var HeightfieldModule = function (_PhysicsModule) { + inherits(HeightfieldModule, _PhysicsModule); + + function HeightfieldModule(params) { + classCallCheck(this, HeightfieldModule); + + var _this = possibleConstructorReturn(this, (HeightfieldModule.__proto__ || Object.getPrototypeOf(HeightfieldModule)).call(this, _extends({ + type: 'heightfield', + size: new three.Vector2(1, 1), + autoAlign: false + }, _default.rigidbody()), params)); + + _this.updateData(function (geometry, _ref) { + var data = _ref.data; + var _data$size = data.size, + xdiv = _data$size.x, + ydiv = _data$size.y; + + var verts = geometry.isBufferGeometry ? geometry.attributes.position.array : geometry.vertices; + var size = geometry.isBufferGeometry ? verts.length / 3 : verts.length; + + if (!geometry.boundingBox) geometry.computeBoundingBox(); + + var xsize = geometry.boundingBox.max.x - geometry.boundingBox.min.x; + var ysize = geometry.boundingBox.max.z - geometry.boundingBox.min.z; + + data.xpts = typeof xdiv === 'undefined' ? Math.sqrt(size) : xdiv + 1; + data.ypts = typeof ydiv === 'undefined' ? Math.sqrt(size) : ydiv + 1; + + // note - this assumes our plane geometry is square, unless we pass in specific xdiv and ydiv + data.absMaxHeight = Math.max(geometry.boundingBox.max.y, Math.abs(geometry.boundingBox.min.y)); + + var points = new Float32Array(size), + xpts = data.xpts, + ypts = data.ypts; + + while (size--) { + var vNum = size % xpts + (ypts - Math.round(size / xpts - size % xpts / xpts) - 1) * ypts; + + if (geometry.isBufferGeometry) points[size] = verts[vNum * 3 + 1];else points[size] = verts[vNum].y; + } + + data.points = points; + + data.scale.multiply(new three.Vector3(xsize / (xpts - 1), 1, ysize / (ypts - 1))); + + if (data.autoAlign) geometry.translate(xsize / -2, 0, ysize / -2); + }); + return _this; + } + + return HeightfieldModule; + }(_default); + + var PlaneModule = function (_PhysicsModule) { + inherits(PlaneModule, _PhysicsModule); + + function PlaneModule(params) { + classCallCheck(this, PlaneModule); + + var _this = possibleConstructorReturn(this, (PlaneModule.__proto__ || Object.getPrototypeOf(PlaneModule)).call(this, _extends({ + type: 'plane' + }, _default.rigidbody()), params)); + + _this.updateData(function (geometry, _ref) { + var data = _ref.data; + + if (!geometry.boundingBox) geometry.computeBoundingBox(); + + data.width = data.width || geometry.boundingBox.max.x - geometry.boundingBox.min.x; + data.height = data.height || geometry.boundingBox.max.y - geometry.boundingBox.min.y; + data.normal = data.normal || geometry.faces[0].normal.clone(); + }); + return _this; + } + + return PlaneModule; + }(_default); + + var SphereModule = function (_PhysicsModule) { + inherits(SphereModule, _PhysicsModule); + + function SphereModule(params) { + classCallCheck(this, SphereModule); + + var _this = possibleConstructorReturn(this, (SphereModule.__proto__ || Object.getPrototypeOf(SphereModule)).call(this, _extends({ + type: 'sphere' + }, _default.rigidbody()), params)); + + _this.updateData(function (geometry, _ref) { + var data = _ref.data; + + if (!geometry.boundingSphere) geometry.computeBoundingSphere(); + data.radius = data.radius || geometry.boundingSphere.radius; + }); + return _this; + } + + return SphereModule; + }(_default); + + var SoftbodyModule = function (_PhysicsModule) { + inherits(SoftbodyModule, _PhysicsModule); + + function SoftbodyModule(params) { + classCallCheck(this, SoftbodyModule); + + var _this = possibleConstructorReturn(this, (SoftbodyModule.__proto__ || Object.getPrototypeOf(SoftbodyModule)).call(this, _extends({ + type: 'softTrimesh' + }, _default.softbody()), params)); + + _this.updateData(function (geometry, _ref) { + var data = _ref.data; + + var idxGeometry = geometry.isBufferGeometry ? geometry : function () { + geometry.mergeVertices(); + + var bufferGeometry = new three.BufferGeometry(); + + bufferGeometry.addAttribute('position', new three.BufferAttribute(new Float32Array(geometry.vertices.length * 3), 3).copyVector3sArray(geometry.vertices)); + + bufferGeometry.setIndex(new three.BufferAttribute(new (geometry.faces.length * 3 > 65535 ? Uint32Array : Uint16Array)(geometry.faces.length * 3), 1).copyIndicesArray(geometry.faces)); + + return bufferGeometry; + }(); + + data.aVertices = idxGeometry.attributes.position.array; + data.aIndices = idxGeometry.index.array; + + return new three.BufferGeometry().fromGeometry(geometry); + }); + return _this; + } + + createClass(SoftbodyModule, [{ + key: 'appendAnchor', + value: function appendAnchor(object, node) { + var influence = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; + var collisionBetweenLinkedBodies = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + + var o1 = this.data.id; + var o2 = object.use('physics').data.id; + + this.execute('appendAnchor', { + obj: o1, + obj2: o2, + node: node, + influence: influence, + collisionBetweenLinkedBodies: collisionBetweenLinkedBodies + }); + } + }]); + return SoftbodyModule; + }(_default); + + function arrayMax(array) { + if (array.length === 0) return -Infinity; + + var max = array[0]; + + for (var i = 1, l = array.length; i < l; ++i) { + if (array[i] > max) max = array[i]; + } + + return max; + } + + var ClothModule = function (_PhysicsModule) { + inherits(ClothModule, _PhysicsModule); + + function ClothModule(params) { + classCallCheck(this, ClothModule); + + var _this = possibleConstructorReturn(this, (ClothModule.__proto__ || Object.getPrototypeOf(ClothModule)).call(this, _extends({ + type: 'softClothMesh' + }, _default.cloth()), params)); + + _this.updateData(function (geometry, _ref) { + var data = _ref.data; + + var geomParams = geometry.parameters; + + var geom = geometry.isBufferGeometry ? geometry : function () { + geometry.mergeVertices(); + + var bufferGeometry = new three.BufferGeometry(); + + bufferGeometry.addAttribute('position', new three.BufferAttribute(new Float32Array(geometry.vertices.length * 3), 3).copyVector3sArray(geometry.vertices)); + + var faces = geometry.faces, + facesLength = faces.length, + uvs = geometry.faceVertexUvs[0]; + + var normalsArray = new Float32Array(facesLength * 3); + // const uvsArray = new Array(geometry.vertices.length * 2); + var uvsArray = new Float32Array(facesLength * 2); + var faceArray = new Uint32Array(facesLength * 3); + + for (var i = 0; i < facesLength; i++) { + var i3 = i * 3; + var normal = faces[i].normal || new Vector3(); + + faceArray[i3] = faces[i].a; + faceArray[i3 + 1] = faces[i].b; + faceArray[i3 + 2] = faces[i].c; + + normalsArray[i3] = normal.x; + normalsArray[i3 + 1] = normal.y; + normalsArray[i3 + 2] = normal.z; + + uvsArray[faces[i].a * 2 + 0] = uvs[i][0].x; // a + uvsArray[faces[i].a * 2 + 1] = uvs[i][0].y; + + uvsArray[faces[i].b * 2 + 0] = uvs[i][1].x; // b + uvsArray[faces[i].b * 2 + 1] = uvs[i][1].y; + + uvsArray[faces[i].c * 2 + 0] = uvs[i][2].x; // c + uvsArray[faces[i].c * 2 + 1] = uvs[i][2].y; + } + + bufferGeometry.addAttribute('normal', new three.BufferAttribute(normalsArray, 3)); + + bufferGeometry.addAttribute('uv', new three.BufferAttribute(uvsArray, 2)); + + bufferGeometry.setIndex(new three.BufferAttribute(new (arrayMax(faces) * 3 > 65535 ? Uint32Array : Uint16Array)(facesLength * 3), 1).copyIndicesArray(faces)); + + return bufferGeometry; + }(); + + var verts = geom.attributes.position.array; + + if (!geomParams.widthSegments) geomParams.widthSegments = 1; + if (!geomParams.heightSegments) geomParams.heightSegments = 1; + + var idx00 = 0; + var idx01 = geomParams.widthSegments; + var idx10 = (geomParams.heightSegments + 1) * (geomParams.widthSegments + 1) - (geomParams.widthSegments + 1); + var idx11 = verts.length / 3 - 1; + + data.corners = [verts[idx01 * 3], verts[idx01 * 3 + 1], verts[idx01 * 3 + 2], // ╗ + verts[idx00 * 3], verts[idx00 * 3 + 1], verts[idx00 * 3 + 2], // ╔ + verts[idx11 * 3], verts[idx11 * 3 + 1], verts[idx11 * 3 + 2], // ╝ + verts[idx10 * 3], verts[idx10 * 3 + 1], verts[idx10 * 3 + 2]]; + + data.segments = [geomParams.widthSegments + 1, geomParams.heightSegments + 1]; + + return geom; + }); + return _this; + } + + createClass(ClothModule, [{ + key: 'appendAnchor', + value: function appendAnchor(object, node, influence) { + var collisionBetweenLinkedBodies = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + + var o1 = this.data.id; + var o2 = object.use('physics').data.id; + + this.execute('appendAnchor', { + obj: o1, + obj2: o2, + node: node, + influence: influence, + collisionBetweenLinkedBodies: collisionBetweenLinkedBodies + }); + } + }, { + key: 'linkNodes', + value: function linkNodes(object, n1, n2, modifier) { + var self = this.data.id; + var body = object.use('physics').data.id; + + this.execute('linkNodes', { + self: self, + body: body, + n1: n1, // self node + n2: n2, // body node + modifier: modifier + }); + } + }, { + key: 'appendLinearJoint', + value: function appendLinearJoint(object, specs) { + var self = this.data.id; + var body = object.use('physics').data.id; + + this.execute('appendLinearJoint', { + self: self, + body: body, + specs: specs + }); + } + }]); + return ClothModule; + }(_default); + + var RopeModule = function (_PhysicsModule) { + inherits(RopeModule, _PhysicsModule); + + function RopeModule(params) { + classCallCheck(this, RopeModule); + + var _this = possibleConstructorReturn(this, (RopeModule.__proto__ || Object.getPrototypeOf(RopeModule)).call(this, _extends({ + type: 'softRopeMesh' + }, _default.rope()), params)); + + _this.updateData(function (geometry, _ref) { + var data = _ref.data; + + if (!geometry.isBufferGeometry) { + geometry = function () { + var buff = new three.BufferGeometry(); + + buff.addAttribute('position', new three.BufferAttribute(new Float32Array(geometry.vertices.length * 3), 3).copyVector3sArray(geometry.vertices)); + + return buff; + }(); + } + + var length = geometry.attributes.position.array.length / 3; + var vert = function vert(n) { + return new three.Vector3().fromArray(geometry.attributes.position.array, n * 3); + }; + + var v1 = vert(0); + var v2 = vert(length - 1); + + data.data = [v1.x, v1.y, v1.z, v2.x, v2.y, v2.z, length]; + + return geometry; + }); + return _this; + } + + createClass(RopeModule, [{ + key: 'appendAnchor', + value: function appendAnchor(object, node, influence) { + var collisionBetweenLinkedBodies = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + + var o1 = this.data.id; + var o2 = object.use('physics').data.id; + + this.execute('appendAnchor', { + obj: o1, + obj2: o2, + node: node, + influence: influence, + collisionBetweenLinkedBodies: collisionBetweenLinkedBodies + }); + } + }]); + return RopeModule; + }(_default); + + var _class$2, _temp$1; + + var PI_2 = Math.PI / 2; + + // TODO: Fix DOM + function FirstPersonControlsSolver(camera, mesh, params) { + var _this = this; + + var velocityFactor = 1; + var runVelocity = 0.25; + + mesh.use('physics').setAngularFactor({ x: 0, y: 0, z: 0 }); + camera.position.set(0, 0, 0); + + /* Init */ + var player = mesh, + pitchObject = new three.Object3D(); + + pitchObject.add(camera.native); + + var yawObject = new three.Object3D(); + + yawObject.position.y = params.ypos; // eyes are 2 meters above the ground + yawObject.add(pitchObject); + + var quat = new three.Quaternion(); + + var canJump = false, + + // Moves. + moveForward = false, + moveBackward = false, + moveLeft = false, + moveRight = false; + + player.on('collision', function (otherObject, v, r, contactNormal) { + console.log(contactNormal.y); + if (contactNormal.y < 0.5) // Use a "good" threshold value between 0 and 1 here! + canJump = true; + }); + + var onMouseMove = function onMouseMove(event) { + if (_this.enabled === false) return; + + var movementX = typeof event.movementX === 'number' ? event.movementX : typeof event.mozMovementX === 'number' ? event.mozMovementX : typeof event.getMovementX === 'function' ? event.getMovementX() : 0; + var movementY = typeof event.movementY === 'number' ? event.movementY : typeof event.mozMovementY === 'number' ? event.mozMovementY : typeof event.getMovementY === 'function' ? event.getMovementY() : 0; + + yawObject.rotation.y -= movementX * 0.002; + pitchObject.rotation.x -= movementY * 0.002; + + pitchObject.rotation.x = Math.max(-PI_2, Math.min(PI_2, pitchObject.rotation.x)); + }; + + var physics = player.use('physics'); + + var onKeyDown = function onKeyDown(event) { + switch (event.keyCode) { + case 38: // up + case 87: + // w + moveForward = true; + break; + + case 37: // left + case 65: + // a + moveLeft = true; + break; + + case 40: // down + case 83: + // s + moveBackward = true; + break; + + case 39: // right + case 68: + // d + moveRight = true; + break; + + case 32: + // space + console.log(canJump); + if (canJump === true) physics.applyCentralImpulse({ x: 0, y: 300, z: 0 }); + canJump = false; + break; + + case 16: + // shift + runVelocity = 0.5; + break; + + default: + } + }; + + var onKeyUp = function onKeyUp(event) { + switch (event.keyCode) { + case 38: // up + case 87: + // w + moveForward = false; + break; + + case 37: // left + case 65: + // a + moveLeft = false; + break; + + case 40: // down + case 83: + // a + moveBackward = false; + break; + + case 39: // right + case 68: + // d + moveRight = false; + break; + + case 16: + // shift + runVelocity = 0.25; + break; + + default: + } + }; + + document.body.addEventListener('mousemove', onMouseMove, false); + document.body.addEventListener('keydown', onKeyDown, false); + document.body.addEventListener('keyup', onKeyUp, false); + + this.enabled = false; + this.getObject = function () { + return yawObject; + }; + + this.getDirection = function (targetVec) { + targetVec.set(0, 0, -1); + quat.multiplyVector3(targetVec); + }; + + // Moves the camera to the Physi.js object position + // and adds velocity to the object if the run key is down. + var inputVelocity = new three.Vector3(), + euler = new three.Euler(); + + this.update = function (delta) { + if (_this.enabled === false) return; + + delta = delta || 0.5; + delta = Math.min(delta, 0.5, delta); + + inputVelocity.set(0, 0, 0); + + var speed = velocityFactor * delta * params.speed * runVelocity; + + if (moveForward) inputVelocity.z = -speed; + if (moveBackward) inputVelocity.z = speed; + if (moveLeft) inputVelocity.x = -speed; + if (moveRight) inputVelocity.x = speed; + + // Convert velocity to world coordinates + euler.x = pitchObject.rotation.x; + euler.y = yawObject.rotation.y; + euler.order = 'XYZ'; + + quat.setFromEuler(euler); + + inputVelocity.applyQuaternion(quat); + + physics.applyCentralImpulse({ x: inputVelocity.x, y: 0, z: inputVelocity.z }); + physics.setAngularVelocity({ x: inputVelocity.z, y: 0, z: -inputVelocity.x }); + physics.setAngularFactor({ x: 0, y: 0, z: 0 }); + }; + + player.on('physics:added', function () { + player.manager.get('module:world').addEventListener('update', function () { + if (_this.enabled === false) return; + yawObject.position.copy(player.position); + }); + }); + } + + var FirstPersonModule = (_temp$1 = _class$2 = function () { + function FirstPersonModule(object) { + var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + classCallCheck(this, FirstPersonModule); + + this.object = object; + this.params = params; + + if (!this.params.block) { + this.params.block = document.getElementById('blocker'); + } + } + + createClass(FirstPersonModule, [{ + key: 'manager', + value: function manager(_manager) { + var _this2 = this; + + this.controls = new FirstPersonControlsSolver(_manager.get('camera'), this.object, this.params); + + if ('pointerLockElement' in document || 'mozPointerLockElement' in document || 'webkitPointerLockElement' in document) { + var element = document.body; + + var pointerlockchange = function pointerlockchange() { + if (document.pointerLockElement === element || document.mozPointerLockElement === element || document.webkitPointerLockElement === element) { + _this2.controls.enabled = true; + _this2.params.block.style.display = 'none'; + } else { + _this2.controls.enabled = false; + _this2.params.block.style.display = 'block'; + } + }; + + document.addEventListener('pointerlockchange', pointerlockchange, false); + document.addEventListener('mozpointerlockchange', pointerlockchange, false); + document.addEventListener('webkitpointerlockchange', pointerlockchange, false); + + var pointerlockerror = function pointerlockerror() { + console.warn('Pointer lock error.'); + }; + + document.addEventListener('pointerlockerror', pointerlockerror, false); + document.addEventListener('mozpointerlockerror', pointerlockerror, false); + document.addEventListener('webkitpointerlockerror', pointerlockerror, false); + + document.querySelector('body').addEventListener('click', function () { + element.requestPointerLock = element.requestPointerLock || element.mozRequestPointerLock || element.webkitRequestPointerLock; + + element.requestFullscreen = element.requestFullscreen || element.mozRequestFullscreen || element.mozRequestFullScreen || element.webkitRequestFullscreen; + + if (/Firefox/i.test(navigator.userAgent)) { + var fullscreenchange = function fullscreenchange() { + if (document.fullscreenElement === element || document.mozFullscreenElement === element || document.mozFullScreenElement === element) { + document.removeEventListener('fullscreenchange', fullscreenchange); + document.removeEventListener('mozfullscreenchange', fullscreenchange); + + element.requestPointerLock(); + } + }; + + document.addEventListener('fullscreenchange', fullscreenchange, false); + document.addEventListener('mozfullscreenchange', fullscreenchange, false); + + element.requestFullscreen(); + } else element.requestPointerLock(); + }); + } else console.warn('Your browser does not support the PointerLock'); + + _manager.get('scene').add(this.controls.getObject()); + } + }, { + key: 'integrate', + value: function integrate(self) { + var updateProcessor = function updateProcessor(c) { + self.controls.update(c.getDelta()); + }; + + self.updateLoop = new whs.Loop(updateProcessor).start(this); + } + }]); + return FirstPersonModule; + }(), _class$2.defaults = { + block: null, + speed: 1, + ypos: 1 + }, _temp$1); + + exports.getEulerXYZFromQuaternion = getEulerXYZFromQuaternion; + exports.getQuatertionFromEuler = getQuatertionFromEuler; + exports.convertWorldPositionToObject = convertWorldPositionToObject; + exports.addObjectChildren = addObjectChildren; + exports.MESSAGE_TYPES = MESSAGE_TYPES; + exports.REPORT_ITEMSIZE = REPORT_ITEMSIZE; + exports.COLLISIONREPORT_ITEMSIZE = COLLISIONREPORT_ITEMSIZE; + exports.VEHICLEREPORT_ITEMSIZE = VEHICLEREPORT_ITEMSIZE; + exports.CONSTRAINTREPORT_ITEMSIZE = CONSTRAINTREPORT_ITEMSIZE; + exports.temp1Vector3 = temp1Vector3; + exports.temp2Vector3 = temp2Vector3; + exports.temp1Matrix4 = temp1Matrix4; + exports.temp1Quat = temp1Quat; + exports.Eventable = Eventable; + exports.ConeTwistConstraint = ConeTwistConstraint; + exports.HingeConstraint = HingeConstraint; + exports.PointConstraint = PointConstraint; + exports.SliderConstraint = SliderConstraint; + exports.DOFConstraint = DOFConstraint; + exports.WorldModule = WorldModule; + exports.BoxModule = BoxModule; + exports.CompoundModule = CompoundModule; + exports.CapsuleModule = CapsuleModule; + exports.ConcaveModule = ConcaveModule; + exports.ConeModule = ConeModule; + exports.ConvexModule = ConvexModule; + exports.CylinderModule = CylinderModule; + exports.HeightfieldModule = HeightfieldModule; + exports.PlaneModule = PlaneModule; + exports.SphereModule = SphereModule; + exports.SoftbodyModule = SoftbodyModule; + exports.ClothModule = ClothModule; + exports.RopeModule = RopeModule; + exports.FirstPersonModule = FirstPersonModule; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGh5c2ljcy1tb2R1bGUuanMubWFwIiwic291cmNlcyI6WyIuLi9zcmMvYXBpLmpzIiwiLi4vc3JjL2V2ZW50YWJsZS5qcyIsIi4uL3NyYy9jb25zdHJhaW50cy9Db25lVHdpc3RDb25zdHJhaW50LmpzIiwiLi4vc3JjL2NvbnN0cmFpbnRzL0hpbmdlQ29uc3RyYWludC5qcyIsIi4uL3NyYy9jb25zdHJhaW50cy9Qb2ludENvbnN0cmFpbnQuanMiLCIuLi9zcmMvY29uc3RyYWludHMvU2xpZGVyQ29uc3RyYWludC5qcyIsIi4uL3NyYy9jb25zdHJhaW50cy9ET0ZDb25zdHJhaW50LmpzIiwiLi4vc3JjL3ZlaGljbGUvdmVoaWNsZS5qcyIsIi4uL3NyYy9tb2R1bGVzL2NvcmUvV29ybGRNb2R1bGVCYXNlLmpzIiwiLi4vYnVuZGxlLXdvcmtlci93b3JrZXJoZWxwZXIuanMiLCIuLi9zcmMvd29ya2VyLmpzIiwiLi4vc3JjL21vZHVsZXMvV29ybGRNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9jb3JlL1BoeXNpY3NNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9Cb3hNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9Db21wb3VuZE1vZHVsZS5qcyIsIi4uL3NyYy9tb2R1bGVzL0NhcHN1bGVNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9Db25jYXZlTW9kdWxlLmpzIiwiLi4vc3JjL21vZHVsZXMvQ29uZU1vZHVsZS5qcyIsIi4uL3NyYy9tb2R1bGVzL0NvbnZleE1vZHVsZS5qcyIsIi4uL3NyYy9tb2R1bGVzL0N5bGluZGVyTW9kdWxlLmpzIiwiLi4vc3JjL21vZHVsZXMvSGVpZ2h0ZmllbGRNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9QbGFuZU1vZHVsZS5qcyIsIi4uL3NyYy9tb2R1bGVzL1NwaGVyZU1vZHVsZS5qcyIsIi4uL3NyYy9tb2R1bGVzL1NvZnRib2R5TW9kdWxlLmpzIiwiLi4vc3JjL21vZHVsZXMvQ2xvdGhNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9Sb3BlTW9kdWxlLmpzIiwiLi4vc3JjL21vZHVsZXMvY29udHJvbHMvRmlyc3RQZXJzb25Nb2R1bGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgVmVjdG9yMyxcbiAgTWF0cml4NCxcbiAgUXVhdGVybmlvblxufSBmcm9tICd0aHJlZSc7XG5cbmNvbnN0IE1FU1NBR0VfVFlQRVMgPSB7XG4gIFdPUkxEUkVQT1JUOiAwLFxuICBDT0xMSVNJT05SRVBPUlQ6IDEsXG4gIFZFSElDTEVSRVBPUlQ6IDIsXG4gIENPTlNUUkFJTlRSRVBPUlQ6IDMsXG4gIFNPRlRSRVBPUlQ6IDRcbn07XG5cbmNvbnN0IFJFUE9SVF9JVEVNU0laRSA9IDE0LFxuICBDT0xMSVNJT05SRVBPUlRfSVRFTVNJWkUgPSA1LFxuICBWRUhJQ0xFUkVQT1JUX0lURU1TSVpFID0gOSxcbiAgQ09OU1RSQUlOVFJFUE9SVF9JVEVNU0laRSA9IDY7XG5cbmNvbnN0IHRlbXAxVmVjdG9yMyA9IG5ldyBWZWN0b3IzKCksXG4gIHRlbXAyVmVjdG9yMyA9IG5ldyBWZWN0b3IzKCksXG4gIHRlbXAxTWF0cml4NCA9IG5ldyBNYXRyaXg0KCksXG4gIHRlbXAxUXVhdCA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cbmNvbnN0IGdldEV1bGVyWFlaRnJvbVF1YXRlcm5pb24gPSAoeCwgeSwgeiwgdykgPT4ge1xuICByZXR1cm4gbmV3IFZlY3RvcjMoXG4gICAgTWF0aC5hdGFuMigyICogKHggKiB3IC0geSAqIHopLCAodyAqIHcgLSB4ICogeCAtIHkgKiB5ICsgeiAqIHopKSxcbiAgICBNYXRoLmFzaW4oMiAqICh4ICogeiArIHkgKiB3KSksXG4gICAgTWF0aC5hdGFuMigyICogKHogKiB3IC0geCAqIHkpLCAodyAqIHcgKyB4ICogeCAtIHkgKiB5IC0geiAqIHopKVxuICApO1xufTtcblxuY29uc3QgZ2V0UXVhdGVydGlvbkZyb21FdWxlciA9ICh4LCB5LCB6KSA9PiB7XG4gIGNvbnN0IGMxID0gTWF0aC5jb3MoeSk7XG4gIGNvbnN0IHMxID0gTWF0aC5zaW4oeSk7XG4gIGNvbnN0IGMyID0gTWF0aC5jb3MoLXopO1xuICBjb25zdCBzMiA9IE1hdGguc2luKC16KTtcbiAgY29uc3QgYzMgPSBNYXRoLmNvcyh4KTtcbiAgY29uc3QgczMgPSBNYXRoLnNpbih4KTtcbiAgY29uc3QgYzFjMiA9IGMxICogYzI7XG4gIGNvbnN0IHMxczIgPSBzMSAqIHMyO1xuXG4gIHJldHVybiB7XG4gICAgdzogYzFjMiAqIGMzIC0gczFzMiAqIHMzLFxuICAgIHg6IGMxYzIgKiBzMyArIHMxczIgKiBjMyxcbiAgICB5OiBzMSAqIGMyICogYzMgKyBjMSAqIHMyICogczMsXG4gICAgejogYzEgKiBzMiAqIGMzIC0gczEgKiBjMiAqIHMzXG4gIH07XG59O1xuXG5jb25zdCBjb252ZXJ0V29ybGRQb3NpdGlvblRvT2JqZWN0ID0gKHBvc2l0aW9uLCBvYmplY3QpID0+IHtcbiAgdGVtcDFNYXRyaXg0LmlkZW50aXR5KCk7IC8vIHJlc2V0IHRlbXAgbWF0cml4XG5cbiAgLy8gU2V0IHRoZSB0ZW1wIG1hdHJpeCdzIHJvdGF0aW9uIHRvIHRoZSBvYmplY3QncyByb3RhdGlvblxuICB0ZW1wMU1hdHJpeDQuaWRlbnRpdHkoKS5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbihvYmplY3QucXVhdGVybmlvbik7XG5cbiAgLy8gSW52ZXJ0IHJvdGF0aW9uIG1hdHJpeCBpbiBvcmRlciB0byBcInVucm90YXRlXCIgYSBwb2ludCBiYWNrIHRvIG9iamVjdCBzcGFjZVxuICB0ZW1wMU1hdHJpeDQuZ2V0SW52ZXJzZSh0ZW1wMU1hdHJpeDQpO1xuXG4gIC8vIFlheSEgVGVtcCB2YXJzIVxuICB0ZW1wMVZlY3RvcjMuY29weShwb3NpdGlvbik7XG4gIHRlbXAyVmVjdG9yMy5jb3B5KG9iamVjdC5wb3NpdGlvbik7XG5cbiAgLy8gQXBwbHkgdGhlIHJvdGF0aW9uXG4gIHJldHVybiB0ZW1wMVZlY3RvcjMuc3ViKHRlbXAyVmVjdG9yMykuYXBwbHlNYXRyaXg0KHRlbXAxTWF0cml4NCk7XG59O1xuXG5jb25zdCBhZGRPYmplY3RDaGlsZHJlbiA9IGZ1bmN0aW9uIChwYXJlbnQsIG9iamVjdCkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG9iamVjdC5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNoaWxkID0gb2JqZWN0LmNoaWxkcmVuW2ldO1xuICAgIGNvbnN0IHBoeXNpY3MgPSBjaGlsZC5jb21wb25lbnQgPyBjaGlsZC5jb21wb25lbnQudXNlKCdwaHlzaWNzJykgOiBmYWxzZTtcblxuICAgIGlmIChwaHlzaWNzKSB7XG4gICAgICBjb25zdCBkYXRhID0gcGh5c2ljcy5kYXRhO1xuXG4gICAgICBjaGlsZC51cGRhdGVNYXRyaXgoKTtcbiAgICAgIGNoaWxkLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cbiAgICAgIHRlbXAxVmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oY2hpbGQubWF0cml4V29ybGQpO1xuICAgICAgdGVtcDFRdWF0LnNldEZyb21Sb3RhdGlvbk1hdHJpeChjaGlsZC5tYXRyaXhXb3JsZCk7XG5cbiAgICAgIGRhdGEucG9zaXRpb25fb2Zmc2V0ID0ge1xuICAgICAgICB4OiB0ZW1wMVZlY3RvcjMueCxcbiAgICAgICAgeTogdGVtcDFWZWN0b3IzLnksXG4gICAgICAgIHo6IHRlbXAxVmVjdG9yMy56XG4gICAgICB9O1xuXG4gICAgICBkYXRhLnJvdGF0aW9uID0ge1xuICAgICAgICB4OiB0ZW1wMVF1YXQueCxcbiAgICAgICAgeTogdGVtcDFRdWF0LnksXG4gICAgICAgIHo6IHRlbXAxUXVhdC56LFxuICAgICAgICB3OiB0ZW1wMVF1YXQud1xuICAgICAgfTtcblxuICAgICAgcGFyZW50LmNvbXBvbmVudC51c2UoJ3BoeXNpY3MnKS5kYXRhLmNoaWxkcmVuLnB1c2goZGF0YSk7XG4gICAgfVxuXG4gICAgYWRkT2JqZWN0Q2hpbGRyZW4ocGFyZW50LCBjaGlsZCk7XG4gIH1cbn07XG5cbmV4cG9ydCB7XG4gIGdldEV1bGVyWFlaRnJvbVF1YXRlcm5pb24sXG4gIGdldFF1YXRlcnRpb25Gcm9tRXVsZXIsXG4gIGNvbnZlcnRXb3JsZFBvc2l0aW9uVG9PYmplY3QsXG4gIGFkZE9iamVjdENoaWxkcmVuLFxuXG4gIE1FU1NBR0VfVFlQRVMsXG4gIFJFUE9SVF9JVEVNU0laRSxcbiAgQ09MTElTSU9OUkVQT1JUX0lURU1TSVpFLFxuICBWRUhJQ0xFUkVQT1JUX0lURU1TSVpFLFxuICBDT05TVFJBSU5UUkVQT1JUX0lURU1TSVpFLFxuXG4gIHRlbXAxVmVjdG9yMyxcbiAgdGVtcDJWZWN0b3IzLFxuICB0ZW1wMU1hdHJpeDQsXG4gIHRlbXAxUXVhdFxufTtcbiIsImV4cG9ydCBjbGFzcyBFdmVudGFibGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9ldmVudExpc3RlbmVycyA9IHt9O1xuICB9XG5cbiAgYWRkRXZlbnRMaXN0ZW5lcihldmVudF9uYW1lLCBjYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5fZXZlbnRMaXN0ZW5lcnMuaGFzT3duUHJvcGVydHkoZXZlbnRfbmFtZSkpXG4gICAgICB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF9uYW1lXSA9IFtdO1xuXG4gICAgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnRfbmFtZV0ucHVzaChjYWxsYmFjayk7XG4gIH1cblxuICByZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50X25hbWUsIGNhbGxiYWNrKSB7XG4gICAgbGV0IGluZGV4O1xuXG4gICAgaWYgKCF0aGlzLl9ldmVudExpc3RlbmVycy5oYXNPd25Qcm9wZXJ0eShldmVudF9uYW1lKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKChpbmRleCA9IHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50X25hbWVdLmluZGV4T2YoY2FsbGJhY2spKSA+PSAwKSB7XG4gICAgICB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF9uYW1lXS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZGlzcGF0Y2hFdmVudChldmVudF9uYW1lKSB7XG4gICAgbGV0IGk7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuXG4gICAgaWYgKHRoaXMuX2V2ZW50TGlzdGVuZXJzLmhhc093blByb3BlcnR5KGV2ZW50X25hbWUpKSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnRfbmFtZV0ubGVuZ3RoOyBpKyspXG4gICAgICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50X25hbWVdW2ldLmFwcGx5KHRoaXMsIHBhcmFtZXRlcnMpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBtYWtlKG9iaikge1xuICAgIG9iai5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lciA9IEV2ZW50YWJsZS5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lcjtcbiAgICBvYmoucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBFdmVudGFibGUucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI7XG4gICAgb2JqLnByb3RvdHlwZS5kaXNwYXRjaEV2ZW50ID0gRXZlbnRhYmxlLnByb3RvdHlwZS5kaXNwYXRjaEV2ZW50O1xuICB9XG59XG4iLCJpbXBvcnQgeyBjb252ZXJ0V29ybGRQb3NpdGlvblRvT2JqZWN0IH0gZnJvbSAnLi4vYXBpJztcbmltcG9ydCB7IEV1bGVyLCBNYXRyaXg0LCBRdWF0ZXJuaW9uLCBWZWN0b3IzIH0gZnJvbSAndGhyZWUnO1xuXG5leHBvcnQgY2xhc3MgQ29uZVR3aXN0Q29uc3RyYWludCB7XG4gIGNvbnN0cnVjdG9yKG9iamEsIG9iamIsIHBvc2l0aW9uKSB7XG4gICAgY29uc3Qgb2JqZWN0YSA9IG9iamE7XG4gICAgY29uc3Qgb2JqZWN0YiA9IG9iamE7XG5cbiAgICBpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCkgY29uc29sZS5lcnJvcignQm90aCBvYmplY3RzIG11c3QgYmUgZGVmaW5lZCBpbiBhIENvbmVUd2lzdENvbnN0cmFpbnQuJyk7XG5cbiAgICB0aGlzLnR5cGUgPSAnY29uZXR3aXN0JztcbiAgICB0aGlzLmFwcGxpZWRJbXB1bHNlID0gMDtcbiAgICB0aGlzLndvcmxkTW9kdWxlID0gbnVsbDsgLy8gV2lsbCBiZSByZWRlZmluZWQgYnkgLmFkZENvbnN0cmFpbnRcbiAgICB0aGlzLm9iamVjdGEgPSBvYmplY3RhLnVzZSgncGh5c2ljcycpLmRhdGEuaWQ7XG4gICAgdGhpcy5wb3NpdGlvbmEgPSBjb252ZXJ0V29ybGRQb3NpdGlvblRvT2JqZWN0KHBvc2l0aW9uLCBvYmplY3RhKS5jbG9uZSgpO1xuICAgIHRoaXMub2JqZWN0YiA9IG9iamVjdGIudXNlKCdwaHlzaWNzJykuZGF0YS5pZDtcbiAgICB0aGlzLnBvc2l0aW9uYiA9IGNvbnZlcnRXb3JsZFBvc2l0aW9uVG9PYmplY3QocG9zaXRpb24sIG9iamVjdGIpLmNsb25lKCk7XG4gICAgdGhpcy5heGlzYSA9IHt4OiBvYmplY3RhLnJvdGF0aW9uLngsIHk6IG9iamVjdGEucm90YXRpb24ueSwgejogb2JqZWN0YS5yb3RhdGlvbi56fTtcbiAgICB0aGlzLmF4aXNiID0ge3g6IG9iamVjdGIucm90YXRpb24ueCwgeTogb2JqZWN0Yi5yb3RhdGlvbi55LCB6OiBvYmplY3RiLnJvdGF0aW9uLnp9O1xuICB9XG5cbiAgZ2V0RGVmaW5pdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBvYmplY3RhOiB0aGlzLm9iamVjdGEsXG4gICAgICBvYmplY3RiOiB0aGlzLm9iamVjdGIsXG4gICAgICBwb3NpdGlvbmE6IHRoaXMucG9zaXRpb25hLFxuICAgICAgcG9zaXRpb25iOiB0aGlzLnBvc2l0aW9uYixcbiAgICAgIGF4aXNhOiB0aGlzLmF4aXNhLFxuICAgICAgYXhpc2I6IHRoaXMuYXhpc2JcbiAgICB9O1xuICB9XG5cbiAgc2V0TGltaXQoeCwgeSwgeikge1xuICAgIGlmKHRoaXMud29ybGRNb2R1bGUpIHRoaXMud29ybGRNb2R1bGUuZXhlY3V0ZSgnY29uZXR3aXN0X3NldExpbWl0Jywge2NvbnN0cmFpbnQ6IHRoaXMuaWQsIHgsIHksIHp9KTtcbiAgfVxuXG4gIGVuYWJsZU1vdG9yKCkge1xuICAgIGlmKHRoaXMud29ybGRNb2R1bGUpIHRoaXMud29ybGRNb2R1bGUuZXhlY3V0ZSgnY29uZXR3aXN0X2VuYWJsZU1vdG9yJywge2NvbnN0cmFpbnQ6IHRoaXMuaWR9KTtcbiAgfVxuXG4gIHNldE1heE1vdG9ySW1wdWxzZShtYXhfaW1wdWxzZSkge1xuICAgIGlmKHRoaXMud29ybGRNb2R1bGUpIHRoaXMud29ybGRNb2R1bGUuZXhlY3V0ZSgnY29uZXR3aXN0X3NldE1heE1vdG9ySW1wdWxzZScsIHtjb25zdHJhaW50OiB0aGlzLmlkLCBtYXhfaW1wdWxzZX0pO1xuICB9XG5cbiAgc2V0TW90b3JUYXJnZXQodGFyZ2V0KSB7XG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFZlY3RvcjMpXG4gICAgICB0YXJnZXQgPSBuZXcgUXVhdGVybmlvbigpLnNldEZyb21FdWxlcihuZXcgRXVsZXIodGFyZ2V0LngsIHRhcmdldC55LCB0YXJnZXQueikpO1xuICAgIGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEV1bGVyKVxuICAgICAgdGFyZ2V0ID0gbmV3IFF1YXRlcm5pb24oKS5zZXRGcm9tRXVsZXIodGFyZ2V0KTtcbiAgICBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBNYXRyaXg0KVxuICAgICAgdGFyZ2V0ID0gbmV3IFF1YXRlcm5pb24oKS5zZXRGcm9tUm90YXRpb25NYXRyaXgodGFyZ2V0KTtcblxuICAgIGlmKHRoaXMud29ybGRNb2R1bGUpIHRoaXMud29ybGRNb2R1bGUuZXhlY3V0ZSgnY29uZXR3aXN0X3NldE1vdG9yVGFyZ2V0Jywge1xuICAgICAgY29uc3RyYWludDogdGhpcy5pZCxcbiAgICAgIHg6IHRhcmdldC54LFxuICAgICAgeTogdGFyZ2V0LnksXG4gICAgICB6OiB0YXJnZXQueixcbiAgICAgIHc6IHRhcmdldC53XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7Y29udmVydFdvcmxkUG9zaXRpb25Ub09iamVjdH0gZnJvbSAnLi4vYXBpJztcblxuZXhwb3J0IGNsYXNzIEhpbmdlQ29uc3RyYWludCB7XG4gIGNvbnN0cnVjdG9yKG9iamEsIG9iamIsIHBvc2l0aW9uLCBheGlzKSB7XG4gICAgY29uc3Qgb2JqZWN0YSA9IG9iamE7XG4gICAgbGV0IG9iamVjdGIgPSBvYmpiO1xuXG4gICAgaWYgKGF4aXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYXhpcyA9IHBvc2l0aW9uO1xuICAgICAgcG9zaXRpb24gPSBvYmplY3RiO1xuICAgICAgb2JqZWN0YiA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB0aGlzLnR5cGUgPSAnaGluZ2UnO1xuICAgIHRoaXMuYXBwbGllZEltcHVsc2UgPSAwO1xuICAgIHRoaXMud29ybGRNb2R1bGUgPSBudWxsOyAvLyBXaWxsIGJlIHJlZGVmaW5lZCBieSAuYWRkQ29uc3RyYWludFxuICAgIHRoaXMub2JqZWN0YSA9IG9iamVjdGEudXNlKCdwaHlzaWNzJykuZGF0YS5pZDtcbiAgICB0aGlzLnBvc2l0aW9uYSA9IGNvbnZlcnRXb3JsZFBvc2l0aW9uVG9PYmplY3QocG9zaXRpb24sIG9iamVjdGEpLmNsb25lKCk7XG4gICAgdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uLmNsb25lKCk7XG4gICAgdGhpcy5heGlzID0gYXhpcztcblxuICAgIGlmIChvYmplY3RiKSB7XG4gICAgICB0aGlzLm9iamVjdGIgPSBvYmplY3RiLnVzZSgncGh5c2ljcycpLmRhdGEuaWQ7XG4gICAgICB0aGlzLnBvc2l0aW9uYiA9IGNvbnZlcnRXb3JsZFBvc2l0aW9uVG9PYmplY3QocG9zaXRpb24sIG9iamVjdGIpLmNsb25lKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RGVmaW5pdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBvYmplY3RhOiB0aGlzLm9iamVjdGEsXG4gICAgICBvYmplY3RiOiB0aGlzLm9iamVjdGIsXG4gICAgICBwb3NpdGlvbmE6IHRoaXMucG9zaXRpb25hLFxuICAgICAgcG9zaXRpb25iOiB0aGlzLnBvc2l0aW9uYixcbiAgICAgIGF4aXM6IHRoaXMuYXhpc1xuICAgIH07XG4gIH1cblxuICBzZXRMaW1pdHMobG93LCBoaWdoLCBiaWFzX2ZhY3RvciwgcmVsYXhhdGlvbl9mYWN0b3IpIHtcbiAgICBpZiAodGhpcy53b3JsZE1vZHVsZSkgdGhpcy53b3JsZE1vZHVsZS5leGVjdXRlKCdoaW5nZV9zZXRMaW1pdHMnLCB7XG4gICAgICBjb25zdHJhaW50OiB0aGlzLmlkLFxuICAgICAgbG93LFxuICAgICAgaGlnaCxcbiAgICAgIGJpYXNfZmFjdG9yLFxuICAgICAgcmVsYXhhdGlvbl9mYWN0b3JcbiAgICB9KTtcbiAgfVxuXG4gIGVuYWJsZUFuZ3VsYXJNb3Rvcih2ZWxvY2l0eSwgYWNjZWxlcmF0aW9uKSB7XG4gICAgaWYgKHRoaXMud29ybGRNb2R1bGUpIHRoaXMud29ybGRNb2R1bGUuZXhlY3V0ZSgnaGluZ2VfZW5hYmxlQW5ndWxhck1vdG9yJywge1xuICAgICAgY29uc3RyYWludDogdGhpcy5pZCxcbiAgICAgIHZlbG9jaXR5LFxuICAgICAgYWNjZWxlcmF0aW9uXG4gICAgfSk7XG4gIH1cblxuICBkaXNhYmxlTW90b3IoKSB7XG4gICAgaWYgKHRoaXMud29ybGRNb2R1bGUpIHRoaXMud29ybGRNb2R1bGUuZXhlY3V0ZSgnaGluZ2VfZGlzYWJsZU1vdG9yJywge2NvbnN0cmFpbnQ6IHRoaXMuaWR9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHtjb252ZXJ0V29ybGRQb3NpdGlvblRvT2JqZWN0fSBmcm9tICcuLi9hcGknO1xuXG5leHBvcnQgY2xhc3MgUG9pbnRDb25zdHJhaW50IHtcbiAgY29uc3RydWN0b3Iob2JqYSwgb2JqYiwgcG9zaXRpb24pIHtcbiAgICBjb25zdCBvYmplY3RhID0gb2JqYTtcbiAgICBsZXQgb2JqZWN0YiA9IG9iamI7XG5cbiAgICBpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcG9zaXRpb24gPSBvYmplY3RiO1xuICAgICAgb2JqZWN0YiA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB0aGlzLnR5cGUgPSAncG9pbnQnO1xuICAgIHRoaXMuYXBwbGllZEltcHVsc2UgPSAwO1xuICAgIHRoaXMub2JqZWN0YSA9IG9iamVjdGEudXNlKCdwaHlzaWNzJykuZGF0YS5pZDtcbiAgICB0aGlzLnBvc2l0aW9uYSA9IGNvbnZlcnRXb3JsZFBvc2l0aW9uVG9PYmplY3QocG9zaXRpb24sIG9iamVjdGEpLmNsb25lKCk7XG5cbiAgICBpZiAob2JqZWN0Yikge1xuICAgICAgdGhpcy5vYmplY3RiID0gb2JqZWN0Yi51c2UoJ3BoeXNpY3MnKS5kYXRhLmlkO1xuICAgICAgdGhpcy5wb3NpdGlvbmIgPSBjb252ZXJ0V29ybGRQb3NpdGlvblRvT2JqZWN0KHBvc2l0aW9uLCBvYmplY3RiKS5jbG9uZSgpO1xuICAgIH1cbiAgfVxuXG4gIGdldERlZmluaXRpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgb2JqZWN0YTogdGhpcy5vYmplY3RhLFxuICAgICAgb2JqZWN0YjogdGhpcy5vYmplY3RiLFxuICAgICAgcG9zaXRpb25hOiB0aGlzLnBvc2l0aW9uYSxcbiAgICAgIHBvc2l0aW9uYjogdGhpcy5wb3NpdGlvbmJcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQge2NvbnZlcnRXb3JsZFBvc2l0aW9uVG9PYmplY3R9IGZyb20gJy4uL2FwaSc7XG5cbmV4cG9ydCBjbGFzcyBTbGlkZXJDb25zdHJhaW50IHtcbiAgY29uc3RydWN0b3Iob2JqYSwgb2JqYiwgcG9zaXRpb24sIGF4aXMpIHtcbiAgICBjb25zdCBvYmplY3RhID0gb2JqYTtcbiAgICBsZXQgb2JqZWN0YiA9IG9iamI7XG5cbiAgICBpZiAoYXhpcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBheGlzID0gcG9zaXRpb247XG4gICAgICBwb3NpdGlvbiA9IG9iamVjdGI7XG4gICAgICBvYmplY3RiID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRoaXMudHlwZSA9ICdzbGlkZXInO1xuICAgIHRoaXMuYXBwbGllZEltcHVsc2UgPSAwO1xuICAgIHRoaXMud29ybGRNb2R1bGUgPSBudWxsOyAvLyBXaWxsIGJlIHJlZGVmaW5lZCBieSAuYWRkQ29uc3RyYWludFxuICAgIHRoaXMub2JqZWN0YSA9IG9iamVjdGEudXNlKCdwaHlzaWNzJykuZGF0YS5pZDtcbiAgICB0aGlzLnBvc2l0aW9uYSA9IGNvbnZlcnRXb3JsZFBvc2l0aW9uVG9PYmplY3QocG9zaXRpb24sIG9iamVjdGEpLmNsb25lKCk7XG4gICAgdGhpcy5heGlzID0gYXhpcztcblxuICAgIGlmIChvYmplY3RiKSB7XG4gICAgICB0aGlzLm9iamVjdGIgPSBvYmplY3RiLnVzZSgncGh5c2ljcycpLmRhdGEuaWQ7XG4gICAgICB0aGlzLnBvc2l0aW9uYiA9IGNvbnZlcnRXb3JsZFBvc2l0aW9uVG9PYmplY3QocG9zaXRpb24sIG9iamVjdGIpLmNsb25lKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RGVmaW5pdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBvYmplY3RhOiB0aGlzLm9iamVjdGEsXG4gICAgICBvYmplY3RiOiB0aGlzLm9iamVjdGIsXG4gICAgICBwb3NpdGlvbmE6IHRoaXMucG9zaXRpb25hLFxuICAgICAgcG9zaXRpb25iOiB0aGlzLnBvc2l0aW9uYixcbiAgICAgIGF4aXM6IHRoaXMuYXhpc1xuICAgIH07XG4gIH1cblxuICBzZXRMaW1pdHMobGluX2xvd2VyLCBsaW5fdXBwZXIsIGFuZ19sb3dlciwgYW5nX3VwcGVyKSB7XG4gICAgaWYgKHRoaXMud29ybGRNb2R1bGUpIHRoaXMud29ybGRNb2R1bGUuZXhlY3V0ZSgnc2xpZGVyX3NldExpbWl0cycsIHtcbiAgICAgIGNvbnN0cmFpbnQ6IHRoaXMuaWQsXG4gICAgICBsaW5fbG93ZXIsXG4gICAgICBsaW5fdXBwZXIsXG4gICAgICBhbmdfbG93ZXIsXG4gICAgICBhbmdfdXBwZXJcbiAgICB9KTtcbiAgfVxuXG4gIHNldFJlc3RpdHV0aW9uKGxpbmVhciwgYW5ndWxhcikge1xuICAgIGlmICh0aGlzLndvcmxkTW9kdWxlKSB0aGlzLndvcmxkTW9kdWxlLmV4ZWN1dGUoXG4gICAgICAnc2xpZGVyX3NldFJlc3RpdHV0aW9uJyxcbiAgICAgIHtcbiAgICAgICAgY29uc3RyYWludDogdGhpcy5pZCxcbiAgICAgICAgbGluZWFyLFxuICAgICAgICBhbmd1bGFyXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGVuYWJsZUxpbmVhck1vdG9yKHZlbG9jaXR5LCBhY2NlbGVyYXRpb24pIHtcbiAgICBpZiAodGhpcy53b3JsZE1vZHVsZSkgdGhpcy53b3JsZE1vZHVsZS5leGVjdXRlKCdzbGlkZXJfZW5hYmxlTGluZWFyTW90b3InLCB7XG4gICAgICBjb25zdHJhaW50OiB0aGlzLmlkLFxuICAgICAgdmVsb2NpdHksXG4gICAgICBhY2NlbGVyYXRpb25cbiAgICB9KTtcbiAgfVxuXG4gIGRpc2FibGVMaW5lYXJNb3RvcigpIHtcbiAgICBpZiAodGhpcy53b3JsZE1vZHVsZSkgdGhpcy53b3JsZE1vZHVsZS5leGVjdXRlKCdzbGlkZXJfZGlzYWJsZUxpbmVhck1vdG9yJywge2NvbnN0cmFpbnQ6IHRoaXMuaWR9KTtcbiAgfVxuXG4gIGVuYWJsZUFuZ3VsYXJNb3Rvcih2ZWxvY2l0eSwgYWNjZWxlcmF0aW9uKSB7XG4gICAgdGhpcy5zY2VuZS5leGVjdXRlKCdzbGlkZXJfZW5hYmxlQW5ndWxhck1vdG9yJywge1xuICAgICAgY29uc3RyYWludDogdGhpcy5pZCxcbiAgICAgIHZlbG9jaXR5LFxuICAgICAgYWNjZWxlcmF0aW9uXG4gICAgfSk7XG4gIH1cblxuICBkaXNhYmxlQW5ndWxhck1vdG9yKCkge1xuICAgIGlmICh0aGlzLndvcmxkTW9kdWxlKSB0aGlzLndvcmxkTW9kdWxlLmV4ZWN1dGUoJ3NsaWRlcl9kaXNhYmxlQW5ndWxhck1vdG9yJywge2NvbnN0cmFpbnQ6IHRoaXMuaWR9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHtjb252ZXJ0V29ybGRQb3NpdGlvblRvT2JqZWN0fSBmcm9tICcuLi9hcGknO1xuXG5leHBvcnQgY2xhc3MgRE9GQ29uc3RyYWludCB7XG4gIGNvbnN0cnVjdG9yKG9iamEsIG9iamIsIHBvc2l0aW9uKSB7XG4gICAgY29uc3Qgb2JqZWN0YSA9IG9iamE7XG4gICAgbGV0IG9iamVjdGIgPSBvYmpiO1xuXG4gICAgaWYgKCBwb3NpdGlvbiA9PT0gdW5kZWZpbmVkICkge1xuICAgICAgcG9zaXRpb24gPSBvYmplY3RiO1xuICAgICAgb2JqZWN0YiA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB0aGlzLnR5cGUgPSAnZG9mJztcbiAgICB0aGlzLmFwcGxpZWRJbXB1bHNlID0gMDtcbiAgICB0aGlzLndvcmxkTW9kdWxlID0gbnVsbDsgLy8gV2lsbCBiZSByZWRlZmluZWQgYnkgLmFkZENvbnN0cmFpbnRcbiAgICB0aGlzLm9iamVjdGEgPSBvYmplY3RhLnVzZSgncGh5c2ljcycpLmRhdGEuaWQ7XG4gICAgdGhpcy5wb3NpdGlvbmEgPSBjb252ZXJ0V29ybGRQb3NpdGlvblRvT2JqZWN0KCBwb3NpdGlvbiwgb2JqZWN0YSApLmNsb25lKCk7XG4gICAgdGhpcy5heGlzYSA9IHsgeDogb2JqZWN0YS5yb3RhdGlvbi54LCB5OiBvYmplY3RhLnJvdGF0aW9uLnksIHo6IG9iamVjdGEucm90YXRpb24ueiB9O1xuXG4gICAgaWYgKCBvYmplY3RiICkge1xuICAgICAgdGhpcy5vYmplY3RiID0gb2JqZWN0Yi51c2UoJ3BoeXNpY3MnKS5kYXRhLmlkO1xuICAgICAgdGhpcy5wb3NpdGlvbmIgPSBjb252ZXJ0V29ybGRQb3NpdGlvblRvT2JqZWN0KCBwb3NpdGlvbiwgb2JqZWN0YiApLmNsb25lKCk7XG4gICAgICB0aGlzLmF4aXNiID0geyB4OiBvYmplY3RiLnJvdGF0aW9uLngsIHk6IG9iamVjdGIucm90YXRpb24ueSwgejogb2JqZWN0Yi5yb3RhdGlvbi56IH07XG4gICAgfVxuICB9XG5cbiAgZ2V0RGVmaW5pdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBvYmplY3RhOiB0aGlzLm9iamVjdGEsXG4gICAgICBvYmplY3RiOiB0aGlzLm9iamVjdGIsXG4gICAgICBwb3NpdGlvbmE6IHRoaXMucG9zaXRpb25hLFxuICAgICAgcG9zaXRpb25iOiB0aGlzLnBvc2l0aW9uYixcbiAgICAgIGF4aXNhOiB0aGlzLmF4aXNhLFxuICAgICAgYXhpc2I6IHRoaXMuYXhpc2JcbiAgICB9O1xuICB9XG5cbiAgc2V0TGluZWFyTG93ZXJMaW1pdChsaW1pdCkge1xuICAgIGlmICh0aGlzLndvcmxkTW9kdWxlKSB0aGlzLndvcmxkTW9kdWxlLmV4ZWN1dGUoICdkb2Zfc2V0TGluZWFyTG93ZXJMaW1pdCcsIHsgY29uc3RyYWludDogdGhpcy5pZCwgeDogbGltaXQueCwgeTogbGltaXQueSwgejogbGltaXQueiB9ICk7XG4gIH1cblxuICBzZXRMaW5lYXJVcHBlckxpbWl0IChsaW1pdCkge1xuICAgIGlmICh0aGlzLndvcmxkTW9kdWxlKSB0aGlzLndvcmxkTW9kdWxlLmV4ZWN1dGUoICdkb2Zfc2V0TGluZWFyVXBwZXJMaW1pdCcsIHsgY29uc3RyYWludDogdGhpcy5pZCwgeDogbGltaXQueCwgeTogbGltaXQueSwgejogbGltaXQueiB9ICk7XG4gIH1cblxuICBzZXRBbmd1bGFyTG93ZXJMaW1pdCAobGltaXQpIHtcbiAgICBpZiAodGhpcy53b3JsZE1vZHVsZSkgdGhpcy53b3JsZE1vZHVsZS5leGVjdXRlKCAnZG9mX3NldEFuZ3VsYXJMb3dlckxpbWl0JywgeyBjb25zdHJhaW50OiB0aGlzLmlkLCB4OiBsaW1pdC54LCB5OiBsaW1pdC55LCB6OiBsaW1pdC56IH0gKTtcbiAgfVxuXG4gIHNldEFuZ3VsYXJVcHBlckxpbWl0IChsaW1pdCkge1xuICAgIGlmICh0aGlzLndvcmxkTW9kdWxlKSB0aGlzLndvcmxkTW9kdWxlLmV4ZWN1dGUoICdkb2Zfc2V0QW5ndWxhclVwcGVyTGltaXQnLCB7IGNvbnN0cmFpbnQ6IHRoaXMuaWQsIHg6IGxpbWl0LngsIHk6IGxpbWl0LnksIHo6IGxpbWl0LnogfSApO1xuICB9XG5cbiAgZW5hYmxlQW5ndWxhck1vdG9yICh3aGljaCkge1xuICAgIGlmICh0aGlzLndvcmxkTW9kdWxlKSB0aGlzLndvcmxkTW9kdWxlLmV4ZWN1dGUoICdkb2ZfZW5hYmxlQW5ndWxhck1vdG9yJywgeyBjb25zdHJhaW50OiB0aGlzLmlkLCB3aGljaDogd2hpY2ggfSApO1xuICB9XG5cbiAgY29uZmlndXJlQW5ndWxhck1vdG9yICh3aGljaCwgbG93X2FuZ2xlLCBoaWdoX2FuZ2xlLCB2ZWxvY2l0eSwgbWF4X2ZvcmNlICkge1xuICAgIGlmICh0aGlzLndvcmxkTW9kdWxlKSB0aGlzLndvcmxkTW9kdWxlLmV4ZWN1dGUoICdkb2ZfY29uZmlndXJlQW5ndWxhck1vdG9yJywgeyBjb25zdHJhaW50OiB0aGlzLmlkLCB3aGljaDogd2hpY2gsIGxvd19hbmdsZTogbG93X2FuZ2xlLCBoaWdoX2FuZ2xlOiBoaWdoX2FuZ2xlLCB2ZWxvY2l0eTogdmVsb2NpdHksIG1heF9mb3JjZTogbWF4X2ZvcmNlIH0gKTtcbiAgfVxuXG4gIGRpc2FibGVBbmd1bGFyTW90b3IgKHdoaWNoKSB7XG4gICAgaWYgKHRoaXMud29ybGRNb2R1bGUpIHRoaXMud29ybGRNb2R1bGUuZXhlY3V0ZSggJ2RvZl9kaXNhYmxlQW5ndWxhck1vdG9yJywgeyBjb25zdHJhaW50OiB0aGlzLmlkLCB3aGljaDogd2hpY2ggfSApO1xuICB9XG59XG4iLCJpbXBvcnQge01lc2h9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7VmVoaWNsZVR1bm5pbmd9IGZyb20gJy4vdHVubmluZyc7XG5cbmV4cG9ydCBjbGFzcyBWZWhpY2xlIHtcbiAgY29uc3RydWN0b3IobWVzaCwgdHVuaW5nID0gbmV3IFZlaGljbGVUdW5pbmcoKSkge1xuICAgIHRoaXMubWVzaCA9IG1lc2g7XG4gICAgdGhpcy53aGVlbHMgPSBbXTtcblxuICAgIHRoaXMuX3BoeXNpanMgPSB7XG4gICAgICBpZDogZ2V0T2JqZWN0SWQoKSxcbiAgICAgIHJpZ2lkQm9keTogbWVzaC5fcGh5c2lqcy5pZCxcbiAgICAgIHN1c3BlbnNpb25fc3RpZmZuZXNzOiB0dW5pbmcuc3VzcGVuc2lvbl9zdGlmZm5lc3MsXG4gICAgICBzdXNwZW5zaW9uX2NvbXByZXNzaW9uOiB0dW5pbmcuc3VzcGVuc2lvbl9jb21wcmVzc2lvbixcbiAgICAgIHN1c3BlbnNpb25fZGFtcGluZzogdHVuaW5nLnN1c3BlbnNpb25fZGFtcGluZyxcbiAgICAgIG1heF9zdXNwZW5zaW9uX3RyYXZlbDogdHVuaW5nLm1heF9zdXNwZW5zaW9uX3RyYXZlbCxcbiAgICAgIGZyaWN0aW9uX3NsaXA6IHR1bmluZy5mcmljdGlvbl9zbGlwLFxuICAgICAgbWF4X3N1c3BlbnNpb25fZm9yY2U6IHR1bmluZy5tYXhfc3VzcGVuc2lvbl9mb3JjZVxuICAgIH07XG4gIH1cblxuICBhZGRXaGVlbCh3aGVlbF9nZW9tZXRyeSwgd2hlZWxfbWF0ZXJpYWwsIGNvbm5lY3Rpb25fcG9pbnQsIHdoZWVsX2RpcmVjdGlvbiwgd2hlZWxfYXhsZSwgc3VzcGVuc2lvbl9yZXN0X2xlbmd0aCwgd2hlZWxfcmFkaXVzLCBpc19mcm9udF93aGVlbCwgdHVuaW5nKSB7XG4gICAgY29uc3Qgd2hlZWwgPSBuZXcgTWVzaCh3aGVlbF9nZW9tZXRyeSwgd2hlZWxfbWF0ZXJpYWwpO1xuXG4gICAgd2hlZWwuY2FzdFNoYWRvdyA9IHdoZWVsLnJlY2VpdmVTaGFkb3cgPSB0cnVlO1xuICAgIHdoZWVsLnBvc2l0aW9uLmNvcHkod2hlZWxfZGlyZWN0aW9uKS5tdWx0aXBseVNjYWxhcihzdXNwZW5zaW9uX3Jlc3RfbGVuZ3RoIC8gMTAwKS5hZGQoY29ubmVjdGlvbl9wb2ludCk7XG5cbiAgICB0aGlzLndvcmxkLmFkZCh3aGVlbCk7XG4gICAgdGhpcy53aGVlbHMucHVzaCh3aGVlbCk7XG5cbiAgICB0aGlzLndvcmxkLmV4ZWN1dGUoJ2FkZFdoZWVsJywge1xuICAgICAgaWQ6IHRoaXMuX3BoeXNpanMuaWQsXG4gICAgICBjb25uZWN0aW9uX3BvaW50OiB7eDogY29ubmVjdGlvbl9wb2ludC54LCB5OiBjb25uZWN0aW9uX3BvaW50LnksIHo6IGNvbm5lY3Rpb25fcG9pbnQuen0sXG4gICAgICB3aGVlbF9kaXJlY3Rpb246IHt4OiB3aGVlbF9kaXJlY3Rpb24ueCwgeTogd2hlZWxfZGlyZWN0aW9uLnksIHo6IHdoZWVsX2RpcmVjdGlvbi56fSxcbiAgICAgIHdoZWVsX2F4bGU6IHt4OiB3aGVlbF9heGxlLngsIHk6IHdoZWVsX2F4bGUueSwgejogd2hlZWxfYXhsZS56fSxcbiAgICAgIHN1c3BlbnNpb25fcmVzdF9sZW5ndGgsXG4gICAgICB3aGVlbF9yYWRpdXMsXG4gICAgICBpc19mcm9udF93aGVlbCxcbiAgICAgIHR1bmluZ1xuICAgIH0pO1xuICB9XG5cbiAgc2V0U3RlZXJpbmcoYW1vdW50LCB3aGVlbCkge1xuICAgIGlmICh3aGVlbCAhPT0gdW5kZWZpbmVkICYmIHRoaXMud2hlZWxzW3doZWVsXSAhPT0gdW5kZWZpbmVkKVxuICAgICAgdGhpcy53b3JsZC5leGVjdXRlKCdzZXRTdGVlcmluZycsIHtpZDogdGhpcy5fcGh5c2lqcy5pZCwgd2hlZWwsIHN0ZWVyaW5nOiBhbW91bnR9KTtcbiAgICBlbHNlIGlmICh0aGlzLndoZWVscy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMud2hlZWxzLmxlbmd0aDsgaSsrKVxuICAgICAgICB0aGlzLndvcmxkLmV4ZWN1dGUoJ3NldFN0ZWVyaW5nJywge2lkOiB0aGlzLl9waHlzaWpzLmlkLCB3aGVlbDogaSwgc3RlZXJpbmc6IGFtb3VudH0pO1xuICAgIH1cbiAgfVxuXG4gIHNldEJyYWtlKGFtb3VudCwgd2hlZWwpIHtcbiAgICBpZiAod2hlZWwgIT09IHVuZGVmaW5lZCAmJiB0aGlzLndoZWVsc1t3aGVlbF0gIT09IHVuZGVmaW5lZClcbiAgICAgIHRoaXMud29ybGQuZXhlY3V0ZSgnc2V0QnJha2UnLCB7aWQ6IHRoaXMuX3BoeXNpanMuaWQsIHdoZWVsLCBicmFrZTogYW1vdW50fSk7XG4gICAgZWxzZSBpZiAodGhpcy53aGVlbHMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLndoZWVscy5sZW5ndGg7IGkrKylcbiAgICAgICAgdGhpcy53b3JsZC5leGVjdXRlKCdzZXRCcmFrZScsIHtpZDogdGhpcy5fcGh5c2lqcy5pZCwgd2hlZWw6IGksIGJyYWtlOiBhbW91bnR9KTtcbiAgICB9XG4gIH1cblxuICBhcHBseUVuZ2luZUZvcmNlKGFtb3VudCwgd2hlZWwpIHtcbiAgICBpZiAod2hlZWwgIT09IHVuZGVmaW5lZCAmJiB0aGlzLndoZWVsc1t3aGVlbF0gIT09IHVuZGVmaW5lZClcbiAgICAgIHRoaXMud29ybGQuZXhlY3V0ZSgnYXBwbHlFbmdpbmVGb3JjZScsIHtpZDogdGhpcy5fcGh5c2lqcy5pZCwgd2hlZWwsIGZvcmNlOiBhbW91bnR9KTtcbiAgICBlbHNlIGlmICh0aGlzLndoZWVscy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMud2hlZWxzLmxlbmd0aDsgaSsrKVxuICAgICAgICB0aGlzLndvcmxkLmV4ZWN1dGUoJ2FwcGx5RW5naW5lRm9yY2UnLCB7aWQ6IHRoaXMuX3BoeXNpanMuaWQsIHdoZWVsOiBpLCBmb3JjZTogYW1vdW50fSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBTY2VuZSBhcyBTY2VuZU5hdGl2ZSxcbiAgTWVzaCxcbiAgU3BoZXJlR2VvbWV0cnksXG4gIE1lc2hOb3JtYWxNYXRlcmlhbCxcbiAgQm94R2VvbWV0cnksXG4gIFZlY3RvcjNcbn0gZnJvbSAndGhyZWUnO1xuXG5pbXBvcnQge0xvb3B9IGZyb20gJ3docyc7XG5cbmltcG9ydCB7VmVoaWNsZX0gZnJvbSAnLi4vLi4vdmVoaWNsZS92ZWhpY2xlJztcbmltcG9ydCB7RXZlbnRhYmxlfSBmcm9tICcuLi8uLi9ldmVudGFibGUnO1xuXG5pbXBvcnQge1xuICBhZGRPYmplY3RDaGlsZHJlbixcbiAgTUVTU0FHRV9UWVBFUyxcbiAgdGVtcDFWZWN0b3IzLFxuICB0ZW1wMU1hdHJpeDQsXG4gIFJFUE9SVF9JVEVNU0laRSxcbiAgQ09MTElTSU9OUkVQT1JUX0lURU1TSVpFLFxuICBWRUhJQ0xFUkVQT1JUX0lURU1TSVpFLFxuICBDT05TVFJBSU5UUkVQT1JUX0lURU1TSVpFXG59IGZyb20gJy4uLy4uL2FwaSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdvcmxkTW9kdWxlQmFzZSBleHRlbmRzIEV2ZW50YWJsZSB7XG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICBmaXhlZFRpbWVTdGVwOiAxLzYwLFxuICAgIHJhdGVMaW1pdDogdHJ1ZSxcbiAgICBhbW1vOiBcIlwiLFxuICAgIHNvZnRib2R5OiBmYWxzZSxcbiAgICBncmF2aXR5OiBuZXcgVmVjdG9yMygwLCAtMTAwLCAwKVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbihXb3JsZE1vZHVsZUJhc2UuZGVmYXVsdHMsIG9wdGlvbnMpO1xuXG4gICAgdGhpcy5vYmplY3RzID0ge307XG4gICAgdGhpcy52ZWhpY2xlcyA9IHt9O1xuICAgIHRoaXMuY29uc3RyYWludHMgPSB7fTtcbiAgICB0aGlzLmlzU2ltdWxhdGluZyA9IGZhbHNlO1xuXG4gICAgdGhpcy5nZXRPYmplY3RJZCA9ICgoKSA9PiB7XG4gICAgICBsZXQgaWQgPSAxO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGlkKys7XG4gICAgICB9O1xuICAgIH0pKCk7XG4gIH1cblxuICBzZXR1cCgpIHtcbiAgICB0aGlzLnJlY2VpdmUoZXZlbnQgPT4ge1xuICAgICAgbGV0IF90ZW1wLFxuICAgICAgICBkYXRhID0gZXZlbnQuZGF0YTtcblxuICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciAmJiBkYXRhLmJ5dGVMZW5ndGggIT09IDEpLy8gYnl0ZUxlbmd0aCA9PT0gMSBpcyB0aGUgd29ya2VyIG1ha2luZyBhIFNVUFBPUlRfVFJBTlNGRVJBQkxFIHRlc3RcbiAgICAgICAgZGF0YSA9IG5ldyBGbG9hdDMyQXJyYXkoZGF0YSk7XG5cbiAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5KSB7XG4gICAgICAgIC8vIHRyYW5zZmVyYWJsZSBvYmplY3RcbiAgICAgICAgc3dpdGNoIChkYXRhWzBdKSB7XG4gICAgICAgICAgY2FzZSBNRVNTQUdFX1RZUEVTLldPUkxEUkVQT1JUOlxuICAgICAgICAgICAgdGhpcy51cGRhdGVTY2VuZShkYXRhKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBNRVNTQUdFX1RZUEVTLlNPRlRSRVBPUlQ6XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNvZnRib2RpZXMoZGF0YSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgTUVTU0FHRV9UWVBFUy5DT0xMSVNJT05SRVBPUlQ6XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbGxpc2lvbnMoZGF0YSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgTUVTU0FHRV9UWVBFUy5WRUhJQ0xFUkVQT1JUOlxuICAgICAgICAgICAgdGhpcy51cGRhdGVWZWhpY2xlcyhkYXRhKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBNRVNTQUdFX1RZUEVTLkNPTlNUUkFJTlRSRVBPUlQ6XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbnN0cmFpbnRzKGRhdGEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkYXRhLmNtZCkge1xuICAgICAgICAvLyBub24tdHJhbnNmZXJhYmxlIG9iamVjdFxuICAgICAgICBzd2l0Y2ggKGRhdGEuY21kKSB7XG4gICAgICAgICAgY2FzZSAnb2JqZWN0UmVhZHknOlxuICAgICAgICAgICAgX3RlbXAgPSBkYXRhLnBhcmFtcztcbiAgICAgICAgICAgIGlmICh0aGlzLm9iamVjdHNbX3RlbXBdKSB0aGlzLm9iamVjdHNbX3RlbXBdLmRpc3BhdGNoRXZlbnQoJ3JlYWR5Jyk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ3dvcmxkUmVhZHknOlxuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdyZWFkeScpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdhbW1vTG9hZGVkJzpcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnbG9hZGVkJyk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlBoeXNpY3MgbG9hZGluZyB0aW1lOiBcIiArIChwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0KSArIFwibXNcIik7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ3ZlaGljbGUnOlxuICAgICAgICAgICAgd2luZG93LnRlc3QgPSBkYXRhO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gRG8gbm90aGluZywganVzdCBzaG93IHRoZSBtZXNzYWdlXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKGBSZWNlaXZlZDogJHtkYXRhLmNtZH1gKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZGlyKGRhdGEucGFyYW1zKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzd2l0Y2ggKGRhdGFbMF0pIHtcbiAgICAgICAgICBjYXNlIE1FU1NBR0VfVFlQRVMuV09STERSRVBPUlQ6XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNjZW5lKGRhdGEpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIE1FU1NBR0VfVFlQRVMuQ09MTElTSU9OUkVQT1JUOlxuICAgICAgICAgICAgdGhpcy51cGRhdGVDb2xsaXNpb25zKGRhdGEpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIE1FU1NBR0VfVFlQRVMuVkVISUNMRVJFUE9SVDpcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmVoaWNsZXMoZGF0YSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgTUVTU0FHRV9UWVBFUy5DT05TVFJBSU5UUkVQT1JUOlxuICAgICAgICAgICAgdGhpcy51cGRhdGVDb25zdHJhaW50cyhkYXRhKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZVNjZW5lKGluZm8pIHtcbiAgICBsZXQgaW5kZXggPSBpbmZvWzFdO1xuXG4gICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgIGNvbnN0IG9mZnNldCA9IDIgKyBpbmRleCAqIFJFUE9SVF9JVEVNU0laRTtcbiAgICAgIGNvbnN0IG9iamVjdCA9IHRoaXMub2JqZWN0c1tpbmZvW29mZnNldF1dO1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gb2JqZWN0LmNvbXBvbmVudDtcbiAgICAgIGNvbnN0IGRhdGEgPSBjb21wb25lbnQudXNlKCdwaHlzaWNzJykuZGF0YTtcblxuICAgICAgaWYgKG9iamVjdCA9PT0gbnVsbCkgY29udGludWU7XG5cbiAgICAgIGlmIChjb21wb25lbnQuX19kaXJ0eVBvc2l0aW9uID09PSBmYWxzZSkge1xuICAgICAgICBvYmplY3QucG9zaXRpb24uc2V0KFxuICAgICAgICAgIGluZm9bb2Zmc2V0ICsgMV0sXG4gICAgICAgICAgaW5mb1tvZmZzZXQgKyAyXSxcbiAgICAgICAgICBpbmZvW29mZnNldCArIDNdXG4gICAgICAgICk7XG5cbiAgICAgICAgY29tcG9uZW50Ll9fZGlydHlQb3NpdGlvbiA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29tcG9uZW50Ll9fZGlydHlSb3RhdGlvbiA9PT0gZmFsc2UpIHtcbiAgICAgICAgb2JqZWN0LnF1YXRlcm5pb24uc2V0KFxuICAgICAgICAgIGluZm9bb2Zmc2V0ICsgNF0sXG4gICAgICAgICAgaW5mb1tvZmZzZXQgKyA1XSxcbiAgICAgICAgICBpbmZvW29mZnNldCArIDZdLFxuICAgICAgICAgIGluZm9bb2Zmc2V0ICsgN11cbiAgICAgICAgKTtcblxuICAgICAgICBjb21wb25lbnQuX19kaXJ0eVJvdGF0aW9uID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGRhdGEubGluZWFyVmVsb2NpdHkuc2V0KFxuICAgICAgICBpbmZvW29mZnNldCArIDhdLFxuICAgICAgICBpbmZvW29mZnNldCArIDldLFxuICAgICAgICBpbmZvW29mZnNldCArIDEwXVxuICAgICAgKTtcblxuICAgICAgZGF0YS5hbmd1bGFyVmVsb2NpdHkuc2V0KFxuICAgICAgICBpbmZvW29mZnNldCArIDExXSxcbiAgICAgICAgaW5mb1tvZmZzZXQgKyAxMl0sXG4gICAgICAgIGluZm9bb2Zmc2V0ICsgMTNdXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLlNVUFBPUlRfVFJBTlNGRVJBQkxFKVxuICAgICAgdGhpcy5zZW5kKGluZm8uYnVmZmVyLCBbaW5mby5idWZmZXJdKTsgLy8gR2l2ZSB0aGUgdHlwZWQgYXJyYXkgYmFjayB0byB0aGUgd29ya2VyXG5cbiAgICB0aGlzLmlzU2ltdWxhdGluZyA9IGZhbHNlO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgndXBkYXRlJyk7XG4gIH1cblxuICB1cGRhdGVTb2Z0Ym9kaWVzKGluZm8pIHtcbiAgICBsZXQgaW5kZXggPSBpbmZvWzFdLFxuICAgICAgb2Zmc2V0ID0gMjtcblxuICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICBjb25zdCBzaXplID0gaW5mb1tvZmZzZXQgKyAxXTtcbiAgICAgIGNvbnN0IG9iamVjdCA9IHRoaXMub2JqZWN0c1tpbmZvW29mZnNldF1dO1xuXG4gICAgICBpZiAob2JqZWN0ID09PSBudWxsKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgZGF0YSA9IG9iamVjdC5jb21wb25lbnQudXNlKCdwaHlzaWNzJykuZGF0YTtcblxuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IG9iamVjdC5nZW9tZXRyeS5hdHRyaWJ1dGVzO1xuICAgICAgY29uc3Qgdm9sdW1lUG9zaXRpb25zID0gYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtcblxuICAgICAgY29uc3Qgb2Zmc2V0VmVydCA9IG9mZnNldCArIDI7XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKGRhdGEuaWQpO1xuICAgICAgaWYgKCFkYXRhLmlzU29mdEJvZHlSZXNldCkge1xuICAgICAgICBvYmplY3QucG9zaXRpb24uc2V0KDAsIDAsIDApO1xuICAgICAgICBvYmplY3QucXVhdGVybmlvbi5zZXQoMCwgMCwgMCwgMCk7XG5cbiAgICAgICAgZGF0YS5pc1NvZnRCb2R5UmVzZXQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YS50eXBlID09PSBcInNvZnRUcmltZXNoXCIpIHtcbiAgICAgICAgY29uc3Qgdm9sdW1lTm9ybWFscyA9IGF0dHJpYnV0ZXMubm9ybWFsLmFycmF5O1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgb2ZmcyA9IG9mZnNldFZlcnQgKyBpICogMTg7XG5cbiAgICAgICAgICBjb25zdCB4MSA9IGluZm9bb2Zmc107XG4gICAgICAgICAgY29uc3QgeTEgPSBpbmZvW29mZnMgKyAxXTtcbiAgICAgICAgICBjb25zdCB6MSA9IGluZm9bb2ZmcyArIDJdO1xuXG4gICAgICAgICAgY29uc3QgbngxID0gaW5mb1tvZmZzICsgM107XG4gICAgICAgICAgY29uc3QgbnkxID0gaW5mb1tvZmZzICsgNF07XG4gICAgICAgICAgY29uc3QgbnoxID0gaW5mb1tvZmZzICsgNV07XG5cbiAgICAgICAgICBjb25zdCB4MiA9IGluZm9bb2ZmcyArIDZdO1xuICAgICAgICAgIGNvbnN0IHkyID0gaW5mb1tvZmZzICsgN107XG4gICAgICAgICAgY29uc3QgejIgPSBpbmZvW29mZnMgKyA4XTtcblxuICAgICAgICAgIGNvbnN0IG54MiA9IGluZm9bb2ZmcyArIDldO1xuICAgICAgICAgIGNvbnN0IG55MiA9IGluZm9bb2ZmcyArIDEwXTtcbiAgICAgICAgICBjb25zdCBuejIgPSBpbmZvW29mZnMgKyAxMV07XG5cbiAgICAgICAgICBjb25zdCB4MyA9IGluZm9bb2ZmcyArIDEyXTtcbiAgICAgICAgICBjb25zdCB5MyA9IGluZm9bb2ZmcyArIDEzXTtcbiAgICAgICAgICBjb25zdCB6MyA9IGluZm9bb2ZmcyArIDE0XTtcblxuICAgICAgICAgIGNvbnN0IG54MyA9IGluZm9bb2ZmcyArIDE1XTtcbiAgICAgICAgICBjb25zdCBueTMgPSBpbmZvW29mZnMgKyAxNl07XG4gICAgICAgICAgY29uc3QgbnozID0gaW5mb1tvZmZzICsgMTddO1xuXG4gICAgICAgICAgY29uc3QgaTkgPSBpICogOTtcblxuICAgICAgICAgIHZvbHVtZVBvc2l0aW9uc1tpOV0gPSB4MTtcbiAgICAgICAgICB2b2x1bWVQb3NpdGlvbnNbaTkgKyAxXSA9IHkxO1xuICAgICAgICAgIHZvbHVtZVBvc2l0aW9uc1tpOSArIDJdID0gejE7XG5cbiAgICAgICAgICB2b2x1bWVQb3NpdGlvbnNbaTkgKyAzXSA9IHgyO1xuICAgICAgICAgIHZvbHVtZVBvc2l0aW9uc1tpOSArIDRdID0geTI7XG4gICAgICAgICAgdm9sdW1lUG9zaXRpb25zW2k5ICsgNV0gPSB6MjtcblxuICAgICAgICAgIHZvbHVtZVBvc2l0aW9uc1tpOSArIDZdID0geDM7XG4gICAgICAgICAgdm9sdW1lUG9zaXRpb25zW2k5ICsgN10gPSB5MztcbiAgICAgICAgICB2b2x1bWVQb3NpdGlvbnNbaTkgKyA4XSA9IHozO1xuXG4gICAgICAgICAgdm9sdW1lTm9ybWFsc1tpOV0gPSBueDE7XG4gICAgICAgICAgdm9sdW1lTm9ybWFsc1tpOSArIDFdID0gbnkxO1xuICAgICAgICAgIHZvbHVtZU5vcm1hbHNbaTkgKyAyXSA9IG56MTtcblxuICAgICAgICAgIHZvbHVtZU5vcm1hbHNbaTkgKyAzXSA9IG54MjtcbiAgICAgICAgICB2b2x1bWVOb3JtYWxzW2k5ICsgNF0gPSBueTI7XG4gICAgICAgICAgdm9sdW1lTm9ybWFsc1tpOSArIDVdID0gbnoyO1xuXG4gICAgICAgICAgdm9sdW1lTm9ybWFsc1tpOSArIDZdID0gbngzO1xuICAgICAgICAgIHZvbHVtZU5vcm1hbHNbaTkgKyA3XSA9IG55MztcbiAgICAgICAgICB2b2x1bWVOb3JtYWxzW2k5ICsgOF0gPSBuejM7XG4gICAgICAgIH1cblxuICAgICAgICBhdHRyaWJ1dGVzLm5vcm1hbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgICAgIG9mZnNldCArPSAyICsgc2l6ZSAqIDE4O1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoZGF0YS50eXBlID09PSBcInNvZnRSb3BlTWVzaFwiKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgb2ZmcyA9IG9mZnNldFZlcnQgKyBpICogMztcblxuICAgICAgICAgIGNvbnN0IHggPSBpbmZvW29mZnNdO1xuICAgICAgICAgIGNvbnN0IHkgPSBpbmZvW29mZnMgKyAxXTtcbiAgICAgICAgICBjb25zdCB6ID0gaW5mb1tvZmZzICsgMl07XG5cbiAgICAgICAgICB2b2x1bWVQb3NpdGlvbnNbaSAqIDNdID0geDtcbiAgICAgICAgICB2b2x1bWVQb3NpdGlvbnNbaSAqIDMgKyAxXSA9IHk7XG4gICAgICAgICAgdm9sdW1lUG9zaXRpb25zW2kgKiAzICsgMl0gPSB6O1xuICAgICAgICB9XG5cbiAgICAgICAgb2Zmc2V0ICs9IDIgKyBzaXplICogMztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHZvbHVtZU5vcm1hbHMgPSBhdHRyaWJ1dGVzLm5vcm1hbC5hcnJheTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgIGNvbnN0IG9mZnMgPSBvZmZzZXRWZXJ0ICsgaSAqIDY7XG5cbiAgICAgICAgICBjb25zdCB4ID0gaW5mb1tvZmZzXTtcbiAgICAgICAgICBjb25zdCB5ID0gaW5mb1tvZmZzICsgMV07XG4gICAgICAgICAgY29uc3QgeiA9IGluZm9bb2ZmcyArIDJdO1xuXG4gICAgICAgICAgY29uc3QgbnggPSBpbmZvW29mZnMgKyAzXTtcbiAgICAgICAgICBjb25zdCBueSA9IGluZm9bb2ZmcyArIDRdO1xuICAgICAgICAgIGNvbnN0IG56ID0gaW5mb1tvZmZzICsgNV07XG5cbiAgICAgICAgICB2b2x1bWVQb3NpdGlvbnNbaSAqIDNdID0geDtcbiAgICAgICAgICB2b2x1bWVQb3NpdGlvbnNbaSAqIDMgKyAxXSA9IHk7XG4gICAgICAgICAgdm9sdW1lUG9zaXRpb25zW2kgKiAzICsgMl0gPSB6O1xuXG4gICAgICAgICAgLy8gRklYTUU6IE5vcm1hbHMgYXJlIHBvaW50ZWQgdG8gbG9vayBpbnNpZGU7XG4gICAgICAgICAgdm9sdW1lTm9ybWFsc1tpICogM10gPSBueDtcbiAgICAgICAgICB2b2x1bWVOb3JtYWxzW2kgKiAzICsgMV0gPSBueTtcbiAgICAgICAgICB2b2x1bWVOb3JtYWxzW2kgKiAzICsgMl0gPSBuejtcbiAgICAgICAgfVxuXG4gICAgICAgIGF0dHJpYnV0ZXMubm9ybWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgb2Zmc2V0ICs9IDIgKyBzaXplICogNjtcbiAgICAgIH1cblxuICAgICAgYXR0cmlidXRlcy5wb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gaWYgKHRoaXMuU1VQUE9SVF9UUkFOU0ZFUkFCTEUpXG4gICAgLy8gICB0aGlzLnNlbmQoaW5mby5idWZmZXIsIFtpbmZvLmJ1ZmZlcl0pOyAvLyBHaXZlIHRoZSB0eXBlZCBhcnJheSBiYWNrIHRvIHRoZSB3b3JrZXJcblxuICAgIHRoaXMuaXNTaW11bGF0aW5nID0gZmFsc2U7XG4gIH1cblxuICB1cGRhdGVWZWhpY2xlcyhkYXRhKSB7XG4gICAgbGV0IHZlaGljbGUsIHdoZWVsO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAoZGF0YS5sZW5ndGggLSAxKSAvIFZFSElDTEVSRVBPUlRfSVRFTVNJWkU7IGkrKykge1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gMSArIGkgKiBWRUhJQ0xFUkVQT1JUX0lURU1TSVpFO1xuICAgICAgdmVoaWNsZSA9IHRoaXMudmVoaWNsZXNbZGF0YVtvZmZzZXRdXTtcblxuICAgICAgaWYgKHZlaGljbGUgPT09IG51bGwpIGNvbnRpbnVlO1xuXG4gICAgICB3aGVlbCA9IHZlaGljbGUud2hlZWxzW2RhdGFbb2Zmc2V0ICsgMV1dO1xuXG4gICAgICB3aGVlbC5wb3NpdGlvbi5zZXQoXG4gICAgICAgIGRhdGFbb2Zmc2V0ICsgMl0sXG4gICAgICAgIGRhdGFbb2Zmc2V0ICsgM10sXG4gICAgICAgIGRhdGFbb2Zmc2V0ICsgNF1cbiAgICAgICk7XG5cbiAgICAgIHdoZWVsLnF1YXRlcm5pb24uc2V0KFxuICAgICAgICBkYXRhW29mZnNldCArIDVdLFxuICAgICAgICBkYXRhW29mZnNldCArIDZdLFxuICAgICAgICBkYXRhW29mZnNldCArIDddLFxuICAgICAgICBkYXRhW29mZnNldCArIDhdXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLlNVUFBPUlRfVFJBTlNGRVJBQkxFKVxuICAgICAgdGhpcy5zZW5kKGRhdGEuYnVmZmVyLCBbZGF0YS5idWZmZXJdKTsgLy8gR2l2ZSB0aGUgdHlwZWQgYXJyYXkgYmFjayB0byB0aGUgd29ya2VyXG4gIH1cblxuICB1cGRhdGVDb25zdHJhaW50cyhkYXRhKSB7XG4gICAgbGV0IGNvbnN0cmFpbnQsIG9iamVjdDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgKGRhdGEubGVuZ3RoIC0gMSkgLyBDT05TVFJBSU5UUkVQT1JUX0lURU1TSVpFOyBpKyspIHtcbiAgICAgIGNvbnN0IG9mZnNldCA9IDEgKyBpICogQ09OU1RSQUlOVFJFUE9SVF9JVEVNU0laRTtcbiAgICAgIGNvbnN0cmFpbnQgPSB0aGlzLmNvbnN0cmFpbnRzW2RhdGFbb2Zmc2V0XV07XG4gICAgICBvYmplY3QgPSB0aGlzLm9iamVjdHNbZGF0YVtvZmZzZXQgKyAxXV07XG5cbiAgICAgIGlmIChjb25zdHJhaW50ID09PSB1bmRlZmluZWQgfHwgb2JqZWN0ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICB0ZW1wMVZlY3RvcjMuc2V0KFxuICAgICAgICBkYXRhW29mZnNldCArIDJdLFxuICAgICAgICBkYXRhW29mZnNldCArIDNdLFxuICAgICAgICBkYXRhW29mZnNldCArIDRdXG4gICAgICApO1xuXG4gICAgICB0ZW1wMU1hdHJpeDQuZXh0cmFjdFJvdGF0aW9uKG9iamVjdC5tYXRyaXgpO1xuICAgICAgdGVtcDFWZWN0b3IzLmFwcGx5TWF0cml4NCh0ZW1wMU1hdHJpeDQpO1xuXG4gICAgICBjb25zdHJhaW50LnBvc2l0aW9uYS5hZGRWZWN0b3JzKG9iamVjdC5wb3NpdGlvbiwgdGVtcDFWZWN0b3IzKTtcbiAgICAgIGNvbnN0cmFpbnQuYXBwbGllZEltcHVsc2UgPSBkYXRhW29mZnNldCArIDVdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLlNVUFBPUlRfVFJBTlNGRVJBQkxFKVxuICAgICAgdGhpcy5zZW5kKGRhdGEuYnVmZmVyLCBbZGF0YS5idWZmZXJdKTsgLy8gR2l2ZSB0aGUgdHlwZWQgYXJyYXkgYmFjayB0byB0aGUgd29ya2VyXG4gIH1cblxuICB1cGRhdGVDb2xsaXNpb25zKGluZm8pIHtcbiAgICAvKipcbiAgICAgKiAjVE9ET1xuICAgICAqIFRoaXMgaXMgcHJvYmFibHkgdGhlIHdvcnN0IHdheSBldmVyIHRvIGhhbmRsZSBjb2xsaXNpb25zLiBUaGUgaW5oZXJlbnQgZXZpbG5lc3MgaXMgYSByZXNpZHVhbFxuICAgICAqIGVmZmVjdCBmcm9tIHRoZSBwcmV2aW91cyB2ZXJzaW9uJ3MgZXZpbG5lc3Mgd2hpY2ggbXV0YXRlZCB3aGVuIHN3aXRjaGluZyB0byB0cmFuc2ZlcmFibGUgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIElmIHlvdSBmZWVsIGluY2xpbmVkIHRvIG1ha2UgdGhpcyBiZXR0ZXIsIHBsZWFzZSBkbyBzby5cbiAgICAgKi9cblxuICAgIGNvbnN0IGNvbGxpc2lvbnMgPSB7fSxcbiAgICAgIG5vcm1hbF9vZmZzZXRzID0ge307XG5cbiAgICAvLyBCdWlsZCBjb2xsaXNpb24gbWFuaWZlc3RcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZm9bMV07IGkrKykge1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gMiArIGkgKiBDT0xMSVNJT05SRVBPUlRfSVRFTVNJWkU7XG4gICAgICBjb25zdCBvYmplY3QgPSBpbmZvW29mZnNldF07XG4gICAgICBjb25zdCBvYmplY3QyID0gaW5mb1tvZmZzZXQgKyAxXTtcblxuICAgICAgbm9ybWFsX29mZnNldHNbYCR7b2JqZWN0fS0ke29iamVjdDJ9YF0gPSBvZmZzZXQgKyAyO1xuICAgICAgbm9ybWFsX29mZnNldHNbYCR7b2JqZWN0Mn0tJHtvYmplY3R9YF0gPSAtMSAqIChvZmZzZXQgKyAyKTtcblxuICAgICAgLy8gUmVnaXN0ZXIgY29sbGlzaW9ucyBmb3IgYm90aCB0aGUgb2JqZWN0IGNvbGxpZGluZyBhbmQgdGhlIG9iamVjdCBiZWluZyBjb2xsaWRlZCB3aXRoXG4gICAgICBpZiAoIWNvbGxpc2lvbnNbb2JqZWN0XSkgY29sbGlzaW9uc1tvYmplY3RdID0gW107XG4gICAgICBjb2xsaXNpb25zW29iamVjdF0ucHVzaChvYmplY3QyKTtcblxuICAgICAgaWYgKCFjb2xsaXNpb25zW29iamVjdDJdKSBjb2xsaXNpb25zW29iamVjdDJdID0gW107XG4gICAgICBjb2xsaXNpb25zW29iamVjdDJdLnB1c2gob2JqZWN0KTtcbiAgICB9XG5cbiAgICAvLyBEZWFsIHdpdGggY29sbGlzaW9uc1xuICAgIGZvciAoY29uc3QgaWQxIGluIHRoaXMub2JqZWN0cykge1xuICAgICAgaWYgKCF0aGlzLm9iamVjdHMuaGFzT3duUHJvcGVydHkoaWQxKSkgY29udGludWU7XG4gICAgICBjb25zdCBvYmplY3QgPSB0aGlzLm9iamVjdHNbaWQxXTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG9iamVjdC5jb21wb25lbnQ7XG4gICAgICBjb25zdCBkYXRhID0gY29tcG9uZW50LnVzZSgncGh5c2ljcycpLmRhdGE7XG5cbiAgICAgIGlmIChvYmplY3QgPT09IG51bGwpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBJZiBvYmplY3QgdG91Y2hlcyBhbnl0aGluZywgLi4uXG4gICAgICBpZiAoY29sbGlzaW9uc1tpZDFdKSB7XG4gICAgICAgIC8vIENsZWFuIHVwIHRvdWNoZXMgYXJyYXlcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBkYXRhLnRvdWNoZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBpZiAoY29sbGlzaW9uc1tpZDFdLmluZGV4T2YoZGF0YS50b3VjaGVzW2pdKSA9PT0gLTEpXG4gICAgICAgICAgICBkYXRhLnRvdWNoZXMuc3BsaWNlKGotLSwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgZWFjaCBjb2xsaWRpbmcgb2JqZWN0XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29sbGlzaW9uc1tpZDFdLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgY29uc3QgaWQyID0gY29sbGlzaW9uc1tpZDFdW2pdO1xuICAgICAgICAgIGNvbnN0IG9iamVjdDIgPSB0aGlzLm9iamVjdHNbaWQyXTtcblxuICAgICAgICAgIGlmIChvYmplY3QyKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQyID0gb2JqZWN0Mi5jb21wb25lbnQ7XG4gICAgICAgICAgICBjb25zdCBkYXRhMiA9IGNvbXBvbmVudDIudXNlKCdwaHlzaWNzJykuZGF0YTtcbiAgICAgICAgICAgIC8vIElmIG9iamVjdCB3YXMgbm90IGFscmVhZHkgdG91Y2hpbmcgb2JqZWN0Miwgbm90aWZ5IG9iamVjdFxuICAgICAgICAgICAgaWYgKGRhdGEudG91Y2hlcy5pbmRleE9mKGlkMikgPT09IC0xKSB7XG4gICAgICAgICAgICAgIGRhdGEudG91Y2hlcy5wdXNoKGlkMik7XG5cbiAgICAgICAgICAgICAgY29uc3QgdmVsID0gY29tcG9uZW50LnVzZSgncGh5c2ljcycpLmdldExpbmVhclZlbG9jaXR5KCk7XG4gICAgICAgICAgICAgIGNvbnN0IHZlbDIgPSBjb21wb25lbnQyLnVzZSgncGh5c2ljcycpLmdldExpbmVhclZlbG9jaXR5KCk7XG5cbiAgICAgICAgICAgICAgdGVtcDFWZWN0b3IzLnN1YlZlY3RvcnModmVsLCB2ZWwyKTtcbiAgICAgICAgICAgICAgY29uc3QgdGVtcDEgPSB0ZW1wMVZlY3RvcjMuY2xvbmUoKTtcblxuICAgICAgICAgICAgICB0ZW1wMVZlY3RvcjMuc3ViVmVjdG9ycyh2ZWwsIHZlbDIpO1xuICAgICAgICAgICAgICBjb25zdCB0ZW1wMiA9IHRlbXAxVmVjdG9yMy5jbG9uZSgpO1xuXG4gICAgICAgICAgICAgIGxldCBub3JtYWxfb2Zmc2V0ID0gbm9ybWFsX29mZnNldHNbYCR7ZGF0YS5pZH0tJHtkYXRhMi5pZH1gXTtcblxuICAgICAgICAgICAgICBpZiAobm9ybWFsX29mZnNldCA+IDApIHtcbiAgICAgICAgICAgICAgICB0ZW1wMVZlY3RvcjMuc2V0KFxuICAgICAgICAgICAgICAgICAgLWluZm9bbm9ybWFsX29mZnNldF0sXG4gICAgICAgICAgICAgICAgICAtaW5mb1tub3JtYWxfb2Zmc2V0ICsgMV0sXG4gICAgICAgICAgICAgICAgICAtaW5mb1tub3JtYWxfb2Zmc2V0ICsgMl1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vcm1hbF9vZmZzZXQgKj0gLTE7XG5cbiAgICAgICAgICAgICAgICB0ZW1wMVZlY3RvcjMuc2V0KFxuICAgICAgICAgICAgICAgICAgaW5mb1tub3JtYWxfb2Zmc2V0XSxcbiAgICAgICAgICAgICAgICAgIGluZm9bbm9ybWFsX29mZnNldCArIDFdLFxuICAgICAgICAgICAgICAgICAgaW5mb1tub3JtYWxfb2Zmc2V0ICsgMl1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY29tcG9uZW50LmVtaXQoJ2NvbGxpc2lvbicsIG9iamVjdDIsIHRlbXAxLCB0ZW1wMiwgdGVtcDFWZWN0b3IzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBkYXRhLnRvdWNoZXMubGVuZ3RoID0gMDsgLy8gbm90IHRvdWNoaW5nIG90aGVyIG9iamVjdHNcbiAgICB9XG5cbiAgICB0aGlzLmNvbGxpc2lvbnMgPSBjb2xsaXNpb25zO1xuXG4gICAgaWYgKHRoaXMuU1VQUE9SVF9UUkFOU0ZFUkFCTEUpXG4gICAgICB0aGlzLnNlbmQoaW5mby5idWZmZXIsIFtpbmZvLmJ1ZmZlcl0pOyAvLyBHaXZlIHRoZSB0eXBlZCBhcnJheSBiYWNrIHRvIHRoZSB3b3JrZXJcbiAgfVxuXG4gIGFkZENvbnN0cmFpbnQoY29uc3RyYWludCwgc2hvd19tYXJrZXIpIHtcbiAgICBjb25zdHJhaW50LmlkID0gdGhpcy5nZXRPYmplY3RJZCgpO1xuICAgIHRoaXMuY29uc3RyYWludHNbY29uc3RyYWludC5pZF0gPSBjb25zdHJhaW50O1xuICAgIGNvbnN0cmFpbnQud29ybGRNb2R1bGUgPSB0aGlzO1xuICAgIHRoaXMuZXhlY3V0ZSgnYWRkQ29uc3RyYWludCcsIGNvbnN0cmFpbnQuZ2V0RGVmaW5pdGlvbigpKTtcblxuICAgIGlmIChzaG93X21hcmtlcikge1xuICAgICAgbGV0IG1hcmtlcjtcblxuICAgICAgc3dpdGNoIChjb25zdHJhaW50LnR5cGUpIHtcbiAgICAgICAgY2FzZSAncG9pbnQnOlxuICAgICAgICAgIG1hcmtlciA9IG5ldyBNZXNoKFxuICAgICAgICAgICAgbmV3IFNwaGVyZUdlb21ldHJ5KDEuNSksXG4gICAgICAgICAgICBuZXcgTWVzaE5vcm1hbE1hdGVyaWFsKClcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgbWFya2VyLnBvc2l0aW9uLmNvcHkoY29uc3RyYWludC5wb3NpdGlvbmEpO1xuICAgICAgICAgIHRoaXMub2JqZWN0c1tjb25zdHJhaW50Lm9iamVjdGFdLmFkZChtYXJrZXIpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2hpbmdlJzpcbiAgICAgICAgICBtYXJrZXIgPSBuZXcgTWVzaChcbiAgICAgICAgICAgIG5ldyBTcGhlcmVHZW9tZXRyeSgxLjUpLFxuICAgICAgICAgICAgbmV3IE1lc2hOb3JtYWxNYXRlcmlhbCgpXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIG1hcmtlci5wb3NpdGlvbi5jb3B5KGNvbnN0cmFpbnQucG9zaXRpb25hKTtcbiAgICAgICAgICB0aGlzLm9iamVjdHNbY29uc3RyYWludC5vYmplY3RhXS5hZGQobWFya2VyKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdzbGlkZXInOlxuICAgICAgICAgIG1hcmtlciA9IG5ldyBNZXNoKFxuICAgICAgICAgICAgbmV3IEJveEdlb21ldHJ5KDEwLCAxLCAxKSxcbiAgICAgICAgICAgIG5ldyBNZXNoTm9ybWFsTWF0ZXJpYWwoKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBtYXJrZXIucG9zaXRpb24uY29weShjb25zdHJhaW50LnBvc2l0aW9uYSk7XG5cbiAgICAgICAgICAvLyBUaGlzIHJvdGF0aW9uIGlzbid0IHJpZ2h0IGlmIGFsbCB0aHJlZSBheGlzIGFyZSBub24tMCB2YWx1ZXNcbiAgICAgICAgICAvLyBUT0RPOiBjaGFuZ2UgbWFya2VyJ3Mgcm90YXRpb24gb3JkZXIgdG8gWllYXG4gICAgICAgICAgbWFya2VyLnJvdGF0aW9uLnNldChcbiAgICAgICAgICAgIGNvbnN0cmFpbnQuYXhpcy55LCAvLyB5ZXMsIHkgYW5kXG4gICAgICAgICAgICBjb25zdHJhaW50LmF4aXMueCwgLy8geCBheGlzIGFyZSBzd2FwcGVkXG4gICAgICAgICAgICBjb25zdHJhaW50LmF4aXMuelxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5vYmplY3RzW2NvbnN0cmFpbnQub2JqZWN0YV0uYWRkKG1hcmtlcik7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnY29uZXR3aXN0JzpcbiAgICAgICAgICBtYXJrZXIgPSBuZXcgTWVzaChcbiAgICAgICAgICAgIG5ldyBTcGhlcmVHZW9tZXRyeSgxLjUpLFxuICAgICAgICAgICAgbmV3IE1lc2hOb3JtYWxNYXRlcmlhbCgpXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIG1hcmtlci5wb3NpdGlvbi5jb3B5KGNvbnN0cmFpbnQucG9zaXRpb25hKTtcbiAgICAgICAgICB0aGlzLm9iamVjdHNbY29uc3RyYWludC5vYmplY3RhXS5hZGQobWFya2VyKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdkb2YnOlxuICAgICAgICAgIG1hcmtlciA9IG5ldyBNZXNoKFxuICAgICAgICAgICAgbmV3IFNwaGVyZUdlb21ldHJ5KDEuNSksXG4gICAgICAgICAgICBuZXcgTWVzaE5vcm1hbE1hdGVyaWFsKClcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgbWFya2VyLnBvc2l0aW9uLmNvcHkoY29uc3RyYWludC5wb3NpdGlvbmEpO1xuICAgICAgICAgIHRoaXMub2JqZWN0c1tjb25zdHJhaW50Lm9iamVjdGFdLmFkZChtYXJrZXIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb25zdHJhaW50O1xuICB9XG5cbiAgb25TaW11bGF0aW9uUmVzdW1lKCkge1xuICAgIHRoaXMuZXhlY3V0ZSgnb25TaW11bGF0aW9uUmVzdW1lJywge30pO1xuICB9XG5cbiAgcmVtb3ZlQ29uc3RyYWludChjb25zdHJhaW50KSB7XG4gICAgaWYgKHRoaXMuY29uc3RyYWludHNbY29uc3RyYWludC5pZF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5leGVjdXRlKCdyZW1vdmVDb25zdHJhaW50Jywge2lkOiBjb25zdHJhaW50LmlkfSk7XG4gICAgICBkZWxldGUgdGhpcy5jb25zdHJhaW50c1tjb25zdHJhaW50LmlkXTtcbiAgICB9XG4gIH1cblxuICBleGVjdXRlKGNtZCwgcGFyYW1zKSB7XG4gICAgdGhpcy5zZW5kKHtjbWQsIHBhcmFtc30pO1xuICB9XG5cbiAgb25BZGRDYWxsYmFjayhjb21wb25lbnQpIHtcbiAgICBjb25zdCBvYmplY3QgPSBjb21wb25lbnQubmF0aXZlO1xuICAgIGNvbnN0IGRhdGEgPSBvYmplY3QuY29tcG9uZW50LnVzZSgncGh5c2ljcycpLmRhdGE7XG5cbiAgICBpZiAoZGF0YSkge1xuICAgICAgY29tcG9uZW50Lm1hbmFnZXIuc2V0KCdtb2R1bGU6d29ybGQnLCB0aGlzKTtcbiAgICAgIGRhdGEuaWQgPSB0aGlzLmdldE9iamVjdElkKCk7XG4gICAgICBvYmplY3QuY29tcG9uZW50LnVzZSgncGh5c2ljcycpLmRhdGEgPSBkYXRhO1xuXG4gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgVmVoaWNsZSkge1xuICAgICAgICB0aGlzLm9uQWRkQ2FsbGJhY2sob2JqZWN0Lm1lc2gpO1xuICAgICAgICB0aGlzLnZlaGljbGVzW2RhdGEuaWRdID0gb2JqZWN0O1xuICAgICAgICB0aGlzLmV4ZWN1dGUoJ2FkZFZlaGljbGUnLCBkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBvbmVudC5fX2RpcnR5UG9zaXRpb24gPSBmYWxzZTtcbiAgICAgICAgY29tcG9uZW50Ll9fZGlydHlSb3RhdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9iamVjdHNbZGF0YS5pZF0gPSBvYmplY3Q7XG5cbiAgICAgICAgaWYgKG9iamVjdC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICBkYXRhLmNoaWxkcmVuID0gW107XG4gICAgICAgICAgYWRkT2JqZWN0Q2hpbGRyZW4ob2JqZWN0LCBvYmplY3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gb2JqZWN0LnF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKG9iamVjdC5yb3RhdGlvbik7XG4gICAgICAgIC8vXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKG9iamVjdC5jb21wb25lbnQpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhvYmplY3Qucm90YXRpb24pO1xuXG4gICAgICAgIC8vIE9iamVjdCBzdGFydGluZyBwb3NpdGlvbiArIHJvdGF0aW9uXG4gICAgICAgIGRhdGEucG9zaXRpb24gPSB7XG4gICAgICAgICAgeDogb2JqZWN0LnBvc2l0aW9uLngsXG4gICAgICAgICAgeTogb2JqZWN0LnBvc2l0aW9uLnksXG4gICAgICAgICAgejogb2JqZWN0LnBvc2l0aW9uLnpcbiAgICAgICAgfTtcblxuICAgICAgICBkYXRhLnJvdGF0aW9uID0ge1xuICAgICAgICAgIHg6IG9iamVjdC5xdWF0ZXJuaW9uLngsXG4gICAgICAgICAgeTogb2JqZWN0LnF1YXRlcm5pb24ueSxcbiAgICAgICAgICB6OiBvYmplY3QucXVhdGVybmlvbi56LFxuICAgICAgICAgIHc6IG9iamVjdC5xdWF0ZXJuaW9uLndcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZGF0YS53aWR0aCkgZGF0YS53aWR0aCAqPSBvYmplY3Quc2NhbGUueDtcbiAgICAgICAgaWYgKGRhdGEuaGVpZ2h0KSBkYXRhLmhlaWdodCAqPSBvYmplY3Quc2NhbGUueTtcbiAgICAgICAgaWYgKGRhdGEuZGVwdGgpIGRhdGEuZGVwdGggKj0gb2JqZWN0LnNjYWxlLno7XG5cbiAgICAgICAgdGhpcy5leGVjdXRlKCdhZGRPYmplY3QnLCBkYXRhKTtcbiAgICAgIH1cblxuICAgICAgY29tcG9uZW50LmVtaXQoJ3BoeXNpY3M6YWRkZWQnKTtcbiAgICB9XG4gIH1cblxuICBvblJlbW92ZUNhbGxiYWNrKGNvbXBvbmVudCkge1xuICAgIGNvbnN0IG9iamVjdCA9IGNvbXBvbmVudC5uYXRpdmU7XG5cbiAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgVmVoaWNsZSkge1xuICAgICAgdGhpcy5leGVjdXRlKCdyZW1vdmVWZWhpY2xlJywge2lkOiBvYmplY3QuX3BoeXNpanMuaWR9KTtcbiAgICAgIHdoaWxlIChvYmplY3Qud2hlZWxzLmxlbmd0aCkgdGhpcy5yZW1vdmUob2JqZWN0LndoZWVscy5wb3AoKSk7XG5cbiAgICAgIHRoaXMucmVtb3ZlKG9iamVjdC5tZXNoKTtcbiAgICAgIHRoaXMudmVoaWNsZXNbb2JqZWN0Ll9waHlzaWpzLmlkXSA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE1lc2gucHJvdG90eXBlLnJlbW92ZS5jYWxsKHRoaXMsIG9iamVjdCk7XG5cbiAgICAgIGlmIChvYmplY3QuX3BoeXNpanMpIHtcbiAgICAgICAgY29tcG9uZW50Lm1hbmFnZXIucmVtb3ZlKCdtb2R1bGU6d29ybGQnKTtcbiAgICAgICAgdGhpcy5vYmplY3RzW29iamVjdC5fcGh5c2lqcy5pZF0gPSBudWxsO1xuICAgICAgICB0aGlzLmV4ZWN1dGUoJ3JlbW92ZU9iamVjdCcsIHtpZDogb2JqZWN0Ll9waHlzaWpzLmlkfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZGVmZXIoZnVuYywgYXJncykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNMb2FkZWQpIHtcbiAgICAgICAgZnVuYyguLi5hcmdzKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBlbHNlIHRoaXMubG9hZGVyLnRoZW4oKCkgPT4ge1xuICAgICAgICBmdW5jKC4uLmFyZ3MpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG1hbmFnZXIobWFuYWdlcikge1xuICAgIG1hbmFnZXIuZGVmaW5lKCdwaHlzaWNzJyk7XG4gICAgbWFuYWdlci5zZXQoJ3BoeXNpY3NXb3JrZXInLCB0aGlzLndvcmtlcik7XG4gIH1cblxuICBicmlkZ2UgPSB7XG4gICAgb25BZGQoY29tcG9uZW50LCBzZWxmKSB7XG4gICAgICBpZiAoY29tcG9uZW50LnVzZSgncGh5c2ljcycpKSByZXR1cm4gc2VsZi5kZWZlcihzZWxmLm9uQWRkQ2FsbGJhY2suYmluZChzZWxmKSwgW2NvbXBvbmVudF0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0sXG5cbiAgICBvblJlbW92ZShjb21wb25lbnQsIHNlbGYpIHtcbiAgICAgIGlmIChjb21wb25lbnQudXNlKCdwaHlzaWNzJykpIHJldHVybiBzZWxmLmRlZmVyKHNlbGYub25SZW1vdmVDYWxsYmFjay5iaW5kKHNlbGYpLCBbY29tcG9uZW50XSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9O1xuXG4gIGludGVncmF0ZShzZWxmKSB7XG4gICAgLy8gLi4uXG5cbiAgICB0aGlzLnNldEZpeGVkVGltZVN0ZXAgPSBmdW5jdGlvbihmaXhlZFRpbWVTdGVwKSB7XG4gICAgICBpZiAoZml4ZWRUaW1lU3RlcCkgc2VsZi5leGVjdXRlKCdzZXRGaXhlZFRpbWVTdGVwJywgZml4ZWRUaW1lU3RlcCk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRHcmF2aXR5ID0gZnVuY3Rpb24oZ3Jhdml0eSkge1xuICAgICAgaWYgKGdyYXZpdHkpIHNlbGYuZXhlY3V0ZSgnc2V0R3Jhdml0eScsIGdyYXZpdHkpO1xuICAgIH1cblxuICAgIHRoaXMuYWRkQ29uc3RyYWludCA9IHNlbGYuYWRkQ29uc3RyYWludC5iaW5kKHNlbGYpO1xuXG4gICAgdGhpcy5zaW11bGF0ZSA9IGZ1bmN0aW9uKHRpbWVTdGVwLCBtYXhTdWJTdGVwcykge1xuICAgICAgaWYgKHNlbGYuX3N0YXRzKSBzZWxmLl9zdGF0cy5iZWdpbigpO1xuXG4gICAgICBpZiAoc2VsZi5pc1NpbXVsYXRpbmcpIHJldHVybiBmYWxzZTtcbiAgICAgIHNlbGYuaXNTaW11bGF0aW5nID0gdHJ1ZTtcblxuICAgICAgZm9yIChjb25zdCBvYmplY3RfaWQgaW4gc2VsZi5vYmplY3RzKSB7XG4gICAgICAgIGlmICghc2VsZi5vYmplY3RzLmhhc093blByb3BlcnR5KG9iamVjdF9pZCkpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IG9iamVjdCA9IHNlbGYub2JqZWN0c1tvYmplY3RfaWRdO1xuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBvYmplY3QuY29tcG9uZW50O1xuICAgICAgICBjb25zdCBkYXRhID0gY29tcG9uZW50LnVzZSgncGh5c2ljcycpLmRhdGE7XG5cbiAgICAgICAgaWYgKG9iamVjdCAhPT0gbnVsbCAmJiAoY29tcG9uZW50Ll9fZGlydHlQb3NpdGlvbiB8fCBjb21wb25lbnQuX19kaXJ0eVJvdGF0aW9uKSkge1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZSA9IHtpZDogZGF0YS5pZH07XG5cbiAgICAgICAgICBpZiAoY29tcG9uZW50Ll9fZGlydHlQb3NpdGlvbikge1xuICAgICAgICAgICAgdXBkYXRlLnBvcyA9IHtcbiAgICAgICAgICAgICAgeDogb2JqZWN0LnBvc2l0aW9uLngsXG4gICAgICAgICAgICAgIHk6IG9iamVjdC5wb3NpdGlvbi55LFxuICAgICAgICAgICAgICB6OiBvYmplY3QucG9zaXRpb24uelxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKGRhdGEuaXNTb2Z0Ym9keSkgb2JqZWN0LnBvc2l0aW9uLnNldCgwLCAwLCAwKTtcblxuICAgICAgICAgICAgY29tcG9uZW50Ll9fZGlydHlQb3NpdGlvbiA9IGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjb21wb25lbnQuX19kaXJ0eVJvdGF0aW9uKSB7XG4gICAgICAgICAgICB1cGRhdGUucXVhdCA9IHtcbiAgICAgICAgICAgICAgeDogb2JqZWN0LnF1YXRlcm5pb24ueCxcbiAgICAgICAgICAgICAgeTogb2JqZWN0LnF1YXRlcm5pb24ueSxcbiAgICAgICAgICAgICAgejogb2JqZWN0LnF1YXRlcm5pb24ueixcbiAgICAgICAgICAgICAgdzogb2JqZWN0LnF1YXRlcm5pb24ud1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKGRhdGEuaXNTb2Z0Ym9keSkgb2JqZWN0LnJvdGF0aW9uLnNldCgwLCAwLCAwKTtcblxuICAgICAgICAgICAgY29tcG9uZW50Ll9fZGlydHlSb3RhdGlvbiA9IGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNlbGYuZXhlY3V0ZSgndXBkYXRlVHJhbnNmb3JtJywgdXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzZWxmLmV4ZWN1dGUoJ3NpbXVsYXRlJywge3RpbWVTdGVwLCBtYXhTdWJTdGVwc30pO1xuXG4gICAgICBpZiAoc2VsZi5fc3RhdHMpIHNlbGYuX3N0YXRzLmVuZCgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gY29uc3Qgc2ltdWxhdGVQcm9jZXNzID0gKHQpID0+IHtcbiAgICAvLyAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc2ltdWxhdGVQcm9jZXNzKTtcblxuICAgIC8vICAgdGhpcy5zaW11bGF0ZSgxLzYwLCAxKTsgLy8gZGVsdGEsIDFcbiAgICAvLyB9XG5cbiAgICAvLyBzaW11bGF0ZVByb2Nlc3MoKTtcblxuICAgIHNlbGYubG9hZGVyLnRoZW4oKCkgPT4ge1xuICAgICAgc2VsZi5zaW11bGF0ZUxvb3AgPSBuZXcgTG9vcCgoY2xvY2spID0+IHtcbiAgICAgICAgdGhpcy5zaW11bGF0ZShjbG9jay5nZXREZWx0YSgpLCAxKTsgLy8gZGVsdGEsIDFcbiAgICAgIH0pO1xuXG4gICAgICBzZWxmLnNpbXVsYXRlTG9vcC5zdGFydCh0aGlzKTtcblxuICAgICAgY29uc29sZS5sb2coc2VsZi5vcHRpb25zLmdyYXZpdHkpO1xuICAgICAgdGhpcy5zZXRHcmF2aXR5KHNlbGYub3B0aW9ucy5ncmF2aXR5KTtcbiAgICB9KTtcbiAgfVxufVxuIiwidmFyIFRBUkdFVCA9IHR5cGVvZiBTeW1ib2wgPT09ICd1bmRlZmluZWQnID8gJ19fdGFyZ2V0JyA6IFN5bWJvbCgpLFxuICAgIFNDUklQVF9UWVBFID0gJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnLFxuICAgIEJsb2JCdWlsZGVyID0gd2luZG93LkJsb2JCdWlsZGVyIHx8IHdpbmRvdy5XZWJLaXRCbG9iQnVpbGRlciB8fCB3aW5kb3cuTW96QmxvYkJ1aWxkZXIgfHwgd2luZG93Lk1TQmxvYkJ1aWxkZXIsXG4gICAgVVJMID0gd2luZG93LlVSTCB8fCB3aW5kb3cud2Via2l0VVJMLFxuICAgIFdvcmtlciA9IHdpbmRvdy5Xb3JrZXI7XG5cbi8qKlxuICogUmV0dXJucyBhIHdyYXBwZXIgYXJvdW5kIFdlYiBXb3JrZXIgY29kZSB0aGF0IGlzIGNvbnN0cnVjdGlibGUuXG4gKlxuICogQGZ1bmN0aW9uIHNoaW1Xb3JrZXJcbiAqXG4gKiBAcGFyYW0geyBTdHJpbmcgfSAgICBmaWxlbmFtZSAgICBUaGUgbmFtZSBvZiB0aGUgZmlsZVxuICogQHBhcmFtIHsgRnVuY3Rpb24gfSAgZm4gICAgICAgICAgRnVuY3Rpb24gd3JhcHBpbmcgdGhlIGNvZGUgb2YgdGhlIHdvcmtlclxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzaGltV29ya2VyIChmaWxlbmFtZSwgZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gU2hpbVdvcmtlciAoZm9yY2VGYWxsYmFjaykge1xuICAgICAgICB2YXIgbyA9IHRoaXM7XG5cbiAgICAgICAgaWYgKCFmbikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBXb3JrZXIoZmlsZW5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFdvcmtlciAmJiAhZm9yY2VGYWxsYmFjaykge1xuICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgZnVuY3Rpb24ncyBpbm5lciBjb2RlIHRvIGEgc3RyaW5nIHRvIGNvbnN0cnVjdCB0aGUgd29ya2VyXG4gICAgICAgICAgICB2YXIgc291cmNlID0gZm4udG9TdHJpbmcoKS5yZXBsYWNlKC9eZnVuY3Rpb24uKz97LywgJycpLnNsaWNlKDAsIC0xKSxcbiAgICAgICAgICAgICAgICBvYmpVUkwgPSBjcmVhdGVTb3VyY2VPYmplY3Qoc291cmNlKTtcblxuICAgICAgICAgICAgdGhpc1tUQVJHRVRdID0gbmV3IFdvcmtlcihvYmpVUkwpO1xuICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChvYmpVUkwpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNbVEFSR0VUXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBzZWxmU2hpbSA9IHtcbiAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2U6IGZ1bmN0aW9uKG0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvLm9ubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsgby5vbm1lc3NhZ2UoeyBkYXRhOiBtLCB0YXJnZXQ6IHNlbGZTaGltIH0pIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZm4uY2FsbChzZWxmU2hpbSk7XG4gICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlID0gZnVuY3Rpb24obSkge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsgc2VsZlNoaW0ub25tZXNzYWdlKHsgZGF0YTogbSwgdGFyZ2V0OiBvIH0pIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuaXNUaGlzVGhyZWFkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH07XG59O1xuXG4vLyBUZXN0IFdvcmtlciBjYXBhYmlsaXRpZXNcbmlmIChXb3JrZXIpIHtcbiAgICB2YXIgdGVzdFdvcmtlcixcbiAgICAgICAgb2JqVVJMID0gY3JlYXRlU291cmNlT2JqZWN0KCdzZWxmLm9ubWVzc2FnZSA9IGZ1bmN0aW9uICgpIHt9JyksXG4gICAgICAgIHRlc3RBcnJheSA9IG5ldyBVaW50OEFycmF5KDEpO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgLy8gTm8gd29ya2VycyB2aWEgYmxvYnMgaW4gRWRnZSAxMiBhbmQgSUUgMTEgYW5kIGxvd2VyIDooXG4gICAgICAgIGlmICgvKD86VHJpZGVudHxFZGdlKVxcLyg/Ols1NjddfDEyKS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGF2YWlsYWJsZScpO1xuICAgICAgICB9XG4gICAgICAgIHRlc3RXb3JrZXIgPSBuZXcgV29ya2VyKG9ialVSTCk7XG5cbiAgICAgICAgLy8gTmF0aXZlIGJyb3dzZXIgb24gc29tZSBTYW1zdW5nIGRldmljZXMgdGhyb3dzIGZvciB0cmFuc2ZlcmFibGVzLCBsZXQncyBkZXRlY3QgaXRcbiAgICAgICAgdGVzdFdvcmtlci5wb3N0TWVzc2FnZSh0ZXN0QXJyYXksIFt0ZXN0QXJyYXkuYnVmZmVyXSk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIFdvcmtlciA9IG51bGw7XG4gICAgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKG9ialVSTCk7XG4gICAgICAgIGlmICh0ZXN0V29ya2VyKSB7XG4gICAgICAgICAgICB0ZXN0V29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVTb3VyY2VPYmplY3Qoc3RyKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW3N0cl0sIHsgdHlwZTogU0NSSVBUX1RZUEUgfSkpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICB2YXIgYmxvYiA9IG5ldyBCbG9iQnVpbGRlcigpO1xuICAgICAgICBibG9iLmFwcGVuZChzdHIpO1xuICAgICAgICByZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iLmdldEJsb2IodHlwZSkpO1xuICAgIH1cbn1cbiIsImltcG9ydCBzaGltV29ya2VyIGZyb20gJ3JvbGx1cC1wbHVnaW4tYnVuZGxlLXdvcmtlcic7XG5leHBvcnQgZGVmYXVsdCBuZXcgc2hpbVdvcmtlcihcIi4uL3dvcmtlci5qc1wiLCBmdW5jdGlvbiAod2luZG93LCBkb2N1bWVudCkge1xudmFyIHNlbGYgPSB0aGlzO1xuZnVuY3Rpb24gRXZlbnRzKHRhcmdldCkge1xuICB2YXIgZXZlbnRzID0ge30sXG4gICAgZW1wdHkgPSBbXTtcbiAgdGFyZ2V0ID0gdGFyZ2V0IHx8IHRoaXNcbiAgLyoqXG4gICAqICBPbjogbGlzdGVuIHRvIGV2ZW50c1xuICAgKi9cbiAgdGFyZ2V0Lm9uID0gZnVuY3Rpb24gKHR5cGUsIGZ1bmMsIGN0eCkge1xuICAgIChldmVudHNbdHlwZV0gPSBldmVudHNbdHlwZV0gfHwgW10pLnB1c2goW2Z1bmMsIGN0eF0pXG4gICAgcmV0dXJuIHRhcmdldFxuICB9XG4gIC8qKlxuICAgKiAgT2ZmOiBzdG9wIGxpc3RlbmluZyB0byBldmVudCAvIHNwZWNpZmljIGNhbGxiYWNrXG4gICAqL1xuICB0YXJnZXQub2ZmID0gZnVuY3Rpb24gKHR5cGUsIGZ1bmMpIHtcbiAgICB0eXBlIHx8IChldmVudHMgPSB7fSlcbiAgICB2YXIgbGlzdCA9IGV2ZW50c1t0eXBlXSB8fCBlbXB0eSxcbiAgICAgIGkgPSBsaXN0Lmxlbmd0aCA9IGZ1bmMgPyBsaXN0Lmxlbmd0aCA6IDA7XG4gICAgd2hpbGUgKGktLSkgZnVuYyA9PSBsaXN0W2ldWzBdICYmIGxpc3Quc3BsaWNlKGksIDEpXG4gICAgcmV0dXJuIHRhcmdldFxuICB9XG4gIC8qKlxuICAgKiBFbWl0OiBzZW5kIGV2ZW50LCBjYWxsYmFja3Mgd2lsbCBiZSB0cmlnZ2VyZWRcbiAgICovXG4gIHRhcmdldC5lbWl0ID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICB2YXIgZSA9IGV2ZW50c1t0eXBlXSB8fCBlbXB0eSxcbiAgICAgIGxpc3QgPSBlLmxlbmd0aCA+IDAgPyBlLnNsaWNlKDAsIGUubGVuZ3RoKSA6IGUsXG4gICAgICBpID0gMCxcbiAgICAgIGo7XG4gICAgd2hpbGUgKGogPSBsaXN0W2krK10pIGpbMF0uYXBwbHkoalsxXSwgZW1wdHkuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKVxuICAgIHJldHVybiB0YXJnZXRcbiAgfTtcbn07XG5cbmNvbnN0IGluc2lkZVdvcmtlciA9ICFzZWxmLmRvY3VtZW50O1xuaWYgKCFpbnNpZGVXb3JrZXIpIHNlbGYgPSBuZXcgRXZlbnRzKCk7XG5cbmxldCBzZW5kID0gaW5zaWRlV29ya2VyID8gKHNlbGYud2Via2l0UG9zdE1lc3NhZ2UgfHwgc2VsZi5wb3N0TWVzc2FnZSkgOiBmdW5jdGlvbiAoZGF0YSkge1xuICBzZWxmLmVtaXQoJ21lc3NhZ2UnLCB7IGRhdGEgfSk7XG59O1xuXG5zZWxmLnNlbmQgPSBzZW5kO1xuXG5sZXQgU1VQUE9SVF9UUkFOU0ZFUkFCTEU7XG5cbmlmIChpbnNpZGVXb3JrZXIpIHtcbiAgY29uc3QgYWIgPSBuZXcgQXJyYXlCdWZmZXIoMSk7XG5cbiAgc2VuZChhYiwgW2FiXSk7XG4gIFNVUFBPUlRfVFJBTlNGRVJBQkxFID0gKGFiLmJ5dGVMZW5ndGggPT09IDApO1xufVxuXG5jb25zdCBNRVNTQUdFX1RZUEVTID0ge1xuICBXT1JMRFJFUE9SVDogMCxcbiAgQ09MTElTSU9OUkVQT1JUOiAxLFxuICBWRUhJQ0xFUkVQT1JUOiAyLFxuICBDT05TVFJBSU5UUkVQT1JUOiAzLFxuICBTT0ZUUkVQT1JUOiA0XG59O1xuXG4vLyB0ZW1wIHZhcmlhYmxlc1xubGV0IF9vYmplY3QsXG4gIF92ZWN0b3IsXG4gIF90cmFuc2Zvcm0sXG4gIF90cmFuc2Zvcm1fcG9zLFxuICBfc29mdGJvZHlfZW5hYmxlZCA9IGZhbHNlLFxuICBsYXN0X3NpbXVsYXRpb25fZHVyYXRpb24gPSAwLFxuXG4gIF9udW1fb2JqZWN0cyA9IDAsXG4gIF9udW1fcmlnaWRib2R5X29iamVjdHMgPSAwLFxuICBfbnVtX3NvZnRib2R5X29iamVjdHMgPSAwLFxuICBfbnVtX3doZWVscyA9IDAsXG4gIF9udW1fY29uc3RyYWludHMgPSAwLFxuICBfc29mdGJvZHlfcmVwb3J0X3NpemUgPSAwLFxuXG4gIC8vIHdvcmxkIHZhcmlhYmxlc1xuICBmaXhlZFRpbWVTdGVwLCAvLyB1c2VkIHdoZW4gY2FsbGluZyBzdGVwU2ltdWxhdGlvblxuICBsYXN0X3NpbXVsYXRpb25fdGltZSxcblxuICB3b3JsZCxcbiAgX3ZlYzNfMSxcbiAgX3ZlYzNfMixcbiAgX3ZlYzNfMyxcbiAgX3F1YXQ7XG5cbi8vIHByaXZhdGUgY2FjaGVcbmNvbnN0IHB1YmxpY19mdW5jdGlvbnMgPSB7fSxcbiAgX29iamVjdHMgPSBbXSxcbiAgX3ZlaGljbGVzID0gW10sXG4gIF9jb25zdHJhaW50cyA9IFtdLFxuICBfb2JqZWN0c19hbW1vID0ge30sXG4gIF9vYmplY3Rfc2hhcGVzID0ge30sXG5cbiAgLy8gVGhlIGZvbGxvd2luZyBvYmplY3RzIGFyZSB0byB0cmFjayBvYmplY3RzIHRoYXQgYW1tby5qcyBkb2Vzbid0IGNsZWFuXG4gIC8vIHVwLiBBbGwgYXJlIGNsZWFuZWQgdXAgd2hlbiB0aGV5J3JlIGNvcnJlc3BvbmRpbmcgYm9keSBpcyBkZXN0cm95ZWQuXG4gIC8vIFVuZm9ydHVuYXRlbHksIGl0J3MgdmVyeSBkaWZmaWN1bHQgdG8gZ2V0IGF0IHRoZXNlIG9iamVjdHMgZnJvbSB0aGVcbiAgLy8gYm9keSwgc28gd2UgaGF2ZSB0byB0cmFjayB0aGVtIG91cnNlbHZlcy5cbiAgX21vdGlvbl9zdGF0ZXMgPSB7fSxcbiAgLy8gRG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBpdCBmb3IgY2FjaGVkIHNoYXBlcy5cbiAgX25vbmNhY2hlZF9zaGFwZXMgPSB7fSxcbiAgLy8gQSBib2R5IHdpdGggYSBjb21wb3VuZCBzaGFwZSBhbHdheXMgaGFzIGEgcmVndWxhciBzaGFwZSBhcyB3ZWxsLCBzbyB3ZVxuICAvLyBoYXZlIHRyYWNrIHRoZW0gc2VwYXJhdGVseS5cbiAgX2NvbXBvdW5kX3NoYXBlcyA9IHt9O1xuXG4vLyBvYmplY3QgcmVwb3J0aW5nXG5sZXQgUkVQT1JUX0NIVU5LU0laRSwgLy8gcmVwb3J0IGFycmF5IGlzIGluY3JlYXNlZCBpbiBpbmNyZW1lbnRzIG9mIHRoaXMgY2h1bmsgc2l6ZVxuICB3b3JsZHJlcG9ydCxcbiAgc29mdHJlcG9ydCxcbiAgY29sbGlzaW9ucmVwb3J0LFxuICB2ZWhpY2xlcmVwb3J0LFxuICBjb25zdHJhaW50cmVwb3J0O1xuXG5jb25zdCBXT1JMRFJFUE9SVF9JVEVNU0laRSA9IDE0LCAvLyBob3cgbWFueSBmbG9hdCB2YWx1ZXMgZWFjaCByZXBvcnRlZCBpdGVtIG5lZWRzXG4gIENPTExJU0lPTlJFUE9SVF9JVEVNU0laRSA9IDUsIC8vIG9uZSBmbG9hdCBmb3IgZWFjaCBvYmplY3QgaWQsIGFuZCBhIFZlYzMgY29udGFjdCBub3JtYWxcbiAgVkVISUNMRVJFUE9SVF9JVEVNU0laRSA9IDksIC8vIHZlaGljbGUgaWQsIHdoZWVsIGluZGV4LCAzIGZvciBwb3NpdGlvbiwgNCBmb3Igcm90YXRpb25cbiAgQ09OU1RSQUlOVFJFUE9SVF9JVEVNU0laRSA9IDY7IC8vIGNvbnN0cmFpbnQgaWQsIG9mZnNldCBvYmplY3QsIG9mZnNldCwgYXBwbGllZCBpbXB1bHNlXG5cbmNvbnN0IGdldFNoYXBlRnJvbUNhY2hlID0gKGNhY2hlX2tleSkgPT4ge1xuICBpZiAoX29iamVjdF9zaGFwZXNbY2FjaGVfa2V5XSAhPT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBfb2JqZWN0X3NoYXBlc1tjYWNoZV9rZXldO1xuXG4gIHJldHVybiBudWxsO1xufTtcblxuY29uc3Qgc2V0U2hhcGVDYWNoZSA9IChjYWNoZV9rZXksIHNoYXBlKSA9PiB7XG4gIF9vYmplY3Rfc2hhcGVzW2NhY2hlX2tleV0gPSBzaGFwZTtcbn07XG5cbmNvbnN0IGNyZWF0ZVNoYXBlID0gKGRlc2NyaXB0aW9uKSA9PiB7XG4gIGxldCBzaGFwZTtcblxuICBfdHJhbnNmb3JtLnNldElkZW50aXR5KCk7XG4gIHN3aXRjaCAoZGVzY3JpcHRpb24udHlwZSkge1xuICBjYXNlICdjb21wb3VuZCc6XG4gICAge1xuICAgICAgc2hhcGUgPSBuZXcgQW1tby5idENvbXBvdW5kU2hhcGUoKTtcblxuICAgICAgYnJlYWs7XG4gICAgfVxuICBjYXNlICdwbGFuZSc6XG4gICAge1xuICAgICAgY29uc3QgY2FjaGVfa2V5ID0gYHBsYW5lXyR7ZGVzY3JpcHRpb24ubm9ybWFsLnh9XyR7ZGVzY3JpcHRpb24ubm9ybWFsLnl9XyR7ZGVzY3JpcHRpb24ubm9ybWFsLnp9YDtcblxuICAgICAgaWYgKChzaGFwZSA9IGdldFNoYXBlRnJvbUNhY2hlKGNhY2hlX2tleSkpID09PSBudWxsKSB7XG4gICAgICAgIF92ZWMzXzEuc2V0WChkZXNjcmlwdGlvbi5ub3JtYWwueCk7XG4gICAgICAgIF92ZWMzXzEuc2V0WShkZXNjcmlwdGlvbi5ub3JtYWwueSk7XG4gICAgICAgIF92ZWMzXzEuc2V0WihkZXNjcmlwdGlvbi5ub3JtYWwueik7XG4gICAgICAgIHNoYXBlID0gbmV3IEFtbW8uYnRTdGF0aWNQbGFuZVNoYXBlKF92ZWMzXzEsIDApO1xuICAgICAgICBzZXRTaGFwZUNhY2hlKGNhY2hlX2tleSwgc2hhcGUpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgICB9XG4gIGNhc2UgJ2JveCc6XG4gICAge1xuICAgICAgY29uc3QgY2FjaGVfa2V5ID0gYGJveF8ke2Rlc2NyaXB0aW9uLndpZHRofV8ke2Rlc2NyaXB0aW9uLmhlaWdodH1fJHtkZXNjcmlwdGlvbi5kZXB0aH1gO1xuXG4gICAgICBpZiAoKHNoYXBlID0gZ2V0U2hhcGVGcm9tQ2FjaGUoY2FjaGVfa2V5KSkgPT09IG51bGwpIHtcbiAgICAgICAgX3ZlYzNfMS5zZXRYKGRlc2NyaXB0aW9uLndpZHRoIC8gMik7XG4gICAgICAgIF92ZWMzXzEuc2V0WShkZXNjcmlwdGlvbi5oZWlnaHQgLyAyKTtcbiAgICAgICAgX3ZlYzNfMS5zZXRaKGRlc2NyaXB0aW9uLmRlcHRoIC8gMik7XG4gICAgICAgIHNoYXBlID0gbmV3IEFtbW8uYnRCb3hTaGFwZShfdmVjM18xKTtcbiAgICAgICAgc2V0U2hhcGVDYWNoZShjYWNoZV9rZXksIHNoYXBlKTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuICBjYXNlICdzcGhlcmUnOlxuICAgIHtcbiAgICAgIGNvbnN0IGNhY2hlX2tleSA9IGBzcGhlcmVfJHtkZXNjcmlwdGlvbi5yYWRpdXN9YDtcblxuICAgICAgaWYgKChzaGFwZSA9IGdldFNoYXBlRnJvbUNhY2hlKGNhY2hlX2tleSkpID09PSBudWxsKSB7XG4gICAgICAgIHNoYXBlID0gbmV3IEFtbW8uYnRTcGhlcmVTaGFwZShkZXNjcmlwdGlvbi5yYWRpdXMpO1xuICAgICAgICBzZXRTaGFwZUNhY2hlKGNhY2hlX2tleSwgc2hhcGUpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgICB9XG4gIGNhc2UgJ2N5bGluZGVyJzpcbiAgICB7XG4gICAgICBjb25zdCBjYWNoZV9rZXkgPSBgY3lsaW5kZXJfJHtkZXNjcmlwdGlvbi53aWR0aH1fJHtkZXNjcmlwdGlvbi5oZWlnaHR9XyR7ZGVzY3JpcHRpb24uZGVwdGh9YDtcblxuICAgICAgaWYgKChzaGFwZSA9IGdldFNoYXBlRnJvbUNhY2hlKGNhY2hlX2tleSkpID09PSBudWxsKSB7XG4gICAgICAgIF92ZWMzXzEuc2V0WChkZXNjcmlwdGlvbi53aWR0aCAvIDIpO1xuICAgICAgICBfdmVjM18xLnNldFkoZGVzY3JpcHRpb24uaGVpZ2h0IC8gMik7XG4gICAgICAgIF92ZWMzXzEuc2V0WihkZXNjcmlwdGlvbi5kZXB0aCAvIDIpO1xuICAgICAgICBzaGFwZSA9IG5ldyBBbW1vLmJ0Q3lsaW5kZXJTaGFwZShfdmVjM18xKTtcbiAgICAgICAgc2V0U2hhcGVDYWNoZShjYWNoZV9rZXksIHNoYXBlKTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuICBjYXNlICdjYXBzdWxlJzpcbiAgICB7XG4gICAgICBjb25zdCBjYWNoZV9rZXkgPSBgY2Fwc3VsZV8ke2Rlc2NyaXB0aW9uLnJhZGl1c31fJHtkZXNjcmlwdGlvbi5oZWlnaHR9YDtcblxuICAgICAgaWYgKChzaGFwZSA9IGdldFNoYXBlRnJvbUNhY2hlKGNhY2hlX2tleSkpID09PSBudWxsKSB7XG4gICAgICAgIC8vIEluIEJ1bGxldCwgY2Fwc3VsZSBoZWlnaHQgZXhjbHVkZXMgdGhlIGVuZCBzcGhlcmVzXG4gICAgICAgIHNoYXBlID0gbmV3IEFtbW8uYnRDYXBzdWxlU2hhcGUoZGVzY3JpcHRpb24ucmFkaXVzLCBkZXNjcmlwdGlvbi5oZWlnaHQgLSAyICogZGVzY3JpcHRpb24ucmFkaXVzKTtcbiAgICAgICAgc2V0U2hhcGVDYWNoZShjYWNoZV9rZXksIHNoYXBlKTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuICBjYXNlICdjb25lJzpcbiAgICB7XG4gICAgICBjb25zdCBjYWNoZV9rZXkgPSBgY29uZV8ke2Rlc2NyaXB0aW9uLnJhZGl1c31fJHtkZXNjcmlwdGlvbi5oZWlnaHR9YDtcblxuICAgICAgaWYgKChzaGFwZSA9IGdldFNoYXBlRnJvbUNhY2hlKGNhY2hlX2tleSkpID09PSBudWxsKSB7XG4gICAgICAgIHNoYXBlID0gbmV3IEFtbW8uYnRDb25lU2hhcGUoZGVzY3JpcHRpb24ucmFkaXVzLCBkZXNjcmlwdGlvbi5oZWlnaHQpO1xuICAgICAgICBzZXRTaGFwZUNhY2hlKGNhY2hlX2tleSwgc2hhcGUpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgICB9XG4gIGNhc2UgJ2NvbmNhdmUnOlxuICAgIHtcbiAgICAgIGNvbnN0IHRyaWFuZ2xlX21lc2ggPSBuZXcgQW1tby5idFRyaWFuZ2xlTWVzaCgpO1xuICAgICAgaWYgKCFkZXNjcmlwdGlvbi5kYXRhLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgZGF0YSA9IGRlc2NyaXB0aW9uLmRhdGE7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGggLyA5OyBpKyspIHtcbiAgICAgICAgX3ZlYzNfMS5zZXRYKGRhdGFbaSAqIDldKTtcbiAgICAgICAgX3ZlYzNfMS5zZXRZKGRhdGFbaSAqIDkgKyAxXSk7XG4gICAgICAgIF92ZWMzXzEuc2V0WihkYXRhW2kgKiA5ICsgMl0pO1xuXG4gICAgICAgIF92ZWMzXzIuc2V0WChkYXRhW2kgKiA5ICsgM10pO1xuICAgICAgICBfdmVjM18yLnNldFkoZGF0YVtpICogOSArIDRdKTtcbiAgICAgICAgX3ZlYzNfMi5zZXRaKGRhdGFbaSAqIDkgKyA1XSk7XG5cbiAgICAgICAgX3ZlYzNfMy5zZXRYKGRhdGFbaSAqIDkgKyA2XSk7XG4gICAgICAgIF92ZWMzXzMuc2V0WShkYXRhW2kgKiA5ICsgN10pO1xuICAgICAgICBfdmVjM18zLnNldFooZGF0YVtpICogOSArIDhdKTtcblxuICAgICAgICB0cmlhbmdsZV9tZXNoLmFkZFRyaWFuZ2xlKFxuICAgICAgICAgIF92ZWMzXzEsXG4gICAgICAgICAgX3ZlYzNfMixcbiAgICAgICAgICBfdmVjM18zLFxuICAgICAgICAgIGZhbHNlXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHNoYXBlID0gbmV3IEFtbW8uYnRCdmhUcmlhbmdsZU1lc2hTaGFwZShcbiAgICAgICAgdHJpYW5nbGVfbWVzaCxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcblxuICAgICAgX25vbmNhY2hlZF9zaGFwZXNbZGVzY3JpcHRpb24uaWRdID0gc2hhcGU7XG5cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgY2FzZSAnY29udmV4JzpcbiAgICB7XG4gICAgICBzaGFwZSA9IG5ldyBBbW1vLmJ0Q29udmV4SHVsbFNoYXBlKCk7XG4gICAgICBjb25zdCBkYXRhID0gZGVzY3JpcHRpb24uZGF0YTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aCAvIDM7IGkrKykge1xuICAgICAgICBfdmVjM18xLnNldFgoZGF0YVtpICogM10pO1xuICAgICAgICBfdmVjM18xLnNldFkoZGF0YVtpICogMyArIDFdKTtcbiAgICAgICAgX3ZlYzNfMS5zZXRaKGRhdGFbaSAqIDMgKyAyXSk7XG5cbiAgICAgICAgc2hhcGUuYWRkUG9pbnQoX3ZlYzNfMSk7XG4gICAgICB9XG5cbiAgICAgIF9ub25jYWNoZWRfc2hhcGVzW2Rlc2NyaXB0aW9uLmlkXSA9IHNoYXBlO1xuXG4gICAgICBicmVhaztcbiAgICB9XG4gIGNhc2UgJ2hlaWdodGZpZWxkJzpcbiAgICB7XG4gICAgICBjb25zdCB4cHRzID0gZGVzY3JpcHRpb24ueHB0cyxcbiAgICAgICAgeXB0cyA9IGRlc2NyaXB0aW9uLnlwdHMsXG4gICAgICAgIHBvaW50cyA9IGRlc2NyaXB0aW9uLnBvaW50cyxcbiAgICAgICAgcHRyID0gQW1tby5fbWFsbG9jKDQgKiB4cHRzICogeXB0cyk7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwLCBwID0gMCwgcDIgPSAwOyBpIDwgeHB0czsgaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgeXB0czsgaisrKSB7XG4gICAgICAgICAgQW1tby5IRUFQRjMyW3B0ciArIHAyID4+IDJdID0gcG9pbnRzW3BdO1xuXG4gICAgICAgICAgcCsrO1xuICAgICAgICAgIHAyICs9IDQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2hhcGUgPSBuZXcgQW1tby5idEhlaWdodGZpZWxkVGVycmFpblNoYXBlKFxuICAgICAgICBkZXNjcmlwdGlvbi54cHRzLFxuICAgICAgICBkZXNjcmlwdGlvbi55cHRzLFxuICAgICAgICBwdHIsXG4gICAgICAgIDEsIC1kZXNjcmlwdGlvbi5hYnNNYXhIZWlnaHQsXG4gICAgICAgIGRlc2NyaXB0aW9uLmFic01heEhlaWdodCxcbiAgICAgICAgMSxcbiAgICAgICAgJ1BIWV9GTE9BVCcsXG4gICAgICAgIGZhbHNlXG4gICAgICApO1xuXG4gICAgICBfbm9uY2FjaGVkX3NoYXBlc1tkZXNjcmlwdGlvbi5pZF0gPSBzaGFwZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgZGVmYXVsdDpcbiAgICAvLyBOb3QgcmVjb2duaXplZFxuICAgIHJldHVybjtcbiAgfVxuXG4gIHJldHVybiBzaGFwZTtcbn07XG5cbmNvbnN0IGNyZWF0ZVNvZnRCb2R5ID0gKGRlc2NyaXB0aW9uKSA9PiB7XG4gIGxldCBib2R5O1xuXG4gIGNvbnN0IHNvZnRCb2R5SGVscGVycyA9IG5ldyBBbW1vLmJ0U29mdEJvZHlIZWxwZXJzKCk7XG5cbiAgc3dpdGNoIChkZXNjcmlwdGlvbi50eXBlKSB7XG4gIGNhc2UgJ3NvZnRUcmltZXNoJzpcbiAgICB7XG4gICAgICBpZiAoIWRlc2NyaXB0aW9uLmFWZXJ0aWNlcy5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgICAgYm9keSA9IHNvZnRCb2R5SGVscGVycy5DcmVhdGVGcm9tVHJpTWVzaChcbiAgICAgICAgd29ybGQuZ2V0V29ybGRJbmZvKCksXG4gICAgICAgIGRlc2NyaXB0aW9uLmFWZXJ0aWNlcyxcbiAgICAgICAgZGVzY3JpcHRpb24uYUluZGljZXMsXG4gICAgICAgIGRlc2NyaXB0aW9uLmFJbmRpY2VzLmxlbmd0aCAvIDMsXG4gICAgICAgIGZhbHNlXG4gICAgICApO1xuXG4gICAgICBicmVhaztcbiAgICB9XG4gIGNhc2UgJ3NvZnRDbG90aE1lc2gnOlxuICAgIHtcbiAgICAgIGNvbnN0IGNyID0gZGVzY3JpcHRpb24uY29ybmVycztcblxuICAgICAgYm9keSA9IHNvZnRCb2R5SGVscGVycy5DcmVhdGVQYXRjaChcbiAgICAgICAgd29ybGQuZ2V0V29ybGRJbmZvKCksXG4gICAgICAgIG5ldyBBbW1vLmJ0VmVjdG9yMyhjclswXSwgY3JbMV0sIGNyWzJdKSxcbiAgICAgICAgbmV3IEFtbW8uYnRWZWN0b3IzKGNyWzNdLCBjcls0XSwgY3JbNV0pLFxuICAgICAgICBuZXcgQW1tby5idFZlY3RvcjMoY3JbNl0sIGNyWzddLCBjcls4XSksXG4gICAgICAgIG5ldyBBbW1vLmJ0VmVjdG9yMyhjcls5XSwgY3JbMTBdLCBjclsxMV0pLFxuICAgICAgICBkZXNjcmlwdGlvbi5zZWdtZW50c1swXSxcbiAgICAgICAgZGVzY3JpcHRpb24uc2VnbWVudHNbMV0sXG4gICAgICAgIDAsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG5cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgY2FzZSAnc29mdFJvcGVNZXNoJzpcbiAgICB7XG4gICAgICBjb25zdCBkYXRhID0gZGVzY3JpcHRpb24uZGF0YTtcblxuICAgICAgYm9keSA9IHNvZnRCb2R5SGVscGVycy5DcmVhdGVSb3BlKFxuICAgICAgICB3b3JsZC5nZXRXb3JsZEluZm8oKSxcbiAgICAgICAgbmV3IEFtbW8uYnRWZWN0b3IzKGRhdGFbMF0sIGRhdGFbMV0sIGRhdGFbMl0pLFxuICAgICAgICBuZXcgQW1tby5idFZlY3RvcjMoZGF0YVszXSwgZGF0YVs0XSwgZGF0YVs1XSksXG4gICAgICAgIGRhdGFbNl0gLSAxLFxuICAgICAgICAwXG4gICAgICApO1xuXG4gICAgICBicmVhaztcbiAgICB9XG4gIGRlZmF1bHQ6XG4gICAgLy8gTm90IHJlY29nbml6ZWRcbiAgICByZXR1cm47XG4gIH1cblxuICByZXR1cm4gYm9keTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuaW5pdCA9IChwYXJhbXMgPSB7fSkgPT4ge1xuICBpZiAocGFyYW1zLm5vV29ya2VyKSB7XG4gICAgd2luZG93LkFtbW8gPSBuZXcgcGFyYW1zLmFtbW8oKTtcbiAgICBwdWJsaWNfZnVuY3Rpb25zLm1ha2VXb3JsZChwYXJhbXMpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChwYXJhbXMud2FzbUJ1ZmZlcikge1xuICAgIGltcG9ydFNjcmlwdHMocGFyYW1zLmFtbW8pO1xuXG4gICAgc2VsZi5BbW1vID0gbmV3IGxvYWRBbW1vRnJvbUJpbmFyeShwYXJhbXMud2FzbUJ1ZmZlcikoKTtcbiAgICBzZW5kKHsgY21kOiAnYW1tb0xvYWRlZCcgfSk7XG4gICAgcHVibGljX2Z1bmN0aW9ucy5tYWtlV29ybGQocGFyYW1zKTtcbiAgfVxuICBlbHNlIHtcbiAgICBpbXBvcnRTY3JpcHRzKHBhcmFtcy5hbW1vKTtcbiAgICBzZW5kKHsgY21kOiAnYW1tb0xvYWRlZCcgfSk7XG5cbiAgICBzZWxmLkFtbW8gPSBuZXcgQW1tbygpO1xuICAgIHB1YmxpY19mdW5jdGlvbnMubWFrZVdvcmxkKHBhcmFtcyk7XG4gIH1cbn1cblxucHVibGljX2Z1bmN0aW9ucy5tYWtlV29ybGQgPSAocGFyYW1zID0ge30pID0+IHtcbiAgX3RyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7XG4gIF90cmFuc2Zvcm1fcG9zID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTtcbiAgX3ZlYzNfMSA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLCAwLCAwKTtcbiAgX3ZlYzNfMiA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLCAwLCAwKTtcbiAgX3ZlYzNfMyA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLCAwLCAwKTtcbiAgX3F1YXQgPSBuZXcgQW1tby5idFF1YXRlcm5pb24oMCwgMCwgMCwgMCk7XG5cbiAgUkVQT1JUX0NIVU5LU0laRSA9IHBhcmFtcy5yZXBvcnRzaXplIHx8IDUwO1xuXG4gIGlmIChTVVBQT1JUX1RSQU5TRkVSQUJMRSkge1xuICAgIC8vIFRyYW5zZmVyYWJsZSBtZXNzYWdlcyBhcmUgc3VwcG9ydGVkLCB0YWtlIGFkdmFudGFnZSBvZiB0aGVtIHdpdGggVHlwZWRBcnJheXNcbiAgICB3b3JsZHJlcG9ydCA9IG5ldyBGbG9hdDMyQXJyYXkoMiArIFJFUE9SVF9DSFVOS1NJWkUgKiBXT1JMRFJFUE9SVF9JVEVNU0laRSk7IC8vIG1lc3NhZ2UgaWQgKyAjIG9mIG9iamVjdHMgdG8gcmVwb3J0ICsgY2h1bmsgc2l6ZSAqICMgb2YgdmFsdWVzIHBlciBvYmplY3RcbiAgICBjb2xsaXNpb25yZXBvcnQgPSBuZXcgRmxvYXQzMkFycmF5KDIgKyBSRVBPUlRfQ0hVTktTSVpFICogQ09MTElTSU9OUkVQT1JUX0lURU1TSVpFKTsgLy8gbWVzc2FnZSBpZCArICMgb2YgY29sbGlzaW9ucyB0byByZXBvcnQgKyBjaHVuayBzaXplICogIyBvZiB2YWx1ZXMgcGVyIG9iamVjdFxuICAgIHZlaGljbGVyZXBvcnQgPSBuZXcgRmxvYXQzMkFycmF5KDIgKyBSRVBPUlRfQ0hVTktTSVpFICogVkVISUNMRVJFUE9SVF9JVEVNU0laRSk7IC8vIG1lc3NhZ2UgaWQgKyAjIG9mIHZlaGljbGVzIHRvIHJlcG9ydCArIGNodW5rIHNpemUgKiAjIG9mIHZhbHVlcyBwZXIgb2JqZWN0XG4gICAgY29uc3RyYWludHJlcG9ydCA9IG5ldyBGbG9hdDMyQXJyYXkoMiArIFJFUE9SVF9DSFVOS1NJWkUgKiBDT05TVFJBSU5UUkVQT1JUX0lURU1TSVpFKTsgLy8gbWVzc2FnZSBpZCArICMgb2YgY29uc3RyYWludHMgdG8gcmVwb3J0ICsgY2h1bmsgc2l6ZSAqICMgb2YgdmFsdWVzIHBlciBvYmplY3RcbiAgfVxuICBlbHNlIHtcbiAgICAvLyBUcmFuc2ZlcmFibGUgbWVzc2FnZXMgYXJlIG5vdCBzdXBwb3J0ZWQsIHNlbmQgZGF0YSBhcyBub3JtYWwgYXJyYXlzXG4gICAgd29ybGRyZXBvcnQgPSBbXTtcbiAgICBjb2xsaXNpb25yZXBvcnQgPSBbXTtcbiAgICB2ZWhpY2xlcmVwb3J0ID0gW107XG4gICAgY29uc3RyYWludHJlcG9ydCA9IFtdO1xuICB9XG5cbiAgd29ybGRyZXBvcnRbMF0gPSBNRVNTQUdFX1RZUEVTLldPUkxEUkVQT1JUO1xuICBjb2xsaXNpb25yZXBvcnRbMF0gPSBNRVNTQUdFX1RZUEVTLkNPTExJU0lPTlJFUE9SVDtcbiAgdmVoaWNsZXJlcG9ydFswXSA9IE1FU1NBR0VfVFlQRVMuVkVISUNMRVJFUE9SVDtcbiAgY29uc3RyYWludHJlcG9ydFswXSA9IE1FU1NBR0VfVFlQRVMuQ09OU1RSQUlOVFJFUE9SVDtcblxuICBjb25zdCBjb2xsaXNpb25Db25maWd1cmF0aW9uID0gcGFyYW1zLnNvZnRib2R5ID9cbiAgICBuZXcgQW1tby5idFNvZnRCb2R5UmlnaWRCb2R5Q29sbGlzaW9uQ29uZmlndXJhdGlvbigpIDpcbiAgICBuZXcgQW1tby5idERlZmF1bHRDb2xsaXNpb25Db25maWd1cmF0aW9uKCksXG4gICAgZGlzcGF0Y2hlciA9IG5ldyBBbW1vLmJ0Q29sbGlzaW9uRGlzcGF0Y2hlcihjb2xsaXNpb25Db25maWd1cmF0aW9uKSxcbiAgICBzb2x2ZXIgPSBuZXcgQW1tby5idFNlcXVlbnRpYWxJbXB1bHNlQ29uc3RyYWludFNvbHZlcigpO1xuXG4gIGxldCBicm9hZHBoYXNlO1xuXG4gIGlmICghcGFyYW1zLmJyb2FkcGhhc2UpIHBhcmFtcy5icm9hZHBoYXNlID0geyB0eXBlOiAnZHluYW1pYycgfTtcbiAgLy8gVE9ETyEhIVxuICAvKiBpZiAocGFyYW1zLmJyb2FkcGhhc2UudHlwZSA9PT0gJ3N3ZWVwcHJ1bmUnKSB7XG4gICAgZXh0ZW5kKHBhcmFtcy5icm9hZHBoYXNlLCB7XG4gICAgICBhYWJibWluOiB7XG4gICAgICAgIHg6IC01MCxcbiAgICAgICAgeTogLTUwLFxuICAgICAgICB6OiAtNTBcbiAgICAgIH0sXG5cbiAgICAgIGFhYmJtYXg6IHtcbiAgICAgICAgeDogNTAsXG4gICAgICAgIHk6IDUwLFxuICAgICAgICB6OiA1MFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSovXG5cbiAgc3dpdGNoIChwYXJhbXMuYnJvYWRwaGFzZS50eXBlKSB7XG4gIGNhc2UgJ3N3ZWVwcHJ1bmUnOlxuICAgIF92ZWMzXzEuc2V0WChwYXJhbXMuYnJvYWRwaGFzZS5hYWJibWluLngpO1xuICAgIF92ZWMzXzEuc2V0WShwYXJhbXMuYnJvYWRwaGFzZS5hYWJibWluLnkpO1xuICAgIF92ZWMzXzEuc2V0WihwYXJhbXMuYnJvYWRwaGFzZS5hYWJibWluLnopO1xuXG4gICAgX3ZlYzNfMi5zZXRYKHBhcmFtcy5icm9hZHBoYXNlLmFhYmJtYXgueCk7XG4gICAgX3ZlYzNfMi5zZXRZKHBhcmFtcy5icm9hZHBoYXNlLmFhYmJtYXgueSk7XG4gICAgX3ZlYzNfMi5zZXRaKHBhcmFtcy5icm9hZHBoYXNlLmFhYmJtYXgueik7XG5cbiAgICBicm9hZHBoYXNlID0gbmV3IEFtbW8uYnRBeGlzU3dlZXAzKFxuICAgICAgX3ZlYzNfMSxcbiAgICAgIF92ZWMzXzJcbiAgICApO1xuXG4gICAgYnJlYWs7XG4gIGNhc2UgJ2R5bmFtaWMnOlxuICBkZWZhdWx0OlxuICAgIGJyb2FkcGhhc2UgPSBuZXcgQW1tby5idERidnRCcm9hZHBoYXNlKCk7XG4gICAgYnJlYWs7XG4gIH1cblxuICB3b3JsZCA9IHBhcmFtcy5zb2Z0Ym9keSA/XG4gICAgbmV3IEFtbW8uYnRTb2Z0UmlnaWREeW5hbWljc1dvcmxkKGRpc3BhdGNoZXIsIGJyb2FkcGhhc2UsIHNvbHZlciwgY29sbGlzaW9uQ29uZmlndXJhdGlvbiwgbmV3IEFtbW8uYnREZWZhdWx0U29mdEJvZHlTb2x2ZXIoKSkgOlxuICAgIG5ldyBBbW1vLmJ0RGlzY3JldGVEeW5hbWljc1dvcmxkKGRpc3BhdGNoZXIsIGJyb2FkcGhhc2UsIHNvbHZlciwgY29sbGlzaW9uQ29uZmlndXJhdGlvbik7XG4gIGZpeGVkVGltZVN0ZXAgPSBwYXJhbXMuZml4ZWRUaW1lU3RlcDtcblxuICBpZiAocGFyYW1zLnNvZnRib2R5KSBfc29mdGJvZHlfZW5hYmxlZCA9IHRydWU7XG5cbiAgc2VuZCh7IGNtZDogJ3dvcmxkUmVhZHknIH0pO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5zZXRGaXhlZFRpbWVTdGVwID0gKGRlc2NyaXB0aW9uKSA9PiB7XG4gIGZpeGVkVGltZVN0ZXAgPSBkZXNjcmlwdGlvbjtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuc2V0R3Jhdml0eSA9IChkZXNjcmlwdGlvbikgPT4ge1xuICBfdmVjM18xLnNldFgoZGVzY3JpcHRpb24ueCk7XG4gIF92ZWMzXzEuc2V0WShkZXNjcmlwdGlvbi55KTtcbiAgX3ZlYzNfMS5zZXRaKGRlc2NyaXB0aW9uLnopO1xuICB3b3JsZC5zZXRHcmF2aXR5KF92ZWMzXzEpO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5hcHBlbmRBbmNob3IgPSAoZGVzY3JpcHRpb24pID0+IHtcbiAgX29iamVjdHNbZGVzY3JpcHRpb24ub2JqXVxuICAgIC5hcHBlbmRBbmNob3IoXG4gICAgICBkZXNjcmlwdGlvbi5ub2RlLFxuICAgICAgX29iamVjdHNbZGVzY3JpcHRpb24ub2JqMl0sXG4gICAgICBkZXNjcmlwdGlvbi5jb2xsaXNpb25CZXR3ZWVuTGlua2VkQm9kaWVzLFxuICAgICAgZGVzY3JpcHRpb24uaW5mbHVlbmNlXG4gICAgKTtcbn1cblxucHVibGljX2Z1bmN0aW9ucy5saW5rTm9kZXMgPSAoZGVzY3JpcHRpb24pID0+IHtcbiAgdmFyIHNlbGZfYm9keSA9IF9vYmplY3RzW2Rlc2NyaXB0aW9uLnNlbGZdO1xuICB2YXIgb3RoZXJfYm9keSA9IF9vYmplY3RzW2Rlc2NyaXB0aW9uLmJvZHldO1xuXG4gIHZhciBzZWxmX25vZGUgPSBzZWxmX2JvZHkuZ2V0X21fbm9kZXMoKS5hdChkZXNjcmlwdGlvbi5uMSk7XG4gIHZhciBvdGhlcl9ub2RlID0gb3RoZXJfYm9keS5nZXRfbV9ub2RlcygpLmF0KGRlc2NyaXB0aW9uLm4yKTtcblxuICB2YXIgc2VsZl92ZWMgPSBzZWxmX25vZGUuZ2V0X21feCgpO1xuICB2YXIgb3RoZXJfdmVjID0gb3RoZXJfbm9kZS5nZXRfbV94KCk7XG5cbiAgdmFyIGZvcmNlX3ggPSBvdGhlcl92ZWMueCgpIC0gc2VsZl92ZWMueCgpO1xuICB2YXIgZm9yY2VfeSA9IG90aGVyX3ZlYy55KCkgLSBzZWxmX3ZlYy55KCk7XG4gIHZhciBmb3JjZV96ID0gb3RoZXJfdmVjLnooKSAtIHNlbGZfdmVjLnooKTtcblxuXG4gIC8vIHZhciBtb2RpZmllciA9IDMwO1xuXG4gIGxldCBjYWNoZWRfZGlzdGFuY2UsIGxpbmtlZCA9IGZhbHNlO1xuXG4gIGNvbnN0IF9sb29wID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIGZvcmNlX3ggPSBvdGhlcl92ZWMueCgpIC0gc2VsZl92ZWMueCgpO1xuICAgIGZvcmNlX3kgPSBvdGhlcl92ZWMueSgpIC0gc2VsZl92ZWMueSgpO1xuICAgIGZvcmNlX3ogPSBvdGhlcl92ZWMueigpIC0gc2VsZl92ZWMueigpO1xuXG4gICAgbGV0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGZvcmNlX3ggKiBmb3JjZV94ICsgZm9yY2VfeSAqIGZvcmNlX3kgKyBmb3JjZV96ICogZm9yY2Vfeik7XG5cbiAgICBpZiAoY2FjaGVkX2Rpc3RhbmNlICYmICFsaW5rZWQgJiYgY2FjaGVkX2Rpc3RhbmNlIDwgZGlzdGFuY2UpIHsgLy8gY2FjaGVkX2Rpc3RhbmNlICYmICFsaW5rZWQgJiYgY2FjaGVkX2Rpc3RhbmNlIDwgZGlzdGFuY2VcblxuICAgICAgbGlua2VkID0gdHJ1ZTtcblxuICAgICAgLy8gbGV0IHNlbGZfdmVsID0gc2VsZl9ub2RlLmdldF9tX3YoKTtcbiAgICAgIC8vXG4gICAgICAvLyBfdmVjM18xLnNldFgoLXNlbGZfdmVsLngoKSk7XG4gICAgICAvLyBfdmVjM18xLnNldFkoLXNlbGZfdmVsLnkoKSk7XG4gICAgICAvLyBfdmVjM18xLnNldFooLXNlbGZfdmVsLnooKSk7XG4gICAgICAvL1xuICAgICAgLy8gbGV0IG90aGVyX3ZlbCA9IG90aGVyX25vZGUuZ2V0X21fdigpO1xuICAgICAgLy9cbiAgICAgIC8vIF92ZWMzXzIuc2V0WCgtb3RoZXJfdmVsLngoKSk7XG4gICAgICAvLyBfdmVjM18yLnNldFkoLW90aGVyX3ZlbC55KCkpO1xuICAgICAgLy8gX3ZlYzNfMi5zZXRaKC1vdGhlcl92ZWwueigpKTtcblxuICAgICAgY29uc29sZS5sb2coJ2xpbmshJyk7XG5cbiAgICAgIF92ZWMzXzEuc2V0WCgwKTtcbiAgICAgIF92ZWMzXzEuc2V0WSgwKTtcbiAgICAgIF92ZWMzXzEuc2V0WigwKTtcblxuICAgICAgc2VsZl9ib2R5LnNldFZlbG9jaXR5KFxuICAgICAgICBfdmVjM18xXG4gICAgICApO1xuXG4gICAgICBvdGhlcl9ib2R5LnNldFZlbG9jaXR5KFxuICAgICAgICBfdmVjM18xXG4gICAgICApO1xuXG5cblxuICAgICAgLy8gc2VsZl9ib2R5LmFkZFZlbG9jaXR5KF92ZWMzXzEpO1xuICAgICAgLy8gb3RoZXJfYm9keS5hZGRWZWxvY2l0eShfdmVjM18yKTtcblxuICAgICAgLy8gc2VsZl9yZWxhdGl2ZV94ID0gc2VsZl9ub2RlLngoKTtcbiAgICAgIC8vIHNlbGZfcmVsYXRpdmVfeSA9IHNlbGZfbm9kZS55KCk7XG4gICAgICAvLyBzZWxmX3JlbGF0aXZlX3ogPSBzZWxmX25vZGUueigpO1xuICAgICAgLy9cbiAgICAgIC8vIG90aGVyX3JlbGF0aXZlX3ggPSBvdGhlcl9ub2RlLngoKTtcbiAgICAgIC8vIG90aGVyX3JlbGF0aXZlX3kgPSBvdGhlcl9ub2RlLnkoKTtcbiAgICAgIC8vIG90aGVyX3JlbGF0aXZlX3ogPSBvdGhlcl9ub2RlLnooKTtcblxuICAgICAgLy8gc2VsZl9yZWxhdGl2ZSA9IG5ldyBBbW1vLmJ0VmVjdG9yMygpO1xuICAgICAgLy8gc2VsZl9yZWxhdGl2ZS5zZXRYKCk7XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKCdsaW5rIScpO1xuICAgICAgLy8gc2VsZl9ib2R5LmFwcGVuZEFuY2hvcihkZXNjcmlwdGlvbi5uMSwgY29ubmVjdG9yLCB0cnVlLCAwLjUpO1xuICAgICAgLy8gb3RoZXJfYm9keS5hcHBlbmRBbmNob3IoZGVzY3JpcHRpb24ubjIsIGNvbm5lY3RvciwgdHJ1ZSwgMC41KTtcbiAgICAgIC8vIGNsZWFySW50ZXJ2YWwoX2xvb3ApO1xuXG4gICAgICAvLyBfdmVjM18xLnNldFgoMCk7XG4gICAgICAvLyBfdmVjM18xLnNldFkoMCk7XG4gICAgICAvLyBfdmVjM18xLnNldFooMCk7XG5cbiAgICAgIC8vIHNlbGZfYm9keS5zZXRWZWxvY2l0eShfdmVjM18xKTtcbiAgICAgIC8vIG90aGVyX2JvZHkuc2V0VmVsb2NpdHkoX3ZlYzNfMSk7XG5cbiAgICAgIC8vIG90aGVyX2JvZHkuYWRkRm9yY2UoXG4gICAgICAvLyAgIF92ZWMzXzIsXG4gICAgICAvLyAgIGRlc2NyaXB0aW9uLm4yXG4gICAgICAvLyApO1xuXG4gICAgICAvLyBkZXNjcmlwdGlvbi5tb2RpZmllciAqPSAxLjY7XG4gICAgfVxuXG4gICAgY29uc3QgbW9kaWZlcjIgPSBsaW5rZWQgPyA0MCA6IDE7XG5cbiAgICBmb3JjZV94ICo9IE1hdGgubWF4KGRpc3RhbmNlLCAxKSAqIGRlc2NyaXB0aW9uLm1vZGlmaWVyICogbW9kaWZlcjI7XG4gICAgZm9yY2VfeSAqPSBNYXRoLm1heChkaXN0YW5jZSwgMSkgKiBkZXNjcmlwdGlvbi5tb2RpZmllciAqIG1vZGlmZXIyO1xuICAgIGZvcmNlX3ogKj0gTWF0aC5tYXgoZGlzdGFuY2UsIDEpICogZGVzY3JpcHRpb24ubW9kaWZpZXIgKiBtb2RpZmVyMjtcblxuICAgIF92ZWMzXzEuc2V0WChmb3JjZV94KTtcbiAgICBfdmVjM18xLnNldFkoZm9yY2VfeSk7XG4gICAgX3ZlYzNfMS5zZXRaKGZvcmNlX3opO1xuXG4gICAgX3ZlYzNfMi5zZXRYKC1mb3JjZV94KTtcbiAgICBfdmVjM18yLnNldFkoLWZvcmNlX3kpO1xuICAgIF92ZWMzXzIuc2V0WigtZm9yY2Vfeik7XG5cbiAgICBzZWxmX2JvZHkuYWRkVmVsb2NpdHkoXG4gICAgICBfdmVjM18xLFxuICAgICAgZGVzY3JpcHRpb24ubjFcbiAgICApO1xuXG4gICAgb3RoZXJfYm9keS5hZGRWZWxvY2l0eShcbiAgICAgIF92ZWMzXzIsXG4gICAgICBkZXNjcmlwdGlvbi5uMlxuICAgICk7XG5cbiAgICAvLyB9IGVsc2Uge1xuICAgIC8vICAgLy8gc2VsZl9yZWxhdGl2ZV94ID0gbnVsbDtcbiAgICAvLyB9XG5cblxuXG4gICAgLy8gaWYgKHNlbGZfcmVsYXRpdmVfeCkge1xuICAgIC8vICAgX3ZlYzNfMS5zZXRYKHNlbGZfcmVsYXRpdmVfeCAtIHNlbGZfbm9kZS54KCkpO1xuICAgIC8vICAgX3ZlYzNfMS5zZXRZKHNlbGZfcmVsYXRpdmVfeSAtIHNlbGZfbm9kZS55KCkpO1xuICAgIC8vICAgX3ZlYzNfMS5zZXRaKHNlbGZfcmVsYXRpdmVfeiAtIHNlbGZfbm9kZS56KCkpO1xuICAgIC8vXG4gICAgLy8gICBfdmVjM18yLnNldFgob3RoZXJfcmVsYXRpdmVfeCAtIG90aGVyX25vZGUueCgpKTtcbiAgICAvLyAgIF92ZWMzXzIuc2V0WShvdGhlcl9yZWxhdGl2ZV95IC0gb3RoZXJfbm9kZS55KCkpO1xuICAgIC8vICAgX3ZlYzNfMi5zZXRaKG90aGVyX3JlbGF0aXZlX3ogLSBvdGhlcl9ub2RlLnooKSk7XG4gICAgLy8gfSBlbHNlIHtcblxuICAgIC8vIH1cblxuXG5cblxuICAgIGNhY2hlZF9kaXN0YW5jZSA9IGRpc3RhbmNlO1xuICB9LCAxMCk7XG59XG5cbnB1YmxpY19mdW5jdGlvbnMuYXBwZW5kTGluayA9IChkZXNjcmlwdGlvbikgPT4ge1xuICAvLyBjb25zb2xlLmxvZyhBbW1vKTtcbiAgLy8gY29uc29sZS5sb2cobmV3IEFtbW8uTWF0ZXJpYWwoKSk7XG5cbiAgLy8gdmFyIF9tYXQgPSBuZXcgQW1tby5NYXRlcmlhbCgpO1xuICAvL1xuICAvLyBfbWF0LnNldF9tX2tBU1QoMCk7XG4gIC8vIF9tYXQuc2V0X21fa0xTVCgwKTtcbiAgLy8gX21hdC5zZXRfbV9rVlNUKDApO1xuICAvL1xuICAvLyBfb2JqZWN0c1tkZXNjcmlwdGlvbi5zZWxmXS5hcHBlbmRMaW5rKFxuICAvLyAgIGRlc2NyaXB0aW9uLm4xLFxuICAvLyAgIGRlc2NyaXB0aW9uLm4yLFxuICAvLyAgIF9tYXQsXG4gIC8vICAgZmFsc2VcbiAgLy8gKTtcblxuICBfdmVjM18xLnNldFgoMTAwMCk7XG4gIF92ZWMzXzEuc2V0WSgwKTtcbiAgX3ZlYzNfMS5zZXRaKDApO1xuXG4gIF9vYmplY3RzW2Rlc2NyaXB0aW9uLnNlbGZdLmFkZEZvcmNlKFxuICAgIF92ZWMzXzEsXG4gICAgZGVzY3JpcHRpb24ubjFcbiAgKTtcbn1cblxucHVibGljX2Z1bmN0aW9ucy5hcHBlbmRMaW5lYXJKb2ludCA9IChkZXNjcmlwdGlvbikgPT4ge1xuICAvLyBjb25zb2xlLmxvZygnQW1tbycsIEFtbW8pO1xuICB2YXIgc3BlY3MgPSBuZXcgQW1tby5TcGVjcygpO1xuICB2YXIgX3BvcyA9IGRlc2NyaXB0aW9uLnNwZWNzLnBvc2l0aW9uO1xuXG4gIHNwZWNzLnNldF9wb3NpdGlvbihuZXcgQW1tby5idFZlY3RvcjMoX3Bvc1swXSwgX3Bvc1sxXSwgX3Bvc1syXSkpO1xuICBpZiAoZGVzY3JpcHRpb24uc3BlY3MuZXJwKSBzcGVjcy5zZXRfZXJwKGRlc2NyaXB0aW9uLnNwZWNzLmVycCk7XG4gIGlmIChkZXNjcmlwdGlvbi5zcGVjcy5jZm0pIHNwZWNzLnNldF9jZm0oZGVzY3JpcHRpb24uc3BlY3MuY2ZtKTtcbiAgaWYgKGRlc2NyaXB0aW9uLnNwZWNzLnNwbGl0KSBzcGVjcy5zZXRfc3BsaXQoZGVzY3JpcHRpb24uc3BlY3Muc3BsaXQpO1xuXG4gIC8vIGNvbnNvbGUubG9nKHNwZWNzKTtcbiAgLy9cbiAgLy8gLy8gbGpvaW50LnNldF9tX3Jwb3MoXG4gIC8vIC8vICAgbmV3IEFtbW8uYnRWZWN0b3IzKF9wb3MxWzBdLCBfcG9zMVsxXSwgX3BvczFbMl0pLFxuICAvLyAvLyAgIG5ldyBBbW1vLmJ0VmVjdG9yMyhfcG9zMlswXSwgX3BvczJbMV0sIF9wb3MyWzJdKVxuICAvLyAvLyApO1xuICAvL1xuICAvLyAvLyBjb25zb2xlLmxvZygnbGpvaW50JywgbGpvaW50KTtcbiAgLy9cblxuICAvLyBjb25zb2xlLmxvZygnYm9keScsIF9vYmplY3RzW2Rlc2NyaXB0aW9uLmJvZHldKTtcbiAgX29iamVjdHNbZGVzY3JpcHRpb24uc2VsZl1cbiAgICAuYXBwZW5kTGluZWFySm9pbnQoXG4gICAgICBzcGVjcyxcbiAgICAgIF9vYmplY3RzW2Rlc2NyaXB0aW9uLmJvZHldXG4gICAgKTtcbn1cblxucHVibGljX2Z1bmN0aW9ucy5hZGRPYmplY3QgPSAoZGVzY3JpcHRpb24pID0+IHtcbiAgbGV0IGJvZHksIG1vdGlvblN0YXRlO1xuXG4gIGlmIChkZXNjcmlwdGlvbi50eXBlLmluZGV4T2YoJ3NvZnQnKSAhPT0gLTEpIHtcbiAgICBib2R5ID0gY3JlYXRlU29mdEJvZHkoZGVzY3JpcHRpb24pO1xuXG4gICAgY29uc3Qgc2JDb25maWcgPSBib2R5LmdldF9tX2NmZygpO1xuXG4gICAgaWYgKGRlc2NyaXB0aW9uLnZpdGVyYXRpb25zKSBzYkNvbmZpZy5zZXRfdml0ZXJhdGlvbnMoZGVzY3JpcHRpb24udml0ZXJhdGlvbnMpO1xuICAgIGlmIChkZXNjcmlwdGlvbi5waXRlcmF0aW9ucykgc2JDb25maWcuc2V0X3BpdGVyYXRpb25zKGRlc2NyaXB0aW9uLnBpdGVyYXRpb25zKTtcbiAgICBpZiAoZGVzY3JpcHRpb24uZGl0ZXJhdGlvbnMpIHNiQ29uZmlnLnNldF9kaXRlcmF0aW9ucyhkZXNjcmlwdGlvbi5kaXRlcmF0aW9ucyk7XG4gICAgaWYgKGRlc2NyaXB0aW9uLmNpdGVyYXRpb25zKSBzYkNvbmZpZy5zZXRfY2l0ZXJhdGlvbnMoZGVzY3JpcHRpb24uY2l0ZXJhdGlvbnMpO1xuICAgIHNiQ29uZmlnLnNldF9jb2xsaXNpb25zKDB4MTEpO1xuICAgIHNiQ29uZmlnLnNldF9rREYoZGVzY3JpcHRpb24uZnJpY3Rpb24pO1xuICAgIHNiQ29uZmlnLnNldF9rRFAoZGVzY3JpcHRpb24uZGFtcGluZyk7XG4gICAgaWYgKGRlc2NyaXB0aW9uLnByZXNzdXJlKSBzYkNvbmZpZy5zZXRfa1BSKGRlc2NyaXB0aW9uLnByZXNzdXJlKTtcbiAgICBpZiAoZGVzY3JpcHRpb24uZHJhZykgc2JDb25maWcuc2V0X2tERyhkZXNjcmlwdGlvbi5kcmFnKTtcbiAgICBpZiAoZGVzY3JpcHRpb24ubGlmdCkgc2JDb25maWcuc2V0X2tMRihkZXNjcmlwdGlvbi5saWZ0KTtcbiAgICBpZiAoZGVzY3JpcHRpb24uYW5jaG9ySGFyZG5lc3MpIHNiQ29uZmlnLnNldF9rQUhSKGRlc2NyaXB0aW9uLmFuY2hvckhhcmRuZXNzKTtcbiAgICBpZiAoZGVzY3JpcHRpb24ucmlnaWRIYXJkbmVzcykgc2JDb25maWcuc2V0X2tDSFIoZGVzY3JpcHRpb24ucmlnaWRIYXJkbmVzcyk7XG5cbiAgICBpZiAoZGVzY3JpcHRpb24ua2xzdCkgYm9keS5nZXRfbV9tYXRlcmlhbHMoKS5hdCgwKS5zZXRfbV9rTFNUKGRlc2NyaXB0aW9uLmtsc3QpO1xuICAgIGlmIChkZXNjcmlwdGlvbi5rYXN0KSBib2R5LmdldF9tX21hdGVyaWFscygpLmF0KDApLnNldF9tX2tBU1QoZGVzY3JpcHRpb24ua2FzdCk7XG4gICAgaWYgKGRlc2NyaXB0aW9uLmt2c3QpIGJvZHkuZ2V0X21fbWF0ZXJpYWxzKCkuYXQoMCkuc2V0X21fa1ZTVChkZXNjcmlwdGlvbi5rdnN0KTtcblxuICAgIEFtbW8uY2FzdE9iamVjdChib2R5LCBBbW1vLmJ0Q29sbGlzaW9uT2JqZWN0KS5nZXRDb2xsaXNpb25TaGFwZSgpLnNldE1hcmdpbihcbiAgICAgIHR5cGVvZiBkZXNjcmlwdGlvbi5tYXJnaW4gIT09ICd1bmRlZmluZWQnID8gZGVzY3JpcHRpb24ubWFyZ2luIDogMC4xXG4gICAgKTtcblxuICAgIC8vIEFtbW8uY2FzdE9iamVjdChib2R5LCBBbW1vLmJ0Q29sbGlzaW9uT2JqZWN0KS5nZXRDb2xsaXNpb25TaGFwZSgpLnNldE1hcmdpbigwKTtcblxuICAgIC8vIEFtbW8uY2FzdE9iamVjdChib2R5LCBBbW1vLmJ0Q29sbGlzaW9uT2JqZWN0KS5nZXRDb2xsaXNpb25TaGFwZSgpLnNldExvY2FsU2NhbGluZyhfdmVjM18xKTtcbiAgICBib2R5LnNldEFjdGl2YXRpb25TdGF0ZShkZXNjcmlwdGlvbi5zdGF0ZSB8fCA0KTtcbiAgICBib2R5LnR5cGUgPSAwOyAvLyBTb2Z0Qm9keS5cbiAgICBpZiAoZGVzY3JpcHRpb24udHlwZSA9PT0gJ3NvZnRSb3BlTWVzaCcpIGJvZHkucm9wZSA9IHRydWU7XG4gICAgaWYgKGRlc2NyaXB0aW9uLnR5cGUgPT09ICdzb2Z0Q2xvdGhNZXNoJykgYm9keS5jbG90aCA9IHRydWU7XG5cbiAgICBfdHJhbnNmb3JtLnNldElkZW50aXR5KCk7XG5cbiAgICAvLyBAdGVzdFxuICAgIF9xdWF0LnNldFgoZGVzY3JpcHRpb24ucm90YXRpb24ueCk7XG4gICAgX3F1YXQuc2V0WShkZXNjcmlwdGlvbi5yb3RhdGlvbi55KTtcbiAgICBfcXVhdC5zZXRaKGRlc2NyaXB0aW9uLnJvdGF0aW9uLnopO1xuICAgIF9xdWF0LnNldFcoZGVzY3JpcHRpb24ucm90YXRpb24udyk7XG4gICAgYm9keS5yb3RhdGUoX3F1YXQpO1xuXG4gICAgX3ZlYzNfMS5zZXRYKGRlc2NyaXB0aW9uLnBvc2l0aW9uLngpO1xuICAgIF92ZWMzXzEuc2V0WShkZXNjcmlwdGlvbi5wb3NpdGlvbi55KTtcbiAgICBfdmVjM18xLnNldFooZGVzY3JpcHRpb24ucG9zaXRpb24ueik7XG4gICAgYm9keS50cmFuc2xhdGUoX3ZlYzNfMSk7XG5cbiAgICBfdmVjM18xLnNldFgoZGVzY3JpcHRpb24uc2NhbGUueCk7XG4gICAgX3ZlYzNfMS5zZXRZKGRlc2NyaXB0aW9uLnNjYWxlLnkpO1xuICAgIF92ZWMzXzEuc2V0WihkZXNjcmlwdGlvbi5zY2FsZS56KTtcbiAgICBib2R5LnNjYWxlKF92ZWMzXzEpO1xuXG4gICAgYm9keS5zZXRUb3RhbE1hc3MoZGVzY3JpcHRpb24ubWFzcywgZmFsc2UpO1xuICAgIHdvcmxkLmFkZFNvZnRCb2R5KGJvZHksIDEsIC0xKTtcbiAgICBpZiAoZGVzY3JpcHRpb24udHlwZSA9PT0gJ3NvZnRUcmltZXNoJykgX3NvZnRib2R5X3JlcG9ydF9zaXplICs9IGJvZHkuZ2V0X21fZmFjZXMoKS5zaXplKCkgKiAzO1xuICAgIGVsc2UgaWYgKGRlc2NyaXB0aW9uLnR5cGUgPT09ICdzb2Z0Um9wZU1lc2gnKSBfc29mdGJvZHlfcmVwb3J0X3NpemUgKz0gYm9keS5nZXRfbV9ub2RlcygpLnNpemUoKTtcbiAgICBlbHNlIF9zb2Z0Ym9keV9yZXBvcnRfc2l6ZSArPSBib2R5LmdldF9tX25vZGVzKCkuc2l6ZSgpICogMztcblxuICAgIF9udW1fc29mdGJvZHlfb2JqZWN0cysrO1xuICB9XG4gIGVsc2Uge1xuICAgIGxldCBzaGFwZSA9IGNyZWF0ZVNoYXBlKGRlc2NyaXB0aW9uKTtcblxuICAgIGlmICghc2hhcGUpIHJldHVybjtcblxuICAgIC8vIElmIHRoZXJlIGFyZSBjaGlsZHJlbiB0aGVuIHRoaXMgaXMgYSBjb21wb3VuZCBzaGFwZVxuICAgIGlmIChkZXNjcmlwdGlvbi5jaGlsZHJlbikge1xuICAgICAgY29uc3QgY29tcG91bmRfc2hhcGUgPSBuZXcgQW1tby5idENvbXBvdW5kU2hhcGUoKTtcbiAgICAgIGNvbXBvdW5kX3NoYXBlLmFkZENoaWxkU2hhcGUoX3RyYW5zZm9ybSwgc2hhcGUpO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlc2NyaXB0aW9uLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IF9jaGlsZCA9IGRlc2NyaXB0aW9uLmNoaWxkcmVuW2ldO1xuXG4gICAgICAgIGNvbnN0IHRyYW5zID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTtcbiAgICAgICAgdHJhbnMuc2V0SWRlbnRpdHkoKTtcblxuICAgICAgICBfdmVjM18xLnNldFgoX2NoaWxkLnBvc2l0aW9uX29mZnNldC54KTtcbiAgICAgICAgX3ZlYzNfMS5zZXRZKF9jaGlsZC5wb3NpdGlvbl9vZmZzZXQueSk7XG4gICAgICAgIF92ZWMzXzEuc2V0WihfY2hpbGQucG9zaXRpb25fb2Zmc2V0LnopO1xuICAgICAgICB0cmFucy5zZXRPcmlnaW4oX3ZlYzNfMSk7XG5cbiAgICAgICAgX3F1YXQuc2V0WChfY2hpbGQucm90YXRpb24ueCk7XG4gICAgICAgIF9xdWF0LnNldFkoX2NoaWxkLnJvdGF0aW9uLnkpO1xuICAgICAgICBfcXVhdC5zZXRaKF9jaGlsZC5yb3RhdGlvbi56KTtcbiAgICAgICAgX3F1YXQuc2V0VyhfY2hpbGQucm90YXRpb24udyk7XG4gICAgICAgIHRyYW5zLnNldFJvdGF0aW9uKF9xdWF0KTtcblxuICAgICAgICBzaGFwZSA9IGNyZWF0ZVNoYXBlKGRlc2NyaXB0aW9uLmNoaWxkcmVuW2ldKTtcbiAgICAgICAgY29tcG91bmRfc2hhcGUuYWRkQ2hpbGRTaGFwZSh0cmFucywgc2hhcGUpO1xuICAgICAgICBBbW1vLmRlc3Ryb3kodHJhbnMpO1xuICAgICAgfVxuXG4gICAgICBzaGFwZSA9IGNvbXBvdW5kX3NoYXBlO1xuICAgICAgX2NvbXBvdW5kX3NoYXBlc1tkZXNjcmlwdGlvbi5pZF0gPSBzaGFwZTtcbiAgICB9XG5cbiAgICBfdmVjM18xLnNldFgoZGVzY3JpcHRpb24uc2NhbGUueCk7XG4gICAgX3ZlYzNfMS5zZXRZKGRlc2NyaXB0aW9uLnNjYWxlLnkpO1xuICAgIF92ZWMzXzEuc2V0WihkZXNjcmlwdGlvbi5zY2FsZS56KTtcblxuICAgIHNoYXBlLnNldExvY2FsU2NhbGluZyhfdmVjM18xKTtcbiAgICBzaGFwZS5zZXRNYXJnaW4oXG4gICAgICB0eXBlb2YgZGVzY3JpcHRpb24ubWFyZ2luICE9PSAndW5kZWZpbmVkJyA/IGRlc2NyaXB0aW9uLm1hcmdpbiA6IDBcbiAgICApO1xuXG4gICAgX3ZlYzNfMS5zZXRYKDApO1xuICAgIF92ZWMzXzEuc2V0WSgwKTtcbiAgICBfdmVjM18xLnNldFooMCk7XG4gICAgc2hhcGUuY2FsY3VsYXRlTG9jYWxJbmVydGlhKGRlc2NyaXB0aW9uLm1hc3MsIF92ZWMzXzEpO1xuXG4gICAgX3RyYW5zZm9ybS5zZXRJZGVudGl0eSgpO1xuXG4gICAgX3ZlYzNfMi5zZXRYKGRlc2NyaXB0aW9uLnBvc2l0aW9uLngpO1xuICAgIF92ZWMzXzIuc2V0WShkZXNjcmlwdGlvbi5wb3NpdGlvbi55KTtcbiAgICBfdmVjM18yLnNldFooZGVzY3JpcHRpb24ucG9zaXRpb24ueik7XG4gICAgX3RyYW5zZm9ybS5zZXRPcmlnaW4oX3ZlYzNfMik7XG5cbiAgICBfcXVhdC5zZXRYKGRlc2NyaXB0aW9uLnJvdGF0aW9uLngpO1xuICAgIF9xdWF0LnNldFkoZGVzY3JpcHRpb24ucm90YXRpb24ueSk7XG4gICAgX3F1YXQuc2V0WihkZXNjcmlwdGlvbi5yb3RhdGlvbi56KTtcbiAgICBfcXVhdC5zZXRXKGRlc2NyaXB0aW9uLnJvdGF0aW9uLncpO1xuICAgIF90cmFuc2Zvcm0uc2V0Um90YXRpb24oX3F1YXQpO1xuXG4gICAgbW90aW9uU3RhdGUgPSBuZXcgQW1tby5idERlZmF1bHRNb3Rpb25TdGF0ZShfdHJhbnNmb3JtKTsgLy8gI1RPRE86IGJ0RGVmYXVsdE1vdGlvblN0YXRlIHN1cHBvcnRzIGNlbnRlciBvZiBtYXNzIG9mZnNldCBhcyBzZWNvbmQgYXJndW1lbnQgLSBpbXBsZW1lbnRcbiAgICBjb25zdCByYkluZm8gPSBuZXcgQW1tby5idFJpZ2lkQm9keUNvbnN0cnVjdGlvbkluZm8oZGVzY3JpcHRpb24ubWFzcywgbW90aW9uU3RhdGUsIHNoYXBlLCBfdmVjM18xKTtcblxuICAgIHJiSW5mby5zZXRfbV9mcmljdGlvbihkZXNjcmlwdGlvbi5mcmljdGlvbik7XG4gICAgcmJJbmZvLnNldF9tX3Jlc3RpdHV0aW9uKGRlc2NyaXB0aW9uLnJlc3RpdHV0aW9uKTtcbiAgICByYkluZm8uc2V0X21fbGluZWFyRGFtcGluZyhkZXNjcmlwdGlvbi5kYW1waW5nKTtcbiAgICByYkluZm8uc2V0X21fYW5ndWxhckRhbXBpbmcoZGVzY3JpcHRpb24uZGFtcGluZyk7XG5cbiAgICBib2R5ID0gbmV3IEFtbW8uYnRSaWdpZEJvZHkocmJJbmZvKTtcbiAgICBib2R5LnNldEFjdGl2YXRpb25TdGF0ZShkZXNjcmlwdGlvbi5zdGF0ZSB8fCA0KTtcbiAgICBBbW1vLmRlc3Ryb3kocmJJbmZvKTtcblxuICAgIGlmICh0eXBlb2YgZGVzY3JpcHRpb24uY29sbGlzaW9uX2ZsYWdzICE9PSAndW5kZWZpbmVkJykgYm9keS5zZXRDb2xsaXNpb25GbGFncyhkZXNjcmlwdGlvbi5jb2xsaXNpb25fZmxhZ3MpO1xuXG4gICAgaWYgKGRlc2NyaXB0aW9uLmdyb3VwICYmIGRlc2NyaXB0aW9uLm1hc2spIHdvcmxkLmFkZFJpZ2lkQm9keShib2R5LCBkZXNjcmlwdGlvbi5ncm91cCwgZGVzY3JpcHRpb24ubWFzayk7XG4gICAgZWxzZSB3b3JsZC5hZGRSaWdpZEJvZHkoYm9keSk7XG4gICAgYm9keS50eXBlID0gMTsgLy8gUmlnaWRCb2R5LlxuICAgIF9udW1fcmlnaWRib2R5X29iamVjdHMrKztcbiAgfVxuXG4gIGJvZHkuYWN0aXZhdGUoKTtcblxuICBib2R5LmlkID0gZGVzY3JpcHRpb24uaWQ7XG4gIF9vYmplY3RzW2JvZHkuaWRdID0gYm9keTtcbiAgX21vdGlvbl9zdGF0ZXNbYm9keS5pZF0gPSBtb3Rpb25TdGF0ZTtcblxuICBfb2JqZWN0c19hbW1vW2JvZHkuYSA9PT0gdW5kZWZpbmVkID8gYm9keS5wdHIgOiBib2R5LmFdID0gYm9keS5pZDtcbiAgX251bV9vYmplY3RzKys7XG5cbiAgc2VuZCh7IGNtZDogJ29iamVjdFJlYWR5JywgcGFyYW1zOiBib2R5LmlkIH0pO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5hZGRWZWhpY2xlID0gKGRlc2NyaXB0aW9uKSA9PiB7XG4gIGNvbnN0IHZlaGljbGVfdHVuaW5nID0gbmV3IEFtbW8uYnRWZWhpY2xlVHVuaW5nKCk7XG5cbiAgdmVoaWNsZV90dW5pbmcuc2V0X21fc3VzcGVuc2lvblN0aWZmbmVzcyhkZXNjcmlwdGlvbi5zdXNwZW5zaW9uX3N0aWZmbmVzcyk7XG4gIHZlaGljbGVfdHVuaW5nLnNldF9tX3N1c3BlbnNpb25Db21wcmVzc2lvbihkZXNjcmlwdGlvbi5zdXNwZW5zaW9uX2NvbXByZXNzaW9uKTtcbiAgdmVoaWNsZV90dW5pbmcuc2V0X21fc3VzcGVuc2lvbkRhbXBpbmcoZGVzY3JpcHRpb24uc3VzcGVuc2lvbl9kYW1waW5nKTtcbiAgdmVoaWNsZV90dW5pbmcuc2V0X21fbWF4U3VzcGVuc2lvblRyYXZlbENtKGRlc2NyaXB0aW9uLm1heF9zdXNwZW5zaW9uX3RyYXZlbCk7XG4gIHZlaGljbGVfdHVuaW5nLnNldF9tX21heFN1c3BlbnNpb25Gb3JjZShkZXNjcmlwdGlvbi5tYXhfc3VzcGVuc2lvbl9mb3JjZSk7XG5cbiAgY29uc3QgdmVoaWNsZSA9IG5ldyBBbW1vLmJ0UmF5Y2FzdFZlaGljbGUoXG4gICAgdmVoaWNsZV90dW5pbmcsXG4gICAgX29iamVjdHNbZGVzY3JpcHRpb24ucmlnaWRCb2R5XSxcbiAgICBuZXcgQW1tby5idERlZmF1bHRWZWhpY2xlUmF5Y2FzdGVyKHdvcmxkKVxuICApO1xuXG4gIHZlaGljbGUudHVuaW5nID0gdmVoaWNsZV90dW5pbmc7XG4gIF9vYmplY3RzW2Rlc2NyaXB0aW9uLnJpZ2lkQm9keV0uc2V0QWN0aXZhdGlvblN0YXRlKDQpO1xuICB2ZWhpY2xlLnNldENvb3JkaW5hdGVTeXN0ZW0oMCwgMSwgMik7XG5cbiAgd29ybGQuYWRkVmVoaWNsZSh2ZWhpY2xlKTtcbiAgX3ZlaGljbGVzW2Rlc2NyaXB0aW9uLmlkXSA9IHZlaGljbGU7XG59O1xucHVibGljX2Z1bmN0aW9ucy5yZW1vdmVWZWhpY2xlID0gKGRlc2NyaXB0aW9uKSA9PiB7XG4gIF92ZWhpY2xlc1tkZXNjcmlwdGlvbi5pZF0gPSBudWxsO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5hZGRXaGVlbCA9IChkZXNjcmlwdGlvbikgPT4ge1xuICBpZiAoX3ZlaGljbGVzW2Rlc2NyaXB0aW9uLmlkXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbGV0IHR1bmluZyA9IF92ZWhpY2xlc1tkZXNjcmlwdGlvbi5pZF0udHVuaW5nO1xuICAgIGlmIChkZXNjcmlwdGlvbi50dW5pbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHVuaW5nID0gbmV3IEFtbW8uYnRWZWhpY2xlVHVuaW5nKCk7XG4gICAgICB0dW5pbmcuc2V0X21fc3VzcGVuc2lvblN0aWZmbmVzcyhkZXNjcmlwdGlvbi50dW5pbmcuc3VzcGVuc2lvbl9zdGlmZm5lc3MpO1xuICAgICAgdHVuaW5nLnNldF9tX3N1c3BlbnNpb25Db21wcmVzc2lvbihkZXNjcmlwdGlvbi50dW5pbmcuc3VzcGVuc2lvbl9jb21wcmVzc2lvbik7XG4gICAgICB0dW5pbmcuc2V0X21fc3VzcGVuc2lvbkRhbXBpbmcoZGVzY3JpcHRpb24udHVuaW5nLnN1c3BlbnNpb25fZGFtcGluZyk7XG4gICAgICB0dW5pbmcuc2V0X21fbWF4U3VzcGVuc2lvblRyYXZlbENtKGRlc2NyaXB0aW9uLnR1bmluZy5tYXhfc3VzcGVuc2lvbl90cmF2ZWwpO1xuICAgICAgdHVuaW5nLnNldF9tX21heFN1c3BlbnNpb25Gb3JjZShkZXNjcmlwdGlvbi50dW5pbmcubWF4X3N1c3BlbnNpb25fZm9yY2UpO1xuICAgIH1cblxuICAgIF92ZWMzXzEuc2V0WChkZXNjcmlwdGlvbi5jb25uZWN0aW9uX3BvaW50LngpO1xuICAgIF92ZWMzXzEuc2V0WShkZXNjcmlwdGlvbi5jb25uZWN0aW9uX3BvaW50LnkpO1xuICAgIF92ZWMzXzEuc2V0WihkZXNjcmlwdGlvbi5jb25uZWN0aW9uX3BvaW50LnopO1xuXG4gICAgX3ZlYzNfMi5zZXRYKGRlc2NyaXB0aW9uLndoZWVsX2RpcmVjdGlvbi54KTtcbiAgICBfdmVjM18yLnNldFkoZGVzY3JpcHRpb24ud2hlZWxfZGlyZWN0aW9uLnkpO1xuICAgIF92ZWMzXzIuc2V0WihkZXNjcmlwdGlvbi53aGVlbF9kaXJlY3Rpb24ueik7XG5cbiAgICBfdmVjM18zLnNldFgoZGVzY3JpcHRpb24ud2hlZWxfYXhsZS54KTtcbiAgICBfdmVjM18zLnNldFkoZGVzY3JpcHRpb24ud2hlZWxfYXhsZS55KTtcbiAgICBfdmVjM18zLnNldFooZGVzY3JpcHRpb24ud2hlZWxfYXhsZS56KTtcblxuICAgIF92ZWhpY2xlc1tkZXNjcmlwdGlvbi5pZF0uYWRkV2hlZWwoXG4gICAgICBfdmVjM18xLFxuICAgICAgX3ZlYzNfMixcbiAgICAgIF92ZWMzXzMsXG4gICAgICBkZXNjcmlwdGlvbi5zdXNwZW5zaW9uX3Jlc3RfbGVuZ3RoLFxuICAgICAgZGVzY3JpcHRpb24ud2hlZWxfcmFkaXVzLFxuICAgICAgdHVuaW5nLFxuICAgICAgZGVzY3JpcHRpb24uaXNfZnJvbnRfd2hlZWxcbiAgICApO1xuICB9XG5cbiAgX251bV93aGVlbHMrKztcblxuICBpZiAoU1VQUE9SVF9UUkFOU0ZFUkFCTEUpIHtcbiAgICB2ZWhpY2xlcmVwb3J0ID0gbmV3IEZsb2F0MzJBcnJheSgxICsgX251bV93aGVlbHMgKiBWRUhJQ0xFUkVQT1JUX0lURU1TSVpFKTsgLy8gbWVzc2FnZSBpZCAmICggIyBvZiBvYmplY3RzIHRvIHJlcG9ydCAqICMgb2YgdmFsdWVzIHBlciBvYmplY3QgKVxuICAgIHZlaGljbGVyZXBvcnRbMF0gPSBNRVNTQUdFX1RZUEVTLlZFSElDTEVSRVBPUlQ7XG4gIH1cbiAgZWxzZSB2ZWhpY2xlcmVwb3J0ID0gW01FU1NBR0VfVFlQRVMuVkVISUNMRVJFUE9SVF07XG59O1xuXG5wdWJsaWNfZnVuY3Rpb25zLnNldFN0ZWVyaW5nID0gKGRldGFpbHMpID0+IHtcbiAgaWYgKF92ZWhpY2xlc1tkZXRhaWxzLmlkXSAhPT0gdW5kZWZpbmVkKSBfdmVoaWNsZXNbZGV0YWlscy5pZF0uc2V0U3RlZXJpbmdWYWx1ZShkZXRhaWxzLnN0ZWVyaW5nLCBkZXRhaWxzLndoZWVsKTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuc2V0QnJha2UgPSAoZGV0YWlscykgPT4ge1xuICBpZiAoX3ZlaGljbGVzW2RldGFpbHMuaWRdICE9PSB1bmRlZmluZWQpIF92ZWhpY2xlc1tkZXRhaWxzLmlkXS5zZXRCcmFrZShkZXRhaWxzLmJyYWtlLCBkZXRhaWxzLndoZWVsKTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuYXBwbHlFbmdpbmVGb3JjZSA9IChkZXRhaWxzKSA9PiB7XG4gIGlmIChfdmVoaWNsZXNbZGV0YWlscy5pZF0gIT09IHVuZGVmaW5lZCkgX3ZlaGljbGVzW2RldGFpbHMuaWRdLmFwcGx5RW5naW5lRm9yY2UoZGV0YWlscy5mb3JjZSwgZGV0YWlscy53aGVlbCk7XG59O1xuXG5wdWJsaWNfZnVuY3Rpb25zLnJlbW92ZU9iamVjdCA9IChkZXRhaWxzKSA9PiB7XG4gIGlmIChfb2JqZWN0c1tkZXRhaWxzLmlkXS50eXBlID09PSAwKSB7XG4gICAgX251bV9zb2Z0Ym9keV9vYmplY3RzLS07XG4gICAgX3NvZnRib2R5X3JlcG9ydF9zaXplIC09IF9vYmplY3RzW2RldGFpbHMuaWRdLmdldF9tX25vZGVzKCkuc2l6ZSgpO1xuICAgIHdvcmxkLnJlbW92ZVNvZnRCb2R5KF9vYmplY3RzW2RldGFpbHMuaWRdKTtcbiAgfVxuICBlbHNlIGlmIChfb2JqZWN0c1tkZXRhaWxzLmlkXS50eXBlID09PSAxKSB7XG4gICAgX251bV9yaWdpZGJvZHlfb2JqZWN0cy0tO1xuICAgIHdvcmxkLnJlbW92ZVJpZ2lkQm9keShfb2JqZWN0c1tkZXRhaWxzLmlkXSk7XG4gICAgQW1tby5kZXN0cm95KF9tb3Rpb25fc3RhdGVzW2RldGFpbHMuaWRdKTtcbiAgfVxuXG4gIEFtbW8uZGVzdHJveShfb2JqZWN0c1tkZXRhaWxzLmlkXSk7XG4gIGlmIChfY29tcG91bmRfc2hhcGVzW2RldGFpbHMuaWRdKSBBbW1vLmRlc3Ryb3koX2NvbXBvdW5kX3NoYXBlc1tkZXRhaWxzLmlkXSk7XG4gIGlmIChfbm9uY2FjaGVkX3NoYXBlc1tkZXRhaWxzLmlkXSkgQW1tby5kZXN0cm95KF9ub25jYWNoZWRfc2hhcGVzW2RldGFpbHMuaWRdKTtcblxuICBfb2JqZWN0c19hbW1vW19vYmplY3RzW2RldGFpbHMuaWRdLmEgPT09IHVuZGVmaW5lZCA/IF9vYmplY3RzW2RldGFpbHMuaWRdLmEgOiBfb2JqZWN0c1tkZXRhaWxzLmlkXS5wdHJdID0gbnVsbDtcbiAgX29iamVjdHNbZGV0YWlscy5pZF0gPSBudWxsO1xuICBfbW90aW9uX3N0YXRlc1tkZXRhaWxzLmlkXSA9IG51bGw7XG5cbiAgaWYgKF9jb21wb3VuZF9zaGFwZXNbZGV0YWlscy5pZF0pIF9jb21wb3VuZF9zaGFwZXNbZGV0YWlscy5pZF0gPSBudWxsO1xuICBpZiAoX25vbmNhY2hlZF9zaGFwZXNbZGV0YWlscy5pZF0pIF9ub25jYWNoZWRfc2hhcGVzW2RldGFpbHMuaWRdID0gbnVsbDtcbiAgX251bV9vYmplY3RzLS07XG59O1xuXG5wdWJsaWNfZnVuY3Rpb25zLnVwZGF0ZVRyYW5zZm9ybSA9IChkZXRhaWxzKSA9PiB7XG4gIF9vYmplY3QgPSBfb2JqZWN0c1tkZXRhaWxzLmlkXTtcblxuICBpZiAoX29iamVjdC50eXBlID09PSAxKSB7XG4gICAgX29iamVjdC5nZXRNb3Rpb25TdGF0ZSgpLmdldFdvcmxkVHJhbnNmb3JtKF90cmFuc2Zvcm0pO1xuXG4gICAgaWYgKGRldGFpbHMucG9zKSB7XG4gICAgICBfdmVjM18xLnNldFgoZGV0YWlscy5wb3MueCk7XG4gICAgICBfdmVjM18xLnNldFkoZGV0YWlscy5wb3MueSk7XG4gICAgICBfdmVjM18xLnNldFooZGV0YWlscy5wb3Mueik7XG4gICAgICBfdHJhbnNmb3JtLnNldE9yaWdpbihfdmVjM18xKTtcbiAgICB9XG5cbiAgICBpZiAoZGV0YWlscy5xdWF0KSB7XG4gICAgICBfcXVhdC5zZXRYKGRldGFpbHMucXVhdC54KTtcbiAgICAgIF9xdWF0LnNldFkoZGV0YWlscy5xdWF0LnkpO1xuICAgICAgX3F1YXQuc2V0WihkZXRhaWxzLnF1YXQueik7XG4gICAgICBfcXVhdC5zZXRXKGRldGFpbHMucXVhdC53KTtcbiAgICAgIF90cmFuc2Zvcm0uc2V0Um90YXRpb24oX3F1YXQpO1xuICAgIH1cblxuICAgIF9vYmplY3Quc2V0V29ybGRUcmFuc2Zvcm0oX3RyYW5zZm9ybSk7XG4gICAgX29iamVjdC5hY3RpdmF0ZSgpO1xuICB9XG4gIGVsc2UgaWYgKF9vYmplY3QudHlwZSA9PT0gMCkge1xuICAgIC8vIF9vYmplY3QuZ2V0V29ybGRUcmFuc2Zvcm0oX3RyYW5zZm9ybSk7XG5cbiAgICBpZiAoZGV0YWlscy5wb3MpIHtcbiAgICAgIF92ZWMzXzEuc2V0WChkZXRhaWxzLnBvcy54KTtcbiAgICAgIF92ZWMzXzEuc2V0WShkZXRhaWxzLnBvcy55KTtcbiAgICAgIF92ZWMzXzEuc2V0WihkZXRhaWxzLnBvcy56KTtcbiAgICAgIF90cmFuc2Zvcm0uc2V0T3JpZ2luKF92ZWMzXzEpO1xuICAgIH1cblxuICAgIGlmIChkZXRhaWxzLnF1YXQpIHtcbiAgICAgIF9xdWF0LnNldFgoZGV0YWlscy5xdWF0LngpO1xuICAgICAgX3F1YXQuc2V0WShkZXRhaWxzLnF1YXQueSk7XG4gICAgICBfcXVhdC5zZXRaKGRldGFpbHMucXVhdC56KTtcbiAgICAgIF9xdWF0LnNldFcoZGV0YWlscy5xdWF0LncpO1xuICAgICAgX3RyYW5zZm9ybS5zZXRSb3RhdGlvbihfcXVhdCk7XG4gICAgfVxuXG4gICAgX29iamVjdC50cmFuc2Zvcm0oX3RyYW5zZm9ybSk7XG4gIH1cbn07XG5cbnB1YmxpY19mdW5jdGlvbnMudXBkYXRlTWFzcyA9IChkZXRhaWxzKSA9PiB7XG4gIC8vICNUT0RPOiBjaGFuZ2luZyBhIHN0YXRpYyBvYmplY3QgaW50byBkeW5hbWljIGlzIGJ1Z2d5XG4gIF9vYmplY3QgPSBfb2JqZWN0c1tkZXRhaWxzLmlkXTtcblxuICAvLyBQZXIgaHR0cDovL3d3dy5idWxsZXRwaHlzaWNzLm9yZy9CdWxsZXQvcGhwQkIzL3ZpZXd0b3BpYy5waHA/cD0mZj05JnQ9MzY2MyNwMTM4MTZcbiAgd29ybGQucmVtb3ZlUmlnaWRCb2R5KF9vYmplY3QpO1xuXG4gIF92ZWMzXzEuc2V0WCgwKTtcbiAgX3ZlYzNfMS5zZXRZKDApO1xuICBfdmVjM18xLnNldFooMCk7XG5cbiAgX29iamVjdC5zZXRNYXNzUHJvcHMoZGV0YWlscy5tYXNzLCBfdmVjM18xKTtcbiAgd29ybGQuYWRkUmlnaWRCb2R5KF9vYmplY3QpO1xuICBfb2JqZWN0LmFjdGl2YXRlKCk7XG59O1xuXG5wdWJsaWNfZnVuY3Rpb25zLmFwcGx5Q2VudHJhbEltcHVsc2UgPSAoZGV0YWlscykgPT4ge1xuICBfdmVjM18xLnNldFgoZGV0YWlscy54KTtcbiAgX3ZlYzNfMS5zZXRZKGRldGFpbHMueSk7XG4gIF92ZWMzXzEuc2V0WihkZXRhaWxzLnopO1xuXG4gIF9vYmplY3RzW2RldGFpbHMuaWRdLmFwcGx5Q2VudHJhbEltcHVsc2UoX3ZlYzNfMSk7XG4gIF9vYmplY3RzW2RldGFpbHMuaWRdLmFjdGl2YXRlKCk7XG59O1xuXG5wdWJsaWNfZnVuY3Rpb25zLmFwcGx5SW1wdWxzZSA9IChkZXRhaWxzKSA9PiB7XG4gIF92ZWMzXzEuc2V0WChkZXRhaWxzLmltcHVsc2VfeCk7XG4gIF92ZWMzXzEuc2V0WShkZXRhaWxzLmltcHVsc2VfeSk7XG4gIF92ZWMzXzEuc2V0WihkZXRhaWxzLmltcHVsc2Vfeik7XG5cbiAgX3ZlYzNfMi5zZXRYKGRldGFpbHMueCk7XG4gIF92ZWMzXzIuc2V0WShkZXRhaWxzLnkpO1xuICBfdmVjM18yLnNldFooZGV0YWlscy56KTtcblxuICBfb2JqZWN0c1tkZXRhaWxzLmlkXS5hcHBseUltcHVsc2UoXG4gICAgX3ZlYzNfMSxcbiAgICBfdmVjM18yXG4gICk7XG4gIF9vYmplY3RzW2RldGFpbHMuaWRdLmFjdGl2YXRlKCk7XG59O1xuXG5wdWJsaWNfZnVuY3Rpb25zLmFwcGx5VG9ycXVlID0gKGRldGFpbHMpID0+IHtcbiAgX3ZlYzNfMS5zZXRYKGRldGFpbHMudG9ycXVlX3gpO1xuICBfdmVjM18xLnNldFkoZGV0YWlscy50b3JxdWVfeSk7XG4gIF92ZWMzXzEuc2V0WihkZXRhaWxzLnRvcnF1ZV96KTtcblxuICBfb2JqZWN0c1tkZXRhaWxzLmlkXS5hcHBseVRvcnF1ZShcbiAgICBfdmVjM18xXG4gICk7XG4gIF9vYmplY3RzW2RldGFpbHMuaWRdLmFjdGl2YXRlKCk7XG59O1xuXG5wdWJsaWNfZnVuY3Rpb25zLmFwcGx5Q2VudHJhbEZvcmNlID0gKGRldGFpbHMpID0+IHtcbiAgX3ZlYzNfMS5zZXRYKGRldGFpbHMueCk7XG4gIF92ZWMzXzEuc2V0WShkZXRhaWxzLnkpO1xuICBfdmVjM18xLnNldFooZGV0YWlscy56KTtcblxuICBfb2JqZWN0c1tkZXRhaWxzLmlkXS5hcHBseUNlbnRyYWxGb3JjZShfdmVjM18xKTtcbiAgX29iamVjdHNbZGV0YWlscy5pZF0uYWN0aXZhdGUoKTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuYXBwbHlGb3JjZSA9IChkZXRhaWxzKSA9PiB7XG4gIF92ZWMzXzEuc2V0WChkZXRhaWxzLmZvcmNlX3gpO1xuICBfdmVjM18xLnNldFkoZGV0YWlscy5mb3JjZV95KTtcbiAgX3ZlYzNfMS5zZXRaKGRldGFpbHMuZm9yY2Vfeik7XG5cbiAgX3ZlYzNfMi5zZXRYKGRldGFpbHMueCk7XG4gIF92ZWMzXzIuc2V0WShkZXRhaWxzLnkpO1xuICBfdmVjM18yLnNldFooZGV0YWlscy56KTtcblxuICBfb2JqZWN0c1tkZXRhaWxzLmlkXS5hcHBseUZvcmNlKFxuICAgIF92ZWMzXzEsXG4gICAgX3ZlYzNfMlxuICApO1xuICBfb2JqZWN0c1tkZXRhaWxzLmlkXS5hY3RpdmF0ZSgpO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5vblNpbXVsYXRpb25SZXN1bWUgPSAoKSA9PiB7XG4gIGxhc3Rfc2ltdWxhdGlvbl90aW1lID0gRGF0ZS5ub3coKTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuc2V0QW5ndWxhclZlbG9jaXR5ID0gKGRldGFpbHMpID0+IHtcbiAgX3ZlYzNfMS5zZXRYKGRldGFpbHMueCk7XG4gIF92ZWMzXzEuc2V0WShkZXRhaWxzLnkpO1xuICBfdmVjM18xLnNldFooZGV0YWlscy56KTtcblxuICBfb2JqZWN0c1tkZXRhaWxzLmlkXS5zZXRBbmd1bGFyVmVsb2NpdHkoXG4gICAgX3ZlYzNfMVxuICApO1xuICBfb2JqZWN0c1tkZXRhaWxzLmlkXS5hY3RpdmF0ZSgpO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5zZXRMaW5lYXJWZWxvY2l0eSA9IChkZXRhaWxzKSA9PiB7XG4gIF92ZWMzXzEuc2V0WChkZXRhaWxzLngpO1xuICBfdmVjM18xLnNldFkoZGV0YWlscy55KTtcbiAgX3ZlYzNfMS5zZXRaKGRldGFpbHMueik7XG5cbiAgX29iamVjdHNbZGV0YWlscy5pZF0uc2V0TGluZWFyVmVsb2NpdHkoXG4gICAgX3ZlYzNfMVxuICApO1xuICBfb2JqZWN0c1tkZXRhaWxzLmlkXS5hY3RpdmF0ZSgpO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5zZXRBbmd1bGFyRmFjdG9yID0gKGRldGFpbHMpID0+IHtcbiAgX3ZlYzNfMS5zZXRYKGRldGFpbHMueCk7XG4gIF92ZWMzXzEuc2V0WShkZXRhaWxzLnkpO1xuICBfdmVjM18xLnNldFooZGV0YWlscy56KTtcblxuICBfb2JqZWN0c1tkZXRhaWxzLmlkXS5zZXRBbmd1bGFyRmFjdG9yKFxuICAgIF92ZWMzXzFcbiAgKTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuc2V0TGluZWFyRmFjdG9yID0gKGRldGFpbHMpID0+IHtcbiAgX3ZlYzNfMS5zZXRYKGRldGFpbHMueCk7XG4gIF92ZWMzXzEuc2V0WShkZXRhaWxzLnkpO1xuICBfdmVjM18xLnNldFooZGV0YWlscy56KTtcblxuICBfb2JqZWN0c1tkZXRhaWxzLmlkXS5zZXRMaW5lYXJGYWN0b3IoXG4gICAgX3ZlYzNfMVxuICApO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5zZXREYW1waW5nID0gKGRldGFpbHMpID0+IHtcbiAgX29iamVjdHNbZGV0YWlscy5pZF0uc2V0RGFtcGluZyhkZXRhaWxzLmxpbmVhciwgZGV0YWlscy5hbmd1bGFyKTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuc2V0Q2NkTW90aW9uVGhyZXNob2xkID0gKGRldGFpbHMpID0+IHtcbiAgX29iamVjdHNbZGV0YWlscy5pZF0uc2V0Q2NkTW90aW9uVGhyZXNob2xkKGRldGFpbHMudGhyZXNob2xkKTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuc2V0Q2NkU3dlcHRTcGhlcmVSYWRpdXMgPSAoZGV0YWlscykgPT4ge1xuICBfb2JqZWN0c1tkZXRhaWxzLmlkXS5zZXRDY2RTd2VwdFNwaGVyZVJhZGl1cyhkZXRhaWxzLnJhZGl1cyk7XG59O1xuXG5wdWJsaWNfZnVuY3Rpb25zLmFkZENvbnN0cmFpbnQgPSAoZGV0YWlscykgPT4ge1xuICBsZXQgY29uc3RyYWludDtcblxuICBzd2l0Y2ggKGRldGFpbHMudHlwZSkge1xuXG4gIGNhc2UgJ3BvaW50JzpcbiAgICB7XG4gICAgICBpZiAoZGV0YWlscy5vYmplY3RiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgX3ZlYzNfMS5zZXRYKGRldGFpbHMucG9zaXRpb25hLngpO1xuICAgICAgICBfdmVjM18xLnNldFkoZGV0YWlscy5wb3NpdGlvbmEueSk7XG4gICAgICAgIF92ZWMzXzEuc2V0WihkZXRhaWxzLnBvc2l0aW9uYS56KTtcblxuICAgICAgICBjb25zdHJhaW50ID0gbmV3IEFtbW8uYnRQb2ludDJQb2ludENvbnN0cmFpbnQoXG4gICAgICAgICAgX29iamVjdHNbZGV0YWlscy5vYmplY3RhXSxcbiAgICAgICAgICBfdmVjM18xXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgX3ZlYzNfMS5zZXRYKGRldGFpbHMucG9zaXRpb25hLngpO1xuICAgICAgICBfdmVjM18xLnNldFkoZGV0YWlscy5wb3NpdGlvbmEueSk7XG4gICAgICAgIF92ZWMzXzEuc2V0WihkZXRhaWxzLnBvc2l0aW9uYS56KTtcblxuICAgICAgICBfdmVjM18yLnNldFgoZGV0YWlscy5wb3NpdGlvbmIueCk7XG4gICAgICAgIF92ZWMzXzIuc2V0WShkZXRhaWxzLnBvc2l0aW9uYi55KTtcbiAgICAgICAgX3ZlYzNfMi5zZXRaKGRldGFpbHMucG9zaXRpb25iLnopO1xuXG4gICAgICAgIGNvbnN0cmFpbnQgPSBuZXcgQW1tby5idFBvaW50MlBvaW50Q29uc3RyYWludChcbiAgICAgICAgICBfb2JqZWN0c1tkZXRhaWxzLm9iamVjdGFdLFxuICAgICAgICAgIF9vYmplY3RzW2RldGFpbHMub2JqZWN0Yl0sXG4gICAgICAgICAgX3ZlYzNfMSxcbiAgICAgICAgICBfdmVjM18yXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gIGNhc2UgJ2hpbmdlJzpcbiAgICB7XG4gICAgICBpZiAoZGV0YWlscy5vYmplY3RiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgX3ZlYzNfMS5zZXRYKGRldGFpbHMucG9zaXRpb25hLngpO1xuICAgICAgICBfdmVjM18xLnNldFkoZGV0YWlscy5wb3NpdGlvbmEueSk7XG4gICAgICAgIF92ZWMzXzEuc2V0WihkZXRhaWxzLnBvc2l0aW9uYS56KTtcblxuICAgICAgICBfdmVjM18yLnNldFgoZGV0YWlscy5heGlzLngpO1xuICAgICAgICBfdmVjM18yLnNldFkoZGV0YWlscy5heGlzLnkpO1xuICAgICAgICBfdmVjM18yLnNldFooZGV0YWlscy5heGlzLnopO1xuXG4gICAgICAgIGNvbnN0cmFpbnQgPSBuZXcgQW1tby5idEhpbmdlQ29uc3RyYWludChcbiAgICAgICAgICBfb2JqZWN0c1tkZXRhaWxzLm9iamVjdGFdLFxuICAgICAgICAgIF92ZWMzXzEsXG4gICAgICAgICAgX3ZlYzNfMlxuICAgICAgICApO1xuXG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgX3ZlYzNfMS5zZXRYKGRldGFpbHMucG9zaXRpb25hLngpO1xuICAgICAgICBfdmVjM18xLnNldFkoZGV0YWlscy5wb3NpdGlvbmEueSk7XG4gICAgICAgIF92ZWMzXzEuc2V0WihkZXRhaWxzLnBvc2l0aW9uYS56KTtcblxuICAgICAgICBfdmVjM18yLnNldFgoZGV0YWlscy5wb3NpdGlvbmIueCk7XG4gICAgICAgIF92ZWMzXzIuc2V0WShkZXRhaWxzLnBvc2l0aW9uYi55KTtcbiAgICAgICAgX3ZlYzNfMi5zZXRaKGRldGFpbHMucG9zaXRpb25iLnopO1xuXG4gICAgICAgIF92ZWMzXzMuc2V0WChkZXRhaWxzLmF4aXMueCk7XG4gICAgICAgIF92ZWMzXzMuc2V0WShkZXRhaWxzLmF4aXMueSk7XG4gICAgICAgIF92ZWMzXzMuc2V0WihkZXRhaWxzLmF4aXMueik7XG5cbiAgICAgICAgY29uc3RyYWludCA9IG5ldyBBbW1vLmJ0SGluZ2VDb25zdHJhaW50KFxuICAgICAgICAgIF9vYmplY3RzW2RldGFpbHMub2JqZWN0YV0sXG4gICAgICAgICAgX29iamVjdHNbZGV0YWlscy5vYmplY3RiXSxcbiAgICAgICAgICBfdmVjM18xLFxuICAgICAgICAgIF92ZWMzXzIsXG4gICAgICAgICAgX3ZlYzNfMyxcbiAgICAgICAgICBfdmVjM18zXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gIGNhc2UgJ3NsaWRlcic6XG4gICAge1xuICAgICAgbGV0IHRyYW5zZm9ybWI7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1hID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTtcblxuICAgICAgX3ZlYzNfMS5zZXRYKGRldGFpbHMucG9zaXRpb25hLngpO1xuICAgICAgX3ZlYzNfMS5zZXRZKGRldGFpbHMucG9zaXRpb25hLnkpO1xuICAgICAgX3ZlYzNfMS5zZXRaKGRldGFpbHMucG9zaXRpb25hLnopO1xuXG4gICAgICB0cmFuc2Zvcm1hLnNldE9yaWdpbihfdmVjM18xKTtcblxuICAgICAgbGV0IHJvdGF0aW9uID0gdHJhbnNmb3JtYS5nZXRSb3RhdGlvbigpO1xuICAgICAgcm90YXRpb24uc2V0RXVsZXIoZGV0YWlscy5heGlzLngsIGRldGFpbHMuYXhpcy55LCBkZXRhaWxzLmF4aXMueik7XG4gICAgICB0cmFuc2Zvcm1hLnNldFJvdGF0aW9uKHJvdGF0aW9uKTtcblxuICAgICAgaWYgKGRldGFpbHMub2JqZWN0Yikge1xuICAgICAgICB0cmFuc2Zvcm1iID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTtcblxuICAgICAgICBfdmVjM18yLnNldFgoZGV0YWlscy5wb3NpdGlvbmIueCk7XG4gICAgICAgIF92ZWMzXzIuc2V0WShkZXRhaWxzLnBvc2l0aW9uYi55KTtcbiAgICAgICAgX3ZlYzNfMi5zZXRaKGRldGFpbHMucG9zaXRpb25iLnopO1xuXG4gICAgICAgIHRyYW5zZm9ybWIuc2V0T3JpZ2luKF92ZWMzXzIpO1xuXG4gICAgICAgIHJvdGF0aW9uID0gdHJhbnNmb3JtYi5nZXRSb3RhdGlvbigpO1xuICAgICAgICByb3RhdGlvbi5zZXRFdWxlcihkZXRhaWxzLmF4aXMueCwgZGV0YWlscy5heGlzLnksIGRldGFpbHMuYXhpcy56KTtcbiAgICAgICAgdHJhbnNmb3JtYi5zZXRSb3RhdGlvbihyb3RhdGlvbik7XG5cbiAgICAgICAgY29uc3RyYWludCA9IG5ldyBBbW1vLmJ0U2xpZGVyQ29uc3RyYWludChcbiAgICAgICAgICBfb2JqZWN0c1tkZXRhaWxzLm9iamVjdGFdLFxuICAgICAgICAgIF9vYmplY3RzW2RldGFpbHMub2JqZWN0Yl0sXG4gICAgICAgICAgdHJhbnNmb3JtYSxcbiAgICAgICAgICB0cmFuc2Zvcm1iLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdHJhaW50ID0gbmV3IEFtbW8uYnRTbGlkZXJDb25zdHJhaW50KFxuICAgICAgICAgIF9vYmplY3RzW2RldGFpbHMub2JqZWN0YV0sXG4gICAgICAgICAgdHJhbnNmb3JtYSxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0cmFpbnQudGEgPSB0cmFuc2Zvcm1hO1xuICAgICAgY29uc3RyYWludC50YiA9IHRyYW5zZm9ybWI7XG5cbiAgICAgIEFtbW8uZGVzdHJveSh0cmFuc2Zvcm1hKTtcbiAgICAgIGlmICh0cmFuc2Zvcm1iICE9PSB1bmRlZmluZWQpIEFtbW8uZGVzdHJveSh0cmFuc2Zvcm1iKTtcblxuICAgICAgYnJlYWs7XG4gICAgfVxuICBjYXNlICdjb25ldHdpc3QnOlxuICAgIHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWEgPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpO1xuICAgICAgdHJhbnNmb3JtYS5zZXRJZGVudGl0eSgpO1xuXG4gICAgICBjb25zdCB0cmFuc2Zvcm1iID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTtcbiAgICAgIHRyYW5zZm9ybWIuc2V0SWRlbnRpdHkoKTtcblxuICAgICAgX3ZlYzNfMS5zZXRYKGRldGFpbHMucG9zaXRpb25hLngpO1xuICAgICAgX3ZlYzNfMS5zZXRZKGRldGFpbHMucG9zaXRpb25hLnkpO1xuICAgICAgX3ZlYzNfMS5zZXRaKGRldGFpbHMucG9zaXRpb25hLnopO1xuXG4gICAgICBfdmVjM18yLnNldFgoZGV0YWlscy5wb3NpdGlvbmIueCk7XG4gICAgICBfdmVjM18yLnNldFkoZGV0YWlscy5wb3NpdGlvbmIueSk7XG4gICAgICBfdmVjM18yLnNldFooZGV0YWlscy5wb3NpdGlvbmIueik7XG5cbiAgICAgIHRyYW5zZm9ybWEuc2V0T3JpZ2luKF92ZWMzXzEpO1xuICAgICAgdHJhbnNmb3JtYi5zZXRPcmlnaW4oX3ZlYzNfMik7XG5cbiAgICAgIGxldCByb3RhdGlvbiA9IHRyYW5zZm9ybWEuZ2V0Um90YXRpb24oKTtcbiAgICAgIHJvdGF0aW9uLnNldEV1bGVyWllYKC1kZXRhaWxzLmF4aXNhLnosIC1kZXRhaWxzLmF4aXNhLnksIC1kZXRhaWxzLmF4aXNhLngpO1xuICAgICAgdHJhbnNmb3JtYS5zZXRSb3RhdGlvbihyb3RhdGlvbik7XG5cbiAgICAgIHJvdGF0aW9uID0gdHJhbnNmb3JtYi5nZXRSb3RhdGlvbigpO1xuICAgICAgcm90YXRpb24uc2V0RXVsZXJaWVgoLWRldGFpbHMuYXhpc2IueiwgLWRldGFpbHMuYXhpc2IueSwgLWRldGFpbHMuYXhpc2IueCk7XG4gICAgICB0cmFuc2Zvcm1iLnNldFJvdGF0aW9uKHJvdGF0aW9uKTtcblxuICAgICAgY29uc3RyYWludCA9IG5ldyBBbW1vLmJ0Q29uZVR3aXN0Q29uc3RyYWludChcbiAgICAgICAgX29iamVjdHNbZGV0YWlscy5vYmplY3RhXSxcbiAgICAgICAgX29iamVjdHNbZGV0YWlscy5vYmplY3RiXSxcbiAgICAgICAgdHJhbnNmb3JtYSxcbiAgICAgICAgdHJhbnNmb3JtYlxuICAgICAgKTtcblxuICAgICAgY29uc3RyYWludC5zZXRMaW1pdChNYXRoLlBJLCAwLCBNYXRoLlBJKTtcblxuICAgICAgY29uc3RyYWludC50YSA9IHRyYW5zZm9ybWE7XG4gICAgICBjb25zdHJhaW50LnRiID0gdHJhbnNmb3JtYjtcblxuICAgICAgQW1tby5kZXN0cm95KHRyYW5zZm9ybWEpO1xuICAgICAgQW1tby5kZXN0cm95KHRyYW5zZm9ybWIpO1xuXG4gICAgICBicmVhaztcbiAgICB9XG4gIGNhc2UgJ2RvZic6XG4gICAge1xuICAgICAgbGV0IHRyYW5zZm9ybWI7XG5cbiAgICAgIGNvbnN0IHRyYW5zZm9ybWEgPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpO1xuICAgICAgdHJhbnNmb3JtYS5zZXRJZGVudGl0eSgpO1xuXG4gICAgICBfdmVjM18xLnNldFgoZGV0YWlscy5wb3NpdGlvbmEueCk7XG4gICAgICBfdmVjM18xLnNldFkoZGV0YWlscy5wb3NpdGlvbmEueSk7XG4gICAgICBfdmVjM18xLnNldFooZGV0YWlscy5wb3NpdGlvbmEueik7XG5cbiAgICAgIHRyYW5zZm9ybWEuc2V0T3JpZ2luKF92ZWMzXzEpO1xuXG4gICAgICBsZXQgcm90YXRpb24gPSB0cmFuc2Zvcm1hLmdldFJvdGF0aW9uKCk7XG4gICAgICByb3RhdGlvbi5zZXRFdWxlclpZWCgtZGV0YWlscy5heGlzYS56LCAtZGV0YWlscy5heGlzYS55LCAtZGV0YWlscy5heGlzYS54KTtcbiAgICAgIHRyYW5zZm9ybWEuc2V0Um90YXRpb24ocm90YXRpb24pO1xuXG4gICAgICBpZiAoZGV0YWlscy5vYmplY3RiKSB7XG4gICAgICAgIHRyYW5zZm9ybWIgPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpO1xuICAgICAgICB0cmFuc2Zvcm1iLnNldElkZW50aXR5KCk7XG5cbiAgICAgICAgX3ZlYzNfMi5zZXRYKGRldGFpbHMucG9zaXRpb25iLngpO1xuICAgICAgICBfdmVjM18yLnNldFkoZGV0YWlscy5wb3NpdGlvbmIueSk7XG4gICAgICAgIF92ZWMzXzIuc2V0WihkZXRhaWxzLnBvc2l0aW9uYi56KTtcblxuICAgICAgICB0cmFuc2Zvcm1iLnNldE9yaWdpbihfdmVjM18yKTtcblxuICAgICAgICByb3RhdGlvbiA9IHRyYW5zZm9ybWIuZ2V0Um90YXRpb24oKTtcbiAgICAgICAgcm90YXRpb24uc2V0RXVsZXJaWVgoLWRldGFpbHMuYXhpc2IueiwgLWRldGFpbHMuYXhpc2IueSwgLWRldGFpbHMuYXhpc2IueCk7XG4gICAgICAgIHRyYW5zZm9ybWIuc2V0Um90YXRpb24ocm90YXRpb24pO1xuXG4gICAgICAgIGNvbnN0cmFpbnQgPSBuZXcgQW1tby5idEdlbmVyaWM2RG9mQ29uc3RyYWludChcbiAgICAgICAgICBfb2JqZWN0c1tkZXRhaWxzLm9iamVjdGFdLFxuICAgICAgICAgIF9vYmplY3RzW2RldGFpbHMub2JqZWN0Yl0sXG4gICAgICAgICAgdHJhbnNmb3JtYSxcbiAgICAgICAgICB0cmFuc2Zvcm1iLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdHJhaW50ID0gbmV3IEFtbW8uYnRHZW5lcmljNkRvZkNvbnN0cmFpbnQoXG4gICAgICAgICAgX29iamVjdHNbZGV0YWlscy5vYmplY3RhXSxcbiAgICAgICAgICB0cmFuc2Zvcm1hLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3RyYWludC50YSA9IHRyYW5zZm9ybWE7XG4gICAgICBjb25zdHJhaW50LnRiID0gdHJhbnNmb3JtYjtcblxuICAgICAgQW1tby5kZXN0cm95KHRyYW5zZm9ybWEpO1xuICAgICAgaWYgKHRyYW5zZm9ybWIgIT09IHVuZGVmaW5lZCkgQW1tby5kZXN0cm95KHRyYW5zZm9ybWIpO1xuXG4gICAgICBicmVhaztcbiAgICB9XG4gIGRlZmF1bHQ6XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgd29ybGQuYWRkQ29uc3RyYWludChjb25zdHJhaW50KTtcblxuICBjb25zdHJhaW50LmEgPSBfb2JqZWN0c1tkZXRhaWxzLm9iamVjdGFdO1xuICBjb25zdHJhaW50LmIgPSBfb2JqZWN0c1tkZXRhaWxzLm9iamVjdGJdO1xuXG4gIGNvbnN0cmFpbnQuZW5hYmxlRmVlZGJhY2soKTtcbiAgX2NvbnN0cmFpbnRzW2RldGFpbHMuaWRdID0gY29uc3RyYWludDtcbiAgX251bV9jb25zdHJhaW50cysrO1xuXG4gIGlmIChTVVBQT1JUX1RSQU5TRkVSQUJMRSkge1xuICAgIGNvbnN0cmFpbnRyZXBvcnQgPSBuZXcgRmxvYXQzMkFycmF5KDEgKyBfbnVtX2NvbnN0cmFpbnRzICogQ09OU1RSQUlOVFJFUE9SVF9JVEVNU0laRSk7IC8vIG1lc3NhZ2UgaWQgJiAoICMgb2Ygb2JqZWN0cyB0byByZXBvcnQgKiAjIG9mIHZhbHVlcyBwZXIgb2JqZWN0IClcbiAgICBjb25zdHJhaW50cmVwb3J0WzBdID0gTUVTU0FHRV9UWVBFUy5DT05TVFJBSU5UUkVQT1JUO1xuICB9XG4gIGVsc2UgY29uc3RyYWludHJlcG9ydCA9IFtNRVNTQUdFX1RZUEVTLkNPTlNUUkFJTlRSRVBPUlRdO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5yZW1vdmVDb25zdHJhaW50ID0gKGRldGFpbHMpID0+IHtcbiAgY29uc3QgY29uc3RyYWludCA9IF9jb25zdHJhaW50c1tkZXRhaWxzLmlkXTtcblxuICBpZiAoY29uc3RyYWludCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgd29ybGQucmVtb3ZlQ29uc3RyYWludChjb25zdHJhaW50KTtcbiAgICBfY29uc3RyYWludHNbZGV0YWlscy5pZF0gPSBudWxsO1xuICAgIF9udW1fY29uc3RyYWludHMtLTtcbiAgfVxufTtcblxucHVibGljX2Z1bmN0aW9ucy5jb25zdHJhaW50X3NldEJyZWFraW5nSW1wdWxzZVRocmVzaG9sZCA9IChkZXRhaWxzKSA9PiB7XG4gIGNvbnN0IGNvbnN0cmFpbnQgPSBfY29uc3RyYWludHNbZGV0YWlscy5pZF07XG4gIGlmIChjb25zdHJhaW50ICE9PSB1bmRlZmluZWQpIGNvbnN0cmFpbnQuc2V0QnJlYWtpbmdJbXB1bHNlVGhyZXNob2xkKGRldGFpbHMudGhyZXNob2xkKTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuc2ltdWxhdGUgPSAocGFyYW1zID0ge30pID0+IHtcbiAgaWYgKHdvcmxkKSB7XG4gICAgaWYgKHBhcmFtcy50aW1lU3RlcCAmJiBwYXJhbXMudGltZVN0ZXAgPCBmaXhlZFRpbWVTdGVwKVxuICAgICAgcGFyYW1zLnRpbWVTdGVwID0gZml4ZWRUaW1lU3RlcDtcblxuICAgIHBhcmFtcy5tYXhTdWJTdGVwcyA9IHBhcmFtcy5tYXhTdWJTdGVwcyB8fCBNYXRoLmNlaWwocGFyYW1zLnRpbWVTdGVwIC8gZml4ZWRUaW1lU3RlcCk7IC8vIElmIG1heFN1YlN0ZXBzIGlzIG5vdCBkZWZpbmVkLCBrZWVwIHRoZSBzaW11bGF0aW9uIGZ1bGx5IHVwIHRvIGRhdGVcblxuICAgIHdvcmxkLnN0ZXBTaW11bGF0aW9uKHBhcmFtcy50aW1lU3RlcCwgcGFyYW1zLm1heFN1YlN0ZXBzLCBmaXhlZFRpbWVTdGVwKTtcblxuICAgIGlmIChfdmVoaWNsZXMubGVuZ3RoID4gMCkgcmVwb3J0VmVoaWNsZXMoKTtcbiAgICByZXBvcnRDb2xsaXNpb25zKCk7XG4gICAgaWYgKF9jb25zdHJhaW50cy5sZW5ndGggPiAwKSByZXBvcnRDb25zdHJhaW50cygpO1xuICAgIHJlcG9ydFdvcmxkKCk7XG4gICAgaWYgKF9zb2Z0Ym9keV9lbmFibGVkKSByZXBvcnRXb3JsZF9zb2Z0Ym9kaWVzKCk7XG4gIH1cbn07XG5cbi8vIENvbnN0cmFpbnQgZnVuY3Rpb25zXG5wdWJsaWNfZnVuY3Rpb25zLmhpbmdlX3NldExpbWl0cyA9IChwYXJhbXMpID0+IHtcbiAgX2NvbnN0cmFpbnRzW3BhcmFtcy5jb25zdHJhaW50XS5zZXRMaW1pdChwYXJhbXMubG93LCBwYXJhbXMuaGlnaCwgMCwgcGFyYW1zLmJpYXNfZmFjdG9yLCBwYXJhbXMucmVsYXhhdGlvbl9mYWN0b3IpO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5oaW5nZV9lbmFibGVBbmd1bGFyTW90b3IgPSAocGFyYW1zKSA9PiB7XG4gIGNvbnN0IGNvbnN0cmFpbnQgPSBfY29uc3RyYWludHNbcGFyYW1zLmNvbnN0cmFpbnRdO1xuICBjb25zdHJhaW50LmVuYWJsZUFuZ3VsYXJNb3Rvcih0cnVlLCBwYXJhbXMudmVsb2NpdHksIHBhcmFtcy5hY2NlbGVyYXRpb24pO1xuICBjb25zdHJhaW50LmEuYWN0aXZhdGUoKTtcbiAgaWYgKGNvbnN0cmFpbnQuYikgY29uc3RyYWludC5iLmFjdGl2YXRlKCk7XG59O1xuXG5wdWJsaWNfZnVuY3Rpb25zLmhpbmdlX2Rpc2FibGVNb3RvciA9IChwYXJhbXMpID0+IHtcbiAgX2NvbnN0cmFpbnRzW3BhcmFtcy5jb25zdHJhaW50XS5lbmFibGVNb3RvcihmYWxzZSk7XG4gIGlmIChjb25zdHJhaW50LmIpIGNvbnN0cmFpbnQuYi5hY3RpdmF0ZSgpO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5zbGlkZXJfc2V0TGltaXRzID0gKHBhcmFtcykgPT4ge1xuICBjb25zdCBjb25zdHJhaW50ID0gX2NvbnN0cmFpbnRzW3BhcmFtcy5jb25zdHJhaW50XTtcbiAgY29uc3RyYWludC5zZXRMb3dlckxpbkxpbWl0KHBhcmFtcy5saW5fbG93ZXIgfHwgMCk7XG4gIGNvbnN0cmFpbnQuc2V0VXBwZXJMaW5MaW1pdChwYXJhbXMubGluX3VwcGVyIHx8IDApO1xuXG4gIGNvbnN0cmFpbnQuc2V0TG93ZXJBbmdMaW1pdChwYXJhbXMuYW5nX2xvd2VyIHx8IDApO1xuICBjb25zdHJhaW50LnNldFVwcGVyQW5nTGltaXQocGFyYW1zLmFuZ191cHBlciB8fCAwKTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuc2xpZGVyX3NldFJlc3RpdHV0aW9uID0gKHBhcmFtcykgPT4ge1xuICBjb25zdCBjb25zdHJhaW50ID0gX2NvbnN0cmFpbnRzW3BhcmFtcy5jb25zdHJhaW50XTtcbiAgY29uc3RyYWludC5zZXRTb2Z0bmVzc0xpbUxpbihwYXJhbXMubGluZWFyIHx8IDApO1xuICBjb25zdHJhaW50LnNldFNvZnRuZXNzTGltQW5nKHBhcmFtcy5hbmd1bGFyIHx8IDApO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5zbGlkZXJfZW5hYmxlTGluZWFyTW90b3IgPSAocGFyYW1zKSA9PiB7XG4gIGNvbnN0IGNvbnN0cmFpbnQgPSBfY29uc3RyYWludHNbcGFyYW1zLmNvbnN0cmFpbnRdO1xuICBjb25zdHJhaW50LnNldFRhcmdldExpbk1vdG9yVmVsb2NpdHkocGFyYW1zLnZlbG9jaXR5KTtcbiAgY29uc3RyYWludC5zZXRNYXhMaW5Nb3RvckZvcmNlKHBhcmFtcy5hY2NlbGVyYXRpb24pO1xuICBjb25zdHJhaW50LnNldFBvd2VyZWRMaW5Nb3Rvcih0cnVlKTtcbiAgY29uc3RyYWludC5hLmFjdGl2YXRlKCk7XG4gIGlmIChjb25zdHJhaW50LmIpIGNvbnN0cmFpbnQuYi5hY3RpdmF0ZSgpO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5zbGlkZXJfZGlzYWJsZUxpbmVhck1vdG9yID0gKHBhcmFtcykgPT4ge1xuICBjb25zdCBjb25zdHJhaW50ID0gX2NvbnN0cmFpbnRzW3BhcmFtcy5jb25zdHJhaW50XTtcbiAgY29uc3RyYWludC5zZXRQb3dlcmVkTGluTW90b3IoZmFsc2UpO1xuICBpZiAoY29uc3RyYWludC5iKSBjb25zdHJhaW50LmIuYWN0aXZhdGUoKTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuc2xpZGVyX2VuYWJsZUFuZ3VsYXJNb3RvciA9IChwYXJhbXMpID0+IHtcbiAgY29uc3QgY29uc3RyYWludCA9IF9jb25zdHJhaW50c1twYXJhbXMuY29uc3RyYWludF07XG4gIGNvbnN0cmFpbnQuc2V0VGFyZ2V0QW5nTW90b3JWZWxvY2l0eShwYXJhbXMudmVsb2NpdHkpO1xuICBjb25zdHJhaW50LnNldE1heEFuZ01vdG9yRm9yY2UocGFyYW1zLmFjY2VsZXJhdGlvbik7XG4gIGNvbnN0cmFpbnQuc2V0UG93ZXJlZEFuZ01vdG9yKHRydWUpO1xuICBjb25zdHJhaW50LmEuYWN0aXZhdGUoKTtcbiAgaWYgKGNvbnN0cmFpbnQuYikgY29uc3RyYWludC5iLmFjdGl2YXRlKCk7XG59O1xuXG5wdWJsaWNfZnVuY3Rpb25zLnNsaWRlcl9kaXNhYmxlQW5ndWxhck1vdG9yID0gKHBhcmFtcykgPT4ge1xuICBjb25zdCBjb25zdHJhaW50ID0gX2NvbnN0cmFpbnRzW3BhcmFtcy5jb25zdHJhaW50XTtcbiAgY29uc3RyYWludC5zZXRQb3dlcmVkQW5nTW90b3IoZmFsc2UpO1xuICBjb25zdHJhaW50LmEuYWN0aXZhdGUoKTtcbiAgaWYgKGNvbnN0cmFpbnQuYikgY29uc3RyYWludC5iLmFjdGl2YXRlKCk7XG59O1xuXG5wdWJsaWNfZnVuY3Rpb25zLmNvbmV0d2lzdF9zZXRMaW1pdCA9IChwYXJhbXMpID0+IHtcbiAgX2NvbnN0cmFpbnRzW3BhcmFtcy5jb25zdHJhaW50XS5zZXRMaW1pdChwYXJhbXMueiwgcGFyYW1zLnksIHBhcmFtcy54KTsgLy8gWllYIG9yZGVyXG59O1xuXG5wdWJsaWNfZnVuY3Rpb25zLmNvbmV0d2lzdF9lbmFibGVNb3RvciA9IChwYXJhbXMpID0+IHtcbiAgY29uc3QgY29uc3RyYWludCA9IF9jb25zdHJhaW50c1twYXJhbXMuY29uc3RyYWludF07XG4gIGNvbnN0cmFpbnQuZW5hYmxlTW90b3IodHJ1ZSk7XG4gIGNvbnN0cmFpbnQuYS5hY3RpdmF0ZSgpO1xuICBjb25zdHJhaW50LmIuYWN0aXZhdGUoKTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuY29uZXR3aXN0X3NldE1heE1vdG9ySW1wdWxzZSA9IChwYXJhbXMpID0+IHtcbiAgY29uc3QgY29uc3RyYWludCA9IF9jb25zdHJhaW50c1twYXJhbXMuY29uc3RyYWludF07XG4gIGNvbnN0cmFpbnQuc2V0TWF4TW90b3JJbXB1bHNlKHBhcmFtcy5tYXhfaW1wdWxzZSk7XG4gIGNvbnN0cmFpbnQuYS5hY3RpdmF0ZSgpO1xuICBjb25zdHJhaW50LmIuYWN0aXZhdGUoKTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuY29uZXR3aXN0X3NldE1vdG9yVGFyZ2V0ID0gKHBhcmFtcykgPT4ge1xuICBjb25zdCBjb25zdHJhaW50ID0gX2NvbnN0cmFpbnRzW3BhcmFtcy5jb25zdHJhaW50XTtcblxuICBfcXVhdC5zZXRYKHBhcmFtcy54KTtcbiAgX3F1YXQuc2V0WShwYXJhbXMueSk7XG4gIF9xdWF0LnNldFoocGFyYW1zLnopO1xuICBfcXVhdC5zZXRXKHBhcmFtcy53KTtcblxuICBjb25zdHJhaW50LnNldE1vdG9yVGFyZ2V0KF9xdWF0KTtcblxuICBjb25zdHJhaW50LmEuYWN0aXZhdGUoKTtcbiAgY29uc3RyYWludC5iLmFjdGl2YXRlKCk7XG59O1xuXG5wdWJsaWNfZnVuY3Rpb25zLmNvbmV0d2lzdF9kaXNhYmxlTW90b3IgPSAocGFyYW1zKSA9PiB7XG4gIGNvbnN0IGNvbnN0cmFpbnQgPSBfY29uc3RyYWludHNbcGFyYW1zLmNvbnN0cmFpbnRdO1xuICBjb25zdHJhaW50LmVuYWJsZU1vdG9yKGZhbHNlKTtcbiAgY29uc3RyYWludC5hLmFjdGl2YXRlKCk7XG4gIGNvbnN0cmFpbnQuYi5hY3RpdmF0ZSgpO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5kb2Zfc2V0TGluZWFyTG93ZXJMaW1pdCA9IChwYXJhbXMpID0+IHtcbiAgY29uc3QgY29uc3RyYWludCA9IF9jb25zdHJhaW50c1twYXJhbXMuY29uc3RyYWludF07XG5cbiAgX3ZlYzNfMS5zZXRYKHBhcmFtcy54KTtcbiAgX3ZlYzNfMS5zZXRZKHBhcmFtcy55KTtcbiAgX3ZlYzNfMS5zZXRaKHBhcmFtcy56KTtcblxuICBjb25zdHJhaW50LnNldExpbmVhckxvd2VyTGltaXQoX3ZlYzNfMSk7XG4gIGNvbnN0cmFpbnQuYS5hY3RpdmF0ZSgpO1xuXG4gIGlmIChjb25zdHJhaW50LmIpIGNvbnN0cmFpbnQuYi5hY3RpdmF0ZSgpO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5kb2Zfc2V0TGluZWFyVXBwZXJMaW1pdCA9IChwYXJhbXMpID0+IHtcbiAgY29uc3QgY29uc3RyYWludCA9IF9jb25zdHJhaW50c1twYXJhbXMuY29uc3RyYWludF07XG5cbiAgX3ZlYzNfMS5zZXRYKHBhcmFtcy54KTtcbiAgX3ZlYzNfMS5zZXRZKHBhcmFtcy55KTtcbiAgX3ZlYzNfMS5zZXRaKHBhcmFtcy56KTtcblxuICBjb25zdHJhaW50LnNldExpbmVhclVwcGVyTGltaXQoX3ZlYzNfMSk7XG4gIGNvbnN0cmFpbnQuYS5hY3RpdmF0ZSgpO1xuXG4gIGlmIChjb25zdHJhaW50LmIpIGNvbnN0cmFpbnQuYi5hY3RpdmF0ZSgpO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5kb2Zfc2V0QW5ndWxhckxvd2VyTGltaXQgPSAocGFyYW1zKSA9PiB7XG4gIGNvbnN0IGNvbnN0cmFpbnQgPSBfY29uc3RyYWludHNbcGFyYW1zLmNvbnN0cmFpbnRdO1xuXG4gIF92ZWMzXzEuc2V0WChwYXJhbXMueCk7XG4gIF92ZWMzXzEuc2V0WShwYXJhbXMueSk7XG4gIF92ZWMzXzEuc2V0WihwYXJhbXMueik7XG5cbiAgY29uc3RyYWludC5zZXRBbmd1bGFyTG93ZXJMaW1pdChfdmVjM18xKTtcbiAgY29uc3RyYWludC5hLmFjdGl2YXRlKCk7XG5cbiAgaWYgKGNvbnN0cmFpbnQuYikgY29uc3RyYWludC5iLmFjdGl2YXRlKCk7XG59O1xuXG5wdWJsaWNfZnVuY3Rpb25zLmRvZl9zZXRBbmd1bGFyVXBwZXJMaW1pdCA9IChwYXJhbXMpID0+IHtcbiAgY29uc3QgY29uc3RyYWludCA9IF9jb25zdHJhaW50c1twYXJhbXMuY29uc3RyYWludF07XG5cbiAgX3ZlYzNfMS5zZXRYKHBhcmFtcy54KTtcbiAgX3ZlYzNfMS5zZXRZKHBhcmFtcy55KTtcbiAgX3ZlYzNfMS5zZXRaKHBhcmFtcy56KTtcblxuICBjb25zdHJhaW50LnNldEFuZ3VsYXJVcHBlckxpbWl0KF92ZWMzXzEpO1xuICBjb25zdHJhaW50LmEuYWN0aXZhdGUoKTtcblxuICBpZiAoY29uc3RyYWludC5iKSBjb25zdHJhaW50LmIuYWN0aXZhdGUoKTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuZG9mX2VuYWJsZUFuZ3VsYXJNb3RvciA9IChwYXJhbXMpID0+IHtcbiAgY29uc3QgY29uc3RyYWludCA9IF9jb25zdHJhaW50c1twYXJhbXMuY29uc3RyYWludF07XG5cbiAgY29uc3QgbW90b3IgPSBjb25zdHJhaW50LmdldFJvdGF0aW9uYWxMaW1pdE1vdG9yKHBhcmFtcy53aGljaCk7XG4gIG1vdG9yLnNldF9tX2VuYWJsZU1vdG9yKHRydWUpO1xuICBjb25zdHJhaW50LmEuYWN0aXZhdGUoKTtcblxuICBpZiAoY29uc3RyYWludC5iKSBjb25zdHJhaW50LmIuYWN0aXZhdGUoKTtcbn07XG5cbnB1YmxpY19mdW5jdGlvbnMuZG9mX2NvbmZpZ3VyZUFuZ3VsYXJNb3RvciA9IChwYXJhbXMpID0+IHtcbiAgY29uc3QgY29uc3RyYWludCA9IF9jb25zdHJhaW50c1twYXJhbXMuY29uc3RyYWludF0sXG4gICAgbW90b3IgPSBjb25zdHJhaW50LmdldFJvdGF0aW9uYWxMaW1pdE1vdG9yKHBhcmFtcy53aGljaCk7XG5cbiAgbW90b3Iuc2V0X21fbG9MaW1pdChwYXJhbXMubG93X2FuZ2xlKTtcbiAgbW90b3Iuc2V0X21faGlMaW1pdChwYXJhbXMuaGlnaF9hbmdsZSk7XG4gIG1vdG9yLnNldF9tX3RhcmdldFZlbG9jaXR5KHBhcmFtcy52ZWxvY2l0eSk7XG4gIG1vdG9yLnNldF9tX21heE1vdG9yRm9yY2UocGFyYW1zLm1heF9mb3JjZSk7XG4gIGNvbnN0cmFpbnQuYS5hY3RpdmF0ZSgpO1xuXG4gIGlmIChjb25zdHJhaW50LmIpIGNvbnN0cmFpbnQuYi5hY3RpdmF0ZSgpO1xufTtcblxucHVibGljX2Z1bmN0aW9ucy5kb2ZfZGlzYWJsZUFuZ3VsYXJNb3RvciA9IChwYXJhbXMpID0+IHtcbiAgY29uc3QgY29uc3RyYWludCA9IF9jb25zdHJhaW50c1twYXJhbXMuY29uc3RyYWludF0sXG4gICAgbW90b3IgPSBjb25zdHJhaW50LmdldFJvdGF0aW9uYWxMaW1pdE1vdG9yKHBhcmFtcy53aGljaCk7XG5cbiAgbW90b3Iuc2V0X21fZW5hYmxlTW90b3IoZmFsc2UpO1xuICBjb25zdHJhaW50LmEuYWN0aXZhdGUoKTtcblxuICBpZiAoY29uc3RyYWludC5iKSBjb25zdHJhaW50LmIuYWN0aXZhdGUoKTtcbn07XG5cbmNvbnN0IHJlcG9ydFdvcmxkID0gKCkgPT4ge1xuICBpZiAoU1VQUE9SVF9UUkFOU0ZFUkFCTEUgJiYgd29ybGRyZXBvcnQubGVuZ3RoIDwgMiArIF9udW1fcmlnaWRib2R5X29iamVjdHMgKiBXT1JMRFJFUE9SVF9JVEVNU0laRSkge1xuICAgIHdvcmxkcmVwb3J0ID0gbmV3IEZsb2F0MzJBcnJheShcbiAgICAgIDIgLy8gbWVzc2FnZSBpZCAmICMgb2JqZWN0cyBpbiByZXBvcnRcbiAgICAgICtcbiAgICAgIChNYXRoLmNlaWwoX251bV9yaWdpZGJvZHlfb2JqZWN0cyAvIFJFUE9SVF9DSFVOS1NJWkUpICogUkVQT1JUX0NIVU5LU0laRSkgKiBXT1JMRFJFUE9SVF9JVEVNU0laRSAvLyAjIG9mIHZhbHVlcyBuZWVkZWQgKiBpdGVtIHNpemVcbiAgICApO1xuXG4gICAgd29ybGRyZXBvcnRbMF0gPSBNRVNTQUdFX1RZUEVTLldPUkxEUkVQT1JUO1xuICB9XG5cbiAgd29ybGRyZXBvcnRbMV0gPSBfbnVtX3JpZ2lkYm9keV9vYmplY3RzOyAvLyByZWNvcmQgaG93IG1hbnkgb2JqZWN0cyB3ZSdyZSByZXBvcnRpbmcgb25cblxuICB7XG4gICAgbGV0IGkgPSAwLFxuICAgICAgaW5kZXggPSBfb2JqZWN0cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgY29uc3Qgb2JqZWN0ID0gX29iamVjdHNbaW5kZXhdO1xuXG4gICAgICBpZiAob2JqZWN0ICYmIG9iamVjdC50eXBlID09PSAxKSB7IC8vIFJpZ2lkQm9kaWVzLlxuICAgICAgICAvLyAjVE9ETzogd2UgY2FuJ3QgdXNlIGNlbnRlciBvZiBtYXNzIHRyYW5zZm9ybSB3aGVuIGNlbnRlciBvZiBtYXNzIGNhbiBjaGFuZ2UsXG4gICAgICAgIC8vICAgICAgICBidXQgZ2V0TW90aW9uU3RhdGUoKS5nZXRXb3JsZFRyYW5zZm9ybSgpIHNjcmV3cyB1cCBvbiBvYmplY3RzIHRoYXQgaGF2ZSBiZWVuIG1vdmVkXG4gICAgICAgIC8vIG9iamVjdC5nZXRNb3Rpb25TdGF0ZSgpLmdldFdvcmxkVHJhbnNmb3JtKCB0cmFuc2Zvcm0gKTtcbiAgICAgICAgLy8gb2JqZWN0LmdldE1vdGlvblN0YXRlKCkuZ2V0V29ybGRUcmFuc2Zvcm0oX3RyYW5zZm9ybSk7XG5cbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gb2JqZWN0LmdldENlbnRlck9mTWFzc1RyYW5zZm9ybSgpO1xuICAgICAgICBjb25zdCBvcmlnaW4gPSB0cmFuc2Zvcm0uZ2V0T3JpZ2luKCk7XG4gICAgICAgIGNvbnN0IHJvdGF0aW9uID0gdHJhbnNmb3JtLmdldFJvdGF0aW9uKCk7XG5cbiAgICAgICAgLy8gYWRkIHZhbHVlcyB0byByZXBvcnRcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gMiArIChpKyspICogV09STERSRVBPUlRfSVRFTVNJWkU7XG5cbiAgICAgICAgd29ybGRyZXBvcnRbb2Zmc2V0XSA9IG9iamVjdC5pZDtcblxuICAgICAgICB3b3JsZHJlcG9ydFtvZmZzZXQgKyAxXSA9IG9yaWdpbi54KCk7XG4gICAgICAgIHdvcmxkcmVwb3J0W29mZnNldCArIDJdID0gb3JpZ2luLnkoKTtcbiAgICAgICAgd29ybGRyZXBvcnRbb2Zmc2V0ICsgM10gPSBvcmlnaW4ueigpO1xuXG4gICAgICAgIHdvcmxkcmVwb3J0W29mZnNldCArIDRdID0gcm90YXRpb24ueCgpO1xuICAgICAgICB3b3JsZHJlcG9ydFtvZmZzZXQgKyA1XSA9IHJvdGF0aW9uLnkoKTtcbiAgICAgICAgd29ybGRyZXBvcnRbb2Zmc2V0ICsgNl0gPSByb3RhdGlvbi56KCk7XG4gICAgICAgIHdvcmxkcmVwb3J0W29mZnNldCArIDddID0gcm90YXRpb24udygpO1xuXG4gICAgICAgIF92ZWN0b3IgPSBvYmplY3QuZ2V0TGluZWFyVmVsb2NpdHkoKTtcbiAgICAgICAgd29ybGRyZXBvcnRbb2Zmc2V0ICsgOF0gPSBfdmVjdG9yLngoKTtcbiAgICAgICAgd29ybGRyZXBvcnRbb2Zmc2V0ICsgOV0gPSBfdmVjdG9yLnkoKTtcbiAgICAgICAgd29ybGRyZXBvcnRbb2Zmc2V0ICsgMTBdID0gX3ZlY3Rvci56KCk7XG5cbiAgICAgICAgX3ZlY3RvciA9IG9iamVjdC5nZXRBbmd1bGFyVmVsb2NpdHkoKTtcbiAgICAgICAgd29ybGRyZXBvcnRbb2Zmc2V0ICsgMTFdID0gX3ZlY3Rvci54KCk7XG4gICAgICAgIHdvcmxkcmVwb3J0W29mZnNldCArIDEyXSA9IF92ZWN0b3IueSgpO1xuICAgICAgICB3b3JsZHJlcG9ydFtvZmZzZXQgKyAxM10gPSBfdmVjdG9yLnooKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoU1VQUE9SVF9UUkFOU0ZFUkFCTEUpIHNlbmQod29ybGRyZXBvcnQuYnVmZmVyLCBbd29ybGRyZXBvcnQuYnVmZmVyXSk7XG4gIGVsc2Ugc2VuZCh3b3JsZHJlcG9ydCk7XG59O1xuXG5jb25zdCByZXBvcnRXb3JsZF9zb2Z0Ym9kaWVzID0gKCkgPT4ge1xuICAvLyBUT0RPOiBBZGQgU1VQUE9SVFRSQU5TRkVSQUJMRS5cblxuICBzb2Z0cmVwb3J0ID0gbmV3IEZsb2F0MzJBcnJheShcbiAgICAyIC8vIG1lc3NhZ2UgaWQgJiAjIG9iamVjdHMgaW4gcmVwb3J0XG4gICAgK1xuICAgIF9udW1fc29mdGJvZHlfb2JqZWN0cyAqIDIgK1xuICAgIF9zb2Z0Ym9keV9yZXBvcnRfc2l6ZSAqIDZcbiAgKTtcblxuICBzb2Z0cmVwb3J0WzBdID0gTUVTU0FHRV9UWVBFUy5TT0ZUUkVQT1JUO1xuICBzb2Z0cmVwb3J0WzFdID0gX251bV9zb2Z0Ym9keV9vYmplY3RzOyAvLyByZWNvcmQgaG93IG1hbnkgb2JqZWN0cyB3ZSdyZSByZXBvcnRpbmcgb25cblxuICB7XG4gICAgbGV0IG9mZnNldCA9IDIsXG4gICAgICBpbmRleCA9IF9vYmplY3RzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICBjb25zdCBvYmplY3QgPSBfb2JqZWN0c1tpbmRleF07XG5cbiAgICAgIGlmIChvYmplY3QgJiYgb2JqZWN0LnR5cGUgPT09IDApIHsgLy8gU29mdEJvZGllcy5cblxuICAgICAgICBzb2Z0cmVwb3J0W29mZnNldF0gPSBvYmplY3QuaWQ7XG5cbiAgICAgICAgY29uc3Qgb2Zmc2V0VmVydCA9IG9mZnNldCArIDI7XG5cbiAgICAgICAgaWYgKG9iamVjdC5yb3BlID09PSB0cnVlKSB7XG4gICAgICAgICAgY29uc3Qgbm9kZXMgPSBvYmplY3QuZ2V0X21fbm9kZXMoKTtcbiAgICAgICAgICBjb25zdCBzaXplID0gbm9kZXMuc2l6ZSgpO1xuICAgICAgICAgIHNvZnRyZXBvcnRbb2Zmc2V0ICsgMV0gPSBzaXplO1xuXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBub2Rlcy5hdChpKTtcbiAgICAgICAgICAgIGNvbnN0IHZlcnQgPSBub2RlLmdldF9tX3goKTtcbiAgICAgICAgICAgIGNvbnN0IG9mZiA9IG9mZnNldFZlcnQgKyBpICogMztcblxuICAgICAgICAgICAgc29mdHJlcG9ydFtvZmZdID0gdmVydC54KCk7XG4gICAgICAgICAgICBzb2Z0cmVwb3J0W29mZiArIDFdID0gdmVydC55KCk7XG4gICAgICAgICAgICBzb2Z0cmVwb3J0W29mZiArIDJdID0gdmVydC56KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb2Zmc2V0ICs9IHNpemUgKiAzICsgMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvYmplY3QuY2xvdGgpIHtcbiAgICAgICAgICBjb25zdCBub2RlcyA9IG9iamVjdC5nZXRfbV9ub2RlcygpO1xuICAgICAgICAgIGNvbnN0IHNpemUgPSBub2Rlcy5zaXplKCk7XG4gICAgICAgICAgc29mdHJlcG9ydFtvZmZzZXQgKyAxXSA9IHNpemU7XG5cbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzLmF0KGkpO1xuICAgICAgICAgICAgY29uc3QgdmVydCA9IG5vZGUuZ2V0X21feCgpO1xuICAgICAgICAgICAgY29uc3Qgbm9ybWFsID0gbm9kZS5nZXRfbV9uKCk7XG4gICAgICAgICAgICBjb25zdCBvZmYgPSBvZmZzZXRWZXJ0ICsgaSAqIDY7XG5cbiAgICAgICAgICAgIHNvZnRyZXBvcnRbb2ZmXSA9IHZlcnQueCgpO1xuICAgICAgICAgICAgc29mdHJlcG9ydFtvZmYgKyAxXSA9IHZlcnQueSgpO1xuICAgICAgICAgICAgc29mdHJlcG9ydFtvZmYgKyAyXSA9IHZlcnQueigpO1xuXG4gICAgICAgICAgICBzb2Z0cmVwb3J0W29mZiArIDNdID0gLW5vcm1hbC54KCk7XG4gICAgICAgICAgICBzb2Z0cmVwb3J0W29mZiArIDRdID0gLW5vcm1hbC55KCk7XG4gICAgICAgICAgICBzb2Z0cmVwb3J0W29mZiArIDVdID0gLW5vcm1hbC56KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb2Zmc2V0ICs9IHNpemUgKiA2ICsgMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjb25zdCBmYWNlcyA9IG9iamVjdC5nZXRfbV9mYWNlcygpO1xuICAgICAgICAgIGNvbnN0IHNpemUgPSBmYWNlcy5zaXplKCk7XG4gICAgICAgICAgc29mdHJlcG9ydFtvZmZzZXQgKyAxXSA9IHNpemU7XG5cbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZmFjZSA9IGZhY2VzLmF0KGkpO1xuXG4gICAgICAgICAgICBjb25zdCBub2RlMSA9IGZhY2UuZ2V0X21fbigwKTtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUyID0gZmFjZS5nZXRfbV9uKDEpO1xuICAgICAgICAgICAgY29uc3Qgbm9kZTMgPSBmYWNlLmdldF9tX24oMik7XG5cbiAgICAgICAgICAgIGNvbnN0IHZlcnQxID0gbm9kZTEuZ2V0X21feCgpO1xuICAgICAgICAgICAgY29uc3QgdmVydDIgPSBub2RlMi5nZXRfbV94KCk7XG4gICAgICAgICAgICBjb25zdCB2ZXJ0MyA9IG5vZGUzLmdldF9tX3goKTtcblxuICAgICAgICAgICAgY29uc3Qgbm9ybWFsMSA9IG5vZGUxLmdldF9tX24oKTtcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbDIgPSBub2RlMi5nZXRfbV9uKCk7XG4gICAgICAgICAgICBjb25zdCBub3JtYWwzID0gbm9kZTMuZ2V0X21fbigpO1xuXG4gICAgICAgICAgICBjb25zdCBvZmYgPSBvZmZzZXRWZXJ0ICsgaSAqIDE4O1xuXG4gICAgICAgICAgICBzb2Z0cmVwb3J0W29mZl0gPSB2ZXJ0MS54KCk7XG4gICAgICAgICAgICBzb2Z0cmVwb3J0W29mZiArIDFdID0gdmVydDEueSgpO1xuICAgICAgICAgICAgc29mdHJlcG9ydFtvZmYgKyAyXSA9IHZlcnQxLnooKTtcblxuICAgICAgICAgICAgc29mdHJlcG9ydFtvZmYgKyAzXSA9IG5vcm1hbDEueCgpO1xuICAgICAgICAgICAgc29mdHJlcG9ydFtvZmYgKyA0XSA9IG5vcm1hbDEueSgpO1xuICAgICAgICAgICAgc29mdHJlcG9ydFtvZmYgKyA1XSA9IG5vcm1hbDEueigpO1xuXG4gICAgICAgICAgICBzb2Z0cmVwb3J0W29mZiArIDZdID0gdmVydDIueCgpO1xuICAgICAgICAgICAgc29mdHJlcG9ydFtvZmYgKyA3XSA9IHZlcnQyLnkoKTtcbiAgICAgICAgICAgIHNvZnRyZXBvcnRbb2ZmICsgOF0gPSB2ZXJ0Mi56KCk7XG5cbiAgICAgICAgICAgIHNvZnRyZXBvcnRbb2ZmICsgOV0gPSBub3JtYWwyLngoKTtcbiAgICAgICAgICAgIHNvZnRyZXBvcnRbb2ZmICsgMTBdID0gbm9ybWFsMi55KCk7XG4gICAgICAgICAgICBzb2Z0cmVwb3J0W29mZiArIDExXSA9IG5vcm1hbDIueigpO1xuXG4gICAgICAgICAgICBzb2Z0cmVwb3J0W29mZiArIDEyXSA9IHZlcnQzLngoKTtcbiAgICAgICAgICAgIHNvZnRyZXBvcnRbb2ZmICsgMTNdID0gdmVydDMueSgpO1xuICAgICAgICAgICAgc29mdHJlcG9ydFtvZmYgKyAxNF0gPSB2ZXJ0My56KCk7XG5cbiAgICAgICAgICAgIHNvZnRyZXBvcnRbb2ZmICsgMTVdID0gbm9ybWFsMy54KCk7XG4gICAgICAgICAgICBzb2Z0cmVwb3J0W29mZiArIDE2XSA9IG5vcm1hbDMueSgpO1xuICAgICAgICAgICAgc29mdHJlcG9ydFtvZmYgKyAxN10gPSBub3JtYWwzLnooKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBvZmZzZXQgKz0gc2l6ZSAqIDE4ICsgMjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGlmIChTVVBQT1JUX1RSQU5TRkVSQUJMRSkgc2VuZChzb2Z0cmVwb3J0LmJ1ZmZlciwgW3NvZnRyZXBvcnQuYnVmZmVyXSk7XG4gIC8vIGVsc2Ugc2VuZChzb2Z0cmVwb3J0KTtcbiAgc2VuZChzb2Z0cmVwb3J0KTtcbn07XG5cbmNvbnN0IHJlcG9ydENvbGxpc2lvbnMgPSAoKSA9PiB7XG4gIGNvbnN0IGRwID0gd29ybGQuZ2V0RGlzcGF0Y2hlcigpLFxuICAgIG51bSA9IGRwLmdldE51bU1hbmlmb2xkcygpO1xuICAvLyBfY29sbGlkZWQgPSBmYWxzZTtcblxuICBpZiAoU1VQUE9SVF9UUkFOU0ZFUkFCTEUpIHtcbiAgICBpZiAoY29sbGlzaW9ucmVwb3J0Lmxlbmd0aCA8IDIgKyBudW0gKiBDT0xMSVNJT05SRVBPUlRfSVRFTVNJWkUpIHtcbiAgICAgIGNvbGxpc2lvbnJlcG9ydCA9IG5ldyBGbG9hdDMyQXJyYXkoXG4gICAgICAgIDIgLy8gbWVzc2FnZSBpZCAmICMgb2JqZWN0cyBpbiByZXBvcnRcbiAgICAgICAgK1xuICAgICAgICAoTWF0aC5jZWlsKF9udW1fb2JqZWN0cyAvIFJFUE9SVF9DSFVOS1NJWkUpICogUkVQT1JUX0NIVU5LU0laRSkgKiBDT0xMSVNJT05SRVBPUlRfSVRFTVNJWkUgLy8gIyBvZiB2YWx1ZXMgbmVlZGVkICogaXRlbSBzaXplXG4gICAgICApO1xuICAgICAgY29sbGlzaW9ucmVwb3J0WzBdID0gTUVTU0FHRV9UWVBFUy5DT0xMSVNJT05SRVBPUlQ7XG4gICAgfVxuICB9XG5cbiAgY29sbGlzaW9ucmVwb3J0WzFdID0gMDsgLy8gaG93IG1hbnkgY29sbGlzaW9ucyB3ZSdyZSByZXBvcnRpbmcgb25cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG51bTsgaSsrKSB7XG4gICAgY29uc3QgbWFuaWZvbGQgPSBkcC5nZXRNYW5pZm9sZEJ5SW5kZXhJbnRlcm5hbChpKSxcbiAgICAgIG51bV9jb250YWN0cyA9IG1hbmlmb2xkLmdldE51bUNvbnRhY3RzKCk7XG5cbiAgICBpZiAobnVtX2NvbnRhY3RzID09PSAwKSBjb250aW51ZTtcblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgbnVtX2NvbnRhY3RzOyBqKyspIHtcbiAgICAgIGNvbnN0IHB0ID0gbWFuaWZvbGQuZ2V0Q29udGFjdFBvaW50KGopO1xuXG4gICAgICAvLyBpZiAoIHB0LmdldERpc3RhbmNlKCkgPCAwICkge1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gMiArIChjb2xsaXNpb25yZXBvcnRbMV0rKykgKiBDT0xMSVNJT05SRVBPUlRfSVRFTVNJWkU7XG4gICAgICBjb2xsaXNpb25yZXBvcnRbb2Zmc2V0XSA9IF9vYmplY3RzX2FtbW9bbWFuaWZvbGQuZ2V0Qm9keTAoKS5wdHJdO1xuICAgICAgY29sbGlzaW9ucmVwb3J0W29mZnNldCArIDFdID0gX29iamVjdHNfYW1tb1ttYW5pZm9sZC5nZXRCb2R5MSgpLnB0cl07XG5cbiAgICAgIF92ZWN0b3IgPSBwdC5nZXRfbV9ub3JtYWxXb3JsZE9uQigpO1xuICAgICAgY29sbGlzaW9ucmVwb3J0W29mZnNldCArIDJdID0gX3ZlY3Rvci54KCk7XG4gICAgICBjb2xsaXNpb25yZXBvcnRbb2Zmc2V0ICsgM10gPSBfdmVjdG9yLnkoKTtcbiAgICAgIGNvbGxpc2lvbnJlcG9ydFtvZmZzZXQgKyA0XSA9IF92ZWN0b3IueigpO1xuICAgICAgYnJlYWs7XG4gICAgICAvLyB9XG4gICAgICAvLyBzZW5kKF9vYmplY3RzX2FtbW8pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChTVVBQT1JUX1RSQU5TRkVSQUJMRSkgc2VuZChjb2xsaXNpb25yZXBvcnQuYnVmZmVyLCBbY29sbGlzaW9ucmVwb3J0LmJ1ZmZlcl0pO1xuICBlbHNlIHNlbmQoY29sbGlzaW9ucmVwb3J0KTtcbn07XG5cbmNvbnN0IHJlcG9ydFZlaGljbGVzID0gZnVuY3Rpb24gKCkge1xuICBpZiAoU1VQUE9SVF9UUkFOU0ZFUkFCTEUpIHtcbiAgICBpZiAodmVoaWNsZXJlcG9ydC5sZW5ndGggPCAyICsgX251bV93aGVlbHMgKiBWRUhJQ0xFUkVQT1JUX0lURU1TSVpFKSB7XG4gICAgICB2ZWhpY2xlcmVwb3J0ID0gbmV3IEZsb2F0MzJBcnJheShcbiAgICAgICAgMiAvLyBtZXNzYWdlIGlkICYgIyBvYmplY3RzIGluIHJlcG9ydFxuICAgICAgICArXG4gICAgICAgIChNYXRoLmNlaWwoX251bV93aGVlbHMgLyBSRVBPUlRfQ0hVTktTSVpFKSAqIFJFUE9SVF9DSFVOS1NJWkUpICogVkVISUNMRVJFUE9SVF9JVEVNU0laRSAvLyAjIG9mIHZhbHVlcyBuZWVkZWQgKiBpdGVtIHNpemVcbiAgICAgICk7XG4gICAgICB2ZWhpY2xlcmVwb3J0WzBdID0gTUVTU0FHRV9UWVBFUy5WRUhJQ0xFUkVQT1JUO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBsZXQgaSA9IDAsXG4gICAgICBqID0gMCxcbiAgICAgIGluZGV4ID0gX3ZlaGljbGVzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICBpZiAoX3ZlaGljbGVzW2luZGV4XSkge1xuICAgICAgICBjb25zdCB2ZWhpY2xlID0gX3ZlaGljbGVzW2luZGV4XTtcblxuICAgICAgICBmb3IgKGogPSAwOyBqIDwgdmVoaWNsZS5nZXROdW1XaGVlbHMoKTsgaisrKSB7XG4gICAgICAgICAgLy8gdmVoaWNsZS51cGRhdGVXaGVlbFRyYW5zZm9ybSggaiwgdHJ1ZSApO1xuICAgICAgICAgIC8vIHRyYW5zZm9ybSA9IHZlaGljbGUuZ2V0V2hlZWxUcmFuc2Zvcm1XUyggaiApO1xuICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IHZlaGljbGUuZ2V0V2hlZWxJbmZvKGopLmdldF9tX3dvcmxkVHJhbnNmb3JtKCk7XG5cbiAgICAgICAgICBjb25zdCBvcmlnaW4gPSB0cmFuc2Zvcm0uZ2V0T3JpZ2luKCk7XG4gICAgICAgICAgY29uc3Qgcm90YXRpb24gPSB0cmFuc2Zvcm0uZ2V0Um90YXRpb24oKTtcblxuICAgICAgICAgIC8vIGFkZCB2YWx1ZXMgdG8gcmVwb3J0XG4gICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gMSArIChpKyspICogVkVISUNMRVJFUE9SVF9JVEVNU0laRTtcblxuICAgICAgICAgIHZlaGljbGVyZXBvcnRbb2Zmc2V0XSA9IGluZGV4O1xuICAgICAgICAgIHZlaGljbGVyZXBvcnRbb2Zmc2V0ICsgMV0gPSBqO1xuXG4gICAgICAgICAgdmVoaWNsZXJlcG9ydFtvZmZzZXQgKyAyXSA9IG9yaWdpbi54KCk7XG4gICAgICAgICAgdmVoaWNsZXJlcG9ydFtvZmZzZXQgKyAzXSA9IG9yaWdpbi55KCk7XG4gICAgICAgICAgdmVoaWNsZXJlcG9ydFtvZmZzZXQgKyA0XSA9IG9yaWdpbi56KCk7XG5cbiAgICAgICAgICB2ZWhpY2xlcmVwb3J0W29mZnNldCArIDVdID0gcm90YXRpb24ueCgpO1xuICAgICAgICAgIHZlaGljbGVyZXBvcnRbb2Zmc2V0ICsgNl0gPSByb3RhdGlvbi55KCk7XG4gICAgICAgICAgdmVoaWNsZXJlcG9ydFtvZmZzZXQgKyA3XSA9IHJvdGF0aW9uLnooKTtcbiAgICAgICAgICB2ZWhpY2xlcmVwb3J0W29mZnNldCArIDhdID0gcm90YXRpb24udygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFNVUFBPUlRfVFJBTlNGRVJBQkxFICYmIGogIT09IDApIHNlbmQodmVoaWNsZXJlcG9ydC5idWZmZXIsIFt2ZWhpY2xlcmVwb3J0LmJ1ZmZlcl0pO1xuICAgIGVsc2UgaWYgKGogIT09IDApIHNlbmQodmVoaWNsZXJlcG9ydCk7XG4gIH1cbn07XG5cbmNvbnN0IHJlcG9ydENvbnN0cmFpbnRzID0gZnVuY3Rpb24gKCkge1xuICBpZiAoU1VQUE9SVF9UUkFOU0ZFUkFCTEUpIHtcbiAgICBpZiAoY29uc3RyYWludHJlcG9ydC5sZW5ndGggPCAyICsgX251bV9jb25zdHJhaW50cyAqIENPTlNUUkFJTlRSRVBPUlRfSVRFTVNJWkUpIHtcbiAgICAgIGNvbnN0cmFpbnRyZXBvcnQgPSBuZXcgRmxvYXQzMkFycmF5KFxuICAgICAgICAyIC8vIG1lc3NhZ2UgaWQgJiAjIG9iamVjdHMgaW4gcmVwb3J0XG4gICAgICAgICtcbiAgICAgICAgKE1hdGguY2VpbChfbnVtX2NvbnN0cmFpbnRzIC8gUkVQT1JUX0NIVU5LU0laRSkgKiBSRVBPUlRfQ0hVTktTSVpFKSAqIENPTlNUUkFJTlRSRVBPUlRfSVRFTVNJWkUgLy8gIyBvZiB2YWx1ZXMgbmVlZGVkICogaXRlbSBzaXplXG4gICAgICApO1xuICAgICAgY29uc3RyYWludHJlcG9ydFswXSA9IE1FU1NBR0VfVFlQRVMuQ09OU1RSQUlOVFJFUE9SVDtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgbGV0IG9mZnNldCA9IDAsXG4gICAgICBpID0gMCxcbiAgICAgIGluZGV4ID0gX2NvbnN0cmFpbnRzLmxlbmdodDtcblxuICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICBpZiAoX2NvbnN0cmFpbnRzW2luZGV4XSkge1xuICAgICAgICBjb25zdCBjb25zdHJhaW50ID0gX2NvbnN0cmFpbnRzW2luZGV4XTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0X2JvZHkgPSBjb25zdHJhaW50LmE7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IGNvbnN0cmFpbnQudGE7XG4gICAgICAgIGNvbnN0IG9yaWdpbiA9IHRyYW5zZm9ybS5nZXRPcmlnaW4oKTtcblxuICAgICAgICAvLyBhZGQgdmFsdWVzIHRvIHJlcG9ydFxuICAgICAgICBvZmZzZXQgPSAxICsgKGkrKykgKiBDT05TVFJBSU5UUkVQT1JUX0lURU1TSVpFO1xuXG4gICAgICAgIGNvbnN0cmFpbnRyZXBvcnRbb2Zmc2V0XSA9IGluZGV4O1xuICAgICAgICBjb25zdHJhaW50cmVwb3J0W29mZnNldCArIDFdID0gb2Zmc2V0X2JvZHkuaWQ7XG4gICAgICAgIGNvbnN0cmFpbnRyZXBvcnRbb2Zmc2V0ICsgMl0gPSBvcmlnaW4ueDtcbiAgICAgICAgY29uc3RyYWludHJlcG9ydFtvZmZzZXQgKyAzXSA9IG9yaWdpbi55O1xuICAgICAgICBjb25zdHJhaW50cmVwb3J0W29mZnNldCArIDRdID0gb3JpZ2luLno7XG4gICAgICAgIGNvbnN0cmFpbnRyZXBvcnRbb2Zmc2V0ICsgNV0gPSBjb25zdHJhaW50LmdldEJyZWFraW5nSW1wdWxzZVRocmVzaG9sZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChTVVBQT1JUX1RSQU5TRkVSQUJMRSAmJiBpICE9PSAwKSBzZW5kKGNvbnN0cmFpbnRyZXBvcnQuYnVmZmVyLCBbY29uc3RyYWludHJlcG9ydC5idWZmZXJdKTtcbiAgICBlbHNlIGlmIChpICE9PSAwKSBzZW5kKGNvbnN0cmFpbnRyZXBvcnQpO1xuICB9XG59O1xuXG5zZWxmLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICBpZiAoZXZlbnQuZGF0YSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSkge1xuICAgIC8vIHRyYW5zZmVyYWJsZSBvYmplY3RcbiAgICBzd2l0Y2ggKGV2ZW50LmRhdGFbMF0pIHtcbiAgICBjYXNlIE1FU1NBR0VfVFlQRVMuV09STERSRVBPUlQ6XG4gICAgICB7XG4gICAgICAgIHdvcmxkcmVwb3J0ID0gbmV3IEZsb2F0MzJBcnJheShldmVudC5kYXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgY2FzZSBNRVNTQUdFX1RZUEVTLkNPTExJU0lPTlJFUE9SVDpcbiAgICAgIHtcbiAgICAgICAgY29sbGlzaW9ucmVwb3J0ID0gbmV3IEZsb2F0MzJBcnJheShldmVudC5kYXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgY2FzZSBNRVNTQUdFX1RZUEVTLlZFSElDTEVSRVBPUlQ6XG4gICAgICB7XG4gICAgICAgIHZlaGljbGVyZXBvcnQgPSBuZXcgRmxvYXQzMkFycmF5KGV2ZW50LmRhdGEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICBjYXNlIE1FU1NBR0VfVFlQRVMuQ09OU1RSQUlOVFJFUE9SVDpcbiAgICAgIHtcbiAgICAgICAgY29uc3RyYWludHJlcG9ydCA9IG5ldyBGbG9hdDMyQXJyYXkoZXZlbnQuZGF0YSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG4gIGVsc2UgaWYgKGV2ZW50LmRhdGEuY21kICYmIHB1YmxpY19mdW5jdGlvbnNbZXZlbnQuZGF0YS5jbWRdKSBwdWJsaWNfZnVuY3Rpb25zW2V2ZW50LmRhdGEuY21kXShldmVudC5kYXRhLnBhcmFtcyk7XG59O1xuXG5zZWxmLnJlY2VpdmUgPSBzZWxmLm9ubWVzc2FnZTtcblxuXG5cblxufSk7IiwiaW1wb3J0IFdvcmxkTW9kdWxlQmFzZSBmcm9tICcuL2NvcmUvV29ybGRNb2R1bGVCYXNlJztcblxuaW1wb3J0IHtcbiAgYWRkT2JqZWN0Q2hpbGRyZW4sXG4gIE1FU1NBR0VfVFlQRVMsXG4gIHRlbXAxVmVjdG9yMyxcbiAgdGVtcDFNYXRyaXg0LFxuICBSRVBPUlRfSVRFTVNJWkUsXG4gIENPTExJU0lPTlJFUE9SVF9JVEVNU0laRSxcbiAgVkVISUNMRVJFUE9SVF9JVEVNU0laRSxcbiAgQ09OU1RSQUlOVFJFUE9SVF9JVEVNU0laRVxufSBmcm9tICcuLi9hcGknO1xuXG5pbXBvcnQgUGh5c2ljc1dvcmtlciBmcm9tICd3b3JrZXIhLi4vd29ya2VyLmpzJztcblxuZXhwb3J0IGNsYXNzIFdvcmxkTW9kdWxlIGV4dGVuZHMgV29ybGRNb2R1bGVCYXNlIHtcbiAgY29uc3RydWN0b3IoLi4uYXJncykge1xuICAgIHN1cGVyKC4uLmFyZ3MpO1xuXG4gICAgdGhpcy53b3JrZXIgPSBuZXcgUGh5c2ljc1dvcmtlcigpO1xuICAgIHRoaXMud29ya2VyLnRyYW5zZmVyYWJsZU1lc3NhZ2UgPSB0aGlzLndvcmtlci53ZWJraXRQb3N0TWVzc2FnZSB8fCB0aGlzLndvcmtlci5wb3N0TWVzc2FnZTtcblxuICAgIHRoaXMuaXNMb2FkZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICB0aGlzLmxvYWRlciA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIGlmIChvcHRpb25zLndhc20pIHtcbiAgICAgIC8vICAgZmV0Y2gob3B0aW9ucy53YXNtKVxuICAgICAgLy8gICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmFycmF5QnVmZmVyKCkpXG4gICAgICAvLyAgICAgLnRoZW4oYnVmZmVyID0+IHtcbiAgICAgIC8vICAgICAgIG9wdGlvbnMud2FzbUJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICAgIC8vXG4gICAgICAvLyAgICAgICB0aGlzLmV4ZWN1dGUoJ2luaXQnLCBvcHRpb25zKTtcbiAgICAgIC8vICAgICAgIHJlc29sdmUoKTtcbiAgICAgIC8vICAgICB9KTtcbiAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXhlY3V0ZSgnaW5pdCcsIG9wdGlvbnMpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICAvLyB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmxvYWRlci50aGVuKCgpID0+IHt0aGlzLmlzTG9hZGVkID0gdHJ1ZX0pO1xuXG4gICAgLy8gVGVzdCBTVVBQT1JUX1RSQU5TRkVSQUJMRVxuXG4gICAgY29uc3QgYWIgPSBuZXcgQXJyYXlCdWZmZXIoMSk7XG4gICAgdGhpcy53b3JrZXIudHJhbnNmZXJhYmxlTWVzc2FnZShhYiwgW2FiXSk7XG4gICAgdGhpcy5TVVBQT1JUX1RSQU5TRkVSQUJMRSA9IChhYi5ieXRlTGVuZ3RoID09PSAwKTtcblxuICAgIHRoaXMuc2V0dXAoKTtcbiAgfVxuXG4gIHNlbmQoLi4uYXJncykge1xuICAgIHRoaXMud29ya2VyLnRyYW5zZmVyYWJsZU1lc3NhZ2UoLi4uYXJncyk7XG4gIH1cblxuICByZWNlaXZlKGNhbGxiYWNrKSB7XG4gICAgdGhpcy53b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGNhbGxiYWNrKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtWZWN0b3IzLCBRdWF0ZXJuaW9ufSBmcm9tICd0aHJlZSc7XG5cbmNvbnN0IHByb3BlcnRpZXMgPSB7XG4gIHBvc2l0aW9uOiB7XG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX25hdGl2ZS5wb3NpdGlvbjtcbiAgICB9LFxuXG4gICAgc2V0KHZlY3RvcjMpIHtcbiAgICAgIGNvbnN0IHBvcyA9IHRoaXMuX25hdGl2ZS5wb3NpdGlvbjtcbiAgICAgIGNvbnN0IHNjb3BlID0gdGhpcztcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocG9zLCB7XG4gICAgICAgIHg6IHtcbiAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5feDtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgc2V0KHgpIHtcbiAgICAgICAgICAgIHNjb3BlLl9fZGlydHlQb3NpdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl94ID0geDtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHk6IHtcbiAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5feTtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgc2V0KHkpIHtcbiAgICAgICAgICAgIHNjb3BlLl9fZGlydHlQb3NpdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl95ID0geTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHo6IHtcbiAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fejtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgc2V0KHopIHtcbiAgICAgICAgICAgIHNjb3BlLl9fZGlydHlQb3NpdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl96ID0gejtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBzY29wZS5fX2RpcnR5UG9zaXRpb24gPSB0cnVlO1xuXG4gICAgICBwb3MuY29weSh2ZWN0b3IzKTtcbiAgICB9XG4gIH0sXG5cbiAgcXVhdGVybmlvbjoge1xuICAgIGdldCgpIHtcbiAgICAgIHRoaXMuX19jX3JvdCA9IHRydWU7XG4gICAgICByZXR1cm4gdGhpcy5uYXRpdmUucXVhdGVybmlvbjtcbiAgICB9LFxuXG4gICAgc2V0KHF1YXRlcm5pb24pIHtcbiAgICAgIGNvbnN0IHF1YXQgPSB0aGlzLl9uYXRpdmUucXVhdGVybmlvbixcbiAgICAgICAgbmF0aXZlID0gdGhpcy5fbmF0aXZlO1xuXG4gICAgICBxdWF0LmNvcHkocXVhdGVybmlvbik7XG5cbiAgICAgIHF1YXQub25DaGFuZ2UoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fX2Nfcm90KSB7XG4gICAgICAgICAgaWYgKG5hdGl2ZS5fX2RpcnR5Um90YXRpb24gPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuX19jX3JvdCA9IGZhbHNlO1xuICAgICAgICAgICAgbmF0aXZlLl9fZGlydHlSb3RhdGlvbiA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuYXRpdmUuX19kaXJ0eVJvdGF0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIHJvdGF0aW9uOiB7XG4gICAgZ2V0KCkge1xuICAgICAgdGhpcy5fX2Nfcm90ID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzLl9uYXRpdmUucm90YXRpb247XG4gICAgfSxcblxuICAgIHNldChldWxlcikge1xuICAgICAgY29uc3Qgcm90ID0gdGhpcy5fbmF0aXZlLnJvdGF0aW9uLFxuICAgICAgICBuYXRpdmUgPSB0aGlzLl9uYXRpdmU7XG5cbiAgICAgIHRoaXMucXVhdGVybmlvbi5jb3B5KG5ldyBRdWF0ZXJuaW9uKCkuc2V0RnJvbUV1bGVyKGV1bGVyKSk7XG5cbiAgICAgIHJvdC5vbkNoYW5nZSgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9fY19yb3QpIHtcbiAgICAgICAgICB0aGlzLnF1YXRlcm5pb24uY29weShuZXcgUXVhdGVybmlvbigpLnNldEZyb21FdWxlcihyb3QpKTtcbiAgICAgICAgICBuYXRpdmUuX19kaXJ0eVJvdGF0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHdyYXBQaHlzaWNzUHJvdG90eXBlKHNjb3BlKSB7XG4gIGZvciAobGV0IGtleSBpbiBwcm9wZXJ0aWVzKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjb3BlLCBrZXksIHtcbiAgICAgIGdldDogcHJvcGVydGllc1trZXldLmdldC5iaW5kKHNjb3BlKSxcbiAgICAgIHNldDogcHJvcGVydGllc1trZXldLnNldC5iaW5kKHNjb3BlKSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbkNvcHkoc291cmNlKSB7XG4gIHdyYXBQaHlzaWNzUHJvdG90eXBlKHRoaXMpO1xuXG4gIGNvbnN0IHBoeXNpY3MgPSB0aGlzLnVzZSgncGh5c2ljcycpO1xuICBjb25zdCBzb3VyY2VQaHlzaWNzID0gc291cmNlLnVzZSgncGh5c2ljcycpO1xuXG4gIHRoaXMubWFuYWdlci5tb2R1bGVzLnBoeXNpY3MgPSBwaHlzaWNzLmNsb25lKHRoaXMubWFuYWdlcik7XG5cbiAgcGh5c2ljcy5kYXRhID0gey4uLnNvdXJjZVBoeXNpY3MuZGF0YX07XG4gIHBoeXNpY3MuZGF0YS5pc1NvZnRCb2R5UmVzZXQgPSBmYWxzZTtcbiAgaWYgKHBoeXNpY3MuZGF0YS5pc1NvZnRib2R5KSBwaHlzaWNzLmRhdGEuaXNTb2Z0Qm9keVJlc2V0ID0gZmFsc2U7XG5cbiAgdGhpcy5wb3NpdGlvbiA9IHRoaXMucG9zaXRpb24uY2xvbmUoKTtcbiAgdGhpcy5yb3RhdGlvbiA9IHRoaXMucm90YXRpb24uY2xvbmUoKTtcbiAgdGhpcy5xdWF0ZXJuaW9uID0gdGhpcy5xdWF0ZXJuaW9uLmNsb25lKCk7XG5cbiAgcmV0dXJuIHNvdXJjZTtcbn1cblxuZnVuY3Rpb24gb25XcmFwKCkge1xuICB0aGlzLnBvc2l0aW9uID0gdGhpcy5wb3NpdGlvbi5jbG9uZSgpO1xuICB0aGlzLnJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbi5jbG9uZSgpO1xuICB0aGlzLnF1YXRlcm5pb24gPSB0aGlzLnF1YXRlcm5pb24uY2xvbmUoKTtcbn1cblxuY2xhc3MgQVBJIHtcbiAgYXBwbHlDZW50cmFsSW1wdWxzZShmb3JjZSkge1xuICAgIHRoaXMuZXhlY3V0ZSgnYXBwbHlDZW50cmFsSW1wdWxzZScsIHtpZDogdGhpcy5kYXRhLmlkLCB4OiBmb3JjZS54LCB5OiBmb3JjZS55LCB6OiBmb3JjZS56fSk7XG4gIH1cblxuICBhcHBseUltcHVsc2UoZm9yY2UsIG9mZnNldCkge1xuICAgIHRoaXMuZXhlY3V0ZSgnYXBwbHlJbXB1bHNlJywge1xuICAgICAgaWQ6IHRoaXMuZGF0YS5pZCxcbiAgICAgIGltcHVsc2VfeDogZm9yY2UueCxcbiAgICAgIGltcHVsc2VfeTogZm9yY2UueSxcbiAgICAgIGltcHVsc2VfejogZm9yY2UueixcbiAgICAgIHg6IG9mZnNldC54LFxuICAgICAgeTogb2Zmc2V0LnksXG4gICAgICB6OiBvZmZzZXQuelxuICAgIH0pO1xuICB9XG5cbiAgYXBwbHlUb3JxdWUoZm9yY2UpIHtcbiAgICB0aGlzLmV4ZWN1dGUoJ2FwcGx5VG9ycXVlJywge1xuICAgICAgaWQ6IHRoaXMuZGF0YS5pZCxcbiAgICAgIHRvcnF1ZV94OiBmb3JjZS54LFxuICAgICAgdG9ycXVlX3k6IGZvcmNlLnksXG4gICAgICB0b3JxdWVfejogZm9yY2UuelxuICAgIH0pO1xuICB9XG5cbiAgYXBwbHlDZW50cmFsRm9yY2UoZm9yY2UpIHtcbiAgICB0aGlzLmV4ZWN1dGUoJ2FwcGx5Q2VudHJhbEZvcmNlJywge1xuICAgICAgaWQ6IHRoaXMuZGF0YS5pZCxcbiAgICAgIHg6IGZvcmNlLngsXG4gICAgICB5OiBmb3JjZS55LFxuICAgICAgejogZm9yY2UuelxuICAgIH0pO1xuICB9XG5cbiAgYXBwbHlGb3JjZShmb3JjZSwgb2Zmc2V0KSB7XG4gICAgdGhpcy5leGVjdXRlKCdhcHBseUZvcmNlJywge1xuICAgICAgaWQ6IHRoaXMuZGF0YS5pZCxcbiAgICAgIGZvcmNlX3g6IGZvcmNlLngsXG4gICAgICBmb3JjZV95OiBmb3JjZS55LFxuICAgICAgZm9yY2VfejogZm9yY2UueixcbiAgICAgIHg6IG9mZnNldC54LFxuICAgICAgeTogb2Zmc2V0LnksXG4gICAgICB6OiBvZmZzZXQuelxuICAgIH0pO1xuICB9XG5cbiAgZ2V0QW5ndWxhclZlbG9jaXR5KCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEuYW5ndWxhclZlbG9jaXR5O1xuICB9XG5cbiAgc2V0QW5ndWxhclZlbG9jaXR5KHZlbG9jaXR5KSB7XG4gICAgdGhpcy5leGVjdXRlKFxuICAgICAgJ3NldEFuZ3VsYXJWZWxvY2l0eScsXG4gICAgICB7aWQ6IHRoaXMuZGF0YS5pZCwgeDogdmVsb2NpdHkueCwgeTogdmVsb2NpdHkueSwgejogdmVsb2NpdHkuen1cbiAgICApO1xuICB9XG5cbiAgZ2V0TGluZWFyVmVsb2NpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5saW5lYXJWZWxvY2l0eTtcbiAgfVxuXG4gIHNldExpbmVhclZlbG9jaXR5KHZlbG9jaXR5KSB7XG4gICAgdGhpcy5leGVjdXRlKFxuICAgICAgJ3NldExpbmVhclZlbG9jaXR5JyxcbiAgICAgIHtpZDogdGhpcy5kYXRhLmlkLCB4OiB2ZWxvY2l0eS54LCB5OiB2ZWxvY2l0eS55LCB6OiB2ZWxvY2l0eS56fVxuICAgICk7XG4gIH1cblxuICBzZXRBbmd1bGFyRmFjdG9yKGZhY3Rvcikge1xuICAgIHRoaXMuZXhlY3V0ZShcbiAgICAgICdzZXRBbmd1bGFyRmFjdG9yJyxcbiAgICAgIHtpZDogdGhpcy5kYXRhLmlkLCB4OiBmYWN0b3IueCwgeTogZmFjdG9yLnksIHo6IGZhY3Rvci56fVxuICAgICk7XG4gIH1cblxuICBzZXRMaW5lYXJGYWN0b3IoZmFjdG9yKSB7XG4gICAgdGhpcy5leGVjdXRlKFxuICAgICAgJ3NldExpbmVhckZhY3RvcicsXG4gICAgICB7aWQ6IHRoaXMuZGF0YS5pZCwgeDogZmFjdG9yLngsIHk6IGZhY3Rvci55LCB6OiBmYWN0b3Iuen1cbiAgICApO1xuICB9XG5cbiAgc2V0RGFtcGluZyhsaW5lYXIsIGFuZ3VsYXIpIHtcbiAgICB0aGlzLmV4ZWN1dGUoXG4gICAgICAnc2V0RGFtcGluZycsXG4gICAgICB7aWQ6IHRoaXMuZGF0YS5pZCwgbGluZWFyLCBhbmd1bGFyfVxuICAgICk7XG4gIH1cblxuICBzZXRDY2RNb3Rpb25UaHJlc2hvbGQodGhyZXNob2xkKSB7XG4gICAgdGhpcy5leGVjdXRlKFxuICAgICAgJ3NldENjZE1vdGlvblRocmVzaG9sZCcsXG4gICAgICB7aWQ6IHRoaXMuZGF0YS5pZCwgdGhyZXNob2xkfVxuICAgICk7XG4gIH1cblxuICBzZXRDY2RTd2VwdFNwaGVyZVJhZGl1cyhyYWRpdXMpIHtcbiAgICB0aGlzLmV4ZWN1dGUoJ3NldENjZFN3ZXB0U3BoZXJlUmFkaXVzJywge2lkOiB0aGlzLmRhdGEuaWQsIHJhZGl1c30pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgQVBJIHtcbiAgc3RhdGljIHJpZ2lkYm9keSA9ICgpID0+ICh7XG4gICAgdG91Y2hlczogW10sXG4gICAgbGluZWFyVmVsb2NpdHk6IG5ldyBWZWN0b3IzKCksXG4gICAgYW5ndWxhclZlbG9jaXR5OiBuZXcgVmVjdG9yMygpLFxuICAgIG1hc3M6IDEwLFxuICAgIHNjYWxlOiBuZXcgVmVjdG9yMygxLCAxLCAxKSxcbiAgICByZXN0aXR1dGlvbjogMC4zLFxuICAgIGZyaWN0aW9uOiAwLjgsXG4gICAgZGFtcGluZzogMCxcbiAgICBtYXJnaW46IDBcbiAgfSk7XG5cbiAgc3RhdGljIHNvZnRib2R5ID0gKCkgPT4gKHtcbiAgICB0b3VjaGVzOiBbXSxcbiAgICByZXN0aXR1dGlvbjogMC4zLFxuICAgIGZyaWN0aW9uOiAwLjgsXG4gICAgZGFtcGluZzogMCxcbiAgICBzY2FsZTogbmV3IFZlY3RvcjMoMSwgMSwgMSksXG4gICAgcHJlc3N1cmU6IDEwMCxcbiAgICBtYXJnaW46IDAsXG4gICAga2xzdDogMC45LFxuICAgIGt2c3Q6IDAuOSxcbiAgICBrYXN0OiAwLjksXG4gICAgcGl0ZXJhdGlvbnM6IDEsXG4gICAgdml0ZXJhdGlvbnM6IDAsXG4gICAgZGl0ZXJhdGlvbnM6IDAsXG4gICAgY2l0ZXJhdGlvbnM6IDQsXG4gICAgYW5jaG9ySGFyZG5lc3M6IDAuNyxcbiAgICByaWdpZEhhcmRuZXNzOiAxLFxuICAgIGlzU29mdGJvZHk6IHRydWUsXG4gICAgaXNTb2Z0Qm9keVJlc2V0OiBmYWxzZVxuICB9KTtcblxuICBzdGF0aWMgcm9wZSA9ICgpID0+ICh7XG4gICAgdG91Y2hlczogW10sXG4gICAgZnJpY3Rpb246IDAuOCxcbiAgICBzY2FsZTogbmV3IFZlY3RvcjMoMSwgMSwgMSksXG4gICAgZGFtcGluZzogMCxcbiAgICBtYXJnaW46IDAsXG4gICAga2xzdDogMC45LFxuICAgIGt2c3Q6IDAuOSxcbiAgICBrYXN0OiAwLjksXG4gICAgcGl0ZXJhdGlvbnM6IDEsXG4gICAgdml0ZXJhdGlvbnM6IDAsXG4gICAgZGl0ZXJhdGlvbnM6IDAsXG4gICAgY2l0ZXJhdGlvbnM6IDQsXG4gICAgYW5jaG9ySGFyZG5lc3M6IDAuNyxcbiAgICByaWdpZEhhcmRuZXNzOiAxLFxuICAgIGlzU29mdGJvZHk6IHRydWVcbiAgfSk7XG5cbiAgc3RhdGljIGNsb3RoID0gKCkgPT4gKHtcbiAgICB0b3VjaGVzOiBbXSxcbiAgICBmcmljdGlvbjogMC44LFxuICAgIGRhbXBpbmc6IDAsXG4gICAgbWFyZ2luOiAwLFxuICAgIHNjYWxlOiBuZXcgVmVjdG9yMygxLCAxLCAxKSxcbiAgICBrbHN0OiAwLjksXG4gICAga3ZzdDogMC45LFxuICAgIGthc3Q6IDAuOSxcbiAgICBwaXRlcmF0aW9uczogMSxcbiAgICB2aXRlcmF0aW9uczogMCxcbiAgICBkaXRlcmF0aW9uczogMCxcbiAgICBjaXRlcmF0aW9uczogNCxcbiAgICBhbmNob3JIYXJkbmVzczogMC43LFxuICAgIHJpZ2lkSGFyZG5lc3M6IDFcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoZGVmYXVsdHMsIGRhdGEpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZGF0YSA9IE9iamVjdC5hc3NpZ24oZGVmYXVsdHMsIGRhdGEpO1xuICB9XG5cbiAgaW50ZWdyYXRlKHNlbGYpIHtcbiAgICB3cmFwUGh5c2ljc1Byb3RvdHlwZSh0aGlzKTtcbiAgfVxuXG4gIG1hbmFnZXIobWFuYWdlcikge1xuICAgIG1hbmFnZXIuZGVmaW5lKCdwaHlzaWNzJyk7XG5cbiAgICB0aGlzLmV4ZWN1dGUgPSAoLi4uZGF0YSkgPT4ge1xuICAgICAgcmV0dXJuIG1hbmFnZXIuaGFzKCdtb2R1bGU6d29ybGQnKVxuICAgICAgPyBtYW5hZ2VyLmdldCgnbW9kdWxlOndvcmxkJykuZXhlY3V0ZSguLi5kYXRhKVxuICAgICAgOiAoKSA9PiB7fTtcbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlRGF0YShjYWxsYmFjaykge1xuICAgIHRoaXMuYnJpZGdlLmdlb21ldHJ5ID0gZnVuY3Rpb24gKGdlb21ldHJ5LCBtb2R1bGUpIHtcbiAgICAgIGlmICghY2FsbGJhY2spIHJldHVybiBnZW9tZXRyeTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gY2FsbGJhY2soZ2VvbWV0cnksIG1vZHVsZSk7XG4gICAgICByZXR1cm4gcmVzdWx0ID8gcmVzdWx0IDogZ2VvbWV0cnk7XG4gICAgfVxuICB9XG5cbiAgY2xvbmUobWFuYWdlcikge1xuICAgIGNvbnN0IGNsb25lID0gbmV3IHRoaXMuY29uc3RydWN0b3IoKTtcbiAgICBjbG9uZS5kYXRhID0gey4uLnRoaXMuZGF0YX07XG4gICAgY2xvbmUuYnJpZGdlLmdlb21ldHJ5ID0gdGhpcy5icmlkZ2UuZ2VvbWV0cnk7XG4gICAgdGhpcy5tYW5hZ2VyLmFwcGx5KGNsb25lLCBbbWFuYWdlcl0pO1xuXG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG5cbiAgYnJpZGdlID0ge1xuICAgIG9uQ29weSxcbiAgICBvbldyYXBcbiAgfTtcbn1cbiIsImltcG9ydCBQaHlzaWNzTW9kdWxlIGZyb20gJy4vY29yZS9QaHlzaWNzTW9kdWxlJztcblxuZXhwb3J0IGNsYXNzIEJveE1vZHVsZSBleHRlbmRzIFBoeXNpY3NNb2R1bGUge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICBzdXBlcih7XG4gICAgICB0eXBlOiAnYm94JyxcbiAgICAgIC4uLlBoeXNpY3NNb2R1bGUucmlnaWRib2R5KClcbiAgICB9LCBwYXJhbXMpO1xuXG4gICAgdGhpcy51cGRhdGVEYXRhKChnZW9tZXRyeSwge2RhdGF9KSA9PiB7XG4gICAgICBpZiAoIWdlb21ldHJ5LmJvdW5kaW5nQm94KSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTtcblxuICAgICAgZGF0YS53aWR0aCA9IGRhdGEud2lkdGggfHwgZ2VvbWV0cnkuYm91bmRpbmdCb3gubWF4LnggLSBnZW9tZXRyeS5ib3VuZGluZ0JveC5taW4ueDtcbiAgICAgIGRhdGEuaGVpZ2h0ID0gZGF0YS5oZWlnaHQgfHwgZ2VvbWV0cnkuYm91bmRpbmdCb3gubWF4LnkgLSBnZW9tZXRyeS5ib3VuZGluZ0JveC5taW4ueTtcbiAgICAgIGRhdGEuZGVwdGggPSBkYXRhLmRlcHRoIHx8IGdlb21ldHJ5LmJvdW5kaW5nQm94Lm1heC56IC0gZ2VvbWV0cnkuYm91bmRpbmdCb3gubWluLno7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCBQaHlzaWNzTW9kdWxlIGZyb20gJy4vY29yZS9QaHlzaWNzTW9kdWxlJztcblxuZXhwb3J0IGNsYXNzIENvbXBvdW5kTW9kdWxlIGV4dGVuZHMgUGh5c2ljc01vZHVsZSB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgIHN1cGVyKHtcbiAgICAgIHR5cGU6ICdjb21wb3VuZCcsXG4gICAgICAuLi5QaHlzaWNzTW9kdWxlLnJpZ2lkYm9keSgpXG4gICAgfSwgcGFyYW1zKTtcbiAgfVxufVxuIiwiaW1wb3J0IFBoeXNpY3NNb2R1bGUgZnJvbSAnLi9jb3JlL1BoeXNpY3NNb2R1bGUnO1xuXG4vLyBUT0RPOiBUZXN0IENhcHN1bGVNb2R1bGUgaW4gYWN0aW9uLlxuZXhwb3J0IGNsYXNzIENhcHN1bGVNb2R1bGUgZXh0ZW5kcyBQaHlzaWNzTW9kdWxlIHtcbiAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgdHlwZTogJ2NhcHN1bGUnLFxuICAgICAgLi4uUGh5c2ljc01vZHVsZS5yaWdpZGJvZHkoKVxuICAgIH0sIHBhcmFtcyk7XG5cbiAgICB0aGlzLnVwZGF0ZURhdGEoKGdlb21ldHJ5LCB7ZGF0YX0pID0+IHtcbiAgICAgIGlmICghZ2VvbWV0cnkuYm91bmRpbmdCb3gpIGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpO1xuXG4gICAgICBkYXRhLndpZHRoID0gZGF0YS53aWR0aCB8fCBnZW9tZXRyeS5ib3VuZGluZ0JveC5tYXgueCAtIGdlb21ldHJ5LmJvdW5kaW5nQm94Lm1pbi54O1xuICAgICAgZGF0YS5oZWlnaHQgPSBkYXRhLmhlaWdodCB8fCBnZW9tZXRyeS5ib3VuZGluZ0JveC5tYXgueSAtIGdlb21ldHJ5LmJvdW5kaW5nQm94Lm1pbi55O1xuICAgICAgZGF0YS5kZXB0aCA9IGRhdGEuZGVwdGggfHwgZ2VvbWV0cnkuYm91bmRpbmdCb3gubWF4LnogLSBnZW9tZXRyeS5ib3VuZGluZ0JveC5taW4uejtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IFBoeXNpY3NNb2R1bGUgZnJvbSAnLi9jb3JlL1BoeXNpY3NNb2R1bGUnO1xuXG5leHBvcnQgY2xhc3MgQ29uY2F2ZU1vZHVsZSBleHRlbmRzIFBoeXNpY3NNb2R1bGUge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICBzdXBlcih7XG4gICAgICB0eXBlOiAnY29uY2F2ZScsXG4gICAgICAuLi5QaHlzaWNzTW9kdWxlLnJpZ2lkYm9keSgpXG4gICAgfSwgcGFyYW1zKTtcblxuICAgIHRoaXMudXBkYXRlRGF0YSgoZ2VvbWV0cnksIHtkYXRhfSkgPT4ge1xuICAgICAgZGF0YS5kYXRhID0gdGhpcy5nZW9tZXRyeVByb2Nlc3NvcihnZW9tZXRyeSk7XG4gICAgfSk7XG4gIH1cblxuICBnZW9tZXRyeVByb2Nlc3NvcihnZW9tZXRyeSkge1xuICAgIGlmICghZ2VvbWV0cnkuYm91bmRpbmdCb3gpIGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpO1xuXG4gICAgY29uc3QgZGF0YSA9IGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgP1xuICAgICAgZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheSA6XG4gICAgICBuZXcgRmxvYXQzMkFycmF5KGdlb21ldHJ5LmZhY2VzLmxlbmd0aCAqIDkpO1xuXG4gICAgaWYgKCFnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5KSB7XG4gICAgICBjb25zdCB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdlb21ldHJ5LmZhY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGZhY2UgPSBnZW9tZXRyeS5mYWNlc1tpXTtcblxuICAgICAgICBjb25zdCB2QSA9IHZlcnRpY2VzW2ZhY2UuYV07XG4gICAgICAgIGNvbnN0IHZCID0gdmVydGljZXNbZmFjZS5iXTtcbiAgICAgICAgY29uc3QgdkMgPSB2ZXJ0aWNlc1tmYWNlLmNdO1xuXG4gICAgICAgIGNvbnN0IGk5ID0gaSAqIDk7XG5cbiAgICAgICAgZGF0YVtpOV0gPSB2QS54O1xuICAgICAgICBkYXRhW2k5ICsgMV0gPSB2QS55O1xuICAgICAgICBkYXRhW2k5ICsgMl0gPSB2QS56O1xuXG4gICAgICAgIGRhdGFbaTkgKyAzXSA9IHZCLng7XG4gICAgICAgIGRhdGFbaTkgKyA0XSA9IHZCLnk7XG4gICAgICAgIGRhdGFbaTkgKyA1XSA9IHZCLno7XG5cbiAgICAgICAgZGF0YVtpOSArIDZdID0gdkMueDtcbiAgICAgICAgZGF0YVtpOSArIDddID0gdkMueTtcbiAgICAgICAgZGF0YVtpOSArIDhdID0gdkMuejtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfTtcbn1cbiIsImltcG9ydCBQaHlzaWNzTW9kdWxlIGZyb20gJy4vY29yZS9QaHlzaWNzTW9kdWxlJztcblxuZXhwb3J0IGNsYXNzIENvbmVNb2R1bGUgZXh0ZW5kcyBQaHlzaWNzTW9kdWxlIHtcbiAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgdHlwZTogJ2NvbmUnLFxuICAgICAgLi4uUGh5c2ljc01vZHVsZS5yaWdpZGJvZHkoKVxuICAgIH0sIHBhcmFtcyk7XG5cbiAgICB0aGlzLnVwZGF0ZURhdGEoKGdlb21ldHJ5LCB7ZGF0YX0pID0+IHtcbiAgICAgIGlmICghZ2VvbWV0cnkuYm91bmRpbmdCb3gpIGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpO1xuXG4gICAgICBkYXRhLnJhZGl1cyA9IGRhdGEucmFkaXVzIHx8IChnZW9tZXRyeS5ib3VuZGluZ0JveC5tYXgueCAtIGdlb21ldHJ5LmJvdW5kaW5nQm94Lm1pbi54KSAvIDI7XG4gICAgICBkYXRhLmhlaWdodCA9IGRhdGEuaGVpZ2h0IHx8IGdlb21ldHJ5LmJvdW5kaW5nQm94Lm1heC55IC0gZ2VvbWV0cnkuYm91bmRpbmdCb3gubWluLnk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7QnVmZmVyR2VvbWV0cnl9IGZyb20gJ3RocmVlJztcbmltcG9ydCBQaHlzaWNzTW9kdWxlIGZyb20gJy4vY29yZS9QaHlzaWNzTW9kdWxlJztcblxuZXhwb3J0IGNsYXNzIENvbnZleE1vZHVsZSBleHRlbmRzIFBoeXNpY3NNb2R1bGUge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICBzdXBlcih7XG4gICAgICB0eXBlOiAnY29udmV4JyxcbiAgICAgIC4uLlBoeXNpY3NNb2R1bGUucmlnaWRib2R5KClcbiAgICB9LCBwYXJhbXMpO1xuXG4gICAgdGhpcy51cGRhdGVEYXRhKChnZW9tZXRyeSwge2RhdGF9KSA9PiB7XG4gICAgICBpZiAoIWdlb21ldHJ5LmJvdW5kaW5nQm94KSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTtcbiAgICAgIGlmICghZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSkgZ2VvbWV0cnkuX2J1ZmZlckdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCkuZnJvbUdlb21ldHJ5KGdlb21ldHJ5KTtcblxuICAgICAgZGF0YS5kYXRhID0gZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSA/XG4gICAgICAgIGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXkgOlxuICAgICAgICBnZW9tZXRyeS5fYnVmZmVyR2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IFBoeXNpY3NNb2R1bGUgZnJvbSAnLi9jb3JlL1BoeXNpY3NNb2R1bGUnO1xuXG5leHBvcnQgY2xhc3MgQ3lsaW5kZXJNb2R1bGUgZXh0ZW5kcyBQaHlzaWNzTW9kdWxlIHtcbiAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgdHlwZTogJ2N5bGluZGVyJyxcbiAgICAgIC4uLlBoeXNpY3NNb2R1bGUucmlnaWRib2R5KClcbiAgICB9LCBwYXJhbXMpO1xuXG4gICAgdGhpcy51cGRhdGVEYXRhKChnZW9tZXRyeSwge2RhdGF9KSA9PiB7XG4gICAgICBpZiAoIWdlb21ldHJ5LmJvdW5kaW5nQm94KSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTtcblxuICAgICAgZGF0YS53aWR0aCA9IGRhdGEud2lkdGggfHwgZ2VvbWV0cnkuYm91bmRpbmdCb3gubWF4LnggLSBnZW9tZXRyeS5ib3VuZGluZ0JveC5taW4ueDtcbiAgICAgIGRhdGEuaGVpZ2h0ID0gZGF0YS5oZWlnaHQgfHwgZ2VvbWV0cnkuYm91bmRpbmdCb3gubWF4LnkgLSBnZW9tZXRyeS5ib3VuZGluZ0JveC5taW4ueTtcbiAgICAgIGRhdGEuZGVwdGggPSBkYXRhLmRlcHRoIHx8IGdlb21ldHJ5LmJvdW5kaW5nQm94Lm1heC56IC0gZ2VvbWV0cnkuYm91bmRpbmdCb3gubWluLno7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCBQaHlzaWNzTW9kdWxlIGZyb20gJy4vY29yZS9QaHlzaWNzTW9kdWxlJztcbmltcG9ydCB7VmVjdG9yMywgVmVjdG9yMiwgQnVmZmVyR2VvbWV0cnl9IGZyb20gJ3RocmVlJztcblxuZXhwb3J0IGNsYXNzIEhlaWdodGZpZWxkTW9kdWxlIGV4dGVuZHMgUGh5c2ljc01vZHVsZSB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgIHN1cGVyKHtcbiAgICAgIHR5cGU6ICdoZWlnaHRmaWVsZCcsXG4gICAgICBzaXplOiBuZXcgVmVjdG9yMigxLCAxKSxcbiAgICAgIGF1dG9BbGlnbjogZmFsc2UsXG4gICAgICAuLi5QaHlzaWNzTW9kdWxlLnJpZ2lkYm9keSgpXG4gICAgfSwgcGFyYW1zKTtcblxuICAgIHRoaXMudXBkYXRlRGF0YSgoZ2VvbWV0cnksIHtkYXRhfSkgPT4ge1xuICAgICAgY29uc3Qge3g6IHhkaXYsIHk6IHlkaXZ9ID0gZGF0YS5zaXplO1xuICAgICAgY29uc3QgdmVydHMgPSBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ID8gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheSA6IGdlb21ldHJ5LnZlcnRpY2VzO1xuICAgICAgbGV0IHNpemUgPSBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ID8gdmVydHMubGVuZ3RoIC8gMyA6IHZlcnRzLmxlbmd0aDtcblxuICAgICAgaWYgKCFnZW9tZXRyeS5ib3VuZGluZ0JveCkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk7XG5cbiAgICAgIGNvbnN0IHhzaXplID0gZ2VvbWV0cnkuYm91bmRpbmdCb3gubWF4LnggLSBnZW9tZXRyeS5ib3VuZGluZ0JveC5taW4ueDtcbiAgICAgIGNvbnN0IHlzaXplID0gZ2VvbWV0cnkuYm91bmRpbmdCb3gubWF4LnogLSBnZW9tZXRyeS5ib3VuZGluZ0JveC5taW4uejtcblxuICAgICAgZGF0YS54cHRzID0gKHR5cGVvZiB4ZGl2ID09PSAndW5kZWZpbmVkJykgPyBNYXRoLnNxcnQoc2l6ZSkgOiB4ZGl2ICsgMTtcbiAgICAgIGRhdGEueXB0cyA9ICh0eXBlb2YgeWRpdiA9PT0gJ3VuZGVmaW5lZCcpID8gTWF0aC5zcXJ0KHNpemUpIDogeWRpdiArIDE7XG5cbiAgICAgIC8vIG5vdGUgLSB0aGlzIGFzc3VtZXMgb3VyIHBsYW5lIGdlb21ldHJ5IGlzIHNxdWFyZSwgdW5sZXNzIHdlIHBhc3MgaW4gc3BlY2lmaWMgeGRpdiBhbmQgeWRpdlxuICAgICAgZGF0YS5hYnNNYXhIZWlnaHQgPSBNYXRoLm1heChnZW9tZXRyeS5ib3VuZGluZ0JveC5tYXgueSwgTWF0aC5hYnMoZ2VvbWV0cnkuYm91bmRpbmdCb3gubWluLnkpKTtcblxuICAgICAgY29uc3QgcG9pbnRzID0gbmV3IEZsb2F0MzJBcnJheShzaXplKSxcbiAgICAgICAgeHB0cyA9IGRhdGEueHB0cyxcbiAgICAgICAgeXB0cyA9IGRhdGEueXB0cztcblxuICAgICAgd2hpbGUgKHNpemUtLSkge1xuICAgICAgICBjb25zdCB2TnVtID0gc2l6ZSAlIHhwdHMgKyAoKHlwdHMgLSBNYXRoLnJvdW5kKChzaXplIC8geHB0cykgLSAoKHNpemUgJSB4cHRzKSAvIHhwdHMpKSAtIDEpICogeXB0cyk7XG5cbiAgICAgICAgaWYgKGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkpIHBvaW50c1tzaXplXSA9IHZlcnRzW3ZOdW0gKiAzICsgMV07XG4gICAgICAgIGVsc2UgcG9pbnRzW3NpemVdID0gdmVydHNbdk51bV0ueTtcbiAgICAgIH1cblxuICAgICAgZGF0YS5wb2ludHMgPSBwb2ludHM7XG5cbiAgICAgIGRhdGEuc2NhbGUubXVsdGlwbHkoXG4gICAgICAgIG5ldyBWZWN0b3IzKHhzaXplIC8gKHhwdHMgLSAxKSwgMSwgeXNpemUgLyAoeXB0cyAtIDEpKVxuICAgICAgKTtcblxuICAgICAgaWYgKGRhdGEuYXV0b0FsaWduKSBnZW9tZXRyeS50cmFuc2xhdGUoeHNpemUgLyAtMiwgMCwgeXNpemUgLyAtMik7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCBQaHlzaWNzTW9kdWxlIGZyb20gJy4vY29yZS9QaHlzaWNzTW9kdWxlJztcblxuZXhwb3J0IGNsYXNzIFBsYW5lTW9kdWxlIGV4dGVuZHMgUGh5c2ljc01vZHVsZSB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgIHN1cGVyKHtcbiAgICAgIHR5cGU6ICdwbGFuZScsXG4gICAgICAuLi5QaHlzaWNzTW9kdWxlLnJpZ2lkYm9keSgpXG4gICAgfSwgcGFyYW1zKTtcblxuICAgIHRoaXMudXBkYXRlRGF0YSgoZ2VvbWV0cnksIHtkYXRhfSkgPT4ge1xuICAgICAgaWYgKCFnZW9tZXRyeS5ib3VuZGluZ0JveCkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk7XG5cbiAgICAgIGRhdGEud2lkdGggPSBkYXRhLndpZHRoIHx8IGdlb21ldHJ5LmJvdW5kaW5nQm94Lm1heC54IC0gZ2VvbWV0cnkuYm91bmRpbmdCb3gubWluLng7XG4gICAgICBkYXRhLmhlaWdodCA9IGRhdGEuaGVpZ2h0IHx8IGdlb21ldHJ5LmJvdW5kaW5nQm94Lm1heC55IC0gZ2VvbWV0cnkuYm91bmRpbmdCb3gubWluLnk7XG4gICAgICBkYXRhLm5vcm1hbCA9IGRhdGEubm9ybWFsIHx8IGdlb21ldHJ5LmZhY2VzWzBdLm5vcm1hbC5jbG9uZSgpO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgUGh5c2ljc01vZHVsZSBmcm9tICcuL2NvcmUvUGh5c2ljc01vZHVsZSc7XG5cbmV4cG9ydCBjbGFzcyBTcGhlcmVNb2R1bGUgZXh0ZW5kcyBQaHlzaWNzTW9kdWxlIHtcbiAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgdHlwZTogJ3NwaGVyZScsXG4gICAgICAuLi5QaHlzaWNzTW9kdWxlLnJpZ2lkYm9keSgpXG4gICAgfSwgcGFyYW1zKTtcblxuICAgIHRoaXMudXBkYXRlRGF0YSgoZ2VvbWV0cnksIHtkYXRhfSkgPT4ge1xuICAgICAgaWYgKCFnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG4gICAgICBkYXRhLnJhZGl1cyA9IGRhdGEucmFkaXVzIHx8IGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlLnJhZGl1cztcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHtCdWZmZXJHZW9tZXRyeSwgQnVmZmVyQXR0cmlidXRlfSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgUGh5c2ljc01vZHVsZSBmcm9tICcuL2NvcmUvUGh5c2ljc01vZHVsZSc7XG5cbmV4cG9ydCBjbGFzcyBTb2Z0Ym9keU1vZHVsZSBleHRlbmRzIFBoeXNpY3NNb2R1bGUge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICBzdXBlcih7XG4gICAgICB0eXBlOiAnc29mdFRyaW1lc2gnLFxuICAgICAgLi4uUGh5c2ljc01vZHVsZS5zb2Z0Ym9keSgpXG4gICAgfSwgcGFyYW1zKTtcblxuICAgIHRoaXMudXBkYXRlRGF0YSgoZ2VvbWV0cnksIHtkYXRhfSkgPT4ge1xuICAgICAgY29uc3QgaWR4R2VvbWV0cnkgPSBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5XG4gICAgICAgID8gZ2VvbWV0cnlcbiAgICAgICAgOiAoKCkgPT4ge1xuICAgICAgICAgIGdlb21ldHJ5Lm1lcmdlVmVydGljZXMoKTtcblxuICAgICAgICAgIGNvbnN0IGJ1ZmZlckdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cbiAgICAgICAgICBidWZmZXJHZW9tZXRyeS5hZGRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAncG9zaXRpb24nLFxuICAgICAgICAgICAgbmV3IEJ1ZmZlckF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgbmV3IEZsb2F0MzJBcnJheShnZW9tZXRyeS52ZXJ0aWNlcy5sZW5ndGggKiAzKSxcbiAgICAgICAgICAgICAgM1xuICAgICAgICAgICAgKS5jb3B5VmVjdG9yM3NBcnJheShnZW9tZXRyeS52ZXJ0aWNlcylcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgYnVmZmVyR2VvbWV0cnkuc2V0SW5kZXgoXG4gICAgICAgICAgICBuZXcgQnVmZmVyQXR0cmlidXRlKFxuICAgICAgICAgICAgICBuZXcgKGdlb21ldHJ5LmZhY2VzLmxlbmd0aCAqIDMgPiA2NTUzNSA/IFVpbnQzMkFycmF5IDogVWludDE2QXJyYXkpKGdlb21ldHJ5LmZhY2VzLmxlbmd0aCAqIDMpLFxuICAgICAgICAgICAgICAxXG4gICAgICAgICAgICApLmNvcHlJbmRpY2VzQXJyYXkoZ2VvbWV0cnkuZmFjZXMpXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybiBidWZmZXJHZW9tZXRyeTtcbiAgICAgICAgfSkoKTtcblxuICAgICAgZGF0YS5hVmVydGljZXMgPSBpZHhHZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xuICAgICAgZGF0YS5hSW5kaWNlcyA9IGlkeEdlb21ldHJ5LmluZGV4LmFycmF5O1xuXG4gICAgICByZXR1cm4gbmV3IEJ1ZmZlckdlb21ldHJ5KCkuZnJvbUdlb21ldHJ5KGdlb21ldHJ5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFwcGVuZEFuY2hvcihvYmplY3QsIG5vZGUsIGluZmx1ZW5jZSA9IDEsIGNvbGxpc2lvbkJldHdlZW5MaW5rZWRCb2RpZXMgPSB0cnVlKSB7XG4gICAgY29uc3QgbzEgPSB0aGlzLmRhdGEuaWQ7XG4gICAgY29uc3QgbzIgPSBvYmplY3QudXNlKCdwaHlzaWNzJykuZGF0YS5pZDtcblxuICAgIHRoaXMuZXhlY3V0ZSgnYXBwZW5kQW5jaG9yJywge1xuICAgICAgb2JqOiBvMSxcbiAgICAgIG9iajI6IG8yLFxuICAgICAgbm9kZSxcbiAgICAgIGluZmx1ZW5jZSxcbiAgICAgIGNvbGxpc2lvbkJldHdlZW5MaW5rZWRCb2RpZXNcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHtCdWZmZXJHZW9tZXRyeSwgQnVmZmVyQXR0cmlidXRlfSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgUGh5c2ljc01vZHVsZSBmcm9tICcuL2NvcmUvUGh5c2ljc01vZHVsZSc7XG5cbmZ1bmN0aW9uIGFycmF5TWF4KGFycmF5KSB7XG5cdGlmIChhcnJheS5sZW5ndGggPT09IDApIHJldHVybiAtIEluZmluaXR5O1xuXG5cdHZhciBtYXggPSBhcnJheVswXTtcblxuXHRmb3IgKGxldCBpID0gMSwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7ICsrIGkgKSB7XG5cdFx0aWYgKGFycmF5WyBpIF0gPiBtYXgpIG1heCA9IGFycmF5W2ldO1xuXHR9XG5cblx0cmV0dXJuIG1heDtcbn1cblxuZXhwb3J0IGNsYXNzIENsb3RoTW9kdWxlIGV4dGVuZHMgUGh5c2ljc01vZHVsZSB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgIHN1cGVyKHtcbiAgICAgIHR5cGU6ICdzb2Z0Q2xvdGhNZXNoJyxcbiAgICAgIC4uLlBoeXNpY3NNb2R1bGUuY2xvdGgoKVxuICAgIH0sIHBhcmFtcyk7XG5cbiAgICB0aGlzLnVwZGF0ZURhdGEoKGdlb21ldHJ5LCB7ZGF0YX0pID0+IHtcbiAgICAgIGNvbnN0IGdlb21QYXJhbXMgPSBnZW9tZXRyeS5wYXJhbWV0ZXJzO1xuXG4gICAgICBjb25zdCBnZW9tID0gZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeVxuICAgICAgICA/IGdlb21ldHJ5XG4gICAgICAgICAgOiAoKCkgPT4ge1xuICAgICAgICAgIGdlb21ldHJ5Lm1lcmdlVmVydGljZXMoKTtcblxuICAgICAgICAgIGNvbnN0IGJ1ZmZlckdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cbiAgICAgICAgICBidWZmZXJHZW9tZXRyeS5hZGRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAncG9zaXRpb24nLFxuICAgICAgICAgICAgbmV3IEJ1ZmZlckF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgbmV3IEZsb2F0MzJBcnJheShnZW9tZXRyeS52ZXJ0aWNlcy5sZW5ndGggKiAzKSxcbiAgICAgICAgICAgICAgM1xuICAgICAgICAgICAgKS5jb3B5VmVjdG9yM3NBcnJheShnZW9tZXRyeS52ZXJ0aWNlcylcbiAgICAgICAgICApO1xuXG5cdFx0XHRcdFx0Y29uc3QgZmFjZXMgPSBnZW9tZXRyeS5mYWNlcywgZmFjZXNMZW5ndGggPSBmYWNlcy5sZW5ndGgsIHV2cyA9IGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbMF07XG5cbiAgICAgICAgICBjb25zdCBub3JtYWxzQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KGZhY2VzTGVuZ3RoICogMyk7XG4gICAgICAgICAgLy8gY29uc3QgdXZzQXJyYXkgPSBuZXcgQXJyYXkoZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoICogMik7XG4gICAgICAgICAgY29uc3QgdXZzQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KGZhY2VzTGVuZ3RoICogMik7XG4gICAgICAgICAgY29uc3QgdXZzUmVwbGFjZWRBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoZmFjZXNMZW5ndGggKiA2KTtcblx0XHRcdFx0XHRjb25zdCBmYWNlQXJyYXkgPSBuZXcgVWludDMyQXJyYXkoZmFjZXNMZW5ndGggKiAzKTtcblxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmFjZXNMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaTMgPSBpICogMztcbiAgICAgICAgICAgIGNvbnN0IGk2ID0gaSAqIDY7XG4gICAgICAgICAgICBjb25zdCBub3JtYWwgPSBmYWNlc1tpXS5ub3JtYWwgfHwgbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0XHRcdFx0ZmFjZUFycmF5W2kzXSA9IGZhY2VzW2ldLmE7XG4gICAgICAgICAgICBmYWNlQXJyYXlbaTMgKyAxXSA9IGZhY2VzW2ldLmI7XG4gICAgICAgICAgICBmYWNlQXJyYXlbaTMgKyAyXSA9IGZhY2VzW2ldLmM7XG5cbiAgICAgICAgICAgIG5vcm1hbHNBcnJheVtpM10gPSBub3JtYWwueDtcbiAgICAgICAgICAgIG5vcm1hbHNBcnJheVtpMyArIDFdID0gbm9ybWFsLnk7XG4gICAgICAgICAgICBub3JtYWxzQXJyYXlbaTMgKyAyXSA9IG5vcm1hbC56O1xuXG4gICAgICAgICAgICB1dnNBcnJheVtmYWNlc1tpXS5hICogMiArIDBdID0gdXZzW2ldWzBdLng7IC8vIGFcbiAgICAgICAgICAgIHV2c0FycmF5W2ZhY2VzW2ldLmEgKiAyICsgMV0gPSB1dnNbaV1bMF0ueTtcblxuICAgICAgICAgICAgdXZzQXJyYXlbZmFjZXNbaV0uYiAqIDIgKyAwXSA9IHV2c1tpXVsxXS54OyAvLyBiXG4gICAgICAgICAgICB1dnNBcnJheVtmYWNlc1tpXS5iICogMiArIDFdID0gdXZzW2ldWzFdLnk7XG5cbiAgICAgICAgICAgIHV2c0FycmF5W2ZhY2VzW2ldLmMgKiAyICsgMF0gPSB1dnNbaV1bMl0ueDsgLy8gY1xuICAgICAgICAgICAgdXZzQXJyYXlbZmFjZXNbaV0uYyAqIDIgKyAxXSA9IHV2c1tpXVsyXS55O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJ1ZmZlckdlb21ldHJ5LmFkZEF0dHJpYnV0ZShcbiAgICAgICAgICAgICdub3JtYWwnLFxuICAgICAgICAgICAgbmV3IEJ1ZmZlckF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgbm9ybWFsc0FycmF5LFxuICAgICAgICAgICAgICAzXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGJ1ZmZlckdlb21ldHJ5LmFkZEF0dHJpYnV0ZShcbiAgICAgICAgICAgICd1dicsXG4gICAgICAgICAgICBuZXcgQnVmZmVyQXR0cmlidXRlKFxuICAgICAgICAgICAgICB1dnNBcnJheSxcbiAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG5cblx0XHRcdFx0XHRidWZmZXJHZW9tZXRyeS5zZXRJbmRleChcbiAgICAgICAgICAgIG5ldyBCdWZmZXJBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgIG5ldyAoYXJyYXlNYXgoZmFjZXMpICogMyA+IDY1NTM1ID8gVWludDMyQXJyYXkgOiBVaW50MTZBcnJheSkoZmFjZXNMZW5ndGggKiAzKSxcbiAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgKS5jb3B5SW5kaWNlc0FycmF5KGZhY2VzKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4gYnVmZmVyR2VvbWV0cnk7XG4gICAgICAgIH0pKCk7XG5cbiAgICAgIGNvbnN0IHZlcnRzID0gZ2VvbS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xuXG4gICAgICBpZiAoIWdlb21QYXJhbXMud2lkdGhTZWdtZW50cykgZ2VvbVBhcmFtcy53aWR0aFNlZ21lbnRzID0gMTtcbiAgICAgIGlmICghZ2VvbVBhcmFtcy5oZWlnaHRTZWdtZW50cykgZ2VvbVBhcmFtcy5oZWlnaHRTZWdtZW50cyA9IDE7XG5cbiAgICAgIGNvbnN0IGlkeDAwID0gMDtcbiAgICAgIGNvbnN0IGlkeDAxID0gZ2VvbVBhcmFtcy53aWR0aFNlZ21lbnRzO1xuICAgICAgY29uc3QgaWR4MTAgPSAoZ2VvbVBhcmFtcy5oZWlnaHRTZWdtZW50cyArIDEpICogKGdlb21QYXJhbXMud2lkdGhTZWdtZW50cyArIDEpIC0gKGdlb21QYXJhbXMud2lkdGhTZWdtZW50cyArIDEpO1xuICAgICAgY29uc3QgaWR4MTEgPSB2ZXJ0cy5sZW5ndGggLyAzIC0gMTtcblxuICAgICAgZGF0YS5jb3JuZXJzID0gW1xuICAgICAgICB2ZXJ0c1tpZHgwMSAqIDNdLCB2ZXJ0c1tpZHgwMSAqIDMgKyAxXSwgdmVydHNbaWR4MDEgKiAzICsgMl0sIC8vICAg4pWXXG4gICAgICAgIHZlcnRzW2lkeDAwICogM10sIHZlcnRzW2lkeDAwICogMyArIDFdLCB2ZXJ0c1tpZHgwMCAqIDMgKyAyXSwgLy8g4pWUXG4gICAgICAgIHZlcnRzW2lkeDExICogM10sIHZlcnRzW2lkeDExICogMyArIDFdLCB2ZXJ0c1tpZHgxMSAqIDMgKyAyXSwgLy8gICAgICAg4pWdXG4gICAgICAgIHZlcnRzW2lkeDEwICogM10sIHZlcnRzW2lkeDEwICogMyArIDFdLCB2ZXJ0c1tpZHgxMCAqIDMgKyAyXSwgLy8gICAgIOKVmlxuICAgICAgXTtcblxuICAgICAgZGF0YS5zZWdtZW50cyA9IFtnZW9tUGFyYW1zLndpZHRoU2VnbWVudHMgKyAxLCBnZW9tUGFyYW1zLmhlaWdodFNlZ21lbnRzICsgMV07XG5cbiAgICAgIHJldHVybiBnZW9tO1xuICAgIH0pO1xuICB9XG5cbiAgYXBwZW5kQW5jaG9yKG9iamVjdCwgbm9kZSwgaW5mbHVlbmNlLCBjb2xsaXNpb25CZXR3ZWVuTGlua2VkQm9kaWVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IG8xID0gdGhpcy5kYXRhLmlkO1xuICAgIGNvbnN0IG8yID0gb2JqZWN0LnVzZSgncGh5c2ljcycpLmRhdGEuaWQ7XG5cbiAgICB0aGlzLmV4ZWN1dGUoJ2FwcGVuZEFuY2hvcicsIHtcbiAgICAgIG9iajogbzEsXG4gICAgICBvYmoyOiBvMixcbiAgICAgIG5vZGUsXG4gICAgICBpbmZsdWVuY2UsXG4gICAgICBjb2xsaXNpb25CZXR3ZWVuTGlua2VkQm9kaWVzXG4gICAgfSk7XG4gIH1cblxuXHRsaW5rTm9kZXMob2JqZWN0LCBuMSwgbjIsIG1vZGlmaWVyKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXMuZGF0YS5pZDtcbiAgICBjb25zdCBib2R5ID0gb2JqZWN0LnVzZSgncGh5c2ljcycpLmRhdGEuaWQ7XG5cbiAgICB0aGlzLmV4ZWN1dGUoJ2xpbmtOb2RlcycsIHtcbiAgICAgIHNlbGYsXG5cdFx0XHRib2R5LFxuICAgICAgbjEsIC8vIHNlbGYgbm9kZVxuICAgICAgbjIsIC8vIGJvZHkgbm9kZVxuXHRcdFx0bW9kaWZpZXJcbiAgICB9KTtcbiAgfVxuXG4gIGFwcGVuZExpbmVhckpvaW50KG9iamVjdCwgc3BlY3MpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcy5kYXRhLmlkO1xuICAgIGNvbnN0IGJvZHkgPSBvYmplY3QudXNlKCdwaHlzaWNzJykuZGF0YS5pZDtcblxuICAgIHRoaXMuZXhlY3V0ZSgnYXBwZW5kTGluZWFySm9pbnQnLCB7XG4gICAgICBzZWxmLFxuICAgICAgYm9keSxcbiAgICAgIHNwZWNzXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7QnVmZmVyR2VvbWV0cnksIEJ1ZmZlckF0dHJpYnV0ZSwgVmVjdG9yM30gZnJvbSAndGhyZWUnO1xuaW1wb3J0IFBoeXNpY3NNb2R1bGUgZnJvbSAnLi9jb3JlL1BoeXNpY3NNb2R1bGUnO1xuXG5leHBvcnQgY2xhc3MgUm9wZU1vZHVsZSBleHRlbmRzIFBoeXNpY3NNb2R1bGUge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICBzdXBlcih7XG4gICAgICB0eXBlOiAnc29mdFJvcGVNZXNoJyxcbiAgICAgIC4uLlBoeXNpY3NNb2R1bGUucm9wZSgpXG4gICAgfSwgcGFyYW1zKTtcblxuICAgIHRoaXMudXBkYXRlRGF0YSgoZ2VvbWV0cnksIHtkYXRhfSkgPT4ge1xuICAgICAgaWYgKCFnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5KSB7XG4gICAgICAgIGdlb21ldHJ5ID0gKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBidWZmID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cbiAgICAgICAgICBidWZmLmFkZEF0dHJpYnV0ZShcbiAgICAgICAgICAgICdwb3NpdGlvbicsXG4gICAgICAgICAgICBuZXcgQnVmZmVyQXR0cmlidXRlKFxuICAgICAgICAgICAgICBuZXcgRmxvYXQzMkFycmF5KGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCAqIDMpLFxuICAgICAgICAgICAgICAzXG4gICAgICAgICAgICApLmNvcHlWZWN0b3Izc0FycmF5KGdlb21ldHJ5LnZlcnRpY2VzKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4gYnVmZjtcbiAgICAgICAgfSkoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGVuZ3RoID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheS5sZW5ndGggLyAzO1xuICAgICAgY29uc3QgdmVydCA9IG4gPT4gbmV3IFZlY3RvcjMoKS5mcm9tQXJyYXkoZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheSwgbiozKTtcblxuICAgICAgY29uc3QgdjEgPSB2ZXJ0KDApO1xuICAgICAgY29uc3QgdjIgPSB2ZXJ0KGxlbmd0aCAtIDEpO1xuXG4gICAgICBkYXRhLmRhdGEgPSBbXG4gICAgICAgIHYxLngsIHYxLnksIHYxLnosXG4gICAgICAgIHYyLngsIHYyLnksIHYyLnosXG4gICAgICAgIGxlbmd0aFxuICAgICAgXTtcblxuICAgICAgcmV0dXJuIGdlb21ldHJ5O1xuICAgIH0pO1xuICB9XG5cbiAgYXBwZW5kQW5jaG9yKG9iamVjdCwgbm9kZSwgaW5mbHVlbmNlLCBjb2xsaXNpb25CZXR3ZWVuTGlua2VkQm9kaWVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IG8xID0gdGhpcy5kYXRhLmlkO1xuICAgIGNvbnN0IG8yID0gb2JqZWN0LnVzZSgncGh5c2ljcycpLmRhdGEuaWQ7XG5cbiAgICB0aGlzLmV4ZWN1dGUoJ2FwcGVuZEFuY2hvcicsIHtcbiAgICAgIG9iajogbzEsXG4gICAgICBvYmoyOiBvMixcbiAgICAgIG5vZGUsXG4gICAgICBpbmZsdWVuY2UsXG4gICAgICBjb2xsaXNpb25CZXR3ZWVuTGlua2VkQm9kaWVzXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7TG9vcH0gZnJvbSAnd2hzJztcblxuaW1wb3J0IHtcbiAgT2JqZWN0M0QsXG4gIFF1YXRlcm5pb24sXG4gIFZlY3RvcjMsXG4gIEV1bGVyXG59IGZyb20gJ3RocmVlJztcblxuY29uc3QgUElfMiA9IE1hdGguUEkgLyAyO1xuXG4vLyBUT0RPOiBGaXggRE9NXG5mdW5jdGlvbiBGaXJzdFBlcnNvbkNvbnRyb2xzU29sdmVyKGNhbWVyYSwgbWVzaCwgcGFyYW1zKSB7XG4gIGNvbnN0IHZlbG9jaXR5RmFjdG9yID0gMTtcbiAgbGV0IHJ1blZlbG9jaXR5ID0gMC4yNTtcblxuICBtZXNoLnVzZSgncGh5c2ljcycpLnNldEFuZ3VsYXJGYWN0b3Ioe3g6IDAsIHk6IDAsIHo6IDB9KTtcbiAgY2FtZXJhLnBvc2l0aW9uLnNldCgwLCAwLCAwKTtcblxuICAvKiBJbml0ICovXG4gIGNvbnN0IHBsYXllciA9IG1lc2gsXG4gICAgcGl0Y2hPYmplY3QgPSBuZXcgT2JqZWN0M0QoKTtcblxuICBwaXRjaE9iamVjdC5hZGQoY2FtZXJhLm5hdGl2ZSk7XG5cbiAgY29uc3QgeWF3T2JqZWN0ID0gbmV3IE9iamVjdDNEKCk7XG5cbiAgeWF3T2JqZWN0LnBvc2l0aW9uLnkgPSBwYXJhbXMueXBvczsgLy8gZXllcyBhcmUgMiBtZXRlcnMgYWJvdmUgdGhlIGdyb3VuZFxuICB5YXdPYmplY3QuYWRkKHBpdGNoT2JqZWN0KTtcblxuICBjb25zdCBxdWF0ID0gbmV3IFF1YXRlcm5pb24oKTtcblxuICBsZXQgY2FuSnVtcCA9IGZhbHNlLFxuICAgIC8vIE1vdmVzLlxuICAgIG1vdmVGb3J3YXJkID0gZmFsc2UsXG4gICAgbW92ZUJhY2t3YXJkID0gZmFsc2UsXG4gICAgbW92ZUxlZnQgPSBmYWxzZSxcbiAgICBtb3ZlUmlnaHQgPSBmYWxzZTtcblxuICBwbGF5ZXIub24oJ2NvbGxpc2lvbicsIChvdGhlck9iamVjdCwgdiwgciwgY29udGFjdE5vcm1hbCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGNvbnRhY3ROb3JtYWwueSk7XG4gICAgaWYgKGNvbnRhY3ROb3JtYWwueSA8IDAuNSkgLy8gVXNlIGEgXCJnb29kXCIgdGhyZXNob2xkIHZhbHVlIGJldHdlZW4gMCBhbmQgMSBoZXJlIVxuICAgICAgY2FuSnVtcCA9IHRydWU7XG4gIH0pO1xuXG4gIGNvbnN0IG9uTW91c2VNb3ZlID0gZXZlbnQgPT4ge1xuICAgIGlmICh0aGlzLmVuYWJsZWQgPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICBjb25zdCBtb3ZlbWVudFggPSB0eXBlb2YgZXZlbnQubW92ZW1lbnRYID09PSAnbnVtYmVyJ1xuICAgICAgPyBldmVudC5tb3ZlbWVudFggOiB0eXBlb2YgZXZlbnQubW96TW92ZW1lbnRYID09PSAnbnVtYmVyJ1xuICAgICAgICA/IGV2ZW50Lm1vek1vdmVtZW50WCA6IHR5cGVvZiBldmVudC5nZXRNb3ZlbWVudFggPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IGV2ZW50LmdldE1vdmVtZW50WCgpIDogMDtcbiAgICBjb25zdCBtb3ZlbWVudFkgPSB0eXBlb2YgZXZlbnQubW92ZW1lbnRZID09PSAnbnVtYmVyJ1xuICAgICAgPyBldmVudC5tb3ZlbWVudFkgOiB0eXBlb2YgZXZlbnQubW96TW92ZW1lbnRZID09PSAnbnVtYmVyJ1xuICAgICAgICA/IGV2ZW50Lm1vek1vdmVtZW50WSA6IHR5cGVvZiBldmVudC5nZXRNb3ZlbWVudFkgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IGV2ZW50LmdldE1vdmVtZW50WSgpIDogMDtcblxuICAgIHlhd09iamVjdC5yb3RhdGlvbi55IC09IG1vdmVtZW50WCAqIDAuMDAyO1xuICAgIHBpdGNoT2JqZWN0LnJvdGF0aW9uLnggLT0gbW92ZW1lbnRZICogMC4wMDI7XG5cbiAgICBwaXRjaE9iamVjdC5yb3RhdGlvbi54ID0gTWF0aC5tYXgoLVBJXzIsIE1hdGgubWluKFBJXzIsIHBpdGNoT2JqZWN0LnJvdGF0aW9uLngpKTtcbiAgfTtcblxuICBjb25zdCBwaHlzaWNzID0gcGxheWVyLnVzZSgncGh5c2ljcycpO1xuXG4gIGNvbnN0IG9uS2V5RG93biA9IGV2ZW50ID0+IHtcbiAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcbiAgICAgIGNhc2UgMzg6IC8vIHVwXG4gICAgICBjYXNlIDg3OiAvLyB3XG4gICAgICAgIG1vdmVGb3J3YXJkID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMzc6IC8vIGxlZnRcbiAgICAgIGNhc2UgNjU6IC8vIGFcbiAgICAgICAgbW92ZUxlZnQgPSB0cnVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSA0MDogLy8gZG93blxuICAgICAgY2FzZSA4MzogLy8gc1xuICAgICAgICBtb3ZlQmFja3dhcmQgPSB0cnVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAzOTogLy8gcmlnaHRcbiAgICAgIGNhc2UgNjg6IC8vIGRcbiAgICAgICAgbW92ZVJpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMzI6IC8vIHNwYWNlXG4gICAgICAgIGNvbnNvbGUubG9nKGNhbkp1bXApO1xuICAgICAgICBpZiAoY2FuSnVtcCA9PT0gdHJ1ZSkgcGh5c2ljcy5hcHBseUNlbnRyYWxJbXB1bHNlKHt4OiAwLCB5OiAzMDAsIHo6IDB9KTtcbiAgICAgICAgY2FuSnVtcCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAxNjogLy8gc2hpZnRcbiAgICAgICAgcnVuVmVsb2NpdHkgPSAwLjU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgIH1cbiAgfTtcblxuICBjb25zdCBvbktleVVwID0gZXZlbnQgPT4ge1xuICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSkge1xuICAgICAgY2FzZSAzODogLy8gdXBcbiAgICAgIGNhc2UgODc6IC8vIHdcbiAgICAgICAgbW92ZUZvcndhcmQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMzc6IC8vIGxlZnRcbiAgICAgIGNhc2UgNjU6IC8vIGFcbiAgICAgICAgbW92ZUxlZnQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgNDA6IC8vIGRvd25cbiAgICAgIGNhc2UgODM6IC8vIGFcbiAgICAgICAgbW92ZUJhY2t3YXJkID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDM5OiAvLyByaWdodFxuICAgICAgY2FzZSA2ODogLy8gZFxuICAgICAgICBtb3ZlUmlnaHQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMTY6IC8vIHNoaWZ0XG4gICAgICAgIHJ1blZlbG9jaXR5ID0gMC4yNTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuICB9O1xuXG4gIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUsIGZhbHNlKTtcbiAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXlEb3duLCBmYWxzZSk7XG4gIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBvbktleVVwLCBmYWxzZSk7XG5cbiAgdGhpcy5lbmFibGVkID0gZmFsc2U7XG4gIHRoaXMuZ2V0T2JqZWN0ID0gKCkgPT4geWF3T2JqZWN0O1xuXG4gIHRoaXMuZ2V0RGlyZWN0aW9uID0gdGFyZ2V0VmVjID0+IHtcbiAgICB0YXJnZXRWZWMuc2V0KDAsIDAsIC0xKTtcbiAgICBxdWF0Lm11bHRpcGx5VmVjdG9yMyh0YXJnZXRWZWMpO1xuICB9O1xuXG4gIC8vIE1vdmVzIHRoZSBjYW1lcmEgdG8gdGhlIFBoeXNpLmpzIG9iamVjdCBwb3NpdGlvblxuICAvLyBhbmQgYWRkcyB2ZWxvY2l0eSB0byB0aGUgb2JqZWN0IGlmIHRoZSBydW4ga2V5IGlzIGRvd24uXG4gIGNvbnN0IGlucHV0VmVsb2NpdHkgPSBuZXcgVmVjdG9yMygpLFxuICAgIGV1bGVyID0gbmV3IEV1bGVyKCk7XG5cbiAgdGhpcy51cGRhdGUgPSBkZWx0YSA9PiB7XG4gICAgaWYgKHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UpIHJldHVybjtcblxuICAgIGRlbHRhID0gZGVsdGEgfHwgMC41O1xuICAgIGRlbHRhID0gTWF0aC5taW4oZGVsdGEsIDAuNSwgZGVsdGEpO1xuXG4gICAgaW5wdXRWZWxvY2l0eS5zZXQoMCwgMCwgMCk7XG5cbiAgICBjb25zdCBzcGVlZCA9IHZlbG9jaXR5RmFjdG9yICogZGVsdGEgKiBwYXJhbXMuc3BlZWQgKiBydW5WZWxvY2l0eTtcblxuICAgIGlmIChtb3ZlRm9yd2FyZCkgaW5wdXRWZWxvY2l0eS56ID0gLXNwZWVkO1xuICAgIGlmIChtb3ZlQmFja3dhcmQpIGlucHV0VmVsb2NpdHkueiA9IHNwZWVkO1xuICAgIGlmIChtb3ZlTGVmdCkgaW5wdXRWZWxvY2l0eS54ID0gLXNwZWVkO1xuICAgIGlmIChtb3ZlUmlnaHQpIGlucHV0VmVsb2NpdHkueCA9IHNwZWVkO1xuXG4gICAgLy8gQ29udmVydCB2ZWxvY2l0eSB0byB3b3JsZCBjb29yZGluYXRlc1xuICAgIGV1bGVyLnggPSBwaXRjaE9iamVjdC5yb3RhdGlvbi54O1xuICAgIGV1bGVyLnkgPSB5YXdPYmplY3Qucm90YXRpb24ueTtcbiAgICBldWxlci5vcmRlciA9ICdYWVonO1xuXG4gICAgcXVhdC5zZXRGcm9tRXVsZXIoZXVsZXIpO1xuXG4gICAgaW5wdXRWZWxvY2l0eS5hcHBseVF1YXRlcm5pb24ocXVhdCk7XG5cbiAgICBwaHlzaWNzLmFwcGx5Q2VudHJhbEltcHVsc2Uoe3g6IGlucHV0VmVsb2NpdHkueCwgeTogMCwgejogaW5wdXRWZWxvY2l0eS56fSk7XG4gICAgcGh5c2ljcy5zZXRBbmd1bGFyVmVsb2NpdHkoe3g6IGlucHV0VmVsb2NpdHkueiwgeTogMCwgejogLWlucHV0VmVsb2NpdHkueH0pO1xuICAgIHBoeXNpY3Muc2V0QW5ndWxhckZhY3Rvcih7eDogMCwgeTogMCwgejogMH0pO1xuICB9O1xuXG4gIHBsYXllci5vbigncGh5c2ljczphZGRlZCcsICgpID0+IHtcbiAgICBwbGF5ZXIubWFuYWdlci5nZXQoJ21vZHVsZTp3b3JsZCcpLmFkZEV2ZW50TGlzdGVuZXIoJ3VwZGF0ZScsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmVuYWJsZWQgPT09IGZhbHNlKSByZXR1cm47XG4gICAgICB5YXdPYmplY3QucG9zaXRpb24uY29weShwbGF5ZXIucG9zaXRpb24pO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZXhwb3J0IGNsYXNzIEZpcnN0UGVyc29uTW9kdWxlIHtcbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIGJsb2NrOiBudWxsLFxuICAgIHNwZWVkOiAxLFxuICAgIHlwb3M6IDFcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihvYmplY3QsIHBhcmFtcyA9IHt9KSB7XG4gICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7XG4gICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG5cbiAgICBpZiAoIXRoaXMucGFyYW1zLmJsb2NrKSB7XG4gICAgICB0aGlzLnBhcmFtcy5ibG9jayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdibG9ja2VyJyk7XG4gICAgfVxuICB9XG5cbiAgbWFuYWdlcihtYW5hZ2VyKSB7XG4gICAgdGhpcy5jb250cm9scyA9IG5ldyBGaXJzdFBlcnNvbkNvbnRyb2xzU29sdmVyKG1hbmFnZXIuZ2V0KCdjYW1lcmEnKSwgdGhpcy5vYmplY3QsIHRoaXMucGFyYW1zKTtcblxuICAgIGlmICgncG9pbnRlckxvY2tFbGVtZW50JyBpbiBkb2N1bWVudFxuICAgICAgfHwgJ21velBvaW50ZXJMb2NrRWxlbWVudCcgaW4gZG9jdW1lbnRcbiAgICAgIHx8ICd3ZWJraXRQb2ludGVyTG9ja0VsZW1lbnQnIGluIGRvY3VtZW50KSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuYm9keTtcblxuICAgICAgY29uc3QgcG9pbnRlcmxvY2tjaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgIGlmIChkb2N1bWVudC5wb2ludGVyTG9ja0VsZW1lbnQgPT09IGVsZW1lbnRcbiAgICAgICAgICB8fCBkb2N1bWVudC5tb3pQb2ludGVyTG9ja0VsZW1lbnQgPT09IGVsZW1lbnRcbiAgICAgICAgICB8fCBkb2N1bWVudC53ZWJraXRQb2ludGVyTG9ja0VsZW1lbnQgPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLmNvbnRyb2xzLmVuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMucGFyYW1zLmJsb2NrLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jb250cm9scy5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5wYXJhbXMuYmxvY2suc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJsb2NrY2hhbmdlJywgcG9pbnRlcmxvY2tjaGFuZ2UsIGZhbHNlKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21venBvaW50ZXJsb2NrY2hhbmdlJywgcG9pbnRlcmxvY2tjaGFuZ2UsIGZhbHNlKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmtpdHBvaW50ZXJsb2NrY2hhbmdlJywgcG9pbnRlcmxvY2tjaGFuZ2UsIGZhbHNlKTtcblxuICAgICAgY29uc3QgcG9pbnRlcmxvY2tlcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdQb2ludGVyIGxvY2sgZXJyb3IuJyk7XG4gICAgICB9O1xuXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybG9ja2Vycm9yJywgcG9pbnRlcmxvY2tlcnJvciwgZmFsc2UpO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW96cG9pbnRlcmxvY2tlcnJvcicsIHBvaW50ZXJsb2NrZXJyb3IsIGZhbHNlKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmtpdHBvaW50ZXJsb2NrZXJyb3InLCBwb2ludGVybG9ja2Vycm9yLCBmYWxzZSk7XG5cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgZWxlbWVudC5yZXF1ZXN0UG9pbnRlckxvY2sgPSBlbGVtZW50LnJlcXVlc3RQb2ludGVyTG9ja1xuICAgICAgICAgIHx8IGVsZW1lbnQubW96UmVxdWVzdFBvaW50ZXJMb2NrXG4gICAgICAgICAgfHwgZWxlbWVudC53ZWJraXRSZXF1ZXN0UG9pbnRlckxvY2s7XG5cbiAgICAgICAgZWxlbWVudC5yZXF1ZXN0RnVsbHNjcmVlbiA9IGVsZW1lbnQucmVxdWVzdEZ1bGxzY3JlZW5cbiAgICAgICAgICB8fCBlbGVtZW50Lm1velJlcXVlc3RGdWxsc2NyZWVuXG4gICAgICAgICAgfHwgZWxlbWVudC5tb3pSZXF1ZXN0RnVsbFNjcmVlblxuICAgICAgICAgIHx8IGVsZW1lbnQud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW47XG5cbiAgICAgICAgaWYgKC9GaXJlZm94L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkge1xuICAgICAgICAgIGNvbnN0IGZ1bGxzY3JlZW5jaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQgPT09IGVsZW1lbnRcbiAgICAgICAgICAgICAgfHwgZG9jdW1lbnQubW96RnVsbHNjcmVlbkVsZW1lbnQgPT09IGVsZW1lbnRcbiAgICAgICAgICAgICAgfHwgZG9jdW1lbnQubW96RnVsbFNjcmVlbkVsZW1lbnQgPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZnVsbHNjcmVlbmNoYW5nZScsIGZ1bGxzY3JlZW5jaGFuZ2UpO1xuICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3pmdWxsc2NyZWVuY2hhbmdlJywgZnVsbHNjcmVlbmNoYW5nZSk7XG5cbiAgICAgICAgICAgICAgZWxlbWVudC5yZXF1ZXN0UG9pbnRlckxvY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZnVsbHNjcmVlbmNoYW5nZScsIGZ1bGxzY3JlZW5jaGFuZ2UsIGZhbHNlKTtcbiAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3pmdWxsc2NyZWVuY2hhbmdlJywgZnVsbHNjcmVlbmNoYW5nZSwgZmFsc2UpO1xuXG4gICAgICAgICAgZWxlbWVudC5yZXF1ZXN0RnVsbHNjcmVlbigpO1xuICAgICAgICB9IGVsc2UgZWxlbWVudC5yZXF1ZXN0UG9pbnRlckxvY2soKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBjb25zb2xlLndhcm4oJ1lvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBQb2ludGVyTG9jaycpO1xuXG4gICAgbWFuYWdlci5nZXQoJ3NjZW5lJykuYWRkKHRoaXMuY29udHJvbHMuZ2V0T2JqZWN0KCkpO1xuICB9XG5cbiAgaW50ZWdyYXRlKHNlbGYpIHtcbiAgICBjb25zdCB1cGRhdGVQcm9jZXNzb3IgPSBjID0+IHtcbiAgICAgIHNlbGYuY29udHJvbHMudXBkYXRlKGMuZ2V0RGVsdGEoKSk7XG4gICAgfTtcblxuICAgIHNlbGYudXBkYXRlTG9vcCA9IG5ldyBMb29wKHVwZGF0ZVByb2Nlc3Nvcikuc3RhcnQodGhpcyk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJNRVNTQUdFX1RZUEVTIiwiV09STERSRVBPUlQiLCJDT0xMSVNJT05SRVBPUlQiLCJWRUhJQ0xFUkVQT1JUIiwiQ09OU1RSQUlOVFJFUE9SVCIsIlNPRlRSRVBPUlQiLCJSRVBPUlRfSVRFTVNJWkUiLCJDT0xMSVNJT05SRVBPUlRfSVRFTVNJWkUiLCJWRUhJQ0xFUkVQT1JUX0lURU1TSVpFIiwiQ09OU1RSQUlOVFJFUE9SVF9JVEVNU0laRSIsInRlbXAxVmVjdG9yMyIsIlZlY3RvcjMiLCJ0ZW1wMlZlY3RvcjMiLCJ0ZW1wMU1hdHJpeDQiLCJNYXRyaXg0IiwidGVtcDFRdWF0IiwiUXVhdGVybmlvbiIsImdldEV1bGVyWFlaRnJvbVF1YXRlcm5pb24iLCJ4IiwieSIsInoiLCJ3IiwiTWF0aCIsImF0YW4yIiwiYXNpbiIsImdldFF1YXRlcnRpb25Gcm9tRXVsZXIiLCJjMSIsImNvcyIsInMxIiwic2luIiwiYzIiLCJzMiIsImMzIiwiczMiLCJjMWMyIiwiczFzMiIsImNvbnZlcnRXb3JsZFBvc2l0aW9uVG9PYmplY3QiLCJwb3NpdGlvbiIsIm9iamVjdCIsImlkZW50aXR5IiwibWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24iLCJxdWF0ZXJuaW9uIiwiZ2V0SW52ZXJzZSIsImNvcHkiLCJzdWIiLCJhcHBseU1hdHJpeDQiLCJhZGRPYmplY3RDaGlsZHJlbiIsInBhcmVudCIsImkiLCJjaGlsZHJlbiIsImxlbmd0aCIsImNoaWxkIiwicGh5c2ljcyIsImNvbXBvbmVudCIsInVzZSIsImRhdGEiLCJ1cGRhdGVNYXRyaXgiLCJ1cGRhdGVNYXRyaXhXb3JsZCIsInNldEZyb21NYXRyaXhQb3NpdGlvbiIsIm1hdHJpeFdvcmxkIiwic2V0RnJvbVJvdGF0aW9uTWF0cml4IiwicG9zaXRpb25fb2Zmc2V0Iiwicm90YXRpb24iLCJwdXNoIiwiRXZlbnRhYmxlIiwiX2V2ZW50TGlzdGVuZXJzIiwiZXZlbnRfbmFtZSIsImNhbGxiYWNrIiwiaGFzT3duUHJvcGVydHkiLCJpbmRleCIsImluZGV4T2YiLCJzcGxpY2UiLCJwYXJhbWV0ZXJzIiwiQXJyYXkiLCJwcm90b3R5cGUiLCJjYWxsIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJvYmoiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImRpc3BhdGNoRXZlbnQiLCJDb25lVHdpc3RDb25zdHJhaW50Iiwib2JqYSIsIm9iamIiLCJvYmplY3RhIiwib2JqZWN0YiIsInVuZGVmaW5lZCIsImNvbnNvbGUiLCJlcnJvciIsInR5cGUiLCJhcHBsaWVkSW1wdWxzZSIsIndvcmxkTW9kdWxlIiwiaWQiLCJwb3NpdGlvbmEiLCJjbG9uZSIsInBvc2l0aW9uYiIsImF4aXNhIiwiYXhpc2IiLCJleGVjdXRlIiwiY29uc3RyYWludCIsIm1heF9pbXB1bHNlIiwidGFyZ2V0Iiwic2V0RnJvbUV1bGVyIiwiRXVsZXIiLCJIaW5nZUNvbnN0cmFpbnQiLCJheGlzIiwibG93IiwiaGlnaCIsImJpYXNfZmFjdG9yIiwicmVsYXhhdGlvbl9mYWN0b3IiLCJ2ZWxvY2l0eSIsImFjY2VsZXJhdGlvbiIsIlBvaW50Q29uc3RyYWludCIsIlNsaWRlckNvbnN0cmFpbnQiLCJsaW5fbG93ZXIiLCJsaW5fdXBwZXIiLCJhbmdfbG93ZXIiLCJhbmdfdXBwZXIiLCJsaW5lYXIiLCJhbmd1bGFyIiwic2NlbmUiLCJET0ZDb25zdHJhaW50IiwibGltaXQiLCJ3aGljaCIsImxvd19hbmdsZSIsImhpZ2hfYW5nbGUiLCJtYXhfZm9yY2UiLCJWZWhpY2xlIiwibWVzaCIsInR1bmluZyIsIlZlaGljbGVUdW5pbmciLCJ3aGVlbHMiLCJfcGh5c2lqcyIsImdldE9iamVjdElkIiwicmlnaWRCb2R5Iiwic3VzcGVuc2lvbl9zdGlmZm5lc3MiLCJzdXNwZW5zaW9uX2NvbXByZXNzaW9uIiwic3VzcGVuc2lvbl9kYW1waW5nIiwibWF4X3N1c3BlbnNpb25fdHJhdmVsIiwiZnJpY3Rpb25fc2xpcCIsIm1heF9zdXNwZW5zaW9uX2ZvcmNlIiwid2hlZWxfZ2VvbWV0cnkiLCJ3aGVlbF9tYXRlcmlhbCIsImNvbm5lY3Rpb25fcG9pbnQiLCJ3aGVlbF9kaXJlY3Rpb24iLCJ3aGVlbF9heGxlIiwic3VzcGVuc2lvbl9yZXN0X2xlbmd0aCIsIndoZWVsX3JhZGl1cyIsImlzX2Zyb250X3doZWVsIiwid2hlZWwiLCJNZXNoIiwiY2FzdFNoYWRvdyIsInJlY2VpdmVTaGFkb3ciLCJtdWx0aXBseVNjYWxhciIsImFkZCIsIndvcmxkIiwiYW1vdW50Iiwic3RlZXJpbmciLCJicmFrZSIsImZvcmNlIiwiV29ybGRNb2R1bGVCYXNlIiwib3B0aW9ucyIsImJyaWRnZSIsIm9uQWRkIiwic2VsZiIsImRlZmVyIiwib25BZGRDYWxsYmFjayIsImJpbmQiLCJvblJlbW92ZSIsIm9uUmVtb3ZlQ2FsbGJhY2siLCJPYmplY3QiLCJhc3NpZ24iLCJkZWZhdWx0cyIsIm9iamVjdHMiLCJ2ZWhpY2xlcyIsImNvbnN0cmFpbnRzIiwiaXNTaW11bGF0aW5nIiwicmVjZWl2ZSIsIl90ZW1wIiwiZXZlbnQiLCJBcnJheUJ1ZmZlciIsImJ5dGVMZW5ndGgiLCJGbG9hdDMyQXJyYXkiLCJ1cGRhdGVTY2VuZSIsInVwZGF0ZVNvZnRib2RpZXMiLCJ1cGRhdGVDb2xsaXNpb25zIiwidXBkYXRlVmVoaWNsZXMiLCJ1cGRhdGVDb25zdHJhaW50cyIsImNtZCIsInBhcmFtcyIsIndpbmRvdyIsInRlc3QiLCJkZWJ1ZyIsImRpciIsImluZm8iLCJvZmZzZXQiLCJfX2RpcnR5UG9zaXRpb24iLCJzZXQiLCJfX2RpcnR5Um90YXRpb24iLCJsaW5lYXJWZWxvY2l0eSIsImFuZ3VsYXJWZWxvY2l0eSIsIlNVUFBPUlRfVFJBTlNGRVJBQkxFIiwic2VuZCIsImJ1ZmZlciIsInNpemUiLCJhdHRyaWJ1dGVzIiwiZ2VvbWV0cnkiLCJ2b2x1bWVQb3NpdGlvbnMiLCJhcnJheSIsIm9mZnNldFZlcnQiLCJpc1NvZnRCb2R5UmVzZXQiLCJ2b2x1bWVOb3JtYWxzIiwibm9ybWFsIiwib2ZmcyIsIngxIiwieTEiLCJ6MSIsIm54MSIsIm55MSIsIm56MSIsIngyIiwieTIiLCJ6MiIsIm54MiIsIm55MiIsIm56MiIsIngzIiwieTMiLCJ6MyIsIm54MyIsIm55MyIsIm56MyIsImk5IiwibmVlZHNVcGRhdGUiLCJueCIsIm55IiwibnoiLCJ2ZWhpY2xlIiwiZXh0cmFjdFJvdGF0aW9uIiwibWF0cml4IiwiYWRkVmVjdG9ycyIsImNvbGxpc2lvbnMiLCJub3JtYWxfb2Zmc2V0cyIsIm9iamVjdDIiLCJpZDEiLCJqIiwidG91Y2hlcyIsImlkMiIsImNvbXBvbmVudDIiLCJkYXRhMiIsInZlbCIsImdldExpbmVhclZlbG9jaXR5IiwidmVsMiIsInN1YlZlY3RvcnMiLCJ0ZW1wMSIsInRlbXAyIiwibm9ybWFsX29mZnNldCIsImVtaXQiLCJzaG93X21hcmtlciIsImdldERlZmluaXRpb24iLCJtYXJrZXIiLCJTcGhlcmVHZW9tZXRyeSIsIk1lc2hOb3JtYWxNYXRlcmlhbCIsIkJveEdlb21ldHJ5IiwibmF0aXZlIiwibWFuYWdlciIsIndpZHRoIiwic2NhbGUiLCJoZWlnaHQiLCJkZXB0aCIsInJlbW92ZSIsInBvcCIsImZ1bmMiLCJhcmdzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJpc0xvYWRlZCIsImxvYWRlciIsInRoZW4iLCJkZWZpbmUiLCJ3b3JrZXIiLCJzZXRGaXhlZFRpbWVTdGVwIiwiZml4ZWRUaW1lU3RlcCIsInNldEdyYXZpdHkiLCJncmF2aXR5IiwiYWRkQ29uc3RyYWludCIsInNpbXVsYXRlIiwidGltZVN0ZXAiLCJtYXhTdWJTdGVwcyIsIl9zdGF0cyIsImJlZ2luIiwib2JqZWN0X2lkIiwidXBkYXRlIiwicG9zIiwiaXNTb2Z0Ym9keSIsInF1YXQiLCJlbmQiLCJzaW11bGF0ZUxvb3AiLCJMb29wIiwiY2xvY2siLCJnZXREZWx0YSIsInN0YXJ0IiwibG9nIiwicmF0ZUxpbWl0IiwiYW1tbyIsInNvZnRib2R5IiwiVEFSR0VUIiwiU3ltYm9sIiwiU0NSSVBUX1RZUEUiLCJCbG9iQnVpbGRlciIsIldlYktpdEJsb2JCdWlsZGVyIiwiTW96QmxvYkJ1aWxkZXIiLCJNU0Jsb2JCdWlsZGVyIiwiVVJMIiwid2Via2l0VVJMIiwiV29ya2VyIiwic2hpbVdvcmtlciIsImZpbGVuYW1lIiwiZm4iLCJTaGltV29ya2VyIiwiZm9yY2VGYWxsYmFjayIsIm8iLCJzb3VyY2UiLCJ0b1N0cmluZyIsInJlcGxhY2UiLCJzbGljZSIsIm9ialVSTCIsImNyZWF0ZVNvdXJjZU9iamVjdCIsInJldm9rZU9iamVjdFVSTCIsInNlbGZTaGltIiwicG9zdE1lc3NhZ2UiLCJtIiwib25tZXNzYWdlIiwic2V0VGltZW91dCIsImlzVGhpc1RocmVhZCIsInRlc3RXb3JrZXIiLCJ0ZXN0QXJyYXkiLCJVaW50OEFycmF5IiwibmF2aWdhdG9yIiwidXNlckFnZW50IiwiRXJyb3IiLCJlIiwidGVybWluYXRlIiwic3RyIiwiY3JlYXRlT2JqZWN0VVJMIiwiQmxvYiIsImJsb2IiLCJhcHBlbmQiLCJnZXRCbG9iIiwiZG9jdW1lbnQiLCJFdmVudHMiLCJldmVudHMiLCJlbXB0eSIsIm9uIiwiY3R4Iiwib2ZmIiwibGlzdCIsImluc2lkZVdvcmtlciIsIndlYmtpdFBvc3RNZXNzYWdlIiwiYWIiLCJfb2JqZWN0IiwiX3ZlY3RvciIsIl90cmFuc2Zvcm0iLCJfdHJhbnNmb3JtX3BvcyIsIl9zb2Z0Ym9keV9lbmFibGVkIiwibGFzdF9zaW11bGF0aW9uX2R1cmF0aW9uIiwiX251bV9vYmplY3RzIiwiX251bV9yaWdpZGJvZHlfb2JqZWN0cyIsIl9udW1fc29mdGJvZHlfb2JqZWN0cyIsIl9udW1fd2hlZWxzIiwiX251bV9jb25zdHJhaW50cyIsIl9zb2Z0Ym9keV9yZXBvcnRfc2l6ZSIsIl92ZWMzXzEiLCJfdmVjM18yIiwiX3ZlYzNfMyIsIl9xdWF0IiwicHVibGljX2Z1bmN0aW9ucyIsIl9vYmplY3RzIiwiX3ZlaGljbGVzIiwiX2NvbnN0cmFpbnRzIiwiX29iamVjdHNfYW1tbyIsIl9vYmplY3Rfc2hhcGVzIiwiX21vdGlvbl9zdGF0ZXMiLCJfbm9uY2FjaGVkX3NoYXBlcyIsIl9jb21wb3VuZF9zaGFwZXMiLCJSRVBPUlRfQ0hVTktTSVpFIiwid29ybGRyZXBvcnQiLCJzb2Z0cmVwb3J0IiwiY29sbGlzaW9ucmVwb3J0IiwidmVoaWNsZXJlcG9ydCIsImNvbnN0cmFpbnRyZXBvcnQiLCJXT1JMRFJFUE9SVF9JVEVNU0laRSIsImdldFNoYXBlRnJvbUNhY2hlIiwiY2FjaGVfa2V5Iiwic2V0U2hhcGVDYWNoZSIsInNoYXBlIiwiY3JlYXRlU2hhcGUiLCJkZXNjcmlwdGlvbiIsInNldElkZW50aXR5IiwiQW1tbyIsImJ0Q29tcG91bmRTaGFwZSIsInNldFgiLCJzZXRZIiwic2V0WiIsImJ0U3RhdGljUGxhbmVTaGFwZSIsImJ0Qm94U2hhcGUiLCJyYWRpdXMiLCJidFNwaGVyZVNoYXBlIiwiYnRDeWxpbmRlclNoYXBlIiwiYnRDYXBzdWxlU2hhcGUiLCJidENvbmVTaGFwZSIsInRyaWFuZ2xlX21lc2giLCJidFRyaWFuZ2xlTWVzaCIsImFkZFRyaWFuZ2xlIiwiYnRCdmhUcmlhbmdsZU1lc2hTaGFwZSIsImJ0Q29udmV4SHVsbFNoYXBlIiwiYWRkUG9pbnQiLCJ4cHRzIiwieXB0cyIsInBvaW50cyIsInB0ciIsIl9tYWxsb2MiLCJwIiwicDIiLCJIRUFQRjMyIiwiYnRIZWlnaHRmaWVsZFRlcnJhaW5TaGFwZSIsImFic01heEhlaWdodCIsImNyZWF0ZVNvZnRCb2R5IiwiYm9keSIsInNvZnRCb2R5SGVscGVycyIsImJ0U29mdEJvZHlIZWxwZXJzIiwiYVZlcnRpY2VzIiwiQ3JlYXRlRnJvbVRyaU1lc2giLCJnZXRXb3JsZEluZm8iLCJhSW5kaWNlcyIsImNyIiwiY29ybmVycyIsIkNyZWF0ZVBhdGNoIiwiYnRWZWN0b3IzIiwic2VnbWVudHMiLCJDcmVhdGVSb3BlIiwiaW5pdCIsIm5vV29ya2VyIiwibWFrZVdvcmxkIiwid2FzbUJ1ZmZlciIsImltcG9ydFNjcmlwdHMiLCJsb2FkQW1tb0Zyb21CaW5hcnkiLCJidFRyYW5zZm9ybSIsImJ0UXVhdGVybmlvbiIsInJlcG9ydHNpemUiLCJjb2xsaXNpb25Db25maWd1cmF0aW9uIiwiYnRTb2Z0Qm9keVJpZ2lkQm9keUNvbGxpc2lvbkNvbmZpZ3VyYXRpb24iLCJidERlZmF1bHRDb2xsaXNpb25Db25maWd1cmF0aW9uIiwiZGlzcGF0Y2hlciIsImJ0Q29sbGlzaW9uRGlzcGF0Y2hlciIsInNvbHZlciIsImJ0U2VxdWVudGlhbEltcHVsc2VDb25zdHJhaW50U29sdmVyIiwiYnJvYWRwaGFzZSIsImFhYmJtaW4iLCJhYWJibWF4IiwiYnRBeGlzU3dlZXAzIiwiYnREYnZ0QnJvYWRwaGFzZSIsImJ0U29mdFJpZ2lkRHluYW1pY3NXb3JsZCIsImJ0RGVmYXVsdFNvZnRCb2R5U29sdmVyIiwiYnREaXNjcmV0ZUR5bmFtaWNzV29ybGQiLCJhcHBlbmRBbmNob3IiLCJub2RlIiwib2JqMiIsImNvbGxpc2lvbkJldHdlZW5MaW5rZWRCb2RpZXMiLCJpbmZsdWVuY2UiLCJsaW5rTm9kZXMiLCJzZWxmX2JvZHkiLCJvdGhlcl9ib2R5Iiwic2VsZl9ub2RlIiwiZ2V0X21fbm9kZXMiLCJhdCIsIm4xIiwib3RoZXJfbm9kZSIsIm4yIiwic2VsZl92ZWMiLCJnZXRfbV94Iiwib3RoZXJfdmVjIiwiZm9yY2VfeCIsImZvcmNlX3kiLCJmb3JjZV96IiwiY2FjaGVkX2Rpc3RhbmNlIiwibGlua2VkIiwiX2xvb3AiLCJzZXRJbnRlcnZhbCIsImRpc3RhbmNlIiwic3FydCIsInNldFZlbG9jaXR5IiwibW9kaWZlcjIiLCJtYXgiLCJtb2RpZmllciIsImFkZFZlbG9jaXR5IiwiYXBwZW5kTGluayIsImFkZEZvcmNlIiwiYXBwZW5kTGluZWFySm9pbnQiLCJzcGVjcyIsIlNwZWNzIiwiX3BvcyIsInNldF9wb3NpdGlvbiIsImVycCIsInNldF9lcnAiLCJjZm0iLCJzZXRfY2ZtIiwic3BsaXQiLCJzZXRfc3BsaXQiLCJhZGRPYmplY3QiLCJtb3Rpb25TdGF0ZSIsInNiQ29uZmlnIiwiZ2V0X21fY2ZnIiwidml0ZXJhdGlvbnMiLCJzZXRfdml0ZXJhdGlvbnMiLCJwaXRlcmF0aW9ucyIsInNldF9waXRlcmF0aW9ucyIsImRpdGVyYXRpb25zIiwic2V0X2RpdGVyYXRpb25zIiwiY2l0ZXJhdGlvbnMiLCJzZXRfY2l0ZXJhdGlvbnMiLCJzZXRfY29sbGlzaW9ucyIsInNldF9rREYiLCJmcmljdGlvbiIsInNldF9rRFAiLCJkYW1waW5nIiwicHJlc3N1cmUiLCJzZXRfa1BSIiwiZHJhZyIsInNldF9rREciLCJsaWZ0Iiwic2V0X2tMRiIsImFuY2hvckhhcmRuZXNzIiwic2V0X2tBSFIiLCJyaWdpZEhhcmRuZXNzIiwic2V0X2tDSFIiLCJrbHN0IiwiZ2V0X21fbWF0ZXJpYWxzIiwic2V0X21fa0xTVCIsImthc3QiLCJzZXRfbV9rQVNUIiwia3ZzdCIsInNldF9tX2tWU1QiLCJjYXN0T2JqZWN0IiwiYnRDb2xsaXNpb25PYmplY3QiLCJnZXRDb2xsaXNpb25TaGFwZSIsInNldE1hcmdpbiIsIm1hcmdpbiIsInNldEFjdGl2YXRpb25TdGF0ZSIsInN0YXRlIiwicm9wZSIsImNsb3RoIiwic2V0VyIsInJvdGF0ZSIsInRyYW5zbGF0ZSIsInNldFRvdGFsTWFzcyIsIm1hc3MiLCJhZGRTb2Z0Qm9keSIsImdldF9tX2ZhY2VzIiwiY29tcG91bmRfc2hhcGUiLCJhZGRDaGlsZFNoYXBlIiwiX2NoaWxkIiwidHJhbnMiLCJzZXRPcmlnaW4iLCJzZXRSb3RhdGlvbiIsImRlc3Ryb3kiLCJzZXRMb2NhbFNjYWxpbmciLCJjYWxjdWxhdGVMb2NhbEluZXJ0aWEiLCJidERlZmF1bHRNb3Rpb25TdGF0ZSIsInJiSW5mbyIsImJ0UmlnaWRCb2R5Q29uc3RydWN0aW9uSW5mbyIsInNldF9tX2ZyaWN0aW9uIiwic2V0X21fcmVzdGl0dXRpb24iLCJyZXN0aXR1dGlvbiIsInNldF9tX2xpbmVhckRhbXBpbmciLCJzZXRfbV9hbmd1bGFyRGFtcGluZyIsImJ0UmlnaWRCb2R5IiwiY29sbGlzaW9uX2ZsYWdzIiwic2V0Q29sbGlzaW9uRmxhZ3MiLCJncm91cCIsIm1hc2siLCJhZGRSaWdpZEJvZHkiLCJhY3RpdmF0ZSIsImEiLCJhZGRWZWhpY2xlIiwidmVoaWNsZV90dW5pbmciLCJidFZlaGljbGVUdW5pbmciLCJzZXRfbV9zdXNwZW5zaW9uU3RpZmZuZXNzIiwic2V0X21fc3VzcGVuc2lvbkNvbXByZXNzaW9uIiwic2V0X21fc3VzcGVuc2lvbkRhbXBpbmciLCJzZXRfbV9tYXhTdXNwZW5zaW9uVHJhdmVsQ20iLCJzZXRfbV9tYXhTdXNwZW5zaW9uRm9yY2UiLCJidFJheWNhc3RWZWhpY2xlIiwiYnREZWZhdWx0VmVoaWNsZVJheWNhc3RlciIsInNldENvb3JkaW5hdGVTeXN0ZW0iLCJyZW1vdmVWZWhpY2xlIiwiYWRkV2hlZWwiLCJzZXRTdGVlcmluZyIsImRldGFpbHMiLCJzZXRTdGVlcmluZ1ZhbHVlIiwic2V0QnJha2UiLCJhcHBseUVuZ2luZUZvcmNlIiwicmVtb3ZlT2JqZWN0IiwicmVtb3ZlU29mdEJvZHkiLCJyZW1vdmVSaWdpZEJvZHkiLCJ1cGRhdGVUcmFuc2Zvcm0iLCJnZXRNb3Rpb25TdGF0ZSIsImdldFdvcmxkVHJhbnNmb3JtIiwic2V0V29ybGRUcmFuc2Zvcm0iLCJ0cmFuc2Zvcm0iLCJ1cGRhdGVNYXNzIiwic2V0TWFzc1Byb3BzIiwiYXBwbHlDZW50cmFsSW1wdWxzZSIsImFwcGx5SW1wdWxzZSIsImltcHVsc2VfeCIsImltcHVsc2VfeSIsImltcHVsc2VfeiIsImFwcGx5VG9ycXVlIiwidG9ycXVlX3giLCJ0b3JxdWVfeSIsInRvcnF1ZV96IiwiYXBwbHlDZW50cmFsRm9yY2UiLCJhcHBseUZvcmNlIiwib25TaW11bGF0aW9uUmVzdW1lIiwibGFzdF9zaW11bGF0aW9uX3RpbWUiLCJzZXRBbmd1bGFyVmVsb2NpdHkiLCJzZXRMaW5lYXJWZWxvY2l0eSIsInNldEFuZ3VsYXJGYWN0b3IiLCJzZXRMaW5lYXJGYWN0b3IiLCJzZXREYW1waW5nIiwic2V0Q2NkTW90aW9uVGhyZXNob2xkIiwidGhyZXNob2xkIiwic2V0Q2NkU3dlcHRTcGhlcmVSYWRpdXMiLCJidFBvaW50MlBvaW50Q29uc3RyYWludCIsImJ0SGluZ2VDb25zdHJhaW50IiwidHJhbnNmb3JtYiIsInRyYW5zZm9ybWEiLCJnZXRSb3RhdGlvbiIsInNldEV1bGVyIiwiYnRTbGlkZXJDb25zdHJhaW50IiwidGEiLCJ0YiIsInNldEV1bGVyWllYIiwiYnRDb25lVHdpc3RDb25zdHJhaW50Iiwic2V0TGltaXQiLCJQSSIsImJ0R2VuZXJpYzZEb2ZDb25zdHJhaW50IiwiYiIsImVuYWJsZUZlZWRiYWNrIiwicmVtb3ZlQ29uc3RyYWludCIsImNvbnN0cmFpbnRfc2V0QnJlYWtpbmdJbXB1bHNlVGhyZXNob2xkIiwic2V0QnJlYWtpbmdJbXB1bHNlVGhyZXNob2xkIiwiY2VpbCIsInN0ZXBTaW11bGF0aW9uIiwicmVwb3J0VmVoaWNsZXMiLCJyZXBvcnRDb2xsaXNpb25zIiwicmVwb3J0Q29uc3RyYWludHMiLCJyZXBvcnRXb3JsZCIsInJlcG9ydFdvcmxkX3NvZnRib2RpZXMiLCJoaW5nZV9zZXRMaW1pdHMiLCJoaW5nZV9lbmFibGVBbmd1bGFyTW90b3IiLCJlbmFibGVBbmd1bGFyTW90b3IiLCJoaW5nZV9kaXNhYmxlTW90b3IiLCJlbmFibGVNb3RvciIsInNsaWRlcl9zZXRMaW1pdHMiLCJzZXRMb3dlckxpbkxpbWl0Iiwic2V0VXBwZXJMaW5MaW1pdCIsInNldExvd2VyQW5nTGltaXQiLCJzZXRVcHBlckFuZ0xpbWl0Iiwic2xpZGVyX3NldFJlc3RpdHV0aW9uIiwic2V0U29mdG5lc3NMaW1MaW4iLCJzZXRTb2Z0bmVzc0xpbUFuZyIsInNsaWRlcl9lbmFibGVMaW5lYXJNb3RvciIsInNldFRhcmdldExpbk1vdG9yVmVsb2NpdHkiLCJzZXRNYXhMaW5Nb3RvckZvcmNlIiwic2V0UG93ZXJlZExpbk1vdG9yIiwic2xpZGVyX2Rpc2FibGVMaW5lYXJNb3RvciIsInNsaWRlcl9lbmFibGVBbmd1bGFyTW90b3IiLCJzZXRUYXJnZXRBbmdNb3RvclZlbG9jaXR5Iiwic2V0TWF4QW5nTW90b3JGb3JjZSIsInNldFBvd2VyZWRBbmdNb3RvciIsInNsaWRlcl9kaXNhYmxlQW5ndWxhck1vdG9yIiwiY29uZXR3aXN0X3NldExpbWl0IiwiY29uZXR3aXN0X2VuYWJsZU1vdG9yIiwiY29uZXR3aXN0X3NldE1heE1vdG9ySW1wdWxzZSIsInNldE1heE1vdG9ySW1wdWxzZSIsImNvbmV0d2lzdF9zZXRNb3RvclRhcmdldCIsInNldE1vdG9yVGFyZ2V0IiwiY29uZXR3aXN0X2Rpc2FibGVNb3RvciIsImRvZl9zZXRMaW5lYXJMb3dlckxpbWl0Iiwic2V0TGluZWFyTG93ZXJMaW1pdCIsImRvZl9zZXRMaW5lYXJVcHBlckxpbWl0Iiwic2V0TGluZWFyVXBwZXJMaW1pdCIsImRvZl9zZXRBbmd1bGFyTG93ZXJMaW1pdCIsInNldEFuZ3VsYXJMb3dlckxpbWl0IiwiZG9mX3NldEFuZ3VsYXJVcHBlckxpbWl0Iiwic2V0QW5ndWxhclVwcGVyTGltaXQiLCJkb2ZfZW5hYmxlQW5ndWxhck1vdG9yIiwibW90b3IiLCJnZXRSb3RhdGlvbmFsTGltaXRNb3RvciIsInNldF9tX2VuYWJsZU1vdG9yIiwiZG9mX2NvbmZpZ3VyZUFuZ3VsYXJNb3RvciIsInNldF9tX2xvTGltaXQiLCJzZXRfbV9oaUxpbWl0Iiwic2V0X21fdGFyZ2V0VmVsb2NpdHkiLCJzZXRfbV9tYXhNb3RvckZvcmNlIiwiZG9mX2Rpc2FibGVBbmd1bGFyTW90b3IiLCJnZXRDZW50ZXJPZk1hc3NUcmFuc2Zvcm0iLCJvcmlnaW4iLCJnZXRPcmlnaW4iLCJnZXRBbmd1bGFyVmVsb2NpdHkiLCJub2RlcyIsInZlcnQiLCJnZXRfbV9uIiwiZmFjZXMiLCJmYWNlIiwibm9kZTEiLCJub2RlMiIsIm5vZGUzIiwidmVydDEiLCJ2ZXJ0MiIsInZlcnQzIiwibm9ybWFsMSIsIm5vcm1hbDIiLCJub3JtYWwzIiwiZHAiLCJnZXREaXNwYXRjaGVyIiwibnVtIiwiZ2V0TnVtTWFuaWZvbGRzIiwibWFuaWZvbGQiLCJnZXRNYW5pZm9sZEJ5SW5kZXhJbnRlcm5hbCIsIm51bV9jb250YWN0cyIsImdldE51bUNvbnRhY3RzIiwicHQiLCJnZXRDb250YWN0UG9pbnQiLCJnZXRCb2R5MCIsImdldEJvZHkxIiwiZ2V0X21fbm9ybWFsV29ybGRPbkIiLCJnZXROdW1XaGVlbHMiLCJnZXRXaGVlbEluZm8iLCJnZXRfbV93b3JsZFRyYW5zZm9ybSIsImxlbmdodCIsIm9mZnNldF9ib2R5IiwiZ2V0QnJlYWtpbmdJbXB1bHNlVGhyZXNob2xkIiwiV29ybGRNb2R1bGUiLCJQaHlzaWNzV29ya2VyIiwidHJhbnNmZXJhYmxlTWVzc2FnZSIsInJlamVjdCIsInNldHVwIiwicHJvcGVydGllcyIsImdldCIsIl9uYXRpdmUiLCJ2ZWN0b3IzIiwic2NvcGUiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiX3giLCJfeSIsIl96IiwiX19jX3JvdCIsIm9uQ2hhbmdlIiwiZXVsZXIiLCJyb3QiLCJ3cmFwUGh5c2ljc1Byb3RvdHlwZSIsImtleSIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsIm9uQ29weSIsInNvdXJjZVBoeXNpY3MiLCJtb2R1bGVzIiwib25XcmFwIiwiQVBJIiwiZmFjdG9yIiwiaGFzIiwibW9kdWxlIiwicmVzdWx0IiwiY29uc3RydWN0b3IiLCJyaWdpZGJvZHkiLCJCb3hNb2R1bGUiLCJQaHlzaWNzTW9kdWxlIiwidXBkYXRlRGF0YSIsImJvdW5kaW5nQm94IiwiY29tcHV0ZUJvdW5kaW5nQm94IiwibWluIiwiQ29tcG91bmRNb2R1bGUiLCJDYXBzdWxlTW9kdWxlIiwiQ29uY2F2ZU1vZHVsZSIsImdlb21ldHJ5UHJvY2Vzc29yIiwiaXNCdWZmZXJHZW9tZXRyeSIsInZlcnRpY2VzIiwidkEiLCJ2QiIsInZDIiwiYyIsIkNvbmVNb2R1bGUiLCJDb252ZXhNb2R1bGUiLCJfYnVmZmVyR2VvbWV0cnkiLCJCdWZmZXJHZW9tZXRyeSIsImZyb21HZW9tZXRyeSIsIkN5bGluZGVyTW9kdWxlIiwiSGVpZ2h0ZmllbGRNb2R1bGUiLCJWZWN0b3IyIiwiYXV0b0FsaWduIiwieGRpdiIsInlkaXYiLCJ2ZXJ0cyIsInhzaXplIiwieXNpemUiLCJhYnMiLCJ2TnVtIiwicm91bmQiLCJtdWx0aXBseSIsIlBsYW5lTW9kdWxlIiwiU3BoZXJlTW9kdWxlIiwiYm91bmRpbmdTcGhlcmUiLCJjb21wdXRlQm91bmRpbmdTcGhlcmUiLCJTb2Z0Ym9keU1vZHVsZSIsImlkeEdlb21ldHJ5IiwibWVyZ2VWZXJ0aWNlcyIsImJ1ZmZlckdlb21ldHJ5IiwiYWRkQXR0cmlidXRlIiwiQnVmZmVyQXR0cmlidXRlIiwiY29weVZlY3RvcjNzQXJyYXkiLCJzZXRJbmRleCIsIlVpbnQzMkFycmF5IiwiVWludDE2QXJyYXkiLCJjb3B5SW5kaWNlc0FycmF5IiwibzEiLCJvMiIsImFycmF5TWF4IiwiSW5maW5pdHkiLCJsIiwiQ2xvdGhNb2R1bGUiLCJnZW9tUGFyYW1zIiwiZ2VvbSIsImZhY2VzTGVuZ3RoIiwidXZzIiwiZmFjZVZlcnRleFV2cyIsIm5vcm1hbHNBcnJheSIsInV2c0FycmF5IiwiZmFjZUFycmF5IiwiaTMiLCJ3aWR0aFNlZ21lbnRzIiwiaGVpZ2h0U2VnbWVudHMiLCJpZHgwMCIsImlkeDAxIiwiaWR4MTAiLCJpZHgxMSIsIlJvcGVNb2R1bGUiLCJidWZmIiwiZnJvbUFycmF5IiwibiIsInYxIiwidjIiLCJQSV8yIiwiRmlyc3RQZXJzb25Db250cm9sc1NvbHZlciIsImNhbWVyYSIsInZlbG9jaXR5RmFjdG9yIiwicnVuVmVsb2NpdHkiLCJwbGF5ZXIiLCJwaXRjaE9iamVjdCIsIk9iamVjdDNEIiwieWF3T2JqZWN0IiwieXBvcyIsImNhbkp1bXAiLCJtb3ZlRm9yd2FyZCIsIm1vdmVCYWNrd2FyZCIsIm1vdmVMZWZ0IiwibW92ZVJpZ2h0Iiwib3RoZXJPYmplY3QiLCJ2IiwiciIsImNvbnRhY3ROb3JtYWwiLCJvbk1vdXNlTW92ZSIsImVuYWJsZWQiLCJtb3ZlbWVudFgiLCJtb3pNb3ZlbWVudFgiLCJnZXRNb3ZlbWVudFgiLCJtb3ZlbWVudFkiLCJtb3pNb3ZlbWVudFkiLCJnZXRNb3ZlbWVudFkiLCJvbktleURvd24iLCJrZXlDb2RlIiwib25LZXlVcCIsImdldE9iamVjdCIsImdldERpcmVjdGlvbiIsInRhcmdldFZlYyIsIm11bHRpcGx5VmVjdG9yMyIsImlucHV0VmVsb2NpdHkiLCJkZWx0YSIsInNwZWVkIiwib3JkZXIiLCJhcHBseVF1YXRlcm5pb24iLCJGaXJzdFBlcnNvbk1vZHVsZSIsImJsb2NrIiwiZ2V0RWxlbWVudEJ5SWQiLCJjb250cm9scyIsImVsZW1lbnQiLCJwb2ludGVybG9ja2NoYW5nZSIsInBvaW50ZXJMb2NrRWxlbWVudCIsIm1velBvaW50ZXJMb2NrRWxlbWVudCIsIndlYmtpdFBvaW50ZXJMb2NrRWxlbWVudCIsInN0eWxlIiwiZGlzcGxheSIsInBvaW50ZXJsb2NrZXJyb3IiLCJ3YXJuIiwicXVlcnlTZWxlY3RvciIsInJlcXVlc3RQb2ludGVyTG9jayIsIm1velJlcXVlc3RQb2ludGVyTG9jayIsIndlYmtpdFJlcXVlc3RQb2ludGVyTG9jayIsInJlcXVlc3RGdWxsc2NyZWVuIiwibW96UmVxdWVzdEZ1bGxzY3JlZW4iLCJtb3pSZXF1ZXN0RnVsbFNjcmVlbiIsIndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuIiwiZnVsbHNjcmVlbmNoYW5nZSIsImZ1bGxzY3JlZW5FbGVtZW50IiwibW96RnVsbHNjcmVlbkVsZW1lbnQiLCJtb3pGdWxsU2NyZWVuRWxlbWVudCIsInVwZGF0ZVByb2Nlc3NvciIsInVwZGF0ZUxvb3AiXSwibWFwcGluZ3MiOiI7Ozs7OztNQU1NQSxnQkFBZ0I7RUFDcEJDLGVBQWEsQ0FETztFQUVwQkMsbUJBQWlCLENBRkc7RUFHcEJDLGlCQUFlLENBSEs7RUFJcEJDLG9CQUFrQixDQUpFO0VBS3BCQyxjQUFZO0VBTFEsQ0FBdEI7O0FBUUEsTUFBTUMsa0JBQWtCLEVBQXhCO0VBQUEsSUFDRUMsMkJBQTJCLENBRDdCO0VBQUEsSUFFRUMseUJBQXlCLENBRjNCO0VBQUEsSUFHRUMsNEJBQTRCLENBSDlCOztBQUtBLE1BQU1DLGVBQWUsSUFBSUMsYUFBSixFQUFyQjtFQUFBLElBQ0VDLGVBQWUsSUFBSUQsYUFBSixFQURqQjtFQUFBLElBRUVFLGVBQWUsSUFBSUMsYUFBSixFQUZqQjtFQUFBLElBR0VDLFlBQVksSUFBSUMsZ0JBQUosRUFIZDs7QUFLQSxNQUFNQyw0QkFBNEIsU0FBNUJBLHlCQUE0QixDQUFDQyxDQUFELEVBQUlDLENBQUosRUFBT0MsQ0FBUCxFQUFVQyxDQUFWLEVBQWdCO0VBQ2hELFNBQU8sSUFBSVYsYUFBSixDQUNMVyxLQUFLQyxLQUFMLENBQVcsS0FBS0wsSUFBSUcsQ0FBSixHQUFRRixJQUFJQyxD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 diff --git a/lib/physijs_worker.js b/lib/physijs_worker.js new file mode 100644 index 0000000..a6c3811 --- /dev/null +++ b/lib/physijs_worker.js @@ -0,0 +1,1415 @@ +'use strict'; +var + transferableMessage = self.webkitPostMessage || self.postMessage, + + // enum + MESSAGE_TYPES = { + WORLDREPORT: 0, + COLLISIONREPORT: 1, + VEHICLEREPORT: 2, + CONSTRAINTREPORT: 3 + }, + + // temp variables + _object, + _vector, + _transform, + + // functions + public_functions = {}, + getShapeFromCache, + setShapeCache, + createShape, + reportWorld, + reportVehicles, + reportCollisions, + reportConstraints, + + // world variables + fixedTimeStep, // used when calling stepSimulation + rateLimit, // sets whether or not to sync the simulation rate with fixedTimeStep + last_simulation_time, + last_simulation_duration = 0, + world, + transform, + _vec3_1, + _vec3_2, + _vec3_3, + _quat, + // private cache + _objects = {}, + _vehicles = {}, + _constraints = {}, + _materials = {}, + _objects_ammo = {}, + _num_objects = 0, + _num_wheels = 0, + _num_constraints = 0, + _object_shapes = {}, + + // The following objects are to track objects that ammo.js doesn't clean + // up. All are cleaned up when they're corresponding body is destroyed. + // Unfortunately, it's very difficult to get at these objects from the + // body, so we have to track them ourselves. + _motion_states = {}, + // Don't need to worry about it for cached shapes. + _noncached_shapes = {}, + // A body with a compound shape always has a regular shape as well, so we + // have track them separately. + _compound_shapes = {}, + + // object reporting + REPORT_CHUNKSIZE, // report array is increased in increments of this chunk size + + WORLDREPORT_ITEMSIZE = 14, // how many float values each reported item needs + worldreport, + + COLLISIONREPORT_ITEMSIZE = 5, // one float for each object id, and a Vec3 contact normal + collisionreport, + + VEHICLEREPORT_ITEMSIZE = 9, // vehicle id, wheel index, 3 for position, 4 for rotation + vehiclereport, + + CONSTRAINTREPORT_ITEMSIZE = 6, // constraint id, offset object, offset, applied impulse + constraintreport; + +var ab = new ArrayBuffer( 1 ); + +transferableMessage( ab, [ab] ); +var SUPPORT_TRANSFERABLE = ( ab.byteLength === 0 ); + +getShapeFromCache = function ( cache_key ) { + if ( _object_shapes[ cache_key ] !== undefined ) { + return _object_shapes[ cache_key ]; + } + return null; +}; + +setShapeCache = function ( cache_key, shape ) { + _object_shapes[ cache_key ] = shape; +} + +createShape = function( description ) { + var cache_key, shape; + + _transform.setIdentity(); + switch ( description.type ) { + case 'plane': + cache_key = 'plane_' + description.normal.x + '_' + description.normal.y + '_' + description.normal.z; + if ( ( shape = getShapeFromCache( cache_key ) ) === null ) { + _vec3_1.setX(description.normal.x); + _vec3_1.setY(description.normal.y); + _vec3_1.setZ(description.normal.z); + shape = new Ammo.btStaticPlaneShape(_vec3_1, 0 ); + setShapeCache( cache_key, shape ); + } + break; + + case 'box': + cache_key = 'box_' + description.width + '_' + description.height + '_' + description.depth; + if ( ( shape = getShapeFromCache( cache_key ) ) === null ) { + _vec3_1.setX(description.width / 2); + _vec3_1.setY(description.height / 2); + _vec3_1.setZ(description.depth / 2); + shape = new Ammo.btBoxShape(_vec3_1); + setShapeCache( cache_key, shape ); + } + break; + + case 'sphere': + cache_key = 'sphere_' + description.radius; + if ( ( shape = getShapeFromCache( cache_key ) ) === null ) { + shape = new Ammo.btSphereShape( description.radius ); + setShapeCache( cache_key, shape ); + } + break; + + case 'cylinder': + cache_key = 'cylinder_' + description.width + '_' + description.height + '_' + description.depth; + if ( ( shape = getShapeFromCache( cache_key ) ) === null ) { + _vec3_1.setX(description.width / 2); + _vec3_1.setY(description.height / 2); + _vec3_1.setZ(description.depth / 2); + shape = new Ammo.btCylinderShape(_vec3_1); + setShapeCache( cache_key, shape ); + } + break; + + case 'capsule': + cache_key = 'capsule_' + description.radius + '_' + description.height; + if ( ( shape = getShapeFromCache( cache_key ) ) === null ) { + // In Bullet, capsule height excludes the end spheres + shape = new Ammo.btCapsuleShape( description.radius, description.height - 2 * description.radius ); + setShapeCache( cache_key, shape ); + } + break; + + case 'cone': + cache_key = 'cone_' + description.radius + '_' + description.height; + if ( ( shape = getShapeFromCache( cache_key ) ) === null ) { + shape = new Ammo.btConeShape( description.radius, description.height ); + setShapeCache( cache_key, shape ); + } + break; + + case 'concave': + var i, triangle, triangle_mesh = new Ammo.btTriangleMesh; + if (!description.triangles.length) return false + + for ( i = 0; i < description.triangles.length; i++ ) { + triangle = description.triangles[i]; + + _vec3_1.setX(triangle[0].x); + _vec3_1.setY(triangle[0].y); + _vec3_1.setZ(triangle[0].z); + + _vec3_2.setX(triangle[1].x); + _vec3_2.setY(triangle[1].y); + _vec3_2.setZ(triangle[1].z); + + _vec3_3.setX(triangle[2].x); + _vec3_3.setY(triangle[2].y); + _vec3_3.setZ(triangle[2].z); + + triangle_mesh.addTriangle( + _vec3_1, + _vec3_2, + _vec3_3, + true + ); + } + + shape = new Ammo.btBvhTriangleMeshShape( + triangle_mesh, + true, + true + ); + _noncached_shapes[description.id] = shape; + break; + + case 'convex': + var i, point, shape = new Ammo.btConvexHullShape; + for ( i = 0; i < description.points.length; i++ ) { + point = description.points[i]; + + _vec3_1.setX(point.x); + _vec3_1.setY(point.y); + _vec3_1.setZ(point.z); + + shape.addPoint(_vec3_1); + + } + _noncached_shapes[description.id] = shape; + break; + + case 'heightfield': + + var ptr = Ammo.allocate(4 * description.xpts * description.ypts, "float", Ammo.ALLOC_NORMAL); + + for (var f = 0; f < description.points.length; f++) { + Ammo.setValue(ptr + f, description.points[f] , 'float'); + } + + shape = new Ammo.btHeightfieldTerrainShape( + description.xpts, + description.ypts, + ptr, + 1, + -description.absMaxHeight, + description.absMaxHeight, + 2, + 0, + false + ); + + _vec3_1.setX(description.xsize/(description.xpts - 1)); + _vec3_1.setY(description.ysize/(description.ypts - 1)); + _vec3_1.setZ(1); + + shape.setLocalScaling(_vec3_1); + _noncached_shapes[description.id] = shape; + break; + + default: + // Not recognized + return; + break; + } + + return shape; +}; + +public_functions.init = function( params ) { + importScripts( params.ammo ); + + _transform = new Ammo.btTransform; + _vec3_1 = new Ammo.btVector3(0,0,0); + _vec3_2 = new Ammo.btVector3(0,0,0); + _vec3_3 = new Ammo.btVector3(0,0,0); + _quat = new Ammo.btQuaternion(0,0,0,0); + + REPORT_CHUNKSIZE = params.reportsize || 50; + if ( SUPPORT_TRANSFERABLE ) { + // Transferable messages are supported, take advantage of them with TypedArrays + worldreport = new Float32Array(2 + REPORT_CHUNKSIZE * WORLDREPORT_ITEMSIZE); // message id + # of objects to report + chunk size * # of values per object + collisionreport = new Float32Array(2 + REPORT_CHUNKSIZE * COLLISIONREPORT_ITEMSIZE); // message id + # of collisions to report + chunk size * # of values per object + vehiclereport = new Float32Array(2 + REPORT_CHUNKSIZE * VEHICLEREPORT_ITEMSIZE); // message id + # of vehicles to report + chunk size * # of values per object + constraintreport = new Float32Array(2 + REPORT_CHUNKSIZE * CONSTRAINTREPORT_ITEMSIZE); // message id + # of constraints to report + chunk size * # of values per object + } else { + // Transferable messages are not supported, send data as normal arrays + worldreport = []; + collisionreport = []; + vehiclereport = []; + constraintreport = []; + } + worldreport[0] = MESSAGE_TYPES.WORLDREPORT; + collisionreport[0] = MESSAGE_TYPES.COLLISIONREPORT; + vehiclereport[0] = MESSAGE_TYPES.VEHICLEREPORT; + constraintreport[0] = MESSAGE_TYPES.CONSTRAINTREPORT; + + var collisionConfiguration = new Ammo.btDefaultCollisionConfiguration, + dispatcher = new Ammo.btCollisionDispatcher( collisionConfiguration ), + solver = new Ammo.btSequentialImpulseConstraintSolver, + broadphase; + + if ( !params.broadphase ) params.broadphase = { type: 'dynamic' }; + switch ( params.broadphase.type ) { + case 'sweepprune': + + _vec3_1.setX(params.broadphase.aabbmin.x); + _vec3_1.setY(params.broadphase.aabbmin.y); + _vec3_1.setZ(params.broadphase.aabbmin.z); + + _vec3_2.setX(params.broadphase.aabbmax.x); + _vec3_2.setY(params.broadphase.aabbmax.y); + _vec3_2.setZ(params.broadphase.aabbmax.z); + + broadphase = new Ammo.btAxisSweep3( + _vec3_1, + _vec3_2 + ); + + break; + + case 'dynamic': + default: + broadphase = new Ammo.btDbvtBroadphase; + break; + } + + world = new Ammo.btDiscreteDynamicsWorld( dispatcher, broadphase, solver, collisionConfiguration ); + + fixedTimeStep = params.fixedTimeStep; + rateLimit = params.rateLimit; + + transferableMessage({ cmd: 'worldReady' }); +}; + +public_functions.registerMaterial = function( description ) { + _materials[ description.id ] = description; +}; + +public_functions.unRegisterMaterial = function( description ) { + delete _materials[ description.id ]; +}; + +public_functions.setFixedTimeStep = function( description ) { + fixedTimeStep = description; +}; + +public_functions.setGravity = function( description ) { + _vec3_1.setX(description.x); + _vec3_1.setY(description.y); + _vec3_1.setZ(description.z); + world.setGravity(_vec3_1); +}; + +public_functions.addObject = function( description ) { + + var i, + localInertia, shape, motionState, rbInfo, body; + +shape = createShape( description ); +if (!shape) return +// If there are children then this is a compound shape +if ( description.children ) { + var compound_shape = new Ammo.btCompoundShape, _child; + compound_shape.addChildShape( _transform, shape ); + + for ( i = 0; i < description.children.length; i++ ) { + _child = description.children[i]; + + var trans = new Ammo.btTransform; + trans.setIdentity(); + + _vec3_1.setX(_child.position_offset.x); + _vec3_1.setY(_child.position_offset.y); + _vec3_1.setZ(_child.position_offset.z); + trans.setOrigin(_vec3_1); + + _quat.setX(_child.rotation.x); + _quat.setY(_child.rotation.y); + _quat.setZ(_child.rotation.z); + _quat.setW(_child.rotation.w); + trans.setRotation(_quat); + + shape = createShape( description.children[i] ); + compound_shape.addChildShape( trans, shape ); + Ammo.destroy(trans); + } + + shape = compound_shape; + _compound_shapes[ description.id ] = shape; + } + _vec3_1.setX(0); + _vec3_1.setY(0); + _vec3_1.setZ(0); + shape.calculateLocalInertia( description.mass, _vec3_1 ); + + _transform.setIdentity(); + + _vec3_2.setX(description.position.x); + _vec3_2.setY(description.position.y); + _vec3_2.setZ(description.position.z); + _transform.setOrigin(_vec3_2); + + _quat.setX(description.rotation.x); + _quat.setY(description.rotation.y); + _quat.setZ(description.rotation.z); + _quat.setW(description.rotation.w); + _transform.setRotation(_quat); + + motionState = new Ammo.btDefaultMotionState( _transform ); // #TODO: btDefaultMotionState supports center of mass offset as second argument - implement + rbInfo = new Ammo.btRigidBodyConstructionInfo( description.mass, motionState, shape, _vec3_1 ); + + if ( description.materialId !== undefined ) { + rbInfo.set_m_friction( _materials[ description.materialId ].friction ); + rbInfo.set_m_restitution( _materials[ description.materialId ].restitution ); + } + + body = new Ammo.btRigidBody( rbInfo ); + Ammo.destroy(rbInfo); + + if ( typeof description.collision_flags !== 'undefined' ) { + body.setCollisionFlags( description.collision_flags ); + } + + world.addRigidBody( body ); + + body.id = description.id; + _objects[ body.id ] = body; + _motion_states[ body.id ] = motionState; + + var ptr = body.a != undefined ? body.a : body.ptr; + _objects_ammo[ptr] = body.id; + _num_objects++; + + transferableMessage({ cmd: 'objectReady', params: body.id }); +}; + +public_functions.addVehicle = function( description ) { + var vehicle_tuning = new Ammo.btVehicleTuning(), + vehicle; + + vehicle_tuning.set_m_suspensionStiffness( description.suspension_stiffness ); + vehicle_tuning.set_m_suspensionCompression( description.suspension_compression ); + vehicle_tuning.set_m_suspensionDamping( description.suspension_damping ); + vehicle_tuning.set_m_maxSuspensionTravelCm( description.max_suspension_travel ); + vehicle_tuning.set_m_maxSuspensionForce( description.max_suspension_force ); + + vehicle = new Ammo.btRaycastVehicle( vehicle_tuning, _objects[ description.rigidBody ], new Ammo.btDefaultVehicleRaycaster( world ) ); + vehicle.tuning = vehicle_tuning; + + _objects[ description.rigidBody ].setActivationState( 4 ); + vehicle.setCoordinateSystem( 0, 1, 2 ); + + world.addVehicle( vehicle ); + _vehicles[ description.id ] = vehicle; +}; +public_functions.removeVehicle = function( description ) { + delete _vehicles[ description.id ]; +}; + +public_functions.addWheel = function( description ) { + if ( _vehicles[description.id] !== undefined ) { + var tuning = _vehicles[description.id].tuning; + if ( description.tuning !== undefined ) { + tuning = new Ammo.btVehicleTuning(); + tuning.set_m_suspensionStiffness( description.tuning.suspension_stiffness ); + tuning.set_m_suspensionCompression( description.tuning.suspension_compression ); + tuning.set_m_suspensionDamping( description.tuning.suspension_damping ); + tuning.set_m_maxSuspensionTravelCm( description.tuning.max_suspension_travel ); + tuning.set_m_maxSuspensionForce( description.tuning.max_suspension_force ); + } + + _vec3_1.setX(description.connection_point.x); + _vec3_1.setY(description.connection_point.y); + _vec3_1.setZ(description.connection_point.z); + + _vec3_2.setX(description.wheel_direction.x); + _vec3_2.setY(description.wheel_direction.y); + _vec3_2.setZ(description.wheel_direction.z); + + _vec3_3.setX(description.wheel_axle.x); + _vec3_3.setY(description.wheel_axle.y); + _vec3_3.setZ(description.wheel_axle.z); + + _vehicles[description.id].addWheel( + _vec3_1, + _vec3_2, + _vec3_3, + description.suspension_rest_length, + description.wheel_radius, + tuning, + description.is_front_wheel + ); + } + + _num_wheels++; + + if ( SUPPORT_TRANSFERABLE ) { + vehiclereport = new Float32Array(1 + _num_wheels * VEHICLEREPORT_ITEMSIZE); // message id & ( # of objects to report * # of values per object ) + vehiclereport[0] = MESSAGE_TYPES.VEHICLEREPORT; + } else { + vehiclereport = [ MESSAGE_TYPES.VEHICLEREPORT ]; + } +}; + +public_functions.setSteering = function( details ) { + if ( _vehicles[details.id] !== undefined ) { + _vehicles[details.id].setSteeringValue( details.steering, details.wheel ); + } +}; +public_functions.setBrake = function( details ) { + if ( _vehicles[details.id] !== undefined ) { + _vehicles[details.id].setBrake( details.brake, details.wheel ); + } +}; +public_functions.applyEngineForce = function( details ) { + if ( _vehicles[details.id] !== undefined ) { + _vehicles[details.id].applyEngineForce( details.force, details.wheel ); + } +}; + +public_functions.removeObject = function( details ) { + world.removeRigidBody( _objects[details.id] ); + Ammo.destroy(_objects[details.id]); + Ammo.destroy(_motion_states[details.id]); + if (_compound_shapes[details.id]) Ammo.destroy(_compound_shapes[details.id]); + if (_noncached_shapes[details.id]) Ammo.destroy(_noncached_shapes[details.id]); + var ptr = _objects[details.id].a != undefined ? _objects[details.id].a : _objects[details.id].ptr; + delete _objects_ammo[ptr]; + delete _objects[details.id]; + delete _motion_states[details.id]; + if (_compound_shapes[details.id]) delete _compound_shapes[details.id]; + if (_noncached_shapes[details.id]) delete _noncached_shapes[details.id]; + _num_objects--; +}; + +public_functions.updateTransform = function( details ) { + _object = _objects[details.id]; + _object.getMotionState().getWorldTransform( _transform ); + + if ( details.pos ) { + _vec3_1.setX(details.pos.x); + _vec3_1.setY(details.pos.y); + _vec3_1.setZ(details.pos.z); + _transform.setOrigin(_vec3_1); + } + + if ( details.quat ) { + _quat.setX(details.quat.x); + _quat.setY(details.quat.y); + _quat.setZ(details.quat.z); + _quat.setW(details.quat.w); + _transform.setRotation(_quat); + } + + _object.setWorldTransform( _transform ); + _object.activate(); +}; + +public_functions.updateMass = function( details ) { + // #TODO: changing a static object into dynamic is buggy + _object = _objects[details.id]; + + // Per http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?p=&f=9&t=3663#p13816 + world.removeRigidBody( _object ); + + _vec3_1.setX(0); + _vec3_1.setY(0); + _vec3_1.setZ(0); + + _object.setMassProps( details.mass, _vec3_1 ); + world.addRigidBody( _object ); + _object.activate(); +}; + +public_functions.applyCentralImpulse = function ( details ) { + + _vec3_1.setX(details.x); + _vec3_1.setY(details.y); + _vec3_1.setZ(details.z); + + _objects[details.id].applyCentralImpulse(_vec3_1); + _objects[details.id].activate(); +}; + +public_functions.applyImpulse = function ( details ) { + + _vec3_1.setX(details.impulse_x); + _vec3_1.setY(details.impulse_y); + _vec3_1.setZ(details.impulse_z); + + _vec3_2.setX(details.x); + _vec3_2.setY(details.y); + _vec3_2.setZ(details.z); + + _objects[details.id].applyImpulse( + _vec3_1, + _vec3_2 + ); + _objects[details.id].activate(); +}; + +public_functions.applyTorque = function ( details ) { + + _vec3_1.setX(details.torque_x); + _vec3_1.setY(details.torque_y); + _vec3_1.setZ(details.torque_z); + + _objects[details.id].applyTorque( + _vec3_1 + ); + _objects[details.id].activate(); +}; + +public_functions.applyCentralForce = function ( details ) { + + _vec3_1.setX(details.x); + _vec3_1.setY(details.y); + _vec3_1.setZ(details.z); + + _objects[details.id].applyCentralForce(_vec3_1); + _objects[details.id].activate(); +}; + +public_functions.applyForce = function ( details ) { + + _vec3_1.setX(details.force_x); + _vec3_1.setY(details.force_y); + _vec3_1.setZ(details.force_z); + + _vec3_2.setX(details.x); + _vec3_2.setY(details.y); + _vec3_2.setZ(details.z); + + _objects[details.id].applyForce( + _vec3_1, + _vec3_2 + ); + _objects[details.id].activate(); +}; + +public_functions.onSimulationResume = function( params ) { + last_simulation_time = Date.now(); +}; + +public_functions.setAngularVelocity = function ( details ) { + + _vec3_1.setX(details.x); + _vec3_1.setY(details.y); + _vec3_1.setZ(details.z); + + _objects[details.id].setAngularVelocity( + _vec3_1 + ); + _objects[details.id].activate(); +}; + +public_functions.setLinearVelocity = function ( details ) { + + _vec3_1.setX(details.x); + _vec3_1.setY(details.y); + _vec3_1.setZ(details.z); + + _objects[details.id].setLinearVelocity( + _vec3_1 + ); + _objects[details.id].activate(); +}; + +public_functions.setAngularFactor = function ( details ) { + + _vec3_1.setX(details.x); + _vec3_1.setY(details.y); + _vec3_1.setZ(details.z); + + _objects[details.id].setAngularFactor( + _vec3_1 + ); +}; + +public_functions.setLinearFactor = function ( details ) { + + _vec3_1.setX(details.x); + _vec3_1.setY(details.y); + _vec3_1.setZ(details.z); + + _objects[details.id].setLinearFactor( + _vec3_1 + ); +}; + +public_functions.setDamping = function ( details ) { + _objects[details.id].setDamping( details.linear, details.angular ); +}; + +public_functions.setCcdMotionThreshold = function ( details ) { + _objects[details.id].setCcdMotionThreshold( details.threshold ); +}; + +public_functions.setCcdSweptSphereRadius = function ( details ) { + _objects[details.id].setCcdSweptSphereRadius( details.radius ); +}; + +public_functions.addConstraint = function ( details ) { + var constraint; + + switch ( details.type ) { + + case 'point': + if ( details.objectb === undefined ) { + + _vec3_1.setX(details.positiona.x); + _vec3_1.setY(details.positiona.y); + _vec3_1.setZ(details.positiona.z); + + constraint = new Ammo.btPoint2PointConstraint( + _objects[ details.objecta ], + _vec3_1 + ); + } else { + + _vec3_1.setX(details.positiona.x); + _vec3_1.setY(details.positiona.y); + _vec3_1.setZ(details.positiona.z); + + _vec3_2.setX(details.positionb.x); + _vec3_2.setY(details.positionb.y); + _vec3_2.setZ(details.positionb.z); + + constraint = new Ammo.btPoint2PointConstraint( + _objects[ details.objecta ], + _objects[ details.objectb ], + _vec3_1, + _vec3_2 + ); + } + break; + + case 'hinge': + if ( details.objectb === undefined ) { + + _vec3_1.setX(details.positiona.x); + _vec3_1.setY(details.positiona.y); + _vec3_1.setZ(details.positiona.z); + + _vec3_2.setX(details.axis.x); + _vec3_2.setY(details.axis.y); + _vec3_2.setZ(details.axis.z); + + constraint = new Ammo.btHingeConstraint( + _objects[ details.objecta ], + _vec3_1, + _vec3_2 + ); + } else { + + _vec3_1.setX(details.positiona.x); + _vec3_1.setY(details.positiona.y); + _vec3_1.setZ(details.positiona.z); + + _vec3_2.setX(details.positionb.x); + _vec3_2.setY(details.positionb.y); + _vec3_2.setZ(details.positionb.z); + + _vec3_3.setX(details.axis.x); + _vec3_3.setY(details.axis.y); + _vec3_3.setZ(details.axis.z); + + constraint = new Ammo.btHingeConstraint( + _objects[ details.objecta ], + _objects[ details.objectb ], + _vec3_1, + _vec3_2, + _vec3_3, + _vec3_3 + ); + } + break; + + case 'slider': + var transforma, transformb, rotation; + + transforma = new Ammo.btTransform(); + + _vec3_1.setX(details.positiona.x); + _vec3_1.setY(details.positiona.y); + _vec3_1.setZ(details.positiona.z); + + transforma.setOrigin(_vec3_1); + + var rotation = transforma.getRotation(); + rotation.setEuler( details.axis.x, details.axis.y, details.axis.z ); + transforma.setRotation( rotation ); + + if ( details.objectb ) { + transformb = new Ammo.btTransform(); + + _vec3_2.setX(details.positionb.x); + _vec3_2.setY(details.positionb.y); + _vec3_2.setZ(details.positionb.z); + + transformb.setOrigin(_vec3_2); + + rotation = transformb.getRotation(); + rotation.setEuler( details.axis.x, details.axis.y, details.axis.z ); + transformb.setRotation( rotation ); + + constraint = new Ammo.btSliderConstraint( + _objects[ details.objecta ], + _objects[ details.objectb ], + transforma, + transformb, + true + ); + } else { + constraint = new Ammo.btSliderConstraint( + _objects[ details.objecta ], + transforma, + true + ); + } + + Ammo.destroy(transforma); + if (transformb != undefined) { + Ammo.destroy(transformb); + } + break; + + case 'conetwist': + var transforma, transformb; + + transforma = new Ammo.btTransform(); + transforma.setIdentity(); + + transformb = new Ammo.btTransform(); + transformb.setIdentity(); + + _vec3_1.setX(details.positiona.x); + _vec3_1.setY(details.positiona.y); + _vec3_1.setZ(details.positiona.z); + + _vec3_2.setX(details.positionb.x); + _vec3_2.setY(details.positionb.y); + _vec3_2.setZ(details.positionb.z); + + transforma.setOrigin(_vec3_1); + transformb.setOrigin(_vec3_2); + + var rotation = transforma.getRotation(); + rotation.setEulerZYX( -details.axisa.z, -details.axisa.y, -details.axisa.x ); + transforma.setRotation( rotation ); + + rotation = transformb.getRotation(); + rotation.setEulerZYX( -details.axisb.z, -details.axisb.y, -details.axisb.x ); + transformb.setRotation( rotation ); + + constraint = new Ammo.btConeTwistConstraint( + _objects[ details.objecta ], + _objects[ details.objectb ], + transforma, + transformb + ); + + constraint.setLimit( Math.PI, 0, Math.PI ); + + Ammo.destroy(transforma); + Ammo.destroy(transformb); + + break; + + case 'dof': + var transforma, transformb, rotation; + + transforma = new Ammo.btTransform(); + transforma.setIdentity(); + + _vec3_1.setX(details.positiona.x); + _vec3_1.setY(details.positiona.y); + _vec3_1.setZ(details.positiona.z); + + transforma.setOrigin(_vec3_1 ); + + rotation = transforma.getRotation(); + rotation.setEulerZYX( -details.axisa.z, -details.axisa.y, -details.axisa.x ); + transforma.setRotation( rotation ); + + if ( details.objectb ) { + transformb = new Ammo.btTransform(); + transformb.setIdentity(); + + _vec3_2.setX(details.positionb.x); + _vec3_2.setY(details.positionb.y); + _vec3_2.setZ(details.positionb.z); + + transformb.setOrigin(_vec3_2); + + rotation = transformb.getRotation(); + rotation.setEulerZYX( -details.axisb.z, -details.axisb.y, -details.axisb.x ); + transformb.setRotation( rotation ); + + constraint = new Ammo.btGeneric6DofConstraint( + _objects[ details.objecta ], + _objects[ details.objectb ], + transforma, + transformb + ); + } else { + constraint = new Ammo.btGeneric6DofConstraint( + _objects[ details.objecta ], + transforma + ); + } + Ammo.destroy(transforma); + if (transformb != undefined) { + Ammo.destroy(transformb); + } + break; + + default: + return; + + }; + + world.addConstraint( constraint ); + + constraint.enableFeedback(); + _constraints[ details.id ] = constraint; + _num_constraints++; + + if ( SUPPORT_TRANSFERABLE ) { + constraintreport = new Float32Array(1 + _num_constraints * CONSTRAINTREPORT_ITEMSIZE); // message id & ( # of objects to report * # of values per object ) + constraintreport[0] = MESSAGE_TYPES.CONSTRAINTREPORT; + } else { + constraintreport = [ MESSAGE_TYPES.CONSTRAINTREPORT ]; + } +}; + +public_functions.removeConstraint = function( details ) { + var constraint = _constraints[ details.id ]; + if ( constraint !== undefined ) { + world.removeConstraint( constraint ); + delete _constraints[ details.id ]; + _num_constraints--; + } +}; + +public_functions.constraint_setBreakingImpulseThreshold = function( details ) { + var constraint = _constraints[ details.id ]; + if ( constraint !== undefind ) { + constraint.setBreakingImpulseThreshold( details.threshold ); + } +}; + +public_functions.simulate = function simulate( params ) { + if ( world ) { + params = params || {}; + + if ( !params.timeStep ) { + if ( last_simulation_time ) { + params.timeStep = 0; + while ( params.timeStep + last_simulation_duration <= fixedTimeStep ) { + params.timeStep = ( Date.now() - last_simulation_time ) / 1000; // time since last simulation + } + } else { + params.timeStep = fixedTimeStep; // handle first frame + } + } else { + if ( params.timeStep < fixedTimeStep ) { + params.timeStep = fixedTimeStep; + } + } + + params.maxSubSteps = params.maxSubSteps || Math.ceil( params.timeStep / fixedTimeStep ); // If maxSubSteps is not defined, keep the simulation fully up to date + + last_simulation_duration = Date.now(); + world.stepSimulation( params.timeStep, params.maxSubSteps, fixedTimeStep ); + + reportVehicles(); + reportCollisions(); + reportConstraints(); + reportWorld(); + + last_simulation_duration = ( Date.now() - last_simulation_duration ) / 1000; + last_simulation_time = Date.now(); + } +}; + + +// Constraint functions +public_functions.hinge_setLimits = function( params ) { + _constraints[ params.constraint ].setLimit( params.low, params.high, 0, params.bias_factor, params.relaxation_factor ); +}; +public_functions.hinge_enableAngularMotor = function( params ) { + var constraint = _constraints[ params.constraint ]; + constraint.enableAngularMotor( true, params.velocity, params.acceleration ); + constraint.getRigidBodyA().activate(); + if ( constraint.getRigidBodyB() ) { + constraint.getRigidBodyB().activate(); + } +}; +public_functions.hinge_disableMotor = function( params ) { + _constraints[ params.constraint ].enableMotor( false ); + if ( constraint.getRigidBodyB() ) { + constraint.getRigidBodyB().activate(); + } +}; + +public_functions.slider_setLimits = function( params ) { + var constraint = _constraints[ params.constraint ]; + constraint.setLowerLinLimit( params.lin_lower || 0 ); + constraint.setUpperLinLimit( params.lin_upper || 0 ); + + constraint.setLowerAngLimit( params.ang_lower || 0 ); + constraint.setUpperAngLimit( params.ang_upper || 0 ); +}; +public_functions.slider_setRestitution = function( params ) { + var constraint = _constraints[ params.constraint ]; + constraint.setSoftnessLimLin( params.linear || 0 ); + constraint.setSoftnessLimAng( params.angular || 0 ); +}; +public_functions.slider_enableLinearMotor = function( params ) { + var constraint = _constraints[ params.constraint ]; + constraint.setTargetLinMotorVelocity( params.velocity ); + constraint.setMaxLinMotorForce( params.acceleration ); + constraint.setPoweredLinMotor( true ); + constraint.getRigidBodyA().activate(); + if ( constraint.getRigidBodyB() ) { + constraint.getRigidBodyB().activate(); + } +}; +public_functions.slider_disableLinearMotor = function( params ) { + var constraint = _constraints[ params.constraint ]; + constraint.setPoweredLinMotor( false ); + if ( constraint.getRigidBodyB() ) { + constraint.getRigidBodyB().activate(); + } +}; +public_functions.slider_enableAngularMotor = function( params ) { + var constraint = _constraints[ params.constraint ]; + constraint.setTargetAngMotorVelocity( params.velocity ); + constraint.setMaxAngMotorForce( params.acceleration ); + constraint.setPoweredAngMotor( true ); + constraint.getRigidBodyA().activate(); + if ( constraint.getRigidBodyB() ) { + constraint.getRigidBodyB().activate(); + } +}; +public_functions.slider_disableAngularMotor = function( params ) { + var constraint = _constraints[ params.constraint ]; + constraint.setPoweredAngMotor( false ); + constraint.getRigidBodyA().activate(); + if ( constraint.getRigidBodyB() ) { + constraint.getRigidBodyB().activate(); + } +}; + +public_functions.conetwist_setLimit = function( params ) { + _constraints[ params.constraint ].setLimit( params.z, params.y, params.x ); // ZYX order +}; +public_functions.conetwist_enableMotor = function( params ) { + var constraint = _constraints[ params.constraint ]; + constraint.enableMotor( true ); + constraint.getRigidBodyA().activate(); + constraint.getRigidBodyB().activate(); +}; +public_functions.conetwist_setMaxMotorImpulse = function( params ) { + var constraint = _constraints[ params.constraint ]; + constraint.setMaxMotorImpulse( params.max_impulse ); + constraint.getRigidBodyA().activate(); + constraint.getRigidBodyB().activate(); +}; +public_functions.conetwist_setMotorTarget = function( params ) { + var constraint = _constraints[ params.constraint ]; + + _quat.setX(params.x); + _quat.setY(params.y); + _quat.setZ(params.z); + _quat.setW(params.w); + + constraint.setMotorTarget(_quat); + + constraint.getRigidBodyA().activate(); + constraint.getRigidBodyB().activate(); +}; +public_functions.conetwist_disableMotor = function( params ) { + var constraint = _constraints[ params.constraint ]; + constraint.enableMotor( false ); + constraint.getRigidBodyA().activate(); + constraint.getRigidBodyB().activate(); +}; + +public_functions.dof_setLinearLowerLimit = function( params ) { + var constraint = _constraints[ params.constraint ]; + + _vec3_1.setX(params.x); + _vec3_1.setY(params.y); + _vec3_1.setZ(params.z); + + constraint.setLinearLowerLimit(_vec3_1); + + constraint.getRigidBodyA().activate(); + if ( constraint.getRigidBodyB() ) { + constraint.getRigidBodyB().activate(); + } +}; +public_functions.dof_setLinearUpperLimit = function( params ) { + var constraint = _constraints[ params.constraint ]; + + _vec3_1.setX(params.x); + _vec3_1.setY(params.y); + _vec3_1.setZ(params.z); + + constraint.setLinearUpperLimit(_vec3_1); + + constraint.getRigidBodyA().activate(); + if ( constraint.getRigidBodyB() ) { + constraint.getRigidBodyB().activate(); + } +}; +public_functions.dof_setAngularLowerLimit = function( params ) { + var constraint = _constraints[ params.constraint ]; + + _vec3_1.setX(params.x); + _vec3_1.setY(params.y); + _vec3_1.setZ(params.z); + + constraint.setAngularLowerLimit(_vec3_1); + + constraint.getRigidBodyA().activate(); + if ( constraint.getRigidBodyB() ) { + constraint.getRigidBodyB().activate(); + } +}; +public_functions.dof_setAngularUpperLimit = function( params ) { + var constraint = _constraints[ params.constraint ]; + + _vec3_1.setX(params.x); + _vec3_1.setY(params.y); + _vec3_1.setZ(params.z); + + constraint.setAngularUpperLimit(_vec3_1); + + constraint.getRigidBodyA().activate(); + if ( constraint.getRigidBodyB() ) { + constraint.getRigidBodyB().activate(); + } +}; +public_functions.dof_enableAngularMotor = function( params ) { + var constraint = _constraints[ params.constraint ]; + + var motor = constraint.getRotationalLimitMotor( params.which ); + motor.set_m_enableMotor( true ); + + constraint.getRigidBodyA().activate(); + if ( constraint.getRigidBodyB() ) { + constraint.getRigidBodyB().activate(); + } +}; +public_functions.dof_configureAngularMotor = function( params ) { + var constraint = _constraints[ params.constraint ]; + + var motor = constraint.getRotationalLimitMotor( params.which ); + + motor.set_m_loLimit( params.low_angle ); + motor.set_m_hiLimit( params.high_angle ); + motor.set_m_targetVelocity( params.velocity ); + motor.set_m_maxMotorForce( params.max_force ); + + constraint.getRigidBodyA().activate(); + if ( constraint.getRigidBodyB() ) { + constraint.getRigidBodyB().activate(); + } +}; +public_functions.dof_disableAngularMotor = function( params ) { + var constraint = _constraints[ params.constraint ]; + + var motor = constraint.getRotationalLimitMotor( params.which ); + motor.set_m_enableMotor( false ); + + constraint.getRigidBodyA().activate(); + if ( constraint.getRigidBodyB() ) { + constraint.getRigidBodyB().activate(); + } +}; + +reportWorld = function() { + var index, object, + transform, origin, rotation, + offset = 0, + i = 0; + + if ( SUPPORT_TRANSFERABLE ) { + if ( worldreport.length < 2 + _num_objects * WORLDREPORT_ITEMSIZE ) { + worldreport = new Float32Array( + 2 + // message id & # objects in report + ( Math.ceil( _num_objects / REPORT_CHUNKSIZE ) * REPORT_CHUNKSIZE ) * WORLDREPORT_ITEMSIZE // # of values needed * item size + ); + worldreport[0] = MESSAGE_TYPES.WORLDREPORT; + } + } + + worldreport[1] = _num_objects; // record how many objects we're reporting on + + //for ( i = 0; i < worldreport[1]; i++ ) { + for ( index in _objects ) { + if ( _objects.hasOwnProperty( index ) ) { + object = _objects[index]; + + // #TODO: we can't use center of mass transform when center of mass can change, + // but getMotionState().getWorldTransform() screws up on objects that have been moved + //object.getMotionState().getWorldTransform( transform ); + transform = object.getCenterOfMassTransform(); + + origin = transform.getOrigin(); + rotation = transform.getRotation(); + + // add values to report + offset = 2 + (i++) * WORLDREPORT_ITEMSIZE; + + worldreport[ offset ] = object.id; + + worldreport[ offset + 1 ] = origin.x(); + worldreport[ offset + 2 ] = origin.y(); + worldreport[ offset + 3 ] = origin.z(); + + worldreport[ offset + 4 ] = rotation.x(); + worldreport[ offset + 5 ] = rotation.y(); + worldreport[ offset + 6 ] = rotation.z(); + worldreport[ offset + 7 ] = rotation.w(); + + _vector = object.getLinearVelocity(); + worldreport[ offset + 8 ] = _vector.x(); + worldreport[ offset + 9 ] = _vector.y(); + worldreport[ offset + 10 ] = _vector.z(); + + _vector = object.getAngularVelocity(); + worldreport[ offset + 11 ] = _vector.x(); + worldreport[ offset + 12 ] = _vector.y(); + worldreport[ offset + 13 ] = _vector.z(); + } + } + + + if ( SUPPORT_TRANSFERABLE ) { + transferableMessage( worldreport.buffer, [worldreport.buffer] ); + } else { + transferableMessage( worldreport ); + } + +}; + +reportCollisions = function() { + var i, offset, + dp = world.getDispatcher(), + num = dp.getNumManifolds(), + manifold, num_contacts, j, pt, + _collided = false; + + if ( SUPPORT_TRANSFERABLE ) { + if ( collisionreport.length < 2 + num * COLLISIONREPORT_ITEMSIZE ) { + collisionreport = new Float32Array( + 2 + // message id & # objects in report + ( Math.ceil( _num_objects / REPORT_CHUNKSIZE ) * REPORT_CHUNKSIZE ) * COLLISIONREPORT_ITEMSIZE // # of values needed * item size + ); + collisionreport[0] = MESSAGE_TYPES.COLLISIONREPORT; + } + } + + collisionreport[1] = 0; // how many collisions we're reporting on + + for ( i = 0; i < num; i++ ) { + manifold = dp.getManifoldByIndexInternal( i ); + + num_contacts = manifold.getNumContacts(); + if ( num_contacts === 0 ) { + continue; + } + + for ( j = 0; j < num_contacts; j++ ) { + pt = manifold.getContactPoint( j ); + //if ( pt.getDistance() < 0 ) { + offset = 2 + (collisionreport[1]++) * COLLISIONREPORT_ITEMSIZE; + collisionreport[ offset ] = _objects_ammo[ manifold.getBody0() ]; + collisionreport[ offset + 1 ] = _objects_ammo[ manifold.getBody1() ]; + + _vector = pt.get_m_normalWorldOnB(); + collisionreport[ offset + 2 ] = _vector.x(); + collisionreport[ offset + 3 ] = _vector.y(); + collisionreport[ offset + 4 ] = _vector.z(); + break; + //} + + transferableMessage( _objects_ammo ); + + } + } + + + if ( SUPPORT_TRANSFERABLE ) { + transferableMessage( collisionreport.buffer, [collisionreport.buffer] ); + } else { + transferableMessage( collisionreport ); + } +}; + +reportVehicles = function() { + var index, vehicle, + transform, origin, rotation, + offset = 0, + i = 0, j = 0; + + if ( SUPPORT_TRANSFERABLE ) { + if ( vehiclereport.length < 2 + _num_wheels * VEHICLEREPORT_ITEMSIZE ) { + vehiclereport = new Float32Array( + 2 + // message id & # objects in report + ( Math.ceil( _num_wheels / REPORT_CHUNKSIZE ) * REPORT_CHUNKSIZE ) * VEHICLEREPORT_ITEMSIZE // # of values needed * item size + ); + vehiclereport[0] = MESSAGE_TYPES.VEHICLEREPORT; + } + } + + for ( index in _vehicles ) { + if ( _vehicles.hasOwnProperty( index ) ) { + vehicle = _vehicles[index]; + + for ( j = 0; j < vehicle.getNumWheels(); j++ ) { + + //vehicle.updateWheelTransform( j, true ); + + //transform = vehicle.getWheelTransformWS( j ); + transform = vehicle.getWheelInfo( j ).get_m_worldTransform(); + + origin = transform.getOrigin(); + rotation = transform.getRotation(); + + // add values to report + offset = 1 + (i++) * VEHICLEREPORT_ITEMSIZE; + + vehiclereport[ offset ] = index; + vehiclereport[ offset + 1 ] = j; + + vehiclereport[ offset + 2 ] = origin.x(); + vehiclereport[ offset + 3 ] = origin.y(); + vehiclereport[ offset + 4 ] = origin.z(); + + vehiclereport[ offset + 5 ] = rotation.x(); + vehiclereport[ offset + 6 ] = rotation.y(); + vehiclereport[ offset + 7 ] = rotation.z(); + vehiclereport[ offset + 8 ] = rotation.w(); + + } + + } + } + + if ( j !== 0 ) { + if ( SUPPORT_TRANSFERABLE ) { + transferableMessage( vehiclereport.buffer, [vehiclereport.buffer] ); + } else { + transferableMessage( vehiclereport ); + } + } +}; + +reportConstraints = function() { + var index, constraint, + offset_body, + transform, origin, + offset = 0, + i = 0; + + if ( SUPPORT_TRANSFERABLE ) { + if ( constraintreport.length < 2 + _num_constraints * CONSTRAINTREPORT_ITEMSIZE ) { + constraintreport = new Float32Array( + 2 + // message id & # objects in report + ( Math.ceil( _num_constraints / REPORT_CHUNKSIZE ) * REPORT_CHUNKSIZE ) * CONSTRAINTREPORT_ITEMSIZE // # of values needed * item size + ); + constraintreport[0] = MESSAGE_TYPES.CONSTRAINTREPORT; + } + } + + for ( index in _constraints ) { + if ( _constraints.hasOwnProperty( index ) ) { + constraint = _constraints[index]; + offset_body = constraint.getRigidBodyA(); + transform = constraint.getFrameOffsetA(); + origin = transform.getOrigin(); + + // add values to report + offset = 1 + (i++) * CONSTRAINTREPORT_ITEMSIZE; + + constraintreport[ offset ] = index; + constraintreport[ offset + 1 ] = offset_body.id; + constraintreport[ offset + 2 ] = origin.getX(); + constraintreport[ offset + 3 ] = origin.getY(); + constraintreport[ offset + 4 ] = origin.getZ(); + constraintreport[ offset + 5 ] = constraint.getAppliedImpulse(); + } + } + + + if ( i !== 0 ) { + if ( SUPPORT_TRANSFERABLE ) { + transferableMessage( constraintreport.buffer, [constraintreport.buffer] ); + } else { + transferableMessage( constraintreport ); + } + } + +}; + +self.onmessage = function( event ) { + + if ( event.data instanceof Float32Array ) { + // transferable object + + switch ( event.data[0] ) { + case MESSAGE_TYPES.WORLDREPORT: + worldreport = new Float32Array( event.data ); + break; + + case MESSAGE_TYPES.COLLISIONREPORT: + collisionreport = new Float32Array( event.data ); + break; + + case MESSAGE_TYPES.VEHICLEREPORT: + vehiclereport = new Float32Array( event.data ); + break; + + case MESSAGE_TYPES.CONSTRAINTREPORT: + constraintreport = new Float32Array( event.data ); + break; + } + + return; + } + + if ( event.data.cmd && public_functions[event.data.cmd] ) { + //if ( event.data.params.id !== undefined && _objects[event.data.params.id] === undefined && event.data.cmd !== 'addObject' && event.data.cmd !== 'registerMaterial' ) return; + public_functions[event.data.cmd]( event.data.params ); + } + +}; diff --git a/lib/polyfills.js b/lib/polyfills.js new file mode 100644 index 0000000..7b618fa --- /dev/null +++ b/lib/polyfills.js @@ -0,0 +1,98 @@ +// Polyfills + +if ( Number.EPSILON === undefined ) { + + Number.EPSILON = Math.pow( 2, - 52 ); + +} + +if ( Number.isInteger === undefined ) { + + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger + + Number.isInteger = function ( value ) { + + return typeof value === 'number' && isFinite( value ) && Math.floor( value ) === value; + + }; + +} + +// + +if ( Math.sign === undefined ) { + + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign + + Math.sign = function ( x ) { + + return ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x; + + }; + +} + +if ( 'name' in Function.prototype === false ) { + + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name + + Object.defineProperty( Function.prototype, 'name', { + + get: function () { + + return this.toString().match( /^\s*function\s*([^\(\s]*)/ )[ 1 ]; + + } + + } ); + +} + +if ( Object.assign === undefined ) { + + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign + + ( function () { + + Object.assign = function ( target ) { + + 'use strict'; + + if ( target === undefined || target === null ) { + + throw new TypeError( 'Cannot convert undefined or null to object' ); + + } + + var output = Object( target ); + + for ( var index = 1; index < arguments.length; index ++ ) { + + var source = arguments[ index ]; + + if ( source !== undefined && source !== null ) { + + for ( var nextKey in source ) { + + if ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) { + + output[ nextKey ] = source[ nextKey ]; + + } + + } + + } + + } + + return output; + + }; + + } )(); + +} diff --git a/lib/renderers/WebGL2Renderer.js b/lib/renderers/WebGL2Renderer.js new file mode 100644 index 0000000..d0ad1c3 --- /dev/null +++ b/lib/renderers/WebGL2Renderer.js @@ -0,0 +1,189 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { REVISION } from '../constants.js'; +import { WebGLExtensions } from './webgl/WebGLExtensions.js'; +import { WebGLState } from './webgl/WebGLState.js'; +import { Color } from '../math/Color.js'; +import { Vector4 } from '../math/Vector4.js'; + +function WebGL2Renderer( parameters ) { + + console.log( 'THREE.WebGL2Renderer', REVISION ); + + parameters = parameters || {}; + + var _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ), + _context = parameters.context !== undefined ? parameters.context : null, + + _alpha = parameters.alpha !== undefined ? parameters.alpha : false, + _depth = parameters.depth !== undefined ? parameters.depth : true, + _stencil = parameters.stencil !== undefined ? parameters.stencil : true, + _antialias = parameters.antialias !== undefined ? parameters.antialias : false, + _premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true, + _preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false, + _powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default'; + + // initialize + + var gl; + + try { + + var attributes = { + alpha: _alpha, + depth: _depth, + stencil: _stencil, + antialias: _antialias, + premultipliedAlpha: _premultipliedAlpha, + preserveDrawingBuffer: _preserveDrawingBuffer, + powerPreference: _powerPreference + }; + + // event listeners must be registered before WebGL context is created, see #12753 + + _canvas.addEventListener( 'webglcontextlost', onContextLost, false ); + _canvas.addEventListener( 'webglcontextrestored', function () { } ); + + gl = _context || _canvas.getContext( 'webgl2', attributes ); + + if ( gl === null ) { + + if ( _canvas.getContext( 'webgl2' ) !== null ) { + + throw new Error( 'Error creating WebGL2 context with your selected attributes.' ); + + } else { + + throw new Error( 'Error creating WebGL2 context.' ); + + } + + } + + } catch ( error ) { + + console.error( 'THREE.WebGL2Renderer: ' + error.message ); + + } + + // + + var _autoClear = true, + _autoClearColor = true, + _autoClearDepth = true, + _autoClearStencil = true, + + _clearColor = new Color( 0x000000 ), + _clearAlpha = 0, + + _width = _canvas.width, + _height = _canvas.height, + + _pixelRatio = 1, + + _viewport = new Vector4( 0, 0, _width, _height ); + + var extensions = new WebGLExtensions( gl ); + var state = new WebGLState( gl, extensions, function () {} ); + + // + + function clear( color, depth, stencil ) { + + var 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; + + gl.clear( bits ); + + } + + function setPixelRatio( value ) { + + if ( value === undefined ) return; + + _pixelRatio = value; + + setSize( _viewport.z, _viewport.w, false ); + + } + + function setSize( width, height, updateStyle ) { + + _width = width; + _height = height; + + _canvas.width = width * _pixelRatio; + _canvas.height = height * _pixelRatio; + + if ( updateStyle !== false ) { + + _canvas.style.width = width + 'px'; + _canvas.style.height = height + 'px'; + + } + + setViewport( 0, 0, width, height ); + + } + + function setViewport( x, y, width, height ) { + + state.viewport( _viewport.set( x, y, width, height ) ); + + } + + function render( scene, camera ) { + + if ( camera !== undefined && camera.isCamera !== true ) { + + console.error( 'THREE.WebGL2Renderer.render: camera is not an instance of THREE.Camera.' ); + return; + + } + + var background = scene.background; + var forceClear = false; + + if ( background === null ) { + + state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha ); + + } else if ( background && background.isColor ) { + + state.buffers.color.setClear( background.r, background.g, background.b, 1, _premultipliedAlpha ); + forceClear = true; + + } + + if ( _autoClear || forceClear ) { + + this.clear( _autoClearColor, _autoClearDepth, _autoClearStencil ); + + } + + } + + function onContextLost( event ) { + + event.preventDefault(); + + } + + return { + domElement: _canvas, + + clear: clear, + setPixelRatio: setPixelRatio, + setSize: setSize, + render: render + }; + +} + + +export { WebGL2Renderer }; diff --git a/lib/renderers/WebGLRenderTarget.js b/lib/renderers/WebGLRenderTarget.js new file mode 100644 index 0000000..f5313b3 --- /dev/null +++ b/lib/renderers/WebGLRenderTarget.js @@ -0,0 +1,95 @@ +import { EventDispatcher } from '../core/EventDispatcher.js'; +import { Texture } from '../textures/Texture.js'; +import { LinearFilter } from '../constants.js'; +import { Vector4 } from '../math/Vector4.js'; + +/** + * @author szimek / https://github.com/szimek/ + * @author alteredq / http://alteredqualia.com/ + * @author Marius Kintel / https://github.com/kintel + */ + +/* + In options, we can specify: + * Texture parameters for an auto-generated target texture + * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers +*/ +function WebGLRenderTarget( width, height, options ) { + + this.width = width; + this.height = height; + + this.scissor = new Vector4( 0, 0, width, height ); + this.scissorTest = false; + + this.viewport = new Vector4( 0, 0, width, height ); + + options = options || {}; + + if ( options.minFilter === undefined ) options.minFilter = LinearFilter; + + this.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding ); + + this.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : true; + + this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true; + this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true; + this.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null; + +} + +WebGLRenderTarget.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: WebGLRenderTarget, + + isWebGLRenderTarget: true, + + setSize: function ( width, height ) { + + if ( this.width !== width || this.height !== height ) { + + this.width = width; + this.height = height; + + this.dispose(); + + } + + this.viewport.set( 0, 0, width, height ); + this.scissor.set( 0, 0, width, height ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.width = source.width; + this.height = source.height; + + this.viewport.copy( source.viewport ); + + this.texture = source.texture.clone(); + + this.depthBuffer = source.depthBuffer; + this.stencilBuffer = source.stencilBuffer; + this.depthTexture = source.depthTexture; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + +} ); + + +export { WebGLRenderTarget }; diff --git a/lib/renderers/WebGLRenderTargetCube.js b/lib/renderers/WebGLRenderTargetCube.js new file mode 100644 index 0000000..6662016 --- /dev/null +++ b/lib/renderers/WebGLRenderTargetCube.js @@ -0,0 +1,22 @@ +import { WebGLRenderTarget } from './WebGLRenderTarget.js'; + +/** + * @author alteredq / http://alteredqualia.com + */ + +function WebGLRenderTargetCube( width, height, options ) { + + WebGLRenderTarget.call( this, width, height, options ); + + this.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5 + this.activeMipMapLevel = 0; + +} + +WebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype ); +WebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube; + +WebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true; + + +export { WebGLRenderTargetCube }; diff --git a/lib/renderers/WebGLRenderer.js b/lib/renderers/WebGLRenderer.js new file mode 100644 index 0000000..7b760cf --- /dev/null +++ b/lib/renderers/WebGLRenderer.js @@ -0,0 +1,2642 @@ +import { + REVISION, + RGBAFormat, + HalfFloatType, + FloatType, + UnsignedByteType, + TriangleFanDrawMode, + TriangleStripDrawMode, + TrianglesDrawMode, + LinearToneMapping, + BackSide +} from '../constants.js'; +import { _Math } from '../math/Math.js'; +import { DataTexture } from '../textures/DataTexture.js'; +import { Frustum } from '../math/Frustum.js'; +import { Matrix4 } from '../math/Matrix4.js'; +import { ShaderLib } from './shaders/ShaderLib.js'; +import { UniformsLib } from './shaders/UniformsLib.js'; +import { UniformsUtils } from './shaders/UniformsUtils.js'; +import { Vector3 } from '../math/Vector3.js'; +import { Vector4 } from '../math/Vector4.js'; +import { WebGLAnimation } from './webgl/WebGLAnimation.js'; +import { WebGLAttributes } from './webgl/WebGLAttributes.js'; +import { WebGLBackground } from './webgl/WebGLBackground.js'; +import { WebGLBufferRenderer } from './webgl/WebGLBufferRenderer.js'; +import { WebGLCapabilities } from './webgl/WebGLCapabilities.js'; +import { WebGLClipping } from './webgl/WebGLClipping.js'; +import { WebGLExtensions } from './webgl/WebGLExtensions.js'; +import { WebGLGeometries } from './webgl/WebGLGeometries.js'; +import { WebGLIndexedBufferRenderer } from './webgl/WebGLIndexedBufferRenderer.js'; +import { WebGLInfo } from './webgl/WebGLInfo.js'; +import { WebGLMorphtargets } from './webgl/WebGLMorphtargets.js'; +import { WebGLObjects } from './webgl/WebGLObjects.js'; +import { WebGLPrograms } from './webgl/WebGLPrograms.js'; +import { WebGLProperties } from './webgl/WebGLProperties.js'; +import { WebGLRenderLists } from './webgl/WebGLRenderLists.js'; +import { WebGLRenderStates } from './webgl/WebGLRenderStates.js'; +import { WebGLShadowMap } from './webgl/WebGLShadowMap.js'; +import { WebGLState } from './webgl/WebGLState.js'; +import { WebGLTextures } from './webgl/WebGLTextures.js'; +import { WebGLUniforms } from './webgl/WebGLUniforms.js'; +import { WebGLUtils } from './webgl/WebGLUtils.js'; +import { WebVRManager } from './webvr/WebVRManager.js'; +import { WebXRManager } from './webvr/WebXRManager.js'; + +/** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + * @author tschw + */ + +function WebGLRenderer( parameters ) { + + console.log( 'THREE.WebGLRenderer', REVISION ); + + parameters = parameters || {}; + + var _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ), + _context = parameters.context !== undefined ? parameters.context : null, + + _alpha = parameters.alpha !== undefined ? parameters.alpha : false, + _depth = parameters.depth !== undefined ? parameters.depth : true, + _stencil = parameters.stencil !== undefined ? parameters.stencil : true, + _antialias = parameters.antialias !== undefined ? parameters.antialias : false, + _premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true, + _preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false, + _powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default'; + + var currentRenderList = null; + var currentRenderState = null; + + // public properties + + this.domElement = _canvas; + this.context = null; + + // clearing + + this.autoClear = true; + this.autoClearColor = true; + this.autoClearDepth = true; + this.autoClearStencil = true; + + // scene graph + + this.sortObjects = true; + + // user-defined clipping + + this.clippingPlanes = []; + this.localClippingEnabled = false; + + // physically based shading + + this.gammaFactor = 2.0; // for backwards compatibility + this.gammaInput = false; + this.gammaOutput = false; + + // physical lights + + this.physicallyCorrectLights = false; + + // tone mapping + + this.toneMapping = LinearToneMapping; + this.toneMappingExposure = 1.0; + this.toneMappingWhitePoint = 1.0; + + // morphs + + this.maxMorphTargets = 8; + this.maxMorphNormals = 4; + + // internal properties + + var _this = this, + + _isContextLost = false, + + // internal state cache + + _framebuffer = null, + + _currentRenderTarget = null, + _currentFramebuffer = null, + _currentMaterialId = - 1, + + // geometry and program caching + + _currentGeometryProgram = { + geometry: null, + program: null, + wireframe: false + }, + + _currentCamera = null, + _currentArrayCamera = null, + + _currentViewport = new Vector4(), + _currentScissor = new Vector4(), + _currentScissorTest = null, + + // + + _usedTextureUnits = 0, + + // + + _width = _canvas.width, + _height = _canvas.height, + + _pixelRatio = 1, + + _viewport = new Vector4( 0, 0, _width, _height ), + _scissor = new Vector4( 0, 0, _width, _height ), + _scissorTest = false, + + // frustum + + _frustum = new Frustum(), + + // clipping + + _clipping = new WebGLClipping(), + _clippingEnabled = false, + _localClippingEnabled = false, + + // camera matrices cache + + _projScreenMatrix = new Matrix4(), + + _vector3 = new Vector3(); + + function getTargetPixelRatio() { + + return _currentRenderTarget === null ? _pixelRatio : 1; + + } + + // initialize + + var _gl; + + try { + + var contextAttributes = { + alpha: _alpha, + depth: _depth, + stencil: _stencil, + antialias: _antialias, + premultipliedAlpha: _premultipliedAlpha, + preserveDrawingBuffer: _preserveDrawingBuffer, + powerPreference: _powerPreference + }; + + // event listeners must be registered before WebGL context is created, see #12753 + + _canvas.addEventListener( 'webglcontextlost', onContextLost, false ); + _canvas.addEventListener( 'webglcontextrestored', onContextRestore, false ); + + _gl = _context || _canvas.getContext( 'webgl', contextAttributes ) || _canvas.getContext( 'experimental-webgl', contextAttributes ); + + if ( _gl === null ) { + + if ( _canvas.getContext( 'webgl' ) !== null ) { + + throw new Error( 'Error creating WebGL context with your selected attributes.' ); + + } else { + + throw new Error( 'Error creating WebGL context.' ); + + } + + } + + // Some experimental-webgl implementations do not have getShaderPrecisionFormat + + if ( _gl.getShaderPrecisionFormat === undefined ) { + + _gl.getShaderPrecisionFormat = function () { + + return { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 }; + + }; + + } + + } catch ( error ) { + + console.error( 'THREE.WebGLRenderer: ' + error.message ); + + } + + var extensions, capabilities, state, info; + var properties, textures, attributes, geometries, objects; + var programCache, renderLists, renderStates; + + var background, morphtargets, bufferRenderer, indexedBufferRenderer; + + var utils; + + function initGLContext() { + + extensions = new WebGLExtensions( _gl ); + + capabilities = new WebGLCapabilities( _gl, extensions, parameters ); + + if ( ! capabilities.isWebGL2 ) { + + extensions.get( 'WEBGL_depth_texture' ); + extensions.get( 'OES_texture_float' ); + extensions.get( 'OES_texture_half_float' ); + extensions.get( 'OES_texture_half_float_linear' ); + extensions.get( 'OES_standard_derivatives' ); + extensions.get( 'OES_element_index_uint' ); + extensions.get( 'ANGLE_instanced_arrays' ); + + } + + extensions.get( 'OES_texture_float_linear' ); + + utils = new WebGLUtils( _gl, extensions, capabilities ); + + state = new WebGLState( _gl, extensions, utils, capabilities ); + state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) ); + state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) ); + + info = new WebGLInfo( _gl ); + properties = new WebGLProperties(); + textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ); + attributes = new WebGLAttributes( _gl ); + geometries = new WebGLGeometries( _gl, attributes, info ); + objects = new WebGLObjects( geometries, info ); + morphtargets = new WebGLMorphtargets( _gl ); + programCache = new WebGLPrograms( _this, extensions, capabilities ); + renderLists = new WebGLRenderLists(); + renderStates = new WebGLRenderStates(); + + background = new WebGLBackground( _this, state, objects, _premultipliedAlpha ); + + bufferRenderer = new WebGLBufferRenderer( _gl, extensions, info, capabilities ); + indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info, capabilities ); + + info.programs = programCache.programs; + + _this.context = _gl; + _this.capabilities = capabilities; + _this.extensions = extensions; + _this.properties = properties; + _this.renderLists = renderLists; + _this.state = state; + _this.info = info; + + } + + initGLContext(); + + // vr + + var vr = null; + + if ( typeof navigator !== 'undefined' ) { + + vr = ( 'xr' in navigator ) ? new WebXRManager( _this ) : new WebVRManager( _this ); + + } + + this.vr = vr; + + // shadow map + + var shadowMap = new WebGLShadowMap( _this, objects, capabilities.maxTextureSize ); + + this.shadowMap = shadowMap; + + // API + + this.getContext = function () { + + return _gl; + + }; + + this.getContextAttributes = function () { + + return _gl.getContextAttributes(); + + }; + + this.forceContextLoss = function () { + + var extension = extensions.get( 'WEBGL_lose_context' ); + if ( extension ) extension.loseContext(); + + }; + + this.forceContextRestore = function () { + + var extension = extensions.get( 'WEBGL_lose_context' ); + if ( extension ) extension.restoreContext(); + + }; + + this.getPixelRatio = function () { + + return _pixelRatio; + + }; + + this.setPixelRatio = function ( value ) { + + if ( value === undefined ) return; + + _pixelRatio = value; + + this.setSize( _width, _height, false ); + + }; + + this.getSize = function () { + + return { + width: _width, + height: _height + }; + + }; + + this.setSize = function ( width, height, updateStyle ) { + + if ( vr.isPresenting() ) { + + console.warn( 'THREE.WebGLRenderer: Can\'t change size while VR device is presenting.' ); + return; + + } + + _width = width; + _height = height; + + _canvas.width = width * _pixelRatio; + _canvas.height = height * _pixelRatio; + + if ( updateStyle !== false ) { + + _canvas.style.width = width + 'px'; + _canvas.style.height = height + 'px'; + + } + + this.setViewport( 0, 0, width, height ); + + }; + + this.getDrawingBufferSize = function () { + + return { + width: _width * _pixelRatio, + height: _height * _pixelRatio + }; + + }; + + this.setDrawingBufferSize = function ( width, height, pixelRatio ) { + + _width = width; + _height = height; + + _pixelRatio = pixelRatio; + + _canvas.width = width * pixelRatio; + _canvas.height = height * pixelRatio; + + this.setViewport( 0, 0, width, height ); + + }; + + this.getCurrentViewport = function () { + + return _currentViewport; + + }; + + this.setViewport = function ( x, y, width, height ) { + + _viewport.set( x, _height - y - height, width, height ); + state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) ); + + }; + + this.setScissor = function ( x, y, width, height ) { + + _scissor.set( x, _height - y - height, width, height ); + state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) ); + + }; + + this.setScissorTest = function ( boolean ) { + + state.setScissorTest( _scissorTest = boolean ); + + }; + + // Clearing + + this.getClearColor = function () { + + return background.getClearColor(); + + }; + + this.setClearColor = function () { + + background.setClearColor.apply( background, arguments ); + + }; + + this.getClearAlpha = function () { + + return background.getClearAlpha(); + + }; + + this.setClearAlpha = function () { + + background.setClearAlpha.apply( background, arguments ); + + }; + + this.clear = function ( color, depth, stencil ) { + + var 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; + + _gl.clear( bits ); + + }; + + this.clearColor = function () { + + this.clear( true, false, false ); + + }; + + this.clearDepth = function () { + + this.clear( false, true, false ); + + }; + + this.clearStencil = function () { + + this.clear( false, false, true ); + + }; + + // + + this.dispose = function () { + + _canvas.removeEventListener( 'webglcontextlost', onContextLost, false ); + _canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false ); + + renderLists.dispose(); + renderStates.dispose(); + properties.dispose(); + objects.dispose(); + + vr.dispose(); + + animation.stop(); + + }; + + // Events + + function onContextLost( event ) { + + event.preventDefault(); + + console.log( 'THREE.WebGLRenderer: Context Lost.' ); + + _isContextLost = true; + + } + + function onContextRestore( /* event */ ) { + + console.log( 'THREE.WebGLRenderer: Context Restored.' ); + + _isContextLost = false; + + initGLContext(); + + } + + function onMaterialDispose( event ) { + + var material = event.target; + + material.removeEventListener( 'dispose', onMaterialDispose ); + + deallocateMaterial( material ); + + } + + // Buffer deallocation + + function deallocateMaterial( material ) { + + releaseMaterialProgramReference( material ); + + properties.remove( material ); + + } + + + function releaseMaterialProgramReference( material ) { + + var programInfo = properties.get( material ).program; + + material.program = undefined; + + if ( programInfo !== undefined ) { + + programCache.releaseProgram( programInfo ); + + } + + } + + // Buffer rendering + + function renderObjectImmediate( object, program ) { + + object.render( function ( object ) { + + _this.renderBufferImmediate( object, program ); + + } ); + + } + + this.renderBufferImmediate = function ( object, program ) { + + state.initAttributes(); + + var buffers = properties.get( object ); + + if ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer(); + if ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer(); + if ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer(); + if ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer(); + + var programAttributes = program.getAttributes(); + + if ( object.hasPositions ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( programAttributes.position ); + _gl.vertexAttribPointer( programAttributes.position, 3, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasNormals ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( programAttributes.normal ); + _gl.vertexAttribPointer( programAttributes.normal, 3, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasUvs ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( programAttributes.uv ); + _gl.vertexAttribPointer( programAttributes.uv, 2, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasColors ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( programAttributes.color ); + _gl.vertexAttribPointer( programAttributes.color, 3, _gl.FLOAT, false, 0, 0 ); + + } + + state.disableUnusedAttributes(); + + _gl.drawArrays( _gl.TRIANGLES, 0, object.count ); + + object.count = 0; + + }; + + this.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) { + + var frontFaceCW = ( object.isMesh && object.normalMatrix.determinant() < 0 ); + + state.setMaterial( material, frontFaceCW ); + + var program = setProgram( camera, fog, material, object ); + + var updateBuffers = false; + + if ( _currentGeometryProgram.geometry !== geometry.id || + _currentGeometryProgram.program !== program.id || + _currentGeometryProgram.wireframe !== ( material.wireframe === true ) ) { + + _currentGeometryProgram.geometry = geometry.id; + _currentGeometryProgram.program = program.id; + _currentGeometryProgram.wireframe = material.wireframe === true; + updateBuffers = true; + + } + + if ( object.morphTargetInfluences ) { + + morphtargets.update( object, geometry, material, program ); + + updateBuffers = true; + + } + + // + + var index = geometry.index; + var position = geometry.attributes.position; + var rangeFactor = 1; + + if ( material.wireframe === true ) { + + index = geometries.getWireframeAttribute( geometry ); + rangeFactor = 2; + + } + + var attribute; + var renderer = bufferRenderer; + + if ( index !== null ) { + + attribute = attributes.get( index ); + + renderer = indexedBufferRenderer; + renderer.setIndex( attribute ); + + } + + if ( updateBuffers ) { + + setupVertexAttributes( material, program, geometry ); + + if ( index !== null ) { + + _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, attribute.buffer ); + + } + + } + + // + + var dataCount = Infinity; + + if ( index !== null ) { + + dataCount = index.count; + + } else if ( position !== undefined ) { + + dataCount = position.count; + + } + + var rangeStart = geometry.drawRange.start * rangeFactor; + var rangeCount = geometry.drawRange.count * rangeFactor; + + var groupStart = group !== null ? group.start * rangeFactor : 0; + var groupCount = group !== null ? group.count * rangeFactor : Infinity; + + var drawStart = Math.max( rangeStart, groupStart ); + var drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1; + + var drawCount = Math.max( 0, drawEnd - drawStart + 1 ); + + if ( drawCount === 0 ) return; + + // + + if ( object.isMesh ) { + + if ( material.wireframe === true ) { + + state.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() ); + renderer.setMode( _gl.LINES ); + + } else { + + switch ( object.drawMode ) { + + case TrianglesDrawMode: + renderer.setMode( _gl.TRIANGLES ); + break; + + case TriangleStripDrawMode: + renderer.setMode( _gl.TRIANGLE_STRIP ); + break; + + case TriangleFanDrawMode: + renderer.setMode( _gl.TRIANGLE_FAN ); + break; + + } + + } + + + } else if ( object.isLine ) { + + var lineWidth = material.linewidth; + + if ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material + + state.setLineWidth( lineWidth * getTargetPixelRatio() ); + + if ( object.isLineSegments ) { + + renderer.setMode( _gl.LINES ); + + } else if ( object.isLineLoop ) { + + renderer.setMode( _gl.LINE_LOOP ); + + } else { + + renderer.setMode( _gl.LINE_STRIP ); + + } + + } else if ( object.isPoints ) { + + renderer.setMode( _gl.POINTS ); + + } else if ( object.isSprite ) { + + renderer.setMode( _gl.TRIANGLES ); + + } + + if ( geometry && geometry.isInstancedBufferGeometry ) { + + if ( geometry.maxInstancedCount > 0 ) { + + renderer.renderInstances( geometry, drawStart, drawCount ); + + } + + } else { + + renderer.render( drawStart, drawCount ); + + } + + }; + + function setupVertexAttributes( material, program, geometry ) { + + if ( geometry && geometry.isInstancedBufferGeometry & ! capabilities.isWebGL2 ) { + + if ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) { + + console.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + } + + state.initAttributes(); + + var geometryAttributes = geometry.attributes; + + var programAttributes = program.getAttributes(); + + var materialDefaultAttributeValues = material.defaultAttributeValues; + + for ( var name in programAttributes ) { + + var programAttribute = programAttributes[ name ]; + + if ( programAttribute >= 0 ) { + + var geometryAttribute = geometryAttributes[ name ]; + + if ( geometryAttribute !== undefined ) { + + var normalized = geometryAttribute.normalized; + var size = geometryAttribute.itemSize; + + var attribute = attributes.get( geometryAttribute ); + + // TODO Attribute may not be available on context restore + + if ( attribute === undefined ) continue; + + var buffer = attribute.buffer; + var type = attribute.type; + var bytesPerElement = attribute.bytesPerElement; + + if ( geometryAttribute.isInterleavedBufferAttribute ) { + + var data = geometryAttribute.data; + var stride = data.stride; + var offset = geometryAttribute.offset; + + if ( data && data.isInstancedInterleavedBuffer ) { + + state.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute ); + + if ( geometry.maxInstancedCount === undefined ) { + + geometry.maxInstancedCount = data.meshPerAttribute * data.count; + + } + + } else { + + state.enableAttribute( programAttribute ); + + } + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer ); + _gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * bytesPerElement, offset * bytesPerElement ); + + } else { + + if ( geometryAttribute.isInstancedBufferAttribute ) { + + state.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute ); + + if ( geometry.maxInstancedCount === undefined ) { + + geometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count; + + } + + } else { + + state.enableAttribute( programAttribute ); + + } + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer ); + _gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, 0 ); + + } + + } else if ( materialDefaultAttributeValues !== undefined ) { + + var value = materialDefaultAttributeValues[ name ]; + + if ( value !== undefined ) { + + switch ( value.length ) { + + case 2: + _gl.vertexAttrib2fv( programAttribute, value ); + break; + + case 3: + _gl.vertexAttrib3fv( programAttribute, value ); + break; + + case 4: + _gl.vertexAttrib4fv( programAttribute, value ); + break; + + default: + _gl.vertexAttrib1fv( programAttribute, value ); + + } + + } + + } + + } + + } + + state.disableUnusedAttributes(); + + } + + // Compile + + this.compile = function ( scene, camera ) { + + currentRenderState = renderStates.get( scene, camera ); + currentRenderState.init(); + + scene.traverse( function ( object ) { + + if ( object.isLight ) { + + currentRenderState.pushLight( object ); + + if ( object.castShadow ) { + + currentRenderState.pushShadow( object ); + + } + + } + + } ); + + currentRenderState.setupLights( camera ); + + scene.traverse( function ( object ) { + + if ( object.material ) { + + if ( Array.isArray( object.material ) ) { + + for ( var i = 0; i < object.material.length; i ++ ) { + + initMaterial( object.material[ i ], scene.fog, object ); + + } + + } else { + + initMaterial( object.material, scene.fog, object ); + + } + + } + + } ); + + }; + + // Animation Loop + + var onAnimationFrameCallback = null; + + function onAnimationFrame( time ) { + + if ( vr.isPresenting() ) return; + if ( onAnimationFrameCallback ) onAnimationFrameCallback( time ); + + } + + var animation = new WebGLAnimation(); + animation.setAnimationLoop( onAnimationFrame ); + + if ( typeof window !== 'undefined' ) animation.setContext( window ); + + this.setAnimationLoop = function ( callback ) { + + onAnimationFrameCallback = callback; + vr.setAnimationLoop( callback ); + + animation.start(); + + }; + + // Rendering + + this.render = function ( scene, camera, renderTarget, forceClear ) { + + if ( ! ( camera && camera.isCamera ) ) { + + console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' ); + return; + + } + + if ( _isContextLost ) return; + + // reset caching for this frame + + _currentGeometryProgram.geometry = null; + _currentGeometryProgram.program = null; + _currentGeometryProgram.wireframe = false; + _currentMaterialId = - 1; + _currentCamera = null; + + // update scene graph + + if ( scene.autoUpdate === true ) scene.updateMatrixWorld(); + + // update camera matrices and frustum + + if ( camera.parent === null ) camera.updateMatrixWorld(); + + if ( vr.enabled ) { + + camera = vr.getCamera( camera ); + + } + + // + + currentRenderState = renderStates.get( scene, camera ); + currentRenderState.init(); + + scene.onBeforeRender( _this, scene, camera, renderTarget ); + + _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); + _frustum.setFromMatrix( _projScreenMatrix ); + + _localClippingEnabled = this.localClippingEnabled; + _clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera ); + + currentRenderList = renderLists.get( scene, camera ); + currentRenderList.init(); + + projectObject( scene, camera, _this.sortObjects ); + + if ( _this.sortObjects === true ) { + + currentRenderList.sort(); + + } + + // + + if ( _clippingEnabled ) _clipping.beginShadows(); + + var shadowsArray = currentRenderState.state.shadowsArray; + + shadowMap.render( shadowsArray, scene, camera ); + + currentRenderState.setupLights( camera ); + + if ( _clippingEnabled ) _clipping.endShadows(); + + // + + if ( this.info.autoReset ) this.info.reset(); + + if ( renderTarget === undefined ) { + + renderTarget = null; + + } + + this.setRenderTarget( renderTarget ); + + // + + background.render( currentRenderList, scene, camera, forceClear ); + + // render scene + + var opaqueObjects = currentRenderList.opaque; + var transparentObjects = currentRenderList.transparent; + + if ( scene.overrideMaterial ) { + + var overrideMaterial = scene.overrideMaterial; + + if ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera, overrideMaterial ); + if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera, overrideMaterial ); + + } else { + + // opaque pass (front-to-back order) + + if ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera ); + + // transparent pass (back-to-front order) + + if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera ); + + } + + // Generate mipmap if we're using any kind of mipmap filtering + + if ( renderTarget ) { + + textures.updateRenderTargetMipmap( renderTarget ); + + } + + // Ensure depth buffer writing is enabled so it can be cleared on next render + + state.buffers.depth.setTest( true ); + state.buffers.depth.setMask( true ); + state.buffers.color.setMask( true ); + + state.setPolygonOffset( false ); + + scene.onAfterRender( _this, scene, camera ); + + if ( vr.enabled ) { + + vr.submitFrame(); + + } + + // _gl.finish(); + + currentRenderList = null; + currentRenderState = null; + + }; + + function projectObject( object, camera, sortObjects ) { + + if ( object.visible === false ) return; + + var visible = object.layers.test( camera.layers ); + + if ( visible ) { + + if ( object.isLight ) { + + currentRenderState.pushLight( object ); + + if ( object.castShadow ) { + + currentRenderState.pushShadow( object ); + + } + + } else if ( object.isSprite ) { + + if ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) { + + if ( sortObjects ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + var geometry = objects.update( object ); + var material = object.material; + + currentRenderList.push( object, geometry, material, _vector3.z, null ); + + } + + } else if ( object.isImmediateRenderObject ) { + + if ( sortObjects ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + currentRenderList.push( object, null, object.material, _vector3.z, null ); + + } else if ( object.isMesh || object.isLine || object.isPoints ) { + + if ( object.isSkinnedMesh ) { + + object.skeleton.update(); + + } + + if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) { + + if ( sortObjects ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + var geometry = objects.update( object ); + var material = object.material; + + if ( Array.isArray( material ) ) { + + var groups = geometry.groups; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + var groupMaterial = material[ group.materialIndex ]; + + if ( groupMaterial && groupMaterial.visible ) { + + currentRenderList.push( object, geometry, groupMaterial, _vector3.z, group ); + + } + + } + + } else if ( material.visible ) { + + currentRenderList.push( object, geometry, material, _vector3.z, null ); + + } + + } + + } + + } + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + projectObject( children[ i ], camera, sortObjects ); + + } + + } + + function renderObjects( renderList, scene, camera, overrideMaterial ) { + + for ( var i = 0, l = renderList.length; i < l; i ++ ) { + + var renderItem = renderList[ i ]; + + var object = renderItem.object; + var geometry = renderItem.geometry; + var material = overrideMaterial === undefined ? renderItem.material : overrideMaterial; + var group = renderItem.group; + + if ( camera.isArrayCamera ) { + + _currentArrayCamera = camera; + + var cameras = camera.cameras; + + for ( var j = 0, jl = cameras.length; j < jl; j ++ ) { + + var camera2 = cameras[ j ]; + + if ( object.layers.test( camera2.layers ) ) { + + if ( 'viewport' in camera2 ) { // XR + + state.viewport( _currentViewport.copy( camera2.viewport ) ); + + } else { + + var bounds = camera2.bounds; + + var x = bounds.x * _width; + var y = bounds.y * _height; + var width = bounds.z * _width; + var height = bounds.w * _height; + + state.viewport( _currentViewport.set( x, y, width, height ).multiplyScalar( _pixelRatio ) ); + + } + + currentRenderState.setupLights( camera2 ); + + renderObject( object, scene, camera2, geometry, material, group ); + + } + + } + + } else { + + _currentArrayCamera = null; + + renderObject( object, scene, camera, geometry, material, group ); + + } + + } + + } + + function renderObject( object, scene, camera, geometry, material, group ) { + + object.onBeforeRender( _this, scene, camera, geometry, material, group ); + currentRenderState = renderStates.get( scene, _currentArrayCamera || camera ); + + object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld ); + object.normalMatrix.getNormalMatrix( object.modelViewMatrix ); + + if ( object.isImmediateRenderObject ) { + + state.setMaterial( material ); + + var program = setProgram( camera, scene.fog, material, object ); + + _currentGeometryProgram.geometry = null; + _currentGeometryProgram.program = null; + _currentGeometryProgram.wireframe = false; + + renderObjectImmediate( object, program ); + + } else { + + _this.renderBufferDirect( camera, scene.fog, geometry, material, object, group ); + + } + + object.onAfterRender( _this, scene, camera, geometry, material, group ); + currentRenderState = renderStates.get( scene, _currentArrayCamera || camera ); + + } + + function initMaterial( material, fog, object ) { + + var materialProperties = properties.get( material ); + + var lights = currentRenderState.state.lights; + var shadowsArray = currentRenderState.state.shadowsArray; + + var lightsHash = materialProperties.lightsHash; + var lightsStateHash = lights.state.hash; + + var parameters = programCache.getParameters( + material, lights.state, shadowsArray, fog, _clipping.numPlanes, _clipping.numIntersection, object ); + + var code = programCache.getProgramCode( material, parameters ); + + var program = materialProperties.program; + var programChange = true; + + if ( program === undefined ) { + + // new material + material.addEventListener( 'dispose', onMaterialDispose ); + + } else if ( program.code !== code ) { + + // changed glsl or parameters + releaseMaterialProgramReference( material ); + + } else if ( lightsHash.stateID !== lightsStateHash.stateID || + lightsHash.directionalLength !== lightsStateHash.directionalLength || + lightsHash.pointLength !== lightsStateHash.pointLength || + lightsHash.spotLength !== lightsStateHash.spotLength || + lightsHash.rectAreaLength !== lightsStateHash.rectAreaLength || + lightsHash.hemiLength !== lightsStateHash.hemiLength || + lightsHash.shadowsLength !== lightsStateHash.shadowsLength ) { + + lightsHash.stateID = lightsStateHash.stateID; + lightsHash.directionalLength = lightsStateHash.directionalLength; + lightsHash.pointLength = lightsStateHash.pointLength; + lightsHash.spotLength = lightsStateHash.spotLength; + lightsHash.rectAreaLength = lightsStateHash.rectAreaLength; + lightsHash.hemiLength = lightsStateHash.hemiLength; + lightsHash.shadowsLength = lightsStateHash.shadowsLength; + + programChange = false; + + } else if ( parameters.shaderID !== undefined ) { + + // same glsl and uniform list + return; + + } else { + + // only rebuild uniform list + programChange = false; + + } + + if ( programChange ) { + + if ( parameters.shaderID ) { + + var shader = ShaderLib[ parameters.shaderID ]; + + materialProperties.shader = { + name: material.type, + uniforms: UniformsUtils.clone( shader.uniforms ), + vertexShader: shader.vertexShader, + fragmentShader: shader.fragmentShader + }; + + } else { + + materialProperties.shader = { + name: material.type, + uniforms: material.uniforms, + vertexShader: material.vertexShader, + fragmentShader: material.fragmentShader + }; + + } + + material.onBeforeCompile( materialProperties.shader, _this ); + + // Computing code again as onBeforeCompile may have changed the shaders + code = programCache.getProgramCode( material, parameters ); + + program = programCache.acquireProgram( material, materialProperties.shader, parameters, code ); + + materialProperties.program = program; + material.program = program; + + } + + var programAttributes = program.getAttributes(); + + if ( material.morphTargets ) { + + material.numSupportedMorphTargets = 0; + + for ( var i = 0; i < _this.maxMorphTargets; i ++ ) { + + if ( programAttributes[ 'morphTarget' + i ] >= 0 ) { + + material.numSupportedMorphTargets ++; + + } + + } + + } + + if ( material.morphNormals ) { + + material.numSupportedMorphNormals = 0; + + for ( var i = 0; i < _this.maxMorphNormals; i ++ ) { + + if ( programAttributes[ 'morphNormal' + i ] >= 0 ) { + + material.numSupportedMorphNormals ++; + + } + + } + + } + + var uniforms = materialProperties.shader.uniforms; + + if ( ! material.isShaderMaterial && + ! material.isRawShaderMaterial || + material.clipping === true ) { + + materialProperties.numClippingPlanes = _clipping.numPlanes; + materialProperties.numIntersection = _clipping.numIntersection; + uniforms.clippingPlanes = _clipping.uniform; + + } + + materialProperties.fog = fog; + + // store the light setup it was created for + if ( lightsHash === undefined ) { + + materialProperties.lightsHash = lightsHash = {}; + + } + + lightsHash.stateID = lightsStateHash.stateID; + lightsHash.directionalLength = lightsStateHash.directionalLength; + lightsHash.pointLength = lightsStateHash.pointLength; + lightsHash.spotLength = lightsStateHash.spotLength; + lightsHash.rectAreaLength = lightsStateHash.rectAreaLength; + lightsHash.hemiLength = lightsStateHash.hemiLength; + lightsHash.shadowsLength = lightsStateHash.shadowsLength; + + if ( material.lights ) { + + // wire up the material to this renderer's lighting state + + uniforms.ambientLightColor.value = lights.state.ambient; + uniforms.directionalLights.value = lights.state.directional; + uniforms.spotLights.value = lights.state.spot; + uniforms.rectAreaLights.value = lights.state.rectArea; + uniforms.pointLights.value = lights.state.point; + uniforms.hemisphereLights.value = lights.state.hemi; + + uniforms.directionalShadowMap.value = lights.state.directionalShadowMap; + uniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix; + uniforms.spotShadowMap.value = lights.state.spotShadowMap; + uniforms.spotShadowMatrix.value = lights.state.spotShadowMatrix; + uniforms.pointShadowMap.value = lights.state.pointShadowMap; + uniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix; + // TODO (abelnation): add area lights shadow info to uniforms + + } + + var progUniforms = materialProperties.program.getUniforms(), + uniformsList = + WebGLUniforms.seqWithValue( progUniforms.seq, uniforms ); + + materialProperties.uniformsList = uniformsList; + + } + + function setProgram( camera, fog, material, object ) { + + _usedTextureUnits = 0; + + var materialProperties = properties.get( material ); + var lights = currentRenderState.state.lights; + + var lightsHash = materialProperties.lightsHash; + var lightsStateHash = lights.state.hash; + + if ( _clippingEnabled ) { + + if ( _localClippingEnabled || camera !== _currentCamera ) { + + var useCache = + camera === _currentCamera && + material.id === _currentMaterialId; + + // we might want to call this function with some ClippingGroup + // object instead of the material, once it becomes feasible + // (#8465, #8379) + _clipping.setState( + material.clippingPlanes, material.clipIntersection, material.clipShadows, + camera, materialProperties, useCache ); + + } + + } + + if ( material.needsUpdate === false ) { + + if ( materialProperties.program === undefined ) { + + material.needsUpdate = true; + + } else if ( material.fog && materialProperties.fog !== fog ) { + + material.needsUpdate = true; + + } else if ( material.lights && ( lightsHash.stateID !== lightsStateHash.stateID || + lightsHash.directionalLength !== lightsStateHash.directionalLength || + lightsHash.pointLength !== lightsStateHash.pointLength || + lightsHash.spotLength !== lightsStateHash.spotLength || + lightsHash.rectAreaLength !== lightsStateHash.rectAreaLength || + lightsHash.hemiLength !== lightsStateHash.hemiLength || + lightsHash.shadowsLength !== lightsStateHash.shadowsLength ) ) { + + material.needsUpdate = true; + + } else if ( materialProperties.numClippingPlanes !== undefined && + ( materialProperties.numClippingPlanes !== _clipping.numPlanes || + materialProperties.numIntersection !== _clipping.numIntersection ) ) { + + material.needsUpdate = true; + + } + + } + + if ( material.needsUpdate ) { + + initMaterial( material, fog, object ); + material.needsUpdate = false; + + } + + var refreshProgram = false; + var refreshMaterial = false; + var refreshLights = false; + + var program = materialProperties.program, + p_uniforms = program.getUniforms(), + m_uniforms = materialProperties.shader.uniforms; + + if ( state.useProgram( program.program ) ) { + + refreshProgram = true; + refreshMaterial = true; + refreshLights = true; + + } + + if ( material.id !== _currentMaterialId ) { + + _currentMaterialId = material.id; + + refreshMaterial = true; + + } + + if ( refreshProgram || _currentCamera !== camera ) { + + p_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix ); + + if ( capabilities.logarithmicDepthBuffer ) { + + p_uniforms.setValue( _gl, 'logDepthBufFC', + 2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) ); + + } + + if ( _currentCamera !== camera ) { + + _currentCamera = camera; + + // lighting uniforms depend on the camera so enforce an update + // now, in case this material supports lights - or later, when + // the next material that does gets activated: + + refreshMaterial = true; // set to true on material change + refreshLights = true; // remains set until update done + + } + + // load material specific uniforms + // (shader material also gets them for the sake of genericity) + + if ( material.isShaderMaterial || + material.isMeshPhongMaterial || + material.isMeshStandardMaterial || + material.envMap ) { + + var uCamPos = p_uniforms.map.cameraPosition; + + if ( uCamPos !== undefined ) { + + uCamPos.setValue( _gl, + _vector3.setFromMatrixPosition( camera.matrixWorld ) ); + + } + + } + + if ( material.isMeshPhongMaterial || + material.isMeshLambertMaterial || + material.isMeshBasicMaterial || + material.isMeshStandardMaterial || + material.isShaderMaterial || + material.skinning ) { + + p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse ); + + } + + } + + // skinning uniforms must be set even if material didn't change + // auto-setting of texture unit for bone texture must go before other textures + // not sure why, but otherwise weird things happen + + if ( material.skinning ) { + + p_uniforms.setOptional( _gl, object, 'bindMatrix' ); + p_uniforms.setOptional( _gl, object, 'bindMatrixInverse' ); + + var skeleton = object.skeleton; + + if ( skeleton ) { + + var bones = skeleton.bones; + + if ( capabilities.floatVertexTextures ) { + + if ( skeleton.boneTexture === undefined ) { + + // layout (1 matrix = 4 pixels) + // RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4) + // with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8) + // 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16) + // 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32) + // 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64) + + + var size = Math.sqrt( bones.length * 4 ); // 4 pixels needed for 1 matrix + size = _Math.ceilPowerOfTwo( size ); + size = Math.max( size, 4 ); + + var boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel + boneMatrices.set( skeleton.boneMatrices ); // copy current values + + var boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType ); + boneTexture.needsUpdate = true; + + skeleton.boneMatrices = boneMatrices; + skeleton.boneTexture = boneTexture; + skeleton.boneTextureSize = size; + + } + + p_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture ); + p_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize ); + + } else { + + p_uniforms.setOptional( _gl, skeleton, 'boneMatrices' ); + + } + + } + + } + + if ( refreshMaterial ) { + + p_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure ); + p_uniforms.setValue( _gl, 'toneMappingWhitePoint', _this.toneMappingWhitePoint ); + + if ( material.lights ) { + + // the current material requires lighting info + + // note: all lighting uniforms are always set correctly + // they simply reference the renderer's state for their + // values + // + // use the current material's .needsUpdate flags to set + // the GL state when required + + markUniformsLightsNeedsUpdate( m_uniforms, refreshLights ); + + } + + // refresh uniforms common to several materials + + if ( fog && material.fog ) { + + refreshUniformsFog( m_uniforms, fog ); + + } + + if ( material.isMeshBasicMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + } else if ( material.isMeshLambertMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + refreshUniformsLambert( m_uniforms, material ); + + } else if ( material.isMeshPhongMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + if ( material.isMeshToonMaterial ) { + + refreshUniformsToon( m_uniforms, material ); + + } else { + + refreshUniformsPhong( m_uniforms, material ); + + } + + } else if ( material.isMeshStandardMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + if ( material.isMeshPhysicalMaterial ) { + + refreshUniformsPhysical( m_uniforms, material ); + + } else { + + refreshUniformsStandard( m_uniforms, material ); + + } + + } else if ( material.isMeshMatcapMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + refreshUniformsMatcap( m_uniforms, material ); + + } else if ( material.isMeshDepthMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + refreshUniformsDepth( m_uniforms, material ); + + } else if ( material.isMeshDistanceMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + refreshUniformsDistance( m_uniforms, material ); + + } else if ( material.isMeshNormalMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + refreshUniformsNormal( m_uniforms, material ); + + } else if ( material.isLineBasicMaterial ) { + + refreshUniformsLine( m_uniforms, material ); + + if ( material.isLineDashedMaterial ) { + + refreshUniformsDash( m_uniforms, material ); + + } + + } else if ( material.isPointsMaterial ) { + + refreshUniformsPoints( m_uniforms, material ); + + } else if ( material.isSpriteMaterial ) { + + refreshUniformsSprites( m_uniforms, material ); + + } else if ( material.isShadowMaterial ) { + + m_uniforms.color.value = material.color; + m_uniforms.opacity.value = material.opacity; + + } + + // RectAreaLight Texture + // TODO (mrdoob): Find a nicer implementation + + if ( m_uniforms.ltc_1 !== undefined ) m_uniforms.ltc_1.value = UniformsLib.LTC_1; + if ( m_uniforms.ltc_2 !== undefined ) m_uniforms.ltc_2.value = UniformsLib.LTC_2; + + WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, _this ); + + } + + if ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) { + + WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, _this ); + material.uniformsNeedUpdate = false; + + } + + if ( material.isSpriteMaterial ) { + + p_uniforms.setValue( _gl, 'center', object.center ); + + } + + // common matrices + + p_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix ); + p_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix ); + p_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld ); + + return program; + + } + + // Uniforms (refresh uniforms objects) + + function refreshUniformsCommon( uniforms, material ) { + + uniforms.opacity.value = material.opacity; + + if ( material.color ) { + + uniforms.diffuse.value = material.color; + + } + + if ( material.emissive ) { + + uniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity ); + + } + + if ( material.map ) { + + uniforms.map.value = material.map; + + } + + if ( material.alphaMap ) { + + uniforms.alphaMap.value = material.alphaMap; + + } + + if ( material.specularMap ) { + + uniforms.specularMap.value = material.specularMap; + + } + + if ( material.envMap ) { + + uniforms.envMap.value = material.envMap; + + // don't flip CubeTexture envMaps, flip everything else: + // WebGLRenderTargetCube will be flipped for backwards compatibility + // WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture + // this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future + uniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1; + + uniforms.reflectivity.value = material.reflectivity; + uniforms.refractionRatio.value = material.refractionRatio; + + uniforms.maxMipLevel.value = properties.get( material.envMap ).__maxMipLevel; + + } + + if ( material.lightMap ) { + + uniforms.lightMap.value = material.lightMap; + uniforms.lightMapIntensity.value = material.lightMapIntensity; + + } + + if ( material.aoMap ) { + + uniforms.aoMap.value = material.aoMap; + uniforms.aoMapIntensity.value = material.aoMapIntensity; + + } + + // uv repeat and offset setting priorities + // 1. color map + // 2. specular map + // 3. normal map + // 4. bump map + // 5. alpha map + // 6. emissive map + + var uvScaleMap; + + if ( material.map ) { + + uvScaleMap = material.map; + + } else if ( material.specularMap ) { + + uvScaleMap = material.specularMap; + + } else if ( material.displacementMap ) { + + uvScaleMap = material.displacementMap; + + } else if ( material.normalMap ) { + + uvScaleMap = material.normalMap; + + } else if ( material.bumpMap ) { + + uvScaleMap = material.bumpMap; + + } else if ( material.roughnessMap ) { + + uvScaleMap = material.roughnessMap; + + } else if ( material.metalnessMap ) { + + uvScaleMap = material.metalnessMap; + + } else if ( material.alphaMap ) { + + uvScaleMap = material.alphaMap; + + } else if ( material.emissiveMap ) { + + uvScaleMap = material.emissiveMap; + + } + + if ( uvScaleMap !== undefined ) { + + // backwards compatibility + if ( uvScaleMap.isWebGLRenderTarget ) { + + uvScaleMap = uvScaleMap.texture; + + } + + if ( uvScaleMap.matrixAutoUpdate === true ) { + + uvScaleMap.updateMatrix(); + + } + + uniforms.uvTransform.value.copy( uvScaleMap.matrix ); + + } + + } + + function refreshUniformsLine( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + + } + + function refreshUniformsDash( uniforms, material ) { + + uniforms.dashSize.value = material.dashSize; + uniforms.totalSize.value = material.dashSize + material.gapSize; + uniforms.scale.value = material.scale; + + } + + function refreshUniformsPoints( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + uniforms.size.value = material.size * _pixelRatio; + uniforms.scale.value = _height * 0.5; + + uniforms.map.value = material.map; + + if ( material.map !== null ) { + + if ( material.map.matrixAutoUpdate === true ) { + + material.map.updateMatrix(); + + } + + uniforms.uvTransform.value.copy( material.map.matrix ); + + } + + } + + function refreshUniformsSprites( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + uniforms.rotation.value = material.rotation; + uniforms.map.value = material.map; + + if ( material.map !== null ) { + + if ( material.map.matrixAutoUpdate === true ) { + + material.map.updateMatrix(); + + } + + uniforms.uvTransform.value.copy( material.map.matrix ); + + } + + } + + function refreshUniformsFog( uniforms, fog ) { + + uniforms.fogColor.value = fog.color; + + if ( fog.isFog ) { + + uniforms.fogNear.value = fog.near; + uniforms.fogFar.value = fog.far; + + } else if ( fog.isFogExp2 ) { + + uniforms.fogDensity.value = fog.density; + + } + + } + + function refreshUniformsLambert( uniforms, material ) { + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + } + + function refreshUniformsPhong( uniforms, material ) { + + uniforms.specular.value = material.specular; + uniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 ) + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + if ( material.side === BackSide ) uniforms.normalScale.value.negate(); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsToon( uniforms, material ) { + + refreshUniformsPhong( uniforms, material ); + + if ( material.gradientMap ) { + + uniforms.gradientMap.value = material.gradientMap; + + } + + } + + function refreshUniformsStandard( uniforms, material ) { + + uniforms.roughness.value = material.roughness; + uniforms.metalness.value = material.metalness; + + if ( material.roughnessMap ) { + + uniforms.roughnessMap.value = material.roughnessMap; + + } + + if ( material.metalnessMap ) { + + uniforms.metalnessMap.value = material.metalnessMap; + + } + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + if ( material.side === BackSide ) uniforms.normalScale.value.negate(); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + if ( material.envMap ) { + + //uniforms.envMap.value = material.envMap; // part of uniforms common + uniforms.envMapIntensity.value = material.envMapIntensity; + + } + + } + + function refreshUniformsPhysical( uniforms, material ) { + + refreshUniformsStandard( uniforms, material ); + + uniforms.reflectivity.value = material.reflectivity; // also part of uniforms common + + uniforms.clearCoat.value = material.clearCoat; + uniforms.clearCoatRoughness.value = material.clearCoatRoughness; + + } + + function refreshUniformsMatcap( uniforms, material ) { + + if ( material.matcap ) { + + uniforms.matcap.value = material.matcap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + if ( material.side === BackSide ) uniforms.normalScale.value.negate(); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsDepth( uniforms, material ) { + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsDistance( uniforms, material ) { + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + uniforms.referencePosition.value.copy( material.referencePosition ); + uniforms.nearDistance.value = material.nearDistance; + uniforms.farDistance.value = material.farDistance; + + } + + function refreshUniformsNormal( uniforms, material ) { + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + if ( material.side === BackSide ) uniforms.normalScale.value.negate(); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + // If uniforms are marked as clean, they don't need to be loaded to the GPU. + + function markUniformsLightsNeedsUpdate( uniforms, value ) { + + uniforms.ambientLightColor.needsUpdate = value; + + uniforms.directionalLights.needsUpdate = value; + uniforms.pointLights.needsUpdate = value; + uniforms.spotLights.needsUpdate = value; + uniforms.rectAreaLights.needsUpdate = value; + uniforms.hemisphereLights.needsUpdate = value; + + } + + // Textures + + function allocTextureUnit() { + + var textureUnit = _usedTextureUnits; + + if ( textureUnit >= capabilities.maxTextures ) { + + console.warn( 'THREE.WebGLRenderer: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures ); + + } + + _usedTextureUnits += 1; + + return textureUnit; + + } + + this.allocTextureUnit = allocTextureUnit; + + // this.setTexture2D = setTexture2D; + this.setTexture2D = ( function () { + + var warned = false; + + // backwards compatibility: peel texture.texture + return function setTexture2D( texture, slot ) { + + if ( texture && texture.isWebGLRenderTarget ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead." ); + warned = true; + + } + + texture = texture.texture; + + } + + textures.setTexture2D( texture, slot ); + + }; + + }() ); + + this.setTexture3D = ( function () { + + // backwards compatibility: peel texture.texture + return function setTexture3D( texture, slot ) { + + textures.setTexture3D( texture, slot ); + + }; + + }() ); + + this.setTexture = ( function () { + + var warned = false; + + return function setTexture( texture, slot ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead." ); + warned = true; + + } + + textures.setTexture2D( texture, slot ); + + }; + + }() ); + + this.setTextureCube = ( function () { + + var warned = false; + + return function setTextureCube( texture, slot ) { + + // backwards compatibility: peel texture.texture + if ( texture && texture.isWebGLRenderTargetCube ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead." ); + warned = true; + + } + + texture = texture.texture; + + } + + // currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture + // TODO: unify these code paths + if ( ( texture && texture.isCubeTexture ) || + ( Array.isArray( texture.image ) && texture.image.length === 6 ) ) { + + // CompressedTexture can have Array in image :/ + + // this function alone should take care of cube textures + textures.setTextureCube( texture, slot ); + + } else { + + // assumed: texture property of THREE.WebGLRenderTargetCube + + textures.setTextureCubeDynamic( texture, slot ); + + } + + }; + + }() ); + + // + + this.setFramebuffer = function ( value ) { + + _framebuffer = value; + + }; + + this.getRenderTarget = function () { + + return _currentRenderTarget; + + }; + + this.setRenderTarget = function ( renderTarget ) { + + _currentRenderTarget = renderTarget; + + if ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) { + + textures.setupRenderTarget( renderTarget ); + + } + + var framebuffer = _framebuffer; + var isCube = false; + + if ( renderTarget ) { + + var __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer; + + if ( renderTarget.isWebGLRenderTargetCube ) { + + framebuffer = __webglFramebuffer[ renderTarget.activeCubeFace ]; + isCube = true; + + } else { + + framebuffer = __webglFramebuffer; + + } + + _currentViewport.copy( renderTarget.viewport ); + _currentScissor.copy( renderTarget.scissor ); + _currentScissorTest = renderTarget.scissorTest; + + } else { + + _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ); + _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ); + _currentScissorTest = _scissorTest; + + } + + if ( _currentFramebuffer !== framebuffer ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + _currentFramebuffer = framebuffer; + + } + + state.viewport( _currentViewport ); + state.scissor( _currentScissor ); + state.setScissorTest( _currentScissorTest ); + + if ( isCube ) { + + var textureProperties = properties.get( renderTarget.texture ); + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel ); + + } + + }; + + this.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) { + + if ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' ); + return; + + } + + var framebuffer = properties.get( renderTarget ).__webglFramebuffer; + + if ( framebuffer ) { + + var restore = false; + + if ( framebuffer !== _currentFramebuffer ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + restore = true; + + } + + try { + + var texture = renderTarget.texture; + var textureFormat = texture.format; + var textureType = texture.type; + + if ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' ); + return; + + } + + if ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513) + ! ( textureType === FloatType && ( capabilities.isWebGL2 || extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox + ! ( textureType === HalfFloatType && ( capabilities.isWebGL2 ? extensions.get( 'EXT_color_buffer_float' ) : extensions.get( 'EXT_color_buffer_half_float' ) ) ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' ); + return; + + } + + if ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) { + + // the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604) + + if ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) { + + _gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer ); + + } + + } else { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' ); + + } + + } finally { + + if ( restore ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer ); + + } + + } + + } + + }; + + this.copyFramebufferToTexture = function ( position, texture, level ) { + + var width = texture.image.width; + var height = texture.image.height; + var glFormat = utils.convert( texture.format ); + + this.setTexture2D( texture, 0 ); + + _gl.copyTexImage2D( _gl.TEXTURE_2D, level || 0, glFormat, position.x, position.y, width, height, 0 ); + + }; + + this.copyTextureToTexture = function ( position, srcTexture, dstTexture, level ) { + + var width = srcTexture.image.width; + var height = srcTexture.image.height; + var glFormat = utils.convert( dstTexture.format ); + var glType = utils.convert( dstTexture.type ); + + this.setTexture2D( dstTexture, 0 ); + + if ( srcTexture.isDataTexture ) { + + _gl.texSubImage2D( _gl.TEXTURE_2D, level || 0, position.x, position.y, width, height, glFormat, glType, srcTexture.image.data ); + + } else { + + _gl.texSubImage2D( _gl.TEXTURE_2D, level || 0, position.x, position.y, glFormat, glType, srcTexture.image ); + + } + + }; + +} + + +export { WebGLRenderer }; diff --git a/lib/renderers/shaders/ShaderChunk.js b/lib/renderers/shaders/ShaderChunk.js new file mode 100644 index 0000000..725f7a8 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk.js @@ -0,0 +1,243 @@ +import alphamap_fragment from './ShaderChunk/alphamap_fragment.glsl'; +import alphamap_pars_fragment from './ShaderChunk/alphamap_pars_fragment.glsl'; +import alphatest_fragment from './ShaderChunk/alphatest_fragment.glsl'; +import aomap_fragment from './ShaderChunk/aomap_fragment.glsl'; +import aomap_pars_fragment from './ShaderChunk/aomap_pars_fragment.glsl'; +import begin_vertex from './ShaderChunk/begin_vertex.glsl'; +import beginnormal_vertex from './ShaderChunk/beginnormal_vertex.glsl'; +import bsdfs from './ShaderChunk/bsdfs.glsl'; +import bumpmap_pars_fragment from './ShaderChunk/bumpmap_pars_fragment.glsl'; +import clipping_planes_fragment from './ShaderChunk/clipping_planes_fragment.glsl'; +import clipping_planes_pars_fragment from './ShaderChunk/clipping_planes_pars_fragment.glsl'; +import clipping_planes_pars_vertex from './ShaderChunk/clipping_planes_pars_vertex.glsl'; +import clipping_planes_vertex from './ShaderChunk/clipping_planes_vertex.glsl'; +import color_fragment from './ShaderChunk/color_fragment.glsl'; +import color_pars_fragment from './ShaderChunk/color_pars_fragment.glsl'; +import color_pars_vertex from './ShaderChunk/color_pars_vertex.glsl'; +import color_vertex from './ShaderChunk/color_vertex.glsl'; +import common from './ShaderChunk/common.glsl'; +import cube_uv_reflection_fragment from './ShaderChunk/cube_uv_reflection_fragment.glsl'; +import defaultnormal_vertex from './ShaderChunk/defaultnormal_vertex.glsl'; +import displacementmap_pars_vertex from './ShaderChunk/displacementmap_pars_vertex.glsl'; +import displacementmap_vertex from './ShaderChunk/displacementmap_vertex.glsl'; +import emissivemap_fragment from './ShaderChunk/emissivemap_fragment.glsl'; +import emissivemap_pars_fragment from './ShaderChunk/emissivemap_pars_fragment.glsl'; +import encodings_fragment from './ShaderChunk/encodings_fragment.glsl'; +import encodings_pars_fragment from './ShaderChunk/encodings_pars_fragment.glsl'; +import envmap_fragment from './ShaderChunk/envmap_fragment.glsl'; +import envmap_pars_fragment from './ShaderChunk/envmap_pars_fragment.glsl'; +import envmap_pars_vertex from './ShaderChunk/envmap_pars_vertex.glsl'; +import envmap_vertex from './ShaderChunk/envmap_vertex.glsl'; +import fog_vertex from './ShaderChunk/fog_vertex.glsl'; +import fog_pars_vertex from './ShaderChunk/fog_pars_vertex.glsl'; +import fog_fragment from './ShaderChunk/fog_fragment.glsl'; +import fog_pars_fragment from './ShaderChunk/fog_pars_fragment.glsl'; +import gradientmap_pars_fragment from './ShaderChunk/gradientmap_pars_fragment.glsl'; +import lightmap_fragment from './ShaderChunk/lightmap_fragment.glsl'; +import lightmap_pars_fragment from './ShaderChunk/lightmap_pars_fragment.glsl'; +import lights_lambert_vertex from './ShaderChunk/lights_lambert_vertex.glsl'; +import lights_pars_begin from './ShaderChunk/lights_pars_begin.glsl'; +import envmap_physical_pars_fragment from './ShaderChunk/envmap_physical_pars_fragment.glsl'; +import lights_phong_fragment from './ShaderChunk/lights_phong_fragment.glsl'; +import lights_phong_pars_fragment from './ShaderChunk/lights_phong_pars_fragment.glsl'; +import lights_physical_fragment from './ShaderChunk/lights_physical_fragment.glsl'; +import lights_physical_pars_fragment from './ShaderChunk/lights_physical_pars_fragment.glsl'; +import lights_fragment_begin from './ShaderChunk/lights_fragment_begin.glsl'; +import lights_fragment_maps from './ShaderChunk/lights_fragment_maps.glsl'; +import lights_fragment_end from './ShaderChunk/lights_fragment_end.glsl'; +import logdepthbuf_fragment from './ShaderChunk/logdepthbuf_fragment.glsl'; +import logdepthbuf_pars_fragment from './ShaderChunk/logdepthbuf_pars_fragment.glsl'; +import logdepthbuf_pars_vertex from './ShaderChunk/logdepthbuf_pars_vertex.glsl'; +import logdepthbuf_vertex from './ShaderChunk/logdepthbuf_vertex.glsl'; +import map_fragment from './ShaderChunk/map_fragment.glsl'; +import map_pars_fragment from './ShaderChunk/map_pars_fragment.glsl'; +import map_particle_fragment from './ShaderChunk/map_particle_fragment.glsl'; +import map_particle_pars_fragment from './ShaderChunk/map_particle_pars_fragment.glsl'; +import metalnessmap_fragment from './ShaderChunk/metalnessmap_fragment.glsl'; +import metalnessmap_pars_fragment from './ShaderChunk/metalnessmap_pars_fragment.glsl'; +import morphnormal_vertex from './ShaderChunk/morphnormal_vertex.glsl'; +import morphtarget_pars_vertex from './ShaderChunk/morphtarget_pars_vertex.glsl'; +import morphtarget_vertex from './ShaderChunk/morphtarget_vertex.glsl'; +import normal_fragment_begin from './ShaderChunk/normal_fragment_begin.glsl'; +import normal_fragment_maps from './ShaderChunk/normal_fragment_maps.glsl'; +import normalmap_pars_fragment from './ShaderChunk/normalmap_pars_fragment.glsl'; +import packing from './ShaderChunk/packing.glsl'; +import premultiplied_alpha_fragment from './ShaderChunk/premultiplied_alpha_fragment.glsl'; +import project_vertex from './ShaderChunk/project_vertex.glsl'; +import dithering_fragment from './ShaderChunk/dithering_fragment.glsl'; +import dithering_pars_fragment from './ShaderChunk/dithering_pars_fragment.glsl'; +import roughnessmap_fragment from './ShaderChunk/roughnessmap_fragment.glsl'; +import roughnessmap_pars_fragment from './ShaderChunk/roughnessmap_pars_fragment.glsl'; +import shadowmap_pars_fragment from './ShaderChunk/shadowmap_pars_fragment.glsl'; +import shadowmap_pars_vertex from './ShaderChunk/shadowmap_pars_vertex.glsl'; +import shadowmap_vertex from './ShaderChunk/shadowmap_vertex.glsl'; +import shadowmask_pars_fragment from './ShaderChunk/shadowmask_pars_fragment.glsl'; +import skinbase_vertex from './ShaderChunk/skinbase_vertex.glsl'; +import skinning_pars_vertex from './ShaderChunk/skinning_pars_vertex.glsl'; +import skinning_vertex from './ShaderChunk/skinning_vertex.glsl'; +import skinnormal_vertex from './ShaderChunk/skinnormal_vertex.glsl'; +import specularmap_fragment from './ShaderChunk/specularmap_fragment.glsl'; +import specularmap_pars_fragment from './ShaderChunk/specularmap_pars_fragment.glsl'; +import tonemapping_fragment from './ShaderChunk/tonemapping_fragment.glsl'; +import tonemapping_pars_fragment from './ShaderChunk/tonemapping_pars_fragment.glsl'; +import uv_pars_fragment from './ShaderChunk/uv_pars_fragment.glsl'; +import uv_pars_vertex from './ShaderChunk/uv_pars_vertex.glsl'; +import uv_vertex from './ShaderChunk/uv_vertex.glsl'; +import uv2_pars_fragment from './ShaderChunk/uv2_pars_fragment.glsl'; +import uv2_pars_vertex from './ShaderChunk/uv2_pars_vertex.glsl'; +import uv2_vertex from './ShaderChunk/uv2_vertex.glsl'; +import worldpos_vertex from './ShaderChunk/worldpos_vertex.glsl'; + +import background_frag from './ShaderLib/background_frag.glsl'; +import background_vert from './ShaderLib/background_vert.glsl'; +import cube_frag from './ShaderLib/cube_frag.glsl'; +import cube_vert from './ShaderLib/cube_vert.glsl'; +import depth_frag from './ShaderLib/depth_frag.glsl'; +import depth_vert from './ShaderLib/depth_vert.glsl'; +import distanceRGBA_frag from './ShaderLib/distanceRGBA_frag.glsl'; +import distanceRGBA_vert from './ShaderLib/distanceRGBA_vert.glsl'; +import equirect_frag from './ShaderLib/equirect_frag.glsl'; +import equirect_vert from './ShaderLib/equirect_vert.glsl'; +import linedashed_frag from './ShaderLib/linedashed_frag.glsl'; +import linedashed_vert from './ShaderLib/linedashed_vert.glsl'; +import meshbasic_frag from './ShaderLib/meshbasic_frag.glsl'; +import meshbasic_vert from './ShaderLib/meshbasic_vert.glsl'; +import meshlambert_frag from './ShaderLib/meshlambert_frag.glsl'; +import meshlambert_vert from './ShaderLib/meshlambert_vert.glsl'; +import meshmatcap_frag from './ShaderLib/meshmatcap_frag.glsl'; +import meshmatcap_vert from './ShaderLib/meshmatcap_vert.glsl'; +import meshphong_frag from './ShaderLib/meshphong_frag.glsl'; +import meshphong_vert from './ShaderLib/meshphong_vert.glsl'; +import meshphysical_frag from './ShaderLib/meshphysical_frag.glsl'; +import meshphysical_vert from './ShaderLib/meshphysical_vert.glsl'; +import normal_frag from './ShaderLib/normal_frag.glsl'; +import normal_vert from './ShaderLib/normal_vert.glsl'; +import points_frag from './ShaderLib/points_frag.glsl'; +import points_vert from './ShaderLib/points_vert.glsl'; +import shadow_frag from './ShaderLib/shadow_frag.glsl'; +import shadow_vert from './ShaderLib/shadow_vert.glsl'; +import sprite_frag from './ShaderLib/sprite_frag.glsl'; +import sprite_vert from './ShaderLib/sprite_vert.glsl'; + +export var ShaderChunk = { + alphamap_fragment: alphamap_fragment, + alphamap_pars_fragment: alphamap_pars_fragment, + alphatest_fragment: alphatest_fragment, + aomap_fragment: aomap_fragment, + aomap_pars_fragment: aomap_pars_fragment, + begin_vertex: begin_vertex, + beginnormal_vertex: beginnormal_vertex, + bsdfs: bsdfs, + bumpmap_pars_fragment: bumpmap_pars_fragment, + clipping_planes_fragment: clipping_planes_fragment, + clipping_planes_pars_fragment: clipping_planes_pars_fragment, + clipping_planes_pars_vertex: clipping_planes_pars_vertex, + clipping_planes_vertex: clipping_planes_vertex, + color_fragment: color_fragment, + color_pars_fragment: color_pars_fragment, + color_pars_vertex: color_pars_vertex, + color_vertex: color_vertex, + common: common, + cube_uv_reflection_fragment: cube_uv_reflection_fragment, + defaultnormal_vertex: defaultnormal_vertex, + displacementmap_pars_vertex: displacementmap_pars_vertex, + displacementmap_vertex: displacementmap_vertex, + emissivemap_fragment: emissivemap_fragment, + emissivemap_pars_fragment: emissivemap_pars_fragment, + encodings_fragment: encodings_fragment, + encodings_pars_fragment: encodings_pars_fragment, + envmap_fragment: envmap_fragment, + envmap_pars_fragment: envmap_pars_fragment, + envmap_pars_vertex: envmap_pars_vertex, + envmap_physical_pars_fragment: envmap_physical_pars_fragment, + envmap_vertex: envmap_vertex, + fog_vertex: fog_vertex, + fog_pars_vertex: fog_pars_vertex, + fog_fragment: fog_fragment, + fog_pars_fragment: fog_pars_fragment, + gradientmap_pars_fragment: gradientmap_pars_fragment, + lightmap_fragment: lightmap_fragment, + lightmap_pars_fragment: lightmap_pars_fragment, + lights_lambert_vertex: lights_lambert_vertex, + lights_pars_begin: lights_pars_begin, + lights_phong_fragment: lights_phong_fragment, + lights_phong_pars_fragment: lights_phong_pars_fragment, + lights_physical_fragment: lights_physical_fragment, + lights_physical_pars_fragment: lights_physical_pars_fragment, + lights_fragment_begin: lights_fragment_begin, + lights_fragment_maps: lights_fragment_maps, + lights_fragment_end: lights_fragment_end, + logdepthbuf_fragment: logdepthbuf_fragment, + logdepthbuf_pars_fragment: logdepthbuf_pars_fragment, + logdepthbuf_pars_vertex: logdepthbuf_pars_vertex, + logdepthbuf_vertex: logdepthbuf_vertex, + map_fragment: map_fragment, + map_pars_fragment: map_pars_fragment, + map_particle_fragment: map_particle_fragment, + map_particle_pars_fragment: map_particle_pars_fragment, + metalnessmap_fragment: metalnessmap_fragment, + metalnessmap_pars_fragment: metalnessmap_pars_fragment, + morphnormal_vertex: morphnormal_vertex, + morphtarget_pars_vertex: morphtarget_pars_vertex, + morphtarget_vertex: morphtarget_vertex, + normal_fragment_begin: normal_fragment_begin, + normal_fragment_maps: normal_fragment_maps, + normalmap_pars_fragment: normalmap_pars_fragment, + packing: packing, + premultiplied_alpha_fragment: premultiplied_alpha_fragment, + project_vertex: project_vertex, + dithering_fragment: dithering_fragment, + dithering_pars_fragment: dithering_pars_fragment, + roughnessmap_fragment: roughnessmap_fragment, + roughnessmap_pars_fragment: roughnessmap_pars_fragment, + shadowmap_pars_fragment: shadowmap_pars_fragment, + shadowmap_pars_vertex: shadowmap_pars_vertex, + shadowmap_vertex: shadowmap_vertex, + shadowmask_pars_fragment: shadowmask_pars_fragment, + skinbase_vertex: skinbase_vertex, + skinning_pars_vertex: skinning_pars_vertex, + skinning_vertex: skinning_vertex, + skinnormal_vertex: skinnormal_vertex, + specularmap_fragment: specularmap_fragment, + specularmap_pars_fragment: specularmap_pars_fragment, + tonemapping_fragment: tonemapping_fragment, + tonemapping_pars_fragment: tonemapping_pars_fragment, + uv_pars_fragment: uv_pars_fragment, + uv_pars_vertex: uv_pars_vertex, + uv_vertex: uv_vertex, + uv2_pars_fragment: uv2_pars_fragment, + uv2_pars_vertex: uv2_pars_vertex, + uv2_vertex: uv2_vertex, + worldpos_vertex: worldpos_vertex, + + background_frag: background_frag, + background_vert: background_vert, + cube_frag: cube_frag, + cube_vert: cube_vert, + depth_frag: depth_frag, + depth_vert: depth_vert, + distanceRGBA_frag: distanceRGBA_frag, + distanceRGBA_vert: distanceRGBA_vert, + equirect_frag: equirect_frag, + equirect_vert: equirect_vert, + linedashed_frag: linedashed_frag, + linedashed_vert: linedashed_vert, + meshbasic_frag: meshbasic_frag, + meshbasic_vert: meshbasic_vert, + meshlambert_frag: meshlambert_frag, + meshlambert_vert: meshlambert_vert, + meshmatcap_frag: meshmatcap_frag, + meshmatcap_vert: meshmatcap_vert, + meshphong_frag: meshphong_frag, + meshphong_vert: meshphong_vert, + meshphysical_frag: meshphysical_frag, + meshphysical_vert: meshphysical_vert, + normal_frag: normal_frag, + normal_vert: normal_vert, + points_frag: points_frag, + points_vert: points_vert, + shadow_frag: shadow_frag, + shadow_vert: shadow_vert, + sprite_frag: sprite_frag, + sprite_vert: sprite_vert +}; diff --git a/lib/renderers/shaders/ShaderChunk/alphamap_fragment.glsl b/lib/renderers/shaders/ShaderChunk/alphamap_fragment.glsl new file mode 100644 index 0000000..1aa712e --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/alphamap_fragment.glsl @@ -0,0 +1,5 @@ +#ifdef USE_ALPHAMAP + + diffuseColor.a *= texture2D( alphaMap, vUv ).g; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/alphamap_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/alphamap_pars_fragment.glsl new file mode 100644 index 0000000..4a84b49 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/alphamap_pars_fragment.glsl @@ -0,0 +1,5 @@ +#ifdef USE_ALPHAMAP + + uniform sampler2D alphaMap; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/alphatest_fragment.glsl b/lib/renderers/shaders/ShaderChunk/alphatest_fragment.glsl new file mode 100644 index 0000000..448b2bf --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/alphatest_fragment.glsl @@ -0,0 +1,5 @@ +#ifdef ALPHATEST + + if ( diffuseColor.a < ALPHATEST ) discard; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/aomap_fragment.glsl b/lib/renderers/shaders/ShaderChunk/aomap_fragment.glsl new file mode 100644 index 0000000..4b5df8e --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/aomap_fragment.glsl @@ -0,0 +1,16 @@ +#ifdef USE_AOMAP + + // reads channel R, compatible with a combined OcclusionRoughnessMetallic (RGB) texture + float ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0; + + reflectedLight.indirectDiffuse *= ambientOcclusion; + + #if defined( USE_ENVMAP ) && defined( PHYSICAL ) + + float dotNV = saturate( dot( geometry.normal, geometry.viewDir ) ); + + reflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness ); + + #endif + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/aomap_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/aomap_pars_fragment.glsl new file mode 100644 index 0000000..73277ab --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/aomap_pars_fragment.glsl @@ -0,0 +1,6 @@ +#ifdef USE_AOMAP + + uniform sampler2D aoMap; + uniform float aoMapIntensity; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/begin_vertex.glsl b/lib/renderers/shaders/ShaderChunk/begin_vertex.glsl new file mode 100644 index 0000000..9f681c6 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/begin_vertex.glsl @@ -0,0 +1,2 @@ + +vec3 transformed = vec3( position ); diff --git a/lib/renderers/shaders/ShaderChunk/beginnormal_vertex.glsl b/lib/renderers/shaders/ShaderChunk/beginnormal_vertex.glsl new file mode 100644 index 0000000..f24d6d4 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/beginnormal_vertex.glsl @@ -0,0 +1,2 @@ + +vec3 objectNormal = vec3( normal ); diff --git a/lib/renderers/shaders/ShaderChunk/bsdfs.glsl b/lib/renderers/shaders/ShaderChunk/bsdfs.glsl new file mode 100644 index 0000000..7137ada --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/bsdfs.glsl @@ -0,0 +1,295 @@ +float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) { + +#if defined ( PHYSICALLY_CORRECT_LIGHTS ) + + // based upon Frostbite 3 Moving to Physically-based Rendering + // page 32, equation 26: E[window1] + // https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + // this is intended to be used on spot and point lights who are represented as luminous intensity + // but who must be converted to luminous irradiance for surface lighting calculation + float distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 ); + + if( cutoffDistance > 0.0 ) { + + distanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) ); + + } + + return distanceFalloff; + +#else + + if( cutoffDistance > 0.0 && decayExponent > 0.0 ) { + + return pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent ); + + } + + return 1.0; + +#endif + +} + +vec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) { + + return RECIPROCAL_PI * diffuseColor; + +} // validated + +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; + +} // validated + +// Microfacet Models for Refraction through Rough Surfaces - equation (34) +// http://graphicrants.blogspot.com/2013/08/specular-brdf-reference.html +// alpha is "roughness squared" in Disney’s reparameterization +float G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) { + + // geometry term (normalized) = G(l)⋅G(v) / 4(n⋅l)(n⋅v) + // also see #12151 + + float a2 = pow2( alpha ); + + float gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) ); + float gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) ); + + return 1.0 / ( gl * gv ); + +} // validated + +// 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 ); + +} + +// 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 ); + +} + +// GGX Distribution, Schlick Fresnel, GGX-Smith Visibility +vec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) { + + float alpha = pow2( roughness ); // UE4's roughness + + vec3 halfDir = normalize( incidentLight.direction + geometry.viewDir ); + + float dotNL = saturate( dot( geometry.normal, incidentLight.direction ) ); + float dotNV = saturate( dot( geometry.normal, geometry.viewDir ) ); + float dotNH = saturate( dot( geometry.normal, halfDir ) ); + float dotLH = saturate( dot( incidentLight.direction, halfDir ) ); + + vec3 F = F_Schlick( specularColor, dotLH ); + + float G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV ); + + float D = D_GGX( alpha, dotNH ); + + return F * ( G * D ); + +} // validated + +// Rect Area Light + +// 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/ + +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; + +} + +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_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; + +} + +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 * transposeMat3( mat3( T1, T2, N ) ); + + // 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 ); + +/* + // alternate method of adjusting for horizon clipping (see referece) + // refactoring required + float len = length( vectorFormFactor ); + float z = vectorFormFactor.z / len; + + const float LUT_SIZE = 64.0; + const float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE; + const float LUT_BIAS = 0.5 / LUT_SIZE; + + // tabulated horizon-clipped sphere, apparently... + vec2 uv = vec2( z * 0.5 + 0.5, len ); + uv = uv * LUT_SCALE + LUT_BIAS; + + float scale = texture2D( ltc_2, uv ).w; + + float result = len * scale; +*/ + + return vec3( result ); + +} + +// End Rect Area Light + +// ref: https://www.unrealengine.com/blog/physically-based-shading-on-mobile - environmentBRDF for GGX on mobile +vec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) { + + float dotNV = saturate( dot( geometry.normal, geometry.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 AB = vec2( -1.04, 1.04 ) * a004 + r.zw; + + return specularColor * AB.x + AB.y; + +} // validated + + +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; + +} + +float D_BlinnPhong( const in float shininess, const in float dotNH ) { + + return RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess ); + +} + +vec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) { + + vec3 halfDir = normalize( incidentLight.direction + geometry.viewDir ); + + //float dotNL = saturate( dot( geometry.normal, incidentLight.direction ) ); + //float dotNV = saturate( dot( geometry.normal, geometry.viewDir ) ); + float dotNH = saturate( dot( geometry.normal, halfDir ) ); + float dotLH = saturate( dot( incidentLight.direction, halfDir ) ); + + vec3 F = F_Schlick( specularColor, dotLH ); + + float G = G_BlinnPhong_Implicit( /* dotNL, dotNV */ ); + + float D = D_BlinnPhong( shininess, dotNH ); + + return F * ( G * D ); + +} // validated + +// source: http://simonstechblog.blogspot.ca/2011/12/microfacet-brdf.html +float GGXRoughnessToBlinnExponent( const in float ggxRoughness ) { + return ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 ); +} + +float BlinnExponentToGGXRoughness( const in float blinnExponent ) { + return sqrt( 2.0 / ( blinnExponent + 2.0 ) ); +} diff --git a/lib/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl new file mode 100644 index 0000000..5de9a65 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl @@ -0,0 +1,44 @@ +#ifdef USE_BUMPMAP + + uniform sampler2D bumpMap; + uniform float bumpScale; + + // Bump Mapping Unparametrized Surfaces on the GPU by Morten S. Mikkelsen + // http://api.unrealengine.com/attachments/Engine/Rendering/LightingAndShadows/BumpMappingWithoutTangentSpace/mm_sfgrad_bump.pdf + + // Evaluate the derivative of the height w.r.t. screen-space using forward differencing (listing 2) + + vec2 dHdxy_fwd() { + + vec2 dSTdx = dFdx( vUv ); + vec2 dSTdy = dFdy( vUv ); + + float Hll = bumpScale * texture2D( bumpMap, vUv ).x; + float dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll; + float dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll; + + return vec2( dBx, dBy ); + + } + + vec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) { + + // Workaround for Adreno 3XX dFd*( vec3 ) bug. See #9988 + + 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 diff --git a/lib/renderers/shaders/ShaderChunk/clipping_planes_fragment.glsl b/lib/renderers/shaders/ShaderChunk/clipping_planes_fragment.glsl new file mode 100644 index 0000000..bea6ffa --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/clipping_planes_fragment.glsl @@ -0,0 +1,29 @@ +#if NUM_CLIPPING_PLANES > 0 + + vec4 plane; + + #pragma unroll_loop + for ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) { + + plane = clippingPlanes[ i ]; + if ( dot( vViewPosition, plane.xyz ) > plane.w ) discard; + + } + + #if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES + + bool clipped = true; + + #pragma unroll_loop + for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) { + + plane = clippingPlanes[ i ]; + clipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped; + + } + + if ( clipped ) discard; + + #endif + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/clipping_planes_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/clipping_planes_pars_fragment.glsl new file mode 100644 index 0000000..0a58ad8 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/clipping_planes_pars_fragment.glsl @@ -0,0 +1,9 @@ +#if NUM_CLIPPING_PLANES > 0 + + #if ! defined( PHYSICAL ) && ! defined( PHONG ) && ! defined( MATCAP ) + varying vec3 vViewPosition; + #endif + + uniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ]; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/clipping_planes_pars_vertex.glsl b/lib/renderers/shaders/ShaderChunk/clipping_planes_pars_vertex.glsl new file mode 100644 index 0000000..0a3f269 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/clipping_planes_pars_vertex.glsl @@ -0,0 +1,3 @@ +#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG ) && ! defined( MATCAP ) + varying vec3 vViewPosition; +#endif diff --git a/lib/renderers/shaders/ShaderChunk/clipping_planes_vertex.glsl b/lib/renderers/shaders/ShaderChunk/clipping_planes_vertex.glsl new file mode 100644 index 0000000..f288a3d --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/clipping_planes_vertex.glsl @@ -0,0 +1,4 @@ +#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG ) && ! defined( MATCAP ) + vViewPosition = - mvPosition.xyz; +#endif + diff --git a/lib/renderers/shaders/ShaderChunk/color_fragment.glsl b/lib/renderers/shaders/ShaderChunk/color_fragment.glsl new file mode 100644 index 0000000..693fdf0 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/color_fragment.glsl @@ -0,0 +1,5 @@ +#ifdef USE_COLOR + + diffuseColor.rgb *= vColor; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/color_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/color_pars_fragment.glsl new file mode 100644 index 0000000..4f59898 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/color_pars_fragment.glsl @@ -0,0 +1,5 @@ +#ifdef USE_COLOR + + varying vec3 vColor; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/color_pars_vertex.glsl b/lib/renderers/shaders/ShaderChunk/color_pars_vertex.glsl new file mode 100644 index 0000000..f3862c3 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/color_pars_vertex.glsl @@ -0,0 +1,5 @@ +#ifdef USE_COLOR + + varying vec3 vColor; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/color_vertex.glsl b/lib/renderers/shaders/ShaderChunk/color_vertex.glsl new file mode 100644 index 0000000..7bd534d --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/color_vertex.glsl @@ -0,0 +1,5 @@ +#ifdef USE_COLOR + + vColor.xyz = color.xyz; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/common.glsl b/lib/renderers/shaders/ShaderChunk/common.glsl new file mode 100644 index 0000000..2ed7888 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/common.glsl @@ -0,0 +1,95 @@ +#define PI 3.14159265359 +#define PI2 6.28318530718 +#define PI_HALF 1.5707963267949 +#define RECIPROCAL_PI 0.31830988618 +#define RECIPROCAL_PI2 0.15915494 +#define LOG2 1.442695 +#define EPSILON 1e-6 + +#define saturate(a) clamp( a, 0.0, 1.0 ) +#define whiteCompliment(a) ( 1.0 - saturate( a ) ) + +float pow2( const in float x ) { return x*x; } +float pow3( const in float x ) { return x*x*x; } +float pow4( const in float x ) { float x2 = x*x; return x2*x2; } +float average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); } +// 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); +} + +struct IncidentLight { + vec3 color; + vec3 direction; + bool visible; +}; + +struct ReflectedLight { + vec3 directDiffuse; + vec3 directSpecular; + vec3 indirectDiffuse; + vec3 indirectSpecular; +}; + +struct GeometricContext { + vec3 position; + vec3 normal; + vec3 viewDir; +}; + +vec3 transformDirection( in vec3 dir, in mat4 matrix ) { + + return normalize( ( matrix * vec4( dir, 0.0 ) ).xyz ); + +} + +// http://en.wikibooks.org/wiki/GLSL_Programming/Applying_Matrix_Transformations +vec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) { + + return normalize( ( vec4( dir, 0.0 ) * matrix ).xyz ); + +} + +vec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) { + + float distance = dot( planeNormal, point - pointOnPlane ); + + return - distance * planeNormal + point; + +} + +float sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) { + + return sign( dot( point - pointOnPlane, planeNormal ) ); + +} + +vec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) { + + return lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine; + +} + +mat3 transposeMat3( const in mat3 m ) { + + mat3 tmp; + + tmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x ); + tmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y ); + tmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z ); + + return tmp; + +} + +// https://en.wikipedia.org/wiki/Relative_luminance +float linearToRelativeLuminance( const in vec3 color ) { + + vec3 weights = vec3( 0.2126, 0.7152, 0.0722 ); + + return dot( weights, color.rgb ); + +} diff --git a/lib/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl b/lib/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl new file mode 100644 index 0000000..7023989 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl @@ -0,0 +1,128 @@ +#ifdef ENVMAP_TYPE_CUBE_UV + +#define cubeUV_textureSize (1024.0) + +int getFaceFromDirection(vec3 direction) { + vec3 absDirection = abs(direction); + int face = -1; + if( absDirection.x > absDirection.z ) { + if(absDirection.x > absDirection.y ) + face = direction.x > 0.0 ? 0 : 3; + else + face = direction.y > 0.0 ? 1 : 4; + } + else { + if(absDirection.z > absDirection.y ) + face = direction.z > 0.0 ? 2 : 5; + else + face = direction.y > 0.0 ? 1 : 4; + } + return face; +} +#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0) +#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0)) + +vec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) { + float scale = exp2(cubeUV_maxLods1 - roughnessLevel); + float dxRoughness = dFdx(roughness); + float dyRoughness = dFdy(roughness); + vec3 dx = dFdx( vec * scale * dxRoughness ); + vec3 dy = dFdy( vec * scale * dyRoughness ); + float d = max( dot( dx, dx ), dot( dy, dy ) ); + // Clamp the value to the max mip level counts. hard coded to 6 mips + d = clamp(d, 1.0, cubeUV_rangeClamp); + float mipLevel = 0.5 * log2(d); + return vec2(floor(mipLevel), fract(mipLevel)); +} + +#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0) +#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize) + +vec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) { + mipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel; + float a = 16.0 * cubeUV_rcpTextureSize; + + vec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) ); + vec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed; + // float powScale = exp2(roughnessLevel + mipLevel); + float powScale = exp2_packed.x * exp2_packed.y; + // float scale = 1.0 / exp2(roughnessLevel + 2.0 + mipLevel); + float scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25; + // float mipOffset = 0.75*(1.0 - 1.0/exp2(mipLevel))/exp2(roughnessLevel); + float mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x; + + bool bRes = mipLevel == 0.0; + scale = bRes && (scale < a) ? a : scale; + + vec3 r; + vec2 offset; + int face = getFaceFromDirection(direction); + + float rcpPowScale = 1.0 / powScale; + + if( face == 0) { + r = vec3(direction.x, -direction.z, direction.y); + offset = vec2(0.0+mipOffset,0.75 * rcpPowScale); + offset.y = bRes && (offset.y < 2.0*a) ? a : offset.y; + } + else if( face == 1) { + r = vec3(direction.y, direction.x, direction.z); + offset = vec2(scale+mipOffset, 0.75 * rcpPowScale); + offset.y = bRes && (offset.y < 2.0*a) ? a : offset.y; + } + else if( face == 2) { + r = vec3(direction.z, direction.x, direction.y); + offset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale); + offset.y = bRes && (offset.y < 2.0*a) ? a : offset.y; + } + else if( face == 3) { + r = vec3(direction.x, direction.z, direction.y); + offset = vec2(0.0+mipOffset,0.5 * rcpPowScale); + offset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y; + } + else if( face == 4) { + r = vec3(direction.y, direction.x, -direction.z); + offset = vec2(scale+mipOffset, 0.5 * rcpPowScale); + offset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y; + } + else { + r = vec3(direction.z, -direction.x, direction.y); + offset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale); + offset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y; + } + r = normalize(r); + float texelOffset = 0.5 * cubeUV_rcpTextureSize; + vec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5; + vec2 base = offset + vec2( texelOffset ); + return base + s * ( scale - 2.0 * texelOffset ); +} + +#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0) + +vec4 textureCubeUV( sampler2D envMap, vec3 reflectedDirection, float roughness ) { + float roughnessVal = roughness* cubeUV_maxLods3; + float r1 = floor(roughnessVal); + float r2 = r1 + 1.0; + float t = fract(roughnessVal); + vec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness); + float s = mipInfo.y; + float level0 = mipInfo.x; + float level1 = level0 + 1.0; + level1 = level1 > 5.0 ? 5.0 : level1; + + // round to nearest mipmap if we are not interpolating. + level0 += min( floor( s + 0.5 ), 5.0 ); + + // Tri linear interpolation. + vec2 uv_10 = getCubeUV(reflectedDirection, r1, level0); + vec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10)); + + vec2 uv_20 = getCubeUV(reflectedDirection, r2, level0); + vec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20)); + + vec4 result = mix(color10, color20, t); + + return vec4(result.rgb, 1.0); +} + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl b/lib/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl new file mode 100644 index 0000000..38c9509 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl @@ -0,0 +1,7 @@ +vec3 transformedNormal = normalMatrix * objectNormal; + +#ifdef FLIP_SIDED + + transformedNormal = - transformedNormal; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/displacementmap_pars_vertex.glsl b/lib/renderers/shaders/ShaderChunk/displacementmap_pars_vertex.glsl new file mode 100644 index 0000000..5e77159 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/displacementmap_pars_vertex.glsl @@ -0,0 +1,7 @@ +#ifdef USE_DISPLACEMENTMAP + + uniform sampler2D displacementMap; + uniform float displacementScale; + uniform float displacementBias; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/displacementmap_vertex.glsl b/lib/renderers/shaders/ShaderChunk/displacementmap_vertex.glsl new file mode 100644 index 0000000..0c8dce0 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/displacementmap_vertex.glsl @@ -0,0 +1,5 @@ +#ifdef USE_DISPLACEMENTMAP + + transformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias ); + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/dithering_fragment.glsl b/lib/renderers/shaders/ShaderChunk/dithering_fragment.glsl new file mode 100644 index 0000000..a81e01d --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/dithering_fragment.glsl @@ -0,0 +1,5 @@ +#if defined( DITHERING ) + + gl_FragColor.rgb = dithering( gl_FragColor.rgb ); + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/dithering_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/dithering_pars_fragment.glsl new file mode 100644 index 0000000..591bfc4 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/dithering_pars_fragment.glsl @@ -0,0 +1,18 @@ +#if defined( DITHERING ) + + // based on https://www.shadertoy.com/view/MslGR8 + 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 diff --git a/lib/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl b/lib/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl new file mode 100644 index 0000000..1d65996 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl @@ -0,0 +1,9 @@ +#ifdef USE_EMISSIVEMAP + + vec4 emissiveColor = texture2D( emissiveMap, vUv ); + + emissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb; + + totalEmissiveRadiance *= emissiveColor.rgb; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/emissivemap_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/emissivemap_pars_fragment.glsl new file mode 100644 index 0000000..c05bb7f --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/emissivemap_pars_fragment.glsl @@ -0,0 +1,5 @@ +#ifdef USE_EMISSIVEMAP + + uniform sampler2D emissiveMap; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/encodings_fragment.glsl b/lib/renderers/shaders/ShaderChunk/encodings_fragment.glsl new file mode 100644 index 0000000..189d735 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/encodings_fragment.glsl @@ -0,0 +1 @@ + gl_FragColor = linearToOutputTexel( gl_FragColor ); diff --git a/lib/renderers/shaders/ShaderChunk/encodings_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/encodings_pars_fragment.glsl new file mode 100644 index 0000000..211952c --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/encodings_pars_fragment.glsl @@ -0,0 +1,83 @@ +// For a discussion of what this is, please read this: http://lousodrome.net/blog/light/2013/05/26/gamma-correct-and-hdr-rendering-in-a-32-bits-buffer/ + +vec4 LinearToLinear( in vec4 value ) { + return value; +} + +vec4 GammaToLinear( in vec4 value, in float gammaFactor ) { + return vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a ); +} + +vec4 LinearToGamma( in vec4 value, in float gammaFactor ) { + return vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a ); +} + +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.a ); +} + +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.a ); +} + +vec4 RGBEToLinear( in vec4 value ) { + return vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 ); +} + +vec4 LinearToRGBE( in vec4 value ) { + float maxComponent = max( max( value.r, value.g ), value.b ); + float fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 ); + return vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 ); +// return vec4( value.brg, ( 3.0 + 128.0 ) / 256.0 ); +} + +// reference: http://iwasbeingirony.blogspot.ca/2010/06/difference-between-rgbm-and-rgbd.html +vec4 RGBMToLinear( in vec4 value, in float maxRange ) { + return vec4( value.rgb * value.a * maxRange, 1.0 ); +} + +vec4 LinearToRGBM( in vec4 value, in float maxRange ) { + float maxRGB = max( value.r, max( value.g, value.b ) ); + float M = clamp( maxRGB / maxRange, 0.0, 1.0 ); + M = ceil( M * 255.0 ) / 255.0; + return vec4( value.rgb / ( M * maxRange ), M ); +} + +// reference: http://iwasbeingirony.blogspot.ca/2010/06/difference-between-rgbm-and-rgbd.html +vec4 RGBDToLinear( in vec4 value, in float maxRange ) { + return vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 ); +} + +vec4 LinearToRGBD( in vec4 value, in float maxRange ) { + float maxRGB = max( value.r, max( value.g, value.b ) ); + float D = max( maxRange / maxRGB, 1.0 ); + D = min( floor( D ) / 255.0, 1.0 ); + return vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D ); +} + +// LogLuv reference: http://graphicrants.blogspot.ca/2009/04/rgbm-color-encoding.html + +// M matrix, for encoding +const mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 ); +vec4 LinearToLogLuv( in vec4 value ) { + vec3 Xp_Y_XYZp = value.rgb * cLogLuvM; + Xp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) ); + vec4 vResult; + vResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z; + float Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0; + vResult.w = fract( Le ); + vResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0; + return vResult; +} + +// Inverse M matrix, for decoding +const mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 ); +vec4 LogLuvToLinear( in vec4 value ) { + float Le = value.z * 255.0 + value.w; + vec3 Xp_Y_XYZp; + Xp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 ); + Xp_Y_XYZp.z = Xp_Y_XYZp.y / value.y; + Xp_Y_XYZp.x = value.x * Xp_Y_XYZp.z; + vec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM; + return vec4( max( vRGB, 0.0 ), 1.0 ); +} diff --git a/lib/renderers/shaders/ShaderChunk/envmap_fragment.glsl b/lib/renderers/shaders/ShaderChunk/envmap_fragment.glsl new file mode 100644 index 0000000..d401e2b --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/envmap_fragment.glsl @@ -0,0 +1,72 @@ +#ifdef USE_ENVMAP + + #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) + + vec3 cameraToVertex = normalize( vWorldPosition - cameraPosition ); + + // Transforming Normal Vectors with the Inverse Transformation + vec3 worldNormal = inverseTransformDirection( normal, viewMatrix ); + + #ifdef ENVMAP_MODE_REFLECTION + + vec3 reflectVec = reflect( cameraToVertex, worldNormal ); + + #else + + vec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio ); + + #endif + + #else + + vec3 reflectVec = vReflect; + + #endif + + #ifdef ENVMAP_TYPE_CUBE + + vec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) ); + + #elif defined( ENVMAP_TYPE_EQUIREC ) + + vec2 sampleUV; + + reflectVec = normalize( reflectVec ); + + sampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5; + + sampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5; + + vec4 envColor = texture2D( envMap, sampleUV ); + + #elif defined( ENVMAP_TYPE_SPHERE ) + + reflectVec = normalize( reflectVec ); + + vec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) ); + + vec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 ); + + #else + + vec4 envColor = vec4( 0.0 ); + + #endif + + envColor = envMapTexelToLinear( envColor ); + + #ifdef ENVMAP_BLENDING_MULTIPLY + + outgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity ); + + #elif defined( ENVMAP_BLENDING_MIX ) + + outgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity ); + + #elif defined( ENVMAP_BLENDING_ADD ) + + outgoingLight += envColor.xyz * specularStrength * reflectivity; + + #endif + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/envmap_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/envmap_pars_fragment.glsl new file mode 100644 index 0000000..3e6e377 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/envmap_pars_fragment.glsl @@ -0,0 +1,26 @@ +#if defined( USE_ENVMAP ) || defined( PHYSICAL ) + uniform float reflectivity; + uniform float envMapIntensity; +#endif + +#ifdef USE_ENVMAP + + #if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) ) + varying vec3 vWorldPosition; + #endif + + #ifdef ENVMAP_TYPE_CUBE + uniform samplerCube envMap; + #else + uniform sampler2D envMap; + #endif + uniform float flipEnvMap; + uniform int maxMipLevel; + + #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL ) + uniform float refractionRatio; + #else + varying vec3 vReflect; + #endif + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/envmap_pars_vertex.glsl b/lib/renderers/shaders/ShaderChunk/envmap_pars_vertex.glsl new file mode 100644 index 0000000..7feab75 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/envmap_pars_vertex.glsl @@ -0,0 +1,13 @@ +#ifdef USE_ENVMAP + + #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) + varying vec3 vWorldPosition; + + #else + + varying vec3 vReflect; + uniform float refractionRatio; + + #endif + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl new file mode 100644 index 0000000..db22ff0 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl @@ -0,0 +1,133 @@ +#if defined( USE_ENVMAP ) && defined( PHYSICAL ) + + vec3 getLightProbeIndirectIrradiance( /*const in SpecularLightProbe specularLightProbe,*/ const in GeometricContext geometry, const in int maxMIPLevel ) { + + vec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix ); + + #ifdef ENVMAP_TYPE_CUBE + + vec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz ); + + // 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. + + #ifdef TEXTURE_LOD_EXT + + vec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) ); + + #else + + // force the bias high to get the last LOD level as it is the most blurred. + vec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) ); + + #endif + + envMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb; + + #elif defined( ENVMAP_TYPE_CUBE_UV ) + + vec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz ); + vec4 envMapColor = textureCubeUV( envMap, queryVec, 1.0 ); + + #else + + vec4 envMapColor = vec4( 0.0 ); + + #endif + + return PI * envMapColor.rgb * envMapIntensity; + + } + + // taken from here: http://casual-effects.blogspot.ca/2011/08/plausible-environment-lighting-in-two.html + float getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) { + + //float envMapWidth = pow( 2.0, maxMIPLevelScalar ); + //float desiredMIPLevel = log2( envMapWidth * sqrt( 3.0 ) ) - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 ); + + float maxMIPLevelScalar = float( maxMIPLevel ); + float desiredMIPLevel = maxMIPLevelScalar + 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 ); + + // clamp to allowable LOD ranges. + return clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar ); + + } + + vec3 getLightProbeIndirectRadiance( /*const in SpecularLightProbe specularLightProbe,*/ const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) { + + #ifdef ENVMAP_MODE_REFLECTION + + vec3 reflectVec = reflect( -geometry.viewDir, geometry.normal ); + + #else + + vec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio ); + + #endif + + reflectVec = inverseTransformDirection( reflectVec, viewMatrix ); + + float specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel ); + + #ifdef ENVMAP_TYPE_CUBE + + vec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz ); + + #ifdef TEXTURE_LOD_EXT + + vec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel ); + + #else + + vec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel ); + + #endif + + envMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb; + + #elif defined( ENVMAP_TYPE_CUBE_UV ) + + vec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz ); + vec4 envMapColor = textureCubeUV( envMap, queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent )); + + #elif defined( ENVMAP_TYPE_EQUIREC ) + + vec2 sampleUV; + sampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5; + sampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5; + + #ifdef TEXTURE_LOD_EXT + + vec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel ); + + #else + + vec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel ); + + #endif + + envMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb; + + #elif defined( ENVMAP_TYPE_SPHERE ) + + vec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) ); + + #ifdef TEXTURE_LOD_EXT + + vec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel ); + + #else + + vec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel ); + + #endif + + envMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb; + + #endif + + return envMapColor.rgb * envMapIntensity; + + } + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/envmap_vertex.glsl b/lib/renderers/shaders/ShaderChunk/envmap_vertex.glsl new file mode 100644 index 0000000..ce32d52 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/envmap_vertex.glsl @@ -0,0 +1,25 @@ +#ifdef USE_ENVMAP + + #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) + + vWorldPosition = worldPosition.xyz; + + #else + + vec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition ); + + vec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix ); + + #ifdef ENVMAP_MODE_REFLECTION + + vReflect = reflect( cameraToVertex, worldNormal ); + + #else + + vReflect = refract( cameraToVertex, worldNormal, refractionRatio ); + + #endif + + #endif + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/fog_fragment.glsl b/lib/renderers/shaders/ShaderChunk/fog_fragment.glsl new file mode 100644 index 0000000..8307a32 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/fog_fragment.glsl @@ -0,0 +1,15 @@ +#ifdef USE_FOG + + #ifdef FOG_EXP2 + + float fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) ); + + #else + + float fogFactor = smoothstep( fogNear, fogFar, fogDepth ); + + #endif + + gl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor ); + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/fog_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/fog_pars_fragment.glsl new file mode 100644 index 0000000..26c4093 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/fog_pars_fragment.glsl @@ -0,0 +1,17 @@ +#ifdef USE_FOG + + uniform vec3 fogColor; + varying float fogDepth; + + #ifdef FOG_EXP2 + + uniform float fogDensity; + + #else + + uniform float fogNear; + uniform float fogFar; + + #endif + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/fog_pars_vertex.glsl b/lib/renderers/shaders/ShaderChunk/fog_pars_vertex.glsl new file mode 100644 index 0000000..b9658ca --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/fog_pars_vertex.glsl @@ -0,0 +1,5 @@ +#ifdef USE_FOG + + varying float fogDepth; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/fog_vertex.glsl b/lib/renderers/shaders/ShaderChunk/fog_vertex.glsl new file mode 100644 index 0000000..0e808ad --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/fog_vertex.glsl @@ -0,0 +1,5 @@ +#ifdef USE_FOG + + fogDepth = -mvPosition.z; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/gradientmap_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/gradientmap_pars_fragment.glsl new file mode 100644 index 0000000..c8332ba --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/gradientmap_pars_fragment.glsl @@ -0,0 +1,24 @@ +#ifdef TOON + + uniform sampler2D gradientMap; + + vec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) { + + // dotNL will be from -1.0 to 1.0 + float dotNL = dot( normal, lightDirection ); + vec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 ); + + #ifdef USE_GRADIENTMAP + + return texture2D( gradientMap, coord ).rgb; + + #else + + return ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 ); + + #endif + + + } + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/lightmap_fragment.glsl b/lib/renderers/shaders/ShaderChunk/lightmap_fragment.glsl new file mode 100644 index 0000000..1392a60 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/lightmap_fragment.glsl @@ -0,0 +1,5 @@ +#ifdef USE_LIGHTMAP + + reflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity; // factor of PI should not be present; included here to prevent breakage + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/lightmap_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/lightmap_pars_fragment.glsl new file mode 100644 index 0000000..a75c38f --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/lightmap_pars_fragment.glsl @@ -0,0 +1,6 @@ +#ifdef USE_LIGHTMAP + + uniform sampler2D lightMap; + uniform float lightMapIntensity; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl b/lib/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl new file mode 100644 index 0000000..7af8dfb --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl @@ -0,0 +1,123 @@ +/** + * This is a template that can be used to light a material, it uses pluggable + * RenderEquations (RE)for specific lighting scenarios. + * + * Instructions for use: + * - Ensure that both RE_Direct, RE_IndirectDiffuse and RE_IndirectSpecular are defined + * - If you have defined an RE_IndirectSpecular, you need to also provide a Material_LightProbeLOD. <---- ??? + * - Create a material parameter that is to be passed as the third parameter to your lighting functions. + * + * TODO: + * - Add area light support. + * - Add sphere light support. + * - Add diffuse light probe (irradiance cubemap) support. + */ + +GeometricContext geometry; + +geometry.position = - vViewPosition; +geometry.normal = normal; +geometry.viewDir = normalize( vViewPosition ); + +IncidentLight directLight; + +#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct ) + + PointLight pointLight; + + #pragma unroll_loop + for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) { + + pointLight = pointLights[ i ]; + + getPointDirectLightIrradiance( pointLight, geometry, directLight ); + + #ifdef USE_SHADOWMAP + directLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0; + #endif + + RE_Direct( directLight, geometry, material, reflectedLight ); + + } + +#endif + +#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct ) + + SpotLight spotLight; + + #pragma unroll_loop + for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) { + + spotLight = spotLights[ i ]; + + getSpotDirectLightIrradiance( spotLight, geometry, directLight ); + + #ifdef USE_SHADOWMAP + directLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0; + #endif + + RE_Direct( directLight, geometry, material, reflectedLight ); + + } + +#endif + +#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct ) + + DirectionalLight directionalLight; + + #pragma unroll_loop + for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) { + + directionalLight = directionalLights[ i ]; + + getDirectionalDirectLightIrradiance( directionalLight, geometry, directLight ); + + #ifdef USE_SHADOWMAP + directLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0; + #endif + + RE_Direct( directLight, geometry, material, reflectedLight ); + + } + +#endif + +#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea ) + + RectAreaLight rectAreaLight; + + #pragma unroll_loop + for ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) { + + rectAreaLight = rectAreaLights[ i ]; + RE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight ); + + } + +#endif + +#if defined( RE_IndirectDiffuse ) + + vec3 irradiance = getAmbientLightIrradiance( ambientLightColor ); + + #if ( NUM_HEMI_LIGHTS > 0 ) + + #pragma unroll_loop + for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) { + + irradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry ); + + } + + #endif + +#endif + +#if defined( RE_IndirectSpecular ) + + vec3 radiance = vec3( 0.0 ); + vec3 clearCoatRadiance = vec3( 0.0 ); + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/lights_fragment_end.glsl b/lib/renderers/shaders/ShaderChunk/lights_fragment_end.glsl new file mode 100644 index 0000000..c727183 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/lights_fragment_end.glsl @@ -0,0 +1,11 @@ +#if defined( RE_IndirectDiffuse ) + + RE_IndirectDiffuse( irradiance, geometry, material, reflectedLight ); + +#endif + +#if defined( RE_IndirectSpecular ) + + RE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight ); + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl b/lib/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl new file mode 100644 index 0000000..dfba604 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl @@ -0,0 +1,33 @@ +#if defined( RE_IndirectDiffuse ) + + #ifdef USE_LIGHTMAP + + vec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity; + + #ifndef PHYSICALLY_CORRECT_LIGHTS + + lightMapIrradiance *= PI; // factor of PI should not be present; included here to prevent breakage + + #endif + + irradiance += lightMapIrradiance; + + #endif + + #if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV ) + + irradiance += getLightProbeIndirectIrradiance( /*lightProbe,*/ geometry, maxMipLevel ); + + #endif + +#endif + +#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular ) + + radiance += getLightProbeIndirectRadiance( /*specularLightProbe,*/ geometry, Material_BlinnShininessExponent( material ), maxMipLevel ); + + #ifndef STANDARD + clearCoatRadiance += getLightProbeIndirectRadiance( /*specularLightProbe,*/ geometry, Material_ClearCoat_BlinnShininessExponent( material ), maxMipLevel ); + #endif + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/lights_lambert_vertex.glsl b/lib/renderers/shaders/ShaderChunk/lights_lambert_vertex.glsl new file mode 100644 index 0000000..b6f5660 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/lights_lambert_vertex.glsl @@ -0,0 +1,115 @@ +vec3 diffuse = vec3( 1.0 ); + +GeometricContext geometry; +geometry.position = mvPosition.xyz; +geometry.normal = normalize( transformedNormal ); +geometry.viewDir = normalize( -mvPosition.xyz ); + +GeometricContext backGeometry; +backGeometry.position = geometry.position; +backGeometry.normal = -geometry.normal; +backGeometry.viewDir = geometry.viewDir; + +vLightFront = vec3( 0.0 ); + +#ifdef DOUBLE_SIDED + vLightBack = vec3( 0.0 ); +#endif + +IncidentLight directLight; +float dotNL; +vec3 directLightColor_Diffuse; + +#if NUM_POINT_LIGHTS > 0 + + #pragma unroll_loop + for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) { + + getPointDirectLightIrradiance( pointLights[ i ], geometry, directLight ); + + dotNL = dot( geometry.normal, directLight.direction ); + directLightColor_Diffuse = PI * directLight.color; + + vLightFront += saturate( dotNL ) * directLightColor_Diffuse; + + #ifdef DOUBLE_SIDED + + vLightBack += saturate( -dotNL ) * directLightColor_Diffuse; + + #endif + + } + +#endif + +#if NUM_SPOT_LIGHTS > 0 + + #pragma unroll_loop + for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) { + + getSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight ); + + dotNL = dot( geometry.normal, directLight.direction ); + directLightColor_Diffuse = PI * directLight.color; + + vLightFront += saturate( dotNL ) * directLightColor_Diffuse; + + #ifdef DOUBLE_SIDED + + vLightBack += saturate( -dotNL ) * directLightColor_Diffuse; + + #endif + } + +#endif + +/* +#if NUM_RECT_AREA_LIGHTS > 0 + + for ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) { + + // TODO (abelnation): implement + + } + +#endif +*/ + +#if NUM_DIR_LIGHTS > 0 + + #pragma unroll_loop + for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) { + + getDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight ); + + dotNL = dot( geometry.normal, directLight.direction ); + directLightColor_Diffuse = PI * directLight.color; + + vLightFront += saturate( dotNL ) * directLightColor_Diffuse; + + #ifdef DOUBLE_SIDED + + vLightBack += saturate( -dotNL ) * directLightColor_Diffuse; + + #endif + + } + +#endif + +#if NUM_HEMI_LIGHTS > 0 + + #pragma unroll_loop + for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) { + + vLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry ); + + #ifdef DOUBLE_SIDED + + vLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry ); + + #endif + + } + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/lights_pars_begin.glsl b/lib/renderers/shaders/ShaderChunk/lights_pars_begin.glsl new file mode 100644 index 0000000..071be7c --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/lights_pars_begin.glsl @@ -0,0 +1,170 @@ +uniform vec3 ambientLightColor; + +vec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) { + + vec3 irradiance = ambientLightColor; + + #ifndef PHYSICALLY_CORRECT_LIGHTS + + irradiance *= PI; + + #endif + + return irradiance; + +} + +#if NUM_DIR_LIGHTS > 0 + + struct DirectionalLight { + vec3 direction; + vec3 color; + + int shadow; + float shadowBias; + float shadowRadius; + vec2 shadowMapSize; + }; + + uniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ]; + + void getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) { + + directLight.color = directionalLight.color; + directLight.direction = directionalLight.direction; + directLight.visible = true; + + } + +#endif + + +#if NUM_POINT_LIGHTS > 0 + + struct PointLight { + vec3 position; + vec3 color; + float distance; + float decay; + + int shadow; + float shadowBias; + float shadowRadius; + vec2 shadowMapSize; + float shadowCameraNear; + float shadowCameraFar; + }; + + uniform PointLight pointLights[ NUM_POINT_LIGHTS ]; + + // directLight is an out parameter as having it as a return value caused compiler errors on some devices + void getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) { + + vec3 lVector = pointLight.position - geometry.position; + directLight.direction = normalize( lVector ); + + float lightDistance = length( lVector ); + + directLight.color = pointLight.color; + directLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay ); + directLight.visible = ( directLight.color != vec3( 0.0 ) ); + + } + +#endif + + +#if NUM_SPOT_LIGHTS > 0 + + struct SpotLight { + vec3 position; + vec3 direction; + vec3 color; + float distance; + float decay; + float coneCos; + float penumbraCos; + + int shadow; + float shadowBias; + float shadowRadius; + vec2 shadowMapSize; + }; + + uniform SpotLight spotLights[ NUM_SPOT_LIGHTS ]; + + // directLight is an out parameter as having it as a return value caused compiler errors on some devices + void getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) { + + vec3 lVector = spotLight.position - geometry.position; + directLight.direction = normalize( lVector ); + + float lightDistance = length( lVector ); + float angleCos = dot( directLight.direction, spotLight.direction ); + + if ( angleCos > spotLight.coneCos ) { + + float spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos ); + + directLight.color = spotLight.color; + directLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay ); + directLight.visible = true; + + } else { + + directLight.color = vec3( 0.0 ); + directLight.visible = false; + + } + } + +#endif + + +#if NUM_RECT_AREA_LIGHTS > 0 + + struct RectAreaLight { + vec3 color; + vec3 position; + vec3 halfWidth; + vec3 halfHeight; + }; + + // 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 + + uniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ]; + +#endif + + +#if NUM_HEMI_LIGHTS > 0 + + struct HemisphereLight { + vec3 direction; + vec3 skyColor; + vec3 groundColor; + }; + + uniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ]; + + vec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) { + + float dotNL = dot( geometry.normal, hemiLight.direction ); + float hemiDiffuseWeight = 0.5 * dotNL + 0.5; + + vec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight ); + + #ifndef PHYSICALLY_CORRECT_LIGHTS + + irradiance *= PI; + + #endif + + return irradiance; + + } + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/lights_phong_fragment.glsl b/lib/renderers/shaders/ShaderChunk/lights_phong_fragment.glsl new file mode 100644 index 0000000..3bc610a --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/lights_phong_fragment.glsl @@ -0,0 +1,5 @@ +BlinnPhongMaterial material; +material.diffuseColor = diffuseColor.rgb; +material.specularColor = specular; +material.specularShininess = shininess; +material.specularStrength = specularStrength; diff --git a/lib/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl new file mode 100644 index 0000000..4e41227 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl @@ -0,0 +1,53 @@ +varying vec3 vViewPosition; + +#ifndef FLAT_SHADED + + varying vec3 vNormal; + +#endif + + +struct BlinnPhongMaterial { + + vec3 diffuseColor; + vec3 specularColor; + float specularShininess; + float specularStrength; + +}; + +void RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) { + + #ifdef TOON + + vec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color; + + #else + + float dotNL = saturate( dot( geometry.normal, directLight.direction ) ); + vec3 irradiance = dotNL * directLight.color; + + #endif + + #ifndef PHYSICALLY_CORRECT_LIGHTS + + irradiance *= PI; // punctual light + + #endif + + reflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor ); + + reflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength; + +} + +void RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) { + + reflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor ); + +} + +#define RE_Direct RE_Direct_BlinnPhong +#define RE_IndirectDiffuse RE_IndirectDiffuse_BlinnPhong + +#define Material_LightProbeLOD( material ) (0) diff --git a/lib/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl b/lib/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl new file mode 100644 index 0000000..c726580 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl @@ -0,0 +1,10 @@ +PhysicalMaterial material; +material.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor ); +material.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 ); +#ifdef STANDARD + material.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor ); +#else + material.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor ); + material.clearCoat = saturate( clearCoat ); // Burley clearcoat model + material.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 ); +#endif diff --git a/lib/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl new file mode 100644 index 0000000..32ed0f2 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl @@ -0,0 +1,135 @@ +struct PhysicalMaterial { + + vec3 diffuseColor; + float specularRoughness; + vec3 specularColor; + + #ifndef STANDARD + float clearCoat; + float clearCoatRoughness; + #endif + +}; + +#define MAXIMUM_SPECULAR_COEFFICIENT 0.16 +#define DEFAULT_SPECULAR_COEFFICIENT 0.04 + +// Clear coat directional hemishperical reflectance (this approximation should be improved) +float clearCoatDHRApprox( const in float roughness, const in float dotNL ) { + + return DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) ); + +} + +#if NUM_RECT_AREA_LIGHTS > 0 + + void RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) { + + vec3 normal = geometry.normal; + vec3 viewDir = geometry.viewDir; + vec3 position = geometry.position; + vec3 lightPos = rectAreaLight.position; + vec3 halfWidth = rectAreaLight.halfWidth; + vec3 halfHeight = rectAreaLight.halfHeight; + vec3 lightColor = rectAreaLight.color; + float roughness = material.specularRoughness; + + vec3 rectCoords[ 4 ]; + rectCoords[ 0 ] = lightPos - halfWidth - halfHeight; // counterclockwise + rectCoords[ 1 ] = lightPos + halfWidth - halfHeight; + rectCoords[ 2 ] = lightPos + halfWidth + halfHeight; + rectCoords[ 3 ] = lightPos - halfWidth + halfHeight; + + vec2 uv = LTC_Uv( normal, viewDir, roughness ); + + vec4 t1 = texture2D( ltc_1, uv ); + vec4 t2 = texture2D( ltc_2, 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 = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y ); + + reflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords ); + + reflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords ); + + } + +#endif + +void RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) { + + float dotNL = saturate( dot( geometry.normal, directLight.direction ) ); + + vec3 irradiance = dotNL * directLight.color; + + #ifndef PHYSICALLY_CORRECT_LIGHTS + + irradiance *= PI; // punctual light + + #endif + + #ifndef STANDARD + float clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL ); + #else + float clearCoatDHR = 0.0; + #endif + + reflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness ); + + reflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor ); + + #ifndef STANDARD + + reflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness ); + + #endif + +} + +void RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) { + + reflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor ); + +} + +void RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) { + + #ifndef STANDARD + float dotNV = saturate( dot( geometry.normal, geometry.viewDir ) ); + float dotNL = dotNV; + float clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL ); + #else + float clearCoatDHR = 0.0; + #endif + + reflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness ); + + #ifndef STANDARD + + reflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness ); + + #endif + +} + +#define RE_Direct RE_Direct_Physical +#define RE_Direct_RectArea RE_Direct_RectArea_Physical +#define RE_IndirectDiffuse RE_IndirectDiffuse_Physical +#define RE_IndirectSpecular RE_IndirectSpecular_Physical + +#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness ) +#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness ) + +// 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 ); + +} diff --git a/lib/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl b/lib/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl new file mode 100644 index 0000000..55833fb --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl @@ -0,0 +1,5 @@ +#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT ) + + gl_FragDepthEXT = log2( vFragDepth ) * logDepthBufFC * 0.5; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl new file mode 100644 index 0000000..38b2586 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl @@ -0,0 +1,6 @@ +#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT ) + + uniform float logDepthBufFC; + varying float vFragDepth; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl b/lib/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl new file mode 100644 index 0000000..08da5ad --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl @@ -0,0 +1,13 @@ +#ifdef USE_LOGDEPTHBUF + + #ifdef USE_LOGDEPTHBUF_EXT + + varying float vFragDepth; + + #else + + uniform float logDepthBufFC; + + #endif + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl b/lib/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl new file mode 100644 index 0000000..7c7c852 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl @@ -0,0 +1,15 @@ +#ifdef USE_LOGDEPTHBUF + + #ifdef USE_LOGDEPTHBUF_EXT + + vFragDepth = 1.0 + gl_Position.w; + + #else + + gl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0; + + gl_Position.z *= gl_Position.w; + + #endif + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/map_fragment.glsl b/lib/renderers/shaders/ShaderChunk/map_fragment.glsl new file mode 100644 index 0000000..b5fb51b --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/map_fragment.glsl @@ -0,0 +1,8 @@ +#ifdef USE_MAP + + vec4 texelColor = texture2D( map, vUv ); + + texelColor = mapTexelToLinear( texelColor ); + diffuseColor *= texelColor; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/map_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/map_pars_fragment.glsl new file mode 100644 index 0000000..d9a0346 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/map_pars_fragment.glsl @@ -0,0 +1,5 @@ +#ifdef USE_MAP + + uniform sampler2D map; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/map_particle_fragment.glsl b/lib/renderers/shaders/ShaderChunk/map_particle_fragment.glsl new file mode 100644 index 0000000..65b041f --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/map_particle_fragment.glsl @@ -0,0 +1,7 @@ +#ifdef USE_MAP + + vec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy; + vec4 mapTexel = texture2D( map, uv ); + diffuseColor *= mapTexelToLinear( mapTexel ); + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/map_particle_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/map_particle_pars_fragment.glsl new file mode 100644 index 0000000..8ff8083 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/map_particle_pars_fragment.glsl @@ -0,0 +1,6 @@ +#ifdef USE_MAP + + uniform mat3 uvTransform; + uniform sampler2D map; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/metalnessmap_fragment.glsl b/lib/renderers/shaders/ShaderChunk/metalnessmap_fragment.glsl new file mode 100644 index 0000000..f01ba6f --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/metalnessmap_fragment.glsl @@ -0,0 +1,10 @@ +float metalnessFactor = metalness; + +#ifdef USE_METALNESSMAP + + vec4 texelMetalness = texture2D( metalnessMap, vUv ); + + // reads channel B, compatible with a combined OcclusionRoughnessMetallic (RGB) texture + metalnessFactor *= texelMetalness.b; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/metalnessmap_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/metalnessmap_pars_fragment.glsl new file mode 100644 index 0000000..1d9c869 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/metalnessmap_pars_fragment.glsl @@ -0,0 +1,5 @@ +#ifdef USE_METALNESSMAP + + uniform sampler2D metalnessMap; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl b/lib/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl new file mode 100644 index 0000000..b14763b --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl @@ -0,0 +1,8 @@ +#ifdef USE_MORPHNORMALS + + objectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ]; + objectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ]; + objectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ]; + objectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ]; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl b/lib/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl new file mode 100644 index 0000000..a6664a5 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl @@ -0,0 +1,13 @@ +#ifdef USE_MORPHTARGETS + + #ifndef USE_MORPHNORMALS + + uniform float morphTargetInfluences[ 8 ]; + + #else + + uniform float morphTargetInfluences[ 4 ]; + + #endif + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl b/lib/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl new file mode 100644 index 0000000..baa0d6d --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl @@ -0,0 +1,17 @@ +#ifdef USE_MORPHTARGETS + + transformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ]; + transformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ]; + transformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ]; + transformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ]; + + #ifndef USE_MORPHNORMALS + + transformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ]; + transformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ]; + transformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ]; + transformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ]; + + #endif + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl b/lib/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl new file mode 100644 index 0000000..acc515a --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl @@ -0,0 +1,19 @@ +#ifdef FLAT_SHADED + + // Workaround for Adreno/Nexus5 not able able to do dFdx( vViewPosition ) ... + + vec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) ); + vec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) ); + vec3 normal = normalize( cross( fdx, fdy ) ); + +#else + + vec3 normal = normalize( vNormal ); + + #ifdef DOUBLE_SIDED + + normal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 ); + + #endif + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl b/lib/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl new file mode 100644 index 0000000..5339430 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl @@ -0,0 +1,31 @@ +#ifdef USE_NORMALMAP + + #ifdef OBJECTSPACE_NORMALMAP + + normal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0; // overrides both flatShading and attribute normals + + #ifdef FLIP_SIDED + + normal = - normal; + + #endif + + #ifdef DOUBLE_SIDED + + normal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 ); + + #endif + + normal = normalize( normalMatrix * normal ); + + #else // tangent-space normal map + + normal = perturbNormal2Arb( -vViewPosition, normal ); + + #endif + +#elif defined( USE_BUMPMAP ) + + normal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() ); + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl new file mode 100644 index 0000000..c347018 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl @@ -0,0 +1,42 @@ +#ifdef USE_NORMALMAP + + uniform sampler2D normalMap; + uniform vec2 normalScale; + + #ifdef OBJECTSPACE_NORMALMAP + + uniform mat3 normalMatrix; + + #else + + // Per-Pixel Tangent Space Normal Mapping + // http://hacksoflife.blogspot.ch/2009/11/per-pixel-tangent-space-normal-mapping.html + + vec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) { + + // Workaround for Adreno 3XX dFd*( vec3 ) bug. See #9988 + + vec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) ); + vec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) ); + vec2 st0 = dFdx( vUv.st ); + vec2 st1 = dFdy( vUv.st ); + + float scale = sign( st1.t * st0.s - st0.t * st1.s ); // we do not care about the magnitude + + vec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale ); + vec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale ); + vec3 N = normalize( surf_norm ); + mat3 tsn = mat3( S, T, N ); + + vec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0; + + mapN.xy *= normalScale; + mapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 ); + + return normalize( tsn * mapN ); + + } + + #endif + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/packing.glsl b/lib/renderers/shaders/ShaderChunk/packing.glsl new file mode 100644 index 0000000..24c8e34 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/packing.glsl @@ -0,0 +1,41 @@ +vec3 packNormalToRGB( const in vec3 normal ) { + return normalize( normal ) * 0.5 + 0.5; +} + +vec3 unpackRGBToNormal( const in vec3 rgb ) { + return 2.0 * rgb.xyz - 1.0; +} + +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 ); +} + +// NOTE: viewZ/eyeZ is < 0 when in front of the camera per OpenGL conventions + +float viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) { + return ( viewZ + near ) / ( near - far ); +} +float orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) { + return linearClipZ * ( near - far ) - near; +} + +float viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) { + return (( near + viewZ ) * far ) / (( far - near ) * viewZ ); +} +float perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) { + return ( near * far ) / ( ( far - near ) * invClipZ - far ); +} diff --git a/lib/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl b/lib/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl new file mode 100644 index 0000000..4127319 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl @@ -0,0 +1,6 @@ +#ifdef PREMULTIPLIED_ALPHA + + // Get get normal blending with premultipled, use with CustomBlending, OneFactor, OneMinusSrcAlphaFactor, AddEquation. + gl_FragColor.rgb *= gl_FragColor.a; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/project_vertex.glsl b/lib/renderers/shaders/ShaderChunk/project_vertex.glsl new file mode 100644 index 0000000..32061dd --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/project_vertex.glsl @@ -0,0 +1,3 @@ +vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 ); + +gl_Position = projectionMatrix * mvPosition; diff --git a/lib/renderers/shaders/ShaderChunk/roughnessmap_fragment.glsl b/lib/renderers/shaders/ShaderChunk/roughnessmap_fragment.glsl new file mode 100644 index 0000000..2de0151 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/roughnessmap_fragment.glsl @@ -0,0 +1,10 @@ +float roughnessFactor = roughness; + +#ifdef USE_ROUGHNESSMAP + + vec4 texelRoughness = texture2D( roughnessMap, vUv ); + + // reads channel G, compatible with a combined OcclusionRoughnessMetallic (RGB) texture + roughnessFactor *= texelRoughness.g; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/roughnessmap_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/roughnessmap_pars_fragment.glsl new file mode 100644 index 0000000..0f25712 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/roughnessmap_pars_fragment.glsl @@ -0,0 +1,5 @@ +#ifdef USE_ROUGHNESSMAP + + uniform sampler2D roughnessMap; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl new file mode 100644 index 0000000..5f0c598 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl @@ -0,0 +1,243 @@ +#ifdef USE_SHADOWMAP + + #if NUM_DIR_LIGHTS > 0 + + uniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ]; + varying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ]; + + #endif + + #if NUM_SPOT_LIGHTS > 0 + + uniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ]; + varying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ]; + + #endif + + #if NUM_POINT_LIGHTS > 0 + + uniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ]; + varying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ]; + + #endif + + /* + #if NUM_RECT_AREA_LIGHTS > 0 + + // TODO (abelnation): create uniforms for area light shadows + + #endif + */ + + float texture2DCompare( sampler2D depths, vec2 uv, float compare ) { + + return step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) ); + + } + + float texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) { + + const vec2 offset = vec2( 0.0, 1.0 ); + + vec2 texelSize = vec2( 1.0 ) / size; + vec2 centroidUV = floor( uv * size + 0.5 ) / size; + + float lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare ); + float lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare ); + float rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare ); + float rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare ); + + vec2 f = fract( uv * size + 0.5 ); + + float a = mix( lb, lt, f.y ); + float b = mix( rb, rt, f.y ); + float c = mix( a, b, f.x ); + + return c; + + } + + float getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) { + + float shadow = 1.0; + + shadowCoord.xyz /= shadowCoord.w; + shadowCoord.z += shadowBias; + + // if ( something && something ) breaks ATI OpenGL shader compiler + // if ( all( something, something ) ) using this instead + + 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 ); + + if ( frustumTest ) { + + #if defined( SHADOWMAP_TYPE_PCF ) + + vec2 texelSize = vec2( 1.0 ) / shadowMapSize; + + float dx0 = - texelSize.x * shadowRadius; + float dy0 = - texelSize.y * shadowRadius; + float dx1 = + texelSize.x * shadowRadius; + float dy1 = + texelSize.y * shadowRadius; + + shadow = ( + texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z ) + ) * ( 1.0 / 9.0 ); + + #elif defined( SHADOWMAP_TYPE_PCF_SOFT ) + + vec2 texelSize = vec2( 1.0 ) / shadowMapSize; + + float dx0 = - texelSize.x * shadowRadius; + float dy0 = - texelSize.y * shadowRadius; + float dx1 = + texelSize.x * shadowRadius; + float dy1 = + texelSize.y * shadowRadius; + + shadow = ( + texture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) + + texture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) + + texture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) + + texture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) + + texture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) + + texture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) + + texture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) + + texture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) + + texture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z ) + ) * ( 1.0 / 9.0 ); + + #else // no percentage-closer filtering: + + shadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ); + + #endif + + } + + return shadow; + + } + + // cubeToUV() maps a 3D direction vector suitable for cube texture mapping to a 2D + // vector suitable for 2D texture mapping. This code uses the following layout for the + // 2D texture: + // + // xzXZ + // y Y + // + // Y - Positive y direction + // y - Negative y direction + // X - Positive x direction + // x - Negative x direction + // Z - Positive z direction + // z - Negative z direction + // + // Source and test bed: + // https://gist.github.com/tschw/da10c43c467ce8afd0c4 + + vec2 cubeToUV( vec3 v, float texelSizeY ) { + + // Number of texels to avoid at the edge of each square + + vec3 absV = abs( v ); + + // Intersect unit cube + + float scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) ); + absV *= scaleToCube; + + // Apply scale to avoid seams + + // two texels less per square (one texel will do for NEAREST) + v *= scaleToCube * ( 1.0 - 2.0 * texelSizeY ); + + // Unwrap + + // space: -1 ... 1 range for each square + // + // #X## dim := ( 4 , 2 ) + // # # center := ( 1 , 1 ) + + vec2 planar = v.xy; + + float almostATexel = 1.5 * texelSizeY; + float almostOne = 1.0 - almostATexel; + + if ( absV.z >= almostOne ) { + + if ( v.z > 0.0 ) + planar.x = 4.0 - v.x; + + } else if ( absV.x >= almostOne ) { + + float signX = sign( v.x ); + planar.x = v.z * signX + 2.0 * signX; + + } else if ( absV.y >= almostOne ) { + + float signY = sign( v.y ); + planar.x = v.x + 2.0 * signY + 2.0; + planar.y = v.z * signY - 2.0; + + } + + // Transform to UV space + + // scale := 0.5 / dim + // translate := ( center + 0.5 ) / dim + return vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 ); + + } + + float getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) { + + vec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) ); + + // for point lights, the uniform @vShadowCoord is re-purposed to hold + // the vector from the light to the world-space position of the fragment. + vec3 lightToPosition = shadowCoord.xyz; + + // dp = normalized distance from light to fragment position + float dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear ); // need to clamp? + dp += shadowBias; + + // bd3D = base direction 3D + vec3 bd3D = normalize( lightToPosition ); + + #if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) + + vec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y; + + return ( + texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) + + texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) + + texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) + + texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) + + texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) + + texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) + + texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) + + texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) + + texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp ) + ) * ( 1.0 / 9.0 ); + + #else // no percentage-closer filtering + + return texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ); + + #endif + + } + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl b/lib/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl new file mode 100644 index 0000000..7417a5a --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl @@ -0,0 +1,32 @@ +#ifdef USE_SHADOWMAP + + #if NUM_DIR_LIGHTS > 0 + + uniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ]; + varying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ]; + + #endif + + #if NUM_SPOT_LIGHTS > 0 + + uniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ]; + varying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ]; + + #endif + + #if NUM_POINT_LIGHTS > 0 + + uniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ]; + varying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ]; + + #endif + + /* + #if NUM_RECT_AREA_LIGHTS > 0 + + // TODO (abelnation): uniforms for area light shadows + + #endif + */ + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl b/lib/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl new file mode 100644 index 0000000..c06a680 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl @@ -0,0 +1,44 @@ +#ifdef USE_SHADOWMAP + + #if NUM_DIR_LIGHTS > 0 + + #pragma unroll_loop + for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) { + + vDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition; + + } + + #endif + + #if NUM_SPOT_LIGHTS > 0 + + #pragma unroll_loop + for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) { + + vSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition; + + } + + #endif + + #if NUM_POINT_LIGHTS > 0 + + #pragma unroll_loop + for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) { + + vPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition; + + } + + #endif + + /* + #if NUM_RECT_AREA_LIGHTS > 0 + + // TODO (abelnation): update vAreaShadowCoord with area light info + + #endif + */ + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl new file mode 100644 index 0000000..ea953bc --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl @@ -0,0 +1,61 @@ +float getShadowMask() { + + float shadow = 1.0; + + #ifdef USE_SHADOWMAP + + #if NUM_DIR_LIGHTS > 0 + + DirectionalLight directionalLight; + + #pragma unroll_loop + for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) { + + directionalLight = directionalLights[ i ]; + shadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0; + + } + + #endif + + #if NUM_SPOT_LIGHTS > 0 + + SpotLight spotLight; + + #pragma unroll_loop + for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) { + + spotLight = spotLights[ i ]; + shadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0; + + } + + #endif + + #if NUM_POINT_LIGHTS > 0 + + PointLight pointLight; + + #pragma unroll_loop + for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) { + + pointLight = pointLights[ i ]; + shadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0; + + } + + #endif + + /* + #if NUM_RECT_AREA_LIGHTS > 0 + + // TODO (abelnation): update shadow for Area light + + #endif + */ + + #endif + + return shadow; + +} diff --git a/lib/renderers/shaders/ShaderChunk/skinbase_vertex.glsl b/lib/renderers/shaders/ShaderChunk/skinbase_vertex.glsl new file mode 100644 index 0000000..d1b3d39 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/skinbase_vertex.glsl @@ -0,0 +1,8 @@ +#ifdef USE_SKINNING + + mat4 boneMatX = getBoneMatrix( skinIndex.x ); + mat4 boneMatY = getBoneMatrix( skinIndex.y ); + mat4 boneMatZ = getBoneMatrix( skinIndex.z ); + mat4 boneMatW = getBoneMatrix( skinIndex.w ); + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl b/lib/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl new file mode 100644 index 0000000..65459eb --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl @@ -0,0 +1,46 @@ +#ifdef USE_SKINNING + + 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 diff --git a/lib/renderers/shaders/ShaderChunk/skinning_vertex.glsl b/lib/renderers/shaders/ShaderChunk/skinning_vertex.glsl new file mode 100644 index 0000000..6a116e6 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/skinning_vertex.glsl @@ -0,0 +1,13 @@ +#ifdef USE_SKINNING + + 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; + + transformed = ( bindMatrixInverse * skinned ).xyz; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/skinnormal_vertex.glsl b/lib/renderers/shaders/ShaderChunk/skinnormal_vertex.glsl new file mode 100644 index 0000000..b378a67 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/skinnormal_vertex.glsl @@ -0,0 +1,12 @@ +#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; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/specularmap_fragment.glsl b/lib/renderers/shaders/ShaderChunk/specularmap_fragment.glsl new file mode 100644 index 0000000..8afac60 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/specularmap_fragment.glsl @@ -0,0 +1,12 @@ +float specularStrength; + +#ifdef USE_SPECULARMAP + + vec4 texelSpecular = texture2D( specularMap, vUv ); + specularStrength = texelSpecular.r; + +#else + + specularStrength = 1.0; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/specularmap_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/specularmap_pars_fragment.glsl new file mode 100644 index 0000000..3df2e42 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/specularmap_pars_fragment.glsl @@ -0,0 +1,5 @@ +#ifdef USE_SPECULARMAP + + uniform sampler2D specularMap; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/tonemapping_fragment.glsl b/lib/renderers/shaders/ShaderChunk/tonemapping_fragment.glsl new file mode 100644 index 0000000..ce35d9a --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/tonemapping_fragment.glsl @@ -0,0 +1,5 @@ +#if defined( TONE_MAPPING ) + + gl_FragColor.rgb = toneMapping( gl_FragColor.rgb ); + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl new file mode 100644 index 0000000..f5a8742 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl @@ -0,0 +1,41 @@ +#ifndef saturate + #define saturate(a) clamp( a, 0.0, 1.0 ) +#endif + +uniform float toneMappingExposure; +uniform float toneMappingWhitePoint; + +// exposure only +vec3 LinearToneMapping( vec3 color ) { + + return toneMappingExposure * color; + +} + +// source: https://www.cs.utah.edu/~reinhard/cdrom/ +vec3 ReinhardToneMapping( vec3 color ) { + + color *= toneMappingExposure; + return saturate( color / ( vec3( 1.0 ) + color ) ); + +} + +// source: http://filmicgames.com/archives/75 +#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) ) +vec3 Uncharted2ToneMapping( vec3 color ) { + + // John Hable's filmic operator from Uncharted 2 video game + color *= toneMappingExposure; + return saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) ); + +} + +// source: http://filmicgames.com/archives/75 +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 ) ); + +} diff --git a/lib/renderers/shaders/ShaderChunk/uv2_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/uv2_pars_fragment.glsl new file mode 100644 index 0000000..37274db --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/uv2_pars_fragment.glsl @@ -0,0 +1,5 @@ +#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP ) + + varying vec2 vUv2; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/uv2_pars_vertex.glsl b/lib/renderers/shaders/ShaderChunk/uv2_pars_vertex.glsl new file mode 100644 index 0000000..6aaa13e --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/uv2_pars_vertex.glsl @@ -0,0 +1,6 @@ +#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP ) + + attribute vec2 uv2; + varying vec2 vUv2; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/uv2_vertex.glsl b/lib/renderers/shaders/ShaderChunk/uv2_vertex.glsl new file mode 100644 index 0000000..72d546a --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/uv2_vertex.glsl @@ -0,0 +1,5 @@ +#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP ) + + vUv2 = uv2; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl b/lib/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl new file mode 100644 index 0000000..d1bb954 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl @@ -0,0 +1,5 @@ +#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP ) + + varying vec2 vUv; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl b/lib/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl new file mode 100644 index 0000000..b92d9e5 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl @@ -0,0 +1,6 @@ +#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP ) + + varying vec2 vUv; + uniform mat3 uvTransform; + +#endif diff --git a/lib/renderers/shaders/ShaderChunk/uv_vertex.glsl b/lib/renderers/shaders/ShaderChunk/uv_vertex.glsl new file mode 100644 index 0000000..16a75b0 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/uv_vertex.glsl @@ -0,0 +1,5 @@ +#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP ) + + vUv = ( uvTransform * vec3( uv, 1 ) ).xy; + +#endif \ No newline at end of file diff --git a/lib/renderers/shaders/ShaderChunk/worldpos_vertex.glsl b/lib/renderers/shaders/ShaderChunk/worldpos_vertex.glsl new file mode 100644 index 0000000..daccd25 --- /dev/null +++ b/lib/renderers/shaders/ShaderChunk/worldpos_vertex.glsl @@ -0,0 +1,5 @@ +#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) + + vec4 worldPosition = modelMatrix * vec4( transformed, 1.0 ); + +#endif diff --git a/lib/renderers/shaders/ShaderLib.js b/lib/renderers/shaders/ShaderLib.js new file mode 100644 index 0000000..6292e1c --- /dev/null +++ b/lib/renderers/shaders/ShaderLib.js @@ -0,0 +1,284 @@ +import { ShaderChunk } from './ShaderChunk.js'; +import { UniformsUtils } from './UniformsUtils.js'; +import { Vector3 } from '../../math/Vector3.js'; +import { UniformsLib } from './UniformsLib.js'; +import { Color } from '../../math/Color.js'; + +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + */ + +var ShaderLib = { + + basic: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.meshbasic_vert, + fragmentShader: ShaderChunk.meshbasic_frag + + }, + + lambert: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) } + } + ] ), + + vertexShader: ShaderChunk.meshlambert_vert, + fragmentShader: ShaderChunk.meshlambert_frag + + }, + + phong: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.gradientmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) }, + specular: { value: new Color( 0x111111 ) }, + shininess: { value: 30 } + } + ] ), + + vertexShader: ShaderChunk.meshphong_vert, + fragmentShader: ShaderChunk.meshphong_frag + + }, + + standard: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.roughnessmap, + UniformsLib.metalnessmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) }, + roughness: { value: 0.5 }, + metalness: { value: 0.5 }, + envMapIntensity: { value: 1 } // temporary + } + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + + }, + + matcap: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.fog, + { + matcap: { value: null } + } + ] ), + + vertexShader: ShaderChunk.meshmatcap_vert, + fragmentShader: ShaderChunk.meshmatcap_frag + + }, + + points: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.points, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.points_vert, + fragmentShader: ShaderChunk.points_frag + + }, + + dashed: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.fog, + { + scale: { value: 1 }, + dashSize: { value: 1 }, + totalSize: { value: 2 } + } + ] ), + + vertexShader: ShaderChunk.linedashed_vert, + fragmentShader: ShaderChunk.linedashed_frag + + }, + + depth: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.displacementmap + ] ), + + vertexShader: ShaderChunk.depth_vert, + fragmentShader: ShaderChunk.depth_frag + + }, + + normal: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + { + opacity: { value: 1.0 } + } + ] ), + + vertexShader: ShaderChunk.normal_vert, + fragmentShader: ShaderChunk.normal_frag + + }, + + sprite: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.sprite, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.sprite_vert, + fragmentShader: ShaderChunk.sprite_frag + + }, + + background: { + + uniforms: { + t2D: { value: null }, + }, + + vertexShader: ShaderChunk.background_vert, + fragmentShader: ShaderChunk.background_frag + + }, + /* ------------------------------------------------------------------------- + // Cube map shader + ------------------------------------------------------------------------- */ + + cube: { + + uniforms: { + tCube: { value: null }, + tFlip: { value: - 1 }, + opacity: { value: 1.0 } + }, + + vertexShader: ShaderChunk.cube_vert, + fragmentShader: ShaderChunk.cube_frag + + }, + + equirect: { + + uniforms: { + tEquirect: { value: null }, + }, + + vertexShader: ShaderChunk.equirect_vert, + fragmentShader: ShaderChunk.equirect_frag + + }, + + distanceRGBA: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.displacementmap, + { + referencePosition: { value: new Vector3() }, + nearDistance: { value: 1 }, + farDistance: { value: 1000 } + } + ] ), + + vertexShader: ShaderChunk.distanceRGBA_vert, + fragmentShader: ShaderChunk.distanceRGBA_frag + + }, + + shadow: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.lights, + UniformsLib.fog, + { + color: { value: new Color( 0x00000 ) }, + opacity: { value: 1.0 } + }, + ] ), + + vertexShader: ShaderChunk.shadow_vert, + fragmentShader: ShaderChunk.shadow_frag + + } + +}; + +ShaderLib.physical = { + + uniforms: UniformsUtils.merge( [ + ShaderLib.standard.uniforms, + { + clearCoat: { value: 0 }, + clearCoatRoughness: { value: 0 } + } + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + +}; + + +export { ShaderLib }; diff --git a/lib/renderers/shaders/ShaderLib/background_frag.glsl b/lib/renderers/shaders/ShaderLib/background_frag.glsl new file mode 100644 index 0000000..2428b5a --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/background_frag.glsl @@ -0,0 +1,9 @@ +uniform sampler2D t2D; + +varying vec2 vUv; + +void main() { + + gl_FragColor = texture2D( t2D, vUv ); + +} diff --git a/lib/renderers/shaders/ShaderLib/background_vert.glsl b/lib/renderers/shaders/ShaderLib/background_vert.glsl new file mode 100644 index 0000000..19fd839 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/background_vert.glsl @@ -0,0 +1,10 @@ +varying vec2 vUv; + +void main() { + + vUv = uv; + + gl_Position = vec4( position, 1.0 ); + gl_Position.z = 1.0; + +} diff --git a/lib/renderers/shaders/ShaderLib/cube_frag.glsl b/lib/renderers/shaders/ShaderLib/cube_frag.glsl new file mode 100644 index 0000000..4b8a499 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/cube_frag.glsl @@ -0,0 +1,12 @@ +uniform samplerCube tCube; +uniform float tFlip; +uniform float opacity; + +varying vec3 vWorldDirection; + +void main() { + + gl_FragColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) ); + gl_FragColor.a *= opacity; + +} diff --git a/lib/renderers/shaders/ShaderLib/cube_vert.glsl b/lib/renderers/shaders/ShaderLib/cube_vert.glsl new file mode 100644 index 0000000..86df047 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/cube_vert.glsl @@ -0,0 +1,14 @@ +varying vec3 vWorldDirection; + +#include + +void main() { + + vWorldDirection = transformDirection( position, modelMatrix ); + + #include + #include + + gl_Position.z = gl_Position.w; // set z to camera.far + +} diff --git a/lib/renderers/shaders/ShaderLib/depth_frag.glsl b/lib/renderers/shaders/ShaderLib/depth_frag.glsl new file mode 100644 index 0000000..d53113e --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/depth_frag.glsl @@ -0,0 +1,43 @@ +#if DEPTH_PACKING == 3200 + + uniform float opacity; + +#endif + +#include +#include +#include +#include +#include +#include +#include + +void main() { + + #include + + vec4 diffuseColor = vec4( 1.0 ); + + #if DEPTH_PACKING == 3200 + + diffuseColor.a = opacity; + + #endif + + #include + #include + #include + + #include + + #if DEPTH_PACKING == 3200 + + gl_FragColor = vec4( vec3( 1.0 - gl_FragCoord.z ), opacity ); + + #elif DEPTH_PACKING == 3201 + + gl_FragColor = packDepthToRGBA( gl_FragCoord.z ); + + #endif + +} diff --git a/lib/renderers/shaders/ShaderLib/depth_vert.glsl b/lib/renderers/shaders/ShaderLib/depth_vert.glsl new file mode 100644 index 0000000..edf12fb --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/depth_vert.glsl @@ -0,0 +1,31 @@ +#include +#include +#include +#include +#include +#include +#include + +void main() { + + #include + + #include + + #ifdef USE_DISPLACEMENTMAP + + #include + #include + #include + + #endif + + #include + #include + #include + #include + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/distanceRGBA_frag.glsl b/lib/renderers/shaders/ShaderLib/distanceRGBA_frag.glsl new file mode 100644 index 0000000..8dbf8f4 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/distanceRGBA_frag.glsl @@ -0,0 +1,31 @@ +#define DISTANCE + +uniform vec3 referencePosition; +uniform float nearDistance; +uniform float farDistance; +varying vec3 vWorldPosition; + +#include +#include +#include +#include +#include +#include + +void main () { + + #include + + vec4 diffuseColor = vec4( 1.0 ); + + #include + #include + #include + + float dist = length( vWorldPosition - referencePosition ); + dist = ( dist - nearDistance ) / ( farDistance - nearDistance ); + dist = saturate( dist ); // clamp to [ 0, 1 ] + + gl_FragColor = packDepthToRGBA( dist ); + +} diff --git a/lib/renderers/shaders/ShaderLib/distanceRGBA_vert.glsl b/lib/renderers/shaders/ShaderLib/distanceRGBA_vert.glsl new file mode 100644 index 0000000..abecdef --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/distanceRGBA_vert.glsl @@ -0,0 +1,36 @@ +#define DISTANCE + +varying vec3 vWorldPosition; + +#include +#include +#include +#include +#include +#include + +void main() { + + #include + + #include + + #ifdef USE_DISPLACEMENTMAP + + #include + #include + #include + + #endif + + #include + #include + #include + #include + #include + #include + #include + + vWorldPosition = worldPosition.xyz; + +} diff --git a/lib/renderers/shaders/ShaderLib/equirect_frag.glsl b/lib/renderers/shaders/ShaderLib/equirect_frag.glsl new file mode 100644 index 0000000..eaf2ff2 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/equirect_frag.glsl @@ -0,0 +1,19 @@ +uniform sampler2D tEquirect; + +varying vec3 vWorldDirection; + +#include + +void main() { + + vec3 direction = normalize( vWorldDirection ); + + vec2 sampleUV; + + sampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5; + + sampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5; + + gl_FragColor = texture2D( tEquirect, sampleUV ); + +} diff --git a/lib/renderers/shaders/ShaderLib/equirect_vert.glsl b/lib/renderers/shaders/ShaderLib/equirect_vert.glsl new file mode 100644 index 0000000..da1dfcb --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/equirect_vert.glsl @@ -0,0 +1,12 @@ +varying vec3 vWorldDirection; + +#include + +void main() { + + vWorldDirection = transformDirection( position, modelMatrix ); + + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/linedashed_frag.glsl b/lib/renderers/shaders/ShaderLib/linedashed_frag.glsl new file mode 100644 index 0000000..3c93173 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/linedashed_frag.glsl @@ -0,0 +1,40 @@ +uniform vec3 diffuse; +uniform float opacity; + +uniform float dashSize; +uniform float totalSize; + +varying float vLineDistance; + +#include +#include +#include +#include +#include + +void main() { + + #include + + if ( mod( vLineDistance, totalSize ) > dashSize ) { + + discard; + + } + + vec3 outgoingLight = vec3( 0.0 ); + vec4 diffuseColor = vec4( diffuse, opacity ); + + #include + #include + + outgoingLight = diffuseColor.rgb; // simple shader + + gl_FragColor = vec4( outgoingLight, diffuseColor.a ); + + #include + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/linedashed_vert.glsl b/lib/renderers/shaders/ShaderLib/linedashed_vert.glsl new file mode 100644 index 0000000..5d7057d --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/linedashed_vert.glsl @@ -0,0 +1,25 @@ +uniform float scale; +attribute float lineDistance; + +varying float vLineDistance; + +#include +#include +#include +#include +#include + +void main() { + + #include + + vLineDistance = scale * lineDistance; + + vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 ); + gl_Position = projectionMatrix * mvPosition; + + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/meshbasic_frag.glsl b/lib/renderers/shaders/ShaderLib/meshbasic_frag.glsl new file mode 100644 index 0000000..f0bc539 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/meshbasic_frag.glsl @@ -0,0 +1,66 @@ +uniform vec3 diffuse; +uniform float opacity; + +#ifndef FLAT_SHADED + + varying vec3 vNormal; + +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void main() { + + #include + + vec4 diffuseColor = vec4( diffuse, opacity ); + + #include + #include + #include + #include + #include + #include + + ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); + + // accumulation (baked indirect lighting only) + #ifdef USE_LIGHTMAP + + reflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity; + + #else + + reflectedLight.indirectDiffuse += vec3( 1.0 ); + + #endif + + // modulation + #include + + reflectedLight.indirectDiffuse *= diffuseColor.rgb; + + vec3 outgoingLight = reflectedLight.indirectDiffuse; + + #include + + gl_FragColor = vec4( outgoingLight, diffuseColor.a ); + + #include + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/meshbasic_vert.glsl b/lib/renderers/shaders/ShaderLib/meshbasic_vert.glsl new file mode 100644 index 0000000..20f3c15 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/meshbasic_vert.glsl @@ -0,0 +1,39 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void main() { + + #include + #include + #include + #include + + #ifdef USE_ENVMAP + + #include + #include + #include + #include + + #endif + + #include + #include + #include + #include + #include + + #include + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/meshlambert_frag.glsl b/lib/renderers/shaders/ShaderLib/meshlambert_frag.glsl new file mode 100644 index 0000000..5f1c222 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/meshlambert_frag.glsl @@ -0,0 +1,84 @@ +uniform vec3 diffuse; +uniform vec3 emissive; +uniform float opacity; + +varying vec3 vLightFront; + +#ifdef DOUBLE_SIDED + + varying vec3 vLightBack; + +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void main() { + + #include + + vec4 diffuseColor = vec4( diffuse, opacity ); + ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); + vec3 totalEmissiveRadiance = emissive; + + #include + #include + #include + #include + #include + #include + #include + + // accumulation + reflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor ); + + #include + + reflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ); + + #ifdef DOUBLE_SIDED + + reflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack; + + #else + + reflectedLight.directDiffuse = vLightFront; + + #endif + + reflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask(); + + // modulation + #include + + vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance; + + #include + + gl_FragColor = vec4( outgoingLight, diffuseColor.a ); + + #include + #include + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/meshlambert_vert.glsl b/lib/renderers/shaders/ShaderLib/meshlambert_vert.glsl new file mode 100644 index 0000000..77b2a61 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/meshlambert_vert.glsl @@ -0,0 +1,50 @@ +#define LAMBERT + +varying vec3 vLightFront; + +#ifdef DOUBLE_SIDED + + varying vec3 vLightBack; + +#endif + +#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 + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/meshmatcap_frag.glsl b/lib/renderers/shaders/ShaderLib/meshmatcap_frag.glsl new file mode 100644 index 0000000..a370091 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/meshmatcap_frag.glsl @@ -0,0 +1,57 @@ +#define MATCAP + +uniform vec3 diffuse; +uniform float opacity; +uniform sampler2D matcap; + +varying vec3 vViewPosition; + +#ifndef FLAT_SHADED + + varying vec3 vNormal; + +#endif + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +void main() { + + #include + + vec4 diffuseColor = vec4( diffuse, opacity ); + + #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 ); + vec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5; // 0.495 to remove artifacts caused by undersized matcap disks + + vec4 matcapColor = texture2D( matcap, uv ); + + matcapColor = matcapTexelToLinear( matcapColor ); + + vec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb; + + gl_FragColor = vec4( outgoingLight, diffuseColor.a ); + + #include + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/meshmatcap_vert.glsl b/lib/renderers/shaders/ShaderLib/meshmatcap_vert.glsl new file mode 100644 index 0000000..04de25d --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/meshmatcap_vert.glsl @@ -0,0 +1,49 @@ +#define MATCAP + +varying vec3 vViewPosition; + +#ifndef FLAT_SHADED + + varying vec3 vNormal; + +#endif + +#include +#include +#include +#include +#include +#include + +#include +#include + +void main() { + + #include + + #include + #include + #include + #include + #include + + #ifndef FLAT_SHADED // Normal computed with derivatives when FLAT_SHADED + + vNormal = normalize( transformedNormal ); + + #endif + + #include + #include + #include + #include + #include + + #include + #include + #include + + vViewPosition = - mvPosition.xyz; + +} diff --git a/lib/renderers/shaders/ShaderLib/meshphong_frag.glsl b/lib/renderers/shaders/ShaderLib/meshphong_frag.glsl new file mode 100644 index 0000000..57c8239 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/meshphong_frag.glsl @@ -0,0 +1,72 @@ +#define PHONG + +uniform vec3 diffuse; +uniform vec3 emissive; +uniform vec3 specular; +uniform float shininess; +uniform float opacity; + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void main() { + + #include + + vec4 diffuseColor = vec4( diffuse, opacity ); + ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); + vec3 totalEmissiveRadiance = emissive; + + #include + #include + #include + #include + #include + #include + #include + #include + #include + + // accumulation + #include + #include + #include + #include + + // modulation + #include + + vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance; + + #include + + gl_FragColor = vec4( outgoingLight, diffuseColor.a ); + + #include + #include + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/meshphong_vert.glsl b/lib/renderers/shaders/ShaderLib/meshphong_vert.glsl new file mode 100644 index 0000000..e79d5fe --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/meshphong_vert.glsl @@ -0,0 +1,57 @@ +#define PHONG + +varying vec3 vViewPosition; + +#ifndef FLAT_SHADED + + varying vec3 vNormal; + +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void main() { + + #include + #include + #include + + #include + #include + #include + #include + #include + +#ifndef FLAT_SHADED // Normal computed with derivatives when FLAT_SHADED + + vNormal = normalize( transformedNormal ); + +#endif + + #include + #include + #include + #include + #include + #include + #include + + vViewPosition = - mvPosition.xyz; + + #include + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/meshphysical_frag.glsl b/lib/renderers/shaders/ShaderLib/meshphysical_frag.glsl new file mode 100644 index 0000000..a428ebd --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/meshphysical_frag.glsl @@ -0,0 +1,86 @@ +#define PHYSICAL + +uniform vec3 diffuse; +uniform vec3 emissive; +uniform float roughness; +uniform float metalness; +uniform float opacity; + +#ifndef STANDARD + uniform float clearCoat; + uniform float clearCoatRoughness; +#endif + +varying vec3 vViewPosition; + +#ifndef FLAT_SHADED + + varying vec3 vNormal; + +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void main() { + + #include + + vec4 diffuseColor = vec4( diffuse, opacity ); + ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); + vec3 totalEmissiveRadiance = emissive; + + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + + // accumulation + #include + #include + #include + #include + + // modulation + #include + + vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance; + + gl_FragColor = vec4( outgoingLight, diffuseColor.a ); + + #include + #include + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/meshphysical_vert.glsl b/lib/renderers/shaders/ShaderLib/meshphysical_vert.glsl new file mode 100644 index 0000000..4dbc2d4 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/meshphysical_vert.glsl @@ -0,0 +1,55 @@ +#define PHYSICAL + +varying vec3 vViewPosition; + +#ifndef FLAT_SHADED + + varying vec3 vNormal; + +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void main() { + + #include + #include + #include + + #include + #include + #include + #include + #include + +#ifndef FLAT_SHADED // Normal computed with derivatives when FLAT_SHADED + + vNormal = normalize( transformedNormal ); + +#endif + + #include + #include + #include + #include + #include + #include + #include + + vViewPosition = - mvPosition.xyz; + + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/normal_frag.glsl b/lib/renderers/shaders/ShaderLib/normal_frag.glsl new file mode 100644 index 0000000..88a2c43 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/normal_frag.glsl @@ -0,0 +1,31 @@ +#define NORMAL + +uniform float opacity; + +#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) ) + + varying vec3 vViewPosition; + +#endif + +#ifndef FLAT_SHADED + + varying vec3 vNormal; + +#endif + +#include +#include +#include +#include +#include + +void main() { + + #include + #include + #include + + gl_FragColor = vec4( packNormalToRGB( normal ), opacity ); + +} diff --git a/lib/renderers/shaders/ShaderLib/normal_vert.glsl b/lib/renderers/shaders/ShaderLib/normal_vert.glsl new file mode 100644 index 0000000..131edc6 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/normal_vert.glsl @@ -0,0 +1,50 @@ +#define NORMAL + +#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) ) + + varying vec3 vViewPosition; + +#endif + +#ifndef FLAT_SHADED + + varying vec3 vNormal; + +#endif + +#include +#include +#include +#include +#include + +void main() { + + #include + + #include + #include + #include + #include + #include + +#ifndef FLAT_SHADED // Normal computed with derivatives when FLAT_SHADED + + vNormal = normalize( transformedNormal ); + +#endif + + #include + #include + #include + #include + #include + #include + +#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) ) + + vViewPosition = - mvPosition.xyz; + +#endif + +} diff --git a/lib/renderers/shaders/ShaderLib/points_frag.glsl b/lib/renderers/shaders/ShaderLib/points_frag.glsl new file mode 100644 index 0000000..c891d0f --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/points_frag.glsl @@ -0,0 +1,32 @@ +uniform vec3 diffuse; +uniform float opacity; + +#include +#include +#include +#include +#include +#include + +void main() { + + #include + + vec3 outgoingLight = vec3( 0.0 ); + vec4 diffuseColor = vec4( diffuse, opacity ); + + #include + #include + #include + #include + + outgoingLight = diffuseColor.rgb; + + gl_FragColor = vec4( outgoingLight, diffuseColor.a ); + + #include + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/points_vert.glsl b/lib/renderers/shaders/ShaderLib/points_vert.glsl new file mode 100644 index 0000000..9526b76 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/points_vert.glsl @@ -0,0 +1,33 @@ +uniform float size; +uniform float scale; + +#include +#include +#include +#include +#include +#include + +void main() { + + #include + #include + #include + #include + + gl_PointSize = size; + + #ifdef USE_SIZEATTENUATION + + bool isPerspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 ); + + if ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z ); + + #endif + + #include + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/shadow_frag.glsl b/lib/renderers/shaders/ShaderLib/shadow_frag.glsl new file mode 100644 index 0000000..67ead61 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/shadow_frag.glsl @@ -0,0 +1,18 @@ +uniform vec3 color; +uniform float opacity; + +#include +#include +#include +#include +#include +#include +#include + +void main() { + + gl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) ); + + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/shadow_vert.glsl b/lib/renderers/shaders/ShaderLib/shadow_vert.glsl new file mode 100644 index 0000000..82fe4dd --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/shadow_vert.glsl @@ -0,0 +1,12 @@ +#include +#include + +void main() { + + #include + #include + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/sprite_frag.glsl b/lib/renderers/shaders/ShaderLib/sprite_frag.glsl new file mode 100644 index 0000000..5ca65b6 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/sprite_frag.glsl @@ -0,0 +1,30 @@ +uniform vec3 diffuse; +uniform float opacity; + +#include +#include +#include +#include +#include +#include + +void main() { + + #include + + vec3 outgoingLight = vec3( 0.0 ); + vec4 diffuseColor = vec4( diffuse, opacity ); + + #include + #include + #include + + outgoingLight = diffuseColor.rgb; + + gl_FragColor = vec4( outgoingLight, diffuseColor.a ); + + #include + #include + #include + +} diff --git a/lib/renderers/shaders/ShaderLib/sprite_vert.glsl b/lib/renderers/shaders/ShaderLib/sprite_vert.glsl new file mode 100644 index 0000000..aeb3e51 --- /dev/null +++ b/lib/renderers/shaders/ShaderLib/sprite_vert.glsl @@ -0,0 +1,42 @@ +uniform float rotation; +uniform vec2 center; + +#include +#include +#include +#include +#include + +void main() { + + #include + + vec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 ); + + vec2 scale; + scale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) ); + scale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) ); + + #ifndef USE_SIZEATTENUATION + + bool isPerspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 ); + + 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 = projectionMatrix * mvPosition; + + #include + #include + #include + +} diff --git a/lib/renderers/shaders/UniformsLib.js b/lib/renderers/shaders/UniformsLib.js new file mode 100644 index 0000000..47b859b --- /dev/null +++ b/lib/renderers/shaders/UniformsLib.js @@ -0,0 +1,200 @@ +import { Color } from '../../math/Color.js'; +import { Vector2 } from '../../math/Vector2.js'; +import { Matrix3 } from '../../math/Matrix3.js'; + +/** + * Uniforms library for shared webgl shaders + */ + +var UniformsLib = { + + common: { + + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + + map: { value: null }, + uvTransform: { value: new Matrix3() }, + + alphaMap: { value: null }, + + }, + + specularmap: { + + specularMap: { value: null }, + + }, + + envmap: { + + envMap: { value: null }, + flipEnvMap: { value: - 1 }, + reflectivity: { value: 1.0 }, + refractionRatio: { value: 0.98 }, + maxMipLevel: { value: 0 } + + }, + + aomap: { + + aoMap: { value: null }, + aoMapIntensity: { value: 1 } + + }, + + lightmap: { + + lightMap: { value: null }, + lightMapIntensity: { value: 1 } + + }, + + emissivemap: { + + emissiveMap: { value: null } + + }, + + bumpmap: { + + bumpMap: { value: null }, + bumpScale: { value: 1 } + + }, + + normalmap: { + + normalMap: { value: null }, + normalScale: { value: new Vector2( 1, 1 ) } + + }, + + displacementmap: { + + displacementMap: { value: null }, + displacementScale: { value: 1 }, + displacementBias: { value: 0 } + + }, + + roughnessmap: { + + roughnessMap: { value: null } + + }, + + metalnessmap: { + + metalnessMap: { value: null } + + }, + + gradientmap: { + + gradientMap: { value: null } + + }, + + fog: { + + fogDensity: { value: 0.00025 }, + fogNear: { value: 1 }, + fogFar: { value: 2000 }, + fogColor: { value: new Color( 0xffffff ) } + + }, + + lights: { + + ambientLightColor: { value: [] }, + + directionalLights: { value: [], properties: { + direction: {}, + color: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + directionalShadowMap: { value: [] }, + directionalShadowMatrix: { value: [] }, + + spotLights: { value: [], properties: { + color: {}, + position: {}, + direction: {}, + distance: {}, + coneCos: {}, + penumbraCos: {}, + decay: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + spotShadowMap: { value: [] }, + spotShadowMatrix: { value: [] }, + + pointLights: { value: [], properties: { + color: {}, + position: {}, + decay: {}, + distance: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {}, + shadowCameraNear: {}, + shadowCameraFar: {} + } }, + + pointShadowMap: { value: [] }, + pointShadowMatrix: { value: [] }, + + hemisphereLights: { value: [], properties: { + direction: {}, + skyColor: {}, + groundColor: {} + } }, + + // TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src + rectAreaLights: { value: [], properties: { + color: {}, + position: {}, + width: {}, + height: {} + } } + + }, + + points: { + + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + size: { value: 1.0 }, + scale: { value: 1.0 }, + map: { value: null }, + uvTransform: { value: new Matrix3() } + + }, + + sprite: { + + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + center: { value: new Vector2( 0.5, 0.5 ) }, + rotation: { value: 0.0 }, + map: { value: null }, + uvTransform: { value: new Matrix3() } + + } + +}; + +export { UniformsLib }; diff --git a/lib/renderers/shaders/UniformsUtils.js b/lib/renderers/shaders/UniformsUtils.js new file mode 100644 index 0000000..8e31adb --- /dev/null +++ b/lib/renderers/shaders/UniformsUtils.js @@ -0,0 +1,67 @@ +/** + * Uniform Utilities + */ + +var UniformsUtils = { + + merge: function ( uniforms ) { + + var merged = {}; + + for ( var u = 0; u < uniforms.length; u ++ ) { + + var tmp = this.clone( uniforms[ u ] ); + + for ( var p in tmp ) { + + merged[ p ] = tmp[ p ]; + + } + + } + + return merged; + + }, + + clone: function ( uniforms_src ) { + + var uniforms_dst = {}; + + for ( var u in uniforms_src ) { + + uniforms_dst[ u ] = {}; + + for ( var p in uniforms_src[ u ] ) { + + var parameter_src = uniforms_src[ u ][ p ]; + + if ( parameter_src && ( parameter_src.isColor || + parameter_src.isMatrix3 || parameter_src.isMatrix4 || + parameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 || + parameter_src.isTexture ) ) { + + uniforms_dst[ u ][ p ] = parameter_src.clone(); + + } else if ( Array.isArray( parameter_src ) ) { + + uniforms_dst[ u ][ p ] = parameter_src.slice(); + + } else { + + uniforms_dst[ u ][ p ] = parameter_src; + + } + + } + + } + + return uniforms_dst; + + } + +}; + + +export { UniformsUtils }; diff --git a/lib/renderers/webgl/WebGLAnimation.js b/lib/renderers/webgl/WebGLAnimation.js new file mode 100644 index 0000000..3943d99 --- /dev/null +++ b/lib/renderers/webgl/WebGLAnimation.js @@ -0,0 +1,56 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function WebGLAnimation() { + + var context = null; + var isAnimating = false; + var animationLoop = null; + + function onAnimationFrame( time, frame ) { + + if ( isAnimating === false ) return; + + animationLoop( time, frame ); + + context.requestAnimationFrame( onAnimationFrame ); + + } + + return { + + start: function () { + + if ( isAnimating === true ) return; + if ( animationLoop === null ) return; + + context.requestAnimationFrame( onAnimationFrame ); + + isAnimating = true; + + }, + + stop: function () { + + isAnimating = false; + + }, + + setAnimationLoop: function ( callback ) { + + animationLoop = callback; + + }, + + setContext: function ( value ) { + + context = value; + + } + + }; + +} + +export { WebGLAnimation }; diff --git a/lib/renderers/webgl/WebGLAttributes.js b/lib/renderers/webgl/WebGLAttributes.js new file mode 100644 index 0000000..586ef58 --- /dev/null +++ b/lib/renderers/webgl/WebGLAttributes.js @@ -0,0 +1,155 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function WebGLAttributes( gl ) { + + var buffers = new WeakMap(); + + function createBuffer( attribute, bufferType ) { + + var array = attribute.array; + var usage = attribute.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW; + + var buffer = gl.createBuffer(); + + gl.bindBuffer( bufferType, buffer ); + gl.bufferData( bufferType, array, usage ); + + attribute.onUploadCallback(); + + var type = gl.FLOAT; + + if ( array instanceof Float32Array ) { + + type = gl.FLOAT; + + } else if ( array instanceof Float64Array ) { + + console.warn( 'THREE.WebGLAttributes: 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; + + } + + return { + buffer: buffer, + type: type, + bytesPerElement: array.BYTES_PER_ELEMENT, + version: attribute.version + }; + + } + + function updateBuffer( buffer, attribute, bufferType ) { + + var array = attribute.array; + var updateRange = attribute.updateRange; + + gl.bindBuffer( bufferType, buffer ); + + if ( attribute.dynamic === false ) { + + gl.bufferData( bufferType, array, gl.STATIC_DRAW ); + + } else if ( updateRange.count === - 1 ) { + + // Not using update ranges + + gl.bufferSubData( bufferType, 0, array ); + + } else if ( updateRange.count === 0 ) { + + console.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' ); + + } else { + + gl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT, + array.subarray( updateRange.offset, updateRange.offset + updateRange.count ) ); + + updateRange.count = - 1; // reset range + + } + + } + + // + + function get( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + return buffers.get( attribute ); + + } + + function remove( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + var data = buffers.get( attribute ); + + if ( data ) { + + gl.deleteBuffer( data.buffer ); + + buffers.delete( attribute ); + + } + + } + + function update( attribute, bufferType ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + var data = buffers.get( attribute ); + + if ( data === undefined ) { + + buffers.set( attribute, createBuffer( attribute, bufferType ) ); + + } else if ( data.version < attribute.version ) { + + updateBuffer( data.buffer, attribute, bufferType ); + + data.version = attribute.version; + + } + + } + + return { + + get: get, + remove: remove, + update: update + + }; + +} + + +export { WebGLAttributes }; diff --git a/lib/renderers/webgl/WebGLBackground.js b/lib/renderers/webgl/WebGLBackground.js new file mode 100644 index 0000000..9f7dcb5 --- /dev/null +++ b/lib/renderers/webgl/WebGLBackground.js @@ -0,0 +1,149 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { BackSide, FrontSide } from '../../constants.js'; +import { BoxBufferGeometry } from '../../geometries/BoxGeometry.js'; +import { PlaneBufferGeometry } from '../../geometries/PlaneGeometry.js'; +import { ShaderMaterial } from '../../materials/ShaderMaterial.js'; +import { Color } from '../../math/Color.js'; +import { Mesh } from '../../objects/Mesh.js'; +import { ShaderLib } from '../shaders/ShaderLib.js'; +import { UniformsUtils } from '../shaders/UniformsUtils.js'; + +function WebGLBackground( renderer, state, objects, premultipliedAlpha ) { + + var clearColor = new Color( 0x000000 ); + var clearAlpha = 0; + + var planeMesh; + var boxMesh; + + function render( renderList, scene, camera, forceClear ) { + + var background = scene.background; + + if ( background === null ) { + + setClear( clearColor, clearAlpha ); + + } else if ( background && background.isColor ) { + + setClear( background, 1 ); + forceClear = true; + + } + + if ( renderer.autoClear || forceClear ) { + + renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil ); + + } + + if ( background && ( background.isCubeTexture || background.isWebGLRenderTargetCube ) ) { + + if ( boxMesh === undefined ) { + + boxMesh = new Mesh( + new BoxBufferGeometry( 1, 1, 1 ), + new ShaderMaterial( { + uniforms: UniformsUtils.clone( ShaderLib.cube.uniforms ), + vertexShader: ShaderLib.cube.vertexShader, + fragmentShader: ShaderLib.cube.fragmentShader, + side: BackSide, + depthTest: true, + depthWrite: false, + fog: false + } ) + ); + + boxMesh.geometry.removeAttribute( 'normal' ); + boxMesh.geometry.removeAttribute( 'uv' ); + + boxMesh.onBeforeRender = function ( renderer, scene, camera ) { + + this.matrixWorld.copyPosition( camera.matrixWorld ); + + }; + + objects.update( boxMesh ); + + } + + boxMesh.material.uniforms.tCube.value = ( background.isWebGLRenderTargetCube ) ? background.texture : background; + boxMesh.material.uniforms.tFlip.value = ( background.isWebGLRenderTargetCube ) ? 1 : - 1; + + // push to the pre-sorted opaque render list + renderList.push( boxMesh, boxMesh.geometry, boxMesh.material, 0, null ); + + } else if ( background && background.isTexture ) { + + if ( planeMesh === undefined ) { + + planeMesh = new Mesh( + new PlaneBufferGeometry( 2, 2 ), + new ShaderMaterial( { + uniforms: UniformsUtils.clone( ShaderLib.background.uniforms ), + vertexShader: ShaderLib.background.vertexShader, + fragmentShader: ShaderLib.background.fragmentShader, + side: FrontSide, + depthTest: true, + depthWrite: false, + fog: false + } ) + ); + + planeMesh.geometry.removeAttribute( 'normal' ); + + objects.update( planeMesh ); + + } + + planeMesh.material.uniforms.t2D.value = background; + + // push to the pre-sorted opaque render list + renderList.push( planeMesh, planeMesh.geometry, planeMesh.material, 0, null ); + + } + + } + + function setClear( color, alpha ) { + + state.buffers.color.setClear( color.r, color.g, color.b, alpha, premultipliedAlpha ); + + } + + return { + + getClearColor: function () { + + return clearColor; + + }, + setClearColor: function ( color, alpha ) { + + clearColor.set( color ); + clearAlpha = alpha !== undefined ? alpha : 1; + setClear( clearColor, clearAlpha ); + + }, + getClearAlpha: function () { + + return clearAlpha; + + }, + setClearAlpha: function ( alpha ) { + + clearAlpha = alpha; + setClear( clearColor, clearAlpha ); + + }, + render: render + + }; + +} + + +export { WebGLBackground }; diff --git a/lib/renderers/webgl/WebGLBufferRenderer.js b/lib/renderers/webgl/WebGLBufferRenderer.js new file mode 100644 index 0000000..2978c56 --- /dev/null +++ b/lib/renderers/webgl/WebGLBufferRenderer.js @@ -0,0 +1,59 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function WebGLBufferRenderer( gl, extensions, info, capabilities ) { + + var mode; + + function setMode( value ) { + + mode = value; + + } + + function render( start, count ) { + + gl.drawArrays( mode, start, count ); + + info.update( count, mode ); + + } + + function renderInstances( geometry, start, count ) { + + var extension; + + if ( capabilities.isWebGL2 ) { + + extension = gl; + + } else { + + extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + } + + extension[ capabilities.isWebGL2 ? 'drawArraysInstanced' : 'drawArraysInstancedANGLE' ]( mode, start, count, geometry.maxInstancedCount ); + + info.update( count, mode, geometry.maxInstancedCount ); + + } + + // + + this.setMode = setMode; + this.render = render; + this.renderInstances = renderInstances; + +} + + +export { WebGLBufferRenderer }; diff --git a/lib/renderers/webgl/WebGLCapabilities.js b/lib/renderers/webgl/WebGLCapabilities.js new file mode 100644 index 0000000..ccb3624 --- /dev/null +++ b/lib/renderers/webgl/WebGLCapabilities.js @@ -0,0 +1,116 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function WebGLCapabilities( gl, extensions, parameters ) { + + var maxAnisotropy; + + function getMaxAnisotropy() { + + if ( maxAnisotropy !== undefined ) return maxAnisotropy; + + var extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension !== null ) { + + maxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT ); + + } else { + + maxAnisotropy = 0; + + } + + return maxAnisotropy; + + } + + function getMaxPrecision( 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'; + + } + + var isWebGL2 = typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext; + + var precision = parameters.precision !== undefined ? parameters.precision : 'highp'; + var maxPrecision = getMaxPrecision( precision ); + + if ( maxPrecision !== precision ) { + + console.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' ); + precision = maxPrecision; + + } + + var logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true; + + var maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS ); + var maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ); + var maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE ); + var maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE ); + + var maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); + var maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS ); + var maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS ); + var maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS ); + + var vertexTextures = maxVertexTextures > 0; + var floatFragmentTextures = isWebGL2 || !! extensions.get( 'OES_texture_float' ); + var floatVertexTextures = vertexTextures && floatFragmentTextures; + + return { + + isWebGL2: isWebGL2, + + getMaxAnisotropy: getMaxAnisotropy, + getMaxPrecision: getMaxPrecision, + + precision: precision, + logarithmicDepthBuffer: logarithmicDepthBuffer, + + maxTextures: maxTextures, + maxVertexTextures: maxVertexTextures, + maxTextureSize: maxTextureSize, + maxCubemapSize: maxCubemapSize, + + maxAttributes: maxAttributes, + maxVertexUniforms: maxVertexUniforms, + maxVaryings: maxVaryings, + maxFragmentUniforms: maxFragmentUniforms, + + vertexTextures: vertexTextures, + floatFragmentTextures: floatFragmentTextures, + floatVertexTextures: floatVertexTextures + + }; + +} + + +export { WebGLCapabilities }; diff --git a/lib/renderers/webgl/WebGLClipping.js b/lib/renderers/webgl/WebGLClipping.js new file mode 100644 index 0000000..9107fbc --- /dev/null +++ b/lib/renderers/webgl/WebGLClipping.js @@ -0,0 +1,164 @@ +/** + * @author tschw + */ + +import { Matrix3 } from '../../math/Matrix3.js'; +import { Plane } from '../../math/Plane.js'; + +function WebGLClipping() { + + var scope = this, + + globalState = null, + numGlobalPlanes = 0, + localClippingEnabled = false, + renderingShadows = false, + + plane = new Plane(), + viewNormalMatrix = new Matrix3(), + + uniform = { value: null, needsUpdate: false }; + + this.uniform = uniform; + this.numPlanes = 0; + this.numIntersection = 0; + + this.init = function ( planes, enableLocalClipping, camera ) { + + var enabled = + planes.length !== 0 || + enableLocalClipping || + // enable state of previous frame - the clipping code has to + // run another frame in order to reset the state: + numGlobalPlanes !== 0 || + localClippingEnabled; + + localClippingEnabled = enableLocalClipping; + + globalState = projectPlanes( planes, camera, 0 ); + numGlobalPlanes = planes.length; + + return enabled; + + }; + + this.beginShadows = function () { + + renderingShadows = true; + projectPlanes( null ); + + }; + + this.endShadows = function () { + + renderingShadows = false; + resetGlobalState(); + + }; + + this.setState = function ( planes, clipIntersection, clipShadows, camera, cache, fromCache ) { + + if ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) { + + // there's no local clipping + + if ( renderingShadows ) { + + // there's no global clipping + + projectPlanes( null ); + + } else { + + resetGlobalState(); + + } + + } else { + + var nGlobal = renderingShadows ? 0 : numGlobalPlanes, + lGlobal = nGlobal * 4, + + dstArray = cache.clippingState || null; + + uniform.value = dstArray; // ensure unique state + + dstArray = projectPlanes( planes, camera, lGlobal, fromCache ); + + for ( var i = 0; i !== lGlobal; ++ i ) { + + dstArray[ i ] = globalState[ i ]; + + } + + cache.clippingState = dstArray; + this.numIntersection = clipIntersection ? this.numPlanes : 0; + this.numPlanes += nGlobal; + + } + + + }; + + function resetGlobalState() { + + if ( uniform.value !== globalState ) { + + uniform.value = globalState; + uniform.needsUpdate = numGlobalPlanes > 0; + + } + + scope.numPlanes = numGlobalPlanes; + scope.numIntersection = 0; + + } + + function projectPlanes( planes, camera, dstOffset, skipTransform ) { + + var nPlanes = planes !== null ? planes.length : 0, + dstArray = null; + + if ( nPlanes !== 0 ) { + + dstArray = uniform.value; + + if ( skipTransform !== true || dstArray === null ) { + + var flatSize = dstOffset + nPlanes * 4, + viewMatrix = camera.matrixWorldInverse; + + viewNormalMatrix.getNormalMatrix( viewMatrix ); + + if ( dstArray === null || dstArray.length < flatSize ) { + + dstArray = new Float32Array( flatSize ); + + } + + for ( var i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) { + + plane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix ); + + plane.normal.toArray( dstArray, i4 ); + dstArray[ i4 + 3 ] = plane.constant; + + } + + } + + uniform.value = dstArray; + uniform.needsUpdate = true; + + } + + scope.numPlanes = nPlanes; + + return dstArray; + + } + +} + + +export { WebGLClipping }; diff --git a/lib/renderers/webgl/WebGLExtensions.js b/lib/renderers/webgl/WebGLExtensions.js new file mode 100644 index 0000000..bff3fd8 --- /dev/null +++ b/lib/renderers/webgl/WebGLExtensions.js @@ -0,0 +1,61 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function WebGLExtensions( gl ) { + + var extensions = {}; + + return { + + get: function ( name ) { + + if ( extensions[ name ] !== undefined ) { + + return extensions[ name ]; + + } + + var extension; + + switch ( name ) { + + case 'WEBGL_depth_texture': + extension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' ); + break; + + case 'EXT_texture_filter_anisotropic': + extension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' ); + break; + + case 'WEBGL_compressed_texture_s3tc': + extension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' ); + break; + + case 'WEBGL_compressed_texture_pvrtc': + extension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' ); + break; + + default: + extension = gl.getExtension( name ); + + } + + if ( extension === null ) { + + console.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' ); + + } + + extensions[ name ] = extension; + + return extension; + + } + + }; + +} + + +export { WebGLExtensions }; diff --git a/lib/renderers/webgl/WebGLGeometries.js b/lib/renderers/webgl/WebGLGeometries.js new file mode 100644 index 0000000..8ef204e --- /dev/null +++ b/lib/renderers/webgl/WebGLGeometries.js @@ -0,0 +1,184 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { Uint16BufferAttribute, Uint32BufferAttribute } from '../../core/BufferAttribute.js'; +import { BufferGeometry } from '../../core/BufferGeometry.js'; +import { arrayMax } from '../../utils.js'; + +function WebGLGeometries( gl, attributes, info ) { + + var geometries = {}; + var wireframeAttributes = {}; + + function onGeometryDispose( event ) { + + var geometry = event.target; + var buffergeometry = geometries[ geometry.id ]; + + if ( buffergeometry.index !== null ) { + + attributes.remove( buffergeometry.index ); + + } + + for ( var name in buffergeometry.attributes ) { + + attributes.remove( buffergeometry.attributes[ name ] ); + + } + + geometry.removeEventListener( 'dispose', onGeometryDispose ); + + delete geometries[ geometry.id ]; + + var attribute = wireframeAttributes[ buffergeometry.id ]; + + if ( attribute ) { + + attributes.remove( attribute ); + delete wireframeAttributes[ buffergeometry.id ]; + + } + + // + + info.memory.geometries --; + + } + + function get( object, geometry ) { + + var buffergeometry = geometries[ geometry.id ]; + + if ( buffergeometry ) return buffergeometry; + + geometry.addEventListener( 'dispose', onGeometryDispose ); + + if ( geometry.isBufferGeometry ) { + + buffergeometry = geometry; + + } else if ( geometry.isGeometry ) { + + if ( geometry._bufferGeometry === undefined ) { + + geometry._bufferGeometry = new BufferGeometry().setFromObject( object ); + + } + + buffergeometry = geometry._bufferGeometry; + + } + + geometries[ geometry.id ] = buffergeometry; + + info.memory.geometries ++; + + return buffergeometry; + + } + + function update( geometry ) { + + var index = geometry.index; + var geometryAttributes = geometry.attributes; + + if ( index !== null ) { + + attributes.update( index, gl.ELEMENT_ARRAY_BUFFER ); + + } + + for ( var name in geometryAttributes ) { + + attributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER ); + + } + + // morph targets + + var morphAttributes = geometry.morphAttributes; + + for ( var name in morphAttributes ) { + + var array = morphAttributes[ name ]; + + for ( var i = 0, l = array.length; i < l; i ++ ) { + + attributes.update( array[ i ], gl.ARRAY_BUFFER ); + + } + + } + + } + + function getWireframeAttribute( geometry ) { + + var attribute = wireframeAttributes[ geometry.id ]; + + if ( attribute ) return attribute; + + var indices = []; + + var geometryIndex = geometry.index; + var geometryAttributes = geometry.attributes; + + // console.time( 'wireframe' ); + + if ( geometryIndex !== null ) { + + var array = geometryIndex.array; + + for ( var i = 0, l = array.length; i < l; i += 3 ) { + + var a = array[ i + 0 ]; + var b = array[ i + 1 ]; + var c = array[ i + 2 ]; + + indices.push( a, b, b, c, c, a ); + + } + + } else { + + var array = geometryAttributes.position.array; + + for ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) { + + var a = i + 0; + var b = i + 1; + var c = i + 2; + + indices.push( a, b, b, c, c, a ); + + } + + } + + // console.timeEnd( 'wireframe' ); + + attribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 ); + + attributes.update( attribute, gl.ELEMENT_ARRAY_BUFFER ); + + wireframeAttributes[ geometry.id ] = attribute; + + return attribute; + + } + + return { + + get: get, + update: update, + + getWireframeAttribute: getWireframeAttribute + + }; + +} + + +export { WebGLGeometries }; diff --git a/lib/renderers/webgl/WebGLIndexedBufferRenderer.js b/lib/renderers/webgl/WebGLIndexedBufferRenderer.js new file mode 100644 index 0000000..c23f2e3 --- /dev/null +++ b/lib/renderers/webgl/WebGLIndexedBufferRenderer.js @@ -0,0 +1,69 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function WebGLIndexedBufferRenderer( gl, extensions, info, capabilities ) { + + var mode; + + function setMode( value ) { + + mode = value; + + } + + var type, bytesPerElement; + + function setIndex( value ) { + + type = value.type; + bytesPerElement = value.bytesPerElement; + + } + + function render( start, count ) { + + gl.drawElements( mode, count, type, start * bytesPerElement ); + + info.update( count, mode ); + + } + + function renderInstances( geometry, start, count ) { + + var extension; + + if ( capabilities.isWebGL2 ) { + + extension = gl; + + } else { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + } + + extension[ capabilities.isWebGL2 ? 'drawElementsInstanced' : 'drawElementsInstancedANGLE' ]( mode, count, type, start * bytesPerElement, geometry.maxInstancedCount ); + + info.update( count, mode, geometry.maxInstancedCount ); + + } + + // + + this.setMode = setMode; + this.setIndex = setIndex; + this.render = render; + this.renderInstances = renderInstances; + +} + + +export { WebGLIndexedBufferRenderer }; diff --git a/lib/renderers/webgl/WebGLInfo.js b/lib/renderers/webgl/WebGLInfo.js new file mode 100644 index 0000000..de30b40 --- /dev/null +++ b/lib/renderers/webgl/WebGLInfo.js @@ -0,0 +1,83 @@ +/** + * @author Mugen87 / https://github.com/Mugen87 + */ + +function WebGLInfo( gl ) { + + var memory = { + geometries: 0, + textures: 0 + }; + + var render = { + frame: 0, + calls: 0, + triangles: 0, + points: 0, + lines: 0 + }; + + function update( count, mode, instanceCount ) { + + instanceCount = instanceCount || 1; + + render.calls ++; + + switch ( mode ) { + + case gl.TRIANGLES: + render.triangles += instanceCount * ( count / 3 ); + break; + + case gl.TRIANGLE_STRIP: + case gl.TRIANGLE_FAN: + render.triangles += instanceCount * ( count - 2 ); + break; + + case gl.LINES: + render.lines += instanceCount * ( count / 2 ); + break; + + case gl.LINE_STRIP: + render.lines += instanceCount * ( count - 1 ); + break; + + case gl.LINE_LOOP: + render.lines += instanceCount * count; + break; + + case gl.POINTS: + render.points += instanceCount * count; + break; + + default: + console.error( 'THREE.WebGLInfo: Unknown draw mode:', mode ); + break; + + } + + } + + function reset() { + + render.frame ++; + render.calls = 0; + render.triangles = 0; + render.points = 0; + render.lines = 0; + + } + + return { + memory: memory, + render: render, + programs: null, + autoReset: true, + reset: reset, + update: update + }; + +} + + +export { WebGLInfo }; diff --git a/lib/renderers/webgl/WebGLLights.js b/lib/renderers/webgl/WebGLLights.js new file mode 100644 index 0000000..80e0ee0 --- /dev/null +++ b/lib/renderers/webgl/WebGLLights.js @@ -0,0 +1,345 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { Color } from '../../math/Color.js'; +import { Matrix4 } from '../../math/Matrix4.js'; +import { Vector2 } from '../../math/Vector2.js'; +import { Vector3 } from '../../math/Vector3.js'; + +function UniformsCache() { + + var lights = {}; + + return { + + get: function ( light ) { + + if ( lights[ light.id ] !== undefined ) { + + return lights[ light.id ]; + + } + + var uniforms; + + switch ( light.type ) { + + case 'DirectionalLight': + uniforms = { + direction: new Vector3(), + color: new Color(), + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'SpotLight': + uniforms = { + position: new Vector3(), + direction: new Vector3(), + color: new Color(), + distance: 0, + coneCos: 0, + penumbraCos: 0, + decay: 0, + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'PointLight': + uniforms = { + position: new Vector3(), + color: new Color(), + distance: 0, + decay: 0, + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2(), + shadowCameraNear: 1, + shadowCameraFar: 1000 + }; + break; + + case 'HemisphereLight': + uniforms = { + direction: new Vector3(), + skyColor: new Color(), + groundColor: new Color() + }; + break; + + case 'RectAreaLight': + uniforms = { + color: new Color(), + position: new Vector3(), + halfWidth: new Vector3(), + halfHeight: new Vector3() + // TODO (abelnation): set RectAreaLight shadow uniforms + }; + break; + + } + + lights[ light.id ] = uniforms; + + return uniforms; + + } + + }; + +} + +var count = 0; + +function WebGLLights() { + + var cache = new UniformsCache(); + + var state = { + + id: count ++, + + hash: { + stateID: - 1, + directionalLength: - 1, + pointLength: - 1, + spotLength: - 1, + rectAreaLength: - 1, + hemiLength: - 1, + shadowsLength: - 1 + }, + + ambient: [ 0, 0, 0 ], + directional: [], + directionalShadowMap: [], + directionalShadowMatrix: [], + spot: [], + spotShadowMap: [], + spotShadowMatrix: [], + rectArea: [], + point: [], + pointShadowMap: [], + pointShadowMatrix: [], + hemi: [] + + }; + + var vector3 = new Vector3(); + var matrix4 = new Matrix4(); + var matrix42 = new Matrix4(); + + function setup( lights, shadows, camera ) { + + var r = 0, g = 0, b = 0; + + var directionalLength = 0; + var pointLength = 0; + var spotLength = 0; + var rectAreaLength = 0; + var hemiLength = 0; + + var viewMatrix = camera.matrixWorldInverse; + + for ( var i = 0, l = lights.length; i < l; i ++ ) { + + var light = lights[ i ]; + + var color = light.color; + var intensity = light.intensity; + var distance = light.distance; + + var shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null; + + if ( light.isAmbientLight ) { + + r += color.r * intensity; + g += color.g * intensity; + b += color.b * intensity; + + } else if ( light.isDirectionalLight ) { + + var uniforms = cache.get( light ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + var shadow = light.shadow; + + uniforms.shadowBias = shadow.bias; + uniforms.shadowRadius = shadow.radius; + uniforms.shadowMapSize = shadow.mapSize; + + } + + state.directionalShadowMap[ directionalLength ] = shadowMap; + state.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix; + state.directional[ directionalLength ] = uniforms; + + directionalLength ++; + + } else if ( light.isSpotLight ) { + + var uniforms = cache.get( light ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + uniforms.color.copy( color ).multiplyScalar( intensity ); + uniforms.distance = distance; + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + uniforms.coneCos = Math.cos( light.angle ); + uniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) ); + uniforms.decay = light.decay; + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + var shadow = light.shadow; + + uniforms.shadowBias = shadow.bias; + uniforms.shadowRadius = shadow.radius; + uniforms.shadowMapSize = shadow.mapSize; + + } + + state.spotShadowMap[ spotLength ] = shadowMap; + state.spotShadowMatrix[ spotLength ] = light.shadow.matrix; + state.spot[ spotLength ] = uniforms; + + spotLength ++; + + } else if ( light.isRectAreaLight ) { + + var uniforms = cache.get( light ); + + // (a) intensity is the total visible light emitted + //uniforms.color.copy( color ).multiplyScalar( intensity / ( light.width * light.height * Math.PI ) ); + + // (b) intensity is the brightness of the light + uniforms.color.copy( color ).multiplyScalar( intensity ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + // extract local rotation of light to derive width/height half vectors + matrix42.identity(); + matrix4.copy( light.matrixWorld ); + matrix4.premultiply( viewMatrix ); + matrix42.extractRotation( matrix4 ); + + uniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 ); + uniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 ); + + uniforms.halfWidth.applyMatrix4( matrix42 ); + uniforms.halfHeight.applyMatrix4( matrix42 ); + + // TODO (abelnation): RectAreaLight distance? + // uniforms.distance = distance; + + state.rectArea[ rectAreaLength ] = uniforms; + + rectAreaLength ++; + + } else if ( light.isPointLight ) { + + var uniforms = cache.get( light ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); + uniforms.distance = light.distance; + uniforms.decay = light.decay; + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + var shadow = light.shadow; + + uniforms.shadowBias = shadow.bias; + uniforms.shadowRadius = shadow.radius; + uniforms.shadowMapSize = shadow.mapSize; + uniforms.shadowCameraNear = shadow.camera.near; + uniforms.shadowCameraFar = shadow.camera.far; + + } + + state.pointShadowMap[ pointLength ] = shadowMap; + state.pointShadowMatrix[ pointLength ] = light.shadow.matrix; + state.point[ pointLength ] = uniforms; + + pointLength ++; + + } else if ( light.isHemisphereLight ) { + + var uniforms = cache.get( light ); + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + uniforms.direction.transformDirection( viewMatrix ); + uniforms.direction.normalize(); + + uniforms.skyColor.copy( light.color ).multiplyScalar( intensity ); + uniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity ); + + state.hemi[ hemiLength ] = uniforms; + + hemiLength ++; + + } + + } + + state.ambient[ 0 ] = r; + state.ambient[ 1 ] = g; + state.ambient[ 2 ] = b; + + state.directional.length = directionalLength; + state.spot.length = spotLength; + state.rectArea.length = rectAreaLength; + state.point.length = pointLength; + state.hemi.length = hemiLength; + + state.hash.stateID = state.id; + state.hash.directionalLength = directionalLength; + state.hash.pointLength = pointLength; + state.hash.spotLength = spotLength; + state.hash.rectAreaLength = rectAreaLength; + state.hash.hemiLength = hemiLength; + state.hash.shadowsLength = shadows.length; + + } + + return { + setup: setup, + state: state + }; + +} + + +export { WebGLLights }; diff --git a/lib/renderers/webgl/WebGLMorphtargets.js b/lib/renderers/webgl/WebGLMorphtargets.js new file mode 100644 index 0000000..8a2ae10 --- /dev/null +++ b/lib/renderers/webgl/WebGLMorphtargets.js @@ -0,0 +1,111 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function absNumericalSort( a, b ) { + + return Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] ); + +} + +function WebGLMorphtargets( gl ) { + + var influencesList = {}; + var morphInfluences = new Float32Array( 8 ); + + function update( object, geometry, material, program ) { + + var objectInfluences = object.morphTargetInfluences; + + var length = objectInfluences.length; + + var influences = influencesList[ geometry.id ]; + + if ( influences === undefined ) { + + // initialise list + + influences = []; + + for ( var i = 0; i < length; i ++ ) { + + influences[ i ] = [ i, 0 ]; + + } + + influencesList[ geometry.id ] = influences; + + } + + var morphTargets = material.morphTargets && geometry.morphAttributes.position; + var morphNormals = material.morphNormals && geometry.morphAttributes.normal; + + // Remove current morphAttributes + + for ( var i = 0; i < length; i ++ ) { + + var influence = influences[ i ]; + + if ( influence[ 1 ] !== 0 ) { + + if ( morphTargets ) geometry.removeAttribute( 'morphTarget' + i ); + if ( morphNormals ) geometry.removeAttribute( 'morphNormal' + i ); + + } + + } + + // Collect influences + + for ( var i = 0; i < length; i ++ ) { + + var influence = influences[ i ]; + + influence[ 0 ] = i; + influence[ 1 ] = objectInfluences[ i ]; + + } + + influences.sort( absNumericalSort ); + + // Add morphAttributes + + for ( var i = 0; i < 8; i ++ ) { + + var influence = influences[ i ]; + + if ( influence ) { + + var index = influence[ 0 ]; + var value = influence[ 1 ]; + + if ( value ) { + + if ( morphTargets ) geometry.addAttribute( 'morphTarget' + i, morphTargets[ index ] ); + if ( morphNormals ) geometry.addAttribute( 'morphNormal' + i, morphNormals[ index ] ); + + morphInfluences[ i ] = value; + continue; + + } + + } + + morphInfluences[ i ] = 0; + + } + + program.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences ); + + } + + return { + + update: update + + }; + +} + + +export { WebGLMorphtargets }; diff --git a/lib/renderers/webgl/WebGLObjects.js b/lib/renderers/webgl/WebGLObjects.js new file mode 100644 index 0000000..8a2528e --- /dev/null +++ b/lib/renderers/webgl/WebGLObjects.js @@ -0,0 +1,52 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function WebGLObjects( geometries, info ) { + + var updateList = {}; + + function update( object ) { + + var frame = info.render.frame; + + var geometry = object.geometry; + var buffergeometry = geometries.get( object, geometry ); + + // Update once per frame + + if ( updateList[ buffergeometry.id ] !== frame ) { + + if ( geometry.isGeometry ) { + + buffergeometry.updateFromObject( object ); + + } + + geometries.update( buffergeometry ); + + updateList[ buffergeometry.id ] = frame; + + } + + return buffergeometry; + + } + + function dispose() { + + updateList = {}; + + } + + return { + + update: update, + dispose: dispose + + }; + +} + + +export { WebGLObjects }; diff --git a/lib/renderers/webgl/WebGLProgram.js b/lib/renderers/webgl/WebGLProgram.js new file mode 100644 index 0000000..9f06a15 --- /dev/null +++ b/lib/renderers/webgl/WebGLProgram.js @@ -0,0 +1,730 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { WebGLUniforms } from './WebGLUniforms.js'; +import { WebGLShader } from './WebGLShader.js'; +import { ShaderChunk } from '../shaders/ShaderChunk.js'; +import { NoToneMapping, AddOperation, MixOperation, MultiplyOperation, EquirectangularRefractionMapping, CubeRefractionMapping, SphericalReflectionMapping, EquirectangularReflectionMapping, CubeUVRefractionMapping, CubeUVReflectionMapping, CubeReflectionMapping, PCFSoftShadowMap, PCFShadowMap, CineonToneMapping, Uncharted2ToneMapping, ReinhardToneMapping, LinearToneMapping, GammaEncoding, RGBDEncoding, RGBM16Encoding, RGBM7Encoding, RGBEEncoding, sRGBEncoding, LinearEncoding } from '../../constants.js'; + +var programIdCount = 0; + +function getEncodingComponents( encoding ) { + + switch ( encoding ) { + + case LinearEncoding: + return [ 'Linear', '( value )' ]; + case sRGBEncoding: + return [ 'sRGB', '( value )' ]; + case RGBEEncoding: + return [ 'RGBE', '( value )' ]; + case RGBM7Encoding: + return [ 'RGBM', '( value, 7.0 )' ]; + case RGBM16Encoding: + return [ 'RGBM', '( value, 16.0 )' ]; + case RGBDEncoding: + return [ 'RGBD', '( value, 256.0 )' ]; + case GammaEncoding: + return [ 'Gamma', '( value, float( GAMMA_FACTOR ) )' ]; + default: + throw new Error( 'unsupported encoding: ' + encoding ); + + } + +} + +function getTexelDecodingFunction( functionName, encoding ) { + + var components = getEncodingComponents( encoding ); + return 'vec4 ' + functionName + '( vec4 value ) { return ' + components[ 0 ] + 'ToLinear' + components[ 1 ] + '; }'; + +} + +function getTexelEncodingFunction( functionName, encoding ) { + + var components = getEncodingComponents( encoding ); + return 'vec4 ' + functionName + '( vec4 value ) { return LinearTo' + components[ 0 ] + components[ 1 ] + '; }'; + +} + +function getToneMappingFunction( functionName, toneMapping ) { + + var toneMappingName; + + switch ( toneMapping ) { + + case LinearToneMapping: + toneMappingName = 'Linear'; + break; + + case ReinhardToneMapping: + toneMappingName = 'Reinhard'; + break; + + case Uncharted2ToneMapping: + toneMappingName = 'Uncharted2'; + break; + + case CineonToneMapping: + toneMappingName = 'OptimizedCineon'; + break; + + default: + throw new Error( 'unsupported toneMapping: ' + toneMapping ); + + } + + return 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }'; + +} + +function generateExtensions( extensions, parameters, rendererExtensions ) { + + extensions = extensions || {}; + + var chunks = [ + ( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || ( parameters.normalMap && ! parameters.objectSpaceNormalMap ) || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '', + ( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '', + ( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '', + ( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : '' + ]; + + return chunks.filter( filterEmptyLine ).join( '\n' ); + +} + +function generateDefines( defines ) { + + var chunks = []; + + for ( var name in defines ) { + + var value = defines[ name ]; + + if ( value === false ) continue; + + chunks.push( '#define ' + name + ' ' + value ); + + } + + return chunks.join( '\n' ); + +} + +function fetchAttributeLocations( gl, program ) { + + var attributes = {}; + + var n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES ); + + for ( var i = 0; i < n; i ++ ) { + + var info = gl.getActiveAttrib( program, i ); + var name = info.name; + + // console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i ); + + attributes[ name ] = gl.getAttribLocation( program, name ); + + } + + return attributes; + +} + +function filterEmptyLine( string ) { + + return string !== ''; + +} + +function replaceLightNums( string, parameters ) { + + return string + .replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights ) + .replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights ) + .replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights ) + .replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights ) + .replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights ); + +} + +function replaceClippingPlaneNums( string, parameters ) { + + return string + .replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes ) + .replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) ); + +} + +function parseIncludes( string ) { + + var pattern = /^[ \t]*#include +<([\w\d./]+)>/gm; + + function replace( match, include ) { + + var replace = ShaderChunk[ include ]; + + if ( replace === undefined ) { + + throw new Error( 'Can not resolve #include <' + include + '>' ); + + } + + return parseIncludes( replace ); + + } + + return string.replace( pattern, replace ); + +} + +function unrollLoops( string ) { + + var pattern = /#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g; + + function replace( match, start, end, snippet ) { + + var unroll = ''; + + for ( var i = parseInt( start ); i < parseInt( end ); i ++ ) { + + unroll += snippet.replace( /\[ i \]/g, '[ ' + i + ' ]' ); + + } + + return unroll; + + } + + return string.replace( pattern, replace ); + +} + +function WebGLProgram( renderer, extensions, code, material, shader, parameters, capabilities ) { + + var gl = renderer.context; + + var defines = material.defines; + + var vertexShader = shader.vertexShader; + var fragmentShader = shader.fragmentShader; + + var shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC'; + + if ( parameters.shadowMapType === PCFShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF'; + + } else if ( parameters.shadowMapType === PCFSoftShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT'; + + } + + var envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + var envMapModeDefine = 'ENVMAP_MODE_REFLECTION'; + var envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + + if ( parameters.envMap ) { + + switch ( material.envMap.mapping ) { + + case CubeReflectionMapping: + case CubeRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + break; + + case CubeUVReflectionMapping: + case CubeUVRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV'; + break; + + case EquirectangularReflectionMapping: + case EquirectangularRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_EQUIREC'; + break; + + case SphericalReflectionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_SPHERE'; + break; + + } + + switch ( material.envMap.mapping ) { + + case CubeRefractionMapping: + case EquirectangularRefractionMapping: + envMapModeDefine = 'ENVMAP_MODE_REFRACTION'; + break; + + } + + switch ( material.combine ) { + + case MultiplyOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + break; + + case MixOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MIX'; + break; + + case AddOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_ADD'; + break; + + } + + } + + var gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0; + + // console.log( 'building new program ' ); + + // + + var customExtensions = capabilities.isWebGL2 ? '' : generateExtensions( material.extensions, parameters, extensions ); + + var customDefines = generateDefines( defines ); + + // + + var program = gl.createProgram(); + + var prefixVertex, prefixFragment; + + if ( material.isRawShaderMaterial ) { + + prefixVertex = [ + + customDefines + + ].filter( filterEmptyLine ).join( '\n' ); + + if ( prefixVertex.length > 0 ) { + + prefixVertex += '\n'; + + } + + prefixFragment = [ + + customExtensions, + customDefines + + ].filter( filterEmptyLine ).join( '\n' ); + + if ( prefixFragment.length > 0 ) { + + prefixFragment += '\n'; + + } + + } else { + + prefixVertex = [ + + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + shader.name, + + customDefines, + + parameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '', + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + '#define MAX_BONES ' + parameters.maxBones, + ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', + ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + ( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '', + parameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.skinning ? '#define USE_SKINNING' : '', + parameters.useVertexTexture ? '#define BONE_TEXTURE' : '', + + parameters.morphTargets ? '#define USE_MORPHTARGETS' : '', + parameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '', + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && ( capabilities.isWebGL2 || extensions.get( 'EXT_frag_depth' ) ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + 'uniform mat4 modelMatrix;', + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform mat4 viewMatrix;', + 'uniform mat3 normalMatrix;', + 'uniform vec3 cameraPosition;', + + 'attribute vec3 position;', + 'attribute vec3 normal;', + 'attribute vec2 uv;', + + '#ifdef USE_COLOR', + + ' attribute vec3 color;', + + '#endif', + + '#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', + + '#ifdef USE_SKINNING', + + ' attribute vec4 skinIndex;', + ' attribute vec4 skinWeight;', + + '#endif', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + prefixFragment = [ + + customExtensions, + + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + shader.name, + + customDefines, + + parameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest + ( parameters.alphaTest % 1 ? '' : '.0' ) : '', // add '.0' if integer + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', + ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapTypeDefine : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.envMap ? '#define ' + envMapBlendingDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + ( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.gradientMap ? '#define USE_GRADIENTMAP' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '', + + parameters.physicallyCorrectLights ? '#define PHYSICALLY_CORRECT_LIGHTS' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && ( capabilities.isWebGL2 || extensions.get( 'EXT_frag_depth' ) ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + parameters.envMap && ( capabilities.isWebGL2 || extensions.get( 'EXT_shader_texture_lod' ) ) ? '#define TEXTURE_LOD_EXT' : '', + + 'uniform mat4 viewMatrix;', + 'uniform vec3 cameraPosition;', + + ( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '', + ( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below + ( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '', + + parameters.dithering ? '#define DITHERING' : '', + + ( parameters.outputEncoding || parameters.mapEncoding || parameters.matcapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? + ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below + parameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '', + parameters.matcapEncoding ? getTexelDecodingFunction( 'matcapTexelToLinear', parameters.matcapEncoding ) : '', + parameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '', + parameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '', + parameters.outputEncoding ? getTexelEncodingFunction( 'linearToOutputTexel', parameters.outputEncoding ) : '', + + parameters.depthPacking ? '#define DEPTH_PACKING ' + material.depthPacking : '', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + } + + vertexShader = parseIncludes( vertexShader ); + vertexShader = replaceLightNums( vertexShader, parameters ); + vertexShader = replaceClippingPlaneNums( vertexShader, parameters ); + + fragmentShader = parseIncludes( fragmentShader ); + fragmentShader = replaceLightNums( fragmentShader, parameters ); + fragmentShader = replaceClippingPlaneNums( fragmentShader, parameters ); + + vertexShader = unrollLoops( vertexShader ); + fragmentShader = unrollLoops( fragmentShader ); + + if ( capabilities.isWebGL2 && ! material.isRawShaderMaterial ) { + + var isGLSL3ShaderMaterial = false; + + var versionRegex = /^\s*#version\s+300\s+es\s*\n/; + + if ( material.isShaderMaterial && + vertexShader.match( versionRegex ) !== null && + fragmentShader.match( versionRegex ) !== null ) { + + isGLSL3ShaderMaterial = true; + + vertexShader = vertexShader.replace( versionRegex, '' ); + fragmentShader = fragmentShader.replace( versionRegex, '' ); + + } + + // GLSL 3.0 conversion + prefixVertex = [ + '#version 300 es\n', + '#define attribute in', + '#define varying out', + '#define texture2D texture' + ].join( '\n' ) + '\n' + prefixVertex; + + prefixFragment = [ + '#version 300 es\n', + '#define varying in', + isGLSL3ShaderMaterial ? '' : 'out highp vec4 pc_fragColor;', + isGLSL3ShaderMaterial ? '' : '#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' + ].join( '\n' ) + '\n' + prefixFragment; + + } + + var vertexGlsl = prefixVertex + vertexShader; + var fragmentGlsl = prefixFragment + fragmentShader; + + // console.log( '*VERTEX*', vertexGlsl ); + // console.log( '*FRAGMENT*', fragmentGlsl ); + + var glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl ); + var glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl ); + + gl.attachShader( program, glVertexShader ); + gl.attachShader( program, glFragmentShader ); + + // Force a particular attribute to index 0. + + if ( material.index0AttributeName !== undefined ) { + + gl.bindAttribLocation( program, 0, material.index0AttributeName ); + + } else if ( parameters.morphTargets === true ) { + + // programs with morphTargets displace position out of attribute 0 + gl.bindAttribLocation( program, 0, 'position' ); + + } + + gl.linkProgram( program ); + + var programLog = gl.getProgramInfoLog( program ).trim(); + var vertexLog = gl.getShaderInfoLog( glVertexShader ).trim(); + var fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim(); + + var runnable = true; + var haveDiagnostics = true; + + // console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) ); + // console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) ); + + if ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) { + + runnable = false; + + console.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog ); + + } else if ( programLog !== '' ) { + + console.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog ); + + } else if ( vertexLog === '' || fragmentLog === '' ) { + + haveDiagnostics = false; + + } + + if ( haveDiagnostics ) { + + this.diagnostics = { + + runnable: runnable, + material: material, + + programLog: programLog, + + vertexShader: { + + log: vertexLog, + prefix: prefixVertex + + }, + + fragmentShader: { + + log: fragmentLog, + prefix: prefixFragment + + } + + }; + + } + + // clean up + + gl.deleteShader( glVertexShader ); + gl.deleteShader( glFragmentShader ); + + // set up caching for uniform locations + + var cachedUniforms; + + this.getUniforms = function () { + + if ( cachedUniforms === undefined ) { + + cachedUniforms = new WebGLUniforms( gl, program, renderer ); + + } + + return cachedUniforms; + + }; + + // set up caching for attribute locations + + var cachedAttributes; + + this.getAttributes = function () { + + if ( cachedAttributes === undefined ) { + + cachedAttributes = fetchAttributeLocations( gl, program ); + + } + + return cachedAttributes; + + }; + + // free resource + + this.destroy = function () { + + gl.deleteProgram( program ); + this.program = undefined; + + }; + + // DEPRECATED + + Object.defineProperties( this, { + + uniforms: { + get: function () { + + console.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' ); + return this.getUniforms(); + + } + }, + + attributes: { + get: function () { + + console.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' ); + return this.getAttributes(); + + } + } + + } ); + + + // + + this.name = shader.name; + this.id = programIdCount ++; + this.code = code; + this.usedTimes = 1; + this.program = program; + this.vertexShader = glVertexShader; + this.fragmentShader = glFragmentShader; + + return this; + +} + +export { WebGLProgram }; diff --git a/lib/renderers/webgl/WebGLPrograms.js b/lib/renderers/webgl/WebGLPrograms.js new file mode 100644 index 0000000..daf4152 --- /dev/null +++ b/lib/renderers/webgl/WebGLPrograms.js @@ -0,0 +1,312 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { BackSide, DoubleSide, CubeUVRefractionMapping, CubeUVReflectionMapping, GammaEncoding, LinearEncoding, ObjectSpaceNormalMap } from '../../constants.js'; +import { WebGLProgram } from './WebGLProgram.js'; + +function WebGLPrograms( renderer, extensions, capabilities ) { + + var programs = []; + + var shaderIDs = { + MeshDepthMaterial: 'depth', + MeshDistanceMaterial: 'distanceRGBA', + MeshNormalMaterial: 'normal', + MeshBasicMaterial: 'basic', + MeshLambertMaterial: 'lambert', + MeshPhongMaterial: 'phong', + MeshToonMaterial: 'phong', + MeshStandardMaterial: 'physical', + MeshPhysicalMaterial: 'physical', + MeshMatcapMaterial: 'matcap', + LineBasicMaterial: 'basic', + LineDashedMaterial: 'dashed', + PointsMaterial: 'points', + ShadowMaterial: 'shadow', + SpriteMaterial: 'sprite' + }; + + var parameterNames = [ + "precision", "supportsVertexTextures", "map", "mapEncoding", "matcapEncoding", "envMap", "envMapMode", "envMapEncoding", + "lightMap", "aoMap", "emissiveMap", "emissiveMapEncoding", "bumpMap", "normalMap", "objectSpaceNormalMap", "displacementMap", "specularMap", + "roughnessMap", "metalnessMap", "gradientMap", + "alphaMap", "combine", "vertexColors", "fog", "useFog", "fogExp", + "flatShading", "sizeAttenuation", "logarithmicDepthBuffer", "skinning", + "maxBones", "useVertexTexture", "morphTargets", "morphNormals", + "maxMorphTargets", "maxMorphNormals", "premultipliedAlpha", + "numDirLights", "numPointLights", "numSpotLights", "numHemiLights", "numRectAreaLights", + "shadowMapEnabled", "shadowMapType", "toneMapping", 'physicallyCorrectLights', + "alphaTest", "doubleSided", "flipSided", "numClippingPlanes", "numClipIntersection", "depthPacking", "dithering" + ]; + + + function allocateBones( object ) { + + var skeleton = object.skeleton; + var bones = skeleton.bones; + + if ( capabilities.floatVertexTextures ) { + + return 1024; + + } else { + + // default for when object is not specified + // ( for example when prebuilding shader to be used with multiple objects ) + // + // - leave some extra space for other uniforms + // - limit here is ANGLE's 254 max uniform vectors + // (up to 54 should be safe) + + var nVertexUniforms = capabilities.maxVertexUniforms; + var nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 ); + + var maxBones = Math.min( nVertexMatrices, bones.length ); + + if ( maxBones < bones.length ) { + + console.warn( 'THREE.WebGLRenderer: Skeleton has ' + bones.length + ' bones. This GPU supports ' + maxBones + '.' ); + return 0; + + } + + return maxBones; + + } + + } + + function getTextureEncodingFromMap( map, gammaOverrideLinear ) { + + var encoding; + + if ( ! map ) { + + encoding = LinearEncoding; + + } else if ( map.isTexture ) { + + encoding = map.encoding; + + } else if ( map.isWebGLRenderTarget ) { + + console.warn( "THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead." ); + encoding = map.texture.encoding; + + } + + // add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point. + if ( encoding === LinearEncoding && gammaOverrideLinear ) { + + encoding = GammaEncoding; + + } + + return encoding; + + } + + this.getParameters = function ( material, lights, shadows, fog, nClipPlanes, nClipIntersection, object ) { + + var shaderID = shaderIDs[ material.type ]; + + // heuristics to create shader parameters according to lights in the scene + // (not to blow over maxLights budget) + + var maxBones = object.isSkinnedMesh ? allocateBones( object ) : 0; + var precision = capabilities.precision; + + if ( material.precision !== null ) { + + precision = capabilities.getMaxPrecision( material.precision ); + + if ( precision !== material.precision ) { + + console.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' ); + + } + + } + + var currentRenderTarget = renderer.getRenderTarget(); + + var parameters = { + + shaderID: shaderID, + + precision: precision, + supportsVertexTextures: capabilities.vertexTextures, + outputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ), + map: !! material.map, + mapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ), + matcap: !! material.matcap, + matcapEncoding: getTextureEncodingFromMap( material.matcap, renderer.gammaInput ), + envMap: !! material.envMap, + envMapMode: material.envMap && material.envMap.mapping, + envMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ), + envMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ), + lightMap: !! material.lightMap, + aoMap: !! material.aoMap, + emissiveMap: !! material.emissiveMap, + emissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ), + bumpMap: !! material.bumpMap, + normalMap: !! material.normalMap, + objectSpaceNormalMap: material.normalMapType === ObjectSpaceNormalMap, + displacementMap: !! material.displacementMap, + roughnessMap: !! material.roughnessMap, + metalnessMap: !! material.metalnessMap, + specularMap: !! material.specularMap, + alphaMap: !! material.alphaMap, + + gradientMap: !! material.gradientMap, + + combine: material.combine, + + vertexColors: material.vertexColors, + + fog: !! fog, + useFog: material.fog, + fogExp: ( fog && fog.isFogExp2 ), + + flatShading: material.flatShading, + + sizeAttenuation: material.sizeAttenuation, + logarithmicDepthBuffer: capabilities.logarithmicDepthBuffer, + + skinning: material.skinning && maxBones > 0, + maxBones: maxBones, + useVertexTexture: capabilities.floatVertexTextures, + + morphTargets: material.morphTargets, + morphNormals: material.morphNormals, + maxMorphTargets: renderer.maxMorphTargets, + maxMorphNormals: renderer.maxMorphNormals, + + numDirLights: lights.directional.length, + numPointLights: lights.point.length, + numSpotLights: lights.spot.length, + numRectAreaLights: lights.rectArea.length, + numHemiLights: lights.hemi.length, + + numClippingPlanes: nClipPlanes, + numClipIntersection: nClipIntersection, + + dithering: material.dithering, + + shadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && shadows.length > 0, + shadowMapType: renderer.shadowMap.type, + + toneMapping: renderer.toneMapping, + physicallyCorrectLights: renderer.physicallyCorrectLights, + + premultipliedAlpha: material.premultipliedAlpha, + + alphaTest: material.alphaTest, + doubleSided: material.side === DoubleSide, + flipSided: material.side === BackSide, + + depthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false + + }; + + return parameters; + + }; + + this.getProgramCode = function ( material, parameters ) { + + var array = []; + + if ( parameters.shaderID ) { + + array.push( parameters.shaderID ); + + } else { + + array.push( material.fragmentShader ); + array.push( material.vertexShader ); + + } + + if ( material.defines !== undefined ) { + + for ( var name in material.defines ) { + + array.push( name ); + array.push( material.defines[ name ] ); + + } + + } + + for ( var i = 0; i < parameterNames.length; i ++ ) { + + array.push( parameters[ parameterNames[ i ] ] ); + + } + + array.push( material.onBeforeCompile.toString() ); + + array.push( renderer.gammaOutput ); + + array.push( renderer.gammaFactor ); + + return array.join(); + + }; + + this.acquireProgram = function ( material, shader, parameters, code ) { + + var program; + + // Check if code has been already compiled + for ( var p = 0, pl = programs.length; p < pl; p ++ ) { + + var programInfo = programs[ p ]; + + if ( programInfo.code === code ) { + + program = programInfo; + ++ program.usedTimes; + + break; + + } + + } + + if ( program === undefined ) { + + program = new WebGLProgram( renderer, extensions, code, material, shader, parameters, capabilities ); + programs.push( program ); + + } + + return program; + + }; + + this.releaseProgram = function ( program ) { + + if ( -- program.usedTimes === 0 ) { + + // Remove from unordered set + var i = programs.indexOf( program ); + programs[ i ] = programs[ programs.length - 1 ]; + programs.pop(); + + // Free WebGL resources + program.destroy(); + + } + + }; + + // Exposed for resource monitoring & error feedback via renderer.info: + this.programs = programs; + +} + + +export { WebGLPrograms }; diff --git a/lib/renderers/webgl/WebGLProperties.js b/lib/renderers/webgl/WebGLProperties.js new file mode 100644 index 0000000..e875912 --- /dev/null +++ b/lib/renderers/webgl/WebGLProperties.js @@ -0,0 +1,52 @@ +/** + * @author fordacious / fordacious.github.io + */ + +function WebGLProperties() { + + var properties = new WeakMap(); + + function get( object ) { + + var map = properties.get( object ); + + if ( map === undefined ) { + + map = {}; + properties.set( object, map ); + + } + + return map; + + } + + function remove( object ) { + + properties.delete( object ); + + } + + function update( object, key, value ) { + + properties.get( object )[ key ] = value; + + } + + function dispose() { + + properties = new WeakMap(); + + } + + return { + get: get, + remove: remove, + update: update, + dispose: dispose + }; + +} + + +export { WebGLProperties }; diff --git a/lib/renderers/webgl/WebGLRenderLists.js b/lib/renderers/webgl/WebGLRenderLists.js new file mode 100644 index 0000000..76656dd --- /dev/null +++ b/lib/renderers/webgl/WebGLRenderLists.js @@ -0,0 +1,161 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function painterSortStable( a, b ) { + + if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } else if ( a.program && b.program && a.program !== b.program ) { + + return a.program.id - b.program.id; + + } else if ( a.material.id !== b.material.id ) { + + return a.material.id - b.material.id; + + } else if ( a.z !== b.z ) { + + return a.z - b.z; + + } else { + + return a.id - b.id; + + } + +} + +function reversePainterSortStable( a, b ) { + + if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } if ( a.z !== b.z ) { + + return b.z - a.z; + + } else { + + return a.id - b.id; + + } + +} + + +function WebGLRenderList() { + + var renderItems = []; + var renderItemsIndex = 0; + + var opaque = []; + var transparent = []; + + function init() { + + renderItemsIndex = 0; + + opaque.length = 0; + transparent.length = 0; + + } + + function push( object, geometry, material, z, group ) { + + var renderItem = renderItems[ renderItemsIndex ]; + + if ( renderItem === undefined ) { + + renderItem = { + id: object.id, + object: object, + geometry: geometry, + material: material, + program: material.program, + renderOrder: object.renderOrder, + z: z, + group: group + }; + + renderItems[ renderItemsIndex ] = renderItem; + + } else { + + renderItem.id = object.id; + renderItem.object = object; + renderItem.geometry = geometry; + renderItem.material = material; + renderItem.program = material.program; + renderItem.renderOrder = object.renderOrder; + renderItem.z = z; + renderItem.group = group; + + } + + + ( material.transparent === true ? transparent : opaque ).push( renderItem ); + + renderItemsIndex ++; + + } + + function sort() { + + if ( opaque.length > 1 ) opaque.sort( painterSortStable ); + if ( transparent.length > 1 ) transparent.sort( reversePainterSortStable ); + + } + + return { + opaque: opaque, + transparent: transparent, + + init: init, + push: push, + + sort: sort + }; + +} + +function WebGLRenderLists() { + + var lists = {}; + + function get( scene, camera ) { + + var hash = scene.id + ',' + camera.id; + var list = lists[ hash ]; + + if ( list === undefined ) { + + // console.log( 'THREE.WebGLRenderLists:', hash ); + + list = new WebGLRenderList(); + lists[ hash ] = list; + + } + + return list; + + } + + function dispose() { + + lists = {}; + + } + + return { + get: get, + dispose: dispose + }; + +} + + +export { WebGLRenderLists }; diff --git a/lib/renderers/webgl/WebGLRenderStates.js b/lib/renderers/webgl/WebGLRenderStates.js new file mode 100644 index 0000000..dc90f63 --- /dev/null +++ b/lib/renderers/webgl/WebGLRenderStates.js @@ -0,0 +1,104 @@ +/** + * @author Mugen87 / https://github.com/Mugen87 + */ + +import { WebGLLights } from './WebGLLights.js'; + +function WebGLRenderState() { + + var lights = new WebGLLights(); + + var lightsArray = []; + var shadowsArray = []; + + function init() { + + lightsArray.length = 0; + shadowsArray.length = 0; + + } + + function pushLight( light ) { + + lightsArray.push( light ); + + } + + function pushShadow( shadowLight ) { + + shadowsArray.push( shadowLight ); + + } + + function setupLights( camera ) { + + lights.setup( lightsArray, shadowsArray, camera ); + + } + + var state = { + lightsArray: lightsArray, + shadowsArray: shadowsArray, + + lights: lights + }; + + return { + init: init, + state: state, + setupLights: setupLights, + + pushLight: pushLight, + pushShadow: pushShadow + }; + +} + +function WebGLRenderStates() { + + var renderStates = {}; + + function get( scene, camera ) { + + var renderState; + + if ( renderStates[ scene.id ] === undefined ) { + + renderState = new WebGLRenderState(); + renderStates[ scene.id ] = {}; + renderStates[ scene.id ][ camera.id ] = renderState; + + } else { + + if ( renderStates[ scene.id ][ camera.id ] === undefined ) { + + renderState = new WebGLRenderState(); + renderStates[ scene.id ][ camera.id ] = renderState; + + } else { + + renderState = renderStates[ scene.id ][ camera.id ]; + + } + + } + + return renderState; + + } + + function dispose() { + + renderStates = {}; + + } + + return { + get: get, + dispose: dispose + }; + +} + + +export { WebGLRenderStates }; diff --git a/lib/renderers/webgl/WebGLShader.js b/lib/renderers/webgl/WebGLShader.js new file mode 100644 index 0000000..ca2a0d9 --- /dev/null +++ b/lib/renderers/webgl/WebGLShader.js @@ -0,0 +1,46 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function addLineNumbers( string ) { + + var lines = string.split( '\n' ); + + for ( var i = 0; i < lines.length; i ++ ) { + + lines[ i ] = ( i + 1 ) + ': ' + lines[ i ]; + + } + + return lines.join( '\n' ); + +} + +function WebGLShader( gl, type, string ) { + + var shader = gl.createShader( type ); + + gl.shaderSource( shader, string ); + gl.compileShader( shader ); + + if ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) { + + console.error( 'THREE.WebGLShader: Shader couldn\'t compile.' ); + + } + + if ( gl.getShaderInfoLog( shader ) !== '' ) { + + console.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) ); + + } + + // --enable-privileged-webgl-extension + // console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) ); + + return shader; + +} + + +export { WebGLShader }; diff --git a/lib/renderers/webgl/WebGLShadowMap.js b/lib/renderers/webgl/WebGLShadowMap.js new file mode 100644 index 0000000..6c14464 --- /dev/null +++ b/lib/renderers/webgl/WebGLShadowMap.js @@ -0,0 +1,430 @@ +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + +import { FrontSide, BackSide, DoubleSide, RGBAFormat, NearestFilter, PCFShadowMap, RGBADepthPacking } from '../../constants.js'; +import { WebGLRenderTarget } from '../WebGLRenderTarget.js'; +import { MeshDepthMaterial } from '../../materials/MeshDepthMaterial.js'; +import { MeshDistanceMaterial } from '../../materials/MeshDistanceMaterial.js'; +import { Vector4 } from '../../math/Vector4.js'; +import { Vector3 } from '../../math/Vector3.js'; +import { Vector2 } from '../../math/Vector2.js'; +import { Matrix4 } from '../../math/Matrix4.js'; +import { Frustum } from '../../math/Frustum.js'; + +function WebGLShadowMap( _renderer, _objects, maxTextureSize ) { + + var _frustum = new Frustum(), + _projScreenMatrix = new Matrix4(), + + _shadowMapSize = new Vector2(), + _maxShadowMapSize = new Vector2( maxTextureSize, maxTextureSize ), + + _lookTarget = new Vector3(), + _lightPositionWorld = new Vector3(), + + _MorphingFlag = 1, + _SkinningFlag = 2, + + _NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1, + + _depthMaterials = new Array( _NumberOfMaterialVariants ), + _distanceMaterials = new Array( _NumberOfMaterialVariants ), + + _materialCache = {}; + + var shadowSide = { 0: BackSide, 1: FrontSide, 2: DoubleSide }; + + var cubeDirections = [ + new Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ), + new Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 ) + ]; + + var cubeUps = [ + new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), + new Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ), new Vector3( 0, 0, - 1 ) + ]; + + var cube2DViewPorts = [ + new Vector4(), new Vector4(), new Vector4(), + new Vector4(), new Vector4(), new Vector4() + ]; + + // init + + for ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) { + + var useMorphing = ( i & _MorphingFlag ) !== 0; + var useSkinning = ( i & _SkinningFlag ) !== 0; + + var depthMaterial = new MeshDepthMaterial( { + + depthPacking: RGBADepthPacking, + + morphTargets: useMorphing, + skinning: useSkinning + + } ); + + _depthMaterials[ i ] = depthMaterial; + + // + + var distanceMaterial = new MeshDistanceMaterial( { + + morphTargets: useMorphing, + skinning: useSkinning + + } ); + + _distanceMaterials[ i ] = distanceMaterial; + + } + + // + + var scope = this; + + this.enabled = false; + + this.autoUpdate = true; + this.needsUpdate = false; + + this.type = PCFShadowMap; + + this.render = function ( lights, scene, camera ) { + + if ( scope.enabled === false ) return; + if ( scope.autoUpdate === false && scope.needsUpdate === false ) return; + + if ( lights.length === 0 ) return; + + // TODO Clean up (needed in case of contextlost) + var _gl = _renderer.context; + var _state = _renderer.state; + + // Set GL state for depth map. + _state.disable( _gl.BLEND ); + _state.buffers.color.setClear( 1, 1, 1, 1 ); + _state.buffers.depth.setTest( true ); + _state.setScissorTest( false ); + + // render depth map + + var faceCount; + + for ( var i = 0, il = lights.length; i < il; i ++ ) { + + var light = lights[ i ]; + var shadow = light.shadow; + var isPointLight = light && light.isPointLight; + + if ( shadow === undefined ) { + + console.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' ); + continue; + + } + + var shadowCamera = shadow.camera; + + _shadowMapSize.copy( shadow.mapSize ); + _shadowMapSize.min( _maxShadowMapSize ); + + if ( isPointLight ) { + + var vpWidth = _shadowMapSize.x; + var vpHeight = _shadowMapSize.y; + + // These viewports map a cube-map onto a 2D texture with the + // following orientation: + // + // xzXZ + // y Y + // + // X - Positive x direction + // x - Negative x direction + // Y - Positive y direction + // y - Negative y direction + // Z - Positive z direction + // z - Negative z direction + + // positive X + cube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight ); + // negative X + cube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight ); + // positive Z + cube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight ); + // negative Z + cube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight ); + // positive Y + cube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight ); + // negative Y + cube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight ); + + _shadowMapSize.x *= 4.0; + _shadowMapSize.y *= 2.0; + + } + + if ( shadow.map === null ) { + + var pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat }; + + shadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars ); + shadow.map.texture.name = light.name + ".shadowMap"; + + shadowCamera.updateProjectionMatrix(); + + } + + if ( shadow.isSpotLightShadow ) { + + shadow.update( light ); + + } + + var shadowMap = shadow.map; + var shadowMatrix = shadow.matrix; + + _lightPositionWorld.setFromMatrixPosition( light.matrixWorld ); + shadowCamera.position.copy( _lightPositionWorld ); + + if ( isPointLight ) { + + faceCount = 6; + + // for point lights we set the shadow matrix to be a translation-only matrix + // equal to inverse of the light's position + + shadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z ); + + } else { + + faceCount = 1; + + _lookTarget.setFromMatrixPosition( light.target.matrixWorld ); + shadowCamera.lookAt( _lookTarget ); + shadowCamera.updateMatrixWorld(); + + // compute shadow matrix + + shadowMatrix.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 + ); + + shadowMatrix.multiply( shadowCamera.projectionMatrix ); + shadowMatrix.multiply( shadowCamera.matrixWorldInverse ); + + } + + _renderer.setRenderTarget( shadowMap ); + _renderer.clear(); + + // render shadow map for each cube face (if omni-directional) or + // run a single pass if not + + for ( var face = 0; face < faceCount; face ++ ) { + + if ( isPointLight ) { + + _lookTarget.copy( shadowCamera.position ); + _lookTarget.add( cubeDirections[ face ] ); + shadowCamera.up.copy( cubeUps[ face ] ); + shadowCamera.lookAt( _lookTarget ); + shadowCamera.updateMatrixWorld(); + + var vpDimensions = cube2DViewPorts[ face ]; + _state.viewport( vpDimensions ); + + } + + // update camera matrices and frustum + + _projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse ); + _frustum.setFromMatrix( _projScreenMatrix ); + + // set object matrices & frustum culling + + renderObject( scene, camera, shadowCamera, isPointLight ); + + } + + } + + scope.needsUpdate = false; + + }; + + function getDepthMaterial( object, material, isPointLight, lightPositionWorld, shadowCameraNear, shadowCameraFar ) { + + var geometry = object.geometry; + + var result = null; + + var materialVariants = _depthMaterials; + var customMaterial = object.customDepthMaterial; + + if ( isPointLight ) { + + materialVariants = _distanceMaterials; + customMaterial = object.customDistanceMaterial; + + } + + if ( ! customMaterial ) { + + var useMorphing = false; + + if ( material.morphTargets ) { + + if ( geometry && geometry.isBufferGeometry ) { + + useMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0; + + } else if ( geometry && geometry.isGeometry ) { + + useMorphing = geometry.morphTargets && geometry.morphTargets.length > 0; + + } + + } + + if ( object.isSkinnedMesh && material.skinning === false ) { + + console.warn( 'THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:', object ); + + } + + var useSkinning = object.isSkinnedMesh && material.skinning; + + var variantIndex = 0; + + if ( useMorphing ) variantIndex |= _MorphingFlag; + if ( useSkinning ) variantIndex |= _SkinningFlag; + + result = materialVariants[ variantIndex ]; + + } else { + + result = customMaterial; + + } + + if ( _renderer.localClippingEnabled && + material.clipShadows === true && + material.clippingPlanes.length !== 0 ) { + + // in this case we need a unique material instance reflecting the + // appropriate state + + var keyA = result.uuid, keyB = material.uuid; + + var materialsForVariant = _materialCache[ keyA ]; + + if ( materialsForVariant === undefined ) { + + materialsForVariant = {}; + _materialCache[ keyA ] = materialsForVariant; + + } + + var cachedMaterial = materialsForVariant[ keyB ]; + + if ( cachedMaterial === undefined ) { + + cachedMaterial = result.clone(); + materialsForVariant[ keyB ] = cachedMaterial; + + } + + result = cachedMaterial; + + } + + result.visible = material.visible; + result.wireframe = material.wireframe; + + result.side = ( material.shadowSide != null ) ? material.shadowSide : shadowSide[ material.side ]; + + result.clipShadows = material.clipShadows; + result.clippingPlanes = material.clippingPlanes; + result.clipIntersection = material.clipIntersection; + + result.wireframeLinewidth = material.wireframeLinewidth; + result.linewidth = material.linewidth; + + if ( isPointLight && result.isMeshDistanceMaterial ) { + + result.referencePosition.copy( lightPositionWorld ); + result.nearDistance = shadowCameraNear; + result.farDistance = shadowCameraFar; + + } + + return result; + + } + + function renderObject( object, camera, shadowCamera, isPointLight ) { + + if ( object.visible === false ) return; + + var visible = object.layers.test( camera.layers ); + + if ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) { + + if ( object.castShadow && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) { + + object.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld ); + + var geometry = _objects.update( object ); + var material = object.material; + + if ( Array.isArray( material ) ) { + + var groups = geometry.groups; + + for ( var k = 0, kl = groups.length; k < kl; k ++ ) { + + var group = groups[ k ]; + var groupMaterial = material[ group.materialIndex ]; + + if ( groupMaterial && groupMaterial.visible ) { + + var depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld, shadowCamera.near, shadowCamera.far ); + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group ); + + } + + } + + } else if ( material.visible ) { + + var depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld, shadowCamera.near, shadowCamera.far ); + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null ); + + } + + } + + } + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + renderObject( children[ i ], camera, shadowCamera, isPointLight ); + + } + + } + +} + + +export { WebGLShadowMap }; diff --git a/lib/renderers/webgl/WebGLState.js b/lib/renderers/webgl/WebGLState.js new file mode 100644 index 0000000..9181de3 --- /dev/null +++ b/lib/renderers/webgl/WebGLState.js @@ -0,0 +1,978 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { NotEqualDepth, GreaterDepth, GreaterEqualDepth, EqualDepth, LessEqualDepth, LessDepth, AlwaysDepth, NeverDepth, CullFaceFront, CullFaceBack, CullFaceNone, CustomBlending, MultiplyBlending, SubtractiveBlending, AdditiveBlending, NoBlending, NormalBlending, AddEquation, DoubleSide, BackSide } from '../../constants.js'; +import { Vector4 } from '../../math/Vector4.js'; + +function WebGLState( gl, extensions, utils, capabilities ) { + + function ColorBuffer() { + + var locked = false; + + var color = new Vector4(); + var currentColorMask = null; + var 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 ); + + } + + }, + + reset: function () { + + locked = false; + + currentColorMask = null; + currentColorClear.set( - 1, 0, 0, 0 ); // set to invalid state + + } + + }; + + } + + function DepthBuffer() { + + var locked = false; + + var currentDepthMask = null; + var currentDepthFunc = null; + var currentDepthClear = null; + + return { + + setTest: function ( depthTest ) { + + if ( depthTest ) { + + enable( gl.DEPTH_TEST ); + + } else { + + disable( gl.DEPTH_TEST ); + + } + + }, + + setMask: function ( depthMask ) { + + if ( currentDepthMask !== depthMask && ! locked ) { + + gl.depthMask( depthMask ); + currentDepthMask = depthMask; + + } + + }, + + setFunc: function ( depthFunc ) { + + if ( currentDepthFunc !== depthFunc ) { + + if ( depthFunc ) { + + switch ( depthFunc ) { + + case NeverDepth: + + gl.depthFunc( gl.NEVER ); + break; + + case AlwaysDepth: + + gl.depthFunc( gl.ALWAYS ); + break; + + case LessDepth: + + gl.depthFunc( gl.LESS ); + break; + + case LessEqualDepth: + + gl.depthFunc( gl.LEQUAL ); + break; + + case EqualDepth: + + gl.depthFunc( gl.EQUAL ); + break; + + case GreaterEqualDepth: + + gl.depthFunc( gl.GEQUAL ); + break; + + case GreaterDepth: + + gl.depthFunc( gl.GREATER ); + break; + + case NotEqualDepth: + + gl.depthFunc( gl.NOTEQUAL ); + break; + + default: + + gl.depthFunc( gl.LEQUAL ); + + } + + } else { + + gl.depthFunc( gl.LEQUAL ); + + } + + 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() { + + var locked = false; + + var currentStencilMask = null; + var currentStencilFunc = null; + var currentStencilRef = null; + var currentStencilFuncMask = null; + var currentStencilFail = null; + var currentStencilZFail = null; + var currentStencilZPass = null; + var currentStencilClear = null; + + return { + + setTest: function ( stencilTest ) { + + if ( stencilTest ) { + + enable( gl.STENCIL_TEST ); + + } else { + + disable( gl.STENCIL_TEST ); + + } + + }, + + setMask: function ( stencilMask ) { + + if ( currentStencilMask !== stencilMask && ! locked ) { + + gl.stencilMask( stencilMask ); + currentStencilMask = stencilMask; + + } + + }, + + setFunc: function ( stencilFunc, stencilRef, stencilMask ) { + + if ( currentStencilFunc !== stencilFunc || + currentStencilRef !== stencilRef || + currentStencilFuncMask !== stencilMask ) { + + gl.stencilFunc( stencilFunc, stencilRef, stencilMask ); + + currentStencilFunc = stencilFunc; + currentStencilRef = stencilRef; + currentStencilFuncMask = stencilMask; + + } + + }, + + setOp: function ( stencilFail, stencilZFail, stencilZPass ) { + + if ( currentStencilFail !== stencilFail || + currentStencilZFail !== stencilZFail || + currentStencilZPass !== stencilZPass ) { + + gl.stencilOp( stencilFail, stencilZFail, stencilZPass ); + + currentStencilFail = stencilFail; + currentStencilZFail = stencilZFail; + currentStencilZPass = stencilZPass; + + } + + }, + + 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; + currentStencilClear = null; + + } + + }; + + } + + // + + var colorBuffer = new ColorBuffer(); + var depthBuffer = new DepthBuffer(); + var stencilBuffer = new StencilBuffer(); + + var maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); + var newAttributes = new Uint8Array( maxVertexAttributes ); + var enabledAttributes = new Uint8Array( maxVertexAttributes ); + var attributeDivisors = new Uint8Array( maxVertexAttributes ); + + var enabledCapabilities = {}; + + var compressedTextureFormats = null; + + var currentProgram = null; + + var currentBlendingEnabled = null; + var currentBlending = null; + var currentBlendEquation = null; + var currentBlendSrc = null; + var currentBlendDst = null; + var currentBlendEquationAlpha = null; + var currentBlendSrcAlpha = null; + var currentBlendDstAlpha = null; + var currentPremultipledAlpha = false; + + var currentFlipSided = null; + var currentCullFace = null; + + var currentLineWidth = null; + + var currentPolygonOffsetFactor = null; + var currentPolygonOffsetUnits = null; + + var maxTextures = gl.getParameter( gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS ); + + var lineWidthAvailable = false; + var version = 0; + var glVersion = gl.getParameter( gl.VERSION ); + + if ( glVersion.indexOf( 'WebGL' ) !== - 1 ) { + + version = parseFloat( /^WebGL\ ([0-9])/.exec( glVersion )[ 1 ] ); + lineWidthAvailable = ( version >= 1.0 ); + + } else if ( glVersion.indexOf( 'OpenGL ES' ) !== - 1 ) { + + version = parseFloat( /^OpenGL\ ES\ ([0-9])/.exec( glVersion )[ 1 ] ); + lineWidthAvailable = ( version >= 2.0 ); + + } + + var currentTextureSlot = null; + var currentBoundTextures = {}; + + var currentScissor = new Vector4(); + var currentViewport = new Vector4(); + + function createTexture( type, target, count ) { + + var data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4. + var 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 ( var i = 0; i < count; i ++ ) { + + gl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data ); + + } + + return texture; + + } + + var emptyTextures = {}; + emptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 ); + emptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 ); + + // init + + colorBuffer.setClear( 0, 0, 0, 1 ); + depthBuffer.setClear( 1 ); + stencilBuffer.setClear( 0 ); + + enable( gl.DEPTH_TEST ); + depthBuffer.setFunc( LessEqualDepth ); + + setFlipSided( false ); + setCullFace( CullFaceBack ); + enable( gl.CULL_FACE ); + + setBlending( NoBlending ); + + // + + function initAttributes() { + + for ( var i = 0, l = newAttributes.length; i < l; i ++ ) { + + newAttributes[ i ] = 0; + + } + + } + + function enableAttribute( attribute ) { + + enableAttributeAndDivisor( attribute, 0 ); + + } + + function enableAttributeAndDivisor( attribute, meshPerAttribute ) { + + newAttributes[ attribute ] = 1; + + if ( enabledAttributes[ attribute ] === 0 ) { + + gl.enableVertexAttribArray( attribute ); + enabledAttributes[ attribute ] = 1; + + } + + if ( attributeDivisors[ attribute ] !== meshPerAttribute ) { + + var extension = capabilities.isWebGL2 ? gl : extensions.get( 'ANGLE_instanced_arrays' ); + + extension[ capabilities.isWebGL2 ? 'vertexAttribDivisor' : 'vertexAttribDivisorANGLE' ]( attribute, meshPerAttribute ); + attributeDivisors[ attribute ] = meshPerAttribute; + + } + + } + + function disableUnusedAttributes() { + + for ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) { + + if ( enabledAttributes[ i ] !== newAttributes[ i ] ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + } + + function enable( id ) { + + if ( enabledCapabilities[ id ] !== true ) { + + gl.enable( id ); + enabledCapabilities[ id ] = true; + + } + + } + + function disable( id ) { + + if ( enabledCapabilities[ id ] !== false ) { + + gl.disable( id ); + enabledCapabilities[ id ] = false; + + } + + } + + function getCompressedTextureFormats() { + + if ( compressedTextureFormats === null ) { + + compressedTextureFormats = []; + + if ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) || + extensions.get( 'WEBGL_compressed_texture_s3tc' ) || + extensions.get( 'WEBGL_compressed_texture_etc1' ) || + extensions.get( 'WEBGL_compressed_texture_astc' ) ) { + + var formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS ); + + for ( var i = 0; i < formats.length; i ++ ) { + + compressedTextureFormats.push( formats[ i ] ); + + } + + } + + } + + return compressedTextureFormats; + + } + + function useProgram( program ) { + + if ( currentProgram !== program ) { + + gl.useProgram( program ); + + currentProgram = program; + + return true; + + } + + return false; + + } + + function setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) { + + if ( blending === NoBlending ) { + + if ( currentBlendingEnabled ) { + + disable( gl.BLEND ); + currentBlendingEnabled = false; + + } + + return; + + } + + if ( ! currentBlendingEnabled ) { + + enable( gl.BLEND ); + currentBlendingEnabled = true; + + } + + if ( blending !== CustomBlending ) { + + if ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) { + + if ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) { + + gl.blendEquation( gl.FUNC_ADD ); + + currentBlendEquation = AddEquation; + currentBlendEquationAlpha = AddEquation; + + } + + if ( premultipliedAlpha ) { + + switch ( blending ) { + + case NormalBlending: + gl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); + break; + + case AdditiveBlending: + gl.blendFunc( gl.ONE, gl.ONE ); + break; + + case SubtractiveBlending: + gl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA ); + break; + + case MultiplyBlending: + gl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA ); + break; + + default: + console.error( 'THREE.WebGLState: Invalid blending: ', blending ); + break; + + } + + } else { + + switch ( blending ) { + + case NormalBlending: + gl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); + break; + + case AdditiveBlending: + gl.blendFunc( gl.SRC_ALPHA, gl.ONE ); + break; + + case SubtractiveBlending: + gl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR ); + break; + + case MultiplyBlending: + gl.blendFunc( gl.ZERO, gl.SRC_COLOR ); + break; + + default: + console.error( 'THREE.WebGLState: Invalid blending: ', blending ); + break; + + } + + } + + currentBlendSrc = null; + currentBlendDst = null; + currentBlendSrcAlpha = null; + currentBlendDstAlpha = null; + + currentBlending = blending; + currentPremultipledAlpha = premultipliedAlpha; + + } + + return; + + } + + // custom blending + + blendEquationAlpha = blendEquationAlpha || blendEquation; + blendSrcAlpha = blendSrcAlpha || blendSrc; + blendDstAlpha = blendDstAlpha || blendDst; + + if ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) { + + gl.blendEquationSeparate( utils.convert( blendEquation ), utils.convert( blendEquationAlpha ) ); + + currentBlendEquation = blendEquation; + currentBlendEquationAlpha = blendEquationAlpha; + + } + + if ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) { + + gl.blendFuncSeparate( utils.convert( blendSrc ), utils.convert( blendDst ), utils.convert( blendSrcAlpha ), utils.convert( blendDstAlpha ) ); + + currentBlendSrc = blendSrc; + currentBlendDst = blendDst; + currentBlendSrcAlpha = blendSrcAlpha; + currentBlendDstAlpha = blendDstAlpha; + + } + + currentBlending = blending; + currentPremultipledAlpha = null; + + } + + function setMaterial( material, frontFaceCW ) { + + material.side === DoubleSide + ? disable( gl.CULL_FACE ) + : enable( gl.CULL_FACE ); + + var flipSided = ( material.side === BackSide ); + if ( frontFaceCW ) flipSided = ! flipSided; + + setFlipSided( flipSided ); + + ( material.blending === NormalBlending && material.transparent === false ) + ? setBlending( NoBlending ) + : setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha ); + + depthBuffer.setFunc( material.depthFunc ); + depthBuffer.setTest( material.depthTest ); + depthBuffer.setMask( material.depthWrite ); + colorBuffer.setMask( material.colorWrite ); + + setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits ); + + } + + // + + function setFlipSided( flipSided ) { + + if ( currentFlipSided !== flipSided ) { + + if ( flipSided ) { + + gl.frontFace( gl.CW ); + + } else { + + gl.frontFace( gl.CCW ); + + } + + currentFlipSided = flipSided; + + } + + } + + function setCullFace( cullFace ) { + + if ( cullFace !== CullFaceNone ) { + + enable( gl.CULL_FACE ); + + if ( cullFace !== currentCullFace ) { + + if ( cullFace === CullFaceBack ) { + + gl.cullFace( gl.BACK ); + + } else if ( cullFace === CullFaceFront ) { + + gl.cullFace( gl.FRONT ); + + } else { + + gl.cullFace( gl.FRONT_AND_BACK ); + + } + + } + + } else { + + disable( gl.CULL_FACE ); + + } + + currentCullFace = cullFace; + + } + + function setLineWidth( width ) { + + if ( width !== currentLineWidth ) { + + if ( lineWidthAvailable ) gl.lineWidth( width ); + + currentLineWidth = width; + + } + + } + + function setPolygonOffset( polygonOffset, factor, units ) { + + if ( polygonOffset ) { + + enable( gl.POLYGON_OFFSET_FILL ); + + if ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) { + + gl.polygonOffset( factor, units ); + + currentPolygonOffsetFactor = factor; + currentPolygonOffsetUnits = units; + + } + + } else { + + disable( gl.POLYGON_OFFSET_FILL ); + + } + + } + + function setScissorTest( scissorTest ) { + + if ( scissorTest ) { + + enable( gl.SCISSOR_TEST ); + + } else { + + disable( gl.SCISSOR_TEST ); + + } + + } + + // texture + + function activeTexture( webglSlot ) { + + if ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1; + + if ( currentTextureSlot !== webglSlot ) { + + gl.activeTexture( webglSlot ); + currentTextureSlot = webglSlot; + + } + + } + + function bindTexture( webglType, webglTexture ) { + + if ( currentTextureSlot === null ) { + + activeTexture(); + + } + + var boundTexture = currentBoundTextures[ currentTextureSlot ]; + + if ( boundTexture === undefined ) { + + boundTexture = { type: undefined, texture: undefined }; + currentBoundTextures[ currentTextureSlot ] = boundTexture; + + } + + if ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) { + + gl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] ); + + boundTexture.type = webglType; + boundTexture.texture = webglTexture; + + } + + } + + function compressedTexImage2D() { + + try { + + gl.compressedTexImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function texImage2D() { + + try { + + gl.texImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function texImage3D() { + + try { + + gl.texImage3D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + // + + function scissor( scissor ) { + + if ( currentScissor.equals( scissor ) === false ) { + + gl.scissor( scissor.x, scissor.y, scissor.z, scissor.w ); + currentScissor.copy( scissor ); + + } + + } + + function viewport( viewport ) { + + if ( currentViewport.equals( viewport ) === false ) { + + gl.viewport( viewport.x, viewport.y, viewport.z, viewport.w ); + currentViewport.copy( viewport ); + + } + + } + + // + + function reset() { + + for ( var i = 0; i < enabledAttributes.length; i ++ ) { + + if ( enabledAttributes[ i ] === 1 ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + enabledCapabilities = {}; + + compressedTextureFormats = null; + + currentTextureSlot = null; + currentBoundTextures = {}; + + currentProgram = null; + + currentBlending = null; + + currentFlipSided = null; + currentCullFace = null; + + colorBuffer.reset(); + depthBuffer.reset(); + stencilBuffer.reset(); + + } + + return { + + buffers: { + color: colorBuffer, + depth: depthBuffer, + stencil: stencilBuffer + }, + + initAttributes: initAttributes, + enableAttribute: enableAttribute, + enableAttributeAndDivisor: enableAttributeAndDivisor, + disableUnusedAttributes: disableUnusedAttributes, + enable: enable, + disable: disable, + getCompressedTextureFormats: getCompressedTextureFormats, + + useProgram: useProgram, + + setBlending: setBlending, + setMaterial: setMaterial, + + setFlipSided: setFlipSided, + setCullFace: setCullFace, + + setLineWidth: setLineWidth, + setPolygonOffset: setPolygonOffset, + + setScissorTest: setScissorTest, + + activeTexture: activeTexture, + bindTexture: bindTexture, + compressedTexImage2D: compressedTexImage2D, + texImage2D: texImage2D, + texImage3D: texImage3D, + + scissor: scissor, + viewport: viewport, + + reset: reset + + }; + +} + + +export { WebGLState }; diff --git a/lib/renderers/webgl/WebGLTextures.js b/lib/renderers/webgl/WebGLTextures.js new file mode 100644 index 0000000..c7a8603 --- /dev/null +++ b/lib/renderers/webgl/WebGLTextures.js @@ -0,0 +1,948 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { LinearFilter, NearestFilter, RGBFormat, RGBAFormat, DepthFormat, DepthStencilFormat, UnsignedShortType, UnsignedIntType, UnsignedInt248Type, FloatType, HalfFloatType, ClampToEdgeWrapping, NearestMipMapLinearFilter, NearestMipMapNearestFilter } from '../../constants.js'; +import { _Math } from '../../math/Math.js'; + +function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) { + + var _videoTextures = {}; + var _canvas; + + // + + function clampToMaxSize( image, maxSize ) { + + if ( image.width > maxSize || image.height > maxSize ) { + + if ( 'data' in image ) { + + console.warn( 'THREE.WebGLRenderer: image in DataTexture is too big (' + image.width + 'x' + image.height + ').' ); + return; + + } + + // Warning: Scaling through the canvas will only work with images that use + // premultiplied alpha. + + var scale = maxSize / Math.max( image.width, image.height ); + + var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = Math.floor( image.width * scale ); + canvas.height = Math.floor( image.height * scale ); + + var context = canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height ); + + console.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height ); + + return canvas; + + } + + return image; + + } + + function isPowerOfTwo( image ) { + + return _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height ); + + } + + function makePowerOfTwo( image ) { + + if ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof ImageBitmap ) { + + if ( _canvas === undefined ) _canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + + _canvas.width = _Math.floorPowerOfTwo( image.width ); + _canvas.height = _Math.floorPowerOfTwo( image.height ); + + var context = _canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, _canvas.width, _canvas.height ); + + console.warn( 'THREE.WebGLRenderer: image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + _canvas.width + 'x' + _canvas.height ); + + return _canvas; + + } + + return image; + + } + + function textureNeedsPowerOfTwo( texture ) { + + if ( capabilities.isWebGL2 ) return false; + + return ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) || + ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ); + + } + + function textureNeedsGenerateMipmaps( texture, isPowerOfTwo ) { + + return texture.generateMipmaps && isPowerOfTwo && + texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter; + + } + + function generateMipmap( target, texture, width, height ) { + + _gl.generateMipmap( target ); + + var textureProperties = properties.get( texture ); + + // 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; + + } + + function getInternalFormat( glFormat, glType ) { + + if ( ! capabilities.isWebGL2 ) return glFormat; + + if ( glFormat === _gl.RED ) { + + if ( glType === _gl.FLOAT ) return _gl.R32F; + if ( glType === _gl.HALF_FLOAT ) return _gl.R16F; + if ( glType === _gl.UNSIGNED_BYTE ) return _gl.R8; + + } + + if ( glFormat === _gl.RGB ) { + + if ( glType === _gl.FLOAT ) return _gl.RGB32F; + if ( glType === _gl.HALF_FLOAT ) return _gl.RGB16F; + if ( glType === _gl.UNSIGNED_BYTE ) return _gl.RGB8; + + } + + if ( glFormat === _gl.RGBA ) { + + if ( glType === _gl.FLOAT ) return _gl.RGBA32F; + if ( glType === _gl.HALF_FLOAT ) return _gl.RGBA16F; + if ( glType === _gl.UNSIGNED_BYTE ) return _gl.RGBA8; + + } + + return glFormat; + + } + + // Fallback filters for non-power-of-2 textures + + function filterFallback( f ) { + + if ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) { + + return _gl.NEAREST; + + } + + return _gl.LINEAR; + + } + + // + + function onTextureDispose( event ) { + + var texture = event.target; + + texture.removeEventListener( 'dispose', onTextureDispose ); + + deallocateTexture( texture ); + + if ( texture.isVideoTexture ) { + + delete _videoTextures[ texture.id ]; + + } + + info.memory.textures --; + + } + + function onRenderTargetDispose( event ) { + + var renderTarget = event.target; + + renderTarget.removeEventListener( 'dispose', onRenderTargetDispose ); + + deallocateRenderTarget( renderTarget ); + + info.memory.textures --; + + } + + // + + function deallocateTexture( texture ) { + + var textureProperties = properties.get( texture ); + + if ( texture.image && textureProperties.__image__webglTextureCube ) { + + // cube texture + + _gl.deleteTexture( textureProperties.__image__webglTextureCube ); + + } else { + + // 2D texture + + if ( textureProperties.__webglInit === undefined ) return; + + _gl.deleteTexture( textureProperties.__webglTexture ); + + } + + // remove all webgl properties + properties.remove( texture ); + + } + + function deallocateRenderTarget( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); + + if ( ! renderTarget ) return; + + if ( textureProperties.__webglTexture !== undefined ) { + + _gl.deleteTexture( textureProperties.__webglTexture ); + + } + + if ( renderTarget.depthTexture ) { + + renderTarget.depthTexture.dispose(); + + } + + if ( renderTarget.isWebGLRenderTargetCube ) { + + for ( var i = 0; i < 6; i ++ ) { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] ); + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] ); + + } + + } else { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer ); + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer ); + + } + + properties.remove( renderTarget.texture ); + properties.remove( renderTarget ); + + } + + // + + + + function setTexture2D( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.isVideoTexture ) updateVideoTexture( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + var image = texture.image; + + if ( image === undefined ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined' ); + + } else if ( image.complete === false ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete' ); + + } else { + + uploadTexture( textureProperties, texture, slot ); + return; + + } + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + + } + + function setTexture3D( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + uploadTexture( textureProperties, texture, slot ); + return; + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_3D, textureProperties.__webglTexture ); + + } + + + function setTextureCube( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.image.length === 6 ) { + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + if ( ! textureProperties.__image__webglTextureCube ) { + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__image__webglTextureCube = _gl.createTexture(); + + info.memory.textures ++; + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube ); + + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); + + var isCompressed = ( texture && texture.isCompressedTexture ); + var isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture ); + + var cubeImage = []; + + for ( var i = 0; i < 6; i ++ ) { + + if ( ! isCompressed && ! isDataTexture ) { + + cubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize ); + + } else { + + cubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ]; + + } + + } + + var image = cubeImage[ 0 ], + isPowerOfTwoImage = isPowerOfTwo( image ), + glFormat = utils.convert( texture.format ), + glType = utils.convert( texture.type ), + glInternalFormat = getInternalFormat( glFormat, glType ); + + setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage ); + + for ( var i = 0; i < 6; i ++ ) { + + if ( ! isCompressed ) { + + if ( isDataTexture ) { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data ); + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] ); + + } + + } else { + + var mipmap, mipmaps = cubeImage[ i ].mipmaps; + + for ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) { + + mipmap = mipmaps[ j ]; + + if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) { + + if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { + + state.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + } + + } + + if ( ! isCompressed ) { + + textureProperties.__maxMipLevel = 0; + + } else { + + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } + + if ( textureNeedsGenerateMipmaps( texture, isPowerOfTwoImage ) ) { + + // We assume images for cube map have the same size. + generateMipmap( _gl.TEXTURE_CUBE_MAP, texture, image.width, image.height ); + + } + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } else { + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube ); + + } + + } + + } + + function setTextureCubeDynamic( texture, slot ) { + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture ); + + } + + function setTextureParameters( textureType, texture, isPowerOfTwoImage ) { + + var extension; + + if ( isPowerOfTwoImage ) { + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, utils.convert( texture.wrapS ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, utils.convert( texture.wrapT ) ); + + _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, utils.convert( texture.magFilter ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, utils.convert( texture.minFilter ) ); + + } else { + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE ); + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE ); + + if ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.' ); + + } + + _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) ); + + if ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.' ); + + } + + } + + extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension ) { + + if ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return; + if ( texture.type === HalfFloatType && ( capabilities.isWebGL2 || extensions.get( 'OES_texture_half_float_linear' ) ) === null ) return; + + if ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) { + + _gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) ); + properties.get( texture ).__currentAnisotropy = texture.anisotropy; + + } + + } + + } + + function uploadTexture( textureProperties, texture, slot ) { + + var textureType; + + if ( texture.isDataTexture3D ) { + + textureType = _gl.TEXTURE_3D; + + } else { + + textureType = _gl.TEXTURE_2D; + + } + + + if ( textureProperties.__webglInit === undefined ) { + + textureProperties.__webglInit = true; + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + info.memory.textures ++; + + } + state.activeTexture( _gl.TEXTURE0 + slot ); + + + state.bindTexture( textureType, 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 ); + + var image = clampToMaxSize( texture.image, capabilities.maxTextureSize ); + + if ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) { + + image = makePowerOfTwo( image ); + + } + + var isPowerOfTwoImage = isPowerOfTwo( image ), + glFormat = utils.convert( texture.format ), + glType = utils.convert( texture.type ), + glInternalFormat = getInternalFormat( glFormat, glType ); + + setTextureParameters( textureType, texture, isPowerOfTwoImage ); + + var mipmap, mipmaps = texture.mipmaps; + + if ( texture.isDepthTexture ) { + + // populate depth texture with dummy data + + glInternalFormat = _gl.DEPTH_COMPONENT; + + if ( texture.type === FloatType ) { + + if ( ! capabilities.isWebGL2 ) throw new Error( 'Float Depth Texture only supported in WebGL2.0' ); + glInternalFormat = _gl.DEPTH_COMPONENT32F; + + } else if ( capabilities.isWebGL2 ) { + + // WebGL 2.0 requires signed internalformat for glTexImage2D + glInternalFormat = _gl.DEPTH_COMPONENT16; + + } + + if ( texture.format === DepthFormat && glInternalFormat === _gl.DEPTH_COMPONENT ) { + + // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are + // DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) { + + console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' ); + + texture.type = UnsignedShortType; + glType = utils.convert( texture.type ); + + } + + } + + // Depth stencil textures need the DEPTH_STENCIL internal format + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.format === DepthStencilFormat ) { + + glInternalFormat = _gl.DEPTH_STENCIL; + + // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are + // DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL. + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.type !== UnsignedInt248Type ) { + + console.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' ); + + texture.type = UnsignedInt248Type; + glType = utils.convert( texture.type ); + + } + + } + + state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null ); + + } else if ( texture.isDataTexture ) { + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && isPowerOfTwoImage ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + texture.generateMipmaps = false; + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data ); + textureProperties.__maxMipLevel = 0; + + } + + } else if ( texture.isCompressedTexture ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + + if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) { + + if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { + + state.compressedTexImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } else if ( texture.isDataTexture3D ) { + + state.texImage3D( _gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data ); + textureProperties.__maxMipLevel = 0; + + } else { + + // regular Texture (image, video, canvas) + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && isPowerOfTwoImage ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap ); + + } + + texture.generateMipmaps = false; + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image ); + textureProperties.__maxMipLevel = 0; + + } + + } + + if ( textureNeedsGenerateMipmaps( texture, isPowerOfTwoImage ) ) { + + generateMipmap( _gl.TEXTURE_2D, texture, image.width, image.height ); + + } + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } + + // Render targets + + // Setup storage for target texture and bind it to correct framebuffer + function setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) { + + var glFormat = utils.convert( renderTarget.texture.format ); + var glType = utils.convert( renderTarget.texture.type ); + var glInternalFormat = getInternalFormat( glFormat, glType ); + state.texImage2D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null ); + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 ); + _gl.bindFramebuffer( _gl.FRAMEBUFFER, null ); + + } + + // Setup storage for internal depth/stencil buffers and bind to correct framebuffer + function setupRenderBufferStorage( renderbuffer, renderTarget ) { + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer ); + + if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); + + } else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); + + } else { + + // FIXME: We don't support !depth !stencil + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height ); + + } + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, null ); + + } + + // Setup resources for a Depth Texture for a FBO (needs an extension) + function setupDepthTexture( framebuffer, renderTarget ) { + + var isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube ); + if ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' ); + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + if ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) { + + throw new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' ); + + } + + // upload an empty depth texture with framebuffer size + if ( ! properties.get( renderTarget.depthTexture ).__webglTexture || + renderTarget.depthTexture.image.width !== renderTarget.width || + renderTarget.depthTexture.image.height !== renderTarget.height ) { + + renderTarget.depthTexture.image.width = renderTarget.width; + renderTarget.depthTexture.image.height = renderTarget.height; + renderTarget.depthTexture.needsUpdate = true; + + } + + setTexture2D( renderTarget.depthTexture, 0 ); + + var webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture; + + if ( renderTarget.depthTexture.format === DepthFormat ) { + + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 ); + + } else if ( renderTarget.depthTexture.format === DepthStencilFormat ) { + + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 ); + + } else { + + throw new Error( 'Unknown depthTexture format' ); + + } + + } + + // Setup GL resources for a non-texture depth buffer + function setupDepthRenderbuffer( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + + var isCube = ( renderTarget.isWebGLRenderTargetCube === true ); + + if ( renderTarget.depthTexture ) { + + if ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' ); + + setupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget ); + + } else { + + if ( isCube ) { + + renderTargetProperties.__webglDepthbuffer = []; + + for ( var i = 0; i < 6; i ++ ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] ); + renderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget ); + + } + + } else { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer ); + renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget ); + + } + + } + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, null ); + + } + + // Set up GL resources for the render target + function setupRenderTarget( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); + + renderTarget.addEventListener( 'dispose', onRenderTargetDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + info.memory.textures ++; + + var isCube = ( renderTarget.isWebGLRenderTargetCube === true ); + var isTargetPowerOfTwo = isPowerOfTwo( renderTarget ); + + // Setup framebuffer + + if ( isCube ) { + + renderTargetProperties.__webglFramebuffer = []; + + for ( var i = 0; i < 6; i ++ ) { + + renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer(); + + } + + } else { + + renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer(); + + } + + // Setup color buffer + + if ( isCube ) { + + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture ); + setTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo ); + + for ( var i = 0; i < 6; i ++ ) { + + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i ); + + } + + if ( textureNeedsGenerateMipmaps( renderTarget.texture, isTargetPowerOfTwo ) ) { + + generateMipmap( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, renderTarget.width, renderTarget.height ); + + } + + state.bindTexture( _gl.TEXTURE_CUBE_MAP, null ); + + } else { + + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + setTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo ); + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D ); + + if ( textureNeedsGenerateMipmaps( renderTarget.texture, isTargetPowerOfTwo ) ) { + + generateMipmap( _gl.TEXTURE_2D, renderTarget.texture, renderTarget.width, renderTarget.height ); + + } + + state.bindTexture( _gl.TEXTURE_2D, null ); + + } + + // Setup depth and stencil buffers + + if ( renderTarget.depthBuffer ) { + + setupDepthRenderbuffer( renderTarget ); + + } + + } + + function updateRenderTargetMipmap( renderTarget ) { + + var texture = renderTarget.texture; + var isTargetPowerOfTwo = isPowerOfTwo( renderTarget ); + + if ( textureNeedsGenerateMipmaps( texture, isTargetPowerOfTwo ) ) { + + var target = renderTarget.isWebGLRenderTargetCube ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D; + var webglTexture = properties.get( texture ).__webglTexture; + + state.bindTexture( target, webglTexture ); + generateMipmap( target, texture, renderTarget.width, renderTarget.height ); + state.bindTexture( target, null ); + + } + + } + + function updateVideoTexture( texture ) { + + var id = texture.id; + var frame = info.render.frame; + + // Check the last frame we updated the VideoTexture + + if ( _videoTextures[ id ] !== frame ) { + + _videoTextures[ id ] = frame; + texture.update(); + + } + + } + + this.setTexture2D = setTexture2D; + this.setTexture3D = setTexture3D; + this.setTextureCube = setTextureCube; + this.setTextureCubeDynamic = setTextureCubeDynamic; + this.setupRenderTarget = setupRenderTarget; + this.updateRenderTargetMipmap = updateRenderTargetMipmap; + +} + + +export { WebGLTextures }; diff --git a/lib/renderers/webgl/WebGLUniforms.js b/lib/renderers/webgl/WebGLUniforms.js new file mode 100644 index 0000000..4bdd1bd --- /dev/null +++ b/lib/renderers/webgl/WebGLUniforms.js @@ -0,0 +1,876 @@ +/** + * @author tschw + * @author Mugen87 / https://github.com/Mugen87 + * @author mrdoob / http://mrdoob.com/ + * + * Uniforms of a program. + * Those form a tree structure with a special top-level container for the root, + * which you get by calling 'new WebGLUniforms( gl, program, renderer )'. + * + * + * Properties of inner nodes including the top-level container: + * + * .seq - array of nested uniforms + * .map - nested uniforms by name + * + * + * Methods of all nodes except the top-level container: + * + * .setValue( gl, value, [renderer] ) + * + * uploads a uniform value(s) + * the 'renderer' parameter is needed for sampler uniforms + * + * + * Static methods of the top-level container (renderer factorizations): + * + * .upload( gl, seq, values, renderer ) + * + * sets uniforms in 'seq' to 'values[id].value' + * + * .seqWithValue( seq, values ) : filteredSeq + * + * filters 'seq' entries with corresponding entry in values + * + * + * Methods of the top-level container (renderer factorizations): + * + * .setValue( gl, name, value ) + * + * sets uniform with name 'name' to 'value' + * + * .set( gl, obj, prop ) + * + * sets uniform from object and property with same name than uniform + * + * .setOptional( gl, obj, prop ) + * + * like .set for an optional property of the object + * + */ + +import { CubeTexture } from '../../textures/CubeTexture.js'; +import { Texture } from '../../textures/Texture.js'; +import { DataTexture3D } from '../../textures/DataTexture3D.js'; + +var emptyTexture = new Texture(); +var emptyTexture3d = new DataTexture3D(); +var emptyCubeTexture = new CubeTexture(); + +// --- Base for inner nodes (including the root) --- + +function UniformContainer() { + + this.seq = []; + this.map = {}; + +} + +// --- Utilities --- + +// Array Caches (provide typed arrays for temporary by size) + +var arrayCacheF32 = []; +var arrayCacheI32 = []; + +// Float32Array caches used for uploading Matrix uniforms + +var mat4array = new Float32Array( 16 ); +var mat3array = new Float32Array( 9 ); +var mat2array = new Float32Array( 4 ); + +// Flattening for arrays of vectors and matrices + +function flatten( array, nBlocks, blockSize ) { + + var firstElem = array[ 0 ]; + + if ( firstElem <= 0 || firstElem > 0 ) return array; + // unoptimized: ! isNaN( firstElem ) + // see http://jacksondunstan.com/articles/983 + + var n = nBlocks * blockSize, + r = arrayCacheF32[ n ]; + + if ( r === undefined ) { + + r = new Float32Array( n ); + arrayCacheF32[ n ] = r; + + } + + if ( nBlocks !== 0 ) { + + firstElem.toArray( r, 0 ); + + for ( var i = 1, offset = 0; i !== nBlocks; ++ i ) { + + offset += blockSize; + array[ i ].toArray( r, offset ); + + } + + } + + return r; + +} + +function arraysEqual( a, b ) { + + if ( a.length !== b.length ) return false; + + for ( var i = 0, l = a.length; i < l; i ++ ) { + + if ( a[ i ] !== b[ i ] ) return false; + + } + + return true; + +} + +function copyArray( a, b ) { + + for ( var i = 0, l = b.length; i < l; i ++ ) { + + a[ i ] = b[ i ]; + + } + +} + +// Texture unit allocation + +function allocTexUnits( renderer, n ) { + + var r = arrayCacheI32[ n ]; + + if ( r === undefined ) { + + r = new Int32Array( n ); + arrayCacheI32[ n ] = r; + + } + + for ( var i = 0; i !== n; ++ i ) + r[ i ] = renderer.allocTextureUnit(); + + return r; + +} + +// --- Setters --- + +// Note: Defining these methods externally, because they come in a bunch +// and this way their names minify. + +// Single scalar + +function setValue1f( gl, v ) { + + var cache = this.cache; + + if ( cache[ 0 ] === v ) return; + + gl.uniform1f( this.addr, v ); + + cache[ 0 ] = v; + +} + +function setValue1i( gl, v ) { + + var cache = this.cache; + + if ( cache[ 0 ] === v ) return; + + gl.uniform1i( this.addr, v ); + + cache[ 0 ] = v; + +} + +// Single float vector (from flat array or THREE.VectorN) + +function setValue2fv( gl, v ) { + + var cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) { + + gl.uniform2f( this.addr, v.x, v.y ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform2fv( this.addr, v ); + + copyArray( cache, v ); + + } + +} + +function setValue3fv( gl, v ) { + + var cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) { + + gl.uniform3f( this.addr, v.x, v.y, v.z ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + cache[ 2 ] = v.z; + + } + + } else if ( v.r !== undefined ) { + + if ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) { + + gl.uniform3f( this.addr, v.r, v.g, v.b ); + + cache[ 0 ] = v.r; + cache[ 1 ] = v.g; + cache[ 2 ] = v.b; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform3fv( this.addr, v ); + + copyArray( cache, v ); + + } + +} + +function setValue4fv( gl, v ) { + + var cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) { + + gl.uniform4f( this.addr, v.x, v.y, v.z, v.w ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + cache[ 2 ] = v.z; + cache[ 3 ] = v.w; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform4fv( this.addr, v ); + + copyArray( cache, v ); + + } + +} + +// Single matrix (from flat array or MatrixN) + +function setValue2fm( gl, v ) { + + var cache = this.cache; + var elements = v.elements; + + if ( elements === undefined ) { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniformMatrix2fv( this.addr, false, v ); + + copyArray( cache, v ); + + } else { + + if ( arraysEqual( cache, elements ) ) return; + + mat2array.set( elements ); + + gl.uniformMatrix2fv( this.addr, false, mat2array ); + + copyArray( cache, elements ); + + } + +} + +function setValue3fm( gl, v ) { + + var cache = this.cache; + var elements = v.elements; + + if ( elements === undefined ) { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniformMatrix3fv( this.addr, false, v ); + + copyArray( cache, v ); + + } else { + + if ( arraysEqual( cache, elements ) ) return; + + mat3array.set( elements ); + + gl.uniformMatrix3fv( this.addr, false, mat3array ); + + copyArray( cache, elements ); + + } + +} + +function setValue4fm( gl, v ) { + + var cache = this.cache; + var elements = v.elements; + + if ( elements === undefined ) { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniformMatrix4fv( this.addr, false, v ); + + copyArray( cache, v ); + + } else { + + if ( arraysEqual( cache, elements ) ) return; + + mat4array.set( elements ); + + gl.uniformMatrix4fv( this.addr, false, mat4array ); + + copyArray( cache, elements ); + + } + +} + +// Single texture (2D / Cube) + +function setValueT1( gl, v, renderer ) { + + var cache = this.cache; + var unit = renderer.allocTextureUnit(); + + if ( cache[ 0 ] !== unit ) { + + gl.uniform1i( this.addr, unit ); + cache[ 0 ] = unit; + + } + + renderer.setTexture2D( v || emptyTexture, unit ); + +} + +function setValueT3D1( gl, v, renderer ) { + + var cache = this.cache; + var unit = renderer.allocTextureUnit(); + + if ( cache[ 0 ] !== unit ) { + + gl.uniform1i( this.addr, unit ); + cache[ 0 ] = unit; + + } + + renderer.setTexture3D( v || emptyTexture3d, unit ); + +} + +function setValueT6( gl, v, renderer ) { + + var cache = this.cache; + var unit = renderer.allocTextureUnit(); + + if ( cache[ 0 ] !== unit ) { + + gl.uniform1i( this.addr, unit ); + cache[ 0 ] = unit; + + } + + renderer.setTextureCube( v || emptyCubeTexture, unit ); + +} + +// Integer / Boolean vectors or arrays thereof (always flat arrays) + +function setValue2iv( gl, v ) { + + var cache = this.cache; + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform2iv( this.addr, v ); + + copyArray( cache, v ); + +} + +function setValue3iv( gl, v ) { + + var cache = this.cache; + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform3iv( this.addr, v ); + + copyArray( cache, v ); + +} + +function setValue4iv( gl, v ) { + + var cache = this.cache; + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform4iv( this.addr, v ); + + copyArray( cache, v ); + +} + +// Helper to pick the right setter for the singular case + +function getSingularSetter( type ) { + + switch ( type ) { + + case 0x1406: return setValue1f; // FLOAT + case 0x8b50: return setValue2fv; // _VEC2 + case 0x8b51: return setValue3fv; // _VEC3 + case 0x8b52: return setValue4fv; // _VEC4 + + case 0x8b5a: return setValue2fm; // _MAT2 + case 0x8b5b: return setValue3fm; // _MAT3 + case 0x8b5c: return setValue4fm; // _MAT4 + + case 0x8b5e: case 0x8d66: return setValueT1; // SAMPLER_2D, SAMPLER_EXTERNAL_OES + case 0x8B5F: return setValueT3D1; // SAMPLER_3D + case 0x8b60: return setValueT6; // SAMPLER_CUBE + + case 0x1404: case 0x8b56: return setValue1i; // INT, BOOL + case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2 + case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3 + case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4 + + } + +} + +// Array of scalars + +function setValue1fv( gl, v ) { + + var cache = this.cache; + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform1fv( this.addr, v ); + + copyArray( cache, v ); + +} +function setValue1iv( gl, v ) { + + var cache = this.cache; + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform1iv( this.addr, v ); + + copyArray( cache, v ); + +} + +// Array of vectors (flat or from THREE classes) + +function setValueV2a( gl, v ) { + + var cache = this.cache; + var data = flatten( v, this.size, 2 ); + + if ( arraysEqual( cache, data ) ) return; + + gl.uniform2fv( this.addr, data ); + + this.updateCache( data ); + +} + +function setValueV3a( gl, v ) { + + var cache = this.cache; + var data = flatten( v, this.size, 3 ); + + if ( arraysEqual( cache, data ) ) return; + + gl.uniform3fv( this.addr, data ); + + this.updateCache( data ); + +} + +function setValueV4a( gl, v ) { + + var cache = this.cache; + var data = flatten( v, this.size, 4 ); + + if ( arraysEqual( cache, data ) ) return; + + gl.uniform4fv( this.addr, data ); + + this.updateCache( data ); + +} + +// Array of matrices (flat or from THREE clases) + +function setValueM2a( gl, v ) { + + var cache = this.cache; + var data = flatten( v, this.size, 4 ); + + if ( arraysEqual( cache, data ) ) return; + + gl.uniformMatrix2fv( this.addr, false, data ); + + this.updateCache( data ); + +} + +function setValueM3a( gl, v ) { + + var cache = this.cache; + var data = flatten( v, this.size, 9 ); + + if ( arraysEqual( cache, data ) ) return; + + gl.uniformMatrix3fv( this.addr, false, data ); + + this.updateCache( data ); + +} + +function setValueM4a( gl, v ) { + + var cache = this.cache; + var data = flatten( v, this.size, 16 ); + + if ( arraysEqual( cache, data ) ) return; + + gl.uniformMatrix4fv( this.addr, false, data ); + + this.updateCache( data ); + +} + +// Array of textures (2D / Cube) + +function setValueT1a( gl, v, renderer ) { + + var cache = this.cache; + var n = v.length; + + var units = allocTexUnits( renderer, n ); + + if ( arraysEqual( cache, units ) === false ) { + + gl.uniform1iv( this.addr, units ); + copyArray( cache, units ); + + } + + for ( var i = 0; i !== n; ++ i ) { + + renderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] ); + + } + +} + +function setValueT6a( gl, v, renderer ) { + + var cache = this.cache; + var n = v.length; + + var units = allocTexUnits( renderer, n ); + + if ( arraysEqual( cache, units ) === false ) { + + gl.uniform1iv( this.addr, units ); + copyArray( cache, units ); + + } + + for ( var i = 0; i !== n; ++ i ) { + + renderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] ); + + } + +} + +// Helper to pick the right setter for a pure (bottom-level) array + +function getPureArraySetter( type ) { + + switch ( type ) { + + case 0x1406: return setValue1fv; // FLOAT + case 0x8b50: return setValueV2a; // _VEC2 + case 0x8b51: return setValueV3a; // _VEC3 + case 0x8b52: return setValueV4a; // _VEC4 + + case 0x8b5a: return setValueM2a; // _MAT2 + case 0x8b5b: return setValueM3a; // _MAT3 + case 0x8b5c: return setValueM4a; // _MAT4 + + case 0x8b5e: return setValueT1a; // SAMPLER_2D + case 0x8b60: return setValueT6a; // SAMPLER_CUBE + + case 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL + case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2 + case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3 + case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4 + + } + +} + +// --- Uniform Classes --- + +function SingleUniform( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.cache = []; + this.setValue = getSingularSetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + +} + +function PureArrayUniform( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.cache = []; + this.size = activeInfo.size; + this.setValue = getPureArraySetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + +} + +PureArrayUniform.prototype.updateCache = function ( data ) { + + var cache = this.cache; + + if ( data instanceof Float32Array && cache.length !== data.length ) { + + this.cache = new Float32Array( data.length ); + + } + + copyArray( cache, data ); + +}; + +function StructuredUniform( id ) { + + this.id = id; + + UniformContainer.call( this ); // mix-in + +} + +StructuredUniform.prototype.setValue = function ( gl, value, renderer ) { + + var seq = this.seq; + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ]; + u.setValue( gl, value[ u.id ], renderer ); + + } + +}; + +// --- Top-level --- + +// Parser - builds up the property tree from the path strings + +var RePathPart = /([\w\d_]+)(\])?(\[|\.)?/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; + +} + +function parseUniform( activeInfo, addr, container ) { + + var path = activeInfo.name, + pathLength = path.length; + + // reset RegExp object, because of the early exit of a previous run + RePathPart.lastIndex = 0; + + while ( true ) { + + var match = RePathPart.exec( path ), + matchEnd = RePathPart.lastIndex, + + id = match[ 1 ], + 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( id, activeInfo, addr ) : + new PureArrayUniform( id, activeInfo, addr ) ); + + break; + + } else { + + // step into inner node / create it in case it doesn't exist + + var map = container.map, next = map[ id ]; + + if ( next === undefined ) { + + next = new StructuredUniform( id ); + addUniform( container, next ); + + } + + container = next; + + } + + } + +} + +// Root Container + +function WebGLUniforms( gl, program, renderer ) { + + UniformContainer.call( this ); + + this.renderer = renderer; + + var n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS ); + + for ( var i = 0; i < n; ++ i ) { + + var info = gl.getActiveUniform( program, i ), + addr = gl.getUniformLocation( program, info.name ); + + parseUniform( info, addr, this ); + + } + +} + +WebGLUniforms.prototype.setValue = function ( gl, name, value ) { + + var u = this.map[ name ]; + + if ( u !== undefined ) u.setValue( gl, value, this.renderer ); + +}; + +WebGLUniforms.prototype.setOptional = function ( gl, object, name ) { + + var v = object[ name ]; + + if ( v !== undefined ) this.setValue( gl, name, v ); + +}; + + +// Static interface + +WebGLUniforms.upload = function ( gl, seq, values, renderer ) { + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ], + v = values[ u.id ]; + + if ( v.needsUpdate !== false ) { + + // note: always updating when .needsUpdate is undefined + u.setValue( gl, v.value, renderer ); + + } + + } + +}; + +WebGLUniforms.seqWithValue = function ( seq, values ) { + + var r = []; + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ]; + if ( u.id in values ) r.push( u ); + + } + + return r; + +}; + +export { WebGLUniforms }; diff --git a/lib/renderers/webgl/WebGLUtils.js b/lib/renderers/webgl/WebGLUtils.js new file mode 100644 index 0000000..ad85324 --- /dev/null +++ b/lib/renderers/webgl/WebGLUtils.js @@ -0,0 +1,168 @@ +/** + * @author thespite / http://www.twitter.com/thespite + */ + +import { MaxEquation, MinEquation, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGB_ETC1_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT5_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT1_Format, RGB_S3TC_DXT1_Format, SrcAlphaSaturateFactor, OneMinusDstColorFactor, DstColorFactor, OneMinusDstAlphaFactor, DstAlphaFactor, OneMinusSrcAlphaFactor, SrcAlphaFactor, OneMinusSrcColorFactor, SrcColorFactor, OneFactor, ZeroFactor, ReverseSubtractEquation, SubtractEquation, AddEquation, DepthFormat, DepthStencilFormat, LuminanceAlphaFormat, LuminanceFormat, RedFormat, RGBAFormat, RGBFormat, AlphaFormat, HalfFloatType, FloatType, UnsignedIntType, IntType, UnsignedShortType, ShortType, ByteType, UnsignedInt248Type, UnsignedShort565Type, UnsignedShort5551Type, UnsignedShort4444Type, UnsignedByteType, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NearestFilter, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping } from '../../constants.js'; + +function WebGLUtils( gl, extensions, capabilities ) { + + function convert( p ) { + + var extension; + + if ( p === RepeatWrapping ) return gl.REPEAT; + if ( p === ClampToEdgeWrapping ) return gl.CLAMP_TO_EDGE; + if ( p === MirroredRepeatWrapping ) return gl.MIRRORED_REPEAT; + + if ( p === NearestFilter ) return gl.NEAREST; + if ( p === NearestMipMapNearestFilter ) return gl.NEAREST_MIPMAP_NEAREST; + if ( p === NearestMipMapLinearFilter ) return gl.NEAREST_MIPMAP_LINEAR; + + if ( p === LinearFilter ) return gl.LINEAR; + if ( p === LinearMipMapNearestFilter ) return gl.LINEAR_MIPMAP_NEAREST; + if ( p === LinearMipMapLinearFilter ) return gl.LINEAR_MIPMAP_LINEAR; + + if ( p === UnsignedByteType ) return gl.UNSIGNED_BYTE; + if ( p === UnsignedShort4444Type ) return gl.UNSIGNED_SHORT_4_4_4_4; + if ( p === UnsignedShort5551Type ) return gl.UNSIGNED_SHORT_5_5_5_1; + if ( p === UnsignedShort565Type ) return gl.UNSIGNED_SHORT_5_6_5; + + if ( p === ByteType ) return gl.BYTE; + if ( p === ShortType ) return gl.SHORT; + if ( p === UnsignedShortType ) return gl.UNSIGNED_SHORT; + if ( p === IntType ) return gl.INT; + if ( p === UnsignedIntType ) return gl.UNSIGNED_INT; + if ( p === FloatType ) return gl.FLOAT; + + if ( p === HalfFloatType ) { + + if ( capabilities.isWebGL2 ) return gl.HALF_FLOAT; + + extension = extensions.get( 'OES_texture_half_float' ); + + if ( extension !== null ) return extension.HALF_FLOAT_OES; + + } + + if ( p === AlphaFormat ) return gl.ALPHA; + if ( p === RGBFormat ) return gl.RGB; + if ( p === RGBAFormat ) return gl.RGBA; + if ( p === LuminanceFormat ) return gl.LUMINANCE; + if ( p === LuminanceAlphaFormat ) return gl.LUMINANCE_ALPHA; + if ( p === DepthFormat ) return gl.DEPTH_COMPONENT; + if ( p === DepthStencilFormat ) return gl.DEPTH_STENCIL; + if ( p === RedFormat ) return gl.RED; + + if ( p === AddEquation ) return gl.FUNC_ADD; + if ( p === SubtractEquation ) return gl.FUNC_SUBTRACT; + if ( p === ReverseSubtractEquation ) return gl.FUNC_REVERSE_SUBTRACT; + + if ( p === ZeroFactor ) return gl.ZERO; + if ( p === OneFactor ) return gl.ONE; + if ( p === SrcColorFactor ) return gl.SRC_COLOR; + if ( p === OneMinusSrcColorFactor ) return gl.ONE_MINUS_SRC_COLOR; + if ( p === SrcAlphaFactor ) return gl.SRC_ALPHA; + if ( p === OneMinusSrcAlphaFactor ) return gl.ONE_MINUS_SRC_ALPHA; + if ( p === DstAlphaFactor ) return gl.DST_ALPHA; + if ( p === OneMinusDstAlphaFactor ) return gl.ONE_MINUS_DST_ALPHA; + + if ( p === DstColorFactor ) return gl.DST_COLOR; + if ( p === OneMinusDstColorFactor ) return gl.ONE_MINUS_DST_COLOR; + if ( p === SrcAlphaSaturateFactor ) return gl.SRC_ALPHA_SATURATE; + + if ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || + p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + if ( extension !== null ) { + + if ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT; + if ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT; + + } + + } + + if ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || + p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + if ( extension !== null ) { + + if ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; + if ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; + if ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + if ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; + + } + + } + + if ( p === RGB_ETC1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_etc1' ); + + if ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL; + + } + + if ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format || + p === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format || + p === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format || + p === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format || + p === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_astc' ); + + if ( extension !== null ) { + + return p; + + } + + } + + if ( p === MinEquation || p === MaxEquation ) { + + if ( capabilities.isWebGL2 ) { + + if ( p === MinEquation ) return gl.MIN; + if ( p === MaxEquation ) return gl.MAX; + + } + + extension = extensions.get( 'EXT_blend_minmax' ); + + if ( extension !== null ) { + + if ( p === MinEquation ) return extension.MIN_EXT; + if ( p === MaxEquation ) return extension.MAX_EXT; + + } + + } + + if ( p === UnsignedInt248Type ) { + + if ( capabilities.isWebGL2 ) return gl.UNSIGNED_INT_24_8; + + extension = extensions.get( 'WEBGL_depth_texture' ); + + if ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL; + + } + + return 0; + + } + + return { convert: convert }; + +} + + +export { WebGLUtils }; diff --git a/lib/renderers/webvr/WebVRManager.js b/lib/renderers/webvr/WebVRManager.js new file mode 100644 index 0000000..9dc0028 --- /dev/null +++ b/lib/renderers/webvr/WebVRManager.js @@ -0,0 +1,401 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { Group } from '../../objects/Group.js'; +import { Matrix4 } from '../../math/Matrix4.js'; +import { Vector3 } from '../../math/Vector3.js'; +import { Vector4 } from '../../math/Vector4.js'; +import { Quaternion } from '../../math/Quaternion.js'; +import { ArrayCamera } from '../../cameras/ArrayCamera.js'; +import { PerspectiveCamera } from '../../cameras/PerspectiveCamera.js'; +import { WebGLAnimation } from '../webgl/WebGLAnimation.js'; +import { setProjectionFromUnion } from './WebVRUtils.js'; + +function WebVRManager( renderer ) { + + var scope = this; + + var device = null; + var frameData = null; + + var poseTarget = null; + + var controllers = []; + var standingMatrix = new Matrix4(); + var standingMatrixInverse = new Matrix4(); + + var framebufferScaleFactor = 1.0; + + var frameOfReferenceType = 'stage'; + + if ( typeof window !== 'undefined' && 'VRFrameData' in window ) { + + frameData = new window.VRFrameData(); + window.addEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange, false ); + + } + + var matrixWorldInverse = new Matrix4(); + var tempQuaternion = new Quaternion(); + var tempPosition = new Vector3(); + + var cameraL = new PerspectiveCamera(); + cameraL.bounds = new Vector4( 0.0, 0.0, 0.5, 1.0 ); + cameraL.layers.enable( 1 ); + + var cameraR = new PerspectiveCamera(); + cameraR.bounds = new Vector4( 0.5, 0.0, 0.5, 1.0 ); + cameraR.layers.enable( 2 ); + + var cameraVR = new ArrayCamera( [ cameraL, cameraR ] ); + cameraVR.layers.enable( 1 ); + cameraVR.layers.enable( 2 ); + + // + + function isPresenting() { + + return device !== null && device.isPresenting === true; + + } + + var currentSize, currentPixelRatio; + + function onVRDisplayPresentChange() { + + if ( isPresenting() ) { + + var eyeParameters = device.getEyeParameters( 'left' ); + var renderWidth = eyeParameters.renderWidth * framebufferScaleFactor; + var renderHeight = eyeParameters.renderHeight * framebufferScaleFactor; + + currentPixelRatio = renderer.getPixelRatio(); + currentSize = renderer.getSize(); + + renderer.setDrawingBufferSize( renderWidth * 2, renderHeight, 1 ); + + animation.start(); + + } else { + + if ( scope.enabled ) { + + renderer.setDrawingBufferSize( currentSize.width, currentSize.height, currentPixelRatio ); + + } + + animation.stop(); + + } + + } + + // + + var triggers = []; + + function findGamepad( id ) { + + var gamepads = navigator.getGamepads && navigator.getGamepads(); + + for ( var i = 0, j = 0, l = gamepads.length; i < l; i ++ ) { + + var gamepad = gamepads[ i ]; + + if ( gamepad && ( gamepad.id === 'Daydream Controller' || + gamepad.id === 'Gear VR Controller' || gamepad.id === 'Oculus Go Controller' || + gamepad.id === 'OpenVR Gamepad' || gamepad.id.startsWith( 'Oculus Touch' ) || + gamepad.id.startsWith( 'Spatial Controller' ) ) ) { + + if ( j === id ) return gamepad; + + j ++; + + } + + } + + } + + function updateControllers() { + + for ( var i = 0; i < controllers.length; i ++ ) { + + var controller = controllers[ i ]; + + var gamepad = findGamepad( i ); + + if ( gamepad !== undefined && gamepad.pose !== undefined ) { + + if ( gamepad.pose === null ) return; + + // Pose + + var pose = gamepad.pose; + + if ( pose.hasPosition === false ) controller.position.set( 0.2, - 0.6, - 0.05 ); + + if ( pose.position !== null ) controller.position.fromArray( pose.position ); + if ( pose.orientation !== null ) controller.quaternion.fromArray( pose.orientation ); + controller.matrix.compose( controller.position, controller.quaternion, controller.scale ); + controller.matrix.premultiply( standingMatrix ); + controller.matrix.decompose( controller.position, controller.quaternion, controller.scale ); + controller.matrixWorldNeedsUpdate = true; + controller.visible = true; + + // Trigger + + var buttonId = gamepad.id === 'Daydream Controller' ? 0 : 1; + + if ( triggers[ i ] !== gamepad.buttons[ buttonId ].pressed ) { + + triggers[ i ] = gamepad.buttons[ buttonId ].pressed; + + if ( triggers[ i ] === true ) { + + controller.dispatchEvent( { type: 'selectstart' } ); + + } else { + + controller.dispatchEvent( { type: 'selectend' } ); + controller.dispatchEvent( { type: 'select' } ); + + } + + } + + } else { + + controller.visible = false; + + } + + } + + } + + // + + this.enabled = false; + + this.getController = function ( id ) { + + var controller = controllers[ id ]; + + if ( controller === undefined ) { + + controller = new Group(); + controller.matrixAutoUpdate = false; + controller.visible = false; + + controllers[ id ] = controller; + + } + + return controller; + + }; + + this.getDevice = function () { + + return device; + + }; + + this.setDevice = function ( value ) { + + if ( value !== undefined ) device = value; + + animation.setContext( value ); + + }; + + this.setFramebufferScaleFactor = function ( value ) { + + framebufferScaleFactor = value; + + }; + + this.setFrameOfReferenceType = function ( value ) { + + frameOfReferenceType = value; + + }; + + this.setPoseTarget = function ( object ) { + + if ( object !== undefined ) poseTarget = object; + + }; + + this.getCamera = function ( camera ) { + + var userHeight = frameOfReferenceType === 'stage' ? 1.6 : 0; + + if ( device === null ) { + + camera.position.set( 0, userHeight, 0 ); + return camera; + + } + + device.depthNear = camera.near; + device.depthFar = camera.far; + + device.getFrameData( frameData ); + + // + + if ( frameOfReferenceType === 'stage' ) { + + var stageParameters = device.stageParameters; + + if ( stageParameters ) { + + standingMatrix.fromArray( stageParameters.sittingToStandingTransform ); + + } else { + + standingMatrix.makeTranslation( 0, userHeight, 0 ); + + } + + } + + + var pose = frameData.pose; + var poseObject = poseTarget !== null ? poseTarget : camera; + + // We want to manipulate poseObject by its position and quaternion components since users may rely on them. + poseObject.matrix.copy( standingMatrix ); + poseObject.matrix.decompose( poseObject.position, poseObject.quaternion, poseObject.scale ); + + if ( pose.orientation !== null ) { + + tempQuaternion.fromArray( pose.orientation ); + poseObject.quaternion.multiply( tempQuaternion ); + + } + + if ( pose.position !== null ) { + + tempQuaternion.setFromRotationMatrix( standingMatrix ); + tempPosition.fromArray( pose.position ); + tempPosition.applyQuaternion( tempQuaternion ); + poseObject.position.add( tempPosition ); + + } + + poseObject.updateMatrixWorld(); + + if ( device.isPresenting === false ) return camera; + + // + + cameraL.near = camera.near; + cameraR.near = camera.near; + + cameraL.far = camera.far; + cameraR.far = camera.far; + + cameraL.matrixWorldInverse.fromArray( frameData.leftViewMatrix ); + cameraR.matrixWorldInverse.fromArray( frameData.rightViewMatrix ); + + // TODO (mrdoob) Double check this code + + standingMatrixInverse.getInverse( standingMatrix ); + + if ( frameOfReferenceType === 'stage' ) { + + cameraL.matrixWorldInverse.multiply( standingMatrixInverse ); + cameraR.matrixWorldInverse.multiply( standingMatrixInverse ); + + } + + var parent = poseObject.parent; + + if ( parent !== null ) { + + matrixWorldInverse.getInverse( parent.matrixWorld ); + + cameraL.matrixWorldInverse.multiply( matrixWorldInverse ); + cameraR.matrixWorldInverse.multiply( matrixWorldInverse ); + + } + + // envMap and Mirror needs camera.matrixWorld + + cameraL.matrixWorld.getInverse( cameraL.matrixWorldInverse ); + cameraR.matrixWorld.getInverse( cameraR.matrixWorldInverse ); + + cameraL.projectionMatrix.fromArray( frameData.leftProjectionMatrix ); + cameraR.projectionMatrix.fromArray( frameData.rightProjectionMatrix ); + + setProjectionFromUnion( cameraVR, cameraL, cameraR ); + + // + + var layers = device.getLayers(); + + if ( layers.length ) { + + var layer = layers[ 0 ]; + + if ( layer.leftBounds !== null && layer.leftBounds.length === 4 ) { + + cameraL.bounds.fromArray( layer.leftBounds ); + + } + + if ( layer.rightBounds !== null && layer.rightBounds.length === 4 ) { + + cameraR.bounds.fromArray( layer.rightBounds ); + + } + + } + + updateControllers(); + + return cameraVR; + + }; + + this.getStandingMatrix = function () { + + return standingMatrix; + + }; + + this.isPresenting = isPresenting; + + // Animation Loop + + var animation = new WebGLAnimation(); + + this.setAnimationLoop = function ( callback ) { + + animation.setAnimationLoop( callback ); + + }; + + this.submitFrame = function () { + + if ( isPresenting() ) device.submitFrame(); + + }; + + this.dispose = function () { + + if ( typeof window !== 'undefined' ) { + + window.removeEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange ); + + } + + }; + +} + +export { WebVRManager }; diff --git a/lib/renderers/webvr/WebVRUtils.js b/lib/renderers/webvr/WebVRUtils.js new file mode 100644 index 0000000..d8b7b2d --- /dev/null +++ b/lib/renderers/webvr/WebVRUtils.js @@ -0,0 +1,66 @@ +/** + * @author jsantell / https://www.jsantell.com/ + * @author mrdoob / http://mrdoob.com/ + */ + +import { Vector3 } from '../../math/Vector3.js'; + +var cameraLPos = new Vector3(); +var cameraRPos = new Vector3(); + +/** + * Assumes 2 cameras that are parallel and share an X-axis, and that + * the cameras' projection and world matrices have already been set. + * And that near and far planes are identical for both cameras. + * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765 + */ +function setProjectionFromUnion( camera, cameraL, cameraR ) { + + cameraLPos.setFromMatrixPosition( cameraL.matrixWorld ); + cameraRPos.setFromMatrixPosition( cameraR.matrixWorld ); + + var ipd = cameraLPos.distanceTo( cameraRPos ); + + var projL = cameraL.projectionMatrix.elements; + var projR = cameraR.projectionMatrix.elements; + + // VR systems will have identical far and near planes, and + // most likely identical top and bottom frustum extents. + // Use the left camera for these values. + var near = projL[ 14 ] / ( projL[ 10 ] - 1 ); + var far = projL[ 14 ] / ( projL[ 10 ] + 1 ); + var topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ]; + var bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ]; + + var leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ]; + var rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ]; + var left = near * leftFov; + var right = near * rightFov; + + // Calculate the new camera's position offset from the + // left camera. xOffset should be roughly half `ipd`. + var zOffset = ipd / ( - leftFov + rightFov ); + var xOffset = zOffset * - leftFov; + + // TODO: Better way to apply this offset? + cameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale ); + camera.translateX( xOffset ); + camera.translateZ( zOffset ); + camera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale ); + camera.matrixWorldInverse.getInverse( camera.matrixWorld ); + + // Find the union of the frustum values of the cameras and scale + // the values so that the near plane's position does not change in world space, + // although must now be relative to the new union camera. + var near2 = near + zOffset; + var far2 = far + zOffset; + var left2 = left - xOffset; + var right2 = right + ( ipd - xOffset ); + var top2 = topFov * far / far2 * near2; + var bottom2 = bottomFov * far / far2 * near2; + + camera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 ); + +} + +export { setProjectionFromUnion }; diff --git a/lib/renderers/webvr/WebXRManager.js b/lib/renderers/webvr/WebXRManager.js new file mode 100644 index 0000000..93a7c17 --- /dev/null +++ b/lib/renderers/webvr/WebXRManager.js @@ -0,0 +1,313 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { Group } from '../../objects/Group.js'; +import { Vector4 } from '../../math/Vector4.js'; +import { ArrayCamera } from '../../cameras/ArrayCamera.js'; +import { PerspectiveCamera } from '../../cameras/PerspectiveCamera.js'; +import { WebGLAnimation } from '../webgl/WebGLAnimation.js'; +import { setProjectionFromUnion } from './WebVRUtils.js'; + +function WebXRManager( renderer ) { + + var gl = renderer.context; + + var device = null; + var session = null; + + var framebufferScaleFactor = 1.0; + + var frameOfReference = null; + var frameOfReferenceType = 'stage'; + + var pose = null; + + var controllers = []; + var inputSources = []; + + function isPresenting() { + + return session !== null && frameOfReference !== null; + + } + + // + + var cameraL = new PerspectiveCamera(); + cameraL.layers.enable( 1 ); + cameraL.viewport = new Vector4(); + + var cameraR = new PerspectiveCamera(); + cameraR.layers.enable( 2 ); + cameraR.viewport = new Vector4(); + + var cameraVR = new ArrayCamera( [ cameraL, cameraR ] ); + cameraVR.layers.enable( 1 ); + cameraVR.layers.enable( 2 ); + + // + + this.enabled = false; + + this.getController = function ( id ) { + + var controller = controllers[ id ]; + + if ( controller === undefined ) { + + controller = new Group(); + controller.matrixAutoUpdate = false; + controller.visible = false; + + controllers[ id ] = controller; + + } + + return controller; + + }; + + this.getDevice = function () { + + return device; + + }; + + this.setDevice = function ( value ) { + + if ( value !== undefined ) device = value; + if ( value instanceof XRDevice ) gl.setCompatibleXRDevice( value ); + + }; + + // + + function onSessionEvent( event ) { + + var controller = controllers[ inputSources.indexOf( event.inputSource ) ]; + if ( controller ) controller.dispatchEvent( { type: event.type } ); + + } + + function onSessionEnd() { + + renderer.setFramebuffer( null ); + animation.stop(); + + } + + this.setFramebufferScaleFactor = function ( value ) { + + framebufferScaleFactor = value; + + }; + + this.setFrameOfReferenceType = function ( value ) { + + frameOfReferenceType = value; + + }; + + this.setSession = function ( value ) { + + session = value; + + if ( session !== null ) { + + session.addEventListener( 'select', onSessionEvent ); + session.addEventListener( 'selectstart', onSessionEvent ); + session.addEventListener( 'selectend', onSessionEvent ); + session.addEventListener( 'end', onSessionEnd ); + + session.baseLayer = new XRWebGLLayer( session, gl, { framebufferScaleFactor: framebufferScaleFactor } ); + session.requestFrameOfReference( frameOfReferenceType ).then( function ( value ) { + + frameOfReference = value; + + renderer.setFramebuffer( session.baseLayer.framebuffer ); + + animation.setContext( session ); + animation.start(); + + } ); + + // + + inputSources = session.getInputSources(); + + session.addEventListener( 'inputsourceschange', function () { + + inputSources = session.getInputSources(); + console.log( inputSources ); + + for ( var i = 0; i < controllers.length; i ++ ) { + + var controller = controllers[ i ]; + controller.userData.inputSource = inputSources[ i ]; + + } + + } ); + + } + + }; + + function updateCamera( camera, parent ) { + + if ( parent === null ) { + + camera.matrixWorld.copy( camera.matrix ); + + } else { + + camera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix ); + + } + + camera.matrixWorldInverse.getInverse( camera.matrixWorld ); + + } + + this.getCamera = function ( camera ) { + + if ( isPresenting() ) { + + var parent = camera.parent; + var cameras = cameraVR.cameras; + + updateCamera( cameraVR, parent ); + + for ( var i = 0; i < cameras.length; i ++ ) { + + updateCamera( cameras[ i ], parent ); + + } + + // update camera and its children + + camera.matrixWorld.copy( cameraVR.matrixWorld ); + + var children = camera.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].updateMatrixWorld( true ); + + } + + setProjectionFromUnion( cameraVR, cameraL, cameraR ); + + return cameraVR; + + } + + return camera; + + }; + + this.isPresenting = isPresenting; + + // Animation Loop + + var onAnimationFrameCallback = null; + + function onAnimationFrame( time, frame ) { + + pose = frame.getDevicePose( frameOfReference ); + + if ( pose !== null ) { + + var layer = session.baseLayer; + var views = frame.views; + + for ( var i = 0; i < views.length; i ++ ) { + + var view = views[ i ]; + var viewport = layer.getViewport( view ); + var viewMatrix = pose.getViewMatrix( view ); + + var camera = cameraVR.cameras[ i ]; + camera.matrix.fromArray( viewMatrix ).getInverse( camera.matrix ); + camera.projectionMatrix.fromArray( view.projectionMatrix ); + camera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height ); + + if ( i === 0 ) { + + cameraVR.matrix.copy( camera.matrix ); + + } + + } + + } + + // + + for ( var i = 0; i < controllers.length; i ++ ) { + + var controller = controllers[ i ]; + + var inputSource = inputSources[ i ]; + + if ( inputSource ) { + + var inputPose = frame.getInputPose( inputSource, frameOfReference ); + + if ( inputPose !== null ) { + + if ( 'targetRay' in inputPose ) { + + controller.matrix.elements = inputPose.targetRay.transformMatrix; + + } else if ( 'pointerMatrix' in inputPose ) { + + // DEPRECATED + + controller.matrix.elements = inputPose.pointerMatrix; + + } + + controller.matrix.decompose( controller.position, controller.rotation, controller.scale ); + controller.visible = true; + + continue; + + } + + } + + controller.visible = false; + + } + + if ( onAnimationFrameCallback ) onAnimationFrameCallback( time ); + + } + + var animation = new WebGLAnimation(); + animation.setAnimationLoop( onAnimationFrame ); + + this.setAnimationLoop = function ( callback ) { + + onAnimationFrameCallback = callback; + + }; + + this.dispose = function () {}; + + // DEPRECATED + + this.getStandingMatrix = function () { + + console.warn( 'THREE.WebXRManager: getStandingMatrix() is no longer needed.' ); + return new THREE.Matrix4(); + + }; + + this.submitFrame = function () {}; + +} + +export { WebXRManager }; diff --git a/lib/scenes/Fog.js b/lib/scenes/Fog.js new file mode 100644 index 0000000..2daf22e --- /dev/null +++ b/lib/scenes/Fog.js @@ -0,0 +1,38 @@ +import { Color } from '../math/Color.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +function Fog( color, near, far ) { + + this.name = ''; + + this.color = new Color( color ); + + this.near = ( near !== undefined ) ? near : 1; + this.far = ( far !== undefined ) ? far : 1000; + +} + +Fog.prototype.isFog = true; + +Fog.prototype.clone = function () { + + return new Fog( this.color, this.near, this.far ); + +}; + +Fog.prototype.toJSON = function ( /* meta */ ) { + + return { + type: 'Fog', + color: this.color.getHex(), + near: this.near, + far: this.far + }; + +}; + +export { Fog }; diff --git a/lib/scenes/FogExp2.js b/lib/scenes/FogExp2.js new file mode 100644 index 0000000..5bcec07 --- /dev/null +++ b/lib/scenes/FogExp2.js @@ -0,0 +1,35 @@ +import { Color } from '../math/Color.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +function FogExp2( color, density ) { + + this.name = ''; + + this.color = new Color( color ); + this.density = ( density !== undefined ) ? density : 0.00025; + +} + +FogExp2.prototype.isFogExp2 = true; + +FogExp2.prototype.clone = function () { + + return new FogExp2( this.color, this.density ); + +}; + +FogExp2.prototype.toJSON = function ( /* meta */ ) { + + return { + type: 'FogExp2', + color: this.color.getHex(), + density: this.density + }; + +}; + +export { FogExp2 }; diff --git a/lib/scenes/Scene.js b/lib/scenes/Scene.js new file mode 100644 index 0000000..0c26ea9 --- /dev/null +++ b/lib/scenes/Scene.js @@ -0,0 +1,55 @@ +import { Object3D } from '../core/Object3D.js'; + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function Scene() { + + Object3D.call( this ); + + this.type = 'Scene'; + + this.background = null; + this.fog = null; + this.overrideMaterial = null; + + this.autoUpdate = true; // checked by the renderer + +} + +Scene.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Scene, + + copy: function ( source, recursive ) { + + Object3D.prototype.copy.call( this, source, recursive ); + + if ( source.background !== null ) this.background = source.background.clone(); + if ( source.fog !== null ) this.fog = source.fog.clone(); + if ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone(); + + this.autoUpdate = source.autoUpdate; + this.matrixAutoUpdate = source.matrixAutoUpdate; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + if ( this.background !== null ) data.object.background = this.background.toJSON( meta ); + if ( this.fog !== null ) data.object.fog = this.fog.toJSON(); + + return data; + + } + +} ); + + + +export { Scene }; diff --git a/lib/textures/CanvasTexture.js b/lib/textures/CanvasTexture.js new file mode 100644 index 0000000..5239619 --- /dev/null +++ b/lib/textures/CanvasTexture.js @@ -0,0 +1,19 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { Texture } from './Texture.js'; + +function CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + Texture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.needsUpdate = true; + +} + +CanvasTexture.prototype = Object.create( Texture.prototype ); +CanvasTexture.prototype.constructor = CanvasTexture; +CanvasTexture.prototype.isCanvasTexture = true; + +export { CanvasTexture }; diff --git a/lib/textures/CompressedTexture.js b/lib/textures/CompressedTexture.js new file mode 100644 index 0000000..9e800e5 --- /dev/null +++ b/lib/textures/CompressedTexture.js @@ -0,0 +1,32 @@ +/** + * @author alteredq / http://alteredqualia.com/ + */ + +import { Texture } from './Texture.js'; + +function CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.image = { width: width, height: height }; + this.mipmaps = mipmaps; + + // no flipping for cube textures + // (also flipping doesn't work for compressed textures ) + + this.flipY = false; + + // can't generate mipmaps for compressed textures + // mips must be embedded in DDS files + + this.generateMipmaps = false; + +} + +CompressedTexture.prototype = Object.create( Texture.prototype ); +CompressedTexture.prototype.constructor = CompressedTexture; + +CompressedTexture.prototype.isCompressedTexture = true; + + +export { CompressedTexture }; diff --git a/lib/textures/CubeTexture.js b/lib/textures/CubeTexture.js new file mode 100644 index 0000000..3e6d7cf --- /dev/null +++ b/lib/textures/CubeTexture.js @@ -0,0 +1,41 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { Texture } from './Texture.js'; +import { CubeReflectionMapping } from '../constants.js'; + +function CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { + + images = images !== undefined ? images : []; + mapping = mapping !== undefined ? mapping : CubeReflectionMapping; + + Texture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.flipY = false; + +} + +CubeTexture.prototype = Object.create( Texture.prototype ); +CubeTexture.prototype.constructor = CubeTexture; + +CubeTexture.prototype.isCubeTexture = true; + +Object.defineProperty( CubeTexture.prototype, 'images', { + + get: function () { + + return this.image; + + }, + + set: function ( value ) { + + this.image = value; + + } + +} ); + + +export { CubeTexture }; diff --git a/lib/textures/DataTexture.js b/lib/textures/DataTexture.js new file mode 100644 index 0000000..5544075 --- /dev/null +++ b/lib/textures/DataTexture.js @@ -0,0 +1,29 @@ +/** + * @author alteredq / http://alteredqualia.com/ + */ + +import { Texture } from './Texture.js'; +import { NearestFilter } from '../constants.js'; + +function DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.image = { data: data, width: width, height: height }; + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter; + + this.generateMipmaps = false; + this.flipY = false; + this.unpackAlignment = 1; + +} + +DataTexture.prototype = Object.create( Texture.prototype ); +DataTexture.prototype.constructor = DataTexture; + +DataTexture.prototype.isDataTexture = true; + + +export { DataTexture }; diff --git a/lib/textures/DataTexture3D.js b/lib/textures/DataTexture3D.js new file mode 100644 index 0000000..5aae390 --- /dev/null +++ b/lib/textures/DataTexture3D.js @@ -0,0 +1,34 @@ +/** + * @author Artur Trzesiok + */ + +import { Texture } from './Texture.js'; +import { NearestFilter } from '../constants.js'; + +function DataTexture3D( data, width, height, depth ) { + + // We're going to add .setXXX() methods for setting properties later. + // Users can still set in DataTexture3D directly. + // + // var texture = new THREE.DataTexture3D( data, width, height, depth ); + // texture.anisotropy = 16; + // + // See #14839 + + Texture.call( this, null ); + + this.image = { data: data, width: width, height: height, depth: depth }; + + this.magFilter = NearestFilter; + this.minFilter = NearestFilter; + + this.generateMipmaps = false; + this.flipY = false; + +} + +DataTexture3D.prototype = Object.create( Texture.prototype ); +DataTexture3D.prototype.constructor = DataTexture3D; +DataTexture3D.prototype.isDataTexture3D = true; + +export { DataTexture3D }; diff --git a/lib/textures/DepthTexture.js b/lib/textures/DepthTexture.js new file mode 100644 index 0000000..9800e18 --- /dev/null +++ b/lib/textures/DepthTexture.js @@ -0,0 +1,38 @@ +/** + * @author Matt DesLauriers / @mattdesl + * @author atix / arthursilber.de + */ + +import { Texture } from './Texture.js'; +import { NearestFilter, UnsignedShortType, UnsignedInt248Type, DepthFormat, DepthStencilFormat } from '../constants.js'; + +function DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) { + + format = format !== undefined ? format : DepthFormat; + + if ( format !== DepthFormat && format !== DepthStencilFormat ) { + + throw new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' ); + + } + + if ( type === undefined && format === DepthFormat ) type = UnsignedShortType; + if ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type; + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.image = { width: width, height: height }; + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter; + + this.flipY = false; + this.generateMipmaps = false; + +} + +DepthTexture.prototype = Object.create( Texture.prototype ); +DepthTexture.prototype.constructor = DepthTexture; +DepthTexture.prototype.isDepthTexture = true; + +export { DepthTexture }; diff --git a/lib/textures/Texture.js b/lib/textures/Texture.js new file mode 100644 index 0000000..d23cce9 --- /dev/null +++ b/lib/textures/Texture.js @@ -0,0 +1,317 @@ +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + */ + +import { EventDispatcher } from '../core/EventDispatcher.js'; +import { UVMapping } from '../constants.js'; +import { MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, LinearEncoding, UnsignedByteType, RGBAFormat, LinearMipMapLinearFilter, LinearFilter } from '../constants.js'; +import { _Math } from '../math/Math.js'; +import { Vector2 } from '../math/Vector2.js'; +import { Matrix3 } from '../math/Matrix3.js'; +import { ImageUtils } from '../extras/ImageUtils.js'; + +var textureId = 0; + +function Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { + + Object.defineProperty( this, 'id', { value: textureId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + + this.image = image !== undefined ? image : Texture.DEFAULT_IMAGE; + this.mipmaps = []; + + this.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING; + + this.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping; + this.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping; + + this.magFilter = magFilter !== undefined ? magFilter : LinearFilter; + this.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter; + + this.anisotropy = anisotropy !== undefined ? anisotropy : 1; + + this.format = format !== undefined ? format : RGBAFormat; + this.type = type !== undefined ? type : UnsignedByteType; + + this.offset = new Vector2( 0, 0 ); + this.repeat = new Vector2( 1, 1 ); + this.center = new Vector2( 0, 0 ); + this.rotation = 0; + + this.matrixAutoUpdate = true; + this.matrix = new Matrix3(); + + this.generateMipmaps = true; + this.premultiplyAlpha = false; + this.flipY = true; + this.unpackAlignment = 4; // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml) + + // Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap. + // + // Also changing the encoding after already used by a Material will not automatically make the Material + // update. You need to explicitly call Material.needsUpdate to trigger it to recompile. + this.encoding = encoding !== undefined ? encoding : LinearEncoding; + + this.version = 0; + this.onUpdate = null; + +} + +Texture.DEFAULT_IMAGE = undefined; +Texture.DEFAULT_MAPPING = UVMapping; + +Texture.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: Texture, + + isTexture: true, + + updateMatrix: function () { + + this.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.name = source.name; + + this.image = source.image; + this.mipmaps = source.mipmaps.slice( 0 ); + + this.mapping = source.mapping; + + this.wrapS = source.wrapS; + this.wrapT = source.wrapT; + + this.magFilter = source.magFilter; + this.minFilter = source.minFilter; + + this.anisotropy = source.anisotropy; + + this.format = source.format; + this.type = source.type; + + this.offset.copy( source.offset ); + this.repeat.copy( source.repeat ); + this.center.copy( source.center ); + this.rotation = source.rotation; + + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrix.copy( source.matrix ); + + this.generateMipmaps = source.generateMipmaps; + this.premultiplyAlpha = source.premultiplyAlpha; + this.flipY = source.flipY; + this.unpackAlignment = source.unpackAlignment; + this.encoding = source.encoding; + + return this; + + }, + + toJSON: function ( meta ) { + + var isRootObject = ( meta === undefined || typeof meta === 'string' ); + + if ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) { + + return meta.textures[ this.uuid ]; + + } + + var output = { + + metadata: { + version: 4.5, + type: 'Texture', + generator: 'Texture.toJSON' + }, + + uuid: this.uuid, + name: this.name, + + mapping: this.mapping, + + repeat: [ this.repeat.x, this.repeat.y ], + offset: [ this.offset.x, this.offset.y ], + center: [ this.center.x, this.center.y ], + rotation: this.rotation, + + wrap: [ this.wrapS, this.wrapT ], + + format: this.format, + minFilter: this.minFilter, + magFilter: this.magFilter, + anisotropy: this.anisotropy, + + flipY: this.flipY + + }; + + if ( this.image !== undefined ) { + + // TODO: Move to THREE.Image + + var image = this.image; + + if ( image.uuid === undefined ) { + + image.uuid = _Math.generateUUID(); // UGH + + } + + if ( ! isRootObject && meta.images[ image.uuid ] === undefined ) { + + var url; + + if ( Array.isArray( image ) ) { + + // process array of images e.g. CubeTexture + + url = []; + + for ( var i = 0, l = image.length; i < l; i ++ ) { + + url.push( ImageUtils.getDataURL( image[ i ] ) ); + + } + + } else { + + // process single image + + url = ImageUtils.getDataURL( image ); + + } + + meta.images[ image.uuid ] = { + uuid: image.uuid, + url: url + }; + + } + + output.image = image.uuid; + + } + + if ( ! isRootObject ) { + + meta.textures[ this.uuid ] = output; + + } + + return output; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + }, + + transformUv: function ( uv ) { + + if ( this.mapping !== UVMapping ) return uv; + + uv.applyMatrix3( this.matrix ); + + if ( uv.x < 0 || uv.x > 1 ) { + + switch ( this.wrapS ) { + + case RepeatWrapping: + + uv.x = uv.x - Math.floor( uv.x ); + break; + + case ClampToEdgeWrapping: + + uv.x = uv.x < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) { + + uv.x = Math.ceil( uv.x ) - uv.x; + + } else { + + uv.x = uv.x - Math.floor( uv.x ); + + } + break; + + } + + } + + if ( uv.y < 0 || uv.y > 1 ) { + + switch ( this.wrapT ) { + + case RepeatWrapping: + + uv.y = uv.y - Math.floor( uv.y ); + break; + + case ClampToEdgeWrapping: + + uv.y = uv.y < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) { + + uv.y = Math.ceil( uv.y ) - uv.y; + + } else { + + uv.y = uv.y - Math.floor( uv.y ); + + } + break; + + } + + } + + if ( this.flipY ) { + + uv.y = 1 - uv.y; + + } + + return uv; + + } + +} ); + +Object.defineProperty( Texture.prototype, "needsUpdate", { + + set: function ( value ) { + + if ( value === true ) this.version ++; + + } + +} ); + + +export { Texture }; diff --git a/lib/textures/VideoTexture.js b/lib/textures/VideoTexture.js new file mode 100644 index 0000000..848b23d --- /dev/null +++ b/lib/textures/VideoTexture.js @@ -0,0 +1,36 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { Texture } from './Texture.js'; + +function VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + Texture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.generateMipmaps = false; + +} + +VideoTexture.prototype = Object.assign( Object.create( Texture.prototype ), { + + constructor: VideoTexture, + + isVideoTexture: true, + + update: function () { + + var video = this.image; + + if ( video.readyState >= video.HAVE_CURRENT_DATA ) { + + this.needsUpdate = true; + + } + + } + +} ); + + +export { VideoTexture }; diff --git a/lib/three.js b/lib/three.js new file mode 100644 index 0000000..0984296 --- /dev/null +++ b/lib/three.js @@ -0,0 +1,48206 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.THREE = {}))); +}(this, (function (exports) { 'use strict'; + + // Polyfills + + if ( Number.EPSILON === undefined ) { + + Number.EPSILON = Math.pow( 2, - 52 ); + + } + + if ( Number.isInteger === undefined ) { + + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger + + Number.isInteger = function ( value ) { + + return typeof value === 'number' && isFinite( value ) && Math.floor( value ) === value; + + }; + + } + + // + + if ( Math.sign === undefined ) { + + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign + + Math.sign = function ( x ) { + + return ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x; + + }; + + } + + if ( 'name' in Function.prototype === false ) { + + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name + + Object.defineProperty( Function.prototype, 'name', { + + get: function () { + + return this.toString().match( /^\s*function\s*([^\(\s]*)/ )[ 1 ]; + + } + + } ); + + } + + if ( Object.assign === undefined ) { + + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign + + ( function () { + + Object.assign = function ( target ) { + + if ( target === undefined || target === null ) { + + throw new TypeError( 'Cannot convert undefined or null to object' ); + + } + + var output = Object( target ); + + for ( var index = 1; index < arguments.length; index ++ ) { + + var source = arguments[ index ]; + + if ( source !== undefined && source !== null ) { + + for ( var nextKey in source ) { + + if ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) { + + output[ nextKey ] = source[ nextKey ]; + + } + + } + + } + + } + + return output; + + }; + + } )(); + + } + + /** + * https://github.com/mrdoob/eventdispatcher.js/ + */ + + function EventDispatcher() {} + + Object.assign( EventDispatcher.prototype, { + + 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 ); + + } + + }, + + hasEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) return false; + + var listeners = this._listeners; + + return listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1; + + }, + + removeEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) return; + + var listeners = this._listeners; + var listenerArray = listeners[ type ]; + + if ( listenerArray !== undefined ) { + + var index = listenerArray.indexOf( listener ); + + if ( index !== - 1 ) { + + listenerArray.splice( index, 1 ); + + } + + } + + }, + + dispatchEvent: function ( event ) { + + if ( this._listeners === undefined ) return; + + var listeners = this._listeners; + var listenerArray = listeners[ event.type ]; + + if ( listenerArray !== undefined ) { + + event.target = this; + + var array = listenerArray.slice( 0 ); + + for ( var i = 0, l = array.length; i < l; i ++ ) { + + array[ i ].call( this, event ); + + } + + } + + } + + } ); + + var REVISION = '98dev'; + var MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 }; + var CullFaceNone = 0; + var CullFaceBack = 1; + var CullFaceFront = 2; + var CullFaceFrontBack = 3; + var FrontFaceDirectionCW = 0; + var FrontFaceDirectionCCW = 1; + var BasicShadowMap = 0; + var PCFShadowMap = 1; + var PCFSoftShadowMap = 2; + var FrontSide = 0; + var BackSide = 1; + var DoubleSide = 2; + var FlatShading = 1; + var SmoothShading = 2; + var NoColors = 0; + var FaceColors = 1; + var VertexColors = 2; + var NoBlending = 0; + var NormalBlending = 1; + var AdditiveBlending = 2; + var SubtractiveBlending = 3; + var MultiplyBlending = 4; + var CustomBlending = 5; + var AddEquation = 100; + var SubtractEquation = 101; + var ReverseSubtractEquation = 102; + var MinEquation = 103; + var MaxEquation = 104; + var ZeroFactor = 200; + var OneFactor = 201; + var SrcColorFactor = 202; + var OneMinusSrcColorFactor = 203; + var SrcAlphaFactor = 204; + var OneMinusSrcAlphaFactor = 205; + var DstAlphaFactor = 206; + var OneMinusDstAlphaFactor = 207; + var DstColorFactor = 208; + var OneMinusDstColorFactor = 209; + var SrcAlphaSaturateFactor = 210; + var NeverDepth = 0; + var AlwaysDepth = 1; + var LessDepth = 2; + var LessEqualDepth = 3; + var EqualDepth = 4; + var GreaterEqualDepth = 5; + var GreaterDepth = 6; + var NotEqualDepth = 7; + var MultiplyOperation = 0; + var MixOperation = 1; + var AddOperation = 2; + var NoToneMapping = 0; + var LinearToneMapping = 1; + var ReinhardToneMapping = 2; + var Uncharted2ToneMapping = 3; + var CineonToneMapping = 4; + var UVMapping = 300; + var CubeReflectionMapping = 301; + var CubeRefractionMapping = 302; + var EquirectangularReflectionMapping = 303; + var EquirectangularRefractionMapping = 304; + var SphericalReflectionMapping = 305; + var CubeUVReflectionMapping = 306; + var CubeUVRefractionMapping = 307; + var RepeatWrapping = 1000; + var ClampToEdgeWrapping = 1001; + var MirroredRepeatWrapping = 1002; + var NearestFilter = 1003; + var NearestMipMapNearestFilter = 1004; + var NearestMipMapLinearFilter = 1005; + var LinearFilter = 1006; + var LinearMipMapNearestFilter = 1007; + var LinearMipMapLinearFilter = 1008; + var UnsignedByteType = 1009; + var ByteType = 1010; + var ShortType = 1011; + var UnsignedShortType = 1012; + var IntType = 1013; + var UnsignedIntType = 1014; + var FloatType = 1015; + var HalfFloatType = 1016; + var UnsignedShort4444Type = 1017; + var UnsignedShort5551Type = 1018; + var UnsignedShort565Type = 1019; + var UnsignedInt248Type = 1020; + var AlphaFormat = 1021; + var RGBFormat = 1022; + var RGBAFormat = 1023; + var LuminanceFormat = 1024; + var LuminanceAlphaFormat = 1025; + var RGBEFormat = RGBAFormat; + var DepthFormat = 1026; + var DepthStencilFormat = 1027; + var RedFormat = 1028; + var RGB_S3TC_DXT1_Format = 33776; + var RGBA_S3TC_DXT1_Format = 33777; + var RGBA_S3TC_DXT3_Format = 33778; + var RGBA_S3TC_DXT5_Format = 33779; + var RGB_PVRTC_4BPPV1_Format = 35840; + var RGB_PVRTC_2BPPV1_Format = 35841; + var RGBA_PVRTC_4BPPV1_Format = 35842; + var RGBA_PVRTC_2BPPV1_Format = 35843; + var RGB_ETC1_Format = 36196; + var RGBA_ASTC_4x4_Format = 37808; + var RGBA_ASTC_5x4_Format = 37809; + var RGBA_ASTC_5x5_Format = 37810; + var RGBA_ASTC_6x5_Format = 37811; + var RGBA_ASTC_6x6_Format = 37812; + var RGBA_ASTC_8x5_Format = 37813; + var RGBA_ASTC_8x6_Format = 37814; + var RGBA_ASTC_8x8_Format = 37815; + var RGBA_ASTC_10x5_Format = 37816; + var RGBA_ASTC_10x6_Format = 37817; + var RGBA_ASTC_10x8_Format = 37818; + var RGBA_ASTC_10x10_Format = 37819; + var RGBA_ASTC_12x10_Format = 37820; + var RGBA_ASTC_12x12_Format = 37821; + var LoopOnce = 2200; + var LoopRepeat = 2201; + var LoopPingPong = 2202; + var InterpolateDiscrete = 2300; + var InterpolateLinear = 2301; + var InterpolateSmooth = 2302; + var ZeroCurvatureEnding = 2400; + var ZeroSlopeEnding = 2401; + var WrapAroundEnding = 2402; + var TrianglesDrawMode = 0; + var TriangleStripDrawMode = 1; + var TriangleFanDrawMode = 2; + var LinearEncoding = 3000; + var sRGBEncoding = 3001; + var GammaEncoding = 3007; + var RGBEEncoding = 3002; + var LogLuvEncoding = 3003; + var RGBM7Encoding = 3004; + var RGBM16Encoding = 3005; + var RGBDEncoding = 3006; + var BasicDepthPacking = 3200; + var RGBADepthPacking = 3201; + var TangentSpaceNormalMap = 0; + var ObjectSpaceNormalMap = 1; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + var _Math = { + + DEG2RAD: Math.PI / 180, + RAD2DEG: 180 / Math.PI, + + generateUUID: ( function () { + + // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136 + + var lut = []; + + for ( var i = 0; i < 256; i ++ ) { + + lut[ i ] = ( i < 16 ? '0' : '' ) + ( i ).toString( 16 ); + + } + + return function generateUUID() { + + var d0 = Math.random() * 0xffffffff | 0; + var d1 = Math.random() * 0xffffffff | 0; + var d2 = Math.random() * 0xffffffff | 0; + var d3 = Math.random() * 0xffffffff | 0; + var 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(); + + }; + + } )(), + + clamp: function ( value, min, max ) { + + return Math.max( min, Math.min( max, value ) ); + + }, + + // compute euclidian modulo of m % n + // https://en.wikipedia.org/wiki/Modulo_operation + + euclideanModulo: function ( n, m ) { + + return ( ( n % m ) + m ) % m; + + }, + + // Linear mapping from range to range + + mapLinear: function ( x, a1, a2, b1, b2 ) { + + return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 ); + + }, + + // https://en.wikipedia.org/wiki/Linear_interpolation + + lerp: function ( x, y, t ) { + + return ( 1 - t ) * x + t * y; + + }, + + // http://en.wikipedia.org/wiki/Smoothstep + + smoothstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * ( 3 - 2 * x ); + + }, + + smootherstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * x * ( x * ( x * 6 - 15 ) + 10 ); + + }, + + // Random integer from interval + + randInt: function ( low, high ) { + + return low + Math.floor( Math.random() * ( high - low + 1 ) ); + + }, + + // Random float from interval + + randFloat: function ( low, high ) { + + return low + Math.random() * ( high - low ); + + }, + + // Random float from <-range/2, range/2> interval + + randFloatSpread: function ( range ) { + + return range * ( 0.5 - Math.random() ); + + }, + + degToRad: function ( degrees ) { + + return degrees * _Math.DEG2RAD; + + }, + + radToDeg: function ( radians ) { + + return radians * _Math.RAD2DEG; + + }, + + isPowerOfTwo: function ( value ) { + + return ( value & ( value - 1 ) ) === 0 && value !== 0; + + }, + + ceilPowerOfTwo: function ( value ) { + + return Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) ); + + }, + + floorPowerOfTwo: function ( value ) { + + return Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) ); + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author philogb / http://blog.thejit.org/ + * @author egraether / http://egraether.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + + function Vector2( x, y ) { + + this.x = x || 0; + this.y = y || 0; + + } + + Object.defineProperties( Vector2.prototype, { + + "width": { + + get: function () { + + return this.x; + + }, + + set: function ( value ) { + + this.x = value; + + } + + }, + + "height": { + + get: function () { + + return this.y; + + }, + + set: function ( value ) { + + this.y = value; + + } + + } + + } ); + + Object.assign( Vector2.prototype, { + + isVector2: true, + + set: function ( x, y ) { + + this.x = x; + this.y = y; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + + return this; + + }, + + multiply: function ( v ) { + + this.x *= v.x; + this.y *= v.y; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + this.x *= scalar; + this.y *= scalar; + + return this; + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + applyMatrix3: function ( m ) { + + var x = this.x, y = this.y; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ]; + this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ]; + + return this; + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + + return this; + + }, + + clamp: function ( min, max ) { + + // assumes min < max, componentwise + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + + return this; + + }, + + clampScalar: function () { + + var min = new Vector2(); + var max = new Vector2(); + + return function clampScalar( minVal, maxVal ) { + + min.set( minVal, minVal ); + max.set( maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y; + + }, + + cross: function ( v ) { + + return this.x * v.y - this.y * v.x; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y ); + + }, + + manhattanLength: function () { + + return Math.abs( this.x ) + Math.abs( this.y ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() || 1 ); + + }, + + angle: function () { + + // computes the angle in radians with respect to the positive x-axis + + var angle = Math.atan2( this.y, this.x ); + + if ( angle < 0 ) angle += 2 * Math.PI; + + return angle; + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x, dy = this.y - v.y; + return dx * dx + dy * dy; + + }, + + manhattanDistanceTo: function ( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ); + + }, + + setLength: function ( length ) { + + return this.normalize().multiplyScalar( length ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + + return this; + + }, + + rotateAround: function ( center, angle ) { + + var c = Math.cos( angle ), s = Math.sin( angle ); + + var x = this.x - center.x; + var y = this.y - center.y; + + this.x = x * c - y * s + center.x; + this.y = x * s + y * c + center.y; + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author jordi_ros / http://plattsoft.com + * @author D1plo1d / http://github.com/D1plo1d + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author timknip / http://www.floorplanner.com/ + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + + function Matrix4() { + + this.elements = [ + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ]; + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' ); + + } + + } + + Object.assign( Matrix4.prototype, { + + isMatrix4: true, + + set: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) { + + var te = this.elements; + + te[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14; + te[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24; + te[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34; + te[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44; + + return this; + + }, + + identity: function () { + + this.set( + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + clone: function () { + + return new Matrix4().fromArray( this.elements ); + + }, + + copy: function ( m ) { + + var te = this.elements; + var 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; + + }, + + copyPosition: function ( m ) { + + var te = this.elements, me = m.elements; + + te[ 12 ] = me[ 12 ]; + te[ 13 ] = me[ 13 ]; + te[ 14 ] = me[ 14 ]; + + return this; + + }, + + extractBasis: function ( xAxis, yAxis, zAxis ) { + + xAxis.setFromMatrixColumn( this, 0 ); + yAxis.setFromMatrixColumn( this, 1 ); + zAxis.setFromMatrixColumn( this, 2 ); + + return this; + + }, + + makeBasis: function ( 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; + + }, + + extractRotation: function () { + + var v1 = new Vector3(); + + return function extractRotation( m ) { + + // this method does not support reflection matrices + + var te = this.elements; + var me = m.elements; + + var scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length(); + var scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length(); + var scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length(); + + 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; + + }; + + }(), + + makeRotationFromEuler: function ( euler ) { + + if ( ! ( euler && euler.isEuler ) ) { + + console.error( 'THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' ); + + } + + var te = this.elements; + + var x = euler.x, y = euler.y, z = euler.z; + var a = Math.cos( x ), b = Math.sin( x ); + var c = Math.cos( y ), d = Math.sin( y ); + var e = Math.cos( z ), f = Math.sin( z ); + + if ( euler.order === 'XYZ' ) { + + var 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' ) { + + var 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' ) { + + var 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' ) { + + var 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' ) { + + var 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' ) { + + var 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; + + }, + + makeRotationFromQuaternion: function () { + + var zero = new Vector3( 0, 0, 0 ); + var one = new Vector3( 1, 1, 1 ); + + return function makeRotationFromQuaternion( q ) { + + return this.compose( zero, q, one ); + + }; + + }(), + + lookAt: function () { + + var x = new Vector3(); + var y = new Vector3(); + var z = new Vector3(); + + return function lookAt( eye, target, up ) { + + var te = this.elements; + + z.subVectors( eye, target ); + + if ( z.lengthSq() === 0 ) { + + // eye and target are in the same position + + z.z = 1; + + } + + z.normalize(); + x.crossVectors( up, z ); + + if ( x.lengthSq() === 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; + + }; + + }(), + + multiply: function ( m, n ) { + + if ( n !== undefined ) { + + console.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' ); + return this.multiplyMatrices( m, n ); + + } + + return this.multiplyMatrices( this, m ); + + }, + + premultiply: function ( m ) { + + return this.multiplyMatrices( m, this ); + + }, + + multiplyMatrices: function ( a, b ) { + + var ae = a.elements; + var be = b.elements; + var te = this.elements; + + var a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ]; + var a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ]; + var a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ]; + var a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ]; + + var b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ]; + var b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ]; + var b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ]; + var 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; + + }, + + multiplyScalar: function ( s ) { + + var te = this.elements; + + te[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s; + te[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s; + te[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s; + te[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s; + + return this; + + }, + + applyToBufferAttribute: function () { + + var v1 = new Vector3(); + + return function applyToBufferAttribute( attribute ) { + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + v1.x = attribute.getX( i ); + v1.y = attribute.getY( i ); + v1.z = attribute.getZ( i ); + + v1.applyMatrix4( this ); + + attribute.setXYZ( i, v1.x, v1.y, v1.z ); + + } + + return attribute; + + }; + + }(), + + determinant: function () { + + var te = this.elements; + + var n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ]; + var n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ]; + var n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ]; + var n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ]; + + //TODO: make this more efficient + //( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm ) + + 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 + ) + + ); + + }, + + transpose: function () { + + var te = this.elements; + var 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; + + }, + + setPosition: function ( v ) { + + var te = this.elements; + + te[ 12 ] = v.x; + te[ 13 ] = v.y; + te[ 14 ] = v.z; + + return this; + + }, + + getInverse: function ( m, throwOnDegenerate ) { + + // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm + var te = this.elements, + me = m.elements, + + n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ], + n12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ], + n13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ], + n14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 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; + + var det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14; + + if ( det === 0 ) { + + var msg = "THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0"; + + if ( throwOnDegenerate === true ) { + + throw new Error( msg ); + + } else { + + console.warn( msg ); + + } + + return this.identity(); + + } + + var 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; + + }, + + scale: function ( v ) { + + var te = this.elements; + var x = v.x, y = v.y, z = v.z; + + te[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z; + te[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z; + te[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z; + te[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z; + + return this; + + }, + + getMaxScaleOnAxis: function () { + + var te = this.elements; + + var scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ]; + var scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ]; + var scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ]; + + return Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) ); + + }, + + makeTranslation: function ( x, y, z ) { + + this.set( + + 1, 0, 0, x, + 0, 1, 0, y, + 0, 0, 1, z, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationX: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + 1, 0, 0, 0, + 0, c, - s, 0, + 0, s, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationY: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationZ: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, - s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationAxis: function ( axis, angle ) { + + // Based on http://www.gamedev.net/reference/articles/article1199.asp + + var c = Math.cos( angle ); + var s = Math.sin( angle ); + var t = 1 - c; + var x = axis.x, y = axis.y, z = axis.z; + var tx = t * x, ty = t * y; + + 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 + + ); + + return this; + + }, + + makeScale: function ( x, y, z ) { + + this.set( + + x, 0, 0, 0, + 0, y, 0, 0, + 0, 0, z, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeShear: function ( x, y, z ) { + + this.set( + + 1, y, z, 0, + x, 1, z, 0, + x, y, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + compose: function ( position, quaternion, scale ) { + + var te = this.elements; + + var x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w; + var x2 = x + x, y2 = y + y, z2 = z + z; + var xx = x * x2, xy = x * y2, xz = x * z2; + var yy = y * y2, yz = y * z2, zz = z * z2; + var wx = w * x2, wy = w * y2, wz = w * z2; + + var 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; + + }, + + decompose: function () { + + var vector = new Vector3(); + var matrix = new Matrix4(); + + return function decompose( position, quaternion, scale ) { + + var te = this.elements; + + var sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length(); + var sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length(); + var sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length(); + + // if determine is negative, we need to invert one scale + var det = this.determinant(); + if ( det < 0 ) sx = - sx; + + position.x = te[ 12 ]; + position.y = te[ 13 ]; + position.z = te[ 14 ]; + + // scale the rotation part + matrix.copy( this ); + + var invSX = 1 / sx; + var invSY = 1 / sy; + var invSZ = 1 / sz; + + matrix.elements[ 0 ] *= invSX; + matrix.elements[ 1 ] *= invSX; + matrix.elements[ 2 ] *= invSX; + + matrix.elements[ 4 ] *= invSY; + matrix.elements[ 5 ] *= invSY; + matrix.elements[ 6 ] *= invSY; + + matrix.elements[ 8 ] *= invSZ; + matrix.elements[ 9 ] *= invSZ; + matrix.elements[ 10 ] *= invSZ; + + quaternion.setFromRotationMatrix( matrix ); + + scale.x = sx; + scale.y = sy; + scale.z = sz; + + return this; + + }; + + }(), + + makePerspective: function ( left, right, top, bottom, near, far ) { + + if ( far === undefined ) { + + console.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' ); + + } + + var te = this.elements; + var x = 2 * near / ( right - left ); + var y = 2 * near / ( top - bottom ); + + var a = ( right + left ) / ( right - left ); + var b = ( top + bottom ) / ( top - bottom ); + var c = - ( far + near ) / ( far - near ); + var d = - 2 * far * near / ( far - near ); + + te[ 0 ] = x; te[ 4 ] = 0; te[ 8 ] = a; te[ 12 ] = 0; + te[ 1 ] = 0; te[ 5 ] = y; te[ 9 ] = b; te[ 13 ] = 0; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = c; te[ 14 ] = d; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = - 1; te[ 15 ] = 0; + + return this; + + }, + + makeOrthographic: function ( left, right, top, bottom, near, far ) { + + var te = this.elements; + var w = 1.0 / ( right - left ); + var h = 1.0 / ( top - bottom ); + var p = 1.0 / ( far - near ); + + var x = ( right + left ) * w; + var y = ( top + bottom ) * h; + var z = ( far + near ) * p; + + te[ 0 ] = 2 * w; te[ 4 ] = 0; te[ 8 ] = 0; te[ 12 ] = - x; + te[ 1 ] = 0; te[ 5 ] = 2 * h; te[ 9 ] = 0; te[ 13 ] = - y; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = - 2 * p; te[ 14 ] = - z; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = 0; te[ 15 ] = 1; + + return this; + + }, + + equals: function ( matrix ) { + + var te = this.elements; + var me = matrix.elements; + + for ( var i = 0; i < 16; i ++ ) { + + if ( te[ i ] !== me[ i ] ) return false; + + } + + return true; + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + for ( var i = 0; i < 16; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + var 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; + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + + function Quaternion( x, y, z, w ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._w = ( w !== undefined ) ? w : 1; + + } + + Object.assign( Quaternion, { + + slerp: function ( qa, qb, qm, t ) { + + return qm.copy( qa ).slerp( qb, t ); + + }, + + slerpFlat: function ( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) { + + // fuzz-free, array-based Quaternion SLERP operation + + var x0 = src0[ srcOffset0 + 0 ], + y0 = src0[ srcOffset0 + 1 ], + z0 = src0[ srcOffset0 + 2 ], + w0 = src0[ srcOffset0 + 3 ], + + x1 = src1[ srcOffset1 + 0 ], + y1 = src1[ srcOffset1 + 1 ], + z1 = src1[ srcOffset1 + 2 ], + w1 = src1[ srcOffset1 + 3 ]; + + if ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) { + + var s = 1 - t, + + cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1, + + dir = ( cos >= 0 ? 1 : - 1 ), + sqrSin = 1 - cos * cos; + + // Skip the Slerp for tiny steps to avoid numeric problems: + if ( sqrSin > Number.EPSILON ) { + + var sin = Math.sqrt( sqrSin ), + len = Math.atan2( sin, cos * dir ); + + s = Math.sin( s * len ) / sin; + t = Math.sin( t * len ) / sin; + + } + + var tDir = t * dir; + + x0 = x0 * s + x1 * tDir; + y0 = y0 * s + y1 * tDir; + z0 = z0 * s + z1 * tDir; + w0 = w0 * s + w1 * tDir; + + // Normalize in case we just did a lerp: + if ( s === 1 - t ) { + + var 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; + + } + + } ); + + Object.defineProperties( Quaternion.prototype, { + + x: { + + get: function () { + + return this._x; + + }, + + set: function ( value ) { + + this._x = value; + this.onChangeCallback(); + + } + + }, + + y: { + + get: function () { + + return this._y; + + }, + + set: function ( value ) { + + this._y = value; + this.onChangeCallback(); + + } + + }, + + z: { + + get: function () { + + return this._z; + + }, + + set: function ( value ) { + + this._z = value; + this.onChangeCallback(); + + } + + }, + + w: { + + get: function () { + + return this._w; + + }, + + set: function ( value ) { + + this._w = value; + this.onChangeCallback(); + + } + + } + + } ); + + Object.assign( Quaternion.prototype, { + + isQuaternion: true, + + set: function ( x, y, z, w ) { + + this._x = x; + this._y = y; + this._z = z; + this._w = w; + + this.onChangeCallback(); + + return this; + + }, + + clone: function () { + + return new this.constructor( this._x, this._y, this._z, this._w ); + + }, + + copy: function ( quaternion ) { + + this._x = quaternion.x; + this._y = quaternion.y; + this._z = quaternion.z; + this._w = quaternion.w; + + this.onChangeCallback(); + + return this; + + }, + + setFromEuler: function ( euler, update ) { + + if ( ! ( euler && euler.isEuler ) ) { + + throw new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' ); + + } + + var x = euler._x, y = euler._y, z = euler._z, order = euler.order; + + // http://www.mathworks.com/matlabcentral/fileexchange/ + // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/ + // content/SpinCalc.m + + var cos = Math.cos; + var sin = Math.sin; + + var c1 = cos( x / 2 ); + var c2 = cos( y / 2 ); + var c3 = cos( z / 2 ); + + var s1 = sin( x / 2 ); + var s2 = sin( y / 2 ); + var s3 = 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; + + } + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromAxisAngle: function ( axis, angle ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm + + // assumes axis is normalized + + var 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; + + }, + + setFromRotationMatrix: function ( 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) + + var 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, + 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; + + }, + + setFromUnitVectors: function () { + + // assumes direction vectors vFrom and vTo are normalized + + var v1 = new Vector3(); + var r; + + var EPS = 0.000001; + + return function setFromUnitVectors( vFrom, vTo ) { + + if ( v1 === undefined ) v1 = new Vector3(); + + r = vFrom.dot( vTo ) + 1; + + if ( r < EPS ) { + + r = 0; + + if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) { + + v1.set( - vFrom.y, vFrom.x, 0 ); + + } else { + + v1.set( 0, - vFrom.z, vFrom.y ); + + } + + } else { + + v1.crossVectors( vFrom, vTo ); + + } + + this._x = v1.x; + this._y = v1.y; + this._z = v1.z; + this._w = r; + + return this.normalize(); + + }; + + }(), + + angleTo: function ( q ) { + + return 2 * Math.acos( Math.abs( _Math.clamp( this.dot( q ), - 1, 1 ) ) ); + + }, + + rotateTowards: function ( q, step ) { + + var angle = this.angleTo( q ); + + if ( angle === 0 ) return this; + + var t = Math.min( 1, step / angle ); + + this.slerp( q, t ); + + return this; + + }, + + inverse: function () { + + // quaternion is assumed to have unit length + + return this.conjugate(); + + }, + + conjugate: function () { + + this._x *= - 1; + this._y *= - 1; + this._z *= - 1; + + this.onChangeCallback(); + + return this; + + }, + + dot: function ( v ) { + + return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w; + + }, + + lengthSq: function () { + + return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w; + + }, + + length: function () { + + return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w ); + + }, + + normalize: function () { + + var 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; + + }, + + multiply: function ( q, p ) { + + if ( p !== undefined ) { + + console.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' ); + return this.multiplyQuaternions( q, p ); + + } + + return this.multiplyQuaternions( this, q ); + + }, + + premultiply: function ( q ) { + + return this.multiplyQuaternions( q, this ); + + }, + + multiplyQuaternions: function ( a, b ) { + + // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm + + var qax = a._x, qay = a._y, qaz = a._z, qaw = a._w; + var 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; + + }, + + slerp: function ( qb, t ) { + + if ( t === 0 ) return this; + if ( t === 1 ) return this.copy( qb ); + + var x = this._x, y = this._y, z = this._z, w = this._w; + + // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/ + + var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z; + + if ( cosHalfTheta < 0 ) { + + this._w = - qb._w; + this._x = - qb._x; + this._y = - qb._y; + this._z = - qb._z; + + cosHalfTheta = - cosHalfTheta; + + } else { + + this.copy( qb ); + + } + + if ( cosHalfTheta >= 1.0 ) { + + this._w = w; + this._x = x; + this._y = y; + this._z = z; + + return this; + + } + + var sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta; + + if ( sqrSinHalfTheta <= Number.EPSILON ) { + + var s = 1 - t; + this._w = s * w + t * this._w; + this._x = s * x + t * this._x; + this._y = s * y + t * this._y; + this._z = s * z + t * this._z; + + return this.normalize(); + + } + + var sinHalfTheta = Math.sqrt( sqrSinHalfTheta ); + var halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta ); + var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta, + ratioB = Math.sin( t * halfTheta ) / sinHalfTheta; + + this._w = ( w * ratioA + this._w * ratioB ); + this._x = ( x * ratioA + this._x * ratioB ); + this._y = ( y * ratioA + this._y * ratioB ); + this._z = ( z * ratioA + this._z * ratioB ); + + this.onChangeCallback(); + + return this; + + }, + + equals: function ( quaternion ) { + + return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this._x = array[ offset ]; + this._y = array[ offset + 1 ]; + this._z = array[ offset + 2 ]; + this._w = array[ offset + 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._w; + + return array; + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {} + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author kile / http://kile.stravaganza.org/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Vector3( x, y, z ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + + } + + Object.assign( Vector3.prototype, { + + isVector3: true, + + set: function ( x, y, z ) { + + this.x = x; + this.y = y; + this.z = z; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y, this.z ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + + return this; + + }, + + multiply: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' ); + return this.multiplyVectors( v, w ); + + } + + this.x *= v.x; + this.y *= v.y; + this.z *= v.z; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + + return this; + + }, + + multiplyVectors: function ( a, b ) { + + this.x = a.x * b.x; + this.y = a.y * b.y; + this.z = a.z * b.z; + + return this; + + }, + + applyEuler: function () { + + var quaternion = new Quaternion(); + + return function applyEuler( euler ) { + + if ( ! ( euler && euler.isEuler ) ) { + + console.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' ); + + } + + return this.applyQuaternion( quaternion.setFromEuler( euler ) ); + + }; + + }(), + + applyAxisAngle: function () { + + var quaternion = new Quaternion(); + + return function applyAxisAngle( axis, angle ) { + + return this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) ); + + }; + + }(), + + applyMatrix3: function ( m ) { + + var x = this.x, y = this.y, z = this.z; + var 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; + + }, + + applyMatrix4: function ( m ) { + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + var 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; + + }, + + applyQuaternion: function ( q ) { + + var x = this.x, y = this.y, z = this.z; + var qx = q.x, qy = q.y, qz = q.z, qw = q.w; + + // calculate quat * vector + + var ix = qw * x + qy * z - qz * y; + var iy = qw * y + qz * x - qx * z; + var iz = qw * z + qx * y - qy * x; + var 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; + + }, + + project: function ( camera ) { + + return this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix ); + + }, + + unproject: function () { + + var matrix = new Matrix4(); + + return function unproject( camera ) { + + return this.applyMatrix4( matrix.getInverse( camera.projectionMatrix ) ).applyMatrix4( camera.matrixWorld ); + + }; + + }(), + + transformDirection: function ( m ) { + + // input: THREE.Matrix4 affine matrix + // vector interpreted as a direction + + var x = this.x, y = this.y, z = this.z; + var 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(); + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + this.z /= v.z; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + min: function ( 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; + + }, + + max: function ( 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; + + }, + + clamp: function ( min, max ) { + + // assumes min < max, componentwise + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + + return this; + + }, + + clampScalar: function () { + + var min = new Vector3(); + var max = new Vector3(); + + return function clampScalar( minVal, maxVal ) { + + min.set( minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z; + + }, + + // TODO lengthSquared? + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z ); + + }, + + manhattanLength: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() || 1 ); + + }, + + setLength: function ( length ) { + + return this.normalize().multiplyScalar( length ); + + }, + + lerp: function ( 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; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + cross: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' ); + return this.crossVectors( v, w ); + + } + + return this.crossVectors( this, v ); + + }, + + crossVectors: function ( a, b ) { + + var ax = a.x, ay = a.y, az = a.z; + var 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; + + }, + + projectOnVector: function ( vector ) { + + var scalar = vector.dot( this ) / vector.lengthSq(); + + return this.copy( vector ).multiplyScalar( scalar ); + + }, + + projectOnPlane: function () { + + var v1 = new Vector3(); + + return function projectOnPlane( planeNormal ) { + + v1.copy( this ).projectOnVector( planeNormal ); + + return this.sub( v1 ); + + }; + + }(), + + reflect: function () { + + // reflect incident vector off plane orthogonal to normal + // normal is assumed to have unit length + + var v1 = new Vector3(); + + return function reflect( normal ) { + + return this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) ); + + }; + + }(), + + angleTo: function ( v ) { + + var theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) ); + + // clamp, to handle numerical problems + + return Math.acos( _Math.clamp( theta, - 1, 1 ) ); + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z; + + return dx * dx + dy * dy + dz * dz; + + }, + + manhattanDistanceTo: function ( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z ); + + }, + + setFromSpherical: function ( s ) { + + return this.setFromSphericalCoords( s.radius, s.phi, s.theta ); + + }, + + setFromSphericalCoords: function ( radius, phi, theta ) { + + var sinPhiRadius = Math.sin( phi ) * radius; + + this.x = sinPhiRadius * Math.sin( theta ); + this.y = Math.cos( phi ) * radius; + this.z = sinPhiRadius * Math.cos( theta ); + + return this; + + }, + + setFromCylindrical: function ( c ) { + + return this.setFromCylindricalCoords( c.radius, c.theta, c.y ); + + }, + + setFromCylindricalCoords: function ( radius, theta, y ) { + + this.x = radius * Math.sin( theta ); + this.y = y; + this.z = radius * Math.cos( theta ); + + return this; + + }, + + setFromMatrixPosition: function ( m ) { + + var e = m.elements; + + this.x = e[ 12 ]; + this.y = e[ 13 ]; + this.z = e[ 14 ]; + + return this; + + }, + + setFromMatrixScale: function ( m ) { + + var sx = this.setFromMatrixColumn( m, 0 ).length(); + var sy = this.setFromMatrixColumn( m, 1 ).length(); + var sz = this.setFromMatrixColumn( m, 2 ).length(); + + this.x = sx; + this.y = sy; + this.z = sz; + + return this; + + }, + + setFromMatrixColumn: function ( m, index ) { + + return this.fromArray( m.elements, index * 4 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + this.z = attribute.getZ( index ); + + return this; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + * @author tschw + */ + + function Matrix3() { + + this.elements = [ + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ]; + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' ); + + } + + } + + Object.assign( Matrix3.prototype, { + + isMatrix3: true, + + set: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) { + + var te = this.elements; + + te[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31; + te[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32; + te[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33; + + return this; + + }, + + identity: function () { + + this.set( + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ); + + return this; + + }, + + clone: function () { + + return new this.constructor().fromArray( this.elements ); + + }, + + copy: function ( m ) { + + var te = this.elements; + var 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; + + }, + + setFromMatrix4: function ( m ) { + + var me = m.elements; + + this.set( + + me[ 0 ], me[ 4 ], me[ 8 ], + me[ 1 ], me[ 5 ], me[ 9 ], + me[ 2 ], me[ 6 ], me[ 10 ] + + ); + + return this; + + }, + + applyToBufferAttribute: function () { + + var v1 = new Vector3(); + + return function applyToBufferAttribute( attribute ) { + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + v1.x = attribute.getX( i ); + v1.y = attribute.getY( i ); + v1.z = attribute.getZ( i ); + + v1.applyMatrix3( this ); + + attribute.setXYZ( i, v1.x, v1.y, v1.z ); + + } + + return attribute; + + }; + + }(), + + multiply: function ( m ) { + + return this.multiplyMatrices( this, m ); + + }, + + premultiply: function ( m ) { + + return this.multiplyMatrices( m, this ); + + }, + + multiplyMatrices: function ( a, b ) { + + var ae = a.elements; + var be = b.elements; + var te = this.elements; + + var a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ]; + var a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ]; + var a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ]; + + var b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ]; + var b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ]; + var 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; + + }, + + multiplyScalar: function ( s ) { + + var te = this.elements; + + te[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s; + te[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s; + te[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s; + + return this; + + }, + + determinant: function () { + + var te = this.elements; + + var 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; + + }, + + getInverse: function ( matrix, throwOnDegenerate ) { + + if ( matrix && matrix.isMatrix4 ) { + + console.error( "THREE.Matrix3: .getInverse() no longer takes a Matrix4 argument." ); + + } + + var me = matrix.elements, + te = this.elements, + + n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], + n12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ], + n13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 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 ) { + + var msg = "THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0"; + + if ( throwOnDegenerate === true ) { + + throw new Error( msg ); + + } else { + + console.warn( msg ); + + } + + return this.identity(); + + } + + var 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; + + }, + + transpose: function () { + + var tmp, 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; + + }, + + getNormalMatrix: function ( matrix4 ) { + + return this.setFromMatrix4( matrix4 ).getInverse( this ).transpose(); + + }, + + transposeIntoArray: function ( r ) { + + var m = this.elements; + + r[ 0 ] = m[ 0 ]; + r[ 1 ] = m[ 3 ]; + r[ 2 ] = m[ 6 ]; + r[ 3 ] = m[ 1 ]; + r[ 4 ] = m[ 4 ]; + r[ 5 ] = m[ 7 ]; + r[ 6 ] = m[ 2 ]; + r[ 7 ] = m[ 5 ]; + r[ 8 ] = m[ 8 ]; + + return this; + + }, + + setUvTransform: function ( tx, ty, sx, sy, rotation, cx, cy ) { + + var c = Math.cos( rotation ); + var s = Math.sin( rotation ); + + 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 + ); + + }, + + scale: function ( sx, sy ) { + + var te = this.elements; + + te[ 0 ] *= sx; te[ 3 ] *= sx; te[ 6 ] *= sx; + te[ 1 ] *= sy; te[ 4 ] *= sy; te[ 7 ] *= sy; + + return this; + + }, + + rotate: function ( theta ) { + + var c = Math.cos( theta ); + var s = Math.sin( theta ); + + var te = this.elements; + + var a11 = te[ 0 ], a12 = te[ 3 ], a13 = te[ 6 ]; + var a21 = te[ 1 ], a22 = te[ 4 ], a23 = te[ 7 ]; + + te[ 0 ] = c * a11 + s * a21; + te[ 3 ] = c * a12 + s * a22; + te[ 6 ] = c * a13 + s * a23; + + te[ 1 ] = - s * a11 + c * a21; + te[ 4 ] = - s * a12 + c * a22; + te[ 7 ] = - s * a13 + c * a23; + + return this; + + }, + + translate: function ( tx, ty ) { + + var te = this.elements; + + te[ 0 ] += tx * te[ 2 ]; te[ 3 ] += tx * te[ 5 ]; te[ 6 ] += tx * te[ 8 ]; + te[ 1 ] += ty * te[ 2 ]; te[ 4 ] += ty * te[ 5 ]; te[ 7 ] += ty * te[ 8 ]; + + return this; + + }, + + equals: function ( matrix ) { + + var te = this.elements; + var me = matrix.elements; + + for ( var i = 0; i < 9; i ++ ) { + + if ( te[ i ] !== me[ i ] ) return false; + + } + + return true; + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + for ( var i = 0; i < 9; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + var 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; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + */ + + var ImageUtils = { + + getDataURL: function ( image ) { + + var canvas; + + if ( typeof HTMLCanvasElement == 'undefined' ) { + + return image.src; + + } else if ( image instanceof HTMLCanvasElement ) { + + canvas = image; + + } else { + + canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = image.width; + canvas.height = image.height; + + var context = canvas.getContext( '2d' ); + + if ( image instanceof ImageData ) { + + context.putImageData( image, 0, 0 ); + + } else { + + context.drawImage( image, 0, 0, image.width, image.height ); + + } + + } + + if ( canvas.width > 2048 || canvas.height > 2048 ) { + + return canvas.toDataURL( 'image/jpeg', 0.6 ); + + } else { + + return canvas.toDataURL( 'image/png' ); + + } + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + */ + + var textureId = 0; + + function Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { + + Object.defineProperty( this, 'id', { value: textureId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + + this.image = image !== undefined ? image : Texture.DEFAULT_IMAGE; + this.mipmaps = []; + + this.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING; + + this.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping; + this.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping; + + this.magFilter = magFilter !== undefined ? magFilter : LinearFilter; + this.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter; + + this.anisotropy = anisotropy !== undefined ? anisotropy : 1; + + this.format = format !== undefined ? format : RGBAFormat; + this.type = type !== undefined ? type : UnsignedByteType; + + this.offset = new Vector2( 0, 0 ); + this.repeat = new Vector2( 1, 1 ); + this.center = new Vector2( 0, 0 ); + this.rotation = 0; + + this.matrixAutoUpdate = true; + this.matrix = new Matrix3(); + + this.generateMipmaps = true; + this.premultiplyAlpha = false; + this.flipY = true; + this.unpackAlignment = 4; // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml) + + // Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap. + // + // Also changing the encoding after already used by a Material will not automatically make the Material + // update. You need to explicitly call Material.needsUpdate to trigger it to recompile. + this.encoding = encoding !== undefined ? encoding : LinearEncoding; + + this.version = 0; + this.onUpdate = null; + + } + + Texture.DEFAULT_IMAGE = undefined; + Texture.DEFAULT_MAPPING = UVMapping; + + Texture.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: Texture, + + isTexture: true, + + updateMatrix: function () { + + this.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.name = source.name; + + this.image = source.image; + this.mipmaps = source.mipmaps.slice( 0 ); + + this.mapping = source.mapping; + + this.wrapS = source.wrapS; + this.wrapT = source.wrapT; + + this.magFilter = source.magFilter; + this.minFilter = source.minFilter; + + this.anisotropy = source.anisotropy; + + this.format = source.format; + this.type = source.type; + + this.offset.copy( source.offset ); + this.repeat.copy( source.repeat ); + this.center.copy( source.center ); + this.rotation = source.rotation; + + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrix.copy( source.matrix ); + + this.generateMipmaps = source.generateMipmaps; + this.premultiplyAlpha = source.premultiplyAlpha; + this.flipY = source.flipY; + this.unpackAlignment = source.unpackAlignment; + this.encoding = source.encoding; + + return this; + + }, + + toJSON: function ( meta ) { + + var isRootObject = ( meta === undefined || typeof meta === 'string' ); + + if ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) { + + return meta.textures[ this.uuid ]; + + } + + var output = { + + metadata: { + version: 4.5, + type: 'Texture', + generator: 'Texture.toJSON' + }, + + uuid: this.uuid, + name: this.name, + + mapping: this.mapping, + + repeat: [ this.repeat.x, this.repeat.y ], + offset: [ this.offset.x, this.offset.y ], + center: [ this.center.x, this.center.y ], + rotation: this.rotation, + + wrap: [ this.wrapS, this.wrapT ], + + format: this.format, + minFilter: this.minFilter, + magFilter: this.magFilter, + anisotropy: this.anisotropy, + + flipY: this.flipY + + }; + + if ( this.image !== undefined ) { + + // TODO: Move to THREE.Image + + var image = this.image; + + if ( image.uuid === undefined ) { + + image.uuid = _Math.generateUUID(); // UGH + + } + + if ( ! isRootObject && meta.images[ image.uuid ] === undefined ) { + + var url; + + if ( Array.isArray( image ) ) { + + // process array of images e.g. CubeTexture + + url = []; + + for ( var i = 0, l = image.length; i < l; i ++ ) { + + url.push( ImageUtils.getDataURL( image[ i ] ) ); + + } + + } else { + + // process single image + + url = ImageUtils.getDataURL( image ); + + } + + meta.images[ image.uuid ] = { + uuid: image.uuid, + url: url + }; + + } + + output.image = image.uuid; + + } + + if ( ! isRootObject ) { + + meta.textures[ this.uuid ] = output; + + } + + return output; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + }, + + transformUv: function ( uv ) { + + if ( this.mapping !== UVMapping ) return uv; + + uv.applyMatrix3( this.matrix ); + + if ( uv.x < 0 || uv.x > 1 ) { + + switch ( this.wrapS ) { + + case RepeatWrapping: + + uv.x = uv.x - Math.floor( uv.x ); + break; + + case ClampToEdgeWrapping: + + uv.x = uv.x < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) { + + uv.x = Math.ceil( uv.x ) - uv.x; + + } else { + + uv.x = uv.x - Math.floor( uv.x ); + + } + break; + + } + + } + + if ( uv.y < 0 || uv.y > 1 ) { + + switch ( this.wrapT ) { + + case RepeatWrapping: + + uv.y = uv.y - Math.floor( uv.y ); + break; + + case ClampToEdgeWrapping: + + uv.y = uv.y < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) { + + uv.y = Math.ceil( uv.y ) - uv.y; + + } else { + + uv.y = uv.y - Math.floor( uv.y ); + + } + break; + + } + + } + + if ( this.flipY ) { + + uv.y = 1 - uv.y; + + } + + return uv; + + } + + } ); + + Object.defineProperty( Texture.prototype, "needsUpdate", { + + set: function ( value ) { + + if ( value === true ) this.version ++; + + } + + } ); + + /** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Vector4( x, y, z, w ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + this.w = ( w !== undefined ) ? w : 1; + + } + + Object.assign( Vector4.prototype, { + + isVector4: true, + + set: function ( x, y, z, w ) { + + this.x = x; + this.y = y; + this.z = z; + this.w = w; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + this.w = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setW: function ( w ) { + + this.w = w; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + case 3: this.w = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + case 3: return this.w; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y, this.z, this.w ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + this.w = ( v.w !== undefined ) ? v.w : 1; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + this.w += v.w; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + this.w += s; + + return this; + + }, + + addVectors: function ( 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; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + this.w += v.w * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + this.w -= v.w; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + this.w -= s; + + return this; + + }, + + subVectors: function ( 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; + + }, + + multiplyScalar: function ( scalar ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + this.w *= scalar; + + return this; + + }, + + applyMatrix4: function ( m ) { + + var x = this.x, y = this.y, z = this.z, w = this.w; + var 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; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + setAxisAngleFromQuaternion: function ( q ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm + + // q is assumed to be normalized + + this.w = 2 * Math.acos( q.w ); + + var s = Math.sqrt( 1 - q.w * q.w ); + + if ( s < 0.0001 ) { + + this.x = 1; + this.y = 0; + this.z = 0; + + } else { + + this.x = q.x / s; + this.y = q.y / s; + this.z = q.z / s; + + } + + return this; + + }, + + setAxisAngleFromRotationMatrix: function ( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var angle, x, y, z, // variables for result + epsilon = 0.01, // margin to allow for rounding errors + epsilon2 = 0.1, // margin to distinguish between 0 and 180 degrees + + 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 ]; + + if ( ( Math.abs( m12 - m21 ) < epsilon ) && + ( Math.abs( m13 - m31 ) < epsilon ) && + ( Math.abs( m23 - m32 ) < epsilon ) ) { + + // singularity found + // first check for identity matrix which must have +1 for all terms + // in leading diagonal and zero in other terms + + if ( ( Math.abs( m12 + m21 ) < epsilon2 ) && + ( Math.abs( m13 + m31 ) < epsilon2 ) && + ( Math.abs( m23 + m32 ) < epsilon2 ) && + ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) { + + // this singularity is identity matrix so angle = 0 + + this.set( 1, 0, 0, 0 ); + + return this; // zero angle, arbitrary axis + + } + + // otherwise this singularity is angle = 180 + + angle = Math.PI; + + var xx = ( m11 + 1 ) / 2; + var yy = ( m22 + 1 ) / 2; + var zz = ( m33 + 1 ) / 2; + var xy = ( m12 + m21 ) / 4; + var xz = ( m13 + m31 ) / 4; + var yz = ( m23 + m32 ) / 4; + + if ( ( xx > yy ) && ( xx > zz ) ) { + + // m11 is the largest diagonal term + + if ( xx < epsilon ) { + + x = 0; + y = 0.707106781; + z = 0.707106781; + + } else { + + x = Math.sqrt( xx ); + y = xy / x; + z = xz / x; + + } + + } else if ( yy > zz ) { + + // m22 is the largest diagonal term + + if ( yy < epsilon ) { + + x = 0.707106781; + y = 0; + z = 0.707106781; + + } else { + + y = Math.sqrt( yy ); + x = xy / y; + z = yz / y; + + } + + } else { + + // m33 is the largest diagonal term so base result on this + + if ( zz < epsilon ) { + + x = 0.707106781; + y = 0.707106781; + z = 0; + + } else { + + z = Math.sqrt( zz ); + x = xz / z; + y = yz / z; + + } + + } + + this.set( x, y, z, angle ); + + return this; // return 180 deg rotation + + } + + // as we have reached here there are no singularities so we can handle normally + + var s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) + + ( m13 - m31 ) * ( m13 - m31 ) + + ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize + + if ( Math.abs( s ) < 0.001 ) s = 1; + + // prevent divide by zero, should not happen if matrix is orthogonal and should be + // caught by singularity test above, but I've left it in just in case + + this.x = ( m32 - m23 ) / s; + this.y = ( m13 - m31 ) / s; + this.z = ( m21 - m12 ) / s; + this.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 ); + + return this; + + }, + + min: function ( 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 ); + this.w = Math.min( this.w, v.w ); + + return this; + + }, + + max: function ( 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 ); + this.w = Math.max( this.w, v.w ); + + return this; + + }, + + clamp: function ( min, max ) { + + // assumes min < max, componentwise + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + this.w = Math.max( min.w, Math.min( max.w, this.w ) ); + + return this; + + }, + + clampScalar: function () { + + var min, max; + + return function clampScalar( minVal, maxVal ) { + + if ( min === undefined ) { + + min = new Vector4(); + max = new Vector4(); + + } + + min.set( minVal, minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + this.w = Math.floor( this.w ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + this.w = Math.ceil( this.w ); + + return this; + + }, + + round: function () { + + 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; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + this.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + this.w = - this.w; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w ); + + }, + + manhattanLength: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() || 1 ); + + }, + + setLength: function ( length ) { + + return this.normalize().multiplyScalar( length ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + this.w += ( v.w - this.w ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + this.w = array[ offset + 3 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + array[ offset + 3 ] = this.w; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + this.z = attribute.getZ( index ); + this.w = attribute.getW( index ); + + return this; + + } + + } ); + + /** + * @author szimek / https://github.com/szimek/ + * @author alteredq / http://alteredqualia.com/ + * @author Marius Kintel / https://github.com/kintel + */ + + /* + In options, we can specify: + * Texture parameters for an auto-generated target texture + * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers + */ + function WebGLRenderTarget( width, height, options ) { + + this.width = width; + this.height = height; + + this.scissor = new Vector4( 0, 0, width, height ); + this.scissorTest = false; + + this.viewport = new Vector4( 0, 0, width, height ); + + options = options || {}; + + if ( options.minFilter === undefined ) options.minFilter = LinearFilter; + + this.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding ); + + this.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : true; + + this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true; + this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true; + this.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null; + + } + + WebGLRenderTarget.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: WebGLRenderTarget, + + isWebGLRenderTarget: true, + + setSize: function ( width, height ) { + + if ( this.width !== width || this.height !== height ) { + + this.width = width; + this.height = height; + + this.dispose(); + + } + + this.viewport.set( 0, 0, width, height ); + this.scissor.set( 0, 0, width, height ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.width = source.width; + this.height = source.height; + + this.viewport.copy( source.viewport ); + + this.texture = source.texture.clone(); + + this.depthBuffer = source.depthBuffer; + this.stencilBuffer = source.stencilBuffer; + this.depthTexture = source.depthTexture; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com + */ + + function WebGLRenderTargetCube( width, height, options ) { + + WebGLRenderTarget.call( this, width, height, options ); + + this.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5 + this.activeMipMapLevel = 0; + + } + + WebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype ); + WebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube; + + WebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.image = { data: data, width: width, height: height }; + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter; + + this.generateMipmaps = false; + this.flipY = false; + this.unpackAlignment = 1; + + } + + DataTexture.prototype = Object.create( Texture.prototype ); + DataTexture.prototype.constructor = DataTexture; + + DataTexture.prototype.isDataTexture = true; + + /** + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + + function Box3( min, max ) { + + this.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity ); + this.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity ); + + } + + Object.assign( Box3.prototype, { + + isBox3: true, + + set: function ( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + }, + + setFromArray: function ( array ) { + + var minX = + Infinity; + var minY = + Infinity; + var minZ = + Infinity; + + var maxX = - Infinity; + var maxY = - Infinity; + var maxZ = - Infinity; + + for ( var i = 0, l = array.length; i < l; i += 3 ) { + + var x = array[ i ]; + var y = array[ i + 1 ]; + var z = array[ i + 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; + + } + + this.min.set( minX, minY, minZ ); + this.max.set( maxX, maxY, maxZ ); + + return this; + + }, + + setFromBufferAttribute: function ( attribute ) { + + var minX = + Infinity; + var minY = + Infinity; + var minZ = + Infinity; + + var maxX = - Infinity; + var maxY = - Infinity; + var maxZ = - Infinity; + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + var x = attribute.getX( i ); + var y = attribute.getY( i ); + var z = attribute.getZ( i ); + + 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; + + }, + + setFromPoints: function ( points ) { + + this.makeEmpty(); + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + }, + + setFromCenterAndSize: function () { + + var v1 = new Vector3(); + + return function setFromCenterAndSize( center, size ) { + + var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); + + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + }; + + }(), + + setFromObject: function ( object ) { + + this.makeEmpty(); + + return this.expandByObject( object ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + }, + + makeEmpty: function () { + + this.min.x = this.min.y = this.min.z = + Infinity; + this.max.x = this.max.y = this.max.z = - Infinity; + + return this; + + }, + + isEmpty: function () { + + // 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 ); + + }, + + getCenter: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .getCenter() target is now required' ); + target = new Vector3(); + + } + + return this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + }, + + getSize: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .getSize() target is now required' ); + target = new Vector3(); + + } + + return this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min ); + + }, + + expandByPoint: function ( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + }, + + expandByVector: function ( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + }, + + expandByScalar: function ( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + }, + + expandByObject: function () { + + // Computes the world-axis-aligned bounding box of an object (including its children), + // accounting for both the object's, and children's, world transforms + + var scope, i, l; + + var v1 = new Vector3(); + + function traverse( node ) { + + var geometry = node.geometry; + + if ( geometry !== undefined ) { + + if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + + for ( i = 0, l = vertices.length; i < l; i ++ ) { + + v1.copy( vertices[ i ] ); + v1.applyMatrix4( node.matrixWorld ); + + scope.expandByPoint( v1 ); + + } + + } else if ( geometry.isBufferGeometry ) { + + var attribute = geometry.attributes.position; + + if ( attribute !== undefined ) { + + for ( i = 0, l = attribute.count; i < l; i ++ ) { + + v1.fromBufferAttribute( attribute, i ).applyMatrix4( node.matrixWorld ); + + scope.expandByPoint( v1 ); + + } + + } + + } + + } + + } + + return function expandByObject( object ) { + + scope = this; + + object.updateMatrixWorld( true ); + + object.traverse( traverse ); + + return this; + + }; + + }(), + + containsPoint: function ( 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; + + }, + + containsBox: function ( box ) { + + return this.min.x <= box.min.x && box.max.x <= this.max.x && + this.min.y <= box.min.y && box.max.y <= this.max.y && + this.min.z <= box.min.z && box.max.z <= this.max.z; + + }, + + getParameter: function ( point, target ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .getParameter() target is now required' ); + target = new Vector3(); + + } + + return target.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ), + ( point.z - this.min.z ) / ( this.max.z - this.min.z ) + ); + + }, + + intersectsBox: function ( box ) { + + // using 6 splitting planes to rule out intersections. + return box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y || + box.max.z < this.min.z || box.min.z > this.max.z ? false : true; + + }, + + intersectsSphere: ( function () { + + var closestPoint = new Vector3(); + + return function intersectsSphere( sphere ) { + + // Find the point on the AABB closest to the sphere center. + this.clampPoint( sphere.center, closestPoint ); + + // If that point is inside the sphere, the AABB and sphere intersect. + return closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius ); + + }; + + } )(), + + intersectsPlane: function ( plane ) { + + // We compute the minimum and maximum dot product values. If those values + // are on the same side (back or front) of the plane, then there is no intersection. + + var min, max; + + if ( plane.normal.x > 0 ) { + + min = plane.normal.x * this.min.x; + max = plane.normal.x * this.max.x; + + } else { + + min = plane.normal.x * this.max.x; + max = plane.normal.x * this.min.x; + + } + + if ( plane.normal.y > 0 ) { + + min += plane.normal.y * this.min.y; + max += plane.normal.y * this.max.y; + + } else { + + min += plane.normal.y * this.max.y; + max += plane.normal.y * this.min.y; + + } + + if ( plane.normal.z > 0 ) { + + min += plane.normal.z * this.min.z; + max += plane.normal.z * this.max.z; + + } else { + + min += plane.normal.z * this.max.z; + max += plane.normal.z * this.min.z; + + } + + return ( min <= - plane.constant && max >= - plane.constant ); + + }, + + intersectsTriangle: ( function () { + + // triangle centered vertices + var v0 = new Vector3(); + var v1 = new Vector3(); + var v2 = new Vector3(); + + // triangle edge vectors + var f0 = new Vector3(); + var f1 = new Vector3(); + var f2 = new Vector3(); + + var testAxis = new Vector3(); + + var center = new Vector3(); + var extents = new Vector3(); + + var triangleNormal = new Vector3(); + + function satForAxes( axes ) { + + var i, j; + + for ( i = 0, j = axes.length - 3; i <= j; i += 3 ) { + + testAxis.fromArray( axes, i ); + // project the aabb onto the seperating axis + var 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 seperating axis + var p0 = v0.dot( testAxis ); + var p1 = v1.dot( testAxis ); + var 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 seperating and we can exit + return false; + + } + + } + + return true; + + } + + return function 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) + var 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 ) ) { + + return false; + + } + + // test 3 face normals from the aabb + axes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ]; + if ( ! satForAxes( axes ) ) { + + 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 ); + + }; + + } )(), + + clampPoint: function ( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .clampPoint() target is now required' ); + target = new Vector3(); + + } + + return target.copy( point ).clamp( this.min, this.max ); + + }, + + distanceToPoint: function () { + + var v1 = new Vector3(); + + return function distanceToPoint( point ) { + + var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + }; + + }(), + + getBoundingSphere: function () { + + var v1 = new Vector3(); + + return function getBoundingSphere( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .getBoundingSphere() target is now required' ); + target = new Sphere(); + + } + + this.getCenter( target.center ); + + target.radius = this.getSize( v1 ).length() * 0.5; + + return target; + + }; + + }(), + + intersect: function ( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + // ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values. + if ( this.isEmpty() ) this.makeEmpty(); + + return this; + + }, + + union: function ( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + }, + + applyMatrix4: function () { + + var points = [ + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3() + ]; + + return function 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; + + }; + + }(), + + translate: function ( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + }, + + equals: function ( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + + } ); + + /** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + + function Sphere( center, radius ) { + + this.center = ( center !== undefined ) ? center : new Vector3(); + this.radius = ( radius !== undefined ) ? radius : 0; + + } + + Object.assign( Sphere.prototype, { + + set: function ( center, radius ) { + + this.center.copy( center ); + this.radius = radius; + + return this; + + }, + + setFromPoints: function () { + + var box = new Box3(); + + return function setFromPoints( points, optionalCenter ) { + + var center = this.center; + + if ( optionalCenter !== undefined ) { + + center.copy( optionalCenter ); + + } else { + + box.setFromPoints( points ).getCenter( center ); + + } + + var maxRadiusSq = 0; + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) ); + + } + + this.radius = Math.sqrt( maxRadiusSq ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( sphere ) { + + this.center.copy( sphere.center ); + this.radius = sphere.radius; + + return this; + + }, + + empty: function () { + + return ( this.radius <= 0 ); + + }, + + containsPoint: function ( point ) { + + return ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) ); + + }, + + distanceToPoint: function ( point ) { + + return ( point.distanceTo( this.center ) - this.radius ); + + }, + + intersectsSphere: function ( sphere ) { + + var radiusSum = this.radius + sphere.radius; + + return sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsSphere( this ); + + }, + + intersectsPlane: function ( plane ) { + + return Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius; + + }, + + clampPoint: function ( point, target ) { + + var deltaLengthSq = this.center.distanceToSquared( point ); + + if ( target === undefined ) { + + console.warn( 'THREE.Sphere: .clampPoint() target is now required' ); + target = new Vector3(); + + } + + target.copy( point ); + + if ( deltaLengthSq > ( this.radius * this.radius ) ) { + + target.sub( this.center ).normalize(); + target.multiplyScalar( this.radius ).add( this.center ); + + } + + return target; + + }, + + getBoundingBox: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Sphere: .getBoundingBox() target is now required' ); + target = new Box3(); + + } + + target.set( this.center, this.center ); + target.expandByScalar( this.radius ); + + return target; + + }, + + applyMatrix4: function ( matrix ) { + + this.center.applyMatrix4( matrix ); + this.radius = this.radius * matrix.getMaxScaleOnAxis(); + + return this; + + }, + + translate: function ( offset ) { + + this.center.add( offset ); + + return this; + + }, + + equals: function ( sphere ) { + + return sphere.center.equals( this.center ) && ( sphere.radius === this.radius ); + + } + + } ); + + /** + * @author bhouston / http://clara.io + */ + + function Plane( normal, constant ) { + + // normal is assumed to be normalized + + this.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 ); + this.constant = ( constant !== undefined ) ? constant : 0; + + } + + Object.assign( Plane.prototype, { + + set: function ( normal, constant ) { + + this.normal.copy( normal ); + this.constant = constant; + + return this; + + }, + + setComponents: function ( x, y, z, w ) { + + this.normal.set( x, y, z ); + this.constant = w; + + return this; + + }, + + setFromNormalAndCoplanarPoint: function ( normal, point ) { + + this.normal.copy( normal ); + this.constant = - point.dot( this.normal ); + + return this; + + }, + + setFromCoplanarPoints: function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function setFromCoplanarPoints( a, b, c ) { + + var normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize(); + + // Q: should an error be thrown if normal is zero (e.g. degenerate plane)? + + this.setFromNormalAndCoplanarPoint( normal, a ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( plane ) { + + this.normal.copy( plane.normal ); + this.constant = plane.constant; + + return this; + + }, + + normalize: function () { + + // Note: will lead to a divide by zero if the plane is invalid. + + var inverseNormalLength = 1.0 / this.normal.length(); + this.normal.multiplyScalar( inverseNormalLength ); + this.constant *= inverseNormalLength; + + return this; + + }, + + negate: function () { + + this.constant *= - 1; + this.normal.negate(); + + return this; + + }, + + distanceToPoint: function ( point ) { + + return this.normal.dot( point ) + this.constant; + + }, + + distanceToSphere: function ( sphere ) { + + return this.distanceToPoint( sphere.center ) - sphere.radius; + + }, + + projectPoint: function ( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Plane: .projectPoint() target is now required' ); + target = new Vector3(); + + } + + return target.copy( this.normal ).multiplyScalar( - this.distanceToPoint( point ) ).add( point ); + + }, + + intersectLine: function () { + + var v1 = new Vector3(); + + return function intersectLine( line, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Plane: .intersectLine() target is now required' ); + target = new Vector3(); + + } + + var direction = line.delta( v1 ); + + var denominator = this.normal.dot( direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( this.distanceToPoint( line.start ) === 0 ) { + + return target.copy( line.start ); + + } + + // Unsure if this is the correct method to handle this case. + return undefined; + + } + + var t = - ( line.start.dot( this.normal ) + this.constant ) / denominator; + + if ( t < 0 || t > 1 ) { + + return undefined; + + } + + return target.copy( direction ).multiplyScalar( t ).add( line.start ); + + }; + + }(), + + intersectsLine: function ( line ) { + + // Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it. + + var startSign = this.distanceToPoint( line.start ); + var endSign = this.distanceToPoint( line.end ); + + return ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsPlane( this ); + + }, + + intersectsSphere: function ( sphere ) { + + return sphere.intersectsPlane( this ); + + }, + + coplanarPoint: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Plane: .coplanarPoint() target is now required' ); + target = new Vector3(); + + } + + return target.copy( this.normal ).multiplyScalar( - this.constant ); + + }, + + applyMatrix4: function () { + + var v1 = new Vector3(); + var m1 = new Matrix3(); + + return function applyMatrix4( matrix, optionalNormalMatrix ) { + + var normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix ); + + var referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix ); + + var normal = this.normal.applyMatrix3( normalMatrix ).normalize(); + + this.constant = - referencePoint.dot( normal ); + + return this; + + }; + + }(), + + translate: function ( offset ) { + + this.constant -= offset.dot( this.normal ); + + return this; + + }, + + equals: function ( plane ) { + + return plane.normal.equals( this.normal ) && ( plane.constant === this.constant ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author bhouston / http://clara.io + */ + + function Frustum( p0, p1, p2, p3, p4, p5 ) { + + this.planes = [ + + ( p0 !== undefined ) ? p0 : new Plane(), + ( p1 !== undefined ) ? p1 : new Plane(), + ( p2 !== undefined ) ? p2 : new Plane(), + ( p3 !== undefined ) ? p3 : new Plane(), + ( p4 !== undefined ) ? p4 : new Plane(), + ( p5 !== undefined ) ? p5 : new Plane() + + ]; + + } + + Object.assign( Frustum.prototype, { + + set: function ( p0, p1, p2, p3, p4, p5 ) { + + var 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; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( frustum ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + planes[ i ].copy( frustum.planes[ i ] ); + + } + + return this; + + }, + + setFromMatrix: function ( m ) { + + var planes = this.planes; + var me = m.elements; + var me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ]; + var me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ]; + var me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ]; + var 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; + + }, + + intersectsObject: function () { + + var sphere = new Sphere(); + + return function intersectsObject( object ) { + + var geometry = object.geometry; + + if ( geometry.boundingSphere === null ) + geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ) + .applyMatrix4( object.matrixWorld ); + + return this.intersectsSphere( sphere ); + + }; + + }(), + + intersectsSprite: function () { + + var sphere = new Sphere(); + + return function intersectsSprite( sprite ) { + + sphere.center.set( 0, 0, 0 ); + sphere.radius = 0.7071067811865476; + sphere.applyMatrix4( sprite.matrixWorld ); + + return this.intersectsSphere( sphere ); + + }; + + }(), + + intersectsSphere: function ( sphere ) { + + var planes = this.planes; + var center = sphere.center; + var negRadius = - sphere.radius; + + for ( var i = 0; i < 6; i ++ ) { + + var distance = planes[ i ].distanceToPoint( center ); + + if ( distance < negRadius ) { + + return false; + + } + + } + + return true; + + }, + + intersectsBox: function () { + + var p = new Vector3(); + + return function intersectsBox( box ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + var plane = planes[ i ]; + + // corner at max distance + + p.x = plane.normal.x > 0 ? box.max.x : box.min.x; + p.y = plane.normal.y > 0 ? box.max.y : box.min.y; + p.z = plane.normal.z > 0 ? box.max.z : box.min.z; + + if ( plane.distanceToPoint( p ) < 0 ) { + + return false; + + } + + } + + return true; + + }; + + }(), + + containsPoint: function ( point ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + if ( planes[ i ].distanceToPoint( point ) < 0 ) { + + return false; + + } + + } + + return true; + + } + + } ); + + var alphamap_fragment = "#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n"; + + var alphamap_pars_fragment = "#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n"; + + var alphatest_fragment = "#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n"; + + var aomap_fragment = "#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif\n"; + + var aomap_pars_fragment = "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif"; + + var begin_vertex = "\nvec3 transformed = vec3( position );\n"; + + var beginnormal_vertex = "\nvec3 objectNormal = vec3( normal );\n"; + + var bsdfs = "float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n#else\n\tif( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t}\n\treturn 1.0;\n#endif\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn 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 G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\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}\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;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\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 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\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\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\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}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n"; + + var bumpmap_pars_fragment = "#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + 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\n"; + + var clipping_planes_fragment = "#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t#endif\n#endif\n"; + + var clipping_planes_pars_fragment = "#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG ) && ! defined( MATCAP )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n"; + + var clipping_planes_pars_vertex = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG ) && ! defined( MATCAP )\n\tvarying vec3 vViewPosition;\n#endif\n"; + + var clipping_planes_vertex = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG ) && ! defined( MATCAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n"; + + var color_fragment = "#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif"; + + var color_pars_fragment = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n"; + + var color_pars_vertex = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif"; + + var color_vertex = "#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif"; + + var common = "#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\n"; + + var cube_uv_reflection_fragment = "#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale = bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV( sampler2D envMap, vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n"; + + var defaultnormal_vertex = "vec3 transformedNormal = normalMatrix * objectNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n"; + + var displacementmap_pars_vertex = "#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n"; + + var displacementmap_vertex = "#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n"; + + var emissivemap_fragment = "#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n"; + + var emissivemap_pars_fragment = "#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n"; + + var encodings_fragment = " gl_FragColor = linearToOutputTexel( gl_FragColor );\n"; + + var encodings_pars_fragment = "\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a );\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.a );\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.a );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * value.a * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = min( floor( D ) / 255.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n\tXp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) );\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract( Le );\n\tvResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 );\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n\treturn vec4( max( vRGB, 0.0 ), 1.0 );\n}\n"; + + var envmap_fragment = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\treflectVec = normalize( reflectVec );\n\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\treflectVec = normalize( reflectVec );\n\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n"; + + var envmap_pars_fragment = "#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntensity;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n"; + + var envmap_pars_vertex = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n"; + + var envmap_vertex = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif\n"; + + var fog_vertex = "#ifdef USE_FOG\n\tfogDepth = -mvPosition.z;\n#endif\n"; + + var fog_pars_vertex = "#ifdef USE_FOG\n\tvarying float fogDepth;\n#endif\n"; + + var fog_fragment = "#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n"; + + var fog_pars_fragment = "#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif\n"; + + var gradientmap_pars_fragment = "#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif\n"; + + var lightmap_fragment = "#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n"; + + var lightmap_pars_fragment = "#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif"; + + var lights_lambert_vertex = "vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n"; + + var lights_pars_begin = "uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t\tfloat shadowCameraNear;\n\t\tfloat shadowCameraFar;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n"; + + var envmap_physical_pars_fragment = "#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent ));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n"; + + var lights_phong_fragment = "BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n"; + + var lights_phong_pars_fragment = "varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n"; + + var lights_physical_fragment = "PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n"; + + var lights_physical_pars_fragment = "struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat 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"; + + var lights_fragment_begin = "\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearCoatRadiance = vec3( 0.0 );\n#endif\n"; + + var lights_fragment_maps = "#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), maxMipLevel );\n\t#ifndef STANDARD\n\t\tclearCoatRadiance += getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), maxMipLevel );\n\t#endif\n#endif\n"; + + var lights_fragment_end = "#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n"; + + var logdepthbuf_fragment = "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif"; + + var logdepthbuf_pars_fragment = "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n#endif\n"; + + var logdepthbuf_pars_vertex = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif\n"; + + var logdepthbuf_vertex = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\tgl_Position.z *= gl_Position.w;\n\t#endif\n#endif\n"; + + var map_fragment = "#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n"; + + var map_pars_fragment = "#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n"; + + var map_particle_fragment = "#ifdef USE_MAP\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n"; + + var map_particle_pars_fragment = "#ifdef USE_MAP\n\tuniform mat3 uvTransform;\n\tuniform sampler2D map;\n#endif\n"; + + var metalnessmap_fragment = "float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif\n"; + + var metalnessmap_pars_fragment = "#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif"; + + var morphnormal_vertex = "#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n"; + + var morphtarget_pars_vertex = "#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_vertex = "#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n"; + + var normal_fragment_begin = "#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n#endif\n"; + + var normal_fragment_maps = "#ifdef USE_NORMALMAP\n\t#ifdef OBJECTSPACE_NORMALMAP\n\t\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\t#ifdef FLIP_SIDED\n\t\t\tnormal = - normal;\n\t\t#endif\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t#endif\n\t\tnormal = normalize( normalMatrix * normal );\n\t#else\n\t\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n"; + + var normalmap_pars_fragment = "#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\t#ifdef OBJECTSPACE_NORMALMAP\n\t\tuniform mat3 normalMatrix;\n\t#else\n\t\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\t\tvec2 st0 = dFdx( vUv.st );\n\t\t\tvec2 st1 = dFdy( vUv.st );\n\t\t\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\n\t\t\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\n\t\t\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\n\t\t\tvec3 N = normalize( surf_norm );\n\t\t\tmat3 tsn = mat3( S, T, N );\n\t\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\t\tmapN.xy *= normalScale;\n\t\t\tmapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t\treturn normalize( tsn * mapN );\n\t\t}\n\t#endif\n#endif\n"; + + var packing = "vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst 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\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n"; + + var premultiplied_alpha_fragment = "#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n"; + + var project_vertex = "vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\ngl_Position = projectionMatrix * mvPosition;\n"; + + var dithering_fragment = "#if defined( DITHERING )\n gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n"; + + var dithering_pars_fragment = "#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\n"; + + var roughnessmap_fragment = "float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif\n"; + + var roughnessmap_pars_fragment = "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif"; + + var shadowmap_pars_fragment = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n"; + + var shadowmap_pars_vertex = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n"; + + var shadowmap_vertex = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n"; + + var shadowmask_pars_fragment = "float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n"; + + var skinbase_vertex = "#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif"; + + var skinning_pars_vertex = "#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif\n"; + + var skinning_vertex = "#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 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\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif\n"; + + var skinnormal_vertex = "#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n"; + + var specularmap_fragment = "float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif"; + + var specularmap_pars_fragment = "#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif"; + + var tonemapping_fragment = "#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n"; + + var tonemapping_pars_fragment = "#ifndef saturate\n\t#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n"; + + var uv_pars_fragment = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif"; + + var uv_pars_vertex = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\n"; + + var uv_vertex = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif"; + + var uv2_pars_fragment = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif"; + + var uv2_pars_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif"; + + var uv2_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif"; + + var worldpos_vertex = "#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif\n"; + + var background_frag = "uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tgl_FragColor = texture2D( t2D, vUv );\n}\n"; + + var background_vert = "varying vec2 vUv;\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4( position, 1.0 );\n\tgl_Position.z = 1.0;\n}\n"; + + var cube_frag = "uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n"; + + var cube_vert = "varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}\n"; + + var depth_frag = "#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n"; + + var depth_vert = "#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var distanceRGBA_frag = "#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}\n"; + + var distanceRGBA_vert = "#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}\n"; + + var equirect_frag = "uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV;\n\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n"; + + var equirect_vert = "varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n"; + + var linedashed_frag = "uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var linedashed_vert = "uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}\n"; + + var meshbasic_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\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\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshbasic_vert = "#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshlambert_frag = "uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\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 \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include \n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshlambert_vert = "#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\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\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshmatcap_frag = "#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\tvec4 matcapColor = texture2D( matcap, uv );\n\tmatcapColor = matcapTexelToLinear( matcapColor );\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshmatcap_vert = "#define MATCAP\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifndef FLAT_SHADED\n\t\tvNormal = normalize( transformedNormal );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}\n"; + + var meshphong_frag = "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\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 \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshphong_vert = "#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\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\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshphysical_frag = "#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\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 \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshphysical_vert = "#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\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\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}\n"; + + var normal_frag = "#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n"; + + var normal_vert = "#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n"; + + var points_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var points_vert = "uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var shadow_frag = "uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n}\n"; + + var shadow_vert = "#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var sprite_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n}\n"; + + var sprite_vert = "uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}\n"; + + var ShaderChunk = { + alphamap_fragment: alphamap_fragment, + alphamap_pars_fragment: alphamap_pars_fragment, + alphatest_fragment: alphatest_fragment, + aomap_fragment: aomap_fragment, + aomap_pars_fragment: aomap_pars_fragment, + begin_vertex: begin_vertex, + beginnormal_vertex: beginnormal_vertex, + bsdfs: bsdfs, + bumpmap_pars_fragment: bumpmap_pars_fragment, + clipping_planes_fragment: clipping_planes_fragment, + clipping_planes_pars_fragment: clipping_planes_pars_fragment, + clipping_planes_pars_vertex: clipping_planes_pars_vertex, + clipping_planes_vertex: clipping_planes_vertex, + color_fragment: color_fragment, + color_pars_fragment: color_pars_fragment, + color_pars_vertex: color_pars_vertex, + color_vertex: color_vertex, + common: common, + cube_uv_reflection_fragment: cube_uv_reflection_fragment, + defaultnormal_vertex: defaultnormal_vertex, + displacementmap_pars_vertex: displacementmap_pars_vertex, + displacementmap_vertex: displacementmap_vertex, + emissivemap_fragment: emissivemap_fragment, + emissivemap_pars_fragment: emissivemap_pars_fragment, + encodings_fragment: encodings_fragment, + encodings_pars_fragment: encodings_pars_fragment, + envmap_fragment: envmap_fragment, + envmap_pars_fragment: envmap_pars_fragment, + envmap_pars_vertex: envmap_pars_vertex, + envmap_physical_pars_fragment: envmap_physical_pars_fragment, + envmap_vertex: envmap_vertex, + fog_vertex: fog_vertex, + fog_pars_vertex: fog_pars_vertex, + fog_fragment: fog_fragment, + fog_pars_fragment: fog_pars_fragment, + gradientmap_pars_fragment: gradientmap_pars_fragment, + lightmap_fragment: lightmap_fragment, + lightmap_pars_fragment: lightmap_pars_fragment, + lights_lambert_vertex: lights_lambert_vertex, + lights_pars_begin: lights_pars_begin, + lights_phong_fragment: lights_phong_fragment, + lights_phong_pars_fragment: lights_phong_pars_fragment, + lights_physical_fragment: lights_physical_fragment, + lights_physical_pars_fragment: lights_physical_pars_fragment, + lights_fragment_begin: lights_fragment_begin, + lights_fragment_maps: lights_fragment_maps, + lights_fragment_end: lights_fragment_end, + logdepthbuf_fragment: logdepthbuf_fragment, + logdepthbuf_pars_fragment: logdepthbuf_pars_fragment, + logdepthbuf_pars_vertex: logdepthbuf_pars_vertex, + logdepthbuf_vertex: logdepthbuf_vertex, + map_fragment: map_fragment, + map_pars_fragment: map_pars_fragment, + map_particle_fragment: map_particle_fragment, + map_particle_pars_fragment: map_particle_pars_fragment, + metalnessmap_fragment: metalnessmap_fragment, + metalnessmap_pars_fragment: metalnessmap_pars_fragment, + morphnormal_vertex: morphnormal_vertex, + morphtarget_pars_vertex: morphtarget_pars_vertex, + morphtarget_vertex: morphtarget_vertex, + normal_fragment_begin: normal_fragment_begin, + normal_fragment_maps: normal_fragment_maps, + normalmap_pars_fragment: normalmap_pars_fragment, + packing: packing, + premultiplied_alpha_fragment: premultiplied_alpha_fragment, + project_vertex: project_vertex, + dithering_fragment: dithering_fragment, + dithering_pars_fragment: dithering_pars_fragment, + roughnessmap_fragment: roughnessmap_fragment, + roughnessmap_pars_fragment: roughnessmap_pars_fragment, + shadowmap_pars_fragment: shadowmap_pars_fragment, + shadowmap_pars_vertex: shadowmap_pars_vertex, + shadowmap_vertex: shadowmap_vertex, + shadowmask_pars_fragment: shadowmask_pars_fragment, + skinbase_vertex: skinbase_vertex, + skinning_pars_vertex: skinning_pars_vertex, + skinning_vertex: skinning_vertex, + skinnormal_vertex: skinnormal_vertex, + specularmap_fragment: specularmap_fragment, + specularmap_pars_fragment: specularmap_pars_fragment, + tonemapping_fragment: tonemapping_fragment, + tonemapping_pars_fragment: tonemapping_pars_fragment, + uv_pars_fragment: uv_pars_fragment, + uv_pars_vertex: uv_pars_vertex, + uv_vertex: uv_vertex, + uv2_pars_fragment: uv2_pars_fragment, + uv2_pars_vertex: uv2_pars_vertex, + uv2_vertex: uv2_vertex, + worldpos_vertex: worldpos_vertex, + + background_frag: background_frag, + background_vert: background_vert, + cube_frag: cube_frag, + cube_vert: cube_vert, + depth_frag: depth_frag, + depth_vert: depth_vert, + distanceRGBA_frag: distanceRGBA_frag, + distanceRGBA_vert: distanceRGBA_vert, + equirect_frag: equirect_frag, + equirect_vert: equirect_vert, + linedashed_frag: linedashed_frag, + linedashed_vert: linedashed_vert, + meshbasic_frag: meshbasic_frag, + meshbasic_vert: meshbasic_vert, + meshlambert_frag: meshlambert_frag, + meshlambert_vert: meshlambert_vert, + meshmatcap_frag: meshmatcap_frag, + meshmatcap_vert: meshmatcap_vert, + meshphong_frag: meshphong_frag, + meshphong_vert: meshphong_vert, + meshphysical_frag: meshphysical_frag, + meshphysical_vert: meshphysical_vert, + normal_frag: normal_frag, + normal_vert: normal_vert, + points_frag: points_frag, + points_vert: points_vert, + shadow_frag: shadow_frag, + shadow_vert: shadow_vert, + sprite_frag: sprite_frag, + sprite_vert: sprite_vert + }; + + /** + * Uniform Utilities + */ + + var UniformsUtils = { + + merge: function ( uniforms ) { + + var merged = {}; + + for ( var u = 0; u < uniforms.length; u ++ ) { + + var tmp = this.clone( uniforms[ u ] ); + + for ( var p in tmp ) { + + merged[ p ] = tmp[ p ]; + + } + + } + + return merged; + + }, + + clone: function ( uniforms_src ) { + + var uniforms_dst = {}; + + for ( var u in uniforms_src ) { + + uniforms_dst[ u ] = {}; + + for ( var p in uniforms_src[ u ] ) { + + var parameter_src = uniforms_src[ u ][ p ]; + + if ( parameter_src && ( parameter_src.isColor || + parameter_src.isMatrix3 || parameter_src.isMatrix4 || + parameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 || + parameter_src.isTexture ) ) { + + uniforms_dst[ u ][ p ] = parameter_src.clone(); + + } else if ( Array.isArray( parameter_src ) ) { + + uniforms_dst[ u ][ p ] = parameter_src.slice(); + + } else { + + uniforms_dst[ u ][ p ] = parameter_src; + + } + + } + + } + + return uniforms_dst; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF, + 'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2, + 'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50, + 'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B, + 'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B, + 'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F, + 'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3, + 'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222, + 'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700, + 'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4, + 'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00, + 'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3, + 'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA, + 'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32, + 'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3, + 'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC, + 'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD, + 'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6, + 'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9, + 'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F, + 'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE, + 'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA, + 'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0, + 'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 }; + + function Color( r, g, b ) { + + if ( g === undefined && b === undefined ) { + + // r is THREE.Color, hex or string + return this.set( r ); + + } + + return this.setRGB( r, g, b ); + + } + + Object.assign( Color.prototype, { + + isColor: true, + + r: 1, g: 1, b: 1, + + set: function ( value ) { + + if ( value && value.isColor ) { + + this.copy( value ); + + } else if ( typeof value === 'number' ) { + + this.setHex( value ); + + } else if ( typeof value === 'string' ) { + + this.setStyle( value ); + + } + + return this; + + }, + + setScalar: function ( scalar ) { + + this.r = scalar; + this.g = scalar; + this.b = scalar; + + return this; + + }, + + setHex: function ( hex ) { + + hex = Math.floor( hex ); + + this.r = ( hex >> 16 & 255 ) / 255; + this.g = ( hex >> 8 & 255 ) / 255; + this.b = ( hex & 255 ) / 255; + + return this; + + }, + + setRGB: function ( r, g, b ) { + + this.r = r; + this.g = g; + this.b = b; + + return this; + + }, + + setHSL: function () { + + 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; + + } + + return function setHSL( h, s, l ) { + + // h,s,l ranges are in 0.0 - 1.0 + h = _Math.euclideanModulo( h, 1 ); + s = _Math.clamp( s, 0, 1 ); + l = _Math.clamp( l, 0, 1 ); + + if ( s === 0 ) { + + this.r = this.g = this.b = l; + + } else { + + var p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s ); + var 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; + + }; + + }(), + + setStyle: function ( style ) { + + function handleAlpha( string ) { + + if ( string === undefined ) return; + + if ( parseFloat( string ) < 1 ) { + + console.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' ); + + } + + } + + + var m; + + if ( m = /^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec( style ) ) { + + // rgb / hsl + + var color; + var name = m[ 1 ]; + var components = m[ 2 ]; + + switch ( name ) { + + case 'rgb': + case 'rgba': + + if ( color = /^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // rgb(255,0,0) rgba(255,0,0,0.5) + this.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255; + this.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255; + this.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255; + + handleAlpha( color[ 5 ] ); + + return this; + + } + + if ( color = /^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // rgb(100%,0%,0%) rgba(100%,0%,0%,0.5) + this.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100; + this.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100; + this.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100; + + handleAlpha( color[ 5 ] ); + + return this; + + } + + break; + + case 'hsl': + case 'hsla': + + if ( color = /^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // hsl(120,50%,50%) hsla(120,50%,50%,0.5) + var h = parseFloat( color[ 1 ] ) / 360; + var s = parseInt( color[ 2 ], 10 ) / 100; + var l = parseInt( color[ 3 ], 10 ) / 100; + + handleAlpha( color[ 5 ] ); + + return this.setHSL( h, s, l ); + + } + + break; + + } + + } else if ( m = /^\#([A-Fa-f0-9]+)$/.exec( style ) ) { + + // hex color + + var hex = m[ 1 ]; + var size = hex.length; + + if ( size === 3 ) { + + // #ff0 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255; + + return this; + + } else if ( size === 6 ) { + + // #ff0000 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255; + + return this; + + } + + } + + if ( style && style.length > 0 ) { + + // color keywords + var hex = ColorKeywords[ style ]; + + if ( hex !== undefined ) { + + // red + this.setHex( hex ); + + } else { + + // unknown color + console.warn( 'THREE.Color: Unknown color ' + style ); + + } + + } + + return this; + + }, + + clone: function () { + + return new this.constructor( this.r, this.g, this.b ); + + }, + + copy: function ( color ) { + + this.r = color.r; + this.g = color.g; + this.b = color.b; + + return this; + + }, + + copyGammaToLinear: function ( color, gammaFactor ) { + + if ( gammaFactor === undefined ) gammaFactor = 2.0; + + this.r = Math.pow( color.r, gammaFactor ); + this.g = Math.pow( color.g, gammaFactor ); + this.b = Math.pow( color.b, gammaFactor ); + + return this; + + }, + + copyLinearToGamma: function ( color, gammaFactor ) { + + if ( gammaFactor === undefined ) gammaFactor = 2.0; + + var safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0; + + this.r = Math.pow( color.r, safeInverse ); + this.g = Math.pow( color.g, safeInverse ); + this.b = Math.pow( color.b, safeInverse ); + + return this; + + }, + + convertGammaToLinear: function ( gammaFactor ) { + + this.copyGammaToLinear( this, gammaFactor ); + + return this; + + }, + + convertLinearToGamma: function ( gammaFactor ) { + + this.copyLinearToGamma( this, gammaFactor ); + + return this; + + }, + + copySRGBToLinear: function () { + + function SRGBToLinear( c ) { + + return ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 ); + + } + + return function copySRGBToLinear( color ) { + + this.r = SRGBToLinear( color.r ); + this.g = SRGBToLinear( color.g ); + this.b = SRGBToLinear( color.b ); + + return this; + + }; + + }(), + + copyLinearToSRGB: function () { + + function LinearToSRGB( c ) { + + return ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055; + + } + + return function copyLinearToSRGB( color ) { + + this.r = LinearToSRGB( color.r ); + this.g = LinearToSRGB( color.g ); + this.b = LinearToSRGB( color.b ); + + return this; + + }; + + }(), + + convertSRGBToLinear: function () { + + this.copySRGBToLinear( this ); + + return this; + + }, + + convertLinearToSRGB: function () { + + this.copyLinearToSRGB( this ); + + return this; + + }, + + getHex: function () { + + return ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0; + + }, + + getHexString: function () { + + return ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 ); + + }, + + getHSL: function ( target ) { + + // h,s,l ranges are in 0.0 - 1.0 + + if ( target === undefined ) { + + console.warn( 'THREE.Color: .getHSL() target is now required' ); + target = { h: 0, s: 0, l: 0 }; + + } + + var r = this.r, g = this.g, b = this.b; + + var max = Math.max( r, g, b ); + var min = Math.min( r, g, b ); + + var hue, saturation; + var lightness = ( min + max ) / 2.0; + + if ( min === max ) { + + hue = 0; + saturation = 0; + + } else { + + var delta = max - min; + + saturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min ); + + switch ( max ) { + + case r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break; + case g: hue = ( b - r ) / delta + 2; break; + case b: hue = ( r - g ) / delta + 4; break; + + } + + hue /= 6; + + } + + target.h = hue; + target.s = saturation; + target.l = lightness; + + return target; + + }, + + getStyle: function () { + + return 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')'; + + }, + + offsetHSL: function () { + + var hsl = {}; + + return function ( h, s, l ) { + + this.getHSL( hsl ); + + hsl.h += h; hsl.s += s; hsl.l += l; + + this.setHSL( hsl.h, hsl.s, hsl.l ); + + return this; + + }; + + }(), + + add: function ( color ) { + + this.r += color.r; + this.g += color.g; + this.b += color.b; + + return this; + + }, + + addColors: function ( color1, color2 ) { + + this.r = color1.r + color2.r; + this.g = color1.g + color2.g; + this.b = color1.b + color2.b; + + return this; + + }, + + addScalar: function ( s ) { + + this.r += s; + this.g += s; + this.b += s; + + return this; + + }, + + sub: function ( color ) { + + this.r = Math.max( 0, this.r - color.r ); + this.g = Math.max( 0, this.g - color.g ); + this.b = Math.max( 0, this.b - color.b ); + + return this; + + }, + + multiply: function ( color ) { + + this.r *= color.r; + this.g *= color.g; + this.b *= color.b; + + return this; + + }, + + multiplyScalar: function ( s ) { + + this.r *= s; + this.g *= s; + this.b *= s; + + return this; + + }, + + lerp: function ( color, alpha ) { + + this.r += ( color.r - this.r ) * alpha; + this.g += ( color.g - this.g ) * alpha; + this.b += ( color.b - this.b ) * alpha; + + return this; + + }, + + lerpHSL: function () { + + var hslA = { h: 0, s: 0, l: 0 }; + var hslB = { h: 0, s: 0, l: 0 }; + + return function lerpHSL( color, alpha ) { + + this.getHSL( hslA ); + color.getHSL( hslB ); + + var h = _Math.lerp( hslA.h, hslB.h, alpha ); + var s = _Math.lerp( hslA.s, hslB.s, alpha ); + var l = _Math.lerp( hslA.l, hslB.l, alpha ); + + this.setHSL( h, s, l ); + + return this; + + }; + + }(), + + equals: function ( c ) { + + return ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.r = array[ offset ]; + this.g = array[ offset + 1 ]; + this.b = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.r; + array[ offset + 1 ] = this.g; + array[ offset + 2 ] = this.b; + + return array; + + }, + + toJSON: function () { + + return this.getHex(); + + } + + } ); + + /** + * Uniforms library for shared webgl shaders + */ + + var UniformsLib = { + + common: { + + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + + map: { value: null }, + uvTransform: { value: new Matrix3() }, + + alphaMap: { value: null }, + + }, + + specularmap: { + + specularMap: { value: null }, + + }, + + envmap: { + + envMap: { value: null }, + flipEnvMap: { value: - 1 }, + reflectivity: { value: 1.0 }, + refractionRatio: { value: 0.98 }, + maxMipLevel: { value: 0 } + + }, + + aomap: { + + aoMap: { value: null }, + aoMapIntensity: { value: 1 } + + }, + + lightmap: { + + lightMap: { value: null }, + lightMapIntensity: { value: 1 } + + }, + + emissivemap: { + + emissiveMap: { value: null } + + }, + + bumpmap: { + + bumpMap: { value: null }, + bumpScale: { value: 1 } + + }, + + normalmap: { + + normalMap: { value: null }, + normalScale: { value: new Vector2( 1, 1 ) } + + }, + + displacementmap: { + + displacementMap: { value: null }, + displacementScale: { value: 1 }, + displacementBias: { value: 0 } + + }, + + roughnessmap: { + + roughnessMap: { value: null } + + }, + + metalnessmap: { + + metalnessMap: { value: null } + + }, + + gradientmap: { + + gradientMap: { value: null } + + }, + + fog: { + + fogDensity: { value: 0.00025 }, + fogNear: { value: 1 }, + fogFar: { value: 2000 }, + fogColor: { value: new Color( 0xffffff ) } + + }, + + lights: { + + ambientLightColor: { value: [] }, + + directionalLights: { value: [], properties: { + direction: {}, + color: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + directionalShadowMap: { value: [] }, + directionalShadowMatrix: { value: [] }, + + spotLights: { value: [], properties: { + color: {}, + position: {}, + direction: {}, + distance: {}, + coneCos: {}, + penumbraCos: {}, + decay: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + spotShadowMap: { value: [] }, + spotShadowMatrix: { value: [] }, + + pointLights: { value: [], properties: { + color: {}, + position: {}, + decay: {}, + distance: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {}, + shadowCameraNear: {}, + shadowCameraFar: {} + } }, + + pointShadowMap: { value: [] }, + pointShadowMatrix: { value: [] }, + + hemisphereLights: { value: [], properties: { + direction: {}, + skyColor: {}, + groundColor: {} + } }, + + // TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src + rectAreaLights: { value: [], properties: { + color: {}, + position: {}, + width: {}, + height: {} + } } + + }, + + points: { + + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + size: { value: 1.0 }, + scale: { value: 1.0 }, + map: { value: null }, + uvTransform: { value: new Matrix3() } + + }, + + sprite: { + + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + center: { value: new Vector2( 0.5, 0.5 ) }, + rotation: { value: 0.0 }, + map: { value: null }, + uvTransform: { value: new Matrix3() } + + } + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + */ + + var ShaderLib = { + + basic: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.meshbasic_vert, + fragmentShader: ShaderChunk.meshbasic_frag + + }, + + lambert: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) } + } + ] ), + + vertexShader: ShaderChunk.meshlambert_vert, + fragmentShader: ShaderChunk.meshlambert_frag + + }, + + phong: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.gradientmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) }, + specular: { value: new Color( 0x111111 ) }, + shininess: { value: 30 } + } + ] ), + + vertexShader: ShaderChunk.meshphong_vert, + fragmentShader: ShaderChunk.meshphong_frag + + }, + + standard: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.roughnessmap, + UniformsLib.metalnessmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) }, + roughness: { value: 0.5 }, + metalness: { value: 0.5 }, + envMapIntensity: { value: 1 } // temporary + } + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + + }, + + matcap: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.fog, + { + matcap: { value: null } + } + ] ), + + vertexShader: ShaderChunk.meshmatcap_vert, + fragmentShader: ShaderChunk.meshmatcap_frag + + }, + + points: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.points, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.points_vert, + fragmentShader: ShaderChunk.points_frag + + }, + + dashed: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.fog, + { + scale: { value: 1 }, + dashSize: { value: 1 }, + totalSize: { value: 2 } + } + ] ), + + vertexShader: ShaderChunk.linedashed_vert, + fragmentShader: ShaderChunk.linedashed_frag + + }, + + depth: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.displacementmap + ] ), + + vertexShader: ShaderChunk.depth_vert, + fragmentShader: ShaderChunk.depth_frag + + }, + + normal: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + { + opacity: { value: 1.0 } + } + ] ), + + vertexShader: ShaderChunk.normal_vert, + fragmentShader: ShaderChunk.normal_frag + + }, + + sprite: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.sprite, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.sprite_vert, + fragmentShader: ShaderChunk.sprite_frag + + }, + + background: { + + uniforms: { + t2D: { value: null }, + }, + + vertexShader: ShaderChunk.background_vert, + fragmentShader: ShaderChunk.background_frag + + }, + /* ------------------------------------------------------------------------- + // Cube map shader + ------------------------------------------------------------------------- */ + + cube: { + + uniforms: { + tCube: { value: null }, + tFlip: { value: - 1 }, + opacity: { value: 1.0 } + }, + + vertexShader: ShaderChunk.cube_vert, + fragmentShader: ShaderChunk.cube_frag + + }, + + equirect: { + + uniforms: { + tEquirect: { value: null }, + }, + + vertexShader: ShaderChunk.equirect_vert, + fragmentShader: ShaderChunk.equirect_frag + + }, + + distanceRGBA: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.displacementmap, + { + referencePosition: { value: new Vector3() }, + nearDistance: { value: 1 }, + farDistance: { value: 1000 } + } + ] ), + + vertexShader: ShaderChunk.distanceRGBA_vert, + fragmentShader: ShaderChunk.distanceRGBA_frag + + }, + + shadow: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.lights, + UniformsLib.fog, + { + color: { value: new Color( 0x00000 ) }, + opacity: { value: 1.0 } + }, + ] ), + + vertexShader: ShaderChunk.shadow_vert, + fragmentShader: ShaderChunk.shadow_frag + + } + + }; + + ShaderLib.physical = { + + uniforms: UniformsUtils.merge( [ + ShaderLib.standard.uniforms, + { + clearCoat: { value: 0 }, + clearCoatRoughness: { value: 0 } + } + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLAnimation() { + + var context = null; + var isAnimating = false; + var animationLoop = null; + + function onAnimationFrame( time, frame ) { + + if ( isAnimating === false ) return; + + animationLoop( time, frame ); + + context.requestAnimationFrame( onAnimationFrame ); + + } + + return { + + start: function () { + + if ( isAnimating === true ) return; + if ( animationLoop === null ) return; + + context.requestAnimationFrame( onAnimationFrame ); + + isAnimating = true; + + }, + + stop: function () { + + isAnimating = false; + + }, + + setAnimationLoop: function ( callback ) { + + animationLoop = callback; + + }, + + setContext: function ( value ) { + + context = value; + + } + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLAttributes( gl ) { + + var buffers = new WeakMap(); + + function createBuffer( attribute, bufferType ) { + + var array = attribute.array; + var usage = attribute.dynamic ? 35048 : 35044; + + var buffer = gl.createBuffer(); + + gl.bindBuffer( bufferType, buffer ); + gl.bufferData( bufferType, array, usage ); + + attribute.onUploadCallback(); + + var type = 5126; + + if ( array instanceof Float32Array ) { + + type = 5126; + + } else if ( array instanceof Float64Array ) { + + console.warn( 'THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.' ); + + } else if ( array instanceof Uint16Array ) { + + type = 5123; + + } else if ( array instanceof Int16Array ) { + + type = 5122; + + } else if ( array instanceof Uint32Array ) { + + type = 5125; + + } else if ( array instanceof Int32Array ) { + + type = 5124; + + } else if ( array instanceof Int8Array ) { + + type = 5120; + + } else if ( array instanceof Uint8Array ) { + + type = 5121; + + } + + return { + buffer: buffer, + type: type, + bytesPerElement: array.BYTES_PER_ELEMENT, + version: attribute.version + }; + + } + + function updateBuffer( buffer, attribute, bufferType ) { + + var array = attribute.array; + var updateRange = attribute.updateRange; + + gl.bindBuffer( bufferType, buffer ); + + if ( attribute.dynamic === false ) { + + gl.bufferData( bufferType, array, 35044 ); + + } else if ( updateRange.count === - 1 ) { + + // Not using update ranges + + gl.bufferSubData( bufferType, 0, array ); + + } else if ( updateRange.count === 0 ) { + + console.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' ); + + } else { + + gl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT, + array.subarray( updateRange.offset, updateRange.offset + updateRange.count ) ); + + updateRange.count = - 1; // reset range + + } + + } + + // + + function get( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + return buffers.get( attribute ); + + } + + function remove( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + var data = buffers.get( attribute ); + + if ( data ) { + + gl.deleteBuffer( data.buffer ); + + buffers.delete( attribute ); + + } + + } + + function update( attribute, bufferType ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + var data = buffers.get( attribute ); + + if ( data === undefined ) { + + buffers.set( attribute, createBuffer( attribute, bufferType ) ); + + } else if ( data.version < attribute.version ) { + + updateBuffer( data.buffer, attribute, bufferType ); + + data.version = attribute.version; + + } + + } + + return { + + get: get, + remove: remove, + update: update + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Face3( a, b, c, normal, color, materialIndex ) { + + this.a = a; + this.b = b; + this.c = c; + + this.normal = ( normal && normal.isVector3 ) ? normal : new Vector3(); + this.vertexNormals = Array.isArray( normal ) ? normal : []; + + this.color = ( color && color.isColor ) ? color : new Color(); + this.vertexColors = Array.isArray( color ) ? color : []; + + this.materialIndex = materialIndex !== undefined ? materialIndex : 0; + + } + + Object.assign( Face3.prototype, { + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( 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; + + for ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) { + + this.vertexNormals[ i ] = source.vertexNormals[ i ].clone(); + + } + + for ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) { + + this.vertexColors[ i ] = source.vertexColors[ i ].clone(); + + } + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + + function Euler( x, y, z, order ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._order = order || Euler.DefaultOrder; + + } + + Euler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ]; + + Euler.DefaultOrder = 'XYZ'; + + Object.defineProperties( Euler.prototype, { + + x: { + + get: function () { + + return this._x; + + }, + + set: function ( value ) { + + this._x = value; + this.onChangeCallback(); + + } + + }, + + y: { + + get: function () { + + return this._y; + + }, + + set: function ( value ) { + + this._y = value; + this.onChangeCallback(); + + } + + }, + + z: { + + get: function () { + + return this._z; + + }, + + set: function ( value ) { + + this._z = value; + this.onChangeCallback(); + + } + + }, + + order: { + + get: function () { + + return this._order; + + }, + + set: function ( value ) { + + this._order = value; + this.onChangeCallback(); + + } + + } + + } ); + + Object.assign( Euler.prototype, { + + isEuler: true, + + set: function ( x, y, z, order ) { + + this._x = x; + this._y = y; + this._z = z; + this._order = order || this._order; + + this.onChangeCallback(); + + return this; + + }, + + clone: function () { + + return new this.constructor( this._x, this._y, this._z, this._order ); + + }, + + copy: function ( euler ) { + + this._x = euler._x; + this._y = euler._y; + this._z = euler._z; + this._order = euler._order; + + this.onChangeCallback(); + + return this; + + }, + + setFromRotationMatrix: function ( m, order, update ) { + + var clamp = _Math.clamp; + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements; + var m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ]; + var m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ]; + var m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + order = order || this._order; + + if ( order === 'XYZ' ) { + + this._y = Math.asin( 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( - 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( 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( - 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( 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( - 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( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order ); + + } + + this._order = order; + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromQuaternion: function () { + + var matrix = new Matrix4(); + + return function setFromQuaternion( q, order, update ) { + + matrix.makeRotationFromQuaternion( q ); + + return this.setFromRotationMatrix( matrix, order, update ); + + }; + + }(), + + setFromVector3: function ( v, order ) { + + return this.set( v.x, v.y, v.z, order || this._order ); + + }, + + reorder: function () { + + // WARNING: this discards revolution information -bhouston + + var q = new Quaternion(); + + return function reorder( newOrder ) { + + q.setFromEuler( this ); + + return this.setFromQuaternion( q, newOrder ); + + }; + + }(), + + equals: function ( euler ) { + + return ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order ); + + }, + + fromArray: function ( array ) { + + this._x = array[ 0 ]; + this._y = array[ 1 ]; + this._z = array[ 2 ]; + if ( array[ 3 ] !== undefined ) this._order = array[ 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._order; + + return array; + + }, + + toVector3: function ( optionalResult ) { + + if ( optionalResult ) { + + return optionalResult.set( this._x, this._y, this._z ); + + } else { + + return new Vector3( this._x, this._y, this._z ); + + } + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {} + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Layers() { + + this.mask = 1 | 0; + + } + + Object.assign( Layers.prototype, { + + set: function ( channel ) { + + this.mask = 1 << channel | 0; + + }, + + enable: function ( channel ) { + + this.mask |= 1 << channel | 0; + + }, + + toggle: function ( channel ) { + + this.mask ^= 1 << channel | 0; + + }, + + disable: function ( channel ) { + + this.mask &= ~ ( 1 << channel | 0 ); + + }, + + test: function ( layers ) { + + return ( this.mask & layers.mask ) !== 0; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author elephantatwork / www.elephantatwork.ch + */ + + var object3DId = 0; + + function Object3D() { + + Object.defineProperty( this, 'id', { value: object3DId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Object3D'; + + this.parent = null; + this.children = []; + + this.up = Object3D.DefaultUp.clone(); + + var position = new Vector3(); + var rotation = new Euler(); + var quaternion = new Quaternion(); + var scale = new Vector3( 1, 1, 1 ); + + function onRotationChange() { + + quaternion.setFromEuler( rotation, false ); + + } + + function onQuaternionChange() { + + rotation.setFromQuaternion( quaternion, undefined, false ); + + } + + rotation.onChange( onRotationChange ); + quaternion.onChange( onQuaternionChange ); + + Object.defineProperties( this, { + position: { + configurable: true, + enumerable: true, + value: position + }, + rotation: { + configurable: true, + enumerable: true, + value: rotation + }, + quaternion: { + configurable: true, + enumerable: true, + value: quaternion + }, + scale: { + configurable: true, + enumerable: true, + value: scale + }, + modelViewMatrix: { + value: new Matrix4() + }, + normalMatrix: { + value: new Matrix3() + } + } ); + + this.matrix = new Matrix4(); + this.matrixWorld = new Matrix4(); + + this.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate; + this.matrixWorldNeedsUpdate = false; + + this.layers = new Layers(); + this.visible = true; + + this.castShadow = false; + this.receiveShadow = false; + + this.frustumCulled = true; + this.renderOrder = 0; + + this.userData = {}; + + } + + Object3D.DefaultUp = new Vector3( 0, 1, 0 ); + Object3D.DefaultMatrixAutoUpdate = true; + + Object3D.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: Object3D, + + isObject3D: true, + + onBeforeRender: function () {}, + onAfterRender: function () {}, + + applyMatrix: function ( matrix ) { + + this.matrix.multiplyMatrices( matrix, this.matrix ); + + this.matrix.decompose( this.position, this.quaternion, this.scale ); + + }, + + applyQuaternion: function ( q ) { + + this.quaternion.premultiply( q ); + + return this; + + }, + + setRotationFromAxisAngle: function ( axis, angle ) { + + // assumes axis is normalized + + this.quaternion.setFromAxisAngle( axis, angle ); + + }, + + setRotationFromEuler: function ( euler ) { + + this.quaternion.setFromEuler( euler, true ); + + }, + + setRotationFromMatrix: function ( m ) { + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + this.quaternion.setFromRotationMatrix( m ); + + }, + + setRotationFromQuaternion: function ( q ) { + + // assumes q is normalized + + this.quaternion.copy( q ); + + }, + + rotateOnAxis: function () { + + // rotate object on axis in object space + // axis is assumed to be normalized + + var q1 = new Quaternion(); + + return function rotateOnAxis( axis, angle ) { + + q1.setFromAxisAngle( axis, angle ); + + this.quaternion.multiply( q1 ); + + return this; + + }; + + }(), + + rotateOnWorldAxis: function () { + + // rotate object on axis in world space + // axis is assumed to be normalized + // method assumes no rotated parent + + var q1 = new Quaternion(); + + return function rotateOnWorldAxis( axis, angle ) { + + q1.setFromAxisAngle( axis, angle ); + + this.quaternion.premultiply( q1 ); + + return this; + + }; + + }(), + + rotateX: function () { + + var v1 = new Vector3( 1, 0, 0 ); + + return function rotateX( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + rotateY: function () { + + var v1 = new Vector3( 0, 1, 0 ); + + return function rotateY( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + rotateZ: function () { + + var v1 = new Vector3( 0, 0, 1 ); + + return function rotateZ( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + translateOnAxis: function () { + + // translate object by distance along axis in object space + // axis is assumed to be normalized + + var v1 = new Vector3(); + + return function translateOnAxis( axis, distance ) { + + v1.copy( axis ).applyQuaternion( this.quaternion ); + + this.position.add( v1.multiplyScalar( distance ) ); + + return this; + + }; + + }(), + + translateX: function () { + + var v1 = new Vector3( 1, 0, 0 ); + + return function translateX( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + translateY: function () { + + var v1 = new Vector3( 0, 1, 0 ); + + return function translateY( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + translateZ: function () { + + var v1 = new Vector3( 0, 0, 1 ); + + return function translateZ( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + localToWorld: function ( vector ) { + + return vector.applyMatrix4( this.matrixWorld ); + + }, + + worldToLocal: function () { + + var m1 = new Matrix4(); + + return function worldToLocal( vector ) { + + return vector.applyMatrix4( m1.getInverse( this.matrixWorld ) ); + + }; + + }(), + + lookAt: function () { + + // This method does not support objects having non-uniformly-scaled parent(s) + + var q1 = new Quaternion(); + var m1 = new Matrix4(); + var target = new Vector3(); + var position = new Vector3(); + + return function lookAt( x, y, z ) { + + if ( x.isVector3 ) { + + target.copy( x ); + + } else { + + target.set( x, y, z ); + + } + + var parent = this.parent; + + this.updateWorldMatrix( true, false ); + + position.setFromMatrixPosition( this.matrixWorld ); + + if ( this.isCamera ) { + + m1.lookAt( position, target, this.up ); + + } else { + + m1.lookAt( target, position, this.up ); + + } + + this.quaternion.setFromRotationMatrix( m1 ); + + if ( parent ) { + + m1.extractRotation( parent.matrixWorld ); + q1.setFromRotationMatrix( m1 ); + this.quaternion.premultiply( q1.inverse() ); + + } + + }; + + }(), + + add: function ( object ) { + + if ( arguments.length > 1 ) { + + for ( var i = 0; i < arguments.length; i ++ ) { + + this.add( arguments[ i ] ); + + } + + return this; + + } + + if ( object === this ) { + + console.error( "THREE.Object3D.add: object can't be added as a child of itself.", object ); + return this; + + } + + if ( ( object && object.isObject3D ) ) { + + if ( object.parent !== null ) { + + object.parent.remove( object ); + + } + + object.parent = this; + object.dispatchEvent( { type: 'added' } ); + + this.children.push( object ); + + } else { + + console.error( "THREE.Object3D.add: object not an instance of THREE.Object3D.", object ); + + } + + return this; + + }, + + remove: function ( object ) { + + if ( arguments.length > 1 ) { + + for ( var i = 0; i < arguments.length; i ++ ) { + + this.remove( arguments[ i ] ); + + } + + return this; + + } + + var index = this.children.indexOf( object ); + + if ( index !== - 1 ) { + + object.parent = null; + + object.dispatchEvent( { type: 'removed' } ); + + this.children.splice( index, 1 ); + + } + + return this; + + }, + + getObjectById: function ( id ) { + + return this.getObjectByProperty( 'id', id ); + + }, + + getObjectByName: function ( name ) { + + return this.getObjectByProperty( 'name', name ); + + }, + + getObjectByProperty: function ( name, value ) { + + if ( this[ name ] === value ) return this; + + for ( var i = 0, l = this.children.length; i < l; i ++ ) { + + var child = this.children[ i ]; + var object = child.getObjectByProperty( name, value ); + + if ( object !== undefined ) { + + return object; + + } + + } + + return undefined; + + }, + + getWorldPosition: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Object3D: .getWorldPosition() target is now required' ); + target = new Vector3(); + + } + + this.updateMatrixWorld( true ); + + return target.setFromMatrixPosition( this.matrixWorld ); + + }, + + getWorldQuaternion: function () { + + var position = new Vector3(); + var scale = new Vector3(); + + return function getWorldQuaternion( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Object3D: .getWorldQuaternion() target is now required' ); + target = new Quaternion(); + + } + + this.updateMatrixWorld( true ); + + this.matrixWorld.decompose( position, target, scale ); + + return target; + + }; + + }(), + + getWorldScale: function () { + + var position = new Vector3(); + var quaternion = new Quaternion(); + + return function getWorldScale( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Object3D: .getWorldScale() target is now required' ); + target = new Vector3(); + + } + + this.updateMatrixWorld( true ); + + this.matrixWorld.decompose( position, quaternion, target ); + + return target; + + }; + + }(), + + getWorldDirection: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Object3D: .getWorldDirection() target is now required' ); + target = new Vector3(); + + } + + this.updateMatrixWorld( true ); + + var e = this.matrixWorld.elements; + + return target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize(); + + }, + + raycast: function () {}, + + traverse: function ( callback ) { + + callback( this ); + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverse( callback ); + + } + + }, + + traverseVisible: function ( callback ) { + + if ( this.visible === false ) return; + + callback( this ); + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverseVisible( callback ); + + } + + }, + + traverseAncestors: function ( callback ) { + + var parent = this.parent; + + if ( parent !== null ) { + + callback( parent ); + + parent.traverseAncestors( callback ); + + } + + }, + + updateMatrix: function () { + + this.matrix.compose( this.position, this.quaternion, this.scale ); + + this.matrixWorldNeedsUpdate = true; + + }, + + updateMatrixWorld: function ( force ) { + + if ( this.matrixAutoUpdate ) this.updateMatrix(); + + if ( this.matrixWorldNeedsUpdate || force ) { + + if ( this.parent === null ) { + + this.matrixWorld.copy( this.matrix ); + + } else { + + this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); + + } + + this.matrixWorldNeedsUpdate = false; + + force = true; + + } + + // update children + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].updateMatrixWorld( force ); + + } + + }, + + updateWorldMatrix: function ( updateParents, updateChildren ) { + + var parent = this.parent; + + if ( updateParents === true && parent !== null ) { + + parent.updateWorldMatrix( true, false ); + + } + + if ( this.matrixAutoUpdate ) this.updateMatrix(); + + if ( this.parent === null ) { + + this.matrixWorld.copy( this.matrix ); + + } else { + + this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); + + } + + // update children + + if ( updateChildren === true ) { + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].updateWorldMatrix( false, true ); + + } + + } + + }, + + toJSON: function ( meta ) { + + // meta is a string when called from JSON.stringify + var isRootObject = ( meta === undefined || typeof meta === 'string' ); + + var output = {}; + + // meta is a hash used to collect geometries, materials. + // not providing it implies that this is the root object + // being serialized. + if ( isRootObject ) { + + // initialize meta obj + meta = { + geometries: {}, + materials: {}, + textures: {}, + images: {}, + shapes: {} + }; + + output.metadata = { + version: 4.5, + type: 'Object', + generator: 'Object3D.toJSON' + }; + + } + + // standard Object3D serialization + + var object = {}; + + object.uuid = this.uuid; + object.type = this.type; + + if ( this.name !== '' ) object.name = this.name; + if ( this.castShadow === true ) object.castShadow = true; + if ( this.receiveShadow === true ) object.receiveShadow = true; + if ( this.visible === false ) object.visible = false; + if ( this.frustumCulled === false ) object.frustumCulled = false; + if ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder; + if ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData; + + object.layers = this.layers.mask; + object.matrix = this.matrix.toArray(); + + if ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false; + + // + + function serialize( library, element ) { + + if ( library[ element.uuid ] === undefined ) { + + library[ element.uuid ] = element.toJSON( meta ); + + } + + return element.uuid; + + } + + if ( this.isMesh || this.isLine || this.isPoints ) { + + object.geometry = serialize( meta.geometries, this.geometry ); + + var parameters = this.geometry.parameters; + + if ( parameters !== undefined && parameters.shapes !== undefined ) { + + var shapes = parameters.shapes; + + if ( Array.isArray( shapes ) ) { + + for ( var i = 0, l = shapes.length; i < l; i ++ ) { + + var shape = shapes[ i ]; + + serialize( meta.shapes, shape ); + + } + + } else { + + serialize( meta.shapes, shapes ); + + } + + } + + } + + if ( this.material !== undefined ) { + + if ( Array.isArray( this.material ) ) { + + var uuids = []; + + for ( var i = 0, l = this.material.length; i < l; i ++ ) { + + uuids.push( serialize( meta.materials, this.material[ i ] ) ); + + } + + object.material = uuids; + + } else { + + object.material = serialize( meta.materials, this.material ); + + } + + } + + // + + if ( this.children.length > 0 ) { + + object.children = []; + + for ( var i = 0; i < this.children.length; i ++ ) { + + object.children.push( this.children[ i ].toJSON( meta ).object ); + + } + + } + + if ( isRootObject ) { + + var geometries = extractFromCache( meta.geometries ); + var materials = extractFromCache( meta.materials ); + var textures = extractFromCache( meta.textures ); + var images = extractFromCache( meta.images ); + var shapes = extractFromCache( meta.shapes ); + + if ( geometries.length > 0 ) output.geometries = geometries; + if ( materials.length > 0 ) output.materials = materials; + if ( textures.length > 0 ) output.textures = textures; + if ( images.length > 0 ) output.images = images; + if ( shapes.length > 0 ) output.shapes = shapes; + + } + + output.object = object; + + return output; + + // extract data from the cache hash + // remove metadata on each item + // and return as array + function extractFromCache( cache ) { + + var values = []; + for ( var key in cache ) { + + var data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + return values; + + } + + }, + + clone: function ( recursive ) { + + return new this.constructor().copy( this, recursive ); + + }, + + copy: function ( source, recursive ) { + + if ( recursive === undefined ) recursive = true; + + this.name = source.name; + + this.up.copy( source.up ); + + this.position.copy( source.position ); + this.quaternion.copy( source.quaternion ); + this.scale.copy( source.scale ); + + this.matrix.copy( source.matrix ); + this.matrixWorld.copy( source.matrixWorld ); + + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate; + + this.layers.mask = source.layers.mask; + this.visible = source.visible; + + this.castShadow = source.castShadow; + this.receiveShadow = source.receiveShadow; + + this.frustumCulled = source.frustumCulled; + this.renderOrder = source.renderOrder; + + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + if ( recursive === true ) { + + for ( var i = 0; i < source.children.length; i ++ ) { + + var child = source.children[ i ]; + this.add( child.clone() ); + + } + + } + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author kile / http://kile.stravaganza.org/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author bhouston / http://clara.io + */ + + var geometryId = 0; // Geometry uses even numbers as Id + + function Geometry() { + + Object.defineProperty( this, 'id', { value: geometryId += 2 } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Geometry'; + + this.vertices = []; + this.colors = []; + this.faces = []; + this.faceVertexUvs = [[]]; + + this.morphTargets = []; + this.morphNormals = []; + + this.skinWeights = []; + this.skinIndices = []; + + this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.elementsNeedUpdate = false; + this.verticesNeedUpdate = false; + this.uvsNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.lineDistancesNeedUpdate = false; + this.groupsNeedUpdate = false; + + } + + Geometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: Geometry, + + isGeometry: true, + + applyMatrix: function ( matrix ) { + + var normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + for ( var i = 0, il = this.vertices.length; i < il; i ++ ) { + + var vertex = this.vertices[ i ]; + vertex.applyMatrix4( matrix ); + + } + + for ( var i = 0, il = this.faces.length; i < il; i ++ ) { + + var face = this.faces[ i ]; + face.normal.applyMatrix3( normalMatrix ).normalize(); + + for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + face.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize(); + + } + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + this.verticesNeedUpdate = true; + this.normalsNeedUpdate = true; + + return this; + + }, + + rotateX: function () { + + // rotate geometry around world x-axis + + var m1 = new Matrix4(); + + return function rotateX( angle ) { + + m1.makeRotationX( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateY: function () { + + // rotate geometry around world y-axis + + var m1 = new Matrix4(); + + return function rotateY( angle ) { + + m1.makeRotationY( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateZ: function () { + + // rotate geometry around world z-axis + + var m1 = new Matrix4(); + + return function rotateZ( angle ) { + + m1.makeRotationZ( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + translate: function () { + + // translate geometry + + var m1 = new Matrix4(); + + return function translate( x, y, z ) { + + m1.makeTranslation( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + scale: function () { + + // scale geometry + + var m1 = new Matrix4(); + + return function scale( x, y, z ) { + + m1.makeScale( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + lookAt: function () { + + var obj = new Object3D(); + + return function lookAt( vector ) { + + obj.lookAt( vector ); + + obj.updateMatrix(); + + this.applyMatrix( obj.matrix ); + + }; + + }(), + + fromBufferGeometry: function ( geometry ) { + + var scope = this; + + var indices = geometry.index !== null ? geometry.index.array : undefined; + var attributes = geometry.attributes; + + var positions = attributes.position.array; + var normals = attributes.normal !== undefined ? attributes.normal.array : undefined; + var colors = attributes.color !== undefined ? attributes.color.array : undefined; + var uvs = attributes.uv !== undefined ? attributes.uv.array : undefined; + var uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined; + + if ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = []; + + for ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) { + + scope.vertices.push( new Vector3().fromArray( positions, i ) ); + + if ( colors !== undefined ) { + + scope.colors.push( new Color().fromArray( colors, i ) ); + + } + + } + + function addFace( a, b, c, materialIndex ) { + + var vertexColors = ( colors === undefined ) ? [] : [ + scope.colors[ a ].clone(), + scope.colors[ b ].clone(), + scope.colors[ c ].clone() ]; + + var vertexNormals = ( normals === undefined ) ? [] : [ + new Vector3().fromArray( normals, a * 3 ), + new Vector3().fromArray( normals, b * 3 ), + new Vector3().fromArray( normals, c * 3 ) + ]; + + var face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex ); + + scope.faces.push( face ); + + if ( uvs !== undefined ) { + + scope.faceVertexUvs[ 0 ].push( [ + new Vector2().fromArray( uvs, a * 2 ), + new Vector2().fromArray( uvs, b * 2 ), + new Vector2().fromArray( uvs, c * 2 ) + ] ); + + } + + if ( uvs2 !== undefined ) { + + scope.faceVertexUvs[ 1 ].push( [ + new Vector2().fromArray( uvs2, a * 2 ), + new Vector2().fromArray( uvs2, b * 2 ), + new Vector2().fromArray( uvs2, c * 2 ) + ] ); + + } + + } + + var groups = geometry.groups; + + if ( groups.length > 0 ) { + + for ( var i = 0; i < groups.length; i ++ ) { + + var group = groups[ i ]; + + var start = group.start; + var count = group.count; + + for ( var j = start, jl = start + count; j < jl; j += 3 ) { + + if ( indices !== undefined ) { + + addFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex ); + + } else { + + addFace( j, j + 1, j + 2, group.materialIndex ); + + } + + } + + } + + } else { + + if ( indices !== undefined ) { + + for ( var i = 0; i < indices.length; i += 3 ) { + + addFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] ); + + } + + } else { + + for ( var i = 0; i < positions.length / 3; i += 3 ) { + + addFace( i, i + 1, i + 2 ); + + } + + } + + } + + this.computeFaceNormals(); + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + return this; + + }, + + center: function () { + + var offset = new Vector3(); + + return function center() { + + this.computeBoundingBox(); + + this.boundingBox.getCenter( offset ).negate(); + + this.translate( offset.x, offset.y, offset.z ); + + return this; + + }; + + }(), + + normalize: function () { + + this.computeBoundingSphere(); + + var center = this.boundingSphere.center; + var radius = this.boundingSphere.radius; + + var s = radius === 0 ? 1 : 1.0 / radius; + + var matrix = new Matrix4(); + matrix.set( + s, 0, 0, - s * center.x, + 0, s, 0, - s * center.y, + 0, 0, s, - s * center.z, + 0, 0, 0, 1 + ); + + this.applyMatrix( matrix ); + + return this; + + }, + + computeFaceNormals: function () { + + var cb = new Vector3(), ab = new Vector3(); + + for ( var f = 0, fl = this.faces.length; f < fl; f ++ ) { + + var face = this.faces[ f ]; + + var vA = this.vertices[ face.a ]; + var vB = this.vertices[ face.b ]; + var vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + cb.normalize(); + + face.normal.copy( cb ); + + } + + }, + + computeVertexNormals: function ( areaWeighted ) { + + if ( areaWeighted === undefined ) areaWeighted = true; + + var v, vl, f, fl, face, vertices; + + vertices = new Array( this.vertices.length ); + + for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ] = new Vector3(); + + } + + if ( areaWeighted ) { + + // vertex normals weighted by triangle areas + // http://www.iquilezles.org/www/articles/normals/normals.htm + + var vA, vB, vC; + var cb = new Vector3(), ab = new Vector3(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + vA = this.vertices[ face.a ]; + vB = this.vertices[ face.b ]; + vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + vertices[ face.a ].add( cb ); + vertices[ face.b ].add( cb ); + vertices[ face.c ].add( cb ); + + } + + } else { + + this.computeFaceNormals(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + vertices[ face.a ].add( face.normal ); + vertices[ face.b ].add( face.normal ); + vertices[ face.c ].add( face.normal ); + + } + + } + + for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ].normalize(); + + } + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + vertexNormals[ 0 ].copy( vertices[ face.a ] ); + vertexNormals[ 1 ].copy( vertices[ face.b ] ); + vertexNormals[ 2 ].copy( vertices[ face.c ] ); + + } else { + + vertexNormals[ 0 ] = vertices[ face.a ].clone(); + vertexNormals[ 1 ] = vertices[ face.b ].clone(); + vertexNormals[ 2 ] = vertices[ face.c ].clone(); + + } + + } + + if ( this.faces.length > 0 ) { + + this.normalsNeedUpdate = true; + + } + + }, + + computeFlatVertexNormals: function () { + + var f, fl, face; + + this.computeFaceNormals(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + vertexNormals[ 0 ].copy( face.normal ); + vertexNormals[ 1 ].copy( face.normal ); + vertexNormals[ 2 ].copy( face.normal ); + + } else { + + vertexNormals[ 0 ] = face.normal.clone(); + vertexNormals[ 1 ] = face.normal.clone(); + vertexNormals[ 2 ] = face.normal.clone(); + + } + + } + + if ( this.faces.length > 0 ) { + + this.normalsNeedUpdate = true; + + } + + }, + + computeMorphNormals: function () { + + var i, il, f, fl, face; + + // save original normals + // - create temp variables on first access + // otherwise just copy (for faster repeated calls) + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + if ( ! face.__originalFaceNormal ) { + + face.__originalFaceNormal = face.normal.clone(); + + } else { + + face.__originalFaceNormal.copy( face.normal ); + + } + + if ( ! face.__originalVertexNormals ) face.__originalVertexNormals = []; + + for ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) { + + if ( ! face.__originalVertexNormals[ i ] ) { + + face.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone(); + + } else { + + face.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] ); + + } + + } + + } + + // use temp geometry to compute face and vertex normals for each morph + + var tmpGeo = new Geometry(); + tmpGeo.faces = this.faces; + + for ( i = 0, il = this.morphTargets.length; i < il; i ++ ) { + + // create on first access + + if ( ! this.morphNormals[ i ] ) { + + this.morphNormals[ i ] = {}; + this.morphNormals[ i ].faceNormals = []; + this.morphNormals[ i ].vertexNormals = []; + + var dstNormalsFace = this.morphNormals[ i ].faceNormals; + var dstNormalsVertex = this.morphNormals[ i ].vertexNormals; + + var faceNormal, vertexNormals; + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + faceNormal = new Vector3(); + vertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() }; + + dstNormalsFace.push( faceNormal ); + dstNormalsVertex.push( vertexNormals ); + + } + + } + + var morphNormals = this.morphNormals[ i ]; + + // set vertices to morph target + + tmpGeo.vertices = this.morphTargets[ i ].vertices; + + // compute morph normals + + tmpGeo.computeFaceNormals(); + tmpGeo.computeVertexNormals(); + + // store morph normals + + var faceNormal, vertexNormals; + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + faceNormal = morphNormals.faceNormals[ f ]; + vertexNormals = morphNormals.vertexNormals[ f ]; + + faceNormal.copy( face.normal ); + + vertexNormals.a.copy( face.vertexNormals[ 0 ] ); + vertexNormals.b.copy( face.vertexNormals[ 1 ] ); + vertexNormals.c.copy( face.vertexNormals[ 2 ] ); + + } + + } + + // restore original normals + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + face.normal = face.__originalFaceNormal; + face.vertexNormals = face.__originalVertexNormals; + + } + + }, + + computeBoundingBox: function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + this.boundingBox.setFromPoints( this.vertices ); + + }, + + computeBoundingSphere: function () { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + this.boundingSphere.setFromPoints( this.vertices ); + + }, + + merge: function ( geometry, matrix, materialIndexOffset ) { + + if ( ! ( geometry && geometry.isGeometry ) ) { + + console.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry ); + return; + + } + + var normalMatrix, + vertexOffset = this.vertices.length, + vertices1 = this.vertices, + vertices2 = geometry.vertices, + faces1 = this.faces, + faces2 = geometry.faces, + uvs1 = this.faceVertexUvs[ 0 ], + uvs2 = geometry.faceVertexUvs[ 0 ], + colors1 = this.colors, + colors2 = geometry.colors; + + if ( materialIndexOffset === undefined ) materialIndexOffset = 0; + + if ( matrix !== undefined ) { + + normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + } + + // vertices + + for ( var i = 0, il = vertices2.length; i < il; i ++ ) { + + var vertex = vertices2[ i ]; + + var vertexCopy = vertex.clone(); + + if ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix ); + + vertices1.push( vertexCopy ); + + } + + // colors + + for ( var i = 0, il = colors2.length; i < il; i ++ ) { + + colors1.push( colors2[ i ].clone() ); + + } + + // faces + + for ( i = 0, il = faces2.length; i < il; i ++ ) { + + var face = faces2[ i ], faceCopy, normal, color, + faceVertexNormals = face.vertexNormals, + faceVertexColors = face.vertexColors; + + faceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset ); + faceCopy.normal.copy( face.normal ); + + if ( normalMatrix !== undefined ) { + + faceCopy.normal.applyMatrix3( normalMatrix ).normalize(); + + } + + for ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) { + + normal = faceVertexNormals[ j ].clone(); + + if ( normalMatrix !== undefined ) { + + normal.applyMatrix3( normalMatrix ).normalize(); + + } + + faceCopy.vertexNormals.push( normal ); + + } + + faceCopy.color.copy( face.color ); + + for ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) { + + color = faceVertexColors[ j ]; + faceCopy.vertexColors.push( color.clone() ); + + } + + faceCopy.materialIndex = face.materialIndex + materialIndexOffset; + + faces1.push( faceCopy ); + + } + + // uvs + + for ( i = 0, il = uvs2.length; i < il; i ++ ) { + + var uv = uvs2[ i ], uvCopy = []; + + if ( uv === undefined ) { + + continue; + + } + + for ( var j = 0, jl = uv.length; j < jl; j ++ ) { + + uvCopy.push( uv[ j ].clone() ); + + } + + uvs1.push( uvCopy ); + + } + + }, + + mergeMesh: function ( mesh ) { + + if ( ! ( mesh && mesh.isMesh ) ) { + + console.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh ); + return; + + } + + if ( mesh.matrixAutoUpdate ) mesh.updateMatrix(); + + this.merge( mesh.geometry, mesh.matrix ); + + }, + + /* + * Checks for duplicate vertices with hashmap. + * Duplicated vertices are removed + * and faces' vertices are updated. + */ + + mergeVertices: function () { + + var verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique) + var unique = [], changes = []; + + var v, key; + var precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001 + var precision = Math.pow( 10, precisionPoints ); + var i, il, face; + var 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. + var 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 ( var n = 0; n < 3; n ++ ) { + + if ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) { + + faceIndicesToRemove.push( i ); + break; + + } + + } + + } + + for ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) { + + var 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 + + var diff = this.vertices.length - unique.length; + this.vertices = unique; + return diff; + + }, + + setFromPoints: function ( points ) { + + this.vertices = []; + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + var point = points[ i ]; + this.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) ); + + } + + return this; + + }, + + sortFacesByMaterialIndex: function () { + + var faces = this.faces; + var length = faces.length; + + // tag faces + + for ( var i = 0; i < length; i ++ ) { + + faces[ i ]._id = i; + + } + + // sort faces + + function materialIndexSort( a, b ) { + + return a.materialIndex - b.materialIndex; + + } + + faces.sort( materialIndexSort ); + + // sort uvs + + var uvs1 = this.faceVertexUvs[ 0 ]; + var uvs2 = this.faceVertexUvs[ 1 ]; + + var newUvs1, newUvs2; + + if ( uvs1 && uvs1.length === length ) newUvs1 = []; + if ( uvs2 && uvs2.length === length ) newUvs2 = []; + + for ( var i = 0; i < length; i ++ ) { + + var id = faces[ i ]._id; + + if ( newUvs1 ) newUvs1.push( uvs1[ id ] ); + if ( newUvs2 ) newUvs2.push( uvs2[ id ] ); + + } + + if ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1; + if ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.5, + type: 'Geometry', + generator: 'Geometry.toJSON' + } + }; + + // standard Geometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + + if ( this.parameters !== undefined ) { + + var parameters = this.parameters; + + for ( var key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + var vertices = []; + + for ( var i = 0; i < this.vertices.length; i ++ ) { + + var vertex = this.vertices[ i ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + var faces = []; + var normals = []; + var normalsHash = {}; + var colors = []; + var colorsHash = {}; + var uvs = []; + var uvsHash = {}; + + for ( var i = 0; i < this.faces.length; i ++ ) { + + var face = this.faces[ i ]; + + var hasMaterial = true; + var hasFaceUv = false; // deprecated + var hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined; + var hasFaceNormal = face.normal.length() > 0; + var hasFaceVertexNormal = face.vertexNormals.length > 0; + var hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1; + var hasFaceVertexColor = face.vertexColors.length > 0; + + var faceType = 0; + + faceType = setBit( faceType, 0, 0 ); // isQuad + faceType = setBit( faceType, 1, hasMaterial ); + faceType = setBit( faceType, 2, hasFaceUv ); + faceType = setBit( faceType, 3, hasFaceVertexUv ); + faceType = setBit( faceType, 4, hasFaceNormal ); + faceType = setBit( faceType, 5, hasFaceVertexNormal ); + faceType = setBit( faceType, 6, hasFaceColor ); + faceType = setBit( faceType, 7, hasFaceVertexColor ); + + faces.push( faceType ); + faces.push( face.a, face.b, face.c ); + faces.push( face.materialIndex ); + + if ( hasFaceVertexUv ) { + + var faceVertexUvs = this.faceVertexUvs[ 0 ][ i ]; + + faces.push( + getUvIndex( faceVertexUvs[ 0 ] ), + getUvIndex( faceVertexUvs[ 1 ] ), + getUvIndex( faceVertexUvs[ 2 ] ) + ); + + } + + if ( hasFaceNormal ) { + + faces.push( getNormalIndex( face.normal ) ); + + } + + if ( hasFaceVertexNormal ) { + + var vertexNormals = face.vertexNormals; + + faces.push( + getNormalIndex( vertexNormals[ 0 ] ), + getNormalIndex( vertexNormals[ 1 ] ), + getNormalIndex( vertexNormals[ 2 ] ) + ); + + } + + if ( hasFaceColor ) { + + faces.push( getColorIndex( face.color ) ); + + } + + if ( hasFaceVertexColor ) { + + var vertexColors = face.vertexColors; + + faces.push( + getColorIndex( vertexColors[ 0 ] ), + getColorIndex( vertexColors[ 1 ] ), + getColorIndex( vertexColors[ 2 ] ) + ); + + } + + } + + function setBit( value, position, enabled ) { + + return enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) ); + + } + + function getNormalIndex( normal ) { + + var hash = normal.x.toString() + normal.y.toString() + normal.z.toString(); + + if ( normalsHash[ hash ] !== undefined ) { + + return normalsHash[ hash ]; + + } + + normalsHash[ hash ] = normals.length / 3; + normals.push( normal.x, normal.y, normal.z ); + + return normalsHash[ hash ]; + + } + + function getColorIndex( color ) { + + var hash = color.r.toString() + color.g.toString() + color.b.toString(); + + if ( colorsHash[ hash ] !== undefined ) { + + return colorsHash[ hash ]; + + } + + colorsHash[ hash ] = colors.length; + colors.push( color.getHex() ); + + return colorsHash[ hash ]; + + } + + function getUvIndex( uv ) { + + var hash = uv.x.toString() + uv.y.toString(); + + if ( uvsHash[ hash ] !== undefined ) { + + return uvsHash[ hash ]; + + } + + uvsHash[ hash ] = uvs.length / 2; + uvs.push( uv.x, uv.y ); + + return uvsHash[ hash ]; + + } + + data.data = {}; + + data.data.vertices = vertices; + data.data.normals = normals; + if ( colors.length > 0 ) data.data.colors = colors; + if ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility + data.data.faces = faces; + + return data; + + }, + + clone: function () { + + /* + // Handle primitives + + var parameters = this.parameters; + + if ( parameters !== undefined ) { + + var values = []; + + for ( var key in parameters ) { + + values.push( parameters[ key ] ); + + } + + var geometry = Object.create( this.constructor.prototype ); + this.constructor.apply( geometry, values ); + return geometry; + + } + + return new this.constructor().copy( this ); + */ + + return new Geometry().copy( this ); + + }, + + copy: function ( source ) { + + var i, il, j, jl, k, kl; + + // reset + + this.vertices = []; + this.colors = []; + this.faces = []; + this.faceVertexUvs = [[]]; + this.morphTargets = []; + this.morphNormals = []; + this.skinWeights = []; + this.skinIndices = []; + this.lineDistances = []; + this.boundingBox = null; + this.boundingSphere = null; + + // name + + this.name = source.name; + + // vertices + + var vertices = source.vertices; + + for ( i = 0, il = vertices.length; i < il; i ++ ) { + + this.vertices.push( vertices[ i ].clone() ); + + } + + // colors + + var colors = source.colors; + + for ( i = 0, il = colors.length; i < il; i ++ ) { + + this.colors.push( colors[ i ].clone() ); + + } + + // faces + + var faces = source.faces; + + for ( i = 0, il = faces.length; i < il; i ++ ) { + + this.faces.push( faces[ i ].clone() ); + + } + + // face vertex uvs + + for ( i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) { + + var faceVertexUvs = source.faceVertexUvs[ i ]; + + if ( this.faceVertexUvs[ i ] === undefined ) { + + this.faceVertexUvs[ i ] = []; + + } + + for ( j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) { + + var uvs = faceVertexUvs[ j ], uvsCopy = []; + + for ( k = 0, kl = uvs.length; k < kl; k ++ ) { + + var uv = uvs[ k ]; + + uvsCopy.push( uv.clone() ); + + } + + this.faceVertexUvs[ i ].push( uvsCopy ); + + } + + } + + // morph targets + + var morphTargets = source.morphTargets; + + for ( i = 0, il = morphTargets.length; i < il; i ++ ) { + + var morphTarget = {}; + morphTarget.name = morphTargets[ i ].name; + + // vertices + + if ( morphTargets[ i ].vertices !== undefined ) { + + morphTarget.vertices = []; + + for ( j = 0, jl = morphTargets[ i ].vertices.length; j < jl; j ++ ) { + + morphTarget.vertices.push( morphTargets[ i ].vertices[ j ].clone() ); + + } + + } + + // normals + + if ( morphTargets[ i ].normals !== undefined ) { + + morphTarget.normals = []; + + for ( j = 0, jl = morphTargets[ i ].normals.length; j < jl; j ++ ) { + + morphTarget.normals.push( morphTargets[ i ].normals[ j ].clone() ); + + } + + } + + this.morphTargets.push( morphTarget ); + + } + + // morph normals + + var morphNormals = source.morphNormals; + + for ( i = 0, il = morphNormals.length; i < il; i ++ ) { + + var morphNormal = {}; + + // vertex normals + + if ( morphNormals[ i ].vertexNormals !== undefined ) { + + morphNormal.vertexNormals = []; + + for ( j = 0, jl = morphNormals[ i ].vertexNormals.length; j < jl; j ++ ) { + + var srcVertexNormal = morphNormals[ i ].vertexNormals[ j ]; + var destVertexNormal = {}; + + destVertexNormal.a = srcVertexNormal.a.clone(); + destVertexNormal.b = srcVertexNormal.b.clone(); + destVertexNormal.c = srcVertexNormal.c.clone(); + + morphNormal.vertexNormals.push( destVertexNormal ); + + } + + } + + // face normals + + if ( morphNormals[ i ].faceNormals !== undefined ) { + + morphNormal.faceNormals = []; + + for ( j = 0, jl = morphNormals[ i ].faceNormals.length; j < jl; j ++ ) { + + morphNormal.faceNormals.push( morphNormals[ i ].faceNormals[ j ].clone() ); + + } + + } + + this.morphNormals.push( morphNormal ); + + } + + // skin weights + + var skinWeights = source.skinWeights; + + for ( i = 0, il = skinWeights.length; i < il; i ++ ) { + + this.skinWeights.push( skinWeights[ i ].clone() ); + + } + + // skin indices + + var skinIndices = source.skinIndices; + + for ( i = 0, il = skinIndices.length; i < il; i ++ ) { + + this.skinIndices.push( skinIndices[ i ].clone() ); + + } + + // line distances + + var lineDistances = source.lineDistances; + + for ( i = 0, il = lineDistances.length; i < il; i ++ ) { + + this.lineDistances.push( lineDistances[ i ] ); + + } + + // bounding box + + var boundingBox = source.boundingBox; + + if ( boundingBox !== null ) { + + this.boundingBox = boundingBox.clone(); + + } + + // bounding sphere + + var boundingSphere = source.boundingSphere; + + if ( boundingSphere !== null ) { + + this.boundingSphere = boundingSphere.clone(); + + } + + // update flags + + this.elementsNeedUpdate = source.elementsNeedUpdate; + this.verticesNeedUpdate = source.verticesNeedUpdate; + this.uvsNeedUpdate = source.uvsNeedUpdate; + this.normalsNeedUpdate = source.normalsNeedUpdate; + this.colorsNeedUpdate = source.colorsNeedUpdate; + this.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate; + this.groupsNeedUpdate = source.groupsNeedUpdate; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function BufferAttribute( array, itemSize, normalized ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.name = ''; + + this.array = array; + this.itemSize = itemSize; + this.count = array !== undefined ? array.length / itemSize : 0; + this.normalized = normalized === true; + + this.dynamic = false; + this.updateRange = { offset: 0, count: - 1 }; + + this.version = 0; + + } + + Object.defineProperty( BufferAttribute.prototype, 'needsUpdate', { + + set: function ( value ) { + + if ( value === true ) this.version ++; + + } + + } ); + + Object.assign( BufferAttribute.prototype, { + + isBufferAttribute: true, + + onUploadCallback: function () {}, + + setArray: function ( array ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.count = array !== undefined ? array.length / this.itemSize : 0; + this.array = array; + + return this; + + }, + + setDynamic: function ( value ) { + + this.dynamic = value; + + return this; + + }, + + copy: function ( source ) { + + this.name = source.name; + this.array = new source.array.constructor( source.array ); + this.itemSize = source.itemSize; + this.count = source.count; + this.normalized = source.normalized; + + this.dynamic = source.dynamic; + + return this; + + }, + + copyAt: function ( index1, attribute, index2 ) { + + index1 *= this.itemSize; + index2 *= attribute.itemSize; + + for ( var i = 0, l = this.itemSize; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + }, + + copyArray: function ( array ) { + + this.array.set( array ); + + return this; + + }, + + copyColorsArray: function ( colors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = colors.length; i < l; i ++ ) { + + var color = colors[ i ]; + + if ( color === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i ); + color = new Color(); + + } + + array[ offset ++ ] = color.r; + array[ offset ++ ] = color.g; + array[ offset ++ ] = color.b; + + } + + return this; + + }, + + copyVector2sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i ); + vector = new Vector2(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + + } + + return this; + + }, + + copyVector3sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i ); + vector = new Vector3(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + + } + + return this; + + }, + + copyVector4sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i ); + vector = new Vector4(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + array[ offset ++ ] = vector.w; + + } + + return this; + + }, + + set: function ( value, offset ) { + + if ( offset === undefined ) offset = 0; + + this.array.set( value, offset ); + + return this; + + }, + + getX: function ( index ) { + + return this.array[ index * this.itemSize ]; + + }, + + setX: function ( index, x ) { + + this.array[ index * this.itemSize ] = x; + + return this; + + }, + + getY: function ( index ) { + + return this.array[ index * this.itemSize + 1 ]; + + }, + + setY: function ( index, y ) { + + this.array[ index * this.itemSize + 1 ] = y; + + return this; + + }, + + getZ: function ( index ) { + + return this.array[ index * this.itemSize + 2 ]; + + }, + + setZ: function ( index, z ) { + + this.array[ index * this.itemSize + 2 ] = z; + + return this; + + }, + + getW: function ( index ) { + + return this.array[ index * this.itemSize + 3 ]; + + }, + + setW: function ( index, w ) { + + this.array[ index * this.itemSize + 3 ] = w; + + return this; + + }, + + setXY: function ( index, x, y ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + + return this; + + }, + + setXYZ: function ( index, x, y, z ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + + return this; + + }, + + setXYZW: function ( index, x, y, z, w ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + this.array[ index + 3 ] = w; + + return this; + + }, + + onUpload: function ( callback ) { + + this.onUploadCallback = callback; + + return this; + + }, + + clone: function () { + + return new this.constructor( this.array, this.itemSize ).copy( this ); + + } + + } ); + + // + + function Int8BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Int8Array( array ), itemSize, normalized ); + + } + + Int8BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Int8BufferAttribute.prototype.constructor = Int8BufferAttribute; + + + function Uint8BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Uint8Array( array ), itemSize, normalized ); + + } + + Uint8BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint8BufferAttribute.prototype.constructor = Uint8BufferAttribute; + + + function Uint8ClampedBufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Uint8ClampedArray( array ), itemSize, normalized ); + + } + + Uint8ClampedBufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute; + + + function Int16BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Int16Array( array ), itemSize, normalized ); + + } + + Int16BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Int16BufferAttribute.prototype.constructor = Int16BufferAttribute; + + + function Uint16BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Uint16Array( array ), itemSize, normalized ); + + } + + Uint16BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint16BufferAttribute.prototype.constructor = Uint16BufferAttribute; + + + function Int32BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Int32Array( array ), itemSize, normalized ); + + } + + Int32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Int32BufferAttribute.prototype.constructor = Int32BufferAttribute; + + + function Uint32BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Uint32Array( array ), itemSize, normalized ); + + } + + Uint32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint32BufferAttribute.prototype.constructor = Uint32BufferAttribute; + + + function Float32BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Float32Array( array ), itemSize, normalized ); + + } + + Float32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Float32BufferAttribute.prototype.constructor = Float32BufferAttribute; + + + function Float64BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Float64Array( array ), itemSize, normalized ); + + } + + Float64BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Float64BufferAttribute.prototype.constructor = Float64BufferAttribute; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function DirectGeometry() { + + this.vertices = []; + this.normals = []; + this.colors = []; + this.uvs = []; + this.uvs2 = []; + + this.groups = []; + + this.morphTargets = {}; + + this.skinWeights = []; + this.skinIndices = []; + + // this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.verticesNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.uvsNeedUpdate = false; + this.groupsNeedUpdate = false; + + } + + Object.assign( DirectGeometry.prototype, { + + computeGroups: function ( geometry ) { + + var group; + var groups = []; + var materialIndex = undefined; + + var faces = geometry.faces; + + for ( var i = 0; i < faces.length; i ++ ) { + + var face = faces[ i ]; + + // materials + + if ( face.materialIndex !== materialIndex ) { + + materialIndex = face.materialIndex; + + if ( group !== undefined ) { + + group.count = ( i * 3 ) - group.start; + groups.push( group ); + + } + + group = { + start: i * 3, + materialIndex: materialIndex + }; + + } + + } + + if ( group !== undefined ) { + + group.count = ( i * 3 ) - group.start; + groups.push( group ); + + } + + this.groups = groups; + + }, + + fromGeometry: function ( geometry ) { + + var faces = geometry.faces; + var vertices = geometry.vertices; + var faceVertexUvs = geometry.faceVertexUvs; + + var hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0; + var hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0; + + // morphs + + var morphTargets = geometry.morphTargets; + var morphTargetsLength = morphTargets.length; + + var morphTargetsPosition; + + if ( morphTargetsLength > 0 ) { + + morphTargetsPosition = []; + + for ( var i = 0; i < morphTargetsLength; i ++ ) { + + morphTargetsPosition[ i ] = { + name: morphTargets[ i ].name, + data: [] + }; + + } + + this.morphTargets.position = morphTargetsPosition; + + } + + var morphNormals = geometry.morphNormals; + var morphNormalsLength = morphNormals.length; + + var morphTargetsNormal; + + if ( morphNormalsLength > 0 ) { + + morphTargetsNormal = []; + + for ( var i = 0; i < morphNormalsLength; i ++ ) { + + morphTargetsNormal[ i ] = { + name: morphNormals[ i ].name, + data: [] + }; + + } + + this.morphTargets.normal = morphTargetsNormal; + + } + + // skins + + var skinIndices = geometry.skinIndices; + var skinWeights = geometry.skinWeights; + + var hasSkinIndices = skinIndices.length === vertices.length; + var hasSkinWeights = skinWeights.length === vertices.length; + + // + + if ( vertices.length > 0 && faces.length === 0 ) { + + console.error( 'THREE.DirectGeometry: Faceless geometries are not supported.' ); + + } + + for ( var i = 0; i < faces.length; i ++ ) { + + var face = faces[ i ]; + + this.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] ); + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + this.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] ); + + } else { + + var normal = face.normal; + + this.normals.push( normal, normal, normal ); + + } + + var vertexColors = face.vertexColors; + + if ( vertexColors.length === 3 ) { + + this.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] ); + + } else { + + var color = face.color; + + this.colors.push( color, color, color ); + + } + + if ( hasFaceVertexUv === true ) { + + var vertexUvs = faceVertexUvs[ 0 ][ i ]; + + if ( vertexUvs !== undefined ) { + + this.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i ); + + this.uvs.push( new Vector2(), new Vector2(), new Vector2() ); + + } + + } + + if ( hasFaceVertexUv2 === true ) { + + var vertexUvs = faceVertexUvs[ 1 ][ i ]; + + if ( vertexUvs !== undefined ) { + + this.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i ); + + this.uvs2.push( new Vector2(), new Vector2(), new Vector2() ); + + } + + } + + // morphs + + for ( var j = 0; j < morphTargetsLength; j ++ ) { + + var morphTarget = morphTargets[ j ].vertices; + + morphTargetsPosition[ j ].data.push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] ); + + } + + for ( var j = 0; j < morphNormalsLength; j ++ ) { + + var morphNormal = morphNormals[ j ].vertexNormals[ i ]; + + morphTargetsNormal[ j ].data.push( morphNormal.a, morphNormal.b, morphNormal.c ); + + } + + // skins + + if ( hasSkinIndices ) { + + this.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] ); + + } + + if ( hasSkinWeights ) { + + this.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] ); + + } + + } + + this.computeGroups( geometry ); + + this.verticesNeedUpdate = geometry.verticesNeedUpdate; + this.normalsNeedUpdate = geometry.normalsNeedUpdate; + this.colorsNeedUpdate = geometry.colorsNeedUpdate; + this.uvsNeedUpdate = geometry.uvsNeedUpdate; + this.groupsNeedUpdate = geometry.groupsNeedUpdate; + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function arrayMax( array ) { + + if ( array.length === 0 ) return - Infinity; + + var max = array[ 0 ]; + + for ( var i = 1, l = array.length; i < l; ++ i ) { + + if ( array[ i ] > max ) max = array[ i ]; + + } + + return max; + + } + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + var bufferGeometryId = 1; // BufferGeometry uses odd numbers as Id + + function BufferGeometry() { + + Object.defineProperty( this, 'id', { value: bufferGeometryId += 2 } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'BufferGeometry'; + + this.index = null; + this.attributes = {}; + + this.morphAttributes = {}; + + this.groups = []; + + this.boundingBox = null; + this.boundingSphere = null; + + this.drawRange = { start: 0, count: Infinity }; + + this.userData = {}; + + } + + BufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: BufferGeometry, + + isBufferGeometry: true, + + getIndex: function () { + + return this.index; + + }, + + setIndex: function ( index ) { + + if ( Array.isArray( index ) ) { + + this.index = new ( arrayMax( index ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 ); + + } else { + + this.index = index; + + } + + }, + + addAttribute: function ( name, attribute ) { + + if ( ! ( attribute && attribute.isBufferAttribute ) && ! ( attribute && attribute.isInterleavedBufferAttribute ) ) { + + console.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' ); + + return this.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) ); + + } + + if ( name === 'index' ) { + + console.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' ); + this.setIndex( attribute ); + + return this; + + } + + this.attributes[ name ] = attribute; + + return this; + + }, + + getAttribute: function ( name ) { + + return this.attributes[ name ]; + + }, + + removeAttribute: function ( name ) { + + delete this.attributes[ name ]; + + return this; + + }, + + addGroup: function ( start, count, materialIndex ) { + + this.groups.push( { + + start: start, + count: count, + materialIndex: materialIndex !== undefined ? materialIndex : 0 + + } ); + + }, + + clearGroups: function () { + + this.groups = []; + + }, + + setDrawRange: function ( start, count ) { + + this.drawRange.start = start; + this.drawRange.count = count; + + }, + + applyMatrix: function ( matrix ) { + + var position = this.attributes.position; + + if ( position !== undefined ) { + + matrix.applyToBufferAttribute( position ); + position.needsUpdate = true; + + } + + var normal = this.attributes.normal; + + if ( normal !== undefined ) { + + var normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + normalMatrix.applyToBufferAttribute( normal ); + normal.needsUpdate = true; + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + return this; + + }, + + rotateX: function () { + + // rotate geometry around world x-axis + + var m1 = new Matrix4(); + + return function rotateX( angle ) { + + m1.makeRotationX( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateY: function () { + + // rotate geometry around world y-axis + + var m1 = new Matrix4(); + + return function rotateY( angle ) { + + m1.makeRotationY( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateZ: function () { + + // rotate geometry around world z-axis + + var m1 = new Matrix4(); + + return function rotateZ( angle ) { + + m1.makeRotationZ( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + translate: function () { + + // translate geometry + + var m1 = new Matrix4(); + + return function translate( x, y, z ) { + + m1.makeTranslation( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + scale: function () { + + // scale geometry + + var m1 = new Matrix4(); + + return function scale( x, y, z ) { + + m1.makeScale( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + lookAt: function () { + + var obj = new Object3D(); + + return function lookAt( vector ) { + + obj.lookAt( vector ); + + obj.updateMatrix(); + + this.applyMatrix( obj.matrix ); + + }; + + }(), + + center: function () { + + var offset = new Vector3(); + + return function center() { + + this.computeBoundingBox(); + + this.boundingBox.getCenter( offset ).negate(); + + this.translate( offset.x, offset.y, offset.z ); + + return this; + + }; + + }(), + + setFromObject: function ( object ) { + + // console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this ); + + var geometry = object.geometry; + + if ( object.isPoints || object.isLine ) { + + var positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 ); + var colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 ); + + this.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) ); + this.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) ); + + if ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) { + + var lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 ); + + this.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) ); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + } else if ( object.isMesh ) { + + if ( geometry && geometry.isGeometry ) { + + this.fromGeometry( geometry ); + + } + + } + + return this; + + }, + + setFromPoints: function ( points ) { + + var position = []; + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + var point = points[ i ]; + position.push( point.x, point.y, point.z || 0 ); + + } + + this.addAttribute( 'position', new Float32BufferAttribute( position, 3 ) ); + + return this; + + }, + + updateFromObject: function ( object ) { + + var geometry = object.geometry; + + if ( object.isMesh ) { + + var direct = geometry.__directGeometry; + + if ( geometry.elementsNeedUpdate === true ) { + + direct = undefined; + geometry.elementsNeedUpdate = false; + + } + + if ( direct === undefined ) { + + return this.fromGeometry( geometry ); + + } + + direct.verticesNeedUpdate = geometry.verticesNeedUpdate; + direct.normalsNeedUpdate = geometry.normalsNeedUpdate; + direct.colorsNeedUpdate = geometry.colorsNeedUpdate; + direct.uvsNeedUpdate = geometry.uvsNeedUpdate; + direct.groupsNeedUpdate = geometry.groupsNeedUpdate; + + geometry.verticesNeedUpdate = false; + geometry.normalsNeedUpdate = false; + geometry.colorsNeedUpdate = false; + geometry.uvsNeedUpdate = false; + geometry.groupsNeedUpdate = false; + + geometry = direct; + + } + + var attribute; + + if ( geometry.verticesNeedUpdate === true ) { + + attribute = this.attributes.position; + + if ( attribute !== undefined ) { + + attribute.copyVector3sArray( geometry.vertices ); + attribute.needsUpdate = true; + + } + + geometry.verticesNeedUpdate = false; + + } + + if ( geometry.normalsNeedUpdate === true ) { + + attribute = this.attributes.normal; + + if ( attribute !== undefined ) { + + attribute.copyVector3sArray( geometry.normals ); + attribute.needsUpdate = true; + + } + + geometry.normalsNeedUpdate = false; + + } + + if ( geometry.colorsNeedUpdate === true ) { + + attribute = this.attributes.color; + + if ( attribute !== undefined ) { + + attribute.copyColorsArray( geometry.colors ); + attribute.needsUpdate = true; + + } + + geometry.colorsNeedUpdate = false; + + } + + if ( geometry.uvsNeedUpdate ) { + + attribute = this.attributes.uv; + + if ( attribute !== undefined ) { + + attribute.copyVector2sArray( geometry.uvs ); + attribute.needsUpdate = true; + + } + + geometry.uvsNeedUpdate = false; + + } + + if ( geometry.lineDistancesNeedUpdate ) { + + attribute = this.attributes.lineDistance; + + if ( attribute !== undefined ) { + + attribute.copyArray( geometry.lineDistances ); + attribute.needsUpdate = true; + + } + + geometry.lineDistancesNeedUpdate = false; + + } + + if ( geometry.groupsNeedUpdate ) { + + geometry.computeGroups( object.geometry ); + this.groups = geometry.groups; + + geometry.groupsNeedUpdate = false; + + } + + return this; + + }, + + fromGeometry: function ( geometry ) { + + geometry.__directGeometry = new DirectGeometry().fromGeometry( geometry ); + + return this.fromDirectGeometry( geometry.__directGeometry ); + + }, + + fromDirectGeometry: function ( geometry ) { + + var positions = new Float32Array( geometry.vertices.length * 3 ); + this.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) ); + + if ( geometry.normals.length > 0 ) { + + var normals = new Float32Array( geometry.normals.length * 3 ); + this.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) ); + + } + + if ( geometry.colors.length > 0 ) { + + var colors = new Float32Array( geometry.colors.length * 3 ); + this.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) ); + + } + + if ( geometry.uvs.length > 0 ) { + + var uvs = new Float32Array( geometry.uvs.length * 2 ); + this.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) ); + + } + + if ( geometry.uvs2.length > 0 ) { + + var uvs2 = new Float32Array( geometry.uvs2.length * 2 ); + this.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) ); + + } + + // groups + + this.groups = geometry.groups; + + // morphs + + for ( var name in geometry.morphTargets ) { + + var array = []; + var morphTargets = geometry.morphTargets[ name ]; + + for ( var i = 0, l = morphTargets.length; i < l; i ++ ) { + + var morphTarget = morphTargets[ i ]; + + var attribute = new Float32BufferAttribute( morphTarget.data.length * 3, 3 ); + attribute.name = morphTarget.name; + + array.push( attribute.copyVector3sArray( morphTarget.data ) ); + + } + + this.morphAttributes[ name ] = array; + + } + + // skinning + + if ( geometry.skinIndices.length > 0 ) { + + var skinIndices = new Float32BufferAttribute( geometry.skinIndices.length * 4, 4 ); + this.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) ); + + } + + if ( geometry.skinWeights.length > 0 ) { + + var skinWeights = new Float32BufferAttribute( geometry.skinWeights.length * 4, 4 ); + this.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) ); + + } + + // + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + return this; + + }, + + computeBoundingBox: function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + var position = this.attributes.position; + + if ( position !== undefined ) { + + this.boundingBox.setFromBufferAttribute( position ); + + } else { + + this.boundingBox.makeEmpty(); + + } + + if ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this ); + + } + + }, + + computeBoundingSphere: function () { + + var box = new Box3(); + var vector = new Vector3(); + + return function computeBoundingSphere() { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + var position = this.attributes.position; + + if ( position ) { + + var center = this.boundingSphere.center; + + box.setFromBufferAttribute( position ); + box.getCenter( center ); + + // hoping to find a boundingSphere with a radius smaller than the + // boundingSphere of the boundingBox: sqrt(3) smaller in the best case + + var maxRadiusSq = 0; + + for ( var i = 0, il = position.count; i < il; i ++ ) { + + vector.x = position.getX( i ); + vector.y = position.getY( i ); + vector.z = position.getZ( i ); + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) ); + + } + + this.boundingSphere.radius = Math.sqrt( maxRadiusSq ); + + if ( isNaN( this.boundingSphere.radius ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this ); + + } + + } + + }; + + }(), + + computeFaceNormals: function () { + + // backwards compatibility + + }, + + computeVertexNormals: function () { + + var index = this.index; + var attributes = this.attributes; + + if ( attributes.position ) { + + var positions = attributes.position.array; + + if ( attributes.normal === undefined ) { + + this.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) ); + + } else { + + // reset existing normals to zero + + var array = attributes.normal.array; + + for ( var i = 0, il = array.length; i < il; i ++ ) { + + array[ i ] = 0; + + } + + } + + var normals = attributes.normal.array; + + var vA, vB, vC; + var pA = new Vector3(), pB = new Vector3(), pC = new Vector3(); + var cb = new Vector3(), ab = new Vector3(); + + // indexed elements + + if ( index ) { + + var indices = index.array; + + for ( var i = 0, il = index.count; i < il; i += 3 ) { + + vA = indices[ i + 0 ] * 3; + vB = indices[ i + 1 ] * 3; + vC = indices[ i + 2 ] * 3; + + pA.fromArray( positions, vA ); + pB.fromArray( positions, vB ); + pC.fromArray( positions, vC ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normals[ vA ] += cb.x; + normals[ vA + 1 ] += cb.y; + normals[ vA + 2 ] += cb.z; + + normals[ vB ] += cb.x; + normals[ vB + 1 ] += cb.y; + normals[ vB + 2 ] += cb.z; + + normals[ vC ] += cb.x; + normals[ vC + 1 ] += cb.y; + normals[ vC + 2 ] += cb.z; + + } + + } else { + + // non-indexed elements (unconnected triangle soup) + + for ( var i = 0, il = positions.length; i < il; i += 9 ) { + + pA.fromArray( positions, i ); + pB.fromArray( positions, i + 3 ); + pC.fromArray( positions, i + 6 ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normals[ i ] = cb.x; + normals[ i + 1 ] = cb.y; + normals[ i + 2 ] = cb.z; + + normals[ i + 3 ] = cb.x; + normals[ i + 4 ] = cb.y; + normals[ i + 5 ] = cb.z; + + normals[ i + 6 ] = cb.x; + normals[ i + 7 ] = cb.y; + normals[ i + 8 ] = cb.z; + + } + + } + + this.normalizeNormals(); + + attributes.normal.needsUpdate = true; + + } + + }, + + merge: function ( geometry, offset ) { + + if ( ! ( geometry && geometry.isBufferGeometry ) ) { + + console.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry ); + return; + + } + + if ( offset === undefined ) { + + offset = 0; + + console.warn( + 'THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. ' + + 'Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge.' + ); + + } + + var attributes = this.attributes; + + for ( var key in attributes ) { + + if ( geometry.attributes[ key ] === undefined ) continue; + + var attribute1 = attributes[ key ]; + var attributeArray1 = attribute1.array; + + var attribute2 = geometry.attributes[ key ]; + var attributeArray2 = attribute2.array; + + var attributeSize = attribute2.itemSize; + + for ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) { + + attributeArray1[ j ] = attributeArray2[ i ]; + + } + + } + + return this; + + }, + + normalizeNormals: function () { + + var vector = new Vector3(); + + return function normalizeNormals() { + + var normals = this.attributes.normal; + + for ( var i = 0, il = normals.count; i < il; i ++ ) { + + vector.x = normals.getX( i ); + vector.y = normals.getY( i ); + vector.z = normals.getZ( i ); + + vector.normalize(); + + normals.setXYZ( i, vector.x, vector.y, vector.z ); + + } + + }; + + }(), + + toNonIndexed: function () { + + if ( this.index === null ) { + + console.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' ); + return this; + + } + + var geometry2 = new BufferGeometry(); + + var indices = this.index.array; + var attributes = this.attributes; + + for ( var name in attributes ) { + + var attribute = attributes[ name ]; + + var array = attribute.array; + var itemSize = attribute.itemSize; + + var array2 = new array.constructor( indices.length * itemSize ); + + var index = 0, index2 = 0; + + for ( var i = 0, l = indices.length; i < l; i ++ ) { + + index = indices[ i ] * itemSize; + + for ( var j = 0; j < itemSize; j ++ ) { + + array2[ index2 ++ ] = array[ index ++ ]; + + } + + } + + geometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) ); + + } + + var groups = this.groups; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + geometry2.addGroup( group.start, group.count, group.materialIndex ); + + } + + return geometry2; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.5, + type: 'BufferGeometry', + generator: 'BufferGeometry.toJSON' + } + }; + + // standard BufferGeometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + if ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData; + + if ( this.parameters !== undefined ) { + + var parameters = this.parameters; + + for ( var key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + data.data = { attributes: {} }; + + var index = this.index; + + if ( index !== null ) { + + var array = Array.prototype.slice.call( index.array ); + + data.data.index = { + type: index.array.constructor.name, + array: array + }; + + } + + var attributes = this.attributes; + + for ( var key in attributes ) { + + var attribute = attributes[ key ]; + + var array = Array.prototype.slice.call( attribute.array ); + + data.data.attributes[ key ] = { + itemSize: attribute.itemSize, + type: attribute.array.constructor.name, + array: array, + normalized: attribute.normalized + }; + + } + + var groups = this.groups; + + if ( groups.length > 0 ) { + + data.data.groups = JSON.parse( JSON.stringify( groups ) ); + + } + + var boundingSphere = this.boundingSphere; + + if ( boundingSphere !== null ) { + + data.data.boundingSphere = { + center: boundingSphere.center.toArray(), + radius: boundingSphere.radius + }; + + } + + return data; + + }, + + clone: function () { + + /* + // Handle primitives + + var parameters = this.parameters; + + if ( parameters !== undefined ) { + + var values = []; + + for ( var key in parameters ) { + + values.push( parameters[ key ] ); + + } + + var geometry = Object.create( this.constructor.prototype ); + this.constructor.apply( geometry, values ); + return geometry; + + } + + return new this.constructor().copy( this ); + */ + + return new BufferGeometry().copy( this ); + + }, + + copy: function ( source ) { + + var name, i, l; + + // reset + + this.index = null; + this.attributes = {}; + this.morphAttributes = {}; + this.groups = []; + this.boundingBox = null; + this.boundingSphere = null; + + // name + + this.name = source.name; + + // index + + var index = source.index; + + if ( index !== null ) { + + this.setIndex( index.clone() ); + + } + + // attributes + + var attributes = source.attributes; + + for ( name in attributes ) { + + var attribute = attributes[ name ]; + this.addAttribute( name, attribute.clone() ); + + } + + // morph attributes + + var morphAttributes = source.morphAttributes; + + for ( name in morphAttributes ) { + + var array = []; + var morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes + + for ( i = 0, l = morphAttribute.length; i < l; i ++ ) { + + array.push( morphAttribute[ i ].clone() ); + + } + + this.morphAttributes[ name ] = array; + + } + + // groups + + var groups = source.groups; + + for ( i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + this.addGroup( group.start, group.count, group.materialIndex ); + + } + + // bounding box + + var boundingBox = source.boundingBox; + + if ( boundingBox !== null ) { + + this.boundingBox = boundingBox.clone(); + + } + + // bounding sphere + + var boundingSphere = source.boundingSphere; + + if ( boundingSphere !== null ) { + + this.boundingSphere = boundingSphere.clone(); + + } + + // draw range + + this.drawRange.start = source.drawRange.start; + this.drawRange.count = source.drawRange.count; + + // user data + + this.userData = source.userData; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // BoxGeometry + + function BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) { + + Geometry.call( this ); + + this.type = 'BoxGeometry'; + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + this.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) ); + this.mergeVertices(); + + } + + BoxGeometry.prototype = Object.create( Geometry.prototype ); + BoxGeometry.prototype.constructor = BoxGeometry; + + // BoxBufferGeometry + + function BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) { + + BufferGeometry.call( this ); + + this.type = 'BoxBufferGeometry'; + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + var scope = this; + + width = width || 1; + height = height || 1; + depth = depth || 1; + + // segments + + widthSegments = Math.floor( widthSegments ) || 1; + heightSegments = Math.floor( heightSegments ) || 1; + depthSegments = Math.floor( depthSegments ) || 1; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var numberOfVertices = 0; + var 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( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + function buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) { + + var segmentWidth = width / gridX; + var segmentHeight = height / gridY; + + var widthHalf = width / 2; + var heightHalf = height / 2; + var depthHalf = depth / 2; + + var gridX1 = gridX + 1; + var gridY1 = gridY + 1; + + var vertexCounter = 0; + var groupCount = 0; + + var ix, iy; + + var vector = new Vector3(); + + // generate vertices, normals and uvs + + for ( iy = 0; iy < gridY1; iy ++ ) { + + var y = iy * segmentHeight - heightHalf; + + for ( ix = 0; ix < gridX1; ix ++ ) { + + var 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 ( iy = 0; iy < gridY; iy ++ ) { + + for ( ix = 0; ix < gridX; ix ++ ) { + + var a = numberOfVertices + ix + gridX1 * iy; + var b = numberOfVertices + ix + gridX1 * ( iy + 1 ); + var c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 ); + var 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; + + } + + } + + BoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + BoxBufferGeometry.prototype.constructor = BoxBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // PlaneGeometry + + function PlaneGeometry( width, height, widthSegments, heightSegments ) { + + Geometry.call( this ); + + this.type = 'PlaneGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + this.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) ); + this.mergeVertices(); + + } + + PlaneGeometry.prototype = Object.create( Geometry.prototype ); + PlaneGeometry.prototype.constructor = PlaneGeometry; + + // PlaneBufferGeometry + + function PlaneBufferGeometry( width, height, widthSegments, heightSegments ) { + + BufferGeometry.call( this ); + + this.type = 'PlaneBufferGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + width = width || 1; + height = height || 1; + + var width_half = width / 2; + var height_half = height / 2; + + var gridX = Math.floor( widthSegments ) || 1; + var gridY = Math.floor( heightSegments ) || 1; + + var gridX1 = gridX + 1; + var gridY1 = gridY + 1; + + var segment_width = width / gridX; + var segment_height = height / gridY; + + var ix, iy; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // generate vertices, normals and uvs + + for ( iy = 0; iy < gridY1; iy ++ ) { + + var y = iy * segment_height - height_half; + + for ( ix = 0; ix < gridX1; ix ++ ) { + + var x = ix * segment_width - width_half; + + vertices.push( x, - y, 0 ); + + normals.push( 0, 0, 1 ); + + uvs.push( ix / gridX ); + uvs.push( 1 - ( iy / gridY ) ); + + } + + } + + // indices + + for ( iy = 0; iy < gridY; iy ++ ) { + + for ( ix = 0; ix < gridX; ix ++ ) { + + var a = ix + gridX1 * iy; + var b = ix + gridX1 * ( iy + 1 ); + var c = ( ix + 1 ) + gridX1 * ( iy + 1 ); + var d = ( ix + 1 ) + gridX1 * iy; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + PlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + PlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + var materialId = 0; + + function Material() { + + Object.defineProperty( this, 'id', { value: materialId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Material'; + + this.fog = true; + this.lights = true; + + this.blending = NormalBlending; + this.side = FrontSide; + this.flatShading = false; + this.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors + + this.opacity = 1; + this.transparent = false; + + this.blendSrc = SrcAlphaFactor; + this.blendDst = OneMinusSrcAlphaFactor; + this.blendEquation = AddEquation; + this.blendSrcAlpha = null; + this.blendDstAlpha = null; + this.blendEquationAlpha = null; + + this.depthFunc = LessEqualDepth; + this.depthTest = true; + this.depthWrite = true; + + this.clippingPlanes = null; + this.clipIntersection = false; + this.clipShadows = false; + + this.shadowSide = null; + + this.colorWrite = true; + + this.precision = null; // override the renderer's default precision for this material + + this.polygonOffset = false; + this.polygonOffsetFactor = 0; + this.polygonOffsetUnits = 0; + + this.dithering = false; + + this.alphaTest = 0; + this.premultipliedAlpha = false; + + this.visible = true; + + this.userData = {}; + + this.needsUpdate = true; + + } + + Material.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: Material, + + isMaterial: true, + + onBeforeCompile: function () {}, + + setValues: function ( values ) { + + if ( values === undefined ) return; + + for ( var key in values ) { + + var newValue = values[ key ]; + + if ( newValue === undefined ) { + + console.warn( "THREE.Material: '" + key + "' parameter is undefined." ); + continue; + + } + + // for backward compatability if shading is set in the constructor + if ( key === 'shading' ) { + + console.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' ); + this.flatShading = ( newValue === FlatShading ) ? true : false; + continue; + + } + + var currentValue = this[ key ]; + + if ( currentValue === undefined ) { + + console.warn( "THREE." + this.type + ": '" + key + "' is not a property of this material." ); + continue; + + } + + if ( currentValue && currentValue.isColor ) { + + currentValue.set( newValue ); + + } else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) { + + currentValue.copy( newValue ); + + } else { + + this[ key ] = newValue; + + } + + } + + }, + + toJSON: function ( meta ) { + + var isRoot = ( meta === undefined || typeof meta === 'string' ); + + if ( isRoot ) { + + meta = { + textures: {}, + images: {} + }; + + } + + var data = { + metadata: { + version: 4.5, + type: 'Material', + generator: 'Material.toJSON' + } + }; + + // standard Material serialization + data.uuid = this.uuid; + data.type = this.type; + + if ( this.name !== '' ) data.name = this.name; + + if ( this.color && this.color.isColor ) data.color = this.color.getHex(); + + if ( this.roughness !== undefined ) data.roughness = this.roughness; + if ( this.metalness !== undefined ) data.metalness = this.metalness; + + if ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex(); + if ( this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity; + + if ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex(); + if ( this.shininess !== undefined ) data.shininess = this.shininess; + if ( this.clearCoat !== undefined ) data.clearCoat = this.clearCoat; + if ( this.clearCoatRoughness !== undefined ) data.clearCoatRoughness = this.clearCoatRoughness; + + if ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid; + if ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid; + if ( this.lightMap && this.lightMap.isTexture ) data.lightMap = this.lightMap.toJSON( meta ).uuid; + + if ( this.aoMap && this.aoMap.isTexture ) { + + data.aoMap = this.aoMap.toJSON( meta ).uuid; + data.aoMapIntensity = this.aoMapIntensity; + + } + + if ( this.bumpMap && this.bumpMap.isTexture ) { + + data.bumpMap = this.bumpMap.toJSON( meta ).uuid; + data.bumpScale = this.bumpScale; + + } + + if ( this.normalMap && this.normalMap.isTexture ) { + + data.normalMap = this.normalMap.toJSON( meta ).uuid; + data.normalMapType = this.normalMapType; + data.normalScale = this.normalScale.toArray(); + + } + + if ( this.displacementMap && this.displacementMap.isTexture ) { + + data.displacementMap = this.displacementMap.toJSON( meta ).uuid; + data.displacementScale = this.displacementScale; + data.displacementBias = this.displacementBias; + + } + + if ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid; + if ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid; + + if ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid; + if ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid; + + if ( this.envMap && this.envMap.isTexture ) { + + data.envMap = this.envMap.toJSON( meta ).uuid; + data.reflectivity = this.reflectivity; // Scale behind envMap + + if ( this.combine !== undefined ) data.combine = this.combine; + if ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity; + + } + + if ( this.gradientMap && this.gradientMap.isTexture ) { + + data.gradientMap = this.gradientMap.toJSON( meta ).uuid; + + } + + if ( this.size !== undefined ) data.size = this.size; + if ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation; + + if ( this.blending !== NormalBlending ) data.blending = this.blending; + if ( this.flatShading === true ) data.flatShading = this.flatShading; + if ( this.side !== FrontSide ) data.side = this.side; + if ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors; + + if ( this.opacity < 1 ) data.opacity = this.opacity; + if ( this.transparent === true ) data.transparent = this.transparent; + + data.depthFunc = this.depthFunc; + data.depthTest = this.depthTest; + data.depthWrite = this.depthWrite; + + // rotation (SpriteMaterial) + if ( this.rotation !== 0 ) data.rotation = this.rotation; + + if ( this.polygonOffset === true ) data.polygonOffset = true; + if ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor; + if ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits; + + if ( this.linewidth !== 1 ) data.linewidth = this.linewidth; + if ( this.dashSize !== undefined ) data.dashSize = this.dashSize; + if ( this.gapSize !== undefined ) data.gapSize = this.gapSize; + if ( this.scale !== undefined ) data.scale = this.scale; + + if ( this.dithering === true ) data.dithering = true; + + if ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest; + if ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha; + + if ( this.wireframe === true ) data.wireframe = this.wireframe; + if ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth; + if ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap; + if ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin; + + if ( this.morphTargets === true ) data.morphTargets = true; + if ( this.skinning === true ) data.skinning = true; + + if ( this.visible === false ) data.visible = false; + if ( JSON.stringify( this.userData ) !== '{}' ) data.userData = this.userData; + + // TODO: Copied from Object3D.toJSON + + function extractFromCache( cache ) { + + var values = []; + + for ( var key in cache ) { + + var data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + + return values; + + } + + if ( isRoot ) { + + var textures = extractFromCache( meta.textures ); + var images = extractFromCache( meta.images ); + + if ( textures.length > 0 ) data.textures = textures; + if ( images.length > 0 ) data.images = images; + + } + + return data; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.name = source.name; + + this.fog = source.fog; + this.lights = source.lights; + + this.blending = source.blending; + this.side = source.side; + this.flatShading = source.flatShading; + this.vertexColors = source.vertexColors; + + this.opacity = source.opacity; + this.transparent = source.transparent; + + 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.depthFunc = source.depthFunc; + this.depthTest = source.depthTest; + this.depthWrite = source.depthWrite; + + this.colorWrite = source.colorWrite; + + this.precision = source.precision; + + this.polygonOffset = source.polygonOffset; + this.polygonOffsetFactor = source.polygonOffsetFactor; + this.polygonOffsetUnits = source.polygonOffsetUnits; + + this.dithering = source.dithering; + + this.alphaTest = source.alphaTest; + this.premultipliedAlpha = source.premultipliedAlpha; + + this.visible = source.visible; + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + this.clipShadows = source.clipShadows; + this.clipIntersection = source.clipIntersection; + + var srcPlanes = source.clippingPlanes, + dstPlanes = null; + + if ( srcPlanes !== null ) { + + var n = srcPlanes.length; + dstPlanes = new Array( n ); + + for ( var i = 0; i !== n; ++ i ) + dstPlanes[ i ] = srcPlanes[ i ].clone(); + + } + + this.clippingPlanes = dstPlanes; + + this.shadowSide = source.shadowSide; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * defines: { "label" : "value" }, + * uniforms: { "parameter1": { value: 1.0 }, "parameter2": { value2: 2 } }, + * + * fragmentShader: , + * vertexShader: , + * + * wireframe: , + * wireframeLinewidth: , + * + * lights: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function ShaderMaterial( parameters ) { + + Material.call( this ); + + this.type = 'ShaderMaterial'; + + this.defines = {}; + this.uniforms = {}; + + this.vertexShader = 'void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}'; + this.fragmentShader = 'void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}'; + + this.linewidth = 1; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; // set to use scene fog + this.lights = false; // set to use scene lights + this.clipping = false; // set to use user-defined clipping planes + + this.skinning = false; // set to use skinning attribute streams + this.morphTargets = false; // set to use morph targets + this.morphNormals = false; // set to use morph normals + + this.extensions = { + derivatives: false, // set to use derivatives + fragDepth: false, // set to use fragment depth values + drawBuffers: false, // set to use draw buffers + shaderTextureLOD: false // set to use shader texture LOD + }; + + // When rendered geometry doesn't include these attributes but the material does, + // use these default values in WebGL. This avoids errors when buffer data is missing. + this.defaultAttributeValues = { + 'color': [ 1, 1, 1 ], + 'uv': [ 0, 0 ], + 'uv2': [ 0, 0 ] + }; + + this.index0AttributeName = undefined; + this.uniformsNeedUpdate = false; + + if ( parameters !== undefined ) { + + if ( parameters.attributes !== undefined ) { + + console.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' ); + + } + + this.setValues( parameters ); + + } + + } + + ShaderMaterial.prototype = Object.create( Material.prototype ); + ShaderMaterial.prototype.constructor = ShaderMaterial; + + ShaderMaterial.prototype.isShaderMaterial = true; + + ShaderMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.fragmentShader = source.fragmentShader; + this.vertexShader = source.vertexShader; + + this.uniforms = UniformsUtils.clone( source.uniforms ); + + this.defines = Object.assign( {}, source.defines ); + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.lights = source.lights; + this.clipping = source.clipping; + + this.skinning = source.skinning; + + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + this.extensions = source.extensions; + + return this; + + }; + + ShaderMaterial.prototype.toJSON = function ( meta ) { + + var data = Material.prototype.toJSON.call( this, meta ); + + data.uniforms = {}; + + for ( var name in this.uniforms ) { + + var uniform = this.uniforms[ name ]; + var value = uniform.value; + + if ( value.isTexture ) { + + data.uniforms[ name ] = { + type: 't', + value: value.toJSON( meta ).uuid + }; + + } else if ( value.isColor ) { + + data.uniforms[ name ] = { + type: 'c', + value: value.getHex() + }; + + } else if ( value.isVector2 ) { + + data.uniforms[ name ] = { + type: 'v2', + value: value.toArray() + }; + + } else if ( value.isVector3 ) { + + data.uniforms[ name ] = { + type: 'v3', + value: value.toArray() + }; + + } else if ( value.isVector4 ) { + + data.uniforms[ name ] = { + type: 'v4', + value: value.toArray() + }; + + } else if ( value.isMatrix4 ) { + + data.uniforms[ name ] = { + type: 'm4', + value: value.toArray() + }; + + } else { + + data.uniforms[ name ] = { + value: value + }; + + // note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far + + } + + } + + if ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines; + + data.vertexShader = this.vertexShader; + data.fragmentShader = this.fragmentShader; + + return data; + + }; + + /** + * @author bhouston / http://clara.io + */ + + function Ray( origin, direction ) { + + this.origin = ( origin !== undefined ) ? origin : new Vector3(); + this.direction = ( direction !== undefined ) ? direction : new Vector3(); + + } + + Object.assign( Ray.prototype, { + + set: function ( origin, direction ) { + + this.origin.copy( origin ); + this.direction.copy( direction ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( ray ) { + + this.origin.copy( ray.origin ); + this.direction.copy( ray.direction ); + + return this; + + }, + + at: function ( t, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Ray: .at() target is now required' ); + target = new Vector3(); + + } + + return target.copy( this.direction ).multiplyScalar( t ).add( this.origin ); + + }, + + lookAt: function ( v ) { + + this.direction.copy( v ).sub( this.origin ).normalize(); + + return this; + + }, + + recast: function () { + + var v1 = new Vector3(); + + return function recast( t ) { + + this.origin.copy( this.at( t, v1 ) ); + + return this; + + }; + + }(), + + closestPointToPoint: function ( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Ray: .closestPointToPoint() target is now required' ); + target = new Vector3(); + + } + + target.subVectors( point, this.origin ); + + var directionDistance = target.dot( this.direction ); + + if ( directionDistance < 0 ) { + + return target.copy( this.origin ); + + } + + return target.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + }, + + distanceToPoint: function ( point ) { + + return Math.sqrt( this.distanceSqToPoint( point ) ); + + }, + + distanceSqToPoint: function () { + + var v1 = new Vector3(); + + return function distanceSqToPoint( point ) { + + var directionDistance = v1.subVectors( point, this.origin ).dot( this.direction ); + + // point behind the ray + + if ( directionDistance < 0 ) { + + return this.origin.distanceToSquared( point ); + + } + + v1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + return v1.distanceToSquared( point ); + + }; + + }(), + + distanceSqToSegment: function () { + + var segCenter = new Vector3(); + var segDir = new Vector3(); + var diff = new Vector3(); + + return function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) { + + // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h + // It returns the min distance between the ray and the segment + // defined by v0 and v1 + // It can also set two optional targets : + // - The closest point on the ray + // - The closest point on the segment + + segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 ); + segDir.copy( v1 ).sub( v0 ).normalize(); + diff.copy( this.origin ).sub( segCenter ); + + var segExtent = v0.distanceTo( v1 ) * 0.5; + var a01 = - this.direction.dot( segDir ); + var b0 = diff.dot( this.direction ); + var b1 = - diff.dot( segDir ); + var c = diff.lengthSq(); + var det = Math.abs( 1 - a01 * a01 ); + var s0, s1, sqrDist, extDet; + + if ( det > 0 ) { + + // The ray and segment are not parallel. + + s0 = a01 * b1 - b0; + s1 = a01 * b0 - b1; + extDet = segExtent * det; + + if ( s0 >= 0 ) { + + if ( s1 >= - extDet ) { + + if ( s1 <= extDet ) { + + // region 0 + // Minimum at interior points of ray and segment. + + var invDet = 1 / det; + s0 *= invDet; + s1 *= invDet; + sqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c; + + } else { + + // region 1 + + s1 = segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + // region 5 + + s1 = - segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + if ( s1 <= - extDet ) { + + // region 4 + + s0 = Math.max( 0, - ( - a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } else if ( s1 <= extDet ) { + + // region 3 + + s0 = 0; + s1 = Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = s1 * ( s1 + 2 * b1 ) + c; + + } else { + + // region 2 + + s0 = Math.max( 0, - ( a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } + + } else { + + // Ray and segment are parallel. + + s1 = ( a01 > 0 ) ? - segExtent : segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + if ( optionalPointOnRay ) { + + optionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin ); + + } + + if ( optionalPointOnSegment ) { + + optionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter ); + + } + + return sqrDist; + + }; + + }(), + + intersectSphere: function () { + + var v1 = new Vector3(); + + return function intersectSphere( sphere, target ) { + + v1.subVectors( sphere.center, this.origin ); + var tca = v1.dot( this.direction ); + var d2 = v1.dot( v1 ) - tca * tca; + var radius2 = sphere.radius * sphere.radius; + + if ( d2 > radius2 ) return null; + + var thc = Math.sqrt( radius2 - d2 ); + + // t0 = first intersect point - entrance on front of sphere + var t0 = tca - thc; + + // t1 = second intersect point - exit point on back of sphere + var 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 ); + + }; + + }(), + + intersectsSphere: function ( sphere ) { + + return this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius ); + + }, + + distanceToPlane: function ( plane ) { + + var 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; + + } + + var t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator; + + // Return if the ray never intersects the plane + + return t >= 0 ? t : null; + + }, + + intersectPlane: function ( plane, target ) { + + var t = this.distanceToPlane( plane ); + + if ( t === null ) { + + return null; + + } + + return this.at( t, target ); + + }, + + intersectsPlane: function ( plane ) { + + // check if the ray lies on the plane first + + var distToPoint = plane.distanceToPoint( this.origin ); + + if ( distToPoint === 0 ) { + + return true; + + } + + var 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; + + }, + + intersectBox: function ( box, target ) { + + var tmin, tmax, tymin, tymax, tzmin, tzmax; + + var invdirx = 1 / this.direction.x, + invdiry = 1 / this.direction.y, + invdirz = 1 / this.direction.z; + + var 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 ); + + }, + + intersectsBox: ( function () { + + var v = new Vector3(); + + return function intersectsBox( box ) { + + return this.intersectBox( box, v ) !== null; + + }; + + } )(), + + intersectTriangle: function () { + + // Compute the offset origin, edges, and normal. + var diff = new Vector3(); + var edge1 = new Vector3(); + var edge2 = new Vector3(); + var normal = new Vector3(); + + return function intersectTriangle( a, b, c, backfaceCulling, target ) { + + // from http://www.geometrictools.com/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) + var DdN = this.direction.dot( normal ); + var 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 ); + var DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) ); + + // b1 < 0, no intersection + if ( DdQxE2 < 0 ) { + + return null; + + } + + var 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. + var QdN = - sign * diff.dot( normal ); + + // t < 0, no intersection + if ( QdN < 0 ) { + + return null; + + } + + // Ray intersects triangle. + return this.at( QdN / DdN, target ); + + }; + + }(), + + applyMatrix4: function ( matrix4 ) { + + this.origin.applyMatrix4( matrix4 ); + this.direction.transformDirection( matrix4 ); + + return this; + + }, + + equals: function ( ray ) { + + return ray.origin.equals( this.origin ) && ray.direction.equals( this.direction ); + + } + + } ); + + /** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + + function Triangle( a, b, c ) { + + this.a = ( a !== undefined ) ? a : new Vector3(); + this.b = ( b !== undefined ) ? b : new Vector3(); + this.c = ( c !== undefined ) ? c : new Vector3(); + + } + + Object.assign( Triangle, { + + getNormal: function () { + + var v0 = new Vector3(); + + return function getNormal( a, b, c, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .getNormal() target is now required' ); + target = new Vector3(); + + } + + target.subVectors( c, b ); + v0.subVectors( a, b ); + target.cross( v0 ); + + var targetLengthSq = target.lengthSq(); + if ( targetLengthSq > 0 ) { + + return target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) ); + + } + + return target.set( 0, 0, 0 ); + + }; + + }(), + + // static/instance method to calculate barycentric coordinates + // based on: http://www.blackpawn.com/texts/pointinpoly/default.html + getBarycoord: function () { + + var v0 = new Vector3(); + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function getBarycoord( point, a, b, c, target ) { + + v0.subVectors( c, a ); + v1.subVectors( b, a ); + v2.subVectors( point, a ); + + 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 denom = ( dot00 * dot11 - dot01 * dot01 ); + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .getBarycoord() target is now required' ); + 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 target.set( - 2, - 1, - 1 ); + + } + + var invDenom = 1 / denom; + var u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom; + var v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom; + + // barycentric coordinates must always sum to 1 + return target.set( 1 - u - v, v, u ); + + }; + + }(), + + containsPoint: function () { + + var v1 = new Vector3(); + + return function containsPoint( point, a, b, c ) { + + Triangle.getBarycoord( point, a, b, c, v1 ); + + return ( v1.x >= 0 ) && ( v1.y >= 0 ) && ( ( v1.x + v1.y ) <= 1 ); + + }; + + }(), + + getUV: function () { + + var barycoord = new Vector3(); + + return function getUV( point, p1, p2, p3, uv1, uv2, uv3, target ) { + + this.getBarycoord( point, p1, p2, p3, barycoord ); + + target.set( 0, 0 ); + target.addScaledVector( uv1, barycoord.x ); + target.addScaledVector( uv2, barycoord.y ); + target.addScaledVector( uv3, barycoord.z ); + + return target; + + }; + + }() + + } ); + + Object.assign( Triangle.prototype, { + + set: function ( a, b, c ) { + + this.a.copy( a ); + this.b.copy( b ); + this.c.copy( c ); + + return this; + + }, + + setFromPointsAndIndices: function ( points, i0, i1, i2 ) { + + this.a.copy( points[ i0 ] ); + this.b.copy( points[ i1 ] ); + this.c.copy( points[ i2 ] ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( triangle ) { + + this.a.copy( triangle.a ); + this.b.copy( triangle.b ); + this.c.copy( triangle.c ); + + return this; + + }, + + getArea: function () { + + var v0 = new Vector3(); + var v1 = new Vector3(); + + return function getArea() { + + v0.subVectors( this.c, this.b ); + v1.subVectors( this.a, this.b ); + + return v0.cross( v1 ).length() * 0.5; + + }; + + }(), + + getMidpoint: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .getMidpoint() target is now required' ); + target = new Vector3(); + + } + + return target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 ); + + }, + + getNormal: function ( target ) { + + return Triangle.getNormal( this.a, this.b, this.c, target ); + + }, + + getPlane: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .getPlane() target is now required' ); + target = new Vector3(); + + } + + return target.setFromCoplanarPoints( this.a, this.b, this.c ); + + }, + + getBarycoord: function ( point, target ) { + + return Triangle.getBarycoord( point, this.a, this.b, this.c, target ); + + }, + + containsPoint: function ( point ) { + + return Triangle.containsPoint( point, this.a, this.b, this.c ); + + }, + + getUV: function ( point, uv1, uv2, uv3, result ) { + + return Triangle.getUV( point, this.a, this.b, this.c, uv1, uv2, uv3, result ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsTriangle( this ); + + }, + + closestPointToPoint: function () { + + var vab = new Vector3(); + var vac = new Vector3(); + var vbc = new Vector3(); + var vap = new Vector3(); + var vbp = new Vector3(); + var vcp = new Vector3(); + + return function closestPointToPoint( p, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .closestPointToPoint() target is now required' ); + target = new Vector3(); + + } + + var a = this.a, b = this.b, c = this.c; + var v, w; + + // algorithm thanks to Real-Time Collision Detection by Christer Ericson, + // published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc., + // under the accompanying license; see chapter 5.1.5 for detailed explanation. + // basically, we're distinguishing which of the voronoi regions of the triangle + // the point lies in with the minimum amount of redundant computation. + + vab.subVectors( b, a ); + vac.subVectors( c, a ); + vap.subVectors( p, a ); + var d1 = vab.dot( vap ); + var d2 = vac.dot( vap ); + if ( d1 <= 0 && d2 <= 0 ) { + + // vertex region of A; barycentric coords (1, 0, 0) + return target.copy( a ); + + } + + vbp.subVectors( p, b ); + var d3 = vab.dot( vbp ); + var d4 = vac.dot( vbp ); + if ( d3 >= 0 && d4 <= d3 ) { + + // vertex region of B; barycentric coords (0, 1, 0) + return target.copy( b ); + + } + + var vc = d1 * d4 - d3 * d2; + if ( vc <= 0 && d1 >= 0 && d3 <= 0 ) { + + v = d1 / ( d1 - d3 ); + // edge region of AB; barycentric coords (1-v, v, 0) + return target.copy( a ).addScaledVector( vab, v ); + + } + + vcp.subVectors( p, c ); + var d5 = vab.dot( vcp ); + var d6 = vac.dot( vcp ); + if ( d6 >= 0 && d5 <= d6 ) { + + // vertex region of C; barycentric coords (0, 0, 1) + return target.copy( c ); + + } + + var vb = d5 * d2 - d1 * d6; + if ( vb <= 0 && d2 >= 0 && d6 <= 0 ) { + + w = d2 / ( d2 - d6 ); + // edge region of AC; barycentric coords (1-w, 0, w) + return target.copy( a ).addScaledVector( vac, w ); + + } + + var va = d3 * d6 - d5 * d4; + if ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) { + + vbc.subVectors( c, b ); + w = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) ); + // edge region of BC; barycentric coords (0, 1-w, w) + return target.copy( b ).addScaledVector( vbc, w ); // edge region of BC + + } + + // face region + var denom = 1 / ( va + vb + vc ); + // u = va * denom + v = vb * denom; + w = vc * denom; + return target.copy( a ).addScaledVector( vab, v ).addScaledVector( vac, w ); + + }; + + }(), + + equals: function ( triangle ) { + + return triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * depthTest: , + * depthWrite: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: + * } + */ + + function MeshBasicMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshBasicMaterial'; + + this.color = new Color( 0xffffff ); // emissive + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + + this.lights = false; + + this.setValues( parameters ); + + } + + MeshBasicMaterial.prototype = Object.create( Material.prototype ); + MeshBasicMaterial.prototype.constructor = MeshBasicMaterial; + + MeshBasicMaterial.prototype.isMeshBasicMaterial = true; + + MeshBasicMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author jonobr1 / http://jonobr1.com/ + */ + + function Mesh( geometry, material ) { + + Object3D.call( this ); + + this.type = 'Mesh'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } ); + + this.drawMode = TrianglesDrawMode; + + this.updateMorphTargets(); + + } + + Mesh.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Mesh, + + isMesh: true, + + setDrawMode: function ( value ) { + + this.drawMode = value; + + }, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.drawMode = source.drawMode; + + if ( source.morphTargetInfluences !== undefined ) { + + this.morphTargetInfluences = source.morphTargetInfluences.slice(); + + } + + if ( source.morphTargetDictionary !== undefined ) { + + this.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary ); + + } + + return this; + + }, + + updateMorphTargets: function () { + + var geometry = this.geometry; + var m, ml, name; + + if ( geometry.isBufferGeometry ) { + + var morphAttributes = geometry.morphAttributes; + var keys = Object.keys( morphAttributes ); + + if ( keys.length > 0 ) { + + var morphAttribute = morphAttributes[ keys[ 0 ] ]; + + if ( morphAttribute !== undefined ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( m = 0, ml = morphAttribute.length; m < ml; m ++ ) { + + name = morphAttribute[ m ].name || String( m ); + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ name ] = m; + + } + + } + + } + + } else { + + var morphTargets = geometry.morphTargets; + + if ( morphTargets !== undefined && morphTargets.length > 0 ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( m = 0, ml = morphTargets.length; m < ml; m ++ ) { + + name = morphTargets[ m ].name || String( m ); + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ name ] = m; + + } + + } + + } + + }, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + var vA = new Vector3(); + var vB = new Vector3(); + var vC = new Vector3(); + + var tempA = new Vector3(); + var tempB = new Vector3(); + var tempC = new Vector3(); + + var uvA = new Vector2(); + var uvB = new Vector2(); + var uvC = new Vector2(); + + var intersectionPoint = new Vector3(); + var intersectionPointWorld = new Vector3(); + + function checkIntersection( object, material, raycaster, ray, pA, pB, pC, point ) { + + var intersect; + + if ( material.side === BackSide ) { + + intersect = ray.intersectTriangle( pC, pB, pA, true, point ); + + } else { + + intersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point ); + + } + + if ( intersect === null ) return null; + + intersectionPointWorld.copy( point ); + intersectionPointWorld.applyMatrix4( object.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( intersectionPointWorld ); + + if ( distance < raycaster.near || distance > raycaster.far ) return null; + + return { + distance: distance, + point: intersectionPointWorld.clone(), + object: object + }; + + } + + function checkBufferGeometryIntersection( object, material, raycaster, ray, position, uv, a, b, c ) { + + vA.fromBufferAttribute( position, a ); + vB.fromBufferAttribute( position, b ); + vC.fromBufferAttribute( position, c ); + + var intersection = checkIntersection( object, material, raycaster, ray, vA, vB, vC, intersectionPoint ); + + if ( intersection ) { + + if ( uv ) { + + uvA.fromBufferAttribute( uv, a ); + uvB.fromBufferAttribute( uv, b ); + uvC.fromBufferAttribute( uv, c ); + + intersection.uv = Triangle.getUV( intersectionPoint, vA, vB, vC, uvA, uvB, uvC, new Vector2() ); + + } + + var face = new Face3( a, b, c ); + Triangle.getNormal( vA, vB, vC, face.normal ); + + intersection.face = face; + + } + + return intersection; + + } + + return function raycast( raycaster, intersects ) { + + var geometry = this.geometry; + var material = this.material; + var matrixWorld = this.matrixWorld; + + if ( material === undefined ) return; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + // Check boundingBox before continuing + + if ( geometry.boundingBox !== null ) { + + if ( ray.intersectsBox( geometry.boundingBox ) === false ) return; + + } + + var intersection; + + if ( geometry.isBufferGeometry ) { + + var a, b, c; + var index = geometry.index; + var position = geometry.attributes.position; + var uv = geometry.attributes.uv; + var groups = geometry.groups; + var drawRange = geometry.drawRange; + var i, j, il, jl; + var group, groupMaterial; + var start, end; + + if ( index !== null ) { + + // indexed buffer geometry + + if ( Array.isArray( material ) ) { + + for ( i = 0, il = groups.length; i < il; i ++ ) { + + group = groups[ i ]; + groupMaterial = material[ group.materialIndex ]; + + start = Math.max( group.start, drawRange.start ); + end = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ); + + for ( j = start, jl = end; j < jl; j += 3 ) { + + a = index.getX( j ); + b = index.getX( j + 1 ); + c = index.getX( j + 2 ); + + intersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, ray, position, uv, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } else { + + start = Math.max( 0, drawRange.start ); + end = Math.min( index.count, ( drawRange.start + drawRange.count ) ); + + for ( i = start, il = end; i < il; i += 3 ) { + + a = index.getX( i ); + b = index.getX( i + 1 ); + c = index.getX( i + 2 ); + + intersection = checkBufferGeometryIntersection( this, material, raycaster, ray, position, uv, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } else if ( position !== undefined ) { + + // non-indexed buffer geometry + + if ( Array.isArray( material ) ) { + + for ( i = 0, il = groups.length; i < il; i ++ ) { + + group = groups[ i ]; + groupMaterial = material[ group.materialIndex ]; + + start = Math.max( group.start, drawRange.start ); + end = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ); + + for ( j = start, jl = end; j < jl; j += 3 ) { + + a = j; + b = j + 1; + c = j + 2; + + intersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, ray, position, uv, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } else { + + start = Math.max( 0, drawRange.start ); + end = Math.min( position.count, ( drawRange.start + drawRange.count ) ); + + for ( i = start, il = end; i < il; i += 3 ) { + + a = i; + b = i + 1; + c = i + 2; + + intersection = checkBufferGeometryIntersection( this, material, raycaster, ray, position, uv, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } + + } else if ( geometry.isGeometry ) { + + var fvA, fvB, fvC; + var isMultiMaterial = Array.isArray( material ); + + var vertices = geometry.vertices; + var faces = geometry.faces; + var uvs; + + var faceVertexUvs = geometry.faceVertexUvs[ 0 ]; + if ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs; + + for ( var f = 0, fl = faces.length; f < fl; f ++ ) { + + var face = faces[ f ]; + var faceMaterial = isMultiMaterial ? material[ face.materialIndex ] : material; + + if ( faceMaterial === undefined ) continue; + + fvA = vertices[ face.a ]; + fvB = vertices[ face.b ]; + fvC = vertices[ face.c ]; + + if ( faceMaterial.morphTargets === true ) { + + var morphTargets = geometry.morphTargets; + var morphInfluences = this.morphTargetInfluences; + + vA.set( 0, 0, 0 ); + vB.set( 0, 0, 0 ); + vC.set( 0, 0, 0 ); + + for ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) { + + var influence = morphInfluences[ t ]; + + if ( influence === 0 ) continue; + + var targets = morphTargets[ t ].vertices; + + vA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence ); + vB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence ); + vC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence ); + + } + + vA.add( fvA ); + vB.add( fvB ); + vC.add( fvC ); + + fvA = vA; + fvB = vB; + fvC = vC; + + } + + intersection = checkIntersection( this, faceMaterial, raycaster, ray, fvA, fvB, fvC, intersectionPoint ); + + if ( intersection ) { + + if ( uvs && uvs[ f ] ) { + + var uvs_f = uvs[ f ]; + uvA.copy( uvs_f[ 0 ] ); + uvB.copy( uvs_f[ 1 ] ); + uvC.copy( uvs_f[ 2 ] ); + + intersection.uv = Triangle.getUV( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC, new Vector2() ); + + } + + intersection.face = face; + intersection.faceIndex = f; + intersects.push( intersection ); + + } + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLBackground( renderer, state, objects, premultipliedAlpha ) { + + var clearColor = new Color( 0x000000 ); + var clearAlpha = 0; + + var planeMesh; + var boxMesh; + + function render( renderList, scene, camera, forceClear ) { + + var background = scene.background; + + if ( background === null ) { + + setClear( clearColor, clearAlpha ); + + } else if ( background && background.isColor ) { + + setClear( background, 1 ); + forceClear = true; + + } + + if ( renderer.autoClear || forceClear ) { + + renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil ); + + } + + if ( background && ( background.isCubeTexture || background.isWebGLRenderTargetCube ) ) { + + if ( boxMesh === undefined ) { + + boxMesh = new Mesh( + new BoxBufferGeometry( 1, 1, 1 ), + new ShaderMaterial( { + uniforms: UniformsUtils.clone( ShaderLib.cube.uniforms ), + vertexShader: ShaderLib.cube.vertexShader, + fragmentShader: ShaderLib.cube.fragmentShader, + side: BackSide, + depthTest: true, + depthWrite: false, + fog: false + } ) + ); + + boxMesh.geometry.removeAttribute( 'normal' ); + boxMesh.geometry.removeAttribute( 'uv' ); + + boxMesh.onBeforeRender = function ( renderer, scene, camera ) { + + this.matrixWorld.copyPosition( camera.matrixWorld ); + + }; + + objects.update( boxMesh ); + + } + + boxMesh.material.uniforms.tCube.value = ( background.isWebGLRenderTargetCube ) ? background.texture : background; + boxMesh.material.uniforms.tFlip.value = ( background.isWebGLRenderTargetCube ) ? 1 : - 1; + + // push to the pre-sorted opaque render list + renderList.push( boxMesh, boxMesh.geometry, boxMesh.material, 0, null ); + + } else if ( background && background.isTexture ) { + + if ( planeMesh === undefined ) { + + planeMesh = new Mesh( + new PlaneBufferGeometry( 2, 2 ), + new ShaderMaterial( { + uniforms: UniformsUtils.clone( ShaderLib.background.uniforms ), + vertexShader: ShaderLib.background.vertexShader, + fragmentShader: ShaderLib.background.fragmentShader, + side: FrontSide, + depthTest: true, + depthWrite: false, + fog: false + } ) + ); + + planeMesh.geometry.removeAttribute( 'normal' ); + + objects.update( planeMesh ); + + } + + planeMesh.material.uniforms.t2D.value = background; + + // push to the pre-sorted opaque render list + renderList.push( planeMesh, planeMesh.geometry, planeMesh.material, 0, null ); + + } + + } + + function setClear( color, alpha ) { + + state.buffers.color.setClear( color.r, color.g, color.b, alpha, premultipliedAlpha ); + + } + + return { + + getClearColor: function () { + + return clearColor; + + }, + setClearColor: function ( color, alpha ) { + + clearColor.set( color ); + clearAlpha = alpha !== undefined ? alpha : 1; + setClear( clearColor, clearAlpha ); + + }, + getClearAlpha: function () { + + return clearAlpha; + + }, + setClearAlpha: function ( alpha ) { + + clearAlpha = alpha; + setClear( clearColor, clearAlpha ); + + }, + render: render + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLBufferRenderer( gl, extensions, info, capabilities ) { + + var mode; + + function setMode( value ) { + + mode = value; + + } + + function render( start, count ) { + + gl.drawArrays( mode, start, count ); + + info.update( count, mode ); + + } + + function renderInstances( geometry, start, count ) { + + var extension; + + if ( capabilities.isWebGL2 ) { + + extension = gl; + + } else { + + extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + } + + extension[ capabilities.isWebGL2 ? 'drawArraysInstanced' : 'drawArraysInstancedANGLE' ]( mode, start, count, geometry.maxInstancedCount ); + + info.update( count, mode, geometry.maxInstancedCount ); + + } + + // + + this.setMode = setMode; + this.render = render; + this.renderInstances = renderInstances; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLCapabilities( gl, extensions, parameters ) { + + var maxAnisotropy; + + function getMaxAnisotropy() { + + if ( maxAnisotropy !== undefined ) return maxAnisotropy; + + var extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension !== null ) { + + maxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT ); + + } else { + + maxAnisotropy = 0; + + } + + return maxAnisotropy; + + } + + function getMaxPrecision( precision ) { + + if ( precision === 'highp' ) { + + if ( gl.getShaderPrecisionFormat( 35633, 36338 ).precision > 0 && + gl.getShaderPrecisionFormat( 35632, 36338 ).precision > 0 ) { + + return 'highp'; + + } + + precision = 'mediump'; + + } + + if ( precision === 'mediump' ) { + + if ( gl.getShaderPrecisionFormat( 35633, 36337 ).precision > 0 && + gl.getShaderPrecisionFormat( 35632, 36337 ).precision > 0 ) { + + return 'mediump'; + + } + + } + + return 'lowp'; + + } + + var isWebGL2 = typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext; + + var precision = parameters.precision !== undefined ? parameters.precision : 'highp'; + var maxPrecision = getMaxPrecision( precision ); + + if ( maxPrecision !== precision ) { + + console.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' ); + precision = maxPrecision; + + } + + var logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true; + + var maxTextures = gl.getParameter( 34930 ); + var maxVertexTextures = gl.getParameter( 35660 ); + var maxTextureSize = gl.getParameter( 3379 ); + var maxCubemapSize = gl.getParameter( 34076 ); + + var maxAttributes = gl.getParameter( 34921 ); + var maxVertexUniforms = gl.getParameter( 36347 ); + var maxVaryings = gl.getParameter( 36348 ); + var maxFragmentUniforms = gl.getParameter( 36349 ); + + var vertexTextures = maxVertexTextures > 0; + var floatFragmentTextures = isWebGL2 || !! extensions.get( 'OES_texture_float' ); + var floatVertexTextures = vertexTextures && floatFragmentTextures; + + return { + + isWebGL2: isWebGL2, + + getMaxAnisotropy: getMaxAnisotropy, + getMaxPrecision: getMaxPrecision, + + precision: precision, + logarithmicDepthBuffer: logarithmicDepthBuffer, + + maxTextures: maxTextures, + maxVertexTextures: maxVertexTextures, + maxTextureSize: maxTextureSize, + maxCubemapSize: maxCubemapSize, + + maxAttributes: maxAttributes, + maxVertexUniforms: maxVertexUniforms, + maxVaryings: maxVaryings, + maxFragmentUniforms: maxFragmentUniforms, + + vertexTextures: vertexTextures, + floatFragmentTextures: floatFragmentTextures, + floatVertexTextures: floatVertexTextures + + }; + + } + + /** + * @author tschw + */ + + function WebGLClipping() { + + var scope = this, + + globalState = null, + numGlobalPlanes = 0, + localClippingEnabled = false, + renderingShadows = false, + + plane = new Plane(), + viewNormalMatrix = new Matrix3(), + + uniform = { value: null, needsUpdate: false }; + + this.uniform = uniform; + this.numPlanes = 0; + this.numIntersection = 0; + + this.init = function ( planes, enableLocalClipping, camera ) { + + var enabled = + planes.length !== 0 || + enableLocalClipping || + // enable state of previous frame - the clipping code has to + // run another frame in order to reset the state: + numGlobalPlanes !== 0 || + localClippingEnabled; + + localClippingEnabled = enableLocalClipping; + + globalState = projectPlanes( planes, camera, 0 ); + numGlobalPlanes = planes.length; + + return enabled; + + }; + + this.beginShadows = function () { + + renderingShadows = true; + projectPlanes( null ); + + }; + + this.endShadows = function () { + + renderingShadows = false; + resetGlobalState(); + + }; + + this.setState = function ( planes, clipIntersection, clipShadows, camera, cache, fromCache ) { + + if ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) { + + // there's no local clipping + + if ( renderingShadows ) { + + // there's no global clipping + + projectPlanes( null ); + + } else { + + resetGlobalState(); + + } + + } else { + + var nGlobal = renderingShadows ? 0 : numGlobalPlanes, + lGlobal = nGlobal * 4, + + dstArray = cache.clippingState || null; + + uniform.value = dstArray; // ensure unique state + + dstArray = projectPlanes( planes, camera, lGlobal, fromCache ); + + for ( var i = 0; i !== lGlobal; ++ i ) { + + dstArray[ i ] = globalState[ i ]; + + } + + cache.clippingState = dstArray; + this.numIntersection = clipIntersection ? this.numPlanes : 0; + this.numPlanes += nGlobal; + + } + + + }; + + function resetGlobalState() { + + if ( uniform.value !== globalState ) { + + uniform.value = globalState; + uniform.needsUpdate = numGlobalPlanes > 0; + + } + + scope.numPlanes = numGlobalPlanes; + scope.numIntersection = 0; + + } + + function projectPlanes( planes, camera, dstOffset, skipTransform ) { + + var nPlanes = planes !== null ? planes.length : 0, + dstArray = null; + + if ( nPlanes !== 0 ) { + + dstArray = uniform.value; + + if ( skipTransform !== true || dstArray === null ) { + + var flatSize = dstOffset + nPlanes * 4, + viewMatrix = camera.matrixWorldInverse; + + viewNormalMatrix.getNormalMatrix( viewMatrix ); + + if ( dstArray === null || dstArray.length < flatSize ) { + + dstArray = new Float32Array( flatSize ); + + } + + for ( var i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) { + + plane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix ); + + plane.normal.toArray( dstArray, i4 ); + dstArray[ i4 + 3 ] = plane.constant; + + } + + } + + uniform.value = dstArray; + uniform.needsUpdate = true; + + } + + scope.numPlanes = nPlanes; + + return dstArray; + + } + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLExtensions( gl ) { + + var extensions = {}; + + return { + + get: function ( name ) { + + if ( extensions[ name ] !== undefined ) { + + return extensions[ name ]; + + } + + var extension; + + switch ( name ) { + + case 'WEBGL_depth_texture': + extension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' ); + break; + + case 'EXT_texture_filter_anisotropic': + extension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' ); + break; + + case 'WEBGL_compressed_texture_s3tc': + extension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' ); + break; + + case 'WEBGL_compressed_texture_pvrtc': + extension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' ); + break; + + default: + extension = gl.getExtension( name ); + + } + + if ( extension === null ) { + + console.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' ); + + } + + extensions[ name ] = extension; + + return extension; + + } + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLGeometries( gl, attributes, info ) { + + var geometries = {}; + var wireframeAttributes = {}; + + function onGeometryDispose( event ) { + + var geometry = event.target; + var buffergeometry = geometries[ geometry.id ]; + + if ( buffergeometry.index !== null ) { + + attributes.remove( buffergeometry.index ); + + } + + for ( var name in buffergeometry.attributes ) { + + attributes.remove( buffergeometry.attributes[ name ] ); + + } + + geometry.removeEventListener( 'dispose', onGeometryDispose ); + + delete geometries[ geometry.id ]; + + var attribute = wireframeAttributes[ buffergeometry.id ]; + + if ( attribute ) { + + attributes.remove( attribute ); + delete wireframeAttributes[ buffergeometry.id ]; + + } + + // + + info.memory.geometries --; + + } + + function get( object, geometry ) { + + var buffergeometry = geometries[ geometry.id ]; + + if ( buffergeometry ) return buffergeometry; + + geometry.addEventListener( 'dispose', onGeometryDispose ); + + if ( geometry.isBufferGeometry ) { + + buffergeometry = geometry; + + } else if ( geometry.isGeometry ) { + + if ( geometry._bufferGeometry === undefined ) { + + geometry._bufferGeometry = new BufferGeometry().setFromObject( object ); + + } + + buffergeometry = geometry._bufferGeometry; + + } + + geometries[ geometry.id ] = buffergeometry; + + info.memory.geometries ++; + + return buffergeometry; + + } + + function update( geometry ) { + + var index = geometry.index; + var geometryAttributes = geometry.attributes; + + if ( index !== null ) { + + attributes.update( index, 34963 ); + + } + + for ( var name in geometryAttributes ) { + + attributes.update( geometryAttributes[ name ], 34962 ); + + } + + // morph targets + + var morphAttributes = geometry.morphAttributes; + + for ( var name in morphAttributes ) { + + var array = morphAttributes[ name ]; + + for ( var i = 0, l = array.length; i < l; i ++ ) { + + attributes.update( array[ i ], 34962 ); + + } + + } + + } + + function getWireframeAttribute( geometry ) { + + var attribute = wireframeAttributes[ geometry.id ]; + + if ( attribute ) return attribute; + + var indices = []; + + var geometryIndex = geometry.index; + var geometryAttributes = geometry.attributes; + + // console.time( 'wireframe' ); + + if ( geometryIndex !== null ) { + + var array = geometryIndex.array; + + for ( var i = 0, l = array.length; i < l; i += 3 ) { + + var a = array[ i + 0 ]; + var b = array[ i + 1 ]; + var c = array[ i + 2 ]; + + indices.push( a, b, b, c, c, a ); + + } + + } else { + + var array = geometryAttributes.position.array; + + for ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) { + + var a = i + 0; + var b = i + 1; + var c = i + 2; + + indices.push( a, b, b, c, c, a ); + + } + + } + + // console.timeEnd( 'wireframe' ); + + attribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 ); + + attributes.update( attribute, 34963 ); + + wireframeAttributes[ geometry.id ] = attribute; + + return attribute; + + } + + return { + + get: get, + update: update, + + getWireframeAttribute: getWireframeAttribute + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLIndexedBufferRenderer( gl, extensions, info, capabilities ) { + + var mode; + + function setMode( value ) { + + mode = value; + + } + + var type, bytesPerElement; + + function setIndex( value ) { + + type = value.type; + bytesPerElement = value.bytesPerElement; + + } + + function render( start, count ) { + + gl.drawElements( mode, count, type, start * bytesPerElement ); + + info.update( count, mode ); + + } + + function renderInstances( geometry, start, count ) { + + var extension; + + if ( capabilities.isWebGL2 ) { + + extension = gl; + + } else { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + } + + extension[ capabilities.isWebGL2 ? 'drawElementsInstanced' : 'drawElementsInstancedANGLE' ]( mode, count, type, start * bytesPerElement, geometry.maxInstancedCount ); + + info.update( count, mode, geometry.maxInstancedCount ); + + } + + // + + this.setMode = setMode; + this.setIndex = setIndex; + this.render = render; + this.renderInstances = renderInstances; + + } + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function WebGLInfo( gl ) { + + var memory = { + geometries: 0, + textures: 0 + }; + + var render = { + frame: 0, + calls: 0, + triangles: 0, + points: 0, + lines: 0 + }; + + function update( count, mode, instanceCount ) { + + instanceCount = instanceCount || 1; + + render.calls ++; + + switch ( mode ) { + + case 4: + render.triangles += instanceCount * ( count / 3 ); + break; + + case 5: + case 6: + render.triangles += instanceCount * ( count - 2 ); + break; + + case 1: + render.lines += instanceCount * ( count / 2 ); + break; + + case 3: + render.lines += instanceCount * ( count - 1 ); + break; + + case 2: + render.lines += instanceCount * count; + break; + + case 0: + render.points += instanceCount * count; + break; + + default: + console.error( 'THREE.WebGLInfo: Unknown draw mode:', mode ); + break; + + } + + } + + function reset() { + + render.frame ++; + render.calls = 0; + render.triangles = 0; + render.points = 0; + render.lines = 0; + + } + + return { + memory: memory, + render: render, + programs: null, + autoReset: true, + reset: reset, + update: update + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function absNumericalSort( a, b ) { + + return Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] ); + + } + + function WebGLMorphtargets( gl ) { + + var influencesList = {}; + var morphInfluences = new Float32Array( 8 ); + + function update( object, geometry, material, program ) { + + var objectInfluences = object.morphTargetInfluences; + + var length = objectInfluences.length; + + var influences = influencesList[ geometry.id ]; + + if ( influences === undefined ) { + + // initialise list + + influences = []; + + for ( var i = 0; i < length; i ++ ) { + + influences[ i ] = [ i, 0 ]; + + } + + influencesList[ geometry.id ] = influences; + + } + + var morphTargets = material.morphTargets && geometry.morphAttributes.position; + var morphNormals = material.morphNormals && geometry.morphAttributes.normal; + + // Remove current morphAttributes + + for ( var i = 0; i < length; i ++ ) { + + var influence = influences[ i ]; + + if ( influence[ 1 ] !== 0 ) { + + if ( morphTargets ) geometry.removeAttribute( 'morphTarget' + i ); + if ( morphNormals ) geometry.removeAttribute( 'morphNormal' + i ); + + } + + } + + // Collect influences + + for ( var i = 0; i < length; i ++ ) { + + var influence = influences[ i ]; + + influence[ 0 ] = i; + influence[ 1 ] = objectInfluences[ i ]; + + } + + influences.sort( absNumericalSort ); + + // Add morphAttributes + + for ( var i = 0; i < 8; i ++ ) { + + var influence = influences[ i ]; + + if ( influence ) { + + var index = influence[ 0 ]; + var value = influence[ 1 ]; + + if ( value ) { + + if ( morphTargets ) geometry.addAttribute( 'morphTarget' + i, morphTargets[ index ] ); + if ( morphNormals ) geometry.addAttribute( 'morphNormal' + i, morphNormals[ index ] ); + + morphInfluences[ i ] = value; + continue; + + } + + } + + morphInfluences[ i ] = 0; + + } + + program.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences ); + + } + + return { + + update: update + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLObjects( geometries, info ) { + + var updateList = {}; + + function update( object ) { + + var frame = info.render.frame; + + var geometry = object.geometry; + var buffergeometry = geometries.get( object, geometry ); + + // Update once per frame + + if ( updateList[ buffergeometry.id ] !== frame ) { + + if ( geometry.isGeometry ) { + + buffergeometry.updateFromObject( object ); + + } + + geometries.update( buffergeometry ); + + updateList[ buffergeometry.id ] = frame; + + } + + return buffergeometry; + + } + + function dispose() { + + updateList = {}; + + } + + return { + + update: update, + dispose: dispose + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { + + images = images !== undefined ? images : []; + mapping = mapping !== undefined ? mapping : CubeReflectionMapping; + + Texture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.flipY = false; + + } + + CubeTexture.prototype = Object.create( Texture.prototype ); + CubeTexture.prototype.constructor = CubeTexture; + + CubeTexture.prototype.isCubeTexture = true; + + Object.defineProperty( CubeTexture.prototype, 'images', { + + get: function () { + + return this.image; + + }, + + set: function ( value ) { + + this.image = value; + + } + + } ); + + /** + * @author Artur Trzesiok + */ + + function DataTexture3D( data, width, height, depth ) { + + // We're going to add .setXXX() methods for setting properties later. + // Users can still set in DataTexture3D directly. + // + // var texture = new THREE.DataTexture3D( data, width, height, depth ); + // texture.anisotropy = 16; + // + // See #14839 + + Texture.call( this, null ); + + this.image = { data: data, width: width, height: height, depth: depth }; + + this.magFilter = NearestFilter; + this.minFilter = NearestFilter; + + this.generateMipmaps = false; + this.flipY = false; + + } + + DataTexture3D.prototype = Object.create( Texture.prototype ); + DataTexture3D.prototype.constructor = DataTexture3D; + DataTexture3D.prototype.isDataTexture3D = true; + + /** + * @author tschw + * @author Mugen87 / https://github.com/Mugen87 + * @author mrdoob / http://mrdoob.com/ + * + * Uniforms of a program. + * Those form a tree structure with a special top-level container for the root, + * which you get by calling 'new WebGLUniforms( gl, program, renderer )'. + * + * + * Properties of inner nodes including the top-level container: + * + * .seq - array of nested uniforms + * .map - nested uniforms by name + * + * + * Methods of all nodes except the top-level container: + * + * .setValue( gl, value, [renderer] ) + * + * uploads a uniform value(s) + * the 'renderer' parameter is needed for sampler uniforms + * + * + * Static methods of the top-level container (renderer factorizations): + * + * .upload( gl, seq, values, renderer ) + * + * sets uniforms in 'seq' to 'values[id].value' + * + * .seqWithValue( seq, values ) : filteredSeq + * + * filters 'seq' entries with corresponding entry in values + * + * + * Methods of the top-level container (renderer factorizations): + * + * .setValue( gl, name, value ) + * + * sets uniform with name 'name' to 'value' + * + * .set( gl, obj, prop ) + * + * sets uniform from object and property with same name than uniform + * + * .setOptional( gl, obj, prop ) + * + * like .set for an optional property of the object + * + */ + + var emptyTexture = new Texture(); + var emptyTexture3d = new DataTexture3D(); + var emptyCubeTexture = new CubeTexture(); + + // --- Base for inner nodes (including the root) --- + + function UniformContainer() { + + this.seq = []; + this.map = {}; + + } + + // --- Utilities --- + + // Array Caches (provide typed arrays for temporary by size) + + var arrayCacheF32 = []; + var arrayCacheI32 = []; + + // Float32Array caches used for uploading Matrix uniforms + + var mat4array = new Float32Array( 16 ); + var mat3array = new Float32Array( 9 ); + var mat2array = new Float32Array( 4 ); + + // Flattening for arrays of vectors and matrices + + function flatten( array, nBlocks, blockSize ) { + + var firstElem = array[ 0 ]; + + if ( firstElem <= 0 || firstElem > 0 ) return array; + // unoptimized: ! isNaN( firstElem ) + // see http://jacksondunstan.com/articles/983 + + var n = nBlocks * blockSize, + r = arrayCacheF32[ n ]; + + if ( r === undefined ) { + + r = new Float32Array( n ); + arrayCacheF32[ n ] = r; + + } + + if ( nBlocks !== 0 ) { + + firstElem.toArray( r, 0 ); + + for ( var i = 1, offset = 0; i !== nBlocks; ++ i ) { + + offset += blockSize; + array[ i ].toArray( r, offset ); + + } + + } + + return r; + + } + + function arraysEqual( a, b ) { + + if ( a.length !== b.length ) return false; + + for ( var i = 0, l = a.length; i < l; i ++ ) { + + if ( a[ i ] !== b[ i ] ) return false; + + } + + return true; + + } + + function copyArray( a, b ) { + + for ( var i = 0, l = b.length; i < l; i ++ ) { + + a[ i ] = b[ i ]; + + } + + } + + // Texture unit allocation + + function allocTexUnits( renderer, n ) { + + var r = arrayCacheI32[ n ]; + + if ( r === undefined ) { + + r = new Int32Array( n ); + arrayCacheI32[ n ] = r; + + } + + for ( var i = 0; i !== n; ++ i ) + r[ i ] = renderer.allocTextureUnit(); + + return r; + + } + + // --- Setters --- + + // Note: Defining these methods externally, because they come in a bunch + // and this way their names minify. + + // Single scalar + + function setValue1f( gl, v ) { + + var cache = this.cache; + + if ( cache[ 0 ] === v ) return; + + gl.uniform1f( this.addr, v ); + + cache[ 0 ] = v; + + } + + function setValue1i( gl, v ) { + + var cache = this.cache; + + if ( cache[ 0 ] === v ) return; + + gl.uniform1i( this.addr, v ); + + cache[ 0 ] = v; + + } + + // Single float vector (from flat array or THREE.VectorN) + + function setValue2fv( gl, v ) { + + var cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) { + + gl.uniform2f( this.addr, v.x, v.y ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform2fv( this.addr, v ); + + copyArray( cache, v ); + + } + + } + + function setValue3fv( gl, v ) { + + var cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) { + + gl.uniform3f( this.addr, v.x, v.y, v.z ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + cache[ 2 ] = v.z; + + } + + } else if ( v.r !== undefined ) { + + if ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) { + + gl.uniform3f( this.addr, v.r, v.g, v.b ); + + cache[ 0 ] = v.r; + cache[ 1 ] = v.g; + cache[ 2 ] = v.b; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform3fv( this.addr, v ); + + copyArray( cache, v ); + + } + + } + + function setValue4fv( gl, v ) { + + var cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) { + + gl.uniform4f( this.addr, v.x, v.y, v.z, v.w ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + cache[ 2 ] = v.z; + cache[ 3 ] = v.w; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform4fv( this.addr, v ); + + copyArray( cache, v ); + + } + + } + + // Single matrix (from flat array or MatrixN) + + function setValue2fm( gl, v ) { + + var cache = this.cache; + var elements = v.elements; + + if ( elements === undefined ) { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniformMatrix2fv( this.addr, false, v ); + + copyArray( cache, v ); + + } else { + + if ( arraysEqual( cache, elements ) ) return; + + mat2array.set( elements ); + + gl.uniformMatrix2fv( this.addr, false, mat2array ); + + copyArray( cache, elements ); + + } + + } + + function setValue3fm( gl, v ) { + + var cache = this.cache; + var elements = v.elements; + + if ( elements === undefined ) { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniformMatrix3fv( this.addr, false, v ); + + copyArray( cache, v ); + + } else { + + if ( arraysEqual( cache, elements ) ) return; + + mat3array.set( elements ); + + gl.uniformMatrix3fv( this.addr, false, mat3array ); + + copyArray( cache, elements ); + + } + + } + + function setValue4fm( gl, v ) { + + var cache = this.cache; + var elements = v.elements; + + if ( elements === undefined ) { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniformMatrix4fv( this.addr, false, v ); + + copyArray( cache, v ); + + } else { + + if ( arraysEqual( cache, elements ) ) return; + + mat4array.set( elements ); + + gl.uniformMatrix4fv( this.addr, false, mat4array ); + + copyArray( cache, elements ); + + } + + } + + // Single texture (2D / Cube) + + function setValueT1( gl, v, renderer ) { + + var cache = this.cache; + var unit = renderer.allocTextureUnit(); + + if ( cache[ 0 ] !== unit ) { + + gl.uniform1i( this.addr, unit ); + cache[ 0 ] = unit; + + } + + renderer.setTexture2D( v || emptyTexture, unit ); + + } + + function setValueT3D1( gl, v, renderer ) { + + var cache = this.cache; + var unit = renderer.allocTextureUnit(); + + if ( cache[ 0 ] !== unit ) { + + gl.uniform1i( this.addr, unit ); + cache[ 0 ] = unit; + + } + + renderer.setTexture3D( v || emptyTexture3d, unit ); + + } + + function setValueT6( gl, v, renderer ) { + + var cache = this.cache; + var unit = renderer.allocTextureUnit(); + + if ( cache[ 0 ] !== unit ) { + + gl.uniform1i( this.addr, unit ); + cache[ 0 ] = unit; + + } + + renderer.setTextureCube( v || emptyCubeTexture, unit ); + + } + + // Integer / Boolean vectors or arrays thereof (always flat arrays) + + function setValue2iv( gl, v ) { + + var cache = this.cache; + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform2iv( this.addr, v ); + + copyArray( cache, v ); + + } + + function setValue3iv( gl, v ) { + + var cache = this.cache; + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform3iv( this.addr, v ); + + copyArray( cache, v ); + + } + + function setValue4iv( gl, v ) { + + var cache = this.cache; + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform4iv( this.addr, v ); + + copyArray( cache, v ); + + } + + // Helper to pick the right setter for the singular case + + function getSingularSetter( type ) { + + switch ( type ) { + + case 0x1406: return setValue1f; // FLOAT + case 0x8b50: return setValue2fv; // _VEC2 + case 0x8b51: return setValue3fv; // _VEC3 + case 0x8b52: return setValue4fv; // _VEC4 + + case 0x8b5a: return setValue2fm; // _MAT2 + case 0x8b5b: return setValue3fm; // _MAT3 + case 0x8b5c: return setValue4fm; // _MAT4 + + case 0x8b5e: case 0x8d66: return setValueT1; // SAMPLER_2D, SAMPLER_EXTERNAL_OES + case 0x8B5F: return setValueT3D1; // SAMPLER_3D + case 0x8b60: return setValueT6; // SAMPLER_CUBE + + case 0x1404: case 0x8b56: return setValue1i; // INT, BOOL + case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2 + case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3 + case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4 + + } + + } + + // Array of scalars + + function setValue1fv( gl, v ) { + + var cache = this.cache; + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform1fv( this.addr, v ); + + copyArray( cache, v ); + + } + function setValue1iv( gl, v ) { + + var cache = this.cache; + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform1iv( this.addr, v ); + + copyArray( cache, v ); + + } + + // Array of vectors (flat or from THREE classes) + + function setValueV2a( gl, v ) { + + var cache = this.cache; + var data = flatten( v, this.size, 2 ); + + if ( arraysEqual( cache, data ) ) return; + + gl.uniform2fv( this.addr, data ); + + this.updateCache( data ); + + } + + function setValueV3a( gl, v ) { + + var cache = this.cache; + var data = flatten( v, this.size, 3 ); + + if ( arraysEqual( cache, data ) ) return; + + gl.uniform3fv( this.addr, data ); + + this.updateCache( data ); + + } + + function setValueV4a( gl, v ) { + + var cache = this.cache; + var data = flatten( v, this.size, 4 ); + + if ( arraysEqual( cache, data ) ) return; + + gl.uniform4fv( this.addr, data ); + + this.updateCache( data ); + + } + + // Array of matrices (flat or from THREE clases) + + function setValueM2a( gl, v ) { + + var cache = this.cache; + var data = flatten( v, this.size, 4 ); + + if ( arraysEqual( cache, data ) ) return; + + gl.uniformMatrix2fv( this.addr, false, data ); + + this.updateCache( data ); + + } + + function setValueM3a( gl, v ) { + + var cache = this.cache; + var data = flatten( v, this.size, 9 ); + + if ( arraysEqual( cache, data ) ) return; + + gl.uniformMatrix3fv( this.addr, false, data ); + + this.updateCache( data ); + + } + + function setValueM4a( gl, v ) { + + var cache = this.cache; + var data = flatten( v, this.size, 16 ); + + if ( arraysEqual( cache, data ) ) return; + + gl.uniformMatrix4fv( this.addr, false, data ); + + this.updateCache( data ); + + } + + // Array of textures (2D / Cube) + + function setValueT1a( gl, v, renderer ) { + + var cache = this.cache; + var n = v.length; + + var units = allocTexUnits( renderer, n ); + + if ( arraysEqual( cache, units ) === false ) { + + gl.uniform1iv( this.addr, units ); + copyArray( cache, units ); + + } + + for ( var i = 0; i !== n; ++ i ) { + + renderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] ); + + } + + } + + function setValueT6a( gl, v, renderer ) { + + var cache = this.cache; + var n = v.length; + + var units = allocTexUnits( renderer, n ); + + if ( arraysEqual( cache, units ) === false ) { + + gl.uniform1iv( this.addr, units ); + copyArray( cache, units ); + + } + + for ( var i = 0; i !== n; ++ i ) { + + renderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] ); + + } + + } + + // Helper to pick the right setter for a pure (bottom-level) array + + function getPureArraySetter( type ) { + + switch ( type ) { + + case 0x1406: return setValue1fv; // FLOAT + case 0x8b50: return setValueV2a; // _VEC2 + case 0x8b51: return setValueV3a; // _VEC3 + case 0x8b52: return setValueV4a; // _VEC4 + + case 0x8b5a: return setValueM2a; // _MAT2 + case 0x8b5b: return setValueM3a; // _MAT3 + case 0x8b5c: return setValueM4a; // _MAT4 + + case 0x8b5e: return setValueT1a; // SAMPLER_2D + case 0x8b60: return setValueT6a; // SAMPLER_CUBE + + case 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL + case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2 + case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3 + case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4 + + } + + } + + // --- Uniform Classes --- + + function SingleUniform( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.cache = []; + this.setValue = getSingularSetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + + } + + function PureArrayUniform( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.cache = []; + this.size = activeInfo.size; + this.setValue = getPureArraySetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + + } + + PureArrayUniform.prototype.updateCache = function ( data ) { + + var cache = this.cache; + + if ( data instanceof Float32Array && cache.length !== data.length ) { + + this.cache = new Float32Array( data.length ); + + } + + copyArray( cache, data ); + + }; + + function StructuredUniform( id ) { + + this.id = id; + + UniformContainer.call( this ); // mix-in + + } + + StructuredUniform.prototype.setValue = function ( gl, value, renderer ) { + + var seq = this.seq; + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ]; + u.setValue( gl, value[ u.id ], renderer ); + + } + + }; + + // --- Top-level --- + + // Parser - builds up the property tree from the path strings + + var RePathPart = /([\w\d_]+)(\])?(\[|\.)?/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; + + } + + function parseUniform( activeInfo, addr, container ) { + + var path = activeInfo.name, + pathLength = path.length; + + // reset RegExp object, because of the early exit of a previous run + RePathPart.lastIndex = 0; + + while ( true ) { + + var match = RePathPart.exec( path ), + matchEnd = RePathPart.lastIndex, + + id = match[ 1 ], + 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( id, activeInfo, addr ) : + new PureArrayUniform( id, activeInfo, addr ) ); + + break; + + } else { + + // step into inner node / create it in case it doesn't exist + + var map = container.map, next = map[ id ]; + + if ( next === undefined ) { + + next = new StructuredUniform( id ); + addUniform( container, next ); + + } + + container = next; + + } + + } + + } + + // Root Container + + function WebGLUniforms( gl, program, renderer ) { + + UniformContainer.call( this ); + + this.renderer = renderer; + + var n = gl.getProgramParameter( program, 35718 ); + + for ( var i = 0; i < n; ++ i ) { + + var info = gl.getActiveUniform( program, i ), + addr = gl.getUniformLocation( program, info.name ); + + parseUniform( info, addr, this ); + + } + + } + + WebGLUniforms.prototype.setValue = function ( gl, name, value ) { + + var u = this.map[ name ]; + + if ( u !== undefined ) u.setValue( gl, value, this.renderer ); + + }; + + WebGLUniforms.prototype.setOptional = function ( gl, object, name ) { + + var v = object[ name ]; + + if ( v !== undefined ) this.setValue( gl, name, v ); + + }; + + + // Static interface + + WebGLUniforms.upload = function ( gl, seq, values, renderer ) { + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ], + v = values[ u.id ]; + + if ( v.needsUpdate !== false ) { + + // note: always updating when .needsUpdate is undefined + u.setValue( gl, v.value, renderer ); + + } + + } + + }; + + WebGLUniforms.seqWithValue = function ( seq, values ) { + + var r = []; + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ]; + if ( u.id in values ) r.push( u ); + + } + + return r; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function addLineNumbers( string ) { + + var lines = string.split( '\n' ); + + for ( var i = 0; i < lines.length; i ++ ) { + + lines[ i ] = ( i + 1 ) + ': ' + lines[ i ]; + + } + + return lines.join( '\n' ); + + } + + function WebGLShader( gl, type, string ) { + + var shader = gl.createShader( type ); + + gl.shaderSource( shader, string ); + gl.compileShader( shader ); + + if ( gl.getShaderParameter( shader, 35713 ) === false ) { + + console.error( 'THREE.WebGLShader: Shader couldn\'t compile.' ); + + } + + if ( gl.getShaderInfoLog( shader ) !== '' ) { + + console.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === 35633 ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) ); + + } + + // --enable-privileged-webgl-extension + // console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) ); + + return shader; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var programIdCount = 0; + + function getEncodingComponents( encoding ) { + + switch ( encoding ) { + + case LinearEncoding: + return [ 'Linear', '( value )' ]; + case sRGBEncoding: + return [ 'sRGB', '( value )' ]; + case RGBEEncoding: + return [ 'RGBE', '( value )' ]; + case RGBM7Encoding: + return [ 'RGBM', '( value, 7.0 )' ]; + case RGBM16Encoding: + return [ 'RGBM', '( value, 16.0 )' ]; + case RGBDEncoding: + return [ 'RGBD', '( value, 256.0 )' ]; + case GammaEncoding: + return [ 'Gamma', '( value, float( GAMMA_FACTOR ) )' ]; + default: + throw new Error( 'unsupported encoding: ' + encoding ); + + } + + } + + function getTexelDecodingFunction( functionName, encoding ) { + + var components = getEncodingComponents( encoding ); + return 'vec4 ' + functionName + '( vec4 value ) { return ' + components[ 0 ] + 'ToLinear' + components[ 1 ] + '; }'; + + } + + function getTexelEncodingFunction( functionName, encoding ) { + + var components = getEncodingComponents( encoding ); + return 'vec4 ' + functionName + '( vec4 value ) { return LinearTo' + components[ 0 ] + components[ 1 ] + '; }'; + + } + + function getToneMappingFunction( functionName, toneMapping ) { + + var toneMappingName; + + switch ( toneMapping ) { + + case LinearToneMapping: + toneMappingName = 'Linear'; + break; + + case ReinhardToneMapping: + toneMappingName = 'Reinhard'; + break; + + case Uncharted2ToneMapping: + toneMappingName = 'Uncharted2'; + break; + + case CineonToneMapping: + toneMappingName = 'OptimizedCineon'; + break; + + default: + throw new Error( 'unsupported toneMapping: ' + toneMapping ); + + } + + return 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }'; + + } + + function generateExtensions( extensions, parameters, rendererExtensions ) { + + extensions = extensions || {}; + + var chunks = [ + ( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || ( parameters.normalMap && ! parameters.objectSpaceNormalMap ) || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '', + ( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '', + ( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '', + ( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : '' + ]; + + return chunks.filter( filterEmptyLine ).join( '\n' ); + + } + + function generateDefines( defines ) { + + var chunks = []; + + for ( var name in defines ) { + + var value = defines[ name ]; + + if ( value === false ) continue; + + chunks.push( '#define ' + name + ' ' + value ); + + } + + return chunks.join( '\n' ); + + } + + function fetchAttributeLocations( gl, program ) { + + var attributes = {}; + + var n = gl.getProgramParameter( program, 35721 ); + + for ( var i = 0; i < n; i ++ ) { + + var info = gl.getActiveAttrib( program, i ); + var name = info.name; + + // console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i ); + + attributes[ name ] = gl.getAttribLocation( program, name ); + + } + + return attributes; + + } + + function filterEmptyLine( string ) { + + return string !== ''; + + } + + function replaceLightNums( string, parameters ) { + + return string + .replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights ) + .replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights ) + .replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights ) + .replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights ) + .replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights ); + + } + + function replaceClippingPlaneNums( string, parameters ) { + + return string + .replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes ) + .replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) ); + + } + + function parseIncludes( string ) { + + var pattern = /^[ \t]*#include +<([\w\d./]+)>/gm; + + function replace( match, include ) { + + var replace = ShaderChunk[ include ]; + + if ( replace === undefined ) { + + throw new Error( 'Can not resolve #include <' + include + '>' ); + + } + + return parseIncludes( replace ); + + } + + return string.replace( pattern, replace ); + + } + + function unrollLoops( string ) { + + var pattern = /#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g; + + function replace( match, start, end, snippet ) { + + var unroll = ''; + + for ( var i = parseInt( start ); i < parseInt( end ); i ++ ) { + + unroll += snippet.replace( /\[ i \]/g, '[ ' + i + ' ]' ); + + } + + return unroll; + + } + + return string.replace( pattern, replace ); + + } + + function WebGLProgram( renderer, extensions, code, material, shader, parameters, capabilities ) { + + var gl = renderer.context; + + var defines = material.defines; + + var vertexShader = shader.vertexShader; + var fragmentShader = shader.fragmentShader; + + var shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC'; + + if ( parameters.shadowMapType === PCFShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF'; + + } else if ( parameters.shadowMapType === PCFSoftShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT'; + + } + + var envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + var envMapModeDefine = 'ENVMAP_MODE_REFLECTION'; + var envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + + if ( parameters.envMap ) { + + switch ( material.envMap.mapping ) { + + case CubeReflectionMapping: + case CubeRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + break; + + case CubeUVReflectionMapping: + case CubeUVRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV'; + break; + + case EquirectangularReflectionMapping: + case EquirectangularRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_EQUIREC'; + break; + + case SphericalReflectionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_SPHERE'; + break; + + } + + switch ( material.envMap.mapping ) { + + case CubeRefractionMapping: + case EquirectangularRefractionMapping: + envMapModeDefine = 'ENVMAP_MODE_REFRACTION'; + break; + + } + + switch ( material.combine ) { + + case MultiplyOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + break; + + case MixOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MIX'; + break; + + case AddOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_ADD'; + break; + + } + + } + + var gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0; + + // console.log( 'building new program ' ); + + // + + var customExtensions = capabilities.isWebGL2 ? '' : generateExtensions( material.extensions, parameters, extensions ); + + var customDefines = generateDefines( defines ); + + // + + var program = gl.createProgram(); + + var prefixVertex, prefixFragment; + + if ( material.isRawShaderMaterial ) { + + prefixVertex = [ + + customDefines + + ].filter( filterEmptyLine ).join( '\n' ); + + if ( prefixVertex.length > 0 ) { + + prefixVertex += '\n'; + + } + + prefixFragment = [ + + customExtensions, + customDefines + + ].filter( filterEmptyLine ).join( '\n' ); + + if ( prefixFragment.length > 0 ) { + + prefixFragment += '\n'; + + } + + } else { + + prefixVertex = [ + + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + shader.name, + + customDefines, + + parameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '', + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + '#define MAX_BONES ' + parameters.maxBones, + ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', + ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + ( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '', + parameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.skinning ? '#define USE_SKINNING' : '', + parameters.useVertexTexture ? '#define BONE_TEXTURE' : '', + + parameters.morphTargets ? '#define USE_MORPHTARGETS' : '', + parameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '', + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && ( capabilities.isWebGL2 || extensions.get( 'EXT_frag_depth' ) ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + 'uniform mat4 modelMatrix;', + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform mat4 viewMatrix;', + 'uniform mat3 normalMatrix;', + 'uniform vec3 cameraPosition;', + + 'attribute vec3 position;', + 'attribute vec3 normal;', + 'attribute vec2 uv;', + + '#ifdef USE_COLOR', + + ' attribute vec3 color;', + + '#endif', + + '#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', + + '#ifdef USE_SKINNING', + + ' attribute vec4 skinIndex;', + ' attribute vec4 skinWeight;', + + '#endif', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + prefixFragment = [ + + customExtensions, + + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + shader.name, + + customDefines, + + parameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest + ( parameters.alphaTest % 1 ? '' : '.0' ) : '', // add '.0' if integer + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', + ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapTypeDefine : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.envMap ? '#define ' + envMapBlendingDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + ( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.gradientMap ? '#define USE_GRADIENTMAP' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '', + + parameters.physicallyCorrectLights ? '#define PHYSICALLY_CORRECT_LIGHTS' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && ( capabilities.isWebGL2 || extensions.get( 'EXT_frag_depth' ) ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + parameters.envMap && ( capabilities.isWebGL2 || extensions.get( 'EXT_shader_texture_lod' ) ) ? '#define TEXTURE_LOD_EXT' : '', + + 'uniform mat4 viewMatrix;', + 'uniform vec3 cameraPosition;', + + ( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '', + ( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below + ( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '', + + parameters.dithering ? '#define DITHERING' : '', + + ( parameters.outputEncoding || parameters.mapEncoding || parameters.matcapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? + ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below + parameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '', + parameters.matcapEncoding ? getTexelDecodingFunction( 'matcapTexelToLinear', parameters.matcapEncoding ) : '', + parameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '', + parameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '', + parameters.outputEncoding ? getTexelEncodingFunction( 'linearToOutputTexel', parameters.outputEncoding ) : '', + + parameters.depthPacking ? '#define DEPTH_PACKING ' + material.depthPacking : '', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + } + + vertexShader = parseIncludes( vertexShader ); + vertexShader = replaceLightNums( vertexShader, parameters ); + vertexShader = replaceClippingPlaneNums( vertexShader, parameters ); + + fragmentShader = parseIncludes( fragmentShader ); + fragmentShader = replaceLightNums( fragmentShader, parameters ); + fragmentShader = replaceClippingPlaneNums( fragmentShader, parameters ); + + vertexShader = unrollLoops( vertexShader ); + fragmentShader = unrollLoops( fragmentShader ); + + if ( capabilities.isWebGL2 && ! material.isRawShaderMaterial ) { + + var isGLSL3ShaderMaterial = false; + + var versionRegex = /^\s*#version\s+300\s+es\s*\n/; + + if ( material.isShaderMaterial && + vertexShader.match( versionRegex ) !== null && + fragmentShader.match( versionRegex ) !== null ) { + + isGLSL3ShaderMaterial = true; + + vertexShader = vertexShader.replace( versionRegex, '' ); + fragmentShader = fragmentShader.replace( versionRegex, '' ); + + } + + // GLSL 3.0 conversion + prefixVertex = [ + '#version 300 es\n', + '#define attribute in', + '#define varying out', + '#define texture2D texture' + ].join( '\n' ) + '\n' + prefixVertex; + + prefixFragment = [ + '#version 300 es\n', + '#define varying in', + isGLSL3ShaderMaterial ? '' : 'out highp vec4 pc_fragColor;', + isGLSL3ShaderMaterial ? '' : '#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' + ].join( '\n' ) + '\n' + prefixFragment; + + } + + var vertexGlsl = prefixVertex + vertexShader; + var fragmentGlsl = prefixFragment + fragmentShader; + + // console.log( '*VERTEX*', vertexGlsl ); + // console.log( '*FRAGMENT*', fragmentGlsl ); + + var glVertexShader = WebGLShader( gl, 35633, vertexGlsl ); + var glFragmentShader = WebGLShader( gl, 35632, fragmentGlsl ); + + gl.attachShader( program, glVertexShader ); + gl.attachShader( program, glFragmentShader ); + + // Force a particular attribute to index 0. + + if ( material.index0AttributeName !== undefined ) { + + gl.bindAttribLocation( program, 0, material.index0AttributeName ); + + } else if ( parameters.morphTargets === true ) { + + // programs with morphTargets displace position out of attribute 0 + gl.bindAttribLocation( program, 0, 'position' ); + + } + + gl.linkProgram( program ); + + var programLog = gl.getProgramInfoLog( program ).trim(); + var vertexLog = gl.getShaderInfoLog( glVertexShader ).trim(); + var fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim(); + + var runnable = true; + var haveDiagnostics = true; + + // console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) ); + // console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) ); + + if ( gl.getProgramParameter( program, 35714 ) === false ) { + + runnable = false; + + console.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), '35715', gl.getProgramParameter( program, 35715 ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog ); + + } else if ( programLog !== '' ) { + + console.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog ); + + } else if ( vertexLog === '' || fragmentLog === '' ) { + + haveDiagnostics = false; + + } + + if ( haveDiagnostics ) { + + this.diagnostics = { + + runnable: runnable, + material: material, + + programLog: programLog, + + vertexShader: { + + log: vertexLog, + prefix: prefixVertex + + }, + + fragmentShader: { + + log: fragmentLog, + prefix: prefixFragment + + } + + }; + + } + + // clean up + + gl.deleteShader( glVertexShader ); + gl.deleteShader( glFragmentShader ); + + // set up caching for uniform locations + + var cachedUniforms; + + this.getUniforms = function () { + + if ( cachedUniforms === undefined ) { + + cachedUniforms = new WebGLUniforms( gl, program, renderer ); + + } + + return cachedUniforms; + + }; + + // set up caching for attribute locations + + var cachedAttributes; + + this.getAttributes = function () { + + if ( cachedAttributes === undefined ) { + + cachedAttributes = fetchAttributeLocations( gl, program ); + + } + + return cachedAttributes; + + }; + + // free resource + + this.destroy = function () { + + gl.deleteProgram( program ); + this.program = undefined; + + }; + + // DEPRECATED + + Object.defineProperties( this, { + + uniforms: { + get: function () { + + console.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' ); + return this.getUniforms(); + + } + }, + + attributes: { + get: function () { + + console.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' ); + return this.getAttributes(); + + } + } + + } ); + + + // + + this.name = shader.name; + this.id = programIdCount ++; + this.code = code; + this.usedTimes = 1; + this.program = program; + this.vertexShader = glVertexShader; + this.fragmentShader = glFragmentShader; + + return this; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLPrograms( renderer, extensions, capabilities ) { + + var programs = []; + + var shaderIDs = { + MeshDepthMaterial: 'depth', + MeshDistanceMaterial: 'distanceRGBA', + MeshNormalMaterial: 'normal', + MeshBasicMaterial: 'basic', + MeshLambertMaterial: 'lambert', + MeshPhongMaterial: 'phong', + MeshToonMaterial: 'phong', + MeshStandardMaterial: 'physical', + MeshPhysicalMaterial: 'physical', + MeshMatcapMaterial: 'matcap', + LineBasicMaterial: 'basic', + LineDashedMaterial: 'dashed', + PointsMaterial: 'points', + ShadowMaterial: 'shadow', + SpriteMaterial: 'sprite' + }; + + var parameterNames = [ + "precision", "supportsVertexTextures", "map", "mapEncoding", "matcapEncoding", "envMap", "envMapMode", "envMapEncoding", + "lightMap", "aoMap", "emissiveMap", "emissiveMapEncoding", "bumpMap", "normalMap", "objectSpaceNormalMap", "displacementMap", "specularMap", + "roughnessMap", "metalnessMap", "gradientMap", + "alphaMap", "combine", "vertexColors", "fog", "useFog", "fogExp", + "flatShading", "sizeAttenuation", "logarithmicDepthBuffer", "skinning", + "maxBones", "useVertexTexture", "morphTargets", "morphNormals", + "maxMorphTargets", "maxMorphNormals", "premultipliedAlpha", + "numDirLights", "numPointLights", "numSpotLights", "numHemiLights", "numRectAreaLights", + "shadowMapEnabled", "shadowMapType", "toneMapping", 'physicallyCorrectLights', + "alphaTest", "doubleSided", "flipSided", "numClippingPlanes", "numClipIntersection", "depthPacking", "dithering" + ]; + + + function allocateBones( object ) { + + var skeleton = object.skeleton; + var bones = skeleton.bones; + + if ( capabilities.floatVertexTextures ) { + + return 1024; + + } else { + + // default for when object is not specified + // ( for example when prebuilding shader to be used with multiple objects ) + // + // - leave some extra space for other uniforms + // - limit here is ANGLE's 254 max uniform vectors + // (up to 54 should be safe) + + var nVertexUniforms = capabilities.maxVertexUniforms; + var nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 ); + + var maxBones = Math.min( nVertexMatrices, bones.length ); + + if ( maxBones < bones.length ) { + + console.warn( 'THREE.WebGLRenderer: Skeleton has ' + bones.length + ' bones. This GPU supports ' + maxBones + '.' ); + return 0; + + } + + return maxBones; + + } + + } + + function getTextureEncodingFromMap( map, gammaOverrideLinear ) { + + var encoding; + + if ( ! map ) { + + encoding = LinearEncoding; + + } else if ( map.isTexture ) { + + encoding = map.encoding; + + } else if ( map.isWebGLRenderTarget ) { + + console.warn( "THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead." ); + encoding = map.texture.encoding; + + } + + // add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point. + if ( encoding === LinearEncoding && gammaOverrideLinear ) { + + encoding = GammaEncoding; + + } + + return encoding; + + } + + this.getParameters = function ( material, lights, shadows, fog, nClipPlanes, nClipIntersection, object ) { + + var shaderID = shaderIDs[ material.type ]; + + // heuristics to create shader parameters according to lights in the scene + // (not to blow over maxLights budget) + + var maxBones = object.isSkinnedMesh ? allocateBones( object ) : 0; + var precision = capabilities.precision; + + if ( material.precision !== null ) { + + precision = capabilities.getMaxPrecision( material.precision ); + + if ( precision !== material.precision ) { + + console.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' ); + + } + + } + + var currentRenderTarget = renderer.getRenderTarget(); + + var parameters = { + + shaderID: shaderID, + + precision: precision, + supportsVertexTextures: capabilities.vertexTextures, + outputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ), + map: !! material.map, + mapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ), + matcap: !! material.matcap, + matcapEncoding: getTextureEncodingFromMap( material.matcap, renderer.gammaInput ), + envMap: !! material.envMap, + envMapMode: material.envMap && material.envMap.mapping, + envMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ), + envMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ), + lightMap: !! material.lightMap, + aoMap: !! material.aoMap, + emissiveMap: !! material.emissiveMap, + emissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ), + bumpMap: !! material.bumpMap, + normalMap: !! material.normalMap, + objectSpaceNormalMap: material.normalMapType === ObjectSpaceNormalMap, + displacementMap: !! material.displacementMap, + roughnessMap: !! material.roughnessMap, + metalnessMap: !! material.metalnessMap, + specularMap: !! material.specularMap, + alphaMap: !! material.alphaMap, + + gradientMap: !! material.gradientMap, + + combine: material.combine, + + vertexColors: material.vertexColors, + + fog: !! fog, + useFog: material.fog, + fogExp: ( fog && fog.isFogExp2 ), + + flatShading: material.flatShading, + + sizeAttenuation: material.sizeAttenuation, + logarithmicDepthBuffer: capabilities.logarithmicDepthBuffer, + + skinning: material.skinning && maxBones > 0, + maxBones: maxBones, + useVertexTexture: capabilities.floatVertexTextures, + + morphTargets: material.morphTargets, + morphNormals: material.morphNormals, + maxMorphTargets: renderer.maxMorphTargets, + maxMorphNormals: renderer.maxMorphNormals, + + numDirLights: lights.directional.length, + numPointLights: lights.point.length, + numSpotLights: lights.spot.length, + numRectAreaLights: lights.rectArea.length, + numHemiLights: lights.hemi.length, + + numClippingPlanes: nClipPlanes, + numClipIntersection: nClipIntersection, + + dithering: material.dithering, + + shadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && shadows.length > 0, + shadowMapType: renderer.shadowMap.type, + + toneMapping: renderer.toneMapping, + physicallyCorrectLights: renderer.physicallyCorrectLights, + + premultipliedAlpha: material.premultipliedAlpha, + + alphaTest: material.alphaTest, + doubleSided: material.side === DoubleSide, + flipSided: material.side === BackSide, + + depthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false + + }; + + return parameters; + + }; + + this.getProgramCode = function ( material, parameters ) { + + var array = []; + + if ( parameters.shaderID ) { + + array.push( parameters.shaderID ); + + } else { + + array.push( material.fragmentShader ); + array.push( material.vertexShader ); + + } + + if ( material.defines !== undefined ) { + + for ( var name in material.defines ) { + + array.push( name ); + array.push( material.defines[ name ] ); + + } + + } + + for ( var i = 0; i < parameterNames.length; i ++ ) { + + array.push( parameters[ parameterNames[ i ] ] ); + + } + + array.push( material.onBeforeCompile.toString() ); + + array.push( renderer.gammaOutput ); + + array.push( renderer.gammaFactor ); + + return array.join(); + + }; + + this.acquireProgram = function ( material, shader, parameters, code ) { + + var program; + + // Check if code has been already compiled + for ( var p = 0, pl = programs.length; p < pl; p ++ ) { + + var programInfo = programs[ p ]; + + if ( programInfo.code === code ) { + + program = programInfo; + ++ program.usedTimes; + + break; + + } + + } + + if ( program === undefined ) { + + program = new WebGLProgram( renderer, extensions, code, material, shader, parameters, capabilities ); + programs.push( program ); + + } + + return program; + + }; + + this.releaseProgram = function ( program ) { + + if ( -- program.usedTimes === 0 ) { + + // Remove from unordered set + var i = programs.indexOf( program ); + programs[ i ] = programs[ programs.length - 1 ]; + programs.pop(); + + // Free WebGL resources + program.destroy(); + + } + + }; + + // Exposed for resource monitoring & error feedback via renderer.info: + this.programs = programs; + + } + + /** + * @author fordacious / fordacious.github.io + */ + + function WebGLProperties() { + + var properties = new WeakMap(); + + function get( object ) { + + var map = properties.get( object ); + + if ( map === undefined ) { + + map = {}; + properties.set( object, map ); + + } + + return map; + + } + + function remove( object ) { + + properties.delete( object ); + + } + + function update( object, key, value ) { + + properties.get( object )[ key ] = value; + + } + + function dispose() { + + properties = new WeakMap(); + + } + + return { + get: get, + remove: remove, + update: update, + dispose: dispose + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function painterSortStable( a, b ) { + + if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } else if ( a.program && b.program && a.program !== b.program ) { + + return a.program.id - b.program.id; + + } else if ( a.material.id !== b.material.id ) { + + return a.material.id - b.material.id; + + } else if ( a.z !== b.z ) { + + return a.z - b.z; + + } else { + + return a.id - b.id; + + } + + } + + function reversePainterSortStable( a, b ) { + + if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } if ( a.z !== b.z ) { + + return b.z - a.z; + + } else { + + return a.id - b.id; + + } + + } + + + function WebGLRenderList() { + + var renderItems = []; + var renderItemsIndex = 0; + + var opaque = []; + var transparent = []; + + function init() { + + renderItemsIndex = 0; + + opaque.length = 0; + transparent.length = 0; + + } + + function push( object, geometry, material, z, group ) { + + var renderItem = renderItems[ renderItemsIndex ]; + + if ( renderItem === undefined ) { + + renderItem = { + id: object.id, + object: object, + geometry: geometry, + material: material, + program: material.program, + renderOrder: object.renderOrder, + z: z, + group: group + }; + + renderItems[ renderItemsIndex ] = renderItem; + + } else { + + renderItem.id = object.id; + renderItem.object = object; + renderItem.geometry = geometry; + renderItem.material = material; + renderItem.program = material.program; + renderItem.renderOrder = object.renderOrder; + renderItem.z = z; + renderItem.group = group; + + } + + + ( material.transparent === true ? transparent : opaque ).push( renderItem ); + + renderItemsIndex ++; + + } + + function sort() { + + if ( opaque.length > 1 ) opaque.sort( painterSortStable ); + if ( transparent.length > 1 ) transparent.sort( reversePainterSortStable ); + + } + + return { + opaque: opaque, + transparent: transparent, + + init: init, + push: push, + + sort: sort + }; + + } + + function WebGLRenderLists() { + + var lists = {}; + + function get( scene, camera ) { + + var hash = scene.id + ',' + camera.id; + var list = lists[ hash ]; + + if ( list === undefined ) { + + // console.log( 'THREE.WebGLRenderLists:', hash ); + + list = new WebGLRenderList(); + lists[ hash ] = list; + + } + + return list; + + } + + function dispose() { + + lists = {}; + + } + + return { + get: get, + dispose: dispose + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function UniformsCache() { + + var lights = {}; + + return { + + get: function ( light ) { + + if ( lights[ light.id ] !== undefined ) { + + return lights[ light.id ]; + + } + + var uniforms; + + switch ( light.type ) { + + case 'DirectionalLight': + uniforms = { + direction: new Vector3(), + color: new Color(), + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'SpotLight': + uniforms = { + position: new Vector3(), + direction: new Vector3(), + color: new Color(), + distance: 0, + coneCos: 0, + penumbraCos: 0, + decay: 0, + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'PointLight': + uniforms = { + position: new Vector3(), + color: new Color(), + distance: 0, + decay: 0, + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2(), + shadowCameraNear: 1, + shadowCameraFar: 1000 + }; + break; + + case 'HemisphereLight': + uniforms = { + direction: new Vector3(), + skyColor: new Color(), + groundColor: new Color() + }; + break; + + case 'RectAreaLight': + uniforms = { + color: new Color(), + position: new Vector3(), + halfWidth: new Vector3(), + halfHeight: new Vector3() + // TODO (abelnation): set RectAreaLight shadow uniforms + }; + break; + + } + + lights[ light.id ] = uniforms; + + return uniforms; + + } + + }; + + } + + var count = 0; + + function WebGLLights() { + + var cache = new UniformsCache(); + + var state = { + + id: count ++, + + hash: { + stateID: - 1, + directionalLength: - 1, + pointLength: - 1, + spotLength: - 1, + rectAreaLength: - 1, + hemiLength: - 1, + shadowsLength: - 1 + }, + + ambient: [ 0, 0, 0 ], + directional: [], + directionalShadowMap: [], + directionalShadowMatrix: [], + spot: [], + spotShadowMap: [], + spotShadowMatrix: [], + rectArea: [], + point: [], + pointShadowMap: [], + pointShadowMatrix: [], + hemi: [] + + }; + + var vector3 = new Vector3(); + var matrix4 = new Matrix4(); + var matrix42 = new Matrix4(); + + function setup( lights, shadows, camera ) { + + var r = 0, g = 0, b = 0; + + var directionalLength = 0; + var pointLength = 0; + var spotLength = 0; + var rectAreaLength = 0; + var hemiLength = 0; + + var viewMatrix = camera.matrixWorldInverse; + + for ( var i = 0, l = lights.length; i < l; i ++ ) { + + var light = lights[ i ]; + + var color = light.color; + var intensity = light.intensity; + var distance = light.distance; + + var shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null; + + if ( light.isAmbientLight ) { + + r += color.r * intensity; + g += color.g * intensity; + b += color.b * intensity; + + } else if ( light.isDirectionalLight ) { + + var uniforms = cache.get( light ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + var shadow = light.shadow; + + uniforms.shadowBias = shadow.bias; + uniforms.shadowRadius = shadow.radius; + uniforms.shadowMapSize = shadow.mapSize; + + } + + state.directionalShadowMap[ directionalLength ] = shadowMap; + state.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix; + state.directional[ directionalLength ] = uniforms; + + directionalLength ++; + + } else if ( light.isSpotLight ) { + + var uniforms = cache.get( light ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + uniforms.color.copy( color ).multiplyScalar( intensity ); + uniforms.distance = distance; + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + uniforms.coneCos = Math.cos( light.angle ); + uniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) ); + uniforms.decay = light.decay; + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + var shadow = light.shadow; + + uniforms.shadowBias = shadow.bias; + uniforms.shadowRadius = shadow.radius; + uniforms.shadowMapSize = shadow.mapSize; + + } + + state.spotShadowMap[ spotLength ] = shadowMap; + state.spotShadowMatrix[ spotLength ] = light.shadow.matrix; + state.spot[ spotLength ] = uniforms; + + spotLength ++; + + } else if ( light.isRectAreaLight ) { + + var uniforms = cache.get( light ); + + // (a) intensity is the total visible light emitted + //uniforms.color.copy( color ).multiplyScalar( intensity / ( light.width * light.height * Math.PI ) ); + + // (b) intensity is the brightness of the light + uniforms.color.copy( color ).multiplyScalar( intensity ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + // extract local rotation of light to derive width/height half vectors + matrix42.identity(); + matrix4.copy( light.matrixWorld ); + matrix4.premultiply( viewMatrix ); + matrix42.extractRotation( matrix4 ); + + uniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 ); + uniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 ); + + uniforms.halfWidth.applyMatrix4( matrix42 ); + uniforms.halfHeight.applyMatrix4( matrix42 ); + + // TODO (abelnation): RectAreaLight distance? + // uniforms.distance = distance; + + state.rectArea[ rectAreaLength ] = uniforms; + + rectAreaLength ++; + + } else if ( light.isPointLight ) { + + var uniforms = cache.get( light ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); + uniforms.distance = light.distance; + uniforms.decay = light.decay; + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + var shadow = light.shadow; + + uniforms.shadowBias = shadow.bias; + uniforms.shadowRadius = shadow.radius; + uniforms.shadowMapSize = shadow.mapSize; + uniforms.shadowCameraNear = shadow.camera.near; + uniforms.shadowCameraFar = shadow.camera.far; + + } + + state.pointShadowMap[ pointLength ] = shadowMap; + state.pointShadowMatrix[ pointLength ] = light.shadow.matrix; + state.point[ pointLength ] = uniforms; + + pointLength ++; + + } else if ( light.isHemisphereLight ) { + + var uniforms = cache.get( light ); + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + uniforms.direction.transformDirection( viewMatrix ); + uniforms.direction.normalize(); + + uniforms.skyColor.copy( light.color ).multiplyScalar( intensity ); + uniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity ); + + state.hemi[ hemiLength ] = uniforms; + + hemiLength ++; + + } + + } + + state.ambient[ 0 ] = r; + state.ambient[ 1 ] = g; + state.ambient[ 2 ] = b; + + state.directional.length = directionalLength; + state.spot.length = spotLength; + state.rectArea.length = rectAreaLength; + state.point.length = pointLength; + state.hemi.length = hemiLength; + + state.hash.stateID = state.id; + state.hash.directionalLength = directionalLength; + state.hash.pointLength = pointLength; + state.hash.spotLength = spotLength; + state.hash.rectAreaLength = rectAreaLength; + state.hash.hemiLength = hemiLength; + state.hash.shadowsLength = shadows.length; + + } + + return { + setup: setup, + state: state + }; + + } + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function WebGLRenderState() { + + var lights = new WebGLLights(); + + var lightsArray = []; + var shadowsArray = []; + + function init() { + + lightsArray.length = 0; + shadowsArray.length = 0; + + } + + function pushLight( light ) { + + lightsArray.push( light ); + + } + + function pushShadow( shadowLight ) { + + shadowsArray.push( shadowLight ); + + } + + function setupLights( camera ) { + + lights.setup( lightsArray, shadowsArray, camera ); + + } + + var state = { + lightsArray: lightsArray, + shadowsArray: shadowsArray, + + lights: lights + }; + + return { + init: init, + state: state, + setupLights: setupLights, + + pushLight: pushLight, + pushShadow: pushShadow + }; + + } + + function WebGLRenderStates() { + + var renderStates = {}; + + function get( scene, camera ) { + + var renderState; + + if ( renderStates[ scene.id ] === undefined ) { + + renderState = new WebGLRenderState(); + renderStates[ scene.id ] = {}; + renderStates[ scene.id ][ camera.id ] = renderState; + + } else { + + if ( renderStates[ scene.id ][ camera.id ] === undefined ) { + + renderState = new WebGLRenderState(); + renderStates[ scene.id ][ camera.id ] = renderState; + + } else { + + renderState = renderStates[ scene.id ][ camera.id ]; + + } + + } + + return renderState; + + } + + function dispose() { + + renderStates = {}; + + } + + return { + get: get, + dispose: dispose + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author bhouston / https://clara.io + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * + * opacity: , + * + * map: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * wireframe: , + * wireframeLinewidth: + * } + */ + + function MeshDepthMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshDepthMaterial'; + + this.depthPacking = BasicDepthPacking; + + this.skinning = false; + this.morphTargets = false; + + this.map = null; + + this.alphaMap = null; + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; + this.lights = false; + + this.setValues( parameters ); + + } + + MeshDepthMaterial.prototype = Object.create( Material.prototype ); + MeshDepthMaterial.prototype.constructor = MeshDepthMaterial; + + MeshDepthMaterial.prototype.isMeshDepthMaterial = true; + + MeshDepthMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.depthPacking = source.depthPacking; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + return this; + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * + * referencePosition: , + * nearDistance: , + * farDistance: , + * + * skinning: , + * morphTargets: , + * + * map: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: + * + * } + */ + + function MeshDistanceMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshDistanceMaterial'; + + this.referencePosition = new Vector3(); + this.nearDistance = 1; + this.farDistance = 1000; + + this.skinning = false; + this.morphTargets = false; + + this.map = null; + + this.alphaMap = null; + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.fog = false; + this.lights = false; + + this.setValues( parameters ); + + } + + MeshDistanceMaterial.prototype = Object.create( Material.prototype ); + MeshDistanceMaterial.prototype.constructor = MeshDistanceMaterial; + + MeshDistanceMaterial.prototype.isMeshDistanceMaterial = true; + + MeshDistanceMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.referencePosition.copy( source.referencePosition ); + this.nearDistance = source.nearDistance; + this.farDistance = source.farDistance; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + return this; + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLShadowMap( _renderer, _objects, maxTextureSize ) { + + var _frustum = new Frustum(), + _projScreenMatrix = new Matrix4(), + + _shadowMapSize = new Vector2(), + _maxShadowMapSize = new Vector2( maxTextureSize, maxTextureSize ), + + _lookTarget = new Vector3(), + _lightPositionWorld = new Vector3(), + + _MorphingFlag = 1, + _SkinningFlag = 2, + + _NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1, + + _depthMaterials = new Array( _NumberOfMaterialVariants ), + _distanceMaterials = new Array( _NumberOfMaterialVariants ), + + _materialCache = {}; + + var shadowSide = { 0: BackSide, 1: FrontSide, 2: DoubleSide }; + + var cubeDirections = [ + new Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ), + new Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 ) + ]; + + var cubeUps = [ + new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), + new Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ), new Vector3( 0, 0, - 1 ) + ]; + + var cube2DViewPorts = [ + new Vector4(), new Vector4(), new Vector4(), + new Vector4(), new Vector4(), new Vector4() + ]; + + // init + + for ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) { + + var useMorphing = ( i & _MorphingFlag ) !== 0; + var useSkinning = ( i & _SkinningFlag ) !== 0; + + var depthMaterial = new MeshDepthMaterial( { + + depthPacking: RGBADepthPacking, + + morphTargets: useMorphing, + skinning: useSkinning + + } ); + + _depthMaterials[ i ] = depthMaterial; + + // + + var distanceMaterial = new MeshDistanceMaterial( { + + morphTargets: useMorphing, + skinning: useSkinning + + } ); + + _distanceMaterials[ i ] = distanceMaterial; + + } + + // + + var scope = this; + + this.enabled = false; + + this.autoUpdate = true; + this.needsUpdate = false; + + this.type = PCFShadowMap; + + this.render = function ( lights, scene, camera ) { + + if ( scope.enabled === false ) return; + if ( scope.autoUpdate === false && scope.needsUpdate === false ) return; + + if ( lights.length === 0 ) return; + + // TODO Clean up (needed in case of contextlost) + var _gl = _renderer.context; + var _state = _renderer.state; + + // Set GL state for depth map. + _state.disable( 3042 ); + _state.buffers.color.setClear( 1, 1, 1, 1 ); + _state.buffers.depth.setTest( true ); + _state.setScissorTest( false ); + + // render depth map + + var faceCount; + + for ( var i = 0, il = lights.length; i < il; i ++ ) { + + var light = lights[ i ]; + var shadow = light.shadow; + var isPointLight = light && light.isPointLight; + + if ( shadow === undefined ) { + + console.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' ); + continue; + + } + + var shadowCamera = shadow.camera; + + _shadowMapSize.copy( shadow.mapSize ); + _shadowMapSize.min( _maxShadowMapSize ); + + if ( isPointLight ) { + + var vpWidth = _shadowMapSize.x; + var vpHeight = _shadowMapSize.y; + + // These viewports map a cube-map onto a 2D texture with the + // following orientation: + // + // xzXZ + // y Y + // + // X - Positive x direction + // x - Negative x direction + // Y - Positive y direction + // y - Negative y direction + // Z - Positive z direction + // z - Negative z direction + + // positive X + cube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight ); + // negative X + cube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight ); + // positive Z + cube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight ); + // negative Z + cube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight ); + // positive Y + cube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight ); + // negative Y + cube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight ); + + _shadowMapSize.x *= 4.0; + _shadowMapSize.y *= 2.0; + + } + + if ( shadow.map === null ) { + + var pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat }; + + shadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars ); + shadow.map.texture.name = light.name + ".shadowMap"; + + shadowCamera.updateProjectionMatrix(); + + } + + if ( shadow.isSpotLightShadow ) { + + shadow.update( light ); + + } + + var shadowMap = shadow.map; + var shadowMatrix = shadow.matrix; + + _lightPositionWorld.setFromMatrixPosition( light.matrixWorld ); + shadowCamera.position.copy( _lightPositionWorld ); + + if ( isPointLight ) { + + faceCount = 6; + + // for point lights we set the shadow matrix to be a translation-only matrix + // equal to inverse of the light's position + + shadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z ); + + } else { + + faceCount = 1; + + _lookTarget.setFromMatrixPosition( light.target.matrixWorld ); + shadowCamera.lookAt( _lookTarget ); + shadowCamera.updateMatrixWorld(); + + // compute shadow matrix + + shadowMatrix.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 + ); + + shadowMatrix.multiply( shadowCamera.projectionMatrix ); + shadowMatrix.multiply( shadowCamera.matrixWorldInverse ); + + } + + _renderer.setRenderTarget( shadowMap ); + _renderer.clear(); + + // render shadow map for each cube face (if omni-directional) or + // run a single pass if not + + for ( var face = 0; face < faceCount; face ++ ) { + + if ( isPointLight ) { + + _lookTarget.copy( shadowCamera.position ); + _lookTarget.add( cubeDirections[ face ] ); + shadowCamera.up.copy( cubeUps[ face ] ); + shadowCamera.lookAt( _lookTarget ); + shadowCamera.updateMatrixWorld(); + + var vpDimensions = cube2DViewPorts[ face ]; + _state.viewport( vpDimensions ); + + } + + // update camera matrices and frustum + + _projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse ); + _frustum.setFromMatrix( _projScreenMatrix ); + + // set object matrices & frustum culling + + renderObject( scene, camera, shadowCamera, isPointLight ); + + } + + } + + scope.needsUpdate = false; + + }; + + function getDepthMaterial( object, material, isPointLight, lightPositionWorld, shadowCameraNear, shadowCameraFar ) { + + var geometry = object.geometry; + + var result = null; + + var materialVariants = _depthMaterials; + var customMaterial = object.customDepthMaterial; + + if ( isPointLight ) { + + materialVariants = _distanceMaterials; + customMaterial = object.customDistanceMaterial; + + } + + if ( ! customMaterial ) { + + var useMorphing = false; + + if ( material.morphTargets ) { + + if ( geometry && geometry.isBufferGeometry ) { + + useMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0; + + } else if ( geometry && geometry.isGeometry ) { + + useMorphing = geometry.morphTargets && geometry.morphTargets.length > 0; + + } + + } + + if ( object.isSkinnedMesh && material.skinning === false ) { + + console.warn( 'THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:', object ); + + } + + var useSkinning = object.isSkinnedMesh && material.skinning; + + var variantIndex = 0; + + if ( useMorphing ) variantIndex |= _MorphingFlag; + if ( useSkinning ) variantIndex |= _SkinningFlag; + + result = materialVariants[ variantIndex ]; + + } else { + + result = customMaterial; + + } + + if ( _renderer.localClippingEnabled && + material.clipShadows === true && + material.clippingPlanes.length !== 0 ) { + + // in this case we need a unique material instance reflecting the + // appropriate state + + var keyA = result.uuid, keyB = material.uuid; + + var materialsForVariant = _materialCache[ keyA ]; + + if ( materialsForVariant === undefined ) { + + materialsForVariant = {}; + _materialCache[ keyA ] = materialsForVariant; + + } + + var cachedMaterial = materialsForVariant[ keyB ]; + + if ( cachedMaterial === undefined ) { + + cachedMaterial = result.clone(); + materialsForVariant[ keyB ] = cachedMaterial; + + } + + result = cachedMaterial; + + } + + result.visible = material.visible; + result.wireframe = material.wireframe; + + result.side = ( material.shadowSide != null ) ? material.shadowSide : shadowSide[ material.side ]; + + result.clipShadows = material.clipShadows; + result.clippingPlanes = material.clippingPlanes; + result.clipIntersection = material.clipIntersection; + + result.wireframeLinewidth = material.wireframeLinewidth; + result.linewidth = material.linewidth; + + if ( isPointLight && result.isMeshDistanceMaterial ) { + + result.referencePosition.copy( lightPositionWorld ); + result.nearDistance = shadowCameraNear; + result.farDistance = shadowCameraFar; + + } + + return result; + + } + + function renderObject( object, camera, shadowCamera, isPointLight ) { + + if ( object.visible === false ) return; + + var visible = object.layers.test( camera.layers ); + + if ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) { + + if ( object.castShadow && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) { + + object.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld ); + + var geometry = _objects.update( object ); + var material = object.material; + + if ( Array.isArray( material ) ) { + + var groups = geometry.groups; + + for ( var k = 0, kl = groups.length; k < kl; k ++ ) { + + var group = groups[ k ]; + var groupMaterial = material[ group.materialIndex ]; + + if ( groupMaterial && groupMaterial.visible ) { + + var depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld, shadowCamera.near, shadowCamera.far ); + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group ); + + } + + } + + } else if ( material.visible ) { + + var depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld, shadowCamera.near, shadowCamera.far ); + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null ); + + } + + } + + } + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + renderObject( children[ i ], camera, shadowCamera, isPointLight ); + + } + + } + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLState( gl, extensions, utils, capabilities ) { + + function ColorBuffer() { + + var locked = false; + + var color = new Vector4(); + var currentColorMask = null; + var 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 ); + + } + + }, + + reset: function () { + + locked = false; + + currentColorMask = null; + currentColorClear.set( - 1, 0, 0, 0 ); // set to invalid state + + } + + }; + + } + + function DepthBuffer() { + + var locked = false; + + var currentDepthMask = null; + var currentDepthFunc = null; + var currentDepthClear = null; + + return { + + setTest: function ( depthTest ) { + + if ( depthTest ) { + + enable( 2929 ); + + } else { + + disable( 2929 ); + + } + + }, + + setMask: function ( depthMask ) { + + if ( currentDepthMask !== depthMask && ! locked ) { + + gl.depthMask( depthMask ); + currentDepthMask = depthMask; + + } + + }, + + setFunc: function ( depthFunc ) { + + if ( currentDepthFunc !== depthFunc ) { + + if ( depthFunc ) { + + switch ( depthFunc ) { + + case NeverDepth: + + gl.depthFunc( 512 ); + break; + + case AlwaysDepth: + + gl.depthFunc( 519 ); + break; + + case LessDepth: + + gl.depthFunc( 513 ); + break; + + case LessEqualDepth: + + gl.depthFunc( 515 ); + break; + + case EqualDepth: + + gl.depthFunc( 514 ); + break; + + case GreaterEqualDepth: + + gl.depthFunc( 518 ); + break; + + case GreaterDepth: + + gl.depthFunc( 516 ); + break; + + case NotEqualDepth: + + gl.depthFunc( 517 ); + break; + + default: + + gl.depthFunc( 515 ); + + } + + } else { + + gl.depthFunc( 515 ); + + } + + 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() { + + var locked = false; + + var currentStencilMask = null; + var currentStencilFunc = null; + var currentStencilRef = null; + var currentStencilFuncMask = null; + var currentStencilFail = null; + var currentStencilZFail = null; + var currentStencilZPass = null; + var currentStencilClear = null; + + return { + + setTest: function ( stencilTest ) { + + if ( stencilTest ) { + + enable( 2960 ); + + } else { + + disable( 2960 ); + + } + + }, + + setMask: function ( stencilMask ) { + + if ( currentStencilMask !== stencilMask && ! locked ) { + + gl.stencilMask( stencilMask ); + currentStencilMask = stencilMask; + + } + + }, + + setFunc: function ( stencilFunc, stencilRef, stencilMask ) { + + if ( currentStencilFunc !== stencilFunc || + currentStencilRef !== stencilRef || + currentStencilFuncMask !== stencilMask ) { + + gl.stencilFunc( stencilFunc, stencilRef, stencilMask ); + + currentStencilFunc = stencilFunc; + currentStencilRef = stencilRef; + currentStencilFuncMask = stencilMask; + + } + + }, + + setOp: function ( stencilFail, stencilZFail, stencilZPass ) { + + if ( currentStencilFail !== stencilFail || + currentStencilZFail !== stencilZFail || + currentStencilZPass !== stencilZPass ) { + + gl.stencilOp( stencilFail, stencilZFail, stencilZPass ); + + currentStencilFail = stencilFail; + currentStencilZFail = stencilZFail; + currentStencilZPass = stencilZPass; + + } + + }, + + 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; + currentStencilClear = null; + + } + + }; + + } + + // + + var colorBuffer = new ColorBuffer(); + var depthBuffer = new DepthBuffer(); + var stencilBuffer = new StencilBuffer(); + + var maxVertexAttributes = gl.getParameter( 34921 ); + var newAttributes = new Uint8Array( maxVertexAttributes ); + var enabledAttributes = new Uint8Array( maxVertexAttributes ); + var attributeDivisors = new Uint8Array( maxVertexAttributes ); + + var enabledCapabilities = {}; + + var compressedTextureFormats = null; + + var currentProgram = null; + + var currentBlendingEnabled = null; + var currentBlending = null; + var currentBlendEquation = null; + var currentBlendSrc = null; + var currentBlendDst = null; + var currentBlendEquationAlpha = null; + var currentBlendSrcAlpha = null; + var currentBlendDstAlpha = null; + var currentPremultipledAlpha = false; + + var currentFlipSided = null; + var currentCullFace = null; + + var currentLineWidth = null; + + var currentPolygonOffsetFactor = null; + var currentPolygonOffsetUnits = null; + + var maxTextures = gl.getParameter( 35661 ); + + var lineWidthAvailable = false; + var version = 0; + var glVersion = gl.getParameter( 7938 ); + + if ( glVersion.indexOf( 'WebGL' ) !== - 1 ) { + + version = parseFloat( /^WebGL\ ([0-9])/.exec( glVersion )[ 1 ] ); + lineWidthAvailable = ( version >= 1.0 ); + + } else if ( glVersion.indexOf( 'OpenGL ES' ) !== - 1 ) { + + version = parseFloat( /^OpenGL\ ES\ ([0-9])/.exec( glVersion )[ 1 ] ); + lineWidthAvailable = ( version >= 2.0 ); + + } + + var currentTextureSlot = null; + var currentBoundTextures = {}; + + var currentScissor = new Vector4(); + var currentViewport = new Vector4(); + + function createTexture( type, target, count ) { + + var data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4. + var texture = gl.createTexture(); + + gl.bindTexture( type, texture ); + gl.texParameteri( type, 10241, 9728 ); + gl.texParameteri( type, 10240, 9728 ); + + for ( var i = 0; i < count; i ++ ) { + + gl.texImage2D( target + i, 0, 6408, 1, 1, 0, 6408, 5121, data ); + + } + + return texture; + + } + + var emptyTextures = {}; + emptyTextures[ 3553 ] = createTexture( 3553, 3553, 1 ); + emptyTextures[ 34067 ] = createTexture( 34067, 34069, 6 ); + + // init + + colorBuffer.setClear( 0, 0, 0, 1 ); + depthBuffer.setClear( 1 ); + stencilBuffer.setClear( 0 ); + + enable( 2929 ); + depthBuffer.setFunc( LessEqualDepth ); + + setFlipSided( false ); + setCullFace( CullFaceBack ); + enable( 2884 ); + + setBlending( NoBlending ); + + // + + function initAttributes() { + + for ( var i = 0, l = newAttributes.length; i < l; i ++ ) { + + newAttributes[ i ] = 0; + + } + + } + + function enableAttribute( attribute ) { + + enableAttributeAndDivisor( attribute, 0 ); + + } + + function enableAttributeAndDivisor( attribute, meshPerAttribute ) { + + newAttributes[ attribute ] = 1; + + if ( enabledAttributes[ attribute ] === 0 ) { + + gl.enableVertexAttribArray( attribute ); + enabledAttributes[ attribute ] = 1; + + } + + if ( attributeDivisors[ attribute ] !== meshPerAttribute ) { + + var extension = capabilities.isWebGL2 ? gl : extensions.get( 'ANGLE_instanced_arrays' ); + + extension[ capabilities.isWebGL2 ? 'vertexAttribDivisor' : 'vertexAttribDivisorANGLE' ]( attribute, meshPerAttribute ); + attributeDivisors[ attribute ] = meshPerAttribute; + + } + + } + + function disableUnusedAttributes() { + + for ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) { + + if ( enabledAttributes[ i ] !== newAttributes[ i ] ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + } + + function enable( id ) { + + if ( enabledCapabilities[ id ] !== true ) { + + gl.enable( id ); + enabledCapabilities[ id ] = true; + + } + + } + + function disable( id ) { + + if ( enabledCapabilities[ id ] !== false ) { + + gl.disable( id ); + enabledCapabilities[ id ] = false; + + } + + } + + function getCompressedTextureFormats() { + + if ( compressedTextureFormats === null ) { + + compressedTextureFormats = []; + + if ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) || + extensions.get( 'WEBGL_compressed_texture_s3tc' ) || + extensions.get( 'WEBGL_compressed_texture_etc1' ) || + extensions.get( 'WEBGL_compressed_texture_astc' ) ) { + + var formats = gl.getParameter( 34467 ); + + for ( var i = 0; i < formats.length; i ++ ) { + + compressedTextureFormats.push( formats[ i ] ); + + } + + } + + } + + return compressedTextureFormats; + + } + + function useProgram( program ) { + + if ( currentProgram !== program ) { + + gl.useProgram( program ); + + currentProgram = program; + + return true; + + } + + return false; + + } + + function setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) { + + if ( blending === NoBlending ) { + + if ( currentBlendingEnabled ) { + + disable( 3042 ); + currentBlendingEnabled = false; + + } + + return; + + } + + if ( ! currentBlendingEnabled ) { + + enable( 3042 ); + currentBlendingEnabled = true; + + } + + if ( blending !== CustomBlending ) { + + if ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) { + + if ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) { + + gl.blendEquation( 32774 ); + + currentBlendEquation = AddEquation; + currentBlendEquationAlpha = AddEquation; + + } + + if ( premultipliedAlpha ) { + + switch ( blending ) { + + case NormalBlending: + gl.blendFuncSeparate( 1, 771, 1, 771 ); + break; + + case AdditiveBlending: + gl.blendFunc( 1, 1 ); + break; + + case SubtractiveBlending: + gl.blendFuncSeparate( 0, 0, 769, 771 ); + break; + + case MultiplyBlending: + gl.blendFuncSeparate( 0, 768, 0, 770 ); + break; + + default: + console.error( 'THREE.WebGLState: Invalid blending: ', blending ); + break; + + } + + } else { + + switch ( blending ) { + + case NormalBlending: + gl.blendFuncSeparate( 770, 771, 1, 771 ); + break; + + case AdditiveBlending: + gl.blendFunc( 770, 1 ); + break; + + case SubtractiveBlending: + gl.blendFunc( 0, 769 ); + break; + + case MultiplyBlending: + gl.blendFunc( 0, 768 ); + break; + + default: + console.error( 'THREE.WebGLState: Invalid blending: ', blending ); + break; + + } + + } + + currentBlendSrc = null; + currentBlendDst = null; + currentBlendSrcAlpha = null; + currentBlendDstAlpha = null; + + currentBlending = blending; + currentPremultipledAlpha = premultipliedAlpha; + + } + + return; + + } + + // custom blending + + blendEquationAlpha = blendEquationAlpha || blendEquation; + blendSrcAlpha = blendSrcAlpha || blendSrc; + blendDstAlpha = blendDstAlpha || blendDst; + + if ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) { + + gl.blendEquationSeparate( utils.convert( blendEquation ), utils.convert( blendEquationAlpha ) ); + + currentBlendEquation = blendEquation; + currentBlendEquationAlpha = blendEquationAlpha; + + } + + if ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) { + + gl.blendFuncSeparate( utils.convert( blendSrc ), utils.convert( blendDst ), utils.convert( blendSrcAlpha ), utils.convert( blendDstAlpha ) ); + + currentBlendSrc = blendSrc; + currentBlendDst = blendDst; + currentBlendSrcAlpha = blendSrcAlpha; + currentBlendDstAlpha = blendDstAlpha; + + } + + currentBlending = blending; + currentPremultipledAlpha = null; + + } + + function setMaterial( material, frontFaceCW ) { + + material.side === DoubleSide + ? disable( 2884 ) + : enable( 2884 ); + + var flipSided = ( material.side === BackSide ); + if ( frontFaceCW ) flipSided = ! flipSided; + + setFlipSided( flipSided ); + + ( material.blending === NormalBlending && material.transparent === false ) + ? setBlending( NoBlending ) + : setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha ); + + depthBuffer.setFunc( material.depthFunc ); + depthBuffer.setTest( material.depthTest ); + depthBuffer.setMask( material.depthWrite ); + colorBuffer.setMask( material.colorWrite ); + + setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits ); + + } + + // + + function setFlipSided( flipSided ) { + + if ( currentFlipSided !== flipSided ) { + + if ( flipSided ) { + + gl.frontFace( 2304 ); + + } else { + + gl.frontFace( 2305 ); + + } + + currentFlipSided = flipSided; + + } + + } + + function setCullFace( cullFace ) { + + if ( cullFace !== CullFaceNone ) { + + enable( 2884 ); + + if ( cullFace !== currentCullFace ) { + + if ( cullFace === CullFaceBack ) { + + gl.cullFace( 1029 ); + + } else if ( cullFace === CullFaceFront ) { + + gl.cullFace( 1028 ); + + } else { + + gl.cullFace( 1032 ); + + } + + } + + } else { + + disable( 2884 ); + + } + + currentCullFace = cullFace; + + } + + function setLineWidth( width ) { + + if ( width !== currentLineWidth ) { + + if ( lineWidthAvailable ) gl.lineWidth( width ); + + currentLineWidth = width; + + } + + } + + function setPolygonOffset( polygonOffset, factor, units ) { + + if ( polygonOffset ) { + + enable( 32823 ); + + if ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) { + + gl.polygonOffset( factor, units ); + + currentPolygonOffsetFactor = factor; + currentPolygonOffsetUnits = units; + + } + + } else { + + disable( 32823 ); + + } + + } + + function setScissorTest( scissorTest ) { + + if ( scissorTest ) { + + enable( 3089 ); + + } else { + + disable( 3089 ); + + } + + } + + // texture + + function activeTexture( webglSlot ) { + + if ( webglSlot === undefined ) webglSlot = 33984 + maxTextures - 1; + + if ( currentTextureSlot !== webglSlot ) { + + gl.activeTexture( webglSlot ); + currentTextureSlot = webglSlot; + + } + + } + + function bindTexture( webglType, webglTexture ) { + + if ( currentTextureSlot === null ) { + + activeTexture(); + + } + + var boundTexture = currentBoundTextures[ currentTextureSlot ]; + + if ( boundTexture === undefined ) { + + boundTexture = { type: undefined, texture: undefined }; + currentBoundTextures[ currentTextureSlot ] = boundTexture; + + } + + if ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) { + + gl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] ); + + boundTexture.type = webglType; + boundTexture.texture = webglTexture; + + } + + } + + function compressedTexImage2D() { + + try { + + gl.compressedTexImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function texImage2D() { + + try { + + gl.texImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function texImage3D() { + + try { + + gl.texImage3D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + // + + function scissor( scissor ) { + + if ( currentScissor.equals( scissor ) === false ) { + + gl.scissor( scissor.x, scissor.y, scissor.z, scissor.w ); + currentScissor.copy( scissor ); + + } + + } + + function viewport( viewport ) { + + if ( currentViewport.equals( viewport ) === false ) { + + gl.viewport( viewport.x, viewport.y, viewport.z, viewport.w ); + currentViewport.copy( viewport ); + + } + + } + + // + + function reset() { + + for ( var i = 0; i < enabledAttributes.length; i ++ ) { + + if ( enabledAttributes[ i ] === 1 ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + enabledCapabilities = {}; + + compressedTextureFormats = null; + + currentTextureSlot = null; + currentBoundTextures = {}; + + currentProgram = null; + + currentBlending = null; + + currentFlipSided = null; + currentCullFace = null; + + colorBuffer.reset(); + depthBuffer.reset(); + stencilBuffer.reset(); + + } + + return { + + buffers: { + color: colorBuffer, + depth: depthBuffer, + stencil: stencilBuffer + }, + + initAttributes: initAttributes, + enableAttribute: enableAttribute, + enableAttributeAndDivisor: enableAttributeAndDivisor, + disableUnusedAttributes: disableUnusedAttributes, + enable: enable, + disable: disable, + getCompressedTextureFormats: getCompressedTextureFormats, + + useProgram: useProgram, + + setBlending: setBlending, + setMaterial: setMaterial, + + setFlipSided: setFlipSided, + setCullFace: setCullFace, + + setLineWidth: setLineWidth, + setPolygonOffset: setPolygonOffset, + + setScissorTest: setScissorTest, + + activeTexture: activeTexture, + bindTexture: bindTexture, + compressedTexImage2D: compressedTexImage2D, + texImage2D: texImage2D, + texImage3D: texImage3D, + + scissor: scissor, + viewport: viewport, + + reset: reset + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) { + + var _videoTextures = {}; + var _canvas; + + // + + function clampToMaxSize( image, maxSize ) { + + if ( image.width > maxSize || image.height > maxSize ) { + + if ( 'data' in image ) { + + console.warn( 'THREE.WebGLRenderer: image in DataTexture is too big (' + image.width + 'x' + image.height + ').' ); + return; + + } + + // Warning: Scaling through the canvas will only work with images that use + // premultiplied alpha. + + var scale = maxSize / Math.max( image.width, image.height ); + + var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = Math.floor( image.width * scale ); + canvas.height = Math.floor( image.height * scale ); + + var context = canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height ); + + console.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height ); + + return canvas; + + } + + return image; + + } + + function isPowerOfTwo( image ) { + + return _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height ); + + } + + function makePowerOfTwo( image ) { + + if ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof ImageBitmap ) { + + if ( _canvas === undefined ) _canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + + _canvas.width = _Math.floorPowerOfTwo( image.width ); + _canvas.height = _Math.floorPowerOfTwo( image.height ); + + var context = _canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, _canvas.width, _canvas.height ); + + console.warn( 'THREE.WebGLRenderer: image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + _canvas.width + 'x' + _canvas.height ); + + return _canvas; + + } + + return image; + + } + + function textureNeedsPowerOfTwo( texture ) { + + if ( capabilities.isWebGL2 ) return false; + + return ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) || + ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ); + + } + + function textureNeedsGenerateMipmaps( texture, isPowerOfTwo ) { + + return texture.generateMipmaps && isPowerOfTwo && + texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter; + + } + + function generateMipmap( target, texture, width, height ) { + + _gl.generateMipmap( target ); + + var textureProperties = properties.get( texture ); + + // 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; + + } + + function getInternalFormat( glFormat, glType ) { + + if ( ! capabilities.isWebGL2 ) return glFormat; + + if ( glFormat === 6403 ) { + + if ( glType === 5126 ) return 33326; + if ( glType === 5131 ) return 33325; + if ( glType === 5121 ) return 33321; + + } + + if ( glFormat === 6407 ) { + + if ( glType === 5126 ) return 34837; + if ( glType === 5131 ) return 34843; + if ( glType === 5121 ) return 32849; + + } + + if ( glFormat === 6408 ) { + + if ( glType === 5126 ) return 34836; + if ( glType === 5131 ) return 34842; + if ( glType === 5121 ) return 32856; + + } + + return glFormat; + + } + + // Fallback filters for non-power-of-2 textures + + function filterFallback( f ) { + + if ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) { + + return 9728; + + } + + return 9729; + + } + + // + + function onTextureDispose( event ) { + + var texture = event.target; + + texture.removeEventListener( 'dispose', onTextureDispose ); + + deallocateTexture( texture ); + + if ( texture.isVideoTexture ) { + + delete _videoTextures[ texture.id ]; + + } + + info.memory.textures --; + + } + + function onRenderTargetDispose( event ) { + + var renderTarget = event.target; + + renderTarget.removeEventListener( 'dispose', onRenderTargetDispose ); + + deallocateRenderTarget( renderTarget ); + + info.memory.textures --; + + } + + // + + function deallocateTexture( texture ) { + + var textureProperties = properties.get( texture ); + + if ( texture.image && textureProperties.__image__webglTextureCube ) { + + // cube texture + + _gl.deleteTexture( textureProperties.__image__webglTextureCube ); + + } else { + + // 2D texture + + if ( textureProperties.__webglInit === undefined ) return; + + _gl.deleteTexture( textureProperties.__webglTexture ); + + } + + // remove all webgl properties + properties.remove( texture ); + + } + + function deallocateRenderTarget( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); + + if ( ! renderTarget ) return; + + if ( textureProperties.__webglTexture !== undefined ) { + + _gl.deleteTexture( textureProperties.__webglTexture ); + + } + + if ( renderTarget.depthTexture ) { + + renderTarget.depthTexture.dispose(); + + } + + if ( renderTarget.isWebGLRenderTargetCube ) { + + for ( var i = 0; i < 6; i ++ ) { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] ); + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] ); + + } + + } else { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer ); + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer ); + + } + + properties.remove( renderTarget.texture ); + properties.remove( renderTarget ); + + } + + // + + + + function setTexture2D( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.isVideoTexture ) updateVideoTexture( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + var image = texture.image; + + if ( image === undefined ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined' ); + + } else if ( image.complete === false ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete' ); + + } else { + + uploadTexture( textureProperties, texture, slot ); + return; + + } + + } + + state.activeTexture( 33984 + slot ); + state.bindTexture( 3553, textureProperties.__webglTexture ); + + } + + function setTexture3D( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + uploadTexture( textureProperties, texture, slot ); + return; + + } + + state.activeTexture( 33984 + slot ); + state.bindTexture( 32879, textureProperties.__webglTexture ); + + } + + + function setTextureCube( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.image.length === 6 ) { + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + if ( ! textureProperties.__image__webglTextureCube ) { + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__image__webglTextureCube = _gl.createTexture(); + + info.memory.textures ++; + + } + + state.activeTexture( 33984 + slot ); + state.bindTexture( 34067, textureProperties.__image__webglTextureCube ); + + _gl.pixelStorei( 37440, texture.flipY ); + + var isCompressed = ( texture && texture.isCompressedTexture ); + var isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture ); + + var cubeImage = []; + + for ( var i = 0; i < 6; i ++ ) { + + if ( ! isCompressed && ! isDataTexture ) { + + cubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize ); + + } else { + + cubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ]; + + } + + } + + var image = cubeImage[ 0 ], + isPowerOfTwoImage = isPowerOfTwo( image ), + glFormat = utils.convert( texture.format ), + glType = utils.convert( texture.type ), + glInternalFormat = getInternalFormat( glFormat, glType ); + + setTextureParameters( 34067, texture, isPowerOfTwoImage ); + + for ( var i = 0; i < 6; i ++ ) { + + if ( ! isCompressed ) { + + if ( isDataTexture ) { + + state.texImage2D( 34069 + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data ); + + } else { + + state.texImage2D( 34069 + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] ); + + } + + } else { + + var mipmap, mipmaps = cubeImage[ i ].mipmaps; + + for ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) { + + mipmap = mipmaps[ j ]; + + if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) { + + if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { + + state.compressedTexImage2D( 34069 + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' ); + + } + + } else { + + state.texImage2D( 34069 + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + } + + } + + if ( ! isCompressed ) { + + textureProperties.__maxMipLevel = 0; + + } else { + + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } + + if ( textureNeedsGenerateMipmaps( texture, isPowerOfTwoImage ) ) { + + // We assume images for cube map have the same size. + generateMipmap( 34067, texture, image.width, image.height ); + + } + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } else { + + state.activeTexture( 33984 + slot ); + state.bindTexture( 34067, textureProperties.__image__webglTextureCube ); + + } + + } + + } + + function setTextureCubeDynamic( texture, slot ) { + + state.activeTexture( 33984 + slot ); + state.bindTexture( 34067, properties.get( texture ).__webglTexture ); + + } + + function setTextureParameters( textureType, texture, isPowerOfTwoImage ) { + + var extension; + + if ( isPowerOfTwoImage ) { + + _gl.texParameteri( textureType, 10242, utils.convert( texture.wrapS ) ); + _gl.texParameteri( textureType, 10243, utils.convert( texture.wrapT ) ); + + _gl.texParameteri( textureType, 10240, utils.convert( texture.magFilter ) ); + _gl.texParameteri( textureType, 10241, utils.convert( texture.minFilter ) ); + + } else { + + _gl.texParameteri( textureType, 10242, 33071 ); + _gl.texParameteri( textureType, 10243, 33071 ); + + if ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.' ); + + } + + _gl.texParameteri( textureType, 10240, filterFallback( texture.magFilter ) ); + _gl.texParameteri( textureType, 10241, filterFallback( texture.minFilter ) ); + + if ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.' ); + + } + + } + + extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension ) { + + if ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return; + if ( texture.type === HalfFloatType && ( capabilities.isWebGL2 || extensions.get( 'OES_texture_half_float_linear' ) ) === null ) return; + + if ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) { + + _gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) ); + properties.get( texture ).__currentAnisotropy = texture.anisotropy; + + } + + } + + } + + function uploadTexture( textureProperties, texture, slot ) { + + var textureType; + + if ( texture.isDataTexture3D ) { + + textureType = 32879; + + } else { + + textureType = 3553; + + } + + + if ( textureProperties.__webglInit === undefined ) { + + textureProperties.__webglInit = true; + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + info.memory.textures ++; + + } + state.activeTexture( 33984 + slot ); + + + state.bindTexture( textureType, textureProperties.__webglTexture ); + + + + _gl.pixelStorei( 37440, texture.flipY ); + _gl.pixelStorei( 37441, texture.premultiplyAlpha ); + _gl.pixelStorei( 3317, texture.unpackAlignment ); + + var image = clampToMaxSize( texture.image, capabilities.maxTextureSize ); + + if ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) { + + image = makePowerOfTwo( image ); + + } + + var isPowerOfTwoImage = isPowerOfTwo( image ), + glFormat = utils.convert( texture.format ), + glType = utils.convert( texture.type ), + glInternalFormat = getInternalFormat( glFormat, glType ); + + setTextureParameters( textureType, texture, isPowerOfTwoImage ); + + var mipmap, mipmaps = texture.mipmaps; + + if ( texture.isDepthTexture ) { + + // populate depth texture with dummy data + + glInternalFormat = 6402; + + if ( texture.type === FloatType ) { + + if ( ! capabilities.isWebGL2 ) throw new Error( 'Float Depth Texture only supported in WebGL2.0' ); + glInternalFormat = 36012; + + } else if ( capabilities.isWebGL2 ) { + + // WebGL 2.0 requires signed internalformat for glTexImage2D + glInternalFormat = 33189; + + } + + if ( texture.format === DepthFormat && glInternalFormat === 6402 ) { + + // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are + // DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) { + + console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' ); + + texture.type = UnsignedShortType; + glType = utils.convert( texture.type ); + + } + + } + + // Depth stencil textures need the DEPTH_STENCIL internal format + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.format === DepthStencilFormat ) { + + glInternalFormat = 34041; + + // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are + // DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL. + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.type !== UnsignedInt248Type ) { + + console.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' ); + + texture.type = UnsignedInt248Type; + glType = utils.convert( texture.type ); + + } + + } + + state.texImage2D( 3553, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null ); + + } else if ( texture.isDataTexture ) { + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && isPowerOfTwoImage ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + texture.generateMipmaps = false; + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } else { + + state.texImage2D( 3553, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data ); + textureProperties.__maxMipLevel = 0; + + } + + } else if ( texture.isCompressedTexture ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + + if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) { + + if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { + + state.compressedTexImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' ); + + } + + } else { + + state.texImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } else if ( texture.isDataTexture3D ) { + + state.texImage3D( 32879, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data ); + textureProperties.__maxMipLevel = 0; + + } else { + + // regular Texture (image, video, canvas) + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && isPowerOfTwoImage ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( 3553, i, glInternalFormat, glFormat, glType, mipmap ); + + } + + texture.generateMipmaps = false; + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } else { + + state.texImage2D( 3553, 0, glInternalFormat, glFormat, glType, image ); + textureProperties.__maxMipLevel = 0; + + } + + } + + if ( textureNeedsGenerateMipmaps( texture, isPowerOfTwoImage ) ) { + + generateMipmap( 3553, texture, image.width, image.height ); + + } + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } + + // Render targets + + // Setup storage for target texture and bind it to correct framebuffer + function setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) { + + var glFormat = utils.convert( renderTarget.texture.format ); + var glType = utils.convert( renderTarget.texture.type ); + var glInternalFormat = getInternalFormat( glFormat, glType ); + state.texImage2D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null ); + _gl.bindFramebuffer( 36160, framebuffer ); + _gl.framebufferTexture2D( 36160, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 ); + _gl.bindFramebuffer( 36160, null ); + + } + + // Setup storage for internal depth/stencil buffers and bind to correct framebuffer + function setupRenderBufferStorage( renderbuffer, renderTarget ) { + + _gl.bindRenderbuffer( 36161, renderbuffer ); + + if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( 36161, 33189, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( 36160, 36096, 36161, renderbuffer ); + + } else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( 36161, 34041, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( 36160, 33306, 36161, renderbuffer ); + + } else { + + // FIXME: We don't support !depth !stencil + _gl.renderbufferStorage( 36161, 32854, renderTarget.width, renderTarget.height ); + + } + + _gl.bindRenderbuffer( 36161, null ); + + } + + // Setup resources for a Depth Texture for a FBO (needs an extension) + function setupDepthTexture( framebuffer, renderTarget ) { + + var isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube ); + if ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' ); + + _gl.bindFramebuffer( 36160, framebuffer ); + + if ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) { + + throw new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' ); + + } + + // upload an empty depth texture with framebuffer size + if ( ! properties.get( renderTarget.depthTexture ).__webglTexture || + renderTarget.depthTexture.image.width !== renderTarget.width || + renderTarget.depthTexture.image.height !== renderTarget.height ) { + + renderTarget.depthTexture.image.width = renderTarget.width; + renderTarget.depthTexture.image.height = renderTarget.height; + renderTarget.depthTexture.needsUpdate = true; + + } + + setTexture2D( renderTarget.depthTexture, 0 ); + + var webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture; + + if ( renderTarget.depthTexture.format === DepthFormat ) { + + _gl.framebufferTexture2D( 36160, 36096, 3553, webglDepthTexture, 0 ); + + } else if ( renderTarget.depthTexture.format === DepthStencilFormat ) { + + _gl.framebufferTexture2D( 36160, 33306, 3553, webglDepthTexture, 0 ); + + } else { + + throw new Error( 'Unknown depthTexture format' ); + + } + + } + + // Setup GL resources for a non-texture depth buffer + function setupDepthRenderbuffer( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + + var isCube = ( renderTarget.isWebGLRenderTargetCube === true ); + + if ( renderTarget.depthTexture ) { + + if ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' ); + + setupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget ); + + } else { + + if ( isCube ) { + + renderTargetProperties.__webglDepthbuffer = []; + + for ( var i = 0; i < 6; i ++ ) { + + _gl.bindFramebuffer( 36160, renderTargetProperties.__webglFramebuffer[ i ] ); + renderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget ); + + } + + } else { + + _gl.bindFramebuffer( 36160, renderTargetProperties.__webglFramebuffer ); + renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget ); + + } + + } + + _gl.bindFramebuffer( 36160, null ); + + } + + // Set up GL resources for the render target + function setupRenderTarget( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); + + renderTarget.addEventListener( 'dispose', onRenderTargetDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + info.memory.textures ++; + + var isCube = ( renderTarget.isWebGLRenderTargetCube === true ); + var isTargetPowerOfTwo = isPowerOfTwo( renderTarget ); + + // Setup framebuffer + + if ( isCube ) { + + renderTargetProperties.__webglFramebuffer = []; + + for ( var i = 0; i < 6; i ++ ) { + + renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer(); + + } + + } else { + + renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer(); + + } + + // Setup color buffer + + if ( isCube ) { + + state.bindTexture( 34067, textureProperties.__webglTexture ); + setTextureParameters( 34067, renderTarget.texture, isTargetPowerOfTwo ); + + for ( var i = 0; i < 6; i ++ ) { + + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, 36064, 34069 + i ); + + } + + if ( textureNeedsGenerateMipmaps( renderTarget.texture, isTargetPowerOfTwo ) ) { + + generateMipmap( 34067, renderTarget.texture, renderTarget.width, renderTarget.height ); + + } + + state.bindTexture( 34067, null ); + + } else { + + state.bindTexture( 3553, textureProperties.__webglTexture ); + setTextureParameters( 3553, renderTarget.texture, isTargetPowerOfTwo ); + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, 36064, 3553 ); + + if ( textureNeedsGenerateMipmaps( renderTarget.texture, isTargetPowerOfTwo ) ) { + + generateMipmap( 3553, renderTarget.texture, renderTarget.width, renderTarget.height ); + + } + + state.bindTexture( 3553, null ); + + } + + // Setup depth and stencil buffers + + if ( renderTarget.depthBuffer ) { + + setupDepthRenderbuffer( renderTarget ); + + } + + } + + function updateRenderTargetMipmap( renderTarget ) { + + var texture = renderTarget.texture; + var isTargetPowerOfTwo = isPowerOfTwo( renderTarget ); + + if ( textureNeedsGenerateMipmaps( texture, isTargetPowerOfTwo ) ) { + + var target = renderTarget.isWebGLRenderTargetCube ? 34067 : 3553; + var webglTexture = properties.get( texture ).__webglTexture; + + state.bindTexture( target, webglTexture ); + generateMipmap( target, texture, renderTarget.width, renderTarget.height ); + state.bindTexture( target, null ); + + } + + } + + function updateVideoTexture( texture ) { + + var id = texture.id; + var frame = info.render.frame; + + // Check the last frame we updated the VideoTexture + + if ( _videoTextures[ id ] !== frame ) { + + _videoTextures[ id ] = frame; + texture.update(); + + } + + } + + this.setTexture2D = setTexture2D; + this.setTexture3D = setTexture3D; + this.setTextureCube = setTextureCube; + this.setTextureCubeDynamic = setTextureCubeDynamic; + this.setupRenderTarget = setupRenderTarget; + this.updateRenderTargetMipmap = updateRenderTargetMipmap; + + } + + /** + * @author thespite / http://www.twitter.com/thespite + */ + + function WebGLUtils( gl, extensions, capabilities ) { + + function convert( p ) { + + var extension; + + if ( p === RepeatWrapping ) return 10497; + if ( p === ClampToEdgeWrapping ) return 33071; + if ( p === MirroredRepeatWrapping ) return 33648; + + if ( p === NearestFilter ) return 9728; + if ( p === NearestMipMapNearestFilter ) return 9984; + if ( p === NearestMipMapLinearFilter ) return 9986; + + if ( p === LinearFilter ) return 9729; + if ( p === LinearMipMapNearestFilter ) return 9985; + if ( p === LinearMipMapLinearFilter ) return 9987; + + if ( p === UnsignedByteType ) return 5121; + if ( p === UnsignedShort4444Type ) return 32819; + if ( p === UnsignedShort5551Type ) return 32820; + if ( p === UnsignedShort565Type ) return 33635; + + if ( p === ByteType ) return 5120; + if ( p === ShortType ) return 5122; + if ( p === UnsignedShortType ) return 5123; + if ( p === IntType ) return 5124; + if ( p === UnsignedIntType ) return 5125; + if ( p === FloatType ) return 5126; + + if ( p === HalfFloatType ) { + + if ( capabilities.isWebGL2 ) return 5131; + + extension = extensions.get( 'OES_texture_half_float' ); + + if ( extension !== null ) return extension.HALF_FLOAT_OES; + + } + + if ( p === AlphaFormat ) return 6406; + if ( p === RGBFormat ) return 6407; + if ( p === RGBAFormat ) return 6408; + if ( p === LuminanceFormat ) return 6409; + if ( p === LuminanceAlphaFormat ) return 6410; + if ( p === DepthFormat ) return 6402; + if ( p === DepthStencilFormat ) return 34041; + if ( p === RedFormat ) return 6403; + + if ( p === AddEquation ) return 32774; + if ( p === SubtractEquation ) return 32778; + if ( p === ReverseSubtractEquation ) return 32779; + + if ( p === ZeroFactor ) return 0; + if ( p === OneFactor ) return 1; + if ( p === SrcColorFactor ) return 768; + if ( p === OneMinusSrcColorFactor ) return 769; + if ( p === SrcAlphaFactor ) return 770; + if ( p === OneMinusSrcAlphaFactor ) return 771; + if ( p === DstAlphaFactor ) return 772; + if ( p === OneMinusDstAlphaFactor ) return 773; + + if ( p === DstColorFactor ) return 774; + if ( p === OneMinusDstColorFactor ) return 775; + if ( p === SrcAlphaSaturateFactor ) return 776; + + if ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || + p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + if ( extension !== null ) { + + if ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT; + if ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT; + + } + + } + + if ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || + p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + if ( extension !== null ) { + + if ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; + if ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; + if ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + if ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; + + } + + } + + if ( p === RGB_ETC1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_etc1' ); + + if ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL; + + } + + if ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format || + p === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format || + p === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format || + p === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format || + p === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_astc' ); + + if ( extension !== null ) { + + return p; + + } + + } + + if ( p === MinEquation || p === MaxEquation ) { + + if ( capabilities.isWebGL2 ) { + + if ( p === MinEquation ) return 32775; + if ( p === MaxEquation ) return 32776; + + } + + extension = extensions.get( 'EXT_blend_minmax' ); + + if ( extension !== null ) { + + if ( p === MinEquation ) return extension.MIN_EXT; + if ( p === MaxEquation ) return extension.MAX_EXT; + + } + + } + + if ( p === UnsignedInt248Type ) { + + if ( capabilities.isWebGL2 ) return 34042; + + extension = extensions.get( 'WEBGL_depth_texture' ); + + if ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL; + + } + + return 0; + + } + + return { convert: convert }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Group() { + + Object3D.call( this ); + + this.type = 'Group'; + + } + + Group.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Group, + + isGroup: true + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Camera() { + + Object3D.call( this ); + + this.type = 'Camera'; + + this.matrixWorldInverse = new Matrix4(); + + this.projectionMatrix = new Matrix4(); + this.projectionMatrixInverse = new Matrix4(); + + } + + Camera.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Camera, + + isCamera: true, + + copy: function ( source, recursive ) { + + Object3D.prototype.copy.call( this, source, recursive ); + + this.matrixWorldInverse.copy( source.matrixWorldInverse ); + + this.projectionMatrix.copy( source.projectionMatrix ); + this.projectionMatrixInverse.copy( source.projectionMatrixInverse ); + + return this; + + }, + + getWorldDirection: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Camera: .getWorldDirection() target is now required' ); + target = new Vector3(); + + } + + this.updateMatrixWorld( true ); + + var e = this.matrixWorld.elements; + + return target.set( - e[ 8 ], - e[ 9 ], - e[ 10 ] ).normalize(); + + }, + + updateMatrixWorld: function ( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + this.matrixWorldInverse.getInverse( this.matrixWorld ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author greggman / http://games.greggman.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author tschw + */ + + function PerspectiveCamera( fov, aspect, near, far ) { + + Camera.call( this ); + + this.type = 'PerspectiveCamera'; + + this.fov = fov !== undefined ? fov : 50; + this.zoom = 1; + + this.near = near !== undefined ? near : 0.1; + this.far = far !== undefined ? far : 2000; + this.focus = 10; + + this.aspect = aspect !== undefined ? aspect : 1; + this.view = null; + + this.filmGauge = 35; // width of the film (default in millimeters) + this.filmOffset = 0; // horizontal film offset (same unit as gauge) + + this.updateProjectionMatrix(); + + } + + PerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), { + + constructor: PerspectiveCamera, + + isPerspectiveCamera: true, + + copy: function ( source, recursive ) { + + Camera.prototype.copy.call( this, source, recursive ); + + this.fov = source.fov; + this.zoom = source.zoom; + + this.near = source.near; + this.far = source.far; + this.focus = source.focus; + + this.aspect = source.aspect; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + this.filmGauge = source.filmGauge; + this.filmOffset = source.filmOffset; + + return this; + + }, + + /** + * Sets the FOV by focal length in respect to the current .filmGauge. + * + * The default film gauge is 35, so that the focal length can be specified for + * a 35mm (full frame) camera. + * + * Values for focal length and film gauge must have the same unit. + */ + setFocalLength: function ( focalLength ) { + + // see http://www.bobatkins.com/photography/technical/field_of_view.html + var vExtentSlope = 0.5 * this.getFilmHeight() / focalLength; + + this.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope ); + this.updateProjectionMatrix(); + + }, + + /** + * Calculates the focal length from the current .fov and .filmGauge. + */ + getFocalLength: function () { + + var vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov ); + + return 0.5 * this.getFilmHeight() / vExtentSlope; + + }, + + getEffectiveFOV: function () { + + return _Math.RAD2DEG * 2 * Math.atan( + Math.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom ); + + }, + + getFilmWidth: function () { + + // film not completely covered in portrait format (aspect < 1) + return this.filmGauge * Math.min( this.aspect, 1 ); + + }, + + getFilmHeight: function () { + + // film not completely covered in landscape format (aspect > 1) + return this.filmGauge / Math.max( this.aspect, 1 ); + + }, + + /** + * Sets an offset in a larger frustum. This is useful for multi-window or + * multi-monitor/multi-machine setups. + * + * For example, if you have 3x2 monitors and each monitor is 1920x1080 and + * the monitors are in grid like this + * + * +---+---+---+ + * | A | B | C | + * +---+---+---+ + * | D | E | F | + * +---+---+---+ + * + * then for each monitor you would call it like this + * + * var w = 1920; + * var h = 1080; + * var fullWidth = w * 3; + * var fullHeight = h * 2; + * + * --A-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h ); + * --B-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h ); + * --C-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h ); + * --D-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h ); + * --E-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h ); + * --F-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h ); + * + * Note there is no reason monitors have to be the same size or in a grid. + */ + setViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) { + + this.aspect = fullWidth / fullHeight; + + if ( this.view === null ) { + + this.view = { + enabled: true, + fullWidth: 1, + fullHeight: 1, + offsetX: 0, + offsetY: 0, + width: 1, + height: 1 + }; + + } + + this.view.enabled = true; + this.view.fullWidth = fullWidth; + this.view.fullHeight = fullHeight; + this.view.offsetX = x; + this.view.offsetY = y; + this.view.width = width; + this.view.height = height; + + this.updateProjectionMatrix(); + + }, + + clearViewOffset: function () { + + if ( this.view !== null ) { + + this.view.enabled = false; + + } + + this.updateProjectionMatrix(); + + }, + + updateProjectionMatrix: function () { + + var near = this.near, + top = near * Math.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom, + height = 2 * top, + width = this.aspect * height, + left = - 0.5 * width, + view = this.view; + + if ( this.view !== null && this.view.enabled ) { + + var fullWidth = view.fullWidth, + fullHeight = view.fullHeight; + + left += view.offsetX * width / fullWidth; + top -= view.offsetY * height / fullHeight; + width *= view.width / fullWidth; + height *= view.height / fullHeight; + + } + + var skew = this.filmOffset; + if ( skew !== 0 ) left += near * skew / this.getFilmWidth(); + + this.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far ); + + this.projectionMatrixInverse.getInverse( this.projectionMatrix ); + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.fov = this.fov; + data.object.zoom = this.zoom; + + data.object.near = this.near; + data.object.far = this.far; + data.object.focus = this.focus; + + data.object.aspect = this.aspect; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + data.object.filmGauge = this.filmGauge; + data.object.filmOffset = this.filmOffset; + + return data; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ArrayCamera( array ) { + + PerspectiveCamera.call( this ); + + this.cameras = array || []; + + } + + ArrayCamera.prototype = Object.assign( Object.create( PerspectiveCamera.prototype ), { + + constructor: ArrayCamera, + + isArrayCamera: true + + } ); + + /** + * @author jsantell / https://www.jsantell.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + var cameraLPos = new Vector3(); + var cameraRPos = new Vector3(); + + /** + * Assumes 2 cameras that are parallel and share an X-axis, and that + * the cameras' projection and world matrices have already been set. + * And that near and far planes are identical for both cameras. + * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765 + */ + function setProjectionFromUnion( camera, cameraL, cameraR ) { + + cameraLPos.setFromMatrixPosition( cameraL.matrixWorld ); + cameraRPos.setFromMatrixPosition( cameraR.matrixWorld ); + + var ipd = cameraLPos.distanceTo( cameraRPos ); + + var projL = cameraL.projectionMatrix.elements; + var projR = cameraR.projectionMatrix.elements; + + // VR systems will have identical far and near planes, and + // most likely identical top and bottom frustum extents. + // Use the left camera for these values. + var near = projL[ 14 ] / ( projL[ 10 ] - 1 ); + var far = projL[ 14 ] / ( projL[ 10 ] + 1 ); + var topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ]; + var bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ]; + + var leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ]; + var rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ]; + var left = near * leftFov; + var right = near * rightFov; + + // Calculate the new camera's position offset from the + // left camera. xOffset should be roughly half `ipd`. + var zOffset = ipd / ( - leftFov + rightFov ); + var xOffset = zOffset * - leftFov; + + // TODO: Better way to apply this offset? + cameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale ); + camera.translateX( xOffset ); + camera.translateZ( zOffset ); + camera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale ); + camera.matrixWorldInverse.getInverse( camera.matrixWorld ); + + // Find the union of the frustum values of the cameras and scale + // the values so that the near plane's position does not change in world space, + // although must now be relative to the new union camera. + var near2 = near + zOffset; + var far2 = far + zOffset; + var left2 = left - xOffset; + var right2 = right + ( ipd - xOffset ); + var top2 = topFov * far / far2 * near2; + var bottom2 = bottomFov * far / far2 * near2; + + camera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 ); + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebVRManager( renderer ) { + + var scope = this; + + var device = null; + var frameData = null; + + var poseTarget = null; + + var controllers = []; + var standingMatrix = new Matrix4(); + var standingMatrixInverse = new Matrix4(); + + var framebufferScaleFactor = 1.0; + + var frameOfReferenceType = 'stage'; + + if ( typeof window !== 'undefined' && 'VRFrameData' in window ) { + + frameData = new window.VRFrameData(); + window.addEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange, false ); + + } + + var matrixWorldInverse = new Matrix4(); + var tempQuaternion = new Quaternion(); + var tempPosition = new Vector3(); + + var cameraL = new PerspectiveCamera(); + cameraL.bounds = new Vector4( 0.0, 0.0, 0.5, 1.0 ); + cameraL.layers.enable( 1 ); + + var cameraR = new PerspectiveCamera(); + cameraR.bounds = new Vector4( 0.5, 0.0, 0.5, 1.0 ); + cameraR.layers.enable( 2 ); + + var cameraVR = new ArrayCamera( [ cameraL, cameraR ] ); + cameraVR.layers.enable( 1 ); + cameraVR.layers.enable( 2 ); + + // + + function isPresenting() { + + return device !== null && device.isPresenting === true; + + } + + var currentSize, currentPixelRatio; + + function onVRDisplayPresentChange() { + + if ( isPresenting() ) { + + var eyeParameters = device.getEyeParameters( 'left' ); + var renderWidth = eyeParameters.renderWidth * framebufferScaleFactor; + var renderHeight = eyeParameters.renderHeight * framebufferScaleFactor; + + currentPixelRatio = renderer.getPixelRatio(); + currentSize = renderer.getSize(); + + renderer.setDrawingBufferSize( renderWidth * 2, renderHeight, 1 ); + + animation.start(); + + } else { + + if ( scope.enabled ) { + + renderer.setDrawingBufferSize( currentSize.width, currentSize.height, currentPixelRatio ); + + } + + animation.stop(); + + } + + } + + // + + var triggers = []; + + function findGamepad( id ) { + + var gamepads = navigator.getGamepads && navigator.getGamepads(); + + for ( var i = 0, j = 0, l = gamepads.length; i < l; i ++ ) { + + var gamepad = gamepads[ i ]; + + if ( gamepad && ( gamepad.id === 'Daydream Controller' || + gamepad.id === 'Gear VR Controller' || gamepad.id === 'Oculus Go Controller' || + gamepad.id === 'OpenVR Gamepad' || gamepad.id.startsWith( 'Oculus Touch' ) || + gamepad.id.startsWith( 'Spatial Controller' ) ) ) { + + if ( j === id ) return gamepad; + + j ++; + + } + + } + + } + + function updateControllers() { + + for ( var i = 0; i < controllers.length; i ++ ) { + + var controller = controllers[ i ]; + + var gamepad = findGamepad( i ); + + if ( gamepad !== undefined && gamepad.pose !== undefined ) { + + if ( gamepad.pose === null ) return; + + // Pose + + var pose = gamepad.pose; + + if ( pose.hasPosition === false ) controller.position.set( 0.2, - 0.6, - 0.05 ); + + if ( pose.position !== null ) controller.position.fromArray( pose.position ); + if ( pose.orientation !== null ) controller.quaternion.fromArray( pose.orientation ); + controller.matrix.compose( controller.position, controller.quaternion, controller.scale ); + controller.matrix.premultiply( standingMatrix ); + controller.matrix.decompose( controller.position, controller.quaternion, controller.scale ); + controller.matrixWorldNeedsUpdate = true; + controller.visible = true; + + // Trigger + + var buttonId = gamepad.id === 'Daydream Controller' ? 0 : 1; + + if ( triggers[ i ] !== gamepad.buttons[ buttonId ].pressed ) { + + triggers[ i ] = gamepad.buttons[ buttonId ].pressed; + + if ( triggers[ i ] === true ) { + + controller.dispatchEvent( { type: 'selectstart' } ); + + } else { + + controller.dispatchEvent( { type: 'selectend' } ); + controller.dispatchEvent( { type: 'select' } ); + + } + + } + + } else { + + controller.visible = false; + + } + + } + + } + + // + + this.enabled = false; + + this.getController = function ( id ) { + + var controller = controllers[ id ]; + + if ( controller === undefined ) { + + controller = new Group(); + controller.matrixAutoUpdate = false; + controller.visible = false; + + controllers[ id ] = controller; + + } + + return controller; + + }; + + this.getDevice = function () { + + return device; + + }; + + this.setDevice = function ( value ) { + + if ( value !== undefined ) device = value; + + animation.setContext( value ); + + }; + + this.setFramebufferScaleFactor = function ( value ) { + + framebufferScaleFactor = value; + + }; + + this.setFrameOfReferenceType = function ( value ) { + + frameOfReferenceType = value; + + }; + + this.setPoseTarget = function ( object ) { + + if ( object !== undefined ) poseTarget = object; + + }; + + this.getCamera = function ( camera ) { + + var userHeight = frameOfReferenceType === 'stage' ? 1.6 : 0; + + if ( device === null ) { + + camera.position.set( 0, userHeight, 0 ); + return camera; + + } + + device.depthNear = camera.near; + device.depthFar = camera.far; + + device.getFrameData( frameData ); + + // + + if ( frameOfReferenceType === 'stage' ) { + + var stageParameters = device.stageParameters; + + if ( stageParameters ) { + + standingMatrix.fromArray( stageParameters.sittingToStandingTransform ); + + } else { + + standingMatrix.makeTranslation( 0, userHeight, 0 ); + + } + + } + + + var pose = frameData.pose; + var poseObject = poseTarget !== null ? poseTarget : camera; + + // We want to manipulate poseObject by its position and quaternion components since users may rely on them. + poseObject.matrix.copy( standingMatrix ); + poseObject.matrix.decompose( poseObject.position, poseObject.quaternion, poseObject.scale ); + + if ( pose.orientation !== null ) { + + tempQuaternion.fromArray( pose.orientation ); + poseObject.quaternion.multiply( tempQuaternion ); + + } + + if ( pose.position !== null ) { + + tempQuaternion.setFromRotationMatrix( standingMatrix ); + tempPosition.fromArray( pose.position ); + tempPosition.applyQuaternion( tempQuaternion ); + poseObject.position.add( tempPosition ); + + } + + poseObject.updateMatrixWorld(); + + if ( device.isPresenting === false ) return camera; + + // + + cameraL.near = camera.near; + cameraR.near = camera.near; + + cameraL.far = camera.far; + cameraR.far = camera.far; + + cameraL.matrixWorldInverse.fromArray( frameData.leftViewMatrix ); + cameraR.matrixWorldInverse.fromArray( frameData.rightViewMatrix ); + + // TODO (mrdoob) Double check this code + + standingMatrixInverse.getInverse( standingMatrix ); + + if ( frameOfReferenceType === 'stage' ) { + + cameraL.matrixWorldInverse.multiply( standingMatrixInverse ); + cameraR.matrixWorldInverse.multiply( standingMatrixInverse ); + + } + + var parent = poseObject.parent; + + if ( parent !== null ) { + + matrixWorldInverse.getInverse( parent.matrixWorld ); + + cameraL.matrixWorldInverse.multiply( matrixWorldInverse ); + cameraR.matrixWorldInverse.multiply( matrixWorldInverse ); + + } + + // envMap and Mirror needs camera.matrixWorld + + cameraL.matrixWorld.getInverse( cameraL.matrixWorldInverse ); + cameraR.matrixWorld.getInverse( cameraR.matrixWorldInverse ); + + cameraL.projectionMatrix.fromArray( frameData.leftProjectionMatrix ); + cameraR.projectionMatrix.fromArray( frameData.rightProjectionMatrix ); + + setProjectionFromUnion( cameraVR, cameraL, cameraR ); + + // + + var layers = device.getLayers(); + + if ( layers.length ) { + + var layer = layers[ 0 ]; + + if ( layer.leftBounds !== null && layer.leftBounds.length === 4 ) { + + cameraL.bounds.fromArray( layer.leftBounds ); + + } + + if ( layer.rightBounds !== null && layer.rightBounds.length === 4 ) { + + cameraR.bounds.fromArray( layer.rightBounds ); + + } + + } + + updateControllers(); + + return cameraVR; + + }; + + this.getStandingMatrix = function () { + + return standingMatrix; + + }; + + this.isPresenting = isPresenting; + + // Animation Loop + + var animation = new WebGLAnimation(); + + this.setAnimationLoop = function ( callback ) { + + animation.setAnimationLoop( callback ); + + }; + + this.submitFrame = function () { + + if ( isPresenting() ) device.submitFrame(); + + }; + + this.dispose = function () { + + if ( typeof window !== 'undefined' ) { + + window.removeEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange ); + + } + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebXRManager( renderer ) { + + var gl = renderer.context; + + var device = null; + var session = null; + + var framebufferScaleFactor = 1.0; + + var frameOfReference = null; + var frameOfReferenceType = 'stage'; + + var pose = null; + + var controllers = []; + var inputSources = []; + + function isPresenting() { + + return session !== null && frameOfReference !== null; + + } + + // + + var cameraL = new PerspectiveCamera(); + cameraL.layers.enable( 1 ); + cameraL.viewport = new Vector4(); + + var cameraR = new PerspectiveCamera(); + cameraR.layers.enable( 2 ); + cameraR.viewport = new Vector4(); + + var cameraVR = new ArrayCamera( [ cameraL, cameraR ] ); + cameraVR.layers.enable( 1 ); + cameraVR.layers.enable( 2 ); + + // + + this.enabled = false; + + this.getController = function ( id ) { + + var controller = controllers[ id ]; + + if ( controller === undefined ) { + + controller = new Group(); + controller.matrixAutoUpdate = false; + controller.visible = false; + + controllers[ id ] = controller; + + } + + return controller; + + }; + + this.getDevice = function () { + + return device; + + }; + + this.setDevice = function ( value ) { + + if ( value !== undefined ) device = value; + if ( value instanceof XRDevice ) gl.setCompatibleXRDevice( value ); + + }; + + // + + function onSessionEvent( event ) { + + var controller = controllers[ inputSources.indexOf( event.inputSource ) ]; + if ( controller ) controller.dispatchEvent( { type: event.type } ); + + } + + function onSessionEnd() { + + renderer.setFramebuffer( null ); + animation.stop(); + + } + + this.setFramebufferScaleFactor = function ( value ) { + + framebufferScaleFactor = value; + + }; + + this.setFrameOfReferenceType = function ( value ) { + + frameOfReferenceType = value; + + }; + + this.setSession = function ( value ) { + + session = value; + + if ( session !== null ) { + + session.addEventListener( 'select', onSessionEvent ); + session.addEventListener( 'selectstart', onSessionEvent ); + session.addEventListener( 'selectend', onSessionEvent ); + session.addEventListener( 'end', onSessionEnd ); + + session.baseLayer = new XRWebGLLayer( session, gl, { framebufferScaleFactor: framebufferScaleFactor } ); + session.requestFrameOfReference( frameOfReferenceType ).then( function ( value ) { + + frameOfReference = value; + + renderer.setFramebuffer( session.baseLayer.framebuffer ); + + animation.setContext( session ); + animation.start(); + + } ); + + // + + inputSources = session.getInputSources(); + + session.addEventListener( 'inputsourceschange', function () { + + inputSources = session.getInputSources(); + console.log( inputSources ); + + for ( var i = 0; i < controllers.length; i ++ ) { + + var controller = controllers[ i ]; + controller.userData.inputSource = inputSources[ i ]; + + } + + } ); + + } + + }; + + function updateCamera( camera, parent ) { + + if ( parent === null ) { + + camera.matrixWorld.copy( camera.matrix ); + + } else { + + camera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix ); + + } + + camera.matrixWorldInverse.getInverse( camera.matrixWorld ); + + } + + this.getCamera = function ( camera ) { + + if ( isPresenting() ) { + + var parent = camera.parent; + var cameras = cameraVR.cameras; + + updateCamera( cameraVR, parent ); + + for ( var i = 0; i < cameras.length; i ++ ) { + + updateCamera( cameras[ i ], parent ); + + } + + // update camera and its children + + camera.matrixWorld.copy( cameraVR.matrixWorld ); + + var children = camera.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].updateMatrixWorld( true ); + + } + + setProjectionFromUnion( cameraVR, cameraL, cameraR ); + + return cameraVR; + + } + + return camera; + + }; + + this.isPresenting = isPresenting; + + // Animation Loop + + var onAnimationFrameCallback = null; + + function onAnimationFrame( time, frame ) { + + pose = frame.getDevicePose( frameOfReference ); + + if ( pose !== null ) { + + var layer = session.baseLayer; + var views = frame.views; + + for ( var i = 0; i < views.length; i ++ ) { + + var view = views[ i ]; + var viewport = layer.getViewport( view ); + var viewMatrix = pose.getViewMatrix( view ); + + var camera = cameraVR.cameras[ i ]; + camera.matrix.fromArray( viewMatrix ).getInverse( camera.matrix ); + camera.projectionMatrix.fromArray( view.projectionMatrix ); + camera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height ); + + if ( i === 0 ) { + + cameraVR.matrix.copy( camera.matrix ); + + } + + } + + } + + // + + for ( var i = 0; i < controllers.length; i ++ ) { + + var controller = controllers[ i ]; + + var inputSource = inputSources[ i ]; + + if ( inputSource ) { + + var inputPose = frame.getInputPose( inputSource, frameOfReference ); + + if ( inputPose !== null ) { + + if ( 'targetRay' in inputPose ) { + + controller.matrix.elements = inputPose.targetRay.transformMatrix; + + } else if ( 'pointerMatrix' in inputPose ) { + + // DEPRECATED + + controller.matrix.elements = inputPose.pointerMatrix; + + } + + controller.matrix.decompose( controller.position, controller.rotation, controller.scale ); + controller.visible = true; + + continue; + + } + + } + + controller.visible = false; + + } + + if ( onAnimationFrameCallback ) onAnimationFrameCallback( time ); + + } + + var animation = new WebGLAnimation(); + animation.setAnimationLoop( onAnimationFrame ); + + this.setAnimationLoop = function ( callback ) { + + onAnimationFrameCallback = callback; + + }; + + this.dispose = function () {}; + + // DEPRECATED + + this.getStandingMatrix = function () { + + console.warn( 'THREE.WebXRManager: getStandingMatrix() is no longer needed.' ); + return new THREE.Matrix4(); + + }; + + this.submitFrame = function () {}; + + } + + /** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + * @author tschw + */ + + function WebGLRenderer( parameters ) { + + console.log( 'THREE.WebGLRenderer', REVISION ); + + parameters = parameters || {}; + + var _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ), + _context = parameters.context !== undefined ? parameters.context : null, + + _alpha = parameters.alpha !== undefined ? parameters.alpha : false, + _depth = parameters.depth !== undefined ? parameters.depth : true, + _stencil = parameters.stencil !== undefined ? parameters.stencil : true, + _antialias = parameters.antialias !== undefined ? parameters.antialias : false, + _premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true, + _preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false, + _powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default'; + + var currentRenderList = null; + var currentRenderState = null; + + // public properties + + this.domElement = _canvas; + this.context = null; + + // clearing + + this.autoClear = true; + this.autoClearColor = true; + this.autoClearDepth = true; + this.autoClearStencil = true; + + // scene graph + + this.sortObjects = true; + + // user-defined clipping + + this.clippingPlanes = []; + this.localClippingEnabled = false; + + // physically based shading + + this.gammaFactor = 2.0; // for backwards compatibility + this.gammaInput = false; + this.gammaOutput = false; + + // physical lights + + this.physicallyCorrectLights = false; + + // tone mapping + + this.toneMapping = LinearToneMapping; + this.toneMappingExposure = 1.0; + this.toneMappingWhitePoint = 1.0; + + // morphs + + this.maxMorphTargets = 8; + this.maxMorphNormals = 4; + + // internal properties + + var _this = this, + + _isContextLost = false, + + // internal state cache + + _framebuffer = null, + + _currentRenderTarget = null, + _currentFramebuffer = null, + _currentMaterialId = - 1, + + // geometry and program caching + + _currentGeometryProgram = { + geometry: null, + program: null, + wireframe: false + }, + + _currentCamera = null, + _currentArrayCamera = null, + + _currentViewport = new Vector4(), + _currentScissor = new Vector4(), + _currentScissorTest = null, + + // + + _usedTextureUnits = 0, + + // + + _width = _canvas.width, + _height = _canvas.height, + + _pixelRatio = 1, + + _viewport = new Vector4( 0, 0, _width, _height ), + _scissor = new Vector4( 0, 0, _width, _height ), + _scissorTest = false, + + // frustum + + _frustum = new Frustum(), + + // clipping + + _clipping = new WebGLClipping(), + _clippingEnabled = false, + _localClippingEnabled = false, + + // camera matrices cache + + _projScreenMatrix = new Matrix4(), + + _vector3 = new Vector3(); + + function getTargetPixelRatio() { + + return _currentRenderTarget === null ? _pixelRatio : 1; + + } + + // initialize + + var _gl; + + try { + + var contextAttributes = { + alpha: _alpha, + depth: _depth, + stencil: _stencil, + antialias: _antialias, + premultipliedAlpha: _premultipliedAlpha, + preserveDrawingBuffer: _preserveDrawingBuffer, + powerPreference: _powerPreference + }; + + // event listeners must be registered before WebGL context is created, see #12753 + + _canvas.addEventListener( 'webglcontextlost', onContextLost, false ); + _canvas.addEventListener( 'webglcontextrestored', onContextRestore, false ); + + _gl = _context || _canvas.getContext( 'webgl', contextAttributes ) || _canvas.getContext( 'experimental-webgl', contextAttributes ); + + if ( _gl === null ) { + + if ( _canvas.getContext( 'webgl' ) !== null ) { + + throw new Error( 'Error creating WebGL context with your selected attributes.' ); + + } else { + + throw new Error( 'Error creating WebGL context.' ); + + } + + } + + // Some experimental-webgl implementations do not have getShaderPrecisionFormat + + if ( _gl.getShaderPrecisionFormat === undefined ) { + + _gl.getShaderPrecisionFormat = function () { + + return { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 }; + + }; + + } + + } catch ( error ) { + + console.error( 'THREE.WebGLRenderer: ' + error.message ); + + } + + var extensions, capabilities, state, info; + var properties, textures, attributes, geometries, objects; + var programCache, renderLists, renderStates; + + var background, morphtargets, bufferRenderer, indexedBufferRenderer; + + var utils; + + function initGLContext() { + + extensions = new WebGLExtensions( _gl ); + + capabilities = new WebGLCapabilities( _gl, extensions, parameters ); + + if ( ! capabilities.isWebGL2 ) { + + extensions.get( 'WEBGL_depth_texture' ); + extensions.get( 'OES_texture_float' ); + extensions.get( 'OES_texture_half_float' ); + extensions.get( 'OES_texture_half_float_linear' ); + extensions.get( 'OES_standard_derivatives' ); + extensions.get( 'OES_element_index_uint' ); + extensions.get( 'ANGLE_instanced_arrays' ); + + } + + extensions.get( 'OES_texture_float_linear' ); + + utils = new WebGLUtils( _gl, extensions, capabilities ); + + state = new WebGLState( _gl, extensions, utils, capabilities ); + state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) ); + state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) ); + + info = new WebGLInfo( _gl ); + properties = new WebGLProperties(); + textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ); + attributes = new WebGLAttributes( _gl ); + geometries = new WebGLGeometries( _gl, attributes, info ); + objects = new WebGLObjects( geometries, info ); + morphtargets = new WebGLMorphtargets( _gl ); + programCache = new WebGLPrograms( _this, extensions, capabilities ); + renderLists = new WebGLRenderLists(); + renderStates = new WebGLRenderStates(); + + background = new WebGLBackground( _this, state, objects, _premultipliedAlpha ); + + bufferRenderer = new WebGLBufferRenderer( _gl, extensions, info, capabilities ); + indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info, capabilities ); + + info.programs = programCache.programs; + + _this.context = _gl; + _this.capabilities = capabilities; + _this.extensions = extensions; + _this.properties = properties; + _this.renderLists = renderLists; + _this.state = state; + _this.info = info; + + } + + initGLContext(); + + // vr + + var vr = null; + + if ( typeof navigator !== 'undefined' ) { + + vr = ( 'xr' in navigator ) ? new WebXRManager( _this ) : new WebVRManager( _this ); + + } + + this.vr = vr; + + // shadow map + + var shadowMap = new WebGLShadowMap( _this, objects, capabilities.maxTextureSize ); + + this.shadowMap = shadowMap; + + // API + + this.getContext = function () { + + return _gl; + + }; + + this.getContextAttributes = function () { + + return _gl.getContextAttributes(); + + }; + + this.forceContextLoss = function () { + + var extension = extensions.get( 'WEBGL_lose_context' ); + if ( extension ) extension.loseContext(); + + }; + + this.forceContextRestore = function () { + + var extension = extensions.get( 'WEBGL_lose_context' ); + if ( extension ) extension.restoreContext(); + + }; + + this.getPixelRatio = function () { + + return _pixelRatio; + + }; + + this.setPixelRatio = function ( value ) { + + if ( value === undefined ) return; + + _pixelRatio = value; + + this.setSize( _width, _height, false ); + + }; + + this.getSize = function () { + + return { + width: _width, + height: _height + }; + + }; + + this.setSize = function ( width, height, updateStyle ) { + + if ( vr.isPresenting() ) { + + console.warn( 'THREE.WebGLRenderer: Can\'t change size while VR device is presenting.' ); + return; + + } + + _width = width; + _height = height; + + _canvas.width = width * _pixelRatio; + _canvas.height = height * _pixelRatio; + + if ( updateStyle !== false ) { + + _canvas.style.width = width + 'px'; + _canvas.style.height = height + 'px'; + + } + + this.setViewport( 0, 0, width, height ); + + }; + + this.getDrawingBufferSize = function () { + + return { + width: _width * _pixelRatio, + height: _height * _pixelRatio + }; + + }; + + this.setDrawingBufferSize = function ( width, height, pixelRatio ) { + + _width = width; + _height = height; + + _pixelRatio = pixelRatio; + + _canvas.width = width * pixelRatio; + _canvas.height = height * pixelRatio; + + this.setViewport( 0, 0, width, height ); + + }; + + this.getCurrentViewport = function () { + + return _currentViewport; + + }; + + this.setViewport = function ( x, y, width, height ) { + + _viewport.set( x, _height - y - height, width, height ); + state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) ); + + }; + + this.setScissor = function ( x, y, width, height ) { + + _scissor.set( x, _height - y - height, width, height ); + state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) ); + + }; + + this.setScissorTest = function ( boolean ) { + + state.setScissorTest( _scissorTest = boolean ); + + }; + + // Clearing + + this.getClearColor = function () { + + return background.getClearColor(); + + }; + + this.setClearColor = function () { + + background.setClearColor.apply( background, arguments ); + + }; + + this.getClearAlpha = function () { + + return background.getClearAlpha(); + + }; + + this.setClearAlpha = function () { + + background.setClearAlpha.apply( background, arguments ); + + }; + + this.clear = function ( color, depth, stencil ) { + + var bits = 0; + + if ( color === undefined || color ) bits |= 16384; + if ( depth === undefined || depth ) bits |= 256; + if ( stencil === undefined || stencil ) bits |= 1024; + + _gl.clear( bits ); + + }; + + this.clearColor = function () { + + this.clear( true, false, false ); + + }; + + this.clearDepth = function () { + + this.clear( false, true, false ); + + }; + + this.clearStencil = function () { + + this.clear( false, false, true ); + + }; + + // + + this.dispose = function () { + + _canvas.removeEventListener( 'webglcontextlost', onContextLost, false ); + _canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false ); + + renderLists.dispose(); + renderStates.dispose(); + properties.dispose(); + objects.dispose(); + + vr.dispose(); + + animation.stop(); + + }; + + // Events + + function onContextLost( event ) { + + event.preventDefault(); + + console.log( 'THREE.WebGLRenderer: Context Lost.' ); + + _isContextLost = true; + + } + + function onContextRestore( /* event */ ) { + + console.log( 'THREE.WebGLRenderer: Context Restored.' ); + + _isContextLost = false; + + initGLContext(); + + } + + function onMaterialDispose( event ) { + + var material = event.target; + + material.removeEventListener( 'dispose', onMaterialDispose ); + + deallocateMaterial( material ); + + } + + // Buffer deallocation + + function deallocateMaterial( material ) { + + releaseMaterialProgramReference( material ); + + properties.remove( material ); + + } + + + function releaseMaterialProgramReference( material ) { + + var programInfo = properties.get( material ).program; + + material.program = undefined; + + if ( programInfo !== undefined ) { + + programCache.releaseProgram( programInfo ); + + } + + } + + // Buffer rendering + + function renderObjectImmediate( object, program ) { + + object.render( function ( object ) { + + _this.renderBufferImmediate( object, program ); + + } ); + + } + + this.renderBufferImmediate = function ( object, program ) { + + state.initAttributes(); + + var buffers = properties.get( object ); + + if ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer(); + if ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer(); + if ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer(); + if ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer(); + + var programAttributes = program.getAttributes(); + + if ( object.hasPositions ) { + + _gl.bindBuffer( 34962, buffers.position ); + _gl.bufferData( 34962, object.positionArray, 35048 ); + + state.enableAttribute( programAttributes.position ); + _gl.vertexAttribPointer( programAttributes.position, 3, 5126, false, 0, 0 ); + + } + + if ( object.hasNormals ) { + + _gl.bindBuffer( 34962, buffers.normal ); + _gl.bufferData( 34962, object.normalArray, 35048 ); + + state.enableAttribute( programAttributes.normal ); + _gl.vertexAttribPointer( programAttributes.normal, 3, 5126, false, 0, 0 ); + + } + + if ( object.hasUvs ) { + + _gl.bindBuffer( 34962, buffers.uv ); + _gl.bufferData( 34962, object.uvArray, 35048 ); + + state.enableAttribute( programAttributes.uv ); + _gl.vertexAttribPointer( programAttributes.uv, 2, 5126, false, 0, 0 ); + + } + + if ( object.hasColors ) { + + _gl.bindBuffer( 34962, buffers.color ); + _gl.bufferData( 34962, object.colorArray, 35048 ); + + state.enableAttribute( programAttributes.color ); + _gl.vertexAttribPointer( programAttributes.color, 3, 5126, false, 0, 0 ); + + } + + state.disableUnusedAttributes(); + + _gl.drawArrays( 4, 0, object.count ); + + object.count = 0; + + }; + + this.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) { + + var frontFaceCW = ( object.isMesh && object.normalMatrix.determinant() < 0 ); + + state.setMaterial( material, frontFaceCW ); + + var program = setProgram( camera, fog, material, object ); + + var updateBuffers = false; + + if ( _currentGeometryProgram.geometry !== geometry.id || + _currentGeometryProgram.program !== program.id || + _currentGeometryProgram.wireframe !== ( material.wireframe === true ) ) { + + _currentGeometryProgram.geometry = geometry.id; + _currentGeometryProgram.program = program.id; + _currentGeometryProgram.wireframe = material.wireframe === true; + updateBuffers = true; + + } + + if ( object.morphTargetInfluences ) { + + morphtargets.update( object, geometry, material, program ); + + updateBuffers = true; + + } + + // + + var index = geometry.index; + var position = geometry.attributes.position; + var rangeFactor = 1; + + if ( material.wireframe === true ) { + + index = geometries.getWireframeAttribute( geometry ); + rangeFactor = 2; + + } + + var attribute; + var renderer = bufferRenderer; + + if ( index !== null ) { + + attribute = attributes.get( index ); + + renderer = indexedBufferRenderer; + renderer.setIndex( attribute ); + + } + + if ( updateBuffers ) { + + setupVertexAttributes( material, program, geometry ); + + if ( index !== null ) { + + _gl.bindBuffer( 34963, attribute.buffer ); + + } + + } + + // + + var dataCount = Infinity; + + if ( index !== null ) { + + dataCount = index.count; + + } else if ( position !== undefined ) { + + dataCount = position.count; + + } + + var rangeStart = geometry.drawRange.start * rangeFactor; + var rangeCount = geometry.drawRange.count * rangeFactor; + + var groupStart = group !== null ? group.start * rangeFactor : 0; + var groupCount = group !== null ? group.count * rangeFactor : Infinity; + + var drawStart = Math.max( rangeStart, groupStart ); + var drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1; + + var drawCount = Math.max( 0, drawEnd - drawStart + 1 ); + + if ( drawCount === 0 ) return; + + // + + if ( object.isMesh ) { + + if ( material.wireframe === true ) { + + state.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() ); + renderer.setMode( 1 ); + + } else { + + switch ( object.drawMode ) { + + case TrianglesDrawMode: + renderer.setMode( 4 ); + break; + + case TriangleStripDrawMode: + renderer.setMode( 5 ); + break; + + case TriangleFanDrawMode: + renderer.setMode( 6 ); + break; + + } + + } + + + } else if ( object.isLine ) { + + var lineWidth = material.linewidth; + + if ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material + + state.setLineWidth( lineWidth * getTargetPixelRatio() ); + + if ( object.isLineSegments ) { + + renderer.setMode( 1 ); + + } else if ( object.isLineLoop ) { + + renderer.setMode( 2 ); + + } else { + + renderer.setMode( 3 ); + + } + + } else if ( object.isPoints ) { + + renderer.setMode( 0 ); + + } else if ( object.isSprite ) { + + renderer.setMode( 4 ); + + } + + if ( geometry && geometry.isInstancedBufferGeometry ) { + + if ( geometry.maxInstancedCount > 0 ) { + + renderer.renderInstances( geometry, drawStart, drawCount ); + + } + + } else { + + renderer.render( drawStart, drawCount ); + + } + + }; + + function setupVertexAttributes( material, program, geometry ) { + + if ( geometry && geometry.isInstancedBufferGeometry & ! capabilities.isWebGL2 ) { + + if ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) { + + console.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + } + + state.initAttributes(); + + var geometryAttributes = geometry.attributes; + + var programAttributes = program.getAttributes(); + + var materialDefaultAttributeValues = material.defaultAttributeValues; + + for ( var name in programAttributes ) { + + var programAttribute = programAttributes[ name ]; + + if ( programAttribute >= 0 ) { + + var geometryAttribute = geometryAttributes[ name ]; + + if ( geometryAttribute !== undefined ) { + + var normalized = geometryAttribute.normalized; + var size = geometryAttribute.itemSize; + + var attribute = attributes.get( geometryAttribute ); + + // TODO Attribute may not be available on context restore + + if ( attribute === undefined ) continue; + + var buffer = attribute.buffer; + var type = attribute.type; + var bytesPerElement = attribute.bytesPerElement; + + if ( geometryAttribute.isInterleavedBufferAttribute ) { + + var data = geometryAttribute.data; + var stride = data.stride; + var offset = geometryAttribute.offset; + + if ( data && data.isInstancedInterleavedBuffer ) { + + state.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute ); + + if ( geometry.maxInstancedCount === undefined ) { + + geometry.maxInstancedCount = data.meshPerAttribute * data.count; + + } + + } else { + + state.enableAttribute( programAttribute ); + + } + + _gl.bindBuffer( 34962, buffer ); + _gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * bytesPerElement, offset * bytesPerElement ); + + } else { + + if ( geometryAttribute.isInstancedBufferAttribute ) { + + state.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute ); + + if ( geometry.maxInstancedCount === undefined ) { + + geometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count; + + } + + } else { + + state.enableAttribute( programAttribute ); + + } + + _gl.bindBuffer( 34962, buffer ); + _gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, 0 ); + + } + + } else if ( materialDefaultAttributeValues !== undefined ) { + + var value = materialDefaultAttributeValues[ name ]; + + if ( value !== undefined ) { + + switch ( value.length ) { + + case 2: + _gl.vertexAttrib2fv( programAttribute, value ); + break; + + case 3: + _gl.vertexAttrib3fv( programAttribute, value ); + break; + + case 4: + _gl.vertexAttrib4fv( programAttribute, value ); + break; + + default: + _gl.vertexAttrib1fv( programAttribute, value ); + + } + + } + + } + + } + + } + + state.disableUnusedAttributes(); + + } + + // Compile + + this.compile = function ( scene, camera ) { + + currentRenderState = renderStates.get( scene, camera ); + currentRenderState.init(); + + scene.traverse( function ( object ) { + + if ( object.isLight ) { + + currentRenderState.pushLight( object ); + + if ( object.castShadow ) { + + currentRenderState.pushShadow( object ); + + } + + } + + } ); + + currentRenderState.setupLights( camera ); + + scene.traverse( function ( object ) { + + if ( object.material ) { + + if ( Array.isArray( object.material ) ) { + + for ( var i = 0; i < object.material.length; i ++ ) { + + initMaterial( object.material[ i ], scene.fog, object ); + + } + + } else { + + initMaterial( object.material, scene.fog, object ); + + } + + } + + } ); + + }; + + // Animation Loop + + var onAnimationFrameCallback = null; + + function onAnimationFrame( time ) { + + if ( vr.isPresenting() ) return; + if ( onAnimationFrameCallback ) onAnimationFrameCallback( time ); + + } + + var animation = new WebGLAnimation(); + animation.setAnimationLoop( onAnimationFrame ); + + if ( typeof window !== 'undefined' ) animation.setContext( window ); + + this.setAnimationLoop = function ( callback ) { + + onAnimationFrameCallback = callback; + vr.setAnimationLoop( callback ); + + animation.start(); + + }; + + // Rendering + + this.render = function ( scene, camera, renderTarget, forceClear ) { + + if ( ! ( camera && camera.isCamera ) ) { + + console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' ); + return; + + } + + if ( _isContextLost ) return; + + // reset caching for this frame + + _currentGeometryProgram.geometry = null; + _currentGeometryProgram.program = null; + _currentGeometryProgram.wireframe = false; + _currentMaterialId = - 1; + _currentCamera = null; + + // update scene graph + + if ( scene.autoUpdate === true ) scene.updateMatrixWorld(); + + // update camera matrices and frustum + + if ( camera.parent === null ) camera.updateMatrixWorld(); + + if ( vr.enabled ) { + + camera = vr.getCamera( camera ); + + } + + // + + currentRenderState = renderStates.get( scene, camera ); + currentRenderState.init(); + + scene.onBeforeRender( _this, scene, camera, renderTarget ); + + _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); + _frustum.setFromMatrix( _projScreenMatrix ); + + _localClippingEnabled = this.localClippingEnabled; + _clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera ); + + currentRenderList = renderLists.get( scene, camera ); + currentRenderList.init(); + + projectObject( scene, camera, _this.sortObjects ); + + if ( _this.sortObjects === true ) { + + currentRenderList.sort(); + + } + + // + + if ( _clippingEnabled ) _clipping.beginShadows(); + + var shadowsArray = currentRenderState.state.shadowsArray; + + shadowMap.render( shadowsArray, scene, camera ); + + currentRenderState.setupLights( camera ); + + if ( _clippingEnabled ) _clipping.endShadows(); + + // + + if ( this.info.autoReset ) this.info.reset(); + + if ( renderTarget === undefined ) { + + renderTarget = null; + + } + + this.setRenderTarget( renderTarget ); + + // + + background.render( currentRenderList, scene, camera, forceClear ); + + // render scene + + var opaqueObjects = currentRenderList.opaque; + var transparentObjects = currentRenderList.transparent; + + if ( scene.overrideMaterial ) { + + var overrideMaterial = scene.overrideMaterial; + + if ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera, overrideMaterial ); + if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera, overrideMaterial ); + + } else { + + // opaque pass (front-to-back order) + + if ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera ); + + // transparent pass (back-to-front order) + + if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera ); + + } + + // Generate mipmap if we're using any kind of mipmap filtering + + if ( renderTarget ) { + + textures.updateRenderTargetMipmap( renderTarget ); + + } + + // Ensure depth buffer writing is enabled so it can be cleared on next render + + state.buffers.depth.setTest( true ); + state.buffers.depth.setMask( true ); + state.buffers.color.setMask( true ); + + state.setPolygonOffset( false ); + + scene.onAfterRender( _this, scene, camera ); + + if ( vr.enabled ) { + + vr.submitFrame(); + + } + + // _gl.finish(); + + currentRenderList = null; + currentRenderState = null; + + }; + + function projectObject( object, camera, sortObjects ) { + + if ( object.visible === false ) return; + + var visible = object.layers.test( camera.layers ); + + if ( visible ) { + + if ( object.isLight ) { + + currentRenderState.pushLight( object ); + + if ( object.castShadow ) { + + currentRenderState.pushShadow( object ); + + } + + } else if ( object.isSprite ) { + + if ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) { + + if ( sortObjects ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + var geometry = objects.update( object ); + var material = object.material; + + currentRenderList.push( object, geometry, material, _vector3.z, null ); + + } + + } else if ( object.isImmediateRenderObject ) { + + if ( sortObjects ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + currentRenderList.push( object, null, object.material, _vector3.z, null ); + + } else if ( object.isMesh || object.isLine || object.isPoints ) { + + if ( object.isSkinnedMesh ) { + + object.skeleton.update(); + + } + + if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) { + + if ( sortObjects ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + var geometry = objects.update( object ); + var material = object.material; + + if ( Array.isArray( material ) ) { + + var groups = geometry.groups; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + var groupMaterial = material[ group.materialIndex ]; + + if ( groupMaterial && groupMaterial.visible ) { + + currentRenderList.push( object, geometry, groupMaterial, _vector3.z, group ); + + } + + } + + } else if ( material.visible ) { + + currentRenderList.push( object, geometry, material, _vector3.z, null ); + + } + + } + + } + + } + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + projectObject( children[ i ], camera, sortObjects ); + + } + + } + + function renderObjects( renderList, scene, camera, overrideMaterial ) { + + for ( var i = 0, l = renderList.length; i < l; i ++ ) { + + var renderItem = renderList[ i ]; + + var object = renderItem.object; + var geometry = renderItem.geometry; + var material = overrideMaterial === undefined ? renderItem.material : overrideMaterial; + var group = renderItem.group; + + if ( camera.isArrayCamera ) { + + _currentArrayCamera = camera; + + var cameras = camera.cameras; + + for ( var j = 0, jl = cameras.length; j < jl; j ++ ) { + + var camera2 = cameras[ j ]; + + if ( object.layers.test( camera2.layers ) ) { + + if ( 'viewport' in camera2 ) { // XR + + state.viewport( _currentViewport.copy( camera2.viewport ) ); + + } else { + + var bounds = camera2.bounds; + + var x = bounds.x * _width; + var y = bounds.y * _height; + var width = bounds.z * _width; + var height = bounds.w * _height; + + state.viewport( _currentViewport.set( x, y, width, height ).multiplyScalar( _pixelRatio ) ); + + } + + currentRenderState.setupLights( camera2 ); + + renderObject( object, scene, camera2, geometry, material, group ); + + } + + } + + } else { + + _currentArrayCamera = null; + + renderObject( object, scene, camera, geometry, material, group ); + + } + + } + + } + + function renderObject( object, scene, camera, geometry, material, group ) { + + object.onBeforeRender( _this, scene, camera, geometry, material, group ); + currentRenderState = renderStates.get( scene, _currentArrayCamera || camera ); + + object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld ); + object.normalMatrix.getNormalMatrix( object.modelViewMatrix ); + + if ( object.isImmediateRenderObject ) { + + state.setMaterial( material ); + + var program = setProgram( camera, scene.fog, material, object ); + + _currentGeometryProgram.geometry = null; + _currentGeometryProgram.program = null; + _currentGeometryProgram.wireframe = false; + + renderObjectImmediate( object, program ); + + } else { + + _this.renderBufferDirect( camera, scene.fog, geometry, material, object, group ); + + } + + object.onAfterRender( _this, scene, camera, geometry, material, group ); + currentRenderState = renderStates.get( scene, _currentArrayCamera || camera ); + + } + + function initMaterial( material, fog, object ) { + + var materialProperties = properties.get( material ); + + var lights = currentRenderState.state.lights; + var shadowsArray = currentRenderState.state.shadowsArray; + + var lightsHash = materialProperties.lightsHash; + var lightsStateHash = lights.state.hash; + + var parameters = programCache.getParameters( + material, lights.state, shadowsArray, fog, _clipping.numPlanes, _clipping.numIntersection, object ); + + var code = programCache.getProgramCode( material, parameters ); + + var program = materialProperties.program; + var programChange = true; + + if ( program === undefined ) { + + // new material + material.addEventListener( 'dispose', onMaterialDispose ); + + } else if ( program.code !== code ) { + + // changed glsl or parameters + releaseMaterialProgramReference( material ); + + } else if ( lightsHash.stateID !== lightsStateHash.stateID || + lightsHash.directionalLength !== lightsStateHash.directionalLength || + lightsHash.pointLength !== lightsStateHash.pointLength || + lightsHash.spotLength !== lightsStateHash.spotLength || + lightsHash.rectAreaLength !== lightsStateHash.rectAreaLength || + lightsHash.hemiLength !== lightsStateHash.hemiLength || + lightsHash.shadowsLength !== lightsStateHash.shadowsLength ) { + + lightsHash.stateID = lightsStateHash.stateID; + lightsHash.directionalLength = lightsStateHash.directionalLength; + lightsHash.pointLength = lightsStateHash.pointLength; + lightsHash.spotLength = lightsStateHash.spotLength; + lightsHash.rectAreaLength = lightsStateHash.rectAreaLength; + lightsHash.hemiLength = lightsStateHash.hemiLength; + lightsHash.shadowsLength = lightsStateHash.shadowsLength; + + programChange = false; + + } else if ( parameters.shaderID !== undefined ) { + + // same glsl and uniform list + return; + + } else { + + // only rebuild uniform list + programChange = false; + + } + + if ( programChange ) { + + if ( parameters.shaderID ) { + + var shader = ShaderLib[ parameters.shaderID ]; + + materialProperties.shader = { + name: material.type, + uniforms: UniformsUtils.clone( shader.uniforms ), + vertexShader: shader.vertexShader, + fragmentShader: shader.fragmentShader + }; + + } else { + + materialProperties.shader = { + name: material.type, + uniforms: material.uniforms, + vertexShader: material.vertexShader, + fragmentShader: material.fragmentShader + }; + + } + + material.onBeforeCompile( materialProperties.shader, _this ); + + // Computing code again as onBeforeCompile may have changed the shaders + code = programCache.getProgramCode( material, parameters ); + + program = programCache.acquireProgram( material, materialProperties.shader, parameters, code ); + + materialProperties.program = program; + material.program = program; + + } + + var programAttributes = program.getAttributes(); + + if ( material.morphTargets ) { + + material.numSupportedMorphTargets = 0; + + for ( var i = 0; i < _this.maxMorphTargets; i ++ ) { + + if ( programAttributes[ 'morphTarget' + i ] >= 0 ) { + + material.numSupportedMorphTargets ++; + + } + + } + + } + + if ( material.morphNormals ) { + + material.numSupportedMorphNormals = 0; + + for ( var i = 0; i < _this.maxMorphNormals; i ++ ) { + + if ( programAttributes[ 'morphNormal' + i ] >= 0 ) { + + material.numSupportedMorphNormals ++; + + } + + } + + } + + var uniforms = materialProperties.shader.uniforms; + + if ( ! material.isShaderMaterial && + ! material.isRawShaderMaterial || + material.clipping === true ) { + + materialProperties.numClippingPlanes = _clipping.numPlanes; + materialProperties.numIntersection = _clipping.numIntersection; + uniforms.clippingPlanes = _clipping.uniform; + + } + + materialProperties.fog = fog; + + // store the light setup it was created for + if ( lightsHash === undefined ) { + + materialProperties.lightsHash = lightsHash = {}; + + } + + lightsHash.stateID = lightsStateHash.stateID; + lightsHash.directionalLength = lightsStateHash.directionalLength; + lightsHash.pointLength = lightsStateHash.pointLength; + lightsHash.spotLength = lightsStateHash.spotLength; + lightsHash.rectAreaLength = lightsStateHash.rectAreaLength; + lightsHash.hemiLength = lightsStateHash.hemiLength; + lightsHash.shadowsLength = lightsStateHash.shadowsLength; + + if ( material.lights ) { + + // wire up the material to this renderer's lighting state + + uniforms.ambientLightColor.value = lights.state.ambient; + uniforms.directionalLights.value = lights.state.directional; + uniforms.spotLights.value = lights.state.spot; + uniforms.rectAreaLights.value = lights.state.rectArea; + uniforms.pointLights.value = lights.state.point; + uniforms.hemisphereLights.value = lights.state.hemi; + + uniforms.directionalShadowMap.value = lights.state.directionalShadowMap; + uniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix; + uniforms.spotShadowMap.value = lights.state.spotShadowMap; + uniforms.spotShadowMatrix.value = lights.state.spotShadowMatrix; + uniforms.pointShadowMap.value = lights.state.pointShadowMap; + uniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix; + // TODO (abelnation): add area lights shadow info to uniforms + + } + + var progUniforms = materialProperties.program.getUniforms(), + uniformsList = + WebGLUniforms.seqWithValue( progUniforms.seq, uniforms ); + + materialProperties.uniformsList = uniformsList; + + } + + function setProgram( camera, fog, material, object ) { + + _usedTextureUnits = 0; + + var materialProperties = properties.get( material ); + var lights = currentRenderState.state.lights; + + var lightsHash = materialProperties.lightsHash; + var lightsStateHash = lights.state.hash; + + if ( _clippingEnabled ) { + + if ( _localClippingEnabled || camera !== _currentCamera ) { + + var useCache = + camera === _currentCamera && + material.id === _currentMaterialId; + + // we might want to call this function with some ClippingGroup + // object instead of the material, once it becomes feasible + // (#8465, #8379) + _clipping.setState( + material.clippingPlanes, material.clipIntersection, material.clipShadows, + camera, materialProperties, useCache ); + + } + + } + + if ( material.needsUpdate === false ) { + + if ( materialProperties.program === undefined ) { + + material.needsUpdate = true; + + } else if ( material.fog && materialProperties.fog !== fog ) { + + material.needsUpdate = true; + + } else if ( material.lights && ( lightsHash.stateID !== lightsStateHash.stateID || + lightsHash.directionalLength !== lightsStateHash.directionalLength || + lightsHash.pointLength !== lightsStateHash.pointLength || + lightsHash.spotLength !== lightsStateHash.spotLength || + lightsHash.rectAreaLength !== lightsStateHash.rectAreaLength || + lightsHash.hemiLength !== lightsStateHash.hemiLength || + lightsHash.shadowsLength !== lightsStateHash.shadowsLength ) ) { + + material.needsUpdate = true; + + } else if ( materialProperties.numClippingPlanes !== undefined && + ( materialProperties.numClippingPlanes !== _clipping.numPlanes || + materialProperties.numIntersection !== _clipping.numIntersection ) ) { + + material.needsUpdate = true; + + } + + } + + if ( material.needsUpdate ) { + + initMaterial( material, fog, object ); + material.needsUpdate = false; + + } + + var refreshProgram = false; + var refreshMaterial = false; + var refreshLights = false; + + var program = materialProperties.program, + p_uniforms = program.getUniforms(), + m_uniforms = materialProperties.shader.uniforms; + + if ( state.useProgram( program.program ) ) { + + refreshProgram = true; + refreshMaterial = true; + refreshLights = true; + + } + + if ( material.id !== _currentMaterialId ) { + + _currentMaterialId = material.id; + + refreshMaterial = true; + + } + + if ( refreshProgram || _currentCamera !== camera ) { + + p_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix ); + + if ( capabilities.logarithmicDepthBuffer ) { + + p_uniforms.setValue( _gl, 'logDepthBufFC', + 2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) ); + + } + + if ( _currentCamera !== camera ) { + + _currentCamera = camera; + + // lighting uniforms depend on the camera so enforce an update + // now, in case this material supports lights - or later, when + // the next material that does gets activated: + + refreshMaterial = true; // set to true on material change + refreshLights = true; // remains set until update done + + } + + // load material specific uniforms + // (shader material also gets them for the sake of genericity) + + if ( material.isShaderMaterial || + material.isMeshPhongMaterial || + material.isMeshStandardMaterial || + material.envMap ) { + + var uCamPos = p_uniforms.map.cameraPosition; + + if ( uCamPos !== undefined ) { + + uCamPos.setValue( _gl, + _vector3.setFromMatrixPosition( camera.matrixWorld ) ); + + } + + } + + if ( material.isMeshPhongMaterial || + material.isMeshLambertMaterial || + material.isMeshBasicMaterial || + material.isMeshStandardMaterial || + material.isShaderMaterial || + material.skinning ) { + + p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse ); + + } + + } + + // skinning uniforms must be set even if material didn't change + // auto-setting of texture unit for bone texture must go before other textures + // not sure why, but otherwise weird things happen + + if ( material.skinning ) { + + p_uniforms.setOptional( _gl, object, 'bindMatrix' ); + p_uniforms.setOptional( _gl, object, 'bindMatrixInverse' ); + + var skeleton = object.skeleton; + + if ( skeleton ) { + + var bones = skeleton.bones; + + if ( capabilities.floatVertexTextures ) { + + if ( skeleton.boneTexture === undefined ) { + + // layout (1 matrix = 4 pixels) + // RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4) + // with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8) + // 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16) + // 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32) + // 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64) + + + var size = Math.sqrt( bones.length * 4 ); // 4 pixels needed for 1 matrix + size = _Math.ceilPowerOfTwo( size ); + size = Math.max( size, 4 ); + + var boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel + boneMatrices.set( skeleton.boneMatrices ); // copy current values + + var boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType ); + boneTexture.needsUpdate = true; + + skeleton.boneMatrices = boneMatrices; + skeleton.boneTexture = boneTexture; + skeleton.boneTextureSize = size; + + } + + p_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture ); + p_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize ); + + } else { + + p_uniforms.setOptional( _gl, skeleton, 'boneMatrices' ); + + } + + } + + } + + if ( refreshMaterial ) { + + p_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure ); + p_uniforms.setValue( _gl, 'toneMappingWhitePoint', _this.toneMappingWhitePoint ); + + if ( material.lights ) { + + // the current material requires lighting info + + // note: all lighting uniforms are always set correctly + // they simply reference the renderer's state for their + // values + // + // use the current material's .needsUpdate flags to set + // the GL state when required + + markUniformsLightsNeedsUpdate( m_uniforms, refreshLights ); + + } + + // refresh uniforms common to several materials + + if ( fog && material.fog ) { + + refreshUniformsFog( m_uniforms, fog ); + + } + + if ( material.isMeshBasicMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + } else if ( material.isMeshLambertMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + refreshUniformsLambert( m_uniforms, material ); + + } else if ( material.isMeshPhongMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + if ( material.isMeshToonMaterial ) { + + refreshUniformsToon( m_uniforms, material ); + + } else { + + refreshUniformsPhong( m_uniforms, material ); + + } + + } else if ( material.isMeshStandardMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + if ( material.isMeshPhysicalMaterial ) { + + refreshUniformsPhysical( m_uniforms, material ); + + } else { + + refreshUniformsStandard( m_uniforms, material ); + + } + + } else if ( material.isMeshMatcapMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + refreshUniformsMatcap( m_uniforms, material ); + + } else if ( material.isMeshDepthMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + refreshUniformsDepth( m_uniforms, material ); + + } else if ( material.isMeshDistanceMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + refreshUniformsDistance( m_uniforms, material ); + + } else if ( material.isMeshNormalMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + refreshUniformsNormal( m_uniforms, material ); + + } else if ( material.isLineBasicMaterial ) { + + refreshUniformsLine( m_uniforms, material ); + + if ( material.isLineDashedMaterial ) { + + refreshUniformsDash( m_uniforms, material ); + + } + + } else if ( material.isPointsMaterial ) { + + refreshUniformsPoints( m_uniforms, material ); + + } else if ( material.isSpriteMaterial ) { + + refreshUniformsSprites( m_uniforms, material ); + + } else if ( material.isShadowMaterial ) { + + m_uniforms.color.value = material.color; + m_uniforms.opacity.value = material.opacity; + + } + + // RectAreaLight Texture + // TODO (mrdoob): Find a nicer implementation + + if ( m_uniforms.ltc_1 !== undefined ) m_uniforms.ltc_1.value = UniformsLib.LTC_1; + if ( m_uniforms.ltc_2 !== undefined ) m_uniforms.ltc_2.value = UniformsLib.LTC_2; + + WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, _this ); + + } + + if ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) { + + WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, _this ); + material.uniformsNeedUpdate = false; + + } + + if ( material.isSpriteMaterial ) { + + p_uniforms.setValue( _gl, 'center', object.center ); + + } + + // common matrices + + p_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix ); + p_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix ); + p_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld ); + + return program; + + } + + // Uniforms (refresh uniforms objects) + + function refreshUniformsCommon( uniforms, material ) { + + uniforms.opacity.value = material.opacity; + + if ( material.color ) { + + uniforms.diffuse.value = material.color; + + } + + if ( material.emissive ) { + + uniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity ); + + } + + if ( material.map ) { + + uniforms.map.value = material.map; + + } + + if ( material.alphaMap ) { + + uniforms.alphaMap.value = material.alphaMap; + + } + + if ( material.specularMap ) { + + uniforms.specularMap.value = material.specularMap; + + } + + if ( material.envMap ) { + + uniforms.envMap.value = material.envMap; + + // don't flip CubeTexture envMaps, flip everything else: + // WebGLRenderTargetCube will be flipped for backwards compatibility + // WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture + // this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future + uniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1; + + uniforms.reflectivity.value = material.reflectivity; + uniforms.refractionRatio.value = material.refractionRatio; + + uniforms.maxMipLevel.value = properties.get( material.envMap ).__maxMipLevel; + + } + + if ( material.lightMap ) { + + uniforms.lightMap.value = material.lightMap; + uniforms.lightMapIntensity.value = material.lightMapIntensity; + + } + + if ( material.aoMap ) { + + uniforms.aoMap.value = material.aoMap; + uniforms.aoMapIntensity.value = material.aoMapIntensity; + + } + + // uv repeat and offset setting priorities + // 1. color map + // 2. specular map + // 3. normal map + // 4. bump map + // 5. alpha map + // 6. emissive map + + var uvScaleMap; + + if ( material.map ) { + + uvScaleMap = material.map; + + } else if ( material.specularMap ) { + + uvScaleMap = material.specularMap; + + } else if ( material.displacementMap ) { + + uvScaleMap = material.displacementMap; + + } else if ( material.normalMap ) { + + uvScaleMap = material.normalMap; + + } else if ( material.bumpMap ) { + + uvScaleMap = material.bumpMap; + + } else if ( material.roughnessMap ) { + + uvScaleMap = material.roughnessMap; + + } else if ( material.metalnessMap ) { + + uvScaleMap = material.metalnessMap; + + } else if ( material.alphaMap ) { + + uvScaleMap = material.alphaMap; + + } else if ( material.emissiveMap ) { + + uvScaleMap = material.emissiveMap; + + } + + if ( uvScaleMap !== undefined ) { + + // backwards compatibility + if ( uvScaleMap.isWebGLRenderTarget ) { + + uvScaleMap = uvScaleMap.texture; + + } + + if ( uvScaleMap.matrixAutoUpdate === true ) { + + uvScaleMap.updateMatrix(); + + } + + uniforms.uvTransform.value.copy( uvScaleMap.matrix ); + + } + + } + + function refreshUniformsLine( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + + } + + function refreshUniformsDash( uniforms, material ) { + + uniforms.dashSize.value = material.dashSize; + uniforms.totalSize.value = material.dashSize + material.gapSize; + uniforms.scale.value = material.scale; + + } + + function refreshUniformsPoints( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + uniforms.size.value = material.size * _pixelRatio; + uniforms.scale.value = _height * 0.5; + + uniforms.map.value = material.map; + + if ( material.map !== null ) { + + if ( material.map.matrixAutoUpdate === true ) { + + material.map.updateMatrix(); + + } + + uniforms.uvTransform.value.copy( material.map.matrix ); + + } + + } + + function refreshUniformsSprites( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + uniforms.rotation.value = material.rotation; + uniforms.map.value = material.map; + + if ( material.map !== null ) { + + if ( material.map.matrixAutoUpdate === true ) { + + material.map.updateMatrix(); + + } + + uniforms.uvTransform.value.copy( material.map.matrix ); + + } + + } + + function refreshUniformsFog( uniforms, fog ) { + + uniforms.fogColor.value = fog.color; + + if ( fog.isFog ) { + + uniforms.fogNear.value = fog.near; + uniforms.fogFar.value = fog.far; + + } else if ( fog.isFogExp2 ) { + + uniforms.fogDensity.value = fog.density; + + } + + } + + function refreshUniformsLambert( uniforms, material ) { + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + } + + function refreshUniformsPhong( uniforms, material ) { + + uniforms.specular.value = material.specular; + uniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 ) + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + if ( material.side === BackSide ) uniforms.normalScale.value.negate(); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsToon( uniforms, material ) { + + refreshUniformsPhong( uniforms, material ); + + if ( material.gradientMap ) { + + uniforms.gradientMap.value = material.gradientMap; + + } + + } + + function refreshUniformsStandard( uniforms, material ) { + + uniforms.roughness.value = material.roughness; + uniforms.metalness.value = material.metalness; + + if ( material.roughnessMap ) { + + uniforms.roughnessMap.value = material.roughnessMap; + + } + + if ( material.metalnessMap ) { + + uniforms.metalnessMap.value = material.metalnessMap; + + } + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + if ( material.side === BackSide ) uniforms.normalScale.value.negate(); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + if ( material.envMap ) { + + //uniforms.envMap.value = material.envMap; // part of uniforms common + uniforms.envMapIntensity.value = material.envMapIntensity; + + } + + } + + function refreshUniformsPhysical( uniforms, material ) { + + refreshUniformsStandard( uniforms, material ); + + uniforms.reflectivity.value = material.reflectivity; // also part of uniforms common + + uniforms.clearCoat.value = material.clearCoat; + uniforms.clearCoatRoughness.value = material.clearCoatRoughness; + + } + + function refreshUniformsMatcap( uniforms, material ) { + + if ( material.matcap ) { + + uniforms.matcap.value = material.matcap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + if ( material.side === BackSide ) uniforms.normalScale.value.negate(); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsDepth( uniforms, material ) { + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsDistance( uniforms, material ) { + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + uniforms.referencePosition.value.copy( material.referencePosition ); + uniforms.nearDistance.value = material.nearDistance; + uniforms.farDistance.value = material.farDistance; + + } + + function refreshUniformsNormal( uniforms, material ) { + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + if ( material.side === BackSide ) uniforms.normalScale.value.negate(); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + // If uniforms are marked as clean, they don't need to be loaded to the GPU. + + function markUniformsLightsNeedsUpdate( uniforms, value ) { + + uniforms.ambientLightColor.needsUpdate = value; + + uniforms.directionalLights.needsUpdate = value; + uniforms.pointLights.needsUpdate = value; + uniforms.spotLights.needsUpdate = value; + uniforms.rectAreaLights.needsUpdate = value; + uniforms.hemisphereLights.needsUpdate = value; + + } + + // Textures + + function allocTextureUnit() { + + var textureUnit = _usedTextureUnits; + + if ( textureUnit >= capabilities.maxTextures ) { + + console.warn( 'THREE.WebGLRenderer: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures ); + + } + + _usedTextureUnits += 1; + + return textureUnit; + + } + + this.allocTextureUnit = allocTextureUnit; + + // this.setTexture2D = setTexture2D; + this.setTexture2D = ( function () { + + var warned = false; + + // backwards compatibility: peel texture.texture + return function setTexture2D( texture, slot ) { + + if ( texture && texture.isWebGLRenderTarget ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead." ); + warned = true; + + } + + texture = texture.texture; + + } + + textures.setTexture2D( texture, slot ); + + }; + + }() ); + + this.setTexture3D = ( function () { + + // backwards compatibility: peel texture.texture + return function setTexture3D( texture, slot ) { + + textures.setTexture3D( texture, slot ); + + }; + + }() ); + + this.setTexture = ( function () { + + var warned = false; + + return function setTexture( texture, slot ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead." ); + warned = true; + + } + + textures.setTexture2D( texture, slot ); + + }; + + }() ); + + this.setTextureCube = ( function () { + + var warned = false; + + return function setTextureCube( texture, slot ) { + + // backwards compatibility: peel texture.texture + if ( texture && texture.isWebGLRenderTargetCube ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead." ); + warned = true; + + } + + texture = texture.texture; + + } + + // currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture + // TODO: unify these code paths + if ( ( texture && texture.isCubeTexture ) || + ( Array.isArray( texture.image ) && texture.image.length === 6 ) ) { + + // CompressedTexture can have Array in image :/ + + // this function alone should take care of cube textures + textures.setTextureCube( texture, slot ); + + } else { + + // assumed: texture property of THREE.WebGLRenderTargetCube + + textures.setTextureCubeDynamic( texture, slot ); + + } + + }; + + }() ); + + // + + this.setFramebuffer = function ( value ) { + + _framebuffer = value; + + }; + + this.getRenderTarget = function () { + + return _currentRenderTarget; + + }; + + this.setRenderTarget = function ( renderTarget ) { + + _currentRenderTarget = renderTarget; + + if ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) { + + textures.setupRenderTarget( renderTarget ); + + } + + var framebuffer = _framebuffer; + var isCube = false; + + if ( renderTarget ) { + + var __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer; + + if ( renderTarget.isWebGLRenderTargetCube ) { + + framebuffer = __webglFramebuffer[ renderTarget.activeCubeFace ]; + isCube = true; + + } else { + + framebuffer = __webglFramebuffer; + + } + + _currentViewport.copy( renderTarget.viewport ); + _currentScissor.copy( renderTarget.scissor ); + _currentScissorTest = renderTarget.scissorTest; + + } else { + + _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ); + _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ); + _currentScissorTest = _scissorTest; + + } + + if ( _currentFramebuffer !== framebuffer ) { + + _gl.bindFramebuffer( 36160, framebuffer ); + _currentFramebuffer = framebuffer; + + } + + state.viewport( _currentViewport ); + state.scissor( _currentScissor ); + state.setScissorTest( _currentScissorTest ); + + if ( isCube ) { + + var textureProperties = properties.get( renderTarget.texture ); + _gl.framebufferTexture2D( 36160, 36064, 34069 + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel ); + + } + + }; + + this.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) { + + if ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' ); + return; + + } + + var framebuffer = properties.get( renderTarget ).__webglFramebuffer; + + if ( framebuffer ) { + + var restore = false; + + if ( framebuffer !== _currentFramebuffer ) { + + _gl.bindFramebuffer( 36160, framebuffer ); + + restore = true; + + } + + try { + + var texture = renderTarget.texture; + var textureFormat = texture.format; + var textureType = texture.type; + + if ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( 35739 ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' ); + return; + + } + + if ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( 35738 ) && // IE11, Edge and Chrome Mac < 52 (#9513) + ! ( textureType === FloatType && ( capabilities.isWebGL2 || extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox + ! ( textureType === HalfFloatType && ( capabilities.isWebGL2 ? extensions.get( 'EXT_color_buffer_float' ) : extensions.get( 'EXT_color_buffer_half_float' ) ) ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' ); + return; + + } + + if ( _gl.checkFramebufferStatus( 36160 ) === 36053 ) { + + // the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604) + + if ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) { + + _gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer ); + + } + + } else { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' ); + + } + + } finally { + + if ( restore ) { + + _gl.bindFramebuffer( 36160, _currentFramebuffer ); + + } + + } + + } + + }; + + this.copyFramebufferToTexture = function ( position, texture, level ) { + + var width = texture.image.width; + var height = texture.image.height; + var glFormat = utils.convert( texture.format ); + + this.setTexture2D( texture, 0 ); + + _gl.copyTexImage2D( 3553, level || 0, glFormat, position.x, position.y, width, height, 0 ); + + }; + + this.copyTextureToTexture = function ( position, srcTexture, dstTexture, level ) { + + var width = srcTexture.image.width; + var height = srcTexture.image.height; + var glFormat = utils.convert( dstTexture.format ); + var glType = utils.convert( dstTexture.type ); + + this.setTexture2D( dstTexture, 0 ); + + if ( srcTexture.isDataTexture ) { + + _gl.texSubImage2D( 3553, level || 0, position.x, position.y, width, height, glFormat, glType, srcTexture.image.data ); + + } else { + + _gl.texSubImage2D( 3553, level || 0, position.x, position.y, glFormat, glType, srcTexture.image ); + + } + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function FogExp2( color, density ) { + + this.name = ''; + + this.color = new Color( color ); + this.density = ( density !== undefined ) ? density : 0.00025; + + } + + FogExp2.prototype.isFogExp2 = true; + + FogExp2.prototype.clone = function () { + + return new FogExp2( this.color, this.density ); + + }; + + FogExp2.prototype.toJSON = function ( /* meta */ ) { + + return { + type: 'FogExp2', + color: this.color.getHex(), + density: this.density + }; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Fog( color, near, far ) { + + this.name = ''; + + this.color = new Color( color ); + + this.near = ( near !== undefined ) ? near : 1; + this.far = ( far !== undefined ) ? far : 1000; + + } + + Fog.prototype.isFog = true; + + Fog.prototype.clone = function () { + + return new Fog( this.color, this.near, this.far ); + + }; + + Fog.prototype.toJSON = function ( /* meta */ ) { + + return { + type: 'Fog', + color: this.color.getHex(), + near: this.near, + far: this.far + }; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Scene() { + + Object3D.call( this ); + + this.type = 'Scene'; + + this.background = null; + this.fog = null; + this.overrideMaterial = null; + + this.autoUpdate = true; // checked by the renderer + + } + + Scene.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Scene, + + copy: function ( source, recursive ) { + + Object3D.prototype.copy.call( this, source, recursive ); + + if ( source.background !== null ) this.background = source.background.clone(); + if ( source.fog !== null ) this.fog = source.fog.clone(); + if ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone(); + + this.autoUpdate = source.autoUpdate; + this.matrixAutoUpdate = source.matrixAutoUpdate; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + if ( this.background !== null ) data.object.background = this.background.toJSON( meta ); + if ( this.fog !== null ) data.object.fog = this.fog.toJSON(); + + return data; + + } + + } ); + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InterleavedBuffer( array, stride ) { + + this.array = array; + this.stride = stride; + this.count = array !== undefined ? array.length / stride : 0; + + this.dynamic = false; + this.updateRange = { offset: 0, count: - 1 }; + + this.version = 0; + + } + + Object.defineProperty( InterleavedBuffer.prototype, 'needsUpdate', { + + set: function ( value ) { + + if ( value === true ) this.version ++; + + } + + } ); + + Object.assign( InterleavedBuffer.prototype, { + + isInterleavedBuffer: true, + + onUploadCallback: function () {}, + + setArray: function ( array ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.count = array !== undefined ? array.length / this.stride : 0; + this.array = array; + + return this; + + }, + + setDynamic: function ( value ) { + + this.dynamic = value; + + return this; + + }, + + copy: function ( source ) { + + this.array = new source.array.constructor( source.array ); + this.count = source.count; + this.stride = source.stride; + this.dynamic = source.dynamic; + + return this; + + }, + + copyAt: function ( index1, attribute, index2 ) { + + index1 *= this.stride; + index2 *= attribute.stride; + + for ( var i = 0, l = this.stride; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + }, + + set: function ( value, offset ) { + + if ( offset === undefined ) offset = 0; + + this.array.set( value, offset ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + onUpload: function ( callback ) { + + this.onUploadCallback = callback; + + return this; + + } + + } ); + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) { + + this.data = interleavedBuffer; + this.itemSize = itemSize; + this.offset = offset; + + this.normalized = normalized === true; + + } + + Object.defineProperties( InterleavedBufferAttribute.prototype, { + + count: { + + get: function () { + + return this.data.count; + + } + + }, + + array: { + + get: function () { + + return this.data.array; + + } + + } + + } ); + + Object.assign( InterleavedBufferAttribute.prototype, { + + isInterleavedBufferAttribute: true, + + setX: function ( index, x ) { + + this.data.array[ index * this.data.stride + this.offset ] = x; + + return this; + + }, + + setY: function ( index, y ) { + + this.data.array[ index * this.data.stride + this.offset + 1 ] = y; + + return this; + + }, + + setZ: function ( index, z ) { + + this.data.array[ index * this.data.stride + this.offset + 2 ] = z; + + return this; + + }, + + setW: function ( index, w ) { + + this.data.array[ index * this.data.stride + this.offset + 3 ] = w; + + return this; + + }, + + getX: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset ]; + + }, + + getY: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 1 ]; + + }, + + getZ: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 2 ]; + + }, + + getW: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 3 ]; + + }, + + setXY: function ( index, x, y ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + + return this; + + }, + + setXYZ: function ( index, x, y, z ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + + return this; + + }, + + setXYZW: function ( index, x, y, z, w ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + this.data.array[ index + 3 ] = w; + + return this; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * map: new THREE.Texture( ), + * rotation: , + * sizeAttenuation: + * } + */ + + function SpriteMaterial( parameters ) { + + Material.call( this ); + + this.type = 'SpriteMaterial'; + + this.color = new Color( 0xffffff ); + this.map = null; + + this.rotation = 0; + + this.sizeAttenuation = true; + + this.lights = false; + this.transparent = true; + + this.setValues( parameters ); + + } + + SpriteMaterial.prototype = Object.create( Material.prototype ); + SpriteMaterial.prototype.constructor = SpriteMaterial; + SpriteMaterial.prototype.isSpriteMaterial = true; + + SpriteMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.map = source.map; + + this.rotation = source.rotation; + + this.sizeAttenuation = source.sizeAttenuation; + + return this; + + }; + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + var geometry; + + function Sprite( material ) { + + Object3D.call( this ); + + this.type = 'Sprite'; + + if ( geometry === undefined ) { + + geometry = new BufferGeometry(); + + var float32Array = new Float32Array( [ + - 0.5, - 0.5, 0, 0, 0, + 0.5, - 0.5, 0, 1, 0, + 0.5, 0.5, 0, 1, 1, + - 0.5, 0.5, 0, 0, 1 + ] ); + + var interleavedBuffer = new InterleavedBuffer( float32Array, 5 ); + + geometry.setIndex( [ 0, 1, 2, 0, 2, 3 ] ); + geometry.addAttribute( 'position', new InterleavedBufferAttribute( interleavedBuffer, 3, 0, false ) ); + geometry.addAttribute( 'uv', new InterleavedBufferAttribute( interleavedBuffer, 2, 3, false ) ); + + } + + this.geometry = geometry; + this.material = ( material !== undefined ) ? material : new SpriteMaterial(); + + this.center = new Vector2( 0.5, 0.5 ); + + } + + Sprite.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Sprite, + + isSprite: true, + + raycast: ( function () { + + var intersectPoint = new Vector3(); + var worldScale = new Vector3(); + var mvPosition = new Vector3(); + + var alignedPosition = new Vector2(); + var rotatedPosition = new Vector2(); + var viewWorldMatrix = new Matrix4(); + + var vA = new Vector3(); + var vB = new Vector3(); + var vC = new Vector3(); + + var uvA = new Vector2(); + var uvB = new Vector2(); + var uvC = new Vector2(); + + function transformVertex( vertexPosition, mvPosition, center, scale, sin, cos ) { + + // compute position in camera space + alignedPosition.subVectors( vertexPosition, center ).addScalar( 0.5 ).multiply( scale ); + + // to check if rotation is not zero + if ( sin !== undefined ) { + + rotatedPosition.x = ( cos * alignedPosition.x ) - ( sin * alignedPosition.y ); + rotatedPosition.y = ( sin * alignedPosition.x ) + ( cos * alignedPosition.y ); + + } else { + + rotatedPosition.copy( alignedPosition ); + + } + + + vertexPosition.copy( mvPosition ); + vertexPosition.x += rotatedPosition.x; + vertexPosition.y += rotatedPosition.y; + + // transform to world space + vertexPosition.applyMatrix4( viewWorldMatrix ); + + } + + return function raycast( raycaster, intersects ) { + + worldScale.setFromMatrixScale( this.matrixWorld ); + viewWorldMatrix.getInverse( this.modelViewMatrix ).premultiply( this.matrixWorld ); + mvPosition.setFromMatrixPosition( this.modelViewMatrix ); + + var rotation = this.material.rotation; + var sin, cos; + if ( rotation !== 0 ) { + + cos = Math.cos( rotation ); + sin = Math.sin( rotation ); + + } + + var center = this.center; + + transformVertex( vA.set( - 0.5, - 0.5, 0 ), mvPosition, center, worldScale, sin, cos ); + transformVertex( vB.set( 0.5, - 0.5, 0 ), mvPosition, center, worldScale, sin, cos ); + transformVertex( vC.set( 0.5, 0.5, 0 ), mvPosition, center, worldScale, sin, cos ); + + uvA.set( 0, 0 ); + uvB.set( 1, 0 ); + uvC.set( 1, 1 ); + + // check first triangle + var intersect = raycaster.ray.intersectTriangle( vA, vB, vC, false, intersectPoint ); + + if ( intersect === null ) { + + // check second triangle + transformVertex( vB.set( - 0.5, 0.5, 0 ), mvPosition, center, worldScale, sin, cos ); + uvB.set( 0, 1 ); + + intersect = raycaster.ray.intersectTriangle( vA, vC, vB, false, intersectPoint ); + if ( intersect === null ) { + + return; + + } + + } + + var distance = raycaster.ray.origin.distanceTo( intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + point: intersectPoint.clone(), + uv: Triangle.getUV( intersectPoint, vA, vB, vC, uvA, uvB, uvC, new Vector2() ), + face: null, + object: this + + } ); + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.material ).copy( this ); + + }, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + if ( source.center !== undefined ) this.center.copy( source.center ); + + return this; + + } + + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function LOD() { + + Object3D.call( this ); + + this.type = 'LOD'; + + Object.defineProperties( this, { + levels: { + enumerable: true, + value: [] + } + } ); + + } + + LOD.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: LOD, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source, false ); + + var levels = source.levels; + + for ( var i = 0, l = levels.length; i < l; i ++ ) { + + var level = levels[ i ]; + + this.addLevel( level.object.clone(), level.distance ); + + } + + return this; + + }, + + addLevel: function ( object, distance ) { + + if ( distance === undefined ) distance = 0; + + distance = Math.abs( distance ); + + var levels = this.levels; + + for ( var l = 0; l < levels.length; l ++ ) { + + if ( distance < levels[ l ].distance ) { + + break; + + } + + } + + levels.splice( l, 0, { distance: distance, object: object } ); + + this.add( object ); + + }, + + getObjectForDistance: function ( distance ) { + + var levels = this.levels; + + for ( var i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance < levels[ i ].distance ) { + + break; + + } + + } + + return levels[ i - 1 ].object; + + }, + + raycast: ( function () { + + var matrixPosition = new Vector3(); + + return function raycast( raycaster, intersects ) { + + matrixPosition.setFromMatrixPosition( this.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( matrixPosition ); + + this.getObjectForDistance( distance ).raycast( raycaster, intersects ); + + }; + + }() ), + + update: function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function update( camera ) { + + var levels = this.levels; + + if ( levels.length > 1 ) { + + v1.setFromMatrixPosition( camera.matrixWorld ); + v2.setFromMatrixPosition( this.matrixWorld ); + + var distance = v1.distanceTo( v2 ); + + levels[ 0 ].object.visible = true; + + for ( var i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance >= levels[ i ].distance ) { + + levels[ i - 1 ].object.visible = false; + levels[ i ].object.visible = true; + + } else { + + break; + + } + + } + + for ( ; i < l; i ++ ) { + + levels[ i ].object.visible = false; + + } + + } + + }; + + }(), + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.levels = []; + + var levels = this.levels; + + for ( var i = 0, l = levels.length; i < l; i ++ ) { + + var level = levels[ i ]; + + data.object.levels.push( { + object: level.object.uuid, + distance: level.distance + } ); + + } + + return data; + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author michael guerrero / http://realitymeltdown.com + * @author ikerr / http://verold.com + */ + + function Skeleton( bones, boneInverses ) { + + // copy the bone array + + bones = bones || []; + + this.bones = bones.slice( 0 ); + this.boneMatrices = new Float32Array( this.bones.length * 16 ); + + // use the supplied bone inverses or calculate the inverses + + if ( boneInverses === undefined ) { + + this.calculateInverses(); + + } else { + + if ( this.bones.length === boneInverses.length ) { + + this.boneInverses = boneInverses.slice( 0 ); + + } else { + + console.warn( 'THREE.Skeleton boneInverses is the wrong length.' ); + + this.boneInverses = []; + + for ( var i = 0, il = this.bones.length; i < il; i ++ ) { + + this.boneInverses.push( new Matrix4() ); + + } + + } + + } + + } + + Object.assign( Skeleton.prototype, { + + calculateInverses: function () { + + this.boneInverses = []; + + for ( var i = 0, il = this.bones.length; i < il; i ++ ) { + + var inverse = new Matrix4(); + + if ( this.bones[ i ] ) { + + inverse.getInverse( this.bones[ i ].matrixWorld ); + + } + + this.boneInverses.push( inverse ); + + } + + }, + + pose: function () { + + var bone, i, il; + + // recover the bind-time world matrices + + for ( i = 0, il = this.bones.length; i < il; i ++ ) { + + bone = this.bones[ i ]; + + if ( bone ) { + + bone.matrixWorld.getInverse( this.boneInverses[ i ] ); + + } + + } + + // compute the local matrices, positions, rotations and scales + + for ( i = 0, il = this.bones.length; i < il; i ++ ) { + + bone = this.bones[ i ]; + + if ( bone ) { + + if ( bone.parent && bone.parent.isBone ) { + + bone.matrix.getInverse( bone.parent.matrixWorld ); + bone.matrix.multiply( bone.matrixWorld ); + + } else { + + bone.matrix.copy( bone.matrixWorld ); + + } + + bone.matrix.decompose( bone.position, bone.quaternion, bone.scale ); + + } + + } + + }, + + update: ( function () { + + var offsetMatrix = new Matrix4(); + var identityMatrix = new Matrix4(); + + return function update() { + + var bones = this.bones; + var boneInverses = this.boneInverses; + var boneMatrices = this.boneMatrices; + var boneTexture = this.boneTexture; + + // flatten bone matrices to array + + for ( var i = 0, il = bones.length; i < il; i ++ ) { + + // compute the offset between the current and the original transform + + var matrix = bones[ i ] ? bones[ i ].matrixWorld : identityMatrix; + + offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] ); + offsetMatrix.toArray( boneMatrices, i * 16 ); + + } + + if ( boneTexture !== undefined ) { + + boneTexture.needsUpdate = true; + + } + + }; + + } )(), + + clone: function () { + + return new Skeleton( this.bones, this.boneInverses ); + + }, + + getBoneByName: function ( name ) { + + for ( var i = 0, il = this.bones.length; i < il; i ++ ) { + + var bone = this.bones[ i ]; + + if ( bone.name === name ) { + + return bone; + + } + + } + + return undefined; + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + + function Bone() { + + Object3D.call( this ); + + this.type = 'Bone'; + + } + + Bone.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Bone, + + isBone: true + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + + function SkinnedMesh( geometry, material ) { + + Mesh.call( this, geometry, material ); + + this.type = 'SkinnedMesh'; + + this.bindMode = 'attached'; + this.bindMatrix = new Matrix4(); + this.bindMatrixInverse = new Matrix4(); + + var bones = this.initBones(); + var skeleton = new Skeleton( bones ); + + this.bind( skeleton, this.matrixWorld ); + + this.normalizeSkinWeights(); + + } + + SkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), { + + constructor: SkinnedMesh, + + isSkinnedMesh: true, + + initBones: function () { + + var bones = [], bone, gbone; + var i, il; + + if ( this.geometry && this.geometry.bones !== undefined ) { + + // first, create array of 'Bone' objects from geometry data + + for ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) { + + gbone = this.geometry.bones[ i ]; + + // create new 'Bone' object + + bone = new Bone(); + bones.push( bone ); + + // apply values + + bone.name = gbone.name; + bone.position.fromArray( gbone.pos ); + bone.quaternion.fromArray( gbone.rotq ); + if ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl ); + + } + + // second, create bone hierarchy + + for ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) { + + gbone = this.geometry.bones[ i ]; + + if ( ( gbone.parent !== - 1 ) && ( gbone.parent !== null ) && ( bones[ gbone.parent ] !== undefined ) ) { + + // subsequent bones in the hierarchy + + bones[ gbone.parent ].add( bones[ i ] ); + + } else { + + // topmost bone, immediate child of the skinned mesh + + this.add( bones[ i ] ); + + } + + } + + } + + // now the bones are part of the scene graph and children of the skinned mesh. + // let's update the corresponding matrices + + this.updateMatrixWorld( true ); + + return bones; + + }, + + bind: function ( skeleton, bindMatrix ) { + + this.skeleton = skeleton; + + if ( bindMatrix === undefined ) { + + this.updateMatrixWorld( true ); + + this.skeleton.calculateInverses(); + + bindMatrix = this.matrixWorld; + + } + + this.bindMatrix.copy( bindMatrix ); + this.bindMatrixInverse.getInverse( bindMatrix ); + + }, + + pose: function () { + + this.skeleton.pose(); + + }, + + normalizeSkinWeights: function () { + + var scale, i; + + if ( this.geometry && this.geometry.isGeometry ) { + + for ( i = 0; i < this.geometry.skinWeights.length; i ++ ) { + + var sw = this.geometry.skinWeights[ i ]; + + scale = 1.0 / sw.manhattanLength(); + + if ( scale !== Infinity ) { + + sw.multiplyScalar( scale ); + + } else { + + sw.set( 1, 0, 0, 0 ); // do something reasonable + + } + + } + + } else if ( this.geometry && this.geometry.isBufferGeometry ) { + + var vec = new Vector4(); + + var skinWeight = this.geometry.attributes.skinWeight; + + for ( i = 0; i < skinWeight.count; i ++ ) { + + vec.x = skinWeight.getX( i ); + vec.y = skinWeight.getY( i ); + vec.z = skinWeight.getZ( i ); + vec.w = skinWeight.getW( i ); + + scale = 1.0 / vec.manhattanLength(); + + if ( scale !== Infinity ) { + + vec.multiplyScalar( scale ); + + } else { + + vec.set( 1, 0, 0, 0 ); // do something reasonable + + } + + skinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w ); + + } + + } + + }, + + updateMatrixWorld: function ( force ) { + + Mesh.prototype.updateMatrixWorld.call( this, force ); + + if ( this.bindMode === 'attached' ) { + + this.bindMatrixInverse.getInverse( this.matrixWorld ); + + } else if ( this.bindMode === 'detached' ) { + + this.bindMatrixInverse.getInverse( this.bindMatrix ); + + } else { + + console.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode ); + + } + + }, + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * linewidth: , + * linecap: "round", + * linejoin: "round" + * } + */ + + function LineBasicMaterial( parameters ) { + + Material.call( this ); + + this.type = 'LineBasicMaterial'; + + this.color = new Color( 0xffffff ); + + this.linewidth = 1; + this.linecap = 'round'; + this.linejoin = 'round'; + + this.lights = false; + + this.setValues( parameters ); + + } + + LineBasicMaterial.prototype = Object.create( Material.prototype ); + LineBasicMaterial.prototype.constructor = LineBasicMaterial; + + LineBasicMaterial.prototype.isLineBasicMaterial = true; + + LineBasicMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.linewidth = source.linewidth; + this.linecap = source.linecap; + this.linejoin = source.linejoin; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Line( geometry, material, mode ) { + + if ( mode === 1 ) { + + console.error( 'THREE.Line: parameter THREE.LinePieces no longer supported. Use THREE.LineSegments instead.' ); + + } + + Object3D.call( this ); + + this.type = 'Line'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } ); + + } + + Line.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Line, + + isLine: true, + + computeLineDistances: ( function () { + + var start = new Vector3(); + var end = new Vector3(); + + return function computeLineDistances() { + + var geometry = this.geometry; + + if ( geometry.isBufferGeometry ) { + + // we assume non-indexed geometry + + if ( geometry.index === null ) { + + var positionAttribute = geometry.attributes.position; + var lineDistances = [ 0 ]; + + for ( var i = 1, l = positionAttribute.count; i < l; i ++ ) { + + start.fromBufferAttribute( positionAttribute, i - 1 ); + end.fromBufferAttribute( positionAttribute, i ); + + lineDistances[ i ] = lineDistances[ i - 1 ]; + lineDistances[ i ] += start.distanceTo( end ); + + } + + geometry.addAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) ); + + } else { + + console.warn( 'THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' ); + + } + + } else if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + var lineDistances = geometry.lineDistances; + + lineDistances[ 0 ] = 0; + + for ( var i = 1, l = vertices.length; i < l; i ++ ) { + + lineDistances[ i ] = lineDistances[ i - 1 ]; + lineDistances[ i ] += vertices[ i - 1 ].distanceTo( vertices[ i ] ); + + } + + } + + return this; + + }; + + }() ), + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + return function raycast( raycaster, intersects ) { + + var precision = raycaster.linePrecision; + + var geometry = this.geometry; + var matrixWorld = this.matrixWorld; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + sphere.radius += precision; + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + var localPrecision = precision / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 ); + var localPrecisionSq = localPrecision * localPrecision; + + var vStart = new Vector3(); + var vEnd = new Vector3(); + var interSegment = new Vector3(); + var interRay = new Vector3(); + var step = ( this && this.isLineSegments ) ? 2 : 1; + + if ( geometry.isBufferGeometry ) { + + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, l = indices.length - 1; i < l; i += step ) { + + var a = indices[ i ]; + var b = indices[ i + 1 ]; + + vStart.fromArray( positions, a * 3 ); + vEnd.fromArray( positions, b * 3 ); + + var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > localPrecisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } else { + + for ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) { + + vStart.fromArray( positions, 3 * i ); + vEnd.fromArray( positions, 3 * i + 3 ); + + var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > localPrecisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + } else if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + var nbVertices = vertices.length; + + for ( var i = 0; i < nbVertices - 1; i += step ) { + + var distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment ); + + if ( distSq > localPrecisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + }; + + }() ), + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.geometry.copy( source.geometry ); + this.material.copy( source.material ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LineSegments( geometry, material ) { + + Line.call( this, geometry, material ); + + this.type = 'LineSegments'; + + } + + LineSegments.prototype = Object.assign( Object.create( Line.prototype ), { + + constructor: LineSegments, + + isLineSegments: true, + + computeLineDistances: ( function () { + + var start = new Vector3(); + var end = new Vector3(); + + return function computeLineDistances() { + + var geometry = this.geometry; + + if ( geometry.isBufferGeometry ) { + + // we assume non-indexed geometry + + if ( geometry.index === null ) { + + var positionAttribute = geometry.attributes.position; + var lineDistances = []; + + for ( var i = 0, l = positionAttribute.count; i < l; i += 2 ) { + + start.fromBufferAttribute( positionAttribute, i ); + end.fromBufferAttribute( positionAttribute, i + 1 ); + + lineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ]; + lineDistances[ i + 1 ] = lineDistances[ i ] + start.distanceTo( end ); + + } + + geometry.addAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) ); + + } else { + + console.warn( 'THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' ); + + } + + } else if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + var lineDistances = geometry.lineDistances; + + for ( var i = 0, l = vertices.length; i < l; i += 2 ) { + + start.copy( vertices[ i ] ); + end.copy( vertices[ i + 1 ] ); + + lineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ]; + lineDistances[ i + 1 ] = lineDistances[ i ] + start.distanceTo( end ); + + } + + } + + return this; + + }; + + }() ) + + } ); + + /** + * @author mgreter / http://github.com/mgreter + */ + + function LineLoop( geometry, material ) { + + Line.call( this, geometry, material ); + + this.type = 'LineLoop'; + + } + + LineLoop.prototype = Object.assign( Object.create( Line.prototype ), { + + constructor: LineLoop, + + isLineLoop: true, + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * size: , + * sizeAttenuation: + * + * morphTargets: + * } + */ + + function PointsMaterial( parameters ) { + + Material.call( this ); + + this.type = 'PointsMaterial'; + + this.color = new Color( 0xffffff ); + + this.map = null; + + this.size = 1; + this.sizeAttenuation = true; + + this.morphTargets = false; + + this.lights = false; + + this.setValues( parameters ); + + } + + PointsMaterial.prototype = Object.create( Material.prototype ); + PointsMaterial.prototype.constructor = PointsMaterial; + + PointsMaterial.prototype.isPointsMaterial = true; + + PointsMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.size = source.size; + this.sizeAttenuation = source.sizeAttenuation; + + this.morphTargets = source.morphTargets; + + return this; + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Points( geometry, material ) { + + Object3D.call( this ); + + this.type = 'Points'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } ); + + } + + Points.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Points, + + isPoints: true, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + return function raycast( raycaster, intersects ) { + + var object = this; + var geometry = this.geometry; + var matrixWorld = this.matrixWorld; + var threshold = raycaster.params.Points.threshold; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + sphere.radius += threshold; + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + var localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 ); + var localThresholdSq = localThreshold * localThreshold; + var position = new Vector3(); + var intersectPoint = new Vector3(); + + function testPoint( point, index ) { + + var rayPointDistanceSq = ray.distanceSqToPoint( point ); + + if ( rayPointDistanceSq < localThresholdSq ) { + + ray.closestPointToPoint( point, intersectPoint ); + intersectPoint.applyMatrix4( matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + distanceToRay: Math.sqrt( rayPointDistanceSq ), + point: intersectPoint.clone(), + index: index, + face: null, + object: object + + } ); + + } + + } + + if ( geometry.isBufferGeometry ) { + + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, il = indices.length; i < il; i ++ ) { + + var a = indices[ i ]; + + position.fromArray( positions, a * 3 ); + + testPoint( position, a ); + + } + + } else { + + for ( var i = 0, l = positions.length / 3; i < l; i ++ ) { + + position.fromArray( positions, i * 3 ); + + testPoint( position, i ); + + } + + } + + } else { + + var vertices = geometry.vertices; + + for ( var i = 0, l = vertices.length; i < l; i ++ ) { + + testPoint( vertices[ i ], i ); + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + Texture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.generateMipmaps = false; + + } + + VideoTexture.prototype = Object.assign( Object.create( Texture.prototype ), { + + constructor: VideoTexture, + + isVideoTexture: true, + + update: function () { + + var video = this.image; + + if ( video.readyState >= video.HAVE_CURRENT_DATA ) { + + this.needsUpdate = true; + + } + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.image = { width: width, height: height }; + this.mipmaps = mipmaps; + + // no flipping for cube textures + // (also flipping doesn't work for compressed textures ) + + this.flipY = false; + + // can't generate mipmaps for compressed textures + // mips must be embedded in DDS files + + this.generateMipmaps = false; + + } + + CompressedTexture.prototype = Object.create( Texture.prototype ); + CompressedTexture.prototype.constructor = CompressedTexture; + + CompressedTexture.prototype.isCompressedTexture = true; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + Texture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.needsUpdate = true; + + } + + CanvasTexture.prototype = Object.create( Texture.prototype ); + CanvasTexture.prototype.constructor = CanvasTexture; + CanvasTexture.prototype.isCanvasTexture = true; + + /** + * @author Matt DesLauriers / @mattdesl + * @author atix / arthursilber.de + */ + + function DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) { + + format = format !== undefined ? format : DepthFormat; + + if ( format !== DepthFormat && format !== DepthStencilFormat ) { + + throw new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' ); + + } + + if ( type === undefined && format === DepthFormat ) type = UnsignedShortType; + if ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type; + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.image = { width: width, height: height }; + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter; + + this.flipY = false; + this.generateMipmaps = false; + + } + + DepthTexture.prototype = Object.create( Texture.prototype ); + DepthTexture.prototype.constructor = DepthTexture; + DepthTexture.prototype.isDepthTexture = true; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + function WireframeGeometry( geometry ) { + + BufferGeometry.call( this ); + + this.type = 'WireframeGeometry'; + + // buffer + + var vertices = []; + + // helper variables + + var i, j, l, o, ol; + var edge = [ 0, 0 ], edges = {}, e, edge1, edge2; + var key, keys = [ 'a', 'b', 'c' ]; + var vertex; + + // different logic for Geometry and BufferGeometry + + if ( geometry && geometry.isGeometry ) { + + // create a data structure that contains all edges without duplicates + + var faces = geometry.faces; + + for ( i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( j = 0; j < 3; j ++ ) { + + edge1 = face[ keys[ j ] ]; + edge2 = face[ keys[ ( j + 1 ) % 3 ] ]; + edge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates + edge[ 1 ] = Math.max( edge1, edge2 ); + + key = edge[ 0 ] + ',' + edge[ 1 ]; + + if ( edges[ key ] === undefined ) { + + edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] }; + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + e = edges[ key ]; + + vertex = geometry.vertices[ e.index1 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex = geometry.vertices[ e.index2 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } else if ( geometry && geometry.isBufferGeometry ) { + + var position, indices, groups; + var group, start, count; + var index1, index2; + + vertex = new Vector3(); + + if ( geometry.index !== null ) { + + // indexed BufferGeometry + + position = geometry.attributes.position; + indices = geometry.index; + groups = geometry.groups; + + if ( groups.length === 0 ) { + + groups = [ { start: 0, count: indices.count, materialIndex: 0 } ]; + + } + + // create a data structure that contains all eges without duplicates + + for ( o = 0, ol = groups.length; o < ol; ++ o ) { + + group = groups[ o ]; + + start = group.start; + count = group.count; + + for ( i = start, l = ( start + count ); i < l; i += 3 ) { + + for ( j = 0; j < 3; j ++ ) { + + edge1 = indices.getX( i + j ); + edge2 = indices.getX( i + ( j + 1 ) % 3 ); + edge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates + edge[ 1 ] = Math.max( edge1, edge2 ); + + key = edge[ 0 ] + ',' + edge[ 1 ]; + + if ( edges[ key ] === undefined ) { + + edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] }; + + } + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + e = edges[ key ]; + + vertex.fromBufferAttribute( position, e.index1 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex.fromBufferAttribute( position, e.index2 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } else { + + // non-indexed BufferGeometry + + position = geometry.attributes.position; + + for ( i = 0, l = ( position.count / 3 ); i < l; i ++ ) { + + for ( j = 0; j < 3; j ++ ) { + + // three edges per triangle, an edge is represented as (index1, index2) + // e.g. the first triangle has the following edges: (0,1),(1,2),(2,0) + + index1 = 3 * i + j; + vertex.fromBufferAttribute( position, index1 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + index2 = 3 * i + ( ( j + 1 ) % 3 ); + vertex.fromBufferAttribute( position, index2 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + } + + } + + // build geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + + } + + WireframeGeometry.prototype = Object.create( BufferGeometry.prototype ); + WireframeGeometry.prototype.constructor = WireframeGeometry; + + /** + * @author zz85 / https://github.com/zz85 + * @author Mugen87 / https://github.com/Mugen87 + * + * Parametric Surfaces Geometry + * based on the brilliant article by @prideout http://prideout.net/blog/?p=44 + */ + + // ParametricGeometry + + function ParametricGeometry( func, slices, stacks ) { + + Geometry.call( this ); + + this.type = 'ParametricGeometry'; + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + }; + + this.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) ); + this.mergeVertices(); + + } + + ParametricGeometry.prototype = Object.create( Geometry.prototype ); + ParametricGeometry.prototype.constructor = ParametricGeometry; + + // ParametricBufferGeometry + + function ParametricBufferGeometry( func, slices, stacks ) { + + BufferGeometry.call( this ); + + this.type = 'ParametricBufferGeometry'; + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + }; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + var EPS = 0.00001; + + var normal = new Vector3(); + + var p0 = new Vector3(), p1 = new Vector3(); + var pu = new Vector3(), pv = new Vector3(); + + var i, j; + + if ( func.length < 3 ) { + + console.error( 'THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter.' ); + + } + + // generate vertices, normals and uvs + + var sliceCount = slices + 1; + + for ( i = 0; i <= stacks; i ++ ) { + + var v = i / stacks; + + for ( j = 0; j <= slices; j ++ ) { + + var u = j / slices; + + // vertex + + func( u, v, p0 ); + vertices.push( p0.x, p0.y, p0.z ); + + // normal + + // approximate tangent vectors via finite differences + + if ( u - EPS >= 0 ) { + + func( u - EPS, v, p1 ); + pu.subVectors( p0, p1 ); + + } else { + + func( u + EPS, v, p1 ); + pu.subVectors( p1, p0 ); + + } + + if ( v - EPS >= 0 ) { + + func( u, v - EPS, p1 ); + pv.subVectors( p0, p1 ); + + } else { + + func( u, v + EPS, p1 ); + pv.subVectors( p1, p0 ); + + } + + // cross product of tangent vectors returns surface normal + + normal.crossVectors( pu, pv ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, v ); + + } + + } + + // generate indices + + for ( i = 0; i < stacks; i ++ ) { + + for ( j = 0; j < slices; j ++ ) { + + var a = i * sliceCount + j; + var b = i * sliceCount + j + 1; + var c = ( i + 1 ) * sliceCount + j + 1; + var d = ( i + 1 ) * sliceCount + j; + + // faces one and two + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + ParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + ParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry; + + /** + * @author clockworkgeek / https://github.com/clockworkgeek + * @author timothypratley / https://github.com/timothypratley + * @author WestLangley / http://github.com/WestLangley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // PolyhedronGeometry + + function PolyhedronGeometry( vertices, indices, radius, detail ) { + + Geometry.call( this ); + + this.type = 'PolyhedronGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) ); + this.mergeVertices(); + + } + + PolyhedronGeometry.prototype = Object.create( Geometry.prototype ); + PolyhedronGeometry.prototype.constructor = PolyhedronGeometry; + + // PolyhedronBufferGeometry + + function PolyhedronBufferGeometry( vertices, indices, radius, detail ) { + + BufferGeometry.call( this ); + + this.type = 'PolyhedronBufferGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + radius = radius || 1; + detail = detail || 0; + + // default buffer data + + var vertexBuffer = []; + var uvBuffer = []; + + // the subdivision creates the vertex buffer data + + subdivide( detail ); + + // all vertices should lie on a conceptual sphere with a given radius + + appplyRadius( radius ); + + // finally, create the uv data + + generateUVs(); + + // build non-indexed geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) ); + + if ( detail === 0 ) { + + this.computeVertexNormals(); // flat normals + + } else { + + this.normalizeNormals(); // smooth normals + + } + + // helper functions + + function subdivide( detail ) { + + var a = new Vector3(); + var b = new Vector3(); + var c = new Vector3(); + + // iterate over all faces and apply a subdivison with the given detail value + + for ( var 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 ) { + + var cols = Math.pow( 2, detail ); + + // we use this multidimensional array as a data structure for creating the subdivision + + var v = []; + + var i, j; + + // construct all of the vertices for this subdivision + + for ( i = 0; i <= cols; i ++ ) { + + v[ i ] = []; + + var aj = a.clone().lerp( c, i / cols ); + var bj = b.clone().lerp( c, i / cols ); + + var rows = cols - i; + + for ( 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 ( i = 0; i < cols; i ++ ) { + + for ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) { + + var 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 appplyRadius( radius ) { + + var vertex = new Vector3(); + + // iterate over the entire buffer and apply the radius to each vertex + + for ( var 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() { + + var vertex = new Vector3(); + + for ( var i = 0; i < vertexBuffer.length; i += 3 ) { + + vertex.x = vertexBuffer[ i + 0 ]; + vertex.y = vertexBuffer[ i + 1 ]; + vertex.z = vertexBuffer[ i + 2 ]; + + var u = azimuth( vertex ) / 2 / Math.PI + 0.5; + var 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 ( var i = 0; i < uvBuffer.length; i += 6 ) { + + // uv data of a single face + + var x0 = uvBuffer[ i + 0 ]; + var x1 = uvBuffer[ i + 2 ]; + var x2 = uvBuffer[ i + 4 ]; + + var max = Math.max( x0, x1, x2 ); + var 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 ) { + + var stride = index * 3; + + vertex.x = vertices[ stride + 0 ]; + vertex.y = vertices[ stride + 1 ]; + vertex.z = vertices[ stride + 2 ]; + + } + + function correctUVs() { + + var a = new Vector3(); + var b = new Vector3(); + var c = new Vector3(); + + var centroid = new Vector3(); + + var uvA = new Vector2(); + var uvB = new Vector2(); + var uvC = new Vector2(); + + for ( var 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 ).divideScalar( 3 ); + + var 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 ) ) ); + + } + + } + + PolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + PolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // TetrahedronGeometry + + function TetrahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'TetrahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + TetrahedronGeometry.prototype = Object.create( Geometry.prototype ); + TetrahedronGeometry.prototype.constructor = TetrahedronGeometry; + + // TetrahedronBufferGeometry + + function TetrahedronBufferGeometry( radius, detail ) { + + var vertices = [ + 1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1 + ]; + + var indices = [ + 2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'TetrahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + TetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + TetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // OctahedronGeometry + + function OctahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'OctahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + OctahedronGeometry.prototype = Object.create( Geometry.prototype ); + OctahedronGeometry.prototype.constructor = OctahedronGeometry; + + // OctahedronBufferGeometry + + function OctahedronBufferGeometry( radius, detail ) { + + var vertices = [ + 1, 0, 0, - 1, 0, 0, 0, 1, 0, + 0, - 1, 0, 0, 0, 1, 0, 0, - 1 + ]; + + var 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 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'OctahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + OctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + OctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // IcosahedronGeometry + + function IcosahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'IcosahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + IcosahedronGeometry.prototype = Object.create( Geometry.prototype ); + IcosahedronGeometry.prototype.constructor = IcosahedronGeometry; + + // IcosahedronBufferGeometry + + function IcosahedronBufferGeometry( radius, detail ) { + + var t = ( 1 + Math.sqrt( 5 ) ) / 2; + + var 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 + ]; + + var 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 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'IcosahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + IcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + IcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry; + + /** + * @author Abe Pazos / https://hamoid.com + * @author Mugen87 / https://github.com/Mugen87 + */ + + // DodecahedronGeometry + + function DodecahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'DodecahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + DodecahedronGeometry.prototype = Object.create( Geometry.prototype ); + DodecahedronGeometry.prototype.constructor = DodecahedronGeometry; + + // DodecahedronBufferGeometry + + function DodecahedronBufferGeometry( radius, detail ) { + + var t = ( 1 + Math.sqrt( 5 ) ) / 2; + var r = 1 / t; + + var 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 + ]; + + var 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 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'DodecahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + DodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + DodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry; + + /** + * @author oosmoxiecode / https://github.com/oosmoxiecode + * @author WestLangley / https://github.com/WestLangley + * @author zz85 / https://github.com/zz85 + * @author miningold / https://github.com/miningold + * @author jonobr1 / https://github.com/jonobr1 + * @author Mugen87 / https://github.com/Mugen87 + * + */ + + // TubeGeometry + + function TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) { + + Geometry.call( this ); + + this.type = 'TubeGeometry'; + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + }; + + if ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' ); + + var bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ); + + // expose internals + + this.tangents = bufferGeometry.tangents; + this.normals = bufferGeometry.normals; + this.binormals = bufferGeometry.binormals; + + // create geometry + + this.fromBufferGeometry( bufferGeometry ); + this.mergeVertices(); + + } + + TubeGeometry.prototype = Object.create( Geometry.prototype ); + TubeGeometry.prototype.constructor = TubeGeometry; + + // TubeBufferGeometry + + function TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) { + + BufferGeometry.call( this ); + + this.type = 'TubeBufferGeometry'; + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + }; + + tubularSegments = tubularSegments || 64; + radius = radius || 1; + radialSegments = radialSegments || 8; + closed = closed || false; + + var frames = path.computeFrenetFrames( tubularSegments, closed ); + + // expose internals + + this.tangents = frames.tangents; + this.normals = frames.normals; + this.binormals = frames.binormals; + + // helper variables + + var vertex = new Vector3(); + var normal = new Vector3(); + var uv = new Vector2(); + var P = new Vector3(); + + var i, j; + + // buffer + + var vertices = []; + var normals = []; + var uvs = []; + var indices = []; + + // create buffer data + + generateBufferData(); + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // functions + + function generateBufferData() { + + for ( i = 0; i < tubularSegments; i ++ ) { + + generateSegment( i ); + + } + + // if the geometry is not closed, generate the last row of vertices and normals + // at the regular position on the given path + // + // if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ) + + generateSegment( ( closed === false ) ? tubularSegments : 0 ); + + // uvs are generated in a separate function. + // this makes it easy compute correct values for closed geometries + + generateUVs(); + + // finally create faces + + generateIndices(); + + } + + function generateSegment( i ) { + + // we use getPointAt to sample evenly distributed points from the given path + + P = path.getPointAt( i / tubularSegments, P ); + + // retrieve corresponding normal and binormal + + var N = frames.normals[ i ]; + var B = frames.binormals[ i ]; + + // generate normals and vertices for the current segment + + for ( j = 0; j <= radialSegments; j ++ ) { + + var v = j / radialSegments * Math.PI * 2; + + var sin = Math.sin( v ); + var cos = - Math.cos( v ); + + // normal + + normal.x = ( cos * N.x + sin * B.x ); + normal.y = ( cos * N.y + sin * B.y ); + normal.z = ( cos * N.z + sin * B.z ); + normal.normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // vertex + + vertex.x = P.x + radius * normal.x; + vertex.y = P.y + radius * normal.y; + vertex.z = P.z + radius * normal.z; + + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + function generateIndices() { + + for ( j = 1; j <= tubularSegments; j ++ ) { + + for ( i = 1; i <= radialSegments; i ++ ) { + + var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + var b = ( radialSegments + 1 ) * j + ( i - 1 ); + var c = ( radialSegments + 1 ) * j + i; + var d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + } + + function generateUVs() { + + for ( i = 0; i <= tubularSegments; i ++ ) { + + for ( j = 0; j <= radialSegments; j ++ ) { + + uv.x = i / tubularSegments; + uv.y = j / radialSegments; + + uvs.push( uv.x, uv.y ); + + } + + } + + } + + } + + TubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TubeBufferGeometry.prototype.constructor = TubeBufferGeometry; + + /** + * @author oosmoxiecode + * @author Mugen87 / https://github.com/Mugen87 + * + * based on http://www.blackpawn.com/texts/pqtorus/ + */ + + // TorusKnotGeometry + + function TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) { + + Geometry.call( this ); + + this.type = 'TorusKnotGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + }; + + if ( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' ); + + this.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) ); + this.mergeVertices(); + + } + + TorusKnotGeometry.prototype = Object.create( Geometry.prototype ); + TorusKnotGeometry.prototype.constructor = TorusKnotGeometry; + + // TorusKnotBufferGeometry + + function TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) { + + BufferGeometry.call( this ); + + this.type = 'TorusKnotBufferGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + }; + + radius = radius || 1; + tube = tube || 0.4; + tubularSegments = Math.floor( tubularSegments ) || 64; + radialSegments = Math.floor( radialSegments ) || 8; + p = p || 2; + q = q || 3; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var i, j; + + var vertex = new Vector3(); + var normal = new Vector3(); + + var P1 = new Vector3(); + var P2 = new Vector3(); + + var B = new Vector3(); + var T = new Vector3(); + var 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 + + var 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. + + var v = j / radialSegments * Math.PI * 2; + var cx = - tube * Math.cos( v ); + var 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 + + var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + var b = ( radialSegments + 1 ) * j + ( i - 1 ); + var c = ( radialSegments + 1 ) * j + i; + var d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // this function calculates the current position on the torus curve + + function calculatePositionOnCurve( u, p, q, radius, position ) { + + var cu = Math.cos( u ); + var su = Math.sin( u ); + var quOverP = q / p * u; + var 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; + + } + + } + + TorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry; + + /** + * @author oosmoxiecode + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // TorusGeometry + + function TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) { + + Geometry.call( this ); + + this.type = 'TorusGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + this.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) ); + this.mergeVertices(); + + } + + TorusGeometry.prototype = Object.create( Geometry.prototype ); + TorusGeometry.prototype.constructor = TorusGeometry; + + // TorusBufferGeometry + + function TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) { + + BufferGeometry.call( this ); + + this.type = 'TorusBufferGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + radius = radius || 1; + tube = tube || 0.4; + radialSegments = Math.floor( radialSegments ) || 8; + tubularSegments = Math.floor( tubularSegments ) || 6; + arc = arc || Math.PI * 2; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var center = new Vector3(); + var vertex = new Vector3(); + var normal = new Vector3(); + + var j, i; + + // generate vertices, normals and uvs + + for ( j = 0; j <= radialSegments; j ++ ) { + + for ( i = 0; i <= tubularSegments; i ++ ) { + + var u = i / tubularSegments * arc; + var 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 ); + + vertices.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 ( j = 1; j <= radialSegments; j ++ ) { + + for ( i = 1; i <= tubularSegments; i ++ ) { + + // indices + + 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; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + TorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TorusBufferGeometry.prototype.constructor = TorusBufferGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + * Port from https://github.com/mapbox/earcut (v2.1.2) + */ + + var Earcut = { + + triangulate: function ( data, holeIndices, dim ) { + + dim = dim || 2; + + var hasHoles = holeIndices && holeIndices.length, + outerLen = hasHoles ? holeIndices[ 0 ] * dim : data.length, + outerNode = linkedList( data, 0, outerLen, dim, true ), + triangles = []; + + if ( ! outerNode ) return triangles; + + var 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 ( var 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 ) { + + var 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; + + var 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 ); + + var 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 vertice 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( 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 ) { + + var 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 + var 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 ) { + + var 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 + + var 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; + + var minZ = zOrder( minTX, minTY, minX, minY, invSize ), + maxZ = zOrder( maxTX, maxTY, minX, minY, invSize ); + + // first look for points inside the triangle in increasing z-order + + var p = ear.nextZ; + + while ( p && p.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.nextZ; + + } + + // then look for points in decreasing z-order + + p = ear.prevZ; + + 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; + + } + + return true; + + } + + // go through all polygon nodes and cure small local self-intersections + + function cureLocalIntersections( start, triangles, dim ) { + + var p = start; + + do { + + var 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 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 + + var a = start; + + do { + + var b = a.next.next; + + while ( b !== a.prev ) { + + if ( a.i !== b.i && isValidDiagonal( a, b ) ) { + + // split the polygon in two by the diagonal + + var 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 ) { + + var queue = [], 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 ) { + + var b = splitPolygon( outerNode, hole ); + + filterPoints( b, b.next ); + + } + + } + + // David Eberly's algorithm for finding a bridge between hole and outer polygon + + function findHoleBridge( hole, outerNode ) { + + var p = outerNode, + hx = hole.x, + hy = hole.y, + 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 ) { + + var 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.prev; // hole touches outer segment; pick lower 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 + + var stop = m, + mx = m.x, + my = m.y, + tanMin = Infinity, + tan; + + p = m.next; + + while ( p !== stop ) { + + 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 ( ( tan < tanMin || ( tan === tanMin && p.x > m.x ) ) && locallyInside( p, hole ) ) { + + m = p; + tanMin = tan; + + } + + } + + p = p.next; + + } + + return m; + + } + + // interlink polygon nodes in z-order + + function indexCurve( start, minX, minY, invSize ) { + + var 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 ) { + + var 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 ) { + + var p = start, leftmost = start; + + do { + + if ( p.x < leftmost.x ) 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 ) && + locallyInside( a, b ) && locallyInside( b, a ) && middleInside( a, b ); + + } + + // 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 ) { + + if ( ( equals( p1, q1 ) && equals( p2, q2 ) ) || + ( equals( p1, q2 ) && equals( p2, q1 ) ) ) return true; + + return area( p1, q1, p2 ) > 0 !== area( p1, q1, q2 ) > 0 && + area( p2, q2, p1 ) > 0 !== area( p2, q2, q1 ) > 0; + + } + + // check if a polygon diagonal intersects any polygon segments + + function intersectsPolygon( a, b ) { + + var 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 ) { + + var p = a, + inside = false, + 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 ) { + + var 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 ) { + + var 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 ) { + + // vertice index in coordinates array + this.i = i; + + // vertex coordinates + this.x = x; + this.y = y; + + // previous and next vertice 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 ) { + + var sum = 0; + + for ( var i = start, j = end - dim; i < end; i += dim ) { + + sum += ( data[ j ] - data[ i ] ) * ( data[ i + 1 ] + data[ j + 1 ] ); + j = i; + + } + + return sum; + + } + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + + var ShapeUtils = { + + // calculate area of the contour polygon + + area: function ( contour ) { + + var n = contour.length; + var a = 0.0; + + for ( var 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; + + }, + + isClockWise: function ( pts ) { + + return ShapeUtils.area( pts ) < 0; + + }, + + triangulateShape: function ( contour, holes ) { + + var vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ] + var holeIndices = []; // array of hole indices + var faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ] + + removeDupEndPts( contour ); + addContour( vertices, contour ); + + // + + var holeIndex = contour.length; + + holes.forEach( removeDupEndPts ); + + for ( var i = 0; i < holes.length; i ++ ) { + + holeIndices.push( holeIndex ); + holeIndex += holes[ i ].length; + addContour( vertices, holes[ i ] ); + + } + + // + + var triangles = Earcut.triangulate( vertices, holeIndices ); + + // + + for ( var i = 0; i < triangles.length; i += 3 ) { + + faces.push( triangles.slice( i, i + 3 ) ); + + } + + return faces; + + } + + }; + + function removeDupEndPts( points ) { + + var l = points.length; + + if ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) { + + points.pop(); + + } + + } + + function addContour( vertices, contour ) { + + for ( var i = 0; i < contour.length; i ++ ) { + + vertices.push( contour[ i ].x ); + vertices.push( contour[ i ].y ); + + } + + } + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + * Creates extruded geometry from a path shape. + * + * parameters = { + * + * curveSegments: , // number of points on the curves + * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too + * depth: , // Depth to extrude the shape + * + * bevelEnabled: , // turn on bevel + * bevelThickness: , // how deep into the original shape bevel goes + * bevelSize: , // how far from shape outline is bevel + * bevelSegments: , // number of bevel layers + * + * extrudePath: // curve to extrude shape along + * + * UVGenerator: // object that provides UV generator functions + * + * } + */ + + // ExtrudeGeometry + + function ExtrudeGeometry( shapes, options ) { + + Geometry.call( this ); + + this.type = 'ExtrudeGeometry'; + + this.parameters = { + shapes: shapes, + options: options + }; + + this.fromBufferGeometry( new ExtrudeBufferGeometry( shapes, options ) ); + this.mergeVertices(); + + } + + ExtrudeGeometry.prototype = Object.create( Geometry.prototype ); + ExtrudeGeometry.prototype.constructor = ExtrudeGeometry; + + ExtrudeGeometry.prototype.toJSON = function () { + + var data = Geometry.prototype.toJSON.call( this ); + + var shapes = this.parameters.shapes; + var options = this.parameters.options; + + return toJSON( shapes, options, data ); + + }; + + // ExtrudeBufferGeometry + + function ExtrudeBufferGeometry( shapes, options ) { + + BufferGeometry.call( this ); + + this.type = 'ExtrudeBufferGeometry'; + + this.parameters = { + shapes: shapes, + options: options + }; + + shapes = Array.isArray( shapes ) ? shapes : [ shapes ]; + + var scope = this; + + var verticesArray = []; + var uvArray = []; + + for ( var i = 0, l = shapes.length; i < l; i ++ ) { + + var shape = shapes[ i ]; + addShape( shape ); + + } + + // build geometry + + this.addAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) ); + + this.computeVertexNormals(); + + // functions + + function addShape( shape ) { + + var placeholder = []; + + // options + + var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12; + var steps = options.steps !== undefined ? options.steps : 1; + var depth = options.depth !== undefined ? options.depth : 100; + + var bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; + var bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; + var bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; + var bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3; + + var extrudePath = options.extrudePath; + + var uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator; + + // deprecated options + + if ( options.amount !== undefined ) { + + console.warn( 'THREE.ExtrudeBufferGeometry: amount has been renamed to depth.' ); + depth = options.amount; + + } + + // + + var extrudePts, extrudeByPath = false; + var splineTube, binormal, normal, position2; + + if ( extrudePath ) { + + extrudePts = extrudePath.getSpacedPoints( steps ); + + extrudeByPath = true; + bevelEnabled = false; // bevels not supported for path extrusion + + // SETUP TNB variables + + // TODO1 - have a .isClosed in spline? + + splineTube = extrudePath.computeFrenetFrames( steps, false ); + + // console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length); + + binormal = new Vector3(); + normal = new Vector3(); + position2 = new Vector3(); + + } + + // Safeguards if bevels are not enabled + + if ( ! bevelEnabled ) { + + bevelSegments = 0; + bevelThickness = 0; + bevelSize = 0; + + } + + // Variables initialization + + var ahole, h, hl; // looping of holes + + var shapePoints = shape.extractPoints( curveSegments ); + + var vertices = shapePoints.shape; + var holes = shapePoints.holes; + + var reverse = ! ShapeUtils.isClockWise( vertices ); + + if ( reverse ) { + + vertices = vertices.reverse(); + + // Maybe we should also check if holes are in the opposite direction, just to be safe ... + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + if ( ShapeUtils.isClockWise( ahole ) ) { + + holes[ h ] = ahole.reverse(); + + } + + } + + } + + + var faces = ShapeUtils.triangulateShape( vertices, holes ); + + /* Vertices */ + + var contour = vertices; // vertices has all points but contour has only points of circumference + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + vertices = vertices.concat( ahole ); + + } + + + function scalePt2( pt, vec, size ) { + + if ( ! vec ) console.error( "THREE.ExtrudeGeometry: vec does not exist" ); + + return vec.clone().multiplyScalar( size ).add( pt ); + + } + + var b, bs, t, z, + vert, vlen = vertices.length, + face, flen = faces.length; + + + // Find directions for point movement + + + function getBevelVec( inPt, inPrev, inNext ) { + + // computes for inPt the corresponding point inPt' on a new contour + // shifted by 1 unit (length of normalized vector) to the left + // if we walk along contour clockwise, this new contour is outside the old one + // + // inPt' is the intersection of the two lines parallel to the two + // adjacent edges of inPt at a distance of 1 unit on the left side. + + var v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt + + // good reading for geometry algorithms (here: line-line intersection) + // http://geomalgorithms.com/a05-_intersect-1.html + + var v_prev_x = inPt.x - inPrev.x, + v_prev_y = inPt.y - inPrev.y; + var v_next_x = inNext.x - inPt.x, + v_next_y = inNext.y - inPt.y; + + var v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y ); + + // check for collinear edges + var collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + if ( Math.abs( collinear0 ) > Number.EPSILON ) { + + // not collinear + + // length of vectors for normalizing + + var v_prev_len = Math.sqrt( v_prev_lensq ); + var v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y ); + + // shift adjacent points by unit vectors to the left + + var ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len ); + var ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len ); + + var ptNextShift_x = ( inNext.x - v_next_y / v_next_len ); + var ptNextShift_y = ( inNext.y + v_next_x / v_next_len ); + + // scaling factor for v_prev to intersection point + + var sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y - + ( ptNextShift_y - ptPrevShift_y ) * v_next_x ) / + ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + // vector from inPt to intersection point + + v_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x ); + v_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y ); + + // Don't normalize!, otherwise sharp corners become ugly + // but prevent crazy spikes + var v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y ); + if ( v_trans_lensq <= 2 ) { + + return new Vector2( v_trans_x, v_trans_y ); + + } else { + + shrink_by = Math.sqrt( v_trans_lensq / 2 ); + + } + + } else { + + // handle special case of collinear edges + + var direction_eq = false; // assumes: opposite + if ( v_prev_x > Number.EPSILON ) { + + if ( v_next_x > Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( v_prev_x < - Number.EPSILON ) { + + if ( v_next_x < - Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) { + + direction_eq = true; + + } + + } + + } + + if ( direction_eq ) { + + // console.log("Warning: lines are a straight sequence"); + v_trans_x = - v_prev_y; + v_trans_y = v_prev_x; + shrink_by = Math.sqrt( v_prev_lensq ); + + } else { + + // console.log("Warning: lines are a straight spike"); + v_trans_x = v_prev_x; + v_trans_y = v_prev_y; + shrink_by = Math.sqrt( v_prev_lensq / 2 ); + + } + + } + + return new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by ); + + } + + + var contourMovements = []; + + for ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + // console.log('i,j,k', i, j , k) + + contourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] ); + + } + + var holesMovements = [], + oneHoleMovements, verticesMovements = contourMovements.concat(); + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + oneHoleMovements = []; + + for ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + oneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] ); + + } + + holesMovements.push( oneHoleMovements ); + verticesMovements = verticesMovements.concat( oneHoleMovements ); + + } + + + // Loop bevelSegments, 1 for the front, 1 for the back + + for ( b = 0; b < bevelSegments; b ++ ) { + + //for ( b = bevelSegments; b > 0; b -- ) { + + t = b / bevelSegments; + z = bevelThickness * Math.cos( t * Math.PI / 2 ); + bs = bevelSize * Math.sin( t * Math.PI / 2 ); + + // contract shape + + for ( i = 0, il = contour.length; i < il; i ++ ) { + + vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + // expand holes + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( i = 0, il = ahole.length; i < il; i ++ ) { + + vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + } + + } + + bs = bevelSize; + + // Back facing vertices + + for ( i = 0; i < vlen; i ++ ) { + + vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, 0 ); + + } else { + + // v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x ); + + normal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + // Add stepped vertices... + // Including front facing vertices + + var s; + + for ( s = 1; s <= steps; s ++ ) { + + for ( i = 0; i < vlen; i ++ ) { + + vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, depth / steps * s ); + + } else { + + // v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x ); + + normal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ s ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + } + + + // Add bevel segments planes + + //for ( b = 1; b <= bevelSegments; b ++ ) { + for ( b = bevelSegments - 1; b >= 0; b -- ) { + + t = b / bevelSegments; + z = bevelThickness * Math.cos( t * Math.PI / 2 ); + bs = bevelSize * Math.sin( t * Math.PI / 2 ); + + // contract shape + + for ( i = 0, il = contour.length; i < il; i ++ ) { + + vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + v( vert.x, vert.y, depth + z ); + + } + + // expand holes + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( i = 0, il = ahole.length; i < il; i ++ ) { + + vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, depth + z ); + + } else { + + v( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z ); + + } + + } + + } + + } + + /* Faces */ + + // Top and bottom faces + + buildLidFaces(); + + // Sides faces + + buildSideFaces(); + + + ///// Internal functions + + function buildLidFaces() { + + var start = verticesArray.length / 3; + + if ( bevelEnabled ) { + + var layer = 0; // steps + 1 + var offset = vlen * layer; + + // Bottom faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset ); + + } + + layer = steps + bevelSegments * 2; + offset = vlen * layer; + + // Top faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset ); + + } + + } else { + + // Bottom faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 2 ], face[ 1 ], face[ 0 ] ); + + } + + // Top faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps ); + + } + + } + + scope.addGroup( start, verticesArray.length / 3 - start, 0 ); + + } + + // Create faces for the z-sides of the shape + + function buildSideFaces() { + + var start = verticesArray.length / 3; + var layeroffset = 0; + sidewalls( contour, layeroffset ); + layeroffset += contour.length; + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + sidewalls( ahole, layeroffset ); + + //, true + layeroffset += ahole.length; + + } + + + scope.addGroup( start, verticesArray.length / 3 - start, 1 ); + + + } + + function sidewalls( contour, layeroffset ) { + + var j, k; + i = contour.length; + + while ( -- i >= 0 ) { + + j = i; + k = i - 1; + if ( k < 0 ) k = contour.length - 1; + + //console.log('b', i,j, i-1, k,vertices.length); + + var s = 0, + sl = steps + bevelSegments * 2; + + for ( s = 0; s < sl; s ++ ) { + + var slen1 = vlen * s; + var slen2 = vlen * ( s + 1 ); + + var a = layeroffset + j + slen1, + b = layeroffset + k + slen1, + c = layeroffset + k + slen2, + d = layeroffset + j + slen2; + + f4( a, b, c, d ); + + } + + } + + } + + function v( x, y, z ) { + + placeholder.push( x ); + placeholder.push( y ); + placeholder.push( z ); + + } + + + function f3( a, b, c ) { + + addVertex( a ); + addVertex( b ); + addVertex( c ); + + var nextIndex = verticesArray.length / 3; + var uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 ); + + addUV( uvs[ 0 ] ); + addUV( uvs[ 1 ] ); + addUV( uvs[ 2 ] ); + + } + + function f4( a, b, c, d ) { + + addVertex( a ); + addVertex( b ); + addVertex( d ); + + addVertex( b ); + addVertex( c ); + addVertex( d ); + + + var nextIndex = verticesArray.length / 3; + var uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 ); + + addUV( uvs[ 0 ] ); + addUV( uvs[ 1 ] ); + addUV( uvs[ 3 ] ); + + addUV( uvs[ 1 ] ); + addUV( uvs[ 2 ] ); + addUV( uvs[ 3 ] ); + + } + + function addVertex( index ) { + + verticesArray.push( placeholder[ index * 3 + 0 ] ); + verticesArray.push( placeholder[ index * 3 + 1 ] ); + verticesArray.push( placeholder[ index * 3 + 2 ] ); + + } + + + function addUV( vector2 ) { + + uvArray.push( vector2.x ); + uvArray.push( vector2.y ); + + } + + } + + } + + ExtrudeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + ExtrudeBufferGeometry.prototype.constructor = ExtrudeBufferGeometry; + + ExtrudeBufferGeometry.prototype.toJSON = function () { + + var data = BufferGeometry.prototype.toJSON.call( this ); + + var shapes = this.parameters.shapes; + var options = this.parameters.options; + + return toJSON( shapes, options, data ); + + }; + + // + + var WorldUVGenerator = { + + generateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) { + + var a_x = vertices[ indexA * 3 ]; + var a_y = vertices[ indexA * 3 + 1 ]; + var b_x = vertices[ indexB * 3 ]; + var b_y = vertices[ indexB * 3 + 1 ]; + var c_x = vertices[ indexC * 3 ]; + var c_y = vertices[ indexC * 3 + 1 ]; + + return [ + new Vector2( a_x, a_y ), + new Vector2( b_x, b_y ), + new Vector2( c_x, c_y ) + ]; + + }, + + generateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) { + + var a_x = vertices[ indexA * 3 ]; + var a_y = vertices[ indexA * 3 + 1 ]; + var a_z = vertices[ indexA * 3 + 2 ]; + var b_x = vertices[ indexB * 3 ]; + var b_y = vertices[ indexB * 3 + 1 ]; + var b_z = vertices[ indexB * 3 + 2 ]; + var c_x = vertices[ indexC * 3 ]; + var c_y = vertices[ indexC * 3 + 1 ]; + var c_z = vertices[ indexC * 3 + 2 ]; + var d_x = vertices[ indexD * 3 ]; + var d_y = vertices[ indexD * 3 + 1 ]; + var d_z = vertices[ indexD * 3 + 2 ]; + + if ( Math.abs( a_y - b_y ) < 0.01 ) { + + return [ + new Vector2( a_x, 1 - a_z ), + new Vector2( b_x, 1 - b_z ), + new Vector2( c_x, 1 - c_z ), + new Vector2( d_x, 1 - d_z ) + ]; + + } else { + + return [ + new Vector2( a_y, 1 - a_z ), + new Vector2( b_y, 1 - b_z ), + new Vector2( c_y, 1 - c_z ), + new Vector2( d_y, 1 - d_z ) + ]; + + } + + } + }; + + function toJSON( shapes, options, data ) { + + // + + data.shapes = []; + + if ( Array.isArray( shapes ) ) { + + for ( var i = 0, l = shapes.length; i < l; i ++ ) { + + var shape = shapes[ i ]; + + data.shapes.push( shape.uuid ); + + } + + } else { + + data.shapes.push( shapes.uuid ); + + } + + // + + if ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON(); + + return data; + + } + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author alteredq / http://alteredqualia.com/ + * + * Text = 3D Text + * + * parameters = { + * font: , // font + * + * size: , // size of the text + * height: , // thickness to extrude text + * curveSegments: , // number of points on the curves + * + * bevelEnabled: , // turn on bevel + * bevelThickness: , // how deep into text bevel goes + * bevelSize: // how far from text outline is bevel + * } + */ + + // TextGeometry + + function TextGeometry( text, parameters ) { + + Geometry.call( this ); + + this.type = 'TextGeometry'; + + this.parameters = { + text: text, + parameters: parameters + }; + + this.fromBufferGeometry( new TextBufferGeometry( text, parameters ) ); + this.mergeVertices(); + + } + + TextGeometry.prototype = Object.create( Geometry.prototype ); + TextGeometry.prototype.constructor = TextGeometry; + + // TextBufferGeometry + + function TextBufferGeometry( text, parameters ) { + + parameters = parameters || {}; + + var font = parameters.font; + + if ( ! ( font && font.isFont ) ) { + + console.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' ); + return new Geometry(); + + } + + var shapes = font.generateShapes( text, parameters.size ); + + // translate parameters to ExtrudeGeometry API + + parameters.depth = parameters.height !== undefined ? parameters.height : 50; + + // defaults + + if ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10; + if ( parameters.bevelSize === undefined ) parameters.bevelSize = 8; + if ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false; + + ExtrudeBufferGeometry.call( this, shapes, parameters ); + + this.type = 'TextBufferGeometry'; + + } + + TextBufferGeometry.prototype = Object.create( ExtrudeBufferGeometry.prototype ); + TextBufferGeometry.prototype.constructor = TextBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author benaadams / https://twitter.com/ben_a_adams + * @author Mugen87 / https://github.com/Mugen87 + */ + + // SphereGeometry + + function SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'SphereGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + SphereGeometry.prototype = Object.create( Geometry.prototype ); + SphereGeometry.prototype.constructor = SphereGeometry; + + // SphereBufferGeometry + + function SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'SphereBufferGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radius = radius || 1; + + widthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 ); + heightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 ); + + phiStart = phiStart !== undefined ? phiStart : 0; + phiLength = phiLength !== undefined ? phiLength : Math.PI * 2; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI; + + var thetaEnd = thetaStart + thetaLength; + + var ix, iy; + + var index = 0; + var grid = []; + + var vertex = new Vector3(); + var normal = new Vector3(); + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // generate vertices, normals and uvs + + for ( iy = 0; iy <= heightSegments; iy ++ ) { + + var verticesRow = []; + + var v = iy / heightSegments; + + for ( ix = 0; ix <= widthSegments; ix ++ ) { + + var 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.set( vertex.x, vertex.y, vertex.z ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, 1 - v ); + + verticesRow.push( index ++ ); + + } + + grid.push( verticesRow ); + + } + + // indices + + for ( iy = 0; iy < heightSegments; iy ++ ) { + + for ( ix = 0; ix < widthSegments; ix ++ ) { + + var a = grid[ iy ][ ix + 1 ]; + var b = grid[ iy ][ ix ]; + var c = grid[ iy + 1 ][ ix ]; + var 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 ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + SphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + SphereBufferGeometry.prototype.constructor = SphereBufferGeometry; + + /** + * @author Kaleb Murphy + * @author Mugen87 / https://github.com/Mugen87 + */ + + // RingGeometry + + function RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'RingGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + RingGeometry.prototype = Object.create( Geometry.prototype ); + RingGeometry.prototype.constructor = RingGeometry; + + // RingBufferGeometry + + function RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'RingBufferGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + innerRadius = innerRadius || 0.5; + outerRadius = outerRadius || 1; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + thetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8; + phiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // some helper variables + + var segment; + var radius = innerRadius; + var radiusStep = ( ( outerRadius - innerRadius ) / phiSegments ); + var vertex = new Vector3(); + var uv = new Vector2(); + var j, i; + + // generate vertices, normals and uvs + + for ( j = 0; j <= phiSegments; j ++ ) { + + for ( i = 0; i <= thetaSegments; i ++ ) { + + // values are generate from the inside of the ring to the outside + + segment = thetaStart + i / thetaSegments * 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 ); + + // uv + + uv.x = ( vertex.x / outerRadius + 1 ) / 2; + uv.y = ( vertex.y / outerRadius + 1 ) / 2; + + uvs.push( uv.x, uv.y ); + + } + + // increase the radius for next row of vertices + + radius += radiusStep; + + } + + // indices + + for ( j = 0; j < phiSegments; j ++ ) { + + var thetaSegmentLevel = j * ( thetaSegments + 1 ); + + for ( i = 0; i < thetaSegments; i ++ ) { + + segment = i + thetaSegmentLevel; + + var a = segment; + var b = segment + thetaSegments + 1; + var c = segment + thetaSegments + 2; + var d = segment + 1; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + RingBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + RingBufferGeometry.prototype.constructor = RingBufferGeometry; + + /** + * @author zz85 / https://github.com/zz85 + * @author bhouston / http://clara.io + * @author Mugen87 / https://github.com/Mugen87 + */ + + // LatheGeometry + + function LatheGeometry( points, segments, phiStart, phiLength ) { + + Geometry.call( this ); + + this.type = 'LatheGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + this.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) ); + this.mergeVertices(); + + } + + LatheGeometry.prototype = Object.create( Geometry.prototype ); + LatheGeometry.prototype.constructor = LatheGeometry; + + // LatheBufferGeometry + + function LatheBufferGeometry( points, segments, phiStart, phiLength ) { + + BufferGeometry.call( this ); + + this.type = 'LatheBufferGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + segments = Math.floor( segments ) || 12; + phiStart = phiStart || 0; + phiLength = phiLength || Math.PI * 2; + + // clamp phiLength so it's in range of [ 0, 2PI ] + + phiLength = _Math.clamp( phiLength, 0, Math.PI * 2 ); + + + // buffers + + var indices = []; + var vertices = []; + var uvs = []; + + // helper variables + + var base; + var inverseSegments = 1.0 / segments; + var vertex = new Vector3(); + var uv = new Vector2(); + var i, j; + + // generate vertices and uvs + + for ( i = 0; i <= segments; i ++ ) { + + var phi = phiStart + i * inverseSegments * phiLength; + + var sin = Math.sin( phi ); + var cos = Math.cos( phi ); + + for ( j = 0; j <= ( points.length - 1 ); j ++ ) { + + // vertex + + vertex.x = points[ j ].x * sin; + vertex.y = points[ j ].y; + vertex.z = points[ j ].x * cos; + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // uv + + uv.x = i / segments; + uv.y = j / ( points.length - 1 ); + + uvs.push( uv.x, uv.y ); + + + } + + } + + // indices + + for ( i = 0; i < segments; i ++ ) { + + for ( j = 0; j < ( points.length - 1 ); j ++ ) { + + base = j + i * points.length; + + var a = base; + var b = base + points.length; + var c = base + points.length + 1; + var d = base + 1; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // generate normals + + this.computeVertexNormals(); + + // if the geometry is closed, we need to average the normals along the seam. + // because the corresponding vertices are identical (but still have different UVs). + + if ( phiLength === Math.PI * 2 ) { + + var normals = this.attributes.normal.array; + var n1 = new Vector3(); + var n2 = new Vector3(); + var n = new Vector3(); + + // this is the buffer offset for the last line of vertices + + base = segments * points.length * 3; + + for ( i = 0, j = 0; i < points.length; i ++, j += 3 ) { + + // select the normal of the vertex in the first line + + n1.x = normals[ j + 0 ]; + n1.y = normals[ j + 1 ]; + n1.z = normals[ j + 2 ]; + + // select the normal of the vertex in the last line + + n2.x = normals[ base + j + 0 ]; + n2.y = normals[ base + j + 1 ]; + n2.z = normals[ base + j + 2 ]; + + // average normals + + n.addVectors( n1, n2 ).normalize(); + + // assign the new values to both normals + + normals[ j + 0 ] = normals[ base + j + 0 ] = n.x; + normals[ j + 1 ] = normals[ base + j + 1 ] = n.y; + normals[ j + 2 ] = normals[ base + j + 2 ] = n.z; + + } + + } + + } + + LatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + LatheBufferGeometry.prototype.constructor = LatheBufferGeometry; + + /** + * @author jonobr1 / http://jonobr1.com + * @author Mugen87 / https://github.com/Mugen87 + */ + + // ShapeGeometry + + function ShapeGeometry( shapes, curveSegments ) { + + Geometry.call( this ); + + this.type = 'ShapeGeometry'; + + if ( typeof curveSegments === 'object' ) { + + console.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' ); + + curveSegments = curveSegments.curveSegments; + + } + + this.parameters = { + shapes: shapes, + curveSegments: curveSegments + }; + + this.fromBufferGeometry( new ShapeBufferGeometry( shapes, curveSegments ) ); + this.mergeVertices(); + + } + + ShapeGeometry.prototype = Object.create( Geometry.prototype ); + ShapeGeometry.prototype.constructor = ShapeGeometry; + + ShapeGeometry.prototype.toJSON = function () { + + var data = Geometry.prototype.toJSON.call( this ); + + var shapes = this.parameters.shapes; + + return toJSON$1( shapes, data ); + + }; + + // ShapeBufferGeometry + + function ShapeBufferGeometry( shapes, curveSegments ) { + + BufferGeometry.call( this ); + + this.type = 'ShapeBufferGeometry'; + + this.parameters = { + shapes: shapes, + curveSegments: curveSegments + }; + + curveSegments = curveSegments || 12; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var groupStart = 0; + var groupCount = 0; + + // allow single and array values for "shapes" parameter + + if ( Array.isArray( shapes ) === false ) { + + addShape( shapes ); + + } else { + + for ( var i = 0; i < shapes.length; i ++ ) { + + addShape( shapes[ i ] ); + + this.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support + + groupStart += groupCount; + groupCount = 0; + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + + // helper functions + + function addShape( shape ) { + + var i, l, shapeHole; + + var indexOffset = vertices.length / 3; + var points = shape.extractPoints( curveSegments ); + + var shapeVertices = points.shape; + var shapeHoles = points.holes; + + // check direction of vertices + + if ( ShapeUtils.isClockWise( shapeVertices ) === false ) { + + shapeVertices = shapeVertices.reverse(); + + // also check if holes are in the opposite direction + + for ( i = 0, l = shapeHoles.length; i < l; i ++ ) { + + shapeHole = shapeHoles[ i ]; + + if ( ShapeUtils.isClockWise( shapeHole ) === true ) { + + shapeHoles[ i ] = shapeHole.reverse(); + + } + + } + + } + + var faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles ); + + // join vertices of inner and outer paths to a single array + + for ( i = 0, l = shapeHoles.length; i < l; i ++ ) { + + shapeHole = shapeHoles[ i ]; + shapeVertices = shapeVertices.concat( shapeHole ); + + } + + // vertices, normals, uvs + + for ( i = 0, l = shapeVertices.length; i < l; i ++ ) { + + var vertex = shapeVertices[ i ]; + + vertices.push( vertex.x, vertex.y, 0 ); + normals.push( 0, 0, 1 ); + uvs.push( vertex.x, vertex.y ); // world uvs + + } + + // incides + + for ( i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + var a = face[ 0 ] + indexOffset; + var b = face[ 1 ] + indexOffset; + var c = face[ 2 ] + indexOffset; + + indices.push( a, b, c ); + groupCount += 3; + + } + + } + + } + + ShapeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + ShapeBufferGeometry.prototype.constructor = ShapeBufferGeometry; + + ShapeBufferGeometry.prototype.toJSON = function () { + + var data = BufferGeometry.prototype.toJSON.call( this ); + + var shapes = this.parameters.shapes; + + return toJSON$1( shapes, data ); + + }; + + // + + function toJSON$1( shapes, data ) { + + data.shapes = []; + + if ( Array.isArray( shapes ) ) { + + for ( var i = 0, l = shapes.length; i < l; i ++ ) { + + var shape = shapes[ i ]; + + data.shapes.push( shape.uuid ); + + } + + } else { + + data.shapes.push( shapes.uuid ); + + } + + return data; + + } + + /** + * @author WestLangley / http://github.com/WestLangley + * @author Mugen87 / https://github.com/Mugen87 + */ + + function EdgesGeometry( geometry, thresholdAngle ) { + + BufferGeometry.call( this ); + + this.type = 'EdgesGeometry'; + + this.parameters = { + thresholdAngle: thresholdAngle + }; + + thresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1; + + // buffer + + var vertices = []; + + // helper variables + + var thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle ); + var edge = [ 0, 0 ], edges = {}, edge1, edge2; + var key, keys = [ 'a', 'b', 'c' ]; + + // prepare source geometry + + var geometry2; + + if ( geometry.isBufferGeometry ) { + + geometry2 = new Geometry(); + geometry2.fromBufferGeometry( geometry ); + + } else { + + geometry2 = geometry.clone(); + + } + + geometry2.mergeVertices(); + geometry2.computeFaceNormals(); + + var sourceVertices = geometry2.vertices; + var faces = geometry2.faces; + + // now create a data structure where each entry represents an edge with its adjoining faces + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0; j < 3; j ++ ) { + + edge1 = face[ keys[ j ] ]; + edge2 = face[ keys[ ( 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; + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + var 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 || faces[ e.face1 ].normal.dot( faces[ e.face2 ].normal ) <= thresholdDot ) { + + var vertex = sourceVertices[ e.index1 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex = sourceVertices[ e.index2 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + // build geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + + } + + EdgesGeometry.prototype = Object.create( BufferGeometry.prototype ); + EdgesGeometry.prototype.constructor = EdgesGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // CylinderGeometry + + function CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'CylinderGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + CylinderGeometry.prototype = Object.create( Geometry.prototype ); + CylinderGeometry.prototype.constructor = CylinderGeometry; + + // CylinderBufferGeometry + + function CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'CylinderBufferGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + var scope = this; + + radiusTop = radiusTop !== undefined ? radiusTop : 1; + radiusBottom = radiusBottom !== undefined ? radiusBottom : 1; + height = height || 1; + + radialSegments = Math.floor( radialSegments ) || 8; + heightSegments = Math.floor( heightSegments ) || 1; + + openEnded = openEnded !== undefined ? openEnded : false; + thetaStart = thetaStart !== undefined ? thetaStart : 0.0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var index = 0; + var indexArray = []; + var halfHeight = height / 2; + var groupStart = 0; + + // generate geometry + + generateTorso(); + + if ( openEnded === false ) { + + if ( radiusTop > 0 ) generateCap( true ); + if ( radiusBottom > 0 ) generateCap( false ); + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + function generateTorso() { + + var x, y; + var normal = new Vector3(); + var vertex = new Vector3(); + + var groupCount = 0; + + // this will be used to calculate the normal + var slope = ( radiusBottom - radiusTop ) / height; + + // generate vertices, normals and uvs + + for ( y = 0; y <= heightSegments; y ++ ) { + + var indexRow = []; + + var v = y / heightSegments; + + // calculate the radius of the current row + + var radius = v * ( radiusBottom - radiusTop ) + radiusTop; + + for ( x = 0; x <= radialSegments; x ++ ) { + + var u = x / radialSegments; + + var theta = u * thetaLength + thetaStart; + + var sinTheta = Math.sin( theta ); + var 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 + + var a = indexArray[ y ][ x ]; + var b = indexArray[ y + 1 ][ x ]; + var c = indexArray[ y + 1 ][ x + 1 ]; + var d = indexArray[ y ][ x + 1 ]; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + // update group counter + + groupCount += 6; + + } + + } + + // 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 ) { + + var x, centerIndexStart, centerIndexEnd; + + var uv = new Vector2(); + var vertex = new Vector3(); + + var groupCount = 0; + + var radius = ( top === true ) ? radiusTop : radiusBottom; + var sign = ( top === true ) ? 1 : - 1; + + // save the index of the first center vertex + centerIndexStart = index; + + // 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 + + centerIndexEnd = index; + + // now we generate the surrounding vertices, normals and uvs + + for ( x = 0; x <= radialSegments; x ++ ) { + + var u = x / radialSegments; + var theta = u * thetaLength + thetaStart; + + var cosTheta = Math.cos( theta ); + var 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 ++ ) { + + var c = centerIndexStart + x; + var 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; + + } + + } + + CylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + CylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry; + + /** + * @author abelnation / http://github.com/abelnation + */ + + // ConeGeometry + + function ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + CylinderGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); + + this.type = 'ConeGeometry'; + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + } + + ConeGeometry.prototype = Object.create( CylinderGeometry.prototype ); + ConeGeometry.prototype.constructor = ConeGeometry; + + // ConeBufferGeometry + + function ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + CylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); + + this.type = 'ConeBufferGeometry'; + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + } + + ConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype ); + ConeBufferGeometry.prototype.constructor = ConeBufferGeometry; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + * @author Mugen87 / https://github.com/Mugen87 + * @author hughes + */ + + // CircleGeometry + + function CircleGeometry( radius, segments, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'CircleGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + CircleGeometry.prototype = Object.create( Geometry.prototype ); + CircleGeometry.prototype.constructor = CircleGeometry; + + // CircleBufferGeometry + + function CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'CircleBufferGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radius = radius || 1; + segments = segments !== undefined ? Math.max( 3, segments ) : 8; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var i, s; + var vertex = new Vector3(); + var uv = new Vector2(); + + // center point + + vertices.push( 0, 0, 0 ); + normals.push( 0, 0, 1 ); + uvs.push( 0.5, 0.5 ); + + for ( s = 0, i = 3; s <= segments; s ++, i += 3 ) { + + var 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 ( i = 1; i <= segments; i ++ ) { + + indices.push( i, i + 1, 0 ); + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + CircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + CircleBufferGeometry.prototype.constructor = CircleBufferGeometry; + + + + var Geometries = /*#__PURE__*/Object.freeze({ + WireframeGeometry: WireframeGeometry, + ParametricGeometry: ParametricGeometry, + ParametricBufferGeometry: ParametricBufferGeometry, + TetrahedronGeometry: TetrahedronGeometry, + TetrahedronBufferGeometry: TetrahedronBufferGeometry, + OctahedronGeometry: OctahedronGeometry, + OctahedronBufferGeometry: OctahedronBufferGeometry, + IcosahedronGeometry: IcosahedronGeometry, + IcosahedronBufferGeometry: IcosahedronBufferGeometry, + DodecahedronGeometry: DodecahedronGeometry, + DodecahedronBufferGeometry: DodecahedronBufferGeometry, + PolyhedronGeometry: PolyhedronGeometry, + PolyhedronBufferGeometry: PolyhedronBufferGeometry, + TubeGeometry: TubeGeometry, + TubeBufferGeometry: TubeBufferGeometry, + TorusKnotGeometry: TorusKnotGeometry, + TorusKnotBufferGeometry: TorusKnotBufferGeometry, + TorusGeometry: TorusGeometry, + TorusBufferGeometry: TorusBufferGeometry, + TextGeometry: TextGeometry, + TextBufferGeometry: TextBufferGeometry, + SphereGeometry: SphereGeometry, + SphereBufferGeometry: SphereBufferGeometry, + RingGeometry: RingGeometry, + RingBufferGeometry: RingBufferGeometry, + PlaneGeometry: PlaneGeometry, + PlaneBufferGeometry: PlaneBufferGeometry, + LatheGeometry: LatheGeometry, + LatheBufferGeometry: LatheBufferGeometry, + ShapeGeometry: ShapeGeometry, + ShapeBufferGeometry: ShapeBufferGeometry, + ExtrudeGeometry: ExtrudeGeometry, + ExtrudeBufferGeometry: ExtrudeBufferGeometry, + EdgesGeometry: EdgesGeometry, + ConeGeometry: ConeGeometry, + ConeBufferGeometry: ConeBufferGeometry, + CylinderGeometry: CylinderGeometry, + CylinderBufferGeometry: CylinderBufferGeometry, + CircleGeometry: CircleGeometry, + CircleBufferGeometry: CircleBufferGeometry, + BoxGeometry: BoxGeometry, + BoxBufferGeometry: BoxBufferGeometry + }); + + /** + * @author mrdoob / http://mrdoob.com/ + * + * parameters = { + * color: + * } + */ + + function ShadowMaterial( parameters ) { + + Material.call( this ); + + this.type = 'ShadowMaterial'; + + this.color = new Color( 0x000000 ); + this.transparent = true; + + this.setValues( parameters ); + + } + + ShadowMaterial.prototype = Object.create( Material.prototype ); + ShadowMaterial.prototype.constructor = ShadowMaterial; + + ShadowMaterial.prototype.isShadowMaterial = true; + + ShadowMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function RawShaderMaterial( parameters ) { + + ShaderMaterial.call( this, parameters ); + + this.type = 'RawShaderMaterial'; + + } + + RawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype ); + RawShaderMaterial.prototype.constructor = RawShaderMaterial; + + RawShaderMaterial.prototype.isRawShaderMaterial = true; + + /** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * color: , + * roughness: , + * metalness: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalMapType: THREE.TangentSpaceNormalMap, + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * roughnessMap: new THREE.Texture( ), + * + * metalnessMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * envMapIntensity: + * + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshStandardMaterial( parameters ) { + + Material.call( this ); + + this.defines = { 'STANDARD': '' }; + + this.type = 'MeshStandardMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.roughness = 0.5; + this.metalness = 0.5; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.roughnessMap = null; + + this.metalnessMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.envMapIntensity = 1.0; + + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshStandardMaterial.prototype = Object.create( Material.prototype ); + MeshStandardMaterial.prototype.constructor = MeshStandardMaterial; + + MeshStandardMaterial.prototype.isMeshStandardMaterial = true; + + MeshStandardMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.defines = { 'STANDARD': '' }; + + this.color.copy( source.color ); + this.roughness = source.roughness; + this.metalness = source.metalness; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.roughnessMap = source.roughnessMap; + + this.metalnessMap = source.metalnessMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.envMapIntensity = source.envMapIntensity; + + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * reflectivity: + * } + */ + + function MeshPhysicalMaterial( parameters ) { + + MeshStandardMaterial.call( this ); + + this.defines = { 'PHYSICAL': '' }; + + this.type = 'MeshPhysicalMaterial'; + + this.reflectivity = 0.5; // maps to F0 = 0.04 + + this.clearCoat = 0.0; + this.clearCoatRoughness = 0.0; + + this.setValues( parameters ); + + } + + MeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype ); + MeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial; + + MeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true; + + MeshPhysicalMaterial.prototype.copy = function ( source ) { + + MeshStandardMaterial.prototype.copy.call( this, source ); + + this.defines = { 'PHYSICAL': '' }; + + this.reflectivity = source.reflectivity; + + this.clearCoat = source.clearCoat; + this.clearCoatRoughness = source.clearCoatRoughness; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * specular: , + * shininess: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalMapType: THREE.TangentSpaceNormalMap, + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshPhongMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshPhongMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.specular = new Color( 0x111111 ); + this.shininess = 30; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshPhongMaterial.prototype = Object.create( Material.prototype ); + MeshPhongMaterial.prototype.constructor = MeshPhongMaterial; + + MeshPhongMaterial.prototype.isMeshPhongMaterial = true; + + MeshPhongMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.specular.copy( source.specular ); + this.shininess = source.shininess; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author takahirox / http://github.com/takahirox + * + * parameters = { + * gradientMap: new THREE.Texture( ) + * } + */ + + function MeshToonMaterial( parameters ) { + + MeshPhongMaterial.call( this ); + + this.defines = { 'TOON': '' }; + + this.type = 'MeshToonMaterial'; + + this.gradientMap = null; + + this.setValues( parameters ); + + } + + MeshToonMaterial.prototype = Object.create( MeshPhongMaterial.prototype ); + MeshToonMaterial.prototype.constructor = MeshToonMaterial; + + MeshToonMaterial.prototype.isMeshToonMaterial = true; + + MeshToonMaterial.prototype.copy = function ( source ) { + + MeshPhongMaterial.prototype.copy.call( this, source ); + + this.gradientMap = source.gradientMap; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * opacity: , + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalMapType: THREE.TangentSpaceNormalMap, + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * wireframe: , + * wireframeLinewidth: + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshNormalMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshNormalMaterial'; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; + this.lights = false; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshNormalMaterial.prototype = Object.create( Material.prototype ); + MeshNormalMaterial.prototype.constructor = MeshNormalMaterial; + + MeshNormalMaterial.prototype.isMeshNormalMaterial = true; + + MeshNormalMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshLambertMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshLambertMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshLambertMaterial.prototype = Object.create( Material.prototype ); + MeshLambertMaterial.prototype.constructor = MeshLambertMaterial; + + MeshLambertMaterial.prototype.isMeshLambertMaterial = true; + + MeshLambertMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * color: , + * opacity: , + * + * matcap: new THREE.Texture( ), + * + * map: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalMapType: THREE.TangentSpaceNormalMap, + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * alphaMap: new THREE.Texture( ), + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshMatcapMaterial( parameters ) { + + Material.call( this ); + + this.defines = { 'MATCAP': '' }; + + this.type = 'MeshMatcapMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + + this.matcap = null; + + this.map = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.alphaMap = null; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.lights = false; + + this.setValues( parameters ); + + // a matcap is required + + if ( this.matcap === null ) { + + var canvas = document.createElement( 'canvas' ); + canvas.width = 1; + canvas.height = 1; + + var context = canvas.getContext( '2d' ); + + context.fillStyle = '#fff'; + context.fillRect( 0, 0, 1, 1 ); + + this.matcap = new THREE.CanvasTexture( canvas ); + + } + + } + + MeshMatcapMaterial.prototype = Object.create( Material.prototype ); + MeshMatcapMaterial.prototype.constructor = MeshMatcapMaterial; + + MeshMatcapMaterial.prototype.isMeshMatcapMaterial = true; + + MeshMatcapMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.defines = { 'MATCAP': '' }; + + this.color.copy( source.color ); + + this.matcap = source.matcap; + + this.map = source.map; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.alphaMap = source.alphaMap; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * linewidth: , + * + * scale: , + * dashSize: , + * gapSize: + * } + */ + + function LineDashedMaterial( parameters ) { + + LineBasicMaterial.call( this ); + + this.type = 'LineDashedMaterial'; + + this.scale = 1; + this.dashSize = 3; + this.gapSize = 1; + + this.setValues( parameters ); + + } + + LineDashedMaterial.prototype = Object.create( LineBasicMaterial.prototype ); + LineDashedMaterial.prototype.constructor = LineDashedMaterial; + + LineDashedMaterial.prototype.isLineDashedMaterial = true; + + LineDashedMaterial.prototype.copy = function ( source ) { + + LineBasicMaterial.prototype.copy.call( this, source ); + + this.scale = source.scale; + this.dashSize = source.dashSize; + this.gapSize = source.gapSize; + + return this; + + }; + + + + var Materials = /*#__PURE__*/Object.freeze({ + ShadowMaterial: ShadowMaterial, + SpriteMaterial: SpriteMaterial, + RawShaderMaterial: RawShaderMaterial, + ShaderMaterial: ShaderMaterial, + PointsMaterial: PointsMaterial, + MeshPhysicalMaterial: MeshPhysicalMaterial, + MeshStandardMaterial: MeshStandardMaterial, + MeshPhongMaterial: MeshPhongMaterial, + MeshToonMaterial: MeshToonMaterial, + MeshNormalMaterial: MeshNormalMaterial, + MeshLambertMaterial: MeshLambertMaterial, + MeshDepthMaterial: MeshDepthMaterial, + MeshDistanceMaterial: MeshDistanceMaterial, + MeshBasicMaterial: MeshBasicMaterial, + MeshMatcapMaterial: MeshMatcapMaterial, + LineDashedMaterial: LineDashedMaterial, + LineBasicMaterial: LineBasicMaterial, + Material: Material + }); + + /** + * @author tschw + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + + var AnimationUtils = { + + // same as Array.prototype.slice, but also works on typed arrays + arraySlice: function ( array, from, to ) { + + if ( AnimationUtils.isTypedArray( array ) ) { + + // in ios9 array.subarray(from, undefined) will return empty array + // but array.subarray(from) or array.subarray(from, len) is correct + return new array.constructor( array.subarray( from, to !== undefined ? to : array.length ) ); + + } + + return array.slice( from, to ); + + }, + + // converts an array to a specific type + convertArray: function ( array, type, forceClone ) { + + if ( ! array || // let 'undefined' and 'null' pass + ! forceClone && array.constructor === type ) return array; + + if ( typeof type.BYTES_PER_ELEMENT === 'number' ) { + + return new type( array ); // create typed array + + } + + return Array.prototype.slice.call( array ); // create Array + + }, + + isTypedArray: function ( object ) { + + return ArrayBuffer.isView( object ) && + ! ( object instanceof DataView ); + + }, + + // returns an array by which times and values can be sorted + getKeyframeOrder: function ( times ) { + + function compareTime( i, j ) { + + return times[ i ] - times[ j ]; + + } + + var n = times.length; + var result = new Array( n ); + for ( var i = 0; i !== n; ++ i ) result[ i ] = i; + + result.sort( compareTime ); + + return result; + + }, + + // uses the array previously returned by 'getKeyframeOrder' to sort data + sortedArray: function ( values, stride, order ) { + + var nValues = values.length; + var result = new values.constructor( nValues ); + + for ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) { + + var srcOffset = order[ i ] * stride; + + for ( var j = 0; j !== stride; ++ j ) { + + result[ dstOffset ++ ] = values[ srcOffset + j ]; + + } + + } + + return result; + + }, + + // function for parsing AOS keyframe formats + flattenJSON: function ( jsonKeys, times, values, valuePropertyName ) { + + var i = 1, key = jsonKeys[ 0 ]; + + while ( key !== undefined && key[ valuePropertyName ] === undefined ) { + + key = jsonKeys[ i ++ ]; + + } + + if ( key === undefined ) return; // no data + + var value = key[ valuePropertyName ]; + if ( value === undefined ) return; // no data + + if ( Array.isArray( value ) ) { + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push.apply( values, value ); // push all elements + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else if ( value.toArray !== undefined ) { + + // ...assume THREE.Math-ish + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + value.toArray( values, values.length ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else { + + // otherwise push as-is + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push( value ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } + + } + + }; + + /** + * Abstract base class of interpolants over parametric samples. + * + * The parameter domain is one dimensional, typically the time or a path + * along a curve defined by the data. + * + * The sample values can have any dimensionality and derived classes may + * apply special interpretations to the data. + * + * This class provides the interval seek in a Template Method, deferring + * the actual interpolation to derived classes. + * + * Time complexity is O(1) for linear access crossing at most two points + * and O(log N) for random access, where N is the number of positions. + * + * References: + * + * http://www.oodesign.com/template-method-pattern.html + * + * @author tschw + */ + + function Interpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + this.parameterPositions = parameterPositions; + this._cachedIndex = 0; + + this.resultBuffer = resultBuffer !== undefined ? + resultBuffer : new sampleValues.constructor( sampleSize ); + this.sampleValues = sampleValues; + this.valueSize = sampleSize; + + } + + Object.assign( Interpolant.prototype, { + + evaluate: function ( t ) { + + var pp = this.parameterPositions, + i1 = this._cachedIndex, + + t1 = pp[ i1 ], + t0 = pp[ i1 - 1 ]; + + validate_interval: { + + seek: { + + var right; + + linear_scan: { + + //- See http://jsperf.com/comparison-to-undefined/3 + //- slower code: + //- + //- if ( t >= t1 || t1 === undefined ) { + forward_scan: if ( ! ( t < t1 ) ) { + + for ( var giveUpAt = i1 + 2; ; ) { + + if ( t1 === undefined ) { + + if ( t < t0 ) break forward_scan; + + // after end + + i1 = pp.length; + this._cachedIndex = i1; + return this.afterEnd_( i1 - 1, t, t0 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t0 = t1; + t1 = pp[ ++ i1 ]; + + if ( t < t1 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the right side of the index + right = pp.length; + break linear_scan; + + } + + //- slower code: + //- if ( t < t0 || t0 === undefined ) { + if ( ! ( t >= t0 ) ) { + + // looping? + + var t1global = pp[ 1 ]; + + if ( t < t1global ) { + + i1 = 2; // + 1, using the scan for the details + t0 = t1global; + + } + + // linear reverse scan + + for ( var giveUpAt = i1 - 2; ; ) { + + if ( t0 === undefined ) { + + // before start + + this._cachedIndex = 0; + return this.beforeStart_( 0, t, t1 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t1 = t0; + t0 = pp[ -- i1 - 1 ]; + + if ( t >= t0 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the left side of the index + right = i1; + i1 = 0; + break linear_scan; + + } + + // the interval is valid + + break validate_interval; + + } // linear scan + + // binary search + + while ( i1 < right ) { + + var mid = ( i1 + right ) >>> 1; + + if ( t < pp[ mid ] ) { + + right = mid; + + } else { + + i1 = mid + 1; + + } + + } + + t1 = pp[ i1 ]; + t0 = pp[ i1 - 1 ]; + + // check boundary cases, again + + if ( t0 === undefined ) { + + this._cachedIndex = 0; + return this.beforeStart_( 0, t, t1 ); + + } + + if ( t1 === undefined ) { + + i1 = pp.length; + this._cachedIndex = i1; + return this.afterEnd_( i1 - 1, t0, t ); + + } + + } // seek + + this._cachedIndex = i1; + + this.intervalChanged_( i1, t0, t1 ); + + } // validate_interval + + return this.interpolate_( i1, t0, t, t1 ); + + }, + + settings: null, // optional, subclass-specific settings structure + // Note: The indirection allows central control of many interpolants. + + // --- Protected interface + + DefaultSettings_: {}, + + getSettings_: function () { + + return this.settings || this.DefaultSettings_; + + }, + + copySampleValue_: function ( index ) { + + // copies a sample value to the result buffer + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + offset = index * stride; + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = values[ offset + i ]; + + } + + return result; + + }, + + // Template methods for derived classes: + + interpolate_: function ( /* i1, t0, t, t1 */ ) { + + throw new Error( 'call to abstract method' ); + // implementations shall return this.resultBuffer + + }, + + intervalChanged_: function ( /* i1, t0, t1 */ ) { + + // empty + + } + + } ); + + //!\ DECLARE ALIAS AFTER assign prototype ! + Object.assign( Interpolant.prototype, { + + //( 0, t, t0 ), returns this.resultBuffer + beforeStart_: Interpolant.prototype.copySampleValue_, + + //( N-1, tN-1, t ), returns this.resultBuffer + afterEnd_: Interpolant.prototype.copySampleValue_, + + } ); + + /** + * Fast and simple cubic spline interpolant. + * + * It was derived from a Hermitian construction setting the first derivative + * at each sample position to the linear slope between neighboring positions + * over their parameter interval. + * + * @author tschw + */ + + function CubicInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + this._weightPrev = - 0; + this._offsetPrev = - 0; + this._weightNext = - 0; + this._offsetNext = - 0; + + } + + CubicInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: CubicInterpolant, + + DefaultSettings_: { + + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + + }, + + intervalChanged_: function ( i1, t0, t1 ) { + + var pp = this.parameterPositions, + iPrev = i1 - 2, + iNext = i1 + 1, + + tPrev = pp[ iPrev ], + tNext = pp[ iNext ]; + + if ( tPrev === undefined ) { + + switch ( this.getSettings_().endingStart ) { + + case ZeroSlopeEnding: + + // f'(t0) = 0 + iPrev = i1; + tPrev = 2 * t0 - t1; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iPrev = pp.length - 2; + tPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(t0) = 0 a.k.a. Natural Spline + iPrev = i1; + tPrev = t1; + + } + + } + + if ( tNext === undefined ) { + + switch ( this.getSettings_().endingEnd ) { + + case ZeroSlopeEnding: + + // f'(tN) = 0 + iNext = i1; + tNext = 2 * t1 - t0; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iNext = 1; + tNext = t1 + pp[ 1 ] - pp[ 0 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(tN) = 0, a.k.a. Natural Spline + iNext = i1 - 1; + tNext = t0; + + } + + } + + var halfDt = ( t1 - t0 ) * 0.5, + stride = this.valueSize; + + this._weightPrev = halfDt / ( t0 - tPrev ); + this._weightNext = halfDt / ( tNext - t1 ); + this._offsetPrev = iPrev * stride; + this._offsetNext = iNext * stride; + + }, + + interpolate_: function ( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + o1 = i1 * stride, o0 = o1 - stride, + oP = this._offsetPrev, oN = this._offsetNext, + wP = this._weightPrev, wN = this._weightNext, + + p = ( t - t0 ) / ( t1 - t0 ), + pp = p * p, + ppp = pp * p; + + // evaluate polynomials + + var sP = - wP * ppp + 2 * wP * pp - wP * p; + var s0 = ( 1 + wP ) * ppp + ( - 1.5 - 2 * wP ) * pp + ( - 0.5 + wP ) * p + 1; + var s1 = ( - 1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p; + var sN = wN * ppp - wN * pp; + + // combine data linearly + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = + sP * values[ oP + i ] + + s0 * values[ o0 + i ] + + s1 * values[ o1 + i ] + + sN * values[ oN + i ]; + + } + + return result; + + } + + } ); + + /** + * @author tschw + */ + + function LinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + LinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: LinearInterpolant, + + interpolate_: function ( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + offset1 = i1 * stride, + offset0 = offset1 - stride, + + weight1 = ( t - t0 ) / ( t1 - t0 ), + weight0 = 1 - weight1; + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = + values[ offset0 + i ] * weight0 + + values[ offset1 + i ] * weight1; + + } + + return result; + + } + + } ); + + /** + * + * Interpolant that evaluates to the sample value at the position preceeding + * the parameter. + * + * @author tschw + */ + + function DiscreteInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + DiscreteInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: DiscreteInterpolant, + + interpolate_: function ( i1 /*, t0, t, t1 */ ) { + + return this.copySampleValue_( i1 - 1 ); + + } + + } ); + + /** + * + * A timed sequence of keyframes for a specific property. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function KeyframeTrack( name, times, values, interpolation ) { + + if ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' ); + if ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name ); + + this.name = name; + + this.times = AnimationUtils.convertArray( times, this.TimeBufferType ); + this.values = AnimationUtils.convertArray( values, this.ValueBufferType ); + + this.setInterpolation( interpolation || this.DefaultInterpolation ); + + } + + // Static methods + + Object.assign( KeyframeTrack, { + + // Serialization (in static context, because of constructor invocation + // and automatic invocation of .toJSON): + + toJSON: function ( track ) { + + var trackType = track.constructor; + + var json; + + // derived classes can define a static toJSON method + if ( trackType.toJSON !== undefined ) { + + json = trackType.toJSON( track ); + + } else { + + // by default, we assume the data can be serialized as-is + json = { + + 'name': track.name, + 'times': AnimationUtils.convertArray( track.times, Array ), + 'values': AnimationUtils.convertArray( track.values, Array ) + + }; + + var interpolation = track.getInterpolation(); + + if ( interpolation !== track.DefaultInterpolation ) { + + json.interpolation = interpolation; + + } + + } + + json.type = track.ValueTypeName; // mandatory + + return json; + + } + + } ); + + Object.assign( KeyframeTrack.prototype, { + + constructor: KeyframeTrack, + + TimeBufferType: Float32Array, + + ValueBufferType: Float32Array, + + DefaultInterpolation: InterpolateLinear, + + InterpolantFactoryMethodDiscrete: function ( result ) { + + return new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodLinear: function ( result ) { + + return new LinearInterpolant( this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodSmooth: function ( result ) { + + return new CubicInterpolant( this.times, this.values, this.getValueSize(), result ); + + }, + + setInterpolation: function ( interpolation ) { + + var factoryMethod; + + switch ( interpolation ) { + + case InterpolateDiscrete: + + factoryMethod = this.InterpolantFactoryMethodDiscrete; + + break; + + case InterpolateLinear: + + factoryMethod = this.InterpolantFactoryMethodLinear; + + break; + + case InterpolateSmooth: + + factoryMethod = this.InterpolantFactoryMethodSmooth; + + break; + + } + + if ( factoryMethod === undefined ) { + + var message = "unsupported interpolation for " + + this.ValueTypeName + " keyframe track named " + this.name; + + if ( this.createInterpolant === undefined ) { + + // fall back to default, unless the default itself is messed up + if ( interpolation !== this.DefaultInterpolation ) { + + this.setInterpolation( this.DefaultInterpolation ); + + } else { + + throw new Error( message ); // fatal, in this case + + } + + } + + console.warn( 'THREE.KeyframeTrack:', message ); + return this; + + } + + this.createInterpolant = factoryMethod; + + return this; + + }, + + getInterpolation: function () { + + switch ( this.createInterpolant ) { + + case this.InterpolantFactoryMethodDiscrete: + + return InterpolateDiscrete; + + case this.InterpolantFactoryMethodLinear: + + return InterpolateLinear; + + case this.InterpolantFactoryMethodSmooth: + + return InterpolateSmooth; + + } + + }, + + getValueSize: function () { + + return this.values.length / this.times.length; + + }, + + // move all keyframes either forwards or backwards in time + shift: function ( timeOffset ) { + + if ( timeOffset !== 0.0 ) { + + var times = this.times; + + for ( var i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] += timeOffset; + + } + + } + + return this; + + }, + + // scale all keyframe times by a factor (useful for frame <-> seconds conversions) + scale: function ( timeScale ) { + + if ( timeScale !== 1.0 ) { + + var times = this.times; + + for ( var i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] *= timeScale; + + } + + } + + return this; + + }, + + // removes keyframes before and after animation without changing any values within the range [startTime, endTime]. + // IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values + trim: function ( startTime, endTime ) { + + var times = this.times, + nKeys = times.length, + from = 0, + to = nKeys - 1; + + while ( from !== nKeys && times[ from ] < startTime ) { + + ++ from; + + } + + while ( to !== - 1 && times[ to ] > endTime ) { + + -- to; + + } + + ++ to; // inclusive -> exclusive bound + + if ( from !== 0 || to !== nKeys ) { + + // empty tracks are forbidden, so keep at least one keyframe + if ( from >= to ) to = Math.max( to, 1 ), from = to - 1; + + var stride = this.getValueSize(); + this.times = AnimationUtils.arraySlice( times, from, to ); + this.values = AnimationUtils.arraySlice( this.values, from * stride, to * stride ); + + } + + return this; + + }, + + // ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable + validate: function () { + + var valid = true; + + var valueSize = this.getValueSize(); + if ( valueSize - Math.floor( valueSize ) !== 0 ) { + + console.error( 'THREE.KeyframeTrack: Invalid value size in track.', this ); + valid = false; + + } + + var times = this.times, + values = this.values, + + nKeys = times.length; + + if ( nKeys === 0 ) { + + console.error( 'THREE.KeyframeTrack: Track is empty.', this ); + valid = false; + + } + + var prevTime = null; + + for ( var i = 0; i !== nKeys; i ++ ) { + + var currTime = times[ i ]; + + if ( typeof currTime === 'number' && isNaN( currTime ) ) { + + console.error( 'THREE.KeyframeTrack: Time is not a valid number.', this, i, currTime ); + valid = false; + break; + + } + + if ( prevTime !== null && prevTime > currTime ) { + + console.error( 'THREE.KeyframeTrack: Out of order keys.', this, i, currTime, prevTime ); + valid = false; + break; + + } + + prevTime = currTime; + + } + + if ( values !== undefined ) { + + if ( AnimationUtils.isTypedArray( values ) ) { + + for ( var i = 0, n = values.length; i !== n; ++ i ) { + + var value = values[ i ]; + + if ( isNaN( value ) ) { + + console.error( 'THREE.KeyframeTrack: Value is not a valid number.', this, i, value ); + valid = false; + break; + + } + + } + + } + + } + + return valid; + + }, + + // removes equivalent sequential keys as common in morph target sequences + // (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0) + optimize: function () { + + var times = this.times, + values = this.values, + stride = this.getValueSize(), + + smoothInterpolation = this.getInterpolation() === InterpolateSmooth, + + writeIndex = 1, + lastIndex = times.length - 1; + + for ( var i = 1; i < lastIndex; ++ i ) { + + var keep = false; + + var time = times[ i ]; + var timeNext = times[ i + 1 ]; + + // remove adjacent keyframes scheduled at the same time + + if ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) { + + if ( ! smoothInterpolation ) { + + // remove unnecessary keyframes same as their neighbors + + var offset = i * stride, + offsetP = offset - stride, + offsetN = offset + stride; + + for ( var j = 0; j !== stride; ++ j ) { + + var value = values[ offset + j ]; + + if ( value !== values[ offsetP + j ] || + value !== values[ offsetN + j ] ) { + + keep = true; + break; + + } + + } + + } else { + + keep = true; + + } + + } + + // in-place compaction + + if ( keep ) { + + if ( i !== writeIndex ) { + + times[ writeIndex ] = times[ i ]; + + var readOffset = i * stride, + writeOffset = writeIndex * stride; + + for ( var j = 0; j !== stride; ++ j ) { + + values[ writeOffset + j ] = values[ readOffset + j ]; + + } + + } + + ++ writeIndex; + + } + + } + + // flush last keyframe (compaction looks ahead) + + if ( lastIndex > 0 ) { + + times[ writeIndex ] = times[ lastIndex ]; + + for ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) { + + values[ writeOffset + j ] = values[ readOffset + j ]; + + } + + ++ writeIndex; + + } + + if ( writeIndex !== times.length ) { + + this.times = AnimationUtils.arraySlice( times, 0, writeIndex ); + this.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride ); + + } + + return this; + + } + + } ); + + /** + * + * A Track of Boolean keyframe values. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function BooleanKeyframeTrack( name, times, values ) { + + KeyframeTrack.call( this, name, times, values ); + + } + + BooleanKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: BooleanKeyframeTrack, + + ValueTypeName: 'bool', + ValueBufferType: Array, + + DefaultInterpolation: InterpolateDiscrete, + + InterpolantFactoryMethodLinear: undefined, + InterpolantFactoryMethodSmooth: undefined + + // Note: Actually this track could have a optimized / compressed + // representation of a single value and a custom interpolant that + // computes "firstValue ^ isOdd( index )". + + } ); + + /** + * + * A Track of keyframe values that represent color. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function ColorKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + + } + + ColorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: ColorKeyframeTrack, + + ValueTypeName: 'color' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + // Note: Very basic implementation and nothing special yet. + // However, this is the place for color space parameterization. + + } ); + + /** + * + * A Track of numeric keyframe values. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function NumberKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + + } + + NumberKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: NumberKeyframeTrack, + + ValueTypeName: 'number' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + } ); + + /** + * Spherical linear unit quaternion interpolant. + * + * @author tschw + */ + + function QuaternionLinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + QuaternionLinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: QuaternionLinearInterpolant, + + interpolate_: function ( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + offset = i1 * stride, + + alpha = ( t - t0 ) / ( t1 - t0 ); + + for ( var end = offset + stride; offset !== end; offset += 4 ) { + + Quaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha ); + + } + + return result; + + } + + } ); + + /** + * + * A Track of quaternion keyframe values. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function QuaternionKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + + } + + QuaternionKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: QuaternionKeyframeTrack, + + ValueTypeName: 'quaternion', + + // ValueBufferType is inherited + + DefaultInterpolation: InterpolateLinear, + + InterpolantFactoryMethodLinear: function ( result ) { + + return new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodSmooth: undefined // not yet implemented + + } ); + + /** + * + * A Track that interpolates Strings + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function StringKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + + } + + StringKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: StringKeyframeTrack, + + ValueTypeName: 'string', + ValueBufferType: Array, + + DefaultInterpolation: InterpolateDiscrete, + + InterpolantFactoryMethodLinear: undefined, + + InterpolantFactoryMethodSmooth: undefined + + } ); + + /** + * + * A Track of vectored keyframe values. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function VectorKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + + } + + VectorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: VectorKeyframeTrack, + + ValueTypeName: 'vector' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + } ); + + /** + * + * Reusable set of Tracks that represent an animation. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + + function AnimationClip( name, duration, tracks ) { + + this.name = name; + this.tracks = tracks; + this.duration = ( duration !== undefined ) ? duration : - 1; + + this.uuid = _Math.generateUUID(); + + // this means it should figure out its duration by scanning the tracks + if ( this.duration < 0 ) { + + this.resetDuration(); + + } + + } + + function getTrackTypeForValueTypeName( typeName ) { + + switch ( typeName.toLowerCase() ) { + + case 'scalar': + case 'double': + case 'float': + case 'number': + case 'integer': + + return NumberKeyframeTrack; + + case 'vector': + case 'vector2': + case 'vector3': + case 'vector4': + + return VectorKeyframeTrack; + + case 'color': + + return ColorKeyframeTrack; + + case 'quaternion': + + return QuaternionKeyframeTrack; + + case 'bool': + case 'boolean': + + return BooleanKeyframeTrack; + + case 'string': + + return StringKeyframeTrack; + + } + + throw new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName ); + + } + + function parseKeyframeTrack( json ) { + + if ( json.type === undefined ) { + + throw new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' ); + + } + + var trackType = getTrackTypeForValueTypeName( json.type ); + + if ( json.times === undefined ) { + + var times = [], values = []; + + AnimationUtils.flattenJSON( json.keys, times, values, 'value' ); + + json.times = times; + json.values = values; + + } + + // derived classes can define a static parse method + if ( trackType.parse !== undefined ) { + + return trackType.parse( json ); + + } else { + + // by default, we assume a constructor compatible with the base + return new trackType( json.name, json.times, json.values, json.interpolation ); + + } + + } + + Object.assign( AnimationClip, { + + parse: function ( json ) { + + var tracks = [], + jsonTracks = json.tracks, + frameTime = 1.0 / ( json.fps || 1.0 ); + + for ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) { + + tracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) ); + + } + + return new AnimationClip( json.name, json.duration, tracks ); + + }, + + toJSON: function ( clip ) { + + var tracks = [], + clipTracks = clip.tracks; + + var json = { + + 'name': clip.name, + 'duration': clip.duration, + 'tracks': tracks, + 'uuid': clip.uuid + + }; + + for ( var i = 0, n = clipTracks.length; i !== n; ++ i ) { + + tracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) ); + + } + + return json; + + }, + + CreateFromMorphTargetSequence: function ( name, morphTargetSequence, fps, noLoop ) { + + var numMorphTargets = morphTargetSequence.length; + var tracks = []; + + for ( var i = 0; i < numMorphTargets; i ++ ) { + + var times = []; + var values = []; + + times.push( + ( i + numMorphTargets - 1 ) % numMorphTargets, + i, + ( i + 1 ) % numMorphTargets ); + + values.push( 0, 1, 0 ); + + var order = AnimationUtils.getKeyframeOrder( times ); + times = AnimationUtils.sortedArray( times, 1, order ); + values = AnimationUtils.sortedArray( values, 1, order ); + + // if there is a key at the first frame, duplicate it as the + // last frame as well for perfect loop. + if ( ! noLoop && times[ 0 ] === 0 ) { + + times.push( numMorphTargets ); + values.push( values[ 0 ] ); + + } + + tracks.push( + new NumberKeyframeTrack( + '.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']', + times, values + ).scale( 1.0 / fps ) ); + + } + + return new AnimationClip( name, - 1, tracks ); + + }, + + findByName: function ( objectOrClipArray, name ) { + + var clipArray = objectOrClipArray; + + if ( ! Array.isArray( objectOrClipArray ) ) { + + var o = objectOrClipArray; + clipArray = o.geometry && o.geometry.animations || o.animations; + + } + + for ( var i = 0; i < clipArray.length; i ++ ) { + + if ( clipArray[ i ].name === name ) { + + return clipArray[ i ]; + + } + + } + + return null; + + }, + + CreateClipsFromMorphTargetSequences: function ( morphTargets, fps, noLoop ) { + + var animationToMorphTargets = {}; + + // tested with https://regex101.com/ on trick sequences + // such flamingo_flyA_003, flamingo_run1_003, crdeath0059 + var pattern = /^([\w-]*?)([\d]+)$/; + + // sort morph target names into animation groups based + // patterns like Walk_001, Walk_002, Run_001, Run_002 + for ( var i = 0, il = morphTargets.length; i < il; i ++ ) { + + var morphTarget = morphTargets[ i ]; + var parts = morphTarget.name.match( pattern ); + + if ( parts && parts.length > 1 ) { + + var name = parts[ 1 ]; + + var animationMorphTargets = animationToMorphTargets[ name ]; + if ( ! animationMorphTargets ) { + + animationToMorphTargets[ name ] = animationMorphTargets = []; + + } + + animationMorphTargets.push( morphTarget ); + + } + + } + + var clips = []; + + for ( var name in animationToMorphTargets ) { + + clips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) ); + + } + + return clips; + + }, + + // parse the animation.hierarchy format + parseAnimation: function ( animation, bones ) { + + if ( ! animation ) { + + console.error( 'THREE.AnimationClip: No animation in JSONLoader data.' ); + return null; + + } + + var addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) { + + // only return track if there are actually keys. + if ( animationKeys.length !== 0 ) { + + var times = []; + var values = []; + + AnimationUtils.flattenJSON( animationKeys, times, values, propertyName ); + + // empty keys are filtered out, so check again + if ( times.length !== 0 ) { + + destTracks.push( new trackType( trackName, times, values ) ); + + } + + } + + }; + + var tracks = []; + + var clipName = animation.name || 'default'; + // automatic length determination in AnimationClip. + var duration = animation.length || - 1; + var fps = animation.fps || 30; + + var hierarchyTracks = animation.hierarchy || []; + + for ( var h = 0; h < hierarchyTracks.length; h ++ ) { + + var animationKeys = hierarchyTracks[ h ].keys; + + // skip empty tracks + if ( ! animationKeys || animationKeys.length === 0 ) continue; + + // process morph targets + if ( animationKeys[ 0 ].morphTargets ) { + + // figure out all morph targets used in this track + var morphTargetNames = {}; + + for ( var k = 0; k < animationKeys.length; k ++ ) { + + if ( animationKeys[ k ].morphTargets ) { + + for ( var m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) { + + morphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1; + + } + + } + + } + + // create a track for each morph target with all zero + // morphTargetInfluences except for the keys in which + // the morphTarget is named. + for ( var morphTargetName in morphTargetNames ) { + + var times = []; + var values = []; + + for ( var m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) { + + var animationKey = animationKeys[ k ]; + + times.push( animationKey.time ); + values.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 ); + + } + + tracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) ); + + } + + duration = morphTargetNames.length * ( fps || 1.0 ); + + } else { + + // ...assume skeletal animation + + var boneName = '.bones[' + bones[ h ].name + ']'; + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.position', + animationKeys, 'pos', tracks ); + + addNonemptyTrack( + QuaternionKeyframeTrack, boneName + '.quaternion', + animationKeys, 'rot', tracks ); + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.scale', + animationKeys, 'scl', tracks ); + + } + + } + + if ( tracks.length === 0 ) { + + return null; + + } + + var clip = new AnimationClip( clipName, duration, tracks ); + + return clip; + + } + + } ); + + Object.assign( AnimationClip.prototype, { + + resetDuration: function () { + + var tracks = this.tracks, duration = 0; + + for ( var i = 0, n = tracks.length; i !== n; ++ i ) { + + var track = this.tracks[ i ]; + + duration = Math.max( duration, track.times[ track.times.length - 1 ] ); + + } + + this.duration = duration; + + return this; + + }, + + trim: function () { + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].trim( 0, this.duration ); + + } + + return this; + + }, + + validate: function () { + + var valid = true; + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + valid = valid && this.tracks[ i ].validate(); + + } + + return valid; + + }, + + optimize: function () { + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].optimize(); + + } + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var Cache = { + + enabled: false, + + files: {}, + + add: function ( key, file ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Adding key:', key ); + + this.files[ key ] = file; + + }, + + get: function ( key ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Checking key:', key ); + + return this.files[ key ]; + + }, + + remove: function ( key ) { + + delete this.files[ key ]; + + }, + + clear: function () { + + this.files = {}; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LoadingManager( onLoad, onProgress, onError ) { + + var scope = this; + + var isLoading = false; + var itemsLoaded = 0; + var itemsTotal = 0; + var urlModifier = undefined; + + // Refer to #5689 for the reason why we don't set .onStart + // in the constructor + + this.onStart = undefined; + this.onLoad = onLoad; + this.onProgress = onProgress; + this.onError = onError; + + this.itemStart = function ( url ) { + + itemsTotal ++; + + if ( isLoading === false ) { + + if ( scope.onStart !== undefined ) { + + scope.onStart( url, itemsLoaded, itemsTotal ); + + } + + } + + isLoading = true; + + }; + + this.itemEnd = function ( url ) { + + itemsLoaded ++; + + if ( scope.onProgress !== undefined ) { + + scope.onProgress( url, itemsLoaded, itemsTotal ); + + } + + if ( itemsLoaded === itemsTotal ) { + + isLoading = false; + + if ( scope.onLoad !== undefined ) { + + scope.onLoad(); + + } + + } + + }; + + this.itemError = function ( url ) { + + if ( scope.onError !== undefined ) { + + scope.onError( url ); + + } + + }; + + this.resolveURL = function ( url ) { + + if ( urlModifier ) { + + return urlModifier( url ); + + } + + return url; + + }; + + this.setURLModifier = function ( transform ) { + + urlModifier = transform; + return this; + + }; + + } + + var DefaultLoadingManager = new LoadingManager(); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var loading = {}; + + function FileLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( FileLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + url = this.manager.resolveURL( url ); + + var scope = this; + + var cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + // Check if request is duplicate + + if ( loading[ url ] !== undefined ) { + + loading[ url ].push( { + + onLoad: onLoad, + onProgress: onProgress, + onError: onError + + } ); + + return; + + } + + // Check for data: URI + var dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/; + var dataUriRegexResult = url.match( dataUriRegex ); + + // Safari can not handle Data URIs through XMLHttpRequest so process manually + if ( dataUriRegexResult ) { + + var mimeType = dataUriRegexResult[ 1 ]; + var isBase64 = !! dataUriRegexResult[ 2 ]; + var data = dataUriRegexResult[ 3 ]; + + data = decodeURIComponent( data ); + + if ( isBase64 ) data = atob( data ); + + try { + + var response; + var responseType = ( this.responseType || '' ).toLowerCase(); + + switch ( responseType ) { + + case 'arraybuffer': + case 'blob': + + var view = new Uint8Array( data.length ); + + for ( var i = 0; i < data.length; i ++ ) { + + view[ i ] = data.charCodeAt( i ); + + } + + if ( responseType === 'blob' ) { + + response = new Blob( [ view.buffer ], { type: mimeType } ); + + } else { + + response = view.buffer; + + } + + break; + + case 'document': + + var parser = new DOMParser(); + response = parser.parseFromString( data, mimeType ); + + break; + + case 'json': + + response = JSON.parse( data ); + + break; + + default: // 'text' or other + + response = data; + + break; + + } + + // Wait for next browser tick like standard XMLHttpRequest event dispatching does + setTimeout( function () { + + if ( onLoad ) onLoad( response ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + } catch ( error ) { + + // Wait for next browser tick like standard XMLHttpRequest event dispatching does + setTimeout( function () { + + if ( onError ) onError( error ); + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + }, 0 ); + + } + + } else { + + // Initialise array for duplicate requests + + loading[ url ] = []; + + loading[ url ].push( { + + onLoad: onLoad, + onProgress: onProgress, + onError: onError + + } ); + + var request = new XMLHttpRequest(); + + request.open( 'GET', url, true ); + + request.addEventListener( 'load', function ( event ) { + + var response = this.response; + + Cache.add( url, response ); + + var callbacks = loading[ url ]; + + delete loading[ url ]; + + if ( this.status === 200 || this.status === 0 ) { + + // Some browsers return HTTP Status 0 when using non-http protocol + // e.g. 'file://' or 'data://'. Handle as success. + + if ( this.status === 0 ) console.warn( 'THREE.FileLoader: HTTP Status 0 received.' ); + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onLoad ) callback.onLoad( response ); + + } + + scope.manager.itemEnd( url ); + + } else { + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onError ) callback.onError( event ); + + } + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + } + + }, false ); + + request.addEventListener( 'progress', function ( event ) { + + var callbacks = loading[ url ]; + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onProgress ) callback.onProgress( event ); + + } + + }, false ); + + request.addEventListener( 'error', function ( event ) { + + var callbacks = loading[ url ]; + + delete loading[ url ]; + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onError ) callback.onError( event ); + + } + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + }, false ); + + request.addEventListener( 'abort', function ( event ) { + + var callbacks = loading[ url ]; + + delete loading[ url ]; + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onError ) callback.onError( event ); + + } + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + }, false ); + + if ( this.responseType !== undefined ) request.responseType = this.responseType; + if ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials; + + if ( request.overrideMimeType ) request.overrideMimeType( this.mimeType !== undefined ? this.mimeType : 'text/plain' ); + + for ( var header in this.requestHeader ) { + + request.setRequestHeader( header, this.requestHeader[ header ] ); + + } + + request.send( null ); + + } + + scope.manager.itemStart( url ); + + return request; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + }, + + setResponseType: function ( value ) { + + this.responseType = value; + return this; + + }, + + setWithCredentials: function ( value ) { + + this.withCredentials = value; + return this; + + }, + + setMimeType: function ( value ) { + + this.mimeType = value; + return this; + + }, + + setRequestHeader: function ( value ) { + + this.requestHeader = value; + return this; + + } + + } ); + + /** + * @author bhouston / http://clara.io/ + */ + + function AnimationLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( AnimationLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.setPath( scope.path ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + }, onProgress, onError ); + + }, + + parse: function ( json, onLoad ) { + + var animations = []; + + for ( var i = 0; i < json.length; i ++ ) { + + var clip = AnimationClip.parse( json[ i ] ); + + animations.push( clip ); + + } + + onLoad( animations ); + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * + * Abstract Base class to block based textures loader (dds, pvr, ...) + */ + + function CompressedTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + // override in sub classes + this._parser = null; + + } + + Object.assign( CompressedTextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var images = []; + + var texture = new CompressedTexture(); + texture.image = images; + + var loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.setResponseType( 'arraybuffer' ); + + function loadTexture( i ) { + + loader.load( url[ i ], function ( buffer ) { + + var texDatas = scope._parser( buffer, true ); + + images[ i ] = { + width: texDatas.width, + height: texDatas.height, + format: texDatas.format, + mipmaps: texDatas.mipmaps + }; + + loaded += 1; + + if ( loaded === 6 ) { + + if ( texDatas.mipmapCount === 1 ) + texture.minFilter = LinearFilter; + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, onProgress, onError ); + + } + + if ( Array.isArray( url ) ) { + + var loaded = 0; + + for ( var i = 0, il = url.length; i < il; ++ i ) { + + loadTexture( i ); + + } + + } else { + + // compressed cubemap texture stored in a single DDS file + + loader.load( url, function ( buffer ) { + + var texDatas = scope._parser( buffer, true ); + + if ( texDatas.isCubemap ) { + + var faces = texDatas.mipmaps.length / texDatas.mipmapCount; + + for ( var f = 0; f < faces; f ++ ) { + + images[ f ] = { mipmaps: [] }; + + for ( var i = 0; i < texDatas.mipmapCount; i ++ ) { + + images[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] ); + images[ f ].format = texDatas.format; + images[ f ].width = texDatas.width; + images[ f ].height = texDatas.height; + + } + + } + + } else { + + texture.image.width = texDatas.width; + texture.image.height = texDatas.height; + texture.mipmaps = texDatas.mipmaps; + + } + + if ( texDatas.mipmapCount === 1 ) { + + texture.minFilter = LinearFilter; + + } + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + }, onProgress, onError ); + + } + + return texture; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author Nikos M. / https://github.com/foo123/ + * + * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...) + */ + + function DataTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + // override in sub classes + this._parser = null; + + } + + Object.assign( DataTextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var texture = new DataTexture(); + + var loader = new FileLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + loader.setPath( this.path ); + loader.load( url, function ( buffer ) { + + var texData = scope._parser( buffer ); + + if ( ! texData ) return; + + if ( undefined !== texData.image ) { + + texture.image = texData.image; + + } else if ( undefined !== texData.data ) { + + texture.image.width = texData.width; + texture.image.height = texData.height; + texture.image.data = texData.data; + + } + + texture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping; + texture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping; + + texture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter; + texture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter; + + texture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1; + + if ( undefined !== texData.format ) { + + texture.format = texData.format; + + } + if ( undefined !== texData.type ) { + + texture.type = texData.type; + + } + + if ( undefined !== texData.mipmaps ) { + + texture.mipmaps = texData.mipmaps; + + } + + if ( 1 === texData.mipmapCount ) { + + texture.minFilter = LinearFilter; + + } + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture, texData ); + + }, onProgress, onError ); + + + return texture; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + + function ImageLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( ImageLoader.prototype, { + + crossOrigin: 'anonymous', + + load: function ( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + url = this.manager.resolveURL( url ); + + var scope = this; + + var cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + var image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' ); + + function onImageLoad() { + + image.removeEventListener( 'load', onImageLoad, false ); + image.removeEventListener( 'error', onImageError, false ); + + Cache.add( url, this ); + + if ( onLoad ) onLoad( this ); + + scope.manager.itemEnd( url ); + + } + + function onImageError( event ) { + + image.removeEventListener( 'load', onImageLoad, false ); + image.removeEventListener( 'error', onImageError, false ); + + if ( onError ) onError( event ); + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + } + + image.addEventListener( 'load', onImageLoad, false ); + image.addEventListener( 'error', onImageError, false ); + + if ( url.substr( 0, 5 ) !== 'data:' ) { + + if ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin; + + } + + scope.manager.itemStart( url ); + + image.src = url; + + return image; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + + function CubeTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( CubeTextureLoader.prototype, { + + crossOrigin: 'anonymous', + + load: function ( urls, onLoad, onProgress, onError ) { + + var texture = new CubeTexture(); + + var loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setPath( this.path ); + + var loaded = 0; + + function loadTexture( i ) { + + loader.load( urls[ i ], function ( image ) { + + texture.images[ i ] = image; + + loaded ++; + + if ( loaded === 6 ) { + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, undefined, onError ); + + } + + for ( var i = 0; i < urls.length; ++ i ) { + + loadTexture( i ); + + } + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + + function TextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( TextureLoader.prototype, { + + crossOrigin: 'anonymous', + + load: function ( url, onLoad, onProgress, onError ) { + + var texture = new Texture(); + + var loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setPath( this.path ); + + loader.load( url, function ( image ) { + + texture.image = image; + + // JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB. + var isJPEG = url.search( /\.jpe?g$/i ) > 0 || url.search( /^data\:image\/jpeg/ ) === 0; + + texture.format = isJPEG ? RGBFormat : RGBAFormat; + texture.needsUpdate = true; + + if ( onLoad !== undefined ) { + + onLoad( texture ); + + } + + }, onProgress, onError ); + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Extensible curve object + * + * Some common of curve methods: + * .getPoint( t, optionalTarget ), .getTangent( t ) + * .getPointAt( u, optionalTarget ), .getTangentAt( u ) + * .getPoints(), .getSpacedPoints() + * .getLength() + * .updateArcLengths() + * + * This following curves inherit from THREE.Curve: + * + * -- 2D curves -- + * THREE.ArcCurve + * THREE.CubicBezierCurve + * THREE.EllipseCurve + * THREE.LineCurve + * THREE.QuadraticBezierCurve + * THREE.SplineCurve + * + * -- 3D curves -- + * THREE.CatmullRomCurve3 + * THREE.CubicBezierCurve3 + * THREE.LineCurve3 + * THREE.QuadraticBezierCurve3 + * + * A series of curves can be represented as a THREE.CurvePath. + * + **/ + + /************************************************************** + * Abstract Curve base class + **************************************************************/ + + function Curve() { + + this.type = 'Curve'; + + this.arcLengthDivisions = 200; + + } + + Object.assign( Curve.prototype, { + + // Virtual base class method to overwrite and implement in subclasses + // - t [0 .. 1] + + getPoint: function ( /* t, optionalTarget */ ) { + + console.warn( 'THREE.Curve: .getPoint() not implemented.' ); + return null; + + }, + + // Get point at relative position in curve according to arc length + // - u [0 .. 1] + + getPointAt: function ( u, optionalTarget ) { + + var t = this.getUtoTmapping( u ); + return this.getPoint( t, optionalTarget ); + + }, + + // Get sequence of points using getPoint( t ) + + getPoints: function ( divisions ) { + + if ( divisions === undefined ) divisions = 5; + + var points = []; + + for ( var d = 0; d <= divisions; d ++ ) { + + points.push( this.getPoint( d / divisions ) ); + + } + + return points; + + }, + + // Get sequence of points using getPointAt( u ) + + getSpacedPoints: function ( divisions ) { + + if ( divisions === undefined ) divisions = 5; + + var points = []; + + for ( var d = 0; d <= divisions; d ++ ) { + + points.push( this.getPointAt( d / divisions ) ); + + } + + return points; + + }, + + // Get total curve arc length + + getLength: function () { + + var lengths = this.getLengths(); + return lengths[ lengths.length - 1 ]; + + }, + + // Get list of cumulative segment lengths + + getLengths: function ( divisions ) { + + if ( divisions === undefined ) divisions = this.arcLengthDivisions; + + if ( this.cacheArcLengths && + ( this.cacheArcLengths.length === divisions + 1 ) && + ! this.needsUpdate ) { + + return this.cacheArcLengths; + + } + + this.needsUpdate = false; + + var cache = []; + var current, last = this.getPoint( 0 ); + var p, sum = 0; + + cache.push( 0 ); + + for ( p = 1; p <= divisions; p ++ ) { + + current = this.getPoint( p / divisions ); + sum += current.distanceTo( last ); + cache.push( sum ); + last = current; + + } + + this.cacheArcLengths = cache; + + return cache; // { sums: cache, sum: sum }; Sum is in the last element. + + }, + + updateArcLengths: function () { + + this.needsUpdate = true; + this.getLengths(); + + }, + + // Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant + + getUtoTmapping: function ( u, distance ) { + + var arcLengths = this.getLengths(); + + var i = 0, il = arcLengths.length; + + var 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 + + var 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 + + var lengthBefore = arcLengths[ i ]; + var lengthAfter = arcLengths[ i + 1 ]; + + var segmentLength = lengthAfter - lengthBefore; + + // determine where we are between the 'before' and 'after' points + + var segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength; + + // add that fractional amount to t + + var t = ( i + segmentFraction ) / ( il - 1 ); + + return t; + + }, + + // Returns a unit vector tangent at t + // In case any sub curve does not implement its tangent derivation, + // 2 points a small delta apart will be used to find its gradient + // which seems to give a reasonable approximation + + getTangent: function ( t ) { + + var delta = 0.0001; + var t1 = t - delta; + var t2 = t + delta; + + // Capping in case of danger + + if ( t1 < 0 ) t1 = 0; + if ( t2 > 1 ) t2 = 1; + + var pt1 = this.getPoint( t1 ); + var pt2 = this.getPoint( t2 ); + + var vec = pt2.clone().sub( pt1 ); + return vec.normalize(); + + }, + + getTangentAt: function ( u ) { + + var t = this.getUtoTmapping( u ); + return this.getTangent( t ); + + }, + + computeFrenetFrames: function ( segments, closed ) { + + // see http://www.cs.indiana.edu/pub/techreports/TR425.pdf + + var normal = new Vector3(); + + var tangents = []; + var normals = []; + var binormals = []; + + var vec = new Vector3(); + var mat = new Matrix4(); + + var i, u, theta; + + // compute the tangent vectors for each segment on the curve + + for ( i = 0; i <= segments; i ++ ) { + + u = i / segments; + + tangents[ i ] = this.getTangentAt( u ); + tangents[ i ].normalize(); + + } + + // select an initial normal vector perpendicular to the first tangent vector, + // and in the direction of the minimum tangent xyz component + + normals[ 0 ] = new Vector3(); + binormals[ 0 ] = new Vector3(); + var min = Number.MAX_VALUE; + var tx = Math.abs( tangents[ 0 ].x ); + var ty = Math.abs( tangents[ 0 ].y ); + var tz = Math.abs( tangents[ 0 ].z ); + + if ( tx <= min ) { + + min = tx; + normal.set( 1, 0, 0 ); + + } + + if ( ty <= min ) { + + min = ty; + normal.set( 0, 1, 0 ); + + } + + if ( tz <= min ) { + + normal.set( 0, 0, 1 ); + + } + + vec.crossVectors( tangents[ 0 ], normal ).normalize(); + + normals[ 0 ].crossVectors( tangents[ 0 ], vec ); + binormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ); + + + // compute the slowly-varying normal and binormal vectors for each segment on the curve + + for ( i = 1; i <= segments; i ++ ) { + + normals[ i ] = normals[ i - 1 ].clone(); + + binormals[ i ] = binormals[ i - 1 ].clone(); + + vec.crossVectors( tangents[ i - 1 ], tangents[ i ] ); + + if ( vec.length() > Number.EPSILON ) { + + vec.normalize(); + + theta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors + + normals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) ); + + } + + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + // if the curve is closed, postprocess the vectors so the first and last normal vectors are the same + + if ( closed === true ) { + + theta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) ); + theta /= segments; + + if ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) { + + theta = - theta; + + } + + for ( i = 1; i <= segments; i ++ ) { + + // twist a little... + normals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) ); + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + } + + return { + tangents: tangents, + normals: normals, + binormals: binormals + }; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.arcLengthDivisions = source.arcLengthDivisions; + + return this; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.5, + type: 'Curve', + generator: 'Curve.toJSON' + } + }; + + data.arcLengthDivisions = this.arcLengthDivisions; + data.type = this.type; + + return data; + + }, + + fromJSON: function ( json ) { + + this.arcLengthDivisions = json.arcLengthDivisions; + + return this; + + } + + } ); + + function EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + Curve.call( this ); + + this.type = 'EllipseCurve'; + + this.aX = aX || 0; + this.aY = aY || 0; + + this.xRadius = xRadius || 1; + this.yRadius = yRadius || 1; + + this.aStartAngle = aStartAngle || 0; + this.aEndAngle = aEndAngle || 2 * Math.PI; + + this.aClockwise = aClockwise || false; + + this.aRotation = aRotation || 0; + + } + + EllipseCurve.prototype = Object.create( Curve.prototype ); + EllipseCurve.prototype.constructor = EllipseCurve; + + EllipseCurve.prototype.isEllipseCurve = true; + + EllipseCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + var twoPi = Math.PI * 2; + var deltaAngle = this.aEndAngle - this.aStartAngle; + var samePoints = Math.abs( deltaAngle ) < Number.EPSILON; + + // ensures that deltaAngle is 0 .. 2 PI + while ( deltaAngle < 0 ) deltaAngle += twoPi; + while ( deltaAngle > twoPi ) deltaAngle -= twoPi; + + if ( deltaAngle < Number.EPSILON ) { + + if ( samePoints ) { + + deltaAngle = 0; + + } else { + + deltaAngle = twoPi; + + } + + } + + if ( this.aClockwise === true && ! samePoints ) { + + if ( deltaAngle === twoPi ) { + + deltaAngle = - twoPi; + + } else { + + deltaAngle = deltaAngle - twoPi; + + } + + } + + var angle = this.aStartAngle + t * deltaAngle; + var x = this.aX + this.xRadius * Math.cos( angle ); + var y = this.aY + this.yRadius * Math.sin( angle ); + + if ( this.aRotation !== 0 ) { + + var cos = Math.cos( this.aRotation ); + var sin = Math.sin( this.aRotation ); + + var tx = x - this.aX; + var ty = y - this.aY; + + // Rotate the point about the center of the ellipse. + x = tx * cos - ty * sin + this.aX; + y = tx * sin + ty * cos + this.aY; + + } + + return point.set( x, y ); + + }; + + EllipseCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.aX = source.aX; + this.aY = source.aY; + + this.xRadius = source.xRadius; + this.yRadius = source.yRadius; + + this.aStartAngle = source.aStartAngle; + this.aEndAngle = source.aEndAngle; + + this.aClockwise = source.aClockwise; + + this.aRotation = source.aRotation; + + return this; + + }; + + + EllipseCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.aX = this.aX; + data.aY = this.aY; + + data.xRadius = this.xRadius; + data.yRadius = this.yRadius; + + data.aStartAngle = this.aStartAngle; + data.aEndAngle = this.aEndAngle; + + data.aClockwise = this.aClockwise; + + data.aRotation = this.aRotation; + + return data; + + }; + + EllipseCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.aX = json.aX; + this.aY = json.aY; + + this.xRadius = json.xRadius; + this.yRadius = json.yRadius; + + this.aStartAngle = json.aStartAngle; + this.aEndAngle = json.aEndAngle; + + this.aClockwise = json.aClockwise; + + this.aRotation = json.aRotation; + + return this; + + }; + + function ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + EllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + this.type = 'ArcCurve'; + + } + + ArcCurve.prototype = Object.create( EllipseCurve.prototype ); + ArcCurve.prototype.constructor = ArcCurve; + + ArcCurve.prototype.isArcCurve = true; + + /** + * @author zz85 https://github.com/zz85 + * + * Centripetal CatmullRom Curve - which is useful for avoiding + * cusps and self-intersections in non-uniform catmull rom curves. + * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf + * + * curve.type accepts centripetal(default), chordal and catmullrom + * curve.tension is used for catmullrom which defaults to 0.5 + */ + + + /* + Based on an optimized c++ solution in + - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/ + - http://ideone.com/NoEbVM + + This CubicPoly class could be used for reusing some variables and calculations, + but for three.js curve use, it could be possible inlined and flatten into a single function call + which can be placed in CurveUtils. + */ + + function CubicPoly() { + + var c0 = 0, c1 = 0, c2 = 0, c3 = 0; + + /* + * Compute coefficients for a cubic polynomial + * p(s) = c0 + c1*s + c2*s^2 + c3*s^3 + * such that + * p(0) = x0, p(1) = x1 + * and + * p'(0) = t0, p'(1) = t1. + */ + function init( x0, x1, t0, t1 ) { + + c0 = x0; + c1 = t0; + c2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1; + c3 = 2 * x0 - 2 * x1 + t0 + t1; + + } + + return { + + initCatmullRom: function ( x0, x1, x2, x3, tension ) { + + init( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) ); + + }, + + initNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) { + + // compute tangents when parameterized in [t1,t2] + var t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1; + var t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2; + + // rescale tangents for parametrization in [0,1] + t1 *= dt1; + t2 *= dt1; + + init( x1, x2, t1, t2 ); + + }, + + calc: function ( t ) { + + var t2 = t * t; + var t3 = t2 * t; + return c0 + c1 * t + c2 * t2 + c3 * t3; + + } + + }; + + } + + // + + var tmp = new Vector3(); + var px = new CubicPoly(), py = new CubicPoly(), pz = new CubicPoly(); + + function CatmullRomCurve3( points, closed, curveType, tension ) { + + Curve.call( this ); + + this.type = 'CatmullRomCurve3'; + + this.points = points || []; + this.closed = closed || false; + this.curveType = curveType || 'centripetal'; + this.tension = tension || 0.5; + + } + + CatmullRomCurve3.prototype = Object.create( Curve.prototype ); + CatmullRomCurve3.prototype.constructor = CatmullRomCurve3; + + CatmullRomCurve3.prototype.isCatmullRomCurve3 = true; + + CatmullRomCurve3.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector3(); + + var points = this.points; + var l = points.length; + + var p = ( l - ( this.closed ? 0 : 1 ) ) * t; + var intPoint = Math.floor( p ); + var weight = p - intPoint; + + if ( this.closed ) { + + intPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l; + + } else if ( weight === 0 && intPoint === l - 1 ) { + + intPoint = l - 2; + weight = 1; + + } + + var p0, p1, p2, p3; // 4 points + + if ( this.closed || intPoint > 0 ) { + + p0 = points[ ( intPoint - 1 ) % l ]; + + } else { + + // extrapolate first point + tmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] ); + p0 = tmp; + + } + + p1 = points[ intPoint % l ]; + p2 = points[ ( intPoint + 1 ) % l ]; + + if ( this.closed || intPoint + 2 < l ) { + + p3 = points[ ( intPoint + 2 ) % l ]; + + } else { + + // extrapolate last point + tmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] ); + p3 = tmp; + + } + + if ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) { + + // init Centripetal / Chordal Catmull-Rom + var pow = this.curveType === 'chordal' ? 0.5 : 0.25; + var dt0 = Math.pow( p0.distanceToSquared( p1 ), pow ); + var dt1 = Math.pow( p1.distanceToSquared( p2 ), pow ); + var dt2 = Math.pow( p2.distanceToSquared( p3 ), pow ); + + // safety check for repeated points + if ( dt1 < 1e-4 ) dt1 = 1.0; + if ( dt0 < 1e-4 ) dt0 = dt1; + if ( dt2 < 1e-4 ) dt2 = dt1; + + px.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 ); + py.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 ); + pz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 ); + + } else if ( this.curveType === 'catmullrom' ) { + + px.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension ); + py.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension ); + pz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension ); + + } + + point.set( + px.calc( weight ), + py.calc( weight ), + pz.calc( weight ) + ); + + return point; + + }; + + CatmullRomCurve3.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.points = []; + + for ( var i = 0, l = source.points.length; i < l; i ++ ) { + + var point = source.points[ i ]; + + this.points.push( point.clone() ); + + } + + this.closed = source.closed; + this.curveType = source.curveType; + this.tension = source.tension; + + return this; + + }; + + CatmullRomCurve3.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.points = []; + + for ( var i = 0, l = this.points.length; i < l; i ++ ) { + + var point = this.points[ i ]; + data.points.push( point.toArray() ); + + } + + data.closed = this.closed; + data.curveType = this.curveType; + data.tension = this.tension; + + return data; + + }; + + CatmullRomCurve3.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.points = []; + + for ( var i = 0, l = json.points.length; i < l; i ++ ) { + + var point = json.points[ i ]; + this.points.push( new Vector3().fromArray( point ) ); + + } + + this.closed = json.closed; + this.curveType = json.curveType; + this.tension = json.tension; + + return this; + + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + * Bezier Curves formulas obtained from + * http://en.wikipedia.org/wiki/Bézier_curve + */ + + function CatmullRom( t, p0, p1, p2, p3 ) { + + var v0 = ( p2 - p0 ) * 0.5; + var v1 = ( p3 - p1 ) * 0.5; + var t2 = t * t; + var t3 = t * t2; + return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1; + + } + + // + + function QuadraticBezierP0( t, p ) { + + var 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 QuadraticBezier( t, p0, p1, p2 ) { + + return QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) + + QuadraticBezierP2( t, p2 ); + + } + + // + + function CubicBezierP0( t, p ) { + + var k = 1 - t; + return k * k * k * p; + + } + + function CubicBezierP1( t, p ) { + + var 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; + + } + + function CubicBezier( t, p0, p1, p2, p3 ) { + + return CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) + + CubicBezierP3( t, p3 ); + + } + + function CubicBezierCurve( v0, v1, v2, v3 ) { + + Curve.call( this ); + + this.type = 'CubicBezierCurve'; + + this.v0 = v0 || new Vector2(); + this.v1 = v1 || new Vector2(); + this.v2 = v2 || new Vector2(); + this.v3 = v3 || new Vector2(); + + } + + CubicBezierCurve.prototype = Object.create( Curve.prototype ); + CubicBezierCurve.prototype.constructor = CubicBezierCurve; + + CubicBezierCurve.prototype.isCubicBezierCurve = true; + + CubicBezierCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + + point.set( + CubicBezier( t, v0.x, v1.x, v2.x, v3.x ), + CubicBezier( t, v0.y, v1.y, v2.y, v3.y ) + ); + + return point; + + }; + + CubicBezierCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + this.v3.copy( source.v3 ); + + return this; + + }; + + CubicBezierCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + data.v3 = this.v3.toArray(); + + return data; + + }; + + CubicBezierCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + this.v3.fromArray( json.v3 ); + + return this; + + }; + + function CubicBezierCurve3( v0, v1, v2, v3 ) { + + Curve.call( this ); + + this.type = 'CubicBezierCurve3'; + + this.v0 = v0 || new Vector3(); + this.v1 = v1 || new Vector3(); + this.v2 = v2 || new Vector3(); + this.v3 = v3 || new Vector3(); + + } + + CubicBezierCurve3.prototype = Object.create( Curve.prototype ); + CubicBezierCurve3.prototype.constructor = CubicBezierCurve3; + + CubicBezierCurve3.prototype.isCubicBezierCurve3 = true; + + CubicBezierCurve3.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector3(); + + var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + + point.set( + CubicBezier( t, v0.x, v1.x, v2.x, v3.x ), + CubicBezier( t, v0.y, v1.y, v2.y, v3.y ), + CubicBezier( t, v0.z, v1.z, v2.z, v3.z ) + ); + + return point; + + }; + + CubicBezierCurve3.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + this.v3.copy( source.v3 ); + + return this; + + }; + + CubicBezierCurve3.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + data.v3 = this.v3.toArray(); + + return data; + + }; + + CubicBezierCurve3.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + this.v3.fromArray( json.v3 ); + + return this; + + }; + + function LineCurve( v1, v2 ) { + + Curve.call( this ); + + this.type = 'LineCurve'; + + this.v1 = v1 || new Vector2(); + this.v2 = v2 || new Vector2(); + + } + + LineCurve.prototype = Object.create( Curve.prototype ); + LineCurve.prototype.constructor = LineCurve; + + LineCurve.prototype.isLineCurve = true; + + LineCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + 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 + + LineCurve.prototype.getPointAt = function ( u, optionalTarget ) { + + return this.getPoint( u, optionalTarget ); + + }; + + LineCurve.prototype.getTangent = function ( /* t */ ) { + + var tangent = this.v2.clone().sub( this.v1 ); + + return tangent.normalize(); + + }; + + LineCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + }; + + LineCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + }; + + LineCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + }; + + function LineCurve3( v1, v2 ) { + + Curve.call( this ); + + this.type = 'LineCurve3'; + + this.v1 = v1 || new Vector3(); + this.v2 = v2 || new Vector3(); + + } + + LineCurve3.prototype = Object.create( Curve.prototype ); + LineCurve3.prototype.constructor = LineCurve3; + + LineCurve3.prototype.isLineCurve3 = true; + + LineCurve3.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector3(); + + 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 + + LineCurve3.prototype.getPointAt = function ( u, optionalTarget ) { + + return this.getPoint( u, optionalTarget ); + + }; + + LineCurve3.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + }; + + LineCurve3.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + }; + + LineCurve3.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + }; + + function QuadraticBezierCurve( v0, v1, v2 ) { + + Curve.call( this ); + + this.type = 'QuadraticBezierCurve'; + + this.v0 = v0 || new Vector2(); + this.v1 = v1 || new Vector2(); + this.v2 = v2 || new Vector2(); + + } + + QuadraticBezierCurve.prototype = Object.create( Curve.prototype ); + QuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve; + + QuadraticBezierCurve.prototype.isQuadraticBezierCurve = true; + + QuadraticBezierCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + var v0 = this.v0, v1 = this.v1, v2 = this.v2; + + point.set( + QuadraticBezier( t, v0.x, v1.x, v2.x ), + QuadraticBezier( t, v0.y, v1.y, v2.y ) + ); + + return point; + + }; + + QuadraticBezierCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + }; + + QuadraticBezierCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + }; + + QuadraticBezierCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + }; + + function QuadraticBezierCurve3( v0, v1, v2 ) { + + Curve.call( this ); + + this.type = 'QuadraticBezierCurve3'; + + this.v0 = v0 || new Vector3(); + this.v1 = v1 || new Vector3(); + this.v2 = v2 || new Vector3(); + + } + + QuadraticBezierCurve3.prototype = Object.create( Curve.prototype ); + QuadraticBezierCurve3.prototype.constructor = QuadraticBezierCurve3; + + QuadraticBezierCurve3.prototype.isQuadraticBezierCurve3 = true; + + QuadraticBezierCurve3.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector3(); + + var v0 = this.v0, v1 = this.v1, v2 = this.v2; + + point.set( + QuadraticBezier( t, v0.x, v1.x, v2.x ), + QuadraticBezier( t, v0.y, v1.y, v2.y ), + QuadraticBezier( t, v0.z, v1.z, v2.z ) + ); + + return point; + + }; + + QuadraticBezierCurve3.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + }; + + QuadraticBezierCurve3.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + }; + + QuadraticBezierCurve3.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + }; + + function SplineCurve( points /* array of Vector2 */ ) { + + Curve.call( this ); + + this.type = 'SplineCurve'; + + this.points = points || []; + + } + + SplineCurve.prototype = Object.create( Curve.prototype ); + SplineCurve.prototype.constructor = SplineCurve; + + SplineCurve.prototype.isSplineCurve = true; + + SplineCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + var points = this.points; + var p = ( points.length - 1 ) * t; + + var intPoint = Math.floor( p ); + var weight = p - intPoint; + + var p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ]; + var p1 = points[ intPoint ]; + var p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ]; + var p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ]; + + point.set( + CatmullRom( weight, p0.x, p1.x, p2.x, p3.x ), + CatmullRom( weight, p0.y, p1.y, p2.y, p3.y ) + ); + + return point; + + }; + + SplineCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.points = []; + + for ( var i = 0, l = source.points.length; i < l; i ++ ) { + + var point = source.points[ i ]; + + this.points.push( point.clone() ); + + } + + return this; + + }; + + SplineCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.points = []; + + for ( var i = 0, l = this.points.length; i < l; i ++ ) { + + var point = this.points[ i ]; + data.points.push( point.toArray() ); + + } + + return data; + + }; + + SplineCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.points = []; + + for ( var i = 0, l = json.points.length; i < l; i ++ ) { + + var point = json.points[ i ]; + this.points.push( new Vector2().fromArray( point ) ); + + } + + return this; + + }; + + + + var Curves = /*#__PURE__*/Object.freeze({ + ArcCurve: ArcCurve, + CatmullRomCurve3: CatmullRomCurve3, + CubicBezierCurve: CubicBezierCurve, + CubicBezierCurve3: CubicBezierCurve3, + EllipseCurve: EllipseCurve, + LineCurve: LineCurve, + LineCurve3: LineCurve3, + QuadraticBezierCurve: QuadraticBezierCurve, + QuadraticBezierCurve3: QuadraticBezierCurve3, + SplineCurve: SplineCurve + }); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + **/ + + /************************************************************** + * Curved Path - a curve path is simply a array of connected + * curves, but retains the api of a curve + **************************************************************/ + + function CurvePath() { + + Curve.call( this ); + + this.type = 'CurvePath'; + + this.curves = []; + this.autoClose = false; // Automatically closes the path + + } + + CurvePath.prototype = Object.assign( Object.create( Curve.prototype ), { + + constructor: CurvePath, + + add: function ( curve ) { + + this.curves.push( curve ); + + }, + + closePath: function () { + + // Add a line curve if start and end of lines are not connected + var startPoint = this.curves[ 0 ].getPoint( 0 ); + var endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 ); + + if ( ! startPoint.equals( endPoint ) ) { + + this.curves.push( new LineCurve( endPoint, startPoint ) ); + + } + + }, + + // To get accurate point with reference to + // entire path distance at time t, + // following has to be done: + + // 1. Length of each sub path have to be known + // 2. Locate and identify type of curve + // 3. Get t for the curve + // 4. Return curve.getPointAt(t') + + getPoint: function ( t ) { + + var d = t * this.getLength(); + var curveLengths = this.getCurveLengths(); + var i = 0; + + // To think about boundaries points. + + while ( i < curveLengths.length ) { + + if ( curveLengths[ i ] >= d ) { + + var diff = curveLengths[ i ] - d; + var curve = this.curves[ i ]; + + var segmentLength = curve.getLength(); + var u = segmentLength === 0 ? 0 : 1 - diff / segmentLength; + + return curve.getPointAt( u ); + + } + + i ++; + + } + + return null; + + // loop where sum != 0, sum > d , sum+1 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) { + + points.push( points[ 0 ] ); + + } + + return points; + + }, + + copy: function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.curves = []; + + for ( var i = 0, l = source.curves.length; i < l; i ++ ) { + + var curve = source.curves[ i ]; + + this.curves.push( curve.clone() ); + + } + + this.autoClose = source.autoClose; + + return this; + + }, + + toJSON: function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.autoClose = this.autoClose; + data.curves = []; + + for ( var i = 0, l = this.curves.length; i < l; i ++ ) { + + var curve = this.curves[ i ]; + data.curves.push( curve.toJSON() ); + + } + + return data; + + }, + + fromJSON: function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.autoClose = json.autoClose; + this.curves = []; + + for ( var i = 0, l = json.curves.length; i < l; i ++ ) { + + var curve = json.curves[ i ]; + this.curves.push( new Curves[ curve.type ]().fromJSON( curve ) ); + + } + + return this; + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Creates free form 2d path using series of points, lines or curves. + **/ + + function Path( points ) { + + CurvePath.call( this ); + + this.type = 'Path'; + + this.currentPoint = new Vector2(); + + if ( points ) { + + this.setFromPoints( points ); + + } + + } + + Path.prototype = Object.assign( Object.create( CurvePath.prototype ), { + + constructor: Path, + + setFromPoints: function ( points ) { + + this.moveTo( points[ 0 ].x, points[ 0 ].y ); + + for ( var i = 1, l = points.length; i < l; i ++ ) { + + this.lineTo( points[ i ].x, points[ i ].y ); + + } + + }, + + moveTo: function ( x, y ) { + + this.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying? + + }, + + lineTo: function ( x, y ) { + + var curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) ); + this.curves.push( curve ); + + this.currentPoint.set( x, y ); + + }, + + quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) { + + var curve = new QuadraticBezierCurve( + this.currentPoint.clone(), + new Vector2( aCPx, aCPy ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + }, + + bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + + var curve = new CubicBezierCurve( + this.currentPoint.clone(), + new Vector2( aCP1x, aCP1y ), + new Vector2( aCP2x, aCP2y ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + }, + + splineThru: function ( pts /*Array of Vector*/ ) { + + var npts = [ this.currentPoint.clone() ].concat( pts ); + + var curve = new SplineCurve( npts ); + this.curves.push( curve ); + + this.currentPoint.copy( pts[ pts.length - 1 ] ); + + }, + + arc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + var x0 = this.currentPoint.x; + var y0 = this.currentPoint.y; + + this.absarc( aX + x0, aY + y0, aRadius, + aStartAngle, aEndAngle, aClockwise ); + + }, + + absarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + this.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + }, + + ellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + var x0 = this.currentPoint.x; + var y0 = this.currentPoint.y; + + this.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + }, + + absellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + var curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + if ( this.curves.length > 0 ) { + + // if a previous curve is present, attempt to join + var firstPoint = curve.getPoint( 0 ); + + if ( ! firstPoint.equals( this.currentPoint ) ) { + + this.lineTo( firstPoint.x, firstPoint.y ); + + } + + } + + this.curves.push( curve ); + + var lastPoint = curve.getPoint( 1 ); + this.currentPoint.copy( lastPoint ); + + }, + + copy: function ( source ) { + + CurvePath.prototype.copy.call( this, source ); + + this.currentPoint.copy( source.currentPoint ); + + return this; + + }, + + toJSON: function () { + + var data = CurvePath.prototype.toJSON.call( this ); + + data.currentPoint = this.currentPoint.toArray(); + + return data; + + }, + + fromJSON: function ( json ) { + + CurvePath.prototype.fromJSON.call( this, json ); + + this.currentPoint.fromArray( json.currentPoint ); + + return this; + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Defines a 2d shape plane using paths. + **/ + + // STEP 1 Create a path. + // STEP 2 Turn path into shape. + // STEP 3 ExtrudeGeometry takes in Shape/Shapes + // STEP 3a - Extract points from each shape, turn to vertices + // STEP 3b - Triangulate each shape, add faces. + + function Shape( points ) { + + Path.call( this, points ); + + this.uuid = _Math.generateUUID(); + + this.type = 'Shape'; + + this.holes = []; + + } + + Shape.prototype = Object.assign( Object.create( Path.prototype ), { + + constructor: Shape, + + getPointsHoles: function ( divisions ) { + + var holesPts = []; + + for ( var i = 0, l = this.holes.length; i < l; i ++ ) { + + holesPts[ i ] = this.holes[ i ].getPoints( divisions ); + + } + + return holesPts; + + }, + + // get points of shape and holes (keypoints based on segments parameter) + + extractPoints: function ( divisions ) { + + return { + + shape: this.getPoints( divisions ), + holes: this.getPointsHoles( divisions ) + + }; + + }, + + copy: function ( source ) { + + Path.prototype.copy.call( this, source ); + + this.holes = []; + + for ( var i = 0, l = source.holes.length; i < l; i ++ ) { + + var hole = source.holes[ i ]; + + this.holes.push( hole.clone() ); + + } + + return this; + + }, + + toJSON: function () { + + var data = Path.prototype.toJSON.call( this ); + + data.uuid = this.uuid; + data.holes = []; + + for ( var i = 0, l = this.holes.length; i < l; i ++ ) { + + var hole = this.holes[ i ]; + data.holes.push( hole.toJSON() ); + + } + + return data; + + }, + + fromJSON: function ( json ) { + + Path.prototype.fromJSON.call( this, json ); + + this.uuid = json.uuid; + this.holes = []; + + for ( var i = 0, l = json.holes.length; i < l; i ++ ) { + + var hole = json.holes[ i ]; + this.holes.push( new Path().fromJSON( hole ) ); + + } + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Light( color, intensity ) { + + Object3D.call( this ); + + this.type = 'Light'; + + this.color = new Color( color ); + this.intensity = intensity !== undefined ? intensity : 1; + + this.receiveShadow = undefined; + + } + + Light.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Light, + + isLight: true, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.intensity = source.intensity; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.color = this.color.getHex(); + data.object.intensity = this.intensity; + + if ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex(); + + if ( this.distance !== undefined ) data.object.distance = this.distance; + if ( this.angle !== undefined ) data.object.angle = this.angle; + if ( this.decay !== undefined ) data.object.decay = this.decay; + if ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra; + + if ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON(); + + return data; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function HemisphereLight( skyColor, groundColor, intensity ) { + + Light.call( this, skyColor, intensity ); + + this.type = 'HemisphereLight'; + + this.castShadow = undefined; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.groundColor = new Color( groundColor ); + + } + + HemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: HemisphereLight, + + isHemisphereLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.groundColor.copy( source.groundColor ); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LightShadow( camera ) { + + this.camera = camera; + + this.bias = 0; + this.radius = 1; + + this.mapSize = new Vector2( 512, 512 ); + + this.map = null; + this.matrix = new Matrix4(); + + } + + Object.assign( LightShadow.prototype, { + + copy: function ( source ) { + + this.camera = source.camera.clone(); + + this.bias = source.bias; + this.radius = source.radius; + + this.mapSize.copy( source.mapSize ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + toJSON: function () { + + var object = {}; + + if ( this.bias !== 0 ) object.bias = this.bias; + if ( this.radius !== 1 ) object.radius = this.radius; + if ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray(); + + object.camera = this.camera.toJSON( false ).object; + delete object.camera.matrix; + + return object; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function SpotLightShadow() { + + LightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) ); + + } + + SpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), { + + constructor: SpotLightShadow, + + isSpotLightShadow: true, + + update: function ( light ) { + + var camera = this.camera; + + var fov = _Math.RAD2DEG * 2 * light.angle; + var aspect = this.mapSize.width / this.mapSize.height; + var far = light.distance || camera.far; + + if ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) { + + camera.fov = fov; + camera.aspect = aspect; + camera.far = far; + camera.updateProjectionMatrix(); + + } + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function SpotLight( color, intensity, distance, angle, penumbra, decay ) { + + Light.call( this, color, intensity ); + + this.type = 'SpotLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.target = new Object3D(); + + Object.defineProperty( this, 'power', { + get: function () { + + // intensity = power per solid angle. + // ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + return this.intensity * Math.PI; + + }, + set: function ( power ) { + + // intensity = power per solid angle. + // ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + this.intensity = power / Math.PI; + + } + } ); + + this.distance = ( distance !== undefined ) ? distance : 0; + this.angle = ( angle !== undefined ) ? angle : Math.PI / 3; + this.penumbra = ( penumbra !== undefined ) ? penumbra : 0; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new SpotLightShadow(); + + } + + SpotLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: SpotLight, + + isSpotLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.distance = source.distance; + this.angle = source.angle; + this.penumbra = source.penumbra; + this.decay = source.decay; + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + + function PointLight( color, intensity, distance, decay ) { + + Light.call( this, color, intensity ); + + this.type = 'PointLight'; + + Object.defineProperty( this, 'power', { + get: function () { + + // intensity = power per solid angle. + // ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + return this.intensity * 4 * Math.PI; + + }, + set: function ( power ) { + + // intensity = power per solid angle. + // ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + this.intensity = power / ( 4 * Math.PI ); + + } + } ); + + this.distance = ( distance !== undefined ) ? distance : 0; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) ); + + } + + PointLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: PointLight, + + isPointLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.distance = source.distance; + this.decay = source.decay; + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author arose / http://github.com/arose + */ + + function OrthographicCamera( left, right, top, bottom, near, far ) { + + Camera.call( this ); + + this.type = 'OrthographicCamera'; + + this.zoom = 1; + this.view = null; + + this.left = ( left !== undefined ) ? left : - 1; + this.right = ( right !== undefined ) ? right : 1; + this.top = ( top !== undefined ) ? top : 1; + this.bottom = ( bottom !== undefined ) ? bottom : - 1; + + this.near = ( near !== undefined ) ? near : 0.1; + this.far = ( far !== undefined ) ? far : 2000; + + this.updateProjectionMatrix(); + + } + + OrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), { + + constructor: OrthographicCamera, + + isOrthographicCamera: true, + + copy: function ( source, recursive ) { + + Camera.prototype.copy.call( this, source, recursive ); + + 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.zoom = source.zoom; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + return this; + + }, + + setViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) { + + if ( this.view === null ) { + + this.view = { + enabled: true, + fullWidth: 1, + fullHeight: 1, + offsetX: 0, + offsetY: 0, + width: 1, + height: 1 + }; + + } + + this.view.enabled = true; + this.view.fullWidth = fullWidth; + this.view.fullHeight = fullHeight; + this.view.offsetX = x; + this.view.offsetY = y; + this.view.width = width; + this.view.height = height; + + this.updateProjectionMatrix(); + + }, + + clearViewOffset: function () { + + if ( this.view !== null ) { + + this.view.enabled = false; + + } + + this.updateProjectionMatrix(); + + }, + + updateProjectionMatrix: function () { + + var dx = ( this.right - this.left ) / ( 2 * this.zoom ); + var dy = ( this.top - this.bottom ) / ( 2 * this.zoom ); + var cx = ( this.right + this.left ) / 2; + var cy = ( this.top + this.bottom ) / 2; + + var left = cx - dx; + var right = cx + dx; + var top = cy + dy; + var bottom = cy - dy; + + if ( this.view !== null && this.view.enabled ) { + + var zoomW = this.zoom / ( this.view.width / this.view.fullWidth ); + var zoomH = this.zoom / ( this.view.height / this.view.fullHeight ); + var scaleW = ( this.right - this.left ) / this.view.width; + var scaleH = ( this.top - this.bottom ) / this.view.height; + + left += scaleW * ( this.view.offsetX / zoomW ); + right = left + scaleW * ( this.view.width / zoomW ); + top -= scaleH * ( this.view.offsetY / zoomH ); + bottom = top - scaleH * ( this.view.height / zoomH ); + + } + + this.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far ); + + this.projectionMatrixInverse.getInverse( this.projectionMatrix ); + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.zoom = this.zoom; + data.object.left = this.left; + data.object.right = this.right; + data.object.top = this.top; + data.object.bottom = this.bottom; + data.object.near = this.near; + data.object.far = this.far; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + return data; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function DirectionalLightShadow( ) { + + LightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) ); + + } + + DirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), { + + constructor: DirectionalLightShadow + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function DirectionalLight( color, intensity ) { + + Light.call( this, color, intensity ); + + this.type = 'DirectionalLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.target = new Object3D(); + + this.shadow = new DirectionalLightShadow(); + + } + + DirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: DirectionalLight, + + isDirectionalLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AmbientLight( color, intensity ) { + + Light.call( this, color, intensity ); + + this.type = 'AmbientLight'; + + this.castShadow = undefined; + + } + + AmbientLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: AmbientLight, + + isAmbientLight: true + + } ); + + /** + * @author abelnation / http://github.com/abelnation + */ + + function RectAreaLight( color, intensity, width, height ) { + + Light.call( this, color, intensity ); + + this.type = 'RectAreaLight'; + + this.width = ( width !== undefined ) ? width : 10; + this.height = ( height !== undefined ) ? height : 10; + + } + + RectAreaLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: RectAreaLight, + + isRectAreaLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.width = source.width; + this.height = source.height; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Light.prototype.toJSON.call( this, meta ); + + data.object.width = this.width; + data.object.height = this.height; + + return data; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function MaterialLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + this.textures = {}; + + } + + Object.assign( MaterialLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.setPath( scope.path ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + var textures = this.textures; + + function getTexture( name ) { + + if ( textures[ name ] === undefined ) { + + console.warn( 'THREE.MaterialLoader: Undefined texture', name ); + + } + + return textures[ name ]; + + } + + var material = new Materials[ json.type ](); + + if ( json.uuid !== undefined ) material.uuid = json.uuid; + if ( json.name !== undefined ) material.name = json.name; + if ( json.color !== undefined ) material.color.setHex( json.color ); + if ( json.roughness !== undefined ) material.roughness = json.roughness; + if ( json.metalness !== undefined ) material.metalness = json.metalness; + if ( json.emissive !== undefined ) material.emissive.setHex( json.emissive ); + if ( json.specular !== undefined ) material.specular.setHex( json.specular ); + if ( json.shininess !== undefined ) material.shininess = json.shininess; + if ( json.clearCoat !== undefined ) material.clearCoat = json.clearCoat; + if ( json.clearCoatRoughness !== undefined ) material.clearCoatRoughness = json.clearCoatRoughness; + if ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors; + if ( json.fog !== undefined ) material.fog = json.fog; + if ( json.flatShading !== undefined ) material.flatShading = json.flatShading; + if ( json.blending !== undefined ) material.blending = json.blending; + if ( json.combine !== undefined ) material.combine = json.combine; + if ( json.side !== undefined ) material.side = json.side; + if ( json.opacity !== undefined ) material.opacity = json.opacity; + if ( json.transparent !== undefined ) material.transparent = json.transparent; + if ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest; + if ( json.depthTest !== undefined ) material.depthTest = json.depthTest; + if ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite; + if ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite; + if ( json.wireframe !== undefined ) material.wireframe = json.wireframe; + if ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth; + if ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap; + if ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin; + + if ( json.rotation !== undefined ) material.rotation = json.rotation; + + if ( json.linewidth !== 1 ) material.linewidth = json.linewidth; + if ( json.dashSize !== undefined ) material.dashSize = json.dashSize; + if ( json.gapSize !== undefined ) material.gapSize = json.gapSize; + if ( json.scale !== undefined ) material.scale = json.scale; + + if ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset; + if ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor; + if ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits; + + if ( json.skinning !== undefined ) material.skinning = json.skinning; + if ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets; + if ( json.dithering !== undefined ) material.dithering = json.dithering; + + if ( json.visible !== undefined ) material.visible = json.visible; + if ( json.userData !== undefined ) material.userData = json.userData; + + // Shader Material + + if ( json.uniforms !== undefined ) { + + for ( var name in json.uniforms ) { + + var uniform = json.uniforms[ name ]; + + material.uniforms[ name ] = {}; + + switch ( uniform.type ) { + + case 't': + material.uniforms[ name ].value = getTexture( uniform.value ); + break; + + case 'c': + material.uniforms[ name ].value = new Color().setHex( uniform.value ); + break; + + case 'v2': + material.uniforms[ name ].value = new Vector2().fromArray( uniform.value ); + break; + + case 'v3': + material.uniforms[ name ].value = new Vector3().fromArray( uniform.value ); + break; + + case 'v4': + material.uniforms[ name ].value = new Vector4().fromArray( uniform.value ); + break; + + case 'm4': + material.uniforms[ name ].value = new Matrix4().fromArray( uniform.value ); + break; + + default: + material.uniforms[ name ].value = uniform.value; + + } + + } + + } + + if ( json.defines !== undefined ) material.defines = json.defines; + if ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader; + if ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader; + + // Deprecated + + if ( json.shading !== undefined ) material.flatShading = json.shading === 1; // THREE.FlatShading + + // for PointsMaterial + + if ( json.size !== undefined ) material.size = json.size; + if ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation; + + // maps + + if ( json.map !== undefined ) material.map = getTexture( json.map ); + + if ( json.alphaMap !== undefined ) { + + material.alphaMap = getTexture( json.alphaMap ); + material.transparent = true; + + } + + if ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap ); + if ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale; + + if ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap ); + if ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType; + if ( json.normalScale !== undefined ) { + + var normalScale = json.normalScale; + + if ( Array.isArray( normalScale ) === false ) { + + // Blender exporter used to export a scalar. See #7459 + + normalScale = [ normalScale, normalScale ]; + + } + + material.normalScale = new Vector2().fromArray( normalScale ); + + } + + if ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap ); + if ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale; + if ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias; + + if ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap ); + if ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap ); + + if ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap ); + if ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity; + + if ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap ); + + if ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap ); + if ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity; + + if ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity; + + if ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap ); + if ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity; + + if ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap ); + if ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity; + + if ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap ); + + return material; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + }, + + setTextures: function ( value ) { + + this.textures = value; + return this; + + } + + } ); + + /** + * @author Don McCurdy / https://www.donmccurdy.com + */ + + var LoaderUtils = { + + decodeText: function ( 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. + + var s = ''; + + for ( var i = 0, il = array.length; i < il; i ++ ) { + + // Implicitly assumes little-endian. + s += String.fromCharCode( array[ i ] ); + + } + + // Merges multi-byte utf-8 characters. + return decodeURIComponent( escape( s ) ); + + }, + + extractUrlBase: function ( url ) { + + var index = url.lastIndexOf( '/' ); + + if ( index === - 1 ) return './'; + + return url.substr( 0, index + 1 ); + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function BufferGeometryLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( BufferGeometryLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.setPath( scope.path ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + var geometry = new BufferGeometry(); + + var index = json.data.index; + + if ( index !== undefined ) { + + var typedArray = new TYPED_ARRAYS[ index.type ]( index.array ); + geometry.setIndex( new BufferAttribute( typedArray, 1 ) ); + + } + + var attributes = json.data.attributes; + + for ( var key in attributes ) { + + var attribute = attributes[ key ]; + var typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array ); + + geometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) ); + + } + + var groups = json.data.groups || json.data.drawcalls || json.data.offsets; + + if ( groups !== undefined ) { + + for ( var i = 0, n = groups.length; i !== n; ++ i ) { + + var group = groups[ i ]; + + geometry.addGroup( group.start, group.count, group.materialIndex ); + + } + + } + + var boundingSphere = json.data.boundingSphere; + + if ( boundingSphere !== undefined ) { + + var center = new Vector3(); + + if ( boundingSphere.center !== undefined ) { + + center.fromArray( boundingSphere.center ); + + } + + geometry.boundingSphere = new Sphere( center, boundingSphere.radius ); + + } + + return geometry; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + var TYPED_ARRAYS = { + Int8Array: Int8Array, + Uint8Array: Uint8Array, + // Workaround for IE11 pre KB2929437. See #11440 + Uint8ClampedArray: typeof Uint8ClampedArray !== 'undefined' ? Uint8ClampedArray : Uint8Array, + Int16Array: Int16Array, + Uint16Array: Uint16Array, + Int32Array: Int32Array, + Uint32Array: Uint32Array, + Float32Array: Float32Array, + Float64Array: Float64Array + }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Loader() {} + + Loader.Handlers = { + + handlers: [], + + add: function ( regex, loader ) { + + this.handlers.push( regex, loader ); + + }, + + get: function ( file ) { + + var handlers = this.handlers; + + for ( var i = 0, l = handlers.length; i < l; i += 2 ) { + + var regex = handlers[ i ]; + var loader = handlers[ i + 1 ]; + + if ( regex.test( file ) ) { + + return loader; + + } + + } + + return null; + + } + + }; + + Object.assign( Loader.prototype, { + + crossOrigin: 'anonymous', + + onLoadStart: function () {}, + + onLoadProgress: function () {}, + + onLoadComplete: function () {}, + + initMaterials: function ( materials, texturePath, crossOrigin ) { + + var array = []; + + for ( var i = 0; i < materials.length; ++ i ) { + + array[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin ); + + } + + return array; + + }, + + createMaterial: ( function () { + + var BlendingMode = { + NoBlending: NoBlending, + NormalBlending: NormalBlending, + AdditiveBlending: AdditiveBlending, + SubtractiveBlending: SubtractiveBlending, + MultiplyBlending: MultiplyBlending, + CustomBlending: CustomBlending + }; + + var color = new Color(); + var textureLoader = new TextureLoader(); + var materialLoader = new MaterialLoader(); + + return function createMaterial( m, texturePath, crossOrigin ) { + + // convert from old material format + + var textures = {}; + + function loadTexture( path, repeat, offset, wrap, anisotropy ) { + + var fullPath = texturePath + path; + var loader = Loader.Handlers.get( fullPath ); + + var texture; + + if ( loader !== null ) { + + texture = loader.load( fullPath ); + + } else { + + textureLoader.setCrossOrigin( crossOrigin ); + texture = textureLoader.load( fullPath ); + + } + + if ( repeat !== undefined ) { + + texture.repeat.fromArray( repeat ); + + if ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping; + if ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping; + + } + + if ( offset !== undefined ) { + + texture.offset.fromArray( offset ); + + } + + if ( wrap !== undefined ) { + + if ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping; + if ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping; + + if ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping; + if ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping; + + } + + if ( anisotropy !== undefined ) { + + texture.anisotropy = anisotropy; + + } + + var uuid = _Math.generateUUID(); + + textures[ uuid ] = texture; + + return uuid; + + } + + // + + var json = { + uuid: _Math.generateUUID(), + type: 'MeshLambertMaterial' + }; + + for ( var name in m ) { + + var value = m[ name ]; + + switch ( name ) { + + case 'DbgColor': + case 'DbgIndex': + case 'opticalDensity': + case 'illumination': + break; + case 'DbgName': + json.name = value; + break; + case 'blending': + json.blending = BlendingMode[ value ]; + break; + case 'colorAmbient': + case 'mapAmbient': + console.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' ); + break; + case 'colorDiffuse': + json.color = color.fromArray( value ).getHex(); + break; + case 'colorSpecular': + json.specular = color.fromArray( value ).getHex(); + break; + case 'colorEmissive': + json.emissive = color.fromArray( value ).getHex(); + break; + case 'specularCoef': + json.shininess = value; + break; + case 'shading': + if ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial'; + if ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial'; + if ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial'; + break; + case 'mapDiffuse': + json.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy ); + break; + case 'mapDiffuseRepeat': + case 'mapDiffuseOffset': + case 'mapDiffuseWrap': + case 'mapDiffuseAnisotropy': + break; + case 'mapEmissive': + json.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy ); + break; + case 'mapEmissiveRepeat': + case 'mapEmissiveOffset': + case 'mapEmissiveWrap': + case 'mapEmissiveAnisotropy': + break; + case 'mapLight': + json.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy ); + break; + case 'mapLightRepeat': + case 'mapLightOffset': + case 'mapLightWrap': + case 'mapLightAnisotropy': + break; + case 'mapAO': + json.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy ); + break; + case 'mapAORepeat': + case 'mapAOOffset': + case 'mapAOWrap': + case 'mapAOAnisotropy': + break; + case 'mapBump': + json.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy ); + break; + case 'mapBumpScale': + json.bumpScale = value; + break; + case 'mapBumpRepeat': + case 'mapBumpOffset': + case 'mapBumpWrap': + case 'mapBumpAnisotropy': + break; + case 'mapNormal': + json.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy ); + break; + case 'mapNormalFactor': + json.normalScale = value; + break; + case 'mapNormalRepeat': + case 'mapNormalOffset': + case 'mapNormalWrap': + case 'mapNormalAnisotropy': + break; + case 'mapSpecular': + json.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy ); + break; + case 'mapSpecularRepeat': + case 'mapSpecularOffset': + case 'mapSpecularWrap': + case 'mapSpecularAnisotropy': + break; + case 'mapMetalness': + json.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy ); + break; + case 'mapMetalnessRepeat': + case 'mapMetalnessOffset': + case 'mapMetalnessWrap': + case 'mapMetalnessAnisotropy': + break; + case 'mapRoughness': + json.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy ); + break; + case 'mapRoughnessRepeat': + case 'mapRoughnessOffset': + case 'mapRoughnessWrap': + case 'mapRoughnessAnisotropy': + break; + case 'mapAlpha': + json.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy ); + break; + case 'mapAlphaRepeat': + case 'mapAlphaOffset': + case 'mapAlphaWrap': + case 'mapAlphaAnisotropy': + break; + case 'flipSided': + json.side = BackSide; + break; + case 'doubleSided': + json.side = DoubleSide; + break; + case 'transparency': + console.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' ); + json.opacity = value; + break; + case 'depthTest': + case 'depthWrite': + case 'colorWrite': + case 'opacity': + case 'reflectivity': + case 'transparent': + case 'visible': + case 'wireframe': + json[ name ] = value; + break; + case 'vertexColors': + if ( value === true ) json.vertexColors = VertexColors; + if ( value === 'face' ) json.vertexColors = FaceColors; + break; + default: + console.error( 'THREE.Loader.createMaterial: Unsupported', name, value ); + break; + + } + + } + + if ( json.type === 'MeshBasicMaterial' ) delete json.emissive; + if ( json.type !== 'MeshPhongMaterial' ) delete json.specular; + + if ( json.opacity < 1 ) json.transparent = true; + + materialLoader.setTextures( textures ); + + return materialLoader.parse( json ); + + }; + + } )() + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function JSONLoader( manager ) { + + if ( typeof manager === 'boolean' ) { + + console.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' ); + manager = undefined; + + } + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + this.withCredentials = false; + + } + + Object.assign( JSONLoader.prototype, { + + crossOrigin: 'anonymous', + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var path = ( this.path === undefined ) ? LoaderUtils.extractUrlBase( url ) : this.path; + + var loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.setWithCredentials( this.withCredentials ); + loader.load( url, function ( text ) { + + var json = JSON.parse( text ); + var metadata = json.metadata; + + if ( metadata !== undefined ) { + + var type = metadata.type; + + if ( type !== undefined ) { + + if ( type.toLowerCase() === 'object' ) { + + console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' ); + return; + + } + + } + + } + + var object = scope.parse( json, path ); + onLoad( object.geometry, object.materials ); + + }, onProgress, onError ); + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + }, + + setResourcePath: function ( value ) { + + this.resourcePath = value; + return this; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + parse: ( function () { + + function parseModel( json, geometry ) { + + function isBitSet( value, position ) { + + return value & ( 1 << position ); + + } + + var i, j, fi, + + offset, zLength, + + colorIndex, normalIndex, uvIndex, materialIndex, + + type, + isQuad, + hasMaterial, + hasFaceVertexUv, + hasFaceNormal, hasFaceVertexNormal, + hasFaceColor, hasFaceVertexColor, + + vertex, face, faceA, faceB, hex, normal, + + uvLayer, uv, u, v, + + faces = json.faces, + vertices = json.vertices, + normals = json.normals, + colors = json.colors, + + scale = json.scale, + + nUvLayers = 0; + + + if ( json.uvs !== undefined ) { + + // disregard empty arrays + + for ( i = 0; i < json.uvs.length; i ++ ) { + + if ( json.uvs[ i ].length ) nUvLayers ++; + + } + + for ( i = 0; i < nUvLayers; i ++ ) { + + geometry.faceVertexUvs[ i ] = []; + + } + + } + + offset = 0; + zLength = vertices.length; + + while ( offset < zLength ) { + + vertex = new Vector3(); + + vertex.x = vertices[ offset ++ ] * scale; + vertex.y = vertices[ offset ++ ] * scale; + vertex.z = vertices[ offset ++ ] * scale; + + geometry.vertices.push( vertex ); + + } + + offset = 0; + zLength = faces.length; + + while ( offset < zLength ) { + + type = faces[ offset ++ ]; + + isQuad = isBitSet( type, 0 ); + hasMaterial = isBitSet( type, 1 ); + hasFaceVertexUv = isBitSet( type, 3 ); + hasFaceNormal = isBitSet( type, 4 ); + hasFaceVertexNormal = isBitSet( type, 5 ); + hasFaceColor = isBitSet( type, 6 ); + hasFaceVertexColor = isBitSet( type, 7 ); + + // console.log("type", type, "bits", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor); + + if ( isQuad ) { + + faceA = new Face3(); + faceA.a = faces[ offset ]; + faceA.b = faces[ offset + 1 ]; + faceA.c = faces[ offset + 3 ]; + + faceB = new Face3(); + faceB.a = faces[ offset + 1 ]; + faceB.b = faces[ offset + 2 ]; + faceB.c = faces[ offset + 3 ]; + + offset += 4; + + if ( hasMaterial ) { + + materialIndex = faces[ offset ++ ]; + faceA.materialIndex = materialIndex; + faceB.materialIndex = materialIndex; + + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length; + + if ( hasFaceVertexUv ) { + + for ( i = 0; i < nUvLayers; i ++ ) { + + uvLayer = json.uvs[ i ]; + + geometry.faceVertexUvs[ i ][ fi ] = []; + geometry.faceVertexUvs[ i ][ fi + 1 ] = []; + + for ( j = 0; j < 4; j ++ ) { + + uvIndex = faces[ offset ++ ]; + + u = uvLayer[ uvIndex * 2 ]; + v = uvLayer[ uvIndex * 2 + 1 ]; + + uv = new Vector2( u, v ); + + if ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv ); + if ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv ); + + } + + } + + } + + if ( hasFaceNormal ) { + + normalIndex = faces[ offset ++ ] * 3; + + faceA.normal.set( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + faceB.normal.copy( faceA.normal ); + + } + + if ( hasFaceVertexNormal ) { + + for ( i = 0; i < 4; i ++ ) { + + normalIndex = faces[ offset ++ ] * 3; + + normal = new Vector3( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + + if ( i !== 2 ) faceA.vertexNormals.push( normal ); + if ( i !== 0 ) faceB.vertexNormals.push( normal ); + + } + + } + + + if ( hasFaceColor ) { + + colorIndex = faces[ offset ++ ]; + hex = colors[ colorIndex ]; + + faceA.color.setHex( hex ); + faceB.color.setHex( hex ); + + } + + + if ( hasFaceVertexColor ) { + + for ( i = 0; i < 4; i ++ ) { + + colorIndex = faces[ offset ++ ]; + hex = colors[ colorIndex ]; + + if ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) ); + if ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) ); + + } + + } + + geometry.faces.push( faceA ); + geometry.faces.push( faceB ); + + } else { + + face = new Face3(); + face.a = faces[ offset ++ ]; + face.b = faces[ offset ++ ]; + face.c = faces[ offset ++ ]; + + if ( hasMaterial ) { + + materialIndex = faces[ offset ++ ]; + face.materialIndex = materialIndex; + + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length; + + if ( hasFaceVertexUv ) { + + for ( i = 0; i < nUvLayers; i ++ ) { + + uvLayer = json.uvs[ i ]; + + geometry.faceVertexUvs[ i ][ fi ] = []; + + for ( j = 0; j < 3; j ++ ) { + + uvIndex = faces[ offset ++ ]; + + u = uvLayer[ uvIndex * 2 ]; + v = uvLayer[ uvIndex * 2 + 1 ]; + + uv = new Vector2( u, v ); + + geometry.faceVertexUvs[ i ][ fi ].push( uv ); + + } + + } + + } + + if ( hasFaceNormal ) { + + normalIndex = faces[ offset ++ ] * 3; + + face.normal.set( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + } + + if ( hasFaceVertexNormal ) { + + for ( i = 0; i < 3; i ++ ) { + + normalIndex = faces[ offset ++ ] * 3; + + normal = new Vector3( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + face.vertexNormals.push( normal ); + + } + + } + + + if ( hasFaceColor ) { + + colorIndex = faces[ offset ++ ]; + face.color.setHex( colors[ colorIndex ] ); + + } + + + if ( hasFaceVertexColor ) { + + for ( i = 0; i < 3; i ++ ) { + + colorIndex = faces[ offset ++ ]; + face.vertexColors.push( new Color( colors[ colorIndex ] ) ); + + } + + } + + geometry.faces.push( face ); + + } + + } + + } + + function parseSkin( json, geometry ) { + + var influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2; + + if ( json.skinWeights ) { + + for ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) { + + var x = json.skinWeights[ i ]; + var y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0; + var z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0; + var w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0; + + geometry.skinWeights.push( new Vector4( x, y, z, w ) ); + + } + + } + + if ( json.skinIndices ) { + + for ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) { + + var a = json.skinIndices[ i ]; + var b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0; + var c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0; + var d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0; + + geometry.skinIndices.push( new Vector4( a, b, c, d ) ); + + } + + } + + geometry.bones = json.bones; + + if ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) { + + console.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' + + geometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' ); + + } + + } + + function parseMorphing( json, geometry ) { + + var scale = json.scale; + + if ( json.morphTargets !== undefined ) { + + for ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) { + + geometry.morphTargets[ i ] = {}; + geometry.morphTargets[ i ].name = json.morphTargets[ i ].name; + geometry.morphTargets[ i ].vertices = []; + + var dstVertices = geometry.morphTargets[ i ].vertices; + var srcVertices = json.morphTargets[ i ].vertices; + + for ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) { + + var vertex = new Vector3(); + vertex.x = srcVertices[ v ] * scale; + vertex.y = srcVertices[ v + 1 ] * scale; + vertex.z = srcVertices[ v + 2 ] * scale; + + dstVertices.push( vertex ); + + } + + } + + } + + if ( json.morphColors !== undefined && json.morphColors.length > 0 ) { + + console.warn( 'THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.' ); + + var faces = geometry.faces; + var morphColors = json.morphColors[ 0 ].colors; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + faces[ i ].color.fromArray( morphColors, i * 3 ); + + } + + } + + } + + function parseAnimations( json, geometry ) { + + var outputAnimations = []; + + // parse old style Bone/Hierarchy animations + var animations = []; + + if ( json.animation !== undefined ) { + + animations.push( json.animation ); + + } + + if ( json.animations !== undefined ) { + + if ( json.animations.length ) { + + animations = animations.concat( json.animations ); + + } else { + + animations.push( json.animations ); + + } + + } + + for ( var i = 0; i < animations.length; i ++ ) { + + var clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones ); + if ( clip ) outputAnimations.push( clip ); + + } + + // parse implicit morph animations + if ( geometry.morphTargets ) { + + // TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary. + var morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 ); + outputAnimations = outputAnimations.concat( morphAnimationClips ); + + } + + if ( outputAnimations.length > 0 ) geometry.animations = outputAnimations; + + } + + return function parse( json, path ) { + + if ( json.data !== undefined ) { + + // Geometry 4.0 spec + json = json.data; + + } + + if ( json.scale !== undefined ) { + + json.scale = 1.0 / json.scale; + + } else { + + json.scale = 1.0; + + } + + var geometry = new Geometry(); + + parseModel( json, geometry ); + parseSkin( json, geometry ); + parseMorphing( json, geometry ); + parseAnimations( json, geometry ); + + geometry.computeFaceNormals(); + geometry.computeBoundingSphere(); + + if ( json.materials === undefined || json.materials.length === 0 ) { + + return { geometry: geometry }; + + } else { + + var materials = Loader.prototype.initMaterials( json.materials, this.resourcePath || path, this.crossOrigin ); + + return { geometry: geometry, materials: materials }; + + } + + }; + + } )() + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ObjectLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + this.resourcePath = ''; + + } + + Object.assign( ObjectLoader.prototype, { + + crossOrigin: 'anonymous', + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var path = ( this.path === undefined ) ? LoaderUtils.extractUrlBase( url ) : this.path; + this.resourcePath = this.resourcePath || path; + + var loader = new FileLoader( scope.manager ); + loader.setPath( this.path ); + loader.load( url, function ( text ) { + + var json = null; + + try { + + json = JSON.parse( text ); + + } catch ( error ) { + + if ( onError !== undefined ) onError( error ); + + console.error( 'THREE:ObjectLoader: Can\'t parse ' + url + '.', error.message ); + + return; + + } + + var metadata = json.metadata; + + if ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) { + + console.error( 'THREE.ObjectLoader: Can\'t load ' + url + '. Use THREE.JSONLoader instead.' ); + return; + + } + + scope.parse( json, onLoad ); + + }, onProgress, onError ); + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + }, + + setResourcePath: function ( value ) { + + this.resourcePath = value; + return this; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + parse: function ( json, onLoad ) { + + var shapes = this.parseShape( json.shapes ); + var geometries = this.parseGeometries( json.geometries, shapes ); + + var images = this.parseImages( json.images, function () { + + if ( onLoad !== undefined ) onLoad( object ); + + } ); + + var textures = this.parseTextures( json.textures, images ); + var materials = this.parseMaterials( json.materials, textures ); + + var object = this.parseObject( json.object, geometries, materials ); + + if ( json.animations ) { + + object.animations = this.parseAnimations( json.animations ); + + } + + if ( json.images === undefined || json.images.length === 0 ) { + + if ( onLoad !== undefined ) onLoad( object ); + + } + + return object; + + }, + + parseShape: function ( json ) { + + var shapes = {}; + + if ( json !== undefined ) { + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var shape = new Shape().fromJSON( json[ i ] ); + + shapes[ shape.uuid ] = shape; + + } + + } + + return shapes; + + }, + + parseGeometries: function ( json, shapes ) { + + var geometries = {}; + + if ( json !== undefined ) { + + var geometryLoader = new JSONLoader(); + var bufferGeometryLoader = new BufferGeometryLoader(); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var geometry; + var data = json[ i ]; + + switch ( data.type ) { + + case 'PlaneGeometry': + case 'PlaneBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.width, + data.height, + data.widthSegments, + data.heightSegments + ); + + break; + + case 'BoxGeometry': + case 'BoxBufferGeometry': + case 'CubeGeometry': // backwards compatible + + geometry = new Geometries[ data.type ]( + data.width, + data.height, + data.depth, + data.widthSegments, + data.heightSegments, + data.depthSegments + ); + + break; + + case 'CircleGeometry': + case 'CircleBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.segments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'CylinderGeometry': + case 'CylinderBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radiusTop, + data.radiusBottom, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'ConeGeometry': + case 'ConeBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'SphereGeometry': + case 'SphereBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.widthSegments, + data.heightSegments, + data.phiStart, + data.phiLength, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'DodecahedronGeometry': + case 'DodecahedronBufferGeometry': + case 'IcosahedronGeometry': + case 'IcosahedronBufferGeometry': + case 'OctahedronGeometry': + case 'OctahedronBufferGeometry': + case 'TetrahedronGeometry': + case 'TetrahedronBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.detail + ); + + break; + + case 'RingGeometry': + case 'RingBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.innerRadius, + data.outerRadius, + data.thetaSegments, + data.phiSegments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'TorusGeometry': + case 'TorusBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.tube, + data.radialSegments, + data.tubularSegments, + data.arc + ); + + break; + + case 'TorusKnotGeometry': + case 'TorusKnotBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.tube, + data.tubularSegments, + data.radialSegments, + data.p, + data.q + ); + + break; + + case 'LatheGeometry': + case 'LatheBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.points, + data.segments, + data.phiStart, + data.phiLength + ); + + break; + + case 'PolyhedronGeometry': + case 'PolyhedronBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.vertices, + data.indices, + data.radius, + data.details + ); + + break; + + case 'ShapeGeometry': + case 'ShapeBufferGeometry': + + var geometryShapes = []; + + for ( var j = 0, jl = data.shapes.length; j < jl; j ++ ) { + + var shape = shapes[ data.shapes[ j ] ]; + + geometryShapes.push( shape ); + + } + + geometry = new Geometries[ data.type ]( + geometryShapes, + data.curveSegments + ); + + break; + + + case 'ExtrudeGeometry': + case 'ExtrudeBufferGeometry': + + var geometryShapes = []; + + for ( var j = 0, jl = data.shapes.length; j < jl; j ++ ) { + + var shape = shapes[ data.shapes[ j ] ]; + + geometryShapes.push( shape ); + + } + + var extrudePath = data.options.extrudePath; + + if ( extrudePath !== undefined ) { + + data.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath ); + + } + + geometry = new Geometries[ data.type ]( + geometryShapes, + data.options + ); + + break; + + case 'BufferGeometry': + + geometry = bufferGeometryLoader.parse( data ); + + break; + + case 'Geometry': + + geometry = geometryLoader.parse( data, this.resourcePath ).geometry; + + break; + + default: + + console.warn( 'THREE.ObjectLoader: Unsupported geometry type "' + data.type + '"' ); + + continue; + + } + + geometry.uuid = data.uuid; + + if ( data.name !== undefined ) geometry.name = data.name; + if ( geometry.isBufferGeometry === true && data.userData !== undefined ) geometry.userData = data.userData; + + geometries[ data.uuid ] = geometry; + + } + + } + + return geometries; + + }, + + parseMaterials: function ( json, textures ) { + + var materials = {}; + + if ( json !== undefined ) { + + var loader = new MaterialLoader(); + loader.setTextures( textures ); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var data = json[ i ]; + + if ( data.type === 'MultiMaterial' ) { + + // Deprecated + + var array = []; + + for ( var j = 0; j < data.materials.length; j ++ ) { + + array.push( loader.parse( data.materials[ j ] ) ); + + } + + materials[ data.uuid ] = array; + + } else { + + materials[ data.uuid ] = loader.parse( data ); + + } + + } + + } + + return materials; + + }, + + parseAnimations: function ( json ) { + + var animations = []; + + for ( var i = 0; i < json.length; i ++ ) { + + var data = json[ i ]; + + var clip = AnimationClip.parse( data ); + + if ( data.uuid !== undefined ) clip.uuid = data.uuid; + + animations.push( clip ); + + } + + return animations; + + }, + + parseImages: function ( json, onLoad ) { + + var scope = this; + var images = {}; + + function loadImage( url ) { + + scope.manager.itemStart( url ); + + return loader.load( url, function () { + + scope.manager.itemEnd( url ); + + }, undefined, function () { + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + } ); + + } + + if ( json !== undefined && json.length > 0 ) { + + var manager = new LoadingManager( onLoad ); + + var loader = new ImageLoader( manager ); + loader.setCrossOrigin( this.crossOrigin ); + + for ( var i = 0, il = json.length; i < il; i ++ ) { + + var image = json[ i ]; + var url = image.url; + + if ( Array.isArray( url ) ) { + + // load array of images e.g CubeTexture + + images[ image.uuid ] = []; + + for ( var j = 0, jl = url.length; j < jl; j ++ ) { + + var currentUrl = url[ j ]; + + var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( currentUrl ) ? currentUrl : scope.resourcePath + currentUrl; + + images[ image.uuid ].push( loadImage( path ) ); + + } + + } else { + + // load single image + + var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( image.url ) ? image.url : scope.resourcePath + image.url; + + images[ image.uuid ] = loadImage( path ); + + } + + } + + } + + return images; + + }, + + parseTextures: function ( json, images ) { + + function parseConstant( value, type ) { + + if ( typeof value === 'number' ) return value; + + console.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value ); + + return type[ value ]; + + } + + var textures = {}; + + if ( json !== undefined ) { + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var data = json[ i ]; + + if ( data.image === undefined ) { + + console.warn( 'THREE.ObjectLoader: No "image" specified for', data.uuid ); + + } + + if ( images[ data.image ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined image', data.image ); + + } + + var texture; + + if ( Array.isArray( images[ data.image ] ) ) { + + texture = new CubeTexture( images[ data.image ] ); + + } else { + + texture = new Texture( images[ data.image ] ); + + } + + texture.needsUpdate = true; + + texture.uuid = data.uuid; + + if ( data.name !== undefined ) texture.name = data.name; + + if ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING ); + + if ( data.offset !== undefined ) texture.offset.fromArray( data.offset ); + if ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat ); + if ( data.center !== undefined ) texture.center.fromArray( data.center ); + if ( data.rotation !== undefined ) texture.rotation = data.rotation; + + if ( data.wrap !== undefined ) { + + texture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING ); + texture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING ); + + } + + if ( data.format !== undefined ) texture.format = data.format; + + if ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER ); + if ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER ); + if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy; + + if ( data.flipY !== undefined ) texture.flipY = data.flipY; + + textures[ data.uuid ] = texture; + + } + + } + + return textures; + + }, + + parseObject: function ( data, geometries, materials ) { + + var object; + + function getGeometry( name ) { + + if ( geometries[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined geometry', name ); + + } + + return geometries[ name ]; + + } + + function getMaterial( name ) { + + if ( name === undefined ) return undefined; + + if ( Array.isArray( name ) ) { + + var array = []; + + for ( var i = 0, l = name.length; i < l; i ++ ) { + + var uuid = name[ i ]; + + if ( materials[ uuid ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', uuid ); + + } + + array.push( materials[ uuid ] ); + + } + + return array; + + } + + if ( materials[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', name ); + + } + + return materials[ name ]; + + } + + switch ( data.type ) { + + case 'Scene': + + object = new Scene(); + + if ( data.background !== undefined ) { + + if ( Number.isInteger( data.background ) ) { + + object.background = new Color( data.background ); + + } + + } + + if ( data.fog !== undefined ) { + + if ( data.fog.type === 'Fog' ) { + + object.fog = new Fog( data.fog.color, data.fog.near, data.fog.far ); + + } else if ( data.fog.type === 'FogExp2' ) { + + object.fog = new FogExp2( data.fog.color, data.fog.density ); + + } + + } + + break; + + case 'PerspectiveCamera': + + object = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far ); + + if ( data.focus !== undefined ) object.focus = data.focus; + if ( data.zoom !== undefined ) object.zoom = data.zoom; + if ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge; + if ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset; + if ( data.view !== undefined ) object.view = Object.assign( {}, data.view ); + + break; + + case 'OrthographicCamera': + + object = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far ); + + if ( data.zoom !== undefined ) object.zoom = data.zoom; + if ( data.view !== undefined ) object.view = Object.assign( {}, data.view ); + + break; + + case 'AmbientLight': + + object = new AmbientLight( data.color, data.intensity ); + + break; + + case 'DirectionalLight': + + object = new DirectionalLight( data.color, data.intensity ); + + break; + + case 'PointLight': + + object = new PointLight( data.color, data.intensity, data.distance, data.decay ); + + break; + + case 'RectAreaLight': + + object = new RectAreaLight( data.color, data.intensity, data.width, data.height ); + + break; + + case 'SpotLight': + + object = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay ); + + break; + + case 'HemisphereLight': + + object = new HemisphereLight( data.color, data.groundColor, data.intensity ); + + break; + + case 'SkinnedMesh': + + console.warn( 'THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.' ); + + case 'Mesh': + + var geometry = getGeometry( data.geometry ); + var material = getMaterial( data.material ); + + if ( geometry.bones && geometry.bones.length > 0 ) { + + object = new SkinnedMesh( geometry, material ); + + } else { + + object = new Mesh( geometry, material ); + + } + + break; + + case 'LOD': + + object = new LOD(); + + break; + + case 'Line': + + object = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode ); + + break; + + case 'LineLoop': + + object = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'LineSegments': + + object = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'PointCloud': + case 'Points': + + object = new Points( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'Sprite': + + object = new Sprite( getMaterial( data.material ) ); + + break; + + case 'Group': + + object = new Group(); + + break; + + default: + + object = new Object3D(); + + } + + object.uuid = data.uuid; + + if ( data.name !== undefined ) object.name = data.name; + + if ( data.matrix !== undefined ) { + + object.matrix.fromArray( data.matrix ); + + if ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate; + if ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale ); + + } else { + + if ( data.position !== undefined ) object.position.fromArray( data.position ); + if ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation ); + if ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion ); + if ( data.scale !== undefined ) object.scale.fromArray( data.scale ); + + } + + if ( data.castShadow !== undefined ) object.castShadow = data.castShadow; + if ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow; + + if ( data.shadow ) { + + if ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias; + if ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius; + if ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize ); + if ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera ); + + } + + if ( data.visible !== undefined ) object.visible = data.visible; + if ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled; + if ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder; + if ( data.userData !== undefined ) object.userData = data.userData; + if ( data.layers !== undefined ) object.layers.mask = data.layers; + + if ( data.children !== undefined ) { + + var children = data.children; + + for ( var i = 0; i < children.length; i ++ ) { + + object.add( this.parseObject( children[ i ], geometries, materials ) ); + + } + + } + + if ( data.type === 'LOD' ) { + + var levels = data.levels; + + for ( var l = 0; l < levels.length; l ++ ) { + + var level = levels[ l ]; + var child = object.getObjectByProperty( 'uuid', level.object ); + + if ( child !== undefined ) { + + object.addLevel( child, level.distance ); + + } + + } + + } + + return object; + + } + + } ); + + var TEXTURE_MAPPING = { + UVMapping: UVMapping, + CubeReflectionMapping: CubeReflectionMapping, + CubeRefractionMapping: CubeRefractionMapping, + EquirectangularReflectionMapping: EquirectangularReflectionMapping, + EquirectangularRefractionMapping: EquirectangularRefractionMapping, + SphericalReflectionMapping: SphericalReflectionMapping, + CubeUVReflectionMapping: CubeUVReflectionMapping, + CubeUVRefractionMapping: CubeUVRefractionMapping + }; + + var TEXTURE_WRAPPING = { + RepeatWrapping: RepeatWrapping, + ClampToEdgeWrapping: ClampToEdgeWrapping, + MirroredRepeatWrapping: MirroredRepeatWrapping + }; + + var TEXTURE_FILTER = { + NearestFilter: NearestFilter, + NearestMipMapNearestFilter: NearestMipMapNearestFilter, + NearestMipMapLinearFilter: NearestMipMapLinearFilter, + LinearFilter: LinearFilter, + LinearMipMapNearestFilter: LinearMipMapNearestFilter, + LinearMipMapLinearFilter: LinearMipMapLinearFilter + }; + + /** + * @author thespite / http://clicktorelease.com/ + */ + + + function ImageBitmapLoader( manager ) { + + if ( typeof createImageBitmap === 'undefined' ) { + + console.warn( 'THREE.ImageBitmapLoader: createImageBitmap() not supported.' ); + + } + + if ( typeof fetch === 'undefined' ) { + + console.warn( 'THREE.ImageBitmapLoader: fetch() not supported.' ); + + } + + this.manager = manager !== undefined ? manager : DefaultLoadingManager; + this.options = undefined; + + } + + ImageBitmapLoader.prototype = { + + constructor: ImageBitmapLoader, + + setOptions: function setOptions( options ) { + + this.options = options; + + return this; + + }, + + load: function ( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + url = this.manager.resolveURL( url ); + + var scope = this; + + var cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + fetch( url ).then( function ( res ) { + + return res.blob(); + + } ).then( function ( blob ) { + + return createImageBitmap( blob, scope.options ); + + } ).then( function ( imageBitmap ) { + + Cache.add( url, imageBitmap ); + + if ( onLoad ) onLoad( imageBitmap ); + + scope.manager.itemEnd( url ); + + } ).catch( function ( e ) { + + if ( onError ) onError( e ); + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + } ); + + }, + + setCrossOrigin: function ( /* value */ ) { + + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * minimal class for proxing functions to Path. Replaces old "extractSubpaths()" + **/ + + function ShapePath() { + + this.type = 'ShapePath'; + + this.color = new Color(); + + this.subPaths = []; + this.currentPath = null; + + } + + Object.assign( ShapePath.prototype, { + + moveTo: function ( x, y ) { + + this.currentPath = new Path(); + this.subPaths.push( this.currentPath ); + this.currentPath.moveTo( x, y ); + + }, + + lineTo: function ( x, y ) { + + this.currentPath.lineTo( x, y ); + + }, + + quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) { + + this.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY ); + + }, + + bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + + this.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ); + + }, + + splineThru: function ( pts ) { + + this.currentPath.splineThru( pts ); + + }, + + toShapes: function ( isCCW, noHoles ) { + + function toShapesNoHoles( inSubpaths ) { + + var shapes = []; + + for ( var i = 0, l = inSubpaths.length; i < l; i ++ ) { + + var tmpPath = inSubpaths[ i ]; + + var tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + + shapes.push( tmpShape ); + + } + + return shapes; + + } + + function isPointInsidePolygon( inPt, inPolygon ) { + + var polyLen = inPolygon.length; + + // inPt on polygon contour => immediate success or + // toggling of inside/outside at every single! intersection point of an edge + // with the horizontal line through inPt, left of inPt + // not counting lowerY endpoints of edges and whole edges on that line + var inside = false; + for ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) { + + var edgeLowPt = inPolygon[ p ]; + var edgeHighPt = inPolygon[ q ]; + + var edgeDx = edgeHighPt.x - edgeLowPt.x; + var edgeDy = edgeHighPt.y - edgeLowPt.y; + + if ( Math.abs( edgeDy ) > Number.EPSILON ) { + + // not parallel + if ( edgeDy < 0 ) { + + edgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx; + edgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy; + + } + if ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) continue; + + if ( inPt.y === edgeLowPt.y ) { + + if ( inPt.x === edgeLowPt.x ) return true; // inPt is on contour ? + // continue; // no intersection or edgeLowPt => doesn't count !!! + + } else { + + var perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y ); + if ( perpEdge === 0 ) return true; // inPt is on contour ? + if ( perpEdge < 0 ) continue; + inside = ! inside; // true intersection left of inPt + + } + + } else { + + // parallel or collinear + if ( inPt.y !== edgeLowPt.y ) continue; // parallel + // edge lies on the same horizontal line as inPt + if ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) || + ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) ) return true; // inPt: Point on contour ! + // continue; + + } + + } + + return inside; + + } + + var isClockWise = ShapeUtils.isClockWise; + + var subPaths = this.subPaths; + if ( subPaths.length === 0 ) return []; + + if ( noHoles === true ) return toShapesNoHoles( subPaths ); + + + var solid, tmpPath, tmpShape, shapes = []; + + if ( subPaths.length === 1 ) { + + tmpPath = subPaths[ 0 ]; + tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + shapes.push( tmpShape ); + return shapes; + + } + + var holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() ); + holesFirst = isCCW ? ! holesFirst : holesFirst; + + // console.log("Holes first", holesFirst); + + var betterShapeHoles = []; + var newShapes = []; + var newShapeHoles = []; + var mainIdx = 0; + var tmpPoints; + + newShapes[ mainIdx ] = undefined; + newShapeHoles[ mainIdx ] = []; + + for ( var i = 0, l = subPaths.length; i < l; i ++ ) { + + tmpPath = subPaths[ i ]; + tmpPoints = tmpPath.getPoints(); + solid = isClockWise( tmpPoints ); + solid = isCCW ? ! solid : solid; + + if ( solid ) { + + if ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) ) mainIdx ++; + + newShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints }; + newShapes[ mainIdx ].s.curves = tmpPath.curves; + + if ( holesFirst ) mainIdx ++; + newShapeHoles[ mainIdx ] = []; + + //console.log('cw', i); + + } else { + + newShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } ); + + //console.log('ccw', i); + + } + + } + + // only Holes? -> probably all Shapes with wrong orientation + if ( ! newShapes[ 0 ] ) return toShapesNoHoles( subPaths ); + + + if ( newShapes.length > 1 ) { + + var ambiguous = false; + var toChange = []; + + for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + betterShapeHoles[ sIdx ] = []; + + } + + for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + var sho = newShapeHoles[ sIdx ]; + + for ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) { + + var ho = sho[ hIdx ]; + var hole_unassigned = true; + + for ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) { + + if ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) { + + if ( sIdx !== s2Idx ) toChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } ); + if ( hole_unassigned ) { + + hole_unassigned = false; + betterShapeHoles[ s2Idx ].push( ho ); + + } else { + + ambiguous = true; + + } + + } + + } + if ( hole_unassigned ) { + + betterShapeHoles[ sIdx ].push( ho ); + + } + + } + + } + // console.log("ambiguous: ", ambiguous); + if ( toChange.length > 0 ) { + + // console.log("to change: ", toChange); + if ( ! ambiguous ) newShapeHoles = betterShapeHoles; + + } + + } + + var tmpHoles; + + for ( var i = 0, il = newShapes.length; i < il; i ++ ) { + + tmpShape = newShapes[ i ].s; + shapes.push( tmpShape ); + tmpHoles = newShapeHoles[ i ]; + + for ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) { + + tmpShape.holes.push( tmpHoles[ j ].h ); + + } + + } + + //console.log("shape", shapes); + + return shapes; + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author mrdoob / http://mrdoob.com/ + */ + + + function Font( data ) { + + this.type = 'Font'; + + this.data = data; + + } + + Object.assign( Font.prototype, { + + isFont: true, + + generateShapes: function ( text, size ) { + + if ( size === undefined ) size = 100; + + var shapes = []; + var paths = createPaths( text, size, this.data ); + + for ( var p = 0, pl = paths.length; p < pl; p ++ ) { + + Array.prototype.push.apply( shapes, paths[ p ].toShapes() ); + + } + + return shapes; + + } + + } ); + + function createPaths( text, size, data ) { + + var chars = Array.from ? Array.from( text ) : String( text ).split( '' ); // see #13988 + var scale = size / data.resolution; + var line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale; + + var paths = []; + + var offsetX = 0, offsetY = 0; + + for ( var i = 0; i < chars.length; i ++ ) { + + var char = chars[ i ]; + + if ( char === '\n' ) { + + offsetX = 0; + offsetY -= line_height; + + } else { + + var ret = createPath( char, scale, offsetX, offsetY, data ); + offsetX += ret.offsetX; + paths.push( ret.path ); + + } + + } + + return paths; + + } + + function createPath( char, scale, offsetX, offsetY, data ) { + + var glyph = data.glyphs[ char ] || data.glyphs[ '?' ]; + + if ( ! glyph ) return; + + var path = new ShapePath(); + + var x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2; + + if ( glyph.o ) { + + var outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) ); + + for ( var i = 0, l = outline.length; i < l; ) { + + var action = outline[ i ++ ]; + + switch ( action ) { + + case 'm': // moveTo + + x = outline[ i ++ ] * scale + offsetX; + y = outline[ i ++ ] * scale + offsetY; + + path.moveTo( x, y ); + + break; + + case 'l': // lineTo + + x = outline[ i ++ ] * scale + offsetX; + y = outline[ i ++ ] * scale + offsetY; + + path.lineTo( x, y ); + + break; + + case 'q': // quadraticCurveTo + + cpx = outline[ i ++ ] * scale + offsetX; + cpy = outline[ i ++ ] * scale + offsetY; + cpx1 = outline[ i ++ ] * scale + offsetX; + cpy1 = outline[ i ++ ] * scale + offsetY; + + path.quadraticCurveTo( cpx1, cpy1, cpx, cpy ); + + break; + + case 'b': // bezierCurveTo + + 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; + + path.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy ); + + break; + + } + + } + + } + + return { offsetX: glyph.ha * scale, path: path }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function FontLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( FontLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.load( url, function ( text ) { + + var json; + + try { + + json = JSON.parse( text ); + + } catch ( e ) { + + console.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' ); + json = JSON.parse( text.substring( 65, text.length - 2 ) ); + + } + + var font = scope.parse( json ); + + if ( onLoad ) onLoad( font ); + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + return new Font( json ); + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var context; + + var AudioContext = { + + getContext: function () { + + if ( context === undefined ) { + + context = new ( window.AudioContext || window.webkitAudioContext )(); + + } + + return context; + + }, + + setContext: function ( value ) { + + context = value; + + } + + }; + + /** + * @author Reece Aaron Lecrivain / http://reecenotes.com/ + */ + + function AudioLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( AudioLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var loader = new FileLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + loader.setPath( this.path ); + loader.load( url, function ( buffer ) { + + // Create a copy of the buffer. The `decodeAudioData` method + // detaches the buffer when complete, preventing reuse. + var bufferCopy = buffer.slice( 0 ); + + var context = AudioContext.getContext(); + context.decodeAudioData( bufferCopy, function ( audioBuffer ) { + + onLoad( audioBuffer ); + + } ); + + }, onProgress, onError ); + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function StereoCamera() { + + this.type = 'StereoCamera'; + + this.aspect = 1; + + this.eyeSep = 0.064; + + this.cameraL = new PerspectiveCamera(); + this.cameraL.layers.enable( 1 ); + this.cameraL.matrixAutoUpdate = false; + + this.cameraR = new PerspectiveCamera(); + this.cameraR.layers.enable( 2 ); + this.cameraR.matrixAutoUpdate = false; + + } + + Object.assign( StereoCamera.prototype, { + + update: ( function () { + + var instance, focus, fov, aspect, near, far, zoom, eyeSep; + + var eyeRight = new Matrix4(); + var eyeLeft = new Matrix4(); + + return function update( camera ) { + + var needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov || + aspect !== camera.aspect * this.aspect || near !== camera.near || + far !== camera.far || zoom !== camera.zoom || eyeSep !== this.eyeSep; + + if ( needsUpdate ) { + + instance = this; + focus = camera.focus; + fov = camera.fov; + aspect = camera.aspect * this.aspect; + near = camera.near; + far = camera.far; + zoom = camera.zoom; + + // Off-axis stereoscopic effect based on + // http://paulbourke.net/stereographics/stereorender/ + + var projectionMatrix = camera.projectionMatrix.clone(); + eyeSep = this.eyeSep / 2; + var eyeSepOnProjection = eyeSep * near / focus; + var ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom; + var xmin, xmax; + + // translate xOffset + + eyeLeft.elements[ 12 ] = - eyeSep; + eyeRight.elements[ 12 ] = eyeSep; + + // 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 ); + + this.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 ); + + this.cameraR.projectionMatrix.copy( projectionMatrix ); + + } + + this.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft ); + this.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight ); + + }; + + } )() + + } ); + + /** + * Camera for rendering cube maps + * - renders scene into axis-aligned cube + * + * @author alteredq / http://alteredqualia.com/ + */ + + function CubeCamera( near, far, cubeResolution, options ) { + + Object3D.call( this ); + + this.type = 'CubeCamera'; + + var fov = 90, aspect = 1; + + var cameraPX = new PerspectiveCamera( fov, aspect, near, far ); + cameraPX.up.set( 0, - 1, 0 ); + cameraPX.lookAt( new Vector3( 1, 0, 0 ) ); + this.add( cameraPX ); + + var cameraNX = new PerspectiveCamera( fov, aspect, near, far ); + cameraNX.up.set( 0, - 1, 0 ); + cameraNX.lookAt( new Vector3( - 1, 0, 0 ) ); + this.add( cameraNX ); + + var cameraPY = new PerspectiveCamera( fov, aspect, near, far ); + cameraPY.up.set( 0, 0, 1 ); + cameraPY.lookAt( new Vector3( 0, 1, 0 ) ); + this.add( cameraPY ); + + var cameraNY = new PerspectiveCamera( fov, aspect, near, far ); + cameraNY.up.set( 0, 0, - 1 ); + cameraNY.lookAt( new Vector3( 0, - 1, 0 ) ); + this.add( cameraNY ); + + var cameraPZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraPZ.up.set( 0, - 1, 0 ); + cameraPZ.lookAt( new Vector3( 0, 0, 1 ) ); + this.add( cameraPZ ); + + var cameraNZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraNZ.up.set( 0, - 1, 0 ); + cameraNZ.lookAt( new Vector3( 0, 0, - 1 ) ); + this.add( cameraNZ ); + + options = options || { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter }; + + this.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options ); + this.renderTarget.texture.name = "CubeCamera"; + + this.update = function ( renderer, scene ) { + + if ( this.parent === null ) this.updateMatrixWorld(); + + var renderTarget = this.renderTarget; + var generateMipmaps = renderTarget.texture.generateMipmaps; + + renderTarget.texture.generateMipmaps = false; + + renderTarget.activeCubeFace = 0; + renderer.render( scene, cameraPX, renderTarget ); + + renderTarget.activeCubeFace = 1; + renderer.render( scene, cameraNX, renderTarget ); + + renderTarget.activeCubeFace = 2; + renderer.render( scene, cameraPY, renderTarget ); + + renderTarget.activeCubeFace = 3; + renderer.render( scene, cameraNY, renderTarget ); + + renderTarget.activeCubeFace = 4; + renderer.render( scene, cameraPZ, renderTarget ); + + renderTarget.texture.generateMipmaps = generateMipmaps; + + renderTarget.activeCubeFace = 5; + renderer.render( scene, cameraNZ, renderTarget ); + + renderer.setRenderTarget( null ); + + }; + + this.clear = function ( renderer, color, depth, stencil ) { + + var renderTarget = this.renderTarget; + + for ( var i = 0; i < 6; i ++ ) { + + renderTarget.activeCubeFace = i; + renderer.setRenderTarget( renderTarget ); + + renderer.clear( color, depth, stencil ); + + } + + renderer.setRenderTarget( null ); + + }; + + } + + CubeCamera.prototype = Object.create( Object3D.prototype ); + CubeCamera.prototype.constructor = CubeCamera; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AudioListener() { + + Object3D.call( this ); + + this.type = 'AudioListener'; + + this.context = AudioContext.getContext(); + + this.gain = this.context.createGain(); + this.gain.connect( this.context.destination ); + + this.filter = null; + + } + + AudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: AudioListener, + + getInput: function () { + + return this.gain; + + }, + + removeFilter: function ( ) { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + this.gain.connect( this.context.destination ); + this.filter = null; + + } + + return this; + + }, + + getFilter: function () { + + return this.filter; + + }, + + setFilter: function ( value ) { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + + } else { + + this.gain.disconnect( this.context.destination ); + + } + + this.filter = value; + this.gain.connect( this.filter ); + this.filter.connect( this.context.destination ); + + return this; + + }, + + getMasterVolume: function () { + + return this.gain.gain.value; + + }, + + setMasterVolume: function ( value ) { + + this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 ); + + return this; + + }, + + updateMatrixWorld: ( function () { + + var position = new Vector3(); + var quaternion = new Quaternion(); + var scale = new Vector3(); + + var orientation = new Vector3(); + + return function updateMatrixWorld( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + var listener = this.context.listener; + var up = this.up; + + this.matrixWorld.decompose( position, quaternion, scale ); + + orientation.set( 0, 0, - 1 ).applyQuaternion( quaternion ); + + if ( listener.positionX ) { + + listener.positionX.setValueAtTime( position.x, this.context.currentTime ); + listener.positionY.setValueAtTime( position.y, this.context.currentTime ); + listener.positionZ.setValueAtTime( position.z, this.context.currentTime ); + listener.forwardX.setValueAtTime( orientation.x, this.context.currentTime ); + listener.forwardY.setValueAtTime( orientation.y, this.context.currentTime ); + listener.forwardZ.setValueAtTime( orientation.z, this.context.currentTime ); + listener.upX.setValueAtTime( up.x, this.context.currentTime ); + listener.upY.setValueAtTime( up.y, this.context.currentTime ); + listener.upZ.setValueAtTime( up.z, this.context.currentTime ); + + } else { + + listener.setPosition( position.x, position.y, position.z ); + listener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z ); + + } + + }; + + } )() + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Reece Aaron Lecrivain / http://reecenotes.com/ + */ + + function Audio( listener ) { + + Object3D.call( this ); + + this.type = 'Audio'; + + this.context = listener.context; + + this.gain = this.context.createGain(); + this.gain.connect( listener.getInput() ); + + this.autoplay = false; + + this.buffer = null; + this.loop = false; + this.startTime = 0; + this.offset = 0; + this.playbackRate = 1; + this.isPlaying = false; + this.hasPlaybackControl = true; + this.sourceType = 'empty'; + + this.filters = []; + + } + + Audio.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Audio, + + getOutput: function () { + + return this.gain; + + }, + + setNodeSource: function ( audioNode ) { + + this.hasPlaybackControl = false; + this.sourceType = 'audioNode'; + this.source = audioNode; + this.connect(); + + return this; + + }, + + setMediaElementSource: function ( mediaElement ) { + + this.hasPlaybackControl = false; + this.sourceType = 'mediaNode'; + this.source = this.context.createMediaElementSource( mediaElement ); + this.connect(); + + return this; + + }, + + setBuffer: function ( audioBuffer ) { + + this.buffer = audioBuffer; + this.sourceType = 'buffer'; + + if ( this.autoplay ) this.play(); + + return this; + + }, + + play: function () { + + if ( this.isPlaying === true ) { + + console.warn( 'THREE.Audio: Audio is already playing.' ); + return; + + } + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + var source = this.context.createBufferSource(); + + source.buffer = this.buffer; + source.loop = this.loop; + source.onended = this.onEnded.bind( this ); + source.playbackRate.setValueAtTime( this.playbackRate, this.startTime ); + this.startTime = this.context.currentTime; + source.start( this.startTime, this.offset ); + + this.isPlaying = true; + + this.source = source; + + return this.connect(); + + }, + + pause: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + if ( this.isPlaying === true ) { + + this.source.stop(); + this.source.onended = null; + this.offset += ( this.context.currentTime - this.startTime ) * this.playbackRate; + this.isPlaying = false; + + } + + return this; + + }, + + stop: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.source.stop(); + this.source.onended = null; + this.offset = 0; + this.isPlaying = false; + + return this; + + }, + + connect: function () { + + if ( this.filters.length > 0 ) { + + this.source.connect( this.filters[ 0 ] ); + + for ( var i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].connect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].connect( this.getOutput() ); + + } else { + + this.source.connect( this.getOutput() ); + + } + + return this; + + }, + + disconnect: function () { + + if ( this.filters.length > 0 ) { + + this.source.disconnect( this.filters[ 0 ] ); + + for ( var i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].disconnect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].disconnect( this.getOutput() ); + + } else { + + this.source.disconnect( this.getOutput() ); + + } + + return this; + + }, + + getFilters: function () { + + return this.filters; + + }, + + setFilters: function ( value ) { + + if ( ! value ) value = []; + + if ( this.isPlaying === true ) { + + this.disconnect(); + this.filters = value; + this.connect(); + + } else { + + this.filters = value; + + } + + return this; + + }, + + getFilter: function () { + + return this.getFilters()[ 0 ]; + + }, + + setFilter: function ( filter ) { + + return this.setFilters( filter ? [ filter ] : [] ); + + }, + + setPlaybackRate: function ( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.playbackRate = value; + + if ( this.isPlaying === true ) { + + this.source.playbackRate.setValueAtTime( this.playbackRate, this.context.currentTime ); + + } + + return this; + + }, + + getPlaybackRate: function () { + + return this.playbackRate; + + }, + + onEnded: function () { + + this.isPlaying = false; + + }, + + getLoop: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return false; + + } + + return this.loop; + + }, + + setLoop: function ( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.loop = value; + + if ( this.isPlaying === true ) { + + this.source.loop = this.loop; + + } + + return this; + + }, + + getVolume: function () { + + return this.gain.gain.value; + + }, + + setVolume: function ( value ) { + + this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 ); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function PositionalAudio( listener ) { + + Audio.call( this, listener ); + + this.panner = this.context.createPanner(); + this.panner.connect( this.gain ); + + } + + PositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), { + + constructor: PositionalAudio, + + getOutput: function () { + + return this.panner; + + }, + + getRefDistance: function () { + + return this.panner.refDistance; + + }, + + setRefDistance: function ( value ) { + + this.panner.refDistance = value; + + return this; + + }, + + getRolloffFactor: function () { + + return this.panner.rolloffFactor; + + }, + + setRolloffFactor: function ( value ) { + + this.panner.rolloffFactor = value; + + return this; + + }, + + getDistanceModel: function () { + + return this.panner.distanceModel; + + }, + + setDistanceModel: function ( value ) { + + this.panner.distanceModel = value; + + return this; + + }, + + getMaxDistance: function () { + + return this.panner.maxDistance; + + }, + + setMaxDistance: function ( value ) { + + this.panner.maxDistance = value; + + return this; + + }, + + setDirectionalCone: function ( coneInnerAngle, coneOuterAngle, coneOuterGain ) { + + this.panner.coneInnerAngle = coneInnerAngle; + this.panner.coneOuterAngle = coneOuterAngle; + this.panner.coneOuterGain = coneOuterGain; + + return this; + + }, + + updateMatrixWorld: ( function () { + + var position = new Vector3(); + var quaternion = new Quaternion(); + var scale = new Vector3(); + + var orientation = new Vector3(); + + return function updateMatrixWorld( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + var panner = this.panner; + this.matrixWorld.decompose( position, quaternion, scale ); + + orientation.set( 0, 0, 1 ).applyQuaternion( quaternion ); + + panner.setPosition( position.x, position.y, position.z ); + panner.setOrientation( orientation.x, orientation.y, orientation.z ); + + }; + + } )() + + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AudioAnalyser( audio, fftSize ) { + + this.analyser = audio.context.createAnalyser(); + this.analyser.fftSize = fftSize !== undefined ? fftSize : 2048; + + this.data = new Uint8Array( this.analyser.frequencyBinCount ); + + audio.getOutput().connect( this.analyser ); + + } + + Object.assign( AudioAnalyser.prototype, { + + getFrequencyData: function () { + + this.analyser.getByteFrequencyData( this.data ); + + return this.data; + + }, + + getAverageFrequency: function () { + + var value = 0, data = this.getFrequencyData(); + + for ( var i = 0; i < data.length; i ++ ) { + + value += data[ i ]; + + } + + return value / data.length; + + } + + } ); + + /** + * + * Buffered scene graph property that allows weighted accumulation. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function PropertyMixer( binding, typeName, valueSize ) { + + this.binding = binding; + this.valueSize = valueSize; + + var bufferType = Float64Array, + mixFunction; + + switch ( typeName ) { + + case 'quaternion': + mixFunction = this._slerp; + break; + + case 'string': + case 'bool': + bufferType = Array; + mixFunction = this._select; + break; + + default: + mixFunction = this._lerp; + + } + + this.buffer = new bufferType( valueSize * 4 ); + // layout: [ incoming | accu0 | accu1 | orig ] + // + // interpolators can use .buffer as their .result + // the data then goes to 'incoming' + // + // 'accu0' and 'accu1' are used frame-interleaved for + // the cumulative result and are compared to detect + // changes + // + // 'orig' stores the original state of the property + + this._mixBufferRegion = mixFunction; + + this.cumulativeWeight = 0; + + this.useCount = 0; + this.referenceCount = 0; + + } + + Object.assign( PropertyMixer.prototype, { + + // accumulate data in the 'incoming' region into 'accu' + accumulate: function ( accuIndex, weight ) { + + // note: happily accumulating nothing when weight = 0, the caller knows + // the weight and shouldn't have made the call in the first place + + var buffer = this.buffer, + stride = this.valueSize, + offset = accuIndex * stride + stride, + + currentWeight = this.cumulativeWeight; + + if ( currentWeight === 0 ) { + + // accuN := incoming * weight + + for ( var i = 0; i !== stride; ++ i ) { + + buffer[ offset + i ] = buffer[ i ]; + + } + + currentWeight = weight; + + } else { + + // accuN := accuN + incoming * weight + + currentWeight += weight; + var mix = weight / currentWeight; + this._mixBufferRegion( buffer, offset, 0, mix, stride ); + + } + + this.cumulativeWeight = currentWeight; + + }, + + // apply the state of 'accu' to the binding when accus differ + apply: function ( accuIndex ) { + + var stride = this.valueSize, + buffer = this.buffer, + offset = accuIndex * stride + stride, + + weight = this.cumulativeWeight, + + binding = this.binding; + + this.cumulativeWeight = 0; + + if ( weight < 1 ) { + + // accuN := accuN + original * ( 1 - cumulativeWeight ) + + var originalValueOffset = stride * 3; + + this._mixBufferRegion( + buffer, offset, originalValueOffset, 1 - weight, stride ); + + } + + for ( var i = stride, e = stride + stride; i !== e; ++ i ) { + + if ( buffer[ i ] !== buffer[ i + stride ] ) { + + // value has changed -> update scene graph + + binding.setValue( buffer, offset ); + break; + + } + + } + + }, + + // remember the state of the bound property and copy it to both accus + saveOriginalState: function () { + + var binding = this.binding; + + var buffer = this.buffer, + stride = this.valueSize, + + originalValueOffset = stride * 3; + + binding.getValue( buffer, originalValueOffset ); + + // accu[0..1] := orig -- initially detect changes against the original + for ( var i = stride, e = originalValueOffset; i !== e; ++ i ) { + + buffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ]; + + } + + this.cumulativeWeight = 0; + + }, + + // apply the state previously taken via 'saveOriginalState' to the binding + restoreOriginalState: function () { + + var originalValueOffset = this.valueSize * 3; + this.binding.setValue( this.buffer, originalValueOffset ); + + }, + + + // mix functions + + _select: function ( buffer, dstOffset, srcOffset, t, stride ) { + + if ( t >= 0.5 ) { + + for ( var i = 0; i !== stride; ++ i ) { + + buffer[ dstOffset + i ] = buffer[ srcOffset + i ]; + + } + + } + + }, + + _slerp: function ( buffer, dstOffset, srcOffset, t ) { + + Quaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t ); + + }, + + _lerp: function ( buffer, dstOffset, srcOffset, t, stride ) { + + var s = 1 - t; + + for ( var i = 0; i !== stride; ++ i ) { + + var j = dstOffset + i; + + buffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t; + + } + + } + + } ); + + /** + * + * A reference to a real property in the scene graph. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + // Characters [].:/ are reserved for track binding syntax. + var RESERVED_CHARS_RE = '\\[\\]\\.:\\/'; + + function Composite( targetGroup, path, optionalParsedPath ) { + + var parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path ); + + this._targetGroup = targetGroup; + this._bindings = targetGroup.subscribe_( path, parsedPath ); + + } + + Object.assign( Composite.prototype, { + + getValue: function ( array, offset ) { + + this.bind(); // bind all binding + + var firstValidIndex = this._targetGroup.nCachedObjects_, + binding = this._bindings[ firstValidIndex ]; + + // and only call .getValue on the first + if ( binding !== undefined ) binding.getValue( array, offset ); + + }, + + setValue: function ( array, offset ) { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].setValue( array, offset ); + + } + + }, + + bind: function () { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].bind(); + + } + + }, + + unbind: function () { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].unbind(); + + } + + } + + } ); + + + function PropertyBinding( rootNode, path, parsedPath ) { + + this.path = path; + this.parsedPath = parsedPath || PropertyBinding.parseTrackName( path ); + + this.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ) || rootNode; + + this.rootNode = rootNode; + + } + + Object.assign( PropertyBinding, { + + Composite: Composite, + + create: function ( root, path, parsedPath ) { + + if ( ! ( root && root.isAnimationObjectGroup ) ) { + + return new PropertyBinding( root, path, parsedPath ); + + } else { + + return new PropertyBinding.Composite( root, path, parsedPath ); + + } + + }, + + /** + * Replaces spaces with underscores and removes unsupported characters from + * node names, to ensure compatibility with parseTrackName(). + * + * @param {string} name Node name to be sanitized. + * @return {string} + */ + sanitizeNodeName: ( function () { + + var reservedRe = new RegExp( '[' + RESERVED_CHARS_RE + ']', 'g' ); + + return function sanitizeNodeName( name ) { + + return name.replace( /\s/g, '_' ).replace( reservedRe, '' ); + + }; + + }() ), + + parseTrackName: function () { + + // Attempts to allow node names from any language. ES5's `\w` regexp matches + // only latin characters, and the unicode \p{L} is not yet supported. So + // instead, we exclude reserved characters and match everything else. + var wordChar = '[^' + RESERVED_CHARS_RE + ']'; + var wordCharOrDot = '[^' + RESERVED_CHARS_RE.replace( '\\.', '' ) + ']'; + + // Parent directories, delimited by '/' or ':'. Currently unused, but must + // be matched to parse the rest of the track name. + var directoryRe = /((?:WC+[\/:])*)/.source.replace( 'WC', wordChar ); + + // Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'. + var nodeRe = /(WCOD+)?/.source.replace( 'WCOD', wordCharOrDot ); + + // Object on target node, and accessor. May not contain reserved + // characters. Accessor may contain any character except closing bracket. + var objectRe = /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace( 'WC', wordChar ); + + // Property and accessor. May not contain reserved characters. Accessor may + // contain any non-bracket characters. + var propertyRe = /\.(WC+)(?:\[(.+)\])?/.source.replace( 'WC', wordChar ); + + var trackRe = new RegExp( '' + + '^' + + directoryRe + + nodeRe + + objectRe + + propertyRe + + '$' + ); + + var supportedObjectNames = [ 'material', 'materials', 'bones' ]; + + return function parseTrackName( trackName ) { + + var matches = trackRe.exec( trackName ); + + if ( ! matches ) { + + throw new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName ); + + } + + var results = { + // directoryName: matches[ 1 ], // (tschw) currently unused + nodeName: matches[ 2 ], + objectName: matches[ 3 ], + objectIndex: matches[ 4 ], + propertyName: matches[ 5 ], // required + propertyIndex: matches[ 6 ] + }; + + var lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' ); + + if ( lastDot !== undefined && lastDot !== - 1 ) { + + var objectName = results.nodeName.substring( lastDot + 1 ); + + // Object names must be checked against a whitelist. Otherwise, there + // is no way to parse 'foo.bar.baz': 'baz' must be a property, but + // 'bar' could be the objectName, or part of a nodeName (which can + // include '.' characters). + if ( supportedObjectNames.indexOf( objectName ) !== - 1 ) { + + results.nodeName = results.nodeName.substring( 0, lastDot ); + results.objectName = objectName; + + } + + } + + if ( results.propertyName === null || results.propertyName.length === 0 ) { + + throw new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName ); + + } + + return results; + + }; + + }(), + + findNode: function ( root, nodeName ) { + + if ( ! nodeName || nodeName === "" || nodeName === "root" || nodeName === "." || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) { + + return root; + + } + + // search into skeleton bones. + if ( root.skeleton ) { + + var bone = root.skeleton.getBoneByName( nodeName ); + + if ( bone !== undefined ) { + + return bone; + + } + + } + + // search into node subtree. + if ( root.children ) { + + var searchNodeSubtree = function ( children ) { + + for ( var i = 0; i < children.length; i ++ ) { + + var childNode = children[ i ]; + + if ( childNode.name === nodeName || childNode.uuid === nodeName ) { + + return childNode; + + } + + var result = searchNodeSubtree( childNode.children ); + + if ( result ) return result; + + } + + return null; + + }; + + var subTreeNode = searchNodeSubtree( root.children ); + + if ( subTreeNode ) { + + return subTreeNode; + + } + + } + + return null; + + } + + } ); + + Object.assign( PropertyBinding.prototype, { // prototype, continued + + // these are used to "bind" a nonexistent property + _getValue_unavailable: function () {}, + _setValue_unavailable: function () {}, + + BindingType: { + Direct: 0, + EntireArray: 1, + ArrayElement: 2, + HasFromToArray: 3 + }, + + Versioning: { + None: 0, + NeedsUpdate: 1, + MatrixWorldNeedsUpdate: 2 + }, + + GetterByBindingType: [ + + function getValue_direct( buffer, offset ) { + + buffer[ offset ] = this.node[ this.propertyName ]; + + }, + + function getValue_array( buffer, offset ) { + + var source = this.resolvedProperty; + + for ( var i = 0, n = source.length; i !== n; ++ i ) { + + buffer[ offset ++ ] = source[ i ]; + + } + + }, + + function getValue_arrayElement( buffer, offset ) { + + buffer[ offset ] = this.resolvedProperty[ this.propertyIndex ]; + + }, + + function getValue_toArray( buffer, offset ) { + + this.resolvedProperty.toArray( buffer, offset ); + + } + + ], + + SetterByBindingTypeAndVersioning: [ + + [ + // Direct + + function setValue_direct( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + + }, + + function setValue_direct_setNeedsUpdate( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + }, + + function setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // EntireArray + + function setValue_array( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + }, + + function setValue_array_setNeedsUpdate( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.needsUpdate = true; + + }, + + function setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // ArrayElement + + function setValue_arrayElement( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + + }, + + function setValue_arrayElement_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + }, + + function setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // HasToFromArray + + function setValue_fromArray( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + + }, + + function setValue_fromArray_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.needsUpdate = true; + + }, + + function setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ] + + ], + + getValue: function getValue_unbound( targetArray, offset ) { + + this.bind(); + this.getValue( targetArray, offset ); + + // Note: This class uses a State pattern on a per-method basis: + // 'bind' sets 'this.getValue' / 'setValue' and shadows the + // prototype version of these methods with one that represents + // the bound state. When the property is not found, the methods + // become no-ops. + + }, + + setValue: function getValue_unbound( sourceArray, offset ) { + + this.bind(); + this.setValue( sourceArray, offset ); + + }, + + // create getter / setter pair for a property in the scene graph + bind: function () { + + var targetObject = this.node, + parsedPath = this.parsedPath, + + objectName = parsedPath.objectName, + propertyName = parsedPath.propertyName, + propertyIndex = parsedPath.propertyIndex; + + if ( ! targetObject ) { + + targetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName ) || this.rootNode; + + this.node = targetObject; + + } + + // set fail state so we can just 'return' on error + this.getValue = this._getValue_unavailable; + this.setValue = this._setValue_unavailable; + + // ensure there is a value node + if ( ! targetObject ) { + + console.error( 'THREE.PropertyBinding: Trying to update node for track: ' + this.path + ' but it wasn\'t found.' ); + return; + + } + + if ( objectName ) { + + var objectIndex = parsedPath.objectIndex; + + // special cases were we need to reach deeper into the hierarchy to get the face materials.... + switch ( objectName ) { + + case 'materials': + + if ( ! targetObject.material ) { + + console.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this ); + return; + + } + + if ( ! targetObject.material.materials ) { + + console.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this ); + return; + + } + + targetObject = targetObject.material.materials; + + break; + + case 'bones': + + if ( ! targetObject.skeleton ) { + + console.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this ); + return; + + } + + // potential future optimization: skip this if propertyIndex is already an integer + // and convert the integer string to a true integer. + + targetObject = targetObject.skeleton.bones; + + // support resolving morphTarget names into indices. + for ( var i = 0; i < targetObject.length; i ++ ) { + + if ( targetObject[ i ].name === objectIndex ) { + + objectIndex = i; + break; + + } + + } + + break; + + default: + + if ( targetObject[ objectName ] === undefined ) { + + console.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this ); + return; + + } + + targetObject = targetObject[ objectName ]; + + } + + + if ( objectIndex !== undefined ) { + + if ( targetObject[ objectIndex ] === undefined ) { + + console.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject ); + return; + + } + + targetObject = targetObject[ objectIndex ]; + + } + + } + + // resolve property + var nodeProperty = targetObject[ propertyName ]; + + if ( nodeProperty === undefined ) { + + var nodeName = parsedPath.nodeName; + + console.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName + + '.' + propertyName + ' but it wasn\'t found.', targetObject ); + return; + + } + + // determine versioning scheme + var versioning = this.Versioning.None; + + this.targetObject = targetObject; + + if ( targetObject.needsUpdate !== undefined ) { // material + + versioning = this.Versioning.NeedsUpdate; + + } else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform + + versioning = this.Versioning.MatrixWorldNeedsUpdate; + + } + + // determine how the property gets bound + var bindingType = this.BindingType.Direct; + + if ( propertyIndex !== undefined ) { + + // access a sub element of the property array (only primitives are supported right now) + + if ( propertyName === "morphTargetInfluences" ) { + + // potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer. + + // support resolving morphTarget names into indices. + if ( ! targetObject.geometry ) { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this ); + return; + + } + + if ( targetObject.geometry.isBufferGeometry ) { + + if ( ! targetObject.geometry.morphAttributes ) { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this ); + return; + + } + + for ( var i = 0; i < this.node.geometry.morphAttributes.position.length; i ++ ) { + + if ( targetObject.geometry.morphAttributes.position[ i ].name === propertyIndex ) { + + propertyIndex = i; + break; + + } + + } + + + } else { + + if ( ! targetObject.geometry.morphTargets ) { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.', this ); + return; + + } + + for ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) { + + if ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) { + + propertyIndex = i; + break; + + } + + } + + } + + } + + bindingType = this.BindingType.ArrayElement; + + this.resolvedProperty = nodeProperty; + this.propertyIndex = propertyIndex; + + } else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) { + + // must use copy for Object3D.Euler/Quaternion + + bindingType = this.BindingType.HasFromToArray; + + this.resolvedProperty = nodeProperty; + + } else if ( Array.isArray( nodeProperty ) ) { + + bindingType = this.BindingType.EntireArray; + + this.resolvedProperty = nodeProperty; + + } else { + + this.propertyName = propertyName; + + } + + // select getter / setter + this.getValue = this.GetterByBindingType[ bindingType ]; + this.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ]; + + }, + + unbind: function () { + + this.node = null; + + // back to the prototype version of getValue / setValue + // note: avoiding to mutate the shape of 'this' via 'delete' + this.getValue = this._getValue_unbound; + this.setValue = this._setValue_unbound; + + } + + } ); + + //!\ DECLARE ALIAS AFTER assign prototype ! + Object.assign( PropertyBinding.prototype, { + + // initial state of these methods that calls 'bind' + _getValue_unbound: PropertyBinding.prototype.getValue, + _setValue_unbound: PropertyBinding.prototype.setValue, + + } ); + + /** + * + * A group of objects that receives a shared animation state. + * + * Usage: + * + * - Add objects you would otherwise pass as 'root' to the + * constructor or the .clipAction method of AnimationMixer. + * + * - Instead pass this object as 'root'. + * + * - You can also add and remove objects later when the mixer + * is running. + * + * Note: + * + * Objects of this class appear as one object to the mixer, + * so cache control of the individual objects must be done + * on the group. + * + * Limitation: + * + * - The animated properties must be compatible among the + * all objects in the group. + * + * - A single property can either be controlled through a + * target group or directly, but not both. + * + * @author tschw + */ + + function AnimationObjectGroup() { + + this.uuid = _Math.generateUUID(); + + // cached objects followed by the active ones + this._objects = Array.prototype.slice.call( arguments ); + + this.nCachedObjects_ = 0; // threshold + // note: read by PropertyBinding.Composite + + var indices = {}; + this._indicesByUUID = indices; // for bookkeeping + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + indices[ arguments[ i ].uuid ] = i; + + } + + this._paths = []; // inside: string + this._parsedPaths = []; // inside: { we don't care, here } + this._bindings = []; // inside: Array< PropertyBinding > + this._bindingsIndicesByPath = {}; // inside: indices in these arrays + + var scope = this; + + this.stats = { + + objects: { + get total() { + + return scope._objects.length; + + }, + get inUse() { + + return this.total - scope.nCachedObjects_; + + } + }, + get bindingsPerObject() { + + return scope._bindings.length; + + } + + }; + + } + + Object.assign( AnimationObjectGroup.prototype, { + + isAnimationObjectGroup: true, + + add: function () { + + var objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + nBindings = bindings.length, + knownObject = undefined; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index === undefined ) { + + // unknown object -> add it to the ACTIVE region + + index = nObjects ++; + indicesByUUID[ uuid ] = index; + objects.push( object ); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + bindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) ); + + } + + } else if ( index < nCachedObjects ) { + + knownObject = objects[ index ]; + + // move existing object to the ACTIVE region + + var firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ]; + + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + indicesByUUID[ uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ], + binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = lastCached; + + if ( binding === undefined ) { + + // since we do not bother to create new bindings + // for objects that are cached, the binding may + // or may not exist + + binding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ); + + } + + bindingsForPath[ firstActiveIndex ] = binding; + + } + + } else if ( objects[ index ] !== knownObject ) { + + console.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID ' + + 'detected. Clean the caches or recreate your infrastructure when reloading scenes.' ); + + } // else the object is already where we want it to be + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + remove: function () { + + var objects = this._objects, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined && index >= nCachedObjects ) { + + // move existing object into the CACHED region + + var lastCachedIndex = nCachedObjects ++, + firstActiveObject = objects[ lastCachedIndex ]; + + indicesByUUID[ firstActiveObject.uuid ] = index; + objects[ index ] = firstActiveObject; + + indicesByUUID[ uuid ] = lastCachedIndex; + objects[ lastCachedIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + firstActive = bindingsForPath[ lastCachedIndex ], + binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = firstActive; + bindingsForPath[ lastCachedIndex ] = binding; + + } + + } + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + // remove & forget + uncache: function () { + + var objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined ) { + + delete indicesByUUID[ uuid ]; + + if ( index < nCachedObjects ) { + + // object is cached, shrink the CACHED region + + var firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ], + lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + // last cached object takes this object's place + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + // last object goes to the activated slot and pop + indicesByUUID[ lastObject.uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ], + last = bindingsForPath[ lastIndex ]; + + bindingsForPath[ index ] = lastCached; + bindingsForPath[ firstActiveIndex ] = last; + bindingsForPath.pop(); + + } + + } else { + + // object is active, just swap with the last and pop + + var lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + indicesByUUID[ lastObject.uuid ] = index; + objects[ index ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ]; + + bindingsForPath[ index ] = bindingsForPath[ lastIndex ]; + bindingsForPath.pop(); + + } + + } // cached or active + + } // if object is known + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + // Internal interface used by befriended PropertyBinding.Composite: + + subscribe_: function ( path, parsedPath ) { + + // returns an array of bindings for the given path that is changed + // according to the contained objects in the group + + var indicesByPath = this._bindingsIndicesByPath, + index = indicesByPath[ path ], + bindings = this._bindings; + + if ( index !== undefined ) return bindings[ index ]; + + var paths = this._paths, + parsedPaths = this._parsedPaths, + objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + bindingsForPath = new Array( nObjects ); + + index = bindings.length; + + indicesByPath[ path ] = index; + + paths.push( path ); + parsedPaths.push( parsedPath ); + bindings.push( bindingsForPath ); + + for ( var i = nCachedObjects, n = objects.length; i !== n; ++ i ) { + + var object = objects[ i ]; + bindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath ); + + } + + return bindingsForPath; + + }, + + unsubscribe_: function ( path ) { + + // tells the group to forget about a property path and no longer + // update the array previously obtained with 'subscribe_' + + var indicesByPath = this._bindingsIndicesByPath, + index = indicesByPath[ path ]; + + if ( index !== undefined ) { + + var paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + lastBindingsIndex = bindings.length - 1, + lastBindings = bindings[ lastBindingsIndex ], + lastBindingsPath = path[ lastBindingsIndex ]; + + indicesByPath[ lastBindingsPath ] = index; + + bindings[ index ] = lastBindings; + bindings.pop(); + + parsedPaths[ index ] = parsedPaths[ lastBindingsIndex ]; + parsedPaths.pop(); + + paths[ index ] = paths[ lastBindingsIndex ]; + paths.pop(); + + } + + } + + } ); + + /** + * + * Action provided by AnimationMixer for scheduling clip playback on specific + * objects. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + * + */ + + function AnimationAction( mixer, clip, localRoot ) { + + this._mixer = mixer; + this._clip = clip; + this._localRoot = localRoot || null; + + var tracks = clip.tracks, + nTracks = tracks.length, + interpolants = new Array( nTracks ); + + var interpolantSettings = { + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + }; + + for ( var i = 0; i !== nTracks; ++ i ) { + + var interpolant = tracks[ i ].createInterpolant( null ); + interpolants[ i ] = interpolant; + interpolant.settings = interpolantSettings; + + } + + this._interpolantSettings = interpolantSettings; + + this._interpolants = interpolants; // bound by the mixer + + // inside: PropertyMixer (managed by the mixer) + this._propertyBindings = new Array( nTracks ); + + this._cacheIndex = null; // for the memory manager + this._byClipCacheIndex = null; // for the memory manager + + this._timeScaleInterpolant = null; + this._weightInterpolant = null; + + this.loop = LoopRepeat; + this._loopCount = - 1; + + // global mixer time when the action is to be started + // it's set back to 'null' upon start of the action + this._startTime = null; + + // scaled local time of the action + // gets clamped or wrapped to 0..clip.duration according to loop + this.time = 0; + + this.timeScale = 1; + this._effectiveTimeScale = 1; + + this.weight = 1; + this._effectiveWeight = 1; + + this.repetitions = Infinity; // no. of repetitions when looping + + this.paused = false; // true -> zero effective time scale + this.enabled = true; // false -> zero effective weight + + this.clampWhenFinished = false; // keep feeding the last frame? + + this.zeroSlopeAtStart = true; // for smooth interpolation w/o separate + this.zeroSlopeAtEnd = true; // clips for start, loop and end + + } + + Object.assign( AnimationAction.prototype, { + + // State & Scheduling + + play: function () { + + this._mixer._activateAction( this ); + + return this; + + }, + + stop: function () { + + this._mixer._deactivateAction( this ); + + return this.reset(); + + }, + + reset: function () { + + this.paused = false; + this.enabled = true; + + this.time = 0; // restart clip + this._loopCount = - 1; // forget previous loops + this._startTime = null; // forget scheduling + + return this.stopFading().stopWarping(); + + }, + + isRunning: function () { + + return this.enabled && ! this.paused && this.timeScale !== 0 && + this._startTime === null && this._mixer._isActiveAction( this ); + + }, + + // return true when play has been called + isScheduled: function () { + + return this._mixer._isActiveAction( this ); + + }, + + startAt: function ( time ) { + + this._startTime = time; + + return this; + + }, + + setLoop: function ( mode, repetitions ) { + + this.loop = mode; + this.repetitions = repetitions; + + return this; + + }, + + // Weight + + // set the weight stopping any scheduled fading + // although .enabled = false yields an effective weight of zero, this + // method does *not* change .enabled, because it would be confusing + setEffectiveWeight: function ( weight ) { + + this.weight = weight; + + // note: same logic as when updated at runtime + this._effectiveWeight = this.enabled ? weight : 0; + + return this.stopFading(); + + }, + + // return the weight considering fading and .enabled + getEffectiveWeight: function () { + + return this._effectiveWeight; + + }, + + fadeIn: function ( duration ) { + + return this._scheduleFading( duration, 0, 1 ); + + }, + + fadeOut: function ( duration ) { + + return this._scheduleFading( duration, 1, 0 ); + + }, + + crossFadeFrom: function ( fadeOutAction, duration, warp ) { + + fadeOutAction.fadeOut( duration ); + this.fadeIn( duration ); + + if ( warp ) { + + var fadeInDuration = this._clip.duration, + fadeOutDuration = fadeOutAction._clip.duration, + + startEndRatio = fadeOutDuration / fadeInDuration, + endStartRatio = fadeInDuration / fadeOutDuration; + + fadeOutAction.warp( 1.0, startEndRatio, duration ); + this.warp( endStartRatio, 1.0, duration ); + + } + + return this; + + }, + + crossFadeTo: function ( fadeInAction, duration, warp ) { + + return fadeInAction.crossFadeFrom( this, duration, warp ); + + }, + + stopFading: function () { + + var weightInterpolant = this._weightInterpolant; + + if ( weightInterpolant !== null ) { + + this._weightInterpolant = null; + this._mixer._takeBackControlInterpolant( weightInterpolant ); + + } + + return this; + + }, + + // Time Scale Control + + // set the time scale stopping any scheduled warping + // although .paused = true yields an effective time scale of zero, this + // method does *not* change .paused, because it would be confusing + setEffectiveTimeScale: function ( timeScale ) { + + this.timeScale = timeScale; + this._effectiveTimeScale = this.paused ? 0 : timeScale; + + return this.stopWarping(); + + }, + + // return the time scale considering warping and .paused + getEffectiveTimeScale: function () { + + return this._effectiveTimeScale; + + }, + + setDuration: function ( duration ) { + + this.timeScale = this._clip.duration / duration; + + return this.stopWarping(); + + }, + + syncWith: function ( action ) { + + this.time = action.time; + this.timeScale = action.timeScale; + + return this.stopWarping(); + + }, + + halt: function ( duration ) { + + return this.warp( this._effectiveTimeScale, 0, duration ); + + }, + + warp: function ( startTimeScale, endTimeScale, duration ) { + + var mixer = this._mixer, now = mixer.time, + interpolant = this._timeScaleInterpolant, + + timeScale = this.timeScale; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(); + this._timeScaleInterpolant = interpolant; + + } + + var times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; + times[ 1 ] = now + duration; + + values[ 0 ] = startTimeScale / timeScale; + values[ 1 ] = endTimeScale / timeScale; + + return this; + + }, + + stopWarping: function () { + + var timeScaleInterpolant = this._timeScaleInterpolant; + + if ( timeScaleInterpolant !== null ) { + + this._timeScaleInterpolant = null; + this._mixer._takeBackControlInterpolant( timeScaleInterpolant ); + + } + + return this; + + }, + + // Object Accessors + + getMixer: function () { + + return this._mixer; + + }, + + getClip: function () { + + return this._clip; + + }, + + getRoot: function () { + + return this._localRoot || this._mixer._root; + + }, + + // Interna + + _update: function ( time, deltaTime, timeDirection, accuIndex ) { + + // called by the mixer + + if ( ! this.enabled ) { + + // call ._updateWeight() to update ._effectiveWeight + + this._updateWeight( time ); + return; + + } + + var startTime = this._startTime; + + if ( startTime !== null ) { + + // check for scheduled start of action + + var timeRunning = ( time - startTime ) * timeDirection; + if ( timeRunning < 0 || timeDirection === 0 ) { + + return; // yet to come / don't decide when delta = 0 + + } + + // start + + this._startTime = null; // unschedule + deltaTime = timeDirection * timeRunning; + + } + + // apply time scale and advance time + + deltaTime *= this._updateTimeScale( time ); + var clipTime = this._updateTime( deltaTime ); + + // note: _updateTime may disable the action resulting in + // an effective weight of 0 + + var weight = this._updateWeight( time ); + + if ( weight > 0 ) { + + var interpolants = this._interpolants; + var propertyMixers = this._propertyBindings; + + for ( var j = 0, m = interpolants.length; j !== m; ++ j ) { + + interpolants[ j ].evaluate( clipTime ); + propertyMixers[ j ].accumulate( accuIndex, weight ); + + } + + } + + }, + + _updateWeight: function ( time ) { + + var weight = 0; + + if ( this.enabled ) { + + weight = this.weight; + var interpolant = this._weightInterpolant; + + if ( interpolant !== null ) { + + var interpolantValue = interpolant.evaluate( time )[ 0 ]; + + weight *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopFading(); + + if ( interpolantValue === 0 ) { + + // faded out, disable + this.enabled = false; + + } + + } + + } + + } + + this._effectiveWeight = weight; + return weight; + + }, + + _updateTimeScale: function ( time ) { + + var timeScale = 0; + + if ( ! this.paused ) { + + timeScale = this.timeScale; + + var interpolant = this._timeScaleInterpolant; + + if ( interpolant !== null ) { + + var interpolantValue = interpolant.evaluate( time )[ 0 ]; + + timeScale *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopWarping(); + + if ( timeScale === 0 ) { + + // motion has halted, pause + this.paused = true; + + } else { + + // warp done - apply final time scale + this.timeScale = timeScale; + + } + + } + + } + + } + + this._effectiveTimeScale = timeScale; + return timeScale; + + }, + + _updateTime: function ( deltaTime ) { + + var time = this.time + deltaTime; + var duration = this._clip.duration; + var loop = this.loop; + var loopCount = this._loopCount; + + var pingPong = ( loop === LoopPingPong ); + + if ( deltaTime === 0 ) { + + if ( loopCount === - 1 ) return time; + + return ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time; + + } + + if ( loop === LoopOnce ) { + + if ( loopCount === - 1 ) { + + // just started + + this._loopCount = 0; + this._setEndings( true, true, false ); + + } + + handle_stop: { + + if ( time >= duration ) { + + time = duration; + + } else if ( time < 0 ) { + + time = 0; + + } else break handle_stop; + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime < 0 ? - 1 : 1 + } ); + + } + + } else { // repetitive Repeat or PingPong + + if ( loopCount === - 1 ) { + + // just started + + if ( deltaTime >= 0 ) { + + loopCount = 0; + + this._setEndings( true, this.repetitions === 0, pingPong ); + + } else { + + // when looping in reverse direction, the initial + // transition through zero counts as a repetition, + // so leave loopCount at -1 + + this._setEndings( this.repetitions === 0, true, pingPong ); + + } + + } + + if ( time >= duration || time < 0 ) { + + // wrap around + + var loopDelta = Math.floor( time / duration ); // signed + time -= duration * loopDelta; + + loopCount += Math.abs( loopDelta ); + + var pending = this.repetitions - loopCount; + + if ( pending <= 0 ) { + + // have to stop (switch state, clamp time, fire event) + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + time = deltaTime > 0 ? duration : 0; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime > 0 ? 1 : - 1 + } ); + + } else { + + // keep running + + if ( pending === 1 ) { + + // entering the last round + + var atStart = deltaTime < 0; + this._setEndings( atStart, ! atStart, pingPong ); + + } else { + + this._setEndings( false, false, pingPong ); + + } + + this._loopCount = loopCount; + + this._mixer.dispatchEvent( { + type: 'loop', action: this, loopDelta: loopDelta + } ); + + } + + } + + if ( pingPong && ( loopCount & 1 ) === 1 ) { + + // invert time for the "pong round" + + this.time = time; + return duration - time; + + } + + } + + this.time = time; + return time; + + }, + + _setEndings: function ( atStart, atEnd, pingPong ) { + + var settings = this._interpolantSettings; + + if ( pingPong ) { + + settings.endingStart = ZeroSlopeEnding; + settings.endingEnd = ZeroSlopeEnding; + + } else { + + // assuming for LoopOnce atStart == atEnd == true + + if ( atStart ) { + + settings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingStart = WrapAroundEnding; + + } + + if ( atEnd ) { + + settings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingEnd = WrapAroundEnding; + + } + + } + + }, + + _scheduleFading: function ( duration, weightNow, weightThen ) { + + var mixer = this._mixer, now = mixer.time, + interpolant = this._weightInterpolant; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(); + this._weightInterpolant = interpolant; + + } + + var times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; values[ 0 ] = weightNow; + times[ 1 ] = now + duration; values[ 1 ] = weightThen; + + return this; + + } + + } ); + + /** + * + * Player for AnimationClips. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function AnimationMixer( root ) { + + this._root = root; + this._initMemoryManager(); + this._accuIndex = 0; + + this.time = 0; + + this.timeScale = 1.0; + + } + + AnimationMixer.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: AnimationMixer, + + _bindAction: function ( action, prototypeAction ) { + + var root = action._localRoot || this._root, + tracks = action._clip.tracks, + nTracks = tracks.length, + bindings = action._propertyBindings, + interpolants = action._interpolants, + rootUuid = root.uuid, + bindingsByRoot = this._bindingsByRootAndName, + bindingsByName = bindingsByRoot[ rootUuid ]; + + if ( bindingsByName === undefined ) { + + bindingsByName = {}; + bindingsByRoot[ rootUuid ] = bindingsByName; + + } + + for ( var i = 0; i !== nTracks; ++ i ) { + + var track = tracks[ i ], + trackName = track.name, + binding = bindingsByName[ trackName ]; + + if ( binding !== undefined ) { + + bindings[ i ] = binding; + + } else { + + binding = bindings[ i ]; + + if ( binding !== undefined ) { + + // existing binding, make sure the cache knows + + if ( binding._cacheIndex === null ) { + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + } + + continue; + + } + + var path = prototypeAction && prototypeAction. + _propertyBindings[ i ].binding.parsedPath; + + binding = new PropertyMixer( + PropertyBinding.create( root, trackName, path ), + track.ValueTypeName, track.getValueSize() ); + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + bindings[ i ] = binding; + + } + + interpolants[ i ].resultBuffer = binding.buffer; + + } + + }, + + _activateAction: function ( action ) { + + if ( ! this._isActiveAction( action ) ) { + + if ( action._cacheIndex === null ) { + + // this action has been forgotten by the cache, but the user + // appears to be still using it -> rebind + + var rootUuid = ( action._localRoot || this._root ).uuid, + clipUuid = action._clip.uuid, + actionsForClip = this._actionsByClip[ clipUuid ]; + + this._bindAction( action, + actionsForClip && actionsForClip.knownActions[ 0 ] ); + + this._addInactiveAction( action, clipUuid, rootUuid ); + + } + + var bindings = action._propertyBindings; + + // increment reference counts / sort out state + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( binding.useCount ++ === 0 ) { + + this._lendBinding( binding ); + binding.saveOriginalState(); + + } + + } + + this._lendAction( action ); + + } + + }, + + _deactivateAction: function ( action ) { + + if ( this._isActiveAction( action ) ) { + + var bindings = action._propertyBindings; + + // decrement reference counts / sort out state + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( -- binding.useCount === 0 ) { + + binding.restoreOriginalState(); + this._takeBackBinding( binding ); + + } + + } + + this._takeBackAction( action ); + + } + + }, + + // Memory manager + + _initMemoryManager: function () { + + this._actions = []; // 'nActiveActions' followed by inactive ones + this._nActiveActions = 0; + + this._actionsByClip = {}; + // inside: + // { + // knownActions: Array< AnimationAction > - used as prototypes + // actionByRoot: AnimationAction - lookup + // } + + + this._bindings = []; // 'nActiveBindings' followed by inactive ones + this._nActiveBindings = 0; + + this._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer > + + + this._controlInterpolants = []; // same game as above + this._nActiveControlInterpolants = 0; + + var scope = this; + + this.stats = { + + actions: { + get total() { + + return scope._actions.length; + + }, + get inUse() { + + return scope._nActiveActions; + + } + }, + bindings: { + get total() { + + return scope._bindings.length; + + }, + get inUse() { + + return scope._nActiveBindings; + + } + }, + controlInterpolants: { + get total() { + + return scope._controlInterpolants.length; + + }, + get inUse() { + + return scope._nActiveControlInterpolants; + + } + } + + }; + + }, + + // Memory management for AnimationAction objects + + _isActiveAction: function ( action ) { + + var index = action._cacheIndex; + return index !== null && index < this._nActiveActions; + + }, + + _addInactiveAction: function ( action, clipUuid, rootUuid ) { + + var actions = this._actions, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip === undefined ) { + + actionsForClip = { + + knownActions: [ action ], + actionByRoot: {} + + }; + + action._byClipCacheIndex = 0; + + actionsByClip[ clipUuid ] = actionsForClip; + + } else { + + var knownActions = actionsForClip.knownActions; + + action._byClipCacheIndex = knownActions.length; + knownActions.push( action ); + + } + + action._cacheIndex = actions.length; + actions.push( action ); + + actionsForClip.actionByRoot[ rootUuid ] = action; + + }, + + _removeInactiveAction: function ( action ) { + + var actions = this._actions, + lastInactiveAction = actions[ actions.length - 1 ], + cacheIndex = action._cacheIndex; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + action._cacheIndex = null; + + + var clipUuid = action._clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ], + knownActionsForClip = actionsForClip.knownActions, + + lastKnownAction = + knownActionsForClip[ knownActionsForClip.length - 1 ], + + byClipCacheIndex = action._byClipCacheIndex; + + lastKnownAction._byClipCacheIndex = byClipCacheIndex; + knownActionsForClip[ byClipCacheIndex ] = lastKnownAction; + knownActionsForClip.pop(); + + action._byClipCacheIndex = null; + + + var actionByRoot = actionsForClip.actionByRoot, + rootUuid = ( action._localRoot || this._root ).uuid; + + delete actionByRoot[ rootUuid ]; + + if ( knownActionsForClip.length === 0 ) { + + delete actionsByClip[ clipUuid ]; + + } + + this._removeInactiveBindingsForAction( action ); + + }, + + _removeInactiveBindingsForAction: function ( action ) { + + var bindings = action._propertyBindings; + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( -- binding.referenceCount === 0 ) { + + this._removeInactiveBinding( binding ); + + } + + } + + }, + + _lendAction: function ( action ) { + + // [ active actions | inactive actions ] + // [ active actions >| inactive actions ] + // s a + // <-swap-> + // a s + + var actions = this._actions, + prevIndex = action._cacheIndex, + + lastActiveIndex = this._nActiveActions ++, + + firstInactiveAction = actions[ lastActiveIndex ]; + + action._cacheIndex = lastActiveIndex; + actions[ lastActiveIndex ] = action; + + firstInactiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = firstInactiveAction; + + }, + + _takeBackAction: function ( action ) { + + // [ active actions | inactive actions ] + // [ active actions |< inactive actions ] + // a s + // <-swap-> + // s a + + var actions = this._actions, + prevIndex = action._cacheIndex, + + firstInactiveIndex = -- this._nActiveActions, + + lastActiveAction = actions[ firstInactiveIndex ]; + + action._cacheIndex = firstInactiveIndex; + actions[ firstInactiveIndex ] = action; + + lastActiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = lastActiveAction; + + }, + + // Memory management for PropertyMixer objects + + _addInactiveBinding: function ( binding, rootUuid, trackName ) { + + var bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ], + + bindings = this._bindings; + + if ( bindingByName === undefined ) { + + bindingByName = {}; + bindingsByRoot[ rootUuid ] = bindingByName; + + } + + bindingByName[ trackName ] = binding; + + binding._cacheIndex = bindings.length; + bindings.push( binding ); + + }, + + _removeInactiveBinding: function ( binding ) { + + var bindings = this._bindings, + propBinding = binding.binding, + rootUuid = propBinding.rootNode.uuid, + trackName = propBinding.path, + bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ], + + lastInactiveBinding = bindings[ bindings.length - 1 ], + cacheIndex = binding._cacheIndex; + + lastInactiveBinding._cacheIndex = cacheIndex; + bindings[ cacheIndex ] = lastInactiveBinding; + bindings.pop(); + + delete bindingByName[ trackName ]; + + remove_empty_map: { + + for ( var _ in bindingByName ) break remove_empty_map; // eslint-disable-line no-unused-vars + + delete bindingsByRoot[ rootUuid ]; + + } + + }, + + _lendBinding: function ( binding ) { + + var bindings = this._bindings, + prevIndex = binding._cacheIndex, + + lastActiveIndex = this._nActiveBindings ++, + + firstInactiveBinding = bindings[ lastActiveIndex ]; + + binding._cacheIndex = lastActiveIndex; + bindings[ lastActiveIndex ] = binding; + + firstInactiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = firstInactiveBinding; + + }, + + _takeBackBinding: function ( binding ) { + + var bindings = this._bindings, + prevIndex = binding._cacheIndex, + + firstInactiveIndex = -- this._nActiveBindings, + + lastActiveBinding = bindings[ firstInactiveIndex ]; + + binding._cacheIndex = firstInactiveIndex; + bindings[ firstInactiveIndex ] = binding; + + lastActiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = lastActiveBinding; + + }, + + + // Memory management of Interpolants for weight and time scale + + _lendControlInterpolant: function () { + + var interpolants = this._controlInterpolants, + lastActiveIndex = this._nActiveControlInterpolants ++, + interpolant = interpolants[ lastActiveIndex ]; + + if ( interpolant === undefined ) { + + interpolant = new LinearInterpolant( + new Float32Array( 2 ), new Float32Array( 2 ), + 1, this._controlInterpolantsResultBuffer ); + + interpolant.__cacheIndex = lastActiveIndex; + interpolants[ lastActiveIndex ] = interpolant; + + } + + return interpolant; + + }, + + _takeBackControlInterpolant: function ( interpolant ) { + + var interpolants = this._controlInterpolants, + prevIndex = interpolant.__cacheIndex, + + firstInactiveIndex = -- this._nActiveControlInterpolants, + + lastActiveInterpolant = interpolants[ firstInactiveIndex ]; + + interpolant.__cacheIndex = firstInactiveIndex; + interpolants[ firstInactiveIndex ] = interpolant; + + lastActiveInterpolant.__cacheIndex = prevIndex; + interpolants[ prevIndex ] = lastActiveInterpolant; + + }, + + _controlInterpolantsResultBuffer: new Float32Array( 1 ), + + // return an action for a clip optionally using a custom root target + // object (this method allocates a lot of dynamic memory in case a + // previously unknown clip/root combination is specified) + clipAction: function ( clip, optionalRoot ) { + + var root = optionalRoot || this._root, + rootUuid = root.uuid, + + clipObject = typeof clip === 'string' ? + AnimationClip.findByName( root, clip ) : clip, + + clipUuid = clipObject !== null ? clipObject.uuid : clip, + + actionsForClip = this._actionsByClip[ clipUuid ], + prototypeAction = null; + + if ( actionsForClip !== undefined ) { + + var existingAction = + actionsForClip.actionByRoot[ rootUuid ]; + + if ( existingAction !== undefined ) { + + return existingAction; + + } + + // we know the clip, so we don't have to parse all + // the bindings again but can just copy + prototypeAction = actionsForClip.knownActions[ 0 ]; + + // also, take the clip from the prototype action + if ( clipObject === null ) + clipObject = prototypeAction._clip; + + } + + // clip must be known when specified via string + if ( clipObject === null ) return null; + + // allocate all resources required to run it + var newAction = new AnimationAction( this, clipObject, optionalRoot ); + + this._bindAction( newAction, prototypeAction ); + + // and make the action known to the memory manager + this._addInactiveAction( newAction, clipUuid, rootUuid ); + + return newAction; + + }, + + // get an existing action + existingAction: function ( clip, optionalRoot ) { + + var root = optionalRoot || this._root, + rootUuid = root.uuid, + + clipObject = typeof clip === 'string' ? + AnimationClip.findByName( root, clip ) : clip, + + clipUuid = clipObject ? clipObject.uuid : clip, + + actionsForClip = this._actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + return actionsForClip.actionByRoot[ rootUuid ] || null; + + } + + return null; + + }, + + // deactivates all previously scheduled actions + stopAllAction: function () { + + var actions = this._actions, + nActions = this._nActiveActions, + bindings = this._bindings, + nBindings = this._nActiveBindings; + + this._nActiveActions = 0; + this._nActiveBindings = 0; + + for ( var i = 0; i !== nActions; ++ i ) { + + actions[ i ].reset(); + + } + + for ( var i = 0; i !== nBindings; ++ i ) { + + bindings[ i ].useCount = 0; + + } + + return this; + + }, + + // advance the time and update apply the animation + update: function ( deltaTime ) { + + deltaTime *= this.timeScale; + + var actions = this._actions, + nActions = this._nActiveActions, + + time = this.time += deltaTime, + timeDirection = Math.sign( deltaTime ), + + accuIndex = this._accuIndex ^= 1; + + // run active actions + + for ( var i = 0; i !== nActions; ++ i ) { + + var action = actions[ i ]; + + action._update( time, deltaTime, timeDirection, accuIndex ); + + } + + // update scene graph + + var bindings = this._bindings, + nBindings = this._nActiveBindings; + + for ( var i = 0; i !== nBindings; ++ i ) { + + bindings[ i ].apply( accuIndex ); + + } + + return this; + + }, + + // return this mixer's root target object + getRoot: function () { + + return this._root; + + }, + + // free all resources specific to a particular clip + uncacheClip: function ( clip ) { + + var actions = this._actions, + clipUuid = clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + // note: just calling _removeInactiveAction would mess up the + // iteration state and also require updating the state we can + // just throw away + + var actionsToRemove = actionsForClip.knownActions; + + for ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) { + + var action = actionsToRemove[ i ]; + + this._deactivateAction( action ); + + var cacheIndex = action._cacheIndex, + lastInactiveAction = actions[ actions.length - 1 ]; + + action._cacheIndex = null; + action._byClipCacheIndex = null; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + this._removeInactiveBindingsForAction( action ); + + } + + delete actionsByClip[ clipUuid ]; + + } + + }, + + // free all resources specific to a particular root target object + uncacheRoot: function ( root ) { + + var rootUuid = root.uuid, + actionsByClip = this._actionsByClip; + + for ( var clipUuid in actionsByClip ) { + + var actionByRoot = actionsByClip[ clipUuid ].actionByRoot, + action = actionByRoot[ rootUuid ]; + + if ( action !== undefined ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + + var bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ]; + + if ( bindingByName !== undefined ) { + + for ( var trackName in bindingByName ) { + + var binding = bindingByName[ trackName ]; + binding.restoreOriginalState(); + this._removeInactiveBinding( binding ); + + } + + } + + }, + + // remove a targeted clip from the cache + uncacheAction: function ( clip, optionalRoot ) { + + var action = this.existingAction( clip, optionalRoot ); + + if ( action !== null ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Uniform( value ) { + + if ( typeof value === 'string' ) { + + console.warn( 'THREE.Uniform: Type parameter is no longer needed.' ); + value = arguments[ 1 ]; + + } + + this.value = value; + + } + + Uniform.prototype.clone = function () { + + return new Uniform( this.value.clone === undefined ? this.value : this.value.clone() ); + + }; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedBufferGeometry() { + + BufferGeometry.call( this ); + + this.type = 'InstancedBufferGeometry'; + this.maxInstancedCount = undefined; + + } + + InstancedBufferGeometry.prototype = Object.assign( Object.create( BufferGeometry.prototype ), { + + constructor: InstancedBufferGeometry, + + isInstancedBufferGeometry: true, + + copy: function ( source ) { + + BufferGeometry.prototype.copy.call( this, source ); + + this.maxInstancedCount = source.maxInstancedCount; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + } + + } ); + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedInterleavedBuffer( array, stride, meshPerAttribute ) { + + InterleavedBuffer.call( this, array, stride ); + + this.meshPerAttribute = meshPerAttribute || 1; + + } + + InstancedInterleavedBuffer.prototype = Object.assign( Object.create( InterleavedBuffer.prototype ), { + + constructor: InstancedInterleavedBuffer, + + isInstancedInterleavedBuffer: true, + + copy: function ( source ) { + + InterleavedBuffer.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + } + + } ); + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedBufferAttribute( array, itemSize, normalized, meshPerAttribute ) { + + if ( typeof ( normalized ) === 'number' ) { + + meshPerAttribute = normalized; + + normalized = false; + + console.error( 'THREE.InstancedBufferAttribute: The constructor now expects normalized as the third argument.' ); + + } + + BufferAttribute.call( this, array, itemSize, normalized ); + + this.meshPerAttribute = meshPerAttribute || 1; + + } + + InstancedBufferAttribute.prototype = Object.assign( Object.create( BufferAttribute.prototype ), { + + constructor: InstancedBufferAttribute, + + isInstancedBufferAttribute: true, + + copy: function ( source ) { + + BufferAttribute.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author bhouston / http://clara.io/ + * @author stephomi / http://stephaneginier.com/ + */ + + function Raycaster( origin, direction, near, far ) { + + this.ray = new Ray( origin, direction ); + // direction is assumed to be normalized (for accurate distance calculations) + + this.near = near || 0; + this.far = far || Infinity; + + this.params = { + Mesh: {}, + Line: {}, + LOD: {}, + Points: { threshold: 1 }, + Sprite: {} + }; + + Object.defineProperties( this.params, { + PointCloud: { + get: function () { + + console.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' ); + return this.Points; + + } + } + } ); + + } + + function ascSort( a, b ) { + + return a.distance - b.distance; + + } + + function intersectObject( object, raycaster, intersects, recursive ) { + + if ( object.visible === false ) return; + + object.raycast( raycaster, intersects ); + + if ( recursive === true ) { + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + intersectObject( children[ i ], raycaster, intersects, true ); + + } + + } + + } + + Object.assign( Raycaster.prototype, { + + linePrecision: 1, + + set: function ( origin, direction ) { + + // direction is assumed to be normalized (for accurate distance calculations) + + this.ray.set( origin, direction ); + + }, + + setFromCamera: function ( coords, camera ) { + + if ( ( camera && camera.isPerspectiveCamera ) ) { + + this.ray.origin.setFromMatrixPosition( camera.matrixWorld ); + this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize(); + + } else if ( ( camera && camera.isOrthographicCamera ) ) { + + this.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera + this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ); + + } else { + + console.error( 'THREE.Raycaster: Unsupported camera type.' ); + + } + + }, + + intersectObject: function ( object, recursive, optionalTarget ) { + + var intersects = optionalTarget || []; + + intersectObject( object, this, intersects, recursive ); + + intersects.sort( ascSort ); + + return intersects; + + }, + + intersectObjects: function ( objects, recursive, optionalTarget ) { + + var intersects = optionalTarget || []; + + if ( Array.isArray( objects ) === false ) { + + console.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' ); + return intersects; + + } + + for ( var i = 0, l = objects.length; i < l; i ++ ) { + + intersectObject( objects[ i ], this, intersects, recursive ); + + } + + intersects.sort( ascSort ); + + return intersects; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Clock( autoStart ) { + + this.autoStart = ( autoStart !== undefined ) ? autoStart : true; + + this.startTime = 0; + this.oldTime = 0; + this.elapsedTime = 0; + + this.running = false; + + } + + Object.assign( Clock.prototype, { + + start: function () { + + this.startTime = ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732 + + this.oldTime = this.startTime; + this.elapsedTime = 0; + this.running = true; + + }, + + stop: function () { + + this.getElapsedTime(); + this.running = false; + this.autoStart = false; + + }, + + getElapsedTime: function () { + + this.getDelta(); + return this.elapsedTime; + + }, + + getDelta: function () { + + var diff = 0; + + if ( this.autoStart && ! this.running ) { + + this.start(); + return 0; + + } + + if ( this.running ) { + + var newTime = ( typeof performance === 'undefined' ? Date : performance ).now(); + + diff = ( newTime - this.oldTime ) / 1000; + this.oldTime = newTime; + + this.elapsedTime += diff; + + } + + return diff; + + } + + } ); + + /** + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + * + * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system + * + * The polar angle (phi) is measured from the positive y-axis. The positive y-axis is up. + * The azimuthal angle (theta) is measured from the positive z-axiz. + */ + + function Spherical( radius, phi, theta ) { + + this.radius = ( radius !== undefined ) ? radius : 1.0; + this.phi = ( phi !== undefined ) ? phi : 0; // polar angle + this.theta = ( theta !== undefined ) ? theta : 0; // azimuthal angle + + return this; + + } + + Object.assign( Spherical.prototype, { + + set: function ( radius, phi, theta ) { + + this.radius = radius; + this.phi = phi; + this.theta = theta; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( other ) { + + this.radius = other.radius; + this.phi = other.phi; + this.theta = other.theta; + + return this; + + }, + + // restrict phi to be betwee EPS and PI-EPS + makeSafe: function () { + + var EPS = 0.000001; + this.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) ); + + return this; + + }, + + setFromVector3: function ( v ) { + + return this.setFromCartesianCoords( v.x, v.y, v.z ); + + }, + + setFromCartesianCoords: function ( x, y, z ) { + + this.radius = Math.sqrt( x * x + y * y + z * z ); + + if ( this.radius === 0 ) { + + this.theta = 0; + this.phi = 0; + + } else { + + this.theta = Math.atan2( x, z ); + this.phi = Math.acos( _Math.clamp( y / this.radius, - 1, 1 ) ); + + } + + return this; + + } + + } ); + + /** + * @author Mugen87 / https://github.com/Mugen87 + * + * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system + * + */ + + function Cylindrical( radius, theta, y ) { + + this.radius = ( radius !== undefined ) ? radius : 1.0; // distance from the origin to a point in the x-z plane + this.theta = ( theta !== undefined ) ? theta : 0; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis + this.y = ( y !== undefined ) ? y : 0; // height above the x-z plane + + return this; + + } + + Object.assign( Cylindrical.prototype, { + + set: function ( radius, theta, y ) { + + this.radius = radius; + this.theta = theta; + this.y = y; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( other ) { + + this.radius = other.radius; + this.theta = other.theta; + this.y = other.y; + + return this; + + }, + + setFromVector3: function ( v ) { + + return this.setFromCartesianCoords( v.x, v.y, v.z ); + + }, + + setFromCartesianCoords: function ( x, y, z ) { + + this.radius = Math.sqrt( x * x + z * z ); + this.theta = Math.atan2( x, z ); + this.y = y; + + return this; + + } + + } ); + + /** + * @author bhouston / http://clara.io + */ + + function Box2( min, max ) { + + this.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity ); + this.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity ); + + } + + Object.assign( Box2.prototype, { + + set: function ( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + }, + + setFromPoints: function ( points ) { + + this.makeEmpty(); + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + }, + + setFromCenterAndSize: function () { + + var v1 = new Vector2(); + + return function setFromCenterAndSize( center, size ) { + + var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + }, + + makeEmpty: function () { + + this.min.x = this.min.y = + Infinity; + this.max.x = this.max.y = - Infinity; + + return this; + + }, + + isEmpty: function () { + + // 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 ); + + }, + + getCenter: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box2: .getCenter() target is now required' ); + target = new Vector2(); + + } + + return this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + }, + + getSize: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box2: .getSize() target is now required' ); + target = new Vector2(); + + } + + return this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min ); + + }, + + expandByPoint: function ( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + }, + + expandByVector: function ( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + }, + + expandByScalar: function ( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + }, + + containsPoint: function ( point ) { + + return point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y ? false : true; + + }, + + containsBox: function ( box ) { + + return this.min.x <= box.min.x && box.max.x <= this.max.x && + this.min.y <= box.min.y && box.max.y <= this.max.y; + + }, + + getParameter: function ( point, target ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + if ( target === undefined ) { + + console.warn( 'THREE.Box2: .getParameter() target is now required' ); + target = new Vector2(); + + } + + return target.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ) + ); + + }, + + intersectsBox: function ( box ) { + + // using 4 splitting planes to rule out intersections + + return box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y ? false : true; + + }, + + clampPoint: function ( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box2: .clampPoint() target is now required' ); + target = new Vector2(); + + } + + return target.copy( point ).clamp( this.min, this.max ); + + }, + + distanceToPoint: function () { + + var v1 = new Vector2(); + + return function distanceToPoint( point ) { + + var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + }; + + }(), + + intersect: function ( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + return this; + + }, + + union: function ( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + }, + + translate: function ( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + }, + + equals: function ( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + + } ); + + /** + * @author bhouston / http://clara.io + */ + + function Line3( start, end ) { + + this.start = ( start !== undefined ) ? start : new Vector3(); + this.end = ( end !== undefined ) ? end : new Vector3(); + + } + + Object.assign( Line3.prototype, { + + set: function ( start, end ) { + + this.start.copy( start ); + this.end.copy( end ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( line ) { + + this.start.copy( line.start ); + this.end.copy( line.end ); + + return this; + + }, + + getCenter: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Line3: .getCenter() target is now required' ); + target = new Vector3(); + + } + + return target.addVectors( this.start, this.end ).multiplyScalar( 0.5 ); + + }, + + delta: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Line3: .delta() target is now required' ); + target = new Vector3(); + + } + + return target.subVectors( this.end, this.start ); + + }, + + distanceSq: function () { + + return this.start.distanceToSquared( this.end ); + + }, + + distance: function () { + + return this.start.distanceTo( this.end ); + + }, + + at: function ( t, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Line3: .at() target is now required' ); + target = new Vector3(); + + } + + return this.delta( target ).multiplyScalar( t ).add( this.start ); + + }, + + closestPointToPointParameter: function () { + + var startP = new Vector3(); + var startEnd = new Vector3(); + + return function closestPointToPointParameter( point, clampToLine ) { + + startP.subVectors( point, this.start ); + startEnd.subVectors( this.end, this.start ); + + var startEnd2 = startEnd.dot( startEnd ); + var startEnd_startP = startEnd.dot( startP ); + + var t = startEnd_startP / startEnd2; + + if ( clampToLine ) { + + t = _Math.clamp( t, 0, 1 ); + + } + + return t; + + }; + + }(), + + closestPointToPoint: function ( point, clampToLine, target ) { + + var t = this.closestPointToPointParameter( point, clampToLine ); + + if ( target === undefined ) { + + console.warn( 'THREE.Line3: .closestPointToPoint() target is now required' ); + target = new Vector3(); + + } + + return this.delta( target ).multiplyScalar( t ).add( this.start ); + + }, + + applyMatrix4: function ( matrix ) { + + this.start.applyMatrix4( matrix ); + this.end.applyMatrix4( matrix ); + + return this; + + }, + + equals: function ( line ) { + + return line.start.equals( this.start ) && line.end.equals( this.end ); + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function ImmediateRenderObject( material ) { + + Object3D.call( this ); + + this.material = material; + this.render = function ( /* renderCallback */ ) {}; + + } + + ImmediateRenderObject.prototype = Object.create( Object3D.prototype ); + ImmediateRenderObject.prototype.constructor = ImmediateRenderObject; + + ImmediateRenderObject.prototype.isImmediateRenderObject = true; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function VertexNormalsHelper( object, size, hex, linewidth ) { + + this.object = object; + + this.size = ( size !== undefined ) ? size : 1; + + var color = ( hex !== undefined ) ? hex : 0xff0000; + + var width = ( linewidth !== undefined ) ? linewidth : 1; + + // + + var nNormals = 0; + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + nNormals = objGeometry.faces.length * 3; + + } else if ( objGeometry && objGeometry.isBufferGeometry ) { + + nNormals = objGeometry.attributes.normal.count; + + } + + // + + var geometry = new BufferGeometry(); + + var positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 ); + + geometry.addAttribute( 'position', positions ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) ); + + // + + this.matrixAutoUpdate = false; + + this.update(); + + } + + VertexNormalsHelper.prototype = Object.create( LineSegments.prototype ); + VertexNormalsHelper.prototype.constructor = VertexNormalsHelper; + + VertexNormalsHelper.prototype.update = ( function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var normalMatrix = new Matrix3(); + + return function update() { + + var keys = [ 'a', 'b', 'c' ]; + + this.object.updateMatrixWorld( true ); + + normalMatrix.getNormalMatrix( this.object.matrixWorld ); + + var matrixWorld = this.object.matrixWorld; + + var position = this.geometry.attributes.position; + + // + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + var vertices = objGeometry.vertices; + + var faces = objGeometry.faces; + + var idx = 0; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + var vertex = vertices[ face[ keys[ j ] ] ]; + + var normal = face.vertexNormals[ j ]; + + v1.copy( vertex ).applyMatrix4( matrixWorld ); + + v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + } + + } else if ( objGeometry && objGeometry.isBufferGeometry ) { + + var objPos = objGeometry.attributes.position; + + var objNorm = objGeometry.attributes.normal; + + var idx = 0; + + // for simplicity, ignore index and drawcalls, and render every normal + + for ( var j = 0, jl = objPos.count; j < jl; j ++ ) { + + v1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld ); + + v2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) ); + + v2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + } + + position.needsUpdate = true; + + }; + + }() ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function SpotLightHelper( light, color ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + var geometry = new BufferGeometry(); + + var 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 ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) { + + var p1 = ( i / l ) * Math.PI * 2; + var p2 = ( j / l ) * Math.PI * 2; + + positions.push( + Math.cos( p1 ), Math.sin( p1 ), 1, + Math.cos( p2 ), Math.sin( p2 ), 1 + ); + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + + var material = new LineBasicMaterial( { fog: false } ); + + this.cone = new LineSegments( geometry, material ); + this.add( this.cone ); + + this.update(); + + } + + SpotLightHelper.prototype = Object.create( Object3D.prototype ); + SpotLightHelper.prototype.constructor = SpotLightHelper; + + SpotLightHelper.prototype.dispose = function () { + + this.cone.geometry.dispose(); + this.cone.material.dispose(); + + }; + + SpotLightHelper.prototype.update = function () { + + var vector = new Vector3(); + var vector2 = new Vector3(); + + return function update() { + + this.light.updateMatrixWorld(); + + var coneLength = this.light.distance ? this.light.distance : 1000; + var coneWidth = coneLength * Math.tan( this.light.angle ); + + this.cone.scale.set( coneWidth, coneWidth, coneLength ); + + vector.setFromMatrixPosition( this.light.matrixWorld ); + vector2.setFromMatrixPosition( this.light.target.matrixWorld ); + + this.cone.lookAt( vector2.sub( vector ) ); + + if ( this.color !== undefined ) { + + this.cone.material.color.set( this.color ); + + } else { + + this.cone.material.color.copy( this.light.color ); + + } + + }; + + }(); + + /** + * @author Sean Griffin / http://twitter.com/sgrif + * @author Michael Guerrero / http://realitymeltdown.com + * @author mrdoob / http://mrdoob.com/ + * @author ikerr / http://verold.com + * @author Mugen87 / https://github.com/Mugen87 + */ + + function getBoneList( object ) { + + var boneList = []; + + if ( object && object.isBone ) { + + boneList.push( object ); + + } + + for ( var i = 0; i < object.children.length; i ++ ) { + + boneList.push.apply( boneList, getBoneList( object.children[ i ] ) ); + + } + + return boneList; + + } + + function SkeletonHelper( object ) { + + var bones = getBoneList( object ); + + var geometry = new BufferGeometry(); + + var vertices = []; + var colors = []; + + var color1 = new Color( 0, 0, 1 ); + var color2 = new Color( 0, 1, 0 ); + + for ( var i = 0; i < bones.length; i ++ ) { + + var 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 ); + colors.push( color2.r, color2.g, color2.b ); + + } + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } ); + + LineSegments.call( this, geometry, material ); + + this.root = object; + this.bones = bones; + + this.matrix = object.matrixWorld; + this.matrixAutoUpdate = false; + + } + + SkeletonHelper.prototype = Object.create( LineSegments.prototype ); + SkeletonHelper.prototype.constructor = SkeletonHelper; + + SkeletonHelper.prototype.updateMatrixWorld = function () { + + var vector = new Vector3(); + + var boneMatrix = new Matrix4(); + var matrixWorldInv = new Matrix4(); + + return function updateMatrixWorld( force ) { + + var bones = this.bones; + + var geometry = this.geometry; + var position = geometry.getAttribute( 'position' ); + + matrixWorldInv.getInverse( this.root.matrixWorld ); + + for ( var i = 0, j = 0; i < bones.length; i ++ ) { + + var bone = bones[ i ]; + + if ( bone.parent && bone.parent.isBone ) { + + boneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld ); + vector.setFromMatrixPosition( boneMatrix ); + position.setXYZ( j, vector.x, vector.y, vector.z ); + + boneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld ); + vector.setFromMatrixPosition( boneMatrix ); + position.setXYZ( j + 1, vector.x, vector.y, vector.z ); + + j += 2; + + } + + } + + geometry.getAttribute( 'position' ).needsUpdate = true; + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + }; + + }(); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function PointLightHelper( light, sphereSize, color ) { + + this.light = light; + this.light.updateMatrixWorld(); + + this.color = color; + + var geometry = new SphereBufferGeometry( sphereSize, 4, 2 ); + var material = new MeshBasicMaterial( { wireframe: true, fog: false } ); + + Mesh.call( this, geometry, material ); + + this.matrix = this.light.matrixWorld; + this.matrixAutoUpdate = false; + + this.update(); + + + /* + var distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 ); + var distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } ); + + this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial ); + this.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial ); + + var d = light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.scale.set( d, d, d ); + + } + + this.add( this.lightDistance ); + */ + + } + + PointLightHelper.prototype = Object.create( Mesh.prototype ); + PointLightHelper.prototype.constructor = PointLightHelper; + + PointLightHelper.prototype.dispose = function () { + + this.geometry.dispose(); + this.material.dispose(); + + }; + + PointLightHelper.prototype.update = function () { + + if ( this.color !== undefined ) { + + this.material.color.set( this.color ); + + } else { + + this.material.color.copy( this.light.color ); + + } + + /* + var d = this.light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.visible = true; + this.lightDistance.scale.set( d, d, d ); + + } + */ + + }; + + /** + * @author abelnation / http://github.com/abelnation + * @author Mugen87 / http://github.com/Mugen87 + * @author WestLangley / http://github.com/WestLangley + */ + + function RectAreaLightHelper( light, color ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + var material = new LineBasicMaterial( { fog: false } ); + + var geometry = new BufferGeometry(); + + geometry.addAttribute( 'position', new BufferAttribute( new Float32Array( 5 * 3 ), 3 ) ); + + this.line = new Line( geometry, material ); + this.add( this.line ); + + + this.update(); + + } + + RectAreaLightHelper.prototype = Object.create( Object3D.prototype ); + RectAreaLightHelper.prototype.constructor = RectAreaLightHelper; + + RectAreaLightHelper.prototype.dispose = function () { + + this.children[ 0 ].geometry.dispose(); + this.children[ 0 ].material.dispose(); + + }; + + RectAreaLightHelper.prototype.update = function () { + + // calculate new dimensions of the helper + + var hx = this.light.width * 0.5; + var hy = this.light.height * 0.5; + + var position = this.line.geometry.attributes.position; + var array = position.array; + + // update vertices + + array[ 0 ] = hx; array[ 1 ] = - hy; array[ 2 ] = 0; + array[ 3 ] = hx; array[ 4 ] = hy; array[ 5 ] = 0; + array[ 6 ] = - hx; array[ 7 ] = hy; array[ 8 ] = 0; + array[ 9 ] = - hx; array[ 10 ] = - hy; array[ 11 ] = 0; + array[ 12 ] = hx; array[ 13 ] = - hy; array[ 14 ] = 0; + + position.needsUpdate = true; + + if ( this.color !== undefined ) { + + this.line.material.color.set( this.color ); + + } else { + + this.line.material.color.copy( this.light.color ); + + } + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + function HemisphereLightHelper( light, size, color ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + var geometry = new OctahedronBufferGeometry( size ); + geometry.rotateY( Math.PI * 0.5 ); + + this.material = new MeshBasicMaterial( { wireframe: true, fog: false } ); + if ( this.color === undefined ) this.material.vertexColors = VertexColors; + + var position = geometry.getAttribute( 'position' ); + var colors = new Float32Array( position.count * 3 ); + + geometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) ); + + this.add( new Mesh( geometry, this.material ) ); + + this.update(); + + } + + HemisphereLightHelper.prototype = Object.create( Object3D.prototype ); + HemisphereLightHelper.prototype.constructor = HemisphereLightHelper; + + HemisphereLightHelper.prototype.dispose = function () { + + this.children[ 0 ].geometry.dispose(); + this.children[ 0 ].material.dispose(); + + }; + + HemisphereLightHelper.prototype.update = function () { + + var vector = new Vector3(); + + var color1 = new Color(); + var color2 = new Color(); + + return function update() { + + var mesh = this.children[ 0 ]; + + if ( this.color !== undefined ) { + + this.material.color.set( this.color ); + + } else { + + var colors = mesh.geometry.getAttribute( 'color' ); + + color1.copy( this.light.color ); + color2.copy( this.light.groundColor ); + + for ( var i = 0, l = colors.count; i < l; i ++ ) { + + var color = ( i < ( l / 2 ) ) ? color1 : color2; + + colors.setXYZ( i, color.r, color.g, color.b ); + + } + + colors.needsUpdate = true; + + } + + mesh.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() ); + + }; + + }(); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function GridHelper( size, divisions, color1, color2 ) { + + size = size || 10; + divisions = divisions || 10; + color1 = new Color( color1 !== undefined ? color1 : 0x444444 ); + color2 = new Color( color2 !== undefined ? color2 : 0x888888 ); + + var center = divisions / 2; + var step = size / divisions; + var halfSize = size / 2; + + var vertices = [], colors = []; + + for ( var 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 ); + + var color = i === center ? color1 : color2; + + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + + } + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + + } + + GridHelper.prototype = Object.create( LineSegments.prototype ); + GridHelper.prototype.constructor = GridHelper; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / http://github.com/Mugen87 + * @author Hectate / http://www.github.com/Hectate + */ + + function PolarGridHelper( radius, radials, circles, divisions, color1, color2 ) { + + radius = radius || 10; + radials = radials || 16; + circles = circles || 8; + divisions = divisions || 64; + color1 = new Color( color1 !== undefined ? color1 : 0x444444 ); + color2 = new Color( color2 !== undefined ? color2 : 0x888888 ); + + var vertices = []; + var colors = []; + + var x, z; + var v, i, j, r, color; + + // create the radials + + for ( i = 0; i <= radials; i ++ ) { + + v = ( i / radials ) * ( Math.PI * 2 ); + + x = Math.sin( v ) * radius; + z = Math.cos( v ) * radius; + + vertices.push( 0, 0, 0 ); + vertices.push( x, 0, z ); + + color = ( i & 1 ) ? color1 : color2; + + colors.push( color.r, color.g, color.b ); + colors.push( color.r, color.g, color.b ); + + } + + // create the circles + + for ( i = 0; i <= circles; i ++ ) { + + color = ( i & 1 ) ? color1 : color2; + + r = radius - ( radius / circles * i ); + + for ( j = 0; j < divisions; j ++ ) { + + // first vertex + + v = ( j / 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 ); + + // 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 ); + + } + + } + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + + } + + PolarGridHelper.prototype = Object.create( LineSegments.prototype ); + PolarGridHelper.prototype.constructor = PolarGridHelper; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function FaceNormalsHelper( object, size, hex, linewidth ) { + + // FaceNormalsHelper only supports THREE.Geometry + + this.object = object; + + this.size = ( size !== undefined ) ? size : 1; + + var color = ( hex !== undefined ) ? hex : 0xffff00; + + var width = ( linewidth !== undefined ) ? linewidth : 1; + + // + + var nNormals = 0; + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + nNormals = objGeometry.faces.length; + + } else { + + console.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' ); + + } + + // + + var geometry = new BufferGeometry(); + + var positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 ); + + geometry.addAttribute( 'position', positions ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) ); + + // + + this.matrixAutoUpdate = false; + this.update(); + + } + + FaceNormalsHelper.prototype = Object.create( LineSegments.prototype ); + FaceNormalsHelper.prototype.constructor = FaceNormalsHelper; + + FaceNormalsHelper.prototype.update = ( function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var normalMatrix = new Matrix3(); + + return function update() { + + this.object.updateMatrixWorld( true ); + + normalMatrix.getNormalMatrix( this.object.matrixWorld ); + + var matrixWorld = this.object.matrixWorld; + + var position = this.geometry.attributes.position; + + // + + var objGeometry = this.object.geometry; + + var vertices = objGeometry.vertices; + + var faces = objGeometry.faces; + + var idx = 0; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + var normal = face.normal; + + v1.copy( vertices[ face.a ] ) + .add( vertices[ face.b ] ) + .add( vertices[ face.c ] ) + .divideScalar( 3 ) + .applyMatrix4( matrixWorld ); + + v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + position.needsUpdate = true; + + }; + + }() ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function DirectionalLightHelper( light, size, color ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + if ( size === undefined ) size = 1; + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( [ + - size, size, 0, + size, size, 0, + size, - size, 0, + - size, - size, 0, + - size, size, 0 + ], 3 ) ); + + var material = new LineBasicMaterial( { fog: false } ); + + this.lightPlane = new Line( geometry, material ); + this.add( this.lightPlane ); + + geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) ); + + this.targetLine = new Line( geometry, material ); + this.add( this.targetLine ); + + this.update(); + + } + + DirectionalLightHelper.prototype = Object.create( Object3D.prototype ); + DirectionalLightHelper.prototype.constructor = DirectionalLightHelper; + + DirectionalLightHelper.prototype.dispose = function () { + + this.lightPlane.geometry.dispose(); + this.lightPlane.material.dispose(); + this.targetLine.geometry.dispose(); + this.targetLine.material.dispose(); + + }; + + DirectionalLightHelper.prototype.update = function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var v3 = new Vector3(); + + return function update() { + + v1.setFromMatrixPosition( this.light.matrixWorld ); + v2.setFromMatrixPosition( this.light.target.matrixWorld ); + v3.subVectors( v2, v1 ); + + this.lightPlane.lookAt( v3 ); + + if ( this.color !== undefined ) { + + this.lightPlane.material.color.set( this.color ); + this.targetLine.material.color.set( this.color ); + + } else { + + this.lightPlane.material.color.copy( this.light.color ); + this.targetLine.material.color.copy( this.light.color ); + + } + + this.targetLine.lookAt( v3 ); + this.targetLine.scale.z = v3.length(); + + }; + + }(); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author Mugen87 / https://github.com/Mugen87 + * + * - shows frustum, line of sight and up of the camera + * - suitable for fast updates + * - based on frustum visualization in lightgl.js shadowmap example + * http://evanw.github.com/lightgl.js/tests/shadowmap.html + */ + + function CameraHelper( camera ) { + + var geometry = new BufferGeometry(); + var material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } ); + + var vertices = []; + var colors = []; + + var pointMap = {}; + + // colors + + var colorFrustum = new Color( 0xffaa00 ); + var colorCone = new Color( 0xff0000 ); + var colorUp = new Color( 0x00aaff ); + var colorTarget = new Color( 0xffffff ); + var colorCross = new Color( 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', colorCross ); + + // 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 ) { + + vertices.push( 0, 0, 0 ); + colors.push( color.r, color.g, color.b ); + + if ( pointMap[ id ] === undefined ) { + + pointMap[ id ] = []; + + } + + pointMap[ id ].push( ( vertices.length / 3 ) - 1 ); + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + LineSegments.call( this, geometry, material ); + + this.camera = camera; + if ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix(); + + this.matrix = camera.matrixWorld; + this.matrixAutoUpdate = false; + + this.pointMap = pointMap; + + this.update(); + + } + + CameraHelper.prototype = Object.create( LineSegments.prototype ); + CameraHelper.prototype.constructor = CameraHelper; + + CameraHelper.prototype.update = function () { + + var geometry, pointMap; + + var vector = new Vector3(); + var camera = new Camera(); + + function setPoint( point, x, y, z ) { + + vector.set( x, y, z ).unproject( camera ); + + var points = pointMap[ point ]; + + if ( points !== undefined ) { + + var position = geometry.getAttribute( 'position' ); + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + position.setXYZ( points[ i ], vector.x, vector.y, vector.z ); + + } + + } + + } + + return function update() { + + geometry = this.geometry; + pointMap = this.pointMap; + + var w = 1, h = 1; + + // we need just camera projection matrix + // world matrix must be identity + + camera.projectionMatrix.copy( this.camera.projectionMatrix ); + + // center / target + + setPoint( 'c', 0, 0, - 1 ); + setPoint( 't', 0, 0, 1 ); + + // near + + setPoint( 'n1', - w, - h, - 1 ); + setPoint( 'n2', w, - h, - 1 ); + setPoint( 'n3', - w, h, - 1 ); + setPoint( 'n4', w, h, - 1 ); + + // far + + setPoint( 'f1', - w, - h, 1 ); + setPoint( 'f2', w, - h, 1 ); + setPoint( 'f3', - w, h, 1 ); + setPoint( 'f4', w, h, 1 ); + + // up + + setPoint( 'u1', w * 0.7, h * 1.1, - 1 ); + setPoint( 'u2', - w * 0.7, h * 1.1, - 1 ); + setPoint( 'u3', 0, h * 2, - 1 ); + + // cross + + setPoint( 'cf1', - w, 0, 1 ); + setPoint( 'cf2', w, 0, 1 ); + setPoint( 'cf3', 0, - h, 1 ); + setPoint( 'cf4', 0, h, 1 ); + + setPoint( 'cn1', - w, 0, - 1 ); + setPoint( 'cn2', w, 0, - 1 ); + setPoint( 'cn3', 0, - h, - 1 ); + setPoint( 'cn4', 0, h, - 1 ); + + geometry.getAttribute( 'position' ).needsUpdate = true; + + }; + + }(); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / http://github.com/Mugen87 + */ + + function BoxHelper( object, color ) { + + this.object = object; + + if ( color === undefined ) color = 0xffff00; + + var 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 ] ); + var positions = new Float32Array( 8 * 3 ); + + var geometry = new BufferGeometry(); + geometry.setIndex( new BufferAttribute( indices, 1 ) ); + geometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) ); + + this.matrixAutoUpdate = false; + + this.update(); + + } + + BoxHelper.prototype = Object.create( LineSegments.prototype ); + BoxHelper.prototype.constructor = BoxHelper; + + BoxHelper.prototype.update = ( function () { + + var box = new Box3(); + + return function update( object ) { + + if ( object !== undefined ) { + + console.warn( 'THREE.BoxHelper: .update() has no longer arguments.' ); + + } + + if ( this.object !== undefined ) { + + box.setFromObject( this.object ); + + } + + if ( box.isEmpty() ) return; + + var min = box.min; + var max = box.max; + + /* + 5____4 + 1/___0/| + | 6__|_7 + 2/___3/ + + 0: max.x, max.y, max.z + 1: min.x, max.y, max.z + 2: min.x, min.y, max.z + 3: max.x, min.y, max.z + 4: max.x, max.y, min.z + 5: min.x, max.y, min.z + 6: min.x, min.y, min.z + 7: max.x, min.y, min.z + */ + + var position = this.geometry.attributes.position; + var 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.needsUpdate = true; + + this.geometry.computeBoundingSphere(); + + }; + + } )(); + + BoxHelper.prototype.setFromObject = function ( object ) { + + this.object = object; + this.update(); + + return this; + + }; + + BoxHelper.prototype.copy = function ( source ) { + + LineSegments.prototype.copy.call( this, source ); + + this.object = source.object; + + return this; + + }; + + BoxHelper.prototype.clone = function () { + + return new this.constructor().copy( this ); + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + */ + + function Box3Helper( box, hex ) { + + this.type = 'Box3Helper'; + + this.box = box; + + var color = ( hex !== undefined ) ? hex : 0xffff00; + + var 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 ] ); + + var 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 ]; + + var geometry = new BufferGeometry(); + + geometry.setIndex( new BufferAttribute( indices, 1 ) ); + + geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) ); + + this.geometry.computeBoundingSphere(); + + } + + Box3Helper.prototype = Object.create( LineSegments.prototype ); + Box3Helper.prototype.constructor = Box3Helper; + + Box3Helper.prototype.updateMatrixWorld = function ( force ) { + + var box = this.box; + + if ( box.isEmpty() ) return; + + box.getCenter( this.position ); + + box.getSize( this.scale ); + + this.scale.multiplyScalar( 0.5 ); + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + */ + + function PlaneHelper( plane, size, hex ) { + + this.type = 'PlaneHelper'; + + this.plane = plane; + + this.size = ( size === undefined ) ? 1 : size; + + var color = ( hex !== undefined ) ? hex : 0xffff00; + + var 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, 0, 0, 1, 0, 0, 0 ]; + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + geometry.computeBoundingSphere(); + + Line.call( this, geometry, new LineBasicMaterial( { color: color } ) ); + + // + + var positions2 = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, - 1, 1, 1, - 1, 1 ]; + + var geometry2 = new BufferGeometry(); + geometry2.addAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) ); + geometry2.computeBoundingSphere(); + + this.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false } ) ) ); + + } + + PlaneHelper.prototype = Object.create( Line.prototype ); + PlaneHelper.prototype.constructor = PlaneHelper; + + PlaneHelper.prototype.updateMatrixWorld = function ( force ) { + + var scale = - this.plane.constant; + + if ( Math.abs( scale ) < 1e-8 ) scale = 1e-8; // sign does not matter + + this.scale.set( 0.5 * this.size, 0.5 * this.size, scale ); + + this.children[ 0 ].material.side = ( scale < 0 ) ? BackSide : FrontSide; // renderer flips side when determinant < 0; flipping not wanted here + + this.lookAt( this.plane.normal ); + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + * @author zz85 / http://github.com/zz85 + * @author bhouston / http://clara.io + * + * Creates an arrow for visualizing directions + * + * Parameters: + * dir - Vector3 + * origin - Vector3 + * length - Number + * color - color in hex value + * headLength - Number + * headWidth - Number + */ + + var lineGeometry, coneGeometry; + + function ArrowHelper( dir, origin, length, color, headLength, headWidth ) { + + // dir is assumed to be normalized + + Object3D.call( this ); + + if ( dir === undefined ) dir = new THREE.Vector3( 0, 0, 1 ); + if ( origin === undefined ) origin = new THREE.Vector3( 0, 0, 0 ); + if ( length === undefined ) length = 1; + if ( color === undefined ) color = 0xffff00; + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + if ( lineGeometry === undefined ) { + + lineGeometry = new BufferGeometry(); + lineGeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) ); + + coneGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 ); + coneGeometry.translate( 0, - 0.5, 0 ); + + } + + this.position.copy( origin ); + + this.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) ); + this.line.matrixAutoUpdate = false; + this.add( this.line ); + + this.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) ); + this.cone.matrixAutoUpdate = false; + this.add( this.cone ); + + this.setDirection( dir ); + this.setLength( length, headLength, headWidth ); + + } + + ArrowHelper.prototype = Object.create( Object3D.prototype ); + ArrowHelper.prototype.constructor = ArrowHelper; + + ArrowHelper.prototype.setDirection = ( function () { + + var axis = new Vector3(); + var radians; + + return function setDirection( dir ) { + + // dir is assumed to be normalized + + if ( dir.y > 0.99999 ) { + + this.quaternion.set( 0, 0, 0, 1 ); + + } else if ( dir.y < - 0.99999 ) { + + this.quaternion.set( 1, 0, 0, 0 ); + + } else { + + axis.set( dir.z, 0, - dir.x ).normalize(); + + radians = Math.acos( dir.y ); + + this.quaternion.setFromAxisAngle( axis, radians ); + + } + + }; + + }() ); + + ArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) { + + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + this.line.scale.set( 1, Math.max( 0, length - headLength ), 1 ); + this.line.updateMatrix(); + + this.cone.scale.set( headWidth, headLength, headWidth ); + this.cone.position.y = length; + this.cone.updateMatrix(); + + }; + + ArrowHelper.prototype.setColor = function ( color ) { + + this.line.material.color.copy( color ); + this.cone.material.color.copy( color ); + + }; + + ArrowHelper.prototype.copy = function ( source ) { + + Object3D.prototype.copy.call( this, source, false ); + + this.line.copy( source.line ); + this.cone.copy( source.cone ); + + return this; + + }; + + ArrowHelper.prototype.clone = function () { + + return new this.constructor().copy( this ); + + }; + + /** + * @author sroucheray / http://sroucheray.org/ + * @author mrdoob / http://mrdoob.com/ + */ + + function AxesHelper( size ) { + + size = size || 1; + + var vertices = [ + 0, 0, 0, size, 0, 0, + 0, 0, 0, 0, size, 0, + 0, 0, 0, 0, 0, size + ]; + + var colors = [ + 1, 0, 0, 1, 0.6, 0, + 0, 1, 0, 0.6, 1, 0, + 0, 0, 1, 0, 0.6, 1 + ]; + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + + } + + AxesHelper.prototype = Object.create( LineSegments.prototype ); + AxesHelper.prototype.constructor = AxesHelper; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Face4( a, b, c, d, normal, color, materialIndex ) { + + console.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' ); + return new Face3( a, b, c, normal, color, materialIndex ); + + } + + var LineStrip = 0; + + var LinePieces = 1; + + function MeshFaceMaterial( materials ) { + + console.warn( 'THREE.MeshFaceMaterial has been removed. Use an Array instead.' ); + return materials; + + } + + function MultiMaterial( materials ) { + + if ( materials === undefined ) materials = []; + + console.warn( 'THREE.MultiMaterial has been removed. Use an Array instead.' ); + materials.isMultiMaterial = true; + materials.materials = materials; + materials.clone = function () { + + return materials.slice(); + + }; + return materials; + + } + + function PointCloud( geometry, material ) { + + console.warn( 'THREE.PointCloud has been renamed to THREE.Points.' ); + return new Points( geometry, material ); + + } + + function Particle( material ) { + + console.warn( 'THREE.Particle has been renamed to THREE.Sprite.' ); + return new Sprite( material ); + + } + + function ParticleSystem( geometry, material ) { + + console.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' ); + return new Points( geometry, material ); + + } + + function PointCloudMaterial( parameters ) { + + console.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + + } + + function ParticleBasicMaterial( parameters ) { + + console.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + + } + + function ParticleSystemMaterial( parameters ) { + + console.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + + } + + function Vertex( x, y, z ) { + + console.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' ); + return new Vector3( x, y, z ); + + } + + // + + function DynamicBufferAttribute( array, itemSize ) { + + console.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' ); + return new BufferAttribute( array, itemSize ).setDynamic( true ); + + } + + function Int8Attribute( array, itemSize ) { + + console.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' ); + return new Int8BufferAttribute( array, itemSize ); + + } + + function Uint8Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' ); + return new Uint8BufferAttribute( array, itemSize ); + + } + + function Uint8ClampedAttribute( array, itemSize ) { + + console.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' ); + return new Uint8ClampedBufferAttribute( array, itemSize ); + + } + + function Int16Attribute( array, itemSize ) { + + console.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' ); + return new Int16BufferAttribute( array, itemSize ); + + } + + function Uint16Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' ); + return new Uint16BufferAttribute( array, itemSize ); + + } + + function Int32Attribute( array, itemSize ) { + + console.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' ); + return new Int32BufferAttribute( array, itemSize ); + + } + + function Uint32Attribute( array, itemSize ) { + + console.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' ); + return new Uint32BufferAttribute( array, itemSize ); + + } + + function Float32Attribute( array, itemSize ) { + + console.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' ); + return new Float32BufferAttribute( array, itemSize ); + + } + + function Float64Attribute( array, itemSize ) { + + console.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' ); + return new Float64BufferAttribute( array, itemSize ); + + } + + // + + Curve.create = function ( construct, getPoint ) { + + console.log( 'THREE.Curve.create() has been deprecated' ); + + construct.prototype = Object.create( Curve.prototype ); + construct.prototype.constructor = construct; + construct.prototype.getPoint = getPoint; + + return construct; + + }; + + // + + Object.assign( CurvePath.prototype, { + + createPointsGeometry: function ( divisions ) { + + console.warn( 'THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' ); + + // generate geometry from path points (for Line or Points objects) + + var pts = this.getPoints( divisions ); + return this.createGeometry( pts ); + + }, + + createSpacedPointsGeometry: function ( divisions ) { + + console.warn( 'THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' ); + + // generate geometry from equidistant sampling along the path + + var pts = this.getSpacedPoints( divisions ); + return this.createGeometry( pts ); + + }, + + createGeometry: function ( points ) { + + console.warn( 'THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' ); + + var geometry = new Geometry(); + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + var point = points[ i ]; + geometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) ); + + } + + return geometry; + + } + + } ); + + // + + Object.assign( Path.prototype, { + + fromPoints: function ( points ) { + + console.warn( 'THREE.Path: .fromPoints() has been renamed to .setFromPoints().' ); + this.setFromPoints( points ); + + } + + } ); + + // + + function ClosedSplineCurve3( points ) { + + console.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + this.closed = true; + + } + + ClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype ); + + // + + function SplineCurve3( points ) { + + console.warn( 'THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + + } + + SplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype ); + + // + + function Spline( points ) { + + console.warn( 'THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + + } + + Spline.prototype = Object.create( CatmullRomCurve3.prototype ); + + Object.assign( Spline.prototype, { + + initFromArray: function ( /* a */ ) { + + console.error( 'THREE.Spline: .initFromArray() has been removed.' ); + + }, + getControlPointsArray: function ( /* optionalTarget */ ) { + + console.error( 'THREE.Spline: .getControlPointsArray() has been removed.' ); + + }, + reparametrizeByArcLength: function ( /* samplingCoef */ ) { + + console.error( 'THREE.Spline: .reparametrizeByArcLength() has been removed.' ); + + } + + } ); + + // + + function AxisHelper( size ) { + + console.warn( 'THREE.AxisHelper has been renamed to THREE.AxesHelper.' ); + return new AxesHelper( size ); + + } + + function BoundingBoxHelper( object, color ) { + + console.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' ); + return new BoxHelper( object, color ); + + } + + function EdgesHelper( object, hex ) { + + console.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' ); + return new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) ); + + } + + GridHelper.prototype.setColors = function () { + + console.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' ); + + }; + + SkeletonHelper.prototype.update = function () { + + console.error( 'THREE.SkeletonHelper: update() no longer needs to be called.' ); + + }; + + function WireframeHelper( object, hex ) { + + console.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' ); + return new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) ); + + } + + // + + Object.assign( Loader.prototype, { + + extractUrlBase: function ( url ) { + + console.warn( 'THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.' ); + return LoaderUtils.extractUrlBase( url ); + + } + + } ); + + function XHRLoader( manager ) { + + console.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' ); + return new FileLoader( manager ); + + } + + function BinaryTextureLoader( manager ) { + + console.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' ); + return new DataTextureLoader( manager ); + + } + + Object.assign( JSONLoader.prototype, { + + setTexturePath: function ( value ) { + + console.warn( 'THREE.JSONLoader: .setTexturePath() has been renamed to .setResourcePath().' ); + return this.setResourcePath( value ); + + } + + } ); + + Object.assign( ObjectLoader.prototype, { + + setTexturePath: function ( value ) { + + console.warn( 'THREE.ObjectLoader: .setTexturePath() has been renamed to .setResourcePath().' ); + return this.setResourcePath( value ); + + } + + } ); + + // + + Object.assign( Box2.prototype, { + + center: function ( optionalTarget ) { + + console.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }, + empty: function () { + + console.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + + }, + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + size: function ( optionalTarget ) { + + console.warn( 'THREE.Box2: .size() has been renamed to .getSize().' ); + return this.getSize( optionalTarget ); + + } + } ); + + Object.assign( Box3.prototype, { + + center: function ( optionalTarget ) { + + console.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }, + empty: function () { + + console.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + + }, + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + isIntersectionSphere: function ( sphere ) { + + console.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); + return this.intersectsSphere( sphere ); + + }, + size: function ( optionalTarget ) { + + console.warn( 'THREE.Box3: .size() has been renamed to .getSize().' ); + return this.getSize( optionalTarget ); + + } + } ); + + Line3.prototype.center = function ( optionalTarget ) { + + console.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }; + + Object.assign( _Math, { + + random16: function () { + + console.warn( 'THREE.Math: .random16() has been deprecated. Use Math.random() instead.' ); + return Math.random(); + + }, + + nearestPowerOfTwo: function ( value ) { + + console.warn( 'THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo().' ); + return _Math.floorPowerOfTwo( value ); + + }, + + nextPowerOfTwo: function ( value ) { + + console.warn( 'THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo().' ); + return _Math.ceilPowerOfTwo( value ); + + } + + } ); + + Object.assign( Matrix3.prototype, { + + flattenToArrayOffset: function ( array, offset ) { + + console.warn( "THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead." ); + return this.toArray( array, offset ); + + }, + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' ); + return vector.applyMatrix3( this ); + + }, + multiplyVector3Array: function ( /* a */ ) { + + console.error( 'THREE.Matrix3: .multiplyVector3Array() has been removed.' ); + + }, + applyToBuffer: function ( buffer /*, offset, length */ ) { + + console.warn( 'THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' ); + return this.applyToBufferAttribute( buffer ); + + }, + applyToVector3Array: function ( /* array, offset, length */ ) { + + console.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' ); + + } + + } ); + + Object.assign( Matrix4.prototype, { + + extractPosition: function ( m ) { + + console.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' ); + return this.copyPosition( m ); + + }, + flattenToArrayOffset: function ( array, offset ) { + + console.warn( "THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead." ); + return this.toArray( array, offset ); + + }, + getPosition: function () { + + var v1; + + return function getPosition() { + + if ( v1 === undefined ) v1 = new Vector3(); + console.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' ); + return v1.setFromMatrixColumn( this, 3 ); + + }; + + }(), + setRotationFromQuaternion: function ( q ) { + + console.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' ); + return this.makeRotationFromQuaternion( q ); + + }, + multiplyToArray: function () { + + console.warn( 'THREE.Matrix4: .multiplyToArray() has been removed.' ); + + }, + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + multiplyVector4: function ( vector ) { + + console.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + multiplyVector3Array: function ( /* a */ ) { + + console.error( 'THREE.Matrix4: .multiplyVector3Array() has been removed.' ); + + }, + rotateAxis: function ( v ) { + + console.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' ); + v.transformDirection( this ); + + }, + crossVector: function ( vector ) { + + console.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + translate: function () { + + console.error( 'THREE.Matrix4: .translate() has been removed.' ); + + }, + rotateX: function () { + + console.error( 'THREE.Matrix4: .rotateX() has been removed.' ); + + }, + rotateY: function () { + + console.error( 'THREE.Matrix4: .rotateY() has been removed.' ); + + }, + rotateZ: function () { + + console.error( 'THREE.Matrix4: .rotateZ() has been removed.' ); + + }, + rotateByAxis: function () { + + console.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' ); + + }, + applyToBuffer: function ( buffer /*, offset, length */ ) { + + console.warn( 'THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' ); + return this.applyToBufferAttribute( buffer ); + + }, + applyToVector3Array: function ( /* array, offset, length */ ) { + + console.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' ); + + }, + makeFrustum: function ( left, right, bottom, top, near, far ) { + + console.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' ); + return this.makePerspective( left, right, top, bottom, near, far ); + + } + + } ); + + Plane.prototype.isIntersectionLine = function ( line ) { + + console.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' ); + return this.intersectsLine( line ); + + }; + + Quaternion.prototype.multiplyVector3 = function ( vector ) { + + console.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' ); + return vector.applyQuaternion( this ); + + }; + + Object.assign( Ray.prototype, { + + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + isIntersectionPlane: function ( plane ) { + + console.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' ); + return this.intersectsPlane( plane ); + + }, + isIntersectionSphere: function ( sphere ) { + + console.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); + return this.intersectsSphere( sphere ); + + } + + } ); + + Object.assign( Triangle.prototype, { + + area: function () { + + console.warn( 'THREE.Triangle: .area() has been renamed to .getArea().' ); + return this.getArea(); + + }, + barycoordFromPoint: function ( point, target ) { + + console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' ); + return this.getBarycoord( point, target ); + + }, + midpoint: function ( target ) { + + console.warn( 'THREE.Triangle: .midpoint() has been renamed to .getMidpoint().' ); + return this.getMidpoint( target ); + + }, + normal: function ( target ) { + + console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' ); + return this.getNormal( target ); + + }, + plane: function ( target ) { + + console.warn( 'THREE.Triangle: .plane() has been renamed to .getPlane().' ); + return this.getPlane( target ); + + } + + } ); + + Object.assign( Triangle, { + + barycoordFromPoint: function ( point, a, b, c, target ) { + + console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' ); + return Triangle.getBarycoord( point, a, b, c, target ); + + }, + normal: function ( a, b, c, target ) { + + console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' ); + return Triangle.getNormal( a, b, c, target ); + + } + + } ); + + Object.assign( Shape.prototype, { + + extractAllPoints: function ( divisions ) { + + console.warn( 'THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.' ); + return this.extractPoints( divisions ); + + }, + extrude: function ( options ) { + + console.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' ); + return new ExtrudeGeometry( this, options ); + + }, + makeGeometry: function ( options ) { + + console.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' ); + return new ShapeGeometry( this, options ); + + } + + } ); + + Object.assign( Vector2.prototype, { + + fromAttribute: function ( attribute, index, offset ) { + + console.warn( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + }, + distanceToManhattan: function ( v ) { + + console.warn( 'THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' ); + return this.manhattanDistanceTo( v ); + + }, + lengthManhattan: function () { + + console.warn( 'THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().' ); + return this.manhattanLength(); + + } + + } ); + + Object.assign( Vector3.prototype, { + + setEulerFromRotationMatrix: function () { + + console.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' ); + + }, + setEulerFromQuaternion: function () { + + console.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' ); + + }, + getPositionFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' ); + return this.setFromMatrixPosition( m ); + + }, + getScaleFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' ); + return this.setFromMatrixScale( m ); + + }, + getColumnFromMatrix: function ( index, matrix ) { + + console.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' ); + return this.setFromMatrixColumn( matrix, index ); + + }, + applyProjection: function ( m ) { + + console.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' ); + return this.applyMatrix4( m ); + + }, + fromAttribute: function ( attribute, index, offset ) { + + console.warn( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + }, + distanceToManhattan: function ( v ) { + + console.warn( 'THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' ); + return this.manhattanDistanceTo( v ); + + }, + lengthManhattan: function () { + + console.warn( 'THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().' ); + return this.manhattanLength(); + + } + + } ); + + Object.assign( Vector4.prototype, { + + fromAttribute: function ( attribute, index, offset ) { + + console.warn( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + }, + lengthManhattan: function () { + + console.warn( 'THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().' ); + return this.manhattanLength(); + + } + + } ); + + // + + Object.assign( Geometry.prototype, { + + computeTangents: function () { + + console.error( 'THREE.Geometry: .computeTangents() has been removed.' ); + + }, + computeLineDistances: function () { + + console.error( 'THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.' ); + + } + + } ); + + Object.assign( Object3D.prototype, { + + getChildByName: function ( name ) { + + console.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' ); + return this.getObjectByName( name ); + + }, + renderDepth: function () { + + console.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' ); + + }, + translate: function ( distance, axis ) { + + console.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' ); + return this.translateOnAxis( axis, distance ); + + }, + getWorldRotation: function () { + + console.error( 'THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.' ); + + } + + } ); + + Object.defineProperties( Object3D.prototype, { + + eulerOrder: { + get: function () { + + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + return this.rotation.order; + + }, + set: function ( value ) { + + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + this.rotation.order = value; + + } + }, + useQuaternion: { + get: function () { + + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + + }, + set: function () { + + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + + } + } + + } ); + + Object.defineProperties( LOD.prototype, { + + objects: { + get: function () { + + console.warn( 'THREE.LOD: .objects has been renamed to .levels.' ); + return this.levels; + + } + } + + } ); + + Object.defineProperty( Skeleton.prototype, 'useVertexTexture', { + + get: function () { + + console.warn( 'THREE.Skeleton: useVertexTexture has been removed.' ); + + }, + set: function () { + + console.warn( 'THREE.Skeleton: useVertexTexture has been removed.' ); + + } + + } ); + + Object.defineProperty( Curve.prototype, '__arcLengthDivisions', { + + get: function () { + + console.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' ); + return this.arcLengthDivisions; + + }, + set: function ( value ) { + + console.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' ); + this.arcLengthDivisions = value; + + } + + } ); + + // + + PerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) { + + console.warn( "THREE.PerspectiveCamera.setLens is deprecated. " + + "Use .setFocalLength and .filmGauge for a photographic setup." ); + + if ( filmGauge !== undefined ) this.filmGauge = filmGauge; + this.setFocalLength( focalLength ); + + }; + + // + + Object.defineProperties( Light.prototype, { + onlyShadow: { + set: function () { + + console.warn( 'THREE.Light: .onlyShadow has been removed.' ); + + } + }, + shadowCameraFov: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' ); + this.shadow.camera.fov = value; + + } + }, + shadowCameraLeft: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' ); + this.shadow.camera.left = value; + + } + }, + shadowCameraRight: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' ); + this.shadow.camera.right = value; + + } + }, + shadowCameraTop: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' ); + this.shadow.camera.top = value; + + } + }, + shadowCameraBottom: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' ); + this.shadow.camera.bottom = value; + + } + }, + shadowCameraNear: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' ); + this.shadow.camera.near = value; + + } + }, + shadowCameraFar: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' ); + this.shadow.camera.far = value; + + } + }, + shadowCameraVisible: { + set: function () { + + console.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' ); + + } + }, + shadowBias: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' ); + this.shadow.bias = value; + + } + }, + shadowDarkness: { + set: function () { + + console.warn( 'THREE.Light: .shadowDarkness has been removed.' ); + + } + }, + shadowMapWidth: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' ); + this.shadow.mapSize.width = value; + + } + }, + shadowMapHeight: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' ); + this.shadow.mapSize.height = value; + + } + } + } ); + + // + + Object.defineProperties( BufferAttribute.prototype, { + + length: { + get: function () { + + console.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' ); + return this.array.length; + + } + }, + copyIndicesArray: function ( /* indices */ ) { + + console.error( 'THREE.BufferAttribute: .copyIndicesArray() has been removed.' ); + + } + + } ); + + Object.assign( BufferGeometry.prototype, { + + addIndex: function ( index ) { + + console.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' ); + this.setIndex( index ); + + }, + addDrawCall: function ( start, count, indexOffset ) { + + if ( indexOffset !== undefined ) { + + console.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' ); + + } + console.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' ); + this.addGroup( start, count ); + + }, + clearDrawCalls: function () { + + console.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' ); + this.clearGroups(); + + }, + computeTangents: function () { + + console.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' ); + + }, + computeOffsets: function () { + + console.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' ); + + } + + } ); + + Object.defineProperties( BufferGeometry.prototype, { + + drawcalls: { + get: function () { + + console.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' ); + return this.groups; + + } + }, + offsets: { + get: function () { + + console.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' ); + return this.groups; + + } + } + + } ); + + // + + Object.assign( ExtrudeBufferGeometry.prototype, { + + getArrays: function () { + + console.error( 'THREE.ExtrudeBufferGeometry: .getArrays() has been removed.' ); + + }, + + addShapeList: function () { + + console.error( 'THREE.ExtrudeBufferGeometry: .addShapeList() has been removed.' ); + + }, + + addShape: function () { + + console.error( 'THREE.ExtrudeBufferGeometry: .addShape() has been removed.' ); + + } + + } ); + + // + + Object.defineProperties( Uniform.prototype, { + + dynamic: { + set: function () { + + console.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' ); + + } + }, + onUpdate: { + value: function () { + + console.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' ); + return this; + + } + } + + } ); + + // + + Object.defineProperties( Material.prototype, { + + wrapAround: { + get: function () { + + console.warn( 'THREE.Material: .wrapAround has been removed.' ); + + }, + set: function () { + + console.warn( 'THREE.Material: .wrapAround has been removed.' ); + + } + }, + + overdraw: { + get: function () { + + console.warn( 'THREE.Material: .overdraw has been removed.' ); + + }, + set: function () { + + console.warn( 'THREE.Material: .overdraw has been removed.' ); + + } + }, + + wrapRGB: { + get: function () { + + console.warn( 'THREE.Material: .wrapRGB has been removed.' ); + return new Color(); + + } + }, + + shading: { + get: function () { + + console.error( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' ); + + }, + set: function ( value ) { + + console.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' ); + this.flatShading = ( value === FlatShading ); + + } + } + + } ); + + Object.defineProperties( MeshPhongMaterial.prototype, { + + metal: { + get: function () { + + console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' ); + return false; + + }, + set: function () { + + console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' ); + + } + } + + } ); + + Object.defineProperties( ShaderMaterial.prototype, { + + derivatives: { + get: function () { + + console.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); + return this.extensions.derivatives; + + }, + set: function ( value ) { + + console.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); + this.extensions.derivatives = value; + + } + } + + } ); + + // + + Object.assign( WebGLRenderer.prototype, { + + clearTarget: function ( renderTarget, color, depth, stencil ) { + + console.warn( 'THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead.' ); + this.setRenderTarget( renderTarget ); + this.clear( color, depth, stencil ); + + }, + + animate: function ( callback ) { + + console.warn( 'THREE.WebGLRenderer: .animate() is now .setAnimationLoop().' ); + this.setAnimationLoop( callback ); + + }, + + getCurrentRenderTarget: function () { + + console.warn( 'THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().' ); + return this.getRenderTarget(); + + }, + + getMaxAnisotropy: function () { + + console.warn( 'THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().' ); + return this.capabilities.getMaxAnisotropy(); + + }, + + getPrecision: function () { + + console.warn( 'THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.' ); + return this.capabilities.precision; + + }, + + resetGLState: function () { + + console.warn( 'THREE.WebGLRenderer: .resetGLState() is now .state.reset().' ); + return this.state.reset(); + + }, + + supportsFloatTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \'OES_texture_float\' ).' ); + return this.extensions.get( 'OES_texture_float' ); + + }, + supportsHalfFloatTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \'OES_texture_half_float\' ).' ); + return this.extensions.get( 'OES_texture_half_float' ); + + }, + supportsStandardDerivatives: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \'OES_standard_derivatives\' ).' ); + return this.extensions.get( 'OES_standard_derivatives' ); + + }, + supportsCompressedTextureS3TC: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \'WEBGL_compressed_texture_s3tc\' ).' ); + return this.extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + }, + supportsCompressedTexturePVRTC: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \'WEBGL_compressed_texture_pvrtc\' ).' ); + return this.extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + }, + supportsBlendMinMax: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \'EXT_blend_minmax\' ).' ); + return this.extensions.get( 'EXT_blend_minmax' ); + + }, + supportsVertexTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' ); + return this.capabilities.vertexTextures; + + }, + supportsInstancedArrays: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \'ANGLE_instanced_arrays\' ).' ); + return this.extensions.get( 'ANGLE_instanced_arrays' ); + + }, + enableScissorTest: function ( boolean ) { + + console.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' ); + this.setScissorTest( boolean ); + + }, + initMaterial: function () { + + console.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' ); + + }, + addPrePlugin: function () { + + console.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' ); + + }, + addPostPlugin: function () { + + console.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' ); + + }, + updateShadowMap: function () { + + console.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' ); + + }, + setFaceCulling: function () { + + console.warn( 'THREE.WebGLRenderer: .setFaceCulling() has been removed.' ); + + } + + } ); + + Object.defineProperties( WebGLRenderer.prototype, { + + shadowMapEnabled: { + get: function () { + + return this.shadowMap.enabled; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' ); + this.shadowMap.enabled = value; + + } + }, + shadowMapType: { + get: function () { + + return this.shadowMap.type; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' ); + this.shadowMap.type = value; + + } + }, + shadowMapCullFace: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function ( /* value */ ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' ); + + } + } + } ); + + Object.defineProperties( WebGLShadowMap.prototype, { + + cullFace: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function ( /* cullFace */ ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' ); + + } + }, + renderReverseSided: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' ); + + } + }, + renderSingleSided: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' ); + + } + } + + } ); + + // + + Object.defineProperties( WebGLRenderTarget.prototype, { + + wrapS: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + return this.texture.wrapS; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + this.texture.wrapS = value; + + } + }, + wrapT: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + return this.texture.wrapT; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + this.texture.wrapT = value; + + } + }, + magFilter: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + return this.texture.magFilter; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + this.texture.magFilter = value; + + } + }, + minFilter: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + return this.texture.minFilter; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + this.texture.minFilter = value; + + } + }, + anisotropy: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + return this.texture.anisotropy; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + this.texture.anisotropy = value; + + } + }, + offset: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + return this.texture.offset; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + this.texture.offset = value; + + } + }, + repeat: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + return this.texture.repeat; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + this.texture.repeat = value; + + } + }, + format: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + return this.texture.format; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + this.texture.format = value; + + } + }, + type: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + return this.texture.type; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + this.texture.type = value; + + } + }, + generateMipmaps: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + return this.texture.generateMipmaps; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + this.texture.generateMipmaps = value; + + } + } + + } ); + + // + + Object.defineProperties( WebVRManager.prototype, { + + standing: { + set: function ( /* value */ ) { + + console.warn( 'THREE.WebVRManager: .standing has been removed.' ); + + } + }, + userHeight: { + set: function ( /* value */ ) { + + console.warn( 'THREE.WebVRManager: .userHeight has been removed.' ); + + } + } + + } ); + + // + + Audio.prototype.load = function ( file ) { + + console.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' ); + var scope = this; + var audioLoader = new AudioLoader(); + audioLoader.load( file, function ( buffer ) { + + scope.setBuffer( buffer ); + + } ); + return this; + + }; + + AudioAnalyser.prototype.getData = function () { + + console.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' ); + return this.getFrequencyData(); + + }; + + // + + CubeCamera.prototype.updateCubeMap = function ( renderer, scene ) { + + console.warn( 'THREE.CubeCamera: .updateCubeMap() is now .update().' ); + return this.update( renderer, scene ); + + }; + + // + + var GeometryUtils = { + + merge: function ( geometry1, geometry2, materialIndexOffset ) { + + console.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' ); + var matrix; + + if ( geometry2.isMesh ) { + + geometry2.matrixAutoUpdate && geometry2.updateMatrix(); + + matrix = geometry2.matrix; + geometry2 = geometry2.geometry; + + } + + geometry1.merge( geometry2, matrix, materialIndexOffset ); + + }, + + center: function ( geometry ) { + + console.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' ); + return geometry.center(); + + } + + }; + + ImageUtils.crossOrigin = undefined; + + ImageUtils.loadTexture = function ( url, mapping, onLoad, onError ) { + + console.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' ); + + var loader = new TextureLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + var texture = loader.load( url, onLoad, undefined, onError ); + + if ( mapping ) texture.mapping = mapping; + + return texture; + + }; + + ImageUtils.loadTextureCube = function ( urls, mapping, onLoad, onError ) { + + console.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' ); + + var loader = new CubeTextureLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + var texture = loader.load( urls, onLoad, undefined, onError ); + + if ( mapping ) texture.mapping = mapping; + + return texture; + + }; + + ImageUtils.loadCompressedTexture = function () { + + console.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' ); + + }; + + ImageUtils.loadCompressedTextureCube = function () { + + console.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' ); + + }; + + // + + function Projector() { + + console.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' ); + + this.projectVector = function ( vector, camera ) { + + console.warn( 'THREE.Projector: .projectVector() is now vector.project().' ); + vector.project( camera ); + + }; + + this.unprojectVector = function ( vector, camera ) { + + console.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' ); + vector.unproject( camera ); + + }; + + this.pickingRay = function () { + + console.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' ); + + }; + + } + + // + + function CanvasRenderer() { + + console.error( 'THREE.CanvasRenderer has been removed' ); + + } + + // + + var SceneUtils = { + + createMultiMaterialObject: function ( /* geometry, materials */ ) { + + console.error( 'THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js' ); + + }, + + detach: function ( /* child, parent, scene */ ) { + + console.error( 'THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js' ); + + }, + + attach: function ( /* child, scene, parent */ ) { + + console.error( 'THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js' ); + + } + + }; + + // + + function LensFlare() { + + console.error( 'THREE.LensFlare has been moved to /examples/js/objects/Lensflare.js' ); + + } + + exports.WebGLRenderTargetCube = WebGLRenderTargetCube; + exports.WebGLRenderTarget = WebGLRenderTarget; + exports.WebGLRenderer = WebGLRenderer; + exports.ShaderLib = ShaderLib; + exports.UniformsLib = UniformsLib; + exports.UniformsUtils = UniformsUtils; + exports.ShaderChunk = ShaderChunk; + exports.FogExp2 = FogExp2; + exports.Fog = Fog; + exports.Scene = Scene; + exports.Sprite = Sprite; + exports.LOD = LOD; + exports.SkinnedMesh = SkinnedMesh; + exports.Skeleton = Skeleton; + exports.Bone = Bone; + exports.Mesh = Mesh; + exports.LineSegments = LineSegments; + exports.LineLoop = LineLoop; + exports.Line = Line; + exports.Points = Points; + exports.Group = Group; + exports.VideoTexture = VideoTexture; + exports.DataTexture = DataTexture; + exports.DataTexture3D = DataTexture3D; + exports.CompressedTexture = CompressedTexture; + exports.CubeTexture = CubeTexture; + exports.CanvasTexture = CanvasTexture; + exports.DepthTexture = DepthTexture; + exports.Texture = Texture; + exports.AnimationLoader = AnimationLoader; + exports.CompressedTextureLoader = CompressedTextureLoader; + exports.DataTextureLoader = DataTextureLoader; + exports.CubeTextureLoader = CubeTextureLoader; + exports.TextureLoader = TextureLoader; + exports.ObjectLoader = ObjectLoader; + exports.MaterialLoader = MaterialLoader; + exports.BufferGeometryLoader = BufferGeometryLoader; + exports.DefaultLoadingManager = DefaultLoadingManager; + exports.LoadingManager = LoadingManager; + exports.JSONLoader = JSONLoader; + exports.ImageLoader = ImageLoader; + exports.ImageBitmapLoader = ImageBitmapLoader; + exports.FontLoader = FontLoader; + exports.FileLoader = FileLoader; + exports.Loader = Loader; + exports.LoaderUtils = LoaderUtils; + exports.Cache = Cache; + exports.AudioLoader = AudioLoader; + exports.SpotLightShadow = SpotLightShadow; + exports.SpotLight = SpotLight; + exports.PointLight = PointLight; + exports.RectAreaLight = RectAreaLight; + exports.HemisphereLight = HemisphereLight; + exports.DirectionalLightShadow = DirectionalLightShadow; + exports.DirectionalLight = DirectionalLight; + exports.AmbientLight = AmbientLight; + exports.LightShadow = LightShadow; + exports.Light = Light; + exports.StereoCamera = StereoCamera; + exports.PerspectiveCamera = PerspectiveCamera; + exports.OrthographicCamera = OrthographicCamera; + exports.CubeCamera = CubeCamera; + exports.ArrayCamera = ArrayCamera; + exports.Camera = Camera; + exports.AudioListener = AudioListener; + exports.PositionalAudio = PositionalAudio; + exports.AudioContext = AudioContext; + exports.AudioAnalyser = AudioAnalyser; + exports.Audio = Audio; + exports.VectorKeyframeTrack = VectorKeyframeTrack; + exports.StringKeyframeTrack = StringKeyframeTrack; + exports.QuaternionKeyframeTrack = QuaternionKeyframeTrack; + exports.NumberKeyframeTrack = NumberKeyframeTrack; + exports.ColorKeyframeTrack = ColorKeyframeTrack; + exports.BooleanKeyframeTrack = BooleanKeyframeTrack; + exports.PropertyMixer = PropertyMixer; + exports.PropertyBinding = PropertyBinding; + exports.KeyframeTrack = KeyframeTrack; + exports.AnimationUtils = AnimationUtils; + exports.AnimationObjectGroup = AnimationObjectGroup; + exports.AnimationMixer = AnimationMixer; + exports.AnimationClip = AnimationClip; + exports.Uniform = Uniform; + exports.InstancedBufferGeometry = InstancedBufferGeometry; + exports.BufferGeometry = BufferGeometry; + exports.Geometry = Geometry; + exports.InterleavedBufferAttribute = InterleavedBufferAttribute; + exports.InstancedInterleavedBuffer = InstancedInterleavedBuffer; + exports.InterleavedBuffer = InterleavedBuffer; + exports.InstancedBufferAttribute = InstancedBufferAttribute; + exports.Face3 = Face3; + exports.Object3D = Object3D; + exports.Raycaster = Raycaster; + exports.Layers = Layers; + exports.EventDispatcher = EventDispatcher; + exports.Clock = Clock; + exports.QuaternionLinearInterpolant = QuaternionLinearInterpolant; + exports.LinearInterpolant = LinearInterpolant; + exports.DiscreteInterpolant = DiscreteInterpolant; + exports.CubicInterpolant = CubicInterpolant; + exports.Interpolant = Interpolant; + exports.Triangle = Triangle; + exports.Math = _Math; + exports.Spherical = Spherical; + exports.Cylindrical = Cylindrical; + exports.Plane = Plane; + exports.Frustum = Frustum; + exports.Sphere = Sphere; + exports.Ray = Ray; + exports.Matrix4 = Matrix4; + exports.Matrix3 = Matrix3; + exports.Box3 = Box3; + exports.Box2 = Box2; + exports.Line3 = Line3; + exports.Euler = Euler; + exports.Vector4 = Vector4; + exports.Vector3 = Vector3; + exports.Vector2 = Vector2; + exports.Quaternion = Quaternion; + exports.Color = Color; + exports.ImmediateRenderObject = ImmediateRenderObject; + exports.VertexNormalsHelper = VertexNormalsHelper; + exports.SpotLightHelper = SpotLightHelper; + exports.SkeletonHelper = SkeletonHelper; + exports.PointLightHelper = PointLightHelper; + exports.RectAreaLightHelper = RectAreaLightHelper; + exports.HemisphereLightHelper = HemisphereLightHelper; + exports.GridHelper = GridHelper; + exports.PolarGridHelper = PolarGridHelper; + exports.FaceNormalsHelper = FaceNormalsHelper; + exports.DirectionalLightHelper = DirectionalLightHelper; + exports.CameraHelper = CameraHelper; + exports.BoxHelper = BoxHelper; + exports.Box3Helper = Box3Helper; + exports.PlaneHelper = PlaneHelper; + exports.ArrowHelper = ArrowHelper; + exports.AxesHelper = AxesHelper; + exports.Shape = Shape; + exports.Path = Path; + exports.ShapePath = ShapePath; + exports.Font = Font; + exports.CurvePath = CurvePath; + exports.Curve = Curve; + exports.ImageUtils = ImageUtils; + exports.ShapeUtils = ShapeUtils; + exports.WebGLUtils = WebGLUtils; + exports.WireframeGeometry = WireframeGeometry; + exports.ParametricGeometry = ParametricGeometry; + exports.ParametricBufferGeometry = ParametricBufferGeometry; + exports.TetrahedronGeometry = TetrahedronGeometry; + exports.TetrahedronBufferGeometry = TetrahedronBufferGeometry; + exports.OctahedronGeometry = OctahedronGeometry; + exports.OctahedronBufferGeometry = OctahedronBufferGeometry; + exports.IcosahedronGeometry = IcosahedronGeometry; + exports.IcosahedronBufferGeometry = IcosahedronBufferGeometry; + exports.DodecahedronGeometry = DodecahedronGeometry; + exports.DodecahedronBufferGeometry = DodecahedronBufferGeometry; + exports.PolyhedronGeometry = PolyhedronGeometry; + exports.PolyhedronBufferGeometry = PolyhedronBufferGeometry; + exports.TubeGeometry = TubeGeometry; + exports.TubeBufferGeometry = TubeBufferGeometry; + exports.TorusKnotGeometry = TorusKnotGeometry; + exports.TorusKnotBufferGeometry = TorusKnotBufferGeometry; + exports.TorusGeometry = TorusGeometry; + exports.TorusBufferGeometry = TorusBufferGeometry; + exports.TextGeometry = TextGeometry; + exports.TextBufferGeometry = TextBufferGeometry; + exports.SphereGeometry = SphereGeometry; + exports.SphereBufferGeometry = SphereBufferGeometry; + exports.RingGeometry = RingGeometry; + exports.RingBufferGeometry = RingBufferGeometry; + exports.PlaneGeometry = PlaneGeometry; + exports.PlaneBufferGeometry = PlaneBufferGeometry; + exports.LatheGeometry = LatheGeometry; + exports.LatheBufferGeometry = LatheBufferGeometry; + exports.ShapeGeometry = ShapeGeometry; + exports.ShapeBufferGeometry = ShapeBufferGeometry; + exports.ExtrudeGeometry = ExtrudeGeometry; + exports.ExtrudeBufferGeometry = ExtrudeBufferGeometry; + exports.EdgesGeometry = EdgesGeometry; + exports.ConeGeometry = ConeGeometry; + exports.ConeBufferGeometry = ConeBufferGeometry; + exports.CylinderGeometry = CylinderGeometry; + exports.CylinderBufferGeometry = CylinderBufferGeometry; + exports.CircleGeometry = CircleGeometry; + exports.CircleBufferGeometry = CircleBufferGeometry; + exports.BoxGeometry = BoxGeometry; + exports.BoxBufferGeometry = BoxBufferGeometry; + exports.ShadowMaterial = ShadowMaterial; + exports.SpriteMaterial = SpriteMaterial; + exports.RawShaderMaterial = RawShaderMaterial; + exports.ShaderMaterial = ShaderMaterial; + exports.PointsMaterial = PointsMaterial; + exports.MeshPhysicalMaterial = MeshPhysicalMaterial; + exports.MeshStandardMaterial = MeshStandardMaterial; + exports.MeshPhongMaterial = MeshPhongMaterial; + exports.MeshToonMaterial = MeshToonMaterial; + exports.MeshNormalMaterial = MeshNormalMaterial; + exports.MeshLambertMaterial = MeshLambertMaterial; + exports.MeshDepthMaterial = MeshDepthMaterial; + exports.MeshDistanceMaterial = MeshDistanceMaterial; + exports.MeshBasicMaterial = MeshBasicMaterial; + exports.MeshMatcapMaterial = MeshMatcapMaterial; + exports.LineDashedMaterial = LineDashedMaterial; + exports.LineBasicMaterial = LineBasicMaterial; + exports.Material = Material; + exports.Float64BufferAttribute = Float64BufferAttribute; + exports.Float32BufferAttribute = Float32BufferAttribute; + exports.Uint32BufferAttribute = Uint32BufferAttribute; + exports.Int32BufferAttribute = Int32BufferAttribute; + exports.Uint16BufferAttribute = Uint16BufferAttribute; + exports.Int16BufferAttribute = Int16BufferAttribute; + exports.Uint8ClampedBufferAttribute = Uint8ClampedBufferAttribute; + exports.Uint8BufferAttribute = Uint8BufferAttribute; + exports.Int8BufferAttribute = Int8BufferAttribute; + exports.BufferAttribute = BufferAttribute; + exports.ArcCurve = ArcCurve; + exports.CatmullRomCurve3 = CatmullRomCurve3; + exports.CubicBezierCurve = CubicBezierCurve; + exports.CubicBezierCurve3 = CubicBezierCurve3; + exports.EllipseCurve = EllipseCurve; + exports.LineCurve = LineCurve; + exports.LineCurve3 = LineCurve3; + exports.QuadraticBezierCurve = QuadraticBezierCurve; + exports.QuadraticBezierCurve3 = QuadraticBezierCurve3; + exports.SplineCurve = SplineCurve; + exports.REVISION = REVISION; + exports.MOUSE = MOUSE; + exports.CullFaceNone = CullFaceNone; + exports.CullFaceBack = CullFaceBack; + exports.CullFaceFront = CullFaceFront; + exports.CullFaceFrontBack = CullFaceFrontBack; + exports.FrontFaceDirectionCW = FrontFaceDirectionCW; + exports.FrontFaceDirectionCCW = FrontFaceDirectionCCW; + exports.BasicShadowMap = BasicShadowMap; + exports.PCFShadowMap = PCFShadowMap; + exports.PCFSoftShadowMap = PCFSoftShadowMap; + exports.FrontSide = FrontSide; + exports.BackSide = BackSide; + exports.DoubleSide = DoubleSide; + exports.FlatShading = FlatShading; + exports.SmoothShading = SmoothShading; + exports.NoColors = NoColors; + exports.FaceColors = FaceColors; + exports.VertexColors = VertexColors; + exports.NoBlending = NoBlending; + exports.NormalBlending = NormalBlending; + exports.AdditiveBlending = AdditiveBlending; + exports.SubtractiveBlending = SubtractiveBlending; + exports.MultiplyBlending = MultiplyBlending; + exports.CustomBlending = CustomBlending; + exports.AddEquation = AddEquation; + exports.SubtractEquation = SubtractEquation; + exports.ReverseSubtractEquation = ReverseSubtractEquation; + exports.MinEquation = MinEquation; + exports.MaxEquation = MaxEquation; + exports.ZeroFactor = ZeroFactor; + exports.OneFactor = OneFactor; + exports.SrcColorFactor = SrcColorFactor; + exports.OneMinusSrcColorFactor = OneMinusSrcColorFactor; + exports.SrcAlphaFactor = SrcAlphaFactor; + exports.OneMinusSrcAlphaFactor = OneMinusSrcAlphaFactor; + exports.DstAlphaFactor = DstAlphaFactor; + exports.OneMinusDstAlphaFactor = OneMinusDstAlphaFactor; + exports.DstColorFactor = DstColorFactor; + exports.OneMinusDstColorFactor = OneMinusDstColorFactor; + exports.SrcAlphaSaturateFactor = SrcAlphaSaturateFactor; + exports.NeverDepth = NeverDepth; + exports.AlwaysDepth = AlwaysDepth; + exports.LessDepth = LessDepth; + exports.LessEqualDepth = LessEqualDepth; + exports.EqualDepth = EqualDepth; + exports.GreaterEqualDepth = GreaterEqualDepth; + exports.GreaterDepth = GreaterDepth; + exports.NotEqualDepth = NotEqualDepth; + exports.MultiplyOperation = MultiplyOperation; + exports.MixOperation = MixOperation; + exports.AddOperation = AddOperation; + exports.NoToneMapping = NoToneMapping; + exports.LinearToneMapping = LinearToneMapping; + exports.ReinhardToneMapping = ReinhardToneMapping; + exports.Uncharted2ToneMapping = Uncharted2ToneMapping; + exports.CineonToneMapping = CineonToneMapping; + exports.UVMapping = UVMapping; + exports.CubeReflectionMapping = CubeReflectionMapping; + exports.CubeRefractionMapping = CubeRefractionMapping; + exports.EquirectangularReflectionMapping = EquirectangularReflectionMapping; + exports.EquirectangularRefractionMapping = EquirectangularRefractionMapping; + exports.SphericalReflectionMapping = SphericalReflectionMapping; + exports.CubeUVReflectionMapping = CubeUVReflectionMapping; + exports.CubeUVRefractionMapping = CubeUVRefractionMapping; + exports.RepeatWrapping = RepeatWrapping; + exports.ClampToEdgeWrapping = ClampToEdgeWrapping; + exports.MirroredRepeatWrapping = MirroredRepeatWrapping; + exports.NearestFilter = NearestFilter; + exports.NearestMipMapNearestFilter = NearestMipMapNearestFilter; + exports.NearestMipMapLinearFilter = NearestMipMapLinearFilter; + exports.LinearFilter = LinearFilter; + exports.LinearMipMapNearestFilter = LinearMipMapNearestFilter; + exports.LinearMipMapLinearFilter = LinearMipMapLinearFilter; + exports.UnsignedByteType = UnsignedByteType; + exports.ByteType = ByteType; + exports.ShortType = ShortType; + exports.UnsignedShortType = UnsignedShortType; + exports.IntType = IntType; + exports.UnsignedIntType = UnsignedIntType; + exports.FloatType = FloatType; + exports.HalfFloatType = HalfFloatType; + exports.UnsignedShort4444Type = UnsignedShort4444Type; + exports.UnsignedShort5551Type = UnsignedShort5551Type; + exports.UnsignedShort565Type = UnsignedShort565Type; + exports.UnsignedInt248Type = UnsignedInt248Type; + exports.AlphaFormat = AlphaFormat; + exports.RGBFormat = RGBFormat; + exports.RGBAFormat = RGBAFormat; + exports.LuminanceFormat = LuminanceFormat; + exports.LuminanceAlphaFormat = LuminanceAlphaFormat; + exports.RGBEFormat = RGBEFormat; + exports.DepthFormat = DepthFormat; + exports.DepthStencilFormat = DepthStencilFormat; + exports.RedFormat = RedFormat; + exports.RGB_S3TC_DXT1_Format = RGB_S3TC_DXT1_Format; + exports.RGBA_S3TC_DXT1_Format = RGBA_S3TC_DXT1_Format; + exports.RGBA_S3TC_DXT3_Format = RGBA_S3TC_DXT3_Format; + exports.RGBA_S3TC_DXT5_Format = RGBA_S3TC_DXT5_Format; + exports.RGB_PVRTC_4BPPV1_Format = RGB_PVRTC_4BPPV1_Format; + exports.RGB_PVRTC_2BPPV1_Format = RGB_PVRTC_2BPPV1_Format; + exports.RGBA_PVRTC_4BPPV1_Format = RGBA_PVRTC_4BPPV1_Format; + exports.RGBA_PVRTC_2BPPV1_Format = RGBA_PVRTC_2BPPV1_Format; + exports.RGB_ETC1_Format = RGB_ETC1_Format; + exports.RGBA_ASTC_4x4_Format = RGBA_ASTC_4x4_Format; + exports.RGBA_ASTC_5x4_Format = RGBA_ASTC_5x4_Format; + exports.RGBA_ASTC_5x5_Format = RGBA_ASTC_5x5_Format; + exports.RGBA_ASTC_6x5_Format = RGBA_ASTC_6x5_Format; + exports.RGBA_ASTC_6x6_Format = RGBA_ASTC_6x6_Format; + exports.RGBA_ASTC_8x5_Format = RGBA_ASTC_8x5_Format; + exports.RGBA_ASTC_8x6_Format = RGBA_ASTC_8x6_Format; + exports.RGBA_ASTC_8x8_Format = RGBA_ASTC_8x8_Format; + exports.RGBA_ASTC_10x5_Format = RGBA_ASTC_10x5_Format; + exports.RGBA_ASTC_10x6_Format = RGBA_ASTC_10x6_Format; + exports.RGBA_ASTC_10x8_Format = RGBA_ASTC_10x8_Format; + exports.RGBA_ASTC_10x10_Format = RGBA_ASTC_10x10_Format; + exports.RGBA_ASTC_12x10_Format = RGBA_ASTC_12x10_Format; + exports.RGBA_ASTC_12x12_Format = RGBA_ASTC_12x12_Format; + exports.LoopOnce = LoopOnce; + exports.LoopRepeat = LoopRepeat; + exports.LoopPingPong = LoopPingPong; + exports.InterpolateDiscrete = InterpolateDiscrete; + exports.InterpolateLinear = InterpolateLinear; + exports.InterpolateSmooth = InterpolateSmooth; + exports.ZeroCurvatureEnding = ZeroCurvatureEnding; + exports.ZeroSlopeEnding = ZeroSlopeEnding; + exports.WrapAroundEnding = WrapAroundEnding; + exports.TrianglesDrawMode = TrianglesDrawMode; + exports.TriangleStripDrawMode = TriangleStripDrawMode; + exports.TriangleFanDrawMode = TriangleFanDrawMode; + exports.LinearEncoding = LinearEncoding; + exports.sRGBEncoding = sRGBEncoding; + exports.GammaEncoding = GammaEncoding; + exports.RGBEEncoding = RGBEEncoding; + exports.LogLuvEncoding = LogLuvEncoding; + exports.RGBM7Encoding = RGBM7Encoding; + exports.RGBM16Encoding = RGBM16Encoding; + exports.RGBDEncoding = RGBDEncoding; + exports.BasicDepthPacking = BasicDepthPacking; + exports.RGBADepthPacking = RGBADepthPacking; + exports.TangentSpaceNormalMap = TangentSpaceNormalMap; + exports.ObjectSpaceNormalMap = ObjectSpaceNormalMap; + exports.CubeGeometry = BoxGeometry; + exports.Face4 = Face4; + exports.LineStrip = LineStrip; + exports.LinePieces = LinePieces; + exports.MeshFaceMaterial = MeshFaceMaterial; + exports.MultiMaterial = MultiMaterial; + exports.PointCloud = PointCloud; + exports.Particle = Particle; + exports.ParticleSystem = ParticleSystem; + exports.PointCloudMaterial = PointCloudMaterial; + exports.ParticleBasicMaterial = ParticleBasicMaterial; + exports.ParticleSystemMaterial = ParticleSystemMaterial; + exports.Vertex = Vertex; + exports.DynamicBufferAttribute = DynamicBufferAttribute; + exports.Int8Attribute = Int8Attribute; + exports.Uint8Attribute = Uint8Attribute; + exports.Uint8ClampedAttribute = Uint8ClampedAttribute; + exports.Int16Attribute = Int16Attribute; + exports.Uint16Attribute = Uint16Attribute; + exports.Int32Attribute = Int32Attribute; + exports.Uint32Attribute = Uint32Attribute; + exports.Float32Attribute = Float32Attribute; + exports.Float64Attribute = Float64Attribute; + exports.ClosedSplineCurve3 = ClosedSplineCurve3; + exports.SplineCurve3 = SplineCurve3; + exports.Spline = Spline; + exports.AxisHelper = AxisHelper; + exports.BoundingBoxHelper = BoundingBoxHelper; + exports.EdgesHelper = EdgesHelper; + exports.WireframeHelper = WireframeHelper; + exports.XHRLoader = XHRLoader; + exports.BinaryTextureLoader = BinaryTextureLoader; + exports.GeometryUtils = GeometryUtils; + exports.Projector = Projector; + exports.CanvasRenderer = CanvasRenderer; + exports.SceneUtils = SceneUtils; + exports.LensFlare = LensFlare; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); diff --git a/lib/utils.js b/lib/utils.js new file mode 100644 index 0000000..6783c51 --- /dev/null +++ b/lib/utils.js @@ -0,0 +1,37 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function arrayMin( array ) { + + if ( array.length === 0 ) return Infinity; + + var min = array[ 0 ]; + + for ( var i = 1, l = array.length; i < l; ++ i ) { + + if ( array[ i ] < min ) min = array[ i ]; + + } + + return min; + +} + +function arrayMax( array ) { + + if ( array.length === 0 ) return - Infinity; + + var max = array[ 0 ]; + + for ( var i = 1, l = array.length; i < l; ++ i ) { + + if ( array[ i ] > max ) max = array[ i ]; + + } + + return max; + +} + +export { arrayMin, arrayMax }; diff --git a/lib/whs.js b/lib/whs.js new file mode 100644 index 0000000..3af1d41 --- /dev/null +++ b/lib/whs.js @@ -0,0 +1,62443 @@ +/* WhitestormJS Framework v2.2.0-beta.2 */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.WHS = {}))); +}(this, (function (exports) { 'use strict'; + + function createCommonjsModule(fn, module) { + return module = { exports: {} }, fn(module, module.exports), module.exports; + } + + var runtime = createCommonjsModule(function (module) { + /** + * Copyright (c) 2014-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + !(function(global) { + + var Op = Object.prototype; + var hasOwn = Op.hasOwnProperty; + var undefined; // More compressible than void 0. + var $Symbol = typeof Symbol === "function" ? Symbol : {}; + var iteratorSymbol = $Symbol.iterator || "@@iterator"; + var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator"; + var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; + + var inModule = 'object' === "object"; + var runtime = global.regeneratorRuntime; + if (runtime) { + if (inModule) { + // If regeneratorRuntime is defined globally and we're in a module, + // make the exports object identical to regeneratorRuntime. + module.exports = runtime; + } + // Don't bother evaluating the rest of this file if the runtime was + // already defined globally. + return; + } + + // Define the runtime globally (as expected by generated code) as either + // module.exports (if we're in a module) or a new, empty object. + runtime = global.regeneratorRuntime = inModule ? module.exports : {}; + + function wrap(innerFn, outerFn, self, tryLocsList) { + // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator. + var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator; + var generator = Object.create(protoGenerator.prototype); + var context = new Context(tryLocsList || []); + + // The ._invoke method unifies the implementations of the .next, + // .throw, and .return methods. + generator._invoke = makeInvokeMethod(innerFn, self, context); + + return generator; + } + runtime.wrap = wrap; + + // Try/catch helper to minimize deoptimizations. Returns a completion + // record like context.tryEntries[i].completion. This interface could + // have been (and was previously) designed to take a closure to be + // invoked without arguments, but in all the cases we care about we + // already have an existing method we want to call, so there's no need + // to create a new function object. We can even get away with assuming + // the method takes exactly one argument, since that happens to be true + // in every case, so we don't have to touch the arguments object. The + // only additional allocation required is the completion record, which + // has a stable shape and so hopefully should be cheap to allocate. + function tryCatch(fn, obj, arg) { + try { + return { type: "normal", arg: fn.call(obj, arg) }; + } catch (err) { + return { type: "throw", arg: err }; + } + } + + var GenStateSuspendedStart = "suspendedStart"; + var GenStateSuspendedYield = "suspendedYield"; + var GenStateExecuting = "executing"; + var GenStateCompleted = "completed"; + + // Returning this object from the innerFn has the same effect as + // breaking out of the dispatch switch statement. + var ContinueSentinel = {}; + + // Dummy constructor functions that we use as the .constructor and + // .constructor.prototype properties for functions that return Generator + // objects. For full spec compliance, you may wish to configure your + // minifier not to mangle the names of these two functions. + function Generator() {} + function GeneratorFunction() {} + function GeneratorFunctionPrototype() {} + + // This is a polyfill for %IteratorPrototype% for environments that + // don't natively support it. + var IteratorPrototype = {}; + IteratorPrototype[iteratorSymbol] = function () { + return this; + }; + + var getProto = Object.getPrototypeOf; + var NativeIteratorPrototype = getProto && getProto(getProto(values([]))); + if (NativeIteratorPrototype && + NativeIteratorPrototype !== Op && + hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) { + // This environment has a native %IteratorPrototype%; use it instead + // of the polyfill. + IteratorPrototype = NativeIteratorPrototype; + } + + var Gp = GeneratorFunctionPrototype.prototype = + Generator.prototype = Object.create(IteratorPrototype); + GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype; + GeneratorFunctionPrototype.constructor = GeneratorFunction; + GeneratorFunctionPrototype[toStringTagSymbol] = + GeneratorFunction.displayName = "GeneratorFunction"; + + // Helper for defining the .next, .throw, and .return methods of the + // Iterator interface in terms of a single ._invoke method. + function defineIteratorMethods(prototype) { + ["next", "throw", "return"].forEach(function(method) { + prototype[method] = function(arg) { + return this._invoke(method, arg); + }; + }); + } + + runtime.isGeneratorFunction = function(genFun) { + var ctor = typeof genFun === "function" && genFun.constructor; + return ctor + ? ctor === GeneratorFunction || + // For the native GeneratorFunction constructor, the best we can + // do is to check its .name property. + (ctor.displayName || ctor.name) === "GeneratorFunction" + : false; + }; + + runtime.mark = function(genFun) { + if (Object.setPrototypeOf) { + Object.setPrototypeOf(genFun, GeneratorFunctionPrototype); + } else { + genFun.__proto__ = GeneratorFunctionPrototype; + if (!(toStringTagSymbol in genFun)) { + genFun[toStringTagSymbol] = "GeneratorFunction"; + } + } + genFun.prototype = Object.create(Gp); + return genFun; + }; + + // Within the body of any async function, `await x` is transformed to + // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test + // `hasOwn.call(value, "__await")` to determine if the yielded value is + // meant to be awaited. + runtime.awrap = function(arg) { + return { __await: arg }; + }; + + function AsyncIterator(generator) { + function invoke(method, arg, resolve, reject) { + var record = tryCatch(generator[method], generator, arg); + if (record.type === "throw") { + reject(record.arg); + } else { + var result = record.arg; + var value = result.value; + if (value && + typeof value === "object" && + hasOwn.call(value, "__await")) { + return Promise.resolve(value.__await).then(function(value) { + invoke("next", value, resolve, reject); + }, function(err) { + invoke("throw", err, resolve, reject); + }); + } + + return Promise.resolve(value).then(function(unwrapped) { + // When a yielded Promise is resolved, its final value becomes + // the .value of the Promise<{value,done}> result for the + // current iteration. If the Promise is rejected, however, the + // result for this iteration will be rejected with the same + // reason. Note that rejections of yielded Promises are not + // thrown back into the generator function, as is the case + // when an awaited Promise is rejected. This difference in + // behavior between yield and await is important, because it + // allows the consumer to decide what to do with the yielded + // rejection (swallow it and continue, manually .throw it back + // into the generator, abandon iteration, whatever). With + // await, by contrast, there is no opportunity to examine the + // rejection reason outside the generator function, so the + // only option is to throw it from the await expression, and + // let the generator function handle the exception. + result.value = unwrapped; + resolve(result); + }, reject); + } + } + + var previousPromise; + + function enqueue(method, arg) { + function callInvokeWithMethodAndArg() { + return new Promise(function(resolve, reject) { + invoke(method, arg, resolve, reject); + }); + } + + return previousPromise = + // If enqueue has been called before, then we want to wait until + // all previous Promises have been resolved before calling invoke, + // so that results are always delivered in the correct order. If + // enqueue has not been called before, then it is important to + // call invoke immediately, without waiting on a callback to fire, + // so that the async generator function has the opportunity to do + // any necessary setup in a predictable way. This predictability + // is why the Promise constructor synchronously invokes its + // executor callback, and why async functions synchronously + // execute code before the first await. Since we implement simple + // async functions in terms of async generators, it is especially + // important to get this right, even though it requires care. + previousPromise ? previousPromise.then( + callInvokeWithMethodAndArg, + // Avoid propagating failures to Promises returned by later + // invocations of the iterator. + callInvokeWithMethodAndArg + ) : callInvokeWithMethodAndArg(); + } + + // Define the unified helper method that is used to implement .next, + // .throw, and .return (see defineIteratorMethods). + this._invoke = enqueue; + } + + defineIteratorMethods(AsyncIterator.prototype); + AsyncIterator.prototype[asyncIteratorSymbol] = function () { + return this; + }; + runtime.AsyncIterator = AsyncIterator; + + // Note that simple async functions are implemented on top of + // AsyncIterator objects; they just return a Promise for the value of + // the final result produced by the iterator. + runtime.async = function(innerFn, outerFn, self, tryLocsList) { + var iter = new AsyncIterator( + wrap(innerFn, outerFn, self, tryLocsList) + ); + + return runtime.isGeneratorFunction(outerFn) + ? iter // If outerFn is a generator, return the full iterator. + : iter.next().then(function(result) { + return result.done ? result.value : iter.next(); + }); + }; + + function makeInvokeMethod(innerFn, self, context) { + var state = GenStateSuspendedStart; + + return function invoke(method, arg) { + if (state === GenStateExecuting) { + throw new Error("Generator is already running"); + } + + if (state === GenStateCompleted) { + if (method === "throw") { + throw arg; + } + + // Be forgiving, per 25.3.3.3.3 of the spec: + // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume + return doneResult(); + } + + context.method = method; + context.arg = arg; + + while (true) { + var delegate = context.delegate; + if (delegate) { + var delegateResult = maybeInvokeDelegate(delegate, context); + if (delegateResult) { + if (delegateResult === ContinueSentinel) continue; + return delegateResult; + } + } + + if (context.method === "next") { + // Setting context._sent for legacy support of Babel's + // function.sent implementation. + context.sent = context._sent = context.arg; + + } else if (context.method === "throw") { + if (state === GenStateSuspendedStart) { + state = GenStateCompleted; + throw context.arg; + } + + context.dispatchException(context.arg); + + } else if (context.method === "return") { + context.abrupt("return", context.arg); + } + + state = GenStateExecuting; + + var record = tryCatch(innerFn, self, context); + if (record.type === "normal") { + // If an exception is thrown from innerFn, we leave state === + // GenStateExecuting and loop back for another invocation. + state = context.done + ? GenStateCompleted + : GenStateSuspendedYield; + + if (record.arg === ContinueSentinel) { + continue; + } + + return { + value: record.arg, + done: context.done + }; + + } else if (record.type === "throw") { + state = GenStateCompleted; + // Dispatch the exception by looping back around to the + // context.dispatchException(context.arg) call above. + context.method = "throw"; + context.arg = record.arg; + } + } + }; + } + + // Call delegate.iterator[context.method](context.arg) and handle the + // result, either by returning a { value, done } result from the + // delegate iterator, or by modifying context.method and context.arg, + // setting context.delegate to null, and returning the ContinueSentinel. + function maybeInvokeDelegate(delegate, context) { + var method = delegate.iterator[context.method]; + if (method === undefined) { + // A .throw or .return when the delegate iterator has no .throw + // method always terminates the yield* loop. + context.delegate = null; + + if (context.method === "throw") { + if (delegate.iterator.return) { + // If the delegate iterator has a return method, give it a + // chance to clean up. + context.method = "return"; + context.arg = undefined; + maybeInvokeDelegate(delegate, context); + + if (context.method === "throw") { + // If maybeInvokeDelegate(context) changed context.method from + // "return" to "throw", let that override the TypeError below. + return ContinueSentinel; + } + } + + context.method = "throw"; + context.arg = new TypeError( + "The iterator does not provide a 'throw' method"); + } + + return ContinueSentinel; + } + + var record = tryCatch(method, delegate.iterator, context.arg); + + if (record.type === "throw") { + context.method = "throw"; + context.arg = record.arg; + context.delegate = null; + return ContinueSentinel; + } + + var info = record.arg; + + if (! info) { + context.method = "throw"; + context.arg = new TypeError("iterator result is not an object"); + context.delegate = null; + return ContinueSentinel; + } + + if (info.done) { + // Assign the result of the finished delegate to the temporary + // variable specified by delegate.resultName (see delegateYield). + context[delegate.resultName] = info.value; + + // Resume execution at the desired location (see delegateYield). + context.next = delegate.nextLoc; + + // If context.method was "throw" but the delegate handled the + // exception, let the outer generator proceed normally. If + // context.method was "next", forget context.arg since it has been + // "consumed" by the delegate iterator. If context.method was + // "return", allow the original .return call to continue in the + // outer generator. + if (context.method !== "return") { + context.method = "next"; + context.arg = undefined; + } + + } else { + // Re-yield the result returned by the delegate method. + return info; + } + + // The delegate iterator is finished, so forget it and continue with + // the outer generator. + context.delegate = null; + return ContinueSentinel; + } + + // Define Generator.prototype.{next,throw,return} in terms of the + // unified ._invoke helper method. + defineIteratorMethods(Gp); + + Gp[toStringTagSymbol] = "Generator"; + + // A Generator should always return itself as the iterator object when the + // @@iterator function is called on it. Some browsers' implementations of the + // iterator prototype chain incorrectly implement this, causing the Generator + // object to not be returned from this call. This ensures that doesn't happen. + // See https://github.com/facebook/regenerator/issues/274 for more details. + Gp[iteratorSymbol] = function() { + return this; + }; + + Gp.toString = function() { + return "[object Generator]"; + }; + + function pushTryEntry(locs) { + var entry = { tryLoc: locs[0] }; + + if (1 in locs) { + entry.catchLoc = locs[1]; + } + + if (2 in locs) { + entry.finallyLoc = locs[2]; + entry.afterLoc = locs[3]; + } + + this.tryEntries.push(entry); + } + + function resetTryEntry(entry) { + var record = entry.completion || {}; + record.type = "normal"; + delete record.arg; + entry.completion = record; + } + + function Context(tryLocsList) { + // The root entry object (effectively a try statement without a catch + // or a finally block) gives us a place to store values thrown from + // locations where there is no enclosing try statement. + this.tryEntries = [{ tryLoc: "root" }]; + tryLocsList.forEach(pushTryEntry, this); + this.reset(true); + } + + runtime.keys = function(object) { + var keys = []; + for (var key in object) { + keys.push(key); + } + keys.reverse(); + + // Rather than returning an object with a next method, we keep + // things simple and return the next function itself. + return function next() { + while (keys.length) { + var key = keys.pop(); + if (key in object) { + next.value = key; + next.done = false; + return next; + } + } + + // To avoid creating an additional object, we just hang the .value + // and .done properties off the next function object itself. This + // also ensures that the minifier will not anonymize the function. + next.done = true; + return next; + }; + }; + + function values(iterable) { + if (iterable) { + var iteratorMethod = iterable[iteratorSymbol]; + if (iteratorMethod) { + return iteratorMethod.call(iterable); + } + + if (typeof iterable.next === "function") { + return iterable; + } + + if (!isNaN(iterable.length)) { + var i = -1, next = function next() { + while (++i < iterable.length) { + if (hasOwn.call(iterable, i)) { + next.value = iterable[i]; + next.done = false; + return next; + } + } + + next.value = undefined; + next.done = true; + + return next; + }; + + return next.next = next; + } + } + + // Return an iterator with no values. + return { next: doneResult }; + } + runtime.values = values; + + function doneResult() { + return { value: undefined, done: true }; + } + + Context.prototype = { + constructor: Context, + + reset: function(skipTempReset) { + this.prev = 0; + this.next = 0; + // Resetting context._sent for legacy support of Babel's + // function.sent implementation. + this.sent = this._sent = undefined; + this.done = false; + this.delegate = null; + + this.method = "next"; + this.arg = undefined; + + this.tryEntries.forEach(resetTryEntry); + + if (!skipTempReset) { + for (var name in this) { + // Not sure about the optimal order of these conditions: + if (name.charAt(0) === "t" && + hasOwn.call(this, name) && + !isNaN(+name.slice(1))) { + this[name] = undefined; + } + } + } + }, + + stop: function() { + this.done = true; + + var rootEntry = this.tryEntries[0]; + var rootRecord = rootEntry.completion; + if (rootRecord.type === "throw") { + throw rootRecord.arg; + } + + return this.rval; + }, + + dispatchException: function(exception) { + if (this.done) { + throw exception; + } + + var context = this; + function handle(loc, caught) { + record.type = "throw"; + record.arg = exception; + context.next = loc; + + if (caught) { + // If the dispatched exception was caught by a catch block, + // then let that catch block handle the exception normally. + context.method = "next"; + context.arg = undefined; + } + + return !! caught; + } + + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + var record = entry.completion; + + if (entry.tryLoc === "root") { + // Exception thrown outside of any try block that could handle + // it, so set the completion value of the entire function to + // throw the exception. + return handle("end"); + } + + if (entry.tryLoc <= this.prev) { + var hasCatch = hasOwn.call(entry, "catchLoc"); + var hasFinally = hasOwn.call(entry, "finallyLoc"); + + if (hasCatch && hasFinally) { + if (this.prev < entry.catchLoc) { + return handle(entry.catchLoc, true); + } else if (this.prev < entry.finallyLoc) { + return handle(entry.finallyLoc); + } + + } else if (hasCatch) { + if (this.prev < entry.catchLoc) { + return handle(entry.catchLoc, true); + } + + } else if (hasFinally) { + if (this.prev < entry.finallyLoc) { + return handle(entry.finallyLoc); + } + + } else { + throw new Error("try statement without catch or finally"); + } + } + } + }, + + abrupt: function(type, arg) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.tryLoc <= this.prev && + hasOwn.call(entry, "finallyLoc") && + this.prev < entry.finallyLoc) { + var finallyEntry = entry; + break; + } + } + + if (finallyEntry && + (type === "break" || + type === "continue") && + finallyEntry.tryLoc <= arg && + arg <= finallyEntry.finallyLoc) { + // Ignore the finally entry if control is not jumping to a + // location outside the try/catch block. + finallyEntry = null; + } + + var record = finallyEntry ? finallyEntry.completion : {}; + record.type = type; + record.arg = arg; + + if (finallyEntry) { + this.method = "next"; + this.next = finallyEntry.finallyLoc; + return ContinueSentinel; + } + + return this.complete(record); + }, + + complete: function(record, afterLoc) { + if (record.type === "throw") { + throw record.arg; + } + + if (record.type === "break" || + record.type === "continue") { + this.next = record.arg; + } else if (record.type === "return") { + this.rval = this.arg = record.arg; + this.method = "return"; + this.next = "end"; + } else if (record.type === "normal" && afterLoc) { + this.next = afterLoc; + } + + return ContinueSentinel; + }, + + finish: function(finallyLoc) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.finallyLoc === finallyLoc) { + this.complete(entry.completion, entry.afterLoc); + resetTryEntry(entry); + return ContinueSentinel; + } + } + }, + + "catch": function(tryLoc) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.tryLoc === tryLoc) { + var record = entry.completion; + if (record.type === "throw") { + var thrown = record.arg; + resetTryEntry(entry); + } + return thrown; + } + } + + // The context.catch method must only be called with a location + // argument that corresponds to a known catch block. + throw new Error("illegal catch attempt"); + }, + + delegateYield: function(iterable, resultName, nextLoc) { + this.delegate = { + iterator: values(iterable), + resultName: resultName, + nextLoc: nextLoc + }; + + if (this.method === "next") { + // Deliberately forget the last sent value so that we don't + // accidentally pass it on to the delegate. + this.arg = undefined; + } + + return ContinueSentinel; + } + }; + })( + // In sloppy mode, unbound `this` refers to the global object, fallback to + // Function constructor if we're in global strict mode. That is sadly a form + // of indirect eval which violates Content Security Policy. + (function() { return this })() || Function("return this")() + ); + }); + + /** + * Copyright (c) 2014-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + // This method of obtaining a reference to the global object needs to be + // kept identical to the way it is obtained in runtime.js + var g = (function() { return this })() || Function("return this")(); + + // Use `getOwnPropertyNames` because not all browsers support calling + // `hasOwnProperty` on the global `self` object in a worker. See #183. + var hadRuntime = g.regeneratorRuntime && + Object.getOwnPropertyNames(g).indexOf("regeneratorRuntime") >= 0; + + // Save the old regeneratorRuntime in case it needs to be restored later. + var oldRuntime = hadRuntime && g.regeneratorRuntime; + + // Force reevalutation of runtime.js. + g.regeneratorRuntime = undefined; + + var runtimeModule = runtime; + + if (hadRuntime) { + // Restore the original runtime. + g.regeneratorRuntime = oldRuntime; + } else { + // Remove the global property added by runtime.js. + try { + delete g.regeneratorRuntime; + } catch(e) { + g.regeneratorRuntime = undefined; + } + } + + var regenerator = runtimeModule; + + // 7.1.4 ToInteger + var ceil = Math.ceil; + var floor = Math.floor; + var _toInteger = function (it) { + return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); + }; + + // 7.2.1 RequireObjectCoercible(argument) + var _defined = function (it) { + if (it == undefined) throw TypeError("Can't call method on " + it); + return it; + }; + + // true -> String#at + // false -> String#codePointAt + var _stringAt = function (TO_STRING) { + return function (that, pos) { + var s = String(_defined(that)); + var i = _toInteger(pos); + var l = s.length; + var a, b; + if (i < 0 || i >= l) return TO_STRING ? '' : undefined; + a = s.charCodeAt(i); + return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff + ? TO_STRING ? s.charAt(i) : a + : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000; + }; + }; + + var _library = true; + + var _global = createCommonjsModule(function (module) { + // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 + var global = module.exports = typeof window != 'undefined' && window.Math == Math + ? window : typeof self != 'undefined' && self.Math == Math ? self + // eslint-disable-next-line no-new-func + : Function('return this')(); + if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef + }); + + var _core = createCommonjsModule(function (module) { + var core = module.exports = { version: '2.5.6' }; + if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef + }); + var _core_1 = _core.version; + + var _aFunction = function (it) { + if (typeof it != 'function') throw TypeError(it + ' is not a function!'); + return it; + }; + + // optional / simple context binding + + var _ctx = function (fn, that, length) { + _aFunction(fn); + if (that === undefined) return fn; + switch (length) { + case 1: return function (a) { + return fn.call(that, a); + }; + case 2: return function (a, b) { + return fn.call(that, a, b); + }; + case 3: return function (a, b, c) { + return fn.call(that, a, b, c); + }; + } + return function (/* ...args */) { + return fn.apply(that, arguments); + }; + }; + + var _isObject = function (it) { + return typeof it === 'object' ? it !== null : typeof it === 'function'; + }; + + var _anObject = function (it) { + if (!_isObject(it)) throw TypeError(it + ' is not an object!'); + return it; + }; + + var _fails = function (exec) { + try { + return !!exec(); + } catch (e) { + return true; + } + }; + + // Thank's IE8 for his funny defineProperty + var _descriptors = !_fails(function () { + return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7; + }); + + var document$1 = _global.document; + // typeof document.createElement is 'object' in old IE + var is = _isObject(document$1) && _isObject(document$1.createElement); + var _domCreate = function (it) { + return is ? document$1.createElement(it) : {}; + }; + + var _ie8DomDefine = !_descriptors && !_fails(function () { + return Object.defineProperty(_domCreate('div'), 'a', { get: function () { return 7; } }).a != 7; + }); + + // 7.1.1 ToPrimitive(input [, PreferredType]) + + // instead of the ES6 spec version, we didn't implement @@toPrimitive case + // and the second argument - flag - preferred type is a string + var _toPrimitive = function (it, S) { + if (!_isObject(it)) return it; + var fn, val; + if (S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val; + if (typeof (fn = it.valueOf) == 'function' && !_isObject(val = fn.call(it))) return val; + if (!S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val; + throw TypeError("Can't convert object to primitive value"); + }; + + var dP = Object.defineProperty; + + var f = _descriptors ? Object.defineProperty : function defineProperty(O, P, Attributes) { + _anObject(O); + P = _toPrimitive(P, true); + _anObject(Attributes); + if (_ie8DomDefine) try { + return dP(O, P, Attributes); + } catch (e) { /* empty */ } + if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!'); + if ('value' in Attributes) O[P] = Attributes.value; + return O; + }; + + var _objectDp = { + f: f + }; + + var _propertyDesc = function (bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value: value + }; + }; + + var _hide = _descriptors ? function (object, key, value) { + return _objectDp.f(object, key, _propertyDesc(1, value)); + } : function (object, key, value) { + object[key] = value; + return object; + }; + + var hasOwnProperty = {}.hasOwnProperty; + var _has = function (it, key) { + return hasOwnProperty.call(it, key); + }; + + var PROTOTYPE = 'prototype'; + + var $export = function (type, name, source) { + var IS_FORCED = type & $export.F; + var IS_GLOBAL = type & $export.G; + var IS_STATIC = type & $export.S; + var IS_PROTO = type & $export.P; + var IS_BIND = type & $export.B; + var IS_WRAP = type & $export.W; + var exports = IS_GLOBAL ? _core : _core[name] || (_core[name] = {}); + var expProto = exports[PROTOTYPE]; + var target = IS_GLOBAL ? _global : IS_STATIC ? _global[name] : (_global[name] || {})[PROTOTYPE]; + var key, own, out; + if (IS_GLOBAL) source = name; + for (key in source) { + // contains in native + own = !IS_FORCED && target && target[key] !== undefined; + if (own && _has(exports, key)) continue; + // export native or passed + out = own ? target[key] : source[key]; + // prevent global pollution for namespaces + exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key] + // bind timers to global for call from export context + : IS_BIND && own ? _ctx(out, _global) + // wrap global constructors for prevent change them in library + : IS_WRAP && target[key] == out ? (function (C) { + var F = function (a, b, c) { + if (this instanceof C) { + switch (arguments.length) { + case 0: return new C(); + case 1: return new C(a); + case 2: return new C(a, b); + } return new C(a, b, c); + } return C.apply(this, arguments); + }; + F[PROTOTYPE] = C[PROTOTYPE]; + return F; + // make static versions for prototype methods + })(out) : IS_PROTO && typeof out == 'function' ? _ctx(Function.call, out) : out; + // export proto methods to core.%CONSTRUCTOR%.methods.%NAME% + if (IS_PROTO) { + (exports.virtual || (exports.virtual = {}))[key] = out; + // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME% + if (type & $export.R && expProto && !expProto[key]) _hide(expProto, key, out); + } + } + }; + // type bitmap + $export.F = 1; // forced + $export.G = 2; // global + $export.S = 4; // static + $export.P = 8; // proto + $export.B = 16; // bind + $export.W = 32; // wrap + $export.U = 64; // safe + $export.R = 128; // real proto method for `library` + var _export = $export; + + var _redefine = _hide; + + var _iterators = {}; + + var toString = {}.toString; + + var _cof = function (it) { + return toString.call(it).slice(8, -1); + }; + + // fallback for non-array-like ES3 and non-enumerable old V8 strings + + // eslint-disable-next-line no-prototype-builtins + var _iobject = Object('z').propertyIsEnumerable(0) ? Object : function (it) { + return _cof(it) == 'String' ? it.split('') : Object(it); + }; + + // to indexed object, toObject with fallback for non-array-like ES3 strings + + + var _toIobject = function (it) { + return _iobject(_defined(it)); + }; + + // 7.1.15 ToLength + + var min = Math.min; + var _toLength = function (it) { + return it > 0 ? min(_toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 + }; + + var max = Math.max; + var min$1 = Math.min; + var _toAbsoluteIndex = function (index, length) { + index = _toInteger(index); + return index < 0 ? max(index + length, 0) : min$1(index, length); + }; + + // false -> Array#indexOf + // true -> Array#includes + + + + var _arrayIncludes = function (IS_INCLUDES) { + return function ($this, el, fromIndex) { + var O = _toIobject($this); + var length = _toLength(O.length); + var index = _toAbsoluteIndex(fromIndex, length); + var value; + // Array#includes uses SameValueZero equality algorithm + // eslint-disable-next-line no-self-compare + if (IS_INCLUDES && el != el) while (length > index) { + value = O[index++]; + // eslint-disable-next-line no-self-compare + if (value != value) return true; + // Array#indexOf ignores holes, Array#includes - not + } else for (;length > index; index++) if (IS_INCLUDES || index in O) { + if (O[index] === el) return IS_INCLUDES || index || 0; + } return !IS_INCLUDES && -1; + }; + }; + + var _shared = createCommonjsModule(function (module) { + var SHARED = '__core-js_shared__'; + var store = _global[SHARED] || (_global[SHARED] = {}); + + (module.exports = function (key, value) { + return store[key] || (store[key] = value !== undefined ? value : {}); + })('versions', []).push({ + version: _core.version, + mode: _library ? 'pure' : 'global', + copyright: '© 2018 Denis Pushkarev (zloirock.ru)' + }); + }); + + var id = 0; + var px = Math.random(); + var _uid = function (key) { + return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); + }; + + var shared = _shared('keys'); + + var _sharedKey = function (key) { + return shared[key] || (shared[key] = _uid(key)); + }; + + var arrayIndexOf = _arrayIncludes(false); + var IE_PROTO = _sharedKey('IE_PROTO'); + + var _objectKeysInternal = function (object, names) { + var O = _toIobject(object); + var i = 0; + var result = []; + var key; + for (key in O) if (key != IE_PROTO) _has(O, key) && result.push(key); + // Don't enum bug & hidden keys + while (names.length > i) if (_has(O, key = names[i++])) { + ~arrayIndexOf(result, key) || result.push(key); + } + return result; + }; + + // IE 8- don't enum bug keys + var _enumBugKeys = ( + 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf' + ).split(','); + + // 19.1.2.14 / 15.2.3.14 Object.keys(O) + + + + var _objectKeys = Object.keys || function keys(O) { + return _objectKeysInternal(O, _enumBugKeys); + }; + + var _objectDps = _descriptors ? Object.defineProperties : function defineProperties(O, Properties) { + _anObject(O); + var keys = _objectKeys(Properties); + var length = keys.length; + var i = 0; + var P; + while (length > i) _objectDp.f(O, P = keys[i++], Properties[P]); + return O; + }; + + var document$2 = _global.document; + var _html = document$2 && document$2.documentElement; + + // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) + + + + var IE_PROTO$1 = _sharedKey('IE_PROTO'); + var Empty = function () { /* empty */ }; + var PROTOTYPE$1 = 'prototype'; + + // Create object with fake `null` prototype: use iframe Object with cleared prototype + var createDict = function () { + // Thrash, waste and sodomy: IE GC bug + var iframe = _domCreate('iframe'); + var i = _enumBugKeys.length; + var lt = '<'; + var gt = '>'; + var iframeDocument; + iframe.style.display = 'none'; + _html.appendChild(iframe); + iframe.src = 'javascript:'; // eslint-disable-line no-script-url + // createDict = iframe.contentWindow.Object; + // html.removeChild(iframe); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt); + iframeDocument.close(); + createDict = iframeDocument.F; + while (i--) delete createDict[PROTOTYPE$1][_enumBugKeys[i]]; + return createDict(); + }; + + var _objectCreate = Object.create || function create(O, Properties) { + var result; + if (O !== null) { + Empty[PROTOTYPE$1] = _anObject(O); + result = new Empty(); + Empty[PROTOTYPE$1] = null; + // add "__proto__" for Object.getPrototypeOf polyfill + result[IE_PROTO$1] = O; + } else result = createDict(); + return Properties === undefined ? result : _objectDps(result, Properties); + }; + + var _wks = createCommonjsModule(function (module) { + var store = _shared('wks'); + + var Symbol = _global.Symbol; + var USE_SYMBOL = typeof Symbol == 'function'; + + var $exports = module.exports = function (name) { + return store[name] || (store[name] = + USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : _uid)('Symbol.' + name)); + }; + + $exports.store = store; + }); + + var def = _objectDp.f; + + var TAG = _wks('toStringTag'); + + var _setToStringTag = function (it, tag, stat) { + if (it && !_has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag }); + }; + + var IteratorPrototype = {}; + + // 25.1.2.1.1 %IteratorPrototype%[@@iterator]() + _hide(IteratorPrototype, _wks('iterator'), function () { return this; }); + + var _iterCreate = function (Constructor, NAME, next) { + Constructor.prototype = _objectCreate(IteratorPrototype, { next: _propertyDesc(1, next) }); + _setToStringTag(Constructor, NAME + ' Iterator'); + }; + + // 7.1.13 ToObject(argument) + + var _toObject = function (it) { + return Object(_defined(it)); + }; + + // 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) + + + var IE_PROTO$2 = _sharedKey('IE_PROTO'); + var ObjectProto = Object.prototype; + + var _objectGpo = Object.getPrototypeOf || function (O) { + O = _toObject(O); + if (_has(O, IE_PROTO$2)) return O[IE_PROTO$2]; + if (typeof O.constructor == 'function' && O instanceof O.constructor) { + return O.constructor.prototype; + } return O instanceof Object ? ObjectProto : null; + }; + + var ITERATOR = _wks('iterator'); + var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next` + var FF_ITERATOR = '@@iterator'; + var KEYS = 'keys'; + var VALUES = 'values'; + + var returnThis = function () { return this; }; + + var _iterDefine = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) { + _iterCreate(Constructor, NAME, next); + var getMethod = function (kind) { + if (!BUGGY && kind in proto) return proto[kind]; + switch (kind) { + case KEYS: return function keys() { return new Constructor(this, kind); }; + case VALUES: return function values() { return new Constructor(this, kind); }; + } return function entries() { return new Constructor(this, kind); }; + }; + var TAG = NAME + ' Iterator'; + var DEF_VALUES = DEFAULT == VALUES; + var VALUES_BUG = false; + var proto = Base.prototype; + var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]; + var $default = $native || getMethod(DEFAULT); + var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined; + var $anyNative = NAME == 'Array' ? proto.entries || $native : $native; + var methods, key, IteratorPrototype; + // Fix native + if ($anyNative) { + IteratorPrototype = _objectGpo($anyNative.call(new Base())); + if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) { + // Set @@toStringTag to native iterators + _setToStringTag(IteratorPrototype, TAG, true); + // fix for some old engines + if (!_library && typeof IteratorPrototype[ITERATOR] != 'function') _hide(IteratorPrototype, ITERATOR, returnThis); + } + } + // fix Array#{values, @@iterator}.name in V8 / FF + if (DEF_VALUES && $native && $native.name !== VALUES) { + VALUES_BUG = true; + $default = function values() { return $native.call(this); }; + } + // Define iterator + if ((!_library || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) { + _hide(proto, ITERATOR, $default); + } + // Plug for library + _iterators[NAME] = $default; + _iterators[TAG] = returnThis; + if (DEFAULT) { + methods = { + values: DEF_VALUES ? $default : getMethod(VALUES), + keys: IS_SET ? $default : getMethod(KEYS), + entries: $entries + }; + if (FORCED) for (key in methods) { + if (!(key in proto)) _redefine(proto, key, methods[key]); + } else _export(_export.P + _export.F * (BUGGY || VALUES_BUG), NAME, methods); + } + return methods; + }; + + var $at = _stringAt(true); + + // 21.1.3.27 String.prototype[@@iterator]() + _iterDefine(String, 'String', function (iterated) { + this._t = String(iterated); // target + this._i = 0; // next index + // 21.1.5.2.1 %StringIteratorPrototype%.next() + }, function () { + var O = this._t; + var index = this._i; + var point; + if (index >= O.length) return { value: undefined, done: true }; + point = $at(O, index); + this._i += point.length; + return { value: point, done: false }; + }); + + var _iterStep = function (done, value) { + return { value: value, done: !!done }; + }; + + // 22.1.3.4 Array.prototype.entries() + // 22.1.3.13 Array.prototype.keys() + // 22.1.3.29 Array.prototype.values() + // 22.1.3.30 Array.prototype[@@iterator]() + var es6_array_iterator = _iterDefine(Array, 'Array', function (iterated, kind) { + this._t = _toIobject(iterated); // target + this._i = 0; // next index + this._k = kind; // kind + // 22.1.5.2.1 %ArrayIteratorPrototype%.next() + }, function () { + var O = this._t; + var kind = this._k; + var index = this._i++; + if (!O || index >= O.length) { + this._t = undefined; + return _iterStep(1); + } + if (kind == 'keys') return _iterStep(0, index); + if (kind == 'values') return _iterStep(0, O[index]); + return _iterStep(0, [index, O[index]]); + }, 'values'); + + // argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7) + _iterators.Arguments = _iterators.Array; + + var TO_STRING_TAG = _wks('toStringTag'); + + var DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' + + 'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' + + 'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' + + 'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' + + 'TextTrackList,TouchList').split(','); + + for (var i = 0; i < DOMIterables.length; i++) { + var NAME = DOMIterables[i]; + var Collection = _global[NAME]; + var proto = Collection && Collection.prototype; + if (proto && !proto[TO_STRING_TAG]) _hide(proto, TO_STRING_TAG, NAME); + _iterators[NAME] = _iterators.Array; + } + + // getting tag from 19.1.3.6 Object.prototype.toString() + + var TAG$1 = _wks('toStringTag'); + // ES3 wrong here + var ARG = _cof(function () { return arguments; }()) == 'Arguments'; + + // fallback for IE11 Script Access Denied error + var tryGet = function (it, key) { + try { + return it[key]; + } catch (e) { /* empty */ } + }; + + var _classof = function (it) { + var O, T, B; + return it === undefined ? 'Undefined' : it === null ? 'Null' + // @@toStringTag case + : typeof (T = tryGet(O = Object(it), TAG$1)) == 'string' ? T + // builtinTag case + : ARG ? _cof(O) + // ES3 arguments fallback + : (B = _cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B; + }; + + var _anInstance = function (it, Constructor, name, forbiddenField) { + if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) { + throw TypeError(name + ': incorrect invocation!'); + } return it; + }; + + // call something on iterator step with safe closing on error + + var _iterCall = function (iterator, fn, value, entries) { + try { + return entries ? fn(_anObject(value)[0], value[1]) : fn(value); + // 7.4.6 IteratorClose(iterator, completion) + } catch (e) { + var ret = iterator['return']; + if (ret !== undefined) _anObject(ret.call(iterator)); + throw e; + } + }; + + // check on default Array iterator + + var ITERATOR$1 = _wks('iterator'); + var ArrayProto = Array.prototype; + + var _isArrayIter = function (it) { + return it !== undefined && (_iterators.Array === it || ArrayProto[ITERATOR$1] === it); + }; + + var ITERATOR$2 = _wks('iterator'); + + var core_getIteratorMethod = _core.getIteratorMethod = function (it) { + if (it != undefined) return it[ITERATOR$2] + || it['@@iterator'] + || _iterators[_classof(it)]; + }; + + var _forOf = createCommonjsModule(function (module) { + var BREAK = {}; + var RETURN = {}; + var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) { + var iterFn = ITERATOR ? function () { return iterable; } : core_getIteratorMethod(iterable); + var f = _ctx(fn, that, entries ? 2 : 1); + var index = 0; + var length, step, iterator, result; + if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!'); + // fast case for arrays with default iterator + if (_isArrayIter(iterFn)) for (length = _toLength(iterable.length); length > index; index++) { + result = entries ? f(_anObject(step = iterable[index])[0], step[1]) : f(iterable[index]); + if (result === BREAK || result === RETURN) return result; + } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) { + result = _iterCall(iterator, f, step.value, entries); + if (result === BREAK || result === RETURN) return result; + } + }; + exports.BREAK = BREAK; + exports.RETURN = RETURN; + }); + + // 7.3.20 SpeciesConstructor(O, defaultConstructor) + + + var SPECIES = _wks('species'); + var _speciesConstructor = function (O, D) { + var C = _anObject(O).constructor; + var S; + return C === undefined || (S = _anObject(C)[SPECIES]) == undefined ? D : _aFunction(S); + }; + + // fast apply, http://jsperf.lnkit.com/fast-apply/5 + var _invoke = function (fn, args, that) { + var un = that === undefined; + switch (args.length) { + case 0: return un ? fn() + : fn.call(that); + case 1: return un ? fn(args[0]) + : fn.call(that, args[0]); + case 2: return un ? fn(args[0], args[1]) + : fn.call(that, args[0], args[1]); + case 3: return un ? fn(args[0], args[1], args[2]) + : fn.call(that, args[0], args[1], args[2]); + case 4: return un ? fn(args[0], args[1], args[2], args[3]) + : fn.call(that, args[0], args[1], args[2], args[3]); + } return fn.apply(that, args); + }; + + var process = _global.process; + var setTask = _global.setImmediate; + var clearTask = _global.clearImmediate; + var MessageChannel = _global.MessageChannel; + var Dispatch = _global.Dispatch; + var counter = 0; + var queue = {}; + var ONREADYSTATECHANGE = 'onreadystatechange'; + var defer, channel, port; + var run = function () { + var id = +this; + // eslint-disable-next-line no-prototype-builtins + if (queue.hasOwnProperty(id)) { + var fn = queue[id]; + delete queue[id]; + fn(); + } + }; + var listener = function (event) { + run.call(event.data); + }; + // Node.js 0.9+ & IE10+ has setImmediate, otherwise: + if (!setTask || !clearTask) { + setTask = function setImmediate(fn) { + var args = []; + var i = 1; + while (arguments.length > i) args.push(arguments[i++]); + queue[++counter] = function () { + // eslint-disable-next-line no-new-func + _invoke(typeof fn == 'function' ? fn : Function(fn), args); + }; + defer(counter); + return counter; + }; + clearTask = function clearImmediate(id) { + delete queue[id]; + }; + // Node.js 0.8- + if (_cof(process) == 'process') { + defer = function (id) { + process.nextTick(_ctx(run, id, 1)); + }; + // Sphere (JS game engine) Dispatch API + } else if (Dispatch && Dispatch.now) { + defer = function (id) { + Dispatch.now(_ctx(run, id, 1)); + }; + // Browsers with MessageChannel, includes WebWorkers + } else if (MessageChannel) { + channel = new MessageChannel(); + port = channel.port2; + channel.port1.onmessage = listener; + defer = _ctx(port.postMessage, port, 1); + // Browsers with postMessage, skip WebWorkers + // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' + } else if (_global.addEventListener && typeof postMessage == 'function' && !_global.importScripts) { + defer = function (id) { + _global.postMessage(id + '', '*'); + }; + _global.addEventListener('message', listener, false); + // IE8- + } else if (ONREADYSTATECHANGE in _domCreate('script')) { + defer = function (id) { + _html.appendChild(_domCreate('script'))[ONREADYSTATECHANGE] = function () { + _html.removeChild(this); + run.call(id); + }; + }; + // Rest old browsers + } else { + defer = function (id) { + setTimeout(_ctx(run, id, 1), 0); + }; + } + } + var _task = { + set: setTask, + clear: clearTask + }; + + var macrotask = _task.set; + var Observer = _global.MutationObserver || _global.WebKitMutationObserver; + var process$1 = _global.process; + var Promise$1 = _global.Promise; + var isNode = _cof(process$1) == 'process'; + + var _microtask = function () { + var head, last, notify; + + var flush = function () { + var parent, fn; + if (isNode && (parent = process$1.domain)) parent.exit(); + while (head) { + fn = head.fn; + head = head.next; + try { + fn(); + } catch (e) { + if (head) notify(); + else last = undefined; + throw e; + } + } last = undefined; + if (parent) parent.enter(); + }; + + // Node.js + if (isNode) { + notify = function () { + process$1.nextTick(flush); + }; + // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339 + } else if (Observer && !(_global.navigator && _global.navigator.standalone)) { + var toggle = true; + var node = document.createTextNode(''); + new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new + notify = function () { + node.data = toggle = !toggle; + }; + // environments with maybe non-completely correct, but existent Promise + } else if (Promise$1 && Promise$1.resolve) { + // Promise.resolve without an argument throws an error in LG WebOS 2 + var promise = Promise$1.resolve(undefined); + notify = function () { + promise.then(flush); + }; + // for other environments - macrotask based on: + // - setImmediate + // - MessageChannel + // - window.postMessag + // - onreadystatechange + // - setTimeout + } else { + notify = function () { + // strange IE + webpack dev server bug - use .call(global) + macrotask.call(_global, flush); + }; + } + + return function (fn) { + var task = { fn: fn, next: undefined }; + if (last) last.next = task; + if (!head) { + head = task; + notify(); + } last = task; + }; + }; + + // 25.4.1.5 NewPromiseCapability(C) + + + function PromiseCapability(C) { + var resolve, reject; + this.promise = new C(function ($$resolve, $$reject) { + if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor'); + resolve = $$resolve; + reject = $$reject; + }); + this.resolve = _aFunction(resolve); + this.reject = _aFunction(reject); + } + + var f$1 = function (C) { + return new PromiseCapability(C); + }; + + var _newPromiseCapability = { + f: f$1 + }; + + var _perform = function (exec) { + try { + return { e: false, v: exec() }; + } catch (e) { + return { e: true, v: e }; + } + }; + + var navigator = _global.navigator; + + var _userAgent = navigator && navigator.userAgent || ''; + + var _promiseResolve = function (C, x) { + _anObject(C); + if (_isObject(x) && x.constructor === C) return x; + var promiseCapability = _newPromiseCapability.f(C); + var resolve = promiseCapability.resolve; + resolve(x); + return promiseCapability.promise; + }; + + var _redefineAll = function (target, src, safe) { + for (var key in src) { + if (safe && target[key]) target[key] = src[key]; + else _hide(target, key, src[key]); + } return target; + }; + + var SPECIES$1 = _wks('species'); + + var _setSpecies = function (KEY) { + var C = typeof _core[KEY] == 'function' ? _core[KEY] : _global[KEY]; + if (_descriptors && C && !C[SPECIES$1]) _objectDp.f(C, SPECIES$1, { + configurable: true, + get: function () { return this; } + }); + }; + + var ITERATOR$3 = _wks('iterator'); + var SAFE_CLOSING = false; + + try { + var riter = [7][ITERATOR$3](); + riter['return'] = function () { SAFE_CLOSING = true; }; + } catch (e) { /* empty */ } + + var _iterDetect = function (exec, skipClosing) { + if (!skipClosing && !SAFE_CLOSING) return false; + var safe = false; + try { + var arr = [7]; + var iter = arr[ITERATOR$3](); + iter.next = function () { return { done: safe = true }; }; + arr[ITERATOR$3] = function () { return iter; }; + exec(arr); + } catch (e) { /* empty */ } + return safe; + }; + + var task = _task.set; + var microtask = _microtask(); + + + + + var PROMISE = 'Promise'; + var TypeError$1 = _global.TypeError; + var process$2 = _global.process; + var versions = process$2 && process$2.versions; + var v8 = versions && versions.v8 || ''; + var $Promise = _global[PROMISE]; + var isNode$1 = _classof(process$2) == 'process'; + var empty = function () { /* empty */ }; + var Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper; + var newPromiseCapability = newGenericPromiseCapability = _newPromiseCapability.f; + + var USE_NATIVE = !!function () { + try { + // correct subclassing with @@species support + var promise = $Promise.resolve(1); + var FakePromise = (promise.constructor = {})[_wks('species')] = function (exec) { + exec(empty, empty); + }; + // unhandled rejections tracking support, NodeJS Promise without it fails @@species test + return (isNode$1 || typeof PromiseRejectionEvent == 'function') + && promise.then(empty) instanceof FakePromise + // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables + // https://bugs.chromium.org/p/chromium/issues/detail?id=830565 + // we can't detect it synchronously, so just check versions + && v8.indexOf('6.6') !== 0 + && _userAgent.indexOf('Chrome/66') === -1; + } catch (e) { /* empty */ } + }(); + + // helpers + var isThenable = function (it) { + var then; + return _isObject(it) && typeof (then = it.then) == 'function' ? then : false; + }; + var notify = function (promise, isReject) { + if (promise._n) return; + promise._n = true; + var chain = promise._c; + microtask(function () { + var value = promise._v; + var ok = promise._s == 1; + var i = 0; + var run = function (reaction) { + var handler = ok ? reaction.ok : reaction.fail; + var resolve = reaction.resolve; + var reject = reaction.reject; + var domain = reaction.domain; + var result, then, exited; + try { + if (handler) { + if (!ok) { + if (promise._h == 2) onHandleUnhandled(promise); + promise._h = 1; + } + if (handler === true) result = value; + else { + if (domain) domain.enter(); + result = handler(value); // may throw + if (domain) { + domain.exit(); + exited = true; + } + } + if (result === reaction.promise) { + reject(TypeError$1('Promise-chain cycle')); + } else if (then = isThenable(result)) { + then.call(result, resolve, reject); + } else resolve(result); + } else reject(value); + } catch (e) { + if (domain && !exited) domain.exit(); + reject(e); + } + }; + while (chain.length > i) run(chain[i++]); // variable length - can't use forEach + promise._c = []; + promise._n = false; + if (isReject && !promise._h) onUnhandled(promise); + }); + }; + var onUnhandled = function (promise) { + task.call(_global, function () { + var value = promise._v; + var unhandled = isUnhandled(promise); + var result, handler, console; + if (unhandled) { + result = _perform(function () { + if (isNode$1) { + process$2.emit('unhandledRejection', value, promise); + } else if (handler = _global.onunhandledrejection) { + handler({ promise: promise, reason: value }); + } else if ((console = _global.console) && console.error) { + console.error('Unhandled promise rejection', value); + } + }); + // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should + promise._h = isNode$1 || isUnhandled(promise) ? 2 : 1; + } promise._a = undefined; + if (unhandled && result.e) throw result.v; + }); + }; + var isUnhandled = function (promise) { + return promise._h !== 1 && (promise._a || promise._c).length === 0; + }; + var onHandleUnhandled = function (promise) { + task.call(_global, function () { + var handler; + if (isNode$1) { + process$2.emit('rejectionHandled', promise); + } else if (handler = _global.onrejectionhandled) { + handler({ promise: promise, reason: promise._v }); + } + }); + }; + var $reject = function (value) { + var promise = this; + if (promise._d) return; + promise._d = true; + promise = promise._w || promise; // unwrap + promise._v = value; + promise._s = 2; + if (!promise._a) promise._a = promise._c.slice(); + notify(promise, true); + }; + var $resolve = function (value) { + var promise = this; + var then; + if (promise._d) return; + promise._d = true; + promise = promise._w || promise; // unwrap + try { + if (promise === value) throw TypeError$1("Promise can't be resolved itself"); + if (then = isThenable(value)) { + microtask(function () { + var wrapper = { _w: promise, _d: false }; // wrap + try { + then.call(value, _ctx($resolve, wrapper, 1), _ctx($reject, wrapper, 1)); + } catch (e) { + $reject.call(wrapper, e); + } + }); + } else { + promise._v = value; + promise._s = 1; + notify(promise, false); + } + } catch (e) { + $reject.call({ _w: promise, _d: false }, e); // wrap + } + }; + + // constructor polyfill + if (!USE_NATIVE) { + // 25.4.3.1 Promise(executor) + $Promise = function Promise(executor) { + _anInstance(this, $Promise, PROMISE, '_h'); + _aFunction(executor); + Internal.call(this); + try { + executor(_ctx($resolve, this, 1), _ctx($reject, this, 1)); + } catch (err) { + $reject.call(this, err); + } + }; + // eslint-disable-next-line no-unused-vars + Internal = function Promise(executor) { + this._c = []; // <- awaiting reactions + this._a = undefined; // <- checked in isUnhandled reactions + this._s = 0; // <- state + this._d = false; // <- done + this._v = undefined; // <- value + this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled + this._n = false; // <- notify + }; + Internal.prototype = _redefineAll($Promise.prototype, { + // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected) + then: function then(onFulfilled, onRejected) { + var reaction = newPromiseCapability(_speciesConstructor(this, $Promise)); + reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true; + reaction.fail = typeof onRejected == 'function' && onRejected; + reaction.domain = isNode$1 ? process$2.domain : undefined; + this._c.push(reaction); + if (this._a) this._a.push(reaction); + if (this._s) notify(this, false); + return reaction.promise; + }, + // 25.4.5.1 Promise.prototype.catch(onRejected) + 'catch': function (onRejected) { + return this.then(undefined, onRejected); + } + }); + OwnPromiseCapability = function () { + var promise = new Internal(); + this.promise = promise; + this.resolve = _ctx($resolve, promise, 1); + this.reject = _ctx($reject, promise, 1); + }; + _newPromiseCapability.f = newPromiseCapability = function (C) { + return C === $Promise || C === Wrapper + ? new OwnPromiseCapability(C) + : newGenericPromiseCapability(C); + }; + } + + _export(_export.G + _export.W + _export.F * !USE_NATIVE, { Promise: $Promise }); + _setToStringTag($Promise, PROMISE); + _setSpecies(PROMISE); + Wrapper = _core[PROMISE]; + + // statics + _export(_export.S + _export.F * !USE_NATIVE, PROMISE, { + // 25.4.4.5 Promise.reject(r) + reject: function reject(r) { + var capability = newPromiseCapability(this); + var $$reject = capability.reject; + $$reject(r); + return capability.promise; + } + }); + _export(_export.S + _export.F * (_library || !USE_NATIVE), PROMISE, { + // 25.4.4.6 Promise.resolve(x) + resolve: function resolve(x) { + return _promiseResolve(_library && this === Wrapper ? $Promise : this, x); + } + }); + _export(_export.S + _export.F * !(USE_NATIVE && _iterDetect(function (iter) { + $Promise.all(iter)['catch'](empty); + })), PROMISE, { + // 25.4.4.1 Promise.all(iterable) + all: function all(iterable) { + var C = this; + var capability = newPromiseCapability(C); + var resolve = capability.resolve; + var reject = capability.reject; + var result = _perform(function () { + var values = []; + var index = 0; + var remaining = 1; + _forOf(iterable, false, function (promise) { + var $index = index++; + var alreadyCalled = false; + values.push(undefined); + remaining++; + C.resolve(promise).then(function (value) { + if (alreadyCalled) return; + alreadyCalled = true; + values[$index] = value; + --remaining || resolve(values); + }, reject); + }); + --remaining || resolve(values); + }); + if (result.e) reject(result.v); + return capability.promise; + }, + // 25.4.4.4 Promise.race(iterable) + race: function race(iterable) { + var C = this; + var capability = newPromiseCapability(C); + var reject = capability.reject; + var result = _perform(function () { + _forOf(iterable, false, function (promise) { + C.resolve(promise).then(capability.resolve, reject); + }); + }); + if (result.e) reject(result.v); + return capability.promise; + } + }); + + _export(_export.P + _export.R, 'Promise', { 'finally': function (onFinally) { + var C = _speciesConstructor(this, _core.Promise || _global.Promise); + var isFunction = typeof onFinally == 'function'; + return this.then( + isFunction ? function (x) { + return _promiseResolve(C, onFinally()).then(function () { return x; }); + } : onFinally, + isFunction ? function (e) { + return _promiseResolve(C, onFinally()).then(function () { throw e; }); + } : onFinally + ); + } }); + + // https://github.com/tc39/proposal-promise-try + + + + + _export(_export.S, 'Promise', { 'try': function (callbackfn) { + var promiseCapability = _newPromiseCapability.f(this); + var result = _perform(callbackfn); + (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v); + return promiseCapability.promise; + } }); + + var promise = _core.Promise; + + var promise$1 = promise; + + function _asyncToGenerator(fn) { + return function () { + var self = this, + args = arguments; + return new promise$1(function (resolve, reject) { + var gen = fn.apply(self, args); + + function step(key, arg) { + try { + var info = gen[key](arg); + var value = info.value; + } catch (error) { + reject(error); + return; + } + + if (info.done) { + resolve(value); + } else { + promise$1.resolve(value).then(_next, _throw); + } + } + + function _next(value) { + step("next", value); + } + + function _throw(err) { + step("throw", err); + } + + _next(); + }); + }; + } + + var asyncToGenerator = _asyncToGenerator; + + var f$2 = {}.propertyIsEnumerable; + + var _objectPie = { + f: f$2 + }; + + var gOPD = Object.getOwnPropertyDescriptor; + + var f$3 = _descriptors ? gOPD : function getOwnPropertyDescriptor(O, P) { + O = _toIobject(O); + P = _toPrimitive(P, true); + if (_ie8DomDefine) try { + return gOPD(O, P); + } catch (e) { /* empty */ } + if (_has(O, P)) return _propertyDesc(!_objectPie.f.call(O, P), O[P]); + }; + + var _objectGopd = { + f: f$3 + }; + + // most Object methods by ES6 should accept primitives + + + + var _objectSap = function (KEY, exec) { + var fn = (_core.Object || {})[KEY] || Object[KEY]; + var exp = {}; + exp[KEY] = exec(fn); + _export(_export.S + _export.F * _fails(function () { fn(1); }), 'Object', exp); + }; + + // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) + + var $getOwnPropertyDescriptor = _objectGopd.f; + + _objectSap('getOwnPropertyDescriptor', function () { + return function getOwnPropertyDescriptor(it, key) { + return $getOwnPropertyDescriptor(_toIobject(it), key); + }; + }); + + var $Object = _core.Object; + var getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) { + return $Object.getOwnPropertyDescriptor(it, key); + }; + + var getOwnPropertyDescriptor$1 = getOwnPropertyDescriptor; + + var _meta = createCommonjsModule(function (module) { + var META = _uid('meta'); + + + var setDesc = _objectDp.f; + var id = 0; + var isExtensible = Object.isExtensible || function () { + return true; + }; + var FREEZE = !_fails(function () { + return isExtensible(Object.preventExtensions({})); + }); + var setMeta = function (it) { + setDesc(it, META, { value: { + i: 'O' + ++id, // object ID + w: {} // weak collections IDs + } }); + }; + var fastKey = function (it, create) { + // return primitive with prefix + if (!_isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; + if (!_has(it, META)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return 'F'; + // not necessary to add metadata + if (!create) return 'E'; + // add missing metadata + setMeta(it); + // return object ID + } return it[META].i; + }; + var getWeak = function (it, create) { + if (!_has(it, META)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return true; + // not necessary to add metadata + if (!create) return false; + // add missing metadata + setMeta(it); + // return hash weak collections IDs + } return it[META].w; + }; + // add metadata on freeze-family methods calling + var onFreeze = function (it) { + if (FREEZE && meta.NEED && isExtensible(it) && !_has(it, META)) setMeta(it); + return it; + }; + var meta = module.exports = { + KEY: META, + NEED: false, + fastKey: fastKey, + getWeak: getWeak, + onFreeze: onFreeze + }; + }); + var _meta_1 = _meta.KEY; + var _meta_2 = _meta.NEED; + var _meta_3 = _meta.fastKey; + var _meta_4 = _meta.getWeak; + var _meta_5 = _meta.onFreeze; + + var f$4 = _wks; + + var _wksExt = { + f: f$4 + }; + + var defineProperty = _objectDp.f; + var _wksDefine = function (name) { + var $Symbol = _core.Symbol || (_core.Symbol = _library ? {} : _global.Symbol || {}); + if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: _wksExt.f(name) }); + }; + + var f$5 = Object.getOwnPropertySymbols; + + var _objectGops = { + f: f$5 + }; + + // all enumerable object keys, includes symbols + + + + var _enumKeys = function (it) { + var result = _objectKeys(it); + var getSymbols = _objectGops.f; + if (getSymbols) { + var symbols = getSymbols(it); + var isEnum = _objectPie.f; + var i = 0; + var key; + while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key); + } return result; + }; + + // 7.2.2 IsArray(argument) + + var _isArray = Array.isArray || function isArray(arg) { + return _cof(arg) == 'Array'; + }; + + // 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O) + + var hiddenKeys = _enumBugKeys.concat('length', 'prototype'); + + var f$6 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { + return _objectKeysInternal(O, hiddenKeys); + }; + + var _objectGopn = { + f: f$6 + }; + + // fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window + + var gOPN = _objectGopn.f; + var toString$1 = {}.toString; + + var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames + ? Object.getOwnPropertyNames(window) : []; + + var getWindowNames = function (it) { + try { + return gOPN(it); + } catch (e) { + return windowNames.slice(); + } + }; + + var f$7 = function getOwnPropertyNames(it) { + return windowNames && toString$1.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(_toIobject(it)); + }; + + var _objectGopnExt = { + f: f$7 + }; + + // ECMAScript 6 symbols shim + + + + + + var META = _meta.KEY; + + + + + + + + + + + + + + + + + + + + var gOPD$1 = _objectGopd.f; + var dP$1 = _objectDp.f; + var gOPN$1 = _objectGopnExt.f; + var $Symbol = _global.Symbol; + var $JSON = _global.JSON; + var _stringify = $JSON && $JSON.stringify; + var PROTOTYPE$2 = 'prototype'; + var HIDDEN = _wks('_hidden'); + var TO_PRIMITIVE = _wks('toPrimitive'); + var isEnum = {}.propertyIsEnumerable; + var SymbolRegistry = _shared('symbol-registry'); + var AllSymbols = _shared('symbols'); + var OPSymbols = _shared('op-symbols'); + var ObjectProto$1 = Object[PROTOTYPE$2]; + var USE_NATIVE$1 = typeof $Symbol == 'function'; + var QObject = _global.QObject; + // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173 + var setter = !QObject || !QObject[PROTOTYPE$2] || !QObject[PROTOTYPE$2].findChild; + + // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687 + var setSymbolDesc = _descriptors && _fails(function () { + return _objectCreate(dP$1({}, 'a', { + get: function () { return dP$1(this, 'a', { value: 7 }).a; } + })).a != 7; + }) ? function (it, key, D) { + var protoDesc = gOPD$1(ObjectProto$1, key); + if (protoDesc) delete ObjectProto$1[key]; + dP$1(it, key, D); + if (protoDesc && it !== ObjectProto$1) dP$1(ObjectProto$1, key, protoDesc); + } : dP$1; + + var wrap = function (tag) { + var sym = AllSymbols[tag] = _objectCreate($Symbol[PROTOTYPE$2]); + sym._k = tag; + return sym; + }; + + var isSymbol = USE_NATIVE$1 && typeof $Symbol.iterator == 'symbol' ? function (it) { + return typeof it == 'symbol'; + } : function (it) { + return it instanceof $Symbol; + }; + + var $defineProperty = function defineProperty(it, key, D) { + if (it === ObjectProto$1) $defineProperty(OPSymbols, key, D); + _anObject(it); + key = _toPrimitive(key, true); + _anObject(D); + if (_has(AllSymbols, key)) { + if (!D.enumerable) { + if (!_has(it, HIDDEN)) dP$1(it, HIDDEN, _propertyDesc(1, {})); + it[HIDDEN][key] = true; + } else { + if (_has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false; + D = _objectCreate(D, { enumerable: _propertyDesc(0, false) }); + } return setSymbolDesc(it, key, D); + } return dP$1(it, key, D); + }; + var $defineProperties = function defineProperties(it, P) { + _anObject(it); + var keys = _enumKeys(P = _toIobject(P)); + var i = 0; + var l = keys.length; + var key; + while (l > i) $defineProperty(it, key = keys[i++], P[key]); + return it; + }; + var $create = function create(it, P) { + return P === undefined ? _objectCreate(it) : $defineProperties(_objectCreate(it), P); + }; + var $propertyIsEnumerable = function propertyIsEnumerable(key) { + var E = isEnum.call(this, key = _toPrimitive(key, true)); + if (this === ObjectProto$1 && _has(AllSymbols, key) && !_has(OPSymbols, key)) return false; + return E || !_has(this, key) || !_has(AllSymbols, key) || _has(this, HIDDEN) && this[HIDDEN][key] ? E : true; + }; + var $getOwnPropertyDescriptor$1 = function getOwnPropertyDescriptor(it, key) { + it = _toIobject(it); + key = _toPrimitive(key, true); + if (it === ObjectProto$1 && _has(AllSymbols, key) && !_has(OPSymbols, key)) return; + var D = gOPD$1(it, key); + if (D && _has(AllSymbols, key) && !(_has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true; + return D; + }; + var $getOwnPropertyNames = function getOwnPropertyNames(it) { + var names = gOPN$1(_toIobject(it)); + var result = []; + var i = 0; + var key; + while (names.length > i) { + if (!_has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key); + } return result; + }; + var $getOwnPropertySymbols = function getOwnPropertySymbols(it) { + var IS_OP = it === ObjectProto$1; + var names = gOPN$1(IS_OP ? OPSymbols : _toIobject(it)); + var result = []; + var i = 0; + var key; + while (names.length > i) { + if (_has(AllSymbols, key = names[i++]) && (IS_OP ? _has(ObjectProto$1, key) : true)) result.push(AllSymbols[key]); + } return result; + }; + + // 19.4.1.1 Symbol([description]) + if (!USE_NATIVE$1) { + $Symbol = function Symbol() { + if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!'); + var tag = _uid(arguments.length > 0 ? arguments[0] : undefined); + var $set = function (value) { + if (this === ObjectProto$1) $set.call(OPSymbols, value); + if (_has(this, HIDDEN) && _has(this[HIDDEN], tag)) this[HIDDEN][tag] = false; + setSymbolDesc(this, tag, _propertyDesc(1, value)); + }; + if (_descriptors && setter) setSymbolDesc(ObjectProto$1, tag, { configurable: true, set: $set }); + return wrap(tag); + }; + _redefine($Symbol[PROTOTYPE$2], 'toString', function toString() { + return this._k; + }); + + _objectGopd.f = $getOwnPropertyDescriptor$1; + _objectDp.f = $defineProperty; + _objectGopn.f = _objectGopnExt.f = $getOwnPropertyNames; + _objectPie.f = $propertyIsEnumerable; + _objectGops.f = $getOwnPropertySymbols; + + if (_descriptors && !_library) { + _redefine(ObjectProto$1, 'propertyIsEnumerable', $propertyIsEnumerable, true); + } + + _wksExt.f = function (name) { + return wrap(_wks(name)); + }; + } + + _export(_export.G + _export.W + _export.F * !USE_NATIVE$1, { Symbol: $Symbol }); + + for (var es6Symbols = ( + // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14 + 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables' + ).split(','), j = 0; es6Symbols.length > j;)_wks(es6Symbols[j++]); + + for (var wellKnownSymbols = _objectKeys(_wks.store), k = 0; wellKnownSymbols.length > k;) _wksDefine(wellKnownSymbols[k++]); + + _export(_export.S + _export.F * !USE_NATIVE$1, 'Symbol', { + // 19.4.2.1 Symbol.for(key) + 'for': function (key) { + return _has(SymbolRegistry, key += '') + ? SymbolRegistry[key] + : SymbolRegistry[key] = $Symbol(key); + }, + // 19.4.2.5 Symbol.keyFor(sym) + keyFor: function keyFor(sym) { + if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!'); + for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key; + }, + useSetter: function () { setter = true; }, + useSimple: function () { setter = false; } + }); + + _export(_export.S + _export.F * !USE_NATIVE$1, 'Object', { + // 19.1.2.2 Object.create(O [, Properties]) + create: $create, + // 19.1.2.4 Object.defineProperty(O, P, Attributes) + defineProperty: $defineProperty, + // 19.1.2.3 Object.defineProperties(O, Properties) + defineProperties: $defineProperties, + // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) + getOwnPropertyDescriptor: $getOwnPropertyDescriptor$1, + // 19.1.2.7 Object.getOwnPropertyNames(O) + getOwnPropertyNames: $getOwnPropertyNames, + // 19.1.2.8 Object.getOwnPropertySymbols(O) + getOwnPropertySymbols: $getOwnPropertySymbols + }); + + // 24.3.2 JSON.stringify(value [, replacer [, space]]) + $JSON && _export(_export.S + _export.F * (!USE_NATIVE$1 || _fails(function () { + var S = $Symbol(); + // MS Edge converts symbol values to JSON as {} + // WebKit converts symbol values to JSON as null + // V8 throws on boxed symbols + return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}'; + })), 'JSON', { + stringify: function stringify(it) { + var args = [it]; + var i = 1; + var replacer, $replacer; + while (arguments.length > i) args.push(arguments[i++]); + $replacer = replacer = args[1]; + if (!_isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined + if (!_isArray(replacer)) replacer = function (key, value) { + if (typeof $replacer == 'function') value = $replacer.call(this, key, value); + if (!isSymbol(value)) return value; + }; + args[1] = replacer; + return _stringify.apply($JSON, args); + } + }); + + // 19.4.3.4 Symbol.prototype[@@toPrimitive](hint) + $Symbol[PROTOTYPE$2][TO_PRIMITIVE] || _hide($Symbol[PROTOTYPE$2], TO_PRIMITIVE, $Symbol[PROTOTYPE$2].valueOf); + // 19.4.3.5 Symbol.prototype[@@toStringTag] + _setToStringTag($Symbol, 'Symbol'); + // 20.2.1.9 Math[@@toStringTag] + _setToStringTag(Math, 'Math', true); + // 24.3.3 JSON[@@toStringTag] + _setToStringTag(_global.JSON, 'JSON', true); + + var getOwnPropertySymbols = _core.Object.getOwnPropertySymbols; + + var getOwnPropertySymbols$1 = getOwnPropertySymbols; + + // 19.1.2.14 Object.keys(O) + + + + _objectSap('keys', function () { + return function keys(it) { + return _objectKeys(_toObject(it)); + }; + }); + + var keys = _core.Object.keys; + + var keys$1 = keys; + + // 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes) + _export(_export.S + _export.F * !_descriptors, 'Object', { defineProperty: _objectDp.f }); + + var $Object$1 = _core.Object; + var defineProperty$1 = function defineProperty(it, key, desc) { + return $Object$1.defineProperty(it, key, desc); + }; + + var defineProperty$2 = defineProperty$1; + + function _defineProperty(obj, key, value) { + if (key in obj) { + defineProperty$2(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; + } + + var defineProperty$3 = _defineProperty; + + function _objectSpread(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; + + var ownKeys = keys$1(source); + + if (typeof getOwnPropertySymbols$1 === 'function') { + ownKeys = ownKeys.concat(getOwnPropertySymbols$1(source).filter(function (sym) { + return getOwnPropertyDescriptor$1(source, sym).enumerable; + })); + } + + ownKeys.forEach(function (key) { + defineProperty$3(target, key, source[key]); + }); + } + + return target; + } + + var objectSpread = _objectSpread; + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + var classCallCheck = _classCallCheck; + + // Works with __proto__ only. Old v8 can't work with null proto objects. + /* eslint-disable no-proto */ + + + var check = function (O, proto) { + _anObject(O); + if (!_isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!"); + }; + var _setProto = { + set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line + function (test, buggy, set) { + try { + set = _ctx(Function.call, _objectGopd.f(Object.prototype, '__proto__').set, 2); + set(test, []); + buggy = !(test instanceof Array); + } catch (e) { buggy = true; } + return function setPrototypeOf(O, proto) { + check(O, proto); + if (buggy) O.__proto__ = proto; + else set(O, proto); + return O; + }; + }({}, false) : undefined), + check: check + }; + + // 19.1.3.19 Object.setPrototypeOf(O, proto) + + _export(_export.S, 'Object', { setPrototypeOf: _setProto.set }); + + var setPrototypeOf = _core.Object.setPrototypeOf; + + var setPrototypeOf$1 = setPrototypeOf; + + var setPrototypeOf$2 = createCommonjsModule(function (module) { + function _setPrototypeOf(o, p) { + module.exports = _setPrototypeOf = setPrototypeOf$1 || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + + return _setPrototypeOf(o, p); + } + + module.exports = _setPrototypeOf; + }); + + function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + + setPrototypeOf$2(subClass.prototype, superClass && superClass.prototype); + if (superClass) setPrototypeOf$2(subClass, superClass); + } + + var inherits = _inherits; + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + + defineProperty$2(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + var createClass = _createClass; + + var iterator = _wksExt.f('iterator'); + + var iterator$1 = iterator; + + _wksDefine('asyncIterator'); + + _wksDefine('observable'); + + var symbol = _core.Symbol; + + var symbol$1 = symbol; + + var _typeof_1 = createCommonjsModule(function (module) { + function _typeof2(obj) { if (typeof symbol$1 === "function" && typeof iterator$1 === "symbol") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof symbol$1 === "function" && obj.constructor === symbol$1 && obj !== symbol$1.prototype ? "symbol" : typeof obj; }; } return _typeof2(obj); } + + function _typeof(obj) { + if (typeof symbol$1 === "function" && _typeof2(iterator$1) === "symbol") { + module.exports = _typeof = function _typeof(obj) { + return _typeof2(obj); + }; + } else { + module.exports = _typeof = function _typeof(obj) { + return obj && typeof symbol$1 === "function" && obj.constructor === symbol$1 && obj !== symbol$1.prototype ? "symbol" : _typeof2(obj); + }; + } + + return _typeof(obj); + } + + module.exports = _typeof; + }); + + function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return self; + } + + var assertThisInitialized = _assertThisInitialized; + + function _possibleConstructorReturn(self, call) { + if (call && (_typeof_1(call) === "object" || typeof call === "function")) { + return call; + } + + return assertThisInitialized(self); + } + + var possibleConstructorReturn = _possibleConstructorReturn; + + // 19.1.2.9 Object.getPrototypeOf(O) + + + + _objectSap('getPrototypeOf', function () { + return function getPrototypeOf(it) { + return _objectGpo(_toObject(it)); + }; + }); + + var getPrototypeOf = _core.Object.getPrototypeOf; + + var getPrototypeOf$1 = getPrototypeOf; + + var getPrototypeOf$2 = createCommonjsModule(function (module) { + function _getPrototypeOf(o) { + module.exports = _getPrototypeOf = getPrototypeOf$1 || function _getPrototypeOf(o) { + return o.__proto__; + }; + + return _getPrototypeOf(o); + } + + module.exports = _getPrototypeOf; + }); + + var extend = function extend(object) { + for (var _len = arguments.length, extensions = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + extensions[_key - 1] = arguments[_key]; + } + + // $.extend alternative, ... is the spread operator. + for (var _i = 0; _i < extensions.length; _i++) { + var extension = extensions[_i]; + // console.log(extension); + // console.log(typeof extension); + if (!extension) continue; // Ignore null and undefined objects and parameters. + + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = Object.getOwnPropertyNames(extension)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var prop = _step.value; + + // Do not traverse the prototype chain. + if (object[prop] !== undefined && extension[prop] && object[prop].toString() === '[object Object]' && extension[prop].toString() === '[object Object]') { + // Goes deep only if object[prop] and extension[prop] are both objects ! + if (object[prop].constructor === Object) extend(object[prop], extension[prop]); + } else object[prop] = typeof object[prop] === 'undefined' ? extension[prop] : object[prop]; + + if (typeof object[prop] === 'undefined' && Array.isArray(extension[prop])) object[prop] = extension[prop].slice(); // Add values that do not already exist. + else if (typeof object[prop] === 'undefined' && Array.isArray(extension[prop])) object[prop] = extension[prop]; + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return != null) { + _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + } + + return object; + }; + + var instruct = function instruct(array, instArray) { + var tempObject = {}; + + for (var i = 0, max = instArray.length; i < max; i++) { + var guide = instArray[i]; + tempObject[guide] = array[i]; + } + + return tempObject; + }; + var transformData = function transformData(object, instructions) { + for (var key in instructions) { + if (Array.isArray(object[key])) object[key] = instruct(object[key], instructions[key]);else if (object[key] instanceof Object && !Array.isArray(instructions[key])) object[key] = transformData(object[key], instructions[key]); + } + + return object; + }; + var toArray = function toArray(object, instruction) { + var tempArray = []; + + for (var i = 0, max = instruction.length; i < max; i++) { + var guide = instruction[i]; + tempArray[i] = object[guide]; + } + + return tempArray; + }; + + // Polyfills + + if ( Number.EPSILON === undefined ) { + + Number.EPSILON = Math.pow( 2, - 52 ); + + } + + if ( Number.isInteger === undefined ) { + + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger + + Number.isInteger = function ( value ) { + + return typeof value === 'number' && isFinite( value ) && Math.floor( value ) === value; + + }; + + } + + // + + if ( Math.sign === undefined ) { + + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign + + Math.sign = function ( x ) { + + return ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x; + + }; + + } + + if ( 'name' in Function.prototype === false ) { + + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name + + Object.defineProperty( Function.prototype, 'name', { + + get: function () { + + return this.toString().match( /^\s*function\s*([^\(\s]*)/ )[ 1 ]; + + } + + } ); + + } + + if ( Object.assign === undefined ) { + + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign + + ( function () { + + Object.assign = function ( target ) { + + if ( target === undefined || target === null ) { + + throw new TypeError( 'Cannot convert undefined or null to object' ); + + } + + var output = Object( target ); + + for ( var index = 1; index < arguments.length; index ++ ) { + + var source = arguments[ index ]; + + if ( source !== undefined && source !== null ) { + + for ( var nextKey in source ) { + + if ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) { + + output[ nextKey ] = source[ nextKey ]; + + } + + } + + } + + } + + return output; + + }; + + } )(); + + } + + /** + * https://github.com/mrdoob/eventdispatcher.js/ + */ + + function EventDispatcher() {} + + Object.assign( EventDispatcher.prototype, { + + 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 ); + + } + + }, + + hasEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) return false; + + var listeners = this._listeners; + + return listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1; + + }, + + removeEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) return; + + var listeners = this._listeners; + var listenerArray = listeners[ type ]; + + if ( listenerArray !== undefined ) { + + var index = listenerArray.indexOf( listener ); + + if ( index !== - 1 ) { + + listenerArray.splice( index, 1 ); + + } + + } + + }, + + dispatchEvent: function ( event ) { + + if ( this._listeners === undefined ) return; + + var listeners = this._listeners; + var listenerArray = listeners[ event.type ]; + + if ( listenerArray !== undefined ) { + + event.target = this; + + var array = listenerArray.slice( 0 ); + + for ( var i = 0, l = array.length; i < l; i ++ ) { + + array[ i ].call( this, event ); + + } + + } + + } + + } ); + + var REVISION = '92'; + var MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 }; + var CullFaceNone = 0; + var CullFaceBack = 1; + var CullFaceFront = 2; + var PCFShadowMap = 1; + var PCFSoftShadowMap = 2; + var FrontSide = 0; + var BackSide = 1; + var DoubleSide = 2; + var FlatShading = 1; + var NoColors = 0; + var FaceColors = 1; + var VertexColors = 2; + var NoBlending = 0; + var NormalBlending = 1; + var AdditiveBlending = 2; + var SubtractiveBlending = 3; + var MultiplyBlending = 4; + var CustomBlending = 5; + var AddEquation = 100; + var SubtractEquation = 101; + var ReverseSubtractEquation = 102; + var MinEquation = 103; + var MaxEquation = 104; + var ZeroFactor = 200; + var OneFactor = 201; + var SrcColorFactor = 202; + var OneMinusSrcColorFactor = 203; + var SrcAlphaFactor = 204; + var OneMinusSrcAlphaFactor = 205; + var DstAlphaFactor = 206; + var OneMinusDstAlphaFactor = 207; + var DstColorFactor = 208; + var OneMinusDstColorFactor = 209; + var SrcAlphaSaturateFactor = 210; + var NeverDepth = 0; + var AlwaysDepth = 1; + var LessDepth = 2; + var LessEqualDepth = 3; + var EqualDepth = 4; + var GreaterEqualDepth = 5; + var GreaterDepth = 6; + var NotEqualDepth = 7; + var MultiplyOperation = 0; + var MixOperation = 1; + var AddOperation = 2; + var NoToneMapping = 0; + var LinearToneMapping = 1; + var ReinhardToneMapping = 2; + var Uncharted2ToneMapping = 3; + var CineonToneMapping = 4; + var UVMapping = 300; + var CubeReflectionMapping = 301; + var CubeRefractionMapping = 302; + var EquirectangularReflectionMapping = 303; + var EquirectangularRefractionMapping = 304; + var SphericalReflectionMapping = 305; + var CubeUVReflectionMapping = 306; + var CubeUVRefractionMapping = 307; + var RepeatWrapping = 1000; + var ClampToEdgeWrapping = 1001; + var MirroredRepeatWrapping = 1002; + var NearestFilter = 1003; + var NearestMipMapNearestFilter = 1004; + var NearestMipMapLinearFilter = 1005; + var LinearFilter = 1006; + var LinearMipMapNearestFilter = 1007; + var LinearMipMapLinearFilter = 1008; + var UnsignedByteType = 1009; + var ByteType = 1010; + var ShortType = 1011; + var UnsignedShortType = 1012; + var IntType = 1013; + var UnsignedIntType = 1014; + var FloatType = 1015; + var HalfFloatType = 1016; + var UnsignedShort4444Type = 1017; + var UnsignedShort5551Type = 1018; + var UnsignedShort565Type = 1019; + var UnsignedInt248Type = 1020; + var AlphaFormat = 1021; + var RGBFormat = 1022; + var RGBAFormat = 1023; + var LuminanceFormat = 1024; + var LuminanceAlphaFormat = 1025; + var DepthFormat = 1026; + var DepthStencilFormat = 1027; + var RGB_S3TC_DXT1_Format = 33776; + var RGBA_S3TC_DXT1_Format = 33777; + var RGBA_S3TC_DXT3_Format = 33778; + var RGBA_S3TC_DXT5_Format = 33779; + var RGB_PVRTC_4BPPV1_Format = 35840; + var RGB_PVRTC_2BPPV1_Format = 35841; + var RGBA_PVRTC_4BPPV1_Format = 35842; + var RGBA_PVRTC_2BPPV1_Format = 35843; + var RGB_ETC1_Format = 36196; + var RGBA_ASTC_4x4_Format = 37808; + var RGBA_ASTC_5x4_Format = 37809; + var RGBA_ASTC_5x5_Format = 37810; + var RGBA_ASTC_6x5_Format = 37811; + var RGBA_ASTC_6x6_Format = 37812; + var RGBA_ASTC_8x5_Format = 37813; + var RGBA_ASTC_8x6_Format = 37814; + var RGBA_ASTC_8x8_Format = 37815; + var RGBA_ASTC_10x5_Format = 37816; + var RGBA_ASTC_10x6_Format = 37817; + var RGBA_ASTC_10x8_Format = 37818; + var RGBA_ASTC_10x10_Format = 37819; + var RGBA_ASTC_12x10_Format = 37820; + var RGBA_ASTC_12x12_Format = 37821; + var LoopOnce = 2200; + var LoopRepeat = 2201; + var LoopPingPong = 2202; + var InterpolateDiscrete = 2300; + var InterpolateLinear = 2301; + var InterpolateSmooth = 2302; + var ZeroCurvatureEnding = 2400; + var ZeroSlopeEnding = 2401; + var WrapAroundEnding = 2402; + var TrianglesDrawMode = 0; + var TriangleStripDrawMode = 1; + var TriangleFanDrawMode = 2; + var LinearEncoding = 3000; + var sRGBEncoding = 3001; + var GammaEncoding = 3007; + var RGBEEncoding = 3002; + var RGBM7Encoding = 3004; + var RGBM16Encoding = 3005; + var RGBDEncoding = 3006; + var BasicDepthPacking = 3200; + var RGBADepthPacking = 3201; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + var _Math = { + + DEG2RAD: Math.PI / 180, + RAD2DEG: 180 / Math.PI, + + generateUUID: ( function () { + + // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136 + + var lut = []; + + for ( var i = 0; i < 256; i ++ ) { + + lut[ i ] = ( i < 16 ? '0' : '' ) + ( i ).toString( 16 ); + + } + + return function generateUUID() { + + var d0 = Math.random() * 0xffffffff | 0; + var d1 = Math.random() * 0xffffffff | 0; + var d2 = Math.random() * 0xffffffff | 0; + var d3 = Math.random() * 0xffffffff | 0; + var 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(); + + }; + + } )(), + + clamp: function ( value, min, max ) { + + return Math.max( min, Math.min( max, value ) ); + + }, + + // compute euclidian modulo of m % n + // https://en.wikipedia.org/wiki/Modulo_operation + + euclideanModulo: function ( n, m ) { + + return ( ( n % m ) + m ) % m; + + }, + + // Linear mapping from range to range + + mapLinear: function ( x, a1, a2, b1, b2 ) { + + return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 ); + + }, + + // https://en.wikipedia.org/wiki/Linear_interpolation + + lerp: function ( x, y, t ) { + + return ( 1 - t ) * x + t * y; + + }, + + // http://en.wikipedia.org/wiki/Smoothstep + + smoothstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * ( 3 - 2 * x ); + + }, + + smootherstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * x * ( x * ( x * 6 - 15 ) + 10 ); + + }, + + // Random integer from interval + + randInt: function ( low, high ) { + + return low + Math.floor( Math.random() * ( high - low + 1 ) ); + + }, + + // Random float from interval + + randFloat: function ( low, high ) { + + return low + Math.random() * ( high - low ); + + }, + + // Random float from <-range/2, range/2> interval + + randFloatSpread: function ( range ) { + + return range * ( 0.5 - Math.random() ); + + }, + + degToRad: function ( degrees ) { + + return degrees * _Math.DEG2RAD; + + }, + + radToDeg: function ( radians ) { + + return radians * _Math.RAD2DEG; + + }, + + isPowerOfTwo: function ( value ) { + + return ( value & ( value - 1 ) ) === 0 && value !== 0; + + }, + + ceilPowerOfTwo: function ( value ) { + + return Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) ); + + }, + + floorPowerOfTwo: function ( value ) { + + return Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) ); + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author philogb / http://blog.thejit.org/ + * @author egraether / http://egraether.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + + function Vector2( x, y ) { + + this.x = x || 0; + this.y = y || 0; + + } + + Object.defineProperties( Vector2.prototype, { + + "width": { + + get: function () { + + return this.x; + + }, + + set: function ( value ) { + + this.x = value; + + } + + }, + + "height": { + + get: function () { + + return this.y; + + }, + + set: function ( value ) { + + this.y = value; + + } + + } + + } ); + + Object.assign( Vector2.prototype, { + + isVector2: true, + + set: function ( x, y ) { + + this.x = x; + this.y = y; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + + return this; + + }, + + multiply: function ( v ) { + + this.x *= v.x; + this.y *= v.y; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + this.x *= scalar; + this.y *= scalar; + + return this; + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + applyMatrix3: function ( m ) { + + var x = this.x, y = this.y; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ]; + this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ]; + + return this; + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + + return this; + + }, + + clamp: function ( min, max ) { + + // assumes min < max, componentwise + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + + return this; + + }, + + clampScalar: function () { + + var min = new Vector2(); + var max = new Vector2(); + + return function clampScalar( minVal, maxVal ) { + + min.set( minVal, minVal ); + max.set( maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y ); + + }, + + manhattanLength: function () { + + return Math.abs( this.x ) + Math.abs( this.y ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() || 1 ); + + }, + + angle: function () { + + // computes the angle in radians with respect to the positive x-axis + + var angle = Math.atan2( this.y, this.x ); + + if ( angle < 0 ) angle += 2 * Math.PI; + + return angle; + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x, dy = this.y - v.y; + return dx * dx + dy * dy; + + }, + + manhattanDistanceTo: function ( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ); + + }, + + setLength: function ( length ) { + + return this.normalize().multiplyScalar( length ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + + return this; + + }, + + rotateAround: function ( center, angle ) { + + var c = Math.cos( angle ), s = Math.sin( angle ); + + var x = this.x - center.x; + var y = this.y - center.y; + + this.x = x * c - y * s + center.x; + this.y = x * s + y * c + center.y; + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author jordi_ros / http://plattsoft.com + * @author D1plo1d / http://github.com/D1plo1d + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author timknip / http://www.floorplanner.com/ + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + + function Matrix4() { + + this.elements = [ + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ]; + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' ); + + } + + } + + Object.assign( Matrix4.prototype, { + + isMatrix4: true, + + set: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) { + + var te = this.elements; + + te[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14; + te[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24; + te[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34; + te[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44; + + return this; + + }, + + identity: function () { + + this.set( + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + clone: function () { + + return new Matrix4().fromArray( this.elements ); + + }, + + copy: function ( m ) { + + var te = this.elements; + var 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; + + }, + + copyPosition: function ( m ) { + + var te = this.elements, me = m.elements; + + te[ 12 ] = me[ 12 ]; + te[ 13 ] = me[ 13 ]; + te[ 14 ] = me[ 14 ]; + + return this; + + }, + + extractBasis: function ( xAxis, yAxis, zAxis ) { + + xAxis.setFromMatrixColumn( this, 0 ); + yAxis.setFromMatrixColumn( this, 1 ); + zAxis.setFromMatrixColumn( this, 2 ); + + return this; + + }, + + makeBasis: function ( 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; + + }, + + extractRotation: function () { + + var v1 = new Vector3(); + + return function extractRotation( m ) { + + var te = this.elements; + var me = m.elements; + + var scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length(); + var scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length(); + var scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length(); + + te[ 0 ] = me[ 0 ] * scaleX; + te[ 1 ] = me[ 1 ] * scaleX; + te[ 2 ] = me[ 2 ] * scaleX; + + te[ 4 ] = me[ 4 ] * scaleY; + te[ 5 ] = me[ 5 ] * scaleY; + te[ 6 ] = me[ 6 ] * scaleY; + + te[ 8 ] = me[ 8 ] * scaleZ; + te[ 9 ] = me[ 9 ] * scaleZ; + te[ 10 ] = me[ 10 ] * scaleZ; + + return this; + + }; + + }(), + + makeRotationFromEuler: function ( euler ) { + + if ( ! ( euler && euler.isEuler ) ) { + + console.error( 'THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' ); + + } + + var te = this.elements; + + var x = euler.x, y = euler.y, z = euler.z; + var a = Math.cos( x ), b = Math.sin( x ); + var c = Math.cos( y ), d = Math.sin( y ); + var e = Math.cos( z ), f = Math.sin( z ); + + if ( euler.order === 'XYZ' ) { + + var 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' ) { + + var 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' ) { + + var 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' ) { + + var 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' ) { + + var 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' ) { + + var 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; + + } + + // last column + te[ 3 ] = 0; + te[ 7 ] = 0; + te[ 11 ] = 0; + + // bottom row + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + }, + + makeRotationFromQuaternion: function ( q ) { + + var te = this.elements; + + var x = q._x, y = q._y, z = q._z, w = q._w; + var x2 = x + x, y2 = y + y, z2 = z + z; + var xx = x * x2, xy = x * y2, xz = x * z2; + var yy = y * y2, yz = y * z2, zz = z * z2; + var wx = w * x2, wy = w * y2, wz = w * z2; + + te[ 0 ] = 1 - ( yy + zz ); + te[ 4 ] = xy - wz; + te[ 8 ] = xz + wy; + + te[ 1 ] = xy + wz; + te[ 5 ] = 1 - ( xx + zz ); + te[ 9 ] = yz - wx; + + te[ 2 ] = xz - wy; + te[ 6 ] = yz + wx; + te[ 10 ] = 1 - ( xx + yy ); + + // last column + te[ 3 ] = 0; + te[ 7 ] = 0; + te[ 11 ] = 0; + + // bottom row + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + }, + + lookAt: function () { + + var x = new Vector3(); + var y = new Vector3(); + var z = new Vector3(); + + return function lookAt( eye, target, up ) { + + var te = this.elements; + + z.subVectors( eye, target ); + + if ( z.lengthSq() === 0 ) { + + // eye and target are in the same position + + z.z = 1; + + } + + z.normalize(); + x.crossVectors( up, z ); + + if ( x.lengthSq() === 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; + + }; + + }(), + + multiply: function ( m, n ) { + + if ( n !== undefined ) { + + console.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' ); + return this.multiplyMatrices( m, n ); + + } + + return this.multiplyMatrices( this, m ); + + }, + + premultiply: function ( m ) { + + return this.multiplyMatrices( m, this ); + + }, + + multiplyMatrices: function ( a, b ) { + + var ae = a.elements; + var be = b.elements; + var te = this.elements; + + var a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ]; + var a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ]; + var a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ]; + var a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ]; + + var b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ]; + var b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ]; + var b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ]; + var 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; + + }, + + multiplyScalar: function ( s ) { + + var te = this.elements; + + te[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s; + te[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s; + te[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s; + te[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s; + + return this; + + }, + + applyToBufferAttribute: function () { + + var v1 = new Vector3(); + + return function applyToBufferAttribute( attribute ) { + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + v1.x = attribute.getX( i ); + v1.y = attribute.getY( i ); + v1.z = attribute.getZ( i ); + + v1.applyMatrix4( this ); + + attribute.setXYZ( i, v1.x, v1.y, v1.z ); + + } + + return attribute; + + }; + + }(), + + determinant: function () { + + var te = this.elements; + + var n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ]; + var n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ]; + var n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ]; + var n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ]; + + //TODO: make this more efficient + //( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm ) + + 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 + ) + + ); + + }, + + transpose: function () { + + var te = this.elements; + var 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; + + }, + + setPosition: function ( v ) { + + var te = this.elements; + + te[ 12 ] = v.x; + te[ 13 ] = v.y; + te[ 14 ] = v.z; + + return this; + + }, + + getInverse: function ( m, throwOnDegenerate ) { + + // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm + var te = this.elements, + me = m.elements, + + n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ], + n12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ], + n13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ], + n14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 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; + + var det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14; + + if ( det === 0 ) { + + var msg = "THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0"; + + if ( throwOnDegenerate === true ) { + + throw new Error( msg ); + + } else { + + console.warn( msg ); + + } + + return this.identity(); + + } + + var 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; + + }, + + scale: function ( v ) { + + var te = this.elements; + var x = v.x, y = v.y, z = v.z; + + te[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z; + te[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z; + te[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z; + te[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z; + + return this; + + }, + + getMaxScaleOnAxis: function () { + + var te = this.elements; + + var scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ]; + var scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ]; + var scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ]; + + return Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) ); + + }, + + makeTranslation: function ( x, y, z ) { + + this.set( + + 1, 0, 0, x, + 0, 1, 0, y, + 0, 0, 1, z, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationX: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + 1, 0, 0, 0, + 0, c, - s, 0, + 0, s, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationY: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationZ: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, - s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationAxis: function ( axis, angle ) { + + // Based on http://www.gamedev.net/reference/articles/article1199.asp + + var c = Math.cos( angle ); + var s = Math.sin( angle ); + var t = 1 - c; + var x = axis.x, y = axis.y, z = axis.z; + var tx = t * x, ty = t * y; + + 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 + + ); + + return this; + + }, + + makeScale: function ( x, y, z ) { + + this.set( + + x, 0, 0, 0, + 0, y, 0, 0, + 0, 0, z, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeShear: function ( x, y, z ) { + + this.set( + + 1, y, z, 0, + x, 1, z, 0, + x, y, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + compose: function ( position, quaternion, scale ) { + + this.makeRotationFromQuaternion( quaternion ); + this.scale( scale ); + this.setPosition( position ); + + return this; + + }, + + decompose: function () { + + var vector = new Vector3(); + var matrix = new Matrix4(); + + return function decompose( position, quaternion, scale ) { + + var te = this.elements; + + var sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length(); + var sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length(); + var sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length(); + + // if determine is negative, we need to invert one scale + var det = this.determinant(); + if ( det < 0 ) sx = - sx; + + position.x = te[ 12 ]; + position.y = te[ 13 ]; + position.z = te[ 14 ]; + + // scale the rotation part + matrix.copy( this ); + + var invSX = 1 / sx; + var invSY = 1 / sy; + var invSZ = 1 / sz; + + matrix.elements[ 0 ] *= invSX; + matrix.elements[ 1 ] *= invSX; + matrix.elements[ 2 ] *= invSX; + + matrix.elements[ 4 ] *= invSY; + matrix.elements[ 5 ] *= invSY; + matrix.elements[ 6 ] *= invSY; + + matrix.elements[ 8 ] *= invSZ; + matrix.elements[ 9 ] *= invSZ; + matrix.elements[ 10 ] *= invSZ; + + quaternion.setFromRotationMatrix( matrix ); + + scale.x = sx; + scale.y = sy; + scale.z = sz; + + return this; + + }; + + }(), + + makePerspective: function ( left, right, top, bottom, near, far ) { + + if ( far === undefined ) { + + console.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' ); + + } + + var te = this.elements; + var x = 2 * near / ( right - left ); + var y = 2 * near / ( top - bottom ); + + var a = ( right + left ) / ( right - left ); + var b = ( top + bottom ) / ( top - bottom ); + var c = - ( far + near ) / ( far - near ); + var d = - 2 * far * near / ( far - near ); + + te[ 0 ] = x; te[ 4 ] = 0; te[ 8 ] = a; te[ 12 ] = 0; + te[ 1 ] = 0; te[ 5 ] = y; te[ 9 ] = b; te[ 13 ] = 0; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = c; te[ 14 ] = d; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = - 1; te[ 15 ] = 0; + + return this; + + }, + + makeOrthographic: function ( left, right, top, bottom, near, far ) { + + var te = this.elements; + var w = 1.0 / ( right - left ); + var h = 1.0 / ( top - bottom ); + var p = 1.0 / ( far - near ); + + var x = ( right + left ) * w; + var y = ( top + bottom ) * h; + var z = ( far + near ) * p; + + te[ 0 ] = 2 * w; te[ 4 ] = 0; te[ 8 ] = 0; te[ 12 ] = - x; + te[ 1 ] = 0; te[ 5 ] = 2 * h; te[ 9 ] = 0; te[ 13 ] = - y; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = - 2 * p; te[ 14 ] = - z; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = 0; te[ 15 ] = 1; + + return this; + + }, + + equals: function ( matrix ) { + + var te = this.elements; + var me = matrix.elements; + + for ( var i = 0; i < 16; i ++ ) { + + if ( te[ i ] !== me[ i ] ) return false; + + } + + return true; + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + for ( var i = 0; i < 16; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + var 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; + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + + function Quaternion( x, y, z, w ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._w = ( w !== undefined ) ? w : 1; + + } + + Object.assign( Quaternion, { + + slerp: function ( qa, qb, qm, t ) { + + return qm.copy( qa ).slerp( qb, t ); + + }, + + slerpFlat: function ( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) { + + // fuzz-free, array-based Quaternion SLERP operation + + var x0 = src0[ srcOffset0 + 0 ], + y0 = src0[ srcOffset0 + 1 ], + z0 = src0[ srcOffset0 + 2 ], + w0 = src0[ srcOffset0 + 3 ], + + x1 = src1[ srcOffset1 + 0 ], + y1 = src1[ srcOffset1 + 1 ], + z1 = src1[ srcOffset1 + 2 ], + w1 = src1[ srcOffset1 + 3 ]; + + if ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) { + + var s = 1 - t, + + cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1, + + dir = ( cos >= 0 ? 1 : - 1 ), + sqrSin = 1 - cos * cos; + + // Skip the Slerp for tiny steps to avoid numeric problems: + if ( sqrSin > Number.EPSILON ) { + + var sin = Math.sqrt( sqrSin ), + len = Math.atan2( sin, cos * dir ); + + s = Math.sin( s * len ) / sin; + t = Math.sin( t * len ) / sin; + + } + + var tDir = t * dir; + + x0 = x0 * s + x1 * tDir; + y0 = y0 * s + y1 * tDir; + z0 = z0 * s + z1 * tDir; + w0 = w0 * s + w1 * tDir; + + // Normalize in case we just did a lerp: + if ( s === 1 - t ) { + + var 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; + + } + + } ); + + Object.defineProperties( Quaternion.prototype, { + + x: { + + get: function () { + + return this._x; + + }, + + set: function ( value ) { + + this._x = value; + this.onChangeCallback(); + + } + + }, + + y: { + + get: function () { + + return this._y; + + }, + + set: function ( value ) { + + this._y = value; + this.onChangeCallback(); + + } + + }, + + z: { + + get: function () { + + return this._z; + + }, + + set: function ( value ) { + + this._z = value; + this.onChangeCallback(); + + } + + }, + + w: { + + get: function () { + + return this._w; + + }, + + set: function ( value ) { + + this._w = value; + this.onChangeCallback(); + + } + + } + + } ); + + Object.assign( Quaternion.prototype, { + + set: function ( x, y, z, w ) { + + this._x = x; + this._y = y; + this._z = z; + this._w = w; + + this.onChangeCallback(); + + return this; + + }, + + clone: function () { + + return new this.constructor( this._x, this._y, this._z, this._w ); + + }, + + copy: function ( quaternion ) { + + this._x = quaternion.x; + this._y = quaternion.y; + this._z = quaternion.z; + this._w = quaternion.w; + + this.onChangeCallback(); + + return this; + + }, + + setFromEuler: function ( euler, update ) { + + if ( ! ( euler && euler.isEuler ) ) { + + throw new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' ); + + } + + var x = euler._x, y = euler._y, z = euler._z, order = euler.order; + + // http://www.mathworks.com/matlabcentral/fileexchange/ + // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/ + // content/SpinCalc.m + + var cos = Math.cos; + var sin = Math.sin; + + var c1 = cos( x / 2 ); + var c2 = cos( y / 2 ); + var c3 = cos( z / 2 ); + + var s1 = sin( x / 2 ); + var s2 = sin( y / 2 ); + var s3 = 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; + + } + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromAxisAngle: function ( axis, angle ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm + + // assumes axis is normalized + + var 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; + + }, + + setFromRotationMatrix: function ( 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) + + var 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, + 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; + + }, + + setFromUnitVectors: function () { + + // assumes direction vectors vFrom and vTo are normalized + + var v1 = new Vector3(); + var r; + + var EPS = 0.000001; + + return function setFromUnitVectors( vFrom, vTo ) { + + if ( v1 === undefined ) v1 = new Vector3(); + + r = vFrom.dot( vTo ) + 1; + + if ( r < EPS ) { + + r = 0; + + if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) { + + v1.set( - vFrom.y, vFrom.x, 0 ); + + } else { + + v1.set( 0, - vFrom.z, vFrom.y ); + + } + + } else { + + v1.crossVectors( vFrom, vTo ); + + } + + this._x = v1.x; + this._y = v1.y; + this._z = v1.z; + this._w = r; + + return this.normalize(); + + }; + + }(), + + inverse: function () { + + // quaternion is assumed to have unit length + + return this.conjugate(); + + }, + + conjugate: function () { + + this._x *= - 1; + this._y *= - 1; + this._z *= - 1; + + this.onChangeCallback(); + + return this; + + }, + + dot: function ( v ) { + + return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w; + + }, + + lengthSq: function () { + + return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w; + + }, + + length: function () { + + return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w ); + + }, + + normalize: function () { + + var 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; + + }, + + multiply: function ( q, p ) { + + if ( p !== undefined ) { + + console.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' ); + return this.multiplyQuaternions( q, p ); + + } + + return this.multiplyQuaternions( this, q ); + + }, + + premultiply: function ( q ) { + + return this.multiplyQuaternions( q, this ); + + }, + + multiplyQuaternions: function ( a, b ) { + + // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm + + var qax = a._x, qay = a._y, qaz = a._z, qaw = a._w; + var 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; + + }, + + slerp: function ( qb, t ) { + + if ( t === 0 ) return this; + if ( t === 1 ) return this.copy( qb ); + + var x = this._x, y = this._y, z = this._z, w = this._w; + + // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/ + + var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z; + + if ( cosHalfTheta < 0 ) { + + this._w = - qb._w; + this._x = - qb._x; + this._y = - qb._y; + this._z = - qb._z; + + cosHalfTheta = - cosHalfTheta; + + } else { + + this.copy( qb ); + + } + + if ( cosHalfTheta >= 1.0 ) { + + this._w = w; + this._x = x; + this._y = y; + this._z = z; + + return this; + + } + + var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta ); + + if ( Math.abs( sinHalfTheta ) < 0.001 ) { + + this._w = 0.5 * ( w + this._w ); + this._x = 0.5 * ( x + this._x ); + this._y = 0.5 * ( y + this._y ); + this._z = 0.5 * ( z + this._z ); + + return this; + + } + + var halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta ); + var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta, + ratioB = Math.sin( t * halfTheta ) / sinHalfTheta; + + this._w = ( w * ratioA + this._w * ratioB ); + this._x = ( x * ratioA + this._x * ratioB ); + this._y = ( y * ratioA + this._y * ratioB ); + this._z = ( z * ratioA + this._z * ratioB ); + + this.onChangeCallback(); + + return this; + + }, + + equals: function ( quaternion ) { + + return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this._x = array[ offset ]; + this._y = array[ offset + 1 ]; + this._z = array[ offset + 2 ]; + this._w = array[ offset + 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._w; + + return array; + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {} + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author kile / http://kile.stravaganza.org/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Vector3( x, y, z ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + + } + + Object.assign( Vector3.prototype, { + + isVector3: true, + + set: function ( x, y, z ) { + + this.x = x; + this.y = y; + this.z = z; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y, this.z ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + + return this; + + }, + + multiply: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' ); + return this.multiplyVectors( v, w ); + + } + + this.x *= v.x; + this.y *= v.y; + this.z *= v.z; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + + return this; + + }, + + multiplyVectors: function ( a, b ) { + + this.x = a.x * b.x; + this.y = a.y * b.y; + this.z = a.z * b.z; + + return this; + + }, + + applyEuler: function () { + + var quaternion = new Quaternion(); + + return function applyEuler( euler ) { + + if ( ! ( euler && euler.isEuler ) ) { + + console.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' ); + + } + + return this.applyQuaternion( quaternion.setFromEuler( euler ) ); + + }; + + }(), + + applyAxisAngle: function () { + + var quaternion = new Quaternion(); + + return function applyAxisAngle( axis, angle ) { + + return this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) ); + + }; + + }(), + + applyMatrix3: function ( m ) { + + var x = this.x, y = this.y, z = this.z; + var 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; + + }, + + applyMatrix4: function ( m ) { + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + var 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; + + }, + + applyQuaternion: function ( q ) { + + var x = this.x, y = this.y, z = this.z; + var qx = q.x, qy = q.y, qz = q.z, qw = q.w; + + // calculate quat * vector + + var ix = qw * x + qy * z - qz * y; + var iy = qw * y + qz * x - qx * z; + var iz = qw * z + qx * y - qy * x; + var 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; + + }, + + project: function () { + + var matrix = new Matrix4(); + + return function project( camera ) { + + matrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) ); + return this.applyMatrix4( matrix ); + + }; + + }(), + + unproject: function () { + + var matrix = new Matrix4(); + + return function unproject( camera ) { + + matrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) ); + return this.applyMatrix4( matrix ); + + }; + + }(), + + transformDirection: function ( m ) { + + // input: THREE.Matrix4 affine matrix + // vector interpreted as a direction + + var x = this.x, y = this.y, z = this.z; + var 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(); + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + this.z /= v.z; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + min: function ( 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; + + }, + + max: function ( 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; + + }, + + clamp: function ( min, max ) { + + // assumes min < max, componentwise + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + + return this; + + }, + + clampScalar: function () { + + var min = new Vector3(); + var max = new Vector3(); + + return function clampScalar( minVal, maxVal ) { + + min.set( minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z; + + }, + + // TODO lengthSquared? + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z ); + + }, + + manhattanLength: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() || 1 ); + + }, + + setLength: function ( length ) { + + return this.normalize().multiplyScalar( length ); + + }, + + lerp: function ( 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; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + cross: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' ); + return this.crossVectors( v, w ); + + } + + return this.crossVectors( this, v ); + + }, + + crossVectors: function ( a, b ) { + + var ax = a.x, ay = a.y, az = a.z; + var 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; + + }, + + projectOnVector: function ( vector ) { + + var scalar = vector.dot( this ) / vector.lengthSq(); + + return this.copy( vector ).multiplyScalar( scalar ); + + }, + + projectOnPlane: function () { + + var v1 = new Vector3(); + + return function projectOnPlane( planeNormal ) { + + v1.copy( this ).projectOnVector( planeNormal ); + + return this.sub( v1 ); + + }; + + }(), + + reflect: function () { + + // reflect incident vector off plane orthogonal to normal + // normal is assumed to have unit length + + var v1 = new Vector3(); + + return function reflect( normal ) { + + return this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) ); + + }; + + }(), + + angleTo: function ( v ) { + + var theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) ); + + // clamp, to handle numerical problems + + return Math.acos( _Math.clamp( theta, - 1, 1 ) ); + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z; + + return dx * dx + dy * dy + dz * dz; + + }, + + manhattanDistanceTo: function ( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z ); + + }, + + setFromSpherical: function ( s ) { + + var 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; + + }, + + setFromCylindrical: function ( c ) { + + this.x = c.radius * Math.sin( c.theta ); + this.y = c.y; + this.z = c.radius * Math.cos( c.theta ); + + return this; + + }, + + setFromMatrixPosition: function ( m ) { + + var e = m.elements; + + this.x = e[ 12 ]; + this.y = e[ 13 ]; + this.z = e[ 14 ]; + + return this; + + }, + + setFromMatrixScale: function ( m ) { + + var sx = this.setFromMatrixColumn( m, 0 ).length(); + var sy = this.setFromMatrixColumn( m, 1 ).length(); + var sz = this.setFromMatrixColumn( m, 2 ).length(); + + this.x = sx; + this.y = sy; + this.z = sz; + + return this; + + }, + + setFromMatrixColumn: function ( m, index ) { + + return this.fromArray( m.elements, index * 4 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + this.z = attribute.getZ( index ); + + return this; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + * @author tschw + */ + + function Matrix3() { + + this.elements = [ + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ]; + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' ); + + } + + } + + Object.assign( Matrix3.prototype, { + + isMatrix3: true, + + set: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) { + + var te = this.elements; + + te[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31; + te[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32; + te[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33; + + return this; + + }, + + identity: function () { + + this.set( + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ); + + return this; + + }, + + clone: function () { + + return new this.constructor().fromArray( this.elements ); + + }, + + copy: function ( m ) { + + var te = this.elements; + var 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; + + }, + + setFromMatrix4: function ( m ) { + + var me = m.elements; + + this.set( + + me[ 0 ], me[ 4 ], me[ 8 ], + me[ 1 ], me[ 5 ], me[ 9 ], + me[ 2 ], me[ 6 ], me[ 10 ] + + ); + + return this; + + }, + + applyToBufferAttribute: function () { + + var v1 = new Vector3(); + + return function applyToBufferAttribute( attribute ) { + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + v1.x = attribute.getX( i ); + v1.y = attribute.getY( i ); + v1.z = attribute.getZ( i ); + + v1.applyMatrix3( this ); + + attribute.setXYZ( i, v1.x, v1.y, v1.z ); + + } + + return attribute; + + }; + + }(), + + multiply: function ( m ) { + + return this.multiplyMatrices( this, m ); + + }, + + premultiply: function ( m ) { + + return this.multiplyMatrices( m, this ); + + }, + + multiplyMatrices: function ( a, b ) { + + var ae = a.elements; + var be = b.elements; + var te = this.elements; + + var a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ]; + var a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ]; + var a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ]; + + var b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ]; + var b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ]; + var 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; + + }, + + multiplyScalar: function ( s ) { + + var te = this.elements; + + te[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s; + te[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s; + te[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s; + + return this; + + }, + + determinant: function () { + + var te = this.elements; + + var 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; + + }, + + getInverse: function ( matrix, throwOnDegenerate ) { + + if ( matrix && matrix.isMatrix4 ) { + + console.error( "THREE.Matrix3: .getInverse() no longer takes a Matrix4 argument." ); + + } + + var me = matrix.elements, + te = this.elements, + + n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], + n12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ], + n13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 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 ) { + + var msg = "THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0"; + + if ( throwOnDegenerate === true ) { + + throw new Error( msg ); + + } else { + + console.warn( msg ); + + } + + return this.identity(); + + } + + var 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; + + }, + + transpose: function () { + + var tmp, 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; + + }, + + getNormalMatrix: function ( matrix4 ) { + + return this.setFromMatrix4( matrix4 ).getInverse( this ).transpose(); + + }, + + transposeIntoArray: function ( r ) { + + var m = this.elements; + + r[ 0 ] = m[ 0 ]; + r[ 1 ] = m[ 3 ]; + r[ 2 ] = m[ 6 ]; + r[ 3 ] = m[ 1 ]; + r[ 4 ] = m[ 4 ]; + r[ 5 ] = m[ 7 ]; + r[ 6 ] = m[ 2 ]; + r[ 7 ] = m[ 5 ]; + r[ 8 ] = m[ 8 ]; + + return this; + + }, + + setUvTransform: function ( tx, ty, sx, sy, rotation, cx, cy ) { + + var c = Math.cos( rotation ); + var s = Math.sin( rotation ); + + 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 + ); + + }, + + scale: function ( sx, sy ) { + + var te = this.elements; + + te[ 0 ] *= sx; te[ 3 ] *= sx; te[ 6 ] *= sx; + te[ 1 ] *= sy; te[ 4 ] *= sy; te[ 7 ] *= sy; + + return this; + + }, + + rotate: function ( theta ) { + + var c = Math.cos( theta ); + var s = Math.sin( theta ); + + var te = this.elements; + + var a11 = te[ 0 ], a12 = te[ 3 ], a13 = te[ 6 ]; + var a21 = te[ 1 ], a22 = te[ 4 ], a23 = te[ 7 ]; + + te[ 0 ] = c * a11 + s * a21; + te[ 3 ] = c * a12 + s * a22; + te[ 6 ] = c * a13 + s * a23; + + te[ 1 ] = - s * a11 + c * a21; + te[ 4 ] = - s * a12 + c * a22; + te[ 7 ] = - s * a13 + c * a23; + + return this; + + }, + + translate: function ( tx, ty ) { + + var te = this.elements; + + te[ 0 ] += tx * te[ 2 ]; te[ 3 ] += tx * te[ 5 ]; te[ 6 ] += tx * te[ 8 ]; + te[ 1 ] += ty * te[ 2 ]; te[ 4 ] += ty * te[ 5 ]; te[ 7 ] += ty * te[ 8 ]; + + return this; + + }, + + equals: function ( matrix ) { + + var te = this.elements; + var me = matrix.elements; + + for ( var i = 0; i < 9; i ++ ) { + + if ( te[ i ] !== me[ i ] ) return false; + + } + + return true; + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + for ( var i = 0; i < 9; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + var 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; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + */ + + var textureId = 0; + + function Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { + + Object.defineProperty( this, 'id', { value: textureId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + + this.image = image !== undefined ? image : Texture.DEFAULT_IMAGE; + this.mipmaps = []; + + this.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING; + + this.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping; + this.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping; + + this.magFilter = magFilter !== undefined ? magFilter : LinearFilter; + this.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter; + + this.anisotropy = anisotropy !== undefined ? anisotropy : 1; + + this.format = format !== undefined ? format : RGBAFormat; + this.type = type !== undefined ? type : UnsignedByteType; + + this.offset = new Vector2( 0, 0 ); + this.repeat = new Vector2( 1, 1 ); + this.center = new Vector2( 0, 0 ); + this.rotation = 0; + + this.matrixAutoUpdate = true; + this.matrix = new Matrix3(); + + this.generateMipmaps = true; + this.premultiplyAlpha = false; + this.flipY = true; + this.unpackAlignment = 4; // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml) + + // Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap. + // + // Also changing the encoding after already used by a Material will not automatically make the Material + // update. You need to explicitly call Material.needsUpdate to trigger it to recompile. + this.encoding = encoding !== undefined ? encoding : LinearEncoding; + + this.version = 0; + this.onUpdate = null; + + } + + Texture.DEFAULT_IMAGE = undefined; + Texture.DEFAULT_MAPPING = UVMapping; + + Texture.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: Texture, + + isTexture: true, + + updateMatrix: function () { + + this.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.name = source.name; + + this.image = source.image; + this.mipmaps = source.mipmaps.slice( 0 ); + + this.mapping = source.mapping; + + this.wrapS = source.wrapS; + this.wrapT = source.wrapT; + + this.magFilter = source.magFilter; + this.minFilter = source.minFilter; + + this.anisotropy = source.anisotropy; + + this.format = source.format; + this.type = source.type; + + this.offset.copy( source.offset ); + this.repeat.copy( source.repeat ); + this.center.copy( source.center ); + this.rotation = source.rotation; + + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrix.copy( source.matrix ); + + this.generateMipmaps = source.generateMipmaps; + this.premultiplyAlpha = source.premultiplyAlpha; + this.flipY = source.flipY; + this.unpackAlignment = source.unpackAlignment; + this.encoding = source.encoding; + + return this; + + }, + + toJSON: function ( meta ) { + + var isRootObject = ( meta === undefined || typeof meta === 'string' ); + + if ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) { + + return meta.textures[ this.uuid ]; + + } + + function getDataURL( image ) { + + var canvas; + + if ( image instanceof HTMLCanvasElement ) { + + canvas = image; + + } else { + + canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = image.width; + canvas.height = image.height; + + var context = canvas.getContext( '2d' ); + + if ( image instanceof ImageData ) { + + context.putImageData( image, 0, 0 ); + + } else { + + context.drawImage( image, 0, 0, image.width, image.height ); + + } + + } + + if ( canvas.width > 2048 || canvas.height > 2048 ) { + + return canvas.toDataURL( 'image/jpeg', 0.6 ); + + } else { + + return canvas.toDataURL( 'image/png' ); + + } + + } + + var output = { + + metadata: { + version: 4.5, + type: 'Texture', + generator: 'Texture.toJSON' + }, + + uuid: this.uuid, + name: this.name, + + mapping: this.mapping, + + repeat: [ this.repeat.x, this.repeat.y ], + offset: [ this.offset.x, this.offset.y ], + center: [ this.center.x, this.center.y ], + rotation: this.rotation, + + wrap: [ this.wrapS, this.wrapT ], + + format: this.format, + minFilter: this.minFilter, + magFilter: this.magFilter, + anisotropy: this.anisotropy, + + flipY: this.flipY + + }; + + if ( this.image !== undefined ) { + + // TODO: Move to THREE.Image + + var image = this.image; + + if ( image.uuid === undefined ) { + + image.uuid = _Math.generateUUID(); // UGH + + } + + if ( ! isRootObject && meta.images[ image.uuid ] === undefined ) { + + meta.images[ image.uuid ] = { + uuid: image.uuid, + url: getDataURL( image ) + }; + + } + + output.image = image.uuid; + + } + + if ( ! isRootObject ) { + + meta.textures[ this.uuid ] = output; + + } + + return output; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + }, + + transformUv: function ( uv ) { + + if ( this.mapping !== UVMapping ) return; + + uv.applyMatrix3( this.matrix ); + + if ( uv.x < 0 || uv.x > 1 ) { + + switch ( this.wrapS ) { + + case RepeatWrapping: + + uv.x = uv.x - Math.floor( uv.x ); + break; + + case ClampToEdgeWrapping: + + uv.x = uv.x < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) { + + uv.x = Math.ceil( uv.x ) - uv.x; + + } else { + + uv.x = uv.x - Math.floor( uv.x ); + + } + break; + + } + + } + + if ( uv.y < 0 || uv.y > 1 ) { + + switch ( this.wrapT ) { + + case RepeatWrapping: + + uv.y = uv.y - Math.floor( uv.y ); + break; + + case ClampToEdgeWrapping: + + uv.y = uv.y < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) { + + uv.y = Math.ceil( uv.y ) - uv.y; + + } else { + + uv.y = uv.y - Math.floor( uv.y ); + + } + break; + + } + + } + + if ( this.flipY ) { + + uv.y = 1 - uv.y; + + } + + } + + } ); + + Object.defineProperty( Texture.prototype, "needsUpdate", { + + set: function ( value ) { + + if ( value === true ) this.version ++; + + } + + } ); + + /** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Vector4( x, y, z, w ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + this.w = ( w !== undefined ) ? w : 1; + + } + + Object.assign( Vector4.prototype, { + + isVector4: true, + + set: function ( x, y, z, w ) { + + this.x = x; + this.y = y; + this.z = z; + this.w = w; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + this.w = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setW: function ( w ) { + + this.w = w; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + case 3: this.w = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + case 3: return this.w; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y, this.z, this.w ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + this.w = ( v.w !== undefined ) ? v.w : 1; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + this.w += v.w; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + this.w += s; + + return this; + + }, + + addVectors: function ( 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; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + this.w += v.w * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + this.w -= v.w; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + this.w -= s; + + return this; + + }, + + subVectors: function ( 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; + + }, + + multiplyScalar: function ( scalar ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + this.w *= scalar; + + return this; + + }, + + applyMatrix4: function ( m ) { + + var x = this.x, y = this.y, z = this.z, w = this.w; + var 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; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + setAxisAngleFromQuaternion: function ( q ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm + + // q is assumed to be normalized + + this.w = 2 * Math.acos( q.w ); + + var s = Math.sqrt( 1 - q.w * q.w ); + + if ( s < 0.0001 ) { + + this.x = 1; + this.y = 0; + this.z = 0; + + } else { + + this.x = q.x / s; + this.y = q.y / s; + this.z = q.z / s; + + } + + return this; + + }, + + setAxisAngleFromRotationMatrix: function ( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var angle, x, y, z, // variables for result + epsilon = 0.01, // margin to allow for rounding errors + epsilon2 = 0.1, // margin to distinguish between 0 and 180 degrees + + 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 ]; + + if ( ( Math.abs( m12 - m21 ) < epsilon ) && + ( Math.abs( m13 - m31 ) < epsilon ) && + ( Math.abs( m23 - m32 ) < epsilon ) ) { + + // singularity found + // first check for identity matrix which must have +1 for all terms + // in leading diagonal and zero in other terms + + if ( ( Math.abs( m12 + m21 ) < epsilon2 ) && + ( Math.abs( m13 + m31 ) < epsilon2 ) && + ( Math.abs( m23 + m32 ) < epsilon2 ) && + ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) { + + // this singularity is identity matrix so angle = 0 + + this.set( 1, 0, 0, 0 ); + + return this; // zero angle, arbitrary axis + + } + + // otherwise this singularity is angle = 180 + + angle = Math.PI; + + var xx = ( m11 + 1 ) / 2; + var yy = ( m22 + 1 ) / 2; + var zz = ( m33 + 1 ) / 2; + var xy = ( m12 + m21 ) / 4; + var xz = ( m13 + m31 ) / 4; + var yz = ( m23 + m32 ) / 4; + + if ( ( xx > yy ) && ( xx > zz ) ) { + + // m11 is the largest diagonal term + + if ( xx < epsilon ) { + + x = 0; + y = 0.707106781; + z = 0.707106781; + + } else { + + x = Math.sqrt( xx ); + y = xy / x; + z = xz / x; + + } + + } else if ( yy > zz ) { + + // m22 is the largest diagonal term + + if ( yy < epsilon ) { + + x = 0.707106781; + y = 0; + z = 0.707106781; + + } else { + + y = Math.sqrt( yy ); + x = xy / y; + z = yz / y; + + } + + } else { + + // m33 is the largest diagonal term so base result on this + + if ( zz < epsilon ) { + + x = 0.707106781; + y = 0.707106781; + z = 0; + + } else { + + z = Math.sqrt( zz ); + x = xz / z; + y = yz / z; + + } + + } + + this.set( x, y, z, angle ); + + return this; // return 180 deg rotation + + } + + // as we have reached here there are no singularities so we can handle normally + + var s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) + + ( m13 - m31 ) * ( m13 - m31 ) + + ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize + + if ( Math.abs( s ) < 0.001 ) s = 1; + + // prevent divide by zero, should not happen if matrix is orthogonal and should be + // caught by singularity test above, but I've left it in just in case + + this.x = ( m32 - m23 ) / s; + this.y = ( m13 - m31 ) / s; + this.z = ( m21 - m12 ) / s; + this.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 ); + + return this; + + }, + + min: function ( 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 ); + this.w = Math.min( this.w, v.w ); + + return this; + + }, + + max: function ( 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 ); + this.w = Math.max( this.w, v.w ); + + return this; + + }, + + clamp: function ( min, max ) { + + // assumes min < max, componentwise + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + this.w = Math.max( min.w, Math.min( max.w, this.w ) ); + + return this; + + }, + + clampScalar: function () { + + var min, max; + + return function clampScalar( minVal, maxVal ) { + + if ( min === undefined ) { + + min = new Vector4(); + max = new Vector4(); + + } + + min.set( minVal, minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + this.w = Math.floor( this.w ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + this.w = Math.ceil( this.w ); + + return this; + + }, + + round: function () { + + 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; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + this.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + this.w = - this.w; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w ); + + }, + + manhattanLength: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() || 1 ); + + }, + + setLength: function ( length ) { + + return this.normalize().multiplyScalar( length ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + this.w += ( v.w - this.w ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + this.w = array[ offset + 3 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + array[ offset + 3 ] = this.w; + + return array; + + }, + + fromBufferAttribute: function ( attribute, index, offset ) { + + if ( offset !== undefined ) { + + console.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' ); + + } + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + this.z = attribute.getZ( index ); + this.w = attribute.getW( index ); + + return this; + + } + + } ); + + /** + * @author szimek / https://github.com/szimek/ + * @author alteredq / http://alteredqualia.com/ + * @author Marius Kintel / https://github.com/kintel + */ + + /* + In options, we can specify: + * Texture parameters for an auto-generated target texture + * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers + */ + function WebGLRenderTarget( width, height, options ) { + + this.width = width; + this.height = height; + + this.scissor = new Vector4( 0, 0, width, height ); + this.scissorTest = false; + + this.viewport = new Vector4( 0, 0, width, height ); + + options = options || {}; + + if ( options.minFilter === undefined ) options.minFilter = LinearFilter; + + this.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding ); + + this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true; + this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true; + this.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null; + + } + + WebGLRenderTarget.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: WebGLRenderTarget, + + isWebGLRenderTarget: true, + + setSize: function ( width, height ) { + + if ( this.width !== width || this.height !== height ) { + + this.width = width; + this.height = height; + + this.dispose(); + + } + + this.viewport.set( 0, 0, width, height ); + this.scissor.set( 0, 0, width, height ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.width = source.width; + this.height = source.height; + + this.viewport.copy( source.viewport ); + + this.texture = source.texture.clone(); + + this.depthBuffer = source.depthBuffer; + this.stencilBuffer = source.stencilBuffer; + this.depthTexture = source.depthTexture; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com + */ + + function WebGLRenderTargetCube( width, height, options ) { + + WebGLRenderTarget.call( this, width, height, options ); + + this.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5 + this.activeMipMapLevel = 0; + + } + + WebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype ); + WebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube; + + WebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.image = { data: data, width: width, height: height }; + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter; + + this.generateMipmaps = false; + this.flipY = false; + this.unpackAlignment = 1; + + } + + DataTexture.prototype = Object.create( Texture.prototype ); + DataTexture.prototype.constructor = DataTexture; + + DataTexture.prototype.isDataTexture = true; + + /** + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + + function Box3( min, max ) { + + this.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity ); + this.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity ); + + } + + Object.assign( Box3.prototype, { + + isBox3: true, + + set: function ( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + }, + + setFromArray: function ( array ) { + + var minX = + Infinity; + var minY = + Infinity; + var minZ = + Infinity; + + var maxX = - Infinity; + var maxY = - Infinity; + var maxZ = - Infinity; + + for ( var i = 0, l = array.length; i < l; i += 3 ) { + + var x = array[ i ]; + var y = array[ i + 1 ]; + var z = array[ i + 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; + + } + + this.min.set( minX, minY, minZ ); + this.max.set( maxX, maxY, maxZ ); + + return this; + + }, + + setFromBufferAttribute: function ( attribute ) { + + var minX = + Infinity; + var minY = + Infinity; + var minZ = + Infinity; + + var maxX = - Infinity; + var maxY = - Infinity; + var maxZ = - Infinity; + + for ( var i = 0, l = attribute.count; i < l; i ++ ) { + + var x = attribute.getX( i ); + var y = attribute.getY( i ); + var z = attribute.getZ( i ); + + 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; + + }, + + setFromPoints: function ( points ) { + + this.makeEmpty(); + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + }, + + setFromCenterAndSize: function () { + + var v1 = new Vector3(); + + return function setFromCenterAndSize( center, size ) { + + var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); + + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + }; + + }(), + + setFromObject: function ( object ) { + + this.makeEmpty(); + + return this.expandByObject( object ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + }, + + makeEmpty: function () { + + this.min.x = this.min.y = this.min.z = + Infinity; + this.max.x = this.max.y = this.max.z = - Infinity; + + return this; + + }, + + isEmpty: function () { + + // 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 ); + + }, + + getCenter: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .getCenter() target is now required' ); + target = new Vector3(); + + } + + return this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + }, + + getSize: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .getSize() target is now required' ); + target = new Vector3(); + + } + + return this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min ); + + }, + + expandByPoint: function ( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + }, + + expandByVector: function ( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + }, + + expandByScalar: function ( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + }, + + expandByObject: function () { + + // Computes the world-axis-aligned bounding box of an object (including its children), + // accounting for both the object's, and children's, world transforms + + var scope, i, l; + + var v1 = new Vector3(); + + function traverse( node ) { + + var geometry = node.geometry; + + if ( geometry !== undefined ) { + + if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + + for ( i = 0, l = vertices.length; i < l; i ++ ) { + + v1.copy( vertices[ i ] ); + v1.applyMatrix4( node.matrixWorld ); + + scope.expandByPoint( v1 ); + + } + + } else if ( geometry.isBufferGeometry ) { + + var attribute = geometry.attributes.position; + + if ( attribute !== undefined ) { + + for ( i = 0, l = attribute.count; i < l; i ++ ) { + + v1.fromBufferAttribute( attribute, i ).applyMatrix4( node.matrixWorld ); + + scope.expandByPoint( v1 ); + + } + + } + + } + + } + + } + + return function expandByObject( object ) { + + scope = this; + + object.updateMatrixWorld( true ); + + object.traverse( traverse ); + + return this; + + }; + + }(), + + containsPoint: function ( 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; + + }, + + containsBox: function ( box ) { + + return this.min.x <= box.min.x && box.max.x <= this.max.x && + this.min.y <= box.min.y && box.max.y <= this.max.y && + this.min.z <= box.min.z && box.max.z <= this.max.z; + + }, + + getParameter: function ( point, target ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .getParameter() target is now required' ); + target = new Vector3(); + + } + + return target.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ), + ( point.z - this.min.z ) / ( this.max.z - this.min.z ) + ); + + }, + + intersectsBox: function ( box ) { + + // using 6 splitting planes to rule out intersections. + return box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y || + box.max.z < this.min.z || box.min.z > this.max.z ? false : true; + + }, + + intersectsSphere: ( function () { + + var closestPoint = new Vector3(); + + return function intersectsSphere( sphere ) { + + // Find the point on the AABB closest to the sphere center. + this.clampPoint( sphere.center, closestPoint ); + + // If that point is inside the sphere, the AABB and sphere intersect. + return closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius ); + + }; + + } )(), + + intersectsPlane: function ( plane ) { + + // We compute the minimum and maximum dot product values. If those values + // are on the same side (back or front) of the plane, then there is no intersection. + + var min, max; + + if ( plane.normal.x > 0 ) { + + min = plane.normal.x * this.min.x; + max = plane.normal.x * this.max.x; + + } else { + + min = plane.normal.x * this.max.x; + max = plane.normal.x * this.min.x; + + } + + if ( plane.normal.y > 0 ) { + + min += plane.normal.y * this.min.y; + max += plane.normal.y * this.max.y; + + } else { + + min += plane.normal.y * this.max.y; + max += plane.normal.y * this.min.y; + + } + + if ( plane.normal.z > 0 ) { + + min += plane.normal.z * this.min.z; + max += plane.normal.z * this.max.z; + + } else { + + min += plane.normal.z * this.max.z; + max += plane.normal.z * this.min.z; + + } + + return ( min <= plane.constant && max >= plane.constant ); + + }, + + intersectsTriangle: ( function () { + + // triangle centered vertices + var v0 = new Vector3(); + var v1 = new Vector3(); + var v2 = new Vector3(); + + // triangle edge vectors + var f0 = new Vector3(); + var f1 = new Vector3(); + var f2 = new Vector3(); + + var testAxis = new Vector3(); + + var center = new Vector3(); + var extents = new Vector3(); + + var triangleNormal = new Vector3(); + + function satForAxes( axes ) { + + var i, j; + + for ( i = 0, j = axes.length - 3; i <= j; i += 3 ) { + + testAxis.fromArray( axes, i ); + // project the aabb onto the seperating axis + var 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 seperating axis + var p0 = v0.dot( testAxis ); + var p1 = v1.dot( testAxis ); + var 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 seperating and we can exit + return false; + + } + + } + + return true; + + } + + return function 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) + var 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 ) ) { + + return false; + + } + + // test 3 face normals from the aabb + axes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ]; + if ( ! satForAxes( axes ) ) { + + 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 ); + + }; + + } )(), + + clampPoint: function ( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .clampPoint() target is now required' ); + target = new Vector3(); + + } + + return target.copy( point ).clamp( this.min, this.max ); + + }, + + distanceToPoint: function () { + + var v1 = new Vector3(); + + return function distanceToPoint( point ) { + + var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + }; + + }(), + + getBoundingSphere: function () { + + var v1 = new Vector3(); + + return function getBoundingSphere( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box3: .getBoundingSphere() target is now required' ); + target = new Sphere(); + + } + + this.getCenter( target.center ); + + target.radius = this.getSize( v1 ).length() * 0.5; + + return target; + + }; + + }(), + + intersect: function ( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + // ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values. + if ( this.isEmpty() ) this.makeEmpty(); + + return this; + + }, + + union: function ( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + }, + + applyMatrix4: function () { + + var points = [ + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3() + ]; + + return function 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; + + }; + + }(), + + translate: function ( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + }, + + equals: function ( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + + } ); + + /** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + + function Sphere( center, radius ) { + + this.center = ( center !== undefined ) ? center : new Vector3(); + this.radius = ( radius !== undefined ) ? radius : 0; + + } + + Object.assign( Sphere.prototype, { + + set: function ( center, radius ) { + + this.center.copy( center ); + this.radius = radius; + + return this; + + }, + + setFromPoints: function () { + + var box = new Box3(); + + return function setFromPoints( points, optionalCenter ) { + + var center = this.center; + + if ( optionalCenter !== undefined ) { + + center.copy( optionalCenter ); + + } else { + + box.setFromPoints( points ).getCenter( center ); + + } + + var maxRadiusSq = 0; + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) ); + + } + + this.radius = Math.sqrt( maxRadiusSq ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( sphere ) { + + this.center.copy( sphere.center ); + this.radius = sphere.radius; + + return this; + + }, + + empty: function () { + + return ( this.radius <= 0 ); + + }, + + containsPoint: function ( point ) { + + return ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) ); + + }, + + distanceToPoint: function ( point ) { + + return ( point.distanceTo( this.center ) - this.radius ); + + }, + + intersectsSphere: function ( sphere ) { + + var radiusSum = this.radius + sphere.radius; + + return sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsSphere( this ); + + }, + + intersectsPlane: function ( plane ) { + + return Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius; + + }, + + clampPoint: function ( point, target ) { + + var deltaLengthSq = this.center.distanceToSquared( point ); + + if ( target === undefined ) { + + console.warn( 'THREE.Sphere: .clampPoint() target is now required' ); + target = new Vector3(); + + } + + target.copy( point ); + + if ( deltaLengthSq > ( this.radius * this.radius ) ) { + + target.sub( this.center ).normalize(); + target.multiplyScalar( this.radius ).add( this.center ); + + } + + return target; + + }, + + getBoundingBox: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Sphere: .getBoundingBox() target is now required' ); + target = new Box3(); + + } + + target.set( this.center, this.center ); + target.expandByScalar( this.radius ); + + return target; + + }, + + applyMatrix4: function ( matrix ) { + + this.center.applyMatrix4( matrix ); + this.radius = this.radius * matrix.getMaxScaleOnAxis(); + + return this; + + }, + + translate: function ( offset ) { + + this.center.add( offset ); + + return this; + + }, + + equals: function ( sphere ) { + + return sphere.center.equals( this.center ) && ( sphere.radius === this.radius ); + + } + + } ); + + /** + * @author bhouston / http://clara.io + */ + + function Plane( normal, constant ) { + + // normal is assumed to be normalized + + this.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 ); + this.constant = ( constant !== undefined ) ? constant : 0; + + } + + Object.assign( Plane.prototype, { + + set: function ( normal, constant ) { + + this.normal.copy( normal ); + this.constant = constant; + + return this; + + }, + + setComponents: function ( x, y, z, w ) { + + this.normal.set( x, y, z ); + this.constant = w; + + return this; + + }, + + setFromNormalAndCoplanarPoint: function ( normal, point ) { + + this.normal.copy( normal ); + this.constant = - point.dot( this.normal ); + + return this; + + }, + + setFromCoplanarPoints: function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function setFromCoplanarPoints( a, b, c ) { + + var normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize(); + + // Q: should an error be thrown if normal is zero (e.g. degenerate plane)? + + this.setFromNormalAndCoplanarPoint( normal, a ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( plane ) { + + this.normal.copy( plane.normal ); + this.constant = plane.constant; + + return this; + + }, + + normalize: function () { + + // Note: will lead to a divide by zero if the plane is invalid. + + var inverseNormalLength = 1.0 / this.normal.length(); + this.normal.multiplyScalar( inverseNormalLength ); + this.constant *= inverseNormalLength; + + return this; + + }, + + negate: function () { + + this.constant *= - 1; + this.normal.negate(); + + return this; + + }, + + distanceToPoint: function ( point ) { + + return this.normal.dot( point ) + this.constant; + + }, + + distanceToSphere: function ( sphere ) { + + return this.distanceToPoint( sphere.center ) - sphere.radius; + + }, + + projectPoint: function ( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Plane: .projectPoint() target is now required' ); + target = new Vector3(); + + } + + return target.copy( this.normal ).multiplyScalar( - this.distanceToPoint( point ) ).add( point ); + + }, + + intersectLine: function () { + + var v1 = new Vector3(); + + return function intersectLine( line, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Plane: .intersectLine() target is now required' ); + target = new Vector3(); + + } + + var direction = line.delta( v1 ); + + var denominator = this.normal.dot( direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( this.distanceToPoint( line.start ) === 0 ) { + + return target.copy( line.start ); + + } + + // Unsure if this is the correct method to handle this case. + return undefined; + + } + + var t = - ( line.start.dot( this.normal ) + this.constant ) / denominator; + + if ( t < 0 || t > 1 ) { + + return undefined; + + } + + return target.copy( direction ).multiplyScalar( t ).add( line.start ); + + }; + + }(), + + intersectsLine: function ( line ) { + + // Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it. + + var startSign = this.distanceToPoint( line.start ); + var endSign = this.distanceToPoint( line.end ); + + return ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsPlane( this ); + + }, + + intersectsSphere: function ( sphere ) { + + return sphere.intersectsPlane( this ); + + }, + + coplanarPoint: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Plane: .coplanarPoint() target is now required' ); + target = new Vector3(); + + } + + return target.copy( this.normal ).multiplyScalar( - this.constant ); + + }, + + applyMatrix4: function () { + + var v1 = new Vector3(); + var m1 = new Matrix3(); + + return function applyMatrix4( matrix, optionalNormalMatrix ) { + + var normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix ); + + var referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix ); + + var normal = this.normal.applyMatrix3( normalMatrix ).normalize(); + + this.constant = - referencePoint.dot( normal ); + + return this; + + }; + + }(), + + translate: function ( offset ) { + + this.constant -= offset.dot( this.normal ); + + return this; + + }, + + equals: function ( plane ) { + + return plane.normal.equals( this.normal ) && ( plane.constant === this.constant ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author bhouston / http://clara.io + */ + + function Frustum( p0, p1, p2, p3, p4, p5 ) { + + this.planes = [ + + ( p0 !== undefined ) ? p0 : new Plane(), + ( p1 !== undefined ) ? p1 : new Plane(), + ( p2 !== undefined ) ? p2 : new Plane(), + ( p3 !== undefined ) ? p3 : new Plane(), + ( p4 !== undefined ) ? p4 : new Plane(), + ( p5 !== undefined ) ? p5 : new Plane() + + ]; + + } + + Object.assign( Frustum.prototype, { + + set: function ( p0, p1, p2, p3, p4, p5 ) { + + var 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; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( frustum ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + planes[ i ].copy( frustum.planes[ i ] ); + + } + + return this; + + }, + + setFromMatrix: function ( m ) { + + var planes = this.planes; + var me = m.elements; + var me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ]; + var me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ]; + var me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ]; + var 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; + + }, + + intersectsObject: function () { + + var sphere = new Sphere(); + + return function intersectsObject( object ) { + + var geometry = object.geometry; + + if ( geometry.boundingSphere === null ) + geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ) + .applyMatrix4( object.matrixWorld ); + + return this.intersectsSphere( sphere ); + + }; + + }(), + + intersectsSprite: function () { + + var sphere = new Sphere(); + + return function intersectsSprite( sprite ) { + + sphere.center.set( 0, 0, 0 ); + sphere.radius = 0.7071067811865476; + sphere.applyMatrix4( sprite.matrixWorld ); + + return this.intersectsSphere( sphere ); + + }; + + }(), + + intersectsSphere: function ( sphere ) { + + var planes = this.planes; + var center = sphere.center; + var negRadius = - sphere.radius; + + for ( var i = 0; i < 6; i ++ ) { + + var distance = planes[ i ].distanceToPoint( center ); + + if ( distance < negRadius ) { + + return false; + + } + + } + + return true; + + }, + + intersectsBox: function () { + + var p1 = new Vector3(), + p2 = new Vector3(); + + return function intersectsBox( box ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + var plane = planes[ i ]; + + p1.x = plane.normal.x > 0 ? box.min.x : box.max.x; + p2.x = plane.normal.x > 0 ? box.max.x : box.min.x; + p1.y = plane.normal.y > 0 ? box.min.y : box.max.y; + p2.y = plane.normal.y > 0 ? box.max.y : box.min.y; + p1.z = plane.normal.z > 0 ? box.min.z : box.max.z; + p2.z = plane.normal.z > 0 ? box.max.z : box.min.z; + + var d1 = plane.distanceToPoint( p1 ); + var d2 = plane.distanceToPoint( p2 ); + + // if both outside plane, no intersection + + if ( d1 < 0 && d2 < 0 ) { + + return false; + + } + + } + + return true; + + }; + + }(), + + containsPoint: function ( point ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + if ( planes[ i ].distanceToPoint( point ) < 0 ) { + + return false; + + } + + } + + return true; + + } + + } ); + + var alphamap_fragment = "#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n"; + + var alphamap_pars_fragment = "#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n"; + + var alphatest_fragment = "#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n"; + + var aomap_fragment = "#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif\n"; + + var aomap_pars_fragment = "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif"; + + var begin_vertex = "\nvec3 transformed = vec3( position );\n"; + + var beginnormal_vertex = "\nvec3 objectNormal = vec3( normal );\n"; + + var bsdfs = "float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t}\n\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn 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 G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\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}\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;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\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 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\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\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\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}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n"; + + var bumpmap_pars_fragment = "#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + 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\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n"; + + var clipping_planes_fragment = "#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t#endif\n#endif\n"; + + var clipping_planes_pars_fragment = "#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n"; + + var clipping_planes_pars_vertex = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n"; + + var clipping_planes_vertex = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n"; + + var color_fragment = "#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif"; + + var color_pars_fragment = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n"; + + var color_pars_vertex = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif"; + + var color_vertex = "#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif"; + + var common = "#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\n"; + + var cube_uv_reflection_fragment = "#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale = bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n"; + + var defaultnormal_vertex = "vec3 transformedNormal = normalMatrix * objectNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n"; + + var displacementmap_pars_vertex = "#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n"; + + var displacementmap_vertex = "#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n"; + + var emissivemap_fragment = "#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n"; + + var emissivemap_pars_fragment = "#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n"; + + var encodings_fragment = " gl_FragColor = linearToOutputTexel( gl_FragColor );\n"; + + var encodings_pars_fragment = "\nvec4 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}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = min( floor( D ) / 255.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract(Le);\n\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n\treturn vec4( max(vRGB, 0.0), 1.0 );\n}\n"; + + var envmap_fragment = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\treflectVec = normalize( reflectVec );\n\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\treflectVec = normalize( reflectVec );\n\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n"; + + var envmap_pars_fragment = "#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntensity;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n"; + + var envmap_pars_vertex = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n"; + + var envmap_vertex = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif\n"; + + var fog_vertex = "\n#ifdef USE_FOG\nfogDepth = -mvPosition.z;\n#endif"; + + var fog_pars_vertex = "#ifdef USE_FOG\n varying float fogDepth;\n#endif\n"; + + var fog_fragment = "#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n"; + + var fog_pars_fragment = "#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif\n"; + + var gradientmap_pars_fragment = "#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif\n"; + + var lightmap_fragment = "#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n"; + + var lightmap_pars_fragment = "#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif"; + + var lights_lambert_vertex = "vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n"; + + var lights_pars_begin = "uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t\tfloat shadowCameraNear;\n\t\tfloat shadowCameraFar;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n"; + + var lights_pars_maps = "#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n"; + + var lights_phong_fragment = "BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n"; + + var lights_phong_pars_fragment = "varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n"; + + var lights_physical_fragment = "PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n"; + + var lights_physical_pars_fragment = "struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat 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"; + + var lights_fragment_begin = "\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearCoatRadiance = vec3( 0.0 );\n#endif\n"; + + var lights_fragment_maps = "#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), maxMipLevel );\n\t#ifndef STANDARD\n\t\tclearCoatRadiance += getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), maxMipLevel );\n\t#endif\n#endif\n"; + + var lights_fragment_end = "#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n"; + + var logdepthbuf_fragment = "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif"; + + var logdepthbuf_pars_fragment = "#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n"; + + var logdepthbuf_pars_vertex = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif"; + + var logdepthbuf_vertex = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\tgl_Position.z *= gl_Position.w;\n\t#endif\n#endif\n"; + + var map_fragment = "#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n"; + + var map_pars_fragment = "#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n"; + + var map_particle_fragment = "#ifdef USE_MAP\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n"; + + var map_particle_pars_fragment = "#ifdef USE_MAP\n\tuniform mat3 uvTransform;\n\tuniform sampler2D map;\n#endif\n"; + + var metalnessmap_fragment = "float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif\n"; + + var metalnessmap_pars_fragment = "#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif"; + + var morphnormal_vertex = "#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n"; + + var morphtarget_pars_vertex = "#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_vertex = "#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n"; + + var normal_fragment_begin = "#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n#endif\n"; + + var normal_fragment_maps = "#ifdef USE_NORMALMAP\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n"; + + var normalmap_pars_fragment = "#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\t\tscale *= float( gl_FrontFacing ) * 2.0 - 1.0;\n\t\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\n\t\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\n\t\tvec3 N = normalize( surf_norm );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif\n"; + + var packing = "vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst 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\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n"; + + var premultiplied_alpha_fragment = "#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n"; + + var project_vertex = "vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\ngl_Position = projectionMatrix * mvPosition;\n"; + + var dithering_fragment = "#if defined( DITHERING )\n gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n"; + + var dithering_pars_fragment = "#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\n"; + + var roughnessmap_fragment = "float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif\n"; + + var roughnessmap_pars_fragment = "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif"; + + var shadowmap_pars_fragment = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n"; + + var shadowmap_pars_vertex = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n"; + + var shadowmap_vertex = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n"; + + var shadowmask_pars_fragment = "float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n"; + + var skinbase_vertex = "#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif"; + + var skinning_pars_vertex = "#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif\n"; + + var skinning_vertex = "#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 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\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif\n"; + + var skinnormal_vertex = "#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n"; + + var specularmap_fragment = "float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif"; + + var specularmap_pars_fragment = "#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif"; + + var tonemapping_fragment = "#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n"; + + var tonemapping_pars_fragment = "#ifndef saturate\n\t#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n"; + + var uv_pars_fragment = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif"; + + var uv_pars_vertex = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\n"; + + var uv_vertex = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif"; + + var uv2_pars_fragment = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif"; + + var uv2_pars_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif"; + + var uv2_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif"; + + var worldpos_vertex = "#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif\n"; + + var cube_frag = "uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n"; + + var cube_vert = "varying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}\n"; + + var depth_frag = "#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n"; + + var depth_vert = "#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var distanceRGBA_frag = "#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}\n"; + + var distanceRGBA_vert = "#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}\n"; + + var equirect_frag = "uniform sampler2D tEquirect;\nvarying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n"; + + var equirect_vert = "varying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n"; + + var linedashed_frag = "uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var linedashed_vert = "uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}\n"; + + var meshbasic_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\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\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshbasic_vert = "#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshlambert_frag = "uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\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 \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include \n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshlambert_vert = "#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\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\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshphong_frag = "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\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 \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshphong_vert = "#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\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\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshphysical_frag = "#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\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 \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshphysical_vert = "#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\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\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}\n"; + + var normal_frag = "#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n"; + + var normal_vert = "#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n"; + + var points_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var points_vert = "uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize = size * ( scale / - mvPosition.z );\n\t#else\n\t\tgl_PointSize = size;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var shadow_frag = "uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n}\n"; + + var shadow_vert = "#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var ShaderChunk = { + alphamap_fragment: alphamap_fragment, + alphamap_pars_fragment: alphamap_pars_fragment, + alphatest_fragment: alphatest_fragment, + aomap_fragment: aomap_fragment, + aomap_pars_fragment: aomap_pars_fragment, + begin_vertex: begin_vertex, + beginnormal_vertex: beginnormal_vertex, + bsdfs: bsdfs, + bumpmap_pars_fragment: bumpmap_pars_fragment, + clipping_planes_fragment: clipping_planes_fragment, + clipping_planes_pars_fragment: clipping_planes_pars_fragment, + clipping_planes_pars_vertex: clipping_planes_pars_vertex, + clipping_planes_vertex: clipping_planes_vertex, + color_fragment: color_fragment, + color_pars_fragment: color_pars_fragment, + color_pars_vertex: color_pars_vertex, + color_vertex: color_vertex, + common: common, + cube_uv_reflection_fragment: cube_uv_reflection_fragment, + defaultnormal_vertex: defaultnormal_vertex, + displacementmap_pars_vertex: displacementmap_pars_vertex, + displacementmap_vertex: displacementmap_vertex, + emissivemap_fragment: emissivemap_fragment, + emissivemap_pars_fragment: emissivemap_pars_fragment, + encodings_fragment: encodings_fragment, + encodings_pars_fragment: encodings_pars_fragment, + envmap_fragment: envmap_fragment, + envmap_pars_fragment: envmap_pars_fragment, + envmap_pars_vertex: envmap_pars_vertex, + envmap_vertex: envmap_vertex, + fog_vertex: fog_vertex, + fog_pars_vertex: fog_pars_vertex, + fog_fragment: fog_fragment, + fog_pars_fragment: fog_pars_fragment, + gradientmap_pars_fragment: gradientmap_pars_fragment, + lightmap_fragment: lightmap_fragment, + lightmap_pars_fragment: lightmap_pars_fragment, + lights_lambert_vertex: lights_lambert_vertex, + lights_pars_begin: lights_pars_begin, + lights_pars_maps: lights_pars_maps, + lights_phong_fragment: lights_phong_fragment, + lights_phong_pars_fragment: lights_phong_pars_fragment, + lights_physical_fragment: lights_physical_fragment, + lights_physical_pars_fragment: lights_physical_pars_fragment, + lights_fragment_begin: lights_fragment_begin, + lights_fragment_maps: lights_fragment_maps, + lights_fragment_end: lights_fragment_end, + logdepthbuf_fragment: logdepthbuf_fragment, + logdepthbuf_pars_fragment: logdepthbuf_pars_fragment, + logdepthbuf_pars_vertex: logdepthbuf_pars_vertex, + logdepthbuf_vertex: logdepthbuf_vertex, + map_fragment: map_fragment, + map_pars_fragment: map_pars_fragment, + map_particle_fragment: map_particle_fragment, + map_particle_pars_fragment: map_particle_pars_fragment, + metalnessmap_fragment: metalnessmap_fragment, + metalnessmap_pars_fragment: metalnessmap_pars_fragment, + morphnormal_vertex: morphnormal_vertex, + morphtarget_pars_vertex: morphtarget_pars_vertex, + morphtarget_vertex: morphtarget_vertex, + normal_fragment_begin: normal_fragment_begin, + normal_fragment_maps: normal_fragment_maps, + normalmap_pars_fragment: normalmap_pars_fragment, + packing: packing, + premultiplied_alpha_fragment: premultiplied_alpha_fragment, + project_vertex: project_vertex, + dithering_fragment: dithering_fragment, + dithering_pars_fragment: dithering_pars_fragment, + roughnessmap_fragment: roughnessmap_fragment, + roughnessmap_pars_fragment: roughnessmap_pars_fragment, + shadowmap_pars_fragment: shadowmap_pars_fragment, + shadowmap_pars_vertex: shadowmap_pars_vertex, + shadowmap_vertex: shadowmap_vertex, + shadowmask_pars_fragment: shadowmask_pars_fragment, + skinbase_vertex: skinbase_vertex, + skinning_pars_vertex: skinning_pars_vertex, + skinning_vertex: skinning_vertex, + skinnormal_vertex: skinnormal_vertex, + specularmap_fragment: specularmap_fragment, + specularmap_pars_fragment: specularmap_pars_fragment, + tonemapping_fragment: tonemapping_fragment, + tonemapping_pars_fragment: tonemapping_pars_fragment, + uv_pars_fragment: uv_pars_fragment, + uv_pars_vertex: uv_pars_vertex, + uv_vertex: uv_vertex, + uv2_pars_fragment: uv2_pars_fragment, + uv2_pars_vertex: uv2_pars_vertex, + uv2_vertex: uv2_vertex, + worldpos_vertex: worldpos_vertex, + + cube_frag: cube_frag, + cube_vert: cube_vert, + depth_frag: depth_frag, + depth_vert: depth_vert, + distanceRGBA_frag: distanceRGBA_frag, + distanceRGBA_vert: distanceRGBA_vert, + equirect_frag: equirect_frag, + equirect_vert: equirect_vert, + linedashed_frag: linedashed_frag, + linedashed_vert: linedashed_vert, + meshbasic_frag: meshbasic_frag, + meshbasic_vert: meshbasic_vert, + meshlambert_frag: meshlambert_frag, + meshlambert_vert: meshlambert_vert, + meshphong_frag: meshphong_frag, + meshphong_vert: meshphong_vert, + meshphysical_frag: meshphysical_frag, + meshphysical_vert: meshphysical_vert, + normal_frag: normal_frag, + normal_vert: normal_vert, + points_frag: points_frag, + points_vert: points_vert, + shadow_frag: shadow_frag, + shadow_vert: shadow_vert + }; + + /** + * Uniform Utilities + */ + + var UniformsUtils = { + + merge: function ( uniforms ) { + + var merged = {}; + + for ( var u = 0; u < uniforms.length; u ++ ) { + + var tmp = this.clone( uniforms[ u ] ); + + for ( var p in tmp ) { + + merged[ p ] = tmp[ p ]; + + } + + } + + return merged; + + }, + + clone: function ( uniforms_src ) { + + var uniforms_dst = {}; + + for ( var u in uniforms_src ) { + + uniforms_dst[ u ] = {}; + + for ( var p in uniforms_src[ u ] ) { + + var parameter_src = uniforms_src[ u ][ p ]; + + if ( parameter_src && ( parameter_src.isColor || + parameter_src.isMatrix3 || parameter_src.isMatrix4 || + parameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 || + parameter_src.isTexture ) ) { + + uniforms_dst[ u ][ p ] = parameter_src.clone(); + + } else if ( Array.isArray( parameter_src ) ) { + + uniforms_dst[ u ][ p ] = parameter_src.slice(); + + } else { + + uniforms_dst[ u ][ p ] = parameter_src; + + } + + } + + } + + return uniforms_dst; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF, + 'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2, + 'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50, + 'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B, + 'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B, + 'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F, + 'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3, + 'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222, + 'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700, + 'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4, + 'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00, + 'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3, + 'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA, + 'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32, + 'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3, + 'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC, + 'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD, + 'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6, + 'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9, + 'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F, + 'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE, + 'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA, + 'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0, + 'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 }; + + function Color( r, g, b ) { + + if ( g === undefined && b === undefined ) { + + // r is THREE.Color, hex or string + return this.set( r ); + + } + + return this.setRGB( r, g, b ); + + } + + Object.assign( Color.prototype, { + + isColor: true, + + r: 1, g: 1, b: 1, + + set: function ( value ) { + + if ( value && value.isColor ) { + + this.copy( value ); + + } else if ( typeof value === 'number' ) { + + this.setHex( value ); + + } else if ( typeof value === 'string' ) { + + this.setStyle( value ); + + } + + return this; + + }, + + setScalar: function ( scalar ) { + + this.r = scalar; + this.g = scalar; + this.b = scalar; + + return this; + + }, + + setHex: function ( hex ) { + + hex = Math.floor( hex ); + + this.r = ( hex >> 16 & 255 ) / 255; + this.g = ( hex >> 8 & 255 ) / 255; + this.b = ( hex & 255 ) / 255; + + return this; + + }, + + setRGB: function ( r, g, b ) { + + this.r = r; + this.g = g; + this.b = b; + + return this; + + }, + + setHSL: function () { + + 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; + + } + + return function setHSL( h, s, l ) { + + // h,s,l ranges are in 0.0 - 1.0 + h = _Math.euclideanModulo( h, 1 ); + s = _Math.clamp( s, 0, 1 ); + l = _Math.clamp( l, 0, 1 ); + + if ( s === 0 ) { + + this.r = this.g = this.b = l; + + } else { + + var p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s ); + var 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; + + }; + + }(), + + setStyle: function ( style ) { + + function handleAlpha( string ) { + + if ( string === undefined ) return; + + if ( parseFloat( string ) < 1 ) { + + console.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' ); + + } + + } + + + var m; + + if ( m = /^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec( style ) ) { + + // rgb / hsl + + var color; + var name = m[ 1 ]; + var components = m[ 2 ]; + + switch ( name ) { + + case 'rgb': + case 'rgba': + + if ( color = /^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // rgb(255,0,0) rgba(255,0,0,0.5) + this.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255; + this.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255; + this.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255; + + handleAlpha( color[ 5 ] ); + + return this; + + } + + if ( color = /^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // rgb(100%,0%,0%) rgba(100%,0%,0%,0.5) + this.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100; + this.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100; + this.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100; + + handleAlpha( color[ 5 ] ); + + return this; + + } + + break; + + case 'hsl': + case 'hsla': + + if ( color = /^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // hsl(120,50%,50%) hsla(120,50%,50%,0.5) + var h = parseFloat( color[ 1 ] ) / 360; + var s = parseInt( color[ 2 ], 10 ) / 100; + var l = parseInt( color[ 3 ], 10 ) / 100; + + handleAlpha( color[ 5 ] ); + + return this.setHSL( h, s, l ); + + } + + break; + + } + + } else if ( m = /^\#([A-Fa-f0-9]+)$/.exec( style ) ) { + + // hex color + + var hex = m[ 1 ]; + var size = hex.length; + + if ( size === 3 ) { + + // #ff0 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255; + + return this; + + } else if ( size === 6 ) { + + // #ff0000 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255; + + return this; + + } + + } + + if ( style && style.length > 0 ) { + + // color keywords + var hex = ColorKeywords[ style ]; + + if ( hex !== undefined ) { + + // red + this.setHex( hex ); + + } else { + + // unknown color + console.warn( 'THREE.Color: Unknown color ' + style ); + + } + + } + + return this; + + }, + + clone: function () { + + return new this.constructor( this.r, this.g, this.b ); + + }, + + copy: function ( color ) { + + this.r = color.r; + this.g = color.g; + this.b = color.b; + + return this; + + }, + + copyGammaToLinear: function ( color, gammaFactor ) { + + if ( gammaFactor === undefined ) gammaFactor = 2.0; + + this.r = Math.pow( color.r, gammaFactor ); + this.g = Math.pow( color.g, gammaFactor ); + this.b = Math.pow( color.b, gammaFactor ); + + return this; + + }, + + copyLinearToGamma: function ( color, gammaFactor ) { + + if ( gammaFactor === undefined ) gammaFactor = 2.0; + + var safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0; + + this.r = Math.pow( color.r, safeInverse ); + this.g = Math.pow( color.g, safeInverse ); + this.b = Math.pow( color.b, safeInverse ); + + return this; + + }, + + convertGammaToLinear: function () { + + var r = this.r, g = this.g, b = this.b; + + this.r = r * r; + this.g = g * g; + this.b = b * b; + + return this; + + }, + + convertLinearToGamma: function () { + + this.r = Math.sqrt( this.r ); + this.g = Math.sqrt( this.g ); + this.b = Math.sqrt( this.b ); + + return this; + + }, + + getHex: function () { + + return ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0; + + }, + + getHexString: function () { + + return ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 ); + + }, + + getHSL: function ( target ) { + + // h,s,l ranges are in 0.0 - 1.0 + + if ( target === undefined ) { + + console.warn( 'THREE.Color: .getHSL() target is now required' ); + target = { h: 0, s: 0, l: 0 }; + + } + + var r = this.r, g = this.g, b = this.b; + + var max = Math.max( r, g, b ); + var min = Math.min( r, g, b ); + + var hue, saturation; + var lightness = ( min + max ) / 2.0; + + if ( min === max ) { + + hue = 0; + saturation = 0; + + } else { + + var delta = max - min; + + saturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min ); + + switch ( max ) { + + case r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break; + case g: hue = ( b - r ) / delta + 2; break; + case b: hue = ( r - g ) / delta + 4; break; + + } + + hue /= 6; + + } + + target.h = hue; + target.s = saturation; + target.l = lightness; + + return target; + + }, + + getStyle: function () { + + return 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')'; + + }, + + offsetHSL: function () { + + var hsl = {}; + + return function ( h, s, l ) { + + this.getHSL( hsl ); + + hsl.h += h; hsl.s += s; hsl.l += l; + + this.setHSL( hsl.h, hsl.s, hsl.l ); + + return this; + + }; + + }(), + + add: function ( color ) { + + this.r += color.r; + this.g += color.g; + this.b += color.b; + + return this; + + }, + + addColors: function ( color1, color2 ) { + + this.r = color1.r + color2.r; + this.g = color1.g + color2.g; + this.b = color1.b + color2.b; + + return this; + + }, + + addScalar: function ( s ) { + + this.r += s; + this.g += s; + this.b += s; + + return this; + + }, + + sub: function ( color ) { + + this.r = Math.max( 0, this.r - color.r ); + this.g = Math.max( 0, this.g - color.g ); + this.b = Math.max( 0, this.b - color.b ); + + return this; + + }, + + multiply: function ( color ) { + + this.r *= color.r; + this.g *= color.g; + this.b *= color.b; + + return this; + + }, + + multiplyScalar: function ( s ) { + + this.r *= s; + this.g *= s; + this.b *= s; + + return this; + + }, + + lerp: function ( color, alpha ) { + + this.r += ( color.r - this.r ) * alpha; + this.g += ( color.g - this.g ) * alpha; + this.b += ( color.b - this.b ) * alpha; + + return this; + + }, + + equals: function ( c ) { + + return ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.r = array[ offset ]; + this.g = array[ offset + 1 ]; + this.b = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.r; + array[ offset + 1 ] = this.g; + array[ offset + 2 ] = this.b; + + return array; + + }, + + toJSON: function () { + + return this.getHex(); + + } + + } ); + + /** + * Uniforms library for shared webgl shaders + */ + + var UniformsLib = { + + common: { + + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + + map: { value: null }, + uvTransform: { value: new Matrix3() }, + + alphaMap: { value: null }, + + }, + + specularmap: { + + specularMap: { value: null }, + + }, + + envmap: { + + envMap: { value: null }, + flipEnvMap: { value: - 1 }, + reflectivity: { value: 1.0 }, + refractionRatio: { value: 0.98 }, + maxMipLevel: { value: 0 } + + }, + + aomap: { + + aoMap: { value: null }, + aoMapIntensity: { value: 1 } + + }, + + lightmap: { + + lightMap: { value: null }, + lightMapIntensity: { value: 1 } + + }, + + emissivemap: { + + emissiveMap: { value: null } + + }, + + bumpmap: { + + bumpMap: { value: null }, + bumpScale: { value: 1 } + + }, + + normalmap: { + + normalMap: { value: null }, + normalScale: { value: new Vector2( 1, 1 ) } + + }, + + displacementmap: { + + displacementMap: { value: null }, + displacementScale: { value: 1 }, + displacementBias: { value: 0 } + + }, + + roughnessmap: { + + roughnessMap: { value: null } + + }, + + metalnessmap: { + + metalnessMap: { value: null } + + }, + + gradientmap: { + + gradientMap: { value: null } + + }, + + fog: { + + fogDensity: { value: 0.00025 }, + fogNear: { value: 1 }, + fogFar: { value: 2000 }, + fogColor: { value: new Color( 0xffffff ) } + + }, + + lights: { + + ambientLightColor: { value: [] }, + + directionalLights: { value: [], properties: { + direction: {}, + color: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + directionalShadowMap: { value: [] }, + directionalShadowMatrix: { value: [] }, + + spotLights: { value: [], properties: { + color: {}, + position: {}, + direction: {}, + distance: {}, + coneCos: {}, + penumbraCos: {}, + decay: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + spotShadowMap: { value: [] }, + spotShadowMatrix: { value: [] }, + + pointLights: { value: [], properties: { + color: {}, + position: {}, + decay: {}, + distance: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {}, + shadowCameraNear: {}, + shadowCameraFar: {} + } }, + + pointShadowMap: { value: [] }, + pointShadowMatrix: { value: [] }, + + hemisphereLights: { value: [], properties: { + direction: {}, + skyColor: {}, + groundColor: {} + } }, + + // TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src + rectAreaLights: { value: [], properties: { + color: {}, + position: {}, + width: {}, + height: {} + } } + + }, + + points: { + + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + size: { value: 1.0 }, + scale: { value: 1.0 }, + map: { value: null }, + uvTransform: { value: new Matrix3() } + + } + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + */ + + var ShaderLib = { + + basic: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.meshbasic_vert, + fragmentShader: ShaderChunk.meshbasic_frag + + }, + + lambert: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) } + } + ] ), + + vertexShader: ShaderChunk.meshlambert_vert, + fragmentShader: ShaderChunk.meshlambert_frag + + }, + + phong: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.gradientmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) }, + specular: { value: new Color( 0x111111 ) }, + shininess: { value: 30 } + } + ] ), + + vertexShader: ShaderChunk.meshphong_vert, + fragmentShader: ShaderChunk.meshphong_frag + + }, + + standard: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.roughnessmap, + UniformsLib.metalnessmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color( 0x000000 ) }, + roughness: { value: 0.5 }, + metalness: { value: 0.5 }, + envMapIntensity: { value: 1 } // temporary + } + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + + }, + + points: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.points, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.points_vert, + fragmentShader: ShaderChunk.points_frag + + }, + + dashed: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.fog, + { + scale: { value: 1 }, + dashSize: { value: 1 }, + totalSize: { value: 2 } + } + ] ), + + vertexShader: ShaderChunk.linedashed_vert, + fragmentShader: ShaderChunk.linedashed_frag + + }, + + depth: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.displacementmap + ] ), + + vertexShader: ShaderChunk.depth_vert, + fragmentShader: ShaderChunk.depth_frag + + }, + + normal: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + { + opacity: { value: 1.0 } + } + ] ), + + vertexShader: ShaderChunk.normal_vert, + fragmentShader: ShaderChunk.normal_frag + + }, + + /* ------------------------------------------------------------------------- + // Cube map shader + ------------------------------------------------------------------------- */ + + cube: { + + uniforms: { + tCube: { value: null }, + tFlip: { value: - 1 }, + opacity: { value: 1.0 } + }, + + vertexShader: ShaderChunk.cube_vert, + fragmentShader: ShaderChunk.cube_frag + + }, + + equirect: { + + uniforms: { + tEquirect: { value: null }, + }, + + vertexShader: ShaderChunk.equirect_vert, + fragmentShader: ShaderChunk.equirect_frag + + }, + + distanceRGBA: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.common, + UniformsLib.displacementmap, + { + referencePosition: { value: new Vector3() }, + nearDistance: { value: 1 }, + farDistance: { value: 1000 } + } + ] ), + + vertexShader: ShaderChunk.distanceRGBA_vert, + fragmentShader: ShaderChunk.distanceRGBA_frag + + }, + + shadow: { + + uniforms: UniformsUtils.merge( [ + UniformsLib.lights, + UniformsLib.fog, + { + color: { value: new Color( 0x00000 ) }, + opacity: { value: 1.0 } + }, + ] ), + + vertexShader: ShaderChunk.shadow_vert, + fragmentShader: ShaderChunk.shadow_frag + + } + + }; + + ShaderLib.physical = { + + uniforms: UniformsUtils.merge( [ + ShaderLib.standard.uniforms, + { + clearCoat: { value: 0 }, + clearCoatRoughness: { value: 0 } + } + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLAttributes( gl ) { + + var buffers = new WeakMap(); + + function createBuffer( attribute, bufferType ) { + + var array = attribute.array; + var usage = attribute.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW; + + var buffer = gl.createBuffer(); + + gl.bindBuffer( bufferType, buffer ); + gl.bufferData( bufferType, array, usage ); + + attribute.onUploadCallback(); + + var type = gl.FLOAT; + + if ( array instanceof Float32Array ) { + + type = gl.FLOAT; + + } else if ( array instanceof Float64Array ) { + + console.warn( 'THREE.WebGLAttributes: 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; + + } + + return { + buffer: buffer, + type: type, + bytesPerElement: array.BYTES_PER_ELEMENT, + version: attribute.version + }; + + } + + function updateBuffer( buffer, attribute, bufferType ) { + + var array = attribute.array; + var updateRange = attribute.updateRange; + + gl.bindBuffer( bufferType, buffer ); + + if ( attribute.dynamic === false ) { + + gl.bufferData( bufferType, array, gl.STATIC_DRAW ); + + } else if ( updateRange.count === - 1 ) { + + // Not using update ranges + + gl.bufferSubData( bufferType, 0, array ); + + } else if ( updateRange.count === 0 ) { + + console.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' ); + + } else { + + gl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT, + array.subarray( updateRange.offset, updateRange.offset + updateRange.count ) ); + + updateRange.count = - 1; // reset range + + } + + } + + // + + function get( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + return buffers.get( attribute ); + + } + + function remove( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + var data = buffers.get( attribute ); + + if ( data ) { + + gl.deleteBuffer( data.buffer ); + + buffers.delete( attribute ); + + } + + } + + function update( attribute, bufferType ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + var data = buffers.get( attribute ); + + if ( data === undefined ) { + + buffers.set( attribute, createBuffer( attribute, bufferType ) ); + + } else if ( data.version < attribute.version ) { + + updateBuffer( data.buffer, attribute, bufferType ); + + data.version = attribute.version; + + } + + } + + return { + + get: get, + remove: remove, + update: update + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + + function Euler( x, y, z, order ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._order = order || Euler.DefaultOrder; + + } + + Euler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ]; + + Euler.DefaultOrder = 'XYZ'; + + Object.defineProperties( Euler.prototype, { + + x: { + + get: function () { + + return this._x; + + }, + + set: function ( value ) { + + this._x = value; + this.onChangeCallback(); + + } + + }, + + y: { + + get: function () { + + return this._y; + + }, + + set: function ( value ) { + + this._y = value; + this.onChangeCallback(); + + } + + }, + + z: { + + get: function () { + + return this._z; + + }, + + set: function ( value ) { + + this._z = value; + this.onChangeCallback(); + + } + + }, + + order: { + + get: function () { + + return this._order; + + }, + + set: function ( value ) { + + this._order = value; + this.onChangeCallback(); + + } + + } + + } ); + + Object.assign( Euler.prototype, { + + isEuler: true, + + set: function ( x, y, z, order ) { + + this._x = x; + this._y = y; + this._z = z; + this._order = order || this._order; + + this.onChangeCallback(); + + return this; + + }, + + clone: function () { + + return new this.constructor( this._x, this._y, this._z, this._order ); + + }, + + copy: function ( euler ) { + + this._x = euler._x; + this._y = euler._y; + this._z = euler._z; + this._order = euler._order; + + this.onChangeCallback(); + + return this; + + }, + + setFromRotationMatrix: function ( m, order, update ) { + + var clamp = _Math.clamp; + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements; + var m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ]; + var m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ]; + var m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + order = order || this._order; + + if ( order === 'XYZ' ) { + + this._y = Math.asin( 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( - 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( 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( - 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( 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( - 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( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order ); + + } + + this._order = order; + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromQuaternion: function () { + + var matrix = new Matrix4(); + + return function setFromQuaternion( q, order, update ) { + + matrix.makeRotationFromQuaternion( q ); + + return this.setFromRotationMatrix( matrix, order, update ); + + }; + + }(), + + setFromVector3: function ( v, order ) { + + return this.set( v.x, v.y, v.z, order || this._order ); + + }, + + reorder: function () { + + // WARNING: this discards revolution information -bhouston + + var q = new Quaternion(); + + return function reorder( newOrder ) { + + q.setFromEuler( this ); + + return this.setFromQuaternion( q, newOrder ); + + }; + + }(), + + equals: function ( euler ) { + + return ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order ); + + }, + + fromArray: function ( array ) { + + this._x = array[ 0 ]; + this._y = array[ 1 ]; + this._z = array[ 2 ]; + if ( array[ 3 ] !== undefined ) this._order = array[ 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._order; + + return array; + + }, + + toVector3: function ( optionalResult ) { + + if ( optionalResult ) { + + return optionalResult.set( this._x, this._y, this._z ); + + } else { + + return new Vector3( this._x, this._y, this._z ); + + } + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {} + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Layers() { + + this.mask = 1 | 0; + + } + + Object.assign( Layers.prototype, { + + set: function ( channel ) { + + this.mask = 1 << channel | 0; + + }, + + enable: function ( channel ) { + + this.mask |= 1 << channel | 0; + + }, + + toggle: function ( channel ) { + + this.mask ^= 1 << channel | 0; + + }, + + disable: function ( channel ) { + + this.mask &= ~ ( 1 << channel | 0 ); + + }, + + test: function ( layers ) { + + return ( this.mask & layers.mask ) !== 0; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author elephantatwork / www.elephantatwork.ch + */ + + var object3DId = 0; + + function Object3D() { + + Object.defineProperty( this, 'id', { value: object3DId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Object3D'; + + this.parent = null; + this.children = []; + + this.up = Object3D.DefaultUp.clone(); + + var position = new Vector3(); + var rotation = new Euler(); + var quaternion = new Quaternion(); + var scale = new Vector3( 1, 1, 1 ); + + function onRotationChange() { + + quaternion.setFromEuler( rotation, false ); + + } + + function onQuaternionChange() { + + rotation.setFromQuaternion( quaternion, undefined, false ); + + } + + rotation.onChange( onRotationChange ); + quaternion.onChange( onQuaternionChange ); + + Object.defineProperties( this, { + position: { + enumerable: true, + value: position + }, + rotation: { + enumerable: true, + value: rotation + }, + quaternion: { + enumerable: true, + value: quaternion + }, + scale: { + enumerable: true, + value: scale + }, + modelViewMatrix: { + value: new Matrix4() + }, + normalMatrix: { + value: new Matrix3() + } + } ); + + this.matrix = new Matrix4(); + this.matrixWorld = new Matrix4(); + + this.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate; + this.matrixWorldNeedsUpdate = false; + + this.layers = new Layers(); + this.visible = true; + + this.castShadow = false; + this.receiveShadow = false; + + this.frustumCulled = true; + this.renderOrder = 0; + + this.userData = {}; + + } + + Object3D.DefaultUp = new Vector3( 0, 1, 0 ); + Object3D.DefaultMatrixAutoUpdate = true; + + Object3D.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: Object3D, + + isObject3D: true, + + onBeforeRender: function () {}, + onAfterRender: function () {}, + + applyMatrix: function ( matrix ) { + + this.matrix.multiplyMatrices( matrix, this.matrix ); + + this.matrix.decompose( this.position, this.quaternion, this.scale ); + + }, + + applyQuaternion: function ( q ) { + + this.quaternion.premultiply( q ); + + return this; + + }, + + setRotationFromAxisAngle: function ( axis, angle ) { + + // assumes axis is normalized + + this.quaternion.setFromAxisAngle( axis, angle ); + + }, + + setRotationFromEuler: function ( euler ) { + + this.quaternion.setFromEuler( euler, true ); + + }, + + setRotationFromMatrix: function ( m ) { + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + this.quaternion.setFromRotationMatrix( m ); + + }, + + setRotationFromQuaternion: function ( q ) { + + // assumes q is normalized + + this.quaternion.copy( q ); + + }, + + rotateOnAxis: function () { + + // rotate object on axis in object space + // axis is assumed to be normalized + + var q1 = new Quaternion(); + + return function rotateOnAxis( axis, angle ) { + + q1.setFromAxisAngle( axis, angle ); + + this.quaternion.multiply( q1 ); + + return this; + + }; + + }(), + + rotateOnWorldAxis: function () { + + // rotate object on axis in world space + // axis is assumed to be normalized + // method assumes no rotated parent + + var q1 = new Quaternion(); + + return function rotateOnWorldAxis( axis, angle ) { + + q1.setFromAxisAngle( axis, angle ); + + this.quaternion.premultiply( q1 ); + + return this; + + }; + + }(), + + rotateX: function () { + + var v1 = new Vector3( 1, 0, 0 ); + + return function rotateX( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + rotateY: function () { + + var v1 = new Vector3( 0, 1, 0 ); + + return function rotateY( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + rotateZ: function () { + + var v1 = new Vector3( 0, 0, 1 ); + + return function rotateZ( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + translateOnAxis: function () { + + // translate object by distance along axis in object space + // axis is assumed to be normalized + + var v1 = new Vector3(); + + return function translateOnAxis( axis, distance ) { + + v1.copy( axis ).applyQuaternion( this.quaternion ); + + this.position.add( v1.multiplyScalar( distance ) ); + + return this; + + }; + + }(), + + translateX: function () { + + var v1 = new Vector3( 1, 0, 0 ); + + return function translateX( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + translateY: function () { + + var v1 = new Vector3( 0, 1, 0 ); + + return function translateY( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + translateZ: function () { + + var v1 = new Vector3( 0, 0, 1 ); + + return function translateZ( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + localToWorld: function ( vector ) { + + return vector.applyMatrix4( this.matrixWorld ); + + }, + + worldToLocal: function () { + + var m1 = new Matrix4(); + + return function worldToLocal( vector ) { + + return vector.applyMatrix4( m1.getInverse( this.matrixWorld ) ); + + }; + + }(), + + lookAt: function () { + + // This method does not support objects with rotated and/or translated parent(s) + + var m1 = new Matrix4(); + var vector = new Vector3(); + + return function lookAt( x, y, z ) { + + if ( x.isVector3 ) { + + vector.copy( x ); + + } else { + + vector.set( x, y, z ); + + } + + if ( this.isCamera ) { + + m1.lookAt( this.position, vector, this.up ); + + } else { + + m1.lookAt( vector, this.position, this.up ); + + } + + this.quaternion.setFromRotationMatrix( m1 ); + + }; + + }(), + + add: function ( object ) { + + if ( arguments.length > 1 ) { + + for ( var i = 0; i < arguments.length; i ++ ) { + + this.add( arguments[ i ] ); + + } + + return this; + + } + + if ( object === this ) { + + console.error( "THREE.Object3D.add: object can't be added as a child of itself.", object ); + return this; + + } + + if ( ( object && object.isObject3D ) ) { + + if ( object.parent !== null ) { + + object.parent.remove( object ); + + } + + object.parent = this; + object.dispatchEvent( { type: 'added' } ); + + this.children.push( object ); + + } else { + + console.error( "THREE.Object3D.add: object not an instance of THREE.Object3D.", object ); + + } + + return this; + + }, + + remove: function ( object ) { + + if ( arguments.length > 1 ) { + + for ( var i = 0; i < arguments.length; i ++ ) { + + this.remove( arguments[ i ] ); + + } + + return this; + + } + + var index = this.children.indexOf( object ); + + if ( index !== - 1 ) { + + object.parent = null; + + object.dispatchEvent( { type: 'removed' } ); + + this.children.splice( index, 1 ); + + } + + return this; + + }, + + getObjectById: function ( id ) { + + return this.getObjectByProperty( 'id', id ); + + }, + + getObjectByName: function ( name ) { + + return this.getObjectByProperty( 'name', name ); + + }, + + getObjectByProperty: function ( name, value ) { + + if ( this[ name ] === value ) return this; + + for ( var i = 0, l = this.children.length; i < l; i ++ ) { + + var child = this.children[ i ]; + var object = child.getObjectByProperty( name, value ); + + if ( object !== undefined ) { + + return object; + + } + + } + + return undefined; + + }, + + getWorldPosition: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Object3D: .getWorldPosition() target is now required' ); + target = new Vector3(); + + } + + this.updateMatrixWorld( true ); + + return target.setFromMatrixPosition( this.matrixWorld ); + + }, + + getWorldQuaternion: function () { + + var position = new Vector3(); + var scale = new Vector3(); + + return function getWorldQuaternion( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Object3D: .getWorldQuaternion() target is now required' ); + target = new Quaternion(); + + } + + this.updateMatrixWorld( true ); + + this.matrixWorld.decompose( position, target, scale ); + + return target; + + }; + + }(), + + getWorldScale: function () { + + var position = new Vector3(); + var quaternion = new Quaternion(); + + return function getWorldScale( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Object3D: .getWorldScale() target is now required' ); + target = new Vector3(); + + } + + this.updateMatrixWorld( true ); + + this.matrixWorld.decompose( position, quaternion, target ); + + return target; + + }; + + }(), + + getWorldDirection: function () { + + var quaternion = new Quaternion(); + + return function getWorldDirection( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Object3D: .getWorldDirection() target is now required' ); + target = new Vector3(); + + } + + this.getWorldQuaternion( quaternion ); + + return target.set( 0, 0, 1 ).applyQuaternion( quaternion ); + + }; + + }(), + + raycast: function () {}, + + traverse: function ( callback ) { + + callback( this ); + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverse( callback ); + + } + + }, + + traverseVisible: function ( callback ) { + + if ( this.visible === false ) return; + + callback( this ); + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverseVisible( callback ); + + } + + }, + + traverseAncestors: function ( callback ) { + + var parent = this.parent; + + if ( parent !== null ) { + + callback( parent ); + + parent.traverseAncestors( callback ); + + } + + }, + + updateMatrix: function () { + + this.matrix.compose( this.position, this.quaternion, this.scale ); + + this.matrixWorldNeedsUpdate = true; + + }, + + updateMatrixWorld: function ( force ) { + + if ( this.matrixAutoUpdate ) this.updateMatrix(); + + if ( this.matrixWorldNeedsUpdate || force ) { + + if ( this.parent === null ) { + + this.matrixWorld.copy( this.matrix ); + + } else { + + this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); + + } + + this.matrixWorldNeedsUpdate = false; + + force = true; + + } + + // update children + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].updateMatrixWorld( force ); + + } + + }, + + toJSON: function ( meta ) { + + // meta is a string when called from JSON.stringify + var isRootObject = ( meta === undefined || typeof meta === 'string' ); + + var output = {}; + + // meta is a hash used to collect geometries, materials. + // not providing it implies that this is the root object + // being serialized. + if ( isRootObject ) { + + // initialize meta obj + meta = { + geometries: {}, + materials: {}, + textures: {}, + images: {}, + shapes: {} + }; + + output.metadata = { + version: 4.5, + type: 'Object', + generator: 'Object3D.toJSON' + }; + + } + + // standard Object3D serialization + + var object = {}; + + object.uuid = this.uuid; + object.type = this.type; + + if ( this.name !== '' ) object.name = this.name; + if ( this.castShadow === true ) object.castShadow = true; + if ( this.receiveShadow === true ) object.receiveShadow = true; + if ( this.visible === false ) object.visible = false; + if ( this.frustumCulled === false ) object.frustumCulled = false; + if ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder; + if ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData; + + object.matrix = this.matrix.toArray(); + + if ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false; + + // + + function serialize( library, element ) { + + if ( library[ element.uuid ] === undefined ) { + + library[ element.uuid ] = element.toJSON( meta ); + + } + + return element.uuid; + + } + + if ( this.geometry !== undefined ) { + + object.geometry = serialize( meta.geometries, this.geometry ); + + var parameters = this.geometry.parameters; + + if ( parameters !== undefined && parameters.shapes !== undefined ) { + + var shapes = parameters.shapes; + + if ( Array.isArray( shapes ) ) { + + for ( var i = 0, l = shapes.length; i < l; i ++ ) { + + var shape = shapes[ i ]; + + serialize( meta.shapes, shape ); + + } + + } else { + + serialize( meta.shapes, shapes ); + + } + + } + + } + + if ( this.material !== undefined ) { + + if ( Array.isArray( this.material ) ) { + + var uuids = []; + + for ( var i = 0, l = this.material.length; i < l; i ++ ) { + + uuids.push( serialize( meta.materials, this.material[ i ] ) ); + + } + + object.material = uuids; + + } else { + + object.material = serialize( meta.materials, this.material ); + + } + + } + + // + + if ( this.children.length > 0 ) { + + object.children = []; + + for ( var i = 0; i < this.children.length; i ++ ) { + + object.children.push( this.children[ i ].toJSON( meta ).object ); + + } + + } + + if ( isRootObject ) { + + var geometries = extractFromCache( meta.geometries ); + var materials = extractFromCache( meta.materials ); + var textures = extractFromCache( meta.textures ); + var images = extractFromCache( meta.images ); + var shapes = extractFromCache( meta.shapes ); + + if ( geometries.length > 0 ) output.geometries = geometries; + if ( materials.length > 0 ) output.materials = materials; + if ( textures.length > 0 ) output.textures = textures; + if ( images.length > 0 ) output.images = images; + if ( shapes.length > 0 ) output.shapes = shapes; + + } + + output.object = object; + + return output; + + // extract data from the cache hash + // remove metadata on each item + // and return as array + function extractFromCache( cache ) { + + var values = []; + for ( var key in cache ) { + + var data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + return values; + + } + + }, + + clone: function ( recursive ) { + + return new this.constructor().copy( this, recursive ); + + }, + + copy: function ( source, recursive ) { + + if ( recursive === undefined ) recursive = true; + + this.name = source.name; + + this.up.copy( source.up ); + + this.position.copy( source.position ); + this.quaternion.copy( source.quaternion ); + this.scale.copy( source.scale ); + + this.matrix.copy( source.matrix ); + this.matrixWorld.copy( source.matrixWorld ); + + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate; + + this.layers.mask = source.layers.mask; + this.visible = source.visible; + + this.castShadow = source.castShadow; + this.receiveShadow = source.receiveShadow; + + this.frustumCulled = source.frustumCulled; + this.renderOrder = source.renderOrder; + + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + if ( recursive === true ) { + + for ( var i = 0; i < source.children.length; i ++ ) { + + var child = source.children[ i ]; + this.add( child.clone() ); + + } + + } + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Camera() { + + Object3D.call( this ); + + this.type = 'Camera'; + + this.matrixWorldInverse = new Matrix4(); + this.projectionMatrix = new Matrix4(); + + } + + Camera.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Camera, + + isCamera: true, + + copy: function ( source, recursive ) { + + Object3D.prototype.copy.call( this, source, recursive ); + + this.matrixWorldInverse.copy( source.matrixWorldInverse ); + this.projectionMatrix.copy( source.projectionMatrix ); + + return this; + + }, + + getWorldDirection: function () { + + var quaternion = new Quaternion(); + + return function getWorldDirection( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Camera: .getWorldDirection() target is now required' ); + target = new Vector3(); + + } + + this.getWorldQuaternion( quaternion ); + + return target.set( 0, 0, - 1 ).applyQuaternion( quaternion ); + + }; + + }(), + + updateMatrixWorld: function ( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + this.matrixWorldInverse.getInverse( this.matrixWorld ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author arose / http://github.com/arose + */ + + function OrthographicCamera( left, right, top, bottom, near, far ) { + + Camera.call( this ); + + this.type = 'OrthographicCamera'; + + this.zoom = 1; + this.view = null; + + this.left = left; + this.right = right; + this.top = top; + this.bottom = bottom; + + this.near = ( near !== undefined ) ? near : 0.1; + this.far = ( far !== undefined ) ? far : 2000; + + this.updateProjectionMatrix(); + + } + + OrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), { + + constructor: OrthographicCamera, + + isOrthographicCamera: true, + + copy: function ( source, recursive ) { + + Camera.prototype.copy.call( this, source, recursive ); + + 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.zoom = source.zoom; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + return this; + + }, + + setViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) { + + if ( this.view === null ) { + + this.view = { + enabled: true, + fullWidth: 1, + fullHeight: 1, + offsetX: 0, + offsetY: 0, + width: 1, + height: 1 + }; + + } + + this.view.enabled = true; + this.view.fullWidth = fullWidth; + this.view.fullHeight = fullHeight; + this.view.offsetX = x; + this.view.offsetY = y; + this.view.width = width; + this.view.height = height; + + this.updateProjectionMatrix(); + + }, + + clearViewOffset: function () { + + if ( this.view !== null ) { + + this.view.enabled = false; + + } + + this.updateProjectionMatrix(); + + }, + + updateProjectionMatrix: function () { + + var dx = ( this.right - this.left ) / ( 2 * this.zoom ); + var dy = ( this.top - this.bottom ) / ( 2 * this.zoom ); + var cx = ( this.right + this.left ) / 2; + var cy = ( this.top + this.bottom ) / 2; + + var left = cx - dx; + var right = cx + dx; + var top = cy + dy; + var bottom = cy - dy; + + if ( this.view !== null && this.view.enabled ) { + + var zoomW = this.zoom / ( this.view.width / this.view.fullWidth ); + var zoomH = this.zoom / ( this.view.height / this.view.fullHeight ); + var scaleW = ( this.right - this.left ) / this.view.width; + var scaleH = ( this.top - this.bottom ) / this.view.height; + + left += scaleW * ( this.view.offsetX / zoomW ); + right = left + scaleW * ( this.view.width / zoomW ); + top -= scaleH * ( this.view.offsetY / zoomH ); + bottom = top - scaleH * ( this.view.height / zoomH ); + + } + + this.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far ); + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.zoom = this.zoom; + data.object.left = this.left; + data.object.right = this.right; + data.object.top = this.top; + data.object.bottom = this.bottom; + data.object.near = this.near; + data.object.far = this.far; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + return data; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Face3( a, b, c, normal, color, materialIndex ) { + + this.a = a; + this.b = b; + this.c = c; + + this.normal = ( normal && normal.isVector3 ) ? normal : new Vector3(); + this.vertexNormals = Array.isArray( normal ) ? normal : []; + + this.color = ( color && color.isColor ) ? color : new Color(); + this.vertexColors = Array.isArray( color ) ? color : []; + + this.materialIndex = materialIndex !== undefined ? materialIndex : 0; + + } + + Object.assign( Face3.prototype, { + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( 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; + + for ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) { + + this.vertexNormals[ i ] = source.vertexNormals[ i ].clone(); + + } + + for ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) { + + this.vertexColors[ i ] = source.vertexColors[ i ].clone(); + + } + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author kile / http://kile.stravaganza.org/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author bhouston / http://clara.io + */ + + var geometryId = 0; // Geometry uses even numbers as Id + + function Geometry() { + + Object.defineProperty( this, 'id', { value: geometryId += 2 } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Geometry'; + + this.vertices = []; + this.colors = []; + this.faces = []; + this.faceVertexUvs = [[]]; + + this.morphTargets = []; + this.morphNormals = []; + + this.skinWeights = []; + this.skinIndices = []; + + this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.elementsNeedUpdate = false; + this.verticesNeedUpdate = false; + this.uvsNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.lineDistancesNeedUpdate = false; + this.groupsNeedUpdate = false; + + } + + Geometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: Geometry, + + isGeometry: true, + + applyMatrix: function ( matrix ) { + + var normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + for ( var i = 0, il = this.vertices.length; i < il; i ++ ) { + + var vertex = this.vertices[ i ]; + vertex.applyMatrix4( matrix ); + + } + + for ( var i = 0, il = this.faces.length; i < il; i ++ ) { + + var face = this.faces[ i ]; + face.normal.applyMatrix3( normalMatrix ).normalize(); + + for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + face.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize(); + + } + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + this.verticesNeedUpdate = true; + this.normalsNeedUpdate = true; + + return this; + + }, + + rotateX: function () { + + // rotate geometry around world x-axis + + var m1 = new Matrix4(); + + return function rotateX( angle ) { + + m1.makeRotationX( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateY: function () { + + // rotate geometry around world y-axis + + var m1 = new Matrix4(); + + return function rotateY( angle ) { + + m1.makeRotationY( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateZ: function () { + + // rotate geometry around world z-axis + + var m1 = new Matrix4(); + + return function rotateZ( angle ) { + + m1.makeRotationZ( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + translate: function () { + + // translate geometry + + var m1 = new Matrix4(); + + return function translate( x, y, z ) { + + m1.makeTranslation( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + scale: function () { + + // scale geometry + + var m1 = new Matrix4(); + + return function scale( x, y, z ) { + + m1.makeScale( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + lookAt: function () { + + var obj = new Object3D(); + + return function lookAt( vector ) { + + obj.lookAt( vector ); + + obj.updateMatrix(); + + this.applyMatrix( obj.matrix ); + + }; + + }(), + + fromBufferGeometry: function ( geometry ) { + + var scope = this; + + var indices = geometry.index !== null ? geometry.index.array : undefined; + var attributes = geometry.attributes; + + var positions = attributes.position.array; + var normals = attributes.normal !== undefined ? attributes.normal.array : undefined; + var colors = attributes.color !== undefined ? attributes.color.array : undefined; + var uvs = attributes.uv !== undefined ? attributes.uv.array : undefined; + var uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined; + + if ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = []; + + var tempNormals = []; + var tempUVs = []; + var tempUVs2 = []; + + for ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) { + + scope.vertices.push( new Vector3( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) ); + + if ( normals !== undefined ) { + + tempNormals.push( new Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) ); + + } + + if ( colors !== undefined ) { + + scope.colors.push( new Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) ); + + } + + if ( uvs !== undefined ) { + + tempUVs.push( new Vector2( uvs[ j ], uvs[ j + 1 ] ) ); + + } + + if ( uvs2 !== undefined ) { + + tempUVs2.push( new Vector2( uvs2[ j ], uvs2[ j + 1 ] ) ); + + } + + } + + function addFace( a, b, c, materialIndex ) { + + var vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : []; + var vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : []; + + var face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex ); + + scope.faces.push( face ); + + if ( uvs !== undefined ) { + + scope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] ); + + } + + if ( uvs2 !== undefined ) { + + scope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] ); + + } + + } + + var groups = geometry.groups; + + if ( groups.length > 0 ) { + + for ( var i = 0; i < groups.length; i ++ ) { + + var group = groups[ i ]; + + var start = group.start; + var count = group.count; + + for ( var j = start, jl = start + count; j < jl; j += 3 ) { + + if ( indices !== undefined ) { + + addFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex ); + + } else { + + addFace( j, j + 1, j + 2, group.materialIndex ); + + } + + } + + } + + } else { + + if ( indices !== undefined ) { + + for ( var i = 0; i < indices.length; i += 3 ) { + + addFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] ); + + } + + } else { + + for ( var i = 0; i < positions.length / 3; i += 3 ) { + + addFace( i, i + 1, i + 2 ); + + } + + } + + } + + this.computeFaceNormals(); + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + return this; + + }, + + center: function () { + + var offset = new Vector3(); + + return function center() { + + this.computeBoundingBox(); + + this.boundingBox.getCenter( offset ).negate(); + + this.translate( offset.x, offset.y, offset.z ); + + return this; + + }; + + }(), + + normalize: function () { + + this.computeBoundingSphere(); + + var center = this.boundingSphere.center; + var radius = this.boundingSphere.radius; + + var s = radius === 0 ? 1 : 1.0 / radius; + + var matrix = new Matrix4(); + matrix.set( + s, 0, 0, - s * center.x, + 0, s, 0, - s * center.y, + 0, 0, s, - s * center.z, + 0, 0, 0, 1 + ); + + this.applyMatrix( matrix ); + + return this; + + }, + + computeFaceNormals: function () { + + var cb = new Vector3(), ab = new Vector3(); + + for ( var f = 0, fl = this.faces.length; f < fl; f ++ ) { + + var face = this.faces[ f ]; + + var vA = this.vertices[ face.a ]; + var vB = this.vertices[ face.b ]; + var vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + cb.normalize(); + + face.normal.copy( cb ); + + } + + }, + + computeVertexNormals: function ( areaWeighted ) { + + if ( areaWeighted === undefined ) areaWeighted = true; + + var v, vl, f, fl, face, vertices; + + vertices = new Array( this.vertices.length ); + + for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ] = new Vector3(); + + } + + if ( areaWeighted ) { + + // vertex normals weighted by triangle areas + // http://www.iquilezles.org/www/articles/normals/normals.htm + + var vA, vB, vC; + var cb = new Vector3(), ab = new Vector3(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + vA = this.vertices[ face.a ]; + vB = this.vertices[ face.b ]; + vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + vertices[ face.a ].add( cb ); + vertices[ face.b ].add( cb ); + vertices[ face.c ].add( cb ); + + } + + } else { + + this.computeFaceNormals(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + vertices[ face.a ].add( face.normal ); + vertices[ face.b ].add( face.normal ); + vertices[ face.c ].add( face.normal ); + + } + + } + + for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ].normalize(); + + } + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + vertexNormals[ 0 ].copy( vertices[ face.a ] ); + vertexNormals[ 1 ].copy( vertices[ face.b ] ); + vertexNormals[ 2 ].copy( vertices[ face.c ] ); + + } else { + + vertexNormals[ 0 ] = vertices[ face.a ].clone(); + vertexNormals[ 1 ] = vertices[ face.b ].clone(); + vertexNormals[ 2 ] = vertices[ face.c ].clone(); + + } + + } + + if ( this.faces.length > 0 ) { + + this.normalsNeedUpdate = true; + + } + + }, + + computeFlatVertexNormals: function () { + + var f, fl, face; + + this.computeFaceNormals(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + vertexNormals[ 0 ].copy( face.normal ); + vertexNormals[ 1 ].copy( face.normal ); + vertexNormals[ 2 ].copy( face.normal ); + + } else { + + vertexNormals[ 0 ] = face.normal.clone(); + vertexNormals[ 1 ] = face.normal.clone(); + vertexNormals[ 2 ] = face.normal.clone(); + + } + + } + + if ( this.faces.length > 0 ) { + + this.normalsNeedUpdate = true; + + } + + }, + + computeMorphNormals: function () { + + var i, il, f, fl, face; + + // save original normals + // - create temp variables on first access + // otherwise just copy (for faster repeated calls) + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + if ( ! face.__originalFaceNormal ) { + + face.__originalFaceNormal = face.normal.clone(); + + } else { + + face.__originalFaceNormal.copy( face.normal ); + + } + + if ( ! face.__originalVertexNormals ) face.__originalVertexNormals = []; + + for ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) { + + if ( ! face.__originalVertexNormals[ i ] ) { + + face.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone(); + + } else { + + face.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] ); + + } + + } + + } + + // use temp geometry to compute face and vertex normals for each morph + + var tmpGeo = new Geometry(); + tmpGeo.faces = this.faces; + + for ( i = 0, il = this.morphTargets.length; i < il; i ++ ) { + + // create on first access + + if ( ! this.morphNormals[ i ] ) { + + this.morphNormals[ i ] = {}; + this.morphNormals[ i ].faceNormals = []; + this.morphNormals[ i ].vertexNormals = []; + + var dstNormalsFace = this.morphNormals[ i ].faceNormals; + var dstNormalsVertex = this.morphNormals[ i ].vertexNormals; + + var faceNormal, vertexNormals; + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + faceNormal = new Vector3(); + vertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() }; + + dstNormalsFace.push( faceNormal ); + dstNormalsVertex.push( vertexNormals ); + + } + + } + + var morphNormals = this.morphNormals[ i ]; + + // set vertices to morph target + + tmpGeo.vertices = this.morphTargets[ i ].vertices; + + // compute morph normals + + tmpGeo.computeFaceNormals(); + tmpGeo.computeVertexNormals(); + + // store morph normals + + var faceNormal, vertexNormals; + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + faceNormal = morphNormals.faceNormals[ f ]; + vertexNormals = morphNormals.vertexNormals[ f ]; + + faceNormal.copy( face.normal ); + + vertexNormals.a.copy( face.vertexNormals[ 0 ] ); + vertexNormals.b.copy( face.vertexNormals[ 1 ] ); + vertexNormals.c.copy( face.vertexNormals[ 2 ] ); + + } + + } + + // restore original normals + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + face.normal = face.__originalFaceNormal; + face.vertexNormals = face.__originalVertexNormals; + + } + + }, + + computeBoundingBox: function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + this.boundingBox.setFromPoints( this.vertices ); + + }, + + computeBoundingSphere: function () { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + this.boundingSphere.setFromPoints( this.vertices ); + + }, + + merge: function ( geometry, matrix, materialIndexOffset ) { + + if ( ! ( geometry && geometry.isGeometry ) ) { + + console.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry ); + return; + + } + + var normalMatrix, + vertexOffset = this.vertices.length, + vertices1 = this.vertices, + vertices2 = geometry.vertices, + faces1 = this.faces, + faces2 = geometry.faces, + uvs1 = this.faceVertexUvs[ 0 ], + uvs2 = geometry.faceVertexUvs[ 0 ], + colors1 = this.colors, + colors2 = geometry.colors; + + if ( materialIndexOffset === undefined ) materialIndexOffset = 0; + + if ( matrix !== undefined ) { + + normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + } + + // vertices + + for ( var i = 0, il = vertices2.length; i < il; i ++ ) { + + var vertex = vertices2[ i ]; + + var vertexCopy = vertex.clone(); + + if ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix ); + + vertices1.push( vertexCopy ); + + } + + // colors + + for ( var i = 0, il = colors2.length; i < il; i ++ ) { + + colors1.push( colors2[ i ].clone() ); + + } + + // faces + + for ( i = 0, il = faces2.length; i < il; i ++ ) { + + var face = faces2[ i ], faceCopy, normal, color, + faceVertexNormals = face.vertexNormals, + faceVertexColors = face.vertexColors; + + faceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset ); + faceCopy.normal.copy( face.normal ); + + if ( normalMatrix !== undefined ) { + + faceCopy.normal.applyMatrix3( normalMatrix ).normalize(); + + } + + for ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) { + + normal = faceVertexNormals[ j ].clone(); + + if ( normalMatrix !== undefined ) { + + normal.applyMatrix3( normalMatrix ).normalize(); + + } + + faceCopy.vertexNormals.push( normal ); + + } + + faceCopy.color.copy( face.color ); + + for ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) { + + color = faceVertexColors[ j ]; + faceCopy.vertexColors.push( color.clone() ); + + } + + faceCopy.materialIndex = face.materialIndex + materialIndexOffset; + + faces1.push( faceCopy ); + + } + + // uvs + + for ( i = 0, il = uvs2.length; i < il; i ++ ) { + + var uv = uvs2[ i ], uvCopy = []; + + if ( uv === undefined ) { + + continue; + + } + + for ( var j = 0, jl = uv.length; j < jl; j ++ ) { + + uvCopy.push( uv[ j ].clone() ); + + } + + uvs1.push( uvCopy ); + + } + + }, + + mergeMesh: function ( mesh ) { + + if ( ! ( mesh && mesh.isMesh ) ) { + + console.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh ); + return; + + } + + if ( mesh.matrixAutoUpdate ) mesh.updateMatrix(); + + this.merge( mesh.geometry, mesh.matrix ); + + }, + + /* + * Checks for duplicate vertices with hashmap. + * Duplicated vertices are removed + * and faces' vertices are updated. + */ + + mergeVertices: function () { + + var verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique) + var unique = [], changes = []; + + var v, key; + var precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001 + var precision = Math.pow( 10, precisionPoints ); + var i, il, face; + var 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. + var 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 ( var n = 0; n < 3; n ++ ) { + + if ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) { + + faceIndicesToRemove.push( i ); + break; + + } + + } + + } + + for ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) { + + var 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 + + var diff = this.vertices.length - unique.length; + this.vertices = unique; + return diff; + + }, + + setFromPoints: function ( points ) { + + this.vertices = []; + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + var point = points[ i ]; + this.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) ); + + } + + return this; + + }, + + sortFacesByMaterialIndex: function () { + + var faces = this.faces; + var length = faces.length; + + // tag faces + + for ( var i = 0; i < length; i ++ ) { + + faces[ i ]._id = i; + + } + + // sort faces + + function materialIndexSort( a, b ) { + + return a.materialIndex - b.materialIndex; + + } + + faces.sort( materialIndexSort ); + + // sort uvs + + var uvs1 = this.faceVertexUvs[ 0 ]; + var uvs2 = this.faceVertexUvs[ 1 ]; + + var newUvs1, newUvs2; + + if ( uvs1 && uvs1.length === length ) newUvs1 = []; + if ( uvs2 && uvs2.length === length ) newUvs2 = []; + + for ( var i = 0; i < length; i ++ ) { + + var id = faces[ i ]._id; + + if ( newUvs1 ) newUvs1.push( uvs1[ id ] ); + if ( newUvs2 ) newUvs2.push( uvs2[ id ] ); + + } + + if ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1; + if ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.5, + type: 'Geometry', + generator: 'Geometry.toJSON' + } + }; + + // standard Geometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + + if ( this.parameters !== undefined ) { + + var parameters = this.parameters; + + for ( var key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + var vertices = []; + + for ( var i = 0; i < this.vertices.length; i ++ ) { + + var vertex = this.vertices[ i ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + var faces = []; + var normals = []; + var normalsHash = {}; + var colors = []; + var colorsHash = {}; + var uvs = []; + var uvsHash = {}; + + for ( var i = 0; i < this.faces.length; i ++ ) { + + var face = this.faces[ i ]; + + var hasMaterial = true; + var hasFaceUv = false; // deprecated + var hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined; + var hasFaceNormal = face.normal.length() > 0; + var hasFaceVertexNormal = face.vertexNormals.length > 0; + var hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1; + var hasFaceVertexColor = face.vertexColors.length > 0; + + var faceType = 0; + + faceType = setBit( faceType, 0, 0 ); // isQuad + faceType = setBit( faceType, 1, hasMaterial ); + faceType = setBit( faceType, 2, hasFaceUv ); + faceType = setBit( faceType, 3, hasFaceVertexUv ); + faceType = setBit( faceType, 4, hasFaceNormal ); + faceType = setBit( faceType, 5, hasFaceVertexNormal ); + faceType = setBit( faceType, 6, hasFaceColor ); + faceType = setBit( faceType, 7, hasFaceVertexColor ); + + faces.push( faceType ); + faces.push( face.a, face.b, face.c ); + faces.push( face.materialIndex ); + + if ( hasFaceVertexUv ) { + + var faceVertexUvs = this.faceVertexUvs[ 0 ][ i ]; + + faces.push( + getUvIndex( faceVertexUvs[ 0 ] ), + getUvIndex( faceVertexUvs[ 1 ] ), + getUvIndex( faceVertexUvs[ 2 ] ) + ); + + } + + if ( hasFaceNormal ) { + + faces.push( getNormalIndex( face.normal ) ); + + } + + if ( hasFaceVertexNormal ) { + + var vertexNormals = face.vertexNormals; + + faces.push( + getNormalIndex( vertexNormals[ 0 ] ), + getNormalIndex( vertexNormals[ 1 ] ), + getNormalIndex( vertexNormals[ 2 ] ) + ); + + } + + if ( hasFaceColor ) { + + faces.push( getColorIndex( face.color ) ); + + } + + if ( hasFaceVertexColor ) { + + var vertexColors = face.vertexColors; + + faces.push( + getColorIndex( vertexColors[ 0 ] ), + getColorIndex( vertexColors[ 1 ] ), + getColorIndex( vertexColors[ 2 ] ) + ); + + } + + } + + function setBit( value, position, enabled ) { + + return enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) ); + + } + + function getNormalIndex( normal ) { + + var hash = normal.x.toString() + normal.y.toString() + normal.z.toString(); + + if ( normalsHash[ hash ] !== undefined ) { + + return normalsHash[ hash ]; + + } + + normalsHash[ hash ] = normals.length / 3; + normals.push( normal.x, normal.y, normal.z ); + + return normalsHash[ hash ]; + + } + + function getColorIndex( color ) { + + var hash = color.r.toString() + color.g.toString() + color.b.toString(); + + if ( colorsHash[ hash ] !== undefined ) { + + return colorsHash[ hash ]; + + } + + colorsHash[ hash ] = colors.length; + colors.push( color.getHex() ); + + return colorsHash[ hash ]; + + } + + function getUvIndex( uv ) { + + var hash = uv.x.toString() + uv.y.toString(); + + if ( uvsHash[ hash ] !== undefined ) { + + return uvsHash[ hash ]; + + } + + uvsHash[ hash ] = uvs.length / 2; + uvs.push( uv.x, uv.y ); + + return uvsHash[ hash ]; + + } + + data.data = {}; + + data.data.vertices = vertices; + data.data.normals = normals; + if ( colors.length > 0 ) data.data.colors = colors; + if ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility + data.data.faces = faces; + + return data; + + }, + + clone: function () { + + /* + // Handle primitives + + var parameters = this.parameters; + + if ( parameters !== undefined ) { + + var values = []; + + for ( var key in parameters ) { + + values.push( parameters[ key ] ); + + } + + var geometry = Object.create( this.constructor.prototype ); + this.constructor.apply( geometry, values ); + return geometry; + + } + + return new this.constructor().copy( this ); + */ + + return new Geometry().copy( this ); + + }, + + copy: function ( source ) { + + var i, il, j, jl, k, kl; + + // reset + + this.vertices = []; + this.colors = []; + this.faces = []; + this.faceVertexUvs = [[]]; + this.morphTargets = []; + this.morphNormals = []; + this.skinWeights = []; + this.skinIndices = []; + this.lineDistances = []; + this.boundingBox = null; + this.boundingSphere = null; + + // name + + this.name = source.name; + + // vertices + + var vertices = source.vertices; + + for ( i = 0, il = vertices.length; i < il; i ++ ) { + + this.vertices.push( vertices[ i ].clone() ); + + } + + // colors + + var colors = source.colors; + + for ( i = 0, il = colors.length; i < il; i ++ ) { + + this.colors.push( colors[ i ].clone() ); + + } + + // faces + + var faces = source.faces; + + for ( i = 0, il = faces.length; i < il; i ++ ) { + + this.faces.push( faces[ i ].clone() ); + + } + + // face vertex uvs + + for ( i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) { + + var faceVertexUvs = source.faceVertexUvs[ i ]; + + if ( this.faceVertexUvs[ i ] === undefined ) { + + this.faceVertexUvs[ i ] = []; + + } + + for ( j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) { + + var uvs = faceVertexUvs[ j ], uvsCopy = []; + + for ( k = 0, kl = uvs.length; k < kl; k ++ ) { + + var uv = uvs[ k ]; + + uvsCopy.push( uv.clone() ); + + } + + this.faceVertexUvs[ i ].push( uvsCopy ); + + } + + } + + // morph targets + + var morphTargets = source.morphTargets; + + for ( i = 0, il = morphTargets.length; i < il; i ++ ) { + + var morphTarget = {}; + morphTarget.name = morphTargets[ i ].name; + + // vertices + + if ( morphTargets[ i ].vertices !== undefined ) { + + morphTarget.vertices = []; + + for ( j = 0, jl = morphTargets[ i ].vertices.length; j < jl; j ++ ) { + + morphTarget.vertices.push( morphTargets[ i ].vertices[ j ].clone() ); + + } + + } + + // normals + + if ( morphTargets[ i ].normals !== undefined ) { + + morphTarget.normals = []; + + for ( j = 0, jl = morphTargets[ i ].normals.length; j < jl; j ++ ) { + + morphTarget.normals.push( morphTargets[ i ].normals[ j ].clone() ); + + } + + } + + this.morphTargets.push( morphTarget ); + + } + + // morph normals + + var morphNormals = source.morphNormals; + + for ( i = 0, il = morphNormals.length; i < il; i ++ ) { + + var morphNormal = {}; + + // vertex normals + + if ( morphNormals[ i ].vertexNormals !== undefined ) { + + morphNormal.vertexNormals = []; + + for ( j = 0, jl = morphNormals[ i ].vertexNormals.length; j < jl; j ++ ) { + + var srcVertexNormal = morphNormals[ i ].vertexNormals[ j ]; + var destVertexNormal = {}; + + destVertexNormal.a = srcVertexNormal.a.clone(); + destVertexNormal.b = srcVertexNormal.b.clone(); + destVertexNormal.c = srcVertexNormal.c.clone(); + + morphNormal.vertexNormals.push( destVertexNormal ); + + } + + } + + // face normals + + if ( morphNormals[ i ].faceNormals !== undefined ) { + + morphNormal.faceNormals = []; + + for ( j = 0, jl = morphNormals[ i ].faceNormals.length; j < jl; j ++ ) { + + morphNormal.faceNormals.push( morphNormals[ i ].faceNormals[ j ].clone() ); + + } + + } + + this.morphNormals.push( morphNormal ); + + } + + // skin weights + + var skinWeights = source.skinWeights; + + for ( i = 0, il = skinWeights.length; i < il; i ++ ) { + + this.skinWeights.push( skinWeights[ i ].clone() ); + + } + + // skin indices + + var skinIndices = source.skinIndices; + + for ( i = 0, il = skinIndices.length; i < il; i ++ ) { + + this.skinIndices.push( skinIndices[ i ].clone() ); + + } + + // line distances + + var lineDistances = source.lineDistances; + + for ( i = 0, il = lineDistances.length; i < il; i ++ ) { + + this.lineDistances.push( lineDistances[ i ] ); + + } + + // bounding box + + var boundingBox = source.boundingBox; + + if ( boundingBox !== null ) { + + this.boundingBox = boundingBox.clone(); + + } + + // bounding sphere + + var boundingSphere = source.boundingSphere; + + if ( boundingSphere !== null ) { + + this.boundingSphere = boundingSphere.clone(); + + } + + // update flags + + this.elementsNeedUpdate = source.elementsNeedUpdate; + this.verticesNeedUpdate = source.verticesNeedUpdate; + this.uvsNeedUpdate = source.uvsNeedUpdate; + this.normalsNeedUpdate = source.normalsNeedUpdate; + this.colorsNeedUpdate = source.colorsNeedUpdate; + this.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate; + this.groupsNeedUpdate = source.groupsNeedUpdate; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function BufferAttribute( array, itemSize, normalized ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.name = ''; + + this.array = array; + this.itemSize = itemSize; + this.count = array !== undefined ? array.length / itemSize : 0; + this.normalized = normalized === true; + + this.dynamic = false; + this.updateRange = { offset: 0, count: - 1 }; + + this.version = 0; + + } + + Object.defineProperty( BufferAttribute.prototype, 'needsUpdate', { + + set: function ( value ) { + + if ( value === true ) this.version ++; + + } + + } ); + + Object.assign( BufferAttribute.prototype, { + + isBufferAttribute: true, + + onUploadCallback: function () {}, + + setArray: function ( array ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.count = array !== undefined ? array.length / this.itemSize : 0; + this.array = array; + + return this; + + }, + + setDynamic: function ( value ) { + + this.dynamic = value; + + return this; + + }, + + copy: function ( source ) { + + this.name = source.name; + this.array = new source.array.constructor( source.array ); + this.itemSize = source.itemSize; + this.count = source.count; + this.normalized = source.normalized; + + this.dynamic = source.dynamic; + + return this; + + }, + + copyAt: function ( index1, attribute, index2 ) { + + index1 *= this.itemSize; + index2 *= attribute.itemSize; + + for ( var i = 0, l = this.itemSize; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + }, + + copyArray: function ( array ) { + + this.array.set( array ); + + return this; + + }, + + copyColorsArray: function ( colors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = colors.length; i < l; i ++ ) { + + var color = colors[ i ]; + + if ( color === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i ); + color = new Color(); + + } + + array[ offset ++ ] = color.r; + array[ offset ++ ] = color.g; + array[ offset ++ ] = color.b; + + } + + return this; + + }, + + copyVector2sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i ); + vector = new Vector2(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + + } + + return this; + + }, + + copyVector3sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i ); + vector = new Vector3(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + + } + + return this; + + }, + + copyVector4sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i ); + vector = new Vector4(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + array[ offset ++ ] = vector.w; + + } + + return this; + + }, + + set: function ( value, offset ) { + + if ( offset === undefined ) offset = 0; + + this.array.set( value, offset ); + + return this; + + }, + + getX: function ( index ) { + + return this.array[ index * this.itemSize ]; + + }, + + setX: function ( index, x ) { + + this.array[ index * this.itemSize ] = x; + + return this; + + }, + + getY: function ( index ) { + + return this.array[ index * this.itemSize + 1 ]; + + }, + + setY: function ( index, y ) { + + this.array[ index * this.itemSize + 1 ] = y; + + return this; + + }, + + getZ: function ( index ) { + + return this.array[ index * this.itemSize + 2 ]; + + }, + + setZ: function ( index, z ) { + + this.array[ index * this.itemSize + 2 ] = z; + + return this; + + }, + + getW: function ( index ) { + + return this.array[ index * this.itemSize + 3 ]; + + }, + + setW: function ( index, w ) { + + this.array[ index * this.itemSize + 3 ] = w; + + return this; + + }, + + setXY: function ( index, x, y ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + + return this; + + }, + + setXYZ: function ( index, x, y, z ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + + return this; + + }, + + setXYZW: function ( index, x, y, z, w ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + this.array[ index + 3 ] = w; + + return this; + + }, + + onUpload: function ( callback ) { + + this.onUploadCallback = callback; + + return this; + + }, + + clone: function () { + + return new this.constructor( this.array, this.itemSize ).copy( this ); + + } + + } ); + + // + + function Int8BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Int8Array( array ), itemSize, normalized ); + + } + + Int8BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Int8BufferAttribute.prototype.constructor = Int8BufferAttribute; + + + function Uint8BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Uint8Array( array ), itemSize, normalized ); + + } + + Uint8BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint8BufferAttribute.prototype.constructor = Uint8BufferAttribute; + + + function Uint8ClampedBufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Uint8ClampedArray( array ), itemSize, normalized ); + + } + + Uint8ClampedBufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute; + + + function Int16BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Int16Array( array ), itemSize, normalized ); + + } + + Int16BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Int16BufferAttribute.prototype.constructor = Int16BufferAttribute; + + + function Uint16BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Uint16Array( array ), itemSize, normalized ); + + } + + Uint16BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint16BufferAttribute.prototype.constructor = Uint16BufferAttribute; + + + function Int32BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Int32Array( array ), itemSize, normalized ); + + } + + Int32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Int32BufferAttribute.prototype.constructor = Int32BufferAttribute; + + + function Uint32BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Uint32Array( array ), itemSize, normalized ); + + } + + Uint32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Uint32BufferAttribute.prototype.constructor = Uint32BufferAttribute; + + + function Float32BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Float32Array( array ), itemSize, normalized ); + + } + + Float32BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Float32BufferAttribute.prototype.constructor = Float32BufferAttribute; + + + function Float64BufferAttribute( array, itemSize, normalized ) { + + BufferAttribute.call( this, new Float64Array( array ), itemSize, normalized ); + + } + + Float64BufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + Float64BufferAttribute.prototype.constructor = Float64BufferAttribute; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function DirectGeometry() { + + this.vertices = []; + this.normals = []; + this.colors = []; + this.uvs = []; + this.uvs2 = []; + + this.groups = []; + + this.morphTargets = {}; + + this.skinWeights = []; + this.skinIndices = []; + + // this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.verticesNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.uvsNeedUpdate = false; + this.groupsNeedUpdate = false; + + } + + Object.assign( DirectGeometry.prototype, { + + computeGroups: function ( geometry ) { + + var group; + var groups = []; + var materialIndex = undefined; + + var faces = geometry.faces; + + for ( var i = 0; i < faces.length; i ++ ) { + + var face = faces[ i ]; + + // materials + + if ( face.materialIndex !== materialIndex ) { + + materialIndex = face.materialIndex; + + if ( group !== undefined ) { + + group.count = ( i * 3 ) - group.start; + groups.push( group ); + + } + + group = { + start: i * 3, + materialIndex: materialIndex + }; + + } + + } + + if ( group !== undefined ) { + + group.count = ( i * 3 ) - group.start; + groups.push( group ); + + } + + this.groups = groups; + + }, + + fromGeometry: function ( geometry ) { + + var faces = geometry.faces; + var vertices = geometry.vertices; + var faceVertexUvs = geometry.faceVertexUvs; + + var hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0; + var hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0; + + // morphs + + var morphTargets = geometry.morphTargets; + var morphTargetsLength = morphTargets.length; + + var morphTargetsPosition; + + if ( morphTargetsLength > 0 ) { + + morphTargetsPosition = []; + + for ( var i = 0; i < morphTargetsLength; i ++ ) { + + morphTargetsPosition[ i ] = []; + + } + + this.morphTargets.position = morphTargetsPosition; + + } + + var morphNormals = geometry.morphNormals; + var morphNormalsLength = morphNormals.length; + + var morphTargetsNormal; + + if ( morphNormalsLength > 0 ) { + + morphTargetsNormal = []; + + for ( var i = 0; i < morphNormalsLength; i ++ ) { + + morphTargetsNormal[ i ] = []; + + } + + this.morphTargets.normal = morphTargetsNormal; + + } + + // skins + + var skinIndices = geometry.skinIndices; + var skinWeights = geometry.skinWeights; + + var hasSkinIndices = skinIndices.length === vertices.length; + var hasSkinWeights = skinWeights.length === vertices.length; + + // + + for ( var i = 0; i < faces.length; i ++ ) { + + var face = faces[ i ]; + + this.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] ); + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + this.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] ); + + } else { + + var normal = face.normal; + + this.normals.push( normal, normal, normal ); + + } + + var vertexColors = face.vertexColors; + + if ( vertexColors.length === 3 ) { + + this.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] ); + + } else { + + var color = face.color; + + this.colors.push( color, color, color ); + + } + + if ( hasFaceVertexUv === true ) { + + var vertexUvs = faceVertexUvs[ 0 ][ i ]; + + if ( vertexUvs !== undefined ) { + + this.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i ); + + this.uvs.push( new Vector2(), new Vector2(), new Vector2() ); + + } + + } + + if ( hasFaceVertexUv2 === true ) { + + var vertexUvs = faceVertexUvs[ 1 ][ i ]; + + if ( vertexUvs !== undefined ) { + + this.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i ); + + this.uvs2.push( new Vector2(), new Vector2(), new Vector2() ); + + } + + } + + // morphs + + for ( var j = 0; j < morphTargetsLength; j ++ ) { + + var morphTarget = morphTargets[ j ].vertices; + + morphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] ); + + } + + for ( var j = 0; j < morphNormalsLength; j ++ ) { + + var morphNormal = morphNormals[ j ].vertexNormals[ i ]; + + morphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c ); + + } + + // skins + + if ( hasSkinIndices ) { + + this.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] ); + + } + + if ( hasSkinWeights ) { + + this.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] ); + + } + + } + + this.computeGroups( geometry ); + + this.verticesNeedUpdate = geometry.verticesNeedUpdate; + this.normalsNeedUpdate = geometry.normalsNeedUpdate; + this.colorsNeedUpdate = geometry.colorsNeedUpdate; + this.uvsNeedUpdate = geometry.uvsNeedUpdate; + this.groupsNeedUpdate = geometry.groupsNeedUpdate; + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function arrayMax( array ) { + + if ( array.length === 0 ) return - Infinity; + + var max = array[ 0 ]; + + for ( var i = 1, l = array.length; i < l; ++ i ) { + + if ( array[ i ] > max ) max = array[ i ]; + + } + + return max; + + } + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + var bufferGeometryId = 1; // BufferGeometry uses odd numbers as Id + + function BufferGeometry() { + + Object.defineProperty( this, 'id', { value: bufferGeometryId += 2 } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'BufferGeometry'; + + this.index = null; + this.attributes = {}; + + this.morphAttributes = {}; + + this.groups = []; + + this.boundingBox = null; + this.boundingSphere = null; + + this.drawRange = { start: 0, count: Infinity }; + + } + + BufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: BufferGeometry, + + isBufferGeometry: true, + + getIndex: function () { + + return this.index; + + }, + + setIndex: function ( index ) { + + if ( Array.isArray( index ) ) { + + this.index = new ( arrayMax( index ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 ); + + } else { + + this.index = index; + + } + + }, + + addAttribute: function ( name, attribute ) { + + if ( ! ( attribute && attribute.isBufferAttribute ) && ! ( attribute && attribute.isInterleavedBufferAttribute ) ) { + + console.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' ); + + this.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) ); + + return; + + } + + if ( name === 'index' ) { + + console.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' ); + this.setIndex( attribute ); + + return; + + } + + this.attributes[ name ] = attribute; + + return this; + + }, + + getAttribute: function ( name ) { + + return this.attributes[ name ]; + + }, + + removeAttribute: function ( name ) { + + delete this.attributes[ name ]; + + return this; + + }, + + addGroup: function ( start, count, materialIndex ) { + + this.groups.push( { + + start: start, + count: count, + materialIndex: materialIndex !== undefined ? materialIndex : 0 + + } ); + + }, + + clearGroups: function () { + + this.groups = []; + + }, + + setDrawRange: function ( start, count ) { + + this.drawRange.start = start; + this.drawRange.count = count; + + }, + + applyMatrix: function ( matrix ) { + + var position = this.attributes.position; + + if ( position !== undefined ) { + + matrix.applyToBufferAttribute( position ); + position.needsUpdate = true; + + } + + var normal = this.attributes.normal; + + if ( normal !== undefined ) { + + var normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + normalMatrix.applyToBufferAttribute( normal ); + normal.needsUpdate = true; + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + return this; + + }, + + rotateX: function () { + + // rotate geometry around world x-axis + + var m1 = new Matrix4(); + + return function rotateX( angle ) { + + m1.makeRotationX( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateY: function () { + + // rotate geometry around world y-axis + + var m1 = new Matrix4(); + + return function rotateY( angle ) { + + m1.makeRotationY( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateZ: function () { + + // rotate geometry around world z-axis + + var m1 = new Matrix4(); + + return function rotateZ( angle ) { + + m1.makeRotationZ( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + translate: function () { + + // translate geometry + + var m1 = new Matrix4(); + + return function translate( x, y, z ) { + + m1.makeTranslation( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + scale: function () { + + // scale geometry + + var m1 = new Matrix4(); + + return function scale( x, y, z ) { + + m1.makeScale( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + lookAt: function () { + + var obj = new Object3D(); + + return function lookAt( vector ) { + + obj.lookAt( vector ); + + obj.updateMatrix(); + + this.applyMatrix( obj.matrix ); + + }; + + }(), + + center: function () { + + var offset = new Vector3(); + + return function center() { + + this.computeBoundingBox(); + + this.boundingBox.getCenter( offset ).negate(); + + this.translate( offset.x, offset.y, offset.z ); + + return this; + + }; + + }(), + + setFromObject: function ( object ) { + + // console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this ); + + var geometry = object.geometry; + + if ( object.isPoints || object.isLine ) { + + var positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 ); + var colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 ); + + this.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) ); + this.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) ); + + if ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) { + + var lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 ); + + this.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) ); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + } else if ( object.isMesh ) { + + if ( geometry && geometry.isGeometry ) { + + this.fromGeometry( geometry ); + + } + + } + + return this; + + }, + + setFromPoints: function ( points ) { + + var position = []; + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + var point = points[ i ]; + position.push( point.x, point.y, point.z || 0 ); + + } + + this.addAttribute( 'position', new Float32BufferAttribute( position, 3 ) ); + + return this; + + }, + + updateFromObject: function ( object ) { + + var geometry = object.geometry; + + if ( object.isMesh ) { + + var direct = geometry.__directGeometry; + + if ( geometry.elementsNeedUpdate === true ) { + + direct = undefined; + geometry.elementsNeedUpdate = false; + + } + + if ( direct === undefined ) { + + return this.fromGeometry( geometry ); + + } + + direct.verticesNeedUpdate = geometry.verticesNeedUpdate; + direct.normalsNeedUpdate = geometry.normalsNeedUpdate; + direct.colorsNeedUpdate = geometry.colorsNeedUpdate; + direct.uvsNeedUpdate = geometry.uvsNeedUpdate; + direct.groupsNeedUpdate = geometry.groupsNeedUpdate; + + geometry.verticesNeedUpdate = false; + geometry.normalsNeedUpdate = false; + geometry.colorsNeedUpdate = false; + geometry.uvsNeedUpdate = false; + geometry.groupsNeedUpdate = false; + + geometry = direct; + + } + + var attribute; + + if ( geometry.verticesNeedUpdate === true ) { + + attribute = this.attributes.position; + + if ( attribute !== undefined ) { + + attribute.copyVector3sArray( geometry.vertices ); + attribute.needsUpdate = true; + + } + + geometry.verticesNeedUpdate = false; + + } + + if ( geometry.normalsNeedUpdate === true ) { + + attribute = this.attributes.normal; + + if ( attribute !== undefined ) { + + attribute.copyVector3sArray( geometry.normals ); + attribute.needsUpdate = true; + + } + + geometry.normalsNeedUpdate = false; + + } + + if ( geometry.colorsNeedUpdate === true ) { + + attribute = this.attributes.color; + + if ( attribute !== undefined ) { + + attribute.copyColorsArray( geometry.colors ); + attribute.needsUpdate = true; + + } + + geometry.colorsNeedUpdate = false; + + } + + if ( geometry.uvsNeedUpdate ) { + + attribute = this.attributes.uv; + + if ( attribute !== undefined ) { + + attribute.copyVector2sArray( geometry.uvs ); + attribute.needsUpdate = true; + + } + + geometry.uvsNeedUpdate = false; + + } + + if ( geometry.lineDistancesNeedUpdate ) { + + attribute = this.attributes.lineDistance; + + if ( attribute !== undefined ) { + + attribute.copyArray( geometry.lineDistances ); + attribute.needsUpdate = true; + + } + + geometry.lineDistancesNeedUpdate = false; + + } + + if ( geometry.groupsNeedUpdate ) { + + geometry.computeGroups( object.geometry ); + this.groups = geometry.groups; + + geometry.groupsNeedUpdate = false; + + } + + return this; + + }, + + fromGeometry: function ( geometry ) { + + geometry.__directGeometry = new DirectGeometry().fromGeometry( geometry ); + + return this.fromDirectGeometry( geometry.__directGeometry ); + + }, + + fromDirectGeometry: function ( geometry ) { + + var positions = new Float32Array( geometry.vertices.length * 3 ); + this.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) ); + + if ( geometry.normals.length > 0 ) { + + var normals = new Float32Array( geometry.normals.length * 3 ); + this.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) ); + + } + + if ( geometry.colors.length > 0 ) { + + var colors = new Float32Array( geometry.colors.length * 3 ); + this.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) ); + + } + + if ( geometry.uvs.length > 0 ) { + + var uvs = new Float32Array( geometry.uvs.length * 2 ); + this.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) ); + + } + + if ( geometry.uvs2.length > 0 ) { + + var uvs2 = new Float32Array( geometry.uvs2.length * 2 ); + this.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) ); + + } + + // groups + + this.groups = geometry.groups; + + // morphs + + for ( var name in geometry.morphTargets ) { + + var array = []; + var morphTargets = geometry.morphTargets[ name ]; + + for ( var i = 0, l = morphTargets.length; i < l; i ++ ) { + + var morphTarget = morphTargets[ i ]; + + var attribute = new Float32BufferAttribute( morphTarget.length * 3, 3 ); + + array.push( attribute.copyVector3sArray( morphTarget ) ); + + } + + this.morphAttributes[ name ] = array; + + } + + // skinning + + if ( geometry.skinIndices.length > 0 ) { + + var skinIndices = new Float32BufferAttribute( geometry.skinIndices.length * 4, 4 ); + this.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) ); + + } + + if ( geometry.skinWeights.length > 0 ) { + + var skinWeights = new Float32BufferAttribute( geometry.skinWeights.length * 4, 4 ); + this.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) ); + + } + + // + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + return this; + + }, + + computeBoundingBox: function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + var position = this.attributes.position; + + if ( position !== undefined ) { + + this.boundingBox.setFromBufferAttribute( position ); + + } else { + + this.boundingBox.makeEmpty(); + + } + + if ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this ); + + } + + }, + + computeBoundingSphere: function () { + + var box = new Box3(); + var vector = new Vector3(); + + return function computeBoundingSphere() { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + var position = this.attributes.position; + + if ( position ) { + + var center = this.boundingSphere.center; + + box.setFromBufferAttribute( position ); + box.getCenter( center ); + + // hoping to find a boundingSphere with a radius smaller than the + // boundingSphere of the boundingBox: sqrt(3) smaller in the best case + + var maxRadiusSq = 0; + + for ( var i = 0, il = position.count; i < il; i ++ ) { + + vector.x = position.getX( i ); + vector.y = position.getY( i ); + vector.z = position.getZ( i ); + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) ); + + } + + this.boundingSphere.radius = Math.sqrt( maxRadiusSq ); + + if ( isNaN( this.boundingSphere.radius ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this ); + + } + + } + + }; + + }(), + + computeFaceNormals: function () { + + // backwards compatibility + + }, + + computeVertexNormals: function () { + + var index = this.index; + var attributes = this.attributes; + var groups = this.groups; + + if ( attributes.position ) { + + var positions = attributes.position.array; + + if ( attributes.normal === undefined ) { + + this.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) ); + + } else { + + // reset existing normals to zero + + var array = attributes.normal.array; + + for ( var i = 0, il = array.length; i < il; i ++ ) { + + array[ i ] = 0; + + } + + } + + var normals = attributes.normal.array; + + var vA, vB, vC; + var pA = new Vector3(), pB = new Vector3(), pC = new Vector3(); + var cb = new Vector3(), ab = new Vector3(); + + // indexed elements + + if ( index ) { + + var indices = index.array; + + if ( groups.length === 0 ) { + + this.addGroup( 0, indices.length ); + + } + + for ( var j = 0, jl = groups.length; j < jl; ++ j ) { + + var group = groups[ j ]; + + var start = group.start; + var count = group.count; + + for ( var i = start, il = start + count; i < il; i += 3 ) { + + vA = indices[ i + 0 ] * 3; + vB = indices[ i + 1 ] * 3; + vC = indices[ i + 2 ] * 3; + + pA.fromArray( positions, vA ); + pB.fromArray( positions, vB ); + pC.fromArray( positions, vC ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normals[ vA ] += cb.x; + normals[ vA + 1 ] += cb.y; + normals[ vA + 2 ] += cb.z; + + normals[ vB ] += cb.x; + normals[ vB + 1 ] += cb.y; + normals[ vB + 2 ] += cb.z; + + normals[ vC ] += cb.x; + normals[ vC + 1 ] += cb.y; + normals[ vC + 2 ] += cb.z; + + } + + } + + } else { + + // non-indexed elements (unconnected triangle soup) + + for ( var i = 0, il = positions.length; i < il; i += 9 ) { + + pA.fromArray( positions, i ); + pB.fromArray( positions, i + 3 ); + pC.fromArray( positions, i + 6 ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normals[ i ] = cb.x; + normals[ i + 1 ] = cb.y; + normals[ i + 2 ] = cb.z; + + normals[ i + 3 ] = cb.x; + normals[ i + 4 ] = cb.y; + normals[ i + 5 ] = cb.z; + + normals[ i + 6 ] = cb.x; + normals[ i + 7 ] = cb.y; + normals[ i + 8 ] = cb.z; + + } + + } + + this.normalizeNormals(); + + attributes.normal.needsUpdate = true; + + } + + }, + + merge: function ( geometry, offset ) { + + if ( ! ( geometry && geometry.isBufferGeometry ) ) { + + console.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry ); + return; + + } + + if ( offset === undefined ) { + + offset = 0; + + console.warn( + 'THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. ' + + 'Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge.' + ); + + } + + var attributes = this.attributes; + + for ( var key in attributes ) { + + if ( geometry.attributes[ key ] === undefined ) continue; + + var attribute1 = attributes[ key ]; + var attributeArray1 = attribute1.array; + + var attribute2 = geometry.attributes[ key ]; + var attributeArray2 = attribute2.array; + + var attributeSize = attribute2.itemSize; + + for ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) { + + attributeArray1[ j ] = attributeArray2[ i ]; + + } + + } + + return this; + + }, + + normalizeNormals: function () { + + var vector = new Vector3(); + + return function normalizeNormals() { + + var normals = this.attributes.normal; + + for ( var i = 0, il = normals.count; i < il; i ++ ) { + + vector.x = normals.getX( i ); + vector.y = normals.getY( i ); + vector.z = normals.getZ( i ); + + vector.normalize(); + + normals.setXYZ( i, vector.x, vector.y, vector.z ); + + } + + }; + + }(), + + toNonIndexed: function () { + + if ( this.index === null ) { + + console.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' ); + return this; + + } + + var geometry2 = new BufferGeometry(); + + var indices = this.index.array; + var attributes = this.attributes; + + for ( var name in attributes ) { + + var attribute = attributes[ name ]; + + var array = attribute.array; + var itemSize = attribute.itemSize; + + var array2 = new array.constructor( indices.length * itemSize ); + + var index = 0, index2 = 0; + + for ( var i = 0, l = indices.length; i < l; i ++ ) { + + index = indices[ i ] * itemSize; + + for ( var j = 0; j < itemSize; j ++ ) { + + array2[ index2 ++ ] = array[ index ++ ]; + + } + + } + + geometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) ); + + } + + var groups = this.groups; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + geometry2.addGroup( group.start, group.count, group.materialIndex ); + + } + + return geometry2; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.5, + type: 'BufferGeometry', + generator: 'BufferGeometry.toJSON' + } + }; + + // standard BufferGeometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + + if ( this.parameters !== undefined ) { + + var parameters = this.parameters; + + for ( var key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + data.data = { attributes: {} }; + + var index = this.index; + + if ( index !== null ) { + + var array = Array.prototype.slice.call( index.array ); + + data.data.index = { + type: index.array.constructor.name, + array: array + }; + + } + + var attributes = this.attributes; + + for ( var key in attributes ) { + + var attribute = attributes[ key ]; + + var array = Array.prototype.slice.call( attribute.array ); + + data.data.attributes[ key ] = { + itemSize: attribute.itemSize, + type: attribute.array.constructor.name, + array: array, + normalized: attribute.normalized + }; + + } + + var groups = this.groups; + + if ( groups.length > 0 ) { + + data.data.groups = JSON.parse( JSON.stringify( groups ) ); + + } + + var boundingSphere = this.boundingSphere; + + if ( boundingSphere !== null ) { + + data.data.boundingSphere = { + center: boundingSphere.center.toArray(), + radius: boundingSphere.radius + }; + + } + + return data; + + }, + + clone: function () { + + /* + // Handle primitives + + var parameters = this.parameters; + + if ( parameters !== undefined ) { + + var values = []; + + for ( var key in parameters ) { + + values.push( parameters[ key ] ); + + } + + var geometry = Object.create( this.constructor.prototype ); + this.constructor.apply( geometry, values ); + return geometry; + + } + + return new this.constructor().copy( this ); + */ + + return new BufferGeometry().copy( this ); + + }, + + copy: function ( source ) { + + var name, i, l; + + // reset + + this.index = null; + this.attributes = {}; + this.morphAttributes = {}; + this.groups = []; + this.boundingBox = null; + this.boundingSphere = null; + + // name + + this.name = source.name; + + // index + + var index = source.index; + + if ( index !== null ) { + + this.setIndex( index.clone() ); + + } + + // attributes + + var attributes = source.attributes; + + for ( name in attributes ) { + + var attribute = attributes[ name ]; + this.addAttribute( name, attribute.clone() ); + + } + + // morph attributes + + var morphAttributes = source.morphAttributes; + + for ( name in morphAttributes ) { + + var array = []; + var morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes + + for ( i = 0, l = morphAttribute.length; i < l; i ++ ) { + + array.push( morphAttribute[ i ].clone() ); + + } + + this.morphAttributes[ name ] = array; + + } + + // groups + + var groups = source.groups; + + for ( i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + this.addGroup( group.start, group.count, group.materialIndex ); + + } + + // bounding box + + var boundingBox = source.boundingBox; + + if ( boundingBox !== null ) { + + this.boundingBox = boundingBox.clone(); + + } + + // bounding sphere + + var boundingSphere = source.boundingSphere; + + if ( boundingSphere !== null ) { + + this.boundingSphere = boundingSphere.clone(); + + } + + // draw range + + this.drawRange.start = source.drawRange.start; + this.drawRange.count = source.drawRange.count; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // BoxGeometry + + function BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) { + + Geometry.call( this ); + + this.type = 'BoxGeometry'; + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + this.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) ); + this.mergeVertices(); + + } + + BoxGeometry.prototype = Object.create( Geometry.prototype ); + BoxGeometry.prototype.constructor = BoxGeometry; + + // BoxBufferGeometry + + function BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) { + + BufferGeometry.call( this ); + + this.type = 'BoxBufferGeometry'; + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + var scope = this; + + width = width || 1; + height = height || 1; + depth = depth || 1; + + // segments + + widthSegments = Math.floor( widthSegments ) || 1; + heightSegments = Math.floor( heightSegments ) || 1; + depthSegments = Math.floor( depthSegments ) || 1; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var numberOfVertices = 0; + var 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( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + function buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) { + + var segmentWidth = width / gridX; + var segmentHeight = height / gridY; + + var widthHalf = width / 2; + var heightHalf = height / 2; + var depthHalf = depth / 2; + + var gridX1 = gridX + 1; + var gridY1 = gridY + 1; + + var vertexCounter = 0; + var groupCount = 0; + + var ix, iy; + + var vector = new Vector3(); + + // generate vertices, normals and uvs + + for ( iy = 0; iy < gridY1; iy ++ ) { + + var y = iy * segmentHeight - heightHalf; + + for ( ix = 0; ix < gridX1; ix ++ ) { + + var 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 ( iy = 0; iy < gridY; iy ++ ) { + + for ( ix = 0; ix < gridX; ix ++ ) { + + var a = numberOfVertices + ix + gridX1 * iy; + var b = numberOfVertices + ix + gridX1 * ( iy + 1 ); + var c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 ); + var 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; + + } + + } + + BoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + BoxBufferGeometry.prototype.constructor = BoxBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // PlaneGeometry + + function PlaneGeometry( width, height, widthSegments, heightSegments ) { + + Geometry.call( this ); + + this.type = 'PlaneGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + this.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) ); + this.mergeVertices(); + + } + + PlaneGeometry.prototype = Object.create( Geometry.prototype ); + PlaneGeometry.prototype.constructor = PlaneGeometry; + + // PlaneBufferGeometry + + function PlaneBufferGeometry( width, height, widthSegments, heightSegments ) { + + BufferGeometry.call( this ); + + this.type = 'PlaneBufferGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + width = width || 1; + height = height || 1; + + var width_half = width / 2; + var height_half = height / 2; + + var gridX = Math.floor( widthSegments ) || 1; + var gridY = Math.floor( heightSegments ) || 1; + + var gridX1 = gridX + 1; + var gridY1 = gridY + 1; + + var segment_width = width / gridX; + var segment_height = height / gridY; + + var ix, iy; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // generate vertices, normals and uvs + + for ( iy = 0; iy < gridY1; iy ++ ) { + + var y = iy * segment_height - height_half; + + for ( ix = 0; ix < gridX1; ix ++ ) { + + var x = ix * segment_width - width_half; + + vertices.push( x, - y, 0 ); + + normals.push( 0, 0, 1 ); + + uvs.push( ix / gridX ); + uvs.push( 1 - ( iy / gridY ) ); + + } + + } + + // indices + + for ( iy = 0; iy < gridY; iy ++ ) { + + for ( ix = 0; ix < gridX; ix ++ ) { + + var a = ix + gridX1 * iy; + var b = ix + gridX1 * ( iy + 1 ); + var c = ( ix + 1 ) + gridX1 * ( iy + 1 ); + var d = ( ix + 1 ) + gridX1 * iy; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + PlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + PlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + var materialId = 0; + + function Material() { + + Object.defineProperty( this, 'id', { value: materialId ++ } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Material'; + + this.fog = true; + this.lights = true; + + this.blending = NormalBlending; + this.side = FrontSide; + this.flatShading = false; + this.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors + + this.opacity = 1; + this.transparent = false; + + this.blendSrc = SrcAlphaFactor; + this.blendDst = OneMinusSrcAlphaFactor; + this.blendEquation = AddEquation; + this.blendSrcAlpha = null; + this.blendDstAlpha = null; + this.blendEquationAlpha = null; + + this.depthFunc = LessEqualDepth; + this.depthTest = true; + this.depthWrite = true; + + this.clippingPlanes = null; + this.clipIntersection = false; + this.clipShadows = false; + + this.shadowSide = null; + + this.colorWrite = true; + + this.precision = null; // override the renderer's default precision for this material + + this.polygonOffset = false; + this.polygonOffsetFactor = 0; + this.polygonOffsetUnits = 0; + + this.dithering = false; + + this.alphaTest = 0; + this.premultipliedAlpha = false; + + this.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer + + this.visible = true; + + this.userData = {}; + + this.needsUpdate = true; + + } + + Material.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: Material, + + isMaterial: true, + + onBeforeCompile: function () {}, + + setValues: function ( values ) { + + if ( values === undefined ) return; + + for ( var key in values ) { + + var newValue = values[ key ]; + + if ( newValue === undefined ) { + + console.warn( "THREE.Material: '" + key + "' parameter is undefined." ); + continue; + + } + + // for backward compatability if shading is set in the constructor + if ( key === 'shading' ) { + + console.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' ); + this.flatShading = ( newValue === FlatShading ) ? true : false; + continue; + + } + + var currentValue = this[ key ]; + + if ( currentValue === undefined ) { + + console.warn( "THREE." + this.type + ": '" + key + "' is not a property of this material." ); + continue; + + } + + if ( currentValue && currentValue.isColor ) { + + currentValue.set( newValue ); + + } else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) { + + currentValue.copy( newValue ); + + } else if ( key === 'overdraw' ) { + + // ensure overdraw is backwards-compatible with legacy boolean type + this[ key ] = Number( newValue ); + + } else { + + this[ key ] = newValue; + + } + + } + + }, + + toJSON: function ( meta ) { + + var isRoot = ( meta === undefined || typeof meta === 'string' ); + + if ( isRoot ) { + + meta = { + textures: {}, + images: {} + }; + + } + + var data = { + metadata: { + version: 4.5, + type: 'Material', + generator: 'Material.toJSON' + } + }; + + // standard Material serialization + data.uuid = this.uuid; + data.type = this.type; + + if ( this.name !== '' ) data.name = this.name; + + if ( this.color && this.color.isColor ) data.color = this.color.getHex(); + + if ( this.roughness !== undefined ) data.roughness = this.roughness; + if ( this.metalness !== undefined ) data.metalness = this.metalness; + + if ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex(); + if ( this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity; + + if ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex(); + if ( this.shininess !== undefined ) data.shininess = this.shininess; + if ( this.clearCoat !== undefined ) data.clearCoat = this.clearCoat; + if ( this.clearCoatRoughness !== undefined ) data.clearCoatRoughness = this.clearCoatRoughness; + + if ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid; + if ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid; + if ( this.lightMap && this.lightMap.isTexture ) data.lightMap = this.lightMap.toJSON( meta ).uuid; + if ( this.bumpMap && this.bumpMap.isTexture ) { + + data.bumpMap = this.bumpMap.toJSON( meta ).uuid; + data.bumpScale = this.bumpScale; + + } + if ( this.normalMap && this.normalMap.isTexture ) { + + data.normalMap = this.normalMap.toJSON( meta ).uuid; + data.normalScale = this.normalScale.toArray(); + + } + if ( this.displacementMap && this.displacementMap.isTexture ) { + + data.displacementMap = this.displacementMap.toJSON( meta ).uuid; + data.displacementScale = this.displacementScale; + data.displacementBias = this.displacementBias; + + } + if ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid; + if ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid; + + if ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid; + if ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid; + + if ( this.envMap && this.envMap.isTexture ) { + + data.envMap = this.envMap.toJSON( meta ).uuid; + data.reflectivity = this.reflectivity; // Scale behind envMap + + } + + if ( this.gradientMap && this.gradientMap.isTexture ) { + + data.gradientMap = this.gradientMap.toJSON( meta ).uuid; + + } + + if ( this.size !== undefined ) data.size = this.size; + if ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation; + + if ( this.blending !== NormalBlending ) data.blending = this.blending; + if ( this.flatShading === true ) data.flatShading = this.flatShading; + if ( this.side !== FrontSide ) data.side = this.side; + if ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors; + + if ( this.opacity < 1 ) data.opacity = this.opacity; + if ( this.transparent === true ) data.transparent = this.transparent; + + data.depthFunc = this.depthFunc; + data.depthTest = this.depthTest; + data.depthWrite = this.depthWrite; + + // rotation (SpriteMaterial) + if ( this.rotation !== 0 ) data.rotation = this.rotation; + + if ( this.linewidth !== 1 ) data.linewidth = this.linewidth; + if ( this.dashSize !== undefined ) data.dashSize = this.dashSize; + if ( this.gapSize !== undefined ) data.gapSize = this.gapSize; + if ( this.scale !== undefined ) data.scale = this.scale; + + if ( this.dithering === true ) data.dithering = true; + + if ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest; + if ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha; + + if ( this.wireframe === true ) data.wireframe = this.wireframe; + if ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth; + if ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap; + if ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin; + + if ( this.morphTargets === true ) data.morphTargets = true; + if ( this.skinning === true ) data.skinning = true; + + if ( this.visible === false ) data.visible = false; + if ( JSON.stringify( this.userData ) !== '{}' ) data.userData = this.userData; + + // TODO: Copied from Object3D.toJSON + + function extractFromCache( cache ) { + + var values = []; + + for ( var key in cache ) { + + var data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + + return values; + + } + + if ( isRoot ) { + + var textures = extractFromCache( meta.textures ); + var images = extractFromCache( meta.images ); + + if ( textures.length > 0 ) data.textures = textures; + if ( images.length > 0 ) data.images = images; + + } + + return data; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.name = source.name; + + this.fog = source.fog; + this.lights = source.lights; + + this.blending = source.blending; + this.side = source.side; + this.flatShading = source.flatShading; + this.vertexColors = source.vertexColors; + + this.opacity = source.opacity; + this.transparent = source.transparent; + + 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.depthFunc = source.depthFunc; + this.depthTest = source.depthTest; + this.depthWrite = source.depthWrite; + + this.colorWrite = source.colorWrite; + + this.precision = source.precision; + + this.polygonOffset = source.polygonOffset; + this.polygonOffsetFactor = source.polygonOffsetFactor; + this.polygonOffsetUnits = source.polygonOffsetUnits; + + this.dithering = source.dithering; + + this.alphaTest = source.alphaTest; + this.premultipliedAlpha = source.premultipliedAlpha; + + this.overdraw = source.overdraw; + + this.visible = source.visible; + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + this.clipShadows = source.clipShadows; + this.clipIntersection = source.clipIntersection; + + var srcPlanes = source.clippingPlanes, + dstPlanes = null; + + if ( srcPlanes !== null ) { + + var n = srcPlanes.length; + dstPlanes = new Array( n ); + + for ( var i = 0; i !== n; ++ i ) + dstPlanes[ i ] = srcPlanes[ i ].clone(); + + } + + this.clippingPlanes = dstPlanes; + + this.shadowSide = source.shadowSide; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * depthTest: , + * depthWrite: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: + * } + */ + + function MeshBasicMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshBasicMaterial'; + + this.color = new Color( 0xffffff ); // emissive + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + + this.lights = false; + + this.setValues( parameters ); + + } + + MeshBasicMaterial.prototype = Object.create( Material.prototype ); + MeshBasicMaterial.prototype.constructor = MeshBasicMaterial; + + MeshBasicMaterial.prototype.isMeshBasicMaterial = true; + + MeshBasicMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + return this; + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * defines: { "label" : "value" }, + * uniforms: { "parameter1": { value: 1.0 }, "parameter2": { value2: 2 } }, + * + * fragmentShader: , + * vertexShader: , + * + * wireframe: , + * wireframeLinewidth: , + * + * lights: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function ShaderMaterial( parameters ) { + + Material.call( this ); + + this.type = 'ShaderMaterial'; + + this.defines = {}; + this.uniforms = {}; + + this.vertexShader = 'void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}'; + this.fragmentShader = 'void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}'; + + this.linewidth = 1; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; // set to use scene fog + this.lights = false; // set to use scene lights + this.clipping = false; // set to use user-defined clipping planes + + this.skinning = false; // set to use skinning attribute streams + this.morphTargets = false; // set to use morph targets + this.morphNormals = false; // set to use morph normals + + this.extensions = { + derivatives: false, // set to use derivatives + fragDepth: false, // set to use fragment depth values + drawBuffers: false, // set to use draw buffers + shaderTextureLOD: false // set to use shader texture LOD + }; + + // When rendered geometry doesn't include these attributes but the material does, + // use these default values in WebGL. This avoids errors when buffer data is missing. + this.defaultAttributeValues = { + 'color': [ 1, 1, 1 ], + 'uv': [ 0, 0 ], + 'uv2': [ 0, 0 ] + }; + + this.index0AttributeName = undefined; + this.uniformsNeedUpdate = false; + + if ( parameters !== undefined ) { + + if ( parameters.attributes !== undefined ) { + + console.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' ); + + } + + this.setValues( parameters ); + + } + + } + + ShaderMaterial.prototype = Object.create( Material.prototype ); + ShaderMaterial.prototype.constructor = ShaderMaterial; + + ShaderMaterial.prototype.isShaderMaterial = true; + + ShaderMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.fragmentShader = source.fragmentShader; + this.vertexShader = source.vertexShader; + + this.uniforms = UniformsUtils.clone( source.uniforms ); + + this.defines = Object.assign( {}, source.defines ); + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.lights = source.lights; + this.clipping = source.clipping; + + this.skinning = source.skinning; + + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + this.extensions = source.extensions; + + return this; + + }; + + ShaderMaterial.prototype.toJSON = function ( meta ) { + + var data = Material.prototype.toJSON.call( this, meta ); + + data.uniforms = this.uniforms; + data.vertexShader = this.vertexShader; + data.fragmentShader = this.fragmentShader; + + return data; + + }; + + /** + * @author bhouston / http://clara.io + */ + + function Ray( origin, direction ) { + + this.origin = ( origin !== undefined ) ? origin : new Vector3(); + this.direction = ( direction !== undefined ) ? direction : new Vector3(); + + } + + Object.assign( Ray.prototype, { + + set: function ( origin, direction ) { + + this.origin.copy( origin ); + this.direction.copy( direction ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( ray ) { + + this.origin.copy( ray.origin ); + this.direction.copy( ray.direction ); + + return this; + + }, + + at: function ( t, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Ray: .at() target is now required' ); + target = new Vector3(); + + } + + return target.copy( this.direction ).multiplyScalar( t ).add( this.origin ); + + }, + + lookAt: function ( v ) { + + this.direction.copy( v ).sub( this.origin ).normalize(); + + return this; + + }, + + recast: function () { + + var v1 = new Vector3(); + + return function recast( t ) { + + this.origin.copy( this.at( t, v1 ) ); + + return this; + + }; + + }(), + + closestPointToPoint: function ( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Ray: .closestPointToPoint() target is now required' ); + target = new Vector3(); + + } + + target.subVectors( point, this.origin ); + + var directionDistance = target.dot( this.direction ); + + if ( directionDistance < 0 ) { + + return target.copy( this.origin ); + + } + + return target.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + }, + + distanceToPoint: function ( point ) { + + return Math.sqrt( this.distanceSqToPoint( point ) ); + + }, + + distanceSqToPoint: function () { + + var v1 = new Vector3(); + + return function distanceSqToPoint( point ) { + + var directionDistance = v1.subVectors( point, this.origin ).dot( this.direction ); + + // point behind the ray + + if ( directionDistance < 0 ) { + + return this.origin.distanceToSquared( point ); + + } + + v1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + return v1.distanceToSquared( point ); + + }; + + }(), + + distanceSqToSegment: function () { + + var segCenter = new Vector3(); + var segDir = new Vector3(); + var diff = new Vector3(); + + return function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) { + + // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h + // It returns the min distance between the ray and the segment + // defined by v0 and v1 + // It can also set two optional targets : + // - The closest point on the ray + // - The closest point on the segment + + segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 ); + segDir.copy( v1 ).sub( v0 ).normalize(); + diff.copy( this.origin ).sub( segCenter ); + + var segExtent = v0.distanceTo( v1 ) * 0.5; + var a01 = - this.direction.dot( segDir ); + var b0 = diff.dot( this.direction ); + var b1 = - diff.dot( segDir ); + var c = diff.lengthSq(); + var det = Math.abs( 1 - a01 * a01 ); + var s0, s1, sqrDist, extDet; + + if ( det > 0 ) { + + // The ray and segment are not parallel. + + s0 = a01 * b1 - b0; + s1 = a01 * b0 - b1; + extDet = segExtent * det; + + if ( s0 >= 0 ) { + + if ( s1 >= - extDet ) { + + if ( s1 <= extDet ) { + + // region 0 + // Minimum at interior points of ray and segment. + + var invDet = 1 / det; + s0 *= invDet; + s1 *= invDet; + sqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c; + + } else { + + // region 1 + + s1 = segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + // region 5 + + s1 = - segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + if ( s1 <= - extDet ) { + + // region 4 + + s0 = Math.max( 0, - ( - a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } else if ( s1 <= extDet ) { + + // region 3 + + s0 = 0; + s1 = Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = s1 * ( s1 + 2 * b1 ) + c; + + } else { + + // region 2 + + s0 = Math.max( 0, - ( a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } + + } else { + + // Ray and segment are parallel. + + s1 = ( a01 > 0 ) ? - segExtent : segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + if ( optionalPointOnRay ) { + + optionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin ); + + } + + if ( optionalPointOnSegment ) { + + optionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter ); + + } + + return sqrDist; + + }; + + }(), + + intersectSphere: function () { + + var v1 = new Vector3(); + + return function intersectSphere( sphere, target ) { + + v1.subVectors( sphere.center, this.origin ); + var tca = v1.dot( this.direction ); + var d2 = v1.dot( v1 ) - tca * tca; + var radius2 = sphere.radius * sphere.radius; + + if ( d2 > radius2 ) return null; + + var thc = Math.sqrt( radius2 - d2 ); + + // t0 = first intersect point - entrance on front of sphere + var t0 = tca - thc; + + // t1 = second intersect point - exit point on back of sphere + var 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 ); + + }; + + }(), + + intersectsSphere: function ( sphere ) { + + return this.distanceToPoint( sphere.center ) <= sphere.radius; + + }, + + distanceToPlane: function ( plane ) { + + var 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; + + } + + var t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator; + + // Return if the ray never intersects the plane + + return t >= 0 ? t : null; + + }, + + intersectPlane: function ( plane, target ) { + + var t = this.distanceToPlane( plane ); + + if ( t === null ) { + + return null; + + } + + return this.at( t, target ); + + }, + + intersectsPlane: function ( plane ) { + + // check if the ray lies on the plane first + + var distToPoint = plane.distanceToPoint( this.origin ); + + if ( distToPoint === 0 ) { + + return true; + + } + + var 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; + + }, + + intersectBox: function ( box, target ) { + + var tmin, tmax, tymin, tymax, tzmin, tzmax; + + var invdirx = 1 / this.direction.x, + invdiry = 1 / this.direction.y, + invdirz = 1 / this.direction.z; + + var 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 ); + + }, + + intersectsBox: ( function () { + + var v = new Vector3(); + + return function intersectsBox( box ) { + + return this.intersectBox( box, v ) !== null; + + }; + + } )(), + + intersectTriangle: function () { + + // Compute the offset origin, edges, and normal. + var diff = new Vector3(); + var edge1 = new Vector3(); + var edge2 = new Vector3(); + var normal = new Vector3(); + + return function intersectTriangle( a, b, c, backfaceCulling, target ) { + + // from http://www.geometrictools.com/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) + var DdN = this.direction.dot( normal ); + var 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 ); + var DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) ); + + // b1 < 0, no intersection + if ( DdQxE2 < 0 ) { + + return null; + + } + + var 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. + var QdN = - sign * diff.dot( normal ); + + // t < 0, no intersection + if ( QdN < 0 ) { + + return null; + + } + + // Ray intersects triangle. + return this.at( QdN / DdN, target ); + + }; + + }(), + + applyMatrix4: function ( matrix4 ) { + + this.origin.applyMatrix4( matrix4 ); + this.direction.transformDirection( matrix4 ); + + return this; + + }, + + equals: function ( ray ) { + + return ray.origin.equals( this.origin ) && ray.direction.equals( this.direction ); + + } + + } ); + + /** + * @author bhouston / http://clara.io + */ + + function Line3( start, end ) { + + this.start = ( start !== undefined ) ? start : new Vector3(); + this.end = ( end !== undefined ) ? end : new Vector3(); + + } + + Object.assign( Line3.prototype, { + + set: function ( start, end ) { + + this.start.copy( start ); + this.end.copy( end ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( line ) { + + this.start.copy( line.start ); + this.end.copy( line.end ); + + return this; + + }, + + getCenter: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Line3: .getCenter() target is now required' ); + target = new Vector3(); + + } + + return target.addVectors( this.start, this.end ).multiplyScalar( 0.5 ); + + }, + + delta: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Line3: .delta() target is now required' ); + target = new Vector3(); + + } + + return target.subVectors( this.end, this.start ); + + }, + + distanceSq: function () { + + return this.start.distanceToSquared( this.end ); + + }, + + distance: function () { + + return this.start.distanceTo( this.end ); + + }, + + at: function ( t, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Line3: .at() target is now required' ); + target = new Vector3(); + + } + + return this.delta( target ).multiplyScalar( t ).add( this.start ); + + }, + + closestPointToPointParameter: function () { + + var startP = new Vector3(); + var startEnd = new Vector3(); + + return function closestPointToPointParameter( point, clampToLine ) { + + startP.subVectors( point, this.start ); + startEnd.subVectors( this.end, this.start ); + + var startEnd2 = startEnd.dot( startEnd ); + var startEnd_startP = startEnd.dot( startP ); + + var t = startEnd_startP / startEnd2; + + if ( clampToLine ) { + + t = _Math.clamp( t, 0, 1 ); + + } + + return t; + + }; + + }(), + + closestPointToPoint: function ( point, clampToLine, target ) { + + var t = this.closestPointToPointParameter( point, clampToLine ); + + if ( target === undefined ) { + + console.warn( 'THREE.Line3: .closestPointToPoint() target is now required' ); + target = new Vector3(); + + } + + return this.delta( target ).multiplyScalar( t ).add( this.start ); + + }, + + applyMatrix4: function ( matrix ) { + + this.start.applyMatrix4( matrix ); + this.end.applyMatrix4( matrix ); + + return this; + + }, + + equals: function ( line ) { + + return line.start.equals( this.start ) && line.end.equals( this.end ); + + } + + } ); + + /** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + + function Triangle( a, b, c ) { + + this.a = ( a !== undefined ) ? a : new Vector3(); + this.b = ( b !== undefined ) ? b : new Vector3(); + this.c = ( c !== undefined ) ? c : new Vector3(); + + } + + Object.assign( Triangle, { + + getNormal: function () { + + var v0 = new Vector3(); + + return function getNormal( a, b, c, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .getNormal() target is now required' ); + target = new Vector3(); + + } + + target.subVectors( c, b ); + v0.subVectors( a, b ); + target.cross( v0 ); + + var targetLengthSq = target.lengthSq(); + if ( targetLengthSq > 0 ) { + + return target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) ); + + } + + return target.set( 0, 0, 0 ); + + }; + + }(), + + // static/instance method to calculate barycentric coordinates + // based on: http://www.blackpawn.com/texts/pointinpoly/default.html + getBarycoord: function () { + + var v0 = new Vector3(); + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function getBarycoord( point, a, b, c, target ) { + + v0.subVectors( c, a ); + v1.subVectors( b, a ); + v2.subVectors( point, a ); + + 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 denom = ( dot00 * dot11 - dot01 * dot01 ); + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .getBarycoord() target is now required' ); + 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 target.set( - 2, - 1, - 1 ); + + } + + var invDenom = 1 / denom; + var u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom; + var v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom; + + // barycentric coordinates must always sum to 1 + return target.set( 1 - u - v, v, u ); + + }; + + }(), + + containsPoint: function () { + + var v1 = new Vector3(); + + return function containsPoint( point, a, b, c ) { + + Triangle.getBarycoord( point, a, b, c, v1 ); + + return ( v1.x >= 0 ) && ( v1.y >= 0 ) && ( ( v1.x + v1.y ) <= 1 ); + + }; + + }() + + } ); + + Object.assign( Triangle.prototype, { + + set: function ( a, b, c ) { + + this.a.copy( a ); + this.b.copy( b ); + this.c.copy( c ); + + return this; + + }, + + setFromPointsAndIndices: function ( points, i0, i1, i2 ) { + + this.a.copy( points[ i0 ] ); + this.b.copy( points[ i1 ] ); + this.c.copy( points[ i2 ] ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( triangle ) { + + this.a.copy( triangle.a ); + this.b.copy( triangle.b ); + this.c.copy( triangle.c ); + + return this; + + }, + + getArea: function () { + + var v0 = new Vector3(); + var v1 = new Vector3(); + + return function getArea() { + + v0.subVectors( this.c, this.b ); + v1.subVectors( this.a, this.b ); + + return v0.cross( v1 ).length() * 0.5; + + }; + + }(), + + getMidpoint: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .getMidpoint() target is now required' ); + target = new Vector3(); + + } + + return target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 ); + + }, + + getNormal: function ( target ) { + + return Triangle.getNormal( this.a, this.b, this.c, target ); + + }, + + getPlane: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .getPlane() target is now required' ); + target = new Vector3(); + + } + + return target.setFromCoplanarPoints( this.a, this.b, this.c ); + + }, + + getBarycoord: function ( point, target ) { + + return Triangle.getBarycoord( point, this.a, this.b, this.c, target ); + + }, + + containsPoint: function ( point ) { + + return Triangle.containsPoint( point, this.a, this.b, this.c ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsTriangle( this ); + + }, + + closestPointToPoint: function () { + + var plane = new Plane(); + var edgeList = [ new Line3(), new Line3(), new Line3() ]; + var projectedPoint = new Vector3(); + var closestPoint = new Vector3(); + + return function closestPointToPoint( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Triangle: .closestPointToPoint() target is now required' ); + target = new Vector3(); + + } + + var minDistance = Infinity; + + // project the point onto the plane of the triangle + + plane.setFromCoplanarPoints( this.a, this.b, this.c ); + plane.projectPoint( point, projectedPoint ); + + // check if the projection lies within the triangle + + if ( this.containsPoint( projectedPoint ) === true ) { + + // if so, this is the closest point + + target.copy( projectedPoint ); + + } else { + + // if not, the point falls outside the triangle. the target is the closest point to the triangle's edges or vertices + + edgeList[ 0 ].set( this.a, this.b ); + edgeList[ 1 ].set( this.b, this.c ); + edgeList[ 2 ].set( this.c, this.a ); + + for ( var i = 0; i < edgeList.length; i ++ ) { + + edgeList[ i ].closestPointToPoint( projectedPoint, true, closestPoint ); + + var distance = projectedPoint.distanceToSquared( closestPoint ); + + if ( distance < minDistance ) { + + minDistance = distance; + + target.copy( closestPoint ); + + } + + } + + } + + return target; + + }; + + }(), + + equals: function ( triangle ) { + + return triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author jonobr1 / http://jonobr1.com/ + */ + + function Mesh( geometry, material ) { + + Object3D.call( this ); + + this.type = 'Mesh'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } ); + + this.drawMode = TrianglesDrawMode; + + this.updateMorphTargets(); + + } + + Mesh.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Mesh, + + isMesh: true, + + setDrawMode: function ( value ) { + + this.drawMode = value; + + }, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.drawMode = source.drawMode; + + if ( source.morphTargetInfluences !== undefined ) { + + this.morphTargetInfluences = source.morphTargetInfluences.slice(); + + } + + if ( source.morphTargetDictionary !== undefined ) { + + this.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary ); + + } + + return this; + + }, + + updateMorphTargets: function () { + + var geometry = this.geometry; + var m, ml, name; + + if ( geometry.isBufferGeometry ) { + + var morphAttributes = geometry.morphAttributes; + var keys = Object.keys( morphAttributes ); + + if ( keys.length > 0 ) { + + var morphAttribute = morphAttributes[ keys[ 0 ] ]; + + if ( morphAttribute !== undefined ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( m = 0, ml = morphAttribute.length; m < ml; m ++ ) { + + name = morphAttribute[ m ].name || String( m ); + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ name ] = m; + + } + + } + + } + + } else { + + var morphTargets = geometry.morphTargets; + + if ( morphTargets !== undefined && morphTargets.length > 0 ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( m = 0, ml = morphTargets.length; m < ml; m ++ ) { + + name = morphTargets[ m ].name || String( m ); + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ name ] = m; + + } + + } + + } + + }, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + var vA = new Vector3(); + var vB = new Vector3(); + var vC = new Vector3(); + + var tempA = new Vector3(); + var tempB = new Vector3(); + var tempC = new Vector3(); + + var uvA = new Vector2(); + var uvB = new Vector2(); + var uvC = new Vector2(); + + var barycoord = new Vector3(); + + var intersectionPoint = new Vector3(); + var intersectionPointWorld = new Vector3(); + + function uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) { + + Triangle.getBarycoord( 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, raycaster, ray, pA, pB, pC, point ) { + + var intersect; + + if ( material.side === BackSide ) { + + intersect = ray.intersectTriangle( pC, pB, pA, true, point ); + + } else { + + intersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point ); + + } + + if ( intersect === null ) return null; + + intersectionPointWorld.copy( point ); + intersectionPointWorld.applyMatrix4( object.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( intersectionPointWorld ); + + if ( distance < raycaster.near || distance > raycaster.far ) return null; + + return { + distance: distance, + point: intersectionPointWorld.clone(), + object: object + }; + + } + + function checkBufferGeometryIntersection( object, raycaster, ray, position, uv, a, b, c ) { + + vA.fromBufferAttribute( position, a ); + vB.fromBufferAttribute( position, b ); + vC.fromBufferAttribute( position, c ); + + var intersection = checkIntersection( object, object.material, raycaster, ray, vA, vB, vC, intersectionPoint ); + + if ( intersection ) { + + if ( uv ) { + + uvA.fromBufferAttribute( uv, a ); + uvB.fromBufferAttribute( uv, b ); + uvC.fromBufferAttribute( uv, c ); + + intersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC ); + + } + + var face = new Face3( a, b, c ); + Triangle.getNormal( vA, vB, vC, face.normal ); + + intersection.face = face; + intersection.faceIndex = a; + + } + + return intersection; + + } + + return function raycast( raycaster, intersects ) { + + var geometry = this.geometry; + var material = this.material; + var matrixWorld = this.matrixWorld; + + if ( material === undefined ) return; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + // Check boundingBox before continuing + + if ( geometry.boundingBox !== null ) { + + if ( ray.intersectsBox( geometry.boundingBox ) === false ) return; + + } + + var intersection; + + if ( geometry.isBufferGeometry ) { + + var a, b, c; + var index = geometry.index; + var position = geometry.attributes.position; + var uv = geometry.attributes.uv; + var i, l; + + if ( index !== null ) { + + // indexed buffer geometry + + for ( i = 0, l = index.count; i < l; i += 3 ) { + + a = index.getX( i ); + b = index.getX( i + 1 ); + c = index.getX( i + 2 ); + + intersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( i / 3 ); // triangle number in indices buffer semantics + intersects.push( intersection ); + + } + + } + + } else if ( position !== undefined ) { + + // non-indexed buffer geometry + + for ( i = 0, l = position.count; i < l; i += 3 ) { + + a = i; + b = i + 1; + c = i + 2; + + intersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c ); + + if ( intersection ) intersects.push( intersection ); + + } + + } + + } else if ( geometry.isGeometry ) { + + var fvA, fvB, fvC; + var isMultiMaterial = Array.isArray( material ); + + var vertices = geometry.vertices; + var faces = geometry.faces; + var uvs; + + var faceVertexUvs = geometry.faceVertexUvs[ 0 ]; + if ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs; + + for ( var f = 0, fl = faces.length; f < fl; f ++ ) { + + var face = faces[ f ]; + var faceMaterial = isMultiMaterial ? material[ face.materialIndex ] : material; + + if ( faceMaterial === undefined ) continue; + + fvA = vertices[ face.a ]; + fvB = vertices[ face.b ]; + fvC = vertices[ face.c ]; + + if ( faceMaterial.morphTargets === true ) { + + var morphTargets = geometry.morphTargets; + var morphInfluences = this.morphTargetInfluences; + + vA.set( 0, 0, 0 ); + vB.set( 0, 0, 0 ); + vC.set( 0, 0, 0 ); + + for ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) { + + var influence = morphInfluences[ t ]; + + if ( influence === 0 ) continue; + + var targets = morphTargets[ t ].vertices; + + vA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence ); + vB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence ); + vC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence ); + + } + + vA.add( fvA ); + vB.add( fvB ); + vC.add( fvC ); + + fvA = vA; + fvB = vB; + fvC = vC; + + } + + intersection = checkIntersection( this, faceMaterial, raycaster, ray, fvA, fvB, fvC, intersectionPoint ); + + if ( intersection ) { + + if ( uvs && uvs[ f ] ) { + + var uvs_f = uvs[ f ]; + uvA.copy( uvs_f[ 0 ] ); + uvB.copy( uvs_f[ 1 ] ); + uvC.copy( uvs_f[ 2 ] ); + + intersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC ); + + } + + intersection.face = face; + intersection.faceIndex = f; + intersects.push( intersection ); + + } + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLBackground( renderer, state, geometries, premultipliedAlpha ) { + + var clearColor = new Color( 0x000000 ); + var clearAlpha = 0; + + var planeCamera, planeMesh; + var boxMesh; + + function render( renderList, scene, camera, forceClear ) { + + var background = scene.background; + + if ( background === null ) { + + setClear( clearColor, clearAlpha ); + + } else if ( background && background.isColor ) { + + setClear( background, 1 ); + forceClear = true; + + } + + if ( renderer.autoClear || forceClear ) { + + renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil ); + + } + + if ( background && background.isCubeTexture ) { + + if ( boxMesh === undefined ) { + + boxMesh = new Mesh( + new BoxBufferGeometry( 1, 1, 1 ), + new ShaderMaterial( { + uniforms: ShaderLib.cube.uniforms, + vertexShader: ShaderLib.cube.vertexShader, + fragmentShader: ShaderLib.cube.fragmentShader, + side: BackSide, + depthTest: true, + depthWrite: false, + fog: false + } ) + ); + + boxMesh.geometry.removeAttribute( 'normal' ); + boxMesh.geometry.removeAttribute( 'uv' ); + + boxMesh.onBeforeRender = function ( renderer, scene, camera ) { + + this.matrixWorld.copyPosition( camera.matrixWorld ); + + }; + + geometries.update( boxMesh.geometry ); + + } + + boxMesh.material.uniforms.tCube.value = background; + + renderList.push( boxMesh, boxMesh.geometry, boxMesh.material, 0, null ); + + } else if ( background && background.isTexture ) { + + if ( planeCamera === undefined ) { + + planeCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 ); + + planeMesh = new Mesh( + new PlaneBufferGeometry( 2, 2 ), + new MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false } ) + ); + + geometries.update( planeMesh.geometry ); + + } + + planeMesh.material.map = background; + + // TODO Push this to renderList + + renderer.renderBufferDirect( planeCamera, null, planeMesh.geometry, planeMesh.material, planeMesh, null ); + + } + + } + + function setClear( color, alpha ) { + + state.buffers.color.setClear( color.r, color.g, color.b, alpha, premultipliedAlpha ); + + } + + return { + + getClearColor: function () { + + return clearColor; + + }, + setClearColor: function ( color, alpha ) { + + clearColor.set( color ); + clearAlpha = alpha !== undefined ? alpha : 1; + setClear( clearColor, clearAlpha ); + + }, + getClearAlpha: function () { + + return clearAlpha; + + }, + setClearAlpha: function ( alpha ) { + + clearAlpha = alpha; + setClear( clearColor, clearAlpha ); + + }, + render: render + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLBufferRenderer( gl, extensions, info ) { + + var mode; + + function setMode( value ) { + + mode = value; + + } + + function render( start, count ) { + + gl.drawArrays( mode, start, count ); + + info.update( count, mode ); + + } + + function renderInstances( geometry, start, count ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + var position = geometry.attributes.position; + + if ( position.isInterleavedBufferAttribute ) { + + count = position.data.count; + + extension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount ); + + } else { + + extension.drawArraysInstancedANGLE( mode, start, count, geometry.maxInstancedCount ); + + } + + info.update( count, mode, geometry.maxInstancedCount ); + + } + + // + + this.setMode = setMode; + this.render = render; + this.renderInstances = renderInstances; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLCapabilities( gl, extensions, parameters ) { + + var maxAnisotropy; + + function getMaxAnisotropy() { + + if ( maxAnisotropy !== undefined ) return maxAnisotropy; + + var extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension !== null ) { + + maxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT ); + + } else { + + maxAnisotropy = 0; + + } + + return maxAnisotropy; + + } + + function getMaxPrecision( 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'; + + } + + var precision = parameters.precision !== undefined ? parameters.precision : 'highp'; + var maxPrecision = getMaxPrecision( precision ); + + if ( maxPrecision !== precision ) { + + console.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' ); + precision = maxPrecision; + + } + + var logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true; + + var maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS ); + var maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ); + var maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE ); + var maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE ); + + var maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); + var maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS ); + var maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS ); + var maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS ); + + var vertexTextures = maxVertexTextures > 0; + var floatFragmentTextures = !! extensions.get( 'OES_texture_float' ); + var floatVertexTextures = vertexTextures && floatFragmentTextures; + + return { + + getMaxAnisotropy: getMaxAnisotropy, + getMaxPrecision: getMaxPrecision, + + precision: precision, + logarithmicDepthBuffer: logarithmicDepthBuffer, + + maxTextures: maxTextures, + maxVertexTextures: maxVertexTextures, + maxTextureSize: maxTextureSize, + maxCubemapSize: maxCubemapSize, + + maxAttributes: maxAttributes, + maxVertexUniforms: maxVertexUniforms, + maxVaryings: maxVaryings, + maxFragmentUniforms: maxFragmentUniforms, + + vertexTextures: vertexTextures, + floatFragmentTextures: floatFragmentTextures, + floatVertexTextures: floatVertexTextures + + }; + + } + + /** + * @author tschw + */ + + function WebGLClipping() { + + var scope = this, + + globalState = null, + numGlobalPlanes = 0, + localClippingEnabled = false, + renderingShadows = false, + + plane = new Plane(), + viewNormalMatrix = new Matrix3(), + + uniform = { value: null, needsUpdate: false }; + + this.uniform = uniform; + this.numPlanes = 0; + this.numIntersection = 0; + + this.init = function ( planes, enableLocalClipping, camera ) { + + var enabled = + planes.length !== 0 || + enableLocalClipping || + // enable state of previous frame - the clipping code has to + // run another frame in order to reset the state: + numGlobalPlanes !== 0 || + localClippingEnabled; + + localClippingEnabled = enableLocalClipping; + + globalState = projectPlanes( planes, camera, 0 ); + numGlobalPlanes = planes.length; + + return enabled; + + }; + + this.beginShadows = function () { + + renderingShadows = true; + projectPlanes( null ); + + }; + + this.endShadows = function () { + + renderingShadows = false; + resetGlobalState(); + + }; + + this.setState = function ( planes, clipIntersection, clipShadows, camera, cache, fromCache ) { + + if ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) { + + // there's no local clipping + + if ( renderingShadows ) { + + // there's no global clipping + + projectPlanes( null ); + + } else { + + resetGlobalState(); + + } + + } else { + + var nGlobal = renderingShadows ? 0 : numGlobalPlanes, + lGlobal = nGlobal * 4, + + dstArray = cache.clippingState || null; + + uniform.value = dstArray; // ensure unique state + + dstArray = projectPlanes( planes, camera, lGlobal, fromCache ); + + for ( var i = 0; i !== lGlobal; ++ i ) { + + dstArray[ i ] = globalState[ i ]; + + } + + cache.clippingState = dstArray; + this.numIntersection = clipIntersection ? this.numPlanes : 0; + this.numPlanes += nGlobal; + + } + + + }; + + function resetGlobalState() { + + if ( uniform.value !== globalState ) { + + uniform.value = globalState; + uniform.needsUpdate = numGlobalPlanes > 0; + + } + + scope.numPlanes = numGlobalPlanes; + scope.numIntersection = 0; + + } + + function projectPlanes( planes, camera, dstOffset, skipTransform ) { + + var nPlanes = planes !== null ? planes.length : 0, + dstArray = null; + + if ( nPlanes !== 0 ) { + + dstArray = uniform.value; + + if ( skipTransform !== true || dstArray === null ) { + + var flatSize = dstOffset + nPlanes * 4, + viewMatrix = camera.matrixWorldInverse; + + viewNormalMatrix.getNormalMatrix( viewMatrix ); + + if ( dstArray === null || dstArray.length < flatSize ) { + + dstArray = new Float32Array( flatSize ); + + } + + for ( var i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) { + + plane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix ); + + plane.normal.toArray( dstArray, i4 ); + dstArray[ i4 + 3 ] = plane.constant; + + } + + } + + uniform.value = dstArray; + uniform.needsUpdate = true; + + } + + scope.numPlanes = nPlanes; + + return dstArray; + + } + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLExtensions( gl ) { + + var extensions = {}; + + return { + + get: function ( name ) { + + if ( extensions[ name ] !== undefined ) { + + return extensions[ name ]; + + } + + var extension; + + switch ( name ) { + + case 'WEBGL_depth_texture': + extension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' ); + break; + + case 'EXT_texture_filter_anisotropic': + extension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' ); + break; + + case 'WEBGL_compressed_texture_s3tc': + extension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' ); + break; + + case 'WEBGL_compressed_texture_pvrtc': + extension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' ); + break; + + default: + extension = gl.getExtension( name ); + + } + + if ( extension === null ) { + + console.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' ); + + } + + extensions[ name ] = extension; + + return extension; + + } + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLGeometries( gl, attributes, info ) { + + var geometries = {}; + var wireframeAttributes = {}; + + function onGeometryDispose( event ) { + + var geometry = event.target; + var buffergeometry = geometries[ geometry.id ]; + + if ( buffergeometry.index !== null ) { + + attributes.remove( buffergeometry.index ); + + } + + for ( var name in buffergeometry.attributes ) { + + attributes.remove( buffergeometry.attributes[ name ] ); + + } + + geometry.removeEventListener( 'dispose', onGeometryDispose ); + + delete geometries[ geometry.id ]; + + // TODO Remove duplicate code + + var attribute = wireframeAttributes[ geometry.id ]; + + if ( attribute ) { + + attributes.remove( attribute ); + delete wireframeAttributes[ geometry.id ]; + + } + + attribute = wireframeAttributes[ buffergeometry.id ]; + + if ( attribute ) { + + attributes.remove( attribute ); + delete wireframeAttributes[ buffergeometry.id ]; + + } + + // + + info.memory.geometries --; + + } + + function get( object, geometry ) { + + var buffergeometry = geometries[ geometry.id ]; + + if ( buffergeometry ) return buffergeometry; + + geometry.addEventListener( 'dispose', onGeometryDispose ); + + if ( geometry.isBufferGeometry ) { + + buffergeometry = geometry; + + } else if ( geometry.isGeometry ) { + + if ( geometry._bufferGeometry === undefined ) { + + geometry._bufferGeometry = new BufferGeometry().setFromObject( object ); + + } + + buffergeometry = geometry._bufferGeometry; + + } + + geometries[ geometry.id ] = buffergeometry; + + info.memory.geometries ++; + + return buffergeometry; + + } + + function update( geometry ) { + + var index = geometry.index; + var geometryAttributes = geometry.attributes; + + if ( index !== null ) { + + attributes.update( index, gl.ELEMENT_ARRAY_BUFFER ); + + } + + for ( var name in geometryAttributes ) { + + attributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER ); + + } + + // morph targets + + var morphAttributes = geometry.morphAttributes; + + for ( var name in morphAttributes ) { + + var array = morphAttributes[ name ]; + + for ( var i = 0, l = array.length; i < l; i ++ ) { + + attributes.update( array[ i ], gl.ARRAY_BUFFER ); + + } + + } + + } + + function getWireframeAttribute( geometry ) { + + var attribute = wireframeAttributes[ geometry.id ]; + + if ( attribute ) return attribute; + + var indices = []; + + var geometryIndex = geometry.index; + var geometryAttributes = geometry.attributes; + + // console.time( 'wireframe' ); + + if ( geometryIndex !== null ) { + + var array = geometryIndex.array; + + for ( var i = 0, l = array.length; i < l; i += 3 ) { + + var a = array[ i + 0 ]; + var b = array[ i + 1 ]; + var c = array[ i + 2 ]; + + indices.push( a, b, b, c, c, a ); + + } + + } else { + + var array = geometryAttributes.position.array; + + for ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) { + + var a = i + 0; + var b = i + 1; + var c = i + 2; + + indices.push( a, b, b, c, c, a ); + + } + + } + + // console.timeEnd( 'wireframe' ); + + attribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 ); + + attributes.update( attribute, gl.ELEMENT_ARRAY_BUFFER ); + + wireframeAttributes[ geometry.id ] = attribute; + + return attribute; + + } + + return { + + get: get, + update: update, + + getWireframeAttribute: getWireframeAttribute + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLIndexedBufferRenderer( gl, extensions, info ) { + + var mode; + + function setMode( value ) { + + mode = value; + + } + + var type, bytesPerElement; + + function setIndex( value ) { + + type = value.type; + bytesPerElement = value.bytesPerElement; + + } + + function render( start, count ) { + + gl.drawElements( mode, count, type, start * bytesPerElement ); + + info.update( count, mode ); + + } + + function renderInstances( geometry, start, count ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + extension.drawElementsInstancedANGLE( mode, count, type, start * bytesPerElement, geometry.maxInstancedCount ); + + info.update( count, mode, geometry.maxInstancedCount ); + + } + + // + + this.setMode = setMode; + this.setIndex = setIndex; + this.render = render; + this.renderInstances = renderInstances; + + } + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function WebGLInfo( gl ) { + + var memory = { + geometries: 0, + textures: 0 + }; + + var render = { + frame: 0, + calls: 0, + triangles: 0, + points: 0, + lines: 0 + }; + + function update( count, mode, instanceCount ) { + + instanceCount = instanceCount || 1; + + render.calls ++; + + switch ( mode ) { + + case gl.TRIANGLES: + render.triangles += instanceCount * ( count / 3 ); + break; + + case gl.TRIANGLE_STRIP: + case gl.TRIANGLE_FAN: + render.triangles += instanceCount * ( count - 2 ); + break; + + case gl.LINES: + render.lines += instanceCount * ( count / 2 ); + break; + + case gl.LINE_STRIP: + render.lines += instanceCount * ( count - 1 ); + break; + + case gl.LINE_LOOP: + render.lines += instanceCount * count; + break; + + case gl.POINTS: + render.points += instanceCount * count; + break; + + default: + console.error( 'THREE.WebGLInfo: Unknown draw mode:', mode ); + break; + + } + + } + + function reset() { + + render.frame ++; + render.calls = 0; + render.triangles = 0; + render.points = 0; + render.lines = 0; + + } + + return { + memory: memory, + render: render, + programs: null, + autoReset: true, + reset: reset, + update: update + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function absNumericalSort( a, b ) { + + return Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] ); + + } + + function WebGLMorphtargets( gl ) { + + var influencesList = {}; + var morphInfluences = new Float32Array( 8 ); + + function update( object, geometry, material, program ) { + + var objectInfluences = object.morphTargetInfluences; + + var length = objectInfluences.length; + + var influences = influencesList[ geometry.id ]; + + if ( influences === undefined ) { + + // initialise list + + influences = []; + + for ( var i = 0; i < length; i ++ ) { + + influences[ i ] = [ i, 0 ]; + + } + + influencesList[ geometry.id ] = influences; + + } + + var morphTargets = material.morphTargets && geometry.morphAttributes.position; + var morphNormals = material.morphNormals && geometry.morphAttributes.normal; + + // Remove current morphAttributes + + for ( var i = 0; i < length; i ++ ) { + + var influence = influences[ i ]; + + if ( influence[ 1 ] !== 0 ) { + + if ( morphTargets ) geometry.removeAttribute( 'morphTarget' + i ); + if ( morphNormals ) geometry.removeAttribute( 'morphNormal' + i ); + + } + + } + + // Collect influences + + for ( var i = 0; i < length; i ++ ) { + + var influence = influences[ i ]; + + influence[ 0 ] = i; + influence[ 1 ] = objectInfluences[ i ]; + + } + + influences.sort( absNumericalSort ); + + // Add morphAttributes + + for ( var i = 0; i < 8; i ++ ) { + + var influence = influences[ i ]; + + if ( influence ) { + + var index = influence[ 0 ]; + var value = influence[ 1 ]; + + if ( value ) { + + if ( morphTargets ) geometry.addAttribute( 'morphTarget' + i, morphTargets[ index ] ); + if ( morphNormals ) geometry.addAttribute( 'morphNormal' + i, morphNormals[ index ] ); + + morphInfluences[ i ] = value; + continue; + + } + + } + + morphInfluences[ i ] = 0; + + } + + program.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences ); + + } + + return { + + update: update + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLObjects( geometries, info ) { + + var updateList = {}; + + function update( object ) { + + var frame = info.render.frame; + + var geometry = object.geometry; + var buffergeometry = geometries.get( object, geometry ); + + // Update once per frame + + if ( updateList[ buffergeometry.id ] !== frame ) { + + if ( geometry.isGeometry ) { + + buffergeometry.updateFromObject( object ); + + } + + geometries.update( buffergeometry ); + + updateList[ buffergeometry.id ] = frame; + + } + + return buffergeometry; + + } + + function dispose() { + + updateList = {}; + + } + + return { + + update: update, + dispose: dispose + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { + + images = images !== undefined ? images : []; + mapping = mapping !== undefined ? mapping : CubeReflectionMapping; + + Texture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.flipY = false; + + } + + CubeTexture.prototype = Object.create( Texture.prototype ); + CubeTexture.prototype.constructor = CubeTexture; + + CubeTexture.prototype.isCubeTexture = true; + + Object.defineProperty( CubeTexture.prototype, 'images', { + + get: function () { + + return this.image; + + }, + + set: function ( value ) { + + this.image = value; + + } + + } ); + + /** + * @author tschw + * + * Uniforms of a program. + * Those form a tree structure with a special top-level container for the root, + * which you get by calling 'new WebGLUniforms( gl, program, renderer )'. + * + * + * Properties of inner nodes including the top-level container: + * + * .seq - array of nested uniforms + * .map - nested uniforms by name + * + * + * Methods of all nodes except the top-level container: + * + * .setValue( gl, value, [renderer] ) + * + * uploads a uniform value(s) + * the 'renderer' parameter is needed for sampler uniforms + * + * + * Static methods of the top-level container (renderer factorizations): + * + * .upload( gl, seq, values, renderer ) + * + * sets uniforms in 'seq' to 'values[id].value' + * + * .seqWithValue( seq, values ) : filteredSeq + * + * filters 'seq' entries with corresponding entry in values + * + * + * Methods of the top-level container (renderer factorizations): + * + * .setValue( gl, name, value ) + * + * sets uniform with name 'name' to 'value' + * + * .set( gl, obj, prop ) + * + * sets uniform from object and property with same name than uniform + * + * .setOptional( gl, obj, prop ) + * + * like .set for an optional property of the object + * + */ + + var emptyTexture = new Texture(); + var emptyCubeTexture = new CubeTexture(); + + // --- Base for inner nodes (including the root) --- + + function UniformContainer() { + + this.seq = []; + this.map = {}; + + } + + // --- Utilities --- + + // Array Caches (provide typed arrays for temporary by size) + + var arrayCacheF32 = []; + var arrayCacheI32 = []; + + // Float32Array caches used for uploading Matrix uniforms + + var mat4array = new Float32Array( 16 ); + var mat3array = new Float32Array( 9 ); + + // Flattening for arrays of vectors and matrices + + function flatten( array, nBlocks, blockSize ) { + + var firstElem = array[ 0 ]; + + if ( firstElem <= 0 || firstElem > 0 ) return array; + // unoptimized: ! isNaN( firstElem ) + // see http://jacksondunstan.com/articles/983 + + var n = nBlocks * blockSize, + r = arrayCacheF32[ n ]; + + if ( r === undefined ) { + + r = new Float32Array( n ); + arrayCacheF32[ n ] = r; + + } + + if ( nBlocks !== 0 ) { + + firstElem.toArray( r, 0 ); + + for ( var i = 1, offset = 0; i !== nBlocks; ++ i ) { + + offset += blockSize; + array[ i ].toArray( r, offset ); + + } + + } + + return r; + + } + + // Texture unit allocation + + function allocTexUnits( renderer, n ) { + + var r = arrayCacheI32[ n ]; + + if ( r === undefined ) { + + r = new Int32Array( n ); + arrayCacheI32[ n ] = r; + + } + + for ( var i = 0; i !== n; ++ i ) + r[ i ] = renderer.allocTextureUnit(); + + return r; + + } + + // --- Setters --- + + // Note: Defining these methods externally, because they come in a bunch + // and this way their names minify. + + // Single scalar + + function setValue1f( gl, v ) { + + gl.uniform1f( this.addr, v ); + + } + + function setValue1i( gl, v ) { + + gl.uniform1i( this.addr, v ); + + } + + // Single float vector (from flat array or THREE.VectorN) + + function setValue2fv( gl, v ) { + + if ( v.x === undefined ) { + + gl.uniform2fv( this.addr, v ); + + } else { + + gl.uniform2f( this.addr, v.x, v.y ); + + } + + } + + function setValue3fv( gl, v ) { + + if ( v.x !== undefined ) { + + gl.uniform3f( this.addr, v.x, v.y, v.z ); + + } else if ( v.r !== undefined ) { + + gl.uniform3f( this.addr, v.r, v.g, v.b ); + + } else { + + gl.uniform3fv( this.addr, v ); + + } + + } + + function setValue4fv( gl, v ) { + + if ( v.x === undefined ) { + + gl.uniform4fv( this.addr, v ); + + } else { + + gl.uniform4f( this.addr, v.x, v.y, v.z, v.w ); + + } + + } + + // Single matrix (from flat array or MatrixN) + + function setValue2fm( gl, v ) { + + gl.uniformMatrix2fv( this.addr, false, v.elements || v ); + + } + + function setValue3fm( gl, v ) { + + if ( v.elements === undefined ) { + + gl.uniformMatrix3fv( this.addr, false, v ); + + } else { + + mat3array.set( v.elements ); + gl.uniformMatrix3fv( this.addr, false, mat3array ); + + } + + } + + function setValue4fm( gl, v ) { + + if ( v.elements === undefined ) { + + gl.uniformMatrix4fv( this.addr, false, v ); + + } else { + + mat4array.set( v.elements ); + gl.uniformMatrix4fv( this.addr, false, mat4array ); + + } + + } + + // Single texture (2D / Cube) + + function setValueT1( gl, v, renderer ) { + + var unit = renderer.allocTextureUnit(); + gl.uniform1i( this.addr, unit ); + renderer.setTexture2D( v || emptyTexture, unit ); + + } + + function setValueT6( gl, v, renderer ) { + + var unit = renderer.allocTextureUnit(); + gl.uniform1i( this.addr, unit ); + renderer.setTextureCube( v || emptyCubeTexture, unit ); + + } + + // Integer / Boolean vectors or arrays thereof (always flat arrays) + + function setValue2iv( gl, v ) { + + gl.uniform2iv( this.addr, v ); + + } + + function setValue3iv( gl, v ) { + + gl.uniform3iv( this.addr, v ); + + } + + function setValue4iv( gl, v ) { + + gl.uniform4iv( this.addr, v ); + + } + + // Helper to pick the right setter for the singular case + + function getSingularSetter( type ) { + + switch ( type ) { + + case 0x1406: return setValue1f; // FLOAT + case 0x8b50: return setValue2fv; // _VEC2 + case 0x8b51: return setValue3fv; // _VEC3 + case 0x8b52: return setValue4fv; // _VEC4 + + case 0x8b5a: return setValue2fm; // _MAT2 + case 0x8b5b: return setValue3fm; // _MAT3 + case 0x8b5c: return setValue4fm; // _MAT4 + + case 0x8b5e: case 0x8d66: return setValueT1; // SAMPLER_2D, SAMPLER_EXTERNAL_OES + case 0x8b60: return setValueT6; // SAMPLER_CUBE + + case 0x1404: case 0x8b56: return setValue1i; // INT, BOOL + case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2 + case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3 + case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4 + + } + + } + + // Array of scalars + + function setValue1fv( gl, v ) { + + gl.uniform1fv( this.addr, v ); + + } + function setValue1iv( gl, v ) { + + gl.uniform1iv( this.addr, v ); + + } + + // Array of vectors (flat or from THREE classes) + + function setValueV2a( gl, v ) { + + gl.uniform2fv( this.addr, flatten( v, this.size, 2 ) ); + + } + + function setValueV3a( gl, v ) { + + gl.uniform3fv( this.addr, flatten( v, this.size, 3 ) ); + + } + + function setValueV4a( gl, v ) { + + gl.uniform4fv( this.addr, flatten( v, this.size, 4 ) ); + + } + + // Array of matrices (flat or from THREE clases) + + function setValueM2a( gl, v ) { + + gl.uniformMatrix2fv( this.addr, false, flatten( v, this.size, 4 ) ); + + } + + function setValueM3a( gl, v ) { + + gl.uniformMatrix3fv( this.addr, false, flatten( v, this.size, 9 ) ); + + } + + function setValueM4a( gl, v ) { + + gl.uniformMatrix4fv( this.addr, false, flatten( v, this.size, 16 ) ); + + } + + // Array of textures (2D / Cube) + + function setValueT1a( gl, v, renderer ) { + + var n = v.length, + units = allocTexUnits( renderer, n ); + + gl.uniform1iv( this.addr, units ); + + for ( var i = 0; i !== n; ++ i ) { + + renderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] ); + + } + + } + + function setValueT6a( gl, v, renderer ) { + + var n = v.length, + units = allocTexUnits( renderer, n ); + + gl.uniform1iv( this.addr, units ); + + for ( var i = 0; i !== n; ++ i ) { + + renderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] ); + + } + + } + + // Helper to pick the right setter for a pure (bottom-level) array + + function getPureArraySetter( type ) { + + switch ( type ) { + + case 0x1406: return setValue1fv; // FLOAT + case 0x8b50: return setValueV2a; // _VEC2 + case 0x8b51: return setValueV3a; // _VEC3 + case 0x8b52: return setValueV4a; // _VEC4 + + case 0x8b5a: return setValueM2a; // _MAT2 + case 0x8b5b: return setValueM3a; // _MAT3 + case 0x8b5c: return setValueM4a; // _MAT4 + + case 0x8b5e: return setValueT1a; // SAMPLER_2D + case 0x8b60: return setValueT6a; // SAMPLER_CUBE + + case 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL + case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2 + case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3 + case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4 + + } + + } + + // --- Uniform Classes --- + + function SingleUniform( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.setValue = getSingularSetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + + } + + function PureArrayUniform( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.size = activeInfo.size; + this.setValue = getPureArraySetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + + } + + function StructuredUniform( id ) { + + this.id = id; + + UniformContainer.call( this ); // mix-in + + } + + StructuredUniform.prototype.setValue = function ( gl, value ) { + + // Note: Don't need an extra 'renderer' parameter, since samplers + // are not allowed in structured uniforms. + + var seq = this.seq; + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ]; + u.setValue( gl, value[ u.id ] ); + + } + + }; + + // --- Top-level --- + + // Parser - builds up the property tree from the path strings + + var RePathPart = /([\w\d_]+)(\])?(\[|\.)?/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; + + } + + function parseUniform( activeInfo, addr, container ) { + + var path = activeInfo.name, + pathLength = path.length; + + // reset RegExp object, because of the early exit of a previous run + RePathPart.lastIndex = 0; + + for ( ; ; ) { + + var match = RePathPart.exec( path ), + matchEnd = RePathPart.lastIndex, + + id = match[ 1 ], + 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( id, activeInfo, addr ) : + new PureArrayUniform( id, activeInfo, addr ) ); + + break; + + } else { + + // step into inner node / create it in case it doesn't exist + + var map = container.map, next = map[ id ]; + + if ( next === undefined ) { + + next = new StructuredUniform( id ); + addUniform( container, next ); + + } + + container = next; + + } + + } + + } + + // Root Container + + function WebGLUniforms( gl, program, renderer ) { + + UniformContainer.call( this ); + + this.renderer = renderer; + + var n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS ); + + for ( var i = 0; i < n; ++ i ) { + + var info = gl.getActiveUniform( program, i ), + addr = gl.getUniformLocation( program, info.name ); + + parseUniform( info, addr, this ); + + } + + } + + WebGLUniforms.prototype.setValue = function ( gl, name, value ) { + + var u = this.map[ name ]; + + if ( u !== undefined ) u.setValue( gl, value, this.renderer ); + + }; + + WebGLUniforms.prototype.setOptional = function ( gl, object, name ) { + + var v = object[ name ]; + + if ( v !== undefined ) this.setValue( gl, name, v ); + + }; + + + // Static interface + + WebGLUniforms.upload = function ( gl, seq, values, renderer ) { + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ], + v = values[ u.id ]; + + if ( v.needsUpdate !== false ) { + + // note: always updating when .needsUpdate is undefined + u.setValue( gl, v.value, renderer ); + + } + + } + + }; + + WebGLUniforms.seqWithValue = function ( seq, values ) { + + var r = []; + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ]; + if ( u.id in values ) r.push( u ); + + } + + return r; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function addLineNumbers( string ) { + + var lines = string.split( '\n' ); + + for ( var i = 0; i < lines.length; i ++ ) { + + lines[ i ] = ( i + 1 ) + ': ' + lines[ i ]; + + } + + return lines.join( '\n' ); + + } + + function WebGLShader( gl, type, string ) { + + var shader = gl.createShader( type ); + + gl.shaderSource( shader, string ); + gl.compileShader( shader ); + + if ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) { + + console.error( 'THREE.WebGLShader: Shader couldn\'t compile.' ); + + } + + if ( gl.getShaderInfoLog( shader ) !== '' ) { + + console.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) ); + + } + + // --enable-privileged-webgl-extension + // console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) ); + + return shader; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var programIdCount = 0; + + function getEncodingComponents( encoding ) { + + switch ( encoding ) { + + case LinearEncoding: + return [ 'Linear', '( value )' ]; + case sRGBEncoding: + return [ 'sRGB', '( value )' ]; + case RGBEEncoding: + return [ 'RGBE', '( value )' ]; + case RGBM7Encoding: + return [ 'RGBM', '( value, 7.0 )' ]; + case RGBM16Encoding: + return [ 'RGBM', '( value, 16.0 )' ]; + case RGBDEncoding: + return [ 'RGBD', '( value, 256.0 )' ]; + case GammaEncoding: + return [ 'Gamma', '( value, float( GAMMA_FACTOR ) )' ]; + default: + throw new Error( 'unsupported encoding: ' + encoding ); + + } + + } + + function getTexelDecodingFunction( functionName, encoding ) { + + var components = getEncodingComponents( encoding ); + return 'vec4 ' + functionName + '( vec4 value ) { return ' + components[ 0 ] + 'ToLinear' + components[ 1 ] + '; }'; + + } + + function getTexelEncodingFunction( functionName, encoding ) { + + var components = getEncodingComponents( encoding ); + return 'vec4 ' + functionName + '( vec4 value ) { return LinearTo' + components[ 0 ] + components[ 1 ] + '; }'; + + } + + function getToneMappingFunction( functionName, toneMapping ) { + + var toneMappingName; + + switch ( toneMapping ) { + + case LinearToneMapping: + toneMappingName = 'Linear'; + break; + + case ReinhardToneMapping: + toneMappingName = 'Reinhard'; + break; + + case Uncharted2ToneMapping: + toneMappingName = 'Uncharted2'; + break; + + case CineonToneMapping: + toneMappingName = 'OptimizedCineon'; + break; + + default: + throw new Error( 'unsupported toneMapping: ' + toneMapping ); + + } + + return 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }'; + + } + + function generateExtensions( extensions, parameters, rendererExtensions ) { + + extensions = extensions || {}; + + var chunks = [ + ( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '', + ( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '', + ( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '', + ( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : '' + ]; + + return chunks.filter( filterEmptyLine ).join( '\n' ); + + } + + function generateDefines( defines ) { + + var chunks = []; + + for ( var name in defines ) { + + var value = defines[ name ]; + + if ( value === false ) continue; + + chunks.push( '#define ' + name + ' ' + value ); + + } + + return chunks.join( '\n' ); + + } + + function fetchAttributeLocations( gl, program ) { + + var attributes = {}; + + var n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES ); + + for ( var i = 0; i < n; i ++ ) { + + var info = gl.getActiveAttrib( program, i ); + var name = info.name; + + // console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i ); + + attributes[ name ] = gl.getAttribLocation( program, name ); + + } + + return attributes; + + } + + function filterEmptyLine( string ) { + + return string !== ''; + + } + + function replaceLightNums( string, parameters ) { + + return string + .replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights ) + .replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights ) + .replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights ) + .replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights ) + .replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights ); + + } + + function replaceClippingPlaneNums( string, parameters ) { + + return string + .replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes ) + .replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) ); + + } + + function parseIncludes( string ) { + + var pattern = /^[ \t]*#include +<([\w\d.]+)>/gm; + + function replace( match, include ) { + + var replace = ShaderChunk[ include ]; + + if ( replace === undefined ) { + + throw new Error( 'Can not resolve #include <' + include + '>' ); + + } + + return parseIncludes( replace ); + + } + + return string.replace( pattern, replace ); + + } + + function unrollLoops( string ) { + + var pattern = /#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g; + + function replace( match, start, end, snippet ) { + + var unroll = ''; + + for ( var i = parseInt( start ); i < parseInt( end ); i ++ ) { + + unroll += snippet.replace( /\[ i \]/g, '[ ' + i + ' ]' ); + + } + + return unroll; + + } + + return string.replace( pattern, replace ); + + } + + function WebGLProgram( renderer, extensions, code, material, shader, parameters ) { + + var gl = renderer.context; + + var defines = material.defines; + + var vertexShader = shader.vertexShader; + var fragmentShader = shader.fragmentShader; + + var shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC'; + + if ( parameters.shadowMapType === PCFShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF'; + + } else if ( parameters.shadowMapType === PCFSoftShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT'; + + } + + var envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + var envMapModeDefine = 'ENVMAP_MODE_REFLECTION'; + var envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + + if ( parameters.envMap ) { + + switch ( material.envMap.mapping ) { + + case CubeReflectionMapping: + case CubeRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + break; + + case CubeUVReflectionMapping: + case CubeUVRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV'; + break; + + case EquirectangularReflectionMapping: + case EquirectangularRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_EQUIREC'; + break; + + case SphericalReflectionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_SPHERE'; + break; + + } + + switch ( material.envMap.mapping ) { + + case CubeRefractionMapping: + case EquirectangularRefractionMapping: + envMapModeDefine = 'ENVMAP_MODE_REFRACTION'; + break; + + } + + switch ( material.combine ) { + + case MultiplyOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + break; + + case MixOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MIX'; + break; + + case AddOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_ADD'; + break; + + } + + } + + var gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0; + + // console.log( 'building new program ' ); + + // + + var customExtensions = generateExtensions( material.extensions, parameters, extensions ); + + var customDefines = generateDefines( defines ); + + // + + var program = gl.createProgram(); + + var prefixVertex, prefixFragment; + + if ( material.isRawShaderMaterial ) { + + prefixVertex = [ + + customDefines + + ].filter( filterEmptyLine ).join( '\n' ); + + if ( prefixVertex.length > 0 ) { + + prefixVertex += '\n'; + + } + + prefixFragment = [ + + customExtensions, + customDefines + + ].filter( filterEmptyLine ).join( '\n' ); + + if ( prefixFragment.length > 0 ) { + + prefixFragment += '\n'; + + } + + } else { + + prefixVertex = [ + + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + shader.name, + + customDefines, + + parameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '', + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + '#define MAX_BONES ' + parameters.maxBones, + ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', + ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + parameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.skinning ? '#define USE_SKINNING' : '', + parameters.useVertexTexture ? '#define BONE_TEXTURE' : '', + + parameters.morphTargets ? '#define USE_MORPHTARGETS' : '', + parameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '', + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + 'uniform mat4 modelMatrix;', + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform mat4 viewMatrix;', + 'uniform mat3 normalMatrix;', + 'uniform vec3 cameraPosition;', + + 'attribute vec3 position;', + 'attribute vec3 normal;', + 'attribute vec2 uv;', + + '#ifdef USE_COLOR', + + ' attribute vec3 color;', + + '#endif', + + '#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', + + '#ifdef USE_SKINNING', + + ' attribute vec4 skinIndex;', + ' attribute vec4 skinWeight;', + + '#endif', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + prefixFragment = [ + + customExtensions, + + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + shader.name, + + customDefines, + + parameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '', + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', + ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapTypeDefine : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.envMap ? '#define ' + envMapBlendingDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.gradientMap ? '#define USE_GRADIENTMAP' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '', + + parameters.physicallyCorrectLights ? '#define PHYSICALLY_CORRECT_LIGHTS' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + parameters.envMap && extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '', + + 'uniform mat4 viewMatrix;', + 'uniform vec3 cameraPosition;', + + ( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '', + ( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below + ( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '', + + parameters.dithering ? '#define DITHERING' : '', + + ( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below + parameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '', + parameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '', + parameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '', + parameters.outputEncoding ? getTexelEncodingFunction( 'linearToOutputTexel', parameters.outputEncoding ) : '', + + parameters.depthPacking ? '#define DEPTH_PACKING ' + material.depthPacking : '', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + } + + vertexShader = parseIncludes( vertexShader ); + vertexShader = replaceLightNums( vertexShader, parameters ); + vertexShader = replaceClippingPlaneNums( vertexShader, parameters ); + + fragmentShader = parseIncludes( fragmentShader ); + fragmentShader = replaceLightNums( fragmentShader, parameters ); + fragmentShader = replaceClippingPlaneNums( fragmentShader, parameters ); + + vertexShader = unrollLoops( vertexShader ); + fragmentShader = unrollLoops( fragmentShader ); + + var vertexGlsl = prefixVertex + vertexShader; + var fragmentGlsl = prefixFragment + fragmentShader; + + // console.log( '*VERTEX*', vertexGlsl ); + // console.log( '*FRAGMENT*', fragmentGlsl ); + + var glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl ); + var glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl ); + + gl.attachShader( program, glVertexShader ); + gl.attachShader( program, glFragmentShader ); + + // Force a particular attribute to index 0. + + if ( material.index0AttributeName !== undefined ) { + + gl.bindAttribLocation( program, 0, material.index0AttributeName ); + + } else if ( parameters.morphTargets === true ) { + + // programs with morphTargets displace position out of attribute 0 + gl.bindAttribLocation( program, 0, 'position' ); + + } + + gl.linkProgram( program ); + + var programLog = gl.getProgramInfoLog( program ).trim(); + var vertexLog = gl.getShaderInfoLog( glVertexShader ).trim(); + var fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim(); + + var runnable = true; + var haveDiagnostics = true; + + // console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) ); + // console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) ); + + if ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) { + + runnable = false; + + console.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog ); + + } else if ( programLog !== '' ) { + + console.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog ); + + } else if ( vertexLog === '' || fragmentLog === '' ) { + + haveDiagnostics = false; + + } + + if ( haveDiagnostics ) { + + this.diagnostics = { + + runnable: runnable, + material: material, + + programLog: programLog, + + vertexShader: { + + log: vertexLog, + prefix: prefixVertex + + }, + + fragmentShader: { + + log: fragmentLog, + prefix: prefixFragment + + } + + }; + + } + + // clean up + + gl.deleteShader( glVertexShader ); + gl.deleteShader( glFragmentShader ); + + // set up caching for uniform locations + + var cachedUniforms; + + this.getUniforms = function () { + + if ( cachedUniforms === undefined ) { + + cachedUniforms = new WebGLUniforms( gl, program, renderer ); + + } + + return cachedUniforms; + + }; + + // set up caching for attribute locations + + var cachedAttributes; + + this.getAttributes = function () { + + if ( cachedAttributes === undefined ) { + + cachedAttributes = fetchAttributeLocations( gl, program ); + + } + + return cachedAttributes; + + }; + + // free resource + + this.destroy = function () { + + gl.deleteProgram( program ); + this.program = undefined; + + }; + + // DEPRECATED + + Object.defineProperties( this, { + + uniforms: { + get: function () { + + console.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' ); + return this.getUniforms(); + + } + }, + + attributes: { + get: function () { + + console.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' ); + return this.getAttributes(); + + } + } + + } ); + + + // + + this.name = shader.name; + this.id = programIdCount ++; + this.code = code; + this.usedTimes = 1; + this.program = program; + this.vertexShader = glVertexShader; + this.fragmentShader = glFragmentShader; + + return this; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLPrograms( renderer, extensions, capabilities ) { + + var programs = []; + + var shaderIDs = { + MeshDepthMaterial: 'depth', + MeshDistanceMaterial: 'distanceRGBA', + MeshNormalMaterial: 'normal', + MeshBasicMaterial: 'basic', + MeshLambertMaterial: 'lambert', + MeshPhongMaterial: 'phong', + MeshToonMaterial: 'phong', + MeshStandardMaterial: 'physical', + MeshPhysicalMaterial: 'physical', + LineBasicMaterial: 'basic', + LineDashedMaterial: 'dashed', + PointsMaterial: 'points', + ShadowMaterial: 'shadow' + }; + + var parameterNames = [ + "precision", "supportsVertexTextures", "map", "mapEncoding", "envMap", "envMapMode", "envMapEncoding", + "lightMap", "aoMap", "emissiveMap", "emissiveMapEncoding", "bumpMap", "normalMap", "displacementMap", "specularMap", + "roughnessMap", "metalnessMap", "gradientMap", + "alphaMap", "combine", "vertexColors", "fog", "useFog", "fogExp", + "flatShading", "sizeAttenuation", "logarithmicDepthBuffer", "skinning", + "maxBones", "useVertexTexture", "morphTargets", "morphNormals", + "maxMorphTargets", "maxMorphNormals", "premultipliedAlpha", + "numDirLights", "numPointLights", "numSpotLights", "numHemiLights", "numRectAreaLights", + "shadowMapEnabled", "shadowMapType", "toneMapping", 'physicallyCorrectLights', + "alphaTest", "doubleSided", "flipSided", "numClippingPlanes", "numClipIntersection", "depthPacking", "dithering" + ]; + + + function allocateBones( object ) { + + var skeleton = object.skeleton; + var bones = skeleton.bones; + + if ( capabilities.floatVertexTextures ) { + + return 1024; + + } else { + + // default for when object is not specified + // ( for example when prebuilding shader to be used with multiple objects ) + // + // - leave some extra space for other uniforms + // - limit here is ANGLE's 254 max uniform vectors + // (up to 54 should be safe) + + var nVertexUniforms = capabilities.maxVertexUniforms; + var nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 ); + + var maxBones = Math.min( nVertexMatrices, bones.length ); + + if ( maxBones < bones.length ) { + + console.warn( 'THREE.WebGLRenderer: Skeleton has ' + bones.length + ' bones. This GPU supports ' + maxBones + '.' ); + return 0; + + } + + return maxBones; + + } + + } + + function getTextureEncodingFromMap( map, gammaOverrideLinear ) { + + var encoding; + + if ( ! map ) { + + encoding = LinearEncoding; + + } else if ( map.isTexture ) { + + encoding = map.encoding; + + } else if ( map.isWebGLRenderTarget ) { + + console.warn( "THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead." ); + encoding = map.texture.encoding; + + } + + // add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point. + if ( encoding === LinearEncoding && gammaOverrideLinear ) { + + encoding = GammaEncoding; + + } + + return encoding; + + } + + this.getParameters = function ( material, lights, shadows, fog, nClipPlanes, nClipIntersection, object ) { + + var shaderID = shaderIDs[ material.type ]; + + // heuristics to create shader parameters according to lights in the scene + // (not to blow over maxLights budget) + + var maxBones = object.isSkinnedMesh ? allocateBones( object ) : 0; + var precision = capabilities.precision; + + if ( material.precision !== null ) { + + precision = capabilities.getMaxPrecision( material.precision ); + + if ( precision !== material.precision ) { + + console.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' ); + + } + + } + + var currentRenderTarget = renderer.getRenderTarget(); + + var parameters = { + + shaderID: shaderID, + + precision: precision, + supportsVertexTextures: capabilities.vertexTextures, + outputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ), + map: !! material.map, + mapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ), + envMap: !! material.envMap, + envMapMode: material.envMap && material.envMap.mapping, + envMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ), + envMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ), + lightMap: !! material.lightMap, + aoMap: !! material.aoMap, + emissiveMap: !! material.emissiveMap, + emissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ), + bumpMap: !! material.bumpMap, + normalMap: !! material.normalMap, + displacementMap: !! material.displacementMap, + roughnessMap: !! material.roughnessMap, + metalnessMap: !! material.metalnessMap, + specularMap: !! material.specularMap, + alphaMap: !! material.alphaMap, + + gradientMap: !! material.gradientMap, + + combine: material.combine, + + vertexColors: material.vertexColors, + + fog: !! fog, + useFog: material.fog, + fogExp: ( fog && fog.isFogExp2 ), + + flatShading: material.flatShading, + + sizeAttenuation: material.sizeAttenuation, + logarithmicDepthBuffer: capabilities.logarithmicDepthBuffer, + + skinning: material.skinning && maxBones > 0, + maxBones: maxBones, + useVertexTexture: capabilities.floatVertexTextures, + + morphTargets: material.morphTargets, + morphNormals: material.morphNormals, + maxMorphTargets: renderer.maxMorphTargets, + maxMorphNormals: renderer.maxMorphNormals, + + numDirLights: lights.directional.length, + numPointLights: lights.point.length, + numSpotLights: lights.spot.length, + numRectAreaLights: lights.rectArea.length, + numHemiLights: lights.hemi.length, + + numClippingPlanes: nClipPlanes, + numClipIntersection: nClipIntersection, + + dithering: material.dithering, + + shadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && shadows.length > 0, + shadowMapType: renderer.shadowMap.type, + + toneMapping: renderer.toneMapping, + physicallyCorrectLights: renderer.physicallyCorrectLights, + + premultipliedAlpha: material.premultipliedAlpha, + + alphaTest: material.alphaTest, + doubleSided: material.side === DoubleSide, + flipSided: material.side === BackSide, + + depthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false + + }; + + return parameters; + + }; + + this.getProgramCode = function ( material, parameters ) { + + var array = []; + + if ( parameters.shaderID ) { + + array.push( parameters.shaderID ); + + } else { + + array.push( material.fragmentShader ); + array.push( material.vertexShader ); + + } + + if ( material.defines !== undefined ) { + + for ( var name in material.defines ) { + + array.push( name ); + array.push( material.defines[ name ] ); + + } + + } + + for ( var i = 0; i < parameterNames.length; i ++ ) { + + array.push( parameters[ parameterNames[ i ] ] ); + + } + + array.push( material.onBeforeCompile.toString() ); + + array.push( renderer.gammaOutput ); + + return array.join(); + + }; + + this.acquireProgram = function ( material, shader, parameters, code ) { + + var program; + + // Check if code has been already compiled + for ( var p = 0, pl = programs.length; p < pl; p ++ ) { + + var programInfo = programs[ p ]; + + if ( programInfo.code === code ) { + + program = programInfo; + ++ program.usedTimes; + + break; + + } + + } + + if ( program === undefined ) { + + program = new WebGLProgram( renderer, extensions, code, material, shader, parameters ); + programs.push( program ); + + } + + return program; + + }; + + this.releaseProgram = function ( program ) { + + if ( -- program.usedTimes === 0 ) { + + // Remove from unordered set + var i = programs.indexOf( program ); + programs[ i ] = programs[ programs.length - 1 ]; + programs.pop(); + + // Free WebGL resources + program.destroy(); + + } + + }; + + // Exposed for resource monitoring & error feedback via renderer.info: + this.programs = programs; + + } + + /** + * @author fordacious / fordacious.github.io + */ + + function WebGLProperties() { + + var properties = new WeakMap(); + + function get( object ) { + + var map = properties.get( object ); + + if ( map === undefined ) { + + map = {}; + properties.set( object, map ); + + } + + return map; + + } + + function remove( object ) { + + properties.delete( object ); + + } + + function update( object, key, value ) { + + properties.get( object )[ key ] = value; + + } + + function dispose() { + + properties = new WeakMap(); + + } + + return { + get: get, + remove: remove, + update: update, + dispose: dispose + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function painterSortStable( a, b ) { + + if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } else if ( a.program && b.program && a.program !== b.program ) { + + return a.program.id - b.program.id; + + } else if ( a.material.id !== b.material.id ) { + + return a.material.id - b.material.id; + + } else if ( a.z !== b.z ) { + + return a.z - b.z; + + } else { + + return a.id - b.id; + + } + + } + + function reversePainterSortStable( a, b ) { + + if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } if ( a.z !== b.z ) { + + return b.z - a.z; + + } else { + + return a.id - b.id; + + } + + } + + function WebGLRenderList() { + + var renderItems = []; + var renderItemsIndex = 0; + + var opaque = []; + var transparent = []; + + function init() { + + renderItemsIndex = 0; + + opaque.length = 0; + transparent.length = 0; + + } + + function push( object, geometry, material, z, group ) { + + var renderItem = renderItems[ renderItemsIndex ]; + + if ( renderItem === undefined ) { + + renderItem = { + id: object.id, + object: object, + geometry: geometry, + material: material, + program: material.program, + renderOrder: object.renderOrder, + z: z, + group: group + }; + + renderItems[ renderItemsIndex ] = renderItem; + + } else { + + renderItem.id = object.id; + renderItem.object = object; + renderItem.geometry = geometry; + renderItem.material = material; + renderItem.program = material.program; + renderItem.renderOrder = object.renderOrder; + renderItem.z = z; + renderItem.group = group; + + } + + ( material.transparent === true ? transparent : opaque ).push( renderItem ); + + renderItemsIndex ++; + + } + + function sort() { + + if ( opaque.length > 1 ) opaque.sort( painterSortStable ); + if ( transparent.length > 1 ) transparent.sort( reversePainterSortStable ); + + } + + return { + opaque: opaque, + transparent: transparent, + + init: init, + push: push, + + sort: sort + }; + + } + + function WebGLRenderLists() { + + var lists = {}; + + function get( scene, camera ) { + + var hash = scene.id + ',' + camera.id; + var list = lists[ hash ]; + + if ( list === undefined ) { + + // console.log( 'THREE.WebGLRenderLists:', hash ); + + list = new WebGLRenderList(); + lists[ hash ] = list; + + } + + return list; + + } + + function dispose() { + + lists = {}; + + } + + return { + get: get, + dispose: dispose + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function UniformsCache() { + + var lights = {}; + + return { + + get: function ( light ) { + + if ( lights[ light.id ] !== undefined ) { + + return lights[ light.id ]; + + } + + var uniforms; + + switch ( light.type ) { + + case 'DirectionalLight': + uniforms = { + direction: new Vector3(), + color: new Color(), + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'SpotLight': + uniforms = { + position: new Vector3(), + direction: new Vector3(), + color: new Color(), + distance: 0, + coneCos: 0, + penumbraCos: 0, + decay: 0, + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'PointLight': + uniforms = { + position: new Vector3(), + color: new Color(), + distance: 0, + decay: 0, + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2(), + shadowCameraNear: 1, + shadowCameraFar: 1000 + }; + break; + + case 'HemisphereLight': + uniforms = { + direction: new Vector3(), + skyColor: new Color(), + groundColor: new Color() + }; + break; + + case 'RectAreaLight': + uniforms = { + color: new Color(), + position: new Vector3(), + halfWidth: new Vector3(), + halfHeight: new Vector3() + // TODO (abelnation): set RectAreaLight shadow uniforms + }; + break; + + } + + lights[ light.id ] = uniforms; + + return uniforms; + + } + + }; + + } + + var count = 0; + + function WebGLLights() { + + var cache = new UniformsCache(); + + var state = { + + id: count ++, + + hash: '', + + ambient: [ 0, 0, 0 ], + directional: [], + directionalShadowMap: [], + directionalShadowMatrix: [], + spot: [], + spotShadowMap: [], + spotShadowMatrix: [], + rectArea: [], + point: [], + pointShadowMap: [], + pointShadowMatrix: [], + hemi: [] + + }; + + var vector3 = new Vector3(); + var matrix4 = new Matrix4(); + var matrix42 = new Matrix4(); + + function setup( lights, shadows, camera ) { + + var r = 0, g = 0, b = 0; + + var directionalLength = 0; + var pointLength = 0; + var spotLength = 0; + var rectAreaLength = 0; + var hemiLength = 0; + + var viewMatrix = camera.matrixWorldInverse; + + for ( var i = 0, l = lights.length; i < l; i ++ ) { + + var light = lights[ i ]; + + var color = light.color; + var intensity = light.intensity; + var distance = light.distance; + + var shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null; + + if ( light.isAmbientLight ) { + + r += color.r * intensity; + g += color.g * intensity; + b += color.b * intensity; + + } else if ( light.isDirectionalLight ) { + + var uniforms = cache.get( light ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + var shadow = light.shadow; + + uniforms.shadowBias = shadow.bias; + uniforms.shadowRadius = shadow.radius; + uniforms.shadowMapSize = shadow.mapSize; + + } + + state.directionalShadowMap[ directionalLength ] = shadowMap; + state.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix; + state.directional[ directionalLength ] = uniforms; + + directionalLength ++; + + } else if ( light.isSpotLight ) { + + var uniforms = cache.get( light ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + uniforms.color.copy( color ).multiplyScalar( intensity ); + uniforms.distance = distance; + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + uniforms.coneCos = Math.cos( light.angle ); + uniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) ); + uniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay; + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + var shadow = light.shadow; + + uniforms.shadowBias = shadow.bias; + uniforms.shadowRadius = shadow.radius; + uniforms.shadowMapSize = shadow.mapSize; + + } + + state.spotShadowMap[ spotLength ] = shadowMap; + state.spotShadowMatrix[ spotLength ] = light.shadow.matrix; + state.spot[ spotLength ] = uniforms; + + spotLength ++; + + } else if ( light.isRectAreaLight ) { + + var uniforms = cache.get( light ); + + // (a) intensity is the total visible light emitted + //uniforms.color.copy( color ).multiplyScalar( intensity / ( light.width * light.height * Math.PI ) ); + + // (b) intensity is the brightness of the light + uniforms.color.copy( color ).multiplyScalar( intensity ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + // extract local rotation of light to derive width/height half vectors + matrix42.identity(); + matrix4.copy( light.matrixWorld ); + matrix4.premultiply( viewMatrix ); + matrix42.extractRotation( matrix4 ); + + uniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 ); + uniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 ); + + uniforms.halfWidth.applyMatrix4( matrix42 ); + uniforms.halfHeight.applyMatrix4( matrix42 ); + + // TODO (abelnation): RectAreaLight distance? + // uniforms.distance = distance; + + state.rectArea[ rectAreaLength ] = uniforms; + + rectAreaLength ++; + + } else if ( light.isPointLight ) { + + var uniforms = cache.get( light ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); + uniforms.distance = light.distance; + uniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay; + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + var shadow = light.shadow; + + uniforms.shadowBias = shadow.bias; + uniforms.shadowRadius = shadow.radius; + uniforms.shadowMapSize = shadow.mapSize; + uniforms.shadowCameraNear = shadow.camera.near; + uniforms.shadowCameraFar = shadow.camera.far; + + } + + state.pointShadowMap[ pointLength ] = shadowMap; + state.pointShadowMatrix[ pointLength ] = light.shadow.matrix; + state.point[ pointLength ] = uniforms; + + pointLength ++; + + } else if ( light.isHemisphereLight ) { + + var uniforms = cache.get( light ); + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + uniforms.direction.transformDirection( viewMatrix ); + uniforms.direction.normalize(); + + uniforms.skyColor.copy( light.color ).multiplyScalar( intensity ); + uniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity ); + + state.hemi[ hemiLength ] = uniforms; + + hemiLength ++; + + } + + } + + state.ambient[ 0 ] = r; + state.ambient[ 1 ] = g; + state.ambient[ 2 ] = b; + + state.directional.length = directionalLength; + state.spot.length = spotLength; + state.rectArea.length = rectAreaLength; + state.point.length = pointLength; + state.hemi.length = hemiLength; + + state.hash = state.id + ',' + directionalLength + ',' + pointLength + ',' + spotLength + ',' + rectAreaLength + ',' + hemiLength + ',' + shadows.length; + + } + + return { + setup: setup, + state: state + }; + + } + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function WebGLRenderState() { + + var lights = new WebGLLights(); + + var lightsArray = []; + var shadowsArray = []; + var spritesArray = []; + + function init() { + + lightsArray.length = 0; + shadowsArray.length = 0; + spritesArray.length = 0; + + } + + function pushLight( light ) { + + lightsArray.push( light ); + + } + + function pushShadow( shadowLight ) { + + shadowsArray.push( shadowLight ); + + } + + function pushSprite( shadowLight ) { + + spritesArray.push( shadowLight ); + + } + + function setupLights( camera ) { + + lights.setup( lightsArray, shadowsArray, camera ); + + } + + var state = { + lightsArray: lightsArray, + shadowsArray: shadowsArray, + spritesArray: spritesArray, + + lights: lights + }; + + return { + init: init, + state: state, + setupLights: setupLights, + + pushLight: pushLight, + pushShadow: pushShadow, + pushSprite: pushSprite + }; + + } + + function WebGLRenderStates() { + + var renderStates = {}; + + function get( scene, camera ) { + + var hash = scene.id + ',' + camera.id; + + var renderState = renderStates[ hash ]; + + if ( renderState === undefined ) { + + renderState = new WebGLRenderState(); + renderStates[ hash ] = renderState; + + } + + return renderState; + + } + + function dispose() { + + renderStates = {}; + + } + + return { + get: get, + dispose: dispose + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author bhouston / https://clara.io + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * + * opacity: , + * + * map: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * wireframe: , + * wireframeLinewidth: + * } + */ + + function MeshDepthMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshDepthMaterial'; + + this.depthPacking = BasicDepthPacking; + + this.skinning = false; + this.morphTargets = false; + + this.map = null; + + this.alphaMap = null; + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; + this.lights = false; + + this.setValues( parameters ); + + } + + MeshDepthMaterial.prototype = Object.create( Material.prototype ); + MeshDepthMaterial.prototype.constructor = MeshDepthMaterial; + + MeshDepthMaterial.prototype.isMeshDepthMaterial = true; + + MeshDepthMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.depthPacking = source.depthPacking; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + return this; + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * + * referencePosition: , + * nearDistance: , + * farDistance: , + * + * skinning: , + * morphTargets: , + * + * map: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: + * + * } + */ + + function MeshDistanceMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshDistanceMaterial'; + + this.referencePosition = new Vector3(); + this.nearDistance = 1; + this.farDistance = 1000; + + this.skinning = false; + this.morphTargets = false; + + this.map = null; + + this.alphaMap = null; + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.fog = false; + this.lights = false; + + this.setValues( parameters ); + + } + + MeshDistanceMaterial.prototype = Object.create( Material.prototype ); + MeshDistanceMaterial.prototype.constructor = MeshDistanceMaterial; + + MeshDistanceMaterial.prototype.isMeshDistanceMaterial = true; + + MeshDistanceMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.referencePosition.copy( source.referencePosition ); + this.nearDistance = source.nearDistance; + this.farDistance = source.farDistance; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + return this; + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLShadowMap( _renderer, _objects, maxTextureSize ) { + + var _frustum = new Frustum(), + _projScreenMatrix = new Matrix4(), + + _shadowMapSize = new Vector2(), + _maxShadowMapSize = new Vector2( maxTextureSize, maxTextureSize ), + + _lookTarget = new Vector3(), + _lightPositionWorld = new Vector3(), + + _MorphingFlag = 1, + _SkinningFlag = 2, + + _NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1, + + _depthMaterials = new Array( _NumberOfMaterialVariants ), + _distanceMaterials = new Array( _NumberOfMaterialVariants ), + + _materialCache = {}; + + var shadowSide = { 0: BackSide, 1: FrontSide, 2: DoubleSide }; + + var cubeDirections = [ + new Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ), + new Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 ) + ]; + + var cubeUps = [ + new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), + new Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ), new Vector3( 0, 0, - 1 ) + ]; + + var cube2DViewPorts = [ + new Vector4(), new Vector4(), new Vector4(), + new Vector4(), new Vector4(), new Vector4() + ]; + + // init + + for ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) { + + var useMorphing = ( i & _MorphingFlag ) !== 0; + var useSkinning = ( i & _SkinningFlag ) !== 0; + + var depthMaterial = new MeshDepthMaterial( { + + depthPacking: RGBADepthPacking, + + morphTargets: useMorphing, + skinning: useSkinning + + } ); + + _depthMaterials[ i ] = depthMaterial; + + // + + var distanceMaterial = new MeshDistanceMaterial( { + + morphTargets: useMorphing, + skinning: useSkinning + + } ); + + _distanceMaterials[ i ] = distanceMaterial; + + } + + // + + var scope = this; + + this.enabled = false; + + this.autoUpdate = true; + this.needsUpdate = false; + + this.type = PCFShadowMap; + + this.render = function ( lights, scene, camera ) { + + if ( scope.enabled === false ) return; + if ( scope.autoUpdate === false && scope.needsUpdate === false ) return; + + if ( lights.length === 0 ) return; + + // TODO Clean up (needed in case of contextlost) + var _gl = _renderer.context; + var _state = _renderer.state; + + // Set GL state for depth map. + _state.disable( _gl.BLEND ); + _state.buffers.color.setClear( 1, 1, 1, 1 ); + _state.buffers.depth.setTest( true ); + _state.setScissorTest( false ); + + // render depth map + + var faceCount; + + for ( var i = 0, il = lights.length; i < il; i ++ ) { + + var light = lights[ i ]; + var shadow = light.shadow; + var isPointLight = light && light.isPointLight; + + if ( shadow === undefined ) { + + console.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' ); + continue; + + } + + var shadowCamera = shadow.camera; + + _shadowMapSize.copy( shadow.mapSize ); + _shadowMapSize.min( _maxShadowMapSize ); + + if ( isPointLight ) { + + var vpWidth = _shadowMapSize.x; + var vpHeight = _shadowMapSize.y; + + // These viewports map a cube-map onto a 2D texture with the + // following orientation: + // + // xzXZ + // y Y + // + // X - Positive x direction + // x - Negative x direction + // Y - Positive y direction + // y - Negative y direction + // Z - Positive z direction + // z - Negative z direction + + // positive X + cube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight ); + // negative X + cube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight ); + // positive Z + cube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight ); + // negative Z + cube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight ); + // positive Y + cube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight ); + // negative Y + cube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight ); + + _shadowMapSize.x *= 4.0; + _shadowMapSize.y *= 2.0; + + } + + if ( shadow.map === null ) { + + var pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat }; + + shadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars ); + shadow.map.texture.name = light.name + ".shadowMap"; + + shadowCamera.updateProjectionMatrix(); + + } + + if ( shadow.isSpotLightShadow ) { + + shadow.update( light ); + + } + + var shadowMap = shadow.map; + var shadowMatrix = shadow.matrix; + + _lightPositionWorld.setFromMatrixPosition( light.matrixWorld ); + shadowCamera.position.copy( _lightPositionWorld ); + + if ( isPointLight ) { + + faceCount = 6; + + // for point lights we set the shadow matrix to be a translation-only matrix + // equal to inverse of the light's position + + shadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z ); + + } else { + + faceCount = 1; + + _lookTarget.setFromMatrixPosition( light.target.matrixWorld ); + shadowCamera.lookAt( _lookTarget ); + shadowCamera.updateMatrixWorld(); + + // compute shadow matrix + + shadowMatrix.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 + ); + + shadowMatrix.multiply( shadowCamera.projectionMatrix ); + shadowMatrix.multiply( shadowCamera.matrixWorldInverse ); + + } + + _renderer.setRenderTarget( shadowMap ); + _renderer.clear(); + + // render shadow map for each cube face (if omni-directional) or + // run a single pass if not + + for ( var face = 0; face < faceCount; face ++ ) { + + if ( isPointLight ) { + + _lookTarget.copy( shadowCamera.position ); + _lookTarget.add( cubeDirections[ face ] ); + shadowCamera.up.copy( cubeUps[ face ] ); + shadowCamera.lookAt( _lookTarget ); + shadowCamera.updateMatrixWorld(); + + var vpDimensions = cube2DViewPorts[ face ]; + _state.viewport( vpDimensions ); + + } + + // update camera matrices and frustum + + _projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse ); + _frustum.setFromMatrix( _projScreenMatrix ); + + // set object matrices & frustum culling + + renderObject( scene, camera, shadowCamera, isPointLight ); + + } + + } + + scope.needsUpdate = false; + + }; + + function getDepthMaterial( object, material, isPointLight, lightPositionWorld, shadowCameraNear, shadowCameraFar ) { + + var geometry = object.geometry; + + var result = null; + + var materialVariants = _depthMaterials; + var customMaterial = object.customDepthMaterial; + + if ( isPointLight ) { + + materialVariants = _distanceMaterials; + customMaterial = object.customDistanceMaterial; + + } + + if ( ! customMaterial ) { + + var useMorphing = false; + + if ( material.morphTargets ) { + + if ( geometry && geometry.isBufferGeometry ) { + + useMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0; + + } else if ( geometry && geometry.isGeometry ) { + + useMorphing = geometry.morphTargets && geometry.morphTargets.length > 0; + + } + + } + + if ( object.isSkinnedMesh && material.skinning === false ) { + + console.warn( 'THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:', object ); + + } + + var useSkinning = object.isSkinnedMesh && material.skinning; + + var variantIndex = 0; + + if ( useMorphing ) variantIndex |= _MorphingFlag; + if ( useSkinning ) variantIndex |= _SkinningFlag; + + result = materialVariants[ variantIndex ]; + + } else { + + result = customMaterial; + + } + + if ( _renderer.localClippingEnabled && + material.clipShadows === true && + material.clippingPlanes.length !== 0 ) { + + // in this case we need a unique material instance reflecting the + // appropriate state + + var keyA = result.uuid, keyB = material.uuid; + + var materialsForVariant = _materialCache[ keyA ]; + + if ( materialsForVariant === undefined ) { + + materialsForVariant = {}; + _materialCache[ keyA ] = materialsForVariant; + + } + + var cachedMaterial = materialsForVariant[ keyB ]; + + if ( cachedMaterial === undefined ) { + + cachedMaterial = result.clone(); + materialsForVariant[ keyB ] = cachedMaterial; + + } + + result = cachedMaterial; + + } + + result.visible = material.visible; + result.wireframe = material.wireframe; + + result.side = ( material.shadowSide != null ) ? material.shadowSide : shadowSide[ material.side ]; + + result.clipShadows = material.clipShadows; + result.clippingPlanes = material.clippingPlanes; + result.clipIntersection = material.clipIntersection; + + result.wireframeLinewidth = material.wireframeLinewidth; + result.linewidth = material.linewidth; + + if ( isPointLight && result.isMeshDistanceMaterial ) { + + result.referencePosition.copy( lightPositionWorld ); + result.nearDistance = shadowCameraNear; + result.farDistance = shadowCameraFar; + + } + + return result; + + } + + function renderObject( object, camera, shadowCamera, isPointLight ) { + + if ( object.visible === false ) return; + + var visible = object.layers.test( camera.layers ); + + if ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) { + + if ( object.castShadow && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) { + + object.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld ); + + var geometry = _objects.update( object ); + var material = object.material; + + if ( Array.isArray( material ) ) { + + var groups = geometry.groups; + + for ( var k = 0, kl = groups.length; k < kl; k ++ ) { + + var group = groups[ k ]; + var groupMaterial = material[ group.materialIndex ]; + + if ( groupMaterial && groupMaterial.visible ) { + + var depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld, shadowCamera.near, shadowCamera.far ); + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group ); + + } + + } + + } else if ( material.visible ) { + + var depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld, shadowCamera.near, shadowCamera.far ); + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null ); + + } + + } + + } + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + renderObject( children[ i ], camera, shadowCamera, isPointLight ); + + } + + } + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + Texture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.needsUpdate = true; + + } + + CanvasTexture.prototype = Object.create( Texture.prototype ); + CanvasTexture.prototype.constructor = CanvasTexture; + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function WebGLSpriteRenderer( renderer, gl, state, textures, capabilities ) { + + var vertexBuffer, elementBuffer; + var program, attributes, uniforms; + + var texture; + + // decompose matrixWorld + + var spritePosition = new Vector3(); + var spriteRotation = new Quaternion(); + var spriteScale = new Vector3(); + + function init() { + + var vertices = 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 + ] ); + + var faces = new Uint16Array( [ + 0, 1, 2, + 0, 2, 3 + ] ); + + vertexBuffer = gl.createBuffer(); + elementBuffer = gl.createBuffer(); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW ); + + program = createProgram(); + + attributes = { + position: gl.getAttribLocation( program, 'position' ), + uv: gl.getAttribLocation( program, 'uv' ) + }; + + uniforms = { + uvOffset: gl.getUniformLocation( program, 'uvOffset' ), + uvScale: gl.getUniformLocation( program, 'uvScale' ), + + rotation: gl.getUniformLocation( program, 'rotation' ), + center: gl.getUniformLocation( program, 'center' ), + scale: gl.getUniformLocation( program, 'scale' ), + + color: gl.getUniformLocation( program, 'color' ), + map: gl.getUniformLocation( program, 'map' ), + opacity: gl.getUniformLocation( program, 'opacity' ), + + modelViewMatrix: gl.getUniformLocation( program, 'modelViewMatrix' ), + projectionMatrix: gl.getUniformLocation( program, 'projectionMatrix' ), + + fogType: gl.getUniformLocation( program, 'fogType' ), + fogDensity: gl.getUniformLocation( program, 'fogDensity' ), + fogNear: gl.getUniformLocation( program, 'fogNear' ), + fogFar: gl.getUniformLocation( program, 'fogFar' ), + fogColor: gl.getUniformLocation( program, 'fogColor' ), + fogDepth: gl.getUniformLocation( program, 'fogDepth' ), + + alphaTest: gl.getUniformLocation( program, 'alphaTest' ) + }; + + var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = 8; + canvas.height = 8; + + var context = canvas.getContext( '2d' ); + context.fillStyle = 'white'; + context.fillRect( 0, 0, 8, 8 ); + + texture = new CanvasTexture( canvas ); + + } + + this.render = function ( sprites, scene, camera ) { + + if ( sprites.length === 0 ) return; + + // setup gl + + if ( program === undefined ) { + + init(); + + } + + state.useProgram( program ); + + state.initAttributes(); + state.enableAttribute( attributes.position ); + state.enableAttribute( attributes.uv ); + state.disableUnusedAttributes(); + + state.disable( gl.CULL_FACE ); + state.enable( gl.BLEND ); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 ); + gl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + + gl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements ); + + state.activeTexture( gl.TEXTURE0 ); + gl.uniform1i( uniforms.map, 0 ); + + var oldFogType = 0; + var sceneFogType = 0; + var fog = scene.fog; + + if ( fog ) { + + gl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b ); + + if ( fog.isFog ) { + + gl.uniform1f( uniforms.fogNear, fog.near ); + gl.uniform1f( uniforms.fogFar, fog.far ); + + gl.uniform1i( uniforms.fogType, 1 ); + oldFogType = 1; + sceneFogType = 1; + + } else if ( fog.isFogExp2 ) { + + gl.uniform1f( uniforms.fogDensity, fog.density ); + + gl.uniform1i( uniforms.fogType, 2 ); + oldFogType = 2; + sceneFogType = 2; + + } + + } else { + + gl.uniform1i( uniforms.fogType, 0 ); + oldFogType = 0; + sceneFogType = 0; + + } + + + // update positions and sort + + for ( var i = 0, l = sprites.length; i < l; i ++ ) { + + var sprite = sprites[ i ]; + + sprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld ); + sprite.z = - sprite.modelViewMatrix.elements[ 14 ]; + + } + + sprites.sort( painterSortStable ); + + // render all sprites + + var scale = []; + var center = []; + + for ( var i = 0, l = sprites.length; i < l; i ++ ) { + + var sprite = sprites[ i ]; + var material = sprite.material; + + if ( material.visible === false ) continue; + + sprite.onBeforeRender( renderer, scene, camera, undefined, material, undefined ); + + gl.uniform1f( uniforms.alphaTest, material.alphaTest ); + gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements ); + + sprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale ); + + scale[ 0 ] = spriteScale.x; + scale[ 1 ] = spriteScale.y; + + center[ 0 ] = sprite.center.x - 0.5; + center[ 1 ] = sprite.center.y - 0.5; + + var fogType = 0; + + if ( scene.fog && material.fog ) { + + fogType = sceneFogType; + + } + + if ( oldFogType !== fogType ) { + + gl.uniform1i( uniforms.fogType, fogType ); + oldFogType = fogType; + + } + + if ( material.map !== null ) { + + gl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y ); + gl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y ); + + } else { + + gl.uniform2f( uniforms.uvOffset, 0, 0 ); + gl.uniform2f( uniforms.uvScale, 1, 1 ); + + } + + gl.uniform1f( uniforms.opacity, material.opacity ); + gl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b ); + + gl.uniform1f( uniforms.rotation, material.rotation ); + gl.uniform2fv( uniforms.center, center ); + gl.uniform2fv( uniforms.scale, scale ); + + state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha ); + state.buffers.depth.setTest( material.depthTest ); + state.buffers.depth.setMask( material.depthWrite ); + state.buffers.color.setMask( material.colorWrite ); + + textures.setTexture2D( material.map || texture, 0 ); + + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + sprite.onAfterRender( renderer, scene, camera, undefined, material, undefined ); + + } + + // restore gl + + state.enable( gl.CULL_FACE ); + + state.reset(); + + }; + + function createProgram() { + + var program = gl.createProgram(); + + var vertexShader = gl.createShader( gl.VERTEX_SHADER ); + var fragmentShader = gl.createShader( gl.FRAGMENT_SHADER ); + + gl.shaderSource( vertexShader, [ + + 'precision ' + capabilities.precision + ' float;', + + '#define SHADER_NAME ' + 'SpriteMaterial', + + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform float rotation;', + 'uniform vec2 center;', + 'uniform vec2 scale;', + 'uniform vec2 uvOffset;', + 'uniform vec2 uvScale;', + + 'attribute vec2 position;', + 'attribute vec2 uv;', + + 'varying vec2 vUV;', + 'varying float fogDepth;', + + 'void main() {', + + ' vUV = uvOffset + uv * uvScale;', + + ' vec2 alignedPosition = ( position - center ) * scale;', + + ' vec2 rotatedPosition;', + ' rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;', + ' rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;', + + ' vec4 mvPosition;', + + ' mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );', + ' mvPosition.xy += rotatedPosition;', + + ' gl_Position = projectionMatrix * mvPosition;', + + ' fogDepth = - mvPosition.z;', + + '}' + + ].join( '\n' ) ); + + gl.shaderSource( fragmentShader, [ + + 'precision ' + capabilities.precision + ' float;', + + '#define SHADER_NAME ' + 'SpriteMaterial', + + 'uniform vec3 color;', + 'uniform sampler2D map;', + 'uniform float opacity;', + + 'uniform int fogType;', + 'uniform vec3 fogColor;', + 'uniform float fogDensity;', + 'uniform float fogNear;', + 'uniform float fogFar;', + 'uniform float alphaTest;', + + 'varying vec2 vUV;', + 'varying float fogDepth;', + + 'void main() {', + + ' vec4 texture = texture2D( map, vUV );', + + ' gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );', + + ' if ( gl_FragColor.a < alphaTest ) discard;', + + ' if ( fogType > 0 ) {', + + ' float fogFactor = 0.0;', + + ' if ( fogType == 1 ) {', + + ' fogFactor = smoothstep( fogNear, fogFar, fogDepth );', + + ' } else {', + + ' const float LOG2 = 1.442695;', + ' fogFactor = exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 );', + ' fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );', + + ' }', + + ' gl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );', + + ' }', + + '}' + + ].join( '\n' ) ); + + gl.compileShader( vertexShader ); + gl.compileShader( fragmentShader ); + + gl.attachShader( program, vertexShader ); + gl.attachShader( program, fragmentShader ); + + gl.linkProgram( program ); + + return program; + + } + + function painterSortStable( a, b ) { + + if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } else if ( a.z !== b.z ) { + + return b.z - a.z; + + } else { + + return b.id - a.id; + + } + + } + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLState( gl, extensions, utils ) { + + function ColorBuffer() { + + var locked = false; + + var color = new Vector4(); + var currentColorMask = null; + var 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 ); + + } + + }, + + reset: function () { + + locked = false; + + currentColorMask = null; + currentColorClear.set( - 1, 0, 0, 0 ); // set to invalid state + + } + + }; + + } + + function DepthBuffer() { + + var locked = false; + + var currentDepthMask = null; + var currentDepthFunc = null; + var currentDepthClear = null; + + return { + + setTest: function ( depthTest ) { + + if ( depthTest ) { + + enable( gl.DEPTH_TEST ); + + } else { + + disable( gl.DEPTH_TEST ); + + } + + }, + + setMask: function ( depthMask ) { + + if ( currentDepthMask !== depthMask && ! locked ) { + + gl.depthMask( depthMask ); + currentDepthMask = depthMask; + + } + + }, + + setFunc: function ( depthFunc ) { + + if ( currentDepthFunc !== depthFunc ) { + + if ( depthFunc ) { + + switch ( depthFunc ) { + + case NeverDepth: + + gl.depthFunc( gl.NEVER ); + break; + + case AlwaysDepth: + + gl.depthFunc( gl.ALWAYS ); + break; + + case LessDepth: + + gl.depthFunc( gl.LESS ); + break; + + case LessEqualDepth: + + gl.depthFunc( gl.LEQUAL ); + break; + + case EqualDepth: + + gl.depthFunc( gl.EQUAL ); + break; + + case GreaterEqualDepth: + + gl.depthFunc( gl.GEQUAL ); + break; + + case GreaterDepth: + + gl.depthFunc( gl.GREATER ); + break; + + case NotEqualDepth: + + gl.depthFunc( gl.NOTEQUAL ); + break; + + default: + + gl.depthFunc( gl.LEQUAL ); + + } + + } else { + + gl.depthFunc( gl.LEQUAL ); + + } + + 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() { + + var locked = false; + + var currentStencilMask = null; + var currentStencilFunc = null; + var currentStencilRef = null; + var currentStencilFuncMask = null; + var currentStencilFail = null; + var currentStencilZFail = null; + var currentStencilZPass = null; + var currentStencilClear = null; + + return { + + setTest: function ( stencilTest ) { + + if ( stencilTest ) { + + enable( gl.STENCIL_TEST ); + + } else { + + disable( gl.STENCIL_TEST ); + + } + + }, + + setMask: function ( stencilMask ) { + + if ( currentStencilMask !== stencilMask && ! locked ) { + + gl.stencilMask( stencilMask ); + currentStencilMask = stencilMask; + + } + + }, + + setFunc: function ( stencilFunc, stencilRef, stencilMask ) { + + if ( currentStencilFunc !== stencilFunc || + currentStencilRef !== stencilRef || + currentStencilFuncMask !== stencilMask ) { + + gl.stencilFunc( stencilFunc, stencilRef, stencilMask ); + + currentStencilFunc = stencilFunc; + currentStencilRef = stencilRef; + currentStencilFuncMask = stencilMask; + + } + + }, + + setOp: function ( stencilFail, stencilZFail, stencilZPass ) { + + if ( currentStencilFail !== stencilFail || + currentStencilZFail !== stencilZFail || + currentStencilZPass !== stencilZPass ) { + + gl.stencilOp( stencilFail, stencilZFail, stencilZPass ); + + currentStencilFail = stencilFail; + currentStencilZFail = stencilZFail; + currentStencilZPass = stencilZPass; + + } + + }, + + 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; + currentStencilClear = null; + + } + + }; + + } + + // + + var colorBuffer = new ColorBuffer(); + var depthBuffer = new DepthBuffer(); + var stencilBuffer = new StencilBuffer(); + + var maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); + var newAttributes = new Uint8Array( maxVertexAttributes ); + var enabledAttributes = new Uint8Array( maxVertexAttributes ); + var attributeDivisors = new Uint8Array( maxVertexAttributes ); + + var capabilities = {}; + + var compressedTextureFormats = null; + + var currentProgram = null; + + var currentBlending = null; + var currentBlendEquation = null; + var currentBlendSrc = null; + var currentBlendDst = null; + var currentBlendEquationAlpha = null; + var currentBlendSrcAlpha = null; + var currentBlendDstAlpha = null; + var currentPremultipledAlpha = false; + + var currentFlipSided = null; + var currentCullFace = null; + + var currentLineWidth = null; + + var currentPolygonOffsetFactor = null; + var currentPolygonOffsetUnits = null; + + var maxTextures = gl.getParameter( gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS ); + + var lineWidthAvailable = false; + var version = 0; + var glVersion = gl.getParameter( gl.VERSION ); + + if ( glVersion.indexOf( 'WebGL' ) !== - 1 ) { + + version = parseFloat( /^WebGL\ ([0-9])/.exec( glVersion )[ 1 ] ); + lineWidthAvailable = ( version >= 1.0 ); + + } else if ( glVersion.indexOf( 'OpenGL ES' ) !== - 1 ) { + + version = parseFloat( /^OpenGL\ ES\ ([0-9])/.exec( glVersion )[ 1 ] ); + lineWidthAvailable = ( version >= 2.0 ); + + } + + var currentTextureSlot = null; + var currentBoundTextures = {}; + + var currentScissor = new Vector4(); + var currentViewport = new Vector4(); + + function createTexture( type, target, count ) { + + var data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4. + var 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 ( var i = 0; i < count; i ++ ) { + + gl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data ); + + } + + return texture; + + } + + var emptyTextures = {}; + emptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 ); + emptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 ); + + // init + + colorBuffer.setClear( 0, 0, 0, 1 ); + depthBuffer.setClear( 1 ); + stencilBuffer.setClear( 0 ); + + enable( gl.DEPTH_TEST ); + depthBuffer.setFunc( LessEqualDepth ); + + setFlipSided( false ); + setCullFace( CullFaceBack ); + enable( gl.CULL_FACE ); + + enable( gl.BLEND ); + setBlending( NormalBlending ); + + // + + function initAttributes() { + + for ( var i = 0, l = newAttributes.length; i < l; i ++ ) { + + newAttributes[ i ] = 0; + + } + + } + + function enableAttribute( attribute ) { + + newAttributes[ attribute ] = 1; + + if ( enabledAttributes[ attribute ] === 0 ) { + + gl.enableVertexAttribArray( attribute ); + enabledAttributes[ attribute ] = 1; + + } + + if ( attributeDivisors[ attribute ] !== 0 ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + extension.vertexAttribDivisorANGLE( attribute, 0 ); + attributeDivisors[ attribute ] = 0; + + } + + } + + function enableAttributeAndDivisor( attribute, meshPerAttribute ) { + + newAttributes[ attribute ] = 1; + + if ( enabledAttributes[ attribute ] === 0 ) { + + gl.enableVertexAttribArray( attribute ); + enabledAttributes[ attribute ] = 1; + + } + + if ( attributeDivisors[ attribute ] !== meshPerAttribute ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + extension.vertexAttribDivisorANGLE( attribute, meshPerAttribute ); + attributeDivisors[ attribute ] = meshPerAttribute; + + } + + } + + function disableUnusedAttributes() { + + for ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) { + + if ( enabledAttributes[ i ] !== newAttributes[ i ] ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + } + + function enable( id ) { + + if ( capabilities[ id ] !== true ) { + + gl.enable( id ); + capabilities[ id ] = true; + + } + + } + + function disable( id ) { + + if ( capabilities[ id ] !== false ) { + + gl.disable( id ); + capabilities[ id ] = false; + + } + + } + + function getCompressedTextureFormats() { + + if ( compressedTextureFormats === null ) { + + compressedTextureFormats = []; + + if ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) || + extensions.get( 'WEBGL_compressed_texture_s3tc' ) || + extensions.get( 'WEBGL_compressed_texture_etc1' ) || + extensions.get( 'WEBGL_compressed_texture_astc' ) ) { + + var formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS ); + + for ( var i = 0; i < formats.length; i ++ ) { + + compressedTextureFormats.push( formats[ i ] ); + + } + + } + + } + + return compressedTextureFormats; + + } + + function useProgram( program ) { + + if ( currentProgram !== program ) { + + gl.useProgram( program ); + + currentProgram = program; + + return true; + + } + + return false; + + } + + function setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) { + + if ( blending !== NoBlending ) { + + enable( gl.BLEND ); + + } else { + + disable( gl.BLEND ); + + } + + if ( blending !== CustomBlending ) { + + if ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) { + + switch ( blending ) { + + case AdditiveBlending: + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ONE, gl.ONE, gl.ONE, gl.ONE ); + + } else { + + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.SRC_ALPHA, gl.ONE ); + + } + break; + + case SubtractiveBlending: + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA ); + + } else { + + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR ); + + } + break; + + case MultiplyBlending: + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA ); + + } else { + + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.ZERO, gl.SRC_COLOR ); + + } + break; + + default: + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); + + } else { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); + + } + + } + + } + + currentBlendEquation = null; + currentBlendSrc = null; + currentBlendDst = null; + currentBlendEquationAlpha = null; + currentBlendSrcAlpha = null; + currentBlendDstAlpha = null; + + } else { + + blendEquationAlpha = blendEquationAlpha || blendEquation; + blendSrcAlpha = blendSrcAlpha || blendSrc; + blendDstAlpha = blendDstAlpha || blendDst; + + if ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) { + + gl.blendEquationSeparate( utils.convert( blendEquation ), utils.convert( blendEquationAlpha ) ); + + currentBlendEquation = blendEquation; + currentBlendEquationAlpha = blendEquationAlpha; + + } + + if ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) { + + gl.blendFuncSeparate( utils.convert( blendSrc ), utils.convert( blendDst ), utils.convert( blendSrcAlpha ), utils.convert( blendDstAlpha ) ); + + currentBlendSrc = blendSrc; + currentBlendDst = blendDst; + currentBlendSrcAlpha = blendSrcAlpha; + currentBlendDstAlpha = blendDstAlpha; + + } + + } + + currentBlending = blending; + currentPremultipledAlpha = premultipliedAlpha; + + } + + function setMaterial( material, frontFaceCW ) { + + material.side === DoubleSide + ? disable( gl.CULL_FACE ) + : enable( gl.CULL_FACE ); + + var flipSided = ( material.side === BackSide ); + if ( frontFaceCW ) flipSided = ! flipSided; + + setFlipSided( flipSided ); + + material.transparent === true + ? setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha ) + : setBlending( NoBlending ); + + depthBuffer.setFunc( material.depthFunc ); + depthBuffer.setTest( material.depthTest ); + depthBuffer.setMask( material.depthWrite ); + colorBuffer.setMask( material.colorWrite ); + + setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits ); + + } + + // + + function setFlipSided( flipSided ) { + + if ( currentFlipSided !== flipSided ) { + + if ( flipSided ) { + + gl.frontFace( gl.CW ); + + } else { + + gl.frontFace( gl.CCW ); + + } + + currentFlipSided = flipSided; + + } + + } + + function setCullFace( cullFace ) { + + if ( cullFace !== CullFaceNone ) { + + enable( gl.CULL_FACE ); + + if ( cullFace !== currentCullFace ) { + + if ( cullFace === CullFaceBack ) { + + gl.cullFace( gl.BACK ); + + } else if ( cullFace === CullFaceFront ) { + + gl.cullFace( gl.FRONT ); + + } else { + + gl.cullFace( gl.FRONT_AND_BACK ); + + } + + } + + } else { + + disable( gl.CULL_FACE ); + + } + + currentCullFace = cullFace; + + } + + function setLineWidth( width ) { + + if ( width !== currentLineWidth ) { + + if ( lineWidthAvailable ) gl.lineWidth( width ); + + currentLineWidth = width; + + } + + } + + function setPolygonOffset( polygonOffset, factor, units ) { + + if ( polygonOffset ) { + + enable( gl.POLYGON_OFFSET_FILL ); + + if ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) { + + gl.polygonOffset( factor, units ); + + currentPolygonOffsetFactor = factor; + currentPolygonOffsetUnits = units; + + } + + } else { + + disable( gl.POLYGON_OFFSET_FILL ); + + } + + } + + function setScissorTest( scissorTest ) { + + if ( scissorTest ) { + + enable( gl.SCISSOR_TEST ); + + } else { + + disable( gl.SCISSOR_TEST ); + + } + + } + + // texture + + function activeTexture( webglSlot ) { + + if ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1; + + if ( currentTextureSlot !== webglSlot ) { + + gl.activeTexture( webglSlot ); + currentTextureSlot = webglSlot; + + } + + } + + function bindTexture( webglType, webglTexture ) { + + if ( currentTextureSlot === null ) { + + activeTexture(); + + } + + var boundTexture = currentBoundTextures[ currentTextureSlot ]; + + if ( boundTexture === undefined ) { + + boundTexture = { type: undefined, texture: undefined }; + currentBoundTextures[ currentTextureSlot ] = boundTexture; + + } + + if ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) { + + gl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] ); + + boundTexture.type = webglType; + boundTexture.texture = webglTexture; + + } + + } + + function compressedTexImage2D() { + + try { + + gl.compressedTexImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function texImage2D() { + + try { + + gl.texImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + // + + function scissor( scissor ) { + + if ( currentScissor.equals( scissor ) === false ) { + + gl.scissor( scissor.x, scissor.y, scissor.z, scissor.w ); + currentScissor.copy( scissor ); + + } + + } + + function viewport( viewport ) { + + if ( currentViewport.equals( viewport ) === false ) { + + gl.viewport( viewport.x, viewport.y, viewport.z, viewport.w ); + currentViewport.copy( viewport ); + + } + + } + + // + + function reset() { + + for ( var i = 0; i < enabledAttributes.length; i ++ ) { + + if ( enabledAttributes[ i ] === 1 ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + capabilities = {}; + + compressedTextureFormats = null; + + currentTextureSlot = null; + currentBoundTextures = {}; + + currentProgram = null; + + currentBlending = null; + + currentFlipSided = null; + currentCullFace = null; + + colorBuffer.reset(); + depthBuffer.reset(); + stencilBuffer.reset(); + + } + + return { + + buffers: { + color: colorBuffer, + depth: depthBuffer, + stencil: stencilBuffer + }, + + initAttributes: initAttributes, + enableAttribute: enableAttribute, + enableAttributeAndDivisor: enableAttributeAndDivisor, + disableUnusedAttributes: disableUnusedAttributes, + enable: enable, + disable: disable, + getCompressedTextureFormats: getCompressedTextureFormats, + + useProgram: useProgram, + + setBlending: setBlending, + setMaterial: setMaterial, + + setFlipSided: setFlipSided, + setCullFace: setCullFace, + + setLineWidth: setLineWidth, + setPolygonOffset: setPolygonOffset, + + setScissorTest: setScissorTest, + + activeTexture: activeTexture, + bindTexture: bindTexture, + compressedTexImage2D: compressedTexImage2D, + texImage2D: texImage2D, + + scissor: scissor, + viewport: viewport, + + reset: reset + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) { + + var _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext ); /* global WebGL2RenderingContext */ + var _videoTextures = {}; + var _canvas; + + // + + function clampToMaxSize( image, maxSize ) { + + if ( image.width > maxSize || image.height > maxSize ) { + + if ( 'data' in image ) { + + console.warn( 'THREE.WebGLRenderer: image in DataTexture is too big (' + image.width + 'x' + image.height + ').' ); + return; + + } + + // Warning: Scaling through the canvas will only work with images that use + // premultiplied alpha. + + var scale = maxSize / Math.max( image.width, image.height ); + + var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = Math.floor( image.width * scale ); + canvas.height = Math.floor( image.height * scale ); + + var context = canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height ); + + console.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image ); + + return canvas; + + } + + return image; + + } + + function isPowerOfTwo( image ) { + + return _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height ); + + } + + function makePowerOfTwo( image ) { + + if ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof ImageBitmap ) { + + if ( _canvas === undefined ) _canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + + _canvas.width = _Math.floorPowerOfTwo( image.width ); + _canvas.height = _Math.floorPowerOfTwo( image.height ); + + var context = _canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, _canvas.width, _canvas.height ); + + console.warn( 'THREE.WebGLRenderer: image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + _canvas.width + 'x' + _canvas.height, image ); + + return _canvas; + + } + + return image; + + } + + function textureNeedsPowerOfTwo( texture ) { + + return ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) || + ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ); + + } + + function textureNeedsGenerateMipmaps( texture, isPowerOfTwo ) { + + return texture.generateMipmaps && isPowerOfTwo && + texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter; + + } + + function generateMipmap( target, texture, width, height ) { + + _gl.generateMipmap( target ); + + var textureProperties = properties.get( texture ); + + // 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; + + } + + // Fallback filters for non-power-of-2 textures + + function filterFallback( f ) { + + if ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) { + + return _gl.NEAREST; + + } + + return _gl.LINEAR; + + } + + // + + function onTextureDispose( event ) { + + var texture = event.target; + + texture.removeEventListener( 'dispose', onTextureDispose ); + + deallocateTexture( texture ); + + if ( texture.isVideoTexture ) { + + delete _videoTextures[ texture.id ]; + + } + + info.memory.textures --; + + } + + function onRenderTargetDispose( event ) { + + var renderTarget = event.target; + + renderTarget.removeEventListener( 'dispose', onRenderTargetDispose ); + + deallocateRenderTarget( renderTarget ); + + info.memory.textures --; + + } + + // + + function deallocateTexture( texture ) { + + var textureProperties = properties.get( texture ); + + if ( texture.image && textureProperties.__image__webglTextureCube ) { + + // cube texture + + _gl.deleteTexture( textureProperties.__image__webglTextureCube ); + + } else { + + // 2D texture + + if ( textureProperties.__webglInit === undefined ) return; + + _gl.deleteTexture( textureProperties.__webglTexture ); + + } + + // remove all webgl properties + properties.remove( texture ); + + } + + function deallocateRenderTarget( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); + + if ( ! renderTarget ) return; + + if ( textureProperties.__webglTexture !== undefined ) { + + _gl.deleteTexture( textureProperties.__webglTexture ); + + } + + if ( renderTarget.depthTexture ) { + + renderTarget.depthTexture.dispose(); + + } + + if ( renderTarget.isWebGLRenderTargetCube ) { + + for ( var i = 0; i < 6; i ++ ) { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] ); + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] ); + + } + + } else { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer ); + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer ); + + } + + properties.remove( renderTarget.texture ); + properties.remove( renderTarget ); + + } + + // + + + + function setTexture2D( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.isVideoTexture ) updateVideoTexture( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + var image = texture.image; + + if ( image === undefined ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture ); + + } else if ( image.complete === false ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture ); + + } else { + + uploadTexture( textureProperties, texture, slot ); + return; + + } + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + + } + + function setTextureCube( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.image.length === 6 ) { + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + if ( ! textureProperties.__image__webglTextureCube ) { + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__image__webglTextureCube = _gl.createTexture(); + + info.memory.textures ++; + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube ); + + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); + + var isCompressed = ( texture && texture.isCompressedTexture ); + var isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture ); + + var cubeImage = []; + + for ( var i = 0; i < 6; i ++ ) { + + if ( ! isCompressed && ! isDataTexture ) { + + cubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize ); + + } else { + + cubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ]; + + } + + } + + var image = cubeImage[ 0 ], + isPowerOfTwoImage = isPowerOfTwo( image ), + glFormat = utils.convert( texture.format ), + glType = utils.convert( texture.type ); + + setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage ); + + for ( var i = 0; i < 6; i ++ ) { + + if ( ! isCompressed ) { + + if ( isDataTexture ) { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data ); + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] ); + + } + + } else { + + var mipmap, mipmaps = cubeImage[ i ].mipmaps; + + for ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) { + + mipmap = mipmaps[ j ]; + + if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) { + + if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { + + state.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + } + + } + + if ( ! isCompressed ) { + + textureProperties.__maxMipLevel = 0; + + } else { + + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } + + if ( textureNeedsGenerateMipmaps( texture, isPowerOfTwoImage ) ) { + + // We assume images for cube map have the same size. + generateMipmap( _gl.TEXTURE_CUBE_MAP, texture, image.width, image.height ); + + } + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } else { + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube ); + + } + + } + + } + + function setTextureCubeDynamic( texture, slot ) { + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture ); + + } + + function setTextureParameters( textureType, texture, isPowerOfTwoImage ) { + + var extension; + + if ( isPowerOfTwoImage ) { + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, utils.convert( texture.wrapS ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, utils.convert( texture.wrapT ) ); + + _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, utils.convert( texture.magFilter ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, utils.convert( texture.minFilter ) ); + + } else { + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE ); + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE ); + + if ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.', texture ); + + } + + _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) ); + + if ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.', texture ); + + } + + } + + extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension ) { + + if ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return; + if ( texture.type === HalfFloatType && extensions.get( 'OES_texture_half_float_linear' ) === null ) return; + + if ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) { + + _gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) ); + properties.get( texture ).__currentAnisotropy = texture.anisotropy; + + } + + } + + } + + function uploadTexture( textureProperties, texture, slot ) { + + if ( textureProperties.__webglInit === undefined ) { + + textureProperties.__webglInit = true; + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + info.memory.textures ++; + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_2D, 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 ); + + var image = clampToMaxSize( texture.image, capabilities.maxTextureSize ); + + if ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) { + + image = makePowerOfTwo( image ); + + } + + var isPowerOfTwoImage = isPowerOfTwo( image ), + glFormat = utils.convert( texture.format ), + glType = utils.convert( texture.type ); + + setTextureParameters( _gl.TEXTURE_2D, texture, isPowerOfTwoImage ); + + var mipmap, mipmaps = texture.mipmaps; + + if ( texture.isDepthTexture ) { + + // populate depth texture with dummy data + + var internalFormat = _gl.DEPTH_COMPONENT; + + if ( texture.type === FloatType ) { + + if ( ! _isWebGL2 ) throw new Error( 'Float Depth Texture only supported in WebGL2.0' ); + internalFormat = _gl.DEPTH_COMPONENT32F; + + } else if ( _isWebGL2 ) { + + // WebGL 2.0 requires signed internalformat for glTexImage2D + internalFormat = _gl.DEPTH_COMPONENT16; + + } + + if ( texture.format === DepthFormat && internalFormat === _gl.DEPTH_COMPONENT ) { + + // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are + // DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) { + + console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' ); + + texture.type = UnsignedShortType; + glType = utils.convert( texture.type ); + + } + + } + + // Depth stencil textures need the DEPTH_STENCIL internal format + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.format === DepthStencilFormat ) { + + internalFormat = _gl.DEPTH_STENCIL; + + // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are + // DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL. + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.type !== UnsignedInt248Type ) { + + console.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' ); + + texture.type = UnsignedInt248Type; + glType = utils.convert( texture.type ); + + } + + } + + state.texImage2D( _gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null ); + + } else if ( texture.isDataTexture ) { + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && isPowerOfTwoImage ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + texture.generateMipmaps = false; + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data ); + textureProperties.__maxMipLevel = 0; + + } + + } else if ( texture.isCompressedTexture ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + + if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) { + + if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { + + state.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } else { + + // regular Texture (image, video, canvas) + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && isPowerOfTwoImage ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap ); + + } + + texture.generateMipmaps = false; + textureProperties.__maxMipLevel = mipmaps.length - 1; + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image ); + textureProperties.__maxMipLevel = 0; + + } + + } + + if ( textureNeedsGenerateMipmaps( texture, isPowerOfTwoImage ) ) { + + generateMipmap( _gl.TEXTURE_2D, texture, image.width, image.height ); + + } + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } + + // Render targets + + // Setup storage for target texture and bind it to correct framebuffer + function setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) { + + var glFormat = utils.convert( renderTarget.texture.format ); + var glType = utils.convert( renderTarget.texture.type ); + state.texImage2D( textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null ); + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 ); + _gl.bindFramebuffer( _gl.FRAMEBUFFER, null ); + + } + + // Setup storage for internal depth/stencil buffers and bind to correct framebuffer + function setupRenderBufferStorage( renderbuffer, renderTarget ) { + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer ); + + if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); + + } else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); + + } else { + + // FIXME: We don't support !depth !stencil + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height ); + + } + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, null ); + + } + + // Setup resources for a Depth Texture for a FBO (needs an extension) + function setupDepthTexture( framebuffer, renderTarget ) { + + var isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube ); + if ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' ); + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + if ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) { + + throw new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' ); + + } + + // upload an empty depth texture with framebuffer size + if ( ! properties.get( renderTarget.depthTexture ).__webglTexture || + renderTarget.depthTexture.image.width !== renderTarget.width || + renderTarget.depthTexture.image.height !== renderTarget.height ) { + + renderTarget.depthTexture.image.width = renderTarget.width; + renderTarget.depthTexture.image.height = renderTarget.height; + renderTarget.depthTexture.needsUpdate = true; + + } + + setTexture2D( renderTarget.depthTexture, 0 ); + + var webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture; + + if ( renderTarget.depthTexture.format === DepthFormat ) { + + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 ); + + } else if ( renderTarget.depthTexture.format === DepthStencilFormat ) { + + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 ); + + } else { + + throw new Error( 'Unknown depthTexture format' ); + + } + + } + + // Setup GL resources for a non-texture depth buffer + function setupDepthRenderbuffer( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + + var isCube = ( renderTarget.isWebGLRenderTargetCube === true ); + + if ( renderTarget.depthTexture ) { + + if ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' ); + + setupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget ); + + } else { + + if ( isCube ) { + + renderTargetProperties.__webglDepthbuffer = []; + + for ( var i = 0; i < 6; i ++ ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] ); + renderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget ); + + } + + } else { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer ); + renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget ); + + } + + } + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, null ); + + } + + // Set up GL resources for the render target + function setupRenderTarget( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); + + renderTarget.addEventListener( 'dispose', onRenderTargetDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + info.memory.textures ++; + + var isCube = ( renderTarget.isWebGLRenderTargetCube === true ); + var isTargetPowerOfTwo = isPowerOfTwo( renderTarget ); + + // Setup framebuffer + + if ( isCube ) { + + renderTargetProperties.__webglFramebuffer = []; + + for ( var i = 0; i < 6; i ++ ) { + + renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer(); + + } + + } else { + + renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer(); + + } + + // Setup color buffer + + if ( isCube ) { + + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture ); + setTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo ); + + for ( var i = 0; i < 6; i ++ ) { + + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i ); + + } + + if ( textureNeedsGenerateMipmaps( renderTarget.texture, isTargetPowerOfTwo ) ) { + + generateMipmap( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, renderTarget.width, renderTarget.height ); + + } + + state.bindTexture( _gl.TEXTURE_CUBE_MAP, null ); + + } else { + + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + setTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo ); + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D ); + + if ( textureNeedsGenerateMipmaps( renderTarget.texture, isTargetPowerOfTwo ) ) { + + generateMipmap( _gl.TEXTURE_2D, renderTarget.texture, renderTarget.width, renderTarget.height ); + + } + + state.bindTexture( _gl.TEXTURE_2D, null ); + + } + + // Setup depth and stencil buffers + + if ( renderTarget.depthBuffer ) { + + setupDepthRenderbuffer( renderTarget ); + + } + + } + + function updateRenderTargetMipmap( renderTarget ) { + + var texture = renderTarget.texture; + var isTargetPowerOfTwo = isPowerOfTwo( renderTarget ); + + if ( textureNeedsGenerateMipmaps( texture, isTargetPowerOfTwo ) ) { + + var target = renderTarget.isWebGLRenderTargetCube ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D; + var webglTexture = properties.get( texture ).__webglTexture; + + state.bindTexture( target, webglTexture ); + generateMipmap( target, texture, renderTarget.width, renderTarget.height ); + state.bindTexture( target, null ); + + } + + } + + function updateVideoTexture( texture ) { + + var id = texture.id; + var frame = info.render.frame; + + // Check the last frame we updated the VideoTexture + + if ( _videoTextures[ id ] !== frame ) { + + _videoTextures[ id ] = frame; + texture.update(); + + } + + } + + this.setTexture2D = setTexture2D; + this.setTextureCube = setTextureCube; + this.setTextureCubeDynamic = setTextureCubeDynamic; + this.setupRenderTarget = setupRenderTarget; + this.updateRenderTargetMipmap = updateRenderTargetMipmap; + + } + + /** + * @author thespite / http://www.twitter.com/thespite + */ + + function WebGLUtils( gl, extensions ) { + + function convert( p ) { + + var extension; + + if ( p === RepeatWrapping ) return gl.REPEAT; + if ( p === ClampToEdgeWrapping ) return gl.CLAMP_TO_EDGE; + if ( p === MirroredRepeatWrapping ) return gl.MIRRORED_REPEAT; + + if ( p === NearestFilter ) return gl.NEAREST; + if ( p === NearestMipMapNearestFilter ) return gl.NEAREST_MIPMAP_NEAREST; + if ( p === NearestMipMapLinearFilter ) return gl.NEAREST_MIPMAP_LINEAR; + + if ( p === LinearFilter ) return gl.LINEAR; + if ( p === LinearMipMapNearestFilter ) return gl.LINEAR_MIPMAP_NEAREST; + if ( p === LinearMipMapLinearFilter ) return gl.LINEAR_MIPMAP_LINEAR; + + if ( p === UnsignedByteType ) return gl.UNSIGNED_BYTE; + if ( p === UnsignedShort4444Type ) return gl.UNSIGNED_SHORT_4_4_4_4; + if ( p === UnsignedShort5551Type ) return gl.UNSIGNED_SHORT_5_5_5_1; + if ( p === UnsignedShort565Type ) return gl.UNSIGNED_SHORT_5_6_5; + + if ( p === ByteType ) return gl.BYTE; + if ( p === ShortType ) return gl.SHORT; + if ( p === UnsignedShortType ) return gl.UNSIGNED_SHORT; + if ( p === IntType ) return gl.INT; + if ( p === UnsignedIntType ) return gl.UNSIGNED_INT; + if ( p === FloatType ) return gl.FLOAT; + + if ( p === HalfFloatType ) { + + extension = extensions.get( 'OES_texture_half_float' ); + + if ( extension !== null ) return extension.HALF_FLOAT_OES; + + } + + if ( p === AlphaFormat ) return gl.ALPHA; + if ( p === RGBFormat ) return gl.RGB; + if ( p === RGBAFormat ) return gl.RGBA; + if ( p === LuminanceFormat ) return gl.LUMINANCE; + if ( p === LuminanceAlphaFormat ) return gl.LUMINANCE_ALPHA; + if ( p === DepthFormat ) return gl.DEPTH_COMPONENT; + if ( p === DepthStencilFormat ) return gl.DEPTH_STENCIL; + + if ( p === AddEquation ) return gl.FUNC_ADD; + if ( p === SubtractEquation ) return gl.FUNC_SUBTRACT; + if ( p === ReverseSubtractEquation ) return gl.FUNC_REVERSE_SUBTRACT; + + if ( p === ZeroFactor ) return gl.ZERO; + if ( p === OneFactor ) return gl.ONE; + if ( p === SrcColorFactor ) return gl.SRC_COLOR; + if ( p === OneMinusSrcColorFactor ) return gl.ONE_MINUS_SRC_COLOR; + if ( p === SrcAlphaFactor ) return gl.SRC_ALPHA; + if ( p === OneMinusSrcAlphaFactor ) return gl.ONE_MINUS_SRC_ALPHA; + if ( p === DstAlphaFactor ) return gl.DST_ALPHA; + if ( p === OneMinusDstAlphaFactor ) return gl.ONE_MINUS_DST_ALPHA; + + if ( p === DstColorFactor ) return gl.DST_COLOR; + if ( p === OneMinusDstColorFactor ) return gl.ONE_MINUS_DST_COLOR; + if ( p === SrcAlphaSaturateFactor ) return gl.SRC_ALPHA_SATURATE; + + if ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || + p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + if ( extension !== null ) { + + if ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT; + if ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT; + + } + + } + + if ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || + p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + if ( extension !== null ) { + + if ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; + if ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; + if ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + if ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; + + } + + } + + if ( p === RGB_ETC1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_etc1' ); + + if ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL; + + } + + if ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format || + p === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format || + p === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format || + p === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format || + p === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_astc' ); + + if ( extension !== null ) { + + return p; + + } + + } + + if ( p === MinEquation || p === MaxEquation ) { + + extension = extensions.get( 'EXT_blend_minmax' ); + + if ( extension !== null ) { + + if ( p === MinEquation ) return extension.MIN_EXT; + if ( p === MaxEquation ) return extension.MAX_EXT; + + } + + } + + if ( p === UnsignedInt248Type ) { + + extension = extensions.get( 'WEBGL_depth_texture' ); + + if ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL; + + } + + return 0; + + } + + return { convert: convert }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author greggman / http://games.greggman.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author tschw + */ + + function PerspectiveCamera( fov, aspect, near, far ) { + + Camera.call( this ); + + this.type = 'PerspectiveCamera'; + + this.fov = fov !== undefined ? fov : 50; + this.zoom = 1; + + this.near = near !== undefined ? near : 0.1; + this.far = far !== undefined ? far : 2000; + this.focus = 10; + + this.aspect = aspect !== undefined ? aspect : 1; + this.view = null; + + this.filmGauge = 35; // width of the film (default in millimeters) + this.filmOffset = 0; // horizontal film offset (same unit as gauge) + + this.updateProjectionMatrix(); + + } + + PerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), { + + constructor: PerspectiveCamera, + + isPerspectiveCamera: true, + + copy: function ( source, recursive ) { + + Camera.prototype.copy.call( this, source, recursive ); + + this.fov = source.fov; + this.zoom = source.zoom; + + this.near = source.near; + this.far = source.far; + this.focus = source.focus; + + this.aspect = source.aspect; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + this.filmGauge = source.filmGauge; + this.filmOffset = source.filmOffset; + + return this; + + }, + + /** + * Sets the FOV by focal length in respect to the current .filmGauge. + * + * The default film gauge is 35, so that the focal length can be specified for + * a 35mm (full frame) camera. + * + * Values for focal length and film gauge must have the same unit. + */ + setFocalLength: function ( focalLength ) { + + // see http://www.bobatkins.com/photography/technical/field_of_view.html + var vExtentSlope = 0.5 * this.getFilmHeight() / focalLength; + + this.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope ); + this.updateProjectionMatrix(); + + }, + + /** + * Calculates the focal length from the current .fov and .filmGauge. + */ + getFocalLength: function () { + + var vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov ); + + return 0.5 * this.getFilmHeight() / vExtentSlope; + + }, + + getEffectiveFOV: function () { + + return _Math.RAD2DEG * 2 * Math.atan( + Math.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom ); + + }, + + getFilmWidth: function () { + + // film not completely covered in portrait format (aspect < 1) + return this.filmGauge * Math.min( this.aspect, 1 ); + + }, + + getFilmHeight: function () { + + // film not completely covered in landscape format (aspect > 1) + return this.filmGauge / Math.max( this.aspect, 1 ); + + }, + + /** + * Sets an offset in a larger frustum. This is useful for multi-window or + * multi-monitor/multi-machine setups. + * + * For example, if you have 3x2 monitors and each monitor is 1920x1080 and + * the monitors are in grid like this + * + * +---+---+---+ + * | A | B | C | + * +---+---+---+ + * | D | E | F | + * +---+---+---+ + * + * then for each monitor you would call it like this + * + * var w = 1920; + * var h = 1080; + * var fullWidth = w * 3; + * var fullHeight = h * 2; + * + * --A-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h ); + * --B-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h ); + * --C-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h ); + * --D-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h ); + * --E-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h ); + * --F-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h ); + * + * Note there is no reason monitors have to be the same size or in a grid. + */ + setViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) { + + this.aspect = fullWidth / fullHeight; + + if ( this.view === null ) { + + this.view = { + enabled: true, + fullWidth: 1, + fullHeight: 1, + offsetX: 0, + offsetY: 0, + width: 1, + height: 1 + }; + + } + + this.view.enabled = true; + this.view.fullWidth = fullWidth; + this.view.fullHeight = fullHeight; + this.view.offsetX = x; + this.view.offsetY = y; + this.view.width = width; + this.view.height = height; + + this.updateProjectionMatrix(); + + }, + + clearViewOffset: function () { + + if ( this.view !== null ) { + + this.view.enabled = false; + + } + + this.updateProjectionMatrix(); + + }, + + updateProjectionMatrix: function () { + + var near = this.near, + top = near * Math.tan( + _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom, + height = 2 * top, + width = this.aspect * height, + left = - 0.5 * width, + view = this.view; + + if ( this.view !== null && this.view.enabled ) { + + var fullWidth = view.fullWidth, + fullHeight = view.fullHeight; + + left += view.offsetX * width / fullWidth; + top -= view.offsetY * height / fullHeight; + width *= view.width / fullWidth; + height *= view.height / fullHeight; + + } + + var skew = this.filmOffset; + if ( skew !== 0 ) left += near * skew / this.getFilmWidth(); + + this.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far ); + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.fov = this.fov; + data.object.zoom = this.zoom; + + data.object.near = this.near; + data.object.far = this.far; + data.object.focus = this.focus; + + data.object.aspect = this.aspect; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + data.object.filmGauge = this.filmGauge; + data.object.filmOffset = this.filmOffset; + + return data; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ArrayCamera( array ) { + + PerspectiveCamera.call( this ); + + this.cameras = array || []; + + } + + ArrayCamera.prototype = Object.assign( Object.create( PerspectiveCamera.prototype ), { + + constructor: ArrayCamera, + + isArrayCamera: true + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebVRManager( renderer ) { + + var scope = this; + + var device = null; + var frameData = null; + + var poseTarget = null; + + var standingMatrix = new Matrix4(); + var standingMatrixInverse = new Matrix4(); + + if ( typeof window !== 'undefined' && 'VRFrameData' in window ) { + + frameData = new window.VRFrameData(); + window.addEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange, false ); + + } + + var matrixWorldInverse = new Matrix4(); + var tempQuaternion = new Quaternion(); + var tempPosition = new Vector3(); + + var cameraL = new PerspectiveCamera(); + cameraL.bounds = new Vector4( 0.0, 0.0, 0.5, 1.0 ); + cameraL.layers.enable( 1 ); + + var cameraR = new PerspectiveCamera(); + cameraR.bounds = new Vector4( 0.5, 0.0, 0.5, 1.0 ); + cameraR.layers.enable( 2 ); + + var cameraVR = new ArrayCamera( [ cameraL, cameraR ] ); + cameraVR.layers.enable( 1 ); + cameraVR.layers.enable( 2 ); + + // + + function isPresenting() { + + return device !== null && device.isPresenting === true; + + } + + var currentSize, currentPixelRatio; + + function onVRDisplayPresentChange() { + + if ( isPresenting() ) { + + var eyeParameters = device.getEyeParameters( 'left' ); + var renderWidth = eyeParameters.renderWidth; + var renderHeight = eyeParameters.renderHeight; + + currentPixelRatio = renderer.getPixelRatio(); + currentSize = renderer.getSize(); + + renderer.setDrawingBufferSize( renderWidth * 2, renderHeight, 1 ); + + } else if ( scope.enabled ) { + + renderer.setDrawingBufferSize( currentSize.width, currentSize.height, currentPixelRatio ); + + } + + } + + // + + this.enabled = false; + this.userHeight = 1.6; + + this.getDevice = function () { + + return device; + + }; + + this.setDevice = function ( value ) { + + if ( value !== undefined ) device = value; + + }; + + this.setPoseTarget = function ( object ) { + + if ( object !== undefined ) poseTarget = object; + + }; + + this.getCamera = function ( camera ) { + + if ( device === null ) return camera; + + device.depthNear = camera.near; + device.depthFar = camera.far; + + device.getFrameData( frameData ); + + // + + var stageParameters = device.stageParameters; + + if ( stageParameters ) { + + standingMatrix.fromArray( stageParameters.sittingToStandingTransform ); + + } else { + + standingMatrix.makeTranslation( 0, scope.userHeight, 0 ); + + } + + + var pose = frameData.pose; + var poseObject = poseTarget !== null ? poseTarget : camera; + + // We want to manipulate poseObject by its position and quaternion components since users may rely on them. + poseObject.matrix.copy( standingMatrix ); + poseObject.matrix.decompose( poseObject.position, poseObject.quaternion, poseObject.scale ); + + if ( pose.orientation !== null ) { + + tempQuaternion.fromArray( pose.orientation ); + poseObject.quaternion.multiply( tempQuaternion ); + + } + + if ( pose.position !== null ) { + + tempQuaternion.setFromRotationMatrix( standingMatrix ); + tempPosition.fromArray( pose.position ); + tempPosition.applyQuaternion( tempQuaternion ); + poseObject.position.add( tempPosition ); + + } + + poseObject.updateMatrixWorld(); + + if ( device.isPresenting === false ) return camera; + + // + + cameraL.near = camera.near; + cameraR.near = camera.near; + + cameraL.far = camera.far; + cameraR.far = camera.far; + + cameraVR.matrixWorld.copy( camera.matrixWorld ); + cameraVR.matrixWorldInverse.copy( camera.matrixWorldInverse ); + + cameraL.matrixWorldInverse.fromArray( frameData.leftViewMatrix ); + cameraR.matrixWorldInverse.fromArray( frameData.rightViewMatrix ); + + // TODO (mrdoob) Double check this code + + standingMatrixInverse.getInverse( standingMatrix ); + + cameraL.matrixWorldInverse.multiply( standingMatrixInverse ); + cameraR.matrixWorldInverse.multiply( standingMatrixInverse ); + + var parent = poseObject.parent; + + if ( parent !== null ) { + + matrixWorldInverse.getInverse( parent.matrixWorld ); + + cameraL.matrixWorldInverse.multiply( matrixWorldInverse ); + cameraR.matrixWorldInverse.multiply( matrixWorldInverse ); + + } + + // envMap and Mirror needs camera.matrixWorld + + cameraL.matrixWorld.getInverse( cameraL.matrixWorldInverse ); + cameraR.matrixWorld.getInverse( cameraR.matrixWorldInverse ); + + cameraL.projectionMatrix.fromArray( frameData.leftProjectionMatrix ); + cameraR.projectionMatrix.fromArray( frameData.rightProjectionMatrix ); + + // HACK (mrdoob) + // https://github.com/w3c/webvr/issues/203 + + cameraVR.projectionMatrix.copy( cameraL.projectionMatrix ); + + // + + var layers = device.getLayers(); + + if ( layers.length ) { + + var layer = layers[ 0 ]; + + if ( layer.leftBounds !== null && layer.leftBounds.length === 4 ) { + + cameraL.bounds.fromArray( layer.leftBounds ); + + } + + if ( layer.rightBounds !== null && layer.rightBounds.length === 4 ) { + + cameraR.bounds.fromArray( layer.rightBounds ); + + } + + } + + return cameraVR; + + }; + + this.getStandingMatrix = function () { + + return standingMatrix; + + }; + + this.submitFrame = function () { + + if ( isPresenting() ) device.submitFrame(); + + }; + + this.dispose = function () { + + if ( typeof window !== 'undefined' ) { + + window.removeEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange ); + + } + + }; + + } + + /** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + * @author tschw + */ + + function WebGLRenderer( parameters ) { + + console.log( 'THREE.WebGLRenderer', REVISION ); + + parameters = parameters || {}; + + var _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ), + _context = parameters.context !== undefined ? parameters.context : null, + + _alpha = parameters.alpha !== undefined ? parameters.alpha : false, + _depth = parameters.depth !== undefined ? parameters.depth : true, + _stencil = parameters.stencil !== undefined ? parameters.stencil : true, + _antialias = parameters.antialias !== undefined ? parameters.antialias : false, + _premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true, + _preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false, + _powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default'; + + var currentRenderList = null; + var currentRenderState = null; + + // public properties + + this.domElement = _canvas; + this.context = null; + + // clearing + + this.autoClear = true; + this.autoClearColor = true; + this.autoClearDepth = true; + this.autoClearStencil = true; + + // scene graph + + this.sortObjects = true; + + // user-defined clipping + + this.clippingPlanes = []; + this.localClippingEnabled = false; + + // physically based shading + + this.gammaFactor = 2.0; // for backwards compatibility + this.gammaInput = false; + this.gammaOutput = false; + + // physical lights + + this.physicallyCorrectLights = false; + + // tone mapping + + this.toneMapping = LinearToneMapping; + this.toneMappingExposure = 1.0; + this.toneMappingWhitePoint = 1.0; + + // morphs + + this.maxMorphTargets = 8; + this.maxMorphNormals = 4; + + // internal properties + + var _this = this, + + _isContextLost = false, + + // internal state cache + + _currentRenderTarget = null, + _currentFramebuffer = null, + _currentMaterialId = - 1, + _currentGeometryProgram = '', + + _currentCamera = null, + _currentArrayCamera = null, + + _currentViewport = new Vector4(), + _currentScissor = new Vector4(), + _currentScissorTest = null, + + // + + _usedTextureUnits = 0, + + // + + _width = _canvas.width, + _height = _canvas.height, + + _pixelRatio = 1, + + _viewport = new Vector4( 0, 0, _width, _height ), + _scissor = new Vector4( 0, 0, _width, _height ), + _scissorTest = false, + + // frustum + + _frustum = new Frustum(), + + // clipping + + _clipping = new WebGLClipping(), + _clippingEnabled = false, + _localClippingEnabled = false, + + // camera matrices cache + + _projScreenMatrix = new Matrix4(), + + _vector3 = new Vector3(); + + function getTargetPixelRatio() { + + return _currentRenderTarget === null ? _pixelRatio : 1; + + } + + // initialize + + var _gl; + + try { + + var contextAttributes = { + alpha: _alpha, + depth: _depth, + stencil: _stencil, + antialias: _antialias, + premultipliedAlpha: _premultipliedAlpha, + preserveDrawingBuffer: _preserveDrawingBuffer, + powerPreference: _powerPreference + }; + + // event listeners must be registered before WebGL context is created, see #12753 + + _canvas.addEventListener( 'webglcontextlost', onContextLost, false ); + _canvas.addEventListener( 'webglcontextrestored', onContextRestore, false ); + + _gl = _context || _canvas.getContext( 'webgl', contextAttributes ) || _canvas.getContext( 'experimental-webgl', contextAttributes ); + + if ( _gl === null ) { + + if ( _canvas.getContext( 'webgl' ) !== null ) { + + throw new Error( 'Error creating WebGL context with your selected attributes.' ); + + } else { + + throw new Error( 'Error creating WebGL context.' ); + + } + + } + + // Some experimental-webgl implementations do not have getShaderPrecisionFormat + + if ( _gl.getShaderPrecisionFormat === undefined ) { + + _gl.getShaderPrecisionFormat = function () { + + return { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 }; + + }; + + } + + } catch ( error ) { + + console.error( 'THREE.WebGLRenderer: ' + error.message ); + + } + + var extensions, capabilities, state, info; + var properties, textures, attributes, geometries, objects; + var programCache, renderLists, renderStates; + + var background, morphtargets, bufferRenderer, indexedBufferRenderer; + var spriteRenderer; + + var utils; + + function initGLContext() { + + extensions = new WebGLExtensions( _gl ); + extensions.get( 'WEBGL_depth_texture' ); + extensions.get( 'OES_texture_float' ); + extensions.get( 'OES_texture_float_linear' ); + extensions.get( 'OES_texture_half_float' ); + extensions.get( 'OES_texture_half_float_linear' ); + extensions.get( 'OES_standard_derivatives' ); + extensions.get( 'OES_element_index_uint' ); + extensions.get( 'ANGLE_instanced_arrays' ); + + utils = new WebGLUtils( _gl, extensions ); + + capabilities = new WebGLCapabilities( _gl, extensions, parameters ); + + state = new WebGLState( _gl, extensions, utils ); + state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) ); + state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) ); + + info = new WebGLInfo( _gl ); + properties = new WebGLProperties(); + textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ); + attributes = new WebGLAttributes( _gl ); + geometries = new WebGLGeometries( _gl, attributes, info ); + objects = new WebGLObjects( geometries, info ); + morphtargets = new WebGLMorphtargets( _gl ); + programCache = new WebGLPrograms( _this, extensions, capabilities ); + renderLists = new WebGLRenderLists(); + renderStates = new WebGLRenderStates(); + + background = new WebGLBackground( _this, state, geometries, _premultipliedAlpha ); + + bufferRenderer = new WebGLBufferRenderer( _gl, extensions, info ); + indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info ); + + spriteRenderer = new WebGLSpriteRenderer( _this, _gl, state, textures, capabilities ); + + info.programs = programCache.programs; + + _this.context = _gl; + _this.capabilities = capabilities; + _this.extensions = extensions; + _this.properties = properties; + _this.renderLists = renderLists; + _this.state = state; + _this.info = info; + + } + + initGLContext(); + + // vr + + var vr = new WebVRManager( _this ); + + this.vr = vr; + + // shadow map + + var shadowMap = new WebGLShadowMap( _this, objects, capabilities.maxTextureSize ); + + this.shadowMap = shadowMap; + + // API + + this.getContext = function () { + + return _gl; + + }; + + this.getContextAttributes = function () { + + return _gl.getContextAttributes(); + + }; + + this.forceContextLoss = function () { + + var extension = extensions.get( 'WEBGL_lose_context' ); + if ( extension ) extension.loseContext(); + + }; + + this.forceContextRestore = function () { + + var extension = extensions.get( 'WEBGL_lose_context' ); + if ( extension ) extension.restoreContext(); + + }; + + this.getPixelRatio = function () { + + return _pixelRatio; + + }; + + this.setPixelRatio = function ( value ) { + + if ( value === undefined ) return; + + _pixelRatio = value; + + this.setSize( _width, _height, false ); + + }; + + this.getSize = function () { + + return { + width: _width, + height: _height + }; + + }; + + this.setSize = function ( width, height, updateStyle ) { + + var device = vr.getDevice(); + + if ( device && device.isPresenting ) { + + console.warn( 'THREE.WebGLRenderer: Can\'t change size while VR device is presenting.' ); + return; + + } + + _width = width; + _height = height; + + _canvas.width = width * _pixelRatio; + _canvas.height = height * _pixelRatio; + + if ( updateStyle !== false ) { + + _canvas.style.width = width + 'px'; + _canvas.style.height = height + 'px'; + + } + + this.setViewport( 0, 0, width, height ); + + }; + + this.getDrawingBufferSize = function () { + + return { + width: _width * _pixelRatio, + height: _height * _pixelRatio + }; + + }; + + this.setDrawingBufferSize = function ( width, height, pixelRatio ) { + + _width = width; + _height = height; + + _pixelRatio = pixelRatio; + + _canvas.width = width * pixelRatio; + _canvas.height = height * pixelRatio; + + this.setViewport( 0, 0, width, height ); + + }; + + this.getCurrentViewport = function () { + + return _currentViewport; + + }; + + this.setViewport = function ( x, y, width, height ) { + + _viewport.set( x, _height - y - height, width, height ); + state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) ); + + }; + + this.setScissor = function ( x, y, width, height ) { + + _scissor.set( x, _height - y - height, width, height ); + state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) ); + + }; + + this.setScissorTest = function ( boolean ) { + + state.setScissorTest( _scissorTest = boolean ); + + }; + + // Clearing + + this.getClearColor = function () { + + return background.getClearColor(); + + }; + + this.setClearColor = function () { + + background.setClearColor.apply( background, arguments ); + + }; + + this.getClearAlpha = function () { + + return background.getClearAlpha(); + + }; + + this.setClearAlpha = function () { + + background.setClearAlpha.apply( background, arguments ); + + }; + + this.clear = function ( color, depth, stencil ) { + + var 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; + + _gl.clear( bits ); + + }; + + this.clearColor = function () { + + this.clear( true, false, false ); + + }; + + this.clearDepth = function () { + + this.clear( false, true, false ); + + }; + + this.clearStencil = function () { + + this.clear( false, false, true ); + + }; + + this.clearTarget = function ( renderTarget, color, depth, stencil ) { + + this.setRenderTarget( renderTarget ); + this.clear( color, depth, stencil ); + + }; + + // + + this.dispose = function () { + + _canvas.removeEventListener( 'webglcontextlost', onContextLost, false ); + _canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false ); + + renderLists.dispose(); + renderStates.dispose(); + properties.dispose(); + objects.dispose(); + + vr.dispose(); + + stopAnimation(); + + }; + + // Events + + function onContextLost( event ) { + + event.preventDefault(); + + console.log( 'THREE.WebGLRenderer: Context Lost.' ); + + _isContextLost = true; + + } + + function onContextRestore( /* event */ ) { + + console.log( 'THREE.WebGLRenderer: Context Restored.' ); + + _isContextLost = false; + + initGLContext(); + + } + + function onMaterialDispose( event ) { + + var material = event.target; + + material.removeEventListener( 'dispose', onMaterialDispose ); + + deallocateMaterial( material ); + + } + + // Buffer deallocation + + function deallocateMaterial( material ) { + + releaseMaterialProgramReference( material ); + + properties.remove( material ); + + } + + + function releaseMaterialProgramReference( material ) { + + var programInfo = properties.get( material ).program; + + material.program = undefined; + + if ( programInfo !== undefined ) { + + programCache.releaseProgram( programInfo ); + + } + + } + + // Buffer rendering + + function renderObjectImmediate( object, program, material ) { + + object.render( function ( object ) { + + _this.renderBufferImmediate( object, program, material ); + + } ); + + } + + this.renderBufferImmediate = function ( object, program, material ) { + + state.initAttributes(); + + var buffers = properties.get( object ); + + if ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer(); + if ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer(); + if ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer(); + if ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer(); + + var programAttributes = program.getAttributes(); + + if ( object.hasPositions ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( programAttributes.position ); + _gl.vertexAttribPointer( programAttributes.position, 3, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasNormals ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal ); + + if ( ! material.isMeshPhongMaterial && + ! material.isMeshStandardMaterial && + ! material.isMeshNormalMaterial && + material.flatShading === true ) { + + for ( var i = 0, l = object.count * 3; i < l; i += 9 ) { + + var array = object.normalArray; + + var nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3; + var ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3; + var nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3; + + array[ i + 0 ] = nx; + array[ i + 1 ] = ny; + array[ i + 2 ] = nz; + + array[ i + 3 ] = nx; + array[ i + 4 ] = ny; + array[ i + 5 ] = nz; + + array[ i + 6 ] = nx; + array[ i + 7 ] = ny; + array[ i + 8 ] = nz; + + } + + } + + _gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( programAttributes.normal ); + + _gl.vertexAttribPointer( programAttributes.normal, 3, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasUvs && material.map ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( programAttributes.uv ); + + _gl.vertexAttribPointer( programAttributes.uv, 2, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasColors && material.vertexColors !== NoColors ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( programAttributes.color ); + + _gl.vertexAttribPointer( programAttributes.color, 3, _gl.FLOAT, false, 0, 0 ); + + } + + state.disableUnusedAttributes(); + + _gl.drawArrays( _gl.TRIANGLES, 0, object.count ); + + object.count = 0; + + }; + + this.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) { + + var frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 ); + + state.setMaterial( material, frontFaceCW ); + + var program = setProgram( camera, fog, material, object ); + var geometryProgram = geometry.id + '_' + program.id + '_' + ( material.wireframe === true ); + + var updateBuffers = false; + + if ( geometryProgram !== _currentGeometryProgram ) { + + _currentGeometryProgram = geometryProgram; + updateBuffers = true; + + } + + if ( object.morphTargetInfluences ) { + + morphtargets.update( object, geometry, material, program ); + + updateBuffers = true; + + } + + // + + var index = geometry.index; + var position = geometry.attributes.position; + var rangeFactor = 1; + + if ( material.wireframe === true ) { + + index = geometries.getWireframeAttribute( geometry ); + rangeFactor = 2; + + } + + var attribute; + var renderer = bufferRenderer; + + if ( index !== null ) { + + attribute = attributes.get( index ); + + renderer = indexedBufferRenderer; + renderer.setIndex( attribute ); + + } + + if ( updateBuffers ) { + + setupVertexAttributes( material, program, geometry ); + + if ( index !== null ) { + + _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, attribute.buffer ); + + } + + } + + // + + var dataCount = Infinity; + + if ( index !== null ) { + + dataCount = index.count; + + } else if ( position !== undefined ) { + + dataCount = position.count; + + } + + var rangeStart = geometry.drawRange.start * rangeFactor; + var rangeCount = geometry.drawRange.count * rangeFactor; + + var groupStart = group !== null ? group.start * rangeFactor : 0; + var groupCount = group !== null ? group.count * rangeFactor : Infinity; + + var drawStart = Math.max( rangeStart, groupStart ); + var drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1; + + var drawCount = Math.max( 0, drawEnd - drawStart + 1 ); + + if ( drawCount === 0 ) return; + + // + + if ( object.isMesh ) { + + if ( material.wireframe === true ) { + + state.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() ); + renderer.setMode( _gl.LINES ); + + } else { + + switch ( object.drawMode ) { + + case TrianglesDrawMode: + renderer.setMode( _gl.TRIANGLES ); + break; + + case TriangleStripDrawMode: + renderer.setMode( _gl.TRIANGLE_STRIP ); + break; + + case TriangleFanDrawMode: + renderer.setMode( _gl.TRIANGLE_FAN ); + break; + + } + + } + + + } else if ( object.isLine ) { + + var lineWidth = material.linewidth; + + if ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material + + state.setLineWidth( lineWidth * getTargetPixelRatio() ); + + if ( object.isLineSegments ) { + + renderer.setMode( _gl.LINES ); + + } else if ( object.isLineLoop ) { + + renderer.setMode( _gl.LINE_LOOP ); + + } else { + + renderer.setMode( _gl.LINE_STRIP ); + + } + + } else if ( object.isPoints ) { + + renderer.setMode( _gl.POINTS ); + + } + + if ( geometry && geometry.isInstancedBufferGeometry ) { + + if ( geometry.maxInstancedCount > 0 ) { + + renderer.renderInstances( geometry, drawStart, drawCount ); + + } + + } else { + + renderer.render( drawStart, drawCount ); + + } + + }; + + function setupVertexAttributes( material, program, geometry ) { + + if ( geometry && geometry.isInstancedBufferGeometry ) { + + if ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) { + + console.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + } + + state.initAttributes(); + + var geometryAttributes = geometry.attributes; + + var programAttributes = program.getAttributes(); + + var materialDefaultAttributeValues = material.defaultAttributeValues; + + for ( var name in programAttributes ) { + + var programAttribute = programAttributes[ name ]; + + if ( programAttribute >= 0 ) { + + var geometryAttribute = geometryAttributes[ name ]; + + if ( geometryAttribute !== undefined ) { + + var normalized = geometryAttribute.normalized; + var size = geometryAttribute.itemSize; + + var attribute = attributes.get( geometryAttribute ); + + // TODO Attribute may not be available on context restore + + if ( attribute === undefined ) continue; + + var buffer = attribute.buffer; + var type = attribute.type; + var bytesPerElement = attribute.bytesPerElement; + + if ( geometryAttribute.isInterleavedBufferAttribute ) { + + var data = geometryAttribute.data; + var stride = data.stride; + var offset = geometryAttribute.offset; + + if ( data && data.isInstancedInterleavedBuffer ) { + + state.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute ); + + if ( geometry.maxInstancedCount === undefined ) { + + geometry.maxInstancedCount = data.meshPerAttribute * data.count; + + } + + } else { + + state.enableAttribute( programAttribute ); + + } + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer ); + _gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * bytesPerElement, offset * bytesPerElement ); + + } else { + + if ( geometryAttribute.isInstancedBufferAttribute ) { + + state.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute ); + + if ( geometry.maxInstancedCount === undefined ) { + + geometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count; + + } + + } else { + + state.enableAttribute( programAttribute ); + + } + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer ); + _gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, 0 ); + + } + + } else if ( materialDefaultAttributeValues !== undefined ) { + + var value = materialDefaultAttributeValues[ name ]; + + if ( value !== undefined ) { + + switch ( value.length ) { + + case 2: + _gl.vertexAttrib2fv( programAttribute, value ); + break; + + case 3: + _gl.vertexAttrib3fv( programAttribute, value ); + break; + + case 4: + _gl.vertexAttrib4fv( programAttribute, value ); + break; + + default: + _gl.vertexAttrib1fv( programAttribute, value ); + + } + + } + + } + + } + + } + + state.disableUnusedAttributes(); + + } + + // Compile + + this.compile = function ( scene, camera ) { + + currentRenderState = renderStates.get( scene, camera ); + currentRenderState.init(); + + scene.traverse( function ( object ) { + + if ( object.isLight ) { + + currentRenderState.pushLight( object ); + + if ( object.castShadow ) { + + currentRenderState.pushShadow( object ); + + } + + } + + } ); + + currentRenderState.setupLights( camera ); + + scene.traverse( function ( object ) { + + if ( object.material ) { + + if ( Array.isArray( object.material ) ) { + + for ( var i = 0; i < object.material.length; i ++ ) { + + initMaterial( object.material[ i ], scene.fog, object ); + + } + + } else { + + initMaterial( object.material, scene.fog, object ); + + } + + } + + } ); + + }; + + // Animation Loop + + var isAnimating = false; + var onAnimationFrame = null; + + function startAnimation() { + + if ( isAnimating ) return; + + requestAnimationLoopFrame(); + + isAnimating = true; + + } + + function stopAnimation() { + + isAnimating = false; + + } + + function requestAnimationLoopFrame() { + + var device = vr.getDevice(); + + if ( device && device.isPresenting ) { + + device.requestAnimationFrame( animationLoop ); + + } else { + + window.requestAnimationFrame( animationLoop ); + + } + + } + + function animationLoop( time ) { + + if ( isAnimating === false ) return; + + onAnimationFrame( time ); + + requestAnimationLoopFrame(); + + } + + this.animate = function ( callback ) { + + onAnimationFrame = callback; + onAnimationFrame !== null ? startAnimation() : stopAnimation(); + + }; + + // Rendering + + this.render = function ( scene, camera, renderTarget, forceClear ) { + + if ( ! ( camera && camera.isCamera ) ) { + + console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' ); + return; + + } + + if ( _isContextLost ) return; + + // reset caching for this frame + + _currentGeometryProgram = ''; + _currentMaterialId = - 1; + _currentCamera = null; + + // update scene graph + + if ( scene.autoUpdate === true ) scene.updateMatrixWorld(); + + // update camera matrices and frustum + + if ( camera.parent === null ) camera.updateMatrixWorld(); + + if ( vr.enabled ) { + + camera = vr.getCamera( camera ); + + } + + // + + currentRenderState = renderStates.get( scene, camera ); + currentRenderState.init(); + + scene.onBeforeRender( _this, scene, camera, renderTarget ); + + _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); + _frustum.setFromMatrix( _projScreenMatrix ); + + _localClippingEnabled = this.localClippingEnabled; + _clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera ); + + currentRenderList = renderLists.get( scene, camera ); + currentRenderList.init(); + + projectObject( scene, camera, _this.sortObjects ); + + if ( _this.sortObjects === true ) { + + currentRenderList.sort(); + + } + + // + + if ( _clippingEnabled ) _clipping.beginShadows(); + + var shadowsArray = currentRenderState.state.shadowsArray; + + shadowMap.render( shadowsArray, scene, camera ); + + currentRenderState.setupLights( camera ); + + if ( _clippingEnabled ) _clipping.endShadows(); + + // + + if ( this.info.autoReset ) this.info.reset(); + + if ( renderTarget === undefined ) { + + renderTarget = null; + + } + + this.setRenderTarget( renderTarget ); + + // + + background.render( currentRenderList, scene, camera, forceClear ); + + // render scene + + var opaqueObjects = currentRenderList.opaque; + var transparentObjects = currentRenderList.transparent; + + if ( scene.overrideMaterial ) { + + var overrideMaterial = scene.overrideMaterial; + + if ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera, overrideMaterial ); + if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera, overrideMaterial ); + + } else { + + // opaque pass (front-to-back order) + + if ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera ); + + // transparent pass (back-to-front order) + + if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera ); + + } + + // custom renderers + + var spritesArray = currentRenderState.state.spritesArray; + + spriteRenderer.render( spritesArray, scene, camera ); + + // Generate mipmap if we're using any kind of mipmap filtering + + if ( renderTarget ) { + + textures.updateRenderTargetMipmap( renderTarget ); + + } + + // Ensure depth buffer writing is enabled so it can be cleared on next render + + state.buffers.depth.setTest( true ); + state.buffers.depth.setMask( true ); + state.buffers.color.setMask( true ); + + state.setPolygonOffset( false ); + + scene.onAfterRender( _this, scene, camera ); + + if ( vr.enabled ) { + + vr.submitFrame(); + + } + + // _gl.finish(); + + currentRenderList = null; + currentRenderState = null; + + }; + + /* + // TODO Duplicated code (Frustum) + + var _sphere = new Sphere(); + + function isObjectViewable( object ) { + + var geometry = object.geometry; + + if ( geometry.boundingSphere === null ) + geometry.computeBoundingSphere(); + + _sphere.copy( geometry.boundingSphere ). + applyMatrix4( object.matrixWorld ); + + return isSphereViewable( _sphere ); + + } + + function isSpriteViewable( sprite ) { + + _sphere.center.set( 0, 0, 0 ); + _sphere.radius = 0.7071067811865476; + _sphere.applyMatrix4( sprite.matrixWorld ); + + return isSphereViewable( _sphere ); + + } + + function isSphereViewable( sphere ) { + + if ( ! _frustum.intersectsSphere( sphere ) ) return false; + + var numPlanes = _clipping.numPlanes; + + if ( numPlanes === 0 ) return true; + + var planes = _this.clippingPlanes, + + center = sphere.center, + negRad = - sphere.radius, + i = 0; + + do { + + // out when deeper than radius in the negative halfspace + if ( planes[ i ].distanceToPoint( center ) < negRad ) return false; + + } while ( ++ i !== numPlanes ); + + return true; + + } + */ + + function projectObject( object, camera, sortObjects ) { + + if ( object.visible === false ) return; + + var visible = object.layers.test( camera.layers ); + + if ( visible ) { + + if ( object.isLight ) { + + currentRenderState.pushLight( object ); + + if ( object.castShadow ) { + + currentRenderState.pushShadow( object ); + + } + + } else if ( object.isSprite ) { + + if ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) { + + currentRenderState.pushSprite( object ); + + } + + } else if ( object.isImmediateRenderObject ) { + + if ( sortObjects ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + currentRenderList.push( object, null, object.material, _vector3.z, null ); + + } else if ( object.isMesh || object.isLine || object.isPoints ) { + + if ( object.isSkinnedMesh ) { + + object.skeleton.update(); + + } + + if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) { + + if ( sortObjects ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + var geometry = objects.update( object ); + var material = object.material; + + if ( Array.isArray( material ) ) { + + var groups = geometry.groups; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + var groupMaterial = material[ group.materialIndex ]; + + if ( groupMaterial && groupMaterial.visible ) { + + currentRenderList.push( object, geometry, groupMaterial, _vector3.z, group ); + + } + + } + + } else if ( material.visible ) { + + currentRenderList.push( object, geometry, material, _vector3.z, null ); + + } + + } + + } + + } + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + projectObject( children[ i ], camera, sortObjects ); + + } + + } + + function renderObjects( renderList, scene, camera, overrideMaterial ) { + + for ( var i = 0, l = renderList.length; i < l; i ++ ) { + + var renderItem = renderList[ i ]; + + var object = renderItem.object; + var geometry = renderItem.geometry; + var material = overrideMaterial === undefined ? renderItem.material : overrideMaterial; + var group = renderItem.group; + + if ( camera.isArrayCamera ) { + + _currentArrayCamera = camera; + + var cameras = camera.cameras; + + for ( var j = 0, jl = cameras.length; j < jl; j ++ ) { + + var camera2 = cameras[ j ]; + + if ( object.layers.test( camera2.layers ) ) { + + var bounds = camera2.bounds; + + var x = bounds.x * _width; + var y = bounds.y * _height; + var width = bounds.z * _width; + var height = bounds.w * _height; + + state.viewport( _currentViewport.set( x, y, width, height ).multiplyScalar( _pixelRatio ) ); + + renderObject( object, scene, camera2, geometry, material, group ); + + } + + } + + } else { + + _currentArrayCamera = null; + + renderObject( object, scene, camera, geometry, material, group ); + + } + + } + + } + + function renderObject( object, scene, camera, geometry, material, group ) { + + object.onBeforeRender( _this, scene, camera, geometry, material, group ); + currentRenderState = renderStates.get( scene, _currentArrayCamera || camera ); + + object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld ); + object.normalMatrix.getNormalMatrix( object.modelViewMatrix ); + + if ( object.isImmediateRenderObject ) { + + var frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 ); + + state.setMaterial( material, frontFaceCW ); + + var program = setProgram( camera, scene.fog, material, object ); + + _currentGeometryProgram = ''; + + renderObjectImmediate( object, program, material ); + + } else { + + _this.renderBufferDirect( camera, scene.fog, geometry, material, object, group ); + + } + + object.onAfterRender( _this, scene, camera, geometry, material, group ); + currentRenderState = renderStates.get( scene, _currentArrayCamera || camera ); + + } + + function initMaterial( material, fog, object ) { + + var materialProperties = properties.get( material ); + + var lights = currentRenderState.state.lights; + var shadowsArray = currentRenderState.state.shadowsArray; + + var parameters = programCache.getParameters( + material, lights.state, shadowsArray, fog, _clipping.numPlanes, _clipping.numIntersection, object ); + + var code = programCache.getProgramCode( material, parameters ); + + var program = materialProperties.program; + var programChange = true; + + if ( program === undefined ) { + + // new material + material.addEventListener( 'dispose', onMaterialDispose ); + + } else if ( program.code !== code ) { + + // changed glsl or parameters + releaseMaterialProgramReference( material ); + + } else if ( materialProperties.lightsHash !== lights.state.hash ) { + + properties.update( material, 'lightsHash', lights.state.hash ); + programChange = false; + + } else if ( parameters.shaderID !== undefined ) { + + // same glsl and uniform list + return; + + } else { + + // only rebuild uniform list + programChange = false; + + } + + if ( programChange ) { + + if ( parameters.shaderID ) { + + var shader = ShaderLib[ parameters.shaderID ]; + + materialProperties.shader = { + name: material.type, + uniforms: UniformsUtils.clone( shader.uniforms ), + vertexShader: shader.vertexShader, + fragmentShader: shader.fragmentShader + }; + + } else { + + materialProperties.shader = { + name: material.type, + uniforms: material.uniforms, + vertexShader: material.vertexShader, + fragmentShader: material.fragmentShader + }; + + } + + material.onBeforeCompile( materialProperties.shader, _this ); + + program = programCache.acquireProgram( material, materialProperties.shader, parameters, code ); + + materialProperties.program = program; + material.program = program; + + } + + var programAttributes = program.getAttributes(); + + if ( material.morphTargets ) { + + material.numSupportedMorphTargets = 0; + + for ( var i = 0; i < _this.maxMorphTargets; i ++ ) { + + if ( programAttributes[ 'morphTarget' + i ] >= 0 ) { + + material.numSupportedMorphTargets ++; + + } + + } + + } + + if ( material.morphNormals ) { + + material.numSupportedMorphNormals = 0; + + for ( var i = 0; i < _this.maxMorphNormals; i ++ ) { + + if ( programAttributes[ 'morphNormal' + i ] >= 0 ) { + + material.numSupportedMorphNormals ++; + + } + + } + + } + + var uniforms = materialProperties.shader.uniforms; + + if ( ! material.isShaderMaterial && + ! material.isRawShaderMaterial || + material.clipping === true ) { + + materialProperties.numClippingPlanes = _clipping.numPlanes; + materialProperties.numIntersection = _clipping.numIntersection; + uniforms.clippingPlanes = _clipping.uniform; + + } + + materialProperties.fog = fog; + + // store the light setup it was created for + + materialProperties.lightsHash = lights.state.hash; + + if ( material.lights ) { + + // wire up the material to this renderer's lighting state + + uniforms.ambientLightColor.value = lights.state.ambient; + uniforms.directionalLights.value = lights.state.directional; + uniforms.spotLights.value = lights.state.spot; + uniforms.rectAreaLights.value = lights.state.rectArea; + uniforms.pointLights.value = lights.state.point; + uniforms.hemisphereLights.value = lights.state.hemi; + + uniforms.directionalShadowMap.value = lights.state.directionalShadowMap; + uniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix; + uniforms.spotShadowMap.value = lights.state.spotShadowMap; + uniforms.spotShadowMatrix.value = lights.state.spotShadowMatrix; + uniforms.pointShadowMap.value = lights.state.pointShadowMap; + uniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix; + // TODO (abelnation): add area lights shadow info to uniforms + + } + + var progUniforms = materialProperties.program.getUniforms(), + uniformsList = + WebGLUniforms.seqWithValue( progUniforms.seq, uniforms ); + + materialProperties.uniformsList = uniformsList; + + } + + function setProgram( camera, fog, material, object ) { + + _usedTextureUnits = 0; + + var materialProperties = properties.get( material ); + var lights = currentRenderState.state.lights; + + if ( _clippingEnabled ) { + + if ( _localClippingEnabled || camera !== _currentCamera ) { + + var useCache = + camera === _currentCamera && + material.id === _currentMaterialId; + + // we might want to call this function with some ClippingGroup + // object instead of the material, once it becomes feasible + // (#8465, #8379) + _clipping.setState( + material.clippingPlanes, material.clipIntersection, material.clipShadows, + camera, materialProperties, useCache ); + + } + + } + + if ( material.needsUpdate === false ) { + + if ( materialProperties.program === undefined ) { + + material.needsUpdate = true; + + } else if ( material.fog && materialProperties.fog !== fog ) { + + material.needsUpdate = true; + + } else if ( material.lights && materialProperties.lightsHash !== lights.state.hash ) { + + material.needsUpdate = true; + + } else if ( materialProperties.numClippingPlanes !== undefined && + ( materialProperties.numClippingPlanes !== _clipping.numPlanes || + materialProperties.numIntersection !== _clipping.numIntersection ) ) { + + material.needsUpdate = true; + + } + + } + + if ( material.needsUpdate ) { + + initMaterial( material, fog, object ); + material.needsUpdate = false; + + } + + var refreshProgram = false; + var refreshMaterial = false; + var refreshLights = false; + + var program = materialProperties.program, + p_uniforms = program.getUniforms(), + m_uniforms = materialProperties.shader.uniforms; + + if ( state.useProgram( program.program ) ) { + + refreshProgram = true; + refreshMaterial = true; + refreshLights = true; + + } + + if ( material.id !== _currentMaterialId ) { + + _currentMaterialId = material.id; + + refreshMaterial = true; + + } + + if ( refreshProgram || camera !== _currentCamera ) { + + p_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix ); + + if ( capabilities.logarithmicDepthBuffer ) { + + p_uniforms.setValue( _gl, 'logDepthBufFC', + 2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) ); + + } + + // Avoid unneeded uniform updates per ArrayCamera's sub-camera + + if ( _currentCamera !== ( _currentArrayCamera || camera ) ) { + + _currentCamera = ( _currentArrayCamera || camera ); + + // lighting uniforms depend on the camera so enforce an update + // now, in case this material supports lights - or later, when + // the next material that does gets activated: + + refreshMaterial = true; // set to true on material change + refreshLights = true; // remains set until update done + + } + + // load material specific uniforms + // (shader material also gets them for the sake of genericity) + + if ( material.isShaderMaterial || + material.isMeshPhongMaterial || + material.isMeshStandardMaterial || + material.envMap ) { + + var uCamPos = p_uniforms.map.cameraPosition; + + if ( uCamPos !== undefined ) { + + uCamPos.setValue( _gl, + _vector3.setFromMatrixPosition( camera.matrixWorld ) ); + + } + + } + + if ( material.isMeshPhongMaterial || + material.isMeshLambertMaterial || + material.isMeshBasicMaterial || + material.isMeshStandardMaterial || + material.isShaderMaterial || + material.skinning ) { + + p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse ); + + } + + } + + // skinning uniforms must be set even if material didn't change + // auto-setting of texture unit for bone texture must go before other textures + // not sure why, but otherwise weird things happen + + if ( material.skinning ) { + + p_uniforms.setOptional( _gl, object, 'bindMatrix' ); + p_uniforms.setOptional( _gl, object, 'bindMatrixInverse' ); + + var skeleton = object.skeleton; + + if ( skeleton ) { + + var bones = skeleton.bones; + + if ( capabilities.floatVertexTextures ) { + + if ( skeleton.boneTexture === undefined ) { + + // layout (1 matrix = 4 pixels) + // RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4) + // with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8) + // 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16) + // 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32) + // 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64) + + + var size = Math.sqrt( bones.length * 4 ); // 4 pixels needed for 1 matrix + size = _Math.ceilPowerOfTwo( size ); + size = Math.max( size, 4 ); + + var boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel + boneMatrices.set( skeleton.boneMatrices ); // copy current values + + var boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType ); + boneTexture.needsUpdate = true; + + skeleton.boneMatrices = boneMatrices; + skeleton.boneTexture = boneTexture; + skeleton.boneTextureSize = size; + + } + + p_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture ); + p_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize ); + + } else { + + p_uniforms.setOptional( _gl, skeleton, 'boneMatrices' ); + + } + + } + + } + + if ( refreshMaterial ) { + + p_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure ); + p_uniforms.setValue( _gl, 'toneMappingWhitePoint', _this.toneMappingWhitePoint ); + + if ( material.lights ) { + + // the current material requires lighting info + + // note: all lighting uniforms are always set correctly + // they simply reference the renderer's state for their + // values + // + // use the current material's .needsUpdate flags to set + // the GL state when required + + markUniformsLightsNeedsUpdate( m_uniforms, refreshLights ); + + } + + // refresh uniforms common to several materials + + if ( fog && material.fog ) { + + refreshUniformsFog( m_uniforms, fog ); + + } + + if ( material.isMeshBasicMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + } else if ( material.isMeshLambertMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + refreshUniformsLambert( m_uniforms, material ); + + } else if ( material.isMeshPhongMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + if ( material.isMeshToonMaterial ) { + + refreshUniformsToon( m_uniforms, material ); + + } else { + + refreshUniformsPhong( m_uniforms, material ); + + } + + } else if ( material.isMeshStandardMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + if ( material.isMeshPhysicalMaterial ) { + + refreshUniformsPhysical( m_uniforms, material ); + + } else { + + refreshUniformsStandard( m_uniforms, material ); + + } + + } else if ( material.isMeshDepthMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + refreshUniformsDepth( m_uniforms, material ); + + } else if ( material.isMeshDistanceMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + refreshUniformsDistance( m_uniforms, material ); + + } else if ( material.isMeshNormalMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + refreshUniformsNormal( m_uniforms, material ); + + } else if ( material.isLineBasicMaterial ) { + + refreshUniformsLine( m_uniforms, material ); + + if ( material.isLineDashedMaterial ) { + + refreshUniformsDash( m_uniforms, material ); + + } + + } else if ( material.isPointsMaterial ) { + + refreshUniformsPoints( m_uniforms, material ); + + } else if ( material.isShadowMaterial ) { + + m_uniforms.color.value = material.color; + m_uniforms.opacity.value = material.opacity; + + } + + // RectAreaLight Texture + // TODO (mrdoob): Find a nicer implementation + + if ( m_uniforms.ltc_1 !== undefined ) m_uniforms.ltc_1.value = UniformsLib.LTC_1; + if ( m_uniforms.ltc_2 !== undefined ) m_uniforms.ltc_2.value = UniformsLib.LTC_2; + + WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, _this ); + + } + + if ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) { + + WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, _this ); + material.uniformsNeedUpdate = false; + + } + + // common matrices + + p_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix ); + p_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix ); + p_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld ); + + return program; + + } + + // Uniforms (refresh uniforms objects) + + function refreshUniformsCommon( uniforms, material ) { + + uniforms.opacity.value = material.opacity; + + if ( material.color ) { + + uniforms.diffuse.value = material.color; + + } + + if ( material.emissive ) { + + uniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity ); + + } + + if ( material.map ) { + + uniforms.map.value = material.map; + + } + + if ( material.alphaMap ) { + + uniforms.alphaMap.value = material.alphaMap; + + } + + if ( material.specularMap ) { + + uniforms.specularMap.value = material.specularMap; + + } + + if ( material.envMap ) { + + uniforms.envMap.value = material.envMap; + + // don't flip CubeTexture envMaps, flip everything else: + // WebGLRenderTargetCube will be flipped for backwards compatibility + // WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture + // this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future + uniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1; + + uniforms.reflectivity.value = material.reflectivity; + uniforms.refractionRatio.value = material.refractionRatio; + + uniforms.maxMipLevel.value = properties.get( material.envMap ).__maxMipLevel; + + } + + if ( material.lightMap ) { + + uniforms.lightMap.value = material.lightMap; + uniforms.lightMapIntensity.value = material.lightMapIntensity; + + } + + if ( material.aoMap ) { + + uniforms.aoMap.value = material.aoMap; + uniforms.aoMapIntensity.value = material.aoMapIntensity; + + } + + // uv repeat and offset setting priorities + // 1. color map + // 2. specular map + // 3. normal map + // 4. bump map + // 5. alpha map + // 6. emissive map + + var uvScaleMap; + + if ( material.map ) { + + uvScaleMap = material.map; + + } else if ( material.specularMap ) { + + uvScaleMap = material.specularMap; + + } else if ( material.displacementMap ) { + + uvScaleMap = material.displacementMap; + + } else if ( material.normalMap ) { + + uvScaleMap = material.normalMap; + + } else if ( material.bumpMap ) { + + uvScaleMap = material.bumpMap; + + } else if ( material.roughnessMap ) { + + uvScaleMap = material.roughnessMap; + + } else if ( material.metalnessMap ) { + + uvScaleMap = material.metalnessMap; + + } else if ( material.alphaMap ) { + + uvScaleMap = material.alphaMap; + + } else if ( material.emissiveMap ) { + + uvScaleMap = material.emissiveMap; + + } + + if ( uvScaleMap !== undefined ) { + + // backwards compatibility + if ( uvScaleMap.isWebGLRenderTarget ) { + + uvScaleMap = uvScaleMap.texture; + + } + + if ( uvScaleMap.matrixAutoUpdate === true ) { + + uvScaleMap.updateMatrix(); + + } + + uniforms.uvTransform.value.copy( uvScaleMap.matrix ); + + } + + } + + function refreshUniformsLine( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + + } + + function refreshUniformsDash( uniforms, material ) { + + uniforms.dashSize.value = material.dashSize; + uniforms.totalSize.value = material.dashSize + material.gapSize; + uniforms.scale.value = material.scale; + + } + + function refreshUniformsPoints( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + uniforms.size.value = material.size * _pixelRatio; + uniforms.scale.value = _height * 0.5; + + uniforms.map.value = material.map; + + if ( material.map !== null ) { + + if ( material.map.matrixAutoUpdate === true ) { + + material.map.updateMatrix(); + + } + + uniforms.uvTransform.value.copy( material.map.matrix ); + + } + + } + + function refreshUniformsFog( uniforms, fog ) { + + uniforms.fogColor.value = fog.color; + + if ( fog.isFog ) { + + uniforms.fogNear.value = fog.near; + uniforms.fogFar.value = fog.far; + + } else if ( fog.isFogExp2 ) { + + uniforms.fogDensity.value = fog.density; + + } + + } + + function refreshUniformsLambert( uniforms, material ) { + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + } + + function refreshUniformsPhong( uniforms, material ) { + + uniforms.specular.value = material.specular; + uniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 ) + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsToon( uniforms, material ) { + + refreshUniformsPhong( uniforms, material ); + + if ( material.gradientMap ) { + + uniforms.gradientMap.value = material.gradientMap; + + } + + } + + function refreshUniformsStandard( uniforms, material ) { + + uniforms.roughness.value = material.roughness; + uniforms.metalness.value = material.metalness; + + if ( material.roughnessMap ) { + + uniforms.roughnessMap.value = material.roughnessMap; + + } + + if ( material.metalnessMap ) { + + uniforms.metalnessMap.value = material.metalnessMap; + + } + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + if ( material.envMap ) { + + //uniforms.envMap.value = material.envMap; // part of uniforms common + uniforms.envMapIntensity.value = material.envMapIntensity; + + } + + } + + function refreshUniformsPhysical( uniforms, material ) { + + uniforms.clearCoat.value = material.clearCoat; + uniforms.clearCoatRoughness.value = material.clearCoatRoughness; + + refreshUniformsStandard( uniforms, material ); + + } + + function refreshUniformsDepth( uniforms, material ) { + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsDistance( uniforms, material ) { + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + uniforms.referencePosition.value.copy( material.referencePosition ); + uniforms.nearDistance.value = material.nearDistance; + uniforms.farDistance.value = material.farDistance; + + } + + function refreshUniformsNormal( uniforms, material ) { + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + // If uniforms are marked as clean, they don't need to be loaded to the GPU. + + function markUniformsLightsNeedsUpdate( uniforms, value ) { + + uniforms.ambientLightColor.needsUpdate = value; + + uniforms.directionalLights.needsUpdate = value; + uniforms.pointLights.needsUpdate = value; + uniforms.spotLights.needsUpdate = value; + uniforms.rectAreaLights.needsUpdate = value; + uniforms.hemisphereLights.needsUpdate = value; + + } + + // Textures + + function allocTextureUnit() { + + var textureUnit = _usedTextureUnits; + + if ( textureUnit >= capabilities.maxTextures ) { + + console.warn( 'THREE.WebGLRenderer: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures ); + + } + + _usedTextureUnits += 1; + + return textureUnit; + + } + + this.allocTextureUnit = allocTextureUnit; + + // this.setTexture2D = setTexture2D; + this.setTexture2D = ( function () { + + var warned = false; + + // backwards compatibility: peel texture.texture + return function setTexture2D( texture, slot ) { + + if ( texture && texture.isWebGLRenderTarget ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead." ); + warned = true; + + } + + texture = texture.texture; + + } + + textures.setTexture2D( texture, slot ); + + }; + + }() ); + + this.setTexture = ( function () { + + var warned = false; + + return function setTexture( texture, slot ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead." ); + warned = true; + + } + + textures.setTexture2D( texture, slot ); + + }; + + }() ); + + this.setTextureCube = ( function () { + + var warned = false; + + return function setTextureCube( texture, slot ) { + + // backwards compatibility: peel texture.texture + if ( texture && texture.isWebGLRenderTargetCube ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead." ); + warned = true; + + } + + texture = texture.texture; + + } + + // currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture + // TODO: unify these code paths + if ( ( texture && texture.isCubeTexture ) || + ( Array.isArray( texture.image ) && texture.image.length === 6 ) ) { + + // CompressedTexture can have Array in image :/ + + // this function alone should take care of cube textures + textures.setTextureCube( texture, slot ); + + } else { + + // assumed: texture property of THREE.WebGLRenderTargetCube + + textures.setTextureCubeDynamic( texture, slot ); + + } + + }; + + }() ); + + this.getRenderTarget = function () { + + return _currentRenderTarget; + + }; + + this.setRenderTarget = function ( renderTarget ) { + + _currentRenderTarget = renderTarget; + + if ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) { + + textures.setupRenderTarget( renderTarget ); + + } + + var framebuffer = null; + var isCube = false; + + if ( renderTarget ) { + + var __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer; + + if ( renderTarget.isWebGLRenderTargetCube ) { + + framebuffer = __webglFramebuffer[ renderTarget.activeCubeFace ]; + isCube = true; + + } else { + + framebuffer = __webglFramebuffer; + + } + + _currentViewport.copy( renderTarget.viewport ); + _currentScissor.copy( renderTarget.scissor ); + _currentScissorTest = renderTarget.scissorTest; + + } else { + + _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ); + _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ); + _currentScissorTest = _scissorTest; + + } + + if ( _currentFramebuffer !== framebuffer ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + _currentFramebuffer = framebuffer; + + } + + state.viewport( _currentViewport ); + state.scissor( _currentScissor ); + state.setScissorTest( _currentScissorTest ); + + if ( isCube ) { + + var textureProperties = properties.get( renderTarget.texture ); + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel ); + + } + + }; + + this.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) { + + if ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' ); + return; + + } + + var framebuffer = properties.get( renderTarget ).__webglFramebuffer; + + if ( framebuffer ) { + + var restore = false; + + if ( framebuffer !== _currentFramebuffer ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + restore = true; + + } + + try { + + var texture = renderTarget.texture; + var textureFormat = texture.format; + var textureType = texture.type; + + if ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' ); + return; + + } + + if ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513) + ! ( textureType === FloatType && ( extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox + ! ( textureType === HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' ); + return; + + } + + if ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) { + + // the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604) + + if ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) { + + _gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer ); + + } + + } else { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' ); + + } + + } finally { + + if ( restore ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer ); + + } + + } + + } + + }; + + this.copyFramebufferToTexture = function ( position, texture, level ) { + + var width = texture.image.width; + var height = texture.image.height; + var glFormat = utils.convert( texture.format ); + + this.setTexture2D( texture, 0 ); + + _gl.copyTexImage2D( _gl.TEXTURE_2D, level || 0, glFormat, position.x, position.y, width, height, 0 ); + + }; + + this.copyTextureToTexture = function ( position, srcTexture, dstTexture, level ) { + + var width = srcTexture.image.width; + var height = srcTexture.image.height; + var glFormat = utils.convert( dstTexture.format ); + var glType = utils.convert( dstTexture.type ); + var pixels = srcTexture.isDataTexture ? srcTexture.image.data : srcTexture.image; + + this.setTexture2D( dstTexture, 0 ); + + _gl.texSubImage2D( _gl.TEXTURE_2D, level || 0, position.x, position.y, width, height, glFormat, glType, pixels ); + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function FogExp2( color, density ) { + + this.name = ''; + + this.color = new Color( color ); + this.density = ( density !== undefined ) ? density : 0.00025; + + } + + FogExp2.prototype.isFogExp2 = true; + + FogExp2.prototype.clone = function () { + + return new FogExp2( this.color.getHex(), this.density ); + + }; + + FogExp2.prototype.toJSON = function ( /* meta */ ) { + + return { + type: 'FogExp2', + color: this.color.getHex(), + density: this.density + }; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Fog( color, near, far ) { + + this.name = ''; + + this.color = new Color( color ); + + this.near = ( near !== undefined ) ? near : 1; + this.far = ( far !== undefined ) ? far : 1000; + + } + + Fog.prototype.isFog = true; + + Fog.prototype.clone = function () { + + return new Fog( this.color.getHex(), this.near, this.far ); + + }; + + Fog.prototype.toJSON = function ( /* meta */ ) { + + return { + type: 'Fog', + color: this.color.getHex(), + near: this.near, + far: this.far + }; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Scene() { + + Object3D.call( this ); + + this.type = 'Scene'; + + this.background = null; + this.fog = null; + this.overrideMaterial = null; + + this.autoUpdate = true; // checked by the renderer + + } + + Scene.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Scene, + + copy: function ( source, recursive ) { + + Object3D.prototype.copy.call( this, source, recursive ); + + if ( source.background !== null ) this.background = source.background.clone(); + if ( source.fog !== null ) this.fog = source.fog.clone(); + if ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone(); + + this.autoUpdate = source.autoUpdate; + this.matrixAutoUpdate = source.matrixAutoUpdate; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + if ( this.background !== null ) data.object.background = this.background.toJSON( meta ); + if ( this.fog !== null ) data.object.fog = this.fog.toJSON(); + + return data; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * uvOffset: new THREE.Vector2(), + * uvScale: new THREE.Vector2() + * } + */ + + function SpriteMaterial( parameters ) { + + Material.call( this ); + + this.type = 'SpriteMaterial'; + + this.color = new Color( 0xffffff ); + this.map = null; + + this.rotation = 0; + + this.fog = false; + this.lights = false; + + this.setValues( parameters ); + + } + + SpriteMaterial.prototype = Object.create( Material.prototype ); + SpriteMaterial.prototype.constructor = SpriteMaterial; + SpriteMaterial.prototype.isSpriteMaterial = true; + + SpriteMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.map = source.map; + + this.rotation = source.rotation; + + return this; + + }; + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Sprite( material ) { + + Object3D.call( this ); + + this.type = 'Sprite'; + + this.material = ( material !== undefined ) ? material : new SpriteMaterial(); + + this.center = new Vector2( 0.5, 0.5 ); + + } + + Sprite.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Sprite, + + isSprite: true, + + raycast: ( function () { + + var intersectPoint = new Vector3(); + var worldPosition = new Vector3(); + var worldScale = new Vector3(); + + return function raycast( raycaster, intersects ) { + + worldPosition.setFromMatrixPosition( this.matrixWorld ); + raycaster.ray.closestPointToPoint( worldPosition, intersectPoint ); + + worldScale.setFromMatrixScale( this.matrixWorld ); + var guessSizeSq = worldScale.x * worldScale.y / 4; + + if ( worldPosition.distanceToSquared( intersectPoint ) > guessSizeSq ) return; + + var distance = raycaster.ray.origin.distanceTo( intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + point: intersectPoint.clone(), + face: null, + object: this + + } ); + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.material ).copy( this ); + + }, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + if ( source.center !== undefined ) this.center.copy( source.center ); + + return this; + + } + + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function LOD() { + + Object3D.call( this ); + + this.type = 'LOD'; + + Object.defineProperties( this, { + levels: { + enumerable: true, + value: [] + } + } ); + + } + + LOD.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: LOD, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source, false ); + + var levels = source.levels; + + for ( var i = 0, l = levels.length; i < l; i ++ ) { + + var level = levels[ i ]; + + this.addLevel( level.object.clone(), level.distance ); + + } + + return this; + + }, + + addLevel: function ( object, distance ) { + + if ( distance === undefined ) distance = 0; + + distance = Math.abs( distance ); + + var levels = this.levels; + + for ( var l = 0; l < levels.length; l ++ ) { + + if ( distance < levels[ l ].distance ) { + + break; + + } + + } + + levels.splice( l, 0, { distance: distance, object: object } ); + + this.add( object ); + + }, + + getObjectForDistance: function ( distance ) { + + var levels = this.levels; + + for ( var i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance < levels[ i ].distance ) { + + break; + + } + + } + + return levels[ i - 1 ].object; + + }, + + raycast: ( function () { + + var matrixPosition = new Vector3(); + + return function raycast( raycaster, intersects ) { + + matrixPosition.setFromMatrixPosition( this.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( matrixPosition ); + + this.getObjectForDistance( distance ).raycast( raycaster, intersects ); + + }; + + }() ), + + update: function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function update( camera ) { + + var levels = this.levels; + + if ( levels.length > 1 ) { + + v1.setFromMatrixPosition( camera.matrixWorld ); + v2.setFromMatrixPosition( this.matrixWorld ); + + var distance = v1.distanceTo( v2 ); + + levels[ 0 ].object.visible = true; + + for ( var i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance >= levels[ i ].distance ) { + + levels[ i - 1 ].object.visible = false; + levels[ i ].object.visible = true; + + } else { + + break; + + } + + } + + for ( ; i < l; i ++ ) { + + levels[ i ].object.visible = false; + + } + + } + + }; + + }(), + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.levels = []; + + var levels = this.levels; + + for ( var i = 0, l = levels.length; i < l; i ++ ) { + + var level = levels[ i ]; + + data.object.levels.push( { + object: level.object.uuid, + distance: level.distance + } ); + + } + + return data; + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author michael guerrero / http://realitymeltdown.com + * @author ikerr / http://verold.com + */ + + function Skeleton( bones, boneInverses ) { + + // copy the bone array + + bones = bones || []; + + this.bones = bones.slice( 0 ); + this.boneMatrices = new Float32Array( this.bones.length * 16 ); + + // use the supplied bone inverses or calculate the inverses + + if ( boneInverses === undefined ) { + + this.calculateInverses(); + + } else { + + if ( this.bones.length === boneInverses.length ) { + + this.boneInverses = boneInverses.slice( 0 ); + + } else { + + console.warn( 'THREE.Skeleton boneInverses is the wrong length.' ); + + this.boneInverses = []; + + for ( var i = 0, il = this.bones.length; i < il; i ++ ) { + + this.boneInverses.push( new Matrix4() ); + + } + + } + + } + + } + + Object.assign( Skeleton.prototype, { + + calculateInverses: function () { + + this.boneInverses = []; + + for ( var i = 0, il = this.bones.length; i < il; i ++ ) { + + var inverse = new Matrix4(); + + if ( this.bones[ i ] ) { + + inverse.getInverse( this.bones[ i ].matrixWorld ); + + } + + this.boneInverses.push( inverse ); + + } + + }, + + pose: function () { + + var bone, i, il; + + // recover the bind-time world matrices + + for ( i = 0, il = this.bones.length; i < il; i ++ ) { + + bone = this.bones[ i ]; + + if ( bone ) { + + bone.matrixWorld.getInverse( this.boneInverses[ i ] ); + + } + + } + + // compute the local matrices, positions, rotations and scales + + for ( i = 0, il = this.bones.length; i < il; i ++ ) { + + bone = this.bones[ i ]; + + if ( bone ) { + + if ( bone.parent && bone.parent.isBone ) { + + bone.matrix.getInverse( bone.parent.matrixWorld ); + bone.matrix.multiply( bone.matrixWorld ); + + } else { + + bone.matrix.copy( bone.matrixWorld ); + + } + + bone.matrix.decompose( bone.position, bone.quaternion, bone.scale ); + + } + + } + + }, + + update: ( function () { + + var offsetMatrix = new Matrix4(); + var identityMatrix = new Matrix4(); + + return function update() { + + var bones = this.bones; + var boneInverses = this.boneInverses; + var boneMatrices = this.boneMatrices; + var boneTexture = this.boneTexture; + + // flatten bone matrices to array + + for ( var i = 0, il = bones.length; i < il; i ++ ) { + + // compute the offset between the current and the original transform + + var matrix = bones[ i ] ? bones[ i ].matrixWorld : identityMatrix; + + offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] ); + offsetMatrix.toArray( boneMatrices, i * 16 ); + + } + + if ( boneTexture !== undefined ) { + + boneTexture.needsUpdate = true; + + } + + }; + + } )(), + + clone: function () { + + return new Skeleton( this.bones, this.boneInverses ); + + }, + + getBoneByName: function ( name ) { + + for ( var i = 0, il = this.bones.length; i < il; i ++ ) { + + var bone = this.bones[ i ]; + + if ( bone.name === name ) { + + return bone; + + } + + } + + return undefined; + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + + function Bone() { + + Object3D.call( this ); + + this.type = 'Bone'; + + } + + Bone.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Bone, + + isBone: true + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + + function SkinnedMesh( geometry, material ) { + + Mesh.call( this, geometry, material ); + + this.type = 'SkinnedMesh'; + + this.bindMode = 'attached'; + this.bindMatrix = new Matrix4(); + this.bindMatrixInverse = new Matrix4(); + + var bones = this.initBones(); + var skeleton = new Skeleton( bones ); + + this.bind( skeleton, this.matrixWorld ); + + this.normalizeSkinWeights(); + + } + + SkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), { + + constructor: SkinnedMesh, + + isSkinnedMesh: true, + + initBones: function () { + + var bones = [], bone, gbone; + var i, il; + + if ( this.geometry && this.geometry.bones !== undefined ) { + + // first, create array of 'Bone' objects from geometry data + + for ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) { + + gbone = this.geometry.bones[ i ]; + + // create new 'Bone' object + + bone = new Bone(); + bones.push( bone ); + + // apply values + + bone.name = gbone.name; + bone.position.fromArray( gbone.pos ); + bone.quaternion.fromArray( gbone.rotq ); + if ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl ); + + } + + // second, create bone hierarchy + + for ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) { + + gbone = this.geometry.bones[ i ]; + + if ( ( gbone.parent !== - 1 ) && ( gbone.parent !== null ) && ( bones[ gbone.parent ] !== undefined ) ) { + + // subsequent bones in the hierarchy + + bones[ gbone.parent ].add( bones[ i ] ); + + } else { + + // topmost bone, immediate child of the skinned mesh + + this.add( bones[ i ] ); + + } + + } + + } + + // now the bones are part of the scene graph and children of the skinned mesh. + // let's update the corresponding matrices + + this.updateMatrixWorld( true ); + + return bones; + + }, + + bind: function ( skeleton, bindMatrix ) { + + this.skeleton = skeleton; + + if ( bindMatrix === undefined ) { + + this.updateMatrixWorld( true ); + + this.skeleton.calculateInverses(); + + bindMatrix = this.matrixWorld; + + } + + this.bindMatrix.copy( bindMatrix ); + this.bindMatrixInverse.getInverse( bindMatrix ); + + }, + + pose: function () { + + this.skeleton.pose(); + + }, + + normalizeSkinWeights: function () { + + var scale, i; + + if ( this.geometry && this.geometry.isGeometry ) { + + for ( i = 0; i < this.geometry.skinWeights.length; i ++ ) { + + var sw = this.geometry.skinWeights[ i ]; + + scale = 1.0 / sw.manhattanLength(); + + if ( scale !== Infinity ) { + + sw.multiplyScalar( scale ); + + } else { + + sw.set( 1, 0, 0, 0 ); // do something reasonable + + } + + } + + } else if ( this.geometry && this.geometry.isBufferGeometry ) { + + var vec = new Vector4(); + + var skinWeight = this.geometry.attributes.skinWeight; + + for ( i = 0; i < skinWeight.count; i ++ ) { + + vec.x = skinWeight.getX( i ); + vec.y = skinWeight.getY( i ); + vec.z = skinWeight.getZ( i ); + vec.w = skinWeight.getW( i ); + + scale = 1.0 / vec.manhattanLength(); + + if ( scale !== Infinity ) { + + vec.multiplyScalar( scale ); + + } else { + + vec.set( 1, 0, 0, 0 ); // do something reasonable + + } + + skinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w ); + + } + + } + + }, + + updateMatrixWorld: function ( force ) { + + Mesh.prototype.updateMatrixWorld.call( this, force ); + + if ( this.bindMode === 'attached' ) { + + this.bindMatrixInverse.getInverse( this.matrixWorld ); + + } else if ( this.bindMode === 'detached' ) { + + this.bindMatrixInverse.getInverse( this.bindMatrix ); + + } else { + + console.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode ); + + } + + }, + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * linewidth: , + * linecap: "round", + * linejoin: "round" + * } + */ + + function LineBasicMaterial( parameters ) { + + Material.call( this ); + + this.type = 'LineBasicMaterial'; + + this.color = new Color( 0xffffff ); + + this.linewidth = 1; + this.linecap = 'round'; + this.linejoin = 'round'; + + this.lights = false; + + this.setValues( parameters ); + + } + + LineBasicMaterial.prototype = Object.create( Material.prototype ); + LineBasicMaterial.prototype.constructor = LineBasicMaterial; + + LineBasicMaterial.prototype.isLineBasicMaterial = true; + + LineBasicMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.linewidth = source.linewidth; + this.linecap = source.linecap; + this.linejoin = source.linejoin; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Line( geometry, material, mode ) { + + if ( mode === 1 ) { + + console.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' ); + return new LineSegments( geometry, material ); + + } + + Object3D.call( this ); + + this.type = 'Line'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } ); + + } + + Line.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Line, + + isLine: true, + + computeLineDistances: ( function () { + + var start = new Vector3(); + var end = new Vector3(); + + return function computeLineDistances() { + + var geometry = this.geometry; + + if ( geometry.isBufferGeometry ) { + + // we assume non-indexed geometry + + if ( geometry.index === null ) { + + var positionAttribute = geometry.attributes.position; + var lineDistances = [ 0 ]; + + for ( var i = 1, l = positionAttribute.count; i < l; i ++ ) { + + start.fromBufferAttribute( positionAttribute, i - 1 ); + end.fromBufferAttribute( positionAttribute, i ); + + lineDistances[ i ] = lineDistances[ i - 1 ]; + lineDistances[ i ] += start.distanceTo( end ); + + } + + geometry.addAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) ); + + } else { + + console.warn( 'THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' ); + + } + + } else if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + var lineDistances = geometry.lineDistances; + + lineDistances[ 0 ] = 0; + + for ( var i = 1, l = vertices.length; i < l; i ++ ) { + + lineDistances[ i ] = lineDistances[ i - 1 ]; + lineDistances[ i ] += vertices[ i - 1 ].distanceTo( vertices[ i ] ); + + } + + } + + return this; + + }; + + }() ), + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + return function raycast( raycaster, intersects ) { + + var precision = raycaster.linePrecision; + var precisionSq = precision * precision; + + var geometry = this.geometry; + var matrixWorld = this.matrixWorld; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + var vStart = new Vector3(); + var vEnd = new Vector3(); + var interSegment = new Vector3(); + var interRay = new Vector3(); + var step = ( this && this.isLineSegments ) ? 2 : 1; + + if ( geometry.isBufferGeometry ) { + + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, l = indices.length - 1; i < l; i += step ) { + + var a = indices[ i ]; + var b = indices[ i + 1 ]; + + vStart.fromArray( positions, a * 3 ); + vEnd.fromArray( positions, b * 3 ); + + var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } else { + + for ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) { + + vStart.fromArray( positions, 3 * i ); + vEnd.fromArray( positions, 3 * i + 3 ); + + var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + } else if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + var nbVertices = vertices.length; + + for ( var i = 0; i < nbVertices - 1; i += step ) { + + var distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LineSegments( geometry, material ) { + + Line.call( this, geometry, material ); + + this.type = 'LineSegments'; + + } + + LineSegments.prototype = Object.assign( Object.create( Line.prototype ), { + + constructor: LineSegments, + + isLineSegments: true, + + computeLineDistances: ( function () { + + var start = new Vector3(); + var end = new Vector3(); + + return function computeLineDistances() { + + var geometry = this.geometry; + + if ( geometry.isBufferGeometry ) { + + // we assume non-indexed geometry + + if ( geometry.index === null ) { + + var positionAttribute = geometry.attributes.position; + var lineDistances = []; + + for ( var i = 0, l = positionAttribute.count; i < l; i += 2 ) { + + start.fromBufferAttribute( positionAttribute, i ); + end.fromBufferAttribute( positionAttribute, i + 1 ); + + lineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ]; + lineDistances[ i + 1 ] = lineDistances[ i ] + start.distanceTo( end ); + + } + + geometry.addAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) ); + + } else { + + console.warn( 'THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' ); + + } + + } else if ( geometry.isGeometry ) { + + var vertices = geometry.vertices; + var lineDistances = geometry.lineDistances; + + for ( var i = 0, l = vertices.length; i < l; i += 2 ) { + + start.copy( vertices[ i ] ); + end.copy( vertices[ i + 1 ] ); + + lineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ]; + lineDistances[ i + 1 ] = lineDistances[ i ] + start.distanceTo( end ); + + } + + } + + return this; + + }; + + }() ) + + } ); + + /** + * @author mgreter / http://github.com/mgreter + */ + + function LineLoop( geometry, material ) { + + Line.call( this, geometry, material ); + + this.type = 'LineLoop'; + + } + + LineLoop.prototype = Object.assign( Object.create( Line.prototype ), { + + constructor: LineLoop, + + isLineLoop: true, + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * size: , + * sizeAttenuation: + * } + */ + + function PointsMaterial( parameters ) { + + Material.call( this ); + + this.type = 'PointsMaterial'; + + this.color = new Color( 0xffffff ); + + this.map = null; + + this.size = 1; + this.sizeAttenuation = true; + + this.lights = false; + + this.setValues( parameters ); + + } + + PointsMaterial.prototype = Object.create( Material.prototype ); + PointsMaterial.prototype.constructor = PointsMaterial; + + PointsMaterial.prototype.isPointsMaterial = true; + + PointsMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.size = source.size; + this.sizeAttenuation = source.sizeAttenuation; + + return this; + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Points( geometry, material ) { + + Object3D.call( this ); + + this.type = 'Points'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } ); + + } + + Points.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Points, + + isPoints: true, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + return function raycast( raycaster, intersects ) { + + var object = this; + var geometry = this.geometry; + var matrixWorld = this.matrixWorld; + var threshold = raycaster.params.Points.threshold; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + sphere.radius += threshold; + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + var localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 ); + var localThresholdSq = localThreshold * localThreshold; + var position = new Vector3(); + var intersectPoint = new Vector3(); + + function testPoint( point, index ) { + + var rayPointDistanceSq = ray.distanceSqToPoint( point ); + + if ( rayPointDistanceSq < localThresholdSq ) { + + ray.closestPointToPoint( point, intersectPoint ); + intersectPoint.applyMatrix4( matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + distanceToRay: Math.sqrt( rayPointDistanceSq ), + point: intersectPoint.clone(), + index: index, + face: null, + object: object + + } ); + + } + + } + + if ( geometry.isBufferGeometry ) { + + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, il = indices.length; i < il; i ++ ) { + + var a = indices[ i ]; + + position.fromArray( positions, a * 3 ); + + testPoint( position, a ); + + } + + } else { + + for ( var i = 0, l = positions.length / 3; i < l; i ++ ) { + + position.fromArray( positions, i * 3 ); + + testPoint( position, i ); + + } + + } + + } else { + + var vertices = geometry.vertices; + + for ( var i = 0, l = vertices.length; i < l; i ++ ) { + + testPoint( vertices[ i ], i ); + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Group() { + + Object3D.call( this ); + + this.type = 'Group'; + + } + + Group.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Group, + + isGroup: true + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + Texture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.generateMipmaps = false; + + } + + VideoTexture.prototype = Object.assign( Object.create( Texture.prototype ), { + + constructor: VideoTexture, + + isVideoTexture: true, + + update: function () { + + var video = this.image; + + if ( video.readyState >= video.HAVE_CURRENT_DATA ) { + + this.needsUpdate = true; + + } + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.image = { width: width, height: height }; + this.mipmaps = mipmaps; + + // no flipping for cube textures + // (also flipping doesn't work for compressed textures ) + + this.flipY = false; + + // can't generate mipmaps for compressed textures + // mips must be embedded in DDS files + + this.generateMipmaps = false; + + } + + CompressedTexture.prototype = Object.create( Texture.prototype ); + CompressedTexture.prototype.constructor = CompressedTexture; + + CompressedTexture.prototype.isCompressedTexture = true; + + /** + * @author Matt DesLauriers / @mattdesl + * @author atix / arthursilber.de + */ + + function DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) { + + format = format !== undefined ? format : DepthFormat; + + if ( format !== DepthFormat && format !== DepthStencilFormat ) { + + throw new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' ); + + } + + if ( type === undefined && format === DepthFormat ) type = UnsignedShortType; + if ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type; + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.image = { width: width, height: height }; + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter; + + this.flipY = false; + this.generateMipmaps = false; + + } + + DepthTexture.prototype = Object.create( Texture.prototype ); + DepthTexture.prototype.constructor = DepthTexture; + DepthTexture.prototype.isDepthTexture = true; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + function WireframeGeometry( geometry ) { + + BufferGeometry.call( this ); + + this.type = 'WireframeGeometry'; + + // buffer + + var vertices = []; + + // helper variables + + var i, j, l, o, ol; + var edge = [ 0, 0 ], edges = {}, e, edge1, edge2; + var key, keys = [ 'a', 'b', 'c' ]; + var vertex; + + // different logic for Geometry and BufferGeometry + + if ( geometry && geometry.isGeometry ) { + + // create a data structure that contains all edges without duplicates + + var faces = geometry.faces; + + for ( i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( j = 0; j < 3; j ++ ) { + + edge1 = face[ keys[ j ] ]; + edge2 = face[ keys[ ( j + 1 ) % 3 ] ]; + edge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates + edge[ 1 ] = Math.max( edge1, edge2 ); + + key = edge[ 0 ] + ',' + edge[ 1 ]; + + if ( edges[ key ] === undefined ) { + + edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] }; + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + e = edges[ key ]; + + vertex = geometry.vertices[ e.index1 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex = geometry.vertices[ e.index2 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } else if ( geometry && geometry.isBufferGeometry ) { + + var position, indices, groups; + var group, start, count; + var index1, index2; + + vertex = new Vector3(); + + if ( geometry.index !== null ) { + + // indexed BufferGeometry + + position = geometry.attributes.position; + indices = geometry.index; + groups = geometry.groups; + + if ( groups.length === 0 ) { + + groups = [ { start: 0, count: indices.count, materialIndex: 0 } ]; + + } + + // create a data structure that contains all eges without duplicates + + for ( o = 0, ol = groups.length; o < ol; ++ o ) { + + group = groups[ o ]; + + start = group.start; + count = group.count; + + for ( i = start, l = ( start + count ); i < l; i += 3 ) { + + for ( j = 0; j < 3; j ++ ) { + + edge1 = indices.getX( i + j ); + edge2 = indices.getX( i + ( j + 1 ) % 3 ); + edge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates + edge[ 1 ] = Math.max( edge1, edge2 ); + + key = edge[ 0 ] + ',' + edge[ 1 ]; + + if ( edges[ key ] === undefined ) { + + edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] }; + + } + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + e = edges[ key ]; + + vertex.fromBufferAttribute( position, e.index1 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex.fromBufferAttribute( position, e.index2 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } else { + + // non-indexed BufferGeometry + + position = geometry.attributes.position; + + for ( i = 0, l = ( position.count / 3 ); i < l; i ++ ) { + + for ( j = 0; j < 3; j ++ ) { + + // three edges per triangle, an edge is represented as (index1, index2) + // e.g. the first triangle has the following edges: (0,1),(1,2),(2,0) + + index1 = 3 * i + j; + vertex.fromBufferAttribute( position, index1 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + index2 = 3 * i + ( ( j + 1 ) % 3 ); + vertex.fromBufferAttribute( position, index2 ); + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + } + + } + + // build geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + + } + + WireframeGeometry.prototype = Object.create( BufferGeometry.prototype ); + WireframeGeometry.prototype.constructor = WireframeGeometry; + + /** + * @author zz85 / https://github.com/zz85 + * @author Mugen87 / https://github.com/Mugen87 + * + * Parametric Surfaces Geometry + * based on the brilliant article by @prideout http://prideout.net/blog/?p=44 + */ + + // ParametricGeometry + + function ParametricGeometry( func, slices, stacks ) { + + Geometry.call( this ); + + this.type = 'ParametricGeometry'; + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + }; + + this.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) ); + this.mergeVertices(); + + } + + ParametricGeometry.prototype = Object.create( Geometry.prototype ); + ParametricGeometry.prototype.constructor = ParametricGeometry; + + // ParametricBufferGeometry + + function ParametricBufferGeometry( func, slices, stacks ) { + + BufferGeometry.call( this ); + + this.type = 'ParametricBufferGeometry'; + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + }; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + var EPS = 0.00001; + + var normal = new Vector3(); + + var p0 = new Vector3(), p1 = new Vector3(); + var pu = new Vector3(), pv = new Vector3(); + + var i, j; + + // generate vertices, normals and uvs + + var sliceCount = slices + 1; + + for ( i = 0; i <= stacks; i ++ ) { + + var v = i / stacks; + + for ( j = 0; j <= slices; j ++ ) { + + var u = j / slices; + + // vertex + + func( u, v, p0 ); + vertices.push( p0.x, p0.y, p0.z ); + + // normal + + // approximate tangent vectors via finite differences + + if ( u - EPS >= 0 ) { + + func( u - EPS, v, p1 ); + pu.subVectors( p0, p1 ); + + } else { + + func( u + EPS, v, p1 ); + pu.subVectors( p1, p0 ); + + } + + if ( v - EPS >= 0 ) { + + func( u, v - EPS, p1 ); + pv.subVectors( p0, p1 ); + + } else { + + func( u, v + EPS, p1 ); + pv.subVectors( p1, p0 ); + + } + + // cross product of tangent vectors returns surface normal + + normal.crossVectors( pu, pv ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, v ); + + } + + } + + // generate indices + + for ( i = 0; i < stacks; i ++ ) { + + for ( j = 0; j < slices; j ++ ) { + + var a = i * sliceCount + j; + var b = i * sliceCount + j + 1; + var c = ( i + 1 ) * sliceCount + j + 1; + var d = ( i + 1 ) * sliceCount + j; + + // faces one and two + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + ParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + ParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry; + + /** + * @author clockworkgeek / https://github.com/clockworkgeek + * @author timothypratley / https://github.com/timothypratley + * @author WestLangley / http://github.com/WestLangley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // PolyhedronGeometry + + function PolyhedronGeometry( vertices, indices, radius, detail ) { + + Geometry.call( this ); + + this.type = 'PolyhedronGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) ); + this.mergeVertices(); + + } + + PolyhedronGeometry.prototype = Object.create( Geometry.prototype ); + PolyhedronGeometry.prototype.constructor = PolyhedronGeometry; + + // PolyhedronBufferGeometry + + function PolyhedronBufferGeometry( vertices, indices, radius, detail ) { + + BufferGeometry.call( this ); + + this.type = 'PolyhedronBufferGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + radius = radius || 1; + detail = detail || 0; + + // default buffer data + + var vertexBuffer = []; + var uvBuffer = []; + + // the subdivision creates the vertex buffer data + + subdivide( detail ); + + // all vertices should lie on a conceptual sphere with a given radius + + appplyRadius( radius ); + + // finally, create the uv data + + generateUVs(); + + // build non-indexed geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) ); + + if ( detail === 0 ) { + + this.computeVertexNormals(); // flat normals + + } else { + + this.normalizeNormals(); // smooth normals + + } + + // helper functions + + function subdivide( detail ) { + + var a = new Vector3(); + var b = new Vector3(); + var c = new Vector3(); + + // iterate over all faces and apply a subdivison with the given detail value + + for ( var 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 ) { + + var cols = Math.pow( 2, detail ); + + // we use this multidimensional array as a data structure for creating the subdivision + + var v = []; + + var i, j; + + // construct all of the vertices for this subdivision + + for ( i = 0; i <= cols; i ++ ) { + + v[ i ] = []; + + var aj = a.clone().lerp( c, i / cols ); + var bj = b.clone().lerp( c, i / cols ); + + var rows = cols - i; + + for ( 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 ( i = 0; i < cols; i ++ ) { + + for ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) { + + var 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 appplyRadius( radius ) { + + var vertex = new Vector3(); + + // iterate over the entire buffer and apply the radius to each vertex + + for ( var 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() { + + var vertex = new Vector3(); + + for ( var i = 0; i < vertexBuffer.length; i += 3 ) { + + vertex.x = vertexBuffer[ i + 0 ]; + vertex.y = vertexBuffer[ i + 1 ]; + vertex.z = vertexBuffer[ i + 2 ]; + + var u = azimuth( vertex ) / 2 / Math.PI + 0.5; + var 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 ( var i = 0; i < uvBuffer.length; i += 6 ) { + + // uv data of a single face + + var x0 = uvBuffer[ i + 0 ]; + var x1 = uvBuffer[ i + 2 ]; + var x2 = uvBuffer[ i + 4 ]; + + var max = Math.max( x0, x1, x2 ); + var 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 ) { + + var stride = index * 3; + + vertex.x = vertices[ stride + 0 ]; + vertex.y = vertices[ stride + 1 ]; + vertex.z = vertices[ stride + 2 ]; + + } + + function correctUVs() { + + var a = new Vector3(); + var b = new Vector3(); + var c = new Vector3(); + + var centroid = new Vector3(); + + var uvA = new Vector2(); + var uvB = new Vector2(); + var uvC = new Vector2(); + + for ( var 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 ).divideScalar( 3 ); + + var 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 ) ) ); + + } + + } + + PolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + PolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // TetrahedronGeometry + + function TetrahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'TetrahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + TetrahedronGeometry.prototype = Object.create( Geometry.prototype ); + TetrahedronGeometry.prototype.constructor = TetrahedronGeometry; + + // TetrahedronBufferGeometry + + function TetrahedronBufferGeometry( radius, detail ) { + + var vertices = [ + 1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1 + ]; + + var indices = [ + 2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'TetrahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + TetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + TetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // OctahedronGeometry + + function OctahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'OctahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + OctahedronGeometry.prototype = Object.create( Geometry.prototype ); + OctahedronGeometry.prototype.constructor = OctahedronGeometry; + + // OctahedronBufferGeometry + + function OctahedronBufferGeometry( radius, detail ) { + + var vertices = [ + 1, 0, 0, - 1, 0, 0, 0, 1, 0, + 0, - 1, 0, 0, 0, 1, 0, 0, - 1 + ]; + + var 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 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'OctahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + OctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + OctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // IcosahedronGeometry + + function IcosahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'IcosahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + IcosahedronGeometry.prototype = Object.create( Geometry.prototype ); + IcosahedronGeometry.prototype.constructor = IcosahedronGeometry; + + // IcosahedronBufferGeometry + + function IcosahedronBufferGeometry( radius, detail ) { + + var t = ( 1 + Math.sqrt( 5 ) ) / 2; + + var 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 + ]; + + var 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 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'IcosahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + IcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + IcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry; + + /** + * @author Abe Pazos / https://hamoid.com + * @author Mugen87 / https://github.com/Mugen87 + */ + + // DodecahedronGeometry + + function DodecahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'DodecahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + DodecahedronGeometry.prototype = Object.create( Geometry.prototype ); + DodecahedronGeometry.prototype.constructor = DodecahedronGeometry; + + // DodecahedronBufferGeometry + + function DodecahedronBufferGeometry( radius, detail ) { + + var t = ( 1 + Math.sqrt( 5 ) ) / 2; + var r = 1 / t; + + var 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 + ]; + + var 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 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'DodecahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + DodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + DodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry; + + /** + * @author oosmoxiecode / https://github.com/oosmoxiecode + * @author WestLangley / https://github.com/WestLangley + * @author zz85 / https://github.com/zz85 + * @author miningold / https://github.com/miningold + * @author jonobr1 / https://github.com/jonobr1 + * @author Mugen87 / https://github.com/Mugen87 + * + */ + + // TubeGeometry + + function TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) { + + Geometry.call( this ); + + this.type = 'TubeGeometry'; + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + }; + + if ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' ); + + var bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ); + + // expose internals + + this.tangents = bufferGeometry.tangents; + this.normals = bufferGeometry.normals; + this.binormals = bufferGeometry.binormals; + + // create geometry + + this.fromBufferGeometry( bufferGeometry ); + this.mergeVertices(); + + } + + TubeGeometry.prototype = Object.create( Geometry.prototype ); + TubeGeometry.prototype.constructor = TubeGeometry; + + // TubeBufferGeometry + + function TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) { + + BufferGeometry.call( this ); + + this.type = 'TubeBufferGeometry'; + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + }; + + tubularSegments = tubularSegments || 64; + radius = radius || 1; + radialSegments = radialSegments || 8; + closed = closed || false; + + var frames = path.computeFrenetFrames( tubularSegments, closed ); + + // expose internals + + this.tangents = frames.tangents; + this.normals = frames.normals; + this.binormals = frames.binormals; + + // helper variables + + var vertex = new Vector3(); + var normal = new Vector3(); + var uv = new Vector2(); + var P = new Vector3(); + + var i, j; + + // buffer + + var vertices = []; + var normals = []; + var uvs = []; + var indices = []; + + // create buffer data + + generateBufferData(); + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // functions + + function generateBufferData() { + + for ( i = 0; i < tubularSegments; i ++ ) { + + generateSegment( i ); + + } + + // if the geometry is not closed, generate the last row of vertices and normals + // at the regular position on the given path + // + // if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ) + + generateSegment( ( closed === false ) ? tubularSegments : 0 ); + + // uvs are generated in a separate function. + // this makes it easy compute correct values for closed geometries + + generateUVs(); + + // finally create faces + + generateIndices(); + + } + + function generateSegment( i ) { + + // we use getPointAt to sample evenly distributed points from the given path + + P = path.getPointAt( i / tubularSegments, P ); + + // retrieve corresponding normal and binormal + + var N = frames.normals[ i ]; + var B = frames.binormals[ i ]; + + // generate normals and vertices for the current segment + + for ( j = 0; j <= radialSegments; j ++ ) { + + var v = j / radialSegments * Math.PI * 2; + + var sin = Math.sin( v ); + var cos = - Math.cos( v ); + + // normal + + normal.x = ( cos * N.x + sin * B.x ); + normal.y = ( cos * N.y + sin * B.y ); + normal.z = ( cos * N.z + sin * B.z ); + normal.normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // vertex + + vertex.x = P.x + radius * normal.x; + vertex.y = P.y + radius * normal.y; + vertex.z = P.z + radius * normal.z; + + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + function generateIndices() { + + for ( j = 1; j <= tubularSegments; j ++ ) { + + for ( i = 1; i <= radialSegments; i ++ ) { + + var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + var b = ( radialSegments + 1 ) * j + ( i - 1 ); + var c = ( radialSegments + 1 ) * j + i; + var d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + } + + function generateUVs() { + + for ( i = 0; i <= tubularSegments; i ++ ) { + + for ( j = 0; j <= radialSegments; j ++ ) { + + uv.x = i / tubularSegments; + uv.y = j / radialSegments; + + uvs.push( uv.x, uv.y ); + + } + + } + + } + + } + + TubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TubeBufferGeometry.prototype.constructor = TubeBufferGeometry; + + /** + * @author oosmoxiecode + * @author Mugen87 / https://github.com/Mugen87 + * + * based on http://www.blackpawn.com/texts/pqtorus/ + */ + + // TorusKnotGeometry + + function TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) { + + Geometry.call( this ); + + this.type = 'TorusKnotGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + }; + + if ( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' ); + + this.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) ); + this.mergeVertices(); + + } + + TorusKnotGeometry.prototype = Object.create( Geometry.prototype ); + TorusKnotGeometry.prototype.constructor = TorusKnotGeometry; + + // TorusKnotBufferGeometry + + function TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) { + + BufferGeometry.call( this ); + + this.type = 'TorusKnotBufferGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + }; + + radius = radius || 1; + tube = tube || 0.4; + tubularSegments = Math.floor( tubularSegments ) || 64; + radialSegments = Math.floor( radialSegments ) || 8; + p = p || 2; + q = q || 3; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var i, j; + + var vertex = new Vector3(); + var normal = new Vector3(); + + var P1 = new Vector3(); + var P2 = new Vector3(); + + var B = new Vector3(); + var T = new Vector3(); + var 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 + + var 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. + + var v = j / radialSegments * Math.PI * 2; + var cx = - tube * Math.cos( v ); + var 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 + + var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + var b = ( radialSegments + 1 ) * j + ( i - 1 ); + var c = ( radialSegments + 1 ) * j + i; + var d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // this function calculates the current position on the torus curve + + function calculatePositionOnCurve( u, p, q, radius, position ) { + + var cu = Math.cos( u ); + var su = Math.sin( u ); + var quOverP = q / p * u; + var 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; + + } + + } + + TorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry; + + /** + * @author oosmoxiecode + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // TorusGeometry + + function TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) { + + Geometry.call( this ); + + this.type = 'TorusGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + this.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) ); + this.mergeVertices(); + + } + + TorusGeometry.prototype = Object.create( Geometry.prototype ); + TorusGeometry.prototype.constructor = TorusGeometry; + + // TorusBufferGeometry + + function TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) { + + BufferGeometry.call( this ); + + this.type = 'TorusBufferGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + radius = radius || 1; + tube = tube || 0.4; + radialSegments = Math.floor( radialSegments ) || 8; + tubularSegments = Math.floor( tubularSegments ) || 6; + arc = arc || Math.PI * 2; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var center = new Vector3(); + var vertex = new Vector3(); + var normal = new Vector3(); + + var j, i; + + // generate vertices, normals and uvs + + for ( j = 0; j <= radialSegments; j ++ ) { + + for ( i = 0; i <= tubularSegments; i ++ ) { + + var u = i / tubularSegments * arc; + var 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 ); + + vertices.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 ( j = 1; j <= radialSegments; j ++ ) { + + for ( i = 1; i <= tubularSegments; i ++ ) { + + // indices + + 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; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + TorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TorusBufferGeometry.prototype.constructor = TorusBufferGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + * Port from https://github.com/mapbox/earcut (v2.1.2) + */ + + var Earcut = { + + triangulate: function ( data, holeIndices, dim ) { + + dim = dim || 2; + + var hasHoles = holeIndices && holeIndices.length, + outerLen = hasHoles ? holeIndices[ 0 ] * dim : data.length, + outerNode = linkedList( data, 0, outerLen, dim, true ), + triangles = []; + + if ( ! outerNode ) return triangles; + + var 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 ( var 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 ) { + + var 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; + + var 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 ); + + var 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 vertice 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( 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 ) { + + var 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 + var 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 ) { + + var 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 + + var 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; + + var minZ = zOrder( minTX, minTY, minX, minY, invSize ), + maxZ = zOrder( maxTX, maxTY, minX, minY, invSize ); + + // first look for points inside the triangle in increasing z-order + + var p = ear.nextZ; + + while ( p && p.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.nextZ; + + } + + // then look for points in decreasing z-order + + p = ear.prevZ; + + 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; + + } + + return true; + + } + + // go through all polygon nodes and cure small local self-intersections + + function cureLocalIntersections( start, triangles, dim ) { + + var p = start; + + do { + + var 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 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 + + var a = start; + + do { + + var b = a.next.next; + + while ( b !== a.prev ) { + + if ( a.i !== b.i && isValidDiagonal( a, b ) ) { + + // split the polygon in two by the diagonal + + var 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 ) { + + var queue = [], 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 ) { + + var b = splitPolygon( outerNode, hole ); + + filterPoints( b, b.next ); + + } + + } + + // David Eberly's algorithm for finding a bridge between hole and outer polygon + + function findHoleBridge( hole, outerNode ) { + + var p = outerNode, + hx = hole.x, + hy = hole.y, + 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 ) { + + var 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.prev; // hole touches outer segment; pick lower 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 + + var stop = m, + mx = m.x, + my = m.y, + tanMin = Infinity, + tan; + + p = m.next; + + while ( p !== stop ) { + + 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 ( ( tan < tanMin || ( tan === tanMin && p.x > m.x ) ) && locallyInside( p, hole ) ) { + + m = p; + tanMin = tan; + + } + + } + + p = p.next; + + } + + return m; + + } + + // interlink polygon nodes in z-order + + function indexCurve( start, minX, minY, invSize ) { + + var 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 ) { + + var 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 ) { + + var p = start, leftmost = start; + + do { + + if ( p.x < leftmost.x ) 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 ) && + locallyInside( a, b ) && locallyInside( b, a ) && middleInside( a, b ); + + } + + // 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 ) { + + if ( ( equals( p1, q1 ) && equals( p2, q2 ) ) || + ( equals( p1, q2 ) && equals( p2, q1 ) ) ) return true; + + return area( p1, q1, p2 ) > 0 !== area( p1, q1, q2 ) > 0 && + area( p2, q2, p1 ) > 0 !== area( p2, q2, q1 ) > 0; + + } + + // check if a polygon diagonal intersects any polygon segments + + function intersectsPolygon( a, b ) { + + var 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 ) { + + var p = a, + inside = false, + 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 ) { + + var 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 ) { + + var 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 ) { + + // vertice index in coordinates array + this.i = i; + + // vertex coordinates + this.x = x; + this.y = y; + + // previous and next vertice 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 ) { + + var sum = 0; + + for ( var i = start, j = end - dim; i < end; i += dim ) { + + sum += ( data[ j ] - data[ i ] ) * ( data[ i + 1 ] + data[ j + 1 ] ); + j = i; + + } + + return sum; + + } + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + + var ShapeUtils = { + + // calculate area of the contour polygon + + area: function ( contour ) { + + var n = contour.length; + var a = 0.0; + + for ( var 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; + + }, + + isClockWise: function ( pts ) { + + return ShapeUtils.area( pts ) < 0; + + }, + + triangulateShape: function ( contour, holes ) { + + var vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ] + var holeIndices = []; // array of hole indices + var faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ] + + removeDupEndPts( contour ); + addContour( vertices, contour ); + + // + + var holeIndex = contour.length; + + holes.forEach( removeDupEndPts ); + + for ( var i = 0; i < holes.length; i ++ ) { + + holeIndices.push( holeIndex ); + holeIndex += holes[ i ].length; + addContour( vertices, holes[ i ] ); + + } + + // + + var triangles = Earcut.triangulate( vertices, holeIndices ); + + // + + for ( var i = 0; i < triangles.length; i += 3 ) { + + faces.push( triangles.slice( i, i + 3 ) ); + + } + + return faces; + + } + + }; + + function removeDupEndPts( points ) { + + var l = points.length; + + if ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) { + + points.pop(); + + } + + } + + function addContour( vertices, contour ) { + + for ( var i = 0; i < contour.length; i ++ ) { + + vertices.push( contour[ i ].x ); + vertices.push( contour[ i ].y ); + + } + + } + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + * Creates extruded geometry from a path shape. + * + * parameters = { + * + * curveSegments: , // number of points on the curves + * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too + * amount: , // Depth to extrude the shape + * + * bevelEnabled: , // turn on bevel + * bevelThickness: , // how deep into the original shape bevel goes + * bevelSize: , // how far from shape outline is bevel + * bevelSegments: , // number of bevel layers + * + * extrudePath: // curve to extrude shape along + * + * UVGenerator: // object that provides UV generator functions + * + * } + */ + + // ExtrudeGeometry + + function ExtrudeGeometry( shapes, options ) { + + Geometry.call( this ); + + this.type = 'ExtrudeGeometry'; + + this.parameters = { + shapes: shapes, + options: options + }; + + this.fromBufferGeometry( new ExtrudeBufferGeometry( shapes, options ) ); + this.mergeVertices(); + + } + + ExtrudeGeometry.prototype = Object.create( Geometry.prototype ); + ExtrudeGeometry.prototype.constructor = ExtrudeGeometry; + + // ExtrudeBufferGeometry + + function ExtrudeBufferGeometry( shapes, options ) { + + BufferGeometry.call( this ); + + this.type = 'ExtrudeBufferGeometry'; + + this.parameters = { + shapes: shapes, + options: options + }; + + shapes = Array.isArray( shapes ) ? shapes : [ shapes ]; + + var scope = this; + + var verticesArray = []; + var uvArray = []; + + for ( var i = 0, l = shapes.length; i < l; i ++ ) { + + var shape = shapes[ i ]; + addShape( shape, options ); + + } + + // build geometry + + this.addAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) ); + + this.computeVertexNormals(); + + // functions + + function addShape( shape ) { + + var placeholder = []; + + // options + + var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12; + var steps = options.steps !== undefined ? options.steps : 1; + var amount = options.amount !== undefined ? options.amount : 100; + + var bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; + var bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; + var bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; + var bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3; + + var extrudePath = options.extrudePath; + + var uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator; + + // + + var extrudePts, extrudeByPath = false; + var splineTube, binormal, normal, position2; + + if ( extrudePath ) { + + extrudePts = extrudePath.getSpacedPoints( steps ); + + extrudeByPath = true; + bevelEnabled = false; // bevels not supported for path extrusion + + // SETUP TNB variables + + // TODO1 - have a .isClosed in spline? + + splineTube = extrudePath.computeFrenetFrames( steps, false ); + + // console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length); + + binormal = new Vector3(); + normal = new Vector3(); + position2 = new Vector3(); + + } + + // Safeguards if bevels are not enabled + + if ( ! bevelEnabled ) { + + bevelSegments = 0; + bevelThickness = 0; + bevelSize = 0; + + } + + // Variables initialization + + var ahole, h, hl; // looping of holes + + var shapePoints = shape.extractPoints( curveSegments ); + + var vertices = shapePoints.shape; + var holes = shapePoints.holes; + + var reverse = ! ShapeUtils.isClockWise( vertices ); + + if ( reverse ) { + + vertices = vertices.reverse(); + + // Maybe we should also check if holes are in the opposite direction, just to be safe ... + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + if ( ShapeUtils.isClockWise( ahole ) ) { + + holes[ h ] = ahole.reverse(); + + } + + } + + } + + + var faces = ShapeUtils.triangulateShape( vertices, holes ); + + /* Vertices */ + + var contour = vertices; // vertices has all points but contour has only points of circumference + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + vertices = vertices.concat( ahole ); + + } + + + function scalePt2( pt, vec, size ) { + + if ( ! vec ) console.error( "THREE.ExtrudeGeometry: vec does not exist" ); + + return vec.clone().multiplyScalar( size ).add( pt ); + + } + + var b, bs, t, z, + vert, vlen = vertices.length, + face, flen = faces.length; + + + // Find directions for point movement + + + function getBevelVec( inPt, inPrev, inNext ) { + + // computes for inPt the corresponding point inPt' on a new contour + // shifted by 1 unit (length of normalized vector) to the left + // if we walk along contour clockwise, this new contour is outside the old one + // + // inPt' is the intersection of the two lines parallel to the two + // adjacent edges of inPt at a distance of 1 unit on the left side. + + var v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt + + // good reading for geometry algorithms (here: line-line intersection) + // http://geomalgorithms.com/a05-_intersect-1.html + + var v_prev_x = inPt.x - inPrev.x, + v_prev_y = inPt.y - inPrev.y; + var v_next_x = inNext.x - inPt.x, + v_next_y = inNext.y - inPt.y; + + var v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y ); + + // check for collinear edges + var collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + if ( Math.abs( collinear0 ) > Number.EPSILON ) { + + // not collinear + + // length of vectors for normalizing + + var v_prev_len = Math.sqrt( v_prev_lensq ); + var v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y ); + + // shift adjacent points by unit vectors to the left + + var ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len ); + var ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len ); + + var ptNextShift_x = ( inNext.x - v_next_y / v_next_len ); + var ptNextShift_y = ( inNext.y + v_next_x / v_next_len ); + + // scaling factor for v_prev to intersection point + + var sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y - + ( ptNextShift_y - ptPrevShift_y ) * v_next_x ) / + ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + // vector from inPt to intersection point + + v_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x ); + v_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y ); + + // Don't normalize!, otherwise sharp corners become ugly + // but prevent crazy spikes + var v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y ); + if ( v_trans_lensq <= 2 ) { + + return new Vector2( v_trans_x, v_trans_y ); + + } else { + + shrink_by = Math.sqrt( v_trans_lensq / 2 ); + + } + + } else { + + // handle special case of collinear edges + + var direction_eq = false; // assumes: opposite + if ( v_prev_x > Number.EPSILON ) { + + if ( v_next_x > Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( v_prev_x < - Number.EPSILON ) { + + if ( v_next_x < - Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) { + + direction_eq = true; + + } + + } + + } + + if ( direction_eq ) { + + // console.log("Warning: lines are a straight sequence"); + v_trans_x = - v_prev_y; + v_trans_y = v_prev_x; + shrink_by = Math.sqrt( v_prev_lensq ); + + } else { + + // console.log("Warning: lines are a straight spike"); + v_trans_x = v_prev_x; + v_trans_y = v_prev_y; + shrink_by = Math.sqrt( v_prev_lensq / 2 ); + + } + + } + + return new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by ); + + } + + + var contourMovements = []; + + for ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + // console.log('i,j,k', i, j , k) + + contourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] ); + + } + + var holesMovements = [], + oneHoleMovements, verticesMovements = contourMovements.concat(); + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + oneHoleMovements = []; + + for ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + oneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] ); + + } + + holesMovements.push( oneHoleMovements ); + verticesMovements = verticesMovements.concat( oneHoleMovements ); + + } + + + // Loop bevelSegments, 1 for the front, 1 for the back + + for ( b = 0; b < bevelSegments; b ++ ) { + + //for ( b = bevelSegments; b > 0; b -- ) { + + t = b / bevelSegments; + z = bevelThickness * Math.cos( t * Math.PI / 2 ); + bs = bevelSize * Math.sin( t * Math.PI / 2 ); + + // contract shape + + for ( i = 0, il = contour.length; i < il; i ++ ) { + + vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + // expand holes + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( i = 0, il = ahole.length; i < il; i ++ ) { + + vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + } + + } + + bs = bevelSize; + + // Back facing vertices + + for ( i = 0; i < vlen; i ++ ) { + + vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, 0 ); + + } else { + + // v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x ); + + normal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + // Add stepped vertices... + // Including front facing vertices + + var s; + + for ( s = 1; s <= steps; s ++ ) { + + for ( i = 0; i < vlen; i ++ ) { + + vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, amount / steps * s ); + + } else { + + // v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x ); + + normal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ s ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + } + + + // Add bevel segments planes + + //for ( b = 1; b <= bevelSegments; b ++ ) { + for ( b = bevelSegments - 1; b >= 0; b -- ) { + + t = b / bevelSegments; + z = bevelThickness * Math.cos( t * Math.PI / 2 ); + bs = bevelSize * Math.sin( t * Math.PI / 2 ); + + // contract shape + + for ( i = 0, il = contour.length; i < il; i ++ ) { + + vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + v( vert.x, vert.y, amount + z ); + + } + + // expand holes + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( i = 0, il = ahole.length; i < il; i ++ ) { + + vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, amount + z ); + + } else { + + v( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z ); + + } + + } + + } + + } + + /* Faces */ + + // Top and bottom faces + + buildLidFaces(); + + // Sides faces + + buildSideFaces(); + + + ///// Internal functions + + function buildLidFaces() { + + var start = verticesArray.length / 3; + + if ( bevelEnabled ) { + + var layer = 0; // steps + 1 + var offset = vlen * layer; + + // Bottom faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset ); + + } + + layer = steps + bevelSegments * 2; + offset = vlen * layer; + + // Top faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset ); + + } + + } else { + + // Bottom faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 2 ], face[ 1 ], face[ 0 ] ); + + } + + // Top faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps ); + + } + + } + + scope.addGroup( start, verticesArray.length / 3 - start, 0 ); + + } + + // Create faces for the z-sides of the shape + + function buildSideFaces() { + + var start = verticesArray.length / 3; + var layeroffset = 0; + sidewalls( contour, layeroffset ); + layeroffset += contour.length; + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + sidewalls( ahole, layeroffset ); + + //, true + layeroffset += ahole.length; + + } + + + scope.addGroup( start, verticesArray.length / 3 - start, 1 ); + + + } + + function sidewalls( contour, layeroffset ) { + + var j, k; + i = contour.length; + + while ( -- i >= 0 ) { + + j = i; + k = i - 1; + if ( k < 0 ) k = contour.length - 1; + + //console.log('b', i,j, i-1, k,vertices.length); + + var s = 0, + sl = steps + bevelSegments * 2; + + for ( s = 0; s < sl; s ++ ) { + + var slen1 = vlen * s; + var slen2 = vlen * ( s + 1 ); + + var a = layeroffset + j + slen1, + b = layeroffset + k + slen1, + c = layeroffset + k + slen2, + d = layeroffset + j + slen2; + + f4( a, b, c, d ); + + } + + } + + } + + function v( x, y, z ) { + + placeholder.push( x ); + placeholder.push( y ); + placeholder.push( z ); + + } + + + function f3( a, b, c ) { + + addVertex( a ); + addVertex( b ); + addVertex( c ); + + var nextIndex = verticesArray.length / 3; + var uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 ); + + addUV( uvs[ 0 ] ); + addUV( uvs[ 1 ] ); + addUV( uvs[ 2 ] ); + + } + + function f4( a, b, c, d ) { + + addVertex( a ); + addVertex( b ); + addVertex( d ); + + addVertex( b ); + addVertex( c ); + addVertex( d ); + + + var nextIndex = verticesArray.length / 3; + var uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 ); + + addUV( uvs[ 0 ] ); + addUV( uvs[ 1 ] ); + addUV( uvs[ 3 ] ); + + addUV( uvs[ 1 ] ); + addUV( uvs[ 2 ] ); + addUV( uvs[ 3 ] ); + + } + + function addVertex( index ) { + + verticesArray.push( placeholder[ index * 3 + 0 ] ); + verticesArray.push( placeholder[ index * 3 + 1 ] ); + verticesArray.push( placeholder[ index * 3 + 2 ] ); + + } + + + function addUV( vector2 ) { + + uvArray.push( vector2.x ); + uvArray.push( vector2.y ); + + } + + } + + } + + ExtrudeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + ExtrudeBufferGeometry.prototype.constructor = ExtrudeBufferGeometry; + + var WorldUVGenerator = { + + generateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) { + + var a_x = vertices[ indexA * 3 ]; + var a_y = vertices[ indexA * 3 + 1 ]; + var b_x = vertices[ indexB * 3 ]; + var b_y = vertices[ indexB * 3 + 1 ]; + var c_x = vertices[ indexC * 3 ]; + var c_y = vertices[ indexC * 3 + 1 ]; + + return [ + new Vector2( a_x, a_y ), + new Vector2( b_x, b_y ), + new Vector2( c_x, c_y ) + ]; + + }, + + generateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) { + + var a_x = vertices[ indexA * 3 ]; + var a_y = vertices[ indexA * 3 + 1 ]; + var a_z = vertices[ indexA * 3 + 2 ]; + var b_x = vertices[ indexB * 3 ]; + var b_y = vertices[ indexB * 3 + 1 ]; + var b_z = vertices[ indexB * 3 + 2 ]; + var c_x = vertices[ indexC * 3 ]; + var c_y = vertices[ indexC * 3 + 1 ]; + var c_z = vertices[ indexC * 3 + 2 ]; + var d_x = vertices[ indexD * 3 ]; + var d_y = vertices[ indexD * 3 + 1 ]; + var d_z = vertices[ indexD * 3 + 2 ]; + + if ( Math.abs( a_y - b_y ) < 0.01 ) { + + return [ + new Vector2( a_x, 1 - a_z ), + new Vector2( b_x, 1 - b_z ), + new Vector2( c_x, 1 - c_z ), + new Vector2( d_x, 1 - d_z ) + ]; + + } else { + + return [ + new Vector2( a_y, 1 - a_z ), + new Vector2( b_y, 1 - b_z ), + new Vector2( c_y, 1 - c_z ), + new Vector2( d_y, 1 - d_z ) + ]; + + } + + } + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author alteredq / http://alteredqualia.com/ + * + * Text = 3D Text + * + * parameters = { + * font: , // font + * + * size: , // size of the text + * height: , // thickness to extrude text + * curveSegments: , // number of points on the curves + * + * bevelEnabled: , // turn on bevel + * bevelThickness: , // how deep into text bevel goes + * bevelSize: // how far from text outline is bevel + * } + */ + + // TextGeometry + + function TextGeometry( text, parameters ) { + + Geometry.call( this ); + + this.type = 'TextGeometry'; + + this.parameters = { + text: text, + parameters: parameters + }; + + this.fromBufferGeometry( new TextBufferGeometry( text, parameters ) ); + this.mergeVertices(); + + } + + TextGeometry.prototype = Object.create( Geometry.prototype ); + TextGeometry.prototype.constructor = TextGeometry; + + // TextBufferGeometry + + function TextBufferGeometry( text, parameters ) { + + parameters = parameters || {}; + + var font = parameters.font; + + if ( ! ( font && font.isFont ) ) { + + console.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' ); + return new Geometry(); + + } + + var shapes = font.generateShapes( text, parameters.size, parameters.curveSegments ); + + // translate parameters to ExtrudeGeometry API + + parameters.amount = parameters.height !== undefined ? parameters.height : 50; + + // defaults + + if ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10; + if ( parameters.bevelSize === undefined ) parameters.bevelSize = 8; + if ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false; + + ExtrudeBufferGeometry.call( this, shapes, parameters ); + + this.type = 'TextBufferGeometry'; + + } + + TextBufferGeometry.prototype = Object.create( ExtrudeBufferGeometry.prototype ); + TextBufferGeometry.prototype.constructor = TextBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author benaadams / https://twitter.com/ben_a_adams + * @author Mugen87 / https://github.com/Mugen87 + */ + + // SphereGeometry + + function SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'SphereGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + SphereGeometry.prototype = Object.create( Geometry.prototype ); + SphereGeometry.prototype.constructor = SphereGeometry; + + // SphereBufferGeometry + + function SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'SphereBufferGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radius = radius || 1; + + widthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 ); + heightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 ); + + phiStart = phiStart !== undefined ? phiStart : 0; + phiLength = phiLength !== undefined ? phiLength : Math.PI * 2; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI; + + var thetaEnd = thetaStart + thetaLength; + + var ix, iy; + + var index = 0; + var grid = []; + + var vertex = new Vector3(); + var normal = new Vector3(); + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // generate vertices, normals and uvs + + for ( iy = 0; iy <= heightSegments; iy ++ ) { + + var verticesRow = []; + + var v = iy / heightSegments; + + for ( ix = 0; ix <= widthSegments; ix ++ ) { + + var 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.set( vertex.x, vertex.y, vertex.z ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u, 1 - v ); + + verticesRow.push( index ++ ); + + } + + grid.push( verticesRow ); + + } + + // indices + + for ( iy = 0; iy < heightSegments; iy ++ ) { + + for ( ix = 0; ix < widthSegments; ix ++ ) { + + var a = grid[ iy ][ ix + 1 ]; + var b = grid[ iy ][ ix ]; + var c = grid[ iy + 1 ][ ix ]; + var 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 ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + SphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + SphereBufferGeometry.prototype.constructor = SphereBufferGeometry; + + /** + * @author Kaleb Murphy + * @author Mugen87 / https://github.com/Mugen87 + */ + + // RingGeometry + + function RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'RingGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + RingGeometry.prototype = Object.create( Geometry.prototype ); + RingGeometry.prototype.constructor = RingGeometry; + + // RingBufferGeometry + + function RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'RingBufferGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + innerRadius = innerRadius || 0.5; + outerRadius = outerRadius || 1; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + thetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8; + phiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // some helper variables + + var segment; + var radius = innerRadius; + var radiusStep = ( ( outerRadius - innerRadius ) / phiSegments ); + var vertex = new Vector3(); + var uv = new Vector2(); + var j, i; + + // generate vertices, normals and uvs + + for ( j = 0; j <= phiSegments; j ++ ) { + + for ( i = 0; i <= thetaSegments; i ++ ) { + + // values are generate from the inside of the ring to the outside + + segment = thetaStart + i / thetaSegments * 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 ); + + // uv + + uv.x = ( vertex.x / outerRadius + 1 ) / 2; + uv.y = ( vertex.y / outerRadius + 1 ) / 2; + + uvs.push( uv.x, uv.y ); + + } + + // increase the radius for next row of vertices + + radius += radiusStep; + + } + + // indices + + for ( j = 0; j < phiSegments; j ++ ) { + + var thetaSegmentLevel = j * ( thetaSegments + 1 ); + + for ( i = 0; i < thetaSegments; i ++ ) { + + segment = i + thetaSegmentLevel; + + var a = segment; + var b = segment + thetaSegments + 1; + var c = segment + thetaSegments + 2; + var d = segment + 1; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + RingBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + RingBufferGeometry.prototype.constructor = RingBufferGeometry; + + /** + * @author astrodud / http://astrodud.isgreat.org/ + * @author zz85 / https://github.com/zz85 + * @author bhouston / http://clara.io + * @author Mugen87 / https://github.com/Mugen87 + */ + + // LatheGeometry + + function LatheGeometry( points, segments, phiStart, phiLength ) { + + Geometry.call( this ); + + this.type = 'LatheGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + this.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) ); + this.mergeVertices(); + + } + + LatheGeometry.prototype = Object.create( Geometry.prototype ); + LatheGeometry.prototype.constructor = LatheGeometry; + + // LatheBufferGeometry + + function LatheBufferGeometry( points, segments, phiStart, phiLength ) { + + BufferGeometry.call( this ); + + this.type = 'LatheBufferGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + segments = Math.floor( segments ) || 12; + phiStart = phiStart || 0; + phiLength = phiLength || Math.PI * 2; + + // clamp phiLength so it's in range of [ 0, 2PI ] + + phiLength = _Math.clamp( phiLength, 0, Math.PI * 2 ); + + + // buffers + + var indices = []; + var vertices = []; + var uvs = []; + + // helper variables + + var base; + var inverseSegments = 1.0 / segments; + var vertex = new Vector3(); + var uv = new Vector2(); + var i, j; + + // generate vertices and uvs + + for ( i = 0; i <= segments; i ++ ) { + + var phi = phiStart + i * inverseSegments * phiLength; + + var sin = Math.sin( phi ); + var cos = Math.cos( phi ); + + for ( j = 0; j <= ( points.length - 1 ); j ++ ) { + + // vertex + + vertex.x = points[ j ].x * sin; + vertex.y = points[ j ].y; + vertex.z = points[ j ].x * cos; + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // uv + + uv.x = i / segments; + uv.y = j / ( points.length - 1 ); + + uvs.push( uv.x, uv.y ); + + + } + + } + + // indices + + for ( i = 0; i < segments; i ++ ) { + + for ( j = 0; j < ( points.length - 1 ); j ++ ) { + + base = j + i * points.length; + + var a = base; + var b = base + points.length; + var c = base + points.length + 1; + var d = base + 1; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + // generate normals + + this.computeVertexNormals(); + + // if the geometry is closed, we need to average the normals along the seam. + // because the corresponding vertices are identical (but still have different UVs). + + if ( phiLength === Math.PI * 2 ) { + + var normals = this.attributes.normal.array; + var n1 = new Vector3(); + var n2 = new Vector3(); + var n = new Vector3(); + + // this is the buffer offset for the last line of vertices + + base = segments * points.length * 3; + + for ( i = 0, j = 0; i < points.length; i ++, j += 3 ) { + + // select the normal of the vertex in the first line + + n1.x = normals[ j + 0 ]; + n1.y = normals[ j + 1 ]; + n1.z = normals[ j + 2 ]; + + // select the normal of the vertex in the last line + + n2.x = normals[ base + j + 0 ]; + n2.y = normals[ base + j + 1 ]; + n2.z = normals[ base + j + 2 ]; + + // average normals + + n.addVectors( n1, n2 ).normalize(); + + // assign the new values to both normals + + normals[ j + 0 ] = normals[ base + j + 0 ] = n.x; + normals[ j + 1 ] = normals[ base + j + 1 ] = n.y; + normals[ j + 2 ] = normals[ base + j + 2 ] = n.z; + + } + + } + + } + + LatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + LatheBufferGeometry.prototype.constructor = LatheBufferGeometry; + + /** + * @author jonobr1 / http://jonobr1.com + * @author Mugen87 / https://github.com/Mugen87 + */ + + // ShapeGeometry + + function ShapeGeometry( shapes, curveSegments ) { + + Geometry.call( this ); + + this.type = 'ShapeGeometry'; + + if ( typeof curveSegments === 'object' ) { + + console.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' ); + + curveSegments = curveSegments.curveSegments; + + } + + this.parameters = { + shapes: shapes, + curveSegments: curveSegments + }; + + this.fromBufferGeometry( new ShapeBufferGeometry( shapes, curveSegments ) ); + this.mergeVertices(); + + } + + ShapeGeometry.prototype = Object.create( Geometry.prototype ); + ShapeGeometry.prototype.constructor = ShapeGeometry; + + ShapeGeometry.prototype.toJSON = function () { + + var data = Geometry.prototype.toJSON.call( this ); + + var shapes = this.parameters.shapes; + + return toJSON( shapes, data ); + + }; + + // ShapeBufferGeometry + + function ShapeBufferGeometry( shapes, curveSegments ) { + + BufferGeometry.call( this ); + + this.type = 'ShapeBufferGeometry'; + + this.parameters = { + shapes: shapes, + curveSegments: curveSegments + }; + + curveSegments = curveSegments || 12; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var groupStart = 0; + var groupCount = 0; + + // allow single and array values for "shapes" parameter + + if ( Array.isArray( shapes ) === false ) { + + addShape( shapes ); + + } else { + + for ( var i = 0; i < shapes.length; i ++ ) { + + addShape( shapes[ i ] ); + + this.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support + + groupStart += groupCount; + groupCount = 0; + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + + // helper functions + + function addShape( shape ) { + + var i, l, shapeHole; + + var indexOffset = vertices.length / 3; + var points = shape.extractPoints( curveSegments ); + + var shapeVertices = points.shape; + var shapeHoles = points.holes; + + // check direction of vertices + + if ( ShapeUtils.isClockWise( shapeVertices ) === false ) { + + shapeVertices = shapeVertices.reverse(); + + // also check if holes are in the opposite direction + + for ( i = 0, l = shapeHoles.length; i < l; i ++ ) { + + shapeHole = shapeHoles[ i ]; + + if ( ShapeUtils.isClockWise( shapeHole ) === true ) { + + shapeHoles[ i ] = shapeHole.reverse(); + + } + + } + + } + + var faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles ); + + // join vertices of inner and outer paths to a single array + + for ( i = 0, l = shapeHoles.length; i < l; i ++ ) { + + shapeHole = shapeHoles[ i ]; + shapeVertices = shapeVertices.concat( shapeHole ); + + } + + // vertices, normals, uvs + + for ( i = 0, l = shapeVertices.length; i < l; i ++ ) { + + var vertex = shapeVertices[ i ]; + + vertices.push( vertex.x, vertex.y, 0 ); + normals.push( 0, 0, 1 ); + uvs.push( vertex.x, vertex.y ); // world uvs + + } + + // incides + + for ( i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + var a = face[ 0 ] + indexOffset; + var b = face[ 1 ] + indexOffset; + var c = face[ 2 ] + indexOffset; + + indices.push( a, b, c ); + groupCount += 3; + + } + + } + + } + + ShapeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + ShapeBufferGeometry.prototype.constructor = ShapeBufferGeometry; + + ShapeBufferGeometry.prototype.toJSON = function () { + + var data = BufferGeometry.prototype.toJSON.call( this ); + + var shapes = this.parameters.shapes; + + return toJSON( shapes, data ); + + }; + + // + + function toJSON( shapes, data ) { + + data.shapes = []; + + if ( Array.isArray( shapes ) ) { + + for ( var i = 0, l = shapes.length; i < l; i ++ ) { + + var shape = shapes[ i ]; + + data.shapes.push( shape.uuid ); + + } + + } else { + + data.shapes.push( shapes.uuid ); + + } + + return data; + + } + + /** + * @author WestLangley / http://github.com/WestLangley + * @author Mugen87 / https://github.com/Mugen87 + */ + + function EdgesGeometry( geometry, thresholdAngle ) { + + BufferGeometry.call( this ); + + this.type = 'EdgesGeometry'; + + this.parameters = { + thresholdAngle: thresholdAngle + }; + + thresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1; + + // buffer + + var vertices = []; + + // helper variables + + var thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle ); + var edge = [ 0, 0 ], edges = {}, edge1, edge2; + var key, keys = [ 'a', 'b', 'c' ]; + + // prepare source geometry + + var geometry2; + + if ( geometry.isBufferGeometry ) { + + geometry2 = new Geometry(); + geometry2.fromBufferGeometry( geometry ); + + } else { + + geometry2 = geometry.clone(); + + } + + geometry2.mergeVertices(); + geometry2.computeFaceNormals(); + + var sourceVertices = geometry2.vertices; + var faces = geometry2.faces; + + // now create a data structure where each entry represents an edge with its adjoining faces + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0; j < 3; j ++ ) { + + edge1 = face[ keys[ j ] ]; + edge2 = face[ keys[ ( 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; + + } + + } + + } + + // generate vertices + + for ( key in edges ) { + + var 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 || faces[ e.face1 ].normal.dot( faces[ e.face2 ].normal ) <= thresholdDot ) { + + var vertex = sourceVertices[ e.index1 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + vertex = sourceVertices[ e.index2 ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + // build geometry + + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + + } + + EdgesGeometry.prototype = Object.create( BufferGeometry.prototype ); + EdgesGeometry.prototype.constructor = EdgesGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // CylinderGeometry + + function CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'CylinderGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + CylinderGeometry.prototype = Object.create( Geometry.prototype ); + CylinderGeometry.prototype.constructor = CylinderGeometry; + + // CylinderBufferGeometry + + function CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'CylinderBufferGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + var scope = this; + + radiusTop = radiusTop !== undefined ? radiusTop : 1; + radiusBottom = radiusBottom !== undefined ? radiusBottom : 1; + height = height || 1; + + radialSegments = Math.floor( radialSegments ) || 8; + heightSegments = Math.floor( heightSegments ) || 1; + + openEnded = openEnded !== undefined ? openEnded : false; + thetaStart = thetaStart !== undefined ? thetaStart : 0.0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var index = 0; + var indexArray = []; + var halfHeight = height / 2; + var groupStart = 0; + + // generate geometry + + generateTorso(); + + if ( openEnded === false ) { + + if ( radiusTop > 0 ) generateCap( true ); + if ( radiusBottom > 0 ) generateCap( false ); + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + function generateTorso() { + + var x, y; + var normal = new Vector3(); + var vertex = new Vector3(); + + var groupCount = 0; + + // this will be used to calculate the normal + var slope = ( radiusBottom - radiusTop ) / height; + + // generate vertices, normals and uvs + + for ( y = 0; y <= heightSegments; y ++ ) { + + var indexRow = []; + + var v = y / heightSegments; + + // calculate the radius of the current row + + var radius = v * ( radiusBottom - radiusTop ) + radiusTop; + + for ( x = 0; x <= radialSegments; x ++ ) { + + var u = x / radialSegments; + + var theta = u * thetaLength + thetaStart; + + var sinTheta = Math.sin( theta ); + var 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 + + var a = indexArray[ y ][ x ]; + var b = indexArray[ y + 1 ][ x ]; + var c = indexArray[ y + 1 ][ x + 1 ]; + var d = indexArray[ y ][ x + 1 ]; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + // update group counter + + groupCount += 6; + + } + + } + + // 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 ) { + + var x, centerIndexStart, centerIndexEnd; + + var uv = new Vector2(); + var vertex = new Vector3(); + + var groupCount = 0; + + var radius = ( top === true ) ? radiusTop : radiusBottom; + var sign = ( top === true ) ? 1 : - 1; + + // save the index of the first center vertex + centerIndexStart = index; + + // 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 + + centerIndexEnd = index; + + // now we generate the surrounding vertices, normals and uvs + + for ( x = 0; x <= radialSegments; x ++ ) { + + var u = x / radialSegments; + var theta = u * thetaLength + thetaStart; + + var cosTheta = Math.cos( theta ); + var 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 ++ ) { + + var c = centerIndexStart + x; + var 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; + + } + + } + + CylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + CylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry; + + /** + * @author abelnation / http://github.com/abelnation + */ + + // ConeGeometry + + function ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + CylinderGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); + + this.type = 'ConeGeometry'; + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + } + + ConeGeometry.prototype = Object.create( CylinderGeometry.prototype ); + ConeGeometry.prototype.constructor = ConeGeometry; + + // ConeBufferGeometry + + function ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + CylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); + + this.type = 'ConeBufferGeometry'; + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + } + + ConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype ); + ConeBufferGeometry.prototype.constructor = ConeBufferGeometry; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + * @author Mugen87 / https://github.com/Mugen87 + * @author hughes + */ + + // CircleGeometry + + function CircleGeometry( radius, segments, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'CircleGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + CircleGeometry.prototype = Object.create( Geometry.prototype ); + CircleGeometry.prototype.constructor = CircleGeometry; + + // CircleBufferGeometry + + function CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'CircleBufferGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radius = radius || 1; + segments = segments !== undefined ? Math.max( 3, segments ) : 8; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + // buffers + + var indices = []; + var vertices = []; + var normals = []; + var uvs = []; + + // helper variables + + var i, s; + var vertex = new Vector3(); + var uv = new Vector2(); + + // center point + + vertices.push( 0, 0, 0 ); + normals.push( 0, 0, 1 ); + uvs.push( 0.5, 0.5 ); + + for ( s = 0, i = 3; s <= segments; s ++, i += 3 ) { + + var 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 ( i = 1; i <= segments; i ++ ) { + + indices.push( i, i + 1, 0 ); + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + CircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + CircleBufferGeometry.prototype.constructor = CircleBufferGeometry; + + + + var Geometries = Object.freeze({ + WireframeGeometry: WireframeGeometry, + ParametricGeometry: ParametricGeometry, + ParametricBufferGeometry: ParametricBufferGeometry, + TetrahedronGeometry: TetrahedronGeometry, + TetrahedronBufferGeometry: TetrahedronBufferGeometry, + OctahedronGeometry: OctahedronGeometry, + OctahedronBufferGeometry: OctahedronBufferGeometry, + IcosahedronGeometry: IcosahedronGeometry, + IcosahedronBufferGeometry: IcosahedronBufferGeometry, + DodecahedronGeometry: DodecahedronGeometry, + DodecahedronBufferGeometry: DodecahedronBufferGeometry, + PolyhedronGeometry: PolyhedronGeometry, + PolyhedronBufferGeometry: PolyhedronBufferGeometry, + TubeGeometry: TubeGeometry, + TubeBufferGeometry: TubeBufferGeometry, + TorusKnotGeometry: TorusKnotGeometry, + TorusKnotBufferGeometry: TorusKnotBufferGeometry, + TorusGeometry: TorusGeometry, + TorusBufferGeometry: TorusBufferGeometry, + TextGeometry: TextGeometry, + TextBufferGeometry: TextBufferGeometry, + SphereGeometry: SphereGeometry, + SphereBufferGeometry: SphereBufferGeometry, + RingGeometry: RingGeometry, + RingBufferGeometry: RingBufferGeometry, + PlaneGeometry: PlaneGeometry, + PlaneBufferGeometry: PlaneBufferGeometry, + LatheGeometry: LatheGeometry, + LatheBufferGeometry: LatheBufferGeometry, + ShapeGeometry: ShapeGeometry, + ShapeBufferGeometry: ShapeBufferGeometry, + ExtrudeGeometry: ExtrudeGeometry, + ExtrudeBufferGeometry: ExtrudeBufferGeometry, + EdgesGeometry: EdgesGeometry, + ConeGeometry: ConeGeometry, + ConeBufferGeometry: ConeBufferGeometry, + CylinderGeometry: CylinderGeometry, + CylinderBufferGeometry: CylinderBufferGeometry, + CircleGeometry: CircleGeometry, + CircleBufferGeometry: CircleBufferGeometry, + BoxGeometry: BoxGeometry, + BoxBufferGeometry: BoxBufferGeometry + }); + + /** + * @author mrdoob / http://mrdoob.com/ + * + * parameters = { + * color: + * } + */ + + function ShadowMaterial( parameters ) { + + Material.call( this ); + + this.type = 'ShadowMaterial'; + + this.color = new Color( 0x000000 ); + this.transparent = true; + + this.setValues( parameters ); + + } + + ShadowMaterial.prototype = Object.create( Material.prototype ); + ShadowMaterial.prototype.constructor = ShadowMaterial; + + ShadowMaterial.prototype.isShadowMaterial = true; + + ShadowMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function RawShaderMaterial( parameters ) { + + ShaderMaterial.call( this, parameters ); + + this.type = 'RawShaderMaterial'; + + } + + RawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype ); + RawShaderMaterial.prototype.constructor = RawShaderMaterial; + + RawShaderMaterial.prototype.isRawShaderMaterial = true; + + /** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * color: , + * roughness: , + * metalness: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * roughnessMap: new THREE.Texture( ), + * + * metalnessMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * envMapIntensity: + * + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshStandardMaterial( parameters ) { + + Material.call( this ); + + this.defines = { 'STANDARD': '' }; + + this.type = 'MeshStandardMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.roughness = 0.5; + this.metalness = 0.5; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.roughnessMap = null; + + this.metalnessMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.envMapIntensity = 1.0; + + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshStandardMaterial.prototype = Object.create( Material.prototype ); + MeshStandardMaterial.prototype.constructor = MeshStandardMaterial; + + MeshStandardMaterial.prototype.isMeshStandardMaterial = true; + + MeshStandardMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.defines = { 'STANDARD': '' }; + + this.color.copy( source.color ); + this.roughness = source.roughness; + this.metalness = source.metalness; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.roughnessMap = source.roughnessMap; + + this.metalnessMap = source.metalnessMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.envMapIntensity = source.envMapIntensity; + + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * reflectivity: + * } + */ + + function MeshPhysicalMaterial( parameters ) { + + MeshStandardMaterial.call( this ); + + this.defines = { 'PHYSICAL': '' }; + + this.type = 'MeshPhysicalMaterial'; + + this.reflectivity = 0.5; // maps to F0 = 0.04 + + this.clearCoat = 0.0; + this.clearCoatRoughness = 0.0; + + this.setValues( parameters ); + + } + + MeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype ); + MeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial; + + MeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true; + + MeshPhysicalMaterial.prototype.copy = function ( source ) { + + MeshStandardMaterial.prototype.copy.call( this, source ); + + this.defines = { 'PHYSICAL': '' }; + + this.reflectivity = source.reflectivity; + + this.clearCoat = source.clearCoat; + this.clearCoatRoughness = source.clearCoatRoughness; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * specular: , + * shininess: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshPhongMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshPhongMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.specular = new Color( 0x111111 ); + this.shininess = 30; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshPhongMaterial.prototype = Object.create( Material.prototype ); + MeshPhongMaterial.prototype.constructor = MeshPhongMaterial; + + MeshPhongMaterial.prototype.isMeshPhongMaterial = true; + + MeshPhongMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.specular.copy( source.specular ); + this.shininess = source.shininess; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author takahirox / http://github.com/takahirox + * + * parameters = { + * gradientMap: new THREE.Texture( ) + * } + */ + + function MeshToonMaterial( parameters ) { + + MeshPhongMaterial.call( this ); + + this.defines = { 'TOON': '' }; + + this.type = 'MeshToonMaterial'; + + this.gradientMap = null; + + this.setValues( parameters ); + + } + + MeshToonMaterial.prototype = Object.create( MeshPhongMaterial.prototype ); + MeshToonMaterial.prototype.constructor = MeshToonMaterial; + + MeshToonMaterial.prototype.isMeshToonMaterial = true; + + MeshToonMaterial.prototype.copy = function ( source ) { + + MeshPhongMaterial.prototype.copy.call( this, source ); + + this.gradientMap = source.gradientMap; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * opacity: , + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * wireframe: , + * wireframeLinewidth: + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshNormalMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshNormalMaterial'; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; + this.lights = false; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshNormalMaterial.prototype = Object.create( Material.prototype ); + MeshNormalMaterial.prototype.constructor = MeshNormalMaterial; + + MeshNormalMaterial.prototype.isMeshNormalMaterial = true; + + MeshNormalMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshLambertMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshLambertMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshLambertMaterial.prototype = Object.create( Material.prototype ); + MeshLambertMaterial.prototype.constructor = MeshLambertMaterial; + + MeshLambertMaterial.prototype.isMeshLambertMaterial = true; + + MeshLambertMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * linewidth: , + * + * scale: , + * dashSize: , + * gapSize: + * } + */ + + function LineDashedMaterial( parameters ) { + + LineBasicMaterial.call( this ); + + this.type = 'LineDashedMaterial'; + + this.scale = 1; + this.dashSize = 3; + this.gapSize = 1; + + this.setValues( parameters ); + + } + + LineDashedMaterial.prototype = Object.create( LineBasicMaterial.prototype ); + LineDashedMaterial.prototype.constructor = LineDashedMaterial; + + LineDashedMaterial.prototype.isLineDashedMaterial = true; + + LineDashedMaterial.prototype.copy = function ( source ) { + + LineBasicMaterial.prototype.copy.call( this, source ); + + this.scale = source.scale; + this.dashSize = source.dashSize; + this.gapSize = source.gapSize; + + return this; + + }; + + + + var Materials = Object.freeze({ + ShadowMaterial: ShadowMaterial, + SpriteMaterial: SpriteMaterial, + RawShaderMaterial: RawShaderMaterial, + ShaderMaterial: ShaderMaterial, + PointsMaterial: PointsMaterial, + MeshPhysicalMaterial: MeshPhysicalMaterial, + MeshStandardMaterial: MeshStandardMaterial, + MeshPhongMaterial: MeshPhongMaterial, + MeshToonMaterial: MeshToonMaterial, + MeshNormalMaterial: MeshNormalMaterial, + MeshLambertMaterial: MeshLambertMaterial, + MeshDepthMaterial: MeshDepthMaterial, + MeshDistanceMaterial: MeshDistanceMaterial, + MeshBasicMaterial: MeshBasicMaterial, + LineDashedMaterial: LineDashedMaterial, + LineBasicMaterial: LineBasicMaterial, + Material: Material + }); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var Cache = { + + enabled: false, + + files: {}, + + add: function ( key, file ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Adding key:', key ); + + this.files[ key ] = file; + + }, + + get: function ( key ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Checking key:', key ); + + return this.files[ key ]; + + }, + + remove: function ( key ) { + + delete this.files[ key ]; + + }, + + clear: function () { + + this.files = {}; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LoadingManager( onLoad, onProgress, onError ) { + + var scope = this; + + var isLoading = false; + var itemsLoaded = 0; + var itemsTotal = 0; + var urlModifier = undefined; + + this.onStart = undefined; + this.onLoad = onLoad; + this.onProgress = onProgress; + this.onError = onError; + + this.itemStart = function ( url ) { + + itemsTotal ++; + + if ( isLoading === false ) { + + if ( scope.onStart !== undefined ) { + + scope.onStart( url, itemsLoaded, itemsTotal ); + + } + + } + + isLoading = true; + + }; + + this.itemEnd = function ( url ) { + + itemsLoaded ++; + + if ( scope.onProgress !== undefined ) { + + scope.onProgress( url, itemsLoaded, itemsTotal ); + + } + + if ( itemsLoaded === itemsTotal ) { + + isLoading = false; + + if ( scope.onLoad !== undefined ) { + + scope.onLoad(); + + } + + } + + }; + + this.itemError = function ( url ) { + + if ( scope.onError !== undefined ) { + + scope.onError( url ); + + } + + }; + + this.resolveURL = function ( url ) { + + if ( urlModifier ) { + + return urlModifier( url ); + + } + + return url; + + }; + + this.setURLModifier = function ( transform ) { + + urlModifier = transform; + return this; + + }; + + } + + var DefaultLoadingManager = new LoadingManager(); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var loading = {}; + + function FileLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( FileLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + url = this.manager.resolveURL( url ); + + var scope = this; + + var cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + // Check if request is duplicate + + if ( loading[ url ] !== undefined ) { + + loading[ url ].push( { + + onLoad: onLoad, + onProgress: onProgress, + onError: onError + + } ); + + return; + + } + + // Check for data: URI + var dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/; + var dataUriRegexResult = url.match( dataUriRegex ); + + // Safari can not handle Data URIs through XMLHttpRequest so process manually + if ( dataUriRegexResult ) { + + var mimeType = dataUriRegexResult[ 1 ]; + var isBase64 = !! dataUriRegexResult[ 2 ]; + var data = dataUriRegexResult[ 3 ]; + + data = window.decodeURIComponent( data ); + + if ( isBase64 ) data = window.atob( data ); + + try { + + var response; + var responseType = ( this.responseType || '' ).toLowerCase(); + + switch ( responseType ) { + + case 'arraybuffer': + case 'blob': + + var view = new Uint8Array( data.length ); + + for ( var i = 0; i < data.length; i ++ ) { + + view[ i ] = data.charCodeAt( i ); + + } + + if ( responseType === 'blob' ) { + + response = new Blob( [ view.buffer ], { type: mimeType } ); + + } else { + + response = view.buffer; + + } + + break; + + case 'document': + + var parser = new DOMParser(); + response = parser.parseFromString( data, mimeType ); + + break; + + case 'json': + + response = JSON.parse( data ); + + break; + + default: // 'text' or other + + response = data; + + break; + + } + + // Wait for next browser tick like standard XMLHttpRequest event dispatching does + window.setTimeout( function () { + + if ( onLoad ) onLoad( response ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + } catch ( error ) { + + // Wait for next browser tick like standard XMLHttpRequest event dispatching does + window.setTimeout( function () { + + if ( onError ) onError( error ); + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + }, 0 ); + + } + + } else { + + // Initialise array for duplicate requests + + loading[ url ] = []; + + loading[ url ].push( { + + onLoad: onLoad, + onProgress: onProgress, + onError: onError + + } ); + + var request = new XMLHttpRequest(); + + request.open( 'GET', url, true ); + + request.addEventListener( 'load', function ( event ) { + + var response = this.response; + + Cache.add( url, response ); + + var callbacks = loading[ url ]; + + delete loading[ url ]; + + if ( this.status === 200 ) { + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onLoad ) callback.onLoad( response ); + + } + + scope.manager.itemEnd( url ); + + } else if ( this.status === 0 ) { + + // Some browsers return HTTP Status 0 when using non-http protocol + // e.g. 'file://' or 'data://'. Handle as success. + + console.warn( 'THREE.FileLoader: HTTP Status 0 received.' ); + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onLoad ) callback.onLoad( response ); + + } + + scope.manager.itemEnd( url ); + + } else { + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onError ) callback.onError( event ); + + } + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + } + + }, false ); + + request.addEventListener( 'progress', function ( event ) { + + var callbacks = loading[ url ]; + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onProgress ) callback.onProgress( event ); + + } + + }, false ); + + request.addEventListener( 'error', function ( event ) { + + var callbacks = loading[ url ]; + + delete loading[ url ]; + + for ( var i = 0, il = callbacks.length; i < il; i ++ ) { + + var callback = callbacks[ i ]; + if ( callback.onError ) callback.onError( event ); + + } + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + }, false ); + + if ( this.responseType !== undefined ) request.responseType = this.responseType; + if ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials; + + if ( request.overrideMimeType ) request.overrideMimeType( this.mimeType !== undefined ? this.mimeType : 'text/plain' ); + + for ( var header in this.requestHeader ) { + + request.setRequestHeader( header, this.requestHeader[ header ] ); + + } + + request.send( null ); + + } + + scope.manager.itemStart( url ); + + return request; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + }, + + setResponseType: function ( value ) { + + this.responseType = value; + return this; + + }, + + setWithCredentials: function ( value ) { + + this.withCredentials = value; + return this; + + }, + + setMimeType: function ( value ) { + + this.mimeType = value; + return this; + + }, + + setRequestHeader: function ( value ) { + + this.requestHeader = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * + * Abstract Base class to block based textures loader (dds, pvr, ...) + */ + + function CompressedTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + // override in sub classes + this._parser = null; + + } + + Object.assign( CompressedTextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var images = []; + + var texture = new CompressedTexture(); + texture.image = images; + + var loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.setResponseType( 'arraybuffer' ); + + function loadTexture( i ) { + + loader.load( url[ i ], function ( buffer ) { + + var texDatas = scope._parser( buffer, true ); + + images[ i ] = { + width: texDatas.width, + height: texDatas.height, + format: texDatas.format, + mipmaps: texDatas.mipmaps + }; + + loaded += 1; + + if ( loaded === 6 ) { + + if ( texDatas.mipmapCount === 1 ) + texture.minFilter = LinearFilter; + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, onProgress, onError ); + + } + + if ( Array.isArray( url ) ) { + + var loaded = 0; + + for ( var i = 0, il = url.length; i < il; ++ i ) { + + loadTexture( i ); + + } + + } else { + + // compressed cubemap texture stored in a single DDS file + + loader.load( url, function ( buffer ) { + + var texDatas = scope._parser( buffer, true ); + + if ( texDatas.isCubemap ) { + + var faces = texDatas.mipmaps.length / texDatas.mipmapCount; + + for ( var f = 0; f < faces; f ++ ) { + + images[ f ] = { mipmaps: [] }; + + for ( var i = 0; i < texDatas.mipmapCount; i ++ ) { + + images[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] ); + images[ f ].format = texDatas.format; + images[ f ].width = texDatas.width; + images[ f ].height = texDatas.height; + + } + + } + + } else { + + texture.image.width = texDatas.width; + texture.image.height = texDatas.height; + texture.mipmaps = texDatas.mipmaps; + + } + + if ( texDatas.mipmapCount === 1 ) { + + texture.minFilter = LinearFilter; + + } + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + }, onProgress, onError ); + + } + + return texture; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author Nikos M. / https://github.com/foo123/ + * + * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...) + */ + + function DataTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + // override in sub classes + this._parser = null; + + } + + Object.assign( DataTextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var texture = new DataTexture(); + + var loader = new FileLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + + loader.load( url, function ( buffer ) { + + var texData = scope._parser( buffer ); + + if ( ! texData ) return; + + if ( undefined !== texData.image ) { + + texture.image = texData.image; + + } else if ( undefined !== texData.data ) { + + texture.image.width = texData.width; + texture.image.height = texData.height; + texture.image.data = texData.data; + + } + + texture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping; + texture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping; + + texture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter; + texture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter; + + texture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1; + + if ( undefined !== texData.format ) { + + texture.format = texData.format; + + } + if ( undefined !== texData.type ) { + + texture.type = texData.type; + + } + + if ( undefined !== texData.mipmaps ) { + + texture.mipmaps = texData.mipmaps; + + } + + if ( 1 === texData.mipmapCount ) { + + texture.minFilter = LinearFilter; + + } + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture, texData ); + + }, onProgress, onError ); + + + return texture; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ImageLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( ImageLoader.prototype, { + + crossOrigin: 'Anonymous', + + load: function ( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + url = this.manager.resolveURL( url ); + + var scope = this; + + var cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + var image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' ); + + image.addEventListener( 'load', function () { + + Cache.add( url, this ); + + if ( onLoad ) onLoad( this ); + + scope.manager.itemEnd( url ); + + }, false ); + + /* + image.addEventListener( 'progress', function ( event ) { + + if ( onProgress ) onProgress( event ); + + }, false ); + */ + + image.addEventListener( 'error', function ( event ) { + + if ( onError ) onError( event ); + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + }, false ); + + if ( url.substr( 0, 5 ) !== 'data:' ) { + + if ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin; + + } + + scope.manager.itemStart( url ); + + image.src = url; + + return image; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CubeTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( CubeTextureLoader.prototype, { + + crossOrigin: 'Anonymous', + + load: function ( urls, onLoad, onProgress, onError ) { + + var texture = new CubeTexture(); + + var loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setPath( this.path ); + + var loaded = 0; + + function loadTexture( i ) { + + loader.load( urls[ i ], function ( image ) { + + texture.images[ i ] = image; + + loaded ++; + + if ( loaded === 6 ) { + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, undefined, onError ); + + } + + for ( var i = 0; i < urls.length; ++ i ) { + + loadTexture( i ); + + } + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function TextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( TextureLoader.prototype, { + + crossOrigin: 'Anonymous', + + load: function ( url, onLoad, onProgress, onError ) { + + var texture = new Texture(); + + var loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setPath( this.path ); + + loader.load( url, function ( image ) { + + texture.image = image; + + // JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB. + var isJPEG = url.search( /\.(jpg|jpeg)$/ ) > 0 || url.search( /^data\:image\/jpeg/ ) === 0; + + texture.format = isJPEG ? RGBFormat : RGBAFormat; + texture.needsUpdate = true; + + if ( onLoad !== undefined ) { + + onLoad( texture ); + + } + + }, onProgress, onError ); + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Extensible curve object + * + * Some common of curve methods: + * .getPoint( t, optionalTarget ), .getTangent( t ) + * .getPointAt( u, optionalTarget ), .getTangentAt( u ) + * .getPoints(), .getSpacedPoints() + * .getLength() + * .updateArcLengths() + * + * This following curves inherit from THREE.Curve: + * + * -- 2D curves -- + * THREE.ArcCurve + * THREE.CubicBezierCurve + * THREE.EllipseCurve + * THREE.LineCurve + * THREE.QuadraticBezierCurve + * THREE.SplineCurve + * + * -- 3D curves -- + * THREE.CatmullRomCurve3 + * THREE.CubicBezierCurve3 + * THREE.LineCurve3 + * THREE.QuadraticBezierCurve3 + * + * A series of curves can be represented as a THREE.CurvePath. + * + **/ + + /************************************************************** + * Abstract Curve base class + **************************************************************/ + + function Curve() { + + this.type = 'Curve'; + + this.arcLengthDivisions = 200; + + } + + Object.assign( Curve.prototype, { + + // Virtual base class method to overwrite and implement in subclasses + // - t [0 .. 1] + + getPoint: function ( /* t, optionalTarget */ ) { + + console.warn( 'THREE.Curve: .getPoint() not implemented.' ); + return null; + + }, + + // Get point at relative position in curve according to arc length + // - u [0 .. 1] + + getPointAt: function ( u, optionalTarget ) { + + var t = this.getUtoTmapping( u ); + return this.getPoint( t, optionalTarget ); + + }, + + // Get sequence of points using getPoint( t ) + + getPoints: function ( divisions ) { + + if ( divisions === undefined ) divisions = 5; + + var points = []; + + for ( var d = 0; d <= divisions; d ++ ) { + + points.push( this.getPoint( d / divisions ) ); + + } + + return points; + + }, + + // Get sequence of points using getPointAt( u ) + + getSpacedPoints: function ( divisions ) { + + if ( divisions === undefined ) divisions = 5; + + var points = []; + + for ( var d = 0; d <= divisions; d ++ ) { + + points.push( this.getPointAt( d / divisions ) ); + + } + + return points; + + }, + + // Get total curve arc length + + getLength: function () { + + var lengths = this.getLengths(); + return lengths[ lengths.length - 1 ]; + + }, + + // Get list of cumulative segment lengths + + getLengths: function ( divisions ) { + + if ( divisions === undefined ) divisions = this.arcLengthDivisions; + + if ( this.cacheArcLengths && + ( this.cacheArcLengths.length === divisions + 1 ) && + ! this.needsUpdate ) { + + return this.cacheArcLengths; + + } + + this.needsUpdate = false; + + var cache = []; + var current, last = this.getPoint( 0 ); + var p, sum = 0; + + cache.push( 0 ); + + for ( p = 1; p <= divisions; p ++ ) { + + current = this.getPoint( p / divisions ); + sum += current.distanceTo( last ); + cache.push( sum ); + last = current; + + } + + this.cacheArcLengths = cache; + + return cache; // { sums: cache, sum: sum }; Sum is in the last element. + + }, + + updateArcLengths: function () { + + this.needsUpdate = true; + this.getLengths(); + + }, + + // Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant + + getUtoTmapping: function ( u, distance ) { + + var arcLengths = this.getLengths(); + + var i = 0, il = arcLengths.length; + + var 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 + + var 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 + + var lengthBefore = arcLengths[ i ]; + var lengthAfter = arcLengths[ i + 1 ]; + + var segmentLength = lengthAfter - lengthBefore; + + // determine where we are between the 'before' and 'after' points + + var segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength; + + // add that fractional amount to t + + var t = ( i + segmentFraction ) / ( il - 1 ); + + return t; + + }, + + // Returns a unit vector tangent at t + // In case any sub curve does not implement its tangent derivation, + // 2 points a small delta apart will be used to find its gradient + // which seems to give a reasonable approximation + + getTangent: function ( t ) { + + var delta = 0.0001; + var t1 = t - delta; + var t2 = t + delta; + + // Capping in case of danger + + if ( t1 < 0 ) t1 = 0; + if ( t2 > 1 ) t2 = 1; + + var pt1 = this.getPoint( t1 ); + var pt2 = this.getPoint( t2 ); + + var vec = pt2.clone().sub( pt1 ); + return vec.normalize(); + + }, + + getTangentAt: function ( u ) { + + var t = this.getUtoTmapping( u ); + return this.getTangent( t ); + + }, + + computeFrenetFrames: function ( segments, closed ) { + + // see http://www.cs.indiana.edu/pub/techreports/TR425.pdf + + var normal = new Vector3(); + + var tangents = []; + var normals = []; + var binormals = []; + + var vec = new Vector3(); + var mat = new Matrix4(); + + var i, u, theta; + + // compute the tangent vectors for each segment on the curve + + for ( i = 0; i <= segments; i ++ ) { + + u = i / segments; + + tangents[ i ] = this.getTangentAt( u ); + tangents[ i ].normalize(); + + } + + // select an initial normal vector perpendicular to the first tangent vector, + // and in the direction of the minimum tangent xyz component + + normals[ 0 ] = new Vector3(); + binormals[ 0 ] = new Vector3(); + var min = Number.MAX_VALUE; + var tx = Math.abs( tangents[ 0 ].x ); + var ty = Math.abs( tangents[ 0 ].y ); + var tz = Math.abs( tangents[ 0 ].z ); + + if ( tx <= min ) { + + min = tx; + normal.set( 1, 0, 0 ); + + } + + if ( ty <= min ) { + + min = ty; + normal.set( 0, 1, 0 ); + + } + + if ( tz <= min ) { + + normal.set( 0, 0, 1 ); + + } + + vec.crossVectors( tangents[ 0 ], normal ).normalize(); + + normals[ 0 ].crossVectors( tangents[ 0 ], vec ); + binormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ); + + + // compute the slowly-varying normal and binormal vectors for each segment on the curve + + for ( i = 1; i <= segments; i ++ ) { + + normals[ i ] = normals[ i - 1 ].clone(); + + binormals[ i ] = binormals[ i - 1 ].clone(); + + vec.crossVectors( tangents[ i - 1 ], tangents[ i ] ); + + if ( vec.length() > Number.EPSILON ) { + + vec.normalize(); + + theta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors + + normals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) ); + + } + + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + // if the curve is closed, postprocess the vectors so the first and last normal vectors are the same + + if ( closed === true ) { + + theta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) ); + theta /= segments; + + if ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) { + + theta = - theta; + + } + + for ( i = 1; i <= segments; i ++ ) { + + // twist a little... + normals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) ); + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + } + + return { + tangents: tangents, + normals: normals, + binormals: binormals + }; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.arcLengthDivisions = source.arcLengthDivisions; + + return this; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.5, + type: 'Curve', + generator: 'Curve.toJSON' + } + }; + + data.arcLengthDivisions = this.arcLengthDivisions; + data.type = this.type; + + return data; + + }, + + fromJSON: function ( json ) { + + this.arcLengthDivisions = json.arcLengthDivisions; + + return this; + + } + + } ); + + function EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + Curve.call( this ); + + this.type = 'EllipseCurve'; + + this.aX = aX || 0; + this.aY = aY || 0; + + this.xRadius = xRadius || 1; + this.yRadius = yRadius || 1; + + this.aStartAngle = aStartAngle || 0; + this.aEndAngle = aEndAngle || 2 * Math.PI; + + this.aClockwise = aClockwise || false; + + this.aRotation = aRotation || 0; + + } + + EllipseCurve.prototype = Object.create( Curve.prototype ); + EllipseCurve.prototype.constructor = EllipseCurve; + + EllipseCurve.prototype.isEllipseCurve = true; + + EllipseCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + var twoPi = Math.PI * 2; + var deltaAngle = this.aEndAngle - this.aStartAngle; + var samePoints = Math.abs( deltaAngle ) < Number.EPSILON; + + // ensures that deltaAngle is 0 .. 2 PI + while ( deltaAngle < 0 ) deltaAngle += twoPi; + while ( deltaAngle > twoPi ) deltaAngle -= twoPi; + + if ( deltaAngle < Number.EPSILON ) { + + if ( samePoints ) { + + deltaAngle = 0; + + } else { + + deltaAngle = twoPi; + + } + + } + + if ( this.aClockwise === true && ! samePoints ) { + + if ( deltaAngle === twoPi ) { + + deltaAngle = - twoPi; + + } else { + + deltaAngle = deltaAngle - twoPi; + + } + + } + + var angle = this.aStartAngle + t * deltaAngle; + var x = this.aX + this.xRadius * Math.cos( angle ); + var y = this.aY + this.yRadius * Math.sin( angle ); + + if ( this.aRotation !== 0 ) { + + var cos = Math.cos( this.aRotation ); + var sin = Math.sin( this.aRotation ); + + var tx = x - this.aX; + var ty = y - this.aY; + + // Rotate the point about the center of the ellipse. + x = tx * cos - ty * sin + this.aX; + y = tx * sin + ty * cos + this.aY; + + } + + return point.set( x, y ); + + }; + + EllipseCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.aX = source.aX; + this.aY = source.aY; + + this.xRadius = source.xRadius; + this.yRadius = source.yRadius; + + this.aStartAngle = source.aStartAngle; + this.aEndAngle = source.aEndAngle; + + this.aClockwise = source.aClockwise; + + this.aRotation = source.aRotation; + + return this; + + }; + + + EllipseCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.aX = this.aX; + data.aY = this.aY; + + data.xRadius = this.xRadius; + data.yRadius = this.yRadius; + + data.aStartAngle = this.aStartAngle; + data.aEndAngle = this.aEndAngle; + + data.aClockwise = this.aClockwise; + + data.aRotation = this.aRotation; + + return data; + + }; + + EllipseCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.aX = json.aX; + this.aY = json.aY; + + this.xRadius = json.xRadius; + this.yRadius = json.yRadius; + + this.aStartAngle = json.aStartAngle; + this.aEndAngle = json.aEndAngle; + + this.aClockwise = json.aClockwise; + + this.aRotation = json.aRotation; + + return this; + + }; + + function ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + EllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + this.type = 'ArcCurve'; + + } + + ArcCurve.prototype = Object.create( EllipseCurve.prototype ); + ArcCurve.prototype.constructor = ArcCurve; + + ArcCurve.prototype.isArcCurve = true; + + /** + * @author zz85 https://github.com/zz85 + * + * Centripetal CatmullRom Curve - which is useful for avoiding + * cusps and self-intersections in non-uniform catmull rom curves. + * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf + * + * curve.type accepts centripetal(default), chordal and catmullrom + * curve.tension is used for catmullrom which defaults to 0.5 + */ + + + /* + Based on an optimized c++ solution in + - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/ + - http://ideone.com/NoEbVM + + This CubicPoly class could be used for reusing some variables and calculations, + but for three.js curve use, it could be possible inlined and flatten into a single function call + which can be placed in CurveUtils. + */ + + function CubicPoly() { + + var c0 = 0, c1 = 0, c2 = 0, c3 = 0; + + /* + * Compute coefficients for a cubic polynomial + * p(s) = c0 + c1*s + c2*s^2 + c3*s^3 + * such that + * p(0) = x0, p(1) = x1 + * and + * p'(0) = t0, p'(1) = t1. + */ + function init( x0, x1, t0, t1 ) { + + c0 = x0; + c1 = t0; + c2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1; + c3 = 2 * x0 - 2 * x1 + t0 + t1; + + } + + return { + + initCatmullRom: function ( x0, x1, x2, x3, tension ) { + + init( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) ); + + }, + + initNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) { + + // compute tangents when parameterized in [t1,t2] + var t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1; + var t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2; + + // rescale tangents for parametrization in [0,1] + t1 *= dt1; + t2 *= dt1; + + init( x1, x2, t1, t2 ); + + }, + + calc: function ( t ) { + + var t2 = t * t; + var t3 = t2 * t; + return c0 + c1 * t + c2 * t2 + c3 * t3; + + } + + }; + + } + + // + + var tmp = new Vector3(); + var px$1 = new CubicPoly(); + var py = new CubicPoly(); + var pz = new CubicPoly(); + + function CatmullRomCurve3( points, closed, curveType, tension ) { + + Curve.call( this ); + + this.type = 'CatmullRomCurve3'; + + this.points = points || []; + this.closed = closed || false; + this.curveType = curveType || 'centripetal'; + this.tension = tension || 0.5; + + } + + CatmullRomCurve3.prototype = Object.create( Curve.prototype ); + CatmullRomCurve3.prototype.constructor = CatmullRomCurve3; + + CatmullRomCurve3.prototype.isCatmullRomCurve3 = true; + + CatmullRomCurve3.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector3(); + + var points = this.points; + var l = points.length; + + var p = ( l - ( this.closed ? 0 : 1 ) ) * t; + var intPoint = Math.floor( p ); + var weight = p - intPoint; + + if ( this.closed ) { + + intPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l; + + } else if ( weight === 0 && intPoint === l - 1 ) { + + intPoint = l - 2; + weight = 1; + + } + + var p0, p1, p2, p3; // 4 points + + if ( this.closed || intPoint > 0 ) { + + p0 = points[ ( intPoint - 1 ) % l ]; + + } else { + + // extrapolate first point + tmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] ); + p0 = tmp; + + } + + p1 = points[ intPoint % l ]; + p2 = points[ ( intPoint + 1 ) % l ]; + + if ( this.closed || intPoint + 2 < l ) { + + p3 = points[ ( intPoint + 2 ) % l ]; + + } else { + + // extrapolate last point + tmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] ); + p3 = tmp; + + } + + if ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) { + + // init Centripetal / Chordal Catmull-Rom + var pow = this.curveType === 'chordal' ? 0.5 : 0.25; + var dt0 = Math.pow( p0.distanceToSquared( p1 ), pow ); + var dt1 = Math.pow( p1.distanceToSquared( p2 ), pow ); + var dt2 = Math.pow( p2.distanceToSquared( p3 ), pow ); + + // safety check for repeated points + if ( dt1 < 1e-4 ) dt1 = 1.0; + if ( dt0 < 1e-4 ) dt0 = dt1; + if ( dt2 < 1e-4 ) dt2 = dt1; + + px$1.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 ); + py.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 ); + pz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 ); + + } else if ( this.curveType === 'catmullrom' ) { + + px$1.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension ); + py.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension ); + pz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension ); + + } + + point.set( + px$1.calc( weight ), + py.calc( weight ), + pz.calc( weight ) + ); + + return point; + + }; + + CatmullRomCurve3.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.points = []; + + for ( var i = 0, l = source.points.length; i < l; i ++ ) { + + var point = source.points[ i ]; + + this.points.push( point.clone() ); + + } + + this.closed = source.closed; + this.curveType = source.curveType; + this.tension = source.tension; + + return this; + + }; + + CatmullRomCurve3.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.points = []; + + for ( var i = 0, l = this.points.length; i < l; i ++ ) { + + var point = this.points[ i ]; + data.points.push( point.toArray() ); + + } + + data.closed = this.closed; + data.curveType = this.curveType; + data.tension = this.tension; + + return data; + + }; + + CatmullRomCurve3.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.points = []; + + for ( var i = 0, l = json.points.length; i < l; i ++ ) { + + var point = json.points[ i ]; + this.points.push( new Vector3().fromArray( point ) ); + + } + + this.closed = json.closed; + this.curveType = json.curveType; + this.tension = json.tension; + + return this; + + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + * Bezier Curves formulas obtained from + * http://en.wikipedia.org/wiki/Bézier_curve + */ + + function CatmullRom( t, p0, p1, p2, p3 ) { + + var v0 = ( p2 - p0 ) * 0.5; + var v1 = ( p3 - p1 ) * 0.5; + var t2 = t * t; + var t3 = t * t2; + return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1; + + } + + // + + function QuadraticBezierP0( t, p ) { + + var 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 QuadraticBezier( t, p0, p1, p2 ) { + + return QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) + + QuadraticBezierP2( t, p2 ); + + } + + // + + function CubicBezierP0( t, p ) { + + var k = 1 - t; + return k * k * k * p; + + } + + function CubicBezierP1( t, p ) { + + var 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; + + } + + function CubicBezier( t, p0, p1, p2, p3 ) { + + return CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) + + CubicBezierP3( t, p3 ); + + } + + function CubicBezierCurve( v0, v1, v2, v3 ) { + + Curve.call( this ); + + this.type = 'CubicBezierCurve'; + + this.v0 = v0 || new Vector2(); + this.v1 = v1 || new Vector2(); + this.v2 = v2 || new Vector2(); + this.v3 = v3 || new Vector2(); + + } + + CubicBezierCurve.prototype = Object.create( Curve.prototype ); + CubicBezierCurve.prototype.constructor = CubicBezierCurve; + + CubicBezierCurve.prototype.isCubicBezierCurve = true; + + CubicBezierCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + + point.set( + CubicBezier( t, v0.x, v1.x, v2.x, v3.x ), + CubicBezier( t, v0.y, v1.y, v2.y, v3.y ) + ); + + return point; + + }; + + CubicBezierCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + this.v3.copy( source.v3 ); + + return this; + + }; + + CubicBezierCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + data.v3 = this.v3.toArray(); + + return data; + + }; + + CubicBezierCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + this.v3.fromArray( json.v3 ); + + return this; + + }; + + function CubicBezierCurve3( v0, v1, v2, v3 ) { + + Curve.call( this ); + + this.type = 'CubicBezierCurve3'; + + this.v0 = v0 || new Vector3(); + this.v1 = v1 || new Vector3(); + this.v2 = v2 || new Vector3(); + this.v3 = v3 || new Vector3(); + + } + + CubicBezierCurve3.prototype = Object.create( Curve.prototype ); + CubicBezierCurve3.prototype.constructor = CubicBezierCurve3; + + CubicBezierCurve3.prototype.isCubicBezierCurve3 = true; + + CubicBezierCurve3.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector3(); + + var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + + point.set( + CubicBezier( t, v0.x, v1.x, v2.x, v3.x ), + CubicBezier( t, v0.y, v1.y, v2.y, v3.y ), + CubicBezier( t, v0.z, v1.z, v2.z, v3.z ) + ); + + return point; + + }; + + CubicBezierCurve3.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + this.v3.copy( source.v3 ); + + return this; + + }; + + CubicBezierCurve3.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + data.v3 = this.v3.toArray(); + + return data; + + }; + + CubicBezierCurve3.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + this.v3.fromArray( json.v3 ); + + return this; + + }; + + function LineCurve( v1, v2 ) { + + Curve.call( this ); + + this.type = 'LineCurve'; + + this.v1 = v1 || new Vector2(); + this.v2 = v2 || new Vector2(); + + } + + LineCurve.prototype = Object.create( Curve.prototype ); + LineCurve.prototype.constructor = LineCurve; + + LineCurve.prototype.isLineCurve = true; + + LineCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + 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 + + LineCurve.prototype.getPointAt = function ( u, optionalTarget ) { + + return this.getPoint( u, optionalTarget ); + + }; + + LineCurve.prototype.getTangent = function ( /* t */ ) { + + var tangent = this.v2.clone().sub( this.v1 ); + + return tangent.normalize(); + + }; + + LineCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + }; + + LineCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + }; + + LineCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + }; + + function LineCurve3( v1, v2 ) { + + Curve.call( this ); + + this.type = 'LineCurve3'; + + this.v1 = v1 || new Vector3(); + this.v2 = v2 || new Vector3(); + + } + + LineCurve3.prototype = Object.create( Curve.prototype ); + LineCurve3.prototype.constructor = LineCurve3; + + LineCurve3.prototype.isLineCurve3 = true; + + LineCurve3.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector3(); + + 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 + + LineCurve3.prototype.getPointAt = function ( u, optionalTarget ) { + + return this.getPoint( u, optionalTarget ); + + }; + + LineCurve3.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + }; + + LineCurve3.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + }; + + LineCurve3.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + }; + + function QuadraticBezierCurve( v0, v1, v2 ) { + + Curve.call( this ); + + this.type = 'QuadraticBezierCurve'; + + this.v0 = v0 || new Vector2(); + this.v1 = v1 || new Vector2(); + this.v2 = v2 || new Vector2(); + + } + + QuadraticBezierCurve.prototype = Object.create( Curve.prototype ); + QuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve; + + QuadraticBezierCurve.prototype.isQuadraticBezierCurve = true; + + QuadraticBezierCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + var v0 = this.v0, v1 = this.v1, v2 = this.v2; + + point.set( + QuadraticBezier( t, v0.x, v1.x, v2.x ), + QuadraticBezier( t, v0.y, v1.y, v2.y ) + ); + + return point; + + }; + + QuadraticBezierCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + }; + + QuadraticBezierCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + }; + + QuadraticBezierCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + }; + + function QuadraticBezierCurve3( v0, v1, v2 ) { + + Curve.call( this ); + + this.type = 'QuadraticBezierCurve3'; + + this.v0 = v0 || new Vector3(); + this.v1 = v1 || new Vector3(); + this.v2 = v2 || new Vector3(); + + } + + QuadraticBezierCurve3.prototype = Object.create( Curve.prototype ); + QuadraticBezierCurve3.prototype.constructor = QuadraticBezierCurve3; + + QuadraticBezierCurve3.prototype.isQuadraticBezierCurve3 = true; + + QuadraticBezierCurve3.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector3(); + + var v0 = this.v0, v1 = this.v1, v2 = this.v2; + + point.set( + QuadraticBezier( t, v0.x, v1.x, v2.x ), + QuadraticBezier( t, v0.y, v1.y, v2.y ), + QuadraticBezier( t, v0.z, v1.z, v2.z ) + ); + + return point; + + }; + + QuadraticBezierCurve3.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + }; + + QuadraticBezierCurve3.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + }; + + QuadraticBezierCurve3.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + }; + + function SplineCurve( points /* array of Vector2 */ ) { + + Curve.call( this ); + + this.type = 'SplineCurve'; + + this.points = points || []; + + } + + SplineCurve.prototype = Object.create( Curve.prototype ); + SplineCurve.prototype.constructor = SplineCurve; + + SplineCurve.prototype.isSplineCurve = true; + + SplineCurve.prototype.getPoint = function ( t, optionalTarget ) { + + var point = optionalTarget || new Vector2(); + + var points = this.points; + var p = ( points.length - 1 ) * t; + + var intPoint = Math.floor( p ); + var weight = p - intPoint; + + var p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ]; + var p1 = points[ intPoint ]; + var p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ]; + var p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ]; + + point.set( + CatmullRom( weight, p0.x, p1.x, p2.x, p3.x ), + CatmullRom( weight, p0.y, p1.y, p2.y, p3.y ) + ); + + return point; + + }; + + SplineCurve.prototype.copy = function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.points = []; + + for ( var i = 0, l = source.points.length; i < l; i ++ ) { + + var point = source.points[ i ]; + + this.points.push( point.clone() ); + + } + + return this; + + }; + + SplineCurve.prototype.toJSON = function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.points = []; + + for ( var i = 0, l = this.points.length; i < l; i ++ ) { + + var point = this.points[ i ]; + data.points.push( point.toArray() ); + + } + + return data; + + }; + + SplineCurve.prototype.fromJSON = function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.points = []; + + for ( var i = 0, l = json.points.length; i < l; i ++ ) { + + var point = json.points[ i ]; + this.points.push( new Vector2().fromArray( point ) ); + + } + + return this; + + }; + + + + var Curves = Object.freeze({ + ArcCurve: ArcCurve, + CatmullRomCurve3: CatmullRomCurve3, + CubicBezierCurve: CubicBezierCurve, + CubicBezierCurve3: CubicBezierCurve3, + EllipseCurve: EllipseCurve, + LineCurve: LineCurve, + LineCurve3: LineCurve3, + QuadraticBezierCurve: QuadraticBezierCurve, + QuadraticBezierCurve3: QuadraticBezierCurve3, + SplineCurve: SplineCurve + }); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + **/ + + /************************************************************** + * Curved Path - a curve path is simply a array of connected + * curves, but retains the api of a curve + **************************************************************/ + + function CurvePath() { + + Curve.call( this ); + + this.type = 'CurvePath'; + + this.curves = []; + this.autoClose = false; // Automatically closes the path + + } + + CurvePath.prototype = Object.assign( Object.create( Curve.prototype ), { + + constructor: CurvePath, + + add: function ( curve ) { + + this.curves.push( curve ); + + }, + + closePath: function () { + + // Add a line curve if start and end of lines are not connected + var startPoint = this.curves[ 0 ].getPoint( 0 ); + var endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 ); + + if ( ! startPoint.equals( endPoint ) ) { + + this.curves.push( new LineCurve( endPoint, startPoint ) ); + + } + + }, + + // To get accurate point with reference to + // entire path distance at time t, + // following has to be done: + + // 1. Length of each sub path have to be known + // 2. Locate and identify type of curve + // 3. Get t for the curve + // 4. Return curve.getPointAt(t') + + getPoint: function ( t ) { + + var d = t * this.getLength(); + var curveLengths = this.getCurveLengths(); + var i = 0; + + // To think about boundaries points. + + while ( i < curveLengths.length ) { + + if ( curveLengths[ i ] >= d ) { + + var diff = curveLengths[ i ] - d; + var curve = this.curves[ i ]; + + var segmentLength = curve.getLength(); + var u = segmentLength === 0 ? 0 : 1 - diff / segmentLength; + + return curve.getPointAt( u ); + + } + + i ++; + + } + + return null; + + // loop where sum != 0, sum > d , sum+1 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) { + + points.push( points[ 0 ] ); + + } + + return points; + + }, + + copy: function ( source ) { + + Curve.prototype.copy.call( this, source ); + + this.curves = []; + + for ( var i = 0, l = source.curves.length; i < l; i ++ ) { + + var curve = source.curves[ i ]; + + this.curves.push( curve.clone() ); + + } + + this.autoClose = source.autoClose; + + return this; + + }, + + toJSON: function () { + + var data = Curve.prototype.toJSON.call( this ); + + data.autoClose = this.autoClose; + data.curves = []; + + for ( var i = 0, l = this.curves.length; i < l; i ++ ) { + + var curve = this.curves[ i ]; + data.curves.push( curve.toJSON() ); + + } + + return data; + + }, + + fromJSON: function ( json ) { + + Curve.prototype.fromJSON.call( this, json ); + + this.autoClose = json.autoClose; + this.curves = []; + + for ( var i = 0, l = json.curves.length; i < l; i ++ ) { + + var curve = json.curves[ i ]; + this.curves.push( new Curves[ curve.type ]().fromJSON( curve ) ); + + } + + return this; + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Creates free form 2d path using series of points, lines or curves. + **/ + + function Path( points ) { + + CurvePath.call( this ); + + this.type = 'Path'; + + this.currentPoint = new Vector2(); + + if ( points ) { + + this.setFromPoints( points ); + + } + + } + + Path.prototype = Object.assign( Object.create( CurvePath.prototype ), { + + constructor: Path, + + setFromPoints: function ( points ) { + + this.moveTo( points[ 0 ].x, points[ 0 ].y ); + + for ( var i = 1, l = points.length; i < l; i ++ ) { + + this.lineTo( points[ i ].x, points[ i ].y ); + + } + + }, + + moveTo: function ( x, y ) { + + this.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying? + + }, + + lineTo: function ( x, y ) { + + var curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) ); + this.curves.push( curve ); + + this.currentPoint.set( x, y ); + + }, + + quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) { + + var curve = new QuadraticBezierCurve( + this.currentPoint.clone(), + new Vector2( aCPx, aCPy ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + }, + + bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + + var curve = new CubicBezierCurve( + this.currentPoint.clone(), + new Vector2( aCP1x, aCP1y ), + new Vector2( aCP2x, aCP2y ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + }, + + splineThru: function ( pts /*Array of Vector*/ ) { + + var npts = [ this.currentPoint.clone() ].concat( pts ); + + var curve = new SplineCurve( npts ); + this.curves.push( curve ); + + this.currentPoint.copy( pts[ pts.length - 1 ] ); + + }, + + arc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + var x0 = this.currentPoint.x; + var y0 = this.currentPoint.y; + + this.absarc( aX + x0, aY + y0, aRadius, + aStartAngle, aEndAngle, aClockwise ); + + }, + + absarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + this.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + }, + + ellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + var x0 = this.currentPoint.x; + var y0 = this.currentPoint.y; + + this.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + }, + + absellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + var curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + if ( this.curves.length > 0 ) { + + // if a previous curve is present, attempt to join + var firstPoint = curve.getPoint( 0 ); + + if ( ! firstPoint.equals( this.currentPoint ) ) { + + this.lineTo( firstPoint.x, firstPoint.y ); + + } + + } + + this.curves.push( curve ); + + var lastPoint = curve.getPoint( 1 ); + this.currentPoint.copy( lastPoint ); + + }, + + copy: function ( source ) { + + CurvePath.prototype.copy.call( this, source ); + + this.currentPoint.copy( source.currentPoint ); + + return this; + + }, + + toJSON: function () { + + var data = CurvePath.prototype.toJSON.call( this ); + + data.currentPoint = this.currentPoint.toArray(); + + return data; + + }, + + fromJSON: function ( json ) { + + CurvePath.prototype.fromJSON.call( this, json ); + + this.currentPoint.fromArray( json.currentPoint ); + + return this; + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Defines a 2d shape plane using paths. + **/ + + // STEP 1 Create a path. + // STEP 2 Turn path into shape. + // STEP 3 ExtrudeGeometry takes in Shape/Shapes + // STEP 3a - Extract points from each shape, turn to vertices + // STEP 3b - Triangulate each shape, add faces. + + function Shape( points ) { + + Path.call( this, points ); + + this.uuid = _Math.generateUUID(); + + this.type = 'Shape'; + + this.holes = []; + + } + + Shape.prototype = Object.assign( Object.create( Path.prototype ), { + + constructor: Shape, + + getPointsHoles: function ( divisions ) { + + var holesPts = []; + + for ( var i = 0, l = this.holes.length; i < l; i ++ ) { + + holesPts[ i ] = this.holes[ i ].getPoints( divisions ); + + } + + return holesPts; + + }, + + // get points of shape and holes (keypoints based on segments parameter) + + extractPoints: function ( divisions ) { + + return { + + shape: this.getPoints( divisions ), + holes: this.getPointsHoles( divisions ) + + }; + + }, + + copy: function ( source ) { + + Path.prototype.copy.call( this, source ); + + this.holes = []; + + for ( var i = 0, l = source.holes.length; i < l; i ++ ) { + + var hole = source.holes[ i ]; + + this.holes.push( hole.clone() ); + + } + + return this; + + }, + + toJSON: function () { + + var data = Path.prototype.toJSON.call( this ); + + data.uuid = this.uuid; + data.holes = []; + + for ( var i = 0, l = this.holes.length; i < l; i ++ ) { + + var hole = this.holes[ i ]; + data.holes.push( hole.toJSON() ); + + } + + return data; + + }, + + fromJSON: function ( json ) { + + Path.prototype.fromJSON.call( this, json ); + + this.uuid = json.uuid; + this.holes = []; + + for ( var i = 0, l = json.holes.length; i < l; i ++ ) { + + var hole = json.holes[ i ]; + this.holes.push( new Path().fromJSON( hole ) ); + + } + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Light( color, intensity ) { + + Object3D.call( this ); + + this.type = 'Light'; + + this.color = new Color( color ); + this.intensity = intensity !== undefined ? intensity : 1; + + this.receiveShadow = undefined; + + } + + Light.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Light, + + isLight: true, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.intensity = source.intensity; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.color = this.color.getHex(); + data.object.intensity = this.intensity; + + if ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex(); + + if ( this.distance !== undefined ) data.object.distance = this.distance; + if ( this.angle !== undefined ) data.object.angle = this.angle; + if ( this.decay !== undefined ) data.object.decay = this.decay; + if ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra; + + if ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON(); + + return data; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function HemisphereLight( skyColor, groundColor, intensity ) { + + Light.call( this, skyColor, intensity ); + + this.type = 'HemisphereLight'; + + this.castShadow = undefined; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.groundColor = new Color( groundColor ); + + } + + HemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: HemisphereLight, + + isHemisphereLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.groundColor.copy( source.groundColor ); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LightShadow( camera ) { + + this.camera = camera; + + this.bias = 0; + this.radius = 1; + + this.mapSize = new Vector2( 512, 512 ); + + this.map = null; + this.matrix = new Matrix4(); + + } + + Object.assign( LightShadow.prototype, { + + copy: function ( source ) { + + this.camera = source.camera.clone(); + + this.bias = source.bias; + this.radius = source.radius; + + this.mapSize.copy( source.mapSize ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + toJSON: function () { + + var object = {}; + + if ( this.bias !== 0 ) object.bias = this.bias; + if ( this.radius !== 1 ) object.radius = this.radius; + if ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray(); + + object.camera = this.camera.toJSON( false ).object; + delete object.camera.matrix; + + return object; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function SpotLightShadow() { + + LightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) ); + + } + + SpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), { + + constructor: SpotLightShadow, + + isSpotLightShadow: true, + + update: function ( light ) { + + var camera = this.camera; + + var fov = _Math.RAD2DEG * 2 * light.angle; + var aspect = this.mapSize.width / this.mapSize.height; + var far = light.distance || camera.far; + + if ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) { + + camera.fov = fov; + camera.aspect = aspect; + camera.far = far; + camera.updateProjectionMatrix(); + + } + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function SpotLight( color, intensity, distance, angle, penumbra, decay ) { + + Light.call( this, color, intensity ); + + this.type = 'SpotLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.target = new Object3D(); + + Object.defineProperty( this, 'power', { + get: function () { + + // intensity = power per solid angle. + // ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + return this.intensity * Math.PI; + + }, + set: function ( power ) { + + // intensity = power per solid angle. + // ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + this.intensity = power / Math.PI; + + } + } ); + + this.distance = ( distance !== undefined ) ? distance : 0; + this.angle = ( angle !== undefined ) ? angle : Math.PI / 3; + this.penumbra = ( penumbra !== undefined ) ? penumbra : 0; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new SpotLightShadow(); + + } + + SpotLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: SpotLight, + + isSpotLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.distance = source.distance; + this.angle = source.angle; + this.penumbra = source.penumbra; + this.decay = source.decay; + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + + function PointLight( color, intensity, distance, decay ) { + + Light.call( this, color, intensity ); + + this.type = 'PointLight'; + + Object.defineProperty( this, 'power', { + get: function () { + + // intensity = power per solid angle. + // ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + return this.intensity * 4 * Math.PI; + + }, + set: function ( power ) { + + // intensity = power per solid angle. + // ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + this.intensity = power / ( 4 * Math.PI ); + + } + } ); + + this.distance = ( distance !== undefined ) ? distance : 0; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) ); + + } + + PointLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: PointLight, + + isPointLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.distance = source.distance; + this.decay = source.decay; + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function DirectionalLightShadow( ) { + + LightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) ); + + } + + DirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), { + + constructor: DirectionalLightShadow + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function DirectionalLight( color, intensity ) { + + Light.call( this, color, intensity ); + + this.type = 'DirectionalLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.target = new Object3D(); + + this.shadow = new DirectionalLightShadow(); + + } + + DirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: DirectionalLight, + + isDirectionalLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AmbientLight( color, intensity ) { + + Light.call( this, color, intensity ); + + this.type = 'AmbientLight'; + + this.castShadow = undefined; + + } + + AmbientLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: AmbientLight, + + isAmbientLight: true + + } ); + + /** + * @author abelnation / http://github.com/abelnation + */ + + function RectAreaLight( color, intensity, width, height ) { + + Light.call( this, color, intensity ); + + this.type = 'RectAreaLight'; + + this.width = ( width !== undefined ) ? width : 10; + this.height = ( height !== undefined ) ? height : 10; + + } + + RectAreaLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: RectAreaLight, + + isRectAreaLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.width = source.width; + this.height = source.height; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Light.prototype.toJSON.call( this, meta ); + + data.object.width = this.width; + data.object.height = this.height; + + return data; + + } + + } ); + + /** + * + * A Track that interpolates Strings + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function StringKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + + } + + StringKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: StringKeyframeTrack, + + ValueTypeName: 'string', + ValueBufferType: Array, + + DefaultInterpolation: InterpolateDiscrete, + + InterpolantFactoryMethodLinear: undefined, + + InterpolantFactoryMethodSmooth: undefined + + } ); + + /** + * + * A Track of Boolean keyframe values. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function BooleanKeyframeTrack( name, times, values ) { + + KeyframeTrack.call( this, name, times, values ); + + } + + BooleanKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: BooleanKeyframeTrack, + + ValueTypeName: 'bool', + ValueBufferType: Array, + + DefaultInterpolation: InterpolateDiscrete, + + InterpolantFactoryMethodLinear: undefined, + InterpolantFactoryMethodSmooth: undefined + + // Note: Actually this track could have a optimized / compressed + // representation of a single value and a custom interpolant that + // computes "firstValue ^ isOdd( index )". + + } ); + + /** + * Abstract base class of interpolants over parametric samples. + * + * The parameter domain is one dimensional, typically the time or a path + * along a curve defined by the data. + * + * The sample values can have any dimensionality and derived classes may + * apply special interpretations to the data. + * + * This class provides the interval seek in a Template Method, deferring + * the actual interpolation to derived classes. + * + * Time complexity is O(1) for linear access crossing at most two points + * and O(log N) for random access, where N is the number of positions. + * + * References: + * + * http://www.oodesign.com/template-method-pattern.html + * + * @author tschw + */ + + function Interpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + this.parameterPositions = parameterPositions; + this._cachedIndex = 0; + + this.resultBuffer = resultBuffer !== undefined ? + resultBuffer : new sampleValues.constructor( sampleSize ); + this.sampleValues = sampleValues; + this.valueSize = sampleSize; + + } + + Object.assign( Interpolant.prototype, { + + evaluate: function ( t ) { + + var pp = this.parameterPositions, + i1 = this._cachedIndex, + + t1 = pp[ i1 ], + t0 = pp[ i1 - 1 ]; + + validate_interval: { + + seek: { + + var right; + + linear_scan: { + + //- See http://jsperf.com/comparison-to-undefined/3 + //- slower code: + //- + //- if ( t >= t1 || t1 === undefined ) { + forward_scan: if ( ! ( t < t1 ) ) { + + for ( var giveUpAt = i1 + 2; ; ) { + + if ( t1 === undefined ) { + + if ( t < t0 ) break forward_scan; + + // after end + + i1 = pp.length; + this._cachedIndex = i1; + return this.afterEnd_( i1 - 1, t, t0 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t0 = t1; + t1 = pp[ ++ i1 ]; + + if ( t < t1 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the right side of the index + right = pp.length; + break linear_scan; + + } + + //- slower code: + //- if ( t < t0 || t0 === undefined ) { + if ( ! ( t >= t0 ) ) { + + // looping? + + var t1global = pp[ 1 ]; + + if ( t < t1global ) { + + i1 = 2; // + 1, using the scan for the details + t0 = t1global; + + } + + // linear reverse scan + + for ( var giveUpAt = i1 - 2; ; ) { + + if ( t0 === undefined ) { + + // before start + + this._cachedIndex = 0; + return this.beforeStart_( 0, t, t1 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t1 = t0; + t0 = pp[ -- i1 - 1 ]; + + if ( t >= t0 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the left side of the index + right = i1; + i1 = 0; + break linear_scan; + + } + + // the interval is valid + + break validate_interval; + + } // linear scan + + // binary search + + while ( i1 < right ) { + + var mid = ( i1 + right ) >>> 1; + + if ( t < pp[ mid ] ) { + + right = mid; + + } else { + + i1 = mid + 1; + + } + + } + + t1 = pp[ i1 ]; + t0 = pp[ i1 - 1 ]; + + // check boundary cases, again + + if ( t0 === undefined ) { + + this._cachedIndex = 0; + return this.beforeStart_( 0, t, t1 ); + + } + + if ( t1 === undefined ) { + + i1 = pp.length; + this._cachedIndex = i1; + return this.afterEnd_( i1 - 1, t0, t ); + + } + + } // seek + + this._cachedIndex = i1; + + this.intervalChanged_( i1, t0, t1 ); + + } // validate_interval + + return this.interpolate_( i1, t0, t, t1 ); + + }, + + settings: null, // optional, subclass-specific settings structure + // Note: The indirection allows central control of many interpolants. + + // --- Protected interface + + DefaultSettings_: {}, + + getSettings_: function () { + + return this.settings || this.DefaultSettings_; + + }, + + copySampleValue_: function ( index ) { + + // copies a sample value to the result buffer + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + offset = index * stride; + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = values[ offset + i ]; + + } + + return result; + + }, + + // Template methods for derived classes: + + interpolate_: function ( /* i1, t0, t, t1 */ ) { + + throw new Error( 'call to abstract method' ); + // implementations shall return this.resultBuffer + + }, + + intervalChanged_: function ( /* i1, t0, t1 */ ) { + + // empty + + } + + } ); + + //!\ DECLARE ALIAS AFTER assign prototype ! + Object.assign( Interpolant.prototype, { + + //( 0, t, t0 ), returns this.resultBuffer + beforeStart_: Interpolant.prototype.copySampleValue_, + + //( N-1, tN-1, t ), returns this.resultBuffer + afterEnd_: Interpolant.prototype.copySampleValue_, + + } ); + + /** + * Spherical linear unit quaternion interpolant. + * + * @author tschw + */ + + function QuaternionLinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + QuaternionLinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: QuaternionLinearInterpolant, + + interpolate_: function ( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + offset = i1 * stride, + + alpha = ( t - t0 ) / ( t1 - t0 ); + + for ( var end = offset + stride; offset !== end; offset += 4 ) { + + Quaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha ); + + } + + return result; + + } + + } ); + + /** + * + * A Track of quaternion keyframe values. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function QuaternionKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + + } + + QuaternionKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: QuaternionKeyframeTrack, + + ValueTypeName: 'quaternion', + + // ValueBufferType is inherited + + DefaultInterpolation: InterpolateLinear, + + InterpolantFactoryMethodLinear: function ( result ) { + + return new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodSmooth: undefined // not yet implemented + + } ); + + /** + * + * A Track of keyframe values that represent color. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function ColorKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + + } + + ColorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: ColorKeyframeTrack, + + ValueTypeName: 'color' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + // Note: Very basic implementation and nothing special yet. + // However, this is the place for color space parameterization. + + } ); + + /** + * + * A Track of numeric keyframe values. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function NumberKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + + } + + NumberKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: NumberKeyframeTrack, + + ValueTypeName: 'number' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + } ); + + /** + * Fast and simple cubic spline interpolant. + * + * It was derived from a Hermitian construction setting the first derivative + * at each sample position to the linear slope between neighboring positions + * over their parameter interval. + * + * @author tschw + */ + + function CubicInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + this._weightPrev = - 0; + this._offsetPrev = - 0; + this._weightNext = - 0; + this._offsetNext = - 0; + + } + + CubicInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: CubicInterpolant, + + DefaultSettings_: { + + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + + }, + + intervalChanged_: function ( i1, t0, t1 ) { + + var pp = this.parameterPositions, + iPrev = i1 - 2, + iNext = i1 + 1, + + tPrev = pp[ iPrev ], + tNext = pp[ iNext ]; + + if ( tPrev === undefined ) { + + switch ( this.getSettings_().endingStart ) { + + case ZeroSlopeEnding: + + // f'(t0) = 0 + iPrev = i1; + tPrev = 2 * t0 - t1; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iPrev = pp.length - 2; + tPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(t0) = 0 a.k.a. Natural Spline + iPrev = i1; + tPrev = t1; + + } + + } + + if ( tNext === undefined ) { + + switch ( this.getSettings_().endingEnd ) { + + case ZeroSlopeEnding: + + // f'(tN) = 0 + iNext = i1; + tNext = 2 * t1 - t0; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iNext = 1; + tNext = t1 + pp[ 1 ] - pp[ 0 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(tN) = 0, a.k.a. Natural Spline + iNext = i1 - 1; + tNext = t0; + + } + + } + + var halfDt = ( t1 - t0 ) * 0.5, + stride = this.valueSize; + + this._weightPrev = halfDt / ( t0 - tPrev ); + this._weightNext = halfDt / ( tNext - t1 ); + this._offsetPrev = iPrev * stride; + this._offsetNext = iNext * stride; + + }, + + interpolate_: function ( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + o1 = i1 * stride, o0 = o1 - stride, + oP = this._offsetPrev, oN = this._offsetNext, + wP = this._weightPrev, wN = this._weightNext, + + p = ( t - t0 ) / ( t1 - t0 ), + pp = p * p, + ppp = pp * p; + + // evaluate polynomials + + var sP = - wP * ppp + 2 * wP * pp - wP * p; + var s0 = ( 1 + wP ) * ppp + ( - 1.5 - 2 * wP ) * pp + ( - 0.5 + wP ) * p + 1; + var s1 = ( - 1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p; + var sN = wN * ppp - wN * pp; + + // combine data linearly + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = + sP * values[ oP + i ] + + s0 * values[ o0 + i ] + + s1 * values[ o1 + i ] + + sN * values[ oN + i ]; + + } + + return result; + + } + + } ); + + /** + * @author tschw + */ + + function LinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + LinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: LinearInterpolant, + + interpolate_: function ( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + offset1 = i1 * stride, + offset0 = offset1 - stride, + + weight1 = ( t - t0 ) / ( t1 - t0 ), + weight0 = 1 - weight1; + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = + values[ offset0 + i ] * weight0 + + values[ offset1 + i ] * weight1; + + } + + return result; + + } + + } ); + + /** + * + * Interpolant that evaluates to the sample value at the position preceeding + * the parameter. + * + * @author tschw + */ + + function DiscreteInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + DiscreteInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), { + + constructor: DiscreteInterpolant, + + interpolate_: function ( i1 /*, t0, t, t1 */ ) { + + return this.copySampleValue_( i1 - 1 ); + + } + + } ); + + /** + * @author tschw + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + + var AnimationUtils = { + + // same as Array.prototype.slice, but also works on typed arrays + arraySlice: function ( array, from, to ) { + + if ( AnimationUtils.isTypedArray( array ) ) { + + // in ios9 array.subarray(from, undefined) will return empty array + // but array.subarray(from) or array.subarray(from, len) is correct + return new array.constructor( array.subarray( from, to !== undefined ? to : array.length ) ); + + } + + return array.slice( from, to ); + + }, + + // converts an array to a specific type + convertArray: function ( array, type, forceClone ) { + + if ( ! array || // let 'undefined' and 'null' pass + ! forceClone && array.constructor === type ) return array; + + if ( typeof type.BYTES_PER_ELEMENT === 'number' ) { + + return new type( array ); // create typed array + + } + + return Array.prototype.slice.call( array ); // create Array + + }, + + isTypedArray: function ( object ) { + + return ArrayBuffer.isView( object ) && + ! ( object instanceof DataView ); + + }, + + // returns an array by which times and values can be sorted + getKeyframeOrder: function ( times ) { + + function compareTime( i, j ) { + + return times[ i ] - times[ j ]; + + } + + var n = times.length; + var result = new Array( n ); + for ( var i = 0; i !== n; ++ i ) result[ i ] = i; + + result.sort( compareTime ); + + return result; + + }, + + // uses the array previously returned by 'getKeyframeOrder' to sort data + sortedArray: function ( values, stride, order ) { + + var nValues = values.length; + var result = new values.constructor( nValues ); + + for ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) { + + var srcOffset = order[ i ] * stride; + + for ( var j = 0; j !== stride; ++ j ) { + + result[ dstOffset ++ ] = values[ srcOffset + j ]; + + } + + } + + return result; + + }, + + // function for parsing AOS keyframe formats + flattenJSON: function ( jsonKeys, times, values, valuePropertyName ) { + + var i = 1, key = jsonKeys[ 0 ]; + + while ( key !== undefined && key[ valuePropertyName ] === undefined ) { + + key = jsonKeys[ i ++ ]; + + } + + if ( key === undefined ) return; // no data + + var value = key[ valuePropertyName ]; + if ( value === undefined ) return; // no data + + if ( Array.isArray( value ) ) { + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push.apply( values, value ); // push all elements + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else if ( value.toArray !== undefined ) { + + // ...assume THREE.Math-ish + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + value.toArray( values, values.length ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else { + + // otherwise push as-is + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push( value ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } + + } + + }; + + /** + * + * A timed sequence of keyframes for a specific property. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function KeyframeTrack( name, times, values, interpolation ) { + + if ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' ); + if ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name ); + + this.name = name; + + this.times = AnimationUtils.convertArray( times, this.TimeBufferType ); + this.values = AnimationUtils.convertArray( values, this.ValueBufferType ); + + this.setInterpolation( interpolation || this.DefaultInterpolation ); + + this.validate(); + this.optimize(); + + } + + // Static methods: + + Object.assign( KeyframeTrack, { + + // Serialization (in static context, because of constructor invocation + // and automatic invocation of .toJSON): + + parse: function ( json ) { + + if ( json.type === undefined ) { + + throw new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' ); + + } + + var trackType = KeyframeTrack._getTrackTypeForValueTypeName( json.type ); + + if ( json.times === undefined ) { + + var times = [], values = []; + + AnimationUtils.flattenJSON( json.keys, times, values, 'value' ); + + json.times = times; + json.values = values; + + } + + // derived classes can define a static parse method + if ( trackType.parse !== undefined ) { + + return trackType.parse( json ); + + } else { + + // by default, we assume a constructor compatible with the base + return new trackType( json.name, json.times, json.values, json.interpolation ); + + } + + }, + + toJSON: function ( track ) { + + var trackType = track.constructor; + + var json; + + // derived classes can define a static toJSON method + if ( trackType.toJSON !== undefined ) { + + json = trackType.toJSON( track ); + + } else { + + // by default, we assume the data can be serialized as-is + json = { + + 'name': track.name, + 'times': AnimationUtils.convertArray( track.times, Array ), + 'values': AnimationUtils.convertArray( track.values, Array ) + + }; + + var interpolation = track.getInterpolation(); + + if ( interpolation !== track.DefaultInterpolation ) { + + json.interpolation = interpolation; + + } + + } + + json.type = track.ValueTypeName; // mandatory + + return json; + + }, + + _getTrackTypeForValueTypeName: function ( typeName ) { + + switch ( typeName.toLowerCase() ) { + + case 'scalar': + case 'double': + case 'float': + case 'number': + case 'integer': + + return NumberKeyframeTrack; + + case 'vector': + case 'vector2': + case 'vector3': + case 'vector4': + + return VectorKeyframeTrack; + + case 'color': + + return ColorKeyframeTrack; + + case 'quaternion': + + return QuaternionKeyframeTrack; + + case 'bool': + case 'boolean': + + return BooleanKeyframeTrack; + + case 'string': + + return StringKeyframeTrack; + + } + + throw new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName ); + + } + + } ); + + Object.assign( KeyframeTrack.prototype, { + + constructor: KeyframeTrack, + + TimeBufferType: Float32Array, + + ValueBufferType: Float32Array, + + DefaultInterpolation: InterpolateLinear, + + InterpolantFactoryMethodDiscrete: function ( result ) { + + return new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodLinear: function ( result ) { + + return new LinearInterpolant( this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodSmooth: function ( result ) { + + return new CubicInterpolant( this.times, this.values, this.getValueSize(), result ); + + }, + + setInterpolation: function ( interpolation ) { + + var factoryMethod; + + switch ( interpolation ) { + + case InterpolateDiscrete: + + factoryMethod = this.InterpolantFactoryMethodDiscrete; + + break; + + case InterpolateLinear: + + factoryMethod = this.InterpolantFactoryMethodLinear; + + break; + + case InterpolateSmooth: + + factoryMethod = this.InterpolantFactoryMethodSmooth; + + break; + + } + + if ( factoryMethod === undefined ) { + + var message = "unsupported interpolation for " + + this.ValueTypeName + " keyframe track named " + this.name; + + if ( this.createInterpolant === undefined ) { + + // fall back to default, unless the default itself is messed up + if ( interpolation !== this.DefaultInterpolation ) { + + this.setInterpolation( this.DefaultInterpolation ); + + } else { + + throw new Error( message ); // fatal, in this case + + } + + } + + console.warn( 'THREE.KeyframeTrack:', message ); + return; + + } + + this.createInterpolant = factoryMethod; + + }, + + getInterpolation: function () { + + switch ( this.createInterpolant ) { + + case this.InterpolantFactoryMethodDiscrete: + + return InterpolateDiscrete; + + case this.InterpolantFactoryMethodLinear: + + return InterpolateLinear; + + case this.InterpolantFactoryMethodSmooth: + + return InterpolateSmooth; + + } + + }, + + getValueSize: function () { + + return this.values.length / this.times.length; + + }, + + // move all keyframes either forwards or backwards in time + shift: function ( timeOffset ) { + + if ( timeOffset !== 0.0 ) { + + var times = this.times; + + for ( var i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] += timeOffset; + + } + + } + + return this; + + }, + + // scale all keyframe times by a factor (useful for frame <-> seconds conversions) + scale: function ( timeScale ) { + + if ( timeScale !== 1.0 ) { + + var times = this.times; + + for ( var i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] *= timeScale; + + } + + } + + return this; + + }, + + // removes keyframes before and after animation without changing any values within the range [startTime, endTime]. + // IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values + trim: function ( startTime, endTime ) { + + var times = this.times, + nKeys = times.length, + from = 0, + to = nKeys - 1; + + while ( from !== nKeys && times[ from ] < startTime ) { + + ++ from; + + } + + while ( to !== - 1 && times[ to ] > endTime ) { + + -- to; + + } + + ++ to; // inclusive -> exclusive bound + + if ( from !== 0 || to !== nKeys ) { + + // empty tracks are forbidden, so keep at least one keyframe + if ( from >= to ) to = Math.max( to, 1 ), from = to - 1; + + var stride = this.getValueSize(); + this.times = AnimationUtils.arraySlice( times, from, to ); + this.values = AnimationUtils.arraySlice( this.values, from * stride, to * stride ); + + } + + return this; + + }, + + // ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable + validate: function () { + + var valid = true; + + var valueSize = this.getValueSize(); + if ( valueSize - Math.floor( valueSize ) !== 0 ) { + + console.error( 'THREE.KeyframeTrack: Invalid value size in track.', this ); + valid = false; + + } + + var times = this.times, + values = this.values, + + nKeys = times.length; + + if ( nKeys === 0 ) { + + console.error( 'THREE.KeyframeTrack: Track is empty.', this ); + valid = false; + + } + + var prevTime = null; + + for ( var i = 0; i !== nKeys; i ++ ) { + + var currTime = times[ i ]; + + if ( typeof currTime === 'number' && isNaN( currTime ) ) { + + console.error( 'THREE.KeyframeTrack: Time is not a valid number.', this, i, currTime ); + valid = false; + break; + + } + + if ( prevTime !== null && prevTime > currTime ) { + + console.error( 'THREE.KeyframeTrack: Out of order keys.', this, i, currTime, prevTime ); + valid = false; + break; + + } + + prevTime = currTime; + + } + + if ( values !== undefined ) { + + if ( AnimationUtils.isTypedArray( values ) ) { + + for ( var i = 0, n = values.length; i !== n; ++ i ) { + + var value = values[ i ]; + + if ( isNaN( value ) ) { + + console.error( 'THREE.KeyframeTrack: Value is not a valid number.', this, i, value ); + valid = false; + break; + + } + + } + + } + + } + + return valid; + + }, + + // removes equivalent sequential keys as common in morph target sequences + // (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0) + optimize: function () { + + var times = this.times, + values = this.values, + stride = this.getValueSize(), + + smoothInterpolation = this.getInterpolation() === InterpolateSmooth, + + writeIndex = 1, + lastIndex = times.length - 1; + + for ( var i = 1; i < lastIndex; ++ i ) { + + var keep = false; + + var time = times[ i ]; + var timeNext = times[ i + 1 ]; + + // remove adjacent keyframes scheduled at the same time + + if ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) { + + if ( ! smoothInterpolation ) { + + // remove unnecessary keyframes same as their neighbors + + var offset = i * stride, + offsetP = offset - stride, + offsetN = offset + stride; + + for ( var j = 0; j !== stride; ++ j ) { + + var value = values[ offset + j ]; + + if ( value !== values[ offsetP + j ] || + value !== values[ offsetN + j ] ) { + + keep = true; + break; + + } + + } + + } else { + + keep = true; + + } + + } + + // in-place compaction + + if ( keep ) { + + if ( i !== writeIndex ) { + + times[ writeIndex ] = times[ i ]; + + var readOffset = i * stride, + writeOffset = writeIndex * stride; + + for ( var j = 0; j !== stride; ++ j ) { + + values[ writeOffset + j ] = values[ readOffset + j ]; + + } + + } + + ++ writeIndex; + + } + + } + + // flush last keyframe (compaction looks ahead) + + if ( lastIndex > 0 ) { + + times[ writeIndex ] = times[ lastIndex ]; + + for ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) { + + values[ writeOffset + j ] = values[ readOffset + j ]; + + } + + ++ writeIndex; + + } + + if ( writeIndex !== times.length ) { + + this.times = AnimationUtils.arraySlice( times, 0, writeIndex ); + this.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride ); + + } + + return this; + + } + + } ); + + /** + * + * A Track of vectored keyframe values. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function VectorKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrack.call( this, name, times, values, interpolation ); + + } + + VectorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), { + + constructor: VectorKeyframeTrack, + + ValueTypeName: 'vector' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + } ); + + /** + * + * Reusable set of Tracks that represent an animation. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + + function AnimationClip( name, duration, tracks ) { + + this.name = name; + this.tracks = tracks; + this.duration = ( duration !== undefined ) ? duration : - 1; + + this.uuid = _Math.generateUUID(); + + // this means it should figure out its duration by scanning the tracks + if ( this.duration < 0 ) { + + this.resetDuration(); + + } + + this.optimize(); + + } + + Object.assign( AnimationClip, { + + parse: function ( json ) { + + var tracks = [], + jsonTracks = json.tracks, + frameTime = 1.0 / ( json.fps || 1.0 ); + + for ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) { + + tracks.push( KeyframeTrack.parse( jsonTracks[ i ] ).scale( frameTime ) ); + + } + + return new AnimationClip( json.name, json.duration, tracks ); + + }, + + toJSON: function ( clip ) { + + var tracks = [], + clipTracks = clip.tracks; + + var json = { + + 'name': clip.name, + 'duration': clip.duration, + 'tracks': tracks + + }; + + for ( var i = 0, n = clipTracks.length; i !== n; ++ i ) { + + tracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) ); + + } + + return json; + + }, + + CreateFromMorphTargetSequence: function ( name, morphTargetSequence, fps, noLoop ) { + + var numMorphTargets = morphTargetSequence.length; + var tracks = []; + + for ( var i = 0; i < numMorphTargets; i ++ ) { + + var times = []; + var values = []; + + times.push( + ( i + numMorphTargets - 1 ) % numMorphTargets, + i, + ( i + 1 ) % numMorphTargets ); + + values.push( 0, 1, 0 ); + + var order = AnimationUtils.getKeyframeOrder( times ); + times = AnimationUtils.sortedArray( times, 1, order ); + values = AnimationUtils.sortedArray( values, 1, order ); + + // if there is a key at the first frame, duplicate it as the + // last frame as well for perfect loop. + if ( ! noLoop && times[ 0 ] === 0 ) { + + times.push( numMorphTargets ); + values.push( values[ 0 ] ); + + } + + tracks.push( + new NumberKeyframeTrack( + '.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']', + times, values + ).scale( 1.0 / fps ) ); + + } + + return new AnimationClip( name, - 1, tracks ); + + }, + + findByName: function ( objectOrClipArray, name ) { + + var clipArray = objectOrClipArray; + + if ( ! Array.isArray( objectOrClipArray ) ) { + + var o = objectOrClipArray; + clipArray = o.geometry && o.geometry.animations || o.animations; + + } + + for ( var i = 0; i < clipArray.length; i ++ ) { + + if ( clipArray[ i ].name === name ) { + + return clipArray[ i ]; + + } + + } + + return null; + + }, + + CreateClipsFromMorphTargetSequences: function ( morphTargets, fps, noLoop ) { + + var animationToMorphTargets = {}; + + // tested with https://regex101.com/ on trick sequences + // such flamingo_flyA_003, flamingo_run1_003, crdeath0059 + var pattern = /^([\w-]*?)([\d]+)$/; + + // sort morph target names into animation groups based + // patterns like Walk_001, Walk_002, Run_001, Run_002 + for ( var i = 0, il = morphTargets.length; i < il; i ++ ) { + + var morphTarget = morphTargets[ i ]; + var parts = morphTarget.name.match( pattern ); + + if ( parts && parts.length > 1 ) { + + var name = parts[ 1 ]; + + var animationMorphTargets = animationToMorphTargets[ name ]; + if ( ! animationMorphTargets ) { + + animationToMorphTargets[ name ] = animationMorphTargets = []; + + } + + animationMorphTargets.push( morphTarget ); + + } + + } + + var clips = []; + + for ( var name in animationToMorphTargets ) { + + clips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) ); + + } + + return clips; + + }, + + // parse the animation.hierarchy format + parseAnimation: function ( animation, bones ) { + + if ( ! animation ) { + + console.error( 'THREE.AnimationClip: No animation in JSONLoader data.' ); + return null; + + } + + var addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) { + + // only return track if there are actually keys. + if ( animationKeys.length !== 0 ) { + + var times = []; + var values = []; + + AnimationUtils.flattenJSON( animationKeys, times, values, propertyName ); + + // empty keys are filtered out, so check again + if ( times.length !== 0 ) { + + destTracks.push( new trackType( trackName, times, values ) ); + + } + + } + + }; + + var tracks = []; + + var clipName = animation.name || 'default'; + // automatic length determination in AnimationClip. + var duration = animation.length || - 1; + var fps = animation.fps || 30; + + var hierarchyTracks = animation.hierarchy || []; + + for ( var h = 0; h < hierarchyTracks.length; h ++ ) { + + var animationKeys = hierarchyTracks[ h ].keys; + + // skip empty tracks + if ( ! animationKeys || animationKeys.length === 0 ) continue; + + // process morph targets + if ( animationKeys[ 0 ].morphTargets ) { + + // figure out all morph targets used in this track + var morphTargetNames = {}; + + for ( var k = 0; k < animationKeys.length; k ++ ) { + + if ( animationKeys[ k ].morphTargets ) { + + for ( var m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) { + + morphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1; + + } + + } + + } + + // create a track for each morph target with all zero + // morphTargetInfluences except for the keys in which + // the morphTarget is named. + for ( var morphTargetName in morphTargetNames ) { + + var times = []; + var values = []; + + for ( var m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) { + + var animationKey = animationKeys[ k ]; + + times.push( animationKey.time ); + values.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 ); + + } + + tracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) ); + + } + + duration = morphTargetNames.length * ( fps || 1.0 ); + + } else { + + // ...assume skeletal animation + + var boneName = '.bones[' + bones[ h ].name + ']'; + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.position', + animationKeys, 'pos', tracks ); + + addNonemptyTrack( + QuaternionKeyframeTrack, boneName + '.quaternion', + animationKeys, 'rot', tracks ); + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.scale', + animationKeys, 'scl', tracks ); + + } + + } + + if ( tracks.length === 0 ) { + + return null; + + } + + var clip = new AnimationClip( clipName, duration, tracks ); + + return clip; + + } + + } ); + + Object.assign( AnimationClip.prototype, { + + resetDuration: function () { + + var tracks = this.tracks, duration = 0; + + for ( var i = 0, n = tracks.length; i !== n; ++ i ) { + + var track = this.tracks[ i ]; + + duration = Math.max( duration, track.times[ track.times.length - 1 ] ); + + } + + this.duration = duration; + + }, + + trim: function () { + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].trim( 0, this.duration ); + + } + + return this; + + }, + + optimize: function () { + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].optimize(); + + } + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function MaterialLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + this.textures = {}; + + } + + Object.assign( MaterialLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + }, onProgress, onError ); + + }, + + setTextures: function ( value ) { + + this.textures = value; + + }, + + parse: function ( json ) { + + var textures = this.textures; + + function getTexture( name ) { + + if ( textures[ name ] === undefined ) { + + console.warn( 'THREE.MaterialLoader: Undefined texture', name ); + + } + + return textures[ name ]; + + } + + var material = new Materials[ json.type ](); + + if ( json.uuid !== undefined ) material.uuid = json.uuid; + if ( json.name !== undefined ) material.name = json.name; + if ( json.color !== undefined ) material.color.setHex( json.color ); + if ( json.roughness !== undefined ) material.roughness = json.roughness; + if ( json.metalness !== undefined ) material.metalness = json.metalness; + if ( json.emissive !== undefined ) material.emissive.setHex( json.emissive ); + if ( json.specular !== undefined ) material.specular.setHex( json.specular ); + if ( json.shininess !== undefined ) material.shininess = json.shininess; + if ( json.clearCoat !== undefined ) material.clearCoat = json.clearCoat; + if ( json.clearCoatRoughness !== undefined ) material.clearCoatRoughness = json.clearCoatRoughness; + if ( json.uniforms !== undefined ) material.uniforms = json.uniforms; + if ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader; + if ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader; + if ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors; + if ( json.fog !== undefined ) material.fog = json.fog; + if ( json.flatShading !== undefined ) material.flatShading = json.flatShading; + if ( json.blending !== undefined ) material.blending = json.blending; + if ( json.side !== undefined ) material.side = json.side; + if ( json.opacity !== undefined ) material.opacity = json.opacity; + if ( json.transparent !== undefined ) material.transparent = json.transparent; + if ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest; + if ( json.depthTest !== undefined ) material.depthTest = json.depthTest; + if ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite; + if ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite; + if ( json.wireframe !== undefined ) material.wireframe = json.wireframe; + if ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth; + if ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap; + if ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin; + + if ( json.rotation !== undefined ) material.rotation = json.rotation; + + if ( json.linewidth !== 1 ) material.linewidth = json.linewidth; + if ( json.dashSize !== undefined ) material.dashSize = json.dashSize; + if ( json.gapSize !== undefined ) material.gapSize = json.gapSize; + if ( json.scale !== undefined ) material.scale = json.scale; + + if ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset; + if ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor; + if ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits; + + if ( json.skinning !== undefined ) material.skinning = json.skinning; + if ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets; + if ( json.dithering !== undefined ) material.dithering = json.dithering; + + if ( json.visible !== undefined ) material.visible = json.visible; + if ( json.userData !== undefined ) material.userData = json.userData; + + // Deprecated + + if ( json.shading !== undefined ) material.flatShading = json.shading === 1; // THREE.FlatShading + + // for PointsMaterial + + if ( json.size !== undefined ) material.size = json.size; + if ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation; + + // maps + + if ( json.map !== undefined ) material.map = getTexture( json.map ); + + if ( json.alphaMap !== undefined ) { + + material.alphaMap = getTexture( json.alphaMap ); + material.transparent = true; + + } + + if ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap ); + if ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale; + + if ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap ); + if ( json.normalScale !== undefined ) { + + var normalScale = json.normalScale; + + if ( Array.isArray( normalScale ) === false ) { + + // Blender exporter used to export a scalar. See #7459 + + normalScale = [ normalScale, normalScale ]; + + } + + material.normalScale = new Vector2().fromArray( normalScale ); + + } + + if ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap ); + if ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale; + if ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias; + + if ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap ); + if ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap ); + + if ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap ); + if ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity; + + if ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap ); + + if ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap ); + + if ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity; + + if ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap ); + if ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity; + + if ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap ); + if ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity; + + if ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap ); + + return material; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function BufferGeometryLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( BufferGeometryLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + var geometry = new BufferGeometry(); + + var index = json.data.index; + + if ( index !== undefined ) { + + var typedArray = new TYPED_ARRAYS[ index.type ]( index.array ); + geometry.setIndex( new BufferAttribute( typedArray, 1 ) ); + + } + + var attributes = json.data.attributes; + + for ( var key in attributes ) { + + var attribute = attributes[ key ]; + var typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array ); + + geometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) ); + + } + + var groups = json.data.groups || json.data.drawcalls || json.data.offsets; + + if ( groups !== undefined ) { + + for ( var i = 0, n = groups.length; i !== n; ++ i ) { + + var group = groups[ i ]; + + geometry.addGroup( group.start, group.count, group.materialIndex ); + + } + + } + + var boundingSphere = json.data.boundingSphere; + + if ( boundingSphere !== undefined ) { + + var center = new Vector3(); + + if ( boundingSphere.center !== undefined ) { + + center.fromArray( boundingSphere.center ); + + } + + geometry.boundingSphere = new Sphere( center, boundingSphere.radius ); + + } + + return geometry; + + } + + } ); + + var TYPED_ARRAYS = { + Int8Array: Int8Array, + Uint8Array: Uint8Array, + // Workaround for IE11 pre KB2929437. See #11440 + Uint8ClampedArray: typeof Uint8ClampedArray !== 'undefined' ? Uint8ClampedArray : Uint8Array, + Int16Array: Int16Array, + Uint16Array: Uint16Array, + Int32Array: Int32Array, + Uint32Array: Uint32Array, + Float32Array: Float32Array, + Float64Array: Float64Array + }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Loader() {} + + Loader.Handlers = { + + handlers: [], + + add: function ( regex, loader ) { + + this.handlers.push( regex, loader ); + + }, + + get: function ( file ) { + + var handlers = this.handlers; + + for ( var i = 0, l = handlers.length; i < l; i += 2 ) { + + var regex = handlers[ i ]; + var loader = handlers[ i + 1 ]; + + if ( regex.test( file ) ) { + + return loader; + + } + + } + + return null; + + } + + }; + + Object.assign( Loader.prototype, { + + crossOrigin: undefined, + + onLoadStart: function () {}, + + onLoadProgress: function () {}, + + onLoadComplete: function () {}, + + initMaterials: function ( materials, texturePath, crossOrigin ) { + + var array = []; + + for ( var i = 0; i < materials.length; ++ i ) { + + array[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin ); + + } + + return array; + + }, + + createMaterial: ( function () { + + var BlendingMode = { + NoBlending: NoBlending, + NormalBlending: NormalBlending, + AdditiveBlending: AdditiveBlending, + SubtractiveBlending: SubtractiveBlending, + MultiplyBlending: MultiplyBlending, + CustomBlending: CustomBlending + }; + + var color = new Color(); + var textureLoader = new TextureLoader(); + var materialLoader = new MaterialLoader(); + + return function createMaterial( m, texturePath, crossOrigin ) { + + // convert from old material format + + var textures = {}; + + function loadTexture( path, repeat, offset, wrap, anisotropy ) { + + var fullPath = texturePath + path; + var loader = Loader.Handlers.get( fullPath ); + + var texture; + + if ( loader !== null ) { + + texture = loader.load( fullPath ); + + } else { + + textureLoader.setCrossOrigin( crossOrigin ); + texture = textureLoader.load( fullPath ); + + } + + if ( repeat !== undefined ) { + + texture.repeat.fromArray( repeat ); + + if ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping; + if ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping; + + } + + if ( offset !== undefined ) { + + texture.offset.fromArray( offset ); + + } + + if ( wrap !== undefined ) { + + if ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping; + if ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping; + + if ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping; + if ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping; + + } + + if ( anisotropy !== undefined ) { + + texture.anisotropy = anisotropy; + + } + + var uuid = _Math.generateUUID(); + + textures[ uuid ] = texture; + + return uuid; + + } + + // + + var json = { + uuid: _Math.generateUUID(), + type: 'MeshLambertMaterial' + }; + + for ( var name in m ) { + + var value = m[ name ]; + + switch ( name ) { + + case 'DbgColor': + case 'DbgIndex': + case 'opticalDensity': + case 'illumination': + break; + case 'DbgName': + json.name = value; + break; + case 'blending': + json.blending = BlendingMode[ value ]; + break; + case 'colorAmbient': + case 'mapAmbient': + console.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' ); + break; + case 'colorDiffuse': + json.color = color.fromArray( value ).getHex(); + break; + case 'colorSpecular': + json.specular = color.fromArray( value ).getHex(); + break; + case 'colorEmissive': + json.emissive = color.fromArray( value ).getHex(); + break; + case 'specularCoef': + json.shininess = value; + break; + case 'shading': + if ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial'; + if ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial'; + if ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial'; + break; + case 'mapDiffuse': + json.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy ); + break; + case 'mapDiffuseRepeat': + case 'mapDiffuseOffset': + case 'mapDiffuseWrap': + case 'mapDiffuseAnisotropy': + break; + case 'mapEmissive': + json.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy ); + break; + case 'mapEmissiveRepeat': + case 'mapEmissiveOffset': + case 'mapEmissiveWrap': + case 'mapEmissiveAnisotropy': + break; + case 'mapLight': + json.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy ); + break; + case 'mapLightRepeat': + case 'mapLightOffset': + case 'mapLightWrap': + case 'mapLightAnisotropy': + break; + case 'mapAO': + json.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy ); + break; + case 'mapAORepeat': + case 'mapAOOffset': + case 'mapAOWrap': + case 'mapAOAnisotropy': + break; + case 'mapBump': + json.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy ); + break; + case 'mapBumpScale': + json.bumpScale = value; + break; + case 'mapBumpRepeat': + case 'mapBumpOffset': + case 'mapBumpWrap': + case 'mapBumpAnisotropy': + break; + case 'mapNormal': + json.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy ); + break; + case 'mapNormalFactor': + json.normalScale = value; + break; + case 'mapNormalRepeat': + case 'mapNormalOffset': + case 'mapNormalWrap': + case 'mapNormalAnisotropy': + break; + case 'mapSpecular': + json.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy ); + break; + case 'mapSpecularRepeat': + case 'mapSpecularOffset': + case 'mapSpecularWrap': + case 'mapSpecularAnisotropy': + break; + case 'mapMetalness': + json.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy ); + break; + case 'mapMetalnessRepeat': + case 'mapMetalnessOffset': + case 'mapMetalnessWrap': + case 'mapMetalnessAnisotropy': + break; + case 'mapRoughness': + json.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy ); + break; + case 'mapRoughnessRepeat': + case 'mapRoughnessOffset': + case 'mapRoughnessWrap': + case 'mapRoughnessAnisotropy': + break; + case 'mapAlpha': + json.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy ); + break; + case 'mapAlphaRepeat': + case 'mapAlphaOffset': + case 'mapAlphaWrap': + case 'mapAlphaAnisotropy': + break; + case 'flipSided': + json.side = BackSide; + break; + case 'doubleSided': + json.side = DoubleSide; + break; + case 'transparency': + console.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' ); + json.opacity = value; + break; + case 'depthTest': + case 'depthWrite': + case 'colorWrite': + case 'opacity': + case 'reflectivity': + case 'transparent': + case 'visible': + case 'wireframe': + json[ name ] = value; + break; + case 'vertexColors': + if ( value === true ) json.vertexColors = VertexColors; + if ( value === 'face' ) json.vertexColors = FaceColors; + break; + default: + console.error( 'THREE.Loader.createMaterial: Unsupported', name, value ); + break; + + } + + } + + if ( json.type === 'MeshBasicMaterial' ) delete json.emissive; + if ( json.type !== 'MeshPhongMaterial' ) delete json.specular; + + if ( json.opacity < 1 ) json.transparent = true; + + materialLoader.setTextures( textures ); + + return materialLoader.parse( json ); + + }; + + } )() + + } ); + + /** + * @author Don McCurdy / https://www.donmccurdy.com + */ + + var LoaderUtils = { + + decodeText: function ( 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. + + var s = ''; + + for ( var i = 0, il = array.length; i < il; i ++ ) { + + // Implicitly assumes little-endian. + s += String.fromCharCode( array[ i ] ); + + } + + // Merges multi-byte utf-8 characters. + return decodeURIComponent( escape( s ) ); + + }, + + extractUrlBase: function ( url ) { + + var index = url.lastIndexOf( '/' ); + + if ( index === - 1 ) return './'; + + return url.substr( 0, index + 1 ); + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function JSONLoader( manager ) { + + if ( typeof manager === 'boolean' ) { + + console.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' ); + manager = undefined; + + } + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + this.withCredentials = false; + + } + + Object.assign( JSONLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var texturePath = this.texturePath && ( typeof this.texturePath === 'string' ) ? this.texturePath : LoaderUtils.extractUrlBase( url ); + + var loader = new FileLoader( this.manager ); + loader.setWithCredentials( this.withCredentials ); + loader.load( url, function ( text ) { + + var json = JSON.parse( text ); + var metadata = json.metadata; + + if ( metadata !== undefined ) { + + var type = metadata.type; + + if ( type !== undefined ) { + + if ( type.toLowerCase() === 'object' ) { + + console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' ); + return; + + } + + } + + } + + var object = scope.parse( json, texturePath ); + onLoad( object.geometry, object.materials ); + + }, onProgress, onError ); + + }, + + setTexturePath: function ( value ) { + + this.texturePath = value; + + }, + + parse: ( function () { + + function parseModel( json, geometry ) { + + function isBitSet( value, position ) { + + return value & ( 1 << position ); + + } + + var i, j, fi, + + offset, zLength, + + colorIndex, normalIndex, uvIndex, materialIndex, + + type, + isQuad, + hasMaterial, + hasFaceVertexUv, + hasFaceNormal, hasFaceVertexNormal, + hasFaceColor, hasFaceVertexColor, + + vertex, face, faceA, faceB, hex, normal, + + uvLayer, uv, u, v, + + faces = json.faces, + vertices = json.vertices, + normals = json.normals, + colors = json.colors, + + scale = json.scale, + + nUvLayers = 0; + + + if ( json.uvs !== undefined ) { + + // disregard empty arrays + + for ( i = 0; i < json.uvs.length; i ++ ) { + + if ( json.uvs[ i ].length ) nUvLayers ++; + + } + + for ( i = 0; i < nUvLayers; i ++ ) { + + geometry.faceVertexUvs[ i ] = []; + + } + + } + + offset = 0; + zLength = vertices.length; + + while ( offset < zLength ) { + + vertex = new Vector3(); + + vertex.x = vertices[ offset ++ ] * scale; + vertex.y = vertices[ offset ++ ] * scale; + vertex.z = vertices[ offset ++ ] * scale; + + geometry.vertices.push( vertex ); + + } + + offset = 0; + zLength = faces.length; + + while ( offset < zLength ) { + + type = faces[ offset ++ ]; + + isQuad = isBitSet( type, 0 ); + hasMaterial = isBitSet( type, 1 ); + hasFaceVertexUv = isBitSet( type, 3 ); + hasFaceNormal = isBitSet( type, 4 ); + hasFaceVertexNormal = isBitSet( type, 5 ); + hasFaceColor = isBitSet( type, 6 ); + hasFaceVertexColor = isBitSet( type, 7 ); + + // console.log("type", type, "bits", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor); + + if ( isQuad ) { + + faceA = new Face3(); + faceA.a = faces[ offset ]; + faceA.b = faces[ offset + 1 ]; + faceA.c = faces[ offset + 3 ]; + + faceB = new Face3(); + faceB.a = faces[ offset + 1 ]; + faceB.b = faces[ offset + 2 ]; + faceB.c = faces[ offset + 3 ]; + + offset += 4; + + if ( hasMaterial ) { + + materialIndex = faces[ offset ++ ]; + faceA.materialIndex = materialIndex; + faceB.materialIndex = materialIndex; + + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length; + + if ( hasFaceVertexUv ) { + + for ( i = 0; i < nUvLayers; i ++ ) { + + uvLayer = json.uvs[ i ]; + + geometry.faceVertexUvs[ i ][ fi ] = []; + geometry.faceVertexUvs[ i ][ fi + 1 ] = []; + + for ( j = 0; j < 4; j ++ ) { + + uvIndex = faces[ offset ++ ]; + + u = uvLayer[ uvIndex * 2 ]; + v = uvLayer[ uvIndex * 2 + 1 ]; + + uv = new Vector2( u, v ); + + if ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv ); + if ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv ); + + } + + } + + } + + if ( hasFaceNormal ) { + + normalIndex = faces[ offset ++ ] * 3; + + faceA.normal.set( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + faceB.normal.copy( faceA.normal ); + + } + + if ( hasFaceVertexNormal ) { + + for ( i = 0; i < 4; i ++ ) { + + normalIndex = faces[ offset ++ ] * 3; + + normal = new Vector3( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + + if ( i !== 2 ) faceA.vertexNormals.push( normal ); + if ( i !== 0 ) faceB.vertexNormals.push( normal ); + + } + + } + + + if ( hasFaceColor ) { + + colorIndex = faces[ offset ++ ]; + hex = colors[ colorIndex ]; + + faceA.color.setHex( hex ); + faceB.color.setHex( hex ); + + } + + + if ( hasFaceVertexColor ) { + + for ( i = 0; i < 4; i ++ ) { + + colorIndex = faces[ offset ++ ]; + hex = colors[ colorIndex ]; + + if ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) ); + if ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) ); + + } + + } + + geometry.faces.push( faceA ); + geometry.faces.push( faceB ); + + } else { + + face = new Face3(); + face.a = faces[ offset ++ ]; + face.b = faces[ offset ++ ]; + face.c = faces[ offset ++ ]; + + if ( hasMaterial ) { + + materialIndex = faces[ offset ++ ]; + face.materialIndex = materialIndex; + + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length; + + if ( hasFaceVertexUv ) { + + for ( i = 0; i < nUvLayers; i ++ ) { + + uvLayer = json.uvs[ i ]; + + geometry.faceVertexUvs[ i ][ fi ] = []; + + for ( j = 0; j < 3; j ++ ) { + + uvIndex = faces[ offset ++ ]; + + u = uvLayer[ uvIndex * 2 ]; + v = uvLayer[ uvIndex * 2 + 1 ]; + + uv = new Vector2( u, v ); + + geometry.faceVertexUvs[ i ][ fi ].push( uv ); + + } + + } + + } + + if ( hasFaceNormal ) { + + normalIndex = faces[ offset ++ ] * 3; + + face.normal.set( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + } + + if ( hasFaceVertexNormal ) { + + for ( i = 0; i < 3; i ++ ) { + + normalIndex = faces[ offset ++ ] * 3; + + normal = new Vector3( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + face.vertexNormals.push( normal ); + + } + + } + + + if ( hasFaceColor ) { + + colorIndex = faces[ offset ++ ]; + face.color.setHex( colors[ colorIndex ] ); + + } + + + if ( hasFaceVertexColor ) { + + for ( i = 0; i < 3; i ++ ) { + + colorIndex = faces[ offset ++ ]; + face.vertexColors.push( new Color( colors[ colorIndex ] ) ); + + } + + } + + geometry.faces.push( face ); + + } + + } + + } + + function parseSkin( json, geometry ) { + + var influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2; + + if ( json.skinWeights ) { + + for ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) { + + var x = json.skinWeights[ i ]; + var y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0; + var z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0; + var w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0; + + geometry.skinWeights.push( new Vector4( x, y, z, w ) ); + + } + + } + + if ( json.skinIndices ) { + + for ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) { + + var a = json.skinIndices[ i ]; + var b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0; + var c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0; + var d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0; + + geometry.skinIndices.push( new Vector4( a, b, c, d ) ); + + } + + } + + geometry.bones = json.bones; + + if ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) { + + console.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' + + geometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' ); + + } + + } + + function parseMorphing( json, geometry ) { + + var scale = json.scale; + + if ( json.morphTargets !== undefined ) { + + for ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) { + + geometry.morphTargets[ i ] = {}; + geometry.morphTargets[ i ].name = json.morphTargets[ i ].name; + geometry.morphTargets[ i ].vertices = []; + + var dstVertices = geometry.morphTargets[ i ].vertices; + var srcVertices = json.morphTargets[ i ].vertices; + + for ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) { + + var vertex = new Vector3(); + vertex.x = srcVertices[ v ] * scale; + vertex.y = srcVertices[ v + 1 ] * scale; + vertex.z = srcVertices[ v + 2 ] * scale; + + dstVertices.push( vertex ); + + } + + } + + } + + if ( json.morphColors !== undefined && json.morphColors.length > 0 ) { + + console.warn( 'THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.' ); + + var faces = geometry.faces; + var morphColors = json.morphColors[ 0 ].colors; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + faces[ i ].color.fromArray( morphColors, i * 3 ); + + } + + } + + } + + function parseAnimations( json, geometry ) { + + var outputAnimations = []; + + // parse old style Bone/Hierarchy animations + var animations = []; + + if ( json.animation !== undefined ) { + + animations.push( json.animation ); + + } + + if ( json.animations !== undefined ) { + + if ( json.animations.length ) { + + animations = animations.concat( json.animations ); + + } else { + + animations.push( json.animations ); + + } + + } + + for ( var i = 0; i < animations.length; i ++ ) { + + var clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones ); + if ( clip ) outputAnimations.push( clip ); + + } + + // parse implicit morph animations + if ( geometry.morphTargets ) { + + // TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary. + var morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 ); + outputAnimations = outputAnimations.concat( morphAnimationClips ); + + } + + if ( outputAnimations.length > 0 ) geometry.animations = outputAnimations; + + } + + return function parse( json, texturePath ) { + + if ( json.data !== undefined ) { + + // Geometry 4.0 spec + json = json.data; + + } + + if ( json.scale !== undefined ) { + + json.scale = 1.0 / json.scale; + + } else { + + json.scale = 1.0; + + } + + var geometry = new Geometry(); + + parseModel( json, geometry ); + parseSkin( json, geometry ); + parseMorphing( json, geometry ); + parseAnimations( json, geometry ); + + geometry.computeFaceNormals(); + geometry.computeBoundingSphere(); + + if ( json.materials === undefined || json.materials.length === 0 ) { + + return { geometry: geometry }; + + } else { + + var materials = Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin ); + + return { geometry: geometry, materials: materials }; + + } + + }; + + } )() + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ObjectLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + this.texturePath = ''; + + } + + Object.assign( ObjectLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + if ( this.texturePath === '' ) { + + this.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 ); + + } + + var scope = this; + + var loader = new FileLoader( scope.manager ); + loader.load( url, function ( text ) { + + var json = null; + + try { + + json = JSON.parse( text ); + + } catch ( error ) { + + if ( onError !== undefined ) onError( error ); + + console.error( 'THREE:ObjectLoader: Can\'t parse ' + url + '.', error.message ); + + return; + + } + + var metadata = json.metadata; + + if ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) { + + console.error( 'THREE.ObjectLoader: Can\'t load ' + url + '. Use THREE.JSONLoader instead.' ); + return; + + } + + scope.parse( json, onLoad ); + + }, onProgress, onError ); + + }, + + setTexturePath: function ( value ) { + + this.texturePath = value; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + }, + + parse: function ( json, onLoad ) { + + var shapes = this.parseShape( json.shapes ); + var geometries = this.parseGeometries( json.geometries, shapes ); + + var images = this.parseImages( json.images, function () { + + if ( onLoad !== undefined ) onLoad( object ); + + } ); + + var textures = this.parseTextures( json.textures, images ); + var materials = this.parseMaterials( json.materials, textures ); + + var object = this.parseObject( json.object, geometries, materials ); + + if ( json.animations ) { + + object.animations = this.parseAnimations( json.animations ); + + } + + if ( json.images === undefined || json.images.length === 0 ) { + + if ( onLoad !== undefined ) onLoad( object ); + + } + + return object; + + }, + + parseShape: function ( json ) { + + var shapes = {}; + + if ( json !== undefined ) { + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var shape = new Shape().fromJSON( json[ i ] ); + + shapes[ shape.uuid ] = shape; + + } + + } + + return shapes; + + }, + + parseGeometries: function ( json, shapes ) { + + var geometries = {}; + + if ( json !== undefined ) { + + var geometryLoader = new JSONLoader(); + var bufferGeometryLoader = new BufferGeometryLoader(); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var geometry; + var data = json[ i ]; + + switch ( data.type ) { + + case 'PlaneGeometry': + case 'PlaneBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.width, + data.height, + data.widthSegments, + data.heightSegments + ); + + break; + + case 'BoxGeometry': + case 'BoxBufferGeometry': + case 'CubeGeometry': // backwards compatible + + geometry = new Geometries[ data.type ]( + data.width, + data.height, + data.depth, + data.widthSegments, + data.heightSegments, + data.depthSegments + ); + + break; + + case 'CircleGeometry': + case 'CircleBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.segments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'CylinderGeometry': + case 'CylinderBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radiusTop, + data.radiusBottom, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'ConeGeometry': + case 'ConeBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'SphereGeometry': + case 'SphereBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.widthSegments, + data.heightSegments, + data.phiStart, + data.phiLength, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'DodecahedronGeometry': + case 'DodecahedronBufferGeometry': + case 'IcosahedronGeometry': + case 'IcosahedronBufferGeometry': + case 'OctahedronGeometry': + case 'OctahedronBufferGeometry': + case 'TetrahedronGeometry': + case 'TetrahedronBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.detail + ); + + break; + + case 'RingGeometry': + case 'RingBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.innerRadius, + data.outerRadius, + data.thetaSegments, + data.phiSegments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'TorusGeometry': + case 'TorusBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.tube, + data.radialSegments, + data.tubularSegments, + data.arc + ); + + break; + + case 'TorusKnotGeometry': + case 'TorusKnotBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.tube, + data.tubularSegments, + data.radialSegments, + data.p, + data.q + ); + + break; + + case 'LatheGeometry': + case 'LatheBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.points, + data.segments, + data.phiStart, + data.phiLength + ); + + break; + + case 'PolyhedronGeometry': + case 'PolyhedronBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.vertices, + data.indices, + data.radius, + data.details + ); + + break; + + case 'ShapeGeometry': + case 'ShapeBufferGeometry': + + var geometryShapes = []; + + for ( var j = 0, jl = data.shapes.length; j < jl; j ++ ) { + + var shape = shapes[ data.shapes[ j ] ]; + + geometryShapes.push( shape ); + + } + + geometry = new Geometries[ data.type ]( + geometryShapes, + data.curveSegments + ); + + break; + + case 'BufferGeometry': + + geometry = bufferGeometryLoader.parse( data ); + + break; + + case 'Geometry': + + geometry = geometryLoader.parse( data, this.texturePath ).geometry; + + break; + + default: + + console.warn( 'THREE.ObjectLoader: Unsupported geometry type "' + data.type + '"' ); + + continue; + + } + + geometry.uuid = data.uuid; + + if ( data.name !== undefined ) geometry.name = data.name; + + geometries[ data.uuid ] = geometry; + + } + + } + + return geometries; + + }, + + parseMaterials: function ( json, textures ) { + + var materials = {}; + + if ( json !== undefined ) { + + var loader = new MaterialLoader(); + loader.setTextures( textures ); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var data = json[ i ]; + + if ( data.type === 'MultiMaterial' ) { + + // Deprecated + + var array = []; + + for ( var j = 0; j < data.materials.length; j ++ ) { + + array.push( loader.parse( data.materials[ j ] ) ); + + } + + materials[ data.uuid ] = array; + + } else { + + materials[ data.uuid ] = loader.parse( data ); + + } + + } + + } + + return materials; + + }, + + parseAnimations: function ( json ) { + + var animations = []; + + for ( var i = 0; i < json.length; i ++ ) { + + var clip = AnimationClip.parse( json[ i ] ); + + animations.push( clip ); + + } + + return animations; + + }, + + parseImages: function ( json, onLoad ) { + + var scope = this; + var images = {}; + + function loadImage( url ) { + + scope.manager.itemStart( url ); + + return loader.load( url, function () { + + scope.manager.itemEnd( url ); + + }, undefined, function () { + + scope.manager.itemEnd( url ); + scope.manager.itemError( url ); + + } ); + + } + + if ( json !== undefined && json.length > 0 ) { + + var manager = new LoadingManager( onLoad ); + + var loader = new ImageLoader( manager ); + loader.setCrossOrigin( this.crossOrigin ); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var image = json[ i ]; + var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url; + + images[ image.uuid ] = loadImage( path ); + + } + + } + + return images; + + }, + + parseTextures: function ( json, images ) { + + function parseConstant( value, type ) { + + if ( typeof value === 'number' ) return value; + + console.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value ); + + return type[ value ]; + + } + + var textures = {}; + + if ( json !== undefined ) { + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var data = json[ i ]; + + if ( data.image === undefined ) { + + console.warn( 'THREE.ObjectLoader: No "image" specified for', data.uuid ); + + } + + if ( images[ data.image ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined image', data.image ); + + } + + var texture = new Texture( images[ data.image ] ); + texture.needsUpdate = true; + + texture.uuid = data.uuid; + + if ( data.name !== undefined ) texture.name = data.name; + + if ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING ); + + if ( data.offset !== undefined ) texture.offset.fromArray( data.offset ); + if ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat ); + if ( data.center !== undefined ) texture.center.fromArray( data.center ); + if ( data.rotation !== undefined ) texture.rotation = data.rotation; + + if ( data.wrap !== undefined ) { + + texture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING ); + texture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING ); + + } + + if ( data.format !== undefined ) texture.format = data.format; + + if ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER ); + if ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER ); + if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy; + + if ( data.flipY !== undefined ) texture.flipY = data.flipY; + + textures[ data.uuid ] = texture; + + } + + } + + return textures; + + }, + + parseObject: function ( data, geometries, materials ) { + + var object; + + function getGeometry( name ) { + + if ( geometries[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined geometry', name ); + + } + + return geometries[ name ]; + + } + + function getMaterial( name ) { + + if ( name === undefined ) return undefined; + + if ( Array.isArray( name ) ) { + + var array = []; + + for ( var i = 0, l = name.length; i < l; i ++ ) { + + var uuid = name[ i ]; + + if ( materials[ uuid ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', uuid ); + + } + + array.push( materials[ uuid ] ); + + } + + return array; + + } + + if ( materials[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', name ); + + } + + return materials[ name ]; + + } + + switch ( data.type ) { + + case 'Scene': + + object = new Scene(); + + if ( data.background !== undefined ) { + + if ( Number.isInteger( data.background ) ) { + + object.background = new Color( data.background ); + + } + + } + + if ( data.fog !== undefined ) { + + if ( data.fog.type === 'Fog' ) { + + object.fog = new Fog( data.fog.color, data.fog.near, data.fog.far ); + + } else if ( data.fog.type === 'FogExp2' ) { + + object.fog = new FogExp2( data.fog.color, data.fog.density ); + + } + + } + + break; + + case 'PerspectiveCamera': + + object = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far ); + + if ( data.focus !== undefined ) object.focus = data.focus; + if ( data.zoom !== undefined ) object.zoom = data.zoom; + if ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge; + if ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset; + if ( data.view !== undefined ) object.view = Object.assign( {}, data.view ); + + break; + + case 'OrthographicCamera': + + object = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far ); + + if ( data.zoom !== undefined ) object.zoom = data.zoom; + if ( data.view !== undefined ) object.view = Object.assign( {}, data.view ); + + break; + + case 'AmbientLight': + + object = new AmbientLight( data.color, data.intensity ); + + break; + + case 'DirectionalLight': + + object = new DirectionalLight( data.color, data.intensity ); + + break; + + case 'PointLight': + + object = new PointLight( data.color, data.intensity, data.distance, data.decay ); + + break; + + case 'RectAreaLight': + + object = new RectAreaLight( data.color, data.intensity, data.width, data.height ); + + break; + + case 'SpotLight': + + object = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay ); + + break; + + case 'HemisphereLight': + + object = new HemisphereLight( data.color, data.groundColor, data.intensity ); + + break; + + case 'SkinnedMesh': + + console.warn( 'THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.' ); + + case 'Mesh': + + var geometry = getGeometry( data.geometry ); + var material = getMaterial( data.material ); + + if ( geometry.bones && geometry.bones.length > 0 ) { + + object = new SkinnedMesh( geometry, material ); + + } else { + + object = new Mesh( geometry, material ); + + } + + break; + + case 'LOD': + + object = new LOD(); + + break; + + case 'Line': + + object = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode ); + + break; + + case 'LineLoop': + + object = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'LineSegments': + + object = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'PointCloud': + case 'Points': + + object = new Points( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'Sprite': + + object = new Sprite( getMaterial( data.material ) ); + + break; + + case 'Group': + + object = new Group(); + + break; + + default: + + object = new Object3D(); + + } + + object.uuid = data.uuid; + + if ( data.name !== undefined ) object.name = data.name; + + if ( data.matrix !== undefined ) { + + object.matrix.fromArray( data.matrix ); + + if ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate; + if ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale ); + + } else { + + if ( data.position !== undefined ) object.position.fromArray( data.position ); + if ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation ); + if ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion ); + if ( data.scale !== undefined ) object.scale.fromArray( data.scale ); + + } + + if ( data.castShadow !== undefined ) object.castShadow = data.castShadow; + if ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow; + + if ( data.shadow ) { + + if ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias; + if ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius; + if ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize ); + if ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera ); + + } + + if ( data.visible !== undefined ) object.visible = data.visible; + if ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled; + if ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder; + if ( data.userData !== undefined ) object.userData = data.userData; + + if ( data.children !== undefined ) { + + var children = data.children; + + for ( var i = 0; i < children.length; i ++ ) { + + object.add( this.parseObject( children[ i ], geometries, materials ) ); + + } + + } + + if ( data.type === 'LOD' ) { + + var levels = data.levels; + + for ( var l = 0; l < levels.length; l ++ ) { + + var level = levels[ l ]; + var child = object.getObjectByProperty( 'uuid', level.object ); + + if ( child !== undefined ) { + + object.addLevel( child, level.distance ); + + } + + } + + } + + return object; + + } + + } ); + + var TEXTURE_MAPPING = { + UVMapping: UVMapping, + CubeReflectionMapping: CubeReflectionMapping, + CubeRefractionMapping: CubeRefractionMapping, + EquirectangularReflectionMapping: EquirectangularReflectionMapping, + EquirectangularRefractionMapping: EquirectangularRefractionMapping, + SphericalReflectionMapping: SphericalReflectionMapping, + CubeUVReflectionMapping: CubeUVReflectionMapping, + CubeUVRefractionMapping: CubeUVRefractionMapping + }; + + var TEXTURE_WRAPPING = { + RepeatWrapping: RepeatWrapping, + ClampToEdgeWrapping: ClampToEdgeWrapping, + MirroredRepeatWrapping: MirroredRepeatWrapping + }; + + var TEXTURE_FILTER = { + NearestFilter: NearestFilter, + NearestMipMapNearestFilter: NearestMipMapNearestFilter, + NearestMipMapLinearFilter: NearestMipMapLinearFilter, + LinearFilter: LinearFilter, + LinearMipMapNearestFilter: LinearMipMapNearestFilter, + LinearMipMapLinearFilter: LinearMipMapLinearFilter + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * minimal class for proxing functions to Path. Replaces old "extractSubpaths()" + **/ + + function ShapePath() { + + this.type = 'ShapePath'; + + this.color = new Color(); + + this.subPaths = []; + this.currentPath = null; + + } + + Object.assign( ShapePath.prototype, { + + moveTo: function ( x, y ) { + + this.currentPath = new Path(); + this.subPaths.push( this.currentPath ); + this.currentPath.moveTo( x, y ); + + }, + + lineTo: function ( x, y ) { + + this.currentPath.lineTo( x, y ); + + }, + + quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) { + + this.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY ); + + }, + + bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + + this.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ); + + }, + + splineThru: function ( pts ) { + + this.currentPath.splineThru( pts ); + + }, + + toShapes: function ( isCCW, noHoles ) { + + function toShapesNoHoles( inSubpaths ) { + + var shapes = []; + + for ( var i = 0, l = inSubpaths.length; i < l; i ++ ) { + + var tmpPath = inSubpaths[ i ]; + + var tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + + shapes.push( tmpShape ); + + } + + return shapes; + + } + + function isPointInsidePolygon( inPt, inPolygon ) { + + var polyLen = inPolygon.length; + + // inPt on polygon contour => immediate success or + // toggling of inside/outside at every single! intersection point of an edge + // with the horizontal line through inPt, left of inPt + // not counting lowerY endpoints of edges and whole edges on that line + var inside = false; + for ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) { + + var edgeLowPt = inPolygon[ p ]; + var edgeHighPt = inPolygon[ q ]; + + var edgeDx = edgeHighPt.x - edgeLowPt.x; + var edgeDy = edgeHighPt.y - edgeLowPt.y; + + if ( Math.abs( edgeDy ) > Number.EPSILON ) { + + // not parallel + if ( edgeDy < 0 ) { + + edgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx; + edgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy; + + } + if ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) continue; + + if ( inPt.y === edgeLowPt.y ) { + + if ( inPt.x === edgeLowPt.x ) return true; // inPt is on contour ? + // continue; // no intersection or edgeLowPt => doesn't count !!! + + } else { + + var perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y ); + if ( perpEdge === 0 ) return true; // inPt is on contour ? + if ( perpEdge < 0 ) continue; + inside = ! inside; // true intersection left of inPt + + } + + } else { + + // parallel or collinear + if ( inPt.y !== edgeLowPt.y ) continue; // parallel + // edge lies on the same horizontal line as inPt + if ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) || + ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) ) return true; // inPt: Point on contour ! + // continue; + + } + + } + + return inside; + + } + + var isClockWise = ShapeUtils.isClockWise; + + var subPaths = this.subPaths; + if ( subPaths.length === 0 ) return []; + + if ( noHoles === true ) return toShapesNoHoles( subPaths ); + + + var solid, tmpPath, tmpShape, shapes = []; + + if ( subPaths.length === 1 ) { + + tmpPath = subPaths[ 0 ]; + tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + shapes.push( tmpShape ); + return shapes; + + } + + var holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() ); + holesFirst = isCCW ? ! holesFirst : holesFirst; + + // console.log("Holes first", holesFirst); + + var betterShapeHoles = []; + var newShapes = []; + var newShapeHoles = []; + var mainIdx = 0; + var tmpPoints; + + newShapes[ mainIdx ] = undefined; + newShapeHoles[ mainIdx ] = []; + + for ( var i = 0, l = subPaths.length; i < l; i ++ ) { + + tmpPath = subPaths[ i ]; + tmpPoints = tmpPath.getPoints(); + solid = isClockWise( tmpPoints ); + solid = isCCW ? ! solid : solid; + + if ( solid ) { + + if ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) ) mainIdx ++; + + newShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints }; + newShapes[ mainIdx ].s.curves = tmpPath.curves; + + if ( holesFirst ) mainIdx ++; + newShapeHoles[ mainIdx ] = []; + + //console.log('cw', i); + + } else { + + newShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } ); + + //console.log('ccw', i); + + } + + } + + // only Holes? -> probably all Shapes with wrong orientation + if ( ! newShapes[ 0 ] ) return toShapesNoHoles( subPaths ); + + + if ( newShapes.length > 1 ) { + + var ambiguous = false; + var toChange = []; + + for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + betterShapeHoles[ sIdx ] = []; + + } + + for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + var sho = newShapeHoles[ sIdx ]; + + for ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) { + + var ho = sho[ hIdx ]; + var hole_unassigned = true; + + for ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) { + + if ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) { + + if ( sIdx !== s2Idx ) toChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } ); + if ( hole_unassigned ) { + + hole_unassigned = false; + betterShapeHoles[ s2Idx ].push( ho ); + + } else { + + ambiguous = true; + + } + + } + + } + if ( hole_unassigned ) { + + betterShapeHoles[ sIdx ].push( ho ); + + } + + } + + } + // console.log("ambiguous: ", ambiguous); + if ( toChange.length > 0 ) { + + // console.log("to change: ", toChange); + if ( ! ambiguous ) newShapeHoles = betterShapeHoles; + + } + + } + + var tmpHoles; + + for ( var i = 0, il = newShapes.length; i < il; i ++ ) { + + tmpShape = newShapes[ i ].s; + shapes.push( tmpShape ); + tmpHoles = newShapeHoles[ i ]; + + for ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) { + + tmpShape.holes.push( tmpHoles[ j ].h ); + + } + + } + + //console.log("shape", shapes); + + return shapes; + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author mrdoob / http://mrdoob.com/ + */ + + function Font( data ) { + + this.type = 'Font'; + + this.data = data; + + } + + Object.assign( Font.prototype, { + + isFont: true, + + generateShapes: function ( text, size, divisions ) { + + if ( size === undefined ) size = 100; + if ( divisions === undefined ) divisions = 4; + + var shapes = []; + var paths = createPaths( text, size, divisions, this.data ); + + for ( var p = 0, pl = paths.length; p < pl; p ++ ) { + + Array.prototype.push.apply( shapes, paths[ p ].toShapes() ); + + } + + return shapes; + + } + + } ); + + function createPaths( text, size, divisions, data ) { + + var chars = String( text ).split( '' ); + var scale = size / data.resolution; + var line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale; + + var paths = []; + + var offsetX = 0, offsetY = 0; + + for ( var i = 0; i < chars.length; i ++ ) { + + var char = chars[ i ]; + + if ( char === '\n' ) { + + offsetX = 0; + offsetY -= line_height; + + } else { + + var ret = createPath( char, divisions, scale, offsetX, offsetY, data ); + offsetX += ret.offsetX; + paths.push( ret.path ); + + } + + } + + return paths; + + } + + function createPath( char, divisions, scale, offsetX, offsetY, data ) { + + var glyph = data.glyphs[ char ] || data.glyphs[ '?' ]; + + if ( ! glyph ) return; + + var path = new ShapePath(); + + var x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2; + + if ( glyph.o ) { + + var outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) ); + + for ( var i = 0, l = outline.length; i < l; ) { + + var action = outline[ i ++ ]; + + switch ( action ) { + + case 'm': // moveTo + + x = outline[ i ++ ] * scale + offsetX; + y = outline[ i ++ ] * scale + offsetY; + + path.moveTo( x, y ); + + break; + + case 'l': // lineTo + + x = outline[ i ++ ] * scale + offsetX; + y = outline[ i ++ ] * scale + offsetY; + + path.lineTo( x, y ); + + break; + + case 'q': // quadraticCurveTo + + cpx = outline[ i ++ ] * scale + offsetX; + cpy = outline[ i ++ ] * scale + offsetY; + cpx1 = outline[ i ++ ] * scale + offsetX; + cpy1 = outline[ i ++ ] * scale + offsetY; + + path.quadraticCurveTo( cpx1, cpy1, cpx, cpy ); + + break; + + case 'b': // bezierCurveTo + + 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; + + path.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy ); + + break; + + } + + } + + } + + return { offsetX: glyph.ha * scale, path: path }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function FontLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( FontLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new FileLoader( this.manager ); + loader.setPath( this.path ); + loader.load( url, function ( text ) { + + var json; + + try { + + json = JSON.parse( text ); + + } catch ( e ) { + + console.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' ); + json = JSON.parse( text.substring( 65, text.length - 2 ) ); + + } + + var font = scope.parse( json ); + + if ( onLoad ) onLoad( font ); + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + return new Font( json ); + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var context; + + var AudioContext = { + + getContext: function () { + + if ( context === undefined ) { + + context = new ( window.AudioContext || window.webkitAudioContext )(); + + } + + return context; + + }, + + setContext: function ( value ) { + + context = value; + + } + + }; + + /** + * @author Reece Aaron Lecrivain / http://reecenotes.com/ + */ + + function AudioLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( AudioLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var loader = new FileLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + loader.load( url, function ( buffer ) { + + var context = AudioContext.getContext(); + + context.decodeAudioData( buffer, function ( audioBuffer ) { + + onLoad( audioBuffer ); + + } ); + + }, onProgress, onError ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function StereoCamera() { + + this.type = 'StereoCamera'; + + this.aspect = 1; + + this.eyeSep = 0.064; + + this.cameraL = new PerspectiveCamera(); + this.cameraL.layers.enable( 1 ); + this.cameraL.matrixAutoUpdate = false; + + this.cameraR = new PerspectiveCamera(); + this.cameraR.layers.enable( 2 ); + this.cameraR.matrixAutoUpdate = false; + + } + + Object.assign( StereoCamera.prototype, { + + update: ( function () { + + var instance, focus, fov, aspect, near, far, zoom, eyeSep; + + var eyeRight = new Matrix4(); + var eyeLeft = new Matrix4(); + + return function update( camera ) { + + var needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov || + aspect !== camera.aspect * this.aspect || near !== camera.near || + far !== camera.far || zoom !== camera.zoom || eyeSep !== this.eyeSep; + + if ( needsUpdate ) { + + instance = this; + focus = camera.focus; + fov = camera.fov; + aspect = camera.aspect * this.aspect; + near = camera.near; + far = camera.far; + zoom = camera.zoom; + + // Off-axis stereoscopic effect based on + // http://paulbourke.net/stereographics/stereorender/ + + var projectionMatrix = camera.projectionMatrix.clone(); + eyeSep = this.eyeSep / 2; + var eyeSepOnProjection = eyeSep * near / focus; + var ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom; + var xmin, xmax; + + // translate xOffset + + eyeLeft.elements[ 12 ] = - eyeSep; + eyeRight.elements[ 12 ] = eyeSep; + + // 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 ); + + this.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 ); + + this.cameraR.projectionMatrix.copy( projectionMatrix ); + + } + + this.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft ); + this.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight ); + + }; + + } )() + + } ); + + /** + * Camera for rendering cube maps + * - renders scene into axis-aligned cube + * + * @author alteredq / http://alteredqualia.com/ + */ + + function CubeCamera( near, far, cubeResolution ) { + + Object3D.call( this ); + + this.type = 'CubeCamera'; + + var fov = 90, aspect = 1; + + var cameraPX = new PerspectiveCamera( fov, aspect, near, far ); + cameraPX.up.set( 0, - 1, 0 ); + cameraPX.lookAt( new Vector3( 1, 0, 0 ) ); + this.add( cameraPX ); + + var cameraNX = new PerspectiveCamera( fov, aspect, near, far ); + cameraNX.up.set( 0, - 1, 0 ); + cameraNX.lookAt( new Vector3( - 1, 0, 0 ) ); + this.add( cameraNX ); + + var cameraPY = new PerspectiveCamera( fov, aspect, near, far ); + cameraPY.up.set( 0, 0, 1 ); + cameraPY.lookAt( new Vector3( 0, 1, 0 ) ); + this.add( cameraPY ); + + var cameraNY = new PerspectiveCamera( fov, aspect, near, far ); + cameraNY.up.set( 0, 0, - 1 ); + cameraNY.lookAt( new Vector3( 0, - 1, 0 ) ); + this.add( cameraNY ); + + var cameraPZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraPZ.up.set( 0, - 1, 0 ); + cameraPZ.lookAt( new Vector3( 0, 0, 1 ) ); + this.add( cameraPZ ); + + var cameraNZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraNZ.up.set( 0, - 1, 0 ); + cameraNZ.lookAt( new Vector3( 0, 0, - 1 ) ); + this.add( cameraNZ ); + + var options = { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter }; + + this.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options ); + this.renderTarget.texture.name = "CubeCamera"; + + this.update = function ( renderer, scene ) { + + if ( this.parent === null ) this.updateMatrixWorld(); + + var renderTarget = this.renderTarget; + var generateMipmaps = renderTarget.texture.generateMipmaps; + + renderTarget.texture.generateMipmaps = false; + + renderTarget.activeCubeFace = 0; + renderer.render( scene, cameraPX, renderTarget ); + + renderTarget.activeCubeFace = 1; + renderer.render( scene, cameraNX, renderTarget ); + + renderTarget.activeCubeFace = 2; + renderer.render( scene, cameraPY, renderTarget ); + + renderTarget.activeCubeFace = 3; + renderer.render( scene, cameraNY, renderTarget ); + + renderTarget.activeCubeFace = 4; + renderer.render( scene, cameraPZ, renderTarget ); + + renderTarget.texture.generateMipmaps = generateMipmaps; + + renderTarget.activeCubeFace = 5; + renderer.render( scene, cameraNZ, renderTarget ); + + renderer.setRenderTarget( null ); + + }; + + this.clear = function ( renderer, color, depth, stencil ) { + + var renderTarget = this.renderTarget; + + for ( var i = 0; i < 6; i ++ ) { + + renderTarget.activeCubeFace = i; + renderer.setRenderTarget( renderTarget ); + + renderer.clear( color, depth, stencil ); + + } + + renderer.setRenderTarget( null ); + + }; + + } + + CubeCamera.prototype = Object.create( Object3D.prototype ); + CubeCamera.prototype.constructor = CubeCamera; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AudioListener() { + + Object3D.call( this ); + + this.type = 'AudioListener'; + + this.context = AudioContext.getContext(); + + this.gain = this.context.createGain(); + this.gain.connect( this.context.destination ); + + this.filter = null; + + } + + AudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: AudioListener, + + getInput: function () { + + return this.gain; + + }, + + removeFilter: function ( ) { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + this.gain.connect( this.context.destination ); + this.filter = null; + + } + + }, + + getFilter: function () { + + return this.filter; + + }, + + setFilter: function ( value ) { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + + } else { + + this.gain.disconnect( this.context.destination ); + + } + + this.filter = value; + this.gain.connect( this.filter ); + this.filter.connect( this.context.destination ); + + }, + + getMasterVolume: function () { + + return this.gain.gain.value; + + }, + + setMasterVolume: function ( value ) { + + this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 ); + + }, + + updateMatrixWorld: ( function () { + + var position = new Vector3(); + var quaternion = new Quaternion(); + var scale = new Vector3(); + + var orientation = new Vector3(); + + return function updateMatrixWorld( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + var listener = this.context.listener; + var up = this.up; + + this.matrixWorld.decompose( position, quaternion, scale ); + + orientation.set( 0, 0, - 1 ).applyQuaternion( quaternion ); + + if ( listener.positionX ) { + + listener.positionX.setValueAtTime( position.x, this.context.currentTime ); + listener.positionY.setValueAtTime( position.y, this.context.currentTime ); + listener.positionZ.setValueAtTime( position.z, this.context.currentTime ); + listener.forwardX.setValueAtTime( orientation.x, this.context.currentTime ); + listener.forwardY.setValueAtTime( orientation.y, this.context.currentTime ); + listener.forwardZ.setValueAtTime( orientation.z, this.context.currentTime ); + listener.upX.setValueAtTime( up.x, this.context.currentTime ); + listener.upY.setValueAtTime( up.y, this.context.currentTime ); + listener.upZ.setValueAtTime( up.z, this.context.currentTime ); + + } else { + + listener.setPosition( position.x, position.y, position.z ); + listener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z ); + + } + + }; + + } )() + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Reece Aaron Lecrivain / http://reecenotes.com/ + */ + + function Audio( listener ) { + + Object3D.call( this ); + + this.type = 'Audio'; + + this.context = listener.context; + + this.gain = this.context.createGain(); + this.gain.connect( listener.getInput() ); + + this.autoplay = false; + + this.buffer = null; + this.loop = false; + this.startTime = 0; + this.offset = 0; + this.playbackRate = 1; + this.isPlaying = false; + this.hasPlaybackControl = true; + this.sourceType = 'empty'; + + this.filters = []; + + } + + Audio.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Audio, + + getOutput: function () { + + return this.gain; + + }, + + setNodeSource: function ( audioNode ) { + + this.hasPlaybackControl = false; + this.sourceType = 'audioNode'; + this.source = audioNode; + this.connect(); + + return this; + + }, + + setBuffer: function ( audioBuffer ) { + + this.buffer = audioBuffer; + this.sourceType = 'buffer'; + + if ( this.autoplay ) this.play(); + + return this; + + }, + + play: function () { + + if ( this.isPlaying === true ) { + + console.warn( 'THREE.Audio: Audio is already playing.' ); + return; + + } + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + var source = this.context.createBufferSource(); + + source.buffer = this.buffer; + source.loop = this.loop; + source.onended = this.onEnded.bind( this ); + source.playbackRate.setValueAtTime( this.playbackRate, this.startTime ); + this.startTime = this.context.currentTime; + source.start( this.startTime, this.offset ); + + this.isPlaying = true; + + this.source = source; + + return this.connect(); + + }, + + pause: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + if ( this.isPlaying === true ) { + + this.source.stop(); + this.offset += ( this.context.currentTime - this.startTime ) * this.playbackRate; + this.isPlaying = false; + + } + + return this; + + }, + + stop: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.source.stop(); + this.offset = 0; + this.isPlaying = false; + + return this; + + }, + + connect: function () { + + if ( this.filters.length > 0 ) { + + this.source.connect( this.filters[ 0 ] ); + + for ( var i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].connect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].connect( this.getOutput() ); + + } else { + + this.source.connect( this.getOutput() ); + + } + + return this; + + }, + + disconnect: function () { + + if ( this.filters.length > 0 ) { + + this.source.disconnect( this.filters[ 0 ] ); + + for ( var i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].disconnect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].disconnect( this.getOutput() ); + + } else { + + this.source.disconnect( this.getOutput() ); + + } + + return this; + + }, + + getFilters: function () { + + return this.filters; + + }, + + setFilters: function ( value ) { + + if ( ! value ) value = []; + + if ( this.isPlaying === true ) { + + this.disconnect(); + this.filters = value; + this.connect(); + + } else { + + this.filters = value; + + } + + return this; + + }, + + getFilter: function () { + + return this.getFilters()[ 0 ]; + + }, + + setFilter: function ( filter ) { + + return this.setFilters( filter ? [ filter ] : [] ); + + }, + + setPlaybackRate: function ( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.playbackRate = value; + + if ( this.isPlaying === true ) { + + this.source.playbackRate.setValueAtTime( this.playbackRate, this.context.currentTime ); + + } + + return this; + + }, + + getPlaybackRate: function () { + + return this.playbackRate; + + }, + + onEnded: function () { + + this.isPlaying = false; + + }, + + getLoop: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return false; + + } + + return this.loop; + + }, + + setLoop: function ( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.loop = value; + + if ( this.isPlaying === true ) { + + this.source.loop = this.loop; + + } + + return this; + + }, + + getVolume: function () { + + return this.gain.gain.value; + + }, + + setVolume: function ( value ) { + + this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 ); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function PositionalAudio( listener ) { + + Audio.call( this, listener ); + + this.panner = this.context.createPanner(); + this.panner.connect( this.gain ); + + } + + PositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), { + + constructor: PositionalAudio, + + getOutput: function () { + + return this.panner; + + }, + + getRefDistance: function () { + + return this.panner.refDistance; + + }, + + setRefDistance: function ( value ) { + + this.panner.refDistance = value; + + }, + + getRolloffFactor: function () { + + return this.panner.rolloffFactor; + + }, + + setRolloffFactor: function ( value ) { + + this.panner.rolloffFactor = value; + + }, + + getDistanceModel: function () { + + return this.panner.distanceModel; + + }, + + setDistanceModel: function ( value ) { + + this.panner.distanceModel = value; + + }, + + getMaxDistance: function () { + + return this.panner.maxDistance; + + }, + + setMaxDistance: function ( value ) { + + this.panner.maxDistance = value; + + }, + + updateMatrixWorld: ( function () { + + var position = new Vector3(); + + return function updateMatrixWorld( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + position.setFromMatrixPosition( this.matrixWorld ); + + this.panner.setPosition( position.x, position.y, position.z ); + + }; + + } )() + + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AudioAnalyser( audio, fftSize ) { + + this.analyser = audio.context.createAnalyser(); + this.analyser.fftSize = fftSize !== undefined ? fftSize : 2048; + + this.data = new Uint8Array( this.analyser.frequencyBinCount ); + + audio.getOutput().connect( this.analyser ); + + } + + Object.assign( AudioAnalyser.prototype, { + + getFrequencyData: function () { + + this.analyser.getByteFrequencyData( this.data ); + + return this.data; + + }, + + getAverageFrequency: function () { + + var value = 0, data = this.getFrequencyData(); + + for ( var i = 0; i < data.length; i ++ ) { + + value += data[ i ]; + + } + + return value / data.length; + + } + + } ); + + /** + * + * Buffered scene graph property that allows weighted accumulation. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function PropertyMixer( binding, typeName, valueSize ) { + + this.binding = binding; + this.valueSize = valueSize; + + var bufferType = Float64Array, + mixFunction; + + switch ( typeName ) { + + case 'quaternion': + mixFunction = this._slerp; + break; + + case 'string': + case 'bool': + bufferType = Array; + mixFunction = this._select; + break; + + default: + mixFunction = this._lerp; + + } + + this.buffer = new bufferType( valueSize * 4 ); + // layout: [ incoming | accu0 | accu1 | orig ] + // + // interpolators can use .buffer as their .result + // the data then goes to 'incoming' + // + // 'accu0' and 'accu1' are used frame-interleaved for + // the cumulative result and are compared to detect + // changes + // + // 'orig' stores the original state of the property + + this._mixBufferRegion = mixFunction; + + this.cumulativeWeight = 0; + + this.useCount = 0; + this.referenceCount = 0; + + } + + Object.assign( PropertyMixer.prototype, { + + // accumulate data in the 'incoming' region into 'accu' + accumulate: function ( accuIndex, weight ) { + + // note: happily accumulating nothing when weight = 0, the caller knows + // the weight and shouldn't have made the call in the first place + + var buffer = this.buffer, + stride = this.valueSize, + offset = accuIndex * stride + stride, + + currentWeight = this.cumulativeWeight; + + if ( currentWeight === 0 ) { + + // accuN := incoming * weight + + for ( var i = 0; i !== stride; ++ i ) { + + buffer[ offset + i ] = buffer[ i ]; + + } + + currentWeight = weight; + + } else { + + // accuN := accuN + incoming * weight + + currentWeight += weight; + var mix = weight / currentWeight; + this._mixBufferRegion( buffer, offset, 0, mix, stride ); + + } + + this.cumulativeWeight = currentWeight; + + }, + + // apply the state of 'accu' to the binding when accus differ + apply: function ( accuIndex ) { + + var stride = this.valueSize, + buffer = this.buffer, + offset = accuIndex * stride + stride, + + weight = this.cumulativeWeight, + + binding = this.binding; + + this.cumulativeWeight = 0; + + if ( weight < 1 ) { + + // accuN := accuN + original * ( 1 - cumulativeWeight ) + + var originalValueOffset = stride * 3; + + this._mixBufferRegion( + buffer, offset, originalValueOffset, 1 - weight, stride ); + + } + + for ( var i = stride, e = stride + stride; i !== e; ++ i ) { + + if ( buffer[ i ] !== buffer[ i + stride ] ) { + + // value has changed -> update scene graph + + binding.setValue( buffer, offset ); + break; + + } + + } + + }, + + // remember the state of the bound property and copy it to both accus + saveOriginalState: function () { + + var binding = this.binding; + + var buffer = this.buffer, + stride = this.valueSize, + + originalValueOffset = stride * 3; + + binding.getValue( buffer, originalValueOffset ); + + // accu[0..1] := orig -- initially detect changes against the original + for ( var i = stride, e = originalValueOffset; i !== e; ++ i ) { + + buffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ]; + + } + + this.cumulativeWeight = 0; + + }, + + // apply the state previously taken via 'saveOriginalState' to the binding + restoreOriginalState: function () { + + var originalValueOffset = this.valueSize * 3; + this.binding.setValue( this.buffer, originalValueOffset ); + + }, + + + // mix functions + + _select: function ( buffer, dstOffset, srcOffset, t, stride ) { + + if ( t >= 0.5 ) { + + for ( var i = 0; i !== stride; ++ i ) { + + buffer[ dstOffset + i ] = buffer[ srcOffset + i ]; + + } + + } + + }, + + _slerp: function ( buffer, dstOffset, srcOffset, t ) { + + Quaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t ); + + }, + + _lerp: function ( buffer, dstOffset, srcOffset, t, stride ) { + + var s = 1 - t; + + for ( var i = 0; i !== stride; ++ i ) { + + var j = dstOffset + i; + + buffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t; + + } + + } + + } ); + + /** + * + * A reference to a real property in the scene graph. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + // Characters [].:/ are reserved for track binding syntax. + var RESERVED_CHARS_RE = '\\[\\]\\.:\\/'; + + function Composite( targetGroup, path, optionalParsedPath ) { + + var parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path ); + + this._targetGroup = targetGroup; + this._bindings = targetGroup.subscribe_( path, parsedPath ); + + } + + Object.assign( Composite.prototype, { + + getValue: function ( array, offset ) { + + this.bind(); // bind all binding + + var firstValidIndex = this._targetGroup.nCachedObjects_, + binding = this._bindings[ firstValidIndex ]; + + // and only call .getValue on the first + if ( binding !== undefined ) binding.getValue( array, offset ); + + }, + + setValue: function ( array, offset ) { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].setValue( array, offset ); + + } + + }, + + bind: function () { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].bind(); + + } + + }, + + unbind: function () { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].unbind(); + + } + + } + + } ); + + + function PropertyBinding( rootNode, path, parsedPath ) { + + this.path = path; + this.parsedPath = parsedPath || PropertyBinding.parseTrackName( path ); + + this.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ) || rootNode; + + this.rootNode = rootNode; + + } + + Object.assign( PropertyBinding, { + + Composite: Composite, + + create: function ( root, path, parsedPath ) { + + if ( ! ( root && root.isAnimationObjectGroup ) ) { + + return new PropertyBinding( root, path, parsedPath ); + + } else { + + return new PropertyBinding.Composite( root, path, parsedPath ); + + } + + }, + + /** + * Replaces spaces with underscores and removes unsupported characters from + * node names, to ensure compatibility with parseTrackName(). + * + * @param {string} name Node name to be sanitized. + * @return {string} + */ + sanitizeNodeName: ( function () { + + var reservedRe = new RegExp( '[' + RESERVED_CHARS_RE + ']', 'g' ); + + return function sanitizeNodeName( name ) { + + return name.replace( /\s/g, '_' ).replace( reservedRe, '' ); + + }; + + }() ), + + parseTrackName: function () { + + // Attempts to allow node names from any language. ES5's `\w` regexp matches + // only latin characters, and the unicode \p{L} is not yet supported. So + // instead, we exclude reserved characters and match everything else. + var wordChar = '[^' + RESERVED_CHARS_RE + ']'; + var wordCharOrDot = '[^' + RESERVED_CHARS_RE.replace( '\\.', '' ) + ']'; + + // Parent directories, delimited by '/' or ':'. Currently unused, but must + // be matched to parse the rest of the track name. + var directoryRe = /((?:WC+[\/:])*)/.source.replace( 'WC', wordChar ); + + // Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'. + var nodeRe = /(WCOD+)?/.source.replace( 'WCOD', wordCharOrDot ); + + // Object on target node, and accessor. May not contain reserved + // characters. Accessor may contain any character except closing bracket. + var objectRe = /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace( 'WC', wordChar ); + + // Property and accessor. May not contain reserved characters. Accessor may + // contain any non-bracket characters. + var propertyRe = /\.(WC+)(?:\[(.+)\])?/.source.replace( 'WC', wordChar ); + + var trackRe = new RegExp( '' + + '^' + + directoryRe + + nodeRe + + objectRe + + propertyRe + + '$' + ); + + var supportedObjectNames = [ 'material', 'materials', 'bones' ]; + + return function parseTrackName( trackName ) { + + var matches = trackRe.exec( trackName ); + + if ( ! matches ) { + + throw new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName ); + + } + + var results = { + // directoryName: matches[ 1 ], // (tschw) currently unused + nodeName: matches[ 2 ], + objectName: matches[ 3 ], + objectIndex: matches[ 4 ], + propertyName: matches[ 5 ], // required + propertyIndex: matches[ 6 ] + }; + + var lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' ); + + if ( lastDot !== undefined && lastDot !== - 1 ) { + + var objectName = results.nodeName.substring( lastDot + 1 ); + + // Object names must be checked against a whitelist. Otherwise, there + // is no way to parse 'foo.bar.baz': 'baz' must be a property, but + // 'bar' could be the objectName, or part of a nodeName (which can + // include '.' characters). + if ( supportedObjectNames.indexOf( objectName ) !== - 1 ) { + + results.nodeName = results.nodeName.substring( 0, lastDot ); + results.objectName = objectName; + + } + + } + + if ( results.propertyName === null || results.propertyName.length === 0 ) { + + throw new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName ); + + } + + return results; + + }; + + }(), + + findNode: function ( root, nodeName ) { + + if ( ! nodeName || nodeName === "" || nodeName === "root" || nodeName === "." || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) { + + return root; + + } + + // search into skeleton bones. + if ( root.skeleton ) { + + var bone = root.skeleton.getBoneByName( nodeName ); + + if ( bone !== undefined ) { + + return bone; + + } + + } + + // search into node subtree. + if ( root.children ) { + + var searchNodeSubtree = function ( children ) { + + for ( var i = 0; i < children.length; i ++ ) { + + var childNode = children[ i ]; + + if ( childNode.name === nodeName || childNode.uuid === nodeName ) { + + return childNode; + + } + + var result = searchNodeSubtree( childNode.children ); + + if ( result ) return result; + + } + + return null; + + }; + + var subTreeNode = searchNodeSubtree( root.children ); + + if ( subTreeNode ) { + + return subTreeNode; + + } + + } + + return null; + + } + + } ); + + Object.assign( PropertyBinding.prototype, { // prototype, continued + + // these are used to "bind" a nonexistent property + _getValue_unavailable: function () {}, + _setValue_unavailable: function () {}, + + BindingType: { + Direct: 0, + EntireArray: 1, + ArrayElement: 2, + HasFromToArray: 3 + }, + + Versioning: { + None: 0, + NeedsUpdate: 1, + MatrixWorldNeedsUpdate: 2 + }, + + GetterByBindingType: [ + + function getValue_direct( buffer, offset ) { + + buffer[ offset ] = this.node[ this.propertyName ]; + + }, + + function getValue_array( buffer, offset ) { + + var source = this.resolvedProperty; + + for ( var i = 0, n = source.length; i !== n; ++ i ) { + + buffer[ offset ++ ] = source[ i ]; + + } + + }, + + function getValue_arrayElement( buffer, offset ) { + + buffer[ offset ] = this.resolvedProperty[ this.propertyIndex ]; + + }, + + function getValue_toArray( buffer, offset ) { + + this.resolvedProperty.toArray( buffer, offset ); + + } + + ], + + SetterByBindingTypeAndVersioning: [ + + [ + // Direct + + function setValue_direct( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + + }, + + function setValue_direct_setNeedsUpdate( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + }, + + function setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // EntireArray + + function setValue_array( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + }, + + function setValue_array_setNeedsUpdate( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.needsUpdate = true; + + }, + + function setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // ArrayElement + + function setValue_arrayElement( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + + }, + + function setValue_arrayElement_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + }, + + function setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // HasToFromArray + + function setValue_fromArray( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + + }, + + function setValue_fromArray_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.needsUpdate = true; + + }, + + function setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ] + + ], + + getValue: function getValue_unbound( targetArray, offset ) { + + this.bind(); + this.getValue( targetArray, offset ); + + // Note: This class uses a State pattern on a per-method basis: + // 'bind' sets 'this.getValue' / 'setValue' and shadows the + // prototype version of these methods with one that represents + // the bound state. When the property is not found, the methods + // become no-ops. + + }, + + setValue: function getValue_unbound( sourceArray, offset ) { + + this.bind(); + this.setValue( sourceArray, offset ); + + }, + + // create getter / setter pair for a property in the scene graph + bind: function () { + + var targetObject = this.node, + parsedPath = this.parsedPath, + + objectName = parsedPath.objectName, + propertyName = parsedPath.propertyName, + propertyIndex = parsedPath.propertyIndex; + + if ( ! targetObject ) { + + targetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName ) || this.rootNode; + + this.node = targetObject; + + } + + // set fail state so we can just 'return' on error + this.getValue = this._getValue_unavailable; + this.setValue = this._setValue_unavailable; + + // ensure there is a value node + if ( ! targetObject ) { + + console.error( 'THREE.PropertyBinding: Trying to update node for track: ' + this.path + ' but it wasn\'t found.' ); + return; + + } + + if ( objectName ) { + + var objectIndex = parsedPath.objectIndex; + + // special cases were we need to reach deeper into the hierarchy to get the face materials.... + switch ( objectName ) { + + case 'materials': + + if ( ! targetObject.material ) { + + console.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this ); + return; + + } + + if ( ! targetObject.material.materials ) { + + console.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this ); + return; + + } + + targetObject = targetObject.material.materials; + + break; + + case 'bones': + + if ( ! targetObject.skeleton ) { + + console.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this ); + return; + + } + + // potential future optimization: skip this if propertyIndex is already an integer + // and convert the integer string to a true integer. + + targetObject = targetObject.skeleton.bones; + + // support resolving morphTarget names into indices. + for ( var i = 0; i < targetObject.length; i ++ ) { + + if ( targetObject[ i ].name === objectIndex ) { + + objectIndex = i; + break; + + } + + } + + break; + + default: + + if ( targetObject[ objectName ] === undefined ) { + + console.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this ); + return; + + } + + targetObject = targetObject[ objectName ]; + + } + + + if ( objectIndex !== undefined ) { + + if ( targetObject[ objectIndex ] === undefined ) { + + console.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject ); + return; + + } + + targetObject = targetObject[ objectIndex ]; + + } + + } + + // resolve property + var nodeProperty = targetObject[ propertyName ]; + + if ( nodeProperty === undefined ) { + + var nodeName = parsedPath.nodeName; + + console.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName + + '.' + propertyName + ' but it wasn\'t found.', targetObject ); + return; + + } + + // determine versioning scheme + var versioning = this.Versioning.None; + + if ( targetObject.needsUpdate !== undefined ) { // material + + versioning = this.Versioning.NeedsUpdate; + this.targetObject = targetObject; + + } else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform + + versioning = this.Versioning.MatrixWorldNeedsUpdate; + this.targetObject = targetObject; + + } + + // determine how the property gets bound + var bindingType = this.BindingType.Direct; + + if ( propertyIndex !== undefined ) { + + // access a sub element of the property array (only primitives are supported right now) + + if ( propertyName === "morphTargetInfluences" ) { + + // potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer. + + // support resolving morphTarget names into indices. + if ( ! targetObject.geometry ) { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this ); + return; + + } + + if ( targetObject.geometry.isBufferGeometry ) { + + if ( ! targetObject.geometry.morphAttributes ) { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this ); + return; + + } + + for ( var i = 0; i < this.node.geometry.morphAttributes.position.length; i ++ ) { + + if ( targetObject.geometry.morphAttributes.position[ i ].name === propertyIndex ) { + + propertyIndex = i; + break; + + } + + } + + + } else { + + if ( ! targetObject.geometry.morphTargets ) { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.', this ); + return; + + } + + for ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) { + + if ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) { + + propertyIndex = i; + break; + + } + + } + + } + + } + + bindingType = this.BindingType.ArrayElement; + + this.resolvedProperty = nodeProperty; + this.propertyIndex = propertyIndex; + + } else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) { + + // must use copy for Object3D.Euler/Quaternion + + bindingType = this.BindingType.HasFromToArray; + + this.resolvedProperty = nodeProperty; + + } else if ( Array.isArray( nodeProperty ) ) { + + bindingType = this.BindingType.EntireArray; + + this.resolvedProperty = nodeProperty; + + } else { + + this.propertyName = propertyName; + + } + + // select getter / setter + this.getValue = this.GetterByBindingType[ bindingType ]; + this.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ]; + + }, + + unbind: function () { + + this.node = null; + + // back to the prototype version of getValue / setValue + // note: avoiding to mutate the shape of 'this' via 'delete' + this.getValue = this._getValue_unbound; + this.setValue = this._setValue_unbound; + + } + + } ); + + //!\ DECLARE ALIAS AFTER assign prototype ! + Object.assign( PropertyBinding.prototype, { + + // initial state of these methods that calls 'bind' + _getValue_unbound: PropertyBinding.prototype.getValue, + _setValue_unbound: PropertyBinding.prototype.setValue, + + } ); + + /** + * + * A group of objects that receives a shared animation state. + * + * Usage: + * + * - Add objects you would otherwise pass as 'root' to the + * constructor or the .clipAction method of AnimationMixer. + * + * - Instead pass this object as 'root'. + * + * - You can also add and remove objects later when the mixer + * is running. + * + * Note: + * + * Objects of this class appear as one object to the mixer, + * so cache control of the individual objects must be done + * on the group. + * + * Limitation: + * + * - The animated properties must be compatible among the + * all objects in the group. + * + * - A single property can either be controlled through a + * target group or directly, but not both. + * + * @author tschw + */ + + function AnimationObjectGroup() { + + this.uuid = _Math.generateUUID(); + + // cached objects followed by the active ones + this._objects = Array.prototype.slice.call( arguments ); + + this.nCachedObjects_ = 0; // threshold + // note: read by PropertyBinding.Composite + + var indices = {}; + this._indicesByUUID = indices; // for bookkeeping + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + indices[ arguments[ i ].uuid ] = i; + + } + + this._paths = []; // inside: string + this._parsedPaths = []; // inside: { we don't care, here } + this._bindings = []; // inside: Array< PropertyBinding > + this._bindingsIndicesByPath = {}; // inside: indices in these arrays + + var scope = this; + + this.stats = { + + objects: { + get total() { + + return scope._objects.length; + + }, + get inUse() { + + return this.total - scope.nCachedObjects_; + + } + }, + get bindingsPerObject() { + + return scope._bindings.length; + + } + + }; + + } + + Object.assign( AnimationObjectGroup.prototype, { + + isAnimationObjectGroup: true, + + add: function () { + + var objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + nBindings = bindings.length, + knownObject = undefined; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index === undefined ) { + + // unknown object -> add it to the ACTIVE region + + index = nObjects ++; + indicesByUUID[ uuid ] = index; + objects.push( object ); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + bindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) ); + + } + + } else if ( index < nCachedObjects ) { + + knownObject = objects[ index ]; + + // move existing object to the ACTIVE region + + var firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ]; + + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + indicesByUUID[ uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ], + binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = lastCached; + + if ( binding === undefined ) { + + // since we do not bother to create new bindings + // for objects that are cached, the binding may + // or may not exist + + binding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ); + + } + + bindingsForPath[ firstActiveIndex ] = binding; + + } + + } else if ( objects[ index ] !== knownObject ) { + + console.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID ' + + 'detected. Clean the caches or recreate your infrastructure when reloading scenes.' ); + + } // else the object is already where we want it to be + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + remove: function () { + + var objects = this._objects, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined && index >= nCachedObjects ) { + + // move existing object into the CACHED region + + var lastCachedIndex = nCachedObjects ++, + firstActiveObject = objects[ lastCachedIndex ]; + + indicesByUUID[ firstActiveObject.uuid ] = index; + objects[ index ] = firstActiveObject; + + indicesByUUID[ uuid ] = lastCachedIndex; + objects[ lastCachedIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + firstActive = bindingsForPath[ lastCachedIndex ], + binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = firstActive; + bindingsForPath[ lastCachedIndex ] = binding; + + } + + } + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + // remove & forget + uncache: function () { + + var objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined ) { + + delete indicesByUUID[ uuid ]; + + if ( index < nCachedObjects ) { + + // object is cached, shrink the CACHED region + + var firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ], + lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + // last cached object takes this object's place + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + // last object goes to the activated slot and pop + indicesByUUID[ lastObject.uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ], + last = bindingsForPath[ lastIndex ]; + + bindingsForPath[ index ] = lastCached; + bindingsForPath[ firstActiveIndex ] = last; + bindingsForPath.pop(); + + } + + } else { + + // object is active, just swap with the last and pop + + var lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + indicesByUUID[ lastObject.uuid ] = index; + objects[ index ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ]; + + bindingsForPath[ index ] = bindingsForPath[ lastIndex ]; + bindingsForPath.pop(); + + } + + } // cached or active + + } // if object is known + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + // Internal interface used by befriended PropertyBinding.Composite: + + subscribe_: function ( path, parsedPath ) { + + // returns an array of bindings for the given path that is changed + // according to the contained objects in the group + + var indicesByPath = this._bindingsIndicesByPath, + index = indicesByPath[ path ], + bindings = this._bindings; + + if ( index !== undefined ) return bindings[ index ]; + + var paths = this._paths, + parsedPaths = this._parsedPaths, + objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + bindingsForPath = new Array( nObjects ); + + index = bindings.length; + + indicesByPath[ path ] = index; + + paths.push( path ); + parsedPaths.push( parsedPath ); + bindings.push( bindingsForPath ); + + for ( var i = nCachedObjects, n = objects.length; i !== n; ++ i ) { + + var object = objects[ i ]; + bindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath ); + + } + + return bindingsForPath; + + }, + + unsubscribe_: function ( path ) { + + // tells the group to forget about a property path and no longer + // update the array previously obtained with 'subscribe_' + + var indicesByPath = this._bindingsIndicesByPath, + index = indicesByPath[ path ]; + + if ( index !== undefined ) { + + var paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + lastBindingsIndex = bindings.length - 1, + lastBindings = bindings[ lastBindingsIndex ], + lastBindingsPath = path[ lastBindingsIndex ]; + + indicesByPath[ lastBindingsPath ] = index; + + bindings[ index ] = lastBindings; + bindings.pop(); + + parsedPaths[ index ] = parsedPaths[ lastBindingsIndex ]; + parsedPaths.pop(); + + paths[ index ] = paths[ lastBindingsIndex ]; + paths.pop(); + + } + + } + + } ); + + /** + * + * Action provided by AnimationMixer for scheduling clip playback on specific + * objects. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + * + */ + + function AnimationAction( mixer, clip, localRoot ) { + + this._mixer = mixer; + this._clip = clip; + this._localRoot = localRoot || null; + + var tracks = clip.tracks, + nTracks = tracks.length, + interpolants = new Array( nTracks ); + + var interpolantSettings = { + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + }; + + for ( var i = 0; i !== nTracks; ++ i ) { + + var interpolant = tracks[ i ].createInterpolant( null ); + interpolants[ i ] = interpolant; + interpolant.settings = interpolantSettings; + + } + + this._interpolantSettings = interpolantSettings; + + this._interpolants = interpolants; // bound by the mixer + + // inside: PropertyMixer (managed by the mixer) + this._propertyBindings = new Array( nTracks ); + + this._cacheIndex = null; // for the memory manager + this._byClipCacheIndex = null; // for the memory manager + + this._timeScaleInterpolant = null; + this._weightInterpolant = null; + + this.loop = LoopRepeat; + this._loopCount = - 1; + + // global mixer time when the action is to be started + // it's set back to 'null' upon start of the action + this._startTime = null; + + // scaled local time of the action + // gets clamped or wrapped to 0..clip.duration according to loop + this.time = 0; + + this.timeScale = 1; + this._effectiveTimeScale = 1; + + this.weight = 1; + this._effectiveWeight = 1; + + this.repetitions = Infinity; // no. of repetitions when looping + + this.paused = false; // true -> zero effective time scale + this.enabled = true; // false -> zero effective weight + + this.clampWhenFinished = false; // keep feeding the last frame? + + this.zeroSlopeAtStart = true; // for smooth interpolation w/o separate + this.zeroSlopeAtEnd = true; // clips for start, loop and end + + } + + Object.assign( AnimationAction.prototype, { + + // State & Scheduling + + play: function () { + + this._mixer._activateAction( this ); + + return this; + + }, + + stop: function () { + + this._mixer._deactivateAction( this ); + + return this.reset(); + + }, + + reset: function () { + + this.paused = false; + this.enabled = true; + + this.time = 0; // restart clip + this._loopCount = - 1; // forget previous loops + this._startTime = null; // forget scheduling + + return this.stopFading().stopWarping(); + + }, + + isRunning: function () { + + return this.enabled && ! this.paused && this.timeScale !== 0 && + this._startTime === null && this._mixer._isActiveAction( this ); + + }, + + // return true when play has been called + isScheduled: function () { + + return this._mixer._isActiveAction( this ); + + }, + + startAt: function ( time ) { + + this._startTime = time; + + return this; + + }, + + setLoop: function ( mode, repetitions ) { + + this.loop = mode; + this.repetitions = repetitions; + + return this; + + }, + + // Weight + + // set the weight stopping any scheduled fading + // although .enabled = false yields an effective weight of zero, this + // method does *not* change .enabled, because it would be confusing + setEffectiveWeight: function ( weight ) { + + this.weight = weight; + + // note: same logic as when updated at runtime + this._effectiveWeight = this.enabled ? weight : 0; + + return this.stopFading(); + + }, + + // return the weight considering fading and .enabled + getEffectiveWeight: function () { + + return this._effectiveWeight; + + }, + + fadeIn: function ( duration ) { + + return this._scheduleFading( duration, 0, 1 ); + + }, + + fadeOut: function ( duration ) { + + return this._scheduleFading( duration, 1, 0 ); + + }, + + crossFadeFrom: function ( fadeOutAction, duration, warp ) { + + fadeOutAction.fadeOut( duration ); + this.fadeIn( duration ); + + if ( warp ) { + + var fadeInDuration = this._clip.duration, + fadeOutDuration = fadeOutAction._clip.duration, + + startEndRatio = fadeOutDuration / fadeInDuration, + endStartRatio = fadeInDuration / fadeOutDuration; + + fadeOutAction.warp( 1.0, startEndRatio, duration ); + this.warp( endStartRatio, 1.0, duration ); + + } + + return this; + + }, + + crossFadeTo: function ( fadeInAction, duration, warp ) { + + return fadeInAction.crossFadeFrom( this, duration, warp ); + + }, + + stopFading: function () { + + var weightInterpolant = this._weightInterpolant; + + if ( weightInterpolant !== null ) { + + this._weightInterpolant = null; + this._mixer._takeBackControlInterpolant( weightInterpolant ); + + } + + return this; + + }, + + // Time Scale Control + + // set the time scale stopping any scheduled warping + // although .paused = true yields an effective time scale of zero, this + // method does *not* change .paused, because it would be confusing + setEffectiveTimeScale: function ( timeScale ) { + + this.timeScale = timeScale; + this._effectiveTimeScale = this.paused ? 0 : timeScale; + + return this.stopWarping(); + + }, + + // return the time scale considering warping and .paused + getEffectiveTimeScale: function () { + + return this._effectiveTimeScale; + + }, + + setDuration: function ( duration ) { + + this.timeScale = this._clip.duration / duration; + + return this.stopWarping(); + + }, + + syncWith: function ( action ) { + + this.time = action.time; + this.timeScale = action.timeScale; + + return this.stopWarping(); + + }, + + halt: function ( duration ) { + + return this.warp( this._effectiveTimeScale, 0, duration ); + + }, + + warp: function ( startTimeScale, endTimeScale, duration ) { + + var mixer = this._mixer, now = mixer.time, + interpolant = this._timeScaleInterpolant, + + timeScale = this.timeScale; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(); + this._timeScaleInterpolant = interpolant; + + } + + var times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; + times[ 1 ] = now + duration; + + values[ 0 ] = startTimeScale / timeScale; + values[ 1 ] = endTimeScale / timeScale; + + return this; + + }, + + stopWarping: function () { + + var timeScaleInterpolant = this._timeScaleInterpolant; + + if ( timeScaleInterpolant !== null ) { + + this._timeScaleInterpolant = null; + this._mixer._takeBackControlInterpolant( timeScaleInterpolant ); + + } + + return this; + + }, + + // Object Accessors + + getMixer: function () { + + return this._mixer; + + }, + + getClip: function () { + + return this._clip; + + }, + + getRoot: function () { + + return this._localRoot || this._mixer._root; + + }, + + // Interna + + _update: function ( time, deltaTime, timeDirection, accuIndex ) { + + // called by the mixer + + if ( ! this.enabled ) { + + // call ._updateWeight() to update ._effectiveWeight + + this._updateWeight( time ); + return; + + } + + var startTime = this._startTime; + + if ( startTime !== null ) { + + // check for scheduled start of action + + var timeRunning = ( time - startTime ) * timeDirection; + if ( timeRunning < 0 || timeDirection === 0 ) { + + return; // yet to come / don't decide when delta = 0 + + } + + // start + + this._startTime = null; // unschedule + deltaTime = timeDirection * timeRunning; + + } + + // apply time scale and advance time + + deltaTime *= this._updateTimeScale( time ); + var clipTime = this._updateTime( deltaTime ); + + // note: _updateTime may disable the action resulting in + // an effective weight of 0 + + var weight = this._updateWeight( time ); + + if ( weight > 0 ) { + + var interpolants = this._interpolants; + var propertyMixers = this._propertyBindings; + + for ( var j = 0, m = interpolants.length; j !== m; ++ j ) { + + interpolants[ j ].evaluate( clipTime ); + propertyMixers[ j ].accumulate( accuIndex, weight ); + + } + + } + + }, + + _updateWeight: function ( time ) { + + var weight = 0; + + if ( this.enabled ) { + + weight = this.weight; + var interpolant = this._weightInterpolant; + + if ( interpolant !== null ) { + + var interpolantValue = interpolant.evaluate( time )[ 0 ]; + + weight *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopFading(); + + if ( interpolantValue === 0 ) { + + // faded out, disable + this.enabled = false; + + } + + } + + } + + } + + this._effectiveWeight = weight; + return weight; + + }, + + _updateTimeScale: function ( time ) { + + var timeScale = 0; + + if ( ! this.paused ) { + + timeScale = this.timeScale; + + var interpolant = this._timeScaleInterpolant; + + if ( interpolant !== null ) { + + var interpolantValue = interpolant.evaluate( time )[ 0 ]; + + timeScale *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopWarping(); + + if ( timeScale === 0 ) { + + // motion has halted, pause + this.paused = true; + + } else { + + // warp done - apply final time scale + this.timeScale = timeScale; + + } + + } + + } + + } + + this._effectiveTimeScale = timeScale; + return timeScale; + + }, + + _updateTime: function ( deltaTime ) { + + var time = this.time + deltaTime; + + if ( deltaTime === 0 ) return time; + + var duration = this._clip.duration, + + loop = this.loop, + loopCount = this._loopCount; + + if ( loop === LoopOnce ) { + + if ( loopCount === - 1 ) { + + // just started + + this._loopCount = 0; + this._setEndings( true, true, false ); + + } + + handle_stop: { + + if ( time >= duration ) { + + time = duration; + + } else if ( time < 0 ) { + + time = 0; + + } else break handle_stop; + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime < 0 ? - 1 : 1 + } ); + + } + + } else { // repetitive Repeat or PingPong + + var pingPong = ( loop === LoopPingPong ); + + if ( loopCount === - 1 ) { + + // just started + + if ( deltaTime >= 0 ) { + + loopCount = 0; + + this._setEndings( true, this.repetitions === 0, pingPong ); + + } else { + + // when looping in reverse direction, the initial + // transition through zero counts as a repetition, + // so leave loopCount at -1 + + this._setEndings( this.repetitions === 0, true, pingPong ); + + } + + } + + if ( time >= duration || time < 0 ) { + + // wrap around + + var loopDelta = Math.floor( time / duration ); // signed + time -= duration * loopDelta; + + loopCount += Math.abs( loopDelta ); + + var pending = this.repetitions - loopCount; + + if ( pending <= 0 ) { + + // have to stop (switch state, clamp time, fire event) + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + time = deltaTime > 0 ? duration : 0; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime > 0 ? 1 : - 1 + } ); + + } else { + + // keep running + + if ( pending === 1 ) { + + // entering the last round + + var atStart = deltaTime < 0; + this._setEndings( atStart, ! atStart, pingPong ); + + } else { + + this._setEndings( false, false, pingPong ); + + } + + this._loopCount = loopCount; + + this._mixer.dispatchEvent( { + type: 'loop', action: this, loopDelta: loopDelta + } ); + + } + + } + + if ( pingPong && ( loopCount & 1 ) === 1 ) { + + // invert time for the "pong round" + + this.time = time; + return duration - time; + + } + + } + + this.time = time; + return time; + + }, + + _setEndings: function ( atStart, atEnd, pingPong ) { + + var settings = this._interpolantSettings; + + if ( pingPong ) { + + settings.endingStart = ZeroSlopeEnding; + settings.endingEnd = ZeroSlopeEnding; + + } else { + + // assuming for LoopOnce atStart == atEnd == true + + if ( atStart ) { + + settings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingStart = WrapAroundEnding; + + } + + if ( atEnd ) { + + settings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingEnd = WrapAroundEnding; + + } + + } + + }, + + _scheduleFading: function ( duration, weightNow, weightThen ) { + + var mixer = this._mixer, now = mixer.time, + interpolant = this._weightInterpolant; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(); + this._weightInterpolant = interpolant; + + } + + var times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; values[ 0 ] = weightNow; + times[ 1 ] = now + duration; values[ 1 ] = weightThen; + + return this; + + } + + } ); + + /** + * + * Player for AnimationClips. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function AnimationMixer( root ) { + + this._root = root; + this._initMemoryManager(); + this._accuIndex = 0; + + this.time = 0; + + this.timeScale = 1.0; + + } + + AnimationMixer.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { + + constructor: AnimationMixer, + + _bindAction: function ( action, prototypeAction ) { + + var root = action._localRoot || this._root, + tracks = action._clip.tracks, + nTracks = tracks.length, + bindings = action._propertyBindings, + interpolants = action._interpolants, + rootUuid = root.uuid, + bindingsByRoot = this._bindingsByRootAndName, + bindingsByName = bindingsByRoot[ rootUuid ]; + + if ( bindingsByName === undefined ) { + + bindingsByName = {}; + bindingsByRoot[ rootUuid ] = bindingsByName; + + } + + for ( var i = 0; i !== nTracks; ++ i ) { + + var track = tracks[ i ], + trackName = track.name, + binding = bindingsByName[ trackName ]; + + if ( binding !== undefined ) { + + bindings[ i ] = binding; + + } else { + + binding = bindings[ i ]; + + if ( binding !== undefined ) { + + // existing binding, make sure the cache knows + + if ( binding._cacheIndex === null ) { + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + } + + continue; + + } + + var path = prototypeAction && prototypeAction. + _propertyBindings[ i ].binding.parsedPath; + + binding = new PropertyMixer( + PropertyBinding.create( root, trackName, path ), + track.ValueTypeName, track.getValueSize() ); + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + bindings[ i ] = binding; + + } + + interpolants[ i ].resultBuffer = binding.buffer; + + } + + }, + + _activateAction: function ( action ) { + + if ( ! this._isActiveAction( action ) ) { + + if ( action._cacheIndex === null ) { + + // this action has been forgotten by the cache, but the user + // appears to be still using it -> rebind + + var rootUuid = ( action._localRoot || this._root ).uuid, + clipUuid = action._clip.uuid, + actionsForClip = this._actionsByClip[ clipUuid ]; + + this._bindAction( action, + actionsForClip && actionsForClip.knownActions[ 0 ] ); + + this._addInactiveAction( action, clipUuid, rootUuid ); + + } + + var bindings = action._propertyBindings; + + // increment reference counts / sort out state + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( binding.useCount ++ === 0 ) { + + this._lendBinding( binding ); + binding.saveOriginalState(); + + } + + } + + this._lendAction( action ); + + } + + }, + + _deactivateAction: function ( action ) { + + if ( this._isActiveAction( action ) ) { + + var bindings = action._propertyBindings; + + // decrement reference counts / sort out state + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( -- binding.useCount === 0 ) { + + binding.restoreOriginalState(); + this._takeBackBinding( binding ); + + } + + } + + this._takeBackAction( action ); + + } + + }, + + // Memory manager + + _initMemoryManager: function () { + + this._actions = []; // 'nActiveActions' followed by inactive ones + this._nActiveActions = 0; + + this._actionsByClip = {}; + // inside: + // { + // knownActions: Array< AnimationAction > - used as prototypes + // actionByRoot: AnimationAction - lookup + // } + + + this._bindings = []; // 'nActiveBindings' followed by inactive ones + this._nActiveBindings = 0; + + this._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer > + + + this._controlInterpolants = []; // same game as above + this._nActiveControlInterpolants = 0; + + var scope = this; + + this.stats = { + + actions: { + get total() { + + return scope._actions.length; + + }, + get inUse() { + + return scope._nActiveActions; + + } + }, + bindings: { + get total() { + + return scope._bindings.length; + + }, + get inUse() { + + return scope._nActiveBindings; + + } + }, + controlInterpolants: { + get total() { + + return scope._controlInterpolants.length; + + }, + get inUse() { + + return scope._nActiveControlInterpolants; + + } + } + + }; + + }, + + // Memory management for AnimationAction objects + + _isActiveAction: function ( action ) { + + var index = action._cacheIndex; + return index !== null && index < this._nActiveActions; + + }, + + _addInactiveAction: function ( action, clipUuid, rootUuid ) { + + var actions = this._actions, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip === undefined ) { + + actionsForClip = { + + knownActions: [ action ], + actionByRoot: {} + + }; + + action._byClipCacheIndex = 0; + + actionsByClip[ clipUuid ] = actionsForClip; + + } else { + + var knownActions = actionsForClip.knownActions; + + action._byClipCacheIndex = knownActions.length; + knownActions.push( action ); + + } + + action._cacheIndex = actions.length; + actions.push( action ); + + actionsForClip.actionByRoot[ rootUuid ] = action; + + }, + + _removeInactiveAction: function ( action ) { + + var actions = this._actions, + lastInactiveAction = actions[ actions.length - 1 ], + cacheIndex = action._cacheIndex; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + action._cacheIndex = null; + + + var clipUuid = action._clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ], + knownActionsForClip = actionsForClip.knownActions, + + lastKnownAction = + knownActionsForClip[ knownActionsForClip.length - 1 ], + + byClipCacheIndex = action._byClipCacheIndex; + + lastKnownAction._byClipCacheIndex = byClipCacheIndex; + knownActionsForClip[ byClipCacheIndex ] = lastKnownAction; + knownActionsForClip.pop(); + + action._byClipCacheIndex = null; + + + var actionByRoot = actionsForClip.actionByRoot, + rootUuid = ( action._localRoot || this._root ).uuid; + + delete actionByRoot[ rootUuid ]; + + if ( knownActionsForClip.length === 0 ) { + + delete actionsByClip[ clipUuid ]; + + } + + this._removeInactiveBindingsForAction( action ); + + }, + + _removeInactiveBindingsForAction: function ( action ) { + + var bindings = action._propertyBindings; + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( -- binding.referenceCount === 0 ) { + + this._removeInactiveBinding( binding ); + + } + + } + + }, + + _lendAction: function ( action ) { + + // [ active actions | inactive actions ] + // [ active actions >| inactive actions ] + // s a + // <-swap-> + // a s + + var actions = this._actions, + prevIndex = action._cacheIndex, + + lastActiveIndex = this._nActiveActions ++, + + firstInactiveAction = actions[ lastActiveIndex ]; + + action._cacheIndex = lastActiveIndex; + actions[ lastActiveIndex ] = action; + + firstInactiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = firstInactiveAction; + + }, + + _takeBackAction: function ( action ) { + + // [ active actions | inactive actions ] + // [ active actions |< inactive actions ] + // a s + // <-swap-> + // s a + + var actions = this._actions, + prevIndex = action._cacheIndex, + + firstInactiveIndex = -- this._nActiveActions, + + lastActiveAction = actions[ firstInactiveIndex ]; + + action._cacheIndex = firstInactiveIndex; + actions[ firstInactiveIndex ] = action; + + lastActiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = lastActiveAction; + + }, + + // Memory management for PropertyMixer objects + + _addInactiveBinding: function ( binding, rootUuid, trackName ) { + + var bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ], + + bindings = this._bindings; + + if ( bindingByName === undefined ) { + + bindingByName = {}; + bindingsByRoot[ rootUuid ] = bindingByName; + + } + + bindingByName[ trackName ] = binding; + + binding._cacheIndex = bindings.length; + bindings.push( binding ); + + }, + + _removeInactiveBinding: function ( binding ) { + + var bindings = this._bindings, + propBinding = binding.binding, + rootUuid = propBinding.rootNode.uuid, + trackName = propBinding.path, + bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ], + + lastInactiveBinding = bindings[ bindings.length - 1 ], + cacheIndex = binding._cacheIndex; + + lastInactiveBinding._cacheIndex = cacheIndex; + bindings[ cacheIndex ] = lastInactiveBinding; + bindings.pop(); + + delete bindingByName[ trackName ]; + + remove_empty_map: { + + for ( var _ in bindingByName ) break remove_empty_map; // eslint-disable-line no-unused-vars + + delete bindingsByRoot[ rootUuid ]; + + } + + }, + + _lendBinding: function ( binding ) { + + var bindings = this._bindings, + prevIndex = binding._cacheIndex, + + lastActiveIndex = this._nActiveBindings ++, + + firstInactiveBinding = bindings[ lastActiveIndex ]; + + binding._cacheIndex = lastActiveIndex; + bindings[ lastActiveIndex ] = binding; + + firstInactiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = firstInactiveBinding; + + }, + + _takeBackBinding: function ( binding ) { + + var bindings = this._bindings, + prevIndex = binding._cacheIndex, + + firstInactiveIndex = -- this._nActiveBindings, + + lastActiveBinding = bindings[ firstInactiveIndex ]; + + binding._cacheIndex = firstInactiveIndex; + bindings[ firstInactiveIndex ] = binding; + + lastActiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = lastActiveBinding; + + }, + + + // Memory management of Interpolants for weight and time scale + + _lendControlInterpolant: function () { + + var interpolants = this._controlInterpolants, + lastActiveIndex = this._nActiveControlInterpolants ++, + interpolant = interpolants[ lastActiveIndex ]; + + if ( interpolant === undefined ) { + + interpolant = new LinearInterpolant( + new Float32Array( 2 ), new Float32Array( 2 ), + 1, this._controlInterpolantsResultBuffer ); + + interpolant.__cacheIndex = lastActiveIndex; + interpolants[ lastActiveIndex ] = interpolant; + + } + + return interpolant; + + }, + + _takeBackControlInterpolant: function ( interpolant ) { + + var interpolants = this._controlInterpolants, + prevIndex = interpolant.__cacheIndex, + + firstInactiveIndex = -- this._nActiveControlInterpolants, + + lastActiveInterpolant = interpolants[ firstInactiveIndex ]; + + interpolant.__cacheIndex = firstInactiveIndex; + interpolants[ firstInactiveIndex ] = interpolant; + + lastActiveInterpolant.__cacheIndex = prevIndex; + interpolants[ prevIndex ] = lastActiveInterpolant; + + }, + + _controlInterpolantsResultBuffer: new Float32Array( 1 ), + + // return an action for a clip optionally using a custom root target + // object (this method allocates a lot of dynamic memory in case a + // previously unknown clip/root combination is specified) + clipAction: function ( clip, optionalRoot ) { + + var root = optionalRoot || this._root, + rootUuid = root.uuid, + + clipObject = typeof clip === 'string' ? + AnimationClip.findByName( root, clip ) : clip, + + clipUuid = clipObject !== null ? clipObject.uuid : clip, + + actionsForClip = this._actionsByClip[ clipUuid ], + prototypeAction = null; + + if ( actionsForClip !== undefined ) { + + var existingAction = + actionsForClip.actionByRoot[ rootUuid ]; + + if ( existingAction !== undefined ) { + + return existingAction; + + } + + // we know the clip, so we don't have to parse all + // the bindings again but can just copy + prototypeAction = actionsForClip.knownActions[ 0 ]; + + // also, take the clip from the prototype action + if ( clipObject === null ) + clipObject = prototypeAction._clip; + + } + + // clip must be known when specified via string + if ( clipObject === null ) return null; + + // allocate all resources required to run it + var newAction = new AnimationAction( this, clipObject, optionalRoot ); + + this._bindAction( newAction, prototypeAction ); + + // and make the action known to the memory manager + this._addInactiveAction( newAction, clipUuid, rootUuid ); + + return newAction; + + }, + + // get an existing action + existingAction: function ( clip, optionalRoot ) { + + var root = optionalRoot || this._root, + rootUuid = root.uuid, + + clipObject = typeof clip === 'string' ? + AnimationClip.findByName( root, clip ) : clip, + + clipUuid = clipObject ? clipObject.uuid : clip, + + actionsForClip = this._actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + return actionsForClip.actionByRoot[ rootUuid ] || null; + + } + + return null; + + }, + + // deactivates all previously scheduled actions + stopAllAction: function () { + + var actions = this._actions, + nActions = this._nActiveActions, + bindings = this._bindings, + nBindings = this._nActiveBindings; + + this._nActiveActions = 0; + this._nActiveBindings = 0; + + for ( var i = 0; i !== nActions; ++ i ) { + + actions[ i ].reset(); + + } + + for ( var i = 0; i !== nBindings; ++ i ) { + + bindings[ i ].useCount = 0; + + } + + return this; + + }, + + // advance the time and update apply the animation + update: function ( deltaTime ) { + + deltaTime *= this.timeScale; + + var actions = this._actions, + nActions = this._nActiveActions, + + time = this.time += deltaTime, + timeDirection = Math.sign( deltaTime ), + + accuIndex = this._accuIndex ^= 1; + + // run active actions + + for ( var i = 0; i !== nActions; ++ i ) { + + var action = actions[ i ]; + + action._update( time, deltaTime, timeDirection, accuIndex ); + + } + + // update scene graph + + var bindings = this._bindings, + nBindings = this._nActiveBindings; + + for ( var i = 0; i !== nBindings; ++ i ) { + + bindings[ i ].apply( accuIndex ); + + } + + return this; + + }, + + // return this mixer's root target object + getRoot: function () { + + return this._root; + + }, + + // free all resources specific to a particular clip + uncacheClip: function ( clip ) { + + var actions = this._actions, + clipUuid = clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + // note: just calling _removeInactiveAction would mess up the + // iteration state and also require updating the state we can + // just throw away + + var actionsToRemove = actionsForClip.knownActions; + + for ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) { + + var action = actionsToRemove[ i ]; + + this._deactivateAction( action ); + + var cacheIndex = action._cacheIndex, + lastInactiveAction = actions[ actions.length - 1 ]; + + action._cacheIndex = null; + action._byClipCacheIndex = null; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + this._removeInactiveBindingsForAction( action ); + + } + + delete actionsByClip[ clipUuid ]; + + } + + }, + + // free all resources specific to a particular root target object + uncacheRoot: function ( root ) { + + var rootUuid = root.uuid, + actionsByClip = this._actionsByClip; + + for ( var clipUuid in actionsByClip ) { + + var actionByRoot = actionsByClip[ clipUuid ].actionByRoot, + action = actionByRoot[ rootUuid ]; + + if ( action !== undefined ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + + var bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ]; + + if ( bindingByName !== undefined ) { + + for ( var trackName in bindingByName ) { + + var binding = bindingByName[ trackName ]; + binding.restoreOriginalState(); + this._removeInactiveBinding( binding ); + + } + + } + + }, + + // remove a targeted clip from the cache + uncacheAction: function ( clip, optionalRoot ) { + + var action = this.existingAction( clip, optionalRoot ); + + if ( action !== null ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Uniform( value ) { + + if ( typeof value === 'string' ) { + + console.warn( 'THREE.Uniform: Type parameter is no longer needed.' ); + value = arguments[ 1 ]; + + } + + this.value = value; + + } + + Uniform.prototype.clone = function () { + + return new Uniform( this.value.clone === undefined ? this.value : this.value.clone() ); + + }; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedBufferGeometry() { + + BufferGeometry.call( this ); + + this.type = 'InstancedBufferGeometry'; + this.maxInstancedCount = undefined; + + } + + InstancedBufferGeometry.prototype = Object.assign( Object.create( BufferGeometry.prototype ), { + + constructor: InstancedBufferGeometry, + + isInstancedBufferGeometry: true, + + copy: function ( source ) { + + BufferGeometry.prototype.copy.call( this, source ); + + this.maxInstancedCount = source.maxInstancedCount; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + } + + } ); + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) { + + this.data = interleavedBuffer; + this.itemSize = itemSize; + this.offset = offset; + + this.normalized = normalized === true; + + } + + Object.defineProperties( InterleavedBufferAttribute.prototype, { + + count: { + + get: function () { + + return this.data.count; + + } + + }, + + array: { + + get: function () { + + return this.data.array; + + } + + } + + } ); + + Object.assign( InterleavedBufferAttribute.prototype, { + + isInterleavedBufferAttribute: true, + + setX: function ( index, x ) { + + this.data.array[ index * this.data.stride + this.offset ] = x; + + return this; + + }, + + setY: function ( index, y ) { + + this.data.array[ index * this.data.stride + this.offset + 1 ] = y; + + return this; + + }, + + setZ: function ( index, z ) { + + this.data.array[ index * this.data.stride + this.offset + 2 ] = z; + + return this; + + }, + + setW: function ( index, w ) { + + this.data.array[ index * this.data.stride + this.offset + 3 ] = w; + + return this; + + }, + + getX: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset ]; + + }, + + getY: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 1 ]; + + }, + + getZ: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 2 ]; + + }, + + getW: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 3 ]; + + }, + + setXY: function ( index, x, y ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + + return this; + + }, + + setXYZ: function ( index, x, y, z ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + + return this; + + }, + + setXYZW: function ( index, x, y, z, w ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + this.data.array[ index + 3 ] = w; + + return this; + + } + + } ); + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InterleavedBuffer( array, stride ) { + + this.array = array; + this.stride = stride; + this.count = array !== undefined ? array.length / stride : 0; + + this.dynamic = false; + this.updateRange = { offset: 0, count: - 1 }; + + this.version = 0; + + } + + Object.defineProperty( InterleavedBuffer.prototype, 'needsUpdate', { + + set: function ( value ) { + + if ( value === true ) this.version ++; + + } + + } ); + + Object.assign( InterleavedBuffer.prototype, { + + isInterleavedBuffer: true, + + onUploadCallback: function () {}, + + setArray: function ( array ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.count = array !== undefined ? array.length / this.stride : 0; + this.array = array; + + return this; + + }, + + setDynamic: function ( value ) { + + this.dynamic = value; + + return this; + + }, + + copy: function ( source ) { + + this.array = new source.array.constructor( source.array ); + this.count = source.count; + this.stride = source.stride; + this.dynamic = source.dynamic; + + return this; + + }, + + copyAt: function ( index1, attribute, index2 ) { + + index1 *= this.stride; + index2 *= attribute.stride; + + for ( var i = 0, l = this.stride; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + }, + + set: function ( value, offset ) { + + if ( offset === undefined ) offset = 0; + + this.array.set( value, offset ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + onUpload: function ( callback ) { + + this.onUploadCallback = callback; + + return this; + + } + + } ); + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedInterleavedBuffer( array, stride, meshPerAttribute ) { + + InterleavedBuffer.call( this, array, stride ); + + this.meshPerAttribute = meshPerAttribute || 1; + + } + + InstancedInterleavedBuffer.prototype = Object.assign( Object.create( InterleavedBuffer.prototype ), { + + constructor: InstancedInterleavedBuffer, + + isInstancedInterleavedBuffer: true, + + copy: function ( source ) { + + InterleavedBuffer.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + } + + } ); + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedBufferAttribute( array, itemSize, meshPerAttribute ) { + + BufferAttribute.call( this, array, itemSize ); + + this.meshPerAttribute = meshPerAttribute || 1; + + } + + InstancedBufferAttribute.prototype = Object.assign( Object.create( BufferAttribute.prototype ), { + + constructor: InstancedBufferAttribute, + + isInstancedBufferAttribute: true, + + copy: function ( source ) { + + BufferAttribute.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author bhouston / http://clara.io/ + * @author stephomi / http://stephaneginier.com/ + */ + + function Raycaster( origin, direction, near, far ) { + + this.ray = new Ray( origin, direction ); + // direction is assumed to be normalized (for accurate distance calculations) + + this.near = near || 0; + this.far = far || Infinity; + + this.params = { + Mesh: {}, + Line: {}, + LOD: {}, + Points: { threshold: 1 }, + Sprite: {} + }; + + Object.defineProperties( this.params, { + PointCloud: { + get: function () { + + console.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' ); + return this.Points; + + } + } + } ); + + } + + function ascSort( a, b ) { + + return a.distance - b.distance; + + } + + function intersectObject( object, raycaster, intersects, recursive ) { + + if ( object.visible === false ) return; + + object.raycast( raycaster, intersects ); + + if ( recursive === true ) { + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + intersectObject( children[ i ], raycaster, intersects, true ); + + } + + } + + } + + Object.assign( Raycaster.prototype, { + + linePrecision: 1, + + set: function ( origin, direction ) { + + // direction is assumed to be normalized (for accurate distance calculations) + + this.ray.set( origin, direction ); + + }, + + setFromCamera: function ( coords, camera ) { + + if ( ( camera && camera.isPerspectiveCamera ) ) { + + this.ray.origin.setFromMatrixPosition( camera.matrixWorld ); + this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize(); + + } else if ( ( camera && camera.isOrthographicCamera ) ) { + + this.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera + this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ); + + } else { + + console.error( 'THREE.Raycaster: Unsupported camera type.' ); + + } + + }, + + intersectObject: function ( object, recursive, optionalTarget ) { + + var intersects = optionalTarget || []; + + intersectObject( object, this, intersects, recursive ); + + intersects.sort( ascSort ); + + return intersects; + + }, + + intersectObjects: function ( objects, recursive, optionalTarget ) { + + var intersects = optionalTarget || []; + + if ( Array.isArray( objects ) === false ) { + + console.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' ); + return intersects; + + } + + for ( var i = 0, l = objects.length; i < l; i ++ ) { + + intersectObject( objects[ i ], this, intersects, recursive ); + + } + + intersects.sort( ascSort ); + + return intersects; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Clock( autoStart ) { + + this.autoStart = ( autoStart !== undefined ) ? autoStart : true; + + this.startTime = 0; + this.oldTime = 0; + this.elapsedTime = 0; + + this.running = false; + + } + + Object.assign( Clock.prototype, { + + start: function () { + + this.startTime = ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732 + + this.oldTime = this.startTime; + this.elapsedTime = 0; + this.running = true; + + }, + + stop: function () { + + this.getElapsedTime(); + this.running = false; + this.autoStart = false; + + }, + + getElapsedTime: function () { + + this.getDelta(); + return this.elapsedTime; + + }, + + getDelta: function () { + + var diff = 0; + + if ( this.autoStart && ! this.running ) { + + this.start(); + return 0; + + } + + if ( this.running ) { + + var newTime = ( typeof performance === 'undefined' ? Date : performance ).now(); + + diff = ( newTime - this.oldTime ) / 1000; + this.oldTime = newTime; + + this.elapsedTime += diff; + + } + + return diff; + + } + + } ); + + /** + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + * + * 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. + */ + + function Spherical( radius, phi, theta ) { + + this.radius = ( radius !== undefined ) ? radius : 1.0; + this.phi = ( phi !== undefined ) ? phi : 0; // up / down towards top and bottom pole + this.theta = ( theta !== undefined ) ? theta : 0; // around the equator of the sphere + + return this; + + } + + Object.assign( Spherical.prototype, { + + set: function ( radius, phi, theta ) { + + this.radius = radius; + this.phi = phi; + this.theta = theta; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( other ) { + + this.radius = other.radius; + this.phi = other.phi; + this.theta = other.theta; + + return this; + + }, + + // restrict phi to be betwee EPS and PI-EPS + makeSafe: function () { + + var EPS = 0.000001; + this.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) ); + + return this; + + }, + + setFromVector3: function ( vec3 ) { + + this.radius = vec3.length(); + + 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( _Math.clamp( vec3.y / this.radius, - 1, 1 ) ); // polar angle + + } + + return this; + + } + + } ); + + /** + * @author Mugen87 / https://github.com/Mugen87 + * + * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system + * + */ + + function Cylindrical( radius, theta, y ) { + + this.radius = ( radius !== undefined ) ? radius : 1.0; // distance from the origin to a point in the x-z plane + this.theta = ( theta !== undefined ) ? theta : 0; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis + this.y = ( y !== undefined ) ? y : 0; // height above the x-z plane + + return this; + + } + + Object.assign( Cylindrical.prototype, { + + set: function ( radius, theta, y ) { + + this.radius = radius; + this.theta = theta; + this.y = y; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( other ) { + + this.radius = other.radius; + this.theta = other.theta; + this.y = other.y; + + return this; + + }, + + setFromVector3: function ( vec3 ) { + + this.radius = Math.sqrt( vec3.x * vec3.x + vec3.z * vec3.z ); + this.theta = Math.atan2( vec3.x, vec3.z ); + this.y = vec3.y; + + return this; + + } + + } ); + + /** + * @author bhouston / http://clara.io + */ + + function Box2( min, max ) { + + this.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity ); + this.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity ); + + } + + Object.assign( Box2.prototype, { + + set: function ( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + }, + + setFromPoints: function ( points ) { + + this.makeEmpty(); + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + }, + + setFromCenterAndSize: function () { + + var v1 = new Vector2(); + + return function setFromCenterAndSize( center, size ) { + + var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + }, + + makeEmpty: function () { + + this.min.x = this.min.y = + Infinity; + this.max.x = this.max.y = - Infinity; + + return this; + + }, + + isEmpty: function () { + + // 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 ); + + }, + + getCenter: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box2: .getCenter() target is now required' ); + target = new Vector2(); + + } + + return this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + }, + + getSize: function ( target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box2: .getSize() target is now required' ); + target = new Vector2(); + + } + + return this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min ); + + }, + + expandByPoint: function ( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + }, + + expandByVector: function ( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + }, + + expandByScalar: function ( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + }, + + containsPoint: function ( point ) { + + return point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y ? false : true; + + }, + + containsBox: function ( box ) { + + return this.min.x <= box.min.x && box.max.x <= this.max.x && + this.min.y <= box.min.y && box.max.y <= this.max.y; + + }, + + getParameter: function ( point, target ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + if ( target === undefined ) { + + console.warn( 'THREE.Box2: .getParameter() target is now required' ); + target = new Vector2(); + + } + + return target.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ) + ); + + }, + + intersectsBox: function ( box ) { + + // using 4 splitting planes to rule out intersections + + return box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y ? false : true; + + }, + + clampPoint: function ( point, target ) { + + if ( target === undefined ) { + + console.warn( 'THREE.Box2: .clampPoint() target is now required' ); + target = new Vector2(); + + } + + return target.copy( point ).clamp( this.min, this.max ); + + }, + + distanceToPoint: function () { + + var v1 = new Vector2(); + + return function distanceToPoint( point ) { + + var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + }; + + }(), + + intersect: function ( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + return this; + + }, + + union: function ( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + }, + + translate: function ( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + }, + + equals: function ( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function ImmediateRenderObject( material ) { + + Object3D.call( this ); + + this.material = material; + this.render = function ( /* renderCallback */ ) {}; + + } + + ImmediateRenderObject.prototype = Object.create( Object3D.prototype ); + ImmediateRenderObject.prototype.constructor = ImmediateRenderObject; + + ImmediateRenderObject.prototype.isImmediateRenderObject = true; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function VertexNormalsHelper( object, size, hex, linewidth ) { + + this.object = object; + + this.size = ( size !== undefined ) ? size : 1; + + var color = ( hex !== undefined ) ? hex : 0xff0000; + + var width = ( linewidth !== undefined ) ? linewidth : 1; + + // + + var nNormals = 0; + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + nNormals = objGeometry.faces.length * 3; + + } else if ( objGeometry && objGeometry.isBufferGeometry ) { + + nNormals = objGeometry.attributes.normal.count; + + } + + // + + var geometry = new BufferGeometry(); + + var positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 ); + + geometry.addAttribute( 'position', positions ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) ); + + // + + this.matrixAutoUpdate = false; + + this.update(); + + } + + VertexNormalsHelper.prototype = Object.create( LineSegments.prototype ); + VertexNormalsHelper.prototype.constructor = VertexNormalsHelper; + + VertexNormalsHelper.prototype.update = ( function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var normalMatrix = new Matrix3(); + + return function update() { + + var keys = [ 'a', 'b', 'c' ]; + + this.object.updateMatrixWorld( true ); + + normalMatrix.getNormalMatrix( this.object.matrixWorld ); + + var matrixWorld = this.object.matrixWorld; + + var position = this.geometry.attributes.position; + + // + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + var vertices = objGeometry.vertices; + + var faces = objGeometry.faces; + + var idx = 0; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + var vertex = vertices[ face[ keys[ j ] ] ]; + + var normal = face.vertexNormals[ j ]; + + v1.copy( vertex ).applyMatrix4( matrixWorld ); + + v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + } + + } else if ( objGeometry && objGeometry.isBufferGeometry ) { + + var objPos = objGeometry.attributes.position; + + var objNorm = objGeometry.attributes.normal; + + var idx = 0; + + // for simplicity, ignore index and drawcalls, and render every normal + + for ( var j = 0, jl = objPos.count; j < jl; j ++ ) { + + v1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld ); + + v2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) ); + + v2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + } + + position.needsUpdate = true; + + }; + + }() ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function SpotLightHelper( light, color ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + var geometry = new BufferGeometry(); + + var 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 ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) { + + var p1 = ( i / l ) * Math.PI * 2; + var p2 = ( j / l ) * Math.PI * 2; + + positions.push( + Math.cos( p1 ), Math.sin( p1 ), 1, + Math.cos( p2 ), Math.sin( p2 ), 1 + ); + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + + var material = new LineBasicMaterial( { fog: false } ); + + this.cone = new LineSegments( geometry, material ); + this.add( this.cone ); + + this.update(); + + } + + SpotLightHelper.prototype = Object.create( Object3D.prototype ); + SpotLightHelper.prototype.constructor = SpotLightHelper; + + SpotLightHelper.prototype.dispose = function () { + + this.cone.geometry.dispose(); + this.cone.material.dispose(); + + }; + + SpotLightHelper.prototype.update = function () { + + var vector = new Vector3(); + var vector2 = new Vector3(); + + return function update() { + + this.light.updateMatrixWorld(); + + var coneLength = this.light.distance ? this.light.distance : 1000; + var coneWidth = coneLength * Math.tan( this.light.angle ); + + this.cone.scale.set( coneWidth, coneWidth, coneLength ); + + vector.setFromMatrixPosition( this.light.matrixWorld ); + vector2.setFromMatrixPosition( this.light.target.matrixWorld ); + + this.cone.lookAt( vector2.sub( vector ) ); + + if ( this.color !== undefined ) { + + this.cone.material.color.set( this.color ); + + } else { + + this.cone.material.color.copy( this.light.color ); + + } + + }; + + }(); + + /** + * @author Sean Griffin / http://twitter.com/sgrif + * @author Michael Guerrero / http://realitymeltdown.com + * @author mrdoob / http://mrdoob.com/ + * @author ikerr / http://verold.com + * @author Mugen87 / https://github.com/Mugen87 + */ + + function getBoneList( object ) { + + var boneList = []; + + if ( object && object.isBone ) { + + boneList.push( object ); + + } + + for ( var i = 0; i < object.children.length; i ++ ) { + + boneList.push.apply( boneList, getBoneList( object.children[ i ] ) ); + + } + + return boneList; + + } + + function SkeletonHelper( object ) { + + var bones = getBoneList( object ); + + var geometry = new BufferGeometry(); + + var vertices = []; + var colors = []; + + var color1 = new Color( 0, 0, 1 ); + var color2 = new Color( 0, 1, 0 ); + + for ( var i = 0; i < bones.length; i ++ ) { + + var 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 ); + colors.push( color2.r, color2.g, color2.b ); + + } + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } ); + + LineSegments.call( this, geometry, material ); + + this.root = object; + this.bones = bones; + + this.matrix = object.matrixWorld; + this.matrixAutoUpdate = false; + + } + + SkeletonHelper.prototype = Object.create( LineSegments.prototype ); + SkeletonHelper.prototype.constructor = SkeletonHelper; + + SkeletonHelper.prototype.updateMatrixWorld = function () { + + var vector = new Vector3(); + + var boneMatrix = new Matrix4(); + var matrixWorldInv = new Matrix4(); + + return function updateMatrixWorld( force ) { + + var bones = this.bones; + + var geometry = this.geometry; + var position = geometry.getAttribute( 'position' ); + + matrixWorldInv.getInverse( this.root.matrixWorld ); + + for ( var i = 0, j = 0; i < bones.length; i ++ ) { + + var bone = bones[ i ]; + + if ( bone.parent && bone.parent.isBone ) { + + boneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld ); + vector.setFromMatrixPosition( boneMatrix ); + position.setXYZ( j, vector.x, vector.y, vector.z ); + + boneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld ); + vector.setFromMatrixPosition( boneMatrix ); + position.setXYZ( j + 1, vector.x, vector.y, vector.z ); + + j += 2; + + } + + } + + geometry.getAttribute( 'position' ).needsUpdate = true; + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + }; + + }(); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function PointLightHelper( light, sphereSize, color ) { + + this.light = light; + this.light.updateMatrixWorld(); + + this.color = color; + + var geometry = new SphereBufferGeometry( sphereSize, 4, 2 ); + var material = new MeshBasicMaterial( { wireframe: true, fog: false } ); + + Mesh.call( this, geometry, material ); + + this.matrix = this.light.matrixWorld; + this.matrixAutoUpdate = false; + + this.update(); + + + /* + var distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 ); + var distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } ); + + this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial ); + this.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial ); + + var d = light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.scale.set( d, d, d ); + + } + + this.add( this.lightDistance ); + */ + + } + + PointLightHelper.prototype = Object.create( Mesh.prototype ); + PointLightHelper.prototype.constructor = PointLightHelper; + + PointLightHelper.prototype.dispose = function () { + + this.geometry.dispose(); + this.material.dispose(); + + }; + + PointLightHelper.prototype.update = function () { + + if ( this.color !== undefined ) { + + this.material.color.set( this.color ); + + } else { + + this.material.color.copy( this.light.color ); + + } + + /* + var d = this.light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.visible = true; + this.lightDistance.scale.set( d, d, d ); + + } + */ + + }; + + /** + * @author abelnation / http://github.com/abelnation + * @author Mugen87 / http://github.com/Mugen87 + * @author WestLangley / http://github.com/WestLangley + */ + + function RectAreaLightHelper( light, color ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + var material = new LineBasicMaterial( { fog: false } ); + + var geometry = new BufferGeometry(); + + geometry.addAttribute( 'position', new BufferAttribute( new Float32Array( 5 * 3 ), 3 ) ); + + this.line = new Line( geometry, material ); + this.add( this.line ); + + + this.update(); + + } + + RectAreaLightHelper.prototype = Object.create( Object3D.prototype ); + RectAreaLightHelper.prototype.constructor = RectAreaLightHelper; + + RectAreaLightHelper.prototype.dispose = function () { + + this.children[ 0 ].geometry.dispose(); + this.children[ 0 ].material.dispose(); + + }; + + RectAreaLightHelper.prototype.update = function () { + + // calculate new dimensions of the helper + + var hx = this.light.width * 0.5; + var hy = this.light.height * 0.5; + + var position = this.line.geometry.attributes.position; + var array = position.array; + + // update vertices + + array[ 0 ] = hx; array[ 1 ] = - hy; array[ 2 ] = 0; + array[ 3 ] = hx; array[ 4 ] = hy; array[ 5 ] = 0; + array[ 6 ] = - hx; array[ 7 ] = hy; array[ 8 ] = 0; + array[ 9 ] = - hx; array[ 10 ] = - hy; array[ 11 ] = 0; + array[ 12 ] = hx; array[ 13 ] = - hy; array[ 14 ] = 0; + + position.needsUpdate = true; + + if ( this.color !== undefined ) { + + this.line.material.color.set( this.color ); + + } else { + + this.line.material.color.copy( this.light.color ); + + } + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + function HemisphereLightHelper( light, size, color ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + var geometry = new OctahedronBufferGeometry( size ); + geometry.rotateY( Math.PI * 0.5 ); + + this.material = new MeshBasicMaterial( { wireframe: true, fog: false } ); + if ( this.color === undefined ) this.material.vertexColors = VertexColors; + + var position = geometry.getAttribute( 'position' ); + var colors = new Float32Array( position.count * 3 ); + + geometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) ); + + this.add( new Mesh( geometry, this.material ) ); + + this.update(); + + } + + HemisphereLightHelper.prototype = Object.create( Object3D.prototype ); + HemisphereLightHelper.prototype.constructor = HemisphereLightHelper; + + HemisphereLightHelper.prototype.dispose = function () { + + this.children[ 0 ].geometry.dispose(); + this.children[ 0 ].material.dispose(); + + }; + + HemisphereLightHelper.prototype.update = function () { + + var vector = new Vector3(); + + var color1 = new Color(); + var color2 = new Color(); + + return function update() { + + var mesh = this.children[ 0 ]; + + if ( this.color !== undefined ) { + + this.material.color.set( this.color ); + + } else { + + var colors = mesh.geometry.getAttribute( 'color' ); + + color1.copy( this.light.color ); + color2.copy( this.light.groundColor ); + + for ( var i = 0, l = colors.count; i < l; i ++ ) { + + var color = ( i < ( l / 2 ) ) ? color1 : color2; + + colors.setXYZ( i, color.r, color.g, color.b ); + + } + + colors.needsUpdate = true; + + } + + mesh.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() ); + + }; + + }(); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function GridHelper( size, divisions, color1, color2 ) { + + size = size || 10; + divisions = divisions || 10; + color1 = new Color( color1 !== undefined ? color1 : 0x444444 ); + color2 = new Color( color2 !== undefined ? color2 : 0x888888 ); + + var center = divisions / 2; + var step = size / divisions; + var halfSize = size / 2; + + var vertices = [], colors = []; + + for ( var 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 ); + + var color = i === center ? color1 : color2; + + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + + } + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + + } + + GridHelper.prototype = Object.create( LineSegments.prototype ); + GridHelper.prototype.constructor = GridHelper; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / http://github.com/Mugen87 + * @author Hectate / http://www.github.com/Hectate + */ + + function PolarGridHelper( radius, radials, circles, divisions, color1, color2 ) { + + radius = radius || 10; + radials = radials || 16; + circles = circles || 8; + divisions = divisions || 64; + color1 = new Color( color1 !== undefined ? color1 : 0x444444 ); + color2 = new Color( color2 !== undefined ? color2 : 0x888888 ); + + var vertices = []; + var colors = []; + + var x, z; + var v, i, j, r, color; + + // create the radials + + for ( i = 0; i <= radials; i ++ ) { + + v = ( i / radials ) * ( Math.PI * 2 ); + + x = Math.sin( v ) * radius; + z = Math.cos( v ) * radius; + + vertices.push( 0, 0, 0 ); + vertices.push( x, 0, z ); + + color = ( i & 1 ) ? color1 : color2; + + colors.push( color.r, color.g, color.b ); + colors.push( color.r, color.g, color.b ); + + } + + // create the circles + + for ( i = 0; i <= circles; i ++ ) { + + color = ( i & 1 ) ? color1 : color2; + + r = radius - ( radius / circles * i ); + + for ( j = 0; j < divisions; j ++ ) { + + // first vertex + + v = ( j / 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 ); + + // 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 ); + + } + + } + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + + } + + PolarGridHelper.prototype = Object.create( LineSegments.prototype ); + PolarGridHelper.prototype.constructor = PolarGridHelper; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function FaceNormalsHelper( object, size, hex, linewidth ) { + + // FaceNormalsHelper only supports THREE.Geometry + + this.object = object; + + this.size = ( size !== undefined ) ? size : 1; + + var color = ( hex !== undefined ) ? hex : 0xffff00; + + var width = ( linewidth !== undefined ) ? linewidth : 1; + + // + + var nNormals = 0; + + var objGeometry = this.object.geometry; + + if ( objGeometry && objGeometry.isGeometry ) { + + nNormals = objGeometry.faces.length; + + } else { + + console.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' ); + + } + + // + + var geometry = new BufferGeometry(); + + var positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 ); + + geometry.addAttribute( 'position', positions ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) ); + + // + + this.matrixAutoUpdate = false; + this.update(); + + } + + FaceNormalsHelper.prototype = Object.create( LineSegments.prototype ); + FaceNormalsHelper.prototype.constructor = FaceNormalsHelper; + + FaceNormalsHelper.prototype.update = ( function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var normalMatrix = new Matrix3(); + + return function update() { + + this.object.updateMatrixWorld( true ); + + normalMatrix.getNormalMatrix( this.object.matrixWorld ); + + var matrixWorld = this.object.matrixWorld; + + var position = this.geometry.attributes.position; + + // + + var objGeometry = this.object.geometry; + + var vertices = objGeometry.vertices; + + var faces = objGeometry.faces; + + var idx = 0; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + var normal = face.normal; + + v1.copy( vertices[ face.a ] ) + .add( vertices[ face.b ] ) + .add( vertices[ face.c ] ) + .divideScalar( 3 ) + .applyMatrix4( matrixWorld ); + + v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + position.needsUpdate = true; + + }; + + }() ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function DirectionalLightHelper( light, size, color ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.color = color; + + if ( size === undefined ) size = 1; + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( [ + - size, size, 0, + size, size, 0, + size, - size, 0, + - size, - size, 0, + - size, size, 0 + ], 3 ) ); + + var material = new LineBasicMaterial( { fog: false } ); + + this.lightPlane = new Line( geometry, material ); + this.add( this.lightPlane ); + + geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) ); + + this.targetLine = new Line( geometry, material ); + this.add( this.targetLine ); + + this.update(); + + } + + DirectionalLightHelper.prototype = Object.create( Object3D.prototype ); + DirectionalLightHelper.prototype.constructor = DirectionalLightHelper; + + DirectionalLightHelper.prototype.dispose = function () { + + this.lightPlane.geometry.dispose(); + this.lightPlane.material.dispose(); + this.targetLine.geometry.dispose(); + this.targetLine.material.dispose(); + + }; + + DirectionalLightHelper.prototype.update = function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var v3 = new Vector3(); + + return function update() { + + v1.setFromMatrixPosition( this.light.matrixWorld ); + v2.setFromMatrixPosition( this.light.target.matrixWorld ); + v3.subVectors( v2, v1 ); + + this.lightPlane.lookAt( v3 ); + + if ( this.color !== undefined ) { + + this.lightPlane.material.color.set( this.color ); + this.targetLine.material.color.set( this.color ); + + } else { + + this.lightPlane.material.color.copy( this.light.color ); + this.targetLine.material.color.copy( this.light.color ); + + } + + this.targetLine.lookAt( v3 ); + this.targetLine.scale.z = v3.length(); + + }; + + }(); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author Mugen87 / https://github.com/Mugen87 + * + * - shows frustum, line of sight and up of the camera + * - suitable for fast updates + * - based on frustum visualization in lightgl.js shadowmap example + * http://evanw.github.com/lightgl.js/tests/shadowmap.html + */ + + function CameraHelper( camera ) { + + var geometry = new BufferGeometry(); + var material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } ); + + var vertices = []; + var colors = []; + + var pointMap = {}; + + // colors + + var colorFrustum = new Color( 0xffaa00 ); + var colorCone = new Color( 0xff0000 ); + var colorUp = new Color( 0x00aaff ); + var colorTarget = new Color( 0xffffff ); + var colorCross = new Color( 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', colorCross ); + + // 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 ) { + + vertices.push( 0, 0, 0 ); + colors.push( color.r, color.g, color.b ); + + if ( pointMap[ id ] === undefined ) { + + pointMap[ id ] = []; + + } + + pointMap[ id ].push( ( vertices.length / 3 ) - 1 ); + + } + + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + LineSegments.call( this, geometry, material ); + + this.camera = camera; + if ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix(); + + this.matrix = camera.matrixWorld; + this.matrixAutoUpdate = false; + + this.pointMap = pointMap; + + this.update(); + + } + + CameraHelper.prototype = Object.create( LineSegments.prototype ); + CameraHelper.prototype.constructor = CameraHelper; + + CameraHelper.prototype.update = function () { + + var geometry, pointMap; + + var vector = new Vector3(); + var camera = new Camera(); + + function setPoint( point, x, y, z ) { + + vector.set( x, y, z ).unproject( camera ); + + var points = pointMap[ point ]; + + if ( points !== undefined ) { + + var position = geometry.getAttribute( 'position' ); + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + position.setXYZ( points[ i ], vector.x, vector.y, vector.z ); + + } + + } + + } + + return function update() { + + geometry = this.geometry; + pointMap = this.pointMap; + + var w = 1, h = 1; + + // we need just camera projection matrix + // world matrix must be identity + + camera.projectionMatrix.copy( this.camera.projectionMatrix ); + + // center / target + + setPoint( 'c', 0, 0, - 1 ); + setPoint( 't', 0, 0, 1 ); + + // near + + setPoint( 'n1', - w, - h, - 1 ); + setPoint( 'n2', w, - h, - 1 ); + setPoint( 'n3', - w, h, - 1 ); + setPoint( 'n4', w, h, - 1 ); + + // far + + setPoint( 'f1', - w, - h, 1 ); + setPoint( 'f2', w, - h, 1 ); + setPoint( 'f3', - w, h, 1 ); + setPoint( 'f4', w, h, 1 ); + + // up + + setPoint( 'u1', w * 0.7, h * 1.1, - 1 ); + setPoint( 'u2', - w * 0.7, h * 1.1, - 1 ); + setPoint( 'u3', 0, h * 2, - 1 ); + + // cross + + setPoint( 'cf1', - w, 0, 1 ); + setPoint( 'cf2', w, 0, 1 ); + setPoint( 'cf3', 0, - h, 1 ); + setPoint( 'cf4', 0, h, 1 ); + + setPoint( 'cn1', - w, 0, - 1 ); + setPoint( 'cn2', w, 0, - 1 ); + setPoint( 'cn3', 0, - h, - 1 ); + setPoint( 'cn4', 0, h, - 1 ); + + geometry.getAttribute( 'position' ).needsUpdate = true; + + }; + + }(); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / http://github.com/Mugen87 + */ + + function BoxHelper( object, color ) { + + this.object = object; + + if ( color === undefined ) color = 0xffff00; + + var 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 ] ); + var positions = new Float32Array( 8 * 3 ); + + var geometry = new BufferGeometry(); + geometry.setIndex( new BufferAttribute( indices, 1 ) ); + geometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) ); + + this.matrixAutoUpdate = false; + + this.update(); + + } + + BoxHelper.prototype = Object.create( LineSegments.prototype ); + BoxHelper.prototype.constructor = BoxHelper; + + BoxHelper.prototype.update = ( function () { + + var box = new Box3(); + + return function update( object ) { + + if ( object !== undefined ) { + + console.warn( 'THREE.BoxHelper: .update() has no longer arguments.' ); + + } + + if ( this.object !== undefined ) { + + box.setFromObject( this.object ); + + } + + if ( box.isEmpty() ) return; + + var min = box.min; + var max = box.max; + + /* + 5____4 + 1/___0/| + | 6__|_7 + 2/___3/ + + 0: max.x, max.y, max.z + 1: min.x, max.y, max.z + 2: min.x, min.y, max.z + 3: max.x, min.y, max.z + 4: max.x, max.y, min.z + 5: min.x, max.y, min.z + 6: min.x, min.y, min.z + 7: max.x, min.y, min.z + */ + + var position = this.geometry.attributes.position; + var 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.needsUpdate = true; + + this.geometry.computeBoundingSphere(); + + }; + + } )(); + + BoxHelper.prototype.setFromObject = function ( object ) { + + this.object = object; + this.update(); + + return this; + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + */ + + function Box3Helper( box, hex ) { + + this.type = 'Box3Helper'; + + this.box = box; + + var color = ( hex !== undefined ) ? hex : 0xffff00; + + var 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 ] ); + + var 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 ]; + + var geometry = new BufferGeometry(); + + geometry.setIndex( new BufferAttribute( indices, 1 ) ); + + geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) ); + + this.geometry.computeBoundingSphere(); + + } + + Box3Helper.prototype = Object.create( LineSegments.prototype ); + Box3Helper.prototype.constructor = Box3Helper; + + Box3Helper.prototype.updateMatrixWorld = function ( force ) { + + var box = this.box; + + if ( box.isEmpty() ) return; + + box.getCenter( this.position ); + + box.getSize( this.scale ); + + this.scale.multiplyScalar( 0.5 ); + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + */ + + function PlaneHelper( plane, size, hex ) { + + this.type = 'PlaneHelper'; + + this.plane = plane; + + this.size = ( size === undefined ) ? 1 : size; + + var color = ( hex !== undefined ) ? hex : 0xffff00; + + var 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, 0, 0, 1, 0, 0, 0 ]; + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); + geometry.computeBoundingSphere(); + + Line.call( this, geometry, new LineBasicMaterial( { color: color } ) ); + + // + + var positions2 = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, - 1, 1, 1, - 1, 1 ]; + + var geometry2 = new BufferGeometry(); + geometry2.addAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) ); + geometry2.computeBoundingSphere(); + + this.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false } ) ) ); + + } + + PlaneHelper.prototype = Object.create( Line.prototype ); + PlaneHelper.prototype.constructor = PlaneHelper; + + PlaneHelper.prototype.updateMatrixWorld = function ( force ) { + + var scale = - this.plane.constant; + + if ( Math.abs( scale ) < 1e-8 ) scale = 1e-8; // sign does not matter + + this.scale.set( 0.5 * this.size, 0.5 * this.size, scale ); + + this.lookAt( this.plane.normal ); + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + * @author zz85 / http://github.com/zz85 + * @author bhouston / http://clara.io + * + * Creates an arrow for visualizing directions + * + * Parameters: + * dir - Vector3 + * origin - Vector3 + * length - Number + * color - color in hex value + * headLength - Number + * headWidth - Number + */ + + var lineGeometry; + var coneGeometry; + + function ArrowHelper( dir, origin, length, color, headLength, headWidth ) { + + // dir is assumed to be normalized + + Object3D.call( this ); + + if ( color === undefined ) color = 0xffff00; + if ( length === undefined ) length = 1; + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + if ( lineGeometry === undefined ) { + + lineGeometry = new BufferGeometry(); + lineGeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) ); + + coneGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 ); + coneGeometry.translate( 0, - 0.5, 0 ); + + } + + this.position.copy( origin ); + + this.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) ); + this.line.matrixAutoUpdate = false; + this.add( this.line ); + + this.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) ); + this.cone.matrixAutoUpdate = false; + this.add( this.cone ); + + this.setDirection( dir ); + this.setLength( length, headLength, headWidth ); + + } + + ArrowHelper.prototype = Object.create( Object3D.prototype ); + ArrowHelper.prototype.constructor = ArrowHelper; + + ArrowHelper.prototype.setDirection = ( function () { + + var axis = new Vector3(); + var radians; + + return function setDirection( dir ) { + + // dir is assumed to be normalized + + if ( dir.y > 0.99999 ) { + + this.quaternion.set( 0, 0, 0, 1 ); + + } else if ( dir.y < - 0.99999 ) { + + this.quaternion.set( 1, 0, 0, 0 ); + + } else { + + axis.set( dir.z, 0, - dir.x ).normalize(); + + radians = Math.acos( dir.y ); + + this.quaternion.setFromAxisAngle( axis, radians ); + + } + + }; + + }() ); + + ArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) { + + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + this.line.scale.set( 1, Math.max( 0, length - headLength ), 1 ); + this.line.updateMatrix(); + + this.cone.scale.set( headWidth, headLength, headWidth ); + this.cone.position.y = length; + this.cone.updateMatrix(); + + }; + + ArrowHelper.prototype.setColor = function ( color ) { + + this.line.material.color.copy( color ); + this.cone.material.color.copy( color ); + + }; + + /** + * @author sroucheray / http://sroucheray.org/ + * @author mrdoob / http://mrdoob.com/ + */ + + function AxesHelper( size ) { + + size = size || 1; + + var vertices = [ + 0, 0, 0, size, 0, 0, + 0, 0, 0, 0, size, 0, + 0, 0, 0, 0, 0, size + ]; + + var colors = [ + 1, 0, 0, 1, 0.6, 0, + 0, 1, 0, 0.6, 1, 0, + 0, 0, 1, 0, 0.6, 1 + ]; + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + + } + + AxesHelper.prototype = Object.create( LineSegments.prototype ); + AxesHelper.prototype.constructor = AxesHelper; + + // + + Curve.create = function ( construct, getPoint ) { + + console.log( 'THREE.Curve.create() has been deprecated' ); + + construct.prototype = Object.create( Curve.prototype ); + construct.prototype.constructor = construct; + construct.prototype.getPoint = getPoint; + + return construct; + + }; + + // + + Object.assign( CurvePath.prototype, { + + createPointsGeometry: function ( divisions ) { + + console.warn( 'THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' ); + + // generate geometry from path points (for Line or Points objects) + + var pts = this.getPoints( divisions ); + return this.createGeometry( pts ); + + }, + + createSpacedPointsGeometry: function ( divisions ) { + + console.warn( 'THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' ); + + // generate geometry from equidistant sampling along the path + + var pts = this.getSpacedPoints( divisions ); + return this.createGeometry( pts ); + + }, + + createGeometry: function ( points ) { + + console.warn( 'THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' ); + + var geometry = new Geometry(); + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + var point = points[ i ]; + geometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) ); + + } + + return geometry; + + } + + } ); + + // + + Object.assign( Path.prototype, { + + fromPoints: function ( points ) { + + console.warn( 'THREE.Path: .fromPoints() has been renamed to .setFromPoints().' ); + this.setFromPoints( points ); + + } + + } ); + + // + + function Spline( points ) { + + console.warn( 'THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + + } + + Spline.prototype = Object.create( CatmullRomCurve3.prototype ); + + Object.assign( Spline.prototype, { + + initFromArray: function ( /* a */ ) { + + console.error( 'THREE.Spline: .initFromArray() has been removed.' ); + + }, + getControlPointsArray: function ( /* optionalTarget */ ) { + + console.error( 'THREE.Spline: .getControlPointsArray() has been removed.' ); + + }, + reparametrizeByArcLength: function ( /* samplingCoef */ ) { + + console.error( 'THREE.Spline: .reparametrizeByArcLength() has been removed.' ); + + } + + } ); + + GridHelper.prototype.setColors = function () { + + console.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' ); + + }; + + SkeletonHelper.prototype.update = function () { + + console.error( 'THREE.SkeletonHelper: update() no longer needs to be called.' ); + + }; + + // + + Object.assign( Loader.prototype, { + + extractUrlBase: function ( url ) { + + console.warn( 'THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.' ); + return LoaderUtils.extractUrlBase( url ); + + } + + } ); + + // + + Object.assign( Box2.prototype, { + + center: function ( optionalTarget ) { + + console.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }, + empty: function () { + + console.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + + }, + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + size: function ( optionalTarget ) { + + console.warn( 'THREE.Box2: .size() has been renamed to .getSize().' ); + return this.getSize( optionalTarget ); + + } + } ); + + Object.assign( Box3.prototype, { + + center: function ( optionalTarget ) { + + console.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }, + empty: function () { + + console.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + + }, + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + isIntersectionSphere: function ( sphere ) { + + console.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); + return this.intersectsSphere( sphere ); + + }, + size: function ( optionalTarget ) { + + console.warn( 'THREE.Box3: .size() has been renamed to .getSize().' ); + return this.getSize( optionalTarget ); + + } + } ); + + Line3.prototype.center = function ( optionalTarget ) { + + console.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + + }; + + Object.assign( _Math, { + + random16: function () { + + console.warn( 'THREE.Math: .random16() has been deprecated. Use Math.random() instead.' ); + return Math.random(); + + }, + + nearestPowerOfTwo: function ( value ) { + + console.warn( 'THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo().' ); + return _Math.floorPowerOfTwo( value ); + + }, + + nextPowerOfTwo: function ( value ) { + + console.warn( 'THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo().' ); + return _Math.ceilPowerOfTwo( value ); + + } + + } ); + + Object.assign( Matrix3.prototype, { + + flattenToArrayOffset: function ( array, offset ) { + + console.warn( "THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead." ); + return this.toArray( array, offset ); + + }, + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' ); + return vector.applyMatrix3( this ); + + }, + multiplyVector3Array: function ( /* a */ ) { + + console.error( 'THREE.Matrix3: .multiplyVector3Array() has been removed.' ); + + }, + applyToBuffer: function ( buffer /*, offset, length */ ) { + + console.warn( 'THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' ); + return this.applyToBufferAttribute( buffer ); + + }, + applyToVector3Array: function ( /* array, offset, length */ ) { + + console.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' ); + + } + + } ); + + Object.assign( Matrix4.prototype, { + + extractPosition: function ( m ) { + + console.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' ); + return this.copyPosition( m ); + + }, + flattenToArrayOffset: function ( array, offset ) { + + console.warn( "THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead." ); + return this.toArray( array, offset ); + + }, + getPosition: function () { + + var v1; + + return function getPosition() { + + if ( v1 === undefined ) v1 = new Vector3(); + console.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' ); + return v1.setFromMatrixColumn( this, 3 ); + + }; + + }(), + setRotationFromQuaternion: function ( q ) { + + console.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' ); + return this.makeRotationFromQuaternion( q ); + + }, + multiplyToArray: function () { + + console.warn( 'THREE.Matrix4: .multiplyToArray() has been removed.' ); + + }, + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + multiplyVector4: function ( vector ) { + + console.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + multiplyVector3Array: function ( /* a */ ) { + + console.error( 'THREE.Matrix4: .multiplyVector3Array() has been removed.' ); + + }, + rotateAxis: function ( v ) { + + console.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' ); + v.transformDirection( this ); + + }, + crossVector: function ( vector ) { + + console.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + translate: function () { + + console.error( 'THREE.Matrix4: .translate() has been removed.' ); + + }, + rotateX: function () { + + console.error( 'THREE.Matrix4: .rotateX() has been removed.' ); + + }, + rotateY: function () { + + console.error( 'THREE.Matrix4: .rotateY() has been removed.' ); + + }, + rotateZ: function () { + + console.error( 'THREE.Matrix4: .rotateZ() has been removed.' ); + + }, + rotateByAxis: function () { + + console.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' ); + + }, + applyToBuffer: function ( buffer /*, offset, length */ ) { + + console.warn( 'THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' ); + return this.applyToBufferAttribute( buffer ); + + }, + applyToVector3Array: function ( /* array, offset, length */ ) { + + console.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' ); + + }, + makeFrustum: function ( left, right, bottom, top, near, far ) { + + console.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' ); + return this.makePerspective( left, right, top, bottom, near, far ); + + } + + } ); + + Plane.prototype.isIntersectionLine = function ( line ) { + + console.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' ); + return this.intersectsLine( line ); + + }; + + Quaternion.prototype.multiplyVector3 = function ( vector ) { + + console.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' ); + return vector.applyQuaternion( this ); + + }; + + Object.assign( Ray.prototype, { + + isIntersectionBox: function ( box ) { + + console.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + + }, + isIntersectionPlane: function ( plane ) { + + console.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' ); + return this.intersectsPlane( plane ); + + }, + isIntersectionSphere: function ( sphere ) { + + console.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); + return this.intersectsSphere( sphere ); + + } + + } ); + + Object.assign( Triangle.prototype, { + + area: function () { + + console.warn( 'THREE.Triangle: .area() has been renamed to .getArea().' ); + return this.getArea(); + + }, + barycoordFromPoint: function ( point, target ) { + + console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' ); + return this.getBarycoord( point, target ); + + }, + midpoint: function ( target ) { + + console.warn( 'THREE.Triangle: .midpoint() has been renamed to .getMidpoint().' ); + return this.getMidpoint( target ); + + }, + normal: function ( target ) { + + console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' ); + return this.getNormal( target ); + + }, + plane: function ( target ) { + + console.warn( 'THREE.Triangle: .plane() has been renamed to .getPlane().' ); + return this.getPlane( target ); + + } + + } ); + + Object.assign( Triangle, { + + barycoordFromPoint: function ( point, a, b, c, target ) { + + console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' ); + return Triangle.getBarycoord( point, a, b, c, target ); + + }, + normal: function ( a, b, c, target ) { + + console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' ); + return Triangle.getNormal( a, b, c, target ); + + } + + } ); + + Object.assign( Shape.prototype, { + + extractAllPoints: function ( divisions ) { + + console.warn( 'THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.' ); + return this.extractPoints( divisions ); + + }, + extrude: function ( options ) { + + console.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' ); + return new ExtrudeGeometry( this, options ); + + }, + makeGeometry: function ( options ) { + + console.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' ); + return new ShapeGeometry( this, options ); + + } + + } ); + + Object.assign( Vector2.prototype, { + + fromAttribute: function ( attribute, index, offset ) { + + console.warn( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + }, + distanceToManhattan: function ( v ) { + + console.warn( 'THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' ); + return this.manhattanDistanceTo( v ); + + }, + lengthManhattan: function () { + + console.warn( 'THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().' ); + return this.manhattanLength(); + + } + + } ); + + Object.assign( Vector3.prototype, { + + setEulerFromRotationMatrix: function () { + + console.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' ); + + }, + setEulerFromQuaternion: function () { + + console.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' ); + + }, + getPositionFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' ); + return this.setFromMatrixPosition( m ); + + }, + getScaleFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' ); + return this.setFromMatrixScale( m ); + + }, + getColumnFromMatrix: function ( index, matrix ) { + + console.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' ); + return this.setFromMatrixColumn( matrix, index ); + + }, + applyProjection: function ( m ) { + + console.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' ); + return this.applyMatrix4( m ); + + }, + fromAttribute: function ( attribute, index, offset ) { + + console.warn( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + }, + distanceToManhattan: function ( v ) { + + console.warn( 'THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' ); + return this.manhattanDistanceTo( v ); + + }, + lengthManhattan: function () { + + console.warn( 'THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().' ); + return this.manhattanLength(); + + } + + } ); + + Object.assign( Vector4.prototype, { + + fromAttribute: function ( attribute, index, offset ) { + + console.warn( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' ); + return this.fromBufferAttribute( attribute, index, offset ); + + }, + lengthManhattan: function () { + + console.warn( 'THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().' ); + return this.manhattanLength(); + + } + + } ); + + // + + Object.assign( Geometry.prototype, { + + computeTangents: function () { + + console.error( 'THREE.Geometry: .computeTangents() has been removed.' ); + + }, + computeLineDistances: function () { + + console.error( 'THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.' ); + + } + + } ); + + Object.assign( Object3D.prototype, { + + getChildByName: function ( name ) { + + console.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' ); + return this.getObjectByName( name ); + + }, + renderDepth: function () { + + console.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' ); + + }, + translate: function ( distance, axis ) { + + console.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' ); + return this.translateOnAxis( axis, distance ); + + }, + getWorldRotation: function () { + + console.error( 'THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.' ); + + } + + } ); + + Object.defineProperties( Object3D.prototype, { + + eulerOrder: { + get: function () { + + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + return this.rotation.order; + + }, + set: function ( value ) { + + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + this.rotation.order = value; + + } + }, + useQuaternion: { + get: function () { + + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + + }, + set: function () { + + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + + } + } + + } ); + + Object.defineProperties( LOD.prototype, { + + objects: { + get: function () { + + console.warn( 'THREE.LOD: .objects has been renamed to .levels.' ); + return this.levels; + + } + } + + } ); + + Object.defineProperty( Skeleton.prototype, 'useVertexTexture', { + + get: function () { + + console.warn( 'THREE.Skeleton: useVertexTexture has been removed.' ); + + }, + set: function () { + + console.warn( 'THREE.Skeleton: useVertexTexture has been removed.' ); + + } + + } ); + + Object.defineProperty( Curve.prototype, '__arcLengthDivisions', { + + get: function () { + + console.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' ); + return this.arcLengthDivisions; + + }, + set: function ( value ) { + + console.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' ); + this.arcLengthDivisions = value; + + } + + } ); + + // + + PerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) { + + console.warn( "THREE.PerspectiveCamera.setLens is deprecated. " + + "Use .setFocalLength and .filmGauge for a photographic setup." ); + + if ( filmGauge !== undefined ) this.filmGauge = filmGauge; + this.setFocalLength( focalLength ); + + }; + + // + + Object.defineProperties( Light.prototype, { + onlyShadow: { + set: function () { + + console.warn( 'THREE.Light: .onlyShadow has been removed.' ); + + } + }, + shadowCameraFov: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' ); + this.shadow.camera.fov = value; + + } + }, + shadowCameraLeft: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' ); + this.shadow.camera.left = value; + + } + }, + shadowCameraRight: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' ); + this.shadow.camera.right = value; + + } + }, + shadowCameraTop: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' ); + this.shadow.camera.top = value; + + } + }, + shadowCameraBottom: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' ); + this.shadow.camera.bottom = value; + + } + }, + shadowCameraNear: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' ); + this.shadow.camera.near = value; + + } + }, + shadowCameraFar: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' ); + this.shadow.camera.far = value; + + } + }, + shadowCameraVisible: { + set: function () { + + console.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' ); + + } + }, + shadowBias: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' ); + this.shadow.bias = value; + + } + }, + shadowDarkness: { + set: function () { + + console.warn( 'THREE.Light: .shadowDarkness has been removed.' ); + + } + }, + shadowMapWidth: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' ); + this.shadow.mapSize.width = value; + + } + }, + shadowMapHeight: { + set: function ( value ) { + + console.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' ); + this.shadow.mapSize.height = value; + + } + } + } ); + + // + + Object.defineProperties( BufferAttribute.prototype, { + + length: { + get: function () { + + console.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' ); + return this.array.length; + + } + }, + copyIndicesArray: function ( /* indices */ ) { + + console.error( 'THREE.BufferAttribute: .copyIndicesArray() has been removed.' ); + + } + + } ); + + Object.assign( BufferGeometry.prototype, { + + addIndex: function ( index ) { + + console.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' ); + this.setIndex( index ); + + }, + addDrawCall: function ( start, count, indexOffset ) { + + if ( indexOffset !== undefined ) { + + console.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' ); + + } + console.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' ); + this.addGroup( start, count ); + + }, + clearDrawCalls: function () { + + console.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' ); + this.clearGroups(); + + }, + computeTangents: function () { + + console.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' ); + + }, + computeOffsets: function () { + + console.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' ); + + } + + } ); + + Object.defineProperties( BufferGeometry.prototype, { + + drawcalls: { + get: function () { + + console.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' ); + return this.groups; + + } + }, + offsets: { + get: function () { + + console.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' ); + return this.groups; + + } + } + + } ); + + // + + Object.assign( ExtrudeBufferGeometry.prototype, { + + getArrays: function () { + + console.error( 'THREE.ExtrudeBufferGeometry: .getArrays() has been removed.' ); + + }, + + addShapeList: function () { + + console.error( 'THREE.ExtrudeBufferGeometry: .addShapeList() has been removed.' ); + + }, + + addShape: function () { + + console.error( 'THREE.ExtrudeBufferGeometry: .addShape() has been removed.' ); + + } + + } ); + + // + + Object.defineProperties( Uniform.prototype, { + + dynamic: { + set: function () { + + console.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' ); + + } + }, + onUpdate: { + value: function () { + + console.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' ); + return this; + + } + } + + } ); + + // + + Object.defineProperties( Material.prototype, { + + wrapAround: { + get: function () { + + console.warn( 'THREE.Material: .wrapAround has been removed.' ); + + }, + set: function () { + + console.warn( 'THREE.Material: .wrapAround has been removed.' ); + + } + }, + wrapRGB: { + get: function () { + + console.warn( 'THREE.Material: .wrapRGB has been removed.' ); + return new Color(); + + } + }, + + shading: { + get: function () { + + console.error( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' ); + + }, + set: function ( value ) { + + console.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' ); + this.flatShading = ( value === FlatShading ); + + } + } + + } ); + + Object.defineProperties( MeshPhongMaterial.prototype, { + + metal: { + get: function () { + + console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' ); + return false; + + }, + set: function () { + + console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' ); + + } + } + + } ); + + Object.defineProperties( ShaderMaterial.prototype, { + + derivatives: { + get: function () { + + console.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); + return this.extensions.derivatives; + + }, + set: function ( value ) { + + console.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); + this.extensions.derivatives = value; + + } + } + + } ); + + // + + Object.assign( WebGLRenderer.prototype, { + + getCurrentRenderTarget: function () { + + console.warn( 'THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().' ); + return this.getRenderTarget(); + + }, + + getMaxAnisotropy: function () { + + console.warn( 'THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().' ); + return this.capabilities.getMaxAnisotropy(); + + }, + + getPrecision: function () { + + console.warn( 'THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.' ); + return this.capabilities.precision; + + }, + + resetGLState: function () { + + console.warn( 'THREE.WebGLRenderer: .resetGLState() is now .state.reset().' ); + return this.state.reset(); + + }, + + supportsFloatTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \'OES_texture_float\' ).' ); + return this.extensions.get( 'OES_texture_float' ); + + }, + supportsHalfFloatTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \'OES_texture_half_float\' ).' ); + return this.extensions.get( 'OES_texture_half_float' ); + + }, + supportsStandardDerivatives: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \'OES_standard_derivatives\' ).' ); + return this.extensions.get( 'OES_standard_derivatives' ); + + }, + supportsCompressedTextureS3TC: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \'WEBGL_compressed_texture_s3tc\' ).' ); + return this.extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + }, + supportsCompressedTexturePVRTC: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \'WEBGL_compressed_texture_pvrtc\' ).' ); + return this.extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + }, + supportsBlendMinMax: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \'EXT_blend_minmax\' ).' ); + return this.extensions.get( 'EXT_blend_minmax' ); + + }, + supportsVertexTextures: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' ); + return this.capabilities.vertexTextures; + + }, + supportsInstancedArrays: function () { + + console.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \'ANGLE_instanced_arrays\' ).' ); + return this.extensions.get( 'ANGLE_instanced_arrays' ); + + }, + enableScissorTest: function ( boolean ) { + + console.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' ); + this.setScissorTest( boolean ); + + }, + initMaterial: function () { + + console.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' ); + + }, + addPrePlugin: function () { + + console.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' ); + + }, + addPostPlugin: function () { + + console.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' ); + + }, + updateShadowMap: function () { + + console.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' ); + + }, + setFaceCulling: function () { + + console.warn( 'THREE.WebGLRenderer: .setFaceCulling() has been removed.' ); + + } + + } ); + + Object.defineProperties( WebGLRenderer.prototype, { + + shadowMapEnabled: { + get: function () { + + return this.shadowMap.enabled; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' ); + this.shadowMap.enabled = value; + + } + }, + shadowMapType: { + get: function () { + + return this.shadowMap.type; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' ); + this.shadowMap.type = value; + + } + }, + shadowMapCullFace: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function ( /* value */ ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' ); + + } + } + } ); + + Object.defineProperties( WebGLShadowMap.prototype, { + + cullFace: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function ( /* cullFace */ ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' ); + + } + }, + renderReverseSided: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' ); + + } + }, + renderSingleSided: { + get: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' ); + return undefined; + + }, + set: function () { + + console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' ); + + } + } + + } ); + + // + + Object.defineProperties( WebGLRenderTarget.prototype, { + + wrapS: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + return this.texture.wrapS; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + this.texture.wrapS = value; + + } + }, + wrapT: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + return this.texture.wrapT; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + this.texture.wrapT = value; + + } + }, + magFilter: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + return this.texture.magFilter; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + this.texture.magFilter = value; + + } + }, + minFilter: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + return this.texture.minFilter; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + this.texture.minFilter = value; + + } + }, + anisotropy: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + return this.texture.anisotropy; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + this.texture.anisotropy = value; + + } + }, + offset: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + return this.texture.offset; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + this.texture.offset = value; + + } + }, + repeat: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + return this.texture.repeat; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + this.texture.repeat = value; + + } + }, + format: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + return this.texture.format; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + this.texture.format = value; + + } + }, + type: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + return this.texture.type; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + this.texture.type = value; + + } + }, + generateMipmaps: { + get: function () { + + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + return this.texture.generateMipmaps; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + this.texture.generateMipmaps = value; + + } + } + + } ); + + // + + Object.defineProperties( WebVRManager.prototype, { + + standing: { + set: function ( /* value */ ) { + + console.warn( 'THREE.WebVRManager: .standing has been removed.' ); + + } + } + + } ); + + // + + Audio.prototype.load = function ( file ) { + + console.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' ); + var scope = this; + var audioLoader = new AudioLoader(); + audioLoader.load( file, function ( buffer ) { + + scope.setBuffer( buffer ); + + } ); + return this; + + }; + + AudioAnalyser.prototype.getData = function () { + + console.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' ); + return this.getFrequencyData(); + + }; + + // + + CubeCamera.prototype.updateCubeMap = function ( renderer, scene ) { + + console.warn( 'THREE.CubeCamera: .updateCubeMap() is now .update().' ); + return this.update( renderer, scene ); + + }; + + var minivents_commonjs = function Events(target){ + var events = {}, empty = []; + target = target || this; + /** + * On: listen to events + */ + target.on = function(type, func, ctx){ + (events[type] = events[type] || []).push([func, ctx]); + return target + }; + /** + * Off: stop listening to event / specific callback + */ + target.off = function(type, func){ + type || (events = {}); + var list = events[type] || empty, + i = list.length = func ? list.length : 0; + while(i--) func == list[i][0] && list.splice(i,1); + return target + }; + /** + * Emit: send event, callbacks will be triggered + */ + target.emit = function(type){ + var e = events[type] || empty, list = e.length > 0 ? e.slice(0, e.length) : e, i=0, j; + while(j=list[i++]) j[0].apply(j[1], empty.slice.call(arguments, 1)); + return target + }; + }; + + // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) + _export(_export.S, 'Object', { create: _objectCreate }); + + var $Object$2 = _core.Object; + var create = function create(P, D) { + return $Object$2.create(P, D); + }; + + var create$1 = create; + + var _validateCollection = function (it, TYPE) { + if (!_isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!'); + return it; + }; + + var dP$2 = _objectDp.f; + + + + + + + + + + var fastKey = _meta.fastKey; + + var SIZE = _descriptors ? '_s' : 'size'; + + var getEntry = function (that, key) { + // fast case + var index = fastKey(key); + var entry; + if (index !== 'F') return that._i[index]; + // frozen object case + for (entry = that._f; entry; entry = entry.n) { + if (entry.k == key) return entry; + } + }; + + var _collectionStrong = { + getConstructor: function (wrapper, NAME, IS_MAP, ADDER) { + var C = wrapper(function (that, iterable) { + _anInstance(that, C, NAME, '_i'); + that._t = NAME; // collection type + that._i = _objectCreate(null); // index + that._f = undefined; // first entry + that._l = undefined; // last entry + that[SIZE] = 0; // size + if (iterable != undefined) _forOf(iterable, IS_MAP, that[ADDER], that); + }); + _redefineAll(C.prototype, { + // 23.1.3.1 Map.prototype.clear() + // 23.2.3.2 Set.prototype.clear() + clear: function clear() { + for (var that = _validateCollection(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) { + entry.r = true; + if (entry.p) entry.p = entry.p.n = undefined; + delete data[entry.i]; + } + that._f = that._l = undefined; + that[SIZE] = 0; + }, + // 23.1.3.3 Map.prototype.delete(key) + // 23.2.3.4 Set.prototype.delete(value) + 'delete': function (key) { + var that = _validateCollection(this, NAME); + var entry = getEntry(that, key); + if (entry) { + var next = entry.n; + var prev = entry.p; + delete that._i[entry.i]; + entry.r = true; + if (prev) prev.n = next; + if (next) next.p = prev; + if (that._f == entry) that._f = next; + if (that._l == entry) that._l = prev; + that[SIZE]--; + } return !!entry; + }, + // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined) + // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined) + forEach: function forEach(callbackfn /* , that = undefined */) { + _validateCollection(this, NAME); + var f = _ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3); + var entry; + while (entry = entry ? entry.n : this._f) { + f(entry.v, entry.k, this); + // revert to the last existing entry + while (entry && entry.r) entry = entry.p; + } + }, + // 23.1.3.7 Map.prototype.has(key) + // 23.2.3.7 Set.prototype.has(value) + has: function has(key) { + return !!getEntry(_validateCollection(this, NAME), key); + } + }); + if (_descriptors) dP$2(C.prototype, 'size', { + get: function () { + return _validateCollection(this, NAME)[SIZE]; + } + }); + return C; + }, + def: function (that, key, value) { + var entry = getEntry(that, key); + var prev, index; + // change existing entry + if (entry) { + entry.v = value; + // create new entry + } else { + that._l = entry = { + i: index = fastKey(key, true), // <- index + k: key, // <- key + v: value, // <- value + p: prev = that._l, // <- previous entry + n: undefined, // <- next entry + r: false // <- removed + }; + if (!that._f) that._f = entry; + if (prev) prev.n = entry; + that[SIZE]++; + // add to index + if (index !== 'F') that._i[index] = entry; + } return that; + }, + getEntry: getEntry, + setStrong: function (C, NAME, IS_MAP) { + // add .keys, .values, .entries, [@@iterator] + // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11 + _iterDefine(C, NAME, function (iterated, kind) { + this._t = _validateCollection(iterated, NAME); // target + this._k = kind; // kind + this._l = undefined; // previous + }, function () { + var that = this; + var kind = that._k; + var entry = that._l; + // revert to the last existing entry + while (entry && entry.r) entry = entry.p; + // get next entry + if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) { + // or finish the iteration + that._t = undefined; + return _iterStep(1); + } + // return step by kind + if (kind == 'keys') return _iterStep(0, entry.k); + if (kind == 'values') return _iterStep(0, entry.v); + return _iterStep(0, [entry.k, entry.v]); + }, IS_MAP ? 'entries' : 'values', !IS_MAP, true); + + // add [@@species], 23.1.2.2, 23.2.2.2 + _setSpecies(NAME); + } + }; + + var SPECIES$2 = _wks('species'); + + var _arraySpeciesConstructor = function (original) { + var C; + if (_isArray(original)) { + C = original.constructor; + // cross-realm fallback + if (typeof C == 'function' && (C === Array || _isArray(C.prototype))) C = undefined; + if (_isObject(C)) { + C = C[SPECIES$2]; + if (C === null) C = undefined; + } + } return C === undefined ? Array : C; + }; + + // 9.4.2.3 ArraySpeciesCreate(originalArray, length) + + + var _arraySpeciesCreate = function (original, length) { + return new (_arraySpeciesConstructor(original))(length); + }; + + // 0 -> Array#forEach + // 1 -> Array#map + // 2 -> Array#filter + // 3 -> Array#some + // 4 -> Array#every + // 5 -> Array#find + // 6 -> Array#findIndex + + + + + + var _arrayMethods = function (TYPE, $create) { + var IS_MAP = TYPE == 1; + var IS_FILTER = TYPE == 2; + var IS_SOME = TYPE == 3; + var IS_EVERY = TYPE == 4; + var IS_FIND_INDEX = TYPE == 6; + var NO_HOLES = TYPE == 5 || IS_FIND_INDEX; + var create = $create || _arraySpeciesCreate; + return function ($this, callbackfn, that) { + var O = _toObject($this); + var self = _iobject(O); + var f = _ctx(callbackfn, that, 3); + var length = _toLength(self.length); + var index = 0; + var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined; + var val, res; + for (;length > index; index++) if (NO_HOLES || index in self) { + val = self[index]; + res = f(val, index, O); + if (TYPE) { + if (IS_MAP) result[index] = res; // map + else if (res) switch (TYPE) { + case 3: return true; // some + case 5: return val; // find + case 6: return index; // findIndex + case 2: result.push(val); // filter + } else if (IS_EVERY) return false; // every + } + } + return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result; + }; + }; + + var dP$3 = _objectDp.f; + var each = _arrayMethods(0); + + + var _collection = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) { + var Base = _global[NAME]; + var C = Base; + var ADDER = IS_MAP ? 'set' : 'add'; + var proto = C && C.prototype; + var O = {}; + if (!_descriptors || typeof C != 'function' || !(IS_WEAK || proto.forEach && !_fails(function () { + new C().entries().next(); + }))) { + // create collection constructor + C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER); + _redefineAll(C.prototype, methods); + _meta.NEED = true; + } else { + C = wrapper(function (target, iterable) { + _anInstance(target, C, NAME, '_c'); + target._c = new Base(); + if (iterable != undefined) _forOf(iterable, IS_MAP, target[ADDER], target); + }); + each('add,clear,delete,forEach,get,has,set,keys,values,entries,toJSON'.split(','), function (KEY) { + var IS_ADDER = KEY == 'add' || KEY == 'set'; + if (KEY in proto && !(IS_WEAK && KEY == 'clear')) _hide(C.prototype, KEY, function (a, b) { + _anInstance(this, C, KEY); + if (!IS_ADDER && IS_WEAK && !_isObject(a)) return KEY == 'get' ? undefined : false; + var result = this._c[KEY](a === 0 ? 0 : a, b); + return IS_ADDER ? this : result; + }); + }); + IS_WEAK || dP$3(C.prototype, 'size', { + get: function () { + return this._c.size; + } + }); + } + + _setToStringTag(C, NAME); + + O[NAME] = C; + _export(_export.G + _export.W + _export.F, O); + + if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP); + + return C; + }; + + var MAP = 'Map'; + + // 23.1 Map Objects + var es6_map = _collection(MAP, function (get) { + return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); }; + }, { + // 23.1.3.6 Map.prototype.get(key) + get: function get(key) { + var entry = _collectionStrong.getEntry(_validateCollection(this, MAP), key); + return entry && entry.v; + }, + // 23.1.3.9 Map.prototype.set(key, value) + set: function set(key, value) { + return _collectionStrong.def(_validateCollection(this, MAP), key === 0 ? 0 : key, value); + } + }, _collectionStrong, true); + + var _arrayFromIterable = function (iter, ITERATOR) { + var result = []; + _forOf(iter, false, result.push, result, ITERATOR); + return result; + }; + + // https://github.com/DavidBruant/Map-Set.prototype.toJSON + + + var _collectionToJson = function (NAME) { + return function toJSON() { + if (_classof(this) != NAME) throw TypeError(NAME + "#toJSON isn't generic"); + return _arrayFromIterable(this); + }; + }; + + // https://github.com/DavidBruant/Map-Set.prototype.toJSON + + + _export(_export.P + _export.R, 'Map', { toJSON: _collectionToJson('Map') }); + + // https://tc39.github.io/proposal-setmap-offrom/ + + + var _setCollectionOf = function (COLLECTION) { + _export(_export.S, COLLECTION, { of: function of() { + var length = arguments.length; + var A = new Array(length); + while (length--) A[length] = arguments[length]; + return new this(A); + } }); + }; + + // https://tc39.github.io/proposal-setmap-offrom/#sec-map.of + _setCollectionOf('Map'); + + // https://tc39.github.io/proposal-setmap-offrom/ + + + + + + var _setCollectionFrom = function (COLLECTION) { + _export(_export.S, COLLECTION, { from: function from(source /* , mapFn, thisArg */) { + var mapFn = arguments[1]; + var mapping, A, n, cb; + _aFunction(this); + mapping = mapFn !== undefined; + if (mapping) _aFunction(mapFn); + if (source == undefined) return new this(); + A = []; + if (mapping) { + n = 0; + cb = _ctx(mapFn, arguments[2], 2); + _forOf(source, false, function (nextItem) { + A.push(cb(nextItem, n++)); + }); + } else { + _forOf(source, false, A.push, A); + } + return new this(A); + } }); + }; + + // https://tc39.github.io/proposal-setmap-offrom/#sec-map.from + _setCollectionFrom('Map'); + + var map = _core.Map; + + var map$1 = map; + + var arraySlice = [].slice; + var factories = {}; + + var construct = function (F, len, args) { + if (!(len in factories)) { + for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']'; + // eslint-disable-next-line no-new-func + factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')'); + } return factories[len](F, args); + }; + + var _bind = Function.bind || function bind(that /* , ...args */) { + var fn = _aFunction(this); + var partArgs = arraySlice.call(arguments, 1); + var bound = function (/* args... */) { + var args = partArgs.concat(arraySlice.call(arguments)); + return this instanceof bound ? construct(fn, args.length, args) : _invoke(fn, args, that); + }; + if (_isObject(fn.prototype)) bound.prototype = fn.prototype; + return bound; + }; + + // 26.1.2 Reflect.construct(target, argumentsList [, newTarget]) + + + + + + + + var rConstruct = (_global.Reflect || {}).construct; + + // MS Edge supports only 2 arguments and argumentsList argument is optional + // FF Nightly sets third argument as `new.target`, but does not create `this` from it + var NEW_TARGET_BUG = _fails(function () { + function F() { /* empty */ } + return !(rConstruct(function () { /* empty */ }, [], F) instanceof F); + }); + var ARGS_BUG = !_fails(function () { + rConstruct(function () { /* empty */ }); + }); + + _export(_export.S + _export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', { + construct: function construct(Target, args /* , newTarget */) { + _aFunction(Target); + _anObject(args); + var newTarget = arguments.length < 3 ? Target : _aFunction(arguments[2]); + if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget); + if (Target == newTarget) { + // w/o altered newTarget, optimization for 0-4 arguments + switch (args.length) { + case 0: return new Target(); + case 1: return new Target(args[0]); + case 2: return new Target(args[0], args[1]); + case 3: return new Target(args[0], args[1], args[2]); + case 4: return new Target(args[0], args[1], args[2], args[3]); + } + // w/o altered newTarget, lot of arguments case + var $args = [null]; + $args.push.apply($args, args); + return new (_bind.apply(Target, $args))(); + } + // with altered newTarget, not support built-in constructors + var proto = newTarget.prototype; + var instance = _objectCreate(_isObject(proto) ? proto : Object.prototype); + var result = Function.apply.call(Target, instance, args); + return _isObject(result) ? result : instance; + } + }); + + var construct$1 = _core.Reflect.construct; + + var construct$2 = construct$1; + + var construct$3 = createCommonjsModule(function (module) { + function _construct(Parent, args, Class) { + if (typeof Reflect !== "undefined" && construct$2) { + module.exports = _construct = construct$2; + } else { + module.exports = _construct = function _construct(Parent, args, Class) { + var a = [null]; + a.push.apply(a, args); + var Constructor = Parent.bind.apply(Parent, a); + var instance = new Constructor(); + if (Class) setPrototypeOf$2(instance, Class.prototype); + return instance; + }; + } + + return _construct.apply(null, arguments); + } + + module.exports = _construct; + }); + + var wrapNativeSuper = createCommonjsModule(function (module) { + function _wrapNativeSuper(Class) { + var _cache = typeof map$1 === "function" ? new map$1() : undefined; + + module.exports = _wrapNativeSuper = function _wrapNativeSuper(Class) { + if (typeof Class !== "function") { + throw new TypeError("Super expression must either be null or a function"); + } + + if (typeof _cache !== "undefined") { + if (_cache.has(Class)) return _cache.get(Class); + + _cache.set(Class, Wrapper); + } + + function Wrapper() {} + + Wrapper.prototype = create$1(Class.prototype, { + constructor: { + value: Wrapper, + enumerable: false, + writable: true, + configurable: true + } + }); + return setPrototypeOf$2(Wrapper, setPrototypeOf$2(function Super() { + return construct$3(Class, arguments, getPrototypeOf$2(this).constructor); + }, Class)); + }; + + return _wrapNativeSuper(Class); + } + + module.exports = _wrapNativeSuper; + }); + + var CompositionError$1 = + /*#__PURE__*/ + function (_Error) { + function CompositionError(classInstance, message, component) { + var _this; + + classCallCheck(this, CompositionError); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(CompositionError).call(this, "@".concat(classInstance, ": ").concat(message))); + + var stackArray = _this.stack.split('\n'); + + stackArray.splice(1, 2); + _this.stack = stackArray.join('\n'); + if (console) console.error('Component:', component); + _this.name = 'CompositionError'; + return _this; + } + + inherits(CompositionError, _Error); + + return CompositionError; + }(wrapNativeSuper(Error)); + var DependencyError = + /*#__PURE__*/ + function (_Error2) { + function DependencyError(classInstance, message, activeModule) { + var _this2; + + var dependencyModule = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + + classCallCheck(this, DependencyError); + + _this2 = possibleConstructorReturn(this, getPrototypeOf$2(DependencyError).call(this, "@".concat(classInstance, ": ").concat(message))); + + var stackArray = _this2.stack.split('\n'); + + stackArray.splice(1, 2); + _this2.stack = stackArray.join('\n'); + if (console) console.error('Active module:', activeModule); + if (console && dependencyModule) console.error('Dependency published by module:', dependencyModule); + _this2.name = 'DependencyError'; + return _this2; + } + + inherits(DependencyError, _Error2); + + return DependencyError; + }(wrapNativeSuper(Error)); + var ManagerError = + /*#__PURE__*/ + function (_Error3) { + function ManagerError(classInstance, message, component) { + var _this3; + + var activeModule = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + + classCallCheck(this, ManagerError); + + _this3 = possibleConstructorReturn(this, getPrototypeOf$2(ManagerError).call(this, "@".concat(classInstance, ": ").concat(message))); + + var stackArray = _this3.stack.split('\n'); + + stackArray.splice(1, 2); + _this3.stack = stackArray.join('\n'); + if (console) console.error('Component:', component); + if (console && activeModule) console.error('Active module:', activeModule); + _this3.name = 'ManagerError'; + return _this3; + } + + inherits(ManagerError, _Error3); + + return ManagerError; + }(wrapNativeSuper(Error)); + + var warnDeps = function warnDeps() { + throw new Error('WhitestormJS Framework requ ires Three.js r92. https://threejs.org/'); + }; + + try { + if (!REVISION) warnDeps(); + } catch (err) { + warnDeps(); + } + /** + * @class ModuleSystem + * @category core + * @description Provides API for classes that will use Modules.
    + * This class includes basic event system with those supported methods: + *
    .on()
    .off()
    .emit()
    + * @extends Events + * @memberof module:core + */ + + + var ModuleSystem = + /*#__PURE__*/ + function (_Events) { + function ModuleSystem() { + classCallCheck(this, ModuleSystem); + + return possibleConstructorReturn(this, getPrototypeOf$2(ModuleSystem).apply(this, arguments)); + } + + createClass(ModuleSystem, [{ + key: "integrateModules", + // INTEGRATING + + /** + * @method integrateModules + * @instance + * @description This method applies all modules from .modules collection. + * @param {Object} [source] If source (should be a component) is provided, will replace .modules with source's one before executing modules. + * @memberof module:core.ModuleSystem + */ + value: function integrateModules(source) { + if (!this.modules && !source) return; + if (source && source.modules) this.modules = source.modules.slice(0); + + if (this.modules) { + for (var i = 0, max = this.modules.length; i < max; i++) { + this.applyModule(this.modules[i], false); + } + } + + if (source) this.applyBridge({ + onCopy: source + }); + } // APPLYING MODULE (...and a "bridge" for module) + + /** + * @method applyBridge + * @instance + * @description Makes component-specific API to work with modules. + * @param {Object} bridgeMap + * @return {Object} Returns object with modified values. + * @memberof module:core.ModuleSystem + */ + + }, { + key: "applyBridge", + value: function applyBridge() { + var bridgeMap = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var modules = this.modules; + if (!modules) return bridgeMap; + + for (var i = 0, max = modules.length; i < max; i++) { + for (var key in bridgeMap) { + if (bridgeMap[key]) { + var module = modules[i]; + if (module && module.bridge && module.bridge[key]) bridgeMap[key] = module.bridge[key].apply(this, [bridgeMap[key], module]); + } + } + } + + return bridgeMap; + } + /** + * @method applyCommand + * @instance + * @description .applyCommand runs a method called `name` on all modules. + * @param {String} name the method name. + * @param {Function} [cb=(func, moduleScope) => func.apply(this, [moduleScope])] How the function is wrapped/ + * @memberof module:core.ModuleSystem + */ + + }, { + key: "applyCommand", + value: function applyCommand(name) { + var _this = this; + + var cb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (func, moduleScope) { + return func.apply(_this, [moduleScope]); + }; + var modules = this.modules; + if (!modules) return; + + for (var i = 0, max = modules.length; i < max; i++) { + var module = modules[i]; + if (name in module) cb(module[name], module); + } + } + /** + * @method applyModule + * @instance + * @description .applyModule is also used in .integrateModules() function. + * It does exactly what its name says (applies module to component or app). + * @param {Object} module the module to apply + * @param {Boolean} [push=true] + * @return {Object} Returns module that was applied. + * @throws {ManagerError} + * @memberof module:core.ModuleSystem + */ + + }, { + key: "applyModule", + value: function applyModule(module) { + var push = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + if (!module) return; + if (push && this.modules) this.modules.push(module);else if (push) this.modules = [module]; + if (this.manager) this.manager.active(module); + if (module.manager && this.manager) module.manager(this.manager);else if (module.manager) { + throw new ManagerError('Component', "Module requires ModuleManager that is turned off for this component", this, module); + } + if (module.integrate) module.integrate.bind(this)(module); + return module; + } + /** + * @method disposeModules + * @instance + * @description Disposes of all modules + * @memberof module:core.ModuleSystem + */ + + }, { + key: "disposeModules", + value: function disposeModules() { + while (this.modules.length) { + this.disposeModule(this.modules[0]); + } + } + /** + * @method disposeModule + * @instance + * @description Disposes of the given module + * @param {Object} module the module to dispose + * @return {Module} Returns module that was removed. + * @memberof module:core.ModuleSystem + */ + + }, { + key: "disposeModule", + value: function disposeModule(module) { + if (!module) return; + this.modules.splice(this.modules.indexOf(module), 1); + if (module.dispose) module.dispose.bind(this)(module); + return module; + } // PIPED METHOD + + /** + * @method module + * @instance + * @description piped version of .applyModule(). + * @param {Object} module the module to apply + * @return {this} returns this - app/component + * @throws {ManagerError} + * @memberof module:core.ModuleSystem + * @example Piped modules + * component + * .module(new Module1()) + * .module(new Module2()) + * .module(new Module3()) + */ + + }, { + key: "module", + value: function module(_module) { + this.applyModule(_module); + return this; + } + }]); + + inherits(ModuleSystem, _Events); + + return ModuleSystem; + }(minivents_commonjs); + + function _arrayWithHoles(arr) { + if (Array.isArray(arr)) return arr; + } + + var arrayWithHoles = _arrayWithHoles; + + var core_getIterator = _core.getIterator = function (it) { + var iterFn = core_getIteratorMethod(it); + if (typeof iterFn != 'function') throw TypeError(it + ' is not iterable!'); + return _anObject(iterFn.call(it)); + }; + + var getIterator = core_getIterator; + + var getIterator$1 = getIterator; + + function _iterableToArrayLimit(arr, i) { + var _arr = []; + var _n = true; + var _d = false; + var _e = undefined; + + try { + for (var _i = getIterator$1(arr), _s; !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"] != null) _i["return"](); + } finally { + if (_d) throw _e; + } + } + + return _arr; + } + + var iterableToArrayLimit = _iterableToArrayLimit; + + function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance"); + } + + var nonIterableRest = _nonIterableRest; + + function _slicedToArray(arr, i) { + return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || nonIterableRest(); + } + + var slicedToArray = _slicedToArray; + + function symbolObservablePonyfill(root) { + var result; + var Symbol = root.Symbol; + + if (typeof Symbol === 'function') { + if (Symbol.observable) { + result = Symbol.observable; + } else { + result = Symbol('observable'); + Symbol.observable = result; + } + } else { + result = '@@observable'; + } + + return result; + } + + /* global window */ + + var root; + + if (typeof self !== 'undefined') { + root = self; + } else if (typeof window !== 'undefined') { + root = window; + } else if (typeof global !== 'undefined') { + root = global; + } else if (typeof module !== 'undefined') { + root = module; + } else { + root = Function('return this')(); + } + + var result = symbolObservablePonyfill(root); + + /** + * These are private action types reserved by Redux. + * For any unknown actions, you must return the current state. + * If the current state is undefined, you must return the initial state. + * Do not reference these action types directly in your code. + */ + var ActionTypes = { + INIT: '@@redux/INIT' + Math.random().toString(36).substring(7).split('').join('.'), + REPLACE: '@@redux/REPLACE' + Math.random().toString(36).substring(7).split('').join('.') + }; + + var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { + return typeof obj; + } : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + + /** + * @param {any} obj The object to inspect. + * @returns {boolean} True if the argument appears to be a plain object. + */ + function isPlainObject(obj) { + if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) !== 'object' || obj === null) return false; + + var proto = obj; + while (Object.getPrototypeOf(proto) !== null) { + proto = Object.getPrototypeOf(proto); + } + + return Object.getPrototypeOf(obj) === proto; + } + + /** + * Creates a Redux store that holds the state tree. + * The only way to change the data in the store is to call `dispatch()` on it. + * + * There should only be a single store in your app. To specify how different + * parts of the state tree respond to actions, you may combine several reducers + * into a single reducer function by using `combineReducers`. + * + * @param {Function} reducer A function that returns the next state tree, given + * the current state tree and the action to handle. + * + * @param {any} [preloadedState] The initial state. You may optionally specify it + * to hydrate the state from the server in universal apps, or to restore a + * previously serialized user session. + * If you use `combineReducers` to produce the root reducer function, this must be + * an object with the same shape as `combineReducers` keys. + * + * @param {Function} [enhancer] The store enhancer. You may optionally specify it + * to enhance the store with third-party capabilities such as middleware, + * time travel, persistence, etc. The only store enhancer that ships with Redux + * is `applyMiddleware()`. + * + * @returns {Store} A Redux store that lets you read the state, dispatch actions + * and subscribe to changes. + */ + function createStore(reducer, preloadedState, enhancer) { + var _ref2; + + if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') { + enhancer = preloadedState; + preloadedState = undefined; + } + + if (typeof enhancer !== 'undefined') { + if (typeof enhancer !== 'function') { + throw new Error('Expected the enhancer to be a function.'); + } + + return enhancer(createStore)(reducer, preloadedState); + } + + if (typeof reducer !== 'function') { + throw new Error('Expected the reducer to be a function.'); + } + + var currentReducer = reducer; + var currentState = preloadedState; + var currentListeners = []; + var nextListeners = currentListeners; + var isDispatching = false; + + function ensureCanMutateNextListeners() { + if (nextListeners === currentListeners) { + nextListeners = currentListeners.slice(); + } + } + + /** + * Reads the state tree managed by the store. + * + * @returns {any} The current state tree of your application. + */ + function getState() { + if (isDispatching) { + throw new Error('You may not call store.getState() while the reducer is executing. ' + 'The reducer has already received the state as an argument. ' + 'Pass it down from the top reducer instead of reading it from the store.'); + } + + return currentState; + } + + /** + * Adds a change listener. It will be called any time an action is dispatched, + * and some part of the state tree may potentially have changed. You may then + * call `getState()` to read the current state tree inside the callback. + * + * You may call `dispatch()` from a change listener, with the following + * caveats: + * + * 1. The subscriptions are snapshotted just before every `dispatch()` call. + * If you subscribe or unsubscribe while the listeners are being invoked, this + * will not have any effect on the `dispatch()` that is currently in progress. + * However, the next `dispatch()` call, whether nested or not, will use a more + * recent snapshot of the subscription list. + * + * 2. The listener should not expect to see all state changes, as the state + * might have been updated multiple times during a nested `dispatch()` before + * the listener is called. It is, however, guaranteed that all subscribers + * registered before the `dispatch()` started will be called with the latest + * state by the time it exits. + * + * @param {Function} listener A callback to be invoked on every dispatch. + * @returns {Function} A function to remove this change listener. + */ + function subscribe(listener) { + if (typeof listener !== 'function') { + throw new Error('Expected the listener to be a function.'); + } + + if (isDispatching) { + throw new Error('You may not call store.subscribe() while the reducer is executing. ' + 'If you would like to be notified after the store has been updated, subscribe from a ' + 'component and invoke store.getState() in the callback to access the latest state. ' + 'See https://redux.js.org/api-reference/store#subscribe(listener) for more details.'); + } + + var isSubscribed = true; + + ensureCanMutateNextListeners(); + nextListeners.push(listener); + + return function unsubscribe() { + if (!isSubscribed) { + return; + } + + if (isDispatching) { + throw new Error('You may not unsubscribe from a store listener while the reducer is executing. ' + 'See https://redux.js.org/api-reference/store#subscribe(listener) for more details.'); + } + + isSubscribed = false; + + ensureCanMutateNextListeners(); + var index = nextListeners.indexOf(listener); + nextListeners.splice(index, 1); + }; + } + + /** + * Dispatches an action. It is the only way to trigger a state change. + * + * The `reducer` function, used to create the store, will be called with the + * current state tree and the given `action`. Its return value will + * be considered the **next** state of the tree, and the change listeners + * will be notified. + * + * The base implementation only supports plain object actions. If you want to + * dispatch a Promise, an Observable, a thunk, or something else, you need to + * wrap your store creating function into the corresponding middleware. For + * example, see the documentation for the `redux-thunk` package. Even the + * middleware will eventually dispatch plain object actions using this method. + * + * @param {Object} action A plain object representing “what changed”. It is + * a good idea to keep actions serializable so you can record and replay user + * sessions, or use the time travelling `redux-devtools`. An action must have + * a `type` property which may not be `undefined`. It is a good idea to use + * string constants for action types. + * + * @returns {Object} For convenience, the same action object you dispatched. + * + * Note that, if you use a custom middleware, it may wrap `dispatch()` to + * return something else (for example, a Promise you can await). + */ + function dispatch(action) { + if (!isPlainObject(action)) { + throw new Error('Actions must be plain objects. ' + 'Use custom middleware for async actions.'); + } + + if (typeof action.type === 'undefined') { + throw new Error('Actions may not have an undefined "type" property. ' + 'Have you misspelled a constant?'); + } + + if (isDispatching) { + throw new Error('Reducers may not dispatch actions.'); + } + + try { + isDispatching = true; + currentState = currentReducer(currentState, action); + } finally { + isDispatching = false; + } + + var listeners = currentListeners = nextListeners; + for (var i = 0; i < listeners.length; i++) { + var listener = listeners[i]; + listener(); + } + + return action; + } + + /** + * Replaces the reducer currently used by the store to calculate the state. + * + * You might need this if your app implements code splitting and you want to + * load some of the reducers dynamically. You might also need this if you + * implement a hot reloading mechanism for Redux. + * + * @param {Function} nextReducer The reducer for the store to use instead. + * @returns {void} + */ + function replaceReducer(nextReducer) { + if (typeof nextReducer !== 'function') { + throw new Error('Expected the nextReducer to be a function.'); + } + + currentReducer = nextReducer; + dispatch({ type: ActionTypes.REPLACE }); + } + + /** + * Interoperability point for observable/reactive libraries. + * @returns {observable} A minimal observable of state changes. + * For more information, see the observable proposal: + * https://github.com/tc39/proposal-observable + */ + function observable() { + var _ref; + + var outerSubscribe = subscribe; + return _ref = { + /** + * The minimal observable subscription method. + * @param {Object} observer Any object that can be used as an observer. + * The observer object should have a `next` method. + * @returns {subscription} An object with an `unsubscribe` method that can + * be used to unsubscribe the observable from the store, and prevent further + * emission of values from the observable. + */ + subscribe: function subscribe(observer) { + if ((typeof observer === 'undefined' ? 'undefined' : _typeof(observer)) !== 'object' || observer === null) { + throw new TypeError('Expected the observer to be an object.'); + } + + function observeState() { + if (observer.next) { + observer.next(getState()); + } + } + + observeState(); + var unsubscribe = outerSubscribe(observeState); + return { unsubscribe: unsubscribe }; + } + }, _ref[result] = function () { + return this; + }, _ref; + } + + // When a store is created, an "INIT" action is dispatched so that every + // reducer returns their initial state. This effectively populates + // the initial state tree. + dispatch({ type: ActionTypes.INIT }); + + return _ref2 = { + dispatch: dispatch, + subscribe: subscribe, + getState: getState, + replaceReducer: replaceReducer + }, _ref2[result] = observable, _ref2; + } + + /** + * Prints a warning in the console if it exists. + * + * @param {String} message The warning message. + * @returns {void} + */ + function warning(message) { + /* eslint-disable no-console */ + if (typeof console !== 'undefined' && typeof console.error === 'function') { + console.error(message); + } + /* eslint-enable no-console */ + try { + // This error was thrown as a convenience so that if you enable + // "break on all exceptions" in your console, + // it would pause the execution at this line. + throw new Error(message); + } catch (e) {} // eslint-disable-line no-empty + } + + /* + * This is a dummy function to check if the function name has been altered by minification. + * If the function has been minified and NODE_ENV !== 'production', warn the user. + */ + function isCrushed() {} + + if (undefined !== 'production' && typeof isCrushed.name === 'string' && isCrushed.name !== 'isCrushed') { + warning("You are currently using minified code outside of NODE_ENV === 'production'. " + 'This means that you are running a slower development build of Redux. ' + 'You can use loose-envify (https://github.com/zertosh/loose-envify) for browserify ' + 'or DefinePlugin for webpack (http://stackoverflow.com/questions/30030031) ' + 'to ensure you have the correct code for your production build.'); + } + + /** + * @class ModuleManager + * @category core + * @param {Object} object handler + * @description Solves modules dependencies + * @memberof module:core + */ + + var ModuleManager = + /*#__PURE__*/ + function () { + function ModuleManager(object) { + classCallCheck(this, ModuleManager); + + this.handler = object; + this.currentModule = null; + this.store = createStore(function () { + var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [{}, '']; + var action = arguments.length > 1 ? arguments[1] : undefined; + state[0][action.key] = action.data; + state[1] = action.key; + return state; + }); + this.modules = {}; + } + /** + * @method active + * @instance + * @description Sets .currentModule to provided module. + * @param {Object} module the module to make current + * @memberof module:core.ModuleManager + */ + + + createClass(ModuleManager, [{ + key: "active", + value: function active(module) { + this.currentModule = module; + } + /** + * @method reset + * @instance + * @description Set's .currentModule to null. + * @memberof module:core.ModuleManager + */ + + }, { + key: "reset", + value: function reset() { + this.currentModule = null; + } + /** + * @method define + * @instance + * @description Define the module in manager + * @param name The module name + * @memberof module:core.ModuleManager + */ + + }, { + key: "define", + value: function define(name) { + this.modules[name] = this.currentModule; + } + /** + * @method use + * @instance + * @description Get the defined module from manager + * @param name The module name + * @memberof module:core.ModuleManager + */ + + }, { + key: "use", + value: function use(name) { + return this.modules[name]; + } + /** + * @method set + * @instance + * @description An alias for .add()

    + * Use this method if you know that you will overwrite existing dependency.
    + * Use it in your app, but not in module that you provide to other people. + * @param {String} key the key of the dependency + * @param {Object} data the value of the dependency + * @memberof module:core.ModuleManager + */ + + }, { + key: "set", + value: function set(key, data) { + this.store.dispatch({ + type: 'ADD', + key: key, + data: data + }); + } + /** + * @method get + * @instance + * @description Returns dependency in store object, by key. + * @param {String} key the key of the dependency + * @memberof module:core.ModuleManager + * @return {Object|Module} + * @throws {DependencyError} if dependency is not in the store + * @example Get the 'hello' dependency + * manager.get('hello'); // -> {world: true} + */ + + }, { + key: "get", + value: function get(key) { + if (!this.store.getState()[0][key]) { + throw new DependencyError('ModuleManager', "Module requires '".concat(key, "' dependency"), this.currentModule); + } + + return this.store.getState()[0][key]; + } + /** + * @method has + * @instance + * @description Returns whether manager has a dependency with the given key + * @param {String} key the key of the dependency + * @memberof module:core.ModuleManager + * @return {Boolean} Promise that is resolved when all promises completed. + * @example Check whether the store has the 'hello' dependency + * manager.has('hello'); // -> true + */ + + }, { + key: "has", + value: function has(key) { + return Boolean(this.store.getState()[0][key]); + } + /** + * @method update + * @instance + * @description Updates deps + * @param {Object} [depsMap={}] + * @memberof module:core.ModuleManager + */ + + }, { + key: "update", + value: function update() { + var _this = this; + + var depsMap = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + this.store.subscribe(function () { + var _this$store$getState = _this.store.getState(), + _this$store$getState2 = slicedToArray(_this$store$getState, 2), + data = _this$store$getState2[0], + changedKey = _this$store$getState2[1]; + + var callback = depsMap[changedKey]; + if (callback) callback(data[changedKey]); + }); + } + /** + * @method add + * @alias module:core.ModuleManager#set + * @memberof module:core.ModuleManager + */ + + }, { + key: "add", + value: function add() { + console.warn('.add() method is deprecated. Use .set() instead'); + return this.set.apply(this, arguments); + } + /** + * @method require + * @instance + * @description Require module + * @param {String} name Defined name + * @param {Function} moduleExecutor Function that returns applied module + * @memberof module:core.ModuleManager + */ + + }, { + key: "require", + value: function require(name, moduleExecutor) { + if (this.use(name) === undefined) this.handler.applyModule(moduleExecutor()); + } + }]); + + return ModuleManager; + }(); + + /** + * @class Component + * @category core + * @param {Object} [params] - The parameters object. + * @param {Object} [instructions] - The instructions object. + * @extends ModuleSystem + * @memberof module:core + */ + + var Component = + /*#__PURE__*/ + function (_ModuleSystem) { + /** + * Default values for parameters + * @member {Object} module:core.Component#defaults + * @static + * @default { + * modules: [], + * manager: true + * } + */ + + /** + * Static instructions + * @member {Object} module:core.Component#instructions + * @static + * @default {} + */ + + /** + * Array of promises that should be resolved before Component is ready. + * @member {Array} module:core.Component#_wait + * @private + */ + // Collection of promises; + + /** + * Collection of `modules`. + * @member {Array} module:core.Component#modules + * @public + */ + // Collection of modules; + + /** + * Collection of `child` Components. + * @member {Array} module:core.Component#children + * @public + */ + // For keeping children components; + function Component() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var defaults = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Component.defaults; + var instructions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Component.instructions; + + classCallCheck(this, Component); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Component).call(this)); // Apply polyfilled parameters to .params; + + defineProperty$3(defineProperty$3(defineProperty$3(assertThisInitialized(assertThisInitialized(_this)), "_wait", []), "modules", []), "children", []); + + _this.params = extend(transformData(params, instructions), defaults); + if (_this.params.manager) _this.manager = new ModuleManager(assertThisInitialized(assertThisInitialized(_this))); + _this.modules = _this.params.modules; + + _this.integrateModules(); + + return _this; + } + /** + * @method wait + * @instance + * @description Wait for a promise. + * @param {Promise} [promise] - The promise that should be added to a queue. + * @return {Promise} Promise that is resolved when all promises completed. + * @memberof module:core.Component + */ + + + createClass(Component, [{ + key: "wait", + value: function wait(promise) { + if (promise) this._wait.push(promise); + return Promise.all(this._wait); + } + /** + * @method defer + * @instance + * @description Execute `func` (Callback) when Component is ready. + * @param {Function} func - Callback. + * @memberof module:core.Component + */ + + }, { + key: "defer", + value: function defer(func) { + var _this2 = this; + + if (this.isDeffered) this.wait().then(function () { + return func(_this2); + });else func(this); + } // PARAMETERS + + /** + * @method updateParams + * @instance + * @description Updates parameters of the Component. + * @return {Object} Params of this Component + * @memberof module:core.Component + */ + + }, { + key: "updateParams", + value: function updateParams() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + this.params = extend(params, this.params); + return this.params; + } // COPYING & CLONING + + /** + * @method clone + * @instance + * @description Clone this component + * @return {object} a cloned component with all its source component' params copied. + * @memberof module:core.Component + */ + + }, { + key: "clone", + value: function clone() { + return new this.constructor(this.params).copy(this); + } + /** + * @method copy + * @instance + * @description Copy source native and integrate `modules` to it. + * @param {Component} source - Source component that is used for `copy()` action. + * @param {Function} [customize] - Callback executed before modules integration process. + * @return {this} Component + * @memberof module:core.Component + */ + + }, { + key: "copy", + value: function copy(source, customize) { + this.params = objectSpread({}, source.params); + if (source.native) this.native = source.native.clone(source.params); + if (customize) customize(); + this.integrateModules(source); + return this; + } + /** + * @method add + * @instance + * @description Add a child `Component`. + * @param {Component} object - Component that should be added as a `child`. + * @return {Promise} Resolved when action is done. + * @memberof module:core.Component + */ + + }, { + key: "add", + value: function () { + var _add = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee(object) { + return regenerator.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + if (!object.parent) { + _context.next = 3; + break; + } + + _context.next = 3; + return object.parent.remove(object); + + case 3: + _context.next = 5; + return this.wait(); + + case 5: + _context.next = 7; + return object.wait(); + + case 7: + if (object.native) { + _context.next = 9; + break; + } + + throw new CompositionError$1('Component', 'there is no object.native', this); + + case 9: + object.parent = this; + _context.next = 12; + return this.applyBridge({ + onAdd: object + }).onAdd; + + case 12: + this.native.add(object.native); + this.children.push(object); + return _context.abrupt("return", object); + + case 15: + case "end": + return _context.stop(); + } + } + }, _callee, this); + })); + + return function add(_x) { + return _add.apply(this, arguments); + }; + }() + /** + * @method remove + * @instance + * @description Remove a child `Component`. + * @param {Component} object - Component that should be a **child** of this Component. + * @return {Promise} Resolved when action is done. + * @memberof module:core.Component + */ + + }, { + key: "remove", + value: function () { + var _remove = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee2(object) { + return regenerator.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + if (!(object.parent !== this)) { + _context2.next = 2; + break; + } + + return _context2.abrupt("return"); + + case 2: + _context2.next = 4; + return this.wait(); + + case 4: + _context2.next = 6; + return object.wait(); + + case 6: + object.parent = null; + this.native.remove(object.native); + this.children.splice(this.children.indexOf(object), 1); + + case 9: + case "end": + return _context2.stop(); + } + } + }, _callee2, this); + })); + + return function remove(_x2) { + return _remove.apply(this, arguments); + }; + }() + /** + * @method addTo + * @instance + * @description Adds `this` Component to specified `App`/`Component`. + * @param {Component} object - Component that will be a parent of `this`. + * @memberof module:core.Component + */ + + }, { + key: "addTo", + value: function addTo(object) { + return object.add(this); + } + }, { + key: "get", + value: function get(key) { + return this.manager.get(key); + } + }, { + key: "use", + value: function use(key) { + return this.manager.use(key); + } + /** + * Returns whether the object is `async` (`wait` promises are more than `0`). + * @member {Boolean} module:core.Component#isDeffered + */ + + }, { + key: "isDeffered", + get: function get() { + return this._wait.length > 0; + } + /** + * Returns the `ModuleManager` used for this component. + * @member {ModuleManager} module:core.Component#manager + * @throws {ManagerError} + */ + + }, { + key: "manager", + get: function get() { + if (this._manager) return this._manager; + throw new ManagerError('Component', "ModuleManager is not used in this component. 'manager' parameter should be set as 'true'", this); + }, + set: function set(manager) { + this._manager = manager; + } + /** + * Returns the `native` object used for this component. + * @member {Object} module:core.Component#native + */ + + }, { + key: "native", + get: function get() { + return this._native; + }, + set: function set(mesh) { + this._native = mesh; + this._native.component = this; + return this._native; + } + }]); + + inherits(Component, _ModuleSystem); + + return Component; + }(ModuleSystem); + + defineProperty$3(defineProperty$3(Component, "defaults", { + modules: null, + manager: true + }), "instructions", {}); + + // 26.1.6 Reflect.get(target, propertyKey [, receiver]) + + + + + + + + function get(target, propertyKey /* , receiver */) { + var receiver = arguments.length < 3 ? target : arguments[2]; + var desc, proto; + if (_anObject(target) === receiver) return target[propertyKey]; + if (desc = _objectGopd.f(target, propertyKey)) return _has(desc, 'value') + ? desc.value + : desc.get !== undefined + ? desc.get.call(receiver) + : undefined; + if (_isObject(proto = _objectGpo(target))) return get(proto, propertyKey, receiver); + } + + _export(_export.S, 'Reflect', { get: get }); + + var get$1 = _core.Reflect.get; + + var get$2 = get$1; + + function _superPropBase(object, property) { + while (!Object.prototype.hasOwnProperty.call(object, property)) { + object = getPrototypeOf$2(object); + if (object === null) break; + } + + return object; + } + + var superPropBase = _superPropBase; + + var get$3 = createCommonjsModule(function (module) { + function _get(target, property, receiver) { + if (typeof Reflect !== "undefined" && get$2) { + module.exports = _get = get$2; + } else { + module.exports = _get = function _get(target, property, receiver) { + var base = superPropBase(target, property); + if (!base) return; + + var desc = getOwnPropertyDescriptor$1(base, property); + + if (desc.get) { + return desc.get.call(receiver); + } + + return desc.value; + }; + } + + return _get(target, property, receiver || target); + } + + module.exports = _get; + }); + + function attributes() { + for (var _len = arguments.length, mappers = new Array(_len), _key = 0; _key < _len; _key++) { + mappers[_key] = arguments[_key]; + } + + return function (target) { + for (var i = 0; i < mappers.length; i++) { + var mapper = mappers[i]; + + for (var k = 0; k < mapper.map.length; k++) { + var attribute = mapper.map[k]; + Object.defineProperty(target.prototype, attribute, { + get: mapper.getter(attribute), + set: mapper.setter(attribute), + configurable: mapper.configurable, + enumerable: mapper.enumerable + }); + } + } + }; + } + function copy() { + for (var _len2 = arguments.length, map = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + map[_key2] = arguments[_key2]; + } + + return { + map: map, + getter: function getter(name) { + return function () { + return this.native[name]; + }; + }, + setter: function setter(name) { + return function (value) { + this.native[name].copy(value); + }; + }, + configurable: true, + enumerable: true + }; + } + function mirror() { + for (var _len3 = arguments.length, map = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + map[_key3] = arguments[_key3]; + } + + return { + map: map, + getter: function getter(name) { + return function () { + return this.native[name]; + }; + }, + setter: function setter(name) { + return function (value) { + this.native[name] = value; + }; + }, + configurable: true, + enumerable: true + }; + } + + var _dec, _class; + var + /** + * @class MeshComponent + * @category core + * @param {Object} [params] - The parameters object. + * @param {Object} [instructions] - The instructions object. + * @extends module:core.Component + * @memberof module:core + */ + MeshComponent = (_dec = attributes(copy('position', 'rotation', 'quaternion', 'scale'), mirror('material', 'geometry')), _dec(_class = + /*#__PURE__*/ + function (_Component) { + createClass(MeshComponent, null, [{ + key: "custom", + + /** + * Default values for parameters + * @member {Object} module:core.MeshComponent#defaults + * @static + * @default + * { + * build: true, + * geometry: {}, + * material: false, + * + * shadow: { + * cast: true, + * receive: true + * }, + * + * position: {x: 0, y: 0, z: 0}, + * rotation: {x: 0, y: 0, z: 0}, + * scale: {x: 1, y: 1, z: 1} + * } + */ + + /** + * Static instructions + * @member {Object} module:core.MeshComponent#instructions + * @static + * @default + * { + * position: ['x', 'y', 'z'], + * rotation: ['x', 'y', 'z'], + * scale: ['x', 'y', 'z'] + * } + */ + // CUSTOM GEOMETRY HANDLING + value: function custom(geom) { + var constructor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Mesh; + return ( + /*#__PURE__*/ + function (_MeshComponent) { + function _class2() { + classCallCheck(this, _class2); + + return possibleConstructorReturn(this, getPrototypeOf$2(_class2).apply(this, arguments)); + } + + createClass(_class2, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: geom, + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new constructor(geometry, material) + }).mesh; + } + }]); + + inherits(_class2, _MeshComponent); + + return _class2; + }(MeshComponent) + ); + } + }, { + key: "create", + value: function create(geom, params, constructor) { + return new (MeshComponent.custom(geom, constructor))(params); + } + }, { + key: "from", + value: function from(mesh) { + var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + params.build = false; + var component = new MeshComponent(params); + component.native = mesh; + component.wrap(); + return component; + } + }]); + + function MeshComponent(params) { + var _this; + + var defaults = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : MeshComponent.defaults; + var instructions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : MeshComponent.instructions; + + classCallCheck(this, MeshComponent); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(MeshComponent).call(this, params, defaults, instructions)); + + if (_this.params.build) { + var build = _this.build(_this.params); + + if (!build) { + throw new CompositionError$1('MeshComponent', '.build() method should return a THREE.Object3D or a Promise resolved with THREE.Object3D.', assertThisInitialized(assertThisInitialized(_this))); + } + + if (build instanceof Promise) { + _this.wait(build); + + _this.wait(new Promise(function (resolve) { + build.then(function (native) { + _this.native = native; + + _this.wrap().then(resolve); + }); + })); + } else { + _this.native = build; + + _this.wait(_this.wrap()); + } + } + + _this.applyCommand('postIntegrate'); + + return _this; + } // BUILDING & WRAPPING + + /** + * @method build + * @description Build livecycle should return a native object. + * @throws {CompositionError} + * @memberof module:core.MeshComponent + */ + + + createClass(MeshComponent, [{ + key: "build", + value: function build() { + throw new CompositionError$1('MeshComponent', 'Instance should have it\'s own .build().', this); + } + /** + * @method wrap + * @instance + * @description Wraps transforms (`position` & `rotation`) + * @return {Promise} Resolved when action is completed + * @memberof module:core.MeshComponent + */ + + }, { + key: "wrap", + value: function wrap() { + var _this2 = this; + + return new Promise(function (resolve) { + // TODO: Fix defer with physics + // this.defer(() => { + var _this2$params = _this2.params, + position = _this2$params.position, + rotation = _this2$params.rotation, + scale = _this2$params.scale, + shadow = _this2$params.shadow; + + _this2.position.set(position.x, position.y, position.z); + + _this2.rotation.set(rotation.x, rotation.y, rotation.z); + + _this2.scale.set(scale.x, scale.y, scale.z); + + _this2.native.castShadow = shadow.cast; + _this2.native.receiveShadow = shadow.receive; + + _this2.applyBridge({ + onWrap: 1 + }); + + resolve(_this2); // }); + }); + } // COPYING & CLONING + + /** + * @method copy + * @instance + * @description Copy source transforms & execute `Component.copy()` + * @return {this} MeshComponent + * @memberof module:core.MeshComponent + */ + + }, { + key: "copy", + value: function copy$$1(source) { + var _this3 = this; + + return get$3(getPrototypeOf$2(MeshComponent.prototype), "copy", this).call(this, source, function () { + _this3.position.copy(source.position); + + _this3.rotation.copy(source.rotation); + + _this3.quaternion.copy(source.quaternion); + }); + } + /** + * @method clone + * @instance + * @description Make a clone of this MeshComponent using `.copy()` + * @return {MeshComponent} clone of this object + * @memberof module:core.MeshComponent + */ + + }, { + key: "clone", + value: function clone(geometry, material) { + var dest = new this.constructor({ + build: false + }).copy(this); + if (geometry) dest.geometry = dest.geometry.clone(); + if (material) dest.material = dest.material.clone(); + return dest; + } + }]); + + inherits(MeshComponent, _Component); + + return MeshComponent; + }(Component)) || _class); + + defineProperty$3(defineProperty$3(MeshComponent, "defaults", objectSpread({}, Component.defaults, { + build: true, + geometry: {}, + material: false, + shadow: { + cast: true, + receive: true + }, + position: { + x: 0, + y: 0, + z: 0 + }, + rotation: { + x: 0, + y: 0, + z: 0 + }, + scale: { + x: 1, + y: 1, + z: 1 + } + })), "instructions", { + position: ['x', 'y', 'z'], + rotation: ['x', 'y', 'z'], + scale: ['x', 'y', 'z'] + }); + + var _dec$1, _class$1; + var + /** + * @class LightComponent + * @category core + * @param {Object} [params] - The parameters object. + * @param {Object} [instructions] - The instructions object. + * @extends module:core.Component + * @memberof module:core + */ + LightComponent = (_dec$1 = attributes(copy('position', 'rotation', 'quaternion', 'target')), _dec$1(_class$1 = + /*#__PURE__*/ + function (_Component) { + createClass(LightComponent, null, [{ + key: "from", + + /** + * Default values for parameters + * @member {Object} module:core.LightComponent#defaults + * @static + * @default + * { + * build: true, + * + * shadow: { + * cast: true, + * + * bias: 0, + * radius: 1, + * + * mapSize: { + * width: 1024, + * height: 1024 + * }, + * + * camera: { + * near: true, + * far: 400, + * fov: 90, + * + * top: 200, + * bottom: -200, + * left: -200, + * right: 200 + * } + * }, + * + * position: {x: 0, y: 0, z: 0}, + * rotation: {x: 0, y: 0, z: 0} + * } + */ + + /** + * Static instructions + * @member {Object} module:core.LightComponent#instructions + * @static + * @default + * { + * position: ['x', 'y', 'z'], + * rotation: ['x', 'y', 'z'] + * } + */ + value: function from(light) { + var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var wrapShadow = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + params.build = false; + var component = new LightComponent(params); + component.native = light; + component.wrap(); + if (wrapShadow) component.wrapShadow(); + return component; + } + }]); + + function LightComponent(params) { + var _this; + + var defaults = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : LightComponent.defaults; + var instructions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : LightComponent.instructions; + + classCallCheck(this, LightComponent); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(LightComponent).call(this, params, defaults, instructions)); + + if (_this.params.build) { + var build = _this.build(_this.params); + + if (!build) { + throw new CompositionError$1('LightComponent', '.build() method should return a THREE.Object3D or a Promise resolved with THREE.Object3D.', assertThisInitialized(assertThisInitialized(_this))); + } + + if (build instanceof Promise) { + build.then(function (native) { + _this.native = native; + }); + } else _this.native = build; + + _this.wait(_this.wrap()); + } + + _this.applyCommand('postIntegrate'); + + return _this; + } // BUILDING & WRAPPING + + /** + * @method build + * @instance + * @description Build livecycle should return a native object. + * @throws {CompositionError} + * @memberof module:core.LightComponent + */ + + + createClass(LightComponent, [{ + key: "build", + value: function build() { + throw new CompositionError$1('MeshComponent', 'Instance should have it\'s own .build().', this); + } + /** + * @method wrap + * @instance + * @description Wraps transforms (`position` & `rotation`) + * @return {Promise} Resolved when action is completed + * @memberof module:core.LightComponent + */ + + }, { + key: "wrap", + value: function wrap() { + var _this2 = this; + + return new Promise(function (resolve) { + _this2.defer(function () { + var _this2$params = _this2.params, + position = _this2$params.position, + rotation = _this2$params.rotation; + + _this2.position.set(position.x, position.y, position.z); + + _this2.rotation.set(rotation.x, rotation.y, rotation.z); + + _this2.applyBridge({ + onWrap: 1 + }); + + resolve(_this2); + }); + }); + } + /** + * @method wrapShadow + * @instance + * @description Wraps shadow properties + * @memberof module:core.LightComponent + */ + + }, { + key: "wrapShadow", + value: function wrapShadow() { + var native = this.native, + shadow = this.params.shadow; + native.castShadow = shadow.cast; + native.shadow.mapSize.width = shadow.mapSize.width; + native.shadow.mapSize.height = shadow.mapSize.height; + native.shadow.bias = shadow.bias; + native.shadow.radius = shadow.radius; + var shadowCamera = native.shadow.camera; + var camera = shadow.camera; + shadowCamera.near = camera.near; + shadowCamera.far = camera.far; + shadowCamera.fov = camera.fov; + shadowCamera.left = camera.left; + shadowCamera.right = camera.right; + shadowCamera.top = camera.top; + shadowCamera.bottom = camera.bottom; + } // COPYING & CLONING + + /** + * @method copy + * @instance + * @description Copy source transforms & execute `Component.copy()` + * @return {this} LightComponent + * @memberof module:core.LightComponent + */ + + }, { + key: "copy", + value: function copy$$1(source) { + var _this3 = this; + + return get$3(getPrototypeOf$2(LightComponent.prototype), "copy", this).call(this, source, function () { + if (_this3.target) _this3.target.copy(source.target()); + + _this3.position.copy(source.position); + + _this3.rotation.copy(source.rotation); + + _this3.quaternion.copy(source.quaternion); + }); + } + /** + * @method clone + * @instance + * @description Make a clone of this LightComponent using `.copy()` + * @return {LightComponent} clone of this object + * @memberof module:core.LightComponent + */ + + }, { + key: "clone", + value: function clone() { + return new this.constructor({ + build: false + }).copy(this); + } + }]); + + inherits(LightComponent, _Component); + + return LightComponent; + }(Component)) || _class$1); + + defineProperty$3(defineProperty$3(LightComponent, "defaults", objectSpread({}, Component.defaults, { + build: true, + shadow: { + cast: true, + bias: 0, + radius: 1, + mapSize: { + width: 1024, + height: 1024 + }, + camera: { + near: true, + far: 400, + fov: 90, + top: 200, + bottom: -200, + left: -200, + right: 200 + } + }, + position: { + x: 0, + y: 0, + z: 0 + }, + rotation: { + x: 0, + y: 0, + z: 0 + } + })), "instructions", { + position: ['x', 'y', 'z'], + rotation: ['x', 'y', 'z'] + }); + + var _dec$2, _class$2; + var + /** + * @class CameraComponent + * @category core + * @param {Object} [params] - The parameters object. + * @param {Object} [instructions] - The instructions object. + * @extends module:core.Component + * @memberof module:core + */ + CameraComponent = (_dec$2 = attributes(copy('position', 'rotation', 'quaternion', 'target')), _dec$2(_class$2 = + /*#__PURE__*/ + function (_Component) { + createClass(CameraComponent, null, [{ + key: "from", + + /** + * Default values for parameters + * @member {Object} module:core.CameraComponent#defaults + * @static + * @default + * { + * build: true, + * + * position: {x: 0, y: 0, z: 0}, + * rotation: {x: 0, y: 0, z: 0} + * } + */ + + /** + * Static instructions + * @member {Object} module:core.CameraComponent#instructions + * @static + * @default + * { + * position: ['x', 'y', 'z'], + * rotation: ['x', 'y', 'z'], + * scale: ['x', 'y', 'z'] + * } + */ + value: function from(camera) { + var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + params.build = false; + var component = new CameraComponent(params); + component.native = camera; + component.wrap(); + return component; + } + }]); + + function CameraComponent(params) { + var _this; + + var defaults = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : CameraComponent.defaults; + var instructions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : CameraComponent.instructions; + + classCallCheck(this, CameraComponent); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(CameraComponent).call(this, params, defaults, instructions)); + + if (_this.params.build) { + var build = _this.build(_this.params); + + if (!build) { + throw new CompositionError$1('CameraComponent', '.build() method should return a THREE.Object3D or a Promise resolved with THREE.Object3D.', assertThisInitialized(assertThisInitialized(_this))); + } + + if (build instanceof Promise) { + build.then(function (native) { + _this.native = native; + }); + } else _this.native = build; + + _this.wait(_this.wrap()); + } + + _this.applyCommand('postIntegrate'); + + return _this; + } // BUILDING & WRAPPING + + /** + * @method build + * @instance + * @description Build livecycle should return a native object. + * @throws {CompositionError} + * @memberof module:core.CameraComponent + */ + + + createClass(CameraComponent, [{ + key: "build", + value: function build() { + throw new CompositionError$1('CameraComponent', 'Instance should have it\'s own .build().', this); + } + /** + * @method wrap + * @instance + * @description Wraps transforms (`position` & `rotation`) + * @return {Promise} Resolved when action is completed + * @memberof module:core.CameraComponent + */ + + }, { + key: "wrap", + value: function wrap() { + var _this2 = this; + + return new Promise(function (resolve) { + _this2.defer(function () { + _this2.position.set(_this2.params.position.x, _this2.params.position.y, _this2.params.position.z); + + _this2.rotation.set(_this2.params.rotation.x, _this2.params.rotation.y, _this2.params.rotation.z); + + _this2.applyBridge({ + onWrap: 1 + }); + + resolve(_this2); + }); + }); + } + /** + * @method copy + * @instance + * @description Copy source transforms & execute `Component.copy()` + * @return {this} CameraComponent + * @memberof module:core.CameraComponent + */ + + }, { + key: "copy", + value: function copy$$1(source) { + var _this3 = this; + + return get$3(getPrototypeOf$2(CameraComponent.prototype), "copy", this).call(this, source, function () { + if (_this3.target) _this3.target.copy(source.target()); + + _this3.position.copy(source.position); + + _this3.rotation.copy(source.rotation); + + _this3.quaternion.copy(source.quaternion); + }); + } + /** + * @method clone + * @instance + * @description Make a clone of this CameraComponent using `.copy()` + * @return {CameraComponent} clone of this object + * @memberof module:core.CameraComponent + */ + + }, { + key: "clone", + value: function clone() { + return new this.constructor({ + build: false + }).copy(this); + } + }]); + + inherits(CameraComponent, _Component); + + return CameraComponent; + }(Component)) || _class$2); + + defineProperty$3(defineProperty$3(CameraComponent, "defaults", objectSpread({}, Component.defaults, { + build: true, + position: { + x: 0, + y: 0, + z: 0 + }, + rotation: { + x: 0, + y: 0, + z: 0 + } + })), "instructions", { + position: ['x', 'y', 'z'], + rotation: ['x', 'y', 'z'], + scale: ['x', 'y', 'z'] + }); + + const version = "2.2.0-beta.2"; + + var system = { + window: typeof window === 'undefined' ? global : window + }; + + /** + * @class App + * @category core + * @description This component is used to prepare a world scene, setup physics, camera, renderer and all other things that you usually do before making meshes. + * @param {Array} [modules=[]] - Array of Modules + * @extends ModuleSystem + * @memberof module:core + */ + + var App = + /*#__PURE__*/ + function (_ModuleSystem) { + /** + * @description Defines whether the scene should render or not + * @member {Boolean} module:core.App#enabled + * @public + */ + + /** + * Loops in this app + * @description Array of loops that are executed by this app. + * @member {Array} module:core.App#loops + * @public + */ + function App() { + var _this; + + var modules = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + + classCallCheck(this, App); + + console.log("WHS.App ".concat(version)); + _this = possibleConstructorReturn(this, getPrototypeOf$2(App).call(this)); + + defineProperty$3(defineProperty$3(assertThisInitialized(assertThisInitialized(_this)), "enabled", true), "loops", []); + + _this.manager = new ModuleManager(assertThisInitialized(assertThisInitialized(_this))); + _this.modules = modules; + + _this.integrateModules(); + + return _this; + } // CONTROLS & UPDATING + + /** + * @method start + * @description Start rendering loop and physics simulation (if you use version with physics). + * @memberof module:core.App + */ + + + createClass(App, [{ + key: "start", + value: function start() { + var _this2 = this; + + var requestAnimFrame = function () { + return system.window.requestAnimationFrame || system.window.webkitRequestAnimationFrame || system.window.mozRequestAnimationFrame || function (callback) { + system.window.setTimeout(callback, 1000 / 60); + }; + }(); + + var process = function process() { + _this2.request = requestAnimFrame(function () { + return process(); + }); + if (!_this2.enabled) return; + + for (var i = 0, ll = _this2.loops.length; i < ll; i++) { + var e = _this2.loops[i]; + if (e.enabled) e.execute(e.clock); + } + }; + + this.enabled = true; + if (!this.request) process(); + } + /** + * @method stop + * @description Stops rendering loops + * @memberof module:core.App + */ + + }, { + key: "stop", + value: function stop() { + this.enabled = false; + } + /** + * @method addLoop + * @description Adds loop to this app. + * @param {Object} loop - the loop to add + * @return {Promise} Promise that is resolved when promises completed. + * @memberof module:core.App + * @example Adding a loop to an app + * const loop = new Loop(() => { + * // ... + * }); + * + * const app = new App(); + * + * app.addLoop(loop); + * loop.start(); + */ + + }, { + key: "addLoop", + value: function addLoop(loop) { + var _this3 = this; + + return new Promise(function (resolve) { + _this3.loops.push(loop); + + resolve(loop); + }); + } + /** + * @method removeLoop + * @description Removes loop from this app. + * @param {Object} loop - the loop to remove + * @return {Promise} Promise that is resolved when promises completed. + * @memberof module:core.App + */ + + }, { + key: "removeLoop", + value: function removeLoop(loop) { + var _this4 = this; + + return new Promise(function (resolve) { + var index = _this4.loops.indexOf(loop); + + if (index !== -1) _this4.loops.splice(index, 1); + resolve(loop); + }); + } + }, { + key: "get", + value: function get(key) { + return this.manager.get(key); + } + }, { + key: "use", + value: function use(key) { + return this.manager.use(key); + } + }]); + + inherits(App, _ModuleSystem); + + return App; + }(ModuleSystem); + + /** + * @class Loop + * @category core + * @param {Function} func function to execute on each animation frame + * @param {Boolean} [useClock=true] passes a Clock to the function when called, if true + * @memberof module:core + */ + + var Loop = + /*#__PURE__*/ + function () { + function Loop(func) { + var useClock = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + + classCallCheck(this, Loop); + + this.func = func; + this.clock = useClock ? new Clock() : null; + this.enabled = false; + } // CONTROLS + + /** + * @method start + * @instance + * @description Starts this loop, clock if it has one. Won't do anything if loop enabled already. + * @param {Component} [world] app to add this loop to, if provided. + * @memberof module:core.Loop + */ + + + createClass(Loop, [{ + key: "start", + value: function start(world) { + if (this.enabled) return; + if (world) world.addLoop(this); + if (this.clock) this.clock.start(); + this.enabled = true; + } + /** + * @method stop + * @instance + * @description Stops this loop and its clock if it has one, won't do anything if this loop is not enabled) + * @param {Component} [world] app to remove this loop from, if provided. + * @memberof module:core.Loop + */ + + }, { + key: "stop", + value: function stop(world) { + if (!this.enabled) return; + if (this.clock) this.clock.stop(); + this.enabled = false; + if (world) world.removeLoop(this); + } // EXECUTION + + /** + * @method execute + * @instance + * @description Executes the function of this loop + * @memberof module:core.Loop + * @returns {*} whatever the function of this loop returns + */ + + }, { + key: "execute", + value: function execute() { + return this.func(this.clock); + } + }]); + + return Loop; + }(); + + /** @module core */ + + /** + * @class AmbientLight + * @category components/lights + * @description AmbientLight is a simple class, it extends Light and inherits all its methods. + * AmbientLight creates basic light around all scene, so it doesn't need properties like pos or target. + * It supports only color and intensity as parameters, which defines the color of the surrounded light and intensity of light. + * @param {Object} [params={light: {color: 0xffffff, intensity: 1}}] - The params. + * @extends module:core.LightComponent + * @memberof module:components/lights + * @example Creating an AmbientLight + * new AmbientLight({ + * color: 0xffffff, + * intensity: 0.2 + * }).addTo(world); + */ + + var AmbientLight$1 = + /*#__PURE__*/ + function (_LightComponent) { + function AmbientLight$$1() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, AmbientLight$$1); + + return possibleConstructorReturn(this, getPrototypeOf$2(AmbientLight$$1).call(this, params, AmbientLight$$1.defaults)); + } + + createClass(AmbientLight$$1, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return this.applyBridge({ + light: new AmbientLight(params.color, params.intensity) + }).light; + } + }]); + + inherits(AmbientLight$$1, _LightComponent); + + return AmbientLight$$1; + }(LightComponent); + + defineProperty$3(AmbientLight$1, "defaults", objectSpread({}, LightComponent.defaults, { + color: 0xffffff, + intensity: 1 + })); + + /** + * @class DirectionalLight + * @category components/lights + * @description DirectinalLight creates a light that shines from a specific direction not from a specific position.

    + * This light will behave as though it is infinitely far away and the rays produced from it are all parallel.

    + * The best analogy would be a light source that acts like the sun: the sun is so far away that all sunlight hitting objects comes from the same angle.

    + * It has the same options as AmbientLight in light paramater, but it also supports pos and target paramaters. + * @param {Object} [params={light: {color: 0xffffff, intensity: 1}}] - The params. + * @extends module:core.LightComponent + * @memberof module:components/lights + * @example Creating a DirectionalLight to fall down from vec3(10, 20, 10) to vec3(0, 0, 0) + * new DirectionalLight({ + * color: 0xffffff, + * intensity: 0.2, + * + * position: [10, 20, 10] + * }).addTo(app); + */ + + var DirectionalLight$1 = + /*#__PURE__*/ + function (_LightComponent) { + function DirectionalLight$$1() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, DirectionalLight$$1); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(DirectionalLight$$1).call(this, params, DirectionalLight$$1.defaults)); + + _this.wrapShadow(); + + return _this; + } + + createClass(DirectionalLight$$1, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return this.applyBridge({ + light: new DirectionalLight(params.color, params.intensity) + }).light; + } + }]); + + inherits(DirectionalLight$$1, _LightComponent); + + return DirectionalLight$$1; + }(LightComponent); + + defineProperty$3(DirectionalLight$1, "defaults", objectSpread({}, LightComponent.defaults, { + color: 0xffffff, + intensity: 1 + })); + + /** + * @class HemisphereLight + * @category components/lights + * @description HemisphereLight is a light source positioned directly above the scene.
    + * It also doesn't need position and target properties. + * @classDesc + * + * @param {Object} [params={light: {skyColor: 0xffffff, groundColor: 0xffffff, intensity: 1}}] - The params. + * @extends module:core.LightComponent + * @memberof module:components/lights + * @example Creating a HemisphereLight + * new HemisphereLight({ + * skyColor: 0xff0000, + * groundColor: 0x0000ff, + * intensity: 0.2 + * }).addTo(app); + */ + + var HemisphereLight$1 = + /*#__PURE__*/ + function (_LightComponent) { + function HemisphereLight$$1() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, HemisphereLight$$1); + + return possibleConstructorReturn(this, getPrototypeOf$2(HemisphereLight$$1).call(this, params, HemisphereLight$$1.defaults)); + } + + createClass(HemisphereLight$$1, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return this.applyBridge({ + light: new HemisphereLight(params.skyColor, params.groundColor, params.intensity) + }).light; + } + }]); + + inherits(HemisphereLight$$1, _LightComponent); + + return HemisphereLight$$1; + }(LightComponent); + + defineProperty$3(HemisphereLight$1, "defaults", objectSpread({}, LightComponent.defaults, { + skyColor: 0xffffff, + groundColor: 0xffffff, + intensity: 1 + })); + + /** + * @class PointLight + * @category components/lights + * @description PointLight creates a light at a specific position in the scene. The light shines in all directions (roughly similar to a light bulb.)

    + * It has the same options as AmbientLight in light paramater, but it also supports position, distance and decay.
    + * @param {Object} [params={light: {color: 0xffffff, intensity: 1, distance: 100, decay: 1}}] - The params. + * @extends LightComponent + * @memberof module:components/lights + * @example Creating a PointLight + * new PointLight( { + * color: 0xff0000, + * intensity: 2, + * distance: 300 + * + * position: [10, 20, 10] + * }).addTo(app); + */ + + var PointLight$1 = + /*#__PURE__*/ + function (_LightComponent) { + function PointLight$$1() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, PointLight$$1); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(PointLight$$1).call(this, params, PointLight$$1.defaults)); + + _this.wrapShadow(); + + return _this; + } + + createClass(PointLight$$1, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return this.applyBridge({ + light: new PointLight(params.color, params.intensity, params.distance, params.decay) + }).light; + } + }]); + + inherits(PointLight$$1, _LightComponent); + + return PointLight$$1; + }(LightComponent); + + defineProperty$3(PointLight$1, "defaults", objectSpread({}, LightComponent.defaults, { + color: 0xffffff, + intensity: 1, + distance: 100, + decay: 1 + })); + + /** + * @class SpotLight + * @category components/lights + * @description SpotLight creates spot light that can cast shadow in one direction.

    + * It has the same parameters as AmbientLight in light, but it also supports pos and target.

    + * SpotLight affects meshes with lambert and phong material. + * @classDesc + * + * @param {Object} [params={light: {color: 0xffffff, intensity: 1, distance: 100, angle: Math.PI / 3, exponent: 0, decay: 1}}] - The params. + * @extends module:core.LightComponent + * @memberof module:components/lights + * @example Creating a SpotLight that falls down from vec3(10, 20, 10) to vec3(0, 0, 0) + * new SpotLight({ + * color: 0x00ff00, + * intensity: 3, + * distance: 1000 + * + * position: [10, 20, 10] + * }).addTo(app); + */ + + var SpotLight$1 = + /*#__PURE__*/ + function (_LightComponent) { + function SpotLight$$1() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, SpotLight$$1); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(SpotLight$$1).call(this, params, SpotLight$$1.defaults)); + + _this.wrapShadow(); + + return _this; + } + + createClass(SpotLight$$1, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return this.applyBridge({ + light: new SpotLight(params.color, params.intensity, params.distance, params.angle, params.exponent, params.decay) + }).light; + } + }]); + + inherits(SpotLight$$1, _LightComponent); + + return SpotLight$$1; + }(LightComponent); + + defineProperty$3(SpotLight$1, "defaults", objectSpread({}, LightComponent.defaults, { + color: 0xffffff, + intensity: 1, + distance: 100, + angle: Math.PI / 3, + exponent: 0, + decay: 1 + })); + + var AreaLight = + /*#__PURE__*/ + function (_LightComponent) { + function AreaLight() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, AreaLight); + + return possibleConstructorReturn(this, getPrototypeOf$2(AreaLight).call(this, params, AreaLight.defaults)); + } + + createClass(AreaLight, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return this.applyBridge({ + light: new RectAreaLight(params.color, params.intensity, params.width, params.height) + }).light; + } + }]); + + inherits(AreaLight, _LightComponent); + + return AreaLight; + }(LightComponent); + + defineProperty$3(AreaLight, "defaults", objectSpread({}, LightComponent.defaults, { + color: 0xffffff, + intensity: 1, + width: 10, + height: 10 + })); + + /** @module components/lights */ + + /** + * @class CubeCamera + * @category components/cameras + * @description Creates 6 cameras that render to a WebGLRenderTargetCube + * @param {Object} [params] - The parameters object. + * @memberof module:components/cameras + * @extends module:core.CameraComponent + * @example Creates a CubeCamera and set it as app's camera + * const camera = new CubeCamera({ + * camera: { + * cubeResolution: 256 + * }, + * + * position: { + * x: 0, + * y: 100, + * z: 0 + * } + * }); + * + * app.camera = camera; + */ + + var CubeCamera$1 = + /*#__PURE__*/ + function (_CameraComponent) { + /** + * Default values for parameters + * @member {Object} module:components/cameras.CubeCamera#defaults + * @static + * @default
    +	   * {
    +	   *   camera: {
    +	   *     near: 1,
    +	   *     far: 1000,
    +	   *     cubeResolution: 128
    +	   *   }
    +	   * }
    + */ + function CubeCamera$$1() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, CubeCamera$$1); + + return possibleConstructorReturn(this, getPrototypeOf$2(CubeCamera$$1).call(this, params, CubeCamera$$1.defaults)); + } + + createClass(CubeCamera$$1, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return this.applyBridge({ + camera: new CubeCamera(params.near, params.far, params.cubeResolution) + }).camera; + } + }]); + + inherits(CubeCamera$$1, _CameraComponent); + + return CubeCamera$$1; + }(CameraComponent); + + defineProperty$3(CubeCamera$1, "defaults", objectSpread({}, CameraComponent.defaults, { + near: 1, + far: 1000, + cubeResolution: 128 + })); + + /** + * @class OrthographicCamera + * @category components/cameras + * @description Camera with orthographic projection. + * @param {Object} [params] - The parameters object. + * @memberof module:components/cameras + * @extends module:core.CameraComponent + * @example Create an OrthographicCamera and set it as app's camera + * const camera = new OrthographicCamera({ + * camera: { + * far: 10000 + * }, + * + * position: { + * y: 50 + * } + * }); + * + * app.camera = camera; + */ + + var OrthographicCamera$1 = + /*#__PURE__*/ + function (_CameraComponent) { + /** + * Default values for parameters + * @member {Object} module:components/cameras.OrthographicCamera#defaults + * @static + * @default
    +	   * {
    +	   *   near: 1,
    +	   *   far: 1000,
    +	   *   left: system.window.innerWidth / -2,
    +	   *   right: system.window.innerWidth / 2,
    +	   *   top: system.window.innerHeight / 2,
    +	   *   bottom: system.window.innerHeight / -2
    +	   * }
    + */ + function OrthographicCamera$$1() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, OrthographicCamera$$1); + + return possibleConstructorReturn(this, getPrototypeOf$2(OrthographicCamera$$1).call(this, params, OrthographicCamera$$1.defaults)); + } + + createClass(OrthographicCamera$$1, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return this.applyBridge({ + camera: new OrthographicCamera(params.left, params.right, params.top, params.bottom, params.near, params.far) + }).camera; + } + }]); + + inherits(OrthographicCamera$$1, _CameraComponent); + + return OrthographicCamera$$1; + }(CameraComponent); + + defineProperty$3(OrthographicCamera$1, "defaults", objectSpread({}, CameraComponent.defaults, { + near: 1, + far: 1000, + left: system.window.innerWidth / -2, + right: system.window.innerWidth / 2, + top: system.window.innerHeight / 2, + bottom: system.window.innerHeight / -2 + })); + + /** + * @class PerspectiveCamera + * @description Camera with perspective projection. + * @category components/cameras + * @param {Object} [params] - The parameters object. + * @memberof module:components/cameras + * @extends module:core.CameraComponent + * @example Create an PerspectiveCamera and set it as app's camera + * const camera = new PerspectiveCamera({ + * fov: 75, + * aspect: window.innerWidth / window.innerHeight, + * + * position: { + * x: 0, + * y: 100, + * z: 0 + * } + * }); + * + * app.camera = camera; + */ + + var PerspectiveCamera$1 = + /*#__PURE__*/ + function (_CameraComponent) { + /** + * Default values for parameters + * @member {Object} module:components/cameras.PerspectiveCamera#defaults + * @static + * @default
    +	   * {
    +	   *   near: 1,
    +	   *   far: 1000,
    +	   *   fov: 75,
    +	   *   aspect: system.window.innerWidth / system.window.innerHeight
    +	   * }
    + */ + function PerspectiveCamera$$1() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, PerspectiveCamera$$1); + + return possibleConstructorReturn(this, getPrototypeOf$2(PerspectiveCamera$$1).call(this, params, PerspectiveCamera$$1.defaults)); + } + + createClass(PerspectiveCamera$$1, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return this.applyBridge({ + camera: new PerspectiveCamera(params.fov, params.aspect, params.near, params.far) + }).camera; + } + }]); + + inherits(PerspectiveCamera$$1, _CameraComponent); + + return PerspectiveCamera$$1; + }(CameraComponent); + + defineProperty$3(PerspectiveCamera$1, "defaults", objectSpread({}, CameraComponent.defaults, { + near: 1, + far: 1000, + fov: 75, + aspect: system.window.innerWidth / system.window.innerHeight + })); + + /** @module components/cameras */ + + /** + * @class Box + * @category components/meshes + * @description As told on Component definition, while you can pass any of the inherited params for this component construction, you will need to + * pass specific parameters to build this mesh as a geometry object. + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Box, and adding to app + * new Box({ + * geometry: { + * width: 2, + * height: 2, + * depth: 2 + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * position: [50, 60, 70] + * }).addTo(app); + */ + + var Box = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Box#defaults + * @static + * @default
    +	   * {
    +	   *   geometry: {
    +	   *     width: 1,
    +	   *     height: 1,
    +	   *     depth: 1,
    +	   *     widthSegments: 1,
    +	   *     heightSegments: 1,
    +	   *     depthSegments: 1
    +	   *   }
    +	   * }
    + */ + + /** + * Instructions + * @member {Object} module:components/meshes.Box#instructions + * @static + * @default geometry: ['width', 'height', 'depth', 'widthSegments', 'heightSegments', 'depthSegements'] + */ + function Box() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Box); + + return possibleConstructorReturn(this, getPrototypeOf$2(Box).call(this, params, Box.defaults, Box.instructions)); + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Box + */ + + + createClass(Box, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var geometry = new (params.buffer ? BoxBufferGeometry : BoxGeometry)(params.geometry.width, params.geometry.height, params.geometry.depth, params.geometry.widthSegments, params.geometry.heightSegments, params.geometry.depthSegments); + return geometry; + } + }]); + + inherits(Box, _MeshComponent); + + return Box; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Box, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + width: 1, + height: 1, + depth: 1, + widthSegments: 1, + heightSegments: 1, + depthSegments: 1 + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['width', 'height', 'depth', 'widthSegments', 'heightSegments', 'depthSegements'] + })); + + /** + * @class Circle + * @category components/meshes + * @description As told on Component definition, while you can pass any of the inherited params for this component construction, you will need to + * pass specific parameters to build this mesh as a geometry object. + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Circle, and adding to app + * new Circle({ + * geometry: { + * radius: 4, + * segments: 16 + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * position: [50, 60, 70] + * }).addTo(app); + */ + + var Circle = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Circle#defaults + * @static + * @default
    +	   * {
    +	   *   geometry: {
    +	   *     radius: 50,
    +	   *     segments: 8,
    +	   *     thetaStart: 0,
    +	   *     thetaLength: Math.PI * 2
    +	   *   }
    +	   * }
    + */ + + /** + * Instructions + * @member {Object} module:components/meshes.Circle#instructions + * @static + * @default geometry: ['radius', 'segments', 'thetaStart', 'thetaLength'] + */ + function Circle() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Circle); + + return possibleConstructorReturn(this, getPrototypeOf$2(Circle).call(this, params, Circle.defaults, Circle.instructions)); + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Circle + */ + + + createClass(Circle, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var geometry = new (params.buffer ? CircleBufferGeometry : CircleGeometry)(params.geometry.radius, params.geometry.segments, params.geometry.thetaStart, params.geometry.thetaLength); + return geometry; + } + }]); + + inherits(Circle, _MeshComponent); + + return Circle; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Circle, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + radius: 50, + segments: 8, + thetaStart: 0, + thetaLength: Math.PI * 2 + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['radius', 'segments', 'thetaStart', 'thetaLength'] + })); + + /** + * @class Cone + * @category components/meshes + * @description A cylinder is one of the most basic curvilinear geometric shapes, the surface formed by the points at a fixed distance from a given straight line, the axis of the cylinder.

    + * The solid enclosed by this surface and by two planes perpendicular to the axis is also called a cylinder.
    + * The surface area and the volume of a cylinder have been known since deep antiquity. + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Cone, and adding to app + * new Cone({ + * geometry: { + * radiusTop: 2, + * radiusBottom: 4, + * height: 5 + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * pos: [0, 100, 0] + * }).addTo(app); + */ + + var Cone = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Cone#defaults + * @static + * @default
    +	   * {
    +	   *   geometry: {
    +	   *     radius: 20,
    +	   *     height: 100,
    +	   *     radiusSegments: 32,
    +	   *     heightSegments: 1,
    +	   *     openEnded: false,
    +	   *     thetaStart: 0,
    +	   *     thetaLength: Math.PI * 2
    +	   *   }
    +	   * }
    + */ + + /** + * Instructions + * @member {Object} module:components/meshes.Cone#instructions + * @static + * @default
    +	   * geometry: [
    +	   *   'radius',
    +	   *   'height',
    +	   *   'radiusSegments',
    +	   *   'heightSegments',
    +	   *   'openEnded',
    +	   *   'thetaStart',
    +	   *   'thetaLength'
    +	   * ]
    +	   * 
    + */ + function Cone() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Cone); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Cone).call(this, params, Cone.defaults, Cone.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Cone.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Cone + */ + + + createClass(Cone, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var geometry = new (params.buffer ? ConeBufferGeometry : ConeGeometry)(params.geometry.radius, params.geometry.height, params.geometry.radiusSegments, params.geometry.heightSegments, params.geometry.openEnded, params.geometry.thetaStart, params.geometry.thetaLength); + return geometry; + } + }]); + + inherits(Cone, _MeshComponent); + + return Cone; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Cone, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + radius: 20, + height: 100, + radiusSegments: 32, + heightSegments: 1, + openEnded: false, + thetaStart: 0, + thetaLength: Math.PI * 2 + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['radius', 'height', 'radiusSegments', 'heightSegments', 'openEnded', 'thetaStart', 'thetaLength'] + })); + + /** + * @class Cylinder + * @category components/meshes + * @description A cylinder is one of the most basic curvilinear geometric shapes, the surface formed by the points at a fixed distance from a given straight line, the axis of the cylinder.

    + * The solid enclosed by this surface and by two planes perpendicular to the axis is also called a cylinder.
    + * The surface area and the volume of a cylinder have been known since deep antiquity. + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Cylinder, and adding to app + * new Cylinder({ + * geometry: { + * radiusTop: 2, + * radiusBottom: 4, + * height: 5 + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * pos: [0, 100, 0] + * }).addTo(app); + */ + + var Cylinder = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Cylinder#defaults + * @static + * @default
    +	   * {
    +	   *   geometry: {
    +	   *     radiusTop: 20,
    +	   *     radiusBottom: 20,
    +	   *     height: 100,
    +	   *     radiusSegments: 32,
    +	   *     heightSegments: 1,
    +	   *     openEnded: false,
    +	   *     thetaStart: 0,
    +	   *     thetaLength: Math.PI * 2
    +	   *   }
    +	   * }
    + */ + + /** + * Instructions + * @member {Object} module:components/meshes.Cylinder#instructions + * @static + * @default
    +	   * geometry: [
    +	   *   'radiusTop',
    +	   *   'radiusBottom',
    +	   *   'height',
    +	   *   'radiusSegments',
    +	   *   'heightSegments',
    +	   *   'openEnded',
    +	   *   'thetaStart',
    +	   *   'thetaLength'
    +	   * ]
    +	   * 
    + */ + function Cylinder() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Cylinder); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Cylinder).call(this, params, Cylinder.defaults, Cylinder.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Cylinder.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Cylinder + */ + + + createClass(Cylinder, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var geometry = new (params.buffer ? CylinderBufferGeometry : CylinderGeometry)(params.geometry.radiusTop, params.geometry.radiusBottom, params.geometry.height, params.geometry.radiusSegments, params.geometry.heightSegments, params.geometry.openEnded, params.geometry.thetaStart, params.geometry.thetaLength); + return geometry; + } + }]); + + inherits(Cylinder, _MeshComponent); + + return Cylinder; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Cylinder, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + radiusTop: 0, + radiusBottom: 1, + height: 1, + radiusSegments: 32, + heightSegments: 1, + openEnded: false, + thetaStart: 0, + thetaLength: Math.PI * 2 + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['radiusTop', 'radiusBottom', 'height', 'radiusSegments', 'heightSegments', 'openEnded', 'thetaStart', 'thetaLength'] + })); + + /** + * @class Dodecahedron + * @category components/meshes + * @description In geometry, a dodecahedron is any polyhedron with twelve flat faces.

    + * The most familiar dodecahedron is the regular dodecahedron, which is a Platonic solid.
    + * There are also three regular star dodecahedra, which are constructed as stellations of the convex form.
    + * All of these have icosahedral symmetry, order 120. + * Dodecahedron creates Dodecahedron object by it's radius and detail. + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Dodecahedron, and adding to app + * new Dodecahedron({ + * geometry: { + * radius: 2 + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * position: { + * y: 10 + * } + * }).addTo(app); + */ + + var Dodecahedron = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Dodecahedron#defaults + * @static + * @default
    +	   * geometry: {
    +	   *   radius: 1,
    +	   *   detail: 0
    +	   * }
    +	   * 
    + */ + + /** + * Instructions + * @member {Object} module:components/meshes.Dodecahedron#instructions + * @static + * @default
    +	   * geometry: ['radius', 'detail']
    +	   * 
    + */ + function Dodecahedron() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Dodecahedron); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Dodecahedron).call(this, params, Dodecahedron.defaults, Dodecahedron.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Dodecahedron.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Dodecahedron + */ + + + createClass(Dodecahedron, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return new (params.buffer ? DodecahedronBufferGeometry : DodecahedronGeometry)(params.geometry.radius, params.geometry.detail); + } + }]); + + inherits(Dodecahedron, _MeshComponent); + + return Dodecahedron; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Dodecahedron, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + radius: 1, + detail: 0 + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['radius', 'detail'] + })); + + /** + * @class Extrude + * @category components/meshes + * @description Extrude geometry means that you can create a 3D mesh from any 2D shape using three.js geometry based on THREE.Vector2.
    + * Such implementation will help you to make volumed shapes that have their own depth and can be seen from all angels.

    + * You can also find some interesting examples made using three.js which is a core of whs.js, such as: + * - Webgl geometry extrude + * - Extrude shapes from geodata + * - Extrude splines + * + * Such examples can be easily implemented using whitestorm.js or it's plugins. Use `Extrude` class with THREE.Shape to get extrude effect of shape defined by 2D vectors. + * This class is similar to THREE.ExtrudeGeometry, + * but it also contains all properties, applied by `Shape`, such as material, mass and vectors like position (pos) and rotation (rot). + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a shape, then an Extrude from it + * const shape = new THREE.Shape([ + * new THREE.Vector2(-4,-4), + * new THREE.Vector2(-2,0), + * new THREE.Vector2(-4,4), + * new THREE.Vector2(0,2), + * new THREE.Vector2(4,4), + * new THREE.Vector2(2,0), + * new THREE.Vector2(4,-4), + * new THREE.Vector2(0,-2) + * ]); + * + * const extrude = new Extrude({ + * geometry: { + * shapes: shape, + * options: { + * bevelEnabled: false, + * bevelSize: 0, + * amount: 2 + * } + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * position: [0, 100, 0] + * }); + * + * extrude.addTo(app); + */ + + var Extrude = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Extrude#defaults + * @static + * @default
    +	   * {
    +	   *   geometry: {
    +	   *     shapes: [],
    +	   *     options: {}
    +	   *   }
    +	   * }
    +	   * 
    + */ + + /** + * Instructions + * @member {Object} module:components/meshes.Extrude#instructions + * @static + * @default
    +	   * {
    +	   *   geometry: ['shapes', 'options']
    +	   * }
    +	   * 
    + */ + function Extrude() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Extrude); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Extrude).call(this, params, Extrude.defaults, Extrude.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Extrude.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Extrude + */ + + + createClass(Extrude, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var geometry = new ExtrudeGeometry(params.geometry.shapes, params.geometry.options); + return params.buffer ? new BufferGeometry().fromGeometry(geometry) : geometry; + } + }]); + + inherits(Extrude, _MeshComponent); + + return Extrude; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Extrude, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + shapes: [], + options: {} + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['shapes', 'options'] + })); + + /** + * @class Icosahedron + * @category components/meshes + * @description In geometry, an icosahedron is a polyhedron with 20 faces.
    + * There are many kinds of icosahedra, with some being more symmetrical than others. The most well known is the Platonic, convex regular icosahedron.
    + * `Icosahedron` creates an Icosahedron object by its radius and detail. + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Icosahedron, and adding to app + * new Icosahedron({ + * geometry: { + * radius: 2, + * detail: 1 + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * position: [0, 100, 0] + * }).addTo(app); + */ + + var Icosahedron = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Icosahedron#defaults + * @static + * @default
    +	   * {
    +	   *   geometry: {
    +	   *     radius: 1,
    +	   *     detail: 0
    +	   *   }
    +	   * }
    + */ + + /** + * Instructions + * @member {Object} module:components/meshes.Icosahedron#instructions + * @static + * @default {geometry: ['radius', 'detail']} + */ + function Icosahedron() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Icosahedron); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Icosahedron).call(this, params, Icosahedron.defaults, Icosahedron.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Icosahedron.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Icosahedron + */ + + + createClass(Icosahedron, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return new (params.buffer ? IcosahedronBufferGeometry : IcosahedronGeometry)(params.geometry.radius, params.geometry.detail); + } + }]); + + inherits(Icosahedron, _MeshComponent); + + return Icosahedron; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Icosahedron, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + radius: 1, + detail: 0 + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['radius', 'detail'] + })); + + /** + * @class Lathe + * @category components/meshes + * @description A `LatheGeometry` allows you to create shapes from a smooth curve. + * This curve is defined by a number of points (also called knots) and is most often called a spline. This spline is rotated around a fixed point and results in vase- and bell-like shapes.

    + * In 3D computer graphics, a lathed object is a 3D model whose vertex geometry is produced by rotating the points of a spline or other point set around a fixed axis. + * The lathing may be partial; the amount of rotation is not necessarily a full 360 degrees. + * The point set providing the initial source data can be thought of as a cross section through the object along a plane containing its axis of radial symmetry.

    + * The following example shows a geometry which can be generated using `Lathe` class. + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Lath, and adding to app + * const points = []; + * + * for (let i = 0; i < 10; i++) { + * points.push( + * new THREE.Vector2( + * (Math.sin(i * 0.7) * 15 + 50) / 10, + * (i - 5) * 0.2 + * ) + * ); + * } + * + * const lathe = new Lathe({ + * geometry: { + * points: points + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * position: [0, 50, 10] + * }).addTo(app); + */ + + var Lathe = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Lathe#defaults + * @static + * @default
    +	   * {
    +	   *   geometry: {
    +	   *     points: []
    +	   *   }
    +	   * }
    +	   * 
    + */ + + /** + * Instructions + * @member {Object} module:components/meshes.Lathe#instructions + * @static + * @default
    {
    +	   *   geometry: ['points']
    +	   * }
    +	   * 
    + */ + function Lathe() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Lathe); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Lathe).call(this, params, Lathe.defaults, Lathe.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Lathe.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Lathe + */ + + + createClass(Lathe, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return new (params.buffer ? LatheBufferGeometry : LatheGeometry)(params.geometry.points); + } + }]); + + inherits(Lathe, _MeshComponent); + + return Lathe; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Lathe, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + points: [] + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['points'] + })); + + /** + * @class Line + * @category components/meshes + * @description Line component is generated from a curve/line and amount of vectors that should be used (points). + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Line, and adding to app + * new Line({ + * geometry: { + * curve: new THREE.LineCurve3(new THREE.Vector3(10, 10, 0), new THREE.Vector3(10, 30, 0)) + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }) + * }).addTo(app); + */ + + var Line$1 = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Line#defaults + * @static + * @default
    +	   * {
    +	   *   curve: new LineCurve3(new Vector3(0, 0, 0), new Vector3(10, 0, 0)),
    +	   *   points: 50
    +	   * }
    +	   * 
    + */ + + /** + * Instructions + * @member {Object} module:components/meshes.Line#instructions + * @static + * @default
    {
    +	   *   geometry: ['curve', 'points']
    +	   * }
    +	   * 
    + */ + function Line$$1(params) { + classCallCheck(this, Line$$1); + + return possibleConstructorReturn(this, getPrototypeOf$2(Line$$1).call(this, params, Line$$1.defaults, Line$$1.instructions)); + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Line + */ + + + createClass(Line$$1, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Line(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var geometry = params.buffer ? new BufferGeometry() : new Geometry(); + + if (params.buffer) { + var pp = params.curve.getPoints(params.points); + var verts = new Float32Array(pp.length * 3); + + for (var i = 0, max = pp.length; i < max; i++) { + var i3 = i * 3; + verts[i3] = pp[i].x; + verts[i3 + 1] = pp[i].y; + verts[i3 + 2] = pp[i].z; + } + + geometry.addAttribute('position', new BufferAttribute(verts, 3)); + } else geometry.vertices = params.curve.getPoints(params.points); + + return geometry; + } + }]); + + inherits(Line$$1, _MeshComponent); + + return Line$$1; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Line$1, "defaults", objectSpread({}, MeshComponent.defaults, { + curve: null, + points: 50 + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['curve', 'points'] + })); + + /** + * @class Importer + * @category components/meshes + * @description Importer is a loader for meshes and any other data to your scene + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Importer, and adding to app + * new Importer({ + * loader: new THREE.OBJLoader(), + * + * parser(geometry, material) { // data from loader + * return new THREE.Mesh(geometry, material); // should return your .native (mesh in this case) + * }, + * + * position: [0, 100, 0] + * }).addTo(app); + */ + + var Importer = + /*#__PURE__*/ + function (_MeshComponent) { + createClass(Importer, null, [{ + key: "filter", + + /** + * Default values for parameters + * @member {Object} module:components/meshes.Importer#defaults + * @static + * @default
    +	     * {
    +	     *   url: '',
    +	     *   loader: new JSONLoader(),
    +	     *
    +	     *   onLoad() {},
    +	     *   onProgress() {},
    +	     *   onError() {},
    +	     *
    +	     *   texturePath: null,
    +	     *   useCustomMaterial: false,
    +	     *
    +	     *   parser(geometry, materials) {
    +	     *     return new Mesh(geometry, materials);
    +	     *   }
    +	     * }
    + */ + + /** + * @method filter + * @description Default values for filter + * @static + * @param {THREE.Mesh} object Instance for iterating through it's children. + * @param {Function} filter Function with child as argument, should return a boolean whether include the child or not. + * @return {THREE.Mesh} object with children + * @memberof module:components/meshes.Importer + * @example Removing unnecessary lights from children + * new Importer({ + * loader: new THREE.OBJLoader(), + * + * parse(group) { // data from loader + * return Importer.filter(group, child => !child.isLight); // remove lights + * }, + * + * position: [0, 100, 0] + * }).addTo(app); + */ + value: function filter(object, _filter) { + var processFilter = function processFilter(object) { + object.children.forEach(function (el, index) { + if (el.children) processFilter(el); + if (!_filter(el)) object.children.splice(index, 1); + }); + return object; + }; + + return processFilter(object); + } + }]); + + function Importer() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Importer); + + return possibleConstructorReturn(this, getPrototypeOf$2(Importer).call(this, params, Importer.defaults, Importer.instructions, false)); + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Importer + */ + + + createClass(Importer, [{ + key: "build", + value: function build() { + var _this = this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return new Promise(function (resolve) { + if (params.texturePath) params.loader.setTexturePath(params.texturePath); + params.loader.load(params.url, function () { + for (var _len = arguments.length, data = new Array(_len), _key = 0; _key < _len; _key++) { + data[_key] = arguments[_key]; + } + + // geometry, materials + params.onLoad.apply(params, data); + var object = params.parser.apply(_this, data); + if (params.material) object.material = _this.applyBridge({ + material: params.material + }).material; + resolve(object); + }, params.onProgress, params.onError); + }); + } + }]); + + inherits(Importer, _MeshComponent); + + return Importer; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Importer, "defaults", objectSpread({}, MeshComponent.defaults, { + url: '', + loader: new JSONLoader(), + onLoad: function onLoad() {}, + onProgress: function onProgress() {}, + // TODO add onComplete? + onError: function onError() {}, + texturePath: null, + useCustomMaterial: false, + parser: function parser(geometry, material) { + var _this$applyBridge = this.applyBridge({ + geometry: geometry, + material: material + }), + geom = _this$applyBridge.geometry, + mat = _this$applyBridge.material; + + return this.applyBridge({ + mesh: geom.bones ? new SkinnedMesh(geom, mat) : new Mesh(geom, mat) + }).mesh; + } + })), "instructions", objectSpread({}, MeshComponent.instructions)); + + /** + * @class Octahedron + * @category components/meshes + * @description In geometry, an octahedron is a polyhedron with eight faces. + * A regular octahedron is a Platonic solid composed of eight equilateral triangles, four of which meet at each vertex. + *

    + * `Octahedron` creates an Octahedron object by its `radius` and `detail`. + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating an Octahedron, and adding to app + * new Octahedron({ + * geometry: { + * radius: 2, + * detail: 1 + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * position: [0, 100, 0] + * }).addTo(app); + */ + + var Octahedron = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Octahedron#defaults + * @static + * @default
    +	   * {
    +	   *   geometry: {
    +	   *     radius: 1,
    +	   *     detail: 0
    +	   *   }
    +	   * }
    +	   * 
    + */ + function Octahedron() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Octahedron); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Octahedron).call(this, params, Octahedron.defaults, Octahedron.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Octahedron.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Octahedron + */ + + + createClass(Octahedron, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return new (params.buffer ? OctahedronBufferGeometry : OctahedronGeometry)(params.geometry.radius, params.geometry.detail); + } + }]); + + inherits(Octahedron, _MeshComponent); + + return Octahedron; + }(MeshComponent); + + defineProperty$3(Octahedron, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + radius: 1, + detail: 0 + } + })); + + /** + * @class Parametric + * @category components/meshes + * @description `Parametric` generates a geometry representing a Parametric surface + *

    + * It is usually used to develop different kinds of highfields or visualize a math function. + *
    + * - Parametric surface + * - "Graphulus" + *

    + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Example creating an heightfield-like geometry. `u` and `v` are like `x` and `y` in shape, but their values are always from `0` to `1`. + * We use them in `THREE.Vector3` like `x` and `z` and `Math.random() * 5` for `y`. + * const createParametric = (u, v) => { + * return new THREE.Vector3(u * 30, Math.random() * 5, v * 30); + * } + * + * new Parametric({ + * geometry: { + * func: createParametric + * }, + * + * material: new THREE.MeshLambertMaterial({ + * color: 0xffffff, + * side: THREE.DoubleSide + * }), + * + * position: [0, 100, -100] + * }).addTo(app); + */ + + var Parametric = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Parametric#defaults + * @static + * @default
    +	   * {
    +	   *   geometry: {
    +	   *     func: (u, v) => new Vector3(u, v, 0),
    +	   *     slices: 10,
    +	   *     tacks: 10
    +	   *   }
    +	   * }
    +	   * 
    + */ + function Parametric() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Parametric); + + return possibleConstructorReturn(this, getPrototypeOf$2(Parametric).call(this, params, Parametric.defaults, Parametric.instructions)); + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Parametric + */ + + + createClass(Parametric, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return new (params.buffer ? ParametricBufferGeometry : ParametricGeometry)(params.geometry.func, params.geometry.slices, params.geometry.stacks); + } + }]); + + inherits(Parametric, _MeshComponent); + + return Parametric; + }(MeshComponent); + + defineProperty$3(Parametric, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + func: function func(u, v) { + return new Vector3(u, v, 0); + }, + slices: 10, + stacks: 10 + } + })); + + /** + * @class Plane + * @category components/meshes + * @description `Plane` is used for creating planes given some `width` and `height`. + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Plane, and adding to app + * new Plane({ + * geometry: { + * width: 20, + * height: 30 + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }) + * }).addTo(app); + */ + + var Plane$1 = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Plane#defaults + * @static + * @default
    +	   * {
    +	   *   geometry: {
    +	   *     width: 10,
    +	   *     height: 10,
    +	   *     wSegments: 1,
    +	   *     hSegments: 1
    +	   *   }
    +	   * }
    +	   * 
    + */ + + /** + * Instructions + * @member {Object} module:components/meshes.Plane#instructions + * @static + * @default
    +	   * {
    +	   *   geometry: ['width', 'height', 'wSegments', 'hSegments']
    +	   * }
    +	   * 
    + */ + function Plane$$1() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Plane$$1); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Plane$$1).call(this, params, Plane$$1.defaults, Plane$$1.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Plane$$1.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Plane + */ + + + createClass(Plane$$1, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var geometry = new (params.buffer ? PlaneBufferGeometry : PlaneGeometry)(params.geometry.width, params.geometry.height, params.geometry.wSegments, params.geometry.hSegments); + return geometry; + } + }]); + + inherits(Plane$$1, _MeshComponent); + + return Plane$$1; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Plane$1, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + width: 10, + height: 10, + wSegments: 1, + hSegments: 1 + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['width', 'height', 'wSegments', 'hSegments'] + })); + + var verticesOfCube = [-1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1, -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1], + indicesOfFaces = [2, 1, 0, 0, 3, 2, 0, 4, 7, 7, 3, 0, 0, 1, 5, 5, 4, 0, 1, 2, 6, 6, 5, 1, 2, 3, 7, 7, 6, 2, 4, 5, 6, 6, 7, 4]; + /** + * @class Polyhedron + * @category components/meshes + * @description In elementary geometry, a polyhedron is a solid in three dimensions with flat polygonal faces, straight edges and sharp corners or vertices. + *

    + * `Polyhedron` creates a Polyhedron by its `radius` and `detail`. + *

    + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating an Polyhedron, and adding to app + * new Polyhedron({ + * geometry: { + * radius: 2, + * detail: 1 + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * position: [0, 100, 0] + * }).addTo(app); + */ + + var Polyhedron = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Polyhedron#defaults + * @static + * @default
    +	   * {
    +	   *   geometry: {
    +	   *     verticesOfCube: [
    +	   *       -1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1,
    +	   *       -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1
    +	   *     ],
    +	   *
    +	   *     indicesOfFaces: [
    +	   *       2, 1, 0, 0, 3, 2,
    +	   *       0, 4, 7, 7, 3, 0,
    +	   *       0, 1, 5, 5, 4, 0,
    +	   *       1, 2, 6, 6, 5, 1,
    +	   *       2, 3, 7, 7, 6, 2,
    +	   *       4, 5, 6, 6, 7, 4
    +	   *     ],
    +	   *
    +	   *     radius: 6,
    +	   *     detail: 2
    +	   *   }
    +	   * }
    +	   * 
    + */ + + /** + * Instructions + * @member {Object} module:components/meshes.Polyhedron#instructions + * @static + * @default
    +	   * {
    +	   *   geometry: ['verticesOfCube', 'indicesOfFaces', 'radius', 'detail']
    +	   * }
    +	   * 
    + */ + function Polyhedron() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Polyhedron); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Polyhedron).call(this, params, Polyhedron.defaults, Polyhedron.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Polyhedron.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Polyhedron + */ + + + createClass(Polyhedron, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return new (params.buffer ? PolyhedronBufferGeometry : PolyhedronGeometry)(params.geometry.verticesOfCube, params.geometry.indicesOfFaces, params.geometry.radius, params.geometry.detail); + } + }]); + + inherits(Polyhedron, _MeshComponent); + + return Polyhedron; + }(MeshComponent); + + defineProperty$3(defineProperty$3(defineProperty$3(defineProperty$3(Polyhedron, "verticesOfCube", verticesOfCube), "indicesOfFaces", indicesOfFaces), "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + verticesOfCube: verticesOfCube, + indicesOfFaces: indicesOfFaces, + radius: 6, + detail: 2 + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['verticesOfCube', 'indicesOfFaces', 'radius', 'detail'] + })); + + /** + * @class Ring + * @category components/meshes + * @description Ring class creates a circle or just 2D Torus. Does not support physics. + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Ring, and adding to app + * new Ring({ + * geometry: { + * innerRadius: 5, + * outerRadius: 2 + * }, + * + * material: new THREE.MeshLambertMaterial({ + * color: 0xffffff, + * side THREE.DoubleSide + * }), + * + * position: [0, 8, 0], + * + * rotation: { + * x: Math.PI/4 + * } + * }).addTo(app); + */ + + var Ring = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Ring#defaults + * @static + * @default
    +	   * {
    +	   *   geometry: {
    +	   *     innerRadius: 0,
    +	   *     outerRadius: 50,
    +	   *     thetaSegments: 8,
    +	   *     phiSegments: 8,
    +	   *     thetaStart: 0,
    +	   *     thetaLength: Math.PI * 2
    +	   *   }
    +	   * }
    +	   * 
    + */ + + /** + * Instructions + * @member {Object} module:components/meshes.Ring#instructions + * @static + * @default
    +	   * {
    +	   *   geometry: [
    +	   *     'innerRadius',
    +	   *     'outerRadius',
    +	   *     'thetaSegments',
    +	   *     'phiSegments',
    +	   *     'thetaStart',
    +	   *     'thetaLength'
    +	   *   ]
    +	   * }
    +	   * 
    + */ + function Ring() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Ring); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Ring).call(this, params, Ring.defaults, Ring.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Ring.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Ring + */ + + + createClass(Ring, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return new (params.buffer ? RingBufferGeometry : RingGeometry)(params.geometry.innerRadius, params.geometry.outerRadius, params.geometry.thetaSegments, params.geometry.phiSegments, params.geometry.thetaStart, params.geometry.thetaLength); + } + }]); + + inherits(Ring, _MeshComponent); + + return Ring; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Ring, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + innerRadius: 0, + outerRadius: 50, + thetaSegments: 8, + phiSegments: 8, + thetaStart: 0, + thetaLength: Math.PI * 2 + } + })), "instructions", objectSpread({}, MeshComponent.defaults, { + geometry: ['innerRadius', 'outerRadius', 'thetaSegments', 'phiSegments', 'thetaStart', 'thetaLength'] + })); + + /** + * @class Shape + * @category components/meshes + * @description Shape is a universal class. It allows you to create different 2D shapes in 3D scene.
    + * Unfortunately, not all of them support physics, an alternative is to make a similar 3D object and scale its width down to near zero. + *

    + * `Shape` consists of shapes that are in its shapes parameter. + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a plane looking Shape from a THREE.Shape, and adding it to app + * const rectWidth = 10, + * rectLength = 5; + * + * const rectShape = new THREE.Shape(); + * rectShape.moveTo(0,0); + * rectShape.lineTo(0, rectWidth); + * rectShape.lineTo(rectLength, rectWidth); + * rectShape.lineTo(rectLength, 0); + * rectShape.lineTo(0, 0); + * + * const plane = new Shape({ + * geometry: { + * shape: rectShape + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }) + * }).addTo(app); + */ + + var Shape$1 = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Shape#defaults + * @static + * @default
    +	   * {
    +	   *   geometry: {
    +	   *     shapes: []
    +	   * }
    +	   * 
    + */ + + /** + * Instructions + * @member {Object} module:components/meshes.Shape#instructions + * @static + * @default
    +	   * {
    +	   *   geometry: ['shapes']
    +	   * }
    +	   * 
    + */ + function Shape$$1() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Shape$$1); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Shape$$1).call(this, params, Shape$$1.defaults, Shape$$1.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Shape$$1.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Shape + */ + + + createClass(Shape$$1, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return new (params.buffer ? ShapeBufferGeometry : ShapeGeometry)(params.geometry.shapes); + } + }]); + + inherits(Shape$$1, _MeshComponent); + + return Shape$$1; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Shape$1, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + shapes: [] + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['shapes'] + })); + + /** + * @class Sphere + * @category components/meshes + * @description Sphere class is used to create sphere objects by its radius property and other values that determines its detality. + *

    + * It is similar to THREE.SphereGeometry, but it also contains all `Shape` properties, such as material, mass and vectors like position (pos) and rotation (rot). + *

    + * Then it creates an `Three.js mesh` or a `Physijs mesh`, that is similar to `Three.js mesh`, but it also take into consideration collision calculations. + * This mesh is a combination of `Three.js geometry` and `Physijs material` (The same as in three.js, but with friction and restitution). + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Sphere, and adding it to app + * new Sphere({ + * geometry: { + * radius: 2 + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * position: { + * y: 100 + * } + * }).addTo(app); + */ + + var Sphere$1 = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Sphere#defaults + * @static + * @default
    +	   * {
    +	   *   geometry: {
    +	   *     radius: 1,
    +	   *     widthSegments: 8,
    +	   *     heightSegments: 6
    +	   * }
    +	   * 
    + */ + + /** + * Instructions + * @member {Object} module:components/meshes.Sphere#instructions + * @static + * @default
    +	   * {
    +	   *   geometry: ['radius', 'widthSegments', 'heightSegments']
    +	   * }
    +	   * 
    + */ + function Sphere$$1() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Sphere$$1); + + return possibleConstructorReturn(this, getPrototypeOf$2(Sphere$$1).call(this, params, Sphere$$1.defaults, Sphere$$1.instructions)); + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Sphere + */ + + + createClass(Sphere$$1, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var geometry = new (params.buffer ? SphereBufferGeometry : SphereGeometry)(params.geometry.radius, params.geometry.widthSegments, params.geometry.heightSegments); + return geometry; + } + }]); + + inherits(Sphere$$1, _MeshComponent); + + return Sphere$$1; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Sphere$1, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + radius: 1, + widthSegments: 8, + heightSegments: 6 + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['radius', 'widthSegments', 'heightSegments'] + })); + + /** + * @class Tetrahedron + * @category components/meshes + * @description In geometry, a tetrahedron is a polyhedron composed of four triangular faces, six straight edges, and four vertex corners. + * The tetrahedron is the simplest of all the ordinary convex polyhedra and the only one that has fewer than 5 faces. + *

    + * `Tetrahedron` creates a Tetrahedron object by its `radius` and `detail` + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Tetrahedron, and adding it to app + * new Tetrahedron({ + * geometry: { + * radius: 2, + * detail: 1 + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * position: { + * x: 0, + * y: 100, + * z: 0 + * } + * }).addTo(app); + */ + + var Tetrahedron = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Tetrahedron#defaults + * @static + * @default
    +	   * {
    +	   *   geometry: {
    +	   *     radius: 1,
    +	   *     detail: 0
    +	   * }
    +	   * 
    + */ + + /** + * Instructions + * @member {Object} module:components/meshes.Tetrahedron#instructions + * @static + * @default
    +	   * {
    +	   *   geometry: ['radius', 'detail']
    +	   * }
    +	   * 
    + */ + function Tetrahedron() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Tetrahedron); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Tetrahedron).call(this, params, Tetrahedron.defaults, Tetrahedron.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Tetrahedron.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Tetrahedron + */ + + + createClass(Tetrahedron, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return new (params.buffer ? TetrahedronBufferGeometry : TetrahedronGeometry)(params.geometry.radius, params.geometry.detail); + } + }]); + + inherits(Tetrahedron, _MeshComponent); + + return Tetrahedron; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Tetrahedron, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + radius: 1, + detail: 0 + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['radius', 'detail'] + })); + + /** + * @class Text + * @category components/meshes + * @description Text class is made for creating 3D text objects. + * @classDesc + * + *

    + * Physics text object can be convex or concave. By default it's convex but you can also switch to concave. + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Text, and adding it to app + * new Text({ + * text: 'Some text', + * parameters: { + * font: 'path/to/font.typeface.js', + * size: 20, + * height: 5, + * curveSegments: 6 + * } + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * position: { + * x: -40, + * y: 20, + * z: 0 + * } + * }).addTo(app); + */ + + var Text = + /*#__PURE__*/ + function (_MeshComponent) { + createClass(Text, null, [{ + key: "load", + + /** + * Default values for parameters + * @member {Object} module:components/meshes.Text#defaults + * @static + * @default
    +	     * {
    +	     *   text: 'Hello World!',
    +	     *   font: null,
    +	     *
    +	     *   geometry: {
    +	     *     size: 12,
    +	     *     height: 50,
    +	     *     curveSegments: 12,
    +	     *     font: new Font(),
    +	     *     bevelEnabled: false,
    +	     *     bevelThickness: 10,
    +	     *     bevelSize: 8
    +	     *   }
    +	     * }
    +	     * 
    + */ + + /** + * Default FontLoader + * @member {Object} module:components/meshes.Text#loader + * @static + * @default new FontLoader() + */ + + /** + * @method load + * @static + * @description load() preloads a Font object and returns a Promise with it. + * @param {String} path Path to the font + * @return {Promise} A promise resolved with a font + * @memberof module:components/meshes.Text + */ + value: function load(path) { + var loader = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Text.loader; + return new Promise(function (resolve) { + loader.load(path, resolve); + }); + } + }]); + + function Text() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Text); + + return possibleConstructorReturn(this, getPrototypeOf$2(Text).call(this, params, Text.defaults, Text.instructions)); + } + /** + * @method build + * @description Build is called as part of the lifecycle to create a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Text + */ + + + createClass(Text, [{ + key: "build", + value: function build() { + var _this = this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + var promise = new Promise(function (resolve) { + (params.font instanceof Promise ? params.font : Promise.resolve(params.font)).then(function (font) { + var _this$applyBridge = _this.applyBridge({ + geometry: new TextGeometry(params.text, Object.assign(params.geometry, { + font: font + })), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + resolve(_this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh); + }); + }); + + get$3(getPrototypeOf$2(Text.prototype), "wait", this).call(this, promise); + + return promise; + } + }]); + + inherits(Text, _MeshComponent); + + return Text; + }(MeshComponent); + + defineProperty$3(defineProperty$3(defineProperty$3(Text, "defaults", objectSpread({}, MeshComponent.defaults, { + text: 'Hello World!', + font: null, + geometry: { + size: 12, + height: 50, + curveSegments: 12, + font: new Font(), + bevelEnabled: false, + bevelThickness: 10, + bevelSize: 8 + } + })), "instructions", objectSpread({}, MeshComponent.instructions)), "loader", new FontLoader()); + + /** + * @class Torus + * @category components/meshes + * @description Torus class makes a torus figure. A donut is a torus. + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Torus, and adding it to app + * new Torus({ + * geometry: { + * radius: 5, + * tube: 2 + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * position: { + * y: 35 + * } + * }).addTo(app); + */ + + var Torus = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Torus#defaults + * @static + * @default
    +	   * {
    +	   *   geometry: {
    +	   *     radius: 100,
    +	   *     tube: 40,
    +	   *     radialSegments: 8,
    +	   *     tubularSegments: 6,
    +	   *     arc: Math.PI * 2
    +	   *   }
    +	   * }
    +	   * 
    + */ + + /** + * Instructions + * @member {Object} module:components/meshes.Torus#instructions + * @static + * @default
    +	   * {
    +	   *   geometry: [
    +	   *     'radius',
    +	   *     'tube',
    +	   *     'radialSegments',
    +	   *     'tubularSegments',
    +	   *     'arc'
    +	   *   ]
    +	   * }
    +	   * 
    + */ + function Torus() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Torus); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Torus).call(this, params, Torus.defaults, Torus.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Torus.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Torus + */ + + + createClass(Torus, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return new TorusGeometry(params.geometry.radius, params.geometry.tube, params.geometry.radialSegments, params.geometry.tubularSegments, params.geometry.arc); + } + }]); + + inherits(Torus, _MeshComponent); + + return Torus; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Torus, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + radius: 100, + tube: 40, + radialSegments: 8, + tubularSegments: 6, + arc: Math.PI * 2 + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['radius', 'tube', 'radialSegments', 'tubularSegments', 'arc'] + })); + + /** + * @class Torusknot + * @category components/meshes + * @description Torusknot class makes a torusknot figure. It's like a crooked donut, very crooked. + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Torusknot, and adding it to app + * new Torusknot({ + * geometry: { + * radius:5, + * tube: 2 + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * + * pos: { + * y: 100 + * } + * }).addTo(app); + */ + + var Torusknot = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Torusknot#defaults + * @static + * @default
    +	   * {
    +	   *   geometry: {
    +	   *     radius: 100,
    +	   *     tube: 40,
    +	   *     radialSegments: 64,
    +	   *     tubularSegments: 8,
    +	   *     p: 2,
    +	   *     q: 3
    +	   *   }
    +	   * }
    +	   * 
    + */ + + /** + * Instructions + * @member {Object} module:components/meshes.Torusknot#instructions + * @static + * @default
    +	   * {
    +	   *   geometry: [
    +	   *     'radius',
    +	   *     'tube',
    +	   *     'radialSegments',
    +	   *     'tubularSegments',
    +	   *     'p',
    +	   *     'q'
    +	   *   ]
    +	   * }
    +	   * 
    + */ + function Torusknot() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Torusknot); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Torusknot).call(this, params, Torusknot.defaults, Torusknot.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Torusknot.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Torusknot + */ + + + createClass(Torusknot, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var GConstruct = params.buffer ? TorusKnotBufferGeometry : TorusKnotGeometry; + return new GConstruct(params.geometry.radius, params.geometry.tube, params.geometry.radialSegments, params.geometry.tubularSegments, params.geometry.p, params.geometry.q); + } + }]); + + inherits(Torusknot, _MeshComponent); + + return Torusknot; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Torusknot, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + radius: 100, + tube: 40, + radialSegments: 64, + tubularSegments: 8, + p: 2, + q: 3 + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['radius', 'tube', 'radialSegments', 'tubularSegments', 'p', 'q'] + })); + + /** + * @class Tube + * @category components/meshes + * @description Tube class makes a tube that extrudes along a 3d curve. + * @classDesc + * + * @param {Object} [params] - The params. + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Creating a Tube from a three.js Curve, and adding it to app + * const CustomSinCurve = THREE.Curve.create( + * function (scale) { // custom curve constructor + * this.scale = (scale === undefined) ? 1 : scale; + * }, + * + * function (t) { // getPoint: t is between 0-1 + * const tx = t * 3 - 1.5, + * ty = Math.sin( 2 * Math.PI * t ), + * tz = 0; + * + * return new THREE.Vector3(tx, ty, tz).multiplyScalar(this.scale); + * } + * ); + * + * const path = new CustomSinCurve(10); + * + * new Tube({ + * geometry: { + * path: path + * }, + * + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }) + * }).addTo(app); + */ + + var Tube = + /*#__PURE__*/ + function (_MeshComponent) { + /** + * Default values for parameters + * @member {Object} module:components/meshes.Tube#defaults + * @static + * @default
    +	   * {
    +	   *   geometry: {
    +	   *     path: new THREE.LineCurve3(new Vector3(0, 0, 0), new Vector3(0, 0, 1)),
    +	   *     segments: 20,
    +	   *     radius: 2,
    +	   *     radiusSegments: 8,
    +	   *     closed: false
    +	   *   }
    +	   * }
    +	   * 
    + */ + + /** + * Instructions + * @member {Object} module:components/meshes.Tube#instructions + * @static + * @default
    +	   * {
    +	   *   geometry: [
    +	   *     'path',
    +	   *     'segments',
    +	   *     'radius',
    +	   *     'radiusSegments',
    +	   *     'closed'
    +	   *   ]
    +	   * }
    +	   * 
    + */ + function Tube() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, Tube); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Tube).call(this, params, Tube.defaults, Tube.instructions)); + + if (params.build) { + _this.build(params); + + get$3(getPrototypeOf$2(Tube.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this)); + } + + return _this; + } + /** + * @method build + * @description Build lifecycle creates a mesh using input params. + * @param {Object} params Component parameters. + * @return {THREE.Mesh} Built mesh + * @memberof module:components/meshes.Tube + */ + + + createClass(Tube, [{ + key: "build", + value: function build() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params; + + var _this$applyBridge = this.applyBridge({ + geometry: this.buildGeometry(params), + material: params.material + }), + geometry = _this$applyBridge.geometry, + material = _this$applyBridge.material; + + return this.applyBridge({ + mesh: new Mesh(geometry, material) + }).mesh; + } + }, { + key: "buildGeometry", + value: function buildGeometry() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var geometry = new (params.buffer ? TubeBufferGeometry : TubeGeometry)(params.geometry.path, params.geometry.segments, params.geometry.radius, params.geometry.radiusSegments, params.geometry.closed); + return geometry; + } + }]); + + inherits(Tube, _MeshComponent); + + return Tube; + }(MeshComponent); + + defineProperty$3(defineProperty$3(Tube, "defaults", objectSpread({}, MeshComponent.defaults, { + geometry: { + path: new LineCurve3(new Vector3(0, 0, 0), new Vector3(0, 0, 1)), + segments: 20, + radius: 2, + radiusSegments: 8, + closed: false + } + })), "instructions", objectSpread({}, MeshComponent.instructions, { + geometry: ['path', 'segments', 'radius', 'radiusSegments', 'closed'] + })); + + /** + * @class Group + * @category components/meshes + * @description Sometimes you need to make groups of objects (it's not conveniently to apply transforms to each object when can make just one to a group).
    + * In Three.js you make it using `THREE.Object3D` and it's children.

    + * In whs.js we have `Group` + * @extends module:core.MeshComponent + * @memberof module:components/meshes + * @example Approach 2 - Adding objects to an empty group + * const sphere = new Sphere(); + * const box = new Box(); + * const group = new Group(); + * + * sphere.addTo(group); + * box.addTo(group); + * @example Approach 2 - Making a group from objects + * const sphere = new Sphere(); + * const box = new Box(); + * const group = new Group(box, sphere); + * // OR: const group = new Group([box, sphere]); + */ + + var Group$1 = + /*#__PURE__*/ + function (_MeshComponent) { + function Group$$1() { + var _this; + + classCallCheck(this, Group$$1); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(Group$$1).call(this, {})); + + for (var i = 0; i < arguments.length; i++) { + var obj = i < 0 || arguments.length <= i ? undefined : arguments[i]; + if (obj instanceof Component) obj.addTo(assertThisInitialized(assertThisInitialized(_this)));else if (obj instanceof Object3D) _this.native.add(obj); + } + + return _this; + } + + createClass(Group$$1, [{ + key: "build", + value: function build() { + return new Object3D(); + } + }]); + + inherits(Group$$1, _MeshComponent); + + return Group$$1; + }(MeshComponent); + + /** @module components/meshes */ + + /** + * @class ElementModule + * @category modules/app + * @param {Object} [container=document.body] container is the DOM object to which application's canvas will be added to. + * @memberof module:modules/app + * @example Creating an element module, passing it to the App + * new App([ + * new ElementModule(document.getElementById('app')) + * ]); + */ + var ElementModule = + /*#__PURE__*/ + function () { + function ElementModule() { + var container = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document.body; + + classCallCheck(this, ElementModule); + + if (container.container) { + console.warn('ElementModule now accepts only argument which is a DOM object, not a params object.'); + this.container = container.container; + } else this.container = container; + + this.createElement(); + } + /** + * @method createElement + * @instance + * @description Creates a canvas element. + * @memberof module:modules/app.ElementModule + */ + + + createClass(ElementModule, [{ + key: "createElement", + value: function createElement() { + this.element = window.document.createElement('div'); + this.element.className = 'whs-app'; + this.element.style.width = 'inherit'; + this.element.style.height = 'inherit'; + this.element.style.position = 'relative'; + } + }, { + key: "manager", + value: function manager(_manager) { + _manager.set('element', this.element); + + _manager.set('container', this.container); + } + }, { + key: "integrate", + value: function integrate(self) { + self.container.appendChild(self.element); + } + }]); + + return ElementModule; + }(); + + /** + * @class RenderingModule + * @category modules/app + * @param {Object} [params] + * @memberof module:modules/app + * @example Creating a rendering module and passing it to App's modules + * new App([ + * new ElementModule(), + * new SceneModule(), + * new DefineModule('camera', new PerspectiveCamera({ + * position: new THREE.Vector3(0, 6, 18), + * far: 10000 + * })), + * new RenderingModule({ + * bgColor: 0x162129, + * + * renderer: { + * antialias: true + * } + * }, {shadow: true}) + * ]); + */ + + var RenderingModule = + /*#__PURE__*/ + function () { + /** + * additional + * @description collection of additional scripts + * @static + * @member {Object} module:core.App#additional + * @public + */ + + /** + * enabled + * @static + * @member {Boolean} module:core.App#enabled + * @public + */ + function RenderingModule() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var additional = arguments.length > 1 ? arguments[1] : undefined; + + classCallCheck(this, RenderingModule); + + defineProperty$3(this, "enabled", true); + + this.params = Object.assign({ + width: window.innerWidth, + height: window.innerHeight, + resolution: new Vector2(1, 1), + pixelRatio: window.devicePixelRatio, + bgColor: 0x000000, + bgOpacity: 1, + renderer: {}, + fix: function fix() {} + }, params); + var _this$params = this.params, + bgColor = _this$params.bgColor, + bgOpacity = _this$params.bgOpacity, + _renderer = _this$params.renderer, + pixelRatio = _this$params.pixelRatio, + width = _this$params.width, + height = _this$params.height, + resolution = _this$params.resolution, + fix = _this$params.fix; + this.renderer = new WebGLRenderer(_renderer); + this.effects = []; + this.renderer.setClearColor(bgColor, bgOpacity); + if (pixelRatio) this.renderer.setPixelRatio(pixelRatio); + this.setSize(Number(width * resolution.x).toFixed(), Number(height * resolution.y).toFixed()); + + for (var key in additional) { + if (additional[key]) this.applyAdditional(key); + } + + fix(this.renderer); + } + /** + * @method applyAdditional + * @description Apply additional script from RenderingModule.additional + * @param {Stirng} name Script name + * @return {this} + * @memberof module:modules/app.RenderingModule + */ + + + createClass(RenderingModule, [{ + key: "applyAdditional", + value: function applyAdditional(name) { + RenderingModule.additional[name].apply(this, [this.renderer]); + } + /** + * @method integrateRenderer + * @description Integrate renderer + * @param {NodeElement} element DOM object + * @param {THREE.Scene} scene used scene + * @param {THREE.Camera} camera used camera + * @return {Loop} renderLoop + * @memberof module:modules/app.RenderingModule + */ + + }, { + key: "integrateRenderer", + value: function integrateRenderer(element, scene, camera) { + var _this = this; + + this.scene = scene; + this.camera = camera; + this.attachToCanvas(element); + return new Loop(function () { + return _this.renderer.render(_this.scene, _this.camera); + }); + } + /** + * @method effect + * @description Add three.js effect + * @param {Object} effect three.js effect + * @param {function} effectLoop update function for effect + * @return {this} + * @memberof module:modules/app.RenderingModule + */ + + }, { + key: "effect", + value: function effect(_effect) { + var _this2 = this; + + var effectLoop = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () { + _effect.render(_this2.scene, _this2.camera); + }; + this.renderLoop.stop(); + var size = this.renderer.getSize(); + + _effect.setSize(size.width, size.height); + + var loop = new Loop(effectLoop); + this.effects.push(loop); + if (this.enabled) loop.start(this.app); + return this; + } + /** + * @method setSize + * @description Update render target width and height. + * @param {Number} width + * @param {Number} height + * @memberof module:modules/app.RenderingModule + */ + + }, { + key: "setSize", + value: function setSize(width, height) { + if (this.renderer) this.renderer.setSize(width, height); + } + /** + * @method attachToCanvas + * @description Attach renderer.domElement to element + * @param {NodeElement} element DOM object + * @memberof module:modules/app.RenderingModule + */ + + }, { + key: "attachToCanvas", + value: function attachToCanvas(element) { + var canvas = this.renderer.domElement; // attach to new parent world dom + + element.appendChild(canvas); + canvas.style.width = '100%'; + canvas.style.height = '100%'; + } + /** + * @method stop + * @description Stops renderLoop and effect loops + * @memberof module:modules/app.RenderingModule + */ + + }, { + key: "stop", + value: function stop() { + this.enabled = false; + this.renderLoop.stop(); + this.effects.forEach(function (loop) { + return loop.stop(); + }); + } + /** + * @method play + * @description Resumes renderLoop and effect loops + * @memberof module:modules/app.RenderingModule + */ + + }, { + key: "play", + value: function play() { + this.enabled = true; + this.renderLoop.start(); + this.effects.forEach(function (loop) { + return loop.start(); + }); + } + }, { + key: "manager", + value: function manager(_manager) { + var _this3 = this; + + _manager.define('rendering'); + + _manager.set('renderer', this.renderer); + + this.app = _manager.handler; + this.renderLoop = this.integrateRenderer(_manager.get('element'), _manager.get('scene'), _manager.get('camera').native); + + _manager.update({ + element: function element(_element) { + _this3.attachToCanvas(_element); + }, + scene: function scene(_scene) { + _this3.scene = _scene; + }, + camera: function camera(_camera) { + _this3.camera = _camera.native; + } + }); + } + }, { + key: "integrate", + value: function integrate(self) { + var _this4 = this; + + self.renderLoop.start(this); + self.effects.forEach(function (loop) { + return loop.start(_this4); + }); + } + /** + * @method dispose + * @description Dispose rendering context + * @memberof module:modules/app.RenderingModule + */ + + }, { + key: "dispose", + value: function dispose() { + this.stop(); + this.renderer.forceContextLoss(); + } + }]); + + return RenderingModule; + }(); + + defineProperty$3(RenderingModule, "additional", { + shadow: function shadow(renderer) { + renderer.shadowMap.enabled = true; + } + }); + + var SYMBOL_CHILDREN_FOR_SCENE = Symbol('SYMBOL_CHILDREN_FOR_SCENE'); + /** + * @class SceneModule + * @category modules/app + * @param {Boolean} [willSceneBeReplaced=false] willSceneBeReplaced should be true only if you are going to overwrite scene dependency even without the use of default one. + * @memberof module:modules/app + */ + + var SceneModule = + /*#__PURE__*/ + function () { + function SceneModule() { + var willSceneBeReplaced = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + classCallCheck(this, SceneModule); + + this.scene = willSceneBeReplaced ? null : new Scene(); + } + + createClass(SceneModule, [{ + key: "manager", + value: function manager(_manager) { + _manager.set('scene', this.scene); + } + }, { + key: "integrate", + value: function integrate(self) { + Object.assign(this, { + add: function () { + var _add = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee(object) { + return regenerator.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + if (!object.parent) { + _context.next = 3; + break; + } + + _context.next = 3; + return object.parent.remove(object); + + case 3: + _context.next = 5; + return object.wait(); + + case 5: + if (object.native) { + _context.next = 7; + break; + } + + throw new CompositionError('SceneModule', 'there is no object.native', this); + + case 7: + object.parent = this; + _context.next = 10; + return this.applyBridge({ + onAdd: object + }).onAdd; + + case 10: + self.scene.add(object.native); + this.children.push(object); + return _context.abrupt("return", object); + + case 13: + case "end": + return _context.stop(); + } + } + }, _callee, this); + })); + + return function add(_x) { + return _add.apply(this, arguments); + }; + }(), + remove: function () { + var _remove = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee2(object) { + return regenerator.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + if (!(object.parent !== this)) { + _context2.next = 2; + break; + } + + return _context2.abrupt("return"); + + case 2: + _context2.next = 4; + return object.wait(); + + case 4: + this.applyBridge({ + onRemove: object + }); + object.parent = null; + self.scene.remove(object.native); + this.children.splice(this.children.indexOf(object), 1); + + case 8: + case "end": + return _context2.stop(); + } + } + }, _callee2, this); + })); + + return function remove(_x2) { + return _remove.apply(this, arguments); + }; + }(), + _setScene: function _setScene(scene) { + this.children = scene[SYMBOL_CHILDREN_FOR_SCENE] = scene[SYMBOL_CHILDREN_FOR_SCENE] || []; + self.scene = scene; + }, + setScene: function setScene(scene) { + this._setScene(scene); + + this.manager.set('scene', scene); + }, + getScene: function getScene() { + return self.scene; + } + }); + if (self.scene) this._setScene(self.scene); + } + }]); + + return SceneModule; + }(); + + // import {addResizeListener} from 'detect-element-resize'; + + /** + * @class ResizeModule + * @category modules/app + * @param {Object} [params={auto: true}] - If auto is set to true - resize will be triggered when container resizes + * @memberof module:modules/app + */ + var ResizeModule = + /*#__PURE__*/ + function () { + function ResizeModule() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, ResizeModule); + + this.params = Object.assign({ + auto: true + }, params); + this.callbacks = [this.setSize.bind(this)]; + } + /** + * @function setSize + * @instance + * @description This function sets the provided width & height to the renderer object. + * @param {Number} [width=1] - The promise that should be added to a queue. + * @param {Number} [height=1] - that is resolved when all promises completed. + * @memberof module:modules/app.ResizeModule + */ + + + createClass(ResizeModule, [{ + key: "setSize", + value: function setSize() { + var width = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; + var height = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; + this.camera.native.aspect = width / height; + this.camera.native.updateProjectionMatrix(); + if (this.rendering) this.rendering.setSize(width, height); + } + /** + * @method trigger + * @instance + * @description Triggers resize when called. width & height are determined automatically + * This invokes each callbacks with the new width and height as params + * @memberof module:modules/app.ResizeModule + */ + + }, { + key: "trigger", + value: function trigger() { + var _this$container = this.container, + offsetWidth = _this$container.offsetWidth, + offsetHeight = _this$container.offsetHeight, + resolution = this.resolution; + var width = Number(offsetWidth * resolution.x).toFixed(); + var height = Number(offsetHeight * resolution.y).toFixed(); + this.callbacks.forEach(function (cb) { + cb(width, height); + }); + } + /** + * @method addAutoresize + * @instance + * @description Sets module to autoresize, this adds an event listene on window resize to trigger the resize + * @memberof module:modules/app.ResizeModule + */ + + }, { + key: "addAutoresize", + value: function addAutoresize() { + this.container = this.getContainer(); + this.resolution = this.getResolution(); + if (this.params.auto) window.addEventListener('resize', this.trigger.bind(this)); + } + /** + * @method addCallback + * @instance + * @description Adds a call back function to the existing callbacks list. + * @param {Function} func - The callback function to add + * @memberof module:modules/app.ResizeModule + */ + + }, { + key: "addCallback", + value: function addCallback(func) { + this.callbacks.push(func); + } + }, { + key: "manager", + value: function manager(_manager) { + var _this = this; + + _manager.define('resize'); + + this.rendering = _manager.get('renderer'); + this.camera = _manager.get('camera'); + + this.getResolution = function () { + return _manager.use('rendering').params.resolution; + }; + + this.getContainer = function () { + return _manager.get('container'); + }; + + _manager.update({ + container: function container(_container) { + _this.container = _container; + } + }); + + this.addAutoresize(); + } + }]); + + return ResizeModule; + }(); + + var fragment = "uniform sampler2D tPreviousLum;\r\nuniform sampler2D tCurrentLum;\r\nuniform float minLuminance;\r\nuniform float delta;\r\nuniform float tau;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tfloat previousLum = texture2D(tPreviousLum, vUv, MIP_LEVEL_1X1).r;\r\n\tfloat currentLum = texture2D(tCurrentLum, vUv, MIP_LEVEL_1X1).r;\r\n\r\n\tpreviousLum = max(minLuminance, previousLum);\r\n\tcurrentLum = max(minLuminance, currentLum);\r\n\r\n\t// Adapt the luminance using Pattanaik's technique.\r\n\tfloat adaptedLum = previousLum + (currentLum - previousLum) * (1.0 - exp(-delta * tau));\r\n\r\n\tgl_FragColor.r = adaptedLum;\r\n\r\n}\r\n"; + var vertex = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * An adaptive luminosity shader material. + */ + + var AdaptiveLuminosityMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new adaptive luminosity material. + */ + function AdaptiveLuminosityMaterial() { + classCallCheck(this, AdaptiveLuminosityMaterial); + + return possibleConstructorReturn(this, getPrototypeOf$2(AdaptiveLuminosityMaterial).call(this, { + type: "AdaptiveLuminosityMaterial", + defines: { + MIP_LEVEL_1X1: "0.0" + }, + uniforms: { + tPreviousLum: new Uniform(null), + tCurrentLum: new Uniform(null), + minLuminance: new Uniform(0.01), + delta: new Uniform(0.0), + tau: new Uniform(1.0) + }, + fragmentShader: fragment, + vertexShader: vertex, + depthWrite: false, + depthTest: false + })); + } + + inherits(AdaptiveLuminosityMaterial, _ShaderMaterial); + + return AdaptiveLuminosityMaterial; + }(ShaderMaterial); + + var fragment$1 = "uniform sampler2D tDiffuse;\r\nuniform sampler2D tDepth;\r\n\r\nuniform float focus;\r\nuniform float dof;\r\nuniform float aspect;\r\nuniform float aperture;\r\nuniform float maxBlur;\r\n\r\nvarying vec2 vUv;\r\n\r\n#ifndef USE_LOGDEPTHBUF\r\n\r\n\t#include \r\n\r\n\tuniform float cameraNear;\r\n\tuniform float cameraFar;\r\n\r\n\tfloat readDepth(sampler2D depthSampler, vec2 coord) {\r\n\r\n\t\tfloat fragCoordZ = texture2D(depthSampler, coord).x;\r\n\t\tfloat viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\r\n\r\n\t\treturn viewZToOrthographicDepth(viewZ, cameraNear, cameraFar);\r\n\r\n\t}\r\n\r\n#endif\r\n\r\nvoid main() {\r\n\r\n\tvec2 aspectCorrection = vec2(1.0, aspect);\r\n\r\n\t#ifdef USE_LOGDEPTHBUF\r\n\r\n\t\tfloat depth = texture2D(tDepth, vUv).x;\r\n\r\n\t#else\r\n\r\n\t\tfloat depth = readDepth(tDepth, vUv);\r\n\r\n\t#endif\r\n\r\n\tfloat focusNear = clamp(focus - dof, 0.0, 1.0);\r\n\tfloat focusFar = clamp(focus + dof, 0.0, 1.0);\r\n\r\n\t// Calculate a DoF mask.\r\n\tfloat low = step(depth, focusNear);\r\n\tfloat high = step(focusFar, depth);\r\n\r\n\tfloat factor = (depth - focusNear) * low + (depth - focusFar) * high;\r\n\r\n\tvec2 dofBlur = vec2(clamp(factor * aperture, -maxBlur, maxBlur));\r\n\r\n\tvec2 dofblur9 = dofBlur * 0.9;\r\n\tvec2 dofblur7 = dofBlur * 0.7;\r\n\tvec2 dofblur4 = dofBlur * 0.4;\r\n\r\n\tvec4 color = vec4(0.0);\r\n\r\n\tcolor += texture2D(tDiffuse, vUv);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, 0.4 ) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, 0.37) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, 0.29) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, 0.15) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.40, 0.0 ) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, -0.15) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, -0.29) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, -0.37) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, -0.4 ) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, 0.37) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, 0.29) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, 0.15) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.4, 0.0 ) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, -0.15) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, -0.29) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, -0.37) * aspectCorrection) * dofBlur);\r\n\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, 0.37) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, 0.15) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, -0.15) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, -0.37) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, 0.37) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, 0.15) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, -0.15) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, -0.37) * aspectCorrection) * dofblur9);\r\n\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, 0.29) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.40, 0.0 ) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, -0.29) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, -0.4 ) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, 0.29) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.4, 0.0 ) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, -0.29) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, 0.4 ) * aspectCorrection) * dofblur7);\r\n\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, 0.29) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.4, 0.0 ) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, -0.29) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, -0.4 ) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, 0.29) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.4, 0.0 ) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, -0.29) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, 0.4 ) * aspectCorrection) * dofblur4);\r\n\r\n\tgl_FragColor = color / 41.0;\r\n\r\n}\r\n"; + var vertex$1 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * Depth of Field shader (Bokeh). + * + * Original shader code by Martins Upitis: + * http://artmartinsh.blogspot.com/2010/02/glsl-lens-blur-filter-with-bokeh.html + */ + + var BokehMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new bokeh material. + * + * @param {PerspectiveCamera} [camera] - A camera. + * @param {Object} [options] - The options. + * @param {Number} [options.focus=1.0] - The focus distance, corresponds directly with the scene depth. + * @param {Number} [options.dof=0.02] - Depth of field. An area in front of and behind the focus point that still appears sharp. + * @param {Number} [options.aperture=0.025] - Camera aperture scale. Bigger values for stronger blur and shallower depth of field. + * @param {Number} [options.maxBlur=1.0] - Maximum blur strength. + */ + function BokehMaterial(camera) { + var _this; + + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + classCallCheck(this, BokehMaterial); + + var settings = Object.assign({ + focus: 1.0, + dof: 0.02, + aperture: 0.025, + maxBlur: 1.0 + }, options); + _this = possibleConstructorReturn(this, getPrototypeOf$2(BokehMaterial).call(this, { + type: "BokehMaterial", + uniforms: { + cameraNear: new Uniform(0.1), + cameraFar: new Uniform(2000), + aspect: new Uniform(1.0), + tDiffuse: new Uniform(null), + tDepth: new Uniform(null), + focus: new Uniform(settings.focus), + dof: new Uniform(settings.dof), + aperture: new Uniform(settings.aperture), + maxBlur: new Uniform(settings.maxBlur) + }, + fragmentShader: fragment$1, + vertexShader: vertex$1, + depthWrite: false, + depthTest: false + })); + + _this.adoptCameraSettings(camera); + + return _this; + } + /** + * Adopts the settings of the given camera. + * + * @param {PerspectiveCamera} [camera=null] - A camera. + */ + + + createClass(BokehMaterial, [{ + key: "adoptCameraSettings", + value: function adoptCameraSettings() { + var camera = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + + if (camera !== null) { + this.uniforms.cameraNear.value = camera.near; + this.uniforms.cameraFar.value = camera.far; + this.uniforms.aspect.value = camera.aspect; + } + } + }]); + + inherits(BokehMaterial, _ShaderMaterial); + + return BokehMaterial; + }(ShaderMaterial); + + var fragment$2 = "uniform sampler2D tDiffuse;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset[3];\r\n\r\nvoid main() {\r\n\r\n\tconst vec2 threshold = vec2(EDGE_THRESHOLD);\r\n\r\n\t// Calculate color deltas.\r\n\tvec4 delta;\r\n\tvec3 c = texture2D(tDiffuse, vUv).rgb;\r\n\r\n\tvec3 cLeft = texture2D(tDiffuse, vOffset[0].xy).rgb;\r\n\tvec3 t = abs(c - cLeft);\r\n\tdelta.x = max(max(t.r, t.g), t.b);\r\n\r\n\tvec3 cTop = texture2D(tDiffuse, vOffset[0].zw).rgb;\r\n\tt = abs(c - cTop);\r\n\tdelta.y = max(max(t.r, t.g), t.b);\r\n\r\n\t// We do the usual threshold.\r\n\tvec2 edges = step(threshold, delta.xy);\r\n\r\n\t// Then discard if there is no edge.\r\n\tif(dot(edges, vec2(1.0)) == 0.0) {\r\n\r\n\t\tdiscard;\r\n\r\n\t}\r\n\r\n\t// Calculate right and bottom deltas.\r\n\tvec3 cRight = texture2D(tDiffuse, vOffset[1].xy).rgb;\r\n\tt = abs(c - cRight);\r\n\tdelta.z = max(max(t.r, t.g), t.b);\r\n\r\n\tvec3 cBottom = texture2D(tDiffuse, vOffset[1].zw).rgb;\r\n\tt = abs(c - cBottom);\r\n\tdelta.w = max(max(t.r, t.g), t.b);\r\n\r\n\t// Calculate the maximum delta in the direct neighborhood.\r\n\tfloat maxDelta = max(max(max(delta.x, delta.y), delta.z), delta.w);\r\n\r\n\t// Calculate left-left and top-top deltas.\r\n\tvec3 cLeftLeft = texture2D(tDiffuse, vOffset[2].xy).rgb;\r\n\tt = abs(c - cLeftLeft);\r\n\tdelta.z = max(max(t.r, t.g), t.b);\r\n\r\n\tvec3 cTopTop = texture2D(tDiffuse, vOffset[2].zw).rgb;\r\n\tt = abs(c - cTopTop);\r\n\tdelta.w = max(max(t.r, t.g), t.b);\r\n\r\n\t// Calculate the final maximum delta.\r\n\tmaxDelta = max(max(maxDelta, delta.z), delta.w);\r\n\r\n\t// Local contrast adaptation in action.\r\n\tedges.xy *= step(0.5 * maxDelta, delta.xy);\r\n\r\n\tgl_FragColor = vec4(edges, 0.0, 0.0);\r\n\r\n}\r\n"; + var vertex$2 = "uniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset[3];\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\r\n\tvOffset[0] = uv.xyxy + texelSize.xyxy * vec4(-1.0, 0.0, 0.0, 1.0); // Changed sign in W component.\r\n\tvOffset[1] = uv.xyxy + texelSize.xyxy * vec4(1.0, 0.0, 0.0, -1.0); // Changed sign in W component.\r\n\tvOffset[2] = uv.xyxy + texelSize.xyxy * vec4(-2.0, 0.0, 0.0, 2.0); // Changed sign in W component.\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * A material that detects edges in a color texture. + * + * Mainly used for Subpixel Morphological Antialiasing. + */ + + var ColorEdgesMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new color edges material. + * + * @param {Vector2} [texelSize] - The absolute screen texel size. + */ + function ColorEdgesMaterial() { + var texelSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Vector2(); + + classCallCheck(this, ColorEdgesMaterial); + + return possibleConstructorReturn(this, getPrototypeOf$2(ColorEdgesMaterial).call(this, { + type: "ColorEdgesMaterial", + defines: { + EDGE_THRESHOLD: "0.1" + }, + uniforms: { + tDiffuse: new Uniform(null), + texelSize: new Uniform(texelSize) + }, + fragmentShader: fragment$2, + vertexShader: vertex$2, + depthWrite: false, + depthTest: false + })); + } + /** + * Sets the edge detection sensitivity. + * + * A lower value results in more edges being detected at the expense of + * performance. + * + * 0.1 is a reasonable value, and allows to catch most visible edges. + * 0.05 is a rather overkill value, that allows to catch 'em all. + * + * If temporal supersampling is used, 0.2 could be a reasonable value, + * as low contrast edges are properly filtered by just 2x. + * + * @param {Number} threshold - The edge detection sensitivity. Range: [0, 0.5]. + */ + + + createClass(ColorEdgesMaterial, [{ + key: "setEdgeDetectionThreshold", + value: function setEdgeDetectionThreshold(threshold) { + this.defines.EDGE_THRESHOLD = threshold.toFixed("2"); + this.needsUpdate = true; + } + }]); + + inherits(ColorEdgesMaterial, _ShaderMaterial); + + return ColorEdgesMaterial; + }(ShaderMaterial); + + var fragment$3 = "uniform sampler2D texture1;\r\nuniform sampler2D texture2;\r\n\r\nuniform float opacity1;\r\nuniform float opacity2;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel1 = opacity1 * texture2D(texture1, vUv);\r\n\tvec4 texel2 = opacity2 * texture2D(texture2, vUv);\r\n\r\n\t#ifdef SCREEN_MODE\r\n\r\n\t\tvec3 invTexel1 = vec3(1.0) - texel1.rgb;\r\n\t\tvec3 invTexel2 = vec3(1.0) - texel2.rgb;\r\n\r\n\t\tvec4 color = vec4(\r\n\t\t\tvec3(1.0) - invTexel1 * invTexel2,\r\n\t\t\ttexel1.a + texel2.a\r\n\t\t);\r\n\r\n\t#else\r\n\r\n\t\tvec4 color = texel1 + texel2;\r\n\r\n\t#endif\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n"; + var vertex$3 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * A material for combining two textures. + * + * This material supports the two blend modes Add and Screen. + * + * In Screen mode, the two textures are effectively projected on a white screen + * simultaneously. In Add mode, the textures are simply added together which + * often produces undesired, washed out results. + */ + + var CombineMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new combine material. + * + * @param {Boolean} [screenMode=false] - Whether the screen blend mode should be used. + */ + function CombineMaterial() { + var _this; + + var screenMode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + classCallCheck(this, CombineMaterial); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(CombineMaterial).call(this, { + type: "CombineMaterial", + uniforms: { + texture1: new Uniform(null), + texture2: new Uniform(null), + opacity1: new Uniform(1.0), + opacity2: new Uniform(1.0) + }, + fragmentShader: fragment$3, + vertexShader: vertex$3, + depthWrite: false, + depthTest: false + })); + + _this.setScreenModeEnabled(screenMode); + + return _this; + } + /** + * Enables or disables the Screen blend mode. + * + * @param {Boolean} enabled - Whether the Screen blend mode should be enabled. + */ + + + createClass(CombineMaterial, [{ + key: "setScreenModeEnabled", + value: function setScreenModeEnabled(enabled) { + if (enabled) { + this.defines.SCREEN_MODE = "1"; + } else { + delete this.defines.SCREEN_MODE; + } + + this.needsUpdate = true; + } + }]); + + inherits(CombineMaterial, _ShaderMaterial); + + return CombineMaterial; + }(ShaderMaterial); + + var fragment$4 = "#include \r\n#include \r\n\r\nuniform sampler2D tDiffuse;\r\n\r\nvarying vec2 vUv0;\r\nvarying vec2 vUv1;\r\nvarying vec2 vUv2;\r\nvarying vec2 vUv3;\r\n\r\nvoid main() {\r\n\r\n\t// Sample top left texel.\r\n\tvec4 sum = texture2D(tDiffuse, vUv0);\r\n\r\n\t// Sample top right texel.\r\n\tsum += texture2D(tDiffuse, vUv1);\r\n\r\n\t// Sample bottom right texel.\r\n\tsum += texture2D(tDiffuse, vUv2);\r\n\r\n\t// Sample bottom left texel.\r\n\tsum += texture2D(tDiffuse, vUv3);\r\n\r\n\t// Compute the average.\r\n\tgl_FragColor = sum * 0.25;\r\n\r\n\t#include \r\n\r\n}\r\n"; + var vertex$4 = "uniform vec2 texelSize;\r\nuniform vec2 halfTexelSize;\r\nuniform float kernel;\r\n\r\nvarying vec2 vUv0;\r\nvarying vec2 vUv1;\r\nvarying vec2 vUv2;\r\nvarying vec2 vUv3;\r\n\r\nvoid main() {\r\n\r\n\tvec2 dUv = (texelSize * vec2(kernel)) + halfTexelSize;\r\n\r\n\tvUv0 = vec2(uv.x - dUv.x, uv.y + dUv.y);\r\n\tvUv1 = vec2(uv.x + dUv.x, uv.y + dUv.y);\r\n\tvUv2 = vec2(uv.x + dUv.x, uv.y - dUv.y);\r\n\tvUv3 = vec2(uv.x - dUv.x, uv.y - dUv.y);\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * An optimised convolution shader material. + * + * This material supports dithering. + * + * Based on the GDC2003 Presentation by Masaki Kawase, Bunkasha Games: + * Frame Buffer Postprocessing Effects in DOUBLE-S.T.E.A.L (Wreckless) + * and an article by Filip Strugar, Intel: + * An investigation of fast real-time GPU-based image blur algorithms + * + * Further modified according to Apple's + * [Best Practices for Shaders](https://goo.gl/lmRoM5). + */ + + var ConvolutionMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new convolution material. + * + * @param {Vector2} [texelSize] - The absolute screen texel size. + */ + function ConvolutionMaterial() { + var _this; + + var texelSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Vector2(); + + classCallCheck(this, ConvolutionMaterial); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(ConvolutionMaterial).call(this, { + type: "ConvolutionMaterial", + uniforms: { + tDiffuse: new Uniform(null), + texelSize: new Uniform(new Vector2()), + halfTexelSize: new Uniform(new Vector2()), + kernel: new Uniform(0.0) + }, + fragmentShader: fragment$4, + vertexShader: vertex$4, + depthWrite: false, + depthTest: false + })); + + _this.setTexelSize(texelSize.x, texelSize.y); + /** + * The current kernel size. + * + * @type {KernelSize} + * @default KernelSize.LARGE + */ + + + _this.kernelSize = KernelSize.LARGE; + return _this; + } + /** + * Returns the kernel. + * + * @return {Float32Array} The kernel. + */ + + + createClass(ConvolutionMaterial, [{ + key: "getKernel", + value: function getKernel() { + return kernelPresets[this.kernelSize]; + } + /** + * Sets the texel size. + * + * @param {Number} x - The texel width. + * @param {Number} y - The texel height. + */ + + }, { + key: "setTexelSize", + value: function setTexelSize(x, y) { + this.uniforms.texelSize.value.set(x, y); + this.uniforms.halfTexelSize.value.set(x, y).multiplyScalar(0.5); + } + }]); + + inherits(ConvolutionMaterial, _ShaderMaterial); + + return ConvolutionMaterial; + }(ShaderMaterial); + /** + * The Kawase blur kernel presets. + * + * @type {Float32Array[]} + * @private + */ + + var kernelPresets = [new Float32Array([0.0, 0.0]), new Float32Array([0.0, 1.0, 1.0]), new Float32Array([0.0, 1.0, 1.0, 2.0]), new Float32Array([0.0, 1.0, 2.0, 2.0, 3.0]), new Float32Array([0.0, 1.0, 2.0, 3.0, 4.0, 4.0, 5.0]), new Float32Array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 7.0, 8.0, 9.0, 10.0])]; + /** + * A kernel size enumeration. + * + * @type {Object} + * @property {Number} VERY_SMALL - A very small kernel that matches a 7x7 Gauss blur kernel. + * @property {Number} SMALL - A small kernel that matches a 15x15 Gauss blur kernel. + * @property {Number} MEDIUM - A medium sized kernel that matches a 23x23 Gauss blur kernel. + * @property {Number} LARGE - A large kernel that matches a 35x35 Gauss blur kernel. + * @property {Number} VERY_LARGE - A very large kernel that matches a 63x63 Gauss blur kernel. + * @property {Number} HUGE - A huge kernel that matches a 127x127 Gauss blur kernel. + */ + + var KernelSize = { + VERY_SMALL: 0, + SMALL: 1, + MEDIUM: 2, + LARGE: 3, + VERY_LARGE: 4, + HUGE: 5 + }; + + var fragment$5 = "uniform sampler2D tDiffuse;\r\nuniform float opacity;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tgl_FragColor = opacity * texel;\r\n\r\n}\r\n"; + var vertex$5 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * A simple copy shader material. + */ + + var CopyMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new copy material. + */ + function CopyMaterial() { + classCallCheck(this, CopyMaterial); + + return possibleConstructorReturn(this, getPrototypeOf$2(CopyMaterial).call(this, { + type: "CopyMaterial", + uniforms: { + tDiffuse: new Uniform(null), + opacity: new Uniform(1.0) + }, + fragmentShader: fragment$5, + vertexShader: vertex$5, + depthWrite: false, + depthTest: false + })); + } + + inherits(CopyMaterial, _ShaderMaterial); + + return CopyMaterial; + }(ShaderMaterial); + + var fragment$6 = "#include \r\n#include \r\n\r\nuniform sampler2D tDepth;\r\nuniform float cameraNear;\r\nuniform float cameraFar;\r\n\r\nvarying float vViewZ;\r\nvarying vec4 vProjTexCoord;\r\n\r\nvoid main() {\r\n\r\n\t#include \r\n\r\n\t// Transform into Cartesian coordinate (not mirrored).\r\n\tvec2 projTexCoord = (vProjTexCoord.xy / vProjTexCoord.w) * 0.5 + 0.5;\r\n\tprojTexCoord = clamp(projTexCoord, 0.002, 0.998);\r\n\r\n\tfloat fragCoordZ = unpackRGBAToDepth(texture2D(tDepth, projTexCoord));\r\n\r\n\t#ifdef PERSPECTIVE_CAMERA\r\n\r\n\t\tfloat viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\r\n\r\n\t#else\r\n\r\n\t\tfloat viewZ = orthographicDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\r\n\r\n\t#endif\r\n\r\n\tfloat depthTest = (-vViewZ > -viewZ) ? 1.0 : 0.0;\r\n\r\n\tgl_FragColor.rgb = vec3(0.0, depthTest, 1.0);\r\n\r\n}\r\n"; + var vertex$6 = "#include \r\n#include \r\n#include \r\n#include \r\n\r\nvarying float vViewZ;\r\nvarying vec4 vProjTexCoord;\r\n\r\nvoid main() {\r\n\r\n\t#include \r\n\r\n\t#include \r\n\t#include \r\n\t#include \r\n\t#include \r\n\r\n\tvViewZ = mvPosition.z;\r\n\tvProjTexCoord = gl_Position;\r\n\r\n\t#include \r\n\r\n}\r\n"; + /** + * A depth comparison shader material. + */ + + var DepthComparisonMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new depth comparison material. + * + * @param {Texture} [depthTexture=null] - A depth texture. + * @param {PerspectiveCamera} [camera] - A camera. + */ + function DepthComparisonMaterial() { + var _this; + + var depthTexture = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + var camera = arguments.length > 1 ? arguments[1] : undefined; + + classCallCheck(this, DepthComparisonMaterial); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(DepthComparisonMaterial).call(this, { + type: "DepthComparisonMaterial", + uniforms: { + tDepth: new Uniform(depthTexture), + cameraNear: new Uniform(0.1), + cameraFar: new Uniform(2000) + }, + fragmentShader: fragment$6, + vertexShader: vertex$6, + depthWrite: false, + depthTest: false, + morphTargets: true, + skinning: true + })); + + _this.adoptCameraSettings(camera); + + return _this; + } + /** + * Adopts the settings of the given camera. + * + * @param {Camera} [camera=null] - A camera. + */ + + + createClass(DepthComparisonMaterial, [{ + key: "adoptCameraSettings", + value: function adoptCameraSettings() { + var camera = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + + if (camera !== null) { + this.uniforms.cameraNear.value = camera.near; + this.uniforms.cameraFar.value = camera.far; + + if (camera instanceof PerspectiveCamera) { + this.defines.PERSPECTIVE_CAMERA = "1"; + } else { + delete this.defines.PERSPECTIVE_CAMERA; + } + } + } + }]); + + inherits(DepthComparisonMaterial, _ShaderMaterial); + + return DepthComparisonMaterial; + }(ShaderMaterial); + + var fragment$7 = "uniform sampler2D tDiffuse;\r\n\r\nuniform float angle;\r\nuniform float scale;\r\nuniform float intensity;\r\n\r\nvarying vec2 vUv;\r\nvarying vec2 vUvPattern;\r\n\r\nfloat pattern() {\r\n\r\n\tfloat s = sin(angle);\r\n\tfloat c = cos(angle);\r\n\r\n\tvec2 point = vec2(c * vUvPattern.x - s * vUvPattern.y, s * vUvPattern.x + c * vUvPattern.y) * scale;\r\n\r\n\treturn (sin(point.x) * sin(point.y)) * 4.0;\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tvec3 color = texel.rgb;\r\n\r\n\t#ifdef AVERAGE\r\n\r\n\t\tcolor = vec3((color.r + color.g + color.b) / 3.0);\r\n\r\n\t#endif\r\n\r\n\tcolor = vec3(color * 10.0 - 5.0 + pattern());\r\n\tcolor = texel.rgb + (color - texel.rgb) * intensity;\r\n\r\n\tgl_FragColor = vec4(color, texel.a);\r\n\r\n}\r\n"; + var vertex$7 = "uniform vec4 offsetRepeat;\r\n\r\nvarying vec2 vUv;\r\nvarying vec2 vUvPattern;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tvUvPattern = uv * offsetRepeat.zw + offsetRepeat.xy;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * A dot screen shader material. + */ + + var DotScreenMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new dot screen material. + * + * @param {Boolean} [options] - The options. + * @param {Boolean} [options.average=false] - Whether the shader should output the colour average (black and white). + * @param {Boolean} [options.angle=1.57] - The angle of the dot pattern. + * @param {Boolean} [options.scale=1.0] - The scale of the dot pattern. + * @param {Boolean} [options.intensity=1.0] - The intensity of the effect. + */ + function DotScreenMaterial() { + var _this; + + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, DotScreenMaterial); + + var settings = Object.assign({ + average: false, + angle: 1.57, + scale: 1.0, + intensity: 1.0 + }, options); + _this = possibleConstructorReturn(this, getPrototypeOf$2(DotScreenMaterial).call(this, { + type: "DotScreenMaterial", + uniforms: { + tDiffuse: new Uniform(null), + angle: new Uniform(settings.angle), + scale: new Uniform(settings.scale), + intensity: new Uniform(settings.intensity), + offsetRepeat: new Uniform(new Vector4(0.5, 0.5, 1.0, 1.0)) + }, + fragmentShader: fragment$7, + vertexShader: vertex$7, + depthWrite: false, + depthTest: false + })); + + _this.setAverageEnabled(settings.average); + + return _this; + } + /** + * Enables or disables the Screen blend mode. + * + * @param {Boolean} enabled - Whether the Screen blend mode should be enabled. + */ + + + createClass(DotScreenMaterial, [{ + key: "setAverageEnabled", + value: function setAverageEnabled(enabled) { + if (enabled) { + this.defines.AVERAGE = "1"; + } else { + delete this.defines.AVERAGE; + } + + this.needsUpdate = true; + } + }]); + + inherits(DotScreenMaterial, _ShaderMaterial); + + return DotScreenMaterial; + }(ShaderMaterial); + + var fragment$8 = "uniform sampler2D tDiffuse;\r\nuniform float time;\r\n\r\nvarying vec2 vUv;\r\n\r\n#ifdef NOISE\r\n\r\n\tuniform float noiseIntensity;\r\n\r\n#endif\r\n\r\n#ifdef SCANLINES\r\n\r\n\tuniform float scanlineIntensity;\r\n\tuniform float scanlineCount;\r\n\r\n#endif\r\n\r\n#ifdef GRID\r\n\r\n\tuniform float gridIntensity;\r\n\tuniform vec2 gridScale;\r\n\tuniform float gridLineWidth;\r\n\r\n#endif\r\n\r\n#ifdef GREYSCALE\r\n\r\n\t#include \r\n\r\n\tuniform float greyscaleIntensity;\r\n\r\n#elif defined(SEPIA)\r\n\r\n\tuniform float sepiaIntensity;\r\n\r\n#endif\r\n\r\n#ifdef VIGNETTE\r\n\r\n\tuniform float vignetteOffset;\r\n\tuniform float vignetteDarkness;\r\n\r\n#endif\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tvec3 color = texel.rgb;\r\n\r\n\t#ifdef SCREEN_MODE\r\n\r\n\t\tvec3 invColor;\r\n\r\n\t#endif\r\n\r\n\t#ifdef NOISE\r\n\r\n\t\tfloat x = vUv.x * vUv.y * time * 1000.0;\r\n\t\tx = mod(x, 13.0) * mod(x, 123.0);\r\n\t\tx = mod(x, 0.01);\r\n\r\n\t\tvec3 noise = texel.rgb * clamp(0.1 + x * 100.0, 0.0, 1.0) * noiseIntensity;\r\n\r\n\t\t#ifdef SCREEN_MODE\r\n\r\n\t\t\tinvColor = vec3(1.0) - color;\r\n\t\t\tvec3 invNoise = vec3(1.0) - noise;\r\n\r\n\t\t\tcolor = vec3(1.0) - invColor * invNoise;\r\n\r\n\t\t#else\r\n\r\n\t\t\tcolor += noise;\r\n\r\n\t\t#endif\r\n\r\n\t#endif\r\n\r\n\t#ifdef SCANLINES\r\n\r\n\t\tvec2 sl = vec2(sin(vUv.y * scanlineCount), cos(vUv.y * scanlineCount));\r\n\t\tvec3 scanlines = texel.rgb * vec3(sl.x, sl.y, sl.x) * scanlineIntensity;\r\n\r\n\t\t#ifdef SCREEN_MODE\r\n\r\n\t\t\tinvColor = vec3(1.0) - color;\r\n\t\t\tvec3 invScanlines = vec3(1.0) - scanlines;\r\n\r\n\t\t\tcolor = vec3(1.0) - invColor * invScanlines;\r\n\r\n\t\t#else\r\n\r\n\t\t\tcolor += scanlines;\r\n\r\n\t\t#endif\r\n\r\n\t#endif\r\n\r\n\t#ifdef GRID\r\n\r\n\t\tfloat grid = 0.5 - max(abs(mod(vUv.x * gridScale.x, 1.0) - 0.5), abs(mod(vUv.y * gridScale.y, 1.0) - 0.5));\r\n\t\tcolor *= (1.0 - gridIntensity) + vec3(smoothstep(0.0, gridLineWidth, grid)) * gridIntensity;\r\n\r\n\t#endif\r\n\r\n\t#ifdef GREYSCALE\r\n\r\n\t\tcolor = mix(color, vec3(linearToRelativeLuminance(color)), greyscaleIntensity);\r\n\r\n\t#elif defined(SEPIA)\r\n\r\n\t\tvec3 c = color.rgb;\r\n\r\n\t\tcolor.r = dot(c, vec3(1.0 - 0.607 * sepiaIntensity, 0.769 * sepiaIntensity, 0.189 * sepiaIntensity));\r\n\t\tcolor.g = dot(c, vec3(0.349 * sepiaIntensity, 1.0 - 0.314 * sepiaIntensity, 0.168 * sepiaIntensity));\r\n\t\tcolor.b = dot(c, vec3(0.272 * sepiaIntensity, 0.534 * sepiaIntensity, 1.0 - 0.869 * sepiaIntensity));\r\n\r\n\t#endif\r\n\r\n\t#ifdef VIGNETTE\r\n\r\n\t\tconst vec2 center = vec2(0.5);\r\n\r\n\t\t#ifdef ESKIL\r\n\r\n\t\t\tvec2 uv = (vUv - center) * vec2(vignetteOffset);\r\n\t\t\tcolor = mix(color.rgb, vec3(1.0 - vignetteDarkness), dot(uv, uv));\r\n\r\n\t\t#else\r\n\r\n\t\t\tfloat dist = distance(vUv, center);\r\n\t\t\tcolor *= smoothstep(0.8, vignetteOffset * 0.799, dist * (vignetteDarkness + vignetteOffset));\r\n\r\n\t\t#endif\t\t\r\n\r\n\t#endif\r\n\r\n\tgl_FragColor = vec4(clamp(color, 0.0, 1.0), texel.a);\r\n\r\n}\r\n"; + var vertex$8 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * A cinematic shader that provides the following effects: + * - Film Grain + * - Scanlines + * - Vignette + * - Greyscale + * - Sepia + * + * Original scanlines algorithm by Pat "Hawthorne" Shearon. + * http://www.truevision3d.com/forums/showcase/staticnoise_colorblackwhite_scanline_shaders-t18698.0.html + * + * Optimised scanlines and noise with intensity scaling by Georg "Leviathan" + * Steinrohder. This version was provided under a Creative Commons Attribution + * 3.0 License: http://creativecommons.org/licenses/by/3.0. + * + * The sepia effect is based on: + * https://github.com/evanw/glfx.js + * + * The vignette code is based on PaintEffect postprocess from ro.me: + * http://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js + */ + + var FilmMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new film material. + * + * @param {Object} [options] - The options. Disabled effects will not be included in the final shader and have no negative impact on performance. + * @param {Boolean} [options.greyscale=false] - Enable greyscale effect. Greyscale and sepia are mutually exclusive. + * @param {Boolean} [options.sepia=false] - Enable sepia effect. Greyscale and sepia are mutually exclusive. + * @param {Boolean} [options.vignette=false] - Apply vignette effect. + * @param {Boolean} [options.eskil=false] - Use Eskil's vignette approach. The default looks dusty while Eskil looks burned out. + * @param {Boolean} [options.screenMode=true] - Whether the screen blend mode should be used for noise and scanlines. Both of these effects are computed independently. + * @param {Boolean} [options.noise=true] - Show noise-based film grain. + * @param {Boolean} [options.scanlines=true] - Show scanlines. + * @param {Boolean} [options.grid=true] - Show a grid. + * @param {Number} [options.noiseIntensity=0.5] - The noise intensity. + * @param {Number} [options.scanlineIntensity=0.05] - The scanline intensity. + * @param {Number} [options.gridIntensity=1.0] - The grid strength. 0.0 to 1.0. + * @param {Number} [options.greyscaleIntensity=1.0] - The intensity of the greyscale effect. 0.0 to 1.0. + * @param {Number} [options.sepiaIntensity=1.0] - The intensity of the sepia effect. 0.0 to 1.0. + * @param {Number} [options.vignetteOffset=1.0] - The offset of the vignette effect. 0.0 to 1.0. + * @param {Number} [options.vignetteDarkness=1.0] - The darkness of the vignette effect. 0.0 to 1.0. + */ + function FilmMaterial() { + var _this; + + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, FilmMaterial); + + var settings = Object.assign({ + screenMode: true, + noise: true, + scanlines: true, + grid: false, + greyscale: false, + sepia: false, + vignette: false, + eskil: false, + noiseIntensity: 0.5, + scanlineIntensity: 0.05, + gridIntensity: 1.0, + greyscaleIntensity: 1.0, + sepiaIntensity: 1.0, + vignetteOffset: 1.0, + vignetteDarkness: 1.0 + }, options); + _this = possibleConstructorReturn(this, getPrototypeOf$2(FilmMaterial).call(this, { + type: "FilmMaterial", + uniforms: { + tDiffuse: new Uniform(null), + time: new Uniform(0.0), + noiseIntensity: new Uniform(settings.noiseIntensity), + scanlineIntensity: new Uniform(settings.scanlineIntensity), + gridIntensity: new Uniform(settings.gridIntensity), + scanlineCount: new Uniform(0.0), + gridScale: new Uniform(new Vector2()), + gridLineWidth: new Uniform(0.0), + greyscaleIntensity: new Uniform(settings.greyscaleIntensity), + sepiaIntensity: new Uniform(settings.sepiaIntensity), + vignetteOffset: new Uniform(settings.vignetteOffset), + vignetteDarkness: new Uniform(settings.vignetteDarkness) + }, + fragmentShader: fragment$8, + vertexShader: vertex$8, + depthWrite: false, + depthTest: false + })); + + _this.setScreenModeEnabled(settings.screenMode); + + _this.setNoiseEnabled(settings.noise); + + _this.setScanlinesEnabled(settings.scanlines); + + _this.setGridEnabled(settings.grid); + + _this.setGreyscaleEnabled(settings.greyscale); + + _this.setSepiaEnabled(settings.sepia); + + _this.setVignetteEnabled(settings.vignette); + + _this.setEskilEnabled(settings.eskil); + + return _this; + } + /** + * Enables or disables the Screen blend mode. + * + * @param {Boolean} enabled - Whether the Screen blend mode should be enabled. + */ + + + createClass(FilmMaterial, [{ + key: "setScreenModeEnabled", + value: function setScreenModeEnabled(enabled) { + if (enabled) { + this.defines.SCREEN_MODE = "1"; + } else { + delete this.defines.SCREEN_MODE; + } + + this.needsUpdate = true; + } + /** + * Enables or disables the noise effect. + * + * @param {Boolean} enabled - Whether the noise effect should be enabled. + */ + + }, { + key: "setNoiseEnabled", + value: function setNoiseEnabled(enabled) { + if (enabled) { + this.defines.NOISE = "1"; + } else { + delete this.defines.NOISE; + } + + this.needsUpdate = true; + } + /** + * Enables or disables the scanlines effect. + * + * @param {Boolean} enabled - Whether the scanlines effect should be enabled. + */ + + }, { + key: "setScanlinesEnabled", + value: function setScanlinesEnabled(enabled) { + if (enabled) { + this.defines.SCANLINES = "1"; + } else { + delete this.defines.SCANLINES; + } + + this.needsUpdate = true; + } + /** + * Enables or disables the grid effect. + * + * @param {Boolean} enabled - Whether the grid effect should be enabled. + */ + + }, { + key: "setGridEnabled", + value: function setGridEnabled(enabled) { + if (enabled) { + this.defines.GRID = "1"; + } else { + delete this.defines.GRID; + } + + this.needsUpdate = true; + } + /** + * Enables or disables the greyscale effect. + * + * @param {Boolean} enabled - Whether the greyscale effect should be enabled. + */ + + }, { + key: "setGreyscaleEnabled", + value: function setGreyscaleEnabled(enabled) { + if (enabled) { + this.defines.GREYSCALE = "1"; + } else { + delete this.defines.GREYSCALE; + } + + this.needsUpdate = true; + } + /** + * Enables or disables the sepia effect. + * + * @param {Boolean} enabled - Whether the sepia effect should be enabled. + */ + + }, { + key: "setSepiaEnabled", + value: function setSepiaEnabled(enabled) { + if (enabled) { + this.defines.SEPIA = "1"; + } else { + delete this.defines.SEPIA; + } + + this.needsUpdate = true; + } + /** + * Enables or disables the Vignette effect. + * + * @param {Boolean} enabled - Whether the Vignette effect should be enabled. + */ + + }, { + key: "setVignetteEnabled", + value: function setVignetteEnabled(enabled) { + if (enabled) { + this.defines.VIGNETTE = "1"; + } else { + delete this.defines.VIGNETTE; + } + + this.needsUpdate = true; + } + /** + * Enables or disables the Eskil Vignette effect. + * + * Has no effect if Vignette is disabled. + * + * @param {Boolean} enabled - Whether the Eskil Vignette effect should be enabled. + */ + + }, { + key: "setEskilEnabled", + value: function setEskilEnabled(enabled) { + if (enabled) { + this.defines.ESKIL = "1"; + } else { + delete this.defines.ESKIL; + } + + this.needsUpdate = true; + } + }]); + + inherits(FilmMaterial, _ShaderMaterial); + + return FilmMaterial; + }(ShaderMaterial); + + var fragment$9 = "uniform sampler2D tDiffuse;\r\nuniform sampler2D tPerturb;\r\n\r\nuniform bool active;\r\n\r\nuniform float amount;\r\nuniform float angle;\r\nuniform float seed;\r\nuniform float seedX;\r\nuniform float seedY;\r\nuniform float distortionX;\r\nuniform float distortionY;\r\nuniform float colS;\r\n\r\nvarying vec2 vUv;\r\n\r\nfloat rand(vec2 tc) {\r\n\r\n\tconst float a = 12.9898;\r\n\tconst float b = 78.233;\r\n\tconst float c = 43758.5453;\r\n\r\n\tfloat dt = dot(tc, vec2(a, b));\r\n\tfloat sn = mod(dt, 3.14);\r\n\r\n\treturn fract(sin(sn) * c);\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\tvec2 coord = vUv;\r\n\r\n\tfloat xs, ys;\r\n\tvec4 normal;\r\n\r\n\tvec2 offset;\r\n\tvec4 cr, cga, cb;\r\n\tvec4 snow, color;\r\n\r\n\tfloat sx, sy;\r\n\r\n\tif(active) {\r\n\r\n\t\txs = floor(gl_FragCoord.x / 0.5);\r\n\t\tys = floor(gl_FragCoord.y / 0.5);\r\n\r\n\t\tnormal = texture2D(tPerturb, coord * seed * seed);\r\n\r\n\t\tif(coord.y < distortionX + colS && coord.y > distortionX - colS * seed) {\r\n\r\n\t\t\tsx = clamp(ceil(seedX), 0.0, 1.0);\r\n\t\t\tcoord.y = sx * (1.0 - (coord.y + distortionY)) + (1.0 - sx) * distortionY;\r\n\r\n\t\t}\r\n\r\n\t\tif(coord.x < distortionY + colS && coord.x > distortionY - colS * seed) {\r\n\r\n\t\t\tsy = clamp(ceil(seedY), 0.0, 1.0);\r\n\t\t\tcoord.x = sy * distortionX + (1.0 - sy) * (1.0 - (coord.x + distortionX));\r\n\r\n\t\t}\r\n\r\n\t\tcoord.x += normal.x * seedX * (seed / 5.0);\r\n\t\tcoord.y += normal.y * seedY * (seed / 5.0);\r\n\r\n\t\toffset = amount * vec2(cos(angle), sin(angle));\r\n\r\n\t\tcr = texture2D(tDiffuse, coord + offset);\r\n\t\tcga = texture2D(tDiffuse, coord);\r\n\t\tcb = texture2D(tDiffuse, coord - offset);\r\n\r\n\t\tcolor = vec4(cr.r, cga.g, cb.b, cga.a);\r\n\t\tsnow = 200.0 * amount * vec4(rand(vec2(xs * seed, ys * seed * 50.0)) * 0.2);\r\n\t\tcolor += snow;\r\n\r\n\t} else {\r\n\r\n\t\tcolor = texture2D(tDiffuse, vUv);\r\n\r\n\t}\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n"; + var vertex$9 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * A glitch shader material. + * + * Reference: + * https://github.com/staffantan/unityglitch + */ + + var GlitchMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new glitch material. + */ + function GlitchMaterial() { + classCallCheck(this, GlitchMaterial); + + return possibleConstructorReturn(this, getPrototypeOf$2(GlitchMaterial).call(this, { + type: "GlitchMaterial", + uniforms: { + tDiffuse: new Uniform(null), + tPerturb: new Uniform(null), + active: new Uniform(1), + amount: new Uniform(0.8), + angle: new Uniform(0.02), + seed: new Uniform(0.02), + seedX: new Uniform(0.02), + seedY: new Uniform(0.02), + distortionX: new Uniform(0.5), + distortionY: new Uniform(0.6), + colS: new Uniform(0.05) + }, + fragmentShader: fragment$9, + vertexShader: vertex$9, + depthWrite: false, + depthTest: false + })); + } + + inherits(GlitchMaterial, _ShaderMaterial); + + return GlitchMaterial; + }(ShaderMaterial); + + var fragment$10 = "#include \r\n#include \r\n\r\nuniform sampler2D tDiffuse;\r\nuniform vec3 lightPosition;\r\n\r\nuniform float exposure;\r\nuniform float decay;\r\nuniform float density;\r\nuniform float weight;\r\nuniform float clampMax;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec2 texCoord = vUv;\r\n\r\n\t// Calculate vector from pixel to light source in screen space.\r\n\tvec2 deltaTexCoord = texCoord - lightPosition.st;\r\n\tdeltaTexCoord *= 1.0 / NUM_SAMPLES_FLOAT * density;\r\n\r\n\t// A decreasing illumination factor.\r\n\tfloat illuminationDecay = 1.0;\r\n\r\n\tvec4 sample;\r\n\tvec4 color = vec4(0.0);\r\n\r\n\t// Estimate the probability of occlusion at each pixel by summing samples along a ray to the light source.\r\n\tfor(int i = 0; i < NUM_SAMPLES_INT; ++i) {\r\n\r\n\t\ttexCoord -= deltaTexCoord;\r\n\t\tsample = texture2D(tDiffuse, texCoord);\r\n\r\n\t\t// Apply sample attenuation scale/decay factors.\r\n\t\tsample *= illuminationDecay * weight;\r\n\r\n\t\tcolor += sample;\r\n\r\n\t\t// Update exponential decay factor.\r\n\t\tilluminationDecay *= decay;\r\n\r\n\t}\r\n\r\n\tgl_FragColor = clamp(color * exposure, 0.0, clampMax);\r\n\r\n\t#include \r\n\r\n}\r\n"; + var vertex$10 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * A crepuscular rays shader material. + * + * This material supports dithering. + * + * References: + * + * Thibaut Despoulain, 2012: + * [(WebGL) Volumetric Light Approximation in Three.js]( + * http://bkcore.com/blog/3d/webgl-three-js-volumetric-light-godrays.html) + * + * Nvidia, GPU Gems 3, 2008: + * [Chapter 13. Volumetric Light Scattering as a Post-Process]( + * https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch13.html) + */ + + var GodRaysMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new god rays material. + * + * @param {Object} [options] - The options. + * @param {Number} [options.density=0.96] - The density of the light rays. + * @param {Number} [options.decay=0.93] - An illumination decay factor. + * @param {Number} [options.weight=0.4] - A light ray weight factor. + * @param {Number} [options.exposure=0.6] - A constant attenuation coefficient. + * @param {Number} [options.clampMax=1.0] - An upper bound for the saturation of the overall effect. + */ + function GodRaysMaterial() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, GodRaysMaterial); + + var settings = Object.assign({ + exposure: 0.6, + density: 0.93, + decay: 0.96, + weight: 0.4, + clampMax: 1.0 + }, options); + return possibleConstructorReturn(this, getPrototypeOf$2(GodRaysMaterial).call(this, { + type: "GodRaysMaterial", + defines: { + NUM_SAMPLES_FLOAT: "60.0", + NUM_SAMPLES_INT: "60" + }, + uniforms: { + tDiffuse: new Uniform(null), + lightPosition: new Uniform(null), + exposure: new Uniform(settings.exposure), + decay: new Uniform(settings.decay), + density: new Uniform(settings.density), + weight: new Uniform(settings.weight), + clampMax: new Uniform(settings.clampMax) + }, + fragmentShader: fragment$10, + vertexShader: vertex$10, + depthWrite: false, + depthTest: false + })); + } + + inherits(GodRaysMaterial, _ShaderMaterial); + + return GodRaysMaterial; + }(ShaderMaterial); + + var fragment$11 = "#include \r\n\r\nuniform sampler2D tDiffuse;\r\nuniform float distinction;\r\nuniform vec2 range;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tfloat l = linearToRelativeLuminance(texel.rgb);\r\n\r\n\t#ifdef RANGE\r\n\r\n\t\tfloat low = step(range.x, l);\r\n\t\tfloat high = step(l, range.y);\r\n\r\n\t\t// Apply the mask.\r\n\t\tl *= low * high;\r\n\r\n\t#endif\r\n\r\n\tl = pow(abs(l), distinction);\r\n\r\n\t#ifdef COLOR\r\n\r\n\t\tgl_FragColor = vec4(texel.rgb * l, texel.a);\r\n\r\n\t#else\r\n\r\n\t\tgl_FragColor = vec4(l, l, l, texel.a);\r\n\r\n\t#endif\r\n\r\n}\r\n"; + var vertex$11 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * A luminosity shader material. + * + * This shader produces a greyscale luminance map that describes the absolute + * amount of light emitted by a scene. It can also be configured to output + * colours that are scaled with their respective luminance value. Additionally, + * a range may be provided to mask out undesired texels. + * + * The alpha channel will remain unaffected in all cases. + * + * On luminance coefficients: + * http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC9 + * + * Coefficients for different colour spaces: + * https://hsto.org/getpro/habr/post_images/2ab/69d/084/2ab69d084f9a597e032624bcd74d57a7.png + * + * Luminance range reference: + * https://cycling74.com/2007/05/23/your-first-shader/#.Vty9FfkrL4Z + */ + + var LuminosityMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new luminosity material. + * + * @param {Boolean} [colorOutput=false] - Defines whether the shader should output colours scaled with their luminance value. + * @param {Vector2} [luminanceRange] - If provided, the shader will mask out texels that aren't in the specified luminance range. + */ + function LuminosityMaterial() { + var _this; + + var colorOutput = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var luminanceRange = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + + classCallCheck(this, LuminosityMaterial); + + var maskLuminance = luminanceRange !== null; + _this = possibleConstructorReturn(this, getPrototypeOf$2(LuminosityMaterial).call(this, { + type: "LuminosityMaterial", + uniforms: { + tDiffuse: new Uniform(null), + distinction: new Uniform(1.0), + range: new Uniform(maskLuminance ? luminanceRange : new Vector2()) + }, + fragmentShader: fragment$11, + vertexShader: vertex$11 + })); + + _this.setColorOutputEnabled(colorOutput); + + _this.setLuminanceRangeEnabled(maskLuminance); + + return _this; + } + /** + * Enables or disables color output. + * + * @param {Boolean} enabled - Whether color output should be enabled. + */ + + + createClass(LuminosityMaterial, [{ + key: "setColorOutputEnabled", + value: function setColorOutputEnabled(enabled) { + if (enabled) { + this.defines.COLOR = "1"; + } else { + delete this.defines.COLOR; + } + + this.needsUpdate = true; + } + /** + * Enables or disables the luminance mask. + * + * @param {Boolean} enabled - Whether the luminance mask should be enabled. + */ + + }, { + key: "setLuminanceRangeEnabled", + value: function setLuminanceRangeEnabled(enabled) { + if (enabled) { + this.defines.RANGE = "1"; + } else { + delete this.defines.RANGE; + } + + this.needsUpdate = true; + } + }]); + + inherits(LuminosityMaterial, _ShaderMaterial); + + return LuminosityMaterial; + }(ShaderMaterial); + + var fragment$12 = "uniform sampler2D tDiffuse;\r\nuniform sampler2D tMask;\r\nuniform sampler2D tEdges;\r\n\r\nuniform vec3 visibleEdgeColor;\r\nuniform vec3 hiddenEdgeColor;\r\nuniform float pulse;\r\nuniform float edgeStrength;\r\n\r\n#ifdef USE_PATTERN\r\n\r\n\tuniform sampler2D tPattern;\r\n\tvarying vec2 vPatternCoord;\r\n\r\n#endif\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 color = texture2D(tDiffuse, vUv);\r\n\tvec2 edge = texture2D(tEdges, vUv).rg;\r\n\tvec2 mask = texture2D(tMask, vUv).rg;\r\n\r\n\t#ifndef X_RAY\r\n\r\n\t\tedge.y = 0.0;\r\n\r\n\t#endif\r\n\r\n\tedge *= (edgeStrength * mask.x * pulse);\r\n\tvec3 outlineColor = edge.x * visibleEdgeColor + edge.y * hiddenEdgeColor;\r\n\r\n\t#ifdef ALPHA_BLENDING\r\n\r\n\t\tcolor.rgb = mix(color.rgb, outlineColor, max(edge.x, edge.y));\r\n\r\n\t#else\r\n\r\n\t\tcolor.rgb += outlineColor;\r\n\r\n\t#endif\r\n\r\n\t#ifdef USE_PATTERN\r\n\r\n\t\tvec3 patternColor = texture2D(tPattern, vPatternCoord).rgb;\r\n\r\n\t\t#ifdef X_RAY\r\n\r\n\t\t\tfloat hiddenFactor = 0.5;\r\n\r\n\t\t#else\r\n\r\n\t\t\tfloat hiddenFactor = 0.0;\r\n\r\n\t\t#endif\r\n\r\n\t\tfloat visibilityFactor = (1.0 - mask.y > 0.0) ? 1.0 : hiddenFactor;\r\n\r\n\t\tcolor.rgb += visibilityFactor * (1.0 - mask.x) * (1.0 - patternColor);\r\n\r\n\t#endif\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n"; + var vertex$12 = "#ifdef USE_PATTERN\r\n\r\n\tuniform float aspect;\r\n\tuniform float patternScale;\r\n\tvarying vec2 vPatternCoord;\r\n\r\n#endif\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\t#ifdef USE_PATTERN\r\n\r\n\t\tvec2 aspectCorrection = vec2(aspect, 1.0);\r\n\t\tvPatternCoord = uv * aspectCorrection * patternScale;\r\n\r\n\t#endif\r\n\r\n\tvUv = uv;\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * An outline blend shader material. + */ + + var OutlineBlendMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new outline blend material. + * + * @param {Object} [options] - The options. + * @param {Number} [options.edgeStrength=1.0] - The edge strength. + * @param {Number} [options.patternScale=1.0] - The scale of the pattern texture. + * @param {Number} [options.visibleEdgeColor=0xffffff] - The color of visible edges. + * @param {Number} [options.hiddenEdgeColor=0x22090A] - The color of hidden edges. + * @param {Boolean} [alphaBlending=false] - Whether the outline should be blended using alpha. + * @param {Boolean} [xRay=true] - Whether hidden parts of selected objects should be visible. + */ + function OutlineBlendMaterial() { + var _this; + + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, OutlineBlendMaterial); + + var settings = Object.assign({ + edgeStrength: 1.0, + patternScale: 1.0, + visibleEdgeColor: 0xffffff, + hiddenEdgeColor: 0x22090A, + alphaBlending: false, + xRay: true + }, options); + _this = possibleConstructorReturn(this, getPrototypeOf$2(OutlineBlendMaterial).call(this, { + type: "OutlineBlendMaterial", + uniforms: { + pulse: new Uniform(1.0), + aspect: new Uniform(1.0), + tDiffuse: new Uniform(null), + tMask: new Uniform(null), + tEdges: new Uniform(null), + tPattern: new Uniform(null), + edgeStrength: new Uniform(settings.edgeStrength), + patternScale: new Uniform(settings.patternScale), + visibleEdgeColor: new Uniform(new Color(settings.visibleEdgeColor)), + hiddenEdgeColor: new Uniform(new Color(settings.hiddenEdgeColor)) + }, + fragmentShader: fragment$12, + vertexShader: vertex$12, + depthWrite: false, + depthTest: false + })); + + _this.setAlphaBlendingEnabled(settings.alphaBlending); + + _this.setXRayEnabled(settings.xRay); + + return _this; + } + /** + * Enables or disables the alpha blending. + * + * @param {Boolean} enabled - Whether the alpha blending should be enabled. + */ + + + createClass(OutlineBlendMaterial, [{ + key: "setAlphaBlendingEnabled", + value: function setAlphaBlendingEnabled(enabled) { + if (enabled) { + this.defines.ALPHA_BLENDING = "1"; + } else { + delete this.defines.ALPHA_BLENDING; + } + + this.needsUpdate = true; + } + /** + * Defines whether hidden parts of selected objects should be visible. + * + * @param {Boolean} enabled - Whether hidden parts of selected objects should be visible. + */ + + }, { + key: "setXRayEnabled", + value: function setXRayEnabled(enabled) { + if (enabled) { + this.defines.X_RAY = "1"; + } else { + delete this.defines.X_RAY; + } + + this.needsUpdate = true; + } + /** + * Sets a pattern texture to use as overlay. + * + * @param {Texture} [texture=null] - A pattern texture. Set to null to disable the pattern. + */ + + }, { + key: "setPatternTexture", + value: function setPatternTexture() { + var texture = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + + if (texture !== null) { + this.defines.USE_PATTERN = "1"; + } else { + delete this.defines.USE_PATTERN; + } + + this.uniforms.tPattern.value = texture; + this.needsUpdate = true; + } + }]); + + inherits(OutlineBlendMaterial, _ShaderMaterial); + + return OutlineBlendMaterial; + }(ShaderMaterial); + + var fragment$13 = "uniform sampler2D tMask;\r\n\r\nvarying vec2 vUv0;\r\nvarying vec2 vUv1;\r\nvarying vec2 vUv2;\r\nvarying vec2 vUv3;\r\n\r\nvoid main() {\r\n\r\n\tvec2 c0 = texture2D(tMask, vUv0).rg;\r\n\tvec2 c1 = texture2D(tMask, vUv1).rg;\r\n\tvec2 c2 = texture2D(tMask, vUv2).rg;\r\n\tvec2 c3 = texture2D(tMask, vUv3).rg;\r\n\r\n\tfloat d0 = (c0.x - c1.x) * 0.5;\r\n\tfloat d1 = (c2.x - c3.x) * 0.5;\r\n\tfloat d = length(vec2(d0, d1));\r\n\r\n\tfloat a0 = min(c0.y, c1.y);\r\n\tfloat a1 = min(c2.y, c3.y);\r\n\tfloat visibilityFactor = min(a0, a1);\r\n\r\n\tgl_FragColor.rg = (1.0 - visibilityFactor > 0.001) ? vec2(d, 0.0) : vec2(0.0, d);\r\n\r\n}\r\n"; + var vertex$13 = "uniform vec2 texelSize;\r\n\r\nvarying vec2 vUv0;\r\nvarying vec2 vUv1;\r\nvarying vec2 vUv2;\r\nvarying vec2 vUv3;\r\n\r\nvoid main() {\r\n\r\n\tvUv0 = vec2(uv.x + texelSize.x, uv.y);\r\n\tvUv1 = vec2(uv.x - texelSize.x, uv.y);\r\n\tvUv2 = vec2(uv.x, uv.y + texelSize.y);\r\n\tvUv3 = vec2(uv.x, uv.y - texelSize.y);\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * An outline edge detection shader material. + */ + + var OutlineEdgesMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new outline edge detection material. + * + * @param {Vector2} [texelSize] - The absolute screen texel size. + */ + function OutlineEdgesMaterial() { + var _this; + + var texelSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Vector2(); + + classCallCheck(this, OutlineEdgesMaterial); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(OutlineEdgesMaterial).call(this, { + type: "OutlineEdgesMaterial", + uniforms: { + tMask: new Uniform(null), + texelSize: new Uniform(new Vector2()) + }, + fragmentShader: fragment$13, + vertexShader: vertex$13, + depthWrite: false, + depthTest: false + })); + + _this.setTexelSize(texelSize.x, texelSize.y); + + return _this; + } + /** + * Sets the texel size. + * + * @param {Number} x - The texel width. + * @param {Number} y - The texel height. + */ + + + createClass(OutlineEdgesMaterial, [{ + key: "setTexelSize", + value: function setTexelSize(x, y) { + this.uniforms.texelSize.value.set(x, y); + } + }]); + + inherits(OutlineEdgesMaterial, _ShaderMaterial); + + return OutlineEdgesMaterial; + }(ShaderMaterial); + + var fragment$14 = "uniform sampler2D tDiffuse;\r\nuniform float granularity;\r\nuniform float dx;\r\nuniform float dy;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel;\r\n\r\n\tif(granularity > 0.0) {\r\n\r\n\t\tvec2 coord = vec2(\r\n\t\t\tdx * (floor(vUv.x / dx) + 0.5),\r\n\t\t\tdy * (floor(vUv.y / dy) + 0.5)\r\n\t\t);\r\n\r\n\t\ttexel = texture2D(tDiffuse, coord);\r\n\r\n\t} else {\r\n\r\n\t\ttexel = texture2D(tDiffuse, vUv);\r\n\r\n\t}\r\n\r\n\tgl_FragColor = texel;\r\n\r\n}\r\n"; + var vertex$14 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * A pixelation shader material. + * + * Original shader code by Robert Casanova: + * https://github.com/robertcasanova/pixelate-shader + */ + + var PixelationMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new pixelation material. + */ + function PixelationMaterial() { + classCallCheck(this, PixelationMaterial); + + return possibleConstructorReturn(this, getPrototypeOf$2(PixelationMaterial).call(this, { + type: "PixelationMaterial", + uniforms: { + tDiffuse: new Uniform(null), + granularity: new Uniform(1.0), + resolution: new Uniform(new Vector2(1.0, 1.0)), + dx: new Uniform(1.0), + dy: new Uniform(1.0) + }, + fragmentShader: fragment$14, + vertexShader: vertex$14, + depthWrite: false, + depthTest: false + })); + } + /** + * The pixel granularity. + * + * @type {Number} + */ + + + createClass(PixelationMaterial, [{ + key: "setResolution", + + /** + * Sets the resolution. + * + * @param {Number} width - The width. + * @param {Number} height - The height. + */ + value: function setResolution(width, height) { + this.uniforms.resolution.value.set(width, height); + this.granularity = this.granularity; + } + }, { + key: "granularity", + get: function get() { + return this.uniforms.granularity.value; + } + /** + * A higher value yields coarser visuals. + * + * @type {Number} + */ + , + set: function set(x) { + var uniforms = this.uniforms; + var resolution = uniforms.resolution.value; + uniforms.granularity.value = x; + uniforms.dx.value = x / resolution.x; + uniforms.dy.value = x / resolution.y; + } + }]); + + inherits(PixelationMaterial, _ShaderMaterial); + + return PixelationMaterial; + }(ShaderMaterial); + + var fragment$15 = "#include \r\n\r\nuniform sampler2D tDiffuse;\r\nuniform sampler2D tDepth;\r\n\r\nuniform vec2 texelSize;\r\nuniform vec2 halfTexelSize;\r\n\r\nuniform float cameraNear;\r\nuniform float cameraFar;\r\n\r\nuniform float focalLength;\r\nuniform float focalStop;\r\n\r\nuniform float maxBlur;\r\nuniform float luminanceThreshold;\r\nuniform float luminanceGain;\r\nuniform float bias;\r\nuniform float fringe;\r\nuniform float ditherStrength;\r\n\r\n#ifdef SHADER_FOCUS\r\n\r\n\tuniform vec2 focusCoords;\r\n\r\n#else\r\n\r\n\tuniform float focalDepth;\r\n\r\n#endif\r\n\r\nvarying vec2 vUv;\r\n\r\n#ifndef USE_LOGDEPTHBUF\r\n\r\n\t#include \r\n\r\n\tfloat readDepth(sampler2D depthSampler, vec2 coord) {\r\n\r\n\t\tfloat fragCoordZ = texture2D(depthSampler, coord).x;\r\n\t\tfloat viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\r\n\r\n\t\treturn viewZToOrthographicDepth(viewZ, cameraNear, cameraFar);\r\n\r\n\t}\r\n\r\n#endif\r\n\r\n#ifdef PENTAGON\r\n\r\n\tfloat penta(vec2 coords) {\r\n\r\n\t\tconst vec4 HS0 = vec4( 1.0, 0.0, 0.0, 1.0);\r\n\t\tconst vec4 HS1 = vec4( 0.309016994, 0.951056516, 0.0, 1.0);\r\n\t\tconst vec4 HS2 = vec4(-0.809016994, 0.587785252, 0.0, 1.0);\r\n\t\tconst vec4 HS3 = vec4(-0.809016994, -0.587785252, 0.0, 1.0);\r\n\t\tconst vec4 HS4 = vec4( 0.309016994, -0.951056516, 0.0, 1.0);\r\n\t\tconst vec4 HS5 = vec4( 0.0, 0.0, 1.0, 1.0);\r\n\r\n\t\tconst vec4 ONE = vec4(1.0);\r\n\r\n\t\tconst float P_FEATHER = 0.4;\r\n\t\tconst float N_FEATHER = -P_FEATHER;\r\n\r\n\t\tfloat inOrOut = -4.0;\r\n\r\n\t\tvec4 P = vec4(coords, vec2(RINGS_FLOAT - 1.3));\r\n\r\n\t\tvec4 dist = vec4(\r\n\t\t\tdot(P, HS0),\r\n\t\t\tdot(P, HS1),\r\n\t\t\tdot(P, HS2),\r\n\t\t\tdot(P, HS3)\r\n\t\t);\r\n\r\n\t\tdist = smoothstep(N_FEATHER, P_FEATHER, dist);\r\n\r\n\t\tinOrOut += dot(dist, ONE);\r\n\r\n\t\tdist.x = dot(P, HS4);\r\n\t\tdist.y = HS5.w - abs(P.z);\r\n\r\n\t\tdist = smoothstep(N_FEATHER, P_FEATHER, dist);\r\n\t\tinOrOut += dist.x;\r\n\r\n\t\treturn clamp(inOrOut, 0.0, 1.0);\r\n\r\n\t}\r\n\r\n#endif\r\n\r\n#ifdef SHOW_FOCUS\r\n\r\n\tvec3 debugFocus(vec3 c, float blur, float depth) {\r\n\r\n\t\tfloat edge = 0.002 * depth;\r\n\t\tfloat m = clamp(smoothstep(0.0, edge, blur), 0.0, 1.0);\r\n\t\tfloat e = clamp(smoothstep(1.0 - edge, 1.0, blur), 0.0, 1.0);\r\n\r\n\t\tc = mix(c, vec3(1.0, 0.5, 0.0), (1.0 - m) * 0.6);\r\n\t\tc = mix(c, vec3(0.0, 0.5, 1.0), ((1.0 - e) - (1.0 - m)) * 0.2);\r\n\r\n\t\treturn c;\r\n\r\n\t}\r\n\r\n#endif\r\n\r\n#ifdef VIGNETTE\r\n\r\n\tfloat vignette() {\r\n\r\n\t\tconst vec2 CENTER = vec2(0.5);\r\n\r\n\t\tconst float VIGNETTE_OUT = 1.3;\r\n\t\tconst float VIGNETTE_IN = 0.0;\r\n\t\tconst float VIGNETTE_FADE = 22.0; \r\n\r\n\t\tfloat d = distance(vUv, CENTER);\r\n\t\td = smoothstep(VIGNETTE_OUT + (focalStop / VIGNETTE_FADE), VIGNETTE_IN + (focalStop / VIGNETTE_FADE), d);\r\n\r\n\t\treturn clamp(d, 0.0, 1.0);\r\n\r\n\t}\r\n\r\n#endif\r\n\r\nvec2 rand2(vec2 coord) {\r\n\r\n\tvec2 noise;\r\n\r\n\t#ifdef NOISE\r\n\r\n\t\tconst float a = 12.9898;\r\n\t\tconst float b = 78.233;\r\n\t\tconst float c = 43758.5453;\r\n\r\n\t\tnoise.x = clamp(fract(sin(mod(dot(coord, vec2(a, b)), 3.14)) * c), 0.0, 1.0) * 2.0 - 1.0;\r\n\t\tnoise.y = clamp(fract(sin(mod(dot(coord, vec2(a, b) * 2.0), 3.14)) * c), 0.0, 1.0) * 2.0 - 1.0;\r\n\r\n\t#else\r\n\r\n\t\tnoise.x = ((fract(1.0 - coord.s * halfTexelSize.x) * 0.25) + (fract(coord.t * halfTexelSize.y) * 0.75)) * 2.0 - 1.0;\r\n\t\tnoise.y = ((fract(1.0 - coord.s * halfTexelSize.x) * 0.75) + (fract(coord.t * halfTexelSize.y) * 0.25)) * 2.0 - 1.0;\r\n\r\n\t#endif\r\n\r\n\treturn noise;\r\n\r\n}\r\n\r\nvec3 processTexel(vec2 coords, float blur) {\r\n\r\n\tvec3 c;\r\n\tc.r = texture2D(tDiffuse, coords + vec2(0.0, 1.0) * texelSize * fringe * blur).r;\r\n\tc.g = texture2D(tDiffuse, coords + vec2(-0.866, -0.5) * texelSize * fringe * blur).g;\r\n\tc.b = texture2D(tDiffuse, coords + vec2(0.866, -0.5) * texelSize * fringe * blur).b;\r\n\r\n\t// Calculate the luminance of the constructed colour.\r\n\tfloat luminance = linearToRelativeLuminance(c);\r\n\tfloat threshold = max((luminance - luminanceThreshold) * luminanceGain, 0.0);\r\n\r\n\treturn c + mix(vec3(0.0), c, threshold * blur);\r\n\r\n}\r\n\r\nfloat linearize(float depth) {\r\n\r\n\treturn -cameraFar * cameraNear / (depth * (cameraFar - cameraNear) - cameraFar);\r\n\r\n}\r\n\r\nfloat gather(float i, float j, float ringSamples, inout vec3 color, float w, float h, float blur) {\r\n\r\n\tconst float TWO_PI = 6.28318531;\r\n\r\n\tfloat step = TWO_PI / ringSamples;\r\n\tfloat pw = cos(j * step) * i;\r\n\tfloat ph = sin(j * step) * i;\r\n\r\n\t#ifdef PENTAGON\r\n\r\n\t\tfloat p = penta(vec2(pw, ph));\r\n\r\n\t#else\r\n\r\n\t\tfloat p = 1.0;\r\n\r\n\t#endif\r\n\r\n\tcolor += processTexel(vUv + vec2(pw * w, ph * h), blur) * mix(1.0, i / RINGS_FLOAT, bias) * p;\r\n\r\n\treturn mix(1.0, i / RINGS_FLOAT, bias) * p;\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\t#ifdef USE_LOGDEPTHBUF\r\n\r\n\t\tfloat depth = linearize(texture2D(tDepth, vUv).x);\r\n\r\n\t#else\r\n\r\n\t\tfloat depth = linearize(readDepth(tDepth, vUv));\r\n\r\n\t#endif\r\n\r\n\t#ifdef SHADER_FOCUS\r\n\r\n\t\t#ifdef USE_LOGDEPTHBUF\r\n\r\n\t\t\tfloat fDepth = linearize(texture2D(tDepth, focusCoords).x);\r\n\r\n\t\t#else\r\n\r\n\t\t\tfloat fDepth = linearize(readDepth(tDepth, focusCoords));\r\n\r\n\t\t#endif\r\n\r\n\t#else\r\n\r\n\t\tfloat fDepth = focalDepth;\r\n\r\n\t#endif\r\n\r\n\t#ifdef MANUAL_DOF\r\n\r\n\t\tconst float nDoFStart = 1.0; \r\n\t\tconst float nDoFDist = 2.0;\r\n\t\tconst float fDoFStart = 1.0;\r\n\t\tconst float fDoFDist = 3.0;\r\n\r\n\t\tfloat focalPlane = depth - fDepth;\r\n\t\tfloat farDoF = (focalPlane - fDoFStart) / fDoFDist;\r\n\t\tfloat nearDoF = (-focalPlane - nDoFStart) / nDoFDist;\r\n\r\n\t\tfloat blur = (focalPlane > 0.0) ? farDoF : nearDoF;\r\n\r\n\t#else\r\n\r\n\t\tconst float CIRCLE_OF_CONFUSION = 0.03; // 35mm film = 0.03mm CoC.\r\n\r\n\t\tfloat focalPlaneMM = fDepth * 1000.0;\r\n\t\tfloat depthMM = depth * 1000.0;\r\n\r\n\t\tfloat focalPlane = (depthMM * focalLength) / (depthMM - focalLength);\r\n\t\tfloat farDoF = (focalPlaneMM * focalLength) / (focalPlaneMM - focalLength);\r\n\t\tfloat nearDoF = (focalPlaneMM - focalLength) / (focalPlaneMM * focalStop * CIRCLE_OF_CONFUSION);\r\n\r\n\t\tfloat blur = abs(focalPlane - farDoF) * nearDoF;\r\n\r\n\t#endif\r\n\r\n\tblur = clamp(blur, 0.0, 1.0);\r\n\r\n\t// Dithering.\r\n\tvec2 noise = rand2(vUv) * ditherStrength * blur;\r\n\r\n\tfloat blurFactorX = texelSize.x * blur * maxBlur + noise.x;\r\n\tfloat blurFactorY = texelSize.y * blur * maxBlur + noise.y;\r\n\r\n\tconst int MAX_RING_SAMPLES = RINGS_INT * SAMPLES_INT;\r\n\r\n\t// Calculation of final color.\r\n\tvec4 color;\r\n\r\n\tif(blur < 0.05) {\r\n\r\n\t\tcolor = texture2D(tDiffuse, vUv);\r\n\r\n\t} else {\r\n\r\n\t\tcolor = texture2D(tDiffuse, vUv);\r\n\r\n\t\tfloat s = 1.0;\r\n\t\tint ringSamples;\r\n\r\n\t\tfor(int i = 1; i <= RINGS_INT; ++i) {\r\n\r\n\t\t\tringSamples = i * SAMPLES_INT;\r\n\r\n\t\t\t// Constant loop.\r\n\t\t\tfor(int j = 0; j < MAX_RING_SAMPLES; ++j) {\r\n\r\n\t\t\t\t// Break earlier.\r\n\t\t\t\tif(j >= ringSamples) { break; }\r\n\r\n\t\t\t\ts += gather(float(i), float(j), float(ringSamples), color.rgb, blurFactorX, blurFactorY, blur);\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tcolor.rgb /= s; // Divide by sample count.\r\n\r\n\t}\r\n\r\n\t#ifdef SHOW_FOCUS\r\n\r\n\t\tcolor.rgb = debugFocus(color.rgb, blur, depth);\r\n\r\n\t#endif\r\n\r\n\t#ifdef VIGNETTE\r\n\r\n\t\tcolor.rgb *= vignette();\r\n\r\n\t#endif\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n"; + var vertex$15 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * Depth of Field shader v2.4. + * + * Original shader code by Martins Upitis: + * http://blenderartists.org/forum/showthread.php?237488-GLSL-depth-of-field-with-bokeh-v2-4-(update) + */ + + var RealisticBokehMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new bokeh2 material. + * + * @param {PerspectiveCamera} [camera] - The main camera. + * @param {Object} [options] - Additional options. + * @param {Vector2} [options.texelSize] - The absolute screen texel size. + * @param {Boolean} [options.rings=3] - The number of blurring iterations. + * @param {Boolean} [options.samples=2] - The amount of samples taken per ring. + * @param {Boolean} [options.showFocus=false] - Whether the focus point should be highlighted. + * @param {Boolean} [options.manualDoF=false] - Enables manual depth of field blur. + * @param {Boolean} [options.vignette=false] - Enables a vignette effect. + * @param {Boolean} [options.pentagon=false] - Enable to use a pentagonal shape to scale gathered texels. + * @param {Boolean} [options.shaderFocus=true] - Disable if you compute your own focalDepth (in metres!). + * @param {Boolean} [options.noise=true] - Disable if you don't want noise patterns for dithering. + * @param {Number} [options.maxBlur=1.0] - The maximum blur strength. + * @param {Number} [options.luminanceThreshold=0.5] - A luminance threshold. + * @param {Number} [options.luminanceGain=2.0] - A luminance gain factor. + * @param {Number} [options.bias=0.5] - A blur bias. + * @param {Number} [options.fringe=0.7] - A blur offset. + * @param {Number} [options.ditherStrength=0.0001] - The dither strength. + */ + function RealisticBokehMaterial() { + var _this; + + var camera = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + classCallCheck(this, RealisticBokehMaterial); + + var settings = Object.assign({ + texelSize: null, + rings: 3, + samples: 2, + showFocus: false, + manualDoF: false, + vignette: false, + pentagon: false, + shaderFocus: true, + noise: true, + maxBlur: 1.0, + luminanceThreshold: 0.5, + luminanceGain: 2.0, + bias: 0.5, + fringe: 0.7, + ditherStrength: 0.0001 + }, options); + _this = possibleConstructorReturn(this, getPrototypeOf$2(RealisticBokehMaterial).call(this, { + type: "RealisticBokehMaterial", + defines: { + RINGS_INT: settings.rings.toFixed(0), + RINGS_FLOAT: settings.rings.toFixed(1), + SAMPLES_INT: settings.samples.toFixed(0), + SAMPLES_FLOAT: settings.samples.toFixed(1) + }, + uniforms: { + tDiffuse: new Uniform(null), + tDepth: new Uniform(null), + texelSize: new Uniform(new Vector2()), + halfTexelSize: new Uniform(new Vector2()), + cameraNear: new Uniform(0.1), + cameraFar: new Uniform(2000), + focalLength: new Uniform(24.0), + focalStop: new Uniform(0.9), + maxBlur: new Uniform(settings.maxBlur), + luminanceThreshold: new Uniform(settings.luminanceThreshold), + luminanceGain: new Uniform(settings.luminanceGain), + bias: new Uniform(settings.bias), + fringe: new Uniform(settings.fringe), + ditherStrength: new Uniform(settings.ditherStrength), + focusCoords: new Uniform(new Vector2(0.5, 0.5)), + focalDepth: new Uniform(1.0) + }, + fragmentShader: fragment$15, + vertexShader: vertex$15, + depthWrite: false, + depthTest: false + })); + + _this.setShowFocusEnabled(settings.showFocus); + + _this.setManualDepthOfFieldEnabled(settings.manualDoF); + + _this.setVignetteEnabled(settings.vignette); + + _this.setPentagonEnabled(settings.pentagon); + + _this.setShaderFocusEnabled(settings.shaderFocus); + + _this.setNoiseEnabled(settings.noise); + + if (settings.texelSize !== null) { + _this.setTexelSize(settings.texelSize.x, settings.texelSize.y); + } + + _this.adoptCameraSettings(camera); + + return _this; + } + /** + * Defines whether the focus should be shown. + * + * @param {Boolean} enabled - True if the focus should be shown, false otherwise. + */ + + + createClass(RealisticBokehMaterial, [{ + key: "setShowFocusEnabled", + value: function setShowFocusEnabled(enabled) { + if (enabled) { + this.defines.SHOW_FOCUS = "1"; + } else { + delete this.defines.SHOW_FOCUS; + } + + this.needsUpdate = true; + } + /** + * Defines whether manual Depth of Field should be enabled. + * + * @param {Boolean} enabled - Whether manual DoF should be enabled. + */ + + }, { + key: "setManualDepthOfFieldEnabled", + value: function setManualDepthOfFieldEnabled(enabled) { + if (enabled) { + this.defines.MANUAL_DOF = "1"; + } else { + delete this.defines.MANUAL_DOF; + } + + this.needsUpdate = true; + } + /** + * Defines whether the Vignette effect should be enabled. + * + * @param {Boolean} enabled - Whether the Vignette effect should be enabled. + */ + + }, { + key: "setVignetteEnabled", + value: function setVignetteEnabled(enabled) { + if (enabled) { + this.defines.VIGNETTE = "1"; + } else { + delete this.defines.VIGNETTE; + } + + this.needsUpdate = true; + } + /** + * Defines whether the pentagonal blur effect should be enabled. + * + * @param {Boolean} enabled - Whether the pentagonal blur effect should be enabled. + */ + + }, { + key: "setPentagonEnabled", + value: function setPentagonEnabled(enabled) { + if (enabled) { + this.defines.PENTAGON = "1"; + } else { + delete this.defines.PENTAGON; + } + + this.needsUpdate = true; + } + /** + * Enables or disables the automatic shader focus. + * + * @param {Boolean} enabled - Whether the shader focus should be enabled. + */ + + }, { + key: "setShaderFocusEnabled", + value: function setShaderFocusEnabled(enabled) { + if (enabled) { + this.defines.SHADER_FOCUS = "1"; + } else { + delete this.defines.SHADER_FOCUS; + } + + this.needsUpdate = true; + } + /** + * Defines whether the dithering should compute noise. + * + * @param {Boolean} enabled - Whether noise-based dithering should be enabled. + */ + + }, { + key: "setNoiseEnabled", + value: function setNoiseEnabled(enabled) { + if (enabled) { + this.defines.NOISE = "1"; + } else { + delete this.defines.NOISE; + } + + this.needsUpdate = true; + } + /** + * Sets the texel size. + * + * @param {Number} x - The texel width. + * @param {Number} y - The texel height. + */ + + }, { + key: "setTexelSize", + value: function setTexelSize(x, y) { + this.uniforms.texelSize.value.set(x, y); + this.uniforms.halfTexelSize.value.set(x, y).multiplyScalar(0.5); + } + /** + * Adopts the near and far plane and the focal length of the given camera. + * + * @param {PerspectiveCamera} camera - The main camera. + */ + + }, { + key: "adoptCameraSettings", + value: function adoptCameraSettings(camera) { + if (camera !== null) { + this.uniforms.cameraNear.value = camera.near; + this.uniforms.cameraFar.value = camera.far; + this.uniforms.focalLength.value = camera.getFocalLength(); // unit: mm. + } + } + }]); + + inherits(RealisticBokehMaterial, _ShaderMaterial); + + return RealisticBokehMaterial; + }(ShaderMaterial); + + var fragment$16 = "#include \r\n\r\nuniform sampler2D tDiffuse;\r\nuniform vec2 center;\r\nuniform float aspect;\r\nuniform float waveSize;\r\nuniform float radius;\r\nuniform float maxRadius;\r\nuniform float amplitude;\r\n\r\nvarying vec2 vUv;\r\nvarying float vSize;\r\n\r\nvoid main() {\r\n\r\n\tvec2 aspectCorrection = vec2(aspect, 1.0);\r\n\r\n\tvec2 difference = vUv * aspectCorrection - center * aspectCorrection;\r\n\tfloat distance = sqrt(dot(difference, difference)) * vSize;\r\n\r\n\tvec2 displacement = vec2(0.0);\r\n\r\n\tif(distance > radius) {\r\n\r\n\t\tif(distance < radius + waveSize) {\r\n\r\n\t\t\tfloat angle = (distance - radius) * PI2 / waveSize;\r\n\t\t\tfloat cosSin = (1.0 - cos(angle)) * 0.5;\r\n\r\n\t\t\tfloat extent = maxRadius + waveSize;\r\n\t\t\tfloat decay = max(extent - distance * distance, 0.0) / extent;\r\n\r\n\t\t\tdisplacement = ((cosSin * amplitude * difference) / distance) * decay;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tgl_FragColor = texture2D(tDiffuse, vUv - displacement);\r\n\r\n}\r\n"; + var vertex$16 = "uniform float size;\r\nuniform float scale;\r\nuniform float cameraDistance;\r\n\r\nvarying vec2 vUv;\r\nvarying float vSize;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tvSize = (0.1 * cameraDistance) / size;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * A shock wave shader material. + * + * Based on a Gist by Jean-Philippe Sarda: + * https://gist.github.com/jpsarda/33cea67a9f2ecb0a0eda + */ + + var ShockWaveMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new shock wave material. + * + * @param {Object} [options] - The options. + * @param {Number} [options.waveSize=0.2] - The wave size. + * @param {Number} [options.amplitude=0.05] - The distortion amplitude. + */ + function ShockWaveMaterial() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, ShockWaveMaterial); + + var settings = Object.assign({ + maxRadius: 1.0, + waveSize: 0.2, + amplitude: 0.05 + }, options); + return possibleConstructorReturn(this, getPrototypeOf$2(ShockWaveMaterial).call(this, { + type: "ShockWaveMaterial", + uniforms: { + tDiffuse: new Uniform(null), + center: new Uniform(new Vector2(0.5, 0.5)), + aspect: new Uniform(1.0), + cameraDistance: new Uniform(1.0), + size: new Uniform(1.0), + radius: new Uniform(-settings.waveSize), + maxRadius: new Uniform(settings.maxRadius), + waveSize: new Uniform(settings.waveSize), + amplitude: new Uniform(settings.amplitude) + }, + fragmentShader: fragment$16, + vertexShader: vertex$16, + depthWrite: false, + depthTest: false + })); + } + + inherits(ShockWaveMaterial, _ShaderMaterial); + + return ShockWaveMaterial; + }(ShaderMaterial); + + var fragment$17 = "uniform sampler2D tDiffuse;\r\nuniform sampler2D tWeights;\r\n\r\nuniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset;\r\n\r\nvoid main() {\r\n\r\n\t// Fetch the blending weights for current pixel.\r\n\tvec4 a;\r\n\ta.xz = texture2D(tWeights, vUv).xz;\r\n\ta.y = texture2D(tWeights, vOffset.zw).g;\r\n\ta.w = texture2D(tWeights, vOffset.xy).a;\r\n\r\n\tvec4 color;\r\n\r\n\t// Check if there is any blending weight with a value greater than 0.0.\r\n\tif(dot(a, vec4(1.0)) < 1e-5) {\r\n\r\n\t\tcolor = texture2D(tDiffuse, vUv, 0.0);\r\n\r\n\t} else {\r\n\r\n\t\t/* Up to four lines can be crossing a pixel (one through each edge).\r\n\t\t * The line with the maximum weight for each direction is favoured.\r\n\t\t */\r\n\r\n\t\tvec2 offset;\r\n\t\toffset.x = a.a > a.b ? a.a : -a.b; // Left vs. right.\r\n\t\toffset.y = a.g > a.r ? -a.g : a.r; // Top vs. bottom (changed signs).\r\n\r\n\t\t// Go in the direction with the maximum weight (horizontal vs. vertical).\r\n\t\tif(abs(offset.x) > abs(offset.y)) {\r\n\r\n\t\t\toffset.y = 0.0;\r\n\r\n\t\t} else {\r\n\r\n\t\t\toffset.x = 0.0;\r\n\r\n\t\t}\r\n\r\n\t\t// Fetch the opposite color and lerp by hand.\r\n\t\tcolor = texture2D(tDiffuse, vUv, 0.0);\r\n\t\tvec2 coord = vUv + sign(offset) * texelSize;\r\n\t\tvec4 oppositeColor = texture2D(tDiffuse, coord, 0.0);\r\n\t\tfloat s = abs(offset.x) > abs(offset.y) ? abs(offset.x) : abs(offset.y);\r\n\r\n\t\t// Gamma correction.\r\n\t\tcolor.rgb = pow(abs(color.rgb), vec3(2.2));\r\n\t\toppositeColor.rgb = pow(abs(oppositeColor.rgb), vec3(2.2));\r\n\t\tcolor = mix(color, oppositeColor, s);\r\n\t\tcolor.rgb = pow(abs(color.rgb), vec3(1.0 / 2.2));\r\n\r\n\t}\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n"; + var vertex$17 = "uniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\r\n\tvOffset = uv.xyxy + texelSize.xyxy * vec4(1.0, 0.0, 0.0, -1.0); // Changed sign in W component.\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * Subpixel Morphological Antialiasing. + * + * This material is used to render the final antialiasing. + */ + + var SMAABlendMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new SMAA blend material. + * + * @param {Vector2} [texelSize] - The absolute screen texel size. + */ + function SMAABlendMaterial() { + var texelSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Vector2(); + + classCallCheck(this, SMAABlendMaterial); + + return possibleConstructorReturn(this, getPrototypeOf$2(SMAABlendMaterial).call(this, { + type: "SMAABlendMaterial", + uniforms: { + tDiffuse: new Uniform(null), + tWeights: new Uniform(null), + texelSize: new Uniform(texelSize) + }, + fragmentShader: fragment$17, + vertexShader: vertex$17, + depthWrite: false, + depthTest: false + })); + } + + inherits(SMAABlendMaterial, _ShaderMaterial); + + return SMAABlendMaterial; + }(ShaderMaterial); + + var fragment$18 = "#define sampleLevelZeroOffset(t, coord, offset) texture2D(t, coord + float(offset) * texelSize, 0.0)\r\n\r\nuniform sampler2D tDiffuse;\r\nuniform sampler2D tArea;\r\nuniform sampler2D tSearch;\r\n\r\nuniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset[3];\r\nvarying vec2 vPixCoord;\r\n\r\nvec2 round(vec2 x) {\r\n\r\n\treturn sign(x) * floor(abs(x) + 0.5);\r\n\r\n}\r\n\r\nfloat searchLength(vec2 e, float bias, float scale) {\r\n\r\n\t// Not required if tSearch accesses are set to point.\r\n\t// const vec2 SEARCH_TEX_PIXEL_SIZE = 1.0 / vec2(66.0, 33.0);\r\n\t// e = vec2(bias, 0.0) + 0.5 * SEARCH_TEX_PIXEL_SIZE + e * vec2(scale, 1.0) * vec2(64.0, 32.0) * SEARCH_TEX_PIXEL_SIZE;\r\n\r\n\te.r = bias + e.r * scale;\r\n\r\n\treturn 255.0 * texture2D(tSearch, e, 0.0).r;\r\n\r\n}\r\n\r\nfloat searchXLeft(vec2 texCoord, float end) {\r\n\r\n\t/* @PSEUDO_GATHER4\r\n\t * This texCoord has been offset by (-0.25, -0.125) in the vertex shader to\r\n\t * sample between edge, thus fetching four edges in a row.\r\n\t * Sampling with different offsets in each direction allows to disambiguate\r\n\t * which edges are active from the four fetched ones.\r\n\t */\r\n\r\n\tvec2 e = vec2(0.0, 1.0);\r\n\r\n\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i) {\r\n\r\n\t\te = texture2D(tDiffuse, texCoord, 0.0).rg;\r\n\t\ttexCoord -= vec2(2.0, 0.0) * texelSize;\r\n\r\n\t\tif(!(texCoord.x > end && e.g > 0.8281 && e.r == 0.0)) { break; }\r\n\r\n\t}\r\n\r\n\t// Correct the previously applied offset (-0.25, -0.125).\r\n\ttexCoord.x += 0.25 * texelSize.x;\r\n\r\n\t// The searches are biased by 1, so adjust the coords accordingly.\r\n\ttexCoord.x += texelSize.x;\r\n\r\n\t// Disambiguate the length added by the last step.\r\n\ttexCoord.x += 2.0 * texelSize.x; // Undo last step.\r\n\ttexCoord.x -= texelSize.x * searchLength(e, 0.0, 0.5);\r\n\r\n\treturn texCoord.x;\r\n\r\n}\r\n\r\nfloat searchXRight(vec2 texCoord, float end) {\r\n\r\n\tvec2 e = vec2(0.0, 1.0);\r\n\r\n\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i) {\r\n\r\n\t\te = texture2D(tDiffuse, texCoord, 0.0).rg;\r\n\t\ttexCoord += vec2(2.0, 0.0) * texelSize;\r\n\r\n\t\tif(!(texCoord.x < end && e.g > 0.8281 && e.r == 0.0)) { break; }\r\n\r\n\t}\r\n\r\n\ttexCoord.x -= 0.25 * texelSize.x;\r\n\ttexCoord.x -= texelSize.x;\r\n\ttexCoord.x -= 2.0 * texelSize.x;\r\n\ttexCoord.x += texelSize.x * searchLength(e, 0.5, 0.5);\r\n\r\n\treturn texCoord.x;\r\n\r\n}\r\n\r\nfloat searchYUp(vec2 texCoord, float end) {\r\n\r\n\tvec2 e = vec2(1.0, 0.0);\r\n\r\n\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i) {\r\n\r\n\t\te = texture2D(tDiffuse, texCoord, 0.0).rg;\r\n\t\ttexCoord += vec2(0.0, 2.0) * texelSize; // Changed sign.\r\n\r\n\t\tif(!(texCoord.y > end && e.r > 0.8281 && e.g == 0.0)) { break; }\r\n\r\n\t}\r\n\r\n\ttexCoord.y -= 0.25 * texelSize.y; // Changed sign.\r\n\ttexCoord.y -= texelSize.y; // Changed sign.\r\n\ttexCoord.y -= 2.0 * texelSize.y; // Changed sign.\r\n\ttexCoord.y += texelSize.y * searchLength(e.gr, 0.0, 0.5); // Changed sign.\r\n\r\n\treturn texCoord.y;\r\n\r\n}\r\n\r\nfloat searchYDown(vec2 texCoord, float end) {\r\n\r\n\tvec2 e = vec2(1.0, 0.0);\r\n\r\n\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i ) {\r\n\r\n\t\te = texture2D(tDiffuse, texCoord, 0.0).rg;\r\n\t\ttexCoord -= vec2(0.0, 2.0) * texelSize; // Changed sign.\r\n\r\n\t\tif(!(texCoord.y < end && e.r > 0.8281 && e.g == 0.0)) { break; }\r\n\r\n\t}\r\n\r\n\ttexCoord.y += 0.25 * texelSize.y; // Changed sign.\r\n\ttexCoord.y += texelSize.y; // Changed sign.\r\n\ttexCoord.y += 2.0 * texelSize.y; // Changed sign.\r\n\ttexCoord.y -= texelSize.y * searchLength(e.gr, 0.5, 0.5); // Changed sign.\r\n\r\n\treturn texCoord.y;\r\n\r\n}\r\n\r\nvec2 area(vec2 dist, float e1, float e2, float offset) {\r\n\r\n\t// Rounding prevents precision errors of bilinear filtering.\r\n\tvec2 texCoord = AREATEX_MAX_DISTANCE * round(4.0 * vec2(e1, e2)) + dist;\r\n\r\n\t// Scale and bias for texel space translation.\r\n\ttexCoord = AREATEX_PIXEL_SIZE * texCoord + (0.5 * AREATEX_PIXEL_SIZE);\r\n\r\n\t// Move to proper place, according to the subpixel offset.\r\n\ttexCoord.y += AREATEX_SUBTEX_SIZE * offset;\r\n\r\n\treturn texture2D(tArea, texCoord, 0.0).rg;\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\tvec4 weights = vec4(0.0);\r\n\tvec4 subsampleIndices = vec4(0.0);\r\n\tvec2 e = texture2D(tDiffuse, vUv).rg;\r\n\r\n\tif(e.g > 0.0) {\r\n\r\n\t\t// Edge at north.\r\n\t\tvec2 d;\r\n\r\n\t\t// Find the distance to the left.\r\n\t\tvec2 coords;\r\n\t\tcoords.x = searchXLeft(vOffset[0].xy, vOffset[2].x);\r\n\t\tcoords.y = vOffset[1].y; // vOffset[1].y = vUv.y - 0.25 * texelSize.y (@CROSSING_OFFSET)\r\n\t\td.x = coords.x;\r\n\r\n\t\t/* Now fetch the left crossing edges, two at a time using bilinear\r\n\t\tfiltering. Sampling at -0.25 (see @CROSSING_OFFSET) enables to discern what\r\n\t\tvalue each edge has. */\r\n\t\tfloat e1 = texture2D(tDiffuse, coords, 0.0).r;\r\n\r\n\t\t// Find the distance to the right.\r\n\t\tcoords.x = searchXRight(vOffset[0].zw, vOffset[2].y);\r\n\t\td.y = coords.x;\r\n\r\n\t\t/* Translate distances to pixel units for better interleave arithmetic and\r\n\t\tmemory accesses. */\r\n\t\td = d / texelSize.x - vPixCoord.x;\r\n\r\n\t\t// The area texture is compressed quadratically.\r\n\t\tvec2 sqrtD = sqrt(abs(d));\r\n\r\n\t\t// Fetch the right crossing edges.\r\n\t\tcoords.y -= texelSize.y; // WebGL port note: Added.\r\n\t\tfloat e2 = sampleLevelZeroOffset(tDiffuse, coords, ivec2(1, 0)).r;\r\n\r\n\t\t// Pattern recognised, now get the actual area.\r\n\t\tweights.rg = area(sqrtD, e1, e2, subsampleIndices.y);\r\n\r\n\t}\r\n\r\n\tif(e.r > 0.0) {\r\n\r\n\t\t// Edge at west.\r\n\t\tvec2 d;\r\n\r\n\t\t// Find the distance to the top.\r\n\t\tvec2 coords;\r\n\t\tcoords.y = searchYUp(vOffset[1].xy, vOffset[2].z);\r\n\t\tcoords.x = vOffset[0].x; // vOffset[1].x = vUv.x - 0.25 * texelSize.x;\r\n\t\td.x = coords.y;\r\n\r\n\t\t// Fetch the top crossing edges.\r\n\t\tfloat e1 = texture2D(tDiffuse, coords, 0.0).g;\r\n\r\n\t\t// Find the distance to the bottom.\r\n\t\tcoords.y = searchYDown(vOffset[1].zw, vOffset[2].w);\r\n\t\td.y = coords.y;\r\n\r\n\t\t// Distances in pixel units.\r\n\t\td = d / texelSize.y - vPixCoord.y;\r\n\r\n\t\t// The area texture is compressed quadratically.\r\n\t\tvec2 sqrtD = sqrt(abs(d));\r\n\r\n\t\t// Fetch the bottom crossing edges.\r\n\t\tcoords.y -= texelSize.y; // WebGL port note: Added.\r\n\t\tfloat e2 = sampleLevelZeroOffset(tDiffuse, coords, ivec2(0, 1)).g;\r\n\r\n\t\t// Get the area for this direction.\r\n\t\tweights.ba = area(sqrtD, e1, e2, subsampleIndices.x);\r\n\r\n\t}\r\n\r\n\tgl_FragColor = weights;\r\n\r\n}\r\n"; + var vertex$18 = "uniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset[3];\r\nvarying vec2 vPixCoord;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\r\n\tvPixCoord = uv / texelSize;\r\n\r\n\t// Offsets for the searches (see @PSEUDO_GATHER4).\r\n\tvOffset[0] = uv.xyxy + texelSize.xyxy * vec4(-0.25, 0.125, 1.25, 0.125); // Changed sign in Y and W components.\r\n\tvOffset[1] = uv.xyxy + texelSize.xyxy * vec4(-0.125, 0.25, -0.125, -1.25); //Changed sign in Y and W components.\r\n\r\n\t// This indicates the ends of the loops.\r\n\tvOffset[2] = vec4(vOffset[0].xz, vOffset[1].yw) + vec4(-2.0, 2.0, -2.0, 2.0) * texelSize.xxyy * MAX_SEARCH_STEPS_FLOAT;\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * Subpixel Morphological Antialiasing. + * + * This material computes weights for detected edges. + */ + + var SMAAWeightsMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new SMAA weights material. + * + * @param {Vector2} [texelSize] - The absolute screen texel size. + */ + function SMAAWeightsMaterial() { + var texelSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Vector2(); + + classCallCheck(this, SMAAWeightsMaterial); + + return possibleConstructorReturn(this, getPrototypeOf$2(SMAAWeightsMaterial).call(this, { + type: "SMAAWeightsMaterial", + defines: { + // Configurable settings: + MAX_SEARCH_STEPS_INT: "8", + MAX_SEARCH_STEPS_FLOAT: "8.0", + // Non-configurable settings: + AREATEX_MAX_DISTANCE: "16.0", + AREATEX_PIXEL_SIZE: "(1.0 / vec2(160.0, 560.0))", + AREATEX_SUBTEX_SIZE: "(1.0 / 7.0)", + SEARCHTEX_SIZE: "vec2(66.0, 33.0)", + SEARCHTEX_PACKED_SIZE: "vec2(64.0, 16.0)" + }, + uniforms: { + tDiffuse: new Uniform(null), + tArea: new Uniform(null), + tSearch: new Uniform(null), + texelSize: new Uniform(texelSize) + }, + fragmentShader: fragment$18, + vertexShader: vertex$18, + depthWrite: false, + depthTest: false + })); + } + /** + * Sets the maximum amount of steps performed in the horizontal/vertical + * pattern searches, at each side of the pixel. + * + * In number of pixels, it's actually the double. So the maximum line length + * perfectly handled by, for example 16, is 64 (perfectly means that longer + * lines won't look as good, but are still antialiased). + * + * @param {Number} steps - The search steps. Range: [0, 112]. + */ + + + createClass(SMAAWeightsMaterial, [{ + key: "setOrthogonalSearchSteps", + value: function setOrthogonalSearchSteps(steps) { + this.defines.MAX_SEARCH_STEPS_INT = steps.toFixed("0"); + this.defines.MAX_SEARCH_STEPS_FLOAT = steps.toFixed("1"); + this.needsUpdate = true; + } + }]); + + inherits(SMAAWeightsMaterial, _ShaderMaterial); + + return SMAAWeightsMaterial; + }(ShaderMaterial); + + var fragment$19 = "#include \r\n#include \r\n\r\nuniform sampler2D tDiffuse;\r\nuniform float middleGrey;\r\nuniform float maxLuminance;\r\n\r\n#ifdef ADAPTED_LUMINANCE\r\n\r\n\tuniform sampler2D luminanceMap;\r\n\r\n#else\r\n\r\n\tuniform float averageLuminance;\r\n\r\n#endif\r\n\r\nvarying vec2 vUv;\r\n\r\nvec3 toneMap(vec3 c) {\r\n\r\n\t#ifdef ADAPTED_LUMINANCE\r\n\r\n\t\t// Get the calculated average luminance by sampling the center.\r\n\t\tfloat lumAvg = texture2D(luminanceMap, vec2(0.5)).r;\r\n\r\n\t#else\r\n\r\n\t\tfloat lumAvg = averageLuminance;\r\n\r\n\t#endif\r\n\r\n\t// Calculate the luminance of the current pixel.\r\n\tfloat lumPixel = linearToRelativeLuminance(c);\r\n\r\n\t// Apply the modified operator (Reinhard Eq. 4).\r\n\tfloat lumScaled = (lumPixel * middleGrey) / lumAvg;\r\n\r\n\tfloat lumCompressed = (lumScaled * (1.0 + (lumScaled / (maxLuminance * maxLuminance)))) / (1.0 + lumScaled);\r\n\r\n\treturn lumCompressed * c;\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tgl_FragColor = vec4(toneMap(texel.rgb), texel.a);\r\n\r\n\t#include \r\n\r\n}\r\n"; + var vertex$19 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n"; + /** + * Full-screen tone-mapping shader material. + * + * This material supports dithering. + * + * Reference: + * http://www.cis.rit.edu/people/faculty/ferwerda/publications/sig02_paper.pdf + */ + + var ToneMappingMaterial = + /*#__PURE__*/ + function (_ShaderMaterial) { + /** + * Constructs a new tone mapping material. + */ + function ToneMappingMaterial() { + classCallCheck(this, ToneMappingMaterial); + + return possibleConstructorReturn(this, getPrototypeOf$2(ToneMappingMaterial).call(this, { + type: "ToneMappingMaterial", + uniforms: { + tDiffuse: new Uniform(null), + luminanceMap: new Uniform(null), + averageLuminance: new Uniform(1.0), + maxLuminance: new Uniform(16.0), + middleGrey: new Uniform(0.6) + }, + fragmentShader: fragment$19, + vertexShader: vertex$19, + depthWrite: false, + depthTest: false + })); + } + + inherits(ToneMappingMaterial, _ShaderMaterial); + + return ToneMappingMaterial; + }(ShaderMaterial); + + /** + * A collection of shader materials that are used in the post processing passes. + * + * @module postprocessing/materials + */ + + /** + * An abstract pass. + * + * Passes that do not rely on the depth buffer should explicitly disable the + * depth test and depth write in their respective shader materials. + * + * @implements {Resizable} + * @implements {Disposable} + */ + + var Pass = + /*#__PURE__*/ + function () { + /** + * Constructs a new pass. + * + * @param {String} [name] - The name of this pass. + * @param {Scene} [scene] - The scene to render. + * @param {Camera} [camera] - The camera. + * @param {Mesh} [quad] - A quad that fills the screen to render 2D filter effects. Set this to null, if you don't need it (see {@link RenderPass}). + */ + function Pass() { + var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "Pass"; + var scene = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Scene(); + var camera = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new OrthographicCamera(-1, 1, 1, -1, 0, 1); + var quad = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : new Mesh(new PlaneBufferGeometry(2, 2), null); + + classCallCheck(this, Pass); + + /** + * The name of this pass. + * + * @type {String} + */ + this.name = name; + /** + * The scene to render. + * + * @type {Scene} + * @protected + */ + + this.scene = scene; + /** + * The camera. + * + * @type {Camera} + * @protected + */ + + this.camera = camera; + /** + * A quad mesh that fills the screen. + * + * @type {Mesh} + * @private + */ + + this.quad = quad; + + if (this.quad !== null) { + this.quad.frustumCulled = false; + + if (this.scene !== null) { + this.scene.add(this.quad); + } + } + /** + * Indicates whether this pass should render to screen. + * + * @type {Boolean} + */ + + + this.renderToScreen = false; + /** + * Indicates whether this pass should be executed. + * + * @type {Boolean} + */ + + this.enabled = true; + /** + * Indicates whether the {@link EffectComposer} should swap the frame + * buffers after this pass has finished rendering. + * + * Set this to `false` if this pass doesn't render to the output buffer or + * the screen. Otherwise, the contents of the input buffer will be lost. + * + * @type {Boolean} + */ + + this.needsSwap = true; + } + /** + * The fullscreen material. + * + * @type {Material} + */ + + + createClass(Pass, [{ + key: "render", + + /** + * Renders the effect. + * + * This is an abstract method that must be overridden. + * + * @abstract + * @throws {Error} An error is thrown if the method is not overridden. + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + throw new Error("Render method not implemented!"); + } + /** + * Updates this pass with the renderer's size. + * + * You may override this method in case you want to be informed about the main + * render size. + * + * The {@link EffectComposer} calls this method before this pass is + * initialized and every time its own size is updated. + * + * @param {Number} width - The renderer's width. + * @param {Number} height - The renderer's height. + * @example this.myRenderTarget.setSize(width, height); + */ + + }, { + key: "setSize", + value: function setSize(width, height) {} + /** + * Performs initialization tasks. + * + * By overriding this method you gain access to the renderer. You'll also be + * able to configure your custom render targets to use the appropriate format + * (RGB or RGBA). + * + * The provided renderer can be used to warm up special off-screen render + * targets by performing a preliminary render operation. + * + * The {@link EffectComposer} calls this method when this pass is added to its + * queue, but not before its size has been set. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not. + * @example if(!alpha) { this.myRenderTarget.texture.format = RGBFormat; } + */ + + }, { + key: "initialize", + value: function initialize(renderer, alpha) {} + /** + * Performs a shallow search for properties that define a dispose method and + * deletes them. The pass will be inoperative after this method was called! + * + * Disposable objects: + * - render targets + * - materials + * - textures + * + * The {@link EffectComposer} calls this method when it is being destroyed. + * You may, however, use it independently to free memory when you are certain + * that you don't need this pass anymore. + */ + + }, { + key: "dispose", + value: function dispose() { + var key; + + var _arr = Object.keys(this); + + for (var _i = 0; _i < _arr.length; _i++) { + key = _arr[_i]; + + if (this[key] !== null && typeof this[key].dispose === "function") { + this[key].dispose(); + this[key] = null; + } + } + + if (this.material !== null) { + this.material.dispose(); + } + } + }, { + key: "material", + get: function get() { + return this.quad !== null ? this.quad.material : null; + } + /** + * Sets the fullscreen material. + * + * The material will be assigned to the quad mesh that fills the screen. + * + * @type {Material} + */ + , + set: function set(value) { + if (this.quad !== null) { + this.quad.material = value; + } + } + }]); + + return Pass; + }(); + + /** + * An efficient, incremental blur pass. + * + * Note: This pass allows the input and output buffer to be the same. + */ + + var BlurPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new blur pass. + * + * @param {Object} [options] - The options. + * @param {Number} [options.resolutionScale=0.5] - The render texture resolution scale, relative to the screen render size. + * @param {Number} [options.kernelSize=KernelSize.LARGE] - The blur kernel size. + */ + function BlurPass() { + var _this; + + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, BlurPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(BlurPass).call(this, "BlurPass")); + /** + * A render target. + * + * @type {WebGLRenderTarget} + * @private + */ + + _this.renderTargetX = new WebGLRenderTarget(1, 1, { + minFilter: LinearFilter, + magFilter: LinearFilter, + stencilBuffer: false, + depthBuffer: false + }); + _this.renderTargetX.texture.name = "Blur.TargetX"; + _this.renderTargetX.texture.generateMipmaps = false; + /** + * A second render target. + * + * @type {WebGLRenderTarget} + * @private + */ + + _this.renderTargetY = _this.renderTargetX.clone(); + _this.renderTargetY.texture.name = "Blur.TargetY"; + /** + * The resolution scale. + * + * You need to call {@link EffectComposer#setSize} after changing this + * value. + * + * @type {Number} + */ + + _this.resolutionScale = options.resolutionScale !== undefined ? options.resolutionScale : 0.5; + /** + * A convolution shader material. + * + * @type {ConvolutionMaterial} + * @private + */ + + _this.convolutionMaterial = new ConvolutionMaterial(); + /** + * A convolution shader material that uses dithering. + * + * @type {ConvolutionMaterial} + * @private + */ + + _this.ditheredConvolutionMaterial = new ConvolutionMaterial(); + _this.ditheredConvolutionMaterial.dithering = true; + /** + * Whether the blurred result should also be dithered using noise. + * + * @type {Boolean} + */ + + _this.dithering = false; + _this.kernelSize = options.kernelSize; + return _this; + } + /** + * The absolute width of the internal render targets. + * + * @type {Number} + */ + + + createClass(BlurPass, [{ + key: "render", + + /** + * Blurs the input buffer and writes the result to the output buffer. The + * input buffer remains intact, unless its also the output buffer. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + var scene = this.scene; + var camera = this.camera; + var renderTargetX = this.renderTargetX; + var renderTargetY = this.renderTargetY; + var material = this.convolutionMaterial; + var uniforms = material.uniforms; + var kernel = material.getKernel(); + var lastRT = inputBuffer; + var destRT; + var i, l; + this.material = material; // Apply the multi-pass blur. + + for (i = 0, l = kernel.length - 1; i < l; ++i) { + // Alternate between targets. + destRT = i % 2 === 0 ? renderTargetX : renderTargetY; + uniforms.kernel.value = kernel[i]; + uniforms.tDiffuse.value = lastRT.texture; + renderer.render(scene, camera, destRT); + lastRT = destRT; + } + + if (this.dithering) { + material = this.ditheredConvolutionMaterial; + uniforms = material.uniforms; + this.material = material; + } + + uniforms.kernel.value = kernel[i]; + uniforms.tDiffuse.value = lastRT.texture; + renderer.render(scene, camera, this.renderToScreen ? null : outputBuffer); + } + /** + * Updates the size of this pass. + * + * @param {Number} width - The width. + * @param {Number} height - The height. + */ + + }, { + key: "setSize", + value: function setSize(width, height) { + width = Math.max(1, Math.floor(width * this.resolutionScale)); + height = Math.max(1, Math.floor(height * this.resolutionScale)); + this.renderTargetX.setSize(width, height); + this.renderTargetY.setSize(width, height); + this.convolutionMaterial.setTexelSize(1.0 / width, 1.0 / height); + this.ditheredConvolutionMaterial.setTexelSize(1.0 / width, 1.0 / height); + } + /** + * Performs initialization tasks. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not. + */ + + }, { + key: "initialize", + value: function initialize(renderer, alpha) { + if (!alpha) { + this.renderTargetX.texture.format = RGBFormat; + this.renderTargetY.texture.format = RGBFormat; + } + } + }, { + key: "width", + get: function get() { + return this.renderTargetX.width; + } + /** + * The absolute height of the internal render targets. + * + * @type {Number} + */ + + }, { + key: "height", + get: function get() { + return this.renderTargetX.height; + } + /** + * The kernel size. + * + * @type {KernelSize} + */ + + }, { + key: "kernelSize", + get: function get() { + return this.convolutionMaterial.kernelSize; + } + /** + * @type {KernelSize} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : KernelSize.LARGE; + this.convolutionMaterial.kernelSize = value; + this.ditheredConvolutionMaterial.kernelSize = value; + } + }]); + + inherits(BlurPass, _Pass); + + return BlurPass; + }(Pass); + + /** + * A bloom pass. + * + * This pass renders a scene with superimposed blur by utilizing the fast Kawase + * convolution approach. + */ + + var BloomPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new bloom pass. + * + * @param {Object} [options] - The options. + * @param {Number} [options.resolutionScale=0.5] - The render texture resolution scale, relative to the screen render size. + * @param {Number} [options.kernelSize=KernelSize.LARGE] - The blur kernel size. + * @param {Number} [options.intensity=1.0] - The strength of the bloom effect. + * @param {Number} [options.distinction=1.0] - The luminance distinction factor. Raise this value to bring out the brighter elements in the scene. + * @param {Number} [options.screenMode=true] - Whether the screen blend mode should be used for combining the bloom texture with the scene colors. + */ + function BloomPass() { + var _this; + + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, BloomPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(BloomPass).call(this, "BloomPass")); + /** + * A render target. + * + * @type {WebGLRenderTarget} + * @private + */ + + _this.renderTarget = new WebGLRenderTarget(1, 1, { + minFilter: LinearFilter, + magFilter: LinearFilter, + stencilBuffer: false, + depthBuffer: false + }); + _this.renderTarget.texture.name = "Bloom.Target"; + _this.renderTarget.texture.generateMipmaps = false; + /** + * A blur pass. + * + * @type {BlurPass} + * @private + */ + + _this.blurPass = new BlurPass(options); + /** + * A combine shader material. + * + * @type {CombineMaterial} + * @private + */ + + _this.combineMaterial = new CombineMaterial(options.screenMode !== undefined ? options.screenMode : true); + _this.intensity = options.intensity; + /** + * A luminosity shader material. + * + * @type {LuminosityMaterial} + * @private + */ + + _this.luminosityMaterial = new LuminosityMaterial(true); + _this.distinction = options.distinction; + return _this; + } + /** + * The resolution scale. + * + * @type {Number} + */ + + + createClass(BloomPass, [{ + key: "render", + + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + var scene = this.scene; + var camera = this.camera; + var blurPass = this.blurPass; + var luminosityMaterial = this.luminosityMaterial; + var combineMaterial = this.combineMaterial; + var renderTarget = this.renderTarget; // Luminance filter. + + this.material = luminosityMaterial; + luminosityMaterial.uniforms.tDiffuse.value = inputBuffer.texture; + renderer.render(scene, camera, renderTarget); // Convolution phase. + + blurPass.render(renderer, renderTarget, renderTarget); + + if (this.blend) { + // Render the original scene with superimposed blur. + this.material = combineMaterial; + combineMaterial.uniforms.texture1.value = inputBuffer.texture; + combineMaterial.uniforms.texture2.value = renderTarget.texture; + renderer.render(scene, camera, this.renderToScreen ? null : outputBuffer); + } + } + /** + * Updates the size of this pass. + * + * @param {Number} width - The width. + * @param {Number} height - The height. + */ + + }, { + key: "setSize", + value: function setSize(width, height) { + this.blurPass.setSize(width, height); + width = this.blurPass.width; + height = this.blurPass.height; + this.renderTarget.setSize(width, height); + } + /** + * Performs initialization tasks. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not. + */ + + }, { + key: "initialize", + value: function initialize(renderer, alpha) { + this.blurPass.initialize(renderer, alpha); + + if (!alpha) { + this.renderTarget.texture.format = RGBFormat; + } + } + }, { + key: "resolutionScale", + get: function get() { + return this.blurPass.resolutionScale; + } + /** + * You need to call {@link EffectComposer#setSize} after changing this value. + * + * @type {Number} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0.5; + this.blurPass.resolutionScale = value; + } + /** + * The blur kernel size. + * + * @type {KernelSize} + */ + + }, { + key: "kernelSize", + get: function get() { + return this.blurPass.kernelSize; + } + /** + * @type {KernelSize} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : KernelSize.LARGE; + this.blurPass.kernelSize = value; + } + /** + * The overall intensity of the effect. + * + * @type {Number} + */ + + }, { + key: "intensity", + get: function get() { + return this.combineMaterial.uniforms.opacity2.value; + } + /** + * @type {Number} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1.0; + this.combineMaterial.uniforms.opacity2.value = value; + } + /** + * The luminance distinction factor. + * + * @type {Number} + */ + + }, { + key: "distinction", + get: function get() { + return this.luminosityMaterial.uniforms.distinction.value; + } + /** + * @type {Number} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1.0; + this.luminosityMaterial.uniforms.distinction.value = value; + } + /** + * Indicates whether dithering is enabled. + * + * @type {Boolean} + */ + + }, { + key: "dithering", + get: function get() { + return this.blurPass.dithering; + } + /** + * If enabled, the result will be dithered to remove banding artifacts. + * + * @type {Boolean} + */ + , + set: function set(value) { + this.blurPass.dithering = value; + } + /** + * Indicates whether the effect should be applied to the input buffer. + * + * @type {Boolean} + */ + + }, { + key: "blend", + get: function get() { + return this.needsSwap; + } + /** + * If disabled, the input buffer will remain unaffected. + * + * You may use the {@link BloomPass#overlay} texture to apply the effect to + * your scene. + * + * @type {Boolean} + */ + , + set: function set(value) { + this.needsSwap = value; + } + /** + * The effect overlay texture. + * + * @type {Texture} + */ + + }, { + key: "overlay", + get: function get() { + return this.renderTarget.texture; + } + }]); + + inherits(BloomPass, _Pass); + + return BloomPass; + }(Pass); + + /** + * A Depth of Field (DoF) pass using a bokeh shader. + * + * This pass requires a {@link EffectComposer#depthTexture}. + */ + + var BokehPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new bokeh pass. + * + * @param {PerspectiveCamera} camera - The main camera. Used to obtain the aspect ratio and the near and far plane settings. + * @param {Object} [options] - Additional parameters. See {@link BokehMaterial} for details. + */ + function BokehPass(camera) { + var _this; + + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + classCallCheck(this, BokehPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(BokehPass).call(this, "BokehPass")); + _this.material = new BokehMaterial(camera, options); + return _this; + } + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + + + createClass(BokehPass, [{ + key: "render", + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + this.material.uniforms.tDiffuse.value = inputBuffer.texture; + this.material.uniforms.tDepth.value = inputBuffer.depthTexture; + renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer); + } + /** + * Updates the size of this pass. + * + * @param {Number} width - The width. + * @param {Number} height - The height. + */ + + }, { + key: "setSize", + value: function setSize(width, height) { + this.material.uniforms.aspect.value = width / height; + } + }]); + + inherits(BokehPass, _Pass); + + return BokehPass; + }(Pass); + + /** + * A pass that disables the stencil test. + */ + + var ClearMaskPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new clear mask pass. + */ + function ClearMaskPass() { + var _this; + + classCallCheck(this, ClearMaskPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(ClearMaskPass).call(this, "ClearMaskPass", null, null, null)); + _this.needsSwap = false; + return _this; + } + /** + * Disables the global stencil test. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + + + createClass(ClearMaskPass, [{ + key: "render", + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + renderer.state.buffers.stencil.setTest(false); + } + }]); + + inherits(ClearMaskPass, _Pass); + + return ClearMaskPass; + }(Pass); + + /** + * Used for saving the original clear color of the renderer. + * + * @type {Color} + * @private + */ + + var color = new Color(); + /** + * A pass that clears the input buffer or the screen. + * + * You can prevent specific bits from being cleared by setting either the + * autoClearColor, autoClearStencil or autoClearDepth properties of the renderer + * to false. + */ + + var ClearPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new clear pass. + * + * @param {Object} [options] - Additional options. + * @param {Color} [options.clearColor=null] - An override clear color. + * @param {Number} [options.clearAlpha=0.0] - An override clear alpha. + */ + function ClearPass() { + var _this; + + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, ClearPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(ClearPass).call(this, "ClearPass", null, null, null)); + _this.needsSwap = false; + /** + * The clear color. + * + * @type {Color} + */ + + _this.clearColor = options.clearColor !== undefined ? options.clearColor : null; + /** + * The clear alpha. + * + * @type {Number} + */ + + _this.clearAlpha = options.clearAlpha !== undefined ? options.clearAlpha : 0.0; + return _this; + } + /** + * Clears the input buffer or the screen. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + + + createClass(ClearPass, [{ + key: "render", + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + var clearColor = this.clearColor; + var clearAlpha; + + if (clearColor !== null) { + color.copy(renderer.getClearColor()); + clearAlpha = renderer.getClearAlpha(); + renderer.setClearColor(clearColor, this.clearAlpha); + } + + renderer.setRenderTarget(this.renderToScreen ? null : inputBuffer); + renderer.clear(); + + if (clearColor !== null) { + renderer.setClearColor(color, clearAlpha); + } + } + }]); + + inherits(ClearPass, _Pass); + + return ClearPass; + }(Pass); + + /** + * A dot screen pass. + */ + + var DotScreenPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new dot screen pass. + * + * @param {Object} [options] - The options. + * @param {Boolean} [options.average=false] - Whether the shader should output a colour average (black and white). + * @param {Number} [options.angle=1.57] - The angle of the pattern. + * @param {Number} [options.scale=1.0] - The scale of the overall effect. + * @param {Number} [options.intensity=1.0] - The intensity of the effect. + */ + function DotScreenPass() { + var _this; + + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, DotScreenPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(DotScreenPass).call(this, "DotScreenPass")); + _this.material = new DotScreenMaterial(options); + return _this; + } + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + + + createClass(DotScreenPass, [{ + key: "render", + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + this.material.uniforms.tDiffuse.value = inputBuffer.texture; + renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer); + } + /** + * Updates the size of this pass. + * + * @param {Number} width - The width. + * @param {Number} height - The height. + */ + + }, { + key: "setSize", + value: function setSize(width, height) { + width = Math.max(1, width); + height = Math.max(1, height); + this.material.uniforms.offsetRepeat.value.z = width; + this.material.uniforms.offsetRepeat.value.w = height; + } + }]); + + inherits(DotScreenPass, _Pass); + + return DotScreenPass; + }(Pass); + + /** + * A film pass. + * + * Provides various cinematic effects. + */ + + var FilmPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new film pass. + * + * @param {Object} [options] - The options. See {@link FilmMaterial} for more options. + * @param {Number} [options.scanlineDensity=1.25] - The scanline density, relative to the screen height. + * @param {Number} [options.gridScale=1.0] - The grid scale, relative to the screen height. + * @param {Number} [options.gridLineWidth=0.0] - The grid line width. This value will be added to the base line width. + */ + function FilmPass() { + var _this; + + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, FilmPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(FilmPass).call(this, "FilmPass")); + _this.material = new FilmMaterial(options); + /** + * The amount of scanlines, relative to the screen height. + * + * You need to call {@link EffectComposer#setSize} after changing this + * value. + * + * @type {Number} + */ + + _this.scanlineDensity = options.scanlineDensity === undefined ? 1.25 : options.scanlineDensity; + /** + * The grid scale, relative to the screen height. + * + * You need to call {@link EffectComposer#setSize} after changing this + * value. + * + * @type {Number} + */ + + _this.gridScale = options.gridScale === undefined ? 1.0 : Math.max(options.gridScale, 1e-6); + /** + * The grid line width. + * + * You need to call {@link EffectComposer#setSize} after changing this + * value. + * + * @type {Number} + */ + + _this.gridLineWidth = options.gridLineWidth === undefined ? 0.0 : Math.max(options.gridLineWidth, 0.0); + return _this; + } + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + + + createClass(FilmPass, [{ + key: "render", + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + this.material.uniforms.tDiffuse.value = inputBuffer.texture; + this.material.uniforms.time.value += delta; + renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer); + } + /** + * Updates the size of this pass. + * + * @param {Number} width - The width. + * @param {Number} height - The height. + */ + + }, { + key: "setSize", + value: function setSize(width, height) { + var aspect = width / height; + var gridScale = this.gridScale * (height * 0.125); + this.material.uniforms.scanlineCount.value = Math.round(height * this.scanlineDensity); + this.material.uniforms.gridScale.value.set(aspect * gridScale, gridScale); + this.material.uniforms.gridLineWidth.value = gridScale / height + this.gridLineWidth; + } + }]); + + inherits(FilmPass, _Pass); + + return FilmPass; + }(Pass); + + /** + * Returns a random integer in the specified range. + * + * @private + * @param {Number} low - The lowest possible value. + * @param {Number} high - The highest possible value. + * @return {Number} The random value. + */ + + function randomInt(low, high) { + return low + Math.floor(Math.random() * (high - low + 1)); + } + /** + * Returns a random float in the specified range. + * + * @private + * @param {Number} low - The lowest possible value. + * @param {Number} high - The highest possible value. + * @return {Number} The random value. + */ + + + function randomFloat(low, high) { + return low + Math.random() * (high - low); + } + /** + * A glitch pass. + */ + + + var GlitchPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new glitch pass. + * + * @param {Object} [options] - The options. + * @param {Texture} [options.perturbMap] - A perturbation map. If none is provided, a noise texture will be created. + * @param {Number} [options.dtSize=64] - The size of the generated noise map. Will be ignored if a perturbation map is provided. + */ + function GlitchPass() { + var _this; + + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, GlitchPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(GlitchPass).call(this, "GlitchPass")); + _this.material = new GlitchMaterial(); + /** + * A perturbation map. + * + * @type {Texture} + * @private + */ + + _this.texture = null; + _this.perturbMap = options.perturbMap !== undefined ? options.perturbMap : _this.generatePerturbMap(options.dtSize); + _this.perturbMap.name = "Glitch.Perturbation"; + _this.perturbMap.generateMipmaps = false; + /** + * The effect mode. + * + * @type {GlitchMode} + */ + + _this.mode = GlitchMode.SPORADIC; + /** + * A counter for the glitch activation and deactivation. + * + * @type {Number} + * @private + */ + + _this.counter = 0; + /** + * A random break point for the sporadic glitch activation. + * + * @type {Number} + * @private + */ + + _this.breakPoint = randomInt(120, 240); + return _this; + } + /** + * The current perturbation map. + * + * @type {Texture} + */ + + + createClass(GlitchPass, [{ + key: "generatePerturbMap", + + /** + * Destroys the current perturbation map and replaces it with a new one. + * + * @param {Number} [size=64] - The texture size. + * @return {DataTexture} The perturbation texture. + */ + value: function generatePerturbMap() { + var size = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 64; + var pixels = size * size; + var data = new Float32Array(pixels * 3); + var dt = this.perturbMap; + var i, x; + + for (i = 0; i < pixels; ++i) { + x = Math.random(); + data[i * 3] = x; + data[i * 3 + 1] = x; + data[i * 3 + 2] = x; + } + + if (dt !== null) { + dt.dispose(); + } + + dt = new DataTexture(data, size, size, RGBFormat, FloatType); + dt.needsUpdate = true; + this.perturbMap = dt; + return dt; + } + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + + }, { + key: "render", + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + var mode = this.mode; + var counter = this.counter; + var breakPoint = this.breakPoint; + var uniforms = this.material.uniforms; + uniforms.tDiffuse.value = inputBuffer.texture; + uniforms.seed.value = Math.random(); + uniforms.active.value = true; + + if (counter % breakPoint === 0 || mode === GlitchMode.CONSTANT_WILD) { + uniforms.amount.value = Math.random() / 30.0; + uniforms.angle.value = randomFloat(-Math.PI, Math.PI); + uniforms.seedX.value = randomFloat(-1.0, 1.0); + uniforms.seedY.value = randomFloat(-1.0, 1.0); + uniforms.distortionX.value = randomFloat(0.0, 1.0); + uniforms.distortionY.value = randomFloat(0.0, 1.0); + this.breakPoint = randomInt(120, 240); + this.counter = 0; + } else { + if (counter % breakPoint < breakPoint / 5 || mode === GlitchMode.CONSTANT_MILD) { + uniforms.amount.value = Math.random() / 90.0; + uniforms.angle.value = randomFloat(-Math.PI, Math.PI); + uniforms.distortionX.value = randomFloat(0.0, 1.0); + uniforms.distortionY.value = randomFloat(0.0, 1.0); + uniforms.seedX.value = randomFloat(-0.3, 0.3); + uniforms.seedY.value = randomFloat(-0.3, 0.3); + } else { + // Sporadic. + uniforms.active.value = false; + } + } + + ++this.counter; + renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer); + } + }, { + key: "perturbMap", + get: function get() { + return this.texture; + } + /** + * Assigning a new perturbation map does not destroy the current one! + * + * @type {Texture} + */ + , + set: function set(value) { + this.texture = value; + this.material.uniforms.tPerturb.value = value; + } + }]); + + inherits(GlitchPass, _Pass); + + return GlitchPass; + }(Pass); + /** + * A glitch mode enumeration. + * + * @type {Object} + * @property {Number} SPORADIC - Sporadic glitches. + * @property {Number} CONSTANT_MILD - Constant mild glitches. + * @property {Number} CONSTANT_WILD - Constant wild glitches. + */ + + var GlitchMode = { + SPORADIC: 0, + CONSTANT_MILD: 1, + CONSTANT_WILD: 2 + }; + + /** + * A pass that renders a given scene directly on screen or into the read buffer + * for further processing. + */ + + var RenderPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new render pass. + * + * @param {Scene} scene - The scene to render. + * @param {Camera} camera - The camera to use to render the scene. + * @param {Object} [options] - Additional options. + * @param {Material} [options.overrideMaterial=null] - An override material for the scene. + * @param {Color} [options.clearColor=null] - An override clear color. + * @param {Number} [options.clearAlpha=1.0] - An override clear alpha. + * @param {Boolean} [options.clearDepth=false] - Whether depth should be cleared explicitly. + * @param {Boolean} [options.clear=true] - Whether all buffers should be cleared. + */ + function RenderPass(scene, camera) { + var _this; + + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + classCallCheck(this, RenderPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(RenderPass).call(this, "RenderPass", scene, camera, null)); + _this.needsSwap = false; + /** + * A clear pass. + * + * @type {ClearPass} + */ + + _this.clearPass = new ClearPass(options); + /** + * An override material. + * + * @type {Material} + */ + + _this.overrideMaterial = options.overrideMaterial !== undefined ? options.overrideMaterial : null; + /** + * Indicates whether the depth buffer should be cleared explicitly. + * + * @type {Boolean} + */ + + _this.clearDepth = options.clearDepth !== undefined ? options.clearDepth : false; + /** + * Indicates whether the color, depth and stencil buffers should be cleared. + * + * Even with clear set to true you can prevent specific buffers from being + * cleared by setting either the autoClearColor, autoClearStencil or + * autoClearDepth properties of the renderer to false. + * + * @type {Boolean} + */ + + _this.clear = options.clear !== undefined ? options.clear : true; + return _this; + } + /** + * Renders the scene. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + + + createClass(RenderPass, [{ + key: "render", + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + var scene = this.scene; + var renderTarget = this.renderToScreen ? null : inputBuffer; + var overrideMaterial = scene.overrideMaterial; + + if (this.clear) { + this.clearPass.renderToScreen = this.renderToScreen; + this.clearPass.render(renderer, inputBuffer); + } else if (this.clearDepth) { + renderer.setRenderTarget(renderTarget); + renderer.clearDepth(); + } + + scene.overrideMaterial = this.overrideMaterial; + renderer.render(scene, this.camera, renderTarget); + scene.overrideMaterial = overrideMaterial; + } + }]); + + inherits(RenderPass, _Pass); + + return RenderPass; + }(Pass); + + /** + * Clamps a given value. + * + * @private + * @param {Number} value - The value to clamp. + * @param {Number} min - The lowest possible value. + * @param {Number} max - The highest possible value. + * @return {Number} The clamped value. + */ + + function clamp(value, min, max) { + return Math.max(min, Math.min(max, value)); + } + /** + * A crepuscular rays pass. + */ + + + var GodRaysPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new god rays pass. + * + * @param {Scene} scene - The main scene. + * @param {Camera} camera - The main camera. + * @param {Object3D} lightSource - The main light source. + * @param {Object} [options] - The options. + * @param {Number} [options.density=0.96] - The density of the light rays. + * @param {Number} [options.decay=0.93] - An illumination decay factor. + * @param {Number} [options.weight=0.4] - A light ray weight factor. + * @param {Number} [options.exposure=0.6] - A constant attenuation coefficient. + * @param {Number} [options.clampMax=1.0] - An upper bound for the saturation of the overall effect. + * @param {Number} [options.intensity=1.0] - A constant factor for additive blending. + * @param {Number} [options.resolutionScale=0.5] - The render texture resolution scale, relative to the screen render size. + * @param {Number} [options.kernelSize=KernelSize.LARGE] - The blur kernel size. + * @param {Number} [options.samples=60] - The number of samples per pixel. + * @param {Number} [options.screenMode=true] - Whether the screen blend mode should be used for combining the god rays texture with the scene colors. + */ + function GodRaysPass(scene, camera, lightSource) { + var _this; + + var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + + classCallCheck(this, GodRaysPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(GodRaysPass).call(this, "GodRaysPass")); + /** + * A scene that only contains the light source. + * + * @type {Scene} + * @private + */ + + _this.lightScene = new Scene(); + /** + * The main scene. + * + * @type {Scene} + * @private + */ + + _this.mainScene = scene; + /** + * The main camera. + * + * @type {Camera} + * @private + */ + + _this.mainCamera = camera; + /** + * A render target. + * + * @type {WebGLRenderTarget} + * @private + */ + + _this.renderTargetX = new WebGLRenderTarget(1, 1, { + minFilter: LinearFilter, + magFilter: LinearFilter, + stencilBuffer: false, + depthBuffer: false + }); + _this.renderTargetX.texture.name = "GodRays.TargetX"; + _this.renderTargetX.texture.generateMipmaps = false; + /** + * A second render target. + * + * @type {WebGLRenderTarget} + * @private + */ + + _this.renderTargetY = _this.renderTargetX.clone(); + _this.renderTargetY.texture.name = "GodRays.TargetY"; + /** + * A render target for the masked light scene. + * + * @type {WebGLRenderTarget} + * @private + */ + + _this.renderTargetMask = new WebGLRenderTarget(1, 1, { + minFilter: LinearFilter, + magFilter: LinearFilter + }); + _this.renderTargetMask.texture.name = "GodRays.Mask"; + _this.renderTargetMask.texture.generateMipmaps = false; + /** + * A pass that only renders the light source. + * + * @type {RenderPass} + * @private + */ + + _this.renderPassLight = new RenderPass(_this.lightScene, _this.mainCamera, { + clearColor: new Color(0x000000) + }); + /** + * A pass that renders the masked scene over the light. + * + * @type {RenderPass} + * @private + */ + + _this.renderPassMask = new RenderPass(_this.mainScene, _this.mainCamera, { + overrideMaterial: new MeshBasicMaterial({ + color: 0x000000 + }) + }); + _this.renderPassMask.clear = false; + /** + * A blur pass. + * + * @type {BlurPass} + * @private + */ + + _this.blurPass = new BlurPass(options); + /** + * The light source. + * + * @type {Object3D} + */ + + _this.lightSource = lightSource; + /** + * The light position in screen space. + * + * @type {Vector3} + * @private + */ + + _this.screenPosition = new Vector3(); + /** + * A god rays shader material. + * + * @type {GodRaysMaterial} + * @private + */ + + _this.godRaysMaterial = new GodRaysMaterial(options); + _this.godRaysMaterial.uniforms.lightPosition.value = _this.screenPosition; + _this.samples = options.samples; + /** + * A combine shader material. + * + * @type {CombineMaterial} + * @private + */ + + _this.combineMaterial = new CombineMaterial(options.screenMode !== undefined ? options.screenMode : true); + _this.intensity = options.intensity; + return _this; + } + /** + * The resolution scale. + * + * @type {Number} + */ + + + createClass(GodRaysPass, [{ + key: "render", + + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + var scene = this.scene; + var camera = this.camera; + var mainScene = this.mainScene; + var lightSource = this.lightSource; + var screenPosition = this.screenPosition; + var godRaysMaterial = this.godRaysMaterial; + var combineMaterial = this.combineMaterial; + var renderTargetMask = this.renderTargetMask; + var renderTargetX = this.renderTargetX; + var renderTargetY = this.renderTargetY; + var background, parent; // Compute the screen light position and translate it to [0.0, 1.0]. + + screenPosition.copy(lightSource.position).project(this.mainCamera); + screenPosition.x = clamp((screenPosition.x + 1.0) * 0.5, 0.0, 1.0); + screenPosition.y = clamp((screenPosition.y + 1.0) * 0.5, 0.0, 1.0); + parent = lightSource.parent; + background = mainScene.background; + mainScene.background = null; + this.lightScene.add(lightSource); + /* First, render the light source. Then render the scene into the same + buffer using a mask override material with depth test enabled. */ + + this.renderPassLight.render(renderer, renderTargetMask); + this.renderPassMask.render(renderer, renderTargetMask); + + if (parent !== null) { + parent.add(lightSource); + } + + mainScene.background = background; // Blur the masked scene to reduce artifacts. + + this.blurPass.render(renderer, this.renderTargetMask, renderTargetX); // Blur the masked scene along radial lines towards the light source. + + this.material = godRaysMaterial; + godRaysMaterial.uniforms.tDiffuse.value = renderTargetX.texture; + renderer.render(scene, camera, renderTargetY); + + if (this.blend) { + // Combine the god rays with the scene colors. + this.material = combineMaterial; + combineMaterial.uniforms.texture1.value = inputBuffer.texture; + combineMaterial.uniforms.texture2.value = renderTargetY.texture; + renderer.render(scene, camera, this.renderToScreen ? null : outputBuffer); + } + } + /** + * Updates the size of this pass. + * + * @param {Number} width - The width. + * @param {Number} height - The height. + */ + + }, { + key: "setSize", + value: function setSize(width, height) { + this.renderPassLight.setSize(width, height); + this.renderPassMask.setSize(width, height); + this.blurPass.setSize(width, height); + width = this.blurPass.width; + height = this.blurPass.height; + this.renderTargetMask.setSize(width, height); + this.renderTargetX.setSize(width, height); + this.renderTargetY.setSize(width, height); + } + /** + * Performs initialization tasks. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not. + */ + + }, { + key: "initialize", + value: function initialize(renderer, alpha) { + this.renderPassLight.initialize(renderer, alpha); + this.renderPassMask.initialize(renderer, alpha); + this.blurPass.initialize(renderer, alpha); + + if (!alpha) { + this.renderTargetMask.texture.format = RGBFormat; + this.renderTargetX.texture.format = RGBFormat; + this.renderTargetY.texture.format = RGBFormat; + } + } + }, { + key: "resolutionScale", + get: function get() { + return this.blurPass.resolutionScale; + } + /** + * You need to call {@link EffectComposer#setSize} after changing this value. + * + * @type {Number} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0.5; + this.blurPass.resolutionScale = value; + } + /** + * The blur kernel size. + * + * @type {KernelSize} + */ + + }, { + key: "kernelSize", + get: function get() { + return this.blurPass.kernelSize; + } + /** + * @type {KernelSize} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : KernelSize.LARGE; + this.blurPass.kernelSize = value; + } + /** + * The overall intensity of the effect. + * + * @type {Number} + */ + + }, { + key: "intensity", + get: function get() { + return this.combineMaterial.uniforms.opacity2.value; + } + /** + * @type {Number} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1.0; + this.combineMaterial.uniforms.opacity2.value = value; + } + /** + * The number of samples per pixel. + * + * @type {Number} + */ + + }, { + key: "samples", + get: function get() { + return Number.parseInt(this.godRaysMaterial.defines.NUM_SAMPLES_INT); + } + /** + * This value must be carefully chosen. A higher value directly increases the + * GPU load. + * + * @type {Number} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 60; + value = Math.floor(value); + this.godRaysMaterial.defines.NUM_SAMPLES_FLOAT = value.toFixed(1); + this.godRaysMaterial.defines.NUM_SAMPLES_INT = value.toFixed(0); + this.godRaysMaterial.needsUpdate = true; + } + /** + * Indicates whether dithering is enabled. + * + * @type {Boolean} + */ + + }, { + key: "dithering", + get: function get() { + return this.godRaysMaterial.dithering; + } + /** + * If enabled, the result will be dithered to remove banding artifacts. + * + * @type {Boolean} + */ + , + set: function set(value) { + if (this.dithering !== value) { + this.godRaysMaterial.dithering = value; + this.godRaysMaterial.needsUpdate = true; + } + } + /** + * Indicates whether the effect should be applied to the input buffer. + * + * @type {Boolean} + */ + + }, { + key: "blend", + get: function get() { + return this.needsSwap; + } + /** + * If disabled, the input buffer will remain unaffected. + * + * You may use the {@link BloomPass#overlay} texture to apply the effect to + * your scene. + * + * @type {Boolean} + */ + , + set: function set(value) { + this.needsSwap = value; + } + /** + * The effect overlay texture. + * + * @type {Texture} + */ + + }, { + key: "overlay", + get: function get() { + return this.renderTargetY.texture; + } + }]); + + inherits(GodRaysPass, _Pass); + + return GodRaysPass; + }(Pass); + + /** + * A mask pass. + */ + + var MaskPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new mask pass. + * + * @param {Scene} scene - The scene to render. + * @param {Camera} camera - The camera to use. + */ + function MaskPass(scene, camera) { + var _this; + + classCallCheck(this, MaskPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(MaskPass).call(this, "MaskPass", scene, camera, null)); + _this.needsSwap = false; + /** + * Inverse flag. + * + * @type {Boolean} + */ + + _this.inverse = false; + /** + * Stencil buffer clear flag. + * + * @type {Boolean} + */ + + _this.clearStencil = true; + return _this; + } + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + + + createClass(MaskPass, [{ + key: "render", + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + var context = renderer.context; + var state = renderer.state; + var scene = this.scene; + var camera = this.camera; + var writeValue = this.inverse ? 0 : 1; + var clearValue = 1 - writeValue; // Don't update color or depth. + + state.buffers.color.setMask(false); + state.buffers.depth.setMask(false); // Lock the buffers. + + state.buffers.color.setLocked(true); + state.buffers.depth.setLocked(true); // Configure the stencil. + + state.buffers.stencil.setTest(true); + state.buffers.stencil.setOp(context.REPLACE, context.REPLACE, context.REPLACE); + state.buffers.stencil.setFunc(context.ALWAYS, writeValue, 0xffffffff); + state.buffers.stencil.setClear(clearValue); // Clear the stencil. + + if (this.clearStencil) { + if (this.renderToScreen) { + renderer.setRenderTarget(null); + renderer.clearStencil(); + } else { + renderer.setRenderTarget(inputBuffer); + renderer.clearStencil(); + renderer.setRenderTarget(outputBuffer); + renderer.clearStencil(); + } + } // Draw the mask. + + + if (this.renderToScreen) { + renderer.render(scene, camera, null); + } else { + renderer.render(scene, camera, inputBuffer); + renderer.render(scene, camera, outputBuffer); + } // Unlock the buffers. + + + state.buffers.color.setLocked(false); + state.buffers.depth.setLocked(false); // Only render where the stencil is set to 1. + + state.buffers.stencil.setFunc(context.EQUAL, 1, 0xffffffff); + state.buffers.stencil.setOp(context.KEEP, context.KEEP, context.KEEP); + } + }]); + + inherits(MaskPass, _Pass); + + return MaskPass; + }(Pass); + + /** + * A shader pass. + * + * Used to render any shader material as a 2D filter. + */ + + var ShaderPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new shader pass. + * + * @param {ShaderMaterial} material - The shader material to use. + * @param {String} [textureID="tDiffuse"] - The texture uniform identifier. + */ + function ShaderPass(material) { + var _this; + + var textureID = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "tDiffuse"; + + classCallCheck(this, ShaderPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(ShaderPass).call(this, "ShaderPass")); + _this.material = material; + /** + * The name of the color sampler uniform of the given material. + * + * @type {String} + */ + + _this.textureID = textureID; + return _this; + } + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + + + createClass(ShaderPass, [{ + key: "render", + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + if (this.material.uniforms[this.textureID] !== undefined) { + this.material.uniforms[this.textureID].value = inputBuffer.texture; + } + + renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer); + } + }]); + + inherits(ShaderPass, _Pass); + + return ShaderPass; + }(Pass); + + /** + * An outline pass. + */ + + var OutlinePass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new outline pass. + * + * @param {Scene} scene - The main scene. + * @param {Camera} camera - The main camera. + * @param {Object} [options] - Additional parameters. See {@link BlurPass}, {@link OutlineBlendMaterial} and {@link OutlineEdgesMaterial} for details. + * @param {Number} [options.pulseSpeed=0.0] - The pulse speed. A value of zero disables the pulse effect. + * @param {Boolean} [options.blur=true] - Whether the outline should be blurred. + */ + function OutlinePass(scene, camera) { + var _this; + + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + classCallCheck(this, OutlinePass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(OutlinePass).call(this, "OutlinePass")); + /** + * The main scene. + * + * @type {Scene} + * @private + */ + + _this.mainScene = scene; + /** + * The main camera. + * + * @type {Camera} + * @private + */ + + _this.mainCamera = camera; + /** + * A render target for depth information. + * + * @type {WebGLRenderTarget} + * @private + */ + + _this.renderTargetDepth = new WebGLRenderTarget(1, 1, { + minFilter: LinearFilter, + magFilter: LinearFilter + }); + _this.renderTargetDepth.texture.name = "Outline.Depth"; + _this.renderTargetDepth.texture.generateMipmaps = false; + /** + * A render target for the outline mask. + * + * @type {WebGLRenderTarget} + * @private + */ + + _this.renderTargetMask = _this.renderTargetDepth.clone(); + _this.renderTargetMask.texture.format = RGBFormat; + _this.renderTargetMask.texture.name = "Outline.Mask"; + /** + * A render target for the edge detection. + * + * @type {WebGLRenderTarget} + * @private + */ + + _this.renderTargetEdges = new WebGLRenderTarget(1, 1, { + minFilter: LinearFilter, + magFilter: LinearFilter, + stencilBuffer: false, + depthBuffer: false, + format: RGBFormat + }); + _this.renderTargetEdges.texture.name = "Outline.Edges"; + _this.renderTargetEdges.texture.generateMipmaps = false; + /** + * A render target for the blurred outline overlay. + * + * @type {WebGLRenderTarget} + * @private + */ + + _this.renderTargetBlurredEdges = _this.renderTargetEdges.clone(); + _this.renderTargetBlurredEdges.texture.name = "Outline.BlurredEdges"; + /** + * A depth pass. + * + * @type {RenderPass} + * @private + */ + + _this.renderPassDepth = new RenderPass(_this.mainScene, _this.mainCamera, { + overrideMaterial: new MeshDepthMaterial({ + depthPacking: RGBADepthPacking, + morphTargets: true, + skinning: true + }), + clearColor: new Color(0xffffff), + clearAlpha: 1.0 + }); + /** + * A depth comparison mask pass. + * + * @type {RenderPass} + * @private + */ + + _this.renderPassMask = new RenderPass(_this.mainScene, _this.mainCamera, { + overrideMaterial: new DepthComparisonMaterial(_this.renderTargetDepth.texture, _this.mainCamera), + clearColor: new Color(0xffffff), + clearAlpha: 1.0 + }); + /** + * A blur pass. + * + * @type {BlurPass} + * @private + */ + + _this.blurPass = new BlurPass(options); + _this.kernelSize = options.kernelSize; + /** + * A copy pass that renders the read buffer to screen if needed. + * + * @type {ShaderPass} + * @private + */ + + _this.copyPass = new ShaderPass(new CopyMaterial()); + _this.copyPass.renderToScreen = true; + /** + * An outline edge detection material. + * + * @type {OutlineEdgesMaterial} + * @private + */ + + _this.outlineEdgesMaterial = new OutlineEdgesMaterial(options); + _this.outlineEdgesMaterial.uniforms.tMask.value = _this.renderTargetMask.texture; + /** + * An outline blend material. + * + * @type {OutlineBlendMaterial} + * @private + */ + + _this.outlineBlendMaterial = new OutlineBlendMaterial(options); + _this.outlineBlendMaterial.uniforms.tMask.value = _this.renderTargetMask.texture; + _this.blur = options.blur !== undefined ? options.blur : true; + /** + * A list of objects to outline. + * + * @type {Object3D[]} + * @private + */ + + _this.selection = []; + /** + * The current animation time. + * + * @type {Number} + * @private + */ + + _this.time = 0.0; + /** + * The pulse speed. A value of zero disables the pulse effect. + * + * @type {Number} + */ + + _this.pulseSpeed = options.pulseSpeed !== undefined ? options.pulseSpeed : 0.0; + /** + * A dedicated render layer for selected objects. + * + * This layer is set to 10 by default. If this collides with your own custom + * layers, please change it to a free layer before rendering! + * + * @type {Number} + */ + + _this.selectionLayer = 10; + return _this; + } + /** + * The resolution scale. + * + * @type {Number} + */ + + + createClass(OutlinePass, [{ + key: "setPatternTexture", + + /** + * Sets a pattern texture to use as an overlay for selected objects. + * + * @param {Texture} [texture=null] - A pattern texture. Set to null to disable the pattern. + */ + value: function setPatternTexture() { + var texture = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + this.outlineBlendMaterial.setPatternTexture(texture); + } + /** + * Clears the current selection and selects a list of objects. + * + * @param {Object3D[]} objects - The objects that should be outlined. This array will be copied. + * @return {OutlinePass} This pass. + */ + + }, { + key: "setSelection", + value: function setSelection(objects) { + var selection = objects.slice(0); + var selectionLayer = this.selectionLayer; + var i, l; + this.clearSelection(); + + for (i = 0, l = selection.length; i < l; ++i) { + selection[i].layers.enable(selectionLayer); + } + + this.selection = selection; + return this; + } + /** + * Clears the list of selected objects. + * + * @return {OutlinePass} This pass. + */ + + }, { + key: "clearSelection", + value: function clearSelection() { + var selection = this.selection; + var selectionLayer = this.selectionLayer; + var i, l; + + for (i = 0, l = selection.length; i < l; ++i) { + selection[i].layers.disable(selectionLayer); + } + + this.selection = []; + this.time = 0.0; + return this; + } + /** + * Selects an object. + * + * @param {Object3D} object - The object that should be outlined. + * @return {OutlinePass} This pass. + */ + + }, { + key: "selectObject", + value: function selectObject(object) { + object.layers.enable(this.selectionLayer); + this.selection.push(object); + return this; + } + /** + * Deselects an object. + * + * @param {Object3D} object - The object that should no longer be outlined. + * @return {OutlinePass} This pass. + */ + + }, { + key: "deselectObject", + value: function deselectObject(object) { + var selection = this.selection; + var index = selection.indexOf(object); + + if (index >= 0) { + selection[index].layers.disable(this.selectionLayer); + selection.splice(index, 1); + + if (selection.length === 0) { + this.time = 0.0; + } + } + + return this; + } + /** + * Sets the visibility of all selected objects. + * + * @private + * @param {Boolean} visible - Whether the selected objects should be visible. + */ + + }, { + key: "setSelectionVisible", + value: function setSelectionVisible(visible) { + var selection = this.selection; + var i, l; + + for (i = 0, l = selection.length; i < l; ++i) { + if (visible) { + selection[i].layers.enable(0); + } else { + selection[i].layers.disable(0); + } + } + } + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + + }, { + key: "render", + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + var mainScene = this.mainScene; + var mainCamera = this.mainCamera; + var pulse = this.outlineBlendMaterial.uniforms.pulse; + var background, mask; + + if (this.selection.length > 0) { + background = mainScene.background; + mask = mainCamera.layers.mask; + mainScene.background = null; + pulse.value = 1.0; + + if (this.pulseSpeed > 0.0) { + pulse.value = 0.625 + Math.cos(this.time * this.pulseSpeed * 10.0) * 0.375; + this.time += delta; + } // Render a custom depth texture and ignore selected objects. + + + this.setSelectionVisible(false); + this.renderPassDepth.render(renderer, this.renderTargetDepth); + this.setSelectionVisible(true); // Create a mask for the selected objects using the depth information. + + mainCamera.layers.mask = 1 << this.selectionLayer; + this.renderPassMask.render(renderer, this.renderTargetMask); // Restore the camera layer mask and the scene background. + + mainCamera.layers.mask = mask; + mainScene.background = background; // Detect the outline. + + this.material = this.outlineEdgesMaterial; + renderer.render(this.scene, this.camera, this.renderTargetEdges); + + if (this.blurPass.enabled) { + // Blur the edges. + this.blurPass.render(renderer, this.renderTargetEdges, this.renderTargetBlurredEdges); + } + + if (this.blend) { + // Draw the final overlay onto the scene colours. + this.material = this.outlineBlendMaterial; + this.outlineBlendMaterial.uniforms.tDiffuse.value = inputBuffer.texture; + renderer.render(this.scene, this.camera, this.renderToScreen ? null : this.outputBuffer); + } + } else if (this.renderToScreen) { + // Draw the read buffer to screen. + this.copyPass.render(renderer, inputBuffer); + } + } + /** + * Updates the size of this pass. + * + * @param {Number} width - The width. + * @param {Number} height - The height. + */ + + }, { + key: "setSize", + value: function setSize(width, height) { + this.renderTargetDepth.setSize(width, height); + this.renderTargetMask.setSize(width, height); + this.renderPassDepth.setSize(width, height); + this.renderPassMask.setSize(width, height); + this.blurPass.setSize(width, height); + width = this.blurPass.width; + height = this.blurPass.height; + this.renderTargetEdges.setSize(width, height); + this.renderTargetBlurredEdges.setSize(width, height); + this.outlineBlendMaterial.uniforms.aspect.value = width / height; + this.outlineEdgesMaterial.setTexelSize(1.0 / width, 1.0 / height); + } + /** + * Performs initialization tasks. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not. + */ + + }, { + key: "initialize", + value: function initialize(renderer, alpha) { + this.renderPassDepth.initialize(renderer, alpha); + this.renderPassMask.initialize(renderer, alpha); + this.blurPass.initialize(renderer, alpha); + } + }, { + key: "resolutionScale", + get: function get() { + return this.blurPass.resolutionScale; + } + /** + * You need to call {@link EffectComposer#setSize} after changing this value. + * + * @type {Number} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0.5; + this.blurPass.resolutionScale = value; + } + /** + * The blur kernel size. + * + * @type {KernelSize} + */ + + }, { + key: "kernelSize", + get: function get() { + return this.blurPass.kernelSize; + } + /** + * @type {KernelSize} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : KernelSize.VERY_SMALL; + this.blurPass.kernelSize = value; + } + /** + * Indicates whether the outline overlay should be blurred. + * + * @type {Boolean} + */ + + }, { + key: "blur", + get: function get() { + return this.blurPass.enabled; + } + /** + * @type {Boolean} + */ + , + set: function set(value) { + this.blurPass.enabled = value; + this.outlineBlendMaterial.uniforms.tEdges.value = value ? this.renderTargetBlurredEdges.texture : this.renderTargetEdges.texture; + } + /** + * Indicates whether dithering is enabled. + * + * @type {Boolean} + */ + + }, { + key: "dithering", + get: function get() { + return this.blurPass.dithering; + } + /** + * If enabled, the result will be dithered to remove banding artifacts. + * + * @type {Boolean} + */ + , + set: function set(value) { + this.blurPass.dithering = value; + } + /** + * Indicates whether the effect should be applied to the input buffer. + * + * @type {Boolean} + */ + + }, { + key: "blend", + get: function get() { + return this.needsSwap; + } + /** + * If disabled, the input buffer will remain unaffected. + * + * You may use the {@link BloomPass#overlay} texture to apply the effect to + * your scene. + * + * @type {Boolean} + */ + , + set: function set(value) { + this.needsSwap = value; + } + /** + * The effect overlay texture. + * + * @type {Texture} + */ + + }, { + key: "overlay", + get: function get() { + return this.outlineBlendMaterial.uniforms.tEdges.value; + } + }]); + + inherits(OutlinePass, _Pass); + + return OutlinePass; + }(Pass); + + /** + * A pixelation pass. + */ + + var PixelationPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new pixelation pass. + * + * @param {Number} [granularity=30.0] - The intensity of the effect. + */ + function PixelationPass() { + var _this; + + var granularity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 30.0; + + classCallCheck(this, PixelationPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(PixelationPass).call(this, "PixelationPass")); + _this.material = new PixelationMaterial(); + _this.granularity = granularity; + return _this; + } + /** + * The pixel granularity. + * + * @type {Number} + */ + + + createClass(PixelationPass, [{ + key: "render", + + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + this.material.uniforms.tDiffuse.value = inputBuffer.texture; + renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer); + } + /** + * Updates the size of this pass. + * + * @param {Number} width - The width. + * @param {Number} height - The height. + */ + + }, { + key: "setSize", + value: function setSize(width, height) { + this.material.setResolution(width, height); + } + }, { + key: "granularity", + get: function get() { + return this.material.granularity; + } + /** + * A higher value yields coarser visuals. + * + * @type {Number} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 30; + value = Math.floor(value); + + if (value % 2 > 0) { + value += 1; + } + + this.material.granularity = value; + } + }]); + + inherits(PixelationPass, _Pass); + + return PixelationPass; + }(Pass); + + /** + * An advanced Depth of Field (DoF) pass. + * + * Yields more realistic results but is also more demanding. + * + * This pass requires a {@link EffectComposer#depthTexture}. + */ + + var RealisticBokehPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new bokeh pass. + * + * @param {PerspectiveCamera} camera - The main camera. Used to obtain the focal length and the near and far plane settings. + * @param {Object} [options] - Additional parameters. See {@link RealisticBokehMaterial} for details. + */ + function RealisticBokehPass(camera) { + var _this; + + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + classCallCheck(this, RealisticBokehPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(RealisticBokehPass).call(this, "RealisticBokehPass")); + _this.material = new RealisticBokehMaterial(camera, options); + return _this; + } + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + + + createClass(RealisticBokehPass, [{ + key: "render", + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + this.material.uniforms.tDiffuse.value = inputBuffer.texture; + this.material.uniforms.tDepth.value = inputBuffer.depthTexture; + renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer); + } + /** + * Updates the size of this pass. + * + * @param {Number} width - The width. + * @param {Number} height - The height. + */ + + }, { + key: "setSize", + value: function setSize(width, height) { + this.material.setTexelSize(1.0 / width, 1.0 / height); + } + }]); + + inherits(RealisticBokehPass, _Pass); + + return RealisticBokehPass; + }(Pass); + + /** + * A pass that renders the result from a previous pass to another render target. + */ + + var SavePass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new save pass. + * + * @param {WebGLRenderTarget} [renderTarget] - The render target to use for saving the input buffer. + * @param {Boolean} [resize=true] - Whether the render target should adjust to the size of the input buffer. + */ + function SavePass(renderTarget) { + var _this; + + var resize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + + classCallCheck(this, SavePass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(SavePass).call(this, "SavePass")); + _this.material = new CopyMaterial(); + _this.needsSwap = false; + /** + * The render target. + * + * @type {WebGLRenderTarget} + */ + + _this.renderTarget = renderTarget !== undefined ? renderTarget : new WebGLRenderTarget(1, 1, { + minFilter: LinearFilter, + magFilter: LinearFilter, + stencilBuffer: false, + depthBuffer: false + }); + _this.renderTarget.texture.name = "Save.Target"; + _this.renderTarget.texture.generateMipmaps = false; + /** + * Indicates whether the render target should be resized when the size of + * the composer's frame buffer changes. + * + * @type {Boolean} + */ + + _this.resize = resize; + return _this; + } + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + + + createClass(SavePass, [{ + key: "render", + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + this.material.uniforms.tDiffuse.value = inputBuffer.texture; + renderer.render(this.scene, this.camera, this.renderTarget); + } + /** + * Updates the size of this pass. + * + * @param {Number} width - The width. + * @param {Number} height - The height. + */ + + }, { + key: "setSize", + value: function setSize(width, height) { + if (this.resize) { + width = Math.max(1, width); + height = Math.max(1, height); + this.renderTarget.setSize(width, height); + } + } + /** + * Performs initialization tasks. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not. + */ + + }, { + key: "initialize", + value: function initialize(renderer, alpha) { + if (!alpha) { + this.renderTarget.texture.format = RGBFormat; + } + } + }]); + + inherits(SavePass, _Pass); + + return SavePass; + }(Pass); + + /** + * Half PI. + * + * @type {Number} + * @private + */ + + var HALF_PI = Math.PI * 0.5; + /** + * A vector. + * + * @type {Vector3} + * @private + */ + + var v = new Vector3(); + /** + * A vector. + * + * @type {Vector3} + * @private + */ + + var ab = new Vector3(); + /** + * A shock wave pass. + */ + + var ShockWavePass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new shock wave pass. + * + * @param {Camera} camera - The main camera. + * @param {Vector3} [epicenter] - The world position of the shock wave epicenter. + * @param {Object} [options] - The options. + * @param {Number} [options.speed=1.0] - The animation speed. + * @param {Number} [options.maxRadius=1.0] - The extent of the shock wave. + * @param {Number} [options.waveSize=0.2] - The wave size. + * @param {Number} [options.amplitude=0.05] - The distortion amplitude. + */ + function ShockWavePass(camera) { + var _this; + + var epicenter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Vector3(); + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + classCallCheck(this, ShockWavePass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(ShockWavePass).call(this, "ShockWavePass")); + /** + * The main camera. + * + * @type {Object3D} + */ + + _this.mainCamera = camera; + /** + * The epicenter. + * + * @type {Vector3} + * @example shockWavePass.epicenter = myMesh.position; + */ + + _this.epicenter = epicenter; + /** + * The object position in screen space. + * + * @type {Vector3} + * @private + */ + + _this.screenPosition = new Vector3(); + /** + * The speed of the shock wave animation. + * + * @type {Number} + */ + + _this.speed = options.speed !== undefined ? options.speed : 2.0; + /** + * A time accumulator. + * + * @type {Number} + * @private + */ + + _this.time = 0.0; + /** + * Indicates whether the shock wave animation is active. + * + * @type {Boolean} + * @private + */ + + _this.active = false; + /** + * A shock wave shader material. + * + * @type {ShockWaveMaterial} + * @private + */ + + _this.shockWaveMaterial = new ShockWaveMaterial(options); + _this.shockWaveMaterial.uniforms.center.value = _this.screenPosition; + /** + * A copy shader material. + * + * @type {CopyMaterial} + * @private + */ + + _this.copyMaterial = new CopyMaterial(); + return _this; + } + /** + * Emits the shock wave. + */ + + + createClass(ShockWavePass, [{ + key: "explode", + value: function explode() { + this.time = 0.0; + this.active = true; + } + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + + }, { + key: "render", + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + var epicenter = this.epicenter; + var mainCamera = this.mainCamera; + var screenPosition = this.screenPosition; + var shockWaveMaterial = this.shockWaveMaterial; + var uniforms = shockWaveMaterial.uniforms; + var center = uniforms.center; + var radius = uniforms.radius; + var maxRadius = uniforms.maxRadius; + var waveSize = uniforms.waveSize; + this.copyMaterial.uniforms.tDiffuse.value = inputBuffer.texture; + this.material = this.copyMaterial; + + if (this.active) { + // Calculate direction vectors. + mainCamera.getWorldDirection(v); + ab.copy(mainCamera.position).sub(epicenter); // Don't render the effect if the object is behind the camera. + + if (v.angleTo(ab) > HALF_PI) { + // Scale the effect based on distance to the object. + uniforms.cameraDistance.value = mainCamera.position.distanceTo(epicenter); // Calculate the screen position of the epicenter. + + screenPosition.copy(epicenter).project(mainCamera); + center.value.x = (screenPosition.x + 1.0) * 0.5; + center.value.y = (screenPosition.y + 1.0) * 0.5; + uniforms.tDiffuse.value = inputBuffer.texture; + this.material = shockWaveMaterial; + } // Update the shock wave radius based on time. + + + this.time += delta * this.speed; + radius.value = this.time - waveSize.value; + + if (radius.value >= (maxRadius.value + waveSize.value) * 2) { + this.active = false; + } + } + + renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer); + } + /** + * Updates the size of this pass. + * + * @param {Number} width - The width. + * @param {Number} height - The height. + */ + + }, { + key: "setSize", + value: function setSize(width, height) { + this.shockWaveMaterial.uniforms.aspect.value = width / height; + } + }]); + + inherits(ShockWavePass, _Pass); + + return ShockWavePass; + }(Pass); + + // Generated with SMAASearchImageData.generate().toCanvas().toDataURL(), not cropped, low dynamic range. + var searchImageDataURL = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAAAhCAAAAABIXyLAAAAAOElEQVRIx2NgGAWjYBSMglEwEICREYRgFBZBqDCSLA2MGPUIVQETE9iNUAqLR5gIeoQKRgwXjwAAGn4AtaFeYLEAAAAASUVORK5CYII"; + + // Generated with SMAAAreaImageData.generate().toCanvas().toDataURL(). + var areaImageDataURL = "data:image/png;base64,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"; + + /** + * Subpixel Morphological Antialiasing (SMAA) v2.8. + * + * Preset: SMAA 1x Medium (with color edge detection). + * https://github.com/iryoku/smaa/releases/tag/v2.8 + */ + + var SMAAPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new SMAA pass. + * + * @param {Image} searchImage - The SMAA search image. Preload this image using the {@link searchImageDataURL}. + * @param {Image} areaImage - The SMAA area image. Preload this image using the {@link areaImageDataURL}. + */ + function SMAAPass(searchImage, areaImage) { + var _this; + + classCallCheck(this, SMAAPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(SMAAPass).call(this, "SMAAPass")); + /** + * A clear pass for the color edges buffer. + * + * @type {ClearPass} + * @private + */ + + _this.clearPass = new ClearPass({ + clearColor: new Color(0x000000), + clearAlpha: 1.0 + }); + /** + * A render target for the color edge detection. + * + * @type {WebGLRenderTarget} + * @private + */ + + _this.renderTargetColorEdges = new WebGLRenderTarget(1, 1, { + minFilter: LinearFilter, + format: RGBFormat, + stencilBuffer: false, + depthBuffer: false + }); + _this.renderTargetColorEdges.texture.name = "SMAA.ColorEdges"; + _this.renderTargetColorEdges.texture.generateMipmaps = false; + /** + * A render target for the SMAA weights. + * + * @type {WebGLRenderTarget} + * @private + */ + + _this.renderTargetWeights = _this.renderTargetColorEdges.clone(); + _this.renderTargetWeights.texture.name = "SMAA.Weights"; + _this.renderTargetWeights.texture.format = RGBAFormat; + /** + * Color edge detection shader material. + * + * @type {ColorEdgesMaterial} + * @private + */ + + _this.colorEdgesMaterial = new ColorEdgesMaterial(); + /** + * SMAA weights shader material. + * + * @type {SMAAWeightsMaterial} + * @private + */ + + _this.weightsMaterial = new SMAAWeightsMaterial(); + _this.weightsMaterial.uniforms.tDiffuse.value = _this.renderTargetColorEdges.texture; + /** + * The SMAA search texture. + * + * @type {Texture} + * @private + */ + + _this.searchTexture = new Texture(searchImage); + _this.searchTexture.name = "SMAA.Search"; + _this.searchTexture.magFilter = NearestFilter; + _this.searchTexture.minFilter = NearestFilter; + _this.searchTexture.format = RGBAFormat; + _this.searchTexture.generateMipmaps = false; + _this.searchTexture.needsUpdate = true; + _this.searchTexture.flipY = false; + _this.weightsMaterial.uniforms.tSearch.value = _this.searchTexture; + /** + * The SMAA area texture. + * + * @type {Texture} + * @private + */ + + _this.areaTexture = new Texture(areaImage); + _this.areaTexture.name = "SMAA.Area"; + _this.areaTexture.minFilter = LinearFilter; + _this.areaTexture.format = RGBAFormat; + _this.areaTexture.generateMipmaps = false; + _this.areaTexture.needsUpdate = true; + _this.areaTexture.flipY = false; + _this.weightsMaterial.uniforms.tArea.value = _this.areaTexture; + /** + * SMAA blend shader material. + * + * @type {SMAABlendMaterial} + * @private + */ + + _this.blendMaterial = new SMAABlendMaterial(); + _this.blendMaterial.uniforms.tWeights.value = _this.renderTargetWeights.texture; + return _this; + } + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + + + createClass(SMAAPass, [{ + key: "render", + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + // Detect color edges. + this.material = this.colorEdgesMaterial; + this.colorEdgesMaterial.uniforms.tDiffuse.value = inputBuffer.texture; + this.clearPass.render(renderer, this.renderTargetColorEdges); + renderer.render(this.scene, this.camera, this.renderTargetColorEdges); // Compute edge weights. + + this.material = this.weightsMaterial; + renderer.render(this.scene, this.camera, this.renderTargetWeights); // Apply the antialiasing filter to the colors. + + this.material = this.blendMaterial; + this.blendMaterial.uniforms.tDiffuse.value = inputBuffer.texture; + renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer); + } + /** + * Updates the size of this pass. + * + * @param {Number} width - The width. + * @param {Number} height - The height. + */ + + }, { + key: "setSize", + value: function setSize(width, height) { + this.renderTargetColorEdges.setSize(width, height); + this.renderTargetWeights.setSize(width, height); + this.colorEdgesMaterial.uniforms.texelSize.value.copy(this.weightsMaterial.uniforms.texelSize.value.copy(this.blendMaterial.uniforms.texelSize.value.set(1.0 / width, 1.0 / height))); + } + /** + * The SMAA search image, encoded as a base64 data URL. + * + * Use this image data to create an Image instance and use it together with + * the area image to create an SMAAPass. + * + * @type {String} + * @example + * const searchImage = new Image(); + * searchImage.addEventListener("load", progress); + * searchImage.src = SMAAPass.searchImageDataURL; + */ + + }], [{ + key: "searchImageDataURL", + get: function get() { + return searchImageDataURL; + } + /** + * The SMAA area image, encoded as a base64 data URL. + * + * Use this image data to create an Image instance and use it together with + * the search image to create an SMAAPass. + * + * @type {String} + * @example + * const areaImage = new Image(); + * areaImage.addEventListener("load", progress); + * areaImage.src = SMAAPass.areaImageDataURL; + */ + + }, { + key: "areaImageDataURL", + get: function get() { + return areaImageDataURL; + } + }]); + + inherits(SMAAPass, _Pass); + + return SMAAPass; + }(Pass); + + /** + * A pass that renders a given texture. + */ + + var TexturePass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new texture pass. + * + * @param {Texture} texture - The texture. + * @param {Number} [opacity=1.0] - The texture opacity. + * @param {Boolean} [screenMode=true] - Whether the screen blend mode should be used for combining the texture with the scene colors. + */ + function TexturePass(texture) { + var _this; + + var opacity = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1.0; + var screenMode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + + classCallCheck(this, TexturePass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(TexturePass).call(this, "TexturePass")); + _this.material = new CombineMaterial(screenMode); + _this.texture = texture; + _this.opacitySource = opacity; + return _this; + } + /** + * The texture. + * + * @type {Texture} + */ + + + createClass(TexturePass, [{ + key: "render", + + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + this.material.uniforms.texture1.value = inputBuffer.texture; + renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer); + } + }, { + key: "texture", + get: function get() { + return this.material.uniforms.texture2.value; + } + /** + * @type {Texture} + */ + , + set: function set(value) { + this.material.uniforms.texture2.value = value; + } + /** + * The opacity of the input buffer. + * + * The destination color is the color from the image in the input buffer. + * + * @type {Number} + */ + + }, { + key: "opacityDestination", + get: function get() { + return this.material.uniforms.opacity1.value; + } + /** + * @type {Number} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1.0; + this.material.uniforms.opacity1.value = value; + } + /** + * The opacity of the texture. + * + * The source color is the color from the texture. + * + * @type {Number} + */ + + }, { + key: "opacitySource", + get: function get() { + return this.material.uniforms.opacity2.value; + } + /** + * @type {Number} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1.0; + this.material.uniforms.opacity2.value = value; + } + }]); + + inherits(TexturePass, _Pass); + + return TexturePass; + }(Pass); + + /** + * A tone mapping pass that supports adaptive luminosity. + * + * If adaptivity is enabled, this pass generates a texture that represents the + * luminosity of the current scene and adjusts it over time to simulate the + * optic nerve responding to the amount of light it is receiving. + * + * Reference: + * GDC2007 - Wolfgang Engel, Post-Processing Pipeline + * http://perso.univ-lyon1.fr/jean-claude.iehl/Public/educ/GAMA/2007/gdc07/Post-Processing_Pipeline.pdf + */ + + var ToneMappingPass = + /*#__PURE__*/ + function (_Pass) { + /** + * Constructs a new tone mapping pass. + * + * @param {Object} [options] - The options. + * @param {Boolean} [options.adaptive=true] - Whether the tone mapping should use an adaptive luminance map. + * @param {Number} [options.resolution=256] - The render texture resolution. + * @param {Number} [options.distinction=1.0] - A luminance distinction factor. + */ + function ToneMappingPass() { + var _this; + + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, ToneMappingPass); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(ToneMappingPass).call(this, "ToneMappingPass")); + /** + * The render target for the current luminosity. + * + * @type {WebGLRenderTarget} + * @private + * @todo Use RED format in WebGL 2.0. + */ + + _this.renderTargetLuminosity = new WebGLRenderTarget(1, 1, { + minFilter: LinearMipMapLinearFilter, + magFilter: LinearFilter, + format: RGBFormat, + stencilBuffer: false, + depthBuffer: false + }); + _this.renderTargetLuminosity.texture.name = "ToneMapping.Luminosity"; + /** + * The render target for adapted luminosity. + * + * @type {WebGLRenderTarget} + * @private + */ + + _this.renderTargetAdapted = _this.renderTargetLuminosity.clone(); + _this.renderTargetAdapted.texture.name = "ToneMapping.AdaptedLuminosity"; + _this.renderTargetAdapted.texture.generateMipmaps = false; + _this.renderTargetAdapted.texture.minFilter = LinearFilter; + /** + * A render target that holds a copy of the adapted limonosity. + * + * @type {WebGLRenderTarget} + * @private + */ + + _this.renderTargetPrevious = _this.renderTargetAdapted.clone(); + _this.renderTargetPrevious.texture.name = "ToneMapping.PreviousLuminosity"; + /** + * Copy shader material used for saving the luminance map. + * + * @type {CopyMaterial} + * @private + */ + + _this.copyMaterial = new CopyMaterial(); + /** + * A luminosity shader material. + * + * @type {LuminosityMaterial} + * @private + */ + + _this.luminosityMaterial = new LuminosityMaterial(); + _this.luminosityMaterial.uniforms.distinction.value = options.distinction !== undefined ? options.distinction : 1.0; + /** + * An adaptive luminance shader material. + * + * @type {AdaptiveLuminosityMaterial} + * @private + */ + + _this.adaptiveLuminosityMaterial = new AdaptiveLuminosityMaterial(); + _this.resolution = options.resolution; + /** + * A tone mapping shader material. + * + * @type {ToneMappingMaterial} + * @private + */ + + _this.toneMappingMaterial = new ToneMappingMaterial(); + _this.adaptive = options.adaptive; + return _this; + } + /** + * The resolution of the render targets. + * + * @type {Number} + */ + + + createClass(ToneMappingPass, [{ + key: "render", + + /** + * Renders the effect. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. + * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. + * @param {Number} [delta] - The time between the last frame and the current one in seconds. + * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. + */ + value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) { + var scene = this.scene; + var camera = this.camera; + var adaptiveLuminosityMaterial = this.adaptiveLuminosityMaterial; + var luminosityMaterial = this.luminosityMaterial; + var toneMappingMaterial = this.toneMappingMaterial; + var copyMaterial = this.copyMaterial; + var renderTargetPrevious = this.renderTargetPrevious; + var renderTargetLuminosity = this.renderTargetLuminosity; + var renderTargetAdapted = this.renderTargetAdapted; + + if (this.adaptive) { + // Render the luminance of the current scene into a render target with mipmapping enabled. + this.material = luminosityMaterial; + luminosityMaterial.uniforms.tDiffuse.value = inputBuffer.texture; + renderer.render(scene, camera, renderTargetLuminosity); // Use the new luminance values, the previous luminance and the frame delta to adapt the luminance over time. + + this.material = adaptiveLuminosityMaterial; + adaptiveLuminosityMaterial.uniforms.delta.value = delta; + adaptiveLuminosityMaterial.uniforms.tPreviousLum.value = renderTargetPrevious.texture; + adaptiveLuminosityMaterial.uniforms.tCurrentLum.value = renderTargetLuminosity.texture; + renderer.render(scene, camera, renderTargetAdapted); // Copy the new adapted luminance value so that it can be used by the next frame. + + this.material = copyMaterial; + copyMaterial.uniforms.tDiffuse.value = renderTargetAdapted.texture; + renderer.render(scene, camera, renderTargetPrevious); + } // Apply the tone mapping to the colours. + + + this.material = toneMappingMaterial; + toneMappingMaterial.uniforms.tDiffuse.value = inputBuffer.texture; + renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer); + } + /** + * Performs initialization tasks. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not. + */ + + }, { + key: "initialize", + value: function initialize(renderer, alpha) { + this.material = new MeshBasicMaterial({ + color: 0x7fffff + }); + renderer.render(this.scene, this.camera, this.renderTargetPrevious); + this.material.dispose(); + } + }, { + key: "resolution", + get: function get() { + return this.renderTargetLuminosity.width; + } + /** + * The resolution of the render targets. Must be a power of two for mipmaps. + * + * @type {Number} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 256; + // Round the given value to the next power of two. + var exponent = Math.max(0, Math.ceil(Math.log2(value))); + value = Math.pow(2, exponent); + this.renderTargetLuminosity.setSize(value, value); + this.renderTargetPrevious.setSize(value, value); + this.renderTargetAdapted.setSize(value, value); + this.adaptiveLuminosityMaterial.defines.MIP_LEVEL_1X1 = exponent.toFixed(1); + this.adaptiveLuminosityMaterial.needsUpdate = true; + } + /** + * Whether this pass uses adaptive luminosity. + * + * @type {Boolean} + * @default true + */ + + }, { + key: "adaptive", + get: function get() { + return this.toneMappingMaterial.defines.ADAPTED_LUMINANCE !== undefined; + } + /** + * Whether this pass should use adaptive luminosity. + * + * @type {Boolean} + */ + , + set: function set() { + var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + + if (value) { + this.toneMappingMaterial.defines.ADAPTED_LUMINANCE = "1"; + this.toneMappingMaterial.uniforms.luminanceMap.value = this.renderTargetAdapted.texture; + } else { + delete this.toneMappingMaterial.defines.ADAPTED_LUMINANCE; + this.toneMappingMaterial.uniforms.luminanceMap.value = null; + } + + this.toneMappingMaterial.needsUpdate = true; + } + /** + * Indicates whether dithering is enabled. + * + * @type {Boolean} + */ + + }, { + key: "dithering", + get: function get() { + return this.toneMappingMaterial.dithering; + } + /** + * If enabled, the result will be dithered to remove banding artifacts. + * + * @type {Boolean} + */ + , + set: function set(value) { + if (this.dithering !== value) { + this.toneMappingMaterial.dithering = value; + this.toneMappingMaterial.needsUpdate = true; + } + } + }]); + + inherits(ToneMappingPass, _Pass); + + return ToneMappingPass; + }(Pass); + + /** + * A compilation of the post processing passes. + * + * @module postprocessing/passes + */ + + /** + * The EffectComposer may be used in place of a normal WebGLRenderer. + * + * The auto clear behaviour of the provided renderer will be disabled to prevent + * unnecessary clear operations. + * + * It is common practice to use a {@link RenderPass} as the first pass to + * automatically clear the screen and render the scene to a texture for further + * processing. + * + * @implements {Resizable} + * @implements {Disposable} + */ + + var EffectComposer = + /*#__PURE__*/ + function () { + /** + * Constructs a new effect composer. + * + * @param {WebGLRenderer} [renderer] - The renderer that should be used. + * @param {Object} [options] - The options. + * @param {Boolean} [options.depthBuffer=true] - Whether the main render targets should have a depth buffer. + * @param {Boolean} [options.stencilBuffer=false] - Whether the main render targets should have a stencil buffer. + * @param {Boolean} [options.depthTexture=false] - Set to true if one of your passes relies on a depth texture. + */ + function EffectComposer() { + var renderer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + classCallCheck(this, EffectComposer); + + /** + * The renderer. + * + * You may replace the renderer at any time by using + * {@link EffectComposer#replaceRenderer}. + * + * @type {WebGLRenderer} + */ + this.renderer = renderer; + /** + * The input buffer. + * + * Reading from and writing to the same render target should be avoided. + * Therefore, two seperate yet identical buffers are used. + * + * @type {WebGLRenderTarget} + * @private + */ + + this.inputBuffer = null; + /** + * The output buffer. + * + * @type {WebGLRenderTarget} + * @private + */ + + this.outputBuffer = null; + + if (this.renderer !== null) { + this.renderer.autoClear = false; + this.inputBuffer = this.createBuffer(options.depthBuffer !== undefined ? options.depthBuffer : true, options.stencilBuffer !== undefined ? options.stencilBuffer : false, options.depthTexture !== undefined ? options.depthTexture : false); + this.outputBuffer = this.inputBuffer.clone(); + } + /** + * A copy pass used for copying masked scenes. + * + * @type {ShaderPass} + * @private + */ + + + this.copyPass = new ShaderPass(new CopyMaterial()); + /** + * The passes. + * + * @type {Pass[]} + * @private + */ + + this.passes = []; + } + /** + * The depth texture of the input and output buffers. + * + * @type {DepthTexture} + */ + + + createClass(EffectComposer, [{ + key: "replaceRenderer", + + /** + * Replaces the current renderer with the given one. The DOM element of the + * current renderer will automatically be removed from its parent node and the + * DOM element of the new renderer will take its place. + * + * The auto clear mechanism of the provided renderer will be disabled. + * + * Switching between renderers allows you to dynamically enable or disable + * antialiasing. + * + * @param {WebGLRenderer} renderer - The new renderer. + * @return {WebGLRenderer} The old renderer. + */ + value: function replaceRenderer(renderer) { + var oldRenderer = this.renderer; + var parent, oldSize, newSize; + + if (oldRenderer !== null && oldRenderer !== renderer) { + this.renderer = renderer; + this.renderer.autoClear = false; + parent = oldRenderer.domElement.parentNode; + oldSize = oldRenderer.getSize(); + newSize = renderer.getSize(); + + if (parent !== null) { + parent.removeChild(oldRenderer.domElement); + parent.appendChild(renderer.domElement); + } + + if (oldSize.width !== newSize.width || oldSize.height !== newSize.height) { + this.setSize(); + } + } + + return oldRenderer; + } + /** + * Creates a new render target by replicating the renderer's canvas. + * + * The created render target uses a linear filter for texel minification and + * magnification. Its render texture format depends on whether the renderer + * uses the alpha channel. Mipmaps are disabled. + * + * @param {Boolean} depthBuffer - Whether the render target should have a depth buffer. + * @param {Boolean} stencilBuffer - Whether the render target should have a stencil buffer. + * @param {Boolean} depthTexture - Whether the render target should have a depth texture. + * @return {WebGLRenderTarget} A new render target that equals the renderer's canvas. + */ + + }, { + key: "createBuffer", + value: function createBuffer(depthBuffer, stencilBuffer, depthTexture) { + var drawingBufferSize = this.renderer.getDrawingBufferSize(); + var alpha = this.renderer.context.getContextAttributes().alpha; + var renderTarget = new WebGLRenderTarget(drawingBufferSize.width, drawingBufferSize.height, { + minFilter: LinearFilter, + magFilter: LinearFilter, + format: alpha ? RGBAFormat : RGBFormat, + depthBuffer: depthBuffer, + stencilBuffer: stencilBuffer, + depthTexture: depthTexture ? new DepthTexture() : null + }); + + if (depthTexture && stencilBuffer) { + renderTarget.depthTexture.format = DepthStencilFormat; + renderTarget.depthTexture.type = UnsignedInt248Type; + } + + renderTarget.texture.name = "EffectComposer.Buffer"; + renderTarget.texture.generateMipmaps = false; + return renderTarget; + } + /** + * Adds a pass, optionally at a specific index. + * + * @param {Pass} pass - A new pass. + * @param {Number} [index] - An index at which the pass should be inserted. + */ + + }, { + key: "addPass", + value: function addPass(pass, index) { + var renderer = this.renderer; + var drawingBufferSize = renderer.getDrawingBufferSize(); + pass.setSize(drawingBufferSize.width, drawingBufferSize.height); + pass.initialize(renderer, renderer.context.getContextAttributes().alpha); + + if (index !== undefined) { + this.passes.splice(index, 0, pass); + } else { + this.passes.push(pass); + } + } + /** + * Removes a pass. + * + * @param {Pass} pass - The pass. + */ + + }, { + key: "removePass", + value: function removePass(pass) { + this.passes.splice(this.passes.indexOf(pass), 1); + } + /** + * Renders all enabled passes in the order in which they were added. + * + * @param {Number} delta - The time between the last frame and the current one in seconds. + */ + + }, { + key: "render", + value: function render(delta) { + var passes = this.passes; + var copyPass = this.copyPass; + var renderer = this.renderer; + var inputBuffer = this.inputBuffer; + var outputBuffer = this.outputBuffer; + var stencilTest = false; + var pass, context, state, buffer; + var i, l; + + for (i = 0, l = passes.length; i < l; ++i) { + pass = passes[i]; + + if (pass.enabled) { + pass.render(renderer, inputBuffer, outputBuffer, delta, stencilTest); + + if (pass.needsSwap) { + if (stencilTest) { + copyPass.renderToScreen = pass.renderToScreen; + context = renderer.context; + state = renderer.state; // Preserve the unaffected pixels. + + state.buffers.stencil.setFunc(context.NOTEQUAL, 1, 0xffffffff); + copyPass.render(renderer, inputBuffer, outputBuffer, delta, stencilTest); + state.buffers.stencil.setFunc(context.EQUAL, 1, 0xffffffff); + } + + buffer = inputBuffer; + inputBuffer = outputBuffer; + outputBuffer = buffer; + } + + if (pass instanceof MaskPass) { + stencilTest = true; + } else if (pass instanceof ClearMaskPass) { + stencilTest = false; + } + } + } + } + /** + * Sets the size of the buffers and the renderer's output canvas. + * + * Every pass will be informed of the new size. It's up to each pass how that + * information is used. + * + * If no width or height is specified, the render targets and passes will be + * updated with the current size of the renderer. + * + * @param {Number} [width] - The width. + * @param {Number} [height] - The height. + */ + + }, { + key: "setSize", + value: function setSize(width, height) { + var passes = this.passes; + var renderer = this.renderer; + var size, drawingBufferSize; + var i, l; + + if (width === undefined || height === undefined) { + size = renderer.getSize(); + width = size.width; + height = size.height; + } // Update the logical render size. + + + renderer.setSize(width, height); // The drawing buffer size takes the device pixel ratio into account. + + drawingBufferSize = renderer.getDrawingBufferSize(); + this.inputBuffer.setSize(drawingBufferSize.width, drawingBufferSize.height); + this.outputBuffer.setSize(drawingBufferSize.width, drawingBufferSize.height); + + for (i = 0, l = passes.length; i < l; ++i) { + passes[i].setSize(drawingBufferSize.width, drawingBufferSize.height); + } + } + /** + * Resets this composer by deleting all passes and creating new buffers. + */ + + }, { + key: "reset", + value: function reset() { + var renderTarget = this.createBuffer(this.inputBuffer.depthBuffer, this.inputBuffer.stencilBuffer, this.inputBuffer.depthTexture !== null); + this.dispose(); // Reanimate. + + this.inputBuffer = renderTarget; + this.outputBuffer = renderTarget.clone(); + this.copyPass = new ShaderPass(new CopyMaterial()); + } + /** + * Destroys this composer and all passes. + * + * This method deallocates all disposable objects created by the passes. It + * also deletes the main frame buffers of this composer. + */ + + }, { + key: "dispose", + value: function dispose() { + var passes = this.passes; + var i, l; + + for (i = 0, l = passes.length; i < l; ++i) { + passes[i].dispose(); + } + + this.passes = []; + + if (this.inputBuffer !== null) { + this.inputBuffer.dispose(); + this.inputBuffer = null; + } + + if (this.outputBuffer !== null) { + this.outputBuffer.dispose(); + this.outputBuffer = null; + } + + this.copyPass.dispose(); + } + }, { + key: "depthTexture", + get: function get() { + return this.inputBuffer.depthTexture; + } + /** + * The input and output buffers share a single depth texture. Depth will be + * written to this texture when something is rendered into one of the buffers + * and the involved materials have depth write enabled. + * + * You may enable this mechanism during the instantiation of the composer or + * by assigning a DepthTexture instance later on. You may also disable it by + * assigning null. + * + * @type {DepthTexture} + */ + , + set: function set(x) { + this.inputBuffer.depthTexture = x; + this.outputBuffer.depthTexture = x; + } + }]); + + return EffectComposer; + }(); + + var polyfill = function polyfill(object, method) { + var showWarn = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + if (object[method]) return; + if (showWarn) console.warn("@PostProcessorModule: pass.".concat(method, "() was not found."), object); + + object[method] = function () {}; + }; + /** + * @class PostProcessorModule + * @category modules/app + * @param {Object} [params] + * @memberof module:modules/app + * @example Creating a rendering module and passing it to App's modules + * new App([ + * new ElementModule(), + * new SceneModule(), + * new DefineModule('camera', new WHS.PerspectiveCamera({ + * position: new THREE.Vector3(0, 6, 18), + * far: 10000 + * })), + * new RenderingModule(), + * new PostProcessorModule() + * ]); + * + * const processor = app.use('postprocessor'); + * + * processor + * .render() + * .pass(new GlitchPass()) + * .renderToScreen() + */ + + + var PostProcessorModule = + /*#__PURE__*/ + function () { + function PostProcessorModule() { + var _this = this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : PostProcessorModule.defaults; + + classCallCheck(this, PostProcessorModule); + + defineProperty$3(defineProperty$3(this, "currentPass", null), "defer", new Promise(function (resolve) { + _this.resolve = resolve; + })); + + this.debug = params.debug; + this.params = params; + } + + createClass(PostProcessorModule, [{ + key: "manager", + value: function manager(_manager) { + var _this2 = this; + + _manager.define('postprocessor'); + + this.effects = _manager.use('rendering').effects; + this.renderer = _manager.get('renderer'); + this.scene = _manager.get('scene'); + this.camera = _manager.get('camera'); + this.composer = new EffectComposer(this.renderer, this.params); + + _manager.use('rendering').stop(); + + var composer = this.composer; + this.renderLoop = new Loop(function (clock) { + return composer.render(clock.getDelta()); + }).start(_manager.handler); + + _manager.update({ + renderer: function renderer(_renderer) { + _this2.composer.replaceRenderer(_renderer); + }, + scene: function scene(_scene) { + _this2.scene = _scene; + }, + camera: function camera(_camera) { + _this2.camera = _camera; + } + }); + + this.resolve(); + } + /** + * @method render + * @description Adds RenderPass + * @return {this} + * @memberof module:modules/app.PostProcessorModule + */ + + }, { + key: "render", + value: function render() { + var _this3 = this; + + this.defer.then(function () { + var pass = new RenderPass(_this3.scene, _this3.camera.native); // TODO: Support for effects. + + _this3.composer.addPass(pass); + + _this3.currentPass = pass; + }); + return this; + } + /** + * @method pass + * @description Adds your custom pass + * @param {Pass} pass A custom pass + * @return {this} + * @memberof module:modules/app.PostProcessorModule + */ + + }, { + key: "pass", + value: function pass(_pass) { + var _this4 = this; + + this.defer.then(function () { + polyfill(_pass, 'setSize', _this4.debug); + polyfill(_pass, 'initialise', _this4.debug); + + _this4.composer.addPass(_pass); + + _this4.currentPass = _pass; + }); + return this; + } + /** + * @method shader + * @description Adds a pass made from shader material + * @param {Material} material A ShaderMaterial + * @param {String} textureID Name of the readBuffer uniform + * @return {this} + * @memberof module:modules/app.PostProcessorModule + */ + + }, { + key: "shader", + value: function shader(material) { + var _this5 = this; + + var textureID = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'readBuffer'; + this.defer.then(function () { + if (!material.uniforms[textureID]) material.uniforms[textureID] = { + value: null + }; + var pass = new ShaderPass(material, textureID); + + _this5.composer.addPass(pass); + + _this5.currentPass = pass; + }); + return this; + } + /** + * @method get + * @description Returns a pass by the given name + * @param {String} name The name of the pass + * @return {this} + * @memberof module:modules/app.PostProcessorModule + */ + + }, { + key: "get", + value: function get(name) { + return name ? this.composer.passes.filter(function (pass) { + return pass.name === name; + })[0] : this.currentPass; + } + /** + * @method renderToScreen + * @description Sets the renderToScreen property of currentPass + * @param {String} [name=true] The name of the pass + * @return {this} + * @memberof module:modules/app.PostProcessorModule + */ + + }, { + key: "renderToScreen", + value: function renderToScreen() { + var _this6 = this; + + var bool = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + this.defer.then(function () { + _this6.currentPass.renderToScreen = bool; + }); + return this; + } + }]); + + return PostProcessorModule; + }(); + + defineProperty$3(PostProcessorModule, "defaults", { + debug: true + }); + + /** + * @class EventsPatchModule + * @description This one is used in the core to handle events used by modules. If you want to make custom events - please make a similar one. + * @category modules/app + * @memberof module:modules/app + */ + var EventsPatchModule = + /*#__PURE__*/ + function () { + function EventsPatchModule() { + classCallCheck(this, EventsPatchModule); + } + + createClass(EventsPatchModule, [{ + key: "manager", + value: function manager(_manager) { + _manager.define('events'); + + this.element = _manager.get('renderer').domElement; + } + /** + * @function patchEvents + * @description This methods patches the list of events on specific object. + * @param {Number} originObject - The object that gives events. + * @param {Number} [destObject=this] - The object that takes events. + * @param {Array[Strings]} [events=[]] - The list of events by names. + * @memberof module:modules/app.EventsPatchModule + */ + + }, { + key: "patchEvents", + value: function patchEvents(originObject) { + var destObject = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this; + var events = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; + events.forEach(function (event) { + return originObject.addEventListener(event, function (e) { + return destObject.emit(event, e); + }); + }); + } + }, { + key: "integrate", + value: function integrate(self) { + var element = self.element, + patchEvents = self.patchEvents; + patchEvents(element, this, ['mousemove', 'mouseup', 'contextmenu', 'mousedown', 'click', 'wheel', 'touchstart', 'touchend', 'touchmove', 'keydown', 'keyup', 'keypress']); + } + }]); + + return EventsPatchModule; + }(); + + /** + * @class VirtualMouseModule + * @category modules/app + * @param {Boolean} [globalMovement=false] + * @memberof module:modules/app + * @extends Events + */ + + var VirtualMouseModule = + /*#__PURE__*/ + function (_Events) { + function VirtualMouseModule() { + var _this; + + var globalMovement = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + classCallCheck(this, VirtualMouseModule); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(VirtualMouseModule).call(this)); + + defineProperty$3(defineProperty$3(defineProperty$3(defineProperty$3(defineProperty$3(assertThisInitialized(assertThisInitialized(_this)), "mouse", new Vector2()), "raycaster", new Raycaster()), "world", null), "canvas", null), "projectionPlane", new Plane(new Vector3(0, 0, 1), 0)); + + _this.globalMovement = globalMovement; + return _this; + } + + createClass(VirtualMouseModule, [{ + key: "update", + value: function update(e, customX, customY) { + var rect = this.canvas.getBoundingClientRect(); + var x = customX || e.clientX; + var y = customY || e.clientY; + this.mouse.x = (x - rect.left) / (rect.right - rect.left) * 2 - 1; + this.mouse.y = -((y - rect.top) / (rect.bottom - rect.top)) * 2 + 1; + this.projectionPlane.normal.copy(this.camera.getWorldDirection()); + this.raycaster.setFromCamera(this.mouse, this.camera); + this.emit('move'); + } + }, { + key: "manager", + value: function manager(_manager) { + _manager.define('mouse'); + + _manager.require('events', function () { + return new EventsPatchModule(); + }); + + this.canvas = _manager.get('renderer').domElement; + this.camera = _manager.get('camera').native; + } + }, { + key: "integrate", + value: function integrate(self) { + var _this2 = this; + + ['click', 'mousedown', 'mouseup', 'mousemove'].forEach(function (ev) { + return _this2.on(ev, function (e) { + return self.emit(ev, e); + }); + }); + self.globalX = 0; + self.globalY = 0; + this.on('mousemove', function (e) { + if (document.pointerLockElement !== null) { + self.globalX += e.movementX; + self.globalY += e.movementY; + self.update(e, self.globalX, self.globalY); + } else self.update(e); + }); + } + /** + * @method track + * @description Starts tracking events on a component + * @param {Component} component A component, that should be tracked by the mouse + * @param {Boolean} nested Whether component's children should be tracked or not + * @memberof module:modules/app.VirtualMouseModule + */ + + }, { + key: "track", + value: function track(component) { + var _this3 = this; + + var nested = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + var isHovered = false; + this.on('move', function () { + if (_this3.hovers(component, nested)) { + if (isHovered) component.emit('mousemove');else { + component.emit('mouseover'); + isHovered = true; + } + } else if (isHovered) { + component.emit('mouseout'); + isHovered = false; + } + }); + this.on('click', function () { + if (isHovered) component.emit('click');else component.emit('offClick'); + }); + this.on('mousedown', function () { + if (isHovered) component.emit('mousedown'); + }); + this.on('mouseup', function () { + if (isHovered) component.emit('mouseup'); + }); + } + /** + * @method intersection + * @description Returns an intersection data + * @param {Component} component A component that intersects with mouse ray (or doesn't) + * @param {Boolean} nested Whether component's children should be tracked or not + * @return {Array} intersection data. + * @memberof module:modules/app.VirtualMouseModule + */ + + }, { + key: "intersection", + value: function intersection(_ref) { + var native = _ref.native; + var nested = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + + if (native.children.length > 0 && nested) { + var objects = []; + native.traverse(function (child) { + return objects.push(child); + }); + return this.raycaster.intersectObjects(objects); + } + + return this.raycaster.intersectObject(native); + } + /** + * @method project + * @description Returns a vector based on mouse ray intersection with plane + * @param {THREE.Plane} [plane=this.projectionPlane] Math plane that is used + * @param {Vector3} [target] Optional target + * @return {Vector3} An intersection point. + * @memberof module:modules/app.VirtualMouseModule + */ + + }, { + key: "project", + value: function project() { + var plane = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.projectionPlane; + var target = arguments.length > 1 ? arguments[1] : undefined; + return this.raycaster.ray.intersectPlane(plane, target); + } + /** + * @method hovers + * @description Returns a boolean based on intersection data (Whether mouse hovers the component) + * @param {Component} component A component that intersects with mouse ray (or doesn't) + * @param {Boolean} nested Whether component's children should be tracked or not + * @return {Boolean} Whether the component is hovered. + * @memberof module:modules/app.VirtualMouseModule + */ + + }, { + key: "hovers", + value: function hovers(component) { + var nested = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + return this.intersection(component, nested).length > 0; + } + /** + * Mouse ray + * @member {THREE.Ray} module:modules/app.VirtualMouseModule#ray + * @public + */ + + }, { + key: "ray", + get: function get() { + return this.raycaster.ray; + } + /** + * Mouse x [-1; 1] + * @member {Number} module:modules/app.VirtualMouseModule#x + * @public + */ + + }, { + key: "x", + get: function get() { + return this.mouse.x; + } + /** + * Mouse y [-1; 1] + * @member {Number} module:modules/app.VirtualMouseModule#y + * @public + */ + + }, { + key: "y", + get: function get() { + return this.mouse.y; + } + }]); + + inherits(VirtualMouseModule, _Events); + + return VirtualMouseModule; + }(minivents_commonjs); + + /** + * @class ControlsModule + * @category modules/app + * @param {Object} [params] + * @memberof module:modules/app + * @example Creating a rendering module and passing it to App's modules + * new App([ + * new ElementModule(), + * new SceneModule(), + * new DefineModule('camera', new WHS.PerspectiveCamera({ + * position: new THREE.Vector3(0, 6, 18), + * far: 10000 + * })), + * new RenderingModule(), + * new ControlsModule.from(new THREE.TrackballControls()) + * ]); + */ + + var ControlsModule = + /*#__PURE__*/ + function () { + createClass(ControlsModule, null, [{ + key: "from", + value: function from(controls) { + return new ControlsModule({ + controls: controls + }); + } + }]); + + function ControlsModule() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, ControlsModule); + + this.params = Object.assign({ + controls: false, + fix: function fix(controls) { + return controls; + }, + update: function update(c) { + this.controls.update(c.getDelta()); + } + }, params); + this.controls = this.params.controls; + this.update = this.params.update; + } + + createClass(ControlsModule, [{ + key: "manager", + value: function manager(_manager) { + _manager.define('controls'); + + _manager.require('events', function () { + return new EventsPatchModule(); + }); + } + /** + * @method setControls + * @description Set working controls + * @param {Object} controls Working three.js controls object. + * @return {this} + * @memberof module:modules/app.ControlsModule + */ + + }, { + key: "setControls", + value: function setControls(controls) { + this.controls = controls; + return this; + } + /** + * @method setUpdate + * @description Set controls update function + * @param {Function} update Update function + * @return {this} + * @memberof module:modules/app.ControlsModule + */ + + }, { + key: "setUpdate", + value: function setUpdate(update) { + this.update = update; + return this; + } + }, { + key: "integrate", + value: function integrate(self) { + self.updateLoop = new Loop(self.update.bind(self)); + self.updateLoop.start(this); + } + }]); + + return ControlsModule; + }(); + + /** + * @class FogModule + * @category modules/app + * @param {Object} [params={color: 0xefd1b5, density: 0.020, near: 10, far: 1000}] - The parameters object. + * @param {String} [type=exp2] - The type of fog - exp2 or linear + * @memberof module:modules/app + * @example How to create and apply a FogModule + * const fogModule = new FogModule({ + * color: 0xffffff, + * density: 0.03, + * near: 20, + * far: 200 + * }, 'exp2'); + * + * new App([ + * ..., + * fogModule + * ]); + */ + + var FogModule = + /*#__PURE__*/ + function () { + function FogModule() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var type = arguments.length > 1 ? arguments[1] : undefined; + + classCallCheck(this, FogModule); + + this.params = Object.assign({ + color: 0xefd1b5, + density: 0.020, + near: 10, + far: 1000 + }, params); + if (!type || type === 'exp2') this.fog = new FogExp2(this.params.color, this.params.density);else if (type === 'linear') this.fog = new Fog(this.params.color, this.params.near, this.params.far); + } + + createClass(FogModule, [{ + key: "manager", + value: function manager(_manager) { + _manager.set('fog', this.fog); + + _manager.get('scene').fog = this.fog; + } + }]); + + return FogModule; + }(); + + var isEqualDefault = function isEqualDefault(a, b) { + if (a === b) return true;else if (a && a.equals && a.equals(b)) return true; + return false; + }; + /** + * @class StateModule + * @description `StateModule` is useful for apps, where you need state manipulation. + * This can be: _transitions between screens, games, development moments_. + * You can check [basic/state](https://whs-dev.surge.sh/examples/?basic/state) example. + * @category modules/app + * @param {Object} [params] + * @memberof module:modules/app + * @example Creating a state module + * new App([ + * // ... + * new StateModule().default({ + * sphereColor: 0xff0000 + * }) + * ]); + */ + + + var StateModule = + /*#__PURE__*/ + function () { + createClass(StateModule, null, [{ + key: "actionGenerate", + value: function actionGenerate(isEqual) { + return function () { + var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [{}, '']; + + var _ref = arguments.length > 1 ? arguments[1] : undefined, + key = _ref.key, + data = _ref.data; + + if (isEqual(state[0][key], data)) return state; + state[0][key] = data; + state[1] = key; + return state; + }; + } + }]); + + function StateModule() { + var equalCheck = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : isEqualDefault; + + classCallCheck(this, StateModule); + + this.store = createStore(StateModule.actionGenerate(equalCheck)); + this.configuration = {}; + this.currentConfig = 'default'; + this.prevConfig = 'default'; + } + /** + * @method default + * @description Add default configuration. + * @param {Object} data Configuration setup + * @memberof module:modules/app.StateModule + * @example + * new WHS.StateModule().default({ + * sphereColor: UTILS.$colors.mesh, + * planeColor: 0x447F8B + * }) + */ + + + createClass(StateModule, [{ + key: "default", + value: function _default(data) { + this.config({ + default: data + }); + return this; + } + /** + * @method setEqualCheck + * @description Sets an equalCheck function + * @param {Function} func function to generate equal check + * @memberof module:modules/app.StateModule + */ + + }, { + key: "setEqualCheck", + value: function setEqualCheck(func) { + this.store.replaceReducer(StateModule.actionGenerate(func)); + } + }, { + key: "manager", + value: function manager(_manager) { + _manager.define('state'); + } + /** + * @method config + * @description Load configurations from object. + * @param {Object} configs Configuration data + * @memberof module:modules/app.StateModule + * @example Adding `green` configuration + * state.config({ + * green: { + * sphereColor: 0x00ff00, + * planeColor: 0x00ff00 + * } + * }); + */ + + }, { + key: "config", + value: function config(configs) { + for (var key in configs) { + if (key) { + this.configuration[key] = key === 'default' ? configs[key] : Object.assign({}, this.configuration.default, configs[key]); + } + } + } + /** + * @method update + * @description Load updates from object. + * @param {Object} updates Updates data + * @memberof module:modules/app.StateModule + * @example Update callback for `sphereColor` + * state.update({ + * sphereColor: color => sphere.material.color.setHex(color) + * }); + */ + + }, { + key: "update", + value: function update() { + var _this = this; + + var updates = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + this.store.subscribe(function () { + var _this$store$getState = _this.store.getState(), + _this$store$getState2 = slicedToArray(_this$store$getState, 2), + data = _this$store$getState2[0], + changedKey = _this$store$getState2[1]; + + var callback = updates[changedKey]; + if (callback) callback(data[changedKey]); + }); + } + /** + * @method to + * @description Switch to configuration. + * @param {String} configName Configuration name. + * @memberof module:modules/app.StateModule + * @example Changes configuration to `green` + * state.to('green'); + */ + + }, { + key: "to", + value: function to(configName) { + this.prevConfig = this.currentConfig; + this.currentConfig = configName; + var config = this.configuration[configName] ? this.configuration[configName] : this.configuration.default; + this.set(config); + } + /** + * @method set + * @description Set current parameters. + * @param {Object} data Configuration parameters. + * @memberof module:modules/app.StateModule + * @example + * state.set({ + * sphereColor: 0x00ff00 + * }); + */ + + }, { + key: "set", + value: function set(data) { + for (var key in data) { + if (key) this.store.dispatch({ + type: 'ADD', + key: key, + data: data[key] + }); + } + } + /** + * @method get + * @description Return data of parameter. + * @param {String} key Parameter name. + * @memberof module:modules/app.StateModule + * @example + * state.get('sphereColor'); // 0x00ff00 + */ + + }, { + key: "get", + value: function get(key) { + return this.store.getState()[0][key]; + } + /** + * @method prev + * @description Return `trueVal` if `config` match previous configuration, in other case - return `falseVal`. + * @param {String} config Configuration name. + * @param {Any} trueVal Value returned if condition is truthy. + * @param {Any} falseVal Value returned if condition is falsy. + * @memberof module:modules/app.StateModule + */ + + }, { + key: "prev", + value: function prev(config, trueVal, falseVal) { + return this.prevConfig === config ? trueVal : falseVal; + } + /** + * @method current + * @description Return `trueVal` if `config` match current configuration, in other case - return `falseVal`. + * @param {String} config Configuration name. + * @param {Any} trueVal Value returned if condition is truthy. + * @param {Any} falseVal Value returned if condition is falsy. + * @memberof module:modules/app.StateModule + */ + + }, { + key: "current", + value: function current(config, trueVal, falseVal) { + return this.currentConfig === config ? trueVal : falseVal; + } + }]); + + return StateModule; + }(); + + // Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default). + // + // Orbit - left mouse / touch: one finger move + // Zoom - middle mouse, or mousewheel / touch: two finger spread or squish + // Pan - right mouse, or arrow keys / touch: three finter swipe + + var ThreeOrbitControls = + /*#__PURE__*/ + function (_EventDispatcher) { + function ThreeOrbitControls(object, domElement, eventHandler) { + var _this; + + classCallCheck(this, ThreeOrbitControls); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(ThreeOrbitControls).call(this)); + _this.object = object; + _this.domElement = domElement === undefined ? document : domElement; + _this.eventHandler = eventHandler; // 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(); // How far you can dolly in and out ( PerspectiveCamera only ) + + _this.minDistance = 0; + _this.maxDistance = Infinity; // How far you can zoom in and out ( OrthographicCamera only ) + + _this.minZoom = 0; + _this.maxZoom = 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, must be a sub-interval of the interval [ - Math.PI, Math.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 = false; + _this.dampingFactor = 0.25; // This option actually enables dollying in and out; left as "zoom" for backwards compatibility. + // Set to false to disable zooming + + _this.enableZoom = true; + _this.zoomSpeed = 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.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 + // Set to false to disable use of the keys + + _this.enableKeys = true; // The four arrow keys + + _this.keys = { + LEFT: 37, + UP: 38, + RIGHT: 39, + BOTTOM: 40 + }; // Mouse buttons + + _this.mouseButtons = { + ORBIT: MOUSE.LEFT, + ZOOM: MOUSE.MIDDLE, + PAN: MOUSE.RIGHT + }; // for reset + + _this.target0 = _this.target.clone(); + _this.position0 = _this.object.position.clone(); + _this.zoom0 = _this.object.zoom; // + // public methods + // + + _this.getPolarAngle = function () { + return spherical.phi; + }; + + _this.getAzimuthalAngle = function () { + return spherical.theta; + }; + + _this.reset = function () { + _this.target.copy(_this.target0); + + _this.object.position.copy(_this.position0); + + _this.object.zoom = _this.zoom0; + + _this.object.updateProjectionMatrix(); + + _this.dispatchEvent(changeEvent); + + _this.update(); + + state = STATE.NONE; + }; // this method is exposed, but perhaps it would be better if we can make it private... + + + _this.update = function () { + var offset = new Vector3(); // so camera.up is the orbit axis + + var quat = new Quaternion().setFromUnitVectors(object.up, new Vector3(0, 1, 0)); + var quatInverse = quat.clone().inverse(); + var lastPosition = new Vector3(); + var lastQuaternion = new Quaternion(); + return function () { + var position = _this.object.position; + offset.copy(position).sub(_this.target); // rotate offset to "y-axis-is-up" space + + offset.applyQuaternion(quat); // angle from z-axis around y-axis + + spherical.setFromVector3(offset); + if (_this.autoRotate && state === STATE.NONE) rotateLeft(getAutoRotationAngle()); + spherical.theta += sphericalDelta.theta; + spherical.phi += sphericalDelta.phi; // restrict theta to be between desired limits + + spherical.theta = Math.max(_this.minAzimuthAngle, Math.min(_this.maxAzimuthAngle, spherical.theta)); // restrict phi to be between desired limits + + spherical.phi = Math.max(_this.minPolarAngle, Math.min(_this.maxPolarAngle, spherical.phi)); + spherical.makeSafe(); + spherical.radius *= scale; // restrict radius to be between desired limits + + spherical.radius = Math.max(_this.minDistance, Math.min(_this.maxDistance, spherical.radius)); // move target to panned location + + _this.target.add(panOffset); + + offset.setFromSpherical(spherical); // rotate offset back to "camera-up-vector-is-up" space + + offset.applyQuaternion(quatInverse); + position.copy(_this.target).add(offset); + + _this.object.lookAt(_this.target); + + if (_this.enableDamping === true) { + sphericalDelta.theta *= 1 - _this.dampingFactor; + sphericalDelta.phi *= 1 - _this.dampingFactor; + } else sphericalDelta.set(0, 0, 0); + + scale = 1; + panOffset.set(0, 0, 0); // update condition is: + // min(camera displacement, camera rotation in radians)^2 > EPS + // using small-angle approximation cos(x/2) = 1 - x^2 / 8 + + if (zoomChanged || lastPosition.distanceToSquared(_this.object.position) > EPS || 8 * (1 - lastQuaternion.dot(_this.object.quaternion)) > EPS) { + _this.dispatchEvent(changeEvent); + + lastPosition.copy(_this.object.position); + lastQuaternion.copy(_this.object.quaternion); + zoomChanged = false; + return true; + } + + return false; + }(); + }; + + _this.dispose = function () { + _this.domElement.removeEventListener('contextmenu', onContextMenu, false); + + _this.domElement.removeEventListener('mousedown', onMouseDown, false); + + _this.domElement.removeEventListener('wheel', onMouseWheel, false); + + _this.domElement.removeEventListener('touchstart', onTouchStart, false); + + _this.domElement.removeEventListener('touchend', onTouchEnd, false); + + _this.domElement.removeEventListener('touchmove', onTouchMove, false); + + document.removeEventListener('mousemove', onMouseMove, false); + document.removeEventListener('mouseup', onMouseUp, false); + window.removeEventListener('keydown', onKeyDown, false); // this.dispatchEvent( { type: 'dispose' } ); // should this be added here? + }; // + // internals + // + + + var changeEvent = { + type: 'change' + }; + var startEvent = { + type: 'start' + }; + var endEvent = { + type: 'end' + }; + var STATE = { + NONE: -1, + ROTATE: 0, + DOLLY: 1, + PAN: 2, + TOUCH_ROTATE: 3, + TOUCH_DOLLY: 4, + TOUCH_PAN: 5 + }; + var state = STATE.NONE; + var EPS = 0.000001; // current position in spherical coordinates + + var spherical = new Spherical(); + var sphericalDelta = new Spherical(); + var scale = 1; + var panOffset = new Vector3(); + var zoomChanged = false; + var rotateStart = new Vector2(); + var rotateEnd = new Vector2(); + var rotateDelta = new Vector2(); + var panStart = new Vector2(); + var panEnd = new Vector2(); + var panDelta = new Vector2(); + var dollyStart = new Vector2(); + var dollyEnd = new Vector2(); + var dollyDelta = new Vector2(); + + var getAutoRotationAngle = function getAutoRotationAngle() { + return 2 * Math.PI / 60 / 60 * _this.autoRotateSpeed; + }; + + var getZoomScale = function getZoomScale() { + return Math.pow(0.95, _this.zoomSpeed); + }; + + var rotateLeft = function rotateLeft(angle) { + sphericalDelta.theta -= angle; + }; + + var rotateUp = function rotateUp(angle) { + sphericalDelta.phi -= angle; + }; + + var panLeft = function () { + var v = new Vector3(); + return function (distance, objectMatrix) { + v.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix + + v.multiplyScalar(-distance); + panOffset.add(v); + }; + }(); + + var panUp = function () { + var v = new Vector3(); + return function (distance, objectMatrix) { + v.setFromMatrixColumn(objectMatrix, 1); // get Y column of objectMatrix + + v.multiplyScalar(distance); + panOffset.add(v); + }; + }(); // deltaX and deltaY are in pixels; right and down are positive + + + var pan = function () { + var offset = new Vector3(); + return function (deltaX, deltaY) { + var element = _this.domElement === document ? _this.domElement.body : _this.domElement; + + if (_this.object instanceof PerspectiveCamera) { + // perspective + var position = _this.object.position; + offset.copy(position).sub(_this.target); + var targetDistance = offset.length(); // half of the fov is center to top of screen + + targetDistance *= Math.tan(_this.object.fov / 2 * Math.PI / 180.0); // we actually don't use screenWidth, since perspective camera is fixed to screen height + + panLeft(2 * deltaX * targetDistance / element.clientHeight, _this.object.matrix); + panUp(2 * deltaY * targetDistance / element.clientHeight, _this.object.matrix); + } else if (_this.object instanceof OrthographicCamera) { + // orthographic + panLeft(deltaX * (_this.object.right - _this.object.left) / _this.object.zoom / element.clientWidth, _this.object.matrix); + panUp(deltaY * (_this.object.top - _this.object.bottom) / _this.object.zoom / element.clientHeight, _this.object.matrix); + } else { + // camera neither orthographic nor perspective + console.warn('WARNING: OrbitControlsModule.js encountered an unknown camera type - pan disabled.'); + _this.enablePan = false; + } + }; + }(); + + var dollyIn = function dollyIn(dollyScale) { + if (_this.object instanceof PerspectiveCamera) scale /= dollyScale;else if (_this.object instanceof OrthographicCamera) { + _this.object.zoom = Math.max(_this.minZoom, Math.min(_this.maxZoom, _this.object.zoom * dollyScale)); + + _this.object.updateProjectionMatrix(); + + zoomChanged = true; + } else { + console.warn('WARNING: OrbitControlsModule.js encountered an unknown camera type - dolly/zoom disabled.'); + _this.enableZoom = false; + } + }; + + var dollyOut = function dollyOut(dollyScale) { + if (_this.object instanceof PerspectiveCamera) scale *= dollyScale;else if (_this.object instanceof OrthographicCamera) { + _this.object.zoom = Math.max(_this.minZoom, Math.min(_this.maxZoom, _this.object.zoom / dollyScale)); + + _this.object.updateProjectionMatrix(); + + zoomChanged = true; + } else { + console.warn('WARNING: OrbitControlsModule.js encountered an unknown camera type - dolly/zoom disabled.'); + _this.enableZoom = false; + } + }; // + // event callbacks - update the object state + // + + + var handleMouseDownRotate = function handleMouseDownRotate(event) { + // console.log( 'handleMouseDownRotate' ); + rotateStart.set(event.clientX, event.clientY); + }; + + var handleMouseDownDolly = function handleMouseDownDolly(event) { + // console.log( 'handleMouseDownDolly' ); + dollyStart.set(event.clientX, event.clientY); + }; + + var handleMouseDownPan = function handleMouseDownPan(event) { + // console.log( 'handleMouseDownPan' ); + panStart.set(event.clientX, event.clientY); + }; + + var handleMouseMoveRotate = function handleMouseMoveRotate(event) { + // console.log( 'handleMouseMoveRotate' ); + rotateEnd.set(event.clientX, event.clientY); + rotateDelta.subVectors(rotateEnd, rotateStart); + var element = _this.domElement === document ? _this.domElement.body : _this.domElement; // rotating across whole screen goes 360 degrees around + + rotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * _this.rotateSpeed); // rotating up and down along whole screen attempts to go 360, but limited to 180 + + rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * _this.rotateSpeed); + rotateStart.copy(rotateEnd); + + _this.update(); + }; + + var handleMouseMoveDolly = function handleMouseMoveDolly(event) { + // console.log( 'handleMouseMoveDolly' ); + dollyEnd.set(event.clientX, event.clientY); + dollyDelta.subVectors(dollyEnd, dollyStart); + if (dollyDelta.y > 0) dollyIn(getZoomScale());else if (dollyDelta.y < 0) dollyOut(getZoomScale()); + dollyStart.copy(dollyEnd); + + _this.update(); + }; + + var handleMouseMovePan = function handleMouseMovePan(event) { + // console.log( 'handleMouseMovePan' ); + panEnd.set(event.clientX, event.clientY); + panDelta.subVectors(panEnd, panStart); + pan(panDelta.x, panDelta.y); + panStart.copy(panEnd); + + _this.update(); + }; + + var handleMouseWheel = function handleMouseWheel(event) { + // console.log( 'handleMouseWheel' ); + if (event.deltaY < 0) dollyOut(getZoomScale());else if (event.deltaY > 0) dollyIn(getZoomScale()); + + _this.update(); + }; + + var handleKeyDown = function handleKeyDown(event) { + // console.log( 'handleKeyDown' ); + switch (event.keyCode) { + case _this.keys.UP: + pan(0, _this.keyPanSpeed); + + _this.update(); + + break; + + case _this.keys.BOTTOM: + pan(0, -_this.keyPanSpeed); + + _this.update(); + + break; + + case _this.keys.LEFT: + pan(_this.keyPanSpeed, 0); + + _this.update(); + + break; + + case _this.keys.RIGHT: + pan(-_this.keyPanSpeed, 0); + + _this.update(); + + break; + } + }; + + var handleTouchStartRotate = function handleTouchStartRotate(event) { + // console.log( 'handleTouchStartRotate' ); + rotateStart.set(event.touches[0].pageX, event.touches[0].pageY); + }; + + var handleTouchStartDolly = function handleTouchStartDolly(event) { + // console.log( 'handleTouchStartDolly' ); + var dx = event.touches[0].pageX - event.touches[1].pageX; + var dy = event.touches[0].pageY - event.touches[1].pageY; + var distance = Math.sqrt(dx * dx + dy * dy); + dollyStart.set(0, distance); + }; + + var handleTouchStartPan = function handleTouchStartPan(event) { + // console.log( 'handleTouchStartPan' ); + panStart.set(event.touches[0].pageX, event.touches[0].pageY); + }; + + var handleTouchMoveRotate = function handleTouchMoveRotate(event) { + // console.log( 'handleTouchMoveRotate' ); + rotateEnd.set(event.touches[0].pageX, event.touches[0].pageY); + rotateDelta.subVectors(rotateEnd, rotateStart); + var element = _this.domElement === document ? _this.domElement.body : _this.domElement; // rotating across whole screen goes 360 degrees around + + rotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * _this.rotateSpeed); // rotating up and down along whole screen attempts to go 360, but limited to 180 + + rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * _this.rotateSpeed); + rotateStart.copy(rotateEnd); + + _this.update(); + }; + + var handleTouchMoveDolly = function handleTouchMoveDolly(event) { + // console.log( 'handleTouchMoveDolly' ); + var dx = event.touches[0].pageX - event.touches[1].pageX; + var dy = event.touches[0].pageY - event.touches[1].pageY; + var distance = Math.sqrt(dx * dx + dy * dy); + dollyEnd.set(0, distance); + dollyDelta.subVectors(dollyEnd, dollyStart); + if (dollyDelta.y > 0) dollyOut(getZoomScale());else if (dollyDelta.y < 0) dollyIn(getZoomScale()); + dollyStart.copy(dollyEnd); + + _this.update(); + }; + + var handleTouchMovePan = function handleTouchMovePan(event) { + // console.log( 'handleTouchMovePan' ); + panEnd.set(event.touches[0].pageX, event.touches[0].pageY); + panDelta.subVectors(panEnd, panStart); + pan(panDelta.x, panDelta.y); + panStart.copy(panEnd); + + _this.update(); + }; + // event handlers - FSM: listen for events and reset state + // + + + var onMouseDown = function onMouseDown(event) { + if (_this.enabled === false) return; + event.preventDefault(); + + if (event.button === _this.mouseButtons.ORBIT) { + if (_this.enableRotate === false) return; + handleMouseDownRotate(event); + state = STATE.ROTATE; + } else if (event.button === _this.mouseButtons.ZOOM) { + if (_this.enableZoom === false) return; + handleMouseDownDolly(event); + state = STATE.DOLLY; + } else if (event.button === _this.mouseButtons.PAN) { + if (_this.enablePan === false) return; + handleMouseDownPan(event); + state = STATE.PAN; + } + + if (state !== STATE.NONE) { + _this.eventHandler.on('mousemove', onMouseMove, false); + + _this.eventHandler.on('mouseup', onMouseUp, false); + + _this.dispatchEvent(startEvent); + } + }; + + var onMouseMove = function onMouseMove(event) { + if (_this.enabled === false) return; + event.preventDefault(); + + if (state === STATE.ROTATE) { + if (_this.enableRotate === false) return; + handleMouseMoveRotate(event); + } else if (state === STATE.DOLLY) { + if (_this.enableZoom === false) return; + handleMouseMoveDolly(event); + } else if (state === STATE.PAN) { + if (_this.enablePan === false) return; + handleMouseMovePan(event); + } + }; + + var onMouseUp = function onMouseUp(event) { + if (_this.enabled === false) return; + document.removeEventListener('mousemove', onMouseMove, false); + document.removeEventListener('mouseup', onMouseUp, false); + + _this.dispatchEvent(endEvent); + + state = STATE.NONE; + }; + + var onMouseWheel = function onMouseWheel(event) { + if (_this.enabled === false || _this.enableZoom === false || state !== STATE.NONE && state !== STATE.ROTATE) return; + event.preventDefault(); + event.stopPropagation(); + handleMouseWheel(event); + + _this.dispatchEvent(startEvent); // not sure why these are here... + + + _this.dispatchEvent(endEvent); + }; + + var onKeyDown = function onKeyDown(event) { + if (_this.enabled === false || _this.enableKeys === false || _this.enablePan === false) return; + handleKeyDown(event); + }; + + var onTouchStart = function onTouchStart(event) { + if (_this.enabled === false) return; + + switch (event.touches.length) { + case 1: + // one-fingered touch: rotate + if (_this.enableRotate === false) return; + handleTouchStartRotate(event); + state = STATE.TOUCH_ROTATE; + break; + + case 2: + // two-fingered touch: dolly + if (_this.enableZoom === false) return; + handleTouchStartDolly(event); + state = STATE.TOUCH_DOLLY; + break; + + case 3: + // three-fingered touch: pan + if (_this.enablePan === false) return; + handleTouchStartPan(event); + state = STATE.TOUCH_PAN; + break; + + default: + state = STATE.NONE; + } + + if (state !== STATE.NONE) _this.dispatchEvent(startEvent); + }; + + var onTouchMove = function onTouchMove(event) { + if (_this.enabled === false) return; + event.preventDefault(); + event.stopPropagation(); + + switch (event.touches.length) { + case 1: + // one-fingered touch: rotate + if (_this.enableRotate === false) return; + if (state !== STATE.TOUCH_ROTATE) return; // is this needed?... + + handleTouchMoveRotate(event); + break; + + case 2: + // two-fingered touch: dolly + if (_this.enableZoom === false) return; + if (state !== STATE.TOUCH_DOLLY) return; // is this needed?... + + handleTouchMoveDolly(event); + break; + + case 3: + // three-fingered touch: pan + if (_this.enablePan === false) return; + if (state !== STATE.TOUCH_PAN) return; // is this needed?... + + handleTouchMovePan(event); + break; + + default: + state = STATE.NONE; + } + }; + + var onTouchEnd = function onTouchEnd(event) { + if (_this.enabled === false) return; + + _this.dispatchEvent(endEvent); + + state = STATE.NONE; + }; + + var onContextMenu = function onContextMenu(event) { + event.preventDefault(); + }; // + + + _this.eventHandler.on('contextmenu', onContextMenu, false); + + _this.eventHandler.on('mousedown', onMouseDown, false); + + _this.eventHandler.on('wheel', onMouseWheel, false); + + _this.eventHandler.on('touchstart', onTouchStart, false); + + _this.eventHandler.on('touchend', onTouchEnd, false); + + _this.eventHandler.on('touchmove', onTouchMove, false); + + _this.eventHandler.on('keydown', onKeyDown, false); // force an update at start + + + _this.update(); + + return _this; + } + + createClass(ThreeOrbitControls, [{ + key: "center", + get: function get() { + console.warn('OrbitControls: .center has been renamed to .target'); + return this.target; + } + }, { + key: "noZoom", + get: function get() { + console.warn('OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.'); + return !this.enableZoom; + }, + set: function set(value) { + console.warn('OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.'); + this.enableZoom = !value; + } + }, { + key: "noRotate", + get: function get() { + console.warn('OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.'); + return !this.enableRotate; + }, + set: function set(value) { + console.warn('OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.'); + this.enableRotate = !value; + } + }, { + key: "noPan", + get: function get() { + console.warn('OrbitControls: .noPan has been deprecated. Use .enablePan instead.'); + return !this.enablePan; + }, + set: function set(value) { + console.warn('OrbitControls: .noPan has been deprecated. Use .enablePan instead.'); + this.enablePan = !value; + } + }, { + key: "noKeys", + get: function get() { + console.warn('OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.'); + return !this.enableKeys; + }, + set: function set(value) { + console.warn('OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.'); + this.enableKeys = !value; + } + }, { + key: "staticMoving", + get: function get() { + console.warn('OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.'); + return !this.enableDamping; + }, + set: function set(value) { + console.warn('OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.'); + this.enableDamping = !value; + } + }, { + key: "dynamicDampingFactor", + get: function get() { + console.warn('OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.'); + return this.dampingFactor; + }, + set: function set(value) { + console.warn('OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.'); + this.dampingFactor = value; + } + }]); + + inherits(ThreeOrbitControls, _EventDispatcher); + + return ThreeOrbitControls; + }(EventDispatcher); + + /** + * @class OrbitControlsModule + * @category modules/app + * @param {Object} [params] + * @param {Object} [params.object=camera] Object to which controls are applied. + * @param {THREE.Vector3} [params.target=new Vector3()] Controls center vector. + * @param {Boolean} [params.follow=false] Follow the target + * @memberof module:modules/app + * @example Creating a rendering module and passing it to App's modules + * new App([ + * new ElementModule(), + * new SceneModule(), + * new DefineModule('camera', new WHS.PerspectiveCamera({ + * position: new THREE.Vector3(0, 6, 18), + * far: 10000 + * })), + * new RenderingModule(), + * new OrbitControlsModule() + * ]); + */ + + var OrbitControlsModule = + /*#__PURE__*/ + function (_ControlsModule) { + function OrbitControlsModule() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, OrbitControlsModule); + + _this = possibleConstructorReturn(this, getPrototypeOf$2(OrbitControlsModule).call(this, params)); + _this.params = Object.assign({ + follow: false, + object: null, + target: new Vector3() + }, params); + return _this; + } + + createClass(OrbitControlsModule, [{ + key: "manager", + value: function manager(_manager) { + get$3(getPrototypeOf$2(OrbitControlsModule.prototype), "manager", this).call(this, _manager); + + var _this$params = this.params, + obj = _this$params.object, + follow = _this$params.follow, + target = _this$params.target; + var object = obj ? obj.native : _manager.get('camera').native; + var controls = new ThreeOrbitControls(object, _manager.get('element'), _manager.handler); + var updateProcessor = follow ? function (c) { + controls.update(c.getDelta()); + controls.target.copy(target); + } : function (c) { + controls.update(c.getDelta()); + }; + this.setControls(controls); + this.setUpdate(updateProcessor); + + _manager.update({ + camera: function camera(_camera) { + if (obj) return; + controls.object = _camera.native; + }, + element: function element(_element) { + controls.domElement = _element; + } + }); + + controls.target.copy(target); + } + }]); + + inherits(OrbitControlsModule, _ControlsModule); + + return OrbitControlsModule; + }(ControlsModule); + + /** @module modules/app/controls */ + + /** @module modules/app */ + + /** + * @class DynamicGeometryModule + * @category modules/mesh + * @param {Object} [params={attributes: false}] - params + * @param {Boolean} [patchEvents=true] + * @memberof module:modules/mesh + */ + var DynamicGeometryModule = + /*#__PURE__*/ + function () { + function DynamicGeometryModule() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, DynamicGeometryModule); + + this.params = Object.assign({ + attributes: false + }, params); + } + + createClass(DynamicGeometryModule, [{ + key: "integrate", + value: function integrate(self) { + var _this = this; + + var params = self.params; + + this.g_ = function () { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + if (this.buildGeometry) { + this.native.geometry = this.buildGeometry(this.updateParams({ + geometry: params + })); + } + }; + + if (params.attributes) { + var _loop = function _loop(key) { + if (key) { + Object.defineProperty(_this, "g_".concat(key), { + get: function get() { + return this.native.geometry.parameters[key]; + }, + set: function set(value) { + this.native.geometry = this.buildGeometry(this.updateParams({ + geometry: defineProperty$3({}, key, value) + })); + }, + configurable: true, + enumerable: true + }); + } + }; + + for (var key in this.params.geometry) { + _loop(key); + } + } + } + }]); + + return DynamicGeometryModule; + }(); + + var loader = new TextureLoader(); + /** + * @class TextureModule + * @category modules/mesh + * @description A TextureModule can be applied to any Mesh or Model. + * @param {Array} [textures] - array of texture objects + * @memberof module:modules/mesh + * @example Creating an instance. url takes a path, or a data object. + * var woodTexture = new TextureModule({ + * url: `${process.assetsPath}/textures/wood.jpg` + * }); + * @example More comprehensive example, wood texture applied to a Box. + * new Box({ + * geometry: { + * width: 2, + * height: 2, + * depth: 2 + * }, + * modules: [ + * new TextureModule({ + * url: `path/to/texture.jpg`, + * repeat: new THREE.Vector2(1, 1) // optional + * }) + * ], + * material: new THREE.MeshBasicMaterial({ + * color: 0xffffff + * }), + * position: [50, 60, 70] + * }).addTo(app); + */ + + var TextureModule = + /*#__PURE__*/ + function () { + createClass(TextureModule, null, [{ + key: "load", + value: function load(url) { + return new TextureModule({ + url: url + }).textures[0][1]; + } + }]); + + function TextureModule() { + var _this = this; + + classCallCheck(this, TextureModule); + + defineProperty$3(defineProperty$3(this, "textures", []), "bridge", { + material: function material(_material, self) { + self.textures.forEach(function (texture) { + _material[texture[0]] = texture[1]; + }); + _material.needsUpdate = true; + return _material; + } + }); + + for (var _len = arguments.length, textures = new Array(_len), _key = 0; _key < _len; _key++) { + textures[_key] = arguments[_key]; + } + + textures.forEach(function (_ref) { + var url = _ref.url, + _ref$type = _ref.type, + type = _ref$type === void 0 ? 'map' : _ref$type, + _ref$offset = _ref.offset, + offset = _ref$offset === void 0 ? new Vector2(0, 0) : _ref$offset, + _ref$repeat = _ref.repeat, + repeat = _ref$repeat === void 0 ? new Vector2(1, 1) : _ref$repeat, + _ref$wrap = _ref.wrap, + wrap = _ref$wrap === void 0 ? RepeatWrapping : _ref$wrap, + _ref$mapping = _ref.mapping, + mapping = _ref$mapping === void 0 ? UVMapping : _ref$mapping, + _ref$fix = _ref.fix, + fix = _ref$fix === void 0 ? function (tex) { + return tex; + } : _ref$fix; + var texture = loader.load(url); + + if (wrap.length > 0) { + texture.wrapS = wrap[0]; + texture.wrapT = wrap[1]; + } else texture.wrapS = texture.wrapT = wrap; + + texture.mapping = mapping; + texture.offset.copy(offset); + texture.repeat.copy(repeat); + texture.magFilter = NearestFilter; + texture.minFilter = LinearMipMapLinearFilter; + + _this.textures.push([type, fix(texture)]); + }); + } + + return TextureModule; + }(); + + /** + * @class AnimationModule + * @category modules/mesh + * @description Convenience module that wraps the three.js animation system + * @param {App} app - the app + * @param {Boolean} [isDeferred=false] - set to true if animation should not start automatically + * @param {Object} [params={speed: 1}] - the params + * @memberof module:modules/mesh + * @example Create animation module and play a given clip of an imported model + * const animationModule = new AnimationModule(app, false, { + * speed: 1.2 // speed up animation by 20% + * }); + * + * new Importer({ + * parser(geometry, materials) { + * // Override parse to generate a skinnedMesh, needed for skinned models + * return new THREE.SkinnedMesh(geometry, materials); + * }, + * + * url: `path/to/model.json`, + * useCustomMaterial: true, + * + * material: new THREE.MeshStandardMaterial({ + * skinning: true + * }), + * + * modules: [animationModule] + * }).addTo(app).then(() => { + * // adding model to app returns a promise, so pipe the function to kick off the animation clip + * animationModule.play('clipName'); + * }); + */ + + var AnimationModule = + /*#__PURE__*/ + function () { + function AnimationModule(app, isDeferred) { + var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + classCallCheck(this, AnimationModule); + + defineProperty$3(this, "bridge", { + mesh: function mesh(_mesh, self) { + _mesh.geometry.skeleton = _mesh.skeleton; + self.mixer = new AnimationMixer(_mesh.geometry); + self.clips = _mesh.geometry.animations; + return _mesh; + } + }); + + this.params = Object.assign({ + speed: 1 + }, params); + this.app = app; + this.isDeferred = isDeferred; + } + /** + * @method play + * @instance + * @description Plays the given clip name + * @param {String} clipName - the clip to play + * @return {THREE.AnimationAction} Playing action + * @memberof module:modules/mesh.AnimationModule + */ + + + createClass(AnimationModule, [{ + key: "play", + value: function play(clipName) { + var clip = AnimationClip.findByName(this.clips, clipName); + return this.mixer.clipAction(clip).play(); + } + /** + * @method update + * @instance + * @description Update the mixer (being called on frame animation loop) + * @memberof module:modules/mesh.AnimationModule + */ + + }, { + key: "update", + value: function update(clock) { + if (this.mixer) this.mixer.update(clock.getDelta() * this.params.speed); + } + }, { + key: "integrate", + value: function integrate(self) { + self.loop = new Loop(function (clock) { + return self.update(clock); + }); + if (!self.isDeferred) self.loop.start(self.app); + } + }, { + key: "manager", + value: function manager(_manager) { + _manager.define('animation'); + } + }]); + + return AnimationModule; + }(); + + /** @module modules/mesh */ + + /** + * @class DefineModule + * @category modules + * @param {String} name + * @param {Object} data + * @memberof module:modules + * @example Creating a DefineModule with PerspectiveCamera as camera module and passing it to App's modules + * new App([ + * // ... + * new DefineModule('camera', new PerspectiveCamera()) + * ]); + */ + var DefineModule = + /*#__PURE__*/ + function () { + function DefineModule(name, data) { + classCallCheck(this, DefineModule); + + this.name = name; + this.data = data; + } + + createClass(DefineModule, [{ + key: "manager", + value: function manager(_manager) { + _manager.set(this.name, this.data); + } + }]); + + return DefineModule; + }(); + + /** @module modules */ + + var Model = + /*#__PURE__*/ + function (_Importer) { + function Model(params) { + var _getPrototypeOf2; + + classCallCheck(this, Model); + + console.warn('Model is deprecated. Use Importer instead.'); + + if (params.geometry) { + params.url = params.geometry.path; + params.loader = params.geometry.loader; + } + + for (var _len = arguments.length, additional = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + additional[_key - 1] = arguments[_key]; + } + + return possibleConstructorReturn(this, (_getPrototypeOf2 = getPrototypeOf$2(Model)).call.apply(_getPrototypeOf2, [this, params].concat(additional))); + } + + inherits(Model, _Importer); + + return Model; + }(Importer); + var CameraModule = + /*#__PURE__*/ + function () { + function CameraModule() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + classCallCheck(this, CameraModule); + + console.warn('CameraModule is deprecated. Use DefineModule instead.'); + this.camera = new PerspectiveCamera$1(params); + } + + createClass(CameraModule, [{ + key: "integrate", + value: function integrate(self) { + this.add(self.camera); + } + }, { + key: "manager", + value: function manager(_manager) { + _manager.set('camera', this.camera); + } + }]); + + return CameraModule; + }(); + + /** + * Namespace containing all classes from all modules. Used as global in UMD pattern. + * @namespace WHS + * @example The use of WHS namespace. + * new WHS.App() // core + * new WHS.PerspectiveCamera() // components + * new WHS.ResizeModule() // modules + * WHS.extend() // utils + */ + + exports.Component = Component; + exports.MeshComponent = MeshComponent; + exports.LightComponent = LightComponent; + exports.CameraComponent = CameraComponent; + exports.App = App; + exports.Loop = Loop; + exports.ModuleManager = ModuleManager; + exports.AmbientLight = AmbientLight$1; + exports.DirectionalLight = DirectionalLight$1; + exports.HemisphereLight = HemisphereLight$1; + exports.PointLight = PointLight$1; + exports.SpotLight = SpotLight$1; + exports.AreaLight = AreaLight; + exports.CubeCamera = CubeCamera$1; + exports.OrthographicCamera = OrthographicCamera$1; + exports.PerspectiveCamera = PerspectiveCamera$1; + exports.Box = Box; + exports.Circle = Circle; + exports.Cone = Cone; + exports.Cylinder = Cylinder; + exports.Dodecahedron = Dodecahedron; + exports.Extrude = Extrude; + exports.Icosahedron = Icosahedron; + exports.Lathe = Lathe; + exports.Line = Line$1; + exports.Importer = Importer; + exports.Octahedron = Octahedron; + exports.Parametric = Parametric; + exports.Plane = Plane$1; + exports.Polyhedron = Polyhedron; + exports.Ring = Ring; + exports.Shape = Shape$1; + exports.Sphere = Sphere$1; + exports.Tetrahedron = Tetrahedron; + exports.Text = Text; + exports.Torus = Torus; + exports.Torusknot = Torusknot; + exports.Tube = Tube; + exports.Group = Group$1; + exports.extend = extend; + exports.instruct = instruct; + exports.transformData = transformData; + exports.toArray = toArray; + exports.ElementModule = ElementModule; + exports.RenderingModule = RenderingModule; + exports.SceneModule = SceneModule; + exports.ResizeModule = ResizeModule; + exports.PostProcessorModule = PostProcessorModule; + exports.VirtualMouseModule = VirtualMouseModule; + exports.EventsPatchModule = EventsPatchModule; + exports.ControlsModule = ControlsModule; + exports.FogModule = FogModule; + exports.StateModule = StateModule; + exports.OrbitControlsModule = OrbitControlsModule; + exports.DynamicGeometryModule = DynamicGeometryModule; + exports.TextureModule = TextureModule; + exports.AnimationModule = AnimationModule; + exports.DefineModule = DefineModule; + exports.Model = Model; + exports.CameraModule = CameraModule; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2hzLmpzIiwic291cmNlcyI6WyIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLW1vZHVsZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvci9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLWludGVnZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19kZWZpbmVkLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc3RyaW5nLWF0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fbGlicmFyeS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2dsb2JhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NvcmUuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY3R4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXMtb2JqZWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYW4tb2JqZWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZmFpbHMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19kZXNjcmlwdG9ycy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLXByaW1pdGl2ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1kcC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3Byb3BlcnR5LWRlc2MuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19oaWRlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faGFzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZXhwb3J0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fcmVkZWZpbmUuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyYXRvcnMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb2YuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pb2JqZWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8taW9iamVjdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLWxlbmd0aC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLWFic29sdXRlLWluZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zaGFyZWQuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL191aWQuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zaGFyZWQta2V5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWtleXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZHBzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faHRtbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1jcmVhdGUuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zZXQtdG8tc3RyaW5nLXRhZy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItY3JlYXRlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tb2JqZWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdwby5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItZGVmaW5lLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1zdGVwLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYuYXJyYXkuaXRlcmF0b3IuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jbGFzc29mLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYW4taW5zdGFuY2UuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLWNhbGwuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1hcnJheS1pdGVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19mb3Itb2YuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faW52b2tlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdGFzay5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX21pY3JvdGFzay5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19wZXJmb3JtLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdXNlci1hZ2VudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3Byb21pc2UtcmVzb2x2ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3JlZGVmaW5lLWFsbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NldC1zcGVjaWVzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1kZXRlY3QuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5wcm9taXNlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcucHJvbWlzZS5maW5hbGx5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcucHJvbWlzZS50cnkuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9wcm9taXNlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2NvcmUtanMvcHJvbWlzZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3IuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtcGllLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcGQuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3Qtc2FwLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvY29yZS1qcy9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fbWV0YS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3drcy1leHQuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MtZGVmaW5lLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcHMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19lbnVtLWtleXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1hcnJheS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1nb3BuLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcG4tZXh0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYuc3ltYm9sLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2dldC1vd24tcHJvcGVydHktc3ltYm9scy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9jb3JlLWpzL29iamVjdC9nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3Qua2V5cy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9rZXlzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2NvcmUtanMvb2JqZWN0L2tleXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnR5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2RlZmluZS1wcm9wZXJ0eS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9jb3JlLWpzL29iamVjdC9kZWZpbmUtcHJvcGVydHkuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2V0LXByb3RvLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LnNldC1wcm90b3R5cGUtb2YuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3Qvc2V0LXByb3RvdHlwZS1vZi5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9jb3JlLWpzL29iamVjdC9zZXQtcHJvdG90eXBlLW9mLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2V0UHJvdG90eXBlT2YuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0cy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vc3ltYm9sL2l0ZXJhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2NvcmUtanMvc3ltYm9sL2l0ZXJhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcuc3ltYm9sLm9ic2VydmFibGUuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9zeW1ib2wvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvY29yZS1qcy9zeW1ib2wuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2YuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LmdldC1wcm90b3R5cGUtb2YuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZ2V0LXByb3RvdHlwZS1vZi5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9jb3JlLWpzL29iamVjdC9nZXQtcHJvdG90eXBlLW9mLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2YuanMiLCIuLi9zcmMvdXRpbHMvZXh0ZW5kLmpzIiwiLi4vc3JjL3V0aWxzL3RyYW5zZm9ybURhdGEuanMiLCIuLi9ub2RlX21vZHVsZXMvdGhyZWUvYnVpbGQvdGhyZWUubW9kdWxlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL21pbml2ZW50cy9kaXN0L21pbml2ZW50cy5jb21tb25qcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm9iamVjdC5jcmVhdGUuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvY3JlYXRlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2NvcmUtanMvb2JqZWN0L2NyZWF0ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3ZhbGlkYXRlLWNvbGxlY3Rpb24uanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb2xsZWN0aW9uLXN0cm9uZy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FycmF5LXNwZWNpZXMtY29uc3RydWN0b3IuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hcnJheS1zcGVjaWVzLWNyZWF0ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FycmF5LW1ldGhvZHMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb2xsZWN0aW9uLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYubWFwLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYXJyYXktZnJvbS1pdGVyYWJsZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NvbGxlY3Rpb24tdG8tanNvbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3Lm1hcC50by1qc29uLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2V0LWNvbGxlY3Rpb24tb2YuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5tYXAub2YuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zZXQtY29sbGVjdGlvbi1mcm9tLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcubWFwLmZyb20uanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9tYXAuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvY29yZS1qcy9tYXAuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19iaW5kLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYucmVmbGVjdC5jb25zdHJ1Y3QuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9yZWZsZWN0L2NvbnN0cnVjdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9jb3JlLWpzL3JlZmxlY3QvY29uc3RydWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvY29uc3RydWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvd3JhcE5hdGl2ZVN1cGVyLmpzIiwiLi4vc3JjL2NvcmUvZXJyb3JzLmpzIiwiLi4vc3JjL2NvcmUvTW9kdWxlU3lzdGVtLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXJyYXlXaXRoSG9sZXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2NvcmUuZ2V0LWl0ZXJhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vZ2V0LWl0ZXJhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2NvcmUtanMvZ2V0LWl0ZXJhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaXRlcmFibGVUb0FycmF5TGltaXQuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9ub25JdGVyYWJsZVJlc3QuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3N5bWJvbC1vYnNlcnZhYmxlL2VzL3BvbnlmaWxsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3N5bWJvbC1vYnNlcnZhYmxlL2VzL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlZHV4L2VzL3JlZHV4LmpzIiwiLi4vc3JjL2NvcmUvTW9kdWxlTWFuYWdlci5qcyIsIi4uL3NyYy9jb3JlL0NvbXBvbmVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vcmVmbGVjdC9nZXQuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvY29yZS1qcy9yZWZsZWN0L2dldC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3N1cGVyUHJvcEJhc2UuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXQuanMiLCIuLi9zcmMvY29yZS9wcm90b3R5cGUvYXR0cmlidXRlcy5qcyIsIi4uL3NyYy9jb3JlL01lc2hDb21wb25lbnQuanMiLCIuLi9zcmMvY29yZS9MaWdodENvbXBvbmVudC5qcyIsIi4uL3NyYy9jb3JlL0NhbWVyYUNvbXBvbmVudC5qcyIsIi4uL3NyYy9wb2x5ZmlsbC5qcyIsIi4uL3NyYy9jb3JlL0FwcC5qcyIsIi4uL3NyYy9jb3JlL0xvb3AuanMiLCIuLi9zcmMvY29yZS9pbmRleC5qcyIsIi4uL3NyYy9jb21wb25lbnRzL2xpZ2h0cy9BbWJpZW50TGlnaHQuanMiLCIuLi9zcmMvY29tcG9uZW50cy9saWdodHMvRGlyZWN0aW9uYWxMaWdodC5qcyIsIi4uL3NyYy9jb21wb25lbnRzL2xpZ2h0cy9IZW1pc3BoZXJlTGlnaHQuanMiLCIuLi9zcmMvY29tcG9uZW50cy9saWdodHMvUG9pbnRMaWdodC5qcyIsIi4uL3NyYy9jb21wb25lbnRzL2xpZ2h0cy9TcG90TGlnaHQuanMiLCIuLi9zcmMvY29tcG9uZW50cy9saWdodHMvQXJlYUxpZ2h0LmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbGlnaHRzL2luZGV4LmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvY2FtZXJhcy9DdWJlQ2FtZXJhLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvY2FtZXJhcy9PcnRob2dyYXBoaWNDYW1lcmEuanMiLCIuLi9zcmMvY29tcG9uZW50cy9jYW1lcmFzL1BlcnNwZWN0aXZlQ2FtZXJhLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvY2FtZXJhcy9pbmRleC5qcyIsIi4uL3NyYy9jb21wb25lbnRzL21lc2hlcy9Cb3guanMiLCIuLi9zcmMvY29tcG9uZW50cy9tZXNoZXMvQ2lyY2xlLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbWVzaGVzL0NvbmUuanMiLCIuLi9zcmMvY29tcG9uZW50cy9tZXNoZXMvQ3lsaW5kZXIuanMiLCIuLi9zcmMvY29tcG9uZW50cy9tZXNoZXMvRG9kZWNhaGVkcm9uLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbWVzaGVzL0V4dHJ1ZGUuanMiLCIuLi9zcmMvY29tcG9uZW50cy9tZXNoZXMvSWNvc2FoZWRyb24uanMiLCIuLi9zcmMvY29tcG9uZW50cy9tZXNoZXMvTGF0aGUuanMiLCIuLi9zcmMvY29tcG9uZW50cy9tZXNoZXMvTGluZS5qcyIsIi4uL3NyYy9jb21wb25lbnRzL21lc2hlcy9JbXBvcnRlci5qcyIsIi4uL3NyYy9jb21wb25lbnRzL21lc2hlcy9PY3RhaGVkcm9uLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbWVzaGVzL1BhcmFtZXRyaWMuanMiLCIuLi9zcmMvY29tcG9uZW50cy9tZXNoZXMvUGxhbmUuanMiLCIuLi9zcmMvY29tcG9uZW50cy9tZXNoZXMvUG9seWhlZHJvbi5qcyIsIi4uL3NyYy9jb21wb25lbnRzL21lc2hlcy9SaW5nLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbWVzaGVzL1NoYXBlLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbWVzaGVzL1NwaGVyZS5qcyIsIi4uL3NyYy9jb21wb25lbnRzL21lc2hlcy9UZXRyYWhlZHJvbi5qcyIsIi4uL3NyYy9jb21wb25lbnRzL21lc2hlcy9UZXh0LmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbWVzaGVzL1RvcnVzLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbWVzaGVzL1RvcnVza25vdC5qcyIsIi4uL3NyYy9jb21wb25lbnRzL21lc2hlcy9UdWJlLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbWVzaGVzL0dyb3VwLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbWVzaGVzL2luZGV4LmpzIiwiLi4vc3JjL21vZHVsZXMvYXBwL0VsZW1lbnRNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9hcHAvUmVuZGVyaW5nTW9kdWxlLmpzIiwiLi4vc3JjL21vZHVsZXMvYXBwL1NjZW5lTW9kdWxlLmpzIiwiLi4vc3JjL21vZHVsZXMvYXBwL1Jlc2l6ZU1vZHVsZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvbWF0ZXJpYWxzL0FkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9tYXRlcmlhbHMvQm9rZWhNYXRlcmlhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvbWF0ZXJpYWxzL0NvbG9yRWRnZXNNYXRlcmlhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvbWF0ZXJpYWxzL0NvbWJpbmVNYXRlcmlhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvbWF0ZXJpYWxzL0NvbnZvbHV0aW9uTWF0ZXJpYWwuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL21hdGVyaWFscy9Db3B5TWF0ZXJpYWwuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL21hdGVyaWFscy9EZXB0aENvbXBhcmlzb25NYXRlcmlhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvbWF0ZXJpYWxzL0RvdFNjcmVlbk1hdGVyaWFsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9tYXRlcmlhbHMvRmlsbU1hdGVyaWFsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9tYXRlcmlhbHMvR2xpdGNoTWF0ZXJpYWwuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL21hdGVyaWFscy9Hb2RSYXlzTWF0ZXJpYWwuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL21hdGVyaWFscy9MdW1pbm9zaXR5TWF0ZXJpYWwuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL21hdGVyaWFscy9PdXRsaW5lQmxlbmRNYXRlcmlhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvbWF0ZXJpYWxzL091dGxpbmVFZGdlc01hdGVyaWFsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9tYXRlcmlhbHMvUGl4ZWxhdGlvbk1hdGVyaWFsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9tYXRlcmlhbHMvUmVhbGlzdGljQm9rZWhNYXRlcmlhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvbWF0ZXJpYWxzL1Nob2NrV2F2ZU1hdGVyaWFsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9tYXRlcmlhbHMvU01BQUJsZW5kTWF0ZXJpYWwuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL21hdGVyaWFscy9TTUFBV2VpZ2h0c01hdGVyaWFsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9tYXRlcmlhbHMvVG9uZU1hcHBpbmdNYXRlcmlhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvbWF0ZXJpYWxzL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvUGFzcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvcGFzc2VzL0JsdXJQYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvQmxvb21QYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvQm9rZWhQYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvQ2xlYXJNYXNrUGFzcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvcGFzc2VzL0NsZWFyUGFzcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvcGFzc2VzL0RvdFNjcmVlblBhc3MuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL3Bhc3Nlcy9GaWxtUGFzcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvcGFzc2VzL0dsaXRjaFBhc3MuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL3Bhc3Nlcy9SZW5kZXJQYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvR29kUmF5c1Bhc3MuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL3Bhc3Nlcy9NYXNrUGFzcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvcGFzc2VzL1NoYWRlclBhc3MuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL3Bhc3Nlcy9PdXRsaW5lUGFzcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvcGFzc2VzL1BpeGVsYXRpb25QYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvUmVhbGlzdGljQm9rZWhQYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvU2F2ZVBhc3MuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL3Bhc3Nlcy9TaG9ja1dhdmVQYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9tYXRlcmlhbHMvaW1hZ2VzL3NtYWEvc2VhcmNoSW1hZ2VEYXRhVVJMLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9tYXRlcmlhbHMvaW1hZ2VzL3NtYWEvYXJlYUltYWdlRGF0YVVSTC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvcGFzc2VzL1NNQUFQYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvVGV4dHVyZVBhc3MuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL3Bhc3Nlcy9Ub25lTWFwcGluZ1Bhc3MuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL3Bhc3Nlcy9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvY29yZS9FZmZlY3RDb21wb3Nlci5qcyIsIi4uL3NyYy9tb2R1bGVzL2FwcC9Qb3N0UHJvY2Vzc29yTW9kdWxlLmpzIiwiLi4vc3JjL21vZHVsZXMvYXBwL0V2ZW50c1BhdGNoTW9kdWxlLmpzIiwiLi4vc3JjL21vZHVsZXMvYXBwL1ZpcnR1YWxNb3VzZU1vZHVsZS5qcyIsIi4uL3NyYy9tb2R1bGVzL2FwcC9Db250cm9sc01vZHVsZS5qcyIsIi4uL3NyYy9tb2R1bGVzL2FwcC9Gb2dNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9hcHAvU3RhdGVNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9hcHAvY29udHJvbHMvbGliL1RocmVlT3JiaXRDb250cm9scy5qcyIsIi4uL3NyYy9tb2R1bGVzL2FwcC9jb250cm9scy9PcmJpdENvbnRyb2xzTW9kdWxlLmpzIiwiLi4vc3JjL21vZHVsZXMvYXBwL2NvbnRyb2xzL2luZGV4LmpzIiwiLi4vc3JjL21vZHVsZXMvYXBwL2luZGV4LmpzIiwiLi4vc3JjL21vZHVsZXMvbWVzaC9EeW5hbWljR2VvbWV0cnlNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9tZXNoL1RleHR1cmVNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9tZXNoL0FuaW1hdGlvbk1vZHVsZS5qcyIsIi4uL3NyYy9tb2R1bGVzL21lc2gvaW5kZXguanMiLCIuLi9zcmMvbW9kdWxlcy9EZWZpbmVNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9pbmRleC5qcyIsIi4uL3NyYy9kZXByZWNhdGlvbi5qcyIsIi4uL3NyYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbiEoZnVuY3Rpb24oZ2xvYmFsKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIHZhciBPcCA9IE9iamVjdC5wcm90b3R5cGU7XG4gIHZhciBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eTtcbiAgdmFyIHVuZGVmaW5lZDsgLy8gTW9yZSBjb21wcmVzc2libGUgdGhhbiB2b2lkIDAuXG4gIHZhciAkU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiID8gU3ltYm9sIDoge307XG4gIHZhciBpdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuaXRlcmF0b3IgfHwgXCJAQGl0ZXJhdG9yXCI7XG4gIHZhciBhc3luY0l0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8IFwiQEBhc3luY0l0ZXJhdG9yXCI7XG4gIHZhciB0b1N0cmluZ1RhZ1N5bWJvbCA9ICRTeW1ib2wudG9TdHJpbmdUYWcgfHwgXCJAQHRvU3RyaW5nVGFnXCI7XG5cbiAgdmFyIGluTW9kdWxlID0gdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIjtcbiAgdmFyIHJ1bnRpbWUgPSBnbG9iYWwucmVnZW5lcmF0b3JSdW50aW1lO1xuICBpZiAocnVudGltZSkge1xuICAgIGlmIChpbk1vZHVsZSkge1xuICAgICAgLy8gSWYgcmVnZW5lcmF0b3JSdW50aW1lIGlzIGRlZmluZWQgZ2xvYmFsbHkgYW5kIHdlJ3JlIGluIGEgbW9kdWxlLFxuICAgICAgLy8gbWFrZSB0aGUgZXhwb3J0cyBvYmplY3QgaWRlbnRpY2FsIHRvIHJlZ2VuZXJhdG9yUnVudGltZS5cbiAgICAgIG1vZHVsZS5leHBvcnRzID0gcnVudGltZTtcbiAgICB9XG4gICAgLy8gRG9uJ3QgYm90aGVyIGV2YWx1YXRpbmcgdGhlIHJlc3Qgb2YgdGhpcyBmaWxlIGlmIHRoZSBydW50aW1lIHdhc1xuICAgIC8vIGFscmVhZHkgZGVmaW5lZCBnbG9iYWxseS5cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBEZWZpbmUgdGhlIHJ1bnRpbWUgZ2xvYmFsbHkgKGFzIGV4cGVjdGVkIGJ5IGdlbmVyYXRlZCBjb2RlKSBhcyBlaXRoZXJcbiAgLy8gbW9kdWxlLmV4cG9ydHMgKGlmIHdlJ3JlIGluIGEgbW9kdWxlKSBvciBhIG5ldywgZW1wdHkgb2JqZWN0LlxuICBydW50aW1lID0gZ2xvYmFsLnJlZ2VuZXJhdG9yUnVudGltZSA9IGluTW9kdWxlID8gbW9kdWxlLmV4cG9ydHMgOiB7fTtcblxuICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gSWYgb3V0ZXJGbiBwcm92aWRlZCBhbmQgb3V0ZXJGbi5wcm90b3R5cGUgaXMgYSBHZW5lcmF0b3IsIHRoZW4gb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IuXG4gICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3I7XG4gICAgdmFyIGdlbmVyYXRvciA9IE9iamVjdC5jcmVhdGUocHJvdG9HZW5lcmF0b3IucHJvdG90eXBlKTtcbiAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTtcblxuICAgIC8vIFRoZSAuX2ludm9rZSBtZXRob2QgdW5pZmllcyB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMuXG4gICAgZ2VuZXJhdG9yLl9pbnZva2UgPSBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfVxuICBydW50aW1lLndyYXAgPSB3cmFwO1xuXG4gIC8vIFRyeS9jYXRjaCBoZWxwZXIgdG8gbWluaW1pemUgZGVvcHRpbWl6YXRpb25zLiBSZXR1cm5zIGEgY29tcGxldGlvblxuICAvLyByZWNvcmQgbGlrZSBjb250ZXh0LnRyeUVudHJpZXNbaV0uY29tcGxldGlvbi4gVGhpcyBpbnRlcmZhY2UgY291bGRcbiAgLy8gaGF2ZSBiZWVuIChhbmQgd2FzIHByZXZpb3VzbHkpIGRlc2lnbmVkIHRvIHRha2UgYSBjbG9zdXJlIHRvIGJlXG4gIC8vIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHMsIGJ1dCBpbiBhbGwgdGhlIGNhc2VzIHdlIGNhcmUgYWJvdXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG1ldGhvZCB3ZSB3YW50IHRvIGNhbGwsIHNvIHRoZXJlJ3Mgbm8gbmVlZFxuICAvLyB0byBjcmVhdGUgYSBuZXcgZnVuY3Rpb24gb2JqZWN0LiBXZSBjYW4gZXZlbiBnZXQgYXdheSB3aXRoIGFzc3VtaW5nXG4gIC8vIHRoZSBtZXRob2QgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIHNpbmNlIHRoYXQgaGFwcGVucyB0byBiZSB0cnVlXG4gIC8vIGluIGV2ZXJ5IGNhc2UsIHNvIHdlIGRvbid0IGhhdmUgdG8gdG91Y2ggdGhlIGFyZ3VtZW50cyBvYmplY3QuIFRoZVxuICAvLyBvbmx5IGFkZGl0aW9uYWwgYWxsb2NhdGlvbiByZXF1aXJlZCBpcyB0aGUgY29tcGxldGlvbiByZWNvcmQsIHdoaWNoXG4gIC8vIGhhcyBhIHN0YWJsZSBzaGFwZSBhbmQgc28gaG9wZWZ1bGx5IHNob3VsZCBiZSBjaGVhcCB0byBhbGxvY2F0ZS5cbiAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwibm9ybWFsXCIsIGFyZzogZm4uY2FsbChvYmosIGFyZykgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwidGhyb3dcIiwgYXJnOiBlcnIgfTtcbiAgICB9XG4gIH1cblxuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRTdGFydCA9IFwic3VzcGVuZGVkU3RhcnRcIjtcbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkWWllbGQgPSBcInN1c3BlbmRlZFlpZWxkXCI7XG4gIHZhciBHZW5TdGF0ZUV4ZWN1dGluZyA9IFwiZXhlY3V0aW5nXCI7XG4gIHZhciBHZW5TdGF0ZUNvbXBsZXRlZCA9IFwiY29tcGxldGVkXCI7XG5cbiAgLy8gUmV0dXJuaW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGlubmVyRm4gaGFzIHRoZSBzYW1lIGVmZmVjdCBhc1xuICAvLyBicmVha2luZyBvdXQgb2YgdGhlIGRpc3BhdGNoIHN3aXRjaCBzdGF0ZW1lbnQuXG4gIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307XG5cbiAgLy8gRHVtbXkgY29uc3RydWN0b3IgZnVuY3Rpb25zIHRoYXQgd2UgdXNlIGFzIHRoZSAuY29uc3RydWN0b3IgYW5kXG4gIC8vIC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcyBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIEdlbmVyYXRvclxuICAvLyBvYmplY3RzLiBGb3IgZnVsbCBzcGVjIGNvbXBsaWFuY2UsIHlvdSBtYXkgd2lzaCB0byBjb25maWd1cmUgeW91clxuICAvLyBtaW5pZmllciBub3QgdG8gbWFuZ2xlIHRoZSBuYW1lcyBvZiB0aGVzZSB0d28gZnVuY3Rpb25zLlxuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cblxuICAvLyBUaGlzIGlzIGEgcG9seWZpbGwgZm9yICVJdGVyYXRvclByb3RvdHlwZSUgZm9yIGVudmlyb25tZW50cyB0aGF0XG4gIC8vIGRvbid0IG5hdGl2ZWx5IHN1cHBvcnQgaXQuXG4gIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuICBJdGVyYXRvclByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuICB2YXIgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90byAmJiBnZXRQcm90byhnZXRQcm90byh2YWx1ZXMoW10pKSk7XG4gIGlmIChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAmJlxuICAgICAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmXG4gICAgICBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpKSB7XG4gICAgLy8gVGhpcyBlbnZpcm9ubWVudCBoYXMgYSBuYXRpdmUgJUl0ZXJhdG9yUHJvdG90eXBlJTsgdXNlIGl0IGluc3RlYWRcbiAgICAvLyBvZiB0aGUgcG9seWZpbGwuXG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBOYXRpdmVJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxuXG4gIHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9XG4gICAgR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHcC5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZVt0b1N0cmluZ1RhZ1N5bWJvbF0gPVxuICAgIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gXCJHZW5lcmF0b3JGdW5jdGlvblwiO1xuXG4gIC8vIEhlbHBlciBmb3IgZGVmaW5pbmcgdGhlIC5uZXh0LCAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMgb2YgdGhlXG4gIC8vIEl0ZXJhdG9yIGludGVyZmFjZSBpbiB0ZXJtcyBvZiBhIHNpbmdsZSAuX2ludm9rZSBtZXRob2QuXG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgIHByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHJ1bnRpbWUuaXNHZW5lcmF0b3JGdW5jdGlvbiA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIHZhciBjdG9yID0gdHlwZW9mIGdlbkZ1biA9PT0gXCJmdW5jdGlvblwiICYmIGdlbkZ1bi5jb25zdHJ1Y3RvcjtcbiAgICByZXR1cm4gY3RvclxuICAgICAgPyBjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fFxuICAgICAgICAvLyBGb3IgdGhlIG5hdGl2ZSBHZW5lcmF0b3JGdW5jdGlvbiBjb25zdHJ1Y3RvciwgdGhlIGJlc3Qgd2UgY2FuXG4gICAgICAgIC8vIGRvIGlzIHRvIGNoZWNrIGl0cyAubmFtZSBwcm9wZXJ0eS5cbiAgICAgICAgKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSA9PT0gXCJHZW5lcmF0b3JGdW5jdGlvblwiXG4gICAgICA6IGZhbHNlO1xuICB9O1xuXG4gIHJ1bnRpbWUubWFyayA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihnZW5GdW4sIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICAgICAgaWYgKCEodG9TdHJpbmdUYWdTeW1ib2wgaW4gZ2VuRnVuKSkge1xuICAgICAgICBnZW5GdW5bdG9TdHJpbmdUYWdTeW1ib2xdID0gXCJHZW5lcmF0b3JGdW5jdGlvblwiO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCk7XG4gICAgcmV0dXJuIGdlbkZ1bjtcbiAgfTtcblxuICAvLyBXaXRoaW4gdGhlIGJvZHkgb2YgYW55IGFzeW5jIGZ1bmN0aW9uLCBgYXdhaXQgeGAgaXMgdHJhbnNmb3JtZWQgdG9cbiAgLy8gYHlpZWxkIHJlZ2VuZXJhdG9yUnVudGltZS5hd3JhcCh4KWAsIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIHRlc3RcbiAgLy8gYGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIilgIHRvIGRldGVybWluZSBpZiB0aGUgeWllbGRlZCB2YWx1ZSBpc1xuICAvLyBtZWFudCB0byBiZSBhd2FpdGVkLlxuICBydW50aW1lLmF3cmFwID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHsgX19hd2FpdDogYXJnIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICByZWplY3QocmVjb3JkLmFyZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZztcbiAgICAgICAgdmFyIHZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgaW52b2tlKFwibmV4dFwiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgIGludm9rZShcInRocm93XCIsIGVyciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24odW53cmFwcGVkKSB7XG4gICAgICAgICAgLy8gV2hlbiBhIHlpZWxkZWQgUHJvbWlzZSBpcyByZXNvbHZlZCwgaXRzIGZpbmFsIHZhbHVlIGJlY29tZXNcbiAgICAgICAgICAvLyB0aGUgLnZhbHVlIG9mIHRoZSBQcm9taXNlPHt2YWx1ZSxkb25lfT4gcmVzdWx0IGZvciB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IGl0ZXJhdGlvbi4gSWYgdGhlIFByb21pc2UgaXMgcmVqZWN0ZWQsIGhvd2V2ZXIsIHRoZVxuICAgICAgICAgIC8vIHJlc3VsdCBmb3IgdGhpcyBpdGVyYXRpb24gd2lsbCBiZSByZWplY3RlZCB3aXRoIHRoZSBzYW1lXG4gICAgICAgICAgLy8gcmVhc29uLiBOb3RlIHRoYXQgcmVqZWN0aW9ucyBvZiB5aWVsZGVkIFByb21pc2VzIGFyZSBub3RcbiAgICAgICAgICAvLyB0aHJvd24gYmFjayBpbnRvIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24sIGFzIGlzIHRoZSBjYXNlXG4gICAgICAgICAgLy8gd2hlbiBhbiBhd2FpdGVkIFByb21pc2UgaXMgcmVqZWN0ZWQuIFRoaXMgZGlmZmVyZW5jZSBpblxuICAgICAgICAgIC8vIGJlaGF2aW9yIGJldHdlZW4geWllbGQgYW5kIGF3YWl0IGlzIGltcG9ydGFudCwgYmVjYXVzZSBpdFxuICAgICAgICAgIC8vIGFsbG93cyB0aGUgY29uc3VtZXIgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCB0aGUgeWllbGRlZFxuICAgICAgICAgIC8vIHJlamVjdGlvbiAoc3dhbGxvdyBpdCBhbmQgY29udGludWUsIG1hbnVhbGx5IC50aHJvdyBpdCBiYWNrXG4gICAgICAgICAgLy8gaW50byB0aGUgZ2VuZXJhdG9yLCBhYmFuZG9uIGl0ZXJhdGlvbiwgd2hhdGV2ZXIpLiBXaXRoXG4gICAgICAgICAgLy8gYXdhaXQsIGJ5IGNvbnRyYXN0LCB0aGVyZSBpcyBubyBvcHBvcnR1bml0eSB0byBleGFtaW5lIHRoZVxuICAgICAgICAgIC8vIHJlamVjdGlvbiByZWFzb24gb3V0c2lkZSB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBzbyB0aGVcbiAgICAgICAgICAvLyBvbmx5IG9wdGlvbiBpcyB0byB0aHJvdyBpdCBmcm9tIHRoZSBhd2FpdCBleHByZXNzaW9uLCBhbmRcbiAgICAgICAgICAvLyBsZXQgdGhlIGdlbmVyYXRvciBmdW5jdGlvbiBoYW5kbGUgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQ7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwcmV2aW91c1Byb21pc2U7XG5cbiAgICBmdW5jdGlvbiBlbnF1ZXVlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPVxuICAgICAgICAvLyBJZiBlbnF1ZXVlIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byB3YWl0IHVudGlsXG4gICAgICAgIC8vIGFsbCBwcmV2aW91cyBQcm9taXNlcyBoYXZlIGJlZW4gcmVzb2x2ZWQgYmVmb3JlIGNhbGxpbmcgaW52b2tlLFxuICAgICAgICAvLyBzbyB0aGF0IHJlc3VsdHMgYXJlIGFsd2F5cyBkZWxpdmVyZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIElmXG4gICAgICAgIC8vIGVucXVldWUgaGFzIG5vdCBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRvXG4gICAgICAgIC8vIGNhbGwgaW52b2tlIGltbWVkaWF0ZWx5LCB3aXRob3V0IHdhaXRpbmcgb24gYSBjYWxsYmFjayB0byBmaXJlLFxuICAgICAgICAvLyBzbyB0aGF0IHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gaGFzIHRoZSBvcHBvcnR1bml0eSB0byBkb1xuICAgICAgICAvLyBhbnkgbmVjZXNzYXJ5IHNldHVwIGluIGEgcHJlZGljdGFibGUgd2F5LiBUaGlzIHByZWRpY3RhYmlsaXR5XG4gICAgICAgIC8vIGlzIHdoeSB0aGUgUHJvbWlzZSBjb25zdHJ1Y3RvciBzeW5jaHJvbm91c2x5IGludm9rZXMgaXRzXG4gICAgICAgIC8vIGV4ZWN1dG9yIGNhbGxiYWNrLCBhbmQgd2h5IGFzeW5jIGZ1bmN0aW9ucyBzeW5jaHJvbm91c2x5XG4gICAgICAgIC8vIGV4ZWN1dGUgY29kZSBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0LiBTaW5jZSB3ZSBpbXBsZW1lbnQgc2ltcGxlXG4gICAgICAgIC8vIGFzeW5jIGZ1bmN0aW9ucyBpbiB0ZXJtcyBvZiBhc3luYyBnZW5lcmF0b3JzLCBpdCBpcyBlc3BlY2lhbGx5XG4gICAgICAgIC8vIGltcG9ydGFudCB0byBnZXQgdGhpcyByaWdodCwgZXZlbiB0aG91Z2ggaXQgcmVxdWlyZXMgY2FyZS5cbiAgICAgICAgcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsXG4gICAgICAgICAgLy8gQXZvaWQgcHJvcGFnYXRpbmcgZmFpbHVyZXMgdG8gUHJvbWlzZXMgcmV0dXJuZWQgYnkgbGF0ZXJcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBvZiB0aGUgaXRlcmF0b3IuXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmdcbiAgICAgICAgKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7XG4gICAgfVxuXG4gICAgLy8gRGVmaW5lIHRoZSB1bmlmaWVkIGhlbHBlciBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGltcGxlbWVudCAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIChzZWUgZGVmaW5lSXRlcmF0b3JNZXRob2RzKS5cbiAgICB0aGlzLl9pbnZva2UgPSBlbnF1ZXVlO1xuICB9XG5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKTtcbiAgQXN5bmNJdGVyYXRvci5wcm90b3R5cGVbYXN5bmNJdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIHJ1bnRpbWUuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3I7XG5cbiAgLy8gTm90ZSB0aGF0IHNpbXBsZSBhc3luYyBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZlxuICAvLyBBc3luY0l0ZXJhdG9yIG9iamVjdHM7IHRoZXkganVzdCByZXR1cm4gYSBQcm9taXNlIGZvciB0aGUgdmFsdWUgb2ZcbiAgLy8gdGhlIGZpbmFsIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgaXRlcmF0b3IuXG4gIHJ1bnRpbWUuYXN5bmMgPSBmdW5jdGlvbihpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3IoXG4gICAgICB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KVxuICAgICk7XG5cbiAgICByZXR1cm4gcnVudGltZS5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pXG4gICAgICA/IGl0ZXIgLy8gSWYgb3V0ZXJGbiBpcyBhIGdlbmVyYXRvciwgcmV0dXJuIHRoZSBmdWxsIGl0ZXJhdG9yLlxuICAgICAgOiBpdGVyLm5leHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IHJlc3VsdC52YWx1ZSA6IGl0ZXIubmV4dCgpO1xuICAgICAgICB9KTtcbiAgfTtcblxuICBmdW5jdGlvbiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIHtcbiAgICB2YXIgc3RhdGUgPSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0O1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZykge1xuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUV4ZWN1dGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlQ29tcGxldGVkKSB7XG4gICAgICAgIGlmIChtZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHRocm93IGFyZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJlIGZvcmdpdmluZywgcGVyIDI1LjMuMy4zLjMgb2YgdGhlIHNwZWM6XG4gICAgICAgIC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1nZW5lcmF0b3JyZXN1bWVcbiAgICAgICAgcmV0dXJuIGRvbmVSZXN1bHQoKTtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5tZXRob2QgPSBtZXRob2Q7XG4gICAgICBjb250ZXh0LmFyZyA9IGFyZztcblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIGRlbGVnYXRlID0gY29udGV4dC5kZWxlZ2F0ZTtcbiAgICAgICAgaWYgKGRlbGVnYXRlKSB7XG4gICAgICAgICAgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG4gICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlUmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgICAvLyBTZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgICAgIGNvbnRleHQuc2VudCA9IGNvbnRleHQuX3NlbnQgPSBjb250ZXh0LmFyZztcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQpIHtcbiAgICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgICB0aHJvdyBjb250ZXh0LmFyZztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInJldHVyblwiKSB7XG4gICAgICAgICAgY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgY29udGV4dC5hcmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUV4ZWN1dGluZztcblxuICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG4gICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIikge1xuICAgICAgICAgIC8vIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSBpbm5lckZuLCB3ZSBsZWF2ZSBzdGF0ZSA9PT1cbiAgICAgICAgICAvLyBHZW5TdGF0ZUV4ZWN1dGluZyBhbmQgbG9vcCBiYWNrIGZvciBhbm90aGVyIGludm9jYXRpb24uXG4gICAgICAgICAgc3RhdGUgPSBjb250ZXh0LmRvbmVcbiAgICAgICAgICAgID8gR2VuU3RhdGVDb21wbGV0ZWRcbiAgICAgICAgICAgIDogR2VuU3RhdGVTdXNwZW5kZWRZaWVsZDtcblxuICAgICAgICAgIGlmIChyZWNvcmQuYXJnID09PSBDb250aW51ZVNlbnRpbmVsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5hcmcsXG4gICAgICAgICAgICBkb25lOiBjb250ZXh0LmRvbmVcbiAgICAgICAgICB9O1xuXG4gICAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGV4Y2VwdGlvbiBieSBsb29waW5nIGJhY2sgYXJvdW5kIHRvIHRoZVxuICAgICAgICAgIC8vIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpIGNhbGwgYWJvdmUuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIENhbGwgZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdKGNvbnRleHQuYXJnKSBhbmQgaGFuZGxlIHRoZVxuICAvLyByZXN1bHQsIGVpdGhlciBieSByZXR1cm5pbmcgYSB7IHZhbHVlLCBkb25lIH0gcmVzdWx0IGZyb20gdGhlXG4gIC8vIGRlbGVnYXRlIGl0ZXJhdG9yLCBvciBieSBtb2RpZnlpbmcgY29udGV4dC5tZXRob2QgYW5kIGNvbnRleHQuYXJnLFxuICAvLyBzZXR0aW5nIGNvbnRleHQuZGVsZWdhdGUgdG8gbnVsbCwgYW5kIHJldHVybmluZyB0aGUgQ29udGludWVTZW50aW5lbC5cbiAgZnVuY3Rpb24gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCkge1xuICAgIHZhciBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF07XG4gICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBBIC50aHJvdyBvciAucmV0dXJuIHdoZW4gdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBubyAudGhyb3dcbiAgICAgIC8vIG1ldGhvZCBhbHdheXMgdGVybWluYXRlcyB0aGUgeWllbGQqIGxvb3AuXG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgaWYgKGRlbGVnYXRlLml0ZXJhdG9yLnJldHVybikge1xuICAgICAgICAgIC8vIElmIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgYSByZXR1cm4gbWV0aG9kLCBnaXZlIGl0IGFcbiAgICAgICAgICAvLyBjaGFuY2UgdG8gY2xlYW4gdXAuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuXG4gICAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIC8vIElmIG1heWJlSW52b2tlRGVsZWdhdGUoY29udGV4dCkgY2hhbmdlZCBjb250ZXh0Lm1ldGhvZCBmcm9tXG4gICAgICAgICAgICAvLyBcInJldHVyblwiIHRvIFwidGhyb3dcIiwgbGV0IHRoYXQgb3ZlcnJpZGUgdGhlIFR5cGVFcnJvciBiZWxvdy5cbiAgICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpO1xuXG4gICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7XG5cbiAgICBpZiAoISBpbmZvKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAvLyBBc3NpZ24gdGhlIHJlc3VsdCBvZiB0aGUgZmluaXNoZWQgZGVsZWdhdGUgdG8gdGhlIHRlbXBvcmFyeVxuICAgICAgLy8gdmFyaWFibGUgc3BlY2lmaWVkIGJ5IGRlbGVnYXRlLnJlc3VsdE5hbWUgKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlO1xuXG4gICAgICAvLyBSZXN1bWUgZXhlY3V0aW9uIGF0IHRoZSBkZXNpcmVkIGxvY2F0aW9uIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jO1xuXG4gICAgICAvLyBJZiBjb250ZXh0Lm1ldGhvZCB3YXMgXCJ0aHJvd1wiIGJ1dCB0aGUgZGVsZWdhdGUgaGFuZGxlZCB0aGVcbiAgICAgIC8vIGV4Y2VwdGlvbiwgbGV0IHRoZSBvdXRlciBnZW5lcmF0b3IgcHJvY2VlZCBub3JtYWxseS4gSWZcbiAgICAgIC8vIGNvbnRleHQubWV0aG9kIHdhcyBcIm5leHRcIiwgZm9yZ2V0IGNvbnRleHQuYXJnIHNpbmNlIGl0IGhhcyBiZWVuXG4gICAgICAvLyBcImNvbnN1bWVkXCIgYnkgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yLiBJZiBjb250ZXh0Lm1ldGhvZCB3YXNcbiAgICAgIC8vIFwicmV0dXJuXCIsIGFsbG93IHRoZSBvcmlnaW5hbCAucmV0dXJuIGNhbGwgdG8gY29udGludWUgaW4gdGhlXG4gICAgICAvLyBvdXRlciBnZW5lcmF0b3IuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgIT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmUteWllbGQgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgZGVsZWdhdGUgbWV0aG9kLlxuICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgLy8gVGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGlzIGZpbmlzaGVkLCBzbyBmb3JnZXQgaXQgYW5kIGNvbnRpbnVlIHdpdGhcbiAgICAvLyB0aGUgb3V0ZXIgZ2VuZXJhdG9yLlxuICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICB9XG5cbiAgLy8gRGVmaW5lIEdlbmVyYXRvci5wcm90b3R5cGUue25leHQsdGhyb3cscmV0dXJufSBpbiB0ZXJtcyBvZiB0aGVcbiAgLy8gdW5pZmllZCAuX2ludm9rZSBoZWxwZXIgbWV0aG9kLlxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApO1xuXG4gIEdwW3RvU3RyaW5nVGFnU3ltYm9sXSA9IFwiR2VuZXJhdG9yXCI7XG5cbiAgLy8gQSBHZW5lcmF0b3Igc2hvdWxkIGFsd2F5cyByZXR1cm4gaXRzZWxmIGFzIHRoZSBpdGVyYXRvciBvYmplY3Qgd2hlbiB0aGVcbiAgLy8gQEBpdGVyYXRvciBmdW5jdGlvbiBpcyBjYWxsZWQgb24gaXQuIFNvbWUgYnJvd3NlcnMnIGltcGxlbWVudGF0aW9ucyBvZiB0aGVcbiAgLy8gaXRlcmF0b3IgcHJvdG90eXBlIGNoYWluIGluY29ycmVjdGx5IGltcGxlbWVudCB0aGlzLCBjYXVzaW5nIHRoZSBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0IHRvIG5vdCBiZSByZXR1cm5lZCBmcm9tIHRoaXMgY2FsbC4gVGhpcyBlbnN1cmVzIHRoYXQgZG9lc24ndCBoYXBwZW4uXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvaXNzdWVzLzI3NCBmb3IgbW9yZSBkZXRhaWxzLlxuICBHcFtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBHcC50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcIltvYmplY3QgR2VuZXJhdG9yXVwiO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7XG4gICAgdmFyIGVudHJ5ID0geyB0cnlMb2M6IGxvY3NbMF0gfTtcblxuICAgIGlmICgxIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXTtcbiAgICB9XG5cbiAgICBpZiAoMiBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5maW5hbGx5TG9jID0gbG9jc1syXTtcbiAgICAgIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXTtcbiAgICB9XG5cbiAgICB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7XG4gICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307XG4gICAgcmVjb3JkLnR5cGUgPSBcIm5vcm1hbFwiO1xuICAgIGRlbGV0ZSByZWNvcmQuYXJnO1xuICAgIGVudHJ5LmNvbXBsZXRpb24gPSByZWNvcmQ7XG4gIH1cblxuICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gVGhlIHJvb3QgZW50cnkgb2JqZWN0IChlZmZlY3RpdmVseSBhIHRyeSBzdGF0ZW1lbnQgd2l0aG91dCBhIGNhdGNoXG4gICAgLy8gb3IgYSBmaW5hbGx5IGJsb2NrKSBnaXZlcyB1cyBhIHBsYWNlIHRvIHN0b3JlIHZhbHVlcyB0aHJvd24gZnJvbVxuICAgIC8vIGxvY2F0aW9ucyB3aGVyZSB0aGVyZSBpcyBubyBlbmNsb3NpbmcgdHJ5IHN0YXRlbWVudC5cbiAgICB0aGlzLnRyeUVudHJpZXMgPSBbeyB0cnlMb2M6IFwicm9vdFwiIH1dO1xuICAgIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKTtcbiAgICB0aGlzLnJlc2V0KHRydWUpO1xuICB9XG5cbiAgcnVudGltZS5rZXlzID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gICAga2V5cy5yZXZlcnNlKCk7XG5cbiAgICAvLyBSYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gb2JqZWN0IHdpdGggYSBuZXh0IG1ldGhvZCwgd2Uga2VlcFxuICAgIC8vIHRoaW5ncyBzaW1wbGUgYW5kIHJldHVybiB0aGUgbmV4dCBmdW5jdGlvbiBpdHNlbGYuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICB3aGlsZSAoa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgbmV4dC52YWx1ZSA9IGtleTtcbiAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUbyBhdm9pZCBjcmVhdGluZyBhbiBhZGRpdGlvbmFsIG9iamVjdCwgd2UganVzdCBoYW5nIHRoZSAudmFsdWVcbiAgICAgIC8vIGFuZCAuZG9uZSBwcm9wZXJ0aWVzIG9mZiB0aGUgbmV4dCBmdW5jdGlvbiBvYmplY3QgaXRzZWxmLiBUaGlzXG4gICAgICAvLyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgbWluaWZpZXIgd2lsbCBub3QgYW5vbnltaXplIHRoZSBmdW5jdGlvbi5cbiAgICAgIG5leHQuZG9uZSA9IHRydWU7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIHZhbHVlcyhpdGVyYWJsZSkge1xuICAgIGlmIChpdGVyYWJsZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gaXRlcmFibGVbaXRlcmF0b3JTeW1ib2xdO1xuICAgICAgaWYgKGl0ZXJhdG9yTWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvck1ldGhvZC5jYWxsKGl0ZXJhYmxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpdGVyYWJsZS5uZXh0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhYmxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTmFOKGl0ZXJhYmxlLmxlbmd0aCkpIHtcbiAgICAgICAgdmFyIGkgPSAtMSwgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IGl0ZXJhYmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkge1xuICAgICAgICAgICAgICBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV07XG4gICAgICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXh0LnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG5leHQuZG9uZSA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbmV4dC5uZXh0ID0gbmV4dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYW4gaXRlcmF0b3Igd2l0aCBubyB2YWx1ZXMuXG4gICAgcmV0dXJuIHsgbmV4dDogZG9uZVJlc3VsdCB9O1xuICB9XG4gIHJ1bnRpbWUudmFsdWVzID0gdmFsdWVzO1xuXG4gIGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG5cbiAgQ29udGV4dC5wcm90b3R5cGUgPSB7XG4gICAgY29uc3RydWN0b3I6IENvbnRleHQsXG5cbiAgICByZXNldDogZnVuY3Rpb24oc2tpcFRlbXBSZXNldCkge1xuICAgICAgdGhpcy5wcmV2ID0gMDtcbiAgICAgIHRoaXMubmV4dCA9IDA7XG4gICAgICAvLyBSZXNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG5cbiAgICAgIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpO1xuXG4gICAgICBpZiAoIXNraXBUZW1wUmVzZXQpIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzKSB7XG4gICAgICAgICAgLy8gTm90IHN1cmUgYWJvdXQgdGhlIG9wdGltYWwgb3JkZXIgb2YgdGhlc2UgY29uZGl0aW9uczpcbiAgICAgICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT09IFwidFwiICYmXG4gICAgICAgICAgICAgIGhhc093bi5jYWxsKHRoaXMsIG5hbWUpICYmXG4gICAgICAgICAgICAgICFpc05hTigrbmFtZS5zbGljZSgxKSkpIHtcbiAgICAgICAgICAgIHRoaXNbbmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcblxuICAgICAgdmFyIHJvb3RFbnRyeSA9IHRoaXMudHJ5RW50cmllc1swXTtcbiAgICAgIHZhciByb290UmVjb3JkID0gcm9vdEVudHJ5LmNvbXBsZXRpb247XG4gICAgICBpZiAocm9vdFJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcm9vdFJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnJ2YWw7XG4gICAgfSxcblxuICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbihleGNlcHRpb24pIHtcbiAgICAgIGlmICh0aGlzLmRvbmUpIHtcbiAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29udGV4dCA9IHRoaXM7XG4gICAgICBmdW5jdGlvbiBoYW5kbGUobG9jLCBjYXVnaHQpIHtcbiAgICAgICAgcmVjb3JkLnR5cGUgPSBcInRocm93XCI7XG4gICAgICAgIHJlY29yZC5hcmcgPSBleGNlcHRpb247XG4gICAgICAgIGNvbnRleHQubmV4dCA9IGxvYztcblxuICAgICAgICBpZiAoY2F1Z2h0KSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRpc3BhdGNoZWQgZXhjZXB0aW9uIHdhcyBjYXVnaHQgYnkgYSBjYXRjaCBibG9jayxcbiAgICAgICAgICAvLyB0aGVuIGxldCB0aGF0IGNhdGNoIGJsb2NrIGhhbmRsZSB0aGUgZXhjZXB0aW9uIG5vcm1hbGx5LlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gISEgY2F1Z2h0O1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gXCJyb290XCIpIHtcbiAgICAgICAgICAvLyBFeGNlcHRpb24gdGhyb3duIG91dHNpZGUgb2YgYW55IHRyeSBibG9jayB0aGF0IGNvdWxkIGhhbmRsZVxuICAgICAgICAgIC8vIGl0LCBzbyBzZXQgdGhlIGNvbXBsZXRpb24gdmFsdWUgb2YgdGhlIGVudGlyZSBmdW5jdGlvbiB0b1xuICAgICAgICAgIC8vIHRocm93IHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgcmV0dXJuIGhhbmRsZShcImVuZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2KSB7XG4gICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksIFwiY2F0Y2hMb2NcIik7XG4gICAgICAgICAgdmFyIGhhc0ZpbmFsbHkgPSBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpO1xuXG4gICAgICAgICAgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhYnJ1cHQ6IGZ1bmN0aW9uKHR5cGUsIGFyZykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2ICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpICYmXG4gICAgICAgICAgICB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgdmFyIGZpbmFsbHlFbnRyeSA9IGVudHJ5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkgJiZcbiAgICAgICAgICAodHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgIHR5cGUgPT09IFwiY29udGludWVcIikgJiZcbiAgICAgICAgICBmaW5hbGx5RW50cnkudHJ5TG9jIDw9IGFyZyAmJlxuICAgICAgICAgIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAvLyBJZ25vcmUgdGhlIGZpbmFsbHkgZW50cnkgaWYgY29udHJvbCBpcyBub3QganVtcGluZyB0byBhXG4gICAgICAgIC8vIGxvY2F0aW9uIG91dHNpZGUgdGhlIHRyeS9jYXRjaCBibG9jay5cbiAgICAgICAgZmluYWxseUVudHJ5ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlY29yZCA9IGZpbmFsbHlFbnRyeSA/IGZpbmFsbHlFbnRyeS5jb21wbGV0aW9uIDoge307XG4gICAgICByZWNvcmQudHlwZSA9IHR5cGU7XG4gICAgICByZWNvcmQuYXJnID0gYXJnO1xuXG4gICAgICBpZiAoZmluYWxseUVudHJ5KSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIHRoaXMubmV4dCA9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jO1xuICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY29tcGxldGUocmVjb3JkKTtcbiAgICB9LFxuXG4gICAgY29tcGxldGU6IGZ1bmN0aW9uKHJlY29yZCwgYWZ0ZXJMb2MpIHtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgcmVjb3JkLnR5cGUgPT09IFwiY29udGludWVcIikge1xuICAgICAgICB0aGlzLm5leHQgPSByZWNvcmQuYXJnO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICB0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gXCJlbmRcIjtcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIgJiYgYWZ0ZXJMb2MpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gYWZ0ZXJMb2M7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH0sXG5cbiAgICBmaW5pc2g6IGZ1bmN0aW9uKGZpbmFsbHlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykge1xuICAgICAgICAgIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpO1xuICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIFwiY2F0Y2hcIjogZnVuY3Rpb24odHJ5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gdHJ5TG9jKSB7XG4gICAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG4gICAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIHZhciB0aHJvd24gPSByZWNvcmQuYXJnO1xuICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aHJvd247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGNvbnRleHQuY2F0Y2ggbWV0aG9kIG11c3Qgb25seSBiZSBjYWxsZWQgd2l0aCBhIGxvY2F0aW9uXG4gICAgICAvLyBhcmd1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEga25vd24gY2F0Y2ggYmxvY2suXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHRcIik7XG4gICAgfSxcblxuICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uKGl0ZXJhYmxlLCByZXN1bHROYW1lLCBuZXh0TG9jKSB7XG4gICAgICB0aGlzLmRlbGVnYXRlID0ge1xuICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGl0ZXJhYmxlKSxcbiAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSxcbiAgICAgICAgbmV4dExvYzogbmV4dExvY1xuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAvLyBEZWxpYmVyYXRlbHkgZm9yZ2V0IHRoZSBsYXN0IHNlbnQgdmFsdWUgc28gdGhhdCB3ZSBkb24ndFxuICAgICAgICAvLyBhY2NpZGVudGFsbHkgcGFzcyBpdCBvbiB0byB0aGUgZGVsZWdhdGUuXG4gICAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG4gIH07XG59KShcbiAgLy8gSW4gc2xvcHB5IG1vZGUsIHVuYm91bmQgYHRoaXNgIHJlZmVycyB0byB0aGUgZ2xvYmFsIG9iamVjdCwgZmFsbGJhY2sgdG9cbiAgLy8gRnVuY3Rpb24gY29uc3RydWN0b3IgaWYgd2UncmUgaW4gZ2xvYmFsIHN0cmljdCBtb2RlLiBUaGF0IGlzIHNhZGx5IGEgZm9ybVxuICAvLyBvZiBpbmRpcmVjdCBldmFsIHdoaWNoIHZpb2xhdGVzIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5LlxuICAoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzIH0pKCkgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpXG4pO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4vLyBUaGlzIG1ldGhvZCBvZiBvYnRhaW5pbmcgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QgbmVlZHMgdG8gYmVcbi8vIGtlcHQgaWRlbnRpY2FsIHRvIHRoZSB3YXkgaXQgaXMgb2J0YWluZWQgaW4gcnVudGltZS5qc1xudmFyIGcgPSAoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzIH0pKCkgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xuXG4vLyBVc2UgYGdldE93blByb3BlcnR5TmFtZXNgIGJlY2F1c2Ugbm90IGFsbCBicm93c2VycyBzdXBwb3J0IGNhbGxpbmdcbi8vIGBoYXNPd25Qcm9wZXJ0eWAgb24gdGhlIGdsb2JhbCBgc2VsZmAgb2JqZWN0IGluIGEgd29ya2VyLiBTZWUgIzE4My5cbnZhciBoYWRSdW50aW1lID0gZy5yZWdlbmVyYXRvclJ1bnRpbWUgJiZcbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZykuaW5kZXhPZihcInJlZ2VuZXJhdG9yUnVudGltZVwiKSA+PSAwO1xuXG4vLyBTYXZlIHRoZSBvbGQgcmVnZW5lcmF0b3JSdW50aW1lIGluIGNhc2UgaXQgbmVlZHMgdG8gYmUgcmVzdG9yZWQgbGF0ZXIuXG52YXIgb2xkUnVudGltZSA9IGhhZFJ1bnRpbWUgJiYgZy5yZWdlbmVyYXRvclJ1bnRpbWU7XG5cbi8vIEZvcmNlIHJlZXZhbHV0YXRpb24gb2YgcnVudGltZS5qcy5cbmcucmVnZW5lcmF0b3JSdW50aW1lID0gdW5kZWZpbmVkO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuL3J1bnRpbWVcIik7XG5cbmlmIChoYWRSdW50aW1lKSB7XG4gIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHJ1bnRpbWUuXG4gIGcucmVnZW5lcmF0b3JSdW50aW1lID0gb2xkUnVudGltZTtcbn0gZWxzZSB7XG4gIC8vIFJlbW92ZSB0aGUgZ2xvYmFsIHByb3BlcnR5IGFkZGVkIGJ5IHJ1bnRpbWUuanMuXG4gIHRyeSB7XG4gICAgZGVsZXRlIGcucmVnZW5lcmF0b3JSdW50aW1lO1xuICB9IGNhdGNoKGUpIHtcbiAgICBnLnJlZ2VuZXJhdG9yUnVudGltZSA9IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVnZW5lcmF0b3ItcnVudGltZVwiKTtcbiIsIi8vIDcuMS40IFRvSW50ZWdlclxudmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzTmFOKGl0ID0gK2l0KSA/IDAgOiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7XG59O1xuIiwiLy8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbi8vIHRydWUgIC0+IFN0cmluZyNhdFxuLy8gZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUT19TVFJJTkcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0aGF0LCBwb3MpIHtcbiAgICB2YXIgcyA9IFN0cmluZyhkZWZpbmVkKHRoYXQpKTtcbiAgICB2YXIgaSA9IHRvSW50ZWdlcihwb3MpO1xuICAgIHZhciBsID0gcy5sZW5ndGg7XG4gICAgdmFyIGEsIGI7XG4gICAgaWYgKGkgPCAwIHx8IGkgPj0gbCkgcmV0dXJuIFRPX1NUUklORyA/ICcnIDogdW5kZWZpbmVkO1xuICAgIGEgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgcmV0dXJuIGEgPCAweGQ4MDAgfHwgYSA+IDB4ZGJmZiB8fCBpICsgMSA9PT0gbCB8fCAoYiA9IHMuY2hhckNvZGVBdChpICsgMSkpIDwgMHhkYzAwIHx8IGIgPiAweGRmZmZcbiAgICAgID8gVE9fU1RSSU5HID8gcy5jaGFyQXQoaSkgOiBhXG4gICAgICA6IFRPX1NUUklORyA/IHMuc2xpY2UoaSwgaSArIDIpIDogKGEgLSAweGQ4MDAgPDwgMTApICsgKGIgLSAweGRjMDApICsgMHgxMDAwMDtcbiAgfTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHRydWU7XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxudmFyIGdsb2JhbCA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PSBNYXRoXG4gID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5NYXRoID09IE1hdGggPyBzZWxmXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICA6IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5pZiAodHlwZW9mIF9fZyA9PSAnbnVtYmVyJykgX19nID0gZ2xvYmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4iLCJ2YXIgY29yZSA9IG1vZHVsZS5leHBvcnRzID0geyB2ZXJzaW9uOiAnMi41LjYnIH07XG5pZiAodHlwZW9mIF9fZSA9PSAnbnVtYmVyJykgX19lID0gY29yZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwiLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nXG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIHRoYXQsIGxlbmd0aCkge1xuICBhRnVuY3Rpb24oZm4pO1xuICBpZiAodGhhdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZm47XG4gIHN3aXRjaCAobGVuZ3RoKSB7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICgvKiAuLi5hcmdzICovKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcbn07XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhbiBvYmplY3QhJyk7XG4gIHJldHVybiBpdDtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZXhlYygpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG4iLCIvLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KS5hICE9IDc7XG59KTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQ7XG4vLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUVcbnZhciBpcyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpcyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdkaXYnKSwgJ2EnLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KS5hICE9IDc7XG59KTtcbiIsIi8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG4vLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuLy8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBTKSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gaXQ7XG4gIHZhciBmbiwgdmFsO1xuICBpZiAoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKHR5cGVvZiAoZm4gPSBpdC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICghUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGRQID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBkUChPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG4gIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChiaXRtYXAsIHZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgZW51bWVyYWJsZTogIShiaXRtYXAgJiAxKSxcbiAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG4gICAgd3JpdGFibGU6ICEoYml0bWFwICYgNCksXG4gICAgdmFsdWU6IHZhbHVlXG4gIH07XG59O1xuIiwidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIGRQLmYob2JqZWN0LCBrZXksIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIiwidmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbnZhciAkZXhwb3J0ID0gZnVuY3Rpb24gKHR5cGUsIG5hbWUsIHNvdXJjZSkge1xuICB2YXIgSVNfRk9SQ0VEID0gdHlwZSAmICRleHBvcnQuRjtcbiAgdmFyIElTX0dMT0JBTCA9IHR5cGUgJiAkZXhwb3J0Lkc7XG4gIHZhciBJU19TVEFUSUMgPSB0eXBlICYgJGV4cG9ydC5TO1xuICB2YXIgSVNfUFJPVE8gPSB0eXBlICYgJGV4cG9ydC5QO1xuICB2YXIgSVNfQklORCA9IHR5cGUgJiAkZXhwb3J0LkI7XG4gIHZhciBJU19XUkFQID0gdHlwZSAmICRleHBvcnQuVztcbiAgdmFyIGV4cG9ydHMgPSBJU19HTE9CQUwgPyBjb3JlIDogY29yZVtuYW1lXSB8fCAoY29yZVtuYW1lXSA9IHt9KTtcbiAgdmFyIGV4cFByb3RvID0gZXhwb3J0c1tQUk9UT1RZUEVdO1xuICB2YXIgdGFyZ2V0ID0gSVNfR0xPQkFMID8gZ2xvYmFsIDogSVNfU1RBVElDID8gZ2xvYmFsW25hbWVdIDogKGdsb2JhbFtuYW1lXSB8fCB7fSlbUFJPVE9UWVBFXTtcbiAgdmFyIGtleSwgb3duLCBvdXQ7XG4gIGlmIChJU19HTE9CQUwpIHNvdXJjZSA9IG5hbWU7XG4gIGZvciAoa2V5IGluIHNvdXJjZSkge1xuICAgIC8vIGNvbnRhaW5zIGluIG5hdGl2ZVxuICAgIG93biA9ICFJU19GT1JDRUQgJiYgdGFyZ2V0ICYmIHRhcmdldFtrZXldICE9PSB1bmRlZmluZWQ7XG4gICAgaWYgKG93biAmJiBoYXMoZXhwb3J0cywga2V5KSkgY29udGludWU7XG4gICAgLy8gZXhwb3J0IG5hdGl2ZSBvciBwYXNzZWRcbiAgICBvdXQgPSBvd24gPyB0YXJnZXRba2V5XSA6IHNvdXJjZVtrZXldO1xuICAgIC8vIHByZXZlbnQgZ2xvYmFsIHBvbGx1dGlvbiBmb3IgbmFtZXNwYWNlc1xuICAgIGV4cG9ydHNba2V5XSA9IElTX0dMT0JBTCAmJiB0eXBlb2YgdGFyZ2V0W2tleV0gIT0gJ2Z1bmN0aW9uJyA/IHNvdXJjZVtrZXldXG4gICAgLy8gYmluZCB0aW1lcnMgdG8gZ2xvYmFsIGZvciBjYWxsIGZyb20gZXhwb3J0IGNvbnRleHRcbiAgICA6IElTX0JJTkQgJiYgb3duID8gY3R4KG91dCwgZ2xvYmFsKVxuICAgIC8vIHdyYXAgZ2xvYmFsIGNvbnN0cnVjdG9ycyBmb3IgcHJldmVudCBjaGFuZ2UgdGhlbSBpbiBsaWJyYXJ5XG4gICAgOiBJU19XUkFQICYmIHRhcmdldFtrZXldID09IG91dCA/IChmdW5jdGlvbiAoQykge1xuICAgICAgdmFyIEYgPSBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEMpIHtcbiAgICAgICAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBDKCk7XG4gICAgICAgICAgICBjYXNlIDE6IHJldHVybiBuZXcgQyhhKTtcbiAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBDKGEsIGIpO1xuICAgICAgICAgIH0gcmV0dXJuIG5ldyBDKGEsIGIsIGMpO1xuICAgICAgICB9IHJldHVybiBDLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgICAgRltQUk9UT1RZUEVdID0gQ1tQUk9UT1RZUEVdO1xuICAgICAgcmV0dXJuIEY7XG4gICAgLy8gbWFrZSBzdGF0aWMgdmVyc2lvbnMgZm9yIHByb3RvdHlwZSBtZXRob2RzXG4gICAgfSkob3V0KSA6IElTX1BST1RPICYmIHR5cGVvZiBvdXQgPT0gJ2Z1bmN0aW9uJyA/IGN0eChGdW5jdGlvbi5jYWxsLCBvdXQpIDogb3V0O1xuICAgIC8vIGV4cG9ydCBwcm90byBtZXRob2RzIHRvIGNvcmUuJUNPTlNUUlVDVE9SJS5tZXRob2RzLiVOQU1FJVxuICAgIGlmIChJU19QUk9UTykge1xuICAgICAgKGV4cG9ydHMudmlydHVhbCB8fCAoZXhwb3J0cy52aXJ0dWFsID0ge30pKVtrZXldID0gb3V0O1xuICAgICAgLy8gZXhwb3J0IHByb3RvIG1ldGhvZHMgdG8gY29yZS4lQ09OU1RSVUNUT1IlLnByb3RvdHlwZS4lTkFNRSVcbiAgICAgIGlmICh0eXBlICYgJGV4cG9ydC5SICYmIGV4cFByb3RvICYmICFleHBQcm90b1trZXldKSBoaWRlKGV4cFByb3RvLCBrZXksIG91dCk7XG4gICAgfVxuICB9XG59O1xuLy8gdHlwZSBiaXRtYXBcbiRleHBvcnQuRiA9IDE7ICAgLy8gZm9yY2VkXG4kZXhwb3J0LkcgPSAyOyAgIC8vIGdsb2JhbFxuJGV4cG9ydC5TID0gNDsgICAvLyBzdGF0aWNcbiRleHBvcnQuUCA9IDg7ICAgLy8gcHJvdG9cbiRleHBvcnQuQiA9IDE2OyAgLy8gYmluZFxuJGV4cG9ydC5XID0gMzI7ICAvLyB3cmFwXG4kZXhwb3J0LlUgPSA2NDsgIC8vIHNhZmVcbiRleHBvcnQuUiA9IDEyODsgLy8gcmVhbCBwcm90byBtZXRob2QgZm9yIGBsaWJyYXJ5YFxubW9kdWxlLmV4cG9ydHMgPSAkZXhwb3J0O1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19oaWRlJyk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59O1xuIiwiLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3NcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCkgPyBPYmplY3QgOiBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNvZihpdCkgPT0gJ1N0cmluZycgPyBpdC5zcGxpdCgnJykgOiBPYmplY3QoaXQpO1xufTtcbiIsIi8vIHRvIGluZGV4ZWQgb2JqZWN0LCB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0Jyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBJT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07XG4iLCIvLyA3LjEuMTUgVG9MZW5ndGhcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgbWluID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgPiAwID8gbWluKHRvSW50ZWdlcihpdCksIDB4MWZmZmZmZmZmZmZmZmYpIDogMDsgLy8gcG93KDIsIDUzKSAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxufTtcbiIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIGluZGV4ID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGluZGV4IDwgMCA/IG1heChpbmRleCArIGxlbmd0aCwgMCkgOiBtaW4oaW5kZXgsIGxlbmd0aCk7XG59O1xuIiwiLy8gZmFsc2UgLT4gQXJyYXkjaW5kZXhPZlxuLy8gdHJ1ZSAgLT4gQXJyYXkjaW5jbHVkZXNcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSVNfSU5DTFVERVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgZWwsIGZyb21JbmRleCkge1xuICAgIHZhciBPID0gdG9JT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7XG4gICAgdmFyIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgaWYgKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKSB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIGlmICh2YWx1ZSAhPSB2YWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgLy8gQXJyYXkjaW5kZXhPZiBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuICAgIH0gZWxzZSBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pIHtcbiAgICAgIGlmIChPW2luZGV4XSA9PT0gZWwpIHJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07XG4iLCJ2YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJztcbnZhciBzdG9yZSA9IGdsb2JhbFtTSEFSRURdIHx8IChnbG9iYWxbU0hBUkVEXSA9IHt9KTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7fSk7XG59KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7XG4gIHZlcnNpb246IGNvcmUudmVyc2lvbixcbiAgbW9kZTogcmVxdWlyZSgnLi9fbGlicmFyeScpID8gJ3B1cmUnIDogJ2dsb2JhbCcsXG4gIGNvcHlyaWdodDogJ8KpIDIwMTggRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknXG59KTtcbiIsInZhciBpZCA9IDA7XG52YXIgcHggPSBNYXRoLnJhbmRvbSgpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiAnU3ltYm9sKCcuY29uY2F0KGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXksICcpXycsICgrK2lkICsgcHgpLnRvU3RyaW5nKDM2KSk7XG59O1xuIiwidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCdrZXlzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHNoYXJlZFtrZXldIHx8IChzaGFyZWRba2V5XSA9IHVpZChrZXkpKTtcbn07XG4iLCJ2YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIGFycmF5SW5kZXhPZiA9IHJlcXVpcmUoJy4vX2FycmF5LWluY2x1ZGVzJykoZmFsc2UpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWVzKSB7XG4gIHZhciBPID0gdG9JT2JqZWN0KG9iamVjdCk7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBPKSBpZiAoa2V5ICE9IElFX1BST1RPKSBoYXMoTywga2V5KSAmJiByZXN1bHQucHVzaChrZXkpO1xuICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzXG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSBpZiAoaGFzKE8sIGtleSA9IG5hbWVzW2krK10pKSB7XG4gICAgfmFycmF5SW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcmVzdWx0LnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIi8vIElFIDgtIGRvbid0IGVudW0gYnVnIGtleXNcbm1vZHVsZS5leHBvcnRzID0gKFxuICAnY29uc3RydWN0b3IsaGFzT3duUHJvcGVydHksaXNQcm90b3R5cGVPZixwcm9wZXJ0eUlzRW51bWVyYWJsZSx0b0xvY2FsZVN0cmluZyx0b1N0cmluZyx2YWx1ZU9mJ1xuKS5zcGxpdCgnLCcpO1xuIiwiLy8gMTkuMS4yLjE0IC8gMTUuMi4zLjE0IE9iamVjdC5rZXlzKE8pXG52YXIgJGtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTykge1xuICByZXR1cm4gJGtleXMoTywgZW51bUJ1Z0tleXMpO1xufTtcbiIsInZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICB2YXIga2V5cyA9IGdldEtleXMoUHJvcGVydGllcyk7XG4gIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgdmFyIGkgPSAwO1xuICB2YXIgUDtcbiAgd2hpbGUgKGxlbmd0aCA+IGkpIGRQLmYoTywgUCA9IGtleXNbaSsrXSwgUHJvcGVydGllc1tQXSk7XG4gIHJldHVybiBPO1xufTtcbiIsInZhciBkb2N1bWVudCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmRvY3VtZW50O1xubW9kdWxlLmV4cG9ydHMgPSBkb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4iLCIvLyAxOS4xLjIuMiAvIDE1LjIuMy41IE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGRQcyA9IHJlcXVpcmUoJy4vX29iamVjdC1kcHMnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKTtcbnZhciBJRV9QUk9UTyA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKTtcbnZhciBFbXB0eSA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIGNyZWF0ZURpY3QgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2lmcmFtZScpO1xuICB2YXIgaSA9IGVudW1CdWdLZXlzLmxlbmd0aDtcbiAgdmFyIGx0ID0gJzwnO1xuICB2YXIgZ3QgPSAnPic7XG4gIHZhciBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlcXVpcmUoJy4vX2h0bWwnKS5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICBpZnJhbWUuc3JjID0gJ2phdmFzY3JpcHQ6JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zY3JpcHQtdXJsXG4gIC8vIGNyZWF0ZURpY3QgPSBpZnJhbWUuY29udGVudFdpbmRvdy5PYmplY3Q7XG4gIC8vIGh0bWwucmVtb3ZlQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuICBpZnJhbWVEb2N1bWVudC53cml0ZShsdCArICdzY3JpcHQnICsgZ3QgKyAnZG9jdW1lbnQuRj1PYmplY3QnICsgbHQgKyAnL3NjcmlwdCcgKyBndCk7XG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gIGNyZWF0ZURpY3QgPSBpZnJhbWVEb2N1bWVudC5GO1xuICB3aGlsZSAoaS0tKSBkZWxldGUgY3JlYXRlRGljdFtQUk9UT1RZUEVdW2VudW1CdWdLZXlzW2ldXTtcbiAgcmV0dXJuIGNyZWF0ZURpY3QoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcykge1xuICB2YXIgcmVzdWx0O1xuICBpZiAoTyAhPT0gbnVsbCkge1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBhbk9iamVjdChPKTtcbiAgICByZXN1bHQgPSBuZXcgRW1wdHkoKTtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gbnVsbDtcbiAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG4gICAgcmVzdWx0W0lFX1BST1RPXSA9IE87XG4gIH0gZWxzZSByZXN1bHQgPSBjcmVhdGVEaWN0KCk7XG4gIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkUHMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcbn07XG4iLCJ2YXIgc3RvcmUgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgnd2tzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG52YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuU3ltYm9sO1xudmFyIFVTRV9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09ICdmdW5jdGlvbic7XG5cbnZhciAkZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9XG4gICAgVVNFX1NZTUJPTCAmJiBTeW1ib2xbbmFtZV0gfHwgKFVTRV9TWU1CT0wgPyBTeW1ib2wgOiB1aWQpKCdTeW1ib2wuJyArIG5hbWUpKTtcbn07XG5cbiRleHBvcnRzLnN0b3JlID0gc3RvcmU7XG4iLCJ2YXIgZGVmID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIHRhZywgc3RhdCkge1xuICBpZiAoaXQgJiYgIWhhcyhpdCA9IHN0YXQgPyBpdCA6IGl0LnByb3RvdHlwZSwgVEFHKSkgZGVmKGl0LCBUQUcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogdGFnIH0pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJyk7XG52YXIgZGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcblxuLy8gMjUuMS4yLjEuMSAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClcbnJlcXVpcmUoJy4vX2hpZGUnKShJdGVyYXRvclByb3RvdHlwZSwgcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyksIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCkge1xuICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHsgbmV4dDogZGVzY3JpcHRvcigxLCBuZXh0KSB9KTtcbiAgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIE5BTUUgKyAnIEl0ZXJhdG9yJyk7XG59O1xuIiwiLy8gNy4xLjEzIFRvT2JqZWN0KGFyZ3VtZW50KVxudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07XG4iLCIvLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG52YXIgT2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiAoTykge1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmIChoYXMoTywgSUVfUFJPVE8pKSByZXR1cm4gT1tJRV9QUk9UT107XG4gIGlmICh0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG8gOiBudWxsO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciAkaXRlckNyZWF0ZSA9IHJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1kgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSk7IC8vIFNhZmFyaSBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbnZhciBGRl9JVEVSQVRPUiA9ICdAQGl0ZXJhdG9yJztcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCkge1xuICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG4gIHZhciBnZXRNZXRob2QgPSBmdW5jdGlvbiAoa2luZCkge1xuICAgIGlmICghQlVHR1kgJiYga2luZCBpbiBwcm90bykgcmV0dXJuIHByb3RvW2tpbmRdO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gIH07XG4gIHZhciBUQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVM7XG4gIHZhciBWQUxVRVNfQlVHID0gZmFsc2U7XG4gIHZhciBwcm90byA9IEJhc2UucHJvdG90eXBlO1xuICB2YXIgJG5hdGl2ZSA9IHByb3RvW0lURVJBVE9SXSB8fCBwcm90b1tGRl9JVEVSQVRPUl0gfHwgREVGQVVMVCAmJiBwcm90b1tERUZBVUxUXTtcbiAgdmFyICRkZWZhdWx0ID0gJG5hdGl2ZSB8fCBnZXRNZXRob2QoREVGQVVMVCk7XG4gIHZhciAkZW50cmllcyA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWQ7XG4gIHZhciAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZTtcbiAgdmFyIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGU7XG4gIC8vIEZpeCBuYXRpdmVcbiAgaWYgKCRhbnlOYXRpdmUpIHtcbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKCRhbnlOYXRpdmUuY2FsbChuZXcgQmFzZSgpKSk7XG4gICAgaWYgKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yUHJvdG90eXBlLCBUQUcsIHRydWUpO1xuICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG4gICAgICBpZiAoIUxJQlJBUlkgJiYgdHlwZW9mIEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXSAhPSAnZnVuY3Rpb24nKSBoaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKERFRl9WQUxVRVMgJiYgJG5hdGl2ZSAmJiAkbmF0aXZlLm5hbWUgIT09IFZBTFVFUykge1xuICAgIFZBTFVFU19CVUcgPSB0cnVlO1xuICAgICRkZWZhdWx0ID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZiAoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpIHtcbiAgICBoaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpO1xuICB9XG4gIC8vIFBsdWcgZm9yIGxpYnJhcnlcbiAgSXRlcmF0b3JzW05BTUVdID0gJGRlZmF1bHQ7XG4gIEl0ZXJhdG9yc1tUQUddID0gcmV0dXJuVGhpcztcbiAgaWYgKERFRkFVTFQpIHtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiBERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6IElTX1NFVCA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogJGVudHJpZXNcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoa2V5IGluIG1ldGhvZHMpIHtcbiAgICAgIGlmICghKGtleSBpbiBwcm90bykpIHJlZGVmaW5lKHByb3RvLCBrZXksIG1ldGhvZHNba2V5XSk7XG4gICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGF0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLWF0JykodHJ1ZSk7XG5cbi8vIDIxLjEuMy4yNyBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdKClcbnJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24gKGl0ZXJhdGVkKSB7XG4gIHRoaXMuX3QgPSBTdHJpbmcoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbi8vIDIxLjEuNS4yLjEgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uICgpIHtcbiAgdmFyIE8gPSB0aGlzLl90O1xuICB2YXIgaW5kZXggPSB0aGlzLl9pO1xuICB2YXIgcG9pbnQ7XG4gIGlmIChpbmRleCA+PSBPLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICBwb2ludCA9ICRhdChPLCBpbmRleCk7XG4gIHRoaXMuX2kgKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4geyB2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlIH07XG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGRvbmUsIHZhbHVlKSB7XG4gIHJldHVybiB7IHZhbHVlOiB2YWx1ZSwgZG9uZTogISFkb25lIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKTtcbnZhciBzdGVwID0gcmVxdWlyZSgnLi9faXRlci1zdGVwJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xuXG4vLyAyMi4xLjMuNCBBcnJheS5wcm90b3R5cGUuZW50cmllcygpXG4vLyAyMi4xLjMuMTMgQXJyYXkucHJvdG90eXBlLmtleXMoKVxuLy8gMjIuMS4zLjI5IEFycmF5LnByb3RvdHlwZS52YWx1ZXMoKVxuLy8gMjIuMS4zLjMwIEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICB0aGlzLl90ID0gdG9JT2JqZWN0KGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4gIHRoaXMuX2sgPSBraW5kOyAgICAgICAgICAgICAgICAvLyBraW5kXG4vLyAyMi4xLjUuMi4xICVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uICgpIHtcbiAgdmFyIE8gPSB0aGlzLl90O1xuICB2YXIga2luZCA9IHRoaXMuX2s7XG4gIHZhciBpbmRleCA9IHRoaXMuX2krKztcbiAgaWYgKCFPIHx8IGluZGV4ID49IE8ubGVuZ3RoKSB7XG4gICAgdGhpcy5fdCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gc3RlcCgxKTtcbiAgfVxuICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiBzdGVwKDAsIGluZGV4KTtcbiAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiBzdGVwKDAsIE9baW5kZXhdKTtcbiAgcmV0dXJuIHN0ZXAoMCwgW2luZGV4LCBPW2luZGV4XV0pO1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyUgKDkuNC40LjYsIDkuNC40LjcpXG5JdGVyYXRvcnMuQXJndW1lbnRzID0gSXRlcmF0b3JzLkFycmF5O1xuXG5hZGRUb1Vuc2NvcGFibGVzKCdrZXlzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTtcbiIsInJlcXVpcmUoJy4vZXM2LmFycmF5Lml0ZXJhdG9yJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciBUT19TVFJJTkdfVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyk7XG5cbnZhciBET01JdGVyYWJsZXMgPSAoJ0NTU1J1bGVMaXN0LENTU1N0eWxlRGVjbGFyYXRpb24sQ1NTVmFsdWVMaXN0LENsaWVudFJlY3RMaXN0LERPTVJlY3RMaXN0LERPTVN0cmluZ0xpc3QsJyArXG4gICdET01Ub2tlbkxpc3QsRGF0YVRyYW5zZmVySXRlbUxpc3QsRmlsZUxpc3QsSFRNTEFsbENvbGxlY3Rpb24sSFRNTENvbGxlY3Rpb24sSFRNTEZvcm1FbGVtZW50LEhUTUxTZWxlY3RFbGVtZW50LCcgK1xuICAnTWVkaWFMaXN0LE1pbWVUeXBlQXJyYXksTmFtZWROb2RlTWFwLE5vZGVMaXN0LFBhaW50UmVxdWVzdExpc3QsUGx1Z2luLFBsdWdpbkFycmF5LFNWR0xlbmd0aExpc3QsU1ZHTnVtYmVyTGlzdCwnICtcbiAgJ1NWR1BhdGhTZWdMaXN0LFNWR1BvaW50TGlzdCxTVkdTdHJpbmdMaXN0LFNWR1RyYW5zZm9ybUxpc3QsU291cmNlQnVmZmVyTGlzdCxTdHlsZVNoZWV0TGlzdCxUZXh0VHJhY2tDdWVMaXN0LCcgK1xuICAnVGV4dFRyYWNrTGlzdCxUb3VjaExpc3QnKS5zcGxpdCgnLCcpO1xuXG5mb3IgKHZhciBpID0gMDsgaSA8IERPTUl0ZXJhYmxlcy5sZW5ndGg7IGkrKykge1xuICB2YXIgTkFNRSA9IERPTUl0ZXJhYmxlc1tpXTtcbiAgdmFyIENvbGxlY3Rpb24gPSBnbG9iYWxbTkFNRV07XG4gIHZhciBwcm90byA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGU7XG4gIGlmIChwcm90byAmJiAhcHJvdG9bVE9fU1RSSU5HX1RBR10pIGhpZGUocHJvdG8sIFRPX1NUUklOR19UQUcsIE5BTUUpO1xuICBJdGVyYXRvcnNbTkFNRV0gPSBJdGVyYXRvcnMuQXJyYXk7XG59XG4iLCIvLyBnZXR0aW5nIHRhZyBmcm9tIDE5LjEuMy42IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcoKVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xudmFyIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuLy8gRVMzIHdyb25nIGhlcmVcbnZhciBBUkcgPSBjb2YoZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIE8sIFQsIEI7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mIChUID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUQUcpKSA9PSAnc3RyaW5nJyA/IFRcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IEFSRyA/IGNvZihPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChCID0gY29mKE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogQjtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgQ29uc3RydWN0b3IsIG5hbWUsIGZvcmJpZGRlbkZpZWxkKSB7XG4gIGlmICghKGl0IGluc3RhbmNlb2YgQ29uc3RydWN0b3IpIHx8IChmb3JiaWRkZW5GaWVsZCAhPT0gdW5kZWZpbmVkICYmIGZvcmJpZGRlbkZpZWxkIGluIGl0KSkge1xuICAgIHRocm93IFR5cGVFcnJvcihuYW1lICsgJzogaW5jb3JyZWN0IGludm9jYXRpb24hJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsIi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3JcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIGZuLCB2YWx1ZSwgZW50cmllcykge1xuICB0cnkge1xuICAgIHJldHVybiBlbnRyaWVzID8gZm4oYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7XG4gIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB2YXIgcmV0ID0gaXRlcmF0b3JbJ3JldHVybiddO1xuICAgIGlmIChyZXQgIT09IHVuZGVmaW5lZCkgYW5PYmplY3QocmV0LmNhbGwoaXRlcmF0b3IpKTtcbiAgICB0aHJvdyBlO1xuICB9XG59O1xuIiwiLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b1tJVEVSQVRPUl0gPT09IGl0KTtcbn07XG4iLCJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKTtcbnZhciBJVEVSQVRPUiA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19jb3JlJykuZ2V0SXRlcmF0b3JNZXRob2QgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ICE9IHVuZGVmaW5lZCkgcmV0dXJuIGl0W0lURVJBVE9SXVxuICAgIHx8IGl0WydAQGl0ZXJhdG9yJ11cbiAgICB8fCBJdGVyYXRvcnNbY2xhc3NvZihpdCldO1xufTtcbiIsInZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi9faXRlci1jYWxsJyk7XG52YXIgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGdldEl0ZXJGbiA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgQlJFQUsgPSB7fTtcbnZhciBSRVRVUk4gPSB7fTtcbnZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmFibGUsIGVudHJpZXMsIGZuLCB0aGF0LCBJVEVSQVRPUikge1xuICB2YXIgaXRlckZuID0gSVRFUkFUT1IgPyBmdW5jdGlvbiAoKSB7IHJldHVybiBpdGVyYWJsZTsgfSA6IGdldEl0ZXJGbihpdGVyYWJsZSk7XG4gIHZhciBmID0gY3R4KGZuLCB0aGF0LCBlbnRyaWVzID8gMiA6IDEpO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGVuZ3RoLCBzdGVwLCBpdGVyYXRvciwgcmVzdWx0O1xuICBpZiAodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXRlcmFibGUgKyAnIGlzIG5vdCBpdGVyYWJsZSEnKTtcbiAgLy8gZmFzdCBjYXNlIGZvciBhcnJheXMgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yXG4gIGlmIChpc0FycmF5SXRlcihpdGVyRm4pKSBmb3IgKGxlbmd0aCA9IHRvTGVuZ3RoKGl0ZXJhYmxlLmxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgcmVzdWx0ID0gZW50cmllcyA/IGYoYW5PYmplY3Qoc3RlcCA9IGl0ZXJhYmxlW2luZGV4XSlbMF0sIHN0ZXBbMV0pIDogZihpdGVyYWJsZVtpbmRleF0pO1xuICAgIGlmIChyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKSByZXR1cm4gcmVzdWx0O1xuICB9IGVsc2UgZm9yIChpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKGl0ZXJhYmxlKTsgIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lOykge1xuICAgIHJlc3VsdCA9IGNhbGwoaXRlcmF0b3IsIGYsIHN0ZXAudmFsdWUsIGVudHJpZXMpO1xuICAgIGlmIChyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKSByZXR1cm4gcmVzdWx0O1xuICB9XG59O1xuZXhwb3J0cy5CUkVBSyA9IEJSRUFLO1xuZXhwb3J0cy5SRVRVUk4gPSBSRVRVUk47XG4iLCIvLyA3LjMuMjAgU3BlY2llc0NvbnN0cnVjdG9yKE8sIGRlZmF1bHRDb25zdHJ1Y3RvcilcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciBTUEVDSUVTID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIEQpIHtcbiAgdmFyIEMgPSBhbk9iamVjdChPKS5jb25zdHJ1Y3RvcjtcbiAgdmFyIFM7XG4gIHJldHVybiBDID09PSB1bmRlZmluZWQgfHwgKFMgPSBhbk9iamVjdChDKVtTUEVDSUVTXSkgPT0gdW5kZWZpbmVkID8gRCA6IGFGdW5jdGlvbihTKTtcbn07XG4iLCIvLyBmYXN0IGFwcGx5LCBodHRwOi8vanNwZXJmLmxua2l0LmNvbS9mYXN0LWFwcGx5LzVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCBhcmdzLCB0aGF0KSB7XG4gIHZhciB1biA9IHRoYXQgPT09IHVuZGVmaW5lZDtcbiAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIHVuID8gZm4oKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0KTtcbiAgICBjYXNlIDE6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICBjYXNlIDQ6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICB9IHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmdzKTtcbn07XG4iLCJ2YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgaW52b2tlID0gcmVxdWlyZSgnLi9faW52b2tlJyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4vX2h0bWwnKTtcbnZhciBjZWwgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIHNldFRhc2sgPSBnbG9iYWwuc2V0SW1tZWRpYXRlO1xudmFyIGNsZWFyVGFzayA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZTtcbnZhciBNZXNzYWdlQ2hhbm5lbCA9IGdsb2JhbC5NZXNzYWdlQ2hhbm5lbDtcbnZhciBEaXNwYXRjaCA9IGdsb2JhbC5EaXNwYXRjaDtcbnZhciBjb3VudGVyID0gMDtcbnZhciBxdWV1ZSA9IHt9O1xudmFyIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnO1xudmFyIGRlZmVyLCBjaGFubmVsLCBwb3J0O1xudmFyIHJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGlkID0gK3RoaXM7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgaWYgKHF1ZXVlLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgIHZhciBmbiA9IHF1ZXVlW2lkXTtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICAgIGZuKCk7XG4gIH1cbn07XG52YXIgbGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgcnVuLmNhbGwoZXZlbnQuZGF0YSk7XG59O1xuLy8gTm9kZS5qcyAwLjkrICYgSUUxMCsgaGFzIHNldEltbWVkaWF0ZSwgb3RoZXJ3aXNlOlxuaWYgKCFzZXRUYXNrIHx8ICFjbGVhclRhc2spIHtcbiAgc2V0VGFzayA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShmbikge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgdmFyIGkgPSAxO1xuICAgIHdoaWxlIChhcmd1bWVudHMubGVuZ3RoID4gaSkgYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gICAgICBpbnZva2UodHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKSwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXJUYXNrID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaWQpIHtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICB9O1xuICAvLyBOb2RlLmpzIDAuOC1cbiAgaWYgKHJlcXVpcmUoJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGN0eChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gU3BoZXJlIChKUyBnYW1lIGVuZ2luZSkgRGlzcGF0Y2ggQVBJXG4gIH0gZWxzZSBpZiAoRGlzcGF0Y2ggJiYgRGlzcGF0Y2gubm93KSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIERpc3BhdGNoLm5vdyhjdHgocnVuLCBpZCwgMSkpO1xuICAgIH07XG4gIC8vIEJyb3dzZXJzIHdpdGggTWVzc2FnZUNoYW5uZWwsIGluY2x1ZGVzIFdlYldvcmtlcnNcbiAgfSBlbHNlIGlmIChNZXNzYWdlQ2hhbm5lbCkge1xuICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGxpc3RlbmVyO1xuICAgIGRlZmVyID0gY3R4KHBvcnQucG9zdE1lc3NhZ2UsIHBvcnQsIDEpO1xuICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnNcbiAgLy8gSUU4IGhhcyBwb3N0TWVzc2FnZSwgYnV0IGl0J3Mgc3luYyAmIHR5cGVvZiBpdHMgcG9zdE1lc3NhZ2UgaXMgJ29iamVjdCdcbiAgfSBlbHNlIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJiB0eXBlb2YgcG9zdE1lc3NhZ2UgPT0gJ2Z1bmN0aW9uJyAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKGlkICsgJycsICcqJyk7XG4gICAgfTtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIC8vIElFOC1cbiAgfSBlbHNlIGlmIChPTlJFQURZU1RBVEVDSEFOR0UgaW4gY2VsKCdzY3JpcHQnKSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNlbCgnc2NyaXB0JykpW09OUkVBRFlTVEFURUNIQU5HRV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICAgIHJ1bi5jYWxsKGlkKTtcbiAgICAgIH07XG4gICAgfTtcbiAgLy8gUmVzdCBvbGQgYnJvd3NlcnNcbiAgfSBlbHNlIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgc2V0VGltZW91dChjdHgocnVuLCBpZCwgMSksIDApO1xuICAgIH07XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldFRhc2ssXG4gIGNsZWFyOiBjbGVhclRhc2tcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgbWFjcm90YXNrID0gcmVxdWlyZSgnLi9fdGFzaycpLnNldDtcbnZhciBPYnNlcnZlciA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBQcm9taXNlID0gZ2xvYmFsLlByb21pc2U7XG52YXIgaXNOb2RlID0gcmVxdWlyZSgnLi9fY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGhlYWQsIGxhc3QsIG5vdGlmeTtcblxuICB2YXIgZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBhcmVudCwgZm47XG4gICAgaWYgKGlzTm9kZSAmJiAocGFyZW50ID0gcHJvY2Vzcy5kb21haW4pKSBwYXJlbnQuZXhpdCgpO1xuICAgIHdoaWxlIChoZWFkKSB7XG4gICAgICBmbiA9IGhlYWQuZm47XG4gICAgICBoZWFkID0gaGVhZC5uZXh0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4oKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGhlYWQpIG5vdGlmeSgpO1xuICAgICAgICBlbHNlIGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgIGlmIChwYXJlbnQpIHBhcmVudC5lbnRlcigpO1xuICB9O1xuXG4gIC8vIE5vZGUuanNcbiAgaWYgKGlzTm9kZSkge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZmx1c2gpO1xuICAgIH07XG4gIC8vIGJyb3dzZXJzIHdpdGggTXV0YXRpb25PYnNlcnZlciwgZXhjZXB0IGlPUyBTYWZhcmkgLSBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMzM5XG4gIH0gZWxzZSBpZiAoT2JzZXJ2ZXIgJiYgIShnbG9iYWwubmF2aWdhdG9yICYmIGdsb2JhbC5uYXZpZ2F0b3Iuc3RhbmRhbG9uZSkpIHtcbiAgICB2YXIgdG9nZ2xlID0gdHJ1ZTtcbiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICBuZXcgT2JzZXJ2ZXIoZmx1c2gpLm9ic2VydmUobm9kZSwgeyBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vZGUuZGF0YSA9IHRvZ2dsZSA9ICF0b2dnbGU7XG4gICAgfTtcbiAgLy8gZW52aXJvbm1lbnRzIHdpdGggbWF5YmUgbm9uLWNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IGV4aXN0ZW50IFByb21pc2VcbiAgfSBlbHNlIGlmIChQcm9taXNlICYmIFByb21pc2UucmVzb2x2ZSkge1xuICAgIC8vIFByb21pc2UucmVzb2x2ZSB3aXRob3V0IGFuIGFyZ3VtZW50IHRocm93cyBhbiBlcnJvciBpbiBMRyBXZWJPUyAyXG4gICAgdmFyIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9taXNlLnRoZW4oZmx1c2gpO1xuICAgIH07XG4gIC8vIGZvciBvdGhlciBlbnZpcm9ubWVudHMgLSBtYWNyb3Rhc2sgYmFzZWQgb246XG4gIC8vIC0gc2V0SW1tZWRpYXRlXG4gIC8vIC0gTWVzc2FnZUNoYW5uZWxcbiAgLy8gLSB3aW5kb3cucG9zdE1lc3NhZ1xuICAvLyAtIG9ucmVhZHlzdGF0ZWNoYW5nZVxuICAvLyAtIHNldFRpbWVvdXRcbiAgfSBlbHNlIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBzdHJhbmdlIElFICsgd2VicGFjayBkZXYgc2VydmVyIGJ1ZyAtIHVzZSAuY2FsbChnbG9iYWwpXG4gICAgICBtYWNyb3Rhc2suY2FsbChnbG9iYWwsIGZsdXNoKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChmbikge1xuICAgIHZhciB0YXNrID0geyBmbjogZm4sIG5leHQ6IHVuZGVmaW5lZCB9O1xuICAgIGlmIChsYXN0KSBsYXN0Lm5leHQgPSB0YXNrO1xuICAgIGlmICghaGVhZCkge1xuICAgICAgaGVhZCA9IHRhc2s7XG4gICAgICBub3RpZnkoKTtcbiAgICB9IGxhc3QgPSB0YXNrO1xuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIDI1LjQuMS41IE5ld1Byb21pc2VDYXBhYmlsaXR5KEMpXG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xuXG5mdW5jdGlvbiBQcm9taXNlQ2FwYWJpbGl0eShDKSB7XG4gIHZhciByZXNvbHZlLCByZWplY3Q7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBDKGZ1bmN0aW9uICgkJHJlc29sdmUsICQkcmVqZWN0KSB7XG4gICAgaWYgKHJlc29sdmUgIT09IHVuZGVmaW5lZCB8fCByZWplY3QgIT09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIHJlc29sdmUgPSAkJHJlc29sdmU7XG4gICAgcmVqZWN0ID0gJCRyZWplY3Q7XG4gIH0pO1xuICB0aGlzLnJlc29sdmUgPSBhRnVuY3Rpb24ocmVzb2x2ZSk7XG4gIHRoaXMucmVqZWN0ID0gYUZ1bmN0aW9uKHJlamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiAoQykge1xuICByZXR1cm4gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geyBlOiBmYWxzZSwgdjogZXhlYygpIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4geyBlOiB0cnVlLCB2OiBlIH07XG4gIH1cbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgbmF2aWdhdG9yID0gZ2xvYmFsLm5hdmlnYXRvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBuYXZpZ2F0b3IgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCB8fCAnJztcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSByZXF1aXJlKCcuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEMsIHgpIHtcbiAgYW5PYmplY3QoQyk7XG4gIGlmIChpc09iamVjdCh4KSAmJiB4LmNvbnN0cnVjdG9yID09PSBDKSByZXR1cm4geDtcbiAgdmFyIHByb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkuZihDKTtcbiAgdmFyIHJlc29sdmUgPSBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlO1xuICByZXNvbHZlKHgpO1xuICByZXR1cm4gcHJvbWlzZUNhcGFiaWxpdHkucHJvbWlzZTtcbn07XG4iLCJ2YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc3JjLCBzYWZlKSB7XG4gIGZvciAodmFyIGtleSBpbiBzcmMpIHtcbiAgICBpZiAoc2FmZSAmJiB0YXJnZXRba2V5XSkgdGFyZ2V0W2tleV0gPSBzcmNba2V5XTtcbiAgICBlbHNlIGhpZGUodGFyZ2V0LCBrZXksIHNyY1trZXldKTtcbiAgfSByZXR1cm4gdGFyZ2V0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyIFNQRUNJRVMgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVkpIHtcbiAgdmFyIEMgPSB0eXBlb2YgY29yZVtLRVldID09ICdmdW5jdGlvbicgPyBjb3JlW0tFWV0gOiBnbG9iYWxbS0VZXTtcbiAgaWYgKERFU0NSSVBUT1JTICYmIEMgJiYgIUNbU1BFQ0lFU10pIGRQLmYoQywgU1BFQ0lFUywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH1cbiAgfSk7XG59O1xuIiwidmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciByaXRlciA9IFs3XVtJVEVSQVRPUl0oKTtcbiAgcml0ZXJbJ3JldHVybiddID0gZnVuY3Rpb24gKCkgeyBTQUZFX0NMT1NJTkcgPSB0cnVlOyB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGhyb3ctbGl0ZXJhbFxuICBBcnJheS5mcm9tKHJpdGVyLCBmdW5jdGlvbiAoKSB7IHRocm93IDI7IH0pO1xufSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIHNraXBDbG9zaW5nKSB7XG4gIGlmICghc2tpcENsb3NpbmcgJiYgIVNBRkVfQ0xPU0lORykgcmV0dXJuIGZhbHNlO1xuICB2YXIgc2FmZSA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBhcnIgPSBbN107XG4gICAgdmFyIGl0ZXIgPSBhcnJbSVRFUkFUT1JdKCk7XG4gICAgaXRlci5uZXh0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4geyBkb25lOiBzYWZlID0gdHJ1ZSB9OyB9O1xuICAgIGFycltJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBpdGVyOyB9O1xuICAgIGV4ZWMoYXJyKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBzYWZlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHRhc2sgPSByZXF1aXJlKCcuL190YXNrJykuc2V0O1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4vX21pY3JvdGFzaycpKCk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4vX3BlcmZvcm0nKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuL191c2VyLWFnZW50Jyk7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuL19wcm9taXNlLXJlc29sdmUnKTtcbnZhciBQUk9NSVNFID0gJ1Byb21pc2UnO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIHZlcnNpb25zID0gcHJvY2VzcyAmJiBwcm9jZXNzLnZlcnNpb25zO1xudmFyIHY4ID0gdmVyc2lvbnMgJiYgdmVyc2lvbnMudjggfHwgJyc7XG52YXIgJFByb21pc2UgPSBnbG9iYWxbUFJPTUlTRV07XG52YXIgaXNOb2RlID0gY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG52YXIgZW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgSW50ZXJuYWwsIG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSwgT3duUHJvbWlzZUNhcGFiaWxpdHksIFdyYXBwZXI7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mO1xuXG52YXIgVVNFX05BVElWRSA9ICEhZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIC8vIGNvcnJlY3Qgc3ViY2xhc3Npbmcgd2l0aCBAQHNwZWNpZXMgc3VwcG9ydFxuICAgIHZhciBwcm9taXNlID0gJFByb21pc2UucmVzb2x2ZSgxKTtcbiAgICB2YXIgRmFrZVByb21pc2UgPSAocHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9KVtyZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpXSA9IGZ1bmN0aW9uIChleGVjKSB7XG4gICAgICBleGVjKGVtcHR5LCBlbXB0eSk7XG4gICAgfTtcbiAgICAvLyB1bmhhbmRsZWQgcmVqZWN0aW9ucyB0cmFja2luZyBzdXBwb3J0LCBOb2RlSlMgUHJvbWlzZSB3aXRob3V0IGl0IGZhaWxzIEBAc3BlY2llcyB0ZXN0XG4gICAgcmV0dXJuIChpc05vZGUgfHwgdHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCA9PSAnZnVuY3Rpb24nKVxuICAgICAgJiYgcHJvbWlzZS50aGVuKGVtcHR5KSBpbnN0YW5jZW9mIEZha2VQcm9taXNlXG4gICAgICAvLyB2OCA2LjYgKE5vZGUgMTAgYW5kIENocm9tZSA2NikgaGF2ZSBhIGJ1ZyB3aXRoIHJlc29sdmluZyBjdXN0b20gdGhlbmFibGVzXG4gICAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD04MzA1NjVcbiAgICAgIC8vIHdlIGNhbid0IGRldGVjdCBpdCBzeW5jaHJvbm91c2x5LCBzbyBqdXN0IGNoZWNrIHZlcnNpb25zXG4gICAgICAmJiB2OC5pbmRleE9mKCc2LjYnKSAhPT0gMFxuICAgICAgJiYgdXNlckFnZW50LmluZGV4T2YoJ0Nocm9tZS82NicpID09PSAtMTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG59KCk7XG5cbi8vIGhlbHBlcnNcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciB0aGVuO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmIHR5cGVvZiAodGhlbiA9IGl0LnRoZW4pID09ICdmdW5jdGlvbicgPyB0aGVuIDogZmFsc2U7XG59O1xudmFyIG5vdGlmeSA9IGZ1bmN0aW9uIChwcm9taXNlLCBpc1JlamVjdCkge1xuICBpZiAocHJvbWlzZS5fbikgcmV0dXJuO1xuICBwcm9taXNlLl9uID0gdHJ1ZTtcbiAgdmFyIGNoYWluID0gcHJvbWlzZS5fYztcbiAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92O1xuICAgIHZhciBvayA9IHByb21pc2UuX3MgPT0gMTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHJ1biA9IGZ1bmN0aW9uIChyZWFjdGlvbikge1xuICAgICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbDtcbiAgICAgIHZhciByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZTtcbiAgICAgIHZhciByZWplY3QgPSByZWFjdGlvbi5yZWplY3Q7XG4gICAgICB2YXIgZG9tYWluID0gcmVhY3Rpb24uZG9tYWluO1xuICAgICAgdmFyIHJlc3VsdCwgdGhlbiwgZXhpdGVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICBpZiAoIW9rKSB7XG4gICAgICAgICAgICBpZiAocHJvbWlzZS5faCA9PSAyKSBvbkhhbmRsZVVuaGFuZGxlZChwcm9taXNlKTtcbiAgICAgICAgICAgIHByb21pc2UuX2ggPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaGFuZGxlciA9PT0gdHJ1ZSkgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoZG9tYWluKSBkb21haW4uZW50ZXIoKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IGhhbmRsZXIodmFsdWUpOyAvLyBtYXkgdGhyb3dcbiAgICAgICAgICAgIGlmIChkb21haW4pIHtcbiAgICAgICAgICAgICAgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgICAgICAgZXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gcmVhY3Rpb24ucHJvbWlzZSkge1xuICAgICAgICAgICAgcmVqZWN0KFR5cGVFcnJvcignUHJvbWlzZS1jaGFpbiBjeWNsZScpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRoZW4uY2FsbChyZXN1bHQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSBlbHNlIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHJlamVjdCh2YWx1ZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChkb21haW4gJiYgIWV4aXRlZCkgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2hpbGUgKGNoYWluLmxlbmd0aCA+IGkpIHJ1bihjaGFpbltpKytdKTsgLy8gdmFyaWFibGUgbGVuZ3RoIC0gY2FuJ3QgdXNlIGZvckVhY2hcbiAgICBwcm9taXNlLl9jID0gW107XG4gICAgcHJvbWlzZS5fbiA9IGZhbHNlO1xuICAgIGlmIChpc1JlamVjdCAmJiAhcHJvbWlzZS5faCkgb25VbmhhbmRsZWQocHJvbWlzZSk7XG4gIH0pO1xufTtcbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92O1xuICAgIHZhciB1bmhhbmRsZWQgPSBpc1VuaGFuZGxlZChwcm9taXNlKTtcbiAgICB2YXIgcmVzdWx0LCBoYW5kbGVyLCBjb25zb2xlO1xuICAgIGlmICh1bmhhbmRsZWQpIHtcbiAgICAgIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaXNOb2RlKSB7XG4gICAgICAgICAgcHJvY2Vzcy5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCB2YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaGFuZGxlciA9IGdsb2JhbC5vbnVuaGFuZGxlZHJlamVjdGlvbikge1xuICAgICAgICAgIGhhbmRsZXIoeyBwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHZhbHVlIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKChjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGUpICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24nLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGByZWplY3Rpb25IYW5kbGVkYCBldmVudCBpZiBpdCB3YXMgaGFuZGxlZCBoZXJlLCBOb2RlSlMgLSBzaG91bGRcbiAgICAgIHByb21pc2UuX2ggPSBpc05vZGUgfHwgaXNVbmhhbmRsZWQocHJvbWlzZSkgPyAyIDogMTtcbiAgICB9IHByb21pc2UuX2EgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHVuaGFuZGxlZCAmJiByZXN1bHQuZSkgdGhyb3cgcmVzdWx0LnY7XG4gIH0pO1xufTtcbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHJldHVybiBwcm9taXNlLl9oICE9PSAxICYmIChwcm9taXNlLl9hIHx8IHByb21pc2UuX2MpLmxlbmd0aCA9PT0gMDtcbn07XG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGhhbmRsZXI7XG4gICAgaWYgKGlzTm9kZSkge1xuICAgICAgcHJvY2Vzcy5lbWl0KCdyZWplY3Rpb25IYW5kbGVkJywgcHJvbWlzZSk7XG4gICAgfSBlbHNlIGlmIChoYW5kbGVyID0gZ2xvYmFsLm9ucmVqZWN0aW9uaGFuZGxlZCkge1xuICAgICAgaGFuZGxlcih7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogcHJvbWlzZS5fdiB9KTtcbiAgICB9XG4gIH0pO1xufTtcbnZhciAkcmVqZWN0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHZhciBwcm9taXNlID0gdGhpcztcbiAgaWYgKHByb21pc2UuX2QpIHJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICBwcm9taXNlLl92ID0gdmFsdWU7XG4gIHByb21pc2UuX3MgPSAyO1xuICBpZiAoIXByb21pc2UuX2EpIHByb21pc2UuX2EgPSBwcm9taXNlLl9jLnNsaWNlKCk7XG4gIG5vdGlmeShwcm9taXNlLCB0cnVlKTtcbn07XG52YXIgJHJlc29sdmUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIHByb21pc2UgPSB0aGlzO1xuICB2YXIgdGhlbjtcbiAgaWYgKHByb21pc2UuX2QpIHJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICB0cnkge1xuICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkgdGhyb3cgVHlwZUVycm9yKFwiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGZcIik7XG4gICAgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHZhbHVlKSkge1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdyYXBwZXIgPSB7IF93OiBwcm9taXNlLCBfZDogZmFsc2UgfTsgLy8gd3JhcFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgY3R4KCRyZXNvbHZlLCB3cmFwcGVyLCAxKSwgY3R4KCRyZWplY3QsIHdyYXBwZXIsIDEpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICRyZWplY3QuY2FsbCh3cmFwcGVyLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgICAgIHByb21pc2UuX3MgPSAxO1xuICAgICAgbm90aWZ5KHByb21pc2UsIGZhbHNlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAkcmVqZWN0LmNhbGwoeyBfdzogcHJvbWlzZSwgX2Q6IGZhbHNlIH0sIGUpOyAvLyB3cmFwXG4gIH1cbn07XG5cbi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsXG5pZiAoIVVTRV9OQVRJVkUpIHtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgJFByb21pc2UgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCAkUHJvbWlzZSwgUFJPTUlTRSwgJ19oJyk7XG4gICAgYUZ1bmN0aW9uKGV4ZWN1dG9yKTtcbiAgICBJbnRlcm5hbC5jYWxsKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihjdHgoJHJlc29sdmUsIHRoaXMsIDEpLCBjdHgoJHJlamVjdCwgdGhpcywgMSkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgJHJlamVjdC5jYWxsKHRoaXMsIGVycik7XG4gICAgfVxuICB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgdGhpcy5fYyA9IFtdOyAgICAgICAgICAgICAvLyA8LSBhd2FpdGluZyByZWFjdGlvbnNcbiAgICB0aGlzLl9hID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIGNoZWNrZWQgaW4gaXNVbmhhbmRsZWQgcmVhY3Rpb25zXG4gICAgdGhpcy5fcyA9IDA7ICAgICAgICAgICAgICAvLyA8LSBzdGF0ZVxuICAgIHRoaXMuX2QgPSBmYWxzZTsgICAgICAgICAgLy8gPC0gZG9uZVxuICAgIHRoaXMuX3YgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gdmFsdWVcbiAgICB0aGlzLl9oID0gMDsgICAgICAgICAgICAgIC8vIDwtIHJlamVjdGlvbiBzdGF0ZSwgMCAtIGRlZmF1bHQsIDEgLSBoYW5kbGVkLCAyIC0gdW5oYW5kbGVkXG4gICAgdGhpcy5fbiA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBub3RpZnlcbiAgfTtcbiAgSW50ZXJuYWwucHJvdG90eXBlID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJykoJFByb21pc2UucHJvdG90eXBlLCB7XG4gICAgLy8gMjUuNC41LjMgUHJvbWlzZS5wcm90b3R5cGUudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZClcbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICB2YXIgcmVhY3Rpb24gPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgJFByb21pc2UpKTtcbiAgICAgIHJlYWN0aW9uLm9rID0gdHlwZW9mIG9uRnVsZmlsbGVkID09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IHRydWU7XG4gICAgICByZWFjdGlvbi5mYWlsID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT0gJ2Z1bmN0aW9uJyAmJiBvblJlamVjdGVkO1xuICAgICAgcmVhY3Rpb24uZG9tYWluID0gaXNOb2RlID8gcHJvY2Vzcy5kb21haW4gOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYgKHRoaXMuX2EpIHRoaXMuX2EucHVzaChyZWFjdGlvbik7XG4gICAgICBpZiAodGhpcy5fcykgbm90aWZ5KHRoaXMsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gMjUuNC41LjEgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2gob25SZWplY3RlZClcbiAgICAnY2F0Y2gnOiBmdW5jdGlvbiAob25SZWplY3RlZCkge1xuICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICAgIH1cbiAgfSk7XG4gIE93blByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gbmV3IEludGVybmFsKCk7XG4gICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB0aGlzLnJlc29sdmUgPSBjdHgoJHJlc29sdmUsIHByb21pc2UsIDEpO1xuICAgIHRoaXMucmVqZWN0ID0gY3R4KCRyZWplY3QsIHByb21pc2UsIDEpO1xuICB9O1xuICBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICAgIHJldHVybiBDID09PSAkUHJvbWlzZSB8fCBDID09PSBXcmFwcGVyXG4gICAgICA/IG5ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gIH07XG59XG5cbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIHsgUHJvbWlzZTogJFByb21pc2UgfSk7XG5yZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpKCRQcm9taXNlLCBQUk9NSVNFKTtcbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoUFJPTUlTRSk7XG5XcmFwcGVyID0gcmVxdWlyZSgnLi9fY29yZScpW1BST01JU0VdO1xuXG4vLyBzdGF0aWNzXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC41IFByb21pc2UucmVqZWN0KHIpXG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpIHtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpO1xuICAgIHZhciAkJHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgICQkcmVqZWN0KHIpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTElCUkFSWSB8fCAhVVNFX05BVElWRSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjYgUHJvbWlzZS5yZXNvbHZlKHgpXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCkge1xuICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShMSUJSQVJZICYmIHRoaXMgPT09IFdyYXBwZXIgPyAkUHJvbWlzZSA6IHRoaXMsIHgpO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIShVU0VfTkFUSVZFICYmIHJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24gKGl0ZXIpIHtcbiAgJFByb21pc2UuYWxsKGl0ZXIpWydjYXRjaCddKGVtcHR5KTtcbn0pKSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuMSBQcm9taXNlLmFsbChpdGVyYWJsZSlcbiAgYWxsOiBmdW5jdGlvbiBhbGwoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2YXIgJGluZGV4ID0gaW5kZXgrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzWyRpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmUpIHJlamVjdChyZXN1bHQudik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfSxcbiAgLy8gMjUuNC40LjQgUHJvbWlzZS5yYWNlKGl0ZXJhYmxlKVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lKSByZWplY3QocmVzdWx0LnYpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcHJvbWlzZS1maW5hbGx5XG4ndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHByb21pc2VSZXNvbHZlID0gcmVxdWlyZSgnLi9fcHJvbWlzZS1yZXNvbHZlJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5SLCAnUHJvbWlzZScsIHsgJ2ZpbmFsbHknOiBmdW5jdGlvbiAob25GaW5hbGx5KSB7XG4gIHZhciBDID0gc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIGNvcmUuUHJvbWlzZSB8fCBnbG9iYWwuUHJvbWlzZSk7XG4gIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIG9uRmluYWxseSA9PSAnZnVuY3Rpb24nO1xuICByZXR1cm4gdGhpcy50aGVuKFxuICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoeCkge1xuICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHg7IH0pO1xuICAgIH0gOiBvbkZpbmFsbHksXG4gICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyB0aHJvdyBlOyB9KTtcbiAgICB9IDogb25GaW5hbGx5XG4gICk7XG59IH0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcHJvbWlzZS10cnlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSByZXF1aXJlKCcuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4vX3BlcmZvcm0nKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdQcm9taXNlJywgeyAndHJ5JzogZnVuY3Rpb24gKGNhbGxiYWNrZm4pIHtcbiAgdmFyIHByb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkuZih0aGlzKTtcbiAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oY2FsbGJhY2tmbik7XG4gIChyZXN1bHQuZSA/IHByb21pc2VDYXBhYmlsaXR5LnJlamVjdCA6IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmUpKHJlc3VsdC52KTtcbiAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7XG59IH0pO1xuIiwicmVxdWlyZSgnLi4vbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnByb21pc2UnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM3LnByb21pc2UuZmluYWxseScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczcucHJvbWlzZS50cnknKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vbW9kdWxlcy9fY29yZScpLlByb21pc2U7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vcHJvbWlzZVwiKTsiLCJ2YXIgX1Byb21pc2UgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9wcm9taXNlXCIpO1xuXG5mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICByZXR1cm4gbmV3IF9Qcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcblxuICAgICAgZnVuY3Rpb24gc3RlcChrZXksIGFyZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF9Qcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHtcbiAgICAgICAgc3RlcChcIm5leHRcIiwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBfdGhyb3coZXJyKSB7XG4gICAgICAgIHN0ZXAoXCJ0aHJvd1wiLCBlcnIpO1xuICAgICAgfVxuXG4gICAgICBfbmV4dCgpO1xuICAgIH0pO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hc3luY1RvR2VuZXJhdG9yOyIsImV4cG9ydHMuZiA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuIiwidmFyIHBJRSA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKTtcbnZhciBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKTtcbnZhciBnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGdPUEQgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkge1xuICBPID0gdG9JT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gZ09QRChPLCBQKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIGlmIChoYXMoTywgUCkpIHJldHVybiBjcmVhdGVEZXNjKCFwSUUuZi5jYWxsKE8sIFApLCBPW1BdKTtcbn07XG4iLCIvLyBtb3N0IE9iamVjdCBtZXRob2RzIGJ5IEVTNiBzaG91bGQgYWNjZXB0IHByaW1pdGl2ZXNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVksIGV4ZWMpIHtcbiAgdmFyIGZuID0gKGNvcmUuT2JqZWN0IHx8IHt9KVtLRVldIHx8IE9iamVjdFtLRVldO1xuICB2YXIgZXhwID0ge307XG4gIGV4cFtLRVldID0gZXhlYyhmbik7XG4gICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogZmFpbHMoZnVuY3Rpb24gKCkgeyBmbigxKTsgfSksICdPYmplY3QnLCBleHApO1xufTtcbiIsIi8vIDE5LjEuMi42IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUClcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZjtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3InLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSkge1xuICAgIHJldHVybiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRvSU9iamVjdChpdCksIGtleSk7XG4gIH07XG59KTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciAkT2JqZWN0ID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdDtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpIHtcbiAgcmV0dXJuICRPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yXCIpOyIsInZhciBNRVRBID0gcmVxdWlyZSgnLi9fdWlkJykoJ21ldGEnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHNldERlc2MgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGlkID0gMDtcbnZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlIHx8IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIEZSRUVaRSA9ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKTtcbn0pO1xudmFyIHNldE1ldGEgPSBmdW5jdGlvbiAoaXQpIHtcbiAgc2V0RGVzYyhpdCwgTUVUQSwgeyB2YWx1ZToge1xuICAgIGk6ICdPJyArICsraWQsIC8vIG9iamVjdCBJRFxuICAgIHc6IHt9ICAgICAgICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gfSk7XG59O1xudmFyIGZhc3RLZXkgPSBmdW5jdGlvbiAoaXQsIGNyZWF0ZSkge1xuICAvLyByZXR1cm4gcHJpbWl0aXZlIHdpdGggcHJlZml4XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiAodHlwZW9mIGl0ID09ICdzdHJpbmcnID8gJ1MnIDogJ1AnKSArIGl0O1xuICBpZiAoIWhhcyhpdCwgTUVUQSkpIHtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuICdGJztcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gJ0UnO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YShpdCk7XG4gIC8vIHJldHVybiBvYmplY3QgSURcbiAgfSByZXR1cm4gaXRbTUVUQV0uaTtcbn07XG52YXIgZ2V0V2VhayA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIGlmICghaGFzKGl0LCBNRVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhKGl0KTtcbiAgLy8gcmV0dXJuIGhhc2ggd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSByZXR1cm4gaXRbTUVUQV0udztcbn07XG4vLyBhZGQgbWV0YWRhdGEgb24gZnJlZXplLWZhbWlseSBtZXRob2RzIGNhbGxpbmdcbnZhciBvbkZyZWV6ZSA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoRlJFRVpFICYmIG1ldGEuTkVFRCAmJiBpc0V4dGVuc2libGUoaXQpICYmICFoYXMoaXQsIE1FVEEpKSBzZXRNZXRhKGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbnZhciBtZXRhID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gIEtFWTogTUVUQSxcbiAgTkVFRDogZmFsc2UsXG4gIGZhc3RLZXk6IGZhc3RLZXksXG4gIGdldFdlYWs6IGdldFdlYWssXG4gIG9uRnJlZXplOiBvbkZyZWV6ZVxufTtcbiIsImV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX3drcycpO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgTElCUkFSWSA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKTtcbnZhciB3a3NFeHQgPSByZXF1aXJlKCcuL193a3MtZXh0Jyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICB2YXIgJFN5bWJvbCA9IGNvcmUuU3ltYm9sIHx8IChjb3JlLlN5bWJvbCA9IExJQlJBUlkgPyB7fSA6IGdsb2JhbC5TeW1ib2wgfHwge30pO1xuICBpZiAobmFtZS5jaGFyQXQoMCkgIT0gJ18nICYmICEobmFtZSBpbiAkU3ltYm9sKSkgZGVmaW5lUHJvcGVydHkoJFN5bWJvbCwgbmFtZSwgeyB2YWx1ZTogd2tzRXh0LmYobmFtZSkgfSk7XG59O1xuIiwiZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbiIsIi8vIGFsbCBlbnVtZXJhYmxlIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBzeW1ib2xzXG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG52YXIgZ09QUyA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJyk7XG52YXIgcElFID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHJlc3VsdCA9IGdldEtleXMoaXQpO1xuICB2YXIgZ2V0U3ltYm9scyA9IGdPUFMuZjtcbiAgaWYgKGdldFN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IGdldFN5bWJvbHMoaXQpO1xuICAgIHZhciBpc0VudW0gPSBwSUUuZjtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAoc3ltYm9scy5sZW5ndGggPiBpKSBpZiAoaXNFbnVtLmNhbGwoaXQsIGtleSA9IHN5bWJvbHNbaSsrXSkpIHJlc3VsdC5wdXNoKGtleSk7XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIvLyA3LjIuMiBJc0FycmF5KGFyZ3VtZW50KVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkoYXJnKSB7XG4gIHJldHVybiBjb2YoYXJnKSA9PSAnQXJyYXknO1xufTtcbiIsIi8vIDE5LjEuMi43IC8gMTUuMi4zLjQgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKS5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiAka2V5cyhPLCBoaWRkZW5LZXlzKTtcbn07XG4iLCIvLyBmYWxsYmFjayBmb3IgSUUxMSBidWdneSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB3aXRoIGlmcmFtZSBhbmQgd2luZG93XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIGdPUE4gPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmY7XG52YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxudmFyIHdpbmRvd05hbWVzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNcbiAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpIDogW107XG5cbnZhciBnZXRXaW5kb3dOYW1lcyA9IGZ1bmN0aW9uIChpdCkge1xuICB0cnkge1xuICAgIHJldHVybiBnT1BOKGl0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB3aW5kb3dOYW1lcy5zbGljZSgpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCkge1xuICByZXR1cm4gd2luZG93TmFtZXMgJiYgdG9TdHJpbmcuY2FsbChpdCkgPT0gJ1tvYmplY3QgV2luZG93XScgPyBnZXRXaW5kb3dOYW1lcyhpdCkgOiBnT1BOKHRvSU9iamVjdChpdCkpO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIEVDTUFTY3JpcHQgNiBzeW1ib2xzIHNoaW1cbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciBNRVRBID0gcmVxdWlyZSgnLi9fbWV0YScpLktFWTtcbnZhciAkZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbnZhciB3a3MgPSByZXF1aXJlKCcuL193a3MnKTtcbnZhciB3a3NFeHQgPSByZXF1aXJlKCcuL193a3MtZXh0Jyk7XG52YXIgd2tzRGVmaW5lID0gcmVxdWlyZSgnLi9fd2tzLWRlZmluZScpO1xudmFyIGVudW1LZXlzID0gcmVxdWlyZSgnLi9fZW51bS1rZXlzJyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4vX2lzLWFycmF5Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG52YXIgX2NyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbnZhciBnT1BORXh0ID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4tZXh0Jyk7XG52YXIgJEdPUEQgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpO1xudmFyICREUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyICRrZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcbnZhciBnT1BEID0gJEdPUEQuZjtcbnZhciBkUCA9ICREUC5mO1xudmFyIGdPUE4gPSBnT1BORXh0LmY7XG52YXIgJFN5bWJvbCA9IGdsb2JhbC5TeW1ib2w7XG52YXIgJEpTT04gPSBnbG9iYWwuSlNPTjtcbnZhciBfc3RyaW5naWZ5ID0gJEpTT04gJiYgJEpTT04uc3RyaW5naWZ5O1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xudmFyIEhJRERFTiA9IHdrcygnX2hpZGRlbicpO1xudmFyIFRPX1BSSU1JVElWRSA9IHdrcygndG9QcmltaXRpdmUnKTtcbnZhciBpc0VudW0gPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbnZhciBTeW1ib2xSZWdpc3RyeSA9IHNoYXJlZCgnc3ltYm9sLXJlZ2lzdHJ5Jyk7XG52YXIgQWxsU3ltYm9scyA9IHNoYXJlZCgnc3ltYm9scycpO1xudmFyIE9QU3ltYm9scyA9IHNoYXJlZCgnb3Atc3ltYm9scycpO1xudmFyIE9iamVjdFByb3RvID0gT2JqZWN0W1BST1RPVFlQRV07XG52YXIgVVNFX05BVElWRSA9IHR5cGVvZiAkU3ltYm9sID09ICdmdW5jdGlvbic7XG52YXIgUU9iamVjdCA9IGdsb2JhbC5RT2JqZWN0O1xuLy8gRG9uJ3QgdXNlIHNldHRlcnMgaW4gUXQgU2NyaXB0LCBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMTczXG52YXIgc2V0dGVyID0gIVFPYmplY3QgfHwgIVFPYmplY3RbUFJPVE9UWVBFXSB8fCAhUU9iamVjdFtQUk9UT1RZUEVdLmZpbmRDaGlsZDtcblxuLy8gZmFsbGJhY2sgZm9yIG9sZCBBbmRyb2lkLCBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9Njg3XG52YXIgc2V0U3ltYm9sRGVzYyA9IERFU0NSSVBUT1JTICYmICRmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBfY3JlYXRlKGRQKHt9LCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRQKHRoaXMsICdhJywgeyB2YWx1ZTogNyB9KS5hOyB9XG4gIH0pKS5hICE9IDc7XG59KSA/IGZ1bmN0aW9uIChpdCwga2V5LCBEKSB7XG4gIHZhciBwcm90b0Rlc2MgPSBnT1BEKE9iamVjdFByb3RvLCBrZXkpO1xuICBpZiAocHJvdG9EZXNjKSBkZWxldGUgT2JqZWN0UHJvdG9ba2V5XTtcbiAgZFAoaXQsIGtleSwgRCk7XG4gIGlmIChwcm90b0Rlc2MgJiYgaXQgIT09IE9iamVjdFByb3RvKSBkUChPYmplY3RQcm90bywga2V5LCBwcm90b0Rlc2MpO1xufSA6IGRQO1xuXG52YXIgd3JhcCA9IGZ1bmN0aW9uICh0YWcpIHtcbiAgdmFyIHN5bSA9IEFsbFN5bWJvbHNbdGFnXSA9IF9jcmVhdGUoJFN5bWJvbFtQUk9UT1RZUEVdKTtcbiAgc3ltLl9rID0gdGFnO1xuICByZXR1cm4gc3ltO1xufTtcblxudmFyIGlzU3ltYm9sID0gVVNFX05BVElWRSAmJiB0eXBlb2YgJFN5bWJvbC5pdGVyYXRvciA9PSAnc3ltYm9sJyA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnO1xufSA6IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgaW5zdGFuY2VvZiAkU3ltYm9sO1xufTtcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KGl0LCBrZXksIEQpIHtcbiAgaWYgKGl0ID09PSBPYmplY3RQcm90bykgJGRlZmluZVByb3BlcnR5KE9QU3ltYm9scywga2V5LCBEKTtcbiAgYW5PYmplY3QoaXQpO1xuICBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpO1xuICBhbk9iamVjdChEKTtcbiAgaWYgKGhhcyhBbGxTeW1ib2xzLCBrZXkpKSB7XG4gICAgaWYgKCFELmVudW1lcmFibGUpIHtcbiAgICAgIGlmICghaGFzKGl0LCBISURERU4pKSBkUChpdCwgSElEREVOLCBjcmVhdGVEZXNjKDEsIHt9KSk7XG4gICAgICBpdFtISURERU5dW2tleV0gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSkgaXRbSElEREVOXVtrZXldID0gZmFsc2U7XG4gICAgICBEID0gX2NyZWF0ZShELCB7IGVudW1lcmFibGU6IGNyZWF0ZURlc2MoMCwgZmFsc2UpIH0pO1xuICAgIH0gcmV0dXJuIHNldFN5bWJvbERlc2MoaXQsIGtleSwgRCk7XG4gIH0gcmV0dXJuIGRQKGl0LCBrZXksIEQpO1xufTtcbnZhciAkZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoaXQsIFApIHtcbiAgYW5PYmplY3QoaXQpO1xuICB2YXIga2V5cyA9IGVudW1LZXlzKFAgPSB0b0lPYmplY3QoUCkpO1xuICB2YXIgaSA9IDA7XG4gIHZhciBsID0ga2V5cy5sZW5ndGg7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChsID4gaSkgJGRlZmluZVByb3BlcnR5KGl0LCBrZXkgPSBrZXlzW2krK10sIFBba2V5XSk7XG4gIHJldHVybiBpdDtcbn07XG52YXIgJGNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShpdCwgUCkge1xuICByZXR1cm4gUCA9PT0gdW5kZWZpbmVkID8gX2NyZWF0ZShpdCkgOiAkZGVmaW5lUHJvcGVydGllcyhfY3JlYXRlKGl0KSwgUCk7XG59O1xudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKGtleSkge1xuICB2YXIgRSA9IGlzRW51bS5jYWxsKHRoaXMsIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSkpO1xuICBpZiAodGhpcyA9PT0gT2JqZWN0UHJvdG8gJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhPUFN5bWJvbHMsIGtleSkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIEUgfHwgIWhhcyh0aGlzLCBrZXkpIHx8ICFoYXMoQWxsU3ltYm9scywga2V5KSB8fCBoYXModGhpcywgSElEREVOKSAmJiB0aGlzW0hJRERFTl1ba2V5XSA/IEUgOiB0cnVlO1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpIHtcbiAgaXQgPSB0b0lPYmplY3QoaXQpO1xuICBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpO1xuICBpZiAoaXQgPT09IE9iamVjdFByb3RvICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT1BTeW1ib2xzLCBrZXkpKSByZXR1cm47XG4gIHZhciBEID0gZ09QRChpdCwga2V5KTtcbiAgaWYgKEQgJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIShoYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKSkgRC5lbnVtZXJhYmxlID0gdHJ1ZTtcbiAgcmV0dXJuIEQ7XG59O1xudmFyICRnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCkge1xuICB2YXIgbmFtZXMgPSBnT1BOKHRvSU9iamVjdChpdCkpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBpID0gMDtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIHtcbiAgICBpZiAoIWhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSAmJiBrZXkgIT0gSElEREVOICYmIGtleSAhPSBNRVRBKSByZXN1bHQucHVzaChrZXkpO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xudmFyICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpIHtcbiAgdmFyIElTX09QID0gaXQgPT09IE9iamVjdFByb3RvO1xuICB2YXIgbmFtZXMgPSBnT1BOKElTX09QID8gT1BTeW1ib2xzIDogdG9JT2JqZWN0KGl0KSk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGkgPSAwO1xuICB2YXIga2V5O1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkge1xuICAgIGlmIChoYXMoQWxsU3ltYm9scywga2V5ID0gbmFtZXNbaSsrXSkgJiYgKElTX09QID8gaGFzKE9iamVjdFByb3RvLCBrZXkpIDogdHJ1ZSkpIHJlc3VsdC5wdXNoKEFsbFN5bWJvbHNba2V5XSk7XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIDE5LjQuMS4xIFN5bWJvbChbZGVzY3JpcHRpb25dKVxuaWYgKCFVU0VfTkFUSVZFKSB7XG4gICRTeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2woKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiAkU3ltYm9sKSB0aHJvdyBUeXBlRXJyb3IoJ1N5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciEnKTtcbiAgICB2YXIgdGFnID0gdWlkKGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTtcbiAgICB2YXIgJHNldCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgaWYgKHRoaXMgPT09IE9iamVjdFByb3RvKSAkc2V0LmNhbGwoT1BTeW1ib2xzLCB2YWx1ZSk7XG4gICAgICBpZiAoaGFzKHRoaXMsIEhJRERFTikgJiYgaGFzKHRoaXNbSElEREVOXSwgdGFnKSkgdGhpc1tISURERU5dW3RhZ10gPSBmYWxzZTtcbiAgICAgIHNldFN5bWJvbERlc2ModGhpcywgdGFnLCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG4gICAgfTtcbiAgICBpZiAoREVTQ1JJUFRPUlMgJiYgc2V0dGVyKSBzZXRTeW1ib2xEZXNjKE9iamVjdFByb3RvLCB0YWcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCBzZXQ6ICRzZXQgfSk7XG4gICAgcmV0dXJuIHdyYXAodGFnKTtcbiAgfTtcbiAgcmVkZWZpbmUoJFN5bWJvbFtQUk9UT1RZUEVdLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5faztcbiAgfSk7XG5cbiAgJEdPUEQuZiA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG4gICREUC5mID0gJGRlZmluZVByb3BlcnR5O1xuICByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmYgPSBnT1BORXh0LmYgPSAkZ2V0T3duUHJvcGVydHlOYW1lcztcbiAgcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpLmYgPSAkcHJvcGVydHlJc0VudW1lcmFibGU7XG4gIHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJykuZiA9ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbiAgaWYgKERFU0NSSVBUT1JTICYmICFyZXF1aXJlKCcuL19saWJyYXJ5JykpIHtcbiAgICByZWRlZmluZShPYmplY3RQcm90bywgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgJHByb3BlcnR5SXNFbnVtZXJhYmxlLCB0cnVlKTtcbiAgfVxuXG4gIHdrc0V4dC5mID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gd3JhcCh3a3MobmFtZSkpO1xuICB9O1xufVxuXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCB7IFN5bWJvbDogJFN5bWJvbCB9KTtcblxuZm9yICh2YXIgZXM2U3ltYm9scyA9IChcbiAgLy8gMTkuNC4yLjIsIDE5LjQuMi4zLCAxOS40LjIuNCwgMTkuNC4yLjYsIDE5LjQuMi44LCAxOS40LjIuOSwgMTkuNC4yLjEwLCAxOS40LjIuMTEsIDE5LjQuMi4xMiwgMTkuNC4yLjEzLCAxOS40LjIuMTRcbiAgJ2hhc0luc3RhbmNlLGlzQ29uY2F0U3ByZWFkYWJsZSxpdGVyYXRvcixtYXRjaCxyZXBsYWNlLHNlYXJjaCxzcGVjaWVzLHNwbGl0LHRvUHJpbWl0aXZlLHRvU3RyaW5nVGFnLHVuc2NvcGFibGVzJ1xuKS5zcGxpdCgnLCcpLCBqID0gMDsgZXM2U3ltYm9scy5sZW5ndGggPiBqOyl3a3MoZXM2U3ltYm9sc1tqKytdKTtcblxuZm9yICh2YXIgd2VsbEtub3duU3ltYm9scyA9ICRrZXlzKHdrcy5zdG9yZSksIGsgPSAwOyB3ZWxsS25vd25TeW1ib2xzLmxlbmd0aCA+IGs7KSB3a3NEZWZpbmUod2VsbEtub3duU3ltYm9sc1trKytdKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgJ1N5bWJvbCcsIHtcbiAgLy8gMTkuNC4yLjEgU3ltYm9sLmZvcihrZXkpXG4gICdmb3InOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIGhhcyhTeW1ib2xSZWdpc3RyeSwga2V5ICs9ICcnKVxuICAgICAgPyBTeW1ib2xSZWdpc3RyeVtrZXldXG4gICAgICA6IFN5bWJvbFJlZ2lzdHJ5W2tleV0gPSAkU3ltYm9sKGtleSk7XG4gIH0sXG4gIC8vIDE5LjQuMi41IFN5bWJvbC5rZXlGb3Ioc3ltKVxuICBrZXlGb3I6IGZ1bmN0aW9uIGtleUZvcihzeW0pIHtcbiAgICBpZiAoIWlzU3ltYm9sKHN5bSkpIHRocm93IFR5cGVFcnJvcihzeW0gKyAnIGlzIG5vdCBhIHN5bWJvbCEnKTtcbiAgICBmb3IgKHZhciBrZXkgaW4gU3ltYm9sUmVnaXN0cnkpIGlmIChTeW1ib2xSZWdpc3RyeVtrZXldID09PSBzeW0pIHJldHVybiBrZXk7XG4gIH0sXG4gIHVzZVNldHRlcjogZnVuY3Rpb24gKCkgeyBzZXR0ZXIgPSB0cnVlOyB9LFxuICB1c2VTaW1wbGU6IGZ1bmN0aW9uICgpIHsgc2V0dGVyID0gZmFsc2U7IH1cbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCAnT2JqZWN0Jywge1xuICAvLyAxOS4xLjIuMiBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG4gIGNyZWF0ZTogJGNyZWF0ZSxcbiAgLy8gMTkuMS4yLjQgT2JqZWN0LmRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpXG4gIGRlZmluZVByb3BlcnR5OiAkZGVmaW5lUHJvcGVydHksXG4gIC8vIDE5LjEuMi4zIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpXG4gIGRlZmluZVByb3BlcnRpZXM6ICRkZWZpbmVQcm9wZXJ0aWVzLFxuICAvLyAxOS4xLjIuNiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogJGdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbiAgLy8gMTkuMS4yLjcgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbiAgZ2V0T3duUHJvcGVydHlOYW1lczogJGdldE93blByb3BlcnR5TmFtZXMsXG4gIC8vIDE5LjEuMi44IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoTylcbiAgZ2V0T3duUHJvcGVydHlTeW1ib2xzOiAkZ2V0T3duUHJvcGVydHlTeW1ib2xzXG59KTtcblxuLy8gMjQuMy4yIEpTT04uc3RyaW5naWZ5KHZhbHVlIFssIHJlcGxhY2VyIFssIHNwYWNlXV0pXG4kSlNPTiAmJiAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICghVVNFX05BVElWRSB8fCAkZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgUyA9ICRTeW1ib2woKTtcbiAgLy8gTVMgRWRnZSBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMge31cbiAgLy8gV2ViS2l0IGNvbnZlcnRzIHN5bWJvbCB2YWx1ZXMgdG8gSlNPTiBhcyBudWxsXG4gIC8vIFY4IHRocm93cyBvbiBib3hlZCBzeW1ib2xzXG4gIHJldHVybiBfc3RyaW5naWZ5KFtTXSkgIT0gJ1tudWxsXScgfHwgX3N0cmluZ2lmeSh7IGE6IFMgfSkgIT0gJ3t9JyB8fCBfc3RyaW5naWZ5KE9iamVjdChTKSkgIT0gJ3t9Jztcbn0pKSwgJ0pTT04nLCB7XG4gIHN0cmluZ2lmeTogZnVuY3Rpb24gc3RyaW5naWZ5KGl0KSB7XG4gICAgdmFyIGFyZ3MgPSBbaXRdO1xuICAgIHZhciBpID0gMTtcbiAgICB2YXIgcmVwbGFjZXIsICRyZXBsYWNlcjtcbiAgICB3aGlsZSAoYXJndW1lbnRzLmxlbmd0aCA+IGkpIGFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG4gICAgJHJlcGxhY2VyID0gcmVwbGFjZXIgPSBhcmdzWzFdO1xuICAgIGlmICghaXNPYmplY3QocmVwbGFjZXIpICYmIGl0ID09PSB1bmRlZmluZWQgfHwgaXNTeW1ib2woaXQpKSByZXR1cm47IC8vIElFOCByZXR1cm5zIHN0cmluZyBvbiB1bmRlZmluZWRcbiAgICBpZiAoIWlzQXJyYXkocmVwbGFjZXIpKSByZXBsYWNlciA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mICRyZXBsYWNlciA9PSAnZnVuY3Rpb24nKSB2YWx1ZSA9ICRyZXBsYWNlci5jYWxsKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgaWYgKCFpc1N5bWJvbCh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIGFyZ3NbMV0gPSByZXBsYWNlcjtcbiAgICByZXR1cm4gX3N0cmluZ2lmeS5hcHBseSgkSlNPTiwgYXJncyk7XG4gIH1cbn0pO1xuXG4vLyAxOS40LjMuNCBTeW1ib2wucHJvdG90eXBlW0BAdG9QcmltaXRpdmVdKGhpbnQpXG4kU3ltYm9sW1BST1RPVFlQRV1bVE9fUFJJTUlUSVZFXSB8fCByZXF1aXJlKCcuL19oaWRlJykoJFN5bWJvbFtQUk9UT1RZUEVdLCBUT19QUklNSVRJVkUsICRTeW1ib2xbUFJPVE9UWVBFXS52YWx1ZU9mKTtcbi8vIDE5LjQuMy41IFN5bWJvbC5wcm90b3R5cGVbQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKCRTeW1ib2wsICdTeW1ib2wnKTtcbi8vIDIwLjIuMS45IE1hdGhbQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKE1hdGgsICdNYXRoJywgdHJ1ZSk7XG4vLyAyNC4zLjMgSlNPTltAQHRvU3RyaW5nVGFnXVxuc2V0VG9TdHJpbmdUYWcoZ2xvYmFsLkpTT04sICdKU09OJywgdHJ1ZSk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5zeW1ib2wnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2dldC1vd24tcHJvcGVydHktc3ltYm9sc1wiKTsiLCIvLyAxOS4xLjIuMTQgT2JqZWN0LmtleXMoTylcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyICRrZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdrZXlzJywgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZnVuY3Rpb24ga2V5cyhpdCkge1xuICAgIHJldHVybiAka2V5cyh0b09iamVjdChpdCkpO1xuICB9O1xufSk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3Qua2V5cycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0LmtleXM7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2tleXNcIik7IiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbi8vIDE5LjEuMi40IC8gMTUuMi4zLjYgT2JqZWN0LmRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpLCAnT2JqZWN0JywgeyBkZWZpbmVQcm9wZXJ0eTogcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZiB9KTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydHknKTtcbnZhciAkT2JqZWN0ID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdDtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgZGVzYykge1xuICByZXR1cm4gJE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBkZXNjKTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTsiLCJ2YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBfT2JqZWN0JGRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfZGVmaW5lUHJvcGVydHk7IiwidmFyIF9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZShcIi4uL2NvcmUtanMvb2JqZWN0L2dldC1vd24tcHJvcGVydHktZGVzY3JpcHRvclwiKTtcblxudmFyIF9PYmplY3QkZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gcmVxdWlyZShcIi4uL2NvcmUtanMvb2JqZWN0L2dldC1vd24tcHJvcGVydHktc3ltYm9sc1wiKTtcblxudmFyIF9PYmplY3Qka2V5cyA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9rZXlzXCIpO1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiLi9kZWZpbmVQcm9wZXJ0eVwiKTtcblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIHZhciBvd25LZXlzID0gX09iamVjdCRrZXlzKHNvdXJjZSk7XG5cbiAgICBpZiAodHlwZW9mIF9PYmplY3QkZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoX09iamVjdCRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKS5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgICByZXR1cm4gX09iamVjdCRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7XG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9vYmplY3RTcHJlYWQ7IiwiZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfY2xhc3NDYWxsQ2hlY2s7IiwiLy8gV29ya3Mgd2l0aCBfX3Byb3RvX18gb25seS4gT2xkIHY4IGNhbid0IHdvcmsgd2l0aCBudWxsIHByb3RvIG9iamVjdHMuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBjaGVjayA9IGZ1bmN0aW9uIChPLCBwcm90bykge1xuICBhbk9iamVjdChPKTtcbiAgaWYgKCFpc09iamVjdChwcm90bykgJiYgcHJvdG8gIT09IG51bGwpIHRocm93IFR5cGVFcnJvcihwcm90byArIFwiOiBjYW4ndCBzZXQgYXMgcHJvdG90eXBlIVwiKTtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgKCdfX3Byb3RvX18nIGluIHt9ID8gLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgIGZ1bmN0aW9uICh0ZXN0LCBidWdneSwgc2V0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZXQgPSByZXF1aXJlKCcuL19jdHgnKShGdW5jdGlvbi5jYWxsLCByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpLmYoT2JqZWN0LnByb3RvdHlwZSwgJ19fcHJvdG9fXycpLnNldCwgMik7XG4gICAgICAgIHNldCh0ZXN0LCBbXSk7XG4gICAgICAgIGJ1Z2d5ID0gISh0ZXN0IGluc3RhbmNlb2YgQXJyYXkpO1xuICAgICAgfSBjYXRjaCAoZSkgeyBidWdneSA9IHRydWU7IH1cbiAgICAgIHJldHVybiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihPLCBwcm90bykge1xuICAgICAgICBjaGVjayhPLCBwcm90byk7XG4gICAgICAgIGlmIChidWdneSkgTy5fX3Byb3RvX18gPSBwcm90bztcbiAgICAgICAgZWxzZSBzZXQoTywgcHJvdG8pO1xuICAgICAgICByZXR1cm4gTztcbiAgICAgIH07XG4gICAgfSh7fSwgZmFsc2UpIDogdW5kZWZpbmVkKSxcbiAgY2hlY2s6IGNoZWNrXG59O1xuIiwiLy8gMTkuMS4zLjE5IE9iamVjdC5zZXRQcm90b3R5cGVPZihPLCBwcm90bylcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHsgc2V0UHJvdG90eXBlT2Y6IHJlcXVpcmUoJy4vX3NldC1wcm90bycpLnNldCB9KTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5zZXQtcHJvdG90eXBlLW9mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Quc2V0UHJvdG90eXBlT2Y7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L3NldC1wcm90b3R5cGUtb2ZcIik7IiwidmFyIF9PYmplY3Qkc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9vYmplY3Qvc2V0LXByb3RvdHlwZS1vZlwiKTtcblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfc2V0UHJvdG90eXBlT2YgPSBfT2JqZWN0JHNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgby5fX3Byb3RvX18gPSBwO1xuICAgIHJldHVybiBvO1xuICB9O1xuXG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3NldFByb3RvdHlwZU9mOyIsInZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCIuL3NldFByb3RvdHlwZU9mXCIpO1xuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtcbiAgfVxuXG4gIHNldFByb3RvdHlwZU9mKHN1YkNsYXNzLnByb3RvdHlwZSwgc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSk7XG4gIGlmIChzdXBlckNsYXNzKSBzZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2luaGVyaXRzOyIsInZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIi4uL2NvcmUtanMvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG5cbiAgICBfT2JqZWN0JGRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9jcmVhdGVDbGFzczsiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL193a3MtZXh0JykuZignaXRlcmF0b3InKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9zeW1ib2wvaXRlcmF0b3JcIik7IiwicmVxdWlyZSgnLi9fd2tzLWRlZmluZScpKCdhc3luY0l0ZXJhdG9yJyk7XG4iLCJyZXF1aXJlKCcuL193a3MtZGVmaW5lJykoJ29ic2VydmFibGUnKTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2LnN5bWJvbCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczcuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNy5zeW1ib2wub2JzZXJ2YWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuU3ltYm9sO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL3N5bWJvbFwiKTsiLCJ2YXIgX1N5bWJvbCRpdGVyYXRvciA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL3N5bWJvbC9pdGVyYXRvclwiKTtcblxudmFyIF9TeW1ib2wgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9zeW1ib2xcIik7XG5cbmZ1bmN0aW9uIF90eXBlb2YyKG9iaikgeyBpZiAodHlwZW9mIF9TeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgX1N5bWJvbCRpdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mMiA9IGZ1bmN0aW9uIF90eXBlb2YyKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZjIgPSBmdW5jdGlvbiBfdHlwZW9mMihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgX1N5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gX1N5bWJvbCAmJiBvYmogIT09IF9TeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2YyKG9iaik7IH1cblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgaWYgKHR5cGVvZiBfU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgX3R5cGVvZjIoX1N5bWJvbCRpdGVyYXRvcikgPT09IFwic3ltYm9sXCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgcmV0dXJuIF90eXBlb2YyKG9iaik7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgX1N5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gX1N5bWJvbCAmJiBvYmogIT09IF9TeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IF90eXBlb2YyKG9iaik7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfdHlwZW9mKG9iaik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3R5cGVvZjsiLCJmdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHtcbiAgaWYgKHNlbGYgPT09IHZvaWQgMCkge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBzZWxmO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQ7IiwidmFyIF90eXBlb2YgPSByZXF1aXJlKFwiLi4vaGVscGVycy90eXBlb2ZcIik7XG5cbnZhciBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQgPSByZXF1aXJlKFwiLi9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIik7XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHtcbiAgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICByZXR1cm4gY2FsbDtcbiAgfVxuXG4gIHJldHVybiBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm47IiwiLy8gMTkuMS4yLjkgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciAkZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnZ2V0UHJvdG90eXBlT2YnLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBnZXRQcm90b3R5cGVPZihpdCkge1xuICAgIHJldHVybiAkZ2V0UHJvdG90eXBlT2YodG9PYmplY3QoaXQpKTtcbiAgfTtcbn0pO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LmdldC1wcm90b3R5cGUtb2YnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdC5nZXRQcm90b3R5cGVPZjtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZ2V0LXByb3RvdHlwZS1vZlwiKTsiLCJ2YXIgX09iamVjdCRnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9nZXQtcHJvdG90eXBlLW9mXCIpO1xuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICBtb2R1bGUuZXhwb3J0cyA9IF9nZXRQcm90b3R5cGVPZiA9IF9PYmplY3QkZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgICByZXR1cm4gby5fX3Byb3RvX187XG4gIH07XG5cbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfZ2V0UHJvdG90eXBlT2Y7IiwiZXhwb3J0IGNvbnN0IGV4dGVuZCA9IChvYmplY3QsIC4uLmV4dGVuc2lvbnMpID0+IHsgLy8gJC5leHRlbmQgYWx0ZXJuYXRpdmUsIC4uLiBpcyB0aGUgc3ByZWFkIG9wZXJhdG9yLlxuICBmb3IgKGNvbnN0IGV4dGVuc2lvbiBvZiBleHRlbnNpb25zKSB7XG4gICAgLy8gY29uc29sZS5sb2coZXh0ZW5zaW9uKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0eXBlb2YgZXh0ZW5zaW9uKTtcblxuICAgIGlmICghZXh0ZW5zaW9uKVxuICAgICAgY29udGludWU7IC8vIElnbm9yZSBudWxsIGFuZCB1bmRlZmluZWQgb2JqZWN0cyBhbmQgcGFyYW1ldGVycy5cblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhleHRlbnNpb24pKSB7IC8vIERvIG5vdCB0cmF2ZXJzZSB0aGUgcHJvdG90eXBlIGNoYWluLlxuICAgICAgaWYgKG9iamVjdFtwcm9wXSAhPT0gdW5kZWZpbmVkICYmIGV4dGVuc2lvbltwcm9wXVxuICAgICAgICAmJiBvYmplY3RbcHJvcF0udG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSdcbiAgICAgICAgJiYgZXh0ZW5zaW9uW3Byb3BdLnRvU3RyaW5nKCkgPT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICAgIC8vIEdvZXMgZGVlcCBvbmx5IGlmIG9iamVjdFtwcm9wXSBhbmQgZXh0ZW5zaW9uW3Byb3BdIGFyZSBib3RoIG9iamVjdHMgIVxuICAgICAgICBpZiAob2JqZWN0W3Byb3BdLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIGV4dGVuZChvYmplY3RbcHJvcF0sIGV4dGVuc2lvbltwcm9wXSk7XG4gICAgICB9IGVsc2VcbiAgICAgICAgb2JqZWN0W3Byb3BdID0gdHlwZW9mIG9iamVjdFtwcm9wXSA9PT0gJ3VuZGVmaW5lZCcgPyBleHRlbnNpb25bcHJvcF0gOiBvYmplY3RbcHJvcF07XG5cbiAgICAgIGlmICh0eXBlb2Ygb2JqZWN0W3Byb3BdID09PSAndW5kZWZpbmVkJyAmJiBBcnJheS5pc0FycmF5KGV4dGVuc2lvbltwcm9wXSkpIG9iamVjdFtwcm9wXSA9IGV4dGVuc2lvbltwcm9wXS5zbGljZSgpOyAvLyBBZGQgdmFsdWVzIHRoYXQgZG8gbm90IGFscmVhZHkgZXhpc3QuXG4gICAgICBlbHNlIGlmICh0eXBlb2Ygb2JqZWN0W3Byb3BdID09PSAndW5kZWZpbmVkJyAmJiBBcnJheS5pc0FycmF5KGV4dGVuc2lvbltwcm9wXSkpIG9iamVjdFtwcm9wXSA9IGV4dGVuc2lvbltwcm9wXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqZWN0O1xufTtcbiIsImV4cG9ydCBjb25zdCBpbnN0cnVjdCA9IChhcnJheSwgaW5zdEFycmF5KSA9PiB7XG4gIGNvbnN0IHRlbXBPYmplY3QgPSB7fTtcblxuICBmb3IgKGxldCBpID0gMCwgbWF4ID0gaW5zdEFycmF5Lmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7XG4gICAgY29uc3QgZ3VpZGUgPSBpbnN0QXJyYXlbaV07XG5cbiAgICB0ZW1wT2JqZWN0W2d1aWRlXSA9IGFycmF5W2ldO1xuICB9XG5cbiAgcmV0dXJuIHRlbXBPYmplY3Q7XG59O1xuXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtRGF0YSA9IChvYmplY3QsIGluc3RydWN0aW9ucykgPT4ge1xuICBmb3IgKGNvbnN0IGtleSBpbiBpbnN0cnVjdGlvbnMpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3Rba2V5XSkpXG4gICAgICBvYmplY3Rba2V5XSA9IGluc3RydWN0KG9iamVjdFtrZXldLCBpbnN0cnVjdGlvbnNba2V5XSk7XG4gICAgZWxzZSBpZiAob2JqZWN0W2tleV0gaW5zdGFuY2VvZiBPYmplY3QgJiYgIShBcnJheS5pc0FycmF5KGluc3RydWN0aW9uc1trZXldKSkpXG4gICAgICBvYmplY3Rba2V5XSA9IHRyYW5zZm9ybURhdGEob2JqZWN0W2tleV0sIGluc3RydWN0aW9uc1trZXldKTtcbiAgfVxuXG4gIHJldHVybiBvYmplY3Q7XG59O1xuXG5leHBvcnQgY29uc3QgdG9BcnJheSA9IChvYmplY3QsIGluc3RydWN0aW9uKSA9PiB7XG4gIGNvbnN0IHRlbXBBcnJheSA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwLCBtYXggPSBpbnN0cnVjdGlvbi5sZW5ndGg7IGkgPCBtYXg7IGkrKykge1xuICAgIGNvbnN0IGd1aWRlID0gaW5zdHJ1Y3Rpb25baV07XG5cbiAgICB0ZW1wQXJyYXlbaV0gPSBvYmplY3RbZ3VpZGVdO1xuICB9XG5cbiAgcmV0dXJuIHRlbXBBcnJheTtcbn07XG4iLCIvLyBQb2x5ZmlsbHNcblxuaWYgKCBOdW1iZXIuRVBTSUxPTiA9PT0gdW5kZWZpbmVkICkge1xuXG5cdE51bWJlci5FUFNJTE9OID0gTWF0aC5wb3coIDIsIC0gNTIgKTtcblxufVxuXG5pZiAoIE51bWJlci5pc0ludGVnZXIgPT09IHVuZGVmaW5lZCApIHtcblxuXHQvLyBNaXNzaW5nIGluIElFXG5cdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL051bWJlci9pc0ludGVnZXJcblxuXHROdW1iZXIuaXNJbnRlZ2VyID0gZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKCB2YWx1ZSApICYmIE1hdGguZmxvb3IoIHZhbHVlICkgPT09IHZhbHVlO1xuXG5cdH07XG5cbn1cblxuLy9cblxuaWYgKCBNYXRoLnNpZ24gPT09IHVuZGVmaW5lZCApIHtcblxuXHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9NYXRoL3NpZ25cblxuXHRNYXRoLnNpZ24gPSBmdW5jdGlvbiAoIHggKSB7XG5cblx0XHRyZXR1cm4gKCB4IDwgMCApID8gLSAxIDogKCB4ID4gMCApID8gMSA6ICsgeDtcblxuXHR9O1xuXG59XG5cbmlmICggJ25hbWUnIGluIEZ1bmN0aW9uLnByb3RvdHlwZSA9PT0gZmFsc2UgKSB7XG5cblx0Ly8gTWlzc2luZyBpbiBJRVxuXHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9GdW5jdGlvbi9uYW1lXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCBGdW5jdGlvbi5wcm90b3R5cGUsICduYW1lJywge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnRvU3RyaW5nKCkubWF0Y2goIC9eXFxzKmZ1bmN0aW9uXFxzKihbXlxcKFxcc10qKS8gKVsgMSBdO1xuXG5cdFx0fVxuXG5cdH0gKTtcblxufVxuXG5pZiAoIE9iamVjdC5hc3NpZ24gPT09IHVuZGVmaW5lZCApIHtcblxuXHQvLyBNaXNzaW5nIGluIElFXG5cdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9hc3NpZ25cblxuXHQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdE9iamVjdC5hc3NpZ24gPSBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCB8fCB0YXJnZXQgPT09IG51bGwgKSB7XG5cblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvciggJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgb3V0cHV0ID0gT2JqZWN0KCB0YXJnZXQgKTtcblxuXHRcdFx0Zm9yICggdmFyIGluZGV4ID0gMTsgaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCArKyApIHtcblxuXHRcdFx0XHR2YXIgc291cmNlID0gYXJndW1lbnRzWyBpbmRleCBdO1xuXG5cdFx0XHRcdGlmICggc291cmNlICE9PSB1bmRlZmluZWQgJiYgc291cmNlICE9PSBudWxsICkge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIG5leHRLZXkgaW4gc291cmNlICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCggc291cmNlLCBuZXh0S2V5ICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0b3V0cHV0WyBuZXh0S2V5IF0gPSBzb3VyY2VbIG5leHRLZXkgXTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb3V0cHV0O1xuXG5cdFx0fTtcblxuXHR9ICkoKTtcblxufVxuXG4vKipcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9tcmRvb2IvZXZlbnRkaXNwYXRjaGVyLmpzL1xuICovXG5cbmZ1bmN0aW9uIEV2ZW50RGlzcGF0Y2hlcigpIHt9XG5cbk9iamVjdC5hc3NpZ24oIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUsIHtcblxuXHRhZGRFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAoIHR5cGUsIGxpc3RlbmVyICkge1xuXG5cdFx0aWYgKCB0aGlzLl9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCApIHRoaXMuX2xpc3RlbmVycyA9IHt9O1xuXG5cdFx0dmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcblxuXHRcdGlmICggbGlzdGVuZXJzWyB0eXBlIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0bGlzdGVuZXJzWyB0eXBlIF0gPSBbXTtcblxuXHRcdH1cblxuXHRcdGlmICggbGlzdGVuZXJzWyB0eXBlIF0uaW5kZXhPZiggbGlzdGVuZXIgKSA9PT0gLSAxICkge1xuXG5cdFx0XHRsaXN0ZW5lcnNbIHR5cGUgXS5wdXNoKCBsaXN0ZW5lciApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0aGFzRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gKCB0eXBlLCBsaXN0ZW5lciApIHtcblxuXHRcdGlmICggdGhpcy5fbGlzdGVuZXJzID09PSB1bmRlZmluZWQgKSByZXR1cm4gZmFsc2U7XG5cblx0XHR2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzO1xuXG5cdFx0cmV0dXJuIGxpc3RlbmVyc1sgdHlwZSBdICE9PSB1bmRlZmluZWQgJiYgbGlzdGVuZXJzWyB0eXBlIF0uaW5kZXhPZiggbGlzdGVuZXIgKSAhPT0gLSAxO1xuXG5cdH0sXG5cblx0cmVtb3ZlRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gKCB0eXBlLCBsaXN0ZW5lciApIHtcblxuXHRcdGlmICggdGhpcy5fbGlzdGVuZXJzID09PSB1bmRlZmluZWQgKSByZXR1cm47XG5cblx0XHR2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzO1xuXHRcdHZhciBsaXN0ZW5lckFycmF5ID0gbGlzdGVuZXJzWyB0eXBlIF07XG5cblx0XHRpZiAoIGxpc3RlbmVyQXJyYXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIGluZGV4ID0gbGlzdGVuZXJBcnJheS5pbmRleE9mKCBsaXN0ZW5lciApO1xuXG5cdFx0XHRpZiAoIGluZGV4ICE9PSAtIDEgKSB7XG5cblx0XHRcdFx0bGlzdGVuZXJBcnJheS5zcGxpY2UoIGluZGV4LCAxICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdGRpc3BhdGNoRXZlbnQ6IGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cblx0XHRpZiAoIHRoaXMuX2xpc3RlbmVycyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0dmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcblx0XHR2YXIgbGlzdGVuZXJBcnJheSA9IGxpc3RlbmVyc1sgZXZlbnQudHlwZSBdO1xuXG5cdFx0aWYgKCBsaXN0ZW5lckFycmF5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGV2ZW50LnRhcmdldCA9IHRoaXM7XG5cblx0XHRcdHZhciBhcnJheSA9IGxpc3RlbmVyQXJyYXkuc2xpY2UoIDAgKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRhcnJheVsgaSBdLmNhbGwoIHRoaXMsIGV2ZW50ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxudmFyIFJFVklTSU9OID0gJzkyJztcbnZhciBNT1VTRSA9IHsgTEVGVDogMCwgTUlERExFOiAxLCBSSUdIVDogMiB9O1xudmFyIEN1bGxGYWNlTm9uZSA9IDA7XG52YXIgQ3VsbEZhY2VCYWNrID0gMTtcbnZhciBDdWxsRmFjZUZyb250ID0gMjtcbnZhciBDdWxsRmFjZUZyb250QmFjayA9IDM7XG52YXIgRnJvbnRGYWNlRGlyZWN0aW9uQ1cgPSAwO1xudmFyIEZyb250RmFjZURpcmVjdGlvbkNDVyA9IDE7XG52YXIgQmFzaWNTaGFkb3dNYXAgPSAwO1xudmFyIFBDRlNoYWRvd01hcCA9IDE7XG52YXIgUENGU29mdFNoYWRvd01hcCA9IDI7XG52YXIgRnJvbnRTaWRlID0gMDtcbnZhciBCYWNrU2lkZSA9IDE7XG52YXIgRG91YmxlU2lkZSA9IDI7XG52YXIgRmxhdFNoYWRpbmcgPSAxO1xudmFyIFNtb290aFNoYWRpbmcgPSAyO1xudmFyIE5vQ29sb3JzID0gMDtcbnZhciBGYWNlQ29sb3JzID0gMTtcbnZhciBWZXJ0ZXhDb2xvcnMgPSAyO1xudmFyIE5vQmxlbmRpbmcgPSAwO1xudmFyIE5vcm1hbEJsZW5kaW5nID0gMTtcbnZhciBBZGRpdGl2ZUJsZW5kaW5nID0gMjtcbnZhciBTdWJ0cmFjdGl2ZUJsZW5kaW5nID0gMztcbnZhciBNdWx0aXBseUJsZW5kaW5nID0gNDtcbnZhciBDdXN0b21CbGVuZGluZyA9IDU7XG52YXIgQWRkRXF1YXRpb24gPSAxMDA7XG52YXIgU3VidHJhY3RFcXVhdGlvbiA9IDEwMTtcbnZhciBSZXZlcnNlU3VidHJhY3RFcXVhdGlvbiA9IDEwMjtcbnZhciBNaW5FcXVhdGlvbiA9IDEwMztcbnZhciBNYXhFcXVhdGlvbiA9IDEwNDtcbnZhciBaZXJvRmFjdG9yID0gMjAwO1xudmFyIE9uZUZhY3RvciA9IDIwMTtcbnZhciBTcmNDb2xvckZhY3RvciA9IDIwMjtcbnZhciBPbmVNaW51c1NyY0NvbG9yRmFjdG9yID0gMjAzO1xudmFyIFNyY0FscGhhRmFjdG9yID0gMjA0O1xudmFyIE9uZU1pbnVzU3JjQWxwaGFGYWN0b3IgPSAyMDU7XG52YXIgRHN0QWxwaGFGYWN0b3IgPSAyMDY7XG52YXIgT25lTWludXNEc3RBbHBoYUZhY3RvciA9IDIwNztcbnZhciBEc3RDb2xvckZhY3RvciA9IDIwODtcbnZhciBPbmVNaW51c0RzdENvbG9yRmFjdG9yID0gMjA5O1xudmFyIFNyY0FscGhhU2F0dXJhdGVGYWN0b3IgPSAyMTA7XG52YXIgTmV2ZXJEZXB0aCA9IDA7XG52YXIgQWx3YXlzRGVwdGggPSAxO1xudmFyIExlc3NEZXB0aCA9IDI7XG52YXIgTGVzc0VxdWFsRGVwdGggPSAzO1xudmFyIEVxdWFsRGVwdGggPSA0O1xudmFyIEdyZWF0ZXJFcXVhbERlcHRoID0gNTtcbnZhciBHcmVhdGVyRGVwdGggPSA2O1xudmFyIE5vdEVxdWFsRGVwdGggPSA3O1xudmFyIE11bHRpcGx5T3BlcmF0aW9uID0gMDtcbnZhciBNaXhPcGVyYXRpb24gPSAxO1xudmFyIEFkZE9wZXJhdGlvbiA9IDI7XG52YXIgTm9Ub25lTWFwcGluZyA9IDA7XG52YXIgTGluZWFyVG9uZU1hcHBpbmcgPSAxO1xudmFyIFJlaW5oYXJkVG9uZU1hcHBpbmcgPSAyO1xudmFyIFVuY2hhcnRlZDJUb25lTWFwcGluZyA9IDM7XG52YXIgQ2luZW9uVG9uZU1hcHBpbmcgPSA0O1xudmFyIFVWTWFwcGluZyA9IDMwMDtcbnZhciBDdWJlUmVmbGVjdGlvbk1hcHBpbmcgPSAzMDE7XG52YXIgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nID0gMzAyO1xudmFyIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nID0gMzAzO1xudmFyIEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nID0gMzA0O1xudmFyIFNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nID0gMzA1O1xudmFyIEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nID0gMzA2O1xudmFyIEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nID0gMzA3O1xudmFyIFJlcGVhdFdyYXBwaW5nID0gMTAwMDtcbnZhciBDbGFtcFRvRWRnZVdyYXBwaW5nID0gMTAwMTtcbnZhciBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nID0gMTAwMjtcbnZhciBOZWFyZXN0RmlsdGVyID0gMTAwMztcbnZhciBOZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlciA9IDEwMDQ7XG52YXIgTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciA9IDEwMDU7XG52YXIgTGluZWFyRmlsdGVyID0gMTAwNjtcbnZhciBMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyID0gMTAwNztcbnZhciBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXIgPSAxMDA4O1xudmFyIFVuc2lnbmVkQnl0ZVR5cGUgPSAxMDA5O1xudmFyIEJ5dGVUeXBlID0gMTAxMDtcbnZhciBTaG9ydFR5cGUgPSAxMDExO1xudmFyIFVuc2lnbmVkU2hvcnRUeXBlID0gMTAxMjtcbnZhciBJbnRUeXBlID0gMTAxMztcbnZhciBVbnNpZ25lZEludFR5cGUgPSAxMDE0O1xudmFyIEZsb2F0VHlwZSA9IDEwMTU7XG52YXIgSGFsZkZsb2F0VHlwZSA9IDEwMTY7XG52YXIgVW5zaWduZWRTaG9ydDQ0NDRUeXBlID0gMTAxNztcbnZhciBVbnNpZ25lZFNob3J0NTU1MVR5cGUgPSAxMDE4O1xudmFyIFVuc2lnbmVkU2hvcnQ1NjVUeXBlID0gMTAxOTtcbnZhciBVbnNpZ25lZEludDI0OFR5cGUgPSAxMDIwO1xudmFyIEFscGhhRm9ybWF0ID0gMTAyMTtcbnZhciBSR0JGb3JtYXQgPSAxMDIyO1xudmFyIFJHQkFGb3JtYXQgPSAxMDIzO1xudmFyIEx1bWluYW5jZUZvcm1hdCA9IDEwMjQ7XG52YXIgTHVtaW5hbmNlQWxwaGFGb3JtYXQgPSAxMDI1O1xudmFyIFJHQkVGb3JtYXQgPSBSR0JBRm9ybWF0O1xudmFyIERlcHRoRm9ybWF0ID0gMTAyNjtcbnZhciBEZXB0aFN0ZW5jaWxGb3JtYXQgPSAxMDI3O1xudmFyIFJHQl9TM1RDX0RYVDFfRm9ybWF0ID0gMzM3NzY7XG52YXIgUkdCQV9TM1RDX0RYVDFfRm9ybWF0ID0gMzM3Nzc7XG52YXIgUkdCQV9TM1RDX0RYVDNfRm9ybWF0ID0gMzM3Nzg7XG52YXIgUkdCQV9TM1RDX0RYVDVfRm9ybWF0ID0gMzM3Nzk7XG52YXIgUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQgPSAzNTg0MDtcbnZhciBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCA9IDM1ODQxO1xudmFyIFJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdCA9IDM1ODQyO1xudmFyIFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCA9IDM1ODQzO1xudmFyIFJHQl9FVEMxX0Zvcm1hdCA9IDM2MTk2O1xudmFyIFJHQkFfQVNUQ180eDRfRm9ybWF0ID0gMzc4MDg7XG52YXIgUkdCQV9BU1RDXzV4NF9Gb3JtYXQgPSAzNzgwOTtcbnZhciBSR0JBX0FTVENfNXg1X0Zvcm1hdCA9IDM3ODEwO1xudmFyIFJHQkFfQVNUQ182eDVfRm9ybWF0ID0gMzc4MTE7XG52YXIgUkdCQV9BU1RDXzZ4Nl9Gb3JtYXQgPSAzNzgxMjtcbnZhciBSR0JBX0FTVENfOHg1X0Zvcm1hdCA9IDM3ODEzO1xudmFyIFJHQkFfQVNUQ184eDZfRm9ybWF0ID0gMzc4MTQ7XG52YXIgUkdCQV9BU1RDXzh4OF9Gb3JtYXQgPSAzNzgxNTtcbnZhciBSR0JBX0FTVENfMTB4NV9Gb3JtYXQgPSAzNzgxNjtcbnZhciBSR0JBX0FTVENfMTB4Nl9Gb3JtYXQgPSAzNzgxNztcbnZhciBSR0JBX0FTVENfMTB4OF9Gb3JtYXQgPSAzNzgxODtcbnZhciBSR0JBX0FTVENfMTB4MTBfRm9ybWF0ID0gMzc4MTk7XG52YXIgUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdCA9IDM3ODIwO1xudmFyIFJHQkFfQVNUQ18xMngxMl9Gb3JtYXQgPSAzNzgyMTtcbnZhciBMb29wT25jZSA9IDIyMDA7XG52YXIgTG9vcFJlcGVhdCA9IDIyMDE7XG52YXIgTG9vcFBpbmdQb25nID0gMjIwMjtcbnZhciBJbnRlcnBvbGF0ZURpc2NyZXRlID0gMjMwMDtcbnZhciBJbnRlcnBvbGF0ZUxpbmVhciA9IDIzMDE7XG52YXIgSW50ZXJwb2xhdGVTbW9vdGggPSAyMzAyO1xudmFyIFplcm9DdXJ2YXR1cmVFbmRpbmcgPSAyNDAwO1xudmFyIFplcm9TbG9wZUVuZGluZyA9IDI0MDE7XG52YXIgV3JhcEFyb3VuZEVuZGluZyA9IDI0MDI7XG52YXIgVHJpYW5nbGVzRHJhd01vZGUgPSAwO1xudmFyIFRyaWFuZ2xlU3RyaXBEcmF3TW9kZSA9IDE7XG52YXIgVHJpYW5nbGVGYW5EcmF3TW9kZSA9IDI7XG52YXIgTGluZWFyRW5jb2RpbmcgPSAzMDAwO1xudmFyIHNSR0JFbmNvZGluZyA9IDMwMDE7XG52YXIgR2FtbWFFbmNvZGluZyA9IDMwMDc7XG52YXIgUkdCRUVuY29kaW5nID0gMzAwMjtcbnZhciBMb2dMdXZFbmNvZGluZyA9IDMwMDM7XG52YXIgUkdCTTdFbmNvZGluZyA9IDMwMDQ7XG52YXIgUkdCTTE2RW5jb2RpbmcgPSAzMDA1O1xudmFyIFJHQkRFbmNvZGluZyA9IDMwMDY7XG52YXIgQmFzaWNEZXB0aFBhY2tpbmcgPSAzMjAwO1xudmFyIFJHQkFEZXB0aFBhY2tpbmcgPSAzMjAxO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbnZhciBfTWF0aCA9IHtcblxuXHRERUcyUkFEOiBNYXRoLlBJIC8gMTgwLFxuXHRSQUQyREVHOiAxODAgLyBNYXRoLlBJLFxuXG5cdGdlbmVyYXRlVVVJRDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEwNTAzNC9ob3ctdG8tY3JlYXRlLWEtZ3VpZC11dWlkLWluLWphdmFzY3JpcHQvMjE5NjMxMzYjMjE5NjMxMzZcblxuXHRcdHZhciBsdXQgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDI1NjsgaSArKyApIHtcblxuXHRcdFx0bHV0WyBpIF0gPSAoIGkgPCAxNiA/ICcwJyA6ICcnICkgKyAoIGkgKS50b1N0cmluZyggMTYgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZW5lcmF0ZVVVSUQoKSB7XG5cblx0XHRcdHZhciBkMCA9IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZmZmIHwgMDtcblx0XHRcdHZhciBkMSA9IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZmZmIHwgMDtcblx0XHRcdHZhciBkMiA9IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZmZmIHwgMDtcblx0XHRcdHZhciBkMyA9IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZmZmIHwgMDtcblx0XHRcdHZhciB1dWlkID0gbHV0WyBkMCAmIDB4ZmYgXSArIGx1dFsgZDAgPj4gOCAmIDB4ZmYgXSArIGx1dFsgZDAgPj4gMTYgJiAweGZmIF0gKyBsdXRbIGQwID4+IDI0ICYgMHhmZiBdICsgJy0nICtcblx0XHRcdFx0bHV0WyBkMSAmIDB4ZmYgXSArIGx1dFsgZDEgPj4gOCAmIDB4ZmYgXSArICctJyArIGx1dFsgZDEgPj4gMTYgJiAweDBmIHwgMHg0MCBdICsgbHV0WyBkMSA+PiAyNCAmIDB4ZmYgXSArICctJyArXG5cdFx0XHRcdGx1dFsgZDIgJiAweDNmIHwgMHg4MCBdICsgbHV0WyBkMiA+PiA4ICYgMHhmZiBdICsgJy0nICsgbHV0WyBkMiA+PiAxNiAmIDB4ZmYgXSArIGx1dFsgZDIgPj4gMjQgJiAweGZmIF0gK1xuXHRcdFx0XHRsdXRbIGQzICYgMHhmZiBdICsgbHV0WyBkMyA+PiA4ICYgMHhmZiBdICsgbHV0WyBkMyA+PiAxNiAmIDB4ZmYgXSArIGx1dFsgZDMgPj4gMjQgJiAweGZmIF07XG5cblx0XHRcdC8vIC50b1VwcGVyQ2FzZSgpIGhlcmUgZmxhdHRlbnMgY29uY2F0ZW5hdGVkIHN0cmluZ3MgdG8gc2F2ZSBoZWFwIG1lbW9yeSBzcGFjZS5cblx0XHRcdHJldHVybiB1dWlkLnRvVXBwZXJDYXNlKCk7XG5cblx0XHR9O1xuXG5cdH0gKSgpLFxuXG5cdGNsYW1wOiBmdW5jdGlvbiAoIHZhbHVlLCBtaW4sIG1heCApIHtcblxuXHRcdHJldHVybiBNYXRoLm1heCggbWluLCBNYXRoLm1pbiggbWF4LCB2YWx1ZSApICk7XG5cblx0fSxcblxuXHQvLyBjb21wdXRlIGV1Y2xpZGlhbiBtb2R1bG8gb2YgbSAlIG5cblx0Ly8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTW9kdWxvX29wZXJhdGlvblxuXG5cdGV1Y2xpZGVhbk1vZHVsbzogZnVuY3Rpb24gKCBuLCBtICkge1xuXG5cdFx0cmV0dXJuICggKCBuICUgbSApICsgbSApICUgbTtcblxuXHR9LFxuXG5cdC8vIExpbmVhciBtYXBwaW5nIGZyb20gcmFuZ2UgPGExLCBhMj4gdG8gcmFuZ2UgPGIxLCBiMj5cblxuXHRtYXBMaW5lYXI6IGZ1bmN0aW9uICggeCwgYTEsIGEyLCBiMSwgYjIgKSB7XG5cblx0XHRyZXR1cm4gYjEgKyAoIHggLSBhMSApICogKCBiMiAtIGIxICkgLyAoIGEyIC0gYTEgKTtcblxuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xpbmVhcl9pbnRlcnBvbGF0aW9uXG5cblx0bGVycDogZnVuY3Rpb24gKCB4LCB5LCB0ICkge1xuXG5cdFx0cmV0dXJuICggMSAtIHQgKSAqIHggKyB0ICogeTtcblxuXHR9LFxuXG5cdC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU21vb3Roc3RlcFxuXG5cdHNtb290aHN0ZXA6IGZ1bmN0aW9uICggeCwgbWluLCBtYXggKSB7XG5cblx0XHRpZiAoIHggPD0gbWluICkgcmV0dXJuIDA7XG5cdFx0aWYgKCB4ID49IG1heCApIHJldHVybiAxO1xuXG5cdFx0eCA9ICggeCAtIG1pbiApIC8gKCBtYXggLSBtaW4gKTtcblxuXHRcdHJldHVybiB4ICogeCAqICggMyAtIDIgKiB4ICk7XG5cblx0fSxcblxuXHRzbW9vdGhlcnN0ZXA6IGZ1bmN0aW9uICggeCwgbWluLCBtYXggKSB7XG5cblx0XHRpZiAoIHggPD0gbWluICkgcmV0dXJuIDA7XG5cdFx0aWYgKCB4ID49IG1heCApIHJldHVybiAxO1xuXG5cdFx0eCA9ICggeCAtIG1pbiApIC8gKCBtYXggLSBtaW4gKTtcblxuXHRcdHJldHVybiB4ICogeCAqIHggKiAoIHggKiAoIHggKiA2IC0gMTUgKSArIDEwICk7XG5cblx0fSxcblxuXHQvLyBSYW5kb20gaW50ZWdlciBmcm9tIDxsb3csIGhpZ2g+IGludGVydmFsXG5cblx0cmFuZEludDogZnVuY3Rpb24gKCBsb3csIGhpZ2ggKSB7XG5cblx0XHRyZXR1cm4gbG93ICsgTWF0aC5mbG9vciggTWF0aC5yYW5kb20oKSAqICggaGlnaCAtIGxvdyArIDEgKSApO1xuXG5cdH0sXG5cblx0Ly8gUmFuZG9tIGZsb2F0IGZyb20gPGxvdywgaGlnaD4gaW50ZXJ2YWxcblxuXHRyYW5kRmxvYXQ6IGZ1bmN0aW9uICggbG93LCBoaWdoICkge1xuXG5cdFx0cmV0dXJuIGxvdyArIE1hdGgucmFuZG9tKCkgKiAoIGhpZ2ggLSBsb3cgKTtcblxuXHR9LFxuXG5cdC8vIFJhbmRvbSBmbG9hdCBmcm9tIDwtcmFuZ2UvMiwgcmFuZ2UvMj4gaW50ZXJ2YWxcblxuXHRyYW5kRmxvYXRTcHJlYWQ6IGZ1bmN0aW9uICggcmFuZ2UgKSB7XG5cblx0XHRyZXR1cm4gcmFuZ2UgKiAoIDAuNSAtIE1hdGgucmFuZG9tKCkgKTtcblxuXHR9LFxuXG5cdGRlZ1RvUmFkOiBmdW5jdGlvbiAoIGRlZ3JlZXMgKSB7XG5cblx0XHRyZXR1cm4gZGVncmVlcyAqIF9NYXRoLkRFRzJSQUQ7XG5cblx0fSxcblxuXHRyYWRUb0RlZzogZnVuY3Rpb24gKCByYWRpYW5zICkge1xuXG5cdFx0cmV0dXJuIHJhZGlhbnMgKiBfTWF0aC5SQUQyREVHO1xuXG5cdH0sXG5cblx0aXNQb3dlck9mVHdvOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0cmV0dXJuICggdmFsdWUgJiAoIHZhbHVlIC0gMSApICkgPT09IDAgJiYgdmFsdWUgIT09IDA7XG5cblx0fSxcblxuXHRjZWlsUG93ZXJPZlR3bzogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHJldHVybiBNYXRoLnBvdyggMiwgTWF0aC5jZWlsKCBNYXRoLmxvZyggdmFsdWUgKSAvIE1hdGguTE4yICkgKTtcblxuXHR9LFxuXG5cdGZsb29yUG93ZXJPZlR3bzogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHJldHVybiBNYXRoLnBvdyggMiwgTWF0aC5mbG9vciggTWF0aC5sb2coIHZhbHVlICkgLyBNYXRoLkxOMiApICk7XG5cblx0fVxuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIHBoaWxvZ2IgLyBodHRwOi8vYmxvZy50aGVqaXQub3JnL1xuICogQGF1dGhvciBlZ3JhZXRoZXIgLyBodHRwOi8vZWdyYWV0aGVyLmNvbS9cbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqL1xuXG5mdW5jdGlvbiBWZWN0b3IyKCB4LCB5ICkge1xuXG5cdHRoaXMueCA9IHggfHwgMDtcblx0dGhpcy55ID0geSB8fCAwO1xuXG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBWZWN0b3IyLnByb3RvdHlwZSwge1xuXG5cdFwid2lkdGhcIjoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLng7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLnggPSB2YWx1ZTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdFwiaGVpZ2h0XCI6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy55O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy55ID0gdmFsdWU7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFZlY3RvcjIucHJvdG90eXBlLCB7XG5cblx0aXNWZWN0b3IyOiB0cnVlLFxuXG5cdHNldDogZnVuY3Rpb24gKCB4LCB5ICkge1xuXG5cdFx0dGhpcy54ID0geDtcblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy54ID0gc2NhbGFyO1xuXHRcdHRoaXMueSA9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WDogZnVuY3Rpb24gKCB4ICkge1xuXG5cdFx0dGhpcy54ID0geDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WTogZnVuY3Rpb24gKCB5ICkge1xuXG5cdFx0dGhpcy55ID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4LCB2YWx1ZSApIHtcblxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xuXG5cdFx0XHRjYXNlIDA6IHRoaXMueCA9IHZhbHVlOyBicmVhaztcblx0XHRcdGNhc2UgMTogdGhpcy55ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogcmV0dXJuIHRoaXMueDtcblx0XHRcdGNhc2UgMTogcmV0dXJuIHRoaXMueTtcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLngsIHRoaXMueSApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gdi54O1xuXHRcdHRoaXMueSA9IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkOiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmFkZFZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCArPSB2Lng7XG5cdFx0dGhpcy55ICs9IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gcztcblx0XHR0aGlzLnkgKz0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54ICsgYi54O1xuXHRcdHRoaXMueSA9IGEueSArIGIueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkU2NhbGVkVmVjdG9yOiBmdW5jdGlvbiAoIHYsIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gdi54ICogcztcblx0XHR0aGlzLnkgKz0gdi55ICogcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViOiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogLnN1YigpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLnN1YlZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnN1YlZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCAtPSB2Lng7XG5cdFx0dGhpcy55IC09IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggLT0gcztcblx0XHR0aGlzLnkgLT0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54IC0gYi54O1xuXHRcdHRoaXMueSA9IGEueSAtIGIueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHk6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCAqPSB2Lng7XG5cdFx0dGhpcy55ICo9IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy54ICo9IHNjYWxhcjtcblx0XHR0aGlzLnkgKj0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXZpZGU6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCAvPSB2Lng7XG5cdFx0dGhpcy55IC89IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGl2aWRlU2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCAxIC8gc2NhbGFyICk7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDM6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55O1xuXHRcdHZhciBlID0gbS5lbGVtZW50cztcblxuXHRcdHRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyAzIF0gKiB5ICsgZVsgNiBdO1xuXHRcdHRoaXMueSA9IGVbIDEgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgNyBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtaW46IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWluKCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWluKCB0aGlzLnksIHYueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYXg6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCB0aGlzLnksIHYueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbGFtcDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHtcblxuXHRcdC8vIGFzc3VtZXMgbWluIDwgbWF4LCBjb21wb25lbnR3aXNlXG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggbWluLngsIE1hdGgubWluKCBtYXgueCwgdGhpcy54ICkgKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggbWluLnksIE1hdGgubWluKCBtYXgueSwgdGhpcy55ICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xhbXBTY2FsYXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBtaW4gPSBuZXcgVmVjdG9yMigpO1xuXHRcdHZhciBtYXggPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNsYW1wU2NhbGFyKCBtaW5WYWwsIG1heFZhbCApIHtcblxuXHRcdFx0bWluLnNldCggbWluVmFsLCBtaW5WYWwgKTtcblx0XHRcdG1heC5zZXQoIG1heFZhbCwgbWF4VmFsICk7XG5cblx0XHRcdHJldHVybiB0aGlzLmNsYW1wKCBtaW4sIG1heCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2xhbXBMZW5ndGg6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHR2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGgoKTtcblxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggbGVuZ3RoIHx8IDEgKS5tdWx0aXBseVNjYWxhciggTWF0aC5tYXgoIG1pbiwgTWF0aC5taW4oIG1heCwgbGVuZ3RoICkgKSApO1xuXG5cdH0sXG5cblx0Zmxvb3I6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjZWlsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLmNlaWwoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguY2VpbCggdGhpcy55ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLnJvdW5kKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLnJvdW5kKCB0aGlzLnkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm91bmRUb1plcm86IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9ICggdGhpcy54IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnggKSA6IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9ICggdGhpcy55IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnkgKSA6IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRuZWdhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IC0gdGhpcy54O1xuXHRcdHRoaXMueSA9IC0gdGhpcy55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkb3Q6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiB0aGlzLnggKiB2LnggKyB0aGlzLnkgKiB2Lnk7XG5cblx0fSxcblxuXHRsZW5ndGhTcTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueTtcblxuXHR9LFxuXG5cdGxlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICk7XG5cblx0fSxcblxuXHRtYW5oYXR0YW5MZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBNYXRoLmFicyggdGhpcy54ICkgKyBNYXRoLmFicyggdGhpcy55ICk7XG5cblx0fSxcblxuXHRub3JtYWxpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggdGhpcy5sZW5ndGgoKSB8fCAxICk7XG5cblx0fSxcblxuXHRhbmdsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gY29tcHV0ZXMgdGhlIGFuZ2xlIGluIHJhZGlhbnMgd2l0aCByZXNwZWN0IHRvIHRoZSBwb3NpdGl2ZSB4LWF4aXNcblxuXHRcdHZhciBhbmdsZSA9IE1hdGguYXRhbjIoIHRoaXMueSwgdGhpcy54ICk7XG5cblx0XHRpZiAoIGFuZ2xlIDwgMCApIGFuZ2xlICs9IDIgKiBNYXRoLlBJO1xuXG5cdFx0cmV0dXJuIGFuZ2xlO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUbzogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy5kaXN0YW5jZVRvU3F1YXJlZCggdiApICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvU3F1YXJlZDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dmFyIGR4ID0gdGhpcy54IC0gdi54LCBkeSA9IHRoaXMueSAtIHYueTtcblx0XHRyZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG5cblx0fSxcblxuXHRtYW5oYXR0YW5EaXN0YW5jZVRvOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCAtIHYueCApICsgTWF0aC5hYnMoIHRoaXMueSAtIHYueSApO1xuXG5cdH0sXG5cblx0c2V0TGVuZ3RoOiBmdW5jdGlvbiAoIGxlbmd0aCApIHtcblxuXHRcdHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCBsZW5ndGggKTtcblxuXHR9LFxuXG5cdGxlcnA6IGZ1bmN0aW9uICggdiwgYWxwaGEgKSB7XG5cblx0XHR0aGlzLnggKz0gKCB2LnggLSB0aGlzLnggKSAqIGFscGhhO1xuXHRcdHRoaXMueSArPSAoIHYueSAtIHRoaXMueSApICogYWxwaGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxlcnBWZWN0b3JzOiBmdW5jdGlvbiAoIHYxLCB2MiwgYWxwaGEgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2MiwgdjEgKS5tdWx0aXBseVNjYWxhciggYWxwaGEgKS5hZGQoIHYxICk7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiAoICggdi54ID09PSB0aGlzLnggKSAmJiAoIHYueSA9PT0gdGhpcy55ICkgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLnggPSBhcnJheVsgb2Zmc2V0IF07XG5cdFx0dGhpcy55ID0gYXJyYXlbIG9mZnNldCArIDEgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTtcblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMueDtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy55O1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0ZnJvbUJ1ZmZlckF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiBvZmZzZXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7XG5cdFx0dGhpcy55ID0gYXR0cmlidXRlLmdldFkoIGluZGV4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdGF0ZUFyb3VuZDogZnVuY3Rpb24gKCBjZW50ZXIsIGFuZ2xlICkge1xuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggYW5nbGUgKSwgcyA9IE1hdGguc2luKCBhbmdsZSApO1xuXG5cdFx0dmFyIHggPSB0aGlzLnggLSBjZW50ZXIueDtcblx0XHR2YXIgeSA9IHRoaXMueSAtIGNlbnRlci55O1xuXG5cdFx0dGhpcy54ID0geCAqIGMgLSB5ICogcyArIGNlbnRlci54O1xuXHRcdHRoaXMueSA9IHggKiBzICsgeSAqIGMgKyBjZW50ZXIueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIHN1cGVyZWdnYmVydCAvIGh0dHA6Ly93d3cucGF1bGJydW50LmNvLnVrL1xuICogQGF1dGhvciBwaGlsb2diIC8gaHR0cDovL2Jsb2cudGhlaml0Lm9yZy9cbiAqIEBhdXRob3Igam9yZGlfcm9zIC8gaHR0cDovL3BsYXR0c29mdC5jb21cbiAqIEBhdXRob3IgRDFwbG8xZCAvIGh0dHA6Ly9naXRodWIuY29tL0QxcGxvMWRcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciB0aW1rbmlwIC8gaHR0cDovL3d3dy5mbG9vcnBsYW5uZXIuY29tL1xuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gTWF0cml4NCgpIHtcblxuXHR0aGlzLmVsZW1lbnRzID0gW1xuXG5cdFx0MSwgMCwgMCwgMCxcblx0XHQwLCAxLCAwLCAwLFxuXHRcdDAsIDAsIDEsIDAsXG5cdFx0MCwgMCwgMCwgMVxuXG5cdF07XG5cblx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID4gMCApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiB0aGUgY29uc3RydWN0b3Igbm8gbG9uZ2VyIHJlYWRzIGFyZ3VtZW50cy4gdXNlIC5zZXQoKSBpbnN0ZWFkLicgKTtcblxuXHR9XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggTWF0cml4NC5wcm90b3R5cGUsIHtcblxuXHRpc01hdHJpeDQ6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIG4xMSwgbjEyLCBuMTMsIG4xNCwgbjIxLCBuMjIsIG4yMywgbjI0LCBuMzEsIG4zMiwgbjMzLCBuMzQsIG40MSwgbjQyLCBuNDMsIG40NCApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdID0gbjExOyB0ZVsgNCBdID0gbjEyOyB0ZVsgOCBdID0gbjEzOyB0ZVsgMTIgXSA9IG4xNDtcblx0XHR0ZVsgMSBdID0gbjIxOyB0ZVsgNSBdID0gbjIyOyB0ZVsgOSBdID0gbjIzOyB0ZVsgMTMgXSA9IG4yNDtcblx0XHR0ZVsgMiBdID0gbjMxOyB0ZVsgNiBdID0gbjMyOyB0ZVsgMTAgXSA9IG4zMzsgdGVbIDE0IF0gPSBuMzQ7XG5cdFx0dGVbIDMgXSA9IG40MTsgdGVbIDcgXSA9IG40MjsgdGVbIDExIF0gPSBuNDM7IHRlWyAxNSBdID0gbjQ0O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRpZGVudGl0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdDEsIDAsIDAsIDAsXG5cdFx0XHQwLCAxLCAwLCAwLFxuXHRcdFx0MCwgMCwgMSwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IE1hdHJpeDQoKS5mcm9tQXJyYXkoIHRoaXMuZWxlbWVudHMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0dmFyIG1lID0gbS5lbGVtZW50cztcblxuXHRcdHRlWyAwIF0gPSBtZVsgMCBdOyB0ZVsgMSBdID0gbWVbIDEgXTsgdGVbIDIgXSA9IG1lWyAyIF07IHRlWyAzIF0gPSBtZVsgMyBdO1xuXHRcdHRlWyA0IF0gPSBtZVsgNCBdOyB0ZVsgNSBdID0gbWVbIDUgXTsgdGVbIDYgXSA9IG1lWyA2IF07IHRlWyA3IF0gPSBtZVsgNyBdO1xuXHRcdHRlWyA4IF0gPSBtZVsgOCBdOyB0ZVsgOSBdID0gbWVbIDkgXTsgdGVbIDEwIF0gPSBtZVsgMTAgXTsgdGVbIDExIF0gPSBtZVsgMTEgXTtcblx0XHR0ZVsgMTIgXSA9IG1lWyAxMiBdOyB0ZVsgMTMgXSA9IG1lWyAxMyBdOyB0ZVsgMTQgXSA9IG1lWyAxNCBdOyB0ZVsgMTUgXSA9IG1lWyAxNSBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5UG9zaXRpb246IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHMsIG1lID0gbS5lbGVtZW50cztcblxuXHRcdHRlWyAxMiBdID0gbWVbIDEyIF07XG5cdFx0dGVbIDEzIF0gPSBtZVsgMTMgXTtcblx0XHR0ZVsgMTQgXSA9IG1lWyAxNCBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRleHRyYWN0QmFzaXM6IGZ1bmN0aW9uICggeEF4aXMsIHlBeGlzLCB6QXhpcyApIHtcblxuXHRcdHhBeGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIHRoaXMsIDAgKTtcblx0XHR5QXhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAxICk7XG5cdFx0ekF4aXMuc2V0RnJvbU1hdHJpeENvbHVtbiggdGhpcywgMiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlQmFzaXM6IGZ1bmN0aW9uICggeEF4aXMsIHlBeGlzLCB6QXhpcyApIHtcblxuXHRcdHRoaXMuc2V0KFxuXHRcdFx0eEF4aXMueCwgeUF4aXMueCwgekF4aXMueCwgMCxcblx0XHRcdHhBeGlzLnksIHlBeGlzLnksIHpBeGlzLnksIDAsXG5cdFx0XHR4QXhpcy56LCB5QXhpcy56LCB6QXhpcy56LCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGV4dHJhY3RSb3RhdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBleHRyYWN0Um90YXRpb24oIG0gKSB7XG5cblx0XHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0XHR2YXIgbWUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0XHR2YXIgc2NhbGVYID0gMSAvIHYxLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDAgKS5sZW5ndGgoKTtcblx0XHRcdHZhciBzY2FsZVkgPSAxIC8gdjEuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMSApLmxlbmd0aCgpO1xuXHRcdFx0dmFyIHNjYWxlWiA9IDEgLyB2MS5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAyICkubGVuZ3RoKCk7XG5cblx0XHRcdHRlWyAwIF0gPSBtZVsgMCBdICogc2NhbGVYO1xuXHRcdFx0dGVbIDEgXSA9IG1lWyAxIF0gKiBzY2FsZVg7XG5cdFx0XHR0ZVsgMiBdID0gbWVbIDIgXSAqIHNjYWxlWDtcblxuXHRcdFx0dGVbIDQgXSA9IG1lWyA0IF0gKiBzY2FsZVk7XG5cdFx0XHR0ZVsgNSBdID0gbWVbIDUgXSAqIHNjYWxlWTtcblx0XHRcdHRlWyA2IF0gPSBtZVsgNiBdICogc2NhbGVZO1xuXG5cdFx0XHR0ZVsgOCBdID0gbWVbIDggXSAqIHNjYWxlWjtcblx0XHRcdHRlWyA5IF0gPSBtZVsgOSBdICogc2NhbGVaO1xuXHRcdFx0dGVbIDEwIF0gPSBtZVsgMTAgXSAqIHNjYWxlWjtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRtYWtlUm90YXRpb25Gcm9tRXVsZXI6IGZ1bmN0aW9uICggZXVsZXIgKSB7XG5cblx0XHRpZiAoICEgKCBldWxlciAmJiBldWxlci5pc0V1bGVyICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAubWFrZVJvdGF0aW9uRnJvbUV1bGVyKCkgbm93IGV4cGVjdHMgYSBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLicgKTtcblxuXHRcdH1cblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgeCA9IGV1bGVyLngsIHkgPSBldWxlci55LCB6ID0gZXVsZXIuejtcblx0XHR2YXIgYSA9IE1hdGguY29zKCB4ICksIGIgPSBNYXRoLnNpbiggeCApO1xuXHRcdHZhciBjID0gTWF0aC5jb3MoIHkgKSwgZCA9IE1hdGguc2luKCB5ICk7XG5cdFx0dmFyIGUgPSBNYXRoLmNvcyggeiApLCBmID0gTWF0aC5zaW4oIHogKTtcblxuXHRcdGlmICggZXVsZXIub3JkZXIgPT09ICdYWVonICkge1xuXG5cdFx0XHR2YXIgYWUgPSBhICogZSwgYWYgPSBhICogZiwgYmUgPSBiICogZSwgYmYgPSBiICogZjtcblxuXHRcdFx0dGVbIDAgXSA9IGMgKiBlO1xuXHRcdFx0dGVbIDQgXSA9IC0gYyAqIGY7XG5cdFx0XHR0ZVsgOCBdID0gZDtcblxuXHRcdFx0dGVbIDEgXSA9IGFmICsgYmUgKiBkO1xuXHRcdFx0dGVbIDUgXSA9IGFlIC0gYmYgKiBkO1xuXHRcdFx0dGVbIDkgXSA9IC0gYiAqIGM7XG5cblx0XHRcdHRlWyAyIF0gPSBiZiAtIGFlICogZDtcblx0XHRcdHRlWyA2IF0gPSBiZSArIGFmICogZDtcblx0XHRcdHRlWyAxMCBdID0gYSAqIGM7XG5cblx0XHR9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1lYWicgKSB7XG5cblx0XHRcdHZhciBjZSA9IGMgKiBlLCBjZiA9IGMgKiBmLCBkZSA9IGQgKiBlLCBkZiA9IGQgKiBmO1xuXG5cdFx0XHR0ZVsgMCBdID0gY2UgKyBkZiAqIGI7XG5cdFx0XHR0ZVsgNCBdID0gZGUgKiBiIC0gY2Y7XG5cdFx0XHR0ZVsgOCBdID0gYSAqIGQ7XG5cblx0XHRcdHRlWyAxIF0gPSBhICogZjtcblx0XHRcdHRlWyA1IF0gPSBhICogZTtcblx0XHRcdHRlWyA5IF0gPSAtIGI7XG5cblx0XHRcdHRlWyAyIF0gPSBjZiAqIGIgLSBkZTtcblx0XHRcdHRlWyA2IF0gPSBkZiArIGNlICogYjtcblx0XHRcdHRlWyAxMCBdID0gYSAqIGM7XG5cblx0XHR9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1pYWScgKSB7XG5cblx0XHRcdHZhciBjZSA9IGMgKiBlLCBjZiA9IGMgKiBmLCBkZSA9IGQgKiBlLCBkZiA9IGQgKiBmO1xuXG5cdFx0XHR0ZVsgMCBdID0gY2UgLSBkZiAqIGI7XG5cdFx0XHR0ZVsgNCBdID0gLSBhICogZjtcblx0XHRcdHRlWyA4IF0gPSBkZSArIGNmICogYjtcblxuXHRcdFx0dGVbIDEgXSA9IGNmICsgZGUgKiBiO1xuXHRcdFx0dGVbIDUgXSA9IGEgKiBlO1xuXHRcdFx0dGVbIDkgXSA9IGRmIC0gY2UgKiBiO1xuXG5cdFx0XHR0ZVsgMiBdID0gLSBhICogZDtcblx0XHRcdHRlWyA2IF0gPSBiO1xuXHRcdFx0dGVbIDEwIF0gPSBhICogYztcblxuXHRcdH0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWllYJyApIHtcblxuXHRcdFx0dmFyIGFlID0gYSAqIGUsIGFmID0gYSAqIGYsIGJlID0gYiAqIGUsIGJmID0gYiAqIGY7XG5cblx0XHRcdHRlWyAwIF0gPSBjICogZTtcblx0XHRcdHRlWyA0IF0gPSBiZSAqIGQgLSBhZjtcblx0XHRcdHRlWyA4IF0gPSBhZSAqIGQgKyBiZjtcblxuXHRcdFx0dGVbIDEgXSA9IGMgKiBmO1xuXHRcdFx0dGVbIDUgXSA9IGJmICogZCArIGFlO1xuXHRcdFx0dGVbIDkgXSA9IGFmICogZCAtIGJlO1xuXG5cdFx0XHR0ZVsgMiBdID0gLSBkO1xuXHRcdFx0dGVbIDYgXSA9IGIgKiBjO1xuXHRcdFx0dGVbIDEwIF0gPSBhICogYztcblxuXHRcdH0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWVpYJyApIHtcblxuXHRcdFx0dmFyIGFjID0gYSAqIGMsIGFkID0gYSAqIGQsIGJjID0gYiAqIGMsIGJkID0gYiAqIGQ7XG5cblx0XHRcdHRlWyAwIF0gPSBjICogZTtcblx0XHRcdHRlWyA0IF0gPSBiZCAtIGFjICogZjtcblx0XHRcdHRlWyA4IF0gPSBiYyAqIGYgKyBhZDtcblxuXHRcdFx0dGVbIDEgXSA9IGY7XG5cdFx0XHR0ZVsgNSBdID0gYSAqIGU7XG5cdFx0XHR0ZVsgOSBdID0gLSBiICogZTtcblxuXHRcdFx0dGVbIDIgXSA9IC0gZCAqIGU7XG5cdFx0XHR0ZVsgNiBdID0gYWQgKiBmICsgYmM7XG5cdFx0XHR0ZVsgMTAgXSA9IGFjIC0gYmQgKiBmO1xuXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdYWlknICkge1xuXG5cdFx0XHR2YXIgYWMgPSBhICogYywgYWQgPSBhICogZCwgYmMgPSBiICogYywgYmQgPSBiICogZDtcblxuXHRcdFx0dGVbIDAgXSA9IGMgKiBlO1xuXHRcdFx0dGVbIDQgXSA9IC0gZjtcblx0XHRcdHRlWyA4IF0gPSBkICogZTtcblxuXHRcdFx0dGVbIDEgXSA9IGFjICogZiArIGJkO1xuXHRcdFx0dGVbIDUgXSA9IGEgKiBlO1xuXHRcdFx0dGVbIDkgXSA9IGFkICogZiAtIGJjO1xuXG5cdFx0XHR0ZVsgMiBdID0gYmMgKiBmIC0gYWQ7XG5cdFx0XHR0ZVsgNiBdID0gYiAqIGU7XG5cdFx0XHR0ZVsgMTAgXSA9IGJkICogZiArIGFjO1xuXG5cdFx0fVxuXG5cdFx0Ly8gbGFzdCBjb2x1bW5cblx0XHR0ZVsgMyBdID0gMDtcblx0XHR0ZVsgNyBdID0gMDtcblx0XHR0ZVsgMTEgXSA9IDA7XG5cblx0XHQvLyBib3R0b20gcm93XG5cdFx0dGVbIDEyIF0gPSAwO1xuXHRcdHRlWyAxMyBdID0gMDtcblx0XHR0ZVsgMTQgXSA9IDA7XG5cdFx0dGVbIDE1IF0gPSAxO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHZhciB4ID0gcS5feCwgeSA9IHEuX3ksIHogPSBxLl96LCB3ID0gcS5fdztcblx0XHR2YXIgeDIgPSB4ICsgeCwgeTIgPSB5ICsgeSwgejIgPSB6ICsgejtcblx0XHR2YXIgeHggPSB4ICogeDIsIHh5ID0geCAqIHkyLCB4eiA9IHggKiB6Mjtcblx0XHR2YXIgeXkgPSB5ICogeTIsIHl6ID0geSAqIHoyLCB6eiA9IHogKiB6Mjtcblx0XHR2YXIgd3ggPSB3ICogeDIsIHd5ID0gdyAqIHkyLCB3eiA9IHcgKiB6MjtcblxuXHRcdHRlWyAwIF0gPSAxIC0gKCB5eSArIHp6ICk7XG5cdFx0dGVbIDQgXSA9IHh5IC0gd3o7XG5cdFx0dGVbIDggXSA9IHh6ICsgd3k7XG5cblx0XHR0ZVsgMSBdID0geHkgKyB3ejtcblx0XHR0ZVsgNSBdID0gMSAtICggeHggKyB6eiApO1xuXHRcdHRlWyA5IF0gPSB5eiAtIHd4O1xuXG5cdFx0dGVbIDIgXSA9IHh6IC0gd3k7XG5cdFx0dGVbIDYgXSA9IHl6ICsgd3g7XG5cdFx0dGVbIDEwIF0gPSAxIC0gKCB4eCArIHl5ICk7XG5cblx0XHQvLyBsYXN0IGNvbHVtblxuXHRcdHRlWyAzIF0gPSAwO1xuXHRcdHRlWyA3IF0gPSAwO1xuXHRcdHRlWyAxMSBdID0gMDtcblxuXHRcdC8vIGJvdHRvbSByb3dcblx0XHR0ZVsgMTIgXSA9IDA7XG5cdFx0dGVbIDEzIF0gPSAwO1xuXHRcdHRlWyAxNCBdID0gMDtcblx0XHR0ZVsgMTUgXSA9IDE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxvb2tBdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHggPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB5ID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgeiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gbG9va0F0KCBleWUsIHRhcmdldCwgdXAgKSB7XG5cblx0XHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRcdHouc3ViVmVjdG9ycyggZXllLCB0YXJnZXQgKTtcblxuXHRcdFx0aWYgKCB6Lmxlbmd0aFNxKCkgPT09IDAgKSB7XG5cblx0XHRcdFx0Ly8gZXllIGFuZCB0YXJnZXQgYXJlIGluIHRoZSBzYW1lIHBvc2l0aW9uXG5cblx0XHRcdFx0ei56ID0gMTtcblxuXHRcdFx0fVxuXG5cdFx0XHR6Lm5vcm1hbGl6ZSgpO1xuXHRcdFx0eC5jcm9zc1ZlY3RvcnMoIHVwLCB6ICk7XG5cblx0XHRcdGlmICggeC5sZW5ndGhTcSgpID09PSAwICkge1xuXG5cdFx0XHRcdC8vIHVwIGFuZCB6IGFyZSBwYXJhbGxlbFxuXG5cdFx0XHRcdGlmICggTWF0aC5hYnMoIHVwLnogKSA9PT0gMSApIHtcblxuXHRcdFx0XHRcdHoueCArPSAwLjAwMDE7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHoueiArPSAwLjAwMDE7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHoubm9ybWFsaXplKCk7XG5cdFx0XHRcdHguY3Jvc3NWZWN0b3JzKCB1cCwgeiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHgubm9ybWFsaXplKCk7XG5cdFx0XHR5LmNyb3NzVmVjdG9ycyggeiwgeCApO1xuXG5cdFx0XHR0ZVsgMCBdID0geC54OyB0ZVsgNCBdID0geS54OyB0ZVsgOCBdID0gei54O1xuXHRcdFx0dGVbIDEgXSA9IHgueTsgdGVbIDUgXSA9IHkueTsgdGVbIDkgXSA9IHoueTtcblx0XHRcdHRlWyAyIF0gPSB4Lno7IHRlWyA2IF0gPSB5Lno7IHRlWyAxMCBdID0gei56O1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdG11bHRpcGx5OiBmdW5jdGlvbiAoIG0sIG4gKSB7XG5cblx0XHRpZiAoIG4gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlNYXRyaWNlcyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggbSwgbiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggdGhpcywgbSApO1xuXG5cdH0sXG5cblx0cHJlbXVsdGlwbHk6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoIG0sIHRoaXMgKTtcblxuXHR9LFxuXG5cdG11bHRpcGx5TWF0cmljZXM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdHZhciBhZSA9IGEuZWxlbWVudHM7XG5cdFx0dmFyIGJlID0gYi5lbGVtZW50cztcblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dmFyIGExMSA9IGFlWyAwIF0sIGExMiA9IGFlWyA0IF0sIGExMyA9IGFlWyA4IF0sIGExNCA9IGFlWyAxMiBdO1xuXHRcdHZhciBhMjEgPSBhZVsgMSBdLCBhMjIgPSBhZVsgNSBdLCBhMjMgPSBhZVsgOSBdLCBhMjQgPSBhZVsgMTMgXTtcblx0XHR2YXIgYTMxID0gYWVbIDIgXSwgYTMyID0gYWVbIDYgXSwgYTMzID0gYWVbIDEwIF0sIGEzNCA9IGFlWyAxNCBdO1xuXHRcdHZhciBhNDEgPSBhZVsgMyBdLCBhNDIgPSBhZVsgNyBdLCBhNDMgPSBhZVsgMTEgXSwgYTQ0ID0gYWVbIDE1IF07XG5cblx0XHR2YXIgYjExID0gYmVbIDAgXSwgYjEyID0gYmVbIDQgXSwgYjEzID0gYmVbIDggXSwgYjE0ID0gYmVbIDEyIF07XG5cdFx0dmFyIGIyMSA9IGJlWyAxIF0sIGIyMiA9IGJlWyA1IF0sIGIyMyA9IGJlWyA5IF0sIGIyNCA9IGJlWyAxMyBdO1xuXHRcdHZhciBiMzEgPSBiZVsgMiBdLCBiMzIgPSBiZVsgNiBdLCBiMzMgPSBiZVsgMTAgXSwgYjM0ID0gYmVbIDE0IF07XG5cdFx0dmFyIGI0MSA9IGJlWyAzIF0sIGI0MiA9IGJlWyA3IF0sIGI0MyA9IGJlWyAxMSBdLCBiNDQgPSBiZVsgMTUgXTtcblxuXHRcdHRlWyAwIF0gPSBhMTEgKiBiMTEgKyBhMTIgKiBiMjEgKyBhMTMgKiBiMzEgKyBhMTQgKiBiNDE7XG5cdFx0dGVbIDQgXSA9IGExMSAqIGIxMiArIGExMiAqIGIyMiArIGExMyAqIGIzMiArIGExNCAqIGI0Mjtcblx0XHR0ZVsgOCBdID0gYTExICogYjEzICsgYTEyICogYjIzICsgYTEzICogYjMzICsgYTE0ICogYjQzO1xuXHRcdHRlWyAxMiBdID0gYTExICogYjE0ICsgYTEyICogYjI0ICsgYTEzICogYjM0ICsgYTE0ICogYjQ0O1xuXG5cdFx0dGVbIDEgXSA9IGEyMSAqIGIxMSArIGEyMiAqIGIyMSArIGEyMyAqIGIzMSArIGEyNCAqIGI0MTtcblx0XHR0ZVsgNSBdID0gYTIxICogYjEyICsgYTIyICogYjIyICsgYTIzICogYjMyICsgYTI0ICogYjQyO1xuXHRcdHRlWyA5IF0gPSBhMjEgKiBiMTMgKyBhMjIgKiBiMjMgKyBhMjMgKiBiMzMgKyBhMjQgKiBiNDM7XG5cdFx0dGVbIDEzIF0gPSBhMjEgKiBiMTQgKyBhMjIgKiBiMjQgKyBhMjMgKiBiMzQgKyBhMjQgKiBiNDQ7XG5cblx0XHR0ZVsgMiBdID0gYTMxICogYjExICsgYTMyICogYjIxICsgYTMzICogYjMxICsgYTM0ICogYjQxO1xuXHRcdHRlWyA2IF0gPSBhMzEgKiBiMTIgKyBhMzIgKiBiMjIgKyBhMzMgKiBiMzIgKyBhMzQgKiBiNDI7XG5cdFx0dGVbIDEwIF0gPSBhMzEgKiBiMTMgKyBhMzIgKiBiMjMgKyBhMzMgKiBiMzMgKyBhMzQgKiBiNDM7XG5cdFx0dGVbIDE0IF0gPSBhMzEgKiBiMTQgKyBhMzIgKiBiMjQgKyBhMzMgKiBiMzQgKyBhMzQgKiBiNDQ7XG5cblx0XHR0ZVsgMyBdID0gYTQxICogYjExICsgYTQyICogYjIxICsgYTQzICogYjMxICsgYTQ0ICogYjQxO1xuXHRcdHRlWyA3IF0gPSBhNDEgKiBiMTIgKyBhNDIgKiBiMjIgKyBhNDMgKiBiMzIgKyBhNDQgKiBiNDI7XG5cdFx0dGVbIDExIF0gPSBhNDEgKiBiMTMgKyBhNDIgKiBiMjMgKyBhNDMgKiBiMzMgKyBhNDQgKiBiNDM7XG5cdFx0dGVbIDE1IF0gPSBhNDEgKiBiMTQgKyBhNDIgKiBiMjQgKyBhNDMgKiBiMzQgKyBhNDQgKiBiNDQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5U2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSAqPSBzOyB0ZVsgNCBdICo9IHM7IHRlWyA4IF0gKj0gczsgdGVbIDEyIF0gKj0gcztcblx0XHR0ZVsgMSBdICo9IHM7IHRlWyA1IF0gKj0gczsgdGVbIDkgXSAqPSBzOyB0ZVsgMTMgXSAqPSBzO1xuXHRcdHRlWyAyIF0gKj0gczsgdGVbIDYgXSAqPSBzOyB0ZVsgMTAgXSAqPSBzOyB0ZVsgMTQgXSAqPSBzO1xuXHRcdHRlWyAzIF0gKj0gczsgdGVbIDcgXSAqPSBzOyB0ZVsgMTEgXSAqPSBzOyB0ZVsgMTUgXSAqPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcHBseVRvQnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gYXR0cmlidXRlLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2MS54ID0gYXR0cmlidXRlLmdldFgoIGkgKTtcblx0XHRcdFx0djEueSA9IGF0dHJpYnV0ZS5nZXRZKCBpICk7XG5cdFx0XHRcdHYxLnogPSBhdHRyaWJ1dGUuZ2V0WiggaSApO1xuXG5cdFx0XHRcdHYxLmFwcGx5TWF0cml4NCggdGhpcyApO1xuXG5cdFx0XHRcdGF0dHJpYnV0ZS5zZXRYWVooIGksIHYxLngsIHYxLnksIHYxLnogKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gYXR0cmlidXRlO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0ZGV0ZXJtaW5hbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgbjExID0gdGVbIDAgXSwgbjEyID0gdGVbIDQgXSwgbjEzID0gdGVbIDggXSwgbjE0ID0gdGVbIDEyIF07XG5cdFx0dmFyIG4yMSA9IHRlWyAxIF0sIG4yMiA9IHRlWyA1IF0sIG4yMyA9IHRlWyA5IF0sIG4yNCA9IHRlWyAxMyBdO1xuXHRcdHZhciBuMzEgPSB0ZVsgMiBdLCBuMzIgPSB0ZVsgNiBdLCBuMzMgPSB0ZVsgMTAgXSwgbjM0ID0gdGVbIDE0IF07XG5cdFx0dmFyIG40MSA9IHRlWyAzIF0sIG40MiA9IHRlWyA3IF0sIG40MyA9IHRlWyAxMSBdLCBuNDQgPSB0ZVsgMTUgXTtcblxuXHRcdC8vVE9ETzogbWFrZSB0aGlzIG1vcmUgZWZmaWNpZW50XG5cdFx0Ly8oIGJhc2VkIG9uIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvbWF0cml4L2Z1bmN0aW9ucy9pbnZlcnNlL2ZvdXJEL2luZGV4Lmh0bSApXG5cblx0XHRyZXR1cm4gKFxuXHRcdFx0bjQxICogKFxuXHRcdFx0XHQrIG4xNCAqIG4yMyAqIG4zMlxuXHRcdFx0XHQgLSBuMTMgKiBuMjQgKiBuMzJcblx0XHRcdFx0IC0gbjE0ICogbjIyICogbjMzXG5cdFx0XHRcdCArIG4xMiAqIG4yNCAqIG4zM1xuXHRcdFx0XHQgKyBuMTMgKiBuMjIgKiBuMzRcblx0XHRcdFx0IC0gbjEyICogbjIzICogbjM0XG5cdFx0XHQpICtcblx0XHRcdG40MiAqIChcblx0XHRcdFx0KyBuMTEgKiBuMjMgKiBuMzRcblx0XHRcdFx0IC0gbjExICogbjI0ICogbjMzXG5cdFx0XHRcdCArIG4xNCAqIG4yMSAqIG4zM1xuXHRcdFx0XHQgLSBuMTMgKiBuMjEgKiBuMzRcblx0XHRcdFx0ICsgbjEzICogbjI0ICogbjMxXG5cdFx0XHRcdCAtIG4xNCAqIG4yMyAqIG4zMVxuXHRcdFx0KSArXG5cdFx0XHRuNDMgKiAoXG5cdFx0XHRcdCsgbjExICogbjI0ICogbjMyXG5cdFx0XHRcdCAtIG4xMSAqIG4yMiAqIG4zNFxuXHRcdFx0XHQgLSBuMTQgKiBuMjEgKiBuMzJcblx0XHRcdFx0ICsgbjEyICogbjIxICogbjM0XG5cdFx0XHRcdCArIG4xNCAqIG4yMiAqIG4zMVxuXHRcdFx0XHQgLSBuMTIgKiBuMjQgKiBuMzFcblx0XHRcdCkgK1xuXHRcdFx0bjQ0ICogKFxuXHRcdFx0XHQtIG4xMyAqIG4yMiAqIG4zMVxuXHRcdFx0XHQgLSBuMTEgKiBuMjMgKiBuMzJcblx0XHRcdFx0ICsgbjExICogbjIyICogbjMzXG5cdFx0XHRcdCArIG4xMyAqIG4yMSAqIG4zMlxuXHRcdFx0XHQgLSBuMTIgKiBuMjEgKiBuMzNcblx0XHRcdFx0ICsgbjEyICogbjIzICogbjMxXG5cdFx0XHQpXG5cblx0XHQpO1xuXG5cdH0sXG5cblx0dHJhbnNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciB0bXA7XG5cblx0XHR0bXAgPSB0ZVsgMSBdOyB0ZVsgMSBdID0gdGVbIDQgXTsgdGVbIDQgXSA9IHRtcDtcblx0XHR0bXAgPSB0ZVsgMiBdOyB0ZVsgMiBdID0gdGVbIDggXTsgdGVbIDggXSA9IHRtcDtcblx0XHR0bXAgPSB0ZVsgNiBdOyB0ZVsgNiBdID0gdGVbIDkgXTsgdGVbIDkgXSA9IHRtcDtcblxuXHRcdHRtcCA9IHRlWyAzIF07IHRlWyAzIF0gPSB0ZVsgMTIgXTsgdGVbIDEyIF0gPSB0bXA7XG5cdFx0dG1wID0gdGVbIDcgXTsgdGVbIDcgXSA9IHRlWyAxMyBdOyB0ZVsgMTMgXSA9IHRtcDtcblx0XHR0bXAgPSB0ZVsgMTEgXTsgdGVbIDExIF0gPSB0ZVsgMTQgXTsgdGVbIDE0IF0gPSB0bXA7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFBvc2l0aW9uOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDEyIF0gPSB2Lng7XG5cdFx0dGVbIDEzIF0gPSB2Lnk7XG5cdFx0dGVbIDE0IF0gPSB2Lno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldEludmVyc2U6IGZ1bmN0aW9uICggbSwgdGhyb3dPbkRlZ2VuZXJhdGUgKSB7XG5cblx0XHQvLyBiYXNlZCBvbiBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL21hdHJpeC9mdW5jdGlvbnMvaW52ZXJzZS9mb3VyRC9pbmRleC5odG1cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzLFxuXHRcdFx0bWUgPSBtLmVsZW1lbnRzLFxuXG5cdFx0XHRuMTEgPSBtZVsgMCBdLCBuMjEgPSBtZVsgMSBdLCBuMzEgPSBtZVsgMiBdLCBuNDEgPSBtZVsgMyBdLFxuXHRcdFx0bjEyID0gbWVbIDQgXSwgbjIyID0gbWVbIDUgXSwgbjMyID0gbWVbIDYgXSwgbjQyID0gbWVbIDcgXSxcblx0XHRcdG4xMyA9IG1lWyA4IF0sIG4yMyA9IG1lWyA5IF0sIG4zMyA9IG1lWyAxMCBdLCBuNDMgPSBtZVsgMTEgXSxcblx0XHRcdG4xNCA9IG1lWyAxMiBdLCBuMjQgPSBtZVsgMTMgXSwgbjM0ID0gbWVbIDE0IF0sIG40NCA9IG1lWyAxNSBdLFxuXG5cdFx0XHR0MTEgPSBuMjMgKiBuMzQgKiBuNDIgLSBuMjQgKiBuMzMgKiBuNDIgKyBuMjQgKiBuMzIgKiBuNDMgLSBuMjIgKiBuMzQgKiBuNDMgLSBuMjMgKiBuMzIgKiBuNDQgKyBuMjIgKiBuMzMgKiBuNDQsXG5cdFx0XHR0MTIgPSBuMTQgKiBuMzMgKiBuNDIgLSBuMTMgKiBuMzQgKiBuNDIgLSBuMTQgKiBuMzIgKiBuNDMgKyBuMTIgKiBuMzQgKiBuNDMgKyBuMTMgKiBuMzIgKiBuNDQgLSBuMTIgKiBuMzMgKiBuNDQsXG5cdFx0XHR0MTMgPSBuMTMgKiBuMjQgKiBuNDIgLSBuMTQgKiBuMjMgKiBuNDIgKyBuMTQgKiBuMjIgKiBuNDMgLSBuMTIgKiBuMjQgKiBuNDMgLSBuMTMgKiBuMjIgKiBuNDQgKyBuMTIgKiBuMjMgKiBuNDQsXG5cdFx0XHR0MTQgPSBuMTQgKiBuMjMgKiBuMzIgLSBuMTMgKiBuMjQgKiBuMzIgLSBuMTQgKiBuMjIgKiBuMzMgKyBuMTIgKiBuMjQgKiBuMzMgKyBuMTMgKiBuMjIgKiBuMzQgLSBuMTIgKiBuMjMgKiBuMzQ7XG5cblx0XHR2YXIgZGV0ID0gbjExICogdDExICsgbjIxICogdDEyICsgbjMxICogdDEzICsgbjQxICogdDE0O1xuXG5cdFx0aWYgKCBkZXQgPT09IDAgKSB7XG5cblx0XHRcdHZhciBtc2cgPSBcIlRIUkVFLk1hdHJpeDQ6IC5nZXRJbnZlcnNlKCkgY2FuJ3QgaW52ZXJ0IG1hdHJpeCwgZGV0ZXJtaW5hbnQgaXMgMFwiO1xuXG5cdFx0XHRpZiAoIHRocm93T25EZWdlbmVyYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciggbXNnICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCBtc2cgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcy5pZGVudGl0eSgpO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGRldEludiA9IDEgLyBkZXQ7XG5cblx0XHR0ZVsgMCBdID0gdDExICogZGV0SW52O1xuXHRcdHRlWyAxIF0gPSAoIG4yNCAqIG4zMyAqIG40MSAtIG4yMyAqIG4zNCAqIG40MSAtIG4yNCAqIG4zMSAqIG40MyArIG4yMSAqIG4zNCAqIG40MyArIG4yMyAqIG4zMSAqIG40NCAtIG4yMSAqIG4zMyAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyAyIF0gPSAoIG4yMiAqIG4zNCAqIG40MSAtIG4yNCAqIG4zMiAqIG40MSArIG4yNCAqIG4zMSAqIG40MiAtIG4yMSAqIG4zNCAqIG40MiAtIG4yMiAqIG4zMSAqIG40NCArIG4yMSAqIG4zMiAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyAzIF0gPSAoIG4yMyAqIG4zMiAqIG40MSAtIG4yMiAqIG4zMyAqIG40MSAtIG4yMyAqIG4zMSAqIG40MiArIG4yMSAqIG4zMyAqIG40MiArIG4yMiAqIG4zMSAqIG40MyAtIG4yMSAqIG4zMiAqIG40MyApICogZGV0SW52O1xuXG5cdFx0dGVbIDQgXSA9IHQxMiAqIGRldEludjtcblx0XHR0ZVsgNSBdID0gKCBuMTMgKiBuMzQgKiBuNDEgLSBuMTQgKiBuMzMgKiBuNDEgKyBuMTQgKiBuMzEgKiBuNDMgLSBuMTEgKiBuMzQgKiBuNDMgLSBuMTMgKiBuMzEgKiBuNDQgKyBuMTEgKiBuMzMgKiBuNDQgKSAqIGRldEludjtcblx0XHR0ZVsgNiBdID0gKCBuMTQgKiBuMzIgKiBuNDEgLSBuMTIgKiBuMzQgKiBuNDEgLSBuMTQgKiBuMzEgKiBuNDIgKyBuMTEgKiBuMzQgKiBuNDIgKyBuMTIgKiBuMzEgKiBuNDQgLSBuMTEgKiBuMzIgKiBuNDQgKSAqIGRldEludjtcblx0XHR0ZVsgNyBdID0gKCBuMTIgKiBuMzMgKiBuNDEgLSBuMTMgKiBuMzIgKiBuNDEgKyBuMTMgKiBuMzEgKiBuNDIgLSBuMTEgKiBuMzMgKiBuNDIgLSBuMTIgKiBuMzEgKiBuNDMgKyBuMTEgKiBuMzIgKiBuNDMgKSAqIGRldEludjtcblxuXHRcdHRlWyA4IF0gPSB0MTMgKiBkZXRJbnY7XG5cdFx0dGVbIDkgXSA9ICggbjE0ICogbjIzICogbjQxIC0gbjEzICogbjI0ICogbjQxIC0gbjE0ICogbjIxICogbjQzICsgbjExICogbjI0ICogbjQzICsgbjEzICogbjIxICogbjQ0IC0gbjExICogbjIzICogbjQ0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDEwIF0gPSAoIG4xMiAqIG4yNCAqIG40MSAtIG4xNCAqIG4yMiAqIG40MSArIG4xNCAqIG4yMSAqIG40MiAtIG4xMSAqIG4yNCAqIG40MiAtIG4xMiAqIG4yMSAqIG40NCArIG4xMSAqIG4yMiAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyAxMSBdID0gKCBuMTMgKiBuMjIgKiBuNDEgLSBuMTIgKiBuMjMgKiBuNDEgLSBuMTMgKiBuMjEgKiBuNDIgKyBuMTEgKiBuMjMgKiBuNDIgKyBuMTIgKiBuMjEgKiBuNDMgLSBuMTEgKiBuMjIgKiBuNDMgKSAqIGRldEludjtcblxuXHRcdHRlWyAxMiBdID0gdDE0ICogZGV0SW52O1xuXHRcdHRlWyAxMyBdID0gKCBuMTMgKiBuMjQgKiBuMzEgLSBuMTQgKiBuMjMgKiBuMzEgKyBuMTQgKiBuMjEgKiBuMzMgLSBuMTEgKiBuMjQgKiBuMzMgLSBuMTMgKiBuMjEgKiBuMzQgKyBuMTEgKiBuMjMgKiBuMzQgKSAqIGRldEludjtcblx0XHR0ZVsgMTQgXSA9ICggbjE0ICogbjIyICogbjMxIC0gbjEyICogbjI0ICogbjMxIC0gbjE0ICogbjIxICogbjMyICsgbjExICogbjI0ICogbjMyICsgbjEyICogbjIxICogbjM0IC0gbjExICogbjIyICogbjM0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDE1IF0gPSAoIG4xMiAqIG4yMyAqIG4zMSAtIG4xMyAqIG4yMiAqIG4zMSArIG4xMyAqIG4yMSAqIG4zMiAtIG4xMSAqIG4yMyAqIG4zMiAtIG4xMiAqIG4yMSAqIG4zMyArIG4xMSAqIG4yMiAqIG4zMyApICogZGV0SW52O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzY2FsZTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgeCA9IHYueCwgeSA9IHYueSwgeiA9IHYuejtcblxuXHRcdHRlWyAwIF0gKj0geDsgdGVbIDQgXSAqPSB5OyB0ZVsgOCBdICo9IHo7XG5cdFx0dGVbIDEgXSAqPSB4OyB0ZVsgNSBdICo9IHk7IHRlWyA5IF0gKj0gejtcblx0XHR0ZVsgMiBdICo9IHg7IHRlWyA2IF0gKj0geTsgdGVbIDEwIF0gKj0gejtcblx0XHR0ZVsgMyBdICo9IHg7IHRlWyA3IF0gKj0geTsgdGVbIDExIF0gKj0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0TWF4U2NhbGVPbkF4aXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgc2NhbGVYU3EgPSB0ZVsgMCBdICogdGVbIDAgXSArIHRlWyAxIF0gKiB0ZVsgMSBdICsgdGVbIDIgXSAqIHRlWyAyIF07XG5cdFx0dmFyIHNjYWxlWVNxID0gdGVbIDQgXSAqIHRlWyA0IF0gKyB0ZVsgNSBdICogdGVbIDUgXSArIHRlWyA2IF0gKiB0ZVsgNiBdO1xuXHRcdHZhciBzY2FsZVpTcSA9IHRlWyA4IF0gKiB0ZVsgOCBdICsgdGVbIDkgXSAqIHRlWyA5IF0gKyB0ZVsgMTAgXSAqIHRlWyAxMCBdO1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggTWF0aC5tYXgoIHNjYWxlWFNxLCBzY2FsZVlTcSwgc2NhbGVaU3EgKSApO1xuXG5cdH0sXG5cblx0bWFrZVRyYW5zbGF0aW9uOiBmdW5jdGlvbiAoIHgsIHksIHogKSB7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0MSwgMCwgMCwgeCxcblx0XHRcdDAsIDEsIDAsIHksXG5cdFx0XHQwLCAwLCAxLCB6LFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZVJvdGF0aW9uWDogZnVuY3Rpb24gKCB0aGV0YSApIHtcblxuXHRcdHZhciBjID0gTWF0aC5jb3MoIHRoZXRhICksIHMgPSBNYXRoLnNpbiggdGhldGEgKTtcblxuXHRcdHRoaXMuc2V0KFxuXG5cdFx0XHQxLCAwLCAwLCAwLFxuXHRcdFx0MCwgYywgLSBzLCAwLFxuXHRcdFx0MCwgcywgYywgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VSb3RhdGlvblk6IGZ1bmN0aW9uICggdGhldGEgKSB7XG5cblx0XHR2YXIgYyA9IE1hdGguY29zKCB0aGV0YSApLCBzID0gTWF0aC5zaW4oIHRoZXRhICk7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0IGMsIDAsIHMsIDAsXG5cdFx0XHQgMCwgMSwgMCwgMCxcblx0XHRcdC0gcywgMCwgYywgMCxcblx0XHRcdCAwLCAwLCAwLCAxXG5cblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlUm90YXRpb25aOiBmdW5jdGlvbiAoIHRoZXRhICkge1xuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggdGhldGEgKSwgcyA9IE1hdGguc2luKCB0aGV0YSApO1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdGMsIC0gcywgMCwgMCxcblx0XHRcdHMsIGMsIDAsIDAsXG5cdFx0XHQwLCAwLCAxLCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZVJvdGF0aW9uQXhpczogZnVuY3Rpb24gKCBheGlzLCBhbmdsZSApIHtcblxuXHRcdC8vIEJhc2VkIG9uIGh0dHA6Ly93d3cuZ2FtZWRldi5uZXQvcmVmZXJlbmNlL2FydGljbGVzL2FydGljbGUxMTk5LmFzcFxuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggYW5nbGUgKTtcblx0XHR2YXIgcyA9IE1hdGguc2luKCBhbmdsZSApO1xuXHRcdHZhciB0ID0gMSAtIGM7XG5cdFx0dmFyIHggPSBheGlzLngsIHkgPSBheGlzLnksIHogPSBheGlzLno7XG5cdFx0dmFyIHR4ID0gdCAqIHgsIHR5ID0gdCAqIHk7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0dHggKiB4ICsgYywgdHggKiB5IC0gcyAqIHosIHR4ICogeiArIHMgKiB5LCAwLFxuXHRcdFx0dHggKiB5ICsgcyAqIHosIHR5ICogeSArIGMsIHR5ICogeiAtIHMgKiB4LCAwLFxuXHRcdFx0dHggKiB6IC0gcyAqIHksIHR5ICogeiArIHMgKiB4LCB0ICogeiAqIHogKyBjLCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdCByZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VTY2FsZTogZnVuY3Rpb24gKCB4LCB5LCB6ICkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdHgsIDAsIDAsIDAsXG5cdFx0XHQwLCB5LCAwLCAwLFxuXHRcdFx0MCwgMCwgeiwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VTaGVhcjogZnVuY3Rpb24gKCB4LCB5LCB6ICkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdDEsIHksIHosIDAsXG5cdFx0XHR4LCAxLCB6LCAwLFxuXHRcdFx0eCwgeSwgMSwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbXBvc2U6IGZ1bmN0aW9uICggcG9zaXRpb24sIHF1YXRlcm5pb24sIHNjYWxlICkge1xuXG5cdFx0dGhpcy5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbiggcXVhdGVybmlvbiApO1xuXHRcdHRoaXMuc2NhbGUoIHNjYWxlICk7XG5cdFx0dGhpcy5zZXRQb3NpdGlvbiggcG9zaXRpb24gKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGVjb21wb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBkZWNvbXBvc2UoIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBzY2FsZSApIHtcblxuXHRcdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdFx0dmFyIHN4ID0gdmVjdG9yLnNldCggdGVbIDAgXSwgdGVbIDEgXSwgdGVbIDIgXSApLmxlbmd0aCgpO1xuXHRcdFx0dmFyIHN5ID0gdmVjdG9yLnNldCggdGVbIDQgXSwgdGVbIDUgXSwgdGVbIDYgXSApLmxlbmd0aCgpO1xuXHRcdFx0dmFyIHN6ID0gdmVjdG9yLnNldCggdGVbIDggXSwgdGVbIDkgXSwgdGVbIDEwIF0gKS5sZW5ndGgoKTtcblxuXHRcdFx0Ly8gaWYgZGV0ZXJtaW5lIGlzIG5lZ2F0aXZlLCB3ZSBuZWVkIHRvIGludmVydCBvbmUgc2NhbGVcblx0XHRcdHZhciBkZXQgPSB0aGlzLmRldGVybWluYW50KCk7XG5cdFx0XHRpZiAoIGRldCA8IDAgKSBzeCA9IC0gc3g7XG5cblx0XHRcdHBvc2l0aW9uLnggPSB0ZVsgMTIgXTtcblx0XHRcdHBvc2l0aW9uLnkgPSB0ZVsgMTMgXTtcblx0XHRcdHBvc2l0aW9uLnogPSB0ZVsgMTQgXTtcblxuXHRcdFx0Ly8gc2NhbGUgdGhlIHJvdGF0aW9uIHBhcnRcblx0XHRcdG1hdHJpeC5jb3B5KCB0aGlzICk7XG5cblx0XHRcdHZhciBpbnZTWCA9IDEgLyBzeDtcblx0XHRcdHZhciBpbnZTWSA9IDEgLyBzeTtcblx0XHRcdHZhciBpbnZTWiA9IDEgLyBzejtcblxuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyAwIF0gKj0gaW52U1g7XG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDEgXSAqPSBpbnZTWDtcblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgMiBdICo9IGludlNYO1xuXG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDQgXSAqPSBpbnZTWTtcblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgNSBdICo9IGludlNZO1xuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyA2IF0gKj0gaW52U1k7XG5cblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgOCBdICo9IGludlNaO1xuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyA5IF0gKj0gaW52U1o7XG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDEwIF0gKj0gaW52U1o7XG5cblx0XHRcdHF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBtYXRyaXggKTtcblxuXHRcdFx0c2NhbGUueCA9IHN4O1xuXHRcdFx0c2NhbGUueSA9IHN5O1xuXHRcdFx0c2NhbGUueiA9IHN6O1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdG1ha2VQZXJzcGVjdGl2ZTogZnVuY3Rpb24gKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIHtcblxuXHRcdGlmICggZmFyID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5tYWtlUGVyc3BlY3RpdmUoKSBoYXMgYmVlbiByZWRlZmluZWQgYW5kIGhhcyBhIG5ldyBzaWduYXR1cmUuIFBsZWFzZSBjaGVjayB0aGUgZG9jcy4nICk7XG5cblx0XHR9XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciB4ID0gMiAqIG5lYXIgLyAoIHJpZ2h0IC0gbGVmdCApO1xuXHRcdHZhciB5ID0gMiAqIG5lYXIgLyAoIHRvcCAtIGJvdHRvbSApO1xuXG5cdFx0dmFyIGEgPSAoIHJpZ2h0ICsgbGVmdCApIC8gKCByaWdodCAtIGxlZnQgKTtcblx0XHR2YXIgYiA9ICggdG9wICsgYm90dG9tICkgLyAoIHRvcCAtIGJvdHRvbSApO1xuXHRcdHZhciBjID0gLSAoIGZhciArIG5lYXIgKSAvICggZmFyIC0gbmVhciApO1xuXHRcdHZhciBkID0gLSAyICogZmFyICogbmVhciAvICggZmFyIC0gbmVhciApO1xuXG5cdFx0dGVbIDAgXSA9IHg7XHR0ZVsgNCBdID0gMDtcdHRlWyA4IF0gPSBhO1x0dGVbIDEyIF0gPSAwO1xuXHRcdHRlWyAxIF0gPSAwO1x0dGVbIDUgXSA9IHk7XHR0ZVsgOSBdID0gYjtcdHRlWyAxMyBdID0gMDtcblx0XHR0ZVsgMiBdID0gMDtcdHRlWyA2IF0gPSAwO1x0dGVbIDEwIF0gPSBjO1x0dGVbIDE0IF0gPSBkO1xuXHRcdHRlWyAzIF0gPSAwO1x0dGVbIDcgXSA9IDA7XHR0ZVsgMTEgXSA9IC0gMTtcdHRlWyAxNSBdID0gMDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZU9ydGhvZ3JhcGhpYzogZnVuY3Rpb24gKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0dmFyIHcgPSAxLjAgLyAoIHJpZ2h0IC0gbGVmdCApO1xuXHRcdHZhciBoID0gMS4wIC8gKCB0b3AgLSBib3R0b20gKTtcblx0XHR2YXIgcCA9IDEuMCAvICggZmFyIC0gbmVhciApO1xuXG5cdFx0dmFyIHggPSAoIHJpZ2h0ICsgbGVmdCApICogdztcblx0XHR2YXIgeSA9ICggdG9wICsgYm90dG9tICkgKiBoO1xuXHRcdHZhciB6ID0gKCBmYXIgKyBuZWFyICkgKiBwO1xuXG5cdFx0dGVbIDAgXSA9IDIgKiB3O1x0dGVbIDQgXSA9IDA7XHR0ZVsgOCBdID0gMDtcdHRlWyAxMiBdID0gLSB4O1xuXHRcdHRlWyAxIF0gPSAwO1x0dGVbIDUgXSA9IDIgKiBoO1x0dGVbIDkgXSA9IDA7XHR0ZVsgMTMgXSA9IC0geTtcblx0XHR0ZVsgMiBdID0gMDtcdHRlWyA2IF0gPSAwO1x0dGVbIDEwIF0gPSAtIDIgKiBwO1x0dGVbIDE0IF0gPSAtIHo7XG5cdFx0dGVbIDMgXSA9IDA7XHR0ZVsgNyBdID0gMDtcdHRlWyAxMSBdID0gMDtcdHRlWyAxNSBdID0gMTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0dmFyIG1lID0gbWF0cml4LmVsZW1lbnRzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgMTY7IGkgKysgKSB7XG5cblx0XHRcdGlmICggdGVbIGkgXSAhPT0gbWVbIGkgXSApIHJldHVybiBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDE2OyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmVsZW1lbnRzWyBpIF0gPSBhcnJheVsgaSArIG9mZnNldCBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRlWyAwIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRlWyAxIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRlWyAyIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDMgXSA9IHRlWyAzIF07XG5cblx0XHRhcnJheVsgb2Zmc2V0ICsgNCBdID0gdGVbIDQgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgNSBdID0gdGVbIDUgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgNiBdID0gdGVbIDYgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgNyBdID0gdGVbIDcgXTtcblxuXHRcdGFycmF5WyBvZmZzZXQgKyA4IF0gPSB0ZVsgOCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA5IF0gPSB0ZVsgOSBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxMCBdID0gdGVbIDEwIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDExIF0gPSB0ZVsgMTEgXTtcblxuXHRcdGFycmF5WyBvZmZzZXQgKyAxMiBdID0gdGVbIDEyIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDEzIF0gPSB0ZVsgMTMgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMTQgXSA9IHRlWyAxNCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxNSBdID0gdGVbIDE1IF07XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG5mdW5jdGlvbiBRdWF0ZXJuaW9uKCB4LCB5LCB6LCB3ICkge1xuXG5cdHRoaXMuX3ggPSB4IHx8IDA7XG5cdHRoaXMuX3kgPSB5IHx8IDA7XG5cdHRoaXMuX3ogPSB6IHx8IDA7XG5cdHRoaXMuX3cgPSAoIHcgIT09IHVuZGVmaW5lZCApID8gdyA6IDE7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggUXVhdGVybmlvbiwge1xuXG5cdHNsZXJwOiBmdW5jdGlvbiAoIHFhLCBxYiwgcW0sIHQgKSB7XG5cblx0XHRyZXR1cm4gcW0uY29weSggcWEgKS5zbGVycCggcWIsIHQgKTtcblxuXHR9LFxuXG5cdHNsZXJwRmxhdDogZnVuY3Rpb24gKCBkc3QsIGRzdE9mZnNldCwgc3JjMCwgc3JjT2Zmc2V0MCwgc3JjMSwgc3JjT2Zmc2V0MSwgdCApIHtcblxuXHRcdC8vIGZ1enotZnJlZSwgYXJyYXktYmFzZWQgUXVhdGVybmlvbiBTTEVSUCBvcGVyYXRpb25cblxuXHRcdHZhciB4MCA9IHNyYzBbIHNyY09mZnNldDAgKyAwIF0sXG5cdFx0XHR5MCA9IHNyYzBbIHNyY09mZnNldDAgKyAxIF0sXG5cdFx0XHR6MCA9IHNyYzBbIHNyY09mZnNldDAgKyAyIF0sXG5cdFx0XHR3MCA9IHNyYzBbIHNyY09mZnNldDAgKyAzIF0sXG5cblx0XHRcdHgxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDAgXSxcblx0XHRcdHkxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDEgXSxcblx0XHRcdHoxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDIgXSxcblx0XHRcdHcxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDMgXTtcblxuXHRcdGlmICggdzAgIT09IHcxIHx8IHgwICE9PSB4MSB8fCB5MCAhPT0geTEgfHwgejAgIT09IHoxICkge1xuXG5cdFx0XHR2YXIgcyA9IDEgLSB0LFxuXG5cdFx0XHRcdGNvcyA9IHgwICogeDEgKyB5MCAqIHkxICsgejAgKiB6MSArIHcwICogdzEsXG5cblx0XHRcdFx0ZGlyID0gKCBjb3MgPj0gMCA/IDEgOiAtIDEgKSxcblx0XHRcdFx0c3FyU2luID0gMSAtIGNvcyAqIGNvcztcblxuXHRcdFx0Ly8gU2tpcCB0aGUgU2xlcnAgZm9yIHRpbnkgc3RlcHMgdG8gYXZvaWQgbnVtZXJpYyBwcm9ibGVtczpcblx0XHRcdGlmICggc3FyU2luID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0dmFyIHNpbiA9IE1hdGguc3FydCggc3FyU2luICksXG5cdFx0XHRcdFx0bGVuID0gTWF0aC5hdGFuMiggc2luLCBjb3MgKiBkaXIgKTtcblxuXHRcdFx0XHRzID0gTWF0aC5zaW4oIHMgKiBsZW4gKSAvIHNpbjtcblx0XHRcdFx0dCA9IE1hdGguc2luKCB0ICogbGVuICkgLyBzaW47XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHREaXIgPSB0ICogZGlyO1xuXG5cdFx0XHR4MCA9IHgwICogcyArIHgxICogdERpcjtcblx0XHRcdHkwID0geTAgKiBzICsgeTEgKiB0RGlyO1xuXHRcdFx0ejAgPSB6MCAqIHMgKyB6MSAqIHREaXI7XG5cdFx0XHR3MCA9IHcwICogcyArIHcxICogdERpcjtcblxuXHRcdFx0Ly8gTm9ybWFsaXplIGluIGNhc2Ugd2UganVzdCBkaWQgYSBsZXJwOlxuXHRcdFx0aWYgKCBzID09PSAxIC0gdCApIHtcblxuXHRcdFx0XHR2YXIgZiA9IDEgLyBNYXRoLnNxcnQoIHgwICogeDAgKyB5MCAqIHkwICsgejAgKiB6MCArIHcwICogdzAgKTtcblxuXHRcdFx0XHR4MCAqPSBmO1xuXHRcdFx0XHR5MCAqPSBmO1xuXHRcdFx0XHR6MCAqPSBmO1xuXHRcdFx0XHR3MCAqPSBmO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRkc3RbIGRzdE9mZnNldCBdID0geDA7XG5cdFx0ZHN0WyBkc3RPZmZzZXQgKyAxIF0gPSB5MDtcblx0XHRkc3RbIGRzdE9mZnNldCArIDIgXSA9IHowO1xuXHRcdGRzdFsgZHN0T2Zmc2V0ICsgMyBdID0gdzA7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBRdWF0ZXJuaW9uLnByb3RvdHlwZSwge1xuXG5cdHg6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5feDtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSB2YWx1ZTtcblx0XHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0eToge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLl95O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy5feSA9IHZhbHVlO1xuXHRcdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR6OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX3o7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl96ID0gdmFsdWU7XG5cdFx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHc6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5fdztcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3cgPSB2YWx1ZTtcblx0XHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBRdWF0ZXJuaW9uLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCB4LCB5LCB6LCB3ICkge1xuXG5cdFx0dGhpcy5feCA9IHg7XG5cdFx0dGhpcy5feSA9IHk7XG5cdFx0dGhpcy5feiA9IHo7XG5cdFx0dGhpcy5fdyA9IHc7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiwgdGhpcy5fdyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBxdWF0ZXJuaW9uICkge1xuXG5cdFx0dGhpcy5feCA9IHF1YXRlcm5pb24ueDtcblx0XHR0aGlzLl95ID0gcXVhdGVybmlvbi55O1xuXHRcdHRoaXMuX3ogPSBxdWF0ZXJuaW9uLno7XG5cdFx0dGhpcy5fdyA9IHF1YXRlcm5pb24udztcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tRXVsZXI6IGZ1bmN0aW9uICggZXVsZXIsIHVwZGF0ZSApIHtcblxuXHRcdGlmICggISAoIGV1bGVyICYmIGV1bGVyLmlzRXVsZXIgKSApIHtcblxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuUXVhdGVybmlvbjogLnNldEZyb21FdWxlcigpIG5vdyBleHBlY3RzIGFuIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuJyApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHggPSBldWxlci5feCwgeSA9IGV1bGVyLl95LCB6ID0gZXVsZXIuX3osIG9yZGVyID0gZXVsZXIub3JkZXI7XG5cblx0XHQvLyBodHRwOi8vd3d3Lm1hdGh3b3Jrcy5jb20vbWF0bGFiY2VudHJhbC9maWxlZXhjaGFuZ2UvXG5cdFx0Ly8gXHQyMDY5Ni1mdW5jdGlvbi10by1jb252ZXJ0LWJldHdlZW4tZGNtLWV1bGVyLWFuZ2xlcy1xdWF0ZXJuaW9ucy1hbmQtZXVsZXItdmVjdG9ycy9cblx0XHQvL1x0Y29udGVudC9TcGluQ2FsYy5tXG5cblx0XHR2YXIgY29zID0gTWF0aC5jb3M7XG5cdFx0dmFyIHNpbiA9IE1hdGguc2luO1xuXG5cdFx0dmFyIGMxID0gY29zKCB4IC8gMiApO1xuXHRcdHZhciBjMiA9IGNvcyggeSAvIDIgKTtcblx0XHR2YXIgYzMgPSBjb3MoIHogLyAyICk7XG5cblx0XHR2YXIgczEgPSBzaW4oIHggLyAyICk7XG5cdFx0dmFyIHMyID0gc2luKCB5IC8gMiApO1xuXHRcdHZhciBzMyA9IHNpbiggeiAvIDIgKTtcblxuXHRcdGlmICggb3JkZXIgPT09ICdYWVonICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzICsgYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyAtIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdZWFonICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzICsgYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyAtIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdaWFknICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyArIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdaWVgnICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyArIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdZWlgnICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzICsgYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyArIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdYWlknICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyAtIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB1cGRhdGUgIT09IGZhbHNlICkgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21BeGlzQW5nbGU6IGZ1bmN0aW9uICggYXhpcywgYW5nbGUgKSB7XG5cblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvYW5nbGVUb1F1YXRlcm5pb24vaW5kZXguaHRtXG5cblx0XHQvLyBhc3N1bWVzIGF4aXMgaXMgbm9ybWFsaXplZFxuXG5cdFx0dmFyIGhhbGZBbmdsZSA9IGFuZ2xlIC8gMiwgcyA9IE1hdGguc2luKCBoYWxmQW5nbGUgKTtcblxuXHRcdHRoaXMuX3ggPSBheGlzLnggKiBzO1xuXHRcdHRoaXMuX3kgPSBheGlzLnkgKiBzO1xuXHRcdHRoaXMuX3ogPSBheGlzLnogKiBzO1xuXHRcdHRoaXMuX3cgPSBNYXRoLmNvcyggaGFsZkFuZ2xlICk7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVJvdGF0aW9uTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvbWF0cml4VG9RdWF0ZXJuaW9uL2luZGV4Lmh0bVxuXG5cdFx0Ly8gYXNzdW1lcyB0aGUgdXBwZXIgM3gzIG9mIG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZClcblxuXHRcdHZhciB0ZSA9IG0uZWxlbWVudHMsXG5cblx0XHRcdG0xMSA9IHRlWyAwIF0sIG0xMiA9IHRlWyA0IF0sIG0xMyA9IHRlWyA4IF0sXG5cdFx0XHRtMjEgPSB0ZVsgMSBdLCBtMjIgPSB0ZVsgNSBdLCBtMjMgPSB0ZVsgOSBdLFxuXHRcdFx0bTMxID0gdGVbIDIgXSwgbTMyID0gdGVbIDYgXSwgbTMzID0gdGVbIDEwIF0sXG5cblx0XHRcdHRyYWNlID0gbTExICsgbTIyICsgbTMzLFxuXHRcdFx0cztcblxuXHRcdGlmICggdHJhY2UgPiAwICkge1xuXG5cdFx0XHRzID0gMC41IC8gTWF0aC5zcXJ0KCB0cmFjZSArIDEuMCApO1xuXG5cdFx0XHR0aGlzLl93ID0gMC4yNSAvIHM7XG5cdFx0XHR0aGlzLl94ID0gKCBtMzIgLSBtMjMgKSAqIHM7XG5cdFx0XHR0aGlzLl95ID0gKCBtMTMgLSBtMzEgKSAqIHM7XG5cdFx0XHR0aGlzLl96ID0gKCBtMjEgLSBtMTIgKSAqIHM7XG5cblx0XHR9IGVsc2UgaWYgKCBtMTEgPiBtMjIgJiYgbTExID4gbTMzICkge1xuXG5cdFx0XHRzID0gMi4wICogTWF0aC5zcXJ0KCAxLjAgKyBtMTEgLSBtMjIgLSBtMzMgKTtcblxuXHRcdFx0dGhpcy5fdyA9ICggbTMyIC0gbTIzICkgLyBzO1xuXHRcdFx0dGhpcy5feCA9IDAuMjUgKiBzO1xuXHRcdFx0dGhpcy5feSA9ICggbTEyICsgbTIxICkgLyBzO1xuXHRcdFx0dGhpcy5feiA9ICggbTEzICsgbTMxICkgLyBzO1xuXG5cdFx0fSBlbHNlIGlmICggbTIyID4gbTMzICkge1xuXG5cdFx0XHRzID0gMi4wICogTWF0aC5zcXJ0KCAxLjAgKyBtMjIgLSBtMTEgLSBtMzMgKTtcblxuXHRcdFx0dGhpcy5fdyA9ICggbTEzIC0gbTMxICkgLyBzO1xuXHRcdFx0dGhpcy5feCA9ICggbTEyICsgbTIxICkgLyBzO1xuXHRcdFx0dGhpcy5feSA9IDAuMjUgKiBzO1xuXHRcdFx0dGhpcy5feiA9ICggbTIzICsgbTMyICkgLyBzO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cyA9IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTMzIC0gbTExIC0gbTIyICk7XG5cblx0XHRcdHRoaXMuX3cgPSAoIG0yMSAtIG0xMiApIC8gcztcblx0XHRcdHRoaXMuX3ggPSAoIG0xMyArIG0zMSApIC8gcztcblx0XHRcdHRoaXMuX3kgPSAoIG0yMyArIG0zMiApIC8gcztcblx0XHRcdHRoaXMuX3ogPSAwLjI1ICogcztcblxuXHRcdH1cblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tVW5pdFZlY3RvcnM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIGFzc3VtZXMgZGlyZWN0aW9uIHZlY3RvcnMgdkZyb20gYW5kIHZUbyBhcmUgbm9ybWFsaXplZFxuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgcjtcblxuXHRcdHZhciBFUFMgPSAwLjAwMDAwMTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzZXRGcm9tVW5pdFZlY3RvcnMoIHZGcm9tLCB2VG8gKSB7XG5cblx0XHRcdGlmICggdjEgPT09IHVuZGVmaW5lZCApIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0ciA9IHZGcm9tLmRvdCggdlRvICkgKyAxO1xuXG5cdFx0XHRpZiAoIHIgPCBFUFMgKSB7XG5cblx0XHRcdFx0ciA9IDA7XG5cblx0XHRcdFx0aWYgKCBNYXRoLmFicyggdkZyb20ueCApID4gTWF0aC5hYnMoIHZGcm9tLnogKSApIHtcblxuXHRcdFx0XHRcdHYxLnNldCggLSB2RnJvbS55LCB2RnJvbS54LCAwICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHYxLnNldCggMCwgLSB2RnJvbS56LCB2RnJvbS55ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHYxLmNyb3NzVmVjdG9ycyggdkZyb20sIHZUbyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX3ggPSB2MS54O1xuXHRcdFx0dGhpcy5feSA9IHYxLnk7XG5cdFx0XHR0aGlzLl96ID0gdjEuejtcblx0XHRcdHRoaXMuX3cgPSByO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludmVyc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHF1YXRlcm5pb24gaXMgYXNzdW1lZCB0byBoYXZlIHVuaXQgbGVuZ3RoXG5cblx0XHRyZXR1cm4gdGhpcy5jb25qdWdhdGUoKTtcblxuXHR9LFxuXG5cdGNvbmp1Z2F0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5feCAqPSAtIDE7XG5cdFx0dGhpcy5feSAqPSAtIDE7XG5cdFx0dGhpcy5feiAqPSAtIDE7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZG90OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5feCAqIHYuX3ggKyB0aGlzLl95ICogdi5feSArIHRoaXMuX3ogKiB2Ll96ICsgdGhpcy5fdyAqIHYuX3c7XG5cblx0fSxcblxuXHRsZW5ndGhTcTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3ggKiB0aGlzLl94ICsgdGhpcy5feSAqIHRoaXMuX3kgKyB0aGlzLl96ICogdGhpcy5feiArIHRoaXMuX3cgKiB0aGlzLl93O1xuXG5cdH0sXG5cblx0bGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLl94ICogdGhpcy5feCArIHRoaXMuX3kgKiB0aGlzLl95ICsgdGhpcy5feiAqIHRoaXMuX3ogKyB0aGlzLl93ICogdGhpcy5fdyApO1xuXG5cdH0sXG5cblx0bm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbCA9IHRoaXMubGVuZ3RoKCk7XG5cblx0XHRpZiAoIGwgPT09IDAgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSAwO1xuXHRcdFx0dGhpcy5feSA9IDA7XG5cdFx0XHR0aGlzLl96ID0gMDtcblx0XHRcdHRoaXMuX3cgPSAxO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bCA9IDEgLyBsO1xuXG5cdFx0XHR0aGlzLl94ID0gdGhpcy5feCAqIGw7XG5cdFx0XHR0aGlzLl95ID0gdGhpcy5feSAqIGw7XG5cdFx0XHR0aGlzLl96ID0gdGhpcy5feiAqIGw7XG5cdFx0XHR0aGlzLl93ID0gdGhpcy5fdyAqIGw7XG5cblx0XHR9XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHk6IGZ1bmN0aW9uICggcSwgcCApIHtcblxuXHRcdGlmICggcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5RdWF0ZXJuaW9uOiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseVF1YXRlcm5pb25zKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKCBxLCBwICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKCB0aGlzLCBxICk7XG5cblx0fSxcblxuXHRwcmVtdWx0aXBseTogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyggcSwgdGhpcyApO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlRdWF0ZXJuaW9uczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0Ly8gZnJvbSBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL3JlYWxOb3JtZWRBbGdlYnJhL3F1YXRlcm5pb25zL2NvZGUvaW5kZXguaHRtXG5cblx0XHR2YXIgcWF4ID0gYS5feCwgcWF5ID0gYS5feSwgcWF6ID0gYS5feiwgcWF3ID0gYS5fdztcblx0XHR2YXIgcWJ4ID0gYi5feCwgcWJ5ID0gYi5feSwgcWJ6ID0gYi5feiwgcWJ3ID0gYi5fdztcblxuXHRcdHRoaXMuX3ggPSBxYXggKiBxYncgKyBxYXcgKiBxYnggKyBxYXkgKiBxYnogLSBxYXogKiBxYnk7XG5cdFx0dGhpcy5feSA9IHFheSAqIHFidyArIHFhdyAqIHFieSArIHFheiAqIHFieCAtIHFheCAqIHFiejtcblx0XHR0aGlzLl96ID0gcWF6ICogcWJ3ICsgcWF3ICogcWJ6ICsgcWF4ICogcWJ5IC0gcWF5ICogcWJ4O1xuXHRcdHRoaXMuX3cgPSBxYXcgKiBxYncgLSBxYXggKiBxYnggLSBxYXkgKiBxYnkgLSBxYXogKiBxYno7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2xlcnA6IGZ1bmN0aW9uICggcWIsIHQgKSB7XG5cblx0XHRpZiAoIHQgPT09IDAgKSByZXR1cm4gdGhpcztcblx0XHRpZiAoIHQgPT09IDEgKSByZXR1cm4gdGhpcy5jb3B5KCBxYiApO1xuXG5cdFx0dmFyIHggPSB0aGlzLl94LCB5ID0gdGhpcy5feSwgeiA9IHRoaXMuX3osIHcgPSB0aGlzLl93O1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9yZWFsTm9ybWVkQWxnZWJyYS9xdWF0ZXJuaW9ucy9zbGVycC9cblxuXHRcdHZhciBjb3NIYWxmVGhldGEgPSB3ICogcWIuX3cgKyB4ICogcWIuX3ggKyB5ICogcWIuX3kgKyB6ICogcWIuX3o7XG5cblx0XHRpZiAoIGNvc0hhbGZUaGV0YSA8IDAgKSB7XG5cblx0XHRcdHRoaXMuX3cgPSAtIHFiLl93O1xuXHRcdFx0dGhpcy5feCA9IC0gcWIuX3g7XG5cdFx0XHR0aGlzLl95ID0gLSBxYi5feTtcblx0XHRcdHRoaXMuX3ogPSAtIHFiLl96O1xuXG5cdFx0XHRjb3NIYWxmVGhldGEgPSAtIGNvc0hhbGZUaGV0YTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuY29weSggcWIgKTtcblxuXHRcdH1cblxuXHRcdGlmICggY29zSGFsZlRoZXRhID49IDEuMCApIHtcblxuXHRcdFx0dGhpcy5fdyA9IHc7XG5cdFx0XHR0aGlzLl94ID0geDtcblx0XHRcdHRoaXMuX3kgPSB5O1xuXHRcdFx0dGhpcy5feiA9IHo7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHNpbkhhbGZUaGV0YSA9IE1hdGguc3FydCggMS4wIC0gY29zSGFsZlRoZXRhICogY29zSGFsZlRoZXRhICk7XG5cblx0XHRpZiAoIE1hdGguYWJzKCBzaW5IYWxmVGhldGEgKSA8IDAuMDAxICkge1xuXG5cdFx0XHR0aGlzLl93ID0gMC41ICogKCB3ICsgdGhpcy5fdyApO1xuXHRcdFx0dGhpcy5feCA9IDAuNSAqICggeCArIHRoaXMuX3ggKTtcblx0XHRcdHRoaXMuX3kgPSAwLjUgKiAoIHkgKyB0aGlzLl95ICk7XG5cdFx0XHR0aGlzLl96ID0gMC41ICogKCB6ICsgdGhpcy5feiApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH1cblxuXHRcdHZhciBoYWxmVGhldGEgPSBNYXRoLmF0YW4yKCBzaW5IYWxmVGhldGEsIGNvc0hhbGZUaGV0YSApO1xuXHRcdHZhciByYXRpb0EgPSBNYXRoLnNpbiggKCAxIC0gdCApICogaGFsZlRoZXRhICkgLyBzaW5IYWxmVGhldGEsXG5cdFx0XHRyYXRpb0IgPSBNYXRoLnNpbiggdCAqIGhhbGZUaGV0YSApIC8gc2luSGFsZlRoZXRhO1xuXG5cdFx0dGhpcy5fdyA9ICggdyAqIHJhdGlvQSArIHRoaXMuX3cgKiByYXRpb0IgKTtcblx0XHR0aGlzLl94ID0gKCB4ICogcmF0aW9BICsgdGhpcy5feCAqIHJhdGlvQiApO1xuXHRcdHRoaXMuX3kgPSAoIHkgKiByYXRpb0EgKyB0aGlzLl95ICogcmF0aW9CICk7XG5cdFx0dGhpcy5feiA9ICggeiAqIHJhdGlvQSArIHRoaXMuX3ogKiByYXRpb0IgKTtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggcXVhdGVybmlvbiApIHtcblxuXHRcdHJldHVybiAoIHF1YXRlcm5pb24uX3ggPT09IHRoaXMuX3ggKSAmJiAoIHF1YXRlcm5pb24uX3kgPT09IHRoaXMuX3kgKSAmJiAoIHF1YXRlcm5pb24uX3ogPT09IHRoaXMuX3ogKSAmJiAoIHF1YXRlcm5pb24uX3cgPT09IHRoaXMuX3cgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLl94ID0gYXJyYXlbIG9mZnNldCBdO1xuXHRcdHRoaXMuX3kgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXHRcdHRoaXMuX3ogPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xuXHRcdHRoaXMuX3cgPSBhcnJheVsgb2Zmc2V0ICsgMyBdO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLl94O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLl95O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLl96O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLl93O1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0b25DaGFuZ2U6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0b25DaGFuZ2VDYWxsYmFjazogZnVuY3Rpb24gKCkge31cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGtpbGUgLyBodHRwOi8va2lsZS5zdHJhdmFnYW56YS5vcmcvXG4gKiBAYXV0aG9yIHBoaWxvZ2IgLyBodHRwOi8vYmxvZy50aGVqaXQub3JnL1xuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgZWdyYWV0aGVyIC8gaHR0cDovL2VncmFldGhlci5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBWZWN0b3IzKCB4LCB5LCB6ICkge1xuXG5cdHRoaXMueCA9IHggfHwgMDtcblx0dGhpcy55ID0geSB8fCAwO1xuXHR0aGlzLnogPSB6IHx8IDA7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yMy5wcm90b3R5cGUsIHtcblxuXHRpc1ZlY3RvcjM6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIHgsIHksIHogKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXHRcdHRoaXMueSA9IHk7XG5cdFx0dGhpcy56ID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMueCA9IHNjYWxhcjtcblx0XHR0aGlzLnkgPSBzY2FsYXI7XG5cdFx0dGhpcy56ID0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYOiBmdW5jdGlvbiAoIHggKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRZOiBmdW5jdGlvbiAoIHkgKSB7XG5cblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRaOiBmdW5jdGlvbiAoIHogKSB7XG5cblx0XHR0aGlzLnogPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRDb21wb25lbnQ6IGZ1bmN0aW9uICggaW5kZXgsIHZhbHVlICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogdGhpcy54ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAxOiB0aGlzLnkgPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDI6IHRoaXMueiA9IHZhbHVlOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldENvbXBvbmVudDogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xuXG5cdFx0XHRjYXNlIDA6IHJldHVybiB0aGlzLng7XG5cdFx0XHRjYXNlIDE6IHJldHVybiB0aGlzLnk7XG5cdFx0XHRjYXNlIDI6IHJldHVybiB0aGlzLno7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy54LCB0aGlzLnksIHRoaXMueiApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gdi54O1xuXHRcdHRoaXMueSA9IHYueTtcblx0XHR0aGlzLnogPSB2Lno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5hZGRWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggKz0gdi54O1xuXHRcdHRoaXMueSArPSB2Lnk7XG5cdFx0dGhpcy56ICs9IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gcztcblx0XHR0aGlzLnkgKz0gcztcblx0XHR0aGlzLnogKz0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54ICsgYi54O1xuXHRcdHRoaXMueSA9IGEueSArIGIueTtcblx0XHR0aGlzLnogPSBhLnogKyBiLno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZFNjYWxlZFZlY3RvcjogZnVuY3Rpb24gKCB2LCBzICkge1xuXG5cdFx0dGhpcy54ICs9IHYueCAqIHM7XG5cdFx0dGhpcy55ICs9IHYueSAqIHM7XG5cdFx0dGhpcy56ICs9IHYueiAqIHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YjogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggLT0gdi54O1xuXHRcdHRoaXMueSAtPSB2Lnk7XG5cdFx0dGhpcy56IC09IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggLT0gcztcblx0XHR0aGlzLnkgLT0gcztcblx0XHR0aGlzLnogLT0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54IC0gYi54O1xuXHRcdHRoaXMueSA9IGEueSAtIGIueTtcblx0XHR0aGlzLnogPSBhLnogLSBiLno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5OiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCAqPSB2Lng7XG5cdFx0dGhpcy55ICo9IHYueTtcblx0XHR0aGlzLnogKj0gdi56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLnggKj0gc2NhbGFyO1xuXHRcdHRoaXMueSAqPSBzY2FsYXI7XG5cdFx0dGhpcy56ICo9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggKiBiLng7XG5cdFx0dGhpcy55ID0gYS55ICogYi55O1xuXHRcdHRoaXMueiA9IGEueiAqIGIuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlFdWxlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGFwcGx5RXVsZXIoIGV1bGVyICkge1xuXG5cdFx0XHRpZiAoICEgKCBldWxlciAmJiBldWxlci5pc0V1bGVyICkgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlZlY3RvcjM6IC5hcHBseUV1bGVyKCkgbm93IGV4cGVjdHMgYW4gRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4nICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uLnNldEZyb21FdWxlciggZXVsZXIgKSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0YXBwbHlBeGlzQW5nbGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBhcHBseUF4aXNBbmdsZSggYXhpcywgYW5nbGUgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRhcHBseU1hdHJpeDM6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56O1xuXHRcdHZhciBlID0gbS5lbGVtZW50cztcblxuXHRcdHRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyAzIF0gKiB5ICsgZVsgNiBdICogejtcblx0XHR0aGlzLnkgPSBlWyAxIF0gKiB4ICsgZVsgNCBdICogeSArIGVbIDcgXSAqIHo7XG5cdFx0dGhpcy56ID0gZVsgMiBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA4IF0gKiB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56O1xuXHRcdHZhciBlID0gbS5lbGVtZW50cztcblxuXHRcdHZhciB3ID0gMSAvICggZVsgMyBdICogeCArIGVbIDcgXSAqIHkgKyBlWyAxMSBdICogeiArIGVbIDE1IF0gKTtcblxuXHRcdHRoaXMueCA9ICggZVsgMCBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA4IF0gKiB6ICsgZVsgMTIgXSApICogdztcblx0XHR0aGlzLnkgPSAoIGVbIDEgXSAqIHggKyBlWyA1IF0gKiB5ICsgZVsgOSBdICogeiArIGVbIDEzIF0gKSAqIHc7XG5cdFx0dGhpcy56ID0gKCBlWyAyIF0gKiB4ICsgZVsgNiBdICogeSArIGVbIDEwIF0gKiB6ICsgZVsgMTQgXSApICogdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlRdWF0ZXJuaW9uOiBmdW5jdGlvbiAoIHEgKSB7XG5cblx0XHR2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMuejtcblx0XHR2YXIgcXggPSBxLngsIHF5ID0gcS55LCBxeiA9IHEueiwgcXcgPSBxLnc7XG5cblx0XHQvLyBjYWxjdWxhdGUgcXVhdCAqIHZlY3RvclxuXG5cdFx0dmFyIGl4ID0gcXcgKiB4ICsgcXkgKiB6IC0gcXogKiB5O1xuXHRcdHZhciBpeSA9IHF3ICogeSArIHF6ICogeCAtIHF4ICogejtcblx0XHR2YXIgaXogPSBxdyAqIHogKyBxeCAqIHkgLSBxeSAqIHg7XG5cdFx0dmFyIGl3ID0gLSBxeCAqIHggLSBxeSAqIHkgLSBxeiAqIHo7XG5cblx0XHQvLyBjYWxjdWxhdGUgcmVzdWx0ICogaW52ZXJzZSBxdWF0XG5cblx0XHR0aGlzLnggPSBpeCAqIHF3ICsgaXcgKiAtIHF4ICsgaXkgKiAtIHF6IC0gaXogKiAtIHF5O1xuXHRcdHRoaXMueSA9IGl5ICogcXcgKyBpdyAqIC0gcXkgKyBpeiAqIC0gcXggLSBpeCAqIC0gcXo7XG5cdFx0dGhpcy56ID0gaXogKiBxdyArIGl3ICogLSBxeiArIGl4ICogLSBxeSAtIGl5ICogLSBxeDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cHJvamVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcHJvamVjdCggY2FtZXJhICkge1xuXG5cdFx0XHRtYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLnByb2plY3Rpb25NYXRyaXgsIG1hdHJpeC5nZXRJbnZlcnNlKCBjYW1lcmEubWF0cml4V29ybGQgKSApO1xuXHRcdFx0cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHVucHJvamVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdW5wcm9qZWN0KCBjYW1lcmEgKSB7XG5cblx0XHRcdG1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEubWF0cml4V29ybGQsIG1hdHJpeC5nZXRJbnZlcnNlKCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCApICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNmb3JtRGlyZWN0aW9uOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHQvLyBpbnB1dDogVEhSRUUuTWF0cml4NCBhZmZpbmUgbWF0cml4XG5cdFx0Ly8gdmVjdG9yIGludGVycHJldGVkIGFzIGEgZGlyZWN0aW9uXG5cblx0XHR2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMuejtcblx0XHR2YXIgZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0aGlzLnggPSBlWyAwIF0gKiB4ICsgZVsgNCBdICogeSArIGVbIDggXSAqIHo7XG5cdFx0dGhpcy55ID0gZVsgMSBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA5IF0gKiB6O1xuXHRcdHRoaXMueiA9IGVbIDIgXSAqIHggKyBlWyA2IF0gKiB5ICsgZVsgMTAgXSAqIHo7XG5cblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKTtcblxuXHR9LFxuXG5cdGRpdmlkZTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54IC89IHYueDtcblx0XHR0aGlzLnkgLz0gdi55O1xuXHRcdHRoaXMueiAvPSB2Lno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpdmlkZVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhciggMSAvIHNjYWxhciApO1xuXG5cdH0sXG5cblx0bWluOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1pbiggdGhpcy54LCB2LnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1pbiggdGhpcy55LCB2LnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1pbiggdGhpcy56LCB2LnogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWF4OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggdGhpcy54LCB2LnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggdGhpcy55LCB2LnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1heCggdGhpcy56LCB2LnogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xhbXA6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHQvLyBhc3N1bWVzIG1pbiA8IG1heCwgY29tcG9uZW50d2lzZVxuXG5cdFx0dGhpcy54ID0gTWF0aC5tYXgoIG1pbi54LCBNYXRoLm1pbiggbWF4LngsIHRoaXMueCApICk7XG5cdFx0dGhpcy55ID0gTWF0aC5tYXgoIG1pbi55LCBNYXRoLm1pbiggbWF4LnksIHRoaXMueSApICk7XG5cdFx0dGhpcy56ID0gTWF0aC5tYXgoIG1pbi56LCBNYXRoLm1pbiggbWF4LnosIHRoaXMueiApICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsYW1wU2NhbGFyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbWluID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbWF4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjbGFtcFNjYWxhciggbWluVmFsLCBtYXhWYWwgKSB7XG5cblx0XHRcdG1pbi5zZXQoIG1pblZhbCwgbWluVmFsLCBtaW5WYWwgKTtcblx0XHRcdG1heC5zZXQoIG1heFZhbCwgbWF4VmFsLCBtYXhWYWwgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuY2xhbXAoIG1pbiwgbWF4ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbGFtcExlbmd0aDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHtcblxuXHRcdHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCBsZW5ndGggfHwgMSApLm11bHRpcGx5U2NhbGFyKCBNYXRoLm1heCggbWluLCBNYXRoLm1pbiggbWF4LCBsZW5ndGggKSApICk7XG5cblx0fSxcblxuXHRmbG9vcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5mbG9vciggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5mbG9vciggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5mbG9vciggdGhpcy56ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNlaWw6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguY2VpbCggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5jZWlsKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLmNlaWwoIHRoaXMueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3VuZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5yb3VuZCggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5yb3VuZCggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5yb3VuZCggdGhpcy56ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdW5kVG9aZXJvOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSAoIHRoaXMueCA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy54ICkgOiBNYXRoLmZsb29yKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSAoIHRoaXMueSA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy55ICkgOiBNYXRoLmZsb29yKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSAoIHRoaXMueiA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy56ICkgOiBNYXRoLmZsb29yKCB0aGlzLnogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bmVnYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSAtIHRoaXMueDtcblx0XHR0aGlzLnkgPSAtIHRoaXMueTtcblx0XHR0aGlzLnogPSAtIHRoaXMuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZG90OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdi54ICsgdGhpcy55ICogdi55ICsgdGhpcy56ICogdi56O1xuXG5cdH0sXG5cblx0Ly8gVE9ETyBsZW5ndGhTcXVhcmVkP1xuXG5cdGxlbmd0aFNxOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56O1xuXG5cdH0sXG5cblx0bGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLnogKTtcblxuXHR9LFxuXG5cdG1hbmhhdHRhbkxlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggKSArIE1hdGguYWJzKCB0aGlzLnkgKSArIE1hdGguYWJzKCB0aGlzLnogKTtcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCB0aGlzLmxlbmd0aCgpIHx8IDEgKTtcblxuXHR9LFxuXG5cdHNldExlbmd0aDogZnVuY3Rpb24gKCBsZW5ndGggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggbGVuZ3RoICk7XG5cblx0fSxcblxuXHRsZXJwOiBmdW5jdGlvbiAoIHYsIGFscGhhICkge1xuXG5cdFx0dGhpcy54ICs9ICggdi54IC0gdGhpcy54ICkgKiBhbHBoYTtcblx0XHR0aGlzLnkgKz0gKCB2LnkgLSB0aGlzLnkgKSAqIGFscGhhO1xuXHRcdHRoaXMueiArPSAoIHYueiAtIHRoaXMueiApICogYWxwaGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxlcnBWZWN0b3JzOiBmdW5jdGlvbiAoIHYxLCB2MiwgYWxwaGEgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2MiwgdjEgKS5tdWx0aXBseVNjYWxhciggYWxwaGEgKS5hZGQoIHYxICk7XG5cblx0fSxcblxuXHRjcm9zczogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5jcm9zcygpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmNyb3NzVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuY3Jvc3NWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5jcm9zc1ZlY3RvcnMoIHRoaXMsIHYgKTtcblxuXHR9LFxuXG5cdGNyb3NzVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dmFyIGF4ID0gYS54LCBheSA9IGEueSwgYXogPSBhLno7XG5cdFx0dmFyIGJ4ID0gYi54LCBieSA9IGIueSwgYnogPSBiLno7XG5cblx0XHR0aGlzLnggPSBheSAqIGJ6IC0gYXogKiBieTtcblx0XHR0aGlzLnkgPSBheiAqIGJ4IC0gYXggKiBiejtcblx0XHR0aGlzLnogPSBheCAqIGJ5IC0gYXkgKiBieDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cHJvamVjdE9uVmVjdG9yOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdHZhciBzY2FsYXIgPSB2ZWN0b3IuZG90KCB0aGlzICkgLyB2ZWN0b3IubGVuZ3RoU3EoKTtcblxuXHRcdHJldHVybiB0aGlzLmNvcHkoIHZlY3RvciApLm11bHRpcGx5U2NhbGFyKCBzY2FsYXIgKTtcblxuXHR9LFxuXG5cdHByb2plY3RPblBsYW5lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHByb2plY3RPblBsYW5lKCBwbGFuZU5vcm1hbCApIHtcblxuXHRcdFx0djEuY29weSggdGhpcyApLnByb2plY3RPblZlY3RvciggcGxhbmVOb3JtYWwgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc3ViKCB2MSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cmVmbGVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcmVmbGVjdCBpbmNpZGVudCB2ZWN0b3Igb2ZmIHBsYW5lIG9ydGhvZ29uYWwgdG8gbm9ybWFsXG5cdFx0Ly8gbm9ybWFsIGlzIGFzc3VtZWQgdG8gaGF2ZSB1bml0IGxlbmd0aFxuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByZWZsZWN0KCBub3JtYWwgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnN1YiggdjEuY29weSggbm9ybWFsICkubXVsdGlwbHlTY2FsYXIoIDIgKiB0aGlzLmRvdCggbm9ybWFsICkgKSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0YW5nbGVUbzogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dmFyIHRoZXRhID0gdGhpcy5kb3QoIHYgKSAvICggTWF0aC5zcXJ0KCB0aGlzLmxlbmd0aFNxKCkgKiB2Lmxlbmd0aFNxKCkgKSApO1xuXG5cdFx0Ly8gY2xhbXAsIHRvIGhhbmRsZSBudW1lcmljYWwgcHJvYmxlbXNcblxuXHRcdHJldHVybiBNYXRoLmFjb3MoIF9NYXRoLmNsYW1wKCB0aGV0YSwgLSAxLCAxICkgKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG86IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQoIHYgKSApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1NxdWFyZWQ6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHZhciBkeCA9IHRoaXMueCAtIHYueCwgZHkgPSB0aGlzLnkgLSB2LnksIGR6ID0gdGhpcy56IC0gdi56O1xuXG5cdFx0cmV0dXJuIGR4ICogZHggKyBkeSAqIGR5ICsgZHogKiBkejtcblxuXHR9LFxuXG5cdG1hbmhhdHRhbkRpc3RhbmNlVG86IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiBNYXRoLmFicyggdGhpcy54IC0gdi54ICkgKyBNYXRoLmFicyggdGhpcy55IC0gdi55ICkgKyBNYXRoLmFicyggdGhpcy56IC0gdi56ICk7XG5cblx0fSxcblxuXHRzZXRGcm9tU3BoZXJpY2FsOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR2YXIgc2luUGhpUmFkaXVzID0gTWF0aC5zaW4oIHMucGhpICkgKiBzLnJhZGl1cztcblxuXHRcdHRoaXMueCA9IHNpblBoaVJhZGl1cyAqIE1hdGguc2luKCBzLnRoZXRhICk7XG5cdFx0dGhpcy55ID0gTWF0aC5jb3MoIHMucGhpICkgKiBzLnJhZGl1cztcblx0XHR0aGlzLnogPSBzaW5QaGlSYWRpdXMgKiBNYXRoLmNvcyggcy50aGV0YSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tQ3lsaW5kcmljYWw6IGZ1bmN0aW9uICggYyApIHtcblxuXHRcdHRoaXMueCA9IGMucmFkaXVzICogTWF0aC5zaW4oIGMudGhldGEgKTtcblx0XHR0aGlzLnkgPSBjLnk7XG5cdFx0dGhpcy56ID0gYy5yYWRpdXMgKiBNYXRoLmNvcyggYy50aGV0YSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tTWF0cml4UG9zaXRpb246IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciBlID0gbS5lbGVtZW50cztcblxuXHRcdHRoaXMueCA9IGVbIDEyIF07XG5cdFx0dGhpcy55ID0gZVsgMTMgXTtcblx0XHR0aGlzLnogPSBlWyAxNCBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tTWF0cml4U2NhbGU6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciBzeCA9IHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMCApLmxlbmd0aCgpO1xuXHRcdHZhciBzeSA9IHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMSApLmxlbmd0aCgpO1xuXHRcdHZhciBzeiA9IHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMiApLmxlbmd0aCgpO1xuXG5cdFx0dGhpcy54ID0gc3g7XG5cdFx0dGhpcy55ID0gc3k7XG5cdFx0dGhpcy56ID0gc3o7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21NYXRyaXhDb2x1bW46IGZ1bmN0aW9uICggbSwgaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5mcm9tQXJyYXkoIG0uZWxlbWVudHMsIGluZGV4ICogNCApO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gKCAoIHYueCA9PT0gdGhpcy54ICkgJiYgKCB2LnkgPT09IHRoaXMueSApICYmICggdi56ID09PSB0aGlzLnogKSApO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHRoaXMueCA9IGFycmF5WyBvZmZzZXQgXTtcblx0XHR0aGlzLnkgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXHRcdHRoaXMueiA9IGFycmF5WyBvZmZzZXQgKyAyIF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLng7XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMueTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy56O1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0ZnJvbUJ1ZmZlckF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiBvZmZzZXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7XG5cdFx0dGhpcy55ID0gYXR0cmlidXRlLmdldFkoIGluZGV4ICk7XG5cdFx0dGhpcy56ID0gYXR0cmlidXRlLmdldFooIGluZGV4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gTWF0cml4MygpIHtcblxuXHR0aGlzLmVsZW1lbnRzID0gW1xuXG5cdFx0MSwgMCwgMCxcblx0XHQwLCAxLCAwLFxuXHRcdDAsIDAsIDFcblxuXHRdO1xuXG5cdGlmICggYXJndW1lbnRzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4MzogdGhlIGNvbnN0cnVjdG9yIG5vIGxvbmdlciByZWFkcyBhcmd1bWVudHMuIHVzZSAuc2V0KCkgaW5zdGVhZC4nICk7XG5cblx0fVxuXG59XG5cbk9iamVjdC5hc3NpZ24oIE1hdHJpeDMucHJvdG90eXBlLCB7XG5cblx0aXNNYXRyaXgzOiB0cnVlLFxuXG5cdHNldDogZnVuY3Rpb24gKCBuMTEsIG4xMiwgbjEzLCBuMjEsIG4yMiwgbjIzLCBuMzEsIG4zMiwgbjMzICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHRlWyAwIF0gPSBuMTE7IHRlWyAxIF0gPSBuMjE7IHRlWyAyIF0gPSBuMzE7XG5cdFx0dGVbIDMgXSA9IG4xMjsgdGVbIDQgXSA9IG4yMjsgdGVbIDUgXSA9IG4zMjtcblx0XHR0ZVsgNiBdID0gbjEzOyB0ZVsgNyBdID0gbjIzOyB0ZVsgOCBdID0gbjMzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRpZGVudGl0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdDEsIDAsIDAsXG5cdFx0XHQwLCAxLCAwLFxuXHRcdFx0MCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmZyb21BcnJheSggdGhpcy5lbGVtZW50cyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgbWUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSA9IG1lWyAwIF07IHRlWyAxIF0gPSBtZVsgMSBdOyB0ZVsgMiBdID0gbWVbIDIgXTtcblx0XHR0ZVsgMyBdID0gbWVbIDMgXTsgdGVbIDQgXSA9IG1lWyA0IF07IHRlWyA1IF0gPSBtZVsgNSBdO1xuXHRcdHRlWyA2IF0gPSBtZVsgNiBdOyB0ZVsgNyBdID0gbWVbIDcgXTsgdGVbIDggXSA9IG1lWyA4IF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21NYXRyaXg0OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHR2YXIgbWUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdG1lWyAwIF0sIG1lWyA0IF0sIG1lWyA4IF0sXG5cdFx0XHRtZVsgMSBdLCBtZVsgNSBdLCBtZVsgOSBdLFxuXHRcdFx0bWVbIDIgXSwgbWVbIDYgXSwgbWVbIDEwIF1cblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFwcGx5VG9CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHYxLnggPSBhdHRyaWJ1dGUuZ2V0WCggaSApO1xuXHRcdFx0XHR2MS55ID0gYXR0cmlidXRlLmdldFkoIGkgKTtcblx0XHRcdFx0djEueiA9IGF0dHJpYnV0ZS5nZXRaKCBpICk7XG5cblx0XHRcdFx0djEuYXBwbHlNYXRyaXgzKCB0aGlzICk7XG5cblx0XHRcdFx0YXR0cmlidXRlLnNldFhZWiggaSwgdjEueCwgdjEueSwgdjEueiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBhdHRyaWJ1dGU7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRtdWx0aXBseTogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggdGhpcywgbSApO1xuXG5cdH0sXG5cblx0cHJlbXVsdGlwbHk6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoIG0sIHRoaXMgKTtcblxuXHR9LFxuXG5cdG11bHRpcGx5TWF0cmljZXM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdHZhciBhZSA9IGEuZWxlbWVudHM7XG5cdFx0dmFyIGJlID0gYi5lbGVtZW50cztcblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dmFyIGExMSA9IGFlWyAwIF0sIGExMiA9IGFlWyAzIF0sIGExMyA9IGFlWyA2IF07XG5cdFx0dmFyIGEyMSA9IGFlWyAxIF0sIGEyMiA9IGFlWyA0IF0sIGEyMyA9IGFlWyA3IF07XG5cdFx0dmFyIGEzMSA9IGFlWyAyIF0sIGEzMiA9IGFlWyA1IF0sIGEzMyA9IGFlWyA4IF07XG5cblx0XHR2YXIgYjExID0gYmVbIDAgXSwgYjEyID0gYmVbIDMgXSwgYjEzID0gYmVbIDYgXTtcblx0XHR2YXIgYjIxID0gYmVbIDEgXSwgYjIyID0gYmVbIDQgXSwgYjIzID0gYmVbIDcgXTtcblx0XHR2YXIgYjMxID0gYmVbIDIgXSwgYjMyID0gYmVbIDUgXSwgYjMzID0gYmVbIDggXTtcblxuXHRcdHRlWyAwIF0gPSBhMTEgKiBiMTEgKyBhMTIgKiBiMjEgKyBhMTMgKiBiMzE7XG5cdFx0dGVbIDMgXSA9IGExMSAqIGIxMiArIGExMiAqIGIyMiArIGExMyAqIGIzMjtcblx0XHR0ZVsgNiBdID0gYTExICogYjEzICsgYTEyICogYjIzICsgYTEzICogYjMzO1xuXG5cdFx0dGVbIDEgXSA9IGEyMSAqIGIxMSArIGEyMiAqIGIyMSArIGEyMyAqIGIzMTtcblx0XHR0ZVsgNCBdID0gYTIxICogYjEyICsgYTIyICogYjIyICsgYTIzICogYjMyO1xuXHRcdHRlWyA3IF0gPSBhMjEgKiBiMTMgKyBhMjIgKiBiMjMgKyBhMjMgKiBiMzM7XG5cblx0XHR0ZVsgMiBdID0gYTMxICogYjExICsgYTMyICogYjIxICsgYTMzICogYjMxO1xuXHRcdHRlWyA1IF0gPSBhMzEgKiBiMTIgKyBhMzIgKiBiMjIgKyBhMzMgKiBiMzI7XG5cdFx0dGVbIDggXSA9IGEzMSAqIGIxMyArIGEzMiAqIGIyMyArIGEzMyAqIGIzMztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdICo9IHM7IHRlWyAzIF0gKj0gczsgdGVbIDYgXSAqPSBzO1xuXHRcdHRlWyAxIF0gKj0gczsgdGVbIDQgXSAqPSBzOyB0ZVsgNyBdICo9IHM7XG5cdFx0dGVbIDIgXSAqPSBzOyB0ZVsgNSBdICo9IHM7IHRlWyA4IF0gKj0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGV0ZXJtaW5hbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgYSA9IHRlWyAwIF0sIGIgPSB0ZVsgMSBdLCBjID0gdGVbIDIgXSxcblx0XHRcdGQgPSB0ZVsgMyBdLCBlID0gdGVbIDQgXSwgZiA9IHRlWyA1IF0sXG5cdFx0XHRnID0gdGVbIDYgXSwgaCA9IHRlWyA3IF0sIGkgPSB0ZVsgOCBdO1xuXG5cdFx0cmV0dXJuIGEgKiBlICogaSAtIGEgKiBmICogaCAtIGIgKiBkICogaSArIGIgKiBmICogZyArIGMgKiBkICogaCAtIGMgKiBlICogZztcblxuXHR9LFxuXG5cdGdldEludmVyc2U6IGZ1bmN0aW9uICggbWF0cml4LCB0aHJvd09uRGVnZW5lcmF0ZSApIHtcblxuXHRcdGlmICggbWF0cml4ICYmIG1hdHJpeC5pc01hdHJpeDQgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoIFwiVEhSRUUuTWF0cml4MzogLmdldEludmVyc2UoKSBubyBsb25nZXIgdGFrZXMgYSBNYXRyaXg0IGFyZ3VtZW50LlwiICk7XG5cblx0XHR9XG5cblx0XHR2YXIgbWUgPSBtYXRyaXguZWxlbWVudHMsXG5cdFx0XHR0ZSA9IHRoaXMuZWxlbWVudHMsXG5cblx0XHRcdG4xMSA9IG1lWyAwIF0sIG4yMSA9IG1lWyAxIF0sIG4zMSA9IG1lWyAyIF0sXG5cdFx0XHRuMTIgPSBtZVsgMyBdLCBuMjIgPSBtZVsgNCBdLCBuMzIgPSBtZVsgNSBdLFxuXHRcdFx0bjEzID0gbWVbIDYgXSwgbjIzID0gbWVbIDcgXSwgbjMzID0gbWVbIDggXSxcblxuXHRcdFx0dDExID0gbjMzICogbjIyIC0gbjMyICogbjIzLFxuXHRcdFx0dDEyID0gbjMyICogbjEzIC0gbjMzICogbjEyLFxuXHRcdFx0dDEzID0gbjIzICogbjEyIC0gbjIyICogbjEzLFxuXG5cdFx0XHRkZXQgPSBuMTEgKiB0MTEgKyBuMjEgKiB0MTIgKyBuMzEgKiB0MTM7XG5cblx0XHRpZiAoIGRldCA9PT0gMCApIHtcblxuXHRcdFx0dmFyIG1zZyA9IFwiVEhSRUUuTWF0cml4MzogLmdldEludmVyc2UoKSBjYW4ndCBpbnZlcnQgbWF0cml4LCBkZXRlcm1pbmFudCBpcyAwXCI7XG5cblx0XHRcdGlmICggdGhyb3dPbkRlZ2VuZXJhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCBtc2cgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oIG1zZyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLmlkZW50aXR5KCk7XG5cblx0XHR9XG5cblx0XHR2YXIgZGV0SW52ID0gMSAvIGRldDtcblxuXHRcdHRlWyAwIF0gPSB0MTEgKiBkZXRJbnY7XG5cdFx0dGVbIDEgXSA9ICggbjMxICogbjIzIC0gbjMzICogbjIxICkgKiBkZXRJbnY7XG5cdFx0dGVbIDIgXSA9ICggbjMyICogbjIxIC0gbjMxICogbjIyICkgKiBkZXRJbnY7XG5cblx0XHR0ZVsgMyBdID0gdDEyICogZGV0SW52O1xuXHRcdHRlWyA0IF0gPSAoIG4zMyAqIG4xMSAtIG4zMSAqIG4xMyApICogZGV0SW52O1xuXHRcdHRlWyA1IF0gPSAoIG4zMSAqIG4xMiAtIG4zMiAqIG4xMSApICogZGV0SW52O1xuXG5cdFx0dGVbIDYgXSA9IHQxMyAqIGRldEludjtcblx0XHR0ZVsgNyBdID0gKCBuMjEgKiBuMTMgLSBuMjMgKiBuMTEgKSAqIGRldEludjtcblx0XHR0ZVsgOCBdID0gKCBuMjIgKiBuMTEgLSBuMjEgKiBuMTIgKSAqIGRldEludjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dHJhbnNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdG1wLCBtID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHRtcCA9IG1bIDEgXTsgbVsgMSBdID0gbVsgMyBdOyBtWyAzIF0gPSB0bXA7XG5cdFx0dG1wID0gbVsgMiBdOyBtWyAyIF0gPSBtWyA2IF07IG1bIDYgXSA9IHRtcDtcblx0XHR0bXAgPSBtWyA1IF07IG1bIDUgXSA9IG1bIDcgXTsgbVsgNyBdID0gdG1wO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXROb3JtYWxNYXRyaXg6IGZ1bmN0aW9uICggbWF0cml4NCApIHtcblxuXHRcdHJldHVybiB0aGlzLnNldEZyb21NYXRyaXg0KCBtYXRyaXg0ICkuZ2V0SW52ZXJzZSggdGhpcyApLnRyYW5zcG9zZSgpO1xuXG5cdH0sXG5cblx0dHJhbnNwb3NlSW50b0FycmF5OiBmdW5jdGlvbiAoIHIgKSB7XG5cblx0XHR2YXIgbSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRyWyAwIF0gPSBtWyAwIF07XG5cdFx0clsgMSBdID0gbVsgMyBdO1xuXHRcdHJbIDIgXSA9IG1bIDYgXTtcblx0XHRyWyAzIF0gPSBtWyAxIF07XG5cdFx0clsgNCBdID0gbVsgNCBdO1xuXHRcdHJbIDUgXSA9IG1bIDcgXTtcblx0XHRyWyA2IF0gPSBtWyAyIF07XG5cdFx0clsgNyBdID0gbVsgNSBdO1xuXHRcdHJbIDggXSA9IG1bIDggXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0VXZUcmFuc2Zvcm06IGZ1bmN0aW9uICggdHgsIHR5LCBzeCwgc3ksIHJvdGF0aW9uLCBjeCwgY3kgKSB7XG5cblx0XHR2YXIgYyA9IE1hdGguY29zKCByb3RhdGlvbiApO1xuXHRcdHZhciBzID0gTWF0aC5zaW4oIHJvdGF0aW9uICk7XG5cblx0XHR0aGlzLnNldChcblx0XHRcdHN4ICogYywgc3ggKiBzLCAtIHN4ICogKCBjICogY3ggKyBzICogY3kgKSArIGN4ICsgdHgsXG5cdFx0XHQtIHN5ICogcywgc3kgKiBjLCAtIHN5ICogKCAtIHMgKiBjeCArIGMgKiBjeSApICsgY3kgKyB0eSxcblx0XHRcdDAsIDAsIDFcblx0XHQpO1xuXG5cdH0sXG5cblx0c2NhbGU6IGZ1bmN0aW9uICggc3gsIHN5ICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHRlWyAwIF0gKj0gc3g7IHRlWyAzIF0gKj0gc3g7IHRlWyA2IF0gKj0gc3g7XG5cdFx0dGVbIDEgXSAqPSBzeTsgdGVbIDQgXSAqPSBzeTsgdGVbIDcgXSAqPSBzeTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm90YXRlOiBmdW5jdGlvbiAoIHRoZXRhICkge1xuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggdGhldGEgKTtcblx0XHR2YXIgcyA9IE1hdGguc2luKCB0aGV0YSApO1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHZhciBhMTEgPSB0ZVsgMCBdLCBhMTIgPSB0ZVsgMyBdLCBhMTMgPSB0ZVsgNiBdO1xuXHRcdHZhciBhMjEgPSB0ZVsgMSBdLCBhMjIgPSB0ZVsgNCBdLCBhMjMgPSB0ZVsgNyBdO1xuXG5cdFx0dGVbIDAgXSA9IGMgKiBhMTEgKyBzICogYTIxO1xuXHRcdHRlWyAzIF0gPSBjICogYTEyICsgcyAqIGEyMjtcblx0XHR0ZVsgNiBdID0gYyAqIGExMyArIHMgKiBhMjM7XG5cblx0XHR0ZVsgMSBdID0gLSBzICogYTExICsgYyAqIGEyMTtcblx0XHR0ZVsgNCBdID0gLSBzICogYTEyICsgYyAqIGEyMjtcblx0XHR0ZVsgNyBdID0gLSBzICogYTEzICsgYyAqIGEyMztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoIHR4LCB0eSApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdICs9IHR4ICogdGVbIDIgXTsgdGVbIDMgXSArPSB0eCAqIHRlWyA1IF07IHRlWyA2IF0gKz0gdHggKiB0ZVsgOCBdO1xuXHRcdHRlWyAxIF0gKz0gdHkgKiB0ZVsgMiBdOyB0ZVsgNCBdICs9IHR5ICogdGVbIDUgXTsgdGVbIDcgXSArPSB0eSAqIHRlWyA4IF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciBtZSA9IG1hdHJpeC5lbGVtZW50cztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDk7IGkgKysgKSB7XG5cblx0XHRcdGlmICggdGVbIGkgXSAhPT0gbWVbIGkgXSApIHJldHVybiBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDk7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuZWxlbWVudHNbIGkgXSA9IGFycmF5WyBpICsgb2Zmc2V0IF07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGVbIDAgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGVbIDEgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGVbIDIgXTtcblxuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0ZVsgMyBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA0IF0gPSB0ZVsgNCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA1IF0gPSB0ZVsgNSBdO1xuXG5cdFx0YXJyYXlbIG9mZnNldCArIDYgXSA9IHRlWyA2IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDcgXSA9IHRlWyA3IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDggXSA9IHRlWyA4IF07XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIHN6aW1layAvIGh0dHBzOi8vZ2l0aHViLmNvbS9zemltZWsvXG4gKi9cblxudmFyIHRleHR1cmVJZCA9IDA7XG5cbmZ1bmN0aW9uIFRleHR1cmUoIGltYWdlLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGVuY29kaW5nICkge1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogdGV4dHVyZUlkICsrIH0gKTtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHR0aGlzLm5hbWUgPSAnJztcblxuXHR0aGlzLmltYWdlID0gaW1hZ2UgIT09IHVuZGVmaW5lZCA/IGltYWdlIDogVGV4dHVyZS5ERUZBVUxUX0lNQUdFO1xuXHR0aGlzLm1pcG1hcHMgPSBbXTtcblxuXHR0aGlzLm1hcHBpbmcgPSBtYXBwaW5nICE9PSB1bmRlZmluZWQgPyBtYXBwaW5nIDogVGV4dHVyZS5ERUZBVUxUX01BUFBJTkc7XG5cblx0dGhpcy53cmFwUyA9IHdyYXBTICE9PSB1bmRlZmluZWQgPyB3cmFwUyA6IENsYW1wVG9FZGdlV3JhcHBpbmc7XG5cdHRoaXMud3JhcFQgPSB3cmFwVCAhPT0gdW5kZWZpbmVkID8gd3JhcFQgOiBDbGFtcFRvRWRnZVdyYXBwaW5nO1xuXG5cdHRoaXMubWFnRmlsdGVyID0gbWFnRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtYWdGaWx0ZXIgOiBMaW5lYXJGaWx0ZXI7XG5cdHRoaXMubWluRmlsdGVyID0gbWluRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtaW5GaWx0ZXIgOiBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXI7XG5cblx0dGhpcy5hbmlzb3Ryb3B5ID0gYW5pc290cm9weSAhPT0gdW5kZWZpbmVkID8gYW5pc290cm9weSA6IDE7XG5cblx0dGhpcy5mb3JtYXQgPSBmb3JtYXQgIT09IHVuZGVmaW5lZCA/IGZvcm1hdCA6IFJHQkFGb3JtYXQ7XG5cdHRoaXMudHlwZSA9IHR5cGUgIT09IHVuZGVmaW5lZCA/IHR5cGUgOiBVbnNpZ25lZEJ5dGVUeXBlO1xuXG5cdHRoaXMub2Zmc2V0ID0gbmV3IFZlY3RvcjIoIDAsIDAgKTtcblx0dGhpcy5yZXBlYXQgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXHR0aGlzLmNlbnRlciA9IG5ldyBWZWN0b3IyKCAwLCAwICk7XG5cdHRoaXMucm90YXRpb24gPSAwO1xuXG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IHRydWU7XG5cdHRoaXMubWF0cml4ID0gbmV3IE1hdHJpeDMoKTtcblxuXHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IHRydWU7XG5cdHRoaXMucHJlbXVsdGlwbHlBbHBoYSA9IGZhbHNlO1xuXHR0aGlzLmZsaXBZID0gdHJ1ZTtcblx0dGhpcy51bnBhY2tBbGlnbm1lbnQgPSA0O1x0Ly8gdmFsaWQgdmFsdWVzOiAxLCAyLCA0LCA4IChzZWUgaHR0cDovL3d3dy5raHJvbm9zLm9yZy9vcGVuZ2xlcy9zZGsvZG9jcy9tYW4veGh0bWwvZ2xQaXhlbFN0b3JlaS54bWwpXG5cblx0Ly8gVmFsdWVzIG9mIGVuY29kaW5nICE9PSBUSFJFRS5MaW5lYXJFbmNvZGluZyBvbmx5IHN1cHBvcnRlZCBvbiBtYXAsIGVudk1hcCBhbmQgZW1pc3NpdmVNYXAuXG5cdC8vXG5cdC8vIEFsc28gY2hhbmdpbmcgdGhlIGVuY29kaW5nIGFmdGVyIGFscmVhZHkgdXNlZCBieSBhIE1hdGVyaWFsIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgbWFrZSB0aGUgTWF0ZXJpYWxcblx0Ly8gdXBkYXRlLiAgWW91IG5lZWQgdG8gZXhwbGljaXRseSBjYWxsIE1hdGVyaWFsLm5lZWRzVXBkYXRlIHRvIHRyaWdnZXIgaXQgdG8gcmVjb21waWxlLlxuXHR0aGlzLmVuY29kaW5nID0gZW5jb2RpbmcgIT09IHVuZGVmaW5lZCA/IGVuY29kaW5nIDogTGluZWFyRW5jb2Rpbmc7XG5cblx0dGhpcy52ZXJzaW9uID0gMDtcblx0dGhpcy5vblVwZGF0ZSA9IG51bGw7XG5cbn1cblxuVGV4dHVyZS5ERUZBVUxUX0lNQUdFID0gdW5kZWZpbmVkO1xuVGV4dHVyZS5ERUZBVUxUX01BUFBJTkcgPSBVVk1hcHBpbmc7XG5cblRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFRleHR1cmUsXG5cblx0aXNUZXh0dXJlOiB0cnVlLFxuXG5cdHVwZGF0ZU1hdHJpeDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5tYXRyaXguc2V0VXZUcmFuc2Zvcm0oIHRoaXMub2Zmc2V0LngsIHRoaXMub2Zmc2V0LnksIHRoaXMucmVwZWF0LngsIHRoaXMucmVwZWF0LnksIHRoaXMucm90YXRpb24sIHRoaXMuY2VudGVyLngsIHRoaXMuY2VudGVyLnkgKTtcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdHRoaXMubmFtZSA9IHNvdXJjZS5uYW1lO1xuXG5cdFx0dGhpcy5pbWFnZSA9IHNvdXJjZS5pbWFnZTtcblx0XHR0aGlzLm1pcG1hcHMgPSBzb3VyY2UubWlwbWFwcy5zbGljZSggMCApO1xuXG5cdFx0dGhpcy5tYXBwaW5nID0gc291cmNlLm1hcHBpbmc7XG5cblx0XHR0aGlzLndyYXBTID0gc291cmNlLndyYXBTO1xuXHRcdHRoaXMud3JhcFQgPSBzb3VyY2Uud3JhcFQ7XG5cblx0XHR0aGlzLm1hZ0ZpbHRlciA9IHNvdXJjZS5tYWdGaWx0ZXI7XG5cdFx0dGhpcy5taW5GaWx0ZXIgPSBzb3VyY2UubWluRmlsdGVyO1xuXG5cdFx0dGhpcy5hbmlzb3Ryb3B5ID0gc291cmNlLmFuaXNvdHJvcHk7XG5cblx0XHR0aGlzLmZvcm1hdCA9IHNvdXJjZS5mb3JtYXQ7XG5cdFx0dGhpcy50eXBlID0gc291cmNlLnR5cGU7XG5cblx0XHR0aGlzLm9mZnNldC5jb3B5KCBzb3VyY2Uub2Zmc2V0ICk7XG5cdFx0dGhpcy5yZXBlYXQuY29weSggc291cmNlLnJlcGVhdCApO1xuXHRcdHRoaXMuY2VudGVyLmNvcHkoIHNvdXJjZS5jZW50ZXIgKTtcblx0XHR0aGlzLnJvdGF0aW9uID0gc291cmNlLnJvdGF0aW9uO1xuXG5cdFx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gc291cmNlLm1hdHJpeEF1dG9VcGRhdGU7XG5cdFx0dGhpcy5tYXRyaXguY29weSggc291cmNlLm1hdHJpeCApO1xuXG5cdFx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBzb3VyY2UuZ2VuZXJhdGVNaXBtYXBzO1xuXHRcdHRoaXMucHJlbXVsdGlwbHlBbHBoYSA9IHNvdXJjZS5wcmVtdWx0aXBseUFscGhhO1xuXHRcdHRoaXMuZmxpcFkgPSBzb3VyY2UuZmxpcFk7XG5cdFx0dGhpcy51bnBhY2tBbGlnbm1lbnQgPSBzb3VyY2UudW5wYWNrQWxpZ25tZW50O1xuXHRcdHRoaXMuZW5jb2RpbmcgPSBzb3VyY2UuZW5jb2Rpbmc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGlzUm9vdE9iamVjdCA9ICggbWV0YSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBtZXRhID09PSAnc3RyaW5nJyApO1xuXG5cdFx0aWYgKCAhIGlzUm9vdE9iamVjdCAmJiBtZXRhLnRleHR1cmVzWyB0aGlzLnV1aWQgXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRyZXR1cm4gbWV0YS50ZXh0dXJlc1sgdGhpcy51dWlkIF07XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXREYXRhVVJMKCBpbWFnZSApIHtcblxuXHRcdFx0dmFyIGNhbnZhcztcblxuXHRcdFx0aWYgKCBpbWFnZSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50ICkge1xuXG5cdFx0XHRcdGNhbnZhcyA9IGltYWdlO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnY2FudmFzJyApO1xuXHRcdFx0XHRjYW52YXMud2lkdGggPSBpbWFnZS53aWR0aDtcblx0XHRcdFx0Y2FudmFzLmhlaWdodCA9IGltYWdlLmhlaWdodDtcblxuXHRcdFx0XHR2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCAnMmQnICk7XG5cblx0XHRcdFx0aWYgKCBpbWFnZSBpbnN0YW5jZW9mIEltYWdlRGF0YSApIHtcblxuXHRcdFx0XHRcdGNvbnRleHQucHV0SW1hZ2VEYXRhKCBpbWFnZSwgMCwgMCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjb250ZXh0LmRyYXdJbWFnZSggaW1hZ2UsIDAsIDAsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBjYW52YXMud2lkdGggPiAyMDQ4IHx8IGNhbnZhcy5oZWlnaHQgPiAyMDQ4ICkge1xuXG5cdFx0XHRcdHJldHVybiBjYW52YXMudG9EYXRhVVJMKCAnaW1hZ2UvanBlZycsIDAuNiApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJldHVybiBjYW52YXMudG9EYXRhVVJMKCAnaW1hZ2UvcG5nJyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgb3V0cHV0ID0ge1xuXG5cdFx0XHRtZXRhZGF0YToge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdUZXh0dXJlJyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnVGV4dHVyZS50b0pTT04nXG5cdFx0XHR9LFxuXG5cdFx0XHR1dWlkOiB0aGlzLnV1aWQsXG5cdFx0XHRuYW1lOiB0aGlzLm5hbWUsXG5cblx0XHRcdG1hcHBpbmc6IHRoaXMubWFwcGluZyxcblxuXHRcdFx0cmVwZWF0OiBbIHRoaXMucmVwZWF0LngsIHRoaXMucmVwZWF0LnkgXSxcblx0XHRcdG9mZnNldDogWyB0aGlzLm9mZnNldC54LCB0aGlzLm9mZnNldC55IF0sXG5cdFx0XHRjZW50ZXI6IFsgdGhpcy5jZW50ZXIueCwgdGhpcy5jZW50ZXIueSBdLFxuXHRcdFx0cm90YXRpb246IHRoaXMucm90YXRpb24sXG5cblx0XHRcdHdyYXA6IFsgdGhpcy53cmFwUywgdGhpcy53cmFwVCBdLFxuXG5cdFx0XHRmb3JtYXQ6IHRoaXMuZm9ybWF0LFxuXHRcdFx0bWluRmlsdGVyOiB0aGlzLm1pbkZpbHRlcixcblx0XHRcdG1hZ0ZpbHRlcjogdGhpcy5tYWdGaWx0ZXIsXG5cdFx0XHRhbmlzb3Ryb3B5OiB0aGlzLmFuaXNvdHJvcHksXG5cblx0XHRcdGZsaXBZOiB0aGlzLmZsaXBZXG5cblx0XHR9O1xuXG5cdFx0aWYgKCB0aGlzLmltYWdlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIFRPRE86IE1vdmUgdG8gVEhSRUUuSW1hZ2VcblxuXHRcdFx0dmFyIGltYWdlID0gdGhpcy5pbWFnZTtcblxuXHRcdFx0aWYgKCBpbWFnZS51dWlkID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0aW1hZ2UudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpOyAvLyBVR0hcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoICEgaXNSb290T2JqZWN0ICYmIG1ldGEuaW1hZ2VzWyBpbWFnZS51dWlkIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtZXRhLmltYWdlc1sgaW1hZ2UudXVpZCBdID0ge1xuXHRcdFx0XHRcdHV1aWQ6IGltYWdlLnV1aWQsXG5cdFx0XHRcdFx0dXJsOiBnZXREYXRhVVJMKCBpbWFnZSApXG5cdFx0XHRcdH07XG5cblx0XHRcdH1cblxuXHRcdFx0b3V0cHV0LmltYWdlID0gaW1hZ2UudXVpZDtcblxuXHRcdH1cblxuXHRcdGlmICggISBpc1Jvb3RPYmplY3QgKSB7XG5cblx0XHRcdG1ldGEudGV4dHVyZXNbIHRoaXMudXVpZCBdID0gb3V0cHV0O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG91dHB1dDtcblxuXHR9LFxuXG5cdGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApO1xuXG5cdH0sXG5cblx0dHJhbnNmb3JtVXY6IGZ1bmN0aW9uICggdXYgKSB7XG5cblx0XHRpZiAoIHRoaXMubWFwcGluZyAhPT0gVVZNYXBwaW5nICkgcmV0dXJuO1xuXG5cdFx0dXYuYXBwbHlNYXRyaXgzKCB0aGlzLm1hdHJpeCApO1xuXG5cdFx0aWYgKCB1di54IDwgMCB8fCB1di54ID4gMSApIHtcblxuXHRcdFx0c3dpdGNoICggdGhpcy53cmFwUyApIHtcblxuXHRcdFx0XHRjYXNlIFJlcGVhdFdyYXBwaW5nOlxuXG5cdFx0XHRcdFx0dXYueCA9IHV2LnggLSBNYXRoLmZsb29yKCB1di54ICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBDbGFtcFRvRWRnZVdyYXBwaW5nOlxuXG5cdFx0XHRcdFx0dXYueCA9IHV2LnggPCAwID8gMCA6IDE7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOlxuXG5cdFx0XHRcdFx0aWYgKCBNYXRoLmFicyggTWF0aC5mbG9vciggdXYueCApICUgMiApID09PSAxICkge1xuXG5cdFx0XHRcdFx0XHR1di54ID0gTWF0aC5jZWlsKCB1di54ICkgLSB1di54O1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0dXYueCA9IHV2LnggLSBNYXRoLmZsb29yKCB1di54ICk7XG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdXYueSA8IDAgfHwgdXYueSA+IDEgKSB7XG5cblx0XHRcdHN3aXRjaCAoIHRoaXMud3JhcFQgKSB7XG5cblx0XHRcdFx0Y2FzZSBSZXBlYXRXcmFwcGluZzpcblxuXHRcdFx0XHRcdHV2LnkgPSB1di55IC0gTWF0aC5mbG9vciggdXYueSApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgQ2xhbXBUb0VkZ2VXcmFwcGluZzpcblxuXHRcdFx0XHRcdHV2LnkgPSB1di55IDwgMCA/IDAgOiAxO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWlycm9yZWRSZXBlYXRXcmFwcGluZzpcblxuXHRcdFx0XHRcdGlmICggTWF0aC5hYnMoIE1hdGguZmxvb3IoIHV2LnkgKSAlIDIgKSA9PT0gMSApIHtcblxuXHRcdFx0XHRcdFx0dXYueSA9IE1hdGguY2VpbCggdXYueSApIC0gdXYueTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHV2LnkgPSB1di55IC0gTWF0aC5mbG9vciggdXYueSApO1xuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuZmxpcFkgKSB7XG5cblx0XHRcdHV2LnkgPSAxIC0gdXYueTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KCBUZXh0dXJlLnByb3RvdHlwZSwgXCJuZWVkc1VwZGF0ZVwiLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMudmVyc2lvbiArKztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIHN1cGVyZWdnYmVydCAvIGh0dHA6Ly93d3cucGF1bGJydW50LmNvLnVrL1xuICogQGF1dGhvciBwaGlsb2diIC8gaHR0cDovL2Jsb2cudGhlaml0Lm9yZy9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGVncmFldGhlciAvIGh0dHA6Ly9lZ3JhZXRoZXIuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gVmVjdG9yNCggeCwgeSwgeiwgdyApIHtcblxuXHR0aGlzLnggPSB4IHx8IDA7XG5cdHRoaXMueSA9IHkgfHwgMDtcblx0dGhpcy56ID0geiB8fCAwO1xuXHR0aGlzLncgPSAoIHcgIT09IHVuZGVmaW5lZCApID8gdyA6IDE7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yNC5wcm90b3R5cGUsIHtcblxuXHRpc1ZlY3RvcjQ6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIHgsIHksIHosIHcgKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXHRcdHRoaXMueSA9IHk7XG5cdFx0dGhpcy56ID0gejtcblx0XHR0aGlzLncgPSB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy54ID0gc2NhbGFyO1xuXHRcdHRoaXMueSA9IHNjYWxhcjtcblx0XHR0aGlzLnogPSBzY2FsYXI7XG5cdFx0dGhpcy53ID0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYOiBmdW5jdGlvbiAoIHggKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRZOiBmdW5jdGlvbiAoIHkgKSB7XG5cblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRaOiBmdW5jdGlvbiAoIHogKSB7XG5cblx0XHR0aGlzLnogPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRXOiBmdW5jdGlvbiAoIHcgKSB7XG5cblx0XHR0aGlzLncgPSB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRDb21wb25lbnQ6IGZ1bmN0aW9uICggaW5kZXgsIHZhbHVlICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogdGhpcy54ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAxOiB0aGlzLnkgPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDI6IHRoaXMueiA9IHZhbHVlOyBicmVhaztcblx0XHRcdGNhc2UgMzogdGhpcy53ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogcmV0dXJuIHRoaXMueDtcblx0XHRcdGNhc2UgMTogcmV0dXJuIHRoaXMueTtcblx0XHRcdGNhc2UgMjogcmV0dXJuIHRoaXMuejtcblx0XHRcdGNhc2UgMzogcmV0dXJuIHRoaXMudztcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLngsIHRoaXMueSwgdGhpcy56LCB0aGlzLncgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IHYueDtcblx0XHR0aGlzLnkgPSB2Lnk7XG5cdFx0dGhpcy56ID0gdi56O1xuXHRcdHRoaXMudyA9ICggdi53ICE9PSB1bmRlZmluZWQgKSA/IHYudyA6IDE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5hZGRWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggKz0gdi54O1xuXHRcdHRoaXMueSArPSB2Lnk7XG5cdFx0dGhpcy56ICs9IHYuejtcblx0XHR0aGlzLncgKz0gdi53O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMueCArPSBzO1xuXHRcdHRoaXMueSArPSBzO1xuXHRcdHRoaXMueiArPSBzO1xuXHRcdHRoaXMudyArPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggKyBiLng7XG5cdFx0dGhpcy55ID0gYS55ICsgYi55O1xuXHRcdHRoaXMueiA9IGEueiArIGIuejtcblx0XHR0aGlzLncgPSBhLncgKyBiLnc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZFNjYWxlZFZlY3RvcjogZnVuY3Rpb24gKCB2LCBzICkge1xuXG5cdFx0dGhpcy54ICs9IHYueCAqIHM7XG5cdFx0dGhpcy55ICs9IHYueSAqIHM7XG5cdFx0dGhpcy56ICs9IHYueiAqIHM7XG5cdFx0dGhpcy53ICs9IHYudyAqIHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YjogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggLT0gdi54O1xuXHRcdHRoaXMueSAtPSB2Lnk7XG5cdFx0dGhpcy56IC09IHYuejtcblx0XHR0aGlzLncgLT0gdi53O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWJTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMueCAtPSBzO1xuXHRcdHRoaXMueSAtPSBzO1xuXHRcdHRoaXMueiAtPSBzO1xuXHRcdHRoaXMudyAtPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWJWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggLSBiLng7XG5cdFx0dGhpcy55ID0gYS55IC0gYi55O1xuXHRcdHRoaXMueiA9IGEueiAtIGIuejtcblx0XHR0aGlzLncgPSBhLncgLSBiLnc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMueCAqPSBzY2FsYXI7XG5cdFx0dGhpcy55ICo9IHNjYWxhcjtcblx0XHR0aGlzLnogKj0gc2NhbGFyO1xuXHRcdHRoaXMudyAqPSBzY2FsYXI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLnosIHcgPSB0aGlzLnc7XG5cdFx0dmFyIGUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGhpcy54ID0gZVsgMCBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA4IF0gKiB6ICsgZVsgMTIgXSAqIHc7XG5cdFx0dGhpcy55ID0gZVsgMSBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA5IF0gKiB6ICsgZVsgMTMgXSAqIHc7XG5cdFx0dGhpcy56ID0gZVsgMiBdICogeCArIGVbIDYgXSAqIHkgKyBlWyAxMCBdICogeiArIGVbIDE0IF0gKiB3O1xuXHRcdHRoaXMudyA9IGVbIDMgXSAqIHggKyBlWyA3IF0gKiB5ICsgZVsgMTEgXSAqIHogKyBlWyAxNSBdICogdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGl2aWRlU2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCAxIC8gc2NhbGFyICk7XG5cblx0fSxcblxuXHRzZXRBeGlzQW5nbGVGcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvZ2VvbWV0cnkvcm90YXRpb25zL2NvbnZlcnNpb25zL3F1YXRlcm5pb25Ub0FuZ2xlL2luZGV4Lmh0bVxuXG5cdFx0Ly8gcSBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRcdHRoaXMudyA9IDIgKiBNYXRoLmFjb3MoIHEudyApO1xuXG5cdFx0dmFyIHMgPSBNYXRoLnNxcnQoIDEgLSBxLncgKiBxLncgKTtcblxuXHRcdGlmICggcyA8IDAuMDAwMSApIHtcblxuXHRcdFx0dGhpcy54ID0gMTtcblx0XHRcdHRoaXMueSA9IDA7XG5cdFx0XHR0aGlzLnogPSAwO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy54ID0gcS54IC8gcztcblx0XHRcdHRoaXMueSA9IHEueSAvIHM7XG5cdFx0XHR0aGlzLnogPSBxLnogLyBzO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRBeGlzQW5nbGVGcm9tUm90YXRpb25NYXRyaXg6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdC8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2dlb21ldHJ5L3JvdGF0aW9ucy9jb252ZXJzaW9ucy9tYXRyaXhUb0FuZ2xlL2luZGV4Lmh0bVxuXG5cdFx0Ly8gYXNzdW1lcyB0aGUgdXBwZXIgM3gzIG9mIG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZClcblxuXHRcdHZhciBhbmdsZSwgeCwgeSwgeixcdFx0Ly8gdmFyaWFibGVzIGZvciByZXN1bHRcblx0XHRcdGVwc2lsb24gPSAwLjAxLFx0XHQvLyBtYXJnaW4gdG8gYWxsb3cgZm9yIHJvdW5kaW5nIGVycm9yc1xuXHRcdFx0ZXBzaWxvbjIgPSAwLjEsXHRcdC8vIG1hcmdpbiB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIDAgYW5kIDE4MCBkZWdyZWVzXG5cblx0XHRcdHRlID0gbS5lbGVtZW50cyxcblxuXHRcdFx0bTExID0gdGVbIDAgXSwgbTEyID0gdGVbIDQgXSwgbTEzID0gdGVbIDggXSxcblx0XHRcdG0yMSA9IHRlWyAxIF0sIG0yMiA9IHRlWyA1IF0sIG0yMyA9IHRlWyA5IF0sXG5cdFx0XHRtMzEgPSB0ZVsgMiBdLCBtMzIgPSB0ZVsgNiBdLCBtMzMgPSB0ZVsgMTAgXTtcblxuXHRcdGlmICggKCBNYXRoLmFicyggbTEyIC0gbTIxICkgPCBlcHNpbG9uICkgJiZcblx0XHQgICAgICggTWF0aC5hYnMoIG0xMyAtIG0zMSApIDwgZXBzaWxvbiApICYmXG5cdFx0ICAgICAoIE1hdGguYWJzKCBtMjMgLSBtMzIgKSA8IGVwc2lsb24gKSApIHtcblxuXHRcdFx0Ly8gc2luZ3VsYXJpdHkgZm91bmRcblx0XHRcdC8vIGZpcnN0IGNoZWNrIGZvciBpZGVudGl0eSBtYXRyaXggd2hpY2ggbXVzdCBoYXZlICsxIGZvciBhbGwgdGVybXNcblx0XHRcdC8vIGluIGxlYWRpbmcgZGlhZ29uYWwgYW5kIHplcm8gaW4gb3RoZXIgdGVybXNcblxuXHRcdFx0aWYgKCAoIE1hdGguYWJzKCBtMTIgKyBtMjEgKSA8IGVwc2lsb24yICkgJiZcblx0XHRcdCAgICAgKCBNYXRoLmFicyggbTEzICsgbTMxICkgPCBlcHNpbG9uMiApICYmXG5cdFx0XHQgICAgICggTWF0aC5hYnMoIG0yMyArIG0zMiApIDwgZXBzaWxvbjIgKSAmJlxuXHRcdFx0ICAgICAoIE1hdGguYWJzKCBtMTEgKyBtMjIgKyBtMzMgLSAzICkgPCBlcHNpbG9uMiApICkge1xuXG5cdFx0XHRcdC8vIHRoaXMgc2luZ3VsYXJpdHkgaXMgaWRlbnRpdHkgbWF0cml4IHNvIGFuZ2xlID0gMFxuXG5cdFx0XHRcdHRoaXMuc2V0KCAxLCAwLCAwLCAwICk7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXM7IC8vIHplcm8gYW5nbGUsIGFyYml0cmFyeSBheGlzXG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gb3RoZXJ3aXNlIHRoaXMgc2luZ3VsYXJpdHkgaXMgYW5nbGUgPSAxODBcblxuXHRcdFx0YW5nbGUgPSBNYXRoLlBJO1xuXG5cdFx0XHR2YXIgeHggPSAoIG0xMSArIDEgKSAvIDI7XG5cdFx0XHR2YXIgeXkgPSAoIG0yMiArIDEgKSAvIDI7XG5cdFx0XHR2YXIgenogPSAoIG0zMyArIDEgKSAvIDI7XG5cdFx0XHR2YXIgeHkgPSAoIG0xMiArIG0yMSApIC8gNDtcblx0XHRcdHZhciB4eiA9ICggbTEzICsgbTMxICkgLyA0O1xuXHRcdFx0dmFyIHl6ID0gKCBtMjMgKyBtMzIgKSAvIDQ7XG5cblx0XHRcdGlmICggKCB4eCA+IHl5ICkgJiYgKCB4eCA+IHp6ICkgKSB7XG5cblx0XHRcdFx0Ly8gbTExIGlzIHRoZSBsYXJnZXN0IGRpYWdvbmFsIHRlcm1cblxuXHRcdFx0XHRpZiAoIHh4IDwgZXBzaWxvbiApIHtcblxuXHRcdFx0XHRcdHggPSAwO1xuXHRcdFx0XHRcdHkgPSAwLjcwNzEwNjc4MTtcblx0XHRcdFx0XHR6ID0gMC43MDcxMDY3ODE7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHggPSBNYXRoLnNxcnQoIHh4ICk7XG5cdFx0XHRcdFx0eSA9IHh5IC8geDtcblx0XHRcdFx0XHR6ID0geHogLyB4O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggeXkgPiB6eiApIHtcblxuXHRcdFx0XHQvLyBtMjIgaXMgdGhlIGxhcmdlc3QgZGlhZ29uYWwgdGVybVxuXG5cdFx0XHRcdGlmICggeXkgPCBlcHNpbG9uICkge1xuXG5cdFx0XHRcdFx0eCA9IDAuNzA3MTA2NzgxO1xuXHRcdFx0XHRcdHkgPSAwO1xuXHRcdFx0XHRcdHogPSAwLjcwNzEwNjc4MTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0eSA9IE1hdGguc3FydCggeXkgKTtcblx0XHRcdFx0XHR4ID0geHkgLyB5O1xuXHRcdFx0XHRcdHogPSB5eiAvIHk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIG0zMyBpcyB0aGUgbGFyZ2VzdCBkaWFnb25hbCB0ZXJtIHNvIGJhc2UgcmVzdWx0IG9uIHRoaXNcblxuXHRcdFx0XHRpZiAoIHp6IDwgZXBzaWxvbiApIHtcblxuXHRcdFx0XHRcdHggPSAwLjcwNzEwNjc4MTtcblx0XHRcdFx0XHR5ID0gMC43MDcxMDY3ODE7XG5cdFx0XHRcdFx0eiA9IDA7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHogPSBNYXRoLnNxcnQoIHp6ICk7XG5cdFx0XHRcdFx0eCA9IHh6IC8gejtcblx0XHRcdFx0XHR5ID0geXogLyB6O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnNldCggeCwgeSwgeiwgYW5nbGUgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7IC8vIHJldHVybiAxODAgZGVnIHJvdGF0aW9uXG5cblx0XHR9XG5cblx0XHQvLyBhcyB3ZSBoYXZlIHJlYWNoZWQgaGVyZSB0aGVyZSBhcmUgbm8gc2luZ3VsYXJpdGllcyBzbyB3ZSBjYW4gaGFuZGxlIG5vcm1hbGx5XG5cblx0XHR2YXIgcyA9IE1hdGguc3FydCggKCBtMzIgLSBtMjMgKSAqICggbTMyIC0gbTIzICkgK1xuXHRcdCAgICAgICAgICAgICAgICAgICAoIG0xMyAtIG0zMSApICogKCBtMTMgLSBtMzEgKSArXG5cdFx0ICAgICAgICAgICAgICAgICAgICggbTIxIC0gbTEyICkgKiAoIG0yMSAtIG0xMiApICk7IC8vIHVzZWQgdG8gbm9ybWFsaXplXG5cblx0XHRpZiAoIE1hdGguYWJzKCBzICkgPCAwLjAwMSApIHMgPSAxO1xuXG5cdFx0Ly8gcHJldmVudCBkaXZpZGUgYnkgemVybywgc2hvdWxkIG5vdCBoYXBwZW4gaWYgbWF0cml4IGlzIG9ydGhvZ29uYWwgYW5kIHNob3VsZCBiZVxuXHRcdC8vIGNhdWdodCBieSBzaW5ndWxhcml0eSB0ZXN0IGFib3ZlLCBidXQgSSd2ZSBsZWZ0IGl0IGluIGp1c3QgaW4gY2FzZVxuXG5cdFx0dGhpcy54ID0gKCBtMzIgLSBtMjMgKSAvIHM7XG5cdFx0dGhpcy55ID0gKCBtMTMgLSBtMzEgKSAvIHM7XG5cdFx0dGhpcy56ID0gKCBtMjEgLSBtMTIgKSAvIHM7XG5cdFx0dGhpcy53ID0gTWF0aC5hY29zKCAoIG0xMSArIG0yMiArIG0zMyAtIDEgKSAvIDIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWluOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1pbiggdGhpcy54LCB2LnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1pbiggdGhpcy55LCB2LnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1pbiggdGhpcy56LCB2LnogKTtcblx0XHR0aGlzLncgPSBNYXRoLm1pbiggdGhpcy53LCB2LncgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWF4OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggdGhpcy54LCB2LnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggdGhpcy55LCB2LnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1heCggdGhpcy56LCB2LnogKTtcblx0XHR0aGlzLncgPSBNYXRoLm1heCggdGhpcy53LCB2LncgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xhbXA6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHQvLyBhc3N1bWVzIG1pbiA8IG1heCwgY29tcG9uZW50d2lzZVxuXG5cdFx0dGhpcy54ID0gTWF0aC5tYXgoIG1pbi54LCBNYXRoLm1pbiggbWF4LngsIHRoaXMueCApICk7XG5cdFx0dGhpcy55ID0gTWF0aC5tYXgoIG1pbi55LCBNYXRoLm1pbiggbWF4LnksIHRoaXMueSApICk7XG5cdFx0dGhpcy56ID0gTWF0aC5tYXgoIG1pbi56LCBNYXRoLm1pbiggbWF4LnosIHRoaXMueiApICk7XG5cdFx0dGhpcy53ID0gTWF0aC5tYXgoIG1pbi53LCBNYXRoLm1pbiggbWF4LncsIHRoaXMudyApICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsYW1wU2NhbGFyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbWluLCBtYXg7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY2xhbXBTY2FsYXIoIG1pblZhbCwgbWF4VmFsICkge1xuXG5cdFx0XHRpZiAoIG1pbiA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1pbiA9IG5ldyBWZWN0b3I0KCk7XG5cdFx0XHRcdG1heCA9IG5ldyBWZWN0b3I0KCk7XG5cblx0XHRcdH1cblxuXHRcdFx0bWluLnNldCggbWluVmFsLCBtaW5WYWwsIG1pblZhbCwgbWluVmFsICk7XG5cdFx0XHRtYXguc2V0KCBtYXhWYWwsIG1heFZhbCwgbWF4VmFsLCBtYXhWYWwgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuY2xhbXAoIG1pbiwgbWF4ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbGFtcExlbmd0aDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHtcblxuXHRcdHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCBsZW5ndGggfHwgMSApLm11bHRpcGx5U2NhbGFyKCBNYXRoLm1heCggbWluLCBNYXRoLm1pbiggbWF4LCBsZW5ndGggKSApICk7XG5cblx0fSxcblxuXHRmbG9vcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5mbG9vciggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5mbG9vciggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5mbG9vciggdGhpcy56ICk7XG5cdFx0dGhpcy53ID0gTWF0aC5mbG9vciggdGhpcy53ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNlaWw6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguY2VpbCggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5jZWlsKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLmNlaWwoIHRoaXMueiApO1xuXHRcdHRoaXMudyA9IE1hdGguY2VpbCggdGhpcy53ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLnJvdW5kKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLnJvdW5kKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLnJvdW5kKCB0aGlzLnogKTtcblx0XHR0aGlzLncgPSBNYXRoLnJvdW5kKCB0aGlzLncgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm91bmRUb1plcm86IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9ICggdGhpcy54IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnggKSA6IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9ICggdGhpcy55IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnkgKSA6IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXHRcdHRoaXMueiA9ICggdGhpcy56IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnogKSA6IE1hdGguZmxvb3IoIHRoaXMueiApO1xuXHRcdHRoaXMudyA9ICggdGhpcy53IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLncgKSA6IE1hdGguZmxvb3IoIHRoaXMudyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRuZWdhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IC0gdGhpcy54O1xuXHRcdHRoaXMueSA9IC0gdGhpcy55O1xuXHRcdHRoaXMueiA9IC0gdGhpcy56O1xuXHRcdHRoaXMudyA9IC0gdGhpcy53O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkb3Q6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiB0aGlzLnggKiB2LnggKyB0aGlzLnkgKiB2LnkgKyB0aGlzLnogKiB2LnogKyB0aGlzLncgKiB2Lnc7XG5cblx0fSxcblxuXHRsZW5ndGhTcTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSArIHRoaXMueiAqIHRoaXMueiArIHRoaXMudyAqIHRoaXMudztcblxuXHR9LFxuXG5cdGxlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56ICsgdGhpcy53ICogdGhpcy53ICk7XG5cblx0fSxcblxuXHRtYW5oYXR0YW5MZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBNYXRoLmFicyggdGhpcy54ICkgKyBNYXRoLmFicyggdGhpcy55ICkgKyBNYXRoLmFicyggdGhpcy56ICkgKyBNYXRoLmFicyggdGhpcy53ICk7XG5cblx0fSxcblxuXHRub3JtYWxpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggdGhpcy5sZW5ndGgoKSB8fCAxICk7XG5cblx0fSxcblxuXHRzZXRMZW5ndGg6IGZ1bmN0aW9uICggbGVuZ3RoICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIGxlbmd0aCApO1xuXG5cdH0sXG5cblx0bGVycDogZnVuY3Rpb24gKCB2LCBhbHBoYSApIHtcblxuXHRcdHRoaXMueCArPSAoIHYueCAtIHRoaXMueCApICogYWxwaGE7XG5cdFx0dGhpcy55ICs9ICggdi55IC0gdGhpcy55ICkgKiBhbHBoYTtcblx0XHR0aGlzLnogKz0gKCB2LnogLSB0aGlzLnogKSAqIGFscGhhO1xuXHRcdHRoaXMudyArPSAoIHYudyAtIHRoaXMudyApICogYWxwaGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxlcnBWZWN0b3JzOiBmdW5jdGlvbiAoIHYxLCB2MiwgYWxwaGEgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2MiwgdjEgKS5tdWx0aXBseVNjYWxhciggYWxwaGEgKS5hZGQoIHYxICk7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiAoICggdi54ID09PSB0aGlzLnggKSAmJiAoIHYueSA9PT0gdGhpcy55ICkgJiYgKCB2LnogPT09IHRoaXMueiApICYmICggdi53ID09PSB0aGlzLncgKSApO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHRoaXMueCA9IGFycmF5WyBvZmZzZXQgXTtcblx0XHR0aGlzLnkgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXHRcdHRoaXMueiA9IGFycmF5WyBvZmZzZXQgKyAyIF07XG5cdFx0dGhpcy53ID0gYXJyYXlbIG9mZnNldCArIDMgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTtcblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMueDtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy55O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLno7XG5cdFx0YXJyYXlbIG9mZnNldCArIDMgXSA9IHRoaXMudztcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdGZyb21CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yNDogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCA9IGF0dHJpYnV0ZS5nZXRYKCBpbmRleCApO1xuXHRcdHRoaXMueSA9IGF0dHJpYnV0ZS5nZXRZKCBpbmRleCApO1xuXHRcdHRoaXMueiA9IGF0dHJpYnV0ZS5nZXRaKCBpbmRleCApO1xuXHRcdHRoaXMudyA9IGF0dHJpYnV0ZS5nZXRXKCBpbmRleCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBzemltZWsgLyBodHRwczovL2dpdGh1Yi5jb20vc3ppbWVrL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgTWFyaXVzIEtpbnRlbCAvIGh0dHBzOi8vZ2l0aHViLmNvbS9raW50ZWxcbiAqL1xuXG4vKlxuIEluIG9wdGlvbnMsIHdlIGNhbiBzcGVjaWZ5OlxuICogVGV4dHVyZSBwYXJhbWV0ZXJzIGZvciBhbiBhdXRvLWdlbmVyYXRlZCB0YXJnZXQgdGV4dHVyZVxuICogZGVwdGhCdWZmZXIvc3RlbmNpbEJ1ZmZlcjogQm9vbGVhbnMgdG8gaW5kaWNhdGUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIHRoZXNlIGJ1ZmZlcnNcbiovXG5mdW5jdGlvbiBXZWJHTFJlbmRlclRhcmdldCggd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApIHtcblxuXHR0aGlzLndpZHRoID0gd2lkdGg7XG5cdHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG5cdHRoaXMuc2Npc3NvciA9IG5ldyBWZWN0b3I0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XG5cdHRoaXMuc2Npc3NvclRlc3QgPSBmYWxzZTtcblxuXHR0aGlzLnZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcblxuXHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHRpZiAoIG9wdGlvbnMubWluRmlsdGVyID09PSB1bmRlZmluZWQgKSBvcHRpb25zLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcblxuXHR0aGlzLnRleHR1cmUgPSBuZXcgVGV4dHVyZSggdW5kZWZpbmVkLCB1bmRlZmluZWQsIG9wdGlvbnMud3JhcFMsIG9wdGlvbnMud3JhcFQsIG9wdGlvbnMubWFnRmlsdGVyLCBvcHRpb25zLm1pbkZpbHRlciwgb3B0aW9ucy5mb3JtYXQsIG9wdGlvbnMudHlwZSwgb3B0aW9ucy5hbmlzb3Ryb3B5LCBvcHRpb25zLmVuY29kaW5nICk7XG5cblx0dGhpcy5kZXB0aEJ1ZmZlciA9IG9wdGlvbnMuZGVwdGhCdWZmZXIgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZGVwdGhCdWZmZXIgOiB0cnVlO1xuXHR0aGlzLnN0ZW5jaWxCdWZmZXIgPSBvcHRpb25zLnN0ZW5jaWxCdWZmZXIgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuc3RlbmNpbEJ1ZmZlciA6IHRydWU7XG5cdHRoaXMuZGVwdGhUZXh0dXJlID0gb3B0aW9ucy5kZXB0aFRleHR1cmUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZGVwdGhUZXh0dXJlIDogbnVsbDtcblxufVxuXG5XZWJHTFJlbmRlclRhcmdldC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogV2ViR0xSZW5kZXJUYXJnZXQsXG5cblx0aXNXZWJHTFJlbmRlclRhcmdldDogdHJ1ZSxcblxuXHRzZXRTaXplOiBmdW5jdGlvbiAoIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRpZiAoIHRoaXMud2lkdGggIT09IHdpZHRoIHx8IHRoaXMuaGVpZ2h0ICE9PSBoZWlnaHQgKSB7XG5cblx0XHRcdHRoaXMud2lkdGggPSB3aWR0aDtcblx0XHRcdHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG5cdFx0XHR0aGlzLmRpc3Bvc2UoKTtcblxuXHRcdH1cblxuXHRcdHRoaXMudmlld3BvcnQuc2V0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XG5cdFx0dGhpcy5zY2lzc29yLnNldCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy53aWR0aCA9IHNvdXJjZS53aWR0aDtcblx0XHR0aGlzLmhlaWdodCA9IHNvdXJjZS5oZWlnaHQ7XG5cblx0XHR0aGlzLnZpZXdwb3J0LmNvcHkoIHNvdXJjZS52aWV3cG9ydCApO1xuXG5cdFx0dGhpcy50ZXh0dXJlID0gc291cmNlLnRleHR1cmUuY2xvbmUoKTtcblxuXHRcdHRoaXMuZGVwdGhCdWZmZXIgPSBzb3VyY2UuZGVwdGhCdWZmZXI7XG5cdFx0dGhpcy5zdGVuY2lsQnVmZmVyID0gc291cmNlLnN0ZW5jaWxCdWZmZXI7XG5cdFx0dGhpcy5kZXB0aFRleHR1cmUgPSBzb3VyY2UuZGVwdGhUZXh0dXJlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xSZW5kZXJUYXJnZXRDdWJlKCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zICkge1xuXG5cdFdlYkdMUmVuZGVyVGFyZ2V0LmNhbGwoIHRoaXMsIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMgKTtcblxuXHR0aGlzLmFjdGl2ZUN1YmVGYWNlID0gMDsgLy8gUFggMCwgTlggMSwgUFkgMiwgTlkgMywgUFogNCwgTlogNVxuXHR0aGlzLmFjdGl2ZU1pcE1hcExldmVsID0gMDtcblxufVxuXG5XZWJHTFJlbmRlclRhcmdldEN1YmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggV2ViR0xSZW5kZXJUYXJnZXQucHJvdG90eXBlICk7XG5XZWJHTFJlbmRlclRhcmdldEN1YmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gV2ViR0xSZW5kZXJUYXJnZXRDdWJlO1xuXG5XZWJHTFJlbmRlclRhcmdldEN1YmUucHJvdG90eXBlLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlID0gdHJ1ZTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIERhdGFUZXh0dXJlKCBkYXRhLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGFuaXNvdHJvcHksIGVuY29kaW5nICkge1xuXG5cdFRleHR1cmUuY2FsbCggdGhpcywgbnVsbCwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApO1xuXG5cdHRoaXMuaW1hZ2UgPSB7IGRhdGE6IGRhdGEsIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcblxuXHR0aGlzLm1hZ0ZpbHRlciA9IG1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWFnRmlsdGVyIDogTmVhcmVzdEZpbHRlcjtcblx0dGhpcy5taW5GaWx0ZXIgPSBtaW5GaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1pbkZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7XG5cblx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblx0dGhpcy5mbGlwWSA9IGZhbHNlO1xuXHR0aGlzLnVucGFja0FsaWdubWVudCA9IDE7XG5cbn1cblxuRGF0YVRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTtcbkRhdGFUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERhdGFUZXh0dXJlO1xuXG5EYXRhVGV4dHVyZS5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZSA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gQm94MyggbWluLCBtYXggKSB7XG5cblx0dGhpcy5taW4gPSAoIG1pbiAhPT0gdW5kZWZpbmVkICkgPyBtaW4gOiBuZXcgVmVjdG9yMyggKyBJbmZpbml0eSwgKyBJbmZpbml0eSwgKyBJbmZpbml0eSApO1xuXHR0aGlzLm1heCA9ICggbWF4ICE9PSB1bmRlZmluZWQgKSA/IG1heCA6IG5ldyBWZWN0b3IzKCAtIEluZmluaXR5LCAtIEluZmluaXR5LCAtIEluZmluaXR5ICk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQm94My5wcm90b3R5cGUsIHtcblxuXHRpc0JveDM6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkge1xuXG5cdFx0dGhpcy5taW4uY29weSggbWluICk7XG5cdFx0dGhpcy5tYXguY29weSggbWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSApIHtcblxuXHRcdHZhciBtaW5YID0gKyBJbmZpbml0eTtcblx0XHR2YXIgbWluWSA9ICsgSW5maW5pdHk7XG5cdFx0dmFyIG1pblogPSArIEluZmluaXR5O1xuXG5cdFx0dmFyIG1heFggPSAtIEluZmluaXR5O1xuXHRcdHZhciBtYXhZID0gLSBJbmZpbml0eTtcblx0XHR2YXIgbWF4WiA9IC0gSW5maW5pdHk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpICs9IDMgKSB7XG5cblx0XHRcdHZhciB4ID0gYXJyYXlbIGkgXTtcblx0XHRcdHZhciB5ID0gYXJyYXlbIGkgKyAxIF07XG5cdFx0XHR2YXIgeiA9IGFycmF5WyBpICsgMiBdO1xuXG5cdFx0XHRpZiAoIHggPCBtaW5YICkgbWluWCA9IHg7XG5cdFx0XHRpZiAoIHkgPCBtaW5ZICkgbWluWSA9IHk7XG5cdFx0XHRpZiAoIHogPCBtaW5aICkgbWluWiA9IHo7XG5cblx0XHRcdGlmICggeCA+IG1heFggKSBtYXhYID0geDtcblx0XHRcdGlmICggeSA+IG1heFkgKSBtYXhZID0geTtcblx0XHRcdGlmICggeiA+IG1heFogKSBtYXhaID0gejtcblxuXHRcdH1cblxuXHRcdHRoaXMubWluLnNldCggbWluWCwgbWluWSwgbWluWiApO1xuXHRcdHRoaXMubWF4LnNldCggbWF4WCwgbWF4WSwgbWF4WiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tQnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSApIHtcblxuXHRcdHZhciBtaW5YID0gKyBJbmZpbml0eTtcblx0XHR2YXIgbWluWSA9ICsgSW5maW5pdHk7XG5cdFx0dmFyIG1pblogPSArIEluZmluaXR5O1xuXG5cdFx0dmFyIG1heFggPSAtIEluZmluaXR5O1xuXHRcdHZhciBtYXhZID0gLSBJbmZpbml0eTtcblx0XHR2YXIgbWF4WiA9IC0gSW5maW5pdHk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgeCA9IGF0dHJpYnV0ZS5nZXRYKCBpICk7XG5cdFx0XHR2YXIgeSA9IGF0dHJpYnV0ZS5nZXRZKCBpICk7XG5cdFx0XHR2YXIgeiA9IGF0dHJpYnV0ZS5nZXRaKCBpICk7XG5cblx0XHRcdGlmICggeCA8IG1pblggKSBtaW5YID0geDtcblx0XHRcdGlmICggeSA8IG1pblkgKSBtaW5ZID0geTtcblx0XHRcdGlmICggeiA8IG1pblogKSBtaW5aID0gejtcblxuXHRcdFx0aWYgKCB4ID4gbWF4WCApIG1heFggPSB4O1xuXHRcdFx0aWYgKCB5ID4gbWF4WSApIG1heFkgPSB5O1xuXHRcdFx0aWYgKCB6ID4gbWF4WiApIG1heFogPSB6O1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5taW4uc2V0KCBtaW5YLCBtaW5ZLCBtaW5aICk7XG5cdFx0dGhpcy5tYXguc2V0KCBtYXhYLCBtYXhZLCBtYXhaICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Qb2ludHM6IGZ1bmN0aW9uICggcG9pbnRzICkge1xuXG5cdFx0dGhpcy5tYWtlRW1wdHkoKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuZXhwYW5kQnlQb2ludCggcG9pbnRzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUNlbnRlckFuZFNpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbUNlbnRlckFuZFNpemUoIGNlbnRlciwgc2l6ZSApIHtcblxuXHRcdFx0dmFyIGhhbGZTaXplID0gdjEuY29weSggc2l6ZSApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblxuXHRcdFx0dGhpcy5taW4uY29weSggY2VudGVyICkuc3ViKCBoYWxmU2l6ZSApO1xuXHRcdFx0dGhpcy5tYXguY29weSggY2VudGVyICkuYWRkKCBoYWxmU2l6ZSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHNldEZyb21PYmplY3Q6IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0dGhpcy5tYWtlRW1wdHkoKTtcblxuXHRcdHJldHVybiB0aGlzLmV4cGFuZEJ5T2JqZWN0KCBvYmplY3QgKTtcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHRoaXMubWluLmNvcHkoIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5jb3B5KCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VFbXB0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5taW4ueCA9IHRoaXMubWluLnkgPSB0aGlzLm1pbi56ID0gKyBJbmZpbml0eTtcblx0XHR0aGlzLm1heC54ID0gdGhpcy5tYXgueSA9IHRoaXMubWF4LnogPSAtIEluZmluaXR5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRpc0VtcHR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyB0aGlzIGlzIGEgbW9yZSByb2J1c3QgY2hlY2sgZm9yIGVtcHR5IHRoYW4gKCB2b2x1bWUgPD0gMCApIGJlY2F1c2Ugdm9sdW1lIGNhbiBnZXQgcG9zaXRpdmUgd2l0aCB0d28gbmVnYXRpdmUgYXhlc1xuXG5cdFx0cmV0dXJuICggdGhpcy5tYXgueCA8IHRoaXMubWluLnggKSB8fCAoIHRoaXMubWF4LnkgPCB0aGlzLm1pbi55ICkgfHwgKCB0aGlzLm1heC56IDwgdGhpcy5taW4ueiApO1xuXG5cdH0sXG5cblx0Z2V0Q2VudGVyOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5nZXRDZW50ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHRhcmdldC5zZXQoIDAsIDAsIDAgKSA6IHRhcmdldC5hZGRWZWN0b3JzKCB0aGlzLm1pbiwgdGhpcy5tYXggKS5tdWx0aXBseVNjYWxhciggMC41ICk7XG5cblx0fSxcblxuXHRnZXRTaXplOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5nZXRTaXplKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyB0YXJnZXQuc2V0KCAwLCAwLCAwICkgOiB0YXJnZXQuc3ViVmVjdG9ycyggdGhpcy5tYXgsIHRoaXMubWluICk7XG5cblx0fSxcblxuXHRleHBhbmRCeVBvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0dGhpcy5taW4ubWluKCBwb2ludCApO1xuXHRcdHRoaXMubWF4Lm1heCggcG9pbnQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlWZWN0b3I6IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdFx0dGhpcy5taW4uc3ViKCB2ZWN0b3IgKTtcblx0XHR0aGlzLm1heC5hZGQoIHZlY3RvciApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRleHBhbmRCeVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLm1pbi5hZGRTY2FsYXIoIC0gc2NhbGFyICk7XG5cdFx0dGhpcy5tYXguYWRkU2NhbGFyKCBzY2FsYXIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlPYmplY3Q6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIENvbXB1dGVzIHRoZSB3b3JsZC1heGlzLWFsaWduZWQgYm91bmRpbmcgYm94IG9mIGFuIG9iamVjdCAoaW5jbHVkaW5nIGl0cyBjaGlsZHJlbiksXG5cdFx0Ly8gYWNjb3VudGluZyBmb3IgYm90aCB0aGUgb2JqZWN0J3MsIGFuZCBjaGlsZHJlbidzLCB3b3JsZCB0cmFuc2Zvcm1zXG5cblx0XHR2YXIgc2NvcGUsIGksIGw7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0ZnVuY3Rpb24gdHJhdmVyc2UoIG5vZGUgKSB7XG5cblx0XHRcdHZhciBnZW9tZXRyeSA9IG5vZGUuZ2VvbWV0cnk7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0XHR2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlcztcblxuXHRcdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gdmVydGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0djEuY29weSggdmVydGljZXNbIGkgXSApO1xuXHRcdFx0XHRcdFx0djEuYXBwbHlNYXRyaXg0KCBub2RlLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0XHRcdHNjb3BlLmV4cGFuZEJ5UG9pbnQoIHYxICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHRcdHZhciBhdHRyaWJ1dGUgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0XHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBhdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdHYxLmZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaSApLmFwcGx5TWF0cml4NCggbm9kZS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdFx0XHRcdHNjb3BlLmV4cGFuZEJ5UG9pbnQoIHYxICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBmdW5jdGlvbiBleHBhbmRCeU9iamVjdCggb2JqZWN0ICkge1xuXG5cdFx0XHRzY29wZSA9IHRoaXM7XG5cblx0XHRcdG9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0XHRvYmplY3QudHJhdmVyc2UoIHRyYXZlcnNlICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y29udGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHJldHVybiBwb2ludC54IDwgdGhpcy5taW4ueCB8fCBwb2ludC54ID4gdGhpcy5tYXgueCB8fFxuXHRcdFx0cG9pbnQueSA8IHRoaXMubWluLnkgfHwgcG9pbnQueSA+IHRoaXMubWF4LnkgfHxcblx0XHRcdHBvaW50LnogPCB0aGlzLm1pbi56IHx8IHBvaW50LnogPiB0aGlzLm1heC56ID8gZmFsc2UgOiB0cnVlO1xuXG5cdH0sXG5cblx0Y29udGFpbnNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubWluLnggPD0gYm94Lm1pbi54ICYmIGJveC5tYXgueCA8PSB0aGlzLm1heC54ICYmXG5cdFx0XHR0aGlzLm1pbi55IDw9IGJveC5taW4ueSAmJiBib3gubWF4LnkgPD0gdGhpcy5tYXgueSAmJlxuXHRcdFx0dGhpcy5taW4ueiA8PSBib3gubWluLnogJiYgYm94Lm1heC56IDw9IHRoaXMubWF4Lno7XG5cblx0fSxcblxuXHRnZXRQYXJhbWV0ZXI6IGZ1bmN0aW9uICggcG9pbnQsIHRhcmdldCApIHtcblxuXHRcdC8vIFRoaXMgY2FuIHBvdGVudGlhbGx5IGhhdmUgYSBkaXZpZGUgYnkgemVybyBpZiB0aGUgYm94XG5cdFx0Ly8gaGFzIGEgc2l6ZSBkaW1lbnNpb24gb2YgMC5cblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5nZXRQYXJhbWV0ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuc2V0KFxuXHRcdFx0KCBwb2ludC54IC0gdGhpcy5taW4ueCApIC8gKCB0aGlzLm1heC54IC0gdGhpcy5taW4ueCApLFxuXHRcdFx0KCBwb2ludC55IC0gdGhpcy5taW4ueSApIC8gKCB0aGlzLm1heC55IC0gdGhpcy5taW4ueSApLFxuXHRcdFx0KCBwb2ludC56IC0gdGhpcy5taW4ueiApIC8gKCB0aGlzLm1heC56IC0gdGhpcy5taW4ueiApXG5cdFx0KTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0Ly8gdXNpbmcgNiBzcGxpdHRpbmcgcGxhbmVzIHRvIHJ1bGUgb3V0IGludGVyc2VjdGlvbnMuXG5cdFx0cmV0dXJuIGJveC5tYXgueCA8IHRoaXMubWluLnggfHwgYm94Lm1pbi54ID4gdGhpcy5tYXgueCB8fFxuXHRcdFx0Ym94Lm1heC55IDwgdGhpcy5taW4ueSB8fCBib3gubWluLnkgPiB0aGlzLm1heC55IHx8XG5cdFx0XHRib3gubWF4LnogPCB0aGlzLm1pbi56IHx8IGJveC5taW4ueiA+IHRoaXMubWF4LnogPyBmYWxzZSA6IHRydWU7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzU3BoZXJlOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBjbG9zZXN0UG9pbnQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApIHtcblxuXHRcdFx0Ly8gRmluZCB0aGUgcG9pbnQgb24gdGhlIEFBQkIgY2xvc2VzdCB0byB0aGUgc3BoZXJlIGNlbnRlci5cblx0XHRcdHRoaXMuY2xhbXBQb2ludCggc3BoZXJlLmNlbnRlciwgY2xvc2VzdFBvaW50ICk7XG5cblx0XHRcdC8vIElmIHRoYXQgcG9pbnQgaXMgaW5zaWRlIHRoZSBzcGhlcmUsIHRoZSBBQUJCIGFuZCBzcGhlcmUgaW50ZXJzZWN0LlxuXHRcdFx0cmV0dXJuIGNsb3Nlc3RQb2ludC5kaXN0YW5jZVRvU3F1YXJlZCggc3BoZXJlLmNlbnRlciApIDw9ICggc3BoZXJlLnJhZGl1cyAqIHNwaGVyZS5yYWRpdXMgKTtcblxuXHRcdH07XG5cblx0fSApKCksXG5cblx0aW50ZXJzZWN0c1BsYW5lOiBmdW5jdGlvbiAoIHBsYW5lICkge1xuXG5cdFx0Ly8gV2UgY29tcHV0ZSB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBkb3QgcHJvZHVjdCB2YWx1ZXMuIElmIHRob3NlIHZhbHVlc1xuXHRcdC8vIGFyZSBvbiB0aGUgc2FtZSBzaWRlIChiYWNrIG9yIGZyb250KSBvZiB0aGUgcGxhbmUsIHRoZW4gdGhlcmUgaXMgbm8gaW50ZXJzZWN0aW9uLlxuXG5cdFx0dmFyIG1pbiwgbWF4O1xuXG5cdFx0aWYgKCBwbGFuZS5ub3JtYWwueCA+IDAgKSB7XG5cblx0XHRcdG1pbiA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5taW4ueDtcblx0XHRcdG1heCA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5tYXgueDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdG1pbiA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5tYXgueDtcblx0XHRcdG1heCA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5taW4ueDtcblxuXHRcdH1cblxuXHRcdGlmICggcGxhbmUubm9ybWFsLnkgPiAwICkge1xuXG5cdFx0XHRtaW4gKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1pbi55O1xuXHRcdFx0bWF4ICs9IHBsYW5lLm5vcm1hbC55ICogdGhpcy5tYXgueTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdG1pbiArPSBwbGFuZS5ub3JtYWwueSAqIHRoaXMubWF4Lnk7XG5cdFx0XHRtYXggKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1pbi55O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwbGFuZS5ub3JtYWwueiA+IDAgKSB7XG5cblx0XHRcdG1pbiArPSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWluLno7XG5cdFx0XHRtYXggKz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1heC56O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bWluICs9IHBsYW5lLm5vcm1hbC56ICogdGhpcy5tYXguejtcblx0XHRcdG1heCArPSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWluLno7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gKCBtaW4gPD0gcGxhbmUuY29uc3RhbnQgJiYgbWF4ID49IHBsYW5lLmNvbnN0YW50ICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzVHJpYW5nbGU6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gdHJpYW5nbGUgY2VudGVyZWQgdmVydGljZXNcblx0XHR2YXIgdjAgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHYyID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdC8vIHRyaWFuZ2xlIGVkZ2UgdmVjdG9yc1xuXHRcdHZhciBmMCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGYxID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgZjIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIHRlc3RBeGlzID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciBjZW50ZXIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBleHRlbnRzID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciB0cmlhbmdsZU5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRmdW5jdGlvbiBzYXRGb3JBeGVzKCBheGVzICkge1xuXG5cdFx0XHR2YXIgaSwgajtcblxuXHRcdFx0Zm9yICggaSA9IDAsIGogPSBheGVzLmxlbmd0aCAtIDM7IGkgPD0gajsgaSArPSAzICkge1xuXG5cdFx0XHRcdHRlc3RBeGlzLmZyb21BcnJheSggYXhlcywgaSApO1xuXHRcdFx0XHQvLyBwcm9qZWN0IHRoZSBhYWJiIG9udG8gdGhlIHNlcGVyYXRpbmcgYXhpc1xuXHRcdFx0XHR2YXIgciA9IGV4dGVudHMueCAqIE1hdGguYWJzKCB0ZXN0QXhpcy54ICkgKyBleHRlbnRzLnkgKiBNYXRoLmFicyggdGVzdEF4aXMueSApICsgZXh0ZW50cy56ICogTWF0aC5hYnMoIHRlc3RBeGlzLnogKTtcblx0XHRcdFx0Ly8gcHJvamVjdCBhbGwgMyB2ZXJ0aWNlcyBvZiB0aGUgdHJpYW5nbGUgb250byB0aGUgc2VwZXJhdGluZyBheGlzXG5cdFx0XHRcdHZhciBwMCA9IHYwLmRvdCggdGVzdEF4aXMgKTtcblx0XHRcdFx0dmFyIHAxID0gdjEuZG90KCB0ZXN0QXhpcyApO1xuXHRcdFx0XHR2YXIgcDIgPSB2Mi5kb3QoIHRlc3RBeGlzICk7XG5cdFx0XHRcdC8vIGFjdHVhbCB0ZXN0LCBiYXNpY2FsbHkgc2VlIGlmIGVpdGhlciBvZiB0aGUgbW9zdCBleHRyZW1lIG9mIHRoZSB0cmlhbmdsZSBwb2ludHMgaW50ZXJzZWN0cyByXG5cdFx0XHRcdGlmICggTWF0aC5tYXgoIC0gTWF0aC5tYXgoIHAwLCBwMSwgcDIgKSwgTWF0aC5taW4oIHAwLCBwMSwgcDIgKSApID4gciApIHtcblxuXHRcdFx0XHRcdC8vIHBvaW50cyBvZiB0aGUgcHJvamVjdGVkIHRyaWFuZ2xlIGFyZSBvdXRzaWRlIHRoZSBwcm9qZWN0ZWQgaGFsZi1sZW5ndGggb2YgdGhlIGFhYmJcblx0XHRcdFx0XHQvLyB0aGUgYXhpcyBpcyBzZXBlcmF0aW5nIGFuZCB3ZSBjYW4gZXhpdFxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0c1RyaWFuZ2xlKCB0cmlhbmdsZSApIHtcblxuXHRcdFx0aWYgKCB0aGlzLmlzRW1wdHkoKSApIHtcblxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gY29tcHV0ZSBib3ggY2VudGVyIGFuZCBleHRlbnRzXG5cdFx0XHR0aGlzLmdldENlbnRlciggY2VudGVyICk7XG5cdFx0XHRleHRlbnRzLnN1YlZlY3RvcnMoIHRoaXMubWF4LCBjZW50ZXIgKTtcblxuXHRcdFx0Ly8gdHJhbnNsYXRlIHRyaWFuZ2xlIHRvIGFhYmIgb3JpZ2luXG5cdFx0XHR2MC5zdWJWZWN0b3JzKCB0cmlhbmdsZS5hLCBjZW50ZXIgKTtcblx0XHRcdHYxLnN1YlZlY3RvcnMoIHRyaWFuZ2xlLmIsIGNlbnRlciApO1xuXHRcdFx0djIuc3ViVmVjdG9ycyggdHJpYW5nbGUuYywgY2VudGVyICk7XG5cblx0XHRcdC8vIGNvbXB1dGUgZWRnZSB2ZWN0b3JzIGZvciB0cmlhbmdsZVxuXHRcdFx0ZjAuc3ViVmVjdG9ycyggdjEsIHYwICk7XG5cdFx0XHRmMS5zdWJWZWN0b3JzKCB2MiwgdjEgKTtcblx0XHRcdGYyLnN1YlZlY3RvcnMoIHYwLCB2MiApO1xuXG5cdFx0XHQvLyB0ZXN0IGFnYWluc3QgYXhlcyB0aGF0IGFyZSBnaXZlbiBieSBjcm9zcyBwcm9kdWN0IGNvbWJpbmF0aW9ucyBvZiB0aGUgZWRnZXMgb2YgdGhlIHRyaWFuZ2xlIGFuZCB0aGUgZWRnZXMgb2YgdGhlIGFhYmJcblx0XHRcdC8vIG1ha2UgYW4gYXhpcyB0ZXN0aW5nIG9mIGVhY2ggb2YgdGhlIDMgc2lkZXMgb2YgdGhlIGFhYmIgYWdhaW5zdCBlYWNoIG9mIHRoZSAzIHNpZGVzIG9mIHRoZSB0cmlhbmdsZSA9IDkgYXhpcyBvZiBzZXBhcmF0aW9uXG5cdFx0XHQvLyBheGlzX2lqID0gdV9pIHggZl9qICh1MCwgdTEsIHUyID0gZmFjZSBub3JtYWxzIG9mIGFhYmIgPSB4LHkseiBheGVzIHZlY3RvcnMgc2luY2UgYWFiYiBpcyBheGlzIGFsaWduZWQpXG5cdFx0XHR2YXIgYXhlcyA9IFtcblx0XHRcdFx0MCwgLSBmMC56LCBmMC55LCAwLCAtIGYxLnosIGYxLnksIDAsIC0gZjIueiwgZjIueSxcblx0XHRcdFx0ZjAueiwgMCwgLSBmMC54LCBmMS56LCAwLCAtIGYxLngsIGYyLnosIDAsIC0gZjIueCxcblx0XHRcdFx0LSBmMC55LCBmMC54LCAwLCAtIGYxLnksIGYxLngsIDAsIC0gZjIueSwgZjIueCwgMFxuXHRcdFx0XTtcblx0XHRcdGlmICggISBzYXRGb3JBeGVzKCBheGVzICkgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHRlc3QgMyBmYWNlIG5vcm1hbHMgZnJvbSB0aGUgYWFiYlxuXHRcdFx0YXhlcyA9IFsgMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMSBdO1xuXHRcdFx0aWYgKCAhIHNhdEZvckF4ZXMoIGF4ZXMgKSApIHtcblxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gZmluYWxseSB0ZXN0aW5nIHRoZSBmYWNlIG5vcm1hbCBvZiB0aGUgdHJpYW5nbGVcblx0XHRcdC8vIHVzZSBhbHJlYWR5IGV4aXN0aW5nIHRyaWFuZ2xlIGVkZ2UgdmVjdG9ycyBoZXJlXG5cdFx0XHR0cmlhbmdsZU5vcm1hbC5jcm9zc1ZlY3RvcnMoIGYwLCBmMSApO1xuXHRcdFx0YXhlcyA9IFsgdHJpYW5nbGVOb3JtYWwueCwgdHJpYW5nbGVOb3JtYWwueSwgdHJpYW5nbGVOb3JtYWwueiBdO1xuXHRcdFx0cmV0dXJuIHNhdEZvckF4ZXMoIGF4ZXMgKTtcblxuXHRcdH07XG5cblx0fSApKCksXG5cblx0Y2xhbXBQb2ludDogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmNsYW1wUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuY29weSggcG9pbnQgKS5jbGFtcCggdGhpcy5taW4sIHRoaXMubWF4ICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIHtcblxuXHRcdFx0dmFyIGNsYW1wZWRQb2ludCA9IHYxLmNvcHkoIHBvaW50ICkuY2xhbXAoIHRoaXMubWluLCB0aGlzLm1heCApO1xuXHRcdFx0cmV0dXJuIGNsYW1wZWRQb2ludC5zdWIoIHBvaW50ICkubGVuZ3RoKCk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRnZXRCb3VuZGluZ1NwaGVyZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRCb3VuZGluZ1NwaGVyZSggdGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5nZXRCb3VuZGluZ1NwaGVyZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHRcdHRhcmdldCA9IG5ldyBTcGhlcmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmdldENlbnRlciggdGFyZ2V0LmNlbnRlciApO1xuXG5cdFx0XHR0YXJnZXQucmFkaXVzID0gdGhpcy5nZXRTaXplKCB2MSApLmxlbmd0aCgpICogMC41O1xuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0O1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0aW50ZXJzZWN0OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHRoaXMubWluLm1heCggYm94Lm1pbiApO1xuXHRcdHRoaXMubWF4Lm1pbiggYm94Lm1heCApO1xuXG5cdFx0Ly8gZW5zdXJlIHRoYXQgaWYgdGhlcmUgaXMgbm8gb3ZlcmxhcCwgdGhlIHJlc3VsdCBpcyBmdWxseSBlbXB0eSwgbm90IHNsaWdodGx5IGVtcHR5IHdpdGggbm9uLWluZi8raW5mIHZhbHVlcyB0aGF0IHdpbGwgY2F1c2Ugc3Vic2VxdWVuY2UgaW50ZXJzZWN0cyB0byBlcnJvbmVvdXNseSByZXR1cm4gdmFsaWQgdmFsdWVzLlxuXHRcdGlmICggdGhpcy5pc0VtcHR5KCkgKSB0aGlzLm1ha2VFbXB0eSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR1bmlvbjogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHR0aGlzLm1pbi5taW4oIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5tYXgoIGJveC5tYXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcG9pbnRzID0gW1xuXHRcdFx0bmV3IFZlY3RvcjMoKSxcblx0XHRcdG5ldyBWZWN0b3IzKCksXG5cdFx0XHRuZXcgVmVjdG9yMygpLFxuXHRcdFx0bmV3IFZlY3RvcjMoKSxcblx0XHRcdG5ldyBWZWN0b3IzKCksXG5cdFx0XHRuZXcgVmVjdG9yMygpLFxuXHRcdFx0bmV3IFZlY3RvcjMoKSxcblx0XHRcdG5ldyBWZWN0b3IzKClcblx0XHRdO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGFwcGx5TWF0cml4NCggbWF0cml4ICkge1xuXG5cdFx0XHQvLyB0cmFuc2Zvcm0gb2YgZW1wdHkgYm94IGlzIGFuIGVtcHR5IGJveC5cblx0XHRcdGlmICggdGhpcy5pc0VtcHR5KCkgKSByZXR1cm4gdGhpcztcblxuXHRcdFx0Ly8gTk9URTogSSBhbSB1c2luZyBhIGJpbmFyeSBwYXR0ZXJuIHRvIHNwZWNpZnkgYWxsIDJeMyBjb21iaW5hdGlvbnMgYmVsb3dcblx0XHRcdHBvaW50c1sgMCBdLnNldCggdGhpcy5taW4ueCwgdGhpcy5taW4ueSwgdGhpcy5taW4ueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDAwMFxuXHRcdFx0cG9pbnRzWyAxIF0uc2V0KCB0aGlzLm1pbi54LCB0aGlzLm1pbi55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMDAxXG5cdFx0XHRwb2ludHNbIDIgXS5zZXQoIHRoaXMubWluLngsIHRoaXMubWF4LnksIHRoaXMubWluLnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAwMTBcblx0XHRcdHBvaW50c1sgMyBdLnNldCggdGhpcy5taW4ueCwgdGhpcy5tYXgueSwgdGhpcy5tYXgueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDAxMVxuXHRcdFx0cG9pbnRzWyA0IF0uc2V0KCB0aGlzLm1heC54LCB0aGlzLm1pbi55LCB0aGlzLm1pbi56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMTAwXG5cdFx0XHRwb2ludHNbIDUgXS5zZXQoIHRoaXMubWF4LngsIHRoaXMubWluLnksIHRoaXMubWF4LnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAxMDFcblx0XHRcdHBvaW50c1sgNiBdLnNldCggdGhpcy5tYXgueCwgdGhpcy5tYXgueSwgdGhpcy5taW4ueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDExMFxuXHRcdFx0cG9pbnRzWyA3IF0uc2V0KCB0aGlzLm1heC54LCB0aGlzLm1heC55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcdC8vIDExMVxuXG5cdFx0XHR0aGlzLnNldEZyb21Qb2ludHMoIHBvaW50cyApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLm1pbi5hZGQoIG9mZnNldCApO1xuXHRcdHRoaXMubWF4LmFkZCggb2Zmc2V0ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRyZXR1cm4gYm94Lm1pbi5lcXVhbHMoIHRoaXMubWluICkgJiYgYm94Lm1heC5lcXVhbHMoIHRoaXMubWF4ICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBTcGhlcmUoIGNlbnRlciwgcmFkaXVzICkge1xuXG5cdHRoaXMuY2VudGVyID0gKCBjZW50ZXIgIT09IHVuZGVmaW5lZCApID8gY2VudGVyIDogbmV3IFZlY3RvcjMoKTtcblx0dGhpcy5yYWRpdXMgPSAoIHJhZGl1cyAhPT0gdW5kZWZpbmVkICkgPyByYWRpdXMgOiAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFNwaGVyZS5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggY2VudGVyLCByYWRpdXMgKSB7XG5cblx0XHR0aGlzLmNlbnRlci5jb3B5KCBjZW50ZXIgKTtcblx0XHR0aGlzLnJhZGl1cyA9IHJhZGl1cztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVBvaW50czogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGJveCA9IG5ldyBCb3gzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbVBvaW50cyggcG9pbnRzLCBvcHRpb25hbENlbnRlciApIHtcblxuXHRcdFx0dmFyIGNlbnRlciA9IHRoaXMuY2VudGVyO1xuXG5cdFx0XHRpZiAoIG9wdGlvbmFsQ2VudGVyICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y2VudGVyLmNvcHkoIG9wdGlvbmFsQ2VudGVyICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ym94LnNldEZyb21Qb2ludHMoIHBvaW50cyApLmdldENlbnRlciggY2VudGVyICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG1heFJhZGl1c1NxID0gMDtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRtYXhSYWRpdXNTcSA9IE1hdGgubWF4KCBtYXhSYWRpdXNTcSwgY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludHNbIGkgXSApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5yYWRpdXMgPSBNYXRoLnNxcnQoIG1heFJhZGl1c1NxICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0dGhpcy5jZW50ZXIuY29weSggc3BoZXJlLmNlbnRlciApO1xuXHRcdHRoaXMucmFkaXVzID0gc3BoZXJlLnJhZGl1cztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiAoIHRoaXMucmFkaXVzIDw9IDAgKTtcblxuXHR9LFxuXG5cdGNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gKCBwb2ludC5kaXN0YW5jZVRvU3F1YXJlZCggdGhpcy5jZW50ZXIgKSA8PSAoIHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXMgKSApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0cmV0dXJuICggcG9pbnQuZGlzdGFuY2VUbyggdGhpcy5jZW50ZXIgKSAtIHRoaXMucmFkaXVzICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzU3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSApIHtcblxuXHRcdHZhciByYWRpdXNTdW0gPSB0aGlzLnJhZGl1cyArIHNwaGVyZS5yYWRpdXM7XG5cblx0XHRyZXR1cm4gc3BoZXJlLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCggdGhpcy5jZW50ZXIgKSA8PSAoIHJhZGl1c1N1bSAqIHJhZGl1c1N1bSApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c0JveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRyZXR1cm4gYm94LmludGVyc2VjdHNTcGhlcmUoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNQbGFuZTogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdHJldHVybiBNYXRoLmFicyggcGxhbmUuZGlzdGFuY2VUb1BvaW50KCB0aGlzLmNlbnRlciApICkgPD0gdGhpcy5yYWRpdXM7XG5cblx0fSxcblxuXHRjbGFtcFBvaW50OiBmdW5jdGlvbiAoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHR2YXIgZGVsdGFMZW5ndGhTcSA9IHRoaXMuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludCApO1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU3BoZXJlOiAuY2xhbXBQb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0dGFyZ2V0LmNvcHkoIHBvaW50ICk7XG5cblx0XHRpZiAoIGRlbHRhTGVuZ3RoU3EgPiAoIHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXMgKSApIHtcblxuXHRcdFx0dGFyZ2V0LnN1YiggdGhpcy5jZW50ZXIgKS5ub3JtYWxpemUoKTtcblx0XHRcdHRhcmdldC5tdWx0aXBseVNjYWxhciggdGhpcy5yYWRpdXMgKS5hZGQoIHRoaXMuY2VudGVyICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0O1xuXG5cdH0sXG5cblx0Z2V0Qm91bmRpbmdCb3g6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU3BoZXJlOiAuZ2V0Qm91bmRpbmdCb3goKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IEJveDMoKTtcblxuXHRcdH1cblxuXHRcdHRhcmdldC5zZXQoIHRoaXMuY2VudGVyLCB0aGlzLmNlbnRlciApO1xuXHRcdHRhcmdldC5leHBhbmRCeVNjYWxhciggdGhpcy5yYWRpdXMgKTtcblxuXHRcdHJldHVybiB0YXJnZXQ7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbWF0cml4ICkge1xuXG5cdFx0dGhpcy5jZW50ZXIuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblx0XHR0aGlzLnJhZGl1cyA9IHRoaXMucmFkaXVzICogbWF0cml4LmdldE1heFNjYWxlT25BeGlzKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmNlbnRlci5hZGQoIG9mZnNldCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0cmV0dXJuIHNwaGVyZS5jZW50ZXIuZXF1YWxzKCB0aGlzLmNlbnRlciApICYmICggc3BoZXJlLnJhZGl1cyA9PT0gdGhpcy5yYWRpdXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxuZnVuY3Rpb24gUGxhbmUoIG5vcm1hbCwgY29uc3RhbnQgKSB7XG5cblx0Ly8gbm9ybWFsIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxuXG5cdHRoaXMubm9ybWFsID0gKCBub3JtYWwgIT09IHVuZGVmaW5lZCApID8gbm9ybWFsIDogbmV3IFZlY3RvcjMoIDEsIDAsIDAgKTtcblx0dGhpcy5jb25zdGFudCA9ICggY29uc3RhbnQgIT09IHVuZGVmaW5lZCApID8gY29uc3RhbnQgOiAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFBsYW5lLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCBub3JtYWwsIGNvbnN0YW50ICkge1xuXG5cdFx0dGhpcy5ub3JtYWwuY29weSggbm9ybWFsICk7XG5cdFx0dGhpcy5jb25zdGFudCA9IGNvbnN0YW50O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRDb21wb25lbnRzOiBmdW5jdGlvbiAoIHgsIHksIHosIHcgKSB7XG5cblx0XHR0aGlzLm5vcm1hbC5zZXQoIHgsIHksIHogKTtcblx0XHR0aGlzLmNvbnN0YW50ID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQ6IGZ1bmN0aW9uICggbm9ybWFsLCBwb2ludCApIHtcblxuXHRcdHRoaXMubm9ybWFsLmNvcHkoIG5vcm1hbCApO1xuXHRcdHRoaXMuY29uc3RhbnQgPSAtIHBvaW50LmRvdCggdGhpcy5ub3JtYWwgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUNvcGxhbmFyUG9pbnRzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2MiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbUNvcGxhbmFyUG9pbnRzKCBhLCBiLCBjICkge1xuXG5cdFx0XHR2YXIgbm9ybWFsID0gdjEuc3ViVmVjdG9ycyggYywgYiApLmNyb3NzKCB2Mi5zdWJWZWN0b3JzKCBhLCBiICkgKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0Ly8gUTogc2hvdWxkIGFuIGVycm9yIGJlIHRocm93biBpZiBub3JtYWwgaXMgemVybyAoZS5nLiBkZWdlbmVyYXRlIHBsYW5lKT9cblxuXHRcdFx0dGhpcy5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludCggbm9ybWFsLCBhICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggcGxhbmUgKSB7XG5cblx0XHR0aGlzLm5vcm1hbC5jb3B5KCBwbGFuZS5ub3JtYWwgKTtcblx0XHR0aGlzLmNvbnN0YW50ID0gcGxhbmUuY29uc3RhbnQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gTm90ZTogd2lsbCBsZWFkIHRvIGEgZGl2aWRlIGJ5IHplcm8gaWYgdGhlIHBsYW5lIGlzIGludmFsaWQuXG5cblx0XHR2YXIgaW52ZXJzZU5vcm1hbExlbmd0aCA9IDEuMCAvIHRoaXMubm9ybWFsLmxlbmd0aCgpO1xuXHRcdHRoaXMubm9ybWFsLm11bHRpcGx5U2NhbGFyKCBpbnZlcnNlTm9ybWFsTGVuZ3RoICk7XG5cdFx0dGhpcy5jb25zdGFudCAqPSBpbnZlcnNlTm9ybWFsTGVuZ3RoO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRuZWdhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuY29uc3RhbnQgKj0gLSAxO1xuXHRcdHRoaXMubm9ybWFsLm5lZ2F0ZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5ub3JtYWwuZG90KCBwb2ludCApICsgdGhpcy5jb25zdGFudDtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9TcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KCBzcGhlcmUuY2VudGVyICkgLSBzcGhlcmUucmFkaXVzO1xuXG5cdH0sXG5cblx0cHJvamVjdFBvaW50OiBmdW5jdGlvbiAoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5QbGFuZTogLnByb2plY3RQb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5jb3B5KCB0aGlzLm5vcm1hbCApLm11bHRpcGx5U2NhbGFyKCAtIHRoaXMuZGlzdGFuY2VUb1BvaW50KCBwb2ludCApICkuYWRkKCBwb2ludCApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0TGluZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lKCBsaW5lLCB0YXJnZXQgKSB7XG5cblx0XHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGxhbmU6IC5pbnRlcnNlY3RMaW5lKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZGlyZWN0aW9uID0gbGluZS5kZWx0YSggdjEgKTtcblxuXHRcdFx0dmFyIGRlbm9taW5hdG9yID0gdGhpcy5ub3JtYWwuZG90KCBkaXJlY3Rpb24gKTtcblxuXHRcdFx0aWYgKCBkZW5vbWluYXRvciA9PT0gMCApIHtcblxuXHRcdFx0XHQvLyBsaW5lIGlzIGNvcGxhbmFyLCByZXR1cm4gb3JpZ2luXG5cdFx0XHRcdGlmICggdGhpcy5kaXN0YW5jZVRvUG9pbnQoIGxpbmUuc3RhcnQgKSA9PT0gMCApIHtcblxuXHRcdFx0XHRcdHJldHVybiB0YXJnZXQuY29weSggbGluZS5zdGFydCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBVbnN1cmUgaWYgdGhpcyBpcyB0aGUgY29ycmVjdCBtZXRob2QgdG8gaGFuZGxlIHRoaXMgY2FzZS5cblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgdCA9IC0gKCBsaW5lLnN0YXJ0LmRvdCggdGhpcy5ub3JtYWwgKSArIHRoaXMuY29uc3RhbnQgKSAvIGRlbm9taW5hdG9yO1xuXG5cdFx0XHRpZiAoIHQgPCAwIHx8IHQgPiAxICkge1xuXG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBkaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggdCApLmFkZCggbGluZS5zdGFydCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0aW50ZXJzZWN0c0xpbmU6IGZ1bmN0aW9uICggbGluZSApIHtcblxuXHRcdC8vIE5vdGU6IHRoaXMgdGVzdHMgaWYgYSBsaW5lIGludGVyc2VjdHMgdGhlIHBsYW5lLCBub3Qgd2hldGhlciBpdCAob3IgaXRzIGVuZC1wb2ludHMpIGFyZSBjb3BsYW5hciB3aXRoIGl0LlxuXG5cdFx0dmFyIHN0YXJ0U2lnbiA9IHRoaXMuZGlzdGFuY2VUb1BvaW50KCBsaW5lLnN0YXJ0ICk7XG5cdFx0dmFyIGVuZFNpZ24gPSB0aGlzLmRpc3RhbmNlVG9Qb2ludCggbGluZS5lbmQgKTtcblxuXHRcdHJldHVybiAoIHN0YXJ0U2lnbiA8IDAgJiYgZW5kU2lnbiA+IDAgKSB8fCAoIGVuZFNpZ24gPCAwICYmIHN0YXJ0U2lnbiA+IDAgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIGJveC5pbnRlcnNlY3RzUGxhbmUoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0cmV0dXJuIHNwaGVyZS5pbnRlcnNlY3RzUGxhbmUoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcGxhbmFyUG9pbnQ6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGxhbmU6IC5jb3BsYW5hclBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMubm9ybWFsICkubXVsdGlwbHlTY2FsYXIoIC0gdGhpcy5jb25zdGFudCApO1xuXG5cdH0sXG5cblx0YXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXgzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gYXBwbHlNYXRyaXg0KCBtYXRyaXgsIG9wdGlvbmFsTm9ybWFsTWF0cml4ICkge1xuXG5cdFx0XHR2YXIgbm9ybWFsTWF0cml4ID0gb3B0aW9uYWxOb3JtYWxNYXRyaXggfHwgbTEuZ2V0Tm9ybWFsTWF0cml4KCBtYXRyaXggKTtcblxuXHRcdFx0dmFyIHJlZmVyZW5jZVBvaW50ID0gdGhpcy5jb3BsYW5hclBvaW50KCB2MSApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cblx0XHRcdHZhciBub3JtYWwgPSB0aGlzLm5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHR0aGlzLmNvbnN0YW50ID0gLSByZWZlcmVuY2VQb2ludC5kb3QoIG5vcm1hbCApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmNvbnN0YW50IC09IG9mZnNldC5kb3QoIHRoaXMubm9ybWFsICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdHJldHVybiBwbGFuZS5ub3JtYWwuZXF1YWxzKCB0aGlzLm5vcm1hbCApICYmICggcGxhbmUuY29uc3RhbnQgPT09IHRoaXMuY29uc3RhbnQgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG5mdW5jdGlvbiBGcnVzdHVtKCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1ICkge1xuXG5cdHRoaXMucGxhbmVzID0gW1xuXG5cdFx0KCBwMCAhPT0gdW5kZWZpbmVkICkgPyBwMCA6IG5ldyBQbGFuZSgpLFxuXHRcdCggcDEgIT09IHVuZGVmaW5lZCApID8gcDEgOiBuZXcgUGxhbmUoKSxcblx0XHQoIHAyICE9PSB1bmRlZmluZWQgKSA/IHAyIDogbmV3IFBsYW5lKCksXG5cdFx0KCBwMyAhPT0gdW5kZWZpbmVkICkgPyBwMyA6IG5ldyBQbGFuZSgpLFxuXHRcdCggcDQgIT09IHVuZGVmaW5lZCApID8gcDQgOiBuZXcgUGxhbmUoKSxcblx0XHQoIHA1ICE9PSB1bmRlZmluZWQgKSA/IHA1IDogbmV3IFBsYW5lKClcblxuXHRdO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEZydXN0dW0ucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUgKSB7XG5cblx0XHR2YXIgcGxhbmVzID0gdGhpcy5wbGFuZXM7XG5cblx0XHRwbGFuZXNbIDAgXS5jb3B5KCBwMCApO1xuXHRcdHBsYW5lc1sgMSBdLmNvcHkoIHAxICk7XG5cdFx0cGxhbmVzWyAyIF0uY29weSggcDIgKTtcblx0XHRwbGFuZXNbIDMgXS5jb3B5KCBwMyApO1xuXHRcdHBsYW5lc1sgNCBdLmNvcHkoIHA0ICk7XG5cdFx0cGxhbmVzWyA1IF0uY29weSggcDUgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggZnJ1c3R1bSApIHtcblxuXHRcdHZhciBwbGFuZXMgPSB0aGlzLnBsYW5lcztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdHBsYW5lc1sgaSBdLmNvcHkoIGZydXN0dW0ucGxhbmVzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbU1hdHJpeDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXHRcdHZhciBtZSA9IG0uZWxlbWVudHM7XG5cdFx0dmFyIG1lMCA9IG1lWyAwIF0sIG1lMSA9IG1lWyAxIF0sIG1lMiA9IG1lWyAyIF0sIG1lMyA9IG1lWyAzIF07XG5cdFx0dmFyIG1lNCA9IG1lWyA0IF0sIG1lNSA9IG1lWyA1IF0sIG1lNiA9IG1lWyA2IF0sIG1lNyA9IG1lWyA3IF07XG5cdFx0dmFyIG1lOCA9IG1lWyA4IF0sIG1lOSA9IG1lWyA5IF0sIG1lMTAgPSBtZVsgMTAgXSwgbWUxMSA9IG1lWyAxMSBdO1xuXHRcdHZhciBtZTEyID0gbWVbIDEyIF0sIG1lMTMgPSBtZVsgMTMgXSwgbWUxNCA9IG1lWyAxNCBdLCBtZTE1ID0gbWVbIDE1IF07XG5cblx0XHRwbGFuZXNbIDAgXS5zZXRDb21wb25lbnRzKCBtZTMgLSBtZTAsIG1lNyAtIG1lNCwgbWUxMSAtIG1lOCwgbWUxNSAtIG1lMTIgKS5ub3JtYWxpemUoKTtcblx0XHRwbGFuZXNbIDEgXS5zZXRDb21wb25lbnRzKCBtZTMgKyBtZTAsIG1lNyArIG1lNCwgbWUxMSArIG1lOCwgbWUxNSArIG1lMTIgKS5ub3JtYWxpemUoKTtcblx0XHRwbGFuZXNbIDIgXS5zZXRDb21wb25lbnRzKCBtZTMgKyBtZTEsIG1lNyArIG1lNSwgbWUxMSArIG1lOSwgbWUxNSArIG1lMTMgKS5ub3JtYWxpemUoKTtcblx0XHRwbGFuZXNbIDMgXS5zZXRDb21wb25lbnRzKCBtZTMgLSBtZTEsIG1lNyAtIG1lNSwgbWUxMSAtIG1lOSwgbWUxNSAtIG1lMTMgKS5ub3JtYWxpemUoKTtcblx0XHRwbGFuZXNbIDQgXS5zZXRDb21wb25lbnRzKCBtZTMgLSBtZTIsIG1lNyAtIG1lNiwgbWUxMSAtIG1lMTAsIG1lMTUgLSBtZTE0ICkubm9ybWFsaXplKCk7XG5cdFx0cGxhbmVzWyA1IF0uc2V0Q29tcG9uZW50cyggbWUzICsgbWUyLCBtZTcgKyBtZTYsIG1lMTEgKyBtZTEwLCBtZTE1ICsgbWUxNCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzT2JqZWN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdHNPYmplY3QoIG9iamVjdCApIHtcblxuXHRcdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsIClcblx0XHRcdFx0Z2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRcdHNwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApXG5cdFx0XHRcdC5hcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludGVyc2VjdHNTcHJpdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0c1Nwcml0ZSggc3ByaXRlICkge1xuXG5cdFx0XHRzcGhlcmUuY2VudGVyLnNldCggMCwgMCwgMCApO1xuXHRcdFx0c3BoZXJlLnJhZGl1cyA9IDAuNzA3MTA2NzgxMTg2NTQ3Njtcblx0XHRcdHNwaGVyZS5hcHBseU1hdHJpeDQoIHNwcml0ZS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0dmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXHRcdHZhciBjZW50ZXIgPSBzcGhlcmUuY2VudGVyO1xuXHRcdHZhciBuZWdSYWRpdXMgPSAtIHNwaGVyZS5yYWRpdXM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHR2YXIgZGlzdGFuY2UgPSBwbGFuZXNbIGkgXS5kaXN0YW5jZVRvUG9pbnQoIGNlbnRlciApO1xuXG5cdFx0XHRpZiAoIGRpc3RhbmNlIDwgbmVnUmFkaXVzICkge1xuXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzQm94OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcDEgPSBuZXcgVmVjdG9yMygpLFxuXHRcdFx0cDIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdHNCb3goIGJveCApIHtcblxuXHRcdFx0dmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBwbGFuZSA9IHBsYW5lc1sgaSBdO1xuXG5cdFx0XHRcdHAxLnggPSBwbGFuZS5ub3JtYWwueCA+IDAgPyBib3gubWluLnggOiBib3gubWF4Lng7XG5cdFx0XHRcdHAyLnggPSBwbGFuZS5ub3JtYWwueCA+IDAgPyBib3gubWF4LnggOiBib3gubWluLng7XG5cdFx0XHRcdHAxLnkgPSBwbGFuZS5ub3JtYWwueSA+IDAgPyBib3gubWluLnkgOiBib3gubWF4Lnk7XG5cdFx0XHRcdHAyLnkgPSBwbGFuZS5ub3JtYWwueSA+IDAgPyBib3gubWF4LnkgOiBib3gubWluLnk7XG5cdFx0XHRcdHAxLnogPSBwbGFuZS5ub3JtYWwueiA+IDAgPyBib3gubWluLnogOiBib3gubWF4Lno7XG5cdFx0XHRcdHAyLnogPSBwbGFuZS5ub3JtYWwueiA+IDAgPyBib3gubWF4LnogOiBib3gubWluLno7XG5cblx0XHRcdFx0dmFyIGQxID0gcGxhbmUuZGlzdGFuY2VUb1BvaW50KCBwMSApO1xuXHRcdFx0XHR2YXIgZDIgPSBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIHAyICk7XG5cblx0XHRcdFx0Ly8gaWYgYm90aCBvdXRzaWRlIHBsYW5lLCBubyBpbnRlcnNlY3Rpb25cblxuXHRcdFx0XHRpZiAoIGQxIDwgMCAmJiBkMiA8IDAgKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y29udGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHZhciBwbGFuZXMgPSB0aGlzLnBsYW5lcztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdGlmICggcGxhbmVzWyBpIF0uZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIDwgMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXG5cdH1cblxufSApO1xuXG52YXIgYWxwaGFtYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQUxQSEFNQVBcXG5cXHRkaWZmdXNlQ29sb3IuYSAqPSB0ZXh0dXJlMkQoIGFscGhhTWFwLCB2VXYgKS5nO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgYWxwaGFtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9BTFBIQU1BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGFscGhhTWFwO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgYWxwaGF0ZXN0X2ZyYWdtZW50ID0gXCIjaWZkZWYgQUxQSEFURVNUXFxuXFx0aWYgKCBkaWZmdXNlQ29sb3IuYSA8IEFMUEhBVEVTVCApIGRpc2NhcmQ7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBhb21hcF9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9BT01BUFxcblxcdGZsb2F0IGFtYmllbnRPY2NsdXNpb24gPSAoIHRleHR1cmUyRCggYW9NYXAsIHZVdjIgKS5yIC0gMS4wICkgKiBhb01hcEludGVuc2l0eSArIDEuMDtcXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gYW1iaWVudE9jY2x1c2lvbjtcXG5cXHQjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFBIWVNJQ0FMIClcXG5cXHRcXHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciAqPSBjb21wdXRlU3BlY3VsYXJPY2NsdXNpb24oIGRvdE5WLCBhbWJpZW50T2NjbHVzaW9uLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApO1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgYW9tYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9BT01BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGFvTWFwO1xcblxcdHVuaWZvcm0gZmxvYXQgYW9NYXBJbnRlbnNpdHk7XFxuI2VuZGlmXCI7XG5cbnZhciBiZWdpbl92ZXJ0ZXggPSBcIlxcbnZlYzMgdHJhbnNmb3JtZWQgPSB2ZWMzKCBwb3NpdGlvbiApO1xcblwiO1xuXG52YXIgYmVnaW5ub3JtYWxfdmVydGV4ID0gXCJcXG52ZWMzIG9iamVjdE5vcm1hbCA9IHZlYzMoIG5vcm1hbCApO1xcblwiO1xuXG52YXIgYnNkZnMgPSBcImZsb2F0IHB1bmN0dWFsTGlnaHRJbnRlbnNpdHlUb0lycmFkaWFuY2VGYWN0b3IoIGNvbnN0IGluIGZsb2F0IGxpZ2h0RGlzdGFuY2UsIGNvbnN0IGluIGZsb2F0IGN1dG9mZkRpc3RhbmNlLCBjb25zdCBpbiBmbG9hdCBkZWNheUV4cG9uZW50ICkge1xcblxcdGlmKCBkZWNheUV4cG9uZW50ID4gMC4wICkge1xcbiNpZiBkZWZpbmVkICggUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUUyApXFxuXFx0XFx0ZmxvYXQgZGlzdGFuY2VGYWxsb2ZmID0gMS4wIC8gbWF4KCBwb3coIGxpZ2h0RGlzdGFuY2UsIGRlY2F5RXhwb25lbnQgKSwgMC4wMSApO1xcblxcdFxcdGZsb2F0IG1heERpc3RhbmNlQ3V0b2ZmRmFjdG9yID0gcG93Miggc2F0dXJhdGUoIDEuMCAtIHBvdzQoIGxpZ2h0RGlzdGFuY2UgLyBjdXRvZmZEaXN0YW5jZSApICkgKTtcXG5cXHRcXHRyZXR1cm4gZGlzdGFuY2VGYWxsb2ZmICogbWF4RGlzdGFuY2VDdXRvZmZGYWN0b3I7XFxuI2Vsc2VcXG5cXHRcXHRyZXR1cm4gcG93KCBzYXR1cmF0ZSggLWxpZ2h0RGlzdGFuY2UgLyBjdXRvZmZEaXN0YW5jZSArIDEuMCApLCBkZWNheUV4cG9uZW50ICk7XFxuI2VuZGlmXFxuXFx0fVxcblxcdHJldHVybiAxLjA7XFxufVxcbnZlYzMgQlJERl9EaWZmdXNlX0xhbWJlcnQoIGNvbnN0IGluIHZlYzMgZGlmZnVzZUNvbG9yICkge1xcblxcdHJldHVybiBSRUNJUFJPQ0FMX1BJICogZGlmZnVzZUNvbG9yO1xcbn1cXG52ZWMzIEZfU2NobGljayggY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBkb3RMSCApIHtcXG5cXHRmbG9hdCBmcmVzbmVsID0gZXhwMiggKCAtNS41NTQ3MyAqIGRvdExIIC0gNi45ODMxNiApICogZG90TEggKTtcXG5cXHRyZXR1cm4gKCAxLjAgLSBzcGVjdWxhckNvbG9yICkgKiBmcmVzbmVsICsgc3BlY3VsYXJDb2xvcjtcXG59XFxuZmxvYXQgR19HR1hfU21pdGgoIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKSB7XFxuXFx0ZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApO1xcblxcdGZsb2F0IGdsID0gZG90TkwgKyBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5MICkgKTtcXG5cXHRmbG9hdCBndiA9IGRvdE5WICsgc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROViApICk7XFxuXFx0cmV0dXJuIDEuMCAvICggZ2wgKiBndiApO1xcbn1cXG5mbG9hdCBHX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKSB7XFxuXFx0ZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApO1xcblxcdGZsb2F0IGd2ID0gZG90TkwgKiBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5WICkgKTtcXG5cXHRmbG9hdCBnbCA9IGRvdE5WICogc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROTCApICk7XFxuXFx0cmV0dXJuIDAuNSAvIG1heCggZ3YgKyBnbCwgRVBTSUxPTiApO1xcbn1cXG5mbG9hdCBEX0dHWCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5IICkge1xcblxcdGZsb2F0IGEyID0gcG93MiggYWxwaGEgKTtcXG5cXHRmbG9hdCBkZW5vbSA9IHBvdzIoIGRvdE5IICkgKiAoIGEyIC0gMS4wICkgKyAxLjA7XFxuXFx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiBhMiAvIHBvdzIoIGRlbm9tICk7XFxufVxcbnZlYzMgQlJERl9TcGVjdWxhcl9HR1goIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XFxuXFx0ZmxvYXQgYWxwaGEgPSBwb3cyKCByb3VnaG5lc3MgKTtcXG5cXHR2ZWMzIGhhbGZEaXIgPSBub3JtYWxpemUoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uICsgZ2VvbWV0cnkudmlld0RpciApO1xcblxcdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiApICk7XFxuXFx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGdlb21ldHJ5LnZpZXdEaXIgKSApO1xcblxcdGZsb2F0IGRvdE5IID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoYWxmRGlyICkgKTtcXG5cXHRmbG9hdCBkb3RMSCA9IHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcXG5cXHR2ZWMzIEYgPSBGX1NjaGxpY2soIHNwZWN1bGFyQ29sb3IsIGRvdExIICk7XFxuXFx0ZmxvYXQgRyA9IEdfR0dYX1NtaXRoQ29ycmVsYXRlZCggYWxwaGEsIGRvdE5MLCBkb3ROViApO1xcblxcdGZsb2F0IEQgPSBEX0dHWCggYWxwaGEsIGRvdE5IICk7XFxuXFx0cmV0dXJuIEYgKiAoIEcgKiBEICk7XFxufVxcbnZlYzIgTFRDX1V2KCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xcblxcdGNvbnN0IGZsb2F0IExVVF9TSVpFICA9IDY0LjA7XFxuXFx0Y29uc3QgZmxvYXQgTFVUX1NDQUxFID0gKCBMVVRfU0laRSAtIDEuMCApIC8gTFVUX1NJWkU7XFxuXFx0Y29uc3QgZmxvYXQgTFVUX0JJQVMgID0gMC41IC8gTFVUX1NJWkU7XFxuXFx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBOLCBWICkgKTtcXG5cXHR2ZWMyIHV2ID0gdmVjMiggcm91Z2huZXNzLCBzcXJ0KCAxLjAgLSBkb3ROViApICk7XFxuXFx0dXYgPSB1diAqIExVVF9TQ0FMRSArIExVVF9CSUFTO1xcblxcdHJldHVybiB1djtcXG59XFxuZmxvYXQgTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCBjb25zdCBpbiB2ZWMzIGYgKSB7XFxuXFx0ZmxvYXQgbCA9IGxlbmd0aCggZiApO1xcblxcdHJldHVybiBtYXgoICggbCAqIGwgKyBmLnogKSAvICggbCArIDEuMCApLCAwLjAgKTtcXG59XFxudmVjMyBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvbnN0IGluIHZlYzMgdjEsIGNvbnN0IGluIHZlYzMgdjIgKSB7XFxuXFx0ZmxvYXQgeCA9IGRvdCggdjEsIHYyICk7XFxuXFx0ZmxvYXQgeSA9IGFicyggeCApO1xcblxcdGZsb2F0IGEgPSAwLjg1NDM5ODUgKyAoIDAuNDk2NTE1NSArIDAuMDE0NTIwNiAqIHkgKSAqIHk7XFxuXFx0ZmxvYXQgYiA9IDMuNDE3NTk0MCArICggNC4xNjE2NzI0ICsgeSApICogeTtcXG5cXHRmbG9hdCB2ID0gYSAvIGI7XFxuXFx0ZmxvYXQgdGhldGFfc2ludGhldGEgPSAoIHggPiAwLjAgKSA/IHYgOiAwLjUgKiBpbnZlcnNlc3FydCggbWF4KCAxLjAgLSB4ICogeCwgMWUtNyApICkgLSB2O1xcblxcdHJldHVybiBjcm9zcyggdjEsIHYyICkgKiB0aGV0YV9zaW50aGV0YTtcXG59XFxudmVjMyBMVENfRXZhbHVhdGUoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiB2ZWMzIFAsIGNvbnN0IGluIG1hdDMgbUludiwgY29uc3QgaW4gdmVjMyByZWN0Q29vcmRzWyA0IF0gKSB7XFxuXFx0dmVjMyB2MSA9IHJlY3RDb29yZHNbIDEgXSAtIHJlY3RDb29yZHNbIDAgXTtcXG5cXHR2ZWMzIHYyID0gcmVjdENvb3Jkc1sgMyBdIC0gcmVjdENvb3Jkc1sgMCBdO1xcblxcdHZlYzMgbGlnaHROb3JtYWwgPSBjcm9zcyggdjEsIHYyICk7XFxuXFx0aWYoIGRvdCggbGlnaHROb3JtYWwsIFAgLSByZWN0Q29vcmRzWyAwIF0gKSA8IDAuMCApIHJldHVybiB2ZWMzKCAwLjAgKTtcXG5cXHR2ZWMzIFQxLCBUMjtcXG5cXHRUMSA9IG5vcm1hbGl6ZSggViAtIE4gKiBkb3QoIFYsIE4gKSApO1xcblxcdFQyID0gLSBjcm9zcyggTiwgVDEgKTtcXG5cXHRtYXQzIG1hdCA9IG1JbnYgKiB0cmFuc3Bvc2VNYXQzKCBtYXQzKCBUMSwgVDIsIE4gKSApO1xcblxcdHZlYzMgY29vcmRzWyA0IF07XFxuXFx0Y29vcmRzWyAwIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDAgXSAtIFAgKTtcXG5cXHRjb29yZHNbIDEgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMSBdIC0gUCApO1xcblxcdGNvb3Jkc1sgMiBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAyIF0gLSBQICk7XFxuXFx0Y29vcmRzWyAzIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDMgXSAtIFAgKTtcXG5cXHRjb29yZHNbIDAgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAwIF0gKTtcXG5cXHRjb29yZHNbIDEgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAxIF0gKTtcXG5cXHRjb29yZHNbIDIgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAyIF0gKTtcXG5cXHRjb29yZHNbIDMgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAzIF0gKTtcXG5cXHR2ZWMzIHZlY3RvckZvcm1GYWN0b3IgPSB2ZWMzKCAwLjAgKTtcXG5cXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAwIF0sIGNvb3Jkc1sgMSBdICk7XFxuXFx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMSBdLCBjb29yZHNbIDIgXSApO1xcblxcdHZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDIgXSwgY29vcmRzWyAzIF0gKTtcXG5cXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAzIF0sIGNvb3Jkc1sgMCBdICk7XFxuXFx0ZmxvYXQgcmVzdWx0ID0gTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCB2ZWN0b3JGb3JtRmFjdG9yICk7XFxuXFx0cmV0dXJuIHZlYzMoIHJlc3VsdCApO1xcbn1cXG52ZWMzIEJSREZfU3BlY3VsYXJfR0dYX0Vudmlyb25tZW50KCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcXG5cXHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XFxuXFx0Y29uc3QgdmVjNCBjMCA9IHZlYzQoIC0gMSwgLSAwLjAyNzUsIC0gMC41NzIsIDAuMDIyICk7XFxuXFx0Y29uc3QgdmVjNCBjMSA9IHZlYzQoIDEsIDAuMDQyNSwgMS4wNCwgLSAwLjA0ICk7XFxuXFx0dmVjNCByID0gcm91Z2huZXNzICogYzAgKyBjMTtcXG5cXHRmbG9hdCBhMDA0ID0gbWluKCByLnggKiByLngsIGV4cDIoIC0gOS4yOCAqIGRvdE5WICkgKSAqIHIueCArIHIueTtcXG5cXHR2ZWMyIEFCID0gdmVjMiggLTEuMDQsIDEuMDQgKSAqIGEwMDQgKyByLnp3O1xcblxcdHJldHVybiBzcGVjdWxhckNvbG9yICogQUIueCArIEFCLnk7XFxufVxcbmZsb2F0IEdfQmxpbm5QaG9uZ19JbXBsaWNpdCggKSB7XFxuXFx0cmV0dXJuIDAuMjU7XFxufVxcbmZsb2F0IERfQmxpbm5QaG9uZyggY29uc3QgaW4gZmxvYXQgc2hpbmluZXNzLCBjb25zdCBpbiBmbG9hdCBkb3ROSCApIHtcXG5cXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqICggc2hpbmluZXNzICogMC41ICsgMS4wICkgKiBwb3coIGRvdE5ILCBzaGluaW5lc3MgKTtcXG59XFxudmVjMyBCUkRGX1NwZWN1bGFyX0JsaW5uUGhvbmcoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzaGluaW5lc3MgKSB7XFxuXFx0dmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiArIGdlb21ldHJ5LnZpZXdEaXIgKTtcXG5cXHRmbG9hdCBkb3ROSCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgaGFsZkRpciApICk7XFxuXFx0ZmxvYXQgZG90TEggPSBzYXR1cmF0ZSggZG90KCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiwgaGFsZkRpciApICk7XFxuXFx0dmVjMyBGID0gRl9TY2hsaWNrKCBzcGVjdWxhckNvbG9yLCBkb3RMSCApO1xcblxcdGZsb2F0IEcgPSBHX0JsaW5uUGhvbmdfSW1wbGljaXQoICk7XFxuXFx0ZmxvYXQgRCA9IERfQmxpbm5QaG9uZyggc2hpbmluZXNzLCBkb3ROSCApO1xcblxcdHJldHVybiBGICogKCBHICogRCApO1xcbn1cXG5mbG9hdCBHR1hSb3VnaG5lc3NUb0JsaW5uRXhwb25lbnQoIGNvbnN0IGluIGZsb2F0IGdneFJvdWdobmVzcyApIHtcXG5cXHRyZXR1cm4gKCAyLjAgLyBwb3cyKCBnZ3hSb3VnaG5lc3MgKyAwLjAwMDEgKSAtIDIuMCApO1xcbn1cXG5mbG9hdCBCbGlubkV4cG9uZW50VG9HR1hSb3VnaG5lc3MoIGNvbnN0IGluIGZsb2F0IGJsaW5uRXhwb25lbnQgKSB7XFxuXFx0cmV0dXJuIHNxcnQoIDIuMCAvICggYmxpbm5FeHBvbmVudCArIDIuMCApICk7XFxufVxcblwiO1xuXG52YXIgYnVtcG1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0JVTVBNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBidW1wTWFwO1xcblxcdHVuaWZvcm0gZmxvYXQgYnVtcFNjYWxlO1xcblxcdHZlYzIgZEhkeHlfZndkKCkge1xcblxcdFxcdHZlYzIgZFNUZHggPSBkRmR4KCB2VXYgKTtcXG5cXHRcXHR2ZWMyIGRTVGR5ID0gZEZkeSggdlV2ICk7XFxuXFx0XFx0ZmxvYXQgSGxsID0gYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2VXYgKS54O1xcblxcdFxcdGZsb2F0IGRCeCA9IGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICsgZFNUZHggKS54IC0gSGxsO1xcblxcdFxcdGZsb2F0IGRCeSA9IGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICsgZFNUZHkgKS54IC0gSGxsO1xcblxcdFxcdHJldHVybiB2ZWMyKCBkQngsIGRCeSApO1xcblxcdH1cXG5cXHR2ZWMzIHBlcnR1cmJOb3JtYWxBcmIoIHZlYzMgc3VyZl9wb3MsIHZlYzMgc3VyZl9ub3JtLCB2ZWMyIGRIZHh5ICkge1xcblxcdFxcdHZlYzMgdlNpZ21hWCA9IHZlYzMoIGRGZHgoIHN1cmZfcG9zLnggKSwgZEZkeCggc3VyZl9wb3MueSApLCBkRmR4KCBzdXJmX3Bvcy56ICkgKTtcXG5cXHRcXHR2ZWMzIHZTaWdtYVkgPSB2ZWMzKCBkRmR5KCBzdXJmX3Bvcy54ICksIGRGZHkoIHN1cmZfcG9zLnkgKSwgZEZkeSggc3VyZl9wb3MueiApICk7XFxuXFx0XFx0dmVjMyB2TiA9IHN1cmZfbm9ybTtcXG5cXHRcXHR2ZWMzIFIxID0gY3Jvc3MoIHZTaWdtYVksIHZOICk7XFxuXFx0XFx0dmVjMyBSMiA9IGNyb3NzKCB2TiwgdlNpZ21hWCApO1xcblxcdFxcdGZsb2F0IGZEZXQgPSBkb3QoIHZTaWdtYVgsIFIxICk7XFxuXFx0XFx0dmVjMyB2R3JhZCA9IHNpZ24oIGZEZXQgKSAqICggZEhkeHkueCAqIFIxICsgZEhkeHkueSAqIFIyICk7XFxuXFx0XFx0cmV0dXJuIG5vcm1hbGl6ZSggYWJzKCBmRGV0ICkgKiBzdXJmX25vcm0gLSB2R3JhZCApO1xcblxcdH1cXG4jZW5kaWZcXG5cIjtcblxudmFyIGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudCA9IFwiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwXFxuXFx0dmVjNCBwbGFuZTtcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgVU5JT05fQ0xJUFBJTkdfUExBTkVTOyBpICsrICkge1xcblxcdFxcdHBsYW5lID0gY2xpcHBpbmdQbGFuZXNbIGkgXTtcXG5cXHRcXHRpZiAoIGRvdCggdlZpZXdQb3NpdGlvbiwgcGxhbmUueHl6ICkgPiBwbGFuZS53ICkgZGlzY2FyZDtcXG5cXHR9XFxuXFx0I2lmIFVOSU9OX0NMSVBQSU5HX1BMQU5FUyA8IE5VTV9DTElQUElOR19QTEFORVNcXG5cXHRcXHRib29sIGNsaXBwZWQgPSB0cnVlO1xcblxcdFxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRcXHRmb3IgKCBpbnQgaSA9IFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSA8IE5VTV9DTElQUElOR19QTEFORVM7IGkgKysgKSB7XFxuXFx0XFx0XFx0cGxhbmUgPSBjbGlwcGluZ1BsYW5lc1sgaSBdO1xcblxcdFxcdFxcdGNsaXBwZWQgPSAoIGRvdCggdlZpZXdQb3NpdGlvbiwgcGxhbmUueHl6ICkgPiBwbGFuZS53ICkgJiYgY2xpcHBlZDtcXG5cXHRcXHR9XFxuXFx0XFx0aWYgKCBjbGlwcGVkICkgZGlzY2FyZDtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50ID0gXCIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDBcXG5cXHQjaWYgISBkZWZpbmVkKCBQSFlTSUNBTCApICYmICEgZGVmaW5lZCggUEhPTkcgKVxcblxcdFxcdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcblxcdCNlbmRpZlxcblxcdHVuaWZvcm0gdmVjNCBjbGlwcGluZ1BsYW5lc1sgTlVNX0NMSVBQSU5HX1BMQU5FUyBdO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4ID0gXCIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDAgJiYgISBkZWZpbmVkKCBQSFlTSUNBTCApICYmICEgZGVmaW5lZCggUEhPTkcgKVxcblxcdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgY2xpcHBpbmdfcGxhbmVzX3ZlcnRleCA9IFwiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwICYmICEgZGVmaW5lZCggUEhZU0lDQUwgKSAmJiAhIGRlZmluZWQoIFBIT05HIClcXG5cXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGNvbG9yX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0NPTE9SXFxuXFx0ZGlmZnVzZUNvbG9yLnJnYiAqPSB2Q29sb3I7XFxuI2VuZGlmXCI7XG5cbnZhciBjb2xvcl9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0NPTE9SXFxuXFx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGNvbG9yX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0NPTE9SXFxuXFx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcXG4jZW5kaWZcIjtcblxudmFyIGNvbG9yX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9DT0xPUlxcblxcdHZDb2xvci54eXogPSBjb2xvci54eXo7XFxuI2VuZGlmXCI7XG5cbnZhciBjb21tb24gPSBcIiNkZWZpbmUgUEkgMy4xNDE1OTI2NTM1OVxcbiNkZWZpbmUgUEkyIDYuMjgzMTg1MzA3MThcXG4jZGVmaW5lIFBJX0hBTEYgMS41NzA3OTYzMjY3OTQ5XFxuI2RlZmluZSBSRUNJUFJPQ0FMX1BJIDAuMzE4MzA5ODg2MThcXG4jZGVmaW5lIFJFQ0lQUk9DQUxfUEkyIDAuMTU5MTU0OTRcXG4jZGVmaW5lIExPRzIgMS40NDI2OTVcXG4jZGVmaW5lIEVQU0lMT04gMWUtNlxcbiNkZWZpbmUgc2F0dXJhdGUoYSkgY2xhbXAoIGEsIDAuMCwgMS4wIClcXG4jZGVmaW5lIHdoaXRlQ29tcGxpbWVudChhKSAoIDEuMCAtIHNhdHVyYXRlKCBhICkgKVxcbmZsb2F0IHBvdzIoIGNvbnN0IGluIGZsb2F0IHggKSB7IHJldHVybiB4Kng7IH1cXG5mbG9hdCBwb3czKCBjb25zdCBpbiBmbG9hdCB4ICkgeyByZXR1cm4geCp4Kng7IH1cXG5mbG9hdCBwb3c0KCBjb25zdCBpbiBmbG9hdCB4ICkgeyBmbG9hdCB4MiA9IHgqeDsgcmV0dXJuIHgyKngyOyB9XFxuZmxvYXQgYXZlcmFnZSggY29uc3QgaW4gdmVjMyBjb2xvciApIHsgcmV0dXJuIGRvdCggY29sb3IsIHZlYzMoIDAuMzMzMyApICk7IH1cXG5oaWdocCBmbG9hdCByYW5kKCBjb25zdCBpbiB2ZWMyIHV2ICkge1xcblxcdGNvbnN0IGhpZ2hwIGZsb2F0IGEgPSAxMi45ODk4LCBiID0gNzguMjMzLCBjID0gNDM3NTguNTQ1MztcXG5cXHRoaWdocCBmbG9hdCBkdCA9IGRvdCggdXYueHksIHZlYzIoIGEsYiApICksIHNuID0gbW9kKCBkdCwgUEkgKTtcXG5cXHRyZXR1cm4gZnJhY3Qoc2luKHNuKSAqIGMpO1xcbn1cXG5zdHJ1Y3QgSW5jaWRlbnRMaWdodCB7XFxuXFx0dmVjMyBjb2xvcjtcXG5cXHR2ZWMzIGRpcmVjdGlvbjtcXG5cXHRib29sIHZpc2libGU7XFxufTtcXG5zdHJ1Y3QgUmVmbGVjdGVkTGlnaHQge1xcblxcdHZlYzMgZGlyZWN0RGlmZnVzZTtcXG5cXHR2ZWMzIGRpcmVjdFNwZWN1bGFyO1xcblxcdHZlYzMgaW5kaXJlY3REaWZmdXNlO1xcblxcdHZlYzMgaW5kaXJlY3RTcGVjdWxhcjtcXG59O1xcbnN0cnVjdCBHZW9tZXRyaWNDb250ZXh0IHtcXG5cXHR2ZWMzIHBvc2l0aW9uO1xcblxcdHZlYzMgbm9ybWFsO1xcblxcdHZlYzMgdmlld0RpcjtcXG59O1xcbnZlYzMgdHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIGRpciwgaW4gbWF0NCBtYXRyaXggKSB7XFxuXFx0cmV0dXJuIG5vcm1hbGl6ZSggKCBtYXRyaXggKiB2ZWM0KCBkaXIsIDAuMCApICkueHl6ICk7XFxufVxcbnZlYzMgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xcblxcdHJldHVybiBub3JtYWxpemUoICggdmVjNCggZGlyLCAwLjAgKSAqIG1hdHJpeCApLnh5eiApO1xcbn1cXG52ZWMzIHByb2plY3RPblBsYW5lKGluIHZlYzMgcG9pbnQsIGluIHZlYzMgcG9pbnRPblBsYW5lLCBpbiB2ZWMzIHBsYW5lTm9ybWFsICkge1xcblxcdGZsb2F0IGRpc3RhbmNlID0gZG90KCBwbGFuZU5vcm1hbCwgcG9pbnQgLSBwb2ludE9uUGxhbmUgKTtcXG5cXHRyZXR1cm4gLSBkaXN0YW5jZSAqIHBsYW5lTm9ybWFsICsgcG9pbnQ7XFxufVxcbmZsb2F0IHNpZGVPZlBsYW5lKCBpbiB2ZWMzIHBvaW50LCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcXG5cXHRyZXR1cm4gc2lnbiggZG90KCBwb2ludCAtIHBvaW50T25QbGFuZSwgcGxhbmVOb3JtYWwgKSApO1xcbn1cXG52ZWMzIGxpbmVQbGFuZUludGVyc2VjdCggaW4gdmVjMyBwb2ludE9uTGluZSwgaW4gdmVjMyBsaW5lRGlyZWN0aW9uLCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcXG5cXHRyZXR1cm4gbGluZURpcmVjdGlvbiAqICggZG90KCBwbGFuZU5vcm1hbCwgcG9pbnRPblBsYW5lIC0gcG9pbnRPbkxpbmUgKSAvIGRvdCggcGxhbmVOb3JtYWwsIGxpbmVEaXJlY3Rpb24gKSApICsgcG9pbnRPbkxpbmU7XFxufVxcbm1hdDMgdHJhbnNwb3NlTWF0MyggY29uc3QgaW4gbWF0MyBtICkge1xcblxcdG1hdDMgdG1wO1xcblxcdHRtcFsgMCBdID0gdmVjMyggbVsgMCBdLngsIG1bIDEgXS54LCBtWyAyIF0ueCApO1xcblxcdHRtcFsgMSBdID0gdmVjMyggbVsgMCBdLnksIG1bIDEgXS55LCBtWyAyIF0ueSApO1xcblxcdHRtcFsgMiBdID0gdmVjMyggbVsgMCBdLnosIG1bIDEgXS56LCBtWyAyIF0ueiApO1xcblxcdHJldHVybiB0bXA7XFxufVxcbmZsb2F0IGxpbmVhclRvUmVsYXRpdmVMdW1pbmFuY2UoIGNvbnN0IGluIHZlYzMgY29sb3IgKSB7XFxuXFx0dmVjMyB3ZWlnaHRzID0gdmVjMyggMC4yMTI2LCAwLjcxNTIsIDAuMDcyMiApO1xcblxcdHJldHVybiBkb3QoIHdlaWdodHMsIGNvbG9yLnJnYiApO1xcbn1cXG5cIjtcblxudmFyIGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudCA9IFwiI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVfVVZcXG4jZGVmaW5lIGN1YmVVVl90ZXh0dXJlU2l6ZSAoMTAyNC4wKVxcbmludCBnZXRGYWNlRnJvbURpcmVjdGlvbih2ZWMzIGRpcmVjdGlvbikge1xcblxcdHZlYzMgYWJzRGlyZWN0aW9uID0gYWJzKGRpcmVjdGlvbik7XFxuXFx0aW50IGZhY2UgPSAtMTtcXG5cXHRpZiggYWJzRGlyZWN0aW9uLnggPiBhYnNEaXJlY3Rpb24ueiApIHtcXG5cXHRcXHRpZihhYnNEaXJlY3Rpb24ueCA+IGFic0RpcmVjdGlvbi55IClcXG5cXHRcXHRcXHRmYWNlID0gZGlyZWN0aW9uLnggPiAwLjAgPyAwIDogMztcXG5cXHRcXHRlbHNlXFxuXFx0XFx0XFx0ZmFjZSA9IGRpcmVjdGlvbi55ID4gMC4wID8gMSA6IDQ7XFxuXFx0fVxcblxcdGVsc2Uge1xcblxcdFxcdGlmKGFic0RpcmVjdGlvbi56ID4gYWJzRGlyZWN0aW9uLnkgKVxcblxcdFxcdFxcdGZhY2UgPSBkaXJlY3Rpb24ueiA+IDAuMCA/IDIgOiA1O1xcblxcdFxcdGVsc2VcXG5cXHRcXHRcXHRmYWNlID0gZGlyZWN0aW9uLnkgPiAwLjAgPyAxIDogNDtcXG5cXHR9XFxuXFx0cmV0dXJuIGZhY2U7XFxufVxcbiNkZWZpbmUgY3ViZVVWX21heExvZHMxICAobG9nMihjdWJlVVZfdGV4dHVyZVNpemUqMC4yNSkgLSAxLjApXFxuI2RlZmluZSBjdWJlVVZfcmFuZ2VDbGFtcCAoZXhwMigoNi4wIC0gMS4wKSAqIDIuMCkpXFxudmVjMiBNaXBMZXZlbEluZm8oIHZlYzMgdmVjLCBmbG9hdCByb3VnaG5lc3NMZXZlbCwgZmxvYXQgcm91Z2huZXNzICkge1xcblxcdGZsb2F0IHNjYWxlID0gZXhwMihjdWJlVVZfbWF4TG9kczEgLSByb3VnaG5lc3NMZXZlbCk7XFxuXFx0ZmxvYXQgZHhSb3VnaG5lc3MgPSBkRmR4KHJvdWdobmVzcyk7XFxuXFx0ZmxvYXQgZHlSb3VnaG5lc3MgPSBkRmR5KHJvdWdobmVzcyk7XFxuXFx0dmVjMyBkeCA9IGRGZHgoIHZlYyAqIHNjYWxlICogZHhSb3VnaG5lc3MgKTtcXG5cXHR2ZWMzIGR5ID0gZEZkeSggdmVjICogc2NhbGUgKiBkeVJvdWdobmVzcyApO1xcblxcdGZsb2F0IGQgPSBtYXgoIGRvdCggZHgsIGR4ICksIGRvdCggZHksIGR5ICkgKTtcXG5cXHRkID0gY2xhbXAoZCwgMS4wLCBjdWJlVVZfcmFuZ2VDbGFtcCk7XFxuXFx0ZmxvYXQgbWlwTGV2ZWwgPSAwLjUgKiBsb2cyKGQpO1xcblxcdHJldHVybiB2ZWMyKGZsb29yKG1pcExldmVsKSwgZnJhY3QobWlwTGV2ZWwpKTtcXG59XFxuI2RlZmluZSBjdWJlVVZfbWF4TG9kczIgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMi4wKVxcbiNkZWZpbmUgY3ViZVVWX3JjcFRleHR1cmVTaXplICgxLjAgLyBjdWJlVVZfdGV4dHVyZVNpemUpXFxudmVjMiBnZXRDdWJlVVYodmVjMyBkaXJlY3Rpb24sIGZsb2F0IHJvdWdobmVzc0xldmVsLCBmbG9hdCBtaXBMZXZlbCkge1xcblxcdG1pcExldmVsID0gcm91Z2huZXNzTGV2ZWwgPiBjdWJlVVZfbWF4TG9kczIgLSAzLjAgPyAwLjAgOiBtaXBMZXZlbDtcXG5cXHRmbG9hdCBhID0gMTYuMCAqIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZTtcXG5cXHR2ZWMyIGV4cDJfcGFja2VkID0gZXhwMiggdmVjMiggcm91Z2huZXNzTGV2ZWwsIG1pcExldmVsICkgKTtcXG5cXHR2ZWMyIHJjcF9leHAyX3BhY2tlZCA9IHZlYzIoIDEuMCApIC8gZXhwMl9wYWNrZWQ7XFxuXFx0ZmxvYXQgcG93U2NhbGUgPSBleHAyX3BhY2tlZC54ICogZXhwMl9wYWNrZWQueTtcXG5cXHRmbG9hdCBzY2FsZSA9IHJjcF9leHAyX3BhY2tlZC54ICogcmNwX2V4cDJfcGFja2VkLnkgKiAwLjI1O1xcblxcdGZsb2F0IG1pcE9mZnNldCA9IDAuNzUqKDEuMCAtIHJjcF9leHAyX3BhY2tlZC55KSAqIHJjcF9leHAyX3BhY2tlZC54O1xcblxcdGJvb2wgYlJlcyA9IG1pcExldmVsID09IDAuMDtcXG5cXHRzY2FsZSA9ICBiUmVzICYmIChzY2FsZSA8IGEpID8gYSA6IHNjYWxlO1xcblxcdHZlYzMgcjtcXG5cXHR2ZWMyIG9mZnNldDtcXG5cXHRpbnQgZmFjZSA9IGdldEZhY2VGcm9tRGlyZWN0aW9uKGRpcmVjdGlvbik7XFxuXFx0ZmxvYXQgcmNwUG93U2NhbGUgPSAxLjAgLyBwb3dTY2FsZTtcXG5cXHRpZiggZmFjZSA9PSAwKSB7XFxuXFx0XFx0ciA9IHZlYzMoZGlyZWN0aW9uLngsIC1kaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkpO1xcblxcdFxcdG9mZnNldCA9IHZlYzIoMC4wK21pcE9mZnNldCwwLjc1ICogcmNwUG93U2NhbGUpO1xcblxcdFxcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyBhIDogb2Zmc2V0Lnk7XFxuXFx0fVxcblxcdGVsc2UgaWYoIGZhY2UgPT0gMSkge1xcblxcdFxcdHIgPSB2ZWMzKGRpcmVjdGlvbi55LCBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnopO1xcblxcdFxcdG9mZnNldCA9IHZlYzIoc2NhbGUrbWlwT2Zmc2V0LCAwLjc1ICogcmNwUG93U2NhbGUpO1xcblxcdFxcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyBhIDogb2Zmc2V0Lnk7XFxuXFx0fVxcblxcdGVsc2UgaWYoIGZhY2UgPT0gMikge1xcblxcdFxcdHIgPSB2ZWMzKGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkpO1xcblxcdFxcdG9mZnNldCA9IHZlYzIoMi4wKnNjYWxlK21pcE9mZnNldCwgMC43NSAqIHJjcFBvd1NjYWxlKTtcXG5cXHRcXHRvZmZzZXQueSA9IGJSZXMgJiYgKG9mZnNldC55IDwgMi4wKmEpID8gYSA6IG9mZnNldC55O1xcblxcdH1cXG5cXHRlbHNlIGlmKCBmYWNlID09IDMpIHtcXG5cXHRcXHRyID0gdmVjMyhkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnosIGRpcmVjdGlvbi55KTtcXG5cXHRcXHRvZmZzZXQgPSB2ZWMyKDAuMCttaXBPZmZzZXQsMC41ICogcmNwUG93U2NhbGUpO1xcblxcdFxcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcXG5cXHR9XFxuXFx0ZWxzZSBpZiggZmFjZSA9PSA0KSB7XFxuXFx0XFx0ciA9IHZlYzMoZGlyZWN0aW9uLnksIGRpcmVjdGlvbi54LCAtZGlyZWN0aW9uLnopO1xcblxcdFxcdG9mZnNldCA9IHZlYzIoc2NhbGUrbWlwT2Zmc2V0LCAwLjUgKiByY3BQb3dTY2FsZSk7XFxuXFx0XFx0b2Zmc2V0LnkgPSBiUmVzICYmIChvZmZzZXQueSA8IDIuMCphKSA/IDAuMCA6IG9mZnNldC55O1xcblxcdH1cXG5cXHRlbHNlIHtcXG5cXHRcXHRyID0gdmVjMyhkaXJlY3Rpb24ueiwgLWRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueSk7XFxuXFx0XFx0b2Zmc2V0ID0gdmVjMigyLjAqc2NhbGUrbWlwT2Zmc2V0LCAwLjUgKiByY3BQb3dTY2FsZSk7XFxuXFx0XFx0b2Zmc2V0LnkgPSBiUmVzICYmIChvZmZzZXQueSA8IDIuMCphKSA/IDAuMCA6IG9mZnNldC55O1xcblxcdH1cXG5cXHRyID0gbm9ybWFsaXplKHIpO1xcblxcdGZsb2F0IHRleGVsT2Zmc2V0ID0gMC41ICogY3ViZVVWX3JjcFRleHR1cmVTaXplO1xcblxcdHZlYzIgcyA9ICggci55eiAvIGFicyggci54ICkgKyB2ZWMyKCAxLjAgKSApICogMC41O1xcblxcdHZlYzIgYmFzZSA9IG9mZnNldCArIHZlYzIoIHRleGVsT2Zmc2V0ICk7XFxuXFx0cmV0dXJuIGJhc2UgKyBzICogKCBzY2FsZSAtIDIuMCAqIHRleGVsT2Zmc2V0ICk7XFxufVxcbiNkZWZpbmUgY3ViZVVWX21heExvZHMzIChsb2cyKGN1YmVVVl90ZXh0dXJlU2l6ZSowLjI1KSAtIDMuMClcXG52ZWM0IHRleHR1cmVDdWJlVVYodmVjMyByZWZsZWN0ZWREaXJlY3Rpb24sIGZsb2F0IHJvdWdobmVzcyApIHtcXG5cXHRmbG9hdCByb3VnaG5lc3NWYWwgPSByb3VnaG5lc3MqIGN1YmVVVl9tYXhMb2RzMztcXG5cXHRmbG9hdCByMSA9IGZsb29yKHJvdWdobmVzc1ZhbCk7XFxuXFx0ZmxvYXQgcjIgPSByMSArIDEuMDtcXG5cXHRmbG9hdCB0ID0gZnJhY3Qocm91Z2huZXNzVmFsKTtcXG5cXHR2ZWMyIG1pcEluZm8gPSBNaXBMZXZlbEluZm8ocmVmbGVjdGVkRGlyZWN0aW9uLCByMSwgcm91Z2huZXNzKTtcXG5cXHRmbG9hdCBzID0gbWlwSW5mby55O1xcblxcdGZsb2F0IGxldmVsMCA9IG1pcEluZm8ueDtcXG5cXHRmbG9hdCBsZXZlbDEgPSBsZXZlbDAgKyAxLjA7XFxuXFx0bGV2ZWwxID0gbGV2ZWwxID4gNS4wID8gNS4wIDogbGV2ZWwxO1xcblxcdGxldmVsMCArPSBtaW4oIGZsb29yKCBzICsgMC41ICksIDUuMCApO1xcblxcdHZlYzIgdXZfMTAgPSBnZXRDdWJlVVYocmVmbGVjdGVkRGlyZWN0aW9uLCByMSwgbGV2ZWwwKTtcXG5cXHR2ZWM0IGNvbG9yMTAgPSBlbnZNYXBUZXhlbFRvTGluZWFyKHRleHR1cmUyRChlbnZNYXAsIHV2XzEwKSk7XFxuXFx0dmVjMiB1dl8yMCA9IGdldEN1YmVVVihyZWZsZWN0ZWREaXJlY3Rpb24sIHIyLCBsZXZlbDApO1xcblxcdHZlYzQgY29sb3IyMCA9IGVudk1hcFRleGVsVG9MaW5lYXIodGV4dHVyZTJEKGVudk1hcCwgdXZfMjApKTtcXG5cXHR2ZWM0IHJlc3VsdCA9IG1peChjb2xvcjEwLCBjb2xvcjIwLCB0KTtcXG5cXHRyZXR1cm4gdmVjNChyZXN1bHQucmdiLCAxLjApO1xcbn1cXG4jZW5kaWZcXG5cIjtcblxudmFyIGRlZmF1bHRub3JtYWxfdmVydGV4ID0gXCJ2ZWMzIHRyYW5zZm9ybWVkTm9ybWFsID0gbm9ybWFsTWF0cml4ICogb2JqZWN0Tm9ybWFsO1xcbiNpZmRlZiBGTElQX1NJREVEXFxuXFx0dHJhbnNmb3JtZWROb3JtYWwgPSAtIHRyYW5zZm9ybWVkTm9ybWFsO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGRpc3BsYWNlbWVudE1hcDtcXG5cXHR1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudFNjYWxlO1xcblxcdHVuaWZvcm0gZmxvYXQgZGlzcGxhY2VtZW50QmlhcztcXG4jZW5kaWZcXG5cIjtcblxudmFyIGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXFxuXFx0dHJhbnNmb3JtZWQgKz0gbm9ybWFsaXplKCBvYmplY3ROb3JtYWwgKSAqICggdGV4dHVyZTJEKCBkaXNwbGFjZW1lbnRNYXAsIHV2ICkueCAqIGRpc3BsYWNlbWVudFNjYWxlICsgZGlzcGxhY2VtZW50QmlhcyApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgZW1pc3NpdmVtYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfRU1JU1NJVkVNQVBcXG5cXHR2ZWM0IGVtaXNzaXZlQ29sb3IgPSB0ZXh0dXJlMkQoIGVtaXNzaXZlTWFwLCB2VXYgKTtcXG5cXHRlbWlzc2l2ZUNvbG9yLnJnYiA9IGVtaXNzaXZlTWFwVGV4ZWxUb0xpbmVhciggZW1pc3NpdmVDb2xvciApLnJnYjtcXG5cXHR0b3RhbEVtaXNzaXZlUmFkaWFuY2UgKj0gZW1pc3NpdmVDb2xvci5yZ2I7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0VNSVNTSVZFTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgZW1pc3NpdmVNYXA7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBlbmNvZGluZ3NfZnJhZ21lbnQgPSBcIiAgZ2xfRnJhZ0NvbG9yID0gbGluZWFyVG9PdXRwdXRUZXhlbCggZ2xfRnJhZ0NvbG9yICk7XFxuXCI7XG5cbnZhciBlbmNvZGluZ3NfcGFyc19mcmFnbWVudCA9IFwiXFxudmVjNCBMaW5lYXJUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRyZXR1cm4gdmFsdWU7XFxufVxcbnZlYzQgR2FtbWFUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgZ2FtbWFGYWN0b3IgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIHBvdyggdmFsdWUueHl6LCB2ZWMzKCBnYW1tYUZhY3RvciApICksIHZhbHVlLncgKTtcXG59XFxudmVjNCBMaW5lYXJUb0dhbW1hKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBnYW1tYUZhY3RvciApIHtcXG5cXHRyZXR1cm4gdmVjNCggcG93KCB2YWx1ZS54eXosIHZlYzMoIDEuMCAvIGdhbW1hRmFjdG9yICkgKSwgdmFsdWUudyApO1xcbn1cXG52ZWM0IHNSR0JUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRyZXR1cm4gdmVjNCggbWl4KCBwb3coIHZhbHVlLnJnYiAqIDAuOTQ3ODY3Mjk4NiArIHZlYzMoIDAuMDUyMTMyNzAxNCApLCB2ZWMzKCAyLjQgKSApLCB2YWx1ZS5yZ2IgKiAwLjA3NzM5OTM4MDgsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMyggMC4wNDA0NSApICkgKSApLCB2YWx1ZS53ICk7XFxufVxcbnZlYzQgTGluZWFyVG9zUkdCKCBpbiB2ZWM0IHZhbHVlICkge1xcblxcdHJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCAwLjQxNjY2ICkgKSAqIDEuMDU1IC0gdmVjMyggMC4wNTUgKSwgdmFsdWUucmdiICogMTIuOTIsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMyggMC4wMDMxMzA4ICkgKSApICksIHZhbHVlLncgKTtcXG59XFxudmVjNCBSR0JFVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqIGV4cDIoIHZhbHVlLmEgKiAyNTUuMCAtIDEyOC4wICksIDEuMCApO1xcbn1cXG52ZWM0IExpbmVhclRvUkdCRSggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRmbG9hdCBtYXhDb21wb25lbnQgPSBtYXgoIG1heCggdmFsdWUuciwgdmFsdWUuZyApLCB2YWx1ZS5iICk7XFxuXFx0ZmxvYXQgZkV4cCA9IGNsYW1wKCBjZWlsKCBsb2cyKCBtYXhDb21wb25lbnQgKSApLCAtMTI4LjAsIDEyNy4wICk7XFxuXFx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAvIGV4cDIoIGZFeHAgKSwgKCBmRXhwICsgMTI4LjAgKSAvIDI1NS4wICk7XFxufVxcbnZlYzQgUkdCTVRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcXG5cXHRyZXR1cm4gdmVjNCggdmFsdWUueHl6ICogdmFsdWUudyAqIG1heFJhbmdlLCAxLjAgKTtcXG59XFxudmVjNCBMaW5lYXJUb1JHQk0oIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xcblxcdGZsb2F0IG1heFJHQiA9IG1heCggdmFsdWUueCwgbWF4KCB2YWx1ZS5nLCB2YWx1ZS5iICkgKTtcXG5cXHRmbG9hdCBNICAgICAgPSBjbGFtcCggbWF4UkdCIC8gbWF4UmFuZ2UsIDAuMCwgMS4wICk7XFxuXFx0TSAgICAgICAgICAgID0gY2VpbCggTSAqIDI1NS4wICkgLyAyNTUuMDtcXG5cXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiIC8gKCBNICogbWF4UmFuZ2UgKSwgTSApO1xcbn1cXG52ZWM0IFJHQkRUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqICggKCBtYXhSYW5nZSAvIDI1NS4wICkgLyB2YWx1ZS5hICksIDEuMCApO1xcbn1cXG52ZWM0IExpbmVhclRvUkdCRCggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XFxuXFx0ZmxvYXQgbWF4UkdCID0gbWF4KCB2YWx1ZS54LCBtYXgoIHZhbHVlLmcsIHZhbHVlLmIgKSApO1xcblxcdGZsb2F0IEQgICAgICA9IG1heCggbWF4UmFuZ2UgLyBtYXhSR0IsIDEuMCApO1xcblxcdEQgICAgICAgICAgICA9IG1pbiggZmxvb3IoIEQgKSAvIDI1NS4wLCAxLjAgKTtcXG5cXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogKCBEICogKCAyNTUuMCAvIG1heFJhbmdlICkgKSwgRCApO1xcbn1cXG5jb25zdCBtYXQzIGNMb2dMdXZNID0gbWF0MyggMC4yMjA5LCAwLjMzOTAsIDAuNDE4NCwgMC4xMTM4LCAwLjY3ODAsIDAuNzMxOSwgMC4wMTAyLCAwLjExMzAsIDAuMjk2OSApO1xcbnZlYzQgTGluZWFyVG9Mb2dMdXYoIGluIHZlYzQgdmFsdWUgKSAge1xcblxcdHZlYzMgWHBfWV9YWVpwID0gdmFsdWUucmdiICogY0xvZ0x1dk07XFxuXFx0WHBfWV9YWVpwID0gbWF4KFhwX1lfWFlacCwgdmVjMygxZS02LCAxZS02LCAxZS02KSk7XFxuXFx0dmVjNCB2UmVzdWx0O1xcblxcdHZSZXN1bHQueHkgPSBYcF9ZX1hZWnAueHkgLyBYcF9ZX1hZWnAuejtcXG5cXHRmbG9hdCBMZSA9IDIuMCAqIGxvZzIoWHBfWV9YWVpwLnkpICsgMTI3LjA7XFxuXFx0dlJlc3VsdC53ID0gZnJhY3QoTGUpO1xcblxcdHZSZXN1bHQueiA9IChMZSAtIChmbG9vcih2UmVzdWx0LncqMjU1LjApKS8yNTUuMCkvMjU1LjA7XFxuXFx0cmV0dXJuIHZSZXN1bHQ7XFxufVxcbmNvbnN0IG1hdDMgY0xvZ0x1dkludmVyc2VNID0gbWF0MyggNi4wMDE0LCAtMi43MDA4LCAtMS43OTk2LCAtMS4zMzIwLCAzLjEwMjksIC01Ljc3MjEsIDAuMzAwOCwgLTEuMDg4MiwgNS42MjY4ICk7XFxudmVjNCBMb2dMdXZUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRmbG9hdCBMZSA9IHZhbHVlLnogKiAyNTUuMCArIHZhbHVlLnc7XFxuXFx0dmVjMyBYcF9ZX1hZWnA7XFxuXFx0WHBfWV9YWVpwLnkgPSBleHAyKChMZSAtIDEyNy4wKSAvIDIuMCk7XFxuXFx0WHBfWV9YWVpwLnogPSBYcF9ZX1hZWnAueSAvIHZhbHVlLnk7XFxuXFx0WHBfWV9YWVpwLnggPSB2YWx1ZS54ICogWHBfWV9YWVpwLno7XFxuXFx0dmVjMyB2UkdCID0gWHBfWV9YWVpwLnJnYiAqIGNMb2dMdXZJbnZlcnNlTTtcXG5cXHRyZXR1cm4gdmVjNCggbWF4KHZSR0IsIDAuMCksIDEuMCApO1xcbn1cXG5cIjtcblxudmFyIGVudm1hcF9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9FTlZNQVBcXG5cXHQjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKVxcblxcdFxcdHZlYzMgY2FtZXJhVG9WZXJ0ZXggPSBub3JtYWxpemUoIHZXb3JsZFBvc2l0aW9uIC0gY2FtZXJhUG9zaXRpb24gKTtcXG5cXHRcXHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7XFxuXFx0XFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cXG5cXHRcXHRcXHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZsZWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwgKTtcXG5cXHRcXHQjZWxzZVxcblxcdFxcdFxcdHZlYzMgcmVmbGVjdFZlYyA9IHJlZnJhY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0I2Vsc2VcXG5cXHRcXHR2ZWMzIHJlZmxlY3RWZWMgPSB2UmVmbGVjdDtcXG5cXHQjZW5kaWZcXG5cXHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxcblxcdFxcdHZlYzQgZW52Q29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCB2ZWMzKCBmbGlwRW52TWFwICogcmVmbGVjdFZlYy54LCByZWZsZWN0VmVjLnl6ICkgKTtcXG5cXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9FUVVJUkVDIClcXG5cXHRcXHR2ZWMyIHNhbXBsZVVWO1xcblxcdFxcdHJlZmxlY3RWZWMgPSBub3JtYWxpemUoIHJlZmxlY3RWZWMgKTtcXG5cXHRcXHRzYW1wbGVVVi55ID0gYXNpbiggY2xhbXAoIHJlZmxlY3RWZWMueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xcblxcdFxcdHNhbXBsZVVWLnggPSBhdGFuKCByZWZsZWN0VmVjLnosIHJlZmxlY3RWZWMueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XFxuXFx0XFx0dmVjNCBlbnZDb2xvciA9IHRleHR1cmUyRCggZW52TWFwLCBzYW1wbGVVViApO1xcblxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX1NQSEVSRSApXFxuXFx0XFx0cmVmbGVjdFZlYyA9IG5vcm1hbGl6ZSggcmVmbGVjdFZlYyApO1xcblxcdFxcdHZlYzMgcmVmbGVjdFZpZXcgPSBub3JtYWxpemUoICggdmlld01hdHJpeCAqIHZlYzQoIHJlZmxlY3RWZWMsIDAuMCApICkueHl6ICsgdmVjMyggMC4wLCAwLjAsIDEuMCApICk7XFxuXFx0XFx0dmVjNCBlbnZDb2xvciA9IHRleHR1cmUyRCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSApO1xcblxcdCNlbHNlXFxuXFx0XFx0dmVjNCBlbnZDb2xvciA9IHZlYzQoIDAuMCApO1xcblxcdCNlbmRpZlxcblxcdGVudkNvbG9yID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52Q29sb3IgKTtcXG5cXHQjaWZkZWYgRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZXFxuXFx0XFx0b3V0Z29pbmdMaWdodCA9IG1peCggb3V0Z29pbmdMaWdodCwgb3V0Z29pbmdMaWdodCAqIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApO1xcblxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19NSVggKVxcblxcdFxcdG91dGdvaW5nTGlnaHQgPSBtaXgoIG91dGdvaW5nTGlnaHQsIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApO1xcblxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19BREQgKVxcblxcdFxcdG91dGdvaW5nTGlnaHQgKz0gZW52Q29sb3IueHl6ICogc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIGVudm1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIHx8IGRlZmluZWQoIFBIWVNJQ0FMIClcXG5cXHR1bmlmb3JtIGZsb2F0IHJlZmxlY3Rpdml0eTtcXG5cXHR1bmlmb3JtIGZsb2F0IGVudk1hcEludGVuc2l0eTtcXG4jZW5kaWZcXG4jaWZkZWYgVVNFX0VOVk1BUFxcblxcdCNpZiAhIGRlZmluZWQoIFBIWVNJQ0FMICkgJiYgKCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApIClcXG5cXHRcXHR2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XFxuXFx0I2VuZGlmXFxuXFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcXG5cXHRcXHR1bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDtcXG5cXHQjZWxzZVxcblxcdFxcdHVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDtcXG5cXHQjZW5kaWZcXG5cXHR1bmlmb3JtIGZsb2F0IGZsaXBFbnZNYXA7XFxuXFx0dW5pZm9ybSBpbnQgbWF4TWlwTGV2ZWw7XFxuXFx0I2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFBIT05HICkgfHwgZGVmaW5lZCggUEhZU0lDQUwgKVxcblxcdFxcdHVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvO1xcblxcdCNlbHNlXFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZSZWZsZWN0O1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgZW52bWFwX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0VOVk1BUFxcblxcdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApXFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcblxcdCNlbHNlXFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZSZWZsZWN0O1xcblxcdFxcdHVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvO1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgZW52bWFwX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9FTlZNQVBcXG5cXHQjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKVxcblxcdFxcdHZXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbi54eXo7XFxuXFx0I2Vsc2VcXG5cXHRcXHR2ZWMzIGNhbWVyYVRvVmVydGV4ID0gbm9ybWFsaXplKCB3b3JsZFBvc2l0aW9uLnh5eiAtIGNhbWVyYVBvc2l0aW9uICk7XFxuXFx0XFx0dmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHRyYW5zZm9ybWVkTm9ybWFsLCB2aWV3TWF0cml4ICk7XFxuXFx0XFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cXG5cXHRcXHRcXHR2UmVmbGVjdCA9IHJlZmxlY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCApO1xcblxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0dlJlZmxlY3QgPSByZWZyYWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwsIHJlZnJhY3Rpb25SYXRpbyApO1xcblxcdFxcdCNlbmRpZlxcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgZm9nX3ZlcnRleCA9IFwiXFxuI2lmZGVmIFVTRV9GT0dcXG5mb2dEZXB0aCA9IC1tdlBvc2l0aW9uLno7XFxuI2VuZGlmXCI7XG5cbnZhciBmb2dfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfRk9HXFxuICB2YXJ5aW5nIGZsb2F0IGZvZ0RlcHRoO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgZm9nX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0ZPR1xcblxcdCNpZmRlZiBGT0dfRVhQMlxcblxcdFxcdGZsb2F0IGZvZ0ZhY3RvciA9IHdoaXRlQ29tcGxpbWVudCggZXhwMiggLSBmb2dEZW5zaXR5ICogZm9nRGVuc2l0eSAqIGZvZ0RlcHRoICogZm9nRGVwdGggKiBMT0cyICkgKTtcXG5cXHQjZWxzZVxcblxcdFxcdGZsb2F0IGZvZ0ZhY3RvciA9IHNtb290aHN0ZXAoIGZvZ05lYXIsIGZvZ0ZhciwgZm9nRGVwdGggKTtcXG5cXHQjZW5kaWZcXG5cXHRnbF9GcmFnQ29sb3IucmdiID0gbWl4KCBnbF9GcmFnQ29sb3IucmdiLCBmb2dDb2xvciwgZm9nRmFjdG9yICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBmb2dfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9GT0dcXG5cXHR1bmlmb3JtIHZlYzMgZm9nQ29sb3I7XFxuXFx0dmFyeWluZyBmbG9hdCBmb2dEZXB0aDtcXG5cXHQjaWZkZWYgRk9HX0VYUDJcXG5cXHRcXHR1bmlmb3JtIGZsb2F0IGZvZ0RlbnNpdHk7XFxuXFx0I2Vsc2VcXG5cXHRcXHR1bmlmb3JtIGZsb2F0IGZvZ05lYXI7XFxuXFx0XFx0dW5pZm9ybSBmbG9hdCBmb2dGYXI7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVE9PTlxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGdyYWRpZW50TWFwO1xcblxcdHZlYzMgZ2V0R3JhZGllbnRJcnJhZGlhbmNlKCB2ZWMzIG5vcm1hbCwgdmVjMyBsaWdodERpcmVjdGlvbiApIHtcXG5cXHRcXHRmbG9hdCBkb3ROTCA9IGRvdCggbm9ybWFsLCBsaWdodERpcmVjdGlvbiApO1xcblxcdFxcdHZlYzIgY29vcmQgPSB2ZWMyKCBkb3ROTCAqIDAuNSArIDAuNSwgMC4wICk7XFxuXFx0XFx0I2lmZGVmIFVTRV9HUkFESUVOVE1BUFxcblxcdFxcdFxcdHJldHVybiB0ZXh0dXJlMkQoIGdyYWRpZW50TWFwLCBjb29yZCApLnJnYjtcXG5cXHRcXHQjZWxzZVxcblxcdFxcdFxcdHJldHVybiAoIGNvb3JkLnggPCAwLjcgKSA/IHZlYzMoIDAuNyApIDogdmVjMyggMS4wICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcbiNlbmRpZlxcblwiO1xuXG52YXIgbGlnaHRtYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTElHSFRNQVBcXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gUEkgKiB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICkueHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsaWdodG1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0xJR0hUTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbGlnaHRNYXA7XFxuXFx0dW5pZm9ybSBmbG9hdCBsaWdodE1hcEludGVuc2l0eTtcXG4jZW5kaWZcIjtcblxudmFyIGxpZ2h0c19sYW1iZXJ0X3ZlcnRleCA9IFwidmVjMyBkaWZmdXNlID0gdmVjMyggMS4wICk7XFxuR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeTtcXG5nZW9tZXRyeS5wb3NpdGlvbiA9IG12UG9zaXRpb24ueHl6O1xcbmdlb21ldHJ5Lm5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcXG5nZW9tZXRyeS52aWV3RGlyID0gbm9ybWFsaXplKCAtbXZQb3NpdGlvbi54eXogKTtcXG5HZW9tZXRyaWNDb250ZXh0IGJhY2tHZW9tZXRyeTtcXG5iYWNrR2VvbWV0cnkucG9zaXRpb24gPSBnZW9tZXRyeS5wb3NpdGlvbjtcXG5iYWNrR2VvbWV0cnkubm9ybWFsID0gLWdlb21ldHJ5Lm5vcm1hbDtcXG5iYWNrR2VvbWV0cnkudmlld0RpciA9IGdlb21ldHJ5LnZpZXdEaXI7XFxudkxpZ2h0RnJvbnQgPSB2ZWMzKCAwLjAgKTtcXG4jaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0dkxpZ2h0QmFjayA9IHZlYzMoIDAuMCApO1xcbiNlbmRpZlxcbkluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQ7XFxuZmxvYXQgZG90Tkw7XFxudmVjMyBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuI2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0Z2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIHBvaW50TGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xcblxcdFxcdGRvdE5MID0gZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xcblxcdFxcdGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSA9IFBJICogZGlyZWN0TGlnaHQuY29sb3I7XFxuXFx0XFx0dkxpZ2h0RnJvbnQgKz0gc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuXFx0XFx0I2lmZGVmIERPVUJMRV9TSURFRFxcblxcdFxcdFxcdHZMaWdodEJhY2sgKz0gc2F0dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xcblxcdFxcdCNlbmRpZlxcblxcdH1cXG4jZW5kaWZcXG4jaWYgTlVNX1NQT1RfTElHSFRTID4gMFxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0Z2V0U3BvdERpcmVjdExpZ2h0SXJyYWRpYW5jZSggc3BvdExpZ2h0c1sgaSBdLCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcXG5cXHRcXHRkb3ROTCA9IGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKTtcXG5cXHRcXHRkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2UgPSBQSSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xcblxcdFxcdHZMaWdodEZyb250ICs9IHNhdHVyYXRlKCBkb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xcblxcdFxcdCNpZmRlZiBET1VCTEVfU0lERURcXG5cXHRcXHRcXHR2TGlnaHRCYWNrICs9IHNhdHVyYXRlKCAtZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcXG5cXHRcXHQjZW5kaWZcXG5cXHR9XFxuI2VuZGlmXFxuI2lmIE5VTV9ESVJfTElHSFRTID4gMFxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggZGlyZWN0aW9uYWxMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0ZG90TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XFxuXFx0XFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlID0gUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcXG5cXHRcXHR2TGlnaHRGcm9udCArPSBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcXG5cXHRcXHQjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0XFx0XFx0dkxpZ2h0QmFjayArPSBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcbiNlbmRpZlxcbiNpZiBOVU1fSEVNSV9MSUdIVFMgPiAwXFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9IRU1JX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHR2TGlnaHRGcm9udCArPSBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGdlb21ldHJ5ICk7XFxuXFx0XFx0I2lmZGVmIERPVUJMRV9TSURFRFxcblxcdFxcdFxcdHZMaWdodEJhY2sgKz0gZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBiYWNrR2VvbWV0cnkgKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHR9XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsaWdodHNfcGFyc19iZWdpbiA9IFwidW5pZm9ybSB2ZWMzIGFtYmllbnRMaWdodENvbG9yO1xcbnZlYzMgZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gdmVjMyBhbWJpZW50TGlnaHRDb2xvciApIHtcXG5cXHR2ZWMzIGlycmFkaWFuY2UgPSBhbWJpZW50TGlnaHRDb2xvcjtcXG5cXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcXG5cXHRcXHRpcnJhZGlhbmNlICo9IFBJO1xcblxcdCNlbmRpZlxcblxcdHJldHVybiBpcnJhZGlhbmNlO1xcbn1cXG4jaWYgTlVNX0RJUl9MSUdIVFMgPiAwXFxuXFx0c3RydWN0IERpcmVjdGlvbmFsTGlnaHQge1xcblxcdFxcdHZlYzMgZGlyZWN0aW9uO1xcblxcdFxcdHZlYzMgY29sb3I7XFxuXFx0XFx0aW50IHNoYWRvdztcXG5cXHRcXHRmbG9hdCBzaGFkb3dCaWFzO1xcblxcdFxcdGZsb2F0IHNoYWRvd1JhZGl1cztcXG5cXHRcXHR2ZWMyIHNoYWRvd01hcFNpemU7XFxuXFx0fTtcXG5cXHR1bmlmb3JtIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodHNbIE5VTV9ESVJfTElHSFRTIF07XFxuXFx0dm9pZCBnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gRGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCApIHtcXG5cXHRcXHRkaXJlY3RMaWdodC5jb2xvciA9IGRpcmVjdGlvbmFsTGlnaHQuY29sb3I7XFxuXFx0XFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uID0gZGlyZWN0aW9uYWxMaWdodC5kaXJlY3Rpb247XFxuXFx0XFx0ZGlyZWN0TGlnaHQudmlzaWJsZSA9IHRydWU7XFxuXFx0fVxcbiNlbmRpZlxcbiNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxcblxcdHN0cnVjdCBQb2ludExpZ2h0IHtcXG5cXHRcXHR2ZWMzIHBvc2l0aW9uO1xcblxcdFxcdHZlYzMgY29sb3I7XFxuXFx0XFx0ZmxvYXQgZGlzdGFuY2U7XFxuXFx0XFx0ZmxvYXQgZGVjYXk7XFxuXFx0XFx0aW50IHNoYWRvdztcXG5cXHRcXHRmbG9hdCBzaGFkb3dCaWFzO1xcblxcdFxcdGZsb2F0IHNoYWRvd1JhZGl1cztcXG5cXHRcXHR2ZWMyIHNoYWRvd01hcFNpemU7XFxuXFx0XFx0ZmxvYXQgc2hhZG93Q2FtZXJhTmVhcjtcXG5cXHRcXHRmbG9hdCBzaGFkb3dDYW1lcmFGYXI7XFxuXFx0fTtcXG5cXHR1bmlmb3JtIFBvaW50TGlnaHQgcG9pbnRMaWdodHNbIE5VTV9QT0lOVF9MSUdIVFMgXTtcXG5cXHR2b2lkIGdldFBvaW50RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBQb2ludExpZ2h0IHBvaW50TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIG91dCBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0ICkge1xcblxcdFxcdHZlYzMgbFZlY3RvciA9IHBvaW50TGlnaHQucG9zaXRpb24gLSBnZW9tZXRyeS5wb3NpdGlvbjtcXG5cXHRcXHRkaXJlY3RMaWdodC5kaXJlY3Rpb24gPSBub3JtYWxpemUoIGxWZWN0b3IgKTtcXG5cXHRcXHRmbG9hdCBsaWdodERpc3RhbmNlID0gbGVuZ3RoKCBsVmVjdG9yICk7XFxuXFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgPSBwb2ludExpZ2h0LmNvbG9yO1xcblxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yICo9IHB1bmN0dWFsTGlnaHRJbnRlbnNpdHlUb0lycmFkaWFuY2VGYWN0b3IoIGxpZ2h0RGlzdGFuY2UsIHBvaW50TGlnaHQuZGlzdGFuY2UsIHBvaW50TGlnaHQuZGVjYXkgKTtcXG5cXHRcXHRkaXJlY3RMaWdodC52aXNpYmxlID0gKCBkaXJlY3RMaWdodC5jb2xvciAhPSB2ZWMzKCAwLjAgKSApO1xcblxcdH1cXG4jZW5kaWZcXG4jaWYgTlVNX1NQT1RfTElHSFRTID4gMFxcblxcdHN0cnVjdCBTcG90TGlnaHQge1xcblxcdFxcdHZlYzMgcG9zaXRpb247XFxuXFx0XFx0dmVjMyBkaXJlY3Rpb247XFxuXFx0XFx0dmVjMyBjb2xvcjtcXG5cXHRcXHRmbG9hdCBkaXN0YW5jZTtcXG5cXHRcXHRmbG9hdCBkZWNheTtcXG5cXHRcXHRmbG9hdCBjb25lQ29zO1xcblxcdFxcdGZsb2F0IHBlbnVtYnJhQ29zO1xcblxcdFxcdGludCBzaGFkb3c7XFxuXFx0XFx0ZmxvYXQgc2hhZG93QmlhcztcXG5cXHRcXHRmbG9hdCBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0dmVjMiBzaGFkb3dNYXBTaXplO1xcblxcdH07XFxuXFx0dW5pZm9ybSBTcG90TGlnaHQgc3BvdExpZ2h0c1sgTlVNX1NQT1RfTElHSFRTIF07XFxuXFx0dm9pZCBnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBTcG90TGlnaHQgc3BvdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCAgKSB7XFxuXFx0XFx0dmVjMyBsVmVjdG9yID0gc3BvdExpZ2h0LnBvc2l0aW9uIC0gZ2VvbWV0cnkucG9zaXRpb247XFxuXFx0XFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uID0gbm9ybWFsaXplKCBsVmVjdG9yICk7XFxuXFx0XFx0ZmxvYXQgbGlnaHREaXN0YW5jZSA9IGxlbmd0aCggbFZlY3RvciApO1xcblxcdFxcdGZsb2F0IGFuZ2xlQ29zID0gZG90KCBkaXJlY3RMaWdodC5kaXJlY3Rpb24sIHNwb3RMaWdodC5kaXJlY3Rpb24gKTtcXG5cXHRcXHRpZiAoIGFuZ2xlQ29zID4gc3BvdExpZ2h0LmNvbmVDb3MgKSB7XFxuXFx0XFx0XFx0ZmxvYXQgc3BvdEVmZmVjdCA9IHNtb290aHN0ZXAoIHNwb3RMaWdodC5jb25lQ29zLCBzcG90TGlnaHQucGVudW1icmFDb3MsIGFuZ2xlQ29zICk7XFxuXFx0XFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgPSBzcG90TGlnaHQuY29sb3I7XFxuXFx0XFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gc3BvdEVmZmVjdCAqIHB1bmN0dWFsTGlnaHRJbnRlbnNpdHlUb0lycmFkaWFuY2VGYWN0b3IoIGxpZ2h0RGlzdGFuY2UsIHNwb3RMaWdodC5kaXN0YW5jZSwgc3BvdExpZ2h0LmRlY2F5ICk7XFxuXFx0XFx0XFx0ZGlyZWN0TGlnaHQudmlzaWJsZSA9IHRydWU7XFxuXFx0XFx0fSBlbHNlIHtcXG5cXHRcXHRcXHRkaXJlY3RMaWdodC5jb2xvciA9IHZlYzMoIDAuMCApO1xcblxcdFxcdFxcdGRpcmVjdExpZ2h0LnZpc2libGUgPSBmYWxzZTtcXG5cXHRcXHR9XFxuXFx0fVxcbiNlbmRpZlxcbiNpZiBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDBcXG5cXHRzdHJ1Y3QgUmVjdEFyZWFMaWdodCB7XFxuXFx0XFx0dmVjMyBjb2xvcjtcXG5cXHRcXHR2ZWMzIHBvc2l0aW9uO1xcblxcdFxcdHZlYzMgaGFsZldpZHRoO1xcblxcdFxcdHZlYzMgaGFsZkhlaWdodDtcXG5cXHR9O1xcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y18xO1xcdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y18yO1xcblxcdHVuaWZvcm0gUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0c1sgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXTtcXG4jZW5kaWZcXG4jaWYgTlVNX0hFTUlfTElHSFRTID4gMFxcblxcdHN0cnVjdCBIZW1pc3BoZXJlTGlnaHQge1xcblxcdFxcdHZlYzMgZGlyZWN0aW9uO1xcblxcdFxcdHZlYzMgc2t5Q29sb3I7XFxuXFx0XFx0dmVjMyBncm91bmRDb2xvcjtcXG5cXHR9O1xcblxcdHVuaWZvcm0gSGVtaXNwaGVyZUxpZ2h0IGhlbWlzcGhlcmVMaWdodHNbIE5VTV9IRU1JX0xJR0hUUyBdO1xcblxcdHZlYzMgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gSGVtaXNwaGVyZUxpZ2h0IGhlbWlMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSApIHtcXG5cXHRcXHRmbG9hdCBkb3ROTCA9IGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoZW1pTGlnaHQuZGlyZWN0aW9uICk7XFxuXFx0XFx0ZmxvYXQgaGVtaURpZmZ1c2VXZWlnaHQgPSAwLjUgKiBkb3ROTCArIDAuNTtcXG5cXHRcXHR2ZWMzIGlycmFkaWFuY2UgPSBtaXgoIGhlbWlMaWdodC5ncm91bmRDb2xvciwgaGVtaUxpZ2h0LnNreUNvbG9yLCBoZW1pRGlmZnVzZVdlaWdodCApO1xcblxcdFxcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xcblxcdFxcdFxcdGlycmFkaWFuY2UgKj0gUEk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0cmV0dXJuIGlycmFkaWFuY2U7XFxuXFx0fVxcbiNlbmRpZlxcblwiO1xuXG52YXIgbGlnaHRzX3BhcnNfbWFwcyA9IFwiI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBQSFlTSUNBTCApXFxuXFx0dmVjMyBnZXRMaWdodFByb2JlSW5kaXJlY3RJcnJhZGlhbmNlKCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XFxuXFx0XFx0dmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGdlb21ldHJ5Lm5vcm1hbCwgdmlld01hdHJpeCApO1xcblxcdFxcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXFxuXFx0XFx0XFx0dmVjMyBxdWVyeVZlYyA9IHZlYzMoIGZsaXBFbnZNYXAgKiB3b3JsZE5vcm1hbC54LCB3b3JsZE5vcm1hbC55eiApO1xcblxcdFxcdFxcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVMb2RFWFQoIGVudk1hcCwgcXVlcnlWZWMsIGZsb2F0KCBtYXhNSVBMZXZlbCApICk7XFxuXFx0XFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmUoIGVudk1hcCwgcXVlcnlWZWMsIGZsb2F0KCBtYXhNSVBMZXZlbCApICk7XFxuXFx0XFx0XFx0I2VuZGlmXFxuXFx0XFx0XFx0ZW52TWFwQ29sb3IucmdiID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XFxuXFx0XFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXFxuXFx0XFx0XFx0dmVjMyBxdWVyeVZlYyA9IHZlYzMoIGZsaXBFbnZNYXAgKiB3b3JsZE5vcm1hbC54LCB3b3JsZE5vcm1hbC55eiApO1xcblxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZVVWKCBxdWVyeVZlYywgMS4wICk7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdmVjNCggMC4wICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0cmV0dXJuIFBJICogZW52TWFwQ29sb3IucmdiICogZW52TWFwSW50ZW5zaXR5O1xcblxcdH1cXG5cXHRmbG9hdCBnZXRTcGVjdWxhck1JUExldmVsKCBjb25zdCBpbiBmbG9hdCBibGlublNoaW5pbmVzc0V4cG9uZW50LCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XFxuXFx0XFx0ZmxvYXQgbWF4TUlQTGV2ZWxTY2FsYXIgPSBmbG9hdCggbWF4TUlQTGV2ZWwgKTtcXG5cXHRcXHRmbG9hdCBkZXNpcmVkTUlQTGV2ZWwgPSBtYXhNSVBMZXZlbFNjYWxhciArIDAuNzkyNDggLSAwLjUgKiBsb2cyKCBwb3cyKCBibGlublNoaW5pbmVzc0V4cG9uZW50ICkgKyAxLjAgKTtcXG5cXHRcXHRyZXR1cm4gY2xhbXAoIGRlc2lyZWRNSVBMZXZlbCwgMC4wLCBtYXhNSVBMZXZlbFNjYWxhciApO1xcblxcdH1cXG5cXHR2ZWMzIGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBmbG9hdCBibGlublNoaW5pbmVzc0V4cG9uZW50LCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XFxuXFx0XFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cXG5cXHRcXHRcXHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZsZWN0KCAtZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkubm9ybWFsICk7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZyYWN0KCAtZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkubm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRyZWZsZWN0VmVjID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggcmVmbGVjdFZlYywgdmlld01hdHJpeCApO1xcblxcdFxcdGZsb2F0IHNwZWN1bGFyTUlQTGV2ZWwgPSBnZXRTcGVjdWxhck1JUExldmVsKCBibGlublNoaW5pbmVzc0V4cG9uZW50LCBtYXhNSVBMZXZlbCApO1xcblxcdFxcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXFxuXFx0XFx0XFx0dmVjMyBxdWVyeVJlZmxlY3RWZWMgPSB2ZWMzKCBmbGlwRW52TWFwICogcmVmbGVjdFZlYy54LCByZWZsZWN0VmVjLnl6ICk7XFxuXFx0XFx0XFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZUxvZEVYVCggZW52TWFwLCBxdWVyeVJlZmxlY3RWZWMsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcXG5cXHRcXHRcXHQjZWxzZVxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCBxdWVyeVJlZmxlY3RWZWMsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcXG5cXHRcXHRcXHQjZW5kaWZcXG5cXHRcXHRcXHRlbnZNYXBDb2xvci5yZ2IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcXG5cXHRcXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcXG5cXHRcXHRcXHR2ZWMzIHF1ZXJ5UmVmbGVjdFZlYyA9IHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKTtcXG5cXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVVVihxdWVyeVJlZmxlY3RWZWMsIEJsaW5uRXhwb25lbnRUb0dHWFJvdWdobmVzcyhibGlublNoaW5pbmVzc0V4cG9uZW50KSk7XFxuXFx0XFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfRVFVSVJFQyApXFxuXFx0XFx0XFx0dmVjMiBzYW1wbGVVVjtcXG5cXHRcXHRcXHRzYW1wbGVVVi55ID0gYXNpbiggY2xhbXAoIHJlZmxlY3RWZWMueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xcblxcdFxcdFxcdHNhbXBsZVVWLnggPSBhdGFuKCByZWZsZWN0VmVjLnosIHJlZmxlY3RWZWMueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XFxuXFx0XFx0XFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlMkRMb2RFWFQoIGVudk1hcCwgc2FtcGxlVVYsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcXG5cXHRcXHRcXHQjZWxzZVxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlMkQoIGVudk1hcCwgc2FtcGxlVVYsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcXG5cXHRcXHRcXHQjZW5kaWZcXG5cXHRcXHRcXHRlbnZNYXBDb2xvci5yZ2IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcXG5cXHRcXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9TUEhFUkUgKVxcblxcdFxcdFxcdHZlYzMgcmVmbGVjdFZpZXcgPSBub3JtYWxpemUoICggdmlld01hdHJpeCAqIHZlYzQoIHJlZmxlY3RWZWMsIDAuMCApICkueHl6ICsgdmVjMyggMC4wLDAuMCwxLjAgKSApO1xcblxcdFxcdFxcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZTJETG9kRVhUKCBlbnZNYXAsIHJlZmxlY3RWaWV3Lnh5ICogMC41ICsgMC41LCBzcGVjdWxhck1JUExldmVsICk7XFxuXFx0XFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZTJEKCBlbnZNYXAsIHJlZmxlY3RWaWV3Lnh5ICogMC41ICsgMC41LCBzcGVjdWxhck1JUExldmVsICk7XFxuXFx0XFx0XFx0I2VuZGlmXFxuXFx0XFx0XFx0ZW52TWFwQ29sb3IucmdiID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0cmV0dXJuIGVudk1hcENvbG9yLnJnYiAqIGVudk1hcEludGVuc2l0eTtcXG5cXHR9XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsaWdodHNfcGhvbmdfZnJhZ21lbnQgPSBcIkJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbDtcXG5tYXRlcmlhbC5kaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3IucmdiO1xcbm1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBzcGVjdWxhcjtcXG5tYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyA9IHNoaW5pbmVzcztcXG5tYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoID0gc3BlY3VsYXJTdHJlbmd0aDtcXG5cIjtcblxudmFyIGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50ID0gXCJ2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuI2VuZGlmXFxuc3RydWN0IEJsaW5uUGhvbmdNYXRlcmlhbCB7XFxuXFx0dmVjM1xcdGRpZmZ1c2VDb2xvcjtcXG5cXHR2ZWMzXFx0c3BlY3VsYXJDb2xvcjtcXG5cXHRmbG9hdFxcdHNwZWN1bGFyU2hpbmluZXNzO1xcblxcdGZsb2F0XFx0c3BlY3VsYXJTdHJlbmd0aDtcXG59O1xcbnZvaWQgUkVfRGlyZWN0X0JsaW5uUGhvbmcoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0I2lmZGVmIFRPT05cXG5cXHRcXHR2ZWMzIGlycmFkaWFuY2UgPSBnZXRHcmFkaWVudElycmFkaWFuY2UoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKiBkaXJlY3RMaWdodC5jb2xvcjtcXG5cXHQjZWxzZVxcblxcdFxcdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApO1xcblxcdFxcdHZlYzMgaXJyYWRpYW5jZSA9IGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XFxuXFx0I2VuZGlmXFxuXFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXFxuXFx0XFx0aXJyYWRpYW5jZSAqPSBQSTtcXG5cXHQjZW5kaWZcXG5cXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XFxuXFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfQmxpbm5QaG9uZyggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyApICogbWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aDtcXG59XFxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfQmxpbm5QaG9uZyggY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xcbn1cXG4jZGVmaW5lIFJFX0RpcmVjdFxcdFxcdFxcdFxcdFJFX0RpcmVjdF9CbGlublBob25nXFxuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcXHRcXHRSRV9JbmRpcmVjdERpZmZ1c2VfQmxpbm5QaG9uZ1xcbiNkZWZpbmUgTWF0ZXJpYWxfTGlnaHRQcm9iZUxPRCggbWF0ZXJpYWwgKVxcdCgwKVxcblwiO1xuXG52YXIgbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50ID0gXCJQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsO1xcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciA9IGRpZmZ1c2VDb2xvci5yZ2IgKiAoIDEuMCAtIG1ldGFsbmVzc0ZhY3RvciApO1xcbm1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzID0gY2xhbXAoIHJvdWdobmVzc0ZhY3RvciwgMC4wNCwgMS4wICk7XFxuI2lmZGVmIFNUQU5EQVJEXFxuXFx0bWF0ZXJpYWwuc3BlY3VsYXJDb2xvciA9IG1peCggdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBkaWZmdXNlQ29sb3IucmdiLCBtZXRhbG5lc3NGYWN0b3IgKTtcXG4jZWxzZVxcblxcdG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBtaXgoIHZlYzMoIE1BWElNVU1fU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKiBwb3cyKCByZWZsZWN0aXZpdHkgKSApLCBkaWZmdXNlQ29sb3IucmdiLCBtZXRhbG5lc3NGYWN0b3IgKTtcXG5cXHRtYXRlcmlhbC5jbGVhckNvYXQgPSBzYXR1cmF0ZSggY2xlYXJDb2F0ICk7XFx0bWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzID0gY2xhbXAoIGNsZWFyQ29hdFJvdWdobmVzcywgMC4wNCwgMS4wICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudCA9IFwic3RydWN0IFBoeXNpY2FsTWF0ZXJpYWwge1xcblxcdHZlYzNcXHRkaWZmdXNlQ29sb3I7XFxuXFx0ZmxvYXRcXHRzcGVjdWxhclJvdWdobmVzcztcXG5cXHR2ZWMzXFx0c3BlY3VsYXJDb2xvcjtcXG5cXHQjaWZuZGVmIFNUQU5EQVJEXFxuXFx0XFx0ZmxvYXQgY2xlYXJDb2F0O1xcblxcdFxcdGZsb2F0IGNsZWFyQ29hdFJvdWdobmVzcztcXG5cXHQjZW5kaWZcXG59O1xcbiNkZWZpbmUgTUFYSU1VTV9TUEVDVUxBUl9DT0VGRklDSUVOVCAwLjE2XFxuI2RlZmluZSBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UIDAuMDRcXG5mbG9hdCBjbGVhckNvYXRESFJBcHByb3goIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkwgKSB7XFxuXFx0cmV0dXJuIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKyAoIDEuMCAtIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSAqICggcG93KCAxLjAgLSBkb3ROTCwgNS4wICkgKiBwb3coIDEuMCAtIHJvdWdobmVzcywgMi4wICkgKTtcXG59XFxuI2lmIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMFxcblxcdHZvaWQgUkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsKCBjb25zdCBpbiBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xcblxcdFxcdHZlYzMgbm9ybWFsID0gZ2VvbWV0cnkubm9ybWFsO1xcblxcdFxcdHZlYzMgdmlld0RpciA9IGdlb21ldHJ5LnZpZXdEaXI7XFxuXFx0XFx0dmVjMyBwb3NpdGlvbiA9IGdlb21ldHJ5LnBvc2l0aW9uO1xcblxcdFxcdHZlYzMgbGlnaHRQb3MgPSByZWN0QXJlYUxpZ2h0LnBvc2l0aW9uO1xcblxcdFxcdHZlYzMgaGFsZldpZHRoID0gcmVjdEFyZWFMaWdodC5oYWxmV2lkdGg7XFxuXFx0XFx0dmVjMyBoYWxmSGVpZ2h0ID0gcmVjdEFyZWFMaWdodC5oYWxmSGVpZ2h0O1xcblxcdFxcdHZlYzMgbGlnaHRDb2xvciA9IHJlY3RBcmVhTGlnaHQuY29sb3I7XFxuXFx0XFx0ZmxvYXQgcm91Z2huZXNzID0gbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3M7XFxuXFx0XFx0dmVjMyByZWN0Q29vcmRzWyA0IF07XFxuXFx0XFx0cmVjdENvb3Jkc1sgMCBdID0gbGlnaHRQb3MgLSBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0O1xcdFxcdHJlY3RDb29yZHNbIDEgXSA9IGxpZ2h0UG9zICsgaGFsZldpZHRoIC0gaGFsZkhlaWdodDtcXG5cXHRcXHRyZWN0Q29vcmRzWyAyIF0gPSBsaWdodFBvcyArIGhhbGZXaWR0aCArIGhhbGZIZWlnaHQ7XFxuXFx0XFx0cmVjdENvb3Jkc1sgMyBdID0gbGlnaHRQb3MgLSBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0O1xcblxcdFxcdHZlYzIgdXYgPSBMVENfVXYoIG5vcm1hbCwgdmlld0Rpciwgcm91Z2huZXNzICk7XFxuXFx0XFx0dmVjNCB0MSA9IHRleHR1cmUyRCggbHRjXzEsIHV2ICk7XFxuXFx0XFx0dmVjNCB0MiA9IHRleHR1cmUyRCggbHRjXzIsIHV2ICk7XFxuXFx0XFx0bWF0MyBtSW52ID0gbWF0MyhcXG5cXHRcXHRcXHR2ZWMzKCB0MS54LCAwLCB0MS55ICksXFxuXFx0XFx0XFx0dmVjMyggICAgMCwgMSwgICAgMCApLFxcblxcdFxcdFxcdHZlYzMoIHQxLnosIDAsIHQxLncgKVxcblxcdFxcdCk7XFxuXFx0XFx0dmVjMyBmcmVzbmVsID0gKCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICogdDIueCArICggdmVjMyggMS4wICkgLSBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICkgKiB0Mi55ICk7XFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gbGlnaHRDb2xvciAqIGZyZXNuZWwgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1JbnYsIHJlY3RDb29yZHMgKTtcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGxpZ2h0Q29sb3IgKiBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1hdDMoIDEuMCApLCByZWN0Q29vcmRzICk7XFxuXFx0fVxcbiNlbmRpZlxcbnZvaWQgUkVfRGlyZWN0X1BoeXNpY2FsKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcXG5cXHRmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcXG5cXHR2ZWMzIGlycmFkaWFuY2UgPSBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yO1xcblxcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xcblxcdFxcdGlycmFkaWFuY2UgKj0gUEk7XFxuXFx0I2VuZGlmXFxuXFx0I2lmbmRlZiBTVEFOREFSRFxcblxcdFxcdGZsb2F0IGNsZWFyQ29hdERIUiA9IG1hdGVyaWFsLmNsZWFyQ29hdCAqIGNsZWFyQ29hdERIUkFwcHJveCggbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzLCBkb3ROTCApO1xcblxcdCNlbHNlXFxuXFx0XFx0ZmxvYXQgY2xlYXJDb2F0REhSID0gMC4wO1xcblxcdCNlbmRpZlxcblxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9ICggMS4wIC0gY2xlYXJDb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9HR1goIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgKTtcXG5cXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9ICggMS4wIC0gY2xlYXJDb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xcblxcdCNpZm5kZWYgU1RBTkRBUkRcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBpcnJhZGlhbmNlICogbWF0ZXJpYWwuY2xlYXJDb2F0ICogQlJERl9TcGVjdWxhcl9HR1goIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MgKTtcXG5cXHQjZW5kaWZcXG59XFxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XFxufVxcbnZvaWQgUkVfSW5kaXJlY3RTcGVjdWxhcl9QaHlzaWNhbCggY29uc3QgaW4gdmVjMyByYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBjbGVhckNvYXRSYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0I2lmbmRlZiBTVEFOREFSRFxcblxcdFxcdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcXG5cXHRcXHRmbG9hdCBkb3ROTCA9IGRvdE5WO1xcblxcdFxcdGZsb2F0IGNsZWFyQ29hdERIUiA9IG1hdGVyaWFsLmNsZWFyQ29hdCAqIGNsZWFyQ29hdERIUkFwcHJveCggbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzLCBkb3ROTCApO1xcblxcdCNlbHNlXFxuXFx0XFx0ZmxvYXQgY2xlYXJDb2F0REhSID0gMC4wO1xcblxcdCNlbmRpZlxcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKz0gKCAxLjAgLSBjbGVhckNvYXRESFIgKSAqIHJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGdlb21ldHJ5LCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApO1xcblxcdCNpZm5kZWYgU1RBTkRBUkRcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICs9IGNsZWFyQ29hdFJhZGlhbmNlICogbWF0ZXJpYWwuY2xlYXJDb2F0ICogQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGdlb21ldHJ5LCB2ZWMzKCBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICksIG1hdGVyaWFsLmNsZWFyQ29hdFJvdWdobmVzcyApO1xcblxcdCNlbmRpZlxcbn1cXG4jZGVmaW5lIFJFX0RpcmVjdFxcdFxcdFxcdFxcdFJFX0RpcmVjdF9QaHlzaWNhbFxcbiNkZWZpbmUgUkVfRGlyZWN0X1JlY3RBcmVhXFx0XFx0UkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsXFxuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcXHRcXHRSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWxcXG4jZGVmaW5lIFJFX0luZGlyZWN0U3BlY3VsYXJcXHRcXHRSRV9JbmRpcmVjdFNwZWN1bGFyX1BoeXNpY2FsXFxuI2RlZmluZSBNYXRlcmlhbF9CbGlublNoaW5pbmVzc0V4cG9uZW50KCBtYXRlcmlhbCApICAgR0dYUm91Z2huZXNzVG9CbGlubkV4cG9uZW50KCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApXFxuI2RlZmluZSBNYXRlcmlhbF9DbGVhckNvYXRfQmxpbm5TaGluaW5lc3NFeHBvbmVudCggbWF0ZXJpYWwgKSAgIEdHWFJvdWdobmVzc1RvQmxpbm5FeHBvbmVudCggbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzIClcXG5mbG9hdCBjb21wdXRlU3BlY3VsYXJPY2NsdXNpb24oIGNvbnN0IGluIGZsb2F0IGRvdE5WLCBjb25zdCBpbiBmbG9hdCBhbWJpZW50T2NjbHVzaW9uLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XFxuXFx0cmV0dXJuIHNhdHVyYXRlKCBwb3coIGRvdE5WICsgYW1iaWVudE9jY2x1c2lvbiwgZXhwMiggLSAxNi4wICogcm91Z2huZXNzIC0gMS4wICkgKSAtIDEuMCArIGFtYmllbnRPY2NsdXNpb24gKTtcXG59XFxuXCI7XG5cbnZhciBsaWdodHNfZnJhZ21lbnRfYmVnaW4gPSBcIlxcbkdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnk7XFxuZ2VvbWV0cnkucG9zaXRpb24gPSAtIHZWaWV3UG9zaXRpb247XFxuZ2VvbWV0cnkubm9ybWFsID0gbm9ybWFsO1xcbmdlb21ldHJ5LnZpZXdEaXIgPSBub3JtYWxpemUoIHZWaWV3UG9zaXRpb24gKTtcXG5JbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0O1xcbiNpZiAoIE5VTV9QT0lOVF9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcXG5cXHRQb2ludExpZ2h0IHBvaW50TGlnaHQ7XFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0cG9pbnRMaWdodCA9IHBvaW50TGlnaHRzWyBpIF07XFxuXFx0XFx0Z2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIHBvaW50TGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xcblxcdFxcdCNpZmRlZiBVU0VfU0hBRE9XTUFQXFxuXFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gYWxsKCBidmVjMiggcG9pbnRMaWdodC5zaGFkb3csIGRpcmVjdExpZ2h0LnZpc2libGUgKSApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodC5zaGFkb3dCaWFzLCBwb2ludExpZ2h0LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFOZWFyLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYUZhciApIDogMS4wO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcXG5cXHR9XFxuI2VuZGlmXFxuI2lmICggTlVNX1NQT1RfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdCApXFxuXFx0U3BvdExpZ2h0IHNwb3RMaWdodDtcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1NQT1RfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHNwb3RMaWdodCA9IHNwb3RMaWdodHNbIGkgXTtcXG5cXHRcXHRnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBzcG90TGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xcblxcdFxcdCNpZmRlZiBVU0VfU0hBRE9XTUFQXFxuXFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gYWxsKCBidmVjMiggc3BvdExpZ2h0LnNoYWRvdywgZGlyZWN0TGlnaHQudmlzaWJsZSApICkgPyBnZXRTaGFkb3coIHNwb3RTaGFkb3dNYXBbIGkgXSwgc3BvdExpZ2h0LnNoYWRvd01hcFNpemUsIHNwb3RMaWdodC5zaGFkb3dCaWFzLCBzcG90TGlnaHQuc2hhZG93UmFkaXVzLCB2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XFxuXFx0fVxcbiNlbmRpZlxcbiNpZiAoIE5VTV9ESVJfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdCApXFxuXFx0RGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0O1xcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRkaXJlY3Rpb25hbExpZ2h0ID0gZGlyZWN0aW9uYWxMaWdodHNbIGkgXTtcXG5cXHRcXHRnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggZGlyZWN0aW9uYWxMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0I2lmZGVmIFVTRV9TSEFET1dNQVBcXG5cXHRcXHRkaXJlY3RMaWdodC5jb2xvciAqPSBhbGwoIGJ2ZWMyKCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvdywgZGlyZWN0TGlnaHQudmlzaWJsZSApICkgPyBnZXRTaGFkb3coIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBpIF0sIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93TWFwU2l6ZSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dCaWFzLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcXG5cXHR9XFxuI2VuZGlmXFxuI2lmICggTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0X1JlY3RBcmVhIClcXG5cXHRSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQ7XFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9SRUNUX0FSRUFfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHJlY3RBcmVhTGlnaHQgPSByZWN0QXJlYUxpZ2h0c1sgaSBdO1xcblxcdFxcdFJFX0RpcmVjdF9SZWN0QXJlYSggcmVjdEFyZWFMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xcblxcdH1cXG4jZW5kaWZcXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3REaWZmdXNlIClcXG5cXHR2ZWMzIGlycmFkaWFuY2UgPSBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBhbWJpZW50TGlnaHRDb2xvciApO1xcblxcdCNpZiAoIE5VTV9IRU1JX0xJR0hUUyA+IDAgKVxcblxcdFxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRcXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fSEVNSV9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0XFx0aXJyYWRpYW5jZSArPSBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGdlb21ldHJ5ICk7XFxuXFx0XFx0fVxcblxcdCNlbmRpZlxcbiNlbmRpZlxcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyIClcXG5cXHR2ZWMzIHJhZGlhbmNlID0gdmVjMyggMC4wICk7XFxuXFx0dmVjMyBjbGVhckNvYXRSYWRpYW5jZSA9IHZlYzMoIDAuMCApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbGlnaHRzX2ZyYWdtZW50X21hcHMgPSBcIiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxcblxcdCNpZmRlZiBVU0VfTElHSFRNQVBcXG5cXHRcXHR2ZWMzIGxpZ2h0TWFwSXJyYWRpYW5jZSA9IHRleHR1cmUyRCggbGlnaHRNYXAsIHZVdjIgKS54eXogKiBsaWdodE1hcEludGVuc2l0eTtcXG5cXHRcXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcXG5cXHRcXHRcXHRsaWdodE1hcElycmFkaWFuY2UgKj0gUEk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0aXJyYWRpYW5jZSArPSBsaWdodE1hcElycmFkaWFuY2U7XFxuXFx0I2VuZGlmXFxuXFx0I2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBQSFlTSUNBTCApICYmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxcblxcdFxcdGlycmFkaWFuY2UgKz0gZ2V0TGlnaHRQcm9iZUluZGlyZWN0SXJyYWRpYW5jZSggZ2VvbWV0cnksIG1heE1pcExldmVsICk7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyIClcXG5cXHRyYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSW5kaXJlY3RSYWRpYW5jZSggZ2VvbWV0cnksIE1hdGVyaWFsX0JsaW5uU2hpbmluZXNzRXhwb25lbnQoIG1hdGVyaWFsICksIG1heE1pcExldmVsICk7XFxuXFx0I2lmbmRlZiBTVEFOREFSRFxcblxcdFxcdGNsZWFyQ29hdFJhZGlhbmNlICs9IGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBnZW9tZXRyeSwgTWF0ZXJpYWxfQ2xlYXJDb2F0X0JsaW5uU2hpbmluZXNzRXhwb25lbnQoIG1hdGVyaWFsICksIG1heE1pcExldmVsICk7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsaWdodHNfZnJhZ21lbnRfZW5kID0gXCIjaWYgZGVmaW5lZCggUkVfSW5kaXJlY3REaWZmdXNlIClcXG5cXHRSRV9JbmRpcmVjdERpZmZ1c2UoIGlycmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcXG4jZW5kaWZcXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXFxuXFx0UkVfSW5kaXJlY3RTcGVjdWxhciggcmFkaWFuY2UsIGNsZWFyQ29hdFJhZGlhbmNlLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsb2dkZXB0aGJ1Zl9mcmFnbWVudCA9IFwiI2lmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRiApICYmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRl9FWFQgKVxcblxcdGdsX0ZyYWdEZXB0aEVYVCA9IGxvZzIoIHZGcmFnRGVwdGggKSAqIGxvZ0RlcHRoQnVmRkMgKiAwLjU7XFxuI2VuZGlmXCI7XG5cbnZhciBsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXFxuXFx0dW5pZm9ybSBmbG9hdCBsb2dEZXB0aEJ1ZkZDO1xcblxcdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZfRVhUXFxuXFx0XFx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfTE9HREVQVEhCVUZcXG5cXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxcblxcdFxcdHZhcnlpbmcgZmxvYXQgdkZyYWdEZXB0aDtcXG5cXHQjZW5kaWZcXG5cXHR1bmlmb3JtIGZsb2F0IGxvZ0RlcHRoQnVmRkM7XFxuI2VuZGlmXCI7XG5cbnZhciBsb2dkZXB0aGJ1Zl92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfTE9HREVQVEhCVUZcXG5cXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxcblxcdFxcdHZGcmFnRGVwdGggPSAxLjAgKyBnbF9Qb3NpdGlvbi53O1xcblxcdCNlbHNlXFxuXFx0XFx0Z2xfUG9zaXRpb24ueiA9IGxvZzIoIG1heCggRVBTSUxPTiwgZ2xfUG9zaXRpb24udyArIDEuMCApICkgKiBsb2dEZXB0aEJ1ZkZDIC0gMS4wO1xcblxcdFxcdGdsX1Bvc2l0aW9uLnogKj0gZ2xfUG9zaXRpb24udztcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIG1hcF9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9NQVBcXG5cXHR2ZWM0IHRleGVsQ29sb3IgPSB0ZXh0dXJlMkQoIG1hcCwgdlV2ICk7XFxuXFx0dGV4ZWxDb2xvciA9IG1hcFRleGVsVG9MaW5lYXIoIHRleGVsQ29sb3IgKTtcXG5cXHRkaWZmdXNlQ29sb3IgKj0gdGV4ZWxDb2xvcjtcXG4jZW5kaWZcXG5cIjtcblxudmFyIG1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX01BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIG1hcDtcXG4jZW5kaWZcXG5cIjtcblxudmFyIG1hcF9wYXJ0aWNsZV9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9NQVBcXG5cXHR2ZWMyIHV2ID0gKCB1dlRyYW5zZm9ybSAqIHZlYzMoIGdsX1BvaW50Q29vcmQueCwgMS4wIC0gZ2xfUG9pbnRDb29yZC55LCAxICkgKS54eTtcXG5cXHR2ZWM0IG1hcFRleGVsID0gdGV4dHVyZTJEKCBtYXAsIHV2ICk7XFxuXFx0ZGlmZnVzZUNvbG9yICo9IG1hcFRleGVsVG9MaW5lYXIoIG1hcFRleGVsICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9NQVBcXG5cXHR1bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbWFwO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbWV0YWxuZXNzbWFwX2ZyYWdtZW50ID0gXCJmbG9hdCBtZXRhbG5lc3NGYWN0b3IgPSBtZXRhbG5lc3M7XFxuI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcXG5cXHR2ZWM0IHRleGVsTWV0YWxuZXNzID0gdGV4dHVyZTJEKCBtZXRhbG5lc3NNYXAsIHZVdiApO1xcblxcdG1ldGFsbmVzc0ZhY3RvciAqPSB0ZXhlbE1ldGFsbmVzcy5iO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTUVUQUxORVNTTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbWV0YWxuZXNzTWFwO1xcbiNlbmRpZlwiO1xuXG52YXIgbW9ycGhub3JtYWxfdmVydGV4ID0gXCIjaWZkZWYgVVNFX01PUlBITk9STUFMU1xcblxcdG9iamVjdE5vcm1hbCArPSAoIG1vcnBoTm9ybWFsMCAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAwIF07XFxuXFx0b2JqZWN0Tm9ybWFsICs9ICggbW9ycGhOb3JtYWwxIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcXG5cXHRvYmplY3ROb3JtYWwgKz0gKCBtb3JwaE5vcm1hbDIgLSBub3JtYWwgKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMiBdO1xcblxcdG9iamVjdE5vcm1hbCArPSAoIG1vcnBoTm9ybWFsMyAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAzIF07XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBtb3JwaHRhcmdldF9wYXJzX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFNcXG5cXHQjaWZuZGVmIFVTRV9NT1JQSE5PUk1BTFNcXG5cXHR1bmlmb3JtIGZsb2F0IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgOCBdO1xcblxcdCNlbHNlXFxuXFx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDQgXTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcIjtcblxudmFyIG1vcnBodGFyZ2V0X3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFNcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0MCAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDAgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0MSAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0MiAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDIgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0MyAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDMgXTtcXG5cXHQjaWZuZGVmIFVTRV9NT1JQSE5PUk1BTFNcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0NCAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDQgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0NSAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDUgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0NiAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDYgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0NyAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDcgXTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIG5vcm1hbF9mcmFnbWVudF9iZWdpbiA9IFwiI2lmZGVmIEZMQVRfU0hBREVEXFxuXFx0dmVjMyBmZHggPSB2ZWMzKCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnggKSwgZEZkeCggdlZpZXdQb3NpdGlvbi55ICksIGRGZHgoIHZWaWV3UG9zaXRpb24ueiApICk7XFxuXFx0dmVjMyBmZHkgPSB2ZWMzKCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnggKSwgZEZkeSggdlZpZXdQb3NpdGlvbi55ICksIGRGZHkoIHZWaWV3UG9zaXRpb24ueiApICk7XFxuXFx0dmVjMyBub3JtYWwgPSBub3JtYWxpemUoIGNyb3NzKCBmZHgsIGZkeSApICk7XFxuI2Vsc2VcXG5cXHR2ZWMzIG5vcm1hbCA9IG5vcm1hbGl6ZSggdk5vcm1hbCApO1xcblxcdCNpZmRlZiBET1VCTEVfU0lERURcXG5cXHRcXHRub3JtYWwgPSBub3JtYWwgKiAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBub3JtYWxfZnJhZ21lbnRfbWFwcyA9IFwiI2lmZGVmIFVTRV9OT1JNQUxNQVBcXG5cXHRub3JtYWwgPSBwZXJ0dXJiTm9ybWFsMkFyYiggLXZWaWV3UG9zaXRpb24sIG5vcm1hbCApO1xcbiNlbGlmIGRlZmluZWQoIFVTRV9CVU1QTUFQIClcXG5cXHRub3JtYWwgPSBwZXJ0dXJiTm9ybWFsQXJiKCAtdlZpZXdQb3NpdGlvbiwgbm9ybWFsLCBkSGR4eV9md2QoKSApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTk9STUFMTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbm9ybWFsTWFwO1xcblxcdHVuaWZvcm0gdmVjMiBub3JtYWxTY2FsZTtcXG5cXHR2ZWMzIHBlcnR1cmJOb3JtYWwyQXJiKCB2ZWMzIGV5ZV9wb3MsIHZlYzMgc3VyZl9ub3JtICkge1xcblxcdFxcdHZlYzMgcTAgPSB2ZWMzKCBkRmR4KCBleWVfcG9zLnggKSwgZEZkeCggZXllX3Bvcy55ICksIGRGZHgoIGV5ZV9wb3MueiApICk7XFxuXFx0XFx0dmVjMyBxMSA9IHZlYzMoIGRGZHkoIGV5ZV9wb3MueCApLCBkRmR5KCBleWVfcG9zLnkgKSwgZEZkeSggZXllX3Bvcy56ICkgKTtcXG5cXHRcXHR2ZWMyIHN0MCA9IGRGZHgoIHZVdi5zdCApO1xcblxcdFxcdHZlYzIgc3QxID0gZEZkeSggdlV2LnN0ICk7XFxuXFx0XFx0ZmxvYXQgc2NhbGUgPSBzaWduKCBzdDEudCAqIHN0MC5zIC0gc3QwLnQgKiBzdDEucyApO1xcdFxcdHNjYWxlICo9IGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wO1xcblxcdFxcdHZlYzMgUyA9IG5vcm1hbGl6ZSggKCBxMCAqIHN0MS50IC0gcTEgKiBzdDAudCApICogc2NhbGUgKTtcXG5cXHRcXHR2ZWMzIFQgPSBub3JtYWxpemUoICggLSBxMCAqIHN0MS5zICsgcTEgKiBzdDAucyApICogc2NhbGUgKTtcXG5cXHRcXHR2ZWMzIE4gPSBub3JtYWxpemUoIHN1cmZfbm9ybSApO1xcblxcdFxcdHZlYzMgbWFwTiA9IHRleHR1cmUyRCggbm9ybWFsTWFwLCB2VXYgKS54eXogKiAyLjAgLSAxLjA7XFxuXFx0XFx0bWFwTi54eSA9IG5vcm1hbFNjYWxlICogbWFwTi54eTtcXG5cXHRcXHRtYXQzIHRzbiA9IG1hdDMoIFMsIFQsIE4gKTtcXG5cXHRcXHRyZXR1cm4gbm9ybWFsaXplKCB0c24gKiBtYXBOICk7XFxuXFx0fVxcbiNlbmRpZlxcblwiO1xuXG52YXIgcGFja2luZyA9IFwidmVjMyBwYWNrTm9ybWFsVG9SR0IoIGNvbnN0IGluIHZlYzMgbm9ybWFsICkge1xcblxcdHJldHVybiBub3JtYWxpemUoIG5vcm1hbCApICogMC41ICsgMC41O1xcbn1cXG52ZWMzIHVucGFja1JHQlRvTm9ybWFsKCBjb25zdCBpbiB2ZWMzIHJnYiApIHtcXG5cXHRyZXR1cm4gMi4wICogcmdiLnh5eiAtIDEuMDtcXG59XFxuY29uc3QgZmxvYXQgUGFja1Vwc2NhbGUgPSAyNTYuIC8gMjU1Ljtjb25zdCBmbG9hdCBVbnBhY2tEb3duc2NhbGUgPSAyNTUuIC8gMjU2LjtcXG5jb25zdCB2ZWMzIFBhY2tGYWN0b3JzID0gdmVjMyggMjU2LiAqIDI1Ni4gKiAyNTYuLCAyNTYuICogMjU2LiwgIDI1Ni4gKTtcXG5jb25zdCB2ZWM0IFVucGFja0ZhY3RvcnMgPSBVbnBhY2tEb3duc2NhbGUgLyB2ZWM0KCBQYWNrRmFjdG9ycywgMS4gKTtcXG5jb25zdCBmbG9hdCBTaGlmdFJpZ2h0OCA9IDEuIC8gMjU2LjtcXG52ZWM0IHBhY2tEZXB0aFRvUkdCQSggY29uc3QgaW4gZmxvYXQgdiApIHtcXG5cXHR2ZWM0IHIgPSB2ZWM0KCBmcmFjdCggdiAqIFBhY2tGYWN0b3JzICksIHYgKTtcXG5cXHRyLnl6dyAtPSByLnh5eiAqIFNoaWZ0UmlnaHQ4O1xcdHJldHVybiByICogUGFja1Vwc2NhbGU7XFxufVxcbmZsb2F0IHVucGFja1JHQkFUb0RlcHRoKCBjb25zdCBpbiB2ZWM0IHYgKSB7XFxuXFx0cmV0dXJuIGRvdCggdiwgVW5wYWNrRmFjdG9ycyApO1xcbn1cXG5mbG9hdCB2aWV3WlRvT3J0aG9ncmFwaGljRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XFxuXFx0cmV0dXJuICggdmlld1ogKyBuZWFyICkgLyAoIG5lYXIgLSBmYXIgKTtcXG59XFxuZmxvYXQgb3J0aG9ncmFwaGljRGVwdGhUb1ZpZXdaKCBjb25zdCBpbiBmbG9hdCBsaW5lYXJDbGlwWiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xcblxcdHJldHVybiBsaW5lYXJDbGlwWiAqICggbmVhciAtIGZhciApIC0gbmVhcjtcXG59XFxuZmxvYXQgdmlld1pUb1BlcnNwZWN0aXZlRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XFxuXFx0cmV0dXJuICgoIG5lYXIgKyB2aWV3WiApICogZmFyICkgLyAoKCBmYXIgLSBuZWFyICkgKiB2aWV3WiApO1xcbn1cXG5mbG9hdCBwZXJzcGVjdGl2ZURlcHRoVG9WaWV3WiggY29uc3QgaW4gZmxvYXQgaW52Q2xpcFosIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcXG5cXHRyZXR1cm4gKCBuZWFyICogZmFyICkgLyAoICggZmFyIC0gbmVhciApICogaW52Q2xpcFogLSBmYXIgKTtcXG59XFxuXCI7XG5cbnZhciBwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50ID0gXCIjaWZkZWYgUFJFTVVMVElQTElFRF9BTFBIQVxcblxcdGdsX0ZyYWdDb2xvci5yZ2IgKj0gZ2xfRnJhZ0NvbG9yLmE7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBwcm9qZWN0X3ZlcnRleCA9IFwidmVjNCBtdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xcbmdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG12UG9zaXRpb247XFxuXCI7XG5cbnZhciBkaXRoZXJpbmdfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBESVRIRVJJTkcgKVxcbiAgZ2xfRnJhZ0NvbG9yLnJnYiA9IGRpdGhlcmluZyggZ2xfRnJhZ0NvbG9yLnJnYiApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBESVRIRVJJTkcgKVxcblxcdHZlYzMgZGl0aGVyaW5nKCB2ZWMzIGNvbG9yICkge1xcblxcdFxcdGZsb2F0IGdyaWRfcG9zaXRpb24gPSByYW5kKCBnbF9GcmFnQ29vcmQueHkgKTtcXG5cXHRcXHR2ZWMzIGRpdGhlcl9zaGlmdF9SR0IgPSB2ZWMzKCAwLjI1IC8gMjU1LjAsIC0wLjI1IC8gMjU1LjAsIDAuMjUgLyAyNTUuMCApO1xcblxcdFxcdGRpdGhlcl9zaGlmdF9SR0IgPSBtaXgoIDIuMCAqIGRpdGhlcl9zaGlmdF9SR0IsIC0yLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCBncmlkX3Bvc2l0aW9uICk7XFxuXFx0XFx0cmV0dXJuIGNvbG9yICsgZGl0aGVyX3NoaWZ0X1JHQjtcXG5cXHR9XFxuI2VuZGlmXFxuXCI7XG5cbnZhciByb3VnaG5lc3NtYXBfZnJhZ21lbnQgPSBcImZsb2F0IHJvdWdobmVzc0ZhY3RvciA9IHJvdWdobmVzcztcXG4jaWZkZWYgVVNFX1JPVUdITkVTU01BUFxcblxcdHZlYzQgdGV4ZWxSb3VnaG5lc3MgPSB0ZXh0dXJlMkQoIHJvdWdobmVzc01hcCwgdlV2ICk7XFxuXFx0cm91Z2huZXNzRmFjdG9yICo9IHRleGVsUm91Z2huZXNzLmc7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciByb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCByb3VnaG5lc3NNYXA7XFxuI2VuZGlmXCI7XG5cbnZhciBzaGFkb3dtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9TSEFET1dNQVBcXG5cXHQjaWYgTlVNX0RJUl9MSUdIVFMgPiAwXFxuXFx0XFx0dW5pZm9ybSBzYW1wbGVyMkQgZGlyZWN0aW9uYWxTaGFkb3dNYXBbIE5VTV9ESVJfTElHSFRTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBOVU1fRElSX0xJR0hUUyBdO1xcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXFxuXFx0XFx0dW5pZm9ybSBzYW1wbGVyMkQgc3BvdFNoYWRvd01hcFsgTlVNX1NQT1RfTElHSFRTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZTcG90U2hhZG93Q29vcmRbIE5VTV9TUE9UX0xJR0hUUyBdO1xcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxcblxcdFxcdHVuaWZvcm0gc2FtcGxlcjJEIHBvaW50U2hhZG93TWFwWyBOVU1fUE9JTlRfTElHSFRTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRTIF07XFxuXFx0I2VuZGlmXFxuXFx0ZmxvYXQgdGV4dHVyZTJEQ29tcGFyZSggc2FtcGxlcjJEIGRlcHRocywgdmVjMiB1diwgZmxvYXQgY29tcGFyZSApIHtcXG5cXHRcXHRyZXR1cm4gc3RlcCggY29tcGFyZSwgdW5wYWNrUkdCQVRvRGVwdGgoIHRleHR1cmUyRCggZGVwdGhzLCB1diApICkgKTtcXG5cXHR9XFxuXFx0ZmxvYXQgdGV4dHVyZTJEU2hhZG93TGVycCggc2FtcGxlcjJEIGRlcHRocywgdmVjMiBzaXplLCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICkge1xcblxcdFxcdGNvbnN0IHZlYzIgb2Zmc2V0ID0gdmVjMiggMC4wLCAxLjAgKTtcXG5cXHRcXHR2ZWMyIHRleGVsU2l6ZSA9IHZlYzIoIDEuMCApIC8gc2l6ZTtcXG5cXHRcXHR2ZWMyIGNlbnRyb2lkVVYgPSBmbG9vciggdXYgKiBzaXplICsgMC41ICkgLyBzaXplO1xcblxcdFxcdGZsb2F0IGxiID0gdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnh4LCBjb21wYXJlICk7XFxuXFx0XFx0ZmxvYXQgbHQgPSB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueHksIGNvbXBhcmUgKTtcXG5cXHRcXHRmbG9hdCByYiA9IHRleHR1cmUyRENvbXBhcmUoIGRlcHRocywgY2VudHJvaWRVViArIHRleGVsU2l6ZSAqIG9mZnNldC55eCwgY29tcGFyZSApO1xcblxcdFxcdGZsb2F0IHJ0ID0gdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnl5LCBjb21wYXJlICk7XFxuXFx0XFx0dmVjMiBmID0gZnJhY3QoIHV2ICogc2l6ZSArIDAuNSApO1xcblxcdFxcdGZsb2F0IGEgPSBtaXgoIGxiLCBsdCwgZi55ICk7XFxuXFx0XFx0ZmxvYXQgYiA9IG1peCggcmIsIHJ0LCBmLnkgKTtcXG5cXHRcXHRmbG9hdCBjID0gbWl4KCBhLCBiLCBmLnggKTtcXG5cXHRcXHRyZXR1cm4gYztcXG5cXHR9XFxuXFx0ZmxvYXQgZ2V0U2hhZG93KCBzYW1wbGVyMkQgc2hhZG93TWFwLCB2ZWMyIHNoYWRvd01hcFNpemUsIGZsb2F0IHNoYWRvd0JpYXMsIGZsb2F0IHNoYWRvd1JhZGl1cywgdmVjNCBzaGFkb3dDb29yZCApIHtcXG5cXHRcXHRmbG9hdCBzaGFkb3cgPSAxLjA7XFxuXFx0XFx0c2hhZG93Q29vcmQueHl6IC89IHNoYWRvd0Nvb3JkLnc7XFxuXFx0XFx0c2hhZG93Q29vcmQueiArPSBzaGFkb3dCaWFzO1xcblxcdFxcdGJ2ZWM0IGluRnJ1c3R1bVZlYyA9IGJ2ZWM0ICggc2hhZG93Q29vcmQueCA+PSAwLjAsIHNoYWRvd0Nvb3JkLnggPD0gMS4wLCBzaGFkb3dDb29yZC55ID49IDAuMCwgc2hhZG93Q29vcmQueSA8PSAxLjAgKTtcXG5cXHRcXHRib29sIGluRnJ1c3R1bSA9IGFsbCggaW5GcnVzdHVtVmVjICk7XFxuXFx0XFx0YnZlYzIgZnJ1c3R1bVRlc3RWZWMgPSBidmVjMiggaW5GcnVzdHVtLCBzaGFkb3dDb29yZC56IDw9IDEuMCApO1xcblxcdFxcdGJvb2wgZnJ1c3R1bVRlc3QgPSBhbGwoIGZydXN0dW1UZXN0VmVjICk7XFxuXFx0XFx0aWYgKCBmcnVzdHVtVGVzdCApIHtcXG5cXHRcXHQjaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGIClcXG5cXHRcXHRcXHR2ZWMyIHRleGVsU2l6ZSA9IHZlYzIoIDEuMCApIC8gc2hhZG93TWFwU2l6ZTtcXG5cXHRcXHRcXHRmbG9hdCBkeDAgPSAtIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdGZsb2F0IGR5MCA9IC0gdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0ZmxvYXQgZHgxID0gKyB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRmbG9hdCBkeTEgPSArIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdHNoYWRvdyA9IChcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MSApLCBzaGFkb3dDb29yZC56IClcXG5cXHRcXHRcXHQpICogKCAxLjAgLyA5LjAgKTtcXG5cXHRcXHQjZWxpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApXFxuXFx0XFx0XFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XFxuXFx0XFx0XFx0ZmxvYXQgZHgwID0gLSB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRmbG9hdCBkeTAgPSAtIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdGZsb2F0IGR4MSA9ICsgdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0ZmxvYXQgZHkxID0gKyB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRzaGFkb3cgPSAoXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTEgKSwgc2hhZG93Q29vcmQueiApXFxuXFx0XFx0XFx0KSAqICggMS4wIC8gOS4wICk7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHRzaGFkb3cgPSB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0fVxcblxcdFxcdHJldHVybiBzaGFkb3c7XFxuXFx0fVxcblxcdHZlYzIgY3ViZVRvVVYoIHZlYzMgdiwgZmxvYXQgdGV4ZWxTaXplWSApIHtcXG5cXHRcXHR2ZWMzIGFic1YgPSBhYnMoIHYgKTtcXG5cXHRcXHRmbG9hdCBzY2FsZVRvQ3ViZSA9IDEuMCAvIG1heCggYWJzVi54LCBtYXgoIGFic1YueSwgYWJzVi56ICkgKTtcXG5cXHRcXHRhYnNWICo9IHNjYWxlVG9DdWJlO1xcblxcdFxcdHYgKj0gc2NhbGVUb0N1YmUgKiAoIDEuMCAtIDIuMCAqIHRleGVsU2l6ZVkgKTtcXG5cXHRcXHR2ZWMyIHBsYW5hciA9IHYueHk7XFxuXFx0XFx0ZmxvYXQgYWxtb3N0QVRleGVsID0gMS41ICogdGV4ZWxTaXplWTtcXG5cXHRcXHRmbG9hdCBhbG1vc3RPbmUgPSAxLjAgLSBhbG1vc3RBVGV4ZWw7XFxuXFx0XFx0aWYgKCBhYnNWLnogPj0gYWxtb3N0T25lICkge1xcblxcdFxcdFxcdGlmICggdi56ID4gMC4wIClcXG5cXHRcXHRcXHRcXHRwbGFuYXIueCA9IDQuMCAtIHYueDtcXG5cXHRcXHR9IGVsc2UgaWYgKCBhYnNWLnggPj0gYWxtb3N0T25lICkge1xcblxcdFxcdFxcdGZsb2F0IHNpZ25YID0gc2lnbiggdi54ICk7XFxuXFx0XFx0XFx0cGxhbmFyLnggPSB2LnogKiBzaWduWCArIDIuMCAqIHNpZ25YO1xcblxcdFxcdH0gZWxzZSBpZiAoIGFic1YueSA+PSBhbG1vc3RPbmUgKSB7XFxuXFx0XFx0XFx0ZmxvYXQgc2lnblkgPSBzaWduKCB2LnkgKTtcXG5cXHRcXHRcXHRwbGFuYXIueCA9IHYueCArIDIuMCAqIHNpZ25ZICsgMi4wO1xcblxcdFxcdFxcdHBsYW5hci55ID0gdi56ICogc2lnblkgLSAyLjA7XFxuXFx0XFx0fVxcblxcdFxcdHJldHVybiB2ZWMyKCAwLjEyNSwgMC4yNSApICogcGxhbmFyICsgdmVjMiggMC4zNzUsIDAuNzUgKTtcXG5cXHR9XFxuXFx0ZmxvYXQgZ2V0UG9pbnRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkLCBmbG9hdCBzaGFkb3dDYW1lcmFOZWFyLCBmbG9hdCBzaGFkb3dDYW1lcmFGYXIgKSB7XFxuXFx0XFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvICggc2hhZG93TWFwU2l6ZSAqIHZlYzIoIDQuMCwgMi4wICkgKTtcXG5cXHRcXHR2ZWMzIGxpZ2h0VG9Qb3NpdGlvbiA9IHNoYWRvd0Nvb3JkLnh5ejtcXG5cXHRcXHRmbG9hdCBkcCA9ICggbGVuZ3RoKCBsaWdodFRvUG9zaXRpb24gKSAtIHNoYWRvd0NhbWVyYU5lYXIgKSAvICggc2hhZG93Q2FtZXJhRmFyIC0gc2hhZG93Q2FtZXJhTmVhciApO1xcdFxcdGRwICs9IHNoYWRvd0JpYXM7XFxuXFx0XFx0dmVjMyBiZDNEID0gbm9ybWFsaXplKCBsaWdodFRvUG9zaXRpb24gKTtcXG5cXHRcXHQjaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGICkgfHwgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKVxcblxcdFxcdFxcdHZlYzIgb2Zmc2V0ID0gdmVjMiggLSAxLCAxICkgKiBzaGFkb3dSYWRpdXMgKiB0ZXhlbFNpemUueTtcXG5cXHRcXHRcXHRyZXR1cm4gKFxcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl5LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eXgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXl4LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh4eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHksIHRleGVsU2l6ZS55ICksIGRwICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHh4LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl4eCwgdGV4ZWxTaXplLnkgKSwgZHAgKVxcblxcdFxcdFxcdCkgKiAoIDEuMCAvIDkuMCApO1xcblxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0cmV0dXJuIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QsIHRleGVsU2l6ZS55ICksIGRwICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcbiNlbmRpZlxcblwiO1xuXG52YXIgc2hhZG93bWFwX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX1NIQURPV01BUFxcblxcdCNpZiBOVU1fRElSX0xJR0hUUyA+IDBcXG5cXHRcXHR1bmlmb3JtIG1hdDQgZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIE5VTV9ESVJfTElHSFRTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBOVU1fRElSX0xJR0hUUyBdO1xcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXFxuXFx0XFx0dW5pZm9ybSBtYXQ0IHNwb3RTaGFkb3dNYXRyaXhbIE5VTV9TUE9UX0xJR0hUUyBdO1xcblxcdFxcdHZhcnlpbmcgdmVjNCB2U3BvdFNoYWRvd0Nvb3JkWyBOVU1fU1BPVF9MSUdIVFMgXTtcXG5cXHQjZW5kaWZcXG5cXHQjaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcXG5cXHRcXHR1bmlmb3JtIG1hdDQgcG9pbnRTaGFkb3dNYXRyaXhbIE5VTV9QT0lOVF9MSUdIVFMgXTtcXG5cXHRcXHR2YXJ5aW5nIHZlYzQgdlBvaW50U2hhZG93Q29vcmRbIE5VTV9QT0lOVF9MSUdIVFMgXTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIHNoYWRvd21hcF92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfU0hBRE9XTUFQXFxuXFx0I2lmIE5VTV9ESVJfTElHSFRTID4gMFxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHR2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdID0gZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIGkgXSAqIHdvcmxkUG9zaXRpb247XFxuXFx0fVxcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHR2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gPSBzcG90U2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xcblxcdH1cXG5cXHQjZW5kaWZcXG5cXHQjaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHR2UG9pbnRTaGFkb3dDb29yZFsgaSBdID0gcG9pbnRTaGFkb3dNYXRyaXhbIGkgXSAqIHdvcmxkUG9zaXRpb247XFxuXFx0fVxcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgc2hhZG93bWFza19wYXJzX2ZyYWdtZW50ID0gXCJmbG9hdCBnZXRTaGFkb3dNYXNrKCkge1xcblxcdGZsb2F0IHNoYWRvdyA9IDEuMDtcXG5cXHQjaWZkZWYgVVNFX1NIQURPV01BUFxcblxcdCNpZiBOVU1fRElSX0xJR0hUUyA+IDBcXG5cXHREaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQ7XFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xcblxcdFxcdGRpcmVjdGlvbmFsTGlnaHQgPSBkaXJlY3Rpb25hbExpZ2h0c1sgaSBdO1xcblxcdFxcdHNoYWRvdyAqPSBib29sKCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvdyApID8gZ2V0U2hhZG93KCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgaSBdLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd01hcFNpemUsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93QmlhcywgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dSYWRpdXMsIHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcXG5cXHR9XFxuXFx0I2VuZGlmXFxuXFx0I2lmIE5VTV9TUE9UX0xJR0hUUyA+IDBcXG5cXHRTcG90TGlnaHQgc3BvdExpZ2h0O1xcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0c3BvdExpZ2h0ID0gc3BvdExpZ2h0c1sgaSBdO1xcblxcdFxcdHNoYWRvdyAqPSBib29sKCBzcG90TGlnaHQuc2hhZG93ICkgPyBnZXRTaGFkb3coIHNwb3RTaGFkb3dNYXBbIGkgXSwgc3BvdExpZ2h0LnNoYWRvd01hcFNpemUsIHNwb3RMaWdodC5zaGFkb3dCaWFzLCBzcG90TGlnaHQuc2hhZG93UmFkaXVzLCB2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcXG5cXHR9XFxuXFx0I2VuZGlmXFxuXFx0I2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXFxuXFx0UG9pbnRMaWdodCBwb2ludExpZ2h0O1xcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHBvaW50TGlnaHQgPSBwb2ludExpZ2h0c1sgaSBdO1xcblxcdFxcdHNoYWRvdyAqPSBib29sKCBwb2ludExpZ2h0LnNoYWRvdyApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodC5zaGFkb3dCaWFzLCBwb2ludExpZ2h0LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFOZWFyLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYUZhciApIDogMS4wO1xcblxcdH1cXG5cXHQjZW5kaWZcXG5cXHQjZW5kaWZcXG5cXHRyZXR1cm4gc2hhZG93O1xcbn1cXG5cIjtcblxudmFyIHNraW5iYXNlX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9TS0lOTklOR1xcblxcdG1hdDQgYm9uZU1hdFggPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueCApO1xcblxcdG1hdDQgYm9uZU1hdFkgPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueSApO1xcblxcdG1hdDQgYm9uZU1hdFogPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueiApO1xcblxcdG1hdDQgYm9uZU1hdFcgPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgudyApO1xcbiNlbmRpZlwiO1xuXG52YXIgc2tpbm5pbmdfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfU0tJTk5JTkdcXG5cXHR1bmlmb3JtIG1hdDQgYmluZE1hdHJpeDtcXG5cXHR1bmlmb3JtIG1hdDQgYmluZE1hdHJpeEludmVyc2U7XFxuXFx0I2lmZGVmIEJPTkVfVEVYVFVSRVxcblxcdFxcdHVuaWZvcm0gc2FtcGxlcjJEIGJvbmVUZXh0dXJlO1xcblxcdFxcdHVuaWZvcm0gaW50IGJvbmVUZXh0dXJlU2l6ZTtcXG5cXHRcXHRtYXQ0IGdldEJvbmVNYXRyaXgoIGNvbnN0IGluIGZsb2F0IGkgKSB7XFxuXFx0XFx0XFx0ZmxvYXQgaiA9IGkgKiA0LjA7XFxuXFx0XFx0XFx0ZmxvYXQgeCA9IG1vZCggaiwgZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApICk7XFxuXFx0XFx0XFx0ZmxvYXQgeSA9IGZsb29yKCBqIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApICk7XFxuXFx0XFx0XFx0ZmxvYXQgZHggPSAxLjAgLyBmbG9hdCggYm9uZVRleHR1cmVTaXplICk7XFxuXFx0XFx0XFx0ZmxvYXQgZHkgPSAxLjAgLyBmbG9hdCggYm9uZVRleHR1cmVTaXplICk7XFxuXFx0XFx0XFx0eSA9IGR5ICogKCB5ICsgMC41ICk7XFxuXFx0XFx0XFx0dmVjNCB2MSA9IHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMC41ICksIHkgKSApO1xcblxcdFxcdFxcdHZlYzQgdjIgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDEuNSApLCB5ICkgKTtcXG5cXHRcXHRcXHR2ZWM0IHYzID0gdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAyLjUgKSwgeSApICk7XFxuXFx0XFx0XFx0dmVjNCB2NCA9IHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMy41ICksIHkgKSApO1xcblxcdFxcdFxcdG1hdDQgYm9uZSA9IG1hdDQoIHYxLCB2MiwgdjMsIHY0ICk7XFxuXFx0XFx0XFx0cmV0dXJuIGJvbmU7XFxuXFx0XFx0fVxcblxcdCNlbHNlXFxuXFx0XFx0dW5pZm9ybSBtYXQ0IGJvbmVNYXRyaWNlc1sgTUFYX0JPTkVTIF07XFxuXFx0XFx0bWF0NCBnZXRCb25lTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkge1xcblxcdFxcdFxcdG1hdDQgYm9uZSA9IGJvbmVNYXRyaWNlc1sgaW50KGkpIF07XFxuXFx0XFx0XFx0cmV0dXJuIGJvbmU7XFxuXFx0XFx0fVxcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgc2tpbm5pbmdfdmVydGV4ID0gXCIjaWZkZWYgVVNFX1NLSU5OSU5HXFxuXFx0dmVjNCBza2luVmVydGV4ID0gYmluZE1hdHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcXG5cXHR2ZWM0IHNraW5uZWQgPSB2ZWM0KCAwLjAgKTtcXG5cXHRza2lubmVkICs9IGJvbmVNYXRYICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQueDtcXG5cXHRza2lubmVkICs9IGJvbmVNYXRZICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQueTtcXG5cXHRza2lubmVkICs9IGJvbmVNYXRaICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQuejtcXG5cXHRza2lubmVkICs9IGJvbmVNYXRXICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQudztcXG5cXHR0cmFuc2Zvcm1lZCA9ICggYmluZE1hdHJpeEludmVyc2UgKiBza2lubmVkICkueHl6O1xcbiNlbmRpZlxcblwiO1xuXG52YXIgc2tpbm5vcm1hbF92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfU0tJTk5JTkdcXG5cXHRtYXQ0IHNraW5NYXRyaXggPSBtYXQ0KCAwLjAgKTtcXG5cXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQueCAqIGJvbmVNYXRYO1xcblxcdHNraW5NYXRyaXggKz0gc2tpbldlaWdodC55ICogYm9uZU1hdFk7XFxuXFx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnogKiBib25lTWF0WjtcXG5cXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQudyAqIGJvbmVNYXRXO1xcblxcdHNraW5NYXRyaXggID0gYmluZE1hdHJpeEludmVyc2UgKiBza2luTWF0cml4ICogYmluZE1hdHJpeDtcXG5cXHRvYmplY3ROb3JtYWwgPSB2ZWM0KCBza2luTWF0cml4ICogdmVjNCggb2JqZWN0Tm9ybWFsLCAwLjAgKSApLnh5ejtcXG4jZW5kaWZcXG5cIjtcblxudmFyIHNwZWN1bGFybWFwX2ZyYWdtZW50ID0gXCJmbG9hdCBzcGVjdWxhclN0cmVuZ3RoO1xcbiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVBcXG5cXHR2ZWM0IHRleGVsU3BlY3VsYXIgPSB0ZXh0dXJlMkQoIHNwZWN1bGFyTWFwLCB2VXYgKTtcXG5cXHRzcGVjdWxhclN0cmVuZ3RoID0gdGV4ZWxTcGVjdWxhci5yO1xcbiNlbHNlXFxuXFx0c3BlY3VsYXJTdHJlbmd0aCA9IDEuMDtcXG4jZW5kaWZcIjtcblxudmFyIHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhck1hcDtcXG4jZW5kaWZcIjtcblxudmFyIHRvbmVtYXBwaW5nX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggVE9ORV9NQVBQSU5HIClcXG4gIGdsX0ZyYWdDb2xvci5yZ2IgPSB0b25lTWFwcGluZyggZ2xfRnJhZ0NvbG9yLnJnYiApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgdG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudCA9IFwiI2lmbmRlZiBzYXR1cmF0ZVxcblxcdCNkZWZpbmUgc2F0dXJhdGUoYSkgY2xhbXAoIGEsIDAuMCwgMS4wIClcXG4jZW5kaWZcXG51bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nRXhwb3N1cmU7XFxudW5pZm9ybSBmbG9hdCB0b25lTWFwcGluZ1doaXRlUG9pbnQ7XFxudmVjMyBMaW5lYXJUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcXG5cXHRyZXR1cm4gdG9uZU1hcHBpbmdFeHBvc3VyZSAqIGNvbG9yO1xcbn1cXG52ZWMzIFJlaW5oYXJkVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XFxuXFx0Y29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZTtcXG5cXHRyZXR1cm4gc2F0dXJhdGUoIGNvbG9yIC8gKCB2ZWMzKCAxLjAgKSArIGNvbG9yICkgKTtcXG59XFxuI2RlZmluZSBVbmNoYXJ0ZWQySGVscGVyKCB4ICkgbWF4KCAoICggeCAqICggMC4xNSAqIHggKyAwLjEwICogMC41MCApICsgMC4yMCAqIDAuMDIgKSAvICggeCAqICggMC4xNSAqIHggKyAwLjUwICkgKyAwLjIwICogMC4zMCApICkgLSAwLjAyIC8gMC4zMCwgdmVjMyggMC4wICkgKVxcbnZlYzMgVW5jaGFydGVkMlRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xcblxcdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XFxuXFx0cmV0dXJuIHNhdHVyYXRlKCBVbmNoYXJ0ZWQySGVscGVyKCBjb2xvciApIC8gVW5jaGFydGVkMkhlbHBlciggdmVjMyggdG9uZU1hcHBpbmdXaGl0ZVBvaW50ICkgKSApO1xcbn1cXG52ZWMzIE9wdGltaXplZENpbmVvblRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xcblxcdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XFxuXFx0Y29sb3IgPSBtYXgoIHZlYzMoIDAuMCApLCBjb2xvciAtIDAuMDA0ICk7XFxuXFx0cmV0dXJuIHBvdyggKCBjb2xvciAqICggNi4yICogY29sb3IgKyAwLjUgKSApIC8gKCBjb2xvciAqICggNi4yICogY29sb3IgKyAxLjcgKSArIDAuMDYgKSwgdmVjMyggMi4yICkgKTtcXG59XFxuXCI7XG5cbnZhciB1dl9wYXJzX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggVVNFX01BUCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFVTRV9TUEVDVUxBUk1BUCApIHx8IGRlZmluZWQoIFVTRV9BTFBIQU1BUCApIHx8IGRlZmluZWQoIFVTRV9FTUlTU0lWRU1BUCApIHx8IGRlZmluZWQoIFVTRV9ST1VHSE5FU1NNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTUVUQUxORVNTTUFQIClcXG5cXHR2YXJ5aW5nIHZlYzIgdlV2O1xcbiNlbmRpZlwiO1xuXG52YXIgdXZfcGFyc192ZXJ0ZXggPSBcIiNpZiBkZWZpbmVkKCBVU0VfTUFQICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggVVNFX1NQRUNVTEFSTUFQICkgfHwgZGVmaW5lZCggVVNFX0FMUEhBTUFQICkgfHwgZGVmaW5lZCggVVNFX0VNSVNTSVZFTUFQICkgfHwgZGVmaW5lZCggVVNFX1JPVUdITkVTU01BUCApIHx8IGRlZmluZWQoIFVTRV9NRVRBTE5FU1NNQVAgKVxcblxcdHZhcnlpbmcgdmVjMiB2VXY7XFxuXFx0dW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgdXZfdmVydGV4ID0gXCIjaWYgZGVmaW5lZCggVVNFX01BUCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFVTRV9TUEVDVUxBUk1BUCApIHx8IGRlZmluZWQoIFVTRV9BTFBIQU1BUCApIHx8IGRlZmluZWQoIFVTRV9FTUlTU0lWRU1BUCApIHx8IGRlZmluZWQoIFVTRV9ST1VHSE5FU1NNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTUVUQUxORVNTTUFQIClcXG5cXHR2VXYgPSAoIHV2VHJhbnNmb3JtICogdmVjMyggdXYsIDEgKSApLnh5O1xcbiNlbmRpZlwiO1xuXG52YXIgdXYyX3BhcnNfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxcblxcdHZhcnlpbmcgdmVjMiB2VXYyO1xcbiNlbmRpZlwiO1xuXG52YXIgdXYyX3BhcnNfdmVydGV4ID0gXCIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcXG5cXHRhdHRyaWJ1dGUgdmVjMiB1djI7XFxuXFx0dmFyeWluZyB2ZWMyIHZVdjI7XFxuI2VuZGlmXCI7XG5cbnZhciB1djJfdmVydGV4ID0gXCIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcXG5cXHR2VXYyID0gdXYyO1xcbiNlbmRpZlwiO1xuXG52YXIgd29ybGRwb3NfdmVydGV4ID0gXCIjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIHx8IGRlZmluZWQoIERJU1RBTkNFICkgfHwgZGVmaW5lZCAoIFVTRV9TSEFET1dNQVAgKVxcblxcdHZlYzQgd29ybGRQb3NpdGlvbiA9IG1vZGVsTWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgY3ViZV9mcmFnID0gXCJ1bmlmb3JtIHNhbXBsZXJDdWJlIHRDdWJlO1xcbnVuaWZvcm0gZmxvYXQgdEZsaXA7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcXG52b2lkIG1haW4oKSB7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdGV4dHVyZUN1YmUoIHRDdWJlLCB2ZWMzKCB0RmxpcCAqIHZXb3JsZFBvc2l0aW9uLngsIHZXb3JsZFBvc2l0aW9uLnl6ICkgKTtcXG5cXHRnbF9GcmFnQ29sb3IuYSAqPSBvcGFjaXR5O1xcbn1cXG5cIjtcblxudmFyIGN1YmVfdmVydCA9IFwidmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcbiNpbmNsdWRlIDxjb21tb24+XFxudm9pZCBtYWluKCkge1xcblxcdHZXb3JsZFBvc2l0aW9uID0gdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHRnbF9Qb3NpdGlvbi56ID0gZ2xfUG9zaXRpb24udztcXG59XFxuXCI7XG5cbnZhciBkZXB0aF9mcmFnID0gXCIjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwXFxuXFx0dW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIDEuMCApO1xcblxcdCNpZiBERVBUSF9QQUNLSU5HID09IDMyMDBcXG5cXHRcXHRkaWZmdXNlQ29sb3IuYSA9IG9wYWNpdHk7XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMFxcblxcdFxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIHZlYzMoIDEuMCAtIGdsX0ZyYWdDb29yZC56ICksIG9wYWNpdHkgKTtcXG5cXHQjZWxpZiBERVBUSF9QQUNLSU5HID09IDMyMDFcXG5cXHRcXHRnbF9GcmFnQ29sb3IgPSBwYWNrRGVwdGhUb1JHQkEoIGdsX0ZyYWdDb29yZC56ICk7XFxuXFx0I2VuZGlmXFxufVxcblwiO1xuXG52YXIgZGVwdGhfdmVydCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxuXFx0I2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcXG5cXHRcXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdFxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0XFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxcblxcdCNlbmRpZlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIGRpc3RhbmNlUkdCQV9mcmFnID0gXCIjZGVmaW5lIERJU1RBTkNFXFxudW5pZm9ybSB2ZWMzIHJlZmVyZW5jZVBvc2l0aW9uO1xcbnVuaWZvcm0gZmxvYXQgbmVhckRpc3RhbmNlO1xcbnVuaWZvcm0gZmxvYXQgZmFyRGlzdGFuY2U7XFxudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4gKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCAxLjAgKTtcXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxcblxcdGZsb2F0IGRpc3QgPSBsZW5ndGgoIHZXb3JsZFBvc2l0aW9uIC0gcmVmZXJlbmNlUG9zaXRpb24gKTtcXG5cXHRkaXN0ID0gKCBkaXN0IC0gbmVhckRpc3RhbmNlICkgLyAoIGZhckRpc3RhbmNlIC0gbmVhckRpc3RhbmNlICk7XFxuXFx0ZGlzdCA9IHNhdHVyYXRlKCBkaXN0ICk7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gcGFja0RlcHRoVG9SR0JBKCBkaXN0ICk7XFxufVxcblwiO1xuXG52YXIgZGlzdGFuY2VSR0JBX3ZlcnQgPSBcIiNkZWZpbmUgRElTVEFOQ0VcXG52YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxcblxcdFxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0XFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHRcXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxuXFx0dldvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uLnh5ejtcXG59XFxuXCI7XG5cbnZhciBlcXVpcmVjdF9mcmFnID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0RXF1aXJlY3Q7XFxudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcbiNpbmNsdWRlIDxjb21tb24+XFxudm9pZCBtYWluKCkge1xcblxcdHZlYzMgZGlyZWN0aW9uID0gbm9ybWFsaXplKCB2V29ybGRQb3NpdGlvbiApO1xcblxcdHZlYzIgc2FtcGxlVVY7XFxuXFx0c2FtcGxlVVYueSA9IGFzaW4oIGNsYW1wKCBkaXJlY3Rpb24ueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xcblxcdHNhbXBsZVVWLnggPSBhdGFuKCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xcblxcdGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCggdEVxdWlyZWN0LCBzYW1wbGVVViApO1xcbn1cXG5cIjtcblxudmFyIGVxdWlyZWN0X3ZlcnQgPSBcInZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbnZvaWQgbWFpbigpIHtcXG5cXHR2V29ybGRQb3NpdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgbGluZWRhc2hlZF9mcmFnID0gXCJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxudW5pZm9ybSBmbG9hdCBkYXNoU2l6ZTtcXG51bmlmb3JtIGZsb2F0IHRvdGFsU2l6ZTtcXG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdGlmICggbW9kKCB2TGluZURpc3RhbmNlLCB0b3RhbFNpemUgKSA+IGRhc2hTaXplICkge1xcblxcdFxcdGRpc2NhcmQ7XFxuXFx0fVxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHZlYzMoIDAuMCApO1xcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0b3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2I7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcXG5cXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50Plxcbn1cXG5cIjtcblxudmFyIGxpbmVkYXNoZWRfdmVydCA9IFwidW5pZm9ybSBmbG9hdCBzY2FsZTtcXG5hdHRyaWJ1dGUgZmxvYXQgbGluZURpc3RhbmNlO1xcbnZhcnlpbmcgZmxvYXQgdkxpbmVEaXN0YW5jZTtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdHZMaW5lRGlzdGFuY2UgPSBzY2FsZSAqIGxpbmVEaXN0YW5jZTtcXG5cXHR2ZWM0IG12UG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIG1lc2hiYXNpY19mcmFnID0gXCJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PlxcblxcdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XFxuXFx0I2lmZGVmIFVTRV9MSUdIVE1BUFxcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICkueHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XFxuXFx0I2Vsc2VcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gdmVjMyggMS4wICk7XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqPSBkaWZmdXNlQ29sb3IucmdiO1xcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZTtcXG5cXHQjaW5jbHVkZSA8ZW52bWFwX2ZyYWdtZW50PlxcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG59XFxuXCI7XG5cbnZhciBtZXNoYmFzaWNfdmVydCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpZmRlZiBVU0VfRU5WTUFQXFxuXFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cXG59XFxuXCI7XG5cbnZhciBtZXNobGFtYmVydF9mcmFnID0gXCJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbnZhcnlpbmcgdmVjMyB2TGlnaHRGcm9udDtcXG4jaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZMaWdodEJhY2s7XFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGJzZGZzPlxcbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfbWFwcz5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XFxuXFx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD5cXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgPSBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBhbWJpZW50TGlnaHRDb2xvciApO1xcblxcdCNpbmNsdWRlIDxsaWdodG1hcF9mcmFnbWVudD5cXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gQlJERl9EaWZmdXNlX0xhbWJlcnQoIGRpZmZ1c2VDb2xvci5yZ2IgKTtcXG5cXHQjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSA9ICggZ2xfRnJvbnRGYWNpbmcgKSA/IHZMaWdodEZyb250IDogdkxpZ2h0QmFjaztcXG5cXHQjZWxzZVxcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgPSB2TGlnaHRGcm9udDtcXG5cXHQjZW5kaWZcXG5cXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICo9IEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBkaWZmdXNlQ29sb3IucmdiICkgKiBnZXRTaGFkb3dNYXNrKCk7XFxuXFx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XFxuXFx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cXG59XFxuXCI7XG5cbnZhciBtZXNobGFtYmVydF92ZXJ0ID0gXCIjZGVmaW5lIExBTUJFUlRcXG52YXJ5aW5nIHZlYzMgdkxpZ2h0RnJvbnQ7XFxuI2lmZGVmIERPVUJMRV9TSURFRFxcblxcdHZhcnlpbmcgdmVjMyB2TGlnaHRCYWNrO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8YnNkZnM+XFxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxcbiNpbmNsdWRlIDxsaWdodHNfcGFyc19tYXBzPlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8dXYyX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX2xhbWJlcnRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIG1lc2hwaG9uZ19mcmFnID0gXCIjZGVmaW5lIFBIT05HXFxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xcbnVuaWZvcm0gdmVjMyBzcGVjdWxhcjtcXG51bmlmb3JtIGZsb2F0IHNoaW5pbmVzcztcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxic2Rmcz5cXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+XFxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX21hcHM+XFxuI2luY2x1ZGUgPGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XFxuXFx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcXG5cXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+XFxuXFx0I2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxsaWdodHNfcGhvbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9iZWdpbj5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X21hcHM+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9lbmQ+XFxuXFx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XFxuXFx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cXG59XFxuXCI7XG5cbnZhciBtZXNocGhvbmdfdmVydCA9IFwiI2RlZmluZSBQSE9OR1xcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xcbiNlbmRpZlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgbWVzaHBoeXNpY2FsX2ZyYWcgPSBcIiNkZWZpbmUgUEhZU0lDQUxcXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XFxudW5pZm9ybSBmbG9hdCByb3VnaG5lc3M7XFxudW5pZm9ybSBmbG9hdCBtZXRhbG5lc3M7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNpZm5kZWYgU1RBTkRBUkRcXG5cXHR1bmlmb3JtIGZsb2F0IGNsZWFyQ29hdDtcXG5cXHR1bmlmb3JtIGZsb2F0IGNsZWFyQ29hdFJvdWdobmVzcztcXG4jZW5kaWZcXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxic2Rmcz5cXG4jaW5jbHVkZSA8Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfbWFwcz5cXG4jaW5jbHVkZSA8bGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XFxuXFx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHJvdWdobmVzc21hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWV0YWxuZXNzbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPlxcblxcdCNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfYmVnaW4+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPlxcblxcdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfZW5kPlxcblxcdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cXG5cXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Plxcbn1cXG5cIjtcblxudmFyIG1lc2hwaHlzaWNhbF92ZXJ0ID0gXCIjZGVmaW5lIFBIWVNJQ0FMXFxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xcbiNlbmRpZlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgbm9ybWFsX2ZyYWcgPSBcIiNkZWZpbmUgTk9STUFMXFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApXFxuXFx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2VuZGlmXFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggcGFja05vcm1hbFRvUkdCKCBub3JtYWwgKSwgb3BhY2l0eSApO1xcbn1cXG5cIjtcblxudmFyIG5vcm1hbF92ZXJ0ID0gXCIjZGVmaW5lIE5PUk1BTFxcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApXFxuXFx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2VuZGlmXFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZOb3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XFxuI2VuZGlmXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQIClcXG5cXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcXG4jZW5kaWZcXG59XFxuXCI7XG5cbnZhciBwb2ludHNfZnJhZyA9IFwidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHZlYzMoIDAuMCApO1xcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWFwX3BhcnRpY2xlX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxcblxcdG91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiO1xcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG59XFxuXCI7XG5cbnZhciBwb2ludHNfdmVydCA9IFwidW5pZm9ybSBmbG9hdCBzaXplO1xcbnVuaWZvcm0gZmxvYXQgc2NhbGU7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpZmRlZiBVU0VfU0laRUFUVEVOVUFUSU9OXFxuXFx0XFx0Z2xfUG9pbnRTaXplID0gc2l6ZSAqICggc2NhbGUgLyAtIG12UG9zaXRpb24ueiApO1xcblxcdCNlbHNlXFxuXFx0XFx0Z2xfUG9pbnRTaXplID0gc2l6ZTtcXG5cXHQjZW5kaWZcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgc2hhZG93X2ZyYWcgPSBcInVuaWZvcm0gdmVjMyBjb2xvcjtcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGJzZGZzPlxcbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNoYWRvd21hc2tfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggY29sb3IsIG9wYWNpdHkgKiAoIDEuMCAtIGdldFNoYWRvd01hc2soKSApICk7XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG59XFxuXCI7XG5cbnZhciBzaGFkb3dfdmVydCA9IFwiI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIFNoYWRlckNodW5rID0ge1xuXHRhbHBoYW1hcF9mcmFnbWVudDogYWxwaGFtYXBfZnJhZ21lbnQsXG5cdGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ6IGFscGhhbWFwX3BhcnNfZnJhZ21lbnQsXG5cdGFscGhhdGVzdF9mcmFnbWVudDogYWxwaGF0ZXN0X2ZyYWdtZW50LFxuXHRhb21hcF9mcmFnbWVudDogYW9tYXBfZnJhZ21lbnQsXG5cdGFvbWFwX3BhcnNfZnJhZ21lbnQ6IGFvbWFwX3BhcnNfZnJhZ21lbnQsXG5cdGJlZ2luX3ZlcnRleDogYmVnaW5fdmVydGV4LFxuXHRiZWdpbm5vcm1hbF92ZXJ0ZXg6IGJlZ2lubm9ybWFsX3ZlcnRleCxcblx0YnNkZnM6IGJzZGZzLFxuXHRidW1wbWFwX3BhcnNfZnJhZ21lbnQ6IGJ1bXBtYXBfcGFyc19mcmFnbWVudCxcblx0Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50OiBjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQsXG5cdGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50OiBjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudCxcblx0Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4OiBjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXgsXG5cdGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg6IGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXgsXG5cdGNvbG9yX2ZyYWdtZW50OiBjb2xvcl9mcmFnbWVudCxcblx0Y29sb3JfcGFyc19mcmFnbWVudDogY29sb3JfcGFyc19mcmFnbWVudCxcblx0Y29sb3JfcGFyc192ZXJ0ZXg6IGNvbG9yX3BhcnNfdmVydGV4LFxuXHRjb2xvcl92ZXJ0ZXg6IGNvbG9yX3ZlcnRleCxcblx0Y29tbW9uOiBjb21tb24sXG5cdGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudDogY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50LFxuXHRkZWZhdWx0bm9ybWFsX3ZlcnRleDogZGVmYXVsdG5vcm1hbF92ZXJ0ZXgsXG5cdGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleDogZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4LFxuXHRkaXNwbGFjZW1lbnRtYXBfdmVydGV4OiBkaXNwbGFjZW1lbnRtYXBfdmVydGV4LFxuXHRlbWlzc2l2ZW1hcF9mcmFnbWVudDogZW1pc3NpdmVtYXBfZnJhZ21lbnQsXG5cdGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ6IGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQsXG5cdGVuY29kaW5nc19mcmFnbWVudDogZW5jb2RpbmdzX2ZyYWdtZW50LFxuXHRlbmNvZGluZ3NfcGFyc19mcmFnbWVudDogZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQsXG5cdGVudm1hcF9mcmFnbWVudDogZW52bWFwX2ZyYWdtZW50LFxuXHRlbnZtYXBfcGFyc19mcmFnbWVudDogZW52bWFwX3BhcnNfZnJhZ21lbnQsXG5cdGVudm1hcF9wYXJzX3ZlcnRleDogZW52bWFwX3BhcnNfdmVydGV4LFxuXHRlbnZtYXBfdmVydGV4OiBlbnZtYXBfdmVydGV4LFxuXHRmb2dfdmVydGV4OiBmb2dfdmVydGV4LFxuXHRmb2dfcGFyc192ZXJ0ZXg6IGZvZ19wYXJzX3ZlcnRleCxcblx0Zm9nX2ZyYWdtZW50OiBmb2dfZnJhZ21lbnQsXG5cdGZvZ19wYXJzX2ZyYWdtZW50OiBmb2dfcGFyc19mcmFnbWVudCxcblx0Z3JhZGllbnRtYXBfcGFyc19mcmFnbWVudDogZ3JhZGllbnRtYXBfcGFyc19mcmFnbWVudCxcblx0bGlnaHRtYXBfZnJhZ21lbnQ6IGxpZ2h0bWFwX2ZyYWdtZW50LFxuXHRsaWdodG1hcF9wYXJzX2ZyYWdtZW50OiBsaWdodG1hcF9wYXJzX2ZyYWdtZW50LFxuXHRsaWdodHNfbGFtYmVydF92ZXJ0ZXg6IGxpZ2h0c19sYW1iZXJ0X3ZlcnRleCxcblx0bGlnaHRzX3BhcnNfYmVnaW46IGxpZ2h0c19wYXJzX2JlZ2luLFxuXHRsaWdodHNfcGFyc19tYXBzOiBsaWdodHNfcGFyc19tYXBzLFxuXHRsaWdodHNfcGhvbmdfZnJhZ21lbnQ6IGxpZ2h0c19waG9uZ19mcmFnbWVudCxcblx0bGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQ6IGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50LFxuXHRsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQ6IGxpZ2h0c19waHlzaWNhbF9mcmFnbWVudCxcblx0bGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ6IGxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50LFxuXHRsaWdodHNfZnJhZ21lbnRfYmVnaW46IGxpZ2h0c19mcmFnbWVudF9iZWdpbixcblx0bGlnaHRzX2ZyYWdtZW50X21hcHM6IGxpZ2h0c19mcmFnbWVudF9tYXBzLFxuXHRsaWdodHNfZnJhZ21lbnRfZW5kOiBsaWdodHNfZnJhZ21lbnRfZW5kLFxuXHRsb2dkZXB0aGJ1Zl9mcmFnbWVudDogbG9nZGVwdGhidWZfZnJhZ21lbnQsXG5cdGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ6IGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQsXG5cdGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4OiBsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleCxcblx0bG9nZGVwdGhidWZfdmVydGV4OiBsb2dkZXB0aGJ1Zl92ZXJ0ZXgsXG5cdG1hcF9mcmFnbWVudDogbWFwX2ZyYWdtZW50LFxuXHRtYXBfcGFyc19mcmFnbWVudDogbWFwX3BhcnNfZnJhZ21lbnQsXG5cdG1hcF9wYXJ0aWNsZV9mcmFnbWVudDogbWFwX3BhcnRpY2xlX2ZyYWdtZW50LFxuXHRtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudDogbWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQsXG5cdG1ldGFsbmVzc21hcF9mcmFnbWVudDogbWV0YWxuZXNzbWFwX2ZyYWdtZW50LFxuXHRtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudDogbWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQsXG5cdG1vcnBobm9ybWFsX3ZlcnRleDogbW9ycGhub3JtYWxfdmVydGV4LFxuXHRtb3JwaHRhcmdldF9wYXJzX3ZlcnRleDogbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXgsXG5cdG1vcnBodGFyZ2V0X3ZlcnRleDogbW9ycGh0YXJnZXRfdmVydGV4LFxuXHRub3JtYWxfZnJhZ21lbnRfYmVnaW46IG5vcm1hbF9mcmFnbWVudF9iZWdpbixcblx0bm9ybWFsX2ZyYWdtZW50X21hcHM6IG5vcm1hbF9mcmFnbWVudF9tYXBzLFxuXHRub3JtYWxtYXBfcGFyc19mcmFnbWVudDogbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQsXG5cdHBhY2tpbmc6IHBhY2tpbmcsXG5cdHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ6IHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQsXG5cdHByb2plY3RfdmVydGV4OiBwcm9qZWN0X3ZlcnRleCxcblx0ZGl0aGVyaW5nX2ZyYWdtZW50OiBkaXRoZXJpbmdfZnJhZ21lbnQsXG5cdGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50OiBkaXRoZXJpbmdfcGFyc19mcmFnbWVudCxcblx0cm91Z2huZXNzbWFwX2ZyYWdtZW50OiByb3VnaG5lc3NtYXBfZnJhZ21lbnQsXG5cdHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50OiByb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudCxcblx0c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ6IHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50LFxuXHRzaGFkb3dtYXBfcGFyc192ZXJ0ZXg6IHNoYWRvd21hcF9wYXJzX3ZlcnRleCxcblx0c2hhZG93bWFwX3ZlcnRleDogc2hhZG93bWFwX3ZlcnRleCxcblx0c2hhZG93bWFza19wYXJzX2ZyYWdtZW50OiBzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQsXG5cdHNraW5iYXNlX3ZlcnRleDogc2tpbmJhc2VfdmVydGV4LFxuXHRza2lubmluZ19wYXJzX3ZlcnRleDogc2tpbm5pbmdfcGFyc192ZXJ0ZXgsXG5cdHNraW5uaW5nX3ZlcnRleDogc2tpbm5pbmdfdmVydGV4LFxuXHRza2lubm9ybWFsX3ZlcnRleDogc2tpbm5vcm1hbF92ZXJ0ZXgsXG5cdHNwZWN1bGFybWFwX2ZyYWdtZW50OiBzcGVjdWxhcm1hcF9mcmFnbWVudCxcblx0c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudDogc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudCxcblx0dG9uZW1hcHBpbmdfZnJhZ21lbnQ6IHRvbmVtYXBwaW5nX2ZyYWdtZW50LFxuXHR0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50OiB0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50LFxuXHR1dl9wYXJzX2ZyYWdtZW50OiB1dl9wYXJzX2ZyYWdtZW50LFxuXHR1dl9wYXJzX3ZlcnRleDogdXZfcGFyc192ZXJ0ZXgsXG5cdHV2X3ZlcnRleDogdXZfdmVydGV4LFxuXHR1djJfcGFyc19mcmFnbWVudDogdXYyX3BhcnNfZnJhZ21lbnQsXG5cdHV2Ml9wYXJzX3ZlcnRleDogdXYyX3BhcnNfdmVydGV4LFxuXHR1djJfdmVydGV4OiB1djJfdmVydGV4LFxuXHR3b3JsZHBvc192ZXJ0ZXg6IHdvcmxkcG9zX3ZlcnRleCxcblxuXHRjdWJlX2ZyYWc6IGN1YmVfZnJhZyxcblx0Y3ViZV92ZXJ0OiBjdWJlX3ZlcnQsXG5cdGRlcHRoX2ZyYWc6IGRlcHRoX2ZyYWcsXG5cdGRlcHRoX3ZlcnQ6IGRlcHRoX3ZlcnQsXG5cdGRpc3RhbmNlUkdCQV9mcmFnOiBkaXN0YW5jZVJHQkFfZnJhZyxcblx0ZGlzdGFuY2VSR0JBX3ZlcnQ6IGRpc3RhbmNlUkdCQV92ZXJ0LFxuXHRlcXVpcmVjdF9mcmFnOiBlcXVpcmVjdF9mcmFnLFxuXHRlcXVpcmVjdF92ZXJ0OiBlcXVpcmVjdF92ZXJ0LFxuXHRsaW5lZGFzaGVkX2ZyYWc6IGxpbmVkYXNoZWRfZnJhZyxcblx0bGluZWRhc2hlZF92ZXJ0OiBsaW5lZGFzaGVkX3ZlcnQsXG5cdG1lc2hiYXNpY19mcmFnOiBtZXNoYmFzaWNfZnJhZyxcblx0bWVzaGJhc2ljX3ZlcnQ6IG1lc2hiYXNpY192ZXJ0LFxuXHRtZXNobGFtYmVydF9mcmFnOiBtZXNobGFtYmVydF9mcmFnLFxuXHRtZXNobGFtYmVydF92ZXJ0OiBtZXNobGFtYmVydF92ZXJ0LFxuXHRtZXNocGhvbmdfZnJhZzogbWVzaHBob25nX2ZyYWcsXG5cdG1lc2hwaG9uZ192ZXJ0OiBtZXNocGhvbmdfdmVydCxcblx0bWVzaHBoeXNpY2FsX2ZyYWc6IG1lc2hwaHlzaWNhbF9mcmFnLFxuXHRtZXNocGh5c2ljYWxfdmVydDogbWVzaHBoeXNpY2FsX3ZlcnQsXG5cdG5vcm1hbF9mcmFnOiBub3JtYWxfZnJhZyxcblx0bm9ybWFsX3ZlcnQ6IG5vcm1hbF92ZXJ0LFxuXHRwb2ludHNfZnJhZzogcG9pbnRzX2ZyYWcsXG5cdHBvaW50c192ZXJ0OiBwb2ludHNfdmVydCxcblx0c2hhZG93X2ZyYWc6IHNoYWRvd19mcmFnLFxuXHRzaGFkb3dfdmVydDogc2hhZG93X3ZlcnRcbn07XG5cbi8qKlxuICogVW5pZm9ybSBVdGlsaXRpZXNcbiAqL1xuXG52YXIgVW5pZm9ybXNVdGlscyA9IHtcblxuXHRtZXJnZTogZnVuY3Rpb24gKCB1bmlmb3JtcyApIHtcblxuXHRcdHZhciBtZXJnZWQgPSB7fTtcblxuXHRcdGZvciAoIHZhciB1ID0gMDsgdSA8IHVuaWZvcm1zLmxlbmd0aDsgdSArKyApIHtcblxuXHRcdFx0dmFyIHRtcCA9IHRoaXMuY2xvbmUoIHVuaWZvcm1zWyB1IF0gKTtcblxuXHRcdFx0Zm9yICggdmFyIHAgaW4gdG1wICkge1xuXG5cdFx0XHRcdG1lcmdlZFsgcCBdID0gdG1wWyBwIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBtZXJnZWQ7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCB1bmlmb3Jtc19zcmMgKSB7XG5cblx0XHR2YXIgdW5pZm9ybXNfZHN0ID0ge307XG5cblx0XHRmb3IgKCB2YXIgdSBpbiB1bmlmb3Jtc19zcmMgKSB7XG5cblx0XHRcdHVuaWZvcm1zX2RzdFsgdSBdID0ge307XG5cblx0XHRcdGZvciAoIHZhciBwIGluIHVuaWZvcm1zX3NyY1sgdSBdICkge1xuXG5cdFx0XHRcdHZhciBwYXJhbWV0ZXJfc3JjID0gdW5pZm9ybXNfc3JjWyB1IF1bIHAgXTtcblxuXHRcdFx0XHRpZiAoIHBhcmFtZXRlcl9zcmMgJiYgKCBwYXJhbWV0ZXJfc3JjLmlzQ29sb3IgfHxcblx0XHRcdFx0XHRwYXJhbWV0ZXJfc3JjLmlzTWF0cml4MyB8fCBwYXJhbWV0ZXJfc3JjLmlzTWF0cml4NCB8fFxuXHRcdFx0XHRcdHBhcmFtZXRlcl9zcmMuaXNWZWN0b3IyIHx8IHBhcmFtZXRlcl9zcmMuaXNWZWN0b3IzIHx8IHBhcmFtZXRlcl9zcmMuaXNWZWN0b3I0IHx8XG5cdFx0XHRcdFx0cGFyYW1ldGVyX3NyYy5pc1RleHR1cmUgKSApIHtcblxuXHRcdFx0XHRcdHVuaWZvcm1zX2RzdFsgdSBdWyBwIF0gPSBwYXJhbWV0ZXJfc3JjLmNsb25lKCk7XG5cblx0XHRcdFx0fSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggcGFyYW1ldGVyX3NyYyApICkge1xuXG5cdFx0XHRcdFx0dW5pZm9ybXNfZHN0WyB1IF1bIHAgXSA9IHBhcmFtZXRlcl9zcmMuc2xpY2UoKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dW5pZm9ybXNfZHN0WyB1IF1bIHAgXSA9IHBhcmFtZXRlcl9zcmM7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdW5pZm9ybXNfZHN0O1xuXG5cdH1cblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbnZhciBDb2xvcktleXdvcmRzID0geyAnYWxpY2VibHVlJzogMHhGMEY4RkYsICdhbnRpcXVld2hpdGUnOiAweEZBRUJENywgJ2FxdWEnOiAweDAwRkZGRiwgJ2FxdWFtYXJpbmUnOiAweDdGRkZENCwgJ2F6dXJlJzogMHhGMEZGRkYsXG5cdCdiZWlnZSc6IDB4RjVGNURDLCAnYmlzcXVlJzogMHhGRkU0QzQsICdibGFjayc6IDB4MDAwMDAwLCAnYmxhbmNoZWRhbG1vbmQnOiAweEZGRUJDRCwgJ2JsdWUnOiAweDAwMDBGRiwgJ2JsdWV2aW9sZXQnOiAweDhBMkJFMixcblx0J2Jyb3duJzogMHhBNTJBMkEsICdidXJseXdvb2QnOiAweERFQjg4NywgJ2NhZGV0Ymx1ZSc6IDB4NUY5RUEwLCAnY2hhcnRyZXVzZSc6IDB4N0ZGRjAwLCAnY2hvY29sYXRlJzogMHhEMjY5MUUsICdjb3JhbCc6IDB4RkY3RjUwLFxuXHQnY29ybmZsb3dlcmJsdWUnOiAweDY0OTVFRCwgJ2Nvcm5zaWxrJzogMHhGRkY4REMsICdjcmltc29uJzogMHhEQzE0M0MsICdjeWFuJzogMHgwMEZGRkYsICdkYXJrYmx1ZSc6IDB4MDAwMDhCLCAnZGFya2N5YW4nOiAweDAwOEI4Qixcblx0J2Rhcmtnb2xkZW5yb2QnOiAweEI4ODYwQiwgJ2RhcmtncmF5JzogMHhBOUE5QTksICdkYXJrZ3JlZW4nOiAweDAwNjQwMCwgJ2RhcmtncmV5JzogMHhBOUE5QTksICdkYXJra2hha2knOiAweEJEQjc2QiwgJ2RhcmttYWdlbnRhJzogMHg4QjAwOEIsXG5cdCdkYXJrb2xpdmVncmVlbic6IDB4NTU2QjJGLCAnZGFya29yYW5nZSc6IDB4RkY4QzAwLCAnZGFya29yY2hpZCc6IDB4OTkzMkNDLCAnZGFya3JlZCc6IDB4OEIwMDAwLCAnZGFya3NhbG1vbic6IDB4RTk5NjdBLCAnZGFya3NlYWdyZWVuJzogMHg4RkJDOEYsXG5cdCdkYXJrc2xhdGVibHVlJzogMHg0ODNEOEIsICdkYXJrc2xhdGVncmF5JzogMHgyRjRGNEYsICdkYXJrc2xhdGVncmV5JzogMHgyRjRGNEYsICdkYXJrdHVycXVvaXNlJzogMHgwMENFRDEsICdkYXJrdmlvbGV0JzogMHg5NDAwRDMsXG5cdCdkZWVwcGluayc6IDB4RkYxNDkzLCAnZGVlcHNreWJsdWUnOiAweDAwQkZGRiwgJ2RpbWdyYXknOiAweDY5Njk2OSwgJ2RpbWdyZXknOiAweDY5Njk2OSwgJ2RvZGdlcmJsdWUnOiAweDFFOTBGRiwgJ2ZpcmVicmljayc6IDB4QjIyMjIyLFxuXHQnZmxvcmFsd2hpdGUnOiAweEZGRkFGMCwgJ2ZvcmVzdGdyZWVuJzogMHgyMjhCMjIsICdmdWNoc2lhJzogMHhGRjAwRkYsICdnYWluc2Jvcm8nOiAweERDRENEQywgJ2dob3N0d2hpdGUnOiAweEY4RjhGRiwgJ2dvbGQnOiAweEZGRDcwMCxcblx0J2dvbGRlbnJvZCc6IDB4REFBNTIwLCAnZ3JheSc6IDB4ODA4MDgwLCAnZ3JlZW4nOiAweDAwODAwMCwgJ2dyZWVueWVsbG93JzogMHhBREZGMkYsICdncmV5JzogMHg4MDgwODAsICdob25leWRldyc6IDB4RjBGRkYwLCAnaG90cGluayc6IDB4RkY2OUI0LFxuXHQnaW5kaWFucmVkJzogMHhDRDVDNUMsICdpbmRpZ28nOiAweDRCMDA4MiwgJ2l2b3J5JzogMHhGRkZGRjAsICdraGFraSc6IDB4RjBFNjhDLCAnbGF2ZW5kZXInOiAweEU2RTZGQSwgJ2xhdmVuZGVyYmx1c2gnOiAweEZGRjBGNSwgJ2xhd25ncmVlbic6IDB4N0NGQzAwLFxuXHQnbGVtb25jaGlmZm9uJzogMHhGRkZBQ0QsICdsaWdodGJsdWUnOiAweEFERDhFNiwgJ2xpZ2h0Y29yYWwnOiAweEYwODA4MCwgJ2xpZ2h0Y3lhbic6IDB4RTBGRkZGLCAnbGlnaHRnb2xkZW5yb2R5ZWxsb3cnOiAweEZBRkFEMiwgJ2xpZ2h0Z3JheSc6IDB4RDNEM0QzLFxuXHQnbGlnaHRncmVlbic6IDB4OTBFRTkwLCAnbGlnaHRncmV5JzogMHhEM0QzRDMsICdsaWdodHBpbmsnOiAweEZGQjZDMSwgJ2xpZ2h0c2FsbW9uJzogMHhGRkEwN0EsICdsaWdodHNlYWdyZWVuJzogMHgyMEIyQUEsICdsaWdodHNreWJsdWUnOiAweDg3Q0VGQSxcblx0J2xpZ2h0c2xhdGVncmF5JzogMHg3Nzg4OTksICdsaWdodHNsYXRlZ3JleSc6IDB4Nzc4ODk5LCAnbGlnaHRzdGVlbGJsdWUnOiAweEIwQzRERSwgJ2xpZ2h0eWVsbG93JzogMHhGRkZGRTAsICdsaW1lJzogMHgwMEZGMDAsICdsaW1lZ3JlZW4nOiAweDMyQ0QzMixcblx0J2xpbmVuJzogMHhGQUYwRTYsICdtYWdlbnRhJzogMHhGRjAwRkYsICdtYXJvb24nOiAweDgwMDAwMCwgJ21lZGl1bWFxdWFtYXJpbmUnOiAweDY2Q0RBQSwgJ21lZGl1bWJsdWUnOiAweDAwMDBDRCwgJ21lZGl1bW9yY2hpZCc6IDB4QkE1NUQzLFxuXHQnbWVkaXVtcHVycGxlJzogMHg5MzcwREIsICdtZWRpdW1zZWFncmVlbic6IDB4M0NCMzcxLCAnbWVkaXVtc2xhdGVibHVlJzogMHg3QjY4RUUsICdtZWRpdW1zcHJpbmdncmVlbic6IDB4MDBGQTlBLCAnbWVkaXVtdHVycXVvaXNlJzogMHg0OEQxQ0MsXG5cdCdtZWRpdW12aW9sZXRyZWQnOiAweEM3MTU4NSwgJ21pZG5pZ2h0Ymx1ZSc6IDB4MTkxOTcwLCAnbWludGNyZWFtJzogMHhGNUZGRkEsICdtaXN0eXJvc2UnOiAweEZGRTRFMSwgJ21vY2Nhc2luJzogMHhGRkU0QjUsICduYXZham93aGl0ZSc6IDB4RkZERUFELFxuXHQnbmF2eSc6IDB4MDAwMDgwLCAnb2xkbGFjZSc6IDB4RkRGNUU2LCAnb2xpdmUnOiAweDgwODAwMCwgJ29saXZlZHJhYic6IDB4NkI4RTIzLCAnb3JhbmdlJzogMHhGRkE1MDAsICdvcmFuZ2VyZWQnOiAweEZGNDUwMCwgJ29yY2hpZCc6IDB4REE3MEQ2LFxuXHQncGFsZWdvbGRlbnJvZCc6IDB4RUVFOEFBLCAncGFsZWdyZWVuJzogMHg5OEZCOTgsICdwYWxldHVycXVvaXNlJzogMHhBRkVFRUUsICdwYWxldmlvbGV0cmVkJzogMHhEQjcwOTMsICdwYXBheWF3aGlwJzogMHhGRkVGRDUsICdwZWFjaHB1ZmYnOiAweEZGREFCOSxcblx0J3BlcnUnOiAweENEODUzRiwgJ3BpbmsnOiAweEZGQzBDQiwgJ3BsdW0nOiAweEREQTBERCwgJ3Bvd2RlcmJsdWUnOiAweEIwRTBFNiwgJ3B1cnBsZSc6IDB4ODAwMDgwLCAncmViZWNjYXB1cnBsZSc6IDB4NjYzMzk5LCAncmVkJzogMHhGRjAwMDAsICdyb3N5YnJvd24nOiAweEJDOEY4Rixcblx0J3JveWFsYmx1ZSc6IDB4NDE2OUUxLCAnc2FkZGxlYnJvd24nOiAweDhCNDUxMywgJ3NhbG1vbic6IDB4RkE4MDcyLCAnc2FuZHlicm93bic6IDB4RjRBNDYwLCAnc2VhZ3JlZW4nOiAweDJFOEI1NywgJ3NlYXNoZWxsJzogMHhGRkY1RUUsXG5cdCdzaWVubmEnOiAweEEwNTIyRCwgJ3NpbHZlcic6IDB4QzBDMEMwLCAnc2t5Ymx1ZSc6IDB4ODdDRUVCLCAnc2xhdGVibHVlJzogMHg2QTVBQ0QsICdzbGF0ZWdyYXknOiAweDcwODA5MCwgJ3NsYXRlZ3JleSc6IDB4NzA4MDkwLCAnc25vdyc6IDB4RkZGQUZBLFxuXHQnc3ByaW5nZ3JlZW4nOiAweDAwRkY3RiwgJ3N0ZWVsYmx1ZSc6IDB4NDY4MkI0LCAndGFuJzogMHhEMkI0OEMsICd0ZWFsJzogMHgwMDgwODAsICd0aGlzdGxlJzogMHhEOEJGRDgsICd0b21hdG8nOiAweEZGNjM0NywgJ3R1cnF1b2lzZSc6IDB4NDBFMEQwLFxuXHQndmlvbGV0JzogMHhFRTgyRUUsICd3aGVhdCc6IDB4RjVERUIzLCAnd2hpdGUnOiAweEZGRkZGRiwgJ3doaXRlc21va2UnOiAweEY1RjVGNSwgJ3llbGxvdyc6IDB4RkZGRjAwLCAneWVsbG93Z3JlZW4nOiAweDlBQ0QzMiB9O1xuXG5mdW5jdGlvbiBDb2xvciggciwgZywgYiApIHtcblxuXHRpZiAoIGcgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHQvLyByIGlzIFRIUkVFLkNvbG9yLCBoZXggb3Igc3RyaW5nXG5cdFx0cmV0dXJuIHRoaXMuc2V0KCByICk7XG5cblx0fVxuXG5cdHJldHVybiB0aGlzLnNldFJHQiggciwgZywgYiApO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIENvbG9yLnByb3RvdHlwZSwge1xuXG5cdGlzQ29sb3I6IHRydWUsXG5cblx0cjogMSwgZzogMSwgYjogMSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHZhbHVlICYmIHZhbHVlLmlzQ29sb3IgKSB7XG5cblx0XHRcdHRoaXMuY29weSggdmFsdWUgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgKSB7XG5cblx0XHRcdHRoaXMuc2V0SGV4KCB2YWx1ZSApO1xuXG5cdFx0fSBlbHNlIGlmICggdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyApIHtcblxuXHRcdFx0dGhpcy5zZXRTdHlsZSggdmFsdWUgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMuciA9IHNjYWxhcjtcblx0XHR0aGlzLmcgPSBzY2FsYXI7XG5cdFx0dGhpcy5iID0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRIZXg6IGZ1bmN0aW9uICggaGV4ICkge1xuXG5cdFx0aGV4ID0gTWF0aC5mbG9vciggaGV4ICk7XG5cblx0XHR0aGlzLnIgPSAoIGhleCA+PiAxNiAmIDI1NSApIC8gMjU1O1xuXHRcdHRoaXMuZyA9ICggaGV4ID4+IDggJiAyNTUgKSAvIDI1NTtcblx0XHR0aGlzLmIgPSAoIGhleCAmIDI1NSApIC8gMjU1O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRSR0I6IGZ1bmN0aW9uICggciwgZywgYiApIHtcblxuXHRcdHRoaXMuciA9IHI7XG5cdFx0dGhpcy5nID0gZztcblx0XHR0aGlzLmIgPSBiO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRIU0w6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGZ1bmN0aW9uIGh1ZTJyZ2IoIHAsIHEsIHQgKSB7XG5cblx0XHRcdGlmICggdCA8IDAgKSB0ICs9IDE7XG5cdFx0XHRpZiAoIHQgPiAxICkgdCAtPSAxO1xuXHRcdFx0aWYgKCB0IDwgMSAvIDYgKSByZXR1cm4gcCArICggcSAtIHAgKSAqIDYgKiB0O1xuXHRcdFx0aWYgKCB0IDwgMSAvIDIgKSByZXR1cm4gcTtcblx0XHRcdGlmICggdCA8IDIgLyAzICkgcmV0dXJuIHAgKyAoIHEgLSBwICkgKiA2ICogKCAyIC8gMyAtIHQgKTtcblx0XHRcdHJldHVybiBwO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldEhTTCggaCwgcywgbCApIHtcblxuXHRcdFx0Ly8gaCxzLGwgcmFuZ2VzIGFyZSBpbiAwLjAgLSAxLjBcblx0XHRcdGggPSBfTWF0aC5ldWNsaWRlYW5Nb2R1bG8oIGgsIDEgKTtcblx0XHRcdHMgPSBfTWF0aC5jbGFtcCggcywgMCwgMSApO1xuXHRcdFx0bCA9IF9NYXRoLmNsYW1wKCBsLCAwLCAxICk7XG5cblx0XHRcdGlmICggcyA9PT0gMCApIHtcblxuXHRcdFx0XHR0aGlzLnIgPSB0aGlzLmcgPSB0aGlzLmIgPSBsO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZhciBwID0gbCA8PSAwLjUgPyBsICogKCAxICsgcyApIDogbCArIHMgLSAoIGwgKiBzICk7XG5cdFx0XHRcdHZhciBxID0gKCAyICogbCApIC0gcDtcblxuXHRcdFx0XHR0aGlzLnIgPSBodWUycmdiKCBxLCBwLCBoICsgMSAvIDMgKTtcblx0XHRcdFx0dGhpcy5nID0gaHVlMnJnYiggcSwgcCwgaCApO1xuXHRcdFx0XHR0aGlzLmIgPSBodWUycmdiKCBxLCBwLCBoIC0gMSAvIDMgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHNldFN0eWxlOiBmdW5jdGlvbiAoIHN0eWxlICkge1xuXG5cdFx0ZnVuY3Rpb24gaGFuZGxlQWxwaGEoIHN0cmluZyApIHtcblxuXHRcdFx0aWYgKCBzdHJpbmcgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdFx0aWYgKCBwYXJzZUZsb2F0KCBzdHJpbmcgKSA8IDEgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ29sb3I6IEFscGhhIGNvbXBvbmVudCBvZiAnICsgc3R5bGUgKyAnIHdpbGwgYmUgaWdub3JlZC4nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXG5cdFx0dmFyIG07XG5cblx0XHRpZiAoIG0gPSAvXigoPzpyZ2J8aHNsKWE/KVxcKFxccyooW15cXCldKilcXCkvLmV4ZWMoIHN0eWxlICkgKSB7XG5cblx0XHRcdC8vIHJnYiAvIGhzbFxuXG5cdFx0XHR2YXIgY29sb3I7XG5cdFx0XHR2YXIgbmFtZSA9IG1bIDEgXTtcblx0XHRcdHZhciBjb21wb25lbnRzID0gbVsgMiBdO1xuXG5cdFx0XHRzd2l0Y2ggKCBuYW1lICkge1xuXG5cdFx0XHRcdGNhc2UgJ3JnYic6XG5cdFx0XHRcdGNhc2UgJ3JnYmEnOlxuXG5cdFx0XHRcdFx0aWYgKCBjb2xvciA9IC9eKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKigsXFxzKihbMC05XSpcXC4/WzAtOV0rKVxccyopPyQvLmV4ZWMoIGNvbXBvbmVudHMgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmdiKDI1NSwwLDApIHJnYmEoMjU1LDAsMCwwLjUpXG5cdFx0XHRcdFx0XHR0aGlzLnIgPSBNYXRoLm1pbiggMjU1LCBwYXJzZUludCggY29sb3JbIDEgXSwgMTAgKSApIC8gMjU1O1xuXHRcdFx0XHRcdFx0dGhpcy5nID0gTWF0aC5taW4oIDI1NSwgcGFyc2VJbnQoIGNvbG9yWyAyIF0sIDEwICkgKSAvIDI1NTtcblx0XHRcdFx0XHRcdHRoaXMuYiA9IE1hdGgubWluKCAyNTUsIHBhcnNlSW50KCBjb2xvclsgMyBdLCAxMCApICkgLyAyNTU7XG5cblx0XHRcdFx0XHRcdGhhbmRsZUFscGhhKCBjb2xvclsgNSBdICk7XG5cblx0XHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCBjb2xvciA9IC9eKFxcZCspXFwlXFxzKixcXHMqKFxcZCspXFwlXFxzKixcXHMqKFxcZCspXFwlXFxzKigsXFxzKihbMC05XSpcXC4/WzAtOV0rKVxccyopPyQvLmV4ZWMoIGNvbXBvbmVudHMgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmdiKDEwMCUsMCUsMCUpIHJnYmEoMTAwJSwwJSwwJSwwLjUpXG5cdFx0XHRcdFx0XHR0aGlzLnIgPSBNYXRoLm1pbiggMTAwLCBwYXJzZUludCggY29sb3JbIDEgXSwgMTAgKSApIC8gMTAwO1xuXHRcdFx0XHRcdFx0dGhpcy5nID0gTWF0aC5taW4oIDEwMCwgcGFyc2VJbnQoIGNvbG9yWyAyIF0sIDEwICkgKSAvIDEwMDtcblx0XHRcdFx0XHRcdHRoaXMuYiA9IE1hdGgubWluKCAxMDAsIHBhcnNlSW50KCBjb2xvclsgMyBdLCAxMCApICkgLyAxMDA7XG5cblx0XHRcdFx0XHRcdGhhbmRsZUFscGhhKCBjb2xvclsgNSBdICk7XG5cblx0XHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnaHNsJzpcblx0XHRcdFx0Y2FzZSAnaHNsYSc6XG5cblx0XHRcdFx0XHRpZiAoIGNvbG9yID0gL14oWzAtOV0qXFwuP1swLTldKylcXHMqLFxccyooXFxkKylcXCVcXHMqLFxccyooXFxkKylcXCVcXHMqKCxcXHMqKFswLTldKlxcLj9bMC05XSspXFxzKik/JC8uZXhlYyggY29tcG9uZW50cyApICkge1xuXG5cdFx0XHRcdFx0XHQvLyBoc2woMTIwLDUwJSw1MCUpIGhzbGEoMTIwLDUwJSw1MCUsMC41KVxuXHRcdFx0XHRcdFx0dmFyIGggPSBwYXJzZUZsb2F0KCBjb2xvclsgMSBdICkgLyAzNjA7XG5cdFx0XHRcdFx0XHR2YXIgcyA9IHBhcnNlSW50KCBjb2xvclsgMiBdLCAxMCApIC8gMTAwO1xuXHRcdFx0XHRcdFx0dmFyIGwgPSBwYXJzZUludCggY29sb3JbIDMgXSwgMTAgKSAvIDEwMDtcblxuXHRcdFx0XHRcdFx0aGFuZGxlQWxwaGEoIGNvbG9yWyA1IF0gKTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0SFNMKCBoLCBzLCBsICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggbSA9IC9eXFwjKFtBLUZhLWYwLTldKykkLy5leGVjKCBzdHlsZSApICkge1xuXG5cdFx0XHQvLyBoZXggY29sb3JcblxuXHRcdFx0dmFyIGhleCA9IG1bIDEgXTtcblx0XHRcdHZhciBzaXplID0gaGV4Lmxlbmd0aDtcblxuXHRcdFx0aWYgKCBzaXplID09PSAzICkge1xuXG5cdFx0XHRcdC8vICNmZjBcblx0XHRcdFx0dGhpcy5yID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDAgKSArIGhleC5jaGFyQXQoIDAgKSwgMTYgKSAvIDI1NTtcblx0XHRcdFx0dGhpcy5nID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDEgKSArIGhleC5jaGFyQXQoIDEgKSwgMTYgKSAvIDI1NTtcblx0XHRcdFx0dGhpcy5iID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDIgKSArIGhleC5jaGFyQXQoIDIgKSwgMTYgKSAvIDI1NTtcblxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdFx0fSBlbHNlIGlmICggc2l6ZSA9PT0gNiApIHtcblxuXHRcdFx0XHQvLyAjZmYwMDAwXG5cdFx0XHRcdHRoaXMuciA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAwICkgKyBoZXguY2hhckF0KCAxICksIDE2ICkgLyAyNTU7XG5cdFx0XHRcdHRoaXMuZyA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAyICkgKyBoZXguY2hhckF0KCAzICksIDE2ICkgLyAyNTU7XG5cdFx0XHRcdHRoaXMuYiA9IHBhcnNlSW50KCBoZXguY2hhckF0KCA0ICkgKyBoZXguY2hhckF0KCA1ICksIDE2ICkgLyAyNTU7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggc3R5bGUgJiYgc3R5bGUubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0Ly8gY29sb3Iga2V5d29yZHNcblx0XHRcdHZhciBoZXggPSBDb2xvcktleXdvcmRzWyBzdHlsZSBdO1xuXG5cdFx0XHRpZiAoIGhleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIHJlZFxuXHRcdFx0XHR0aGlzLnNldEhleCggaGV4ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gdW5rbm93biBjb2xvclxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Db2xvcjogVW5rbm93biBjb2xvciAnICsgc3R5bGUgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLnIsIHRoaXMuZywgdGhpcy5iICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIGNvbG9yICkge1xuXG5cdFx0dGhpcy5yID0gY29sb3Iucjtcblx0XHR0aGlzLmcgPSBjb2xvci5nO1xuXHRcdHRoaXMuYiA9IGNvbG9yLmI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlHYW1tYVRvTGluZWFyOiBmdW5jdGlvbiAoIGNvbG9yLCBnYW1tYUZhY3RvciApIHtcblxuXHRcdGlmICggZ2FtbWFGYWN0b3IgPT09IHVuZGVmaW5lZCApIGdhbW1hRmFjdG9yID0gMi4wO1xuXG5cdFx0dGhpcy5yID0gTWF0aC5wb3coIGNvbG9yLnIsIGdhbW1hRmFjdG9yICk7XG5cdFx0dGhpcy5nID0gTWF0aC5wb3coIGNvbG9yLmcsIGdhbW1hRmFjdG9yICk7XG5cdFx0dGhpcy5iID0gTWF0aC5wb3coIGNvbG9yLmIsIGdhbW1hRmFjdG9yICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlMaW5lYXJUb0dhbW1hOiBmdW5jdGlvbiAoIGNvbG9yLCBnYW1tYUZhY3RvciApIHtcblxuXHRcdGlmICggZ2FtbWFGYWN0b3IgPT09IHVuZGVmaW5lZCApIGdhbW1hRmFjdG9yID0gMi4wO1xuXG5cdFx0dmFyIHNhZmVJbnZlcnNlID0gKCBnYW1tYUZhY3RvciA+IDAgKSA/ICggMS4wIC8gZ2FtbWFGYWN0b3IgKSA6IDEuMDtcblxuXHRcdHRoaXMuciA9IE1hdGgucG93KCBjb2xvci5yLCBzYWZlSW52ZXJzZSApO1xuXHRcdHRoaXMuZyA9IE1hdGgucG93KCBjb2xvci5nLCBzYWZlSW52ZXJzZSApO1xuXHRcdHRoaXMuYiA9IE1hdGgucG93KCBjb2xvci5iLCBzYWZlSW52ZXJzZSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb252ZXJ0R2FtbWFUb0xpbmVhcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHIgPSB0aGlzLnIsIGcgPSB0aGlzLmcsIGIgPSB0aGlzLmI7XG5cblx0XHR0aGlzLnIgPSByICogcjtcblx0XHR0aGlzLmcgPSBnICogZztcblx0XHR0aGlzLmIgPSBiICogYjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29udmVydExpbmVhclRvR2FtbWE6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuciA9IE1hdGguc3FydCggdGhpcy5yICk7XG5cdFx0dGhpcy5nID0gTWF0aC5zcXJ0KCB0aGlzLmcgKTtcblx0XHR0aGlzLmIgPSBNYXRoLnNxcnQoIHRoaXMuYiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRIZXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiAoIHRoaXMuciAqIDI1NSApIDw8IDE2IF4gKCB0aGlzLmcgKiAyNTUgKSA8PCA4IF4gKCB0aGlzLmIgKiAyNTUgKSA8PCAwO1xuXG5cdH0sXG5cblx0Z2V0SGV4U3RyaW5nOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gKCAnMDAwMDAwJyArIHRoaXMuZ2V0SGV4KCkudG9TdHJpbmcoIDE2ICkgKS5zbGljZSggLSA2ICk7XG5cblx0fSxcblxuXHRnZXRIU0w6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0Ly8gaCxzLGwgcmFuZ2VzIGFyZSBpbiAwLjAgLSAxLjBcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkNvbG9yOiAuZ2V0SFNMKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IHsgaDogMCwgczogMCwgbDogMCB9O1xuXG5cdFx0fVxuXG5cdFx0dmFyIHIgPSB0aGlzLnIsIGcgPSB0aGlzLmcsIGIgPSB0aGlzLmI7XG5cblx0XHR2YXIgbWF4ID0gTWF0aC5tYXgoIHIsIGcsIGIgKTtcblx0XHR2YXIgbWluID0gTWF0aC5taW4oIHIsIGcsIGIgKTtcblxuXHRcdHZhciBodWUsIHNhdHVyYXRpb247XG5cdFx0dmFyIGxpZ2h0bmVzcyA9ICggbWluICsgbWF4ICkgLyAyLjA7XG5cblx0XHRpZiAoIG1pbiA9PT0gbWF4ICkge1xuXG5cdFx0XHRodWUgPSAwO1xuXHRcdFx0c2F0dXJhdGlvbiA9IDA7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgZGVsdGEgPSBtYXggLSBtaW47XG5cblx0XHRcdHNhdHVyYXRpb24gPSBsaWdodG5lc3MgPD0gMC41ID8gZGVsdGEgLyAoIG1heCArIG1pbiApIDogZGVsdGEgLyAoIDIgLSBtYXggLSBtaW4gKTtcblxuXHRcdFx0c3dpdGNoICggbWF4ICkge1xuXG5cdFx0XHRcdGNhc2UgcjogaHVlID0gKCBnIC0gYiApIC8gZGVsdGEgKyAoIGcgPCBiID8gNiA6IDAgKTsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgZzogaHVlID0gKCBiIC0gciApIC8gZGVsdGEgKyAyOyBicmVhaztcblx0XHRcdFx0Y2FzZSBiOiBodWUgPSAoIHIgLSBnICkgLyBkZWx0YSArIDQ7IGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHRcdGh1ZSAvPSA2O1xuXG5cdFx0fVxuXG5cdFx0dGFyZ2V0LmggPSBodWU7XG5cdFx0dGFyZ2V0LnMgPSBzYXR1cmF0aW9uO1xuXHRcdHRhcmdldC5sID0gbGlnaHRuZXNzO1xuXG5cdFx0cmV0dXJuIHRhcmdldDtcblxuXHR9LFxuXG5cdGdldFN0eWxlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gJ3JnYignICsgKCAoIHRoaXMuciAqIDI1NSApIHwgMCApICsgJywnICsgKCAoIHRoaXMuZyAqIDI1NSApIHwgMCApICsgJywnICsgKCAoIHRoaXMuYiAqIDI1NSApIHwgMCApICsgJyknO1xuXG5cdH0sXG5cblx0b2Zmc2V0SFNMOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaHNsID0ge307XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gKCBoLCBzLCBsICkge1xuXG5cdFx0XHR0aGlzLmdldEhTTCggaHNsICk7XG5cblx0XHRcdGhzbC5oICs9IGg7IGhzbC5zICs9IHM7IGhzbC5sICs9IGw7XG5cblx0XHRcdHRoaXMuc2V0SFNMKCBoc2wuaCwgaHNsLnMsIGhzbC5sICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0YWRkOiBmdW5jdGlvbiAoIGNvbG9yICkge1xuXG5cdFx0dGhpcy5yICs9IGNvbG9yLnI7XG5cdFx0dGhpcy5nICs9IGNvbG9yLmc7XG5cdFx0dGhpcy5iICs9IGNvbG9yLmI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZENvbG9yczogZnVuY3Rpb24gKCBjb2xvcjEsIGNvbG9yMiApIHtcblxuXHRcdHRoaXMuciA9IGNvbG9yMS5yICsgY29sb3IyLnI7XG5cdFx0dGhpcy5nID0gY29sb3IxLmcgKyBjb2xvcjIuZztcblx0XHR0aGlzLmIgPSBjb2xvcjEuYiArIGNvbG9yMi5iO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMuciArPSBzO1xuXHRcdHRoaXMuZyArPSBzO1xuXHRcdHRoaXMuYiArPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWI6IGZ1bmN0aW9uICggY29sb3IgKSB7XG5cblx0XHR0aGlzLnIgPSBNYXRoLm1heCggMCwgdGhpcy5yIC0gY29sb3IuciApO1xuXHRcdHRoaXMuZyA9IE1hdGgubWF4KCAwLCB0aGlzLmcgLSBjb2xvci5nICk7XG5cdFx0dGhpcy5iID0gTWF0aC5tYXgoIDAsIHRoaXMuYiAtIGNvbG9yLmIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHk6IGZ1bmN0aW9uICggY29sb3IgKSB7XG5cblx0XHR0aGlzLnIgKj0gY29sb3Iucjtcblx0XHR0aGlzLmcgKj0gY29sb3IuZztcblx0XHR0aGlzLmIgKj0gY29sb3IuYjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMuciAqPSBzO1xuXHRcdHRoaXMuZyAqPSBzO1xuXHRcdHRoaXMuYiAqPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRsZXJwOiBmdW5jdGlvbiAoIGNvbG9yLCBhbHBoYSApIHtcblxuXHRcdHRoaXMuciArPSAoIGNvbG9yLnIgLSB0aGlzLnIgKSAqIGFscGhhO1xuXHRcdHRoaXMuZyArPSAoIGNvbG9yLmcgLSB0aGlzLmcgKSAqIGFscGhhO1xuXHRcdHRoaXMuYiArPSAoIGNvbG9yLmIgLSB0aGlzLmIgKSAqIGFscGhhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggYyApIHtcblxuXHRcdHJldHVybiAoIGMuciA9PT0gdGhpcy5yICkgJiYgKCBjLmcgPT09IHRoaXMuZyApICYmICggYy5iID09PSB0aGlzLmIgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLnIgPSBhcnJheVsgb2Zmc2V0IF07XG5cdFx0dGhpcy5nID0gYXJyYXlbIG9mZnNldCArIDEgXTtcblx0XHR0aGlzLmIgPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy5yO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLmc7XG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuYjtcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0SGV4KCk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogVW5pZm9ybXMgbGlicmFyeSBmb3Igc2hhcmVkIHdlYmdsIHNoYWRlcnNcbiAqL1xuXG52YXIgVW5pZm9ybXNMaWIgPSB7XG5cblx0Y29tbW9uOiB7XG5cblx0XHRkaWZmdXNlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4ZWVlZWVlICkgfSxcblx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfSxcblxuXHRcdG1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdHV2VHJhbnNmb3JtOiB7IHZhbHVlOiBuZXcgTWF0cml4MygpIH0sXG5cblx0XHRhbHBoYU1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXG5cdH0sXG5cblx0c3BlY3VsYXJtYXA6IHtcblxuXHRcdHNwZWN1bGFyTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cblx0fSxcblxuXHRlbnZtYXA6IHtcblxuXHRcdGVudk1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGZsaXBFbnZNYXA6IHsgdmFsdWU6IC0gMSB9LFxuXHRcdHJlZmxlY3Rpdml0eTogeyB2YWx1ZTogMS4wIH0sXG5cdFx0cmVmcmFjdGlvblJhdGlvOiB7IHZhbHVlOiAwLjk4IH0sXG5cdFx0bWF4TWlwTGV2ZWw6IHsgdmFsdWU6IDAgfVxuXG5cdH0sXG5cblx0YW9tYXA6IHtcblxuXHRcdGFvTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0YW9NYXBJbnRlbnNpdHk6IHsgdmFsdWU6IDEgfVxuXG5cdH0sXG5cblx0bGlnaHRtYXA6IHtcblxuXHRcdGxpZ2h0TWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0bGlnaHRNYXBJbnRlbnNpdHk6IHsgdmFsdWU6IDEgfVxuXG5cdH0sXG5cblx0ZW1pc3NpdmVtYXA6IHtcblxuXHRcdGVtaXNzaXZlTWFwOiB7IHZhbHVlOiBudWxsIH1cblxuXHR9LFxuXG5cdGJ1bXBtYXA6IHtcblxuXHRcdGJ1bXBNYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRidW1wU2NhbGU6IHsgdmFsdWU6IDEgfVxuXG5cdH0sXG5cblx0bm9ybWFsbWFwOiB7XG5cblx0XHRub3JtYWxNYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRub3JtYWxTY2FsZTogeyB2YWx1ZTogbmV3IFZlY3RvcjIoIDEsIDEgKSB9XG5cblx0fSxcblxuXHRkaXNwbGFjZW1lbnRtYXA6IHtcblxuXHRcdGRpc3BsYWNlbWVudE1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGRpc3BsYWNlbWVudFNjYWxlOiB7IHZhbHVlOiAxIH0sXG5cdFx0ZGlzcGxhY2VtZW50QmlhczogeyB2YWx1ZTogMCB9XG5cblx0fSxcblxuXHRyb3VnaG5lc3NtYXA6IHtcblxuXHRcdHJvdWdobmVzc01hcDogeyB2YWx1ZTogbnVsbCB9XG5cblx0fSxcblxuXHRtZXRhbG5lc3NtYXA6IHtcblxuXHRcdG1ldGFsbmVzc01hcDogeyB2YWx1ZTogbnVsbCB9XG5cblx0fSxcblxuXHRncmFkaWVudG1hcDoge1xuXG5cdFx0Z3JhZGllbnRNYXA6IHsgdmFsdWU6IG51bGwgfVxuXG5cdH0sXG5cblx0Zm9nOiB7XG5cblx0XHRmb2dEZW5zaXR5OiB7IHZhbHVlOiAwLjAwMDI1IH0sXG5cdFx0Zm9nTmVhcjogeyB2YWx1ZTogMSB9LFxuXHRcdGZvZ0ZhcjogeyB2YWx1ZTogMjAwMCB9LFxuXHRcdGZvZ0NvbG9yOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4ZmZmZmZmICkgfVxuXG5cdH0sXG5cblx0bGlnaHRzOiB7XG5cblx0XHRhbWJpZW50TGlnaHRDb2xvcjogeyB2YWx1ZTogW10gfSxcblxuXHRcdGRpcmVjdGlvbmFsTGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xuXHRcdFx0ZGlyZWN0aW9uOiB7fSxcblx0XHRcdGNvbG9yOiB7fSxcblxuXHRcdFx0c2hhZG93OiB7fSxcblx0XHRcdHNoYWRvd0JpYXM6IHt9LFxuXHRcdFx0c2hhZG93UmFkaXVzOiB7fSxcblx0XHRcdHNoYWRvd01hcFNpemU6IHt9XG5cdFx0fSB9LFxuXG5cdFx0ZGlyZWN0aW9uYWxTaGFkb3dNYXA6IHsgdmFsdWU6IFtdIH0sXG5cdFx0ZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg6IHsgdmFsdWU6IFtdIH0sXG5cblx0XHRzcG90TGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xuXHRcdFx0Y29sb3I6IHt9LFxuXHRcdFx0cG9zaXRpb246IHt9LFxuXHRcdFx0ZGlyZWN0aW9uOiB7fSxcblx0XHRcdGRpc3RhbmNlOiB7fSxcblx0XHRcdGNvbmVDb3M6IHt9LFxuXHRcdFx0cGVudW1icmFDb3M6IHt9LFxuXHRcdFx0ZGVjYXk6IHt9LFxuXG5cdFx0XHRzaGFkb3c6IHt9LFxuXHRcdFx0c2hhZG93Qmlhczoge30sXG5cdFx0XHRzaGFkb3dSYWRpdXM6IHt9LFxuXHRcdFx0c2hhZG93TWFwU2l6ZToge31cblx0XHR9IH0sXG5cblx0XHRzcG90U2hhZG93TWFwOiB7IHZhbHVlOiBbXSB9LFxuXHRcdHNwb3RTaGFkb3dNYXRyaXg6IHsgdmFsdWU6IFtdIH0sXG5cblx0XHRwb2ludExpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdGNvbG9yOiB7fSxcblx0XHRcdHBvc2l0aW9uOiB7fSxcblx0XHRcdGRlY2F5OiB7fSxcblx0XHRcdGRpc3RhbmNlOiB7fSxcblxuXHRcdFx0c2hhZG93OiB7fSxcblx0XHRcdHNoYWRvd0JpYXM6IHt9LFxuXHRcdFx0c2hhZG93UmFkaXVzOiB7fSxcblx0XHRcdHNoYWRvd01hcFNpemU6IHt9LFxuXHRcdFx0c2hhZG93Q2FtZXJhTmVhcjoge30sXG5cdFx0XHRzaGFkb3dDYW1lcmFGYXI6IHt9XG5cdFx0fSB9LFxuXG5cdFx0cG9pbnRTaGFkb3dNYXA6IHsgdmFsdWU6IFtdIH0sXG5cdFx0cG9pbnRTaGFkb3dNYXRyaXg6IHsgdmFsdWU6IFtdIH0sXG5cblx0XHRoZW1pc3BoZXJlTGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xuXHRcdFx0ZGlyZWN0aW9uOiB7fSxcblx0XHRcdHNreUNvbG9yOiB7fSxcblx0XHRcdGdyb3VuZENvbG9yOiB7fVxuXHRcdH0gfSxcblxuXHRcdC8vIFRPRE8gKGFiZWxuYXRpb24pOiBSZWN0QXJlYUxpZ2h0IEJSREYgZGF0YSBuZWVkcyB0byBiZSBtb3ZlZCBmcm9tIGV4YW1wbGUgdG8gbWFpbiBzcmNcblx0XHRyZWN0QXJlYUxpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdGNvbG9yOiB7fSxcblx0XHRcdHBvc2l0aW9uOiB7fSxcblx0XHRcdHdpZHRoOiB7fSxcblx0XHRcdGhlaWdodDoge31cblx0XHR9IH1cblxuXHR9LFxuXG5cdHBvaW50czoge1xuXG5cdFx0ZGlmZnVzZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweGVlZWVlZSApIH0sXG5cdFx0b3BhY2l0eTogeyB2YWx1ZTogMS4wIH0sXG5cdFx0c2l6ZTogeyB2YWx1ZTogMS4wIH0sXG5cdFx0c2NhbGU6IHsgdmFsdWU6IDEuMCB9LFxuXHRcdG1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdHV2VHJhbnNmb3JtOiB7IHZhbHVlOiBuZXcgTWF0cml4MygpIH1cblxuXHR9XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICovXG5cbnZhciBTaGFkZXJMaWIgPSB7XG5cblx0YmFzaWM6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5zcGVjdWxhcm1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmVudm1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmFvbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2dcblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hiYXNpY192ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNoYmFzaWNfZnJhZ1xuXG5cdH0sXG5cblx0bGFtYmVydDoge1xuXG5cdFx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFtcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcblx0XHRcdFVuaWZvcm1zTGliLnNwZWN1bGFybWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZW52bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuYW9tYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmVtaXNzaXZlbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRzLFxuXHRcdFx0e1xuXHRcdFx0XHRlbWlzc2l2ZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweDAwMDAwMCApIH1cblx0XHRcdH1cblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hsYW1iZXJ0X3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hsYW1iZXJ0X2ZyYWdcblxuXHR9LFxuXG5cdHBob25nOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuc3BlY3VsYXJtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbnZtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5hb21hcCxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZW1pc3NpdmVtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5idW1wbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubm9ybWFsbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZ3JhZGllbnRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2csXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodHMsXG5cdFx0XHR7XG5cdFx0XHRcdGVtaXNzaXZlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4MDAwMDAwICkgfSxcblx0XHRcdFx0c3BlY3VsYXI6IHsgdmFsdWU6IG5ldyBDb2xvciggMHgxMTExMTEgKSB9LFxuXHRcdFx0XHRzaGluaW5lc3M6IHsgdmFsdWU6IDMwIH1cblx0XHRcdH1cblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaG9uZ192ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGhvbmdfZnJhZ1xuXG5cdH0sXG5cblx0c3RhbmRhcmQ6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbnZtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5hb21hcCxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZW1pc3NpdmVtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5idW1wbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubm9ybWFsbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIucm91Z2huZXNzbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubWV0YWxuZXNzbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRzLFxuXHRcdFx0e1xuXHRcdFx0XHRlbWlzc2l2ZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweDAwMDAwMCApIH0sXG5cdFx0XHRcdHJvdWdobmVzczogeyB2YWx1ZTogMC41IH0sXG5cdFx0XHRcdG1ldGFsbmVzczogeyB2YWx1ZTogMC41IH0sXG5cdFx0XHRcdGVudk1hcEludGVuc2l0eTogeyB2YWx1ZTogMSB9IC8vIHRlbXBvcmFyeVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaHlzaWNhbF9mcmFnXG5cblx0fSxcblxuXHRwb2ludHM6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5wb2ludHMsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2dcblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLnBvaW50c192ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5wb2ludHNfZnJhZ1xuXG5cdH0sXG5cblx0ZGFzaGVkOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nLFxuXHRcdFx0e1xuXHRcdFx0XHRzY2FsZTogeyB2YWx1ZTogMSB9LFxuXHRcdFx0XHRkYXNoU2l6ZTogeyB2YWx1ZTogMSB9LFxuXHRcdFx0XHR0b3RhbFNpemU6IHsgdmFsdWU6IDIgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubGluZWRhc2hlZF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5saW5lZGFzaGVkX2ZyYWdcblxuXHR9LFxuXG5cdGRlcHRoOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwXG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5kZXB0aF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5kZXB0aF9mcmFnXG5cblx0fSxcblxuXHRub3JtYWw6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5idW1wbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubm9ybWFsbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxuXHRcdFx0e1xuXHRcdFx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubm9ybWFsX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm5vcm1hbF9mcmFnXG5cblx0fSxcblxuXHQvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vXHRDdWJlIG1hcCBzaGFkZXJcblx0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHRjdWJlOiB7XG5cblx0XHR1bmlmb3Jtczoge1xuXHRcdFx0dEN1YmU6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRcdHRGbGlwOiB7IHZhbHVlOiAtIDEgfSxcblx0XHRcdG9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9XG5cdFx0fSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuY3ViZV92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5jdWJlX2ZyYWdcblxuXHR9LFxuXG5cdGVxdWlyZWN0OiB7XG5cblx0XHR1bmlmb3Jtczoge1xuXHRcdFx0dEVxdWlyZWN0OiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0fSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuZXF1aXJlY3RfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuZXF1aXJlY3RfZnJhZ1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VSR0JBOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxuXHRcdFx0e1xuXHRcdFx0XHRyZWZlcmVuY2VQb3NpdGlvbjogeyB2YWx1ZTogbmV3IFZlY3RvcjMoKSB9LFxuXHRcdFx0XHRuZWFyRGlzdGFuY2U6IHsgdmFsdWU6IDEgfSxcblx0XHRcdFx0ZmFyRGlzdGFuY2U6IHsgdmFsdWU6IDEwMDAgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuZGlzdGFuY2VSR0JBX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmRpc3RhbmNlUkdCQV9mcmFnXG5cblx0fSxcblxuXHRzaGFkb3c6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodHMsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2csXG5cdFx0XHR7XG5cdFx0XHRcdGNvbG9yOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4MDAwMDAgKSB9LFxuXHRcdFx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfVxuXHRcdFx0fSxcblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLnNoYWRvd192ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5zaGFkb3dfZnJhZ1xuXG5cdH1cblxufTtcblxuU2hhZGVyTGliLnBoeXNpY2FsID0ge1xuXG5cdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0U2hhZGVyTGliLnN0YW5kYXJkLnVuaWZvcm1zLFxuXHRcdHtcblx0XHRcdGNsZWFyQ29hdDogeyB2YWx1ZTogMCB9LFxuXHRcdFx0Y2xlYXJDb2F0Um91Z2huZXNzOiB7IHZhbHVlOiAwIH1cblx0XHR9XG5cdF0gKSxcblxuXHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaHlzaWNhbF92ZXJ0LFxuXHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX2ZyYWdcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMQXR0cmlidXRlcyggZ2wgKSB7XG5cblx0dmFyIGJ1ZmZlcnMgPSBuZXcgV2Vha01hcCgpO1xuXG5cdGZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciggYXR0cmlidXRlLCBidWZmZXJUeXBlICkge1xuXG5cdFx0dmFyIGFycmF5ID0gYXR0cmlidXRlLmFycmF5O1xuXHRcdHZhciB1c2FnZSA9IGF0dHJpYnV0ZS5keW5hbWljID8gZ2wuRFlOQU1JQ19EUkFXIDogZ2wuU1RBVElDX0RSQVc7XG5cblx0XHR2YXIgYnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG5cblx0XHRnbC5iaW5kQnVmZmVyKCBidWZmZXJUeXBlLCBidWZmZXIgKTtcblx0XHRnbC5idWZmZXJEYXRhKCBidWZmZXJUeXBlLCBhcnJheSwgdXNhZ2UgKTtcblxuXHRcdGF0dHJpYnV0ZS5vblVwbG9hZENhbGxiYWNrKCk7XG5cblx0XHR2YXIgdHlwZSA9IGdsLkZMT0FUO1xuXG5cdFx0aWYgKCBhcnJheSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSApIHtcblxuXHRcdFx0dHlwZSA9IGdsLkZMT0FUO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXkgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMQXR0cmlidXRlczogVW5zdXBwb3J0ZWQgZGF0YSBidWZmZXIgZm9ybWF0OiBGbG9hdDY0QXJyYXkuJyApO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBVaW50MTZBcnJheSApIHtcblxuXHRcdFx0dHlwZSA9IGdsLlVOU0lHTkVEX1NIT1JUO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBJbnQxNkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuU0hPUlQ7XG5cblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIFVpbnQzMkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuVU5TSUdORURfSU5UO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBJbnQzMkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuSU5UO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBJbnQ4QXJyYXkgKSB7XG5cblx0XHRcdHR5cGUgPSBnbC5CWVRFO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBVaW50OEFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuVU5TSUdORURfQllURTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRidWZmZXI6IGJ1ZmZlcixcblx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRieXRlc1BlckVsZW1lbnQ6IGFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULFxuXHRcdFx0dmVyc2lvbjogYXR0cmlidXRlLnZlcnNpb25cblx0XHR9O1xuXG5cdH1cblxuXHRmdW5jdGlvbiB1cGRhdGVCdWZmZXIoIGJ1ZmZlciwgYXR0cmlidXRlLCBidWZmZXJUeXBlICkge1xuXG5cdFx0dmFyIGFycmF5ID0gYXR0cmlidXRlLmFycmF5O1xuXHRcdHZhciB1cGRhdGVSYW5nZSA9IGF0dHJpYnV0ZS51cGRhdGVSYW5nZTtcblxuXHRcdGdsLmJpbmRCdWZmZXIoIGJ1ZmZlclR5cGUsIGJ1ZmZlciApO1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGUuZHluYW1pYyA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGdsLmJ1ZmZlckRhdGEoIGJ1ZmZlclR5cGUsIGFycmF5LCBnbC5TVEFUSUNfRFJBVyApO1xuXG5cdFx0fSBlbHNlIGlmICggdXBkYXRlUmFuZ2UuY291bnQgPT09IC0gMSApIHtcblxuXHRcdFx0Ly8gTm90IHVzaW5nIHVwZGF0ZSByYW5nZXNcblxuXHRcdFx0Z2wuYnVmZmVyU3ViRGF0YSggYnVmZmVyVHlwZSwgMCwgYXJyYXkgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHVwZGF0ZVJhbmdlLmNvdW50ID09PSAwICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xPYmplY3RzLnVwZGF0ZUJ1ZmZlcjogZHluYW1pYyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUgbWFya2VkIGFzIG5lZWRzVXBkYXRlIGJ1dCB1cGRhdGVSYW5nZS5jb3VudCBpcyAwLCBlbnN1cmUgeW91IGFyZSB1c2luZyBzZXQgbWV0aG9kcyBvciB1cGRhdGluZyBtYW51YWxseS4nICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRnbC5idWZmZXJTdWJEYXRhKCBidWZmZXJUeXBlLCB1cGRhdGVSYW5nZS5vZmZzZXQgKiBhcnJheS5CWVRFU19QRVJfRUxFTUVOVCxcblx0XHRcdFx0YXJyYXkuc3ViYXJyYXkoIHVwZGF0ZVJhbmdlLm9mZnNldCwgdXBkYXRlUmFuZ2Uub2Zmc2V0ICsgdXBkYXRlUmFuZ2UuY291bnQgKSApO1xuXG5cdFx0XHR1cGRhdGVSYW5nZS5jb3VudCA9IC0gMTsgLy8gcmVzZXQgcmFuZ2VcblxuXHRcdH1cblxuXHR9XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBnZXQoIGF0dHJpYnV0ZSApIHtcblxuXHRcdGlmICggYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGUuZGF0YTtcblxuXHRcdHJldHVybiBidWZmZXJzLmdldCggYXR0cmlidXRlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbW92ZSggYXR0cmlidXRlICkge1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS5kYXRhO1xuXG5cdFx0dmFyIGRhdGEgPSBidWZmZXJzLmdldCggYXR0cmlidXRlICk7XG5cblx0XHRpZiAoIGRhdGEgKSB7XG5cblx0XHRcdGdsLmRlbGV0ZUJ1ZmZlciggZGF0YS5idWZmZXIgKTtcblxuXHRcdFx0YnVmZmVycy5kZWxldGUoIGF0dHJpYnV0ZSApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiB1cGRhdGUoIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApIHtcblxuXHRcdGlmICggYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGUuZGF0YTtcblxuXHRcdHZhciBkYXRhID0gYnVmZmVycy5nZXQoIGF0dHJpYnV0ZSApO1xuXG5cdFx0aWYgKCBkYXRhID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGJ1ZmZlcnMuc2V0KCBhdHRyaWJ1dGUsIGNyZWF0ZUJ1ZmZlciggYXR0cmlidXRlLCBidWZmZXJUeXBlICkgKTtcblxuXHRcdH0gZWxzZSBpZiAoIGRhdGEudmVyc2lvbiA8IGF0dHJpYnV0ZS52ZXJzaW9uICkge1xuXG5cdFx0XHR1cGRhdGVCdWZmZXIoIGRhdGEuYnVmZmVyLCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKTtcblxuXHRcdFx0ZGF0YS52ZXJzaW9uID0gYXR0cmlidXRlLnZlcnNpb247XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRnZXQ6IGdldCxcblx0XHRyZW1vdmU6IHJlbW92ZSxcblx0XHR1cGRhdGU6IHVwZGF0ZVxuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxuZnVuY3Rpb24gRXVsZXIoIHgsIHksIHosIG9yZGVyICkge1xuXG5cdHRoaXMuX3ggPSB4IHx8IDA7XG5cdHRoaXMuX3kgPSB5IHx8IDA7XG5cdHRoaXMuX3ogPSB6IHx8IDA7XG5cdHRoaXMuX29yZGVyID0gb3JkZXIgfHwgRXVsZXIuRGVmYXVsdE9yZGVyO1xuXG59XG5cbkV1bGVyLlJvdGF0aW9uT3JkZXJzID0gWyAnWFlaJywgJ1laWCcsICdaWFknLCAnWFpZJywgJ1lYWicsICdaWVgnIF07XG5cbkV1bGVyLkRlZmF1bHRPcmRlciA9ICdYWVonO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggRXVsZXIucHJvdG90eXBlLCB7XG5cblx0eDoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLl94O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy5feCA9IHZhbHVlO1xuXHRcdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR5OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX3k7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl95ID0gdmFsdWU7XG5cdFx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHo6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5fejtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3ogPSB2YWx1ZTtcblx0XHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0b3JkZXI6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5fb3JkZXI7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl9vcmRlciA9IHZhbHVlO1xuXHRcdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEV1bGVyLnByb3RvdHlwZSwge1xuXG5cdGlzRXVsZXI6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIHgsIHksIHosIG9yZGVyICkge1xuXG5cdFx0dGhpcy5feCA9IHg7XG5cdFx0dGhpcy5feSA9IHk7XG5cdFx0dGhpcy5feiA9IHo7XG5cdFx0dGhpcy5fb3JkZXIgPSBvcmRlciB8fCB0aGlzLl9vcmRlcjtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLl94LCB0aGlzLl95LCB0aGlzLl96LCB0aGlzLl9vcmRlciApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBldWxlciApIHtcblxuXHRcdHRoaXMuX3ggPSBldWxlci5feDtcblx0XHR0aGlzLl95ID0gZXVsZXIuX3k7XG5cdFx0dGhpcy5feiA9IGV1bGVyLl96O1xuXHRcdHRoaXMuX29yZGVyID0gZXVsZXIuX29yZGVyO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Sb3RhdGlvbk1hdHJpeDogZnVuY3Rpb24gKCBtLCBvcmRlciwgdXBkYXRlICkge1xuXG5cdFx0dmFyIGNsYW1wID0gX01hdGguY2xhbXA7XG5cblx0XHQvLyBhc3N1bWVzIHRoZSB1cHBlciAzeDMgb2YgbSBpcyBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUsIHVuc2NhbGVkKVxuXG5cdFx0dmFyIHRlID0gbS5lbGVtZW50cztcblx0XHR2YXIgbTExID0gdGVbIDAgXSwgbTEyID0gdGVbIDQgXSwgbTEzID0gdGVbIDggXTtcblx0XHR2YXIgbTIxID0gdGVbIDEgXSwgbTIyID0gdGVbIDUgXSwgbTIzID0gdGVbIDkgXTtcblx0XHR2YXIgbTMxID0gdGVbIDIgXSwgbTMyID0gdGVbIDYgXSwgbTMzID0gdGVbIDEwIF07XG5cblx0XHRvcmRlciA9IG9yZGVyIHx8IHRoaXMuX29yZGVyO1xuXG5cdFx0aWYgKCBvcmRlciA9PT0gJ1hZWicgKSB7XG5cblx0XHRcdHRoaXMuX3kgPSBNYXRoLmFzaW4oIGNsYW1wKCBtMTMsIC0gMSwgMSApICk7XG5cblx0XHRcdGlmICggTWF0aC5hYnMoIG0xMyApIDwgMC45OTk5OSApIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggLSBtMjMsIG0zMyApO1xuXHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggLSBtMTIsIG0xMSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCBtMzIsIG0yMiApO1xuXHRcdFx0XHR0aGlzLl96ID0gMDtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdZWFonICkge1xuXG5cdFx0XHR0aGlzLl94ID0gTWF0aC5hc2luKCAtIGNsYW1wKCBtMjMsIC0gMSwgMSApICk7XG5cblx0XHRcdGlmICggTWF0aC5hYnMoIG0yMyApIDwgMC45OTk5OSApIHtcblxuXHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggbTEzLCBtMzMgKTtcblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIG0yMSwgbTIyICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIC0gbTMxLCBtMTEgKTtcblx0XHRcdFx0dGhpcy5feiA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWlhZJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IE1hdGguYXNpbiggY2xhbXAoIG0zMiwgLSAxLCAxICkgKTtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggbTMyICkgPCAwLjk5OTk5ICkge1xuXG5cdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCAtIG0zMSwgbTMzICk7XG5cdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCAtIG0xMiwgbTIyICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5feSA9IDA7XG5cdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCBtMjEsIG0xMSApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1pZWCcgKSB7XG5cblx0XHRcdHRoaXMuX3kgPSBNYXRoLmFzaW4oIC0gY2xhbXAoIG0zMSwgLSAxLCAxICkgKTtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggbTMxICkgPCAwLjk5OTk5ICkge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCBtMzIsIG0zMyApO1xuXHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggbTIxLCBtMTEgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gMDtcblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIC0gbTEyLCBtMjIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdZWlgnICkge1xuXG5cdFx0XHR0aGlzLl96ID0gTWF0aC5hc2luKCBjbGFtcCggbTIxLCAtIDEsIDEgKSApO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBtMjEgKSA8IDAuOTk5OTkgKSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIC0gbTIzLCBtMjIgKTtcblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIC0gbTMxLCBtMTEgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gMDtcblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIG0xMywgbTMzICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWFpZJyApIHtcblxuXHRcdFx0dGhpcy5feiA9IE1hdGguYXNpbiggLSBjbGFtcCggbTEyLCAtIDEsIDEgKSApO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBtMTIgKSA8IDAuOTk5OTkgKSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIG0zMiwgbTIyICk7XG5cdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCBtMTMsIG0xMSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCAtIG0yMywgbTMzICk7XG5cdFx0XHRcdHRoaXMuX3kgPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5FdWxlcjogLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGdpdmVuIHVuc3VwcG9ydGVkIG9yZGVyOiAnICsgb3JkZXIgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuX29yZGVyID0gb3JkZXI7XG5cblx0XHRpZiAoIHVwZGF0ZSAhPT0gZmFsc2UgKSB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVF1YXRlcm5pb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBtYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldEZyb21RdWF0ZXJuaW9uKCBxLCBvcmRlciwgdXBkYXRlICkge1xuXG5cdFx0XHRtYXRyaXgubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oIHEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBtYXRyaXgsIG9yZGVyLCB1cGRhdGUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHNldEZyb21WZWN0b3IzOiBmdW5jdGlvbiAoIHYsIG9yZGVyICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0KCB2LngsIHYueSwgdi56LCBvcmRlciB8fCB0aGlzLl9vcmRlciApO1xuXG5cdH0sXG5cblx0cmVvcmRlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gV0FSTklORzogdGhpcyBkaXNjYXJkcyByZXZvbHV0aW9uIGluZm9ybWF0aW9uIC1iaG91c3RvblxuXG5cdFx0dmFyIHEgPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJlb3JkZXIoIG5ld09yZGVyICkge1xuXG5cdFx0XHRxLnNldEZyb21FdWxlciggdGhpcyApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tUXVhdGVybmlvbiggcSwgbmV3T3JkZXIgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBldWxlciApIHtcblxuXHRcdHJldHVybiAoIGV1bGVyLl94ID09PSB0aGlzLl94ICkgJiYgKCBldWxlci5feSA9PT0gdGhpcy5feSApICYmICggZXVsZXIuX3ogPT09IHRoaXMuX3ogKSAmJiAoIGV1bGVyLl9vcmRlciA9PT0gdGhpcy5fb3JkZXIgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSApIHtcblxuXHRcdHRoaXMuX3ggPSBhcnJheVsgMCBdO1xuXHRcdHRoaXMuX3kgPSBhcnJheVsgMSBdO1xuXHRcdHRoaXMuX3ogPSBhcnJheVsgMiBdO1xuXHRcdGlmICggYXJyYXlbIDMgXSAhPT0gdW5kZWZpbmVkICkgdGhpcy5fb3JkZXIgPSBhcnJheVsgMyBdO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLl94O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLl95O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLl96O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLl9vcmRlcjtcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdHRvVmVjdG9yMzogZnVuY3Rpb24gKCBvcHRpb25hbFJlc3VsdCApIHtcblxuXHRcdGlmICggb3B0aW9uYWxSZXN1bHQgKSB7XG5cblx0XHRcdHJldHVybiBvcHRpb25hbFJlc3VsdC5zZXQoIHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3ogKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJldHVybiBuZXcgVmVjdG9yMyggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0b25DaGFuZ2U6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0b25DaGFuZ2VDYWxsYmFjazogZnVuY3Rpb24gKCkge31cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gTGF5ZXJzKCkge1xuXG5cdHRoaXMubWFzayA9IDEgfCAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIExheWVycy5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggY2hhbm5lbCApIHtcblxuXHRcdHRoaXMubWFzayA9IDEgPDwgY2hhbm5lbCB8IDA7XG5cblx0fSxcblxuXHRlbmFibGU6IGZ1bmN0aW9uICggY2hhbm5lbCApIHtcblxuXHRcdHRoaXMubWFzayB8PSAxIDw8IGNoYW5uZWwgfCAwO1xuXG5cdH0sXG5cblx0dG9nZ2xlOiBmdW5jdGlvbiAoIGNoYW5uZWwgKSB7XG5cblx0XHR0aGlzLm1hc2sgXj0gMSA8PCBjaGFubmVsIHwgMDtcblxuXHR9LFxuXG5cdGRpc2FibGU6IGZ1bmN0aW9uICggY2hhbm5lbCApIHtcblxuXHRcdHRoaXMubWFzayAmPSB+ICggMSA8PCBjaGFubmVsIHwgMCApO1xuXG5cdH0sXG5cblx0dGVzdDogZnVuY3Rpb24gKCBsYXllcnMgKSB7XG5cblx0XHRyZXR1cm4gKCB0aGlzLm1hc2sgJiBsYXllcnMubWFzayApICE9PSAwO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICogQGF1dGhvciBlbGVwaGFudGF0d29yayAvIHd3dy5lbGVwaGFudGF0d29yay5jaFxuICovXG5cbnZhciBvYmplY3QzRElkID0gMDtcblxuZnVuY3Rpb24gT2JqZWN0M0QoKSB7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBvYmplY3QzRElkICsrIH0gKTtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHR0aGlzLm5hbWUgPSAnJztcblx0dGhpcy50eXBlID0gJ09iamVjdDNEJztcblxuXHR0aGlzLnBhcmVudCA9IG51bGw7XG5cdHRoaXMuY2hpbGRyZW4gPSBbXTtcblxuXHR0aGlzLnVwID0gT2JqZWN0M0QuRGVmYXVsdFVwLmNsb25lKCk7XG5cblx0dmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHJvdGF0aW9uID0gbmV3IEV1bGVyKCk7XG5cdHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblx0dmFyIHNjYWxlID0gbmV3IFZlY3RvcjMoIDEsIDEsIDEgKTtcblxuXHRmdW5jdGlvbiBvblJvdGF0aW9uQ2hhbmdlKCkge1xuXG5cdFx0cXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoIHJvdGF0aW9uLCBmYWxzZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBvblF1YXRlcm5pb25DaGFuZ2UoKSB7XG5cblx0XHRyb3RhdGlvbi5zZXRGcm9tUXVhdGVybmlvbiggcXVhdGVybmlvbiwgdW5kZWZpbmVkLCBmYWxzZSApO1xuXG5cdH1cblxuXHRyb3RhdGlvbi5vbkNoYW5nZSggb25Sb3RhdGlvbkNoYW5nZSApO1xuXHRxdWF0ZXJuaW9uLm9uQ2hhbmdlKCBvblF1YXRlcm5pb25DaGFuZ2UgKTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyggdGhpcywge1xuXHRcdHBvc2l0aW9uOiB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IHBvc2l0aW9uXG5cdFx0fSxcblx0XHRyb3RhdGlvbjoge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdHZhbHVlOiByb3RhdGlvblxuXHRcdH0sXG5cdFx0cXVhdGVybmlvbjoge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdHZhbHVlOiBxdWF0ZXJuaW9uXG5cdFx0fSxcblx0XHRzY2FsZToge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdHZhbHVlOiBzY2FsZVxuXHRcdH0sXG5cdFx0bW9kZWxWaWV3TWF0cml4OiB7XG5cdFx0XHR2YWx1ZTogbmV3IE1hdHJpeDQoKVxuXHRcdH0sXG5cdFx0bm9ybWFsTWF0cml4OiB7XG5cdFx0XHR2YWx1ZTogbmV3IE1hdHJpeDMoKVxuXHRcdH1cblx0fSApO1xuXG5cdHRoaXMubWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblx0dGhpcy5tYXRyaXhXb3JsZCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gT2JqZWN0M0QuRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGU7XG5cdHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMubGF5ZXJzID0gbmV3IExheWVycygpO1xuXHR0aGlzLnZpc2libGUgPSB0cnVlO1xuXG5cdHRoaXMuY2FzdFNoYWRvdyA9IGZhbHNlO1xuXHR0aGlzLnJlY2VpdmVTaGFkb3cgPSBmYWxzZTtcblxuXHR0aGlzLmZydXN0dW1DdWxsZWQgPSB0cnVlO1xuXHR0aGlzLnJlbmRlck9yZGVyID0gMDtcblxuXHR0aGlzLnVzZXJEYXRhID0ge307XG5cbn1cblxuT2JqZWN0M0QuRGVmYXVsdFVwID0gbmV3IFZlY3RvcjMoIDAsIDEsIDAgKTtcbk9iamVjdDNELkRlZmF1bHRNYXRyaXhBdXRvVXBkYXRlID0gdHJ1ZTtcblxuT2JqZWN0M0QucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IE9iamVjdDNELFxuXG5cdGlzT2JqZWN0M0Q6IHRydWUsXG5cblx0b25CZWZvcmVSZW5kZXI6IGZ1bmN0aW9uICgpIHt9LFxuXHRvbkFmdGVyUmVuZGVyOiBmdW5jdGlvbiAoKSB7fSxcblxuXHRhcHBseU1hdHJpeDogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHR0aGlzLm1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBtYXRyaXgsIHRoaXMubWF0cml4ICk7XG5cblx0XHR0aGlzLm1hdHJpeC5kZWNvbXBvc2UoIHRoaXMucG9zaXRpb24sIHRoaXMucXVhdGVybmlvbiwgdGhpcy5zY2FsZSApO1xuXG5cdH0sXG5cblx0YXBwbHlRdWF0ZXJuaW9uOiBmdW5jdGlvbiAoIHEgKSB7XG5cblx0XHR0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoIHEgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0Um90YXRpb25Gcm9tQXhpc0FuZ2xlOiBmdW5jdGlvbiAoIGF4aXMsIGFuZ2xlICkge1xuXG5cdFx0Ly8gYXNzdW1lcyBheGlzIGlzIG5vcm1hbGl6ZWRcblxuXHRcdHRoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApO1xuXG5cdH0sXG5cblx0c2V0Um90YXRpb25Gcm9tRXVsZXI6IGZ1bmN0aW9uICggZXVsZXIgKSB7XG5cblx0XHR0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKCBldWxlciwgdHJ1ZSApO1xuXG5cdH0sXG5cblx0c2V0Um90YXRpb25Gcm9tTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHQvLyBhc3N1bWVzIHRoZSB1cHBlciAzeDMgb2YgbSBpcyBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUsIHVuc2NhbGVkKVxuXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCggbSApO1xuXG5cdH0sXG5cblx0c2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0Ly8gYXNzdW1lcyBxIGlzIG5vcm1hbGl6ZWRcblxuXHRcdHRoaXMucXVhdGVybmlvbi5jb3B5KCBxICk7XG5cblx0fSxcblxuXHRyb3RhdGVPbkF4aXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBvYmplY3Qgb24gYXhpcyBpbiBvYmplY3Qgc3BhY2Vcblx0XHQvLyBheGlzIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxuXG5cdFx0dmFyIHExID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVPbkF4aXMoIGF4aXMsIGFuZ2xlICkge1xuXG5cdFx0XHRxMS5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLnF1YXRlcm5pb24ubXVsdGlwbHkoIHExICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cm90YXRlT25Xb3JsZEF4aXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBvYmplY3Qgb24gYXhpcyBpbiB3b3JsZCBzcGFjZVxuXHRcdC8vIGF4aXMgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkXG5cdFx0Ly8gbWV0aG9kIGFzc3VtZXMgbm8gcm90YXRlZCBwYXJlbnRcblxuXHRcdHZhciBxMSA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlT25Xb3JsZEF4aXMoIGF4aXMsIGFuZ2xlICkge1xuXG5cdFx0XHRxMS5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoIHExICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cm90YXRlWDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoIDEsIDAsIDAgKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVYKCBhbmdsZSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKCB2MSwgYW5nbGUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJvdGF0ZVk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCAwLCAxLCAwICk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWSggYW5nbGUgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyggdjEsIGFuZ2xlICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyb3RhdGVaOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMyggMCwgMCwgMSApO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVooIGFuZ2xlICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoIHYxLCBhbmdsZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNsYXRlT25BeGlzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyB0cmFuc2xhdGUgb2JqZWN0IGJ5IGRpc3RhbmNlIGFsb25nIGF4aXMgaW4gb2JqZWN0IHNwYWNlXG5cdFx0Ly8gYXhpcyBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdHJhbnNsYXRlT25BeGlzKCBheGlzLCBkaXN0YW5jZSApIHtcblxuXHRcdFx0djEuY29weSggYXhpcyApLmFwcGx5UXVhdGVybmlvbiggdGhpcy5xdWF0ZXJuaW9uICk7XG5cblx0XHRcdHRoaXMucG9zaXRpb24uYWRkKCB2MS5tdWx0aXBseVNjYWxhciggZGlzdGFuY2UgKSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZVg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCAxLCAwLCAwICk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdHJhbnNsYXRlWCggZGlzdGFuY2UgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyggdjEsIGRpc3RhbmNlICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR0cmFuc2xhdGVZOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMyggMCwgMSwgMCApO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHRyYW5zbGF0ZVkoIGRpc3RhbmNlICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoIHYxLCBkaXN0YW5jZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNsYXRlWjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoIDAsIDAsIDEgKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB0cmFuc2xhdGVaKCBkaXN0YW5jZSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKCB2MSwgZGlzdGFuY2UgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGxvY2FsVG9Xb3JsZDogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHRyZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4NCggdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdH0sXG5cblx0d29ybGRUb0xvY2FsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHdvcmxkVG9Mb2NhbCggdmVjdG9yICkge1xuXG5cdFx0XHRyZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4NCggbTEuZ2V0SW52ZXJzZSggdGhpcy5tYXRyaXhXb3JsZCApICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRsb29rQXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIFRoaXMgbWV0aG9kIGRvZXMgbm90IHN1cHBvcnQgb2JqZWN0cyB3aXRoIHJvdGF0ZWQgYW5kL29yIHRyYW5zbGF0ZWQgcGFyZW50KHMpXG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXHRcdHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGxvb2tBdCggeCwgeSwgeiApIHtcblxuXHRcdFx0aWYgKCB4LmlzVmVjdG9yMyApIHtcblxuXHRcdFx0XHR2ZWN0b3IuY29weSggeCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZlY3Rvci5zZXQoIHgsIHksIHogKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHRoaXMuaXNDYW1lcmEgKSB7XG5cblx0XHRcdFx0bTEubG9va0F0KCB0aGlzLnBvc2l0aW9uLCB2ZWN0b3IsIHRoaXMudXAgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRtMS5sb29rQXQoIHZlY3RvciwgdGhpcy5wb3NpdGlvbiwgdGhpcy51cCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoIG0xICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRhZGQ6IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHR0aGlzLmFkZCggYXJndW1lbnRzWyBpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH1cblxuXHRcdGlmICggb2JqZWN0ID09PSB0aGlzICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCBcIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IGNhbid0IGJlIGFkZGVkIGFzIGEgY2hpbGQgb2YgaXRzZWxmLlwiLCBvYmplY3QgKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCAoIG9iamVjdCAmJiBvYmplY3QuaXNPYmplY3QzRCApICkge1xuXG5cdFx0XHRpZiAoIG9iamVjdC5wYXJlbnQgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0b2JqZWN0LnBhcmVudC5yZW1vdmUoIG9iamVjdCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdG9iamVjdC5wYXJlbnQgPSB0aGlzO1xuXHRcdFx0b2JqZWN0LmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2FkZGVkJyB9ICk7XG5cblx0XHRcdHRoaXMuY2hpbGRyZW4ucHVzaCggb2JqZWN0ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCBcIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5PYmplY3QzRC5cIiwgb2JqZWN0ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJlbW92ZTogZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdHRoaXMucmVtb3ZlKCBhcmd1bWVudHNbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGluZGV4ID0gdGhpcy5jaGlsZHJlbi5pbmRleE9mKCBvYmplY3QgKTtcblxuXHRcdGlmICggaW5kZXggIT09IC0gMSApIHtcblxuXHRcdFx0b2JqZWN0LnBhcmVudCA9IG51bGw7XG5cblx0XHRcdG9iamVjdC5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdyZW1vdmVkJyB9ICk7XG5cblx0XHRcdHRoaXMuY2hpbGRyZW4uc3BsaWNlKCBpbmRleCwgMSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRPYmplY3RCeUlkOiBmdW5jdGlvbiAoIGlkICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSggJ2lkJywgaWQgKTtcblxuXHR9LFxuXG5cdGdldE9iamVjdEJ5TmFtZTogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSggJ25hbWUnLCBuYW1lICk7XG5cblx0fSxcblxuXHRnZXRPYmplY3RCeVByb3BlcnR5OiBmdW5jdGlvbiAoIG5hbWUsIHZhbHVlICkge1xuXG5cdFx0aWYgKCB0aGlzWyBuYW1lIF0gPT09IHZhbHVlICkgcmV0dXJuIHRoaXM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5bIGkgXTtcblx0XHRcdHZhciBvYmplY3QgPSBjaGlsZC5nZXRPYmplY3RCeVByb3BlcnR5KCBuYW1lLCB2YWx1ZSApO1xuXG5cdFx0XHRpZiAoIG9iamVjdCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBvYmplY3Q7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0fSxcblxuXHRnZXRXb3JsZFBvc2l0aW9uOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGRQb3NpdGlvbigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0cmV0dXJuIHRhcmdldC5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubWF0cml4V29ybGQgKTtcblxuXHR9LFxuXG5cdGdldFdvcmxkUXVhdGVybmlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgc2NhbGUgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGdldFdvcmxkUXVhdGVybmlvbiggdGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGRRdWF0ZXJuaW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdFx0dGFyZ2V0ID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XG5cblx0XHRcdHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKCBwb3NpdGlvbiwgdGFyZ2V0LCBzY2FsZSApO1xuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0O1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Z2V0V29ybGRTY2FsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZ2V0V29ybGRTY2FsZSggdGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGRTY2FsZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0XHR0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZSggcG9zaXRpb24sIHF1YXRlcm5pb24sIHRhcmdldCApO1xuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0O1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Z2V0V29ybGREaXJlY3Rpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRXb3JsZERpcmVjdGlvbiggdGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGREaXJlY3Rpb24oKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZ2V0V29ybGRRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7XG5cblx0XHRcdHJldHVybiB0YXJnZXQuc2V0KCAwLCAwLCAxICkuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyYXljYXN0OiBmdW5jdGlvbiAoKSB7fSxcblxuXHR0cmF2ZXJzZTogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdGNhbGxiYWNrKCB0aGlzICk7XG5cblx0XHR2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0Y2hpbGRyZW5bIGkgXS50cmF2ZXJzZSggY2FsbGJhY2sgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHRyYXZlcnNlVmlzaWJsZTogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdGlmICggdGhpcy52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdGNhbGxiYWNrKCB0aGlzICk7XG5cblx0XHR2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0Y2hpbGRyZW5bIGkgXS50cmF2ZXJzZVZpc2libGUoIGNhbGxiYWNrICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR0cmF2ZXJzZUFuY2VzdG9yczogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcblxuXHRcdGlmICggcGFyZW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRjYWxsYmFjayggcGFyZW50ICk7XG5cblx0XHRcdHBhcmVudC50cmF2ZXJzZUFuY2VzdG9ycyggY2FsbGJhY2sgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHVwZGF0ZU1hdHJpeDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5tYXRyaXguY29tcG9zZSggdGhpcy5wb3NpdGlvbiwgdGhpcy5xdWF0ZXJuaW9uLCB0aGlzLnNjYWxlICk7XG5cblx0XHR0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdH0sXG5cblx0dXBkYXRlTWF0cml4V29ybGQ6IGZ1bmN0aW9uICggZm9yY2UgKSB7XG5cblx0XHRpZiAoIHRoaXMubWF0cml4QXV0b1VwZGF0ZSApIHRoaXMudXBkYXRlTWF0cml4KCk7XG5cblx0XHRpZiAoIHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSB8fCBmb3JjZSApIHtcblxuXHRcdFx0aWYgKCB0aGlzLnBhcmVudCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHR0aGlzLm1hdHJpeFdvcmxkLmNvcHkoIHRoaXMubWF0cml4ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKCB0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCwgdGhpcy5tYXRyaXggKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSBmYWxzZTtcblxuXHRcdFx0Zm9yY2UgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXBkYXRlIGNoaWxkcmVuXG5cblx0XHR2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0Y2hpbGRyZW5bIGkgXS51cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0Ly8gbWV0YSBpcyBhIHN0cmluZyB3aGVuIGNhbGxlZCBmcm9tIEpTT04uc3RyaW5naWZ5XG5cdFx0dmFyIGlzUm9vdE9iamVjdCA9ICggbWV0YSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBtZXRhID09PSAnc3RyaW5nJyApO1xuXG5cdFx0dmFyIG91dHB1dCA9IHt9O1xuXG5cdFx0Ly8gbWV0YSBpcyBhIGhhc2ggdXNlZCB0byBjb2xsZWN0IGdlb21ldHJpZXMsIG1hdGVyaWFscy5cblx0XHQvLyBub3QgcHJvdmlkaW5nIGl0IGltcGxpZXMgdGhhdCB0aGlzIGlzIHRoZSByb290IG9iamVjdFxuXHRcdC8vIGJlaW5nIHNlcmlhbGl6ZWQuXG5cdFx0aWYgKCBpc1Jvb3RPYmplY3QgKSB7XG5cblx0XHRcdC8vIGluaXRpYWxpemUgbWV0YSBvYmpcblx0XHRcdG1ldGEgPSB7XG5cdFx0XHRcdGdlb21ldHJpZXM6IHt9LFxuXHRcdFx0XHRtYXRlcmlhbHM6IHt9LFxuXHRcdFx0XHR0ZXh0dXJlczoge30sXG5cdFx0XHRcdGltYWdlczoge30sXG5cdFx0XHRcdHNoYXBlczoge31cblx0XHRcdH07XG5cblx0XHRcdG91dHB1dC5tZXRhZGF0YSA9IHtcblx0XHRcdFx0dmVyc2lvbjogNC41LFxuXHRcdFx0XHR0eXBlOiAnT2JqZWN0Jyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnT2JqZWN0M0QudG9KU09OJ1xuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdC8vIHN0YW5kYXJkIE9iamVjdDNEIHNlcmlhbGl6YXRpb25cblxuXHRcdHZhciBvYmplY3QgPSB7fTtcblxuXHRcdG9iamVjdC51dWlkID0gdGhpcy51dWlkO1xuXHRcdG9iamVjdC50eXBlID0gdGhpcy50eXBlO1xuXG5cdFx0aWYgKCB0aGlzLm5hbWUgIT09ICcnICkgb2JqZWN0Lm5hbWUgPSB0aGlzLm5hbWU7XG5cdFx0aWYgKCB0aGlzLmNhc3RTaGFkb3cgPT09IHRydWUgKSBvYmplY3QuY2FzdFNoYWRvdyA9IHRydWU7XG5cdFx0aWYgKCB0aGlzLnJlY2VpdmVTaGFkb3cgPT09IHRydWUgKSBvYmplY3QucmVjZWl2ZVNoYWRvdyA9IHRydWU7XG5cdFx0aWYgKCB0aGlzLnZpc2libGUgPT09IGZhbHNlICkgb2JqZWN0LnZpc2libGUgPSBmYWxzZTtcblx0XHRpZiAoIHRoaXMuZnJ1c3R1bUN1bGxlZCA9PT0gZmFsc2UgKSBvYmplY3QuZnJ1c3R1bUN1bGxlZCA9IGZhbHNlO1xuXHRcdGlmICggdGhpcy5yZW5kZXJPcmRlciAhPT0gMCApIG9iamVjdC5yZW5kZXJPcmRlciA9IHRoaXMucmVuZGVyT3JkZXI7XG5cdFx0aWYgKCBKU09OLnN0cmluZ2lmeSggdGhpcy51c2VyRGF0YSApICE9PSAne30nICkgb2JqZWN0LnVzZXJEYXRhID0gdGhpcy51c2VyRGF0YTtcblxuXHRcdG9iamVjdC5tYXRyaXggPSB0aGlzLm1hdHJpeC50b0FycmF5KCk7XG5cblx0XHRpZiAoIHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9PT0gZmFsc2UgKSBvYmplY3QubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0Ly9cblxuXHRcdGZ1bmN0aW9uIHNlcmlhbGl6ZSggbGlicmFyeSwgZWxlbWVudCApIHtcblxuXHRcdFx0aWYgKCBsaWJyYXJ5WyBlbGVtZW50LnV1aWQgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGxpYnJhcnlbIGVsZW1lbnQudXVpZCBdID0gZWxlbWVudC50b0pTT04oIG1ldGEgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZWxlbWVudC51dWlkO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmdlb21ldHJ5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG9iamVjdC5nZW9tZXRyeSA9IHNlcmlhbGl6ZSggbWV0YS5nZW9tZXRyaWVzLCB0aGlzLmdlb21ldHJ5ICk7XG5cblx0XHRcdHZhciBwYXJhbWV0ZXJzID0gdGhpcy5nZW9tZXRyeS5wYXJhbWV0ZXJzO1xuXG5cdFx0XHRpZiAoIHBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCAmJiBwYXJhbWV0ZXJzLnNoYXBlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHZhciBzaGFwZXMgPSBwYXJhbWV0ZXJzLnNoYXBlcztcblxuXHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHNoYXBlcyApICkge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gc2hhcGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBzaGFwZSA9IHNoYXBlc1sgaSBdO1xuXG5cdFx0XHRcdFx0XHRzZXJpYWxpemUoIG1ldGEuc2hhcGVzLCBzaGFwZSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRzZXJpYWxpemUoIG1ldGEuc2hhcGVzLCBzaGFwZXMgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5tYXRlcmlhbCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHRoaXMubWF0ZXJpYWwgKSApIHtcblxuXHRcdFx0XHR2YXIgdXVpZHMgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLm1hdGVyaWFsLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHR1dWlkcy5wdXNoKCBzZXJpYWxpemUoIG1ldGEubWF0ZXJpYWxzLCB0aGlzLm1hdGVyaWFsWyBpIF0gKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRvYmplY3QubWF0ZXJpYWwgPSB1dWlkcztcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRvYmplY3QubWF0ZXJpYWwgPSBzZXJpYWxpemUoIG1ldGEubWF0ZXJpYWxzLCB0aGlzLm1hdGVyaWFsICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHRpZiAoIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0b2JqZWN0LmNoaWxkcmVuID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdG9iamVjdC5jaGlsZHJlbi5wdXNoKCB0aGlzLmNoaWxkcmVuWyBpIF0udG9KU09OKCBtZXRhICkub2JqZWN0ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggaXNSb290T2JqZWN0ICkge1xuXG5cdFx0XHR2YXIgZ2VvbWV0cmllcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuZ2VvbWV0cmllcyApO1xuXHRcdFx0dmFyIG1hdGVyaWFscyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEubWF0ZXJpYWxzICk7XG5cdFx0XHR2YXIgdGV4dHVyZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLnRleHR1cmVzICk7XG5cdFx0XHR2YXIgaW1hZ2VzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5pbWFnZXMgKTtcblx0XHRcdHZhciBzaGFwZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLnNoYXBlcyApO1xuXG5cdFx0XHRpZiAoIGdlb21ldHJpZXMubGVuZ3RoID4gMCApIG91dHB1dC5nZW9tZXRyaWVzID0gZ2VvbWV0cmllcztcblx0XHRcdGlmICggbWF0ZXJpYWxzLmxlbmd0aCA+IDAgKSBvdXRwdXQubWF0ZXJpYWxzID0gbWF0ZXJpYWxzO1xuXHRcdFx0aWYgKCB0ZXh0dXJlcy5sZW5ndGggPiAwICkgb3V0cHV0LnRleHR1cmVzID0gdGV4dHVyZXM7XG5cdFx0XHRpZiAoIGltYWdlcy5sZW5ndGggPiAwICkgb3V0cHV0LmltYWdlcyA9IGltYWdlcztcblx0XHRcdGlmICggc2hhcGVzLmxlbmd0aCA+IDAgKSBvdXRwdXQuc2hhcGVzID0gc2hhcGVzO1xuXG5cdFx0fVxuXG5cdFx0b3V0cHV0Lm9iamVjdCA9IG9iamVjdDtcblxuXHRcdHJldHVybiBvdXRwdXQ7XG5cblx0XHQvLyBleHRyYWN0IGRhdGEgZnJvbSB0aGUgY2FjaGUgaGFzaFxuXHRcdC8vIHJlbW92ZSBtZXRhZGF0YSBvbiBlYWNoIGl0ZW1cblx0XHQvLyBhbmQgcmV0dXJuIGFzIGFycmF5XG5cdFx0ZnVuY3Rpb24gZXh0cmFjdEZyb21DYWNoZSggY2FjaGUgKSB7XG5cblx0XHRcdHZhciB2YWx1ZXMgPSBbXTtcblx0XHRcdGZvciAoIHZhciBrZXkgaW4gY2FjaGUgKSB7XG5cblx0XHRcdFx0dmFyIGRhdGEgPSBjYWNoZVsga2V5IF07XG5cdFx0XHRcdGRlbGV0ZSBkYXRhLm1ldGFkYXRhO1xuXHRcdFx0XHR2YWx1ZXMucHVzaCggZGF0YSApO1xuXG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdmFsdWVzO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICggcmVjdXJzaXZlICkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcywgcmVjdXJzaXZlICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xuXG5cdFx0aWYgKCByZWN1cnNpdmUgPT09IHVuZGVmaW5lZCApIHJlY3Vyc2l2ZSA9IHRydWU7XG5cblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcblxuXHRcdHRoaXMudXAuY29weSggc291cmNlLnVwICk7XG5cblx0XHR0aGlzLnBvc2l0aW9uLmNvcHkoIHNvdXJjZS5wb3NpdGlvbiApO1xuXHRcdHRoaXMucXVhdGVybmlvbi5jb3B5KCBzb3VyY2UucXVhdGVybmlvbiApO1xuXHRcdHRoaXMuc2NhbGUuY29weSggc291cmNlLnNjYWxlICk7XG5cblx0XHR0aGlzLm1hdHJpeC5jb3B5KCBzb3VyY2UubWF0cml4ICk7XG5cdFx0dGhpcy5tYXRyaXhXb3JsZC5jb3B5KCBzb3VyY2UubWF0cml4V29ybGQgKTtcblxuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhBdXRvVXBkYXRlO1xuXHRcdHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlO1xuXG5cdFx0dGhpcy5sYXllcnMubWFzayA9IHNvdXJjZS5sYXllcnMubWFzaztcblx0XHR0aGlzLnZpc2libGUgPSBzb3VyY2UudmlzaWJsZTtcblxuXHRcdHRoaXMuY2FzdFNoYWRvdyA9IHNvdXJjZS5jYXN0U2hhZG93O1xuXHRcdHRoaXMucmVjZWl2ZVNoYWRvdyA9IHNvdXJjZS5yZWNlaXZlU2hhZG93O1xuXG5cdFx0dGhpcy5mcnVzdHVtQ3VsbGVkID0gc291cmNlLmZydXN0dW1DdWxsZWQ7XG5cdFx0dGhpcy5yZW5kZXJPcmRlciA9IHNvdXJjZS5yZW5kZXJPcmRlcjtcblxuXHRcdHRoaXMudXNlckRhdGEgPSBKU09OLnBhcnNlKCBKU09OLnN0cmluZ2lmeSggc291cmNlLnVzZXJEYXRhICkgKTtcblxuXHRcdGlmICggcmVjdXJzaXZlID09PSB0cnVlICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBzb3VyY2UuY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBjaGlsZCA9IHNvdXJjZS5jaGlsZHJlblsgaSBdO1xuXHRcdFx0XHR0aGlzLmFkZCggY2hpbGQuY2xvbmUoKSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuKi9cblxuZnVuY3Rpb24gQ2FtZXJhKCkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ2FtZXJhJztcblxuXHR0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7XG5cdHRoaXMucHJvamVjdGlvbk1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cbn1cblxuQ2FtZXJhLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IENhbWVyYSxcblxuXHRpc0NhbWVyYTogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlLCByZWN1cnNpdmUgKTtcblxuXHRcdHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkoIHNvdXJjZS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblx0XHR0aGlzLnByb2plY3Rpb25NYXRyaXguY29weSggc291cmNlLnByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0V29ybGREaXJlY3Rpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRXb3JsZERpcmVjdGlvbiggdGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkNhbWVyYTogLmdldFdvcmxkRGlyZWN0aW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmdldFdvcmxkUXVhdGVybmlvbiggcXVhdGVybmlvbiApO1xuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LnNldCggMCwgMCwgLSAxICkuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR1cGRhdGVNYXRyaXhXb3JsZDogZnVuY3Rpb24gKCBmb3JjZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKCB0aGlzLCBmb3JjZSApO1xuXG5cdFx0dGhpcy5tYXRyaXhXb3JsZEludmVyc2UuZ2V0SW52ZXJzZSggdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBhcm9zZSAvIGh0dHA6Ly9naXRodWIuY29tL2Fyb3NlXG4gKi9cblxuZnVuY3Rpb24gT3J0aG9ncmFwaGljQ2FtZXJhKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIHtcblxuXHRDYW1lcmEuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdPcnRob2dyYXBoaWNDYW1lcmEnO1xuXG5cdHRoaXMuem9vbSA9IDE7XG5cdHRoaXMudmlldyA9IG51bGw7XG5cblx0dGhpcy5sZWZ0ID0gbGVmdDtcblx0dGhpcy5yaWdodCA9IHJpZ2h0O1xuXHR0aGlzLnRvcCA9IHRvcDtcblx0dGhpcy5ib3R0b20gPSBib3R0b207XG5cblx0dGhpcy5uZWFyID0gKCBuZWFyICE9PSB1bmRlZmluZWQgKSA/IG5lYXIgOiAwLjE7XG5cdHRoaXMuZmFyID0gKCBmYXIgIT09IHVuZGVmaW5lZCApID8gZmFyIDogMjAwMDtcblxuXHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxufVxuXG5PcnRob2dyYXBoaWNDYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQ2FtZXJhLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IE9ydGhvZ3JhcGhpY0NhbWVyYSxcblxuXHRpc09ydGhvZ3JhcGhpY0NhbWVyYTogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xuXG5cdFx0Q2FtZXJhLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSwgcmVjdXJzaXZlICk7XG5cblx0XHR0aGlzLmxlZnQgPSBzb3VyY2UubGVmdDtcblx0XHR0aGlzLnJpZ2h0ID0gc291cmNlLnJpZ2h0O1xuXHRcdHRoaXMudG9wID0gc291cmNlLnRvcDtcblx0XHR0aGlzLmJvdHRvbSA9IHNvdXJjZS5ib3R0b207XG5cdFx0dGhpcy5uZWFyID0gc291cmNlLm5lYXI7XG5cdFx0dGhpcy5mYXIgPSBzb3VyY2UuZmFyO1xuXG5cdFx0dGhpcy56b29tID0gc291cmNlLnpvb207XG5cdFx0dGhpcy52aWV3ID0gc291cmNlLnZpZXcgPT09IG51bGwgPyBudWxsIDogT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS52aWV3ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFZpZXdPZmZzZXQ6IGZ1bmN0aW9uICggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkge1xuXG5cdFx0aWYgKCB0aGlzLnZpZXcgPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMudmlldyA9IHtcblx0XHRcdFx0ZW5hYmxlZDogdHJ1ZSxcblx0XHRcdFx0ZnVsbFdpZHRoOiAxLFxuXHRcdFx0XHRmdWxsSGVpZ2h0OiAxLFxuXHRcdFx0XHRvZmZzZXRYOiAwLFxuXHRcdFx0XHRvZmZzZXRZOiAwLFxuXHRcdFx0XHR3aWR0aDogMSxcblx0XHRcdFx0aGVpZ2h0OiAxXG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0dGhpcy52aWV3LmVuYWJsZWQgPSB0cnVlO1xuXHRcdHRoaXMudmlldy5mdWxsV2lkdGggPSBmdWxsV2lkdGg7XG5cdFx0dGhpcy52aWV3LmZ1bGxIZWlnaHQgPSBmdWxsSGVpZ2h0O1xuXHRcdHRoaXMudmlldy5vZmZzZXRYID0geDtcblx0XHR0aGlzLnZpZXcub2Zmc2V0WSA9IHk7XG5cdFx0dGhpcy52aWV3LndpZHRoID0gd2lkdGg7XG5cdFx0dGhpcy52aWV3LmhlaWdodCA9IGhlaWdodDtcblxuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdH0sXG5cblx0Y2xlYXJWaWV3T2Zmc2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy52aWV3LmVuYWJsZWQgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdH0sXG5cblx0dXBkYXRlUHJvamVjdGlvbk1hdHJpeDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGR4ID0gKCB0aGlzLnJpZ2h0IC0gdGhpcy5sZWZ0ICkgLyAoIDIgKiB0aGlzLnpvb20gKTtcblx0XHR2YXIgZHkgPSAoIHRoaXMudG9wIC0gdGhpcy5ib3R0b20gKSAvICggMiAqIHRoaXMuem9vbSApO1xuXHRcdHZhciBjeCA9ICggdGhpcy5yaWdodCArIHRoaXMubGVmdCApIC8gMjtcblx0XHR2YXIgY3kgPSAoIHRoaXMudG9wICsgdGhpcy5ib3R0b20gKSAvIDI7XG5cblx0XHR2YXIgbGVmdCA9IGN4IC0gZHg7XG5cdFx0dmFyIHJpZ2h0ID0gY3ggKyBkeDtcblx0XHR2YXIgdG9wID0gY3kgKyBkeTtcblx0XHR2YXIgYm90dG9tID0gY3kgLSBkeTtcblxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICYmIHRoaXMudmlldy5lbmFibGVkICkge1xuXG5cdFx0XHR2YXIgem9vbVcgPSB0aGlzLnpvb20gLyAoIHRoaXMudmlldy53aWR0aCAvIHRoaXMudmlldy5mdWxsV2lkdGggKTtcblx0XHRcdHZhciB6b29tSCA9IHRoaXMuem9vbSAvICggdGhpcy52aWV3LmhlaWdodCAvIHRoaXMudmlldy5mdWxsSGVpZ2h0ICk7XG5cdFx0XHR2YXIgc2NhbGVXID0gKCB0aGlzLnJpZ2h0IC0gdGhpcy5sZWZ0ICkgLyB0aGlzLnZpZXcud2lkdGg7XG5cdFx0XHR2YXIgc2NhbGVIID0gKCB0aGlzLnRvcCAtIHRoaXMuYm90dG9tICkgLyB0aGlzLnZpZXcuaGVpZ2h0O1xuXG5cdFx0XHRsZWZ0ICs9IHNjYWxlVyAqICggdGhpcy52aWV3Lm9mZnNldFggLyB6b29tVyApO1xuXHRcdFx0cmlnaHQgPSBsZWZ0ICsgc2NhbGVXICogKCB0aGlzLnZpZXcud2lkdGggLyB6b29tVyApO1xuXHRcdFx0dG9wIC09IHNjYWxlSCAqICggdGhpcy52aWV3Lm9mZnNldFkgLyB6b29tSCApO1xuXHRcdFx0Ym90dG9tID0gdG9wIC0gc2NhbGVIICogKCB0aGlzLnZpZXcuaGVpZ2h0IC8gem9vbUggKTtcblxuXHRcdH1cblxuXHRcdHRoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlT3J0aG9ncmFwaGljKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIHRoaXMubmVhciwgdGhpcy5mYXIgKTtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGRhdGEgPSBPYmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRcdGRhdGEub2JqZWN0Lnpvb20gPSB0aGlzLnpvb207XG5cdFx0ZGF0YS5vYmplY3QubGVmdCA9IHRoaXMubGVmdDtcblx0XHRkYXRhLm9iamVjdC5yaWdodCA9IHRoaXMucmlnaHQ7XG5cdFx0ZGF0YS5vYmplY3QudG9wID0gdGhpcy50b3A7XG5cdFx0ZGF0YS5vYmplY3QuYm90dG9tID0gdGhpcy5ib3R0b207XG5cdFx0ZGF0YS5vYmplY3QubmVhciA9IHRoaXMubmVhcjtcblx0XHRkYXRhLm9iamVjdC5mYXIgPSB0aGlzLmZhcjtcblxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICkgZGF0YS5vYmplY3QudmlldyA9IE9iamVjdC5hc3NpZ24oIHt9LCB0aGlzLnZpZXcgKTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIEZhY2UzKCBhLCBiLCBjLCBub3JtYWwsIGNvbG9yLCBtYXRlcmlhbEluZGV4ICkge1xuXG5cdHRoaXMuYSA9IGE7XG5cdHRoaXMuYiA9IGI7XG5cdHRoaXMuYyA9IGM7XG5cblx0dGhpcy5ub3JtYWwgPSAoIG5vcm1hbCAmJiBub3JtYWwuaXNWZWN0b3IzICkgPyBub3JtYWwgOiBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLnZlcnRleE5vcm1hbHMgPSBBcnJheS5pc0FycmF5KCBub3JtYWwgKSA/IG5vcm1hbCA6IFtdO1xuXG5cdHRoaXMuY29sb3IgPSAoIGNvbG9yICYmIGNvbG9yLmlzQ29sb3IgKSA/IGNvbG9yIDogbmV3IENvbG9yKCk7XG5cdHRoaXMudmVydGV4Q29sb3JzID0gQXJyYXkuaXNBcnJheSggY29sb3IgKSA/IGNvbG9yIDogW107XG5cblx0dGhpcy5tYXRlcmlhbEluZGV4ID0gbWF0ZXJpYWxJbmRleCAhPT0gdW5kZWZpbmVkID8gbWF0ZXJpYWxJbmRleCA6IDA7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggRmFjZTMucHJvdG90eXBlLCB7XG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5hID0gc291cmNlLmE7XG5cdFx0dGhpcy5iID0gc291cmNlLmI7XG5cdFx0dGhpcy5jID0gc291cmNlLmM7XG5cblx0XHR0aGlzLm5vcm1hbC5jb3B5KCBzb3VyY2Uubm9ybWFsICk7XG5cdFx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHRcdHRoaXMubWF0ZXJpYWxJbmRleCA9IHNvdXJjZS5tYXRlcmlhbEluZGV4O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHNvdXJjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnZlcnRleE5vcm1hbHNbIGkgXSA9IHNvdXJjZS52ZXJ0ZXhOb3JtYWxzWyBpIF0uY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBzb3VyY2UudmVydGV4Q29sb3JzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnZlcnRleENvbG9yc1sgaSBdID0gc291cmNlLnZlcnRleENvbG9yc1sgaSBdLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBraWxlIC8gaHR0cDovL2tpbGUuc3RyYXZhZ2FuemEub3JnL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxudmFyIGdlb21ldHJ5SWQgPSAwOyAvLyBHZW9tZXRyeSB1c2VzIGV2ZW4gbnVtYmVycyBhcyBJZFxuXG5mdW5jdGlvbiBHZW9tZXRyeSgpIHtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IGdlb21ldHJ5SWQgKz0gMiB9ICk7XG5cblx0dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0dGhpcy5uYW1lID0gJyc7XG5cdHRoaXMudHlwZSA9ICdHZW9tZXRyeSc7XG5cblx0dGhpcy52ZXJ0aWNlcyA9IFtdO1xuXHR0aGlzLmNvbG9ycyA9IFtdO1xuXHR0aGlzLmZhY2VzID0gW107XG5cdHRoaXMuZmFjZVZlcnRleFV2cyA9IFtbXV07XG5cblx0dGhpcy5tb3JwaFRhcmdldHMgPSBbXTtcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBbXTtcblxuXHR0aGlzLnNraW5XZWlnaHRzID0gW107XG5cdHRoaXMuc2tpbkluZGljZXMgPSBbXTtcblxuXHR0aGlzLmxpbmVEaXN0YW5jZXMgPSBbXTtcblxuXHR0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDtcblx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7XG5cblx0Ly8gdXBkYXRlIGZsYWdzXG5cblx0dGhpcy5lbGVtZW50c05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy51dnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5jb2xvcnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMubGluZURpc3RhbmNlc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5ncm91cHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cbn1cblxuR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEdlb21ldHJ5LFxuXG5cdGlzR2VvbWV0cnk6IHRydWUsXG5cblx0YXBwbHlNYXRyaXg6IGZ1bmN0aW9uICggbWF0cml4ICkge1xuXG5cdFx0dmFyIG5vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCkuZ2V0Tm9ybWFsTWF0cml4KCBtYXRyaXggKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdmVydGV4ID0gdGhpcy52ZXJ0aWNlc1sgaSBdO1xuXHRcdFx0dmVydGV4LmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSB0aGlzLmZhY2VzWyBpIF07XG5cdFx0XHRmYWNlLm5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdGZhY2UudmVydGV4Tm9ybWFsc1sgaiBdLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdH1cblxuXHRcdHRoaXMudmVydGljZXNOZWVkVXBkYXRlID0gdHJ1ZTtcblx0XHR0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gdHJ1ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm90YXRlWDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB4LWF4aXNcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWCggYW5nbGUgKSB7XG5cblx0XHRcdG0xLm1ha2VSb3RhdGlvblgoIGFuZ2xlICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cm90YXRlWTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB5LWF4aXNcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWSggYW5nbGUgKSB7XG5cblx0XHRcdG0xLm1ha2VSb3RhdGlvblkoIGFuZ2xlICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cm90YXRlWjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB6LWF4aXNcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWiggYW5nbGUgKSB7XG5cblx0XHRcdG0xLm1ha2VSb3RhdGlvblooIGFuZ2xlICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyB0cmFuc2xhdGUgZ2VvbWV0cnlcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdHJhbnNsYXRlKCB4LCB5LCB6ICkge1xuXG5cdFx0XHRtMS5tYWtlVHJhbnNsYXRpb24oIHgsIHksIHogKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRzY2FsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gc2NhbGUgZ2VvbWV0cnlcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2NhbGUoIHgsIHksIHogKSB7XG5cblx0XHRcdG0xLm1ha2VTY2FsZSggeCwgeSwgeiApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGxvb2tBdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9iaiA9IG5ldyBPYmplY3QzRCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGxvb2tBdCggdmVjdG9yICkge1xuXG5cdFx0XHRvYmoubG9va0F0KCB2ZWN0b3IgKTtcblxuXHRcdFx0b2JqLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBvYmoubWF0cml4ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRmcm9tQnVmZmVyR2VvbWV0cnk6IGZ1bmN0aW9uICggZ2VvbWV0cnkgKSB7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGluZGljZXMgPSBnZW9tZXRyeS5pbmRleCAhPT0gbnVsbCA/IGdlb21ldHJ5LmluZGV4LmFycmF5IDogdW5kZWZpbmVkO1xuXHRcdHZhciBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcblxuXHRcdHZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xuXHRcdHZhciBub3JtYWxzID0gYXR0cmlidXRlcy5ub3JtYWwgIT09IHVuZGVmaW5lZCA/IGF0dHJpYnV0ZXMubm9ybWFsLmFycmF5IDogdW5kZWZpbmVkO1xuXHRcdHZhciBjb2xvcnMgPSBhdHRyaWJ1dGVzLmNvbG9yICE9PSB1bmRlZmluZWQgPyBhdHRyaWJ1dGVzLmNvbG9yLmFycmF5IDogdW5kZWZpbmVkO1xuXHRcdHZhciB1dnMgPSBhdHRyaWJ1dGVzLnV2ICE9PSB1bmRlZmluZWQgPyBhdHRyaWJ1dGVzLnV2LmFycmF5IDogdW5kZWZpbmVkO1xuXHRcdHZhciB1dnMyID0gYXR0cmlidXRlcy51djIgIT09IHVuZGVmaW5lZCA/IGF0dHJpYnV0ZXMudXYyLmFycmF5IDogdW5kZWZpbmVkO1xuXG5cdFx0aWYgKCB1dnMyICE9PSB1bmRlZmluZWQgKSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDEgXSA9IFtdO1xuXG5cdFx0dmFyIHRlbXBOb3JtYWxzID0gW107XG5cdFx0dmFyIHRlbXBVVnMgPSBbXTtcblx0XHR2YXIgdGVtcFVWczIgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaiA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpICs9IDMsIGogKz0gMiApIHtcblxuXHRcdFx0c2NvcGUudmVydGljZXMucHVzaCggbmV3IFZlY3RvcjMoIHBvc2l0aW9uc1sgaSBdLCBwb3NpdGlvbnNbIGkgKyAxIF0sIHBvc2l0aW9uc1sgaSArIDIgXSApICk7XG5cblx0XHRcdGlmICggbm9ybWFscyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRlbXBOb3JtYWxzLnB1c2goIG5ldyBWZWN0b3IzKCBub3JtYWxzWyBpIF0sIG5vcm1hbHNbIGkgKyAxIF0sIG5vcm1hbHNbIGkgKyAyIF0gKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggY29sb3JzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0c2NvcGUuY29sb3JzLnB1c2goIG5ldyBDb2xvciggY29sb3JzWyBpIF0sIGNvbG9yc1sgaSArIDEgXSwgY29sb3JzWyBpICsgMiBdICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHV2cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRlbXBVVnMucHVzaCggbmV3IFZlY3RvcjIoIHV2c1sgaiBdLCB1dnNbIGogKyAxIF0gKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdXZzMiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRlbXBVVnMyLnB1c2goIG5ldyBWZWN0b3IyKCB1dnMyWyBqIF0sIHV2czJbIGogKyAxIF0gKSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBhZGRGYWNlKCBhLCBiLCBjLCBtYXRlcmlhbEluZGV4ICkge1xuXG5cdFx0XHR2YXIgdmVydGV4Tm9ybWFscyA9IG5vcm1hbHMgIT09IHVuZGVmaW5lZCA/IFsgdGVtcE5vcm1hbHNbIGEgXS5jbG9uZSgpLCB0ZW1wTm9ybWFsc1sgYiBdLmNsb25lKCksIHRlbXBOb3JtYWxzWyBjIF0uY2xvbmUoKSBdIDogW107XG5cdFx0XHR2YXIgdmVydGV4Q29sb3JzID0gY29sb3JzICE9PSB1bmRlZmluZWQgPyBbIHNjb3BlLmNvbG9yc1sgYSBdLmNsb25lKCksIHNjb3BlLmNvbG9yc1sgYiBdLmNsb25lKCksIHNjb3BlLmNvbG9yc1sgYyBdLmNsb25lKCkgXSA6IFtdO1xuXG5cdFx0XHR2YXIgZmFjZSA9IG5ldyBGYWNlMyggYSwgYiwgYywgdmVydGV4Tm9ybWFscywgdmVydGV4Q29sb3JzLCBtYXRlcmlhbEluZGV4ICk7XG5cblx0XHRcdHNjb3BlLmZhY2VzLnB1c2goIGZhY2UgKTtcblxuXHRcdFx0aWYgKCB1dnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRzY29wZS5mYWNlVmVydGV4VXZzWyAwIF0ucHVzaCggWyB0ZW1wVVZzWyBhIF0uY2xvbmUoKSwgdGVtcFVWc1sgYiBdLmNsb25lKCksIHRlbXBVVnNbIGMgXS5jbG9uZSgpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHV2czIgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRzY29wZS5mYWNlVmVydGV4VXZzWyAxIF0ucHVzaCggWyB0ZW1wVVZzMlsgYSBdLmNsb25lKCksIHRlbXBVVnMyWyBiIF0uY2xvbmUoKSwgdGVtcFVWczJbIGMgXS5jbG9uZSgpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwcztcblxuXHRcdGlmICggZ3JvdXBzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07XG5cblx0XHRcdFx0dmFyIHN0YXJ0ID0gZ3JvdXAuc3RhcnQ7XG5cdFx0XHRcdHZhciBjb3VudCA9IGdyb3VwLmNvdW50O1xuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gc3RhcnQsIGpsID0gc3RhcnQgKyBjb3VudDsgaiA8IGpsOyBqICs9IDMgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGluZGljZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0YWRkRmFjZSggaW5kaWNlc1sgaiBdLCBpbmRpY2VzWyBqICsgMSBdLCBpbmRpY2VzWyBqICsgMiBdLCBncm91cC5tYXRlcmlhbEluZGV4ICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRhZGRGYWNlKCBqLCBqICsgMSwgaiArIDIsIGdyb3VwLm1hdGVyaWFsSW5kZXggKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGlmICggaW5kaWNlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0XHRhZGRGYWNlKCBpbmRpY2VzWyBpIF0sIGluZGljZXNbIGkgKyAxIF0sIGluZGljZXNbIGkgKyAyIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aCAvIDM7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRcdGFkZEZhY2UoIGksIGkgKyAxLCBpICsgMiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTtcblxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBnZW9tZXRyeS5ib3VuZGluZ0JveC5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNlbnRlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9mZnNldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY2VudGVyKCkge1xuXG5cdFx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlciggb2Zmc2V0ICkubmVnYXRlKCk7XG5cblx0XHRcdHRoaXMudHJhbnNsYXRlKCBvZmZzZXQueCwgb2Zmc2V0LnksIG9mZnNldC56ICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0bm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0dmFyIGNlbnRlciA9IHRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyO1xuXHRcdHZhciByYWRpdXMgPSB0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cztcblxuXHRcdHZhciBzID0gcmFkaXVzID09PSAwID8gMSA6IDEuMCAvIHJhZGl1cztcblxuXHRcdHZhciBtYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHRcdG1hdHJpeC5zZXQoXG5cdFx0XHRzLCAwLCAwLCAtIHMgKiBjZW50ZXIueCxcblx0XHRcdDAsIHMsIDAsIC0gcyAqIGNlbnRlci55LFxuXHRcdFx0MCwgMCwgcywgLSBzICogY2VudGVyLnosXG5cdFx0XHQwLCAwLCAwLCAxXG5cdFx0KTtcblxuXHRcdHRoaXMuYXBwbHlNYXRyaXgoIG1hdHJpeCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb21wdXRlRmFjZU5vcm1hbHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBjYiA9IG5ldyBWZWN0b3IzKCksIGFiID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdGZvciAoIHZhciBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0dmFyIHZBID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5hIF07XG5cdFx0XHR2YXIgdkIgPSB0aGlzLnZlcnRpY2VzWyBmYWNlLmIgXTtcblx0XHRcdHZhciB2QyA9IHRoaXMudmVydGljZXNbIGZhY2UuYyBdO1xuXG5cdFx0XHRjYi5zdWJWZWN0b3JzKCB2QywgdkIgKTtcblx0XHRcdGFiLnN1YlZlY3RvcnMoIHZBLCB2QiApO1xuXHRcdFx0Y2IuY3Jvc3MoIGFiICk7XG5cblx0XHRcdGNiLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRmYWNlLm5vcm1hbC5jb3B5KCBjYiApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y29tcHV0ZVZlcnRleE5vcm1hbHM6IGZ1bmN0aW9uICggYXJlYVdlaWdodGVkICkge1xuXG5cdFx0aWYgKCBhcmVhV2VpZ2h0ZWQgPT09IHVuZGVmaW5lZCApIGFyZWFXZWlnaHRlZCA9IHRydWU7XG5cblx0XHR2YXIgdiwgdmwsIGYsIGZsLCBmYWNlLCB2ZXJ0aWNlcztcblxuXHRcdHZlcnRpY2VzID0gbmV3IEFycmF5KCB0aGlzLnZlcnRpY2VzLmxlbmd0aCApO1xuXG5cdFx0Zm9yICggdiA9IDAsIHZsID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGg7IHYgPCB2bDsgdiArKyApIHtcblxuXHRcdFx0dmVydGljZXNbIHYgXSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGFyZWFXZWlnaHRlZCApIHtcblxuXHRcdFx0Ly8gdmVydGV4IG5vcm1hbHMgd2VpZ2h0ZWQgYnkgdHJpYW5nbGUgYXJlYXNcblx0XHRcdC8vIGh0dHA6Ly93d3cuaXF1aWxlemxlcy5vcmcvd3d3L2FydGljbGVzL25vcm1hbHMvbm9ybWFscy5odG1cblxuXHRcdFx0dmFyIHZBLCB2QiwgdkM7XG5cdFx0XHR2YXIgY2IgPSBuZXcgVmVjdG9yMygpLCBhYiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdFx0ZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0XHR2QSA9IHRoaXMudmVydGljZXNbIGZhY2UuYSBdO1xuXHRcdFx0XHR2QiA9IHRoaXMudmVydGljZXNbIGZhY2UuYiBdO1xuXHRcdFx0XHR2QyA9IHRoaXMudmVydGljZXNbIGZhY2UuYyBdO1xuXG5cdFx0XHRcdGNiLnN1YlZlY3RvcnMoIHZDLCB2QiApO1xuXHRcdFx0XHRhYi5zdWJWZWN0b3JzKCB2QSwgdkIgKTtcblx0XHRcdFx0Y2IuY3Jvc3MoIGFiICk7XG5cblx0XHRcdFx0dmVydGljZXNbIGZhY2UuYSBdLmFkZCggY2IgKTtcblx0XHRcdFx0dmVydGljZXNbIGZhY2UuYiBdLmFkZCggY2IgKTtcblx0XHRcdFx0dmVydGljZXNbIGZhY2UuYyBdLmFkZCggY2IgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTtcblxuXHRcdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHRcdHZlcnRpY2VzWyBmYWNlLmEgXS5hZGQoIGZhY2Uubm9ybWFsICk7XG5cdFx0XHRcdHZlcnRpY2VzWyBmYWNlLmIgXS5hZGQoIGZhY2Uubm9ybWFsICk7XG5cdFx0XHRcdHZlcnRpY2VzWyBmYWNlLmMgXS5hZGQoIGZhY2Uubm9ybWFsICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZvciAoIHYgPSAwLCB2bCA9IHRoaXMudmVydGljZXMubGVuZ3RoOyB2IDwgdmw7IHYgKysgKSB7XG5cblx0XHRcdHZlcnRpY2VzWyB2IF0ubm9ybWFsaXplKCk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHR2YXIgdmVydGV4Tm9ybWFscyA9IGZhY2UudmVydGV4Tm9ybWFscztcblxuXHRcdFx0aWYgKCB2ZXJ0ZXhOb3JtYWxzLmxlbmd0aCA9PT0gMyApIHtcblxuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAwIF0uY29weSggdmVydGljZXNbIGZhY2UuYSBdICk7XG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDEgXS5jb3B5KCB2ZXJ0aWNlc1sgZmFjZS5iIF0gKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMiBdLmNvcHkoIHZlcnRpY2VzWyBmYWNlLmMgXSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDAgXSA9IHZlcnRpY2VzWyBmYWNlLmEgXS5jbG9uZSgpO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAxIF0gPSB2ZXJ0aWNlc1sgZmFjZS5iIF0uY2xvbmUoKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMiBdID0gdmVydGljZXNbIGZhY2UuYyBdLmNsb25lKCk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5mYWNlcy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNvbXB1dGVGbGF0VmVydGV4Tm9ybWFsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGYsIGZsLCBmYWNlO1xuXG5cdFx0dGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTtcblxuXHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07XG5cblx0XHRcdHZhciB2ZXJ0ZXhOb3JtYWxzID0gZmFjZS52ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRpZiAoIHZlcnRleE5vcm1hbHMubGVuZ3RoID09PSAzICkge1xuXG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDAgXS5jb3B5KCBmYWNlLm5vcm1hbCApO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAxIF0uY29weSggZmFjZS5ub3JtYWwgKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMiBdLmNvcHkoIGZhY2Uubm9ybWFsICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMCBdID0gZmFjZS5ub3JtYWwuY2xvbmUoKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMSBdID0gZmFjZS5ub3JtYWwuY2xvbmUoKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMiBdID0gZmFjZS5ub3JtYWwuY2xvbmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmZhY2VzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y29tcHV0ZU1vcnBoTm9ybWFsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGksIGlsLCBmLCBmbCwgZmFjZTtcblxuXHRcdC8vIHNhdmUgb3JpZ2luYWwgbm9ybWFsc1xuXHRcdC8vIC0gY3JlYXRlIHRlbXAgdmFyaWFibGVzIG9uIGZpcnN0IGFjY2Vzc1xuXHRcdC8vICAgb3RoZXJ3aXNlIGp1c3QgY29weSAoZm9yIGZhc3RlciByZXBlYXRlZCBjYWxscylcblxuXHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07XG5cblx0XHRcdGlmICggISBmYWNlLl9fb3JpZ2luYWxGYWNlTm9ybWFsICkge1xuXG5cdFx0XHRcdGZhY2UuX19vcmlnaW5hbEZhY2VOb3JtYWwgPSBmYWNlLm5vcm1hbC5jbG9uZSgpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGZhY2UuX19vcmlnaW5hbEZhY2VOb3JtYWwuY29weSggZmFjZS5ub3JtYWwgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoICEgZmFjZS5fX29yaWdpbmFsVmVydGV4Tm9ybWFscyApIGZhY2UuX19vcmlnaW5hbFZlcnRleE5vcm1hbHMgPSBbXTtcblxuXHRcdFx0Zm9yICggaSA9IDAsIGlsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdGlmICggISBmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzWyBpIF0gKSB7XG5cblx0XHRcdFx0XHRmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzWyBpIF0gPSBmYWNlLnZlcnRleE5vcm1hbHNbIGkgXS5jbG9uZSgpO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzWyBpIF0uY29weSggZmFjZS52ZXJ0ZXhOb3JtYWxzWyBpIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIHVzZSB0ZW1wIGdlb21ldHJ5IHRvIGNvbXB1dGUgZmFjZSBhbmQgdmVydGV4IG5vcm1hbHMgZm9yIGVhY2ggbW9ycGhcblxuXHRcdHZhciB0bXBHZW8gPSBuZXcgR2VvbWV0cnkoKTtcblx0XHR0bXBHZW8uZmFjZXMgPSB0aGlzLmZhY2VzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gdGhpcy5tb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdC8vIGNyZWF0ZSBvbiBmaXJzdCBhY2Nlc3NcblxuXHRcdFx0aWYgKCAhIHRoaXMubW9ycGhOb3JtYWxzWyBpIF0gKSB7XG5cblx0XHRcdFx0dGhpcy5tb3JwaE5vcm1hbHNbIGkgXSA9IHt9O1xuXHRcdFx0XHR0aGlzLm1vcnBoTm9ybWFsc1sgaSBdLmZhY2VOb3JtYWxzID0gW107XG5cdFx0XHRcdHRoaXMubW9ycGhOb3JtYWxzWyBpIF0udmVydGV4Tm9ybWFscyA9IFtdO1xuXG5cdFx0XHRcdHZhciBkc3ROb3JtYWxzRmFjZSA9IHRoaXMubW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHM7XG5cdFx0XHRcdHZhciBkc3ROb3JtYWxzVmVydGV4ID0gdGhpcy5tb3JwaE5vcm1hbHNbIGkgXS52ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRcdHZhciBmYWNlTm9ybWFsLCB2ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdFx0XHRmYWNlTm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzID0geyBhOiBuZXcgVmVjdG9yMygpLCBiOiBuZXcgVmVjdG9yMygpLCBjOiBuZXcgVmVjdG9yMygpIH07XG5cblx0XHRcdFx0XHRkc3ROb3JtYWxzRmFjZS5wdXNoKCBmYWNlTm9ybWFsICk7XG5cdFx0XHRcdFx0ZHN0Tm9ybWFsc1ZlcnRleC5wdXNoKCB2ZXJ0ZXhOb3JtYWxzICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBtb3JwaE5vcm1hbHMgPSB0aGlzLm1vcnBoTm9ybWFsc1sgaSBdO1xuXG5cdFx0XHQvLyBzZXQgdmVydGljZXMgdG8gbW9ycGggdGFyZ2V0XG5cblx0XHRcdHRtcEdlby52ZXJ0aWNlcyA9IHRoaXMubW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXM7XG5cblx0XHRcdC8vIGNvbXB1dGUgbW9ycGggbm9ybWFsc1xuXG5cdFx0XHR0bXBHZW8uY29tcHV0ZUZhY2VOb3JtYWxzKCk7XG5cdFx0XHR0bXBHZW8uY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtcblxuXHRcdFx0Ly8gc3RvcmUgbW9ycGggbm9ybWFsc1xuXG5cdFx0XHR2YXIgZmFjZU5vcm1hbCwgdmVydGV4Tm9ybWFscztcblxuXHRcdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHRcdGZhY2VOb3JtYWwgPSBtb3JwaE5vcm1hbHMuZmFjZU5vcm1hbHNbIGYgXTtcblx0XHRcdFx0dmVydGV4Tm9ybWFscyA9IG1vcnBoTm9ybWFscy52ZXJ0ZXhOb3JtYWxzWyBmIF07XG5cblx0XHRcdFx0ZmFjZU5vcm1hbC5jb3B5KCBmYWNlLm5vcm1hbCApO1xuXG5cdFx0XHRcdHZlcnRleE5vcm1hbHMuYS5jb3B5KCBmYWNlLnZlcnRleE5vcm1hbHNbIDAgXSApO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzLmIuY29weSggZmFjZS52ZXJ0ZXhOb3JtYWxzWyAxIF0gKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFscy5jLmNvcHkoIGZhY2UudmVydGV4Tm9ybWFsc1sgMiBdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIHJlc3RvcmUgb3JpZ2luYWwgbm9ybWFsc1xuXG5cdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0ZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0ZmFjZS5ub3JtYWwgPSBmYWNlLl9fb3JpZ2luYWxGYWNlTm9ybWFsO1xuXHRcdFx0ZmFjZS52ZXJ0ZXhOb3JtYWxzID0gZmFjZS5fX29yaWdpbmFsVmVydGV4Tm9ybWFscztcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNvbXB1dGVCb3VuZGluZ0JveDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nQm94ID09PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gbmV3IEJveDMoKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuYm91bmRpbmdCb3guc2V0RnJvbVBvaW50cyggdGhpcy52ZXJ0aWNlcyApO1xuXG5cdH0sXG5cblx0Y29tcHV0ZUJvdW5kaW5nU3BoZXJlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlLnNldEZyb21Qb2ludHMoIHRoaXMudmVydGljZXMgKTtcblxuXHR9LFxuXG5cdG1lcmdlOiBmdW5jdGlvbiAoIGdlb21ldHJ5LCBtYXRyaXgsIG1hdGVyaWFsSW5kZXhPZmZzZXQgKSB7XG5cblx0XHRpZiAoICEgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0dlb21ldHJ5ICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5HZW9tZXRyeS5tZXJnZSgpOiBnZW9tZXRyeSBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuR2VvbWV0cnkuJywgZ2VvbWV0cnkgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHZhciBub3JtYWxNYXRyaXgsXG5cdFx0XHR2ZXJ0ZXhPZmZzZXQgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aCxcblx0XHRcdHZlcnRpY2VzMSA9IHRoaXMudmVydGljZXMsXG5cdFx0XHR2ZXJ0aWNlczIgPSBnZW9tZXRyeS52ZXJ0aWNlcyxcblx0XHRcdGZhY2VzMSA9IHRoaXMuZmFjZXMsXG5cdFx0XHRmYWNlczIgPSBnZW9tZXRyeS5mYWNlcyxcblx0XHRcdHV2czEgPSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDAgXSxcblx0XHRcdHV2czIgPSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyAwIF0sXG5cdFx0XHRjb2xvcnMxID0gdGhpcy5jb2xvcnMsXG5cdFx0XHRjb2xvcnMyID0gZ2VvbWV0cnkuY29sb3JzO1xuXG5cdFx0aWYgKCBtYXRlcmlhbEluZGV4T2Zmc2V0ID09PSB1bmRlZmluZWQgKSBtYXRlcmlhbEluZGV4T2Zmc2V0ID0gMDtcblxuXHRcdGlmICggbWF0cml4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG5vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCkuZ2V0Tm9ybWFsTWF0cml4KCBtYXRyaXggKTtcblxuXHRcdH1cblxuXHRcdC8vIHZlcnRpY2VzXG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gdmVydGljZXMyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdmVydGV4ID0gdmVydGljZXMyWyBpIF07XG5cblx0XHRcdHZhciB2ZXJ0ZXhDb3B5ID0gdmVydGV4LmNsb25lKCk7XG5cblx0XHRcdGlmICggbWF0cml4ICE9PSB1bmRlZmluZWQgKSB2ZXJ0ZXhDb3B5LmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cblx0XHRcdHZlcnRpY2VzMS5wdXNoKCB2ZXJ0ZXhDb3B5ICk7XG5cblx0XHR9XG5cblx0XHQvLyBjb2xvcnNcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBjb2xvcnMyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRjb2xvcnMxLnB1c2goIGNvbG9yczJbIGkgXS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBmYWNlc1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gZmFjZXMyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IGZhY2VzMlsgaSBdLCBmYWNlQ29weSwgbm9ybWFsLCBjb2xvcixcblx0XHRcdFx0ZmFjZVZlcnRleE5vcm1hbHMgPSBmYWNlLnZlcnRleE5vcm1hbHMsXG5cdFx0XHRcdGZhY2VWZXJ0ZXhDb2xvcnMgPSBmYWNlLnZlcnRleENvbG9ycztcblxuXHRcdFx0ZmFjZUNvcHkgPSBuZXcgRmFjZTMoIGZhY2UuYSArIHZlcnRleE9mZnNldCwgZmFjZS5iICsgdmVydGV4T2Zmc2V0LCBmYWNlLmMgKyB2ZXJ0ZXhPZmZzZXQgKTtcblx0XHRcdGZhY2VDb3B5Lm5vcm1hbC5jb3B5KCBmYWNlLm5vcm1hbCApO1xuXG5cdFx0XHRpZiAoIG5vcm1hbE1hdHJpeCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGZhY2VDb3B5Lm5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBmYWNlVmVydGV4Tm9ybWFscy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRub3JtYWwgPSBmYWNlVmVydGV4Tm9ybWFsc1sgaiBdLmNsb25lKCk7XG5cblx0XHRcdFx0aWYgKCBub3JtYWxNYXRyaXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdG5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmYWNlQ29weS52ZXJ0ZXhOb3JtYWxzLnB1c2goIG5vcm1hbCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZhY2VDb3B5LmNvbG9yLmNvcHkoIGZhY2UuY29sb3IgKTtcblxuXHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IGZhY2VWZXJ0ZXhDb2xvcnMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0Y29sb3IgPSBmYWNlVmVydGV4Q29sb3JzWyBqIF07XG5cdFx0XHRcdGZhY2VDb3B5LnZlcnRleENvbG9ycy5wdXNoKCBjb2xvci5jbG9uZSgpICk7XG5cblx0XHRcdH1cblxuXHRcdFx0ZmFjZUNvcHkubWF0ZXJpYWxJbmRleCA9IGZhY2UubWF0ZXJpYWxJbmRleCArIG1hdGVyaWFsSW5kZXhPZmZzZXQ7XG5cblx0XHRcdGZhY2VzMS5wdXNoKCBmYWNlQ29weSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXZzXG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB1dnMyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdXYgPSB1dnMyWyBpIF0sIHV2Q29weSA9IFtdO1xuXG5cdFx0XHRpZiAoIHV2ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IHV2Lmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdHV2Q29weS5wdXNoKCB1dlsgaiBdLmNsb25lKCkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR1dnMxLnB1c2goIHV2Q29weSApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0bWVyZ2VNZXNoOiBmdW5jdGlvbiAoIG1lc2ggKSB7XG5cblx0XHRpZiAoICEgKCBtZXNoICYmIG1lc2guaXNNZXNoICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5HZW9tZXRyeS5tZXJnZU1lc2goKTogbWVzaCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuTWVzaC4nLCBtZXNoICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIG1lc2gubWF0cml4QXV0b1VwZGF0ZSApIG1lc2gudXBkYXRlTWF0cml4KCk7XG5cblx0XHR0aGlzLm1lcmdlKCBtZXNoLmdlb21ldHJ5LCBtZXNoLm1hdHJpeCApO1xuXG5cdH0sXG5cblx0Lypcblx0ICogQ2hlY2tzIGZvciBkdXBsaWNhdGUgdmVydGljZXMgd2l0aCBoYXNobWFwLlxuXHQgKiBEdXBsaWNhdGVkIHZlcnRpY2VzIGFyZSByZW1vdmVkXG5cdCAqIGFuZCBmYWNlcycgdmVydGljZXMgYXJlIHVwZGF0ZWQuXG5cdCAqL1xuXG5cdG1lcmdlVmVydGljZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2ZXJ0aWNlc01hcCA9IHt9OyAvLyBIYXNobWFwIGZvciBsb29raW5nIHVwIHZlcnRpY2VzIGJ5IHBvc2l0aW9uIGNvb3JkaW5hdGVzIChhbmQgbWFraW5nIHN1cmUgdGhleSBhcmUgdW5pcXVlKVxuXHRcdHZhciB1bmlxdWUgPSBbXSwgY2hhbmdlcyA9IFtdO1xuXG5cdFx0dmFyIHYsIGtleTtcblx0XHR2YXIgcHJlY2lzaW9uUG9pbnRzID0gNDsgLy8gbnVtYmVyIG9mIGRlY2ltYWwgcG9pbnRzLCBlLmcuIDQgZm9yIGVwc2lsb24gb2YgMC4wMDAxXG5cdFx0dmFyIHByZWNpc2lvbiA9IE1hdGgucG93KCAxMCwgcHJlY2lzaW9uUG9pbnRzICk7XG5cdFx0dmFyIGksIGlsLCBmYWNlO1xuXHRcdHZhciBpbmRpY2VzLCBqLCBqbDtcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHRoaXMudmVydGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHYgPSB0aGlzLnZlcnRpY2VzWyBpIF07XG5cdFx0XHRrZXkgPSBNYXRoLnJvdW5kKCB2LnggKiBwcmVjaXNpb24gKSArICdfJyArIE1hdGgucm91bmQoIHYueSAqIHByZWNpc2lvbiApICsgJ18nICsgTWF0aC5yb3VuZCggdi56ICogcHJlY2lzaW9uICk7XG5cblx0XHRcdGlmICggdmVydGljZXNNYXBbIGtleSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dmVydGljZXNNYXBbIGtleSBdID0gaTtcblx0XHRcdFx0dW5pcXVlLnB1c2goIHRoaXMudmVydGljZXNbIGkgXSApO1xuXHRcdFx0XHRjaGFuZ2VzWyBpIF0gPSB1bmlxdWUubGVuZ3RoIC0gMTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvL2NvbnNvbGUubG9nKCdEdXBsaWNhdGUgdmVydGV4IGZvdW5kLiAnLCBpLCAnIGNvdWxkIGJlIHVzaW5nICcsIHZlcnRpY2VzTWFwW2tleV0pO1xuXHRcdFx0XHRjaGFuZ2VzWyBpIF0gPSBjaGFuZ2VzWyB2ZXJ0aWNlc01hcFsga2V5IF0gXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cblx0XHQvLyBpZiBmYWNlcyBhcmUgY29tcGxldGVseSBkZWdlbmVyYXRlIGFmdGVyIG1lcmdpbmcgdmVydGljZXMsIHdlXG5cdFx0Ly8gaGF2ZSB0byByZW1vdmUgdGhlbSBmcm9tIHRoZSBnZW9tZXRyeS5cblx0XHR2YXIgZmFjZUluZGljZXNUb1JlbW92ZSA9IFtdO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0ZmFjZSA9IHRoaXMuZmFjZXNbIGkgXTtcblxuXHRcdFx0ZmFjZS5hID0gY2hhbmdlc1sgZmFjZS5hIF07XG5cdFx0XHRmYWNlLmIgPSBjaGFuZ2VzWyBmYWNlLmIgXTtcblx0XHRcdGZhY2UuYyA9IGNoYW5nZXNbIGZhY2UuYyBdO1xuXG5cdFx0XHRpbmRpY2VzID0gWyBmYWNlLmEsIGZhY2UuYiwgZmFjZS5jIF07XG5cblx0XHRcdC8vIGlmIGFueSBkdXBsaWNhdGUgdmVydGljZXMgYXJlIGZvdW5kIGluIGEgRmFjZTNcblx0XHRcdC8vIHdlIGhhdmUgdG8gcmVtb3ZlIHRoZSBmYWNlIGFzIG5vdGhpbmcgY2FuIGJlIHNhdmVkXG5cdFx0XHRmb3IgKCB2YXIgbiA9IDA7IG4gPCAzOyBuICsrICkge1xuXG5cdFx0XHRcdGlmICggaW5kaWNlc1sgbiBdID09PSBpbmRpY2VzWyAoIG4gKyAxICkgJSAzIF0gKSB7XG5cblx0XHRcdFx0XHRmYWNlSW5kaWNlc1RvUmVtb3ZlLnB1c2goIGkgKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZvciAoIGkgPSBmYWNlSW5kaWNlc1RvUmVtb3ZlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtLSApIHtcblxuXHRcdFx0dmFyIGlkeCA9IGZhY2VJbmRpY2VzVG9SZW1vdmVbIGkgXTtcblxuXHRcdFx0dGhpcy5mYWNlcy5zcGxpY2UoIGlkeCwgMSApO1xuXG5cdFx0XHRmb3IgKCBqID0gMCwgamwgPSB0aGlzLmZhY2VWZXJ0ZXhVdnMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0dGhpcy5mYWNlVmVydGV4VXZzWyBqIF0uc3BsaWNlKCBpZHgsIDEgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gVXNlIHVuaXF1ZSBzZXQgb2YgdmVydGljZXNcblxuXHRcdHZhciBkaWZmID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGggLSB1bmlxdWUubGVuZ3RoO1xuXHRcdHRoaXMudmVydGljZXMgPSB1bmlxdWU7XG5cdFx0cmV0dXJuIGRpZmY7XG5cblx0fSxcblxuXHRzZXRGcm9tUG9pbnRzOiBmdW5jdGlvbiAoIHBvaW50cyApIHtcblxuXHRcdHRoaXMudmVydGljZXMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgcG9pbnQgPSBwb2ludHNbIGkgXTtcblx0XHRcdHRoaXMudmVydGljZXMucHVzaCggbmV3IFZlY3RvcjMoIHBvaW50LngsIHBvaW50LnksIHBvaW50LnogfHwgMCApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNvcnRGYWNlc0J5TWF0ZXJpYWxJbmRleDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGZhY2VzID0gdGhpcy5mYWNlcztcblx0XHR2YXIgbGVuZ3RoID0gZmFjZXMubGVuZ3RoO1xuXG5cdFx0Ly8gdGFnIGZhY2VzXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGZhY2VzWyBpIF0uX2lkID0gaTtcblxuXHRcdH1cblxuXHRcdC8vIHNvcnQgZmFjZXNcblxuXHRcdGZ1bmN0aW9uIG1hdGVyaWFsSW5kZXhTb3J0KCBhLCBiICkge1xuXG5cdFx0XHRyZXR1cm4gYS5tYXRlcmlhbEluZGV4IC0gYi5tYXRlcmlhbEluZGV4O1xuXG5cdFx0fVxuXG5cdFx0ZmFjZXMuc29ydCggbWF0ZXJpYWxJbmRleFNvcnQgKTtcblxuXHRcdC8vIHNvcnQgdXZzXG5cblx0XHR2YXIgdXZzMSA9IHRoaXMuZmFjZVZlcnRleFV2c1sgMCBdO1xuXHRcdHZhciB1dnMyID0gdGhpcy5mYWNlVmVydGV4VXZzWyAxIF07XG5cblx0XHR2YXIgbmV3VXZzMSwgbmV3VXZzMjtcblxuXHRcdGlmICggdXZzMSAmJiB1dnMxLmxlbmd0aCA9PT0gbGVuZ3RoICkgbmV3VXZzMSA9IFtdO1xuXHRcdGlmICggdXZzMiAmJiB1dnMyLmxlbmd0aCA9PT0gbGVuZ3RoICkgbmV3VXZzMiA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgaWQgPSBmYWNlc1sgaSBdLl9pZDtcblxuXHRcdFx0aWYgKCBuZXdVdnMxICkgbmV3VXZzMS5wdXNoKCB1dnMxWyBpZCBdICk7XG5cdFx0XHRpZiAoIG5ld1V2czIgKSBuZXdVdnMyLnB1c2goIHV2czJbIGlkIF0gKTtcblxuXHRcdH1cblxuXHRcdGlmICggbmV3VXZzMSApIHRoaXMuZmFjZVZlcnRleFV2c1sgMCBdID0gbmV3VXZzMTtcblx0XHRpZiAoIG5ld1V2czIgKSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDEgXSA9IG5ld1V2czI7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBkYXRhID0ge1xuXHRcdFx0bWV0YWRhdGE6IHtcblx0XHRcdFx0dmVyc2lvbjogNC41LFxuXHRcdFx0XHR0eXBlOiAnR2VvbWV0cnknLFxuXHRcdFx0XHRnZW5lcmF0b3I6ICdHZW9tZXRyeS50b0pTT04nXG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8vIHN0YW5kYXJkIEdlb21ldHJ5IHNlcmlhbGl6YXRpb25cblxuXHRcdGRhdGEudXVpZCA9IHRoaXMudXVpZDtcblx0XHRkYXRhLnR5cGUgPSB0aGlzLnR5cGU7XG5cdFx0aWYgKCB0aGlzLm5hbWUgIT09ICcnICkgZGF0YS5uYW1lID0gdGhpcy5uYW1lO1xuXG5cdFx0aWYgKCB0aGlzLnBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIHBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnM7XG5cblx0XHRcdGZvciAoIHZhciBrZXkgaW4gcGFyYW1ldGVycyApIHtcblxuXHRcdFx0XHRpZiAoIHBhcmFtZXRlcnNbIGtleSBdICE9PSB1bmRlZmluZWQgKSBkYXRhWyBrZXkgXSA9IHBhcmFtZXRlcnNbIGtleSBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBkYXRhO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHZlcnRpY2VzID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHZlcnRleCA9IHRoaXMudmVydGljZXNbIGkgXTtcblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdH1cblxuXHRcdHZhciBmYWNlcyA9IFtdO1xuXHRcdHZhciBub3JtYWxzID0gW107XG5cdFx0dmFyIG5vcm1hbHNIYXNoID0ge307XG5cdFx0dmFyIGNvbG9ycyA9IFtdO1xuXHRcdHZhciBjb2xvcnNIYXNoID0ge307XG5cdFx0dmFyIHV2cyA9IFtdO1xuXHRcdHZhciB1dnNIYXNoID0ge307XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLmZhY2VzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSB0aGlzLmZhY2VzWyBpIF07XG5cblx0XHRcdHZhciBoYXNNYXRlcmlhbCA9IHRydWU7XG5cdFx0XHR2YXIgaGFzRmFjZVV2ID0gZmFsc2U7IC8vIGRlcHJlY2F0ZWRcblx0XHRcdHZhciBoYXNGYWNlVmVydGV4VXYgPSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDAgXVsgaSBdICE9PSB1bmRlZmluZWQ7XG5cdFx0XHR2YXIgaGFzRmFjZU5vcm1hbCA9IGZhY2Uubm9ybWFsLmxlbmd0aCgpID4gMDtcblx0XHRcdHZhciBoYXNGYWNlVmVydGV4Tm9ybWFsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aCA+IDA7XG5cdFx0XHR2YXIgaGFzRmFjZUNvbG9yID0gZmFjZS5jb2xvci5yICE9PSAxIHx8IGZhY2UuY29sb3IuZyAhPT0gMSB8fCBmYWNlLmNvbG9yLmIgIT09IDE7XG5cdFx0XHR2YXIgaGFzRmFjZVZlcnRleENvbG9yID0gZmFjZS52ZXJ0ZXhDb2xvcnMubGVuZ3RoID4gMDtcblxuXHRcdFx0dmFyIGZhY2VUeXBlID0gMDtcblxuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCAwLCAwICk7IC8vIGlzUXVhZFxuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCAxLCBoYXNNYXRlcmlhbCApO1xuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCAyLCBoYXNGYWNlVXYgKTtcblx0XHRcdGZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgMywgaGFzRmFjZVZlcnRleFV2ICk7XG5cdFx0XHRmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDQsIGhhc0ZhY2VOb3JtYWwgKTtcblx0XHRcdGZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgNSwgaGFzRmFjZVZlcnRleE5vcm1hbCApO1xuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCA2LCBoYXNGYWNlQ29sb3IgKTtcblx0XHRcdGZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgNywgaGFzRmFjZVZlcnRleENvbG9yICk7XG5cblx0XHRcdGZhY2VzLnB1c2goIGZhY2VUeXBlICk7XG5cdFx0XHRmYWNlcy5wdXNoKCBmYWNlLmEsIGZhY2UuYiwgZmFjZS5jICk7XG5cdFx0XHRmYWNlcy5wdXNoKCBmYWNlLm1hdGVyaWFsSW5kZXggKTtcblxuXHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4VXYgKSB7XG5cblx0XHRcdFx0dmFyIGZhY2VWZXJ0ZXhVdnMgPSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDAgXVsgaSBdO1xuXG5cdFx0XHRcdGZhY2VzLnB1c2goXG5cdFx0XHRcdFx0Z2V0VXZJbmRleCggZmFjZVZlcnRleFV2c1sgMCBdICksXG5cdFx0XHRcdFx0Z2V0VXZJbmRleCggZmFjZVZlcnRleFV2c1sgMSBdICksXG5cdFx0XHRcdFx0Z2V0VXZJbmRleCggZmFjZVZlcnRleFV2c1sgMiBdIClcblx0XHRcdFx0KTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc0ZhY2VOb3JtYWwgKSB7XG5cblx0XHRcdFx0ZmFjZXMucHVzaCggZ2V0Tm9ybWFsSW5kZXgoIGZhY2Uubm9ybWFsICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwgKSB7XG5cblx0XHRcdFx0dmFyIHZlcnRleE5vcm1hbHMgPSBmYWNlLnZlcnRleE5vcm1hbHM7XG5cblx0XHRcdFx0ZmFjZXMucHVzaChcblx0XHRcdFx0XHRnZXROb3JtYWxJbmRleCggdmVydGV4Tm9ybWFsc1sgMCBdICksXG5cdFx0XHRcdFx0Z2V0Tm9ybWFsSW5kZXgoIHZlcnRleE5vcm1hbHNbIDEgXSApLFxuXHRcdFx0XHRcdGdldE5vcm1hbEluZGV4KCB2ZXJ0ZXhOb3JtYWxzWyAyIF0gKVxuXHRcdFx0XHQpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzRmFjZUNvbG9yICkge1xuXG5cdFx0XHRcdGZhY2VzLnB1c2goIGdldENvbG9ySW5kZXgoIGZhY2UuY29sb3IgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzRmFjZVZlcnRleENvbG9yICkge1xuXG5cdFx0XHRcdHZhciB2ZXJ0ZXhDb2xvcnMgPSBmYWNlLnZlcnRleENvbG9ycztcblxuXHRcdFx0XHRmYWNlcy5wdXNoKFxuXHRcdFx0XHRcdGdldENvbG9ySW5kZXgoIHZlcnRleENvbG9yc1sgMCBdICksXG5cdFx0XHRcdFx0Z2V0Q29sb3JJbmRleCggdmVydGV4Q29sb3JzWyAxIF0gKSxcblx0XHRcdFx0XHRnZXRDb2xvckluZGV4KCB2ZXJ0ZXhDb2xvcnNbIDIgXSApXG5cdFx0XHRcdCk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHNldEJpdCggdmFsdWUsIHBvc2l0aW9uLCBlbmFibGVkICkge1xuXG5cdFx0XHRyZXR1cm4gZW5hYmxlZCA/IHZhbHVlIHwgKCAxIDw8IHBvc2l0aW9uICkgOiB2YWx1ZSAmICggfiAoIDEgPDwgcG9zaXRpb24gKSApO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2V0Tm9ybWFsSW5kZXgoIG5vcm1hbCApIHtcblxuXHRcdFx0dmFyIGhhc2ggPSBub3JtYWwueC50b1N0cmluZygpICsgbm9ybWFsLnkudG9TdHJpbmcoKSArIG5vcm1hbC56LnRvU3RyaW5nKCk7XG5cblx0XHRcdGlmICggbm9ybWFsc0hhc2hbIGhhc2ggXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBub3JtYWxzSGFzaFsgaGFzaCBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdG5vcm1hbHNIYXNoWyBoYXNoIF0gPSBub3JtYWxzLmxlbmd0aCAvIDM7XG5cdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcblxuXHRcdFx0cmV0dXJuIG5vcm1hbHNIYXNoWyBoYXNoIF07XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXRDb2xvckluZGV4KCBjb2xvciApIHtcblxuXHRcdFx0dmFyIGhhc2ggPSBjb2xvci5yLnRvU3RyaW5nKCkgKyBjb2xvci5nLnRvU3RyaW5nKCkgKyBjb2xvci5iLnRvU3RyaW5nKCk7XG5cblx0XHRcdGlmICggY29sb3JzSGFzaFsgaGFzaCBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGNvbG9yc0hhc2hbIGhhc2ggXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjb2xvcnNIYXNoWyBoYXNoIF0gPSBjb2xvcnMubGVuZ3RoO1xuXHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yLmdldEhleCgpICk7XG5cblx0XHRcdHJldHVybiBjb2xvcnNIYXNoWyBoYXNoIF07XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXRVdkluZGV4KCB1diApIHtcblxuXHRcdFx0dmFyIGhhc2ggPSB1di54LnRvU3RyaW5nKCkgKyB1di55LnRvU3RyaW5nKCk7XG5cblx0XHRcdGlmICggdXZzSGFzaFsgaGFzaCBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHV2c0hhc2hbIGhhc2ggXTtcblxuXHRcdFx0fVxuXG5cdFx0XHR1dnNIYXNoWyBoYXNoIF0gPSB1dnMubGVuZ3RoIC8gMjtcblx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblx0XHRcdHJldHVybiB1dnNIYXNoWyBoYXNoIF07XG5cblx0XHR9XG5cblx0XHRkYXRhLmRhdGEgPSB7fTtcblxuXHRcdGRhdGEuZGF0YS52ZXJ0aWNlcyA9IHZlcnRpY2VzO1xuXHRcdGRhdGEuZGF0YS5ub3JtYWxzID0gbm9ybWFscztcblx0XHRpZiAoIGNvbG9ycy5sZW5ndGggPiAwICkgZGF0YS5kYXRhLmNvbG9ycyA9IGNvbG9ycztcblx0XHRpZiAoIHV2cy5sZW5ndGggPiAwICkgZGF0YS5kYXRhLnV2cyA9IFsgdXZzIF07IC8vIHRlbXBvcmFsIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcblx0XHRkYXRhLmRhdGEuZmFjZXMgPSBmYWNlcztcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8qXG5cdFx0IC8vIEhhbmRsZSBwcmltaXRpdmVzXG5cblx0XHQgdmFyIHBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnM7XG5cblx0XHQgaWYgKCBwYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHQgdmFyIHZhbHVlcyA9IFtdO1xuXG5cdFx0IGZvciAoIHZhciBrZXkgaW4gcGFyYW1ldGVycyApIHtcblxuXHRcdCB2YWx1ZXMucHVzaCggcGFyYW1ldGVyc1sga2V5IF0gKTtcblxuXHRcdCB9XG5cblx0XHQgdmFyIGdlb21ldHJ5ID0gT2JqZWN0LmNyZWF0ZSggdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgKTtcblx0XHQgdGhpcy5jb25zdHJ1Y3Rvci5hcHBseSggZ2VvbWV0cnksIHZhbHVlcyApO1xuXHRcdCByZXR1cm4gZ2VvbWV0cnk7XG5cblx0XHQgfVxuXG5cdFx0IHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblx0XHQgKi9cblxuXHRcdHJldHVybiBuZXcgR2VvbWV0cnkoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdHZhciBpLCBpbCwgaiwgamwsIGssIGtsO1xuXG5cdFx0Ly8gcmVzZXRcblxuXHRcdHRoaXMudmVydGljZXMgPSBbXTtcblx0XHR0aGlzLmNvbG9ycyA9IFtdO1xuXHRcdHRoaXMuZmFjZXMgPSBbXTtcblx0XHR0aGlzLmZhY2VWZXJ0ZXhVdnMgPSBbW11dO1xuXHRcdHRoaXMubW9ycGhUYXJnZXRzID0gW107XG5cdFx0dGhpcy5tb3JwaE5vcm1hbHMgPSBbXTtcblx0XHR0aGlzLnNraW5XZWlnaHRzID0gW107XG5cdFx0dGhpcy5za2luSW5kaWNlcyA9IFtdO1xuXHRcdHRoaXMubGluZURpc3RhbmNlcyA9IFtdO1xuXHRcdHRoaXMuYm91bmRpbmdCb3ggPSBudWxsO1xuXHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsO1xuXG5cdFx0Ly8gbmFtZVxuXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XG5cblx0XHQvLyB2ZXJ0aWNlc1xuXG5cdFx0dmFyIHZlcnRpY2VzID0gc291cmNlLnZlcnRpY2VzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gdmVydGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMudmVydGljZXMucHVzaCggdmVydGljZXNbIGkgXS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBjb2xvcnNcblxuXHRcdHZhciBjb2xvcnMgPSBzb3VyY2UuY29sb3JzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gY29sb3JzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmNvbG9ycy5wdXNoKCBjb2xvcnNbIGkgXS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBmYWNlc1xuXG5cdFx0dmFyIGZhY2VzID0gc291cmNlLmZhY2VzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gZmFjZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuZmFjZXMucHVzaCggZmFjZXNbIGkgXS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBmYWNlIHZlcnRleCB1dnNcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHNvdXJjZS5mYWNlVmVydGV4VXZzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZVZlcnRleFV2cyA9IHNvdXJjZS5mYWNlVmVydGV4VXZzWyBpIF07XG5cblx0XHRcdGlmICggdGhpcy5mYWNlVmVydGV4VXZzWyBpIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR0aGlzLmZhY2VWZXJ0ZXhVdnNbIGkgXSA9IFtdO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIGogPSAwLCBqbCA9IGZhY2VWZXJ0ZXhVdnMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0dmFyIHV2cyA9IGZhY2VWZXJ0ZXhVdnNbIGogXSwgdXZzQ29weSA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIGsgPSAwLCBrbCA9IHV2cy5sZW5ndGg7IGsgPCBrbDsgayArKyApIHtcblxuXHRcdFx0XHRcdHZhciB1diA9IHV2c1sgayBdO1xuXG5cdFx0XHRcdFx0dXZzQ29weS5wdXNoKCB1di5jbG9uZSgpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuZmFjZVZlcnRleFV2c1sgaSBdLnB1c2goIHV2c0NvcHkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gbW9ycGggdGFyZ2V0c1xuXG5cdFx0dmFyIG1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBtb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBtb3JwaFRhcmdldCA9IHt9O1xuXHRcdFx0bW9ycGhUYXJnZXQubmFtZSA9IG1vcnBoVGFyZ2V0c1sgaSBdLm5hbWU7XG5cblx0XHRcdC8vIHZlcnRpY2VzXG5cblx0XHRcdGlmICggbW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtb3JwaFRhcmdldC52ZXJ0aWNlcyA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIGogPSAwLCBqbCA9IG1vcnBoVGFyZ2V0c1sgaSBdLnZlcnRpY2VzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0bW9ycGhUYXJnZXQudmVydGljZXMucHVzaCggbW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXNbIGogXS5jbG9uZSgpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIG5vcm1hbHNcblxuXHRcdFx0aWYgKCBtb3JwaFRhcmdldHNbIGkgXS5ub3JtYWxzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bW9ycGhUYXJnZXQubm9ybWFscyA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIGogPSAwLCBqbCA9IG1vcnBoVGFyZ2V0c1sgaSBdLm5vcm1hbHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRtb3JwaFRhcmdldC5ub3JtYWxzLnB1c2goIG1vcnBoVGFyZ2V0c1sgaSBdLm5vcm1hbHNbIGogXS5jbG9uZSgpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubW9ycGhUYXJnZXRzLnB1c2goIG1vcnBoVGFyZ2V0ICk7XG5cblx0XHR9XG5cblx0XHQvLyBtb3JwaCBub3JtYWxzXG5cblx0XHR2YXIgbW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFscztcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IG1vcnBoTm9ybWFscy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIG1vcnBoTm9ybWFsID0ge307XG5cblx0XHRcdC8vIHZlcnRleCBub3JtYWxzXG5cblx0XHRcdGlmICggbW9ycGhOb3JtYWxzWyBpIF0udmVydGV4Tm9ybWFscyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1vcnBoTm9ybWFsLnZlcnRleE5vcm1hbHMgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCBqID0gMCwgamwgPSBtb3JwaE5vcm1hbHNbIGkgXS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIHNyY1ZlcnRleE5vcm1hbCA9IG1vcnBoTm9ybWFsc1sgaSBdLnZlcnRleE5vcm1hbHNbIGogXTtcblx0XHRcdFx0XHR2YXIgZGVzdFZlcnRleE5vcm1hbCA9IHt9O1xuXG5cdFx0XHRcdFx0ZGVzdFZlcnRleE5vcm1hbC5hID0gc3JjVmVydGV4Tm9ybWFsLmEuY2xvbmUoKTtcblx0XHRcdFx0XHRkZXN0VmVydGV4Tm9ybWFsLmIgPSBzcmNWZXJ0ZXhOb3JtYWwuYi5jbG9uZSgpO1xuXHRcdFx0XHRcdGRlc3RWZXJ0ZXhOb3JtYWwuYyA9IHNyY1ZlcnRleE5vcm1hbC5jLmNsb25lKCk7XG5cblx0XHRcdFx0XHRtb3JwaE5vcm1hbC52ZXJ0ZXhOb3JtYWxzLnB1c2goIGRlc3RWZXJ0ZXhOb3JtYWwgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gZmFjZSBub3JtYWxzXG5cblx0XHRcdGlmICggbW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtb3JwaE5vcm1hbC5mYWNlTm9ybWFscyA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIGogPSAwLCBqbCA9IG1vcnBoTm9ybWFsc1sgaSBdLmZhY2VOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0bW9ycGhOb3JtYWwuZmFjZU5vcm1hbHMucHVzaCggbW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHNbIGogXS5jbG9uZSgpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubW9ycGhOb3JtYWxzLnB1c2goIG1vcnBoTm9ybWFsICk7XG5cblx0XHR9XG5cblx0XHQvLyBza2luIHdlaWdodHNcblxuXHRcdHZhciBza2luV2VpZ2h0cyA9IHNvdXJjZS5za2luV2VpZ2h0cztcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHNraW5XZWlnaHRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnNraW5XZWlnaHRzLnB1c2goIHNraW5XZWlnaHRzWyBpIF0uY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2tpbiBpbmRpY2VzXG5cblx0XHR2YXIgc2tpbkluZGljZXMgPSBzb3VyY2Uuc2tpbkluZGljZXM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBza2luSW5kaWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5za2luSW5kaWNlcy5wdXNoKCBza2luSW5kaWNlc1sgaSBdLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGxpbmUgZGlzdGFuY2VzXG5cblx0XHR2YXIgbGluZURpc3RhbmNlcyA9IHNvdXJjZS5saW5lRGlzdGFuY2VzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gbGluZURpc3RhbmNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5saW5lRGlzdGFuY2VzLnB1c2goIGxpbmVEaXN0YW5jZXNbIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYm91bmRpbmcgYm94XG5cblx0XHR2YXIgYm91bmRpbmdCb3ggPSBzb3VyY2UuYm91bmRpbmdCb3g7XG5cblx0XHRpZiAoIGJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gYm91bmRpbmdCb3guY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdC8vIGJvdW5kaW5nIHNwaGVyZVxuXG5cdFx0dmFyIGJvdW5kaW5nU3BoZXJlID0gc291cmNlLmJvdW5kaW5nU3BoZXJlO1xuXG5cdFx0aWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IGJvdW5kaW5nU3BoZXJlLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHQvLyB1cGRhdGUgZmxhZ3NcblxuXHRcdHRoaXMuZWxlbWVudHNOZWVkVXBkYXRlID0gc291cmNlLmVsZW1lbnRzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZSA9IHNvdXJjZS52ZXJ0aWNlc05lZWRVcGRhdGU7XG5cdFx0dGhpcy51dnNOZWVkVXBkYXRlID0gc291cmNlLnV2c05lZWRVcGRhdGU7XG5cdFx0dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IHNvdXJjZS5ub3JtYWxzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLmNvbG9yc05lZWRVcGRhdGUgPSBzb3VyY2UuY29sb3JzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlID0gc291cmNlLmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlO1xuXHRcdHRoaXMuZ3JvdXBzTmVlZFVwZGF0ZSA9IHNvdXJjZS5ncm91cHNOZWVkVXBkYXRlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdGlmICggQXJyYXkuaXNBcnJheSggYXJyYXkgKSApIHtcblxuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IGFycmF5IHNob3VsZCBiZSBhIFR5cGVkIEFycmF5LicgKTtcblxuXHR9XG5cblx0dGhpcy5uYW1lID0gJyc7XG5cblx0dGhpcy5hcnJheSA9IGFycmF5O1xuXHR0aGlzLml0ZW1TaXplID0gaXRlbVNpemU7XG5cdHRoaXMuY291bnQgPSBhcnJheSAhPT0gdW5kZWZpbmVkID8gYXJyYXkubGVuZ3RoIC8gaXRlbVNpemUgOiAwO1xuXHR0aGlzLm5vcm1hbGl6ZWQgPSBub3JtYWxpemVkID09PSB0cnVlO1xuXG5cdHRoaXMuZHluYW1pYyA9IGZhbHNlO1xuXHR0aGlzLnVwZGF0ZVJhbmdlID0geyBvZmZzZXQ6IDAsIGNvdW50OiAtIDEgfTtcblxuXHR0aGlzLnZlcnNpb24gPSAwO1xuXG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwgJ25lZWRzVXBkYXRlJywge1xuXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdmFsdWUgPT09IHRydWUgKSB0aGlzLnZlcnNpb24gKys7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUsIHtcblxuXHRpc0J1ZmZlckF0dHJpYnV0ZTogdHJ1ZSxcblxuXHRvblVwbG9hZENhbGxiYWNrOiBmdW5jdGlvbiAoKSB7fSxcblxuXHRzZXRBcnJheTogZnVuY3Rpb24gKCBhcnJheSApIHtcblxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggYXJyYXkgKSApIHtcblxuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvciggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuJyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jb3VudCA9IGFycmF5ICE9PSB1bmRlZmluZWQgPyBhcnJheS5sZW5ndGggLyB0aGlzLml0ZW1TaXplIDogMDtcblx0XHR0aGlzLmFycmF5ID0gYXJyYXk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldER5bmFtaWM6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmR5bmFtaWMgPSB2YWx1ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcblx0XHR0aGlzLmFycmF5ID0gbmV3IHNvdXJjZS5hcnJheS5jb25zdHJ1Y3Rvciggc291cmNlLmFycmF5ICk7XG5cdFx0dGhpcy5pdGVtU2l6ZSA9IHNvdXJjZS5pdGVtU2l6ZTtcblx0XHR0aGlzLmNvdW50ID0gc291cmNlLmNvdW50O1xuXHRcdHRoaXMubm9ybWFsaXplZCA9IHNvdXJjZS5ub3JtYWxpemVkO1xuXG5cdFx0dGhpcy5keW5hbWljID0gc291cmNlLmR5bmFtaWM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlBdDogZnVuY3Rpb24gKCBpbmRleDEsIGF0dHJpYnV0ZSwgaW5kZXgyICkge1xuXG5cdFx0aW5kZXgxICo9IHRoaXMuaXRlbVNpemU7XG5cdFx0aW5kZXgyICo9IGF0dHJpYnV0ZS5pdGVtU2l6ZTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuaXRlbVNpemU7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmFycmF5WyBpbmRleDEgKyBpIF0gPSBhdHRyaWJ1dGUuYXJyYXlbIGluZGV4MiArIGkgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weUFycmF5OiBmdW5jdGlvbiAoIGFycmF5ICkge1xuXG5cdFx0dGhpcy5hcnJheS5zZXQoIGFycmF5ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlDb2xvcnNBcnJheTogZnVuY3Rpb24gKCBjb2xvcnMgKSB7XG5cblx0XHR2YXIgYXJyYXkgPSB0aGlzLmFycmF5LCBvZmZzZXQgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY29sb3JzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBjb2xvciA9IGNvbG9yc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGNvbG9yID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlDb2xvcnNBcnJheSgpOiBjb2xvciBpcyB1bmRlZmluZWQnLCBpICk7XG5cdFx0XHRcdGNvbG9yID0gbmV3IENvbG9yKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gY29sb3Iucjtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IGNvbG9yLmc7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSBjb2xvci5iO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5VmVjdG9yMnNBcnJheTogZnVuY3Rpb24gKCB2ZWN0b3JzICkge1xuXG5cdFx0dmFyIGFycmF5ID0gdGhpcy5hcnJheSwgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHZlY3RvcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHZlY3RvciA9IHZlY3RvcnNbIGkgXTtcblxuXHRcdFx0aWYgKCB2ZWN0b3IgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjJzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCcsIGkgKTtcblx0XHRcdFx0dmVjdG9yID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueDtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci55O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5VmVjdG9yM3NBcnJheTogZnVuY3Rpb24gKCB2ZWN0b3JzICkge1xuXG5cdFx0dmFyIGFycmF5ID0gdGhpcy5hcnJheSwgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHZlY3RvcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHZlY3RvciA9IHZlY3RvcnNbIGkgXTtcblxuXHRcdFx0aWYgKCB2ZWN0b3IgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjNzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCcsIGkgKTtcblx0XHRcdFx0dmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueDtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci55O1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLno7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlWZWN0b3I0c0FycmF5OiBmdW5jdGlvbiAoIHZlY3RvcnMgKSB7XG5cblx0XHR2YXIgYXJyYXkgPSB0aGlzLmFycmF5LCBvZmZzZXQgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdmVjdG9ycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdmVjdG9yID0gdmVjdG9yc1sgaSBdO1xuXG5cdFx0XHRpZiAoIHZlY3RvciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5VmVjdG9yNHNBcnJheSgpOiB2ZWN0b3IgaXMgdW5kZWZpbmVkJywgaSApO1xuXHRcdFx0XHR2ZWN0b3IgPSBuZXcgVmVjdG9yNCgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci54O1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLnk7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3Iuejtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci53O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUsIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0dGhpcy5hcnJheS5zZXQoIHZhbHVlLCBvZmZzZXQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0WDogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgXTtcblxuXHR9LFxuXG5cdHNldFg6IGZ1bmN0aW9uICggaW5kZXgsIHggKSB7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgXSA9IHg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFk6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMSBdO1xuXG5cdH0sXG5cblx0c2V0WTogZnVuY3Rpb24gKCBpbmRleCwgeSApIHtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDEgXSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFo6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMiBdO1xuXG5cdH0sXG5cblx0c2V0WjogZnVuY3Rpb24gKCBpbmRleCwgeiApIHtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDIgXSA9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFc6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMyBdO1xuXG5cdH0sXG5cblx0c2V0VzogZnVuY3Rpb24gKCBpbmRleCwgdyApIHtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDMgXSA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFhZOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5ICkge1xuXG5cdFx0aW5kZXggKj0gdGhpcy5pdGVtU2l6ZTtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMCBdID0geDtcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFhZWjogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSwgeiApIHtcblxuXHRcdGluZGV4ICo9IHRoaXMuaXRlbVNpemU7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMiBdID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WFlaVzogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSwgeiwgdyApIHtcblxuXHRcdGluZGV4ICo9IHRoaXMuaXRlbVNpemU7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMiBdID0gejtcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDMgXSA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG9uVXBsb2FkOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0dGhpcy5vblVwbG9hZENhbGxiYWNrID0gY2FsbGJhY2s7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuYXJyYXksIHRoaXMuaXRlbVNpemUgKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5cbmZ1bmN0aW9uIEludDhCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IEludDhBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5JbnQ4QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcbkludDhCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW50OEJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBVaW50OEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgVWludDhBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5VaW50OEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5VaW50OEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBVaW50OEJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cblVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5VaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIEludDE2QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBJbnQxNkFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cbkludDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcbkludDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEludDE2QnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgVWludDE2QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuVWludDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcblVpbnQxNkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBVaW50MTZCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gSW50MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IEludDMyQXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuSW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuSW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW50MzJCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gVWludDMyQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBVaW50MzJBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5VaW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuVWludDMyQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBGbG9hdDMyQXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5GbG9hdDMyQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgRmxvYXQ2NEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cbkZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBGbG9hdDY0QnVmZmVyQXR0cmlidXRlO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gRGlyZWN0R2VvbWV0cnkoKSB7XG5cblx0dGhpcy52ZXJ0aWNlcyA9IFtdO1xuXHR0aGlzLm5vcm1hbHMgPSBbXTtcblx0dGhpcy5jb2xvcnMgPSBbXTtcblx0dGhpcy51dnMgPSBbXTtcblx0dGhpcy51dnMyID0gW107XG5cblx0dGhpcy5ncm91cHMgPSBbXTtcblxuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHt9O1xuXG5cdHRoaXMuc2tpbldlaWdodHMgPSBbXTtcblx0dGhpcy5za2luSW5kaWNlcyA9IFtdO1xuXG5cdC8vIHRoaXMubGluZURpc3RhbmNlcyA9IFtdO1xuXG5cdHRoaXMuYm91bmRpbmdCb3ggPSBudWxsO1xuXHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbDtcblxuXHQvLyB1cGRhdGUgZmxhZ3NcblxuXHR0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMuY29sb3JzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLnV2c05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5ncm91cHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggRGlyZWN0R2VvbWV0cnkucHJvdG90eXBlLCB7XG5cblx0Y29tcHV0ZUdyb3VwczogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHtcblxuXHRcdHZhciBncm91cDtcblx0XHR2YXIgZ3JvdXBzID0gW107XG5cdFx0dmFyIG1hdGVyaWFsSW5kZXggPSB1bmRlZmluZWQ7XG5cblx0XHR2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlcztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGZhY2VzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSBmYWNlc1sgaSBdO1xuXG5cdFx0XHQvLyBtYXRlcmlhbHNcblxuXHRcdFx0aWYgKCBmYWNlLm1hdGVyaWFsSW5kZXggIT09IG1hdGVyaWFsSW5kZXggKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWxJbmRleCA9IGZhY2UubWF0ZXJpYWxJbmRleDtcblxuXHRcdFx0XHRpZiAoIGdyb3VwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRncm91cC5jb3VudCA9ICggaSAqIDMgKSAtIGdyb3VwLnN0YXJ0O1xuXHRcdFx0XHRcdGdyb3Vwcy5wdXNoKCBncm91cCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRncm91cCA9IHtcblx0XHRcdFx0XHRzdGFydDogaSAqIDMsXG5cdFx0XHRcdFx0bWF0ZXJpYWxJbmRleDogbWF0ZXJpYWxJbmRleFxuXHRcdFx0XHR9O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIGdyb3VwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGdyb3VwLmNvdW50ID0gKCBpICogMyApIC0gZ3JvdXAuc3RhcnQ7XG5cdFx0XHRncm91cHMucHVzaCggZ3JvdXAgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuZ3JvdXBzID0gZ3JvdXBzO1xuXG5cdH0sXG5cblx0ZnJvbUdlb21ldHJ5OiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIGZhY2VzID0gZ2VvbWV0cnkuZmFjZXM7XG5cdFx0dmFyIHZlcnRpY2VzID0gZ2VvbWV0cnkudmVydGljZXM7XG5cdFx0dmFyIGZhY2VWZXJ0ZXhVdnMgPSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzO1xuXG5cdFx0dmFyIGhhc0ZhY2VWZXJ0ZXhVdiA9IGZhY2VWZXJ0ZXhVdnNbIDAgXSAmJiBmYWNlVmVydGV4VXZzWyAwIF0ubGVuZ3RoID4gMDtcblx0XHR2YXIgaGFzRmFjZVZlcnRleFV2MiA9IGZhY2VWZXJ0ZXhVdnNbIDEgXSAmJiBmYWNlVmVydGV4VXZzWyAxIF0ubGVuZ3RoID4gMDtcblxuXHRcdC8vIG1vcnBoc1xuXG5cdFx0dmFyIG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cztcblx0XHR2YXIgbW9ycGhUYXJnZXRzTGVuZ3RoID0gbW9ycGhUYXJnZXRzLmxlbmd0aDtcblxuXHRcdHZhciBtb3JwaFRhcmdldHNQb3NpdGlvbjtcblxuXHRcdGlmICggbW9ycGhUYXJnZXRzTGVuZ3RoID4gMCApIHtcblxuXHRcdFx0bW9ycGhUYXJnZXRzUG9zaXRpb24gPSBbXTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbW9ycGhUYXJnZXRzTGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdG1vcnBoVGFyZ2V0c1Bvc2l0aW9uWyBpIF0gPSBbXTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0cy5wb3NpdGlvbiA9IG1vcnBoVGFyZ2V0c1Bvc2l0aW9uO1xuXG5cdFx0fVxuXG5cdFx0dmFyIG1vcnBoTm9ybWFscyA9IGdlb21ldHJ5Lm1vcnBoTm9ybWFscztcblx0XHR2YXIgbW9ycGhOb3JtYWxzTGVuZ3RoID0gbW9ycGhOb3JtYWxzLmxlbmd0aDtcblxuXHRcdHZhciBtb3JwaFRhcmdldHNOb3JtYWw7XG5cblx0XHRpZiAoIG1vcnBoTm9ybWFsc0xlbmd0aCA+IDAgKSB7XG5cblx0XHRcdG1vcnBoVGFyZ2V0c05vcm1hbCA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBtb3JwaE5vcm1hbHNMZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0bW9ycGhUYXJnZXRzTm9ybWFsWyBpIF0gPSBbXTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0cy5ub3JtYWwgPSBtb3JwaFRhcmdldHNOb3JtYWw7XG5cblx0XHR9XG5cblx0XHQvLyBza2luc1xuXG5cdFx0dmFyIHNraW5JbmRpY2VzID0gZ2VvbWV0cnkuc2tpbkluZGljZXM7XG5cdFx0dmFyIHNraW5XZWlnaHRzID0gZ2VvbWV0cnkuc2tpbldlaWdodHM7XG5cblx0XHR2YXIgaGFzU2tpbkluZGljZXMgPSBza2luSW5kaWNlcy5sZW5ndGggPT09IHZlcnRpY2VzLmxlbmd0aDtcblx0XHR2YXIgaGFzU2tpbldlaWdodHMgPSBza2luV2VpZ2h0cy5sZW5ndGggPT09IHZlcnRpY2VzLmxlbmd0aDtcblxuXHRcdC8vXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBmYWNlcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlID0gZmFjZXNbIGkgXTtcblxuXHRcdFx0dGhpcy52ZXJ0aWNlcy5wdXNoKCB2ZXJ0aWNlc1sgZmFjZS5hIF0sIHZlcnRpY2VzWyBmYWNlLmIgXSwgdmVydGljZXNbIGZhY2UuYyBdICk7XG5cblx0XHRcdHZhciB2ZXJ0ZXhOb3JtYWxzID0gZmFjZS52ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRpZiAoIHZlcnRleE5vcm1hbHMubGVuZ3RoID09PSAzICkge1xuXG5cdFx0XHRcdHRoaXMubm9ybWFscy5wdXNoKCB2ZXJ0ZXhOb3JtYWxzWyAwIF0sIHZlcnRleE5vcm1hbHNbIDEgXSwgdmVydGV4Tm9ybWFsc1sgMiBdICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dmFyIG5vcm1hbCA9IGZhY2Uubm9ybWFsO1xuXG5cdFx0XHRcdHRoaXMubm9ybWFscy5wdXNoKCBub3JtYWwsIG5vcm1hbCwgbm9ybWFsICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHZlcnRleENvbG9ycyA9IGZhY2UudmVydGV4Q29sb3JzO1xuXG5cdFx0XHRpZiAoIHZlcnRleENvbG9ycy5sZW5ndGggPT09IDMgKSB7XG5cblx0XHRcdFx0dGhpcy5jb2xvcnMucHVzaCggdmVydGV4Q29sb3JzWyAwIF0sIHZlcnRleENvbG9yc1sgMSBdLCB2ZXJ0ZXhDb2xvcnNbIDIgXSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZhciBjb2xvciA9IGZhY2UuY29sb3I7XG5cblx0XHRcdFx0dGhpcy5jb2xvcnMucHVzaCggY29sb3IsIGNvbG9yLCBjb2xvciApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzRmFjZVZlcnRleFV2ID09PSB0cnVlICkge1xuXG5cdFx0XHRcdHZhciB2ZXJ0ZXhVdnMgPSBmYWNlVmVydGV4VXZzWyAwIF1bIGkgXTtcblxuXHRcdFx0XHRpZiAoIHZlcnRleFV2cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGhpcy51dnMucHVzaCggdmVydGV4VXZzWyAwIF0sIHZlcnRleFV2c1sgMSBdLCB2ZXJ0ZXhVdnNbIDIgXSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5EaXJlY3RHZW9tZXRyeS5mcm9tR2VvbWV0cnkoKTogVW5kZWZpbmVkIHZlcnRleFV2ICcsIGkgKTtcblxuXHRcdFx0XHRcdHRoaXMudXZzLnB1c2goIG5ldyBWZWN0b3IyKCksIG5ldyBWZWN0b3IyKCksIG5ldyBWZWN0b3IyKCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4VXYyID09PSB0cnVlICkge1xuXG5cdFx0XHRcdHZhciB2ZXJ0ZXhVdnMgPSBmYWNlVmVydGV4VXZzWyAxIF1bIGkgXTtcblxuXHRcdFx0XHRpZiAoIHZlcnRleFV2cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGhpcy51dnMyLnB1c2goIHZlcnRleFV2c1sgMCBdLCB2ZXJ0ZXhVdnNbIDEgXSwgdmVydGV4VXZzWyAyIF0gKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRGlyZWN0R2VvbWV0cnkuZnJvbUdlb21ldHJ5KCk6IFVuZGVmaW5lZCB2ZXJ0ZXhVdjIgJywgaSApO1xuXG5cdFx0XHRcdFx0dGhpcy51dnMyLnB1c2goIG5ldyBWZWN0b3IyKCksIG5ldyBWZWN0b3IyKCksIG5ldyBWZWN0b3IyKCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gbW9ycGhzXG5cblx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IG1vcnBoVGFyZ2V0c0xlbmd0aDsgaiArKyApIHtcblxuXHRcdFx0XHR2YXIgbW9ycGhUYXJnZXQgPSBtb3JwaFRhcmdldHNbIGogXS52ZXJ0aWNlcztcblxuXHRcdFx0XHRtb3JwaFRhcmdldHNQb3NpdGlvblsgaiBdLnB1c2goIG1vcnBoVGFyZ2V0WyBmYWNlLmEgXSwgbW9ycGhUYXJnZXRbIGZhY2UuYiBdLCBtb3JwaFRhcmdldFsgZmFjZS5jIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogPCBtb3JwaE5vcm1hbHNMZW5ndGg7IGogKysgKSB7XG5cblx0XHRcdFx0dmFyIG1vcnBoTm9ybWFsID0gbW9ycGhOb3JtYWxzWyBqIF0udmVydGV4Tm9ybWFsc1sgaSBdO1xuXG5cdFx0XHRcdG1vcnBoVGFyZ2V0c05vcm1hbFsgaiBdLnB1c2goIG1vcnBoTm9ybWFsLmEsIG1vcnBoTm9ybWFsLmIsIG1vcnBoTm9ybWFsLmMgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBza2luc1xuXG5cdFx0XHRpZiAoIGhhc1NraW5JbmRpY2VzICkge1xuXG5cdFx0XHRcdHRoaXMuc2tpbkluZGljZXMucHVzaCggc2tpbkluZGljZXNbIGZhY2UuYSBdLCBza2luSW5kaWNlc1sgZmFjZS5iIF0sIHNraW5JbmRpY2VzWyBmYWNlLmMgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzU2tpbldlaWdodHMgKSB7XG5cblx0XHRcdFx0dGhpcy5za2luV2VpZ2h0cy5wdXNoKCBza2luV2VpZ2h0c1sgZmFjZS5hIF0sIHNraW5XZWlnaHRzWyBmYWNlLmIgXSwgc2tpbldlaWdodHNbIGZhY2UuYyBdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMuY29tcHV0ZUdyb3VwcyggZ2VvbWV0cnkgKTtcblxuXHRcdHRoaXMudmVydGljZXNOZWVkVXBkYXRlID0gZ2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlO1xuXHRcdHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSBnZW9tZXRyeS5ub3JtYWxzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLmNvbG9yc05lZWRVcGRhdGUgPSBnZW9tZXRyeS5jb2xvcnNOZWVkVXBkYXRlO1xuXHRcdHRoaXMudXZzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LnV2c05lZWRVcGRhdGU7XG5cdFx0dGhpcy5ncm91cHNOZWVkVXBkYXRlID0gZ2VvbWV0cnkuZ3JvdXBzTmVlZFVwZGF0ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gYXJyYXlNYXgoIGFycmF5ICkge1xuXG5cdGlmICggYXJyYXkubGVuZ3RoID09PSAwICkgcmV0dXJuIC0gSW5maW5pdHk7XG5cblx0dmFyIG1heCA9IGFycmF5WyAwIF07XG5cblx0Zm9yICggdmFyIGkgPSAxLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgKysgaSApIHtcblxuXHRcdGlmICggYXJyYXlbIGkgXSA+IG1heCApIG1heCA9IGFycmF5WyBpIF07XG5cblx0fVxuXG5cdHJldHVybiBtYXg7XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG52YXIgYnVmZmVyR2VvbWV0cnlJZCA9IDE7IC8vIEJ1ZmZlckdlb21ldHJ5IHVzZXMgb2RkIG51bWJlcnMgYXMgSWRcblxuZnVuY3Rpb24gQnVmZmVyR2VvbWV0cnkoKSB7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBidWZmZXJHZW9tZXRyeUlkICs9IDIgfSApO1xuXG5cdHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdHRoaXMubmFtZSA9ICcnO1xuXHR0aGlzLnR5cGUgPSAnQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMuaW5kZXggPSBudWxsO1xuXHR0aGlzLmF0dHJpYnV0ZXMgPSB7fTtcblxuXHR0aGlzLm1vcnBoQXR0cmlidXRlcyA9IHt9O1xuXG5cdHRoaXMuZ3JvdXBzID0gW107XG5cblx0dGhpcy5ib3VuZGluZ0JveCA9IG51bGw7XG5cdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsO1xuXG5cdHRoaXMuZHJhd1JhbmdlID0geyBzdGFydDogMCwgY291bnQ6IEluZmluaXR5IH07XG5cbn1cblxuQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEJ1ZmZlckdlb21ldHJ5LFxuXG5cdGlzQnVmZmVyR2VvbWV0cnk6IHRydWUsXG5cblx0Z2V0SW5kZXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmluZGV4O1xuXG5cdH0sXG5cblx0c2V0SW5kZXg6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIGluZGV4ICkgKSB7XG5cblx0XHRcdHRoaXMuaW5kZXggPSBuZXcgKCBhcnJheU1heCggaW5kZXggKSA+IDY1NTM1ID8gVWludDMyQnVmZmVyQXR0cmlidXRlIDogVWludDE2QnVmZmVyQXR0cmlidXRlICkoIGluZGV4LCAxICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmluZGV4ID0gaW5kZXg7XG5cblx0XHR9XG5cblx0fSxcblxuXHRhZGRBdHRyaWJ1dGU6IGZ1bmN0aW9uICggbmFtZSwgYXR0cmlidXRlICkge1xuXG5cdFx0aWYgKCAhICggYXR0cmlidXRlICYmIGF0dHJpYnV0ZS5pc0J1ZmZlckF0dHJpYnV0ZSApICYmICEgKCBhdHRyaWJ1dGUgJiYgYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRBdHRyaWJ1dGUoKSBub3cgZXhwZWN0cyAoIG5hbWUsIGF0dHJpYnV0ZSApLicgKTtcblxuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoIG5hbWUsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGFyZ3VtZW50c1sgMSBdLCBhcmd1bWVudHNbIDIgXSApICk7XG5cblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggbmFtZSA9PT0gJ2luZGV4JyApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuYWRkQXR0cmlidXRlOiBVc2UgLnNldEluZGV4KCkgZm9yIGluZGV4IGF0dHJpYnV0ZS4nICk7XG5cdFx0XHR0aGlzLnNldEluZGV4KCBhdHRyaWJ1dGUgKTtcblxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5hdHRyaWJ1dGVzWyBuYW1lIF0gPSBhdHRyaWJ1dGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldEF0dHJpYnV0ZTogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuYXR0cmlidXRlc1sgbmFtZSBdO1xuXG5cdH0sXG5cblx0cmVtb3ZlQXR0cmlidXRlOiBmdW5jdGlvbiAoIG5hbWUgKSB7XG5cblx0XHRkZWxldGUgdGhpcy5hdHRyaWJ1dGVzWyBuYW1lIF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZEdyb3VwOiBmdW5jdGlvbiAoIHN0YXJ0LCBjb3VudCwgbWF0ZXJpYWxJbmRleCApIHtcblxuXHRcdHRoaXMuZ3JvdXBzLnB1c2goIHtcblxuXHRcdFx0c3RhcnQ6IHN0YXJ0LFxuXHRcdFx0Y291bnQ6IGNvdW50LFxuXHRcdFx0bWF0ZXJpYWxJbmRleDogbWF0ZXJpYWxJbmRleCAhPT0gdW5kZWZpbmVkID8gbWF0ZXJpYWxJbmRleCA6IDBcblxuXHRcdH0gKTtcblxuXHR9LFxuXG5cdGNsZWFyR3JvdXBzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmdyb3VwcyA9IFtdO1xuXG5cdH0sXG5cblx0c2V0RHJhd1JhbmdlOiBmdW5jdGlvbiAoIHN0YXJ0LCBjb3VudCApIHtcblxuXHRcdHRoaXMuZHJhd1JhbmdlLnN0YXJ0ID0gc3RhcnQ7XG5cdFx0dGhpcy5kcmF3UmFuZ2UuY291bnQgPSBjb3VudDtcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4OiBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRcdHZhciBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0bWF0cml4LmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uICk7XG5cdFx0XHRwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHR2YXIgbm9ybWFsID0gdGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtcblxuXHRcdGlmICggbm9ybWFsICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBub3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpLmdldE5vcm1hbE1hdHJpeCggbWF0cml4ICk7XG5cblx0XHRcdG5vcm1hbE1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBub3JtYWwgKTtcblx0XHRcdG5vcm1hbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdGF0ZVg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgeC1heGlzXG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVgoIGFuZ2xlICkge1xuXG5cdFx0XHRtMS5tYWtlUm90YXRpb25YKCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJvdGF0ZVk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgeS1heGlzXG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVkoIGFuZ2xlICkge1xuXG5cdFx0XHRtMS5tYWtlUm90YXRpb25ZKCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJvdGF0ZVo6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgei1heGlzXG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVooIGFuZ2xlICkge1xuXG5cdFx0XHRtMS5tYWtlUm90YXRpb25aKCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gdHJhbnNsYXRlIGdlb21ldHJ5XG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHRyYW5zbGF0ZSggeCwgeSwgeiApIHtcblxuXHRcdFx0bTEubWFrZVRyYW5zbGF0aW9uKCB4LCB5LCB6ICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0c2NhbGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHNjYWxlIGdlb21ldHJ5XG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNjYWxlKCB4LCB5LCB6ICkge1xuXG5cdFx0XHRtMS5tYWtlU2NhbGUoIHgsIHksIHogKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRsb29rQXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBvYmogPSBuZXcgT2JqZWN0M0QoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBsb29rQXQoIHZlY3RvciApIHtcblxuXHRcdFx0b2JqLmxvb2tBdCggdmVjdG9yICk7XG5cblx0XHRcdG9iai51cGRhdGVNYXRyaXgoKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggb2JqLm1hdHJpeCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2VudGVyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgb2Zmc2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjZW50ZXIoKSB7XG5cblx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3guZ2V0Q2VudGVyKCBvZmZzZXQgKS5uZWdhdGUoKTtcblxuXHRcdFx0dGhpcy50cmFuc2xhdGUoIG9mZnNldC54LCBvZmZzZXQueSwgb2Zmc2V0LnogKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRzZXRGcm9tT2JqZWN0OiBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdC8vIGNvbnNvbGUubG9nKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuc2V0RnJvbU9iamVjdCgpLiBDb252ZXJ0aW5nJywgb2JqZWN0LCB0aGlzICk7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7XG5cblx0XHRpZiAoIG9iamVjdC5pc1BvaW50cyB8fCBvYmplY3QuaXNMaW5lICkge1xuXG5cdFx0XHR2YXIgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCAqIDMsIDMgKTtcblx0XHRcdHZhciBjb2xvcnMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkuY29sb3JzLmxlbmd0aCAqIDMsIDMgKTtcblxuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIHBvc2l0aW9ucy5jb3B5VmVjdG9yM3NBcnJheSggZ2VvbWV0cnkudmVydGljZXMgKSApO1xuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIGNvbG9ycy5jb3B5Q29sb3JzQXJyYXkoIGdlb21ldHJ5LmNvbG9ycyApICk7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkubGluZURpc3RhbmNlcyAmJiBnZW9tZXRyeS5saW5lRGlzdGFuY2VzLmxlbmd0aCA9PT0gZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoICkge1xuXG5cdFx0XHRcdHZhciBsaW5lRGlzdGFuY2VzID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGdlb21ldHJ5LmxpbmVEaXN0YW5jZXMubGVuZ3RoLCAxICk7XG5cblx0XHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdsaW5lRGlzdGFuY2UnLCBsaW5lRGlzdGFuY2VzLmNvcHlBcnJheSggZ2VvbWV0cnkubGluZURpc3RhbmNlcyApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUuY2xvbmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBnZW9tZXRyeS5ib3VuZGluZ0JveC5jbG9uZSgpO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNNZXNoICkge1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0dGhpcy5mcm9tR2VvbWV0cnkoIGdlb21ldHJ5ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVBvaW50czogZnVuY3Rpb24gKCBwb2ludHMgKSB7XG5cblx0XHR2YXIgcG9zaXRpb24gPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgcG9pbnQgPSBwb2ludHNbIGkgXTtcblx0XHRcdHBvc2l0aW9uLnB1c2goIHBvaW50LngsIHBvaW50LnksIHBvaW50LnogfHwgMCApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgMyApICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHVwZGF0ZUZyb21PYmplY3Q6IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0aWYgKCBvYmplY3QuaXNNZXNoICkge1xuXG5cdFx0XHR2YXIgZGlyZWN0ID0gZ2VvbWV0cnkuX19kaXJlY3RHZW9tZXRyeTtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5lbGVtZW50c05lZWRVcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0ZGlyZWN0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRnZW9tZXRyeS5lbGVtZW50c05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGRpcmVjdCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiB0aGlzLmZyb21HZW9tZXRyeSggZ2VvbWV0cnkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRkaXJlY3QudmVydGljZXNOZWVkVXBkYXRlID0gZ2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlO1xuXHRcdFx0ZGlyZWN0Lm5vcm1hbHNOZWVkVXBkYXRlID0gZ2VvbWV0cnkubm9ybWFsc05lZWRVcGRhdGU7XG5cdFx0XHRkaXJlY3QuY29sb3JzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGU7XG5cdFx0XHRkaXJlY3QudXZzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LnV2c05lZWRVcGRhdGU7XG5cdFx0XHRkaXJlY3QuZ3JvdXBzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGU7XG5cblx0XHRcdGdlb21ldHJ5LnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHRcdFx0Z2VvbWV0cnkubm9ybWFsc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0XHRcdGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0XHRcdGdlb21ldHJ5LnV2c05lZWRVcGRhdGUgPSBmYWxzZTtcblx0XHRcdGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdFx0Z2VvbWV0cnkgPSBkaXJlY3Q7XG5cblx0XHR9XG5cblx0XHR2YXIgYXR0cmlidXRlO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS52ZXJ0aWNlc05lZWRVcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuY29weVZlY3RvcjNzQXJyYXkoIGdlb21ldHJ5LnZlcnRpY2VzICk7XG5cdFx0XHRcdGF0dHJpYnV0ZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0Z2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5Lm5vcm1hbHNOZWVkVXBkYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRhdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0ZXMubm9ybWFsO1xuXG5cdFx0XHRpZiAoIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGF0dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJheSggZ2VvbWV0cnkubm9ybWFscyApO1xuXHRcdFx0XHRhdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5Lm5vcm1hbHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5jb2xvcjtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuY29weUNvbG9yc0FycmF5KCBnZW9tZXRyeS5jb2xvcnMgKTtcblx0XHRcdFx0YXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyeS5jb2xvcnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LnV2c05lZWRVcGRhdGUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy51djtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuY29weVZlY3RvcjJzQXJyYXkoIGdlb21ldHJ5LnV2cyApO1xuXHRcdFx0XHRhdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LnV2c05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkubGluZURpc3RhbmNlc05lZWRVcGRhdGUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5saW5lRGlzdGFuY2U7XG5cblx0XHRcdGlmICggYXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlLmNvcHlBcnJheSggZ2VvbWV0cnkubGluZURpc3RhbmNlcyApO1xuXHRcdFx0XHRhdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGUgKSB7XG5cblx0XHRcdGdlb21ldHJ5LmNvbXB1dGVHcm91cHMoIG9iamVjdC5nZW9tZXRyeSApO1xuXHRcdFx0dGhpcy5ncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XG5cblx0XHRcdGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZnJvbUdlb21ldHJ5OiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0Z2VvbWV0cnkuX19kaXJlY3RHZW9tZXRyeSA9IG5ldyBEaXJlY3RHZW9tZXRyeSgpLmZyb21HZW9tZXRyeSggZ2VvbWV0cnkgKTtcblxuXHRcdHJldHVybiB0aGlzLmZyb21EaXJlY3RHZW9tZXRyeSggZ2VvbWV0cnkuX19kaXJlY3RHZW9tZXRyeSApO1xuXG5cdH0sXG5cblx0ZnJvbURpcmVjdEdlb21ldHJ5OiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCAqIDMgKTtcblx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkuY29weVZlY3RvcjNzQXJyYXkoIGdlb21ldHJ5LnZlcnRpY2VzICkgKTtcblxuXHRcdGlmICggZ2VvbWV0cnkubm9ybWFscy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR2YXIgbm9ybWFscyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5Lm5vcm1hbHMubGVuZ3RoICogMyApO1xuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkuY29weVZlY3RvcjNzQXJyYXkoIGdlb21ldHJ5Lm5vcm1hbHMgKSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5jb2xvcnMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIGNvbG9ycyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5LmNvbG9ycy5sZW5ndGggKiAzICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkuY29weUNvbG9yc0FycmF5KCBnZW9tZXRyeS5jb2xvcnMgKSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS51dnMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIHV2cyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5LnV2cy5sZW5ndGggKiAyICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkuY29weVZlY3RvcjJzQXJyYXkoIGdlb21ldHJ5LnV2cyApICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LnV2czIubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIHV2czIgPSBuZXcgRmxvYXQzMkFycmF5KCBnZW9tZXRyeS51dnMyLmxlbmd0aCAqIDIgKTtcblx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCAndXYyJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggdXZzMiwgMiApLmNvcHlWZWN0b3Iyc0FycmF5KCBnZW9tZXRyeS51dnMyICkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGdyb3Vwc1xuXG5cdFx0dGhpcy5ncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XG5cblx0XHQvLyBtb3JwaHNcblxuXHRcdGZvciAoIHZhciBuYW1lIGluIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gW107XG5cdFx0XHR2YXIgbW9ycGhUYXJnZXRzID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzWyBuYW1lIF07XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IG1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBtb3JwaFRhcmdldCA9IG1vcnBoVGFyZ2V0c1sgaSBdO1xuXG5cdFx0XHRcdHZhciBhdHRyaWJ1dGUgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbW9ycGhUYXJnZXQubGVuZ3RoICogMywgMyApO1xuXG5cdFx0XHRcdGFycmF5LnB1c2goIGF0dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJheSggbW9ycGhUYXJnZXQgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF0gPSBhcnJheTtcblxuXHRcdH1cblxuXHRcdC8vIHNraW5uaW5nXG5cblx0XHRpZiAoIGdlb21ldHJ5LnNraW5JbmRpY2VzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHZhciBza2luSW5kaWNlcyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBnZW9tZXRyeS5za2luSW5kaWNlcy5sZW5ndGggKiA0LCA0ICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3NraW5JbmRleCcsIHNraW5JbmRpY2VzLmNvcHlWZWN0b3I0c0FycmF5KCBnZW9tZXRyeS5za2luSW5kaWNlcyApICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LnNraW5XZWlnaHRzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHZhciBza2luV2VpZ2h0cyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBnZW9tZXRyeS5za2luV2VpZ2h0cy5sZW5ndGggKiA0LCA0ICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3NraW5XZWlnaHQnLCBza2luV2VpZ2h0cy5jb3B5VmVjdG9yNHNBcnJheSggZ2VvbWV0cnkuc2tpbldlaWdodHMgKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IGdlb21ldHJ5LmJvdW5kaW5nQm94LmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbXB1dGVCb3VuZGluZ0JveDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nQm94ID09PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gbmV3IEJveDMoKTtcblxuXHRcdH1cblxuXHRcdHZhciBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveC5tYWtlRW1wdHkoKTtcblxuXHRcdH1cblxuXHRcdGlmICggaXNOYU4oIHRoaXMuYm91bmRpbmdCb3gubWluLnggKSB8fCBpc05hTiggdGhpcy5ib3VuZGluZ0JveC5taW4ueSApIHx8IGlzTmFOKCB0aGlzLmJvdW5kaW5nQm94Lm1pbi56ICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3g6IENvbXB1dGVkIG1pbi9tYXggaGF2ZSBOYU4gdmFsdWVzLiBUaGUgXCJwb3NpdGlvblwiIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsIHRoaXMgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNvbXB1dGVCb3VuZGluZ1NwaGVyZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGJveCA9IG5ldyBCb3gzKCk7XG5cdFx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCkge1xuXG5cdFx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSB7XG5cblx0XHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgcG9zaXRpb24gPSB0aGlzLmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRcdGlmICggcG9zaXRpb24gKSB7XG5cblx0XHRcdFx0dmFyIGNlbnRlciA9IHRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyO1xuXG5cdFx0XHRcdGJveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiApO1xuXHRcdFx0XHRib3guZ2V0Q2VudGVyKCBjZW50ZXIgKTtcblxuXHRcdFx0XHQvLyBob3BpbmcgdG8gZmluZCBhIGJvdW5kaW5nU3BoZXJlIHdpdGggYSByYWRpdXMgc21hbGxlciB0aGFuIHRoZVxuXHRcdFx0XHQvLyBib3VuZGluZ1NwaGVyZSBvZiB0aGUgYm91bmRpbmdCb3g6IHNxcnQoMykgc21hbGxlciBpbiB0aGUgYmVzdCBjYXNlXG5cblx0XHRcdFx0dmFyIG1heFJhZGl1c1NxID0gMDtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gcG9zaXRpb24uY291bnQ7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHZlY3Rvci54ID0gcG9zaXRpb24uZ2V0WCggaSApO1xuXHRcdFx0XHRcdHZlY3Rvci55ID0gcG9zaXRpb24uZ2V0WSggaSApO1xuXHRcdFx0XHRcdHZlY3Rvci56ID0gcG9zaXRpb24uZ2V0WiggaSApO1xuXHRcdFx0XHRcdG1heFJhZGl1c1NxID0gTWF0aC5tYXgoIG1heFJhZGl1c1NxLCBjZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIHZlY3RvciApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzID0gTWF0aC5zcXJ0KCBtYXhSYWRpdXNTcSApO1xuXG5cdFx0XHRcdGlmICggaXNOYU4oIHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzICkgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IENvbXB1dGVkIHJhZGl1cyBpcyBOYU4uIFRoZSBcInBvc2l0aW9uXCIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJywgdGhpcyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y29tcHV0ZUZhY2VOb3JtYWxzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXG5cdH0sXG5cblx0Y29tcHV0ZVZlcnRleE5vcm1hbHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBpbmRleCA9IHRoaXMuaW5kZXg7XG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XG5cdFx0dmFyIGdyb3VwcyA9IHRoaXMuZ3JvdXBzO1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGVzLnBvc2l0aW9uICkge1xuXG5cdFx0XHR2YXIgcG9zaXRpb25zID0gYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGVzLm5vcm1hbCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggbmV3IEZsb2F0MzJBcnJheSggcG9zaXRpb25zLmxlbmd0aCApLCAzICkgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyByZXNldCBleGlzdGluZyBub3JtYWxzIHRvIHplcm9cblxuXHRcdFx0XHR2YXIgYXJyYXkgPSBhdHRyaWJ1dGVzLm5vcm1hbC5hcnJheTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gYXJyYXkubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRhcnJheVsgaSBdID0gMDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG5vcm1hbHMgPSBhdHRyaWJ1dGVzLm5vcm1hbC5hcnJheTtcblxuXHRcdFx0dmFyIHZBLCB2QiwgdkM7XG5cdFx0XHR2YXIgcEEgPSBuZXcgVmVjdG9yMygpLCBwQiA9IG5ldyBWZWN0b3IzKCksIHBDID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdHZhciBjYiA9IG5ldyBWZWN0b3IzKCksIGFiID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0Ly8gaW5kZXhlZCBlbGVtZW50c1xuXG5cdFx0XHRpZiAoIGluZGV4ICkge1xuXG5cdFx0XHRcdHZhciBpbmRpY2VzID0gaW5kZXguYXJyYXk7XG5cblx0XHRcdFx0aWYgKCBncm91cHMubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRcdFx0dGhpcy5hZGRHcm91cCggMCwgaW5kaWNlcy5sZW5ndGggKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IGdyb3Vwcy5sZW5ndGg7IGogPCBqbDsgKysgaiApIHtcblxuXHRcdFx0XHRcdHZhciBncm91cCA9IGdyb3Vwc1sgaiBdO1xuXG5cdFx0XHRcdFx0dmFyIHN0YXJ0ID0gZ3JvdXAuc3RhcnQ7XG5cdFx0XHRcdFx0dmFyIGNvdW50ID0gZ3JvdXAuY291bnQ7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IHN0YXJ0LCBpbCA9IHN0YXJ0ICsgY291bnQ7IGkgPCBpbDsgaSArPSAzICkge1xuXG5cdFx0XHRcdFx0XHR2QSA9IGluZGljZXNbIGkgKyAwIF0gKiAzO1xuXHRcdFx0XHRcdFx0dkIgPSBpbmRpY2VzWyBpICsgMSBdICogMztcblx0XHRcdFx0XHRcdHZDID0gaW5kaWNlc1sgaSArIDIgXSAqIDM7XG5cblx0XHRcdFx0XHRcdHBBLmZyb21BcnJheSggcG9zaXRpb25zLCB2QSApO1xuXHRcdFx0XHRcdFx0cEIuZnJvbUFycmF5KCBwb3NpdGlvbnMsIHZCICk7XG5cdFx0XHRcdFx0XHRwQy5mcm9tQXJyYXkoIHBvc2l0aW9ucywgdkMgKTtcblxuXHRcdFx0XHRcdFx0Y2Iuc3ViVmVjdG9ycyggcEMsIHBCICk7XG5cdFx0XHRcdFx0XHRhYi5zdWJWZWN0b3JzKCBwQSwgcEIgKTtcblx0XHRcdFx0XHRcdGNiLmNyb3NzKCBhYiApO1xuXG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QSBdICs9IGNiLng7XG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QSArIDEgXSArPSBjYi55O1xuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkEgKyAyIF0gKz0gY2IuejtcblxuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkIgXSArPSBjYi54O1xuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkIgKyAxIF0gKz0gY2IueTtcblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZCICsgMiBdICs9IGNiLno7XG5cblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZDIF0gKz0gY2IueDtcblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZDICsgMSBdICs9IGNiLnk7XG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QyArIDIgXSArPSBjYi56O1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBub24taW5kZXhlZCBlbGVtZW50cyAodW5jb25uZWN0ZWQgdHJpYW5nbGUgc291cClcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gcG9zaXRpb25zLmxlbmd0aDsgaSA8IGlsOyBpICs9IDkgKSB7XG5cblx0XHRcdFx0XHRwQS5mcm9tQXJyYXkoIHBvc2l0aW9ucywgaSApO1xuXHRcdFx0XHRcdHBCLmZyb21BcnJheSggcG9zaXRpb25zLCBpICsgMyApO1xuXHRcdFx0XHRcdHBDLmZyb21BcnJheSggcG9zaXRpb25zLCBpICsgNiApO1xuXG5cdFx0XHRcdFx0Y2Iuc3ViVmVjdG9ycyggcEMsIHBCICk7XG5cdFx0XHRcdFx0YWIuc3ViVmVjdG9ycyggcEEsIHBCICk7XG5cdFx0XHRcdFx0Y2IuY3Jvc3MoIGFiICk7XG5cblx0XHRcdFx0XHRub3JtYWxzWyBpIF0gPSBjYi54O1xuXHRcdFx0XHRcdG5vcm1hbHNbIGkgKyAxIF0gPSBjYi55O1xuXHRcdFx0XHRcdG5vcm1hbHNbIGkgKyAyIF0gPSBjYi56O1xuXG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDMgXSA9IGNiLng7XG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDQgXSA9IGNiLnk7XG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDUgXSA9IGNiLno7XG5cblx0XHRcdFx0XHRub3JtYWxzWyBpICsgNiBdID0gY2IueDtcblx0XHRcdFx0XHRub3JtYWxzWyBpICsgNyBdID0gY2IueTtcblx0XHRcdFx0XHRub3JtYWxzWyBpICsgOCBdID0gY2IuejtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5ub3JtYWxpemVOb3JtYWxzKCk7XG5cblx0XHRcdGF0dHJpYnV0ZXMubm9ybWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdG1lcmdlOiBmdW5jdGlvbiAoIGdlb21ldHJ5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoICEgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5tZXJnZSgpOiBnZW9tZXRyeSBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuQnVmZmVyR2VvbWV0cnkuJywgZ2VvbWV0cnkgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG9mZnNldCA9IDA7XG5cblx0XHRcdGNvbnNvbGUud2Fybihcblx0XHRcdFx0J1RIUkVFLkJ1ZmZlckdlb21ldHJ5Lm1lcmdlKCk6IE92ZXJ3cml0aW5nIG9yaWdpbmFsIGdlb21ldHJ5LCBzdGFydGluZyBhdCBvZmZzZXQ9MC4gJ1xuXHRcdFx0XHQrICdVc2UgQnVmZmVyR2VvbWV0cnlVdGlscy5tZXJnZUJ1ZmZlckdlb21ldHJpZXMoKSBmb3IgbG9zc2xlc3MgbWVyZ2UuJ1xuXHRcdFx0KTtcblxuXHRcdH1cblxuXHRcdHZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggdmFyIGtleSBpbiBhdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmF0dHJpYnV0ZXNbIGtleSBdID09PSB1bmRlZmluZWQgKSBjb250aW51ZTtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZTEgPSBhdHRyaWJ1dGVzWyBrZXkgXTtcblx0XHRcdHZhciBhdHRyaWJ1dGVBcnJheTEgPSBhdHRyaWJ1dGUxLmFycmF5O1xuXG5cdFx0XHR2YXIgYXR0cmlidXRlMiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXNbIGtleSBdO1xuXHRcdFx0dmFyIGF0dHJpYnV0ZUFycmF5MiA9IGF0dHJpYnV0ZTIuYXJyYXk7XG5cblx0XHRcdHZhciBhdHRyaWJ1dGVTaXplID0gYXR0cmlidXRlMi5pdGVtU2l6ZTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBqID0gYXR0cmlidXRlU2l6ZSAqIG9mZnNldDsgaSA8IGF0dHJpYnV0ZUFycmF5Mi5sZW5ndGg7IGkgKyssIGogKysgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlQXJyYXkxWyBqIF0gPSBhdHRyaWJ1dGVBcnJheTJbIGkgXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRub3JtYWxpemVOb3JtYWxzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBub3JtYWxpemVOb3JtYWxzKCkge1xuXG5cdFx0XHR2YXIgbm9ybWFscyA9IHRoaXMuYXR0cmlidXRlcy5ub3JtYWw7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBub3JtYWxzLmNvdW50OyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmVjdG9yLnggPSBub3JtYWxzLmdldFgoIGkgKTtcblx0XHRcdFx0dmVjdG9yLnkgPSBub3JtYWxzLmdldFkoIGkgKTtcblx0XHRcdFx0dmVjdG9yLnogPSBub3JtYWxzLmdldFooIGkgKTtcblxuXHRcdFx0XHR2ZWN0b3Iubm9ybWFsaXplKCk7XG5cblx0XHRcdFx0bm9ybWFscy5zZXRYWVooIGksIHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnogKTtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dG9Ob25JbmRleGVkOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuaW5kZXggPT09IG51bGwgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LnRvTm9uSW5kZXhlZCgpOiBHZW9tZXRyeSBpcyBhbHJlYWR5IG5vbi1pbmRleGVkLicgKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGdlb21ldHJ5MiA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdFx0dmFyIGluZGljZXMgPSB0aGlzLmluZGV4LmFycmF5O1xuXHRcdHZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggdmFyIG5hbWUgaW4gYXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIG5hbWUgXTtcblxuXHRcdFx0dmFyIGFycmF5ID0gYXR0cmlidXRlLmFycmF5O1xuXHRcdFx0dmFyIGl0ZW1TaXplID0gYXR0cmlidXRlLml0ZW1TaXplO1xuXG5cdFx0XHR2YXIgYXJyYXkyID0gbmV3IGFycmF5LmNvbnN0cnVjdG9yKCBpbmRpY2VzLmxlbmd0aCAqIGl0ZW1TaXplICk7XG5cblx0XHRcdHZhciBpbmRleCA9IDAsIGluZGV4MiA9IDA7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGluZGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRpbmRleCA9IGluZGljZXNbIGkgXSAqIGl0ZW1TaXplO1xuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IGl0ZW1TaXplOyBqICsrICkge1xuXG5cdFx0XHRcdFx0YXJyYXkyWyBpbmRleDIgKysgXSA9IGFycmF5WyBpbmRleCArKyBdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyeTIuYWRkQXR0cmlidXRlKCBuYW1lLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBhcnJheTIsIGl0ZW1TaXplICkgKTtcblxuXHRcdH1cblxuXHRcdHZhciBncm91cHMgPSB0aGlzLmdyb3VwcztcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGdyb3Vwcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZ3JvdXAgPSBncm91cHNbIGkgXTtcblx0XHRcdGdlb21ldHJ5Mi5hZGRHcm91cCggZ3JvdXAuc3RhcnQsIGdyb3VwLmNvdW50LCBncm91cC5tYXRlcmlhbEluZGV4ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZ2VvbWV0cnkyO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZGF0YSA9IHtcblx0XHRcdG1ldGFkYXRhOiB7XG5cdFx0XHRcdHZlcnNpb246IDQuNSxcblx0XHRcdFx0dHlwZTogJ0J1ZmZlckdlb21ldHJ5Jyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnQnVmZmVyR2VvbWV0cnkudG9KU09OJ1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBzdGFuZGFyZCBCdWZmZXJHZW9tZXRyeSBzZXJpYWxpemF0aW9uXG5cblx0XHRkYXRhLnV1aWQgPSB0aGlzLnV1aWQ7XG5cdFx0ZGF0YS50eXBlID0gdGhpcy50eXBlO1xuXHRcdGlmICggdGhpcy5uYW1lICE9PSAnJyApIGRhdGEubmFtZSA9IHRoaXMubmFtZTtcblxuXHRcdGlmICggdGhpcy5wYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBwYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzO1xuXG5cdFx0XHRmb3IgKCB2YXIga2V5IGluIHBhcmFtZXRlcnMgKSB7XG5cblx0XHRcdFx0aWYgKCBwYXJhbWV0ZXJzWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgZGF0YVsga2V5IF0gPSBwYXJhbWV0ZXJzWyBrZXkgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGF0YTtcblxuXHRcdH1cblxuXHRcdGRhdGEuZGF0YSA9IHsgYXR0cmlidXRlczoge30gfTtcblxuXHRcdHZhciBpbmRleCA9IHRoaXMuaW5kZXg7XG5cblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggaW5kZXguYXJyYXkgKTtcblxuXHRcdFx0ZGF0YS5kYXRhLmluZGV4ID0ge1xuXHRcdFx0XHR0eXBlOiBpbmRleC5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLFxuXHRcdFx0XHRhcnJheTogYXJyYXlcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHR2YXIgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcblxuXHRcdGZvciAoIHZhciBrZXkgaW4gYXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIGtleSBdO1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXR0cmlidXRlLmFycmF5ICk7XG5cblx0XHRcdGRhdGEuZGF0YS5hdHRyaWJ1dGVzWyBrZXkgXSA9IHtcblx0XHRcdFx0aXRlbVNpemU6IGF0dHJpYnV0ZS5pdGVtU2l6ZSxcblx0XHRcdFx0dHlwZTogYXR0cmlidXRlLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsXG5cdFx0XHRcdGFycmF5OiBhcnJheSxcblx0XHRcdFx0bm9ybWFsaXplZDogYXR0cmlidXRlLm5vcm1hbGl6ZWRcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHR2YXIgZ3JvdXBzID0gdGhpcy5ncm91cHM7XG5cblx0XHRpZiAoIGdyb3Vwcy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRkYXRhLmRhdGEuZ3JvdXBzID0gSlNPTi5wYXJzZSggSlNPTi5zdHJpbmdpZnkoIGdyb3VwcyApICk7XG5cblx0XHR9XG5cblx0XHR2YXIgYm91bmRpbmdTcGhlcmUgPSB0aGlzLmJvdW5kaW5nU3BoZXJlO1xuXG5cdFx0aWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0ZGF0YS5kYXRhLmJvdW5kaW5nU3BoZXJlID0ge1xuXHRcdFx0XHRjZW50ZXI6IGJvdW5kaW5nU3BoZXJlLmNlbnRlci50b0FycmF5KCksXG5cdFx0XHRcdHJhZGl1czogYm91bmRpbmdTcGhlcmUucmFkaXVzXG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Lypcblx0XHQgLy8gSGFuZGxlIHByaW1pdGl2ZXNcblxuXHRcdCB2YXIgcGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVycztcblxuXHRcdCBpZiAoIHBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdCB2YXIgdmFsdWVzID0gW107XG5cblx0XHQgZm9yICggdmFyIGtleSBpbiBwYXJhbWV0ZXJzICkge1xuXG5cdFx0IHZhbHVlcy5wdXNoKCBwYXJhbWV0ZXJzWyBrZXkgXSApO1xuXG5cdFx0IH1cblxuXHRcdCB2YXIgZ2VvbWV0cnkgPSBPYmplY3QuY3JlYXRlKCB0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSApO1xuXHRcdCB0aGlzLmNvbnN0cnVjdG9yLmFwcGx5KCBnZW9tZXRyeSwgdmFsdWVzICk7XG5cdFx0IHJldHVybiBnZW9tZXRyeTtcblxuXHRcdCB9XG5cblx0XHQgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXHRcdCAqL1xuXG5cdFx0cmV0dXJuIG5ldyBCdWZmZXJHZW9tZXRyeSgpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dmFyIG5hbWUsIGksIGw7XG5cblx0XHQvLyByZXNldFxuXG5cdFx0dGhpcy5pbmRleCA9IG51bGw7XG5cdFx0dGhpcy5hdHRyaWJ1dGVzID0ge307XG5cdFx0dGhpcy5tb3JwaEF0dHJpYnV0ZXMgPSB7fTtcblx0XHR0aGlzLmdyb3VwcyA9IFtdO1xuXHRcdHRoaXMuYm91bmRpbmdCb3ggPSBudWxsO1xuXHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsO1xuXG5cdFx0Ly8gbmFtZVxuXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XG5cblx0XHQvLyBpbmRleFxuXG5cdFx0dmFyIGluZGV4ID0gc291cmNlLmluZGV4O1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5zZXRJbmRleCggaW5kZXguY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYXR0cmlidXRlc1xuXG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSBzb3VyY2UuYXR0cmlidXRlcztcblxuXHRcdGZvciAoIG5hbWUgaW4gYXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIG5hbWUgXTtcblx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCBuYW1lLCBhdHRyaWJ1dGUuY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gbW9ycGggYXR0cmlidXRlc1xuXG5cdFx0dmFyIG1vcnBoQXR0cmlidXRlcyA9IHNvdXJjZS5tb3JwaEF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCBuYW1lIGluIG1vcnBoQXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gW107XG5cdFx0XHR2YXIgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXTsgLy8gbW9ycGhBdHRyaWJ1dGU6IGFycmF5IG9mIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGVzXG5cblx0XHRcdGZvciAoIGkgPSAwLCBsID0gbW9ycGhBdHRyaWJ1dGUubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRhcnJheS5wdXNoKCBtb3JwaEF0dHJpYnV0ZVsgaSBdLmNsb25lKCkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1vcnBoQXR0cmlidXRlc1sgbmFtZSBdID0gYXJyYXk7XG5cblx0XHR9XG5cblx0XHQvLyBncm91cHNcblxuXHRcdHZhciBncm91cHMgPSBzb3VyY2UuZ3JvdXBzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGwgPSBncm91cHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07XG5cdFx0XHR0aGlzLmFkZEdyb3VwKCBncm91cC5zdGFydCwgZ3JvdXAuY291bnQsIGdyb3VwLm1hdGVyaWFsSW5kZXggKTtcblxuXHRcdH1cblxuXHRcdC8vIGJvdW5kaW5nIGJveFxuXG5cdFx0dmFyIGJvdW5kaW5nQm94ID0gc291cmNlLmJvdW5kaW5nQm94O1xuXG5cdFx0aWYgKCBib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IGJvdW5kaW5nQm94LmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHQvLyBib3VuZGluZyBzcGhlcmVcblxuXHRcdHZhciBib3VuZGluZ1NwaGVyZSA9IHNvdXJjZS5ib3VuZGluZ1NwaGVyZTtcblxuXHRcdGlmICggYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBib3VuZGluZ1NwaGVyZS5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZHJhdyByYW5nZVxuXG5cdFx0dGhpcy5kcmF3UmFuZ2Uuc3RhcnQgPSBzb3VyY2UuZHJhd1JhbmdlLnN0YXJ0O1xuXHRcdHRoaXMuZHJhd1JhbmdlLmNvdW50ID0gc291cmNlLmRyYXdSYW5nZS5jb3VudDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gQm94R2VvbWV0cnlcblxuZnVuY3Rpb24gQm94R2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgZGVwdGhTZWdtZW50cyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0JveEdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0d2lkdGg6IHdpZHRoLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdGRlcHRoOiBkZXB0aCxcblx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRkZXB0aFNlZ21lbnRzOiBkZXB0aFNlZ21lbnRzXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBCb3hCdWZmZXJHZW9tZXRyeSggd2lkdGgsIGhlaWdodCwgZGVwdGgsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBkZXB0aFNlZ21lbnRzICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuQm94R2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5Cb3hHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCb3hHZW9tZXRyeTtcblxuLy8gQm94QnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gQm94QnVmZmVyR2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgZGVwdGhTZWdtZW50cyApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0JveEJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0d2lkdGg6IHdpZHRoLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdGRlcHRoOiBkZXB0aCxcblx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRkZXB0aFNlZ21lbnRzOiBkZXB0aFNlZ21lbnRzXG5cdH07XG5cblx0dmFyIHNjb3BlID0gdGhpcztcblxuXHR3aWR0aCA9IHdpZHRoIHx8IDE7XG5cdGhlaWdodCA9IGhlaWdodCB8fCAxO1xuXHRkZXB0aCA9IGRlcHRoIHx8IDE7XG5cblx0Ly8gc2VnbWVudHNcblxuXHR3aWR0aFNlZ21lbnRzID0gTWF0aC5mbG9vciggd2lkdGhTZWdtZW50cyApIHx8IDE7XG5cdGhlaWdodFNlZ21lbnRzID0gTWF0aC5mbG9vciggaGVpZ2h0U2VnbWVudHMgKSB8fCAxO1xuXHRkZXB0aFNlZ21lbnRzID0gTWF0aC5mbG9vciggZGVwdGhTZWdtZW50cyApIHx8IDE7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBudW1iZXJPZlZlcnRpY2VzID0gMDtcblx0dmFyIGdyb3VwU3RhcnQgPSAwO1xuXG5cdC8vIGJ1aWxkIGVhY2ggc2lkZSBvZiB0aGUgYm94IGdlb21ldHJ5XG5cblx0YnVpbGRQbGFuZSggJ3onLCAneScsICd4JywgLSAxLCAtIDEsIGRlcHRoLCBoZWlnaHQsIHdpZHRoLCBkZXB0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgMCApOyAvLyBweFxuXHRidWlsZFBsYW5lKCAneicsICd5JywgJ3gnLCAxLCAtIDEsIGRlcHRoLCBoZWlnaHQsIC0gd2lkdGgsIGRlcHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCAxICk7IC8vIG54XG5cdGJ1aWxkUGxhbmUoICd4JywgJ3onLCAneScsIDEsIDEsIHdpZHRoLCBkZXB0aCwgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBkZXB0aFNlZ21lbnRzLCAyICk7IC8vIHB5XG5cdGJ1aWxkUGxhbmUoICd4JywgJ3onLCAneScsIDEsIC0gMSwgd2lkdGgsIGRlcHRoLCAtIGhlaWdodCwgd2lkdGhTZWdtZW50cywgZGVwdGhTZWdtZW50cywgMyApOyAvLyBueVxuXHRidWlsZFBsYW5lKCAneCcsICd5JywgJ3onLCAxLCAtIDEsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgNCApOyAvLyBwelxuXHRidWlsZFBsYW5lKCAneCcsICd5JywgJ3onLCAtIDEsIC0gMSwgd2lkdGgsIGhlaWdodCwgLSBkZXB0aCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIDUgKTsgLy8gbnpcblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblx0ZnVuY3Rpb24gYnVpbGRQbGFuZSggdSwgdiwgdywgdWRpciwgdmRpciwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGdyaWRYLCBncmlkWSwgbWF0ZXJpYWxJbmRleCApIHtcblxuXHRcdHZhciBzZWdtZW50V2lkdGggPSB3aWR0aCAvIGdyaWRYO1xuXHRcdHZhciBzZWdtZW50SGVpZ2h0ID0gaGVpZ2h0IC8gZ3JpZFk7XG5cblx0XHR2YXIgd2lkdGhIYWxmID0gd2lkdGggLyAyO1xuXHRcdHZhciBoZWlnaHRIYWxmID0gaGVpZ2h0IC8gMjtcblx0XHR2YXIgZGVwdGhIYWxmID0gZGVwdGggLyAyO1xuXG5cdFx0dmFyIGdyaWRYMSA9IGdyaWRYICsgMTtcblx0XHR2YXIgZ3JpZFkxID0gZ3JpZFkgKyAxO1xuXG5cdFx0dmFyIHZlcnRleENvdW50ZXIgPSAwO1xuXHRcdHZhciBncm91cENvdW50ID0gMDtcblxuXHRcdHZhciBpeCwgaXk7XG5cblx0XHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRcdGZvciAoIGl5ID0gMDsgaXkgPCBncmlkWTE7IGl5ICsrICkge1xuXG5cdFx0XHR2YXIgeSA9IGl5ICogc2VnbWVudEhlaWdodCAtIGhlaWdodEhhbGY7XG5cblx0XHRcdGZvciAoIGl4ID0gMDsgaXggPCBncmlkWDE7IGl4ICsrICkge1xuXG5cdFx0XHRcdHZhciB4ID0gaXggKiBzZWdtZW50V2lkdGggLSB3aWR0aEhhbGY7XG5cblx0XHRcdFx0Ly8gc2V0IHZhbHVlcyB0byBjb3JyZWN0IHZlY3RvciBjb21wb25lbnRcblxuXHRcdFx0XHR2ZWN0b3JbIHUgXSA9IHggKiB1ZGlyO1xuXHRcdFx0XHR2ZWN0b3JbIHYgXSA9IHkgKiB2ZGlyO1xuXHRcdFx0XHR2ZWN0b3JbIHcgXSA9IGRlcHRoSGFsZjtcblxuXHRcdFx0XHQvLyBub3cgYXBwbHkgdmVjdG9yIHRvIHZlcnRleCBidWZmZXJcblxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56ICk7XG5cblx0XHRcdFx0Ly8gc2V0IHZhbHVlcyB0byBjb3JyZWN0IHZlY3RvciBjb21wb25lbnRcblxuXHRcdFx0XHR2ZWN0b3JbIHUgXSA9IDA7XG5cdFx0XHRcdHZlY3RvclsgdiBdID0gMDtcblx0XHRcdFx0dmVjdG9yWyB3IF0gPSBkZXB0aCA+IDAgPyAxIDogLSAxO1xuXG5cdFx0XHRcdC8vIG5vdyBhcHBseSB2ZWN0b3IgdG8gbm9ybWFsIGJ1ZmZlclxuXG5cdFx0XHRcdG5vcm1hbHMucHVzaCggdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApO1xuXG5cdFx0XHRcdC8vIHV2c1xuXG5cdFx0XHRcdHV2cy5wdXNoKCBpeCAvIGdyaWRYICk7XG5cdFx0XHRcdHV2cy5wdXNoKCAxIC0gKCBpeSAvIGdyaWRZICkgKTtcblxuXHRcdFx0XHQvLyBjb3VudGVyc1xuXG5cdFx0XHRcdHZlcnRleENvdW50ZXIgKz0gMTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gaW5kaWNlc1xuXG5cdFx0Ly8gMS4geW91IG5lZWQgdGhyZWUgaW5kaWNlcyB0byBkcmF3IGEgc2luZ2xlIGZhY2Vcblx0XHQvLyAyLiBhIHNpbmdsZSBzZWdtZW50IGNvbnNpc3RzIG9mIHR3byBmYWNlc1xuXHRcdC8vIDMuIHNvIHdlIG5lZWQgdG8gZ2VuZXJhdGUgc2l4ICgyKjMpIGluZGljZXMgcGVyIHNlZ21lbnRcblxuXHRcdGZvciAoIGl5ID0gMDsgaXkgPCBncmlkWTsgaXkgKysgKSB7XG5cblx0XHRcdGZvciAoIGl4ID0gMDsgaXggPCBncmlkWDsgaXggKysgKSB7XG5cblx0XHRcdFx0dmFyIGEgPSBudW1iZXJPZlZlcnRpY2VzICsgaXggKyBncmlkWDEgKiBpeTtcblx0XHRcdFx0dmFyIGIgPSBudW1iZXJPZlZlcnRpY2VzICsgaXggKyBncmlkWDEgKiAoIGl5ICsgMSApO1xuXHRcdFx0XHR2YXIgYyA9IG51bWJlck9mVmVydGljZXMgKyAoIGl4ICsgMSApICsgZ3JpZFgxICogKCBpeSArIDEgKTtcblx0XHRcdFx0dmFyIGQgPSBudW1iZXJPZlZlcnRpY2VzICsgKCBpeCArIDEgKSArIGdyaWRYMSAqIGl5O1xuXG5cdFx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0XHRcdC8vIGluY3JlYXNlIGNvdW50ZXJcblxuXHRcdFx0XHRncm91cENvdW50ICs9IDY7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGFkZCBhIGdyb3VwIHRvIHRoZSBnZW9tZXRyeS4gdGhpcyB3aWxsIGVuc3VyZSBtdWx0aSBtYXRlcmlhbCBzdXBwb3J0XG5cblx0XHRzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgbWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0Ly8gY2FsY3VsYXRlIG5ldyBzdGFydCB2YWx1ZSBmb3IgZ3JvdXBzXG5cblx0XHRncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7XG5cblx0XHQvLyB1cGRhdGUgdG90YWwgbnVtYmVyIG9mIHZlcnRpY2VzXG5cblx0XHRudW1iZXJPZlZlcnRpY2VzICs9IHZlcnRleENvdW50ZXI7XG5cblx0fVxuXG59XG5cbkJveEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuQm94QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQm94QnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gUGxhbmVHZW9tZXRyeVxuXG5mdW5jdGlvbiBQbGFuZUdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BsYW5lR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHR3aWR0aDogd2lkdGgsXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0d2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHNcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFBsYW5lQnVmZmVyR2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuUGxhbmVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblBsYW5lR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGxhbmVHZW9tZXRyeTtcblxuLy8gUGxhbmVCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBQbGFuZUJ1ZmZlckdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cyApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BsYW5lQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHR3aWR0aDogd2lkdGgsXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0d2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHNcblx0fTtcblxuXHR3aWR0aCA9IHdpZHRoIHx8IDE7XG5cdGhlaWdodCA9IGhlaWdodCB8fCAxO1xuXG5cdHZhciB3aWR0aF9oYWxmID0gd2lkdGggLyAyO1xuXHR2YXIgaGVpZ2h0X2hhbGYgPSBoZWlnaHQgLyAyO1xuXG5cdHZhciBncmlkWCA9IE1hdGguZmxvb3IoIHdpZHRoU2VnbWVudHMgKSB8fCAxO1xuXHR2YXIgZ3JpZFkgPSBNYXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyApIHx8IDE7XG5cblx0dmFyIGdyaWRYMSA9IGdyaWRYICsgMTtcblx0dmFyIGdyaWRZMSA9IGdyaWRZICsgMTtcblxuXHR2YXIgc2VnbWVudF93aWR0aCA9IHdpZHRoIC8gZ3JpZFg7XG5cdHZhciBzZWdtZW50X2hlaWdodCA9IGhlaWdodCAvIGdyaWRZO1xuXG5cdHZhciBpeCwgaXk7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdGZvciAoIGl5ID0gMDsgaXkgPCBncmlkWTE7IGl5ICsrICkge1xuXG5cdFx0dmFyIHkgPSBpeSAqIHNlZ21lbnRfaGVpZ2h0IC0gaGVpZ2h0X2hhbGY7XG5cblx0XHRmb3IgKCBpeCA9IDA7IGl4IDwgZ3JpZFgxOyBpeCArKyApIHtcblxuXHRcdFx0dmFyIHggPSBpeCAqIHNlZ21lbnRfd2lkdGggLSB3aWR0aF9oYWxmO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB4LCAtIHksIDAgKTtcblxuXHRcdFx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XG5cblx0XHRcdHV2cy5wdXNoKCBpeCAvIGdyaWRYICk7XG5cdFx0XHR1dnMucHVzaCggMSAtICggaXkgLyBncmlkWSApICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGluZGljZXNcblxuXHRmb3IgKCBpeSA9IDA7IGl5IDwgZ3JpZFk7IGl5ICsrICkge1xuXG5cdFx0Zm9yICggaXggPSAwOyBpeCA8IGdyaWRYOyBpeCArKyApIHtcblxuXHRcdFx0dmFyIGEgPSBpeCArIGdyaWRYMSAqIGl5O1xuXHRcdFx0dmFyIGIgPSBpeCArIGdyaWRYMSAqICggaXkgKyAxICk7XG5cdFx0XHR2YXIgYyA9ICggaXggKyAxICkgKyBncmlkWDEgKiAoIGl5ICsgMSApO1xuXHRcdFx0dmFyIGQgPSAoIGl4ICsgMSApICsgZ3JpZFgxICogaXk7XG5cblx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxufVxuXG5QbGFuZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuUGxhbmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQbGFuZUJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbnZhciBtYXRlcmlhbElkID0gMDtcblxuZnVuY3Rpb24gTWF0ZXJpYWwoKSB7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBtYXRlcmlhbElkICsrIH0gKTtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHR0aGlzLm5hbWUgPSAnJztcblx0dGhpcy50eXBlID0gJ01hdGVyaWFsJztcblxuXHR0aGlzLmZvZyA9IHRydWU7XG5cdHRoaXMubGlnaHRzID0gdHJ1ZTtcblxuXHR0aGlzLmJsZW5kaW5nID0gTm9ybWFsQmxlbmRpbmc7XG5cdHRoaXMuc2lkZSA9IEZyb250U2lkZTtcblx0dGhpcy5mbGF0U2hhZGluZyA9IGZhbHNlO1xuXHR0aGlzLnZlcnRleENvbG9ycyA9IE5vQ29sb3JzOyAvLyBUSFJFRS5Ob0NvbG9ycywgVEhSRUUuVmVydGV4Q29sb3JzLCBUSFJFRS5GYWNlQ29sb3JzXG5cblx0dGhpcy5vcGFjaXR5ID0gMTtcblx0dGhpcy50cmFuc3BhcmVudCA9IGZhbHNlO1xuXG5cdHRoaXMuYmxlbmRTcmMgPSBTcmNBbHBoYUZhY3Rvcjtcblx0dGhpcy5ibGVuZERzdCA9IE9uZU1pbnVzU3JjQWxwaGFGYWN0b3I7XG5cdHRoaXMuYmxlbmRFcXVhdGlvbiA9IEFkZEVxdWF0aW9uO1xuXHR0aGlzLmJsZW5kU3JjQWxwaGEgPSBudWxsO1xuXHR0aGlzLmJsZW5kRHN0QWxwaGEgPSBudWxsO1xuXHR0aGlzLmJsZW5kRXF1YXRpb25BbHBoYSA9IG51bGw7XG5cblx0dGhpcy5kZXB0aEZ1bmMgPSBMZXNzRXF1YWxEZXB0aDtcblx0dGhpcy5kZXB0aFRlc3QgPSB0cnVlO1xuXHR0aGlzLmRlcHRoV3JpdGUgPSB0cnVlO1xuXG5cdHRoaXMuY2xpcHBpbmdQbGFuZXMgPSBudWxsO1xuXHR0aGlzLmNsaXBJbnRlcnNlY3Rpb24gPSBmYWxzZTtcblx0dGhpcy5jbGlwU2hhZG93cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2hhZG93U2lkZSA9IG51bGw7XG5cblx0dGhpcy5jb2xvcldyaXRlID0gdHJ1ZTtcblxuXHR0aGlzLnByZWNpc2lvbiA9IG51bGw7IC8vIG92ZXJyaWRlIHRoZSByZW5kZXJlcidzIGRlZmF1bHQgcHJlY2lzaW9uIGZvciB0aGlzIG1hdGVyaWFsXG5cblx0dGhpcy5wb2x5Z29uT2Zmc2V0ID0gZmFsc2U7XG5cdHRoaXMucG9seWdvbk9mZnNldEZhY3RvciA9IDA7XG5cdHRoaXMucG9seWdvbk9mZnNldFVuaXRzID0gMDtcblxuXHR0aGlzLmRpdGhlcmluZyA9IGZhbHNlO1xuXG5cdHRoaXMuYWxwaGFUZXN0ID0gMDtcblx0dGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEgPSBmYWxzZTtcblxuXHR0aGlzLm92ZXJkcmF3ID0gMDsgLy8gT3ZlcmRyYXduIHBpeGVscyAodHlwaWNhbGx5IGJldHdlZW4gMCBhbmQgMSkgZm9yIGZpeGluZyBhbnRpYWxpYXNpbmcgZ2FwcyBpbiBDYW52YXNSZW5kZXJlclxuXG5cdHRoaXMudmlzaWJsZSA9IHRydWU7XG5cblx0dGhpcy51c2VyRGF0YSA9IHt9O1xuXG5cdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG59XG5cbk1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBNYXRlcmlhbCxcblxuXHRpc01hdGVyaWFsOiB0cnVlLFxuXG5cdG9uQmVmb3JlQ29tcGlsZTogZnVuY3Rpb24gKCkge30sXG5cblx0c2V0VmFsdWVzOiBmdW5jdGlvbiAoIHZhbHVlcyApIHtcblxuXHRcdGlmICggdmFsdWVzID09PSB1bmRlZmluZWQgKSByZXR1cm47XG5cblx0XHRmb3IgKCB2YXIga2V5IGluIHZhbHVlcyApIHtcblxuXHRcdFx0dmFyIG5ld1ZhbHVlID0gdmFsdWVzWyBrZXkgXTtcblxuXHRcdFx0aWYgKCBuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5NYXRlcmlhbDogJ1wiICsga2V5ICsgXCInIHBhcmFtZXRlciBpcyB1bmRlZmluZWQuXCIgKTtcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gZm9yIGJhY2t3YXJkIGNvbXBhdGFiaWxpdHkgaWYgc2hhZGluZyBpcyBzZXQgaW4gdGhlIGNvbnN0cnVjdG9yXG5cdFx0XHRpZiAoIGtleSA9PT0gJ3NoYWRpbmcnICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLicgKyB0aGlzLnR5cGUgKyAnOiAuc2hhZGluZyBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdGhlIGJvb2xlYW4gLmZsYXRTaGFkaW5nIGluc3RlYWQuJyApO1xuXHRcdFx0XHR0aGlzLmZsYXRTaGFkaW5nID0gKCBuZXdWYWx1ZSA9PT0gRmxhdFNoYWRpbmcgKSA/IHRydWUgOiBmYWxzZTtcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGN1cnJlbnRWYWx1ZSA9IHRoaXNbIGtleSBdO1xuXG5cdFx0XHRpZiAoIGN1cnJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5cIiArIHRoaXMudHlwZSArIFwiOiAnXCIgKyBrZXkgKyBcIicgaXMgbm90IGEgcHJvcGVydHkgb2YgdGhpcyBtYXRlcmlhbC5cIiApO1xuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGN1cnJlbnRWYWx1ZSAmJiBjdXJyZW50VmFsdWUuaXNDb2xvciApIHtcblxuXHRcdFx0XHRjdXJyZW50VmFsdWUuc2V0KCBuZXdWYWx1ZSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCAoIGN1cnJlbnRWYWx1ZSAmJiBjdXJyZW50VmFsdWUuaXNWZWN0b3IzICkgJiYgKCBuZXdWYWx1ZSAmJiBuZXdWYWx1ZS5pc1ZlY3RvcjMgKSApIHtcblxuXHRcdFx0XHRjdXJyZW50VmFsdWUuY29weSggbmV3VmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICgga2V5ID09PSAnb3ZlcmRyYXcnICkge1xuXG5cdFx0XHRcdC8vIGVuc3VyZSBvdmVyZHJhdyBpcyBiYWNrd2FyZHMtY29tcGF0aWJsZSB3aXRoIGxlZ2FjeSBib29sZWFuIHR5cGVcblx0XHRcdFx0dGhpc1sga2V5IF0gPSBOdW1iZXIoIG5ld1ZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpc1sga2V5IF0gPSBuZXdWYWx1ZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgaXNSb290ID0gKCBtZXRhID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIG1ldGEgPT09ICdzdHJpbmcnICk7XG5cblx0XHRpZiAoIGlzUm9vdCApIHtcblxuXHRcdFx0bWV0YSA9IHtcblx0XHRcdFx0dGV4dHVyZXM6IHt9LFxuXHRcdFx0XHRpbWFnZXM6IHt9XG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0dmFyIGRhdGEgPSB7XG5cdFx0XHRtZXRhZGF0YToge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdNYXRlcmlhbCcsXG5cdFx0XHRcdGdlbmVyYXRvcjogJ01hdGVyaWFsLnRvSlNPTidcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Ly8gc3RhbmRhcmQgTWF0ZXJpYWwgc2VyaWFsaXphdGlvblxuXHRcdGRhdGEudXVpZCA9IHRoaXMudXVpZDtcblx0XHRkYXRhLnR5cGUgPSB0aGlzLnR5cGU7XG5cblx0XHRpZiAoIHRoaXMubmFtZSAhPT0gJycgKSBkYXRhLm5hbWUgPSB0aGlzLm5hbWU7XG5cblx0XHRpZiAoIHRoaXMuY29sb3IgJiYgdGhpcy5jb2xvci5pc0NvbG9yICkgZGF0YS5jb2xvciA9IHRoaXMuY29sb3IuZ2V0SGV4KCk7XG5cblx0XHRpZiAoIHRoaXMucm91Z2huZXNzICE9PSB1bmRlZmluZWQgKSBkYXRhLnJvdWdobmVzcyA9IHRoaXMucm91Z2huZXNzO1xuXHRcdGlmICggdGhpcy5tZXRhbG5lc3MgIT09IHVuZGVmaW5lZCApIGRhdGEubWV0YWxuZXNzID0gdGhpcy5tZXRhbG5lc3M7XG5cblx0XHRpZiAoIHRoaXMuZW1pc3NpdmUgJiYgdGhpcy5lbWlzc2l2ZS5pc0NvbG9yICkgZGF0YS5lbWlzc2l2ZSA9IHRoaXMuZW1pc3NpdmUuZ2V0SGV4KCk7XG5cdFx0aWYgKCB0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ICE9PSAxICkgZGF0YS5lbWlzc2l2ZUludGVuc2l0eSA9IHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk7XG5cblx0XHRpZiAoIHRoaXMuc3BlY3VsYXIgJiYgdGhpcy5zcGVjdWxhci5pc0NvbG9yICkgZGF0YS5zcGVjdWxhciA9IHRoaXMuc3BlY3VsYXIuZ2V0SGV4KCk7XG5cdFx0aWYgKCB0aGlzLnNoaW5pbmVzcyAhPT0gdW5kZWZpbmVkICkgZGF0YS5zaGluaW5lc3MgPSB0aGlzLnNoaW5pbmVzcztcblx0XHRpZiAoIHRoaXMuY2xlYXJDb2F0ICE9PSB1bmRlZmluZWQgKSBkYXRhLmNsZWFyQ29hdCA9IHRoaXMuY2xlYXJDb2F0O1xuXHRcdGlmICggdGhpcy5jbGVhckNvYXRSb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIGRhdGEuY2xlYXJDb2F0Um91Z2huZXNzID0gdGhpcy5jbGVhckNvYXRSb3VnaG5lc3M7XG5cblx0XHRpZiAoIHRoaXMubWFwICYmIHRoaXMubWFwLmlzVGV4dHVyZSApIGRhdGEubWFwID0gdGhpcy5tYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRpZiAoIHRoaXMuYWxwaGFNYXAgJiYgdGhpcy5hbHBoYU1hcC5pc1RleHR1cmUgKSBkYXRhLmFscGhhTWFwID0gdGhpcy5hbHBoYU1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdGlmICggdGhpcy5saWdodE1hcCAmJiB0aGlzLmxpZ2h0TWFwLmlzVGV4dHVyZSApIGRhdGEubGlnaHRNYXAgPSB0aGlzLmxpZ2h0TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0aWYgKCB0aGlzLmJ1bXBNYXAgJiYgdGhpcy5idW1wTWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZGF0YS5idW1wTWFwID0gdGhpcy5idW1wTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0XHRkYXRhLmJ1bXBTY2FsZSA9IHRoaXMuYnVtcFNjYWxlO1xuXG5cdFx0fVxuXHRcdGlmICggdGhpcy5ub3JtYWxNYXAgJiYgdGhpcy5ub3JtYWxNYXAuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRkYXRhLm5vcm1hbE1hcCA9IHRoaXMubm9ybWFsTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0XHRkYXRhLm5vcm1hbFNjYWxlID0gdGhpcy5ub3JtYWxTY2FsZS50b0FycmF5KCk7XG5cblx0XHR9XG5cdFx0aWYgKCB0aGlzLmRpc3BsYWNlbWVudE1hcCAmJiB0aGlzLmRpc3BsYWNlbWVudE1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEuZGlzcGxhY2VtZW50TWFwID0gdGhpcy5kaXNwbGFjZW1lbnRNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRcdGRhdGEuZGlzcGxhY2VtZW50U2NhbGUgPSB0aGlzLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdFx0ZGF0YS5kaXNwbGFjZW1lbnRCaWFzID0gdGhpcy5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0fVxuXHRcdGlmICggdGhpcy5yb3VnaG5lc3NNYXAgJiYgdGhpcy5yb3VnaG5lc3NNYXAuaXNUZXh0dXJlICkgZGF0YS5yb3VnaG5lc3NNYXAgPSB0aGlzLnJvdWdobmVzc01hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdGlmICggdGhpcy5tZXRhbG5lc3NNYXAgJiYgdGhpcy5tZXRhbG5lc3NNYXAuaXNUZXh0dXJlICkgZGF0YS5tZXRhbG5lc3NNYXAgPSB0aGlzLm1ldGFsbmVzc01hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXG5cdFx0aWYgKCB0aGlzLmVtaXNzaXZlTWFwICYmIHRoaXMuZW1pc3NpdmVNYXAuaXNUZXh0dXJlICkgZGF0YS5lbWlzc2l2ZU1hcCA9IHRoaXMuZW1pc3NpdmVNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRpZiAoIHRoaXMuc3BlY3VsYXJNYXAgJiYgdGhpcy5zcGVjdWxhck1hcC5pc1RleHR1cmUgKSBkYXRhLnNwZWN1bGFyTWFwID0gdGhpcy5zcGVjdWxhck1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXG5cdFx0aWYgKCB0aGlzLmVudk1hcCAmJiB0aGlzLmVudk1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEuZW52TWFwID0gdGhpcy5lbnZNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRcdGRhdGEucmVmbGVjdGl2aXR5ID0gdGhpcy5yZWZsZWN0aXZpdHk7IC8vIFNjYWxlIGJlaGluZCBlbnZNYXBcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5ncmFkaWVudE1hcCAmJiB0aGlzLmdyYWRpZW50TWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZGF0YS5ncmFkaWVudE1hcCA9IHRoaXMuZ3JhZGllbnRNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5zaXplICE9PSB1bmRlZmluZWQgKSBkYXRhLnNpemUgPSB0aGlzLnNpemU7XG5cdFx0aWYgKCB0aGlzLnNpemVBdHRlbnVhdGlvbiAhPT0gdW5kZWZpbmVkICkgZGF0YS5zaXplQXR0ZW51YXRpb24gPSB0aGlzLnNpemVBdHRlbnVhdGlvbjtcblxuXHRcdGlmICggdGhpcy5ibGVuZGluZyAhPT0gTm9ybWFsQmxlbmRpbmcgKSBkYXRhLmJsZW5kaW5nID0gdGhpcy5ibGVuZGluZztcblx0XHRpZiAoIHRoaXMuZmxhdFNoYWRpbmcgPT09IHRydWUgKSBkYXRhLmZsYXRTaGFkaW5nID0gdGhpcy5mbGF0U2hhZGluZztcblx0XHRpZiAoIHRoaXMuc2lkZSAhPT0gRnJvbnRTaWRlICkgZGF0YS5zaWRlID0gdGhpcy5zaWRlO1xuXHRcdGlmICggdGhpcy52ZXJ0ZXhDb2xvcnMgIT09IE5vQ29sb3JzICkgZGF0YS52ZXJ0ZXhDb2xvcnMgPSB0aGlzLnZlcnRleENvbG9ycztcblxuXHRcdGlmICggdGhpcy5vcGFjaXR5IDwgMSApIGRhdGEub3BhY2l0eSA9IHRoaXMub3BhY2l0eTtcblx0XHRpZiAoIHRoaXMudHJhbnNwYXJlbnQgPT09IHRydWUgKSBkYXRhLnRyYW5zcGFyZW50ID0gdGhpcy50cmFuc3BhcmVudDtcblxuXHRcdGRhdGEuZGVwdGhGdW5jID0gdGhpcy5kZXB0aEZ1bmM7XG5cdFx0ZGF0YS5kZXB0aFRlc3QgPSB0aGlzLmRlcHRoVGVzdDtcblx0XHRkYXRhLmRlcHRoV3JpdGUgPSB0aGlzLmRlcHRoV3JpdGU7XG5cblx0XHQvLyByb3RhdGlvbiAoU3ByaXRlTWF0ZXJpYWwpXG5cdFx0aWYgKCB0aGlzLnJvdGF0aW9uICE9PSAwICkgZGF0YS5yb3RhdGlvbiA9IHRoaXMucm90YXRpb247XG5cblx0XHRpZiAoIHRoaXMubGluZXdpZHRoICE9PSAxICkgZGF0YS5saW5ld2lkdGggPSB0aGlzLmxpbmV3aWR0aDtcblx0XHRpZiAoIHRoaXMuZGFzaFNpemUgIT09IHVuZGVmaW5lZCApIGRhdGEuZGFzaFNpemUgPSB0aGlzLmRhc2hTaXplO1xuXHRcdGlmICggdGhpcy5nYXBTaXplICE9PSB1bmRlZmluZWQgKSBkYXRhLmdhcFNpemUgPSB0aGlzLmdhcFNpemU7XG5cdFx0aWYgKCB0aGlzLnNjYWxlICE9PSB1bmRlZmluZWQgKSBkYXRhLnNjYWxlID0gdGhpcy5zY2FsZTtcblxuXHRcdGlmICggdGhpcy5kaXRoZXJpbmcgPT09IHRydWUgKSBkYXRhLmRpdGhlcmluZyA9IHRydWU7XG5cblx0XHRpZiAoIHRoaXMuYWxwaGFUZXN0ID4gMCApIGRhdGEuYWxwaGFUZXN0ID0gdGhpcy5hbHBoYVRlc3Q7XG5cdFx0aWYgKCB0aGlzLnByZW11bHRpcGxpZWRBbHBoYSA9PT0gdHJ1ZSApIGRhdGEucHJlbXVsdGlwbGllZEFscGhhID0gdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE7XG5cblx0XHRpZiAoIHRoaXMud2lyZWZyYW1lID09PSB0cnVlICkgZGF0YS53aXJlZnJhbWUgPSB0aGlzLndpcmVmcmFtZTtcblx0XHRpZiAoIHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID4gMSApIGRhdGEud2lyZWZyYW1lTGluZXdpZHRoID0gdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg7XG5cdFx0aWYgKCB0aGlzLndpcmVmcmFtZUxpbmVjYXAgIT09ICdyb3VuZCcgKSBkYXRhLndpcmVmcmFtZUxpbmVjYXAgPSB0aGlzLndpcmVmcmFtZUxpbmVjYXA7XG5cdFx0aWYgKCB0aGlzLndpcmVmcmFtZUxpbmVqb2luICE9PSAncm91bmQnICkgZGF0YS53aXJlZnJhbWVMaW5lam9pbiA9IHRoaXMud2lyZWZyYW1lTGluZWpvaW47XG5cblx0XHRpZiAoIHRoaXMubW9ycGhUYXJnZXRzID09PSB0cnVlICkgZGF0YS5tb3JwaFRhcmdldHMgPSB0cnVlO1xuXHRcdGlmICggdGhpcy5za2lubmluZyA9PT0gdHJ1ZSApIGRhdGEuc2tpbm5pbmcgPSB0cnVlO1xuXG5cdFx0aWYgKCB0aGlzLnZpc2libGUgPT09IGZhbHNlICkgZGF0YS52aXNpYmxlID0gZmFsc2U7XG5cdFx0aWYgKCBKU09OLnN0cmluZ2lmeSggdGhpcy51c2VyRGF0YSApICE9PSAne30nICkgZGF0YS51c2VyRGF0YSA9IHRoaXMudXNlckRhdGE7XG5cblx0XHQvLyBUT0RPOiBDb3BpZWQgZnJvbSBPYmplY3QzRC50b0pTT05cblxuXHRcdGZ1bmN0aW9uIGV4dHJhY3RGcm9tQ2FjaGUoIGNhY2hlICkge1xuXG5cdFx0XHR2YXIgdmFsdWVzID0gW107XG5cblx0XHRcdGZvciAoIHZhciBrZXkgaW4gY2FjaGUgKSB7XG5cblx0XHRcdFx0dmFyIGRhdGEgPSBjYWNoZVsga2V5IF07XG5cdFx0XHRcdGRlbGV0ZSBkYXRhLm1ldGFkYXRhO1xuXHRcdFx0XHR2YWx1ZXMucHVzaCggZGF0YSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB2YWx1ZXM7XG5cblx0XHR9XG5cblx0XHRpZiAoIGlzUm9vdCApIHtcblxuXHRcdFx0dmFyIHRleHR1cmVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS50ZXh0dXJlcyApO1xuXHRcdFx0dmFyIGltYWdlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuaW1hZ2VzICk7XG5cblx0XHRcdGlmICggdGV4dHVyZXMubGVuZ3RoID4gMCApIGRhdGEudGV4dHVyZXMgPSB0ZXh0dXJlcztcblx0XHRcdGlmICggaW1hZ2VzLmxlbmd0aCA+IDAgKSBkYXRhLmltYWdlcyA9IGltYWdlcztcblxuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XG5cblx0XHR0aGlzLmZvZyA9IHNvdXJjZS5mb2c7XG5cdFx0dGhpcy5saWdodHMgPSBzb3VyY2UubGlnaHRzO1xuXG5cdFx0dGhpcy5ibGVuZGluZyA9IHNvdXJjZS5ibGVuZGluZztcblx0XHR0aGlzLnNpZGUgPSBzb3VyY2Uuc2lkZTtcblx0XHR0aGlzLmZsYXRTaGFkaW5nID0gc291cmNlLmZsYXRTaGFkaW5nO1xuXHRcdHRoaXMudmVydGV4Q29sb3JzID0gc291cmNlLnZlcnRleENvbG9ycztcblxuXHRcdHRoaXMub3BhY2l0eSA9IHNvdXJjZS5vcGFjaXR5O1xuXHRcdHRoaXMudHJhbnNwYXJlbnQgPSBzb3VyY2UudHJhbnNwYXJlbnQ7XG5cblx0XHR0aGlzLmJsZW5kU3JjID0gc291cmNlLmJsZW5kU3JjO1xuXHRcdHRoaXMuYmxlbmREc3QgPSBzb3VyY2UuYmxlbmREc3Q7XG5cdFx0dGhpcy5ibGVuZEVxdWF0aW9uID0gc291cmNlLmJsZW5kRXF1YXRpb247XG5cdFx0dGhpcy5ibGVuZFNyY0FscGhhID0gc291cmNlLmJsZW5kU3JjQWxwaGE7XG5cdFx0dGhpcy5ibGVuZERzdEFscGhhID0gc291cmNlLmJsZW5kRHN0QWxwaGE7XG5cdFx0dGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEgPSBzb3VyY2UuYmxlbmRFcXVhdGlvbkFscGhhO1xuXG5cdFx0dGhpcy5kZXB0aEZ1bmMgPSBzb3VyY2UuZGVwdGhGdW5jO1xuXHRcdHRoaXMuZGVwdGhUZXN0ID0gc291cmNlLmRlcHRoVGVzdDtcblx0XHR0aGlzLmRlcHRoV3JpdGUgPSBzb3VyY2UuZGVwdGhXcml0ZTtcblxuXHRcdHRoaXMuY29sb3JXcml0ZSA9IHNvdXJjZS5jb2xvcldyaXRlO1xuXG5cdFx0dGhpcy5wcmVjaXNpb24gPSBzb3VyY2UucHJlY2lzaW9uO1xuXG5cdFx0dGhpcy5wb2x5Z29uT2Zmc2V0ID0gc291cmNlLnBvbHlnb25PZmZzZXQ7XG5cdFx0dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yID0gc291cmNlLnBvbHlnb25PZmZzZXRGYWN0b3I7XG5cdFx0dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMgPSBzb3VyY2UucG9seWdvbk9mZnNldFVuaXRzO1xuXG5cdFx0dGhpcy5kaXRoZXJpbmcgPSBzb3VyY2UuZGl0aGVyaW5nO1xuXG5cdFx0dGhpcy5hbHBoYVRlc3QgPSBzb3VyY2UuYWxwaGFUZXN0O1xuXHRcdHRoaXMucHJlbXVsdGlwbGllZEFscGhhID0gc291cmNlLnByZW11bHRpcGxpZWRBbHBoYTtcblxuXHRcdHRoaXMub3ZlcmRyYXcgPSBzb3VyY2Uub3ZlcmRyYXc7XG5cblx0XHR0aGlzLnZpc2libGUgPSBzb3VyY2UudmlzaWJsZTtcblx0XHR0aGlzLnVzZXJEYXRhID0gSlNPTi5wYXJzZSggSlNPTi5zdHJpbmdpZnkoIHNvdXJjZS51c2VyRGF0YSApICk7XG5cblx0XHR0aGlzLmNsaXBTaGFkb3dzID0gc291cmNlLmNsaXBTaGFkb3dzO1xuXHRcdHRoaXMuY2xpcEludGVyc2VjdGlvbiA9IHNvdXJjZS5jbGlwSW50ZXJzZWN0aW9uO1xuXG5cdFx0dmFyIHNyY1BsYW5lcyA9IHNvdXJjZS5jbGlwcGluZ1BsYW5lcyxcblx0XHRcdGRzdFBsYW5lcyA9IG51bGw7XG5cblx0XHRpZiAoIHNyY1BsYW5lcyAhPT0gbnVsbCApIHtcblxuXHRcdFx0dmFyIG4gPSBzcmNQbGFuZXMubGVuZ3RoO1xuXHRcdFx0ZHN0UGxhbmVzID0gbmV3IEFycmF5KCBuICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbjsgKysgaSApXG5cdFx0XHRcdGRzdFBsYW5lc1sgaSBdID0gc3JjUGxhbmVzWyBpIF0uY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY2xpcHBpbmdQbGFuZXMgPSBkc3RQbGFuZXM7XG5cblx0XHR0aGlzLnNoYWRvd1NpZGUgPSBzb3VyY2Uuc2hhZG93U2lkZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIHNwZWN1bGFyTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgZW52TWFwOiBuZXcgVEhSRUUuQ3ViZVRleHR1cmUoIFtwb3N4LCBuZWd4LCBwb3N5LCBuZWd5LCBwb3N6LCBuZWd6XSApLFxuICogIGNvbWJpbmU6IFRIUkVFLk11bHRpcGx5LFxuICogIHJlZmxlY3Rpdml0eTogPGZsb2F0PixcbiAqICByZWZyYWN0aW9uUmF0aW86IDxmbG9hdD4sXG4gKlxuICogIGRlcHRoVGVzdDogPGJvb2w+LFxuICogIGRlcHRoV3JpdGU6IDxib29sPixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaEJhc2ljTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoQmFzaWNNYXRlcmlhbCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZW1pc3NpdmVcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5saWdodE1hcCA9IG51bGw7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5hb01hcCA9IG51bGw7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5lbnZNYXAgPSBudWxsO1xuXHR0aGlzLmNvbWJpbmUgPSBNdWx0aXBseU9wZXJhdGlvbjtcblx0dGhpcy5yZWZsZWN0aXZpdHkgPSAxO1xuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJztcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cblx0dGhpcy5saWdodHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbk1lc2hCYXNpY01hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaEJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaEJhc2ljTWF0ZXJpYWw7XG5cbk1lc2hCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hCYXNpY01hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaEJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXG5cdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHR0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDtcblxuXHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDtcblx0dGhpcy5jb21iaW5lID0gc291cmNlLmNvbWJpbmU7XG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTtcblx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSBzb3VyY2UucmVmcmFjdGlvblJhdGlvO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDtcblx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjtcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGRlZmluZXM6IHsgXCJsYWJlbFwiIDogXCJ2YWx1ZVwiIH0sXG4gKiAgdW5pZm9ybXM6IHsgXCJwYXJhbWV0ZXIxXCI6IHsgdmFsdWU6IDEuMCB9LCBcInBhcmFtZXRlcjJcIjogeyB2YWx1ZTI6IDIgfSB9LFxuICpcbiAqICBmcmFnbWVudFNoYWRlcjogPHN0cmluZz4sXG4gKiAgdmVydGV4U2hhZGVyOiA8c3RyaW5nPixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBsaWdodHM6IDxib29sPixcbiAqXG4gKiAgc2tpbm5pbmc6IDxib29sPixcbiAqICBtb3JwaFRhcmdldHM6IDxib29sPixcbiAqICBtb3JwaE5vcm1hbHM6IDxib29sPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIFNoYWRlck1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU2hhZGVyTWF0ZXJpYWwnO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHt9O1xuXHR0aGlzLnVuaWZvcm1zID0ge307XG5cblx0dGhpcy52ZXJ0ZXhTaGFkZXIgPSAndm9pZCBtYWluKCkge1xcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcXG59Jztcblx0dGhpcy5mcmFnbWVudFNoYWRlciA9ICd2b2lkIG1haW4oKSB7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggMS4wLCAwLjAsIDAuMCwgMS4wICk7XFxufSc7XG5cblx0dGhpcy5saW5ld2lkdGggPSAxO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcblxuXHR0aGlzLmZvZyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIHNjZW5lIGZvZ1xuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIHNjZW5lIGxpZ2h0c1xuXHR0aGlzLmNsaXBwaW5nID0gZmFsc2U7IC8vIHNldCB0byB1c2UgdXNlci1kZWZpbmVkIGNsaXBwaW5nIHBsYW5lc1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBza2lubmluZyBhdHRyaWJ1dGUgc3RyZWFtc1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIG1vcnBoIHRhcmdldHNcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBtb3JwaCBub3JtYWxzXG5cblx0dGhpcy5leHRlbnNpb25zID0ge1xuXHRcdGRlcml2YXRpdmVzOiBmYWxzZSwgLy8gc2V0IHRvIHVzZSBkZXJpdmF0aXZlc1xuXHRcdGZyYWdEZXB0aDogZmFsc2UsIC8vIHNldCB0byB1c2UgZnJhZ21lbnQgZGVwdGggdmFsdWVzXG5cdFx0ZHJhd0J1ZmZlcnM6IGZhbHNlLCAvLyBzZXQgdG8gdXNlIGRyYXcgYnVmZmVyc1xuXHRcdHNoYWRlclRleHR1cmVMT0Q6IGZhbHNlIC8vIHNldCB0byB1c2Ugc2hhZGVyIHRleHR1cmUgTE9EXG5cdH07XG5cblx0Ly8gV2hlbiByZW5kZXJlZCBnZW9tZXRyeSBkb2Vzbid0IGluY2x1ZGUgdGhlc2UgYXR0cmlidXRlcyBidXQgdGhlIG1hdGVyaWFsIGRvZXMsXG5cdC8vIHVzZSB0aGVzZSBkZWZhdWx0IHZhbHVlcyBpbiBXZWJHTC4gVGhpcyBhdm9pZHMgZXJyb3JzIHdoZW4gYnVmZmVyIGRhdGEgaXMgbWlzc2luZy5cblx0dGhpcy5kZWZhdWx0QXR0cmlidXRlVmFsdWVzID0ge1xuXHRcdCdjb2xvcic6IFsgMSwgMSwgMSBdLFxuXHRcdCd1dic6IFsgMCwgMCBdLFxuXHRcdCd1djInOiBbIDAsIDAgXVxuXHR9O1xuXG5cdHRoaXMuaW5kZXgwQXR0cmlidXRlTmFtZSA9IHVuZGVmaW5lZDtcblx0dGhpcy51bmlmb3Jtc05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRpZiAoIHBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGlmICggcGFyYW1ldGVycy5hdHRyaWJ1dGVzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5TaGFkZXJNYXRlcmlhbDogYXR0cmlidXRlcyBzaG91bGQgbm93IGJlIGRlZmluZWQgaW4gVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG5cdH1cblxufVxuXG5TaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcblNoYWRlck1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNoYWRlck1hdGVyaWFsO1xuXG5TaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUuaXNTaGFkZXJNYXRlcmlhbCA9IHRydWU7XG5cblNoYWRlck1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5mcmFnbWVudFNoYWRlciA9IHNvdXJjZS5mcmFnbWVudFNoYWRlcjtcblx0dGhpcy52ZXJ0ZXhTaGFkZXIgPSBzb3VyY2UudmVydGV4U2hhZGVyO1xuXG5cdHRoaXMudW5pZm9ybXMgPSBVbmlmb3Jtc1V0aWxzLmNsb25lKCBzb3VyY2UudW5pZm9ybXMgKTtcblxuXHR0aGlzLmRlZmluZXMgPSBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLmRlZmluZXMgKTtcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblxuXHR0aGlzLmxpZ2h0cyA9IHNvdXJjZS5saWdodHM7XG5cdHRoaXMuY2xpcHBpbmcgPSBzb3VyY2UuY2xpcHBpbmc7XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblxuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFscztcblxuXHR0aGlzLmV4dGVuc2lvbnMgPSBzb3VyY2UuZXh0ZW5zaW9ucztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHR2YXIgZGF0YSA9IE1hdGVyaWFsLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdGRhdGEudW5pZm9ybXMgPSB0aGlzLnVuaWZvcm1zO1xuXHRkYXRhLnZlcnRleFNoYWRlciA9IHRoaXMudmVydGV4U2hhZGVyO1xuXHRkYXRhLmZyYWdtZW50U2hhZGVyID0gdGhpcy5mcmFnbWVudFNoYWRlcjtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxuZnVuY3Rpb24gUmF5KCBvcmlnaW4sIGRpcmVjdGlvbiApIHtcblxuXHR0aGlzLm9yaWdpbiA9ICggb3JpZ2luICE9PSB1bmRlZmluZWQgKSA/IG9yaWdpbiA6IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMuZGlyZWN0aW9uID0gKCBkaXJlY3Rpb24gIT09IHVuZGVmaW5lZCApID8gZGlyZWN0aW9uIDogbmV3IFZlY3RvcjMoKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBSYXkucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIG9yaWdpbiwgZGlyZWN0aW9uICkge1xuXG5cdFx0dGhpcy5vcmlnaW4uY29weSggb3JpZ2luICk7XG5cdFx0dGhpcy5kaXJlY3Rpb24uY29weSggZGlyZWN0aW9uICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHJheSApIHtcblxuXHRcdHRoaXMub3JpZ2luLmNvcHkoIHJheS5vcmlnaW4gKTtcblx0XHR0aGlzLmRpcmVjdGlvbi5jb3B5KCByYXkuZGlyZWN0aW9uICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGF0OiBmdW5jdGlvbiAoIHQsIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJheTogLmF0KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMuZGlyZWN0aW9uICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMub3JpZ2luICk7XG5cblx0fSxcblxuXHRsb29rQXQ6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMuZGlyZWN0aW9uLmNvcHkoIHYgKS5zdWIoIHRoaXMub3JpZ2luICkubm9ybWFsaXplKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJlY2FzdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByZWNhc3QoIHQgKSB7XG5cblx0XHRcdHRoaXMub3JpZ2luLmNvcHkoIHRoaXMuYXQoIHQsIHYxICkgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbG9zZXN0UG9pbnRUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXk6IC5jbG9zZXN0UG9pbnRUb1BvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHR0YXJnZXQuc3ViVmVjdG9ycyggcG9pbnQsIHRoaXMub3JpZ2luICk7XG5cblx0XHR2YXIgZGlyZWN0aW9uRGlzdGFuY2UgPSB0YXJnZXQuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xuXG5cdFx0aWYgKCBkaXJlY3Rpb25EaXN0YW5jZSA8IDAgKSB7XG5cblx0XHRcdHJldHVybiB0YXJnZXQuY29weSggdGhpcy5vcmlnaW4gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuY29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggZGlyZWN0aW9uRGlzdGFuY2UgKS5hZGQoIHRoaXMub3JpZ2luICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLmRpc3RhbmNlU3FUb1BvaW50KCBwb2ludCApICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVNxVG9Qb2ludDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBkaXN0YW5jZVNxVG9Qb2ludCggcG9pbnQgKSB7XG5cblx0XHRcdHZhciBkaXJlY3Rpb25EaXN0YW5jZSA9IHYxLnN1YlZlY3RvcnMoIHBvaW50LCB0aGlzLm9yaWdpbiApLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcblxuXHRcdFx0Ly8gcG9pbnQgYmVoaW5kIHRoZSByYXlcblxuXHRcdFx0aWYgKCBkaXJlY3Rpb25EaXN0YW5jZSA8IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXMub3JpZ2luLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHYxLmNvcHkoIHRoaXMuZGlyZWN0aW9uICkubXVsdGlwbHlTY2FsYXIoIGRpcmVjdGlvbkRpc3RhbmNlICkuYWRkKCB0aGlzLm9yaWdpbiApO1xuXG5cdFx0XHRyZXR1cm4gdjEuZGlzdGFuY2VUb1NxdWFyZWQoIHBvaW50ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRkaXN0YW5jZVNxVG9TZWdtZW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgc2VnQ2VudGVyID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgc2VnRGlyID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgZGlmZiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZGlzdGFuY2VTcVRvU2VnbWVudCggdjAsIHYxLCBvcHRpb25hbFBvaW50T25SYXksIG9wdGlvbmFsUG9pbnRPblNlZ21lbnQgKSB7XG5cblx0XHRcdC8vIGZyb20gaHR0cDovL3d3dy5nZW9tZXRyaWN0b29scy5jb20vR1RFbmdpbmUvSW5jbHVkZS9NYXRoZW1hdGljcy9HdGVEaXN0UmF5U2VnbWVudC5oXG5cdFx0XHQvLyBJdCByZXR1cm5zIHRoZSBtaW4gZGlzdGFuY2UgYmV0d2VlbiB0aGUgcmF5IGFuZCB0aGUgc2VnbWVudFxuXHRcdFx0Ly8gZGVmaW5lZCBieSB2MCBhbmQgdjFcblx0XHRcdC8vIEl0IGNhbiBhbHNvIHNldCB0d28gb3B0aW9uYWwgdGFyZ2V0cyA6XG5cdFx0XHQvLyAtIFRoZSBjbG9zZXN0IHBvaW50IG9uIHRoZSByYXlcblx0XHRcdC8vIC0gVGhlIGNsb3Nlc3QgcG9pbnQgb24gdGhlIHNlZ21lbnRcblxuXHRcdFx0c2VnQ2VudGVyLmNvcHkoIHYwICkuYWRkKCB2MSApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblx0XHRcdHNlZ0Rpci5jb3B5KCB2MSApLnN1YiggdjAgKS5ub3JtYWxpemUoKTtcblx0XHRcdGRpZmYuY29weSggdGhpcy5vcmlnaW4gKS5zdWIoIHNlZ0NlbnRlciApO1xuXG5cdFx0XHR2YXIgc2VnRXh0ZW50ID0gdjAuZGlzdGFuY2VUbyggdjEgKSAqIDAuNTtcblx0XHRcdHZhciBhMDEgPSAtIHRoaXMuZGlyZWN0aW9uLmRvdCggc2VnRGlyICk7XG5cdFx0XHR2YXIgYjAgPSBkaWZmLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcblx0XHRcdHZhciBiMSA9IC0gZGlmZi5kb3QoIHNlZ0RpciApO1xuXHRcdFx0dmFyIGMgPSBkaWZmLmxlbmd0aFNxKCk7XG5cdFx0XHR2YXIgZGV0ID0gTWF0aC5hYnMoIDEgLSBhMDEgKiBhMDEgKTtcblx0XHRcdHZhciBzMCwgczEsIHNxckRpc3QsIGV4dERldDtcblxuXHRcdFx0aWYgKCBkZXQgPiAwICkge1xuXG5cdFx0XHRcdC8vIFRoZSByYXkgYW5kIHNlZ21lbnQgYXJlIG5vdCBwYXJhbGxlbC5cblxuXHRcdFx0XHRzMCA9IGEwMSAqIGIxIC0gYjA7XG5cdFx0XHRcdHMxID0gYTAxICogYjAgLSBiMTtcblx0XHRcdFx0ZXh0RGV0ID0gc2VnRXh0ZW50ICogZGV0O1xuXG5cdFx0XHRcdGlmICggczAgPj0gMCApIHtcblxuXHRcdFx0XHRcdGlmICggczEgPj0gLSBleHREZXQgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggczEgPD0gZXh0RGV0ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIHJlZ2lvbiAwXG5cdFx0XHRcdFx0XHRcdC8vIE1pbmltdW0gYXQgaW50ZXJpb3IgcG9pbnRzIG9mIHJheSBhbmQgc2VnbWVudC5cblxuXHRcdFx0XHRcdFx0XHR2YXIgaW52RGV0ID0gMSAvIGRldDtcblx0XHRcdFx0XHRcdFx0czAgKj0gaW52RGV0O1xuXHRcdFx0XHRcdFx0XHRzMSAqPSBpbnZEZXQ7XG5cdFx0XHRcdFx0XHRcdHNxckRpc3QgPSBzMCAqICggczAgKyBhMDEgKiBzMSArIDIgKiBiMCApICsgczEgKiAoIGEwMSAqIHMwICsgczEgKyAyICogYjEgKSArIGM7XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gcmVnaW9uIDFcblxuXHRcdFx0XHRcdFx0XHRzMSA9IHNlZ0V4dGVudDtcblx0XHRcdFx0XHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHMxICsgYjAgKSApO1xuXHRcdFx0XHRcdFx0XHRzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHQvLyByZWdpb24gNVxuXG5cdFx0XHRcdFx0XHRzMSA9IC0gc2VnRXh0ZW50O1xuXHRcdFx0XHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHMxICsgYjAgKSApO1xuXHRcdFx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0aWYgKCBzMSA8PSAtIGV4dERldCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmVnaW9uIDRcblxuXHRcdFx0XHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIC0gYTAxICogc2VnRXh0ZW50ICsgYjAgKSApO1xuXHRcdFx0XHRcdFx0czEgPSAoIHMwID4gMCApID8gLSBzZWdFeHRlbnQgOiBNYXRoLm1pbiggTWF0aC5tYXgoIC0gc2VnRXh0ZW50LCAtIGIxICksIHNlZ0V4dGVudCApO1xuXHRcdFx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIHMxIDw9IGV4dERldCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmVnaW9uIDNcblxuXHRcdFx0XHRcdFx0czAgPSAwO1xuXHRcdFx0XHRcdFx0czEgPSBNYXRoLm1pbiggTWF0aC5tYXgoIC0gc2VnRXh0ZW50LCAtIGIxICksIHNlZ0V4dGVudCApO1xuXHRcdFx0XHRcdFx0c3FyRGlzdCA9IHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdC8vIHJlZ2lvbiAyXG5cblx0XHRcdFx0XHRcdHMwID0gTWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzZWdFeHRlbnQgKyBiMCApICk7XG5cdFx0XHRcdFx0XHRzMSA9ICggczAgPiAwICkgPyBzZWdFeHRlbnQgOiBNYXRoLm1pbiggTWF0aC5tYXgoIC0gc2VnRXh0ZW50LCAtIGIxICksIHNlZ0V4dGVudCApO1xuXHRcdFx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gUmF5IGFuZCBzZWdtZW50IGFyZSBwYXJhbGxlbC5cblxuXHRcdFx0XHRzMSA9ICggYTAxID4gMCApID8gLSBzZWdFeHRlbnQgOiBzZWdFeHRlbnQ7XG5cdFx0XHRcdHMwID0gTWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzMSArIGIwICkgKTtcblx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG9wdGlvbmFsUG9pbnRPblJheSApIHtcblxuXHRcdFx0XHRvcHRpb25hbFBvaW50T25SYXkuY29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggczAgKS5hZGQoIHRoaXMub3JpZ2luICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBvcHRpb25hbFBvaW50T25TZWdtZW50ICkge1xuXG5cdFx0XHRcdG9wdGlvbmFsUG9pbnRPblNlZ21lbnQuY29weSggc2VnRGlyICkubXVsdGlwbHlTY2FsYXIoIHMxICkuYWRkKCBzZWdDZW50ZXIgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gc3FyRGlzdDtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludGVyc2VjdFNwaGVyZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RTcGhlcmUoIHNwaGVyZSwgdGFyZ2V0ICkge1xuXG5cdFx0XHR2MS5zdWJWZWN0b3JzKCBzcGhlcmUuY2VudGVyLCB0aGlzLm9yaWdpbiApO1xuXHRcdFx0dmFyIHRjYSA9IHYxLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcblx0XHRcdHZhciBkMiA9IHYxLmRvdCggdjEgKSAtIHRjYSAqIHRjYTtcblx0XHRcdHZhciByYWRpdXMyID0gc3BoZXJlLnJhZGl1cyAqIHNwaGVyZS5yYWRpdXM7XG5cblx0XHRcdGlmICggZDIgPiByYWRpdXMyICkgcmV0dXJuIG51bGw7XG5cblx0XHRcdHZhciB0aGMgPSBNYXRoLnNxcnQoIHJhZGl1czIgLSBkMiApO1xuXG5cdFx0XHQvLyB0MCA9IGZpcnN0IGludGVyc2VjdCBwb2ludCAtIGVudHJhbmNlIG9uIGZyb250IG9mIHNwaGVyZVxuXHRcdFx0dmFyIHQwID0gdGNhIC0gdGhjO1xuXG5cdFx0XHQvLyB0MSA9IHNlY29uZCBpbnRlcnNlY3QgcG9pbnQgLSBleGl0IHBvaW50IG9uIGJhY2sgb2Ygc3BoZXJlXG5cdFx0XHR2YXIgdDEgPSB0Y2EgKyB0aGM7XG5cblx0XHRcdC8vIHRlc3QgdG8gc2VlIGlmIGJvdGggdDAgYW5kIHQxIGFyZSBiZWhpbmQgdGhlIHJheSAtIGlmIHNvLCByZXR1cm4gbnVsbFxuXHRcdFx0aWYgKCB0MCA8IDAgJiYgdDEgPCAwICkgcmV0dXJuIG51bGw7XG5cblx0XHRcdC8vIHRlc3QgdG8gc2VlIGlmIHQwIGlzIGJlaGluZCB0aGUgcmF5OlxuXHRcdFx0Ly8gaWYgaXQgaXMsIHRoZSByYXkgaXMgaW5zaWRlIHRoZSBzcGhlcmUsIHNvIHJldHVybiB0aGUgc2Vjb25kIGV4aXQgcG9pbnQgc2NhbGVkIGJ5IHQxLFxuXHRcdFx0Ly8gaW4gb3JkZXIgdG8gYWx3YXlzIHJldHVybiBhbiBpbnRlcnNlY3QgcG9pbnQgdGhhdCBpcyBpbiBmcm9udCBvZiB0aGUgcmF5LlxuXHRcdFx0aWYgKCB0MCA8IDAgKSByZXR1cm4gdGhpcy5hdCggdDEsIHRhcmdldCApO1xuXG5cdFx0XHQvLyBlbHNlIHQwIGlzIGluIGZyb250IG9mIHRoZSByYXksIHNvIHJldHVybiB0aGUgZmlyc3QgY29sbGlzaW9uIHBvaW50IHNjYWxlZCBieSB0MFxuXHRcdFx0cmV0dXJuIHRoaXMuYXQoIHQwLCB0YXJnZXQgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KCBzcGhlcmUuY2VudGVyICkgPD0gc3BoZXJlLnJhZGl1cztcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9QbGFuZTogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdHZhciBkZW5vbWluYXRvciA9IHBsYW5lLm5vcm1hbC5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XG5cblx0XHRpZiAoIGRlbm9taW5hdG9yID09PSAwICkge1xuXG5cdFx0XHQvLyBsaW5lIGlzIGNvcGxhbmFyLCByZXR1cm4gb3JpZ2luXG5cdFx0XHRpZiAoIHBsYW5lLmRpc3RhbmNlVG9Qb2ludCggdGhpcy5vcmlnaW4gKSA9PT0gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gMDtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBOdWxsIGlzIHByZWZlcmFibGUgdG8gdW5kZWZpbmVkIHNpbmNlIHVuZGVmaW5lZCBtZWFucy4uLi4gaXQgaXMgdW5kZWZpbmVkXG5cblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHQgPSAtICggdGhpcy5vcmlnaW4uZG90KCBwbGFuZS5ub3JtYWwgKSArIHBsYW5lLmNvbnN0YW50ICkgLyBkZW5vbWluYXRvcjtcblxuXHRcdC8vIFJldHVybiBpZiB0aGUgcmF5IG5ldmVyIGludGVyc2VjdHMgdGhlIHBsYW5lXG5cblx0XHRyZXR1cm4gdCA+PSAwID8gdCA6IG51bGw7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RQbGFuZTogZnVuY3Rpb24gKCBwbGFuZSwgdGFyZ2V0ICkge1xuXG5cdFx0dmFyIHQgPSB0aGlzLmRpc3RhbmNlVG9QbGFuZSggcGxhbmUgKTtcblxuXHRcdGlmICggdCA9PT0gbnVsbCApIHtcblxuXHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5hdCggdCwgdGFyZ2V0ICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzUGxhbmU6IGZ1bmN0aW9uICggcGxhbmUgKSB7XG5cblx0XHQvLyBjaGVjayBpZiB0aGUgcmF5IGxpZXMgb24gdGhlIHBsYW5lIGZpcnN0XG5cblx0XHR2YXIgZGlzdFRvUG9pbnQgPSBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIHRoaXMub3JpZ2luICk7XG5cblx0XHRpZiAoIGRpc3RUb1BvaW50ID09PSAwICkge1xuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdHZhciBkZW5vbWluYXRvciA9IHBsYW5lLm5vcm1hbC5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XG5cblx0XHRpZiAoIGRlbm9taW5hdG9yICogZGlzdFRvUG9pbnQgPCAwICkge1xuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdC8vIHJheSBvcmlnaW4gaXMgYmVoaW5kIHRoZSBwbGFuZSAoYW5kIGlzIHBvaW50aW5nIGJlaGluZCBpdClcblxuXHRcdHJldHVybiBmYWxzZTtcblxuXHR9LFxuXG5cdGludGVyc2VjdEJveDogZnVuY3Rpb24gKCBib3gsIHRhcmdldCApIHtcblxuXHRcdHZhciB0bWluLCB0bWF4LCB0eW1pbiwgdHltYXgsIHR6bWluLCB0em1heDtcblxuXHRcdHZhciBpbnZkaXJ4ID0gMSAvIHRoaXMuZGlyZWN0aW9uLngsXG5cdFx0XHRpbnZkaXJ5ID0gMSAvIHRoaXMuZGlyZWN0aW9uLnksXG5cdFx0XHRpbnZkaXJ6ID0gMSAvIHRoaXMuZGlyZWN0aW9uLno7XG5cblx0XHR2YXIgb3JpZ2luID0gdGhpcy5vcmlnaW47XG5cblx0XHRpZiAoIGludmRpcnggPj0gMCApIHtcblxuXHRcdFx0dG1pbiA9ICggYm94Lm1pbi54IC0gb3JpZ2luLnggKSAqIGludmRpcng7XG5cdFx0XHR0bWF4ID0gKCBib3gubWF4LnggLSBvcmlnaW4ueCApICogaW52ZGlyeDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRtaW4gPSAoIGJveC5tYXgueCAtIG9yaWdpbi54ICkgKiBpbnZkaXJ4O1xuXHRcdFx0dG1heCA9ICggYm94Lm1pbi54IC0gb3JpZ2luLnggKSAqIGludmRpcng7XG5cblx0XHR9XG5cblx0XHRpZiAoIGludmRpcnkgPj0gMCApIHtcblxuXHRcdFx0dHltaW4gPSAoIGJveC5taW4ueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xuXHRcdFx0dHltYXggPSAoIGJveC5tYXgueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dHltaW4gPSAoIGJveC5tYXgueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xuXHRcdFx0dHltYXggPSAoIGJveC5taW4ueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCAoIHRtaW4gPiB0eW1heCApIHx8ICggdHltaW4gPiB0bWF4ICkgKSByZXR1cm4gbnVsbDtcblxuXHRcdC8vIFRoZXNlIGxpbmVzIGFsc28gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRtaW4gb3IgdG1heCBpcyBOYU5cblx0XHQvLyAocmVzdWx0IG9mIDAgKiBJbmZpbml0eSkuIHggIT09IHggcmV0dXJucyB0cnVlIGlmIHggaXMgTmFOXG5cblx0XHRpZiAoIHR5bWluID4gdG1pbiB8fCB0bWluICE9PSB0bWluICkgdG1pbiA9IHR5bWluO1xuXG5cdFx0aWYgKCB0eW1heCA8IHRtYXggfHwgdG1heCAhPT0gdG1heCApIHRtYXggPSB0eW1heDtcblxuXHRcdGlmICggaW52ZGlyeiA+PSAwICkge1xuXG5cdFx0XHR0em1pbiA9ICggYm94Lm1pbi56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XG5cdFx0XHR0em1heCA9ICggYm94Lm1heC56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0em1pbiA9ICggYm94Lm1heC56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XG5cdFx0XHR0em1heCA9ICggYm94Lm1pbi56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XG5cblx0XHR9XG5cblx0XHRpZiAoICggdG1pbiA+IHR6bWF4ICkgfHwgKCB0em1pbiA+IHRtYXggKSApIHJldHVybiBudWxsO1xuXG5cdFx0aWYgKCB0em1pbiA+IHRtaW4gfHwgdG1pbiAhPT0gdG1pbiApIHRtaW4gPSB0em1pbjtcblxuXHRcdGlmICggdHptYXggPCB0bWF4IHx8IHRtYXggIT09IHRtYXggKSB0bWF4ID0gdHptYXg7XG5cblx0XHQvL3JldHVybiBwb2ludCBjbG9zZXN0IHRvIHRoZSByYXkgKHBvc2l0aXZlIHNpZGUpXG5cblx0XHRpZiAoIHRtYXggPCAwICkgcmV0dXJuIG51bGw7XG5cblx0XHRyZXR1cm4gdGhpcy5hdCggdG1pbiA+PSAwID8gdG1pbiA6IHRtYXgsIHRhcmdldCApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c0JveDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0c0JveCggYm94ICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RCb3goIGJveCwgdiApICE9PSBudWxsO1xuXG5cdFx0fTtcblxuXHR9ICkoKSxcblxuXHRpbnRlcnNlY3RUcmlhbmdsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gQ29tcHV0ZSB0aGUgb2Zmc2V0IG9yaWdpbiwgZWRnZXMsIGFuZCBub3JtYWwuXG5cdFx0dmFyIGRpZmYgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBlZGdlMSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGVkZ2UyID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RUcmlhbmdsZSggYSwgYiwgYywgYmFja2ZhY2VDdWxsaW5nLCB0YXJnZXQgKSB7XG5cblx0XHRcdC8vIGZyb20gaHR0cDovL3d3dy5nZW9tZXRyaWN0b29scy5jb20vR1RFbmdpbmUvSW5jbHVkZS9NYXRoZW1hdGljcy9HdGVJbnRyUmF5M1RyaWFuZ2xlMy5oXG5cblx0XHRcdGVkZ2UxLnN1YlZlY3RvcnMoIGIsIGEgKTtcblx0XHRcdGVkZ2UyLnN1YlZlY3RvcnMoIGMsIGEgKTtcblx0XHRcdG5vcm1hbC5jcm9zc1ZlY3RvcnMoIGVkZ2UxLCBlZGdlMiApO1xuXG5cdFx0XHQvLyBTb2x2ZSBRICsgdCpEID0gYjEqRTEgKyBiMipFMiAoUSA9IGtEaWZmLCBEID0gcmF5IGRpcmVjdGlvbixcblx0XHRcdC8vIEUxID0ga0VkZ2UxLCBFMiA9IGtFZGdlMiwgTiA9IENyb3NzKEUxLEUyKSkgYnlcblx0XHRcdC8vICAgfERvdChELE4pfCpiMSA9IHNpZ24oRG90KEQsTikpKkRvdChELENyb3NzKFEsRTIpKVxuXHRcdFx0Ly8gICB8RG90KEQsTil8KmIyID0gc2lnbihEb3QoRCxOKSkqRG90KEQsQ3Jvc3MoRTEsUSkpXG5cdFx0XHQvLyAgIHxEb3QoRCxOKXwqdCA9IC1zaWduKERvdChELE4pKSpEb3QoUSxOKVxuXHRcdFx0dmFyIERkTiA9IHRoaXMuZGlyZWN0aW9uLmRvdCggbm9ybWFsICk7XG5cdFx0XHR2YXIgc2lnbjtcblxuXHRcdFx0aWYgKCBEZE4gPiAwICkge1xuXG5cdFx0XHRcdGlmICggYmFja2ZhY2VDdWxsaW5nICkgcmV0dXJuIG51bGw7XG5cdFx0XHRcdHNpZ24gPSAxO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBEZE4gPCAwICkge1xuXG5cdFx0XHRcdHNpZ24gPSAtIDE7XG5cdFx0XHRcdERkTiA9IC0gRGROO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHRcdGRpZmYuc3ViVmVjdG9ycyggdGhpcy5vcmlnaW4sIGEgKTtcblx0XHRcdHZhciBEZFF4RTIgPSBzaWduICogdGhpcy5kaXJlY3Rpb24uZG90KCBlZGdlMi5jcm9zc1ZlY3RvcnMoIGRpZmYsIGVkZ2UyICkgKTtcblxuXHRcdFx0Ly8gYjEgPCAwLCBubyBpbnRlcnNlY3Rpb25cblx0XHRcdGlmICggRGRReEUyIDwgMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgRGRFMXhRID0gc2lnbiAqIHRoaXMuZGlyZWN0aW9uLmRvdCggZWRnZTEuY3Jvc3MoIGRpZmYgKSApO1xuXG5cdFx0XHQvLyBiMiA8IDAsIG5vIGludGVyc2VjdGlvblxuXHRcdFx0aWYgKCBEZEUxeFEgPCAwICkge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGIxK2IyID4gMSwgbm8gaW50ZXJzZWN0aW9uXG5cdFx0XHRpZiAoIERkUXhFMiArIERkRTF4USA+IERkTiApIHtcblxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBMaW5lIGludGVyc2VjdHMgdHJpYW5nbGUsIGNoZWNrIGlmIHJheSBkb2VzLlxuXHRcdFx0dmFyIFFkTiA9IC0gc2lnbiAqIGRpZmYuZG90KCBub3JtYWwgKTtcblxuXHRcdFx0Ly8gdCA8IDAsIG5vIGludGVyc2VjdGlvblxuXHRcdFx0aWYgKCBRZE4gPCAwICkge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIFJheSBpbnRlcnNlY3RzIHRyaWFuZ2xlLlxuXHRcdFx0cmV0dXJuIHRoaXMuYXQoIFFkTiAvIERkTiwgdGFyZ2V0ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbWF0cml4NCApIHtcblxuXHRcdHRoaXMub3JpZ2luLmFwcGx5TWF0cml4NCggbWF0cml4NCApO1xuXHRcdHRoaXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbiggbWF0cml4NCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggcmF5ICkge1xuXG5cdFx0cmV0dXJuIHJheS5vcmlnaW4uZXF1YWxzKCB0aGlzLm9yaWdpbiApICYmIHJheS5kaXJlY3Rpb24uZXF1YWxzKCB0aGlzLmRpcmVjdGlvbiApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG5mdW5jdGlvbiBMaW5lMyggc3RhcnQsIGVuZCApIHtcblxuXHR0aGlzLnN0YXJ0ID0gKCBzdGFydCAhPT0gdW5kZWZpbmVkICkgPyBzdGFydCA6IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMuZW5kID0gKCBlbmQgIT09IHVuZGVmaW5lZCApID8gZW5kIDogbmV3IFZlY3RvcjMoKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBMaW5lMy5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggc3RhcnQsIGVuZCApIHtcblxuXHRcdHRoaXMuc3RhcnQuY29weSggc3RhcnQgKTtcblx0XHR0aGlzLmVuZC5jb3B5KCBlbmQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggbGluZSApIHtcblxuXHRcdHRoaXMuc3RhcnQuY29weSggbGluZS5zdGFydCApO1xuXHRcdHRoaXMuZW5kLmNvcHkoIGxpbmUuZW5kICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldENlbnRlcjogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lMzogLmdldENlbnRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5hZGRWZWN0b3JzKCB0aGlzLnN0YXJ0LCB0aGlzLmVuZCApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblxuXHR9LFxuXG5cdGRlbHRhOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmUzOiAuZGVsdGEoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuc3ViVmVjdG9ycyggdGhpcy5lbmQsIHRoaXMuc3RhcnQgKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlU3E6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG9TcXVhcmVkKCB0aGlzLmVuZCApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG8oIHRoaXMuZW5kICk7XG5cblx0fSxcblxuXHRhdDogZnVuY3Rpb24gKCB0LCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lMzogLmF0KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5kZWx0YSggdGFyZ2V0ICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMuc3RhcnQgKTtcblxuXHR9LFxuXG5cdGNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBzdGFydFAgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBzdGFydEVuZCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlciggcG9pbnQsIGNsYW1wVG9MaW5lICkge1xuXG5cdFx0XHRzdGFydFAuc3ViVmVjdG9ycyggcG9pbnQsIHRoaXMuc3RhcnQgKTtcblx0XHRcdHN0YXJ0RW5kLnN1YlZlY3RvcnMoIHRoaXMuZW5kLCB0aGlzLnN0YXJ0ICk7XG5cblx0XHRcdHZhciBzdGFydEVuZDIgPSBzdGFydEVuZC5kb3QoIHN0YXJ0RW5kICk7XG5cdFx0XHR2YXIgc3RhcnRFbmRfc3RhcnRQID0gc3RhcnRFbmQuZG90KCBzdGFydFAgKTtcblxuXHRcdFx0dmFyIHQgPSBzdGFydEVuZF9zdGFydFAgLyBzdGFydEVuZDI7XG5cblx0XHRcdGlmICggY2xhbXBUb0xpbmUgKSB7XG5cblx0XHRcdFx0dCA9IF9NYXRoLmNsYW1wKCB0LCAwLCAxICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHQ7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbG9zZXN0UG9pbnRUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50LCBjbGFtcFRvTGluZSwgdGFyZ2V0ICkge1xuXG5cdFx0dmFyIHQgPSB0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIoIHBvaW50LCBjbGFtcFRvTGluZSApO1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGluZTM6IC5jbG9zZXN0UG9pbnRUb1BvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5kZWx0YSggdGFyZ2V0ICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMuc3RhcnQgKTtcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHR0aGlzLnN0YXJ0LmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cdFx0dGhpcy5lbmQuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIGxpbmUgKSB7XG5cblx0XHRyZXR1cm4gbGluZS5zdGFydC5lcXVhbHMoIHRoaXMuc3RhcnQgKSAmJiBsaW5lLmVuZC5lcXVhbHMoIHRoaXMuZW5kICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBUcmlhbmdsZSggYSwgYiwgYyApIHtcblxuXHR0aGlzLmEgPSAoIGEgIT09IHVuZGVmaW5lZCApID8gYSA6IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMuYiA9ICggYiAhPT0gdW5kZWZpbmVkICkgPyBiIDogbmV3IFZlY3RvcjMoKTtcblx0dGhpcy5jID0gKCBjICE9PSB1bmRlZmluZWQgKSA/IGMgOiBuZXcgVmVjdG9yMygpO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFRyaWFuZ2xlLCB7XG5cblx0Z2V0Tm9ybWFsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjAgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGdldE5vcm1hbCggYSwgYiwgYywgdGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuZ2V0Tm9ybWFsKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0YXJnZXQuc3ViVmVjdG9ycyggYywgYiApO1xuXHRcdFx0djAuc3ViVmVjdG9ycyggYSwgYiApO1xuXHRcdFx0dGFyZ2V0LmNyb3NzKCB2MCApO1xuXG5cdFx0XHR2YXIgdGFyZ2V0TGVuZ3RoU3EgPSB0YXJnZXQubGVuZ3RoU3EoKTtcblx0XHRcdGlmICggdGFyZ2V0TGVuZ3RoU3EgPiAwICkge1xuXG5cdFx0XHRcdHJldHVybiB0YXJnZXQubXVsdGlwbHlTY2FsYXIoIDEgLyBNYXRoLnNxcnQoIHRhcmdldExlbmd0aFNxICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LnNldCggMCwgMCwgMCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Ly8gc3RhdGljL2luc3RhbmNlIG1ldGhvZCB0byBjYWxjdWxhdGUgYmFyeWNlbnRyaWMgY29vcmRpbmF0ZXNcblx0Ly8gYmFzZWQgb246IGh0dHA6Ly93d3cuYmxhY2twYXduLmNvbS90ZXh0cy9wb2ludGlucG9seS9kZWZhdWx0Lmh0bWxcblx0Z2V0QmFyeWNvb3JkOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjAgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHYyID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRCYXJ5Y29vcmQoIHBvaW50LCBhLCBiLCBjLCB0YXJnZXQgKSB7XG5cblx0XHRcdHYwLnN1YlZlY3RvcnMoIGMsIGEgKTtcblx0XHRcdHYxLnN1YlZlY3RvcnMoIGIsIGEgKTtcblx0XHRcdHYyLnN1YlZlY3RvcnMoIHBvaW50LCBhICk7XG5cblx0XHRcdHZhciBkb3QwMCA9IHYwLmRvdCggdjAgKTtcblx0XHRcdHZhciBkb3QwMSA9IHYwLmRvdCggdjEgKTtcblx0XHRcdHZhciBkb3QwMiA9IHYwLmRvdCggdjIgKTtcblx0XHRcdHZhciBkb3QxMSA9IHYxLmRvdCggdjEgKTtcblx0XHRcdHZhciBkb3QxMiA9IHYxLmRvdCggdjIgKTtcblxuXHRcdFx0dmFyIGRlbm9tID0gKCBkb3QwMCAqIGRvdDExIC0gZG90MDEgKiBkb3QwMSApO1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuZ2V0QmFyeWNvb3JkKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBjb2xsaW5lYXIgb3Igc2luZ3VsYXIgdHJpYW5nbGVcblx0XHRcdGlmICggZGVub20gPT09IDAgKSB7XG5cblx0XHRcdFx0Ly8gYXJiaXRyYXJ5IGxvY2F0aW9uIG91dHNpZGUgb2YgdHJpYW5nbGU/XG5cdFx0XHRcdC8vIG5vdCBzdXJlIGlmIHRoaXMgaXMgdGhlIGJlc3QgaWRlYSwgbWF5YmUgc2hvdWxkIGJlIHJldHVybmluZyB1bmRlZmluZWRcblx0XHRcdFx0cmV0dXJuIHRhcmdldC5zZXQoIC0gMiwgLSAxLCAtIDEgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgaW52RGVub20gPSAxIC8gZGVub207XG5cdFx0XHR2YXIgdSA9ICggZG90MTEgKiBkb3QwMiAtIGRvdDAxICogZG90MTIgKSAqIGludkRlbm9tO1xuXHRcdFx0dmFyIHYgPSAoIGRvdDAwICogZG90MTIgLSBkb3QwMSAqIGRvdDAyICkgKiBpbnZEZW5vbTtcblxuXHRcdFx0Ly8gYmFyeWNlbnRyaWMgY29vcmRpbmF0ZXMgbXVzdCBhbHdheXMgc3VtIHRvIDFcblx0XHRcdHJldHVybiB0YXJnZXQuc2V0KCAxIC0gdSAtIHYsIHYsIHUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY29udGFpbnNQb2ludCggcG9pbnQsIGEsIGIsIGMgKSB7XG5cblx0XHRcdFRyaWFuZ2xlLmdldEJhcnljb29yZCggcG9pbnQsIGEsIGIsIGMsIHYxICk7XG5cblx0XHRcdHJldHVybiAoIHYxLnggPj0gMCApICYmICggdjEueSA+PSAwICkgJiYgKCAoIHYxLnggKyB2MS55ICkgPD0gMSApO1xuXG5cdFx0fTtcblxuXHR9KClcblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBUcmlhbmdsZS5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggYSwgYiwgYyApIHtcblxuXHRcdHRoaXMuYS5jb3B5KCBhICk7XG5cdFx0dGhpcy5iLmNvcHkoIGIgKTtcblx0XHR0aGlzLmMuY29weSggYyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tUG9pbnRzQW5kSW5kaWNlczogZnVuY3Rpb24gKCBwb2ludHMsIGkwLCBpMSwgaTIgKSB7XG5cblx0XHR0aGlzLmEuY29weSggcG9pbnRzWyBpMCBdICk7XG5cdFx0dGhpcy5iLmNvcHkoIHBvaW50c1sgaTEgXSApO1xuXHRcdHRoaXMuYy5jb3B5KCBwb2ludHNbIGkyIF0gKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggdHJpYW5nbGUgKSB7XG5cblx0XHR0aGlzLmEuY29weSggdHJpYW5nbGUuYSApO1xuXHRcdHRoaXMuYi5jb3B5KCB0cmlhbmdsZS5iICk7XG5cdFx0dGhpcy5jLmNvcHkoIHRyaWFuZ2xlLmMgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0QXJlYTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYwID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGdldEFyZWEoKSB7XG5cblx0XHRcdHYwLnN1YlZlY3RvcnMoIHRoaXMuYywgdGhpcy5iICk7XG5cdFx0XHR2MS5zdWJWZWN0b3JzKCB0aGlzLmEsIHRoaXMuYiApO1xuXG5cdFx0XHRyZXR1cm4gdjAuY3Jvc3MoIHYxICkubGVuZ3RoKCkgKiAwLjU7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRnZXRNaWRwb2ludDogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLmdldE1pZHBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmFkZFZlY3RvcnMoIHRoaXMuYSwgdGhpcy5iICkuYWRkKCB0aGlzLmMgKS5tdWx0aXBseVNjYWxhciggMSAvIDMgKTtcblxuXHR9LFxuXG5cdGdldE5vcm1hbDogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRyZXR1cm4gVHJpYW5nbGUuZ2V0Tm9ybWFsKCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jLCB0YXJnZXQgKTtcblxuXHR9LFxuXG5cdGdldFBsYW5lOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuZ2V0UGxhbmUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuc2V0RnJvbUNvcGxhbmFyUG9pbnRzKCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jICk7XG5cblx0fSxcblxuXHRnZXRCYXJ5Y29vcmQ6IGZ1bmN0aW9uICggcG9pbnQsIHRhcmdldCApIHtcblxuXHRcdHJldHVybiBUcmlhbmdsZS5nZXRCYXJ5Y29vcmQoIHBvaW50LCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jLCB0YXJnZXQgKTtcblxuXHR9LFxuXG5cdGNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gVHJpYW5nbGUuY29udGFpbnNQb2ludCggcG9pbnQsIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIGJveC5pbnRlcnNlY3RzVHJpYW5nbGUoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNsb3Nlc3RQb2ludFRvUG9pbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBwbGFuZSA9IG5ldyBQbGFuZSgpO1xuXHRcdHZhciBlZGdlTGlzdCA9IFsgbmV3IExpbmUzKCksIG5ldyBMaW5lMygpLCBuZXcgTGluZTMoKSBdO1xuXHRcdHZhciBwcm9qZWN0ZWRQb2ludCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGNsb3Nlc3RQb2ludCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY2xvc2VzdFBvaW50VG9Qb2ludCggcG9pbnQsIHRhcmdldCApIHtcblxuXHRcdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLmNsb3Nlc3RQb2ludFRvUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBtaW5EaXN0YW5jZSA9IEluZmluaXR5O1xuXG5cdFx0XHQvLyBwcm9qZWN0IHRoZSBwb2ludCBvbnRvIHRoZSBwbGFuZSBvZiB0aGUgdHJpYW5nbGVcblxuXHRcdFx0cGxhbmUuc2V0RnJvbUNvcGxhbmFyUG9pbnRzKCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jICk7XG5cdFx0XHRwbGFuZS5wcm9qZWN0UG9pbnQoIHBvaW50LCBwcm9qZWN0ZWRQb2ludCApO1xuXG5cdFx0XHQvLyBjaGVjayBpZiB0aGUgcHJvamVjdGlvbiBsaWVzIHdpdGhpbiB0aGUgdHJpYW5nbGVcblxuXHRcdFx0aWYgKCB0aGlzLmNvbnRhaW5zUG9pbnQoIHByb2plY3RlZFBvaW50ICkgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0Ly8gaWYgc28sIHRoaXMgaXMgdGhlIGNsb3Nlc3QgcG9pbnRcblxuXHRcdFx0XHR0YXJnZXQuY29weSggcHJvamVjdGVkUG9pbnQgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBpZiBub3QsIHRoZSBwb2ludCBmYWxscyBvdXRzaWRlIHRoZSB0cmlhbmdsZS4gdGhlIHRhcmdldCBpcyB0aGUgY2xvc2VzdCBwb2ludCB0byB0aGUgdHJpYW5nbGUncyBlZGdlcyBvciB2ZXJ0aWNlc1xuXG5cdFx0XHRcdGVkZ2VMaXN0WyAwIF0uc2V0KCB0aGlzLmEsIHRoaXMuYiApO1xuXHRcdFx0XHRlZGdlTGlzdFsgMSBdLnNldCggdGhpcy5iLCB0aGlzLmMgKTtcblx0XHRcdFx0ZWRnZUxpc3RbIDIgXS5zZXQoIHRoaXMuYywgdGhpcy5hICk7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZWRnZUxpc3QubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0ZWRnZUxpc3RbIGkgXS5jbG9zZXN0UG9pbnRUb1BvaW50KCBwcm9qZWN0ZWRQb2ludCwgdHJ1ZSwgY2xvc2VzdFBvaW50ICk7XG5cblx0XHRcdFx0XHR2YXIgZGlzdGFuY2UgPSBwcm9qZWN0ZWRQb2ludC5kaXN0YW5jZVRvU3F1YXJlZCggY2xvc2VzdFBvaW50ICk7XG5cblx0XHRcdFx0XHRpZiAoIGRpc3RhbmNlIDwgbWluRGlzdGFuY2UgKSB7XG5cblx0XHRcdFx0XHRcdG1pbkRpc3RhbmNlID0gZGlzdGFuY2U7XG5cblx0XHRcdFx0XHRcdHRhcmdldC5jb3B5KCBjbG9zZXN0UG9pbnQgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRhcmdldDtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCB0cmlhbmdsZSApIHtcblxuXHRcdHJldHVybiB0cmlhbmdsZS5hLmVxdWFscyggdGhpcy5hICkgJiYgdHJpYW5nbGUuYi5lcXVhbHMoIHRoaXMuYiApICYmIHRyaWFuZ2xlLmMuZXF1YWxzKCB0aGlzLmMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGpvbm9icjEgLyBodHRwOi8vam9ub2JyMS5jb20vXG4gKi9cblxuZnVuY3Rpb24gTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaCc7XG5cblx0dGhpcy5nZW9tZXRyeSA9IGdlb21ldHJ5ICE9PSB1bmRlZmluZWQgPyBnZW9tZXRyeSA6IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHR0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWwgIT09IHVuZGVmaW5lZCA/IG1hdGVyaWFsIDogbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmYgfSApO1xuXG5cdHRoaXMuZHJhd01vZGUgPSBUcmlhbmdsZXNEcmF3TW9kZTtcblxuXHR0aGlzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpO1xuXG59XG5cbk1lc2gucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTWVzaCxcblxuXHRpc01lc2g6IHRydWUsXG5cblx0c2V0RHJhd01vZGU6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmRyYXdNb2RlID0gdmFsdWU7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5kcmF3TW9kZSA9IHNvdXJjZS5kcmF3TW9kZTtcblxuXHRcdGlmICggc291cmNlLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IHNvdXJjZS5tb3JwaFRhcmdldEluZmx1ZW5jZXMuc2xpY2UoKTtcblxuXHRcdH1cblxuXHRcdGlmICggc291cmNlLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSA9IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UubW9ycGhUYXJnZXREaWN0aW9uYXJ5ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHVwZGF0ZU1vcnBoVGFyZ2V0czogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblx0XHR2YXIgbSwgbWwsIG5hbWU7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdHZhciBtb3JwaEF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXM7XG5cdFx0XHR2YXIga2V5cyA9IE9iamVjdC5rZXlzKCBtb3JwaEF0dHJpYnV0ZXMgKTtcblxuXHRcdFx0aWYgKCBrZXlzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdFx0dmFyIG1vcnBoQXR0cmlidXRlID0gbW9ycGhBdHRyaWJ1dGVzWyBrZXlzWyAwIF0gXTtcblxuXHRcdFx0XHRpZiAoIG1vcnBoQXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IFtdO1xuXHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5ID0ge307XG5cblx0XHRcdFx0XHRmb3IgKCBtID0gMCwgbWwgPSBtb3JwaEF0dHJpYnV0ZS5sZW5ndGg7IG0gPCBtbDsgbSArKyApIHtcblxuXHRcdFx0XHRcdFx0bmFtZSA9IG1vcnBoQXR0cmlidXRlWyBtIF0ubmFtZSB8fCBTdHJpbmcoIG0gKTtcblxuXHRcdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCggMCApO1xuXHRcdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbIG5hbWUgXSA9IG07XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgbW9ycGhUYXJnZXRzID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzO1xuXG5cdFx0XHRpZiAoIG1vcnBoVGFyZ2V0cyAhPT0gdW5kZWZpbmVkICYmIG1vcnBoVGFyZ2V0cy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzID0gW107XG5cdFx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5ID0ge307XG5cblx0XHRcdFx0Zm9yICggbSA9IDAsIG1sID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsgbSA8IG1sOyBtICsrICkge1xuXG5cdFx0XHRcdFx0bmFtZSA9IG1vcnBoVGFyZ2V0c1sgbSBdLm5hbWUgfHwgU3RyaW5nKCBtICk7XG5cblx0XHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKCAwICk7XG5cdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbIG5hbWUgXSA9IG07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRyYXljYXN0OiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBpbnZlcnNlTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblx0XHR2YXIgcmF5ID0gbmV3IFJheSgpO1xuXHRcdHZhciBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHR2YXIgdkEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2QiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHZDID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciB0ZW1wQSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHRlbXBCID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdGVtcEMgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIHV2QSA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0dmFyIHV2QiA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0dmFyIHV2QyA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHR2YXIgYmFyeWNvb3JkID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciBpbnRlcnNlY3Rpb25Qb2ludCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGludGVyc2VjdGlvblBvaW50V29ybGQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0ZnVuY3Rpb24gdXZJbnRlcnNlY3Rpb24oIHBvaW50LCBwMSwgcDIsIHAzLCB1djEsIHV2MiwgdXYzICkge1xuXG5cdFx0XHRUcmlhbmdsZS5nZXRCYXJ5Y29vcmQoIHBvaW50LCBwMSwgcDIsIHAzLCBiYXJ5Y29vcmQgKTtcblxuXHRcdFx0dXYxLm11bHRpcGx5U2NhbGFyKCBiYXJ5Y29vcmQueCApO1xuXHRcdFx0dXYyLm11bHRpcGx5U2NhbGFyKCBiYXJ5Y29vcmQueSApO1xuXHRcdFx0dXYzLm11bHRpcGx5U2NhbGFyKCBiYXJ5Y29vcmQueiApO1xuXG5cdFx0XHR1djEuYWRkKCB1djIgKS5hZGQoIHV2MyApO1xuXG5cdFx0XHRyZXR1cm4gdXYxLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBjaGVja0ludGVyc2VjdGlvbiggb2JqZWN0LCBtYXRlcmlhbCwgcmF5Y2FzdGVyLCByYXksIHBBLCBwQiwgcEMsIHBvaW50ICkge1xuXG5cdFx0XHR2YXIgaW50ZXJzZWN0O1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICkge1xuXG5cdFx0XHRcdGludGVyc2VjdCA9IHJheS5pbnRlcnNlY3RUcmlhbmdsZSggcEMsIHBCLCBwQSwgdHJ1ZSwgcG9pbnQgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRpbnRlcnNlY3QgPSByYXkuaW50ZXJzZWN0VHJpYW5nbGUoIHBBLCBwQiwgcEMsIG1hdGVyaWFsLnNpZGUgIT09IERvdWJsZVNpZGUsIHBvaW50ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBpbnRlcnNlY3QgPT09IG51bGwgKSByZXR1cm4gbnVsbDtcblxuXHRcdFx0aW50ZXJzZWN0aW9uUG9pbnRXb3JsZC5jb3B5KCBwb2ludCApO1xuXHRcdFx0aW50ZXJzZWN0aW9uUG9pbnRXb3JsZC5hcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHR2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlcnNlY3Rpb25Qb2ludFdvcmxkICk7XG5cblx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSByZXR1cm4gbnVsbDtcblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0XHRwb2ludDogaW50ZXJzZWN0aW9uUG9pbnRXb3JsZC5jbG9uZSgpLFxuXHRcdFx0XHRvYmplY3Q6IG9iamVjdFxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGNoZWNrQnVmZmVyR2VvbWV0cnlJbnRlcnNlY3Rpb24oIG9iamVjdCwgcmF5Y2FzdGVyLCByYXksIHBvc2l0aW9uLCB1diwgYSwgYiwgYyApIHtcblxuXHRcdFx0dkEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGEgKTtcblx0XHRcdHZCLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBiICk7XG5cdFx0XHR2Qy5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgYyApO1xuXG5cdFx0XHR2YXIgaW50ZXJzZWN0aW9uID0gY2hlY2tJbnRlcnNlY3Rpb24oIG9iamVjdCwgb2JqZWN0Lm1hdGVyaWFsLCByYXljYXN0ZXIsIHJheSwgdkEsIHZCLCB2QywgaW50ZXJzZWN0aW9uUG9pbnQgKTtcblxuXHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XG5cblx0XHRcdFx0aWYgKCB1diApIHtcblxuXHRcdFx0XHRcdHV2QS5mcm9tQnVmZmVyQXR0cmlidXRlKCB1diwgYSApO1xuXHRcdFx0XHRcdHV2Qi5mcm9tQnVmZmVyQXR0cmlidXRlKCB1diwgYiApO1xuXHRcdFx0XHRcdHV2Qy5mcm9tQnVmZmVyQXR0cmlidXRlKCB1diwgYyApO1xuXG5cdFx0XHRcdFx0aW50ZXJzZWN0aW9uLnV2ID0gdXZJbnRlcnNlY3Rpb24oIGludGVyc2VjdGlvblBvaW50LCB2QSwgdkIsIHZDLCB1dkEsIHV2QiwgdXZDICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBmYWNlID0gbmV3IEZhY2UzKCBhLCBiLCBjICk7XG5cdFx0XHRcdFRyaWFuZ2xlLmdldE5vcm1hbCggdkEsIHZCLCB2QywgZmFjZS5ub3JtYWwgKTtcblxuXHRcdFx0XHRpbnRlcnNlY3Rpb24uZmFjZSA9IGZhY2U7XG5cdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlSW5kZXggPSBhO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBpbnRlcnNlY3Rpb247XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xuXG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXHRcdFx0dmFyIG1hdGVyaWFsID0gdGhpcy5tYXRlcmlhbDtcblx0XHRcdHZhciBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdFx0Ly8gQ2hlY2tpbmcgYm91bmRpbmdTcGhlcmUgZGlzdGFuY2UgdG8gcmF5XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdFx0c3BoZXJlLmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICk7XG5cdFx0XHRzcGhlcmUuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRpZiAoIHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0XHQvL1xuXG5cdFx0XHRpbnZlcnNlTWF0cml4LmdldEludmVyc2UoIG1hdHJpeFdvcmxkICk7XG5cdFx0XHRyYXkuY29weSggcmF5Y2FzdGVyLnJheSApLmFwcGx5TWF0cml4NCggaW52ZXJzZU1hdHJpeCApO1xuXG5cdFx0XHQvLyBDaGVjayBib3VuZGluZ0JveCBiZWZvcmUgY29udGludWluZ1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdGlmICggcmF5LmludGVyc2VjdHNCb3goIGdlb21ldHJ5LmJvdW5kaW5nQm94ICkgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBpbnRlcnNlY3Rpb247XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHR2YXIgYSwgYiwgYztcblx0XHRcdFx0dmFyIGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XG5cdFx0XHRcdHZhciBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0XHRcdHZhciB1diA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMudXY7XG5cdFx0XHRcdHZhciBpLCBsO1xuXG5cdFx0XHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHQvLyBpbmRleGVkIGJ1ZmZlciBnZW9tZXRyeVxuXG5cdFx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBpbmRleC5jb3VudDsgaSA8IGw7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRcdFx0YSA9IGluZGV4LmdldFgoIGkgKTtcblx0XHRcdFx0XHRcdGIgPSBpbmRleC5nZXRYKCBpICsgMSApO1xuXHRcdFx0XHRcdFx0YyA9IGluZGV4LmdldFgoIGkgKyAyICk7XG5cblx0XHRcdFx0XHRcdGludGVyc2VjdGlvbiA9IGNoZWNrQnVmZmVyR2VvbWV0cnlJbnRlcnNlY3Rpb24oIHRoaXMsIHJheWNhc3RlciwgcmF5LCBwb3NpdGlvbiwgdXYsIGEsIGIsIGMgKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XG5cblx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uLmZhY2VJbmRleCA9IE1hdGguZmxvb3IoIGkgLyAzICk7IC8vIHRyaWFuZ2xlIG51bWJlciBpbiBpbmRpY2VzIGJ1ZmZlciBzZW1hbnRpY3Ncblx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBub24taW5kZXhlZCBidWZmZXIgZ2VvbWV0cnlcblxuXHRcdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gcG9zaXRpb24uY291bnQ7IGkgPCBsOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0XHRcdGEgPSBpO1xuXHRcdFx0XHRcdFx0YiA9IGkgKyAxO1xuXHRcdFx0XHRcdFx0YyA9IGkgKyAyO1xuXG5cdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24gPSBjaGVja0J1ZmZlckdlb21ldHJ5SW50ZXJzZWN0aW9uKCB0aGlzLCByYXljYXN0ZXIsIHJheSwgcG9zaXRpb24sIHV2LCBhLCBiLCBjICk7XG5cblx0XHRcdFx0XHRcdGlmICggaW50ZXJzZWN0aW9uICkgaW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0dmFyIGZ2QSwgZnZCLCBmdkM7XG5cdFx0XHRcdHZhciBpc011bHRpTWF0ZXJpYWwgPSBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdHZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzO1xuXHRcdFx0XHR2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlcztcblx0XHRcdFx0dmFyIHV2cztcblxuXHRcdFx0XHR2YXIgZmFjZVZlcnRleFV2cyA9IGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIDAgXTtcblx0XHRcdFx0aWYgKCBmYWNlVmVydGV4VXZzLmxlbmd0aCA+IDAgKSB1dnMgPSBmYWNlVmVydGV4VXZzO1xuXG5cdFx0XHRcdGZvciAoIHZhciBmID0gMCwgZmwgPSBmYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0XHRcdHZhciBmYWNlID0gZmFjZXNbIGYgXTtcblx0XHRcdFx0XHR2YXIgZmFjZU1hdGVyaWFsID0gaXNNdWx0aU1hdGVyaWFsID8gbWF0ZXJpYWxbIGZhY2UubWF0ZXJpYWxJbmRleCBdIDogbWF0ZXJpYWw7XG5cblx0XHRcdFx0XHRpZiAoIGZhY2VNYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkgY29udGludWU7XG5cblx0XHRcdFx0XHRmdkEgPSB2ZXJ0aWNlc1sgZmFjZS5hIF07XG5cdFx0XHRcdFx0ZnZCID0gdmVydGljZXNbIGZhY2UuYiBdO1xuXHRcdFx0XHRcdGZ2QyA9IHZlcnRpY2VzWyBmYWNlLmMgXTtcblxuXHRcdFx0XHRcdGlmICggZmFjZU1hdGVyaWFsLm1vcnBoVGFyZ2V0cyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdFx0dmFyIG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cztcblx0XHRcdFx0XHRcdHZhciBtb3JwaEluZmx1ZW5jZXMgPSB0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcztcblxuXHRcdFx0XHRcdFx0dkEuc2V0KCAwLCAwLCAwICk7XG5cdFx0XHRcdFx0XHR2Qi5zZXQoIDAsIDAsIDAgKTtcblx0XHRcdFx0XHRcdHZDLnNldCggMCwgMCwgMCApO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgdCA9IDAsIHRsID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsgdCA8IHRsOyB0ICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdHZhciBpbmZsdWVuY2UgPSBtb3JwaEluZmx1ZW5jZXNbIHQgXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGluZmx1ZW5jZSA9PT0gMCApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0XHRcdHZhciB0YXJnZXRzID0gbW9ycGhUYXJnZXRzWyB0IF0udmVydGljZXM7XG5cblx0XHRcdFx0XHRcdFx0dkEuYWRkU2NhbGVkVmVjdG9yKCB0ZW1wQS5zdWJWZWN0b3JzKCB0YXJnZXRzWyBmYWNlLmEgXSwgZnZBICksIGluZmx1ZW5jZSApO1xuXHRcdFx0XHRcdFx0XHR2Qi5hZGRTY2FsZWRWZWN0b3IoIHRlbXBCLnN1YlZlY3RvcnMoIHRhcmdldHNbIGZhY2UuYiBdLCBmdkIgKSwgaW5mbHVlbmNlICk7XG5cdFx0XHRcdFx0XHRcdHZDLmFkZFNjYWxlZFZlY3RvciggdGVtcEMuc3ViVmVjdG9ycyggdGFyZ2V0c1sgZmFjZS5jIF0sIGZ2QyApLCBpbmZsdWVuY2UgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR2QS5hZGQoIGZ2QSApO1xuXHRcdFx0XHRcdFx0dkIuYWRkKCBmdkIgKTtcblx0XHRcdFx0XHRcdHZDLmFkZCggZnZDICk7XG5cblx0XHRcdFx0XHRcdGZ2QSA9IHZBO1xuXHRcdFx0XHRcdFx0ZnZCID0gdkI7XG5cdFx0XHRcdFx0XHRmdkMgPSB2QztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGludGVyc2VjdGlvbiA9IGNoZWNrSW50ZXJzZWN0aW9uKCB0aGlzLCBmYWNlTWF0ZXJpYWwsIHJheWNhc3RlciwgcmF5LCBmdkEsIGZ2QiwgZnZDLCBpbnRlcnNlY3Rpb25Qb2ludCApO1xuXG5cdFx0XHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XG5cblx0XHRcdFx0XHRcdGlmICggdXZzICYmIHV2c1sgZiBdICkge1xuXG5cdFx0XHRcdFx0XHRcdHZhciB1dnNfZiA9IHV2c1sgZiBdO1xuXHRcdFx0XHRcdFx0XHR1dkEuY29weSggdXZzX2ZbIDAgXSApO1xuXHRcdFx0XHRcdFx0XHR1dkIuY29weSggdXZzX2ZbIDEgXSApO1xuXHRcdFx0XHRcdFx0XHR1dkMuY29weSggdXZzX2ZbIDIgXSApO1xuXG5cdFx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi51diA9IHV2SW50ZXJzZWN0aW9uKCBpbnRlcnNlY3Rpb25Qb2ludCwgZnZBLCBmdkIsIGZ2QywgdXZBLCB1dkIsIHV2QyApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlID0gZmFjZTtcblx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlSW5kZXggPSBmO1xuXHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSgpICksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5nZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMQmFja2dyb3VuZCggcmVuZGVyZXIsIHN0YXRlLCBnZW9tZXRyaWVzLCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XG5cblx0dmFyIGNsZWFyQ29sb3IgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XG5cdHZhciBjbGVhckFscGhhID0gMDtcblxuXHR2YXIgcGxhbmVDYW1lcmEsIHBsYW5lTWVzaDtcblx0dmFyIGJveE1lc2g7XG5cblx0ZnVuY3Rpb24gcmVuZGVyKCByZW5kZXJMaXN0LCBzY2VuZSwgY2FtZXJhLCBmb3JjZUNsZWFyICkge1xuXG5cdFx0dmFyIGJhY2tncm91bmQgPSBzY2VuZS5iYWNrZ3JvdW5kO1xuXG5cdFx0aWYgKCBiYWNrZ3JvdW5kID09PSBudWxsICkge1xuXG5cdFx0XHRzZXRDbGVhciggY2xlYXJDb2xvciwgY2xlYXJBbHBoYSApO1xuXG5cdFx0fSBlbHNlIGlmICggYmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kLmlzQ29sb3IgKSB7XG5cblx0XHRcdHNldENsZWFyKCBiYWNrZ3JvdW5kLCAxICk7XG5cdFx0XHRmb3JjZUNsZWFyID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGlmICggcmVuZGVyZXIuYXV0b0NsZWFyIHx8IGZvcmNlQ2xlYXIgKSB7XG5cblx0XHRcdHJlbmRlcmVyLmNsZWFyKCByZW5kZXJlci5hdXRvQ2xlYXJDb2xvciwgcmVuZGVyZXIuYXV0b0NsZWFyRGVwdGgsIHJlbmRlcmVyLmF1dG9DbGVhclN0ZW5jaWwgKTtcblxuXHRcdH1cblxuXHRcdGlmICggYmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kLmlzQ3ViZVRleHR1cmUgKSB7XG5cblx0XHRcdGlmICggYm94TWVzaCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGJveE1lc2ggPSBuZXcgTWVzaChcblx0XHRcdFx0XHRuZXcgQm94QnVmZmVyR2VvbWV0cnkoIDEsIDEsIDEgKSxcblx0XHRcdFx0XHRuZXcgU2hhZGVyTWF0ZXJpYWwoIHtcblx0XHRcdFx0XHRcdHVuaWZvcm1zOiBTaGFkZXJMaWIuY3ViZS51bmlmb3Jtcyxcblx0XHRcdFx0XHRcdHZlcnRleFNoYWRlcjogU2hhZGVyTGliLmN1YmUudmVydGV4U2hhZGVyLFxuXHRcdFx0XHRcdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckxpYi5jdWJlLmZyYWdtZW50U2hhZGVyLFxuXHRcdFx0XHRcdFx0c2lkZTogQmFja1NpZGUsXG5cdFx0XHRcdFx0XHRkZXB0aFRlc3Q6IHRydWUsXG5cdFx0XHRcdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcblx0XHRcdFx0XHRcdGZvZzogZmFsc2Vcblx0XHRcdFx0XHR9IClcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRib3hNZXNoLmdlb21ldHJ5LnJlbW92ZUF0dHJpYnV0ZSggJ25vcm1hbCcgKTtcblx0XHRcdFx0Ym94TWVzaC5nZW9tZXRyeS5yZW1vdmVBdHRyaWJ1dGUoICd1dicgKTtcblxuXHRcdFx0XHRib3hNZXNoLm9uQmVmb3JlUmVuZGVyID0gZnVuY3Rpb24gKCByZW5kZXJlciwgc2NlbmUsIGNhbWVyYSApIHtcblxuXHRcdFx0XHRcdHRoaXMubWF0cml4V29ybGQuY29weVBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdGdlb21ldHJpZXMudXBkYXRlKCBib3hNZXNoLmdlb21ldHJ5ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ym94TWVzaC5tYXRlcmlhbC51bmlmb3Jtcy50Q3ViZS52YWx1ZSA9IGJhY2tncm91bmQ7XG5cblx0XHRcdHJlbmRlckxpc3QucHVzaCggYm94TWVzaCwgYm94TWVzaC5nZW9tZXRyeSwgYm94TWVzaC5tYXRlcmlhbCwgMCwgbnVsbCApO1xuXG5cdFx0fSBlbHNlIGlmICggYmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0aWYgKCBwbGFuZUNhbWVyYSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHBsYW5lQ2FtZXJhID0gbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSggLSAxLCAxLCAxLCAtIDEsIDAsIDEgKTtcblxuXHRcdFx0XHRwbGFuZU1lc2ggPSBuZXcgTWVzaChcblx0XHRcdFx0XHRuZXcgUGxhbmVCdWZmZXJHZW9tZXRyeSggMiwgMiApLFxuXHRcdFx0XHRcdG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyBkZXB0aFRlc3Q6IGZhbHNlLCBkZXB0aFdyaXRlOiBmYWxzZSwgZm9nOiBmYWxzZSB9IClcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRnZW9tZXRyaWVzLnVwZGF0ZSggcGxhbmVNZXNoLmdlb21ldHJ5ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cGxhbmVNZXNoLm1hdGVyaWFsLm1hcCA9IGJhY2tncm91bmQ7XG5cblx0XHRcdC8vIFRPRE8gUHVzaCB0aGlzIHRvIHJlbmRlckxpc3RcblxuXHRcdFx0cmVuZGVyZXIucmVuZGVyQnVmZmVyRGlyZWN0KCBwbGFuZUNhbWVyYSwgbnVsbCwgcGxhbmVNZXNoLmdlb21ldHJ5LCBwbGFuZU1lc2gubWF0ZXJpYWwsIHBsYW5lTWVzaCwgbnVsbCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRDbGVhciggY29sb3IsIGFscGhhICkge1xuXG5cdFx0c3RhdGUuYnVmZmVycy5jb2xvci5zZXRDbGVhciggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiwgYWxwaGEsIHByZW11bHRpcGxpZWRBbHBoYSApO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0Z2V0Q2xlYXJDb2xvcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gY2xlYXJDb2xvcjtcblxuXHRcdH0sXG5cdFx0c2V0Q2xlYXJDb2xvcjogZnVuY3Rpb24gKCBjb2xvciwgYWxwaGEgKSB7XG5cblx0XHRcdGNsZWFyQ29sb3Iuc2V0KCBjb2xvciApO1xuXHRcdFx0Y2xlYXJBbHBoYSA9IGFscGhhICE9PSB1bmRlZmluZWQgPyBhbHBoYSA6IDE7XG5cdFx0XHRzZXRDbGVhciggY2xlYXJDb2xvciwgY2xlYXJBbHBoYSApO1xuXG5cdFx0fSxcblx0XHRnZXRDbGVhckFscGhhOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiBjbGVhckFscGhhO1xuXG5cdFx0fSxcblx0XHRzZXRDbGVhckFscGhhOiBmdW5jdGlvbiAoIGFscGhhICkge1xuXG5cdFx0XHRjbGVhckFscGhhID0gYWxwaGE7XG5cdFx0XHRzZXRDbGVhciggY2xlYXJDb2xvciwgY2xlYXJBbHBoYSApO1xuXG5cdFx0fSxcblx0XHRyZW5kZXI6IHJlbmRlclxuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMQnVmZmVyUmVuZGVyZXIoIGdsLCBleHRlbnNpb25zLCBpbmZvICkge1xuXG5cdHZhciBtb2RlO1xuXG5cdGZ1bmN0aW9uIHNldE1vZGUoIHZhbHVlICkge1xuXG5cdFx0bW9kZSA9IHZhbHVlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXIoIHN0YXJ0LCBjb3VudCApIHtcblxuXHRcdGdsLmRyYXdBcnJheXMoIG1vZGUsIHN0YXJ0LCBjb3VudCApO1xuXG5cdFx0aW5mby51cGRhdGUoIGNvdW50LCBtb2RlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbmRlckluc3RhbmNlcyggZ2VvbWV0cnksIHN0YXJ0LCBjb3VudCApIHtcblxuXHRcdHZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7XG5cblx0XHRpZiAoIGV4dGVuc2lvbiA9PT0gbnVsbCApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMQnVmZmVyUmVuZGVyZXI6IHVzaW5nIFRIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IGJ1dCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiBBTkdMRV9pbnN0YW5jZWRfYXJyYXlzLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHZhciBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRpZiAoIHBvc2l0aW9uLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSB7XG5cblx0XHRcdGNvdW50ID0gcG9zaXRpb24uZGF0YS5jb3VudDtcblxuXHRcdFx0ZXh0ZW5zaW9uLmRyYXdBcnJheXNJbnN0YW5jZWRBTkdMRSggbW9kZSwgMCwgY291bnQsIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRleHRlbnNpb24uZHJhd0FycmF5c0luc3RhbmNlZEFOR0xFKCBtb2RlLCBzdGFydCwgY291bnQsIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICk7XG5cblx0XHR9XG5cblx0XHRpbmZvLnVwZGF0ZSggY291bnQsIG1vZGUsIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICk7XG5cblx0fVxuXG5cdC8vXG5cblx0dGhpcy5zZXRNb2RlID0gc2V0TW9kZTtcblx0dGhpcy5yZW5kZXIgPSByZW5kZXI7XG5cdHRoaXMucmVuZGVySW5zdGFuY2VzID0gcmVuZGVySW5zdGFuY2VzO1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTENhcGFiaWxpdGllcyggZ2wsIGV4dGVuc2lvbnMsIHBhcmFtZXRlcnMgKSB7XG5cblx0dmFyIG1heEFuaXNvdHJvcHk7XG5cblx0ZnVuY3Rpb24gZ2V0TWF4QW5pc290cm9weSgpIHtcblxuXHRcdGlmICggbWF4QW5pc290cm9weSAhPT0gdW5kZWZpbmVkICkgcmV0dXJuIG1heEFuaXNvdHJvcHk7XG5cblx0XHR2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICk7XG5cblx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0bWF4QW5pc290cm9weSA9IGdsLmdldFBhcmFtZXRlciggZXh0ZW5zaW9uLk1BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bWF4QW5pc290cm9weSA9IDA7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbWF4QW5pc290cm9weTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0TWF4UHJlY2lzaW9uKCBwcmVjaXNpb24gKSB7XG5cblx0XHRpZiAoIHByZWNpc2lvbiA9PT0gJ2hpZ2hwJyApIHtcblxuXHRcdFx0aWYgKCBnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIGdsLlZFUlRFWF9TSEFERVIsIGdsLkhJR0hfRkxPQVQgKS5wcmVjaXNpb24gPiAwICYmXG5cdFx0XHQgICAgIGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCggZ2wuRlJBR01FTlRfU0hBREVSLCBnbC5ISUdIX0ZMT0FUICkucHJlY2lzaW9uID4gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gJ2hpZ2hwJztcblxuXHRcdFx0fVxuXG5cdFx0XHRwcmVjaXNpb24gPSAnbWVkaXVtcCc7XG5cblx0XHR9XG5cblx0XHRpZiAoIHByZWNpc2lvbiA9PT0gJ21lZGl1bXAnICkge1xuXG5cdFx0XHRpZiAoIGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCggZ2wuVkVSVEVYX1NIQURFUiwgZ2wuTUVESVVNX0ZMT0FUICkucHJlY2lzaW9uID4gMCAmJlxuXHRcdFx0ICAgICBnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIGdsLkZSQUdNRU5UX1NIQURFUiwgZ2wuTUVESVVNX0ZMT0FUICkucHJlY2lzaW9uID4gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gJ21lZGl1bXAnO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gJ2xvd3AnO1xuXG5cdH1cblxuXHR2YXIgcHJlY2lzaW9uID0gcGFyYW1ldGVycy5wcmVjaXNpb24gIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMucHJlY2lzaW9uIDogJ2hpZ2hwJztcblx0dmFyIG1heFByZWNpc2lvbiA9IGdldE1heFByZWNpc2lvbiggcHJlY2lzaW9uICk7XG5cblx0aWYgKCBtYXhQcmVjaXNpb24gIT09IHByZWNpc2lvbiApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6JywgcHJlY2lzaW9uLCAnbm90IHN1cHBvcnRlZCwgdXNpbmcnLCBtYXhQcmVjaXNpb24sICdpbnN0ZWFkLicgKTtcblx0XHRwcmVjaXNpb24gPSBtYXhQcmVjaXNpb247XG5cblx0fVxuXG5cdHZhciBsb2dhcml0aG1pY0RlcHRoQnVmZmVyID0gcGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyID09PSB0cnVlO1xuXG5cdHZhciBtYXhUZXh0dXJlcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMgKTtcblx0dmFyIG1heFZlcnRleFRleHR1cmVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFMgKTtcblx0dmFyIG1heFRleHR1cmVTaXplID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVEVYVFVSRV9TSVpFICk7XG5cdHZhciBtYXhDdWJlbWFwU2l6ZSA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSApO1xuXG5cdHZhciBtYXhBdHRyaWJ1dGVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVkVSVEVYX0FUVFJJQlMgKTtcblx0dmFyIG1heFZlcnRleFVuaWZvcm1zID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUyApO1xuXHR2YXIgbWF4VmFyeWluZ3MgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9WQVJZSU5HX1ZFQ1RPUlMgKTtcblx0dmFyIG1heEZyYWdtZW50VW5pZm9ybXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlMgKTtcblxuXHR2YXIgdmVydGV4VGV4dHVyZXMgPSBtYXhWZXJ0ZXhUZXh0dXJlcyA+IDA7XG5cdHZhciBmbG9hdEZyYWdtZW50VGV4dHVyZXMgPSAhISBleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApO1xuXHR2YXIgZmxvYXRWZXJ0ZXhUZXh0dXJlcyA9IHZlcnRleFRleHR1cmVzICYmIGZsb2F0RnJhZ21lbnRUZXh0dXJlcztcblxuXHRyZXR1cm4ge1xuXG5cdFx0Z2V0TWF4QW5pc290cm9weTogZ2V0TWF4QW5pc290cm9weSxcblx0XHRnZXRNYXhQcmVjaXNpb246IGdldE1heFByZWNpc2lvbixcblxuXHRcdHByZWNpc2lvbjogcHJlY2lzaW9uLFxuXHRcdGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6IGxvZ2FyaXRobWljRGVwdGhCdWZmZXIsXG5cblx0XHRtYXhUZXh0dXJlczogbWF4VGV4dHVyZXMsXG5cdFx0bWF4VmVydGV4VGV4dHVyZXM6IG1heFZlcnRleFRleHR1cmVzLFxuXHRcdG1heFRleHR1cmVTaXplOiBtYXhUZXh0dXJlU2l6ZSxcblx0XHRtYXhDdWJlbWFwU2l6ZTogbWF4Q3ViZW1hcFNpemUsXG5cblx0XHRtYXhBdHRyaWJ1dGVzOiBtYXhBdHRyaWJ1dGVzLFxuXHRcdG1heFZlcnRleFVuaWZvcm1zOiBtYXhWZXJ0ZXhVbmlmb3Jtcyxcblx0XHRtYXhWYXJ5aW5nczogbWF4VmFyeWluZ3MsXG5cdFx0bWF4RnJhZ21lbnRVbmlmb3JtczogbWF4RnJhZ21lbnRVbmlmb3JtcyxcblxuXHRcdHZlcnRleFRleHR1cmVzOiB2ZXJ0ZXhUZXh0dXJlcyxcblx0XHRmbG9hdEZyYWdtZW50VGV4dHVyZXM6IGZsb2F0RnJhZ21lbnRUZXh0dXJlcyxcblx0XHRmbG9hdFZlcnRleFRleHR1cmVzOiBmbG9hdFZlcnRleFRleHR1cmVzXG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBXZWJHTENsaXBwaW5nKCkge1xuXG5cdHZhciBzY29wZSA9IHRoaXMsXG5cblx0XHRnbG9iYWxTdGF0ZSA9IG51bGwsXG5cdFx0bnVtR2xvYmFsUGxhbmVzID0gMCxcblx0XHRsb2NhbENsaXBwaW5nRW5hYmxlZCA9IGZhbHNlLFxuXHRcdHJlbmRlcmluZ1NoYWRvd3MgPSBmYWxzZSxcblxuXHRcdHBsYW5lID0gbmV3IFBsYW5lKCksXG5cdFx0dmlld05vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCksXG5cblx0XHR1bmlmb3JtID0geyB2YWx1ZTogbnVsbCwgbmVlZHNVcGRhdGU6IGZhbHNlIH07XG5cblx0dGhpcy51bmlmb3JtID0gdW5pZm9ybTtcblx0dGhpcy5udW1QbGFuZXMgPSAwO1xuXHR0aGlzLm51bUludGVyc2VjdGlvbiA9IDA7XG5cblx0dGhpcy5pbml0ID0gZnVuY3Rpb24gKCBwbGFuZXMsIGVuYWJsZUxvY2FsQ2xpcHBpbmcsIGNhbWVyYSApIHtcblxuXHRcdHZhciBlbmFibGVkID1cblx0XHRcdHBsYW5lcy5sZW5ndGggIT09IDAgfHxcblx0XHRcdGVuYWJsZUxvY2FsQ2xpcHBpbmcgfHxcblx0XHRcdC8vIGVuYWJsZSBzdGF0ZSBvZiBwcmV2aW91cyBmcmFtZSAtIHRoZSBjbGlwcGluZyBjb2RlIGhhcyB0b1xuXHRcdFx0Ly8gcnVuIGFub3RoZXIgZnJhbWUgaW4gb3JkZXIgdG8gcmVzZXQgdGhlIHN0YXRlOlxuXHRcdFx0bnVtR2xvYmFsUGxhbmVzICE9PSAwIHx8XG5cdFx0XHRsb2NhbENsaXBwaW5nRW5hYmxlZDtcblxuXHRcdGxvY2FsQ2xpcHBpbmdFbmFibGVkID0gZW5hYmxlTG9jYWxDbGlwcGluZztcblxuXHRcdGdsb2JhbFN0YXRlID0gcHJvamVjdFBsYW5lcyggcGxhbmVzLCBjYW1lcmEsIDAgKTtcblx0XHRudW1HbG9iYWxQbGFuZXMgPSBwbGFuZXMubGVuZ3RoO1xuXG5cdFx0cmV0dXJuIGVuYWJsZWQ7XG5cblx0fTtcblxuXHR0aGlzLmJlZ2luU2hhZG93cyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJlbmRlcmluZ1NoYWRvd3MgPSB0cnVlO1xuXHRcdHByb2plY3RQbGFuZXMoIG51bGwgKTtcblxuXHR9O1xuXG5cdHRoaXMuZW5kU2hhZG93cyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJlbmRlcmluZ1NoYWRvd3MgPSBmYWxzZTtcblx0XHRyZXNldEdsb2JhbFN0YXRlKCk7XG5cblx0fTtcblxuXHR0aGlzLnNldFN0YXRlID0gZnVuY3Rpb24gKCBwbGFuZXMsIGNsaXBJbnRlcnNlY3Rpb24sIGNsaXBTaGFkb3dzLCBjYW1lcmEsIGNhY2hlLCBmcm9tQ2FjaGUgKSB7XG5cblx0XHRpZiAoICEgbG9jYWxDbGlwcGluZ0VuYWJsZWQgfHwgcGxhbmVzID09PSBudWxsIHx8IHBsYW5lcy5sZW5ndGggPT09IDAgfHwgcmVuZGVyaW5nU2hhZG93cyAmJiAhIGNsaXBTaGFkb3dzICkge1xuXG5cdFx0XHQvLyB0aGVyZSdzIG5vIGxvY2FsIGNsaXBwaW5nXG5cblx0XHRcdGlmICggcmVuZGVyaW5nU2hhZG93cyApIHtcblxuXHRcdFx0XHQvLyB0aGVyZSdzIG5vIGdsb2JhbCBjbGlwcGluZ1xuXG5cdFx0XHRcdHByb2plY3RQbGFuZXMoIG51bGwgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZXNldEdsb2JhbFN0YXRlKCk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHZhciBuR2xvYmFsID0gcmVuZGVyaW5nU2hhZG93cyA/IDAgOiBudW1HbG9iYWxQbGFuZXMsXG5cdFx0XHRcdGxHbG9iYWwgPSBuR2xvYmFsICogNCxcblxuXHRcdFx0XHRkc3RBcnJheSA9IGNhY2hlLmNsaXBwaW5nU3RhdGUgfHwgbnVsbDtcblxuXHRcdFx0dW5pZm9ybS52YWx1ZSA9IGRzdEFycmF5OyAvLyBlbnN1cmUgdW5pcXVlIHN0YXRlXG5cblx0XHRcdGRzdEFycmF5ID0gcHJvamVjdFBsYW5lcyggcGxhbmVzLCBjYW1lcmEsIGxHbG9iYWwsIGZyb21DYWNoZSApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IGxHbG9iYWw7ICsrIGkgKSB7XG5cblx0XHRcdFx0ZHN0QXJyYXlbIGkgXSA9IGdsb2JhbFN0YXRlWyBpIF07XG5cblx0XHRcdH1cblxuXHRcdFx0Y2FjaGUuY2xpcHBpbmdTdGF0ZSA9IGRzdEFycmF5O1xuXHRcdFx0dGhpcy5udW1JbnRlcnNlY3Rpb24gPSBjbGlwSW50ZXJzZWN0aW9uID8gdGhpcy5udW1QbGFuZXMgOiAwO1xuXHRcdFx0dGhpcy5udW1QbGFuZXMgKz0gbkdsb2JhbDtcblxuXHRcdH1cblxuXG5cdH07XG5cblx0ZnVuY3Rpb24gcmVzZXRHbG9iYWxTdGF0ZSgpIHtcblxuXHRcdGlmICggdW5pZm9ybS52YWx1ZSAhPT0gZ2xvYmFsU3RhdGUgKSB7XG5cblx0XHRcdHVuaWZvcm0udmFsdWUgPSBnbG9iYWxTdGF0ZTtcblx0XHRcdHVuaWZvcm0ubmVlZHNVcGRhdGUgPSBudW1HbG9iYWxQbGFuZXMgPiAwO1xuXG5cdFx0fVxuXG5cdFx0c2NvcGUubnVtUGxhbmVzID0gbnVtR2xvYmFsUGxhbmVzO1xuXHRcdHNjb3BlLm51bUludGVyc2VjdGlvbiA9IDA7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHByb2plY3RQbGFuZXMoIHBsYW5lcywgY2FtZXJhLCBkc3RPZmZzZXQsIHNraXBUcmFuc2Zvcm0gKSB7XG5cblx0XHR2YXIgblBsYW5lcyA9IHBsYW5lcyAhPT0gbnVsbCA/IHBsYW5lcy5sZW5ndGggOiAwLFxuXHRcdFx0ZHN0QXJyYXkgPSBudWxsO1xuXG5cdFx0aWYgKCBuUGxhbmVzICE9PSAwICkge1xuXG5cdFx0XHRkc3RBcnJheSA9IHVuaWZvcm0udmFsdWU7XG5cblx0XHRcdGlmICggc2tpcFRyYW5zZm9ybSAhPT0gdHJ1ZSB8fCBkc3RBcnJheSA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHR2YXIgZmxhdFNpemUgPSBkc3RPZmZzZXQgKyBuUGxhbmVzICogNCxcblx0XHRcdFx0XHR2aWV3TWF0cml4ID0gY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZTtcblxuXHRcdFx0XHR2aWV3Tm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCggdmlld01hdHJpeCApO1xuXG5cdFx0XHRcdGlmICggZHN0QXJyYXkgPT09IG51bGwgfHwgZHN0QXJyYXkubGVuZ3RoIDwgZmxhdFNpemUgKSB7XG5cblx0XHRcdFx0XHRkc3RBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoIGZsYXRTaXplICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaTQgPSBkc3RPZmZzZXQ7IGkgIT09IG5QbGFuZXM7ICsrIGksIGk0ICs9IDQgKSB7XG5cblx0XHRcdFx0XHRwbGFuZS5jb3B5KCBwbGFuZXNbIGkgXSApLmFwcGx5TWF0cml4NCggdmlld01hdHJpeCwgdmlld05vcm1hbE1hdHJpeCApO1xuXG5cdFx0XHRcdFx0cGxhbmUubm9ybWFsLnRvQXJyYXkoIGRzdEFycmF5LCBpNCApO1xuXHRcdFx0XHRcdGRzdEFycmF5WyBpNCArIDMgXSA9IHBsYW5lLmNvbnN0YW50O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR1bmlmb3JtLnZhbHVlID0gZHN0QXJyYXk7XG5cdFx0XHR1bmlmb3JtLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdHNjb3BlLm51bVBsYW5lcyA9IG5QbGFuZXM7XG5cblx0XHRyZXR1cm4gZHN0QXJyYXk7XG5cblx0fVxuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTEV4dGVuc2lvbnMoIGdsICkge1xuXG5cdHZhciBleHRlbnNpb25zID0ge307XG5cblx0cmV0dXJuIHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbnNbIG5hbWUgXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBleHRlbnNpb25zWyBuYW1lIF07XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGV4dGVuc2lvbjtcblxuXHRcdFx0c3dpdGNoICggbmFtZSApIHtcblxuXHRcdFx0XHRjYXNlICdXRUJHTF9kZXB0aF90ZXh0dXJlJzpcblx0XHRcdFx0XHRleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9kZXB0aF90ZXh0dXJlJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ01PWl9XRUJHTF9kZXB0aF90ZXh0dXJlJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJVF9XRUJHTF9kZXB0aF90ZXh0dXJlJyApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyc6XG5cdFx0XHRcdFx0ZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ01PWl9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCS0lUX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0Yyc6XG5cdFx0XHRcdFx0ZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnTU9aX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnOlxuXHRcdFx0XHRcdGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0ZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCBuYW1lICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBleHRlbnNpb24gPT09IG51bGwgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogJyArIG5hbWUgKyAnIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLicgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRleHRlbnNpb25zWyBuYW1lIF0gPSBleHRlbnNpb247XG5cblx0XHRcdHJldHVybiBleHRlbnNpb247XG5cblx0XHR9XG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xHZW9tZXRyaWVzKCBnbCwgYXR0cmlidXRlcywgaW5mbyApIHtcblxuXHR2YXIgZ2VvbWV0cmllcyA9IHt9O1xuXHR2YXIgd2lyZWZyYW1lQXR0cmlidXRlcyA9IHt9O1xuXG5cdGZ1bmN0aW9uIG9uR2VvbWV0cnlEaXNwb3NlKCBldmVudCApIHtcblxuXHRcdHZhciBnZW9tZXRyeSA9IGV2ZW50LnRhcmdldDtcblx0XHR2YXIgYnVmZmVyZ2VvbWV0cnkgPSBnZW9tZXRyaWVzWyBnZW9tZXRyeS5pZCBdO1xuXG5cdFx0aWYgKCBidWZmZXJnZW9tZXRyeS5pbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0YXR0cmlidXRlcy5yZW1vdmUoIGJ1ZmZlcmdlb21ldHJ5LmluZGV4ICk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgbmFtZSBpbiBidWZmZXJnZW9tZXRyeS5hdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRhdHRyaWJ1dGVzLnJlbW92ZSggYnVmZmVyZ2VvbWV0cnkuYXR0cmlidXRlc1sgbmFtZSBdICk7XG5cblx0XHR9XG5cblx0XHRnZW9tZXRyeS5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uR2VvbWV0cnlEaXNwb3NlICk7XG5cblx0XHRkZWxldGUgZ2VvbWV0cmllc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdC8vIFRPRE8gUmVtb3ZlIGR1cGxpY2F0ZSBjb2RlXG5cblx0XHR2YXIgYXR0cmlidXRlID0gd2lyZWZyYW1lQXR0cmlidXRlc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdGlmICggYXR0cmlidXRlICkge1xuXG5cdFx0XHRhdHRyaWJ1dGVzLnJlbW92ZSggYXR0cmlidXRlICk7XG5cdFx0XHRkZWxldGUgd2lyZWZyYW1lQXR0cmlidXRlc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdH1cblxuXHRcdGF0dHJpYnV0ZSA9IHdpcmVmcmFtZUF0dHJpYnV0ZXNbIGJ1ZmZlcmdlb21ldHJ5LmlkIF07XG5cblx0XHRpZiAoIGF0dHJpYnV0ZSApIHtcblxuXHRcdFx0YXR0cmlidXRlcy5yZW1vdmUoIGF0dHJpYnV0ZSApO1xuXHRcdFx0ZGVsZXRlIHdpcmVmcmFtZUF0dHJpYnV0ZXNbIGJ1ZmZlcmdlb21ldHJ5LmlkIF07XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0aW5mby5tZW1vcnkuZ2VvbWV0cmllcyAtLTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0KCBvYmplY3QsIGdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIGJ1ZmZlcmdlb21ldHJ5ID0gZ2VvbWV0cmllc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdGlmICggYnVmZmVyZ2VvbWV0cnkgKSByZXR1cm4gYnVmZmVyZ2VvbWV0cnk7XG5cblx0XHRnZW9tZXRyeS5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uR2VvbWV0cnlEaXNwb3NlICk7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdGJ1ZmZlcmdlb21ldHJ5ID0gZ2VvbWV0cnk7XG5cblx0XHR9IGVsc2UgaWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5Ll9idWZmZXJHZW9tZXRyeSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGdlb21ldHJ5Ll9idWZmZXJHZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpLnNldEZyb21PYmplY3QoIG9iamVjdCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGJ1ZmZlcmdlb21ldHJ5ID0gZ2VvbWV0cnkuX2J1ZmZlckdlb21ldHJ5O1xuXG5cdFx0fVxuXG5cdFx0Z2VvbWV0cmllc1sgZ2VvbWV0cnkuaWQgXSA9IGJ1ZmZlcmdlb21ldHJ5O1xuXG5cdFx0aW5mby5tZW1vcnkuZ2VvbWV0cmllcyArKztcblxuXHRcdHJldHVybiBidWZmZXJnZW9tZXRyeTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlKCBnZW9tZXRyeSApIHtcblxuXHRcdHZhciBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdHZhciBnZW9tZXRyeUF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0YXR0cmlidXRlcy51cGRhdGUoIGluZGV4LCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiApO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIG5hbWUgaW4gZ2VvbWV0cnlBdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRhdHRyaWJ1dGVzLnVwZGF0ZSggZ2VvbWV0cnlBdHRyaWJ1dGVzWyBuYW1lIF0sIGdsLkFSUkFZX0JVRkZFUiApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gbW9ycGggdGFyZ2V0c1xuXG5cdFx0dmFyIG1vcnBoQXR0cmlidXRlcyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcztcblxuXHRcdGZvciAoIHZhciBuYW1lIGluIG1vcnBoQXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gbW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF07XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlcy51cGRhdGUoIGFycmF5WyBpIF0sIGdsLkFSUkFZX0JVRkZFUiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldFdpcmVmcmFtZUF0dHJpYnV0ZSggZ2VvbWV0cnkgKSB7XG5cblx0XHR2YXIgYXR0cmlidXRlID0gd2lyZWZyYW1lQXR0cmlidXRlc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdGlmICggYXR0cmlidXRlICkgcmV0dXJuIGF0dHJpYnV0ZTtcblxuXHRcdHZhciBpbmRpY2VzID0gW107XG5cblx0XHR2YXIgZ2VvbWV0cnlJbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdHZhciBnZW9tZXRyeUF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuXG5cdFx0Ly8gY29uc29sZS50aW1lKCAnd2lyZWZyYW1lJyApO1xuXG5cdFx0aWYgKCBnZW9tZXRyeUluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBnZW9tZXRyeUluZGV4LmFycmF5O1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0dmFyIGEgPSBhcnJheVsgaSArIDAgXTtcblx0XHRcdFx0dmFyIGIgPSBhcnJheVsgaSArIDEgXTtcblx0XHRcdFx0dmFyIGMgPSBhcnJheVsgaSArIDIgXTtcblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGIsIGMsIGMsIGEgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gZ2VvbWV0cnlBdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSAoIGFycmF5Lmxlbmd0aCAvIDMgKSAtIDE7IGkgPCBsOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0dmFyIGEgPSBpICsgMDtcblx0XHRcdFx0dmFyIGIgPSBpICsgMTtcblx0XHRcdFx0dmFyIGMgPSBpICsgMjtcblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGIsIGMsIGMsIGEgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gY29uc29sZS50aW1lRW5kKCAnd2lyZWZyYW1lJyApO1xuXG5cdFx0YXR0cmlidXRlID0gbmV3ICggYXJyYXlNYXgoIGluZGljZXMgKSA+IDY1NTM1ID8gVWludDMyQnVmZmVyQXR0cmlidXRlIDogVWludDE2QnVmZmVyQXR0cmlidXRlICkoIGluZGljZXMsIDEgKTtcblxuXHRcdGF0dHJpYnV0ZXMudXBkYXRlKCBhdHRyaWJ1dGUsIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSICk7XG5cblx0XHR3aXJlZnJhbWVBdHRyaWJ1dGVzWyBnZW9tZXRyeS5pZCBdID0gYXR0cmlidXRlO1xuXG5cdFx0cmV0dXJuIGF0dHJpYnV0ZTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblxuXHRcdGdldDogZ2V0LFxuXHRcdHVwZGF0ZTogdXBkYXRlLFxuXG5cdFx0Z2V0V2lyZWZyYW1lQXR0cmlidXRlOiBnZXRXaXJlZnJhbWVBdHRyaWJ1dGVcblxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlciggZ2wsIGV4dGVuc2lvbnMsIGluZm8gKSB7XG5cblx0dmFyIG1vZGU7XG5cblx0ZnVuY3Rpb24gc2V0TW9kZSggdmFsdWUgKSB7XG5cblx0XHRtb2RlID0gdmFsdWU7XG5cblx0fVxuXG5cdHZhciB0eXBlLCBieXRlc1BlckVsZW1lbnQ7XG5cblx0ZnVuY3Rpb24gc2V0SW5kZXgoIHZhbHVlICkge1xuXG5cdFx0dHlwZSA9IHZhbHVlLnR5cGU7XG5cdFx0Ynl0ZXNQZXJFbGVtZW50ID0gdmFsdWUuYnl0ZXNQZXJFbGVtZW50O1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXIoIHN0YXJ0LCBjb3VudCApIHtcblxuXHRcdGdsLmRyYXdFbGVtZW50cyggbW9kZSwgY291bnQsIHR5cGUsIHN0YXJ0ICogYnl0ZXNQZXJFbGVtZW50ICk7XG5cblx0XHRpbmZvLnVwZGF0ZSggY291bnQsIG1vZGUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVuZGVySW5zdGFuY2VzKCBnZW9tZXRyeSwgc3RhcnQsIGNvdW50ICkge1xuXG5cdFx0dmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTtcblxuXHRcdGlmICggZXh0ZW5zaW9uID09PSBudWxsICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xJbmRleGVkQnVmZmVyUmVuZGVyZXI6IHVzaW5nIFRIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IGJ1dCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiBBTkdMRV9pbnN0YW5jZWRfYXJyYXlzLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGV4dGVuc2lvbi5kcmF3RWxlbWVudHNJbnN0YW5jZWRBTkdMRSggbW9kZSwgY291bnQsIHR5cGUsIHN0YXJ0ICogYnl0ZXNQZXJFbGVtZW50LCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCApO1xuXG5cdFx0aW5mby51cGRhdGUoIGNvdW50LCBtb2RlLCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCApO1xuXG5cdH1cblxuXHQvL1xuXG5cdHRoaXMuc2V0TW9kZSA9IHNldE1vZGU7XG5cdHRoaXMuc2V0SW5kZXggPSBzZXRJbmRleDtcblx0dGhpcy5yZW5kZXIgPSByZW5kZXI7XG5cdHRoaXMucmVuZGVySW5zdGFuY2VzID0gcmVuZGVySW5zdGFuY2VzO1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5mdW5jdGlvbiBXZWJHTEluZm8oIGdsICkge1xuXG5cdHZhciBtZW1vcnkgPSB7XG5cdFx0Z2VvbWV0cmllczogMCxcblx0XHR0ZXh0dXJlczogMFxuXHR9O1xuXG5cdHZhciByZW5kZXIgPSB7XG5cdFx0ZnJhbWU6IDAsXG5cdFx0Y2FsbHM6IDAsXG5cdFx0dHJpYW5nbGVzOiAwLFxuXHRcdHBvaW50czogMCxcblx0XHRsaW5lczogMFxuXHR9O1xuXG5cdGZ1bmN0aW9uIHVwZGF0ZSggY291bnQsIG1vZGUsIGluc3RhbmNlQ291bnQgKSB7XG5cblx0XHRpbnN0YW5jZUNvdW50ID0gaW5zdGFuY2VDb3VudCB8fCAxO1xuXG5cdFx0cmVuZGVyLmNhbGxzICsrO1xuXG5cdFx0c3dpdGNoICggbW9kZSApIHtcblxuXHRcdFx0Y2FzZSBnbC5UUklBTkdMRVM6XG5cdFx0XHRcdHJlbmRlci50cmlhbmdsZXMgKz0gaW5zdGFuY2VDb3VudCAqICggY291bnQgLyAzICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIGdsLlRSSUFOR0xFX1NUUklQOlxuXHRcdFx0Y2FzZSBnbC5UUklBTkdMRV9GQU46XG5cdFx0XHRcdHJlbmRlci50cmlhbmdsZXMgKz0gaW5zdGFuY2VDb3VudCAqICggY291bnQgLSAyICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIGdsLkxJTkVTOlxuXHRcdFx0XHRyZW5kZXIubGluZXMgKz0gaW5zdGFuY2VDb3VudCAqICggY291bnQgLyAyICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIGdsLkxJTkVfU1RSSVA6XG5cdFx0XHRcdHJlbmRlci5saW5lcyArPSBpbnN0YW5jZUNvdW50ICogKCBjb3VudCAtIDEgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgZ2wuTElORV9MT09QOlxuXHRcdFx0XHRyZW5kZXIubGluZXMgKz0gaW5zdGFuY2VDb3VudCAqIGNvdW50O1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBnbC5QT0lOVFM6XG5cdFx0XHRcdHJlbmRlci5wb2ludHMgKz0gaW5zdGFuY2VDb3VudCAqIGNvdW50O1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMSW5mbzogVW5rbm93biBkcmF3IG1vZGU6JywgbW9kZSApO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVzZXQoKSB7XG5cblx0XHRyZW5kZXIuZnJhbWUgKys7XG5cdFx0cmVuZGVyLmNhbGxzID0gMDtcblx0XHRyZW5kZXIudHJpYW5nbGVzID0gMDtcblx0XHRyZW5kZXIucG9pbnRzID0gMDtcblx0XHRyZW5kZXIubGluZXMgPSAwO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdG1lbW9yeTogbWVtb3J5LFxuXHRcdHJlbmRlcjogcmVuZGVyLFxuXHRcdHByb2dyYW1zOiBudWxsLFxuXHRcdGF1dG9SZXNldDogdHJ1ZSxcblx0XHRyZXNldDogcmVzZXQsXG5cdFx0dXBkYXRlOiB1cGRhdGVcblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gYWJzTnVtZXJpY2FsU29ydCggYSwgYiApIHtcblxuXHRyZXR1cm4gTWF0aC5hYnMoIGJbIDEgXSApIC0gTWF0aC5hYnMoIGFbIDEgXSApO1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMTW9ycGh0YXJnZXRzKCBnbCApIHtcblxuXHR2YXIgaW5mbHVlbmNlc0xpc3QgPSB7fTtcblx0dmFyIG1vcnBoSW5mbHVlbmNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIDggKTtcblxuXHRmdW5jdGlvbiB1cGRhdGUoIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBwcm9ncmFtICkge1xuXG5cdFx0dmFyIG9iamVjdEluZmx1ZW5jZXMgPSBvYmplY3QubW9ycGhUYXJnZXRJbmZsdWVuY2VzO1xuXG5cdFx0dmFyIGxlbmd0aCA9IG9iamVjdEluZmx1ZW5jZXMubGVuZ3RoO1xuXG5cdFx0dmFyIGluZmx1ZW5jZXMgPSBpbmZsdWVuY2VzTGlzdFsgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdGlmICggaW5mbHVlbmNlcyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBpbml0aWFsaXNlIGxpc3RcblxuXHRcdFx0aW5mbHVlbmNlcyA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0aW5mbHVlbmNlc1sgaSBdID0gWyBpLCAwIF07XG5cblx0XHRcdH1cblxuXHRcdFx0aW5mbHVlbmNlc0xpc3RbIGdlb21ldHJ5LmlkIF0gPSBpbmZsdWVuY2VzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIG1vcnBoVGFyZ2V0cyA9IG1hdGVyaWFsLm1vcnBoVGFyZ2V0cyAmJiBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0dmFyIG1vcnBoTm9ybWFscyA9IG1hdGVyaWFsLm1vcnBoTm9ybWFscyAmJiBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsO1xuXG5cdFx0Ly8gUmVtb3ZlIGN1cnJlbnQgbW9ycGhBdHRyaWJ1dGVzXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBpbmZsdWVuY2UgPSBpbmZsdWVuY2VzWyBpIF07XG5cblx0XHRcdGlmICggaW5mbHVlbmNlWyAxIF0gIT09IDAgKSB7XG5cblx0XHRcdFx0aWYgKCBtb3JwaFRhcmdldHMgKSBnZW9tZXRyeS5yZW1vdmVBdHRyaWJ1dGUoICdtb3JwaFRhcmdldCcgKyBpICk7XG5cdFx0XHRcdGlmICggbW9ycGhOb3JtYWxzICkgZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCAnbW9ycGhOb3JtYWwnICsgaSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBDb2xsZWN0IGluZmx1ZW5jZXNcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGluZmx1ZW5jZSA9IGluZmx1ZW5jZXNbIGkgXTtcblxuXHRcdFx0aW5mbHVlbmNlWyAwIF0gPSBpO1xuXHRcdFx0aW5mbHVlbmNlWyAxIF0gPSBvYmplY3RJbmZsdWVuY2VzWyBpIF07XG5cblx0XHR9XG5cblx0XHRpbmZsdWVuY2VzLnNvcnQoIGFic051bWVyaWNhbFNvcnQgKTtcblxuXHRcdC8vIEFkZCBtb3JwaEF0dHJpYnV0ZXNcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBpbmZsdWVuY2UgPSBpbmZsdWVuY2VzWyBpIF07XG5cblx0XHRcdGlmICggaW5mbHVlbmNlICkge1xuXG5cdFx0XHRcdHZhciBpbmRleCA9IGluZmx1ZW5jZVsgMCBdO1xuXHRcdFx0XHR2YXIgdmFsdWUgPSBpbmZsdWVuY2VbIDEgXTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICkge1xuXG5cdFx0XHRcdFx0aWYgKCBtb3JwaFRhcmdldHMgKSBnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdtb3JwaFRhcmdldCcgKyBpLCBtb3JwaFRhcmdldHNbIGluZGV4IF0gKTtcblx0XHRcdFx0XHRpZiAoIG1vcnBoTm9ybWFscyApIGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ21vcnBoTm9ybWFsJyArIGksIG1vcnBoTm9ybWFsc1sgaW5kZXggXSApO1xuXG5cdFx0XHRcdFx0bW9ycGhJbmZsdWVuY2VzWyBpIF0gPSB2YWx1ZTtcblx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0bW9ycGhJbmZsdWVuY2VzWyBpIF0gPSAwO1xuXG5cdFx0fVxuXG5cdFx0cHJvZ3JhbS5nZXRVbmlmb3JtcygpLnNldFZhbHVlKCBnbCwgJ21vcnBoVGFyZ2V0SW5mbHVlbmNlcycsIG1vcnBoSW5mbHVlbmNlcyApO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0dXBkYXRlOiB1cGRhdGVcblxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTE9iamVjdHMoIGdlb21ldHJpZXMsIGluZm8gKSB7XG5cblx0dmFyIHVwZGF0ZUxpc3QgPSB7fTtcblxuXHRmdW5jdGlvbiB1cGRhdGUoIG9iamVjdCApIHtcblxuXHRcdHZhciBmcmFtZSA9IGluZm8ucmVuZGVyLmZyYW1lO1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xuXHRcdHZhciBidWZmZXJnZW9tZXRyeSA9IGdlb21ldHJpZXMuZ2V0KCBvYmplY3QsIGdlb21ldHJ5ICk7XG5cblx0XHQvLyBVcGRhdGUgb25jZSBwZXIgZnJhbWVcblxuXHRcdGlmICggdXBkYXRlTGlzdFsgYnVmZmVyZ2VvbWV0cnkuaWQgXSAhPT0gZnJhbWUgKSB7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0XHRidWZmZXJnZW9tZXRyeS51cGRhdGVGcm9tT2JqZWN0KCBvYmplY3QgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyaWVzLnVwZGF0ZSggYnVmZmVyZ2VvbWV0cnkgKTtcblxuXHRcdFx0dXBkYXRlTGlzdFsgYnVmZmVyZ2VvbWV0cnkuaWQgXSA9IGZyYW1lO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGJ1ZmZlcmdlb21ldHJ5O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNwb3NlKCkge1xuXG5cdFx0dXBkYXRlTGlzdCA9IHt9O1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0dXBkYXRlOiB1cGRhdGUsXG5cdFx0ZGlzcG9zZTogZGlzcG9zZVxuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEN1YmVUZXh0dXJlKCBpbWFnZXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgZW5jb2RpbmcgKSB7XG5cblx0aW1hZ2VzID0gaW1hZ2VzICE9PSB1bmRlZmluZWQgPyBpbWFnZXMgOiBbXTtcblx0bWFwcGluZyA9IG1hcHBpbmcgIT09IHVuZGVmaW5lZCA/IG1hcHBpbmcgOiBDdWJlUmVmbGVjdGlvbk1hcHBpbmc7XG5cblx0VGV4dHVyZS5jYWxsKCB0aGlzLCBpbWFnZXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgZW5jb2RpbmcgKTtcblxuXHR0aGlzLmZsaXBZID0gZmFsc2U7XG5cbn1cblxuQ3ViZVRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTtcbkN1YmVUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN1YmVUZXh0dXJlO1xuXG5DdWJlVGV4dHVyZS5wcm90b3R5cGUuaXNDdWJlVGV4dHVyZSA9IHRydWU7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggQ3ViZVRleHR1cmUucHJvdG90eXBlLCAnaW1hZ2VzJywge1xuXG5cdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuaW1hZ2U7XG5cblx0fSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmltYWdlID0gdmFsdWU7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciB0c2Nod1xuICpcbiAqIFVuaWZvcm1zIG9mIGEgcHJvZ3JhbS5cbiAqIFRob3NlIGZvcm0gYSB0cmVlIHN0cnVjdHVyZSB3aXRoIGEgc3BlY2lhbCB0b3AtbGV2ZWwgY29udGFpbmVyIGZvciB0aGUgcm9vdCxcbiAqIHdoaWNoIHlvdSBnZXQgYnkgY2FsbGluZyAnbmV3IFdlYkdMVW5pZm9ybXMoIGdsLCBwcm9ncmFtLCByZW5kZXJlciApJy5cbiAqXG4gKlxuICogUHJvcGVydGllcyBvZiBpbm5lciBub2RlcyBpbmNsdWRpbmcgdGhlIHRvcC1sZXZlbCBjb250YWluZXI6XG4gKlxuICogLnNlcSAtIGFycmF5IG9mIG5lc3RlZCB1bmlmb3Jtc1xuICogLm1hcCAtIG5lc3RlZCB1bmlmb3JtcyBieSBuYW1lXG4gKlxuICpcbiAqIE1ldGhvZHMgb2YgYWxsIG5vZGVzIGV4Y2VwdCB0aGUgdG9wLWxldmVsIGNvbnRhaW5lcjpcbiAqXG4gKiAuc2V0VmFsdWUoIGdsLCB2YWx1ZSwgW3JlbmRlcmVyXSApXG4gKlxuICogXHRcdHVwbG9hZHMgYSB1bmlmb3JtIHZhbHVlKHMpXG4gKiAgXHR0aGUgJ3JlbmRlcmVyJyBwYXJhbWV0ZXIgaXMgbmVlZGVkIGZvciBzYW1wbGVyIHVuaWZvcm1zXG4gKlxuICpcbiAqIFN0YXRpYyBtZXRob2RzIG9mIHRoZSB0b3AtbGV2ZWwgY29udGFpbmVyIChyZW5kZXJlciBmYWN0b3JpemF0aW9ucyk6XG4gKlxuICogLnVwbG9hZCggZ2wsIHNlcSwgdmFsdWVzLCByZW5kZXJlciApXG4gKlxuICogXHRcdHNldHMgdW5pZm9ybXMgaW4gJ3NlcScgdG8gJ3ZhbHVlc1tpZF0udmFsdWUnXG4gKlxuICogLnNlcVdpdGhWYWx1ZSggc2VxLCB2YWx1ZXMgKSA6IGZpbHRlcmVkU2VxXG4gKlxuICogXHRcdGZpbHRlcnMgJ3NlcScgZW50cmllcyB3aXRoIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdmFsdWVzXG4gKlxuICpcbiAqIE1ldGhvZHMgb2YgdGhlIHRvcC1sZXZlbCBjb250YWluZXIgKHJlbmRlcmVyIGZhY3Rvcml6YXRpb25zKTpcbiAqXG4gKiAuc2V0VmFsdWUoIGdsLCBuYW1lLCB2YWx1ZSApXG4gKlxuICogXHRcdHNldHMgdW5pZm9ybSB3aXRoICBuYW1lICduYW1lJyB0byAndmFsdWUnXG4gKlxuICogLnNldCggZ2wsIG9iaiwgcHJvcCApXG4gKlxuICogXHRcdHNldHMgdW5pZm9ybSBmcm9tIG9iamVjdCBhbmQgcHJvcGVydHkgd2l0aCBzYW1lIG5hbWUgdGhhbiB1bmlmb3JtXG4gKlxuICogLnNldE9wdGlvbmFsKCBnbCwgb2JqLCBwcm9wIClcbiAqXG4gKiBcdFx0bGlrZSAuc2V0IGZvciBhbiBvcHRpb25hbCBwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0XG4gKlxuICovXG5cbnZhciBlbXB0eVRleHR1cmUgPSBuZXcgVGV4dHVyZSgpO1xudmFyIGVtcHR5Q3ViZVRleHR1cmUgPSBuZXcgQ3ViZVRleHR1cmUoKTtcblxuLy8gLS0tIEJhc2UgZm9yIGlubmVyIG5vZGVzIChpbmNsdWRpbmcgdGhlIHJvb3QpIC0tLVxuXG5mdW5jdGlvbiBVbmlmb3JtQ29udGFpbmVyKCkge1xuXG5cdHRoaXMuc2VxID0gW107XG5cdHRoaXMubWFwID0ge307XG5cbn1cblxuLy8gLS0tIFV0aWxpdGllcyAtLS1cblxuLy8gQXJyYXkgQ2FjaGVzIChwcm92aWRlIHR5cGVkIGFycmF5cyBmb3IgdGVtcG9yYXJ5IGJ5IHNpemUpXG5cbnZhciBhcnJheUNhY2hlRjMyID0gW107XG52YXIgYXJyYXlDYWNoZUkzMiA9IFtdO1xuXG4vLyBGbG9hdDMyQXJyYXkgY2FjaGVzIHVzZWQgZm9yIHVwbG9hZGluZyBNYXRyaXggdW5pZm9ybXNcblxudmFyIG1hdDRhcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoIDE2ICk7XG52YXIgbWF0M2FycmF5ID0gbmV3IEZsb2F0MzJBcnJheSggOSApO1xuXG4vLyBGbGF0dGVuaW5nIGZvciBhcnJheXMgb2YgdmVjdG9ycyBhbmQgbWF0cmljZXNcblxuZnVuY3Rpb24gZmxhdHRlbiggYXJyYXksIG5CbG9ja3MsIGJsb2NrU2l6ZSApIHtcblxuXHR2YXIgZmlyc3RFbGVtID0gYXJyYXlbIDAgXTtcblxuXHRpZiAoIGZpcnN0RWxlbSA8PSAwIHx8IGZpcnN0RWxlbSA+IDAgKSByZXR1cm4gYXJyYXk7XG5cdC8vIHVub3B0aW1pemVkOiAhIGlzTmFOKCBmaXJzdEVsZW0gKVxuXHQvLyBzZWUgaHR0cDovL2phY2tzb25kdW5zdGFuLmNvbS9hcnRpY2xlcy85ODNcblxuXHR2YXIgbiA9IG5CbG9ja3MgKiBibG9ja1NpemUsXG5cdFx0ciA9IGFycmF5Q2FjaGVGMzJbIG4gXTtcblxuXHRpZiAoIHIgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdHIgPSBuZXcgRmxvYXQzMkFycmF5KCBuICk7XG5cdFx0YXJyYXlDYWNoZUYzMlsgbiBdID0gcjtcblxuXHR9XG5cblx0aWYgKCBuQmxvY2tzICE9PSAwICkge1xuXG5cdFx0Zmlyc3RFbGVtLnRvQXJyYXkoIHIsIDAgKTtcblxuXHRcdGZvciAoIHZhciBpID0gMSwgb2Zmc2V0ID0gMDsgaSAhPT0gbkJsb2NrczsgKysgaSApIHtcblxuXHRcdFx0b2Zmc2V0ICs9IGJsb2NrU2l6ZTtcblx0XHRcdGFycmF5WyBpIF0udG9BcnJheSggciwgb2Zmc2V0ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiByO1xuXG59XG5cbi8vIFRleHR1cmUgdW5pdCBhbGxvY2F0aW9uXG5cbmZ1bmN0aW9uIGFsbG9jVGV4VW5pdHMoIHJlbmRlcmVyLCBuICkge1xuXG5cdHZhciByID0gYXJyYXlDYWNoZUkzMlsgbiBdO1xuXG5cdGlmICggciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0ciA9IG5ldyBJbnQzMkFycmF5KCBuICk7XG5cdFx0YXJyYXlDYWNoZUkzMlsgbiBdID0gcjtcblxuXHR9XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuOyArKyBpIClcblx0XHRyWyBpIF0gPSByZW5kZXJlci5hbGxvY1RleHR1cmVVbml0KCk7XG5cblx0cmV0dXJuIHI7XG5cbn1cblxuLy8gLS0tIFNldHRlcnMgLS0tXG5cbi8vIE5vdGU6IERlZmluaW5nIHRoZXNlIG1ldGhvZHMgZXh0ZXJuYWxseSwgYmVjYXVzZSB0aGV5IGNvbWUgaW4gYSBidW5jaFxuLy8gYW5kIHRoaXMgd2F5IHRoZWlyIG5hbWVzIG1pbmlmeS5cblxuLy8gU2luZ2xlIHNjYWxhclxuXG5mdW5jdGlvbiBzZXRWYWx1ZTFmKCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtMWYoIHRoaXMuYWRkciwgdiApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlMWkoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm0xaSggdGhpcy5hZGRyLCB2ICk7XG5cbn1cblxuLy8gU2luZ2xlIGZsb2F0IHZlY3RvciAoZnJvbSBmbGF0IGFycmF5IG9yIFRIUkVFLlZlY3Rvck4pXG5cbmZ1bmN0aW9uIHNldFZhbHVlMmZ2KCBnbCwgdiApIHtcblxuXHRpZiAoIHYueCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0Z2wudW5pZm9ybTJmdiggdGhpcy5hZGRyLCB2ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdGdsLnVuaWZvcm0yZiggdGhpcy5hZGRyLCB2LngsIHYueSApO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTNmdiggZ2wsIHYgKSB7XG5cblx0aWYgKCB2LnggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGdsLnVuaWZvcm0zZiggdGhpcy5hZGRyLCB2LngsIHYueSwgdi56ICk7XG5cblx0fSBlbHNlIGlmICggdi5yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRnbC51bmlmb3JtM2YoIHRoaXMuYWRkciwgdi5yLCB2LmcsIHYuYiApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRnbC51bmlmb3JtM2Z2KCB0aGlzLmFkZHIsIHYgKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWU0ZnYoIGdsLCB2ICkge1xuXG5cdGlmICggdi54ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRnbC51bmlmb3JtNGZ2KCB0aGlzLmFkZHIsIHYgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0IGdsLnVuaWZvcm00ZiggdGhpcy5hZGRyLCB2LngsIHYueSwgdi56LCB2LncgKTtcblxuXHR9XG5cbn1cblxuLy8gU2luZ2xlIG1hdHJpeCAoZnJvbSBmbGF0IGFycmF5IG9yIE1hdHJpeE4pXG5cbmZ1bmN0aW9uIHNldFZhbHVlMmZtKCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtTWF0cml4MmZ2KCB0aGlzLmFkZHIsIGZhbHNlLCB2LmVsZW1lbnRzIHx8IHYgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTNmbSggZ2wsIHYgKSB7XG5cblx0aWYgKCB2LmVsZW1lbnRzID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRnbC51bmlmb3JtTWF0cml4M2Z2KCB0aGlzLmFkZHIsIGZhbHNlLCB2ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdG1hdDNhcnJheS5zZXQoIHYuZWxlbWVudHMgKTtcblx0XHRnbC51bmlmb3JtTWF0cml4M2Z2KCB0aGlzLmFkZHIsIGZhbHNlLCBtYXQzYXJyYXkgKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWU0Zm0oIGdsLCB2ICkge1xuXG5cdGlmICggdi5lbGVtZW50cyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0Z2wudW5pZm9ybU1hdHJpeDRmdiggdGhpcy5hZGRyLCBmYWxzZSwgdiApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRtYXQ0YXJyYXkuc2V0KCB2LmVsZW1lbnRzICk7XG5cdFx0Z2wudW5pZm9ybU1hdHJpeDRmdiggdGhpcy5hZGRyLCBmYWxzZSwgbWF0NGFycmF5ICk7XG5cblx0fVxuXG59XG5cbi8vIFNpbmdsZSB0ZXh0dXJlICgyRCAvIEN1YmUpXG5cbmZ1bmN0aW9uIHNldFZhbHVlVDEoIGdsLCB2LCByZW5kZXJlciApIHtcblxuXHR2YXIgdW5pdCA9IHJlbmRlcmVyLmFsbG9jVGV4dHVyZVVuaXQoKTtcblx0Z2wudW5pZm9ybTFpKCB0aGlzLmFkZHIsIHVuaXQgKTtcblx0cmVuZGVyZXIuc2V0VGV4dHVyZTJEKCB2IHx8IGVtcHR5VGV4dHVyZSwgdW5pdCApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlVDYoIGdsLCB2LCByZW5kZXJlciApIHtcblxuXHR2YXIgdW5pdCA9IHJlbmRlcmVyLmFsbG9jVGV4dHVyZVVuaXQoKTtcblx0Z2wudW5pZm9ybTFpKCB0aGlzLmFkZHIsIHVuaXQgKTtcblx0cmVuZGVyZXIuc2V0VGV4dHVyZUN1YmUoIHYgfHwgZW1wdHlDdWJlVGV4dHVyZSwgdW5pdCApO1xuXG59XG5cbi8vIEludGVnZXIgLyBCb29sZWFuIHZlY3RvcnMgb3IgYXJyYXlzIHRoZXJlb2YgKGFsd2F5cyBmbGF0IGFycmF5cylcblxuZnVuY3Rpb24gc2V0VmFsdWUyaXYoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm0yaXYoIHRoaXMuYWRkciwgdiApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlM2l2KCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtM2l2KCB0aGlzLmFkZHIsIHYgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTRpdiggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTRpdiggdGhpcy5hZGRyLCB2ICk7XG5cbn1cblxuLy8gSGVscGVyIHRvIHBpY2sgdGhlIHJpZ2h0IHNldHRlciBmb3IgdGhlIHNpbmd1bGFyIGNhc2VcblxuZnVuY3Rpb24gZ2V0U2luZ3VsYXJTZXR0ZXIoIHR5cGUgKSB7XG5cblx0c3dpdGNoICggdHlwZSApIHtcblxuXHRcdGNhc2UgMHgxNDA2OiByZXR1cm4gc2V0VmFsdWUxZjsgLy8gRkxPQVRcblx0XHRjYXNlIDB4OGI1MDogcmV0dXJuIHNldFZhbHVlMmZ2OyAvLyBfVkVDMlxuXHRcdGNhc2UgMHg4YjUxOiByZXR1cm4gc2V0VmFsdWUzZnY7IC8vIF9WRUMzXG5cdFx0Y2FzZSAweDhiNTI6IHJldHVybiBzZXRWYWx1ZTRmdjsgLy8gX1ZFQzRcblxuXHRcdGNhc2UgMHg4YjVhOiByZXR1cm4gc2V0VmFsdWUyZm07IC8vIF9NQVQyXG5cdFx0Y2FzZSAweDhiNWI6IHJldHVybiBzZXRWYWx1ZTNmbTsgLy8gX01BVDNcblx0XHRjYXNlIDB4OGI1YzogcmV0dXJuIHNldFZhbHVlNGZtOyAvLyBfTUFUNFxuXG5cdFx0Y2FzZSAweDhiNWU6IGNhc2UgMHg4ZDY2OiByZXR1cm4gc2V0VmFsdWVUMTsgLy8gU0FNUExFUl8yRCwgU0FNUExFUl9FWFRFUk5BTF9PRVNcblx0XHRjYXNlIDB4OGI2MDogcmV0dXJuIHNldFZhbHVlVDY7IC8vIFNBTVBMRVJfQ1VCRVxuXG5cdFx0Y2FzZSAweDE0MDQ6IGNhc2UgMHg4YjU2OiByZXR1cm4gc2V0VmFsdWUxaTsgLy8gSU5ULCBCT09MXG5cdFx0Y2FzZSAweDhiNTM6IGNhc2UgMHg4YjU3OiByZXR1cm4gc2V0VmFsdWUyaXY7IC8vIF9WRUMyXG5cdFx0Y2FzZSAweDhiNTQ6IGNhc2UgMHg4YjU4OiByZXR1cm4gc2V0VmFsdWUzaXY7IC8vIF9WRUMzXG5cdFx0Y2FzZSAweDhiNTU6IGNhc2UgMHg4YjU5OiByZXR1cm4gc2V0VmFsdWU0aXY7IC8vIF9WRUM0XG5cblx0fVxuXG59XG5cbi8vIEFycmF5IG9mIHNjYWxhcnNcblxuZnVuY3Rpb24gc2V0VmFsdWUxZnYoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm0xZnYoIHRoaXMuYWRkciwgdiApO1xuXG59XG5mdW5jdGlvbiBzZXRWYWx1ZTFpdiggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTFpdiggdGhpcy5hZGRyLCB2ICk7XG5cbn1cblxuLy8gQXJyYXkgb2YgdmVjdG9ycyAoZmxhdCBvciBmcm9tIFRIUkVFIGNsYXNzZXMpXG5cbmZ1bmN0aW9uIHNldFZhbHVlVjJhKCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtMmZ2KCB0aGlzLmFkZHIsIGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgMiApICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVWM2EoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm0zZnYoIHRoaXMuYWRkciwgZmxhdHRlbiggdiwgdGhpcy5zaXplLCAzICkgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVY0YSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTRmdiggdGhpcy5hZGRyLCBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDQgKSApO1xuXG59XG5cbi8vIEFycmF5IG9mIG1hdHJpY2VzIChmbGF0IG9yIGZyb20gVEhSRUUgY2xhc2VzKVxuXG5mdW5jdGlvbiBzZXRWYWx1ZU0yYSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybU1hdHJpeDJmdiggdGhpcy5hZGRyLCBmYWxzZSwgZmxhdHRlbiggdiwgdGhpcy5zaXplLCA0ICkgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZU0zYSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybU1hdHJpeDNmdiggdGhpcy5hZGRyLCBmYWxzZSwgZmxhdHRlbiggdiwgdGhpcy5zaXplLCA5ICkgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZU00YSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybU1hdHJpeDRmdiggdGhpcy5hZGRyLCBmYWxzZSwgZmxhdHRlbiggdiwgdGhpcy5zaXplLCAxNiApICk7XG5cbn1cblxuLy8gQXJyYXkgb2YgdGV4dHVyZXMgKDJEIC8gQ3ViZSlcblxuZnVuY3Rpb24gc2V0VmFsdWVUMWEoIGdsLCB2LCByZW5kZXJlciApIHtcblxuXHR2YXIgbiA9IHYubGVuZ3RoLFxuXHRcdHVuaXRzID0gYWxsb2NUZXhVbml0cyggcmVuZGVyZXIsIG4gKTtcblxuXHRnbC51bmlmb3JtMWl2KCB0aGlzLmFkZHIsIHVuaXRzICk7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0cmVuZGVyZXIuc2V0VGV4dHVyZTJEKCB2WyBpIF0gfHwgZW1wdHlUZXh0dXJlLCB1bml0c1sgaSBdICk7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlVDZhKCBnbCwgdiwgcmVuZGVyZXIgKSB7XG5cblx0dmFyIG4gPSB2Lmxlbmd0aCxcblx0XHR1bml0cyA9IGFsbG9jVGV4VW5pdHMoIHJlbmRlcmVyLCBuICk7XG5cblx0Z2wudW5pZm9ybTFpdiggdGhpcy5hZGRyLCB1bml0cyApO1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdHJlbmRlcmVyLnNldFRleHR1cmVDdWJlKCB2WyBpIF0gfHwgZW1wdHlDdWJlVGV4dHVyZSwgdW5pdHNbIGkgXSApO1xuXG5cdH1cblxufVxuXG4vLyBIZWxwZXIgdG8gcGljayB0aGUgcmlnaHQgc2V0dGVyIGZvciBhIHB1cmUgKGJvdHRvbS1sZXZlbCkgYXJyYXlcblxuZnVuY3Rpb24gZ2V0UHVyZUFycmF5U2V0dGVyKCB0eXBlICkge1xuXG5cdHN3aXRjaCAoIHR5cGUgKSB7XG5cblx0XHRjYXNlIDB4MTQwNjogcmV0dXJuIHNldFZhbHVlMWZ2OyAvLyBGTE9BVFxuXHRcdGNhc2UgMHg4YjUwOiByZXR1cm4gc2V0VmFsdWVWMmE7IC8vIF9WRUMyXG5cdFx0Y2FzZSAweDhiNTE6IHJldHVybiBzZXRWYWx1ZVYzYTsgLy8gX1ZFQzNcblx0XHRjYXNlIDB4OGI1MjogcmV0dXJuIHNldFZhbHVlVjRhOyAvLyBfVkVDNFxuXG5cdFx0Y2FzZSAweDhiNWE6IHJldHVybiBzZXRWYWx1ZU0yYTsgLy8gX01BVDJcblx0XHRjYXNlIDB4OGI1YjogcmV0dXJuIHNldFZhbHVlTTNhOyAvLyBfTUFUM1xuXHRcdGNhc2UgMHg4YjVjOiByZXR1cm4gc2V0VmFsdWVNNGE7IC8vIF9NQVQ0XG5cblx0XHRjYXNlIDB4OGI1ZTogcmV0dXJuIHNldFZhbHVlVDFhOyAvLyBTQU1QTEVSXzJEXG5cdFx0Y2FzZSAweDhiNjA6IHJldHVybiBzZXRWYWx1ZVQ2YTsgLy8gU0FNUExFUl9DVUJFXG5cblx0XHRjYXNlIDB4MTQwNDogY2FzZSAweDhiNTY6IHJldHVybiBzZXRWYWx1ZTFpdjsgLy8gSU5ULCBCT09MXG5cdFx0Y2FzZSAweDhiNTM6IGNhc2UgMHg4YjU3OiByZXR1cm4gc2V0VmFsdWUyaXY7IC8vIF9WRUMyXG5cdFx0Y2FzZSAweDhiNTQ6IGNhc2UgMHg4YjU4OiByZXR1cm4gc2V0VmFsdWUzaXY7IC8vIF9WRUMzXG5cdFx0Y2FzZSAweDhiNTU6IGNhc2UgMHg4YjU5OiByZXR1cm4gc2V0VmFsdWU0aXY7IC8vIF9WRUM0XG5cblx0fVxuXG59XG5cbi8vIC0tLSBVbmlmb3JtIENsYXNzZXMgLS0tXG5cbmZ1bmN0aW9uIFNpbmdsZVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkge1xuXG5cdHRoaXMuaWQgPSBpZDtcblx0dGhpcy5hZGRyID0gYWRkcjtcblx0dGhpcy5zZXRWYWx1ZSA9IGdldFNpbmd1bGFyU2V0dGVyKCBhY3RpdmVJbmZvLnR5cGUgKTtcblxuXHQvLyB0aGlzLnBhdGggPSBhY3RpdmVJbmZvLm5hbWU7IC8vIERFQlVHXG5cbn1cblxuZnVuY3Rpb24gUHVyZUFycmF5VW5pZm9ybSggaWQsIGFjdGl2ZUluZm8sIGFkZHIgKSB7XG5cblx0dGhpcy5pZCA9IGlkO1xuXHR0aGlzLmFkZHIgPSBhZGRyO1xuXHR0aGlzLnNpemUgPSBhY3RpdmVJbmZvLnNpemU7XG5cdHRoaXMuc2V0VmFsdWUgPSBnZXRQdXJlQXJyYXlTZXR0ZXIoIGFjdGl2ZUluZm8udHlwZSApO1xuXG5cdC8vIHRoaXMucGF0aCA9IGFjdGl2ZUluZm8ubmFtZTsgLy8gREVCVUdcblxufVxuXG5mdW5jdGlvbiBTdHJ1Y3R1cmVkVW5pZm9ybSggaWQgKSB7XG5cblx0dGhpcy5pZCA9IGlkO1xuXG5cdFVuaWZvcm1Db250YWluZXIuY2FsbCggdGhpcyApOyAvLyBtaXgtaW5cblxufVxuXG5TdHJ1Y3R1cmVkVW5pZm9ybS5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbiAoIGdsLCB2YWx1ZSApIHtcblxuXHQvLyBOb3RlOiBEb24ndCBuZWVkIGFuIGV4dHJhICdyZW5kZXJlcicgcGFyYW1ldGVyLCBzaW5jZSBzYW1wbGVyc1xuXHQvLyBhcmUgbm90IGFsbG93ZWQgaW4gc3RydWN0dXJlZCB1bmlmb3Jtcy5cblxuXHR2YXIgc2VxID0gdGhpcy5zZXE7XG5cblx0Zm9yICggdmFyIGkgPSAwLCBuID0gc2VxLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdHZhciB1ID0gc2VxWyBpIF07XG5cdFx0dS5zZXRWYWx1ZSggZ2wsIHZhbHVlWyB1LmlkIF0gKTtcblxuXHR9XG5cbn07XG5cbi8vIC0tLSBUb3AtbGV2ZWwgLS0tXG5cbi8vIFBhcnNlciAtIGJ1aWxkcyB1cCB0aGUgcHJvcGVydHkgdHJlZSBmcm9tIHRoZSBwYXRoIHN0cmluZ3NcblxudmFyIFJlUGF0aFBhcnQgPSAvKFtcXHdcXGRfXSspKFxcXSk/KFxcW3xcXC4pPy9nO1xuXG4vLyBleHRyYWN0c1xuLy8gXHQtIHRoZSBpZGVudGlmaWVyIChtZW1iZXIgbmFtZSBvciBhcnJheSBpbmRleClcbi8vICAtIGZvbGxvd2VkIGJ5IGFuIG9wdGlvbmFsIHJpZ2h0IGJyYWNrZXQgKGZvdW5kIHdoZW4gYXJyYXkgaW5kZXgpXG4vLyAgLSBmb2xsb3dlZCBieSBhbiBvcHRpb25hbCBsZWZ0IGJyYWNrZXQgb3IgZG90ICh0eXBlIG9mIHN1YnNjcmlwdClcbi8vXG4vLyBOb3RlOiBUaGVzZSBwb3J0aW9ucyBjYW4gYmUgcmVhZCBpbiBhIG5vbi1vdmVybGFwcGluZyBmYXNoaW9uIGFuZFxuLy8gYWxsb3cgc3RyYWlnaHRmb3J3YXJkIHBhcnNpbmcgb2YgdGhlIGhpZXJhcmNoeSB0aGF0IFdlYkdMIGVuY29kZXNcbi8vIGluIHRoZSB1bmlmb3JtIG5hbWVzLlxuXG5mdW5jdGlvbiBhZGRVbmlmb3JtKCBjb250YWluZXIsIHVuaWZvcm1PYmplY3QgKSB7XG5cblx0Y29udGFpbmVyLnNlcS5wdXNoKCB1bmlmb3JtT2JqZWN0ICk7XG5cdGNvbnRhaW5lci5tYXBbIHVuaWZvcm1PYmplY3QuaWQgXSA9IHVuaWZvcm1PYmplY3Q7XG5cbn1cblxuZnVuY3Rpb24gcGFyc2VVbmlmb3JtKCBhY3RpdmVJbmZvLCBhZGRyLCBjb250YWluZXIgKSB7XG5cblx0dmFyIHBhdGggPSBhY3RpdmVJbmZvLm5hbWUsXG5cdFx0cGF0aExlbmd0aCA9IHBhdGgubGVuZ3RoO1xuXG5cdC8vIHJlc2V0IFJlZ0V4cCBvYmplY3QsIGJlY2F1c2Ugb2YgdGhlIGVhcmx5IGV4aXQgb2YgYSBwcmV2aW91cyBydW5cblx0UmVQYXRoUGFydC5sYXN0SW5kZXggPSAwO1xuXG5cdGZvciAoIDsgOyApIHtcblxuXHRcdHZhciBtYXRjaCA9IFJlUGF0aFBhcnQuZXhlYyggcGF0aCApLFxuXHRcdFx0bWF0Y2hFbmQgPSBSZVBhdGhQYXJ0Lmxhc3RJbmRleCxcblxuXHRcdFx0aWQgPSBtYXRjaFsgMSBdLFxuXHRcdFx0aWRJc0luZGV4ID0gbWF0Y2hbIDIgXSA9PT0gJ10nLFxuXHRcdFx0c3Vic2NyaXB0ID0gbWF0Y2hbIDMgXTtcblxuXHRcdGlmICggaWRJc0luZGV4ICkgaWQgPSBpZCB8IDA7IC8vIGNvbnZlcnQgdG8gaW50ZWdlclxuXG5cdFx0aWYgKCBzdWJzY3JpcHQgPT09IHVuZGVmaW5lZCB8fCBzdWJzY3JpcHQgPT09ICdbJyAmJiBtYXRjaEVuZCArIDIgPT09IHBhdGhMZW5ndGggKSB7XG5cblx0XHRcdC8vIGJhcmUgbmFtZSBvciBcInB1cmVcIiBib3R0b20tbGV2ZWwgYXJyYXkgXCJbMF1cIiBzdWZmaXhcblxuXHRcdFx0YWRkVW5pZm9ybSggY29udGFpbmVyLCBzdWJzY3JpcHQgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdG5ldyBTaW5nbGVVbmlmb3JtKCBpZCwgYWN0aXZlSW5mbywgYWRkciApIDpcblx0XHRcdFx0bmV3IFB1cmVBcnJheVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkgKTtcblxuXHRcdFx0YnJlYWs7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBzdGVwIGludG8gaW5uZXIgbm9kZSAvIGNyZWF0ZSBpdCBpbiBjYXNlIGl0IGRvZXNuJ3QgZXhpc3RcblxuXHRcdFx0dmFyIG1hcCA9IGNvbnRhaW5lci5tYXAsIG5leHQgPSBtYXBbIGlkIF07XG5cblx0XHRcdGlmICggbmV4dCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG5leHQgPSBuZXcgU3RydWN0dXJlZFVuaWZvcm0oIGlkICk7XG5cdFx0XHRcdGFkZFVuaWZvcm0oIGNvbnRhaW5lciwgbmV4dCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNvbnRhaW5lciA9IG5leHQ7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbi8vIFJvb3QgQ29udGFpbmVyXG5cbmZ1bmN0aW9uIFdlYkdMVW5pZm9ybXMoIGdsLCBwcm9ncmFtLCByZW5kZXJlciApIHtcblxuXHRVbmlmb3JtQ29udGFpbmVyLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG5cblx0dmFyIG4gPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCBnbC5BQ1RJVkVfVU5JRk9STVMgKTtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBuOyArKyBpICkge1xuXG5cdFx0dmFyIGluZm8gPSBnbC5nZXRBY3RpdmVVbmlmb3JtKCBwcm9ncmFtLCBpICksXG5cdFx0XHRhZGRyID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCBpbmZvLm5hbWUgKTtcblxuXHRcdHBhcnNlVW5pZm9ybSggaW5mbywgYWRkciwgdGhpcyApO1xuXG5cdH1cblxufVxuXG5XZWJHTFVuaWZvcm1zLnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uICggZ2wsIG5hbWUsIHZhbHVlICkge1xuXG5cdHZhciB1ID0gdGhpcy5tYXBbIG5hbWUgXTtcblxuXHRpZiAoIHUgIT09IHVuZGVmaW5lZCApIHUuc2V0VmFsdWUoIGdsLCB2YWx1ZSwgdGhpcy5yZW5kZXJlciApO1xuXG59O1xuXG5XZWJHTFVuaWZvcm1zLnByb3RvdHlwZS5zZXRPcHRpb25hbCA9IGZ1bmN0aW9uICggZ2wsIG9iamVjdCwgbmFtZSApIHtcblxuXHR2YXIgdiA9IG9iamVjdFsgbmFtZSBdO1xuXG5cdGlmICggdiAhPT0gdW5kZWZpbmVkICkgdGhpcy5zZXRWYWx1ZSggZ2wsIG5hbWUsIHYgKTtcblxufTtcblxuXG4vLyBTdGF0aWMgaW50ZXJmYWNlXG5cbldlYkdMVW5pZm9ybXMudXBsb2FkID0gZnVuY3Rpb24gKCBnbCwgc2VxLCB2YWx1ZXMsIHJlbmRlcmVyICkge1xuXG5cdGZvciAoIHZhciBpID0gMCwgbiA9IHNlcS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHR2YXIgdSA9IHNlcVsgaSBdLFxuXHRcdFx0diA9IHZhbHVlc1sgdS5pZCBdO1xuXG5cdFx0aWYgKCB2Lm5lZWRzVXBkYXRlICE9PSBmYWxzZSApIHtcblxuXHRcdFx0Ly8gbm90ZTogYWx3YXlzIHVwZGF0aW5nIHdoZW4gLm5lZWRzVXBkYXRlIGlzIHVuZGVmaW5lZFxuXHRcdFx0dS5zZXRWYWx1ZSggZ2wsIHYudmFsdWUsIHJlbmRlcmVyICk7XG5cblx0XHR9XG5cblx0fVxuXG59O1xuXG5XZWJHTFVuaWZvcm1zLnNlcVdpdGhWYWx1ZSA9IGZ1bmN0aW9uICggc2VxLCB2YWx1ZXMgKSB7XG5cblx0dmFyIHIgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBzZXEubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0dmFyIHUgPSBzZXFbIGkgXTtcblx0XHRpZiAoIHUuaWQgaW4gdmFsdWVzICkgci5wdXNoKCB1ICk7XG5cblx0fVxuXG5cdHJldHVybiByO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gYWRkTGluZU51bWJlcnMoIHN0cmluZyApIHtcblxuXHR2YXIgbGluZXMgPSBzdHJpbmcuc3BsaXQoICdcXG4nICk7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0bGluZXNbIGkgXSA9ICggaSArIDEgKSArICc6ICcgKyBsaW5lc1sgaSBdO1xuXG5cdH1cblxuXHRyZXR1cm4gbGluZXMuam9pbiggJ1xcbicgKTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTFNoYWRlciggZ2wsIHR5cGUsIHN0cmluZyApIHtcblxuXHR2YXIgc2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKCB0eXBlICk7XG5cblx0Z2wuc2hhZGVyU291cmNlKCBzaGFkZXIsIHN0cmluZyApO1xuXHRnbC5jb21waWxlU2hhZGVyKCBzaGFkZXIgKTtcblxuXHRpZiAoIGdsLmdldFNoYWRlclBhcmFtZXRlciggc2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUyApID09PSBmYWxzZSApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFNoYWRlcjogU2hhZGVyIGNvdWxkblxcJ3QgY29tcGlsZS4nICk7XG5cblx0fVxuXG5cdGlmICggZ2wuZ2V0U2hhZGVySW5mb0xvZyggc2hhZGVyICkgIT09ICcnICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xTaGFkZXI6IGdsLmdldFNoYWRlckluZm9Mb2coKScsIHR5cGUgPT09IGdsLlZFUlRFWF9TSEFERVIgPyAndmVydGV4JyA6ICdmcmFnbWVudCcsIGdsLmdldFNoYWRlckluZm9Mb2coIHNoYWRlciApLCBhZGRMaW5lTnVtYmVycyggc3RyaW5nICkgKTtcblxuXHR9XG5cblx0Ly8gLS1lbmFibGUtcHJpdmlsZWdlZC13ZWJnbC1leHRlbnNpb25cblx0Ly8gY29uc29sZS5sb2coIHR5cGUsIGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2RlYnVnX3NoYWRlcnMnICkuZ2V0VHJhbnNsYXRlZFNoYWRlclNvdXJjZSggc2hhZGVyICkgKTtcblxuXHRyZXR1cm4gc2hhZGVyO1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG52YXIgcHJvZ3JhbUlkQ291bnQgPSAwO1xuXG5mdW5jdGlvbiBnZXRFbmNvZGluZ0NvbXBvbmVudHMoIGVuY29kaW5nICkge1xuXG5cdHN3aXRjaCAoIGVuY29kaW5nICkge1xuXG5cdFx0Y2FzZSBMaW5lYXJFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdMaW5lYXInLCAnKCB2YWx1ZSApJyBdO1xuXHRcdGNhc2Ugc1JHQkVuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ3NSR0InLCAnKCB2YWx1ZSApJyBdO1xuXHRcdGNhc2UgUkdCRUVuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ1JHQkUnLCAnKCB2YWx1ZSApJyBdO1xuXHRcdGNhc2UgUkdCTTdFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdSR0JNJywgJyggdmFsdWUsIDcuMCApJyBdO1xuXHRcdGNhc2UgUkdCTTE2RW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnUkdCTScsICcoIHZhbHVlLCAxNi4wICknIF07XG5cdFx0Y2FzZSBSR0JERW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnUkdCRCcsICcoIHZhbHVlLCAyNTYuMCApJyBdO1xuXHRcdGNhc2UgR2FtbWFFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdHYW1tYScsICcoIHZhbHVlLCBmbG9hdCggR0FNTUFfRkFDVE9SICkgKScgXTtcblx0XHRkZWZhdWx0OlxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAndW5zdXBwb3J0ZWQgZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyApO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oIGZ1bmN0aW9uTmFtZSwgZW5jb2RpbmcgKSB7XG5cblx0dmFyIGNvbXBvbmVudHMgPSBnZXRFbmNvZGluZ0NvbXBvbmVudHMoIGVuY29kaW5nICk7XG5cdHJldHVybiAndmVjNCAnICsgZnVuY3Rpb25OYW1lICsgJyggdmVjNCB2YWx1ZSApIHsgcmV0dXJuICcgKyBjb21wb25lbnRzWyAwIF0gKyAnVG9MaW5lYXInICsgY29tcG9uZW50c1sgMSBdICsgJzsgfSc7XG5cbn1cblxuZnVuY3Rpb24gZ2V0VGV4ZWxFbmNvZGluZ0Z1bmN0aW9uKCBmdW5jdGlvbk5hbWUsIGVuY29kaW5nICkge1xuXG5cdHZhciBjb21wb25lbnRzID0gZ2V0RW5jb2RpbmdDb21wb25lbnRzKCBlbmNvZGluZyApO1xuXHRyZXR1cm4gJ3ZlYzQgJyArIGZ1bmN0aW9uTmFtZSArICcoIHZlYzQgdmFsdWUgKSB7IHJldHVybiBMaW5lYXJUbycgKyBjb21wb25lbnRzWyAwIF0gKyBjb21wb25lbnRzWyAxIF0gKyAnOyB9JztcblxufVxuXG5mdW5jdGlvbiBnZXRUb25lTWFwcGluZ0Z1bmN0aW9uKCBmdW5jdGlvbk5hbWUsIHRvbmVNYXBwaW5nICkge1xuXG5cdHZhciB0b25lTWFwcGluZ05hbWU7XG5cblx0c3dpdGNoICggdG9uZU1hcHBpbmcgKSB7XG5cblx0XHRjYXNlIExpbmVhclRvbmVNYXBwaW5nOlxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gJ0xpbmVhcic7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgUmVpbmhhcmRUb25lTWFwcGluZzpcblx0XHRcdHRvbmVNYXBwaW5nTmFtZSA9ICdSZWluaGFyZCc7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVW5jaGFydGVkMlRvbmVNYXBwaW5nOlxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gJ1VuY2hhcnRlZDInO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIENpbmVvblRvbmVNYXBwaW5nOlxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gJ09wdGltaXplZENpbmVvbic7XG5cdFx0XHRicmVhaztcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICd1bnN1cHBvcnRlZCB0b25lTWFwcGluZzogJyArIHRvbmVNYXBwaW5nICk7XG5cblx0fVxuXG5cdHJldHVybiAndmVjMyAnICsgZnVuY3Rpb25OYW1lICsgJyggdmVjMyBjb2xvciApIHsgcmV0dXJuICcgKyB0b25lTWFwcGluZ05hbWUgKyAnVG9uZU1hcHBpbmcoIGNvbG9yICk7IH0nO1xuXG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXh0ZW5zaW9ucyggZXh0ZW5zaW9ucywgcGFyYW1ldGVycywgcmVuZGVyZXJFeHRlbnNpb25zICkge1xuXG5cdGV4dGVuc2lvbnMgPSBleHRlbnNpb25zIHx8IHt9O1xuXG5cdHZhciBjaHVua3MgPSBbXG5cdFx0KCBleHRlbnNpb25zLmRlcml2YXRpdmVzIHx8IHBhcmFtZXRlcnMuZW52TWFwQ3ViZVVWIHx8IHBhcmFtZXRlcnMuYnVtcE1hcCB8fCBwYXJhbWV0ZXJzLm5vcm1hbE1hcCB8fCBwYXJhbWV0ZXJzLmZsYXRTaGFkaW5nICkgPyAnI2V4dGVuc2lvbiBHTF9PRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMgOiBlbmFibGUnIDogJycsXG5cdFx0KCBleHRlbnNpb25zLmZyYWdEZXB0aCB8fCBwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgKSAmJiByZW5kZXJlckV4dGVuc2lvbnMuZ2V0KCAnRVhUX2ZyYWdfZGVwdGgnICkgPyAnI2V4dGVuc2lvbiBHTF9FWFRfZnJhZ19kZXB0aCA6IGVuYWJsZScgOiAnJyxcblx0XHQoIGV4dGVuc2lvbnMuZHJhd0J1ZmZlcnMgKSAmJiByZW5kZXJlckV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfZHJhd19idWZmZXJzJyApID8gJyNleHRlbnNpb24gR0xfRVhUX2RyYXdfYnVmZmVycyA6IHJlcXVpcmUnIDogJycsXG5cdFx0KCBleHRlbnNpb25zLnNoYWRlclRleHR1cmVMT0QgfHwgcGFyYW1ldGVycy5lbnZNYXAgKSAmJiByZW5kZXJlckV4dGVuc2lvbnMuZ2V0KCAnRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCcgKSA/ICcjZXh0ZW5zaW9uIEdMX0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QgOiBlbmFibGUnIDogJydcblx0XTtcblxuXHRyZXR1cm4gY2h1bmtzLmZpbHRlciggZmlsdGVyRW1wdHlMaW5lICkuam9pbiggJ1xcbicgKTtcblxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZURlZmluZXMoIGRlZmluZXMgKSB7XG5cblx0dmFyIGNodW5rcyA9IFtdO1xuXG5cdGZvciAoIHZhciBuYW1lIGluIGRlZmluZXMgKSB7XG5cblx0XHR2YXIgdmFsdWUgPSBkZWZpbmVzWyBuYW1lIF07XG5cblx0XHRpZiAoIHZhbHVlID09PSBmYWxzZSApIGNvbnRpbnVlO1xuXG5cdFx0Y2h1bmtzLnB1c2goICcjZGVmaW5lICcgKyBuYW1lICsgJyAnICsgdmFsdWUgKTtcblxuXHR9XG5cblx0cmV0dXJuIGNodW5rcy5qb2luKCAnXFxuJyApO1xuXG59XG5cbmZ1bmN0aW9uIGZldGNoQXR0cmlidXRlTG9jYXRpb25zKCBnbCwgcHJvZ3JhbSApIHtcblxuXHR2YXIgYXR0cmlidXRlcyA9IHt9O1xuXG5cdHZhciBuID0gZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlciggcHJvZ3JhbSwgZ2wuQUNUSVZFX0FUVFJJQlVURVMgKTtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBuOyBpICsrICkge1xuXG5cdFx0dmFyIGluZm8gPSBnbC5nZXRBY3RpdmVBdHRyaWIoIHByb2dyYW0sIGkgKTtcblx0XHR2YXIgbmFtZSA9IGluZm8ubmFtZTtcblxuXHRcdC8vIGNvbnNvbGUubG9nKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiBBQ1RJVkUgVkVSVEVYIEFUVFJJQlVURTonLCBuYW1lLCBpICk7XG5cblx0XHRhdHRyaWJ1dGVzWyBuYW1lIF0gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbiggcHJvZ3JhbSwgbmFtZSApO1xuXG5cdH1cblxuXHRyZXR1cm4gYXR0cmlidXRlcztcblxufVxuXG5mdW5jdGlvbiBmaWx0ZXJFbXB0eUxpbmUoIHN0cmluZyApIHtcblxuXHRyZXR1cm4gc3RyaW5nICE9PSAnJztcblxufVxuXG5mdW5jdGlvbiByZXBsYWNlTGlnaHROdW1zKCBzdHJpbmcsIHBhcmFtZXRlcnMgKSB7XG5cblx0cmV0dXJuIHN0cmluZ1xuXHRcdC5yZXBsYWNlKCAvTlVNX0RJUl9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1EaXJMaWdodHMgKVxuXHRcdC5yZXBsYWNlKCAvTlVNX1NQT1RfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtU3BvdExpZ2h0cyApXG5cdFx0LnJlcGxhY2UoIC9OVU1fUkVDVF9BUkVBX0xJR0hUUy9nLCBwYXJhbWV0ZXJzLm51bVJlY3RBcmVhTGlnaHRzIClcblx0XHQucmVwbGFjZSggL05VTV9QT0lOVF9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1Qb2ludExpZ2h0cyApXG5cdFx0LnJlcGxhY2UoIC9OVU1fSEVNSV9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1IZW1pTGlnaHRzICk7XG5cbn1cblxuZnVuY3Rpb24gcmVwbGFjZUNsaXBwaW5nUGxhbmVOdW1zKCBzdHJpbmcsIHBhcmFtZXRlcnMgKSB7XG5cblx0cmV0dXJuIHN0cmluZ1xuXHRcdC5yZXBsYWNlKCAvTlVNX0NMSVBQSU5HX1BMQU5FUy9nLCBwYXJhbWV0ZXJzLm51bUNsaXBwaW5nUGxhbmVzIClcblx0XHQucmVwbGFjZSggL1VOSU9OX0NMSVBQSU5HX1BMQU5FUy9nLCAoIHBhcmFtZXRlcnMubnVtQ2xpcHBpbmdQbGFuZXMgLSBwYXJhbWV0ZXJzLm51bUNsaXBJbnRlcnNlY3Rpb24gKSApO1xuXG59XG5cbmZ1bmN0aW9uIHBhcnNlSW5jbHVkZXMoIHN0cmluZyApIHtcblxuXHR2YXIgcGF0dGVybiA9IC9eWyBcXHRdKiNpbmNsdWRlICs8KFtcXHdcXGQuXSspPi9nbTtcblxuXHRmdW5jdGlvbiByZXBsYWNlKCBtYXRjaCwgaW5jbHVkZSApIHtcblxuXHRcdHZhciByZXBsYWNlID0gU2hhZGVyQ2h1bmtbIGluY2x1ZGUgXTtcblxuXHRcdGlmICggcmVwbGFjZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdDYW4gbm90IHJlc29sdmUgI2luY2x1ZGUgPCcgKyBpbmNsdWRlICsgJz4nICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcGFyc2VJbmNsdWRlcyggcmVwbGFjZSApO1xuXG5cdH1cblxuXHRyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHBhdHRlcm4sIHJlcGxhY2UgKTtcblxufVxuXG5mdW5jdGlvbiB1bnJvbGxMb29wcyggc3RyaW5nICkge1xuXG5cdHZhciBwYXR0ZXJuID0gLyNwcmFnbWEgdW5yb2xsX2xvb3BbXFxzXSs/Zm9yIFxcKCBpbnQgaSBcXD0gKFxcZCspXFw7IGkgPCAoXFxkKylcXDsgaSBcXCtcXCsgXFwpIFxceyhbXFxzXFxTXSs/KSg/PVxcfSlcXH0vZztcblxuXHRmdW5jdGlvbiByZXBsYWNlKCBtYXRjaCwgc3RhcnQsIGVuZCwgc25pcHBldCApIHtcblxuXHRcdHZhciB1bnJvbGwgPSAnJztcblxuXHRcdGZvciAoIHZhciBpID0gcGFyc2VJbnQoIHN0YXJ0ICk7IGkgPCBwYXJzZUludCggZW5kICk7IGkgKysgKSB7XG5cblx0XHRcdHVucm9sbCArPSBzbmlwcGV0LnJlcGxhY2UoIC9cXFsgaSBcXF0vZywgJ1sgJyArIGkgKyAnIF0nICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdW5yb2xsO1xuXG5cdH1cblxuXHRyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHBhdHRlcm4sIHJlcGxhY2UgKTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTFByb2dyYW0oIHJlbmRlcmVyLCBleHRlbnNpb25zLCBjb2RlLCBtYXRlcmlhbCwgc2hhZGVyLCBwYXJhbWV0ZXJzICkge1xuXG5cdHZhciBnbCA9IHJlbmRlcmVyLmNvbnRleHQ7XG5cblx0dmFyIGRlZmluZXMgPSBtYXRlcmlhbC5kZWZpbmVzO1xuXG5cdHZhciB2ZXJ0ZXhTaGFkZXIgPSBzaGFkZXIudmVydGV4U2hhZGVyO1xuXHR2YXIgZnJhZ21lbnRTaGFkZXIgPSBzaGFkZXIuZnJhZ21lbnRTaGFkZXI7XG5cblx0dmFyIHNoYWRvd01hcFR5cGVEZWZpbmUgPSAnU0hBRE9XTUFQX1RZUEVfQkFTSUMnO1xuXG5cdGlmICggcGFyYW1ldGVycy5zaGFkb3dNYXBUeXBlID09PSBQQ0ZTaGFkb3dNYXAgKSB7XG5cblx0XHRzaGFkb3dNYXBUeXBlRGVmaW5lID0gJ1NIQURPV01BUF9UWVBFX1BDRic7XG5cblx0fSBlbHNlIGlmICggcGFyYW1ldGVycy5zaGFkb3dNYXBUeXBlID09PSBQQ0ZTb2Z0U2hhZG93TWFwICkge1xuXG5cdFx0c2hhZG93TWFwVHlwZURlZmluZSA9ICdTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCc7XG5cblx0fVxuXG5cdHZhciBlbnZNYXBUeXBlRGVmaW5lID0gJ0VOVk1BUF9UWVBFX0NVQkUnO1xuXHR2YXIgZW52TWFwTW9kZURlZmluZSA9ICdFTlZNQVBfTU9ERV9SRUZMRUNUSU9OJztcblx0dmFyIGVudk1hcEJsZW5kaW5nRGVmaW5lID0gJ0VOVk1BUF9CTEVORElOR19NVUxUSVBMWSc7XG5cblx0aWYgKCBwYXJhbWV0ZXJzLmVudk1hcCApIHtcblxuXHRcdHN3aXRjaCAoIG1hdGVyaWFsLmVudk1hcC5tYXBwaW5nICkge1xuXG5cdFx0XHRjYXNlIEN1YmVSZWZsZWN0aW9uTWFwcGluZzpcblx0XHRcdGNhc2UgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nOlxuXHRcdFx0XHRlbnZNYXBUeXBlRGVmaW5lID0gJ0VOVk1BUF9UWVBFX0NVQkUnO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzpcblx0XHRcdGNhc2UgQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmc6XG5cdFx0XHRcdGVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfQ1VCRV9VVic7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nOlxuXHRcdFx0Y2FzZSBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZzpcblx0XHRcdFx0ZW52TWFwVHlwZURlZmluZSA9ICdFTlZNQVBfVFlQRV9FUVVJUkVDJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmc6XG5cdFx0XHRcdGVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfU1BIRVJFJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cblx0XHRzd2l0Y2ggKCBtYXRlcmlhbC5lbnZNYXAubWFwcGluZyApIHtcblxuXHRcdFx0Y2FzZSBDdWJlUmVmcmFjdGlvbk1hcHBpbmc6XG5cdFx0XHRjYXNlIEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOlxuXHRcdFx0XHRlbnZNYXBNb2RlRGVmaW5lID0gJ0VOVk1BUF9NT0RFX1JFRlJBQ1RJT04nO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdH1cblxuXHRcdHN3aXRjaCAoIG1hdGVyaWFsLmNvbWJpbmUgKSB7XG5cblx0XHRcdGNhc2UgTXVsdGlwbHlPcGVyYXRpb246XG5cdFx0XHRcdGVudk1hcEJsZW5kaW5nRGVmaW5lID0gJ0VOVk1BUF9CTEVORElOR19NVUxUSVBMWSc7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIE1peE9wZXJhdGlvbjpcblx0XHRcdFx0ZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX01JWCc7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIEFkZE9wZXJhdGlvbjpcblx0XHRcdFx0ZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX0FERCc7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0fVxuXG5cdH1cblxuXHR2YXIgZ2FtbWFGYWN0b3JEZWZpbmUgPSAoIHJlbmRlcmVyLmdhbW1hRmFjdG9yID4gMCApID8gcmVuZGVyZXIuZ2FtbWFGYWN0b3IgOiAxLjA7XG5cblx0Ly8gY29uc29sZS5sb2coICdidWlsZGluZyBuZXcgcHJvZ3JhbSAnICk7XG5cblx0Ly9cblxuXHR2YXIgY3VzdG9tRXh0ZW5zaW9ucyA9IGdlbmVyYXRlRXh0ZW5zaW9ucyggbWF0ZXJpYWwuZXh0ZW5zaW9ucywgcGFyYW1ldGVycywgZXh0ZW5zaW9ucyApO1xuXG5cdHZhciBjdXN0b21EZWZpbmVzID0gZ2VuZXJhdGVEZWZpbmVzKCBkZWZpbmVzICk7XG5cblx0Ly9cblxuXHR2YXIgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTtcblxuXHR2YXIgcHJlZml4VmVydGV4LCBwcmVmaXhGcmFnbWVudDtcblxuXHRpZiAoIG1hdGVyaWFsLmlzUmF3U2hhZGVyTWF0ZXJpYWwgKSB7XG5cblx0XHRwcmVmaXhWZXJ0ZXggPSBbXG5cblx0XHRcdGN1c3RvbURlZmluZXNcblxuXHRcdF0uZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXFxuJyApO1xuXG5cdFx0aWYgKCBwcmVmaXhWZXJ0ZXgubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0cHJlZml4VmVydGV4ICs9ICdcXG4nO1xuXG5cdFx0fVxuXG5cdFx0cHJlZml4RnJhZ21lbnQgPSBbXG5cblx0XHRcdGN1c3RvbUV4dGVuc2lvbnMsXG5cdFx0XHRjdXN0b21EZWZpbmVzXG5cblx0XHRdLmZpbHRlciggZmlsdGVyRW1wdHlMaW5lICkuam9pbiggJ1xcbicgKTtcblxuXHRcdGlmICggcHJlZml4RnJhZ21lbnQubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0cHJlZml4RnJhZ21lbnQgKz0gJ1xcbic7XG5cblx0XHR9XG5cblx0fSBlbHNlIHtcblxuXHRcdHByZWZpeFZlcnRleCA9IFtcblxuXHRcdFx0J3ByZWNpc2lvbiAnICsgcGFyYW1ldGVycy5wcmVjaXNpb24gKyAnIGZsb2F0OycsXG5cdFx0XHQncHJlY2lzaW9uICcgKyBwYXJhbWV0ZXJzLnByZWNpc2lvbiArICcgaW50OycsXG5cblx0XHRcdCcjZGVmaW5lIFNIQURFUl9OQU1FICcgKyBzaGFkZXIubmFtZSxcblxuXHRcdFx0Y3VzdG9tRGVmaW5lcyxcblxuXHRcdFx0cGFyYW1ldGVycy5zdXBwb3J0c1ZlcnRleFRleHR1cmVzID8gJyNkZWZpbmUgVkVSVEVYX1RFWFRVUkVTJyA6ICcnLFxuXG5cdFx0XHQnI2RlZmluZSBHQU1NQV9GQUNUT1IgJyArIGdhbW1hRmFjdG9yRGVmaW5lLFxuXG5cdFx0XHQnI2RlZmluZSBNQVhfQk9ORVMgJyArIHBhcmFtZXRlcnMubWF4Qm9uZXMsXG5cdFx0XHQoIHBhcmFtZXRlcnMudXNlRm9nICYmIHBhcmFtZXRlcnMuZm9nICkgPyAnI2RlZmluZSBVU0VfRk9HJyA6ICcnLFxuXHRcdFx0KCBwYXJhbWV0ZXJzLnVzZUZvZyAmJiBwYXJhbWV0ZXJzLmZvZ0V4cCApID8gJyNkZWZpbmUgRk9HX0VYUDInIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMubWFwID8gJyNkZWZpbmUgVVNFX01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZW52TWFwID8gJyNkZWZpbmUgVVNFX0VOVk1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZW52TWFwID8gJyNkZWZpbmUgJyArIGVudk1hcE1vZGVEZWZpbmUgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubGlnaHRNYXAgPyAnI2RlZmluZSBVU0VfTElHSFRNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmFvTWFwID8gJyNkZWZpbmUgVVNFX0FPTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbWlzc2l2ZU1hcCA/ICcjZGVmaW5lIFVTRV9FTUlTU0lWRU1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuYnVtcE1hcCA/ICcjZGVmaW5lIFVTRV9CVU1QTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5ub3JtYWxNYXAgPyAnI2RlZmluZSBVU0VfTk9STUFMTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5kaXNwbGFjZW1lbnRNYXAgJiYgcGFyYW1ldGVycy5zdXBwb3J0c1ZlcnRleFRleHR1cmVzID8gJyNkZWZpbmUgVVNFX0RJU1BMQUNFTUVOVE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuc3BlY3VsYXJNYXAgPyAnI2RlZmluZSBVU0VfU1BFQ1VMQVJNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnJvdWdobmVzc01hcCA/ICcjZGVmaW5lIFVTRV9ST1VHSE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm1ldGFsbmVzc01hcCA/ICcjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmFscGhhTWFwID8gJyNkZWZpbmUgVVNFX0FMUEhBTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy52ZXJ0ZXhDb2xvcnMgPyAnI2RlZmluZSBVU0VfQ09MT1InIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgPyAnI2RlZmluZSBGTEFUX1NIQURFRCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5za2lubmluZyA/ICcjZGVmaW5lIFVTRV9TS0lOTklORycgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMudXNlVmVydGV4VGV4dHVyZSA/ICcjZGVmaW5lIEJPTkVfVEVYVFVSRScgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5tb3JwaFRhcmdldHMgPyAnI2RlZmluZSBVU0VfTU9SUEhUQVJHRVRTJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5tb3JwaE5vcm1hbHMgJiYgcGFyYW1ldGVycy5mbGF0U2hhZGluZyA9PT0gZmFsc2UgPyAnI2RlZmluZSBVU0VfTU9SUEhOT1JNQUxTJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5kb3VibGVTaWRlZCA/ICcjZGVmaW5lIERPVUJMRV9TSURFRCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZmxpcFNpZGVkID8gJyNkZWZpbmUgRkxJUF9TSURFRCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5zaGFkb3dNYXBFbmFibGVkID8gJyNkZWZpbmUgVVNFX1NIQURPV01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lICcgKyBzaGFkb3dNYXBUeXBlRGVmaW5lIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuc2l6ZUF0dGVudWF0aW9uID8gJyNkZWZpbmUgVVNFX1NJWkVBVFRFTlVBVElPTicgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyID8gJyNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICYmIGV4dGVuc2lvbnMuZ2V0KCAnRVhUX2ZyYWdfZGVwdGgnICkgPyAnI2RlZmluZSBVU0VfTE9HREVQVEhCVUZfRVhUJyA6ICcnLFxuXG5cdFx0XHQndW5pZm9ybSBtYXQ0IG1vZGVsTWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSBtYXQ0IG1vZGVsVmlld01hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gbWF0NCBwcm9qZWN0aW9uTWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSBtYXQ0IHZpZXdNYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIG1hdDMgbm9ybWFsTWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOycsXG5cblx0XHRcdCdhdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjsnLFxuXHRcdFx0J2F0dHJpYnV0ZSB2ZWMzIG5vcm1hbDsnLFxuXHRcdFx0J2F0dHJpYnV0ZSB2ZWMyIHV2OycsXG5cblx0XHRcdCcjaWZkZWYgVVNFX0NPTE9SJyxcblxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzMgY29sb3I7JyxcblxuXHRcdFx0JyNlbmRpZicsXG5cblx0XHRcdCcjaWZkZWYgVVNFX01PUlBIVEFSR0VUUycsXG5cblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MDsnLFxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQxOycsXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDI7Jyxcblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MzsnLFxuXG5cdFx0XHQnXHQjaWZkZWYgVVNFX01PUlBITk9STUFMUycsXG5cblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwwOycsXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMTsnLFxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDI7Jyxcblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwzOycsXG5cblx0XHRcdCdcdCNlbHNlJyxcblxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDQ7Jyxcblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ1OycsXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NjsnLFxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDc7JyxcblxuXHRcdFx0J1x0I2VuZGlmJyxcblxuXHRcdFx0JyNlbmRpZicsXG5cblx0XHRcdCcjaWZkZWYgVVNFX1NLSU5OSU5HJyxcblxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzQgc2tpbkluZGV4OycsXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjNCBza2luV2VpZ2h0OycsXG5cblx0XHRcdCcjZW5kaWYnLFxuXG5cdFx0XHQnXFxuJ1xuXG5cdFx0XS5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcXG4nICk7XG5cblx0XHRwcmVmaXhGcmFnbWVudCA9IFtcblxuXHRcdFx0Y3VzdG9tRXh0ZW5zaW9ucyxcblxuXHRcdFx0J3ByZWNpc2lvbiAnICsgcGFyYW1ldGVycy5wcmVjaXNpb24gKyAnIGZsb2F0OycsXG5cdFx0XHQncHJlY2lzaW9uICcgKyBwYXJhbWV0ZXJzLnByZWNpc2lvbiArICcgaW50OycsXG5cblx0XHRcdCcjZGVmaW5lIFNIQURFUl9OQU1FICcgKyBzaGFkZXIubmFtZSxcblxuXHRcdFx0Y3VzdG9tRGVmaW5lcyxcblxuXHRcdFx0cGFyYW1ldGVycy5hbHBoYVRlc3QgPyAnI2RlZmluZSBBTFBIQVRFU1QgJyArIHBhcmFtZXRlcnMuYWxwaGFUZXN0IDogJycsXG5cblx0XHRcdCcjZGVmaW5lIEdBTU1BX0ZBQ1RPUiAnICsgZ2FtbWFGYWN0b3JEZWZpbmUsXG5cblx0XHRcdCggcGFyYW1ldGVycy51c2VGb2cgJiYgcGFyYW1ldGVycy5mb2cgKSA/ICcjZGVmaW5lIFVTRV9GT0cnIDogJycsXG5cdFx0XHQoIHBhcmFtZXRlcnMudXNlRm9nICYmIHBhcmFtZXRlcnMuZm9nRXhwICkgPyAnI2RlZmluZSBGT0dfRVhQMicgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5tYXAgPyAnI2RlZmluZSBVU0VfTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSBVU0VfRU5WTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwVHlwZURlZmluZSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwTW9kZURlZmluZSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwQmxlbmRpbmdEZWZpbmUgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubGlnaHRNYXAgPyAnI2RlZmluZSBVU0VfTElHSFRNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmFvTWFwID8gJyNkZWZpbmUgVVNFX0FPTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbWlzc2l2ZU1hcCA/ICcjZGVmaW5lIFVTRV9FTUlTU0lWRU1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuYnVtcE1hcCA/ICcjZGVmaW5lIFVTRV9CVU1QTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5ub3JtYWxNYXAgPyAnI2RlZmluZSBVU0VfTk9STUFMTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5zcGVjdWxhck1hcCA/ICcjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMucm91Z2huZXNzTWFwID8gJyNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubWV0YWxuZXNzTWFwID8gJyNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuYWxwaGFNYXAgPyAnI2RlZmluZSBVU0VfQUxQSEFNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnZlcnRleENvbG9ycyA/ICcjZGVmaW5lIFVTRV9DT0xPUicgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5ncmFkaWVudE1hcCA/ICcjZGVmaW5lIFVTRV9HUkFESUVOVE1BUCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5mbGF0U2hhZGluZyA/ICcjZGVmaW5lIEZMQVRfU0hBREVEJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmRvdWJsZVNpZGVkID8gJyNkZWZpbmUgRE9VQkxFX1NJREVEJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5mbGlwU2lkZWQgPyAnI2RlZmluZSBGTElQX1NJREVEJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnNoYWRvd01hcEVuYWJsZWQgPyAnI2RlZmluZSBVU0VfU0hBRE9XTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5zaGFkb3dNYXBFbmFibGVkID8gJyNkZWZpbmUgJyArIHNoYWRvd01hcFR5cGVEZWZpbmUgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5wcmVtdWx0aXBsaWVkQWxwaGEgPyAnI2RlZmluZSBQUkVNVUxUSVBMSUVEX0FMUEhBJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzID8gJyNkZWZpbmUgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUUycgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyID8gJyNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICYmIGV4dGVuc2lvbnMuZ2V0KCAnRVhUX2ZyYWdfZGVwdGgnICkgPyAnI2RlZmluZSBVU0VfTE9HREVQVEhCVUZfRVhUJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCAmJiBleHRlbnNpb25zLmdldCggJ0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QnICkgPyAnI2RlZmluZSBURVhUVVJFX0xPRF9FWFQnIDogJycsXG5cblx0XHRcdCd1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gdmVjMyBjYW1lcmFQb3NpdGlvbjsnLFxuXG5cdFx0XHQoIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgIT09IE5vVG9uZU1hcHBpbmcgKSA/ICcjZGVmaW5lIFRPTkVfTUFQUElORycgOiAnJyxcblx0XHRcdCggcGFyYW1ldGVycy50b25lTWFwcGluZyAhPT0gTm9Ub25lTWFwcGluZyApID8gU2hhZGVyQ2h1bmtbICd0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50JyBdIDogJycsIC8vIHRoaXMgY29kZSBpcyByZXF1aXJlZCBoZXJlIGJlY2F1c2UgaXQgaXMgdXNlZCBieSB0aGUgdG9uZU1hcHBpbmcoKSBmdW5jdGlvbiBkZWZpbmVkIGJlbG93XG5cdFx0XHQoIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgIT09IE5vVG9uZU1hcHBpbmcgKSA/IGdldFRvbmVNYXBwaW5nRnVuY3Rpb24oICd0b25lTWFwcGluZycsIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgKSA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmRpdGhlcmluZyA/ICcjZGVmaW5lIERJVEhFUklORycgOiAnJyxcblxuXHRcdFx0KCBwYXJhbWV0ZXJzLm91dHB1dEVuY29kaW5nIHx8IHBhcmFtZXRlcnMubWFwRW5jb2RpbmcgfHwgcGFyYW1ldGVycy5lbnZNYXBFbmNvZGluZyB8fCBwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwRW5jb2RpbmcgKSA/IFNoYWRlckNodW5rWyAnZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQnIF0gOiAnJywgLy8gdGhpcyBjb2RlIGlzIHJlcXVpcmVkIGhlcmUgYmVjYXVzZSBpdCBpcyB1c2VkIGJ5IHRoZSB2YXJpb3VzIGVuY29kaW5nL2RlY29kaW5nIGZ1bmN0aW9uIGRlZmluZWQgYmVsb3dcblx0XHRcdHBhcmFtZXRlcnMubWFwRW5jb2RpbmcgPyBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oICdtYXBUZXhlbFRvTGluZWFyJywgcGFyYW1ldGVycy5tYXBFbmNvZGluZyApIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcEVuY29kaW5nID8gZ2V0VGV4ZWxEZWNvZGluZ0Z1bmN0aW9uKCAnZW52TWFwVGV4ZWxUb0xpbmVhcicsIHBhcmFtZXRlcnMuZW52TWFwRW5jb2RpbmcgKSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbWlzc2l2ZU1hcEVuY29kaW5nID8gZ2V0VGV4ZWxEZWNvZGluZ0Z1bmN0aW9uKCAnZW1pc3NpdmVNYXBUZXhlbFRvTGluZWFyJywgcGFyYW1ldGVycy5lbWlzc2l2ZU1hcEVuY29kaW5nICkgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMub3V0cHV0RW5jb2RpbmcgPyBnZXRUZXhlbEVuY29kaW5nRnVuY3Rpb24oICdsaW5lYXJUb091dHB1dFRleGVsJywgcGFyYW1ldGVycy5vdXRwdXRFbmNvZGluZyApIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZGVwdGhQYWNraW5nID8gJyNkZWZpbmUgREVQVEhfUEFDS0lORyAnICsgbWF0ZXJpYWwuZGVwdGhQYWNraW5nIDogJycsXG5cblx0XHRcdCdcXG4nXG5cblx0XHRdLmZpbHRlciggZmlsdGVyRW1wdHlMaW5lICkuam9pbiggJ1xcbicgKTtcblxuXHR9XG5cblx0dmVydGV4U2hhZGVyID0gcGFyc2VJbmNsdWRlcyggdmVydGV4U2hhZGVyICk7XG5cdHZlcnRleFNoYWRlciA9IHJlcGxhY2VMaWdodE51bXMoIHZlcnRleFNoYWRlciwgcGFyYW1ldGVycyApO1xuXHR2ZXJ0ZXhTaGFkZXIgPSByZXBsYWNlQ2xpcHBpbmdQbGFuZU51bXMoIHZlcnRleFNoYWRlciwgcGFyYW1ldGVycyApO1xuXG5cdGZyYWdtZW50U2hhZGVyID0gcGFyc2VJbmNsdWRlcyggZnJhZ21lbnRTaGFkZXIgKTtcblx0ZnJhZ21lbnRTaGFkZXIgPSByZXBsYWNlTGlnaHROdW1zKCBmcmFnbWVudFNoYWRlciwgcGFyYW1ldGVycyApO1xuXHRmcmFnbWVudFNoYWRlciA9IHJlcGxhY2VDbGlwcGluZ1BsYW5lTnVtcyggZnJhZ21lbnRTaGFkZXIsIHBhcmFtZXRlcnMgKTtcblxuXHR2ZXJ0ZXhTaGFkZXIgPSB1bnJvbGxMb29wcyggdmVydGV4U2hhZGVyICk7XG5cdGZyYWdtZW50U2hhZGVyID0gdW5yb2xsTG9vcHMoIGZyYWdtZW50U2hhZGVyICk7XG5cblx0dmFyIHZlcnRleEdsc2wgPSBwcmVmaXhWZXJ0ZXggKyB2ZXJ0ZXhTaGFkZXI7XG5cdHZhciBmcmFnbWVudEdsc2wgPSBwcmVmaXhGcmFnbWVudCArIGZyYWdtZW50U2hhZGVyO1xuXG5cdC8vIGNvbnNvbGUubG9nKCAnKlZFUlRFWConLCB2ZXJ0ZXhHbHNsICk7XG5cdC8vIGNvbnNvbGUubG9nKCAnKkZSQUdNRU5UKicsIGZyYWdtZW50R2xzbCApO1xuXG5cdHZhciBnbFZlcnRleFNoYWRlciA9IFdlYkdMU2hhZGVyKCBnbCwgZ2wuVkVSVEVYX1NIQURFUiwgdmVydGV4R2xzbCApO1xuXHR2YXIgZ2xGcmFnbWVudFNoYWRlciA9IFdlYkdMU2hhZGVyKCBnbCwgZ2wuRlJBR01FTlRfU0hBREVSLCBmcmFnbWVudEdsc2wgKTtcblxuXHRnbC5hdHRhY2hTaGFkZXIoIHByb2dyYW0sIGdsVmVydGV4U2hhZGVyICk7XG5cdGdsLmF0dGFjaFNoYWRlciggcHJvZ3JhbSwgZ2xGcmFnbWVudFNoYWRlciApO1xuXG5cdC8vIEZvcmNlIGEgcGFydGljdWxhciBhdHRyaWJ1dGUgdG8gaW5kZXggMC5cblxuXHRpZiAoIG1hdGVyaWFsLmluZGV4MEF0dHJpYnV0ZU5hbWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGdsLmJpbmRBdHRyaWJMb2NhdGlvbiggcHJvZ3JhbSwgMCwgbWF0ZXJpYWwuaW5kZXgwQXR0cmlidXRlTmFtZSApO1xuXG5cdH0gZWxzZSBpZiAoIHBhcmFtZXRlcnMubW9ycGhUYXJnZXRzID09PSB0cnVlICkge1xuXG5cdFx0Ly8gcHJvZ3JhbXMgd2l0aCBtb3JwaFRhcmdldHMgZGlzcGxhY2UgcG9zaXRpb24gb3V0IG9mIGF0dHJpYnV0ZSAwXG5cdFx0Z2wuYmluZEF0dHJpYkxvY2F0aW9uKCBwcm9ncmFtLCAwLCAncG9zaXRpb24nICk7XG5cblx0fVxuXG5cdGdsLmxpbmtQcm9ncmFtKCBwcm9ncmFtICk7XG5cblx0dmFyIHByb2dyYW1Mb2cgPSBnbC5nZXRQcm9ncmFtSW5mb0xvZyggcHJvZ3JhbSApLnRyaW0oKTtcblx0dmFyIHZlcnRleExvZyA9IGdsLmdldFNoYWRlckluZm9Mb2coIGdsVmVydGV4U2hhZGVyICkudHJpbSgpO1xuXHR2YXIgZnJhZ21lbnRMb2cgPSBnbC5nZXRTaGFkZXJJbmZvTG9nKCBnbEZyYWdtZW50U2hhZGVyICkudHJpbSgpO1xuXG5cdHZhciBydW5uYWJsZSA9IHRydWU7XG5cdHZhciBoYXZlRGlhZ25vc3RpY3MgPSB0cnVlO1xuXG5cdC8vIGNvbnNvbGUubG9nKCAnKipWRVJURVgqKicsIGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2RlYnVnX3NoYWRlcnMnICkuZ2V0VHJhbnNsYXRlZFNoYWRlclNvdXJjZSggZ2xWZXJ0ZXhTaGFkZXIgKSApO1xuXHQvLyBjb25zb2xlLmxvZyggJyoqRlJBR01FTlQqKicsIGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2RlYnVnX3NoYWRlcnMnICkuZ2V0VHJhbnNsYXRlZFNoYWRlclNvdXJjZSggZ2xGcmFnbWVudFNoYWRlciApICk7XG5cblx0aWYgKCBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCBnbC5MSU5LX1NUQVRVUyApID09PSBmYWxzZSApIHtcblxuXHRcdHJ1bm5hYmxlID0gZmFsc2U7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiBzaGFkZXIgZXJyb3I6ICcsIGdsLmdldEVycm9yKCksICdnbC5WQUxJREFURV9TVEFUVVMnLCBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCBnbC5WQUxJREFURV9TVEFUVVMgKSwgJ2dsLmdldFByb2dyYW1JbmZvTG9nJywgcHJvZ3JhbUxvZywgdmVydGV4TG9nLCBmcmFnbWVudExvZyApO1xuXG5cdH0gZWxzZSBpZiAoIHByb2dyYW1Mb2cgIT09ICcnICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiBnbC5nZXRQcm9ncmFtSW5mb0xvZygpJywgcHJvZ3JhbUxvZyApO1xuXG5cdH0gZWxzZSBpZiAoIHZlcnRleExvZyA9PT0gJycgfHwgZnJhZ21lbnRMb2cgPT09ICcnICkge1xuXG5cdFx0aGF2ZURpYWdub3N0aWNzID0gZmFsc2U7XG5cblx0fVxuXG5cdGlmICggaGF2ZURpYWdub3N0aWNzICkge1xuXG5cdFx0dGhpcy5kaWFnbm9zdGljcyA9IHtcblxuXHRcdFx0cnVubmFibGU6IHJ1bm5hYmxlLFxuXHRcdFx0bWF0ZXJpYWw6IG1hdGVyaWFsLFxuXG5cdFx0XHRwcm9ncmFtTG9nOiBwcm9ncmFtTG9nLFxuXG5cdFx0XHR2ZXJ0ZXhTaGFkZXI6IHtcblxuXHRcdFx0XHRsb2c6IHZlcnRleExvZyxcblx0XHRcdFx0cHJlZml4OiBwcmVmaXhWZXJ0ZXhcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IHtcblxuXHRcdFx0XHRsb2c6IGZyYWdtZW50TG9nLFxuXHRcdFx0XHRwcmVmaXg6IHByZWZpeEZyYWdtZW50XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fVxuXG5cdC8vIGNsZWFuIHVwXG5cblx0Z2wuZGVsZXRlU2hhZGVyKCBnbFZlcnRleFNoYWRlciApO1xuXHRnbC5kZWxldGVTaGFkZXIoIGdsRnJhZ21lbnRTaGFkZXIgKTtcblxuXHQvLyBzZXQgdXAgY2FjaGluZyBmb3IgdW5pZm9ybSBsb2NhdGlvbnNcblxuXHR2YXIgY2FjaGVkVW5pZm9ybXM7XG5cblx0dGhpcy5nZXRVbmlmb3JtcyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggY2FjaGVkVW5pZm9ybXMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y2FjaGVkVW5pZm9ybXMgPSBuZXcgV2ViR0xVbmlmb3JtcyggZ2wsIHByb2dyYW0sIHJlbmRlcmVyICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY2FjaGVkVW5pZm9ybXM7XG5cblx0fTtcblxuXHQvLyBzZXQgdXAgY2FjaGluZyBmb3IgYXR0cmlidXRlIGxvY2F0aW9uc1xuXG5cdHZhciBjYWNoZWRBdHRyaWJ1dGVzO1xuXG5cdHRoaXMuZ2V0QXR0cmlidXRlcyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggY2FjaGVkQXR0cmlidXRlcyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjYWNoZWRBdHRyaWJ1dGVzID0gZmV0Y2hBdHRyaWJ1dGVMb2NhdGlvbnMoIGdsLCBwcm9ncmFtICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY2FjaGVkQXR0cmlidXRlcztcblxuXHR9O1xuXG5cdC8vIGZyZWUgcmVzb3VyY2VcblxuXHR0aGlzLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRnbC5kZWxldGVQcm9ncmFtKCBwcm9ncmFtICk7XG5cdFx0dGhpcy5wcm9ncmFtID0gdW5kZWZpbmVkO1xuXG5cdH07XG5cblx0Ly8gREVQUkVDQVRFRFxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLCB7XG5cblx0XHR1bmlmb3Jtczoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiAudW5pZm9ybXMgaXMgbm93IC5nZXRVbmlmb3JtcygpLicgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0VW5pZm9ybXMoKTtcblxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRhdHRyaWJ1dGVzOiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFByb2dyYW06IC5hdHRyaWJ1dGVzIGlzIG5vdyAuZ2V0QXR0cmlidXRlcygpLicgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpO1xuXG5cdFx0XHR9XG5cdFx0fVxuXG5cdH0gKTtcblxuXG5cdC8vXG5cblx0dGhpcy5uYW1lID0gc2hhZGVyLm5hbWU7XG5cdHRoaXMuaWQgPSBwcm9ncmFtSWRDb3VudCArKztcblx0dGhpcy5jb2RlID0gY29kZTtcblx0dGhpcy51c2VkVGltZXMgPSAxO1xuXHR0aGlzLnByb2dyYW0gPSBwcm9ncmFtO1xuXHR0aGlzLnZlcnRleFNoYWRlciA9IGdsVmVydGV4U2hhZGVyO1xuXHR0aGlzLmZyYWdtZW50U2hhZGVyID0gZ2xGcmFnbWVudFNoYWRlcjtcblxuXHRyZXR1cm4gdGhpcztcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xQcm9ncmFtcyggcmVuZGVyZXIsIGV4dGVuc2lvbnMsIGNhcGFiaWxpdGllcyApIHtcblxuXHR2YXIgcHJvZ3JhbXMgPSBbXTtcblxuXHR2YXIgc2hhZGVySURzID0ge1xuXHRcdE1lc2hEZXB0aE1hdGVyaWFsOiAnZGVwdGgnLFxuXHRcdE1lc2hEaXN0YW5jZU1hdGVyaWFsOiAnZGlzdGFuY2VSR0JBJyxcblx0XHRNZXNoTm9ybWFsTWF0ZXJpYWw6ICdub3JtYWwnLFxuXHRcdE1lc2hCYXNpY01hdGVyaWFsOiAnYmFzaWMnLFxuXHRcdE1lc2hMYW1iZXJ0TWF0ZXJpYWw6ICdsYW1iZXJ0Jyxcblx0XHRNZXNoUGhvbmdNYXRlcmlhbDogJ3Bob25nJyxcblx0XHRNZXNoVG9vbk1hdGVyaWFsOiAncGhvbmcnLFxuXHRcdE1lc2hTdGFuZGFyZE1hdGVyaWFsOiAncGh5c2ljYWwnLFxuXHRcdE1lc2hQaHlzaWNhbE1hdGVyaWFsOiAncGh5c2ljYWwnLFxuXHRcdExpbmVCYXNpY01hdGVyaWFsOiAnYmFzaWMnLFxuXHRcdExpbmVEYXNoZWRNYXRlcmlhbDogJ2Rhc2hlZCcsXG5cdFx0UG9pbnRzTWF0ZXJpYWw6ICdwb2ludHMnLFxuXHRcdFNoYWRvd01hdGVyaWFsOiAnc2hhZG93J1xuXHR9O1xuXG5cdHZhciBwYXJhbWV0ZXJOYW1lcyA9IFtcblx0XHRcInByZWNpc2lvblwiLCBcInN1cHBvcnRzVmVydGV4VGV4dHVyZXNcIiwgXCJtYXBcIiwgXCJtYXBFbmNvZGluZ1wiLCBcImVudk1hcFwiLCBcImVudk1hcE1vZGVcIiwgXCJlbnZNYXBFbmNvZGluZ1wiLFxuXHRcdFwibGlnaHRNYXBcIiwgXCJhb01hcFwiLCBcImVtaXNzaXZlTWFwXCIsIFwiZW1pc3NpdmVNYXBFbmNvZGluZ1wiLCBcImJ1bXBNYXBcIiwgXCJub3JtYWxNYXBcIiwgXCJkaXNwbGFjZW1lbnRNYXBcIiwgXCJzcGVjdWxhck1hcFwiLFxuXHRcdFwicm91Z2huZXNzTWFwXCIsIFwibWV0YWxuZXNzTWFwXCIsIFwiZ3JhZGllbnRNYXBcIixcblx0XHRcImFscGhhTWFwXCIsIFwiY29tYmluZVwiLCBcInZlcnRleENvbG9yc1wiLCBcImZvZ1wiLCBcInVzZUZvZ1wiLCBcImZvZ0V4cFwiLFxuXHRcdFwiZmxhdFNoYWRpbmdcIiwgXCJzaXplQXR0ZW51YXRpb25cIiwgXCJsb2dhcml0aG1pY0RlcHRoQnVmZmVyXCIsIFwic2tpbm5pbmdcIixcblx0XHRcIm1heEJvbmVzXCIsIFwidXNlVmVydGV4VGV4dHVyZVwiLCBcIm1vcnBoVGFyZ2V0c1wiLCBcIm1vcnBoTm9ybWFsc1wiLFxuXHRcdFwibWF4TW9ycGhUYXJnZXRzXCIsIFwibWF4TW9ycGhOb3JtYWxzXCIsIFwicHJlbXVsdGlwbGllZEFscGhhXCIsXG5cdFx0XCJudW1EaXJMaWdodHNcIiwgXCJudW1Qb2ludExpZ2h0c1wiLCBcIm51bVNwb3RMaWdodHNcIiwgXCJudW1IZW1pTGlnaHRzXCIsIFwibnVtUmVjdEFyZWFMaWdodHNcIixcblx0XHRcInNoYWRvd01hcEVuYWJsZWRcIiwgXCJzaGFkb3dNYXBUeXBlXCIsIFwidG9uZU1hcHBpbmdcIiwgJ3BoeXNpY2FsbHlDb3JyZWN0TGlnaHRzJyxcblx0XHRcImFscGhhVGVzdFwiLCBcImRvdWJsZVNpZGVkXCIsIFwiZmxpcFNpZGVkXCIsIFwibnVtQ2xpcHBpbmdQbGFuZXNcIiwgXCJudW1DbGlwSW50ZXJzZWN0aW9uXCIsIFwiZGVwdGhQYWNraW5nXCIsIFwiZGl0aGVyaW5nXCJcblx0XTtcblxuXG5cdGZ1bmN0aW9uIGFsbG9jYXRlQm9uZXMoIG9iamVjdCApIHtcblxuXHRcdHZhciBza2VsZXRvbiA9IG9iamVjdC5za2VsZXRvbjtcblx0XHR2YXIgYm9uZXMgPSBza2VsZXRvbi5ib25lcztcblxuXHRcdGlmICggY2FwYWJpbGl0aWVzLmZsb2F0VmVydGV4VGV4dHVyZXMgKSB7XG5cblx0XHRcdHJldHVybiAxMDI0O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gZGVmYXVsdCBmb3Igd2hlbiBvYmplY3QgaXMgbm90IHNwZWNpZmllZFxuXHRcdFx0Ly8gKCBmb3IgZXhhbXBsZSB3aGVuIHByZWJ1aWxkaW5nIHNoYWRlciB0byBiZSB1c2VkIHdpdGggbXVsdGlwbGUgb2JqZWN0cyApXG5cdFx0XHQvL1xuXHRcdFx0Ly8gIC0gbGVhdmUgc29tZSBleHRyYSBzcGFjZSBmb3Igb3RoZXIgdW5pZm9ybXNcblx0XHRcdC8vICAtIGxpbWl0IGhlcmUgaXMgQU5HTEUncyAyNTQgbWF4IHVuaWZvcm0gdmVjdG9yc1xuXHRcdFx0Ly8gICAgKHVwIHRvIDU0IHNob3VsZCBiZSBzYWZlKVxuXG5cdFx0XHR2YXIgblZlcnRleFVuaWZvcm1zID0gY2FwYWJpbGl0aWVzLm1heFZlcnRleFVuaWZvcm1zO1xuXHRcdFx0dmFyIG5WZXJ0ZXhNYXRyaWNlcyA9IE1hdGguZmxvb3IoICggblZlcnRleFVuaWZvcm1zIC0gMjAgKSAvIDQgKTtcblxuXHRcdFx0dmFyIG1heEJvbmVzID0gTWF0aC5taW4oIG5WZXJ0ZXhNYXRyaWNlcywgYm9uZXMubGVuZ3RoICk7XG5cblx0XHRcdGlmICggbWF4Qm9uZXMgPCBib25lcy5sZW5ndGggKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogU2tlbGV0b24gaGFzICcgKyBib25lcy5sZW5ndGggKyAnIGJvbmVzLiBUaGlzIEdQVSBzdXBwb3J0cyAnICsgbWF4Qm9uZXMgKyAnLicgKTtcblx0XHRcdFx0cmV0dXJuIDA7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG1heEJvbmVzO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCBtYXAsIGdhbW1hT3ZlcnJpZGVMaW5lYXIgKSB7XG5cblx0XHR2YXIgZW5jb2Rpbmc7XG5cblx0XHRpZiAoICEgbWFwICkge1xuXG5cdFx0XHRlbmNvZGluZyA9IExpbmVhckVuY29kaW5nO1xuXG5cdFx0fSBlbHNlIGlmICggbWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZW5jb2RpbmcgPSBtYXAuZW5jb2Rpbmc7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXAuaXNXZWJHTFJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLldlYkdMUHJvZ3JhbXMuZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcDogZG9uJ3QgdXNlIHJlbmRlciB0YXJnZXRzIGFzIHRleHR1cmVzLiBVc2UgdGhlaXIgLnRleHR1cmUgcHJvcGVydHkgaW5zdGVhZC5cIiApO1xuXHRcdFx0ZW5jb2RpbmcgPSBtYXAudGV4dHVyZS5lbmNvZGluZztcblxuXHRcdH1cblxuXHRcdC8vIGFkZCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgV2ViR0xSZW5kZXJlci5nYW1tYUlucHV0L2dhbW1hT3V0cHV0IHBhcmFtZXRlciwgc2hvdWxkIHByb2JhYmx5IGJlIHJlbW92ZWQgYXQgc29tZSBwb2ludC5cblx0XHRpZiAoIGVuY29kaW5nID09PSBMaW5lYXJFbmNvZGluZyAmJiBnYW1tYU92ZXJyaWRlTGluZWFyICkge1xuXG5cdFx0XHRlbmNvZGluZyA9IEdhbW1hRW5jb2Rpbmc7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZW5jb2Rpbmc7XG5cblx0fVxuXG5cdHRoaXMuZ2V0UGFyYW1ldGVycyA9IGZ1bmN0aW9uICggbWF0ZXJpYWwsIGxpZ2h0cywgc2hhZG93cywgZm9nLCBuQ2xpcFBsYW5lcywgbkNsaXBJbnRlcnNlY3Rpb24sIG9iamVjdCApIHtcblxuXHRcdHZhciBzaGFkZXJJRCA9IHNoYWRlcklEc1sgbWF0ZXJpYWwudHlwZSBdO1xuXG5cdFx0Ly8gaGV1cmlzdGljcyB0byBjcmVhdGUgc2hhZGVyIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIGxpZ2h0cyBpbiB0aGUgc2NlbmVcblx0XHQvLyAobm90IHRvIGJsb3cgb3ZlciBtYXhMaWdodHMgYnVkZ2V0KVxuXG5cdFx0dmFyIG1heEJvbmVzID0gb2JqZWN0LmlzU2tpbm5lZE1lc2ggPyBhbGxvY2F0ZUJvbmVzKCBvYmplY3QgKSA6IDA7XG5cdFx0dmFyIHByZWNpc2lvbiA9IGNhcGFiaWxpdGllcy5wcmVjaXNpb247XG5cblx0XHRpZiAoIG1hdGVyaWFsLnByZWNpc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0cHJlY2lzaW9uID0gY2FwYWJpbGl0aWVzLmdldE1heFByZWNpc2lvbiggbWF0ZXJpYWwucHJlY2lzaW9uICk7XG5cblx0XHRcdGlmICggcHJlY2lzaW9uICE9PSBtYXRlcmlhbC5wcmVjaXNpb24gKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtLmdldFBhcmFtZXRlcnM6JywgbWF0ZXJpYWwucHJlY2lzaW9uLCAnbm90IHN1cHBvcnRlZCwgdXNpbmcnLCBwcmVjaXNpb24sICdpbnN0ZWFkLicgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGN1cnJlbnRSZW5kZXJUYXJnZXQgPSByZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcblxuXHRcdHZhciBwYXJhbWV0ZXJzID0ge1xuXG5cdFx0XHRzaGFkZXJJRDogc2hhZGVySUQsXG5cblx0XHRcdHByZWNpc2lvbjogcHJlY2lzaW9uLFxuXHRcdFx0c3VwcG9ydHNWZXJ0ZXhUZXh0dXJlczogY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzLFxuXHRcdFx0b3V0cHV0RW5jb2Rpbmc6IGdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAoICggISBjdXJyZW50UmVuZGVyVGFyZ2V0ICkgPyBudWxsIDogY3VycmVudFJlbmRlclRhcmdldC50ZXh0dXJlLCByZW5kZXJlci5nYW1tYU91dHB1dCApLFxuXHRcdFx0bWFwOiAhISBtYXRlcmlhbC5tYXAsXG5cdFx0XHRtYXBFbmNvZGluZzogZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggbWF0ZXJpYWwubWFwLCByZW5kZXJlci5nYW1tYUlucHV0ICksXG5cdFx0XHRlbnZNYXA6ICEhIG1hdGVyaWFsLmVudk1hcCxcblx0XHRcdGVudk1hcE1vZGU6IG1hdGVyaWFsLmVudk1hcCAmJiBtYXRlcmlhbC5lbnZNYXAubWFwcGluZyxcblx0XHRcdGVudk1hcEVuY29kaW5nOiBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCBtYXRlcmlhbC5lbnZNYXAsIHJlbmRlcmVyLmdhbW1hSW5wdXQgKSxcblx0XHRcdGVudk1hcEN1YmVVVjogKCAhISBtYXRlcmlhbC5lbnZNYXAgKSAmJiAoICggbWF0ZXJpYWwuZW52TWFwLm1hcHBpbmcgPT09IEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nICkgfHwgKCBtYXRlcmlhbC5lbnZNYXAubWFwcGluZyA9PT0gQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmcgKSApLFxuXHRcdFx0bGlnaHRNYXA6ICEhIG1hdGVyaWFsLmxpZ2h0TWFwLFxuXHRcdFx0YW9NYXA6ICEhIG1hdGVyaWFsLmFvTWFwLFxuXHRcdFx0ZW1pc3NpdmVNYXA6ICEhIG1hdGVyaWFsLmVtaXNzaXZlTWFwLFxuXHRcdFx0ZW1pc3NpdmVNYXBFbmNvZGluZzogZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggbWF0ZXJpYWwuZW1pc3NpdmVNYXAsIHJlbmRlcmVyLmdhbW1hSW5wdXQgKSxcblx0XHRcdGJ1bXBNYXA6ICEhIG1hdGVyaWFsLmJ1bXBNYXAsXG5cdFx0XHRub3JtYWxNYXA6ICEhIG1hdGVyaWFsLm5vcm1hbE1hcCxcblx0XHRcdGRpc3BsYWNlbWVudE1hcDogISEgbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwLFxuXHRcdFx0cm91Z2huZXNzTWFwOiAhISBtYXRlcmlhbC5yb3VnaG5lc3NNYXAsXG5cdFx0XHRtZXRhbG5lc3NNYXA6ICEhIG1hdGVyaWFsLm1ldGFsbmVzc01hcCxcblx0XHRcdHNwZWN1bGFyTWFwOiAhISBtYXRlcmlhbC5zcGVjdWxhck1hcCxcblx0XHRcdGFscGhhTWFwOiAhISBtYXRlcmlhbC5hbHBoYU1hcCxcblxuXHRcdFx0Z3JhZGllbnRNYXA6ICEhIG1hdGVyaWFsLmdyYWRpZW50TWFwLFxuXG5cdFx0XHRjb21iaW5lOiBtYXRlcmlhbC5jb21iaW5lLFxuXG5cdFx0XHR2ZXJ0ZXhDb2xvcnM6IG1hdGVyaWFsLnZlcnRleENvbG9ycyxcblxuXHRcdFx0Zm9nOiAhISBmb2csXG5cdFx0XHR1c2VGb2c6IG1hdGVyaWFsLmZvZyxcblx0XHRcdGZvZ0V4cDogKCBmb2cgJiYgZm9nLmlzRm9nRXhwMiApLFxuXG5cdFx0XHRmbGF0U2hhZGluZzogbWF0ZXJpYWwuZmxhdFNoYWRpbmcsXG5cblx0XHRcdHNpemVBdHRlbnVhdGlvbjogbWF0ZXJpYWwuc2l6ZUF0dGVudWF0aW9uLFxuXHRcdFx0bG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjogY2FwYWJpbGl0aWVzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIsXG5cblx0XHRcdHNraW5uaW5nOiBtYXRlcmlhbC5za2lubmluZyAmJiBtYXhCb25lcyA+IDAsXG5cdFx0XHRtYXhCb25lczogbWF4Qm9uZXMsXG5cdFx0XHR1c2VWZXJ0ZXhUZXh0dXJlOiBjYXBhYmlsaXRpZXMuZmxvYXRWZXJ0ZXhUZXh0dXJlcyxcblxuXHRcdFx0bW9ycGhUYXJnZXRzOiBtYXRlcmlhbC5tb3JwaFRhcmdldHMsXG5cdFx0XHRtb3JwaE5vcm1hbHM6IG1hdGVyaWFsLm1vcnBoTm9ybWFscyxcblx0XHRcdG1heE1vcnBoVGFyZ2V0czogcmVuZGVyZXIubWF4TW9ycGhUYXJnZXRzLFxuXHRcdFx0bWF4TW9ycGhOb3JtYWxzOiByZW5kZXJlci5tYXhNb3JwaE5vcm1hbHMsXG5cblx0XHRcdG51bURpckxpZ2h0czogbGlnaHRzLmRpcmVjdGlvbmFsLmxlbmd0aCxcblx0XHRcdG51bVBvaW50TGlnaHRzOiBsaWdodHMucG9pbnQubGVuZ3RoLFxuXHRcdFx0bnVtU3BvdExpZ2h0czogbGlnaHRzLnNwb3QubGVuZ3RoLFxuXHRcdFx0bnVtUmVjdEFyZWFMaWdodHM6IGxpZ2h0cy5yZWN0QXJlYS5sZW5ndGgsXG5cdFx0XHRudW1IZW1pTGlnaHRzOiBsaWdodHMuaGVtaS5sZW5ndGgsXG5cblx0XHRcdG51bUNsaXBwaW5nUGxhbmVzOiBuQ2xpcFBsYW5lcyxcblx0XHRcdG51bUNsaXBJbnRlcnNlY3Rpb246IG5DbGlwSW50ZXJzZWN0aW9uLFxuXG5cdFx0XHRkaXRoZXJpbmc6IG1hdGVyaWFsLmRpdGhlcmluZyxcblxuXHRcdFx0c2hhZG93TWFwRW5hYmxlZDogcmVuZGVyZXIuc2hhZG93TWFwLmVuYWJsZWQgJiYgb2JqZWN0LnJlY2VpdmVTaGFkb3cgJiYgc2hhZG93cy5sZW5ndGggPiAwLFxuXHRcdFx0c2hhZG93TWFwVHlwZTogcmVuZGVyZXIuc2hhZG93TWFwLnR5cGUsXG5cblx0XHRcdHRvbmVNYXBwaW5nOiByZW5kZXJlci50b25lTWFwcGluZyxcblx0XHRcdHBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzOiByZW5kZXJlci5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyxcblxuXHRcdFx0cHJlbXVsdGlwbGllZEFscGhhOiBtYXRlcmlhbC5wcmVtdWx0aXBsaWVkQWxwaGEsXG5cblx0XHRcdGFscGhhVGVzdDogbWF0ZXJpYWwuYWxwaGFUZXN0LFxuXHRcdFx0ZG91YmxlU2lkZWQ6IG1hdGVyaWFsLnNpZGUgPT09IERvdWJsZVNpZGUsXG5cdFx0XHRmbGlwU2lkZWQ6IG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlLFxuXG5cdFx0XHRkZXB0aFBhY2tpbmc6ICggbWF0ZXJpYWwuZGVwdGhQYWNraW5nICE9PSB1bmRlZmluZWQgKSA/IG1hdGVyaWFsLmRlcHRoUGFja2luZyA6IGZhbHNlXG5cblx0XHR9O1xuXG5cdFx0cmV0dXJuIHBhcmFtZXRlcnM7XG5cblx0fTtcblxuXHR0aGlzLmdldFByb2dyYW1Db2RlID0gZnVuY3Rpb24gKCBtYXRlcmlhbCwgcGFyYW1ldGVycyApIHtcblxuXHRcdHZhciBhcnJheSA9IFtdO1xuXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLnNoYWRlcklEICkge1xuXG5cdFx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLnNoYWRlcklEICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRhcnJheS5wdXNoKCBtYXRlcmlhbC5mcmFnbWVudFNoYWRlciApO1xuXHRcdFx0YXJyYXkucHVzaCggbWF0ZXJpYWwudmVydGV4U2hhZGVyICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmRlZmluZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Zm9yICggdmFyIG5hbWUgaW4gbWF0ZXJpYWwuZGVmaW5lcyApIHtcblxuXHRcdFx0XHRhcnJheS5wdXNoKCBuYW1lICk7XG5cdFx0XHRcdGFycmF5LnB1c2goIG1hdGVyaWFsLmRlZmluZXNbIG5hbWUgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBwYXJhbWV0ZXJOYW1lcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnNbIHBhcmFtZXRlck5hbWVzWyBpIF0gXSApO1xuXG5cdFx0fVxuXG5cdFx0YXJyYXkucHVzaCggbWF0ZXJpYWwub25CZWZvcmVDb21waWxlLnRvU3RyaW5nKCkgKTtcblxuXHRcdGFycmF5LnB1c2goIHJlbmRlcmVyLmdhbW1hT3V0cHV0ICk7XG5cblx0XHRyZXR1cm4gYXJyYXkuam9pbigpO1xuXG5cdH07XG5cblx0dGhpcy5hY3F1aXJlUHJvZ3JhbSA9IGZ1bmN0aW9uICggbWF0ZXJpYWwsIHNoYWRlciwgcGFyYW1ldGVycywgY29kZSApIHtcblxuXHRcdHZhciBwcm9ncmFtO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgY29kZSBoYXMgYmVlbiBhbHJlYWR5IGNvbXBpbGVkXG5cdFx0Zm9yICggdmFyIHAgPSAwLCBwbCA9IHByb2dyYW1zLmxlbmd0aDsgcCA8IHBsOyBwICsrICkge1xuXG5cdFx0XHR2YXIgcHJvZ3JhbUluZm8gPSBwcm9ncmFtc1sgcCBdO1xuXG5cdFx0XHRpZiAoIHByb2dyYW1JbmZvLmNvZGUgPT09IGNvZGUgKSB7XG5cblx0XHRcdFx0cHJvZ3JhbSA9IHByb2dyYW1JbmZvO1xuXHRcdFx0XHQrKyBwcm9ncmFtLnVzZWRUaW1lcztcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBwcm9ncmFtID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHByb2dyYW0gPSBuZXcgV2ViR0xQcm9ncmFtKCByZW5kZXJlciwgZXh0ZW5zaW9ucywgY29kZSwgbWF0ZXJpYWwsIHNoYWRlciwgcGFyYW1ldGVycyApO1xuXHRcdFx0cHJvZ3JhbXMucHVzaCggcHJvZ3JhbSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByb2dyYW07XG5cblx0fTtcblxuXHR0aGlzLnJlbGVhc2VQcm9ncmFtID0gZnVuY3Rpb24gKCBwcm9ncmFtICkge1xuXG5cdFx0aWYgKCAtLSBwcm9ncmFtLnVzZWRUaW1lcyA9PT0gMCApIHtcblxuXHRcdFx0Ly8gUmVtb3ZlIGZyb20gdW5vcmRlcmVkIHNldFxuXHRcdFx0dmFyIGkgPSBwcm9ncmFtcy5pbmRleE9mKCBwcm9ncmFtICk7XG5cdFx0XHRwcm9ncmFtc1sgaSBdID0gcHJvZ3JhbXNbIHByb2dyYW1zLmxlbmd0aCAtIDEgXTtcblx0XHRcdHByb2dyYW1zLnBvcCgpO1xuXG5cdFx0XHQvLyBGcmVlIFdlYkdMIHJlc291cmNlc1xuXHRcdFx0cHJvZ3JhbS5kZXN0cm95KCk7XG5cblx0XHR9XG5cblx0fTtcblxuXHQvLyBFeHBvc2VkIGZvciByZXNvdXJjZSBtb25pdG9yaW5nICYgZXJyb3IgZmVlZGJhY2sgdmlhIHJlbmRlcmVyLmluZm86XG5cdHRoaXMucHJvZ3JhbXMgPSBwcm9ncmFtcztcblxufVxuXG4vKipcbiAqIEBhdXRob3IgZm9yZGFjaW91cyAvIGZvcmRhY2lvdXMuZ2l0aHViLmlvXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xQcm9wZXJ0aWVzKCkge1xuXG5cdHZhciBwcm9wZXJ0aWVzID0gbmV3IFdlYWtNYXAoKTtcblxuXHRmdW5jdGlvbiBnZXQoIG9iamVjdCApIHtcblxuXHRcdHZhciBtYXAgPSBwcm9wZXJ0aWVzLmdldCggb2JqZWN0ICk7XG5cblx0XHRpZiAoIG1hcCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRtYXAgPSB7fTtcblx0XHRcdHByb3BlcnRpZXMuc2V0KCBvYmplY3QsIG1hcCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hcDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVtb3ZlKCBvYmplY3QgKSB7XG5cblx0XHRwcm9wZXJ0aWVzLmRlbGV0ZSggb2JqZWN0ICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZSggb2JqZWN0LCBrZXksIHZhbHVlICkge1xuXG5cdFx0cHJvcGVydGllcy5nZXQoIG9iamVjdCApWyBrZXkgXSA9IHZhbHVlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNwb3NlKCkge1xuXG5cdFx0cHJvcGVydGllcyA9IG5ldyBXZWFrTWFwKCk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0Z2V0OiBnZXQsXG5cdFx0cmVtb3ZlOiByZW1vdmUsXG5cdFx0dXBkYXRlOiB1cGRhdGUsXG5cdFx0ZGlzcG9zZTogZGlzcG9zZVxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBwYWludGVyU29ydFN0YWJsZSggYSwgYiApIHtcblxuXHRpZiAoIGEucmVuZGVyT3JkZXIgIT09IGIucmVuZGVyT3JkZXIgKSB7XG5cblx0XHRyZXR1cm4gYS5yZW5kZXJPcmRlciAtIGIucmVuZGVyT3JkZXI7XG5cblx0fSBlbHNlIGlmICggYS5wcm9ncmFtICYmIGIucHJvZ3JhbSAmJiBhLnByb2dyYW0gIT09IGIucHJvZ3JhbSApIHtcblxuXHRcdHJldHVybiBhLnByb2dyYW0uaWQgLSBiLnByb2dyYW0uaWQ7XG5cblx0fSBlbHNlIGlmICggYS5tYXRlcmlhbC5pZCAhPT0gYi5tYXRlcmlhbC5pZCApIHtcblxuXHRcdHJldHVybiBhLm1hdGVyaWFsLmlkIC0gYi5tYXRlcmlhbC5pZDtcblxuXHR9IGVsc2UgaWYgKCBhLnogIT09IGIueiApIHtcblxuXHRcdHJldHVybiBhLnogLSBiLno7XG5cblx0fSBlbHNlIHtcblxuXHRcdHJldHVybiBhLmlkIC0gYi5pZDtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gcmV2ZXJzZVBhaW50ZXJTb3J0U3RhYmxlKCBhLCBiICkge1xuXG5cdGlmICggYS5yZW5kZXJPcmRlciAhPT0gYi5yZW5kZXJPcmRlciApIHtcblxuXHRcdHJldHVybiBhLnJlbmRlck9yZGVyIC0gYi5yZW5kZXJPcmRlcjtcblxuXHR9IGlmICggYS56ICE9PSBiLnogKSB7XG5cblx0XHRyZXR1cm4gYi56IC0gYS56O1xuXG5cdH0gZWxzZSB7XG5cblx0XHRyZXR1cm4gYS5pZCAtIGIuaWQ7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIFdlYkdMUmVuZGVyTGlzdCgpIHtcblxuXHR2YXIgcmVuZGVySXRlbXMgPSBbXTtcblx0dmFyIHJlbmRlckl0ZW1zSW5kZXggPSAwO1xuXG5cdHZhciBvcGFxdWUgPSBbXTtcblx0dmFyIHRyYW5zcGFyZW50ID0gW107XG5cblx0ZnVuY3Rpb24gaW5pdCgpIHtcblxuXHRcdHJlbmRlckl0ZW1zSW5kZXggPSAwO1xuXG5cdFx0b3BhcXVlLmxlbmd0aCA9IDA7XG5cdFx0dHJhbnNwYXJlbnQubGVuZ3RoID0gMDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHosIGdyb3VwICkge1xuXG5cdFx0dmFyIHJlbmRlckl0ZW0gPSByZW5kZXJJdGVtc1sgcmVuZGVySXRlbXNJbmRleCBdO1xuXG5cdFx0aWYgKCByZW5kZXJJdGVtID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHJlbmRlckl0ZW0gPSB7XG5cdFx0XHRcdGlkOiBvYmplY3QuaWQsXG5cdFx0XHRcdG9iamVjdDogb2JqZWN0LFxuXHRcdFx0XHRnZW9tZXRyeTogZ2VvbWV0cnksXG5cdFx0XHRcdG1hdGVyaWFsOiBtYXRlcmlhbCxcblx0XHRcdFx0cHJvZ3JhbTogbWF0ZXJpYWwucHJvZ3JhbSxcblx0XHRcdFx0cmVuZGVyT3JkZXI6IG9iamVjdC5yZW5kZXJPcmRlcixcblx0XHRcdFx0ejogeixcblx0XHRcdFx0Z3JvdXA6IGdyb3VwXG5cdFx0XHR9O1xuXG5cdFx0XHRyZW5kZXJJdGVtc1sgcmVuZGVySXRlbXNJbmRleCBdID0gcmVuZGVySXRlbTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJlbmRlckl0ZW0uaWQgPSBvYmplY3QuaWQ7XG5cdFx0XHRyZW5kZXJJdGVtLm9iamVjdCA9IG9iamVjdDtcblx0XHRcdHJlbmRlckl0ZW0uZ2VvbWV0cnkgPSBnZW9tZXRyeTtcblx0XHRcdHJlbmRlckl0ZW0ubWF0ZXJpYWwgPSBtYXRlcmlhbDtcblx0XHRcdHJlbmRlckl0ZW0ucHJvZ3JhbSA9IG1hdGVyaWFsLnByb2dyYW07XG5cdFx0XHRyZW5kZXJJdGVtLnJlbmRlck9yZGVyID0gb2JqZWN0LnJlbmRlck9yZGVyO1xuXHRcdFx0cmVuZGVySXRlbS56ID0gejtcblx0XHRcdHJlbmRlckl0ZW0uZ3JvdXAgPSBncm91cDtcblxuXHRcdH1cblxuXHRcdCggbWF0ZXJpYWwudHJhbnNwYXJlbnQgPT09IHRydWUgPyB0cmFuc3BhcmVudCA6IG9wYXF1ZSApLnB1c2goIHJlbmRlckl0ZW0gKTtcblxuXHRcdHJlbmRlckl0ZW1zSW5kZXggKys7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNvcnQoKSB7XG5cblx0XHRpZiAoIG9wYXF1ZS5sZW5ndGggPiAxICkgb3BhcXVlLnNvcnQoIHBhaW50ZXJTb3J0U3RhYmxlICk7XG5cdFx0aWYgKCB0cmFuc3BhcmVudC5sZW5ndGggPiAxICkgdHJhbnNwYXJlbnQuc29ydCggcmV2ZXJzZVBhaW50ZXJTb3J0U3RhYmxlICk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0b3BhcXVlOiBvcGFxdWUsXG5cdFx0dHJhbnNwYXJlbnQ6IHRyYW5zcGFyZW50LFxuXG5cdFx0aW5pdDogaW5pdCxcblx0XHRwdXNoOiBwdXNoLFxuXG5cdFx0c29ydDogc29ydFxuXHR9O1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMUmVuZGVyTGlzdHMoKSB7XG5cblx0dmFyIGxpc3RzID0ge307XG5cblx0ZnVuY3Rpb24gZ2V0KCBzY2VuZSwgY2FtZXJhICkge1xuXG5cdFx0dmFyIGhhc2ggPSBzY2VuZS5pZCArICcsJyArIGNhbWVyYS5pZDtcblx0XHR2YXIgbGlzdCA9IGxpc3RzWyBoYXNoIF07XG5cblx0XHRpZiAoIGxpc3QgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gY29uc29sZS5sb2coICdUSFJFRS5XZWJHTFJlbmRlckxpc3RzOicsIGhhc2ggKTtcblxuXHRcdFx0bGlzdCA9IG5ldyBXZWJHTFJlbmRlckxpc3QoKTtcblx0XHRcdGxpc3RzWyBoYXNoIF0gPSBsaXN0O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGxpc3Q7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG5cblx0XHRsaXN0cyA9IHt9O1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGdldDogZ2V0LFxuXHRcdGRpc3Bvc2U6IGRpc3Bvc2Vcblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gVW5pZm9ybXNDYWNoZSgpIHtcblxuXHR2YXIgbGlnaHRzID0ge307XG5cblx0cmV0dXJuIHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCBsaWdodCApIHtcblxuXHRcdFx0aWYgKCBsaWdodHNbIGxpZ2h0LmlkIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gbGlnaHRzWyBsaWdodC5pZCBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciB1bmlmb3JtcztcblxuXHRcdFx0c3dpdGNoICggbGlnaHQudHlwZSApIHtcblxuXHRcdFx0XHRjYXNlICdEaXJlY3Rpb25hbExpZ2h0Jzpcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogbmV3IFZlY3RvcjMoKSxcblx0XHRcdFx0XHRcdGNvbG9yOiBuZXcgQ29sb3IoKSxcblxuXHRcdFx0XHRcdFx0c2hhZG93OiBmYWxzZSxcblx0XHRcdFx0XHRcdHNoYWRvd0JpYXM6IDAsXG5cdFx0XHRcdFx0XHRzaGFkb3dSYWRpdXM6IDEsXG5cdFx0XHRcdFx0XHRzaGFkb3dNYXBTaXplOiBuZXcgVmVjdG9yMigpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdTcG90TGlnaHQnOlxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0XHRcdFx0cG9zaXRpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRjb2xvcjogbmV3IENvbG9yKCksXG5cdFx0XHRcdFx0XHRkaXN0YW5jZTogMCxcblx0XHRcdFx0XHRcdGNvbmVDb3M6IDAsXG5cdFx0XHRcdFx0XHRwZW51bWJyYUNvczogMCxcblx0XHRcdFx0XHRcdGRlY2F5OiAwLFxuXG5cdFx0XHRcdFx0XHRzaGFkb3c6IGZhbHNlLFxuXHRcdFx0XHRcdFx0c2hhZG93QmlhczogMCxcblx0XHRcdFx0XHRcdHNoYWRvd1JhZGl1czogMSxcblx0XHRcdFx0XHRcdHNoYWRvd01hcFNpemU6IG5ldyBWZWN0b3IyKClcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1BvaW50TGlnaHQnOlxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0XHRcdFx0cG9zaXRpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRjb2xvcjogbmV3IENvbG9yKCksXG5cdFx0XHRcdFx0XHRkaXN0YW5jZTogMCxcblx0XHRcdFx0XHRcdGRlY2F5OiAwLFxuXG5cdFx0XHRcdFx0XHRzaGFkb3c6IGZhbHNlLFxuXHRcdFx0XHRcdFx0c2hhZG93QmlhczogMCxcblx0XHRcdFx0XHRcdHNoYWRvd1JhZGl1czogMSxcblx0XHRcdFx0XHRcdHNoYWRvd01hcFNpemU6IG5ldyBWZWN0b3IyKCksXG5cdFx0XHRcdFx0XHRzaGFkb3dDYW1lcmFOZWFyOiAxLFxuXHRcdFx0XHRcdFx0c2hhZG93Q2FtZXJhRmFyOiAxMDAwXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdIZW1pc3BoZXJlTGlnaHQnOlxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0c2t5Q29sb3I6IG5ldyBDb2xvcigpLFxuXHRcdFx0XHRcdFx0Z3JvdW5kQ29sb3I6IG5ldyBDb2xvcigpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdSZWN0QXJlYUxpZ2h0Jzpcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdFx0XHRcdGNvbG9yOiBuZXcgQ29sb3IoKSxcblx0XHRcdFx0XHRcdHBvc2l0aW9uOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0aGFsZldpZHRoOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0aGFsZkhlaWdodDogbmV3IFZlY3RvcjMoKVxuXHRcdFx0XHRcdFx0Ly8gVE9ETyAoYWJlbG5hdGlvbik6IHNldCBSZWN0QXJlYUxpZ2h0IHNoYWRvdyB1bmlmb3Jtc1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdFx0bGlnaHRzWyBsaWdodC5pZCBdID0gdW5pZm9ybXM7XG5cblx0XHRcdHJldHVybiB1bmlmb3JtcztcblxuXHRcdH1cblxuXHR9O1xuXG59XG5cbnZhciBjb3VudCA9IDA7XG5cbmZ1bmN0aW9uIFdlYkdMTGlnaHRzKCkge1xuXG5cdHZhciBjYWNoZSA9IG5ldyBVbmlmb3Jtc0NhY2hlKCk7XG5cblx0dmFyIHN0YXRlID0ge1xuXG5cdFx0aWQ6IGNvdW50ICsrLFxuXG5cdFx0aGFzaDogJycsXG5cblx0XHRhbWJpZW50OiBbIDAsIDAsIDAgXSxcblx0XHRkaXJlY3Rpb25hbDogW10sXG5cdFx0ZGlyZWN0aW9uYWxTaGFkb3dNYXA6IFtdLFxuXHRcdGRpcmVjdGlvbmFsU2hhZG93TWF0cml4OiBbXSxcblx0XHRzcG90OiBbXSxcblx0XHRzcG90U2hhZG93TWFwOiBbXSxcblx0XHRzcG90U2hhZG93TWF0cml4OiBbXSxcblx0XHRyZWN0QXJlYTogW10sXG5cdFx0cG9pbnQ6IFtdLFxuXHRcdHBvaW50U2hhZG93TWFwOiBbXSxcblx0XHRwb2ludFNoYWRvd01hdHJpeDogW10sXG5cdFx0aGVtaTogW11cblxuXHR9O1xuXG5cdHZhciB2ZWN0b3IzID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIG1hdHJpeDQgPSBuZXcgTWF0cml4NCgpO1xuXHR2YXIgbWF0cml4NDIgPSBuZXcgTWF0cml4NCgpO1xuXG5cdGZ1bmN0aW9uIHNldHVwKCBsaWdodHMsIHNoYWRvd3MsIGNhbWVyYSApIHtcblxuXHRcdHZhciByID0gMCwgZyA9IDAsIGIgPSAwO1xuXG5cdFx0dmFyIGRpcmVjdGlvbmFsTGVuZ3RoID0gMDtcblx0XHR2YXIgcG9pbnRMZW5ndGggPSAwO1xuXHRcdHZhciBzcG90TGVuZ3RoID0gMDtcblx0XHR2YXIgcmVjdEFyZWFMZW5ndGggPSAwO1xuXHRcdHZhciBoZW1pTGVuZ3RoID0gMDtcblxuXHRcdHZhciB2aWV3TWF0cml4ID0gY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGxpZ2h0cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgbGlnaHQgPSBsaWdodHNbIGkgXTtcblxuXHRcdFx0dmFyIGNvbG9yID0gbGlnaHQuY29sb3I7XG5cdFx0XHR2YXIgaW50ZW5zaXR5ID0gbGlnaHQuaW50ZW5zaXR5O1xuXHRcdFx0dmFyIGRpc3RhbmNlID0gbGlnaHQuZGlzdGFuY2U7XG5cblx0XHRcdHZhciBzaGFkb3dNYXAgPSAoIGxpZ2h0LnNoYWRvdyAmJiBsaWdodC5zaGFkb3cubWFwICkgPyBsaWdodC5zaGFkb3cubWFwLnRleHR1cmUgOiBudWxsO1xuXG5cdFx0XHRpZiAoIGxpZ2h0LmlzQW1iaWVudExpZ2h0ICkge1xuXG5cdFx0XHRcdHIgKz0gY29sb3IuciAqIGludGVuc2l0eTtcblx0XHRcdFx0ZyArPSBjb2xvci5nICogaW50ZW5zaXR5O1xuXHRcdFx0XHRiICs9IGNvbG9yLmIgKiBpbnRlbnNpdHk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzRGlyZWN0aW9uYWxMaWdodCApIHtcblxuXHRcdFx0XHR2YXIgdW5pZm9ybXMgPSBjYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuY29sb3IuY29weSggbGlnaHQuY29sb3IgKS5tdWx0aXBseVNjYWxhciggbGlnaHQuaW50ZW5zaXR5ICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC50YXJnZXQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnN1YiggdmVjdG9yMyApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKCB2aWV3TWF0cml4ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuc2hhZG93ID0gbGlnaHQuY2FzdFNoYWRvdztcblxuXHRcdFx0XHRpZiAoIGxpZ2h0LmNhc3RTaGFkb3cgKSB7XG5cblx0XHRcdFx0XHR2YXIgc2hhZG93ID0gbGlnaHQuc2hhZG93O1xuXG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93QmlhcyA9IHNoYWRvdy5iaWFzO1xuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd1JhZGl1cyA9IHNoYWRvdy5yYWRpdXM7XG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93TWFwU2l6ZSA9IHNoYWRvdy5tYXBTaXplO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hcFsgZGlyZWN0aW9uYWxMZW5ndGggXSA9IHNoYWRvd01hcDtcblx0XHRcdFx0c3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIGRpcmVjdGlvbmFsTGVuZ3RoIF0gPSBsaWdodC5zaGFkb3cubWF0cml4O1xuXHRcdFx0XHRzdGF0ZS5kaXJlY3Rpb25hbFsgZGlyZWN0aW9uYWxMZW5ndGggXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRcdGRpcmVjdGlvbmFsTGVuZ3RoICsrO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc1Nwb3RMaWdodCApIHtcblxuXHRcdFx0XHR2YXIgdW5pZm9ybXMgPSBjYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5hcHBseU1hdHJpeDQoIHZpZXdNYXRyaXggKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5jb2xvci5jb3B5KCBjb2xvciApLm11bHRpcGx5U2NhbGFyKCBpbnRlbnNpdHkgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlzdGFuY2UgPSBkaXN0YW5jZTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR2ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5zdWIoIHZlY3RvcjMgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbiggdmlld01hdHJpeCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmNvbmVDb3MgPSBNYXRoLmNvcyggbGlnaHQuYW5nbGUgKTtcblx0XHRcdFx0dW5pZm9ybXMucGVudW1icmFDb3MgPSBNYXRoLmNvcyggbGlnaHQuYW5nbGUgKiAoIDEgLSBsaWdodC5wZW51bWJyYSApICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRlY2F5ID0gKCBsaWdodC5kaXN0YW5jZSA9PT0gMCApID8gMC4wIDogbGlnaHQuZGVjYXk7XG5cblx0XHRcdFx0dW5pZm9ybXMuc2hhZG93ID0gbGlnaHQuY2FzdFNoYWRvdztcblxuXHRcdFx0XHRpZiAoIGxpZ2h0LmNhc3RTaGFkb3cgKSB7XG5cblx0XHRcdFx0XHR2YXIgc2hhZG93ID0gbGlnaHQuc2hhZG93O1xuXG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93QmlhcyA9IHNoYWRvdy5iaWFzO1xuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd1JhZGl1cyA9IHNoYWRvdy5yYWRpdXM7XG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93TWFwU2l6ZSA9IHNoYWRvdy5tYXBTaXplO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzdGF0ZS5zcG90U2hhZG93TWFwWyBzcG90TGVuZ3RoIF0gPSBzaGFkb3dNYXA7XG5cdFx0XHRcdHN0YXRlLnNwb3RTaGFkb3dNYXRyaXhbIHNwb3RMZW5ndGggXSA9IGxpZ2h0LnNoYWRvdy5tYXRyaXg7XG5cdFx0XHRcdHN0YXRlLnNwb3RbIHNwb3RMZW5ndGggXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRcdHNwb3RMZW5ndGggKys7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzUmVjdEFyZWFMaWdodCApIHtcblxuXHRcdFx0XHR2YXIgdW5pZm9ybXMgPSBjYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0Ly8gKGEpIGludGVuc2l0eSBpcyB0aGUgdG90YWwgdmlzaWJsZSBsaWdodCBlbWl0dGVkXG5cdFx0XHRcdC8vdW5pZm9ybXMuY29sb3IuY29weSggY29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5IC8gKCBsaWdodC53aWR0aCAqIGxpZ2h0LmhlaWdodCAqIE1hdGguUEkgKSApO1xuXG5cdFx0XHRcdC8vIChiKSBpbnRlbnNpdHkgaXMgdGhlIGJyaWdodG5lc3Mgb2YgdGhlIGxpZ2h0XG5cdFx0XHRcdHVuaWZvcm1zLmNvbG9yLmNvcHkoIGNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uYXBwbHlNYXRyaXg0KCB2aWV3TWF0cml4ICk7XG5cblx0XHRcdFx0Ly8gZXh0cmFjdCBsb2NhbCByb3RhdGlvbiBvZiBsaWdodCB0byBkZXJpdmUgd2lkdGgvaGVpZ2h0IGhhbGYgdmVjdG9yc1xuXHRcdFx0XHRtYXRyaXg0Mi5pZGVudGl0eSgpO1xuXHRcdFx0XHRtYXRyaXg0LmNvcHkoIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdG1hdHJpeDQucHJlbXVsdGlwbHkoIHZpZXdNYXRyaXggKTtcblx0XHRcdFx0bWF0cml4NDIuZXh0cmFjdFJvdGF0aW9uKCBtYXRyaXg0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuaGFsZldpZHRoLnNldCggbGlnaHQud2lkdGggKiAwLjUsIDAuMCwgMC4wICk7XG5cdFx0XHRcdHVuaWZvcm1zLmhhbGZIZWlnaHQuc2V0KCAwLjAsIGxpZ2h0LmhlaWdodCAqIDAuNSwgMC4wICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuaGFsZldpZHRoLmFwcGx5TWF0cml4NCggbWF0cml4NDIgKTtcblx0XHRcdFx0dW5pZm9ybXMuaGFsZkhlaWdodC5hcHBseU1hdHJpeDQoIG1hdHJpeDQyICk7XG5cblx0XHRcdFx0Ly8gVE9ETyAoYWJlbG5hdGlvbik6IFJlY3RBcmVhTGlnaHQgZGlzdGFuY2U/XG5cdFx0XHRcdC8vIHVuaWZvcm1zLmRpc3RhbmNlID0gZGlzdGFuY2U7XG5cblx0XHRcdFx0c3RhdGUucmVjdEFyZWFbIHJlY3RBcmVhTGVuZ3RoIF0gPSB1bmlmb3JtcztcblxuXHRcdFx0XHRyZWN0QXJlYUxlbmd0aCArKztcblxuXHRcdFx0fSBlbHNlIGlmICggbGlnaHQuaXNQb2ludExpZ2h0ICkge1xuXG5cdFx0XHRcdHZhciB1bmlmb3JtcyA9IGNhY2hlLmdldCggbGlnaHQgKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLmFwcGx5TWF0cml4NCggdmlld01hdHJpeCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmNvbG9yLmNvcHkoIGxpZ2h0LmNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGxpZ2h0LmludGVuc2l0eSApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXN0YW5jZSA9IGxpZ2h0LmRpc3RhbmNlO1xuXHRcdFx0XHR1bmlmb3Jtcy5kZWNheSA9ICggbGlnaHQuZGlzdGFuY2UgPT09IDAgKSA/IDAuMCA6IGxpZ2h0LmRlY2F5O1xuXG5cdFx0XHRcdHVuaWZvcm1zLnNoYWRvdyA9IGxpZ2h0LmNhc3RTaGFkb3c7XG5cblx0XHRcdFx0aWYgKCBsaWdodC5jYXN0U2hhZG93ICkge1xuXG5cdFx0XHRcdFx0dmFyIHNoYWRvdyA9IGxpZ2h0LnNoYWRvdztcblxuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd0JpYXMgPSBzaGFkb3cuYmlhcztcblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dSYWRpdXMgPSBzaGFkb3cucmFkaXVzO1xuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd01hcFNpemUgPSBzaGFkb3cubWFwU2l6ZTtcblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dDYW1lcmFOZWFyID0gc2hhZG93LmNhbWVyYS5uZWFyO1xuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd0NhbWVyYUZhciA9IHNoYWRvdy5jYW1lcmEuZmFyO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzdGF0ZS5wb2ludFNoYWRvd01hcFsgcG9pbnRMZW5ndGggXSA9IHNoYWRvd01hcDtcblx0XHRcdFx0c3RhdGUucG9pbnRTaGFkb3dNYXRyaXhbIHBvaW50TGVuZ3RoIF0gPSBsaWdodC5zaGFkb3cubWF0cml4O1xuXHRcdFx0XHRzdGF0ZS5wb2ludFsgcG9pbnRMZW5ndGggXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRcdHBvaW50TGVuZ3RoICsrO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc0hlbWlzcGhlcmVMaWdodCApIHtcblxuXHRcdFx0XHR2YXIgdW5pZm9ybXMgPSBjYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbiggdmlld01hdHJpeCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24ubm9ybWFsaXplKCk7XG5cblx0XHRcdFx0dW5pZm9ybXMuc2t5Q29sb3IuY29weSggbGlnaHQuY29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5ICk7XG5cdFx0XHRcdHVuaWZvcm1zLmdyb3VuZENvbG9yLmNvcHkoIGxpZ2h0Lmdyb3VuZENvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApO1xuXG5cdFx0XHRcdHN0YXRlLmhlbWlbIGhlbWlMZW5ndGggXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRcdGhlbWlMZW5ndGggKys7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHN0YXRlLmFtYmllbnRbIDAgXSA9IHI7XG5cdFx0c3RhdGUuYW1iaWVudFsgMSBdID0gZztcblx0XHRzdGF0ZS5hbWJpZW50WyAyIF0gPSBiO1xuXG5cdFx0c3RhdGUuZGlyZWN0aW9uYWwubGVuZ3RoID0gZGlyZWN0aW9uYWxMZW5ndGg7XG5cdFx0c3RhdGUuc3BvdC5sZW5ndGggPSBzcG90TGVuZ3RoO1xuXHRcdHN0YXRlLnJlY3RBcmVhLmxlbmd0aCA9IHJlY3RBcmVhTGVuZ3RoO1xuXHRcdHN0YXRlLnBvaW50Lmxlbmd0aCA9IHBvaW50TGVuZ3RoO1xuXHRcdHN0YXRlLmhlbWkubGVuZ3RoID0gaGVtaUxlbmd0aDtcblxuXHRcdHN0YXRlLmhhc2ggPSBzdGF0ZS5pZCArICcsJyArIGRpcmVjdGlvbmFsTGVuZ3RoICsgJywnICsgcG9pbnRMZW5ndGggKyAnLCcgKyBzcG90TGVuZ3RoICsgJywnICsgcmVjdEFyZWFMZW5ndGggKyAnLCcgKyBoZW1pTGVuZ3RoICsgJywnICsgc2hhZG93cy5sZW5ndGg7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0c2V0dXA6IHNldHVwLFxuXHRcdHN0YXRlOiBzdGF0ZVxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFJlbmRlclN0YXRlKCkge1xuXG5cdHZhciBsaWdodHMgPSBuZXcgV2ViR0xMaWdodHMoKTtcblxuXHR2YXIgbGlnaHRzQXJyYXkgPSBbXTtcblx0dmFyIHNoYWRvd3NBcnJheSA9IFtdO1xuXHR2YXIgc3ByaXRlc0FycmF5ID0gW107XG5cblx0ZnVuY3Rpb24gaW5pdCgpIHtcblxuXHRcdGxpZ2h0c0FycmF5Lmxlbmd0aCA9IDA7XG5cdFx0c2hhZG93c0FycmF5Lmxlbmd0aCA9IDA7XG5cdFx0c3ByaXRlc0FycmF5Lmxlbmd0aCA9IDA7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHB1c2hMaWdodCggbGlnaHQgKSB7XG5cblx0XHRsaWdodHNBcnJheS5wdXNoKCBsaWdodCApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBwdXNoU2hhZG93KCBzaGFkb3dMaWdodCApIHtcblxuXHRcdHNoYWRvd3NBcnJheS5wdXNoKCBzaGFkb3dMaWdodCApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBwdXNoU3ByaXRlKCBzaGFkb3dMaWdodCApIHtcblxuXHRcdHNwcml0ZXNBcnJheS5wdXNoKCBzaGFkb3dMaWdodCApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXR1cExpZ2h0cyggY2FtZXJhICkge1xuXG5cdFx0bGlnaHRzLnNldHVwKCBsaWdodHNBcnJheSwgc2hhZG93c0FycmF5LCBjYW1lcmEgKTtcblxuXHR9XG5cblx0dmFyIHN0YXRlID0ge1xuXHRcdGxpZ2h0c0FycmF5OiBsaWdodHNBcnJheSxcblx0XHRzaGFkb3dzQXJyYXk6IHNoYWRvd3NBcnJheSxcblx0XHRzcHJpdGVzQXJyYXk6IHNwcml0ZXNBcnJheSxcblxuXHRcdGxpZ2h0czogbGlnaHRzXG5cdH07XG5cblx0cmV0dXJuIHtcblx0XHRpbml0OiBpbml0LFxuXHRcdHN0YXRlOiBzdGF0ZSxcblx0XHRzZXR1cExpZ2h0czogc2V0dXBMaWdodHMsXG5cblx0XHRwdXNoTGlnaHQ6IHB1c2hMaWdodCxcblx0XHRwdXNoU2hhZG93OiBwdXNoU2hhZG93LFxuXHRcdHB1c2hTcHJpdGU6IHB1c2hTcHJpdGVcblx0fTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTFJlbmRlclN0YXRlcygpIHtcblxuXHR2YXIgcmVuZGVyU3RhdGVzID0ge307XG5cblx0ZnVuY3Rpb24gZ2V0KCBzY2VuZSwgY2FtZXJhICkge1xuXG5cdFx0dmFyIGhhc2ggPSBzY2VuZS5pZCArICcsJyArIGNhbWVyYS5pZDtcblxuXHRcdHZhciByZW5kZXJTdGF0ZSA9IHJlbmRlclN0YXRlc1sgaGFzaCBdO1xuXG5cdFx0aWYgKCByZW5kZXJTdGF0ZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRyZW5kZXJTdGF0ZSA9IG5ldyBXZWJHTFJlbmRlclN0YXRlKCk7XG5cdFx0XHRyZW5kZXJTdGF0ZXNbIGhhc2ggXSA9IHJlbmRlclN0YXRlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlbmRlclN0YXRlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNwb3NlKCkge1xuXG5cdFx0cmVuZGVyU3RhdGVzID0ge307XG5cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0Z2V0OiBnZXQsXG5cdFx0ZGlzcG9zZTogZGlzcG9zZVxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cHM6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgZGlzcGxhY2VtZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGRpc3BsYWNlbWVudFNjYWxlOiA8ZmxvYXQ+LFxuICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD4sXG4gKlxuICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LFxuICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PlxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hEZXB0aE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaERlcHRoTWF0ZXJpYWwnO1xuXG5cdHRoaXMuZGVwdGhQYWNraW5nID0gQmFzaWNEZXB0aFBhY2tpbmc7XG5cblx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXG5cdHRoaXMubWFwID0gbnVsbDtcblxuXHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcblxuXHR0aGlzLmZvZyA9IGZhbHNlO1xuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaERlcHRoTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoRGVwdGhNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoRGVwdGhNYXRlcmlhbDtcblxuTWVzaERlcHRoTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaERlcHRoTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoRGVwdGhNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuZGVwdGhQYWNraW5nID0gc291cmNlLmRlcHRoUGFja2luZztcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICpcbiAqICByZWZlcmVuY2VQb3NpdGlvbjogPGZsb2F0PixcbiAqICBuZWFyRGlzdGFuY2U6IDxmbG9hdD4sXG4gKiAgZmFyRGlzdGFuY2U6IDxmbG9hdD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKlxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PixcbiAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+XG4gKlxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hEaXN0YW5jZU1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaERpc3RhbmNlTWF0ZXJpYWwnO1xuXG5cdHRoaXMucmVmZXJlbmNlUG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLm5lYXJEaXN0YW5jZSA9IDE7XG5cdHRoaXMuZmFyRGlzdGFuY2UgPSAxMDAwO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTtcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDtcblxuXHR0aGlzLmZvZyA9IGZhbHNlO1xuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaERpc3RhbmNlTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoRGlzdGFuY2VNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoRGlzdGFuY2VNYXRlcmlhbDtcblxuTWVzaERpc3RhbmNlTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoRGlzdGFuY2VNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMucmVmZXJlbmNlUG9zaXRpb24uY29weSggc291cmNlLnJlZmVyZW5jZVBvc2l0aW9uICk7XG5cdHRoaXMubmVhckRpc3RhbmNlID0gc291cmNlLm5lYXJEaXN0YW5jZTtcblx0dGhpcy5mYXJEaXN0YW5jZSA9IHNvdXJjZS5mYXJEaXN0YW5jZTtcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFNoYWRvd01hcCggX3JlbmRlcmVyLCBfb2JqZWN0cywgbWF4VGV4dHVyZVNpemUgKSB7XG5cblx0dmFyIF9mcnVzdHVtID0gbmV3IEZydXN0dW0oKSxcblx0XHRfcHJvalNjcmVlbk1hdHJpeCA9IG5ldyBNYXRyaXg0KCksXG5cblx0XHRfc2hhZG93TWFwU2l6ZSA9IG5ldyBWZWN0b3IyKCksXG5cdFx0X21heFNoYWRvd01hcFNpemUgPSBuZXcgVmVjdG9yMiggbWF4VGV4dHVyZVNpemUsIG1heFRleHR1cmVTaXplICksXG5cblx0XHRfbG9va1RhcmdldCA9IG5ldyBWZWN0b3IzKCksXG5cdFx0X2xpZ2h0UG9zaXRpb25Xb3JsZCA9IG5ldyBWZWN0b3IzKCksXG5cblx0XHRfTW9ycGhpbmdGbGFnID0gMSxcblx0XHRfU2tpbm5pbmdGbGFnID0gMixcblxuXHRcdF9OdW1iZXJPZk1hdGVyaWFsVmFyaWFudHMgPSAoIF9Nb3JwaGluZ0ZsYWcgfCBfU2tpbm5pbmdGbGFnICkgKyAxLFxuXG5cdFx0X2RlcHRoTWF0ZXJpYWxzID0gbmV3IEFycmF5KCBfTnVtYmVyT2ZNYXRlcmlhbFZhcmlhbnRzICksXG5cdFx0X2Rpc3RhbmNlTWF0ZXJpYWxzID0gbmV3IEFycmF5KCBfTnVtYmVyT2ZNYXRlcmlhbFZhcmlhbnRzICksXG5cblx0XHRfbWF0ZXJpYWxDYWNoZSA9IHt9O1xuXG5cdHZhciBzaGFkb3dTaWRlID0geyAwOiBCYWNrU2lkZSwgMTogRnJvbnRTaWRlLCAyOiBEb3VibGVTaWRlIH07XG5cblx0dmFyIGN1YmVEaXJlY3Rpb25zID0gW1xuXHRcdG5ldyBWZWN0b3IzKCAxLCAwLCAwICksIG5ldyBWZWN0b3IzKCAtIDEsIDAsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDAsIDEgKSxcblx0XHRuZXcgVmVjdG9yMyggMCwgMCwgLSAxICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAtIDEsIDAgKVxuXHRdO1xuXG5cdHZhciBjdWJlVXBzID0gW1xuXHRcdG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksXG5cdFx0bmV3IFZlY3RvcjMoIDAsIDEsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDAsIDEgKSxcdG5ldyBWZWN0b3IzKCAwLCAwLCAtIDEgKVxuXHRdO1xuXG5cdHZhciBjdWJlMkRWaWV3UG9ydHMgPSBbXG5cdFx0bmV3IFZlY3RvcjQoKSwgbmV3IFZlY3RvcjQoKSwgbmV3IFZlY3RvcjQoKSxcblx0XHRuZXcgVmVjdG9yNCgpLCBuZXcgVmVjdG9yNCgpLCBuZXcgVmVjdG9yNCgpXG5cdF07XG5cblx0Ly8gaW5pdFxuXG5cdGZvciAoIHZhciBpID0gMDsgaSAhPT0gX051bWJlck9mTWF0ZXJpYWxWYXJpYW50czsgKysgaSApIHtcblxuXHRcdHZhciB1c2VNb3JwaGluZyA9ICggaSAmIF9Nb3JwaGluZ0ZsYWcgKSAhPT0gMDtcblx0XHR2YXIgdXNlU2tpbm5pbmcgPSAoIGkgJiBfU2tpbm5pbmdGbGFnICkgIT09IDA7XG5cblx0XHR2YXIgZGVwdGhNYXRlcmlhbCA9IG5ldyBNZXNoRGVwdGhNYXRlcmlhbCgge1xuXG5cdFx0XHRkZXB0aFBhY2tpbmc6IFJHQkFEZXB0aFBhY2tpbmcsXG5cblx0XHRcdG1vcnBoVGFyZ2V0czogdXNlTW9ycGhpbmcsXG5cdFx0XHRza2lubmluZzogdXNlU2tpbm5pbmdcblxuXHRcdH0gKTtcblxuXHRcdF9kZXB0aE1hdGVyaWFsc1sgaSBdID0gZGVwdGhNYXRlcmlhbDtcblxuXHRcdC8vXG5cblx0XHR2YXIgZGlzdGFuY2VNYXRlcmlhbCA9IG5ldyBNZXNoRGlzdGFuY2VNYXRlcmlhbCgge1xuXG5cdFx0XHRtb3JwaFRhcmdldHM6IHVzZU1vcnBoaW5nLFxuXHRcdFx0c2tpbm5pbmc6IHVzZVNraW5uaW5nXG5cblx0XHR9ICk7XG5cblx0XHRfZGlzdGFuY2VNYXRlcmlhbHNbIGkgXSA9IGRpc3RhbmNlTWF0ZXJpYWw7XG5cblx0fVxuXG5cdC8vXG5cblx0dmFyIHNjb3BlID0gdGhpcztcblxuXHR0aGlzLmVuYWJsZWQgPSBmYWxzZTtcblxuXHR0aGlzLmF1dG9VcGRhdGUgPSB0cnVlO1xuXHR0aGlzLm5lZWRzVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy50eXBlID0gUENGU2hhZG93TWFwO1xuXG5cdHRoaXMucmVuZGVyID0gZnVuY3Rpb24gKCBsaWdodHMsIHNjZW5lLCBjYW1lcmEgKSB7XG5cblx0XHRpZiAoIHNjb3BlLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuO1xuXHRcdGlmICggc2NvcGUuYXV0b1VwZGF0ZSA9PT0gZmFsc2UgJiYgc2NvcGUubmVlZHNVcGRhdGUgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0aWYgKCBsaWdodHMubGVuZ3RoID09PSAwICkgcmV0dXJuO1xuXG5cdFx0Ly8gVE9ETyBDbGVhbiB1cCAobmVlZGVkIGluIGNhc2Ugb2YgY29udGV4dGxvc3QpXG5cdFx0dmFyIF9nbCA9IF9yZW5kZXJlci5jb250ZXh0O1xuXHRcdHZhciBfc3RhdGUgPSBfcmVuZGVyZXIuc3RhdGU7XG5cblx0XHQvLyBTZXQgR0wgc3RhdGUgZm9yIGRlcHRoIG1hcC5cblx0XHRfc3RhdGUuZGlzYWJsZSggX2dsLkJMRU5EICk7XG5cdFx0X3N0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0Q2xlYXIoIDEsIDEsIDEsIDEgKTtcblx0XHRfc3RhdGUuYnVmZmVycy5kZXB0aC5zZXRUZXN0KCB0cnVlICk7XG5cdFx0X3N0YXRlLnNldFNjaXNzb3JUZXN0KCBmYWxzZSApO1xuXG5cdFx0Ly8gcmVuZGVyIGRlcHRoIG1hcFxuXG5cdFx0dmFyIGZhY2VDb3VudDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBsaWdodHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBsaWdodCA9IGxpZ2h0c1sgaSBdO1xuXHRcdFx0dmFyIHNoYWRvdyA9IGxpZ2h0LnNoYWRvdztcblx0XHRcdHZhciBpc1BvaW50TGlnaHQgPSBsaWdodCAmJiBsaWdodC5pc1BvaW50TGlnaHQ7XG5cblx0XHRcdGlmICggc2hhZG93ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xTaGFkb3dNYXA6JywgbGlnaHQsICdoYXMgbm8gc2hhZG93LicgKTtcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHNoYWRvd0NhbWVyYSA9IHNoYWRvdy5jYW1lcmE7XG5cblx0XHRcdF9zaGFkb3dNYXBTaXplLmNvcHkoIHNoYWRvdy5tYXBTaXplICk7XG5cdFx0XHRfc2hhZG93TWFwU2l6ZS5taW4oIF9tYXhTaGFkb3dNYXBTaXplICk7XG5cblx0XHRcdGlmICggaXNQb2ludExpZ2h0ICkge1xuXG5cdFx0XHRcdHZhciB2cFdpZHRoID0gX3NoYWRvd01hcFNpemUueDtcblx0XHRcdFx0dmFyIHZwSGVpZ2h0ID0gX3NoYWRvd01hcFNpemUueTtcblxuXHRcdFx0XHQvLyBUaGVzZSB2aWV3cG9ydHMgbWFwIGEgY3ViZS1tYXAgb250byBhIDJEIHRleHR1cmUgd2l0aCB0aGVcblx0XHRcdFx0Ly8gZm9sbG93aW5nIG9yaWVudGF0aW9uOlxuXHRcdFx0XHQvL1xuXHRcdFx0XHQvLyAgeHpYWlxuXHRcdFx0XHQvLyAgIHkgWVxuXHRcdFx0XHQvL1xuXHRcdFx0XHQvLyBYIC0gUG9zaXRpdmUgeCBkaXJlY3Rpb25cblx0XHRcdFx0Ly8geCAtIE5lZ2F0aXZlIHggZGlyZWN0aW9uXG5cdFx0XHRcdC8vIFkgLSBQb3NpdGl2ZSB5IGRpcmVjdGlvblxuXHRcdFx0XHQvLyB5IC0gTmVnYXRpdmUgeSBkaXJlY3Rpb25cblx0XHRcdFx0Ly8gWiAtIFBvc2l0aXZlIHogZGlyZWN0aW9uXG5cdFx0XHRcdC8vIHogLSBOZWdhdGl2ZSB6IGRpcmVjdGlvblxuXG5cdFx0XHRcdC8vIHBvc2l0aXZlIFhcblx0XHRcdFx0Y3ViZTJEVmlld1BvcnRzWyAwIF0uc2V0KCB2cFdpZHRoICogMiwgdnBIZWlnaHQsIHZwV2lkdGgsIHZwSGVpZ2h0ICk7XG5cdFx0XHRcdC8vIG5lZ2F0aXZlIFhcblx0XHRcdFx0Y3ViZTJEVmlld1BvcnRzWyAxIF0uc2V0KCAwLCB2cEhlaWdodCwgdnBXaWR0aCwgdnBIZWlnaHQgKTtcblx0XHRcdFx0Ly8gcG9zaXRpdmUgWlxuXHRcdFx0XHRjdWJlMkRWaWV3UG9ydHNbIDIgXS5zZXQoIHZwV2lkdGggKiAzLCB2cEhlaWdodCwgdnBXaWR0aCwgdnBIZWlnaHQgKTtcblx0XHRcdFx0Ly8gbmVnYXRpdmUgWlxuXHRcdFx0XHRjdWJlMkRWaWV3UG9ydHNbIDMgXS5zZXQoIHZwV2lkdGgsIHZwSGVpZ2h0LCB2cFdpZHRoLCB2cEhlaWdodCApO1xuXHRcdFx0XHQvLyBwb3NpdGl2ZSBZXG5cdFx0XHRcdGN1YmUyRFZpZXdQb3J0c1sgNCBdLnNldCggdnBXaWR0aCAqIDMsIDAsIHZwV2lkdGgsIHZwSGVpZ2h0ICk7XG5cdFx0XHRcdC8vIG5lZ2F0aXZlIFlcblx0XHRcdFx0Y3ViZTJEVmlld1BvcnRzWyA1IF0uc2V0KCB2cFdpZHRoLCAwLCB2cFdpZHRoLCB2cEhlaWdodCApO1xuXG5cdFx0XHRcdF9zaGFkb3dNYXBTaXplLnggKj0gNC4wO1xuXHRcdFx0XHRfc2hhZG93TWFwU2l6ZS55ICo9IDIuMDtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHNoYWRvdy5tYXAgPT09IG51bGwgKSB7XG5cblx0XHRcdFx0dmFyIHBhcnMgPSB7IG1pbkZpbHRlcjogTmVhcmVzdEZpbHRlciwgbWFnRmlsdGVyOiBOZWFyZXN0RmlsdGVyLCBmb3JtYXQ6IFJHQkFGb3JtYXQgfTtcblxuXHRcdFx0XHRzaGFkb3cubWFwID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KCBfc2hhZG93TWFwU2l6ZS54LCBfc2hhZG93TWFwU2l6ZS55LCBwYXJzICk7XG5cdFx0XHRcdHNoYWRvdy5tYXAudGV4dHVyZS5uYW1lID0gbGlnaHQubmFtZSArIFwiLnNoYWRvd01hcFwiO1xuXG5cdFx0XHRcdHNoYWRvd0NhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBzaGFkb3cuaXNTcG90TGlnaHRTaGFkb3cgKSB7XG5cblx0XHRcdFx0c2hhZG93LnVwZGF0ZSggbGlnaHQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgc2hhZG93TWFwID0gc2hhZG93Lm1hcDtcblx0XHRcdHZhciBzaGFkb3dNYXRyaXggPSBzaGFkb3cubWF0cml4O1xuXG5cdFx0XHRfbGlnaHRQb3NpdGlvbldvcmxkLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdHNoYWRvd0NhbWVyYS5wb3NpdGlvbi5jb3B5KCBfbGlnaHRQb3NpdGlvbldvcmxkICk7XG5cblx0XHRcdGlmICggaXNQb2ludExpZ2h0ICkge1xuXG5cdFx0XHRcdGZhY2VDb3VudCA9IDY7XG5cblx0XHRcdFx0Ly8gZm9yIHBvaW50IGxpZ2h0cyB3ZSBzZXQgdGhlIHNoYWRvdyBtYXRyaXggdG8gYmUgYSB0cmFuc2xhdGlvbi1vbmx5IG1hdHJpeFxuXHRcdFx0XHQvLyBlcXVhbCB0byBpbnZlcnNlIG9mIHRoZSBsaWdodCdzIHBvc2l0aW9uXG5cblx0XHRcdFx0c2hhZG93TWF0cml4Lm1ha2VUcmFuc2xhdGlvbiggLSBfbGlnaHRQb3NpdGlvbldvcmxkLngsIC0gX2xpZ2h0UG9zaXRpb25Xb3JsZC55LCAtIF9saWdodFBvc2l0aW9uV29ybGQueiApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGZhY2VDb3VudCA9IDE7XG5cblx0XHRcdFx0X2xvb2tUYXJnZXQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC50YXJnZXQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0c2hhZG93Q2FtZXJhLmxvb2tBdCggX2xvb2tUYXJnZXQgKTtcblx0XHRcdFx0c2hhZG93Q2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0XHRcdFx0Ly8gY29tcHV0ZSBzaGFkb3cgbWF0cml4XG5cblx0XHRcdFx0c2hhZG93TWF0cml4LnNldChcblx0XHRcdFx0XHQwLjUsIDAuMCwgMC4wLCAwLjUsXG5cdFx0XHRcdFx0MC4wLCAwLjUsIDAuMCwgMC41LFxuXHRcdFx0XHRcdDAuMCwgMC4wLCAwLjUsIDAuNSxcblx0XHRcdFx0XHQwLjAsIDAuMCwgMC4wLCAxLjBcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRzaGFkb3dNYXRyaXgubXVsdGlwbHkoIHNoYWRvd0NhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICk7XG5cdFx0XHRcdHNoYWRvd01hdHJpeC5tdWx0aXBseSggc2hhZG93Q2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdF9yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHNoYWRvd01hcCApO1xuXHRcdFx0X3JlbmRlcmVyLmNsZWFyKCk7XG5cblx0XHRcdC8vIHJlbmRlciBzaGFkb3cgbWFwIGZvciBlYWNoIGN1YmUgZmFjZSAoaWYgb21uaS1kaXJlY3Rpb25hbCkgb3Jcblx0XHRcdC8vIHJ1biBhIHNpbmdsZSBwYXNzIGlmIG5vdFxuXG5cdFx0XHRmb3IgKCB2YXIgZmFjZSA9IDA7IGZhY2UgPCBmYWNlQ291bnQ7IGZhY2UgKysgKSB7XG5cblx0XHRcdFx0aWYgKCBpc1BvaW50TGlnaHQgKSB7XG5cblx0XHRcdFx0XHRfbG9va1RhcmdldC5jb3B5KCBzaGFkb3dDYW1lcmEucG9zaXRpb24gKTtcblx0XHRcdFx0XHRfbG9va1RhcmdldC5hZGQoIGN1YmVEaXJlY3Rpb25zWyBmYWNlIF0gKTtcblx0XHRcdFx0XHRzaGFkb3dDYW1lcmEudXAuY29weSggY3ViZVVwc1sgZmFjZSBdICk7XG5cdFx0XHRcdFx0c2hhZG93Q2FtZXJhLmxvb2tBdCggX2xvb2tUYXJnZXQgKTtcblx0XHRcdFx0XHRzaGFkb3dDYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHRcdFx0XHRcdHZhciB2cERpbWVuc2lvbnMgPSBjdWJlMkRWaWV3UG9ydHNbIGZhY2UgXTtcblx0XHRcdFx0XHRfc3RhdGUudmlld3BvcnQoIHZwRGltZW5zaW9ucyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyB1cGRhdGUgY2FtZXJhIG1hdHJpY2VzIGFuZCBmcnVzdHVtXG5cblx0XHRcdFx0X3Byb2pTY3JlZW5NYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggc2hhZG93Q2FtZXJhLnByb2plY3Rpb25NYXRyaXgsIHNoYWRvd0NhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblx0XHRcdFx0X2ZydXN0dW0uc2V0RnJvbU1hdHJpeCggX3Byb2pTY3JlZW5NYXRyaXggKTtcblxuXHRcdFx0XHQvLyBzZXQgb2JqZWN0IG1hdHJpY2VzICYgZnJ1c3R1bSBjdWxsaW5nXG5cblx0XHRcdFx0cmVuZGVyT2JqZWN0KCBzY2VuZSwgY2FtZXJhLCBzaGFkb3dDYW1lcmEsIGlzUG9pbnRMaWdodCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRzY29wZS5uZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdH07XG5cblx0ZnVuY3Rpb24gZ2V0RGVwdGhNYXRlcmlhbCggb2JqZWN0LCBtYXRlcmlhbCwgaXNQb2ludExpZ2h0LCBsaWdodFBvc2l0aW9uV29ybGQsIHNoYWRvd0NhbWVyYU5lYXIsIHNoYWRvd0NhbWVyYUZhciApIHtcblxuXHRcdHZhciBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRyeTtcblxuXHRcdHZhciByZXN1bHQgPSBudWxsO1xuXG5cdFx0dmFyIG1hdGVyaWFsVmFyaWFudHMgPSBfZGVwdGhNYXRlcmlhbHM7XG5cdFx0dmFyIGN1c3RvbU1hdGVyaWFsID0gb2JqZWN0LmN1c3RvbURlcHRoTWF0ZXJpYWw7XG5cblx0XHRpZiAoIGlzUG9pbnRMaWdodCApIHtcblxuXHRcdFx0bWF0ZXJpYWxWYXJpYW50cyA9IF9kaXN0YW5jZU1hdGVyaWFscztcblx0XHRcdGN1c3RvbU1hdGVyaWFsID0gb2JqZWN0LmN1c3RvbURpc3RhbmNlTWF0ZXJpYWw7XG5cblx0XHR9XG5cblx0XHRpZiAoICEgY3VzdG9tTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHZhciB1c2VNb3JwaGluZyA9IGZhbHNlO1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0XHR1c2VNb3JwaGluZyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcyAmJiBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24gJiYgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLmxlbmd0aCA+IDA7XG5cblx0XHRcdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0XHRcdHVzZU1vcnBoaW5nID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzICYmIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy5sZW5ndGggPiAwO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG9iamVjdC5pc1NraW5uZWRNZXNoICYmIG1hdGVyaWFsLnNraW5uaW5nID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFNoYWRvd01hcDogVEhSRUUuU2tpbm5lZE1lc2ggd2l0aCBtYXRlcmlhbC5za2lubmluZyBzZXQgdG8gZmFsc2U6Jywgb2JqZWN0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHVzZVNraW5uaW5nID0gb2JqZWN0LmlzU2tpbm5lZE1lc2ggJiYgbWF0ZXJpYWwuc2tpbm5pbmc7XG5cblx0XHRcdHZhciB2YXJpYW50SW5kZXggPSAwO1xuXG5cdFx0XHRpZiAoIHVzZU1vcnBoaW5nICkgdmFyaWFudEluZGV4IHw9IF9Nb3JwaGluZ0ZsYWc7XG5cdFx0XHRpZiAoIHVzZVNraW5uaW5nICkgdmFyaWFudEluZGV4IHw9IF9Ta2lubmluZ0ZsYWc7XG5cblx0XHRcdHJlc3VsdCA9IG1hdGVyaWFsVmFyaWFudHNbIHZhcmlhbnRJbmRleCBdO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmVzdWx0ID0gY3VzdG9tTWF0ZXJpYWw7XG5cblx0XHR9XG5cblx0XHRpZiAoIF9yZW5kZXJlci5sb2NhbENsaXBwaW5nRW5hYmxlZCAmJlxuXHRcdFx0XHRtYXRlcmlhbC5jbGlwU2hhZG93cyA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHRtYXRlcmlhbC5jbGlwcGluZ1BsYW5lcy5sZW5ndGggIT09IDAgKSB7XG5cblx0XHRcdC8vIGluIHRoaXMgY2FzZSB3ZSBuZWVkIGEgdW5pcXVlIG1hdGVyaWFsIGluc3RhbmNlIHJlZmxlY3RpbmcgdGhlXG5cdFx0XHQvLyBhcHByb3ByaWF0ZSBzdGF0ZVxuXG5cdFx0XHR2YXIga2V5QSA9IHJlc3VsdC51dWlkLCBrZXlCID0gbWF0ZXJpYWwudXVpZDtcblxuXHRcdFx0dmFyIG1hdGVyaWFsc0ZvclZhcmlhbnQgPSBfbWF0ZXJpYWxDYWNoZVsga2V5QSBdO1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsc0ZvclZhcmlhbnQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtYXRlcmlhbHNGb3JWYXJpYW50ID0ge307XG5cdFx0XHRcdF9tYXRlcmlhbENhY2hlWyBrZXlBIF0gPSBtYXRlcmlhbHNGb3JWYXJpYW50O1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBjYWNoZWRNYXRlcmlhbCA9IG1hdGVyaWFsc0ZvclZhcmlhbnRbIGtleUIgXTtcblxuXHRcdFx0aWYgKCBjYWNoZWRNYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNhY2hlZE1hdGVyaWFsID0gcmVzdWx0LmNsb25lKCk7XG5cdFx0XHRcdG1hdGVyaWFsc0ZvclZhcmlhbnRbIGtleUIgXSA9IGNhY2hlZE1hdGVyaWFsO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJlc3VsdCA9IGNhY2hlZE1hdGVyaWFsO1xuXG5cdFx0fVxuXG5cdFx0cmVzdWx0LnZpc2libGUgPSBtYXRlcmlhbC52aXNpYmxlO1xuXHRcdHJlc3VsdC53aXJlZnJhbWUgPSBtYXRlcmlhbC53aXJlZnJhbWU7XG5cblx0XHRyZXN1bHQuc2lkZSA9ICggbWF0ZXJpYWwuc2hhZG93U2lkZSAhPSBudWxsICkgPyBtYXRlcmlhbC5zaGFkb3dTaWRlIDogc2hhZG93U2lkZVsgbWF0ZXJpYWwuc2lkZSBdO1xuXG5cdFx0cmVzdWx0LmNsaXBTaGFkb3dzID0gbWF0ZXJpYWwuY2xpcFNoYWRvd3M7XG5cdFx0cmVzdWx0LmNsaXBwaW5nUGxhbmVzID0gbWF0ZXJpYWwuY2xpcHBpbmdQbGFuZXM7XG5cdFx0cmVzdWx0LmNsaXBJbnRlcnNlY3Rpb24gPSBtYXRlcmlhbC5jbGlwSW50ZXJzZWN0aW9uO1xuXG5cdFx0cmVzdWx0LndpcmVmcmFtZUxpbmV3aWR0aCA9IG1hdGVyaWFsLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0XHRyZXN1bHQubGluZXdpZHRoID0gbWF0ZXJpYWwubGluZXdpZHRoO1xuXG5cdFx0aWYgKCBpc1BvaW50TGlnaHQgJiYgcmVzdWx0LmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHJlc3VsdC5yZWZlcmVuY2VQb3NpdGlvbi5jb3B5KCBsaWdodFBvc2l0aW9uV29ybGQgKTtcblx0XHRcdHJlc3VsdC5uZWFyRGlzdGFuY2UgPSBzaGFkb3dDYW1lcmFOZWFyO1xuXHRcdFx0cmVzdWx0LmZhckRpc3RhbmNlID0gc2hhZG93Q2FtZXJhRmFyO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVuZGVyT2JqZWN0KCBvYmplY3QsIGNhbWVyYSwgc2hhZG93Q2FtZXJhLCBpc1BvaW50TGlnaHQgKSB7XG5cblx0XHRpZiAoIG9iamVjdC52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdHZhciB2aXNpYmxlID0gb2JqZWN0LmxheWVycy50ZXN0KCBjYW1lcmEubGF5ZXJzICk7XG5cblx0XHRpZiAoIHZpc2libGUgJiYgKCBvYmplY3QuaXNNZXNoIHx8IG9iamVjdC5pc0xpbmUgfHwgb2JqZWN0LmlzUG9pbnRzICkgKSB7XG5cblx0XHRcdGlmICggb2JqZWN0LmNhc3RTaGFkb3cgJiYgKCAhIG9iamVjdC5mcnVzdHVtQ3VsbGVkIHx8IF9mcnVzdHVtLmludGVyc2VjdHNPYmplY3QoIG9iamVjdCApICkgKSB7XG5cblx0XHRcdFx0b2JqZWN0Lm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBzaGFkb3dDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLCBvYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHR2YXIgZ2VvbWV0cnkgPSBfb2JqZWN0cy51cGRhdGUoIG9iamVjdCApO1xuXHRcdFx0XHR2YXIgbWF0ZXJpYWwgPSBvYmplY3QubWF0ZXJpYWw7XG5cblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApICkge1xuXG5cdFx0XHRcdFx0dmFyIGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwcztcblxuXHRcdFx0XHRcdGZvciAoIHZhciBrID0gMCwga2wgPSBncm91cHMubGVuZ3RoOyBrIDwga2w7IGsgKysgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBncm91cCA9IGdyb3Vwc1sgayBdO1xuXHRcdFx0XHRcdFx0dmFyIGdyb3VwTWF0ZXJpYWwgPSBtYXRlcmlhbFsgZ3JvdXAubWF0ZXJpYWxJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGdyb3VwTWF0ZXJpYWwgJiYgZ3JvdXBNYXRlcmlhbC52aXNpYmxlICkge1xuXG5cdFx0XHRcdFx0XHRcdHZhciBkZXB0aE1hdGVyaWFsID0gZ2V0RGVwdGhNYXRlcmlhbCggb2JqZWN0LCBncm91cE1hdGVyaWFsLCBpc1BvaW50TGlnaHQsIF9saWdodFBvc2l0aW9uV29ybGQsIHNoYWRvd0NhbWVyYS5uZWFyLCBzaGFkb3dDYW1lcmEuZmFyICk7XG5cdFx0XHRcdFx0XHRcdF9yZW5kZXJlci5yZW5kZXJCdWZmZXJEaXJlY3QoIHNoYWRvd0NhbWVyYSwgbnVsbCwgZ2VvbWV0cnksIGRlcHRoTWF0ZXJpYWwsIG9iamVjdCwgZ3JvdXAgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLnZpc2libGUgKSB7XG5cblx0XHRcdFx0XHR2YXIgZGVwdGhNYXRlcmlhbCA9IGdldERlcHRoTWF0ZXJpYWwoIG9iamVjdCwgbWF0ZXJpYWwsIGlzUG9pbnRMaWdodCwgX2xpZ2h0UG9zaXRpb25Xb3JsZCwgc2hhZG93Q2FtZXJhLm5lYXIsIHNoYWRvd0NhbWVyYS5mYXIgKTtcblx0XHRcdFx0XHRfcmVuZGVyZXIucmVuZGVyQnVmZmVyRGlyZWN0KCBzaGFkb3dDYW1lcmEsIG51bGwsIGdlb21ldHJ5LCBkZXB0aE1hdGVyaWFsLCBvYmplY3QsIG51bGwgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBjaGlsZHJlbiA9IG9iamVjdC5jaGlsZHJlbjtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHJlbmRlck9iamVjdCggY2hpbGRyZW5bIGkgXSwgY2FtZXJhLCBzaGFkb3dDYW1lcmEsIGlzUG9pbnRMaWdodCApO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQ2FudmFzVGV4dHVyZSggY2FudmFzLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKSB7XG5cblx0VGV4dHVyZS5jYWxsKCB0aGlzLCBjYW52YXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApO1xuXG5cdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG59XG5cbkNhbnZhc1RleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTtcbkNhbnZhc1RleHR1cmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2FudmFzVGV4dHVyZTtcblxuLyoqXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFNwcml0ZVJlbmRlcmVyKCByZW5kZXJlciwgZ2wsIHN0YXRlLCB0ZXh0dXJlcywgY2FwYWJpbGl0aWVzICkge1xuXG5cdHZhciB2ZXJ0ZXhCdWZmZXIsIGVsZW1lbnRCdWZmZXI7XG5cdHZhciBwcm9ncmFtLCBhdHRyaWJ1dGVzLCB1bmlmb3JtcztcblxuXHR2YXIgdGV4dHVyZTtcblxuXHQvLyBkZWNvbXBvc2UgbWF0cml4V29ybGRcblxuXHR2YXIgc3ByaXRlUG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgc3ByaXRlUm90YXRpb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXHR2YXIgc3ByaXRlU2NhbGUgPSBuZXcgVmVjdG9yMygpO1xuXG5cdGZ1bmN0aW9uIGluaXQoKSB7XG5cblx0XHR2YXIgdmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KCBbXG5cdFx0XHQtIDAuNSwgLSAwLjUsIDAsIDAsXG5cdFx0XHQgIDAuNSwgLSAwLjUsIDEsIDAsXG5cdFx0XHQgIDAuNSwgMC41LCAxLCAxLFxuXHRcdFx0LSAwLjUsIDAuNSwgMCwgMVxuXHRcdF0gKTtcblxuXHRcdHZhciBmYWNlcyA9IG5ldyBVaW50MTZBcnJheSggW1xuXHRcdFx0MCwgMSwgMixcblx0XHRcdDAsIDIsIDNcblx0XHRdICk7XG5cblx0XHR2ZXJ0ZXhCdWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcblx0XHRlbGVtZW50QnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG5cblx0XHRnbC5iaW5kQnVmZmVyKCBnbC5BUlJBWV9CVUZGRVIsIHZlcnRleEJ1ZmZlciApO1xuXHRcdGdsLmJ1ZmZlckRhdGEoIGdsLkFSUkFZX0JVRkZFUiwgdmVydGljZXMsIGdsLlNUQVRJQ19EUkFXICk7XG5cblx0XHRnbC5iaW5kQnVmZmVyKCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgZWxlbWVudEJ1ZmZlciApO1xuXHRcdGdsLmJ1ZmZlckRhdGEoIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBmYWNlcywgZ2wuU1RBVElDX0RSQVcgKTtcblxuXHRcdHByb2dyYW0gPSBjcmVhdGVQcm9ncmFtKCk7XG5cblx0XHRhdHRyaWJ1dGVzID0ge1xuXHRcdFx0cG9zaXRpb246IGdsLmdldEF0dHJpYkxvY2F0aW9uKCBwcm9ncmFtLCAncG9zaXRpb24nICksXG5cdFx0XHR1djogZ2wuZ2V0QXR0cmliTG9jYXRpb24oIHByb2dyYW0sICd1dicgKVxuXHRcdH07XG5cblx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdHV2T2Zmc2V0OiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICd1dk9mZnNldCcgKSxcblx0XHRcdHV2U2NhbGU6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ3V2U2NhbGUnICksXG5cblx0XHRcdHJvdGF0aW9uOiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdyb3RhdGlvbicgKSxcblx0XHRcdGNlbnRlcjogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnY2VudGVyJyApLFxuXHRcdFx0c2NhbGU6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ3NjYWxlJyApLFxuXG5cdFx0XHRjb2xvcjogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnY29sb3InICksXG5cdFx0XHRtYXA6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ21hcCcgKSxcblx0XHRcdG9wYWNpdHk6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ29wYWNpdHknICksXG5cblx0XHRcdG1vZGVsVmlld01hdHJpeDogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnbW9kZWxWaWV3TWF0cml4JyApLFxuXHRcdFx0cHJvamVjdGlvbk1hdHJpeDogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAncHJvamVjdGlvbk1hdHJpeCcgKSxcblxuXHRcdFx0Zm9nVHlwZTogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnZm9nVHlwZScgKSxcblx0XHRcdGZvZ0RlbnNpdHk6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ2ZvZ0RlbnNpdHknICksXG5cdFx0XHRmb2dOZWFyOiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdmb2dOZWFyJyApLFxuXHRcdFx0Zm9nRmFyOiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdmb2dGYXInICksXG5cdFx0XHRmb2dDb2xvcjogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnZm9nQ29sb3InICksXG5cdFx0XHRmb2dEZXB0aDogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnZm9nRGVwdGgnICksXG5cblx0XHRcdGFscGhhVGVzdDogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnYWxwaGFUZXN0JyApXG5cdFx0fTtcblxuXHRcdHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycgKTtcblx0XHRjYW52YXMud2lkdGggPSA4O1xuXHRcdGNhbnZhcy5oZWlnaHQgPSA4O1xuXG5cdFx0dmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCggJzJkJyApO1xuXHRcdGNvbnRleHQuZmlsbFN0eWxlID0gJ3doaXRlJztcblx0XHRjb250ZXh0LmZpbGxSZWN0KCAwLCAwLCA4LCA4ICk7XG5cblx0XHR0ZXh0dXJlID0gbmV3IENhbnZhc1RleHR1cmUoIGNhbnZhcyApO1xuXG5cdH1cblxuXHR0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggc3ByaXRlcywgc2NlbmUsIGNhbWVyYSApIHtcblxuXHRcdGlmICggc3ByaXRlcy5sZW5ndGggPT09IDAgKSByZXR1cm47XG5cblx0XHQvLyBzZXR1cCBnbFxuXG5cdFx0aWYgKCBwcm9ncmFtID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGluaXQoKTtcblxuXHRcdH1cblxuXHRcdHN0YXRlLnVzZVByb2dyYW0oIHByb2dyYW0gKTtcblxuXHRcdHN0YXRlLmluaXRBdHRyaWJ1dGVzKCk7XG5cdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBhdHRyaWJ1dGVzLnBvc2l0aW9uICk7XG5cdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBhdHRyaWJ1dGVzLnV2ICk7XG5cdFx0c3RhdGUuZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKTtcblxuXHRcdHN0YXRlLmRpc2FibGUoIGdsLkNVTExfRkFDRSApO1xuXHRcdHN0YXRlLmVuYWJsZSggZ2wuQkxFTkQgKTtcblxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLkFSUkFZX0JVRkZFUiwgdmVydGV4QnVmZmVyICk7XG5cdFx0Z2wudmVydGV4QXR0cmliUG9pbnRlciggYXR0cmlidXRlcy5wb3NpdGlvbiwgMiwgZ2wuRkxPQVQsIGZhbHNlLCAyICogOCwgMCApO1xuXHRcdGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoIGF0dHJpYnV0ZXMudXYsIDIsIGdsLkZMT0FULCBmYWxzZSwgMiAqIDgsIDggKTtcblxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBlbGVtZW50QnVmZmVyICk7XG5cblx0XHRnbC51bmlmb3JtTWF0cml4NGZ2KCB1bmlmb3Jtcy5wcm9qZWN0aW9uTWF0cml4LCBmYWxzZSwgY2FtZXJhLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHMgKTtcblxuXHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIGdsLlRFWFRVUkUwICk7XG5cdFx0Z2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5tYXAsIDAgKTtcblxuXHRcdHZhciBvbGRGb2dUeXBlID0gMDtcblx0XHR2YXIgc2NlbmVGb2dUeXBlID0gMDtcblx0XHR2YXIgZm9nID0gc2NlbmUuZm9nO1xuXG5cdFx0aWYgKCBmb2cgKSB7XG5cblx0XHRcdGdsLnVuaWZvcm0zZiggdW5pZm9ybXMuZm9nQ29sb3IsIGZvZy5jb2xvci5yLCBmb2cuY29sb3IuZywgZm9nLmNvbG9yLmIgKTtcblxuXHRcdFx0aWYgKCBmb2cuaXNGb2cgKSB7XG5cblx0XHRcdFx0Z2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5mb2dOZWFyLCBmb2cubmVhciApO1xuXHRcdFx0XHRnbC51bmlmb3JtMWYoIHVuaWZvcm1zLmZvZ0ZhciwgZm9nLmZhciApO1xuXG5cdFx0XHRcdGdsLnVuaWZvcm0xaSggdW5pZm9ybXMuZm9nVHlwZSwgMSApO1xuXHRcdFx0XHRvbGRGb2dUeXBlID0gMTtcblx0XHRcdFx0c2NlbmVGb2dUeXBlID0gMTtcblxuXHRcdFx0fSBlbHNlIGlmICggZm9nLmlzRm9nRXhwMiApIHtcblxuXHRcdFx0XHRnbC51bmlmb3JtMWYoIHVuaWZvcm1zLmZvZ0RlbnNpdHksIGZvZy5kZW5zaXR5ICk7XG5cblx0XHRcdFx0Z2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5mb2dUeXBlLCAyICk7XG5cdFx0XHRcdG9sZEZvZ1R5cGUgPSAyO1xuXHRcdFx0XHRzY2VuZUZvZ1R5cGUgPSAyO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRnbC51bmlmb3JtMWkoIHVuaWZvcm1zLmZvZ1R5cGUsIDAgKTtcblx0XHRcdG9sZEZvZ1R5cGUgPSAwO1xuXHRcdFx0c2NlbmVGb2dUeXBlID0gMDtcblxuXHRcdH1cblxuXG5cdFx0Ly8gdXBkYXRlIHBvc2l0aW9ucyBhbmQgc29ydFxuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gc3ByaXRlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgc3ByaXRlID0gc3ByaXRlc1sgaSBdO1xuXG5cdFx0XHRzcHJpdGUubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UsIHNwcml0ZS5tYXRyaXhXb3JsZCApO1xuXHRcdFx0c3ByaXRlLnogPSAtIHNwcml0ZS5tb2RlbFZpZXdNYXRyaXguZWxlbWVudHNbIDE0IF07XG5cblx0XHR9XG5cblx0XHRzcHJpdGVzLnNvcnQoIHBhaW50ZXJTb3J0U3RhYmxlICk7XG5cblx0XHQvLyByZW5kZXIgYWxsIHNwcml0ZXNcblxuXHRcdHZhciBzY2FsZSA9IFtdO1xuXHRcdHZhciBjZW50ZXIgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHNwcml0ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHNwcml0ZSA9IHNwcml0ZXNbIGkgXTtcblx0XHRcdHZhciBtYXRlcmlhbCA9IHNwcml0ZS5tYXRlcmlhbDtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC52aXNpYmxlID09PSBmYWxzZSApIGNvbnRpbnVlO1xuXG5cdFx0XHRzcHJpdGUub25CZWZvcmVSZW5kZXIoIHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhLCB1bmRlZmluZWQsIG1hdGVyaWFsLCB1bmRlZmluZWQgKTtcblxuXHRcdFx0Z2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5hbHBoYVRlc3QsIG1hdGVyaWFsLmFscGhhVGVzdCApO1xuXHRcdFx0Z2wudW5pZm9ybU1hdHJpeDRmdiggdW5pZm9ybXMubW9kZWxWaWV3TWF0cml4LCBmYWxzZSwgc3ByaXRlLm1vZGVsVmlld01hdHJpeC5lbGVtZW50cyApO1xuXG5cdFx0XHRzcHJpdGUubWF0cml4V29ybGQuZGVjb21wb3NlKCBzcHJpdGVQb3NpdGlvbiwgc3ByaXRlUm90YXRpb24sIHNwcml0ZVNjYWxlICk7XG5cblx0XHRcdHNjYWxlWyAwIF0gPSBzcHJpdGVTY2FsZS54O1xuXHRcdFx0c2NhbGVbIDEgXSA9IHNwcml0ZVNjYWxlLnk7XG5cblx0XHRcdGNlbnRlclsgMCBdID0gc3ByaXRlLmNlbnRlci54IC0gMC41O1xuXHRcdFx0Y2VudGVyWyAxIF0gPSBzcHJpdGUuY2VudGVyLnkgLSAwLjU7XG5cblx0XHRcdHZhciBmb2dUeXBlID0gMDtcblxuXHRcdFx0aWYgKCBzY2VuZS5mb2cgJiYgbWF0ZXJpYWwuZm9nICkge1xuXG5cdFx0XHRcdGZvZ1R5cGUgPSBzY2VuZUZvZ1R5cGU7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBvbGRGb2dUeXBlICE9PSBmb2dUeXBlICkge1xuXG5cdFx0XHRcdGdsLnVuaWZvcm0xaSggdW5pZm9ybXMuZm9nVHlwZSwgZm9nVHlwZSApO1xuXHRcdFx0XHRvbGRGb2dUeXBlID0gZm9nVHlwZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLm1hcCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRnbC51bmlmb3JtMmYoIHVuaWZvcm1zLnV2T2Zmc2V0LCBtYXRlcmlhbC5tYXAub2Zmc2V0LngsIG1hdGVyaWFsLm1hcC5vZmZzZXQueSApO1xuXHRcdFx0XHRnbC51bmlmb3JtMmYoIHVuaWZvcm1zLnV2U2NhbGUsIG1hdGVyaWFsLm1hcC5yZXBlYXQueCwgbWF0ZXJpYWwubWFwLnJlcGVhdC55ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Z2wudW5pZm9ybTJmKCB1bmlmb3Jtcy51dk9mZnNldCwgMCwgMCApO1xuXHRcdFx0XHRnbC51bmlmb3JtMmYoIHVuaWZvcm1zLnV2U2NhbGUsIDEsIDEgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnbC51bmlmb3JtMWYoIHVuaWZvcm1zLm9wYWNpdHksIG1hdGVyaWFsLm9wYWNpdHkgKTtcblx0XHRcdGdsLnVuaWZvcm0zZiggdW5pZm9ybXMuY29sb3IsIG1hdGVyaWFsLmNvbG9yLnIsIG1hdGVyaWFsLmNvbG9yLmcsIG1hdGVyaWFsLmNvbG9yLmIgKTtcblxuXHRcdFx0Z2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5yb3RhdGlvbiwgbWF0ZXJpYWwucm90YXRpb24gKTtcblx0XHRcdGdsLnVuaWZvcm0yZnYoIHVuaWZvcm1zLmNlbnRlciwgY2VudGVyICk7XG5cdFx0XHRnbC51bmlmb3JtMmZ2KCB1bmlmb3Jtcy5zY2FsZSwgc2NhbGUgKTtcblxuXHRcdFx0c3RhdGUuc2V0QmxlbmRpbmcoIG1hdGVyaWFsLmJsZW5kaW5nLCBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uLCBtYXRlcmlhbC5ibGVuZFNyYywgbWF0ZXJpYWwuYmxlbmREc3QsIG1hdGVyaWFsLmJsZW5kRXF1YXRpb25BbHBoYSwgbWF0ZXJpYWwuYmxlbmRTcmNBbHBoYSwgbWF0ZXJpYWwuYmxlbmREc3RBbHBoYSwgbWF0ZXJpYWwucHJlbXVsdGlwbGllZEFscGhhICk7XG5cdFx0XHRzdGF0ZS5idWZmZXJzLmRlcHRoLnNldFRlc3QoIG1hdGVyaWFsLmRlcHRoVGVzdCApO1xuXHRcdFx0c3RhdGUuYnVmZmVycy5kZXB0aC5zZXRNYXNrKCBtYXRlcmlhbC5kZXB0aFdyaXRlICk7XG5cdFx0XHRzdGF0ZS5idWZmZXJzLmNvbG9yLnNldE1hc2soIG1hdGVyaWFsLmNvbG9yV3JpdGUgKTtcblxuXHRcdFx0dGV4dHVyZXMuc2V0VGV4dHVyZTJEKCBtYXRlcmlhbC5tYXAgfHwgdGV4dHVyZSwgMCApO1xuXG5cdFx0XHRnbC5kcmF3RWxlbWVudHMoIGdsLlRSSUFOR0xFUywgNiwgZ2wuVU5TSUdORURfU0hPUlQsIDAgKTtcblxuXHRcdFx0c3ByaXRlLm9uQWZ0ZXJSZW5kZXIoIHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhLCB1bmRlZmluZWQsIG1hdGVyaWFsLCB1bmRlZmluZWQgKTtcblxuXHRcdH1cblxuXHRcdC8vIHJlc3RvcmUgZ2xcblxuXHRcdHN0YXRlLmVuYWJsZSggZ2wuQ1VMTF9GQUNFICk7XG5cblx0XHRzdGF0ZS5yZXNldCgpO1xuXG5cdH07XG5cblx0ZnVuY3Rpb24gY3JlYXRlUHJvZ3JhbSgpIHtcblxuXHRcdHZhciBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpO1xuXG5cdFx0dmFyIHZlcnRleFNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlciggZ2wuVkVSVEVYX1NIQURFUiApO1xuXHRcdHZhciBmcmFnbWVudFNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlciggZ2wuRlJBR01FTlRfU0hBREVSICk7XG5cblx0XHRnbC5zaGFkZXJTb3VyY2UoIHZlcnRleFNoYWRlciwgW1xuXG5cdFx0XHQncHJlY2lzaW9uICcgKyBjYXBhYmlsaXRpZXMucHJlY2lzaW9uICsgJyBmbG9hdDsnLFxuXG5cdFx0XHQnI2RlZmluZSBTSEFERVJfTkFNRSAnICsgJ1Nwcml0ZU1hdGVyaWFsJyxcblxuXHRcdFx0J3VuaWZvcm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gZmxvYXQgcm90YXRpb247Jyxcblx0XHRcdCd1bmlmb3JtIHZlYzIgY2VudGVyOycsXG5cdFx0XHQndW5pZm9ybSB2ZWMyIHNjYWxlOycsXG5cdFx0XHQndW5pZm9ybSB2ZWMyIHV2T2Zmc2V0OycsXG5cdFx0XHQndW5pZm9ybSB2ZWMyIHV2U2NhbGU7JyxcblxuXHRcdFx0J2F0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uOycsXG5cdFx0XHQnYXR0cmlidXRlIHZlYzIgdXY7JyxcblxuXHRcdFx0J3ZhcnlpbmcgdmVjMiB2VVY7Jyxcblx0XHRcdCd2YXJ5aW5nIGZsb2F0IGZvZ0RlcHRoOycsXG5cblx0XHRcdCd2b2lkIG1haW4oKSB7JyxcblxuXHRcdFx0J1x0dlVWID0gdXZPZmZzZXQgKyB1diAqIHV2U2NhbGU7JyxcblxuXHRcdFx0J1x0dmVjMiBhbGlnbmVkUG9zaXRpb24gPSAoIHBvc2l0aW9uIC0gY2VudGVyICkgKiBzY2FsZTsnLFxuXG5cdFx0XHQnXHR2ZWMyIHJvdGF0ZWRQb3NpdGlvbjsnLFxuXHRcdFx0J1x0cm90YXRlZFBvc2l0aW9uLnggPSBjb3MoIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCAtIHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55OycsXG5cdFx0XHQnXHRyb3RhdGVkUG9zaXRpb24ueSA9IHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi54ICsgY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnk7JyxcblxuXHRcdFx0J1x0dmVjNCBtdlBvc2l0aW9uOycsXG5cblx0XHRcdCdcdG12UG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKTsnLFxuXHRcdFx0J1x0bXZQb3NpdGlvbi54eSArPSByb3RhdGVkUG9zaXRpb247JyxcblxuXHRcdFx0J1x0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjsnLFxuXG5cdFx0XHQnXHRmb2dEZXB0aCA9IC0gbXZQb3NpdGlvbi56OycsXG5cblx0XHRcdCd9J1xuXG5cdFx0XS5qb2luKCAnXFxuJyApICk7XG5cblx0XHRnbC5zaGFkZXJTb3VyY2UoIGZyYWdtZW50U2hhZGVyLCBbXG5cblx0XHRcdCdwcmVjaXNpb24gJyArIGNhcGFiaWxpdGllcy5wcmVjaXNpb24gKyAnIGZsb2F0OycsXG5cblx0XHRcdCcjZGVmaW5lIFNIQURFUl9OQU1FICcgKyAnU3ByaXRlTWF0ZXJpYWwnLFxuXG5cdFx0XHQndW5pZm9ybSB2ZWMzIGNvbG9yOycsXG5cdFx0XHQndW5pZm9ybSBzYW1wbGVyMkQgbWFwOycsXG5cdFx0XHQndW5pZm9ybSBmbG9hdCBvcGFjaXR5OycsXG5cblx0XHRcdCd1bmlmb3JtIGludCBmb2dUeXBlOycsXG5cdFx0XHQndW5pZm9ybSB2ZWMzIGZvZ0NvbG9yOycsXG5cdFx0XHQndW5pZm9ybSBmbG9hdCBmb2dEZW5zaXR5OycsXG5cdFx0XHQndW5pZm9ybSBmbG9hdCBmb2dOZWFyOycsXG5cdFx0XHQndW5pZm9ybSBmbG9hdCBmb2dGYXI7Jyxcblx0XHRcdCd1bmlmb3JtIGZsb2F0IGFscGhhVGVzdDsnLFxuXG5cdFx0XHQndmFyeWluZyB2ZWMyIHZVVjsnLFxuXHRcdFx0J3ZhcnlpbmcgZmxvYXQgZm9nRGVwdGg7JyxcblxuXHRcdFx0J3ZvaWQgbWFpbigpIHsnLFxuXG5cdFx0XHQnXHR2ZWM0IHRleHR1cmUgPSB0ZXh0dXJlMkQoIG1hcCwgdlVWICk7JyxcblxuXHRcdFx0J1x0Z2xfRnJhZ0NvbG9yID0gdmVjNCggY29sb3IgKiB0ZXh0dXJlLnh5eiwgdGV4dHVyZS5hICogb3BhY2l0eSApOycsXG5cblx0XHRcdCdcdGlmICggZ2xfRnJhZ0NvbG9yLmEgPCBhbHBoYVRlc3QgKSBkaXNjYXJkOycsXG5cblx0XHRcdCdcdGlmICggZm9nVHlwZSA+IDAgKSB7JyxcblxuXHRcdFx0J1x0XHRmbG9hdCBmb2dGYWN0b3IgPSAwLjA7JyxcblxuXHRcdFx0J1x0XHRpZiAoIGZvZ1R5cGUgPT0gMSApIHsnLFxuXG5cdFx0XHQnXHRcdFx0Zm9nRmFjdG9yID0gc21vb3Roc3RlcCggZm9nTmVhciwgZm9nRmFyLCBmb2dEZXB0aCApOycsXG5cblx0XHRcdCdcdFx0fSBlbHNlIHsnLFxuXG5cdFx0XHQnXHRcdFx0Y29uc3QgZmxvYXQgTE9HMiA9IDEuNDQyNjk1OycsXG5cdFx0XHQnXHRcdFx0Zm9nRmFjdG9yID0gZXhwMiggLSBmb2dEZW5zaXR5ICogZm9nRGVuc2l0eSAqIGZvZ0RlcHRoICogZm9nRGVwdGggKiBMT0cyICk7Jyxcblx0XHRcdCdcdFx0XHRmb2dGYWN0b3IgPSAxLjAgLSBjbGFtcCggZm9nRmFjdG9yLCAwLjAsIDEuMCApOycsXG5cblx0XHRcdCdcdFx0fScsXG5cblx0XHRcdCdcdFx0Z2xfRnJhZ0NvbG9yLnJnYiA9IG1peCggZ2xfRnJhZ0NvbG9yLnJnYiwgZm9nQ29sb3IsIGZvZ0ZhY3RvciApOycsXG5cblx0XHRcdCdcdH0nLFxuXG5cdFx0XHQnfSdcblxuXHRcdF0uam9pbiggJ1xcbicgKSApO1xuXG5cdFx0Z2wuY29tcGlsZVNoYWRlciggdmVydGV4U2hhZGVyICk7XG5cdFx0Z2wuY29tcGlsZVNoYWRlciggZnJhZ21lbnRTaGFkZXIgKTtcblxuXHRcdGdsLmF0dGFjaFNoYWRlciggcHJvZ3JhbSwgdmVydGV4U2hhZGVyICk7XG5cdFx0Z2wuYXR0YWNoU2hhZGVyKCBwcm9ncmFtLCBmcmFnbWVudFNoYWRlciApO1xuXG5cdFx0Z2wubGlua1Byb2dyYW0oIHByb2dyYW0gKTtcblxuXHRcdHJldHVybiBwcm9ncmFtO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBwYWludGVyU29ydFN0YWJsZSggYSwgYiApIHtcblxuXHRcdGlmICggYS5yZW5kZXJPcmRlciAhPT0gYi5yZW5kZXJPcmRlciApIHtcblxuXHRcdFx0cmV0dXJuIGEucmVuZGVyT3JkZXIgLSBiLnJlbmRlck9yZGVyO1xuXG5cdFx0fSBlbHNlIGlmICggYS56ICE9PSBiLnogKSB7XG5cblx0XHRcdHJldHVybiBiLnogLSBhLno7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZXR1cm4gYi5pZCAtIGEuaWQ7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFN0YXRlKCBnbCwgZXh0ZW5zaW9ucywgdXRpbHMgKSB7XG5cblx0ZnVuY3Rpb24gQ29sb3JCdWZmZXIoKSB7XG5cblx0XHR2YXIgbG9ja2VkID0gZmFsc2U7XG5cblx0XHR2YXIgY29sb3IgPSBuZXcgVmVjdG9yNCgpO1xuXHRcdHZhciBjdXJyZW50Q29sb3JNYXNrID0gbnVsbDtcblx0XHR2YXIgY3VycmVudENvbG9yQ2xlYXIgPSBuZXcgVmVjdG9yNCggMCwgMCwgMCwgMCApO1xuXG5cdFx0cmV0dXJuIHtcblxuXHRcdFx0c2V0TWFzazogZnVuY3Rpb24gKCBjb2xvck1hc2sgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50Q29sb3JNYXNrICE9PSBjb2xvck1hc2sgJiYgISBsb2NrZWQgKSB7XG5cblx0XHRcdFx0XHRnbC5jb2xvck1hc2soIGNvbG9yTWFzaywgY29sb3JNYXNrLCBjb2xvck1hc2ssIGNvbG9yTWFzayApO1xuXHRcdFx0XHRcdGN1cnJlbnRDb2xvck1hc2sgPSBjb2xvck1hc2s7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRMb2NrZWQ6IGZ1bmN0aW9uICggbG9jayApIHtcblxuXHRcdFx0XHRsb2NrZWQgPSBsb2NrO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRDbGVhcjogZnVuY3Rpb24gKCByLCBnLCBiLCBhLCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XG5cblx0XHRcdFx0aWYgKCBwcmVtdWx0aXBsaWVkQWxwaGEgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHRyICo9IGE7IGcgKj0gYTsgYiAqPSBhO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb2xvci5zZXQoIHIsIGcsIGIsIGEgKTtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnRDb2xvckNsZWFyLmVxdWFscyggY29sb3IgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0XHRnbC5jbGVhckNvbG9yKCByLCBnLCBiLCBhICk7XG5cdFx0XHRcdFx0Y3VycmVudENvbG9yQ2xlYXIuY29weSggY29sb3IgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHJlc2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0bG9ja2VkID0gZmFsc2U7XG5cblx0XHRcdFx0Y3VycmVudENvbG9yTWFzayA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRDb2xvckNsZWFyLnNldCggLSAxLCAwLCAwLCAwICk7IC8vIHNldCB0byBpbnZhbGlkIHN0YXRlXG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fVxuXG5cdGZ1bmN0aW9uIERlcHRoQnVmZmVyKCkge1xuXG5cdFx0dmFyIGxvY2tlZCA9IGZhbHNlO1xuXG5cdFx0dmFyIGN1cnJlbnREZXB0aE1hc2sgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50RGVwdGhGdW5jID0gbnVsbDtcblx0XHR2YXIgY3VycmVudERlcHRoQ2xlYXIgPSBudWxsO1xuXG5cdFx0cmV0dXJuIHtcblxuXHRcdFx0c2V0VGVzdDogZnVuY3Rpb24gKCBkZXB0aFRlc3QgKSB7XG5cblx0XHRcdFx0aWYgKCBkZXB0aFRlc3QgKSB7XG5cblx0XHRcdFx0XHRlbmFibGUoIGdsLkRFUFRIX1RFU1QgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0ZGlzYWJsZSggZ2wuREVQVEhfVEVTVCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0TWFzazogZnVuY3Rpb24gKCBkZXB0aE1hc2sgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50RGVwdGhNYXNrICE9PSBkZXB0aE1hc2sgJiYgISBsb2NrZWQgKSB7XG5cblx0XHRcdFx0XHRnbC5kZXB0aE1hc2soIGRlcHRoTWFzayApO1xuXHRcdFx0XHRcdGN1cnJlbnREZXB0aE1hc2sgPSBkZXB0aE1hc2s7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRGdW5jOiBmdW5jdGlvbiAoIGRlcHRoRnVuYyApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnREZXB0aEZ1bmMgIT09IGRlcHRoRnVuYyApIHtcblxuXHRcdFx0XHRcdGlmICggZGVwdGhGdW5jICkge1xuXG5cdFx0XHRcdFx0XHRzd2l0Y2ggKCBkZXB0aEZ1bmMgKSB7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSBOZXZlckRlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5ORVZFUiApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgQWx3YXlzRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkFMV0FZUyApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgTGVzc0RlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5MRVNTICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSBMZXNzRXF1YWxEZXB0aDpcblxuXHRcdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuTEVRVUFMICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSBFcXVhbERlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5FUVVBTCApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgR3JlYXRlckVxdWFsRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkdFUVVBTCApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgR3JlYXRlckRlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5HUkVBVEVSICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSBOb3RFcXVhbERlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5OT1RFUVVBTCApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkxFUVVBTCApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkxFUVVBTCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y3VycmVudERlcHRoRnVuYyA9IGRlcHRoRnVuYztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldExvY2tlZDogZnVuY3Rpb24gKCBsb2NrICkge1xuXG5cdFx0XHRcdGxvY2tlZCA9IGxvY2s7XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldENsZWFyOiBmdW5jdGlvbiAoIGRlcHRoICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudERlcHRoQ2xlYXIgIT09IGRlcHRoICkge1xuXG5cdFx0XHRcdFx0Z2wuY2xlYXJEZXB0aCggZGVwdGggKTtcblx0XHRcdFx0XHRjdXJyZW50RGVwdGhDbGVhciA9IGRlcHRoO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0cmVzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRsb2NrZWQgPSBmYWxzZTtcblxuXHRcdFx0XHRjdXJyZW50RGVwdGhNYXNrID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudERlcHRoRnVuYyA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnREZXB0aENsZWFyID0gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gU3RlbmNpbEJ1ZmZlcigpIHtcblxuXHRcdHZhciBsb2NrZWQgPSBmYWxzZTtcblxuXHRcdHZhciBjdXJyZW50U3RlbmNpbE1hc2sgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbEZ1bmMgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbFJlZiA9IG51bGw7XG5cdFx0dmFyIGN1cnJlbnRTdGVuY2lsRnVuY01hc2sgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbEZhaWwgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbFpGYWlsID0gbnVsbDtcblx0XHR2YXIgY3VycmVudFN0ZW5jaWxaUGFzcyA9IG51bGw7XG5cdFx0dmFyIGN1cnJlbnRTdGVuY2lsQ2xlYXIgPSBudWxsO1xuXG5cdFx0cmV0dXJuIHtcblxuXHRcdFx0c2V0VGVzdDogZnVuY3Rpb24gKCBzdGVuY2lsVGVzdCApIHtcblxuXHRcdFx0XHRpZiAoIHN0ZW5jaWxUZXN0ICkge1xuXG5cdFx0XHRcdFx0ZW5hYmxlKCBnbC5TVEVOQ0lMX1RFU1QgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0ZGlzYWJsZSggZ2wuU1RFTkNJTF9URVNUICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRNYXNrOiBmdW5jdGlvbiAoIHN0ZW5jaWxNYXNrICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudFN0ZW5jaWxNYXNrICE9PSBzdGVuY2lsTWFzayAmJiAhIGxvY2tlZCApIHtcblxuXHRcdFx0XHRcdGdsLnN0ZW5jaWxNYXNrKCBzdGVuY2lsTWFzayApO1xuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsTWFzayA9IHN0ZW5jaWxNYXNrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0RnVuYzogZnVuY3Rpb24gKCBzdGVuY2lsRnVuYywgc3RlbmNpbFJlZiwgc3RlbmNpbE1hc2sgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50U3RlbmNpbEZ1bmMgIT09IHN0ZW5jaWxGdW5jIHx8XG5cdFx0XHRcdCAgICAgY3VycmVudFN0ZW5jaWxSZWYgXHQhPT0gc3RlbmNpbFJlZiBcdHx8XG5cdFx0XHRcdCAgICAgY3VycmVudFN0ZW5jaWxGdW5jTWFzayAhPT0gc3RlbmNpbE1hc2sgKSB7XG5cblx0XHRcdFx0XHRnbC5zdGVuY2lsRnVuYyggc3RlbmNpbEZ1bmMsIHN0ZW5jaWxSZWYsIHN0ZW5jaWxNYXNrICk7XG5cblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbEZ1bmMgPSBzdGVuY2lsRnVuYztcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbFJlZiA9IHN0ZW5jaWxSZWY7XG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGdW5jTWFzayA9IHN0ZW5jaWxNYXNrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0T3A6IGZ1bmN0aW9uICggc3RlbmNpbEZhaWwsIHN0ZW5jaWxaRmFpbCwgc3RlbmNpbFpQYXNzICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudFN0ZW5jaWxGYWlsXHQgIT09IHN0ZW5jaWxGYWlsIFx0fHxcblx0XHRcdFx0ICAgICBjdXJyZW50U3RlbmNpbFpGYWlsICE9PSBzdGVuY2lsWkZhaWwgfHxcblx0XHRcdFx0ICAgICBjdXJyZW50U3RlbmNpbFpQYXNzICE9PSBzdGVuY2lsWlBhc3MgKSB7XG5cblx0XHRcdFx0XHRnbC5zdGVuY2lsT3AoIHN0ZW5jaWxGYWlsLCBzdGVuY2lsWkZhaWwsIHN0ZW5jaWxaUGFzcyApO1xuXG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGYWlsID0gc3RlbmNpbEZhaWw7XG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxaRmFpbCA9IHN0ZW5jaWxaRmFpbDtcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbFpQYXNzID0gc3RlbmNpbFpQYXNzO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0TG9ja2VkOiBmdW5jdGlvbiAoIGxvY2sgKSB7XG5cblx0XHRcdFx0bG9ja2VkID0gbG9jaztcblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0Q2xlYXI6IGZ1bmN0aW9uICggc3RlbmNpbCApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnRTdGVuY2lsQ2xlYXIgIT09IHN0ZW5jaWwgKSB7XG5cblx0XHRcdFx0XHRnbC5jbGVhclN0ZW5jaWwoIHN0ZW5jaWwgKTtcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbENsZWFyID0gc3RlbmNpbDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHJlc2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0bG9ja2VkID0gZmFsc2U7XG5cblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxNYXNrID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGdW5jID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxSZWYgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50U3RlbmNpbEZ1bmNNYXNrID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGYWlsID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxaRmFpbCA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsWlBhc3MgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50U3RlbmNpbENsZWFyID0gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9XG5cblx0Ly9cblxuXHR2YXIgY29sb3JCdWZmZXIgPSBuZXcgQ29sb3JCdWZmZXIoKTtcblx0dmFyIGRlcHRoQnVmZmVyID0gbmV3IERlcHRoQnVmZmVyKCk7XG5cdHZhciBzdGVuY2lsQnVmZmVyID0gbmV3IFN0ZW5jaWxCdWZmZXIoKTtcblxuXHR2YXIgbWF4VmVydGV4QXR0cmlidXRlcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1ZFUlRFWF9BVFRSSUJTICk7XG5cdHZhciBuZXdBdHRyaWJ1dGVzID0gbmV3IFVpbnQ4QXJyYXkoIG1heFZlcnRleEF0dHJpYnV0ZXMgKTtcblx0dmFyIGVuYWJsZWRBdHRyaWJ1dGVzID0gbmV3IFVpbnQ4QXJyYXkoIG1heFZlcnRleEF0dHJpYnV0ZXMgKTtcblx0dmFyIGF0dHJpYnV0ZURpdmlzb3JzID0gbmV3IFVpbnQ4QXJyYXkoIG1heFZlcnRleEF0dHJpYnV0ZXMgKTtcblxuXHR2YXIgY2FwYWJpbGl0aWVzID0ge307XG5cblx0dmFyIGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyA9IG51bGw7XG5cblx0dmFyIGN1cnJlbnRQcm9ncmFtID0gbnVsbDtcblxuXHR2YXIgY3VycmVudEJsZW5kaW5nID0gbnVsbDtcblx0dmFyIGN1cnJlbnRCbGVuZEVxdWF0aW9uID0gbnVsbDtcblx0dmFyIGN1cnJlbnRCbGVuZFNyYyA9IG51bGw7XG5cdHZhciBjdXJyZW50QmxlbmREc3QgPSBudWxsO1xuXHR2YXIgY3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSA9IG51bGw7XG5cdHZhciBjdXJyZW50QmxlbmRTcmNBbHBoYSA9IG51bGw7XG5cdHZhciBjdXJyZW50QmxlbmREc3RBbHBoYSA9IG51bGw7XG5cdHZhciBjdXJyZW50UHJlbXVsdGlwbGVkQWxwaGEgPSBmYWxzZTtcblxuXHR2YXIgY3VycmVudEZsaXBTaWRlZCA9IG51bGw7XG5cdHZhciBjdXJyZW50Q3VsbEZhY2UgPSBudWxsO1xuXG5cdHZhciBjdXJyZW50TGluZVdpZHRoID0gbnVsbDtcblxuXHR2YXIgY3VycmVudFBvbHlnb25PZmZzZXRGYWN0b3IgPSBudWxsO1xuXHR2YXIgY3VycmVudFBvbHlnb25PZmZzZXRVbml0cyA9IG51bGw7XG5cblx0dmFyIG1heFRleHR1cmVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUyApO1xuXG5cdHZhciBsaW5lV2lkdGhBdmFpbGFibGUgPSBmYWxzZTtcblx0dmFyIHZlcnNpb24gPSAwO1xuXHR2YXIgZ2xWZXJzaW9uID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5WRVJTSU9OICk7XG5cblx0aWYgKCBnbFZlcnNpb24uaW5kZXhPZiggJ1dlYkdMJyApICE9PSAtIDEgKSB7XG5cblx0XHR2ZXJzaW9uID0gcGFyc2VGbG9hdCggL15XZWJHTFxcIChbMC05XSkvLmV4ZWMoIGdsVmVyc2lvbiApWyAxIF0gKTtcblx0XHRsaW5lV2lkdGhBdmFpbGFibGUgPSAoIHZlcnNpb24gPj0gMS4wICk7XG5cblx0fSBlbHNlIGlmICggZ2xWZXJzaW9uLmluZGV4T2YoICdPcGVuR0wgRVMnICkgIT09IC0gMSApIHtcblxuXHRcdHZlcnNpb24gPSBwYXJzZUZsb2F0KCAvXk9wZW5HTFxcIEVTXFwgKFswLTldKS8uZXhlYyggZ2xWZXJzaW9uIClbIDEgXSApO1xuXHRcdGxpbmVXaWR0aEF2YWlsYWJsZSA9ICggdmVyc2lvbiA+PSAyLjAgKTtcblxuXHR9XG5cblx0dmFyIGN1cnJlbnRUZXh0dXJlU2xvdCA9IG51bGw7XG5cdHZhciBjdXJyZW50Qm91bmRUZXh0dXJlcyA9IHt9O1xuXG5cdHZhciBjdXJyZW50U2Npc3NvciA9IG5ldyBWZWN0b3I0KCk7XG5cdHZhciBjdXJyZW50Vmlld3BvcnQgPSBuZXcgVmVjdG9yNCgpO1xuXG5cdGZ1bmN0aW9uIGNyZWF0ZVRleHR1cmUoIHR5cGUsIHRhcmdldCwgY291bnQgKSB7XG5cblx0XHR2YXIgZGF0YSA9IG5ldyBVaW50OEFycmF5KCA0ICk7IC8vIDQgaXMgcmVxdWlyZWQgdG8gbWF0Y2ggZGVmYXVsdCB1bnBhY2sgYWxpZ25tZW50IG9mIDQuXG5cdFx0dmFyIHRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG5cblx0XHRnbC5iaW5kVGV4dHVyZSggdHlwZSwgdGV4dHVyZSApO1xuXHRcdGdsLnRleFBhcmFtZXRlcmkoIHR5cGUsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCApO1xuXHRcdGdsLnRleFBhcmFtZXRlcmkoIHR5cGUsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgY291bnQ7IGkgKysgKSB7XG5cblx0XHRcdGdsLnRleEltYWdlMkQoIHRhcmdldCArIGksIDAsIGdsLlJHQkEsIDEsIDEsIDAsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGRhdGEgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH1cblxuXHR2YXIgZW1wdHlUZXh0dXJlcyA9IHt9O1xuXHRlbXB0eVRleHR1cmVzWyBnbC5URVhUVVJFXzJEIF0gPSBjcmVhdGVUZXh0dXJlKCBnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFXzJELCAxICk7XG5cdGVtcHR5VGV4dHVyZXNbIGdsLlRFWFRVUkVfQ1VCRV9NQVAgXSA9IGNyZWF0ZVRleHR1cmUoIGdsLlRFWFRVUkVfQ1VCRV9NQVAsIGdsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCwgNiApO1xuXG5cdC8vIGluaXRcblxuXHRjb2xvckJ1ZmZlci5zZXRDbGVhciggMCwgMCwgMCwgMSApO1xuXHRkZXB0aEJ1ZmZlci5zZXRDbGVhciggMSApO1xuXHRzdGVuY2lsQnVmZmVyLnNldENsZWFyKCAwICk7XG5cblx0ZW5hYmxlKCBnbC5ERVBUSF9URVNUICk7XG5cdGRlcHRoQnVmZmVyLnNldEZ1bmMoIExlc3NFcXVhbERlcHRoICk7XG5cblx0c2V0RmxpcFNpZGVkKCBmYWxzZSApO1xuXHRzZXRDdWxsRmFjZSggQ3VsbEZhY2VCYWNrICk7XG5cdGVuYWJsZSggZ2wuQ1VMTF9GQUNFICk7XG5cblx0ZW5hYmxlKCBnbC5CTEVORCApO1xuXHRzZXRCbGVuZGluZyggTm9ybWFsQmxlbmRpbmcgKTtcblxuXHQvL1xuXG5cdGZ1bmN0aW9uIGluaXRBdHRyaWJ1dGVzKCkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbmV3QXR0cmlidXRlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRuZXdBdHRyaWJ1dGVzWyBpIF0gPSAwO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBlbmFibGVBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHtcblxuXHRcdG5ld0F0dHJpYnV0ZXNbIGF0dHJpYnV0ZSBdID0gMTtcblxuXHRcdGlmICggZW5hYmxlZEF0dHJpYnV0ZXNbIGF0dHJpYnV0ZSBdID09PSAwICkge1xuXG5cdFx0XHRnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSggYXR0cmlidXRlICk7XG5cdFx0XHRlbmFibGVkQXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPSAxO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBhdHRyaWJ1dGVEaXZpc29yc1sgYXR0cmlidXRlIF0gIT09IDAgKSB7XG5cblx0XHRcdHZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7XG5cblx0XHRcdGV4dGVuc2lvbi52ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUoIGF0dHJpYnV0ZSwgMCApO1xuXHRcdFx0YXR0cmlidXRlRGl2aXNvcnNbIGF0dHJpYnV0ZSBdID0gMDtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvciggYXR0cmlidXRlLCBtZXNoUGVyQXR0cmlidXRlICkge1xuXG5cdFx0bmV3QXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPSAxO1xuXG5cdFx0aWYgKCBlbmFibGVkQXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPT09IDAgKSB7XG5cblx0XHRcdGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KCBhdHRyaWJ1dGUgKTtcblx0XHRcdGVuYWJsZWRBdHRyaWJ1dGVzWyBhdHRyaWJ1dGUgXSA9IDE7XG5cblx0XHR9XG5cblx0XHRpZiAoIGF0dHJpYnV0ZURpdmlzb3JzWyBhdHRyaWJ1dGUgXSAhPT0gbWVzaFBlckF0dHJpYnV0ZSApIHtcblxuXHRcdFx0dmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTtcblxuXHRcdFx0ZXh0ZW5zaW9uLnZlcnRleEF0dHJpYkRpdmlzb3JBTkdMRSggYXR0cmlidXRlLCBtZXNoUGVyQXR0cmlidXRlICk7XG5cdFx0XHRhdHRyaWJ1dGVEaXZpc29yc1sgYXR0cmlidXRlIF0gPSBtZXNoUGVyQXR0cmlidXRlO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNhYmxlVW51c2VkQXR0cmlidXRlcygpIHtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGVuYWJsZWRBdHRyaWJ1dGVzLmxlbmd0aDsgaSAhPT0gbDsgKysgaSApIHtcblxuXHRcdFx0aWYgKCBlbmFibGVkQXR0cmlidXRlc1sgaSBdICE9PSBuZXdBdHRyaWJ1dGVzWyBpIF0gKSB7XG5cblx0XHRcdFx0Z2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KCBpICk7XG5cdFx0XHRcdGVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGVuYWJsZSggaWQgKSB7XG5cblx0XHRpZiAoIGNhcGFiaWxpdGllc1sgaWQgXSAhPT0gdHJ1ZSApIHtcblxuXHRcdFx0Z2wuZW5hYmxlKCBpZCApO1xuXHRcdFx0Y2FwYWJpbGl0aWVzWyBpZCBdID0gdHJ1ZTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZGlzYWJsZSggaWQgKSB7XG5cblx0XHRpZiAoIGNhcGFiaWxpdGllc1sgaWQgXSAhPT0gZmFsc2UgKSB7XG5cblx0XHRcdGdsLmRpc2FibGUoIGlkICk7XG5cdFx0XHRjYXBhYmlsaXRpZXNbIGlkIF0gPSBmYWxzZTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkge1xuXG5cdFx0aWYgKCBjb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMgPT09IG51bGwgKSB7XG5cblx0XHRcdGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyA9IFtdO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApIHx8XG5cdFx0XHQgICAgIGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICkgfHxcblx0XHRcdCAgICAgZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMScgKSB8fFxuXHRcdFx0ICAgICBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9hc3RjJyApICkge1xuXG5cdFx0XHRcdHZhciBmb3JtYXRzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyApO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGZvcm1hdHMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0Y29tcHJlc3NlZFRleHR1cmVGb3JtYXRzLnB1c2goIGZvcm1hdHNbIGkgXSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cztcblxuXHR9XG5cblx0ZnVuY3Rpb24gdXNlUHJvZ3JhbSggcHJvZ3JhbSApIHtcblxuXHRcdGlmICggY3VycmVudFByb2dyYW0gIT09IHByb2dyYW0gKSB7XG5cblx0XHRcdGdsLnVzZVByb2dyYW0oIHByb2dyYW0gKTtcblxuXHRcdFx0Y3VycmVudFByb2dyYW0gPSBwcm9ncmFtO1xuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0QmxlbmRpbmcoIGJsZW5kaW5nLCBibGVuZEVxdWF0aW9uLCBibGVuZFNyYywgYmxlbmREc3QsIGJsZW5kRXF1YXRpb25BbHBoYSwgYmxlbmRTcmNBbHBoYSwgYmxlbmREc3RBbHBoYSwgcHJlbXVsdGlwbGllZEFscGhhICkge1xuXG5cdFx0aWYgKCBibGVuZGluZyAhPT0gTm9CbGVuZGluZyApIHtcblxuXHRcdFx0ZW5hYmxlKCBnbC5CTEVORCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZGlzYWJsZSggZ2wuQkxFTkQgKTtcblxuXHRcdH1cblxuXHRcdGlmICggYmxlbmRpbmcgIT09IEN1c3RvbUJsZW5kaW5nICkge1xuXG5cdFx0XHRpZiAoIGJsZW5kaW5nICE9PSBjdXJyZW50QmxlbmRpbmcgfHwgcHJlbXVsdGlwbGllZEFscGhhICE9PSBjdXJyZW50UHJlbXVsdGlwbGVkQWxwaGEgKSB7XG5cblx0XHRcdFx0c3dpdGNoICggYmxlbmRpbmcgKSB7XG5cblx0XHRcdFx0XHRjYXNlIEFkZGl0aXZlQmxlbmRpbmc6XG5cblx0XHRcdFx0XHRcdGlmICggcHJlbXVsdGlwbGllZEFscGhhICkge1xuXG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRXF1YXRpb25TZXBhcmF0ZSggZ2wuRlVOQ19BREQsIGdsLkZVTkNfQUREICk7XG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCBnbC5PTkUsIGdsLk9ORSwgZ2wuT05FLCBnbC5PTkUgKTtcblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uKCBnbC5GVU5DX0FERCApO1xuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmMoIGdsLlNSQ19BTFBIQSwgZ2wuT05FICk7XG5cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSBTdWJ0cmFjdGl2ZUJsZW5kaW5nOlxuXG5cdFx0XHRcdFx0XHRpZiAoIHByZW11bHRpcGxpZWRBbHBoYSApIHtcblxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIGdsLkZVTkNfQURELCBnbC5GVU5DX0FERCApO1xuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuWkVSTywgZ2wuWkVSTywgZ2wuT05FX01JTlVTX1NSQ19DT0xPUiwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSApO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRXF1YXRpb24oIGdsLkZVTkNfQUREICk7XG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuYyggZ2wuWkVSTywgZ2wuT05FX01JTlVTX1NSQ19DT0xPUiApO1xuXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgTXVsdGlwbHlCbGVuZGluZzpcblxuXHRcdFx0XHRcdFx0aWYgKCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XG5cblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCBnbC5GVU5DX0FERCwgZ2wuRlVOQ19BREQgKTtcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIGdsLlpFUk8sIGdsLlNSQ19DT0xPUiwgZ2wuWkVSTywgZ2wuU1JDX0FMUEhBICk7XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvbiggZ2wuRlVOQ19BREQgKTtcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jKCBnbC5aRVJPLCBnbC5TUkNfQ09MT1IgKTtcblxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRkZWZhdWx0OlxuXG5cdFx0XHRcdFx0XHRpZiAoIHByZW11bHRpcGxpZWRBbHBoYSApIHtcblxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIGdsLkZVTkNfQURELCBnbC5GVU5DX0FERCApO1xuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBLCBnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEgKTtcblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIGdsLkZVTkNfQURELCBnbC5GVU5DX0FERCApO1xuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuU1JDX0FMUEhBLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBLCBnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50QmxlbmRFcXVhdGlvbiA9IG51bGw7XG5cdFx0XHRjdXJyZW50QmxlbmRTcmMgPSBudWxsO1xuXHRcdFx0Y3VycmVudEJsZW5kRHN0ID0gbnVsbDtcblx0XHRcdGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgPSBudWxsO1xuXHRcdFx0Y3VycmVudEJsZW5kU3JjQWxwaGEgPSBudWxsO1xuXHRcdFx0Y3VycmVudEJsZW5kRHN0QWxwaGEgPSBudWxsO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0YmxlbmRFcXVhdGlvbkFscGhhID0gYmxlbmRFcXVhdGlvbkFscGhhIHx8IGJsZW5kRXF1YXRpb247XG5cdFx0XHRibGVuZFNyY0FscGhhID0gYmxlbmRTcmNBbHBoYSB8fCBibGVuZFNyYztcblx0XHRcdGJsZW5kRHN0QWxwaGEgPSBibGVuZERzdEFscGhhIHx8IGJsZW5kRHN0O1xuXG5cdFx0XHRpZiAoIGJsZW5kRXF1YXRpb24gIT09IGN1cnJlbnRCbGVuZEVxdWF0aW9uIHx8IGJsZW5kRXF1YXRpb25BbHBoYSAhPT0gY3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSApIHtcblxuXHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIHV0aWxzLmNvbnZlcnQoIGJsZW5kRXF1YXRpb24gKSwgdXRpbHMuY29udmVydCggYmxlbmRFcXVhdGlvbkFscGhhICkgKTtcblxuXHRcdFx0XHRjdXJyZW50QmxlbmRFcXVhdGlvbiA9IGJsZW5kRXF1YXRpb247XG5cdFx0XHRcdGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgPSBibGVuZEVxdWF0aW9uQWxwaGE7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBibGVuZFNyYyAhPT0gY3VycmVudEJsZW5kU3JjIHx8IGJsZW5kRHN0ICE9PSBjdXJyZW50QmxlbmREc3QgfHwgYmxlbmRTcmNBbHBoYSAhPT0gY3VycmVudEJsZW5kU3JjQWxwaGEgfHwgYmxlbmREc3RBbHBoYSAhPT0gY3VycmVudEJsZW5kRHN0QWxwaGEgKSB7XG5cblx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIHV0aWxzLmNvbnZlcnQoIGJsZW5kU3JjICksIHV0aWxzLmNvbnZlcnQoIGJsZW5kRHN0ICksIHV0aWxzLmNvbnZlcnQoIGJsZW5kU3JjQWxwaGEgKSwgdXRpbHMuY29udmVydCggYmxlbmREc3RBbHBoYSApICk7XG5cblx0XHRcdFx0Y3VycmVudEJsZW5kU3JjID0gYmxlbmRTcmM7XG5cdFx0XHRcdGN1cnJlbnRCbGVuZERzdCA9IGJsZW5kRHN0O1xuXHRcdFx0XHRjdXJyZW50QmxlbmRTcmNBbHBoYSA9IGJsZW5kU3JjQWxwaGE7XG5cdFx0XHRcdGN1cnJlbnRCbGVuZERzdEFscGhhID0gYmxlbmREc3RBbHBoYTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Y3VycmVudEJsZW5kaW5nID0gYmxlbmRpbmc7XG5cdFx0Y3VycmVudFByZW11bHRpcGxlZEFscGhhID0gcHJlbXVsdGlwbGllZEFscGhhO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRNYXRlcmlhbCggbWF0ZXJpYWwsIGZyb250RmFjZUNXICkge1xuXG5cdFx0bWF0ZXJpYWwuc2lkZSA9PT0gRG91YmxlU2lkZVxuXHRcdFx0PyBkaXNhYmxlKCBnbC5DVUxMX0ZBQ0UgKVxuXHRcdFx0OiBlbmFibGUoIGdsLkNVTExfRkFDRSApO1xuXG5cdFx0dmFyIGZsaXBTaWRlZCA9ICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKTtcblx0XHRpZiAoIGZyb250RmFjZUNXICkgZmxpcFNpZGVkID0gISBmbGlwU2lkZWQ7XG5cblx0XHRzZXRGbGlwU2lkZWQoIGZsaXBTaWRlZCApO1xuXG5cdFx0bWF0ZXJpYWwudHJhbnNwYXJlbnQgPT09IHRydWVcblx0XHRcdD8gc2V0QmxlbmRpbmcoIG1hdGVyaWFsLmJsZW5kaW5nLCBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uLCBtYXRlcmlhbC5ibGVuZFNyYywgbWF0ZXJpYWwuYmxlbmREc3QsIG1hdGVyaWFsLmJsZW5kRXF1YXRpb25BbHBoYSwgbWF0ZXJpYWwuYmxlbmRTcmNBbHBoYSwgbWF0ZXJpYWwuYmxlbmREc3RBbHBoYSwgbWF0ZXJpYWwucHJlbXVsdGlwbGllZEFscGhhIClcblx0XHRcdDogc2V0QmxlbmRpbmcoIE5vQmxlbmRpbmcgKTtcblxuXHRcdGRlcHRoQnVmZmVyLnNldEZ1bmMoIG1hdGVyaWFsLmRlcHRoRnVuYyApO1xuXHRcdGRlcHRoQnVmZmVyLnNldFRlc3QoIG1hdGVyaWFsLmRlcHRoVGVzdCApO1xuXHRcdGRlcHRoQnVmZmVyLnNldE1hc2soIG1hdGVyaWFsLmRlcHRoV3JpdGUgKTtcblx0XHRjb2xvckJ1ZmZlci5zZXRNYXNrKCBtYXRlcmlhbC5jb2xvcldyaXRlICk7XG5cblx0XHRzZXRQb2x5Z29uT2Zmc2V0KCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0LCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0RmFjdG9yLCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0VW5pdHMgKTtcblxuXHR9XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBzZXRGbGlwU2lkZWQoIGZsaXBTaWRlZCApIHtcblxuXHRcdGlmICggY3VycmVudEZsaXBTaWRlZCAhPT0gZmxpcFNpZGVkICkge1xuXG5cdFx0XHRpZiAoIGZsaXBTaWRlZCApIHtcblxuXHRcdFx0XHRnbC5mcm9udEZhY2UoIGdsLkNXICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Z2wuZnJvbnRGYWNlKCBnbC5DQ1cgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50RmxpcFNpZGVkID0gZmxpcFNpZGVkO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRDdWxsRmFjZSggY3VsbEZhY2UgKSB7XG5cblx0XHRpZiAoIGN1bGxGYWNlICE9PSBDdWxsRmFjZU5vbmUgKSB7XG5cblx0XHRcdGVuYWJsZSggZ2wuQ1VMTF9GQUNFICk7XG5cblx0XHRcdGlmICggY3VsbEZhY2UgIT09IGN1cnJlbnRDdWxsRmFjZSApIHtcblxuXHRcdFx0XHRpZiAoIGN1bGxGYWNlID09PSBDdWxsRmFjZUJhY2sgKSB7XG5cblx0XHRcdFx0XHRnbC5jdWxsRmFjZSggZ2wuQkFDSyApO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGN1bGxGYWNlID09PSBDdWxsRmFjZUZyb250ICkge1xuXG5cdFx0XHRcdFx0Z2wuY3VsbEZhY2UoIGdsLkZST05UICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGdsLmN1bGxGYWNlKCBnbC5GUk9OVF9BTkRfQkFDSyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZGlzYWJsZSggZ2wuQ1VMTF9GQUNFICk7XG5cblx0XHR9XG5cblx0XHRjdXJyZW50Q3VsbEZhY2UgPSBjdWxsRmFjZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0TGluZVdpZHRoKCB3aWR0aCApIHtcblxuXHRcdGlmICggd2lkdGggIT09IGN1cnJlbnRMaW5lV2lkdGggKSB7XG5cblx0XHRcdGlmICggbGluZVdpZHRoQXZhaWxhYmxlICkgZ2wubGluZVdpZHRoKCB3aWR0aCApO1xuXG5cdFx0XHRjdXJyZW50TGluZVdpZHRoID0gd2lkdGg7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFBvbHlnb25PZmZzZXQoIHBvbHlnb25PZmZzZXQsIGZhY3RvciwgdW5pdHMgKSB7XG5cblx0XHRpZiAoIHBvbHlnb25PZmZzZXQgKSB7XG5cblx0XHRcdGVuYWJsZSggZ2wuUE9MWUdPTl9PRkZTRVRfRklMTCApO1xuXG5cdFx0XHRpZiAoIGN1cnJlbnRQb2x5Z29uT2Zmc2V0RmFjdG9yICE9PSBmYWN0b3IgfHwgY3VycmVudFBvbHlnb25PZmZzZXRVbml0cyAhPT0gdW5pdHMgKSB7XG5cblx0XHRcdFx0Z2wucG9seWdvbk9mZnNldCggZmFjdG9yLCB1bml0cyApO1xuXG5cdFx0XHRcdGN1cnJlbnRQb2x5Z29uT2Zmc2V0RmFjdG9yID0gZmFjdG9yO1xuXHRcdFx0XHRjdXJyZW50UG9seWdvbk9mZnNldFVuaXRzID0gdW5pdHM7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGRpc2FibGUoIGdsLlBPTFlHT05fT0ZGU0VUX0ZJTEwgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0U2Npc3NvclRlc3QoIHNjaXNzb3JUZXN0ICkge1xuXG5cdFx0aWYgKCBzY2lzc29yVGVzdCApIHtcblxuXHRcdFx0ZW5hYmxlKCBnbC5TQ0lTU09SX1RFU1QgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGRpc2FibGUoIGdsLlNDSVNTT1JfVEVTVCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyB0ZXh0dXJlXG5cblx0ZnVuY3Rpb24gYWN0aXZlVGV4dHVyZSggd2ViZ2xTbG90ICkge1xuXG5cdFx0aWYgKCB3ZWJnbFNsb3QgPT09IHVuZGVmaW5lZCApIHdlYmdsU2xvdCA9IGdsLlRFWFRVUkUwICsgbWF4VGV4dHVyZXMgLSAxO1xuXG5cdFx0aWYgKCBjdXJyZW50VGV4dHVyZVNsb3QgIT09IHdlYmdsU2xvdCApIHtcblxuXHRcdFx0Z2wuYWN0aXZlVGV4dHVyZSggd2ViZ2xTbG90ICk7XG5cdFx0XHRjdXJyZW50VGV4dHVyZVNsb3QgPSB3ZWJnbFNsb3Q7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGJpbmRUZXh0dXJlKCB3ZWJnbFR5cGUsIHdlYmdsVGV4dHVyZSApIHtcblxuXHRcdGlmICggY3VycmVudFRleHR1cmVTbG90ID09PSBudWxsICkge1xuXG5cdFx0XHRhY3RpdmVUZXh0dXJlKCk7XG5cblx0XHR9XG5cblx0XHR2YXIgYm91bmRUZXh0dXJlID0gY3VycmVudEJvdW5kVGV4dHVyZXNbIGN1cnJlbnRUZXh0dXJlU2xvdCBdO1xuXG5cdFx0aWYgKCBib3VuZFRleHR1cmUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ym91bmRUZXh0dXJlID0geyB0eXBlOiB1bmRlZmluZWQsIHRleHR1cmU6IHVuZGVmaW5lZCB9O1xuXHRcdFx0Y3VycmVudEJvdW5kVGV4dHVyZXNbIGN1cnJlbnRUZXh0dXJlU2xvdCBdID0gYm91bmRUZXh0dXJlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBib3VuZFRleHR1cmUudHlwZSAhPT0gd2ViZ2xUeXBlIHx8IGJvdW5kVGV4dHVyZS50ZXh0dXJlICE9PSB3ZWJnbFRleHR1cmUgKSB7XG5cblx0XHRcdGdsLmJpbmRUZXh0dXJlKCB3ZWJnbFR5cGUsIHdlYmdsVGV4dHVyZSB8fCBlbXB0eVRleHR1cmVzWyB3ZWJnbFR5cGUgXSApO1xuXG5cdFx0XHRib3VuZFRleHR1cmUudHlwZSA9IHdlYmdsVHlwZTtcblx0XHRcdGJvdW5kVGV4dHVyZS50ZXh0dXJlID0gd2ViZ2xUZXh0dXJlO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBjb21wcmVzc2VkVGV4SW1hZ2UyRCgpIHtcblxuXHRcdHRyeSB7XG5cblx0XHRcdGdsLmNvbXByZXNzZWRUZXhJbWFnZTJELmFwcGx5KCBnbCwgYXJndW1lbnRzICk7XG5cblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOicsIGVycm9yICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHRleEltYWdlMkQoKSB7XG5cblx0XHR0cnkge1xuXG5cdFx0XHRnbC50ZXhJbWFnZTJELmFwcGx5KCBnbCwgYXJndW1lbnRzICk7XG5cblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOicsIGVycm9yICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vXG5cblx0ZnVuY3Rpb24gc2Npc3Nvciggc2Npc3NvciApIHtcblxuXHRcdGlmICggY3VycmVudFNjaXNzb3IuZXF1YWxzKCBzY2lzc29yICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRnbC5zY2lzc29yKCBzY2lzc29yLngsIHNjaXNzb3IueSwgc2Npc3Nvci56LCBzY2lzc29yLncgKTtcblx0XHRcdGN1cnJlbnRTY2lzc29yLmNvcHkoIHNjaXNzb3IgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdmlld3BvcnQoIHZpZXdwb3J0ICkge1xuXG5cdFx0aWYgKCBjdXJyZW50Vmlld3BvcnQuZXF1YWxzKCB2aWV3cG9ydCApID09PSBmYWxzZSApIHtcblxuXHRcdFx0Z2wudmlld3BvcnQoIHZpZXdwb3J0LngsIHZpZXdwb3J0LnksIHZpZXdwb3J0LnosIHZpZXdwb3J0LncgKTtcblx0XHRcdGN1cnJlbnRWaWV3cG9ydC5jb3B5KCB2aWV3cG9ydCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvL1xuXG5cdGZ1bmN0aW9uIHJlc2V0KCkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZW5hYmxlZEF0dHJpYnV0ZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRpZiAoIGVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gPT09IDEgKSB7XG5cblx0XHRcdFx0Z2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KCBpICk7XG5cdFx0XHRcdGVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRjYXBhYmlsaXRpZXMgPSB7fTtcblxuXHRcdGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyA9IG51bGw7XG5cblx0XHRjdXJyZW50VGV4dHVyZVNsb3QgPSBudWxsO1xuXHRcdGN1cnJlbnRCb3VuZFRleHR1cmVzID0ge307XG5cblx0XHRjdXJyZW50UHJvZ3JhbSA9IG51bGw7XG5cblx0XHRjdXJyZW50QmxlbmRpbmcgPSBudWxsO1xuXG5cdFx0Y3VycmVudEZsaXBTaWRlZCA9IG51bGw7XG5cdFx0Y3VycmVudEN1bGxGYWNlID0gbnVsbDtcblxuXHRcdGNvbG9yQnVmZmVyLnJlc2V0KCk7XG5cdFx0ZGVwdGhCdWZmZXIucmVzZXQoKTtcblx0XHRzdGVuY2lsQnVmZmVyLnJlc2V0KCk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRidWZmZXJzOiB7XG5cdFx0XHRjb2xvcjogY29sb3JCdWZmZXIsXG5cdFx0XHRkZXB0aDogZGVwdGhCdWZmZXIsXG5cdFx0XHRzdGVuY2lsOiBzdGVuY2lsQnVmZmVyXG5cdFx0fSxcblxuXHRcdGluaXRBdHRyaWJ1dGVzOiBpbml0QXR0cmlidXRlcyxcblx0XHRlbmFibGVBdHRyaWJ1dGU6IGVuYWJsZUF0dHJpYnV0ZSxcblx0XHRlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yOiBlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yLFxuXHRcdGRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzOiBkaXNhYmxlVW51c2VkQXR0cmlidXRlcyxcblx0XHRlbmFibGU6IGVuYWJsZSxcblx0XHRkaXNhYmxlOiBkaXNhYmxlLFxuXHRcdGdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0czogZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzLFxuXG5cdFx0dXNlUHJvZ3JhbTogdXNlUHJvZ3JhbSxcblxuXHRcdHNldEJsZW5kaW5nOiBzZXRCbGVuZGluZyxcblx0XHRzZXRNYXRlcmlhbDogc2V0TWF0ZXJpYWwsXG5cblx0XHRzZXRGbGlwU2lkZWQ6IHNldEZsaXBTaWRlZCxcblx0XHRzZXRDdWxsRmFjZTogc2V0Q3VsbEZhY2UsXG5cblx0XHRzZXRMaW5lV2lkdGg6IHNldExpbmVXaWR0aCxcblx0XHRzZXRQb2x5Z29uT2Zmc2V0OiBzZXRQb2x5Z29uT2Zmc2V0LFxuXG5cdFx0c2V0U2Npc3NvclRlc3Q6IHNldFNjaXNzb3JUZXN0LFxuXG5cdFx0YWN0aXZlVGV4dHVyZTogYWN0aXZlVGV4dHVyZSxcblx0XHRiaW5kVGV4dHVyZTogYmluZFRleHR1cmUsXG5cdFx0Y29tcHJlc3NlZFRleEltYWdlMkQ6IGNvbXByZXNzZWRUZXhJbWFnZTJELFxuXHRcdHRleEltYWdlMkQ6IHRleEltYWdlMkQsXG5cblx0XHRzY2lzc29yOiBzY2lzc29yLFxuXHRcdHZpZXdwb3J0OiB2aWV3cG9ydCxcblxuXHRcdHJlc2V0OiByZXNldFxuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMVGV4dHVyZXMoIF9nbCwgZXh0ZW5zaW9ucywgc3RhdGUsIHByb3BlcnRpZXMsIGNhcGFiaWxpdGllcywgdXRpbHMsIGluZm8gKSB7XG5cblx0dmFyIF9pc1dlYkdMMiA9ICggdHlwZW9mIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgIT09ICd1bmRlZmluZWQnICYmIF9nbCBpbnN0YW5jZW9mIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgKTsgLyogZ2xvYmFsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgKi9cblx0dmFyIF92aWRlb1RleHR1cmVzID0ge307XG5cdHZhciBfY2FudmFzO1xuXG5cdC8vXG5cblx0ZnVuY3Rpb24gY2xhbXBUb01heFNpemUoIGltYWdlLCBtYXhTaXplICkge1xuXG5cdFx0aWYgKCBpbWFnZS53aWR0aCA+IG1heFNpemUgfHwgaW1hZ2UuaGVpZ2h0ID4gbWF4U2l6ZSApIHtcblxuXHRcdFx0aWYgKCAnZGF0YScgaW4gaW1hZ2UgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogaW1hZ2UgaW4gRGF0YVRleHR1cmUgaXMgdG9vIGJpZyAoJyArIGltYWdlLndpZHRoICsgJ3gnICsgaW1hZ2UuaGVpZ2h0ICsgJykuJyApO1xuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gV2FybmluZzogU2NhbGluZyB0aHJvdWdoIHRoZSBjYW52YXMgd2lsbCBvbmx5IHdvcmsgd2l0aCBpbWFnZXMgdGhhdCB1c2Vcblx0XHRcdC8vIHByZW11bHRpcGxpZWQgYWxwaGEuXG5cblx0XHRcdHZhciBzY2FsZSA9IG1heFNpemUgLyBNYXRoLm1heCggaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCApO1xuXG5cdFx0XHR2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdjYW52YXMnICk7XG5cdFx0XHRjYW52YXMud2lkdGggPSBNYXRoLmZsb29yKCBpbWFnZS53aWR0aCAqIHNjYWxlICk7XG5cdFx0XHRjYW52YXMuaGVpZ2h0ID0gTWF0aC5mbG9vciggaW1hZ2UuaGVpZ2h0ICogc2NhbGUgKTtcblxuXHRcdFx0dmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCggJzJkJyApO1xuXHRcdFx0Y29udGV4dC5kcmF3SW1hZ2UoIGltYWdlLCAwLCAwLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCAwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQgKTtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogaW1hZ2UgaXMgdG9vIGJpZyAoJyArIGltYWdlLndpZHRoICsgJ3gnICsgaW1hZ2UuaGVpZ2h0ICsgJykuIFJlc2l6ZWQgdG8gJyArIGNhbnZhcy53aWR0aCArICd4JyArIGNhbnZhcy5oZWlnaHQsIGltYWdlICk7XG5cblx0XHRcdHJldHVybiBjYW52YXM7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gaW1hZ2U7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGlzUG93ZXJPZlR3byggaW1hZ2UgKSB7XG5cblx0XHRyZXR1cm4gX01hdGguaXNQb3dlck9mVHdvKCBpbWFnZS53aWR0aCApICYmIF9NYXRoLmlzUG93ZXJPZlR3byggaW1hZ2UuaGVpZ2h0ICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIG1ha2VQb3dlck9mVHdvKCBpbWFnZSApIHtcblxuXHRcdGlmICggaW1hZ2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50IHx8IGltYWdlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgfHwgaW1hZ2UgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCApIHtcblxuXHRcdFx0aWYgKCBfY2FudmFzID09PSB1bmRlZmluZWQgKSBfY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdjYW52YXMnICk7XG5cblx0XHRcdF9jYW52YXMud2lkdGggPSBfTWF0aC5mbG9vclBvd2VyT2ZUd28oIGltYWdlLndpZHRoICk7XG5cdFx0XHRfY2FudmFzLmhlaWdodCA9IF9NYXRoLmZsb29yUG93ZXJPZlR3byggaW1hZ2UuaGVpZ2h0ICk7XG5cblx0XHRcdHZhciBjb250ZXh0ID0gX2NhbnZhcy5nZXRDb250ZXh0KCAnMmQnICk7XG5cdFx0XHRjb250ZXh0LmRyYXdJbWFnZSggaW1hZ2UsIDAsIDAsIF9jYW52YXMud2lkdGgsIF9jYW52YXMuaGVpZ2h0ICk7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IGltYWdlIGlzIG5vdCBwb3dlciBvZiB0d28gKCcgKyBpbWFnZS53aWR0aCArICd4JyArIGltYWdlLmhlaWdodCArICcpLiBSZXNpemVkIHRvICcgKyBfY2FudmFzLndpZHRoICsgJ3gnICsgX2NhbnZhcy5oZWlnaHQsIGltYWdlICk7XG5cblx0XHRcdHJldHVybiBfY2FudmFzO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGltYWdlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiB0ZXh0dXJlTmVlZHNQb3dlck9mVHdvKCB0ZXh0dXJlICkge1xuXG5cdFx0cmV0dXJuICggdGV4dHVyZS53cmFwUyAhPT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyB8fCB0ZXh0dXJlLndyYXBUICE9PSBDbGFtcFRvRWRnZVdyYXBwaW5nICkgfHxcblx0XHRcdCggdGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IExpbmVhckZpbHRlciApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUsIGlzUG93ZXJPZlR3byApIHtcblxuXHRcdHJldHVybiB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyAmJiBpc1Bvd2VyT2ZUd28gJiZcblx0XHRcdHRleHR1cmUubWluRmlsdGVyICE9PSBOZWFyZXN0RmlsdGVyICYmIHRleHR1cmUubWluRmlsdGVyICE9PSBMaW5lYXJGaWx0ZXI7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlTWlwbWFwKCB0YXJnZXQsIHRleHR1cmUsIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRfZ2wuZ2VuZXJhdGVNaXBtYXAoIHRhcmdldCApO1xuXG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcblxuXHRcdC8vIE5vdGU6IE1hdGgubG9nKCB4ICkgKiBNYXRoLkxPRzJFIHVzZWQgaW5zdGVhZCBvZiBNYXRoLmxvZzIoIHggKSB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIGJ5IElFMTFcblx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gTWF0aC5sb2coIE1hdGgubWF4KCB3aWR0aCwgaGVpZ2h0ICkgKSAqIE1hdGguTE9HMkU7XG5cblx0fVxuXG5cdC8vIEZhbGxiYWNrIGZpbHRlcnMgZm9yIG5vbi1wb3dlci1vZi0yIHRleHR1cmVzXG5cblx0ZnVuY3Rpb24gZmlsdGVyRmFsbGJhY2soIGYgKSB7XG5cblx0XHRpZiAoIGYgPT09IE5lYXJlc3RGaWx0ZXIgfHwgZiA9PT0gTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXIgfHwgZiA9PT0gTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciApIHtcblxuXHRcdFx0cmV0dXJuIF9nbC5ORUFSRVNUO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIF9nbC5MSU5FQVI7XG5cblx0fVxuXG5cdC8vXG5cblx0ZnVuY3Rpb24gb25UZXh0dXJlRGlzcG9zZSggZXZlbnQgKSB7XG5cblx0XHR2YXIgdGV4dHVyZSA9IGV2ZW50LnRhcmdldDtcblxuXHRcdHRleHR1cmUucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblRleHR1cmVEaXNwb3NlICk7XG5cblx0XHRkZWFsbG9jYXRlVGV4dHVyZSggdGV4dHVyZSApO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLmlzVmlkZW9UZXh0dXJlICkge1xuXG5cdFx0XHRkZWxldGUgX3ZpZGVvVGV4dHVyZXNbIHRleHR1cmUuaWQgXTtcblxuXHRcdH1cblxuXHRcdGluZm8ubWVtb3J5LnRleHR1cmVzIC0tO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBvblJlbmRlclRhcmdldERpc3Bvc2UoIGV2ZW50ICkge1xuXG5cdFx0dmFyIHJlbmRlclRhcmdldCA9IGV2ZW50LnRhcmdldDtcblxuXHRcdHJlbmRlclRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uUmVuZGVyVGFyZ2V0RGlzcG9zZSApO1xuXG5cdFx0ZGVhbGxvY2F0ZVJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRpbmZvLm1lbW9yeS50ZXh0dXJlcyAtLTtcblxuXHR9XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBkZWFsbG9jYXRlVGV4dHVyZSggdGV4dHVyZSApIHtcblxuXHRcdHZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICk7XG5cblx0XHRpZiAoIHRleHR1cmUuaW1hZ2UgJiYgdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSApIHtcblxuXHRcdFx0Ly8gY3ViZSB0ZXh0dXJlXG5cblx0XHRcdF9nbC5kZWxldGVUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcy5fX2ltYWdlX193ZWJnbFRleHR1cmVDdWJlICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyAyRCB0ZXh0dXJlXG5cblx0XHRcdGlmICggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbEluaXQgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdFx0X2dsLmRlbGV0ZVRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cblx0XHR9XG5cblx0XHQvLyByZW1vdmUgYWxsIHdlYmdsIHByb3BlcnRpZXNcblx0XHRwcm9wZXJ0aWVzLnJlbW92ZSggdGV4dHVyZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkZWFsbG9jYXRlUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHR2YXIgcmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKTtcblx0XHR2YXIgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKTtcblxuXHRcdGlmICggISByZW5kZXJUYXJnZXQgKSByZXR1cm47XG5cblx0XHRpZiAoIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdF9nbC5kZWxldGVUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICkge1xuXG5cdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmRpc3Bvc2UoKTtcblxuXHRcdH1cblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdF9nbC5kZWxldGVGcmFtZWJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSApO1xuXHRcdFx0XHRpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyICkgX2dsLmRlbGV0ZVJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXJbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfZ2wuZGVsZXRlRnJhbWVidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyICk7XG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyICkgX2dsLmRlbGV0ZVJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIgKTtcblxuXHRcdH1cblxuXHRcdHByb3BlcnRpZXMucmVtb3ZlKCByZW5kZXJUYXJnZXQudGV4dHVyZSApO1xuXHRcdHByb3BlcnRpZXMucmVtb3ZlKCByZW5kZXJUYXJnZXQgKTtcblxuXHR9XG5cblx0Ly9cblxuXG5cblx0ZnVuY3Rpb24gc2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcblxuXHRcdGlmICggdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSApIHVwZGF0ZVZpZGVvVGV4dHVyZSggdGV4dHVyZSApO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLnZlcnNpb24gPiAwICYmIHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiAhPT0gdGV4dHVyZS52ZXJzaW9uICkge1xuXG5cdFx0XHR2YXIgaW1hZ2UgPSB0ZXh0dXJlLmltYWdlO1xuXG5cdFx0XHRpZiAoIGltYWdlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBtYXJrZWQgZm9yIHVwZGF0ZSBidXQgaW1hZ2UgaXMgdW5kZWZpbmVkJywgdGV4dHVyZSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbWFnZS5jb21wbGV0ZSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBtYXJrZWQgZm9yIHVwZGF0ZSBidXQgaW1hZ2UgaXMgaW5jb21wbGV0ZScsIHRleHR1cmUgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR1cGxvYWRUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcywgdGV4dHVyZSwgc2xvdCApO1xuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIF9nbC5URVhUVVJFMCArIHNsb3QgKTtcblx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfMkQsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFRleHR1cmVDdWJlKCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcblxuXHRcdGlmICggdGV4dHVyZS5pbWFnZS5sZW5ndGggPT09IDYgKSB7XG5cblx0XHRcdGlmICggdGV4dHVyZS52ZXJzaW9uID4gMCAmJiB0ZXh0dXJlUHJvcGVydGllcy5fX3ZlcnNpb24gIT09IHRleHR1cmUudmVyc2lvbiApIHtcblxuXHRcdFx0XHRpZiAoICEgdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblRleHR1cmVEaXNwb3NlICk7XG5cblx0XHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX2ltYWdlX193ZWJnbFRleHR1cmVDdWJlID0gX2dsLmNyZWF0ZVRleHR1cmUoKTtcblxuXHRcdFx0XHRcdGluZm8ubWVtb3J5LnRleHR1cmVzICsrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCBfZ2wuVEVYVFVSRTAgKyBzbG90ICk7XG5cdFx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSApO1xuXG5cdFx0XHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19GTElQX1lfV0VCR0wsIHRleHR1cmUuZmxpcFkgKTtcblxuXHRcdFx0XHR2YXIgaXNDb21wcmVzc2VkID0gKCB0ZXh0dXJlICYmIHRleHR1cmUuaXNDb21wcmVzc2VkVGV4dHVyZSApO1xuXHRcdFx0XHR2YXIgaXNEYXRhVGV4dHVyZSA9ICggdGV4dHVyZS5pbWFnZVsgMCBdICYmIHRleHR1cmUuaW1hZ2VbIDAgXS5pc0RhdGFUZXh0dXJlICk7XG5cblx0XHRcdFx0dmFyIGN1YmVJbWFnZSA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRpZiAoICEgaXNDb21wcmVzc2VkICYmICEgaXNEYXRhVGV4dHVyZSApIHtcblxuXHRcdFx0XHRcdFx0Y3ViZUltYWdlWyBpIF0gPSBjbGFtcFRvTWF4U2l6ZSggdGV4dHVyZS5pbWFnZVsgaSBdLCBjYXBhYmlsaXRpZXMubWF4Q3ViZW1hcFNpemUgKTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGN1YmVJbWFnZVsgaSBdID0gaXNEYXRhVGV4dHVyZSA/IHRleHR1cmUuaW1hZ2VbIGkgXS5pbWFnZSA6IHRleHR1cmUuaW1hZ2VbIGkgXTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIGltYWdlID0gY3ViZUltYWdlWyAwIF0sXG5cdFx0XHRcdFx0aXNQb3dlck9mVHdvSW1hZ2UgPSBpc1Bvd2VyT2ZUd28oIGltYWdlICksXG5cdFx0XHRcdFx0Z2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLmZvcm1hdCApLFxuXHRcdFx0XHRcdGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUudHlwZSApO1xuXG5cdFx0XHRcdHNldFRleHR1cmVQYXJhbWV0ZXJzKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgdGV4dHVyZSwgaXNQb3dlck9mVHdvSW1hZ2UgKTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdFx0aWYgKCAhIGlzQ29tcHJlc3NlZCApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBpc0RhdGFUZXh0dXJlICkge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCAwLCBnbEZvcm1hdCwgY3ViZUltYWdlWyBpIF0ud2lkdGgsIGN1YmVJbWFnZVsgaSBdLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgY3ViZUltYWdlWyBpIF0uZGF0YSApO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCAwLCBnbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgY3ViZUltYWdlWyBpIF0gKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0dmFyIG1pcG1hcCwgbWlwbWFwcyA9IGN1YmVJbWFnZVsgaSBdLm1pcG1hcHM7XG5cblx0XHRcdFx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBtaXBtYXBzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdG1pcG1hcCA9IG1pcG1hcHNbIGogXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHRleHR1cmUuZm9ybWF0ICE9PSBSR0JBRm9ybWF0ICYmIHRleHR1cmUuZm9ybWF0ICE9PSBSR0JGb3JtYXQgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoIHN0YXRlLmdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0cygpLmluZGV4T2YoIGdsRm9ybWF0ICkgPiAtIDEgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdHN0YXRlLmNvbXByZXNzZWRUZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgaiwgZ2xGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgbWlwbWFwLmRhdGEgKTtcblxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC5zZXRUZXh0dXJlQ3ViZSgpJyApO1xuXG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgaiwgZ2xGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwLmRhdGEgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCAhIGlzQ29tcHJlc3NlZCApIHtcblxuXHRcdFx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSAwO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gbWlwbWFwcy5sZW5ndGggLSAxO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggdGV4dHVyZSwgaXNQb3dlck9mVHdvSW1hZ2UgKSApIHtcblxuXHRcdFx0XHRcdC8vIFdlIGFzc3VtZSBpbWFnZXMgZm9yIGN1YmUgbWFwIGhhdmUgdGhlIHNhbWUgc2l6ZS5cblx0XHRcdFx0XHRnZW5lcmF0ZU1pcG1hcCggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHRleHR1cmUsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX192ZXJzaW9uID0gdGV4dHVyZS52ZXJzaW9uO1xuXG5cdFx0XHRcdGlmICggdGV4dHVyZS5vblVwZGF0ZSApIHRleHR1cmUub25VcGRhdGUoIHRleHR1cmUgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCBfZ2wuVEVYVFVSRTAgKyBzbG90ICk7XG5cdFx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFRleHR1cmVDdWJlRHluYW1pYyggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIF9nbC5URVhUVVJFMCArIHNsb3QgKTtcblx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX193ZWJnbFRleHR1cmUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0VGV4dHVyZVBhcmFtZXRlcnMoIHRleHR1cmVUeXBlLCB0ZXh0dXJlLCBpc1Bvd2VyT2ZUd29JbWFnZSApIHtcblxuXHRcdHZhciBleHRlbnNpb247XG5cblx0XHRpZiAoIGlzUG93ZXJPZlR3b0ltYWdlICkge1xuXG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX1dSQVBfUywgdXRpbHMuY29udmVydCggdGV4dHVyZS53cmFwUyApICk7XG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX1dSQVBfVCwgdXRpbHMuY29udmVydCggdGV4dHVyZS53cmFwVCApICk7XG5cblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgdXRpbHMuY29udmVydCggdGV4dHVyZS5tYWdGaWx0ZXIgKSApO1xuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLm1pbkZpbHRlciApICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX1dSQVBfUywgX2dsLkNMQU1QX1RPX0VER0UgKTtcblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfV1JBUF9ULCBfZ2wuQ0xBTVBfVE9fRURHRSApO1xuXG5cdFx0XHRpZiAoIHRleHR1cmUud3JhcFMgIT09IENsYW1wVG9FZGdlV3JhcHBpbmcgfHwgdGV4dHVyZS53cmFwVCAhPT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUud3JhcFMgYW5kIFRleHR1cmUud3JhcFQgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5DbGFtcFRvRWRnZVdyYXBwaW5nLicsIHRleHR1cmUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX01BR19GSUxURVIsIGZpbHRlckZhbGxiYWNrKCB0ZXh0dXJlLm1hZ0ZpbHRlciApICk7XG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX01JTl9GSUxURVIsIGZpbHRlckZhbGxiYWNrKCB0ZXh0dXJlLm1pbkZpbHRlciApICk7XG5cblx0XHRcdGlmICggdGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IExpbmVhckZpbHRlciApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUubWluRmlsdGVyIHNob3VsZCBiZSBzZXQgdG8gVEhSRUUuTmVhcmVzdEZpbHRlciBvciBUSFJFRS5MaW5lYXJGaWx0ZXIuJywgdGV4dHVyZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKTtcblxuXHRcdGlmICggZXh0ZW5zaW9uICkge1xuXG5cdFx0XHRpZiAoIHRleHR1cmUudHlwZSA9PT0gRmxvYXRUeXBlICYmIGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyJyApID09PSBudWxsICkgcmV0dXJuO1xuXHRcdFx0aWYgKCB0ZXh0dXJlLnR5cGUgPT09IEhhbGZGbG9hdFR5cGUgJiYgZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhcicgKSA9PT0gbnVsbCApIHJldHVybjtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlLmFuaXNvdHJvcHkgPiAxIHx8IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX19jdXJyZW50QW5pc290cm9weSApIHtcblxuXHRcdFx0XHRfZ2wudGV4UGFyYW1ldGVyZiggdGV4dHVyZVR5cGUsIGV4dGVuc2lvbi5URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCwgTWF0aC5taW4oIHRleHR1cmUuYW5pc290cm9weSwgY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKSApICk7XG5cdFx0XHRcdHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX19jdXJyZW50QW5pc290cm9weSA9IHRleHR1cmUuYW5pc290cm9weTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiB1cGxvYWRUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcywgdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdGlmICggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbEluaXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbEluaXQgPSB0cnVlO1xuXG5cdFx0XHR0ZXh0dXJlLmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25UZXh0dXJlRGlzcG9zZSApO1xuXG5cdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSA9IF9nbC5jcmVhdGVUZXh0dXJlKCk7XG5cblx0XHRcdGluZm8ubWVtb3J5LnRleHR1cmVzICsrO1xuXG5cdFx0fVxuXG5cdFx0c3RhdGUuYWN0aXZlVGV4dHVyZSggX2dsLlRFWFRVUkUwICsgc2xvdCApO1xuXHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTtcblxuXHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19GTElQX1lfV0VCR0wsIHRleHR1cmUuZmxpcFkgKTtcblx0XHRfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIHRleHR1cmUucHJlbXVsdGlwbHlBbHBoYSApO1xuXHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19BTElHTk1FTlQsIHRleHR1cmUudW5wYWNrQWxpZ25tZW50ICk7XG5cblx0XHR2YXIgaW1hZ2UgPSBjbGFtcFRvTWF4U2l6ZSggdGV4dHVyZS5pbWFnZSwgY2FwYWJpbGl0aWVzLm1heFRleHR1cmVTaXplICk7XG5cblx0XHRpZiAoIHRleHR1cmVOZWVkc1Bvd2VyT2ZUd28oIHRleHR1cmUgKSAmJiBpc1Bvd2VyT2ZUd28oIGltYWdlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRpbWFnZSA9IG1ha2VQb3dlck9mVHdvKCBpbWFnZSApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGlzUG93ZXJPZlR3b0ltYWdlID0gaXNQb3dlck9mVHdvKCBpbWFnZSApLFxuXHRcdFx0Z2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLmZvcm1hdCApLFxuXHRcdFx0Z2xUeXBlID0gdXRpbHMuY29udmVydCggdGV4dHVyZS50eXBlICk7XG5cblx0XHRzZXRUZXh0dXJlUGFyYW1ldGVycyggX2dsLlRFWFRVUkVfMkQsIHRleHR1cmUsIGlzUG93ZXJPZlR3b0ltYWdlICk7XG5cblx0XHR2YXIgbWlwbWFwLCBtaXBtYXBzID0gdGV4dHVyZS5taXBtYXBzO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLmlzRGVwdGhUZXh0dXJlICkge1xuXG5cdFx0XHQvLyBwb3B1bGF0ZSBkZXB0aCB0ZXh0dXJlIHdpdGggZHVtbXkgZGF0YVxuXG5cdFx0XHR2YXIgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuREVQVEhfQ09NUE9ORU5UO1xuXG5cdFx0XHRpZiAoIHRleHR1cmUudHlwZSA9PT0gRmxvYXRUeXBlICkge1xuXG5cdFx0XHRcdGlmICggISBfaXNXZWJHTDIgKSB0aHJvdyBuZXcgRXJyb3IoICdGbG9hdCBEZXB0aCBUZXh0dXJlIG9ubHkgc3VwcG9ydGVkIGluIFdlYkdMMi4wJyApO1xuXHRcdFx0XHRpbnRlcm5hbEZvcm1hdCA9IF9nbC5ERVBUSF9DT01QT05FTlQzMkY7XG5cblx0XHRcdH0gZWxzZSBpZiAoIF9pc1dlYkdMMiApIHtcblxuXHRcdFx0XHQvLyBXZWJHTCAyLjAgcmVxdWlyZXMgc2lnbmVkIGludGVybmFsZm9ybWF0IGZvciBnbFRleEltYWdlMkRcblx0XHRcdFx0aW50ZXJuYWxGb3JtYXQgPSBfZ2wuREVQVEhfQ09NUE9ORU5UMTY7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0ZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhGb3JtYXQgJiYgaW50ZXJuYWxGb3JtYXQgPT09IF9nbC5ERVBUSF9DT01QT05FTlQgKSB7XG5cblx0XHRcdFx0Ly8gVGhlIGVycm9yIElOVkFMSURfT1BFUkFUSU9OIGlzIGdlbmVyYXRlZCBieSB0ZXhJbWFnZTJEIGlmIGZvcm1hdCBhbmQgaW50ZXJuYWxmb3JtYXQgYXJlXG5cdFx0XHRcdC8vIERFUFRIX0NPTVBPTkVOVCBhbmQgdHlwZSBpcyBub3QgVU5TSUdORURfU0hPUlQgb3IgVU5TSUdORURfSU5UXG5cdFx0XHRcdC8vIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS93ZWJnbC9leHRlbnNpb25zL1dFQkdMX2RlcHRoX3RleHR1cmUvKVxuXHRcdFx0XHRpZiAoIHRleHR1cmUudHlwZSAhPT0gVW5zaWduZWRTaG9ydFR5cGUgJiYgdGV4dHVyZS50eXBlICE9PSBVbnNpZ25lZEludFR5cGUgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBVc2UgVW5zaWduZWRTaG9ydFR5cGUgb3IgVW5zaWduZWRJbnRUeXBlIGZvciBEZXB0aEZvcm1hdCBEZXB0aFRleHR1cmUuJyApO1xuXG5cdFx0XHRcdFx0dGV4dHVyZS50eXBlID0gVW5zaWduZWRTaG9ydFR5cGU7XG5cdFx0XHRcdFx0Z2xUeXBlID0gdXRpbHMuY29udmVydCggdGV4dHVyZS50eXBlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIERlcHRoIHN0ZW5jaWwgdGV4dHVyZXMgbmVlZCB0aGUgREVQVEhfU1RFTkNJTCBpbnRlcm5hbCBmb3JtYXRcblx0XHRcdC8vIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS93ZWJnbC9leHRlbnNpb25zL1dFQkdMX2RlcHRoX3RleHR1cmUvKVxuXHRcdFx0aWYgKCB0ZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkge1xuXG5cdFx0XHRcdGludGVybmFsRm9ybWF0ID0gX2dsLkRFUFRIX1NURU5DSUw7XG5cblx0XHRcdFx0Ly8gVGhlIGVycm9yIElOVkFMSURfT1BFUkFUSU9OIGlzIGdlbmVyYXRlZCBieSB0ZXhJbWFnZTJEIGlmIGZvcm1hdCBhbmQgaW50ZXJuYWxmb3JtYXQgYXJlXG5cdFx0XHRcdC8vIERFUFRIX1NURU5DSUwgYW5kIHR5cGUgaXMgbm90IFVOU0lHTkVEX0lOVF8yNF84X1dFQkdMLlxuXHRcdFx0XHQvLyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wvZXh0ZW5zaW9ucy9XRUJHTF9kZXB0aF90ZXh0dXJlLylcblx0XHRcdFx0aWYgKCB0ZXh0dXJlLnR5cGUgIT09IFVuc2lnbmVkSW50MjQ4VHlwZSApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZEludDI0OFR5cGUgZm9yIERlcHRoU3RlbmNpbEZvcm1hdCBEZXB0aFRleHR1cmUuJyApO1xuXG5cdFx0XHRcdFx0dGV4dHVyZS50eXBlID0gVW5zaWduZWRJbnQyNDhUeXBlO1xuXHRcdFx0XHRcdGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUudHlwZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgMCwgaW50ZXJuYWxGb3JtYXQsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG51bGwgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHRleHR1cmUuaXNEYXRhVGV4dHVyZSApIHtcblxuXHRcdFx0Ly8gdXNlIG1hbnVhbGx5IGNyZWF0ZWQgbWlwbWFwcyBpZiBhdmFpbGFibGVcblx0XHRcdC8vIGlmIHRoZXJlIGFyZSBubyBtYW51YWwgbWlwbWFwc1xuXHRcdFx0Ly8gc2V0IDAgbGV2ZWwgbWlwbWFwIGFuZCB0aGVuIHVzZSBHTCB0byBnZW5lcmF0ZSBvdGhlciBtaXBtYXAgbGV2ZWxzXG5cblx0XHRcdGlmICggbWlwbWFwcy5sZW5ndGggPiAwICYmIGlzUG93ZXJPZlR3b0ltYWdlICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBtaXBtYXBzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0bWlwbWFwID0gbWlwbWFwc1sgaSBdO1xuXHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBpLCBnbEZvcm1hdCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAuZGF0YSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gbWlwbWFwcy5sZW5ndGggLSAxO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCAwLCBnbEZvcm1hdCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UuZGF0YSApO1xuXHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gMDtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc0NvbXByZXNzZWRUZXh0dXJlICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gbWlwbWFwcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRtaXBtYXAgPSBtaXBtYXBzWyBpIF07XG5cblx0XHRcdFx0aWYgKCB0ZXh0dXJlLmZvcm1hdCAhPT0gUkdCQUZvcm1hdCAmJiB0ZXh0dXJlLmZvcm1hdCAhPT0gUkdCRm9ybWF0ICkge1xuXG5cdFx0XHRcdFx0aWYgKCBzdGF0ZS5nZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMoKS5pbmRleE9mKCBnbEZvcm1hdCApID4gLSAxICkge1xuXG5cdFx0XHRcdFx0XHRzdGF0ZS5jb21wcmVzc2VkVGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGksIGdsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIG1pcG1hcC5kYXRhICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAudXBsb2FkVGV4dHVyZSgpJyApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgaSwgZ2xGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwLmRhdGEgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX19tYXhNaXBMZXZlbCA9IG1pcG1hcHMubGVuZ3RoIC0gMTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIHJlZ3VsYXIgVGV4dHVyZSAoaW1hZ2UsIHZpZGVvLCBjYW52YXMpXG5cblx0XHRcdC8vIHVzZSBtYW51YWxseSBjcmVhdGVkIG1pcG1hcHMgaWYgYXZhaWxhYmxlXG5cdFx0XHQvLyBpZiB0aGVyZSBhcmUgbm8gbWFudWFsIG1pcG1hcHNcblx0XHRcdC8vIHNldCAwIGxldmVsIG1pcG1hcCBhbmQgdGhlbiB1c2UgR0wgdG8gZ2VuZXJhdGUgb3RoZXIgbWlwbWFwIGxldmVsc1xuXG5cdFx0XHRpZiAoIG1pcG1hcHMubGVuZ3RoID4gMCAmJiBpc1Bvd2VyT2ZUd29JbWFnZSApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gbWlwbWFwcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdG1pcG1hcCA9IG1pcG1hcHNbIGkgXTtcblx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgaSwgZ2xGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gbWlwbWFwcy5sZW5ndGggLSAxO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCAwLCBnbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UgKTtcblx0XHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX19tYXhNaXBMZXZlbCA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlLCBpc1Bvd2VyT2ZUd29JbWFnZSApICkge1xuXG5cdFx0XHRnZW5lcmF0ZU1pcG1hcCggX2dsLlRFWFRVUkVfMkQsIHRleHR1cmUsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcblxuXHRcdH1cblxuXHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiA9IHRleHR1cmUudmVyc2lvbjtcblxuXHRcdGlmICggdGV4dHVyZS5vblVwZGF0ZSApIHRleHR1cmUub25VcGRhdGUoIHRleHR1cmUgKTtcblxuXHR9XG5cblx0Ly8gUmVuZGVyIHRhcmdldHNcblxuXHQvLyBTZXR1cCBzdG9yYWdlIGZvciB0YXJnZXQgdGV4dHVyZSBhbmQgYmluZCBpdCB0byBjb3JyZWN0IGZyYW1lYnVmZmVyXG5cdGZ1bmN0aW9uIHNldHVwRnJhbWVCdWZmZXJUZXh0dXJlKCBmcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0dXJlVGFyZ2V0ICkge1xuXG5cdFx0dmFyIGdsRm9ybWF0ID0gdXRpbHMuY29udmVydCggcmVuZGVyVGFyZ2V0LnRleHR1cmUuZm9ybWF0ICk7XG5cdFx0dmFyIGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHJlbmRlclRhcmdldC50ZXh0dXJlLnR5cGUgKTtcblx0XHRzdGF0ZS50ZXhJbWFnZTJEKCB0ZXh0dXJlVGFyZ2V0LCAwLCBnbEZvcm1hdCwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBudWxsICk7XG5cdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlciApO1xuXHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggX2dsLkZSQU1FQlVGRkVSLCBhdHRhY2htZW50LCB0ZXh0dXJlVGFyZ2V0LCBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZSwgMCApO1xuXHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgbnVsbCApO1xuXG5cdH1cblxuXHQvLyBTZXR1cCBzdG9yYWdlIGZvciBpbnRlcm5hbCBkZXB0aC9zdGVuY2lsIGJ1ZmZlcnMgYW5kIGJpbmQgdG8gY29ycmVjdCBmcmFtZWJ1ZmZlclxuXHRmdW5jdGlvbiBzZXR1cFJlbmRlckJ1ZmZlclN0b3JhZ2UoIHJlbmRlcmJ1ZmZlciwgcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0X2dsLmJpbmRSZW5kZXJidWZmZXIoIF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApO1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgJiYgISByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciApIHtcblxuXHRcdFx0X2dsLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoIF9nbC5SRU5ERVJCVUZGRVIsIF9nbC5ERVBUSF9DT01QT05FTlQxNiwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cdFx0XHRfZ2wuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgX2dsLkRFUFRIX0FUVEFDSE1FTlQsIF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApO1xuXG5cdFx0fSBlbHNlIGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyICYmIHJlbmRlclRhcmdldC5zdGVuY2lsQnVmZmVyICkge1xuXG5cdFx0XHRfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZSggX2dsLlJFTkRFUkJVRkZFUiwgX2dsLkRFUFRIX1NURU5DSUwsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xuXHRcdFx0X2dsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIF9nbC5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQsIF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gRklYTUU6IFdlIGRvbid0IHN1cHBvcnQgIWRlcHRoICFzdGVuY2lsXG5cdFx0XHRfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZSggX2dsLlJFTkRFUkJVRkZFUiwgX2dsLlJHQkE0LCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcblxuXHRcdH1cblxuXHRcdF9nbC5iaW5kUmVuZGVyYnVmZmVyKCBfZ2wuUkVOREVSQlVGRkVSLCBudWxsICk7XG5cblx0fVxuXG5cdC8vIFNldHVwIHJlc291cmNlcyBmb3IgYSBEZXB0aCBUZXh0dXJlIGZvciBhIEZCTyAobmVlZHMgYW4gZXh0ZW5zaW9uKVxuXHRmdW5jdGlvbiBzZXR1cERlcHRoVGV4dHVyZSggZnJhbWVidWZmZXIsIHJlbmRlclRhcmdldCApIHtcblxuXHRcdHZhciBpc0N1YmUgPSAoIHJlbmRlclRhcmdldCAmJiByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgKTtcblx0XHRpZiAoIGlzQ3ViZSApIHRocm93IG5ldyBFcnJvciggJ0RlcHRoIFRleHR1cmUgd2l0aCBjdWJlIHJlbmRlciB0YXJnZXRzIGlzIG5vdCBzdXBwb3J0ZWQnICk7XG5cblx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyICk7XG5cblx0XHRpZiAoICEgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICYmIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaXNEZXB0aFRleHR1cmUgKSApIHtcblxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAncmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFRIUkVFLkRlcHRoVGV4dHVyZScgKTtcblxuXHRcdH1cblxuXHRcdC8vIHVwbG9hZCBhbiBlbXB0eSBkZXB0aCB0ZXh0dXJlIHdpdGggZnJhbWVidWZmZXIgc2l6ZVxuXHRcdGlmICggISBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlIHx8XG5cdFx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGggIT09IHJlbmRlclRhcmdldC53aWR0aCB8fFxuXHRcdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodCAhPT0gcmVuZGVyVGFyZ2V0LmhlaWdodCApIHtcblxuXHRcdFx0cmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5pbWFnZS53aWR0aCA9IHJlbmRlclRhcmdldC53aWR0aDtcblx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gcmVuZGVyVGFyZ2V0LmhlaWdodDtcblx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0c2V0VGV4dHVyZTJEKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLCAwICk7XG5cblx0XHR2YXIgd2ViZ2xEZXB0aFRleHR1cmUgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlO1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhGb3JtYXQgKSB7XG5cblx0XHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggX2dsLkZSQU1FQlVGRkVSLCBfZ2wuREVQVEhfQVRUQUNITUVOVCwgX2dsLlRFWFRVUkVfMkQsIHdlYmdsRGVwdGhUZXh0dXJlLCAwICk7XG5cblx0XHR9IGVsc2UgaWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkge1xuXG5cdFx0XHRfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIF9nbC5GUkFNRUJVRkZFUiwgX2dsLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCwgX2dsLlRFWFRVUkVfMkQsIHdlYmdsRGVwdGhUZXh0dXJlLCAwICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdVbmtub3duIGRlcHRoVGV4dHVyZSBmb3JtYXQnICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIFNldHVwIEdMIHJlc291cmNlcyBmb3IgYSBub24tdGV4dHVyZSBkZXB0aCBidWZmZXJcblx0ZnVuY3Rpb24gc2V0dXBEZXB0aFJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHR2YXIgaXNDdWJlID0gKCByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgPT09IHRydWUgKTtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApIHtcblxuXHRcdFx0aWYgKCBpc0N1YmUgKSB0aHJvdyBuZXcgRXJyb3IoICd0YXJnZXQuZGVwdGhUZXh0dXJlIG5vdCBzdXBwb3J0ZWQgaW4gQ3ViZSByZW5kZXIgdGFyZ2V0cycgKTtcblxuXHRcdFx0c2V0dXBEZXB0aFRleHR1cmUoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGlmICggaXNDdWJlICkge1xuXG5cdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyID0gW107XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSApO1xuXHRcdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyWyBpIF0gPSBfZ2wuY3JlYXRlUmVuZGVyYnVmZmVyKCk7XG5cdFx0XHRcdFx0c2V0dXBSZW5kZXJCdWZmZXJTdG9yYWdlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlclsgaSBdLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciApO1xuXHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciA9IF9nbC5jcmVhdGVSZW5kZXJidWZmZXIoKTtcblx0XHRcdFx0c2V0dXBSZW5kZXJCdWZmZXJTdG9yYWdlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgbnVsbCApO1xuXG5cdH1cblxuXHQvLyBTZXQgdXAgR0wgcmVzb3VyY2VzIGZvciB0aGUgcmVuZGVyIHRhcmdldFxuXHRmdW5jdGlvbiBzZXR1cFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC50ZXh0dXJlICk7XG5cblx0XHRyZW5kZXJUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblJlbmRlclRhcmdldERpc3Bvc2UgKTtcblxuXHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlID0gX2dsLmNyZWF0ZVRleHR1cmUoKTtcblxuXHRcdGluZm8ubWVtb3J5LnRleHR1cmVzICsrO1xuXG5cdFx0dmFyIGlzQ3ViZSA9ICggcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlID09PSB0cnVlICk7XG5cdFx0dmFyIGlzVGFyZ2V0UG93ZXJPZlR3byA9IGlzUG93ZXJPZlR3byggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHQvLyBTZXR1cCBmcmFtZWJ1ZmZlclxuXG5cdFx0aWYgKCBpc0N1YmUgKSB7XG5cblx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSA9IF9nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciA9IF9nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gU2V0dXAgY29sb3IgYnVmZmVyXG5cblx0XHRpZiAoIGlzQ3ViZSApIHtcblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXHRcdFx0c2V0VGV4dHVyZVBhcmFtZXRlcnMoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCByZW5kZXJUYXJnZXQudGV4dHVyZSwgaXNUYXJnZXRQb3dlck9mVHdvICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdFx0c2V0dXBGcmFtZUJ1ZmZlclRleHR1cmUoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF0sIHJlbmRlclRhcmdldCwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCByZW5kZXJUYXJnZXQudGV4dHVyZSwgaXNUYXJnZXRQb3dlck9mVHdvICkgKSB7XG5cblx0XHRcdFx0Z2VuZXJhdGVNaXBtYXAoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCByZW5kZXJUYXJnZXQudGV4dHVyZSwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCBudWxsICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfMkQsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cdFx0XHRzZXRUZXh0dXJlUGFyYW1ldGVycyggX2dsLlRFWFRVUkVfMkQsIHJlbmRlclRhcmdldC50ZXh0dXJlLCBpc1RhcmdldFBvd2VyT2ZUd28gKTtcblx0XHRcdHNldHVwRnJhbWVCdWZmZXJUZXh0dXJlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAsIF9nbC5URVhUVVJFXzJEICk7XG5cblx0XHRcdGlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCByZW5kZXJUYXJnZXQudGV4dHVyZSwgaXNUYXJnZXRQb3dlck9mVHdvICkgKSB7XG5cblx0XHRcdFx0Z2VuZXJhdGVNaXBtYXAoIF9nbC5URVhUVVJFXzJELCByZW5kZXJUYXJnZXQudGV4dHVyZSwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFXzJELCBudWxsICk7XG5cblx0XHR9XG5cblx0XHQvLyBTZXR1cCBkZXB0aCBhbmQgc3RlbmNpbCBidWZmZXJzXG5cblx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciApIHtcblxuXHRcdFx0c2V0dXBEZXB0aFJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHRleHR1cmUgPSByZW5kZXJUYXJnZXQudGV4dHVyZTtcblx0XHR2YXIgaXNUYXJnZXRQb3dlck9mVHdvID0gaXNQb3dlck9mVHdvKCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdGlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlLCBpc1RhcmdldFBvd2VyT2ZUd28gKSApIHtcblxuXHRcdFx0dmFyIHRhcmdldCA9IHJlbmRlclRhcmdldC5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSA/IF9nbC5URVhUVVJFX0NVQkVfTUFQIDogX2dsLlRFWFRVUkVfMkQ7XG5cdFx0XHR2YXIgd2ViZ2xUZXh0dXJlID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZTtcblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIHRhcmdldCwgd2ViZ2xUZXh0dXJlICk7XG5cdFx0XHRnZW5lcmF0ZU1pcG1hcCggdGFyZ2V0LCB0ZXh0dXJlLCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcblx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCB0YXJnZXQsIG51bGwgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlVmlkZW9UZXh0dXJlKCB0ZXh0dXJlICkge1xuXG5cdFx0dmFyIGlkID0gdGV4dHVyZS5pZDtcblx0XHR2YXIgZnJhbWUgPSBpbmZvLnJlbmRlci5mcmFtZTtcblxuXHRcdC8vIENoZWNrIHRoZSBsYXN0IGZyYW1lIHdlIHVwZGF0ZWQgdGhlIFZpZGVvVGV4dHVyZVxuXG5cdFx0aWYgKCBfdmlkZW9UZXh0dXJlc1sgaWQgXSAhPT0gZnJhbWUgKSB7XG5cblx0XHRcdF92aWRlb1RleHR1cmVzWyBpZCBdID0gZnJhbWU7XG5cdFx0XHR0ZXh0dXJlLnVwZGF0ZSgpO1xuXG5cdFx0fVxuXG5cdH1cblxuXHR0aGlzLnNldFRleHR1cmUyRCA9IHNldFRleHR1cmUyRDtcblx0dGhpcy5zZXRUZXh0dXJlQ3ViZSA9IHNldFRleHR1cmVDdWJlO1xuXHR0aGlzLnNldFRleHR1cmVDdWJlRHluYW1pYyA9IHNldFRleHR1cmVDdWJlRHluYW1pYztcblx0dGhpcy5zZXR1cFJlbmRlclRhcmdldCA9IHNldHVwUmVuZGVyVGFyZ2V0O1xuXHR0aGlzLnVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCA9IHVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcDtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgdGhlc3BpdGUgLyBodHRwOi8vd3d3LnR3aXR0ZXIuY29tL3RoZXNwaXRlXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xVdGlscyggZ2wsIGV4dGVuc2lvbnMgKSB7XG5cblx0ZnVuY3Rpb24gY29udmVydCggcCApIHtcblxuXHRcdHZhciBleHRlbnNpb247XG5cblx0XHRpZiAoIHAgPT09IFJlcGVhdFdyYXBwaW5nICkgcmV0dXJuIGdsLlJFUEVBVDtcblx0XHRpZiAoIHAgPT09IENsYW1wVG9FZGdlV3JhcHBpbmcgKSByZXR1cm4gZ2wuQ0xBTVBfVE9fRURHRTtcblx0XHRpZiAoIHAgPT09IE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcgKSByZXR1cm4gZ2wuTUlSUk9SRURfUkVQRUFUO1xuXG5cdFx0aWYgKCBwID09PSBOZWFyZXN0RmlsdGVyICkgcmV0dXJuIGdsLk5FQVJFU1Q7XG5cdFx0aWYgKCBwID09PSBOZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlciApIHJldHVybiBnbC5ORUFSRVNUX01JUE1BUF9ORUFSRVNUO1xuXHRcdGlmICggcCA9PT0gTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciApIHJldHVybiBnbC5ORUFSRVNUX01JUE1BUF9MSU5FQVI7XG5cblx0XHRpZiAoIHAgPT09IExpbmVhckZpbHRlciApIHJldHVybiBnbC5MSU5FQVI7XG5cdFx0aWYgKCBwID09PSBMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyICkgcmV0dXJuIGdsLkxJTkVBUl9NSVBNQVBfTkVBUkVTVDtcblx0XHRpZiAoIHAgPT09IExpbmVhck1pcE1hcExpbmVhckZpbHRlciApIHJldHVybiBnbC5MSU5FQVJfTUlQTUFQX0xJTkVBUjtcblxuXHRcdGlmICggcCA9PT0gVW5zaWduZWRCeXRlVHlwZSApIHJldHVybiBnbC5VTlNJR05FRF9CWVRFO1xuXHRcdGlmICggcCA9PT0gVW5zaWduZWRTaG9ydDQ0NDRUeXBlICkgcmV0dXJuIGdsLlVOU0lHTkVEX1NIT1JUXzRfNF80XzQ7XG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZFNob3J0NTU1MVR5cGUgKSByZXR1cm4gZ2wuVU5TSUdORURfU0hPUlRfNV81XzVfMTtcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkU2hvcnQ1NjVUeXBlICkgcmV0dXJuIGdsLlVOU0lHTkVEX1NIT1JUXzVfNl81O1xuXG5cdFx0aWYgKCBwID09PSBCeXRlVHlwZSApIHJldHVybiBnbC5CWVRFO1xuXHRcdGlmICggcCA9PT0gU2hvcnRUeXBlICkgcmV0dXJuIGdsLlNIT1JUO1xuXHRcdGlmICggcCA9PT0gVW5zaWduZWRTaG9ydFR5cGUgKSByZXR1cm4gZ2wuVU5TSUdORURfU0hPUlQ7XG5cdFx0aWYgKCBwID09PSBJbnRUeXBlICkgcmV0dXJuIGdsLklOVDtcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkSW50VHlwZSApIHJldHVybiBnbC5VTlNJR05FRF9JTlQ7XG5cdFx0aWYgKCBwID09PSBGbG9hdFR5cGUgKSByZXR1cm4gZ2wuRkxPQVQ7XG5cblx0XHRpZiAoIHAgPT09IEhhbGZGbG9hdFR5cGUgKSB7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcgKTtcblxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSByZXR1cm4gZXh0ZW5zaW9uLkhBTEZfRkxPQVRfT0VTO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwID09PSBBbHBoYUZvcm1hdCApIHJldHVybiBnbC5BTFBIQTtcblx0XHRpZiAoIHAgPT09IFJHQkZvcm1hdCApIHJldHVybiBnbC5SR0I7XG5cdFx0aWYgKCBwID09PSBSR0JBRm9ybWF0ICkgcmV0dXJuIGdsLlJHQkE7XG5cdFx0aWYgKCBwID09PSBMdW1pbmFuY2VGb3JtYXQgKSByZXR1cm4gZ2wuTFVNSU5BTkNFO1xuXHRcdGlmICggcCA9PT0gTHVtaW5hbmNlQWxwaGFGb3JtYXQgKSByZXR1cm4gZ2wuTFVNSU5BTkNFX0FMUEhBO1xuXHRcdGlmICggcCA9PT0gRGVwdGhGb3JtYXQgKSByZXR1cm4gZ2wuREVQVEhfQ09NUE9ORU5UO1xuXHRcdGlmICggcCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkgcmV0dXJuIGdsLkRFUFRIX1NURU5DSUw7XG5cblx0XHRpZiAoIHAgPT09IEFkZEVxdWF0aW9uICkgcmV0dXJuIGdsLkZVTkNfQUREO1xuXHRcdGlmICggcCA9PT0gU3VidHJhY3RFcXVhdGlvbiApIHJldHVybiBnbC5GVU5DX1NVQlRSQUNUO1xuXHRcdGlmICggcCA9PT0gUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb24gKSByZXR1cm4gZ2wuRlVOQ19SRVZFUlNFX1NVQlRSQUNUO1xuXG5cdFx0aWYgKCBwID09PSBaZXJvRmFjdG9yICkgcmV0dXJuIGdsLlpFUk87XG5cdFx0aWYgKCBwID09PSBPbmVGYWN0b3IgKSByZXR1cm4gZ2wuT05FO1xuXHRcdGlmICggcCA9PT0gU3JjQ29sb3JGYWN0b3IgKSByZXR1cm4gZ2wuU1JDX0NPTE9SO1xuXHRcdGlmICggcCA9PT0gT25lTWludXNTcmNDb2xvckZhY3RvciApIHJldHVybiBnbC5PTkVfTUlOVVNfU1JDX0NPTE9SO1xuXHRcdGlmICggcCA9PT0gU3JjQWxwaGFGYWN0b3IgKSByZXR1cm4gZ2wuU1JDX0FMUEhBO1xuXHRcdGlmICggcCA9PT0gT25lTWludXNTcmNBbHBoYUZhY3RvciApIHJldHVybiBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBO1xuXHRcdGlmICggcCA9PT0gRHN0QWxwaGFGYWN0b3IgKSByZXR1cm4gZ2wuRFNUX0FMUEhBO1xuXHRcdGlmICggcCA9PT0gT25lTWludXNEc3RBbHBoYUZhY3RvciApIHJldHVybiBnbC5PTkVfTUlOVVNfRFNUX0FMUEhBO1xuXG5cdFx0aWYgKCBwID09PSBEc3RDb2xvckZhY3RvciApIHJldHVybiBnbC5EU1RfQ09MT1I7XG5cdFx0aWYgKCBwID09PSBPbmVNaW51c0RzdENvbG9yRmFjdG9yICkgcmV0dXJuIGdsLk9ORV9NSU5VU19EU1RfQ09MT1I7XG5cdFx0aWYgKCBwID09PSBTcmNBbHBoYVNhdHVyYXRlRmFjdG9yICkgcmV0dXJuIGdsLlNSQ19BTFBIQV9TQVRVUkFURTtcblxuXHRcdGlmICggcCA9PT0gUkdCX1MzVENfRFhUMV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9TM1RDX0RYVDFfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBSR0JBX1MzVENfRFhUM19Gb3JtYXQgfHwgcCA9PT0gUkdCQV9TM1RDX0RYVDVfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQl9TM1RDX0RYVDFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUO1xuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ7XG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9TM1RDX0RYVDNfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVDtcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUNV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHAgPT09IFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0IHx8IHAgPT09IFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKTtcblxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7XG5cblx0XHRcdFx0aWYgKCBwID09PSBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRztcblx0XHRcdFx0aWYgKCBwID09PSBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfUFZSVENfMkJQUFYxX0lNRztcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HO1xuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUc7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gUkdCX0VUQzFfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMxJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfRVRDMV9XRUJHTDtcblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzR4NF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzV4NF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzV4NV9Gb3JtYXQgfHxcblx0XHRcdHAgPT09IFJHQkFfQVNUQ182eDVfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ182eDZfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ184eDVfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBSR0JBX0FTVENfOHg2X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfOHg4X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfMTB4NV9Gb3JtYXQgfHxcblx0XHRcdHAgPT09IFJHQkFfQVNUQ18xMHg2X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfMTB4OF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzEweDEwX0Zvcm1hdCB8fFxuXHRcdFx0cCA9PT0gUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfMTJ4MTJfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9hc3RjJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRyZXR1cm4gcDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBwID09PSBNaW5FcXVhdGlvbiB8fCBwID09PSBNYXhFcXVhdGlvbiApIHtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdFWFRfYmxlbmRfbWlubWF4JyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRpZiAoIHAgPT09IE1pbkVxdWF0aW9uICkgcmV0dXJuIGV4dGVuc2lvbi5NSU5fRVhUO1xuXHRcdFx0XHRpZiAoIHAgPT09IE1heEVxdWF0aW9uICkgcmV0dXJuIGV4dGVuc2lvbi5NQVhfRVhUO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkSW50MjQ4VHlwZSApIHtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9kZXB0aF90ZXh0dXJlJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHJldHVybiBleHRlbnNpb24uVU5TSUdORURfSU5UXzI0XzhfV0VCR0w7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gMDtcblxuXHR9XG5cblx0cmV0dXJuIHsgY29udmVydDogY29udmVydCB9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgZ3JlZ2dtYW4gLyBodHRwOi8vZ2FtZXMuZ3JlZ2dtYW4uY29tL1xuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICkge1xuXG5cdENhbWVyYS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BlcnNwZWN0aXZlQ2FtZXJhJztcblxuXHR0aGlzLmZvdiA9IGZvdiAhPT0gdW5kZWZpbmVkID8gZm92IDogNTA7XG5cdHRoaXMuem9vbSA9IDE7XG5cblx0dGhpcy5uZWFyID0gbmVhciAhPT0gdW5kZWZpbmVkID8gbmVhciA6IDAuMTtcblx0dGhpcy5mYXIgPSBmYXIgIT09IHVuZGVmaW5lZCA/IGZhciA6IDIwMDA7XG5cdHRoaXMuZm9jdXMgPSAxMDtcblxuXHR0aGlzLmFzcGVjdCA9IGFzcGVjdCAhPT0gdW5kZWZpbmVkID8gYXNwZWN0IDogMTtcblx0dGhpcy52aWV3ID0gbnVsbDtcblxuXHR0aGlzLmZpbG1HYXVnZSA9IDM1O1x0Ly8gd2lkdGggb2YgdGhlIGZpbG0gKGRlZmF1bHQgaW4gbWlsbGltZXRlcnMpXG5cdHRoaXMuZmlsbU9mZnNldCA9IDA7XHQvLyBob3Jpem9udGFsIGZpbG0gb2Zmc2V0IChzYW1lIHVuaXQgYXMgZ2F1Z2UpXG5cblx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cbn1cblxuUGVyc3BlY3RpdmVDYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQ2FtZXJhLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFBlcnNwZWN0aXZlQ2FtZXJhLFxuXG5cdGlzUGVyc3BlY3RpdmVDYW1lcmE6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHtcblxuXHRcdENhbWVyYS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xuXG5cdFx0dGhpcy5mb3YgPSBzb3VyY2UuZm92O1xuXHRcdHRoaXMuem9vbSA9IHNvdXJjZS56b29tO1xuXG5cdFx0dGhpcy5uZWFyID0gc291cmNlLm5lYXI7XG5cdFx0dGhpcy5mYXIgPSBzb3VyY2UuZmFyO1xuXHRcdHRoaXMuZm9jdXMgPSBzb3VyY2UuZm9jdXM7XG5cblx0XHR0aGlzLmFzcGVjdCA9IHNvdXJjZS5hc3BlY3Q7XG5cdFx0dGhpcy52aWV3ID0gc291cmNlLnZpZXcgPT09IG51bGwgPyBudWxsIDogT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS52aWV3ICk7XG5cblx0XHR0aGlzLmZpbG1HYXVnZSA9IHNvdXJjZS5maWxtR2F1Z2U7XG5cdFx0dGhpcy5maWxtT2Zmc2V0ID0gc291cmNlLmZpbG1PZmZzZXQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBGT1YgYnkgZm9jYWwgbGVuZ3RoIGluIHJlc3BlY3QgdG8gdGhlIGN1cnJlbnQgLmZpbG1HYXVnZS5cblx0ICpcblx0ICogVGhlIGRlZmF1bHQgZmlsbSBnYXVnZSBpcyAzNSwgc28gdGhhdCB0aGUgZm9jYWwgbGVuZ3RoIGNhbiBiZSBzcGVjaWZpZWQgZm9yXG5cdCAqIGEgMzVtbSAoZnVsbCBmcmFtZSkgY2FtZXJhLlxuXHQgKlxuXHQgKiBWYWx1ZXMgZm9yIGZvY2FsIGxlbmd0aCBhbmQgZmlsbSBnYXVnZSBtdXN0IGhhdmUgdGhlIHNhbWUgdW5pdC5cblx0ICovXG5cdHNldEZvY2FsTGVuZ3RoOiBmdW5jdGlvbiAoIGZvY2FsTGVuZ3RoICkge1xuXG5cdFx0Ly8gc2VlIGh0dHA6Ly93d3cuYm9iYXRraW5zLmNvbS9waG90b2dyYXBoeS90ZWNobmljYWwvZmllbGRfb2Zfdmlldy5odG1sXG5cdFx0dmFyIHZFeHRlbnRTbG9wZSA9IDAuNSAqIHRoaXMuZ2V0RmlsbUhlaWdodCgpIC8gZm9jYWxMZW5ndGg7XG5cblx0XHR0aGlzLmZvdiA9IF9NYXRoLlJBRDJERUcgKiAyICogTWF0aC5hdGFuKCB2RXh0ZW50U2xvcGUgKTtcblx0XHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuXHR9LFxuXG5cdC8qKlxuXHQgKiBDYWxjdWxhdGVzIHRoZSBmb2NhbCBsZW5ndGggZnJvbSB0aGUgY3VycmVudCAuZm92IGFuZCAuZmlsbUdhdWdlLlxuXHQgKi9cblx0Z2V0Rm9jYWxMZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2RXh0ZW50U2xvcGUgPSBNYXRoLnRhbiggX01hdGguREVHMlJBRCAqIDAuNSAqIHRoaXMuZm92ICk7XG5cblx0XHRyZXR1cm4gMC41ICogdGhpcy5nZXRGaWxtSGVpZ2h0KCkgLyB2RXh0ZW50U2xvcGU7XG5cblx0fSxcblxuXHRnZXRFZmZlY3RpdmVGT1Y6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBfTWF0aC5SQUQyREVHICogMiAqIE1hdGguYXRhbihcblx0XHRcdE1hdGgudGFuKCBfTWF0aC5ERUcyUkFEICogMC41ICogdGhpcy5mb3YgKSAvIHRoaXMuem9vbSApO1xuXG5cdH0sXG5cblx0Z2V0RmlsbVdpZHRoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBmaWxtIG5vdCBjb21wbGV0ZWx5IGNvdmVyZWQgaW4gcG9ydHJhaXQgZm9ybWF0IChhc3BlY3QgPCAxKVxuXHRcdHJldHVybiB0aGlzLmZpbG1HYXVnZSAqIE1hdGgubWluKCB0aGlzLmFzcGVjdCwgMSApO1xuXG5cdH0sXG5cblx0Z2V0RmlsbUhlaWdodDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gZmlsbSBub3QgY29tcGxldGVseSBjb3ZlcmVkIGluIGxhbmRzY2FwZSBmb3JtYXQgKGFzcGVjdCA+IDEpXG5cdFx0cmV0dXJuIHRoaXMuZmlsbUdhdWdlIC8gTWF0aC5tYXgoIHRoaXMuYXNwZWN0LCAxICk7XG5cblx0fSxcblxuXHQvKipcblx0ICogU2V0cyBhbiBvZmZzZXQgaW4gYSBsYXJnZXIgZnJ1c3R1bS4gVGhpcyBpcyB1c2VmdWwgZm9yIG11bHRpLXdpbmRvdyBvclxuXHQgKiBtdWx0aS1tb25pdG9yL211bHRpLW1hY2hpbmUgc2V0dXBzLlxuXHQgKlxuXHQgKiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgM3gyIG1vbml0b3JzIGFuZCBlYWNoIG1vbml0b3IgaXMgMTkyMHgxMDgwIGFuZFxuXHQgKiB0aGUgbW9uaXRvcnMgYXJlIGluIGdyaWQgbGlrZSB0aGlzXG5cdCAqXG5cdCAqICAgKy0tLSstLS0rLS0tK1xuXHQgKiAgIHwgQSB8IEIgfCBDIHxcblx0ICogICArLS0tKy0tLSstLS0rXG5cdCAqICAgfCBEIHwgRSB8IEYgfFxuXHQgKiAgICstLS0rLS0tKy0tLStcblx0ICpcblx0ICogdGhlbiBmb3IgZWFjaCBtb25pdG9yIHlvdSB3b3VsZCBjYWxsIGl0IGxpa2UgdGhpc1xuXHQgKlxuXHQgKiAgIHZhciB3ID0gMTkyMDtcblx0ICogICB2YXIgaCA9IDEwODA7XG5cdCAqICAgdmFyIGZ1bGxXaWR0aCA9IHcgKiAzO1xuXHQgKiAgIHZhciBmdWxsSGVpZ2h0ID0gaCAqIDI7XG5cdCAqXG5cdCAqICAgLS1BLS1cblx0ICogICBjYW1lcmEuc2V0T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAwLCBoICogMCwgdywgaCApO1xuXHQgKiAgIC0tQi0tXG5cdCAqICAgY2FtZXJhLnNldE9mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMSwgaCAqIDAsIHcsIGggKTtcblx0ICogICAtLUMtLVxuXHQgKiAgIGNhbWVyYS5zZXRPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDIsIGggKiAwLCB3LCBoICk7XG5cdCAqICAgLS1ELS1cblx0ICogICBjYW1lcmEuc2V0T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAwLCBoICogMSwgdywgaCApO1xuXHQgKiAgIC0tRS0tXG5cdCAqICAgY2FtZXJhLnNldE9mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMSwgaCAqIDEsIHcsIGggKTtcblx0ICogICAtLUYtLVxuXHQgKiAgIGNhbWVyYS5zZXRPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDIsIGggKiAxLCB3LCBoICk7XG5cdCAqXG5cdCAqICAgTm90ZSB0aGVyZSBpcyBubyByZWFzb24gbW9uaXRvcnMgaGF2ZSB0byBiZSB0aGUgc2FtZSBzaXplIG9yIGluIGEgZ3JpZC5cblx0ICovXG5cdHNldFZpZXdPZmZzZXQ6IGZ1bmN0aW9uICggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkge1xuXG5cdFx0dGhpcy5hc3BlY3QgPSBmdWxsV2lkdGggLyBmdWxsSGVpZ2h0O1xuXG5cdFx0aWYgKCB0aGlzLnZpZXcgPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMudmlldyA9IHtcblx0XHRcdFx0ZW5hYmxlZDogdHJ1ZSxcblx0XHRcdFx0ZnVsbFdpZHRoOiAxLFxuXHRcdFx0XHRmdWxsSGVpZ2h0OiAxLFxuXHRcdFx0XHRvZmZzZXRYOiAwLFxuXHRcdFx0XHRvZmZzZXRZOiAwLFxuXHRcdFx0XHR3aWR0aDogMSxcblx0XHRcdFx0aGVpZ2h0OiAxXG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0dGhpcy52aWV3LmVuYWJsZWQgPSB0cnVlO1xuXHRcdHRoaXMudmlldy5mdWxsV2lkdGggPSBmdWxsV2lkdGg7XG5cdFx0dGhpcy52aWV3LmZ1bGxIZWlnaHQgPSBmdWxsSGVpZ2h0O1xuXHRcdHRoaXMudmlldy5vZmZzZXRYID0geDtcblx0XHR0aGlzLnZpZXcub2Zmc2V0WSA9IHk7XG5cdFx0dGhpcy52aWV3LndpZHRoID0gd2lkdGg7XG5cdFx0dGhpcy52aWV3LmhlaWdodCA9IGhlaWdodDtcblxuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdH0sXG5cblx0Y2xlYXJWaWV3T2Zmc2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy52aWV3LmVuYWJsZWQgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdH0sXG5cblx0dXBkYXRlUHJvamVjdGlvbk1hdHJpeDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG5lYXIgPSB0aGlzLm5lYXIsXG5cdFx0XHR0b3AgPSBuZWFyICogTWF0aC50YW4oXG5cdFx0XHRcdF9NYXRoLkRFRzJSQUQgKiAwLjUgKiB0aGlzLmZvdiApIC8gdGhpcy56b29tLFxuXHRcdFx0aGVpZ2h0ID0gMiAqIHRvcCxcblx0XHRcdHdpZHRoID0gdGhpcy5hc3BlY3QgKiBoZWlnaHQsXG5cdFx0XHRsZWZ0ID0gLSAwLjUgKiB3aWR0aCxcblx0XHRcdHZpZXcgPSB0aGlzLnZpZXc7XG5cblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCAmJiB0aGlzLnZpZXcuZW5hYmxlZCApIHtcblxuXHRcdFx0dmFyIGZ1bGxXaWR0aCA9IHZpZXcuZnVsbFdpZHRoLFxuXHRcdFx0XHRmdWxsSGVpZ2h0ID0gdmlldy5mdWxsSGVpZ2h0O1xuXG5cdFx0XHRsZWZ0ICs9IHZpZXcub2Zmc2V0WCAqIHdpZHRoIC8gZnVsbFdpZHRoO1xuXHRcdFx0dG9wIC09IHZpZXcub2Zmc2V0WSAqIGhlaWdodCAvIGZ1bGxIZWlnaHQ7XG5cdFx0XHR3aWR0aCAqPSB2aWV3LndpZHRoIC8gZnVsbFdpZHRoO1xuXHRcdFx0aGVpZ2h0ICo9IHZpZXcuaGVpZ2h0IC8gZnVsbEhlaWdodDtcblxuXHRcdH1cblxuXHRcdHZhciBza2V3ID0gdGhpcy5maWxtT2Zmc2V0O1xuXHRcdGlmICggc2tldyAhPT0gMCApIGxlZnQgKz0gbmVhciAqIHNrZXcgLyB0aGlzLmdldEZpbG1XaWR0aCgpO1xuXG5cdFx0dGhpcy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VQZXJzcGVjdGl2ZSggbGVmdCwgbGVmdCArIHdpZHRoLCB0b3AsIHRvcCAtIGhlaWdodCwgbmVhciwgdGhpcy5mYXIgKTtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGRhdGEgPSBPYmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRcdGRhdGEub2JqZWN0LmZvdiA9IHRoaXMuZm92O1xuXHRcdGRhdGEub2JqZWN0Lnpvb20gPSB0aGlzLnpvb207XG5cblx0XHRkYXRhLm9iamVjdC5uZWFyID0gdGhpcy5uZWFyO1xuXHRcdGRhdGEub2JqZWN0LmZhciA9IHRoaXMuZmFyO1xuXHRcdGRhdGEub2JqZWN0LmZvY3VzID0gdGhpcy5mb2N1cztcblxuXHRcdGRhdGEub2JqZWN0LmFzcGVjdCA9IHRoaXMuYXNwZWN0O1xuXG5cdFx0aWYgKCB0aGlzLnZpZXcgIT09IG51bGwgKSBkYXRhLm9iamVjdC52aWV3ID0gT2JqZWN0LmFzc2lnbigge30sIHRoaXMudmlldyApO1xuXG5cdFx0ZGF0YS5vYmplY3QuZmlsbUdhdWdlID0gdGhpcy5maWxtR2F1Z2U7XG5cdFx0ZGF0YS5vYmplY3QuZmlsbU9mZnNldCA9IHRoaXMuZmlsbU9mZnNldDtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQXJyYXlDYW1lcmEoIGFycmF5ICkge1xuXG5cdFBlcnNwZWN0aXZlQ2FtZXJhLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmNhbWVyYXMgPSBhcnJheSB8fCBbXTtcblxufVxuXG5BcnJheUNhbWVyYS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBQZXJzcGVjdGl2ZUNhbWVyYS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBBcnJheUNhbWVyYSxcblxuXHRpc0FycmF5Q2FtZXJhOiB0cnVlXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYlZSTWFuYWdlciggcmVuZGVyZXIgKSB7XG5cblx0dmFyIHNjb3BlID0gdGhpcztcblxuXHR2YXIgZGV2aWNlID0gbnVsbDtcblx0dmFyIGZyYW1lRGF0YSA9IG51bGw7XG5cblx0dmFyIHBvc2VUYXJnZXQgPSBudWxsO1xuXG5cdHZhciBzdGFuZGluZ01hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdHZhciBzdGFuZGluZ01hdHJpeEludmVyc2UgPSBuZXcgTWF0cml4NCgpO1xuXG5cdGlmICggdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgJ1ZSRnJhbWVEYXRhJyBpbiB3aW5kb3cgKSB7XG5cblx0XHRmcmFtZURhdGEgPSBuZXcgd2luZG93LlZSRnJhbWVEYXRhKCk7XG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICd2cmRpc3BsYXlwcmVzZW50Y2hhbmdlJywgb25WUkRpc3BsYXlQcmVzZW50Q2hhbmdlLCBmYWxzZSApO1xuXG5cdH1cblxuXHR2YXIgbWF0cml4V29ybGRJbnZlcnNlID0gbmV3IE1hdHJpeDQoKTtcblx0dmFyIHRlbXBRdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblx0dmFyIHRlbXBQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIGNhbWVyYUwgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTtcblx0Y2FtZXJhTC5ib3VuZHMgPSBuZXcgVmVjdG9yNCggMC4wLCAwLjAsIDAuNSwgMS4wICk7XG5cdGNhbWVyYUwubGF5ZXJzLmVuYWJsZSggMSApO1xuXG5cdHZhciBjYW1lcmFSID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XG5cdGNhbWVyYVIuYm91bmRzID0gbmV3IFZlY3RvcjQoIDAuNSwgMC4wLCAwLjUsIDEuMCApO1xuXHRjYW1lcmFSLmxheWVycy5lbmFibGUoIDIgKTtcblxuXHR2YXIgY2FtZXJhVlIgPSBuZXcgQXJyYXlDYW1lcmEoIFsgY2FtZXJhTCwgY2FtZXJhUiBdICk7XG5cdGNhbWVyYVZSLmxheWVycy5lbmFibGUoIDEgKTtcblx0Y2FtZXJhVlIubGF5ZXJzLmVuYWJsZSggMiApO1xuXG5cdC8vXG5cblx0ZnVuY3Rpb24gaXNQcmVzZW50aW5nKCkge1xuXG5cdFx0cmV0dXJuIGRldmljZSAhPT0gbnVsbCAmJiBkZXZpY2UuaXNQcmVzZW50aW5nID09PSB0cnVlO1xuXG5cdH1cblxuXHR2YXIgY3VycmVudFNpemUsIGN1cnJlbnRQaXhlbFJhdGlvO1xuXG5cdGZ1bmN0aW9uIG9uVlJEaXNwbGF5UHJlc2VudENoYW5nZSgpIHtcblxuXHRcdGlmICggaXNQcmVzZW50aW5nKCkgKSB7XG5cblx0XHRcdHZhciBleWVQYXJhbWV0ZXJzID0gZGV2aWNlLmdldEV5ZVBhcmFtZXRlcnMoICdsZWZ0JyApO1xuXHRcdFx0dmFyIHJlbmRlcldpZHRoID0gZXllUGFyYW1ldGVycy5yZW5kZXJXaWR0aDtcblx0XHRcdHZhciByZW5kZXJIZWlnaHQgPSBleWVQYXJhbWV0ZXJzLnJlbmRlckhlaWdodDtcblxuXHRcdFx0Y3VycmVudFBpeGVsUmF0aW8gPSByZW5kZXJlci5nZXRQaXhlbFJhdGlvKCk7XG5cdFx0XHRjdXJyZW50U2l6ZSA9IHJlbmRlcmVyLmdldFNpemUoKTtcblxuXHRcdFx0cmVuZGVyZXIuc2V0RHJhd2luZ0J1ZmZlclNpemUoIHJlbmRlcldpZHRoICogMiwgcmVuZGVySGVpZ2h0LCAxICk7XG5cblx0XHR9IGVsc2UgaWYgKCBzY29wZS5lbmFibGVkICkge1xuXG5cdFx0XHRyZW5kZXJlci5zZXREcmF3aW5nQnVmZmVyU2l6ZSggY3VycmVudFNpemUud2lkdGgsIGN1cnJlbnRTaXplLmhlaWdodCwgY3VycmVudFBpeGVsUmF0aW8gKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly9cblxuXHR0aGlzLmVuYWJsZWQgPSBmYWxzZTtcblx0dGhpcy51c2VySGVpZ2h0ID0gMS42O1xuXG5cdHRoaXMuZ2V0RGV2aWNlID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIGRldmljZTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0RGV2aWNlID0gZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIGRldmljZSA9IHZhbHVlO1xuXG5cdH07XG5cblx0dGhpcy5zZXRQb3NlVGFyZ2V0ID0gZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHRpZiAoIG9iamVjdCAhPT0gdW5kZWZpbmVkICkgcG9zZVRhcmdldCA9IG9iamVjdDtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0Q2FtZXJhID0gZnVuY3Rpb24gKCBjYW1lcmEgKSB7XG5cblx0XHRpZiAoIGRldmljZSA9PT0gbnVsbCApIHJldHVybiBjYW1lcmE7XG5cblx0XHRkZXZpY2UuZGVwdGhOZWFyID0gY2FtZXJhLm5lYXI7XG5cdFx0ZGV2aWNlLmRlcHRoRmFyID0gY2FtZXJhLmZhcjtcblxuXHRcdGRldmljZS5nZXRGcmFtZURhdGEoIGZyYW1lRGF0YSApO1xuXG5cdFx0Ly9cblxuXHRcdHZhciBzdGFnZVBhcmFtZXRlcnMgPSBkZXZpY2Uuc3RhZ2VQYXJhbWV0ZXJzO1xuXG5cdFx0aWYgKCBzdGFnZVBhcmFtZXRlcnMgKSB7XG5cblx0XHRcdHN0YW5kaW5nTWF0cml4LmZyb21BcnJheSggc3RhZ2VQYXJhbWV0ZXJzLnNpdHRpbmdUb1N0YW5kaW5nVHJhbnNmb3JtICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRzdGFuZGluZ01hdHJpeC5tYWtlVHJhbnNsYXRpb24oIDAsIHNjb3BlLnVzZXJIZWlnaHQsIDAgKTtcblxuXHRcdH1cblxuXG5cdFx0dmFyIHBvc2UgPSBmcmFtZURhdGEucG9zZTtcblx0XHR2YXIgcG9zZU9iamVjdCA9IHBvc2VUYXJnZXQgIT09IG51bGwgPyBwb3NlVGFyZ2V0IDogY2FtZXJhO1xuXG5cdFx0Ly8gV2Ugd2FudCB0byBtYW5pcHVsYXRlIHBvc2VPYmplY3QgYnkgaXRzIHBvc2l0aW9uIGFuZCBxdWF0ZXJuaW9uIGNvbXBvbmVudHMgc2luY2UgdXNlcnMgbWF5IHJlbHkgb24gdGhlbS5cblx0XHRwb3NlT2JqZWN0Lm1hdHJpeC5jb3B5KCBzdGFuZGluZ01hdHJpeCApO1xuXHRcdHBvc2VPYmplY3QubWF0cml4LmRlY29tcG9zZSggcG9zZU9iamVjdC5wb3NpdGlvbiwgcG9zZU9iamVjdC5xdWF0ZXJuaW9uLCBwb3NlT2JqZWN0LnNjYWxlICk7XG5cblx0XHRpZiAoIHBvc2Uub3JpZW50YXRpb24gIT09IG51bGwgKSB7XG5cblx0XHRcdHRlbXBRdWF0ZXJuaW9uLmZyb21BcnJheSggcG9zZS5vcmllbnRhdGlvbiApO1xuXHRcdFx0cG9zZU9iamVjdC5xdWF0ZXJuaW9uLm11bHRpcGx5KCB0ZW1wUXVhdGVybmlvbiApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwb3NlLnBvc2l0aW9uICE9PSBudWxsICkge1xuXG5cdFx0XHR0ZW1wUXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoIHN0YW5kaW5nTWF0cml4ICk7XG5cdFx0XHR0ZW1wUG9zaXRpb24uZnJvbUFycmF5KCBwb3NlLnBvc2l0aW9uICk7XG5cdFx0XHR0ZW1wUG9zaXRpb24uYXBwbHlRdWF0ZXJuaW9uKCB0ZW1wUXVhdGVybmlvbiApO1xuXHRcdFx0cG9zZU9iamVjdC5wb3NpdGlvbi5hZGQoIHRlbXBQb3NpdGlvbiApO1xuXG5cdFx0fVxuXG5cdFx0cG9zZU9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0aWYgKCBkZXZpY2UuaXNQcmVzZW50aW5nID09PSBmYWxzZSApIHJldHVybiBjYW1lcmE7XG5cblx0XHQvL1xuXG5cdFx0Y2FtZXJhTC5uZWFyID0gY2FtZXJhLm5lYXI7XG5cdFx0Y2FtZXJhUi5uZWFyID0gY2FtZXJhLm5lYXI7XG5cblx0XHRjYW1lcmFMLmZhciA9IGNhbWVyYS5mYXI7XG5cdFx0Y2FtZXJhUi5mYXIgPSBjYW1lcmEuZmFyO1xuXG5cdFx0Y2FtZXJhVlIubWF0cml4V29ybGQuY29weSggY2FtZXJhLm1hdHJpeFdvcmxkICk7XG5cdFx0Y2FtZXJhVlIubWF0cml4V29ybGRJbnZlcnNlLmNvcHkoIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblxuXHRcdGNhbWVyYUwubWF0cml4V29ybGRJbnZlcnNlLmZyb21BcnJheSggZnJhbWVEYXRhLmxlZnRWaWV3TWF0cml4ICk7XG5cdFx0Y2FtZXJhUi5tYXRyaXhXb3JsZEludmVyc2UuZnJvbUFycmF5KCBmcmFtZURhdGEucmlnaHRWaWV3TWF0cml4ICk7XG5cblx0XHQvLyBUT0RPIChtcmRvb2IpIERvdWJsZSBjaGVjayB0aGlzIGNvZGVcblxuXHRcdHN0YW5kaW5nTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKCBzdGFuZGluZ01hdHJpeCApO1xuXG5cdFx0Y2FtZXJhTC5tYXRyaXhXb3JsZEludmVyc2UubXVsdGlwbHkoIHN0YW5kaW5nTWF0cml4SW52ZXJzZSApO1xuXHRcdGNhbWVyYVIubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KCBzdGFuZGluZ01hdHJpeEludmVyc2UgKTtcblxuXHRcdHZhciBwYXJlbnQgPSBwb3NlT2JqZWN0LnBhcmVudDtcblxuXHRcdGlmICggcGFyZW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRtYXRyaXhXb3JsZEludmVyc2UuZ2V0SW52ZXJzZSggcGFyZW50Lm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdGNhbWVyYUwubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KCBtYXRyaXhXb3JsZEludmVyc2UgKTtcblx0XHRcdGNhbWVyYVIubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KCBtYXRyaXhXb3JsZEludmVyc2UgKTtcblxuXHRcdH1cblxuXHRcdC8vIGVudk1hcCBhbmQgTWlycm9yIG5lZWRzIGNhbWVyYS5tYXRyaXhXb3JsZFxuXG5cdFx0Y2FtZXJhTC5tYXRyaXhXb3JsZC5nZXRJbnZlcnNlKCBjYW1lcmFMLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXHRcdGNhbWVyYVIubWF0cml4V29ybGQuZ2V0SW52ZXJzZSggY2FtZXJhUi5tYXRyaXhXb3JsZEludmVyc2UgKTtcblxuXHRcdGNhbWVyYUwucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoIGZyYW1lRGF0YS5sZWZ0UHJvamVjdGlvbk1hdHJpeCApO1xuXHRcdGNhbWVyYVIucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoIGZyYW1lRGF0YS5yaWdodFByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdC8vIEhBQ0sgKG1yZG9vYilcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vdzNjL3dlYnZyL2lzc3Vlcy8yMDNcblxuXHRcdGNhbWVyYVZSLnByb2plY3Rpb25NYXRyaXguY29weSggY2FtZXJhTC5wcm9qZWN0aW9uTWF0cml4ICk7XG5cblx0XHQvL1xuXG5cdFx0dmFyIGxheWVycyA9IGRldmljZS5nZXRMYXllcnMoKTtcblxuXHRcdGlmICggbGF5ZXJzLmxlbmd0aCApIHtcblxuXHRcdFx0dmFyIGxheWVyID0gbGF5ZXJzWyAwIF07XG5cblx0XHRcdGlmICggbGF5ZXIubGVmdEJvdW5kcyAhPT0gbnVsbCAmJiBsYXllci5sZWZ0Qm91bmRzLmxlbmd0aCA9PT0gNCApIHtcblxuXHRcdFx0XHRjYW1lcmFMLmJvdW5kcy5mcm9tQXJyYXkoIGxheWVyLmxlZnRCb3VuZHMgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGxheWVyLnJpZ2h0Qm91bmRzICE9PSBudWxsICYmIGxheWVyLnJpZ2h0Qm91bmRzLmxlbmd0aCA9PT0gNCApIHtcblxuXHRcdFx0XHRjYW1lcmFSLmJvdW5kcy5mcm9tQXJyYXkoIGxheWVyLnJpZ2h0Qm91bmRzICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBjYW1lcmFWUjtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0U3RhbmRpbmdNYXRyaXggPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gc3RhbmRpbmdNYXRyaXg7XG5cblx0fTtcblxuXHR0aGlzLnN1Ym1pdEZyYW1lID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCBpc1ByZXNlbnRpbmcoKSApIGRldmljZS5zdWJtaXRGcmFtZSgpO1xuXG5cdH07XG5cblx0dGhpcy5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyApIHtcblxuXHRcdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoICd2cmRpc3BsYXlwcmVzZW50Y2hhbmdlJywgb25WUkRpc3BsYXlQcmVzZW50Q2hhbmdlICk7XG5cblx0XHR9XG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3Igc3VwZXJlZ2diZXJ0IC8gaHR0cDovL3d3dy5wYXVsYnJ1bnQuY28udWsvXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3Igc3ppbWVrIC8gaHR0cHM6Ly9naXRodWIuY29tL3N6aW1lay9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFJlbmRlcmVyKCBwYXJhbWV0ZXJzICkge1xuXG5cdGNvbnNvbGUubG9nKCAnVEhSRUUuV2ViR0xSZW5kZXJlcicsIFJFVklTSU9OICk7XG5cblx0cGFyYW1ldGVycyA9IHBhcmFtZXRlcnMgfHwge307XG5cblx0dmFyIF9jYW52YXMgPSBwYXJhbWV0ZXJzLmNhbnZhcyAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5jYW52YXMgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycgKSxcblx0XHRfY29udGV4dCA9IHBhcmFtZXRlcnMuY29udGV4dCAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5jb250ZXh0IDogbnVsbCxcblxuXHRcdF9hbHBoYSA9IHBhcmFtZXRlcnMuYWxwaGEgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuYWxwaGEgOiBmYWxzZSxcblx0XHRfZGVwdGggPSBwYXJhbWV0ZXJzLmRlcHRoICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmRlcHRoIDogdHJ1ZSxcblx0XHRfc3RlbmNpbCA9IHBhcmFtZXRlcnMuc3RlbmNpbCAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5zdGVuY2lsIDogdHJ1ZSxcblx0XHRfYW50aWFsaWFzID0gcGFyYW1ldGVycy5hbnRpYWxpYXMgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuYW50aWFsaWFzIDogZmFsc2UsXG5cdFx0X3ByZW11bHRpcGxpZWRBbHBoYSA9IHBhcmFtZXRlcnMucHJlbXVsdGlwbGllZEFscGhhICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnByZW11bHRpcGxpZWRBbHBoYSA6IHRydWUsXG5cdFx0X3ByZXNlcnZlRHJhd2luZ0J1ZmZlciA9IHBhcmFtZXRlcnMucHJlc2VydmVEcmF3aW5nQnVmZmVyICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnByZXNlcnZlRHJhd2luZ0J1ZmZlciA6IGZhbHNlLFxuXHRcdF9wb3dlclByZWZlcmVuY2UgPSBwYXJhbWV0ZXJzLnBvd2VyUHJlZmVyZW5jZSAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5wb3dlclByZWZlcmVuY2UgOiAnZGVmYXVsdCc7XG5cblx0dmFyIGN1cnJlbnRSZW5kZXJMaXN0ID0gbnVsbDtcblx0dmFyIGN1cnJlbnRSZW5kZXJTdGF0ZSA9IG51bGw7XG5cblx0Ly8gcHVibGljIHByb3BlcnRpZXNcblxuXHR0aGlzLmRvbUVsZW1lbnQgPSBfY2FudmFzO1xuXHR0aGlzLmNvbnRleHQgPSBudWxsO1xuXG5cdC8vIGNsZWFyaW5nXG5cblx0dGhpcy5hdXRvQ2xlYXIgPSB0cnVlO1xuXHR0aGlzLmF1dG9DbGVhckNvbG9yID0gdHJ1ZTtcblx0dGhpcy5hdXRvQ2xlYXJEZXB0aCA9IHRydWU7XG5cdHRoaXMuYXV0b0NsZWFyU3RlbmNpbCA9IHRydWU7XG5cblx0Ly8gc2NlbmUgZ3JhcGhcblxuXHR0aGlzLnNvcnRPYmplY3RzID0gdHJ1ZTtcblxuXHQvLyB1c2VyLWRlZmluZWQgY2xpcHBpbmdcblxuXHR0aGlzLmNsaXBwaW5nUGxhbmVzID0gW107XG5cdHRoaXMubG9jYWxDbGlwcGluZ0VuYWJsZWQgPSBmYWxzZTtcblxuXHQvLyBwaHlzaWNhbGx5IGJhc2VkIHNoYWRpbmdcblxuXHR0aGlzLmdhbW1hRmFjdG9yID0gMi4wO1x0Ly8gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cdHRoaXMuZ2FtbWFJbnB1dCA9IGZhbHNlO1xuXHR0aGlzLmdhbW1hT3V0cHV0ID0gZmFsc2U7XG5cblx0Ly8gcGh5c2ljYWwgbGlnaHRzXG5cblx0dGhpcy5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyA9IGZhbHNlO1xuXG5cdC8vIHRvbmUgbWFwcGluZ1xuXG5cdHRoaXMudG9uZU1hcHBpbmcgPSBMaW5lYXJUb25lTWFwcGluZztcblx0dGhpcy50b25lTWFwcGluZ0V4cG9zdXJlID0gMS4wO1xuXHR0aGlzLnRvbmVNYXBwaW5nV2hpdGVQb2ludCA9IDEuMDtcblxuXHQvLyBtb3JwaHNcblxuXHR0aGlzLm1heE1vcnBoVGFyZ2V0cyA9IDg7XG5cdHRoaXMubWF4TW9ycGhOb3JtYWxzID0gNDtcblxuXHQvLyBpbnRlcm5hbCBwcm9wZXJ0aWVzXG5cblx0dmFyIF90aGlzID0gdGhpcyxcblxuXHRcdF9pc0NvbnRleHRMb3N0ID0gZmFsc2UsXG5cblx0XHQvLyBpbnRlcm5hbCBzdGF0ZSBjYWNoZVxuXG5cdFx0X2N1cnJlbnRSZW5kZXJUYXJnZXQgPSBudWxsLFxuXHRcdF9jdXJyZW50RnJhbWVidWZmZXIgPSBudWxsLFxuXHRcdF9jdXJyZW50TWF0ZXJpYWxJZCA9IC0gMSxcblx0XHRfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSA9ICcnLFxuXG5cdFx0X2N1cnJlbnRDYW1lcmEgPSBudWxsLFxuXHRcdF9jdXJyZW50QXJyYXlDYW1lcmEgPSBudWxsLFxuXG5cdFx0X2N1cnJlbnRWaWV3cG9ydCA9IG5ldyBWZWN0b3I0KCksXG5cdFx0X2N1cnJlbnRTY2lzc29yID0gbmV3IFZlY3RvcjQoKSxcblx0XHRfY3VycmVudFNjaXNzb3JUZXN0ID0gbnVsbCxcblxuXHRcdC8vXG5cblx0XHRfdXNlZFRleHR1cmVVbml0cyA9IDAsXG5cblx0XHQvL1xuXG5cdFx0X3dpZHRoID0gX2NhbnZhcy53aWR0aCxcblx0XHRfaGVpZ2h0ID0gX2NhbnZhcy5oZWlnaHQsXG5cblx0XHRfcGl4ZWxSYXRpbyA9IDEsXG5cblx0XHRfdmlld3BvcnQgPSBuZXcgVmVjdG9yNCggMCwgMCwgX3dpZHRoLCBfaGVpZ2h0ICksXG5cdFx0X3NjaXNzb3IgPSBuZXcgVmVjdG9yNCggMCwgMCwgX3dpZHRoLCBfaGVpZ2h0ICksXG5cdFx0X3NjaXNzb3JUZXN0ID0gZmFsc2UsXG5cblx0XHQvLyBmcnVzdHVtXG5cblx0XHRfZnJ1c3R1bSA9IG5ldyBGcnVzdHVtKCksXG5cblx0XHQvLyBjbGlwcGluZ1xuXG5cdFx0X2NsaXBwaW5nID0gbmV3IFdlYkdMQ2xpcHBpbmcoKSxcblx0XHRfY2xpcHBpbmdFbmFibGVkID0gZmFsc2UsXG5cdFx0X2xvY2FsQ2xpcHBpbmdFbmFibGVkID0gZmFsc2UsXG5cblx0XHQvLyBjYW1lcmEgbWF0cmljZXMgY2FjaGVcblxuXHRcdF9wcm9qU2NyZWVuTWF0cml4ID0gbmV3IE1hdHJpeDQoKSxcblxuXHRcdF92ZWN0b3IzID0gbmV3IFZlY3RvcjMoKTtcblxuXHRmdW5jdGlvbiBnZXRUYXJnZXRQaXhlbFJhdGlvKCkge1xuXG5cdFx0cmV0dXJuIF9jdXJyZW50UmVuZGVyVGFyZ2V0ID09PSBudWxsID8gX3BpeGVsUmF0aW8gOiAxO1xuXG5cdH1cblxuXHQvLyBpbml0aWFsaXplXG5cblx0dmFyIF9nbDtcblxuXHR0cnkge1xuXG5cdFx0dmFyIGNvbnRleHRBdHRyaWJ1dGVzID0ge1xuXHRcdFx0YWxwaGE6IF9hbHBoYSxcblx0XHRcdGRlcHRoOiBfZGVwdGgsXG5cdFx0XHRzdGVuY2lsOiBfc3RlbmNpbCxcblx0XHRcdGFudGlhbGlhczogX2FudGlhbGlhcyxcblx0XHRcdHByZW11bHRpcGxpZWRBbHBoYTogX3ByZW11bHRpcGxpZWRBbHBoYSxcblx0XHRcdHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogX3ByZXNlcnZlRHJhd2luZ0J1ZmZlcixcblx0XHRcdHBvd2VyUHJlZmVyZW5jZTogX3Bvd2VyUHJlZmVyZW5jZVxuXHRcdH07XG5cblx0XHQvLyBldmVudCBsaXN0ZW5lcnMgbXVzdCBiZSByZWdpc3RlcmVkIGJlZm9yZSBXZWJHTCBjb250ZXh0IGlzIGNyZWF0ZWQsIHNlZSAjMTI3NTNcblxuXHRcdF9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dGxvc3QnLCBvbkNvbnRleHRMb3N0LCBmYWxzZSApO1xuXHRcdF9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dHJlc3RvcmVkJywgb25Db250ZXh0UmVzdG9yZSwgZmFsc2UgKTtcblxuXHRcdF9nbCA9IF9jb250ZXh0IHx8IF9jYW52YXMuZ2V0Q29udGV4dCggJ3dlYmdsJywgY29udGV4dEF0dHJpYnV0ZXMgKSB8fCBfY2FudmFzLmdldENvbnRleHQoICdleHBlcmltZW50YWwtd2ViZ2wnLCBjb250ZXh0QXR0cmlidXRlcyApO1xuXG5cdFx0aWYgKCBfZ2wgPT09IG51bGwgKSB7XG5cblx0XHRcdGlmICggX2NhbnZhcy5nZXRDb250ZXh0KCAnd2ViZ2wnICkgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnRXJyb3IgY3JlYXRpbmcgV2ViR0wgY29udGV4dCB3aXRoIHlvdXIgc2VsZWN0ZWQgYXR0cmlidXRlcy4nICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnRXJyb3IgY3JlYXRpbmcgV2ViR0wgY29udGV4dC4nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIFNvbWUgZXhwZXJpbWVudGFsLXdlYmdsIGltcGxlbWVudGF0aW9ucyBkbyBub3QgaGF2ZSBnZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXRcblxuXHRcdGlmICggX2dsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRfZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0ID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdHJldHVybiB7ICdyYW5nZU1pbic6IDEsICdyYW5nZU1heCc6IDEsICdwcmVjaXNpb24nOiAxIH07XG5cblx0XHRcdH07XG5cblx0XHR9XG5cblx0fSBjYXRjaCAoIGVycm9yICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXI6ICcgKyBlcnJvci5tZXNzYWdlICk7XG5cblx0fVxuXG5cdHZhciBleHRlbnNpb25zLCBjYXBhYmlsaXRpZXMsIHN0YXRlLCBpbmZvO1xuXHR2YXIgcHJvcGVydGllcywgdGV4dHVyZXMsIGF0dHJpYnV0ZXMsIGdlb21ldHJpZXMsIG9iamVjdHM7XG5cdHZhciBwcm9ncmFtQ2FjaGUsIHJlbmRlckxpc3RzLCByZW5kZXJTdGF0ZXM7XG5cblx0dmFyIGJhY2tncm91bmQsIG1vcnBodGFyZ2V0cywgYnVmZmVyUmVuZGVyZXIsIGluZGV4ZWRCdWZmZXJSZW5kZXJlcjtcblx0dmFyIHNwcml0ZVJlbmRlcmVyO1xuXG5cdHZhciB1dGlscztcblxuXHRmdW5jdGlvbiBpbml0R0xDb250ZXh0KCkge1xuXG5cdFx0ZXh0ZW5zaW9ucyA9IG5ldyBXZWJHTEV4dGVuc2lvbnMoIF9nbCApO1xuXHRcdGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfZGVwdGhfdGV4dHVyZScgKTtcblx0XHRleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApO1xuXHRcdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyJyApO1xuXHRcdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcgKTtcblx0XHRleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyJyApO1xuXHRcdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzJyApO1xuXHRcdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX2VsZW1lbnRfaW5kZXhfdWludCcgKTtcblx0XHRleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7XG5cblx0XHR1dGlscyA9IG5ldyBXZWJHTFV0aWxzKCBfZ2wsIGV4dGVuc2lvbnMgKTtcblxuXHRcdGNhcGFiaWxpdGllcyA9IG5ldyBXZWJHTENhcGFiaWxpdGllcyggX2dsLCBleHRlbnNpb25zLCBwYXJhbWV0ZXJzICk7XG5cblx0XHRzdGF0ZSA9IG5ldyBXZWJHTFN0YXRlKCBfZ2wsIGV4dGVuc2lvbnMsIHV0aWxzICk7XG5cdFx0c3RhdGUuc2Npc3NvciggX2N1cnJlbnRTY2lzc29yLmNvcHkoIF9zY2lzc29yICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkgKTtcblx0XHRzdGF0ZS52aWV3cG9ydCggX2N1cnJlbnRWaWV3cG9ydC5jb3B5KCBfdmlld3BvcnQgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKSApO1xuXG5cdFx0aW5mbyA9IG5ldyBXZWJHTEluZm8oIF9nbCApO1xuXHRcdHByb3BlcnRpZXMgPSBuZXcgV2ViR0xQcm9wZXJ0aWVzKCk7XG5cdFx0dGV4dHVyZXMgPSBuZXcgV2ViR0xUZXh0dXJlcyggX2dsLCBleHRlbnNpb25zLCBzdGF0ZSwgcHJvcGVydGllcywgY2FwYWJpbGl0aWVzLCB1dGlscywgaW5mbyApO1xuXHRcdGF0dHJpYnV0ZXMgPSBuZXcgV2ViR0xBdHRyaWJ1dGVzKCBfZ2wgKTtcblx0XHRnZW9tZXRyaWVzID0gbmV3IFdlYkdMR2VvbWV0cmllcyggX2dsLCBhdHRyaWJ1dGVzLCBpbmZvICk7XG5cdFx0b2JqZWN0cyA9IG5ldyBXZWJHTE9iamVjdHMoIGdlb21ldHJpZXMsIGluZm8gKTtcblx0XHRtb3JwaHRhcmdldHMgPSBuZXcgV2ViR0xNb3JwaHRhcmdldHMoIF9nbCApO1xuXHRcdHByb2dyYW1DYWNoZSA9IG5ldyBXZWJHTFByb2dyYW1zKCBfdGhpcywgZXh0ZW5zaW9ucywgY2FwYWJpbGl0aWVzICk7XG5cdFx0cmVuZGVyTGlzdHMgPSBuZXcgV2ViR0xSZW5kZXJMaXN0cygpO1xuXHRcdHJlbmRlclN0YXRlcyA9IG5ldyBXZWJHTFJlbmRlclN0YXRlcygpO1xuXG5cdFx0YmFja2dyb3VuZCA9IG5ldyBXZWJHTEJhY2tncm91bmQoIF90aGlzLCBzdGF0ZSwgZ2VvbWV0cmllcywgX3ByZW11bHRpcGxpZWRBbHBoYSApO1xuXG5cdFx0YnVmZmVyUmVuZGVyZXIgPSBuZXcgV2ViR0xCdWZmZXJSZW5kZXJlciggX2dsLCBleHRlbnNpb25zLCBpbmZvICk7XG5cdFx0aW5kZXhlZEJ1ZmZlclJlbmRlcmVyID0gbmV3IFdlYkdMSW5kZXhlZEJ1ZmZlclJlbmRlcmVyKCBfZ2wsIGV4dGVuc2lvbnMsIGluZm8gKTtcblxuXHRcdHNwcml0ZVJlbmRlcmVyID0gbmV3IFdlYkdMU3ByaXRlUmVuZGVyZXIoIF90aGlzLCBfZ2wsIHN0YXRlLCB0ZXh0dXJlcywgY2FwYWJpbGl0aWVzICk7XG5cblx0XHRpbmZvLnByb2dyYW1zID0gcHJvZ3JhbUNhY2hlLnByb2dyYW1zO1xuXG5cdFx0X3RoaXMuY29udGV4dCA9IF9nbDtcblx0XHRfdGhpcy5jYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXM7XG5cdFx0X3RoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7XG5cdFx0X3RoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG5cdFx0X3RoaXMucmVuZGVyTGlzdHMgPSByZW5kZXJMaXN0cztcblx0XHRfdGhpcy5zdGF0ZSA9IHN0YXRlO1xuXHRcdF90aGlzLmluZm8gPSBpbmZvO1xuXG5cdH1cblxuXHRpbml0R0xDb250ZXh0KCk7XG5cblx0Ly8gdnJcblxuXHR2YXIgdnIgPSBuZXcgV2ViVlJNYW5hZ2VyKCBfdGhpcyApO1xuXG5cdHRoaXMudnIgPSB2cjtcblxuXHQvLyBzaGFkb3cgbWFwXG5cblx0dmFyIHNoYWRvd01hcCA9IG5ldyBXZWJHTFNoYWRvd01hcCggX3RoaXMsIG9iamVjdHMsIGNhcGFiaWxpdGllcy5tYXhUZXh0dXJlU2l6ZSApO1xuXG5cdHRoaXMuc2hhZG93TWFwID0gc2hhZG93TWFwO1xuXG5cdC8vIEFQSVxuXG5cdHRoaXMuZ2V0Q29udGV4dCA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBfZ2w7XG5cblx0fTtcblxuXHR0aGlzLmdldENvbnRleHRBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9nbC5nZXRDb250ZXh0QXR0cmlidXRlcygpO1xuXG5cdH07XG5cblx0dGhpcy5mb3JjZUNvbnRleHRMb3NzID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfbG9zZV9jb250ZXh0JyApO1xuXHRcdGlmICggZXh0ZW5zaW9uICkgZXh0ZW5zaW9uLmxvc2VDb250ZXh0KCk7XG5cblx0fTtcblxuXHR0aGlzLmZvcmNlQ29udGV4dFJlc3RvcmUgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9sb3NlX2NvbnRleHQnICk7XG5cdFx0aWYgKCBleHRlbnNpb24gKSBleHRlbnNpb24ucmVzdG9yZUNvbnRleHQoKTtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0UGl4ZWxSYXRpbyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBfcGl4ZWxSYXRpbztcblxuXHR9O1xuXG5cdHRoaXMuc2V0UGl4ZWxSYXRpbyA9IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSByZXR1cm47XG5cblx0XHRfcGl4ZWxSYXRpbyA9IHZhbHVlO1xuXG5cdFx0dGhpcy5zZXRTaXplKCBfd2lkdGgsIF9oZWlnaHQsIGZhbHNlICk7XG5cblx0fTtcblxuXHR0aGlzLmdldFNpemUgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0d2lkdGg6IF93aWR0aCxcblx0XHRcdGhlaWdodDogX2hlaWdodFxuXHRcdH07XG5cblx0fTtcblxuXHR0aGlzLnNldFNpemUgPSBmdW5jdGlvbiAoIHdpZHRoLCBoZWlnaHQsIHVwZGF0ZVN0eWxlICkge1xuXG5cdFx0dmFyIGRldmljZSA9IHZyLmdldERldmljZSgpO1xuXG5cdFx0aWYgKCBkZXZpY2UgJiYgZGV2aWNlLmlzUHJlc2VudGluZyApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQ2FuXFwndCBjaGFuZ2Ugc2l6ZSB3aGlsZSBWUiBkZXZpY2UgaXMgcHJlc2VudGluZy4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRfd2lkdGggPSB3aWR0aDtcblx0XHRfaGVpZ2h0ID0gaGVpZ2h0O1xuXG5cdFx0X2NhbnZhcy53aWR0aCA9IHdpZHRoICogX3BpeGVsUmF0aW87XG5cdFx0X2NhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBfcGl4ZWxSYXRpbztcblxuXHRcdGlmICggdXBkYXRlU3R5bGUgIT09IGZhbHNlICkge1xuXG5cdFx0XHRfY2FudmFzLnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xuXHRcdFx0X2NhbnZhcy5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5zZXRWaWV3cG9ydCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xuXG5cdH07XG5cblx0dGhpcy5nZXREcmF3aW5nQnVmZmVyU2l6ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB7XG5cdFx0XHR3aWR0aDogX3dpZHRoICogX3BpeGVsUmF0aW8sXG5cdFx0XHRoZWlnaHQ6IF9oZWlnaHQgKiBfcGl4ZWxSYXRpb1xuXHRcdH07XG5cblx0fTtcblxuXHR0aGlzLnNldERyYXdpbmdCdWZmZXJTaXplID0gZnVuY3Rpb24gKCB3aWR0aCwgaGVpZ2h0LCBwaXhlbFJhdGlvICkge1xuXG5cdFx0X3dpZHRoID0gd2lkdGg7XG5cdFx0X2hlaWdodCA9IGhlaWdodDtcblxuXHRcdF9waXhlbFJhdGlvID0gcGl4ZWxSYXRpbztcblxuXHRcdF9jYW52YXMud2lkdGggPSB3aWR0aCAqIHBpeGVsUmF0aW87XG5cdFx0X2NhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBwaXhlbFJhdGlvO1xuXG5cdFx0dGhpcy5zZXRWaWV3cG9ydCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xuXG5cdH07XG5cblx0dGhpcy5nZXRDdXJyZW50Vmlld3BvcnQgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gX2N1cnJlbnRWaWV3cG9ydDtcblxuXHR9O1xuXG5cdHRoaXMuc2V0Vmlld3BvcnQgPSBmdW5jdGlvbiAoIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRfdmlld3BvcnQuc2V0KCB4LCBfaGVpZ2h0IC0geSAtIGhlaWdodCwgd2lkdGgsIGhlaWdodCApO1xuXHRcdHN0YXRlLnZpZXdwb3J0KCBfY3VycmVudFZpZXdwb3J0LmNvcHkoIF92aWV3cG9ydCApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApICk7XG5cblx0fTtcblxuXHR0aGlzLnNldFNjaXNzb3IgPSBmdW5jdGlvbiAoIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRfc2Npc3Nvci5zZXQoIHgsIF9oZWlnaHQgLSB5IC0gaGVpZ2h0LCB3aWR0aCwgaGVpZ2h0ICk7XG5cdFx0c3RhdGUuc2Npc3NvciggX2N1cnJlbnRTY2lzc29yLmNvcHkoIF9zY2lzc29yICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkgKTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0U2Npc3NvclRlc3QgPSBmdW5jdGlvbiAoIGJvb2xlYW4gKSB7XG5cblx0XHRzdGF0ZS5zZXRTY2lzc29yVGVzdCggX3NjaXNzb3JUZXN0ID0gYm9vbGVhbiApO1xuXG5cdH07XG5cblx0Ly8gQ2xlYXJpbmdcblxuXHR0aGlzLmdldENsZWFyQ29sb3IgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gYmFja2dyb3VuZC5nZXRDbGVhckNvbG9yKCk7XG5cblx0fTtcblxuXHR0aGlzLnNldENsZWFyQ29sb3IgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRiYWNrZ3JvdW5kLnNldENsZWFyQ29sb3IuYXBwbHkoIGJhY2tncm91bmQsIGFyZ3VtZW50cyApO1xuXG5cdH07XG5cblx0dGhpcy5nZXRDbGVhckFscGhhID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIGJhY2tncm91bmQuZ2V0Q2xlYXJBbHBoYSgpO1xuXG5cdH07XG5cblx0dGhpcy5zZXRDbGVhckFscGhhID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0YmFja2dyb3VuZC5zZXRDbGVhckFscGhhLmFwcGx5KCBiYWNrZ3JvdW5kLCBhcmd1bWVudHMgKTtcblxuXHR9O1xuXG5cdHRoaXMuY2xlYXIgPSBmdW5jdGlvbiAoIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApIHtcblxuXHRcdHZhciBiaXRzID0gMDtcblxuXHRcdGlmICggY29sb3IgPT09IHVuZGVmaW5lZCB8fCBjb2xvciApIGJpdHMgfD0gX2dsLkNPTE9SX0JVRkZFUl9CSVQ7XG5cdFx0aWYgKCBkZXB0aCA9PT0gdW5kZWZpbmVkIHx8IGRlcHRoICkgYml0cyB8PSBfZ2wuREVQVEhfQlVGRkVSX0JJVDtcblx0XHRpZiAoIHN0ZW5jaWwgPT09IHVuZGVmaW5lZCB8fCBzdGVuY2lsICkgYml0cyB8PSBfZ2wuU1RFTkNJTF9CVUZGRVJfQklUO1xuXG5cdFx0X2dsLmNsZWFyKCBiaXRzICk7XG5cblx0fTtcblxuXHR0aGlzLmNsZWFyQ29sb3IgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmNsZWFyKCB0cnVlLCBmYWxzZSwgZmFsc2UgKTtcblxuXHR9O1xuXG5cdHRoaXMuY2xlYXJEZXB0aCA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuY2xlYXIoIGZhbHNlLCB0cnVlLCBmYWxzZSApO1xuXG5cdH07XG5cblx0dGhpcy5jbGVhclN0ZW5jaWwgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmNsZWFyKCBmYWxzZSwgZmFsc2UsIHRydWUgKTtcblxuXHR9O1xuXG5cdHRoaXMuY2xlYXJUYXJnZXQgPSBmdW5jdGlvbiAoIHJlbmRlclRhcmdldCwgY29sb3IsIGRlcHRoLCBzdGVuY2lsICkge1xuXG5cdFx0dGhpcy5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApO1xuXHRcdHRoaXMuY2xlYXIoIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApO1xuXG5cdH07XG5cblx0Ly9cblxuXHR0aGlzLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRfY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoICd3ZWJnbGNvbnRleHRsb3N0Jywgb25Db250ZXh0TG9zdCwgZmFsc2UgKTtcblx0XHRfY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoICd3ZWJnbGNvbnRleHRyZXN0b3JlZCcsIG9uQ29udGV4dFJlc3RvcmUsIGZhbHNlICk7XG5cblx0XHRyZW5kZXJMaXN0cy5kaXNwb3NlKCk7XG5cdFx0cmVuZGVyU3RhdGVzLmRpc3Bvc2UoKTtcblx0XHRwcm9wZXJ0aWVzLmRpc3Bvc2UoKTtcblx0XHRvYmplY3RzLmRpc3Bvc2UoKTtcblxuXHRcdHZyLmRpc3Bvc2UoKTtcblxuXHRcdHN0b3BBbmltYXRpb24oKTtcblxuXHR9O1xuXG5cdC8vIEV2ZW50c1xuXG5cdGZ1bmN0aW9uIG9uQ29udGV4dExvc3QoIGV2ZW50ICkge1xuXG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdGNvbnNvbGUubG9nKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQ29udGV4dCBMb3N0LicgKTtcblxuXHRcdF9pc0NvbnRleHRMb3N0ID0gdHJ1ZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gb25Db250ZXh0UmVzdG9yZSggLyogZXZlbnQgKi8gKSB7XG5cblx0XHRjb25zb2xlLmxvZyggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IENvbnRleHQgUmVzdG9yZWQuJyApO1xuXG5cdFx0X2lzQ29udGV4dExvc3QgPSBmYWxzZTtcblxuXHRcdGluaXRHTENvbnRleHQoKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gb25NYXRlcmlhbERpc3Bvc2UoIGV2ZW50ICkge1xuXG5cdFx0dmFyIG1hdGVyaWFsID0gZXZlbnQudGFyZ2V0O1xuXG5cdFx0bWF0ZXJpYWwucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvbk1hdGVyaWFsRGlzcG9zZSApO1xuXG5cdFx0ZGVhbGxvY2F0ZU1hdGVyaWFsKCBtYXRlcmlhbCApO1xuXG5cdH1cblxuXHQvLyBCdWZmZXIgZGVhbGxvY2F0aW9uXG5cblx0ZnVuY3Rpb24gZGVhbGxvY2F0ZU1hdGVyaWFsKCBtYXRlcmlhbCApIHtcblxuXHRcdHJlbGVhc2VNYXRlcmlhbFByb2dyYW1SZWZlcmVuY2UoIG1hdGVyaWFsICk7XG5cblx0XHRwcm9wZXJ0aWVzLnJlbW92ZSggbWF0ZXJpYWwgKTtcblxuXHR9XG5cblxuXHRmdW5jdGlvbiByZWxlYXNlTWF0ZXJpYWxQcm9ncmFtUmVmZXJlbmNlKCBtYXRlcmlhbCApIHtcblxuXHRcdHZhciBwcm9ncmFtSW5mbyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApLnByb2dyYW07XG5cblx0XHRtYXRlcmlhbC5wcm9ncmFtID0gdW5kZWZpbmVkO1xuXG5cdFx0aWYgKCBwcm9ncmFtSW5mbyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRwcm9ncmFtQ2FjaGUucmVsZWFzZVByb2dyYW0oIHByb2dyYW1JbmZvICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIEJ1ZmZlciByZW5kZXJpbmdcblxuXHRmdW5jdGlvbiByZW5kZXJPYmplY3RJbW1lZGlhdGUoIG9iamVjdCwgcHJvZ3JhbSwgbWF0ZXJpYWwgKSB7XG5cblx0XHRvYmplY3QucmVuZGVyKCBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdFx0X3RoaXMucmVuZGVyQnVmZmVySW1tZWRpYXRlKCBvYmplY3QsIHByb2dyYW0sIG1hdGVyaWFsICk7XG5cblx0XHR9ICk7XG5cblx0fVxuXG5cdHRoaXMucmVuZGVyQnVmZmVySW1tZWRpYXRlID0gZnVuY3Rpb24gKCBvYmplY3QsIHByb2dyYW0sIG1hdGVyaWFsICkge1xuXG5cdFx0c3RhdGUuaW5pdEF0dHJpYnV0ZXMoKTtcblxuXHRcdHZhciBidWZmZXJzID0gcHJvcGVydGllcy5nZXQoIG9iamVjdCApO1xuXG5cdFx0aWYgKCBvYmplY3QuaGFzUG9zaXRpb25zICYmICEgYnVmZmVycy5wb3NpdGlvbiApIGJ1ZmZlcnMucG9zaXRpb24gPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cdFx0aWYgKCBvYmplY3QuaGFzTm9ybWFscyAmJiAhIGJ1ZmZlcnMubm9ybWFsICkgYnVmZmVycy5ub3JtYWwgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cdFx0aWYgKCBvYmplY3QuaGFzVXZzICYmICEgYnVmZmVycy51diApIGJ1ZmZlcnMudXYgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cdFx0aWYgKCBvYmplY3QuaGFzQ29sb3JzICYmICEgYnVmZmVycy5jb2xvciApIGJ1ZmZlcnMuY29sb3IgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cblx0XHR2YXIgcHJvZ3JhbUF0dHJpYnV0ZXMgPSBwcm9ncmFtLmdldEF0dHJpYnV0ZXMoKTtcblxuXHRcdGlmICggb2JqZWN0Lmhhc1Bvc2l0aW9ucyApIHtcblxuXHRcdFx0X2dsLmJpbmRCdWZmZXIoIF9nbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcnMucG9zaXRpb24gKTtcblx0XHRcdF9nbC5idWZmZXJEYXRhKCBfZ2wuQVJSQVlfQlVGRkVSLCBvYmplY3QucG9zaXRpb25BcnJheSwgX2dsLkRZTkFNSUNfRFJBVyApO1xuXG5cdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGVzLnBvc2l0aW9uICk7XG5cdFx0XHRfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZXMucG9zaXRpb24sIDMsIF9nbC5GTE9BVCwgZmFsc2UsIDAsIDAgKTtcblxuXHRcdH1cblxuXHRcdGlmICggb2JqZWN0Lmhhc05vcm1hbHMgKSB7XG5cblx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXJzLm5vcm1hbCApO1xuXG5cdFx0XHRpZiAoICEgbWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCAmJlxuXHRcdFx0XHQhIG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgJiZcblx0XHRcdFx0ISBtYXRlcmlhbC5pc01lc2hOb3JtYWxNYXRlcmlhbCAmJlxuXHRcdFx0XHRtYXRlcmlhbC5mbGF0U2hhZGluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBvYmplY3QuY291bnQgKiAzOyBpIDwgbDsgaSArPSA5ICkge1xuXG5cdFx0XHRcdFx0dmFyIGFycmF5ID0gb2JqZWN0Lm5vcm1hbEFycmF5O1xuXG5cdFx0XHRcdFx0dmFyIG54ID0gKCBhcnJheVsgaSArIDAgXSArIGFycmF5WyBpICsgMyBdICsgYXJyYXlbIGkgKyA2IF0gKSAvIDM7XG5cdFx0XHRcdFx0dmFyIG55ID0gKCBhcnJheVsgaSArIDEgXSArIGFycmF5WyBpICsgNCBdICsgYXJyYXlbIGkgKyA3IF0gKSAvIDM7XG5cdFx0XHRcdFx0dmFyIG56ID0gKCBhcnJheVsgaSArIDIgXSArIGFycmF5WyBpICsgNSBdICsgYXJyYXlbIGkgKyA4IF0gKSAvIDM7XG5cblx0XHRcdFx0XHRhcnJheVsgaSArIDAgXSA9IG54O1xuXHRcdFx0XHRcdGFycmF5WyBpICsgMSBdID0gbnk7XG5cdFx0XHRcdFx0YXJyYXlbIGkgKyAyIF0gPSBuejtcblxuXHRcdFx0XHRcdGFycmF5WyBpICsgMyBdID0gbng7XG5cdFx0XHRcdFx0YXJyYXlbIGkgKyA0IF0gPSBueTtcblx0XHRcdFx0XHRhcnJheVsgaSArIDUgXSA9IG56O1xuXG5cdFx0XHRcdFx0YXJyYXlbIGkgKyA2IF0gPSBueDtcblx0XHRcdFx0XHRhcnJheVsgaSArIDcgXSA9IG55O1xuXHRcdFx0XHRcdGFycmF5WyBpICsgOCBdID0gbno7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdF9nbC5idWZmZXJEYXRhKCBfZ2wuQVJSQVlfQlVGRkVSLCBvYmplY3Qubm9ybWFsQXJyYXksIF9nbC5EWU5BTUlDX0RSQVcgKTtcblxuXHRcdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlcy5ub3JtYWwgKTtcblxuXHRcdFx0X2dsLnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGVzLm5vcm1hbCwgMywgX2dsLkZMT0FULCBmYWxzZSwgMCwgMCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QuaGFzVXZzICYmIG1hdGVyaWFsLm1hcCApIHtcblxuXHRcdFx0X2dsLmJpbmRCdWZmZXIoIF9nbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcnMudXYgKTtcblx0XHRcdF9nbC5idWZmZXJEYXRhKCBfZ2wuQVJSQVlfQlVGRkVSLCBvYmplY3QudXZBcnJheSwgX2dsLkRZTkFNSUNfRFJBVyApO1xuXG5cdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGVzLnV2ICk7XG5cblx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlcy51diwgMiwgX2dsLkZMT0FULCBmYWxzZSwgMCwgMCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QuaGFzQ29sb3JzICYmIG1hdGVyaWFsLnZlcnRleENvbG9ycyAhPT0gTm9Db2xvcnMgKSB7XG5cblx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXJzLmNvbG9yICk7XG5cdFx0XHRfZ2wuYnVmZmVyRGF0YSggX2dsLkFSUkFZX0JVRkZFUiwgb2JqZWN0LmNvbG9yQXJyYXksIF9nbC5EWU5BTUlDX0RSQVcgKTtcblxuXHRcdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlcy5jb2xvciApO1xuXG5cdFx0XHRfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZXMuY29sb3IsIDMsIF9nbC5GTE9BVCwgZmFsc2UsIDAsIDAgKTtcblxuXHRcdH1cblxuXHRcdHN0YXRlLmRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCk7XG5cblx0XHRfZ2wuZHJhd0FycmF5cyggX2dsLlRSSUFOR0xFUywgMCwgb2JqZWN0LmNvdW50ICk7XG5cblx0XHRvYmplY3QuY291bnQgPSAwO1xuXG5cdH07XG5cblx0dGhpcy5yZW5kZXJCdWZmZXJEaXJlY3QgPSBmdW5jdGlvbiAoIGNhbWVyYSwgZm9nLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIG9iamVjdCwgZ3JvdXAgKSB7XG5cblx0XHR2YXIgZnJvbnRGYWNlQ1cgPSAoIG9iamVjdC5pc01lc2ggJiYgb2JqZWN0Lm1hdHJpeFdvcmxkLmRldGVybWluYW50KCkgPCAwICk7XG5cblx0XHRzdGF0ZS5zZXRNYXRlcmlhbCggbWF0ZXJpYWwsIGZyb250RmFjZUNXICk7XG5cblx0XHR2YXIgcHJvZ3JhbSA9IHNldFByb2dyYW0oIGNhbWVyYSwgZm9nLCBtYXRlcmlhbCwgb2JqZWN0ICk7XG5cdFx0dmFyIGdlb21ldHJ5UHJvZ3JhbSA9IGdlb21ldHJ5LmlkICsgJ18nICsgcHJvZ3JhbS5pZCArICdfJyArICggbWF0ZXJpYWwud2lyZWZyYW1lID09PSB0cnVlICk7XG5cblx0XHR2YXIgdXBkYXRlQnVmZmVycyA9IGZhbHNlO1xuXG5cdFx0aWYgKCBnZW9tZXRyeVByb2dyYW0gIT09IF9jdXJyZW50R2VvbWV0cnlQcm9ncmFtICkge1xuXG5cdFx0XHRfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSA9IGdlb21ldHJ5UHJvZ3JhbTtcblx0XHRcdHVwZGF0ZUJ1ZmZlcnMgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QubW9ycGhUYXJnZXRJbmZsdWVuY2VzICkge1xuXG5cdFx0XHRtb3JwaHRhcmdldHMudXBkYXRlKCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcHJvZ3JhbSApO1xuXG5cdFx0XHR1cGRhdGVCdWZmZXJzID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHR2YXIgaW5kZXggPSBnZW9tZXRyeS5pbmRleDtcblx0XHR2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHRcdHZhciByYW5nZUZhY3RvciA9IDE7XG5cblx0XHRpZiAoIG1hdGVyaWFsLndpcmVmcmFtZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0aW5kZXggPSBnZW9tZXRyaWVzLmdldFdpcmVmcmFtZUF0dHJpYnV0ZSggZ2VvbWV0cnkgKTtcblx0XHRcdHJhbmdlRmFjdG9yID0gMjtcblxuXHRcdH1cblxuXHRcdHZhciBhdHRyaWJ1dGU7XG5cdFx0dmFyIHJlbmRlcmVyID0gYnVmZmVyUmVuZGVyZXI7XG5cblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldCggaW5kZXggKTtcblxuXHRcdFx0cmVuZGVyZXIgPSBpbmRleGVkQnVmZmVyUmVuZGVyZXI7XG5cdFx0XHRyZW5kZXJlci5zZXRJbmRleCggYXR0cmlidXRlICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHVwZGF0ZUJ1ZmZlcnMgKSB7XG5cblx0XHRcdHNldHVwVmVydGV4QXR0cmlidXRlcyggbWF0ZXJpYWwsIHByb2dyYW0sIGdlb21ldHJ5ICk7XG5cblx0XHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdFx0X2dsLmJpbmRCdWZmZXIoIF9nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgYXR0cmlidXRlLmJ1ZmZlciApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0dmFyIGRhdGFDb3VudCA9IEluZmluaXR5O1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0ZGF0YUNvdW50ID0gaW5kZXguY291bnQ7XG5cblx0XHR9IGVsc2UgaWYgKCBwb3NpdGlvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRkYXRhQ291bnQgPSBwb3NpdGlvbi5jb3VudDtcblxuXHRcdH1cblxuXHRcdHZhciByYW5nZVN0YXJ0ID0gZ2VvbWV0cnkuZHJhd1JhbmdlLnN0YXJ0ICogcmFuZ2VGYWN0b3I7XG5cdFx0dmFyIHJhbmdlQ291bnQgPSBnZW9tZXRyeS5kcmF3UmFuZ2UuY291bnQgKiByYW5nZUZhY3RvcjtcblxuXHRcdHZhciBncm91cFN0YXJ0ID0gZ3JvdXAgIT09IG51bGwgPyBncm91cC5zdGFydCAqIHJhbmdlRmFjdG9yIDogMDtcblx0XHR2YXIgZ3JvdXBDb3VudCA9IGdyb3VwICE9PSBudWxsID8gZ3JvdXAuY291bnQgKiByYW5nZUZhY3RvciA6IEluZmluaXR5O1xuXG5cdFx0dmFyIGRyYXdTdGFydCA9IE1hdGgubWF4KCByYW5nZVN0YXJ0LCBncm91cFN0YXJ0ICk7XG5cdFx0dmFyIGRyYXdFbmQgPSBNYXRoLm1pbiggZGF0YUNvdW50LCByYW5nZVN0YXJ0ICsgcmFuZ2VDb3VudCwgZ3JvdXBTdGFydCArIGdyb3VwQ291bnQgKSAtIDE7XG5cblx0XHR2YXIgZHJhd0NvdW50ID0gTWF0aC5tYXgoIDAsIGRyYXdFbmQgLSBkcmF3U3RhcnQgKyAxICk7XG5cblx0XHRpZiAoIGRyYXdDb3VudCA9PT0gMCApIHJldHVybjtcblxuXHRcdC8vXG5cblx0XHRpZiAoIG9iamVjdC5pc01lc2ggKSB7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwud2lyZWZyYW1lID09PSB0cnVlICkge1xuXG5cdFx0XHRcdHN0YXRlLnNldExpbmVXaWR0aCggbWF0ZXJpYWwud2lyZWZyYW1lTGluZXdpZHRoICogZ2V0VGFyZ2V0UGl4ZWxSYXRpbygpICk7XG5cdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5MSU5FUyApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHN3aXRjaCAoIG9iamVjdC5kcmF3TW9kZSApIHtcblxuXHRcdFx0XHRcdGNhc2UgVHJpYW5nbGVzRHJhd01vZGU6XG5cdFx0XHRcdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuVFJJQU5HTEVTICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgVHJpYW5nbGVTdHJpcERyYXdNb2RlOlxuXHRcdFx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLlRSSUFOR0xFX1NUUklQICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgVHJpYW5nbGVGYW5EcmF3TW9kZTpcblx0XHRcdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5UUklBTkdMRV9GQU4gKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cblx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNMaW5lICkge1xuXG5cdFx0XHR2YXIgbGluZVdpZHRoID0gbWF0ZXJpYWwubGluZXdpZHRoO1xuXG5cdFx0XHRpZiAoIGxpbmVXaWR0aCA9PT0gdW5kZWZpbmVkICkgbGluZVdpZHRoID0gMTsgLy8gTm90IHVzaW5nIExpbmUqTWF0ZXJpYWxcblxuXHRcdFx0c3RhdGUuc2V0TGluZVdpZHRoKCBsaW5lV2lkdGggKiBnZXRUYXJnZXRQaXhlbFJhdGlvKCkgKTtcblxuXHRcdFx0aWYgKCBvYmplY3QuaXNMaW5lU2VnbWVudHMgKSB7XG5cblx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLkxJTkVTICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0xpbmVMb29wICkge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5MSU5FX0xPT1AgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuTElORV9TVFJJUCApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNQb2ludHMgKSB7XG5cblx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5QT0lOVFMgKTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCA+IDAgKSB7XG5cblx0XHRcdFx0cmVuZGVyZXIucmVuZGVySW5zdGFuY2VzKCBnZW9tZXRyeSwgZHJhd1N0YXJ0LCBkcmF3Q291bnQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKCBkcmF3U3RhcnQsIGRyYXdDb3VudCApO1xuXG5cdFx0fVxuXG5cdH07XG5cblx0ZnVuY3Rpb24gc2V0dXBWZXJ0ZXhBdHRyaWJ1dGVzKCBtYXRlcmlhbCwgcHJvZ3JhbSwgZ2VvbWV0cnkgKSB7XG5cblx0XHRpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApID09PSBudWxsICkge1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnNldHVwVmVydGV4QXR0cmlidXRlczogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuJyApO1xuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHN0YXRlLmluaXRBdHRyaWJ1dGVzKCk7XG5cblx0XHR2YXIgZ2VvbWV0cnlBdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcblxuXHRcdHZhciBwcm9ncmFtQXR0cmlidXRlcyA9IHByb2dyYW0uZ2V0QXR0cmlidXRlcygpO1xuXG5cdFx0dmFyIG1hdGVyaWFsRGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyA9IG1hdGVyaWFsLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXM7XG5cblx0XHRmb3IgKCB2YXIgbmFtZSBpbiBwcm9ncmFtQXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIHByb2dyYW1BdHRyaWJ1dGUgPSBwcm9ncmFtQXR0cmlidXRlc1sgbmFtZSBdO1xuXG5cdFx0XHRpZiAoIHByb2dyYW1BdHRyaWJ1dGUgPj0gMCApIHtcblxuXHRcdFx0XHR2YXIgZ2VvbWV0cnlBdHRyaWJ1dGUgPSBnZW9tZXRyeUF0dHJpYnV0ZXNbIG5hbWUgXTtcblxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5QXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR2YXIgbm9ybWFsaXplZCA9IGdlb21ldHJ5QXR0cmlidXRlLm5vcm1hbGl6ZWQ7XG5cdFx0XHRcdFx0dmFyIHNpemUgPSBnZW9tZXRyeUF0dHJpYnV0ZS5pdGVtU2l6ZTtcblxuXHRcdFx0XHRcdHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldCggZ2VvbWV0cnlBdHRyaWJ1dGUgKTtcblxuXHRcdFx0XHRcdC8vIFRPRE8gQXR0cmlidXRlIG1heSBub3QgYmUgYXZhaWxhYmxlIG9uIGNvbnRleHQgcmVzdG9yZVxuXG5cdFx0XHRcdFx0aWYgKCBhdHRyaWJ1dGUgPT09IHVuZGVmaW5lZCApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0dmFyIGJ1ZmZlciA9IGF0dHJpYnV0ZS5idWZmZXI7XG5cdFx0XHRcdFx0dmFyIHR5cGUgPSBhdHRyaWJ1dGUudHlwZTtcblx0XHRcdFx0XHR2YXIgYnl0ZXNQZXJFbGVtZW50ID0gYXR0cmlidXRlLmJ5dGVzUGVyRWxlbWVudDtcblxuXHRcdFx0XHRcdGlmICggZ2VvbWV0cnlBdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGRhdGEgPSBnZW9tZXRyeUF0dHJpYnV0ZS5kYXRhO1xuXHRcdFx0XHRcdFx0dmFyIHN0cmlkZSA9IGRhdGEuc3RyaWRlO1xuXHRcdFx0XHRcdFx0dmFyIG9mZnNldCA9IGdlb21ldHJ5QXR0cmlidXRlLm9mZnNldDtcblxuXHRcdFx0XHRcdFx0aWYgKCBkYXRhICYmIGRhdGEuaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciApIHtcblxuXHRcdFx0XHRcdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBwcm9ncmFtQXR0cmlidXRlLCBkYXRhLm1lc2hQZXJBdHRyaWJ1dGUgKTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCA9IGRhdGEubWVzaFBlckF0dHJpYnV0ZSAqIGRhdGEuY291bnQ7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIgKTtcblx0XHRcdFx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlLCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCBzdHJpZGUgKiBieXRlc1BlckVsZW1lbnQsIG9mZnNldCAqIGJ5dGVzUGVyRWxlbWVudCApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBnZW9tZXRyeUF0dHJpYnV0ZS5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSApIHtcblxuXHRcdFx0XHRcdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBwcm9ncmFtQXR0cmlidXRlLCBnZW9tZXRyeUF0dHJpYnV0ZS5tZXNoUGVyQXR0cmlidXRlICk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Z2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgPSBnZW9tZXRyeUF0dHJpYnV0ZS5tZXNoUGVyQXR0cmlidXRlICogZ2VvbWV0cnlBdHRyaWJ1dGUuY291bnQ7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIgKTtcblx0XHRcdFx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlLCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCAwLCAwICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWxEZWZhdWx0QXR0cmlidXRlVmFsdWVzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR2YXIgdmFsdWUgPSBtYXRlcmlhbERlZmF1bHRBdHRyaWJ1dGVWYWx1ZXNbIG5hbWUgXTtcblxuXHRcdFx0XHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0c3dpdGNoICggdmFsdWUubGVuZ3RoICkge1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgMjpcblx0XHRcdFx0XHRcdFx0XHRfZ2wudmVydGV4QXR0cmliMmZ2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgMzpcblx0XHRcdFx0XHRcdFx0XHRfZ2wudmVydGV4QXR0cmliM2Z2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgNDpcblx0XHRcdFx0XHRcdFx0XHRfZ2wudmVydGV4QXR0cmliNGZ2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdFx0X2dsLnZlcnRleEF0dHJpYjFmdiggcHJvZ3JhbUF0dHJpYnV0ZSwgdmFsdWUgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0c3RhdGUuZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKTtcblxuXHR9XG5cblx0Ly8gQ29tcGlsZVxuXG5cdHRoaXMuY29tcGlsZSA9IGZ1bmN0aW9uICggc2NlbmUsIGNhbWVyYSApIHtcblxuXHRcdGN1cnJlbnRSZW5kZXJTdGF0ZSA9IHJlbmRlclN0YXRlcy5nZXQoIHNjZW5lLCBjYW1lcmEgKTtcblx0XHRjdXJyZW50UmVuZGVyU3RhdGUuaW5pdCgpO1xuXG5cdFx0c2NlbmUudHJhdmVyc2UoIGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0XHRpZiAoIG9iamVjdC5pc0xpZ2h0ICkge1xuXG5cdFx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5wdXNoTGlnaHQoIG9iamVjdCApO1xuXG5cdFx0XHRcdGlmICggb2JqZWN0LmNhc3RTaGFkb3cgKSB7XG5cblx0XHRcdFx0XHRjdXJyZW50UmVuZGVyU3RhdGUucHVzaFNoYWRvdyggb2JqZWN0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9ICk7XG5cblx0XHRjdXJyZW50UmVuZGVyU3RhdGUuc2V0dXBMaWdodHMoIGNhbWVyYSApO1xuXG5cdFx0c2NlbmUudHJhdmVyc2UoIGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0XHRpZiAoIG9iamVjdC5tYXRlcmlhbCApIHtcblxuXHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG9iamVjdC5tYXRlcmlhbCApICkge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgb2JqZWN0Lm1hdGVyaWFsLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0aW5pdE1hdGVyaWFsKCBvYmplY3QubWF0ZXJpYWxbIGkgXSwgc2NlbmUuZm9nLCBvYmplY3QgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0aW5pdE1hdGVyaWFsKCBvYmplY3QubWF0ZXJpYWwsIHNjZW5lLmZvZywgb2JqZWN0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9ICk7XG5cblx0fTtcblxuXHQvLyBBbmltYXRpb24gTG9vcFxuXG5cdHZhciBpc0FuaW1hdGluZyA9IGZhbHNlO1xuXHR2YXIgb25BbmltYXRpb25GcmFtZSA9IG51bGw7XG5cblx0ZnVuY3Rpb24gc3RhcnRBbmltYXRpb24oKSB7XG5cblx0XHRpZiAoIGlzQW5pbWF0aW5nICkgcmV0dXJuO1xuXG5cdFx0cmVxdWVzdEFuaW1hdGlvbkxvb3BGcmFtZSgpO1xuXG5cdFx0aXNBbmltYXRpbmcgPSB0cnVlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzdG9wQW5pbWF0aW9uKCkge1xuXG5cdFx0aXNBbmltYXRpbmcgPSBmYWxzZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVxdWVzdEFuaW1hdGlvbkxvb3BGcmFtZSgpIHtcblxuXHRcdHZhciBkZXZpY2UgPSB2ci5nZXREZXZpY2UoKTtcblxuXHRcdGlmICggZGV2aWNlICYmIGRldmljZS5pc1ByZXNlbnRpbmcgKSB7XG5cblx0XHRcdGRldmljZS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGFuaW1hdGlvbkxvb3AgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGFuaW1hdGlvbkxvb3AgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gYW5pbWF0aW9uTG9vcCggdGltZSApIHtcblxuXHRcdGlmICggaXNBbmltYXRpbmcgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0b25BbmltYXRpb25GcmFtZSggdGltZSApO1xuXG5cdFx0cmVxdWVzdEFuaW1hdGlvbkxvb3BGcmFtZSgpO1xuXG5cdH1cblxuXHR0aGlzLmFuaW1hdGUgPSBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0b25BbmltYXRpb25GcmFtZSA9IGNhbGxiYWNrO1xuXHRcdG9uQW5pbWF0aW9uRnJhbWUgIT09IG51bGwgPyBzdGFydEFuaW1hdGlvbigpIDogc3RvcEFuaW1hdGlvbigpO1xuXG5cdH07XG5cblx0Ly8gUmVuZGVyaW5nXG5cblx0dGhpcy5yZW5kZXIgPSBmdW5jdGlvbiAoIHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldCwgZm9yY2VDbGVhciApIHtcblxuXHRcdGlmICggISAoIGNhbWVyYSAmJiBjYW1lcmEuaXNDYW1lcmEgKSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVuZGVyOiBjYW1lcmEgaXMgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkNhbWVyYS4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIF9pc0NvbnRleHRMb3N0ICkgcmV0dXJuO1xuXG5cdFx0Ly8gcmVzZXQgY2FjaGluZyBmb3IgdGhpcyBmcmFtZVxuXG5cdFx0X2N1cnJlbnRHZW9tZXRyeVByb2dyYW0gPSAnJztcblx0XHRfY3VycmVudE1hdGVyaWFsSWQgPSAtIDE7XG5cdFx0X2N1cnJlbnRDYW1lcmEgPSBudWxsO1xuXG5cdFx0Ly8gdXBkYXRlIHNjZW5lIGdyYXBoXG5cblx0XHRpZiAoIHNjZW5lLmF1dG9VcGRhdGUgPT09IHRydWUgKSBzY2VuZS51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0Ly8gdXBkYXRlIGNhbWVyYSBtYXRyaWNlcyBhbmQgZnJ1c3R1bVxuXG5cdFx0aWYgKCBjYW1lcmEucGFyZW50ID09PSBudWxsICkgY2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0XHRpZiAoIHZyLmVuYWJsZWQgKSB7XG5cblx0XHRcdGNhbWVyYSA9IHZyLmdldENhbWVyYSggY2FtZXJhICk7XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0Y3VycmVudFJlbmRlclN0YXRlID0gcmVuZGVyU3RhdGVzLmdldCggc2NlbmUsIGNhbWVyYSApO1xuXHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5pbml0KCk7XG5cblx0XHRzY2VuZS5vbkJlZm9yZVJlbmRlciggX3RoaXMsIHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldCApO1xuXG5cdFx0X3Byb2pTY3JlZW5NYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLnByb2plY3Rpb25NYXRyaXgsIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblx0XHRfZnJ1c3R1bS5zZXRGcm9tTWF0cml4KCBfcHJvalNjcmVlbk1hdHJpeCApO1xuXG5cdFx0X2xvY2FsQ2xpcHBpbmdFbmFibGVkID0gdGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZDtcblx0XHRfY2xpcHBpbmdFbmFibGVkID0gX2NsaXBwaW5nLmluaXQoIHRoaXMuY2xpcHBpbmdQbGFuZXMsIF9sb2NhbENsaXBwaW5nRW5hYmxlZCwgY2FtZXJhICk7XG5cblx0XHRjdXJyZW50UmVuZGVyTGlzdCA9IHJlbmRlckxpc3RzLmdldCggc2NlbmUsIGNhbWVyYSApO1xuXHRcdGN1cnJlbnRSZW5kZXJMaXN0LmluaXQoKTtcblxuXHRcdHByb2plY3RPYmplY3QoIHNjZW5lLCBjYW1lcmEsIF90aGlzLnNvcnRPYmplY3RzICk7XG5cblx0XHRpZiAoIF90aGlzLnNvcnRPYmplY3RzID09PSB0cnVlICkge1xuXG5cdFx0XHRjdXJyZW50UmVuZGVyTGlzdC5zb3J0KCk7XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0aWYgKCBfY2xpcHBpbmdFbmFibGVkICkgX2NsaXBwaW5nLmJlZ2luU2hhZG93cygpO1xuXG5cdFx0dmFyIHNoYWRvd3NBcnJheSA9IGN1cnJlbnRSZW5kZXJTdGF0ZS5zdGF0ZS5zaGFkb3dzQXJyYXk7XG5cblx0XHRzaGFkb3dNYXAucmVuZGVyKCBzaGFkb3dzQXJyYXksIHNjZW5lLCBjYW1lcmEgKTtcblxuXHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5zZXR1cExpZ2h0cyggY2FtZXJhICk7XG5cblx0XHRpZiAoIF9jbGlwcGluZ0VuYWJsZWQgKSBfY2xpcHBpbmcuZW5kU2hhZG93cygpO1xuXG5cdFx0Ly9cblxuXHRcdGlmICggdGhpcy5pbmZvLmF1dG9SZXNldCApIHRoaXMuaW5mby5yZXNldCgpO1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cmVuZGVyVGFyZ2V0ID0gbnVsbDtcblxuXHRcdH1cblxuXHRcdHRoaXMuc2V0UmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdC8vXG5cblx0XHRiYWNrZ3JvdW5kLnJlbmRlciggY3VycmVudFJlbmRlckxpc3QsIHNjZW5lLCBjYW1lcmEsIGZvcmNlQ2xlYXIgKTtcblxuXHRcdC8vIHJlbmRlciBzY2VuZVxuXG5cdFx0dmFyIG9wYXF1ZU9iamVjdHMgPSBjdXJyZW50UmVuZGVyTGlzdC5vcGFxdWU7XG5cdFx0dmFyIHRyYW5zcGFyZW50T2JqZWN0cyA9IGN1cnJlbnRSZW5kZXJMaXN0LnRyYW5zcGFyZW50O1xuXG5cdFx0aWYgKCBzY2VuZS5vdmVycmlkZU1hdGVyaWFsICkge1xuXG5cdFx0XHR2YXIgb3ZlcnJpZGVNYXRlcmlhbCA9IHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWw7XG5cblx0XHRcdGlmICggb3BhcXVlT2JqZWN0cy5sZW5ndGggKSByZW5kZXJPYmplY3RzKCBvcGFxdWVPYmplY3RzLCBzY2VuZSwgY2FtZXJhLCBvdmVycmlkZU1hdGVyaWFsICk7XG5cdFx0XHRpZiAoIHRyYW5zcGFyZW50T2JqZWN0cy5sZW5ndGggKSByZW5kZXJPYmplY3RzKCB0cmFuc3BhcmVudE9iamVjdHMsIHNjZW5lLCBjYW1lcmEsIG92ZXJyaWRlTWF0ZXJpYWwgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIG9wYXF1ZSBwYXNzIChmcm9udC10by1iYWNrIG9yZGVyKVxuXG5cdFx0XHRpZiAoIG9wYXF1ZU9iamVjdHMubGVuZ3RoICkgcmVuZGVyT2JqZWN0cyggb3BhcXVlT2JqZWN0cywgc2NlbmUsIGNhbWVyYSApO1xuXG5cdFx0XHQvLyB0cmFuc3BhcmVudCBwYXNzIChiYWNrLXRvLWZyb250IG9yZGVyKVxuXG5cdFx0XHRpZiAoIHRyYW5zcGFyZW50T2JqZWN0cy5sZW5ndGggKSByZW5kZXJPYmplY3RzKCB0cmFuc3BhcmVudE9iamVjdHMsIHNjZW5lLCBjYW1lcmEgKTtcblxuXHRcdH1cblxuXHRcdC8vIGN1c3RvbSByZW5kZXJlcnNcblxuXHRcdHZhciBzcHJpdGVzQXJyYXkgPSBjdXJyZW50UmVuZGVyU3RhdGUuc3RhdGUuc3ByaXRlc0FycmF5O1xuXG5cdFx0c3ByaXRlUmVuZGVyZXIucmVuZGVyKCBzcHJpdGVzQXJyYXksIHNjZW5lLCBjYW1lcmEgKTtcblxuXHRcdC8vIEdlbmVyYXRlIG1pcG1hcCBpZiB3ZSdyZSB1c2luZyBhbnkga2luZCBvZiBtaXBtYXAgZmlsdGVyaW5nXG5cblx0XHRpZiAoIHJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0dGV4dHVyZXMudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwKCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdH1cblxuXHRcdC8vIEVuc3VyZSBkZXB0aCBidWZmZXIgd3JpdGluZyBpcyBlbmFibGVkIHNvIGl0IGNhbiBiZSBjbGVhcmVkIG9uIG5leHQgcmVuZGVyXG5cblx0XHRzdGF0ZS5idWZmZXJzLmRlcHRoLnNldFRlc3QoIHRydWUgKTtcblx0XHRzdGF0ZS5idWZmZXJzLmRlcHRoLnNldE1hc2soIHRydWUgKTtcblx0XHRzdGF0ZS5idWZmZXJzLmNvbG9yLnNldE1hc2soIHRydWUgKTtcblxuXHRcdHN0YXRlLnNldFBvbHlnb25PZmZzZXQoIGZhbHNlICk7XG5cblx0XHRzY2VuZS5vbkFmdGVyUmVuZGVyKCBfdGhpcywgc2NlbmUsIGNhbWVyYSApO1xuXG5cdFx0aWYgKCB2ci5lbmFibGVkICkge1xuXG5cdFx0XHR2ci5zdWJtaXRGcmFtZSgpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gX2dsLmZpbmlzaCgpO1xuXG5cdFx0Y3VycmVudFJlbmRlckxpc3QgPSBudWxsO1xuXHRcdGN1cnJlbnRSZW5kZXJTdGF0ZSA9IG51bGw7XG5cblx0fTtcblxuXHQvKlxuXHQvLyBUT0RPIER1cGxpY2F0ZWQgY29kZSAoRnJ1c3R1bSlcblxuXHR2YXIgX3NwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRmdW5jdGlvbiBpc09iamVjdFZpZXdhYmxlKCBvYmplY3QgKSB7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsIClcblx0XHRcdGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0X3NwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApLlxuXHRcdGFwcGx5TWF0cml4NCggb2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cblx0XHRyZXR1cm4gaXNTcGhlcmVWaWV3YWJsZSggX3NwaGVyZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBpc1Nwcml0ZVZpZXdhYmxlKCBzcHJpdGUgKSB7XG5cblx0XHRfc3BoZXJlLmNlbnRlci5zZXQoIDAsIDAsIDAgKTtcblx0XHRfc3BoZXJlLnJhZGl1cyA9IDAuNzA3MTA2NzgxMTg2NTQ3Njtcblx0XHRfc3BoZXJlLmFwcGx5TWF0cml4NCggc3ByaXRlLm1hdHJpeFdvcmxkICk7XG5cblx0XHRyZXR1cm4gaXNTcGhlcmVWaWV3YWJsZSggX3NwaGVyZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBpc1NwaGVyZVZpZXdhYmxlKCBzcGhlcmUgKSB7XG5cblx0XHRpZiAoICEgX2ZydXN0dW0uaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkgKSByZXR1cm4gZmFsc2U7XG5cblx0XHR2YXIgbnVtUGxhbmVzID0gX2NsaXBwaW5nLm51bVBsYW5lcztcblxuXHRcdGlmICggbnVtUGxhbmVzID09PSAwICkgcmV0dXJuIHRydWU7XG5cblx0XHR2YXIgcGxhbmVzID0gX3RoaXMuY2xpcHBpbmdQbGFuZXMsXG5cblx0XHRcdGNlbnRlciA9IHNwaGVyZS5jZW50ZXIsXG5cdFx0XHRuZWdSYWQgPSAtIHNwaGVyZS5yYWRpdXMsXG5cdFx0XHRpID0gMDtcblxuXHRcdGRvIHtcblxuXHRcdFx0Ly8gb3V0IHdoZW4gZGVlcGVyIHRoYW4gcmFkaXVzIGluIHRoZSBuZWdhdGl2ZSBoYWxmc3BhY2Vcblx0XHRcdGlmICggcGxhbmVzWyBpIF0uZGlzdGFuY2VUb1BvaW50KCBjZW50ZXIgKSA8IG5lZ1JhZCApIHJldHVybiBmYWxzZTtcblxuXHRcdH0gd2hpbGUgKCArKyBpICE9PSBudW1QbGFuZXMgKTtcblxuXHRcdHJldHVybiB0cnVlO1xuXG5cdH1cblx0Ki9cblxuXHRmdW5jdGlvbiBwcm9qZWN0T2JqZWN0KCBvYmplY3QsIGNhbWVyYSwgc29ydE9iamVjdHMgKSB7XG5cblx0XHRpZiAoIG9iamVjdC52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdHZhciB2aXNpYmxlID0gb2JqZWN0LmxheWVycy50ZXN0KCBjYW1lcmEubGF5ZXJzICk7XG5cblx0XHRpZiAoIHZpc2libGUgKSB7XG5cblx0XHRcdGlmICggb2JqZWN0LmlzTGlnaHQgKSB7XG5cblx0XHRcdFx0Y3VycmVudFJlbmRlclN0YXRlLnB1c2hMaWdodCggb2JqZWN0ICk7XG5cblx0XHRcdFx0aWYgKCBvYmplY3QuY2FzdFNoYWRvdyApIHtcblxuXHRcdFx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5wdXNoU2hhZG93KCBvYmplY3QgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc1Nwcml0ZSApIHtcblxuXHRcdFx0XHRpZiAoICEgb2JqZWN0LmZydXN0dW1DdWxsZWQgfHwgX2ZydXN0dW0uaW50ZXJzZWN0c1Nwcml0ZSggb2JqZWN0ICkgKSB7XG5cblx0XHRcdFx0XHRjdXJyZW50UmVuZGVyU3RhdGUucHVzaFNwcml0ZSggb2JqZWN0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNJbW1lZGlhdGVSZW5kZXJPYmplY3QgKSB7XG5cblx0XHRcdFx0aWYgKCBzb3J0T2JqZWN0cyApIHtcblxuXHRcdFx0XHRcdF92ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggb2JqZWN0Lm1hdHJpeFdvcmxkIClcblx0XHRcdFx0XHRcdC5hcHBseU1hdHJpeDQoIF9wcm9qU2NyZWVuTWF0cml4ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGN1cnJlbnRSZW5kZXJMaXN0LnB1c2goIG9iamVjdCwgbnVsbCwgb2JqZWN0Lm1hdGVyaWFsLCBfdmVjdG9yMy56LCBudWxsICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc01lc2ggfHwgb2JqZWN0LmlzTGluZSB8fCBvYmplY3QuaXNQb2ludHMgKSB7XG5cblx0XHRcdFx0aWYgKCBvYmplY3QuaXNTa2lubmVkTWVzaCApIHtcblxuXHRcdFx0XHRcdG9iamVjdC5za2VsZXRvbi51cGRhdGUoKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCAhIG9iamVjdC5mcnVzdHVtQ3VsbGVkIHx8IF9mcnVzdHVtLmludGVyc2VjdHNPYmplY3QoIG9iamVjdCApICkge1xuXG5cdFx0XHRcdFx0aWYgKCBzb3J0T2JqZWN0cyApIHtcblxuXHRcdFx0XHRcdFx0X3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBvYmplY3QubWF0cml4V29ybGQgKVxuXHRcdFx0XHRcdFx0XHQuYXBwbHlNYXRyaXg0KCBfcHJvalNjcmVlbk1hdHJpeCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0cy51cGRhdGUoIG9iamVjdCApO1xuXHRcdFx0XHRcdHZhciBtYXRlcmlhbCA9IG9iamVjdC5tYXRlcmlhbDtcblxuXHRcdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggbWF0ZXJpYWwgKSApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwcztcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0dmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07XG5cdFx0XHRcdFx0XHRcdHZhciBncm91cE1hdGVyaWFsID0gbWF0ZXJpYWxbIGdyb3VwLm1hdGVyaWFsSW5kZXggXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGdyb3VwTWF0ZXJpYWwgJiYgZ3JvdXBNYXRlcmlhbC52aXNpYmxlICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Y3VycmVudFJlbmRlckxpc3QucHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgZ3JvdXBNYXRlcmlhbCwgX3ZlY3RvcjMueiwgZ3JvdXAgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLnZpc2libGUgKSB7XG5cblx0XHRcdFx0XHRcdGN1cnJlbnRSZW5kZXJMaXN0LnB1c2goIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBfdmVjdG9yMy56LCBudWxsICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgY2hpbGRyZW4gPSBvYmplY3QuY2hpbGRyZW47XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRwcm9qZWN0T2JqZWN0KCBjaGlsZHJlblsgaSBdLCBjYW1lcmEsIHNvcnRPYmplY3RzICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbmRlck9iamVjdHMoIHJlbmRlckxpc3QsIHNjZW5lLCBjYW1lcmEsIG92ZXJyaWRlTWF0ZXJpYWwgKSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSByZW5kZXJMaXN0Lmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciByZW5kZXJJdGVtID0gcmVuZGVyTGlzdFsgaSBdO1xuXG5cdFx0XHR2YXIgb2JqZWN0ID0gcmVuZGVySXRlbS5vYmplY3Q7XG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSByZW5kZXJJdGVtLmdlb21ldHJ5O1xuXHRcdFx0dmFyIG1hdGVyaWFsID0gb3ZlcnJpZGVNYXRlcmlhbCA9PT0gdW5kZWZpbmVkID8gcmVuZGVySXRlbS5tYXRlcmlhbCA6IG92ZXJyaWRlTWF0ZXJpYWw7XG5cdFx0XHR2YXIgZ3JvdXAgPSByZW5kZXJJdGVtLmdyb3VwO1xuXG5cdFx0XHRpZiAoIGNhbWVyYS5pc0FycmF5Q2FtZXJhICkge1xuXG5cdFx0XHRcdF9jdXJyZW50QXJyYXlDYW1lcmEgPSBjYW1lcmE7XG5cblx0XHRcdFx0dmFyIGNhbWVyYXMgPSBjYW1lcmEuY2FtZXJhcztcblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gY2FtZXJhcy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRcdHZhciBjYW1lcmEyID0gY2FtZXJhc1sgaiBdO1xuXG5cdFx0XHRcdFx0aWYgKCBvYmplY3QubGF5ZXJzLnRlc3QoIGNhbWVyYTIubGF5ZXJzICkgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBib3VuZHMgPSBjYW1lcmEyLmJvdW5kcztcblxuXHRcdFx0XHRcdFx0dmFyIHggPSBib3VuZHMueCAqIF93aWR0aDtcblx0XHRcdFx0XHRcdHZhciB5ID0gYm91bmRzLnkgKiBfaGVpZ2h0O1xuXHRcdFx0XHRcdFx0dmFyIHdpZHRoID0gYm91bmRzLnogKiBfd2lkdGg7XG5cdFx0XHRcdFx0XHR2YXIgaGVpZ2h0ID0gYm91bmRzLncgKiBfaGVpZ2h0O1xuXG5cdFx0XHRcdFx0XHRzdGF0ZS52aWV3cG9ydCggX2N1cnJlbnRWaWV3cG9ydC5zZXQoIHgsIHksIHdpZHRoLCBoZWlnaHQgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKSApO1xuXG5cdFx0XHRcdFx0XHRyZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYTIsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0X2N1cnJlbnRBcnJheUNhbWVyYSA9IG51bGw7XG5cblx0XHRcdFx0cmVuZGVyT2JqZWN0KCBvYmplY3QsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApIHtcblxuXHRcdG9iamVjdC5vbkJlZm9yZVJlbmRlciggX3RoaXMsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblx0XHRjdXJyZW50UmVuZGVyU3RhdGUgPSByZW5kZXJTdGF0ZXMuZ2V0KCBzY2VuZSwgX2N1cnJlbnRBcnJheUNhbWVyYSB8fCBjYW1lcmEgKTtcblxuXHRcdG9iamVjdC5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSwgb2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cdFx0b2JqZWN0Lm5vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoIG9iamVjdC5tb2RlbFZpZXdNYXRyaXggKTtcblxuXHRcdGlmICggb2JqZWN0LmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0ICkge1xuXG5cdFx0XHR2YXIgZnJvbnRGYWNlQ1cgPSAoIG9iamVjdC5pc01lc2ggJiYgb2JqZWN0Lm1hdHJpeFdvcmxkLmRldGVybWluYW50KCkgPCAwICk7XG5cblx0XHRcdHN0YXRlLnNldE1hdGVyaWFsKCBtYXRlcmlhbCwgZnJvbnRGYWNlQ1cgKTtcblxuXHRcdFx0dmFyIHByb2dyYW0gPSBzZXRQcm9ncmFtKCBjYW1lcmEsIHNjZW5lLmZvZywgbWF0ZXJpYWwsIG9iamVjdCApO1xuXG5cdFx0XHRfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSA9ICcnO1xuXG5cdFx0XHRyZW5kZXJPYmplY3RJbW1lZGlhdGUoIG9iamVjdCwgcHJvZ3JhbSwgbWF0ZXJpYWwgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdF90aGlzLnJlbmRlckJ1ZmZlckRpcmVjdCggY2FtZXJhLCBzY2VuZS5mb2csIGdlb21ldHJ5LCBtYXRlcmlhbCwgb2JqZWN0LCBncm91cCApO1xuXG5cdFx0fVxuXG5cdFx0b2JqZWN0Lm9uQWZ0ZXJSZW5kZXIoIF90aGlzLCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwICk7XG5cdFx0Y3VycmVudFJlbmRlclN0YXRlID0gcmVuZGVyU3RhdGVzLmdldCggc2NlbmUsIF9jdXJyZW50QXJyYXlDYW1lcmEgfHwgY2FtZXJhICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGluaXRNYXRlcmlhbCggbWF0ZXJpYWwsIGZvZywgb2JqZWN0ICkge1xuXG5cdFx0dmFyIG1hdGVyaWFsUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApO1xuXG5cdFx0dmFyIGxpZ2h0cyA9IGN1cnJlbnRSZW5kZXJTdGF0ZS5zdGF0ZS5saWdodHM7XG5cdFx0dmFyIHNoYWRvd3NBcnJheSA9IGN1cnJlbnRSZW5kZXJTdGF0ZS5zdGF0ZS5zaGFkb3dzQXJyYXk7XG5cblx0XHR2YXIgcGFyYW1ldGVycyA9IHByb2dyYW1DYWNoZS5nZXRQYXJhbWV0ZXJzKFxuXHRcdFx0bWF0ZXJpYWwsIGxpZ2h0cy5zdGF0ZSwgc2hhZG93c0FycmF5LCBmb2csIF9jbGlwcGluZy5udW1QbGFuZXMsIF9jbGlwcGluZy5udW1JbnRlcnNlY3Rpb24sIG9iamVjdCApO1xuXG5cdFx0dmFyIGNvZGUgPSBwcm9ncmFtQ2FjaGUuZ2V0UHJvZ3JhbUNvZGUoIG1hdGVyaWFsLCBwYXJhbWV0ZXJzICk7XG5cblx0XHR2YXIgcHJvZ3JhbSA9IG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtO1xuXHRcdHZhciBwcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcblxuXHRcdGlmICggcHJvZ3JhbSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBuZXcgbWF0ZXJpYWxcblx0XHRcdG1hdGVyaWFsLmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25NYXRlcmlhbERpc3Bvc2UgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHByb2dyYW0uY29kZSAhPT0gY29kZSApIHtcblxuXHRcdFx0Ly8gY2hhbmdlZCBnbHNsIG9yIHBhcmFtZXRlcnNcblx0XHRcdHJlbGVhc2VNYXRlcmlhbFByb2dyYW1SZWZlcmVuY2UoIG1hdGVyaWFsICk7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbFByb3BlcnRpZXMubGlnaHRzSGFzaCAhPT0gbGlnaHRzLnN0YXRlLmhhc2ggKSB7XG5cblx0XHRcdHByb3BlcnRpZXMudXBkYXRlKCBtYXRlcmlhbCwgJ2xpZ2h0c0hhc2gnLCBsaWdodHMuc3RhdGUuaGFzaCApO1xuXHRcdFx0cHJvZ3JhbUNoYW5nZSA9IGZhbHNlO1xuXG5cdFx0fSBlbHNlIGlmICggcGFyYW1ldGVycy5zaGFkZXJJRCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBzYW1lIGdsc2wgYW5kIHVuaWZvcm0gbGlzdFxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gb25seSByZWJ1aWxkIHVuaWZvcm0gbGlzdFxuXHRcdFx0cHJvZ3JhbUNoYW5nZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwcm9ncmFtQ2hhbmdlICkge1xuXG5cdFx0XHRpZiAoIHBhcmFtZXRlcnMuc2hhZGVySUQgKSB7XG5cblx0XHRcdFx0dmFyIHNoYWRlciA9IFNoYWRlckxpYlsgcGFyYW1ldGVycy5zaGFkZXJJRCBdO1xuXG5cdFx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5zaGFkZXIgPSB7XG5cdFx0XHRcdFx0bmFtZTogbWF0ZXJpYWwudHlwZSxcblx0XHRcdFx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5jbG9uZSggc2hhZGVyLnVuaWZvcm1zICksXG5cdFx0XHRcdFx0dmVydGV4U2hhZGVyOiBzaGFkZXIudmVydGV4U2hhZGVyLFxuXHRcdFx0XHRcdGZyYWdtZW50U2hhZGVyOiBzaGFkZXIuZnJhZ21lbnRTaGFkZXJcblx0XHRcdFx0fTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMuc2hhZGVyID0ge1xuXHRcdFx0XHRcdG5hbWU6IG1hdGVyaWFsLnR5cGUsXG5cdFx0XHRcdFx0dW5pZm9ybXM6IG1hdGVyaWFsLnVuaWZvcm1zLFxuXHRcdFx0XHRcdHZlcnRleFNoYWRlcjogbWF0ZXJpYWwudmVydGV4U2hhZGVyLFxuXHRcdFx0XHRcdGZyYWdtZW50U2hhZGVyOiBtYXRlcmlhbC5mcmFnbWVudFNoYWRlclxuXHRcdFx0XHR9O1xuXG5cdFx0XHR9XG5cblx0XHRcdG1hdGVyaWFsLm9uQmVmb3JlQ29tcGlsZSggbWF0ZXJpYWxQcm9wZXJ0aWVzLnNoYWRlciwgX3RoaXMgKTtcblxuXHRcdFx0cHJvZ3JhbSA9IHByb2dyYW1DYWNoZS5hY3F1aXJlUHJvZ3JhbSggbWF0ZXJpYWwsIG1hdGVyaWFsUHJvcGVydGllcy5zaGFkZXIsIHBhcmFtZXRlcnMsIGNvZGUgKTtcblxuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLnByb2dyYW0gPSBwcm9ncmFtO1xuXHRcdFx0bWF0ZXJpYWwucHJvZ3JhbSA9IHByb2dyYW07XG5cblx0XHR9XG5cblx0XHR2YXIgcHJvZ3JhbUF0dHJpYnV0ZXMgPSBwcm9ncmFtLmdldEF0dHJpYnV0ZXMoKTtcblxuXHRcdGlmICggbWF0ZXJpYWwubW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHRtYXRlcmlhbC5udW1TdXBwb3J0ZWRNb3JwaFRhcmdldHMgPSAwO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBfdGhpcy5tYXhNb3JwaFRhcmdldHM7IGkgKysgKSB7XG5cblx0XHRcdFx0aWYgKCBwcm9ncmFtQXR0cmlidXRlc1sgJ21vcnBoVGFyZ2V0JyArIGkgXSA+PSAwICkge1xuXG5cdFx0XHRcdFx0bWF0ZXJpYWwubnVtU3VwcG9ydGVkTW9ycGhUYXJnZXRzICsrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5tb3JwaE5vcm1hbHMgKSB7XG5cblx0XHRcdG1hdGVyaWFsLm51bVN1cHBvcnRlZE1vcnBoTm9ybWFscyA9IDA7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IF90aGlzLm1heE1vcnBoTm9ybWFsczsgaSArKyApIHtcblxuXHRcdFx0XHRpZiAoIHByb2dyYW1BdHRyaWJ1dGVzWyAnbW9ycGhOb3JtYWwnICsgaSBdID49IDAgKSB7XG5cblx0XHRcdFx0XHRtYXRlcmlhbC5udW1TdXBwb3J0ZWRNb3JwaE5vcm1hbHMgKys7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgdW5pZm9ybXMgPSBtYXRlcmlhbFByb3BlcnRpZXMuc2hhZGVyLnVuaWZvcm1zO1xuXG5cdFx0aWYgKCAhIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgJiZcblx0XHRcdCEgbWF0ZXJpYWwuaXNSYXdTaGFkZXJNYXRlcmlhbCB8fFxuXHRcdFx0bWF0ZXJpYWwuY2xpcHBpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5udW1DbGlwcGluZ1BsYW5lcyA9IF9jbGlwcGluZy5udW1QbGFuZXM7XG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMubnVtSW50ZXJzZWN0aW9uID0gX2NsaXBwaW5nLm51bUludGVyc2VjdGlvbjtcblx0XHRcdHVuaWZvcm1zLmNsaXBwaW5nUGxhbmVzID0gX2NsaXBwaW5nLnVuaWZvcm07XG5cblx0XHR9XG5cblx0XHRtYXRlcmlhbFByb3BlcnRpZXMuZm9nID0gZm9nO1xuXG5cdFx0Ly8gc3RvcmUgdGhlIGxpZ2h0IHNldHVwIGl0IHdhcyBjcmVhdGVkIGZvclxuXG5cdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLmxpZ2h0c0hhc2ggPSBsaWdodHMuc3RhdGUuaGFzaDtcblxuXHRcdGlmICggbWF0ZXJpYWwubGlnaHRzICkge1xuXG5cdFx0XHQvLyB3aXJlIHVwIHRoZSBtYXRlcmlhbCB0byB0aGlzIHJlbmRlcmVyJ3MgbGlnaHRpbmcgc3RhdGVcblxuXHRcdFx0dW5pZm9ybXMuYW1iaWVudExpZ2h0Q29sb3IudmFsdWUgPSBsaWdodHMuc3RhdGUuYW1iaWVudDtcblx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbmFsTGlnaHRzLnZhbHVlID0gbGlnaHRzLnN0YXRlLmRpcmVjdGlvbmFsO1xuXHRcdFx0dW5pZm9ybXMuc3BvdExpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5zcG90O1xuXHRcdFx0dW5pZm9ybXMucmVjdEFyZWFMaWdodHMudmFsdWUgPSBsaWdodHMuc3RhdGUucmVjdEFyZWE7XG5cdFx0XHR1bmlmb3Jtcy5wb2ludExpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5wb2ludDtcblx0XHRcdHVuaWZvcm1zLmhlbWlzcGhlcmVMaWdodHMudmFsdWUgPSBsaWdodHMuc3RhdGUuaGVtaTtcblxuXHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uYWxTaGFkb3dNYXAudmFsdWUgPSBsaWdodHMuc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXA7XG5cdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeDtcblx0XHRcdHVuaWZvcm1zLnNwb3RTaGFkb3dNYXAudmFsdWUgPSBsaWdodHMuc3RhdGUuc3BvdFNoYWRvd01hcDtcblx0XHRcdHVuaWZvcm1zLnNwb3RTaGFkb3dNYXRyaXgudmFsdWUgPSBsaWdodHMuc3RhdGUuc3BvdFNoYWRvd01hdHJpeDtcblx0XHRcdHVuaWZvcm1zLnBvaW50U2hhZG93TWFwLnZhbHVlID0gbGlnaHRzLnN0YXRlLnBvaW50U2hhZG93TWFwO1xuXHRcdFx0dW5pZm9ybXMucG9pbnRTaGFkb3dNYXRyaXgudmFsdWUgPSBsaWdodHMuc3RhdGUucG9pbnRTaGFkb3dNYXRyaXg7XG5cdFx0XHQvLyBUT0RPIChhYmVsbmF0aW9uKTogYWRkIGFyZWEgbGlnaHRzIHNoYWRvdyBpbmZvIHRvIHVuaWZvcm1zXG5cblx0XHR9XG5cblx0XHR2YXIgcHJvZ1VuaWZvcm1zID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLnByb2dyYW0uZ2V0VW5pZm9ybXMoKSxcblx0XHRcdHVuaWZvcm1zTGlzdCA9XG5cdFx0XHRcdFdlYkdMVW5pZm9ybXMuc2VxV2l0aFZhbHVlKCBwcm9nVW5pZm9ybXMuc2VxLCB1bmlmb3JtcyApO1xuXG5cdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLnVuaWZvcm1zTGlzdCA9IHVuaWZvcm1zTGlzdDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0UHJvZ3JhbSggY2FtZXJhLCBmb2csIG1hdGVyaWFsLCBvYmplY3QgKSB7XG5cblx0XHRfdXNlZFRleHR1cmVVbml0cyA9IDA7XG5cblx0XHR2YXIgbWF0ZXJpYWxQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsICk7XG5cdFx0dmFyIGxpZ2h0cyA9IGN1cnJlbnRSZW5kZXJTdGF0ZS5zdGF0ZS5saWdodHM7XG5cblx0XHRpZiAoIF9jbGlwcGluZ0VuYWJsZWQgKSB7XG5cblx0XHRcdGlmICggX2xvY2FsQ2xpcHBpbmdFbmFibGVkIHx8IGNhbWVyYSAhPT0gX2N1cnJlbnRDYW1lcmEgKSB7XG5cblx0XHRcdFx0dmFyIHVzZUNhY2hlID1cblx0XHRcdFx0XHRjYW1lcmEgPT09IF9jdXJyZW50Q2FtZXJhICYmXG5cdFx0XHRcdFx0bWF0ZXJpYWwuaWQgPT09IF9jdXJyZW50TWF0ZXJpYWxJZDtcblxuXHRcdFx0XHQvLyB3ZSBtaWdodCB3YW50IHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIHNvbWUgQ2xpcHBpbmdHcm91cFxuXHRcdFx0XHQvLyBvYmplY3QgaW5zdGVhZCBvZiB0aGUgbWF0ZXJpYWwsIG9uY2UgaXQgYmVjb21lcyBmZWFzaWJsZVxuXHRcdFx0XHQvLyAoIzg0NjUsICM4Mzc5KVxuXHRcdFx0XHRfY2xpcHBpbmcuc2V0U3RhdGUoXG5cdFx0XHRcdFx0bWF0ZXJpYWwuY2xpcHBpbmdQbGFuZXMsIG1hdGVyaWFsLmNsaXBJbnRlcnNlY3Rpb24sIG1hdGVyaWFsLmNsaXBTaGFkb3dzLFxuXHRcdFx0XHRcdGNhbWVyYSwgbWF0ZXJpYWxQcm9wZXJ0aWVzLCB1c2VDYWNoZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm5lZWRzVXBkYXRlID09PSBmYWxzZSApIHtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuZm9nICYmIG1hdGVyaWFsUHJvcGVydGllcy5mb2cgIT09IGZvZyApIHtcblxuXHRcdFx0XHRtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmxpZ2h0cyAmJiBtYXRlcmlhbFByb3BlcnRpZXMubGlnaHRzSGFzaCAhPT0gbGlnaHRzLnN0YXRlLmhhc2ggKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbFByb3BlcnRpZXMubnVtQ2xpcHBpbmdQbGFuZXMgIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0XHQoIG1hdGVyaWFsUHJvcGVydGllcy5udW1DbGlwcGluZ1BsYW5lcyAhPT0gX2NsaXBwaW5nLm51bVBsYW5lcyB8fFxuXHRcdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMubnVtSW50ZXJzZWN0aW9uICE9PSBfY2xpcHBpbmcubnVtSW50ZXJzZWN0aW9uICkgKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm5lZWRzVXBkYXRlICkge1xuXG5cdFx0XHRpbml0TWF0ZXJpYWwoIG1hdGVyaWFsLCBmb2csIG9iamVjdCApO1xuXHRcdFx0bWF0ZXJpYWwubmVlZHNVcGRhdGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHZhciByZWZyZXNoUHJvZ3JhbSA9IGZhbHNlO1xuXHRcdHZhciByZWZyZXNoTWF0ZXJpYWwgPSBmYWxzZTtcblx0XHR2YXIgcmVmcmVzaExpZ2h0cyA9IGZhbHNlO1xuXG5cdFx0dmFyIHByb2dyYW0gPSBtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbSxcblx0XHRcdHBfdW5pZm9ybXMgPSBwcm9ncmFtLmdldFVuaWZvcm1zKCksXG5cdFx0XHRtX3VuaWZvcm1zID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLnNoYWRlci51bmlmb3JtcztcblxuXHRcdGlmICggc3RhdGUudXNlUHJvZ3JhbSggcHJvZ3JhbS5wcm9ncmFtICkgKSB7XG5cblx0XHRcdHJlZnJlc2hQcm9ncmFtID0gdHJ1ZTtcblx0XHRcdHJlZnJlc2hNYXRlcmlhbCA9IHRydWU7XG5cdFx0XHRyZWZyZXNoTGlnaHRzID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuaWQgIT09IF9jdXJyZW50TWF0ZXJpYWxJZCApIHtcblxuXHRcdFx0X2N1cnJlbnRNYXRlcmlhbElkID0gbWF0ZXJpYWwuaWQ7XG5cblx0XHRcdHJlZnJlc2hNYXRlcmlhbCA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIHJlZnJlc2hQcm9ncmFtIHx8IGNhbWVyYSAhPT0gX2N1cnJlbnRDYW1lcmEgKSB7XG5cblx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3Byb2plY3Rpb25NYXRyaXgnLCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0XHRpZiAoIGNhcGFiaWxpdGllcy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICkge1xuXG5cdFx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ2xvZ0RlcHRoQnVmRkMnLFxuXHRcdFx0XHRcdDIuMCAvICggTWF0aC5sb2coIGNhbWVyYS5mYXIgKyAxLjAgKSAvIE1hdGguTE4yICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBBdm9pZCB1bm5lZWRlZCB1bmlmb3JtIHVwZGF0ZXMgcGVyIEFycmF5Q2FtZXJhJ3Mgc3ViLWNhbWVyYVxuXG5cdFx0XHRpZiAoIF9jdXJyZW50Q2FtZXJhICE9PSAoIF9jdXJyZW50QXJyYXlDYW1lcmEgfHwgY2FtZXJhICkgKSB7XG5cblx0XHRcdFx0X2N1cnJlbnRDYW1lcmEgPSAoIF9jdXJyZW50QXJyYXlDYW1lcmEgfHwgY2FtZXJhICk7XG5cblx0XHRcdFx0Ly8gbGlnaHRpbmcgdW5pZm9ybXMgZGVwZW5kIG9uIHRoZSBjYW1lcmEgc28gZW5mb3JjZSBhbiB1cGRhdGVcblx0XHRcdFx0Ly8gbm93LCBpbiBjYXNlIHRoaXMgbWF0ZXJpYWwgc3VwcG9ydHMgbGlnaHRzIC0gb3IgbGF0ZXIsIHdoZW5cblx0XHRcdFx0Ly8gdGhlIG5leHQgbWF0ZXJpYWwgdGhhdCBkb2VzIGdldHMgYWN0aXZhdGVkOlxuXG5cdFx0XHRcdHJlZnJlc2hNYXRlcmlhbCA9IHRydWU7XHRcdC8vIHNldCB0byB0cnVlIG9uIG1hdGVyaWFsIGNoYW5nZVxuXHRcdFx0XHRyZWZyZXNoTGlnaHRzID0gdHJ1ZTtcdFx0Ly8gcmVtYWlucyBzZXQgdW50aWwgdXBkYXRlIGRvbmVcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBsb2FkIG1hdGVyaWFsIHNwZWNpZmljIHVuaWZvcm1zXG5cdFx0XHQvLyAoc2hhZGVyIG1hdGVyaWFsIGFsc28gZ2V0cyB0aGVtIGZvciB0aGUgc2FrZSBvZiBnZW5lcmljaXR5KVxuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmVudk1hcCApIHtcblxuXHRcdFx0XHR2YXIgdUNhbVBvcyA9IHBfdW5pZm9ybXMubWFwLmNhbWVyYVBvc2l0aW9uO1xuXG5cdFx0XHRcdGlmICggdUNhbVBvcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dUNhbVBvcy5zZXRWYWx1ZSggX2dsLFxuXHRcdFx0XHRcdFx0X3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmlzTWVzaFBob25nTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoTGFtYmVydE1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaEJhc2ljTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLnNraW5uaW5nICkge1xuXG5cdFx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3ZpZXdNYXRyaXgnLCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIHNraW5uaW5nIHVuaWZvcm1zIG11c3QgYmUgc2V0IGV2ZW4gaWYgbWF0ZXJpYWwgZGlkbid0IGNoYW5nZVxuXHRcdC8vIGF1dG8tc2V0dGluZyBvZiB0ZXh0dXJlIHVuaXQgZm9yIGJvbmUgdGV4dHVyZSBtdXN0IGdvIGJlZm9yZSBvdGhlciB0ZXh0dXJlc1xuXHRcdC8vIG5vdCBzdXJlIHdoeSwgYnV0IG90aGVyd2lzZSB3ZWlyZCB0aGluZ3MgaGFwcGVuXG5cblx0XHRpZiAoIG1hdGVyaWFsLnNraW5uaW5nICkge1xuXG5cdFx0XHRwX3VuaWZvcm1zLnNldE9wdGlvbmFsKCBfZ2wsIG9iamVjdCwgJ2JpbmRNYXRyaXgnICk7XG5cdFx0XHRwX3VuaWZvcm1zLnNldE9wdGlvbmFsKCBfZ2wsIG9iamVjdCwgJ2JpbmRNYXRyaXhJbnZlcnNlJyApO1xuXG5cdFx0XHR2YXIgc2tlbGV0b24gPSBvYmplY3Quc2tlbGV0b247XG5cblx0XHRcdGlmICggc2tlbGV0b24gKSB7XG5cblx0XHRcdFx0dmFyIGJvbmVzID0gc2tlbGV0b24uYm9uZXM7XG5cblx0XHRcdFx0aWYgKCBjYXBhYmlsaXRpZXMuZmxvYXRWZXJ0ZXhUZXh0dXJlcyApIHtcblxuXHRcdFx0XHRcdGlmICggc2tlbGV0b24uYm9uZVRleHR1cmUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gbGF5b3V0ICgxIG1hdHJpeCA9IDQgcGl4ZWxzKVxuXHRcdFx0XHRcdFx0Ly8gICAgICBSR0JBIFJHQkEgUkdCQSBSR0JBICg9PiBjb2x1bW4xLCBjb2x1bW4yLCBjb2x1bW4zLCBjb2x1bW40KVxuXHRcdFx0XHRcdFx0Ly8gIHdpdGggIDh4OCAgcGl4ZWwgdGV4dHVyZSBtYXggICAxNiBib25lcyAqIDQgcGl4ZWxzID0gICg4ICogOClcblx0XHRcdFx0XHRcdC8vICAgICAgIDE2eDE2IHBpeGVsIHRleHR1cmUgbWF4ICAgNjQgYm9uZXMgKiA0IHBpeGVscyA9ICgxNiAqIDE2KVxuXHRcdFx0XHRcdFx0Ly8gICAgICAgMzJ4MzIgcGl4ZWwgdGV4dHVyZSBtYXggIDI1NiBib25lcyAqIDQgcGl4ZWxzID0gKDMyICogMzIpXG5cdFx0XHRcdFx0XHQvLyAgICAgICA2NHg2NCBwaXhlbCB0ZXh0dXJlIG1heCAxMDI0IGJvbmVzICogNCBwaXhlbHMgPSAoNjQgKiA2NClcblxuXG5cdFx0XHRcdFx0XHR2YXIgc2l6ZSA9IE1hdGguc3FydCggYm9uZXMubGVuZ3RoICogNCApOyAvLyA0IHBpeGVscyBuZWVkZWQgZm9yIDEgbWF0cml4XG5cdFx0XHRcdFx0XHRzaXplID0gX01hdGguY2VpbFBvd2VyT2ZUd28oIHNpemUgKTtcblx0XHRcdFx0XHRcdHNpemUgPSBNYXRoLm1heCggc2l6ZSwgNCApO1xuXG5cdFx0XHRcdFx0XHR2YXIgYm9uZU1hdHJpY2VzID0gbmV3IEZsb2F0MzJBcnJheSggc2l6ZSAqIHNpemUgKiA0ICk7IC8vIDQgZmxvYXRzIHBlciBSR0JBIHBpeGVsXG5cdFx0XHRcdFx0XHRib25lTWF0cmljZXMuc2V0KCBza2VsZXRvbi5ib25lTWF0cmljZXMgKTsgLy8gY29weSBjdXJyZW50IHZhbHVlc1xuXG5cdFx0XHRcdFx0XHR2YXIgYm9uZVRleHR1cmUgPSBuZXcgRGF0YVRleHR1cmUoIGJvbmVNYXRyaWNlcywgc2l6ZSwgc2l6ZSwgUkdCQUZvcm1hdCwgRmxvYXRUeXBlICk7XG5cdFx0XHRcdFx0XHRib25lVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdFx0XHRcdHNrZWxldG9uLmJvbmVNYXRyaWNlcyA9IGJvbmVNYXRyaWNlcztcblx0XHRcdFx0XHRcdHNrZWxldG9uLmJvbmVUZXh0dXJlID0gYm9uZVRleHR1cmU7XG5cdFx0XHRcdFx0XHRza2VsZXRvbi5ib25lVGV4dHVyZVNpemUgPSBzaXplO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnYm9uZVRleHR1cmUnLCBza2VsZXRvbi5ib25lVGV4dHVyZSApO1xuXHRcdFx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ2JvbmVUZXh0dXJlU2l6ZScsIHNrZWxldG9uLmJvbmVUZXh0dXJlU2l6ZSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRwX3VuaWZvcm1zLnNldE9wdGlvbmFsKCBfZ2wsIHNrZWxldG9uLCAnYm9uZU1hdHJpY2VzJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCByZWZyZXNoTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3RvbmVNYXBwaW5nRXhwb3N1cmUnLCBfdGhpcy50b25lTWFwcGluZ0V4cG9zdXJlICk7XG5cdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICd0b25lTWFwcGluZ1doaXRlUG9pbnQnLCBfdGhpcy50b25lTWFwcGluZ1doaXRlUG9pbnQgKTtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5saWdodHMgKSB7XG5cblx0XHRcdFx0Ly8gdGhlIGN1cnJlbnQgbWF0ZXJpYWwgcmVxdWlyZXMgbGlnaHRpbmcgaW5mb1xuXG5cdFx0XHRcdC8vIG5vdGU6IGFsbCBsaWdodGluZyB1bmlmb3JtcyBhcmUgYWx3YXlzIHNldCBjb3JyZWN0bHlcblx0XHRcdFx0Ly8gdGhleSBzaW1wbHkgcmVmZXJlbmNlIHRoZSByZW5kZXJlcidzIHN0YXRlIGZvciB0aGVpclxuXHRcdFx0XHQvLyB2YWx1ZXNcblx0XHRcdFx0Ly9cblx0XHRcdFx0Ly8gdXNlIHRoZSBjdXJyZW50IG1hdGVyaWFsJ3MgLm5lZWRzVXBkYXRlIGZsYWdzIHRvIHNldFxuXHRcdFx0XHQvLyB0aGUgR0wgc3RhdGUgd2hlbiByZXF1aXJlZFxuXG5cdFx0XHRcdG1hcmtVbmlmb3Jtc0xpZ2h0c05lZWRzVXBkYXRlKCBtX3VuaWZvcm1zLCByZWZyZXNoTGlnaHRzICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gcmVmcmVzaCB1bmlmb3JtcyBjb21tb24gdG8gc2V2ZXJhbCBtYXRlcmlhbHNcblxuXHRcdFx0aWYgKCBmb2cgJiYgbWF0ZXJpYWwuZm9nICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0ZvZyggbV91bmlmb3JtcywgZm9nICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5pc01lc2hCYXNpY01hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoTGFtYmVydE1hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zTGFtYmVydCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0aWYgKCBtYXRlcmlhbC5pc01lc2hUb29uTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNUb29uKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNQaG9uZyggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zQ29tbW9uKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdGlmICggbWF0ZXJpYWwuaXNNZXNoUGh5c2ljYWxNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc1BoeXNpY2FsKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNTdGFuZGFyZCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaERlcHRoTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zQ29tbW9uKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNEZXB0aCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoRGlzdGFuY2VNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0Rpc3RhbmNlKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hOb3JtYWxNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc05vcm1hbCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNMaW5lQmFzaWNNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNMaW5lKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdGlmICggbWF0ZXJpYWwuaXNMaW5lRGFzaGVkTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNEYXNoKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNQb2ludHNNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNQb2ludHMoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzU2hhZG93TWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0bV91bmlmb3Jtcy5jb2xvci52YWx1ZSA9IG1hdGVyaWFsLmNvbG9yO1xuXHRcdFx0XHRtX3VuaWZvcm1zLm9wYWNpdHkudmFsdWUgPSBtYXRlcmlhbC5vcGFjaXR5O1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlY3RBcmVhTGlnaHQgVGV4dHVyZVxuXHRcdFx0Ly8gVE9ETyAobXJkb29iKTogRmluZCBhIG5pY2VyIGltcGxlbWVudGF0aW9uXG5cblx0XHRcdGlmICggbV91bmlmb3Jtcy5sdGNfMSAhPT0gdW5kZWZpbmVkICkgbV91bmlmb3Jtcy5sdGNfMS52YWx1ZSA9IFVuaWZvcm1zTGliLkxUQ18xO1xuXHRcdFx0aWYgKCBtX3VuaWZvcm1zLmx0Y18yICE9PSB1bmRlZmluZWQgKSBtX3VuaWZvcm1zLmx0Y18yLnZhbHVlID0gVW5pZm9ybXNMaWIuTFRDXzI7XG5cblx0XHRcdFdlYkdMVW5pZm9ybXMudXBsb2FkKCBfZ2wsIG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3Jtc0xpc3QsIG1fdW5pZm9ybXMsIF90aGlzICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgJiYgbWF0ZXJpYWwudW5pZm9ybXNOZWVkVXBkYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRXZWJHTFVuaWZvcm1zLnVwbG9hZCggX2dsLCBtYXRlcmlhbFByb3BlcnRpZXMudW5pZm9ybXNMaXN0LCBtX3VuaWZvcm1zLCBfdGhpcyApO1xuXHRcdFx0bWF0ZXJpYWwudW5pZm9ybXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHQvLyBjb21tb24gbWF0cmljZXNcblxuXHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ21vZGVsVmlld01hdHJpeCcsIG9iamVjdC5tb2RlbFZpZXdNYXRyaXggKTtcblx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdub3JtYWxNYXRyaXgnLCBvYmplY3Qubm9ybWFsTWF0cml4ICk7XG5cdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnbW9kZWxNYXRyaXgnLCBvYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdHJldHVybiBwcm9ncmFtO1xuXG5cdH1cblxuXHQvLyBVbmlmb3JtcyAocmVmcmVzaCB1bmlmb3JtcyBvYmplY3RzKVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmNvbG9yICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5kaWZmdXNlLnZhbHVlID0gbWF0ZXJpYWwuY29sb3I7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmVtaXNzaXZlICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5lbWlzc2l2ZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5lbWlzc2l2ZSApLm11bHRpcGx5U2NhbGFyKCBtYXRlcmlhbC5lbWlzc2l2ZUludGVuc2l0eSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5tYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLm1hcC52YWx1ZSA9IG1hdGVyaWFsLm1hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuYWxwaGFNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmFscGhhTWFwLnZhbHVlID0gbWF0ZXJpYWwuYWxwaGFNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLnNwZWN1bGFyTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5zcGVjdWxhck1hcC52YWx1ZSA9IG1hdGVyaWFsLnNwZWN1bGFyTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5lbnZNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmVudk1hcC52YWx1ZSA9IG1hdGVyaWFsLmVudk1hcDtcblxuXHRcdFx0Ly8gZG9uJ3QgZmxpcCBDdWJlVGV4dHVyZSBlbnZNYXBzLCBmbGlwIGV2ZXJ5dGhpbmcgZWxzZTpcblx0XHRcdC8vICBXZWJHTFJlbmRlclRhcmdldEN1YmUgd2lsbCBiZSBmbGlwcGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXHRcdFx0Ly8gIFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZS50ZXh0dXJlIHdpbGwgYmUgZmxpcHBlZCBiZWNhdXNlIGl0J3MgYSBUZXh0dXJlIGFuZCBOT1QgYSBDdWJlVGV4dHVyZVxuXHRcdFx0Ly8gdGhpcyBjaGVjayBtdXN0IGJlIGhhbmRsZWQgZGlmZmVyZW50bHksIG9yIHJlbW92ZWQgZW50aXJlbHksIGlmIFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZSB1c2VzIGEgQ3ViZVRleHR1cmUgaW4gdGhlIGZ1dHVyZVxuXHRcdFx0dW5pZm9ybXMuZmxpcEVudk1hcC52YWx1ZSA9ICggISAoIG1hdGVyaWFsLmVudk1hcCAmJiBtYXRlcmlhbC5lbnZNYXAuaXNDdWJlVGV4dHVyZSApICkgPyAxIDogLSAxO1xuXG5cdFx0XHR1bmlmb3Jtcy5yZWZsZWN0aXZpdHkudmFsdWUgPSBtYXRlcmlhbC5yZWZsZWN0aXZpdHk7XG5cdFx0XHR1bmlmb3Jtcy5yZWZyYWN0aW9uUmF0aW8udmFsdWUgPSBtYXRlcmlhbC5yZWZyYWN0aW9uUmF0aW87XG5cblx0XHRcdHVuaWZvcm1zLm1heE1pcExldmVsLnZhbHVlID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsLmVudk1hcCApLl9fbWF4TWlwTGV2ZWw7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmxpZ2h0TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5saWdodE1hcC52YWx1ZSA9IG1hdGVyaWFsLmxpZ2h0TWFwO1xuXHRcdFx0dW5pZm9ybXMubGlnaHRNYXBJbnRlbnNpdHkudmFsdWUgPSBtYXRlcmlhbC5saWdodE1hcEludGVuc2l0eTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuYW9NYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmFvTWFwLnZhbHVlID0gbWF0ZXJpYWwuYW9NYXA7XG5cdFx0XHR1bmlmb3Jtcy5hb01hcEludGVuc2l0eS52YWx1ZSA9IG1hdGVyaWFsLmFvTWFwSW50ZW5zaXR5O1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXYgcmVwZWF0IGFuZCBvZmZzZXQgc2V0dGluZyBwcmlvcml0aWVzXG5cdFx0Ly8gMS4gY29sb3IgbWFwXG5cdFx0Ly8gMi4gc3BlY3VsYXIgbWFwXG5cdFx0Ly8gMy4gbm9ybWFsIG1hcFxuXHRcdC8vIDQuIGJ1bXAgbWFwXG5cdFx0Ly8gNS4gYWxwaGEgbWFwXG5cdFx0Ly8gNi4gZW1pc3NpdmUgbWFwXG5cblx0XHR2YXIgdXZTY2FsZU1hcDtcblxuXHRcdGlmICggbWF0ZXJpYWwubWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwubWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuc3BlY3VsYXJNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5zcGVjdWxhck1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLm5vcm1hbE1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLm5vcm1hbE1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmJ1bXBNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5idW1wTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwucm91Z2huZXNzTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwucm91Z2huZXNzTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwubWV0YWxuZXNzTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwubWV0YWxuZXNzTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuYWxwaGFNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5hbHBoYU1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuZW1pc3NpdmVNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIHV2U2NhbGVNYXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblx0XHRcdGlmICggdXZTY2FsZU1hcC5pc1dlYkdMUmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0XHRcdHV2U2NhbGVNYXAgPSB1dlNjYWxlTWFwLnRleHR1cmU7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB1dlNjYWxlTWFwLm1hdHJpeEF1dG9VcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0dXZTY2FsZU1hcC51cGRhdGVNYXRyaXgoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR1bmlmb3Jtcy51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KCB1dlNjYWxlTWFwLm1hdHJpeCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNMaW5lKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHR1bmlmb3Jtcy5kaWZmdXNlLnZhbHVlID0gbWF0ZXJpYWwuY29sb3I7XG5cdFx0dW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0Rhc2goIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHVuaWZvcm1zLmRhc2hTaXplLnZhbHVlID0gbWF0ZXJpYWwuZGFzaFNpemU7XG5cdFx0dW5pZm9ybXMudG90YWxTaXplLnZhbHVlID0gbWF0ZXJpYWwuZGFzaFNpemUgKyBtYXRlcmlhbC5nYXBTaXplO1xuXHRcdHVuaWZvcm1zLnNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuc2NhbGU7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1BvaW50cyggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMuZGlmZnVzZS52YWx1ZSA9IG1hdGVyaWFsLmNvbG9yO1xuXHRcdHVuaWZvcm1zLm9wYWNpdHkudmFsdWUgPSBtYXRlcmlhbC5vcGFjaXR5O1xuXHRcdHVuaWZvcm1zLnNpemUudmFsdWUgPSBtYXRlcmlhbC5zaXplICogX3BpeGVsUmF0aW87XG5cdFx0dW5pZm9ybXMuc2NhbGUudmFsdWUgPSBfaGVpZ2h0ICogMC41O1xuXG5cdFx0dW5pZm9ybXMubWFwLnZhbHVlID0gbWF0ZXJpYWwubWFwO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5tYXAgIT09IG51bGwgKSB7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwubWFwLm1hdHJpeEF1dG9VcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWwubWFwLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHVuaWZvcm1zLnV2VHJhbnNmb3JtLnZhbHVlLmNvcHkoIG1hdGVyaWFsLm1hcC5tYXRyaXggKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zRm9nKCB1bmlmb3JtcywgZm9nICkge1xuXG5cdFx0dW5pZm9ybXMuZm9nQ29sb3IudmFsdWUgPSBmb2cuY29sb3I7XG5cblx0XHRpZiAoIGZvZy5pc0ZvZyApIHtcblxuXHRcdFx0dW5pZm9ybXMuZm9nTmVhci52YWx1ZSA9IGZvZy5uZWFyO1xuXHRcdFx0dW5pZm9ybXMuZm9nRmFyLnZhbHVlID0gZm9nLmZhcjtcblxuXHRcdH0gZWxzZSBpZiAoIGZvZy5pc0ZvZ0V4cDIgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmZvZ0RlbnNpdHkudmFsdWUgPSBmb2cuZGVuc2l0eTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zTGFtYmVydCggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5lbWlzc2l2ZU1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZW1pc3NpdmVNYXAudmFsdWUgPSBtYXRlcmlhbC5lbWlzc2l2ZU1hcDtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zUGhvbmcoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHVuaWZvcm1zLnNwZWN1bGFyLnZhbHVlID0gbWF0ZXJpYWwuc3BlY3VsYXI7XG5cdFx0dW5pZm9ybXMuc2hpbmluZXNzLnZhbHVlID0gTWF0aC5tYXgoIG1hdGVyaWFsLnNoaW5pbmVzcywgMWUtNCApOyAvLyB0byBwcmV2ZW50IHBvdyggMC4wLCAwLjAgKVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5lbWlzc2l2ZU1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZW1pc3NpdmVNYXAudmFsdWUgPSBtYXRlcmlhbC5lbWlzc2l2ZU1hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuYnVtcE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuYnVtcE1hcC52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBNYXA7XG5cdFx0XHR1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgPSBtYXRlcmlhbC5idW1wU2NhbGU7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm5vcm1hbE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMubm9ybWFsTWFwLnZhbHVlID0gbWF0ZXJpYWwubm9ybWFsTWFwO1xuXHRcdFx0dW5pZm9ybXMubm9ybWFsU2NhbGUudmFsdWUuY29weSggbWF0ZXJpYWwubm9ybWFsU2NhbGUgKTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1Rvb24oIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHJlZnJlc2hVbmlmb3Jtc1Bob25nKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdGlmICggbWF0ZXJpYWwuZ3JhZGllbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmdyYWRpZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZ3JhZGllbnRNYXA7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1N0YW5kYXJkKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHR1bmlmb3Jtcy5yb3VnaG5lc3MudmFsdWUgPSBtYXRlcmlhbC5yb3VnaG5lc3M7XG5cdFx0dW5pZm9ybXMubWV0YWxuZXNzLnZhbHVlID0gbWF0ZXJpYWwubWV0YWxuZXNzO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5yb3VnaG5lc3NNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLnJvdWdobmVzc01hcC52YWx1ZSA9IG1hdGVyaWFsLnJvdWdobmVzc01hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubWV0YWxuZXNzTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5tZXRhbG5lc3NNYXAudmFsdWUgPSBtYXRlcmlhbC5tZXRhbG5lc3NNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5lbWlzc2l2ZU1hcC52YWx1ZSA9IG1hdGVyaWFsLmVtaXNzaXZlTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5idW1wTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5idW1wTWFwLnZhbHVlID0gbWF0ZXJpYWwuYnVtcE1hcDtcblx0XHRcdHVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBTY2FsZTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubm9ybWFsTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxNYXAudmFsdWUgPSBtYXRlcmlhbC5ub3JtYWxNYXA7XG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5ub3JtYWxTY2FsZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuZW52TWFwICkge1xuXG5cdFx0XHQvL3VuaWZvcm1zLmVudk1hcC52YWx1ZSA9IG1hdGVyaWFsLmVudk1hcDsgLy8gcGFydCBvZiB1bmlmb3JtcyBjb21tb25cblx0XHRcdHVuaWZvcm1zLmVudk1hcEludGVuc2l0eS52YWx1ZSA9IG1hdGVyaWFsLmVudk1hcEludGVuc2l0eTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zUGh5c2ljYWwoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHVuaWZvcm1zLmNsZWFyQ29hdC52YWx1ZSA9IG1hdGVyaWFsLmNsZWFyQ29hdDtcblx0XHR1bmlmb3Jtcy5jbGVhckNvYXRSb3VnaG5lc3MudmFsdWUgPSBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3M7XG5cblx0XHRyZWZyZXNoVW5pZm9ybXNTdGFuZGFyZCggdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0RlcHRoKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50U2NhbGUudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudEJpYXMudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNEaXN0YW5jZSggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblxuXHRcdHVuaWZvcm1zLnJlZmVyZW5jZVBvc2l0aW9uLnZhbHVlLmNvcHkoIG1hdGVyaWFsLnJlZmVyZW5jZVBvc2l0aW9uICk7XG5cdFx0dW5pZm9ybXMubmVhckRpc3RhbmNlLnZhbHVlID0gbWF0ZXJpYWwubmVhckRpc3RhbmNlO1xuXHRcdHVuaWZvcm1zLmZhckRpc3RhbmNlLnZhbHVlID0gbWF0ZXJpYWwuZmFyRGlzdGFuY2U7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc05vcm1hbCggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5idW1wTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5idW1wTWFwLnZhbHVlID0gbWF0ZXJpYWwuYnVtcE1hcDtcblx0XHRcdHVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBTY2FsZTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubm9ybWFsTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxNYXAudmFsdWUgPSBtYXRlcmlhbC5ub3JtYWxNYXA7XG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5ub3JtYWxTY2FsZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gSWYgdW5pZm9ybXMgYXJlIG1hcmtlZCBhcyBjbGVhbiwgdGhleSBkb24ndCBuZWVkIHRvIGJlIGxvYWRlZCB0byB0aGUgR1BVLlxuXG5cdGZ1bmN0aW9uIG1hcmtVbmlmb3Jtc0xpZ2h0c05lZWRzVXBkYXRlKCB1bmlmb3JtcywgdmFsdWUgKSB7XG5cblx0XHR1bmlmb3Jtcy5hbWJpZW50TGlnaHRDb2xvci5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXG5cdFx0dW5pZm9ybXMuZGlyZWN0aW9uYWxMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTtcblx0XHR1bmlmb3Jtcy5wb2ludExpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXHRcdHVuaWZvcm1zLnNwb3RMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTtcblx0XHR1bmlmb3Jtcy5yZWN0QXJlYUxpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXHRcdHVuaWZvcm1zLmhlbWlzcGhlcmVMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTtcblxuXHR9XG5cblx0Ly8gVGV4dHVyZXNcblxuXHRmdW5jdGlvbiBhbGxvY1RleHR1cmVVbml0KCkge1xuXG5cdFx0dmFyIHRleHR1cmVVbml0ID0gX3VzZWRUZXh0dXJlVW5pdHM7XG5cblx0XHRpZiAoIHRleHR1cmVVbml0ID49IGNhcGFiaWxpdGllcy5tYXhUZXh0dXJlcyApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVHJ5aW5nIHRvIHVzZSAnICsgdGV4dHVyZVVuaXQgKyAnIHRleHR1cmUgdW5pdHMgd2hpbGUgdGhpcyBHUFUgc3VwcG9ydHMgb25seSAnICsgY2FwYWJpbGl0aWVzLm1heFRleHR1cmVzICk7XG5cblx0XHR9XG5cblx0XHRfdXNlZFRleHR1cmVVbml0cyArPSAxO1xuXG5cdFx0cmV0dXJuIHRleHR1cmVVbml0O1xuXG5cdH1cblxuXHR0aGlzLmFsbG9jVGV4dHVyZVVuaXQgPSBhbGxvY1RleHR1cmVVbml0O1xuXG5cdC8vIHRoaXMuc2V0VGV4dHVyZTJEID0gc2V0VGV4dHVyZTJEO1xuXHR0aGlzLnNldFRleHR1cmUyRCA9ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHdhcm5lZCA9IGZhbHNlO1xuXG5cdFx0Ly8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6IHBlZWwgdGV4dHVyZS50ZXh0dXJlXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldFRleHR1cmUyRCggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlICYmIHRleHR1cmUuaXNXZWJHTFJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0XHRpZiAoICEgd2FybmVkICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLldlYkdMUmVuZGVyZXIuc2V0VGV4dHVyZTJEOiBkb24ndCB1c2UgcmVuZGVyIHRhcmdldHMgYXMgdGV4dHVyZXMuIFVzZSB0aGVpciAudGV4dHVyZSBwcm9wZXJ0eSBpbnN0ZWFkLlwiICk7XG5cdFx0XHRcdFx0d2FybmVkID0gdHJ1ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZSA9IHRleHR1cmUudGV4dHVyZTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlcy5zZXRUZXh0dXJlMkQoIHRleHR1cmUsIHNsb3QgKTtcblxuXHRcdH07XG5cblx0fSgpICk7XG5cblx0dGhpcy5zZXRUZXh0dXJlID0gKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgd2FybmVkID0gZmFsc2U7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0VGV4dHVyZSggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdFx0aWYgKCAhIHdhcm5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oIFwiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNldFRleHR1cmUgaXMgZGVwcmVjYXRlZCwgdXNlIHNldFRleHR1cmUyRCBpbnN0ZWFkLlwiICk7XG5cdFx0XHRcdHdhcm5lZCA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0dGV4dHVyZXMuc2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCBzbG90ICk7XG5cblx0XHR9O1xuXG5cdH0oKSApO1xuXG5cdHRoaXMuc2V0VGV4dHVyZUN1YmUgPSAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB3YXJuZWQgPSBmYWxzZTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzZXRUZXh0dXJlQ3ViZSggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdFx0Ly8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6IHBlZWwgdGV4dHVyZS50ZXh0dXJlXG5cdFx0XHRpZiAoIHRleHR1cmUgJiYgdGV4dHVyZS5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSApIHtcblxuXHRcdFx0XHRpZiAoICEgd2FybmVkICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLldlYkdMUmVuZGVyZXIuc2V0VGV4dHVyZUN1YmU6IGRvbid0IHVzZSBjdWJlIHJlbmRlciB0YXJnZXRzIGFzIHRleHR1cmVzLiBVc2UgdGhlaXIgLnRleHR1cmUgcHJvcGVydHkgaW5zdGVhZC5cIiApO1xuXHRcdFx0XHRcdHdhcm5lZCA9IHRydWU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRleHR1cmUgPSB0ZXh0dXJlLnRleHR1cmU7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gY3VycmVudGx5IHJlbHlpbmcgb24gdGhlIGZhY3QgdGhhdCBXZWJHTFJlbmRlclRhcmdldEN1YmUudGV4dHVyZSBpcyBhIFRleHR1cmUgYW5kIE5PVCBhIEN1YmVUZXh0dXJlXG5cdFx0XHQvLyBUT0RPOiB1bmlmeSB0aGVzZSBjb2RlIHBhdGhzXG5cdFx0XHRpZiAoICggdGV4dHVyZSAmJiB0ZXh0dXJlLmlzQ3ViZVRleHR1cmUgKSB8fFxuXHRcdFx0XHQoIEFycmF5LmlzQXJyYXkoIHRleHR1cmUuaW1hZ2UgKSAmJiB0ZXh0dXJlLmltYWdlLmxlbmd0aCA9PT0gNiApICkge1xuXG5cdFx0XHRcdC8vIENvbXByZXNzZWRUZXh0dXJlIGNhbiBoYXZlIEFycmF5IGluIGltYWdlIDovXG5cblx0XHRcdFx0Ly8gdGhpcyBmdW5jdGlvbiBhbG9uZSBzaG91bGQgdGFrZSBjYXJlIG9mIGN1YmUgdGV4dHVyZXNcblx0XHRcdFx0dGV4dHVyZXMuc2V0VGV4dHVyZUN1YmUoIHRleHR1cmUsIHNsb3QgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBhc3N1bWVkOiB0ZXh0dXJlIHByb3BlcnR5IG9mIFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0Q3ViZVxuXG5cdFx0XHRcdHRleHR1cmVzLnNldFRleHR1cmVDdWJlRHluYW1pYyggdGV4dHVyZSwgc2xvdCApO1xuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0oKSApO1xuXG5cdHRoaXMuZ2V0UmVuZGVyVGFyZ2V0ID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9jdXJyZW50UmVuZGVyVGFyZ2V0O1xuXG5cdH07XG5cblx0dGhpcy5zZXRSZW5kZXJUYXJnZXQgPSBmdW5jdGlvbiAoIHJlbmRlclRhcmdldCApIHtcblxuXHRcdF9jdXJyZW50UmVuZGVyVGFyZ2V0ID0gcmVuZGVyVGFyZ2V0O1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQgJiYgcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApLl9fd2ViZ2xGcmFtZWJ1ZmZlciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0ZXh0dXJlcy5zZXR1cFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHR9XG5cblx0XHR2YXIgZnJhbWVidWZmZXIgPSBudWxsO1xuXHRcdHZhciBpc0N1YmUgPSBmYWxzZTtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0XHR2YXIgX193ZWJnbEZyYW1lYnVmZmVyID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApLl9fd2ViZ2xGcmFtZWJ1ZmZlcjtcblxuXHRcdFx0aWYgKCByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgKSB7XG5cblx0XHRcdFx0ZnJhbWVidWZmZXIgPSBfX3dlYmdsRnJhbWVidWZmZXJbIHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSBdO1xuXHRcdFx0XHRpc0N1YmUgPSB0cnVlO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGZyYW1lYnVmZmVyID0gX193ZWJnbEZyYW1lYnVmZmVyO1xuXG5cdFx0XHR9XG5cblx0XHRcdF9jdXJyZW50Vmlld3BvcnQuY29weSggcmVuZGVyVGFyZ2V0LnZpZXdwb3J0ICk7XG5cdFx0XHRfY3VycmVudFNjaXNzb3IuY29weSggcmVuZGVyVGFyZ2V0LnNjaXNzb3IgKTtcblx0XHRcdF9jdXJyZW50U2Npc3NvclRlc3QgPSByZW5kZXJUYXJnZXQuc2Npc3NvclRlc3Q7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfY3VycmVudFZpZXdwb3J0LmNvcHkoIF92aWV3cG9ydCApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApO1xuXHRcdFx0X2N1cnJlbnRTY2lzc29yLmNvcHkoIF9zY2lzc29yICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICk7XG5cdFx0XHRfY3VycmVudFNjaXNzb3JUZXN0ID0gX3NjaXNzb3JUZXN0O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBfY3VycmVudEZyYW1lYnVmZmVyICE9PSBmcmFtZWJ1ZmZlciApIHtcblxuXHRcdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlciApO1xuXHRcdFx0X2N1cnJlbnRGcmFtZWJ1ZmZlciA9IGZyYW1lYnVmZmVyO1xuXG5cdFx0fVxuXG5cdFx0c3RhdGUudmlld3BvcnQoIF9jdXJyZW50Vmlld3BvcnQgKTtcblx0XHRzdGF0ZS5zY2lzc29yKCBfY3VycmVudFNjaXNzb3IgKTtcblx0XHRzdGF0ZS5zZXRTY2lzc29yVGVzdCggX2N1cnJlbnRTY2lzc29yVGVzdCApO1xuXG5cdFx0aWYgKCBpc0N1YmUgKSB7XG5cblx0XHRcdHZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQudGV4dHVyZSApO1xuXHRcdFx0X2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKCBfZ2wuRlJBTUVCVUZGRVIsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUsIHJlbmRlclRhcmdldC5hY3RpdmVNaXBNYXBMZXZlbCApO1xuXG5cdFx0fVxuXG5cdH07XG5cblx0dGhpcy5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzID0gZnVuY3Rpb24gKCByZW5kZXJUYXJnZXQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGJ1ZmZlciApIHtcblxuXHRcdGlmICggISAoIHJlbmRlclRhcmdldCAmJiByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldCApICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0LicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHZhciBmcmFtZWJ1ZmZlciA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKS5fX3dlYmdsRnJhbWVidWZmZXI7XG5cblx0XHRpZiAoIGZyYW1lYnVmZmVyICkge1xuXG5cdFx0XHR2YXIgcmVzdG9yZSA9IGZhbHNlO1xuXG5cdFx0XHRpZiAoIGZyYW1lYnVmZmVyICE9PSBfY3VycmVudEZyYW1lYnVmZmVyICkge1xuXG5cdFx0XHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIgKTtcblxuXHRcdFx0XHRyZXN0b3JlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdHZhciB0ZXh0dXJlID0gcmVuZGVyVGFyZ2V0LnRleHR1cmU7XG5cdFx0XHRcdHZhciB0ZXh0dXJlRm9ybWF0ID0gdGV4dHVyZS5mb3JtYXQ7XG5cdFx0XHRcdHZhciB0ZXh0dXJlVHlwZSA9IHRleHR1cmUudHlwZTtcblxuXHRcdFx0XHRpZiAoIHRleHR1cmVGb3JtYXQgIT09IFJHQkFGb3JtYXQgJiYgdXRpbHMuY29udmVydCggdGV4dHVyZUZvcm1hdCApICE9PSBfZ2wuZ2V0UGFyYW1ldGVyKCBfZ2wuSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQgKSApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gUkdCQSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGZvcm1hdC4nICk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHRleHR1cmVUeXBlICE9PSBVbnNpZ25lZEJ5dGVUeXBlICYmIHV0aWxzLmNvbnZlcnQoIHRleHR1cmVUeXBlICkgIT09IF9nbC5nZXRQYXJhbWV0ZXIoIF9nbC5JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEUgKSAmJiAvLyBJRTExLCBFZGdlIGFuZCBDaHJvbWUgTWFjIDwgNTIgKCM5NTEzKVxuXHRcdFx0XHRcdCEgKCB0ZXh0dXJlVHlwZSA9PT0gRmxvYXRUeXBlICYmICggZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdCcgKSB8fCBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbG9yX2J1ZmZlcl9mbG9hdCcgKSApICkgJiYgLy8gQ2hyb21lIE1hYyA+PSA1MiBhbmQgRmlyZWZveFxuXHRcdFx0XHRcdCEgKCB0ZXh0dXJlVHlwZSA9PT0gSGFsZkZsb2F0VHlwZSAmJiBleHRlbnNpb25zLmdldCggJ0VYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCcgKSApICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBVbnNpZ25lZEJ5dGVUeXBlIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZS4nICk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIF9nbC5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKCBfZ2wuRlJBTUVCVUZGRVIgKSA9PT0gX2dsLkZSQU1FQlVGRkVSX0NPTVBMRVRFICkge1xuXG5cdFx0XHRcdFx0Ly8gdGhlIGZvbGxvd2luZyBpZiBzdGF0ZW1lbnQgZW5zdXJlcyB2YWxpZCByZWFkIHJlcXVlc3RzIChubyBvdXQtb2YtYm91bmRzIHBpeGVscywgc2VlICM4NjA0KVxuXG5cdFx0XHRcdFx0aWYgKCAoIHggPj0gMCAmJiB4IDw9ICggcmVuZGVyVGFyZ2V0LndpZHRoIC0gd2lkdGggKSApICYmICggeSA+PSAwICYmIHkgPD0gKCByZW5kZXJUYXJnZXQuaGVpZ2h0IC0gaGVpZ2h0ICkgKSApIHtcblxuXHRcdFx0XHRcdFx0X2dsLnJlYWRQaXhlbHMoIHgsIHksIHdpZHRoLCBoZWlnaHQsIHV0aWxzLmNvbnZlcnQoIHRleHR1cmVGb3JtYXQgKSwgdXRpbHMuY29udmVydCggdGV4dHVyZVR5cGUgKSwgYnVmZmVyICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlYWRQaXhlbHMgZnJvbSByZW5kZXJUYXJnZXQgZmFpbGVkLiBGcmFtZWJ1ZmZlciBub3QgY29tcGxldGUuJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBmaW5hbGx5IHtcblxuXHRcdFx0XHRpZiAoIHJlc3RvcmUgKSB7XG5cblx0XHRcdFx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIF9jdXJyZW50RnJhbWVidWZmZXIgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9O1xuXG5cdHRoaXMuY29weUZyYW1lYnVmZmVyVG9UZXh0dXJlID0gZnVuY3Rpb24gKCBwb3NpdGlvbiwgdGV4dHVyZSwgbGV2ZWwgKSB7XG5cblx0XHR2YXIgd2lkdGggPSB0ZXh0dXJlLmltYWdlLndpZHRoO1xuXHRcdHZhciBoZWlnaHQgPSB0ZXh0dXJlLmltYWdlLmhlaWdodDtcblx0XHR2YXIgZ2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLmZvcm1hdCApO1xuXG5cdFx0dGhpcy5zZXRUZXh0dXJlMkQoIHRleHR1cmUsIDAgKTtcblxuXHRcdF9nbC5jb3B5VGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGxldmVsIHx8IDAsIGdsRm9ybWF0LCBwb3NpdGlvbi54LCBwb3NpdGlvbi55LCB3aWR0aCwgaGVpZ2h0LCAwICk7XG5cblx0fTtcblxuXHR0aGlzLmNvcHlUZXh0dXJlVG9UZXh0dXJlID0gZnVuY3Rpb24gKCBwb3NpdGlvbiwgc3JjVGV4dHVyZSwgZHN0VGV4dHVyZSwgbGV2ZWwgKSB7XG5cblx0XHR2YXIgd2lkdGggPSBzcmNUZXh0dXJlLmltYWdlLndpZHRoO1xuXHRcdHZhciBoZWlnaHQgPSBzcmNUZXh0dXJlLmltYWdlLmhlaWdodDtcblx0XHR2YXIgZ2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCBkc3RUZXh0dXJlLmZvcm1hdCApO1xuXHRcdHZhciBnbFR5cGUgPSB1dGlscy5jb252ZXJ0KCBkc3RUZXh0dXJlLnR5cGUgKTtcblx0XHR2YXIgcGl4ZWxzID0gc3JjVGV4dHVyZS5pc0RhdGFUZXh0dXJlID8gc3JjVGV4dHVyZS5pbWFnZS5kYXRhIDogc3JjVGV4dHVyZS5pbWFnZTtcblxuXHRcdHRoaXMuc2V0VGV4dHVyZTJEKCBkc3RUZXh0dXJlLCAwICk7XG5cblx0XHRfZ2wudGV4U3ViSW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGxldmVsIHx8IDAsIHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHdpZHRoLCBoZWlnaHQsIGdsRm9ybWF0LCBnbFR5cGUsIHBpeGVscyApO1xuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBGb2dFeHAyKCBjb2xvciwgZGVuc2l0eSApIHtcblxuXHR0aGlzLm5hbWUgPSAnJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCBjb2xvciApO1xuXHR0aGlzLmRlbnNpdHkgPSAoIGRlbnNpdHkgIT09IHVuZGVmaW5lZCApID8gZGVuc2l0eSA6IDAuMDAwMjU7XG5cbn1cblxuRm9nRXhwMi5wcm90b3R5cGUuaXNGb2dFeHAyID0gdHJ1ZTtcblxuRm9nRXhwMi5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG5cblx0cmV0dXJuIG5ldyBGb2dFeHAyKCB0aGlzLmNvbG9yLmdldEhleCgpLCB0aGlzLmRlbnNpdHkgKTtcblxufTtcblxuRm9nRXhwMi5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCAvKiBtZXRhICovICkge1xuXG5cdHJldHVybiB7XG5cdFx0dHlwZTogJ0ZvZ0V4cDInLFxuXHRcdGNvbG9yOiB0aGlzLmNvbG9yLmdldEhleCgpLFxuXHRcdGRlbnNpdHk6IHRoaXMuZGVuc2l0eVxuXHR9O1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIEZvZyggY29sb3IsIG5lYXIsIGZhciApIHtcblxuXHR0aGlzLm5hbWUgPSAnJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCBjb2xvciApO1xuXG5cdHRoaXMubmVhciA9ICggbmVhciAhPT0gdW5kZWZpbmVkICkgPyBuZWFyIDogMTtcblx0dGhpcy5mYXIgPSAoIGZhciAhPT0gdW5kZWZpbmVkICkgPyBmYXIgOiAxMDAwO1xuXG59XG5cbkZvZy5wcm90b3R5cGUuaXNGb2cgPSB0cnVlO1xuXG5Gb2cucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuXG5cdHJldHVybiBuZXcgRm9nKCB0aGlzLmNvbG9yLmdldEhleCgpLCB0aGlzLm5lYXIsIHRoaXMuZmFyICk7XG5cbn07XG5cbkZvZy5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCAvKiBtZXRhICovICkge1xuXG5cdHJldHVybiB7XG5cdFx0dHlwZTogJ0ZvZycsXG5cdFx0Y29sb3I6IHRoaXMuY29sb3IuZ2V0SGV4KCksXG5cdFx0bmVhcjogdGhpcy5uZWFyLFxuXHRcdGZhcjogdGhpcy5mYXJcblx0fTtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFNjZW5lKCkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU2NlbmUnO1xuXG5cdHRoaXMuYmFja2dyb3VuZCA9IG51bGw7XG5cdHRoaXMuZm9nID0gbnVsbDtcblx0dGhpcy5vdmVycmlkZU1hdGVyaWFsID0gbnVsbDtcblxuXHR0aGlzLmF1dG9VcGRhdGUgPSB0cnVlOyAvLyBjaGVja2VkIGJ5IHRoZSByZW5kZXJlclxuXG59XG5cblNjZW5lLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFNjZW5lLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlLCByZWN1cnNpdmUgKSB7XG5cblx0XHRPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xuXG5cdFx0aWYgKCBzb3VyY2UuYmFja2dyb3VuZCAhPT0gbnVsbCApIHRoaXMuYmFja2dyb3VuZCA9IHNvdXJjZS5iYWNrZ3JvdW5kLmNsb25lKCk7XG5cdFx0aWYgKCBzb3VyY2UuZm9nICE9PSBudWxsICkgdGhpcy5mb2cgPSBzb3VyY2UuZm9nLmNsb25lKCk7XG5cdFx0aWYgKCBzb3VyY2Uub3ZlcnJpZGVNYXRlcmlhbCAhPT0gbnVsbCApIHRoaXMub3ZlcnJpZGVNYXRlcmlhbCA9IHNvdXJjZS5vdmVycmlkZU1hdGVyaWFsLmNsb25lKCk7XG5cblx0XHR0aGlzLmF1dG9VcGRhdGUgPSBzb3VyY2UuYXV0b1VwZGF0ZTtcblx0XHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBzb3VyY2UubWF0cml4QXV0b1VwZGF0ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IE9iamVjdDNELnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0aWYgKCB0aGlzLmJhY2tncm91bmQgIT09IG51bGwgKSBkYXRhLm9iamVjdC5iYWNrZ3JvdW5kID0gdGhpcy5iYWNrZ3JvdW5kLnRvSlNPTiggbWV0YSApO1xuXHRcdGlmICggdGhpcy5mb2cgIT09IG51bGwgKSBkYXRhLm9iamVjdC5mb2cgPSB0aGlzLmZvZy50b0pTT04oKTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICpcdHV2T2Zmc2V0OiBuZXcgVEhSRUUuVmVjdG9yMigpLFxuICpcdHV2U2NhbGU6IG5ldyBUSFJFRS5WZWN0b3IyKClcbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBTcHJpdGVNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1Nwcml0ZU1hdGVyaWFsJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApO1xuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5yb3RhdGlvbiA9IDA7XG5cblx0dGhpcy5mb2cgPSBmYWxzZTtcblx0dGhpcy5saWdodHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cblNwcml0ZU1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuU3ByaXRlTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ByaXRlTWF0ZXJpYWw7XG5TcHJpdGVNYXRlcmlhbC5wcm90b3R5cGUuaXNTcHJpdGVNYXRlcmlhbCA9IHRydWU7XG5cblNwcml0ZU1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMucm90YXRpb24gPSBzb3VyY2Uucm90YXRpb247XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gU3ByaXRlKCBtYXRlcmlhbCApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1Nwcml0ZSc7XG5cblx0dGhpcy5tYXRlcmlhbCA9ICggbWF0ZXJpYWwgIT09IHVuZGVmaW5lZCApID8gbWF0ZXJpYWwgOiBuZXcgU3ByaXRlTWF0ZXJpYWwoKTtcblxuXHR0aGlzLmNlbnRlciA9IG5ldyBWZWN0b3IyKCAwLjUsIDAuNSApO1xuXG59XG5cblNwcml0ZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTcHJpdGUsXG5cblx0aXNTcHJpdGU6IHRydWUsXG5cblx0cmF5Y2FzdDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaW50ZXJzZWN0UG9pbnQgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB3b3JsZFBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgd29ybGRTY2FsZSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xuXG5cdFx0XHR3b3JsZFBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5tYXRyaXhXb3JsZCApO1xuXHRcdFx0cmF5Y2FzdGVyLnJheS5jbG9zZXN0UG9pbnRUb1BvaW50KCB3b3JsZFBvc2l0aW9uLCBpbnRlcnNlY3RQb2ludCApO1xuXG5cdFx0XHR3b3JsZFNjYWxlLnNldEZyb21NYXRyaXhTY2FsZSggdGhpcy5tYXRyaXhXb3JsZCApO1xuXHRcdFx0dmFyIGd1ZXNzU2l6ZVNxID0gd29ybGRTY2FsZS54ICogd29ybGRTY2FsZS55IC8gNDtcblxuXHRcdFx0aWYgKCB3b3JsZFBvc2l0aW9uLmRpc3RhbmNlVG9TcXVhcmVkKCBpbnRlcnNlY3RQb2ludCApID4gZ3Vlc3NTaXplU3EgKSByZXR1cm47XG5cblx0XHRcdHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIGludGVyc2VjdFBvaW50ICk7XG5cblx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSByZXR1cm47XG5cblx0XHRcdGludGVyc2VjdHMucHVzaCgge1xuXG5cdFx0XHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcblx0XHRcdFx0cG9pbnQ6IGludGVyc2VjdFBvaW50LmNsb25lKCksXG5cdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdG9iamVjdDogdGhpc1xuXG5cdFx0XHR9ICk7XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMubWF0ZXJpYWwgKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0aWYgKCBzb3VyY2UuY2VudGVyICE9PSB1bmRlZmluZWQgKSB0aGlzLmNlbnRlci5jb3B5KCBzb3VyY2UuY2VudGVyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMT0QoKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMT0QnO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLCB7XG5cdFx0bGV2ZWxzOiB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IFtdXG5cdFx0fVxuXHR9ICk7XG5cbn1cblxuTE9ELnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IExPRCxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSwgZmFsc2UgKTtcblxuXHRcdHZhciBsZXZlbHMgPSBzb3VyY2UubGV2ZWxzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBsZXZlbCA9IGxldmVsc1sgaSBdO1xuXG5cdFx0XHR0aGlzLmFkZExldmVsKCBsZXZlbC5vYmplY3QuY2xvbmUoKSwgbGV2ZWwuZGlzdGFuY2UgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkTGV2ZWw6IGZ1bmN0aW9uICggb2JqZWN0LCBkaXN0YW5jZSApIHtcblxuXHRcdGlmICggZGlzdGFuY2UgPT09IHVuZGVmaW5lZCApIGRpc3RhbmNlID0gMDtcblxuXHRcdGRpc3RhbmNlID0gTWF0aC5hYnMoIGRpc3RhbmNlICk7XG5cblx0XHR2YXIgbGV2ZWxzID0gdGhpcy5sZXZlbHM7XG5cblx0XHRmb3IgKCB2YXIgbCA9IDA7IGwgPCBsZXZlbHMubGVuZ3RoOyBsICsrICkge1xuXG5cdFx0XHRpZiAoIGRpc3RhbmNlIDwgbGV2ZWxzWyBsIF0uZGlzdGFuY2UgKSB7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGxldmVscy5zcGxpY2UoIGwsIDAsIHsgZGlzdGFuY2U6IGRpc3RhbmNlLCBvYmplY3Q6IG9iamVjdCB9ICk7XG5cblx0XHR0aGlzLmFkZCggb2JqZWN0ICk7XG5cblx0fSxcblxuXHRnZXRPYmplY3RGb3JEaXN0YW5jZTogZnVuY3Rpb24gKCBkaXN0YW5jZSApIHtcblxuXHRcdHZhciBsZXZlbHMgPSB0aGlzLmxldmVscztcblxuXHRcdGZvciAoIHZhciBpID0gMSwgbCA9IGxldmVscy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRpZiAoIGRpc3RhbmNlIDwgbGV2ZWxzWyBpIF0uZGlzdGFuY2UgKSB7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBsZXZlbHNbIGkgLSAxIF0ub2JqZWN0O1xuXG5cdH0sXG5cblx0cmF5Y2FzdDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbWF0cml4UG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcblxuXHRcdFx0bWF0cml4UG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIG1hdHJpeFBvc2l0aW9uICk7XG5cblx0XHRcdHRoaXMuZ2V0T2JqZWN0Rm9yRGlzdGFuY2UoIGRpc3RhbmNlICkucmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICk7XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdHVwZGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdjIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSggY2FtZXJhICkge1xuXG5cdFx0XHR2YXIgbGV2ZWxzID0gdGhpcy5sZXZlbHM7XG5cblx0XHRcdGlmICggbGV2ZWxzLmxlbmd0aCA+IDEgKSB7XG5cblx0XHRcdFx0djEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTtcblx0XHRcdFx0djIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0dmFyIGRpc3RhbmNlID0gdjEuZGlzdGFuY2VUbyggdjIgKTtcblxuXHRcdFx0XHRsZXZlbHNbIDAgXS5vYmplY3QudmlzaWJsZSA9IHRydWU7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGRpc3RhbmNlID49IGxldmVsc1sgaSBdLmRpc3RhbmNlICkge1xuXG5cdFx0XHRcdFx0XHRsZXZlbHNbIGkgLSAxIF0ub2JqZWN0LnZpc2libGUgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGxldmVsc1sgaSBdLm9iamVjdC52aXNpYmxlID0gdHJ1ZTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmb3IgKCA7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0bGV2ZWxzWyBpIF0ub2JqZWN0LnZpc2libGUgPSBmYWxzZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGRhdGEgPSBPYmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRcdGRhdGEub2JqZWN0LmxldmVscyA9IFtdO1xuXG5cdFx0dmFyIGxldmVscyA9IHRoaXMubGV2ZWxzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBsZXZlbCA9IGxldmVsc1sgaSBdO1xuXG5cdFx0XHRkYXRhLm9iamVjdC5sZXZlbHMucHVzaCgge1xuXHRcdFx0XHRvYmplY3Q6IGxldmVsLm9iamVjdC51dWlkLFxuXHRcdFx0XHRkaXN0YW5jZTogbGV2ZWwuZGlzdGFuY2Vcblx0XHRcdH0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtaWNoYWVsIGd1ZXJyZXJvIC8gaHR0cDovL3JlYWxpdHltZWx0ZG93bi5jb21cbiAqIEBhdXRob3IgaWtlcnIgLyBodHRwOi8vdmVyb2xkLmNvbVxuICovXG5cbmZ1bmN0aW9uIFNrZWxldG9uKCBib25lcywgYm9uZUludmVyc2VzICkge1xuXG5cdC8vIGNvcHkgdGhlIGJvbmUgYXJyYXlcblxuXHRib25lcyA9IGJvbmVzIHx8IFtdO1xuXG5cdHRoaXMuYm9uZXMgPSBib25lcy5zbGljZSggMCApO1xuXHR0aGlzLmJvbmVNYXRyaWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIHRoaXMuYm9uZXMubGVuZ3RoICogMTYgKTtcblxuXHQvLyB1c2UgdGhlIHN1cHBsaWVkIGJvbmUgaW52ZXJzZXMgb3IgY2FsY3VsYXRlIHRoZSBpbnZlcnNlc1xuXG5cdGlmICggYm9uZUludmVyc2VzID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHR0aGlzLmNhbGN1bGF0ZUludmVyc2VzKCk7XG5cblx0fSBlbHNlIHtcblxuXHRcdGlmICggdGhpcy5ib25lcy5sZW5ndGggPT09IGJvbmVJbnZlcnNlcy5sZW5ndGggKSB7XG5cblx0XHRcdHRoaXMuYm9uZUludmVyc2VzID0gYm9uZUludmVyc2VzLnNsaWNlKCAwICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Ta2VsZXRvbiBib25lSW52ZXJzZXMgaXMgdGhlIHdyb25nIGxlbmd0aC4nICk7XG5cblx0XHRcdHRoaXMuYm9uZUludmVyc2VzID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdHRoaXMuYm9uZUludmVyc2VzLnB1c2goIG5ldyBNYXRyaXg0KCkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5PYmplY3QuYXNzaWduKCBTa2VsZXRvbi5wcm90b3R5cGUsIHtcblxuXHRjYWxjdWxhdGVJbnZlcnNlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5ib25lSW52ZXJzZXMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgaW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRcdGlmICggdGhpcy5ib25lc1sgaSBdICkge1xuXG5cdFx0XHRcdGludmVyc2UuZ2V0SW52ZXJzZSggdGhpcy5ib25lc1sgaSBdLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5ib25lSW52ZXJzZXMucHVzaCggaW52ZXJzZSApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0cG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGJvbmUsIGksIGlsO1xuXG5cdFx0Ly8gcmVjb3ZlciB0aGUgYmluZC10aW1lIHdvcmxkIG1hdHJpY2VzXG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRib25lID0gdGhpcy5ib25lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGJvbmUgKSB7XG5cblx0XHRcdFx0Ym9uZS5tYXRyaXhXb3JsZC5nZXRJbnZlcnNlKCB0aGlzLmJvbmVJbnZlcnNlc1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGNvbXB1dGUgdGhlIGxvY2FsIG1hdHJpY2VzLCBwb3NpdGlvbnMsIHJvdGF0aW9ucyBhbmQgc2NhbGVzXG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRib25lID0gdGhpcy5ib25lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGJvbmUgKSB7XG5cblx0XHRcdFx0aWYgKCBib25lLnBhcmVudCAmJiBib25lLnBhcmVudC5pc0JvbmUgKSB7XG5cblx0XHRcdFx0XHRib25lLm1hdHJpeC5nZXRJbnZlcnNlKCBib25lLnBhcmVudC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHRcdGJvbmUubWF0cml4Lm11bHRpcGx5KCBib25lLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGJvbmUubWF0cml4LmNvcHkoIGJvbmUubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ym9uZS5tYXRyaXguZGVjb21wb3NlKCBib25lLnBvc2l0aW9uLCBib25lLnF1YXRlcm5pb24sIGJvbmUuc2NhbGUgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0dXBkYXRlOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBvZmZzZXRNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHRcdHZhciBpZGVudGl0eU1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkge1xuXG5cdFx0XHR2YXIgYm9uZXMgPSB0aGlzLmJvbmVzO1xuXHRcdFx0dmFyIGJvbmVJbnZlcnNlcyA9IHRoaXMuYm9uZUludmVyc2VzO1xuXHRcdFx0dmFyIGJvbmVNYXRyaWNlcyA9IHRoaXMuYm9uZU1hdHJpY2VzO1xuXHRcdFx0dmFyIGJvbmVUZXh0dXJlID0gdGhpcy5ib25lVGV4dHVyZTtcblxuXHRcdFx0Ly8gZmxhdHRlbiBib25lIG1hdHJpY2VzIHRvIGFycmF5XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHQvLyBjb21wdXRlIHRoZSBvZmZzZXQgYmV0d2VlbiB0aGUgY3VycmVudCBhbmQgdGhlIG9yaWdpbmFsIHRyYW5zZm9ybVxuXG5cdFx0XHRcdHZhciBtYXRyaXggPSBib25lc1sgaSBdID8gYm9uZXNbIGkgXS5tYXRyaXhXb3JsZCA6IGlkZW50aXR5TWF0cml4O1xuXG5cdFx0XHRcdG9mZnNldE1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBtYXRyaXgsIGJvbmVJbnZlcnNlc1sgaSBdICk7XG5cdFx0XHRcdG9mZnNldE1hdHJpeC50b0FycmF5KCBib25lTWF0cmljZXMsIGkgKiAxNiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggYm9uZVRleHR1cmUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRib25lVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSApKCksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgU2tlbGV0b24oIHRoaXMuYm9uZXMsIHRoaXMuYm9uZUludmVyc2VzICk7XG5cblx0fSxcblxuXHRnZXRCb25lQnlOYW1lOiBmdW5jdGlvbiAoIG5hbWUgKSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGJvbmUgPSB0aGlzLmJvbmVzWyBpIF07XG5cblx0XHRcdGlmICggYm9uZS5uYW1lID09PSBuYW1lICkge1xuXG5cdFx0XHRcdHJldHVybiBib25lO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBpa2VyciAvIGh0dHA6Ly92ZXJvbGQuY29tXG4gKi9cblxuZnVuY3Rpb24gQm9uZSgpIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0JvbmUnO1xuXG59XG5cbkJvbmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQm9uZSxcblxuXHRpc0JvbmU6IHRydWVcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBpa2VyciAvIGh0dHA6Ly92ZXJvbGQuY29tXG4gKi9cblxuZnVuY3Rpb24gU2tpbm5lZE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcblxuXHRNZXNoLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdHRoaXMudHlwZSA9ICdTa2lubmVkTWVzaCc7XG5cblx0dGhpcy5iaW5kTW9kZSA9ICdhdHRhY2hlZCc7XG5cdHRoaXMuYmluZE1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdHRoaXMuYmluZE1hdHJpeEludmVyc2UgPSBuZXcgTWF0cml4NCgpO1xuXG5cdHZhciBib25lcyA9IHRoaXMuaW5pdEJvbmVzKCk7XG5cdHZhciBza2VsZXRvbiA9IG5ldyBTa2VsZXRvbiggYm9uZXMgKTtcblxuXHR0aGlzLmJpbmQoIHNrZWxldG9uLCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0dGhpcy5ub3JtYWxpemVTa2luV2VpZ2h0cygpO1xuXG59XG5cblNraW5uZWRNZXNoLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE1lc2gucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogU2tpbm5lZE1lc2gsXG5cblx0aXNTa2lubmVkTWVzaDogdHJ1ZSxcblxuXHRpbml0Qm9uZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBib25lcyA9IFtdLCBib25lLCBnYm9uZTtcblx0XHR2YXIgaSwgaWw7XG5cblx0XHRpZiAoIHRoaXMuZ2VvbWV0cnkgJiYgdGhpcy5nZW9tZXRyeS5ib25lcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBmaXJzdCwgY3JlYXRlIGFycmF5IG9mICdCb25lJyBvYmplY3RzIGZyb20gZ2VvbWV0cnkgZGF0YVxuXG5cdFx0XHRmb3IgKCBpID0gMCwgaWwgPSB0aGlzLmdlb21ldHJ5LmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdGdib25lID0gdGhpcy5nZW9tZXRyeS5ib25lc1sgaSBdO1xuXG5cdFx0XHRcdC8vIGNyZWF0ZSBuZXcgJ0JvbmUnIG9iamVjdFxuXG5cdFx0XHRcdGJvbmUgPSBuZXcgQm9uZSgpO1xuXHRcdFx0XHRib25lcy5wdXNoKCBib25lICk7XG5cblx0XHRcdFx0Ly8gYXBwbHkgdmFsdWVzXG5cblx0XHRcdFx0Ym9uZS5uYW1lID0gZ2JvbmUubmFtZTtcblx0XHRcdFx0Ym9uZS5wb3NpdGlvbi5mcm9tQXJyYXkoIGdib25lLnBvcyApO1xuXHRcdFx0XHRib25lLnF1YXRlcm5pb24uZnJvbUFycmF5KCBnYm9uZS5yb3RxICk7XG5cdFx0XHRcdGlmICggZ2JvbmUuc2NsICE9PSB1bmRlZmluZWQgKSBib25lLnNjYWxlLmZyb21BcnJheSggZ2JvbmUuc2NsICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gc2Vjb25kLCBjcmVhdGUgYm9uZSBoaWVyYXJjaHlcblxuXHRcdFx0Zm9yICggaSA9IDAsIGlsID0gdGhpcy5nZW9tZXRyeS5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRnYm9uZSA9IHRoaXMuZ2VvbWV0cnkuYm9uZXNbIGkgXTtcblxuXHRcdFx0XHRpZiAoICggZ2JvbmUucGFyZW50ICE9PSAtIDEgKSAmJiAoIGdib25lLnBhcmVudCAhPT0gbnVsbCApICYmICggYm9uZXNbIGdib25lLnBhcmVudCBdICE9PSB1bmRlZmluZWQgKSApIHtcblxuXHRcdFx0XHRcdC8vIHN1YnNlcXVlbnQgYm9uZXMgaW4gdGhlIGhpZXJhcmNoeVxuXG5cdFx0XHRcdFx0Ym9uZXNbIGdib25lLnBhcmVudCBdLmFkZCggYm9uZXNbIGkgXSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyB0b3Btb3N0IGJvbmUsIGltbWVkaWF0ZSBjaGlsZCBvZiB0aGUgc2tpbm5lZCBtZXNoXG5cblx0XHRcdFx0XHR0aGlzLmFkZCggYm9uZXNbIGkgXSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gbm93IHRoZSBib25lcyBhcmUgcGFydCBvZiB0aGUgc2NlbmUgZ3JhcGggYW5kIGNoaWxkcmVuIG9mIHRoZSBza2lubmVkIG1lc2guXG5cdFx0Ly8gbGV0J3MgdXBkYXRlIHRoZSBjb3JyZXNwb25kaW5nIG1hdHJpY2VzXG5cblx0XHR0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XG5cblx0XHRyZXR1cm4gYm9uZXM7XG5cblx0fSxcblxuXHRiaW5kOiBmdW5jdGlvbiAoIHNrZWxldG9uLCBiaW5kTWF0cml4ICkge1xuXG5cdFx0dGhpcy5za2VsZXRvbiA9IHNrZWxldG9uO1xuXG5cdFx0aWYgKCBiaW5kTWF0cml4ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRoaXMudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTtcblxuXHRcdFx0dGhpcy5za2VsZXRvbi5jYWxjdWxhdGVJbnZlcnNlcygpO1xuXG5cdFx0XHRiaW5kTWF0cml4ID0gdGhpcy5tYXRyaXhXb3JsZDtcblxuXHRcdH1cblxuXHRcdHRoaXMuYmluZE1hdHJpeC5jb3B5KCBiaW5kTWF0cml4ICk7XG5cdFx0dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKCBiaW5kTWF0cml4ICk7XG5cblx0fSxcblxuXHRwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnNrZWxldG9uLnBvc2UoKTtcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZVNraW5XZWlnaHRzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgc2NhbGUsIGk7XG5cblx0XHRpZiAoIHRoaXMuZ2VvbWV0cnkgJiYgdGhpcy5nZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IHRoaXMuZ2VvbWV0cnkuc2tpbldlaWdodHMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBzdyA9IHRoaXMuZ2VvbWV0cnkuc2tpbldlaWdodHNbIGkgXTtcblxuXHRcdFx0XHRzY2FsZSA9IDEuMCAvIHN3Lm1hbmhhdHRhbkxlbmd0aCgpO1xuXG5cdFx0XHRcdGlmICggc2NhbGUgIT09IEluZmluaXR5ICkge1xuXG5cdFx0XHRcdFx0c3cubXVsdGlwbHlTY2FsYXIoIHNjYWxlICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHN3LnNldCggMSwgMCwgMCwgMCApOyAvLyBkbyBzb21ldGhpbmcgcmVhc29uYWJsZVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggdGhpcy5nZW9tZXRyeSAmJiB0aGlzLmdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdHZhciB2ZWMgPSBuZXcgVmVjdG9yNCgpO1xuXG5cdFx0XHR2YXIgc2tpbldlaWdodCA9IHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5za2luV2VpZ2h0O1xuXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IHNraW5XZWlnaHQuY291bnQ7IGkgKysgKSB7XG5cblx0XHRcdFx0dmVjLnggPSBza2luV2VpZ2h0LmdldFgoIGkgKTtcblx0XHRcdFx0dmVjLnkgPSBza2luV2VpZ2h0LmdldFkoIGkgKTtcblx0XHRcdFx0dmVjLnogPSBza2luV2VpZ2h0LmdldFooIGkgKTtcblx0XHRcdFx0dmVjLncgPSBza2luV2VpZ2h0LmdldFcoIGkgKTtcblxuXHRcdFx0XHRzY2FsZSA9IDEuMCAvIHZlYy5tYW5oYXR0YW5MZW5ndGgoKTtcblxuXHRcdFx0XHRpZiAoIHNjYWxlICE9PSBJbmZpbml0eSApIHtcblxuXHRcdFx0XHRcdHZlYy5tdWx0aXBseVNjYWxhciggc2NhbGUgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dmVjLnNldCggMSwgMCwgMCwgMCApOyAvLyBkbyBzb21ldGhpbmcgcmVhc29uYWJsZVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRza2luV2VpZ2h0LnNldFhZWlcoIGksIHZlYy54LCB2ZWMueSwgdmVjLnosIHZlYy53ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdHVwZGF0ZU1hdHJpeFdvcmxkOiBmdW5jdGlvbiAoIGZvcmNlICkge1xuXG5cdFx0TWVzaC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTtcblxuXHRcdGlmICggdGhpcy5iaW5kTW9kZSA9PT0gJ2F0dGFjaGVkJyApIHtcblxuXHRcdFx0dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0XHR9IGVsc2UgaWYgKCB0aGlzLmJpbmRNb2RlID09PSAnZGV0YWNoZWQnICkge1xuXG5cdFx0XHR0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmdldEludmVyc2UoIHRoaXMuYmluZE1hdHJpeCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2tpbm5lZE1lc2g6IFVucmVjb2duaXplZCBiaW5kTW9kZTogJyArIHRoaXMuYmluZE1vZGUgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuZ2VvbWV0cnksIHRoaXMubWF0ZXJpYWwgKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbGluZXdpZHRoOiA8ZmxvYXQ+LFxuICogIGxpbmVjYXA6IFwicm91bmRcIixcbiAqICBsaW5lam9pbjogXCJyb3VuZFwiXG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTGluZUJhc2ljTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMaW5lQmFzaWNNYXRlcmlhbCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTtcblxuXHR0aGlzLmxpbmV3aWR0aCA9IDE7XG5cdHRoaXMubGluZWNhcCA9ICdyb3VuZCc7XG5cdHRoaXMubGluZWpvaW4gPSAncm91bmQnO1xuXG5cdHRoaXMubGlnaHRzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5MaW5lQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcbkxpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExpbmVCYXNpY01hdGVyaWFsO1xuXG5MaW5lQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUuaXNMaW5lQmFzaWNNYXRlcmlhbCA9IHRydWU7XG5cbkxpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHR0aGlzLmxpbmV3aWR0aCA9IHNvdXJjZS5saW5ld2lkdGg7XG5cdHRoaXMubGluZWNhcCA9IHNvdXJjZS5saW5lY2FwO1xuXHR0aGlzLmxpbmVqb2luID0gc291cmNlLmxpbmVqb2luO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gTGluZSggZ2VvbWV0cnksIG1hdGVyaWFsLCBtb2RlICkge1xuXG5cdGlmICggbW9kZSA9PT0gMSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmU6IHBhcmFtZXRlciBUSFJFRS5MaW5lUGllY2VzIG5vIGxvbmdlciBzdXBwb3J0ZWQuIENyZWF0ZWQgVEhSRUUuTGluZVNlZ21lbnRzIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiBuZXcgTGluZVNlZ21lbnRzKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHR9XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMaW5lJztcblxuXHR0aGlzLmdlb21ldHJ5ID0gZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCA/IGdlb21ldHJ5IDogbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbCAhPT0gdW5kZWZpbmVkID8gbWF0ZXJpYWwgOiBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZiB9ICk7XG5cbn1cblxuTGluZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBMaW5lLFxuXG5cdGlzTGluZTogdHJ1ZSxcblxuXHRjb21wdXRlTGluZURpc3RhbmNlczogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgc3RhcnQgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBlbmQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNvbXB1dGVMaW5lRGlzdGFuY2VzKCkge1xuXG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0Ly8gd2UgYXNzdW1lIG5vbi1pbmRleGVkIGdlb21ldHJ5XG5cblx0XHRcdFx0aWYgKCBnZW9tZXRyeS5pbmRleCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHRcdHZhciBwb3NpdGlvbkF0dHJpYnV0ZSA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0XHRcdFx0dmFyIGxpbmVEaXN0YW5jZXMgPSBbIDAgXTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMSwgbCA9IHBvc2l0aW9uQXR0cmlidXRlLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0c3RhcnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgLSAxICk7XG5cdFx0XHRcdFx0XHRlbmQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgKTtcblxuXHRcdFx0XHRcdFx0bGluZURpc3RhbmNlc1sgaSBdID0gbGluZURpc3RhbmNlc1sgaSAtIDEgXTtcblx0XHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSArPSBzdGFydC5kaXN0YW5jZVRvKCBlbmQgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2xpbmVEaXN0YW5jZScsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBsaW5lRGlzdGFuY2VzLCAxICkgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGluZS5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0XHR2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlcztcblx0XHRcdFx0dmFyIGxpbmVEaXN0YW5jZXMgPSBnZW9tZXRyeS5saW5lRGlzdGFuY2VzO1xuXG5cdFx0XHRcdGxpbmVEaXN0YW5jZXNbIDAgXSA9IDA7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gdmVydGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSA9IGxpbmVEaXN0YW5jZXNbIGkgLSAxIF07XG5cdFx0XHRcdFx0bGluZURpc3RhbmNlc1sgaSBdICs9IHZlcnRpY2VzWyBpIC0gMSBdLmRpc3RhbmNlVG8oIHZlcnRpY2VzWyBpIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdHJheWNhc3Q6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGludmVyc2VNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHRcdHZhciByYXkgPSBuZXcgUmF5KCk7XG5cdFx0dmFyIHNwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7XG5cblx0XHRcdHZhciBwcmVjaXNpb24gPSByYXljYXN0ZXIubGluZVByZWNpc2lvbjtcblx0XHRcdHZhciBwcmVjaXNpb25TcSA9IHByZWNpc2lvbiAqIHByZWNpc2lvbjtcblxuXHRcdFx0dmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblx0XHRcdHZhciBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7XG5cblx0XHRcdC8vIENoZWNraW5nIGJvdW5kaW5nU3BoZXJlIGRpc3RhbmNlIHRvIHJheVxuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRcdHNwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApO1xuXHRcdFx0c3BoZXJlLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTtcblxuXHRcdFx0aWYgKCByYXljYXN0ZXIucmF5LmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdFx0Ly9cblxuXHRcdFx0aW52ZXJzZU1hdHJpeC5nZXRJbnZlcnNlKCBtYXRyaXhXb3JsZCApO1xuXHRcdFx0cmF5LmNvcHkoIHJheWNhc3Rlci5yYXkgKS5hcHBseU1hdHJpeDQoIGludmVyc2VNYXRyaXggKTtcblxuXHRcdFx0dmFyIHZTdGFydCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHR2YXIgdkVuZCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHR2YXIgaW50ZXJTZWdtZW50ID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdHZhciBpbnRlclJheSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHR2YXIgc3RlcCA9ICggdGhpcyAmJiB0aGlzLmlzTGluZVNlZ21lbnRzICkgPyAyIDogMTtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRcdHZhciBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdFx0XHR2YXIgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XG5cdFx0XHRcdHZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xuXG5cdFx0XHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHR2YXIgaW5kaWNlcyA9IGluZGV4LmFycmF5O1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gaW5kaWNlcy5sZW5ndGggLSAxOyBpIDwgbDsgaSArPSBzdGVwICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgYSA9IGluZGljZXNbIGkgXTtcblx0XHRcdFx0XHRcdHZhciBiID0gaW5kaWNlc1sgaSArIDEgXTtcblxuXHRcdFx0XHRcdFx0dlN0YXJ0LmZyb21BcnJheSggcG9zaXRpb25zLCBhICogMyApO1xuXHRcdFx0XHRcdFx0dkVuZC5mcm9tQXJyYXkoIHBvc2l0aW9ucywgYiAqIDMgKTtcblxuXHRcdFx0XHRcdFx0dmFyIGRpc3RTcSA9IHJheS5kaXN0YW5jZVNxVG9TZWdtZW50KCB2U3RhcnQsIHZFbmQsIGludGVyUmF5LCBpbnRlclNlZ21lbnQgKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBkaXN0U3EgPiBwcmVjaXNpb25TcSApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0XHRpbnRlclJheS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKTsgLy9Nb3ZlIGJhY2sgdG8gd29ybGQgc3BhY2UgZm9yIGRpc3RhbmNlIGNhbGN1bGF0aW9uXG5cblx0XHRcdFx0XHRcdHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIGludGVyUmF5ICk7XG5cblx0XHRcdFx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0XHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0XHRcdFx0XHQvLyBXaGF0IGRvIHdlIHdhbnQ/IGludGVyc2VjdGlvbiBwb2ludCBvbiB0aGUgcmF5IG9yIG9uIHRoZSBzZWdtZW50Pz9cblx0XHRcdFx0XHRcdFx0Ly8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICksXG5cdFx0XHRcdFx0XHRcdHBvaW50OiBpbnRlclNlZ21lbnQuY2xvbmUoKS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKSxcblx0XHRcdFx0XHRcdFx0aW5kZXg6IGksXG5cdFx0XHRcdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdFx0XHRcdGZhY2VJbmRleDogbnVsbCxcblx0XHRcdFx0XHRcdFx0b2JqZWN0OiB0aGlzXG5cblx0XHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9zaXRpb25zLmxlbmd0aCAvIDMgLSAxOyBpIDwgbDsgaSArPSBzdGVwICkge1xuXG5cdFx0XHRcdFx0XHR2U3RhcnQuZnJvbUFycmF5KCBwb3NpdGlvbnMsIDMgKiBpICk7XG5cdFx0XHRcdFx0XHR2RW5kLmZyb21BcnJheSggcG9zaXRpb25zLCAzICogaSArIDMgKTtcblxuXHRcdFx0XHRcdFx0dmFyIGRpc3RTcSA9IHJheS5kaXN0YW5jZVNxVG9TZWdtZW50KCB2U3RhcnQsIHZFbmQsIGludGVyUmF5LCBpbnRlclNlZ21lbnQgKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBkaXN0U3EgPiBwcmVjaXNpb25TcSApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0XHRpbnRlclJheS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKTsgLy9Nb3ZlIGJhY2sgdG8gd29ybGQgc3BhY2UgZm9yIGRpc3RhbmNlIGNhbGN1bGF0aW9uXG5cblx0XHRcdFx0XHRcdHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIGludGVyUmF5ICk7XG5cblx0XHRcdFx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0XHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0XHRcdFx0XHQvLyBXaGF0IGRvIHdlIHdhbnQ/IGludGVyc2VjdGlvbiBwb2ludCBvbiB0aGUgcmF5IG9yIG9uIHRoZSBzZWdtZW50Pz9cblx0XHRcdFx0XHRcdFx0Ly8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICksXG5cdFx0XHRcdFx0XHRcdHBvaW50OiBpbnRlclNlZ21lbnQuY2xvbmUoKS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKSxcblx0XHRcdFx0XHRcdFx0aW5kZXg6IGksXG5cdFx0XHRcdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdFx0XHRcdGZhY2VJbmRleDogbnVsbCxcblx0XHRcdFx0XHRcdFx0b2JqZWN0OiB0aGlzXG5cblx0XHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0dmFyIHZlcnRpY2VzID0gZ2VvbWV0cnkudmVydGljZXM7XG5cdFx0XHRcdHZhciBuYlZlcnRpY2VzID0gdmVydGljZXMubGVuZ3RoO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IG5iVmVydGljZXMgLSAxOyBpICs9IHN0ZXAgKSB7XG5cblx0XHRcdFx0XHR2YXIgZGlzdFNxID0gcmF5LmRpc3RhbmNlU3FUb1NlZ21lbnQoIHZlcnRpY2VzWyBpIF0sIHZlcnRpY2VzWyBpICsgMSBdLCBpbnRlclJheSwgaW50ZXJTZWdtZW50ICk7XG5cblx0XHRcdFx0XHRpZiAoIGRpc3RTcSA+IHByZWNpc2lvblNxICkgY29udGludWU7XG5cblx0XHRcdFx0XHRpbnRlclJheS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKTsgLy9Nb3ZlIGJhY2sgdG8gd29ybGQgc3BhY2UgZm9yIGRpc3RhbmNlIGNhbGN1bGF0aW9uXG5cblx0XHRcdFx0XHR2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlclJheSApO1xuXG5cdFx0XHRcdFx0aWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0XHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcblx0XHRcdFx0XHRcdC8vIFdoYXQgZG8gd2Ugd2FudD8gaW50ZXJzZWN0aW9uIHBvaW50IG9uIHRoZSByYXkgb3Igb24gdGhlIHNlZ21lbnQ/P1xuXHRcdFx0XHRcdFx0Ly8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICksXG5cdFx0XHRcdFx0XHRwb2ludDogaW50ZXJTZWdtZW50LmNsb25lKCkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICksXG5cdFx0XHRcdFx0XHRpbmRleDogaSxcblx0XHRcdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdFx0XHRmYWNlSW5kZXg6IG51bGwsXG5cdFx0XHRcdFx0XHRvYmplY3Q6IHRoaXNcblxuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSgpICksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5nZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIExpbmVTZWdtZW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdExpbmUuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmVTZWdtZW50cyc7XG5cbn1cblxuTGluZVNlZ21lbnRzLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpbmUucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTGluZVNlZ21lbnRzLFxuXG5cdGlzTGluZVNlZ21lbnRzOiB0cnVlLFxuXG5cdGNvbXB1dGVMaW5lRGlzdGFuY2VzOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBzdGFydCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGVuZCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSB7XG5cblx0XHRcdHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHQvLyB3ZSBhc3N1bWUgbm9uLWluZGV4ZWQgZ2VvbWV0cnlcblxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5LmluZGV4ID09PSBudWxsICkge1xuXG5cdFx0XHRcdFx0dmFyIHBvc2l0aW9uQXR0cmlidXRlID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblx0XHRcdFx0XHR2YXIgbGluZURpc3RhbmNlcyA9IFtdO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9zaXRpb25BdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICs9IDIgKSB7XG5cblx0XHRcdFx0XHRcdHN0YXJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBpICk7XG5cdFx0XHRcdFx0XHRlbmQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgKyAxICk7XG5cblx0XHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSA9ICggaSA9PT0gMCApID8gMCA6IGxpbmVEaXN0YW5jZXNbIGkgLSAxIF07XG5cdFx0XHRcdFx0XHRsaW5lRGlzdGFuY2VzWyBpICsgMSBdID0gbGluZURpc3RhbmNlc1sgaSBdICsgc3RhcnQuZGlzdGFuY2VUbyggZW5kICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdsaW5lRGlzdGFuY2UnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbGluZURpc3RhbmNlcywgMSApICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmVTZWdtZW50cy5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0XHR2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlcztcblx0XHRcdFx0dmFyIGxpbmVEaXN0YW5jZXMgPSBnZW9tZXRyeS5saW5lRGlzdGFuY2VzO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKz0gMiApIHtcblxuXHRcdFx0XHRcdHN0YXJ0LmNvcHkoIHZlcnRpY2VzWyBpIF0gKTtcblx0XHRcdFx0XHRlbmQuY29weSggdmVydGljZXNbIGkgKyAxIF0gKTtcblxuXHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSA9ICggaSA9PT0gMCApID8gMCA6IGxpbmVEaXN0YW5jZXNbIGkgLSAxIF07XG5cdFx0XHRcdFx0bGluZURpc3RhbmNlc1sgaSArIDEgXSA9IGxpbmVEaXN0YW5jZXNbIGkgXSArIHN0YXJ0LmRpc3RhbmNlVG8oIGVuZCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpIClcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWdyZXRlciAvIGh0dHA6Ly9naXRodWIuY29tL21ncmV0ZXJcbiAqL1xuXG5mdW5jdGlvbiBMaW5lTG9vcCggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdExpbmUuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmVMb29wJztcblxufVxuXG5MaW5lTG9vcC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaW5lLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IExpbmVMb29wLFxuXG5cdGlzTGluZUxvb3A6IHRydWUsXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgc2l6ZTogPGZsb2F0PixcbiAqICBzaXplQXR0ZW51YXRpb246IDxib29sPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIFBvaW50c01hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUG9pbnRzTWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7XG5cblx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdHRoaXMuc2l6ZSA9IDE7XG5cdHRoaXMuc2l6ZUF0dGVudWF0aW9uID0gdHJ1ZTtcblxuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuUG9pbnRzTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5Qb2ludHNNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQb2ludHNNYXRlcmlhbDtcblxuUG9pbnRzTWF0ZXJpYWwucHJvdG90eXBlLmlzUG9pbnRzTWF0ZXJpYWwgPSB0cnVlO1xuXG5Qb2ludHNNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMuc2l6ZSA9IHNvdXJjZS5zaXplO1xuXHR0aGlzLnNpemVBdHRlbnVhdGlvbiA9IHNvdXJjZS5zaXplQXR0ZW51YXRpb247XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBQb2ludHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BvaW50cyc7XG5cblx0dGhpcy5nZW9tZXRyeSA9IGdlb21ldHJ5ICE9PSB1bmRlZmluZWQgPyBnZW9tZXRyeSA6IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHR0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWwgIT09IHVuZGVmaW5lZCA/IG1hdGVyaWFsIDogbmV3IFBvaW50c01hdGVyaWFsKCB7IGNvbG9yOiBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmYgfSApO1xuXG59XG5cblBvaW50cy5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBQb2ludHMsXG5cblx0aXNQb2ludHM6IHRydWUsXG5cblx0cmF5Y2FzdDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaW52ZXJzZU1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdFx0dmFyIHJheSA9IG5ldyBSYXkoKTtcblx0XHR2YXIgc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcblxuXHRcdFx0dmFyIG9iamVjdCA9IHRoaXM7XG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXHRcdFx0dmFyIG1hdHJpeFdvcmxkID0gdGhpcy5tYXRyaXhXb3JsZDtcblx0XHRcdHZhciB0aHJlc2hvbGQgPSByYXljYXN0ZXIucGFyYW1zLlBvaW50cy50aHJlc2hvbGQ7XG5cblx0XHRcdC8vIENoZWNraW5nIGJvdW5kaW5nU3BoZXJlIGRpc3RhbmNlIHRvIHJheVxuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRcdHNwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApO1xuXHRcdFx0c3BoZXJlLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTtcblx0XHRcdHNwaGVyZS5yYWRpdXMgKz0gdGhyZXNob2xkO1xuXG5cdFx0XHRpZiAoIHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0XHQvL1xuXG5cdFx0XHRpbnZlcnNlTWF0cml4LmdldEludmVyc2UoIG1hdHJpeFdvcmxkICk7XG5cdFx0XHRyYXkuY29weSggcmF5Y2FzdGVyLnJheSApLmFwcGx5TWF0cml4NCggaW52ZXJzZU1hdHJpeCApO1xuXG5cdFx0XHR2YXIgbG9jYWxUaHJlc2hvbGQgPSB0aHJlc2hvbGQgLyAoICggdGhpcy5zY2FsZS54ICsgdGhpcy5zY2FsZS55ICsgdGhpcy5zY2FsZS56ICkgLyAzICk7XG5cdFx0XHR2YXIgbG9jYWxUaHJlc2hvbGRTcSA9IGxvY2FsVGhyZXNob2xkICogbG9jYWxUaHJlc2hvbGQ7XG5cdFx0XHR2YXIgcG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0dmFyIGludGVyc2VjdFBvaW50ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0ZnVuY3Rpb24gdGVzdFBvaW50KCBwb2ludCwgaW5kZXggKSB7XG5cblx0XHRcdFx0dmFyIHJheVBvaW50RGlzdGFuY2VTcSA9IHJheS5kaXN0YW5jZVNxVG9Qb2ludCggcG9pbnQgKTtcblxuXHRcdFx0XHRpZiAoIHJheVBvaW50RGlzdGFuY2VTcSA8IGxvY2FsVGhyZXNob2xkU3EgKSB7XG5cblx0XHRcdFx0XHRyYXkuY2xvc2VzdFBvaW50VG9Qb2ludCggcG9pbnQsIGludGVyc2VjdFBvaW50ICk7XG5cdFx0XHRcdFx0aW50ZXJzZWN0UG9pbnQuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdFx0dmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggaW50ZXJzZWN0UG9pbnQgKTtcblxuXHRcdFx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSByZXR1cm47XG5cblx0XHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIHtcblxuXHRcdFx0XHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0XHRcdFx0ZGlzdGFuY2VUb1JheTogTWF0aC5zcXJ0KCByYXlQb2ludERpc3RhbmNlU3EgKSxcblx0XHRcdFx0XHRcdHBvaW50OiBpbnRlcnNlY3RQb2ludC5jbG9uZSgpLFxuXHRcdFx0XHRcdFx0aW5kZXg6IGluZGV4LFxuXHRcdFx0XHRcdFx0ZmFjZTogbnVsbCxcblx0XHRcdFx0XHRcdG9iamVjdDogb2JqZWN0XG5cblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHR2YXIgaW5kZXggPSBnZW9tZXRyeS5pbmRleDtcblx0XHRcdFx0dmFyIGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuXHRcdFx0XHR2YXIgcG9zaXRpb25zID0gYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtcblxuXHRcdFx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdFx0dmFyIGluZGljZXMgPSBpbmRleC5hcnJheTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBpbmRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgYSA9IGluZGljZXNbIGkgXTtcblxuXHRcdFx0XHRcdFx0cG9zaXRpb24uZnJvbUFycmF5KCBwb3NpdGlvbnMsIGEgKiAzICk7XG5cblx0XHRcdFx0XHRcdHRlc3RQb2ludCggcG9zaXRpb24sIGEgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9zaXRpb25zLmxlbmd0aCAvIDM7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRwb3NpdGlvbi5mcm9tQXJyYXkoIHBvc2l0aW9ucywgaSAqIDMgKTtcblxuXHRcdFx0XHRcdFx0dGVzdFBvaW50KCBwb3NpdGlvbiwgaSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlcztcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB2ZXJ0aWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dGVzdFBvaW50KCB2ZXJ0aWNlc1sgaSBdLCBpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuZ2VvbWV0cnksIHRoaXMubWF0ZXJpYWwgKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBHcm91cCgpIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0dyb3VwJztcblxufVxuXG5Hcm91cC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBHcm91cCxcblxuXHRpc0dyb3VwOiB0cnVlXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFZpZGVvVGV4dHVyZSggdmlkZW8sIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApIHtcblxuXHRUZXh0dXJlLmNhbGwoIHRoaXMsIHZpZGVvLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKTtcblxuXHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXG59XG5cblZpZGVvVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFZpZGVvVGV4dHVyZSxcblxuXHRpc1ZpZGVvVGV4dHVyZTogdHJ1ZSxcblxuXHR1cGRhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2aWRlbyA9IHRoaXMuaW1hZ2U7XG5cblx0XHRpZiAoIHZpZGVvLnJlYWR5U3RhdGUgPj0gdmlkZW8uSEFWRV9DVVJSRU5UX0RBVEEgKSB7XG5cblx0XHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gQ29tcHJlc3NlZFRleHR1cmUoIG1pcG1hcHMsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgYW5pc290cm9weSwgZW5jb2RpbmcgKSB7XG5cblx0VGV4dHVyZS5jYWxsKCB0aGlzLCBudWxsLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGVuY29kaW5nICk7XG5cblx0dGhpcy5pbWFnZSA9IHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9O1xuXHR0aGlzLm1pcG1hcHMgPSBtaXBtYXBzO1xuXG5cdC8vIG5vIGZsaXBwaW5nIGZvciBjdWJlIHRleHR1cmVzXG5cdC8vIChhbHNvIGZsaXBwaW5nIGRvZXNuJ3Qgd29yayBmb3IgY29tcHJlc3NlZCB0ZXh0dXJlcyApXG5cblx0dGhpcy5mbGlwWSA9IGZhbHNlO1xuXG5cdC8vIGNhbid0IGdlbmVyYXRlIG1pcG1hcHMgZm9yIGNvbXByZXNzZWQgdGV4dHVyZXNcblx0Ly8gbWlwcyBtdXN0IGJlIGVtYmVkZGVkIGluIEREUyBmaWxlc1xuXG5cdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG5cbn1cblxuQ29tcHJlc3NlZFRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTtcbkNvbXByZXNzZWRUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvbXByZXNzZWRUZXh0dXJlO1xuXG5Db21wcmVzc2VkVGV4dHVyZS5wcm90b3R5cGUuaXNDb21wcmVzc2VkVGV4dHVyZSA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciBNYXR0IERlc0xhdXJpZXJzIC8gQG1hdHRkZXNsXG4gKiBAYXV0aG9yIGF0aXggLyBhcnRodXJzaWxiZXIuZGVcbiAqL1xuXG5mdW5jdGlvbiBEZXB0aFRleHR1cmUoIHdpZHRoLCBoZWlnaHQsIHR5cGUsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGFuaXNvdHJvcHksIGZvcm1hdCApIHtcblxuXHRmb3JtYXQgPSBmb3JtYXQgIT09IHVuZGVmaW5lZCA/IGZvcm1hdCA6IERlcHRoRm9ybWF0O1xuXG5cdGlmICggZm9ybWF0ICE9PSBEZXB0aEZvcm1hdCAmJiBmb3JtYXQgIT09IERlcHRoU3RlbmNpbEZvcm1hdCApIHtcblxuXHRcdHRocm93IG5ldyBFcnJvciggJ0RlcHRoVGV4dHVyZSBmb3JtYXQgbXVzdCBiZSBlaXRoZXIgVEhSRUUuRGVwdGhGb3JtYXQgb3IgVEhSRUUuRGVwdGhTdGVuY2lsRm9ybWF0JyApO1xuXG5cdH1cblxuXHRpZiAoIHR5cGUgPT09IHVuZGVmaW5lZCAmJiBmb3JtYXQgPT09IERlcHRoRm9ybWF0ICkgdHlwZSA9IFVuc2lnbmVkU2hvcnRUeXBlO1xuXHRpZiAoIHR5cGUgPT09IHVuZGVmaW5lZCAmJiBmb3JtYXQgPT09IERlcHRoU3RlbmNpbEZvcm1hdCApIHR5cGUgPSBVbnNpZ25lZEludDI0OFR5cGU7XG5cblx0VGV4dHVyZS5jYWxsKCB0aGlzLCBudWxsLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKTtcblxuXHR0aGlzLmltYWdlID0geyB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07XG5cblx0dGhpcy5tYWdGaWx0ZXIgPSBtYWdGaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1hZ0ZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7XG5cdHRoaXMubWluRmlsdGVyID0gbWluRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtaW5GaWx0ZXIgOiBOZWFyZXN0RmlsdGVyO1xuXG5cdHRoaXMuZmxpcFkgPSBmYWxzZTtcblx0dGhpcy5nZW5lcmF0ZU1pcG1hcHNcdD0gZmFsc2U7XG5cbn1cblxuRGVwdGhUZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBlICk7XG5EZXB0aFRleHR1cmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRGVwdGhUZXh0dXJlO1xuRGVwdGhUZXh0dXJlLnByb3RvdHlwZS5pc0RlcHRoVGV4dHVyZSA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuZnVuY3Rpb24gV2lyZWZyYW1lR2VvbWV0cnkoIGdlb21ldHJ5ICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnV2lyZWZyYW1lR2VvbWV0cnknO1xuXG5cdC8vIGJ1ZmZlclxuXG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgaSwgaiwgbCwgbywgb2w7XG5cdHZhciBlZGdlID0gWyAwLCAwIF0sIGVkZ2VzID0ge30sIGUsIGVkZ2UxLCBlZGdlMjtcblx0dmFyIGtleSwga2V5cyA9IFsgJ2EnLCAnYicsICdjJyBdO1xuXHR2YXIgdmVydGV4O1xuXG5cdC8vIGRpZmZlcmVudCBsb2dpYyBmb3IgR2VvbWV0cnkgYW5kIEJ1ZmZlckdlb21ldHJ5XG5cblx0aWYgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0Ly8gY3JlYXRlIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBhbGwgZWRnZXMgd2l0aG91dCBkdXBsaWNhdGVzXG5cblx0XHR2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlcztcblxuXHRcdGZvciAoIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSBmYWNlc1sgaSBdO1xuXG5cdFx0XHRmb3IgKCBqID0gMDsgaiA8IDM7IGogKysgKSB7XG5cblx0XHRcdFx0ZWRnZTEgPSBmYWNlWyBrZXlzWyBqIF0gXTtcblx0XHRcdFx0ZWRnZTIgPSBmYWNlWyBrZXlzWyAoIGogKyAxICkgJSAzIF0gXTtcblx0XHRcdFx0ZWRnZVsgMCBdID0gTWF0aC5taW4oIGVkZ2UxLCBlZGdlMiApOyAvLyBzb3J0aW5nIHByZXZlbnRzIGR1cGxpY2F0ZXNcblx0XHRcdFx0ZWRnZVsgMSBdID0gTWF0aC5tYXgoIGVkZ2UxLCBlZGdlMiApO1xuXG5cdFx0XHRcdGtleSA9IGVkZ2VbIDAgXSArICcsJyArIGVkZ2VbIDEgXTtcblxuXHRcdFx0XHRpZiAoIGVkZ2VzWyBrZXkgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0ZWRnZXNbIGtleSBdID0geyBpbmRleDE6IGVkZ2VbIDAgXSwgaW5kZXgyOiBlZGdlWyAxIF0gfTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzXG5cblx0XHRmb3IgKCBrZXkgaW4gZWRnZXMgKSB7XG5cblx0XHRcdGUgPSBlZGdlc1sga2V5IF07XG5cblx0XHRcdHZlcnRleCA9IGdlb21ldHJ5LnZlcnRpY2VzWyBlLmluZGV4MSBdO1xuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHR2ZXJ0ZXggPSBnZW9tZXRyeS52ZXJ0aWNlc1sgZS5pbmRleDIgXTtcblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdH1cblxuXHR9IGVsc2UgaWYgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIHBvc2l0aW9uLCBpbmRpY2VzLCBncm91cHM7XG5cdFx0dmFyIGdyb3VwLCBzdGFydCwgY291bnQ7XG5cdFx0dmFyIGluZGV4MSwgaW5kZXgyO1xuXG5cdFx0dmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdGlmICggZ2VvbWV0cnkuaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdC8vIGluZGV4ZWQgQnVmZmVyR2VvbWV0cnlcblxuXHRcdFx0cG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHRcdFx0aW5kaWNlcyA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdFx0Z3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xuXG5cdFx0XHRpZiAoIGdyb3Vwcy5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdFx0Z3JvdXBzID0gWyB7IHN0YXJ0OiAwLCBjb3VudDogaW5kaWNlcy5jb3VudCwgbWF0ZXJpYWxJbmRleDogMCB9IF07XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gY3JlYXRlIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBhbGwgZWdlcyB3aXRob3V0IGR1cGxpY2F0ZXNcblxuXHRcdFx0Zm9yICggbyA9IDAsIG9sID0gZ3JvdXBzLmxlbmd0aDsgbyA8IG9sOyArKyBvICkge1xuXG5cdFx0XHRcdGdyb3VwID0gZ3JvdXBzWyBvIF07XG5cblx0XHRcdFx0c3RhcnQgPSBncm91cC5zdGFydDtcblx0XHRcdFx0Y291bnQgPSBncm91cC5jb3VudDtcblxuXHRcdFx0XHRmb3IgKCBpID0gc3RhcnQsIGwgPSAoIHN0YXJ0ICsgY291bnQgKTsgaSA8IGw7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRcdGZvciAoIGogPSAwOyBqIDwgMzsgaiArKyApIHtcblxuXHRcdFx0XHRcdFx0ZWRnZTEgPSBpbmRpY2VzLmdldFgoIGkgKyBqICk7XG5cdFx0XHRcdFx0XHRlZGdlMiA9IGluZGljZXMuZ2V0WCggaSArICggaiArIDEgKSAlIDMgKTtcblx0XHRcdFx0XHRcdGVkZ2VbIDAgXSA9IE1hdGgubWluKCBlZGdlMSwgZWRnZTIgKTsgLy8gc29ydGluZyBwcmV2ZW50cyBkdXBsaWNhdGVzXG5cdFx0XHRcdFx0XHRlZGdlWyAxIF0gPSBNYXRoLm1heCggZWRnZTEsIGVkZ2UyICk7XG5cblx0XHRcdFx0XHRcdGtleSA9IGVkZ2VbIDAgXSArICcsJyArIGVkZ2VbIDEgXTtcblxuXHRcdFx0XHRcdFx0aWYgKCBlZGdlc1sga2V5IF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRlZGdlc1sga2V5IF0gPSB7IGluZGV4MTogZWRnZVsgMCBdLCBpbmRleDI6IGVkZ2VbIDEgXSB9O1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzXG5cblx0XHRcdGZvciAoIGtleSBpbiBlZGdlcyApIHtcblxuXHRcdFx0XHRlID0gZWRnZXNbIGtleSBdO1xuXG5cdFx0XHRcdHZlcnRleC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgZS5pbmRleDEgKTtcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdHZlcnRleC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgZS5pbmRleDIgKTtcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeVxuXG5cdFx0XHRwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRcdGZvciAoIGkgPSAwLCBsID0gKCBwb3NpdGlvbi5jb3VudCAvIDMgKTsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0Zm9yICggaiA9IDA7IGogPCAzOyBqICsrICkge1xuXG5cdFx0XHRcdFx0Ly8gdGhyZWUgZWRnZXMgcGVyIHRyaWFuZ2xlLCBhbiBlZGdlIGlzIHJlcHJlc2VudGVkIGFzIChpbmRleDEsIGluZGV4Milcblx0XHRcdFx0XHQvLyBlLmcuIHRoZSBmaXJzdCB0cmlhbmdsZSBoYXMgdGhlIGZvbGxvd2luZyBlZGdlczogKDAsMSksKDEsMiksKDIsMClcblxuXHRcdFx0XHRcdGluZGV4MSA9IDMgKiBpICsgajtcblx0XHRcdFx0XHR2ZXJ0ZXguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGluZGV4MSApO1xuXHRcdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0XHRcdGluZGV4MiA9IDMgKiBpICsgKCAoIGogKyAxICkgJSAzICk7XG5cdFx0XHRcdFx0dmVydGV4LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBpbmRleDIgKTtcblx0XHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cbn1cblxuV2lyZWZyYW1lR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5XaXJlZnJhbWVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBXaXJlZnJhbWVHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwczovL2dpdGh1Yi5jb20veno4NVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqXG4gKiBQYXJhbWV0cmljIFN1cmZhY2VzIEdlb21ldHJ5XG4gKiBiYXNlZCBvbiB0aGUgYnJpbGxpYW50IGFydGljbGUgYnkgQHByaWRlb3V0IGh0dHA6Ly9wcmlkZW91dC5uZXQvYmxvZy8/cD00NFxuICovXG5cbi8vIFBhcmFtZXRyaWNHZW9tZXRyeVxuXG5mdW5jdGlvbiBQYXJhbWV0cmljR2VvbWV0cnkoIGZ1bmMsIHNsaWNlcywgc3RhY2tzICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUGFyYW1ldHJpY0dlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0ZnVuYzogZnVuYyxcblx0XHRzbGljZXM6IHNsaWNlcyxcblx0XHRzdGFja3M6IHN0YWNrc1xuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5KCBmdW5jLCBzbGljZXMsIHN0YWNrcyApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblBhcmFtZXRyaWNHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblBhcmFtZXRyaWNHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQYXJhbWV0cmljR2VvbWV0cnk7XG5cbi8vIFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnkoIGZ1bmMsIHNsaWNlcywgc3RhY2tzICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0ZnVuYzogZnVuYyxcblx0XHRzbGljZXM6IHNsaWNlcyxcblx0XHRzdGFja3M6IHN0YWNrc1xuXHR9O1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdHZhciBFUFMgPSAwLjAwMDAxO1xuXG5cdHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBwMCA9IG5ldyBWZWN0b3IzKCksIHAxID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHB1ID0gbmV3IFZlY3RvcjMoKSwgcHYgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBpLCBqO1xuXG5cdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHR2YXIgc2xpY2VDb3VudCA9IHNsaWNlcyArIDE7XG5cblx0Zm9yICggaSA9IDA7IGkgPD0gc3RhY2tzOyBpICsrICkge1xuXG5cdFx0dmFyIHYgPSBpIC8gc3RhY2tzO1xuXG5cdFx0Zm9yICggaiA9IDA7IGogPD0gc2xpY2VzOyBqICsrICkge1xuXG5cdFx0XHR2YXIgdSA9IGogLyBzbGljZXM7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHRmdW5jKCB1LCB2LCBwMCApO1xuXHRcdFx0dmVydGljZXMucHVzaCggcDAueCwgcDAueSwgcDAueiApO1xuXG5cdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0Ly8gYXBwcm94aW1hdGUgdGFuZ2VudCB2ZWN0b3JzIHZpYSBmaW5pdGUgZGlmZmVyZW5jZXNcblxuXHRcdFx0aWYgKCB1IC0gRVBTID49IDAgKSB7XG5cblx0XHRcdFx0ZnVuYyggdSAtIEVQUywgdiwgcDEgKTtcblx0XHRcdFx0cHUuc3ViVmVjdG9ycyggcDAsIHAxICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0ZnVuYyggdSArIEVQUywgdiwgcDEgKTtcblx0XHRcdFx0cHUuc3ViVmVjdG9ycyggcDEsIHAwICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB2IC0gRVBTID49IDAgKSB7XG5cblx0XHRcdFx0ZnVuYyggdSwgdiAtIEVQUywgcDEgKTtcblx0XHRcdFx0cHYuc3ViVmVjdG9ycyggcDAsIHAxICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0ZnVuYyggdSwgdiArIEVQUywgcDEgKTtcblx0XHRcdFx0cHYuc3ViVmVjdG9ycyggcDEsIHAwICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gY3Jvc3MgcHJvZHVjdCBvZiB0YW5nZW50IHZlY3RvcnMgcmV0dXJucyBzdXJmYWNlIG5vcm1hbFxuXG5cdFx0XHRub3JtYWwuY3Jvc3NWZWN0b3JzKCBwdSwgcHYgKS5ub3JtYWxpemUoKTtcblx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1dnMucHVzaCggdSwgdiApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBnZW5lcmF0ZSBpbmRpY2VzXG5cblx0Zm9yICggaSA9IDA7IGkgPCBzdGFja3M7IGkgKysgKSB7XG5cblx0XHRmb3IgKCBqID0gMDsgaiA8IHNsaWNlczsgaiArKyApIHtcblxuXHRcdFx0dmFyIGEgPSBpICogc2xpY2VDb3VudCArIGo7XG5cdFx0XHR2YXIgYiA9IGkgKiBzbGljZUNvdW50ICsgaiArIDE7XG5cdFx0XHR2YXIgYyA9ICggaSArIDEgKSAqIHNsaWNlQ291bnQgKyBqICsgMTtcblx0XHRcdHZhciBkID0gKCBpICsgMSApICogc2xpY2VDb3VudCArIGo7XG5cblx0XHRcdC8vIGZhY2VzIG9uZSBhbmQgdHdvXG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxufVxuXG5QYXJhbWV0cmljQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5QYXJhbWV0cmljQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgY2xvY2t3b3JrZ2VlayAvIGh0dHBzOi8vZ2l0aHViLmNvbS9jbG9ja3dvcmtnZWVrXG4gKiBAYXV0aG9yIHRpbW90aHlwcmF0bGV5IC8gaHR0cHM6Ly9naXRodWIuY29tL3RpbW90aHlwcmF0bGV5XG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gUG9seWhlZHJvbkdlb21ldHJ5XG5cbmZ1bmN0aW9uIFBvbHloZWRyb25HZW9tZXRyeSggdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUG9seWhlZHJvbkdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0dmVydGljZXM6IHZlcnRpY2VzLFxuXHRcdGluZGljZXM6IGluZGljZXMsXG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSggdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuUG9seWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuUG9seWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBvbHloZWRyb25HZW9tZXRyeTtcblxuLy8gUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSggdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0dmVydGljZXM6IHZlcnRpY2VzLFxuXHRcdGluZGljZXM6IGluZGljZXMsXG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxuXHRyYWRpdXMgPSByYWRpdXMgfHwgMTtcblx0ZGV0YWlsID0gZGV0YWlsIHx8IDA7XG5cblx0Ly8gZGVmYXVsdCBidWZmZXIgZGF0YVxuXG5cdHZhciB2ZXJ0ZXhCdWZmZXIgPSBbXTtcblx0dmFyIHV2QnVmZmVyID0gW107XG5cblx0Ly8gdGhlIHN1YmRpdmlzaW9uIGNyZWF0ZXMgdGhlIHZlcnRleCBidWZmZXIgZGF0YVxuXG5cdHN1YmRpdmlkZSggZGV0YWlsICk7XG5cblx0Ly8gYWxsIHZlcnRpY2VzIHNob3VsZCBsaWUgb24gYSBjb25jZXB0dWFsIHNwaGVyZSB3aXRoIGEgZ2l2ZW4gcmFkaXVzXG5cblx0YXBwcGx5UmFkaXVzKCByYWRpdXMgKTtcblxuXHQvLyBmaW5hbGx5LCBjcmVhdGUgdGhlIHV2IGRhdGFcblxuXHRnZW5lcmF0ZVVWcygpO1xuXG5cdC8vIGJ1aWxkIG5vbi1pbmRleGVkIGdlb21ldHJ5XG5cblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0ZXhCdWZmZXIsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0ZXhCdWZmZXIuc2xpY2UoKSwgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZCdWZmZXIsIDIgKSApO1xuXG5cdGlmICggZGV0YWlsID09PSAwICkge1xuXG5cdFx0dGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpOyAvLyBmbGF0IG5vcm1hbHNcblxuXHR9IGVsc2Uge1xuXG5cdFx0dGhpcy5ub3JtYWxpemVOb3JtYWxzKCk7IC8vIHNtb290aCBub3JtYWxzXG5cblx0fVxuXG5cdC8vIGhlbHBlciBmdW5jdGlvbnNcblxuXHRmdW5jdGlvbiBzdWJkaXZpZGUoIGRldGFpbCApIHtcblxuXHRcdHZhciBhID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgYiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGMgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0Ly8gaXRlcmF0ZSBvdmVyIGFsbCBmYWNlcyBhbmQgYXBwbHkgYSBzdWJkaXZpc29uIHdpdGggdGhlIGdpdmVuIGRldGFpbCB2YWx1ZVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkgKz0gMyApIHtcblxuXHRcdFx0Ly8gZ2V0IHRoZSB2ZXJ0aWNlcyBvZiB0aGUgZmFjZVxuXG5cdFx0XHRnZXRWZXJ0ZXhCeUluZGV4KCBpbmRpY2VzWyBpICsgMCBdLCBhICk7XG5cdFx0XHRnZXRWZXJ0ZXhCeUluZGV4KCBpbmRpY2VzWyBpICsgMSBdLCBiICk7XG5cdFx0XHRnZXRWZXJ0ZXhCeUluZGV4KCBpbmRpY2VzWyBpICsgMiBdLCBjICk7XG5cblx0XHRcdC8vIHBlcmZvcm0gc3ViZGl2aXNpb25cblxuXHRcdFx0c3ViZGl2aWRlRmFjZSggYSwgYiwgYywgZGV0YWlsICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHN1YmRpdmlkZUZhY2UoIGEsIGIsIGMsIGRldGFpbCApIHtcblxuXHRcdHZhciBjb2xzID0gTWF0aC5wb3coIDIsIGRldGFpbCApO1xuXG5cdFx0Ly8gd2UgdXNlIHRoaXMgbXVsdGlkaW1lbnNpb25hbCBhcnJheSBhcyBhIGRhdGEgc3RydWN0dXJlIGZvciBjcmVhdGluZyB0aGUgc3ViZGl2aXNpb25cblxuXHRcdHZhciB2ID0gW107XG5cblx0XHR2YXIgaSwgajtcblxuXHRcdC8vIGNvbnN0cnVjdCBhbGwgb2YgdGhlIHZlcnRpY2VzIGZvciB0aGlzIHN1YmRpdmlzaW9uXG5cblx0XHRmb3IgKCBpID0gMDsgaSA8PSBjb2xzOyBpICsrICkge1xuXG5cdFx0XHR2WyBpIF0gPSBbXTtcblxuXHRcdFx0dmFyIGFqID0gYS5jbG9uZSgpLmxlcnAoIGMsIGkgLyBjb2xzICk7XG5cdFx0XHR2YXIgYmogPSBiLmNsb25lKCkubGVycCggYywgaSAvIGNvbHMgKTtcblxuXHRcdFx0dmFyIHJvd3MgPSBjb2xzIC0gaTtcblxuXHRcdFx0Zm9yICggaiA9IDA7IGogPD0gcm93czsgaiArKyApIHtcblxuXHRcdFx0XHRpZiAoIGogPT09IDAgJiYgaSA9PT0gY29scyApIHtcblxuXHRcdFx0XHRcdHZbIGkgXVsgaiBdID0gYWo7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHZbIGkgXVsgaiBdID0gYWouY2xvbmUoKS5sZXJwKCBiaiwgaiAvIHJvd3MgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGNvbnN0cnVjdCBhbGwgb2YgdGhlIGZhY2VzXG5cblx0XHRmb3IgKCBpID0gMDsgaSA8IGNvbHM7IGkgKysgKSB7XG5cblx0XHRcdGZvciAoIGogPSAwOyBqIDwgMiAqICggY29scyAtIGkgKSAtIDE7IGogKysgKSB7XG5cblx0XHRcdFx0dmFyIGsgPSBNYXRoLmZsb29yKCBqIC8gMiApO1xuXG5cdFx0XHRcdGlmICggaiAlIDIgPT09IDAgKSB7XG5cblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpIF1bIGsgKyAxIF0gKTtcblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpICsgMSBdWyBrIF0gKTtcblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpIF1bIGsgXSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpIF1bIGsgKyAxIF0gKTtcblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpICsgMSBdWyBrICsgMSBdICk7XG5cdFx0XHRcdFx0cHVzaFZlcnRleCggdlsgaSArIDEgXVsgayBdICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGFwcHBseVJhZGl1cyggcmFkaXVzICkge1xuXG5cdFx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHQvLyBpdGVyYXRlIG92ZXIgdGhlIGVudGlyZSBidWZmZXIgYW5kIGFwcGx5IHRoZSByYWRpdXMgdG8gZWFjaCB2ZXJ0ZXhcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHZlcnRleEJ1ZmZlci5sZW5ndGg7IGkgKz0gMyApIHtcblxuXHRcdFx0dmVydGV4LnggPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF07XG5cdFx0XHR2ZXJ0ZXgueSA9IHZlcnRleEJ1ZmZlclsgaSArIDEgXTtcblx0XHRcdHZlcnRleC56ID0gdmVydGV4QnVmZmVyWyBpICsgMiBdO1xuXG5cdFx0XHR2ZXJ0ZXgubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIHJhZGl1cyApO1xuXG5cdFx0XHR2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF0gPSB2ZXJ0ZXgueDtcblx0XHRcdHZlcnRleEJ1ZmZlclsgaSArIDEgXSA9IHZlcnRleC55O1xuXHRcdFx0dmVydGV4QnVmZmVyWyBpICsgMiBdID0gdmVydGV4Lno7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlVVZzKCkge1xuXG5cdFx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB2ZXJ0ZXhCdWZmZXIubGVuZ3RoOyBpICs9IDMgKSB7XG5cblx0XHRcdHZlcnRleC54ID0gdmVydGV4QnVmZmVyWyBpICsgMCBdO1xuXHRcdFx0dmVydGV4LnkgPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAxIF07XG5cdFx0XHR2ZXJ0ZXgueiA9IHZlcnRleEJ1ZmZlclsgaSArIDIgXTtcblxuXHRcdFx0dmFyIHUgPSBhemltdXRoKCB2ZXJ0ZXggKSAvIDIgLyBNYXRoLlBJICsgMC41O1xuXHRcdFx0dmFyIHYgPSBpbmNsaW5hdGlvbiggdmVydGV4ICkgLyBNYXRoLlBJICsgMC41O1xuXHRcdFx0dXZCdWZmZXIucHVzaCggdSwgMSAtIHYgKTtcblxuXHRcdH1cblxuXHRcdGNvcnJlY3RVVnMoKTtcblxuXHRcdGNvcnJlY3RTZWFtKCk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGNvcnJlY3RTZWFtKCkge1xuXG5cdFx0Ly8gaGFuZGxlIGNhc2Ugd2hlbiBmYWNlIHN0cmFkZGxlcyB0aGUgc2VhbSwgc2VlICMzMjY5XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB1dkJ1ZmZlci5sZW5ndGg7IGkgKz0gNiApIHtcblxuXHRcdFx0Ly8gdXYgZGF0YSBvZiBhIHNpbmdsZSBmYWNlXG5cblx0XHRcdHZhciB4MCA9IHV2QnVmZmVyWyBpICsgMCBdO1xuXHRcdFx0dmFyIHgxID0gdXZCdWZmZXJbIGkgKyAyIF07XG5cdFx0XHR2YXIgeDIgPSB1dkJ1ZmZlclsgaSArIDQgXTtcblxuXHRcdFx0dmFyIG1heCA9IE1hdGgubWF4KCB4MCwgeDEsIHgyICk7XG5cdFx0XHR2YXIgbWluID0gTWF0aC5taW4oIHgwLCB4MSwgeDIgKTtcblxuXHRcdFx0Ly8gMC45IGlzIHNvbWV3aGF0IGFyYml0cmFyeVxuXG5cdFx0XHRpZiAoIG1heCA+IDAuOSAmJiBtaW4gPCAwLjEgKSB7XG5cblx0XHRcdFx0aWYgKCB4MCA8IDAuMiApIHV2QnVmZmVyWyBpICsgMCBdICs9IDE7XG5cdFx0XHRcdGlmICggeDEgPCAwLjIgKSB1dkJ1ZmZlclsgaSArIDIgXSArPSAxO1xuXHRcdFx0XHRpZiAoIHgyIDwgMC4yICkgdXZCdWZmZXJbIGkgKyA0IF0gKz0gMTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBwdXNoVmVydGV4KCB2ZXJ0ZXggKSB7XG5cblx0XHR2ZXJ0ZXhCdWZmZXIucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRWZXJ0ZXhCeUluZGV4KCBpbmRleCwgdmVydGV4ICkge1xuXG5cdFx0dmFyIHN0cmlkZSA9IGluZGV4ICogMztcblxuXHRcdHZlcnRleC54ID0gdmVydGljZXNbIHN0cmlkZSArIDAgXTtcblx0XHR2ZXJ0ZXgueSA9IHZlcnRpY2VzWyBzdHJpZGUgKyAxIF07XG5cdFx0dmVydGV4LnogPSB2ZXJ0aWNlc1sgc3RyaWRlICsgMiBdO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBjb3JyZWN0VVZzKCkge1xuXG5cdFx0dmFyIGEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBiID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgYyA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgY2VudHJvaWQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIHV2QSA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0dmFyIHV2QiA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0dmFyIHV2QyA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGogPSAwOyBpIDwgdmVydGV4QnVmZmVyLmxlbmd0aDsgaSArPSA5LCBqICs9IDYgKSB7XG5cblx0XHRcdGEuc2V0KCB2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF0sIHZlcnRleEJ1ZmZlclsgaSArIDEgXSwgdmVydGV4QnVmZmVyWyBpICsgMiBdICk7XG5cdFx0XHRiLnNldCggdmVydGV4QnVmZmVyWyBpICsgMyBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA0IF0sIHZlcnRleEJ1ZmZlclsgaSArIDUgXSApO1xuXHRcdFx0Yy5zZXQoIHZlcnRleEJ1ZmZlclsgaSArIDYgXSwgdmVydGV4QnVmZmVyWyBpICsgNyBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA4IF0gKTtcblxuXHRcdFx0dXZBLnNldCggdXZCdWZmZXJbIGogKyAwIF0sIHV2QnVmZmVyWyBqICsgMSBdICk7XG5cdFx0XHR1dkIuc2V0KCB1dkJ1ZmZlclsgaiArIDIgXSwgdXZCdWZmZXJbIGogKyAzIF0gKTtcblx0XHRcdHV2Qy5zZXQoIHV2QnVmZmVyWyBqICsgNCBdLCB1dkJ1ZmZlclsgaiArIDUgXSApO1xuXG5cdFx0XHRjZW50cm9pZC5jb3B5KCBhICkuYWRkKCBiICkuYWRkKCBjICkuZGl2aWRlU2NhbGFyKCAzICk7XG5cblx0XHRcdHZhciBhemkgPSBhemltdXRoKCBjZW50cm9pZCApO1xuXG5cdFx0XHRjb3JyZWN0VVYoIHV2QSwgaiArIDAsIGEsIGF6aSApO1xuXHRcdFx0Y29ycmVjdFVWKCB1dkIsIGogKyAyLCBiLCBhemkgKTtcblx0XHRcdGNvcnJlY3RVViggdXZDLCBqICsgNCwgYywgYXppICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGNvcnJlY3RVViggdXYsIHN0cmlkZSwgdmVjdG9yLCBhemltdXRoICkge1xuXG5cdFx0aWYgKCAoIGF6aW11dGggPCAwICkgJiYgKCB1di54ID09PSAxICkgKSB7XG5cblx0XHRcdHV2QnVmZmVyWyBzdHJpZGUgXSA9IHV2LnggLSAxO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCAoIHZlY3Rvci54ID09PSAwICkgJiYgKCB2ZWN0b3IueiA9PT0gMCApICkge1xuXG5cdFx0XHR1dkJ1ZmZlclsgc3RyaWRlIF0gPSBhemltdXRoIC8gMiAvIE1hdGguUEkgKyAwLjU7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIEFuZ2xlIGFyb3VuZCB0aGUgWSBheGlzLCBjb3VudGVyLWNsb2Nrd2lzZSB3aGVuIGxvb2tpbmcgZnJvbSBhYm92ZS5cblxuXHRmdW5jdGlvbiBhemltdXRoKCB2ZWN0b3IgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5hdGFuMiggdmVjdG9yLnosIC0gdmVjdG9yLnggKTtcblxuXHR9XG5cblxuXHQvLyBBbmdsZSBhYm92ZSB0aGUgWFogcGxhbmUuXG5cblx0ZnVuY3Rpb24gaW5jbGluYXRpb24oIHZlY3RvciApIHtcblxuXHRcdHJldHVybiBNYXRoLmF0YW4yKCAtIHZlY3Rvci55LCBNYXRoLnNxcnQoICggdmVjdG9yLnggKiB2ZWN0b3IueCApICsgKCB2ZWN0b3IueiAqIHZlY3Rvci56ICkgKSApO1xuXG5cdH1cblxufVxuXG5Qb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5Qb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgdGltb3RoeXByYXRsZXkgLyBodHRwczovL2dpdGh1Yi5jb20vdGltb3RoeXByYXRsZXlcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gVGV0cmFoZWRyb25HZW9tZXRyeVxuXG5mdW5jdGlvbiBUZXRyYWhlZHJvbkdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1RldHJhaGVkcm9uR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5UZXRyYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuVGV0cmFoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUZXRyYWhlZHJvbkdlb21ldHJ5O1xuXG4vLyBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtcblx0XHQxLCAxLCAxLCBcdC0gMSwgLSAxLCAxLCBcdC0gMSwgMSwgLSAxLCBcdDEsIC0gMSwgLSAxXG5cdF07XG5cblx0dmFyIGluZGljZXMgPSBbXG5cdFx0MiwgMSwgMCwgXHQwLCAzLCAyLFx0MSwgMywgMCxcdDIsIDMsIDFcblx0XTtcblxuXHRQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICk7XG5cblx0dGhpcy50eXBlID0gJ1RldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG59XG5cblRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgdGltb3RoeXByYXRsZXkgLyBodHRwczovL2dpdGh1Yi5jb20vdGltb3RoeXByYXRsZXlcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gT2N0YWhlZHJvbkdlb21ldHJ5XG5cbmZ1bmN0aW9uIE9jdGFoZWRyb25HZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdPY3RhaGVkcm9uR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cbk9jdGFoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbk9jdGFoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBPY3RhaGVkcm9uR2VvbWV0cnk7XG5cbi8vIE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtcblx0XHQxLCAwLCAwLCBcdC0gMSwgMCwgMCxcdDAsIDEsIDAsXG5cdFx0MCwgLSAxLCAwLCBcdDAsIDAsIDEsXHQwLCAwLCAtIDFcblx0XTtcblxuXHR2YXIgaW5kaWNlcyA9IFtcblx0XHQwLCAyLCA0LFx0MCwgNCwgMyxcdDAsIDMsIDUsXG5cdFx0MCwgNSwgMixcdDEsIDIsIDUsXHQxLCA1LCAzLFxuXHRcdDEsIDMsIDQsXHQxLCA0LCAyXG5cdF07XG5cblx0UG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMsIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApO1xuXG5cdHRoaXMudHlwZSA9ICdPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG59XG5cbk9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5PY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgdGltb3RoeXByYXRsZXkgLyBodHRwczovL2dpdGh1Yi5jb20vdGltb3RoeXByYXRsZXlcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gSWNvc2FoZWRyb25HZW9tZXRyeVxuXG5mdW5jdGlvbiBJY29zYWhlZHJvbkdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0ljb3NhaGVkcm9uR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5JY29zYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuSWNvc2FoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJY29zYWhlZHJvbkdlb21ldHJ5O1xuXG4vLyBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdHZhciB0ID0gKCAxICsgTWF0aC5zcXJ0KCA1ICkgKSAvIDI7XG5cblx0dmFyIHZlcnRpY2VzID0gW1xuXHRcdC0gMSwgdCwgMCwgXHQxLCB0LCAwLCBcdC0gMSwgLSB0LCAwLCBcdDEsIC0gdCwgMCxcblx0XHQgMCwgLSAxLCB0LCBcdDAsIDEsIHQsXHQwLCAtIDEsIC0gdCwgXHQwLCAxLCAtIHQsXG5cdFx0IHQsIDAsIC0gMSwgXHR0LCAwLCAxLCBcdC0gdCwgMCwgLSAxLCBcdC0gdCwgMCwgMVxuXHRdO1xuXG5cdHZhciBpbmRpY2VzID0gW1xuXHRcdCAwLCAxMSwgNSwgXHQwLCA1LCAxLCBcdDAsIDEsIDcsIFx0MCwgNywgMTAsIFx0MCwgMTAsIDExLFxuXHRcdCAxLCA1LCA5LCBcdDUsIDExLCA0LFx0MTEsIDEwLCAyLFx0MTAsIDcsIDYsXHQ3LCAxLCA4LFxuXHRcdCAzLCA5LCA0LCBcdDMsIDQsIDIsXHQzLCAyLCA2LFx0MywgNiwgOCxcdDMsIDgsIDksXG5cdFx0IDQsIDksIDUsIFx0MiwgNCwgMTEsXHQ2LCAyLCAxMCxcdDgsIDYsIDcsXHQ5LCA4LCAxXG5cdF07XG5cblx0UG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMsIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApO1xuXG5cdHRoaXMudHlwZSA9ICdJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxufVxuXG5JY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIEFiZSBQYXpvcyAvIGh0dHBzOi8vaGFtb2lkLmNvbVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBEb2RlY2FoZWRyb25HZW9tZXRyeVxuXG5mdW5jdGlvbiBEb2RlY2FoZWRyb25HZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdEb2RlY2FoZWRyb25HZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5Eb2RlY2FoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkRvZGVjYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERvZGVjYWhlZHJvbkdlb21ldHJ5O1xuXG4vLyBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0dmFyIHQgPSAoIDEgKyBNYXRoLnNxcnQoIDUgKSApIC8gMjtcblx0dmFyIHIgPSAxIC8gdDtcblxuXHR2YXIgdmVydGljZXMgPSBbXG5cblx0XHQvLyAowrExLCDCsTEsIMKxMSlcblx0XHQtIDEsIC0gMSwgLSAxLFx0LSAxLCAtIDEsIDEsXG5cdFx0LSAxLCAxLCAtIDEsIC0gMSwgMSwgMSxcblx0XHQxLCAtIDEsIC0gMSwgMSwgLSAxLCAxLFxuXHRcdDEsIDEsIC0gMSwgMSwgMSwgMSxcblxuXHRcdC8vICgwLCDCsTEvz4YsIMKxz4YpXG5cdFx0IDAsIC0gciwgLSB0LCAwLCAtIHIsIHQsXG5cdFx0IDAsIHIsIC0gdCwgMCwgciwgdCxcblxuXHRcdC8vICjCsTEvz4YsIMKxz4YsIDApXG5cdFx0LSByLCAtIHQsIDAsIC0gciwgdCwgMCxcblx0XHQgciwgLSB0LCAwLCByLCB0LCAwLFxuXG5cdFx0Ly8gKMKxz4YsIDAsIMKxMS/Philcblx0XHQtIHQsIDAsIC0gciwgdCwgMCwgLSByLFxuXHRcdC0gdCwgMCwgciwgdCwgMCwgclxuXHRdO1xuXG5cdHZhciBpbmRpY2VzID0gW1xuXHRcdDMsIDExLCA3LCBcdDMsIDcsIDE1LCBcdDMsIDE1LCAxMyxcblx0XHQ3LCAxOSwgMTcsIFx0NywgMTcsIDYsIFx0NywgNiwgMTUsXG5cdFx0MTcsIDQsIDgsIFx0MTcsIDgsIDEwLCBcdDE3LCAxMCwgNixcblx0XHQ4LCAwLCAxNiwgXHQ4LCAxNiwgMiwgXHQ4LCAyLCAxMCxcblx0XHQwLCAxMiwgMSwgXHQwLCAxLCAxOCwgXHQwLCAxOCwgMTYsXG5cdFx0NiwgMTAsIDIsIFx0NiwgMiwgMTMsIFx0NiwgMTMsIDE1LFxuXHRcdDIsIDE2LCAxOCwgXHQyLCAxOCwgMywgXHQyLCAzLCAxMyxcblx0XHQxOCwgMSwgOSwgXHQxOCwgOSwgMTEsIFx0MTgsIDExLCAzLFxuXHRcdDQsIDE0LCAxMiwgXHQ0LCAxMiwgMCwgXHQ0LCAwLCA4LFxuXHRcdDExLCA5LCA1LCBcdDExLCA1LCAxOSwgXHQxMSwgMTksIDcsXG5cdFx0MTksIDUsIDE0LCBcdDE5LCAxNCwgNCwgXHQxOSwgNCwgMTcsXG5cdFx0MSwgMTIsIDE0LCBcdDEsIDE0LCA1LCBcdDEsIDUsIDlcblx0XTtcblxuXHRQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICk7XG5cblx0dGhpcy50eXBlID0gJ0RvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxufVxuXG5Eb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5Eb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIG9vc21veGllY29kZSAvIGh0dHBzOi8vZ2l0aHViLmNvbS9vb3Ntb3hpZWNvZGVcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwczovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3Igeno4NSAvIGh0dHBzOi8vZ2l0aHViLmNvbS96ejg1XG4gKiBAYXV0aG9yIG1pbmluZ29sZCAvIGh0dHBzOi8vZ2l0aHViLmNvbS9taW5pbmdvbGRcbiAqIEBhdXRob3Igam9ub2JyMSAvIGh0dHBzOi8vZ2l0aHViLmNvbS9qb25vYnIxXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICpcbiAqL1xuXG4vLyBUdWJlR2VvbWV0cnlcblxuZnVuY3Rpb24gVHViZUdlb21ldHJ5KCBwYXRoLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGl1cywgcmFkaWFsU2VnbWVudHMsIGNsb3NlZCwgdGFwZXIgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdUdWJlR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRwYXRoOiBwYXRoLFxuXHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRjbG9zZWQ6IGNsb3NlZFxuXHR9O1xuXG5cdGlmICggdGFwZXIgIT09IHVuZGVmaW5lZCApIGNvbnNvbGUud2FybiggJ1RIUkVFLlR1YmVHZW9tZXRyeTogdGFwZXIgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0dmFyIGJ1ZmZlckdlb21ldHJ5ID0gbmV3IFR1YmVCdWZmZXJHZW9tZXRyeSggcGF0aCwgdHVidWxhclNlZ21lbnRzLCByYWRpdXMsIHJhZGlhbFNlZ21lbnRzLCBjbG9zZWQgKTtcblxuXHQvLyBleHBvc2UgaW50ZXJuYWxzXG5cblx0dGhpcy50YW5nZW50cyA9IGJ1ZmZlckdlb21ldHJ5LnRhbmdlbnRzO1xuXHR0aGlzLm5vcm1hbHMgPSBidWZmZXJHZW9tZXRyeS5ub3JtYWxzO1xuXHR0aGlzLmJpbm9ybWFscyA9IGJ1ZmZlckdlb21ldHJ5LmJpbm9ybWFscztcblxuXHQvLyBjcmVhdGUgZ2VvbWV0cnlcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggYnVmZmVyR2VvbWV0cnkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuVHViZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuVHViZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFR1YmVHZW9tZXRyeTtcblxuLy8gVHViZUJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFR1YmVCdWZmZXJHZW9tZXRyeSggcGF0aCwgdHVidWxhclNlZ21lbnRzLCByYWRpdXMsIHJhZGlhbFNlZ21lbnRzLCBjbG9zZWQgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdUdWJlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRwYXRoOiBwYXRoLFxuXHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRjbG9zZWQ6IGNsb3NlZFxuXHR9O1xuXG5cdHR1YnVsYXJTZWdtZW50cyA9IHR1YnVsYXJTZWdtZW50cyB8fCA2NDtcblx0cmFkaXVzID0gcmFkaXVzIHx8IDE7XG5cdHJhZGlhbFNlZ21lbnRzID0gcmFkaWFsU2VnbWVudHMgfHwgODtcblx0Y2xvc2VkID0gY2xvc2VkIHx8IGZhbHNlO1xuXG5cdHZhciBmcmFtZXMgPSBwYXRoLmNvbXB1dGVGcmVuZXRGcmFtZXMoIHR1YnVsYXJTZWdtZW50cywgY2xvc2VkICk7XG5cblx0Ly8gZXhwb3NlIGludGVybmFsc1xuXG5cdHRoaXMudGFuZ2VudHMgPSBmcmFtZXMudGFuZ2VudHM7XG5cdHRoaXMubm9ybWFscyA9IGZyYW1lcy5ub3JtYWxzO1xuXHR0aGlzLmJpbm9ybWFscyA9IGZyYW1lcy5iaW5vcm1hbHM7XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHV2ID0gbmV3IFZlY3RvcjIoKTtcblx0dmFyIFAgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBpLCBqO1xuXG5cdC8vIGJ1ZmZlclxuXG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cdHZhciBpbmRpY2VzID0gW107XG5cblx0Ly8gY3JlYXRlIGJ1ZmZlciBkYXRhXG5cblx0Z2VuZXJhdGVCdWZmZXJEYXRhKCk7XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cdC8vIGZ1bmN0aW9uc1xuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlQnVmZmVyRGF0YSgpIHtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDwgdHVidWxhclNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHRnZW5lcmF0ZVNlZ21lbnQoIGkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGlmIHRoZSBnZW9tZXRyeSBpcyBub3QgY2xvc2VkLCBnZW5lcmF0ZSB0aGUgbGFzdCByb3cgb2YgdmVydGljZXMgYW5kIG5vcm1hbHNcblx0XHQvLyBhdCB0aGUgcmVndWxhciBwb3NpdGlvbiBvbiB0aGUgZ2l2ZW4gcGF0aFxuXHRcdC8vXG5cdFx0Ly8gaWYgdGhlIGdlb21ldHJ5IGlzIGNsb3NlZCwgZHVwbGljYXRlIHRoZSBmaXJzdCByb3cgb2YgdmVydGljZXMgYW5kIG5vcm1hbHMgKHV2cyB3aWxsIGRpZmZlcilcblxuXHRcdGdlbmVyYXRlU2VnbWVudCggKCBjbG9zZWQgPT09IGZhbHNlICkgPyB0dWJ1bGFyU2VnbWVudHMgOiAwICk7XG5cblx0XHQvLyB1dnMgYXJlIGdlbmVyYXRlZCBpbiBhIHNlcGFyYXRlIGZ1bmN0aW9uLlxuXHRcdC8vIHRoaXMgbWFrZXMgaXQgZWFzeSBjb21wdXRlIGNvcnJlY3QgdmFsdWVzIGZvciBjbG9zZWQgZ2VvbWV0cmllc1xuXG5cdFx0Z2VuZXJhdGVVVnMoKTtcblxuXHRcdC8vIGZpbmFsbHkgY3JlYXRlIGZhY2VzXG5cblx0XHRnZW5lcmF0ZUluZGljZXMoKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVTZWdtZW50KCBpICkge1xuXG5cdFx0Ly8gd2UgdXNlIGdldFBvaW50QXQgdG8gc2FtcGxlIGV2ZW5seSBkaXN0cmlidXRlZCBwb2ludHMgZnJvbSB0aGUgZ2l2ZW4gcGF0aFxuXG5cdFx0UCA9IHBhdGguZ2V0UG9pbnRBdCggaSAvIHR1YnVsYXJTZWdtZW50cywgUCApO1xuXG5cdFx0Ly8gcmV0cmlldmUgY29ycmVzcG9uZGluZyBub3JtYWwgYW5kIGJpbm9ybWFsXG5cblx0XHR2YXIgTiA9IGZyYW1lcy5ub3JtYWxzWyBpIF07XG5cdFx0dmFyIEIgPSBmcmFtZXMuYmlub3JtYWxzWyBpIF07XG5cblx0XHQvLyBnZW5lcmF0ZSBub3JtYWxzIGFuZCB2ZXJ0aWNlcyBmb3IgdGhlIGN1cnJlbnQgc2VnbWVudFxuXG5cdFx0Zm9yICggaiA9IDA7IGogPD0gcmFkaWFsU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHRcdHZhciB2ID0gaiAvIHJhZGlhbFNlZ21lbnRzICogTWF0aC5QSSAqIDI7XG5cblx0XHRcdHZhciBzaW4gPSBNYXRoLnNpbiggdiApO1xuXHRcdFx0dmFyIGNvcyA9IC0gTWF0aC5jb3MoIHYgKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdG5vcm1hbC54ID0gKCBjb3MgKiBOLnggKyBzaW4gKiBCLnggKTtcblx0XHRcdG5vcm1hbC55ID0gKCBjb3MgKiBOLnkgKyBzaW4gKiBCLnkgKTtcblx0XHRcdG5vcm1hbC56ID0gKCBjb3MgKiBOLnogKyBzaW4gKiBCLnogKTtcblx0XHRcdG5vcm1hbC5ub3JtYWxpemUoKTtcblxuXHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHR2ZXJ0ZXgueCA9IFAueCArIHJhZGl1cyAqIG5vcm1hbC54O1xuXHRcdFx0dmVydGV4LnkgPSBQLnkgKyByYWRpdXMgKiBub3JtYWwueTtcblx0XHRcdHZlcnRleC56ID0gUC56ICsgcmFkaXVzICogbm9ybWFsLno7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVJbmRpY2VzKCkge1xuXG5cdFx0Zm9yICggaiA9IDE7IGogPD0gdHVidWxhclNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0XHRmb3IgKCBpID0gMTsgaSA8PSByYWRpYWxTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgYSA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyAoIGkgLSAxICk7XG5cdFx0XHRcdHZhciBiID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyAoIGkgLSAxICk7XG5cdFx0XHRcdHZhciBjID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyBpO1xuXHRcdFx0XHR2YXIgZCA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyBpO1xuXG5cdFx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlVVZzKCkge1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPD0gdHVidWxhclNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHRmb3IgKCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgaiArKyApIHtcblxuXHRcdFx0XHR1di54ID0gaSAvIHR1YnVsYXJTZWdtZW50cztcblx0XHRcdFx0dXYueSA9IGogLyByYWRpYWxTZWdtZW50cztcblxuXHRcdFx0XHR1dnMucHVzaCggdXYueCwgdXYueSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG59XG5cblR1YmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblR1YmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUdWJlQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBvb3Ntb3hpZWNvZGVcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKlxuICogYmFzZWQgb24gaHR0cDovL3d3dy5ibGFja3Bhd24uY29tL3RleHRzL3BxdG9ydXMvXG4gKi9cblxuLy8gVG9ydXNLbm90R2VvbWV0cnlcblxuZnVuY3Rpb24gVG9ydXNLbm90R2VvbWV0cnkoIHJhZGl1cywgdHViZSwgdHVidWxhclNlZ21lbnRzLCByYWRpYWxTZWdtZW50cywgcCwgcSwgaGVpZ2h0U2NhbGUgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdUb3J1c0tub3RHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHR1YmU6IHR1YmUsXG5cdFx0dHVidWxhclNlZ21lbnRzOiB0dWJ1bGFyU2VnbWVudHMsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdHA6IHAsXG5cdFx0cTogcVxuXHR9O1xuXG5cdGlmICggaGVpZ2h0U2NhbGUgIT09IHVuZGVmaW5lZCApIGNvbnNvbGUud2FybiggJ1RIUkVFLlRvcnVzS25vdEdlb21ldHJ5OiBoZWlnaHRTY2FsZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnNjYWxlKCB4LCB5LCB6ICkgaW5zdGVhZC4nICk7XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGlhbFNlZ21lbnRzLCBwLCBxICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuVG9ydXNLbm90R2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5Ub3J1c0tub3RHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb3J1c0tub3RHZW9tZXRyeTtcblxuLy8gVG9ydXNLbm90QnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgdHViZSwgdHVidWxhclNlZ21lbnRzLCByYWRpYWxTZWdtZW50cywgcCwgcSApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1RvcnVzS25vdEJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0dHViZTogdHViZSxcblx0XHR0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cyxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0cDogcCxcblx0XHRxOiBxXG5cdH07XG5cblx0cmFkaXVzID0gcmFkaXVzIHx8IDE7XG5cdHR1YmUgPSB0dWJlIHx8IDAuNDtcblx0dHVidWxhclNlZ21lbnRzID0gTWF0aC5mbG9vciggdHVidWxhclNlZ21lbnRzICkgfHwgNjQ7XG5cdHJhZGlhbFNlZ21lbnRzID0gTWF0aC5mbG9vciggcmFkaWFsU2VnbWVudHMgKSB8fCA4O1xuXHRwID0gcCB8fCAyO1xuXHRxID0gcSB8fCAzO1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgaSwgajtcblxuXHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIFAxID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIFAyID0gbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgQiA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBUID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIE4gPSBuZXcgVmVjdG9yMygpO1xuXG5cdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRmb3IgKCBpID0gMDsgaSA8PSB0dWJ1bGFyU2VnbWVudHM7ICsrIGkgKSB7XG5cblx0XHQvLyB0aGUgcmFkaWFuIFwidVwiIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBvbiB0aGUgdG9ydXMgY3VydmUgb2YgdGhlIGN1cnJlbnQgdHVidWxhciBzZWdlbWVudFxuXG5cdFx0dmFyIHUgPSBpIC8gdHVidWxhclNlZ21lbnRzICogcCAqIE1hdGguUEkgKiAyO1xuXG5cdFx0Ly8gbm93IHdlIGNhbGN1bGF0ZSB0d28gcG9pbnRzLiBQMSBpcyBvdXIgY3VycmVudCBwb3NpdGlvbiBvbiB0aGUgY3VydmUsIFAyIGlzIGEgbGl0dGxlIGZhcnRoZXIgYWhlYWQuXG5cdFx0Ly8gdGhlc2UgcG9pbnRzIGFyZSB1c2VkIHRvIGNyZWF0ZSBhIHNwZWNpYWwgXCJjb29yZGluYXRlIHNwYWNlXCIsIHdoaWNoIGlzIG5lY2Vzc2FyeSB0byBjYWxjdWxhdGUgdGhlIGNvcnJlY3QgdmVydGV4IHBvc2l0aW9uc1xuXG5cdFx0Y2FsY3VsYXRlUG9zaXRpb25PbkN1cnZlKCB1LCBwLCBxLCByYWRpdXMsIFAxICk7XG5cdFx0Y2FsY3VsYXRlUG9zaXRpb25PbkN1cnZlKCB1ICsgMC4wMSwgcCwgcSwgcmFkaXVzLCBQMiApO1xuXG5cdFx0Ly8gY2FsY3VsYXRlIG9ydGhvbm9ybWFsIGJhc2lzXG5cblx0XHRULnN1YlZlY3RvcnMoIFAyLCBQMSApO1xuXHRcdE4uYWRkVmVjdG9ycyggUDIsIFAxICk7XG5cdFx0Qi5jcm9zc1ZlY3RvcnMoIFQsIE4gKTtcblx0XHROLmNyb3NzVmVjdG9ycyggQiwgVCApO1xuXG5cdFx0Ly8gbm9ybWFsaXplIEIsIE4uIFQgY2FuIGJlIGlnbm9yZWQsIHdlIGRvbid0IHVzZSBpdFxuXG5cdFx0Qi5ub3JtYWxpemUoKTtcblx0XHROLm5vcm1hbGl6ZSgpO1xuXG5cdFx0Zm9yICggaiA9IDA7IGogPD0gcmFkaWFsU2VnbWVudHM7ICsrIGogKSB7XG5cblx0XHRcdC8vIG5vdyBjYWxjdWxhdGUgdGhlIHZlcnRpY2VzLiB0aGV5IGFyZSBub3RoaW5nIG1vcmUgdGhhbiBhbiBleHRydXNpb24gb2YgdGhlIHRvcnVzIGN1cnZlLlxuXHRcdFx0Ly8gYmVjYXVzZSB3ZSBleHRydWRlIGEgc2hhcGUgaW4gdGhlIHh5LXBsYW5lLCB0aGVyZSBpcyBubyBuZWVkIHRvIGNhbGN1bGF0ZSBhIHotdmFsdWUuXG5cblx0XHRcdHZhciB2ID0gaiAvIHJhZGlhbFNlZ21lbnRzICogTWF0aC5QSSAqIDI7XG5cdFx0XHR2YXIgY3ggPSAtIHR1YmUgKiBNYXRoLmNvcyggdiApO1xuXHRcdFx0dmFyIGN5ID0gdHViZSAqIE1hdGguc2luKCB2ICk7XG5cblx0XHRcdC8vIG5vdyBjYWxjdWxhdGUgdGhlIGZpbmFsIHZlcnRleCBwb3NpdGlvbi5cblx0XHRcdC8vIGZpcnN0IHdlIG9yaWVudCB0aGUgZXh0cnVzaW9uIHdpdGggb3VyIGJhc2lzIHZlY3RvcywgdGhlbiB3ZSBhZGQgaXQgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gb24gdGhlIGN1cnZlXG5cblx0XHRcdHZlcnRleC54ID0gUDEueCArICggY3ggKiBOLnggKyBjeSAqIEIueCApO1xuXHRcdFx0dmVydGV4LnkgPSBQMS55ICsgKCBjeCAqIE4ueSArIGN5ICogQi55ICk7XG5cdFx0XHR2ZXJ0ZXgueiA9IFAxLnogKyAoIGN4ICogTi56ICsgY3kgKiBCLnogKTtcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHQvLyBub3JtYWwgKFAxIGlzIGFsd2F5cyB0aGUgY2VudGVyL29yaWdpbiBvZiB0aGUgZXh0cnVzaW9uLCB0aHVzIHdlIGNhbiB1c2UgaXQgdG8gY2FsY3VsYXRlIHRoZSBub3JtYWwpXG5cblx0XHRcdG5vcm1hbC5zdWJWZWN0b3JzKCB2ZXJ0ZXgsIFAxICkubm9ybWFsaXplKCk7XG5cblx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1dnMucHVzaCggaSAvIHR1YnVsYXJTZWdtZW50cyApO1xuXHRcdFx0dXZzLnB1c2goIGogLyByYWRpYWxTZWdtZW50cyApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBnZW5lcmF0ZSBpbmRpY2VzXG5cblx0Zm9yICggaiA9IDE7IGogPD0gdHVidWxhclNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0Zm9yICggaSA9IDE7IGkgPD0gcmFkaWFsU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdC8vIGluZGljZXNcblxuXHRcdFx0dmFyIGEgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgKCBpIC0gMSApO1xuXHRcdFx0dmFyIGIgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogaiArICggaSAtIDEgKTtcblx0XHRcdHZhciBjID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyBpO1xuXHRcdFx0dmFyIGQgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaTtcblxuXHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cdC8vIHRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgY3VycmVudCBwb3NpdGlvbiBvbiB0aGUgdG9ydXMgY3VydmVcblxuXHRmdW5jdGlvbiBjYWxjdWxhdGVQb3NpdGlvbk9uQ3VydmUoIHUsIHAsIHEsIHJhZGl1cywgcG9zaXRpb24gKSB7XG5cblx0XHR2YXIgY3UgPSBNYXRoLmNvcyggdSApO1xuXHRcdHZhciBzdSA9IE1hdGguc2luKCB1ICk7XG5cdFx0dmFyIHF1T3ZlclAgPSBxIC8gcCAqIHU7XG5cdFx0dmFyIGNzID0gTWF0aC5jb3MoIHF1T3ZlclAgKTtcblxuXHRcdHBvc2l0aW9uLnggPSByYWRpdXMgKiAoIDIgKyBjcyApICogMC41ICogY3U7XG5cdFx0cG9zaXRpb24ueSA9IHJhZGl1cyAqICggMiArIGNzICkgKiBzdSAqIDAuNTtcblx0XHRwb3NpdGlvbi56ID0gcmFkaXVzICogTWF0aC5zaW4oIHF1T3ZlclAgKSAqIDAuNTtcblxuXHR9XG5cbn1cblxuVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5Ub3J1c0tub3RCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIG9vc21veGllY29kZVxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gVG9ydXNHZW9tZXRyeVxuXG5mdW5jdGlvbiBUb3J1c0dlb21ldHJ5KCByYWRpdXMsIHR1YmUsIHJhZGlhbFNlZ21lbnRzLCB0dWJ1bGFyU2VnbWVudHMsIGFyYyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1RvcnVzR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHR0dWJlOiB0dWJlLFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHR0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cyxcblx0XHRhcmM6IGFyY1xuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgVG9ydXNCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCByYWRpYWxTZWdtZW50cywgdHVidWxhclNlZ21lbnRzLCBhcmMgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5Ub3J1c0dlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuVG9ydXNHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb3J1c0dlb21ldHJ5O1xuXG4vLyBUb3J1c0J1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFRvcnVzQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgdHViZSwgcmFkaWFsU2VnbWVudHMsIHR1YnVsYXJTZWdtZW50cywgYXJjICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVG9ydXNCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHR1YmU6IHR1YmUsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdGFyYzogYXJjXG5cdH07XG5cblx0cmFkaXVzID0gcmFkaXVzIHx8IDE7XG5cdHR1YmUgPSB0dWJlIHx8IDAuNDtcblx0cmFkaWFsU2VnbWVudHMgPSBNYXRoLmZsb29yKCByYWRpYWxTZWdtZW50cyApIHx8IDg7XG5cdHR1YnVsYXJTZWdtZW50cyA9IE1hdGguZmxvb3IoIHR1YnVsYXJTZWdtZW50cyApIHx8IDY7XG5cdGFyYyA9IGFyYyB8fCBNYXRoLlBJICogMjtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIGNlbnRlciA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgaiwgaTtcblxuXHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0Zm9yICggaiA9IDA7IGogPD0gcmFkaWFsU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHRmb3IgKCBpID0gMDsgaSA8PSB0dWJ1bGFyU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdHZhciB1ID0gaSAvIHR1YnVsYXJTZWdtZW50cyAqIGFyYztcblx0XHRcdHZhciB2ID0gaiAvIHJhZGlhbFNlZ21lbnRzICogTWF0aC5QSSAqIDI7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHR2ZXJ0ZXgueCA9ICggcmFkaXVzICsgdHViZSAqIE1hdGguY29zKCB2ICkgKSAqIE1hdGguY29zKCB1ICk7XG5cdFx0XHR2ZXJ0ZXgueSA9ICggcmFkaXVzICsgdHViZSAqIE1hdGguY29zKCB2ICkgKSAqIE1hdGguc2luKCB1ICk7XG5cdFx0XHR2ZXJ0ZXgueiA9IHR1YmUgKiBNYXRoLnNpbiggdiApO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRjZW50ZXIueCA9IHJhZGl1cyAqIE1hdGguY29zKCB1ICk7XG5cdFx0XHRjZW50ZXIueSA9IHJhZGl1cyAqIE1hdGguc2luKCB1ICk7XG5cdFx0XHRub3JtYWwuc3ViVmVjdG9ycyggdmVydGV4LCBjZW50ZXIgKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2cy5wdXNoKCBpIC8gdHVidWxhclNlZ21lbnRzICk7XG5cdFx0XHR1dnMucHVzaCggaiAvIHJhZGlhbFNlZ21lbnRzICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGdlbmVyYXRlIGluZGljZXNcblxuXHRmb3IgKCBqID0gMTsgaiA8PSByYWRpYWxTZWdtZW50czsgaiArKyApIHtcblxuXHRcdGZvciAoIGkgPSAxOyBpIDw9IHR1YnVsYXJTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0Ly8gaW5kaWNlc1xuXG5cdFx0XHR2YXIgYSA9ICggdHVidWxhclNlZ21lbnRzICsgMSApICogaiArIGkgLSAxO1xuXHRcdFx0dmFyIGIgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArIGkgLSAxO1xuXHRcdFx0dmFyIGMgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArIGk7XG5cdFx0XHR2YXIgZCA9ICggdHVidWxhclNlZ21lbnRzICsgMSApICogaiArIGk7XG5cblx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxufVxuXG5Ub3J1c0J1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuVG9ydXNCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb3J1c0J1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKiBQb3J0IGZyb20gaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9lYXJjdXQgKHYyLjEuMilcbiAqL1xuXG52YXIgRWFyY3V0ID0ge1xuXG5cdHRyaWFuZ3VsYXRlOiBmdW5jdGlvbiAoIGRhdGEsIGhvbGVJbmRpY2VzLCBkaW0gKSB7XG5cblx0XHRkaW0gPSBkaW0gfHwgMjtcblxuXHRcdHZhciBoYXNIb2xlcyA9IGhvbGVJbmRpY2VzICYmIGhvbGVJbmRpY2VzLmxlbmd0aCxcblx0XHRcdG91dGVyTGVuID0gaGFzSG9sZXMgPyBob2xlSW5kaWNlc1sgMCBdICogZGltIDogZGF0YS5sZW5ndGgsXG5cdFx0XHRvdXRlck5vZGUgPSBsaW5rZWRMaXN0KCBkYXRhLCAwLCBvdXRlckxlbiwgZGltLCB0cnVlICksXG5cdFx0XHR0cmlhbmdsZXMgPSBbXTtcblxuXHRcdGlmICggISBvdXRlck5vZGUgKSByZXR1cm4gdHJpYW5nbGVzO1xuXG5cdFx0dmFyIG1pblgsIG1pblksIG1heFgsIG1heFksIHgsIHksIGludlNpemU7XG5cblx0XHRpZiAoIGhhc0hvbGVzICkgb3V0ZXJOb2RlID0gZWxpbWluYXRlSG9sZXMoIGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSApO1xuXG5cdFx0Ly8gaWYgdGhlIHNoYXBlIGlzIG5vdCB0b28gc2ltcGxlLCB3ZSdsbCB1c2Ugei1vcmRlciBjdXJ2ZSBoYXNoIGxhdGVyOyBjYWxjdWxhdGUgcG9seWdvbiBiYm94XG5cblx0XHRpZiAoIGRhdGEubGVuZ3RoID4gODAgKiBkaW0gKSB7XG5cblx0XHRcdG1pblggPSBtYXhYID0gZGF0YVsgMCBdO1xuXHRcdFx0bWluWSA9IG1heFkgPSBkYXRhWyAxIF07XG5cblx0XHRcdGZvciAoIHZhciBpID0gZGltOyBpIDwgb3V0ZXJMZW47IGkgKz0gZGltICkge1xuXG5cdFx0XHRcdHggPSBkYXRhWyBpIF07XG5cdFx0XHRcdHkgPSBkYXRhWyBpICsgMSBdO1xuXHRcdFx0XHRpZiAoIHggPCBtaW5YICkgbWluWCA9IHg7XG5cdFx0XHRcdGlmICggeSA8IG1pblkgKSBtaW5ZID0geTtcblx0XHRcdFx0aWYgKCB4ID4gbWF4WCApIG1heFggPSB4O1xuXHRcdFx0XHRpZiAoIHkgPiBtYXhZICkgbWF4WSA9IHk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gbWluWCwgbWluWSBhbmQgaW52U2l6ZSBhcmUgbGF0ZXIgdXNlZCB0byB0cmFuc2Zvcm0gY29vcmRzIGludG8gaW50ZWdlcnMgZm9yIHotb3JkZXIgY2FsY3VsYXRpb25cblxuXHRcdFx0aW52U2l6ZSA9IE1hdGgubWF4KCBtYXhYIC0gbWluWCwgbWF4WSAtIG1pblkgKTtcblx0XHRcdGludlNpemUgPSBpbnZTaXplICE9PSAwID8gMSAvIGludlNpemUgOiAwO1xuXG5cdFx0fVxuXG5cdFx0ZWFyY3V0TGlua2VkKCBvdXRlck5vZGUsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cblx0XHRyZXR1cm4gdHJpYW5nbGVzO1xuXG5cdH1cblxufTtcblxuLy8gY3JlYXRlIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0IGZyb20gcG9seWdvbiBwb2ludHMgaW4gdGhlIHNwZWNpZmllZCB3aW5kaW5nIG9yZGVyXG5cbmZ1bmN0aW9uIGxpbmtlZExpc3QoIGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSwgY2xvY2t3aXNlICkge1xuXG5cdHZhciBpLCBsYXN0O1xuXG5cdGlmICggY2xvY2t3aXNlID09PSAoIHNpZ25lZEFyZWEoIGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSApID4gMCApICkge1xuXG5cdFx0Zm9yICggaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IGRpbSApIGxhc3QgPSBpbnNlcnROb2RlKCBpLCBkYXRhWyBpIF0sIGRhdGFbIGkgKyAxIF0sIGxhc3QgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Zm9yICggaSA9IGVuZCAtIGRpbTsgaSA+PSBzdGFydDsgaSAtPSBkaW0gKSBsYXN0ID0gaW5zZXJ0Tm9kZSggaSwgZGF0YVsgaSBdLCBkYXRhWyBpICsgMSBdLCBsYXN0ICk7XG5cblx0fVxuXG5cdGlmICggbGFzdCAmJiBlcXVhbHMoIGxhc3QsIGxhc3QubmV4dCApICkge1xuXG5cdFx0cmVtb3ZlTm9kZSggbGFzdCApO1xuXHRcdGxhc3QgPSBsYXN0Lm5leHQ7XG5cblx0fVxuXG5cdHJldHVybiBsYXN0O1xuXG59XG5cbi8vIGVsaW1pbmF0ZSBjb2xpbmVhciBvciBkdXBsaWNhdGUgcG9pbnRzXG5cbmZ1bmN0aW9uIGZpbHRlclBvaW50cyggc3RhcnQsIGVuZCApIHtcblxuXHRpZiAoICEgc3RhcnQgKSByZXR1cm4gc3RhcnQ7XG5cdGlmICggISBlbmQgKSBlbmQgPSBzdGFydDtcblxuXHR2YXIgcCA9IHN0YXJ0LCBhZ2FpbjtcblxuXHRkbyB7XG5cblx0XHRhZ2FpbiA9IGZhbHNlO1xuXG5cdFx0aWYgKCAhIHAuc3RlaW5lciAmJiAoIGVxdWFscyggcCwgcC5uZXh0ICkgfHwgYXJlYSggcC5wcmV2LCBwLCBwLm5leHQgKSA9PT0gMCApICkge1xuXG5cdFx0XHRyZW1vdmVOb2RlKCBwICk7XG5cdFx0XHRwID0gZW5kID0gcC5wcmV2O1xuXHRcdFx0aWYgKCBwID09PSBwLm5leHQgKSBicmVhaztcblx0XHRcdGFnYWluID0gdHJ1ZTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHAgPSBwLm5leHQ7XG5cblx0XHR9XG5cblx0fSB3aGlsZSAoIGFnYWluIHx8IHAgIT09IGVuZCApO1xuXG5cdHJldHVybiBlbmQ7XG5cbn1cblxuLy8gbWFpbiBlYXIgc2xpY2luZyBsb29wIHdoaWNoIHRyaWFuZ3VsYXRlcyBhIHBvbHlnb24gKGdpdmVuIGFzIGEgbGlua2VkIGxpc3QpXG5cbmZ1bmN0aW9uIGVhcmN1dExpbmtlZCggZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgcGFzcyApIHtcblxuXHRpZiAoICEgZWFyICkgcmV0dXJuO1xuXG5cdC8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXJcblxuXHRpZiAoICEgcGFzcyAmJiBpbnZTaXplICkgaW5kZXhDdXJ2ZSggZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cblx0dmFyIHN0b3AgPSBlYXIsIHByZXYsIG5leHQ7XG5cblx0Ly8gaXRlcmF0ZSB0aHJvdWdoIGVhcnMsIHNsaWNpbmcgdGhlbSBvbmUgYnkgb25lXG5cblx0d2hpbGUgKCBlYXIucHJldiAhPT0gZWFyLm5leHQgKSB7XG5cblx0XHRwcmV2ID0gZWFyLnByZXY7XG5cdFx0bmV4dCA9IGVhci5uZXh0O1xuXG5cdFx0aWYgKCBpbnZTaXplID8gaXNFYXJIYXNoZWQoIGVhciwgbWluWCwgbWluWSwgaW52U2l6ZSApIDogaXNFYXIoIGVhciApICkge1xuXG5cdFx0XHQvLyBjdXQgb2ZmIHRoZSB0cmlhbmdsZVxuXHRcdFx0dHJpYW5nbGVzLnB1c2goIHByZXYuaSAvIGRpbSApO1xuXHRcdFx0dHJpYW5nbGVzLnB1c2goIGVhci5pIC8gZGltICk7XG5cdFx0XHR0cmlhbmdsZXMucHVzaCggbmV4dC5pIC8gZGltICk7XG5cblx0XHRcdHJlbW92ZU5vZGUoIGVhciApO1xuXG5cdFx0XHQvLyBza2lwcGluZyB0aGUgbmV4dCB2ZXJ0aWNlIGxlYWRzIHRvIGxlc3Mgc2xpdmVyIHRyaWFuZ2xlc1xuXHRcdFx0ZWFyID0gbmV4dC5uZXh0O1xuXHRcdFx0c3RvcCA9IG5leHQubmV4dDtcblxuXHRcdFx0Y29udGludWU7XG5cblx0XHR9XG5cblx0XHRlYXIgPSBuZXh0O1xuXG5cdFx0Ly8gaWYgd2UgbG9vcGVkIHRocm91Z2ggdGhlIHdob2xlIHJlbWFpbmluZyBwb2x5Z29uIGFuZCBjYW4ndCBmaW5kIGFueSBtb3JlIGVhcnNcblxuXHRcdGlmICggZWFyID09PSBzdG9wICkge1xuXG5cdFx0XHQvLyB0cnkgZmlsdGVyaW5nIHBvaW50cyBhbmQgc2xpY2luZyBhZ2FpblxuXG5cdFx0XHRpZiAoICEgcGFzcyApIHtcblxuXHRcdFx0XHRlYXJjdXRMaW5rZWQoIGZpbHRlclBvaW50cyggZWFyICksIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCAxICk7XG5cblx0XHRcdFx0Ly8gaWYgdGhpcyBkaWRuJ3Qgd29yaywgdHJ5IGN1cmluZyBhbGwgc21hbGwgc2VsZi1pbnRlcnNlY3Rpb25zIGxvY2FsbHlcblxuXHRcdFx0fSBlbHNlIGlmICggcGFzcyA9PT0gMSApIHtcblxuXHRcdFx0XHRlYXIgPSBjdXJlTG9jYWxJbnRlcnNlY3Rpb25zKCBlYXIsIHRyaWFuZ2xlcywgZGltICk7XG5cdFx0XHRcdGVhcmN1dExpbmtlZCggZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgMiApO1xuXG5cdFx0XHQvLyBhcyBhIGxhc3QgcmVzb3J0LCB0cnkgc3BsaXR0aW5nIHRoZSByZW1haW5pbmcgcG9seWdvbiBpbnRvIHR3b1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBwYXNzID09PSAyICkge1xuXG5cdFx0XHRcdHNwbGl0RWFyY3V0KCBlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cblx0XHRcdH1cblxuXHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbi8vIGNoZWNrIHdoZXRoZXIgYSBwb2x5Z29uIG5vZGUgZm9ybXMgYSB2YWxpZCBlYXIgd2l0aCBhZGphY2VudCBub2Rlc1xuXG5mdW5jdGlvbiBpc0VhciggZWFyICkge1xuXG5cdHZhciBhID0gZWFyLnByZXYsXG5cdFx0YiA9IGVhcixcblx0XHRjID0gZWFyLm5leHQ7XG5cblx0aWYgKCBhcmVhKCBhLCBiLCBjICkgPj0gMCApIHJldHVybiBmYWxzZTsgLy8gcmVmbGV4LCBjYW4ndCBiZSBhbiBlYXJcblxuXHQvLyBub3cgbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgb3RoZXIgcG9pbnRzIGluc2lkZSB0aGUgcG90ZW50aWFsIGVhclxuXHR2YXIgcCA9IGVhci5uZXh0Lm5leHQ7XG5cblx0d2hpbGUgKCBwICE9PSBlYXIucHJldiApIHtcblxuXHRcdGlmICggcG9pbnRJblRyaWFuZ2xlKCBhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBwLngsIHAueSApICYmIGFyZWEoIHAucHJldiwgcCwgcC5uZXh0ICkgPj0gMCApIHtcblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9XG5cblx0cmV0dXJuIHRydWU7XG5cbn1cblxuZnVuY3Rpb24gaXNFYXJIYXNoZWQoIGVhciwgbWluWCwgbWluWSwgaW52U2l6ZSApIHtcblxuXHR2YXIgYSA9IGVhci5wcmV2LFxuXHRcdGIgPSBlYXIsXG5cdFx0YyA9IGVhci5uZXh0O1xuXG5cdGlmICggYXJlYSggYSwgYiwgYyApID49IDAgKSByZXR1cm4gZmFsc2U7IC8vIHJlZmxleCwgY2FuJ3QgYmUgYW4gZWFyXG5cblx0Ly8gdHJpYW5nbGUgYmJveDsgbWluICYgbWF4IGFyZSBjYWxjdWxhdGVkIGxpa2UgdGhpcyBmb3Igc3BlZWRcblxuXHR2YXIgbWluVFggPSBhLnggPCBiLnggPyAoIGEueCA8IGMueCA/IGEueCA6IGMueCApIDogKCBiLnggPCBjLnggPyBiLnggOiBjLnggKSxcblx0XHRtaW5UWSA9IGEueSA8IGIueSA/ICggYS55IDwgYy55ID8gYS55IDogYy55ICkgOiAoIGIueSA8IGMueSA/IGIueSA6IGMueSApLFxuXHRcdG1heFRYID0gYS54ID4gYi54ID8gKCBhLnggPiBjLnggPyBhLnggOiBjLnggKSA6ICggYi54ID4gYy54ID8gYi54IDogYy54ICksXG5cdFx0bWF4VFkgPSBhLnkgPiBiLnkgPyAoIGEueSA+IGMueSA/IGEueSA6IGMueSApIDogKCBiLnkgPiBjLnkgPyBiLnkgOiBjLnkgKTtcblxuXHQvLyB6LW9yZGVyIHJhbmdlIGZvciB0aGUgY3VycmVudCB0cmlhbmdsZSBiYm94O1xuXG5cdHZhciBtaW5aID0gek9yZGVyKCBtaW5UWCwgbWluVFksIG1pblgsIG1pblksIGludlNpemUgKSxcblx0XHRtYXhaID0gek9yZGVyKCBtYXhUWCwgbWF4VFksIG1pblgsIG1pblksIGludlNpemUgKTtcblxuXHQvLyBmaXJzdCBsb29rIGZvciBwb2ludHMgaW5zaWRlIHRoZSB0cmlhbmdsZSBpbiBpbmNyZWFzaW5nIHotb3JkZXJcblxuXHR2YXIgcCA9IGVhci5uZXh0WjtcblxuXHR3aGlsZSAoIHAgJiYgcC56IDw9IG1heFogKSB7XG5cblx0XHRpZiAoIHAgIT09IGVhci5wcmV2ICYmIHAgIT09IGVhci5uZXh0ICYmXG5cdFx0XHRcdHBvaW50SW5UcmlhbmdsZSggYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkgKSAmJlxuXHRcdFx0XHRhcmVhKCBwLnByZXYsIHAsIHAubmV4dCApID49IDAgKSByZXR1cm4gZmFsc2U7XG5cdFx0cCA9IHAubmV4dFo7XG5cblx0fVxuXG5cdC8vIHRoZW4gbG9vayBmb3IgcG9pbnRzIGluIGRlY3JlYXNpbmcgei1vcmRlclxuXG5cdHAgPSBlYXIucHJldlo7XG5cblx0d2hpbGUgKCBwICYmIHAueiA+PSBtaW5aICkge1xuXG5cdFx0aWYgKCBwICE9PSBlYXIucHJldiAmJiBwICE9PSBlYXIubmV4dCAmJlxuXHRcdFx0XHRwb2ludEluVHJpYW5nbGUoIGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55ICkgJiZcblx0XHRcdFx0YXJlYSggcC5wcmV2LCBwLCBwLm5leHQgKSA+PSAwICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0cCA9IHAucHJldlo7XG5cblx0fVxuXG5cdHJldHVybiB0cnVlO1xuXG59XG5cbi8vIGdvIHRocm91Z2ggYWxsIHBvbHlnb24gbm9kZXMgYW5kIGN1cmUgc21hbGwgbG9jYWwgc2VsZi1pbnRlcnNlY3Rpb25zXG5cbmZ1bmN0aW9uIGN1cmVMb2NhbEludGVyc2VjdGlvbnMoIHN0YXJ0LCB0cmlhbmdsZXMsIGRpbSApIHtcblxuXHR2YXIgcCA9IHN0YXJ0O1xuXG5cdGRvIHtcblxuXHRcdHZhciBhID0gcC5wcmV2LCBiID0gcC5uZXh0Lm5leHQ7XG5cblx0XHRpZiAoICEgZXF1YWxzKCBhLCBiICkgJiYgaW50ZXJzZWN0cyggYSwgcCwgcC5uZXh0LCBiICkgJiYgbG9jYWxseUluc2lkZSggYSwgYiApICYmIGxvY2FsbHlJbnNpZGUoIGIsIGEgKSApIHtcblxuXHRcdFx0dHJpYW5nbGVzLnB1c2goIGEuaSAvIGRpbSApO1xuXHRcdFx0dHJpYW5nbGVzLnB1c2goIHAuaSAvIGRpbSApO1xuXHRcdFx0dHJpYW5nbGVzLnB1c2goIGIuaSAvIGRpbSApO1xuXG5cdFx0XHQvLyByZW1vdmUgdHdvIG5vZGVzIGludm9sdmVkXG5cblx0XHRcdHJlbW92ZU5vZGUoIHAgKTtcblx0XHRcdHJlbW92ZU5vZGUoIHAubmV4dCApO1xuXG5cdFx0XHRwID0gc3RhcnQgPSBiO1xuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gc3RhcnQgKTtcblxuXHRyZXR1cm4gcDtcblxufVxuXG4vLyB0cnkgc3BsaXR0aW5nIHBvbHlnb24gaW50byB0d28gYW5kIHRyaWFuZ3VsYXRlIHRoZW0gaW5kZXBlbmRlbnRseVxuXG5mdW5jdGlvbiBzcGxpdEVhcmN1dCggc3RhcnQsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplICkge1xuXG5cdC8vIGxvb2sgZm9yIGEgdmFsaWQgZGlhZ29uYWwgdGhhdCBkaXZpZGVzIHRoZSBwb2x5Z29uIGludG8gdHdvXG5cblx0dmFyIGEgPSBzdGFydDtcblxuXHRkbyB7XG5cblx0XHR2YXIgYiA9IGEubmV4dC5uZXh0O1xuXG5cdFx0d2hpbGUgKCBiICE9PSBhLnByZXYgKSB7XG5cblx0XHRcdGlmICggYS5pICE9PSBiLmkgJiYgaXNWYWxpZERpYWdvbmFsKCBhLCBiICkgKSB7XG5cblx0XHRcdFx0Ly8gc3BsaXQgdGhlIHBvbHlnb24gaW4gdHdvIGJ5IHRoZSBkaWFnb25hbFxuXG5cdFx0XHRcdHZhciBjID0gc3BsaXRQb2x5Z29uKCBhLCBiICk7XG5cblx0XHRcdFx0Ly8gZmlsdGVyIGNvbGluZWFyIHBvaW50cyBhcm91bmQgdGhlIGN1dHNcblxuXHRcdFx0XHRhID0gZmlsdGVyUG9pbnRzKCBhLCBhLm5leHQgKTtcblx0XHRcdFx0YyA9IGZpbHRlclBvaW50cyggYywgYy5uZXh0ICk7XG5cblx0XHRcdFx0Ly8gcnVuIGVhcmN1dCBvbiBlYWNoIGhhbGZcblxuXHRcdFx0XHRlYXJjdXRMaW5rZWQoIGEsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cdFx0XHRcdGVhcmN1dExpbmtlZCggYywgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUgKTtcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHRcdGIgPSBiLm5leHQ7XG5cblx0XHR9XG5cblx0XHRhID0gYS5uZXh0O1xuXG5cdH0gd2hpbGUgKCBhICE9PSBzdGFydCApO1xuXG59XG5cbi8vIGxpbmsgZXZlcnkgaG9sZSBpbnRvIHRoZSBvdXRlciBsb29wLCBwcm9kdWNpbmcgYSBzaW5nbGUtcmluZyBwb2x5Z29uIHdpdGhvdXQgaG9sZXNcblxuZnVuY3Rpb24gZWxpbWluYXRlSG9sZXMoIGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSApIHtcblxuXHR2YXIgcXVldWUgPSBbXSwgaSwgbGVuLCBzdGFydCwgZW5kLCBsaXN0O1xuXG5cdGZvciAoIGkgPSAwLCBsZW4gPSBob2xlSW5kaWNlcy5sZW5ndGg7IGkgPCBsZW47IGkgKysgKSB7XG5cblx0XHRzdGFydCA9IGhvbGVJbmRpY2VzWyBpIF0gKiBkaW07XG5cdFx0ZW5kID0gaSA8IGxlbiAtIDEgPyBob2xlSW5kaWNlc1sgaSArIDEgXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xuXHRcdGxpc3QgPSBsaW5rZWRMaXN0KCBkYXRhLCBzdGFydCwgZW5kLCBkaW0sIGZhbHNlICk7XG5cdFx0aWYgKCBsaXN0ID09PSBsaXN0Lm5leHQgKSBsaXN0LnN0ZWluZXIgPSB0cnVlO1xuXHRcdHF1ZXVlLnB1c2goIGdldExlZnRtb3N0KCBsaXN0ICkgKTtcblxuXHR9XG5cblx0cXVldWUuc29ydCggY29tcGFyZVggKTtcblxuXHQvLyBwcm9jZXNzIGhvbGVzIGZyb20gbGVmdCB0byByaWdodFxuXG5cdGZvciAoIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0ZWxpbWluYXRlSG9sZSggcXVldWVbIGkgXSwgb3V0ZXJOb2RlICk7XG5cdFx0b3V0ZXJOb2RlID0gZmlsdGVyUG9pbnRzKCBvdXRlck5vZGUsIG91dGVyTm9kZS5uZXh0ICk7XG5cblx0fVxuXG5cdHJldHVybiBvdXRlck5vZGU7XG5cbn1cblxuZnVuY3Rpb24gY29tcGFyZVgoIGEsIGIgKSB7XG5cblx0cmV0dXJuIGEueCAtIGIueDtcblxufVxuXG4vLyBmaW5kIGEgYnJpZGdlIGJldHdlZW4gdmVydGljZXMgdGhhdCBjb25uZWN0cyBob2xlIHdpdGggYW4gb3V0ZXIgcmluZyBhbmQgYW5kIGxpbmsgaXRcblxuZnVuY3Rpb24gZWxpbWluYXRlSG9sZSggaG9sZSwgb3V0ZXJOb2RlICkge1xuXG5cdG91dGVyTm9kZSA9IGZpbmRIb2xlQnJpZGdlKCBob2xlLCBvdXRlck5vZGUgKTtcblxuXHRpZiAoIG91dGVyTm9kZSApIHtcblxuXHRcdHZhciBiID0gc3BsaXRQb2x5Z29uKCBvdXRlck5vZGUsIGhvbGUgKTtcblxuXHRcdGZpbHRlclBvaW50cyggYiwgYi5uZXh0ICk7XG5cblx0fVxuXG59XG5cbi8vIERhdmlkIEViZXJseSdzIGFsZ29yaXRobSBmb3IgZmluZGluZyBhIGJyaWRnZSBiZXR3ZWVuIGhvbGUgYW5kIG91dGVyIHBvbHlnb25cblxuZnVuY3Rpb24gZmluZEhvbGVCcmlkZ2UoIGhvbGUsIG91dGVyTm9kZSApIHtcblxuXHR2YXIgcCA9IG91dGVyTm9kZSxcblx0XHRoeCA9IGhvbGUueCxcblx0XHRoeSA9IGhvbGUueSxcblx0XHRxeCA9IC0gSW5maW5pdHksXG5cdFx0bTtcblxuXHQvLyBmaW5kIGEgc2VnbWVudCBpbnRlcnNlY3RlZCBieSBhIHJheSBmcm9tIHRoZSBob2xlJ3MgbGVmdG1vc3QgcG9pbnQgdG8gdGhlIGxlZnQ7XG5cdC8vIHNlZ21lbnQncyBlbmRwb2ludCB3aXRoIGxlc3NlciB4IHdpbGwgYmUgcG90ZW50aWFsIGNvbm5lY3Rpb24gcG9pbnRcblxuXHRkbyB7XG5cblx0XHRpZiAoIGh5IDw9IHAueSAmJiBoeSA+PSBwLm5leHQueSAmJiBwLm5leHQueSAhPT0gcC55ICkge1xuXG5cdFx0XHR2YXIgeCA9IHAueCArICggaHkgLSBwLnkgKSAqICggcC5uZXh0LnggLSBwLnggKSAvICggcC5uZXh0LnkgLSBwLnkgKTtcblxuXHRcdFx0aWYgKCB4IDw9IGh4ICYmIHggPiBxeCApIHtcblxuXHRcdFx0XHRxeCA9IHg7XG5cblx0XHRcdFx0aWYgKCB4ID09PSBoeCApIHtcblxuXHRcdFx0XHRcdGlmICggaHkgPT09IHAueSApIHJldHVybiBwO1xuXHRcdFx0XHRcdGlmICggaHkgPT09IHAubmV4dC55ICkgcmV0dXJuIHAubmV4dDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0bSA9IHAueCA8IHAubmV4dC54ID8gcCA6IHAubmV4dDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gb3V0ZXJOb2RlICk7XG5cblx0aWYgKCAhIG0gKSByZXR1cm4gbnVsbDtcblxuXHRpZiAoIGh4ID09PSBxeCApIHJldHVybiBtLnByZXY7IC8vIGhvbGUgdG91Y2hlcyBvdXRlciBzZWdtZW50OyBwaWNrIGxvd2VyIGVuZHBvaW50XG5cblx0Ly8gbG9vayBmb3IgcG9pbnRzIGluc2lkZSB0aGUgdHJpYW5nbGUgb2YgaG9sZSBwb2ludCwgc2VnbWVudCBpbnRlcnNlY3Rpb24gYW5kIGVuZHBvaW50O1xuXHQvLyBpZiB0aGVyZSBhcmUgbm8gcG9pbnRzIGZvdW5kLCB3ZSBoYXZlIGEgdmFsaWQgY29ubmVjdGlvbjtcblx0Ly8gb3RoZXJ3aXNlIGNob29zZSB0aGUgcG9pbnQgb2YgdGhlIG1pbmltdW0gYW5nbGUgd2l0aCB0aGUgcmF5IGFzIGNvbm5lY3Rpb24gcG9pbnRcblxuXHR2YXIgc3RvcCA9IG0sXG5cdFx0bXggPSBtLngsXG5cdFx0bXkgPSBtLnksXG5cdFx0dGFuTWluID0gSW5maW5pdHksXG5cdFx0dGFuO1xuXG5cdHAgPSBtLm5leHQ7XG5cblx0d2hpbGUgKCBwICE9PSBzdG9wICkge1xuXG5cdFx0aWYgKCBoeCA+PSBwLnggJiYgcC54ID49IG14ICYmIGh4ICE9PSBwLnggJiZcblx0XHRcdFx0XHRcdHBvaW50SW5UcmlhbmdsZSggaHkgPCBteSA/IGh4IDogcXgsIGh5LCBteCwgbXksIGh5IDwgbXkgPyBxeCA6IGh4LCBoeSwgcC54LCBwLnkgKSApIHtcblxuXHRcdFx0dGFuID0gTWF0aC5hYnMoIGh5IC0gcC55ICkgLyAoIGh4IC0gcC54ICk7IC8vIHRhbmdlbnRpYWxcblxuXHRcdFx0aWYgKCAoIHRhbiA8IHRhbk1pbiB8fCAoIHRhbiA9PT0gdGFuTWluICYmIHAueCA+IG0ueCApICkgJiYgbG9jYWxseUluc2lkZSggcCwgaG9sZSApICkge1xuXG5cdFx0XHRcdG0gPSBwO1xuXHRcdFx0XHR0YW5NaW4gPSB0YW47XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHAgPSBwLm5leHQ7XG5cblx0fVxuXG5cdHJldHVybiBtO1xuXG59XG5cbi8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXJcblxuZnVuY3Rpb24gaW5kZXhDdXJ2ZSggc3RhcnQsIG1pblgsIG1pblksIGludlNpemUgKSB7XG5cblx0dmFyIHAgPSBzdGFydDtcblxuXHRkbyB7XG5cblx0XHRpZiAoIHAueiA9PT0gbnVsbCApIHAueiA9IHpPcmRlciggcC54LCBwLnksIG1pblgsIG1pblksIGludlNpemUgKTtcblx0XHRwLnByZXZaID0gcC5wcmV2O1xuXHRcdHAubmV4dFogPSBwLm5leHQ7XG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gc3RhcnQgKTtcblxuXHRwLnByZXZaLm5leHRaID0gbnVsbDtcblx0cC5wcmV2WiA9IG51bGw7XG5cblx0c29ydExpbmtlZCggcCApO1xuXG59XG5cbi8vIFNpbW9uIFRhdGhhbSdzIGxpbmtlZCBsaXN0IG1lcmdlIHNvcnQgYWxnb3JpdGhtXG4vLyBodHRwOi8vd3d3LmNoaWFyay5ncmVlbmVuZC5vcmcudWsvfnNndGF0aGFtL2FsZ29yaXRobXMvbGlzdHNvcnQuaHRtbFxuXG5mdW5jdGlvbiBzb3J0TGlua2VkKCBsaXN0ICkge1xuXG5cdHZhciBpLCBwLCBxLCBlLCB0YWlsLCBudW1NZXJnZXMsIHBTaXplLCBxU2l6ZSwgaW5TaXplID0gMTtcblxuXHRkbyB7XG5cblx0XHRwID0gbGlzdDtcblx0XHRsaXN0ID0gbnVsbDtcblx0XHR0YWlsID0gbnVsbDtcblx0XHRudW1NZXJnZXMgPSAwO1xuXG5cdFx0d2hpbGUgKCBwICkge1xuXG5cdFx0XHRudW1NZXJnZXMgKys7XG5cdFx0XHRxID0gcDtcblx0XHRcdHBTaXplID0gMDtcblxuXHRcdFx0Zm9yICggaSA9IDA7IGkgPCBpblNpemU7IGkgKysgKSB7XG5cblx0XHRcdFx0cFNpemUgKys7XG5cdFx0XHRcdHEgPSBxLm5leHRaO1xuXHRcdFx0XHRpZiAoICEgcSApIGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHRcdHFTaXplID0gaW5TaXplO1xuXG5cdFx0XHR3aGlsZSAoIHBTaXplID4gMCB8fCAoIHFTaXplID4gMCAmJiBxICkgKSB7XG5cblx0XHRcdFx0aWYgKCBwU2l6ZSAhPT0gMCAmJiAoIHFTaXplID09PSAwIHx8ICEgcSB8fCBwLnogPD0gcS56ICkgKSB7XG5cblx0XHRcdFx0XHRlID0gcDtcblx0XHRcdFx0XHRwID0gcC5uZXh0Wjtcblx0XHRcdFx0XHRwU2l6ZSAtLTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0ZSA9IHE7XG5cdFx0XHRcdFx0cSA9IHEubmV4dFo7XG5cdFx0XHRcdFx0cVNpemUgLS07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdGFpbCApIHRhaWwubmV4dFogPSBlO1xuXHRcdFx0XHRlbHNlIGxpc3QgPSBlO1xuXG5cdFx0XHRcdGUucHJldlogPSB0YWlsO1xuXHRcdFx0XHR0YWlsID0gZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRwID0gcTtcblxuXHRcdH1cblxuXHRcdHRhaWwubmV4dFogPSBudWxsO1xuXHRcdGluU2l6ZSAqPSAyO1xuXG5cdH0gd2hpbGUgKCBudW1NZXJnZXMgPiAxICk7XG5cblx0cmV0dXJuIGxpc3Q7XG5cbn1cblxuLy8gei1vcmRlciBvZiBhIHBvaW50IGdpdmVuIGNvb3JkcyBhbmQgaW52ZXJzZSBvZiB0aGUgbG9uZ2VyIHNpZGUgb2YgZGF0YSBiYm94XG5cbmZ1bmN0aW9uIHpPcmRlciggeCwgeSwgbWluWCwgbWluWSwgaW52U2l6ZSApIHtcblxuXHQvLyBjb29yZHMgYXJlIHRyYW5zZm9ybWVkIGludG8gbm9uLW5lZ2F0aXZlIDE1LWJpdCBpbnRlZ2VyIHJhbmdlXG5cblx0eCA9IDMyNzY3ICogKCB4IC0gbWluWCApICogaW52U2l6ZTtcblx0eSA9IDMyNzY3ICogKCB5IC0gbWluWSApICogaW52U2l6ZTtcblxuXHR4ID0gKCB4IHwgKCB4IDw8IDggKSApICYgMHgwMEZGMDBGRjtcblx0eCA9ICggeCB8ICggeCA8PCA0ICkgKSAmIDB4MEYwRjBGMEY7XG5cdHggPSAoIHggfCAoIHggPDwgMiApICkgJiAweDMzMzMzMzMzO1xuXHR4ID0gKCB4IHwgKCB4IDw8IDEgKSApICYgMHg1NTU1NTU1NTtcblxuXHR5ID0gKCB5IHwgKCB5IDw8IDggKSApICYgMHgwMEZGMDBGRjtcblx0eSA9ICggeSB8ICggeSA8PCA0ICkgKSAmIDB4MEYwRjBGMEY7XG5cdHkgPSAoIHkgfCAoIHkgPDwgMiApICkgJiAweDMzMzMzMzMzO1xuXHR5ID0gKCB5IHwgKCB5IDw8IDEgKSApICYgMHg1NTU1NTU1NTtcblxuXHRyZXR1cm4geCB8ICggeSA8PCAxICk7XG5cbn1cblxuLy8gZmluZCB0aGUgbGVmdG1vc3Qgbm9kZSBvZiBhIHBvbHlnb24gcmluZ1xuXG5mdW5jdGlvbiBnZXRMZWZ0bW9zdCggc3RhcnQgKSB7XG5cblx0dmFyIHAgPSBzdGFydCwgbGVmdG1vc3QgPSBzdGFydDtcblxuXHRkbyB7XG5cblx0XHRpZiAoIHAueCA8IGxlZnRtb3N0LnggKSBsZWZ0bW9zdCA9IHA7XG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gc3RhcnQgKTtcblxuXHRyZXR1cm4gbGVmdG1vc3Q7XG5cbn1cblxuLy8gY2hlY2sgaWYgYSBwb2ludCBsaWVzIHdpdGhpbiBhIGNvbnZleCB0cmlhbmdsZVxuXG5mdW5jdGlvbiBwb2ludEluVHJpYW5nbGUoIGF4LCBheSwgYngsIGJ5LCBjeCwgY3ksIHB4LCBweSApIHtcblxuXHRyZXR1cm4gKCBjeCAtIHB4ICkgKiAoIGF5IC0gcHkgKSAtICggYXggLSBweCApICogKCBjeSAtIHB5ICkgPj0gMCAmJlxuXHQgKCBheCAtIHB4ICkgKiAoIGJ5IC0gcHkgKSAtICggYnggLSBweCApICogKCBheSAtIHB5ICkgPj0gMCAmJlxuXHQgKCBieCAtIHB4ICkgKiAoIGN5IC0gcHkgKSAtICggY3ggLSBweCApICogKCBieSAtIHB5ICkgPj0gMDtcblxufVxuXG4vLyBjaGVjayBpZiBhIGRpYWdvbmFsIGJldHdlZW4gdHdvIHBvbHlnb24gbm9kZXMgaXMgdmFsaWQgKGxpZXMgaW4gcG9seWdvbiBpbnRlcmlvcilcblxuZnVuY3Rpb24gaXNWYWxpZERpYWdvbmFsKCBhLCBiICkge1xuXG5cdHJldHVybiBhLm5leHQuaSAhPT0gYi5pICYmIGEucHJldi5pICE9PSBiLmkgJiYgISBpbnRlcnNlY3RzUG9seWdvbiggYSwgYiApICYmXG5cdFx0bG9jYWxseUluc2lkZSggYSwgYiApICYmIGxvY2FsbHlJbnNpZGUoIGIsIGEgKSAmJiBtaWRkbGVJbnNpZGUoIGEsIGIgKTtcblxufVxuXG4vLyBzaWduZWQgYXJlYSBvZiBhIHRyaWFuZ2xlXG5cbmZ1bmN0aW9uIGFyZWEoIHAsIHEsIHIgKSB7XG5cblx0cmV0dXJuICggcS55IC0gcC55ICkgKiAoIHIueCAtIHEueCApIC0gKCBxLnggLSBwLnggKSAqICggci55IC0gcS55ICk7XG5cbn1cblxuLy8gY2hlY2sgaWYgdHdvIHBvaW50cyBhcmUgZXF1YWxcblxuZnVuY3Rpb24gZXF1YWxzKCBwMSwgcDIgKSB7XG5cblx0cmV0dXJuIHAxLnggPT09IHAyLnggJiYgcDEueSA9PT0gcDIueTtcblxufVxuXG4vLyBjaGVjayBpZiB0d28gc2VnbWVudHMgaW50ZXJzZWN0XG5cbmZ1bmN0aW9uIGludGVyc2VjdHMoIHAxLCBxMSwgcDIsIHEyICkge1xuXG5cdGlmICggKCBlcXVhbHMoIHAxLCBxMSApICYmIGVxdWFscyggcDIsIHEyICkgKSB8fFxuXHRcdFx0KCBlcXVhbHMoIHAxLCBxMiApICYmIGVxdWFscyggcDIsIHExICkgKSApIHJldHVybiB0cnVlO1xuXG5cdHJldHVybiBhcmVhKCBwMSwgcTEsIHAyICkgPiAwICE9PSBhcmVhKCBwMSwgcTEsIHEyICkgPiAwICYmXG5cdFx0XHRcdCBhcmVhKCBwMiwgcTIsIHAxICkgPiAwICE9PSBhcmVhKCBwMiwgcTIsIHExICkgPiAwO1xuXG59XG5cbi8vIGNoZWNrIGlmIGEgcG9seWdvbiBkaWFnb25hbCBpbnRlcnNlY3RzIGFueSBwb2x5Z29uIHNlZ21lbnRzXG5cbmZ1bmN0aW9uIGludGVyc2VjdHNQb2x5Z29uKCBhLCBiICkge1xuXG5cdHZhciBwID0gYTtcblxuXHRkbyB7XG5cblx0XHRpZiAoIHAuaSAhPT0gYS5pICYmIHAubmV4dC5pICE9PSBhLmkgJiYgcC5pICE9PSBiLmkgJiYgcC5uZXh0LmkgIT09IGIuaSAmJlxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0cyggcCwgcC5uZXh0LCBhLCBiICkgKSB7XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gYSApO1xuXG5cdHJldHVybiBmYWxzZTtcblxufVxuXG4vLyBjaGVjayBpZiBhIHBvbHlnb24gZGlhZ29uYWwgaXMgbG9jYWxseSBpbnNpZGUgdGhlIHBvbHlnb25cblxuZnVuY3Rpb24gbG9jYWxseUluc2lkZSggYSwgYiApIHtcblxuXHRyZXR1cm4gYXJlYSggYS5wcmV2LCBhLCBhLm5leHQgKSA8IDAgP1xuXHRcdGFyZWEoIGEsIGIsIGEubmV4dCApID49IDAgJiYgYXJlYSggYSwgYS5wcmV2LCBiICkgPj0gMCA6XG5cdFx0YXJlYSggYSwgYiwgYS5wcmV2ICkgPCAwIHx8IGFyZWEoIGEsIGEubmV4dCwgYiApIDwgMDtcblxufVxuXG4vLyBjaGVjayBpZiB0aGUgbWlkZGxlIHBvaW50IG9mIGEgcG9seWdvbiBkaWFnb25hbCBpcyBpbnNpZGUgdGhlIHBvbHlnb25cblxuZnVuY3Rpb24gbWlkZGxlSW5zaWRlKCBhLCBiICkge1xuXG5cdHZhciBwID0gYSxcblx0XHRpbnNpZGUgPSBmYWxzZSxcblx0XHRweCA9ICggYS54ICsgYi54ICkgLyAyLFxuXHRcdHB5ID0gKCBhLnkgKyBiLnkgKSAvIDI7XG5cblx0ZG8ge1xuXG5cdFx0aWYgKCAoICggcC55ID4gcHkgKSAhPT0gKCBwLm5leHQueSA+IHB5ICkgKSAmJiBwLm5leHQueSAhPT0gcC55ICYmXG5cdFx0XHRcdFx0XHQoIHB4IDwgKCBwLm5leHQueCAtIHAueCApICogKCBweSAtIHAueSApIC8gKCBwLm5leHQueSAtIHAueSApICsgcC54ICkgKSB7XG5cblx0XHRcdGluc2lkZSA9ICEgaW5zaWRlO1xuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gYSApO1xuXG5cdHJldHVybiBpbnNpZGU7XG5cbn1cblxuLy8gbGluayB0d28gcG9seWdvbiB2ZXJ0aWNlcyB3aXRoIGEgYnJpZGdlOyBpZiB0aGUgdmVydGljZXMgYmVsb25nIHRvIHRoZSBzYW1lIHJpbmcsIGl0IHNwbGl0cyBwb2x5Z29uIGludG8gdHdvO1xuLy8gaWYgb25lIGJlbG9uZ3MgdG8gdGhlIG91dGVyIHJpbmcgYW5kIGFub3RoZXIgdG8gYSBob2xlLCBpdCBtZXJnZXMgaXQgaW50byBhIHNpbmdsZSByaW5nXG5cbmZ1bmN0aW9uIHNwbGl0UG9seWdvbiggYSwgYiApIHtcblxuXHR2YXIgYTIgPSBuZXcgTm9kZSggYS5pLCBhLngsIGEueSApLFxuXHRcdGIyID0gbmV3IE5vZGUoIGIuaSwgYi54LCBiLnkgKSxcblx0XHRhbiA9IGEubmV4dCxcblx0XHRicCA9IGIucHJldjtcblxuXHRhLm5leHQgPSBiO1xuXHRiLnByZXYgPSBhO1xuXG5cdGEyLm5leHQgPSBhbjtcblx0YW4ucHJldiA9IGEyO1xuXG5cdGIyLm5leHQgPSBhMjtcblx0YTIucHJldiA9IGIyO1xuXG5cdGJwLm5leHQgPSBiMjtcblx0YjIucHJldiA9IGJwO1xuXG5cdHJldHVybiBiMjtcblxufVxuXG4vLyBjcmVhdGUgYSBub2RlIGFuZCBvcHRpb25hbGx5IGxpbmsgaXQgd2l0aCBwcmV2aW91cyBvbmUgKGluIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0KVxuXG5mdW5jdGlvbiBpbnNlcnROb2RlKCBpLCB4LCB5LCBsYXN0ICkge1xuXG5cdHZhciBwID0gbmV3IE5vZGUoIGksIHgsIHkgKTtcblxuXHRpZiAoICEgbGFzdCApIHtcblxuXHRcdHAucHJldiA9IHA7XG5cdFx0cC5uZXh0ID0gcDtcblxuXHR9IGVsc2Uge1xuXG5cdFx0cC5uZXh0ID0gbGFzdC5uZXh0O1xuXHRcdHAucHJldiA9IGxhc3Q7XG5cdFx0bGFzdC5uZXh0LnByZXYgPSBwO1xuXHRcdGxhc3QubmV4dCA9IHA7XG5cblx0fVxuXG5cdHJldHVybiBwO1xuXG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5vZGUoIHAgKSB7XG5cblx0cC5uZXh0LnByZXYgPSBwLnByZXY7XG5cdHAucHJldi5uZXh0ID0gcC5uZXh0O1xuXG5cdGlmICggcC5wcmV2WiApIHAucHJldloubmV4dFogPSBwLm5leHRaO1xuXHRpZiAoIHAubmV4dFogKSBwLm5leHRaLnByZXZaID0gcC5wcmV2WjtcblxufVxuXG5mdW5jdGlvbiBOb2RlKCBpLCB4LCB5ICkge1xuXG5cdC8vIHZlcnRpY2UgaW5kZXggaW4gY29vcmRpbmF0ZXMgYXJyYXlcblx0dGhpcy5pID0gaTtcblxuXHQvLyB2ZXJ0ZXggY29vcmRpbmF0ZXNcblx0dGhpcy54ID0geDtcblx0dGhpcy55ID0geTtcblxuXHQvLyBwcmV2aW91cyBhbmQgbmV4dCB2ZXJ0aWNlIG5vZGVzIGluIGEgcG9seWdvbiByaW5nXG5cdHRoaXMucHJldiA9IG51bGw7XG5cdHRoaXMubmV4dCA9IG51bGw7XG5cblx0Ly8gei1vcmRlciBjdXJ2ZSB2YWx1ZVxuXHR0aGlzLnogPSBudWxsO1xuXG5cdC8vIHByZXZpb3VzIGFuZCBuZXh0IG5vZGVzIGluIHotb3JkZXJcblx0dGhpcy5wcmV2WiA9IG51bGw7XG5cdHRoaXMubmV4dFogPSBudWxsO1xuXG5cdC8vIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYSBzdGVpbmVyIHBvaW50XG5cdHRoaXMuc3RlaW5lciA9IGZhbHNlO1xuXG59XG5cbmZ1bmN0aW9uIHNpZ25lZEFyZWEoIGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSApIHtcblxuXHR2YXIgc3VtID0gMDtcblxuXHRmb3IgKCB2YXIgaSA9IHN0YXJ0LCBqID0gZW5kIC0gZGltOyBpIDwgZW5kOyBpICs9IGRpbSApIHtcblxuXHRcdHN1bSArPSAoIGRhdGFbIGogXSAtIGRhdGFbIGkgXSApICogKCBkYXRhWyBpICsgMSBdICsgZGF0YVsgaiArIDEgXSApO1xuXHRcdGogPSBpO1xuXG5cdH1cblxuXHRyZXR1cm4gc3VtO1xuXG59XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICovXG5cbnZhciBTaGFwZVV0aWxzID0ge1xuXG5cdC8vIGNhbGN1bGF0ZSBhcmVhIG9mIHRoZSBjb250b3VyIHBvbHlnb25cblxuXHRhcmVhOiBmdW5jdGlvbiAoIGNvbnRvdXIgKSB7XG5cblx0XHR2YXIgbiA9IGNvbnRvdXIubGVuZ3RoO1xuXHRcdHZhciBhID0gMC4wO1xuXG5cdFx0Zm9yICggdmFyIHAgPSBuIC0gMSwgcSA9IDA7IHEgPCBuOyBwID0gcSArKyApIHtcblxuXHRcdFx0YSArPSBjb250b3VyWyBwIF0ueCAqIGNvbnRvdXJbIHEgXS55IC0gY29udG91clsgcSBdLnggKiBjb250b3VyWyBwIF0ueTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBhICogMC41O1xuXG5cdH0sXG5cblx0aXNDbG9ja1dpc2U6IGZ1bmN0aW9uICggcHRzICkge1xuXG5cdFx0cmV0dXJuIFNoYXBlVXRpbHMuYXJlYSggcHRzICkgPCAwO1xuXG5cdH0sXG5cblx0dHJpYW5ndWxhdGVTaGFwZTogZnVuY3Rpb24gKCBjb250b3VyLCBob2xlcyApIHtcblxuXHRcdHZhciB2ZXJ0aWNlcyA9IFtdOyAvLyBmbGF0IGFycmF5IG9mIHZlcnRpY2VzIGxpa2UgWyB4MCx5MCwgeDEseTEsIHgyLHkyLCAuLi4gXVxuXHRcdHZhciBob2xlSW5kaWNlcyA9IFtdOyAvLyBhcnJheSBvZiBob2xlIGluZGljZXNcblx0XHR2YXIgZmFjZXMgPSBbXTsgLy8gZmluYWwgYXJyYXkgb2YgdmVydGV4IGluZGljZXMgbGlrZSBbIFsgYSxiLGQgXSwgWyBiLGMsZCBdIF1cblxuXHRcdHJlbW92ZUR1cEVuZFB0cyggY29udG91ciApO1xuXHRcdGFkZENvbnRvdXIoIHZlcnRpY2VzLCBjb250b3VyICk7XG5cblx0XHQvL1xuXG5cdFx0dmFyIGhvbGVJbmRleCA9IGNvbnRvdXIubGVuZ3RoO1xuXG5cdFx0aG9sZXMuZm9yRWFjaCggcmVtb3ZlRHVwRW5kUHRzICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBob2xlcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGhvbGVJbmRpY2VzLnB1c2goIGhvbGVJbmRleCApO1xuXHRcdFx0aG9sZUluZGV4ICs9IGhvbGVzWyBpIF0ubGVuZ3RoO1xuXHRcdFx0YWRkQ29udG91ciggdmVydGljZXMsIGhvbGVzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHR2YXIgdHJpYW5nbGVzID0gRWFyY3V0LnRyaWFuZ3VsYXRlKCB2ZXJ0aWNlcywgaG9sZUluZGljZXMgKTtcblxuXHRcdC8vXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0cmlhbmdsZXMubGVuZ3RoOyBpICs9IDMgKSB7XG5cblx0XHRcdGZhY2VzLnB1c2goIHRyaWFuZ2xlcy5zbGljZSggaSwgaSArIDMgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhY2VzO1xuXG5cdH1cblxufTtcblxuZnVuY3Rpb24gcmVtb3ZlRHVwRW5kUHRzKCBwb2ludHMgKSB7XG5cblx0dmFyIGwgPSBwb2ludHMubGVuZ3RoO1xuXG5cdGlmICggbCA+IDIgJiYgcG9pbnRzWyBsIC0gMSBdLmVxdWFscyggcG9pbnRzWyAwIF0gKSApIHtcblxuXHRcdHBvaW50cy5wb3AoKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gYWRkQ29udG91ciggdmVydGljZXMsIGNvbnRvdXIgKSB7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpIDwgY29udG91ci5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHR2ZXJ0aWNlcy5wdXNoKCBjb250b3VyWyBpIF0ueCApO1xuXHRcdHZlcnRpY2VzLnB1c2goIGNvbnRvdXJbIGkgXS55ICk7XG5cblx0fVxuXG59XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICpcbiAqIENyZWF0ZXMgZXh0cnVkZWQgZ2VvbWV0cnkgZnJvbSBhIHBhdGggc2hhcGUuXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqXG4gKiAgY3VydmVTZWdtZW50czogPGludD4sIC8vIG51bWJlciBvZiBwb2ludHMgb24gdGhlIGN1cnZlc1xuICogIHN0ZXBzOiA8aW50PiwgLy8gbnVtYmVyIG9mIHBvaW50cyBmb3Igei1zaWRlIGV4dHJ1c2lvbnMgLyB1c2VkIGZvciBzdWJkaXZpZGluZyBzZWdtZW50cyBvZiBleHRydWRlIHNwbGluZSB0b29cbiAqICBhbW91bnQ6IDxpbnQ+LCAvLyBEZXB0aCB0byBleHRydWRlIHRoZSBzaGFwZVxuICpcbiAqICBiZXZlbEVuYWJsZWQ6IDxib29sPiwgLy8gdHVybiBvbiBiZXZlbFxuICogIGJldmVsVGhpY2tuZXNzOiA8ZmxvYXQ+LCAvLyBob3cgZGVlcCBpbnRvIHRoZSBvcmlnaW5hbCBzaGFwZSBiZXZlbCBnb2VzXG4gKiAgYmV2ZWxTaXplOiA8ZmxvYXQ+LCAvLyBob3cgZmFyIGZyb20gc2hhcGUgb3V0bGluZSBpcyBiZXZlbFxuICogIGJldmVsU2VnbWVudHM6IDxpbnQ+LCAvLyBudW1iZXIgb2YgYmV2ZWwgbGF5ZXJzXG4gKlxuICogIGV4dHJ1ZGVQYXRoOiA8VEhSRUUuQ3VydmU+IC8vIGN1cnZlIHRvIGV4dHJ1ZGUgc2hhcGUgYWxvbmdcbiAqXG4gKiAgVVZHZW5lcmF0b3I6IDxPYmplY3Q+IC8vIG9iamVjdCB0aGF0IHByb3ZpZGVzIFVWIGdlbmVyYXRvciBmdW5jdGlvbnNcbiAqXG4gKiB9XG4gKi9cblxuLy8gRXh0cnVkZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIEV4dHJ1ZGVHZW9tZXRyeSggc2hhcGVzLCBvcHRpb25zICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnRXh0cnVkZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0c2hhcGVzOiBzaGFwZXMsXG5cdFx0b3B0aW9uczogb3B0aW9uc1xuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgRXh0cnVkZUJ1ZmZlckdlb21ldHJ5KCBzaGFwZXMsIG9wdGlvbnMgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5FeHRydWRlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5FeHRydWRlR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRXh0cnVkZUdlb21ldHJ5O1xuXG4vLyBFeHRydWRlQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gRXh0cnVkZUJ1ZmZlckdlb21ldHJ5KCBzaGFwZXMsIG9wdGlvbnMgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdFeHRydWRlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRzaGFwZXM6IHNoYXBlcyxcblx0XHRvcHRpb25zOiBvcHRpb25zXG5cdH07XG5cblx0c2hhcGVzID0gQXJyYXkuaXNBcnJheSggc2hhcGVzICkgPyBzaGFwZXMgOiBbIHNoYXBlcyBdO1xuXG5cdHZhciBzY29wZSA9IHRoaXM7XG5cblx0dmFyIHZlcnRpY2VzQXJyYXkgPSBbXTtcblx0dmFyIHV2QXJyYXkgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBzaGFwZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdHZhciBzaGFwZSA9IHNoYXBlc1sgaSBdO1xuXHRcdGFkZFNoYXBlKCBzaGFwZSwgb3B0aW9ucyApO1xuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXNBcnJheSwgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZBcnJheSwgMiApICk7XG5cblx0dGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpO1xuXG5cdC8vIGZ1bmN0aW9uc1xuXG5cdGZ1bmN0aW9uIGFkZFNoYXBlKCBzaGFwZSApIHtcblxuXHRcdHZhciBwbGFjZWhvbGRlciA9IFtdO1xuXG5cdFx0Ly8gb3B0aW9uc1xuXG5cdFx0dmFyIGN1cnZlU2VnbWVudHMgPSBvcHRpb25zLmN1cnZlU2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY3VydmVTZWdtZW50cyA6IDEyO1xuXHRcdHZhciBzdGVwcyA9IG9wdGlvbnMuc3RlcHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuc3RlcHMgOiAxO1xuXHRcdHZhciBhbW91bnQgPSBvcHRpb25zLmFtb3VudCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5hbW91bnQgOiAxMDA7XG5cblx0XHR2YXIgYmV2ZWxFbmFibGVkID0gb3B0aW9ucy5iZXZlbEVuYWJsZWQgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYmV2ZWxFbmFibGVkIDogdHJ1ZTtcblx0XHR2YXIgYmV2ZWxUaGlja25lc3MgPSBvcHRpb25zLmJldmVsVGhpY2tuZXNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsVGhpY2tuZXNzIDogNjtcblx0XHR2YXIgYmV2ZWxTaXplID0gb3B0aW9ucy5iZXZlbFNpemUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYmV2ZWxTaXplIDogYmV2ZWxUaGlja25lc3MgLSAyO1xuXHRcdHZhciBiZXZlbFNlZ21lbnRzID0gb3B0aW9ucy5iZXZlbFNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsU2VnbWVudHMgOiAzO1xuXG5cdFx0dmFyIGV4dHJ1ZGVQYXRoID0gb3B0aW9ucy5leHRydWRlUGF0aDtcblxuXHRcdHZhciB1dmdlbiA9IG9wdGlvbnMuVVZHZW5lcmF0b3IgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuVVZHZW5lcmF0b3IgOiBXb3JsZFVWR2VuZXJhdG9yO1xuXG5cdFx0Ly9cblxuXHRcdHZhciBleHRydWRlUHRzLCBleHRydWRlQnlQYXRoID0gZmFsc2U7XG5cdFx0dmFyIHNwbGluZVR1YmUsIGJpbm9ybWFsLCBub3JtYWwsIHBvc2l0aW9uMjtcblxuXHRcdGlmICggZXh0cnVkZVBhdGggKSB7XG5cblx0XHRcdGV4dHJ1ZGVQdHMgPSBleHRydWRlUGF0aC5nZXRTcGFjZWRQb2ludHMoIHN0ZXBzICk7XG5cblx0XHRcdGV4dHJ1ZGVCeVBhdGggPSB0cnVlO1xuXHRcdFx0YmV2ZWxFbmFibGVkID0gZmFsc2U7IC8vIGJldmVscyBub3Qgc3VwcG9ydGVkIGZvciBwYXRoIGV4dHJ1c2lvblxuXG5cdFx0XHQvLyBTRVRVUCBUTkIgdmFyaWFibGVzXG5cblx0XHRcdC8vIFRPRE8xIC0gaGF2ZSBhIC5pc0Nsb3NlZCBpbiBzcGxpbmU/XG5cblx0XHRcdHNwbGluZVR1YmUgPSBleHRydWRlUGF0aC5jb21wdXRlRnJlbmV0RnJhbWVzKCBzdGVwcywgZmFsc2UgKTtcblxuXHRcdFx0Ly8gY29uc29sZS5sb2coc3BsaW5lVHViZSwgJ3NwbGluZVR1YmUnLCBzcGxpbmVUdWJlLm5vcm1hbHMubGVuZ3RoLCAnc3RlcHMnLCBzdGVwcywgJ2V4dHJ1ZGVQdHMnLCBleHRydWRlUHRzLmxlbmd0aCk7XG5cblx0XHRcdGJpbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHRwb3NpdGlvbjIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gU2FmZWd1YXJkcyBpZiBiZXZlbHMgYXJlIG5vdCBlbmFibGVkXG5cblx0XHRpZiAoICEgYmV2ZWxFbmFibGVkICkge1xuXG5cdFx0XHRiZXZlbFNlZ21lbnRzID0gMDtcblx0XHRcdGJldmVsVGhpY2tuZXNzID0gMDtcblx0XHRcdGJldmVsU2l6ZSA9IDA7XG5cblx0XHR9XG5cblx0XHQvLyBWYXJpYWJsZXMgaW5pdGlhbGl6YXRpb25cblxuXHRcdHZhciBhaG9sZSwgaCwgaGw7IC8vIGxvb3Bpbmcgb2YgaG9sZXNcblxuXHRcdHZhciBzaGFwZVBvaW50cyA9IHNoYXBlLmV4dHJhY3RQb2ludHMoIGN1cnZlU2VnbWVudHMgKTtcblxuXHRcdHZhciB2ZXJ0aWNlcyA9IHNoYXBlUG9pbnRzLnNoYXBlO1xuXHRcdHZhciBob2xlcyA9IHNoYXBlUG9pbnRzLmhvbGVzO1xuXG5cdFx0dmFyIHJldmVyc2UgPSAhIFNoYXBlVXRpbHMuaXNDbG9ja1dpc2UoIHZlcnRpY2VzICk7XG5cblx0XHRpZiAoIHJldmVyc2UgKSB7XG5cblx0XHRcdHZlcnRpY2VzID0gdmVydGljZXMucmV2ZXJzZSgpO1xuXG5cdFx0XHQvLyBNYXliZSB3ZSBzaG91bGQgYWxzbyBjaGVjayBpZiBob2xlcyBhcmUgaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbiwganVzdCB0byBiZSBzYWZlIC4uLlxuXG5cdFx0XHRmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0XHRhaG9sZSA9IGhvbGVzWyBoIF07XG5cblx0XHRcdFx0aWYgKCBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCBhaG9sZSApICkge1xuXG5cdFx0XHRcdFx0aG9sZXNbIGggXSA9IGFob2xlLnJldmVyc2UoKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXG5cdFx0dmFyIGZhY2VzID0gU2hhcGVVdGlscy50cmlhbmd1bGF0ZVNoYXBlKCB2ZXJ0aWNlcywgaG9sZXMgKTtcblxuXHRcdC8qIFZlcnRpY2VzICovXG5cblx0XHR2YXIgY29udG91ciA9IHZlcnRpY2VzOyAvLyB2ZXJ0aWNlcyBoYXMgYWxsIHBvaW50cyBidXQgY29udG91ciBoYXMgb25seSBwb2ludHMgb2YgY2lyY3VtZmVyZW5jZVxuXG5cdFx0Zm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdGFob2xlID0gaG9sZXNbIGggXTtcblxuXHRcdFx0dmVydGljZXMgPSB2ZXJ0aWNlcy5jb25jYXQoIGFob2xlICk7XG5cblx0XHR9XG5cblxuXHRcdGZ1bmN0aW9uIHNjYWxlUHQyKCBwdCwgdmVjLCBzaXplICkge1xuXG5cdFx0XHRpZiAoICEgdmVjICkgY29uc29sZS5lcnJvciggXCJUSFJFRS5FeHRydWRlR2VvbWV0cnk6IHZlYyBkb2VzIG5vdCBleGlzdFwiICk7XG5cblx0XHRcdHJldHVybiB2ZWMuY2xvbmUoKS5tdWx0aXBseVNjYWxhciggc2l6ZSApLmFkZCggcHQgKTtcblxuXHRcdH1cblxuXHRcdHZhciBiLCBicywgdCwgeixcblx0XHRcdHZlcnQsIHZsZW4gPSB2ZXJ0aWNlcy5sZW5ndGgsXG5cdFx0XHRmYWNlLCBmbGVuID0gZmFjZXMubGVuZ3RoO1xuXG5cblx0XHQvLyBGaW5kIGRpcmVjdGlvbnMgZm9yIHBvaW50IG1vdmVtZW50XG5cblxuXHRcdGZ1bmN0aW9uIGdldEJldmVsVmVjKCBpblB0LCBpblByZXYsIGluTmV4dCApIHtcblxuXHRcdFx0Ly8gY29tcHV0ZXMgZm9yIGluUHQgdGhlIGNvcnJlc3BvbmRpbmcgcG9pbnQgaW5QdCcgb24gYSBuZXcgY29udG91clxuXHRcdFx0Ly8gICBzaGlmdGVkIGJ5IDEgdW5pdCAobGVuZ3RoIG9mIG5vcm1hbGl6ZWQgdmVjdG9yKSB0byB0aGUgbGVmdFxuXHRcdFx0Ly8gaWYgd2Ugd2FsayBhbG9uZyBjb250b3VyIGNsb2Nrd2lzZSwgdGhpcyBuZXcgY29udG91ciBpcyBvdXRzaWRlIHRoZSBvbGQgb25lXG5cdFx0XHQvL1xuXHRcdFx0Ly8gaW5QdCcgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgdHdvIGxpbmVzIHBhcmFsbGVsIHRvIHRoZSB0d29cblx0XHRcdC8vICBhZGphY2VudCBlZGdlcyBvZiBpblB0IGF0IGEgZGlzdGFuY2Ugb2YgMSB1bml0IG9uIHRoZSBsZWZ0IHNpZGUuXG5cblx0XHRcdHZhciB2X3RyYW5zX3gsIHZfdHJhbnNfeSwgc2hyaW5rX2J5OyAvLyByZXN1bHRpbmcgdHJhbnNsYXRpb24gdmVjdG9yIGZvciBpblB0XG5cblx0XHRcdC8vIGdvb2QgcmVhZGluZyBmb3IgZ2VvbWV0cnkgYWxnb3JpdGhtcyAoaGVyZTogbGluZS1saW5lIGludGVyc2VjdGlvbilcblx0XHRcdC8vIGh0dHA6Ly9nZW9tYWxnb3JpdGhtcy5jb20vYTA1LV9pbnRlcnNlY3QtMS5odG1sXG5cblx0XHRcdHZhciB2X3ByZXZfeCA9IGluUHQueCAtIGluUHJldi54LFxuXHRcdFx0XHR2X3ByZXZfeSA9IGluUHQueSAtIGluUHJldi55O1xuXHRcdFx0dmFyIHZfbmV4dF94ID0gaW5OZXh0LnggLSBpblB0LngsXG5cdFx0XHRcdHZfbmV4dF95ID0gaW5OZXh0LnkgLSBpblB0Lnk7XG5cblx0XHRcdHZhciB2X3ByZXZfbGVuc3EgPSAoIHZfcHJldl94ICogdl9wcmV2X3ggKyB2X3ByZXZfeSAqIHZfcHJldl95ICk7XG5cblx0XHRcdC8vIGNoZWNrIGZvciBjb2xsaW5lYXIgZWRnZXNcblx0XHRcdHZhciBjb2xsaW5lYXIwID0gKCB2X3ByZXZfeCAqIHZfbmV4dF95IC0gdl9wcmV2X3kgKiB2X25leHRfeCApO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBjb2xsaW5lYXIwICkgPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHQvLyBub3QgY29sbGluZWFyXG5cblx0XHRcdFx0Ly8gbGVuZ3RoIG9mIHZlY3RvcnMgZm9yIG5vcm1hbGl6aW5nXG5cblx0XHRcdFx0dmFyIHZfcHJldl9sZW4gPSBNYXRoLnNxcnQoIHZfcHJldl9sZW5zcSApO1xuXHRcdFx0XHR2YXIgdl9uZXh0X2xlbiA9IE1hdGguc3FydCggdl9uZXh0X3ggKiB2X25leHRfeCArIHZfbmV4dF95ICogdl9uZXh0X3kgKTtcblxuXHRcdFx0XHQvLyBzaGlmdCBhZGphY2VudCBwb2ludHMgYnkgdW5pdCB2ZWN0b3JzIHRvIHRoZSBsZWZ0XG5cblx0XHRcdFx0dmFyIHB0UHJldlNoaWZ0X3ggPSAoIGluUHJldi54IC0gdl9wcmV2X3kgLyB2X3ByZXZfbGVuICk7XG5cdFx0XHRcdHZhciBwdFByZXZTaGlmdF95ID0gKCBpblByZXYueSArIHZfcHJldl94IC8gdl9wcmV2X2xlbiApO1xuXG5cdFx0XHRcdHZhciBwdE5leHRTaGlmdF94ID0gKCBpbk5leHQueCAtIHZfbmV4dF95IC8gdl9uZXh0X2xlbiApO1xuXHRcdFx0XHR2YXIgcHROZXh0U2hpZnRfeSA9ICggaW5OZXh0LnkgKyB2X25leHRfeCAvIHZfbmV4dF9sZW4gKTtcblxuXHRcdFx0XHQvLyBzY2FsaW5nIGZhY3RvciBmb3Igdl9wcmV2IHRvIGludGVyc2VjdGlvbiBwb2ludFxuXG5cdFx0XHRcdHZhciBzZiA9ICggKCBwdE5leHRTaGlmdF94IC0gcHRQcmV2U2hpZnRfeCApICogdl9uZXh0X3kgLVxuXHRcdFx0XHRcdFx0KCBwdE5leHRTaGlmdF95IC0gcHRQcmV2U2hpZnRfeSApICogdl9uZXh0X3ggKSAvXG5cdFx0XHRcdFx0KCB2X3ByZXZfeCAqIHZfbmV4dF95IC0gdl9wcmV2X3kgKiB2X25leHRfeCApO1xuXG5cdFx0XHRcdC8vIHZlY3RvciBmcm9tIGluUHQgdG8gaW50ZXJzZWN0aW9uIHBvaW50XG5cblx0XHRcdFx0dl90cmFuc194ID0gKCBwdFByZXZTaGlmdF94ICsgdl9wcmV2X3ggKiBzZiAtIGluUHQueCApO1xuXHRcdFx0XHR2X3RyYW5zX3kgPSAoIHB0UHJldlNoaWZ0X3kgKyB2X3ByZXZfeSAqIHNmIC0gaW5QdC55ICk7XG5cblx0XHRcdFx0Ly8gRG9uJ3Qgbm9ybWFsaXplISwgb3RoZXJ3aXNlIHNoYXJwIGNvcm5lcnMgYmVjb21lIHVnbHlcblx0XHRcdFx0Ly8gIGJ1dCBwcmV2ZW50IGNyYXp5IHNwaWtlc1xuXHRcdFx0XHR2YXIgdl90cmFuc19sZW5zcSA9ICggdl90cmFuc194ICogdl90cmFuc194ICsgdl90cmFuc195ICogdl90cmFuc195ICk7XG5cdFx0XHRcdGlmICggdl90cmFuc19sZW5zcSA8PSAyICkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBWZWN0b3IyKCB2X3RyYW5zX3gsIHZfdHJhbnNfeSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRzaHJpbmtfYnkgPSBNYXRoLnNxcnQoIHZfdHJhbnNfbGVuc3EgLyAyICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgY29sbGluZWFyIGVkZ2VzXG5cblx0XHRcdFx0dmFyIGRpcmVjdGlvbl9lcSA9IGZhbHNlOyAvLyBhc3N1bWVzOiBvcHBvc2l0ZVxuXHRcdFx0XHRpZiAoIHZfcHJldl94ID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0XHRpZiAoIHZfbmV4dF94ID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0XHRcdGRpcmVjdGlvbl9lcSA9IHRydWU7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGlmICggdl9wcmV2X3ggPCAtIE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIHZfbmV4dF94IDwgLSBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHRcdFx0XHRkaXJlY3Rpb25fZXEgPSB0cnVlO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRpZiAoIE1hdGguc2lnbiggdl9wcmV2X3kgKSA9PT0gTWF0aC5zaWduKCB2X25leHRfeSApICkge1xuXG5cdFx0XHRcdFx0XHRcdGRpcmVjdGlvbl9lcSA9IHRydWU7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBkaXJlY3Rpb25fZXEgKSB7XG5cblx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcIldhcm5pbmc6IGxpbmVzIGFyZSBhIHN0cmFpZ2h0IHNlcXVlbmNlXCIpO1xuXHRcdFx0XHRcdHZfdHJhbnNfeCA9IC0gdl9wcmV2X3k7XG5cdFx0XHRcdFx0dl90cmFuc195ID0gdl9wcmV2X3g7XG5cdFx0XHRcdFx0c2hyaW5rX2J5ID0gTWF0aC5zcXJ0KCB2X3ByZXZfbGVuc3EgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJXYXJuaW5nOiBsaW5lcyBhcmUgYSBzdHJhaWdodCBzcGlrZVwiKTtcblx0XHRcdFx0XHR2X3RyYW5zX3ggPSB2X3ByZXZfeDtcblx0XHRcdFx0XHR2X3RyYW5zX3kgPSB2X3ByZXZfeTtcblx0XHRcdFx0XHRzaHJpbmtfYnkgPSBNYXRoLnNxcnQoIHZfcHJldl9sZW5zcSAvIDIgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG5ldyBWZWN0b3IyKCB2X3RyYW5zX3ggLyBzaHJpbmtfYnksIHZfdHJhbnNfeSAvIHNocmlua19ieSApO1xuXG5cdFx0fVxuXG5cblx0XHR2YXIgY29udG91ck1vdmVtZW50cyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGNvbnRvdXIubGVuZ3RoLCBqID0gaWwgLSAxLCBrID0gaSArIDE7IGkgPCBpbDsgaSArKywgaiArKywgayArKyApIHtcblxuXHRcdFx0aWYgKCBqID09PSBpbCApIGogPSAwO1xuXHRcdFx0aWYgKCBrID09PSBpbCApIGsgPSAwO1xuXG5cdFx0XHQvLyAgKGopLS0tKGkpLS0tKGspXG5cdFx0XHQvLyBjb25zb2xlLmxvZygnaSxqLGsnLCBpLCBqICwgaylcblxuXHRcdFx0Y29udG91ck1vdmVtZW50c1sgaSBdID0gZ2V0QmV2ZWxWZWMoIGNvbnRvdXJbIGkgXSwgY29udG91clsgaiBdLCBjb250b3VyWyBrIF0gKTtcblxuXHRcdH1cblxuXHRcdHZhciBob2xlc01vdmVtZW50cyA9IFtdLFxuXHRcdFx0b25lSG9sZU1vdmVtZW50cywgdmVydGljZXNNb3ZlbWVudHMgPSBjb250b3VyTW92ZW1lbnRzLmNvbmNhdCgpO1xuXG5cdFx0Zm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdGFob2xlID0gaG9sZXNbIGggXTtcblxuXHRcdFx0b25lSG9sZU1vdmVtZW50cyA9IFtdO1xuXG5cdFx0XHRmb3IgKCBpID0gMCwgaWwgPSBhaG9sZS5sZW5ndGgsIGogPSBpbCAtIDEsIGsgPSBpICsgMTsgaSA8IGlsOyBpICsrLCBqICsrLCBrICsrICkge1xuXG5cdFx0XHRcdGlmICggaiA9PT0gaWwgKSBqID0gMDtcblx0XHRcdFx0aWYgKCBrID09PSBpbCApIGsgPSAwO1xuXG5cdFx0XHRcdC8vICAoaiktLS0oaSktLS0oaylcblx0XHRcdFx0b25lSG9sZU1vdmVtZW50c1sgaSBdID0gZ2V0QmV2ZWxWZWMoIGFob2xlWyBpIF0sIGFob2xlWyBqIF0sIGFob2xlWyBrIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRob2xlc01vdmVtZW50cy5wdXNoKCBvbmVIb2xlTW92ZW1lbnRzICk7XG5cdFx0XHR2ZXJ0aWNlc01vdmVtZW50cyA9IHZlcnRpY2VzTW92ZW1lbnRzLmNvbmNhdCggb25lSG9sZU1vdmVtZW50cyApO1xuXG5cdFx0fVxuXG5cblx0XHQvLyBMb29wIGJldmVsU2VnbWVudHMsIDEgZm9yIHRoZSBmcm9udCwgMSBmb3IgdGhlIGJhY2tcblxuXHRcdGZvciAoIGIgPSAwOyBiIDwgYmV2ZWxTZWdtZW50czsgYiArKyApIHtcblxuXHRcdFx0Ly9mb3IgKCBiID0gYmV2ZWxTZWdtZW50czsgYiA+IDA7IGIgLS0gKSB7XG5cblx0XHRcdHQgPSBiIC8gYmV2ZWxTZWdtZW50cztcblx0XHRcdHogPSBiZXZlbFRoaWNrbmVzcyAqIE1hdGguY29zKCB0ICogTWF0aC5QSSAvIDIgKTtcblx0XHRcdGJzID0gYmV2ZWxTaXplICogTWF0aC5zaW4oIHQgKiBNYXRoLlBJIC8gMiApO1xuXG5cdFx0XHQvLyBjb250cmFjdCBzaGFwZVxuXG5cdFx0XHRmb3IgKCBpID0gMCwgaWwgPSBjb250b3VyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdHZlcnQgPSBzY2FsZVB0MiggY29udG91clsgaSBdLCBjb250b3VyTW92ZW1lbnRzWyBpIF0sIGJzICk7XG5cblx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnksIC0geiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGV4cGFuZCBob2xlc1xuXG5cdFx0XHRmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0XHRhaG9sZSA9IGhvbGVzWyBoIF07XG5cdFx0XHRcdG9uZUhvbGVNb3ZlbWVudHMgPSBob2xlc01vdmVtZW50c1sgaCBdO1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwLCBpbCA9IGFob2xlLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dmVydCA9IHNjYWxlUHQyKCBhaG9sZVsgaSBdLCBvbmVIb2xlTW92ZW1lbnRzWyBpIF0sIGJzICk7XG5cblx0XHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSwgLSB6ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRicyA9IGJldmVsU2l6ZTtcblxuXHRcdC8vIEJhY2sgZmFjaW5nIHZlcnRpY2VzXG5cblx0XHRmb3IgKCBpID0gMDsgaSA8IHZsZW47IGkgKysgKSB7XG5cblx0XHRcdHZlcnQgPSBiZXZlbEVuYWJsZWQgPyBzY2FsZVB0MiggdmVydGljZXNbIGkgXSwgdmVydGljZXNNb3ZlbWVudHNbIGkgXSwgYnMgKSA6IHZlcnRpY2VzWyBpIF07XG5cblx0XHRcdGlmICggISBleHRydWRlQnlQYXRoICkge1xuXG5cdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCAwICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gdiggdmVydC54LCB2ZXJ0LnkgKyBleHRydWRlUHRzWyAwIF0ueSwgZXh0cnVkZVB0c1sgMCBdLnggKTtcblxuXHRcdFx0XHRub3JtYWwuY29weSggc3BsaW5lVHViZS5ub3JtYWxzWyAwIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC54ICk7XG5cdFx0XHRcdGJpbm9ybWFsLmNvcHkoIHNwbGluZVR1YmUuYmlub3JtYWxzWyAwIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC55ICk7XG5cblx0XHRcdFx0cG9zaXRpb24yLmNvcHkoIGV4dHJ1ZGVQdHNbIDAgXSApLmFkZCggbm9ybWFsICkuYWRkKCBiaW5vcm1hbCApO1xuXG5cdFx0XHRcdHYoIHBvc2l0aW9uMi54LCBwb3NpdGlvbjIueSwgcG9zaXRpb24yLnogKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gQWRkIHN0ZXBwZWQgdmVydGljZXMuLi5cblx0XHQvLyBJbmNsdWRpbmcgZnJvbnQgZmFjaW5nIHZlcnRpY2VzXG5cblx0XHR2YXIgcztcblxuXHRcdGZvciAoIHMgPSAxOyBzIDw9IHN0ZXBzOyBzICsrICkge1xuXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IHZsZW47IGkgKysgKSB7XG5cblx0XHRcdFx0dmVydCA9IGJldmVsRW5hYmxlZCA/IHNjYWxlUHQyKCB2ZXJ0aWNlc1sgaSBdLCB2ZXJ0aWNlc01vdmVtZW50c1sgaSBdLCBicyApIDogdmVydGljZXNbIGkgXTtcblxuXHRcdFx0XHRpZiAoICEgZXh0cnVkZUJ5UGF0aCApIHtcblxuXHRcdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCBhbW91bnQgLyBzdGVwcyAqIHMgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gdiggdmVydC54LCB2ZXJ0LnkgKyBleHRydWRlUHRzWyBzIC0gMSBdLnksIGV4dHJ1ZGVQdHNbIHMgLSAxIF0ueCApO1xuXG5cdFx0XHRcdFx0bm9ybWFsLmNvcHkoIHNwbGluZVR1YmUubm9ybWFsc1sgcyBdICkubXVsdGlwbHlTY2FsYXIoIHZlcnQueCApO1xuXHRcdFx0XHRcdGJpbm9ybWFsLmNvcHkoIHNwbGluZVR1YmUuYmlub3JtYWxzWyBzIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC55ICk7XG5cblx0XHRcdFx0XHRwb3NpdGlvbjIuY29weSggZXh0cnVkZVB0c1sgcyBdICkuYWRkKCBub3JtYWwgKS5hZGQoIGJpbm9ybWFsICk7XG5cblx0XHRcdFx0XHR2KCBwb3NpdGlvbjIueCwgcG9zaXRpb24yLnksIHBvc2l0aW9uMi56ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblxuXHRcdC8vIEFkZCBiZXZlbCBzZWdtZW50cyBwbGFuZXNcblxuXHRcdC8vZm9yICggYiA9IDE7IGIgPD0gYmV2ZWxTZWdtZW50czsgYiArKyApIHtcblx0XHRmb3IgKCBiID0gYmV2ZWxTZWdtZW50cyAtIDE7IGIgPj0gMDsgYiAtLSApIHtcblxuXHRcdFx0dCA9IGIgLyBiZXZlbFNlZ21lbnRzO1xuXHRcdFx0eiA9IGJldmVsVGhpY2tuZXNzICogTWF0aC5jb3MoIHQgKiBNYXRoLlBJIC8gMiApO1xuXHRcdFx0YnMgPSBiZXZlbFNpemUgKiBNYXRoLnNpbiggdCAqIE1hdGguUEkgLyAyICk7XG5cblx0XHRcdC8vIGNvbnRyYWN0IHNoYXBlXG5cblx0XHRcdGZvciAoIGkgPSAwLCBpbCA9IGNvbnRvdXIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmVydCA9IHNjYWxlUHQyKCBjb250b3VyWyBpIF0sIGNvbnRvdXJNb3ZlbWVudHNbIGkgXSwgYnMgKTtcblx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnksIGFtb3VudCArIHogKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBleHBhbmQgaG9sZXNcblxuXHRcdFx0Zm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdFx0YWhvbGUgPSBob2xlc1sgaCBdO1xuXHRcdFx0XHRvbmVIb2xlTW92ZW1lbnRzID0gaG9sZXNNb3ZlbWVudHNbIGggXTtcblxuXHRcdFx0XHRmb3IgKCBpID0gMCwgaWwgPSBhaG9sZS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHZlcnQgPSBzY2FsZVB0MiggYWhvbGVbIGkgXSwgb25lSG9sZU1vdmVtZW50c1sgaSBdLCBicyApO1xuXG5cdFx0XHRcdFx0aWYgKCAhIGV4dHJ1ZGVCeVBhdGggKSB7XG5cblx0XHRcdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCBhbW91bnQgKyB6ICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSArIGV4dHJ1ZGVQdHNbIHN0ZXBzIC0gMSBdLnksIGV4dHJ1ZGVQdHNbIHN0ZXBzIC0gMSBdLnggKyB6ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvKiBGYWNlcyAqL1xuXG5cdFx0Ly8gVG9wIGFuZCBib3R0b20gZmFjZXNcblxuXHRcdGJ1aWxkTGlkRmFjZXMoKTtcblxuXHRcdC8vIFNpZGVzIGZhY2VzXG5cblx0XHRidWlsZFNpZGVGYWNlcygpO1xuXG5cblx0XHQvLy8vLyAgSW50ZXJuYWwgZnVuY3Rpb25zXG5cblx0XHRmdW5jdGlvbiBidWlsZExpZEZhY2VzKCkge1xuXG5cdFx0XHR2YXIgc3RhcnQgPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDM7XG5cblx0XHRcdGlmICggYmV2ZWxFbmFibGVkICkge1xuXG5cdFx0XHRcdHZhciBsYXllciA9IDA7IC8vIHN0ZXBzICsgMVxuXHRcdFx0XHR2YXIgb2Zmc2V0ID0gdmxlbiAqIGxheWVyO1xuXG5cdFx0XHRcdC8vIEJvdHRvbSBmYWNlc1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHtcblxuXHRcdFx0XHRcdGZhY2UgPSBmYWNlc1sgaSBdO1xuXHRcdFx0XHRcdGYzKCBmYWNlWyAyIF0gKyBvZmZzZXQsIGZhY2VbIDEgXSArIG9mZnNldCwgZmFjZVsgMCBdICsgb2Zmc2V0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxheWVyID0gc3RlcHMgKyBiZXZlbFNlZ21lbnRzICogMjtcblx0XHRcdFx0b2Zmc2V0ID0gdmxlbiAqIGxheWVyO1xuXG5cdFx0XHRcdC8vIFRvcCBmYWNlc1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHtcblxuXHRcdFx0XHRcdGZhY2UgPSBmYWNlc1sgaSBdO1xuXHRcdFx0XHRcdGYzKCBmYWNlWyAwIF0gKyBvZmZzZXQsIGZhY2VbIDEgXSArIG9mZnNldCwgZmFjZVsgMiBdICsgb2Zmc2V0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIEJvdHRvbSBmYWNlc1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHtcblxuXHRcdFx0XHRcdGZhY2UgPSBmYWNlc1sgaSBdO1xuXHRcdFx0XHRcdGYzKCBmYWNlWyAyIF0sIGZhY2VbIDEgXSwgZmFjZVsgMCBdICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRvcCBmYWNlc1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHtcblxuXHRcdFx0XHRcdGZhY2UgPSBmYWNlc1sgaSBdO1xuXHRcdFx0XHRcdGYzKCBmYWNlWyAwIF0gKyB2bGVuICogc3RlcHMsIGZhY2VbIDEgXSArIHZsZW4gKiBzdGVwcywgZmFjZVsgMiBdICsgdmxlbiAqIHN0ZXBzICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHNjb3BlLmFkZEdyb3VwKCBzdGFydCwgdmVydGljZXNBcnJheS5sZW5ndGggLyAzIC0gc3RhcnQsIDAgKTtcblxuXHRcdH1cblxuXHRcdC8vIENyZWF0ZSBmYWNlcyBmb3IgdGhlIHotc2lkZXMgb2YgdGhlIHNoYXBlXG5cblx0XHRmdW5jdGlvbiBidWlsZFNpZGVGYWNlcygpIHtcblxuXHRcdFx0dmFyIHN0YXJ0ID0gdmVydGljZXNBcnJheS5sZW5ndGggLyAzO1xuXHRcdFx0dmFyIGxheWVyb2Zmc2V0ID0gMDtcblx0XHRcdHNpZGV3YWxscyggY29udG91ciwgbGF5ZXJvZmZzZXQgKTtcblx0XHRcdGxheWVyb2Zmc2V0ICs9IGNvbnRvdXIubGVuZ3RoO1xuXG5cdFx0XHRmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0XHRhaG9sZSA9IGhvbGVzWyBoIF07XG5cdFx0XHRcdHNpZGV3YWxscyggYWhvbGUsIGxheWVyb2Zmc2V0ICk7XG5cblx0XHRcdFx0Ly8sIHRydWVcblx0XHRcdFx0bGF5ZXJvZmZzZXQgKz0gYWhvbGUubGVuZ3RoO1xuXG5cdFx0XHR9XG5cblxuXHRcdFx0c2NvcGUuYWRkR3JvdXAoIHN0YXJ0LCB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDMgLSBzdGFydCwgMSApO1xuXG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBzaWRld2FsbHMoIGNvbnRvdXIsIGxheWVyb2Zmc2V0ICkge1xuXG5cdFx0XHR2YXIgaiwgaztcblx0XHRcdGkgPSBjb250b3VyLmxlbmd0aDtcblxuXHRcdFx0d2hpbGUgKCAtLSBpID49IDAgKSB7XG5cblx0XHRcdFx0aiA9IGk7XG5cdFx0XHRcdGsgPSBpIC0gMTtcblx0XHRcdFx0aWYgKCBrIDwgMCApIGsgPSBjb250b3VyLmxlbmd0aCAtIDE7XG5cblx0XHRcdFx0Ly9jb25zb2xlLmxvZygnYicsIGksaiwgaS0xLCBrLHZlcnRpY2VzLmxlbmd0aCk7XG5cblx0XHRcdFx0dmFyIHMgPSAwLFxuXHRcdFx0XHRcdHNsID0gc3RlcHMgKyBiZXZlbFNlZ21lbnRzICogMjtcblxuXHRcdFx0XHRmb3IgKCBzID0gMDsgcyA8IHNsOyBzICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIHNsZW4xID0gdmxlbiAqIHM7XG5cdFx0XHRcdFx0dmFyIHNsZW4yID0gdmxlbiAqICggcyArIDEgKTtcblxuXHRcdFx0XHRcdHZhciBhID0gbGF5ZXJvZmZzZXQgKyBqICsgc2xlbjEsXG5cdFx0XHRcdFx0XHRiID0gbGF5ZXJvZmZzZXQgKyBrICsgc2xlbjEsXG5cdFx0XHRcdFx0XHRjID0gbGF5ZXJvZmZzZXQgKyBrICsgc2xlbjIsXG5cdFx0XHRcdFx0XHRkID0gbGF5ZXJvZmZzZXQgKyBqICsgc2xlbjI7XG5cblx0XHRcdFx0XHRmNCggYSwgYiwgYywgZCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gdiggeCwgeSwgeiApIHtcblxuXHRcdFx0cGxhY2Vob2xkZXIucHVzaCggeCApO1xuXHRcdFx0cGxhY2Vob2xkZXIucHVzaCggeSApO1xuXHRcdFx0cGxhY2Vob2xkZXIucHVzaCggeiApO1xuXG5cdFx0fVxuXG5cblx0XHRmdW5jdGlvbiBmMyggYSwgYiwgYyApIHtcblxuXHRcdFx0YWRkVmVydGV4KCBhICk7XG5cdFx0XHRhZGRWZXJ0ZXgoIGIgKTtcblx0XHRcdGFkZFZlcnRleCggYyApO1xuXG5cdFx0XHR2YXIgbmV4dEluZGV4ID0gdmVydGljZXNBcnJheS5sZW5ndGggLyAzO1xuXHRcdFx0dmFyIHV2cyA9IHV2Z2VuLmdlbmVyYXRlVG9wVVYoIHNjb3BlLCB2ZXJ0aWNlc0FycmF5LCBuZXh0SW5kZXggLSAzLCBuZXh0SW5kZXggLSAyLCBuZXh0SW5kZXggLSAxICk7XG5cblx0XHRcdGFkZFVWKCB1dnNbIDAgXSApO1xuXHRcdFx0YWRkVVYoIHV2c1sgMSBdICk7XG5cdFx0XHRhZGRVViggdXZzWyAyIF0gKTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGY0KCBhLCBiLCBjLCBkICkge1xuXG5cdFx0XHRhZGRWZXJ0ZXgoIGEgKTtcblx0XHRcdGFkZFZlcnRleCggYiApO1xuXHRcdFx0YWRkVmVydGV4KCBkICk7XG5cblx0XHRcdGFkZFZlcnRleCggYiApO1xuXHRcdFx0YWRkVmVydGV4KCBjICk7XG5cdFx0XHRhZGRWZXJ0ZXgoIGQgKTtcblxuXG5cdFx0XHR2YXIgbmV4dEluZGV4ID0gdmVydGljZXNBcnJheS5sZW5ndGggLyAzO1xuXHRcdFx0dmFyIHV2cyA9IHV2Z2VuLmdlbmVyYXRlU2lkZVdhbGxVViggc2NvcGUsIHZlcnRpY2VzQXJyYXksIG5leHRJbmRleCAtIDYsIG5leHRJbmRleCAtIDMsIG5leHRJbmRleCAtIDIsIG5leHRJbmRleCAtIDEgKTtcblxuXHRcdFx0YWRkVVYoIHV2c1sgMCBdICk7XG5cdFx0XHRhZGRVViggdXZzWyAxIF0gKTtcblx0XHRcdGFkZFVWKCB1dnNbIDMgXSApO1xuXG5cdFx0XHRhZGRVViggdXZzWyAxIF0gKTtcblx0XHRcdGFkZFVWKCB1dnNbIDIgXSApO1xuXHRcdFx0YWRkVVYoIHV2c1sgMyBdICk7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBhZGRWZXJ0ZXgoIGluZGV4ICkge1xuXG5cdFx0XHR2ZXJ0aWNlc0FycmF5LnB1c2goIHBsYWNlaG9sZGVyWyBpbmRleCAqIDMgKyAwIF0gKTtcblx0XHRcdHZlcnRpY2VzQXJyYXkucHVzaCggcGxhY2Vob2xkZXJbIGluZGV4ICogMyArIDEgXSApO1xuXHRcdFx0dmVydGljZXNBcnJheS5wdXNoKCBwbGFjZWhvbGRlclsgaW5kZXggKiAzICsgMiBdICk7XG5cblx0XHR9XG5cblxuXHRcdGZ1bmN0aW9uIGFkZFVWKCB2ZWN0b3IyICkge1xuXG5cdFx0XHR1dkFycmF5LnB1c2goIHZlY3RvcjIueCApO1xuXHRcdFx0dXZBcnJheS5wdXNoKCB2ZWN0b3IyLnkgKTtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTtcblxudmFyIFdvcmxkVVZHZW5lcmF0b3IgPSB7XG5cblx0Z2VuZXJhdGVUb3BVVjogZnVuY3Rpb24gKCBnZW9tZXRyeSwgdmVydGljZXMsIGluZGV4QSwgaW5kZXhCLCBpbmRleEMgKSB7XG5cblx0XHR2YXIgYV94ID0gdmVydGljZXNbIGluZGV4QSAqIDMgXTtcblx0XHR2YXIgYV95ID0gdmVydGljZXNbIGluZGV4QSAqIDMgKyAxIF07XG5cdFx0dmFyIGJfeCA9IHZlcnRpY2VzWyBpbmRleEIgKiAzIF07XG5cdFx0dmFyIGJfeSA9IHZlcnRpY2VzWyBpbmRleEIgKiAzICsgMSBdO1xuXHRcdHZhciBjX3ggPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyBdO1xuXHRcdHZhciBjX3kgPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyArIDEgXTtcblxuXHRcdHJldHVybiBbXG5cdFx0XHRuZXcgVmVjdG9yMiggYV94LCBhX3kgKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBiX3gsIGJfeSApLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGNfeCwgY195IClcblx0XHRdO1xuXG5cdH0sXG5cblx0Z2VuZXJhdGVTaWRlV2FsbFVWOiBmdW5jdGlvbiAoIGdlb21ldHJ5LCB2ZXJ0aWNlcywgaW5kZXhBLCBpbmRleEIsIGluZGV4QywgaW5kZXhEICkge1xuXG5cdFx0dmFyIGFfeCA9IHZlcnRpY2VzWyBpbmRleEEgKiAzIF07XG5cdFx0dmFyIGFfeSA9IHZlcnRpY2VzWyBpbmRleEEgKiAzICsgMSBdO1xuXHRcdHZhciBhX3ogPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyArIDIgXTtcblx0XHR2YXIgYl94ID0gdmVydGljZXNbIGluZGV4QiAqIDMgXTtcblx0XHR2YXIgYl95ID0gdmVydGljZXNbIGluZGV4QiAqIDMgKyAxIF07XG5cdFx0dmFyIGJfeiA9IHZlcnRpY2VzWyBpbmRleEIgKiAzICsgMiBdO1xuXHRcdHZhciBjX3ggPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyBdO1xuXHRcdHZhciBjX3kgPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyArIDEgXTtcblx0XHR2YXIgY196ID0gdmVydGljZXNbIGluZGV4QyAqIDMgKyAyIF07XG5cdFx0dmFyIGRfeCA9IHZlcnRpY2VzWyBpbmRleEQgKiAzIF07XG5cdFx0dmFyIGRfeSA9IHZlcnRpY2VzWyBpbmRleEQgKiAzICsgMSBdO1xuXHRcdHZhciBkX3ogPSB2ZXJ0aWNlc1sgaW5kZXhEICogMyArIDIgXTtcblxuXHRcdGlmICggTWF0aC5hYnMoIGFfeSAtIGJfeSApIDwgMC4wMSApIHtcblxuXHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGFfeCwgMSAtIGFfeiApLFxuXHRcdFx0XHRuZXcgVmVjdG9yMiggYl94LCAxIC0gYl96ICksXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBjX3gsIDEgLSBjX3ogKSxcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGRfeCwgMSAtIGRfeiApXG5cdFx0XHRdO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGFfeSwgMSAtIGFfeiApLFxuXHRcdFx0XHRuZXcgVmVjdG9yMiggYl95LCAxIC0gYl96ICksXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBjX3ksIDEgLSBjX3ogKSxcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGRfeSwgMSAtIGRfeiApXG5cdFx0XHRdO1xuXG5cdFx0fVxuXG5cdH1cbn07XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBUZXh0ID0gM0QgVGV4dFxuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgZm9udDogPFRIUkVFLkZvbnQ+LCAvLyBmb250XG4gKlxuICogIHNpemU6IDxmbG9hdD4sIC8vIHNpemUgb2YgdGhlIHRleHRcbiAqICBoZWlnaHQ6IDxmbG9hdD4sIC8vIHRoaWNrbmVzcyB0byBleHRydWRlIHRleHRcbiAqICBjdXJ2ZVNlZ21lbnRzOiA8aW50PiwgLy8gbnVtYmVyIG9mIHBvaW50cyBvbiB0aGUgY3VydmVzXG4gKlxuICogIGJldmVsRW5hYmxlZDogPGJvb2w+LCAvLyB0dXJuIG9uIGJldmVsXG4gKiAgYmV2ZWxUaGlja25lc3M6IDxmbG9hdD4sIC8vIGhvdyBkZWVwIGludG8gdGV4dCBiZXZlbCBnb2VzXG4gKiAgYmV2ZWxTaXplOiA8ZmxvYXQ+IC8vIGhvdyBmYXIgZnJvbSB0ZXh0IG91dGxpbmUgaXMgYmV2ZWxcbiAqIH1cbiAqL1xuXG4vLyBUZXh0R2VvbWV0cnlcblxuZnVuY3Rpb24gVGV4dEdlb21ldHJ5KCB0ZXh0LCBwYXJhbWV0ZXJzICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVGV4dEdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0dGV4dDogdGV4dCxcblx0XHRwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBUZXh0QnVmZmVyR2VvbWV0cnkoIHRleHQsIHBhcmFtZXRlcnMgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5UZXh0R2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5UZXh0R2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVGV4dEdlb21ldHJ5O1xuXG4vLyBUZXh0QnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gVGV4dEJ1ZmZlckdlb21ldHJ5KCB0ZXh0LCBwYXJhbWV0ZXJzICkge1xuXG5cdHBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdHZhciBmb250ID0gcGFyYW1ldGVycy5mb250O1xuXG5cdGlmICggISAoIGZvbnQgJiYgZm9udC5pc0ZvbnQgKSApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5UZXh0R2VvbWV0cnk6IGZvbnQgcGFyYW1ldGVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5Gb250LicgKTtcblx0XHRyZXR1cm4gbmV3IEdlb21ldHJ5KCk7XG5cblx0fVxuXG5cdHZhciBzaGFwZXMgPSBmb250LmdlbmVyYXRlU2hhcGVzKCB0ZXh0LCBwYXJhbWV0ZXJzLnNpemUsIHBhcmFtZXRlcnMuY3VydmVTZWdtZW50cyApO1xuXG5cdC8vIHRyYW5zbGF0ZSBwYXJhbWV0ZXJzIHRvIEV4dHJ1ZGVHZW9tZXRyeSBBUElcblxuXHRwYXJhbWV0ZXJzLmFtb3VudCA9IHBhcmFtZXRlcnMuaGVpZ2h0ICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmhlaWdodCA6IDUwO1xuXG5cdC8vIGRlZmF1bHRzXG5cblx0aWYgKCBwYXJhbWV0ZXJzLmJldmVsVGhpY2tuZXNzID09PSB1bmRlZmluZWQgKSBwYXJhbWV0ZXJzLmJldmVsVGhpY2tuZXNzID0gMTA7XG5cdGlmICggcGFyYW1ldGVycy5iZXZlbFNpemUgPT09IHVuZGVmaW5lZCApIHBhcmFtZXRlcnMuYmV2ZWxTaXplID0gODtcblx0aWYgKCBwYXJhbWV0ZXJzLmJldmVsRW5hYmxlZCA9PT0gdW5kZWZpbmVkICkgcGFyYW1ldGVycy5iZXZlbEVuYWJsZWQgPSBmYWxzZTtcblxuXHRFeHRydWRlQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgc2hhcGVzLCBwYXJhbWV0ZXJzICk7XG5cblx0dGhpcy50eXBlID0gJ1RleHRCdWZmZXJHZW9tZXRyeSc7XG5cbn1cblxuVGV4dEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblRleHRCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUZXh0QnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtc1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBTcGhlcmVHZW9tZXRyeVxuXG5mdW5jdGlvbiBTcGhlcmVHZW9tZXRyeSggcmFkaXVzLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTcGhlcmVHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsXG5cdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxuXHRcdHBoaVN0YXJ0OiBwaGlTdGFydCxcblx0XHRwaGlMZW5ndGg6IHBoaUxlbmd0aCxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgU3BoZXJlQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIHBoaVN0YXJ0LCBwaGlMZW5ndGgsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuU3BoZXJlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5TcGhlcmVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTcGhlcmVHZW9tZXRyeTtcblxuLy8gU3BoZXJlQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gU3BoZXJlQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIHBoaVN0YXJ0LCBwaGlMZW5ndGgsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU3BoZXJlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRwaGlTdGFydDogcGhpU3RhcnQsXG5cdFx0cGhpTGVuZ3RoOiBwaGlMZW5ndGgsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxuXHRyYWRpdXMgPSByYWRpdXMgfHwgMTtcblxuXHR3aWR0aFNlZ21lbnRzID0gTWF0aC5tYXgoIDMsIE1hdGguZmxvb3IoIHdpZHRoU2VnbWVudHMgKSB8fCA4ICk7XG5cdGhlaWdodFNlZ21lbnRzID0gTWF0aC5tYXgoIDIsIE1hdGguZmxvb3IoIGhlaWdodFNlZ21lbnRzICkgfHwgNiApO1xuXG5cdHBoaVN0YXJ0ID0gcGhpU3RhcnQgIT09IHVuZGVmaW5lZCA/IHBoaVN0YXJ0IDogMDtcblx0cGhpTGVuZ3RoID0gcGhpTGVuZ3RoICE9PSB1bmRlZmluZWQgPyBwaGlMZW5ndGggOiBNYXRoLlBJICogMjtcblxuXHR0aGV0YVN0YXJ0ID0gdGhldGFTdGFydCAhPT0gdW5kZWZpbmVkID8gdGhldGFTdGFydCA6IDA7XG5cdHRoZXRhTGVuZ3RoID0gdGhldGFMZW5ndGggIT09IHVuZGVmaW5lZCA/IHRoZXRhTGVuZ3RoIDogTWF0aC5QSTtcblxuXHR2YXIgdGhldGFFbmQgPSB0aGV0YVN0YXJ0ICsgdGhldGFMZW5ndGg7XG5cblx0dmFyIGl4LCBpeTtcblxuXHR2YXIgaW5kZXggPSAwO1xuXHR2YXIgZ3JpZCA9IFtdO1xuXG5cdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0Zm9yICggaXkgPSAwOyBpeSA8PSBoZWlnaHRTZWdtZW50czsgaXkgKysgKSB7XG5cblx0XHR2YXIgdmVydGljZXNSb3cgPSBbXTtcblxuXHRcdHZhciB2ID0gaXkgLyBoZWlnaHRTZWdtZW50cztcblxuXHRcdGZvciAoIGl4ID0gMDsgaXggPD0gd2lkdGhTZWdtZW50czsgaXggKysgKSB7XG5cblx0XHRcdHZhciB1ID0gaXggLyB3aWR0aFNlZ21lbnRzO1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0dmVydGV4LnggPSAtIHJhZGl1cyAqIE1hdGguY29zKCBwaGlTdGFydCArIHUgKiBwaGlMZW5ndGggKSAqIE1hdGguc2luKCB0aGV0YVN0YXJ0ICsgdiAqIHRoZXRhTGVuZ3RoICk7XG5cdFx0XHR2ZXJ0ZXgueSA9IHJhZGl1cyAqIE1hdGguY29zKCB0aGV0YVN0YXJ0ICsgdiAqIHRoZXRhTGVuZ3RoICk7XG5cdFx0XHR2ZXJ0ZXgueiA9IHJhZGl1cyAqIE1hdGguc2luKCBwaGlTdGFydCArIHUgKiBwaGlMZW5ndGggKSAqIE1hdGguc2luKCB0aGV0YVN0YXJ0ICsgdiAqIHRoZXRhTGVuZ3RoICk7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdG5vcm1hbC5zZXQoIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKS5ub3JtYWxpemUoKTtcblx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1dnMucHVzaCggdSwgMSAtIHYgKTtcblxuXHRcdFx0dmVydGljZXNSb3cucHVzaCggaW5kZXggKysgKTtcblxuXHRcdH1cblxuXHRcdGdyaWQucHVzaCggdmVydGljZXNSb3cgKTtcblxuXHR9XG5cblx0Ly8gaW5kaWNlc1xuXG5cdGZvciAoIGl5ID0gMDsgaXkgPCBoZWlnaHRTZWdtZW50czsgaXkgKysgKSB7XG5cblx0XHRmb3IgKCBpeCA9IDA7IGl4IDwgd2lkdGhTZWdtZW50czsgaXggKysgKSB7XG5cblx0XHRcdHZhciBhID0gZ3JpZFsgaXkgXVsgaXggKyAxIF07XG5cdFx0XHR2YXIgYiA9IGdyaWRbIGl5IF1bIGl4IF07XG5cdFx0XHR2YXIgYyA9IGdyaWRbIGl5ICsgMSBdWyBpeCBdO1xuXHRcdFx0dmFyIGQgPSBncmlkWyBpeSArIDEgXVsgaXggKyAxIF07XG5cblx0XHRcdGlmICggaXkgIT09IDAgfHwgdGhldGFTdGFydCA+IDAgKSBpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdGlmICggaXkgIT09IGhlaWdodFNlZ21lbnRzIC0gMSB8fCB0aGV0YUVuZCA8IE1hdGguUEkgKSBpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG59XG5cblNwaGVyZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuU3BoZXJlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3BoZXJlQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBLYWxlYiBNdXJwaHlcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gUmluZ0dlb21ldHJ5XG5cbmZ1bmN0aW9uIFJpbmdHZW9tZXRyeSggaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCB0aGV0YVNlZ21lbnRzLCBwaGlTZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdSaW5nR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRpbm5lclJhZGl1czogaW5uZXJSYWRpdXMsXG5cdFx0b3V0ZXJSYWRpdXM6IG91dGVyUmFkaXVzLFxuXHRcdHRoZXRhU2VnbWVudHM6IHRoZXRhU2VnbWVudHMsXG5cdFx0cGhpU2VnbWVudHM6IHBoaVNlZ21lbnRzLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBSaW5nQnVmZmVyR2VvbWV0cnkoIGlubmVyUmFkaXVzLCBvdXRlclJhZGl1cywgdGhldGFTZWdtZW50cywgcGhpU2VnbWVudHMsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuUmluZ0dlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuUmluZ0dlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJpbmdHZW9tZXRyeTtcblxuLy8gUmluZ0J1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFJpbmdCdWZmZXJHZW9tZXRyeSggaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCB0aGV0YVNlZ21lbnRzLCBwaGlTZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdSaW5nQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRpbm5lclJhZGl1czogaW5uZXJSYWRpdXMsXG5cdFx0b3V0ZXJSYWRpdXM6IG91dGVyUmFkaXVzLFxuXHRcdHRoZXRhU2VnbWVudHM6IHRoZXRhU2VnbWVudHMsXG5cdFx0cGhpU2VnbWVudHM6IHBoaVNlZ21lbnRzLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0aW5uZXJSYWRpdXMgPSBpbm5lclJhZGl1cyB8fCAwLjU7XG5cdG91dGVyUmFkaXVzID0gb3V0ZXJSYWRpdXMgfHwgMTtcblxuXHR0aGV0YVN0YXJ0ID0gdGhldGFTdGFydCAhPT0gdW5kZWZpbmVkID8gdGhldGFTdGFydCA6IDA7XG5cdHRoZXRhTGVuZ3RoID0gdGhldGFMZW5ndGggIT09IHVuZGVmaW5lZCA/IHRoZXRhTGVuZ3RoIDogTWF0aC5QSSAqIDI7XG5cblx0dGhldGFTZWdtZW50cyA9IHRoZXRhU2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IE1hdGgubWF4KCAzLCB0aGV0YVNlZ21lbnRzICkgOiA4O1xuXHRwaGlTZWdtZW50cyA9IHBoaVNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBNYXRoLm1heCggMSwgcGhpU2VnbWVudHMgKSA6IDE7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gc29tZSBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIHNlZ21lbnQ7XG5cdHZhciByYWRpdXMgPSBpbm5lclJhZGl1cztcblx0dmFyIHJhZGl1c1N0ZXAgPSAoICggb3V0ZXJSYWRpdXMgLSBpbm5lclJhZGl1cyApIC8gcGhpU2VnbWVudHMgKTtcblx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB1diA9IG5ldyBWZWN0b3IyKCk7XG5cdHZhciBqLCBpO1xuXG5cdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRmb3IgKCBqID0gMDsgaiA8PSBwaGlTZWdtZW50czsgaiArKyApIHtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDw9IHRoZXRhU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdC8vIHZhbHVlcyBhcmUgZ2VuZXJhdGUgZnJvbSB0aGUgaW5zaWRlIG9mIHRoZSByaW5nIHRvIHRoZSBvdXRzaWRlXG5cblx0XHRcdHNlZ21lbnQgPSB0aGV0YVN0YXJ0ICsgaSAvIHRoZXRhU2VnbWVudHMgKiB0aGV0YUxlbmd0aDtcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdHZlcnRleC54ID0gcmFkaXVzICogTWF0aC5jb3MoIHNlZ21lbnQgKTtcblx0XHRcdHZlcnRleC55ID0gcmFkaXVzICogTWF0aC5zaW4oIHNlZ21lbnQgKTtcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2LnggPSAoIHZlcnRleC54IC8gb3V0ZXJSYWRpdXMgKyAxICkgLyAyO1xuXHRcdFx0dXYueSA9ICggdmVydGV4LnkgLyBvdXRlclJhZGl1cyArIDEgKSAvIDI7XG5cblx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblx0XHR9XG5cblx0XHQvLyBpbmNyZWFzZSB0aGUgcmFkaXVzIGZvciBuZXh0IHJvdyBvZiB2ZXJ0aWNlc1xuXG5cdFx0cmFkaXVzICs9IHJhZGl1c1N0ZXA7XG5cblx0fVxuXG5cdC8vIGluZGljZXNcblxuXHRmb3IgKCBqID0gMDsgaiA8IHBoaVNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0dmFyIHRoZXRhU2VnbWVudExldmVsID0gaiAqICggdGhldGFTZWdtZW50cyArIDEgKTtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDwgdGhldGFTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0c2VnbWVudCA9IGkgKyB0aGV0YVNlZ21lbnRMZXZlbDtcblxuXHRcdFx0dmFyIGEgPSBzZWdtZW50O1xuXHRcdFx0dmFyIGIgPSBzZWdtZW50ICsgdGhldGFTZWdtZW50cyArIDE7XG5cdFx0XHR2YXIgYyA9IHNlZ21lbnQgKyB0aGV0YVNlZ21lbnRzICsgMjtcblx0XHRcdHZhciBkID0gc2VnbWVudCArIDE7XG5cblx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxufVxuXG5SaW5nQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5SaW5nQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmluZ0J1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgYXN0cm9kdWQgLyBodHRwOi8vYXN0cm9kdWQuaXNncmVhdC5vcmcvXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwczovL2dpdGh1Yi5jb20veno4NVxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBMYXRoZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIExhdGhlR2VvbWV0cnkoIHBvaW50cywgc2VnbWVudHMsIHBoaVN0YXJ0LCBwaGlMZW5ndGggKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMYXRoZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cG9pbnRzOiBwb2ludHMsXG5cdFx0c2VnbWVudHM6IHNlZ21lbnRzLFxuXHRcdHBoaVN0YXJ0OiBwaGlTdGFydCxcblx0XHRwaGlMZW5ndGg6IHBoaUxlbmd0aFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgTGF0aGVCdWZmZXJHZW9tZXRyeSggcG9pbnRzLCBzZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cbkxhdGhlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5MYXRoZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExhdGhlR2VvbWV0cnk7XG5cbi8vIExhdGhlQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gTGF0aGVCdWZmZXJHZW9tZXRyeSggcG9pbnRzLCBzZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0xhdGhlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRwb2ludHM6IHBvaW50cyxcblx0XHRzZWdtZW50czogc2VnbWVudHMsXG5cdFx0cGhpU3RhcnQ6IHBoaVN0YXJ0LFxuXHRcdHBoaUxlbmd0aDogcGhpTGVuZ3RoXG5cdH07XG5cblx0c2VnbWVudHMgPSBNYXRoLmZsb29yKCBzZWdtZW50cyApIHx8IDEyO1xuXHRwaGlTdGFydCA9IHBoaVN0YXJ0IHx8IDA7XG5cdHBoaUxlbmd0aCA9IHBoaUxlbmd0aCB8fCBNYXRoLlBJICogMjtcblxuXHQvLyBjbGFtcCBwaGlMZW5ndGggc28gaXQncyBpbiByYW5nZSBvZiBbIDAsIDJQSSBdXG5cblx0cGhpTGVuZ3RoID0gX01hdGguY2xhbXAoIHBoaUxlbmd0aCwgMCwgTWF0aC5QSSAqIDIgKTtcblxuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgYmFzZTtcblx0dmFyIGludmVyc2VTZWdtZW50cyA9IDEuMCAvIHNlZ21lbnRzO1xuXHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHV2ID0gbmV3IFZlY3RvcjIoKTtcblx0dmFyIGksIGo7XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXMgYW5kIHV2c1xuXG5cdGZvciAoIGkgPSAwOyBpIDw9IHNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0dmFyIHBoaSA9IHBoaVN0YXJ0ICsgaSAqIGludmVyc2VTZWdtZW50cyAqIHBoaUxlbmd0aDtcblxuXHRcdHZhciBzaW4gPSBNYXRoLnNpbiggcGhpICk7XG5cdFx0dmFyIGNvcyA9IE1hdGguY29zKCBwaGkgKTtcblxuXHRcdGZvciAoIGogPSAwOyBqIDw9ICggcG9pbnRzLmxlbmd0aCAtIDEgKTsgaiArKyApIHtcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdHZlcnRleC54ID0gcG9pbnRzWyBqIF0ueCAqIHNpbjtcblx0XHRcdHZlcnRleC55ID0gcG9pbnRzWyBqIF0ueTtcblx0XHRcdHZlcnRleC56ID0gcG9pbnRzWyBqIF0ueCAqIGNvcztcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1di54ID0gaSAvIHNlZ21lbnRzO1xuXHRcdFx0dXYueSA9IGogLyAoIHBvaW50cy5sZW5ndGggLSAxICk7XG5cblx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gaW5kaWNlc1xuXG5cdGZvciAoIGkgPSAwOyBpIDwgc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRmb3IgKCBqID0gMDsgaiA8ICggcG9pbnRzLmxlbmd0aCAtIDEgKTsgaiArKyApIHtcblxuXHRcdFx0YmFzZSA9IGogKyBpICogcG9pbnRzLmxlbmd0aDtcblxuXHRcdFx0dmFyIGEgPSBiYXNlO1xuXHRcdFx0dmFyIGIgPSBiYXNlICsgcG9pbnRzLmxlbmd0aDtcblx0XHRcdHZhciBjID0gYmFzZSArIHBvaW50cy5sZW5ndGggKyAxO1xuXHRcdFx0dmFyIGQgPSBiYXNlICsgMTtcblxuXHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblx0Ly8gZ2VuZXJhdGUgbm9ybWFsc1xuXG5cdHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtcblxuXHQvLyBpZiB0aGUgZ2VvbWV0cnkgaXMgY2xvc2VkLCB3ZSBuZWVkIHRvIGF2ZXJhZ2UgdGhlIG5vcm1hbHMgYWxvbmcgdGhlIHNlYW0uXG5cdC8vIGJlY2F1c2UgdGhlIGNvcnJlc3BvbmRpbmcgdmVydGljZXMgYXJlIGlkZW50aWNhbCAoYnV0IHN0aWxsIGhhdmUgZGlmZmVyZW50IFVWcykuXG5cblx0aWYgKCBwaGlMZW5ndGggPT09IE1hdGguUEkgKiAyICkge1xuXG5cdFx0dmFyIG5vcm1hbHMgPSB0aGlzLmF0dHJpYnV0ZXMubm9ybWFsLmFycmF5O1xuXHRcdHZhciBuMSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIG4yID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHQvLyB0aGlzIGlzIHRoZSBidWZmZXIgb2Zmc2V0IGZvciB0aGUgbGFzdCBsaW5lIG9mIHZlcnRpY2VzXG5cblx0XHRiYXNlID0gc2VnbWVudHMgKiBwb2ludHMubGVuZ3RoICogMztcblxuXHRcdGZvciAoIGkgPSAwLCBqID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkgKyssIGogKz0gMyApIHtcblxuXHRcdFx0Ly8gc2VsZWN0IHRoZSBub3JtYWwgb2YgdGhlIHZlcnRleCBpbiB0aGUgZmlyc3QgbGluZVxuXG5cdFx0XHRuMS54ID0gbm9ybWFsc1sgaiArIDAgXTtcblx0XHRcdG4xLnkgPSBub3JtYWxzWyBqICsgMSBdO1xuXHRcdFx0bjEueiA9IG5vcm1hbHNbIGogKyAyIF07XG5cblx0XHRcdC8vIHNlbGVjdCB0aGUgbm9ybWFsIG9mIHRoZSB2ZXJ0ZXggaW4gdGhlIGxhc3QgbGluZVxuXG5cdFx0XHRuMi54ID0gbm9ybWFsc1sgYmFzZSArIGogKyAwIF07XG5cdFx0XHRuMi55ID0gbm9ybWFsc1sgYmFzZSArIGogKyAxIF07XG5cdFx0XHRuMi56ID0gbm9ybWFsc1sgYmFzZSArIGogKyAyIF07XG5cblx0XHRcdC8vIGF2ZXJhZ2Ugbm9ybWFsc1xuXG5cdFx0XHRuLmFkZFZlY3RvcnMoIG4xLCBuMiApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHQvLyBhc3NpZ24gdGhlIG5ldyB2YWx1ZXMgdG8gYm90aCBub3JtYWxzXG5cblx0XHRcdG5vcm1hbHNbIGogKyAwIF0gPSBub3JtYWxzWyBiYXNlICsgaiArIDAgXSA9IG4ueDtcblx0XHRcdG5vcm1hbHNbIGogKyAxIF0gPSBub3JtYWxzWyBiYXNlICsgaiArIDEgXSA9IG4ueTtcblx0XHRcdG5vcm1hbHNbIGogKyAyIF0gPSBub3JtYWxzWyBiYXNlICsgaiArIDIgXSA9IG4uejtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuTGF0aGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkxhdGhlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGF0aGVCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIGpvbm9icjEgLyBodHRwOi8vam9ub2JyMS5jb21cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gU2hhcGVHZW9tZXRyeVxuXG5mdW5jdGlvbiBTaGFwZUdlb21ldHJ5KCBzaGFwZXMsIGN1cnZlU2VnbWVudHMgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTaGFwZUdlb21ldHJ5JztcblxuXHRpZiAoIHR5cGVvZiBjdXJ2ZVNlZ21lbnRzID09PSAnb2JqZWN0JyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNoYXBlR2VvbWV0cnk6IE9wdGlvbnMgcGFyYW1ldGVyIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdFx0Y3VydmVTZWdtZW50cyA9IGN1cnZlU2VnbWVudHMuY3VydmVTZWdtZW50cztcblxuXHR9XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHNoYXBlczogc2hhcGVzLFxuXHRcdGN1cnZlU2VnbWVudHM6IGN1cnZlU2VnbWVudHNcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFNoYXBlQnVmZmVyR2VvbWV0cnkoIHNoYXBlcywgY3VydmVTZWdtZW50cyApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblNoYXBlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5TaGFwZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNoYXBlR2VvbWV0cnk7XG5cblNoYXBlR2VvbWV0cnkucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZGF0YSA9IEdlb21ldHJ5LnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdHZhciBzaGFwZXMgPSB0aGlzLnBhcmFtZXRlcnMuc2hhcGVzO1xuXG5cdHJldHVybiB0b0pTT04oIHNoYXBlcywgZGF0YSApO1xuXG59O1xuXG4vLyBTaGFwZUJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFNoYXBlQnVmZmVyR2VvbWV0cnkoIHNoYXBlcywgY3VydmVTZWdtZW50cyApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1NoYXBlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRzaGFwZXM6IHNoYXBlcyxcblx0XHRjdXJ2ZVNlZ21lbnRzOiBjdXJ2ZVNlZ21lbnRzXG5cdH07XG5cblx0Y3VydmVTZWdtZW50cyA9IGN1cnZlU2VnbWVudHMgfHwgMTI7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBncm91cFN0YXJ0ID0gMDtcblx0dmFyIGdyb3VwQ291bnQgPSAwO1xuXG5cdC8vIGFsbG93IHNpbmdsZSBhbmQgYXJyYXkgdmFsdWVzIGZvciBcInNoYXBlc1wiIHBhcmFtZXRlclxuXG5cdGlmICggQXJyYXkuaXNBcnJheSggc2hhcGVzICkgPT09IGZhbHNlICkge1xuXG5cdFx0YWRkU2hhcGUoIHNoYXBlcyApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBzaGFwZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRhZGRTaGFwZSggc2hhcGVzWyBpIF0gKTtcblxuXHRcdFx0dGhpcy5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgaSApOyAvLyBlbmFibGVzIE11bHRpTWF0ZXJpYWwgc3VwcG9ydFxuXG5cdFx0XHRncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7XG5cdFx0XHRncm91cENvdW50ID0gMDtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cblx0Ly8gaGVscGVyIGZ1bmN0aW9uc1xuXG5cdGZ1bmN0aW9uIGFkZFNoYXBlKCBzaGFwZSApIHtcblxuXHRcdHZhciBpLCBsLCBzaGFwZUhvbGU7XG5cblx0XHR2YXIgaW5kZXhPZmZzZXQgPSB2ZXJ0aWNlcy5sZW5ndGggLyAzO1xuXHRcdHZhciBwb2ludHMgPSBzaGFwZS5leHRyYWN0UG9pbnRzKCBjdXJ2ZVNlZ21lbnRzICk7XG5cblx0XHR2YXIgc2hhcGVWZXJ0aWNlcyA9IHBvaW50cy5zaGFwZTtcblx0XHR2YXIgc2hhcGVIb2xlcyA9IHBvaW50cy5ob2xlcztcblxuXHRcdC8vIGNoZWNrIGRpcmVjdGlvbiBvZiB2ZXJ0aWNlc1xuXG5cdFx0aWYgKCBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCBzaGFwZVZlcnRpY2VzICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRzaGFwZVZlcnRpY2VzID0gc2hhcGVWZXJ0aWNlcy5yZXZlcnNlKCk7XG5cblx0XHRcdC8vIGFsc28gY2hlY2sgaWYgaG9sZXMgYXJlIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb25cblxuXHRcdFx0Zm9yICggaSA9IDAsIGwgPSBzaGFwZUhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0c2hhcGVIb2xlID0gc2hhcGVIb2xlc1sgaSBdO1xuXG5cdFx0XHRcdGlmICggU2hhcGVVdGlscy5pc0Nsb2NrV2lzZSggc2hhcGVIb2xlICkgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHRzaGFwZUhvbGVzWyBpIF0gPSBzaGFwZUhvbGUucmV2ZXJzZSgpO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGZhY2VzID0gU2hhcGVVdGlscy50cmlhbmd1bGF0ZVNoYXBlKCBzaGFwZVZlcnRpY2VzLCBzaGFwZUhvbGVzICk7XG5cblx0XHQvLyBqb2luIHZlcnRpY2VzIG9mIGlubmVyIGFuZCBvdXRlciBwYXRocyB0byBhIHNpbmdsZSBhcnJheVxuXG5cdFx0Zm9yICggaSA9IDAsIGwgPSBzaGFwZUhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHNoYXBlSG9sZSA9IHNoYXBlSG9sZXNbIGkgXTtcblx0XHRcdHNoYXBlVmVydGljZXMgPSBzaGFwZVZlcnRpY2VzLmNvbmNhdCggc2hhcGVIb2xlICk7XG5cblx0XHR9XG5cblx0XHQvLyB2ZXJ0aWNlcywgbm9ybWFscywgdXZzXG5cblx0XHRmb3IgKCBpID0gMCwgbCA9IHNoYXBlVmVydGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHZlcnRleCA9IHNoYXBlVmVydGljZXNbIGkgXTtcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCAwICk7XG5cdFx0XHRub3JtYWxzLnB1c2goIDAsIDAsIDEgKTtcblx0XHRcdHV2cy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnkgKTsgLy8gd29ybGQgdXZzXG5cblx0XHR9XG5cblx0XHQvLyBpbmNpZGVzXG5cblx0XHRmb3IgKCBpID0gMCwgbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlID0gZmFjZXNbIGkgXTtcblxuXHRcdFx0dmFyIGEgPSBmYWNlWyAwIF0gKyBpbmRleE9mZnNldDtcblx0XHRcdHZhciBiID0gZmFjZVsgMSBdICsgaW5kZXhPZmZzZXQ7XG5cdFx0XHR2YXIgYyA9IGZhY2VbIDIgXSArIGluZGV4T2Zmc2V0O1xuXG5cdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGMgKTtcblx0XHRcdGdyb3VwQ291bnQgKz0gMztcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuU2hhcGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblNoYXBlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2hhcGVCdWZmZXJHZW9tZXRyeTtcblxuU2hhcGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0dmFyIHNoYXBlcyA9IHRoaXMucGFyYW1ldGVycy5zaGFwZXM7XG5cblx0cmV0dXJuIHRvSlNPTiggc2hhcGVzLCBkYXRhICk7XG5cbn07XG5cbi8vXG5cbmZ1bmN0aW9uIHRvSlNPTiggc2hhcGVzLCBkYXRhICkge1xuXG5cdGRhdGEuc2hhcGVzID0gW107XG5cblx0aWYgKCBBcnJheS5pc0FycmF5KCBzaGFwZXMgKSApIHtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHNoYXBlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgc2hhcGUgPSBzaGFwZXNbIGkgXTtcblxuXHRcdFx0ZGF0YS5zaGFwZXMucHVzaCggc2hhcGUudXVpZCApO1xuXG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cblx0XHRkYXRhLnNoYXBlcy5wdXNoKCBzaGFwZXMudXVpZCApO1xuXG5cdH1cblxuXHRyZXR1cm4gZGF0YTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5mdW5jdGlvbiBFZGdlc0dlb21ldHJ5KCBnZW9tZXRyeSwgdGhyZXNob2xkQW5nbGUgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdFZGdlc0dlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0dGhyZXNob2xkQW5nbGU6IHRocmVzaG9sZEFuZ2xlXG5cdH07XG5cblx0dGhyZXNob2xkQW5nbGUgPSAoIHRocmVzaG9sZEFuZ2xlICE9PSB1bmRlZmluZWQgKSA/IHRocmVzaG9sZEFuZ2xlIDogMTtcblxuXHQvLyBidWZmZXJcblxuXHR2YXIgdmVydGljZXMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIHRocmVzaG9sZERvdCA9IE1hdGguY29zKCBfTWF0aC5ERUcyUkFEICogdGhyZXNob2xkQW5nbGUgKTtcblx0dmFyIGVkZ2UgPSBbIDAsIDAgXSwgZWRnZXMgPSB7fSwgZWRnZTEsIGVkZ2UyO1xuXHR2YXIga2V5LCBrZXlzID0gWyAnYScsICdiJywgJ2MnIF07XG5cblx0Ly8gcHJlcGFyZSBzb3VyY2UgZ2VvbWV0cnlcblxuXHR2YXIgZ2VvbWV0cnkyO1xuXG5cdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdGdlb21ldHJ5MiA9IG5ldyBHZW9tZXRyeSgpO1xuXHRcdGdlb21ldHJ5Mi5mcm9tQnVmZmVyR2VvbWV0cnkoIGdlb21ldHJ5ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdGdlb21ldHJ5MiA9IGdlb21ldHJ5LmNsb25lKCk7XG5cblx0fVxuXG5cdGdlb21ldHJ5Mi5tZXJnZVZlcnRpY2VzKCk7XG5cdGdlb21ldHJ5Mi5jb21wdXRlRmFjZU5vcm1hbHMoKTtcblxuXHR2YXIgc291cmNlVmVydGljZXMgPSBnZW9tZXRyeTIudmVydGljZXM7XG5cdHZhciBmYWNlcyA9IGdlb21ldHJ5Mi5mYWNlcztcblxuXHQvLyBub3cgY3JlYXRlIGEgZGF0YSBzdHJ1Y3R1cmUgd2hlcmUgZWFjaCBlbnRyeSByZXByZXNlbnRzIGFuIGVkZ2Ugd2l0aCBpdHMgYWRqb2luaW5nIGZhY2VzXG5cblx0Zm9yICggdmFyIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdHZhciBmYWNlID0gZmFjZXNbIGkgXTtcblxuXHRcdGZvciAoIHZhciBqID0gMDsgaiA8IDM7IGogKysgKSB7XG5cblx0XHRcdGVkZ2UxID0gZmFjZVsga2V5c1sgaiBdIF07XG5cdFx0XHRlZGdlMiA9IGZhY2VbIGtleXNbICggaiArIDEgKSAlIDMgXSBdO1xuXHRcdFx0ZWRnZVsgMCBdID0gTWF0aC5taW4oIGVkZ2UxLCBlZGdlMiApO1xuXHRcdFx0ZWRnZVsgMSBdID0gTWF0aC5tYXgoIGVkZ2UxLCBlZGdlMiApO1xuXG5cdFx0XHRrZXkgPSBlZGdlWyAwIF0gKyAnLCcgKyBlZGdlWyAxIF07XG5cblx0XHRcdGlmICggZWRnZXNbIGtleSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0ZWRnZXNbIGtleSBdID0geyBpbmRleDE6IGVkZ2VbIDAgXSwgaW5kZXgyOiBlZGdlWyAxIF0sIGZhY2UxOiBpLCBmYWNlMjogdW5kZWZpbmVkIH07XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0ZWRnZXNbIGtleSBdLmZhY2UyID0gaTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlc1xuXG5cdGZvciAoIGtleSBpbiBlZGdlcyApIHtcblxuXHRcdHZhciBlID0gZWRnZXNbIGtleSBdO1xuXG5cdFx0Ly8gYW4gZWRnZSBpcyBvbmx5IHJlbmRlcmVkIGlmIHRoZSBhbmdsZSAoaW4gZGVncmVlcykgYmV0d2VlbiB0aGUgZmFjZSBub3JtYWxzIG9mIHRoZSBhZGpvaW5pbmcgZmFjZXMgZXhjZWVkcyB0aGlzIHZhbHVlLiBkZWZhdWx0ID0gMSBkZWdyZWUuXG5cblx0XHRpZiAoIGUuZmFjZTIgPT09IHVuZGVmaW5lZCB8fCBmYWNlc1sgZS5mYWNlMSBdLm5vcm1hbC5kb3QoIGZhY2VzWyBlLmZhY2UyIF0ubm9ybWFsICkgPD0gdGhyZXNob2xkRG90ICkge1xuXG5cdFx0XHR2YXIgdmVydGV4ID0gc291cmNlVmVydGljZXNbIGUuaW5kZXgxIF07XG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdHZlcnRleCA9IHNvdXJjZVZlcnRpY2VzWyBlLmluZGV4MiBdO1xuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXG59XG5cbkVkZ2VzR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5FZGdlc0dlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEVkZ2VzR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gQ3lsaW5kZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBDeWxpbmRlckdlb21ldHJ5KCByYWRpdXNUb3AsIHJhZGl1c0JvdHRvbSwgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDeWxpbmRlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzVG9wOiByYWRpdXNUb3AsXG5cdFx0cmFkaXVzQm90dG9tOiByYWRpdXNCb3R0b20sXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRvcGVuRW5kZWQ6IG9wZW5FbmRlZCxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSggcmFkaXVzVG9wLCByYWRpdXNCb3R0b20sIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuQ3lsaW5kZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkN5bGluZGVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3lsaW5kZXJHZW9tZXRyeTtcblxuLy8gQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5KCByYWRpdXNUb3AsIHJhZGl1c0JvdHRvbSwgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDeWxpbmRlckJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzVG9wOiByYWRpdXNUb3AsXG5cdFx0cmFkaXVzQm90dG9tOiByYWRpdXNCb3R0b20sXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRvcGVuRW5kZWQ6IG9wZW5FbmRlZCxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHZhciBzY29wZSA9IHRoaXM7XG5cblx0cmFkaXVzVG9wID0gcmFkaXVzVG9wICE9PSB1bmRlZmluZWQgPyByYWRpdXNUb3AgOiAxO1xuXHRyYWRpdXNCb3R0b20gPSByYWRpdXNCb3R0b20gIT09IHVuZGVmaW5lZCA/IHJhZGl1c0JvdHRvbSA6IDE7XG5cdGhlaWdodCA9IGhlaWdodCB8fCAxO1xuXG5cdHJhZGlhbFNlZ21lbnRzID0gTWF0aC5mbG9vciggcmFkaWFsU2VnbWVudHMgKSB8fCA4O1xuXHRoZWlnaHRTZWdtZW50cyA9IE1hdGguZmxvb3IoIGhlaWdodFNlZ21lbnRzICkgfHwgMTtcblxuXHRvcGVuRW5kZWQgPSBvcGVuRW5kZWQgIT09IHVuZGVmaW5lZCA/IG9wZW5FbmRlZCA6IGZhbHNlO1xuXHR0aGV0YVN0YXJ0ID0gdGhldGFTdGFydCAhPT0gdW5kZWZpbmVkID8gdGhldGFTdGFydCA6IDAuMDtcblx0dGhldGFMZW5ndGggPSB0aGV0YUxlbmd0aCAhPT0gdW5kZWZpbmVkID8gdGhldGFMZW5ndGggOiBNYXRoLlBJICogMjtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIGluZGV4ID0gMDtcblx0dmFyIGluZGV4QXJyYXkgPSBbXTtcblx0dmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuXHR2YXIgZ3JvdXBTdGFydCA9IDA7XG5cblx0Ly8gZ2VuZXJhdGUgZ2VvbWV0cnlcblxuXHRnZW5lcmF0ZVRvcnNvKCk7XG5cblx0aWYgKCBvcGVuRW5kZWQgPT09IGZhbHNlICkge1xuXG5cdFx0aWYgKCByYWRpdXNUb3AgPiAwICkgZ2VuZXJhdGVDYXAoIHRydWUgKTtcblx0XHRpZiAoIHJhZGl1c0JvdHRvbSA+IDAgKSBnZW5lcmF0ZUNhcCggZmFsc2UgKTtcblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlVG9yc28oKSB7XG5cblx0XHR2YXIgeCwgeTtcblx0XHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciBncm91cENvdW50ID0gMDtcblxuXHRcdC8vIHRoaXMgd2lsbCBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgbm9ybWFsXG5cdFx0dmFyIHNsb3BlID0gKCByYWRpdXNCb3R0b20gLSByYWRpdXNUb3AgKSAvIGhlaWdodDtcblxuXHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRcdGZvciAoIHkgPSAwOyB5IDw9IGhlaWdodFNlZ21lbnRzOyB5ICsrICkge1xuXG5cdFx0XHR2YXIgaW5kZXhSb3cgPSBbXTtcblxuXHRcdFx0dmFyIHYgPSB5IC8gaGVpZ2h0U2VnbWVudHM7XG5cblx0XHRcdC8vIGNhbGN1bGF0ZSB0aGUgcmFkaXVzIG9mIHRoZSBjdXJyZW50IHJvd1xuXG5cdFx0XHR2YXIgcmFkaXVzID0gdiAqICggcmFkaXVzQm90dG9tIC0gcmFkaXVzVG9wICkgKyByYWRpdXNUb3A7XG5cblx0XHRcdGZvciAoIHggPSAwOyB4IDw9IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkge1xuXG5cdFx0XHRcdHZhciB1ID0geCAvIHJhZGlhbFNlZ21lbnRzO1xuXG5cdFx0XHRcdHZhciB0aGV0YSA9IHUgKiB0aGV0YUxlbmd0aCArIHRoZXRhU3RhcnQ7XG5cblx0XHRcdFx0dmFyIHNpblRoZXRhID0gTWF0aC5zaW4oIHRoZXRhICk7XG5cdFx0XHRcdHZhciBjb3NUaGV0YSA9IE1hdGguY29zKCB0aGV0YSApO1xuXG5cdFx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHRcdHZlcnRleC54ID0gcmFkaXVzICogc2luVGhldGE7XG5cdFx0XHRcdHZlcnRleC55ID0gLSB2ICogaGVpZ2h0ICsgaGFsZkhlaWdodDtcblx0XHRcdFx0dmVydGV4LnogPSByYWRpdXMgKiBjb3NUaGV0YTtcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRcdG5vcm1hbC5zZXQoIHNpblRoZXRhLCBzbG9wZSwgY29zVGhldGEgKS5ub3JtYWxpemUoKTtcblx0XHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdFx0Ly8gdXZcblxuXHRcdFx0XHR1dnMucHVzaCggdSwgMSAtIHYgKTtcblxuXHRcdFx0XHQvLyBzYXZlIGluZGV4IG9mIHZlcnRleCBpbiByZXNwZWN0aXZlIHJvd1xuXG5cdFx0XHRcdGluZGV4Um93LnB1c2goIGluZGV4ICsrICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gbm93IHNhdmUgdmVydGljZXMgb2YgdGhlIHJvdyBpbiBvdXIgaW5kZXggYXJyYXlcblxuXHRcdFx0aW5kZXhBcnJheS5wdXNoKCBpbmRleFJvdyApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZ2VuZXJhdGUgaW5kaWNlc1xuXG5cdFx0Zm9yICggeCA9IDA7IHggPCByYWRpYWxTZWdtZW50czsgeCArKyApIHtcblxuXHRcdFx0Zm9yICggeSA9IDA7IHkgPCBoZWlnaHRTZWdtZW50czsgeSArKyApIHtcblxuXHRcdFx0XHQvLyB3ZSB1c2UgdGhlIGluZGV4IGFycmF5IHRvIGFjY2VzcyB0aGUgY29ycmVjdCBpbmRpY2VzXG5cblx0XHRcdFx0dmFyIGEgPSBpbmRleEFycmF5WyB5IF1bIHggXTtcblx0XHRcdFx0dmFyIGIgPSBpbmRleEFycmF5WyB5ICsgMSBdWyB4IF07XG5cdFx0XHRcdHZhciBjID0gaW5kZXhBcnJheVsgeSArIDEgXVsgeCArIDEgXTtcblx0XHRcdFx0dmFyIGQgPSBpbmRleEFycmF5WyB5IF1bIHggKyAxIF07XG5cblx0XHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHRcdFx0Ly8gdXBkYXRlIGdyb3VwIGNvdW50ZXJcblxuXHRcdFx0XHRncm91cENvdW50ICs9IDY7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGFkZCBhIGdyb3VwIHRvIHRoZSBnZW9tZXRyeS4gdGhpcyB3aWxsIGVuc3VyZSBtdWx0aSBtYXRlcmlhbCBzdXBwb3J0XG5cblx0XHRzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgMCApO1xuXG5cdFx0Ly8gY2FsY3VsYXRlIG5ldyBzdGFydCB2YWx1ZSBmb3IgZ3JvdXBzXG5cblx0XHRncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlQ2FwKCB0b3AgKSB7XG5cblx0XHR2YXIgeCwgY2VudGVySW5kZXhTdGFydCwgY2VudGVySW5kZXhFbmQ7XG5cblx0XHR2YXIgdXYgPSBuZXcgVmVjdG9yMigpO1xuXHRcdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIGdyb3VwQ291bnQgPSAwO1xuXG5cdFx0dmFyIHJhZGl1cyA9ICggdG9wID09PSB0cnVlICkgPyByYWRpdXNUb3AgOiByYWRpdXNCb3R0b207XG5cdFx0dmFyIHNpZ24gPSAoIHRvcCA9PT0gdHJ1ZSApID8gMSA6IC0gMTtcblxuXHRcdC8vIHNhdmUgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjZW50ZXIgdmVydGV4XG5cdFx0Y2VudGVySW5kZXhTdGFydCA9IGluZGV4O1xuXG5cdFx0Ly8gZmlyc3Qgd2UgZ2VuZXJhdGUgdGhlIGNlbnRlciB2ZXJ0ZXggZGF0YSBvZiB0aGUgY2FwLlxuXHRcdC8vIGJlY2F1c2UgdGhlIGdlb21ldHJ5IG5lZWRzIG9uZSBzZXQgb2YgdXZzIHBlciBmYWNlLFxuXHRcdC8vIHdlIG11c3QgZ2VuZXJhdGUgYSBjZW50ZXIgdmVydGV4IHBlciBmYWNlL3NlZ21lbnRcblxuXHRcdGZvciAoIHggPSAxOyB4IDw9IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkge1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0dmVydGljZXMucHVzaCggMCwgaGFsZkhlaWdodCAqIHNpZ24sIDAgKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdG5vcm1hbHMucHVzaCggMCwgc2lnbiwgMCApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1dnMucHVzaCggMC41LCAwLjUgKTtcblxuXHRcdFx0Ly8gaW5jcmVhc2UgaW5kZXhcblxuXHRcdFx0aW5kZXggKys7XG5cblx0XHR9XG5cblx0XHQvLyBzYXZlIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBjZW50ZXIgdmVydGV4XG5cblx0XHRjZW50ZXJJbmRleEVuZCA9IGluZGV4O1xuXG5cdFx0Ly8gbm93IHdlIGdlbmVyYXRlIHRoZSBzdXJyb3VuZGluZyB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0XHRmb3IgKCB4ID0gMDsgeCA8PSByYWRpYWxTZWdtZW50czsgeCArKyApIHtcblxuXHRcdFx0dmFyIHUgPSB4IC8gcmFkaWFsU2VnbWVudHM7XG5cdFx0XHR2YXIgdGhldGEgPSB1ICogdGhldGFMZW5ndGggKyB0aGV0YVN0YXJ0O1xuXG5cdFx0XHR2YXIgY29zVGhldGEgPSBNYXRoLmNvcyggdGhldGEgKTtcblx0XHRcdHZhciBzaW5UaGV0YSA9IE1hdGguc2luKCB0aGV0YSApO1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0dmVydGV4LnggPSByYWRpdXMgKiBzaW5UaGV0YTtcblx0XHRcdHZlcnRleC55ID0gaGFsZkhlaWdodCAqIHNpZ247XG5cdFx0XHR2ZXJ0ZXgueiA9IHJhZGl1cyAqIGNvc1RoZXRhO1xuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0bm9ybWFscy5wdXNoKCAwLCBzaWduLCAwICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2LnggPSAoIGNvc1RoZXRhICogMC41ICkgKyAwLjU7XG5cdFx0XHR1di55ID0gKCBzaW5UaGV0YSAqIDAuNSAqIHNpZ24gKSArIDAuNTtcblx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblx0XHRcdC8vIGluY3JlYXNlIGluZGV4XG5cblx0XHRcdGluZGV4ICsrO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZ2VuZXJhdGUgaW5kaWNlc1xuXG5cdFx0Zm9yICggeCA9IDA7IHggPCByYWRpYWxTZWdtZW50czsgeCArKyApIHtcblxuXHRcdFx0dmFyIGMgPSBjZW50ZXJJbmRleFN0YXJ0ICsgeDtcblx0XHRcdHZhciBpID0gY2VudGVySW5kZXhFbmQgKyB4O1xuXG5cdFx0XHRpZiAoIHRvcCA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHQvLyBmYWNlIHRvcFxuXG5cdFx0XHRcdGluZGljZXMucHVzaCggaSwgaSArIDEsIGMgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBmYWNlIGJvdHRvbVxuXG5cdFx0XHRcdGluZGljZXMucHVzaCggaSArIDEsIGksIGMgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRncm91cENvdW50ICs9IDM7XG5cblx0XHR9XG5cblx0XHQvLyBhZGQgYSBncm91cCB0byB0aGUgZ2VvbWV0cnkuIHRoaXMgd2lsbCBlbnN1cmUgbXVsdGkgbWF0ZXJpYWwgc3VwcG9ydFxuXG5cdFx0c2NvcGUuYWRkR3JvdXAoIGdyb3VwU3RhcnQsIGdyb3VwQ291bnQsIHRvcCA9PT0gdHJ1ZSA/IDEgOiAyICk7XG5cblx0XHQvLyBjYWxjdWxhdGUgbmV3IHN0YXJ0IHZhbHVlIGZvciBncm91cHNcblxuXHRcdGdyb3VwU3RhcnQgKz0gZ3JvdXBDb3VudDtcblxuXHR9XG5cbn1cblxuQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkN5bGluZGVyQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIGFiZWxuYXRpb24gLyBodHRwOi8vZ2l0aHViLmNvbS9hYmVsbmF0aW9uXG4gKi9cblxuLy8gQ29uZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIENvbmVHZW9tZXRyeSggcmFkaXVzLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRDeWxpbmRlckdlb21ldHJ5LmNhbGwoIHRoaXMsIDAsIHJhZGl1cywgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKTtcblxuXHR0aGlzLnR5cGUgPSAnQ29uZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRvcGVuRW5kZWQ6IG9wZW5FbmRlZCxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG59XG5cbkNvbmVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDeWxpbmRlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuQ29uZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvbmVHZW9tZXRyeTtcblxuLy8gQ29uZUJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIENvbmVCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRDeWxpbmRlckJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMsIDAsIHJhZGl1cywgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKTtcblxuXHR0aGlzLnR5cGUgPSAnQ29uZUJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRvcGVuRW5kZWQ6IG9wZW5FbmRlZCxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG59XG5cbkNvbmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuQ29uZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvbmVCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXNcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKiBAYXV0aG9yIGh1Z2hlc1xuICovXG5cbi8vIENpcmNsZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIENpcmNsZUdlb21ldHJ5KCByYWRpdXMsIHNlZ21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0NpcmNsZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0c2VnbWVudHM6IHNlZ21lbnRzLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBDaXJjbGVCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBzZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5DaXJjbGVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkNpcmNsZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENpcmNsZUdlb21ldHJ5O1xuXG4vLyBDaXJjbGVCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBDaXJjbGVCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBzZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDaXJjbGVCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHNlZ21lbnRzOiBzZWdtZW50cyxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHJhZGl1cyA9IHJhZGl1cyB8fCAxO1xuXHRzZWdtZW50cyA9IHNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBNYXRoLm1heCggMywgc2VnbWVudHMgKSA6IDg7XG5cblx0dGhldGFTdGFydCA9IHRoZXRhU3RhcnQgIT09IHVuZGVmaW5lZCA/IHRoZXRhU3RhcnQgOiAwO1xuXHR0aGV0YUxlbmd0aCA9IHRoZXRhTGVuZ3RoICE9PSB1bmRlZmluZWQgPyB0aGV0YUxlbmd0aCA6IE1hdGguUEkgKiAyO1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgaSwgcztcblx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB1diA9IG5ldyBWZWN0b3IyKCk7XG5cblx0Ly8gY2VudGVyIHBvaW50XG5cblx0dmVydGljZXMucHVzaCggMCwgMCwgMCApO1xuXHRub3JtYWxzLnB1c2goIDAsIDAsIDEgKTtcblx0dXZzLnB1c2goIDAuNSwgMC41ICk7XG5cblx0Zm9yICggcyA9IDAsIGkgPSAzOyBzIDw9IHNlZ21lbnRzOyBzICsrLCBpICs9IDMgKSB7XG5cblx0XHR2YXIgc2VnbWVudCA9IHRoZXRhU3RhcnQgKyBzIC8gc2VnbWVudHMgKiB0aGV0YUxlbmd0aDtcblxuXHRcdC8vIHZlcnRleFxuXG5cdFx0dmVydGV4LnggPSByYWRpdXMgKiBNYXRoLmNvcyggc2VnbWVudCApO1xuXHRcdHZlcnRleC55ID0gcmFkaXVzICogTWF0aC5zaW4oIHNlZ21lbnQgKTtcblxuXHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdC8vIG5vcm1hbFxuXG5cdFx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XG5cblx0XHQvLyB1dnNcblxuXHRcdHV2LnggPSAoIHZlcnRpY2VzWyBpIF0gLyByYWRpdXMgKyAxICkgLyAyO1xuXHRcdHV2LnkgPSAoIHZlcnRpY2VzWyBpICsgMSBdIC8gcmFkaXVzICsgMSApIC8gMjtcblxuXHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblx0fVxuXG5cdC8vIGluZGljZXNcblxuXHRmb3IgKCBpID0gMTsgaSA8PSBzZWdtZW50czsgaSArKyApIHtcblxuXHRcdGluZGljZXMucHVzaCggaSwgaSArIDEsIDAgKTtcblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG59XG5cbkNpcmNsZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuQ2lyY2xlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2lyY2xlQnVmZmVyR2VvbWV0cnk7XG5cblxuXG52YXIgR2VvbWV0cmllcyA9IE9iamVjdC5mcmVlemUoe1xuXHRXaXJlZnJhbWVHZW9tZXRyeTogV2lyZWZyYW1lR2VvbWV0cnksXG5cdFBhcmFtZXRyaWNHZW9tZXRyeTogUGFyYW1ldHJpY0dlb21ldHJ5LFxuXHRQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnk6IFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSxcblx0VGV0cmFoZWRyb25HZW9tZXRyeTogVGV0cmFoZWRyb25HZW9tZXRyeSxcblx0VGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeTogVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSxcblx0T2N0YWhlZHJvbkdlb21ldHJ5OiBPY3RhaGVkcm9uR2VvbWV0cnksXG5cdE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeTogT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5LFxuXHRJY29zYWhlZHJvbkdlb21ldHJ5OiBJY29zYWhlZHJvbkdlb21ldHJ5LFxuXHRJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LFxuXHREb2RlY2FoZWRyb25HZW9tZXRyeTogRG9kZWNhaGVkcm9uR2VvbWV0cnksXG5cdERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSxcblx0UG9seWhlZHJvbkdlb21ldHJ5OiBQb2x5aGVkcm9uR2VvbWV0cnksXG5cdFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeTogUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LFxuXHRUdWJlR2VvbWV0cnk6IFR1YmVHZW9tZXRyeSxcblx0VHViZUJ1ZmZlckdlb21ldHJ5OiBUdWJlQnVmZmVyR2VvbWV0cnksXG5cdFRvcnVzS25vdEdlb21ldHJ5OiBUb3J1c0tub3RHZW9tZXRyeSxcblx0VG9ydXNLbm90QnVmZmVyR2VvbWV0cnk6IFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5LFxuXHRUb3J1c0dlb21ldHJ5OiBUb3J1c0dlb21ldHJ5LFxuXHRUb3J1c0J1ZmZlckdlb21ldHJ5OiBUb3J1c0J1ZmZlckdlb21ldHJ5LFxuXHRUZXh0R2VvbWV0cnk6IFRleHRHZW9tZXRyeSxcblx0VGV4dEJ1ZmZlckdlb21ldHJ5OiBUZXh0QnVmZmVyR2VvbWV0cnksXG5cdFNwaGVyZUdlb21ldHJ5OiBTcGhlcmVHZW9tZXRyeSxcblx0U3BoZXJlQnVmZmVyR2VvbWV0cnk6IFNwaGVyZUJ1ZmZlckdlb21ldHJ5LFxuXHRSaW5nR2VvbWV0cnk6IFJpbmdHZW9tZXRyeSxcblx0UmluZ0J1ZmZlckdlb21ldHJ5OiBSaW5nQnVmZmVyR2VvbWV0cnksXG5cdFBsYW5lR2VvbWV0cnk6IFBsYW5lR2VvbWV0cnksXG5cdFBsYW5lQnVmZmVyR2VvbWV0cnk6IFBsYW5lQnVmZmVyR2VvbWV0cnksXG5cdExhdGhlR2VvbWV0cnk6IExhdGhlR2VvbWV0cnksXG5cdExhdGhlQnVmZmVyR2VvbWV0cnk6IExhdGhlQnVmZmVyR2VvbWV0cnksXG5cdFNoYXBlR2VvbWV0cnk6IFNoYXBlR2VvbWV0cnksXG5cdFNoYXBlQnVmZmVyR2VvbWV0cnk6IFNoYXBlQnVmZmVyR2VvbWV0cnksXG5cdEV4dHJ1ZGVHZW9tZXRyeTogRXh0cnVkZUdlb21ldHJ5LFxuXHRFeHRydWRlQnVmZmVyR2VvbWV0cnk6IEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSxcblx0RWRnZXNHZW9tZXRyeTogRWRnZXNHZW9tZXRyeSxcblx0Q29uZUdlb21ldHJ5OiBDb25lR2VvbWV0cnksXG5cdENvbmVCdWZmZXJHZW9tZXRyeTogQ29uZUJ1ZmZlckdlb21ldHJ5LFxuXHRDeWxpbmRlckdlb21ldHJ5OiBDeWxpbmRlckdlb21ldHJ5LFxuXHRDeWxpbmRlckJ1ZmZlckdlb21ldHJ5OiBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5LFxuXHRDaXJjbGVHZW9tZXRyeTogQ2lyY2xlR2VvbWV0cnksXG5cdENpcmNsZUJ1ZmZlckdlb21ldHJ5OiBDaXJjbGVCdWZmZXJHZW9tZXRyeSxcblx0Qm94R2VvbWV0cnk6IEJveEdlb21ldHJ5LFxuXHRCb3hCdWZmZXJHZW9tZXRyeTogQm94QnVmZmVyR2VvbWV0cnlcbn0pO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPFRIUkVFLkNvbG9yPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIFNoYWRvd01hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU2hhZG93TWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XG5cdHRoaXMudHJhbnNwYXJlbnQgPSB0cnVlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuU2hhZG93TWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5TaGFkb3dNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTaGFkb3dNYXRlcmlhbDtcblxuU2hhZG93TWF0ZXJpYWwucHJvdG90eXBlLmlzU2hhZG93TWF0ZXJpYWwgPSB0cnVlO1xuXG5TaGFkb3dNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBSYXdTaGFkZXJNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRTaGFkZXJNYXRlcmlhbC5jYWxsKCB0aGlzLCBwYXJhbWV0ZXJzICk7XG5cblx0dGhpcy50eXBlID0gJ1Jhd1NoYWRlck1hdGVyaWFsJztcblxufVxuXG5SYXdTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUgKTtcblJhd1NoYWRlck1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJhd1NoYWRlck1hdGVyaWFsO1xuXG5SYXdTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUuaXNSYXdTaGFkZXJNYXRlcmlhbCA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgcm91Z2huZXNzOiA8ZmxvYXQ+LFxuICogIG1ldGFsbmVzczogPGZsb2F0PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGVtaXNzaXZlOiA8aGV4PixcbiAqICBlbWlzc2l2ZUludGVuc2l0eTogPGZsb2F0PlxuICogIGVtaXNzaXZlTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBidW1wTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGJ1bXBTY2FsZTogPGZsb2F0PixcbiAqXG4gKiAgbm9ybWFsTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIG5vcm1hbFNjYWxlOiA8VmVjdG9yMj4sXG4gKlxuICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PixcbiAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+LFxuICpcbiAqICByb3VnaG5lc3NNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIG1ldGFsbmVzc01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGVudk1hcDogbmV3IFRIUkVFLkN1YmVUZXh0dXJlKCBbcG9zeCwgbmVneCwgcG9zeSwgbmVneSwgcG9zeiwgbmVnel0gKSxcbiAqICBlbnZNYXBJbnRlbnNpdHk6IDxmbG9hdD5cbiAqXG4gKiAgcmVmcmFjdGlvblJhdGlvOiA8ZmxvYXQ+LFxuICpcbiAqICB3aXJlZnJhbWU6IDxib29sZWFuPixcbiAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoU3RhbmRhcmRNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5kZWZpbmVzID0geyAnU1RBTkRBUkQnOiAnJyB9O1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoU3RhbmRhcmRNYXRlcmlhbCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZGlmZnVzZVxuXHR0aGlzLnJvdWdobmVzcyA9IDAuNTtcblx0dGhpcy5tZXRhbG5lc3MgPSAwLjU7XG5cblx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdHRoaXMubGlnaHRNYXAgPSBudWxsO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuYW9NYXAgPSBudWxsO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuZW1pc3NpdmUgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XG5cdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSAxLjA7XG5cdHRoaXMuZW1pc3NpdmVNYXAgPSBudWxsO1xuXG5cdHRoaXMuYnVtcE1hcCA9IG51bGw7XG5cdHRoaXMuYnVtcFNjYWxlID0gMTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IG51bGw7XG5cdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0dGhpcy5yb3VnaG5lc3NNYXAgPSBudWxsO1xuXG5cdHRoaXMubWV0YWxuZXNzTWFwID0gbnVsbDtcblxuXHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHR0aGlzLmVudk1hcCA9IG51bGw7XG5cdHRoaXMuZW52TWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gMC45ODtcblxuXHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XG5cdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICdyb3VuZCc7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAncm91bmQnO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTtcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbk1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaFN0YW5kYXJkTWF0ZXJpYWw7XG5cbk1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmRlZmluZXMgPSB7ICdTVEFOREFSRCc6ICcnIH07XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblx0dGhpcy5yb3VnaG5lc3MgPSBzb3VyY2Uucm91Z2huZXNzO1xuXHR0aGlzLm1ldGFsbmVzcyA9IHNvdXJjZS5tZXRhbG5lc3M7XG5cblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMubGlnaHRNYXAgPSBzb3VyY2UubGlnaHRNYXA7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2UubGlnaHRNYXBJbnRlbnNpdHk7XG5cblx0dGhpcy5hb01hcCA9IHNvdXJjZS5hb01hcDtcblx0dGhpcy5hb01hcEludGVuc2l0eSA9IHNvdXJjZS5hb01hcEludGVuc2l0eTtcblxuXHR0aGlzLmVtaXNzaXZlLmNvcHkoIHNvdXJjZS5lbWlzc2l2ZSApO1xuXHR0aGlzLmVtaXNzaXZlTWFwID0gc291cmNlLmVtaXNzaXZlTWFwO1xuXHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gc291cmNlLmVtaXNzaXZlSW50ZW5zaXR5O1xuXG5cdHRoaXMuYnVtcE1hcCA9IHNvdXJjZS5idW1wTWFwO1xuXHR0aGlzLmJ1bXBTY2FsZSA9IHNvdXJjZS5idW1wU2NhbGU7XG5cblx0dGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uubm9ybWFsTWFwO1xuXHR0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0dGhpcy5yb3VnaG5lc3NNYXAgPSBzb3VyY2Uucm91Z2huZXNzTWFwO1xuXG5cdHRoaXMubWV0YWxuZXNzTWFwID0gc291cmNlLm1ldGFsbmVzc01hcDtcblxuXHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDtcblx0dGhpcy5lbnZNYXBJbnRlbnNpdHkgPSBzb3VyY2UuZW52TWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gc291cmNlLnJlZnJhY3Rpb25SYXRpbztcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICByZWZsZWN0aXZpdHk6IDxmbG9hdD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoUGh5c2ljYWxNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNZXNoU3RhbmRhcmRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5kZWZpbmVzID0geyAnUEhZU0lDQUwnOiAnJyB9O1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoUGh5c2ljYWxNYXRlcmlhbCc7XG5cblx0dGhpcy5yZWZsZWN0aXZpdHkgPSAwLjU7IC8vIG1hcHMgdG8gRjAgPSAwLjA0XG5cblx0dGhpcy5jbGVhckNvYXQgPSAwLjA7XG5cdHRoaXMuY2xlYXJDb2F0Um91Z2huZXNzID0gMC4wO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoUGh5c2ljYWxNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoUGh5c2ljYWxNYXRlcmlhbDtcblxuTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoUGh5c2ljYWxNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHsgJ1BIWVNJQ0FMJzogJycgfTtcblxuXHR0aGlzLnJlZmxlY3Rpdml0eSA9IHNvdXJjZS5yZWZsZWN0aXZpdHk7XG5cblx0dGhpcy5jbGVhckNvYXQgPSBzb3VyY2UuY2xlYXJDb2F0O1xuXHR0aGlzLmNsZWFyQ29hdFJvdWdobmVzcyA9IHNvdXJjZS5jbGVhckNvYXRSb3VnaG5lc3M7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgc3BlY3VsYXI6IDxoZXg+LFxuICogIHNoaW5pbmVzczogPGZsb2F0PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGVtaXNzaXZlOiA8aGV4PixcbiAqICBlbWlzc2l2ZUludGVuc2l0eTogPGZsb2F0PlxuICogIGVtaXNzaXZlTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBidW1wTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGJ1bXBTY2FsZTogPGZsb2F0PixcbiAqXG4gKiAgbm9ybWFsTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIG5vcm1hbFNjYWxlOiA8VmVjdG9yMj4sXG4gKlxuICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PixcbiAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+LFxuICpcbiAqICBzcGVjdWxhck1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGVudk1hcDogbmV3IFRIUkVFLkN1YmVUZXh0dXJlKCBbcG9zeCwgbmVneCwgcG9zeSwgbmVneSwgcG9zeiwgbmVnel0gKSxcbiAqICBjb21iaW5lOiBUSFJFRS5NdWx0aXBseSxcbiAqICByZWZsZWN0aXZpdHk6IDxmbG9hdD4sXG4gKiAgcmVmcmFjdGlvblJhdGlvOiA8ZmxvYXQ+LFxuICpcbiAqICB3aXJlZnJhbWU6IDxib29sZWFuPixcbiAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoUGhvbmdNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ01lc2hQaG9uZ01hdGVyaWFsJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApOyAvLyBkaWZmdXNlXG5cdHRoaXMuc3BlY3VsYXIgPSBuZXcgQ29sb3IoIDB4MTExMTExICk7XG5cdHRoaXMuc2hpbmluZXNzID0gMzA7XG5cblx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdHRoaXMubGlnaHRNYXAgPSBudWxsO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuYW9NYXAgPSBudWxsO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuZW1pc3NpdmUgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XG5cdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSAxLjA7XG5cdHRoaXMuZW1pc3NpdmVNYXAgPSBudWxsO1xuXG5cdHRoaXMuYnVtcE1hcCA9IG51bGw7XG5cdHRoaXMuYnVtcFNjYWxlID0gMTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IG51bGw7XG5cdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5lbnZNYXAgPSBudWxsO1xuXHR0aGlzLmNvbWJpbmUgPSBNdWx0aXBseU9wZXJhdGlvbjtcblx0dGhpcy5yZWZsZWN0aXZpdHkgPSAxO1xuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJztcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcbk1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hQaG9uZ01hdGVyaWFsO1xuXG5NZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoUGhvbmdNYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblx0dGhpcy5zcGVjdWxhci5jb3B5KCBzb3VyY2Uuc3BlY3VsYXIgKTtcblx0dGhpcy5zaGluaW5lc3MgPSBzb3VyY2Uuc2hpbmluZXNzO1xuXG5cdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHR0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7XG5cblx0dGhpcy5lbWlzc2l2ZS5jb3B5KCBzb3VyY2UuZW1pc3NpdmUgKTtcblx0dGhpcy5lbWlzc2l2ZU1hcCA9IHNvdXJjZS5lbWlzc2l2ZU1hcDtcblx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IHNvdXJjZS5lbWlzc2l2ZUludGVuc2l0eTtcblxuXHR0aGlzLmJ1bXBNYXAgPSBzb3VyY2UuYnVtcE1hcDtcblx0dGhpcy5idW1wU2NhbGUgPSBzb3VyY2UuYnVtcFNjYWxlO1xuXG5cdHRoaXMubm9ybWFsTWFwID0gc291cmNlLm5vcm1hbE1hcDtcblx0dGhpcy5ub3JtYWxTY2FsZS5jb3B5KCBzb3VyY2Uubm9ybWFsU2NhbGUgKTtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdHRoaXMuc3BlY3VsYXJNYXAgPSBzb3VyY2Uuc3BlY3VsYXJNYXA7XG5cblx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcblxuXHR0aGlzLmVudk1hcCA9IHNvdXJjZS5lbnZNYXA7XG5cdHRoaXMuY29tYmluZSA9IHNvdXJjZS5jb21iaW5lO1xuXHR0aGlzLnJlZmxlY3Rpdml0eSA9IHNvdXJjZS5yZWZsZWN0aXZpdHk7XG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gc291cmNlLnJlZnJhY3Rpb25SYXRpbztcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciB0YWthaGlyb3ggLyBodHRwOi8vZ2l0aHViLmNvbS90YWthaGlyb3hcbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGdyYWRpZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApXG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaFRvb25NYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNZXNoUGhvbmdNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5kZWZpbmVzID0geyAnVE9PTic6ICcnIH07XG5cblx0dGhpcy50eXBlID0gJ01lc2hUb29uTWF0ZXJpYWwnO1xuXG5cdHRoaXMuZ3JhZGllbnRNYXAgPSBudWxsO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaFRvb25NYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUgKTtcbk1lc2hUb29uTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaFRvb25NYXRlcmlhbDtcblxuTWVzaFRvb25NYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoVG9vbk1hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaFRvb25NYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuZ3JhZGllbnRNYXAgPSBzb3VyY2UuZ3JhZGllbnRNYXA7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgYnVtcE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBidW1wU2NhbGU6IDxmbG9hdD4sXG4gKlxuICogIG5vcm1hbE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBub3JtYWxTY2FsZTogPFZlY3RvcjI+LFxuICpcbiAqICBkaXNwbGFjZW1lbnRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgZGlzcGxhY2VtZW50U2NhbGU6IDxmbG9hdD4sXG4gKiAgZGlzcGxhY2VtZW50QmlhczogPGZsb2F0PixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+XG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoTm9ybWFsTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoTm9ybWFsTWF0ZXJpYWwnO1xuXG5cdHRoaXMuYnVtcE1hcCA9IG51bGw7XG5cdHRoaXMuYnVtcFNjYWxlID0gMTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IG51bGw7XG5cdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXG5cdHRoaXMuZm9nID0gZmFsc2U7XG5cdHRoaXMubGlnaHRzID0gZmFsc2U7XG5cblx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaE5vcm1hbE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaE5vcm1hbE1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hOb3JtYWxNYXRlcmlhbDtcblxuTWVzaE5vcm1hbE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hOb3JtYWxNYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hOb3JtYWxNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuYnVtcE1hcCA9IHNvdXJjZS5idW1wTWFwO1xuXHR0aGlzLmJ1bXBTY2FsZSA9IHNvdXJjZS5idW1wU2NhbGU7XG5cblx0dGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uubm9ybWFsTWFwO1xuXHR0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBsaWdodE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBsaWdodE1hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBhb01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBhb01hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBlbWlzc2l2ZTogPGhleD4sXG4gKiAgZW1pc3NpdmVJbnRlbnNpdHk6IDxmbG9hdD5cbiAqICBlbWlzc2l2ZU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgc3BlY3VsYXJNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBlbnZNYXA6IG5ldyBUSFJFRS5DdWJlVGV4dHVyZSggW3Bvc3gsIG5lZ3gsIHBvc3ksIG5lZ3ksIHBvc3osIG5lZ3pdICksXG4gKiAgY29tYmluZTogVEhSRUUuTXVsdGlwbHksXG4gKiAgcmVmbGVjdGl2aXR5OiA8ZmxvYXQ+LFxuICogIHJlZnJhY3Rpb25SYXRpbzogPGZsb2F0PixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LFxuICogIG1vcnBoTm9ybWFsczogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaExhbWJlcnRNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ01lc2hMYW1iZXJ0TWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGRpZmZ1c2VcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5saWdodE1hcCA9IG51bGw7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5hb01hcCA9IG51bGw7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcblx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IDEuMDtcblx0dGhpcy5lbWlzc2l2ZU1hcCA9IG51bGw7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5lbnZNYXAgPSBudWxsO1xuXHR0aGlzLmNvbWJpbmUgPSBNdWx0aXBseU9wZXJhdGlvbjtcblx0dGhpcy5yZWZsZWN0aXZpdHkgPSAxO1xuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJztcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaExhbWJlcnRNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoTGFtYmVydE1hdGVyaWFsO1xuXG5NZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hMYW1iZXJ0TWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1hcDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTtcblxuXHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuZW1pc3NpdmUuY29weSggc291cmNlLmVtaXNzaXZlICk7XG5cdHRoaXMuZW1pc3NpdmVNYXAgPSBzb3VyY2UuZW1pc3NpdmVNYXA7XG5cdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSBzb3VyY2UuZW1pc3NpdmVJbnRlbnNpdHk7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDtcblxuXHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDtcblx0dGhpcy5jb21iaW5lID0gc291cmNlLmNvbWJpbmU7XG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTtcblx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSBzb3VyY2UucmVmcmFjdGlvblJhdGlvO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDtcblx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjtcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFscztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxoZXg+LFxuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKlxuICogIGxpbmV3aWR0aDogPGZsb2F0PixcbiAqXG4gKiAgc2NhbGU6IDxmbG9hdD4sXG4gKiAgZGFzaFNpemU6IDxmbG9hdD4sXG4gKiAgZ2FwU2l6ZTogPGZsb2F0PlxuICogfVxuICovXG5cbmZ1bmN0aW9uIExpbmVEYXNoZWRNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRMaW5lQmFzaWNNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmVEYXNoZWRNYXRlcmlhbCc7XG5cblx0dGhpcy5zY2FsZSA9IDE7XG5cdHRoaXMuZGFzaFNpemUgPSAzO1xuXHR0aGlzLmdhcFNpemUgPSAxO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTGluZURhc2hlZE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZSApO1xuTGluZURhc2hlZE1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExpbmVEYXNoZWRNYXRlcmlhbDtcblxuTGluZURhc2hlZE1hdGVyaWFsLnByb3RvdHlwZS5pc0xpbmVEYXNoZWRNYXRlcmlhbCA9IHRydWU7XG5cbkxpbmVEYXNoZWRNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdExpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuc2NhbGUgPSBzb3VyY2Uuc2NhbGU7XG5cdHRoaXMuZGFzaFNpemUgPSBzb3VyY2UuZGFzaFNpemU7XG5cdHRoaXMuZ2FwU2l6ZSA9IHNvdXJjZS5nYXBTaXplO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5cblxudmFyIE1hdGVyaWFscyA9IE9iamVjdC5mcmVlemUoe1xuXHRTaGFkb3dNYXRlcmlhbDogU2hhZG93TWF0ZXJpYWwsXG5cdFNwcml0ZU1hdGVyaWFsOiBTcHJpdGVNYXRlcmlhbCxcblx0UmF3U2hhZGVyTWF0ZXJpYWw6IFJhd1NoYWRlck1hdGVyaWFsLFxuXHRTaGFkZXJNYXRlcmlhbDogU2hhZGVyTWF0ZXJpYWwsXG5cdFBvaW50c01hdGVyaWFsOiBQb2ludHNNYXRlcmlhbCxcblx0TWVzaFBoeXNpY2FsTWF0ZXJpYWw6IE1lc2hQaHlzaWNhbE1hdGVyaWFsLFxuXHRNZXNoU3RhbmRhcmRNYXRlcmlhbDogTWVzaFN0YW5kYXJkTWF0ZXJpYWwsXG5cdE1lc2hQaG9uZ01hdGVyaWFsOiBNZXNoUGhvbmdNYXRlcmlhbCxcblx0TWVzaFRvb25NYXRlcmlhbDogTWVzaFRvb25NYXRlcmlhbCxcblx0TWVzaE5vcm1hbE1hdGVyaWFsOiBNZXNoTm9ybWFsTWF0ZXJpYWwsXG5cdE1lc2hMYW1iZXJ0TWF0ZXJpYWw6IE1lc2hMYW1iZXJ0TWF0ZXJpYWwsXG5cdE1lc2hEZXB0aE1hdGVyaWFsOiBNZXNoRGVwdGhNYXRlcmlhbCxcblx0TWVzaERpc3RhbmNlTWF0ZXJpYWw6IE1lc2hEaXN0YW5jZU1hdGVyaWFsLFxuXHRNZXNoQmFzaWNNYXRlcmlhbDogTWVzaEJhc2ljTWF0ZXJpYWwsXG5cdExpbmVEYXNoZWRNYXRlcmlhbDogTGluZURhc2hlZE1hdGVyaWFsLFxuXHRMaW5lQmFzaWNNYXRlcmlhbDogTGluZUJhc2ljTWF0ZXJpYWwsXG5cdE1hdGVyaWFsOiBNYXRlcmlhbFxufSk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG52YXIgQ2FjaGUgPSB7XG5cblx0ZW5hYmxlZDogZmFsc2UsXG5cblx0ZmlsZXM6IHt9LFxuXG5cdGFkZDogZnVuY3Rpb24gKCBrZXksIGZpbGUgKSB7XG5cblx0XHRpZiAoIHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHQvLyBjb25zb2xlLmxvZyggJ1RIUkVFLkNhY2hlJywgJ0FkZGluZyBrZXk6Jywga2V5ICk7XG5cblx0XHR0aGlzLmZpbGVzWyBrZXkgXSA9IGZpbGU7XG5cblx0fSxcblxuXHRnZXQ6IGZ1bmN0aW9uICgga2V5ICkge1xuXG5cdFx0aWYgKCB0aGlzLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0Ly8gY29uc29sZS5sb2coICdUSFJFRS5DYWNoZScsICdDaGVja2luZyBrZXk6Jywga2V5ICk7XG5cblx0XHRyZXR1cm4gdGhpcy5maWxlc1sga2V5IF07XG5cblx0fSxcblxuXHRyZW1vdmU6IGZ1bmN0aW9uICgga2V5ICkge1xuXG5cdFx0ZGVsZXRlIHRoaXMuZmlsZXNbIGtleSBdO1xuXG5cdH0sXG5cblx0Y2xlYXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZmlsZXMgPSB7fTtcblxuXHR9XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMb2FkaW5nTWFuYWdlciggb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdHZhciBzY29wZSA9IHRoaXM7XG5cblx0dmFyIGlzTG9hZGluZyA9IGZhbHNlO1xuXHR2YXIgaXRlbXNMb2FkZWQgPSAwO1xuXHR2YXIgaXRlbXNUb3RhbCA9IDA7XG5cdHZhciB1cmxNb2RpZmllciA9IHVuZGVmaW5lZDtcblxuXHR0aGlzLm9uU3RhcnQgPSB1bmRlZmluZWQ7XG5cdHRoaXMub25Mb2FkID0gb25Mb2FkO1xuXHR0aGlzLm9uUHJvZ3Jlc3MgPSBvblByb2dyZXNzO1xuXHR0aGlzLm9uRXJyb3IgPSBvbkVycm9yO1xuXG5cdHRoaXMuaXRlbVN0YXJ0ID0gZnVuY3Rpb24gKCB1cmwgKSB7XG5cblx0XHRpdGVtc1RvdGFsICsrO1xuXG5cdFx0aWYgKCBpc0xvYWRpbmcgPT09IGZhbHNlICkge1xuXG5cdFx0XHRpZiAoIHNjb3BlLm9uU3RhcnQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRzY29wZS5vblN0YXJ0KCB1cmwsIGl0ZW1zTG9hZGVkLCBpdGVtc1RvdGFsICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlzTG9hZGluZyA9IHRydWU7XG5cblx0fTtcblxuXHR0aGlzLml0ZW1FbmQgPSBmdW5jdGlvbiAoIHVybCApIHtcblxuXHRcdGl0ZW1zTG9hZGVkICsrO1xuXG5cdFx0aWYgKCBzY29wZS5vblByb2dyZXNzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHNjb3BlLm9uUHJvZ3Jlc3MoIHVybCwgaXRlbXNMb2FkZWQsIGl0ZW1zVG90YWwgKTtcblxuXHRcdH1cblxuXHRcdGlmICggaXRlbXNMb2FkZWQgPT09IGl0ZW1zVG90YWwgKSB7XG5cblx0XHRcdGlzTG9hZGluZyA9IGZhbHNlO1xuXG5cdFx0XHRpZiAoIHNjb3BlLm9uTG9hZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHNjb3BlLm9uTG9hZCgpO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fTtcblxuXHR0aGlzLml0ZW1FcnJvciA9IGZ1bmN0aW9uICggdXJsICkge1xuXG5cdFx0aWYgKCBzY29wZS5vbkVycm9yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHNjb3BlLm9uRXJyb3IoIHVybCApO1xuXG5cdFx0fVxuXG5cdH07XG5cblx0dGhpcy5yZXNvbHZlVVJMID0gZnVuY3Rpb24gKCB1cmwgKSB7XG5cblx0XHRpZiAoIHVybE1vZGlmaWVyICkge1xuXG5cdFx0XHRyZXR1cm4gdXJsTW9kaWZpZXIoIHVybCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVybDtcblxuXHR9O1xuXG5cdHRoaXMuc2V0VVJMTW9kaWZpZXIgPSBmdW5jdGlvbiAoIHRyYW5zZm9ybSApIHtcblxuXHRcdHVybE1vZGlmaWVyID0gdHJhbnNmb3JtO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH07XG5cbn1cblxudmFyIERlZmF1bHRMb2FkaW5nTWFuYWdlciA9IG5ldyBMb2FkaW5nTWFuYWdlcigpO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxudmFyIGxvYWRpbmcgPSB7fTtcblxuZnVuY3Rpb24gRmlsZUxvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxufVxuXG5PYmplY3QuYXNzaWduKCBGaWxlTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHRpZiAoIHVybCA9PT0gdW5kZWZpbmVkICkgdXJsID0gJyc7XG5cblx0XHRpZiAoIHRoaXMucGF0aCAhPT0gdW5kZWZpbmVkICkgdXJsID0gdGhpcy5wYXRoICsgdXJsO1xuXG5cdFx0dXJsID0gdGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwoIHVybCApO1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBjYWNoZWQgPSBDYWNoZS5nZXQoIHVybCApO1xuXG5cdFx0aWYgKCBjYWNoZWQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xuXG5cdFx0XHRzZXRUaW1lb3V0KCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIGNhY2hlZCApO1xuXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdH0sIDAgKTtcblxuXHRcdFx0cmV0dXJuIGNhY2hlZDtcblxuXHRcdH1cblxuXHRcdC8vIENoZWNrIGlmIHJlcXVlc3QgaXMgZHVwbGljYXRlXG5cblx0XHRpZiAoIGxvYWRpbmdbIHVybCBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGxvYWRpbmdbIHVybCBdLnB1c2goIHtcblxuXHRcdFx0XHRvbkxvYWQ6IG9uTG9hZCxcblx0XHRcdFx0b25Qcm9ncmVzczogb25Qcm9ncmVzcyxcblx0XHRcdFx0b25FcnJvcjogb25FcnJvclxuXG5cdFx0XHR9ICk7XG5cblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdC8vIENoZWNrIGZvciBkYXRhOiBVUklcblx0XHR2YXIgZGF0YVVyaVJlZ2V4ID0gL15kYXRhOiguKj8pKDtiYXNlNjQpPywoLiopJC87XG5cdFx0dmFyIGRhdGFVcmlSZWdleFJlc3VsdCA9IHVybC5tYXRjaCggZGF0YVVyaVJlZ2V4ICk7XG5cblx0XHQvLyBTYWZhcmkgY2FuIG5vdCBoYW5kbGUgRGF0YSBVUklzIHRocm91Z2ggWE1MSHR0cFJlcXVlc3Qgc28gcHJvY2VzcyBtYW51YWxseVxuXHRcdGlmICggZGF0YVVyaVJlZ2V4UmVzdWx0ICkge1xuXG5cdFx0XHR2YXIgbWltZVR5cGUgPSBkYXRhVXJpUmVnZXhSZXN1bHRbIDEgXTtcblx0XHRcdHZhciBpc0Jhc2U2NCA9ICEhIGRhdGFVcmlSZWdleFJlc3VsdFsgMiBdO1xuXHRcdFx0dmFyIGRhdGEgPSBkYXRhVXJpUmVnZXhSZXN1bHRbIDMgXTtcblxuXHRcdFx0ZGF0YSA9IHdpbmRvdy5kZWNvZGVVUklDb21wb25lbnQoIGRhdGEgKTtcblxuXHRcdFx0aWYgKCBpc0Jhc2U2NCApIGRhdGEgPSB3aW5kb3cuYXRvYiggZGF0YSApO1xuXG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdHZhciByZXNwb25zZTtcblx0XHRcdFx0dmFyIHJlc3BvbnNlVHlwZSA9ICggdGhpcy5yZXNwb25zZVR5cGUgfHwgJycgKS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0XHRcdHN3aXRjaCAoIHJlc3BvbnNlVHlwZSApIHtcblxuXHRcdFx0XHRcdGNhc2UgJ2FycmF5YnVmZmVyJzpcblx0XHRcdFx0XHRjYXNlICdibG9iJzpcblxuXHRcdFx0XHRcdFx0dmFyIHZpZXcgPSBuZXcgVWludDhBcnJheSggZGF0YS5sZW5ndGggKTtcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0dmlld1sgaSBdID0gZGF0YS5jaGFyQ29kZUF0KCBpICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKCByZXNwb25zZVR5cGUgPT09ICdibG9iJyApIHtcblxuXHRcdFx0XHRcdFx0XHRyZXNwb25zZSA9IG5ldyBCbG9iKCBbIHZpZXcuYnVmZmVyIF0sIHsgdHlwZTogbWltZVR5cGUgfSApO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlID0gdmlldy5idWZmZXI7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdkb2N1bWVudCc6XG5cblx0XHRcdFx0XHRcdHZhciBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG5cdFx0XHRcdFx0XHRyZXNwb25zZSA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoIGRhdGEsIG1pbWVUeXBlICk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnanNvbic6XG5cblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gSlNPTi5wYXJzZSggZGF0YSApO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGRlZmF1bHQ6IC8vICd0ZXh0JyBvciBvdGhlclxuXG5cdFx0XHRcdFx0XHRyZXNwb25zZSA9IGRhdGE7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXYWl0IGZvciBuZXh0IGJyb3dzZXIgdGljayBsaWtlIHN0YW5kYXJkIFhNTEh0dHBSZXF1ZXN0IGV2ZW50IGRpc3BhdGNoaW5nIGRvZXNcblx0XHRcdFx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCByZXNwb25zZSApO1xuXG5cdFx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0XHR9LCAwICk7XG5cblx0XHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcblxuXHRcdFx0XHQvLyBXYWl0IGZvciBuZXh0IGJyb3dzZXIgdGljayBsaWtlIHN0YW5kYXJkIFhNTEh0dHBSZXF1ZXN0IGV2ZW50IGRpc3BhdGNoaW5nIGRvZXNcblx0XHRcdFx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRcdGlmICggb25FcnJvciApIG9uRXJyb3IoIGVycm9yICk7XG5cblx0XHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcblxuXHRcdFx0XHR9LCAwICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIEluaXRpYWxpc2UgYXJyYXkgZm9yIGR1cGxpY2F0ZSByZXF1ZXN0c1xuXG5cdFx0XHRsb2FkaW5nWyB1cmwgXSA9IFtdO1xuXG5cdFx0XHRsb2FkaW5nWyB1cmwgXS5wdXNoKCB7XG5cblx0XHRcdFx0b25Mb2FkOiBvbkxvYWQsXG5cdFx0XHRcdG9uUHJvZ3Jlc3M6IG9uUHJvZ3Jlc3MsXG5cdFx0XHRcdG9uRXJyb3I6IG9uRXJyb3JcblxuXHRcdFx0fSApO1xuXG5cdFx0XHR2YXIgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG5cdFx0XHRyZXF1ZXN0Lm9wZW4oICdHRVQnLCB1cmwsIHRydWUgKTtcblxuXHRcdFx0cmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCAnbG9hZCcsIGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cblx0XHRcdFx0dmFyIHJlc3BvbnNlID0gdGhpcy5yZXNwb25zZTtcblxuXHRcdFx0XHRDYWNoZS5hZGQoIHVybCwgcmVzcG9uc2UgKTtcblxuXHRcdFx0XHR2YXIgY2FsbGJhY2tzID0gbG9hZGluZ1sgdXJsIF07XG5cblx0XHRcdFx0ZGVsZXRlIGxvYWRpbmdbIHVybCBdO1xuXG5cdFx0XHRcdGlmICggdGhpcy5zdGF0dXMgPT09IDIwMCApIHtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBjYWxsYmFjayA9IGNhbGxiYWNrc1sgaSBdO1xuXHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjay5vbkxvYWQgKSBjYWxsYmFjay5vbkxvYWQoIHJlc3BvbnNlICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHRoaXMuc3RhdHVzID09PSAwICkge1xuXG5cdFx0XHRcdFx0Ly8gU29tZSBicm93c2VycyByZXR1cm4gSFRUUCBTdGF0dXMgMCB3aGVuIHVzaW5nIG5vbi1odHRwIHByb3RvY29sXG5cdFx0XHRcdFx0Ly8gZS5nLiAnZmlsZTovLycgb3IgJ2RhdGE6Ly8nLiBIYW5kbGUgYXMgc3VjY2Vzcy5cblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkZpbGVMb2FkZXI6IEhUVFAgU3RhdHVzIDAgcmVjZWl2ZWQuJyApO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGNhbGxiYWNrID0gY2FsbGJhY2tzWyBpIF07XG5cdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrLm9uTG9hZCApIGNhbGxiYWNrLm9uTG9hZCggcmVzcG9uc2UgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBjYWxsYmFjayA9IGNhbGxiYWNrc1sgaSBdO1xuXHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjay5vbkVycm9yICkgY2FsbGJhY2sub25FcnJvciggZXZlbnQgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cdFx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSwgZmFsc2UgKTtcblxuXHRcdFx0cmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCAncHJvZ3Jlc3MnLCBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXG5cdFx0XHRcdHZhciBjYWxsYmFja3MgPSBsb2FkaW5nWyB1cmwgXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gY2FsbGJhY2tzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIGNhbGxiYWNrID0gY2FsbGJhY2tzWyBpIF07XG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjay5vblByb2dyZXNzICkgY2FsbGJhY2sub25Qcm9ncmVzcyggZXZlbnQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sIGZhbHNlICk7XG5cblx0XHRcdHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lciggJ2Vycm9yJywgZnVuY3Rpb24gKCBldmVudCApIHtcblxuXHRcdFx0XHR2YXIgY2FsbGJhY2tzID0gbG9hZGluZ1sgdXJsIF07XG5cblx0XHRcdFx0ZGVsZXRlIGxvYWRpbmdbIHVybCBdO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgY2FsbGJhY2sgPSBjYWxsYmFja3NbIGkgXTtcblx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrLm9uRXJyb3IgKSBjYWxsYmFjay5vbkVycm9yKCBldmVudCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XG5cblx0XHRcdH0sIGZhbHNlICk7XG5cblx0XHRcdGlmICggdGhpcy5yZXNwb25zZVR5cGUgIT09IHVuZGVmaW5lZCApIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gdGhpcy5yZXNwb25zZVR5cGU7XG5cdFx0XHRpZiAoIHRoaXMud2l0aENyZWRlbnRpYWxzICE9PSB1bmRlZmluZWQgKSByZXF1ZXN0LndpdGhDcmVkZW50aWFscyA9IHRoaXMud2l0aENyZWRlbnRpYWxzO1xuXG5cdFx0XHRpZiAoIHJlcXVlc3Qub3ZlcnJpZGVNaW1lVHlwZSApIHJlcXVlc3Qub3ZlcnJpZGVNaW1lVHlwZSggdGhpcy5taW1lVHlwZSAhPT0gdW5kZWZpbmVkID8gdGhpcy5taW1lVHlwZSA6ICd0ZXh0L3BsYWluJyApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaGVhZGVyIGluIHRoaXMucmVxdWVzdEhlYWRlciApIHtcblxuXHRcdFx0XHRyZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoIGhlYWRlciwgdGhpcy5yZXF1ZXN0SGVhZGVyWyBoZWFkZXIgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJlcXVlc3Quc2VuZCggbnVsbCApO1xuXG5cdFx0fVxuXG5cdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xuXG5cdFx0cmV0dXJuIHJlcXVlc3Q7XG5cblx0fSxcblxuXHRzZXRQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYXRoID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRSZXNwb25zZVR5cGU6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnJlc3BvbnNlVHlwZSA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0V2l0aENyZWRlbnRpYWxzOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy53aXRoQ3JlZGVudGlhbHMgPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldE1pbWVUeXBlOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5taW1lVHlwZSA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucmVxdWVzdEhlYWRlciA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKlxuICogQWJzdHJhY3QgQmFzZSBjbGFzcyB0byBibG9jayBiYXNlZCB0ZXh0dXJlcyBsb2FkZXIgKGRkcywgcHZyLCAuLi4pXG4gKi9cblxuZnVuY3Rpb24gQ29tcHJlc3NlZFRleHR1cmVMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cblx0Ly8gb3ZlcnJpZGUgaW4gc3ViIGNsYXNzZXNcblx0dGhpcy5fcGFyc2VyID0gbnVsbDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBDb21wcmVzc2VkVGV4dHVyZUxvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBpbWFnZXMgPSBbXTtcblxuXHRcdHZhciB0ZXh0dXJlID0gbmV3IENvbXByZXNzZWRUZXh0dXJlKCk7XG5cdFx0dGV4dHVyZS5pbWFnZSA9IGltYWdlcztcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXHRcdGxvYWRlci5zZXRSZXNwb25zZVR5cGUoICdhcnJheWJ1ZmZlcicgKTtcblxuXHRcdGZ1bmN0aW9uIGxvYWRUZXh0dXJlKCBpICkge1xuXG5cdFx0XHRsb2FkZXIubG9hZCggdXJsWyBpIF0sIGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0XHRcdHZhciB0ZXhEYXRhcyA9IHNjb3BlLl9wYXJzZXIoIGJ1ZmZlciwgdHJ1ZSApO1xuXG5cdFx0XHRcdGltYWdlc1sgaSBdID0ge1xuXHRcdFx0XHRcdHdpZHRoOiB0ZXhEYXRhcy53aWR0aCxcblx0XHRcdFx0XHRoZWlnaHQ6IHRleERhdGFzLmhlaWdodCxcblx0XHRcdFx0XHRmb3JtYXQ6IHRleERhdGFzLmZvcm1hdCxcblx0XHRcdFx0XHRtaXBtYXBzOiB0ZXhEYXRhcy5taXBtYXBzXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0bG9hZGVkICs9IDE7XG5cblx0XHRcdFx0aWYgKCBsb2FkZWQgPT09IDYgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHRleERhdGFzLm1pcG1hcENvdW50ID09PSAxIClcblx0XHRcdFx0XHRcdHRleHR1cmUubWluRmlsdGVyID0gTGluZWFyRmlsdGVyO1xuXG5cdFx0XHRcdFx0dGV4dHVyZS5mb3JtYXQgPSB0ZXhEYXRhcy5mb3JtYXQ7XG5cdFx0XHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggdGV4dHVyZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCB1cmwgKSApIHtcblxuXHRcdFx0dmFyIGxvYWRlZCA9IDA7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB1cmwubGVuZ3RoOyBpIDwgaWw7ICsrIGkgKSB7XG5cblx0XHRcdFx0bG9hZFRleHR1cmUoIGkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gY29tcHJlc3NlZCBjdWJlbWFwIHRleHR1cmUgc3RvcmVkIGluIGEgc2luZ2xlIEREUyBmaWxlXG5cblx0XHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0XHRcdHZhciB0ZXhEYXRhcyA9IHNjb3BlLl9wYXJzZXIoIGJ1ZmZlciwgdHJ1ZSApO1xuXG5cdFx0XHRcdGlmICggdGV4RGF0YXMuaXNDdWJlbWFwICkge1xuXG5cdFx0XHRcdFx0dmFyIGZhY2VzID0gdGV4RGF0YXMubWlwbWFwcy5sZW5ndGggLyB0ZXhEYXRhcy5taXBtYXBDb3VudDtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBmID0gMDsgZiA8IGZhY2VzOyBmICsrICkge1xuXG5cdFx0XHRcdFx0XHRpbWFnZXNbIGYgXSA9IHsgbWlwbWFwczogW10gfTtcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGV4RGF0YXMubWlwbWFwQ291bnQ7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0aW1hZ2VzWyBmIF0ubWlwbWFwcy5wdXNoKCB0ZXhEYXRhcy5taXBtYXBzWyBmICogdGV4RGF0YXMubWlwbWFwQ291bnQgKyBpIF0gKTtcblx0XHRcdFx0XHRcdFx0aW1hZ2VzWyBmIF0uZm9ybWF0ID0gdGV4RGF0YXMuZm9ybWF0O1xuXHRcdFx0XHRcdFx0XHRpbWFnZXNbIGYgXS53aWR0aCA9IHRleERhdGFzLndpZHRoO1xuXHRcdFx0XHRcdFx0XHRpbWFnZXNbIGYgXS5oZWlnaHQgPSB0ZXhEYXRhcy5oZWlnaHQ7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS5pbWFnZS53aWR0aCA9IHRleERhdGFzLndpZHRoO1xuXHRcdFx0XHRcdHRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gdGV4RGF0YXMuaGVpZ2h0O1xuXHRcdFx0XHRcdHRleHR1cmUubWlwbWFwcyA9IHRleERhdGFzLm1pcG1hcHM7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdGV4RGF0YXMubWlwbWFwQ291bnQgPT09IDEgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZS5mb3JtYXQgPSB0ZXhEYXRhcy5mb3JtYXQ7XG5cdFx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCB0ZXh0dXJlICk7XG5cblx0XHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH0sXG5cblx0c2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGF0aCA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgTmlrb3MgTS4gLyBodHRwczovL2dpdGh1Yi5jb20vZm9vMTIzL1xuICpcbiAqIEFic3RyYWN0IEJhc2UgY2xhc3MgdG8gbG9hZCBnZW5lcmljIGJpbmFyeSB0ZXh0dXJlcyBmb3JtYXRzIChyZ2JlLCBoZHIsIC4uLilcbiAqL1xuXG5mdW5jdGlvbiBEYXRhVGV4dHVyZUxvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxuXHQvLyBvdmVycmlkZSBpbiBzdWIgY2xhc3Nlc1xuXHR0aGlzLl9wYXJzZXIgPSBudWxsO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIERhdGFUZXh0dXJlTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIHRleHR1cmUgPSBuZXcgRGF0YVRleHR1cmUoKTtcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFJlc3BvbnNlVHlwZSggJ2FycmF5YnVmZmVyJyApO1xuXG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBidWZmZXIgKSB7XG5cblx0XHRcdHZhciB0ZXhEYXRhID0gc2NvcGUuX3BhcnNlciggYnVmZmVyICk7XG5cblx0XHRcdGlmICggISB0ZXhEYXRhICkgcmV0dXJuO1xuXG5cdFx0XHRpZiAoIHVuZGVmaW5lZCAhPT0gdGV4RGF0YS5pbWFnZSApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLmltYWdlID0gdGV4RGF0YS5pbWFnZTtcblxuXHRcdFx0fSBlbHNlIGlmICggdW5kZWZpbmVkICE9PSB0ZXhEYXRhLmRhdGEgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5pbWFnZS53aWR0aCA9IHRleERhdGEud2lkdGg7XG5cdFx0XHRcdHRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gdGV4RGF0YS5oZWlnaHQ7XG5cdFx0XHRcdHRleHR1cmUuaW1hZ2UuZGF0YSA9IHRleERhdGEuZGF0YTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlLndyYXBTID0gdW5kZWZpbmVkICE9PSB0ZXhEYXRhLndyYXBTID8gdGV4RGF0YS53cmFwUyA6IENsYW1wVG9FZGdlV3JhcHBpbmc7XG5cdFx0XHR0ZXh0dXJlLndyYXBUID0gdW5kZWZpbmVkICE9PSB0ZXhEYXRhLndyYXBUID8gdGV4RGF0YS53cmFwVCA6IENsYW1wVG9FZGdlV3JhcHBpbmc7XG5cblx0XHRcdHRleHR1cmUubWFnRmlsdGVyID0gdW5kZWZpbmVkICE9PSB0ZXhEYXRhLm1hZ0ZpbHRlciA/IHRleERhdGEubWFnRmlsdGVyIDogTGluZWFyRmlsdGVyO1xuXHRcdFx0dGV4dHVyZS5taW5GaWx0ZXIgPSB1bmRlZmluZWQgIT09IHRleERhdGEubWluRmlsdGVyID8gdGV4RGF0YS5taW5GaWx0ZXIgOiBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXI7XG5cblx0XHRcdHRleHR1cmUuYW5pc290cm9weSA9IHVuZGVmaW5lZCAhPT0gdGV4RGF0YS5hbmlzb3Ryb3B5ID8gdGV4RGF0YS5hbmlzb3Ryb3B5IDogMTtcblxuXHRcdFx0aWYgKCB1bmRlZmluZWQgIT09IHRleERhdGEuZm9ybWF0ICkge1xuXG5cdFx0XHRcdHRleHR1cmUuZm9ybWF0ID0gdGV4RGF0YS5mb3JtYXQ7XG5cblx0XHRcdH1cblx0XHRcdGlmICggdW5kZWZpbmVkICE9PSB0ZXhEYXRhLnR5cGUgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS50eXBlID0gdGV4RGF0YS50eXBlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdW5kZWZpbmVkICE9PSB0ZXhEYXRhLm1pcG1hcHMgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5taXBtYXBzID0gdGV4RGF0YS5taXBtYXBzO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggMSA9PT0gdGV4RGF0YS5taXBtYXBDb3VudCApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRleHR1cmUsIHRleERhdGEgKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXG5cdFx0cmV0dXJuIHRleHR1cmU7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBJbWFnZUxvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxufVxuXG5PYmplY3QuYXNzaWduKCBJbWFnZUxvYWRlci5wcm90b3R5cGUsIHtcblxuXHRjcm9zc09yaWdpbjogJ0Fub255bW91cycsXG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdGlmICggdXJsID09PSB1bmRlZmluZWQgKSB1cmwgPSAnJztcblxuXHRcdGlmICggdGhpcy5wYXRoICE9PSB1bmRlZmluZWQgKSB1cmwgPSB0aGlzLnBhdGggKyB1cmw7XG5cblx0XHR1cmwgPSB0aGlzLm1hbmFnZXIucmVzb2x2ZVVSTCggdXJsICk7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGNhY2hlZCA9IENhY2hlLmdldCggdXJsICk7XG5cblx0XHRpZiAoIGNhY2hlZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XG5cblx0XHRcdHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggY2FjaGVkICk7XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0fSwgMCApO1xuXG5cdFx0XHRyZXR1cm4gY2FjaGVkO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdpbWcnICk7XG5cblx0XHRpbWFnZS5hZGRFdmVudExpc3RlbmVyKCAnbG9hZCcsIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Q2FjaGUuYWRkKCB1cmwsIHRoaXMgKTtcblxuXHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRoaXMgKTtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdH0sIGZhbHNlICk7XG5cblx0XHQvKlxuXHRcdGltYWdlLmFkZEV2ZW50TGlzdGVuZXIoICdwcm9ncmVzcycsIGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cblx0XHRcdGlmICggb25Qcm9ncmVzcyApIG9uUHJvZ3Jlc3MoIGV2ZW50ICk7XG5cblx0XHR9LCBmYWxzZSApO1xuXHRcdCovXG5cblx0XHRpbWFnZS5hZGRFdmVudExpc3RlbmVyKCAnZXJyb3InLCBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXG5cdFx0XHRpZiAoIG9uRXJyb3IgKSBvbkVycm9yKCBldmVudCApO1xuXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXG5cdFx0fSwgZmFsc2UgKTtcblxuXHRcdGlmICggdXJsLnN1YnN0ciggMCwgNSApICE9PSAnZGF0YTonICkge1xuXG5cdFx0XHRpZiAoIHRoaXMuY3Jvc3NPcmlnaW4gIT09IHVuZGVmaW5lZCApIGltYWdlLmNyb3NzT3JpZ2luID0gdGhpcy5jcm9zc09yaWdpbjtcblxuXHRcdH1cblxuXHRcdHNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcblxuXHRcdGltYWdlLnNyYyA9IHVybDtcblxuXHRcdHJldHVybiBpbWFnZTtcblxuXHR9LFxuXG5cdHNldENyb3NzT3JpZ2luOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5jcm9zc09yaWdpbiA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGF0aCA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQ3ViZVRleHR1cmVMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQ3ViZVRleHR1cmVMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0Y3Jvc3NPcmlnaW46ICdBbm9ueW1vdXMnLFxuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJscywgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHRleHR1cmUgPSBuZXcgQ3ViZVRleHR1cmUoKTtcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoIHRoaXMubWFuYWdlciApO1xuXHRcdGxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApO1xuXHRcdGxvYWRlci5zZXRQYXRoKCB0aGlzLnBhdGggKTtcblxuXHRcdHZhciBsb2FkZWQgPSAwO1xuXG5cdFx0ZnVuY3Rpb24gbG9hZFRleHR1cmUoIGkgKSB7XG5cblx0XHRcdGxvYWRlci5sb2FkKCB1cmxzWyBpIF0sIGZ1bmN0aW9uICggaW1hZ2UgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5pbWFnZXNbIGkgXSA9IGltYWdlO1xuXG5cdFx0XHRcdGxvYWRlZCArKztcblxuXHRcdFx0XHRpZiAoIGxvYWRlZCA9PT0gNiApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRleHR1cmUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sIHVuZGVmaW5lZCwgb25FcnJvciApO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7ICsrIGkgKSB7XG5cblx0XHRcdGxvYWRUZXh0dXJlKCBpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGV4dHVyZTtcblxuXHR9LFxuXG5cdHNldENyb3NzT3JpZ2luOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5jcm9zc09yaWdpbiA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGF0aCA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gVGV4dHVyZUxvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxufVxuXG5PYmplY3QuYXNzaWduKCBUZXh0dXJlTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGNyb3NzT3JpZ2luOiAnQW5vbnltb3VzJyxcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHRleHR1cmUgPSBuZXcgVGV4dHVyZSgpO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldENyb3NzT3JpZ2luKCB0aGlzLmNyb3NzT3JpZ2luICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBpbWFnZSApIHtcblxuXHRcdFx0dGV4dHVyZS5pbWFnZSA9IGltYWdlO1xuXG5cdFx0XHQvLyBKUEVHcyBjYW4ndCBoYXZlIGFuIGFscGhhIGNoYW5uZWwsIHNvIG1lbW9yeSBjYW4gYmUgc2F2ZWQgYnkgc3RvcmluZyB0aGVtIGFzIFJHQi5cblx0XHRcdHZhciBpc0pQRUcgPSB1cmwuc2VhcmNoKCAvXFwuKGpwZ3xqcGVnKSQvICkgPiAwIHx8IHVybC5zZWFyY2goIC9eZGF0YVxcOmltYWdlXFwvanBlZy8gKSA9PT0gMDtcblxuXHRcdFx0dGV4dHVyZS5mb3JtYXQgPSBpc0pQRUcgPyBSR0JGb3JtYXQgOiBSR0JBRm9ybWF0O1xuXHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdGlmICggb25Mb2FkICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0b25Mb2FkKCB0ZXh0dXJlICk7XG5cblx0XHRcdH1cblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH0sXG5cblx0c2V0Q3Jvc3NPcmlnaW46IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmNyb3NzT3JpZ2luID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYXRoID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICogRXh0ZW5zaWJsZSBjdXJ2ZSBvYmplY3RcbiAqXG4gKiBTb21lIGNvbW1vbiBvZiBjdXJ2ZSBtZXRob2RzOlxuICogLmdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCApLCAuZ2V0VGFuZ2VudCggdCApXG4gKiAuZ2V0UG9pbnRBdCggdSwgb3B0aW9uYWxUYXJnZXQgKSwgLmdldFRhbmdlbnRBdCggdSApXG4gKiAuZ2V0UG9pbnRzKCksIC5nZXRTcGFjZWRQb2ludHMoKVxuICogLmdldExlbmd0aCgpXG4gKiAudXBkYXRlQXJjTGVuZ3RocygpXG4gKlxuICogVGhpcyBmb2xsb3dpbmcgY3VydmVzIGluaGVyaXQgZnJvbSBUSFJFRS5DdXJ2ZTpcbiAqXG4gKiAtLSAyRCBjdXJ2ZXMgLS1cbiAqIFRIUkVFLkFyY0N1cnZlXG4gKiBUSFJFRS5DdWJpY0JlemllckN1cnZlXG4gKiBUSFJFRS5FbGxpcHNlQ3VydmVcbiAqIFRIUkVFLkxpbmVDdXJ2ZVxuICogVEhSRUUuUXVhZHJhdGljQmV6aWVyQ3VydmVcbiAqIFRIUkVFLlNwbGluZUN1cnZlXG4gKlxuICogLS0gM0QgY3VydmVzIC0tXG4gKiBUSFJFRS5DYXRtdWxsUm9tQ3VydmUzXG4gKiBUSFJFRS5DdWJpY0JlemllckN1cnZlM1xuICogVEhSRUUuTGluZUN1cnZlM1xuICogVEhSRUUuUXVhZHJhdGljQmV6aWVyQ3VydmUzXG4gKlxuICogQSBzZXJpZXMgb2YgY3VydmVzIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFRIUkVFLkN1cnZlUGF0aC5cbiAqXG4gKiovXG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICpcdEFic3RyYWN0IEN1cnZlIGJhc2UgY2xhc3NcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuZnVuY3Rpb24gQ3VydmUoKSB7XG5cblx0dGhpcy50eXBlID0gJ0N1cnZlJztcblxuXHR0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9IDIwMDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBDdXJ2ZS5wcm90b3R5cGUsIHtcblxuXHQvLyBWaXJ0dWFsIGJhc2UgY2xhc3MgbWV0aG9kIHRvIG92ZXJ3cml0ZSBhbmQgaW1wbGVtZW50IGluIHN1YmNsYXNzZXNcblx0Ly9cdC0gdCBbMCAuLiAxXVxuXG5cdGdldFBvaW50OiBmdW5jdGlvbiAoIC8qIHQsIG9wdGlvbmFsVGFyZ2V0ICovICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ3VydmU6IC5nZXRQb2ludCgpIG5vdCBpbXBsZW1lbnRlZC4nICk7XG5cdFx0cmV0dXJuIG51bGw7XG5cblx0fSxcblxuXHQvLyBHZXQgcG9pbnQgYXQgcmVsYXRpdmUgcG9zaXRpb24gaW4gY3VydmUgYWNjb3JkaW5nIHRvIGFyYyBsZW5ndGhcblx0Ly8gLSB1IFswIC4uIDFdXG5cblx0Z2V0UG9pbnRBdDogZnVuY3Rpb24gKCB1LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHZhciB0ID0gdGhpcy5nZXRVdG9UbWFwcGluZyggdSApO1xuXHRcdHJldHVybiB0aGlzLmdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCApO1xuXG5cdH0sXG5cblx0Ly8gR2V0IHNlcXVlbmNlIG9mIHBvaW50cyB1c2luZyBnZXRQb2ludCggdCApXG5cblx0Z2V0UG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSA1O1xuXG5cdFx0dmFyIHBvaW50cyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGQgPSAwOyBkIDw9IGRpdmlzaW9uczsgZCArKyApIHtcblxuXHRcdFx0cG9pbnRzLnB1c2goIHRoaXMuZ2V0UG9pbnQoIGQgLyBkaXZpc2lvbnMgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvaW50cztcblxuXHR9LFxuXG5cdC8vIEdldCBzZXF1ZW5jZSBvZiBwb2ludHMgdXNpbmcgZ2V0UG9pbnRBdCggdSApXG5cblx0Z2V0U3BhY2VkUG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSA1O1xuXG5cdFx0dmFyIHBvaW50cyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGQgPSAwOyBkIDw9IGRpdmlzaW9uczsgZCArKyApIHtcblxuXHRcdFx0cG9pbnRzLnB1c2goIHRoaXMuZ2V0UG9pbnRBdCggZCAvIGRpdmlzaW9ucyApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcG9pbnRzO1xuXG5cdH0sXG5cblx0Ly8gR2V0IHRvdGFsIGN1cnZlIGFyYyBsZW5ndGhcblxuXHRnZXRMZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBsZW5ndGhzID0gdGhpcy5nZXRMZW5ndGhzKCk7XG5cdFx0cmV0dXJuIGxlbmd0aHNbIGxlbmd0aHMubGVuZ3RoIC0gMSBdO1xuXG5cdH0sXG5cblx0Ly8gR2V0IGxpc3Qgb2YgY3VtdWxhdGl2ZSBzZWdtZW50IGxlbmd0aHNcblxuXHRnZXRMZW5ndGhzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucztcblxuXHRcdGlmICggdGhpcy5jYWNoZUFyY0xlbmd0aHMgJiZcblx0XHRcdCggdGhpcy5jYWNoZUFyY0xlbmd0aHMubGVuZ3RoID09PSBkaXZpc2lvbnMgKyAxICkgJiZcblx0XHRcdCEgdGhpcy5uZWVkc1VwZGF0ZSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0dmFyIGNhY2hlID0gW107XG5cdFx0dmFyIGN1cnJlbnQsIGxhc3QgPSB0aGlzLmdldFBvaW50KCAwICk7XG5cdFx0dmFyIHAsIHN1bSA9IDA7XG5cblx0XHRjYWNoZS5wdXNoKCAwICk7XG5cblx0XHRmb3IgKCBwID0gMTsgcCA8PSBkaXZpc2lvbnM7IHAgKysgKSB7XG5cblx0XHRcdGN1cnJlbnQgPSB0aGlzLmdldFBvaW50KCBwIC8gZGl2aXNpb25zICk7XG5cdFx0XHRzdW0gKz0gY3VycmVudC5kaXN0YW5jZVRvKCBsYXN0ICk7XG5cdFx0XHRjYWNoZS5wdXNoKCBzdW0gKTtcblx0XHRcdGxhc3QgPSBjdXJyZW50O1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jYWNoZUFyY0xlbmd0aHMgPSBjYWNoZTtcblxuXHRcdHJldHVybiBjYWNoZTsgLy8geyBzdW1zOiBjYWNoZSwgc3VtOiBzdW0gfTsgU3VtIGlzIGluIHRoZSBsYXN0IGVsZW1lbnQuXG5cblx0fSxcblxuXHR1cGRhdGVBcmNMZW5ndGhzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblx0XHR0aGlzLmdldExlbmd0aHMoKTtcblxuXHR9LFxuXG5cdC8vIEdpdmVuIHUgKCAwIC4uIDEgKSwgZ2V0IGEgdCB0byBmaW5kIHAuIFRoaXMgZ2l2ZXMgeW91IHBvaW50cyB3aGljaCBhcmUgZXF1aWRpc3RhbnRcblxuXHRnZXRVdG9UbWFwcGluZzogZnVuY3Rpb24gKCB1LCBkaXN0YW5jZSApIHtcblxuXHRcdHZhciBhcmNMZW5ndGhzID0gdGhpcy5nZXRMZW5ndGhzKCk7XG5cblx0XHR2YXIgaSA9IDAsIGlsID0gYXJjTGVuZ3Rocy5sZW5ndGg7XG5cblx0XHR2YXIgdGFyZ2V0QXJjTGVuZ3RoOyAvLyBUaGUgdGFyZ2V0ZWQgdSBkaXN0YW5jZSB2YWx1ZSB0byBnZXRcblxuXHRcdGlmICggZGlzdGFuY2UgKSB7XG5cblx0XHRcdHRhcmdldEFyY0xlbmd0aCA9IGRpc3RhbmNlO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGFyZ2V0QXJjTGVuZ3RoID0gdSAqIGFyY0xlbmd0aHNbIGlsIC0gMSBdO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYmluYXJ5IHNlYXJjaCBmb3IgdGhlIGluZGV4IHdpdGggbGFyZ2VzdCB2YWx1ZSBzbWFsbGVyIHRoYW4gdGFyZ2V0IHUgZGlzdGFuY2VcblxuXHRcdHZhciBsb3cgPSAwLCBoaWdoID0gaWwgLSAxLCBjb21wYXJpc29uO1xuXG5cdFx0d2hpbGUgKCBsb3cgPD0gaGlnaCApIHtcblxuXHRcdFx0aSA9IE1hdGguZmxvb3IoIGxvdyArICggaGlnaCAtIGxvdyApIC8gMiApOyAvLyBsZXNzIGxpa2VseSB0byBvdmVyZmxvdywgdGhvdWdoIHByb2JhYmx5IG5vdCBpc3N1ZSBoZXJlLCBKUyBkb2Vzbid0IHJlYWxseSBoYXZlIGludGVnZXJzLCBhbGwgbnVtYmVycyBhcmUgZmxvYXRzXG5cblx0XHRcdGNvbXBhcmlzb24gPSBhcmNMZW5ndGhzWyBpIF0gLSB0YXJnZXRBcmNMZW5ndGg7XG5cblx0XHRcdGlmICggY29tcGFyaXNvbiA8IDAgKSB7XG5cblx0XHRcdFx0bG93ID0gaSArIDE7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGNvbXBhcmlzb24gPiAwICkge1xuXG5cdFx0XHRcdGhpZ2ggPSBpIC0gMTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRoaWdoID0gaTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Ly8gRE9ORVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpID0gaGlnaDtcblxuXHRcdGlmICggYXJjTGVuZ3Roc1sgaSBdID09PSB0YXJnZXRBcmNMZW5ndGggKSB7XG5cblx0XHRcdHJldHVybiBpIC8gKCBpbCAtIDEgKTtcblxuXHRcdH1cblxuXHRcdC8vIHdlIGNvdWxkIGdldCBmaW5lciBncmFpbiBhdCBsZW5ndGhzLCBvciB1c2Ugc2ltcGxlIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gcG9pbnRzXG5cblx0XHR2YXIgbGVuZ3RoQmVmb3JlID0gYXJjTGVuZ3Roc1sgaSBdO1xuXHRcdHZhciBsZW5ndGhBZnRlciA9IGFyY0xlbmd0aHNbIGkgKyAxIF07XG5cblx0XHR2YXIgc2VnbWVudExlbmd0aCA9IGxlbmd0aEFmdGVyIC0gbGVuZ3RoQmVmb3JlO1xuXG5cdFx0Ly8gZGV0ZXJtaW5lIHdoZXJlIHdlIGFyZSBiZXR3ZWVuIHRoZSAnYmVmb3JlJyBhbmQgJ2FmdGVyJyBwb2ludHNcblxuXHRcdHZhciBzZWdtZW50RnJhY3Rpb24gPSAoIHRhcmdldEFyY0xlbmd0aCAtIGxlbmd0aEJlZm9yZSApIC8gc2VnbWVudExlbmd0aDtcblxuXHRcdC8vIGFkZCB0aGF0IGZyYWN0aW9uYWwgYW1vdW50IHRvIHRcblxuXHRcdHZhciB0ID0gKCBpICsgc2VnbWVudEZyYWN0aW9uICkgLyAoIGlsIC0gMSApO1xuXG5cdFx0cmV0dXJuIHQ7XG5cblx0fSxcblxuXHQvLyBSZXR1cm5zIGEgdW5pdCB2ZWN0b3IgdGFuZ2VudCBhdCB0XG5cdC8vIEluIGNhc2UgYW55IHN1YiBjdXJ2ZSBkb2VzIG5vdCBpbXBsZW1lbnQgaXRzIHRhbmdlbnQgZGVyaXZhdGlvbixcblx0Ly8gMiBwb2ludHMgYSBzbWFsbCBkZWx0YSBhcGFydCB3aWxsIGJlIHVzZWQgdG8gZmluZCBpdHMgZ3JhZGllbnRcblx0Ly8gd2hpY2ggc2VlbXMgdG8gZ2l2ZSBhIHJlYXNvbmFibGUgYXBwcm94aW1hdGlvblxuXG5cdGdldFRhbmdlbnQ6IGZ1bmN0aW9uICggdCApIHtcblxuXHRcdHZhciBkZWx0YSA9IDAuMDAwMTtcblx0XHR2YXIgdDEgPSB0IC0gZGVsdGE7XG5cdFx0dmFyIHQyID0gdCArIGRlbHRhO1xuXG5cdFx0Ly8gQ2FwcGluZyBpbiBjYXNlIG9mIGRhbmdlclxuXG5cdFx0aWYgKCB0MSA8IDAgKSB0MSA9IDA7XG5cdFx0aWYgKCB0MiA+IDEgKSB0MiA9IDE7XG5cblx0XHR2YXIgcHQxID0gdGhpcy5nZXRQb2ludCggdDEgKTtcblx0XHR2YXIgcHQyID0gdGhpcy5nZXRQb2ludCggdDIgKTtcblxuXHRcdHZhciB2ZWMgPSBwdDIuY2xvbmUoKS5zdWIoIHB0MSApO1xuXHRcdHJldHVybiB2ZWMubm9ybWFsaXplKCk7XG5cblx0fSxcblxuXHRnZXRUYW5nZW50QXQ6IGZ1bmN0aW9uICggdSApIHtcblxuXHRcdHZhciB0ID0gdGhpcy5nZXRVdG9UbWFwcGluZyggdSApO1xuXHRcdHJldHVybiB0aGlzLmdldFRhbmdlbnQoIHQgKTtcblxuXHR9LFxuXG5cdGNvbXB1dGVGcmVuZXRGcmFtZXM6IGZ1bmN0aW9uICggc2VnbWVudHMsIGNsb3NlZCApIHtcblxuXHRcdC8vIHNlZSBodHRwOi8vd3d3LmNzLmluZGlhbmEuZWR1L3B1Yi90ZWNocmVwb3J0cy9UUjQyNS5wZGZcblxuXHRcdHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIHRhbmdlbnRzID0gW107XG5cdFx0dmFyIG5vcm1hbHMgPSBbXTtcblx0XHR2YXIgYmlub3JtYWxzID0gW107XG5cblx0XHR2YXIgdmVjID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbWF0ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHZhciBpLCB1LCB0aGV0YTtcblxuXHRcdC8vIGNvbXB1dGUgdGhlIHRhbmdlbnQgdmVjdG9ycyBmb3IgZWFjaCBzZWdtZW50IG9uIHRoZSBjdXJ2ZVxuXG5cdFx0Zm9yICggaSA9IDA7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdHUgPSBpIC8gc2VnbWVudHM7XG5cblx0XHRcdHRhbmdlbnRzWyBpIF0gPSB0aGlzLmdldFRhbmdlbnRBdCggdSApO1xuXHRcdFx0dGFuZ2VudHNbIGkgXS5ub3JtYWxpemUoKTtcblxuXHRcdH1cblxuXHRcdC8vIHNlbGVjdCBhbiBpbml0aWFsIG5vcm1hbCB2ZWN0b3IgcGVycGVuZGljdWxhciB0byB0aGUgZmlyc3QgdGFuZ2VudCB2ZWN0b3IsXG5cdFx0Ly8gYW5kIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlIG1pbmltdW0gdGFuZ2VudCB4eXogY29tcG9uZW50XG5cblx0XHRub3JtYWxzWyAwIF0gPSBuZXcgVmVjdG9yMygpO1xuXHRcdGJpbm9ybWFsc1sgMCBdID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbWluID0gTnVtYmVyLk1BWF9WQUxVRTtcblx0XHR2YXIgdHggPSBNYXRoLmFicyggdGFuZ2VudHNbIDAgXS54ICk7XG5cdFx0dmFyIHR5ID0gTWF0aC5hYnMoIHRhbmdlbnRzWyAwIF0ueSApO1xuXHRcdHZhciB0eiA9IE1hdGguYWJzKCB0YW5nZW50c1sgMCBdLnogKTtcblxuXHRcdGlmICggdHggPD0gbWluICkge1xuXG5cdFx0XHRtaW4gPSB0eDtcblx0XHRcdG5vcm1hbC5zZXQoIDEsIDAsIDAgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdHkgPD0gbWluICkge1xuXG5cdFx0XHRtaW4gPSB0eTtcblx0XHRcdG5vcm1hbC5zZXQoIDAsIDEsIDAgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdHogPD0gbWluICkge1xuXG5cdFx0XHRub3JtYWwuc2V0KCAwLCAwLCAxICk7XG5cblx0XHR9XG5cblx0XHR2ZWMuY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgMCBdLCBub3JtYWwgKS5ub3JtYWxpemUoKTtcblxuXHRcdG5vcm1hbHNbIDAgXS5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyAwIF0sIHZlYyApO1xuXHRcdGJpbm9ybWFsc1sgMCBdLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIDAgXSwgbm9ybWFsc1sgMCBdICk7XG5cblxuXHRcdC8vIGNvbXB1dGUgdGhlIHNsb3dseS12YXJ5aW5nIG5vcm1hbCBhbmQgYmlub3JtYWwgdmVjdG9ycyBmb3IgZWFjaCBzZWdtZW50IG9uIHRoZSBjdXJ2ZVxuXG5cdFx0Zm9yICggaSA9IDE7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdG5vcm1hbHNbIGkgXSA9IG5vcm1hbHNbIGkgLSAxIF0uY2xvbmUoKTtcblxuXHRcdFx0Ymlub3JtYWxzWyBpIF0gPSBiaW5vcm1hbHNbIGkgLSAxIF0uY2xvbmUoKTtcblxuXHRcdFx0dmVjLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIGkgLSAxIF0sIHRhbmdlbnRzWyBpIF0gKTtcblxuXHRcdFx0aWYgKCB2ZWMubGVuZ3RoKCkgPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHR2ZWMubm9ybWFsaXplKCk7XG5cblx0XHRcdFx0dGhldGEgPSBNYXRoLmFjb3MoIF9NYXRoLmNsYW1wKCB0YW5nZW50c1sgaSAtIDEgXS5kb3QoIHRhbmdlbnRzWyBpIF0gKSwgLSAxLCAxICkgKTsgLy8gY2xhbXAgZm9yIGZsb2F0aW5nIHB0IGVycm9yc1xuXG5cdFx0XHRcdG5vcm1hbHNbIGkgXS5hcHBseU1hdHJpeDQoIG1hdC5tYWtlUm90YXRpb25BeGlzKCB2ZWMsIHRoZXRhICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRiaW5vcm1hbHNbIGkgXS5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyBpIF0sIG5vcm1hbHNbIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gaWYgdGhlIGN1cnZlIGlzIGNsb3NlZCwgcG9zdHByb2Nlc3MgdGhlIHZlY3RvcnMgc28gdGhlIGZpcnN0IGFuZCBsYXN0IG5vcm1hbCB2ZWN0b3JzIGFyZSB0aGUgc2FtZVxuXG5cdFx0aWYgKCBjbG9zZWQgPT09IHRydWUgKSB7XG5cblx0XHRcdHRoZXRhID0gTWF0aC5hY29zKCBfTWF0aC5jbGFtcCggbm9ybWFsc1sgMCBdLmRvdCggbm9ybWFsc1sgc2VnbWVudHMgXSApLCAtIDEsIDEgKSApO1xuXHRcdFx0dGhldGEgLz0gc2VnbWVudHM7XG5cblx0XHRcdGlmICggdGFuZ2VudHNbIDAgXS5kb3QoIHZlYy5jcm9zc1ZlY3RvcnMoIG5vcm1hbHNbIDAgXSwgbm9ybWFsc1sgc2VnbWVudHMgXSApICkgPiAwICkge1xuXG5cdFx0XHRcdHRoZXRhID0gLSB0aGV0YTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCBpID0gMTsgaSA8PSBzZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0XHQvLyB0d2lzdCBhIGxpdHRsZS4uLlxuXHRcdFx0XHRub3JtYWxzWyBpIF0uYXBwbHlNYXRyaXg0KCBtYXQubWFrZVJvdGF0aW9uQXhpcyggdGFuZ2VudHNbIGkgXSwgdGhldGEgKiBpICkgKTtcblx0XHRcdFx0Ymlub3JtYWxzWyBpIF0uY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgaSBdLCBub3JtYWxzWyBpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHRhbmdlbnRzOiB0YW5nZW50cyxcblx0XHRcdG5vcm1hbHM6IG5vcm1hbHMsXG5cdFx0XHRiaW5vcm1hbHM6IGJpbm9ybWFsc1xuXHRcdH07XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9IHNvdXJjZS5hcmNMZW5ndGhEaXZpc2lvbnM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGRhdGEgPSB7XG5cdFx0XHRtZXRhZGF0YToge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdDdXJ2ZScsXG5cdFx0XHRcdGdlbmVyYXRvcjogJ0N1cnZlLnRvSlNPTidcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0ZGF0YS5hcmNMZW5ndGhEaXZpc2lvbnMgPSB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucztcblx0XHRkYXRhLnR5cGUgPSB0aGlzLnR5cGU7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9LFxuXG5cdGZyb21KU09OOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHR0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9IGpzb24uYXJjTGVuZ3RoRGl2aXNpb25zO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbmZ1bmN0aW9uIEVsbGlwc2VDdXJ2ZSggYVgsIGFZLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdFbGxpcHNlQ3VydmUnO1xuXG5cdHRoaXMuYVggPSBhWCB8fCAwO1xuXHR0aGlzLmFZID0gYVkgfHwgMDtcblxuXHR0aGlzLnhSYWRpdXMgPSB4UmFkaXVzIHx8IDE7XG5cdHRoaXMueVJhZGl1cyA9IHlSYWRpdXMgfHwgMTtcblxuXHR0aGlzLmFTdGFydEFuZ2xlID0gYVN0YXJ0QW5nbGUgfHwgMDtcblx0dGhpcy5hRW5kQW5nbGUgPSBhRW5kQW5nbGUgfHwgMiAqIE1hdGguUEk7XG5cblx0dGhpcy5hQ2xvY2t3aXNlID0gYUNsb2Nrd2lzZSB8fCBmYWxzZTtcblxuXHR0aGlzLmFSb3RhdGlvbiA9IGFSb3RhdGlvbiB8fCAwO1xuXG59XG5cbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBFbGxpcHNlQ3VydmU7XG5cbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUuaXNFbGxpcHNlQ3VydmUgPSB0cnVlO1xuXG5FbGxpcHNlQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpO1xuXG5cdHZhciB0d29QaSA9IE1hdGguUEkgKiAyO1xuXHR2YXIgZGVsdGFBbmdsZSA9IHRoaXMuYUVuZEFuZ2xlIC0gdGhpcy5hU3RhcnRBbmdsZTtcblx0dmFyIHNhbWVQb2ludHMgPSBNYXRoLmFicyggZGVsdGFBbmdsZSApIDwgTnVtYmVyLkVQU0lMT047XG5cblx0Ly8gZW5zdXJlcyB0aGF0IGRlbHRhQW5nbGUgaXMgMCAuLiAyIFBJXG5cdHdoaWxlICggZGVsdGFBbmdsZSA8IDAgKSBkZWx0YUFuZ2xlICs9IHR3b1BpO1xuXHR3aGlsZSAoIGRlbHRhQW5nbGUgPiB0d29QaSApIGRlbHRhQW5nbGUgLT0gdHdvUGk7XG5cblx0aWYgKCBkZWx0YUFuZ2xlIDwgTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRpZiAoIHNhbWVQb2ludHMgKSB7XG5cblx0XHRcdGRlbHRhQW5nbGUgPSAwO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZGVsdGFBbmdsZSA9IHR3b1BpO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRpZiAoIHRoaXMuYUNsb2Nrd2lzZSA9PT0gdHJ1ZSAmJiAhIHNhbWVQb2ludHMgKSB7XG5cblx0XHRpZiAoIGRlbHRhQW5nbGUgPT09IHR3b1BpICkge1xuXG5cdFx0XHRkZWx0YUFuZ2xlID0gLSB0d29QaTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGRlbHRhQW5nbGUgPSBkZWx0YUFuZ2xlIC0gdHdvUGk7XG5cblx0XHR9XG5cblx0fVxuXG5cdHZhciBhbmdsZSA9IHRoaXMuYVN0YXJ0QW5nbGUgKyB0ICogZGVsdGFBbmdsZTtcblx0dmFyIHggPSB0aGlzLmFYICsgdGhpcy54UmFkaXVzICogTWF0aC5jb3MoIGFuZ2xlICk7XG5cdHZhciB5ID0gdGhpcy5hWSArIHRoaXMueVJhZGl1cyAqIE1hdGguc2luKCBhbmdsZSApO1xuXG5cdGlmICggdGhpcy5hUm90YXRpb24gIT09IDAgKSB7XG5cblx0XHR2YXIgY29zID0gTWF0aC5jb3MoIHRoaXMuYVJvdGF0aW9uICk7XG5cdFx0dmFyIHNpbiA9IE1hdGguc2luKCB0aGlzLmFSb3RhdGlvbiApO1xuXG5cdFx0dmFyIHR4ID0geCAtIHRoaXMuYVg7XG5cdFx0dmFyIHR5ID0geSAtIHRoaXMuYVk7XG5cblx0XHQvLyBSb3RhdGUgdGhlIHBvaW50IGFib3V0IHRoZSBjZW50ZXIgb2YgdGhlIGVsbGlwc2UuXG5cdFx0eCA9IHR4ICogY29zIC0gdHkgKiBzaW4gKyB0aGlzLmFYO1xuXHRcdHkgPSB0eCAqIHNpbiArIHR5ICogY29zICsgdGhpcy5hWTtcblxuXHR9XG5cblx0cmV0dXJuIHBvaW50LnNldCggeCwgeSApO1xuXG59O1xuXG5FbGxpcHNlQ3VydmUucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmFYID0gc291cmNlLmFYO1xuXHR0aGlzLmFZID0gc291cmNlLmFZO1xuXG5cdHRoaXMueFJhZGl1cyA9IHNvdXJjZS54UmFkaXVzO1xuXHR0aGlzLnlSYWRpdXMgPSBzb3VyY2UueVJhZGl1cztcblxuXHR0aGlzLmFTdGFydEFuZ2xlID0gc291cmNlLmFTdGFydEFuZ2xlO1xuXHR0aGlzLmFFbmRBbmdsZSA9IHNvdXJjZS5hRW5kQW5nbGU7XG5cblx0dGhpcy5hQ2xvY2t3aXNlID0gc291cmNlLmFDbG9ja3dpc2U7XG5cblx0dGhpcy5hUm90YXRpb24gPSBzb3VyY2UuYVJvdGF0aW9uO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5cbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0ZGF0YS5hWCA9IHRoaXMuYVg7XG5cdGRhdGEuYVkgPSB0aGlzLmFZO1xuXG5cdGRhdGEueFJhZGl1cyA9IHRoaXMueFJhZGl1cztcblx0ZGF0YS55UmFkaXVzID0gdGhpcy55UmFkaXVzO1xuXG5cdGRhdGEuYVN0YXJ0QW5nbGUgPSB0aGlzLmFTdGFydEFuZ2xlO1xuXHRkYXRhLmFFbmRBbmdsZSA9IHRoaXMuYUVuZEFuZ2xlO1xuXG5cdGRhdGEuYUNsb2Nrd2lzZSA9IHRoaXMuYUNsb2Nrd2lzZTtcblxuXHRkYXRhLmFSb3RhdGlvbiA9IHRoaXMuYVJvdGF0aW9uO1xuXG5cdHJldHVybiBkYXRhO1xuXG59O1xuXG5FbGxpcHNlQ3VydmUucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy5hWCA9IGpzb24uYVg7XG5cdHRoaXMuYVkgPSBqc29uLmFZO1xuXG5cdHRoaXMueFJhZGl1cyA9IGpzb24ueFJhZGl1cztcblx0dGhpcy55UmFkaXVzID0ganNvbi55UmFkaXVzO1xuXG5cdHRoaXMuYVN0YXJ0QW5nbGUgPSBqc29uLmFTdGFydEFuZ2xlO1xuXHR0aGlzLmFFbmRBbmdsZSA9IGpzb24uYUVuZEFuZ2xlO1xuXG5cdHRoaXMuYUNsb2Nrd2lzZSA9IGpzb24uYUNsb2Nrd2lzZTtcblxuXHR0aGlzLmFSb3RhdGlvbiA9IGpzb24uYVJvdGF0aW9uO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5mdW5jdGlvbiBBcmNDdXJ2ZSggYVgsIGFZLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICkge1xuXG5cdEVsbGlwc2VDdXJ2ZS5jYWxsKCB0aGlzLCBhWCwgYVksIGFSYWRpdXMsIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKTtcblxuXHR0aGlzLnR5cGUgPSAnQXJjQ3VydmUnO1xuXG59XG5cbkFyY0N1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUgKTtcbkFyY0N1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEFyY0N1cnZlO1xuXG5BcmNDdXJ2ZS5wcm90b3R5cGUuaXNBcmNDdXJ2ZSA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IGh0dHBzOi8vZ2l0aHViLmNvbS96ejg1XG4gKlxuICogQ2VudHJpcGV0YWwgQ2F0bXVsbFJvbSBDdXJ2ZSAtIHdoaWNoIGlzIHVzZWZ1bCBmb3IgYXZvaWRpbmdcbiAqIGN1c3BzIGFuZCBzZWxmLWludGVyc2VjdGlvbnMgaW4gbm9uLXVuaWZvcm0gY2F0bXVsbCByb20gY3VydmVzLlxuICogaHR0cDovL3d3dy5jZW15dWtzZWwuY29tL3Jlc2VhcmNoL2NhdG11bGxyb21fcGFyYW0vY2F0bXVsbHJvbS5wZGZcbiAqXG4gKiBjdXJ2ZS50eXBlIGFjY2VwdHMgY2VudHJpcGV0YWwoZGVmYXVsdCksIGNob3JkYWwgYW5kIGNhdG11bGxyb21cbiAqIGN1cnZlLnRlbnNpb24gaXMgdXNlZCBmb3IgY2F0bXVsbHJvbSB3aGljaCBkZWZhdWx0cyB0byAwLjVcbiAqL1xuXG5cbi8qXG5CYXNlZCBvbiBhbiBvcHRpbWl6ZWQgYysrIHNvbHV0aW9uIGluXG4gLSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzk0ODk3MzYvY2F0bXVsbC1yb20tY3VydmUtd2l0aC1uby1jdXNwcy1hbmQtbm8tc2VsZi1pbnRlcnNlY3Rpb25zL1xuIC0gaHR0cDovL2lkZW9uZS5jb20vTm9FYlZNXG5cblRoaXMgQ3ViaWNQb2x5IGNsYXNzIGNvdWxkIGJlIHVzZWQgZm9yIHJldXNpbmcgc29tZSB2YXJpYWJsZXMgYW5kIGNhbGN1bGF0aW9ucyxcbmJ1dCBmb3IgdGhyZWUuanMgY3VydmUgdXNlLCBpdCBjb3VsZCBiZSBwb3NzaWJsZSBpbmxpbmVkIGFuZCBmbGF0dGVuIGludG8gYSBzaW5nbGUgZnVuY3Rpb24gY2FsbFxud2hpY2ggY2FuIGJlIHBsYWNlZCBpbiBDdXJ2ZVV0aWxzLlxuKi9cblxuZnVuY3Rpb24gQ3ViaWNQb2x5KCkge1xuXG5cdHZhciBjMCA9IDAsIGMxID0gMCwgYzIgPSAwLCBjMyA9IDA7XG5cblx0Lypcblx0ICogQ29tcHV0ZSBjb2VmZmljaWVudHMgZm9yIGEgY3ViaWMgcG9seW5vbWlhbFxuXHQgKiAgIHAocykgPSBjMCArIGMxKnMgKyBjMipzXjIgKyBjMypzXjNcblx0ICogc3VjaCB0aGF0XG5cdCAqICAgcCgwKSA9IHgwLCBwKDEpID0geDFcblx0ICogIGFuZFxuXHQgKiAgIHAnKDApID0gdDAsIHAnKDEpID0gdDEuXG5cdCAqL1xuXHRmdW5jdGlvbiBpbml0KCB4MCwgeDEsIHQwLCB0MSApIHtcblxuXHRcdGMwID0geDA7XG5cdFx0YzEgPSB0MDtcblx0XHRjMiA9IC0gMyAqIHgwICsgMyAqIHgxIC0gMiAqIHQwIC0gdDE7XG5cdFx0YzMgPSAyICogeDAgLSAyICogeDEgKyB0MCArIHQxO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0aW5pdENhdG11bGxSb206IGZ1bmN0aW9uICggeDAsIHgxLCB4MiwgeDMsIHRlbnNpb24gKSB7XG5cblx0XHRcdGluaXQoIHgxLCB4MiwgdGVuc2lvbiAqICggeDIgLSB4MCApLCB0ZW5zaW9uICogKCB4MyAtIHgxICkgKTtcblxuXHRcdH0sXG5cblx0XHRpbml0Tm9udW5pZm9ybUNhdG11bGxSb206IGZ1bmN0aW9uICggeDAsIHgxLCB4MiwgeDMsIGR0MCwgZHQxLCBkdDIgKSB7XG5cblx0XHRcdC8vIGNvbXB1dGUgdGFuZ2VudHMgd2hlbiBwYXJhbWV0ZXJpemVkIGluIFt0MSx0Ml1cblx0XHRcdHZhciB0MSA9ICggeDEgLSB4MCApIC8gZHQwIC0gKCB4MiAtIHgwICkgLyAoIGR0MCArIGR0MSApICsgKCB4MiAtIHgxICkgLyBkdDE7XG5cdFx0XHR2YXIgdDIgPSAoIHgyIC0geDEgKSAvIGR0MSAtICggeDMgLSB4MSApIC8gKCBkdDEgKyBkdDIgKSArICggeDMgLSB4MiApIC8gZHQyO1xuXG5cdFx0XHQvLyByZXNjYWxlIHRhbmdlbnRzIGZvciBwYXJhbWV0cml6YXRpb24gaW4gWzAsMV1cblx0XHRcdHQxICo9IGR0MTtcblx0XHRcdHQyICo9IGR0MTtcblxuXHRcdFx0aW5pdCggeDEsIHgyLCB0MSwgdDIgKTtcblxuXHRcdH0sXG5cblx0XHRjYWxjOiBmdW5jdGlvbiAoIHQgKSB7XG5cblx0XHRcdHZhciB0MiA9IHQgKiB0O1xuXHRcdFx0dmFyIHQzID0gdDIgKiB0O1xuXHRcdFx0cmV0dXJuIGMwICsgYzEgKiB0ICsgYzIgKiB0MiArIGMzICogdDM7XG5cblx0XHR9XG5cblx0fTtcblxufVxuXG4vL1xuXG52YXIgdG1wID0gbmV3IFZlY3RvcjMoKTtcbnZhciBweCA9IG5ldyBDdWJpY1BvbHkoKTtcbnZhciBweSA9IG5ldyBDdWJpY1BvbHkoKTtcbnZhciBweiA9IG5ldyBDdWJpY1BvbHkoKTtcblxuZnVuY3Rpb24gQ2F0bXVsbFJvbUN1cnZlMyggcG9pbnRzLCBjbG9zZWQsIGN1cnZlVHlwZSwgdGVuc2lvbiApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0NhdG11bGxSb21DdXJ2ZTMnO1xuXG5cdHRoaXMucG9pbnRzID0gcG9pbnRzIHx8IFtdO1xuXHR0aGlzLmNsb3NlZCA9IGNsb3NlZCB8fCBmYWxzZTtcblx0dGhpcy5jdXJ2ZVR5cGUgPSBjdXJ2ZVR5cGUgfHwgJ2NlbnRyaXBldGFsJztcblx0dGhpcy50ZW5zaW9uID0gdGVuc2lvbiB8fCAwLjU7XG5cbn1cblxuQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcbkNhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2F0bXVsbFJvbUN1cnZlMztcblxuQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUuaXNDYXRtdWxsUm9tQ3VydmUzID0gdHJ1ZTtcblxuQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdHZhciBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIHBvaW50cyA9IHRoaXMucG9pbnRzO1xuXHR2YXIgbCA9IHBvaW50cy5sZW5ndGg7XG5cblx0dmFyIHAgPSAoIGwgLSAoIHRoaXMuY2xvc2VkID8gMCA6IDEgKSApICogdDtcblx0dmFyIGludFBvaW50ID0gTWF0aC5mbG9vciggcCApO1xuXHR2YXIgd2VpZ2h0ID0gcCAtIGludFBvaW50O1xuXG5cdGlmICggdGhpcy5jbG9zZWQgKSB7XG5cblx0XHRpbnRQb2ludCArPSBpbnRQb2ludCA+IDAgPyAwIDogKCBNYXRoLmZsb29yKCBNYXRoLmFicyggaW50UG9pbnQgKSAvIGwgKSArIDEgKSAqIGw7XG5cblx0fSBlbHNlIGlmICggd2VpZ2h0ID09PSAwICYmIGludFBvaW50ID09PSBsIC0gMSApIHtcblxuXHRcdGludFBvaW50ID0gbCAtIDI7XG5cdFx0d2VpZ2h0ID0gMTtcblxuXHR9XG5cblx0dmFyIHAwLCBwMSwgcDIsIHAzOyAvLyA0IHBvaW50c1xuXG5cdGlmICggdGhpcy5jbG9zZWQgfHwgaW50UG9pbnQgPiAwICkge1xuXG5cdFx0cDAgPSBwb2ludHNbICggaW50UG9pbnQgLSAxICkgJSBsIF07XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIGV4dHJhcG9sYXRlIGZpcnN0IHBvaW50XG5cdFx0dG1wLnN1YlZlY3RvcnMoIHBvaW50c1sgMCBdLCBwb2ludHNbIDEgXSApLmFkZCggcG9pbnRzWyAwIF0gKTtcblx0XHRwMCA9IHRtcDtcblxuXHR9XG5cblx0cDEgPSBwb2ludHNbIGludFBvaW50ICUgbCBdO1xuXHRwMiA9IHBvaW50c1sgKCBpbnRQb2ludCArIDEgKSAlIGwgXTtcblxuXHRpZiAoIHRoaXMuY2xvc2VkIHx8IGludFBvaW50ICsgMiA8IGwgKSB7XG5cblx0XHRwMyA9IHBvaW50c1sgKCBpbnRQb2ludCArIDIgKSAlIGwgXTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Ly8gZXh0cmFwb2xhdGUgbGFzdCBwb2ludFxuXHRcdHRtcC5zdWJWZWN0b3JzKCBwb2ludHNbIGwgLSAxIF0sIHBvaW50c1sgbCAtIDIgXSApLmFkZCggcG9pbnRzWyBsIC0gMSBdICk7XG5cdFx0cDMgPSB0bXA7XG5cblx0fVxuXG5cdGlmICggdGhpcy5jdXJ2ZVR5cGUgPT09ICdjZW50cmlwZXRhbCcgfHwgdGhpcy5jdXJ2ZVR5cGUgPT09ICdjaG9yZGFsJyApIHtcblxuXHRcdC8vIGluaXQgQ2VudHJpcGV0YWwgLyBDaG9yZGFsIENhdG11bGwtUm9tXG5cdFx0dmFyIHBvdyA9IHRoaXMuY3VydmVUeXBlID09PSAnY2hvcmRhbCcgPyAwLjUgOiAwLjI1O1xuXHRcdHZhciBkdDAgPSBNYXRoLnBvdyggcDAuZGlzdGFuY2VUb1NxdWFyZWQoIHAxICksIHBvdyApO1xuXHRcdHZhciBkdDEgPSBNYXRoLnBvdyggcDEuZGlzdGFuY2VUb1NxdWFyZWQoIHAyICksIHBvdyApO1xuXHRcdHZhciBkdDIgPSBNYXRoLnBvdyggcDIuZGlzdGFuY2VUb1NxdWFyZWQoIHAzICksIHBvdyApO1xuXG5cdFx0Ly8gc2FmZXR5IGNoZWNrIGZvciByZXBlYXRlZCBwb2ludHNcblx0XHRpZiAoIGR0MSA8IDFlLTQgKSBkdDEgPSAxLjA7XG5cdFx0aWYgKCBkdDAgPCAxZS00ICkgZHQwID0gZHQxO1xuXHRcdGlmICggZHQyIDwgMWUtNCApIGR0MiA9IGR0MTtcblxuXHRcdHB4LmluaXROb251bmlmb3JtQ2F0bXVsbFJvbSggcDAueCwgcDEueCwgcDIueCwgcDMueCwgZHQwLCBkdDEsIGR0MiApO1xuXHRcdHB5LmluaXROb251bmlmb3JtQ2F0bXVsbFJvbSggcDAueSwgcDEueSwgcDIueSwgcDMueSwgZHQwLCBkdDEsIGR0MiApO1xuXHRcdHB6LmluaXROb251bmlmb3JtQ2F0bXVsbFJvbSggcDAueiwgcDEueiwgcDIueiwgcDMueiwgZHQwLCBkdDEsIGR0MiApO1xuXG5cdH0gZWxzZSBpZiAoIHRoaXMuY3VydmVUeXBlID09PSAnY2F0bXVsbHJvbScgKSB7XG5cblx0XHRweC5pbml0Q2F0bXVsbFJvbSggcDAueCwgcDEueCwgcDIueCwgcDMueCwgdGhpcy50ZW5zaW9uICk7XG5cdFx0cHkuaW5pdENhdG11bGxSb20oIHAwLnksIHAxLnksIHAyLnksIHAzLnksIHRoaXMudGVuc2lvbiApO1xuXHRcdHB6LmluaXRDYXRtdWxsUm9tKCBwMC56LCBwMS56LCBwMi56LCBwMy56LCB0aGlzLnRlbnNpb24gKTtcblxuXHR9XG5cblx0cG9pbnQuc2V0KFxuXHRcdHB4LmNhbGMoIHdlaWdodCApLFxuXHRcdHB5LmNhbGMoIHdlaWdodCApLFxuXHRcdHB6LmNhbGMoIHdlaWdodCApXG5cdCk7XG5cblx0cmV0dXJuIHBvaW50O1xuXG59O1xuXG5DYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5wb2ludHMgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBzb3VyY2UucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHR2YXIgcG9pbnQgPSBzb3VyY2UucG9pbnRzWyBpIF07XG5cblx0XHR0aGlzLnBvaW50cy5wdXNoKCBwb2ludC5jbG9uZSgpICk7XG5cblx0fVxuXG5cdHRoaXMuY2xvc2VkID0gc291cmNlLmNsb3NlZDtcblx0dGhpcy5jdXJ2ZVR5cGUgPSBzb3VyY2UuY3VydmVUeXBlO1xuXHR0aGlzLnRlbnNpb24gPSBzb3VyY2UudGVuc2lvbjtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0ZGF0YS5wb2ludHMgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLnBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0dmFyIHBvaW50ID0gdGhpcy5wb2ludHNbIGkgXTtcblx0XHRkYXRhLnBvaW50cy5wdXNoKCBwb2ludC50b0FycmF5KCkgKTtcblxuXHR9XG5cblx0ZGF0YS5jbG9zZWQgPSB0aGlzLmNsb3NlZDtcblx0ZGF0YS5jdXJ2ZVR5cGUgPSB0aGlzLmN1cnZlVHlwZTtcblx0ZGF0YS50ZW5zaW9uID0gdGhpcy50ZW5zaW9uO1xuXG5cdHJldHVybiBkYXRhO1xuXG59O1xuXG5DYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZS5mcm9tSlNPTiA9IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApO1xuXG5cdHRoaXMucG9pbnRzID0gW107XG5cblx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5wb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdHZhciBwb2ludCA9IGpzb24ucG9pbnRzWyBpIF07XG5cdFx0dGhpcy5wb2ludHMucHVzaCggbmV3IFZlY3RvcjMoKS5mcm9tQXJyYXkoIHBvaW50ICkgKTtcblxuXHR9XG5cblx0dGhpcy5jbG9zZWQgPSBqc29uLmNsb3NlZDtcblx0dGhpcy5jdXJ2ZVR5cGUgPSBqc29uLmN1cnZlVHlwZTtcblx0dGhpcy50ZW5zaW9uID0ganNvbi50ZW5zaW9uO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqXG4gKiBCZXppZXIgQ3VydmVzIGZvcm11bGFzIG9idGFpbmVkIGZyb21cbiAqIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQsOpemllcl9jdXJ2ZVxuICovXG5cbmZ1bmN0aW9uIENhdG11bGxSb20oIHQsIHAwLCBwMSwgcDIsIHAzICkge1xuXG5cdHZhciB2MCA9ICggcDIgLSBwMCApICogMC41O1xuXHR2YXIgdjEgPSAoIHAzIC0gcDEgKSAqIDAuNTtcblx0dmFyIHQyID0gdCAqIHQ7XG5cdHZhciB0MyA9IHQgKiB0Mjtcblx0cmV0dXJuICggMiAqIHAxIC0gMiAqIHAyICsgdjAgKyB2MSApICogdDMgKyAoIC0gMyAqIHAxICsgMyAqIHAyIC0gMiAqIHYwIC0gdjEgKSAqIHQyICsgdjAgKiB0ICsgcDE7XG5cbn1cblxuLy9cblxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyUDAoIHQsIHAgKSB7XG5cblx0dmFyIGsgPSAxIC0gdDtcblx0cmV0dXJuIGsgKiBrICogcDtcblxufVxuXG5mdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJQMSggdCwgcCApIHtcblxuXHRyZXR1cm4gMiAqICggMSAtIHQgKSAqIHQgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIFF1YWRyYXRpY0JlemllclAyKCB0LCBwICkge1xuXG5cdHJldHVybiB0ICogdCAqIHA7XG5cbn1cblxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyKCB0LCBwMCwgcDEsIHAyICkge1xuXG5cdHJldHVybiBRdWFkcmF0aWNCZXppZXJQMCggdCwgcDAgKSArIFF1YWRyYXRpY0JlemllclAxKCB0LCBwMSApICtcblx0XHRRdWFkcmF0aWNCZXppZXJQMiggdCwgcDIgKTtcblxufVxuXG4vL1xuXG5mdW5jdGlvbiBDdWJpY0JlemllclAwKCB0LCBwICkge1xuXG5cdHZhciBrID0gMSAtIHQ7XG5cdHJldHVybiBrICogayAqIGsgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIEN1YmljQmV6aWVyUDEoIHQsIHAgKSB7XG5cblx0dmFyIGsgPSAxIC0gdDtcblx0cmV0dXJuIDMgKiBrICogayAqIHQgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIEN1YmljQmV6aWVyUDIoIHQsIHAgKSB7XG5cblx0cmV0dXJuIDMgKiAoIDEgLSB0ICkgKiB0ICogdCAqIHA7XG5cbn1cblxuZnVuY3Rpb24gQ3ViaWNCZXppZXJQMyggdCwgcCApIHtcblxuXHRyZXR1cm4gdCAqIHQgKiB0ICogcDtcblxufVxuXG5mdW5jdGlvbiBDdWJpY0JlemllciggdCwgcDAsIHAxLCBwMiwgcDMgKSB7XG5cblx0cmV0dXJuIEN1YmljQmV6aWVyUDAoIHQsIHAwICkgKyBDdWJpY0JlemllclAxKCB0LCBwMSApICsgQ3ViaWNCZXppZXJQMiggdCwgcDIgKSArXG5cdFx0Q3ViaWNCZXppZXJQMyggdCwgcDMgKTtcblxufVxuXG5mdW5jdGlvbiBDdWJpY0JlemllckN1cnZlKCB2MCwgdjEsIHYyLCB2MyApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0N1YmljQmV6aWVyQ3VydmUnO1xuXG5cdHRoaXMudjAgPSB2MCB8fCBuZXcgVmVjdG9yMigpO1xuXHR0aGlzLnYxID0gdjEgfHwgbmV3IFZlY3RvcjIoKTtcblx0dGhpcy52MiA9IHYyIHx8IG5ldyBWZWN0b3IyKCk7XG5cdHRoaXMudjMgPSB2MyB8fCBuZXcgVmVjdG9yMigpO1xuXG59XG5cbkN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5DdWJpY0JlemllckN1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN1YmljQmV6aWVyQ3VydmU7XG5cbkN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlLmlzQ3ViaWNCZXppZXJDdXJ2ZSA9IHRydWU7XG5cbkN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpO1xuXG5cdHZhciB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyLCB2MyA9IHRoaXMudjM7XG5cblx0cG9pbnQuc2V0KFxuXHRcdEN1YmljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54LCB2My54ICksXG5cdFx0Q3ViaWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnksIHYzLnkgKVxuXHQpO1xuXG5cdHJldHVybiBwb2ludDtcblxufTtcblxuQ3ViaWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMudjAuY29weSggc291cmNlLnYwICk7XG5cdHRoaXMudjEuY29weSggc291cmNlLnYxICk7XG5cdHRoaXMudjIuY29weSggc291cmNlLnYyICk7XG5cdHRoaXMudjMuY29weSggc291cmNlLnYzICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbkN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdGRhdGEudjAgPSB0aGlzLnYwLnRvQXJyYXkoKTtcblx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xuXHRkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7XG5cdGRhdGEudjMgPSB0aGlzLnYzLnRvQXJyYXkoKTtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuQ3ViaWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHR0aGlzLnYwLmZyb21BcnJheSgganNvbi52MCApO1xuXHR0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApO1xuXHR0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApO1xuXHR0aGlzLnYzLmZyb21BcnJheSgganNvbi52MyApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5mdW5jdGlvbiBDdWJpY0JlemllckN1cnZlMyggdjAsIHYxLCB2MiwgdjMgKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDdWJpY0JlemllckN1cnZlMyc7XG5cblx0dGhpcy52MCA9IHYwIHx8IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMudjEgPSB2MSB8fCBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLnYyID0gdjIgfHwgbmV3IFZlY3RvcjMoKTtcblx0dGhpcy52MyA9IHYzIHx8IG5ldyBWZWN0b3IzKCk7XG5cbn1cblxuQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5DdWJpY0JlemllckN1cnZlMy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDdWJpY0JlemllckN1cnZlMztcblxuQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmlzQ3ViaWNCZXppZXJDdXJ2ZTMgPSB0cnVlO1xuXG5DdWJpY0JlemllckN1cnZlMy5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdHZhciBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIHYwID0gdGhpcy52MCwgdjEgPSB0aGlzLnYxLCB2MiA9IHRoaXMudjIsIHYzID0gdGhpcy52MztcblxuXHRwb2ludC5zZXQoXG5cdFx0Q3ViaWNCZXppZXIoIHQsIHYwLngsIHYxLngsIHYyLngsIHYzLnggKSxcblx0XHRDdWJpY0JlemllciggdCwgdjAueSwgdjEueSwgdjIueSwgdjMueSApLFxuXHRcdEN1YmljQmV6aWVyKCB0LCB2MC56LCB2MS56LCB2Mi56LCB2My56IClcblx0KTtcblxuXHRyZXR1cm4gcG9pbnQ7XG5cbn07XG5cbkN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy52MC5jb3B5KCBzb3VyY2UudjAgKTtcblx0dGhpcy52MS5jb3B5KCBzb3VyY2UudjEgKTtcblx0dGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTtcblx0dGhpcy52My5jb3B5KCBzb3VyY2UudjMgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdGRhdGEudjAgPSB0aGlzLnYwLnRvQXJyYXkoKTtcblx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xuXHRkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7XG5cdGRhdGEudjMgPSB0aGlzLnYzLnRvQXJyYXkoKTtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy52MC5mcm9tQXJyYXkoIGpzb24udjAgKTtcblx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcblx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcblx0dGhpcy52My5mcm9tQXJyYXkoIGpzb24udjMgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuZnVuY3Rpb24gTGluZUN1cnZlKCB2MSwgdjIgKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMaW5lQ3VydmUnO1xuXG5cdHRoaXMudjEgPSB2MSB8fCBuZXcgVmVjdG9yMigpO1xuXHR0aGlzLnYyID0gdjIgfHwgbmV3IFZlY3RvcjIoKTtcblxufVxuXG5MaW5lQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5MaW5lQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGluZUN1cnZlO1xuXG5MaW5lQ3VydmUucHJvdG90eXBlLmlzTGluZUN1cnZlID0gdHJ1ZTtcblxuTGluZUN1cnZlLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0dmFyIHBvaW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjIoKTtcblxuXHRpZiAoIHQgPT09IDEgKSB7XG5cblx0XHRwb2ludC5jb3B5KCB0aGlzLnYyICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdHBvaW50LmNvcHkoIHRoaXMudjIgKS5zdWIoIHRoaXMudjEgKTtcblx0XHRwb2ludC5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy52MSApO1xuXG5cdH1cblxuXHRyZXR1cm4gcG9pbnQ7XG5cbn07XG5cbi8vIExpbmUgY3VydmUgaXMgbGluZWFyLCBzbyB3ZSBjYW4gb3ZlcndyaXRlIGRlZmF1bHQgZ2V0UG9pbnRBdFxuXG5MaW5lQ3VydmUucHJvdG90eXBlLmdldFBvaW50QXQgPSBmdW5jdGlvbiAoIHUsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdHJldHVybiB0aGlzLmdldFBvaW50KCB1LCBvcHRpb25hbFRhcmdldCApO1xuXG59O1xuXG5MaW5lQ3VydmUucHJvdG90eXBlLmdldFRhbmdlbnQgPSBmdW5jdGlvbiAoIC8qIHQgKi8gKSB7XG5cblx0dmFyIHRhbmdlbnQgPSB0aGlzLnYyLmNsb25lKCkuc3ViKCB0aGlzLnYxICk7XG5cblx0cmV0dXJuIHRhbmdlbnQubm9ybWFsaXplKCk7XG5cbn07XG5cbkxpbmVDdXJ2ZS5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMudjEuY29weSggc291cmNlLnYxICk7XG5cdHRoaXMudjIuY29weSggc291cmNlLnYyICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbkxpbmVDdXJ2ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xuXHRkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7XG5cblx0cmV0dXJuIGRhdGE7XG5cbn07XG5cbkxpbmVDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHR0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApO1xuXHR0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5mdW5jdGlvbiBMaW5lQ3VydmUzKCB2MSwgdjIgKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMaW5lQ3VydmUzJztcblxuXHR0aGlzLnYxID0gdjEgfHwgbmV3IFZlY3RvcjMoKTtcblx0dGhpcy52MiA9IHYyIHx8IG5ldyBWZWN0b3IzKCk7XG5cbn1cblxuTGluZUN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcbkxpbmVDdXJ2ZTMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGluZUN1cnZlMztcblxuTGluZUN1cnZlMy5wcm90b3R5cGUuaXNMaW5lQ3VydmUzID0gdHJ1ZTtcblxuTGluZUN1cnZlMy5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdHZhciBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cblx0aWYgKCB0ID09PSAxICkge1xuXG5cdFx0cG9pbnQuY29weSggdGhpcy52MiApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRwb2ludC5jb3B5KCB0aGlzLnYyICkuc3ViKCB0aGlzLnYxICk7XG5cdFx0cG9pbnQubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMudjEgKTtcblxuXHR9XG5cblx0cmV0dXJuIHBvaW50O1xuXG59O1xuXG4vLyBMaW5lIGN1cnZlIGlzIGxpbmVhciwgc28gd2UgY2FuIG92ZXJ3cml0ZSBkZWZhdWx0IGdldFBvaW50QXRcblxuTGluZUN1cnZlMy5wcm90b3R5cGUuZ2V0UG9pbnRBdCA9IGZ1bmN0aW9uICggdSwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0cmV0dXJuIHRoaXMuZ2V0UG9pbnQoIHUsIG9wdGlvbmFsVGFyZ2V0ICk7XG5cbn07XG5cbkxpbmVDdXJ2ZTMucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLnYxLmNvcHkoIHNvdXJjZS52MSApO1xuXHR0aGlzLnYyLmNvcHkoIHNvdXJjZS52MiApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5MaW5lQ3VydmUzLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7XG5cdGRhdGEudjIgPSB0aGlzLnYyLnRvQXJyYXkoKTtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuTGluZUN1cnZlMy5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHR0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApO1xuXHR0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5mdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJDdXJ2ZSggdjAsIHYxLCB2MiApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1F1YWRyYXRpY0JlemllckN1cnZlJztcblxuXHR0aGlzLnYwID0gdjAgfHwgbmV3IFZlY3RvcjIoKTtcblx0dGhpcy52MSA9IHYxIHx8IG5ldyBWZWN0b3IyKCk7XG5cdHRoaXMudjIgPSB2MiB8fCBuZXcgVmVjdG9yMigpO1xuXG59XG5cblF1YWRyYXRpY0JlemllckN1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUXVhZHJhdGljQmV6aWVyQ3VydmU7XG5cblF1YWRyYXRpY0JlemllckN1cnZlLnByb3RvdHlwZS5pc1F1YWRyYXRpY0JlemllckN1cnZlID0gdHJ1ZTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpO1xuXG5cdHZhciB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyO1xuXG5cdHBvaW50LnNldChcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLngsIHYxLngsIHYyLnggKSxcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnkgKVxuXHQpO1xuXG5cdHJldHVybiBwb2ludDtcblxufTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLnYwLmNvcHkoIHNvdXJjZS52MCApO1xuXHR0aGlzLnYxLmNvcHkoIHNvdXJjZS52MSApO1xuXHR0aGlzLnYyLmNvcHkoIHNvdXJjZS52MiApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0ZGF0YS52MCA9IHRoaXMudjAudG9BcnJheSgpO1xuXHRkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7XG5cdGRhdGEudjIgPSB0aGlzLnYyLnRvQXJyYXkoKTtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy52MC5mcm9tQXJyYXkoIGpzb24udjAgKTtcblx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcblx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyQ3VydmUzKCB2MCwgdjEsIHYyICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUXVhZHJhdGljQmV6aWVyQ3VydmUzJztcblxuXHR0aGlzLnYwID0gdjAgfHwgbmV3IFZlY3RvcjMoKTtcblx0dGhpcy52MSA9IHYxIHx8IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMudjIgPSB2MiB8fCBuZXcgVmVjdG9yMygpO1xuXG59XG5cblF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcblF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBRdWFkcmF0aWNCZXppZXJDdXJ2ZTM7XG5cblF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZTMgPSB0cnVlO1xuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyO1xuXG5cdHBvaW50LnNldChcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLngsIHYxLngsIHYyLnggKSxcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnkgKSxcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLnosIHYxLnosIHYyLnogKVxuXHQpO1xuXG5cdHJldHVybiBwb2ludDtcblxufTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy52MC5jb3B5KCBzb3VyY2UudjAgKTtcblx0dGhpcy52MS5jb3B5KCBzb3VyY2UudjEgKTtcblx0dGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRkYXRhLnYwID0gdGhpcy52MC50b0FycmF5KCk7XG5cdGRhdGEudjEgPSB0aGlzLnYxLnRvQXJyYXkoKTtcblx0ZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpO1xuXG5cdHJldHVybiBkYXRhO1xuXG59O1xuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy52MC5mcm9tQXJyYXkoIGpzb24udjAgKTtcblx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcblx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuZnVuY3Rpb24gU3BsaW5lQ3VydmUoIHBvaW50cyAvKiBhcnJheSBvZiBWZWN0b3IyICovICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU3BsaW5lQ3VydmUnO1xuXG5cdHRoaXMucG9pbnRzID0gcG9pbnRzIHx8IFtdO1xuXG59XG5cblNwbGluZUN1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuU3BsaW5lQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3BsaW5lQ3VydmU7XG5cblNwbGluZUN1cnZlLnByb3RvdHlwZS5pc1NwbGluZUN1cnZlID0gdHJ1ZTtcblxuU3BsaW5lQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpO1xuXG5cdHZhciBwb2ludHMgPSB0aGlzLnBvaW50cztcblx0dmFyIHAgPSAoIHBvaW50cy5sZW5ndGggLSAxICkgKiB0O1xuXG5cdHZhciBpbnRQb2ludCA9IE1hdGguZmxvb3IoIHAgKTtcblx0dmFyIHdlaWdodCA9IHAgLSBpbnRQb2ludDtcblxuXHR2YXIgcDAgPSBwb2ludHNbIGludFBvaW50ID09PSAwID8gaW50UG9pbnQgOiBpbnRQb2ludCAtIDEgXTtcblx0dmFyIHAxID0gcG9pbnRzWyBpbnRQb2ludCBdO1xuXHR2YXIgcDIgPSBwb2ludHNbIGludFBvaW50ID4gcG9pbnRzLmxlbmd0aCAtIDIgPyBwb2ludHMubGVuZ3RoIC0gMSA6IGludFBvaW50ICsgMSBdO1xuXHR2YXIgcDMgPSBwb2ludHNbIGludFBvaW50ID4gcG9pbnRzLmxlbmd0aCAtIDMgPyBwb2ludHMubGVuZ3RoIC0gMSA6IGludFBvaW50ICsgMiBdO1xuXG5cdHBvaW50LnNldChcblx0XHRDYXRtdWxsUm9tKCB3ZWlnaHQsIHAwLngsIHAxLngsIHAyLngsIHAzLnggKSxcblx0XHRDYXRtdWxsUm9tKCB3ZWlnaHQsIHAwLnksIHAxLnksIHAyLnksIHAzLnkgKVxuXHQpO1xuXG5cdHJldHVybiBwb2ludDtcblxufTtcblxuU3BsaW5lQ3VydmUucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLnBvaW50cyA9IFtdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgbCA9IHNvdXJjZS5wb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdHZhciBwb2ludCA9IHNvdXJjZS5wb2ludHNbIGkgXTtcblxuXHRcdHRoaXMucG9pbnRzLnB1c2goIHBvaW50LmNsb25lKCkgKTtcblxuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cblNwbGluZUN1cnZlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRkYXRhLnBvaW50cyA9IFtdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHR2YXIgcG9pbnQgPSB0aGlzLnBvaW50c1sgaSBdO1xuXHRcdGRhdGEucG9pbnRzLnB1c2goIHBvaW50LnRvQXJyYXkoKSApO1xuXG5cdH1cblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuU3BsaW5lQ3VydmUucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy5wb2ludHMgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLnBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0dmFyIHBvaW50ID0ganNvbi5wb2ludHNbIGkgXTtcblx0XHR0aGlzLnBvaW50cy5wdXNoKCBuZXcgVmVjdG9yMigpLmZyb21BcnJheSggcG9pbnQgKSApO1xuXG5cdH1cblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuXG5cbnZhciBDdXJ2ZXMgPSBPYmplY3QuZnJlZXplKHtcblx0QXJjQ3VydmU6IEFyY0N1cnZlLFxuXHRDYXRtdWxsUm9tQ3VydmUzOiBDYXRtdWxsUm9tQ3VydmUzLFxuXHRDdWJpY0JlemllckN1cnZlOiBDdWJpY0JlemllckN1cnZlLFxuXHRDdWJpY0JlemllckN1cnZlMzogQ3ViaWNCZXppZXJDdXJ2ZTMsXG5cdEVsbGlwc2VDdXJ2ZTogRWxsaXBzZUN1cnZlLFxuXHRMaW5lQ3VydmU6IExpbmVDdXJ2ZSxcblx0TGluZUN1cnZlMzogTGluZUN1cnZlMyxcblx0UXVhZHJhdGljQmV6aWVyQ3VydmU6IFF1YWRyYXRpY0JlemllckN1cnZlLFxuXHRRdWFkcmF0aWNCZXppZXJDdXJ2ZTM6IFF1YWRyYXRpY0JlemllckN1cnZlMyxcblx0U3BsaW5lQ3VydmU6IFNwbGluZUN1cnZlXG59KTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKlxuICoqL1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqXHRDdXJ2ZWQgUGF0aCAtIGEgY3VydmUgcGF0aCBpcyBzaW1wbHkgYSBhcnJheSBvZiBjb25uZWN0ZWRcbiAqICBjdXJ2ZXMsIGJ1dCByZXRhaW5zIHRoZSBhcGkgb2YgYSBjdXJ2ZVxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5mdW5jdGlvbiBDdXJ2ZVBhdGgoKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDdXJ2ZVBhdGgnO1xuXG5cdHRoaXMuY3VydmVzID0gW107XG5cdHRoaXMuYXV0b0Nsb3NlID0gZmFsc2U7IC8vIEF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBwYXRoXG5cbn1cblxuQ3VydmVQYXRoLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEN1cnZlUGF0aCxcblxuXHRhZGQ6IGZ1bmN0aW9uICggY3VydmUgKSB7XG5cblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xuXG5cdH0sXG5cblx0Y2xvc2VQYXRoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBBZGQgYSBsaW5lIGN1cnZlIGlmIHN0YXJ0IGFuZCBlbmQgb2YgbGluZXMgYXJlIG5vdCBjb25uZWN0ZWRcblx0XHR2YXIgc3RhcnRQb2ludCA9IHRoaXMuY3VydmVzWyAwIF0uZ2V0UG9pbnQoIDAgKTtcblx0XHR2YXIgZW5kUG9pbnQgPSB0aGlzLmN1cnZlc1sgdGhpcy5jdXJ2ZXMubGVuZ3RoIC0gMSBdLmdldFBvaW50KCAxICk7XG5cblx0XHRpZiAoICEgc3RhcnRQb2ludC5lcXVhbHMoIGVuZFBvaW50ICkgKSB7XG5cblx0XHRcdHRoaXMuY3VydmVzLnB1c2goIG5ldyBMaW5lQ3VydmUoIGVuZFBvaW50LCBzdGFydFBvaW50ICkgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdC8vIFRvIGdldCBhY2N1cmF0ZSBwb2ludCB3aXRoIHJlZmVyZW5jZSB0b1xuXHQvLyBlbnRpcmUgcGF0aCBkaXN0YW5jZSBhdCB0aW1lIHQsXG5cdC8vIGZvbGxvd2luZyBoYXMgdG8gYmUgZG9uZTpcblxuXHQvLyAxLiBMZW5ndGggb2YgZWFjaCBzdWIgcGF0aCBoYXZlIHRvIGJlIGtub3duXG5cdC8vIDIuIExvY2F0ZSBhbmQgaWRlbnRpZnkgdHlwZSBvZiBjdXJ2ZVxuXHQvLyAzLiBHZXQgdCBmb3IgdGhlIGN1cnZlXG5cdC8vIDQuIFJldHVybiBjdXJ2ZS5nZXRQb2ludEF0KHQnKVxuXG5cdGdldFBvaW50OiBmdW5jdGlvbiAoIHQgKSB7XG5cblx0XHR2YXIgZCA9IHQgKiB0aGlzLmdldExlbmd0aCgpO1xuXHRcdHZhciBjdXJ2ZUxlbmd0aHMgPSB0aGlzLmdldEN1cnZlTGVuZ3RocygpO1xuXHRcdHZhciBpID0gMDtcblxuXHRcdC8vIFRvIHRoaW5rIGFib3V0IGJvdW5kYXJpZXMgcG9pbnRzLlxuXG5cdFx0d2hpbGUgKCBpIDwgY3VydmVMZW5ndGhzLmxlbmd0aCApIHtcblxuXHRcdFx0aWYgKCBjdXJ2ZUxlbmd0aHNbIGkgXSA+PSBkICkge1xuXG5cdFx0XHRcdHZhciBkaWZmID0gY3VydmVMZW5ndGhzWyBpIF0gLSBkO1xuXHRcdFx0XHR2YXIgY3VydmUgPSB0aGlzLmN1cnZlc1sgaSBdO1xuXG5cdFx0XHRcdHZhciBzZWdtZW50TGVuZ3RoID0gY3VydmUuZ2V0TGVuZ3RoKCk7XG5cdFx0XHRcdHZhciB1ID0gc2VnbWVudExlbmd0aCA9PT0gMCA/IDAgOiAxIC0gZGlmZiAvIHNlZ21lbnRMZW5ndGg7XG5cblx0XHRcdFx0cmV0dXJuIGN1cnZlLmdldFBvaW50QXQoIHUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpICsrO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cblx0XHQvLyBsb29wIHdoZXJlIHN1bSAhPSAwLCBzdW0gPiBkICwgc3VtKzEgPGRcblxuXHR9LFxuXG5cdC8vIFdlIGNhbm5vdCB1c2UgdGhlIGRlZmF1bHQgVEhSRUUuQ3VydmUgZ2V0UG9pbnQoKSB3aXRoIGdldExlbmd0aCgpIGJlY2F1c2UgaW5cblx0Ly8gVEhSRUUuQ3VydmUsIGdldExlbmd0aCgpIGRlcGVuZHMgb24gZ2V0UG9pbnQoKSBidXQgaW4gVEhSRUUuQ3VydmVQYXRoXG5cdC8vIGdldFBvaW50KCkgZGVwZW5kcyBvbiBnZXRMZW5ndGhcblxuXHRnZXRMZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBsZW5zID0gdGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtcblx0XHRyZXR1cm4gbGVuc1sgbGVucy5sZW5ndGggLSAxIF07XG5cblx0fSxcblxuXHQvLyBjYWNoZUxlbmd0aHMgbXVzdCBiZSByZWNhbGN1bGF0ZWQuXG5cdHVwZGF0ZUFyY0xlbmd0aHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXHRcdHRoaXMuY2FjaGVMZW5ndGhzID0gbnVsbDtcblx0XHR0aGlzLmdldEN1cnZlTGVuZ3RocygpO1xuXG5cdH0sXG5cblx0Ly8gQ29tcHV0ZSBsZW5ndGhzIGFuZCBjYWNoZSB0aGVtXG5cdC8vIFdlIGNhbm5vdCBvdmVyd3JpdGUgZ2V0TGVuZ3RocygpIGJlY2F1c2UgVXRvVCBtYXBwaW5nIHVzZXMgaXQuXG5cblx0Z2V0Q3VydmVMZW5ndGhzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBXZSB1c2UgY2FjaGUgdmFsdWVzIGlmIGN1cnZlcyBhbmQgY2FjaGUgYXJyYXkgYXJlIHNhbWUgbGVuZ3RoXG5cblx0XHRpZiAoIHRoaXMuY2FjaGVMZW5ndGhzICYmIHRoaXMuY2FjaGVMZW5ndGhzLmxlbmd0aCA9PT0gdGhpcy5jdXJ2ZXMubGVuZ3RoICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM7XG5cblx0XHR9XG5cblx0XHQvLyBHZXQgbGVuZ3RoIG9mIHN1Yi1jdXJ2ZVxuXHRcdC8vIFB1c2ggc3VtcyBpbnRvIGNhY2hlZCBhcnJheVxuXG5cdFx0dmFyIGxlbmd0aHMgPSBbXSwgc3VtcyA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmN1cnZlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRzdW1zICs9IHRoaXMuY3VydmVzWyBpIF0uZ2V0TGVuZ3RoKCk7XG5cdFx0XHRsZW5ndGhzLnB1c2goIHN1bXMgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY2FjaGVMZW5ndGhzID0gbGVuZ3RocztcblxuXHRcdHJldHVybiBsZW5ndGhzO1xuXG5cdH0sXG5cblx0Z2V0U3BhY2VkUG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSA0MDtcblxuXHRcdHZhciBwb2ludHMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8PSBkaXZpc2lvbnM7IGkgKysgKSB7XG5cblx0XHRcdHBvaW50cy5wdXNoKCB0aGlzLmdldFBvaW50KCBpIC8gZGl2aXNpb25zICkgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5hdXRvQ2xvc2UgKSB7XG5cblx0XHRcdHBvaW50cy5wdXNoKCBwb2ludHNbIDAgXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvaW50cztcblxuXHR9LFxuXG5cdGdldFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRkaXZpc2lvbnMgPSBkaXZpc2lvbnMgfHwgMTI7XG5cblx0XHR2YXIgcG9pbnRzID0gW10sIGxhc3Q7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGN1cnZlcyA9IHRoaXMuY3VydmVzOyBpIDwgY3VydmVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGN1cnZlID0gY3VydmVzWyBpIF07XG5cdFx0XHR2YXIgcmVzb2x1dGlvbiA9ICggY3VydmUgJiYgY3VydmUuaXNFbGxpcHNlQ3VydmUgKSA/IGRpdmlzaW9ucyAqIDJcblx0XHRcdFx0OiAoIGN1cnZlICYmIGN1cnZlLmlzTGluZUN1cnZlICkgPyAxXG5cdFx0XHRcdFx0OiAoIGN1cnZlICYmIGN1cnZlLmlzU3BsaW5lQ3VydmUgKSA/IGRpdmlzaW9ucyAqIGN1cnZlLnBvaW50cy5sZW5ndGhcblx0XHRcdFx0XHRcdDogZGl2aXNpb25zO1xuXG5cdFx0XHR2YXIgcHRzID0gY3VydmUuZ2V0UG9pbnRzKCByZXNvbHV0aW9uICk7XG5cblx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IHB0cy5sZW5ndGg7IGogKysgKSB7XG5cblx0XHRcdFx0dmFyIHBvaW50ID0gcHRzWyBqIF07XG5cblx0XHRcdFx0aWYgKCBsYXN0ICYmIGxhc3QuZXF1YWxzKCBwb2ludCApICkgY29udGludWU7IC8vIGVuc3VyZXMgbm8gY29uc2VjdXRpdmUgcG9pbnRzIGFyZSBkdXBsaWNhdGVzXG5cblx0XHRcdFx0cG9pbnRzLnB1c2goIHBvaW50ICk7XG5cdFx0XHRcdGxhc3QgPSBwb2ludDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmF1dG9DbG9zZSAmJiBwb2ludHMubGVuZ3RoID4gMSAmJiAhIHBvaW50c1sgcG9pbnRzLmxlbmd0aCAtIDEgXS5lcXVhbHMoIHBvaW50c1sgMCBdICkgKSB7XG5cblx0XHRcdHBvaW50cy5wdXNoKCBwb2ludHNbIDAgXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvaW50cztcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0Q3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmN1cnZlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gc291cmNlLmN1cnZlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgY3VydmUgPSBzb3VyY2UuY3VydmVzWyBpIF07XG5cblx0XHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuYXV0b0Nsb3NlID0gc291cmNlLmF1dG9DbG9zZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdFx0ZGF0YS5hdXRvQ2xvc2UgPSB0aGlzLmF1dG9DbG9zZTtcblx0XHRkYXRhLmN1cnZlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5jdXJ2ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGN1cnZlID0gdGhpcy5jdXJ2ZXNbIGkgXTtcblx0XHRcdGRhdGEuY3VydmVzLnB1c2goIGN1cnZlLnRvSlNPTigpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9LFxuXG5cdGZyb21KU09OOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHRDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApO1xuXG5cdFx0dGhpcy5hdXRvQ2xvc2UgPSBqc29uLmF1dG9DbG9zZTtcblx0XHR0aGlzLmN1cnZlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5jdXJ2ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGN1cnZlID0ganNvbi5jdXJ2ZXNbIGkgXTtcblx0XHRcdHRoaXMuY3VydmVzLnB1c2goIG5ldyBDdXJ2ZXNbIGN1cnZlLnR5cGUgXSgpLmZyb21KU09OKCBjdXJ2ZSApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBDcmVhdGVzIGZyZWUgZm9ybSAyZCBwYXRoIHVzaW5nIHNlcmllcyBvZiBwb2ludHMsIGxpbmVzIG9yIGN1cnZlcy5cbiAqKi9cblxuZnVuY3Rpb24gUGF0aCggcG9pbnRzICkge1xuXG5cdEN1cnZlUGF0aC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BhdGgnO1xuXG5cdHRoaXMuY3VycmVudFBvaW50ID0gbmV3IFZlY3RvcjIoKTtcblxuXHRpZiAoIHBvaW50cyApIHtcblxuXHRcdHRoaXMuc2V0RnJvbVBvaW50cyggcG9pbnRzICk7XG5cblx0fVxuXG59XG5cblBhdGgucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQ3VydmVQYXRoLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFBhdGgsXG5cblx0c2V0RnJvbVBvaW50czogZnVuY3Rpb24gKCBwb2ludHMgKSB7XG5cblx0XHR0aGlzLm1vdmVUbyggcG9pbnRzWyAwIF0ueCwgcG9pbnRzWyAwIF0ueSApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMubGluZVRvKCBwb2ludHNbIGkgXS54LCBwb2ludHNbIGkgXS55ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRtb3ZlVG86IGZ1bmN0aW9uICggeCwgeSApIHtcblxuXHRcdHRoaXMuY3VycmVudFBvaW50LnNldCggeCwgeSApOyAvLyBUT0RPIGNvbnNpZGVyIHJlZmVyZW5jaW5nIHZlY3RvcnMgaW5zdGVhZCBvZiBjb3B5aW5nP1xuXG5cdH0sXG5cblx0bGluZVRvOiBmdW5jdGlvbiAoIHgsIHkgKSB7XG5cblx0XHR2YXIgY3VydmUgPSBuZXcgTGluZUN1cnZlKCB0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLCBuZXcgVmVjdG9yMiggeCwgeSApICk7XG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcblxuXHRcdHRoaXMuY3VycmVudFBvaW50LnNldCggeCwgeSApO1xuXG5cdH0sXG5cblx0cXVhZHJhdGljQ3VydmVUbzogZnVuY3Rpb24gKCBhQ1B4LCBhQ1B5LCBhWCwgYVkgKSB7XG5cblx0XHR2YXIgY3VydmUgPSBuZXcgUXVhZHJhdGljQmV6aWVyQ3VydmUoXG5cdFx0XHR0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGFDUHgsIGFDUHkgKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBhWCwgYVkgKVxuXHRcdCk7XG5cblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuc2V0KCBhWCwgYVkgKTtcblxuXHR9LFxuXG5cdGJlemllckN1cnZlVG86IGZ1bmN0aW9uICggYUNQMXgsIGFDUDF5LCBhQ1AyeCwgYUNQMnksIGFYLCBhWSApIHtcblxuXHRcdHZhciBjdXJ2ZSA9IG5ldyBDdWJpY0JlemllckN1cnZlKFxuXHRcdFx0dGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBhQ1AxeCwgYUNQMXkgKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBhQ1AyeCwgYUNQMnkgKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBhWCwgYVkgKVxuXHRcdCk7XG5cblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuc2V0KCBhWCwgYVkgKTtcblxuXHR9LFxuXG5cdHNwbGluZVRocnU6IGZ1bmN0aW9uICggcHRzIC8qQXJyYXkgb2YgVmVjdG9yKi8gKSB7XG5cblx0XHR2YXIgbnB0cyA9IFsgdGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSBdLmNvbmNhdCggcHRzICk7XG5cblx0XHR2YXIgY3VydmUgPSBuZXcgU3BsaW5lQ3VydmUoIG5wdHMgKTtcblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuY29weSggcHRzWyBwdHMubGVuZ3RoIC0gMSBdICk7XG5cblx0fSxcblxuXHRhcmM6IGZ1bmN0aW9uICggYVgsIGFZLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICkge1xuXG5cdFx0dmFyIHgwID0gdGhpcy5jdXJyZW50UG9pbnQueDtcblx0XHR2YXIgeTAgPSB0aGlzLmN1cnJlbnRQb2ludC55O1xuXG5cdFx0dGhpcy5hYnNhcmMoIGFYICsgeDAsIGFZICsgeTAsIGFSYWRpdXMsXG5cdFx0XHRhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICk7XG5cblx0fSxcblxuXHRhYnNhcmM6IGZ1bmN0aW9uICggYVgsIGFZLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICkge1xuXG5cdFx0dGhpcy5hYnNlbGxpcHNlKCBhWCwgYVksIGFSYWRpdXMsIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKTtcblxuXHR9LFxuXG5cdGVsbGlwc2U6IGZ1bmN0aW9uICggYVgsIGFZLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKSB7XG5cblx0XHR2YXIgeDAgPSB0aGlzLmN1cnJlbnRQb2ludC54O1xuXHRcdHZhciB5MCA9IHRoaXMuY3VycmVudFBvaW50Lnk7XG5cblx0XHR0aGlzLmFic2VsbGlwc2UoIGFYICsgeDAsIGFZICsgeTAsIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApO1xuXG5cdH0sXG5cblx0YWJzZWxsaXBzZTogZnVuY3Rpb24gKCBhWCwgYVksIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApIHtcblxuXHRcdHZhciBjdXJ2ZSA9IG5ldyBFbGxpcHNlQ3VydmUoIGFYLCBhWSwgeFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uICk7XG5cblx0XHRpZiAoIHRoaXMuY3VydmVzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdC8vIGlmIGEgcHJldmlvdXMgY3VydmUgaXMgcHJlc2VudCwgYXR0ZW1wdCB0byBqb2luXG5cdFx0XHR2YXIgZmlyc3RQb2ludCA9IGN1cnZlLmdldFBvaW50KCAwICk7XG5cblx0XHRcdGlmICggISBmaXJzdFBvaW50LmVxdWFscyggdGhpcy5jdXJyZW50UG9pbnQgKSApIHtcblxuXHRcdFx0XHR0aGlzLmxpbmVUbyggZmlyc3RQb2ludC54LCBmaXJzdFBvaW50LnkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcblxuXHRcdHZhciBsYXN0UG9pbnQgPSBjdXJ2ZS5nZXRQb2ludCggMSApO1xuXHRcdHRoaXMuY3VycmVudFBvaW50LmNvcHkoIGxhc3RQb2ludCApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRDdXJ2ZVBhdGgucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmN1cnJlbnRQb2ludC5jb3B5KCBzb3VyY2UuY3VycmVudFBvaW50ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGRhdGEgPSBDdXJ2ZVBhdGgucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0XHRkYXRhLmN1cnJlbnRQb2ludCA9IHRoaXMuY3VycmVudFBvaW50LnRvQXJyYXkoKTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0ZnJvbUpTT046IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdEN1cnZlUGF0aC5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApO1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuZnJvbUFycmF5KCBqc29uLmN1cnJlbnRQb2ludCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICogRGVmaW5lcyBhIDJkIHNoYXBlIHBsYW5lIHVzaW5nIHBhdGhzLlxuICoqL1xuXG4vLyBTVEVQIDEgQ3JlYXRlIGEgcGF0aC5cbi8vIFNURVAgMiBUdXJuIHBhdGggaW50byBzaGFwZS5cbi8vIFNURVAgMyBFeHRydWRlR2VvbWV0cnkgdGFrZXMgaW4gU2hhcGUvU2hhcGVzXG4vLyBTVEVQIDNhIC0gRXh0cmFjdCBwb2ludHMgZnJvbSBlYWNoIHNoYXBlLCB0dXJuIHRvIHZlcnRpY2VzXG4vLyBTVEVQIDNiIC0gVHJpYW5ndWxhdGUgZWFjaCBzaGFwZSwgYWRkIGZhY2VzLlxuXG5mdW5jdGlvbiBTaGFwZSggcG9pbnRzICkge1xuXG5cdFBhdGguY2FsbCggdGhpcywgcG9pbnRzICk7XG5cblx0dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0dGhpcy50eXBlID0gJ1NoYXBlJztcblxuXHR0aGlzLmhvbGVzID0gW107XG5cbn1cblxuU2hhcGUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggUGF0aC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTaGFwZSxcblxuXHRnZXRQb2ludHNIb2xlczogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHR2YXIgaG9sZXNQdHMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuaG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0aG9sZXNQdHNbIGkgXSA9IHRoaXMuaG9sZXNbIGkgXS5nZXRQb2ludHMoIGRpdmlzaW9ucyApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGhvbGVzUHRzO1xuXG5cdH0sXG5cblx0Ly8gZ2V0IHBvaW50cyBvZiBzaGFwZSBhbmQgaG9sZXMgKGtleXBvaW50cyBiYXNlZCBvbiBzZWdtZW50cyBwYXJhbWV0ZXIpXG5cblx0ZXh0cmFjdFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRyZXR1cm4ge1xuXG5cdFx0XHRzaGFwZTogdGhpcy5nZXRQb2ludHMoIGRpdmlzaW9ucyApLFxuXHRcdFx0aG9sZXM6IHRoaXMuZ2V0UG9pbnRzSG9sZXMoIGRpdmlzaW9ucyApXG5cblx0XHR9O1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRQYXRoLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5ob2xlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gc291cmNlLmhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBob2xlID0gc291cmNlLmhvbGVzWyBpIF07XG5cblx0XHRcdHRoaXMuaG9sZXMucHVzaCggaG9sZS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGRhdGEgPSBQYXRoLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdFx0ZGF0YS51dWlkID0gdGhpcy51dWlkO1xuXHRcdGRhdGEuaG9sZXMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuaG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGhvbGUgPSB0aGlzLmhvbGVzWyBpIF07XG5cdFx0XHRkYXRhLmhvbGVzLnB1c2goIGhvbGUudG9KU09OKCkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0ZnJvbUpTT046IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdFBhdGgucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHRcdHRoaXMudXVpZCA9IGpzb24udXVpZDtcblx0XHR0aGlzLmhvbGVzID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLmhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBob2xlID0ganNvbi5ob2xlc1sgaSBdO1xuXHRcdFx0dGhpcy5ob2xlcy5wdXNoKCBuZXcgUGF0aCgpLmZyb21KU09OKCBob2xlICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIExpZ2h0KCBjb2xvciwgaW50ZW5zaXR5ICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGlnaHQnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIGNvbG9yICk7XG5cdHRoaXMuaW50ZW5zaXR5ID0gaW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgPyBpbnRlbnNpdHkgOiAxO1xuXG5cdHRoaXMucmVjZWl2ZVNoYWRvdyA9IHVuZGVmaW5lZDtcblxufVxuXG5MaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBMaWdodCxcblxuXHRpc0xpZ2h0OiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXHRcdHRoaXMuaW50ZW5zaXR5ID0gc291cmNlLmludGVuc2l0eTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IE9iamVjdDNELnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0ZGF0YS5vYmplY3QuY29sb3IgPSB0aGlzLmNvbG9yLmdldEhleCgpO1xuXHRcdGRhdGEub2JqZWN0LmludGVuc2l0eSA9IHRoaXMuaW50ZW5zaXR5O1xuXG5cdFx0aWYgKCB0aGlzLmdyb3VuZENvbG9yICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5ncm91bmRDb2xvciA9IHRoaXMuZ3JvdW5kQ29sb3IuZ2V0SGV4KCk7XG5cblx0XHRpZiAoIHRoaXMuZGlzdGFuY2UgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LmRpc3RhbmNlID0gdGhpcy5kaXN0YW5jZTtcblx0XHRpZiAoIHRoaXMuYW5nbGUgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LmFuZ2xlID0gdGhpcy5hbmdsZTtcblx0XHRpZiAoIHRoaXMuZGVjYXkgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LmRlY2F5ID0gdGhpcy5kZWNheTtcblx0XHRpZiAoIHRoaXMucGVudW1icmEgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LnBlbnVtYnJhID0gdGhpcy5wZW51bWJyYTtcblxuXHRcdGlmICggdGhpcy5zaGFkb3cgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LnNoYWRvdyA9IHRoaXMuc2hhZG93LnRvSlNPTigpO1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBIZW1pc3BoZXJlTGlnaHQoIHNreUNvbG9yLCBncm91bmRDb2xvciwgaW50ZW5zaXR5ICkge1xuXG5cdExpZ2h0LmNhbGwoIHRoaXMsIHNreUNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHR0aGlzLnR5cGUgPSAnSGVtaXNwaGVyZUxpZ2h0JztcblxuXHR0aGlzLmNhc3RTaGFkb3cgPSB1bmRlZmluZWQ7XG5cblx0dGhpcy5wb3NpdGlvbi5jb3B5KCBPYmplY3QzRC5EZWZhdWx0VXAgKTtcblx0dGhpcy51cGRhdGVNYXRyaXgoKTtcblxuXHR0aGlzLmdyb3VuZENvbG9yID0gbmV3IENvbG9yKCBncm91bmRDb2xvciApO1xuXG59XG5cbkhlbWlzcGhlcmVMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBIZW1pc3BoZXJlTGlnaHQsXG5cblx0aXNIZW1pc3BoZXJlTGlnaHQ6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRMaWdodC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuZ3JvdW5kQ29sb3IuY29weSggc291cmNlLmdyb3VuZENvbG9yICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIExpZ2h0U2hhZG93KCBjYW1lcmEgKSB7XG5cblx0dGhpcy5jYW1lcmEgPSBjYW1lcmE7XG5cblx0dGhpcy5iaWFzID0gMDtcblx0dGhpcy5yYWRpdXMgPSAxO1xuXG5cdHRoaXMubWFwU2l6ZSA9IG5ldyBWZWN0b3IyKCA1MTIsIDUxMiApO1xuXG5cdHRoaXMubWFwID0gbnVsbDtcblx0dGhpcy5tYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIExpZ2h0U2hhZG93LnByb3RvdHlwZSwge1xuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5jYW1lcmEgPSBzb3VyY2UuY2FtZXJhLmNsb25lKCk7XG5cblx0XHR0aGlzLmJpYXMgPSBzb3VyY2UuYmlhcztcblx0XHR0aGlzLnJhZGl1cyA9IHNvdXJjZS5yYWRpdXM7XG5cblx0XHR0aGlzLm1hcFNpemUuY29weSggc291cmNlLm1hcFNpemUgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9iamVjdCA9IHt9O1xuXG5cdFx0aWYgKCB0aGlzLmJpYXMgIT09IDAgKSBvYmplY3QuYmlhcyA9IHRoaXMuYmlhcztcblx0XHRpZiAoIHRoaXMucmFkaXVzICE9PSAxICkgb2JqZWN0LnJhZGl1cyA9IHRoaXMucmFkaXVzO1xuXHRcdGlmICggdGhpcy5tYXBTaXplLnggIT09IDUxMiB8fCB0aGlzLm1hcFNpemUueSAhPT0gNTEyICkgb2JqZWN0Lm1hcFNpemUgPSB0aGlzLm1hcFNpemUudG9BcnJheSgpO1xuXG5cdFx0b2JqZWN0LmNhbWVyYSA9IHRoaXMuY2FtZXJhLnRvSlNPTiggZmFsc2UgKS5vYmplY3Q7XG5cdFx0ZGVsZXRlIG9iamVjdC5jYW1lcmEubWF0cml4O1xuXG5cdFx0cmV0dXJuIG9iamVjdDtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFNwb3RMaWdodFNoYWRvdygpIHtcblxuXHRMaWdodFNoYWRvdy5jYWxsKCB0aGlzLCBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIDUwLCAxLCAwLjUsIDUwMCApICk7XG5cbn1cblxuU3BvdExpZ2h0U2hhZG93LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0U2hhZG93LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFNwb3RMaWdodFNoYWRvdyxcblxuXHRpc1Nwb3RMaWdodFNoYWRvdzogdHJ1ZSxcblxuXHR1cGRhdGU6IGZ1bmN0aW9uICggbGlnaHQgKSB7XG5cblx0XHR2YXIgY2FtZXJhID0gdGhpcy5jYW1lcmE7XG5cblx0XHR2YXIgZm92ID0gX01hdGguUkFEMkRFRyAqIDIgKiBsaWdodC5hbmdsZTtcblx0XHR2YXIgYXNwZWN0ID0gdGhpcy5tYXBTaXplLndpZHRoIC8gdGhpcy5tYXBTaXplLmhlaWdodDtcblx0XHR2YXIgZmFyID0gbGlnaHQuZGlzdGFuY2UgfHwgY2FtZXJhLmZhcjtcblxuXHRcdGlmICggZm92ICE9PSBjYW1lcmEuZm92IHx8IGFzcGVjdCAhPT0gY2FtZXJhLmFzcGVjdCB8fCBmYXIgIT09IGNhbWVyYS5mYXIgKSB7XG5cblx0XHRcdGNhbWVyYS5mb3YgPSBmb3Y7XG5cdFx0XHRjYW1lcmEuYXNwZWN0ID0gYXNwZWN0O1xuXHRcdFx0Y2FtZXJhLmZhciA9IGZhcjtcblx0XHRcdGNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBTcG90TGlnaHQoIGNvbG9yLCBpbnRlbnNpdHksIGRpc3RhbmNlLCBhbmdsZSwgcGVudW1icmEsIGRlY2F5ICkge1xuXG5cdExpZ2h0LmNhbGwoIHRoaXMsIGNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHR0aGlzLnR5cGUgPSAnU3BvdExpZ2h0JztcblxuXHR0aGlzLnBvc2l0aW9uLmNvcHkoIE9iamVjdDNELkRlZmF1bHRVcCApO1xuXHR0aGlzLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdHRoaXMudGFyZ2V0ID0gbmV3IE9iamVjdDNEKCk7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAncG93ZXInLCB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdC8vIGludGVuc2l0eSA9IHBvd2VyIHBlciBzb2xpZCBhbmdsZS5cblx0XHRcdC8vIHJlZjogZXF1YXRpb24gKDE3KSBmcm9tIGh0dHBzOi8vc2VibGFnYXJkZS5maWxlcy53b3JkcHJlc3MuY29tLzIwMTUvMDcvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyX3YzMi5wZGZcblx0XHRcdHJldHVybiB0aGlzLmludGVuc2l0eSAqIE1hdGguUEk7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCBwb3dlciApIHtcblxuXHRcdFx0Ly8gaW50ZW5zaXR5ID0gcG93ZXIgcGVyIHNvbGlkIGFuZ2xlLlxuXHRcdFx0Ly8gcmVmOiBlcXVhdGlvbiAoMTcpIGZyb20gaHR0cHM6Ly9zZWJsYWdhcmRlLmZpbGVzLndvcmRwcmVzcy5jb20vMjAxNS8wNy9jb3Vyc2Vfbm90ZXNfbW92aW5nX2Zyb3N0Yml0ZV90b19wYnJfdjMyLnBkZlxuXHRcdFx0dGhpcy5pbnRlbnNpdHkgPSBwb3dlciAvIE1hdGguUEk7XG5cblx0XHR9XG5cdH0gKTtcblxuXHR0aGlzLmRpc3RhbmNlID0gKCBkaXN0YW5jZSAhPT0gdW5kZWZpbmVkICkgPyBkaXN0YW5jZSA6IDA7XG5cdHRoaXMuYW5nbGUgPSAoIGFuZ2xlICE9PSB1bmRlZmluZWQgKSA/IGFuZ2xlIDogTWF0aC5QSSAvIDM7XG5cdHRoaXMucGVudW1icmEgPSAoIHBlbnVtYnJhICE9PSB1bmRlZmluZWQgKSA/IHBlbnVtYnJhIDogMDtcblx0dGhpcy5kZWNheSA9ICggZGVjYXkgIT09IHVuZGVmaW5lZCApID8gZGVjYXkgOiAxO1x0Ly8gZm9yIHBoeXNpY2FsbHkgY29ycmVjdCBsaWdodHMsIHNob3VsZCBiZSAyLlxuXG5cdHRoaXMuc2hhZG93ID0gbmV3IFNwb3RMaWdodFNoYWRvdygpO1xuXG59XG5cblNwb3RMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTcG90TGlnaHQsXG5cblx0aXNTcG90TGlnaHQ6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRMaWdodC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuZGlzdGFuY2UgPSBzb3VyY2UuZGlzdGFuY2U7XG5cdFx0dGhpcy5hbmdsZSA9IHNvdXJjZS5hbmdsZTtcblx0XHR0aGlzLnBlbnVtYnJhID0gc291cmNlLnBlbnVtYnJhO1xuXHRcdHRoaXMuZGVjYXkgPSBzb3VyY2UuZGVjYXk7XG5cblx0XHR0aGlzLnRhcmdldCA9IHNvdXJjZS50YXJnZXQuY2xvbmUoKTtcblxuXHRcdHRoaXMuc2hhZG93ID0gc291cmNlLnNoYWRvdy5jbG9uZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5cbmZ1bmN0aW9uIFBvaW50TGlnaHQoIGNvbG9yLCBpbnRlbnNpdHksIGRpc3RhbmNlLCBkZWNheSApIHtcblxuXHRMaWdodC5jYWxsKCB0aGlzLCBjb2xvciwgaW50ZW5zaXR5ICk7XG5cblx0dGhpcy50eXBlID0gJ1BvaW50TGlnaHQnO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ3Bvd2VyJywge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHQvLyBpbnRlbnNpdHkgPSBwb3dlciBwZXIgc29saWQgYW5nbGUuXG5cdFx0XHQvLyByZWY6IGVxdWF0aW9uICgxNSkgZnJvbSBodHRwczovL3NlYmxhZ2FyZGUuZmlsZXMud29yZHByZXNzLmNvbS8yMDE1LzA3L2NvdXJzZV9ub3Rlc19tb3ZpbmdfZnJvc3RiaXRlX3RvX3Bicl92MzIucGRmXG5cdFx0XHRyZXR1cm4gdGhpcy5pbnRlbnNpdHkgKiA0ICogTWF0aC5QSTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHBvd2VyICkge1xuXG5cdFx0XHQvLyBpbnRlbnNpdHkgPSBwb3dlciBwZXIgc29saWQgYW5nbGUuXG5cdFx0XHQvLyByZWY6IGVxdWF0aW9uICgxNSkgZnJvbSBodHRwczovL3NlYmxhZ2FyZGUuZmlsZXMud29yZHByZXNzLmNvbS8yMDE1LzA3L2NvdXJzZV9ub3Rlc19tb3ZpbmdfZnJvc3RiaXRlX3RvX3Bicl92MzIucGRmXG5cdFx0XHR0aGlzLmludGVuc2l0eSA9IHBvd2VyIC8gKCA0ICogTWF0aC5QSSApO1xuXG5cdFx0fVxuXHR9ICk7XG5cblx0dGhpcy5kaXN0YW5jZSA9ICggZGlzdGFuY2UgIT09IHVuZGVmaW5lZCApID8gZGlzdGFuY2UgOiAwO1xuXHR0aGlzLmRlY2F5ID0gKCBkZWNheSAhPT0gdW5kZWZpbmVkICkgPyBkZWNheSA6IDE7XHQvLyBmb3IgcGh5c2ljYWxseSBjb3JyZWN0IGxpZ2h0cywgc2hvdWxkIGJlIDIuXG5cblx0dGhpcy5zaGFkb3cgPSBuZXcgTGlnaHRTaGFkb3coIG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggOTAsIDEsIDAuNSwgNTAwICkgKTtcblxufVxuXG5Qb2ludExpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFBvaW50TGlnaHQsXG5cblx0aXNQb2ludExpZ2h0OiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0TGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmRpc3RhbmNlID0gc291cmNlLmRpc3RhbmNlO1xuXHRcdHRoaXMuZGVjYXkgPSBzb3VyY2UuZGVjYXk7XG5cblx0XHR0aGlzLnNoYWRvdyA9IHNvdXJjZS5zaGFkb3cuY2xvbmUoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gRGlyZWN0aW9uYWxMaWdodFNoYWRvdyggKSB7XG5cblx0TGlnaHRTaGFkb3cuY2FsbCggdGhpcywgbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSggLSA1LCA1LCA1LCAtIDUsIDAuNSwgNTAwICkgKTtcblxufVxuXG5EaXJlY3Rpb25hbExpZ2h0U2hhZG93LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0U2hhZG93LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IERpcmVjdGlvbmFsTGlnaHRTaGFkb3dcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIERpcmVjdGlvbmFsTGlnaHQoIGNvbG9yLCBpbnRlbnNpdHkgKSB7XG5cblx0TGlnaHQuY2FsbCggdGhpcywgY29sb3IsIGludGVuc2l0eSApO1xuXG5cdHRoaXMudHlwZSA9ICdEaXJlY3Rpb25hbExpZ2h0JztcblxuXHR0aGlzLnBvc2l0aW9uLmNvcHkoIE9iamVjdDNELkRlZmF1bHRVcCApO1xuXHR0aGlzLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdHRoaXMudGFyZ2V0ID0gbmV3IE9iamVjdDNEKCk7XG5cblx0dGhpcy5zaGFkb3cgPSBuZXcgRGlyZWN0aW9uYWxMaWdodFNoYWRvdygpO1xuXG59XG5cbkRpcmVjdGlvbmFsTGlnaHQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHQucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogRGlyZWN0aW9uYWxMaWdodCxcblxuXHRpc0RpcmVjdGlvbmFsTGlnaHQ6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRMaWdodC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMudGFyZ2V0ID0gc291cmNlLnRhcmdldC5jbG9uZSgpO1xuXG5cdFx0dGhpcy5zaGFkb3cgPSBzb3VyY2Uuc2hhZG93LmNsb25lKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEFtYmllbnRMaWdodCggY29sb3IsIGludGVuc2l0eSApIHtcblxuXHRMaWdodC5jYWxsKCB0aGlzLCBjb2xvciwgaW50ZW5zaXR5ICk7XG5cblx0dGhpcy50eXBlID0gJ0FtYmllbnRMaWdodCc7XG5cblx0dGhpcy5jYXN0U2hhZG93ID0gdW5kZWZpbmVkO1xuXG59XG5cbkFtYmllbnRMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBBbWJpZW50TGlnaHQsXG5cblx0aXNBbWJpZW50TGlnaHQ6IHRydWVcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWJlbG5hdGlvbiAvIGh0dHA6Ly9naXRodWIuY29tL2FiZWxuYXRpb25cbiAqL1xuXG5mdW5jdGlvbiBSZWN0QXJlYUxpZ2h0KCBjb2xvciwgaW50ZW5zaXR5LCB3aWR0aCwgaGVpZ2h0ICkge1xuXG5cdExpZ2h0LmNhbGwoIHRoaXMsIGNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHR0aGlzLnR5cGUgPSAnUmVjdEFyZWFMaWdodCc7XG5cblx0dGhpcy53aWR0aCA9ICggd2lkdGggIT09IHVuZGVmaW5lZCApID8gd2lkdGggOiAxMDtcblx0dGhpcy5oZWlnaHQgPSAoIGhlaWdodCAhPT0gdW5kZWZpbmVkICkgPyBoZWlnaHQgOiAxMDtcblxufVxuXG5SZWN0QXJlYUxpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFJlY3RBcmVhTGlnaHQsXG5cblx0aXNSZWN0QXJlYUxpZ2h0OiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0TGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLndpZHRoID0gc291cmNlLndpZHRoO1xuXHRcdHRoaXMuaGVpZ2h0ID0gc291cmNlLmhlaWdodDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IExpZ2h0LnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0ZGF0YS5vYmplY3Qud2lkdGggPSB0aGlzLndpZHRoO1xuXHRcdGRhdGEub2JqZWN0LmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgdGhhdCBpbnRlcnBvbGF0ZXMgU3RyaW5nc1xuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gU3RyaW5nS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcblxuXHRLZXlmcmFtZVRyYWNrLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTtcblxufVxuXG5TdHJpbmdLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogU3RyaW5nS2V5ZnJhbWVUcmFjayxcblxuXHRWYWx1ZVR5cGVOYW1lOiAnc3RyaW5nJyxcblx0VmFsdWVCdWZmZXJUeXBlOiBBcnJheSxcblxuXHREZWZhdWx0SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVEaXNjcmV0ZSxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6IHVuZGVmaW5lZCxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6IHVuZGVmaW5lZFxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgb2YgQm9vbGVhbiBrZXlmcmFtZSB2YWx1ZXMuXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBCb29sZWFuS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcyApIHtcblxuXHRLZXlmcmFtZVRyYWNrLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMgKTtcblxufVxuXG5Cb29sZWFuS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEJvb2xlYW5LZXlmcmFtZVRyYWNrLFxuXG5cdFZhbHVlVHlwZU5hbWU6ICdib29sJyxcblx0VmFsdWVCdWZmZXJUeXBlOiBBcnJheSxcblxuXHREZWZhdWx0SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVEaXNjcmV0ZSxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6IHVuZGVmaW5lZCxcblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOiB1bmRlZmluZWRcblxuXHQvLyBOb3RlOiBBY3R1YWxseSB0aGlzIHRyYWNrIGNvdWxkIGhhdmUgYSBvcHRpbWl6ZWQgLyBjb21wcmVzc2VkXG5cdC8vIHJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIHZhbHVlIGFuZCBhIGN1c3RvbSBpbnRlcnBvbGFudCB0aGF0XG5cdC8vIGNvbXB1dGVzIFwiZmlyc3RWYWx1ZSBeIGlzT2RkKCBpbmRleCApXCIuXG5cbn0gKTtcblxuLyoqXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIG9mIGludGVycG9sYW50cyBvdmVyIHBhcmFtZXRyaWMgc2FtcGxlcy5cbiAqXG4gKiBUaGUgcGFyYW1ldGVyIGRvbWFpbiBpcyBvbmUgZGltZW5zaW9uYWwsIHR5cGljYWxseSB0aGUgdGltZSBvciBhIHBhdGhcbiAqIGFsb25nIGEgY3VydmUgZGVmaW5lZCBieSB0aGUgZGF0YS5cbiAqXG4gKiBUaGUgc2FtcGxlIHZhbHVlcyBjYW4gaGF2ZSBhbnkgZGltZW5zaW9uYWxpdHkgYW5kIGRlcml2ZWQgY2xhc3NlcyBtYXlcbiAqIGFwcGx5IHNwZWNpYWwgaW50ZXJwcmV0YXRpb25zIHRvIHRoZSBkYXRhLlxuICpcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIGludGVydmFsIHNlZWsgaW4gYSBUZW1wbGF0ZSBNZXRob2QsIGRlZmVycmluZ1xuICogdGhlIGFjdHVhbCBpbnRlcnBvbGF0aW9uIHRvIGRlcml2ZWQgY2xhc3Nlcy5cbiAqXG4gKiBUaW1lIGNvbXBsZXhpdHkgaXMgTygxKSBmb3IgbGluZWFyIGFjY2VzcyBjcm9zc2luZyBhdCBtb3N0IHR3byBwb2ludHNcbiAqIGFuZCBPKGxvZyBOKSBmb3IgcmFuZG9tIGFjY2Vzcywgd2hlcmUgTiBpcyB0aGUgbnVtYmVyIG9mIHBvc2l0aW9ucy5cbiAqXG4gKiBSZWZlcmVuY2VzOlxuICpcbiAqIFx0XHRodHRwOi8vd3d3Lm9vZGVzaWduLmNvbS90ZW1wbGF0ZS1tZXRob2QtcGF0dGVybi5odG1sXG4gKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIEludGVycG9sYW50KCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkge1xuXG5cdHRoaXMucGFyYW1ldGVyUG9zaXRpb25zID0gcGFyYW1ldGVyUG9zaXRpb25zO1xuXHR0aGlzLl9jYWNoZWRJbmRleCA9IDA7XG5cblx0dGhpcy5yZXN1bHRCdWZmZXIgPSByZXN1bHRCdWZmZXIgIT09IHVuZGVmaW5lZCA/XG5cdFx0cmVzdWx0QnVmZmVyIDogbmV3IHNhbXBsZVZhbHVlcy5jb25zdHJ1Y3Rvciggc2FtcGxlU2l6ZSApO1xuXHR0aGlzLnNhbXBsZVZhbHVlcyA9IHNhbXBsZVZhbHVlcztcblx0dGhpcy52YWx1ZVNpemUgPSBzYW1wbGVTaXplO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEludGVycG9sYW50LnByb3RvdHlwZSwge1xuXG5cdGV2YWx1YXRlOiBmdW5jdGlvbiAoIHQgKSB7XG5cblx0XHR2YXIgcHAgPSB0aGlzLnBhcmFtZXRlclBvc2l0aW9ucyxcblx0XHRcdGkxID0gdGhpcy5fY2FjaGVkSW5kZXgsXG5cblx0XHRcdHQxID0gcHBbIGkxIF0sXG5cdFx0XHR0MCA9IHBwWyBpMSAtIDEgXTtcblxuXHRcdHZhbGlkYXRlX2ludGVydmFsOiB7XG5cblx0XHRcdHNlZWs6IHtcblxuXHRcdFx0XHR2YXIgcmlnaHQ7XG5cblx0XHRcdFx0bGluZWFyX3NjYW46IHtcblxuXHRcdFx0XHRcdC8vLSBTZWUgaHR0cDovL2pzcGVyZi5jb20vY29tcGFyaXNvbi10by11bmRlZmluZWQvM1xuXHRcdFx0XHRcdC8vLSBzbG93ZXIgY29kZTpcblx0XHRcdFx0XHQvLy1cblx0XHRcdFx0XHQvLy0gXHRcdFx0XHRpZiAoIHQgPj0gdDEgfHwgdDEgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRmb3J3YXJkX3NjYW46IGlmICggISAoIHQgPCB0MSApICkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgZ2l2ZVVwQXQgPSBpMSArIDI7IDsgKSB7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0MSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCB0IDwgdDAgKSBicmVhayBmb3J3YXJkX3NjYW47XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBhZnRlciBlbmRcblxuXHRcdFx0XHRcdFx0XHRcdGkxID0gcHAubGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX2NhY2hlZEluZGV4ID0gaTE7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuYWZ0ZXJFbmRfKCBpMSAtIDEsIHQsIHQwICk7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmICggaTEgPT09IGdpdmVVcEF0ICkgYnJlYWs7IC8vIHRoaXMgbG9vcFxuXG5cdFx0XHRcdFx0XHRcdHQwID0gdDE7XG5cdFx0XHRcdFx0XHRcdHQxID0gcHBbICsrIGkxIF07XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0IDwgdDEgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBoYXZlIGFycml2ZWQgYXQgdGhlIHNvdWdodCBpbnRlcnZhbFxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrIHNlZWs7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIHByZXBhcmUgYmluYXJ5IHNlYXJjaCBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgaW5kZXhcblx0XHRcdFx0XHRcdHJpZ2h0ID0gcHAubGVuZ3RoO1xuXHRcdFx0XHRcdFx0YnJlYWsgbGluZWFyX3NjYW47XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLy0gc2xvd2VyIGNvZGU6XG5cdFx0XHRcdFx0Ly8tXHRcdFx0XHRcdGlmICggdCA8IHQwIHx8IHQwID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0aWYgKCAhICggdCA+PSB0MCApICkge1xuXG5cdFx0XHRcdFx0XHQvLyBsb29waW5nP1xuXG5cdFx0XHRcdFx0XHR2YXIgdDFnbG9iYWwgPSBwcFsgMSBdO1xuXG5cdFx0XHRcdFx0XHRpZiAoIHQgPCB0MWdsb2JhbCApIHtcblxuXHRcdFx0XHRcdFx0XHRpMSA9IDI7IC8vICsgMSwgdXNpbmcgdGhlIHNjYW4gZm9yIHRoZSBkZXRhaWxzXG5cdFx0XHRcdFx0XHRcdHQwID0gdDFnbG9iYWw7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gbGluZWFyIHJldmVyc2Ugc2NhblxuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgZ2l2ZVVwQXQgPSBpMSAtIDI7IDsgKSB7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0MCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYmVmb3JlIHN0YXJ0XG5cblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9jYWNoZWRJbmRleCA9IDA7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuYmVmb3JlU3RhcnRfKCAwLCB0LCB0MSApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAoIGkxID09PSBnaXZlVXBBdCApIGJyZWFrOyAvLyB0aGlzIGxvb3BcblxuXHRcdFx0XHRcdFx0XHR0MSA9IHQwO1xuXHRcdFx0XHRcdFx0XHR0MCA9IHBwWyAtLSBpMSAtIDEgXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHQgPj0gdDAgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBoYXZlIGFycml2ZWQgYXQgdGhlIHNvdWdodCBpbnRlcnZhbFxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrIHNlZWs7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIHByZXBhcmUgYmluYXJ5IHNlYXJjaCBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBpbmRleFxuXHRcdFx0XHRcdFx0cmlnaHQgPSBpMTtcblx0XHRcdFx0XHRcdGkxID0gMDtcblx0XHRcdFx0XHRcdGJyZWFrIGxpbmVhcl9zY2FuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gdGhlIGludGVydmFsIGlzIHZhbGlkXG5cblx0XHRcdFx0XHRicmVhayB2YWxpZGF0ZV9pbnRlcnZhbDtcblxuXHRcdFx0XHR9IC8vIGxpbmVhciBzY2FuXG5cblx0XHRcdFx0Ly8gYmluYXJ5IHNlYXJjaFxuXG5cdFx0XHRcdHdoaWxlICggaTEgPCByaWdodCApIHtcblxuXHRcdFx0XHRcdHZhciBtaWQgPSAoIGkxICsgcmlnaHQgKSA+Pj4gMTtcblxuXHRcdFx0XHRcdGlmICggdCA8IHBwWyBtaWQgXSApIHtcblxuXHRcdFx0XHRcdFx0cmlnaHQgPSBtaWQ7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRpMSA9IG1pZCArIDE7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHQxID0gcHBbIGkxIF07XG5cdFx0XHRcdHQwID0gcHBbIGkxIC0gMSBdO1xuXG5cdFx0XHRcdC8vIGNoZWNrIGJvdW5kYXJ5IGNhc2VzLCBhZ2FpblxuXG5cdFx0XHRcdGlmICggdDAgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRoaXMuX2NhY2hlZEluZGV4ID0gMDtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5iZWZvcmVTdGFydF8oIDAsIHQsIHQxICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdDEgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGkxID0gcHAubGVuZ3RoO1xuXHRcdFx0XHRcdHRoaXMuX2NhY2hlZEluZGV4ID0gaTE7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuYWZ0ZXJFbmRfKCBpMSAtIDEsIHQwLCB0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IC8vIHNlZWtcblxuXHRcdFx0dGhpcy5fY2FjaGVkSW5kZXggPSBpMTtcblxuXHRcdFx0dGhpcy5pbnRlcnZhbENoYW5nZWRfKCBpMSwgdDAsIHQxICk7XG5cblx0XHR9IC8vIHZhbGlkYXRlX2ludGVydmFsXG5cblx0XHRyZXR1cm4gdGhpcy5pbnRlcnBvbGF0ZV8oIGkxLCB0MCwgdCwgdDEgKTtcblxuXHR9LFxuXG5cdHNldHRpbmdzOiBudWxsLCAvLyBvcHRpb25hbCwgc3ViY2xhc3Mtc3BlY2lmaWMgc2V0dGluZ3Mgc3RydWN0dXJlXG5cdC8vIE5vdGU6IFRoZSBpbmRpcmVjdGlvbiBhbGxvd3MgY2VudHJhbCBjb250cm9sIG9mIG1hbnkgaW50ZXJwb2xhbnRzLlxuXG5cdC8vIC0tLSBQcm90ZWN0ZWQgaW50ZXJmYWNlXG5cblx0RGVmYXVsdFNldHRpbmdzXzoge30sXG5cblx0Z2V0U2V0dGluZ3NfOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zZXR0aW5ncyB8fCB0aGlzLkRlZmF1bHRTZXR0aW5nc187XG5cblx0fSxcblxuXHRjb3B5U2FtcGxlVmFsdWVfOiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0Ly8gY29waWVzIGEgc2FtcGxlIHZhbHVlIHRvIHRoZSByZXN1bHQgYnVmZmVyXG5cblx0XHR2YXIgcmVzdWx0ID0gdGhpcy5yZXN1bHRCdWZmZXIsXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnNhbXBsZVZhbHVlcyxcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxuXHRcdFx0b2Zmc2V0ID0gaW5kZXggKiBzdHJpZGU7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcblxuXHRcdFx0cmVzdWx0WyBpIF0gPSB2YWx1ZXNbIG9mZnNldCArIGkgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fSxcblxuXHQvLyBUZW1wbGF0ZSBtZXRob2RzIGZvciBkZXJpdmVkIGNsYXNzZXM6XG5cblx0aW50ZXJwb2xhdGVfOiBmdW5jdGlvbiAoIC8qIGkxLCB0MCwgdCwgdDEgKi8gKSB7XG5cblx0XHR0aHJvdyBuZXcgRXJyb3IoICdjYWxsIHRvIGFic3RyYWN0IG1ldGhvZCcgKTtcblx0XHQvLyBpbXBsZW1lbnRhdGlvbnMgc2hhbGwgcmV0dXJuIHRoaXMucmVzdWx0QnVmZmVyXG5cblx0fSxcblxuXHRpbnRlcnZhbENoYW5nZWRfOiBmdW5jdGlvbiAoIC8qIGkxLCB0MCwgdDEgKi8gKSB7XG5cblx0XHQvLyBlbXB0eVxuXG5cdH1cblxufSApO1xuXG4vLyFcXCBERUNMQVJFIEFMSUFTIEFGVEVSIGFzc2lnbiBwcm90b3R5cGUgIVxuT2JqZWN0LmFzc2lnbiggSW50ZXJwb2xhbnQucHJvdG90eXBlLCB7XG5cblx0Ly8oIDAsIHQsIHQwICksIHJldHVybnMgdGhpcy5yZXN1bHRCdWZmZXJcblx0YmVmb3JlU3RhcnRfOiBJbnRlcnBvbGFudC5wcm90b3R5cGUuY29weVNhbXBsZVZhbHVlXyxcblxuXHQvLyggTi0xLCB0Ti0xLCB0ICksIHJldHVybnMgdGhpcy5yZXN1bHRCdWZmZXJcblx0YWZ0ZXJFbmRfOiBJbnRlcnBvbGFudC5wcm90b3R5cGUuY29weVNhbXBsZVZhbHVlXyxcblxufSApO1xuXG4vKipcbiAqIFNwaGVyaWNhbCBsaW5lYXIgdW5pdCBxdWF0ZXJuaW9uIGludGVycG9sYW50LlxuICpcbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XG5cblx0SW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApO1xuXG59XG5cblF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQsXG5cblx0aW50ZXJwb2xhdGVfOiBmdW5jdGlvbiAoIGkxLCB0MCwgdCwgdDEgKSB7XG5cblx0XHR2YXIgcmVzdWx0ID0gdGhpcy5yZXN1bHRCdWZmZXIsXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnNhbXBsZVZhbHVlcyxcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxuXG5cdFx0XHRvZmZzZXQgPSBpMSAqIHN0cmlkZSxcblxuXHRcdFx0YWxwaGEgPSAoIHQgLSB0MCApIC8gKCB0MSAtIHQwICk7XG5cblx0XHRmb3IgKCB2YXIgZW5kID0gb2Zmc2V0ICsgc3RyaWRlOyBvZmZzZXQgIT09IGVuZDsgb2Zmc2V0ICs9IDQgKSB7XG5cblx0XHRcdFF1YXRlcm5pb24uc2xlcnBGbGF0KCByZXN1bHQsIDAsIHZhbHVlcywgb2Zmc2V0IC0gc3RyaWRlLCB2YWx1ZXMsIG9mZnNldCwgYWxwaGEgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgb2YgcXVhdGVybmlvbiBrZXlmcmFtZSB2YWx1ZXMuXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkge1xuXG5cdEtleWZyYW1lVHJhY2suY2FsbCggdGhpcywgbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApO1xuXG59XG5cblF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogUXVhdGVybmlvbktleWZyYW1lVHJhY2ssXG5cblx0VmFsdWVUeXBlTmFtZTogJ3F1YXRlcm5pb24nLFxuXG5cdC8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWRcblxuXHREZWZhdWx0SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVMaW5lYXIsXG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOiBmdW5jdGlvbiAoIHJlc3VsdCApIHtcblxuXHRcdHJldHVybiBuZXcgUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50KCB0aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1ZVNpemUoKSwgcmVzdWx0ICk7XG5cblx0fSxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6IHVuZGVmaW5lZCAvLyBub3QgeWV0IGltcGxlbWVudGVkXG5cbn0gKTtcblxuLyoqXG4gKlxuICogQSBUcmFjayBvZiBrZXlmcmFtZSB2YWx1ZXMgdGhhdCByZXByZXNlbnQgY29sb3IuXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBDb2xvcktleWZyYW1lVHJhY2soIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7XG5cblx0S2V5ZnJhbWVUcmFjay5jYWxsKCB0aGlzLCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICk7XG5cbn1cblxuQ29sb3JLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQ29sb3JLZXlmcmFtZVRyYWNrLFxuXG5cdFZhbHVlVHlwZU5hbWU6ICdjb2xvcidcblxuXHQvLyBWYWx1ZUJ1ZmZlclR5cGUgaXMgaW5oZXJpdGVkXG5cblx0Ly8gRGVmYXVsdEludGVycG9sYXRpb24gaXMgaW5oZXJpdGVkXG5cblx0Ly8gTm90ZTogVmVyeSBiYXNpYyBpbXBsZW1lbnRhdGlvbiBhbmQgbm90aGluZyBzcGVjaWFsIHlldC5cblx0Ly8gSG93ZXZlciwgdGhpcyBpcyB0aGUgcGxhY2UgZm9yIGNvbG9yIHNwYWNlIHBhcmFtZXRlcml6YXRpb24uXG5cbn0gKTtcblxuLyoqXG4gKlxuICogQSBUcmFjayBvZiBudW1lcmljIGtleWZyYW1lIHZhbHVlcy5cbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gTnVtYmVyS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcblxuXHRLZXlmcmFtZVRyYWNrLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTtcblxufVxuXG5OdW1iZXJLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTnVtYmVyS2V5ZnJhbWVUcmFjayxcblxuXHRWYWx1ZVR5cGVOYW1lOiAnbnVtYmVyJ1xuXG5cdC8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWRcblxuXHQvLyBEZWZhdWx0SW50ZXJwb2xhdGlvbiBpcyBpbmhlcml0ZWRcblxufSApO1xuXG4vKipcbiAqIEZhc3QgYW5kIHNpbXBsZSBjdWJpYyBzcGxpbmUgaW50ZXJwb2xhbnQuXG4gKlxuICogSXQgd2FzIGRlcml2ZWQgZnJvbSBhIEhlcm1pdGlhbiBjb25zdHJ1Y3Rpb24gc2V0dGluZyB0aGUgZmlyc3QgZGVyaXZhdGl2ZVxuICogYXQgZWFjaCBzYW1wbGUgcG9zaXRpb24gdG8gdGhlIGxpbmVhciBzbG9wZSBiZXR3ZWVuIG5laWdoYm9yaW5nIHBvc2l0aW9uc1xuICogb3ZlciB0aGVpciBwYXJhbWV0ZXIgaW50ZXJ2YWwuXG4gKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIEN1YmljSW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XG5cblx0SW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApO1xuXG5cdHRoaXMuX3dlaWdodFByZXYgPSAtIDA7XG5cdHRoaXMuX29mZnNldFByZXYgPSAtIDA7XG5cdHRoaXMuX3dlaWdodE5leHQgPSAtIDA7XG5cdHRoaXMuX29mZnNldE5leHQgPSAtIDA7XG5cbn1cblxuQ3ViaWNJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBDdWJpY0ludGVycG9sYW50LFxuXG5cdERlZmF1bHRTZXR0aW5nc186IHtcblxuXHRcdGVuZGluZ1N0YXJ0OiBaZXJvQ3VydmF0dXJlRW5kaW5nLFxuXHRcdGVuZGluZ0VuZDogWmVyb0N1cnZhdHVyZUVuZGluZ1xuXG5cdH0sXG5cblx0aW50ZXJ2YWxDaGFuZ2VkXzogZnVuY3Rpb24gKCBpMSwgdDAsIHQxICkge1xuXG5cdFx0dmFyIHBwID0gdGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMsXG5cdFx0XHRpUHJldiA9IGkxIC0gMixcblx0XHRcdGlOZXh0ID0gaTEgKyAxLFxuXG5cdFx0XHR0UHJldiA9IHBwWyBpUHJldiBdLFxuXHRcdFx0dE5leHQgPSBwcFsgaU5leHQgXTtcblxuXHRcdGlmICggdFByZXYgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0c3dpdGNoICggdGhpcy5nZXRTZXR0aW5nc18oKS5lbmRpbmdTdGFydCApIHtcblxuXHRcdFx0XHRjYXNlIFplcm9TbG9wZUVuZGluZzpcblxuXHRcdFx0XHRcdC8vIGYnKHQwKSA9IDBcblx0XHRcdFx0XHRpUHJldiA9IGkxO1xuXHRcdFx0XHRcdHRQcmV2ID0gMiAqIHQwIC0gdDE7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFdyYXBBcm91bmRFbmRpbmc6XG5cblx0XHRcdFx0XHQvLyB1c2UgdGhlIG90aGVyIGVuZCBvZiB0aGUgY3VydmVcblx0XHRcdFx0XHRpUHJldiA9IHBwLmxlbmd0aCAtIDI7XG5cdFx0XHRcdFx0dFByZXYgPSB0MCArIHBwWyBpUHJldiBdIC0gcHBbIGlQcmV2ICsgMSBdO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0ZGVmYXVsdDogLy8gWmVyb0N1cnZhdHVyZUVuZGluZ1xuXG5cdFx0XHRcdFx0Ly8gZicnKHQwKSA9IDAgYS5rLmEuIE5hdHVyYWwgU3BsaW5lXG5cdFx0XHRcdFx0aVByZXYgPSBpMTtcblx0XHRcdFx0XHR0UHJldiA9IHQxO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHROZXh0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHN3aXRjaCAoIHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nRW5kICkge1xuXG5cdFx0XHRcdGNhc2UgWmVyb1Nsb3BlRW5kaW5nOlxuXG5cdFx0XHRcdFx0Ly8gZicodE4pID0gMFxuXHRcdFx0XHRcdGlOZXh0ID0gaTE7XG5cdFx0XHRcdFx0dE5leHQgPSAyICogdDEgLSB0MDtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgV3JhcEFyb3VuZEVuZGluZzpcblxuXHRcdFx0XHRcdC8vIHVzZSB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjdXJ2ZVxuXHRcdFx0XHRcdGlOZXh0ID0gMTtcblx0XHRcdFx0XHR0TmV4dCA9IHQxICsgcHBbIDEgXSAtIHBwWyAwIF07XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OiAvLyBaZXJvQ3VydmF0dXJlRW5kaW5nXG5cblx0XHRcdFx0XHQvLyBmJycodE4pID0gMCwgYS5rLmEuIE5hdHVyYWwgU3BsaW5lXG5cdFx0XHRcdFx0aU5leHQgPSBpMSAtIDE7XG5cdFx0XHRcdFx0dE5leHQgPSB0MDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGhhbGZEdCA9ICggdDEgLSB0MCApICogMC41LFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemU7XG5cblx0XHR0aGlzLl93ZWlnaHRQcmV2ID0gaGFsZkR0IC8gKCB0MCAtIHRQcmV2ICk7XG5cdFx0dGhpcy5fd2VpZ2h0TmV4dCA9IGhhbGZEdCAvICggdE5leHQgLSB0MSApO1xuXHRcdHRoaXMuX29mZnNldFByZXYgPSBpUHJldiAqIHN0cmlkZTtcblx0XHR0aGlzLl9vZmZzZXROZXh0ID0gaU5leHQgKiBzdHJpZGU7XG5cblx0fSxcblxuXHRpbnRlcnBvbGF0ZV86IGZ1bmN0aW9uICggaTEsIHQwLCB0LCB0MSApIHtcblxuXHRcdHZhciByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlcixcblx0XHRcdHZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cblx0XHRcdG8xID0gaTEgKiBzdHJpZGUsXHRcdG8wID0gbzEgLSBzdHJpZGUsXG5cdFx0XHRvUCA9IHRoaXMuX29mZnNldFByZXYsIFx0b04gPSB0aGlzLl9vZmZzZXROZXh0LFxuXHRcdFx0d1AgPSB0aGlzLl93ZWlnaHRQcmV2LFx0d04gPSB0aGlzLl93ZWlnaHROZXh0LFxuXG5cdFx0XHRwID0gKCB0IC0gdDAgKSAvICggdDEgLSB0MCApLFxuXHRcdFx0cHAgPSBwICogcCxcblx0XHRcdHBwcCA9IHBwICogcDtcblxuXHRcdC8vIGV2YWx1YXRlIHBvbHlub21pYWxzXG5cblx0XHR2YXIgc1AgPSAtIHdQICogcHBwICsgMiAqIHdQICogcHAgLSB3UCAqIHA7XG5cdFx0dmFyIHMwID0gKCAxICsgd1AgKSAqIHBwcCArICggLSAxLjUgLSAyICogd1AgKSAqIHBwICsgKCAtIDAuNSArIHdQICkgKiBwICsgMTtcblx0XHR2YXIgczEgPSAoIC0gMSAtIHdOICkgKiBwcHAgKyAoIDEuNSArIHdOICkgKiBwcCArIDAuNSAqIHA7XG5cdFx0dmFyIHNOID0gd04gKiBwcHAgLSB3TiAqIHBwO1xuXG5cdFx0Ly8gY29tYmluZSBkYXRhIGxpbmVhcmx5XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcblxuXHRcdFx0cmVzdWx0WyBpIF0gPVxuXHRcdFx0XHRcdHNQICogdmFsdWVzWyBvUCArIGkgXSArXG5cdFx0XHRcdFx0czAgKiB2YWx1ZXNbIG8wICsgaSBdICtcblx0XHRcdFx0XHRzMSAqIHZhbHVlc1sgbzEgKyBpIF0gK1xuXHRcdFx0XHRcdHNOICogdmFsdWVzWyBvTiArIGkgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIExpbmVhckludGVycG9sYW50KCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkge1xuXG5cdEludGVycG9sYW50LmNhbGwoIHRoaXMsIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKTtcblxufVxuXG5MaW5lYXJJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBMaW5lYXJJbnRlcnBvbGFudCxcblxuXHRpbnRlcnBvbGF0ZV86IGZ1bmN0aW9uICggaTEsIHQwLCB0LCB0MSApIHtcblxuXHRcdHZhciByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlcixcblx0XHRcdHZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cblx0XHRcdG9mZnNldDEgPSBpMSAqIHN0cmlkZSxcblx0XHRcdG9mZnNldDAgPSBvZmZzZXQxIC0gc3RyaWRlLFxuXG5cdFx0XHR3ZWlnaHQxID0gKCB0IC0gdDAgKSAvICggdDEgLSB0MCApLFxuXHRcdFx0d2VpZ2h0MCA9IDEgLSB3ZWlnaHQxO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdHJlc3VsdFsgaSBdID1cblx0XHRcdFx0XHR2YWx1ZXNbIG9mZnNldDAgKyBpIF0gKiB3ZWlnaHQwICtcblx0XHRcdFx0XHR2YWx1ZXNbIG9mZnNldDEgKyBpIF0gKiB3ZWlnaHQxO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKlxuICogSW50ZXJwb2xhbnQgdGhhdCBldmFsdWF0ZXMgdG8gdGhlIHNhbXBsZSB2YWx1ZSBhdCB0aGUgcG9zaXRpb24gcHJlY2VlZGluZ1xuICogdGhlIHBhcmFtZXRlci5cbiAqXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gRGlzY3JldGVJbnRlcnBvbGFudCggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHtcblxuXHRJbnRlcnBvbGFudC5jYWxsKCB0aGlzLCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICk7XG5cbn1cblxuRGlzY3JldGVJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBEaXNjcmV0ZUludGVycG9sYW50LFxuXG5cdGludGVycG9sYXRlXzogZnVuY3Rpb24gKCBpMSAvKiwgdDAsIHQsIHQxICovICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuY29weVNhbXBsZVZhbHVlXyggaTEgLSAxICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciB0c2Nod1xuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICovXG5cbnZhciBBbmltYXRpb25VdGlscyA9IHtcblxuXHQvLyBzYW1lIGFzIEFycmF5LnByb3RvdHlwZS5zbGljZSwgYnV0IGFsc28gd29ya3Mgb24gdHlwZWQgYXJyYXlzXG5cdGFycmF5U2xpY2U6IGZ1bmN0aW9uICggYXJyYXksIGZyb20sIHRvICkge1xuXG5cdFx0aWYgKCBBbmltYXRpb25VdGlscy5pc1R5cGVkQXJyYXkoIGFycmF5ICkgKSB7XG5cblx0XHRcdC8vIGluIGlvczkgYXJyYXkuc3ViYXJyYXkoZnJvbSwgdW5kZWZpbmVkKSB3aWxsIHJldHVybiBlbXB0eSBhcnJheVxuXHRcdFx0Ly8gYnV0IGFycmF5LnN1YmFycmF5KGZyb20pIG9yIGFycmF5LnN1YmFycmF5KGZyb20sIGxlbikgaXMgY29ycmVjdFxuXHRcdFx0cmV0dXJuIG5ldyBhcnJheS5jb25zdHJ1Y3RvciggYXJyYXkuc3ViYXJyYXkoIGZyb20sIHRvICE9PSB1bmRlZmluZWQgPyB0byA6IGFycmF5Lmxlbmd0aCApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gYXJyYXkuc2xpY2UoIGZyb20sIHRvICk7XG5cblx0fSxcblxuXHQvLyBjb252ZXJ0cyBhbiBhcnJheSB0byBhIHNwZWNpZmljIHR5cGVcblx0Y29udmVydEFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCB0eXBlLCBmb3JjZUNsb25lICkge1xuXG5cdFx0aWYgKCAhIGFycmF5IHx8IC8vIGxldCAndW5kZWZpbmVkJyBhbmQgJ251bGwnIHBhc3Ncblx0XHRcdFx0ISBmb3JjZUNsb25lICYmIGFycmF5LmNvbnN0cnVjdG9yID09PSB0eXBlICkgcmV0dXJuIGFycmF5O1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZS5CWVRFU19QRVJfRUxFTUVOVCA9PT0gJ251bWJlcicgKSB7XG5cblx0XHRcdHJldHVybiBuZXcgdHlwZSggYXJyYXkgKTsgLy8gY3JlYXRlIHR5cGVkIGFycmF5XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFycmF5ICk7IC8vIGNyZWF0ZSBBcnJheVxuXG5cdH0sXG5cblx0aXNUeXBlZEFycmF5OiBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdHJldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoIG9iamVjdCApICYmXG5cdFx0XHRcdCEgKCBvYmplY3QgaW5zdGFuY2VvZiBEYXRhVmlldyApO1xuXG5cdH0sXG5cblx0Ly8gcmV0dXJucyBhbiBhcnJheSBieSB3aGljaCB0aW1lcyBhbmQgdmFsdWVzIGNhbiBiZSBzb3J0ZWRcblx0Z2V0S2V5ZnJhbWVPcmRlcjogZnVuY3Rpb24gKCB0aW1lcyApIHtcblxuXHRcdGZ1bmN0aW9uIGNvbXBhcmVUaW1lKCBpLCBqICkge1xuXG5cdFx0XHRyZXR1cm4gdGltZXNbIGkgXSAtIHRpbWVzWyBqIF07XG5cblx0XHR9XG5cblx0XHR2YXIgbiA9IHRpbWVzLmxlbmd0aDtcblx0XHR2YXIgcmVzdWx0ID0gbmV3IEFycmF5KCBuICk7XG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuOyArKyBpICkgcmVzdWx0WyBpIF0gPSBpO1xuXG5cdFx0cmVzdWx0LnNvcnQoIGNvbXBhcmVUaW1lICk7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdH0sXG5cblx0Ly8gdXNlcyB0aGUgYXJyYXkgcHJldmlvdXNseSByZXR1cm5lZCBieSAnZ2V0S2V5ZnJhbWVPcmRlcicgdG8gc29ydCBkYXRhXG5cdHNvcnRlZEFycmF5OiBmdW5jdGlvbiAoIHZhbHVlcywgc3RyaWRlLCBvcmRlciApIHtcblxuXHRcdHZhciBuVmFsdWVzID0gdmFsdWVzLmxlbmd0aDtcblx0XHR2YXIgcmVzdWx0ID0gbmV3IHZhbHVlcy5jb25zdHJ1Y3RvciggblZhbHVlcyApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBkc3RPZmZzZXQgPSAwOyBkc3RPZmZzZXQgIT09IG5WYWx1ZXM7ICsrIGkgKSB7XG5cblx0XHRcdHZhciBzcmNPZmZzZXQgPSBvcmRlclsgaSBdICogc3RyaWRlO1xuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApIHtcblxuXHRcdFx0XHRyZXN1bHRbIGRzdE9mZnNldCArKyBdID0gdmFsdWVzWyBzcmNPZmZzZXQgKyBqIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fSxcblxuXHQvLyBmdW5jdGlvbiBmb3IgcGFyc2luZyBBT1Mga2V5ZnJhbWUgZm9ybWF0c1xuXHRmbGF0dGVuSlNPTjogZnVuY3Rpb24gKCBqc29uS2V5cywgdGltZXMsIHZhbHVlcywgdmFsdWVQcm9wZXJ0eU5hbWUgKSB7XG5cblx0XHR2YXIgaSA9IDEsIGtleSA9IGpzb25LZXlzWyAwIF07XG5cblx0XHR3aGlsZSAoIGtleSAhPT0gdW5kZWZpbmVkICYmIGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRrZXkgPSBqc29uS2V5c1sgaSArKyBdO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHJldHVybjsgLy8gbm8gZGF0YVxuXG5cdFx0dmFyIHZhbHVlID0ga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdO1xuXHRcdGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHJldHVybjsgLy8gbm8gZGF0YVxuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXG5cdFx0XHRkbyB7XG5cblx0XHRcdFx0dmFsdWUgPSBrZXlbIHZhbHVlUHJvcGVydHlOYW1lIF07XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGltZXMucHVzaCgga2V5LnRpbWUgKTtcblx0XHRcdFx0XHR2YWx1ZXMucHVzaC5hcHBseSggdmFsdWVzLCB2YWx1ZSApOyAvLyBwdXNoIGFsbCBlbGVtZW50c1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRrZXkgPSBqc29uS2V5c1sgaSArKyBdO1xuXG5cdFx0XHR9IHdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHZhbHVlLnRvQXJyYXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gLi4uYXNzdW1lIFRIUkVFLk1hdGgtaXNoXG5cblx0XHRcdGRvIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0aW1lcy5wdXNoKCBrZXkudGltZSApO1xuXHRcdFx0XHRcdHZhbHVlLnRvQXJyYXkoIHZhbHVlcywgdmFsdWVzLmxlbmd0aCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRrZXkgPSBqc29uS2V5c1sgaSArKyBdO1xuXG5cdFx0XHR9IHdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIG90aGVyd2lzZSBwdXNoIGFzLWlzXG5cblx0XHRcdGRvIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0aW1lcy5wdXNoKCBrZXkudGltZSApO1xuXHRcdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRrZXkgPSBqc29uS2V5c1sgaSArKyBdO1xuXG5cdFx0XHR9IHdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgKTtcblxuXHRcdH1cblxuXHR9XG5cbn07XG5cbi8qKlxuICpcbiAqIEEgdGltZWQgc2VxdWVuY2Ugb2Yga2V5ZnJhbWVzIGZvciBhIHNwZWNpZmljIHByb3BlcnR5LlxuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcblxuXHRpZiAoIG5hbWUgPT09IHVuZGVmaW5lZCApIHRocm93IG5ldyBFcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IHRyYWNrIG5hbWUgaXMgdW5kZWZpbmVkJyApO1xuXHRpZiAoIHRpbWVzID09PSB1bmRlZmluZWQgfHwgdGltZXMubGVuZ3RoID09PSAwICkgdGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogbm8ga2V5ZnJhbWVzIGluIHRyYWNrIG5hbWVkICcgKyBuYW1lICk7XG5cblx0dGhpcy5uYW1lID0gbmFtZTtcblxuXHR0aGlzLnRpbWVzID0gQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB0aW1lcywgdGhpcy5UaW1lQnVmZmVyVHlwZSApO1xuXHR0aGlzLnZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLmNvbnZlcnRBcnJheSggdmFsdWVzLCB0aGlzLlZhbHVlQnVmZmVyVHlwZSApO1xuXG5cdHRoaXMuc2V0SW50ZXJwb2xhdGlvbiggaW50ZXJwb2xhdGlvbiB8fCB0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uICk7XG5cblx0dGhpcy52YWxpZGF0ZSgpO1xuXHR0aGlzLm9wdGltaXplKCk7XG5cbn1cblxuLy8gU3RhdGljIG1ldGhvZHM6XG5cbk9iamVjdC5hc3NpZ24oIEtleWZyYW1lVHJhY2ssIHtcblxuXHQvLyBTZXJpYWxpemF0aW9uIChpbiBzdGF0aWMgY29udGV4dCwgYmVjYXVzZSBvZiBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uXG5cdC8vIGFuZCBhdXRvbWF0aWMgaW52b2NhdGlvbiBvZiAudG9KU09OKTpcblxuXHRwYXJzZTogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0aWYgKCBqc29uLnR5cGUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogdHJhY2sgdHlwZSB1bmRlZmluZWQsIGNhbiBub3QgcGFyc2UnICk7XG5cblx0XHR9XG5cblx0XHR2YXIgdHJhY2tUeXBlID0gS2V5ZnJhbWVUcmFjay5fZ2V0VHJhY2tUeXBlRm9yVmFsdWVUeXBlTmFtZSgganNvbi50eXBlICk7XG5cblx0XHRpZiAoIGpzb24udGltZXMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIHRpbWVzID0gW10sIHZhbHVlcyA9IFtdO1xuXG5cdFx0XHRBbmltYXRpb25VdGlscy5mbGF0dGVuSlNPTigganNvbi5rZXlzLCB0aW1lcywgdmFsdWVzLCAndmFsdWUnICk7XG5cblx0XHRcdGpzb24udGltZXMgPSB0aW1lcztcblx0XHRcdGpzb24udmFsdWVzID0gdmFsdWVzO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZGVyaXZlZCBjbGFzc2VzIGNhbiBkZWZpbmUgYSBzdGF0aWMgcGFyc2UgbWV0aG9kXG5cdFx0aWYgKCB0cmFja1R5cGUucGFyc2UgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cmV0dXJuIHRyYWNrVHlwZS5wYXJzZSgganNvbiApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gYnkgZGVmYXVsdCwgd2UgYXNzdW1lIGEgY29uc3RydWN0b3IgY29tcGF0aWJsZSB3aXRoIHRoZSBiYXNlXG5cdFx0XHRyZXR1cm4gbmV3IHRyYWNrVHlwZSgganNvbi5uYW1lLCBqc29uLnRpbWVzLCBqc29uLnZhbHVlcywganNvbi5pbnRlcnBvbGF0aW9uICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggdHJhY2sgKSB7XG5cblx0XHR2YXIgdHJhY2tUeXBlID0gdHJhY2suY29uc3RydWN0b3I7XG5cblx0XHR2YXIganNvbjtcblxuXHRcdC8vIGRlcml2ZWQgY2xhc3NlcyBjYW4gZGVmaW5lIGEgc3RhdGljIHRvSlNPTiBtZXRob2Rcblx0XHRpZiAoIHRyYWNrVHlwZS50b0pTT04gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0anNvbiA9IHRyYWNrVHlwZS50b0pTT04oIHRyYWNrICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBieSBkZWZhdWx0LCB3ZSBhc3N1bWUgdGhlIGRhdGEgY2FuIGJlIHNlcmlhbGl6ZWQgYXMtaXNcblx0XHRcdGpzb24gPSB7XG5cblx0XHRcdFx0J25hbWUnOiB0cmFjay5uYW1lLFxuXHRcdFx0XHQndGltZXMnOiBBbmltYXRpb25VdGlscy5jb252ZXJ0QXJyYXkoIHRyYWNrLnRpbWVzLCBBcnJheSApLFxuXHRcdFx0XHQndmFsdWVzJzogQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB0cmFjay52YWx1ZXMsIEFycmF5IClcblxuXHRcdFx0fTtcblxuXHRcdFx0dmFyIGludGVycG9sYXRpb24gPSB0cmFjay5nZXRJbnRlcnBvbGF0aW9uKCk7XG5cblx0XHRcdGlmICggaW50ZXJwb2xhdGlvbiAhPT0gdHJhY2suRGVmYXVsdEludGVycG9sYXRpb24gKSB7XG5cblx0XHRcdFx0anNvbi5pbnRlcnBvbGF0aW9uID0gaW50ZXJwb2xhdGlvbjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0anNvbi50eXBlID0gdHJhY2suVmFsdWVUeXBlTmFtZTsgLy8gbWFuZGF0b3J5XG5cblx0XHRyZXR1cm4ganNvbjtcblxuXHR9LFxuXG5cdF9nZXRUcmFja1R5cGVGb3JWYWx1ZVR5cGVOYW1lOiBmdW5jdGlvbiAoIHR5cGVOYW1lICkge1xuXG5cdFx0c3dpdGNoICggdHlwZU5hbWUudG9Mb3dlckNhc2UoKSApIHtcblxuXHRcdFx0Y2FzZSAnc2NhbGFyJzpcblx0XHRcdGNhc2UgJ2RvdWJsZSc6XG5cdFx0XHRjYXNlICdmbG9hdCc6XG5cdFx0XHRjYXNlICdudW1iZXInOlxuXHRcdFx0Y2FzZSAnaW50ZWdlcic6XG5cblx0XHRcdFx0cmV0dXJuIE51bWJlcktleWZyYW1lVHJhY2s7XG5cblx0XHRcdGNhc2UgJ3ZlY3Rvcic6XG5cdFx0XHRjYXNlICd2ZWN0b3IyJzpcblx0XHRcdGNhc2UgJ3ZlY3RvcjMnOlxuXHRcdFx0Y2FzZSAndmVjdG9yNCc6XG5cblx0XHRcdFx0cmV0dXJuIFZlY3RvcktleWZyYW1lVHJhY2s7XG5cblx0XHRcdGNhc2UgJ2NvbG9yJzpcblxuXHRcdFx0XHRyZXR1cm4gQ29sb3JLZXlmcmFtZVRyYWNrO1xuXG5cdFx0XHRjYXNlICdxdWF0ZXJuaW9uJzpcblxuXHRcdFx0XHRyZXR1cm4gUXVhdGVybmlvbktleWZyYW1lVHJhY2s7XG5cblx0XHRcdGNhc2UgJ2Jvb2wnOlxuXHRcdFx0Y2FzZSAnYm9vbGVhbic6XG5cblx0XHRcdFx0cmV0dXJuIEJvb2xlYW5LZXlmcmFtZVRyYWNrO1xuXG5cdFx0XHRjYXNlICdzdHJpbmcnOlxuXG5cdFx0XHRcdHJldHVybiBTdHJpbmdLZXlmcmFtZVRyYWNrO1xuXG5cdFx0fVxuXG5cdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogVW5zdXBwb3J0ZWQgdHlwZU5hbWU6ICcgKyB0eXBlTmFtZSApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSwge1xuXG5cdGNvbnN0cnVjdG9yOiBLZXlmcmFtZVRyYWNrLFxuXG5cdFRpbWVCdWZmZXJUeXBlOiBGbG9hdDMyQXJyYXksXG5cblx0VmFsdWVCdWZmZXJUeXBlOiBGbG9hdDMyQXJyYXksXG5cblx0RGVmYXVsdEludGVycG9sYXRpb246IEludGVycG9sYXRlTGluZWFyLFxuXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlOiBmdW5jdGlvbiAoIHJlc3VsdCApIHtcblxuXHRcdHJldHVybiBuZXcgRGlzY3JldGVJbnRlcnBvbGFudCggdGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHJlc3VsdCApO1xuXG5cdH0sXG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOiBmdW5jdGlvbiAoIHJlc3VsdCApIHtcblxuXHRcdHJldHVybiBuZXcgTGluZWFySW50ZXJwb2xhbnQoIHRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdldFZhbHVlU2l6ZSgpLCByZXN1bHQgKTtcblxuXHR9LFxuXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDogZnVuY3Rpb24gKCByZXN1bHQgKSB7XG5cblx0XHRyZXR1cm4gbmV3IEN1YmljSW50ZXJwb2xhbnQoIHRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdldFZhbHVlU2l6ZSgpLCByZXN1bHQgKTtcblxuXHR9LFxuXG5cdHNldEludGVycG9sYXRpb246IGZ1bmN0aW9uICggaW50ZXJwb2xhdGlvbiApIHtcblxuXHRcdHZhciBmYWN0b3J5TWV0aG9kO1xuXG5cdFx0c3dpdGNoICggaW50ZXJwb2xhdGlvbiApIHtcblxuXHRcdFx0Y2FzZSBJbnRlcnBvbGF0ZURpc2NyZXRlOlxuXG5cdFx0XHRcdGZhY3RvcnlNZXRob2QgPSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIEludGVycG9sYXRlTGluZWFyOlxuXG5cdFx0XHRcdGZhY3RvcnlNZXRob2QgPSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBJbnRlcnBvbGF0ZVNtb290aDpcblxuXHRcdFx0XHRmYWN0b3J5TWV0aG9kID0gdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cblx0XHRpZiAoIGZhY3RvcnlNZXRob2QgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIG1lc3NhZ2UgPSBcInVuc3VwcG9ydGVkIGludGVycG9sYXRpb24gZm9yIFwiICtcblx0XHRcdFx0dGhpcy5WYWx1ZVR5cGVOYW1lICsgXCIga2V5ZnJhbWUgdHJhY2sgbmFtZWQgXCIgKyB0aGlzLm5hbWU7XG5cblx0XHRcdGlmICggdGhpcy5jcmVhdGVJbnRlcnBvbGFudCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIGZhbGwgYmFjayB0byBkZWZhdWx0LCB1bmxlc3MgdGhlIGRlZmF1bHQgaXRzZWxmIGlzIG1lc3NlZCB1cFxuXHRcdFx0XHRpZiAoIGludGVycG9sYXRpb24gIT09IHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24gKSB7XG5cblx0XHRcdFx0XHR0aGlzLnNldEludGVycG9sYXRpb24oIHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24gKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCBtZXNzYWdlICk7IC8vIGZhdGFsLCBpbiB0aGlzIGNhc2VcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazonLCBtZXNzYWdlICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR0aGlzLmNyZWF0ZUludGVycG9sYW50ID0gZmFjdG9yeU1ldGhvZDtcblxuXHR9LFxuXG5cdGdldEludGVycG9sYXRpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHN3aXRjaCAoIHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQgKSB7XG5cblx0XHRcdGNhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTpcblxuXHRcdFx0XHRyZXR1cm4gSW50ZXJwb2xhdGVEaXNjcmV0ZTtcblxuXHRcdFx0Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjpcblxuXHRcdFx0XHRyZXR1cm4gSW50ZXJwb2xhdGVMaW5lYXI7XG5cblx0XHRcdGNhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6XG5cblx0XHRcdFx0cmV0dXJuIEludGVycG9sYXRlU21vb3RoO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Z2V0VmFsdWVTaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy52YWx1ZXMubGVuZ3RoIC8gdGhpcy50aW1lcy5sZW5ndGg7XG5cblx0fSxcblxuXHQvLyBtb3ZlIGFsbCBrZXlmcmFtZXMgZWl0aGVyIGZvcndhcmRzIG9yIGJhY2t3YXJkcyBpbiB0aW1lXG5cdHNoaWZ0OiBmdW5jdGlvbiAoIHRpbWVPZmZzZXQgKSB7XG5cblx0XHRpZiAoIHRpbWVPZmZzZXQgIT09IDAuMCApIHtcblxuXHRcdFx0dmFyIHRpbWVzID0gdGhpcy50aW1lcztcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gdGltZXMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdHRpbWVzWyBpIF0gKz0gdGltZU9mZnNldDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyBzY2FsZSBhbGwga2V5ZnJhbWUgdGltZXMgYnkgYSBmYWN0b3IgKHVzZWZ1bCBmb3IgZnJhbWUgPC0+IHNlY29uZHMgY29udmVyc2lvbnMpXG5cdHNjYWxlOiBmdW5jdGlvbiAoIHRpbWVTY2FsZSApIHtcblxuXHRcdGlmICggdGltZVNjYWxlICE9PSAxLjAgKSB7XG5cblx0XHRcdHZhciB0aW1lcyA9IHRoaXMudGltZXM7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IHRpbWVzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHR0aW1lc1sgaSBdICo9IHRpbWVTY2FsZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyByZW1vdmVzIGtleWZyYW1lcyBiZWZvcmUgYW5kIGFmdGVyIGFuaW1hdGlvbiB3aXRob3V0IGNoYW5naW5nIGFueSB2YWx1ZXMgd2l0aGluIHRoZSByYW5nZSBbc3RhcnRUaW1lLCBlbmRUaW1lXS5cblx0Ly8gSU1QT1JUQU5UOiBXZSBkbyBub3Qgc2hpZnQgYXJvdW5kIGtleXMgdG8gdGhlIHN0YXJ0IG9mIHRoZSB0cmFjayB0aW1lLCBiZWNhdXNlIGZvciBpbnRlcnBvbGF0ZWQga2V5cyB0aGlzIHdpbGwgY2hhbmdlIHRoZWlyIHZhbHVlc1xuXHR0cmltOiBmdW5jdGlvbiAoIHN0YXJ0VGltZSwgZW5kVGltZSApIHtcblxuXHRcdHZhciB0aW1lcyA9IHRoaXMudGltZXMsXG5cdFx0XHRuS2V5cyA9IHRpbWVzLmxlbmd0aCxcblx0XHRcdGZyb20gPSAwLFxuXHRcdFx0dG8gPSBuS2V5cyAtIDE7XG5cblx0XHR3aGlsZSAoIGZyb20gIT09IG5LZXlzICYmIHRpbWVzWyBmcm9tIF0gPCBzdGFydFRpbWUgKSB7XG5cblx0XHRcdCsrIGZyb207XG5cblx0XHR9XG5cblx0XHR3aGlsZSAoIHRvICE9PSAtIDEgJiYgdGltZXNbIHRvIF0gPiBlbmRUaW1lICkge1xuXG5cdFx0XHQtLSB0bztcblxuXHRcdH1cblxuXHRcdCsrIHRvOyAvLyBpbmNsdXNpdmUgLT4gZXhjbHVzaXZlIGJvdW5kXG5cblx0XHRpZiAoIGZyb20gIT09IDAgfHwgdG8gIT09IG5LZXlzICkge1xuXG5cdFx0XHQvLyBlbXB0eSB0cmFja3MgYXJlIGZvcmJpZGRlbiwgc28ga2VlcCBhdCBsZWFzdCBvbmUga2V5ZnJhbWVcblx0XHRcdGlmICggZnJvbSA+PSB0byApIHRvID0gTWF0aC5tYXgoIHRvLCAxICksIGZyb20gPSB0byAtIDE7XG5cblx0XHRcdHZhciBzdHJpZGUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpO1xuXHRcdFx0dGhpcy50aW1lcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHRpbWVzLCBmcm9tLCB0byApO1xuXHRcdFx0dGhpcy52YWx1ZXMgPSBBbmltYXRpb25VdGlscy5hcnJheVNsaWNlKCB0aGlzLnZhbHVlcywgZnJvbSAqIHN0cmlkZSwgdG8gKiBzdHJpZGUgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gZW5zdXJlIHdlIGRvIG5vdCBnZXQgYSBHYXJiYWdlSW5HYXJiYWdlT3V0IHNpdHVhdGlvbiwgbWFrZSBzdXJlIHRyYWNrcyBhcmUgYXQgbGVhc3QgbWluaW1hbGx5IHZpYWJsZVxuXHR2YWxpZGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHZhbGlkID0gdHJ1ZTtcblxuXHRcdHZhciB2YWx1ZVNpemUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpO1xuXHRcdGlmICggdmFsdWVTaXplIC0gTWF0aC5mbG9vciggdmFsdWVTaXplICkgIT09IDAgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBJbnZhbGlkIHZhbHVlIHNpemUgaW4gdHJhY2suJywgdGhpcyApO1xuXHRcdFx0dmFsaWQgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHZhciB0aW1lcyA9IHRoaXMudGltZXMsXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnZhbHVlcyxcblxuXHRcdFx0bktleXMgPSB0aW1lcy5sZW5ndGg7XG5cblx0XHRpZiAoIG5LZXlzID09PSAwICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogVHJhY2sgaXMgZW1wdHkuJywgdGhpcyApO1xuXHRcdFx0dmFsaWQgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHZhciBwcmV2VGltZSA9IG51bGw7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5LZXlzOyBpICsrICkge1xuXG5cdFx0XHR2YXIgY3VyclRpbWUgPSB0aW1lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIHR5cGVvZiBjdXJyVGltZSA9PT0gJ251bWJlcicgJiYgaXNOYU4oIGN1cnJUaW1lICkgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IFRpbWUgaXMgbm90IGEgdmFsaWQgbnVtYmVyLicsIHRoaXMsIGksIGN1cnJUaW1lICk7XG5cdFx0XHRcdHZhbGlkID0gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggcHJldlRpbWUgIT09IG51bGwgJiYgcHJldlRpbWUgPiBjdXJyVGltZSApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogT3V0IG9mIG9yZGVyIGtleXMuJywgdGhpcywgaSwgY3VyclRpbWUsIHByZXZUaW1lICk7XG5cdFx0XHRcdHZhbGlkID0gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHRcdHByZXZUaW1lID0gY3VyclRpbWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRpZiAoIEFuaW1hdGlvblV0aWxzLmlzVHlwZWRBcnJheSggdmFsdWVzICkgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gdmFsdWVzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRcdHZhciB2YWx1ZSA9IHZhbHVlc1sgaSBdO1xuXG5cdFx0XHRcdFx0aWYgKCBpc05hTiggdmFsdWUgKSApIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IFZhbHVlIGlzIG5vdCBhIHZhbGlkIG51bWJlci4nLCB0aGlzLCBpLCB2YWx1ZSApO1xuXHRcdFx0XHRcdFx0dmFsaWQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbGlkO1xuXG5cdH0sXG5cblx0Ly8gcmVtb3ZlcyBlcXVpdmFsZW50IHNlcXVlbnRpYWwga2V5cyBhcyBjb21tb24gaW4gbW9ycGggdGFyZ2V0IHNlcXVlbmNlc1xuXHQvLyAoMCwwLDAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwKSAtLT4gKDAsMCwxLDEsMCwwKVxuXHRvcHRpbWl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHRpbWVzID0gdGhpcy50aW1lcyxcblx0XHRcdHZhbHVlcyA9IHRoaXMudmFsdWVzLFxuXHRcdFx0c3RyaWRlID0gdGhpcy5nZXRWYWx1ZVNpemUoKSxcblxuXHRcdFx0c21vb3RoSW50ZXJwb2xhdGlvbiA9IHRoaXMuZ2V0SW50ZXJwb2xhdGlvbigpID09PSBJbnRlcnBvbGF0ZVNtb290aCxcblxuXHRcdFx0d3JpdGVJbmRleCA9IDEsXG5cdFx0XHRsYXN0SW5kZXggPSB0aW1lcy5sZW5ndGggLSAxO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAxOyBpIDwgbGFzdEluZGV4OyArKyBpICkge1xuXG5cdFx0XHR2YXIga2VlcCA9IGZhbHNlO1xuXG5cdFx0XHR2YXIgdGltZSA9IHRpbWVzWyBpIF07XG5cdFx0XHR2YXIgdGltZU5leHQgPSB0aW1lc1sgaSArIDEgXTtcblxuXHRcdFx0Ly8gcmVtb3ZlIGFkamFjZW50IGtleWZyYW1lcyBzY2hlZHVsZWQgYXQgdGhlIHNhbWUgdGltZVxuXG5cdFx0XHRpZiAoIHRpbWUgIT09IHRpbWVOZXh0ICYmICggaSAhPT0gMSB8fCB0aW1lICE9PSB0aW1lWyAwIF0gKSApIHtcblxuXHRcdFx0XHRpZiAoICEgc21vb3RoSW50ZXJwb2xhdGlvbiApIHtcblxuXHRcdFx0XHRcdC8vIHJlbW92ZSB1bm5lY2Vzc2FyeSBrZXlmcmFtZXMgc2FtZSBhcyB0aGVpciBuZWlnaGJvcnNcblxuXHRcdFx0XHRcdHZhciBvZmZzZXQgPSBpICogc3RyaWRlLFxuXHRcdFx0XHRcdFx0b2Zmc2V0UCA9IG9mZnNldCAtIHN0cmlkZSxcblx0XHRcdFx0XHRcdG9mZnNldE4gPSBvZmZzZXQgKyBzdHJpZGU7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApIHtcblxuXHRcdFx0XHRcdFx0dmFyIHZhbHVlID0gdmFsdWVzWyBvZmZzZXQgKyBqIF07XG5cblx0XHRcdFx0XHRcdGlmICggdmFsdWUgIT09IHZhbHVlc1sgb2Zmc2V0UCArIGogXSB8fFxuXHRcdFx0XHRcdFx0XHR2YWx1ZSAhPT0gdmFsdWVzWyBvZmZzZXROICsgaiBdICkge1xuXG5cdFx0XHRcdFx0XHRcdGtlZXAgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRrZWVwID0gdHJ1ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gaW4tcGxhY2UgY29tcGFjdGlvblxuXG5cdFx0XHRpZiAoIGtlZXAgKSB7XG5cblx0XHRcdFx0aWYgKCBpICE9PSB3cml0ZUluZGV4ICkge1xuXG5cdFx0XHRcdFx0dGltZXNbIHdyaXRlSW5kZXggXSA9IHRpbWVzWyBpIF07XG5cblx0XHRcdFx0XHR2YXIgcmVhZE9mZnNldCA9IGkgKiBzdHJpZGUsXG5cdFx0XHRcdFx0XHR3cml0ZU9mZnNldCA9IHdyaXRlSW5kZXggKiBzdHJpZGU7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApIHtcblxuXHRcdFx0XHRcdFx0dmFsdWVzWyB3cml0ZU9mZnNldCArIGogXSA9IHZhbHVlc1sgcmVhZE9mZnNldCArIGogXTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Kysgd3JpdGVJbmRleDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gZmx1c2ggbGFzdCBrZXlmcmFtZSAoY29tcGFjdGlvbiBsb29rcyBhaGVhZClcblxuXHRcdGlmICggbGFzdEluZGV4ID4gMCApIHtcblxuXHRcdFx0dGltZXNbIHdyaXRlSW5kZXggXSA9IHRpbWVzWyBsYXN0SW5kZXggXTtcblxuXHRcdFx0Zm9yICggdmFyIHJlYWRPZmZzZXQgPSBsYXN0SW5kZXggKiBzdHJpZGUsIHdyaXRlT2Zmc2V0ID0gd3JpdGVJbmRleCAqIHN0cmlkZSwgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApIHtcblxuXHRcdFx0XHR2YWx1ZXNbIHdyaXRlT2Zmc2V0ICsgaiBdID0gdmFsdWVzWyByZWFkT2Zmc2V0ICsgaiBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdCsrIHdyaXRlSW5kZXg7XG5cblx0XHR9XG5cblx0XHRpZiAoIHdyaXRlSW5kZXggIT09IHRpbWVzLmxlbmd0aCApIHtcblxuXHRcdFx0dGhpcy50aW1lcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHRpbWVzLCAwLCB3cml0ZUluZGV4ICk7XG5cdFx0XHR0aGlzLnZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHZhbHVlcywgMCwgd3JpdGVJbmRleCAqIHN0cmlkZSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgb2YgdmVjdG9yZWQga2V5ZnJhbWUgdmFsdWVzLlxuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gVmVjdG9yS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcblxuXHRLZXlmcmFtZVRyYWNrLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTtcblxufVxuXG5WZWN0b3JLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogVmVjdG9yS2V5ZnJhbWVUcmFjayxcblxuXHRWYWx1ZVR5cGVOYW1lOiAndmVjdG9yJ1xuXG5cdC8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWRcblxuXHQvLyBEZWZhdWx0SW50ZXJwb2xhdGlvbiBpcyBpbmhlcml0ZWRcblxufSApO1xuXG4vKipcbiAqXG4gKiBSZXVzYWJsZSBzZXQgb2YgVHJhY2tzIHRoYXQgcmVwcmVzZW50IGFuIGFuaW1hdGlvbi5cbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKi9cblxuZnVuY3Rpb24gQW5pbWF0aW9uQ2xpcCggbmFtZSwgZHVyYXRpb24sIHRyYWNrcyApIHtcblxuXHR0aGlzLm5hbWUgPSBuYW1lO1xuXHR0aGlzLnRyYWNrcyA9IHRyYWNrcztcblx0dGhpcy5kdXJhdGlvbiA9ICggZHVyYXRpb24gIT09IHVuZGVmaW5lZCApID8gZHVyYXRpb24gOiAtIDE7XG5cblx0dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0Ly8gdGhpcyBtZWFucyBpdCBzaG91bGQgZmlndXJlIG91dCBpdHMgZHVyYXRpb24gYnkgc2Nhbm5pbmcgdGhlIHRyYWNrc1xuXHRpZiAoIHRoaXMuZHVyYXRpb24gPCAwICkge1xuXG5cdFx0dGhpcy5yZXNldER1cmF0aW9uKCk7XG5cblx0fVxuXG5cdHRoaXMub3B0aW1pemUoKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBBbmltYXRpb25DbGlwLCB7XG5cblx0cGFyc2U6IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdHZhciB0cmFja3MgPSBbXSxcblx0XHRcdGpzb25UcmFja3MgPSBqc29uLnRyYWNrcyxcblx0XHRcdGZyYW1lVGltZSA9IDEuMCAvICgganNvbi5mcHMgfHwgMS4wICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBqc29uVHJhY2tzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0dHJhY2tzLnB1c2goIEtleWZyYW1lVHJhY2sucGFyc2UoIGpzb25UcmFja3NbIGkgXSApLnNjYWxlKCBmcmFtZVRpbWUgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBBbmltYXRpb25DbGlwKCBqc29uLm5hbWUsIGpzb24uZHVyYXRpb24sIHRyYWNrcyApO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIGNsaXAgKSB7XG5cblx0XHR2YXIgdHJhY2tzID0gW10sXG5cdFx0XHRjbGlwVHJhY2tzID0gY2xpcC50cmFja3M7XG5cblx0XHR2YXIganNvbiA9IHtcblxuXHRcdFx0J25hbWUnOiBjbGlwLm5hbWUsXG5cdFx0XHQnZHVyYXRpb24nOiBjbGlwLmR1cmF0aW9uLFxuXHRcdFx0J3RyYWNrcyc6IHRyYWNrc1xuXG5cdFx0fTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGNsaXBUcmFja3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR0cmFja3MucHVzaCggS2V5ZnJhbWVUcmFjay50b0pTT04oIGNsaXBUcmFja3NbIGkgXSApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4ganNvbjtcblxuXHR9LFxuXG5cdENyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlOiBmdW5jdGlvbiAoIG5hbWUsIG1vcnBoVGFyZ2V0U2VxdWVuY2UsIGZwcywgbm9Mb29wICkge1xuXG5cdFx0dmFyIG51bU1vcnBoVGFyZ2V0cyA9IG1vcnBoVGFyZ2V0U2VxdWVuY2UubGVuZ3RoO1xuXHRcdHZhciB0cmFja3MgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IG51bU1vcnBoVGFyZ2V0czsgaSArKyApIHtcblxuXHRcdFx0dmFyIHRpbWVzID0gW107XG5cdFx0XHR2YXIgdmFsdWVzID0gW107XG5cblx0XHRcdHRpbWVzLnB1c2goXG5cdFx0XHRcdCggaSArIG51bU1vcnBoVGFyZ2V0cyAtIDEgKSAlIG51bU1vcnBoVGFyZ2V0cyxcblx0XHRcdFx0aSxcblx0XHRcdFx0KCBpICsgMSApICUgbnVtTW9ycGhUYXJnZXRzICk7XG5cblx0XHRcdHZhbHVlcy5wdXNoKCAwLCAxLCAwICk7XG5cblx0XHRcdHZhciBvcmRlciA9IEFuaW1hdGlvblV0aWxzLmdldEtleWZyYW1lT3JkZXIoIHRpbWVzICk7XG5cdFx0XHR0aW1lcyA9IEFuaW1hdGlvblV0aWxzLnNvcnRlZEFycmF5KCB0aW1lcywgMSwgb3JkZXIgKTtcblx0XHRcdHZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLnNvcnRlZEFycmF5KCB2YWx1ZXMsIDEsIG9yZGVyICk7XG5cblx0XHRcdC8vIGlmIHRoZXJlIGlzIGEga2V5IGF0IHRoZSBmaXJzdCBmcmFtZSwgZHVwbGljYXRlIGl0IGFzIHRoZVxuXHRcdFx0Ly8gbGFzdCBmcmFtZSBhcyB3ZWxsIGZvciBwZXJmZWN0IGxvb3AuXG5cdFx0XHRpZiAoICEgbm9Mb29wICYmIHRpbWVzWyAwIF0gPT09IDAgKSB7XG5cblx0XHRcdFx0dGltZXMucHVzaCggbnVtTW9ycGhUYXJnZXRzICk7XG5cdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZXNbIDAgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRyYWNrcy5wdXNoKFxuXHRcdFx0XHRuZXcgTnVtYmVyS2V5ZnJhbWVUcmFjayhcblx0XHRcdFx0XHQnLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1snICsgbW9ycGhUYXJnZXRTZXF1ZW5jZVsgaSBdLm5hbWUgKyAnXScsXG5cdFx0XHRcdFx0dGltZXMsIHZhbHVlc1xuXHRcdFx0XHQpLnNjYWxlKCAxLjAgLyBmcHMgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBBbmltYXRpb25DbGlwKCBuYW1lLCAtIDEsIHRyYWNrcyApO1xuXG5cdH0sXG5cblx0ZmluZEJ5TmFtZTogZnVuY3Rpb24gKCBvYmplY3RPckNsaXBBcnJheSwgbmFtZSApIHtcblxuXHRcdHZhciBjbGlwQXJyYXkgPSBvYmplY3RPckNsaXBBcnJheTtcblxuXHRcdGlmICggISBBcnJheS5pc0FycmF5KCBvYmplY3RPckNsaXBBcnJheSApICkge1xuXG5cdFx0XHR2YXIgbyA9IG9iamVjdE9yQ2xpcEFycmF5O1xuXHRcdFx0Y2xpcEFycmF5ID0gby5nZW9tZXRyeSAmJiBvLmdlb21ldHJ5LmFuaW1hdGlvbnMgfHwgby5hbmltYXRpb25zO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgY2xpcEFycmF5Lmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0aWYgKCBjbGlwQXJyYXlbIGkgXS5uYW1lID09PSBuYW1lICkge1xuXG5cdFx0XHRcdHJldHVybiBjbGlwQXJyYXlbIGkgXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cblx0fSxcblxuXHRDcmVhdGVDbGlwc0Zyb21Nb3JwaFRhcmdldFNlcXVlbmNlczogZnVuY3Rpb24gKCBtb3JwaFRhcmdldHMsIGZwcywgbm9Mb29wICkge1xuXG5cdFx0dmFyIGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzID0ge307XG5cblx0XHQvLyB0ZXN0ZWQgd2l0aCBodHRwczovL3JlZ2V4MTAxLmNvbS8gb24gdHJpY2sgc2VxdWVuY2VzXG5cdFx0Ly8gc3VjaCBmbGFtaW5nb19mbHlBXzAwMywgZmxhbWluZ29fcnVuMV8wMDMsIGNyZGVhdGgwMDU5XG5cdFx0dmFyIHBhdHRlcm4gPSAvXihbXFx3LV0qPykoW1xcZF0rKSQvO1xuXG5cdFx0Ly8gc29ydCBtb3JwaCB0YXJnZXQgbmFtZXMgaW50byBhbmltYXRpb24gZ3JvdXBzIGJhc2VkXG5cdFx0Ly8gcGF0dGVybnMgbGlrZSBXYWxrXzAwMSwgV2Fsa18wMDIsIFJ1bl8wMDEsIFJ1bl8wMDJcblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgbW9ycGhUYXJnZXQgPSBtb3JwaFRhcmdldHNbIGkgXTtcblx0XHRcdHZhciBwYXJ0cyA9IG1vcnBoVGFyZ2V0Lm5hbWUubWF0Y2goIHBhdHRlcm4gKTtcblxuXHRcdFx0aWYgKCBwYXJ0cyAmJiBwYXJ0cy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHRcdHZhciBuYW1lID0gcGFydHNbIDEgXTtcblxuXHRcdFx0XHR2YXIgYW5pbWF0aW9uTW9ycGhUYXJnZXRzID0gYW5pbWF0aW9uVG9Nb3JwaFRhcmdldHNbIG5hbWUgXTtcblx0XHRcdFx0aWYgKCAhIGFuaW1hdGlvbk1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0XHRcdGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzWyBuYW1lIF0gPSBhbmltYXRpb25Nb3JwaFRhcmdldHMgPSBbXTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0YW5pbWF0aW9uTW9ycGhUYXJnZXRzLnB1c2goIG1vcnBoVGFyZ2V0ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBjbGlwcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIG5hbWUgaW4gYW5pbWF0aW9uVG9Nb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdGNsaXBzLnB1c2goIEFuaW1hdGlvbkNsaXAuQ3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2UoIG5hbWUsIGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzWyBuYW1lIF0sIGZwcywgbm9Mb29wICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBjbGlwcztcblxuXHR9LFxuXG5cdC8vIHBhcnNlIHRoZSBhbmltYXRpb24uaGllcmFyY2h5IGZvcm1hdFxuXHRwYXJzZUFuaW1hdGlvbjogZnVuY3Rpb24gKCBhbmltYXRpb24sIGJvbmVzICkge1xuXG5cdFx0aWYgKCAhIGFuaW1hdGlvbiApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkFuaW1hdGlvbkNsaXA6IE5vIGFuaW1hdGlvbiBpbiBKU09OTG9hZGVyIGRhdGEuJyApO1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHR9XG5cblx0XHR2YXIgYWRkTm9uZW1wdHlUcmFjayA9IGZ1bmN0aW9uICggdHJhY2tUeXBlLCB0cmFja05hbWUsIGFuaW1hdGlvbktleXMsIHByb3BlcnR5TmFtZSwgZGVzdFRyYWNrcyApIHtcblxuXHRcdFx0Ly8gb25seSByZXR1cm4gdHJhY2sgaWYgdGhlcmUgYXJlIGFjdHVhbGx5IGtleXMuXG5cdFx0XHRpZiAoIGFuaW1hdGlvbktleXMubGVuZ3RoICE9PSAwICkge1xuXG5cdFx0XHRcdHZhciB0aW1lcyA9IFtdO1xuXHRcdFx0XHR2YXIgdmFsdWVzID0gW107XG5cblx0XHRcdFx0QW5pbWF0aW9uVXRpbHMuZmxhdHRlbkpTT04oIGFuaW1hdGlvbktleXMsIHRpbWVzLCB2YWx1ZXMsIHByb3BlcnR5TmFtZSApO1xuXG5cdFx0XHRcdC8vIGVtcHR5IGtleXMgYXJlIGZpbHRlcmVkIG91dCwgc28gY2hlY2sgYWdhaW5cblx0XHRcdFx0aWYgKCB0aW1lcy5sZW5ndGggIT09IDAgKSB7XG5cblx0XHRcdFx0XHRkZXN0VHJhY2tzLnB1c2goIG5ldyB0cmFja1R5cGUoIHRyYWNrTmFtZSwgdGltZXMsIHZhbHVlcyApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdFx0dmFyIHRyYWNrcyA9IFtdO1xuXG5cdFx0dmFyIGNsaXBOYW1lID0gYW5pbWF0aW9uLm5hbWUgfHwgJ2RlZmF1bHQnO1xuXHRcdC8vIGF1dG9tYXRpYyBsZW5ndGggZGV0ZXJtaW5hdGlvbiBpbiBBbmltYXRpb25DbGlwLlxuXHRcdHZhciBkdXJhdGlvbiA9IGFuaW1hdGlvbi5sZW5ndGggfHwgLSAxO1xuXHRcdHZhciBmcHMgPSBhbmltYXRpb24uZnBzIHx8IDMwO1xuXG5cdFx0dmFyIGhpZXJhcmNoeVRyYWNrcyA9IGFuaW1hdGlvbi5oaWVyYXJjaHkgfHwgW107XG5cblx0XHRmb3IgKCB2YXIgaCA9IDA7IGggPCBoaWVyYXJjaHlUcmFja3MubGVuZ3RoOyBoICsrICkge1xuXG5cdFx0XHR2YXIgYW5pbWF0aW9uS2V5cyA9IGhpZXJhcmNoeVRyYWNrc1sgaCBdLmtleXM7XG5cblx0XHRcdC8vIHNraXAgZW1wdHkgdHJhY2tzXG5cdFx0XHRpZiAoICEgYW5pbWF0aW9uS2V5cyB8fCBhbmltYXRpb25LZXlzLmxlbmd0aCA9PT0gMCApIGNvbnRpbnVlO1xuXG5cdFx0XHQvLyBwcm9jZXNzIG1vcnBoIHRhcmdldHNcblx0XHRcdGlmICggYW5pbWF0aW9uS2V5c1sgMCBdLm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0XHQvLyBmaWd1cmUgb3V0IGFsbCBtb3JwaCB0YXJnZXRzIHVzZWQgaW4gdGhpcyB0cmFja1xuXHRcdFx0XHR2YXIgbW9ycGhUYXJnZXROYW1lcyA9IHt9O1xuXG5cdFx0XHRcdGZvciAoIHZhciBrID0gMDsgayA8IGFuaW1hdGlvbktleXMubGVuZ3RoOyBrICsrICkge1xuXG5cdFx0XHRcdFx0aWYgKCBhbmltYXRpb25LZXlzWyBrIF0ubW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgbSA9IDA7IG0gPCBhbmltYXRpb25LZXlzWyBrIF0ubW9ycGhUYXJnZXRzLmxlbmd0aDsgbSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRtb3JwaFRhcmdldE5hbWVzWyBhbmltYXRpb25LZXlzWyBrIF0ubW9ycGhUYXJnZXRzWyBtIF0gXSA9IC0gMTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBjcmVhdGUgYSB0cmFjayBmb3IgZWFjaCBtb3JwaCB0YXJnZXQgd2l0aCBhbGwgemVyb1xuXHRcdFx0XHQvLyBtb3JwaFRhcmdldEluZmx1ZW5jZXMgZXhjZXB0IGZvciB0aGUga2V5cyBpbiB3aGljaFxuXHRcdFx0XHQvLyB0aGUgbW9ycGhUYXJnZXQgaXMgbmFtZWQuXG5cdFx0XHRcdGZvciAoIHZhciBtb3JwaFRhcmdldE5hbWUgaW4gbW9ycGhUYXJnZXROYW1lcyApIHtcblxuXHRcdFx0XHRcdHZhciB0aW1lcyA9IFtdO1xuXHRcdFx0XHRcdHZhciB2YWx1ZXMgPSBbXTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBtID0gMDsgbSAhPT0gYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBoVGFyZ2V0cy5sZW5ndGg7ICsrIG0gKSB7XG5cblx0XHRcdFx0XHRcdHZhciBhbmltYXRpb25LZXkgPSBhbmltYXRpb25LZXlzWyBrIF07XG5cblx0XHRcdFx0XHRcdHRpbWVzLnB1c2goIGFuaW1hdGlvbktleS50aW1lICk7XG5cdFx0XHRcdFx0XHR2YWx1ZXMucHVzaCggKCBhbmltYXRpb25LZXkubW9ycGhUYXJnZXQgPT09IG1vcnBoVGFyZ2V0TmFtZSApID8gMSA6IDAgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRyYWNrcy5wdXNoKCBuZXcgTnVtYmVyS2V5ZnJhbWVUcmFjayggJy5tb3JwaFRhcmdldEluZmx1ZW5jZVsnICsgbW9ycGhUYXJnZXROYW1lICsgJ10nLCB0aW1lcywgdmFsdWVzICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZHVyYXRpb24gPSBtb3JwaFRhcmdldE5hbWVzLmxlbmd0aCAqICggZnBzIHx8IDEuMCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIC4uLmFzc3VtZSBza2VsZXRhbCBhbmltYXRpb25cblxuXHRcdFx0XHR2YXIgYm9uZU5hbWUgPSAnLmJvbmVzWycgKyBib25lc1sgaCBdLm5hbWUgKyAnXSc7XG5cblx0XHRcdFx0YWRkTm9uZW1wdHlUcmFjayhcblx0XHRcdFx0XHRWZWN0b3JLZXlmcmFtZVRyYWNrLCBib25lTmFtZSArICcucG9zaXRpb24nLFxuXHRcdFx0XHRcdGFuaW1hdGlvbktleXMsICdwb3MnLCB0cmFja3MgKTtcblxuXHRcdFx0XHRhZGROb25lbXB0eVRyYWNrKFxuXHRcdFx0XHRcdFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLCBib25lTmFtZSArICcucXVhdGVybmlvbicsXG5cdFx0XHRcdFx0YW5pbWF0aW9uS2V5cywgJ3JvdCcsIHRyYWNrcyApO1xuXG5cdFx0XHRcdGFkZE5vbmVtcHR5VHJhY2soXG5cdFx0XHRcdFx0VmVjdG9yS2V5ZnJhbWVUcmFjaywgYm9uZU5hbWUgKyAnLnNjYWxlJyxcblx0XHRcdFx0XHRhbmltYXRpb25LZXlzLCAnc2NsJywgdHJhY2tzICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdHJhY2tzLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHR9XG5cblx0XHR2YXIgY2xpcCA9IG5ldyBBbmltYXRpb25DbGlwKCBjbGlwTmFtZSwgZHVyYXRpb24sIHRyYWNrcyApO1xuXG5cdFx0cmV0dXJuIGNsaXA7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEFuaW1hdGlvbkNsaXAucHJvdG90eXBlLCB7XG5cblx0cmVzZXREdXJhdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHRyYWNrcyA9IHRoaXMudHJhY2tzLCBkdXJhdGlvbiA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSB0cmFja3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR2YXIgdHJhY2sgPSB0aGlzLnRyYWNrc1sgaSBdO1xuXG5cdFx0XHRkdXJhdGlvbiA9IE1hdGgubWF4KCBkdXJhdGlvbiwgdHJhY2sudGltZXNbIHRyYWNrLnRpbWVzLmxlbmd0aCAtIDEgXSApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5kdXJhdGlvbiA9IGR1cmF0aW9uO1xuXG5cdH0sXG5cblx0dHJpbTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy50cmFja3MubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnRyYWNrc1sgaSBdLnRyaW0oIDAsIHRoaXMuZHVyYXRpb24gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0b3B0aW1pemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMudHJhY2tzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy50cmFja3NbIGkgXS5vcHRpbWl6ZSgpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBNYXRlcmlhbExvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblx0dGhpcy50ZXh0dXJlcyA9IHt9O1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIE1hdGVyaWFsTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCBzY29wZS5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCB0ZXh0ICkge1xuXG5cdFx0XHRvbkxvYWQoIHNjb3BlLnBhcnNlKCBKU09OLnBhcnNlKCB0ZXh0ICkgKSApO1xuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdH0sXG5cblx0c2V0VGV4dHVyZXM6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnRleHR1cmVzID0gdmFsdWU7XG5cblx0fSxcblxuXHRwYXJzZTogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0dmFyIHRleHR1cmVzID0gdGhpcy50ZXh0dXJlcztcblxuXHRcdGZ1bmN0aW9uIGdldFRleHR1cmUoIG5hbWUgKSB7XG5cblx0XHRcdGlmICggdGV4dHVyZXNbIG5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGVyaWFsTG9hZGVyOiBVbmRlZmluZWQgdGV4dHVyZScsIG5hbWUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGV4dHVyZXNbIG5hbWUgXTtcblxuXHRcdH1cblxuXHRcdHZhciBtYXRlcmlhbCA9IG5ldyBNYXRlcmlhbHNbIGpzb24udHlwZSBdKCk7XG5cblx0XHRpZiAoIGpzb24udXVpZCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudXVpZCA9IGpzb24udXVpZDtcblx0XHRpZiAoIGpzb24ubmFtZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubmFtZSA9IGpzb24ubmFtZTtcblx0XHRpZiAoIGpzb24uY29sb3IgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNvbG9yLnNldEhleCgganNvbi5jb2xvciApO1xuXHRcdGlmICgganNvbi5yb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJvdWdobmVzcyA9IGpzb24ucm91Z2huZXNzO1xuXHRcdGlmICgganNvbi5tZXRhbG5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1ldGFsbmVzcyA9IGpzb24ubWV0YWxuZXNzO1xuXHRcdGlmICgganNvbi5lbWlzc2l2ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW1pc3NpdmUuc2V0SGV4KCBqc29uLmVtaXNzaXZlICk7XG5cdFx0aWYgKCBqc29uLnNwZWN1bGFyICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zcGVjdWxhci5zZXRIZXgoIGpzb24uc3BlY3VsYXIgKTtcblx0XHRpZiAoIGpzb24uc2hpbmluZXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaGluaW5lc3MgPSBqc29uLnNoaW5pbmVzcztcblx0XHRpZiAoIGpzb24uY2xlYXJDb2F0ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jbGVhckNvYXQgPSBqc29uLmNsZWFyQ29hdDtcblx0XHRpZiAoIGpzb24uY2xlYXJDb2F0Um91Z2huZXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MgPSBqc29uLmNsZWFyQ29hdFJvdWdobmVzcztcblx0XHRpZiAoIGpzb24udW5pZm9ybXMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnVuaWZvcm1zID0ganNvbi51bmlmb3Jtcztcblx0XHRpZiAoIGpzb24udmVydGV4U2hhZGVyICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC52ZXJ0ZXhTaGFkZXIgPSBqc29uLnZlcnRleFNoYWRlcjtcblx0XHRpZiAoIGpzb24uZnJhZ21lbnRTaGFkZXIgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZyYWdtZW50U2hhZGVyID0ganNvbi5mcmFnbWVudFNoYWRlcjtcblx0XHRpZiAoIGpzb24udmVydGV4Q29sb3JzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC52ZXJ0ZXhDb2xvcnMgPSBqc29uLnZlcnRleENvbG9ycztcblx0XHRpZiAoIGpzb24uZm9nICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5mb2cgPSBqc29uLmZvZztcblx0XHRpZiAoIGpzb24uZmxhdFNoYWRpbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZsYXRTaGFkaW5nID0ganNvbi5mbGF0U2hhZGluZztcblx0XHRpZiAoIGpzb24uYmxlbmRpbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmJsZW5kaW5nID0ganNvbi5ibGVuZGluZztcblx0XHRpZiAoIGpzb24uc2lkZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2lkZSA9IGpzb24uc2lkZTtcblx0XHRpZiAoIGpzb24ub3BhY2l0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwub3BhY2l0eSA9IGpzb24ub3BhY2l0eTtcblx0XHRpZiAoIGpzb24udHJhbnNwYXJlbnQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnRyYW5zcGFyZW50ID0ganNvbi50cmFuc3BhcmVudDtcblx0XHRpZiAoIGpzb24uYWxwaGFUZXN0ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hbHBoYVRlc3QgPSBqc29uLmFscGhhVGVzdDtcblx0XHRpZiAoIGpzb24uZGVwdGhUZXN0ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kZXB0aFRlc3QgPSBqc29uLmRlcHRoVGVzdDtcblx0XHRpZiAoIGpzb24uZGVwdGhXcml0ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGVwdGhXcml0ZSA9IGpzb24uZGVwdGhXcml0ZTtcblx0XHRpZiAoIGpzb24uY29sb3JXcml0ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY29sb3JXcml0ZSA9IGpzb24uY29sb3JXcml0ZTtcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC53aXJlZnJhbWUgPSBqc29uLndpcmVmcmFtZTtcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lTGluZXdpZHRoICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC53aXJlZnJhbWVMaW5ld2lkdGggPSBqc29uLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lTGluZWNhcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwud2lyZWZyYW1lTGluZWNhcCA9IGpzb24ud2lyZWZyYW1lTGluZWNhcDtcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lTGluZWpvaW4gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLndpcmVmcmFtZUxpbmVqb2luID0ganNvbi53aXJlZnJhbWVMaW5lam9pbjtcblxuXHRcdGlmICgganNvbi5yb3RhdGlvbiAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucm90YXRpb24gPSBqc29uLnJvdGF0aW9uO1xuXG5cdFx0aWYgKCBqc29uLmxpbmV3aWR0aCAhPT0gMSApIG1hdGVyaWFsLmxpbmV3aWR0aCA9IGpzb24ubGluZXdpZHRoO1xuXHRcdGlmICgganNvbi5kYXNoU2l6ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGFzaFNpemUgPSBqc29uLmRhc2hTaXplO1xuXHRcdGlmICgganNvbi5nYXBTaXplICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5nYXBTaXplID0ganNvbi5nYXBTaXplO1xuXHRcdGlmICgganNvbi5zY2FsZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2NhbGUgPSBqc29uLnNjYWxlO1xuXG5cdFx0aWYgKCBqc29uLnBvbHlnb25PZmZzZXQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnBvbHlnb25PZmZzZXQgPSBqc29uLnBvbHlnb25PZmZzZXQ7XG5cdFx0aWYgKCBqc29uLnBvbHlnb25PZmZzZXRGYWN0b3IgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnBvbHlnb25PZmZzZXRGYWN0b3IgPSBqc29uLnBvbHlnb25PZmZzZXRGYWN0b3I7XG5cdFx0aWYgKCBqc29uLnBvbHlnb25PZmZzZXRVbml0cyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucG9seWdvbk9mZnNldFVuaXRzID0ganNvbi5wb2x5Z29uT2Zmc2V0VW5pdHM7XG5cblx0XHRpZiAoIGpzb24uc2tpbm5pbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNraW5uaW5nID0ganNvbi5za2lubmluZztcblx0XHRpZiAoIGpzb24ubW9ycGhUYXJnZXRzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5tb3JwaFRhcmdldHMgPSBqc29uLm1vcnBoVGFyZ2V0cztcblx0XHRpZiAoIGpzb24uZGl0aGVyaW5nICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kaXRoZXJpbmcgPSBqc29uLmRpdGhlcmluZztcblxuXHRcdGlmICgganNvbi52aXNpYmxlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC52aXNpYmxlID0ganNvbi52aXNpYmxlO1xuXHRcdGlmICgganNvbi51c2VyRGF0YSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudXNlckRhdGEgPSBqc29uLnVzZXJEYXRhO1xuXG5cdFx0Ly8gRGVwcmVjYXRlZFxuXG5cdFx0aWYgKCBqc29uLnNoYWRpbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZsYXRTaGFkaW5nID0ganNvbi5zaGFkaW5nID09PSAxOyAvLyBUSFJFRS5GbGF0U2hhZGluZ1xuXG5cdFx0Ly8gZm9yIFBvaW50c01hdGVyaWFsXG5cblx0XHRpZiAoIGpzb24uc2l6ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2l6ZSA9IGpzb24uc2l6ZTtcblx0XHRpZiAoIGpzb24uc2l6ZUF0dGVudWF0aW9uICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaXplQXR0ZW51YXRpb24gPSBqc29uLnNpemVBdHRlbnVhdGlvbjtcblxuXHRcdC8vIG1hcHNcblxuXHRcdGlmICgganNvbi5tYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1hcCA9IGdldFRleHR1cmUoIGpzb24ubWFwICk7XG5cblx0XHRpZiAoIGpzb24uYWxwaGFNYXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0bWF0ZXJpYWwuYWxwaGFNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmFscGhhTWFwICk7XG5cdFx0XHRtYXRlcmlhbC50cmFuc3BhcmVudCA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIGpzb24uYnVtcE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYnVtcE1hcCA9IGdldFRleHR1cmUoIGpzb24uYnVtcE1hcCApO1xuXHRcdGlmICgganNvbi5idW1wU2NhbGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmJ1bXBTY2FsZSA9IGpzb24uYnVtcFNjYWxlO1xuXG5cdFx0aWYgKCBqc29uLm5vcm1hbE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubm9ybWFsTWFwID0gZ2V0VGV4dHVyZSgganNvbi5ub3JtYWxNYXAgKTtcblx0XHRpZiAoIGpzb24ubm9ybWFsU2NhbGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIG5vcm1hbFNjYWxlID0ganNvbi5ub3JtYWxTY2FsZTtcblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBub3JtYWxTY2FsZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHQvLyBCbGVuZGVyIGV4cG9ydGVyIHVzZWQgdG8gZXhwb3J0IGEgc2NhbGFyLiBTZWUgIzc0NTlcblxuXHRcdFx0XHRub3JtYWxTY2FsZSA9IFsgbm9ybWFsU2NhbGUsIG5vcm1hbFNjYWxlIF07XG5cblx0XHRcdH1cblxuXHRcdFx0bWF0ZXJpYWwubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMigpLmZyb21BcnJheSggbm9ybWFsU2NhbGUgKTtcblxuXHRcdH1cblxuXHRcdGlmICgganNvbi5kaXNwbGFjZW1lbnRNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCA9IGdldFRleHR1cmUoIGpzb24uZGlzcGxhY2VtZW50TWFwICk7XG5cdFx0aWYgKCBqc29uLmRpc3BsYWNlbWVudFNjYWxlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZSA9IGpzb24uZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0aWYgKCBqc29uLmRpc3BsYWNlbWVudEJpYXMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXMgPSBqc29uLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHRpZiAoIGpzb24ucm91Z2huZXNzTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5yb3VnaG5lc3NNYXAgPSBnZXRUZXh0dXJlKCBqc29uLnJvdWdobmVzc01hcCApO1xuXHRcdGlmICgganNvbi5tZXRhbG5lc3NNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1ldGFsbmVzc01hcCA9IGdldFRleHR1cmUoIGpzb24ubWV0YWxuZXNzTWFwICk7XG5cblx0XHRpZiAoIGpzb24uZW1pc3NpdmVNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmVtaXNzaXZlTWFwID0gZ2V0VGV4dHVyZSgganNvbi5lbWlzc2l2ZU1hcCApO1xuXHRcdGlmICgganNvbi5lbWlzc2l2ZUludGVuc2l0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW1pc3NpdmVJbnRlbnNpdHkgPSBqc29uLmVtaXNzaXZlSW50ZW5zaXR5O1xuXG5cdFx0aWYgKCBqc29uLnNwZWN1bGFyTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zcGVjdWxhck1hcCA9IGdldFRleHR1cmUoIGpzb24uc3BlY3VsYXJNYXAgKTtcblxuXHRcdGlmICgganNvbi5lbnZNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmVudk1hcCA9IGdldFRleHR1cmUoIGpzb24uZW52TWFwICk7XG5cblx0XHRpZiAoIGpzb24ucmVmbGVjdGl2aXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5yZWZsZWN0aXZpdHkgPSBqc29uLnJlZmxlY3Rpdml0eTtcblxuXHRcdGlmICgganNvbi5saWdodE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubGlnaHRNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmxpZ2h0TWFwICk7XG5cdFx0aWYgKCBqc29uLmxpZ2h0TWFwSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5saWdodE1hcEludGVuc2l0eSA9IGpzb24ubGlnaHRNYXBJbnRlbnNpdHk7XG5cblx0XHRpZiAoIGpzb24uYW9NYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmFvTWFwID0gZ2V0VGV4dHVyZSgganNvbi5hb01hcCApO1xuXHRcdGlmICgganNvbi5hb01hcEludGVuc2l0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYW9NYXBJbnRlbnNpdHkgPSBqc29uLmFvTWFwSW50ZW5zaXR5O1xuXG5cdFx0aWYgKCBqc29uLmdyYWRpZW50TWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ncmFkaWVudE1hcCA9IGdldFRleHR1cmUoIGpzb24uZ3JhZGllbnRNYXAgKTtcblxuXHRcdHJldHVybiBtYXRlcmlhbDtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEJ1ZmZlckdlb21ldHJ5TG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEJ1ZmZlckdlb21ldHJ5TG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCBzY29wZS5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCB0ZXh0ICkge1xuXG5cdFx0XHRvbkxvYWQoIHNjb3BlLnBhcnNlKCBKU09OLnBhcnNlKCB0ZXh0ICkgKSApO1xuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdH0sXG5cblx0cGFyc2U6IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdFx0dmFyIGluZGV4ID0ganNvbi5kYXRhLmluZGV4O1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgdHlwZWRBcnJheSA9IG5ldyBUWVBFRF9BUlJBWVNbIGluZGV4LnR5cGUgXSggaW5kZXguYXJyYXkgKTtcblx0XHRcdGdlb21ldHJ5LnNldEluZGV4KCBuZXcgQnVmZmVyQXR0cmlidXRlKCB0eXBlZEFycmF5LCAxICkgKTtcblxuXHRcdH1cblxuXHRcdHZhciBhdHRyaWJ1dGVzID0ganNvbi5kYXRhLmF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCB2YXIga2V5IGluIGF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzWyBrZXkgXTtcblx0XHRcdHZhciB0eXBlZEFycmF5ID0gbmV3IFRZUEVEX0FSUkFZU1sgYXR0cmlidXRlLnR5cGUgXSggYXR0cmlidXRlLmFycmF5ICk7XG5cblx0XHRcdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSgga2V5LCBuZXcgQnVmZmVyQXR0cmlidXRlKCB0eXBlZEFycmF5LCBhdHRyaWJ1dGUuaXRlbVNpemUsIGF0dHJpYnV0ZS5ub3JtYWxpemVkICkgKTtcblxuXHRcdH1cblxuXHRcdHZhciBncm91cHMgPSBqc29uLmRhdGEuZ3JvdXBzIHx8IGpzb24uZGF0YS5kcmF3Y2FsbHMgfHwganNvbi5kYXRhLm9mZnNldHM7XG5cblx0XHRpZiAoIGdyb3VwcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBncm91cHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdHZhciBncm91cCA9IGdyb3Vwc1sgaSBdO1xuXG5cdFx0XHRcdGdlb21ldHJ5LmFkZEdyb3VwKCBncm91cC5zdGFydCwgZ3JvdXAuY291bnQsIGdyb3VwLm1hdGVyaWFsSW5kZXggKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGJvdW5kaW5nU3BoZXJlID0ganNvbi5kYXRhLmJvdW5kaW5nU3BoZXJlO1xuXG5cdFx0aWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgY2VudGVyID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0aWYgKCBib3VuZGluZ1NwaGVyZS5jZW50ZXIgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjZW50ZXIuZnJvbUFycmF5KCBib3VuZGluZ1NwaGVyZS5jZW50ZXIgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9IG5ldyBTcGhlcmUoIGNlbnRlciwgYm91bmRpbmdTcGhlcmUucmFkaXVzICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZ2VvbWV0cnk7XG5cblx0fVxuXG59ICk7XG5cbnZhciBUWVBFRF9BUlJBWVMgPSB7XG5cdEludDhBcnJheTogSW50OEFycmF5LFxuXHRVaW50OEFycmF5OiBVaW50OEFycmF5LFxuXHQvLyBXb3JrYXJvdW5kIGZvciBJRTExIHByZSBLQjI5Mjk0MzcuIFNlZSAjMTE0NDBcblx0VWludDhDbGFtcGVkQXJyYXk6IHR5cGVvZiBVaW50OENsYW1wZWRBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OENsYW1wZWRBcnJheSA6IFVpbnQ4QXJyYXksXG5cdEludDE2QXJyYXk6IEludDE2QXJyYXksXG5cdFVpbnQxNkFycmF5OiBVaW50MTZBcnJheSxcblx0SW50MzJBcnJheTogSW50MzJBcnJheSxcblx0VWludDMyQXJyYXk6IFVpbnQzMkFycmF5LFxuXHRGbG9hdDMyQXJyYXk6IEZsb2F0MzJBcnJheSxcblx0RmxvYXQ2NEFycmF5OiBGbG9hdDY0QXJyYXlcbn07XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMb2FkZXIoKSB7fVxuXG5Mb2FkZXIuSGFuZGxlcnMgPSB7XG5cblx0aGFuZGxlcnM6IFtdLFxuXG5cdGFkZDogZnVuY3Rpb24gKCByZWdleCwgbG9hZGVyICkge1xuXG5cdFx0dGhpcy5oYW5kbGVycy5wdXNoKCByZWdleCwgbG9hZGVyICk7XG5cblx0fSxcblxuXHRnZXQ6IGZ1bmN0aW9uICggZmlsZSApIHtcblxuXHRcdHZhciBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGg7IGkgPCBsOyBpICs9IDIgKSB7XG5cblx0XHRcdHZhciByZWdleCA9IGhhbmRsZXJzWyBpIF07XG5cdFx0XHR2YXIgbG9hZGVyID0gaGFuZGxlcnNbIGkgKyAxIF07XG5cblx0XHRcdGlmICggcmVnZXgudGVzdCggZmlsZSApICkge1xuXG5cdFx0XHRcdHJldHVybiBsb2FkZXI7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXG5cdH1cblxufTtcblxuT2JqZWN0LmFzc2lnbiggTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGNyb3NzT3JpZ2luOiB1bmRlZmluZWQsXG5cblx0b25Mb2FkU3RhcnQ6IGZ1bmN0aW9uICgpIHt9LFxuXG5cdG9uTG9hZFByb2dyZXNzOiBmdW5jdGlvbiAoKSB7fSxcblxuXHRvbkxvYWRDb21wbGV0ZTogZnVuY3Rpb24gKCkge30sXG5cblx0aW5pdE1hdGVyaWFsczogZnVuY3Rpb24gKCBtYXRlcmlhbHMsIHRleHR1cmVQYXRoLCBjcm9zc09yaWdpbiApIHtcblxuXHRcdHZhciBhcnJheSA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbWF0ZXJpYWxzLmxlbmd0aDsgKysgaSApIHtcblxuXHRcdFx0YXJyYXlbIGkgXSA9IHRoaXMuY3JlYXRlTWF0ZXJpYWwoIG1hdGVyaWFsc1sgaSBdLCB0ZXh0dXJlUGF0aCwgY3Jvc3NPcmlnaW4gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdGNyZWF0ZU1hdGVyaWFsOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBCbGVuZGluZ01vZGUgPSB7XG5cdFx0XHROb0JsZW5kaW5nOiBOb0JsZW5kaW5nLFxuXHRcdFx0Tm9ybWFsQmxlbmRpbmc6IE5vcm1hbEJsZW5kaW5nLFxuXHRcdFx0QWRkaXRpdmVCbGVuZGluZzogQWRkaXRpdmVCbGVuZGluZyxcblx0XHRcdFN1YnRyYWN0aXZlQmxlbmRpbmc6IFN1YnRyYWN0aXZlQmxlbmRpbmcsXG5cdFx0XHRNdWx0aXBseUJsZW5kaW5nOiBNdWx0aXBseUJsZW5kaW5nLFxuXHRcdFx0Q3VzdG9tQmxlbmRpbmc6IEN1c3RvbUJsZW5kaW5nXG5cdFx0fTtcblxuXHRcdHZhciBjb2xvciA9IG5ldyBDb2xvcigpO1xuXHRcdHZhciB0ZXh0dXJlTG9hZGVyID0gbmV3IFRleHR1cmVMb2FkZXIoKTtcblx0XHR2YXIgbWF0ZXJpYWxMb2FkZXIgPSBuZXcgTWF0ZXJpYWxMb2FkZXIoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjcmVhdGVNYXRlcmlhbCggbSwgdGV4dHVyZVBhdGgsIGNyb3NzT3JpZ2luICkge1xuXG5cdFx0XHQvLyBjb252ZXJ0IGZyb20gb2xkIG1hdGVyaWFsIGZvcm1hdFxuXG5cdFx0XHR2YXIgdGV4dHVyZXMgPSB7fTtcblxuXHRcdFx0ZnVuY3Rpb24gbG9hZFRleHR1cmUoIHBhdGgsIHJlcGVhdCwgb2Zmc2V0LCB3cmFwLCBhbmlzb3Ryb3B5ICkge1xuXG5cdFx0XHRcdHZhciBmdWxsUGF0aCA9IHRleHR1cmVQYXRoICsgcGF0aDtcblx0XHRcdFx0dmFyIGxvYWRlciA9IExvYWRlci5IYW5kbGVycy5nZXQoIGZ1bGxQYXRoICk7XG5cblx0XHRcdFx0dmFyIHRleHR1cmU7XG5cblx0XHRcdFx0aWYgKCBsb2FkZXIgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlID0gbG9hZGVyLmxvYWQoIGZ1bGxQYXRoICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHRleHR1cmVMb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIGNyb3NzT3JpZ2luICk7XG5cdFx0XHRcdFx0dGV4dHVyZSA9IHRleHR1cmVMb2FkZXIubG9hZCggZnVsbFBhdGggKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCByZXBlYXQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUucmVwZWF0LmZyb21BcnJheSggcmVwZWF0ICk7XG5cblx0XHRcdFx0XHRpZiAoIHJlcGVhdFsgMCBdICE9PSAxICkgdGV4dHVyZS53cmFwUyA9IFJlcGVhdFdyYXBwaW5nO1xuXHRcdFx0XHRcdGlmICggcmVwZWF0WyAxIF0gIT09IDEgKSB0ZXh0dXJlLndyYXBUID0gUmVwZWF0V3JhcHBpbmc7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggb2Zmc2V0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLm9mZnNldC5mcm9tQXJyYXkoIG9mZnNldCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHdyYXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGlmICggd3JhcFsgMCBdID09PSAncmVwZWF0JyApIHRleHR1cmUud3JhcFMgPSBSZXBlYXRXcmFwcGluZztcblx0XHRcdFx0XHRpZiAoIHdyYXBbIDAgXSA9PT0gJ21pcnJvcicgKSB0ZXh0dXJlLndyYXBTID0gTWlycm9yZWRSZXBlYXRXcmFwcGluZztcblxuXHRcdFx0XHRcdGlmICggd3JhcFsgMSBdID09PSAncmVwZWF0JyApIHRleHR1cmUud3JhcFQgPSBSZXBlYXRXcmFwcGluZztcblx0XHRcdFx0XHRpZiAoIHdyYXBbIDEgXSA9PT0gJ21pcnJvcicgKSB0ZXh0dXJlLndyYXBUID0gTWlycm9yZWRSZXBlYXRXcmFwcGluZztcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBhbmlzb3Ryb3B5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLmFuaXNvdHJvcHkgPSBhbmlzb3Ryb3B5O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgdXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdFx0XHRcdHRleHR1cmVzWyB1dWlkIF0gPSB0ZXh0dXJlO1xuXG5cdFx0XHRcdHJldHVybiB1dWlkO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vXG5cblx0XHRcdHZhciBqc29uID0ge1xuXHRcdFx0XHR1dWlkOiBfTWF0aC5nZW5lcmF0ZVVVSUQoKSxcblx0XHRcdFx0dHlwZTogJ01lc2hMYW1iZXJ0TWF0ZXJpYWwnXG5cdFx0XHR9O1xuXG5cdFx0XHRmb3IgKCB2YXIgbmFtZSBpbiBtICkge1xuXG5cdFx0XHRcdHZhciB2YWx1ZSA9IG1bIG5hbWUgXTtcblxuXHRcdFx0XHRzd2l0Y2ggKCBuYW1lICkge1xuXG5cdFx0XHRcdFx0Y2FzZSAnRGJnQ29sb3InOlxuXHRcdFx0XHRcdGNhc2UgJ0RiZ0luZGV4Jzpcblx0XHRcdFx0XHRjYXNlICdvcHRpY2FsRGVuc2l0eSc6XG5cdFx0XHRcdFx0Y2FzZSAnaWxsdW1pbmF0aW9uJzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ0RiZ05hbWUnOlxuXHRcdFx0XHRcdFx0anNvbi5uYW1lID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdibGVuZGluZyc6XG5cdFx0XHRcdFx0XHRqc29uLmJsZW5kaW5nID0gQmxlbmRpbmdNb2RlWyB2YWx1ZSBdO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29sb3JBbWJpZW50Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBBbWJpZW50Jzpcblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxvYWRlci5jcmVhdGVNYXRlcmlhbDonLCBuYW1lLCAnaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4nICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdjb2xvckRpZmZ1c2UnOlxuXHRcdFx0XHRcdFx0anNvbi5jb2xvciA9IGNvbG9yLmZyb21BcnJheSggdmFsdWUgKS5nZXRIZXgoKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NvbG9yU3BlY3VsYXInOlxuXHRcdFx0XHRcdFx0anNvbi5zcGVjdWxhciA9IGNvbG9yLmZyb21BcnJheSggdmFsdWUgKS5nZXRIZXgoKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NvbG9yRW1pc3NpdmUnOlxuXHRcdFx0XHRcdFx0anNvbi5lbWlzc2l2ZSA9IGNvbG9yLmZyb21BcnJheSggdmFsdWUgKS5nZXRIZXgoKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3NwZWN1bGFyQ29lZic6XG5cdFx0XHRcdFx0XHRqc29uLnNoaW5pbmVzcyA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnc2hhZGluZyc6XG5cdFx0XHRcdFx0XHRpZiAoIHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09ICdiYXNpYycgKSBqc29uLnR5cGUgPSAnTWVzaEJhc2ljTWF0ZXJpYWwnO1xuXHRcdFx0XHRcdFx0aWYgKCB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSAncGhvbmcnICkganNvbi50eXBlID0gJ01lc2hQaG9uZ01hdGVyaWFsJztcblx0XHRcdFx0XHRcdGlmICggdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N0YW5kYXJkJyApIGpzb24udHlwZSA9ICdNZXNoU3RhbmRhcmRNYXRlcmlhbCc7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBEaWZmdXNlJzpcblx0XHRcdFx0XHRcdGpzb24ubWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcERpZmZ1c2VSZXBlYXQsIG0ubWFwRGlmZnVzZU9mZnNldCwgbS5tYXBEaWZmdXNlV3JhcCwgbS5tYXBEaWZmdXNlQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRGlmZnVzZVJlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRGlmZnVzZU9mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRGlmZnVzZVdyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcERpZmZ1c2VBbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEVtaXNzaXZlJzpcblx0XHRcdFx0XHRcdGpzb24uZW1pc3NpdmVNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwRW1pc3NpdmVSZXBlYXQsIG0ubWFwRW1pc3NpdmVPZmZzZXQsIG0ubWFwRW1pc3NpdmVXcmFwLCBtLm1hcEVtaXNzaXZlQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRW1pc3NpdmVSZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEVtaXNzaXZlT2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBFbWlzc2l2ZVdyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEVtaXNzaXZlQW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBMaWdodCc6XG5cdFx0XHRcdFx0XHRqc29uLmxpZ2h0TWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcExpZ2h0UmVwZWF0LCBtLm1hcExpZ2h0T2Zmc2V0LCBtLm1hcExpZ2h0V3JhcCwgbS5tYXBMaWdodEFuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcExpZ2h0UmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBMaWdodE9mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTGlnaHRXcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBMaWdodEFuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQU8nOlxuXHRcdFx0XHRcdFx0anNvbi5hb01hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBBT1JlcGVhdCwgbS5tYXBBT09mZnNldCwgbS5tYXBBT1dyYXAsIG0ubWFwQU9Bbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBBT1JlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQU9PZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEFPV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQU9Bbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEJ1bXAnOlxuXHRcdFx0XHRcdFx0anNvbi5idW1wTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcEJ1bXBSZXBlYXQsIG0ubWFwQnVtcE9mZnNldCwgbS5tYXBCdW1wV3JhcCwgbS5tYXBCdW1wQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQnVtcFNjYWxlJzpcblx0XHRcdFx0XHRcdGpzb24uYnVtcFNjYWxlID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBCdW1wUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBCdW1wT2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBCdW1wV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQnVtcEFuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTm9ybWFsJzpcblx0XHRcdFx0XHRcdGpzb24ubm9ybWFsTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcE5vcm1hbFJlcGVhdCwgbS5tYXBOb3JtYWxPZmZzZXQsIG0ubWFwTm9ybWFsV3JhcCwgbS5tYXBOb3JtYWxBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBOb3JtYWxGYWN0b3InOlxuXHRcdFx0XHRcdFx0anNvbi5ub3JtYWxTY2FsZSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTm9ybWFsUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBOb3JtYWxPZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcE5vcm1hbFdyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcE5vcm1hbEFuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwU3BlY3VsYXInOlxuXHRcdFx0XHRcdFx0anNvbi5zcGVjdWxhck1hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBTcGVjdWxhclJlcGVhdCwgbS5tYXBTcGVjdWxhck9mZnNldCwgbS5tYXBTcGVjdWxhcldyYXAsIG0ubWFwU3BlY3VsYXJBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBTcGVjdWxhclJlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwU3BlY3VsYXJPZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcFNwZWN1bGFyV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwU3BlY3VsYXJBbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcE1ldGFsbmVzcyc6XG5cdFx0XHRcdFx0XHRqc29uLm1ldGFsbmVzc01hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBNZXRhbG5lc3NSZXBlYXQsIG0ubWFwTWV0YWxuZXNzT2Zmc2V0LCBtLm1hcE1ldGFsbmVzc1dyYXAsIG0ubWFwTWV0YWxuZXNzQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTWV0YWxuZXNzUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBNZXRhbG5lc3NPZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcE1ldGFsbmVzc1dyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcE1ldGFsbmVzc0FuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwUm91Z2huZXNzJzpcblx0XHRcdFx0XHRcdGpzb24ucm91Z2huZXNzTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcFJvdWdobmVzc1JlcGVhdCwgbS5tYXBSb3VnaG5lc3NPZmZzZXQsIG0ubWFwUm91Z2huZXNzV3JhcCwgbS5tYXBSb3VnaG5lc3NBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBSb3VnaG5lc3NSZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcFJvdWdobmVzc09mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwUm91Z2huZXNzV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwUm91Z2huZXNzQW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBBbHBoYSc6XG5cdFx0XHRcdFx0XHRqc29uLmFscGhhTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcEFscGhhUmVwZWF0LCBtLm1hcEFscGhhT2Zmc2V0LCBtLm1hcEFscGhhV3JhcCwgbS5tYXBBbHBoYUFuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEFscGhhUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBBbHBoYU9mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQWxwaGFXcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBBbHBoYUFuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZmxpcFNpZGVkJzpcblx0XHRcdFx0XHRcdGpzb24uc2lkZSA9IEJhY2tTaWRlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZG91YmxlU2lkZWQnOlxuXHRcdFx0XHRcdFx0anNvbi5zaWRlID0gRG91YmxlU2lkZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3RyYW5zcGFyZW5jeSc6XG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Mb2FkZXIuY3JlYXRlTWF0ZXJpYWw6IHRyYW5zcGFyZW5jeSBoYXMgYmVlbiByZW5hbWVkIHRvIG9wYWNpdHknICk7XG5cdFx0XHRcdFx0XHRqc29uLm9wYWNpdHkgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2RlcHRoVGVzdCc6XG5cdFx0XHRcdFx0Y2FzZSAnZGVwdGhXcml0ZSc6XG5cdFx0XHRcdFx0Y2FzZSAnY29sb3JXcml0ZSc6XG5cdFx0XHRcdFx0Y2FzZSAnb3BhY2l0eSc6XG5cdFx0XHRcdFx0Y2FzZSAncmVmbGVjdGl2aXR5Jzpcblx0XHRcdFx0XHRjYXNlICd0cmFuc3BhcmVudCc6XG5cdFx0XHRcdFx0Y2FzZSAndmlzaWJsZSc6XG5cdFx0XHRcdFx0Y2FzZSAnd2lyZWZyYW1lJzpcblx0XHRcdFx0XHRcdGpzb25bIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndmVydGV4Q29sb3JzJzpcblx0XHRcdFx0XHRcdGlmICggdmFsdWUgPT09IHRydWUgKSBqc29uLnZlcnRleENvbG9ycyA9IFZlcnRleENvbG9ycztcblx0XHRcdFx0XHRcdGlmICggdmFsdWUgPT09ICdmYWNlJyApIGpzb24udmVydGV4Q29sb3JzID0gRmFjZUNvbG9ycztcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTG9hZGVyLmNyZWF0ZU1hdGVyaWFsOiBVbnN1cHBvcnRlZCcsIG5hbWUsIHZhbHVlICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBqc29uLnR5cGUgPT09ICdNZXNoQmFzaWNNYXRlcmlhbCcgKSBkZWxldGUganNvbi5lbWlzc2l2ZTtcblx0XHRcdGlmICgganNvbi50eXBlICE9PSAnTWVzaFBob25nTWF0ZXJpYWwnICkgZGVsZXRlIGpzb24uc3BlY3VsYXI7XG5cblx0XHRcdGlmICgganNvbi5vcGFjaXR5IDwgMSApIGpzb24udHJhbnNwYXJlbnQgPSB0cnVlO1xuXG5cdFx0XHRtYXRlcmlhbExvYWRlci5zZXRUZXh0dXJlcyggdGV4dHVyZXMgKTtcblxuXHRcdFx0cmV0dXJuIG1hdGVyaWFsTG9hZGVyLnBhcnNlKCBqc29uICk7XG5cblx0XHR9O1xuXG5cdH0gKSgpXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIERvbiBNY0N1cmR5IC8gaHR0cHM6Ly93d3cuZG9ubWNjdXJkeS5jb21cbiAqL1xuXG52YXIgTG9hZGVyVXRpbHMgPSB7XG5cblx0ZGVjb2RlVGV4dDogZnVuY3Rpb24gKCBhcnJheSApIHtcblxuXHRcdGlmICggdHlwZW9mIFRleHREZWNvZGVyICE9PSAndW5kZWZpbmVkJyApIHtcblxuXHRcdFx0cmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZSggYXJyYXkgKTtcblxuXHRcdH1cblxuXHRcdC8vIEF2b2lkIHRoZSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGFycmF5KSBzaG9ydGN1dCwgd2hpY2hcblx0XHQvLyB0aHJvd3MgYSBcIm1heGltdW0gY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIgZXJyb3IgZm9yIGxhcmdlIGFycmF5cy5cblxuXHRcdHZhciBzID0gJyc7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gYXJyYXkubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdC8vIEltcGxpY2l0bHkgYXNzdW1lcyBsaXR0bGUtZW5kaWFuLlxuXHRcdFx0cyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCBhcnJheVsgaSBdICk7XG5cblx0XHR9XG5cblx0XHQvLyBNZXJnZXMgbXVsdGktYnl0ZSB1dGYtOCBjaGFyYWN0ZXJzLlxuXHRcdHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoIGVzY2FwZSggcyApICk7XG5cblx0fSxcblxuXHRleHRyYWN0VXJsQmFzZTogZnVuY3Rpb24gKCB1cmwgKSB7XG5cblx0XHR2YXIgaW5kZXggPSB1cmwubGFzdEluZGV4T2YoICcvJyApO1xuXG5cdFx0aWYgKCBpbmRleCA9PT0gLSAxICkgcmV0dXJuICcuLyc7XG5cblx0XHRyZXR1cm4gdXJsLnN1YnN0ciggMCwgaW5kZXggKyAxICk7XG5cblx0fVxuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIEpTT05Mb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0aWYgKCB0eXBlb2YgbWFuYWdlciA9PT0gJ2Jvb2xlYW4nICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuSlNPTkxvYWRlcjogc2hvd1N0YXR1cyBwYXJhbWV0ZXIgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGNvbnN0cnVjdG9yLicgKTtcblx0XHRtYW5hZ2VyID0gdW5kZWZpbmVkO1xuXG5cdH1cblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxuXHR0aGlzLndpdGhDcmVkZW50aWFscyA9IGZhbHNlO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEpTT05Mb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgdGV4dHVyZVBhdGggPSB0aGlzLnRleHR1cmVQYXRoICYmICggdHlwZW9mIHRoaXMudGV4dHVyZVBhdGggPT09ICdzdHJpbmcnICkgPyB0aGlzLnRleHR1cmVQYXRoIDogTG9hZGVyVXRpbHMuZXh0cmFjdFVybEJhc2UoIHVybCApO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0V2l0aENyZWRlbnRpYWxzKCB0aGlzLndpdGhDcmVkZW50aWFscyApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcblxuXHRcdFx0dmFyIGpzb24gPSBKU09OLnBhcnNlKCB0ZXh0ICk7XG5cdFx0XHR2YXIgbWV0YWRhdGEgPSBqc29uLm1ldGFkYXRhO1xuXG5cdFx0XHRpZiAoIG1ldGFkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dmFyIHR5cGUgPSBtZXRhZGF0YS50eXBlO1xuXG5cdFx0XHRcdGlmICggdHlwZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0aWYgKCB0eXBlLnRvTG93ZXJDYXNlKCkgPT09ICdvYmplY3QnICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuSlNPTkxvYWRlcjogJyArIHVybCArICcgc2hvdWxkIGJlIGxvYWRlZCB3aXRoIFRIUkVFLk9iamVjdExvYWRlciBpbnN0ZWFkLicgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG9iamVjdCA9IHNjb3BlLnBhcnNlKCBqc29uLCB0ZXh0dXJlUGF0aCApO1xuXHRcdFx0b25Mb2FkKCBvYmplY3QuZ2VvbWV0cnksIG9iamVjdC5tYXRlcmlhbHMgKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHR9LFxuXG5cdHNldFRleHR1cmVQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy50ZXh0dXJlUGF0aCA9IHZhbHVlO1xuXG5cdH0sXG5cblx0cGFyc2U6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0ZnVuY3Rpb24gcGFyc2VNb2RlbCgganNvbiwgZ2VvbWV0cnkgKSB7XG5cblx0XHRcdGZ1bmN0aW9uIGlzQml0U2V0KCB2YWx1ZSwgcG9zaXRpb24gKSB7XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlICYgKCAxIDw8IHBvc2l0aW9uICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGksIGosIGZpLFxuXG5cdFx0XHRcdG9mZnNldCwgekxlbmd0aCxcblxuXHRcdFx0XHRjb2xvckluZGV4LCBub3JtYWxJbmRleCwgdXZJbmRleCwgbWF0ZXJpYWxJbmRleCxcblxuXHRcdFx0XHR0eXBlLFxuXHRcdFx0XHRpc1F1YWQsXG5cdFx0XHRcdGhhc01hdGVyaWFsLFxuXHRcdFx0XHRoYXNGYWNlVmVydGV4VXYsXG5cdFx0XHRcdGhhc0ZhY2VOb3JtYWwsIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwsXG5cdFx0XHRcdGhhc0ZhY2VDb2xvciwgaGFzRmFjZVZlcnRleENvbG9yLFxuXG5cdFx0XHRcdHZlcnRleCwgZmFjZSwgZmFjZUEsIGZhY2VCLCBoZXgsIG5vcm1hbCxcblxuXHRcdFx0XHR1dkxheWVyLCB1diwgdSwgdixcblxuXHRcdFx0XHRmYWNlcyA9IGpzb24uZmFjZXMsXG5cdFx0XHRcdHZlcnRpY2VzID0ganNvbi52ZXJ0aWNlcyxcblx0XHRcdFx0bm9ybWFscyA9IGpzb24ubm9ybWFscyxcblx0XHRcdFx0Y29sb3JzID0ganNvbi5jb2xvcnMsXG5cblx0XHRcdFx0c2NhbGUgPSBqc29uLnNjYWxlLFxuXG5cdFx0XHRcdG5VdkxheWVycyA9IDA7XG5cblxuXHRcdFx0aWYgKCBqc29uLnV2cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIGRpc3JlZ2FyZCBlbXB0eSBhcnJheXNcblxuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGpzb24udXZzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGlmICgganNvbi51dnNbIGkgXS5sZW5ndGggKSBuVXZMYXllcnMgKys7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgblV2TGF5ZXJzOyBpICsrICkge1xuXG5cdFx0XHRcdFx0Z2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdID0gW107XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdG9mZnNldCA9IDA7XG5cdFx0XHR6TGVuZ3RoID0gdmVydGljZXMubGVuZ3RoO1xuXG5cdFx0XHR3aGlsZSAoIG9mZnNldCA8IHpMZW5ndGggKSB7XG5cblx0XHRcdFx0dmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0XHR2ZXJ0ZXgueCA9IHZlcnRpY2VzWyBvZmZzZXQgKysgXSAqIHNjYWxlO1xuXHRcdFx0XHR2ZXJ0ZXgueSA9IHZlcnRpY2VzWyBvZmZzZXQgKysgXSAqIHNjYWxlO1xuXHRcdFx0XHR2ZXJ0ZXgueiA9IHZlcnRpY2VzWyBvZmZzZXQgKysgXSAqIHNjYWxlO1xuXG5cdFx0XHRcdGdlb21ldHJ5LnZlcnRpY2VzLnB1c2goIHZlcnRleCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdG9mZnNldCA9IDA7XG5cdFx0XHR6TGVuZ3RoID0gZmFjZXMubGVuZ3RoO1xuXG5cdFx0XHR3aGlsZSAoIG9mZnNldCA8IHpMZW5ndGggKSB7XG5cblx0XHRcdFx0dHlwZSA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblxuXHRcdFx0XHRpc1F1YWQgPSBpc0JpdFNldCggdHlwZSwgMCApO1xuXHRcdFx0XHRoYXNNYXRlcmlhbCA9IGlzQml0U2V0KCB0eXBlLCAxICk7XG5cdFx0XHRcdGhhc0ZhY2VWZXJ0ZXhVdiA9IGlzQml0U2V0KCB0eXBlLCAzICk7XG5cdFx0XHRcdGhhc0ZhY2VOb3JtYWwgPSBpc0JpdFNldCggdHlwZSwgNCApO1xuXHRcdFx0XHRoYXNGYWNlVmVydGV4Tm9ybWFsID0gaXNCaXRTZXQoIHR5cGUsIDUgKTtcblx0XHRcdFx0aGFzRmFjZUNvbG9yID0gaXNCaXRTZXQoIHR5cGUsIDYgKTtcblx0XHRcdFx0aGFzRmFjZVZlcnRleENvbG9yID0gaXNCaXRTZXQoIHR5cGUsIDcgKTtcblxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcInR5cGVcIiwgdHlwZSwgXCJiaXRzXCIsIGlzUXVhZCwgaGFzTWF0ZXJpYWwsIGhhc0ZhY2VWZXJ0ZXhVdiwgaGFzRmFjZU5vcm1hbCwgaGFzRmFjZVZlcnRleE5vcm1hbCwgaGFzRmFjZUNvbG9yLCBoYXNGYWNlVmVydGV4Q29sb3IpO1xuXG5cdFx0XHRcdGlmICggaXNRdWFkICkge1xuXG5cdFx0XHRcdFx0ZmFjZUEgPSBuZXcgRmFjZTMoKTtcblx0XHRcdFx0XHRmYWNlQS5hID0gZmFjZXNbIG9mZnNldCBdO1xuXHRcdFx0XHRcdGZhY2VBLmIgPSBmYWNlc1sgb2Zmc2V0ICsgMSBdO1xuXHRcdFx0XHRcdGZhY2VBLmMgPSBmYWNlc1sgb2Zmc2V0ICsgMyBdO1xuXG5cdFx0XHRcdFx0ZmFjZUIgPSBuZXcgRmFjZTMoKTtcblx0XHRcdFx0XHRmYWNlQi5hID0gZmFjZXNbIG9mZnNldCArIDEgXTtcblx0XHRcdFx0XHRmYWNlQi5iID0gZmFjZXNbIG9mZnNldCArIDIgXTtcblx0XHRcdFx0XHRmYWNlQi5jID0gZmFjZXNbIG9mZnNldCArIDMgXTtcblxuXHRcdFx0XHRcdG9mZnNldCArPSA0O1xuXG5cdFx0XHRcdFx0aWYgKCBoYXNNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRcdFx0bWF0ZXJpYWxJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRcdGZhY2VBLm1hdGVyaWFsSW5kZXggPSBtYXRlcmlhbEluZGV4O1xuXHRcdFx0XHRcdFx0ZmFjZUIubWF0ZXJpYWxJbmRleCA9IG1hdGVyaWFsSW5kZXg7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyB0byBnZXQgZmFjZSA8PT4gdXYgaW5kZXggY29ycmVzcG9uZGVuY2VcblxuXHRcdFx0XHRcdGZpID0gZ2VvbWV0cnkuZmFjZXMubGVuZ3RoO1xuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4VXYgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgblV2TGF5ZXJzOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdHV2TGF5ZXIgPSBqc29uLnV2c1sgaSBdO1xuXG5cdFx0XHRcdFx0XHRcdGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXVsgZmkgXSA9IFtdO1xuXHRcdFx0XHRcdFx0XHRnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF1bIGZpICsgMSBdID0gW107XG5cblx0XHRcdFx0XHRcdFx0Zm9yICggaiA9IDA7IGogPCA0OyBqICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0dXZJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblxuXHRcdFx0XHRcdFx0XHRcdHUgPSB1dkxheWVyWyB1dkluZGV4ICogMiBdO1xuXHRcdFx0XHRcdFx0XHRcdHYgPSB1dkxheWVyWyB1dkluZGV4ICogMiArIDEgXTtcblxuXHRcdFx0XHRcdFx0XHRcdHV2ID0gbmV3IFZlY3RvcjIoIHUsIHYgKTtcblxuXHRcdFx0XHRcdFx0XHRcdGlmICggaiAhPT0gMiApIGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXVsgZmkgXS5wdXNoKCB1diApO1xuXHRcdFx0XHRcdFx0XHRcdGlmICggaiAhPT0gMCApIGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXVsgZmkgKyAxIF0ucHVzaCggdXYgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZU5vcm1hbCApIHtcblxuXHRcdFx0XHRcdFx0bm9ybWFsSW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF0gKiAzO1xuXG5cdFx0XHRcdFx0XHRmYWNlQS5ub3JtYWwuc2V0KFxuXHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLFxuXHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLFxuXHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCBdXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRmYWNlQi5ub3JtYWwuY29weSggZmFjZUEubm9ybWFsICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgNDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRub3JtYWxJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXSAqIDM7XG5cblx0XHRcdFx0XHRcdFx0bm9ybWFsID0gbmV3IFZlY3RvcjMoXG5cdFx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSxcblx0XHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLFxuXHRcdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4IF1cblx0XHRcdFx0XHRcdFx0KTtcblxuXG5cdFx0XHRcdFx0XHRcdGlmICggaSAhPT0gMiApIGZhY2VBLnZlcnRleE5vcm1hbHMucHVzaCggbm9ybWFsICk7XG5cdFx0XHRcdFx0XHRcdGlmICggaSAhPT0gMCApIGZhY2VCLnZlcnRleE5vcm1hbHMucHVzaCggbm9ybWFsICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlQ29sb3IgKSB7XG5cblx0XHRcdFx0XHRcdGNvbG9ySW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cdFx0XHRcdFx0XHRoZXggPSBjb2xvcnNbIGNvbG9ySW5kZXggXTtcblxuXHRcdFx0XHRcdFx0ZmFjZUEuY29sb3Iuc2V0SGV4KCBoZXggKTtcblx0XHRcdFx0XHRcdGZhY2VCLmNvbG9yLnNldEhleCggaGV4ICk7XG5cblx0XHRcdFx0XHR9XG5cblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZVZlcnRleENvbG9yICkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IDQ7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0Y29sb3JJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRcdFx0aGV4ID0gY29sb3JzWyBjb2xvckluZGV4IF07XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBpICE9PSAyICkgZmFjZUEudmVydGV4Q29sb3JzLnB1c2goIG5ldyBDb2xvciggaGV4ICkgKTtcblx0XHRcdFx0XHRcdFx0aWYgKCBpICE9PSAwICkgZmFjZUIudmVydGV4Q29sb3JzLnB1c2goIG5ldyBDb2xvciggaGV4ICkgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Z2VvbWV0cnkuZmFjZXMucHVzaCggZmFjZUEgKTtcblx0XHRcdFx0XHRnZW9tZXRyeS5mYWNlcy5wdXNoKCBmYWNlQiApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRmYWNlID0gbmV3IEZhY2UzKCk7XG5cdFx0XHRcdFx0ZmFjZS5hID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXHRcdFx0XHRcdGZhY2UuYiA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRmYWNlLmMgPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0XHRpZiAoIGhhc01hdGVyaWFsICkge1xuXG5cdFx0XHRcdFx0XHRtYXRlcmlhbEluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXHRcdFx0XHRcdFx0ZmFjZS5tYXRlcmlhbEluZGV4ID0gbWF0ZXJpYWxJbmRleDtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIHRvIGdldCBmYWNlIDw9PiB1diBpbmRleCBjb3JyZXNwb25kZW5jZVxuXG5cdFx0XHRcdFx0ZmkgPSBnZW9tZXRyeS5mYWNlcy5sZW5ndGg7XG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhVdiApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBuVXZMYXllcnM7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0dXZMYXllciA9IGpzb24udXZzWyBpIF07XG5cblx0XHRcdFx0XHRcdFx0Z2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdWyBmaSBdID0gW107XG5cblx0XHRcdFx0XHRcdFx0Zm9yICggaiA9IDA7IGogPCAzOyBqICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0dXZJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblxuXHRcdFx0XHRcdFx0XHRcdHUgPSB1dkxheWVyWyB1dkluZGV4ICogMiBdO1xuXHRcdFx0XHRcdFx0XHRcdHYgPSB1dkxheWVyWyB1dkluZGV4ICogMiArIDEgXTtcblxuXHRcdFx0XHRcdFx0XHRcdHV2ID0gbmV3IFZlY3RvcjIoIHUsIHYgKTtcblxuXHRcdFx0XHRcdFx0XHRcdGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXVsgZmkgXS5wdXNoKCB1diApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlTm9ybWFsICkge1xuXG5cdFx0XHRcdFx0XHRub3JtYWxJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXSAqIDM7XG5cblx0XHRcdFx0XHRcdGZhY2Uubm9ybWFsLnNldChcblx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSxcblx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSxcblx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggXVxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZVZlcnRleE5vcm1hbCApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCAzOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdG5vcm1hbEluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdICogMztcblxuXHRcdFx0XHRcdFx0XHRub3JtYWwgPSBuZXcgVmVjdG9yMyhcblx0XHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLFxuXHRcdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sXG5cdFx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggXVxuXHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdGZhY2UudmVydGV4Tm9ybWFscy5wdXNoKCBub3JtYWwgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VDb2xvciApIHtcblxuXHRcdFx0XHRcdFx0Y29sb3JJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRcdGZhY2UuY29sb3Iuc2V0SGV4KCBjb2xvcnNbIGNvbG9ySW5kZXggXSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhDb2xvciApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCAzOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdGNvbG9ySW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cdFx0XHRcdFx0XHRcdGZhY2UudmVydGV4Q29sb3JzLnB1c2goIG5ldyBDb2xvciggY29sb3JzWyBjb2xvckluZGV4IF0gKSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRnZW9tZXRyeS5mYWNlcy5wdXNoKCBmYWNlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBwYXJzZVNraW4oIGpzb24sIGdlb21ldHJ5ICkge1xuXG5cdFx0XHR2YXIgaW5mbHVlbmNlc1BlclZlcnRleCA9ICgganNvbi5pbmZsdWVuY2VzUGVyVmVydGV4ICE9PSB1bmRlZmluZWQgKSA/IGpzb24uaW5mbHVlbmNlc1BlclZlcnRleCA6IDI7XG5cblx0XHRcdGlmICgganNvbi5za2luV2VpZ2h0cyApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLnNraW5XZWlnaHRzLmxlbmd0aDsgaSA8IGw7IGkgKz0gaW5mbHVlbmNlc1BlclZlcnRleCApIHtcblxuXHRcdFx0XHRcdHZhciB4ID0ganNvbi5za2luV2VpZ2h0c1sgaSBdO1xuXHRcdFx0XHRcdHZhciB5ID0gKCBpbmZsdWVuY2VzUGVyVmVydGV4ID4gMSApID8ganNvbi5za2luV2VpZ2h0c1sgaSArIDEgXSA6IDA7XG5cdFx0XHRcdFx0dmFyIHogPSAoIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPiAyICkgPyBqc29uLnNraW5XZWlnaHRzWyBpICsgMiBdIDogMDtcblx0XHRcdFx0XHR2YXIgdyA9ICggaW5mbHVlbmNlc1BlclZlcnRleCA+IDMgKSA/IGpzb24uc2tpbldlaWdodHNbIGkgKyAzIF0gOiAwO1xuXG5cdFx0XHRcdFx0Z2VvbWV0cnkuc2tpbldlaWdodHMucHVzaCggbmV3IFZlY3RvcjQoIHgsIHksIHosIHcgKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGpzb24uc2tpbkluZGljZXMgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5za2luSW5kaWNlcy5sZW5ndGg7IGkgPCBsOyBpICs9IGluZmx1ZW5jZXNQZXJWZXJ0ZXggKSB7XG5cblx0XHRcdFx0XHR2YXIgYSA9IGpzb24uc2tpbkluZGljZXNbIGkgXTtcblx0XHRcdFx0XHR2YXIgYiA9ICggaW5mbHVlbmNlc1BlclZlcnRleCA+IDEgKSA/IGpzb24uc2tpbkluZGljZXNbIGkgKyAxIF0gOiAwO1xuXHRcdFx0XHRcdHZhciBjID0gKCBpbmZsdWVuY2VzUGVyVmVydGV4ID4gMiApID8ganNvbi5za2luSW5kaWNlc1sgaSArIDIgXSA6IDA7XG5cdFx0XHRcdFx0dmFyIGQgPSAoIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPiAzICkgPyBqc29uLnNraW5JbmRpY2VzWyBpICsgMyBdIDogMDtcblxuXHRcdFx0XHRcdGdlb21ldHJ5LnNraW5JbmRpY2VzLnB1c2goIG5ldyBWZWN0b3I0KCBhLCBiLCBjLCBkICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Z2VvbWV0cnkuYm9uZXMgPSBqc29uLmJvbmVzO1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvbmVzICYmIGdlb21ldHJ5LmJvbmVzLmxlbmd0aCA+IDAgJiYgKCBnZW9tZXRyeS5za2luV2VpZ2h0cy5sZW5ndGggIT09IGdlb21ldHJ5LnNraW5JbmRpY2VzLmxlbmd0aCB8fCBnZW9tZXRyeS5za2luSW5kaWNlcy5sZW5ndGggIT09IGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCApICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1doZW4gc2tpbm5pbmcsIG51bWJlciBvZiB2ZXJ0aWNlcyAoJyArIGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCArICcpLCBza2luSW5kaWNlcyAoJyArXG5cdFx0XHRcdFx0Z2VvbWV0cnkuc2tpbkluZGljZXMubGVuZ3RoICsgJyksIGFuZCBza2luV2VpZ2h0cyAoJyArIGdlb21ldHJ5LnNraW5XZWlnaHRzLmxlbmd0aCArICcpIHNob3VsZCBtYXRjaC4nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHBhcnNlTW9ycGhpbmcoIGpzb24sIGdlb21ldHJ5ICkge1xuXG5cdFx0XHR2YXIgc2NhbGUgPSBqc29uLnNjYWxlO1xuXG5cdFx0XHRpZiAoIGpzb24ubW9ycGhUYXJnZXRzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5tb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1sgaSBdID0ge307XG5cdFx0XHRcdFx0Z2VvbWV0cnkubW9ycGhUYXJnZXRzWyBpIF0ubmFtZSA9IGpzb24ubW9ycGhUYXJnZXRzWyBpIF0ubmFtZTtcblx0XHRcdFx0XHRnZW9tZXRyeS5tb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlcyA9IFtdO1xuXG5cdFx0XHRcdFx0dmFyIGRzdFZlcnRpY2VzID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXM7XG5cdFx0XHRcdFx0dmFyIHNyY1ZlcnRpY2VzID0ganNvbi5tb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlcztcblxuXHRcdFx0XHRcdGZvciAoIHZhciB2ID0gMCwgdmwgPSBzcmNWZXJ0aWNlcy5sZW5ndGg7IHYgPCB2bDsgdiArPSAzICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdFx0XHRcdHZlcnRleC54ID0gc3JjVmVydGljZXNbIHYgXSAqIHNjYWxlO1xuXHRcdFx0XHRcdFx0dmVydGV4LnkgPSBzcmNWZXJ0aWNlc1sgdiArIDEgXSAqIHNjYWxlO1xuXHRcdFx0XHRcdFx0dmVydGV4LnogPSBzcmNWZXJ0aWNlc1sgdiArIDIgXSAqIHNjYWxlO1xuXG5cdFx0XHRcdFx0XHRkc3RWZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXggKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBqc29uLm1vcnBoQ29sb3JzICE9PSB1bmRlZmluZWQgJiYganNvbi5tb3JwaENvbG9ycy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkpTT05Mb2FkZXI6IFwibW9ycGhDb2xvcnNcIiBubyBsb25nZXIgc3VwcG9ydGVkLiBVc2luZyB0aGVtIGFzIGZhY2UgY29sb3JzLicgKTtcblxuXHRcdFx0XHR2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlcztcblx0XHRcdFx0dmFyIG1vcnBoQ29sb3JzID0ganNvbi5tb3JwaENvbG9yc1sgMCBdLmNvbG9ycztcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0ZmFjZXNbIGkgXS5jb2xvci5mcm9tQXJyYXkoIG1vcnBoQ29sb3JzLCBpICogMyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gcGFyc2VBbmltYXRpb25zKCBqc29uLCBnZW9tZXRyeSApIHtcblxuXHRcdFx0dmFyIG91dHB1dEFuaW1hdGlvbnMgPSBbXTtcblxuXHRcdFx0Ly8gcGFyc2Ugb2xkIHN0eWxlIEJvbmUvSGllcmFyY2h5IGFuaW1hdGlvbnNcblx0XHRcdHZhciBhbmltYXRpb25zID0gW107XG5cblx0XHRcdGlmICgganNvbi5hbmltYXRpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhbmltYXRpb25zLnB1c2goIGpzb24uYW5pbWF0aW9uICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBqc29uLmFuaW1hdGlvbnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRpZiAoIGpzb24uYW5pbWF0aW9ucy5sZW5ndGggKSB7XG5cblx0XHRcdFx0XHRhbmltYXRpb25zID0gYW5pbWF0aW9ucy5jb25jYXQoIGpzb24uYW5pbWF0aW9ucyApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRhbmltYXRpb25zLnB1c2goIGpzb24uYW5pbWF0aW9ucyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBhbmltYXRpb25zLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgY2xpcCA9IEFuaW1hdGlvbkNsaXAucGFyc2VBbmltYXRpb24oIGFuaW1hdGlvbnNbIGkgXSwgZ2VvbWV0cnkuYm9uZXMgKTtcblx0XHRcdFx0aWYgKCBjbGlwICkgb3V0cHV0QW5pbWF0aW9ucy5wdXNoKCBjbGlwICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gcGFyc2UgaW1wbGljaXQgbW9ycGggYW5pbWF0aW9uc1xuXHRcdFx0aWYgKCBnZW9tZXRyeS5tb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdFx0Ly8gVE9ETzogRmlndXJlIG91dCB3aGF0IGFuIGFwcHJvcHJhaXRlIEZQUyBpcyBmb3IgbW9ycGggdGFyZ2V0IGFuaW1hdGlvbnMgLS0gZGVmYXVsdGluZyB0byAxMCwgYnV0IHJlYWxseSBpdCBpcyBjb21wbGV0ZWx5IGFyYml0cmFyeS5cblx0XHRcdFx0dmFyIG1vcnBoQW5pbWF0aW9uQ2xpcHMgPSBBbmltYXRpb25DbGlwLkNyZWF0ZUNsaXBzRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2VzKCBnZW9tZXRyeS5tb3JwaFRhcmdldHMsIDEwICk7XG5cdFx0XHRcdG91dHB1dEFuaW1hdGlvbnMgPSBvdXRwdXRBbmltYXRpb25zLmNvbmNhdCggbW9ycGhBbmltYXRpb25DbGlwcyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggb3V0cHV0QW5pbWF0aW9ucy5sZW5ndGggPiAwICkgZ2VvbWV0cnkuYW5pbWF0aW9ucyA9IG91dHB1dEFuaW1hdGlvbnM7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcGFyc2UoIGpzb24sIHRleHR1cmVQYXRoICkge1xuXG5cdFx0XHRpZiAoIGpzb24uZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIEdlb21ldHJ5IDQuMCBzcGVjXG5cdFx0XHRcdGpzb24gPSBqc29uLmRhdGE7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBqc29uLnNjYWxlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0anNvbi5zY2FsZSA9IDEuMCAvIGpzb24uc2NhbGU7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0anNvbi5zY2FsZSA9IDEuMDtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cnkoKTtcblxuXHRcdFx0cGFyc2VNb2RlbCgganNvbiwgZ2VvbWV0cnkgKTtcblx0XHRcdHBhcnNlU2tpbigganNvbiwgZ2VvbWV0cnkgKTtcblx0XHRcdHBhcnNlTW9ycGhpbmcoIGpzb24sIGdlb21ldHJ5ICk7XG5cdFx0XHRwYXJzZUFuaW1hdGlvbnMoIGpzb24sIGdlb21ldHJ5ICk7XG5cblx0XHRcdGdlb21ldHJ5LmNvbXB1dGVGYWNlTm9ybWFscygpO1xuXHRcdFx0Z2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRcdGlmICgganNvbi5tYXRlcmlhbHMgPT09IHVuZGVmaW5lZCB8fCBqc29uLm1hdGVyaWFscy5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHsgZ2VvbWV0cnk6IGdlb21ldHJ5IH07XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dmFyIG1hdGVyaWFscyA9IExvYWRlci5wcm90b3R5cGUuaW5pdE1hdGVyaWFscygganNvbi5tYXRlcmlhbHMsIHRleHR1cmVQYXRoLCB0aGlzLmNyb3NzT3JpZ2luICk7XG5cblx0XHRcdFx0cmV0dXJuIHsgZ2VvbWV0cnk6IGdlb21ldHJ5LCBtYXRlcmlhbHM6IG1hdGVyaWFscyB9O1xuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0gKSgpXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIE9iamVjdExvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblx0dGhpcy50ZXh0dXJlUGF0aCA9ICcnO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIE9iamVjdExvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0aWYgKCB0aGlzLnRleHR1cmVQYXRoID09PSAnJyApIHtcblxuXHRcdFx0dGhpcy50ZXh0dXJlUGF0aCA9IHVybC5zdWJzdHJpbmcoIDAsIHVybC5sYXN0SW5kZXhPZiggJy8nICkgKyAxICk7XG5cblx0XHR9XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCBzY29wZS5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCB0ZXh0ICkge1xuXG5cdFx0XHR2YXIganNvbiA9IG51bGw7XG5cblx0XHRcdHRyeSB7XG5cblx0XHRcdFx0anNvbiA9IEpTT04ucGFyc2UoIHRleHQgKTtcblxuXHRcdFx0fSBjYXRjaCAoIGVycm9yICkge1xuXG5cdFx0XHRcdGlmICggb25FcnJvciAhPT0gdW5kZWZpbmVkICkgb25FcnJvciggZXJyb3IgKTtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUU6T2JqZWN0TG9hZGVyOiBDYW5cXCd0IHBhcnNlICcgKyB1cmwgKyAnLicsIGVycm9yLm1lc3NhZ2UgKTtcblxuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG1ldGFkYXRhID0ganNvbi5tZXRhZGF0YTtcblxuXHRcdFx0aWYgKCBtZXRhZGF0YSA9PT0gdW5kZWZpbmVkIHx8IG1ldGFkYXRhLnR5cGUgPT09IHVuZGVmaW5lZCB8fCBtZXRhZGF0YS50eXBlLnRvTG93ZXJDYXNlKCkgPT09ICdnZW9tZXRyeScgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk9iamVjdExvYWRlcjogQ2FuXFwndCBsb2FkICcgKyB1cmwgKyAnLiBVc2UgVEhSRUUuSlNPTkxvYWRlciBpbnN0ZWFkLicgKTtcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHRcdHNjb3BlLnBhcnNlKCBqc29uLCBvbkxvYWQgKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHR9LFxuXG5cdHNldFRleHR1cmVQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy50ZXh0dXJlUGF0aCA9IHZhbHVlO1xuXG5cdH0sXG5cblx0c2V0Q3Jvc3NPcmlnaW46IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmNyb3NzT3JpZ2luID0gdmFsdWU7XG5cblx0fSxcblxuXHRwYXJzZTogZnVuY3Rpb24gKCBqc29uLCBvbkxvYWQgKSB7XG5cblx0XHR2YXIgc2hhcGVzID0gdGhpcy5wYXJzZVNoYXBlKCBqc29uLnNoYXBlcyApO1xuXHRcdHZhciBnZW9tZXRyaWVzID0gdGhpcy5wYXJzZUdlb21ldHJpZXMoIGpzb24uZ2VvbWV0cmllcywgc2hhcGVzICk7XG5cblx0XHR2YXIgaW1hZ2VzID0gdGhpcy5wYXJzZUltYWdlcygganNvbi5pbWFnZXMsIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0aWYgKCBvbkxvYWQgIT09IHVuZGVmaW5lZCApIG9uTG9hZCggb2JqZWN0ICk7XG5cblx0XHR9ICk7XG5cblx0XHR2YXIgdGV4dHVyZXMgPSB0aGlzLnBhcnNlVGV4dHVyZXMoIGpzb24udGV4dHVyZXMsIGltYWdlcyApO1xuXHRcdHZhciBtYXRlcmlhbHMgPSB0aGlzLnBhcnNlTWF0ZXJpYWxzKCBqc29uLm1hdGVyaWFscywgdGV4dHVyZXMgKTtcblxuXHRcdHZhciBvYmplY3QgPSB0aGlzLnBhcnNlT2JqZWN0KCBqc29uLm9iamVjdCwgZ2VvbWV0cmllcywgbWF0ZXJpYWxzICk7XG5cblx0XHRpZiAoIGpzb24uYW5pbWF0aW9ucyApIHtcblxuXHRcdFx0b2JqZWN0LmFuaW1hdGlvbnMgPSB0aGlzLnBhcnNlQW5pbWF0aW9ucygganNvbi5hbmltYXRpb25zICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGpzb24uaW1hZ2VzID09PSB1bmRlZmluZWQgfHwganNvbi5pbWFnZXMubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRpZiAoIG9uTG9hZCAhPT0gdW5kZWZpbmVkICkgb25Mb2FkKCBvYmplY3QgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBvYmplY3Q7XG5cblx0fSxcblxuXHRwYXJzZVNoYXBlOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHR2YXIgc2hhcGVzID0ge307XG5cblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBzaGFwZSA9IG5ldyBTaGFwZSgpLmZyb21KU09OKCBqc29uWyBpIF0gKTtcblxuXHRcdFx0XHRzaGFwZXNbIHNoYXBlLnV1aWQgXSA9IHNoYXBlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gc2hhcGVzO1xuXG5cdH0sXG5cblx0cGFyc2VHZW9tZXRyaWVzOiBmdW5jdGlvbiAoIGpzb24sIHNoYXBlcyApIHtcblxuXHRcdHZhciBnZW9tZXRyaWVzID0ge307XG5cblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIGdlb21ldHJ5TG9hZGVyID0gbmV3IEpTT05Mb2FkZXIoKTtcblx0XHRcdHZhciBidWZmZXJHZW9tZXRyeUxvYWRlciA9IG5ldyBCdWZmZXJHZW9tZXRyeUxvYWRlcigpO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGdlb21ldHJ5O1xuXHRcdFx0XHR2YXIgZGF0YSA9IGpzb25bIGkgXTtcblxuXHRcdFx0XHRzd2l0Y2ggKCBkYXRhLnR5cGUgKSB7XG5cblx0XHRcdFx0XHRjYXNlICdQbGFuZUdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdQbGFuZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEud2lkdGgsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLndpZHRoU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0U2VnbWVudHNcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnQm94R2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0JveEJ1ZmZlckdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdDdWJlR2VvbWV0cnknOiAvLyBiYWNrd2FyZHMgY29tcGF0aWJsZVxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS53aWR0aCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHQsXG5cdFx0XHRcdFx0XHRcdGRhdGEuZGVwdGgsXG5cdFx0XHRcdFx0XHRcdGRhdGEud2lkdGhTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHRTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5kZXB0aFNlZ21lbnRzXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0NpcmNsZUdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdDaXJjbGVCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5zZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YVN0YXJ0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhTGVuZ3RoXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0N5bGluZGVyR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0N5bGluZGVyQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXNUb3AsXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzQm90dG9tLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpYWxTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHRTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5vcGVuRW5kZWQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdDb25lR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0NvbmVCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHQsXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaWFsU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0U2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEub3BlbkVuZGVkLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFMZW5ndGhcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnU3BoZXJlR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1NwaGVyZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLndpZHRoU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0U2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucGhpU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEucGhpTGVuZ3RoLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFMZW5ndGhcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnRG9kZWNhaGVkcm9uR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0RvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdJY29zYWhlZHJvbkdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdPY3RhaGVkcm9uR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ09jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnVGV0cmFoZWRyb25HZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5kZXRhaWxcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnUmluZ0dlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdSaW5nQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5pbm5lclJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5vdXRlclJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YVNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnBoaVNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFMZW5ndGhcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnVG9ydXNHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnVG9ydXNCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS50dWJlLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGlhbFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnR1YnVsYXJTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5hcmNcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnVG9ydXNLbm90R2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1RvcnVzS25vdEJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnR1YmUsXG5cdFx0XHRcdFx0XHRcdGRhdGEudHVidWxhclNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGlhbFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnAsXG5cdFx0XHRcdFx0XHRcdGRhdGEucVxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdMYXRoZUdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdMYXRoZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucG9pbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnBoaVN0YXJ0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnBoaUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdQb2x5aGVkcm9uR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1BvbHloZWRyb25CdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnZlcnRpY2VzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmluZGljZXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmRldGFpbHNcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnU2hhcGVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnU2hhcGVCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdHZhciBnZW9tZXRyeVNoYXBlcyA9IFtdO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gZGF0YS5zaGFwZXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0dmFyIHNoYXBlID0gc2hhcGVzWyBkYXRhLnNoYXBlc1sgaiBdIF07XG5cblx0XHRcdFx0XHRcdFx0Z2VvbWV0cnlTaGFwZXMucHVzaCggc2hhcGUgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0Z2VvbWV0cnlTaGFwZXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuY3VydmVTZWdtZW50c1xuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gYnVmZmVyR2VvbWV0cnlMb2FkZXIucGFyc2UoIGRhdGEgKTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gZ2VvbWV0cnlMb2FkZXIucGFyc2UoIGRhdGEsIHRoaXMudGV4dHVyZVBhdGggKS5nZW9tZXRyeTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRkZWZhdWx0OlxuXG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuc3VwcG9ydGVkIGdlb21ldHJ5IHR5cGUgXCInICsgZGF0YS50eXBlICsgJ1wiJyApO1xuXG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Z2VvbWV0cnkudXVpZCA9IGRhdGEudXVpZDtcblxuXHRcdFx0XHRpZiAoIGRhdGEubmFtZSAhPT0gdW5kZWZpbmVkICkgZ2VvbWV0cnkubmFtZSA9IGRhdGEubmFtZTtcblxuXHRcdFx0XHRnZW9tZXRyaWVzWyBkYXRhLnV1aWQgXSA9IGdlb21ldHJ5O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZ2VvbWV0cmllcztcblxuXHR9LFxuXG5cdHBhcnNlTWF0ZXJpYWxzOiBmdW5jdGlvbiAoIGpzb24sIHRleHR1cmVzICkge1xuXG5cdFx0dmFyIG1hdGVyaWFscyA9IHt9O1xuXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBsb2FkZXIgPSBuZXcgTWF0ZXJpYWxMb2FkZXIoKTtcblx0XHRcdGxvYWRlci5zZXRUZXh0dXJlcyggdGV4dHVyZXMgKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBkYXRhID0ganNvblsgaSBdO1xuXG5cdFx0XHRcdGlmICggZGF0YS50eXBlID09PSAnTXVsdGlNYXRlcmlhbCcgKSB7XG5cblx0XHRcdFx0XHQvLyBEZXByZWNhdGVkXG5cblx0XHRcdFx0XHR2YXIgYXJyYXkgPSBbXTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IGRhdGEubWF0ZXJpYWxzLmxlbmd0aDsgaiArKyApIHtcblxuXHRcdFx0XHRcdFx0YXJyYXkucHVzaCggbG9hZGVyLnBhcnNlKCBkYXRhLm1hdGVyaWFsc1sgaiBdICkgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG1hdGVyaWFsc1sgZGF0YS51dWlkIF0gPSBhcnJheTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0bWF0ZXJpYWxzWyBkYXRhLnV1aWQgXSA9IGxvYWRlci5wYXJzZSggZGF0YSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hdGVyaWFscztcblxuXHR9LFxuXG5cdHBhcnNlQW5pbWF0aW9uczogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0dmFyIGFuaW1hdGlvbnMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGpzb24ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgY2xpcCA9IEFuaW1hdGlvbkNsaXAucGFyc2UoIGpzb25bIGkgXSApO1xuXG5cdFx0XHRhbmltYXRpb25zLnB1c2goIGNsaXAgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBhbmltYXRpb25zO1xuXG5cdH0sXG5cblx0cGFyc2VJbWFnZXM6IGZ1bmN0aW9uICgganNvbiwgb25Mb2FkICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblx0XHR2YXIgaW1hZ2VzID0ge307XG5cblx0XHRmdW5jdGlvbiBsb2FkSW1hZ2UoIHVybCApIHtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xuXG5cdFx0XHRyZXR1cm4gbG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdH0sIHVuZGVmaW5lZCwgZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcblxuXHRcdFx0fSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgJiYganNvbi5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR2YXIgbWFuYWdlciA9IG5ldyBMb2FkaW5nTWFuYWdlciggb25Mb2FkICk7XG5cblx0XHRcdHZhciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoIG1hbmFnZXIgKTtcblx0XHRcdGxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGltYWdlID0ganNvblsgaSBdO1xuXHRcdFx0XHR2YXIgcGF0aCA9IC9eKFxcL1xcLyl8KFthLXpdKzooXFwvXFwvKT8pL2kudGVzdCggaW1hZ2UudXJsICkgPyBpbWFnZS51cmwgOiBzY29wZS50ZXh0dXJlUGF0aCArIGltYWdlLnVybDtcblxuXHRcdFx0XHRpbWFnZXNbIGltYWdlLnV1aWQgXSA9IGxvYWRJbWFnZSggcGF0aCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gaW1hZ2VzO1xuXG5cdH0sXG5cblx0cGFyc2VUZXh0dXJlczogZnVuY3Rpb24gKCBqc29uLCBpbWFnZXMgKSB7XG5cblx0XHRmdW5jdGlvbiBwYXJzZUNvbnN0YW50KCB2YWx1ZSwgdHlwZSApIHtcblxuXHRcdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICkgcmV0dXJuIHZhbHVlO1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXIucGFyc2VUZXh0dXJlOiBDb25zdGFudCBzaG91bGQgYmUgaW4gbnVtZXJpYyBmb3JtLicsIHZhbHVlICk7XG5cblx0XHRcdHJldHVybiB0eXBlWyB2YWx1ZSBdO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHRleHR1cmVzID0ge307XG5cblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBkYXRhID0ganNvblsgaSBdO1xuXG5cdFx0XHRcdGlmICggZGF0YS5pbWFnZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBObyBcImltYWdlXCIgc3BlY2lmaWVkIGZvcicsIGRhdGEudXVpZCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIGltYWdlc1sgZGF0YS5pbWFnZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBpbWFnZScsIGRhdGEuaW1hZ2UgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIHRleHR1cmUgPSBuZXcgVGV4dHVyZSggaW1hZ2VzWyBkYXRhLmltYWdlIF0gKTtcblx0XHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdFx0dGV4dHVyZS51dWlkID0gZGF0YS51dWlkO1xuXG5cdFx0XHRcdGlmICggZGF0YS5uYW1lICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm5hbWUgPSBkYXRhLm5hbWU7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm1hcHBpbmcgIT09IHVuZGVmaW5lZCApIHRleHR1cmUubWFwcGluZyA9IHBhcnNlQ29uc3RhbnQoIGRhdGEubWFwcGluZywgVEVYVFVSRV9NQVBQSU5HICk7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm9mZnNldCAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5vZmZzZXQuZnJvbUFycmF5KCBkYXRhLm9mZnNldCApO1xuXHRcdFx0XHRpZiAoIGRhdGEucmVwZWF0ICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnJlcGVhdC5mcm9tQXJyYXkoIGRhdGEucmVwZWF0ICk7XG5cdFx0XHRcdGlmICggZGF0YS5jZW50ZXIgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuY2VudGVyLmZyb21BcnJheSggZGF0YS5jZW50ZXIgKTtcblx0XHRcdFx0aWYgKCBkYXRhLnJvdGF0aW9uICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnJvdGF0aW9uID0gZGF0YS5yb3RhdGlvbjtcblxuXHRcdFx0XHRpZiAoIGRhdGEud3JhcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS53cmFwUyA9IHBhcnNlQ29uc3RhbnQoIGRhdGEud3JhcFsgMCBdLCBURVhUVVJFX1dSQVBQSU5HICk7XG5cdFx0XHRcdFx0dGV4dHVyZS53cmFwVCA9IHBhcnNlQ29uc3RhbnQoIGRhdGEud3JhcFsgMSBdLCBURVhUVVJFX1dSQVBQSU5HICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggZGF0YS5mb3JtYXQgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuZm9ybWF0ID0gZGF0YS5mb3JtYXQ7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm1pbkZpbHRlciAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5taW5GaWx0ZXIgPSBwYXJzZUNvbnN0YW50KCBkYXRhLm1pbkZpbHRlciwgVEVYVFVSRV9GSUxURVIgKTtcblx0XHRcdFx0aWYgKCBkYXRhLm1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5tYWdGaWx0ZXIgPSBwYXJzZUNvbnN0YW50KCBkYXRhLm1hZ0ZpbHRlciwgVEVYVFVSRV9GSUxURVIgKTtcblx0XHRcdFx0aWYgKCBkYXRhLmFuaXNvdHJvcHkgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuYW5pc290cm9weSA9IGRhdGEuYW5pc290cm9weTtcblxuXHRcdFx0XHRpZiAoIGRhdGEuZmxpcFkgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuZmxpcFkgPSBkYXRhLmZsaXBZO1xuXG5cdFx0XHRcdHRleHR1cmVzWyBkYXRhLnV1aWQgXSA9IHRleHR1cmU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0ZXh0dXJlcztcblxuXHR9LFxuXG5cdHBhcnNlT2JqZWN0OiBmdW5jdGlvbiAoIGRhdGEsIGdlb21ldHJpZXMsIG1hdGVyaWFscyApIHtcblxuXHRcdHZhciBvYmplY3Q7XG5cblx0XHRmdW5jdGlvbiBnZXRHZW9tZXRyeSggbmFtZSApIHtcblxuXHRcdFx0aWYgKCBnZW9tZXRyaWVzWyBuYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBnZW9tZXRyeScsIG5hbWUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZ2VvbWV0cmllc1sgbmFtZSBdO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2V0TWF0ZXJpYWwoIG5hbWUgKSB7XG5cblx0XHRcdGlmICggbmFtZSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBuYW1lICkgKSB7XG5cblx0XHRcdFx0dmFyIGFycmF5ID0gW107XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbmFtZS5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIHV1aWQgPSBuYW1lWyBpIF07XG5cblx0XHRcdFx0XHRpZiAoIG1hdGVyaWFsc1sgdXVpZCBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIG1hdGVyaWFsJywgdXVpZCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YXJyYXkucHVzaCggbWF0ZXJpYWxzWyB1dWlkIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGFycmF5O1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggbWF0ZXJpYWxzWyBuYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBtYXRlcmlhbCcsIG5hbWUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF0ZXJpYWxzWyBuYW1lIF07XG5cblx0XHR9XG5cblx0XHRzd2l0Y2ggKCBkYXRhLnR5cGUgKSB7XG5cblx0XHRcdGNhc2UgJ1NjZW5lJzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgU2NlbmUoKTtcblxuXHRcdFx0XHRpZiAoIGRhdGEuYmFja2dyb3VuZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0aWYgKCBOdW1iZXIuaXNJbnRlZ2VyKCBkYXRhLmJhY2tncm91bmQgKSApIHtcblxuXHRcdFx0XHRcdFx0b2JqZWN0LmJhY2tncm91bmQgPSBuZXcgQ29sb3IoIGRhdGEuYmFja2dyb3VuZCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIGRhdGEuZm9nICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGRhdGEuZm9nLnR5cGUgPT09ICdGb2cnICkge1xuXG5cdFx0XHRcdFx0XHRvYmplY3QuZm9nID0gbmV3IEZvZyggZGF0YS5mb2cuY29sb3IsIGRhdGEuZm9nLm5lYXIsIGRhdGEuZm9nLmZhciApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggZGF0YS5mb2cudHlwZSA9PT0gJ0ZvZ0V4cDInICkge1xuXG5cdFx0XHRcdFx0XHRvYmplY3QuZm9nID0gbmV3IEZvZ0V4cDIoIGRhdGEuZm9nLmNvbG9yLCBkYXRhLmZvZy5kZW5zaXR5ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQZXJzcGVjdGl2ZUNhbWVyYSc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBkYXRhLmZvdiwgZGF0YS5hc3BlY3QsIGRhdGEubmVhciwgZGF0YS5mYXIgKTtcblxuXHRcdFx0XHRpZiAoIGRhdGEuZm9jdXMgIT09IHVuZGVmaW5lZCApIG9iamVjdC5mb2N1cyA9IGRhdGEuZm9jdXM7XG5cdFx0XHRcdGlmICggZGF0YS56b29tICE9PSB1bmRlZmluZWQgKSBvYmplY3Quem9vbSA9IGRhdGEuem9vbTtcblx0XHRcdFx0aWYgKCBkYXRhLmZpbG1HYXVnZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZpbG1HYXVnZSA9IGRhdGEuZmlsbUdhdWdlO1xuXHRcdFx0XHRpZiAoIGRhdGEuZmlsbU9mZnNldCAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZpbG1PZmZzZXQgPSBkYXRhLmZpbG1PZmZzZXQ7XG5cdFx0XHRcdGlmICggZGF0YS52aWV3ICE9PSB1bmRlZmluZWQgKSBvYmplY3QudmlldyA9IE9iamVjdC5hc3NpZ24oIHt9LCBkYXRhLnZpZXcgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnT3J0aG9ncmFwaGljQ2FtZXJhJzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhKCBkYXRhLmxlZnQsIGRhdGEucmlnaHQsIGRhdGEudG9wLCBkYXRhLmJvdHRvbSwgZGF0YS5uZWFyLCBkYXRhLmZhciApO1xuXG5cdFx0XHRcdGlmICggZGF0YS56b29tICE9PSB1bmRlZmluZWQgKSBvYmplY3Quem9vbSA9IGRhdGEuem9vbTtcblx0XHRcdFx0aWYgKCBkYXRhLnZpZXcgIT09IHVuZGVmaW5lZCApIG9iamVjdC52aWV3ID0gT2JqZWN0LmFzc2lnbigge30sIGRhdGEudmlldyApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdBbWJpZW50TGlnaHQnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBBbWJpZW50TGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5ICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ0RpcmVjdGlvbmFsTGlnaHQnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBEaXJlY3Rpb25hbExpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQb2ludExpZ2h0JzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgUG9pbnRMaWdodCggZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHksIGRhdGEuZGlzdGFuY2UsIGRhdGEuZGVjYXkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnUmVjdEFyZWFMaWdodCc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IFJlY3RBcmVhTGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5LCBkYXRhLndpZHRoLCBkYXRhLmhlaWdodCApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdTcG90TGlnaHQnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBTcG90TGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5LCBkYXRhLmRpc3RhbmNlLCBkYXRhLmFuZ2xlLCBkYXRhLnBlbnVtYnJhLCBkYXRhLmRlY2F5ICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ0hlbWlzcGhlcmVMaWdodCc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IEhlbWlzcGhlcmVMaWdodCggZGF0YS5jb2xvciwgZGF0YS5ncm91bmRDb2xvciwgZGF0YS5pbnRlbnNpdHkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnU2tpbm5lZE1lc2gnOlxuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlci5wYXJzZU9iamVjdCgpIGRvZXMgbm90IHN1cHBvcnQgU2tpbm5lZE1lc2ggeWV0LicgKTtcblxuXHRcdFx0Y2FzZSAnTWVzaCc6XG5cblx0XHRcdFx0dmFyIGdlb21ldHJ5ID0gZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKTtcblx0XHRcdFx0dmFyIG1hdGVyaWFsID0gZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKTtcblxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5LmJvbmVzICYmIGdlb21ldHJ5LmJvbmVzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdFx0XHRvYmplY3QgPSBuZXcgU2tpbm5lZE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRvYmplY3QgPSBuZXcgTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdMT0QnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBMT0QoKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnTGluZSc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IExpbmUoIGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICksIGRhdGEubW9kZSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdMaW5lTG9vcCc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IExpbmVMb29wKCBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApLCBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ0xpbmVTZWdtZW50cyc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IExpbmVTZWdtZW50cyggZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKSwgZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQb2ludENsb3VkJzpcblx0XHRcdGNhc2UgJ1BvaW50cyc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IFBvaW50cyggZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKSwgZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdTcHJpdGUnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBTcHJpdGUoIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnR3JvdXAnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBHcm91cCgpO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBPYmplY3QzRCgpO1xuXG5cdFx0fVxuXG5cdFx0b2JqZWN0LnV1aWQgPSBkYXRhLnV1aWQ7XG5cblx0XHRpZiAoIGRhdGEubmFtZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lm5hbWUgPSBkYXRhLm5hbWU7XG5cblx0XHRpZiAoIGRhdGEubWF0cml4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG9iamVjdC5tYXRyaXguZnJvbUFycmF5KCBkYXRhLm1hdHJpeCApO1xuXG5cdFx0XHRpZiAoIGRhdGEubWF0cml4QXV0b1VwZGF0ZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lm1hdHJpeEF1dG9VcGRhdGUgPSBkYXRhLm1hdHJpeEF1dG9VcGRhdGU7XG5cdFx0XHRpZiAoIG9iamVjdC5tYXRyaXhBdXRvVXBkYXRlICkgb2JqZWN0Lm1hdHJpeC5kZWNvbXBvc2UoIG9iamVjdC5wb3NpdGlvbiwgb2JqZWN0LnF1YXRlcm5pb24sIG9iamVjdC5zY2FsZSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0aWYgKCBkYXRhLnBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSBvYmplY3QucG9zaXRpb24uZnJvbUFycmF5KCBkYXRhLnBvc2l0aW9uICk7XG5cdFx0XHRpZiAoIGRhdGEucm90YXRpb24gIT09IHVuZGVmaW5lZCApIG9iamVjdC5yb3RhdGlvbi5mcm9tQXJyYXkoIGRhdGEucm90YXRpb24gKTtcblx0XHRcdGlmICggZGF0YS5xdWF0ZXJuaW9uICE9PSB1bmRlZmluZWQgKSBvYmplY3QucXVhdGVybmlvbi5mcm9tQXJyYXkoIGRhdGEucXVhdGVybmlvbiApO1xuXHRcdFx0aWYgKCBkYXRhLnNjYWxlICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2NhbGUuZnJvbUFycmF5KCBkYXRhLnNjYWxlICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGRhdGEuY2FzdFNoYWRvdyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmNhc3RTaGFkb3cgPSBkYXRhLmNhc3RTaGFkb3c7XG5cdFx0aWYgKCBkYXRhLnJlY2VpdmVTaGFkb3cgIT09IHVuZGVmaW5lZCApIG9iamVjdC5yZWNlaXZlU2hhZG93ID0gZGF0YS5yZWNlaXZlU2hhZG93O1xuXG5cdFx0aWYgKCBkYXRhLnNoYWRvdyApIHtcblxuXHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5iaWFzICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93LmJpYXMgPSBkYXRhLnNoYWRvdy5iaWFzO1xuXHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5yYWRpdXMgIT09IHVuZGVmaW5lZCApIG9iamVjdC5zaGFkb3cucmFkaXVzID0gZGF0YS5zaGFkb3cucmFkaXVzO1xuXHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5tYXBTaXplICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93Lm1hcFNpemUuZnJvbUFycmF5KCBkYXRhLnNoYWRvdy5tYXBTaXplICk7XG5cdFx0XHRpZiAoIGRhdGEuc2hhZG93LmNhbWVyYSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5jYW1lcmEgPSB0aGlzLnBhcnNlT2JqZWN0KCBkYXRhLnNoYWRvdy5jYW1lcmEgKTtcblxuXHRcdH1cblxuXHRcdGlmICggZGF0YS52aXNpYmxlICE9PSB1bmRlZmluZWQgKSBvYmplY3QudmlzaWJsZSA9IGRhdGEudmlzaWJsZTtcblx0XHRpZiAoIGRhdGEuZnJ1c3R1bUN1bGxlZCAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZydXN0dW1DdWxsZWQgPSBkYXRhLmZydXN0dW1DdWxsZWQ7XG5cdFx0aWYgKCBkYXRhLnJlbmRlck9yZGVyICE9PSB1bmRlZmluZWQgKSBvYmplY3QucmVuZGVyT3JkZXIgPSBkYXRhLnJlbmRlck9yZGVyO1xuXHRcdGlmICggZGF0YS51c2VyRGF0YSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnVzZXJEYXRhID0gZGF0YS51c2VyRGF0YTtcblxuXHRcdGlmICggZGF0YS5jaGlsZHJlbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgY2hpbGRyZW4gPSBkYXRhLmNoaWxkcmVuO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0b2JqZWN0LmFkZCggdGhpcy5wYXJzZU9iamVjdCggY2hpbGRyZW5bIGkgXSwgZ2VvbWV0cmllcywgbWF0ZXJpYWxzICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBkYXRhLnR5cGUgPT09ICdMT0QnICkge1xuXG5cdFx0XHR2YXIgbGV2ZWxzID0gZGF0YS5sZXZlbHM7XG5cblx0XHRcdGZvciAoIHZhciBsID0gMDsgbCA8IGxldmVscy5sZW5ndGg7IGwgKysgKSB7XG5cblx0XHRcdFx0dmFyIGxldmVsID0gbGV2ZWxzWyBsIF07XG5cdFx0XHRcdHZhciBjaGlsZCA9IG9iamVjdC5nZXRPYmplY3RCeVByb3BlcnR5KCAndXVpZCcsIGxldmVsLm9iamVjdCApO1xuXG5cdFx0XHRcdGlmICggY2hpbGQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdG9iamVjdC5hZGRMZXZlbCggY2hpbGQsIGxldmVsLmRpc3RhbmNlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gb2JqZWN0O1xuXG5cdH1cblxufSApO1xuXG52YXIgVEVYVFVSRV9NQVBQSU5HID0ge1xuXHRVVk1hcHBpbmc6IFVWTWFwcGluZyxcblx0Q3ViZVJlZmxlY3Rpb25NYXBwaW5nOiBDdWJlUmVmbGVjdGlvbk1hcHBpbmcsXG5cdEN1YmVSZWZyYWN0aW9uTWFwcGluZzogQ3ViZVJlZnJhY3Rpb25NYXBwaW5nLFxuXHRFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZzogRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmcsXG5cdEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOiBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZyxcblx0U3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmc6IFNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nLFxuXHRDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzogQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcsXG5cdEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nOiBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZ1xufTtcblxudmFyIFRFWFRVUkVfV1JBUFBJTkcgPSB7XG5cdFJlcGVhdFdyYXBwaW5nOiBSZXBlYXRXcmFwcGluZyxcblx0Q2xhbXBUb0VkZ2VXcmFwcGluZzogQ2xhbXBUb0VkZ2VXcmFwcGluZyxcblx0TWlycm9yZWRSZXBlYXRXcmFwcGluZzogTWlycm9yZWRSZXBlYXRXcmFwcGluZ1xufTtcblxudmFyIFRFWFRVUkVfRklMVEVSID0ge1xuXHROZWFyZXN0RmlsdGVyOiBOZWFyZXN0RmlsdGVyLFxuXHROZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlcjogTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXIsXG5cdE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXI6IE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXIsXG5cdExpbmVhckZpbHRlcjogTGluZWFyRmlsdGVyLFxuXHRMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyOiBMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyLFxuXHRMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXI6IExpbmVhck1pcE1hcExpbmVhckZpbHRlclxufTtcblxuLyoqXG4gKiBAYXV0aG9yIHRoZXNwaXRlIC8gaHR0cDovL2NsaWNrdG9yZWxlYXNlLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBJbWFnZUJpdG1hcExvYWRlciggbWFuYWdlciApIHtcblxuXHRpZiAoIHR5cGVvZiBjcmVhdGVJbWFnZUJpdG1hcCA9PT0gJ3VuZGVmaW5lZCcgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5JbWFnZUJpdG1hcExvYWRlcjogY3JlYXRlSW1hZ2VCaXRtYXAoKSBub3Qgc3VwcG9ydGVkLicgKTtcblxuXHR9XG5cblx0aWYgKCB0eXBlb2YgZmV0Y2ggPT09ICd1bmRlZmluZWQnICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuSW1hZ2VCaXRtYXBMb2FkZXI6IGZldGNoKCkgbm90IHN1cHBvcnRlZC4nICk7XG5cblx0fVxuXG5cdHRoaXMubWFuYWdlciA9IG1hbmFnZXIgIT09IHVuZGVmaW5lZCA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cdHRoaXMub3B0aW9ucyA9IHVuZGVmaW5lZDtcblxufVxuXG5JbWFnZUJpdG1hcExvYWRlci5wcm90b3R5cGUgPSB7XG5cblx0Y29uc3RydWN0b3I6IEltYWdlQml0bWFwTG9hZGVyLFxuXG5cdHNldE9wdGlvbnM6IGZ1bmN0aW9uIHNldE9wdGlvbnMoIG9wdGlvbnMgKSB7XG5cblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRsb2FkOiBmdW5jdGlvbiBsb2FkKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdGlmICggdXJsID09PSB1bmRlZmluZWQgKSB1cmwgPSAnJztcblxuXHRcdGlmICggdGhpcy5wYXRoICE9PSB1bmRlZmluZWQgKSB1cmwgPSB0aGlzLnBhdGggKyB1cmw7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGNhY2hlZCA9IENhY2hlLmdldCggdXJsICk7XG5cblx0XHRpZiAoIGNhY2hlZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XG5cblx0XHRcdHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggY2FjaGVkICk7XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0fSwgMCApO1xuXG5cdFx0XHRyZXR1cm4gY2FjaGVkO1xuXG5cdFx0fVxuXG5cdFx0ZmV0Y2goIHVybCApLnRoZW4oIGZ1bmN0aW9uICggcmVzICkge1xuXG5cdFx0XHRyZXR1cm4gcmVzLmJsb2IoKTtcblxuXHRcdH0gKS50aGVuKCBmdW5jdGlvbiAoIGJsb2IgKSB7XG5cblx0XHRcdHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcCggYmxvYiwgc2NvcGUub3B0aW9ucyApO1xuXG5cdFx0fSApLnRoZW4oIGZ1bmN0aW9uICggaW1hZ2VCaXRtYXAgKSB7XG5cblx0XHRcdENhY2hlLmFkZCggdXJsLCBpbWFnZUJpdG1hcCApO1xuXG5cdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggaW1hZ2VCaXRtYXAgKTtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdH0gKS5jYXRjaCggZnVuY3Rpb24gKCBlICkge1xuXG5cdFx0XHRpZiAoIG9uRXJyb3IgKSBvbkVycm9yKCBlICk7XG5cblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XG5cblx0XHR9ICk7XG5cblx0fSxcblxuXHRzZXRDcm9zc09yaWdpbjogZnVuY3Rpb24gKCAvKiB2YWx1ZSAqLyApIHtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGF0aCA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBtaW5pbWFsIGNsYXNzIGZvciBwcm94aW5nIGZ1bmN0aW9ucyB0byBQYXRoLiBSZXBsYWNlcyBvbGQgXCJleHRyYWN0U3VicGF0aHMoKVwiXG4gKiovXG5cbmZ1bmN0aW9uIFNoYXBlUGF0aCgpIHtcblxuXHR0aGlzLnR5cGUgPSAnU2hhcGVQYXRoJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCk7XG5cblx0dGhpcy5zdWJQYXRocyA9IFtdO1xuXHR0aGlzLmN1cnJlbnRQYXRoID0gbnVsbDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBTaGFwZVBhdGgucHJvdG90eXBlLCB7XG5cblx0bW92ZVRvOiBmdW5jdGlvbiAoIHgsIHkgKSB7XG5cblx0XHR0aGlzLmN1cnJlbnRQYXRoID0gbmV3IFBhdGgoKTtcblx0XHR0aGlzLnN1YlBhdGhzLnB1c2goIHRoaXMuY3VycmVudFBhdGggKTtcblx0XHR0aGlzLmN1cnJlbnRQYXRoLm1vdmVUbyggeCwgeSApO1xuXG5cdH0sXG5cblx0bGluZVRvOiBmdW5jdGlvbiAoIHgsIHkgKSB7XG5cblx0XHR0aGlzLmN1cnJlbnRQYXRoLmxpbmVUbyggeCwgeSApO1xuXG5cdH0sXG5cblx0cXVhZHJhdGljQ3VydmVUbzogZnVuY3Rpb24gKCBhQ1B4LCBhQ1B5LCBhWCwgYVkgKSB7XG5cblx0XHR0aGlzLmN1cnJlbnRQYXRoLnF1YWRyYXRpY0N1cnZlVG8oIGFDUHgsIGFDUHksIGFYLCBhWSApO1xuXG5cdH0sXG5cblx0YmV6aWVyQ3VydmVUbzogZnVuY3Rpb24gKCBhQ1AxeCwgYUNQMXksIGFDUDJ4LCBhQ1AyeSwgYVgsIGFZICkge1xuXG5cdFx0dGhpcy5jdXJyZW50UGF0aC5iZXppZXJDdXJ2ZVRvKCBhQ1AxeCwgYUNQMXksIGFDUDJ4LCBhQ1AyeSwgYVgsIGFZICk7XG5cblx0fSxcblxuXHRzcGxpbmVUaHJ1OiBmdW5jdGlvbiAoIHB0cyApIHtcblxuXHRcdHRoaXMuY3VycmVudFBhdGguc3BsaW5lVGhydSggcHRzICk7XG5cblx0fSxcblxuXHR0b1NoYXBlczogZnVuY3Rpb24gKCBpc0NDVywgbm9Ib2xlcyApIHtcblxuXHRcdGZ1bmN0aW9uIHRvU2hhcGVzTm9Ib2xlcyggaW5TdWJwYXRocyApIHtcblxuXHRcdFx0dmFyIHNoYXBlcyA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBpblN1YnBhdGhzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIHRtcFBhdGggPSBpblN1YnBhdGhzWyBpIF07XG5cblx0XHRcdFx0dmFyIHRtcFNoYXBlID0gbmV3IFNoYXBlKCk7XG5cdFx0XHRcdHRtcFNoYXBlLmN1cnZlcyA9IHRtcFBhdGguY3VydmVzO1xuXG5cdFx0XHRcdHNoYXBlcy5wdXNoKCB0bXBTaGFwZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzaGFwZXM7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBpc1BvaW50SW5zaWRlUG9seWdvbiggaW5QdCwgaW5Qb2x5Z29uICkge1xuXG5cdFx0XHR2YXIgcG9seUxlbiA9IGluUG9seWdvbi5sZW5ndGg7XG5cblx0XHRcdC8vIGluUHQgb24gcG9seWdvbiBjb250b3VyID0+IGltbWVkaWF0ZSBzdWNjZXNzICAgIG9yXG5cdFx0XHQvLyB0b2dnbGluZyBvZiBpbnNpZGUvb3V0c2lkZSBhdCBldmVyeSBzaW5nbGUhIGludGVyc2VjdGlvbiBwb2ludCBvZiBhbiBlZGdlXG5cdFx0XHQvLyAgd2l0aCB0aGUgaG9yaXpvbnRhbCBsaW5lIHRocm91Z2ggaW5QdCwgbGVmdCBvZiBpblB0XG5cdFx0XHQvLyAgbm90IGNvdW50aW5nIGxvd2VyWSBlbmRwb2ludHMgb2YgZWRnZXMgYW5kIHdob2xlIGVkZ2VzIG9uIHRoYXQgbGluZVxuXHRcdFx0dmFyIGluc2lkZSA9IGZhbHNlO1xuXHRcdFx0Zm9yICggdmFyIHAgPSBwb2x5TGVuIC0gMSwgcSA9IDA7IHEgPCBwb2x5TGVuOyBwID0gcSArKyApIHtcblxuXHRcdFx0XHR2YXIgZWRnZUxvd1B0ID0gaW5Qb2x5Z29uWyBwIF07XG5cdFx0XHRcdHZhciBlZGdlSGlnaFB0ID0gaW5Qb2x5Z29uWyBxIF07XG5cblx0XHRcdFx0dmFyIGVkZ2VEeCA9IGVkZ2VIaWdoUHQueCAtIGVkZ2VMb3dQdC54O1xuXHRcdFx0XHR2YXIgZWRnZUR5ID0gZWRnZUhpZ2hQdC55IC0gZWRnZUxvd1B0Lnk7XG5cblx0XHRcdFx0aWYgKCBNYXRoLmFicyggZWRnZUR5ICkgPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHRcdC8vIG5vdCBwYXJhbGxlbFxuXHRcdFx0XHRcdGlmICggZWRnZUR5IDwgMCApIHtcblxuXHRcdFx0XHRcdFx0ZWRnZUxvd1B0ID0gaW5Qb2x5Z29uWyBxIF07IGVkZ2VEeCA9IC0gZWRnZUR4O1xuXHRcdFx0XHRcdFx0ZWRnZUhpZ2hQdCA9IGluUG9seWdvblsgcCBdOyBlZGdlRHkgPSAtIGVkZ2VEeTtcblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoICggaW5QdC55IDwgZWRnZUxvd1B0LnkgKSB8fCAoIGluUHQueSA+IGVkZ2VIaWdoUHQueSApICkgXHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0aWYgKCBpblB0LnkgPT09IGVkZ2VMb3dQdC55ICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIGluUHQueCA9PT0gZWRnZUxvd1B0LnggKVx0XHRyZXR1cm5cdHRydWU7XHRcdC8vIGluUHQgaXMgb24gY29udG91ciA/XG5cdFx0XHRcdFx0XHQvLyBjb250aW51ZTtcdFx0XHRcdC8vIG5vIGludGVyc2VjdGlvbiBvciBlZGdlTG93UHQgPT4gZG9lc24ndCBjb3VudCAhISFcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHZhciBwZXJwRWRnZSA9IGVkZ2VEeSAqICggaW5QdC54IC0gZWRnZUxvd1B0LnggKSAtIGVkZ2VEeCAqICggaW5QdC55IC0gZWRnZUxvd1B0LnkgKTtcblx0XHRcdFx0XHRcdGlmICggcGVycEVkZ2UgPT09IDAgKVx0XHRcdFx0cmV0dXJuXHR0cnVlO1x0XHQvLyBpblB0IGlzIG9uIGNvbnRvdXIgP1xuXHRcdFx0XHRcdFx0aWYgKCBwZXJwRWRnZSA8IDAgKSBcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0aW5zaWRlID0gISBpbnNpZGU7XHRcdC8vIHRydWUgaW50ZXJzZWN0aW9uIGxlZnQgb2YgaW5QdFxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyBwYXJhbGxlbCBvciBjb2xsaW5lYXJcblx0XHRcdFx0XHRpZiAoIGluUHQueSAhPT0gZWRnZUxvd1B0LnkgKSBcdFx0Y29udGludWU7XHRcdFx0Ly8gcGFyYWxsZWxcblx0XHRcdFx0XHQvLyBlZGdlIGxpZXMgb24gdGhlIHNhbWUgaG9yaXpvbnRhbCBsaW5lIGFzIGluUHRcblx0XHRcdFx0XHRpZiAoICggKCBlZGdlSGlnaFB0LnggPD0gaW5QdC54ICkgJiYgKCBpblB0LnggPD0gZWRnZUxvd1B0LnggKSApIHx8XG5cdFx0XHRcdFx0XHQgKCAoIGVkZ2VMb3dQdC54IDw9IGluUHQueCApICYmICggaW5QdC54IDw9IGVkZ2VIaWdoUHQueCApICkgKVx0XHRyZXR1cm5cdHRydWU7XHQvLyBpblB0OiBQb2ludCBvbiBjb250b3VyICFcblx0XHRcdFx0XHQvLyBjb250aW51ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuXHRpbnNpZGU7XG5cblx0XHR9XG5cblx0XHR2YXIgaXNDbG9ja1dpc2UgPSBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlO1xuXG5cdFx0dmFyIHN1YlBhdGhzID0gdGhpcy5zdWJQYXRocztcblx0XHRpZiAoIHN1YlBhdGhzLmxlbmd0aCA9PT0gMCApIHJldHVybiBbXTtcblxuXHRcdGlmICggbm9Ib2xlcyA9PT0gdHJ1ZSApXHRyZXR1cm5cdHRvU2hhcGVzTm9Ib2xlcyggc3ViUGF0aHMgKTtcblxuXG5cdFx0dmFyIHNvbGlkLCB0bXBQYXRoLCB0bXBTaGFwZSwgc2hhcGVzID0gW107XG5cblx0XHRpZiAoIHN1YlBhdGhzLmxlbmd0aCA9PT0gMSApIHtcblxuXHRcdFx0dG1wUGF0aCA9IHN1YlBhdGhzWyAwIF07XG5cdFx0XHR0bXBTaGFwZSA9IG5ldyBTaGFwZSgpO1xuXHRcdFx0dG1wU2hhcGUuY3VydmVzID0gdG1wUGF0aC5jdXJ2ZXM7XG5cdFx0XHRzaGFwZXMucHVzaCggdG1wU2hhcGUgKTtcblx0XHRcdHJldHVybiBzaGFwZXM7XG5cblx0XHR9XG5cblx0XHR2YXIgaG9sZXNGaXJzdCA9ICEgaXNDbG9ja1dpc2UoIHN1YlBhdGhzWyAwIF0uZ2V0UG9pbnRzKCkgKTtcblx0XHRob2xlc0ZpcnN0ID0gaXNDQ1cgPyAhIGhvbGVzRmlyc3QgOiBob2xlc0ZpcnN0O1xuXG5cdFx0Ly8gY29uc29sZS5sb2coXCJIb2xlcyBmaXJzdFwiLCBob2xlc0ZpcnN0KTtcblxuXHRcdHZhciBiZXR0ZXJTaGFwZUhvbGVzID0gW107XG5cdFx0dmFyIG5ld1NoYXBlcyA9IFtdO1xuXHRcdHZhciBuZXdTaGFwZUhvbGVzID0gW107XG5cdFx0dmFyIG1haW5JZHggPSAwO1xuXHRcdHZhciB0bXBQb2ludHM7XG5cblx0XHRuZXdTaGFwZXNbIG1haW5JZHggXSA9IHVuZGVmaW5lZDtcblx0XHRuZXdTaGFwZUhvbGVzWyBtYWluSWR4IF0gPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHN1YlBhdGhzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHRtcFBhdGggPSBzdWJQYXRoc1sgaSBdO1xuXHRcdFx0dG1wUG9pbnRzID0gdG1wUGF0aC5nZXRQb2ludHMoKTtcblx0XHRcdHNvbGlkID0gaXNDbG9ja1dpc2UoIHRtcFBvaW50cyApO1xuXHRcdFx0c29saWQgPSBpc0NDVyA/ICEgc29saWQgOiBzb2xpZDtcblxuXHRcdFx0aWYgKCBzb2xpZCApIHtcblxuXHRcdFx0XHRpZiAoICggISBob2xlc0ZpcnN0ICkgJiYgKCBuZXdTaGFwZXNbIG1haW5JZHggXSApIClcdG1haW5JZHggKys7XG5cblx0XHRcdFx0bmV3U2hhcGVzWyBtYWluSWR4IF0gPSB7IHM6IG5ldyBTaGFwZSgpLCBwOiB0bXBQb2ludHMgfTtcblx0XHRcdFx0bmV3U2hhcGVzWyBtYWluSWR4IF0ucy5jdXJ2ZXMgPSB0bXBQYXRoLmN1cnZlcztcblxuXHRcdFx0XHRpZiAoIGhvbGVzRmlyc3QgKVx0bWFpbklkeCArKztcblx0XHRcdFx0bmV3U2hhcGVIb2xlc1sgbWFpbklkeCBdID0gW107XG5cblx0XHRcdFx0Ly9jb25zb2xlLmxvZygnY3cnLCBpKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRuZXdTaGFwZUhvbGVzWyBtYWluSWR4IF0ucHVzaCggeyBoOiB0bXBQYXRoLCBwOiB0bXBQb2ludHNbIDAgXSB9ICk7XG5cblx0XHRcdFx0Ly9jb25zb2xlLmxvZygnY2N3JywgaSk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIG9ubHkgSG9sZXM/IC0+IHByb2JhYmx5IGFsbCBTaGFwZXMgd2l0aCB3cm9uZyBvcmllbnRhdGlvblxuXHRcdGlmICggISBuZXdTaGFwZXNbIDAgXSApXHRyZXR1cm5cdHRvU2hhcGVzTm9Ib2xlcyggc3ViUGF0aHMgKTtcblxuXG5cdFx0aWYgKCBuZXdTaGFwZXMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0dmFyIGFtYmlndW91cyA9IGZhbHNlO1xuXHRcdFx0dmFyIHRvQ2hhbmdlID0gW107XG5cblx0XHRcdGZvciAoIHZhciBzSWR4ID0gMCwgc0xlbiA9IG5ld1NoYXBlcy5sZW5ndGg7IHNJZHggPCBzTGVuOyBzSWR4ICsrICkge1xuXG5cdFx0XHRcdGJldHRlclNoYXBlSG9sZXNbIHNJZHggXSA9IFtdO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIHZhciBzSWR4ID0gMCwgc0xlbiA9IG5ld1NoYXBlcy5sZW5ndGg7IHNJZHggPCBzTGVuOyBzSWR4ICsrICkge1xuXG5cdFx0XHRcdHZhciBzaG8gPSBuZXdTaGFwZUhvbGVzWyBzSWR4IF07XG5cblx0XHRcdFx0Zm9yICggdmFyIGhJZHggPSAwOyBoSWR4IDwgc2hvLmxlbmd0aDsgaElkeCArKyApIHtcblxuXHRcdFx0XHRcdHZhciBobyA9IHNob1sgaElkeCBdO1xuXHRcdFx0XHRcdHZhciBob2xlX3VuYXNzaWduZWQgPSB0cnVlO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIHMySWR4ID0gMDsgczJJZHggPCBuZXdTaGFwZXMubGVuZ3RoOyBzMklkeCArKyApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBpc1BvaW50SW5zaWRlUG9seWdvbiggaG8ucCwgbmV3U2hhcGVzWyBzMklkeCBdLnAgKSApIHtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHNJZHggIT09IHMySWR4IClcdHRvQ2hhbmdlLnB1c2goIHsgZnJvbXM6IHNJZHgsIHRvczogczJJZHgsIGhvbGU6IGhJZHggfSApO1xuXHRcdFx0XHRcdFx0XHRpZiAoIGhvbGVfdW5hc3NpZ25lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGhvbGVfdW5hc3NpZ25lZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdGJldHRlclNoYXBlSG9sZXNbIHMySWR4IF0ucHVzaCggaG8gKTtcblxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0YW1iaWd1b3VzID0gdHJ1ZTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIGhvbGVfdW5hc3NpZ25lZCApIHtcblxuXHRcdFx0XHRcdFx0YmV0dGVyU2hhcGVIb2xlc1sgc0lkeCBdLnB1c2goIGhvICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cdFx0XHQvLyBjb25zb2xlLmxvZyhcImFtYmlndW91czogXCIsIGFtYmlndW91cyk7XG5cdFx0XHRpZiAoIHRvQ2hhbmdlLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJ0byBjaGFuZ2U6IFwiLCB0b0NoYW5nZSk7XG5cdFx0XHRcdGlmICggISBhbWJpZ3VvdXMgKVx0bmV3U2hhcGVIb2xlcyA9IGJldHRlclNoYXBlSG9sZXM7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciB0bXBIb2xlcztcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBuZXdTaGFwZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRtcFNoYXBlID0gbmV3U2hhcGVzWyBpIF0ucztcblx0XHRcdHNoYXBlcy5wdXNoKCB0bXBTaGFwZSApO1xuXHRcdFx0dG1wSG9sZXMgPSBuZXdTaGFwZUhvbGVzWyBpIF07XG5cblx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSB0bXBIb2xlcy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHR0bXBTaGFwZS5ob2xlcy5wdXNoKCB0bXBIb2xlc1sgaiBdLmggKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly9jb25zb2xlLmxvZyhcInNoYXBlXCIsIHNoYXBlcyk7XG5cblx0XHRyZXR1cm4gc2hhcGVzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gRm9udCggZGF0YSApIHtcblxuXHR0aGlzLnR5cGUgPSAnRm9udCc7XG5cblx0dGhpcy5kYXRhID0gZGF0YTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBGb250LnByb3RvdHlwZSwge1xuXG5cdGlzRm9udDogdHJ1ZSxcblxuXHRnZW5lcmF0ZVNoYXBlczogZnVuY3Rpb24gKCB0ZXh0LCBzaXplLCBkaXZpc2lvbnMgKSB7XG5cblx0XHRpZiAoIHNpemUgPT09IHVuZGVmaW5lZCApIHNpemUgPSAxMDA7XG5cdFx0aWYgKCBkaXZpc2lvbnMgPT09IHVuZGVmaW5lZCApIGRpdmlzaW9ucyA9IDQ7XG5cblx0XHR2YXIgc2hhcGVzID0gW107XG5cdFx0dmFyIHBhdGhzID0gY3JlYXRlUGF0aHMoIHRleHQsIHNpemUsIGRpdmlzaW9ucywgdGhpcy5kYXRhICk7XG5cblx0XHRmb3IgKCB2YXIgcCA9IDAsIHBsID0gcGF0aHMubGVuZ3RoOyBwIDwgcGw7IHAgKysgKSB7XG5cblx0XHRcdEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KCBzaGFwZXMsIHBhdGhzWyBwIF0udG9TaGFwZXMoKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNoYXBlcztcblxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gY3JlYXRlUGF0aHMoIHRleHQsIHNpemUsIGRpdmlzaW9ucywgZGF0YSApIHtcblxuXHR2YXIgY2hhcnMgPSBTdHJpbmcoIHRleHQgKS5zcGxpdCggJycgKTtcblx0dmFyIHNjYWxlID0gc2l6ZSAvIGRhdGEucmVzb2x1dGlvbjtcblx0dmFyIGxpbmVfaGVpZ2h0ID0gKCBkYXRhLmJvdW5kaW5nQm94LnlNYXggLSBkYXRhLmJvdW5kaW5nQm94LnlNaW4gKyBkYXRhLnVuZGVybGluZVRoaWNrbmVzcyApICogc2NhbGU7XG5cblx0dmFyIHBhdGhzID0gW107XG5cblx0dmFyIG9mZnNldFggPSAwLCBvZmZzZXRZID0gMDtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHR2YXIgY2hhciA9IGNoYXJzWyBpIF07XG5cblx0XHRpZiAoIGNoYXIgPT09ICdcXG4nICkge1xuXG5cdFx0XHRvZmZzZXRYID0gMDtcblx0XHRcdG9mZnNldFkgLT0gbGluZV9oZWlnaHQ7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgcmV0ID0gY3JlYXRlUGF0aCggY2hhciwgZGl2aXNpb25zLCBzY2FsZSwgb2Zmc2V0WCwgb2Zmc2V0WSwgZGF0YSApO1xuXHRcdFx0b2Zmc2V0WCArPSByZXQub2Zmc2V0WDtcblx0XHRcdHBhdGhzLnB1c2goIHJldC5wYXRoICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiBwYXRocztcblxufVxuXG5mdW5jdGlvbiBjcmVhdGVQYXRoKCBjaGFyLCBkaXZpc2lvbnMsIHNjYWxlLCBvZmZzZXRYLCBvZmZzZXRZLCBkYXRhICkge1xuXG5cdHZhciBnbHlwaCA9IGRhdGEuZ2x5cGhzWyBjaGFyIF0gfHwgZGF0YS5nbHlwaHNbICc/JyBdO1xuXG5cdGlmICggISBnbHlwaCApIHJldHVybjtcblxuXHR2YXIgcGF0aCA9IG5ldyBTaGFwZVBhdGgoKTtcblxuXHR2YXIgeCwgeSwgY3B4LCBjcHksIGNweDEsIGNweTEsIGNweDIsIGNweTI7XG5cblx0aWYgKCBnbHlwaC5vICkge1xuXG5cdFx0dmFyIG91dGxpbmUgPSBnbHlwaC5fY2FjaGVkT3V0bGluZSB8fCAoIGdseXBoLl9jYWNoZWRPdXRsaW5lID0gZ2x5cGguby5zcGxpdCggJyAnICkgKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IG91dGxpbmUubGVuZ3RoOyBpIDwgbDsgKSB7XG5cblx0XHRcdHZhciBhY3Rpb24gPSBvdXRsaW5lWyBpICsrIF07XG5cblx0XHRcdHN3aXRjaCAoIGFjdGlvbiApIHtcblxuXHRcdFx0XHRjYXNlICdtJzogLy8gbW92ZVRvXG5cblx0XHRcdFx0XHR4ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdHkgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7XG5cblx0XHRcdFx0XHRwYXRoLm1vdmVUbyggeCwgeSApO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnbCc6IC8vIGxpbmVUb1xuXG5cdFx0XHRcdFx0eCA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDtcblx0XHRcdFx0XHR5ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXG5cdFx0XHRcdFx0cGF0aC5saW5lVG8oIHgsIHkgKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ3EnOiAvLyBxdWFkcmF0aWNDdXJ2ZVRvXG5cblx0XHRcdFx0XHRjcHggPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0Y3B5ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXHRcdFx0XHRcdGNweDEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0Y3B5MSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblxuXHRcdFx0XHRcdHBhdGgucXVhZHJhdGljQ3VydmVUbyggY3B4MSwgY3B5MSwgY3B4LCBjcHkgKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ2InOiAvLyBiZXppZXJDdXJ2ZVRvXG5cblx0XHRcdFx0XHRjcHggPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0Y3B5ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXHRcdFx0XHRcdGNweDEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0Y3B5MSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblx0XHRcdFx0XHRjcHgyID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdGNweTIgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7XG5cblx0XHRcdFx0XHRwYXRoLmJlemllckN1cnZlVG8oIGNweDEsIGNweTEsIGNweDIsIGNweTIsIGNweCwgY3B5ICk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4geyBvZmZzZXRYOiBnbHlwaC5oYSAqIHNjYWxlLCBwYXRoOiBwYXRoIH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEZvbnRMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggRm9udExvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcblxuXHRcdFx0dmFyIGpzb247XG5cblx0XHRcdHRyeSB7XG5cblx0XHRcdFx0anNvbiA9IEpTT04ucGFyc2UoIHRleHQgKTtcblxuXHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRm9udExvYWRlcjogdHlwZWZhY2UuanMgc3VwcG9ydCBpcyBiZWluZyBkZXByZWNhdGVkLiBVc2UgdHlwZWZhY2UuanNvbiBpbnN0ZWFkLicgKTtcblx0XHRcdFx0anNvbiA9IEpTT04ucGFyc2UoIHRleHQuc3Vic3RyaW5nKCA2NSwgdGV4dC5sZW5ndGggLSAyICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZm9udCA9IHNjb3BlLnBhcnNlKCBqc29uICk7XG5cblx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCBmb250ICk7XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fSxcblxuXHRwYXJzZTogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0cmV0dXJuIG5ldyBGb250KCBqc29uICk7XG5cblx0fSxcblxuXHRzZXRQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYXRoID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG52YXIgY29udGV4dDtcblxudmFyIEF1ZGlvQ29udGV4dCA9IHtcblxuXHRnZXRDb250ZXh0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIGNvbnRleHQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29udGV4dCA9IG5ldyAoIHdpbmRvdy5BdWRpb0NvbnRleHQgfHwgd2luZG93LndlYmtpdEF1ZGlvQ29udGV4dCApKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY29udGV4dDtcblxuXHR9LFxuXG5cdHNldENvbnRleHQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRjb250ZXh0ID0gdmFsdWU7XG5cblx0fVxuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgUmVlY2UgQWFyb24gTGVjcml2YWluIC8gaHR0cDovL3JlZWNlbm90ZXMuY29tL1xuICovXG5cbmZ1bmN0aW9uIEF1ZGlvTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEF1ZGlvTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHRoaXMubWFuYWdlciApO1xuXHRcdGxvYWRlci5zZXRSZXNwb25zZVR5cGUoICdhcnJheWJ1ZmZlcicgKTtcblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIGJ1ZmZlciApIHtcblxuXHRcdFx0dmFyIGNvbnRleHQgPSBBdWRpb0NvbnRleHQuZ2V0Q29udGV4dCgpO1xuXG5cdFx0XHRjb250ZXh0LmRlY29kZUF1ZGlvRGF0YSggYnVmZmVyLCBmdW5jdGlvbiAoIGF1ZGlvQnVmZmVyICkge1xuXG5cdFx0XHRcdG9uTG9hZCggYXVkaW9CdWZmZXIgKTtcblxuXHRcdFx0fSApO1xuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gU3RlcmVvQ2FtZXJhKCkge1xuXG5cdHRoaXMudHlwZSA9ICdTdGVyZW9DYW1lcmEnO1xuXG5cdHRoaXMuYXNwZWN0ID0gMTtcblxuXHR0aGlzLmV5ZVNlcCA9IDAuMDY0O1xuXG5cdHRoaXMuY2FtZXJhTCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpO1xuXHR0aGlzLmNhbWVyYUwubGF5ZXJzLmVuYWJsZSggMSApO1xuXHR0aGlzLmNhbWVyYUwubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMuY2FtZXJhUiA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpO1xuXHR0aGlzLmNhbWVyYVIubGF5ZXJzLmVuYWJsZSggMiApO1xuXHR0aGlzLmNhbWVyYVIubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFN0ZXJlb0NhbWVyYS5wcm90b3R5cGUsIHtcblxuXHR1cGRhdGU6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGluc3RhbmNlLCBmb2N1cywgZm92LCBhc3BlY3QsIG5lYXIsIGZhciwgem9vbSwgZXllU2VwO1xuXG5cdFx0dmFyIGV5ZVJpZ2h0ID0gbmV3IE1hdHJpeDQoKTtcblx0XHR2YXIgZXllTGVmdCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCBjYW1lcmEgKSB7XG5cblx0XHRcdHZhciBuZWVkc1VwZGF0ZSA9IGluc3RhbmNlICE9PSB0aGlzIHx8IGZvY3VzICE9PSBjYW1lcmEuZm9jdXMgfHwgZm92ICE9PSBjYW1lcmEuZm92IHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhc3BlY3QgIT09IGNhbWVyYS5hc3BlY3QgKiB0aGlzLmFzcGVjdCB8fCBuZWFyICE9PSBjYW1lcmEubmVhciB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZmFyICE9PSBjYW1lcmEuZmFyIHx8IHpvb20gIT09IGNhbWVyYS56b29tIHx8IGV5ZVNlcCAhPT0gdGhpcy5leWVTZXA7XG5cblx0XHRcdGlmICggbmVlZHNVcGRhdGUgKSB7XG5cblx0XHRcdFx0aW5zdGFuY2UgPSB0aGlzO1xuXHRcdFx0XHRmb2N1cyA9IGNhbWVyYS5mb2N1cztcblx0XHRcdFx0Zm92ID0gY2FtZXJhLmZvdjtcblx0XHRcdFx0YXNwZWN0ID0gY2FtZXJhLmFzcGVjdCAqIHRoaXMuYXNwZWN0O1xuXHRcdFx0XHRuZWFyID0gY2FtZXJhLm5lYXI7XG5cdFx0XHRcdGZhciA9IGNhbWVyYS5mYXI7XG5cdFx0XHRcdHpvb20gPSBjYW1lcmEuem9vbTtcblxuXHRcdFx0XHQvLyBPZmYtYXhpcyBzdGVyZW9zY29waWMgZWZmZWN0IGJhc2VkIG9uXG5cdFx0XHRcdC8vIGh0dHA6Ly9wYXVsYm91cmtlLm5ldC9zdGVyZW9ncmFwaGljcy9zdGVyZW9yZW5kZXIvXG5cblx0XHRcdFx0dmFyIHByb2plY3Rpb25NYXRyaXggPSBjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5jbG9uZSgpO1xuXHRcdFx0XHRleWVTZXAgPSB0aGlzLmV5ZVNlcCAvIDI7XG5cdFx0XHRcdHZhciBleWVTZXBPblByb2plY3Rpb24gPSBleWVTZXAgKiBuZWFyIC8gZm9jdXM7XG5cdFx0XHRcdHZhciB5bWF4ID0gKCBuZWFyICogTWF0aC50YW4oIF9NYXRoLkRFRzJSQUQgKiBmb3YgKiAwLjUgKSApIC8gem9vbTtcblx0XHRcdFx0dmFyIHhtaW4sIHhtYXg7XG5cblx0XHRcdFx0Ly8gdHJhbnNsYXRlIHhPZmZzZXRcblxuXHRcdFx0XHRleWVMZWZ0LmVsZW1lbnRzWyAxMiBdID0gLSBleWVTZXA7XG5cdFx0XHRcdGV5ZVJpZ2h0LmVsZW1lbnRzWyAxMiBdID0gZXllU2VwO1xuXG5cdFx0XHRcdC8vIGZvciBsZWZ0IGV5ZVxuXG5cdFx0XHRcdHhtaW4gPSAtIHltYXggKiBhc3BlY3QgKyBleWVTZXBPblByb2plY3Rpb247XG5cdFx0XHRcdHhtYXggPSB5bWF4ICogYXNwZWN0ICsgZXllU2VwT25Qcm9qZWN0aW9uO1xuXG5cdFx0XHRcdHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDAgXSA9IDIgKiBuZWFyIC8gKCB4bWF4IC0geG1pbiApO1xuXHRcdFx0XHRwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyA4IF0gPSAoIHhtYXggKyB4bWluICkgLyAoIHhtYXggLSB4bWluICk7XG5cblx0XHRcdFx0dGhpcy5jYW1lcmFMLnByb2plY3Rpb25NYXRyaXguY29weSggcHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0XHRcdC8vIGZvciByaWdodCBleWVcblxuXHRcdFx0XHR4bWluID0gLSB5bWF4ICogYXNwZWN0IC0gZXllU2VwT25Qcm9qZWN0aW9uO1xuXHRcdFx0XHR4bWF4ID0geW1heCAqIGFzcGVjdCAtIGV5ZVNlcE9uUHJvamVjdGlvbjtcblxuXHRcdFx0XHRwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyAwIF0gPSAyICogbmVhciAvICggeG1heCAtIHhtaW4gKTtcblx0XHRcdFx0cHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgOCBdID0gKCB4bWF4ICsgeG1pbiApIC8gKCB4bWF4IC0geG1pbiApO1xuXG5cdFx0XHRcdHRoaXMuY2FtZXJhUi5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIHByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmNhbWVyYUwubWF0cml4V29ybGQuY29weSggY2FtZXJhLm1hdHJpeFdvcmxkICkubXVsdGlwbHkoIGV5ZUxlZnQgKTtcblx0XHRcdHRoaXMuY2FtZXJhUi5tYXRyaXhXb3JsZC5jb3B5KCBjYW1lcmEubWF0cml4V29ybGQgKS5tdWx0aXBseSggZXllUmlnaHQgKTtcblxuXHRcdH07XG5cblx0fSApKClcblxufSApO1xuXG4vKipcbiAqIENhbWVyYSBmb3IgcmVuZGVyaW5nIGN1YmUgbWFwc1xuICpcdC0gcmVuZGVycyBzY2VuZSBpbnRvIGF4aXMtYWxpZ25lZCBjdWJlXG4gKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBDdWJlQ2FtZXJhKCBuZWFyLCBmYXIsIGN1YmVSZXNvbHV0aW9uICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ3ViZUNhbWVyYSc7XG5cblx0dmFyIGZvdiA9IDkwLCBhc3BlY3QgPSAxO1xuXG5cdHZhciBjYW1lcmFQWCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xuXHRjYW1lcmFQWC51cC5zZXQoIDAsIC0gMSwgMCApO1xuXHRjYW1lcmFQWC5sb29rQXQoIG5ldyBWZWN0b3IzKCAxLCAwLCAwICkgKTtcblx0dGhpcy5hZGQoIGNhbWVyYVBYICk7XG5cblx0dmFyIGNhbWVyYU5YID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XG5cdGNhbWVyYU5YLnVwLnNldCggMCwgLSAxLCAwICk7XG5cdGNhbWVyYU5YLmxvb2tBdCggbmV3IFZlY3RvcjMoIC0gMSwgMCwgMCApICk7XG5cdHRoaXMuYWRkKCBjYW1lcmFOWCApO1xuXG5cdHZhciBjYW1lcmFQWSA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xuXHRjYW1lcmFQWS51cC5zZXQoIDAsIDAsIDEgKTtcblx0Y2FtZXJhUFkubG9va0F0KCBuZXcgVmVjdG9yMyggMCwgMSwgMCApICk7XG5cdHRoaXMuYWRkKCBjYW1lcmFQWSApO1xuXG5cdHZhciBjYW1lcmFOWSA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xuXHRjYW1lcmFOWS51cC5zZXQoIDAsIDAsIC0gMSApO1xuXHRjYW1lcmFOWS5sb29rQXQoIG5ldyBWZWN0b3IzKCAwLCAtIDEsIDAgKSApO1xuXHR0aGlzLmFkZCggY2FtZXJhTlkgKTtcblxuXHR2YXIgY2FtZXJhUFogPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTtcblx0Y2FtZXJhUFoudXAuc2V0KCAwLCAtIDEsIDAgKTtcblx0Y2FtZXJhUFoubG9va0F0KCBuZXcgVmVjdG9yMyggMCwgMCwgMSApICk7XG5cdHRoaXMuYWRkKCBjYW1lcmFQWiApO1xuXG5cdHZhciBjYW1lcmFOWiA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xuXHRjYW1lcmFOWi51cC5zZXQoIDAsIC0gMSwgMCApO1xuXHRjYW1lcmFOWi5sb29rQXQoIG5ldyBWZWN0b3IzKCAwLCAwLCAtIDEgKSApO1xuXHR0aGlzLmFkZCggY2FtZXJhTlogKTtcblxuXHR2YXIgb3B0aW9ucyA9IHsgZm9ybWF0OiBSR0JGb3JtYXQsIG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyLCBtaW5GaWx0ZXI6IExpbmVhckZpbHRlciB9O1xuXG5cdHRoaXMucmVuZGVyVGFyZ2V0ID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZSggY3ViZVJlc29sdXRpb24sIGN1YmVSZXNvbHV0aW9uLCBvcHRpb25zICk7XG5cdHRoaXMucmVuZGVyVGFyZ2V0LnRleHR1cmUubmFtZSA9IFwiQ3ViZUNhbWVyYVwiO1xuXG5cdHRoaXMudXBkYXRlID0gZnVuY3Rpb24gKCByZW5kZXJlciwgc2NlbmUgKSB7XG5cblx0XHRpZiAoIHRoaXMucGFyZW50ID09PSBudWxsICkgdGhpcy51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0dmFyIHJlbmRlclRhcmdldCA9IHRoaXMucmVuZGVyVGFyZ2V0O1xuXHRcdHZhciBnZW5lcmF0ZU1pcG1hcHMgPSByZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM7XG5cblx0XHRyZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblxuXHRcdHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IDA7XG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhUFgsIHJlbmRlclRhcmdldCApO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gMTtcblx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFOWCwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRyZW5kZXJUYXJnZXQuYWN0aXZlQ3ViZUZhY2UgPSAyO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYVBZLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IDM7XG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhTlksIHJlbmRlclRhcmdldCApO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gNDtcblx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFQWiwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRyZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBnZW5lcmF0ZU1pcG1hcHM7XG5cblx0XHRyZW5kZXJUYXJnZXQuYWN0aXZlQ3ViZUZhY2UgPSA1O1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYU5aLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggbnVsbCApO1xuXG5cdH07XG5cblx0dGhpcy5jbGVhciA9IGZ1bmN0aW9uICggcmVuZGVyZXIsIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApIHtcblxuXHRcdHZhciByZW5kZXJUYXJnZXQgPSB0aGlzLnJlbmRlclRhcmdldDtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IGk7XG5cdFx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApO1xuXG5cdFx0XHRyZW5kZXJlci5jbGVhciggY29sb3IsIGRlcHRoLCBzdGVuY2lsICk7XG5cblx0XHR9XG5cblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIG51bGwgKTtcblxuXHR9O1xuXG59XG5cbkN1YmVDYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7XG5DdWJlQ2FtZXJhLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN1YmVDYW1lcmE7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBBdWRpb0xpc3RlbmVyKCkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQXVkaW9MaXN0ZW5lcic7XG5cblx0dGhpcy5jb250ZXh0ID0gQXVkaW9Db250ZXh0LmdldENvbnRleHQoKTtcblxuXHR0aGlzLmdhaW4gPSB0aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpO1xuXHR0aGlzLmdhaW4uY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cblx0dGhpcy5maWx0ZXIgPSBudWxsO1xuXG59XG5cbkF1ZGlvTGlzdGVuZXIucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQXVkaW9MaXN0ZW5lcixcblxuXHRnZXRJbnB1dDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2FpbjtcblxuXHR9LFxuXG5cdHJlbW92ZUZpbHRlcjogZnVuY3Rpb24gKCApIHtcblxuXHRcdGlmICggdGhpcy5maWx0ZXIgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuZ2Fpbi5kaXNjb25uZWN0KCB0aGlzLmZpbHRlciApO1xuXHRcdFx0dGhpcy5maWx0ZXIuZGlzY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cdFx0XHR0aGlzLmdhaW4uY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cdFx0XHR0aGlzLmZpbHRlciA9IG51bGw7XG5cblx0XHR9XG5cblx0fSxcblxuXHRnZXRGaWx0ZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmZpbHRlcjtcblxuXHR9LFxuXG5cdHNldEZpbHRlcjogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdGhpcy5maWx0ZXIgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuZ2Fpbi5kaXNjb25uZWN0KCB0aGlzLmZpbHRlciApO1xuXHRcdFx0dGhpcy5maWx0ZXIuZGlzY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmdhaW4uZGlzY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmZpbHRlciA9IHZhbHVlO1xuXHRcdHRoaXMuZ2Fpbi5jb25uZWN0KCB0aGlzLmZpbHRlciApO1xuXHRcdHRoaXMuZmlsdGVyLmNvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xuXG5cdH0sXG5cblx0Z2V0TWFzdGVyVm9sdW1lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nYWluLmdhaW4udmFsdWU7XG5cblx0fSxcblxuXHRzZXRNYXN0ZXJWb2x1bWU6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmdhaW4uZ2Fpbi5zZXRUYXJnZXRBdFRpbWUoIHZhbHVlLCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsIDAuMDEgKTtcblxuXHR9LFxuXG5cdHVwZGF0ZU1hdHJpeFdvcmxkOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXHRcdHZhciBzY2FsZSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgb3JpZW50YXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApIHtcblxuXHRcdFx0T2JqZWN0M0QucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7XG5cblx0XHRcdHZhciBsaXN0ZW5lciA9IHRoaXMuY29udGV4dC5saXN0ZW5lcjtcblx0XHRcdHZhciB1cCA9IHRoaXMudXA7XG5cblx0XHRcdHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgc2NhbGUgKTtcblxuXHRcdFx0b3JpZW50YXRpb24uc2V0KCAwLCAwLCAtIDEgKS5hcHBseVF1YXRlcm5pb24oIHF1YXRlcm5pb24gKTtcblxuXHRcdFx0aWYgKCBsaXN0ZW5lci5wb3NpdGlvblggKSB7XG5cblx0XHRcdFx0bGlzdGVuZXIucG9zaXRpb25YLnNldFZhbHVlQXRUaW1lKCBwb3NpdGlvbi54LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIucG9zaXRpb25ZLnNldFZhbHVlQXRUaW1lKCBwb3NpdGlvbi55LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIucG9zaXRpb25aLnNldFZhbHVlQXRUaW1lKCBwb3NpdGlvbi56LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIuZm9yd2FyZFguc2V0VmFsdWVBdFRpbWUoIG9yaWVudGF0aW9uLngsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXHRcdFx0XHRsaXN0ZW5lci5mb3J3YXJkWS5zZXRWYWx1ZUF0VGltZSggb3JpZW50YXRpb24ueSwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7XG5cdFx0XHRcdGxpc3RlbmVyLmZvcndhcmRaLnNldFZhbHVlQXRUaW1lKCBvcmllbnRhdGlvbi56LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIudXBYLnNldFZhbHVlQXRUaW1lKCB1cC54LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIudXBZLnNldFZhbHVlQXRUaW1lKCB1cC55LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIudXBaLnNldFZhbHVlQXRUaW1lKCB1cC56LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRsaXN0ZW5lci5zZXRQb3NpdGlvbiggcG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueiApO1xuXHRcdFx0XHRsaXN0ZW5lci5zZXRPcmllbnRhdGlvbiggb3JpZW50YXRpb24ueCwgb3JpZW50YXRpb24ueSwgb3JpZW50YXRpb24ueiwgdXAueCwgdXAueSwgdXAueiApO1xuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0gKSgpXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBSZWVjZSBBYXJvbiBMZWNyaXZhaW4gLyBodHRwOi8vcmVlY2Vub3Rlcy5jb20vXG4gKi9cblxuZnVuY3Rpb24gQXVkaW8oIGxpc3RlbmVyICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQXVkaW8nO1xuXG5cdHRoaXMuY29udGV4dCA9IGxpc3RlbmVyLmNvbnRleHQ7XG5cblx0dGhpcy5nYWluID0gdGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKTtcblx0dGhpcy5nYWluLmNvbm5lY3QoIGxpc3RlbmVyLmdldElucHV0KCkgKTtcblxuXHR0aGlzLmF1dG9wbGF5ID0gZmFsc2U7XG5cblx0dGhpcy5idWZmZXIgPSBudWxsO1xuXHR0aGlzLmxvb3AgPSBmYWxzZTtcblx0dGhpcy5zdGFydFRpbWUgPSAwO1xuXHR0aGlzLm9mZnNldCA9IDA7XG5cdHRoaXMucGxheWJhY2tSYXRlID0gMTtcblx0dGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcblx0dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPSB0cnVlO1xuXHR0aGlzLnNvdXJjZVR5cGUgPSAnZW1wdHknO1xuXG5cdHRoaXMuZmlsdGVycyA9IFtdO1xuXG59XG5cbkF1ZGlvLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEF1ZGlvLFxuXG5cdGdldE91dHB1dDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2FpbjtcblxuXHR9LFxuXG5cdHNldE5vZGVTb3VyY2U6IGZ1bmN0aW9uICggYXVkaW9Ob2RlICkge1xuXG5cdFx0dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPSBmYWxzZTtcblx0XHR0aGlzLnNvdXJjZVR5cGUgPSAnYXVkaW9Ob2RlJztcblx0XHR0aGlzLnNvdXJjZSA9IGF1ZGlvTm9kZTtcblx0XHR0aGlzLmNvbm5lY3QoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0QnVmZmVyOiBmdW5jdGlvbiAoIGF1ZGlvQnVmZmVyICkge1xuXG5cdFx0dGhpcy5idWZmZXIgPSBhdWRpb0J1ZmZlcjtcblx0XHR0aGlzLnNvdXJjZVR5cGUgPSAnYnVmZmVyJztcblxuXHRcdGlmICggdGhpcy5hdXRvcGxheSApIHRoaXMucGxheSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRwbGF5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogQXVkaW8gaXMgYWxyZWFkeSBwbGF5aW5nLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR2YXIgc291cmNlID0gdGhpcy5jb250ZXh0LmNyZWF0ZUJ1ZmZlclNvdXJjZSgpO1xuXG5cdFx0c291cmNlLmJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuXHRcdHNvdXJjZS5sb29wID0gdGhpcy5sb29wO1xuXHRcdHNvdXJjZS5vbmVuZGVkID0gdGhpcy5vbkVuZGVkLmJpbmQoIHRoaXMgKTtcblx0XHRzb3VyY2UucGxheWJhY2tSYXRlLnNldFZhbHVlQXRUaW1lKCB0aGlzLnBsYXliYWNrUmF0ZSwgdGhpcy5zdGFydFRpbWUgKTtcblx0XHR0aGlzLnN0YXJ0VGltZSA9IHRoaXMuY29udGV4dC5jdXJyZW50VGltZTtcblx0XHRzb3VyY2Uuc3RhcnQoIHRoaXMuc3RhcnRUaW1lLCB0aGlzLm9mZnNldCApO1xuXG5cdFx0dGhpcy5pc1BsYXlpbmcgPSB0cnVlO1xuXG5cdFx0dGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cblx0XHRyZXR1cm4gdGhpcy5jb25uZWN0KCk7XG5cblx0fSxcblxuXHRwYXVzZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdHRoaXMuc291cmNlLnN0b3AoKTtcblx0XHRcdHRoaXMub2Zmc2V0ICs9ICggdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lIC0gdGhpcy5zdGFydFRpbWUgKSAqIHRoaXMucGxheWJhY2tSYXRlO1xuXHRcdFx0dGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3RvcDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHRoaXMuc291cmNlLnN0b3AoKTtcblx0XHR0aGlzLm9mZnNldCA9IDA7XG5cdFx0dGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29ubmVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmZpbHRlcnMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dGhpcy5zb3VyY2UuY29ubmVjdCggdGhpcy5maWx0ZXJzWyAwIF0gKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gdGhpcy5maWx0ZXJzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dGhpcy5maWx0ZXJzWyBpIC0gMSBdLmNvbm5lY3QoIHRoaXMuZmlsdGVyc1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5maWx0ZXJzWyB0aGlzLmZpbHRlcnMubGVuZ3RoIC0gMSBdLmNvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuc291cmNlLmNvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGlzY29ubmVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmZpbHRlcnMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dGhpcy5zb3VyY2UuZGlzY29ubmVjdCggdGhpcy5maWx0ZXJzWyAwIF0gKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gdGhpcy5maWx0ZXJzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dGhpcy5maWx0ZXJzWyBpIC0gMSBdLmRpc2Nvbm5lY3QoIHRoaXMuZmlsdGVyc1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5maWx0ZXJzWyB0aGlzLmZpbHRlcnMubGVuZ3RoIC0gMSBdLmRpc2Nvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuc291cmNlLmRpc2Nvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0RmlsdGVyczogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVycztcblxuXHR9LFxuXG5cdHNldEZpbHRlcnM6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoICEgdmFsdWUgKSB2YWx1ZSA9IFtdO1xuXG5cdFx0aWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0dGhpcy5kaXNjb25uZWN0KCk7XG5cdFx0XHR0aGlzLmZpbHRlcnMgPSB2YWx1ZTtcblx0XHRcdHRoaXMuY29ubmVjdCgpO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5maWx0ZXJzID0gdmFsdWU7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldEZpbHRlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0RmlsdGVycygpWyAwIF07XG5cblx0fSxcblxuXHRzZXRGaWx0ZXI6IGZ1bmN0aW9uICggZmlsdGVyICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0RmlsdGVycyggZmlsdGVyID8gWyBmaWx0ZXIgXSA6IFtdICk7XG5cblx0fSxcblxuXHRzZXRQbGF5YmFja1JhdGU6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5wbGF5YmFja1JhdGUgPSB2YWx1ZTtcblxuXHRcdGlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdHRoaXMuc291cmNlLnBsYXliYWNrUmF0ZS5zZXRWYWx1ZUF0VGltZSggdGhpcy5wbGF5YmFja1JhdGUsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRQbGF5YmFja1JhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnBsYXliYWNrUmF0ZTtcblxuXHR9LFxuXG5cdG9uRW5kZWQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG5cblx0fSxcblxuXHRnZXRMb29wOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMubG9vcDtcblxuXHR9LFxuXG5cdHNldExvb3A6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5sb29wID0gdmFsdWU7XG5cblx0XHRpZiAoIHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICkge1xuXG5cdFx0XHR0aGlzLnNvdXJjZS5sb29wID0gdGhpcy5sb29wO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRWb2x1bWU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZTtcblxuXHR9LFxuXG5cdHNldFZvbHVtZTogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZSggdmFsdWUsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwgMC4wMSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBQb3NpdGlvbmFsQXVkaW8oIGxpc3RlbmVyICkge1xuXG5cdEF1ZGlvLmNhbGwoIHRoaXMsIGxpc3RlbmVyICk7XG5cblx0dGhpcy5wYW5uZXIgPSB0aGlzLmNvbnRleHQuY3JlYXRlUGFubmVyKCk7XG5cdHRoaXMucGFubmVyLmNvbm5lY3QoIHRoaXMuZ2FpbiApO1xuXG59XG5cblBvc2l0aW9uYWxBdWRpby5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBBdWRpby5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBQb3NpdGlvbmFsQXVkaW8sXG5cblx0Z2V0T3V0cHV0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5wYW5uZXI7XG5cblx0fSxcblxuXHRnZXRSZWZEaXN0YW5jZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyLnJlZkRpc3RhbmNlO1xuXG5cdH0sXG5cblx0c2V0UmVmRGlzdGFuY2U6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnBhbm5lci5yZWZEaXN0YW5jZSA9IHZhbHVlO1xuXG5cdH0sXG5cblx0Z2V0Um9sbG9mZkZhY3RvcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyLnJvbGxvZmZGYWN0b3I7XG5cblx0fSxcblxuXHRzZXRSb2xsb2ZmRmFjdG9yOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYW5uZXIucm9sbG9mZkZhY3RvciA9IHZhbHVlO1xuXG5cdH0sXG5cblx0Z2V0RGlzdGFuY2VNb2RlbDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyLmRpc3RhbmNlTW9kZWw7XG5cblx0fSxcblxuXHRzZXREaXN0YW5jZU1vZGVsOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbCA9IHZhbHVlO1xuXG5cdH0sXG5cblx0Z2V0TWF4RGlzdGFuY2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnBhbm5lci5tYXhEaXN0YW5jZTtcblxuXHR9LFxuXG5cdHNldE1heERpc3RhbmNlOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYW5uZXIubWF4RGlzdGFuY2UgPSB2YWx1ZTtcblxuXHR9LFxuXG5cdHVwZGF0ZU1hdHJpeFdvcmxkOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICkge1xuXG5cdFx0XHRPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTtcblxuXHRcdFx0cG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdHRoaXMucGFubmVyLnNldFBvc2l0aW9uKCBwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56ICk7XG5cblx0XHR9O1xuXG5cdH0gKSgpXG5cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQXVkaW9BbmFseXNlciggYXVkaW8sIGZmdFNpemUgKSB7XG5cblx0dGhpcy5hbmFseXNlciA9IGF1ZGlvLmNvbnRleHQuY3JlYXRlQW5hbHlzZXIoKTtcblx0dGhpcy5hbmFseXNlci5mZnRTaXplID0gZmZ0U2l6ZSAhPT0gdW5kZWZpbmVkID8gZmZ0U2l6ZSA6IDIwNDg7XG5cblx0dGhpcy5kYXRhID0gbmV3IFVpbnQ4QXJyYXkoIHRoaXMuYW5hbHlzZXIuZnJlcXVlbmN5QmluQ291bnQgKTtcblxuXHRhdWRpby5nZXRPdXRwdXQoKS5jb25uZWN0KCB0aGlzLmFuYWx5c2VyICk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQXVkaW9BbmFseXNlci5wcm90b3R5cGUsIHtcblxuXHRnZXRGcmVxdWVuY3lEYXRhOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmFuYWx5c2VyLmdldEJ5dGVGcmVxdWVuY3lEYXRhKCB0aGlzLmRhdGEgKTtcblxuXHRcdHJldHVybiB0aGlzLmRhdGE7XG5cblx0fSxcblxuXHRnZXRBdmVyYWdlRnJlcXVlbmN5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdmFsdWUgPSAwLCBkYXRhID0gdGhpcy5nZXRGcmVxdWVuY3lEYXRhKCk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFsdWUgKz0gZGF0YVsgaSBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbHVlIC8gZGF0YS5sZW5ndGg7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEJ1ZmZlcmVkIHNjZW5lIGdyYXBoIHByb3BlcnR5IHRoYXQgYWxsb3dzIHdlaWdodGVkIGFjY3VtdWxhdGlvbi5cbiAqXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFByb3BlcnR5TWl4ZXIoIGJpbmRpbmcsIHR5cGVOYW1lLCB2YWx1ZVNpemUgKSB7XG5cblx0dGhpcy5iaW5kaW5nID0gYmluZGluZztcblx0dGhpcy52YWx1ZVNpemUgPSB2YWx1ZVNpemU7XG5cblx0dmFyIGJ1ZmZlclR5cGUgPSBGbG9hdDY0QXJyYXksXG5cdFx0bWl4RnVuY3Rpb247XG5cblx0c3dpdGNoICggdHlwZU5hbWUgKSB7XG5cblx0XHRjYXNlICdxdWF0ZXJuaW9uJzpcblx0XHRcdG1peEZ1bmN0aW9uID0gdGhpcy5fc2xlcnA7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgJ3N0cmluZyc6XG5cdFx0Y2FzZSAnYm9vbCc6XG5cdFx0XHRidWZmZXJUeXBlID0gQXJyYXk7XG5cdFx0XHRtaXhGdW5jdGlvbiA9IHRoaXMuX3NlbGVjdDtcblx0XHRcdGJyZWFrO1xuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdG1peEZ1bmN0aW9uID0gdGhpcy5fbGVycDtcblxuXHR9XG5cblx0dGhpcy5idWZmZXIgPSBuZXcgYnVmZmVyVHlwZSggdmFsdWVTaXplICogNCApO1xuXHQvLyBsYXlvdXQ6IFsgaW5jb21pbmcgfCBhY2N1MCB8IGFjY3UxIHwgb3JpZyBdXG5cdC8vXG5cdC8vIGludGVycG9sYXRvcnMgY2FuIHVzZSAuYnVmZmVyIGFzIHRoZWlyIC5yZXN1bHRcblx0Ly8gdGhlIGRhdGEgdGhlbiBnb2VzIHRvICdpbmNvbWluZydcblx0Ly9cblx0Ly8gJ2FjY3UwJyBhbmQgJ2FjY3UxJyBhcmUgdXNlZCBmcmFtZS1pbnRlcmxlYXZlZCBmb3Jcblx0Ly8gdGhlIGN1bXVsYXRpdmUgcmVzdWx0IGFuZCBhcmUgY29tcGFyZWQgdG8gZGV0ZWN0XG5cdC8vIGNoYW5nZXNcblx0Ly9cblx0Ly8gJ29yaWcnIHN0b3JlcyB0aGUgb3JpZ2luYWwgc3RhdGUgb2YgdGhlIHByb3BlcnR5XG5cblx0dGhpcy5fbWl4QnVmZmVyUmVnaW9uID0gbWl4RnVuY3Rpb247XG5cblx0dGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gMDtcblxuXHR0aGlzLnVzZUNvdW50ID0gMDtcblx0dGhpcy5yZWZlcmVuY2VDb3VudCA9IDA7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggUHJvcGVydHlNaXhlci5wcm90b3R5cGUsIHtcblxuXHQvLyBhY2N1bXVsYXRlIGRhdGEgaW4gdGhlICdpbmNvbWluZycgcmVnaW9uIGludG8gJ2FjY3U8aT4nXG5cdGFjY3VtdWxhdGU6IGZ1bmN0aW9uICggYWNjdUluZGV4LCB3ZWlnaHQgKSB7XG5cblx0XHQvLyBub3RlOiBoYXBwaWx5IGFjY3VtdWxhdGluZyBub3RoaW5nIHdoZW4gd2VpZ2h0ID0gMCwgdGhlIGNhbGxlciBrbm93c1xuXHRcdC8vIHRoZSB3ZWlnaHQgYW5kIHNob3VsZG4ndCBoYXZlIG1hZGUgdGhlIGNhbGwgaW4gdGhlIGZpcnN0IHBsYWNlXG5cblx0XHR2YXIgYnVmZmVyID0gdGhpcy5idWZmZXIsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblx0XHRcdG9mZnNldCA9IGFjY3VJbmRleCAqIHN0cmlkZSArIHN0cmlkZSxcblxuXHRcdFx0Y3VycmVudFdlaWdodCA9IHRoaXMuY3VtdWxhdGl2ZVdlaWdodDtcblxuXHRcdGlmICggY3VycmVudFdlaWdodCA9PT0gMCApIHtcblxuXHRcdFx0Ly8gYWNjdU4gOj0gaW5jb21pbmcgKiB3ZWlnaHRcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKyBpIF0gPSBidWZmZXJbIGkgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50V2VpZ2h0ID0gd2VpZ2h0O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gYWNjdU4gOj0gYWNjdU4gKyBpbmNvbWluZyAqIHdlaWdodFxuXG5cdFx0XHRjdXJyZW50V2VpZ2h0ICs9IHdlaWdodDtcblx0XHRcdHZhciBtaXggPSB3ZWlnaHQgLyBjdXJyZW50V2VpZ2h0O1xuXHRcdFx0dGhpcy5fbWl4QnVmZmVyUmVnaW9uKCBidWZmZXIsIG9mZnNldCwgMCwgbWl4LCBzdHJpZGUgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IGN1cnJlbnRXZWlnaHQ7XG5cblx0fSxcblxuXHQvLyBhcHBseSB0aGUgc3RhdGUgb2YgJ2FjY3U8aT4nIHRvIHRoZSBiaW5kaW5nIHdoZW4gYWNjdXMgZGlmZmVyXG5cdGFwcGx5OiBmdW5jdGlvbiAoIGFjY3VJbmRleCApIHtcblxuXHRcdHZhciBzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblx0XHRcdGJ1ZmZlciA9IHRoaXMuYnVmZmVyLFxuXHRcdFx0b2Zmc2V0ID0gYWNjdUluZGV4ICogc3RyaWRlICsgc3RyaWRlLFxuXG5cdFx0XHR3ZWlnaHQgPSB0aGlzLmN1bXVsYXRpdmVXZWlnaHQsXG5cblx0XHRcdGJpbmRpbmcgPSB0aGlzLmJpbmRpbmc7XG5cblx0XHR0aGlzLmN1bXVsYXRpdmVXZWlnaHQgPSAwO1xuXG5cdFx0aWYgKCB3ZWlnaHQgPCAxICkge1xuXG5cdFx0XHQvLyBhY2N1TiA6PSBhY2N1TiArIG9yaWdpbmFsICogKCAxIC0gY3VtdWxhdGl2ZVdlaWdodCApXG5cblx0XHRcdHZhciBvcmlnaW5hbFZhbHVlT2Zmc2V0ID0gc3RyaWRlICogMztcblxuXHRcdFx0dGhpcy5fbWl4QnVmZmVyUmVnaW9uKFxuXHRcdFx0XHRidWZmZXIsIG9mZnNldCwgb3JpZ2luYWxWYWx1ZU9mZnNldCwgMSAtIHdlaWdodCwgc3RyaWRlICk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IHN0cmlkZSwgZSA9IHN0cmlkZSArIHN0cmlkZTsgaSAhPT0gZTsgKysgaSApIHtcblxuXHRcdFx0aWYgKCBidWZmZXJbIGkgXSAhPT0gYnVmZmVyWyBpICsgc3RyaWRlIF0gKSB7XG5cblx0XHRcdFx0Ly8gdmFsdWUgaGFzIGNoYW5nZWQgLT4gdXBkYXRlIHNjZW5lIGdyYXBoXG5cblx0XHRcdFx0YmluZGluZy5zZXRWYWx1ZSggYnVmZmVyLCBvZmZzZXQgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdC8vIHJlbWVtYmVyIHRoZSBzdGF0ZSBvZiB0aGUgYm91bmQgcHJvcGVydHkgYW5kIGNvcHkgaXQgdG8gYm90aCBhY2N1c1xuXHRzYXZlT3JpZ2luYWxTdGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGJpbmRpbmcgPSB0aGlzLmJpbmRpbmc7XG5cblx0XHR2YXIgYnVmZmVyID0gdGhpcy5idWZmZXIsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblxuXHRcdFx0b3JpZ2luYWxWYWx1ZU9mZnNldCA9IHN0cmlkZSAqIDM7XG5cblx0XHRiaW5kaW5nLmdldFZhbHVlKCBidWZmZXIsIG9yaWdpbmFsVmFsdWVPZmZzZXQgKTtcblxuXHRcdC8vIGFjY3VbMC4uMV0gOj0gb3JpZyAtLSBpbml0aWFsbHkgZGV0ZWN0IGNoYW5nZXMgYWdhaW5zdCB0aGUgb3JpZ2luYWxcblx0XHRmb3IgKCB2YXIgaSA9IHN0cmlkZSwgZSA9IG9yaWdpbmFsVmFsdWVPZmZzZXQ7IGkgIT09IGU7ICsrIGkgKSB7XG5cblx0XHRcdGJ1ZmZlclsgaSBdID0gYnVmZmVyWyBvcmlnaW5hbFZhbHVlT2Zmc2V0ICsgKCBpICUgc3RyaWRlICkgXTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IDA7XG5cblx0fSxcblxuXHQvLyBhcHBseSB0aGUgc3RhdGUgcHJldmlvdXNseSB0YWtlbiB2aWEgJ3NhdmVPcmlnaW5hbFN0YXRlJyB0byB0aGUgYmluZGluZ1xuXHRyZXN0b3JlT3JpZ2luYWxTdGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9yaWdpbmFsVmFsdWVPZmZzZXQgPSB0aGlzLnZhbHVlU2l6ZSAqIDM7XG5cdFx0dGhpcy5iaW5kaW5nLnNldFZhbHVlKCB0aGlzLmJ1ZmZlciwgb3JpZ2luYWxWYWx1ZU9mZnNldCApO1xuXG5cdH0sXG5cblxuXHQvLyBtaXggZnVuY3Rpb25zXG5cblx0X3NlbGVjdDogZnVuY3Rpb24gKCBidWZmZXIsIGRzdE9mZnNldCwgc3JjT2Zmc2V0LCB0LCBzdHJpZGUgKSB7XG5cblx0XHRpZiAoIHQgPj0gMC41ICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcblxuXHRcdFx0XHRidWZmZXJbIGRzdE9mZnNldCArIGkgXSA9IGJ1ZmZlclsgc3JjT2Zmc2V0ICsgaSBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRfc2xlcnA6IGZ1bmN0aW9uICggYnVmZmVyLCBkc3RPZmZzZXQsIHNyY09mZnNldCwgdCApIHtcblxuXHRcdFF1YXRlcm5pb24uc2xlcnBGbGF0KCBidWZmZXIsIGRzdE9mZnNldCwgYnVmZmVyLCBkc3RPZmZzZXQsIGJ1ZmZlciwgc3JjT2Zmc2V0LCB0ICk7XG5cblx0fSxcblxuXHRfbGVycDogZnVuY3Rpb24gKCBidWZmZXIsIGRzdE9mZnNldCwgc3JjT2Zmc2V0LCB0LCBzdHJpZGUgKSB7XG5cblx0XHR2YXIgcyA9IDEgLSB0O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdHZhciBqID0gZHN0T2Zmc2V0ICsgaTtcblxuXHRcdFx0YnVmZmVyWyBqIF0gPSBidWZmZXJbIGogXSAqIHMgKyBidWZmZXJbIHNyY09mZnNldCArIGkgXSAqIHQ7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgcmVmZXJlbmNlIHRvIGEgcmVhbCBwcm9wZXJ0eSBpbiB0aGUgc2NlbmUgZ3JhcGguXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG4vLyBDaGFyYWN0ZXJzIFtdLjovIGFyZSByZXNlcnZlZCBmb3IgdHJhY2sgYmluZGluZyBzeW50YXguXG52YXIgUkVTRVJWRURfQ0hBUlNfUkUgPSAnXFxcXFtcXFxcXVxcXFwuOlxcXFwvJztcblxuZnVuY3Rpb24gQ29tcG9zaXRlKCB0YXJnZXRHcm91cCwgcGF0aCwgb3B0aW9uYWxQYXJzZWRQYXRoICkge1xuXG5cdHZhciBwYXJzZWRQYXRoID0gb3B0aW9uYWxQYXJzZWRQYXRoIHx8IFByb3BlcnR5QmluZGluZy5wYXJzZVRyYWNrTmFtZSggcGF0aCApO1xuXG5cdHRoaXMuX3RhcmdldEdyb3VwID0gdGFyZ2V0R3JvdXA7XG5cdHRoaXMuX2JpbmRpbmdzID0gdGFyZ2V0R3JvdXAuc3Vic2NyaWJlXyggcGF0aCwgcGFyc2VkUGF0aCApO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIENvbXBvc2l0ZS5wcm90b3R5cGUsIHtcblxuXHRnZXRWYWx1ZTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0dGhpcy5iaW5kKCk7IC8vIGJpbmQgYWxsIGJpbmRpbmdcblxuXHRcdHZhciBmaXJzdFZhbGlkSW5kZXggPSB0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sXG5cdFx0XHRiaW5kaW5nID0gdGhpcy5fYmluZGluZ3NbIGZpcnN0VmFsaWRJbmRleCBdO1xuXG5cdFx0Ly8gYW5kIG9ubHkgY2FsbCAuZ2V0VmFsdWUgb24gdGhlIGZpcnN0XG5cdFx0aWYgKCBiaW5kaW5nICE9PSB1bmRlZmluZWQgKSBiaW5kaW5nLmdldFZhbHVlKCBhcnJheSwgb2Zmc2V0ICk7XG5cblx0fSxcblxuXHRzZXRWYWx1ZTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0dmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7XG5cblx0XHRmb3IgKCB2YXIgaSA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdFx0ICBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRiaW5kaW5nc1sgaSBdLnNldFZhbHVlKCBhcnJheSwgb2Zmc2V0ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRiaW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcblxuXHRcdGZvciAoIHZhciBpID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0XHQgIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdGJpbmRpbmdzWyBpIF0uYmluZCgpO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0dW5iaW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcblxuXHRcdGZvciAoIHZhciBpID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0XHQgIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdGJpbmRpbmdzWyBpIF0udW5iaW5kKCk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cblxuZnVuY3Rpb24gUHJvcGVydHlCaW5kaW5nKCByb290Tm9kZSwgcGF0aCwgcGFyc2VkUGF0aCApIHtcblxuXHR0aGlzLnBhdGggPSBwYXRoO1xuXHR0aGlzLnBhcnNlZFBhdGggPSBwYXJzZWRQYXRoIHx8IFByb3BlcnR5QmluZGluZy5wYXJzZVRyYWNrTmFtZSggcGF0aCApO1xuXG5cdHRoaXMubm9kZSA9IFByb3BlcnR5QmluZGluZy5maW5kTm9kZSggcm9vdE5vZGUsIHRoaXMucGFyc2VkUGF0aC5ub2RlTmFtZSApIHx8IHJvb3ROb2RlO1xuXG5cdHRoaXMucm9vdE5vZGUgPSByb290Tm9kZTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBQcm9wZXJ0eUJpbmRpbmcsIHtcblxuXHRDb21wb3NpdGU6IENvbXBvc2l0ZSxcblxuXHRjcmVhdGU6IGZ1bmN0aW9uICggcm9vdCwgcGF0aCwgcGFyc2VkUGF0aCApIHtcblxuXHRcdGlmICggISAoIHJvb3QgJiYgcm9vdC5pc0FuaW1hdGlvbk9iamVjdEdyb3VwICkgKSB7XG5cblx0XHRcdHJldHVybiBuZXcgUHJvcGVydHlCaW5kaW5nKCByb290LCBwYXRoLCBwYXJzZWRQYXRoICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZXR1cm4gbmV3IFByb3BlcnR5QmluZGluZy5Db21wb3NpdGUoIHJvb3QsIHBhdGgsIHBhcnNlZFBhdGggKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXBsYWNlcyBzcGFjZXMgd2l0aCB1bmRlcnNjb3JlcyBhbmQgcmVtb3ZlcyB1bnN1cHBvcnRlZCBjaGFyYWN0ZXJzIGZyb21cblx0ICogbm9kZSBuYW1lcywgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgd2l0aCBwYXJzZVRyYWNrTmFtZSgpLlxuXHQgKlxuXHQgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWUgTm9kZSBuYW1lIHRvIGJlIHNhbml0aXplZC5cblx0ICogQHJldHVybiB7c3RyaW5nfVxuXHQgKi9cblx0c2FuaXRpemVOb2RlTmFtZTogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcmVzZXJ2ZWRSZSA9IG5ldyBSZWdFeHAoICdbJyArIFJFU0VSVkVEX0NIQVJTX1JFICsgJ10nLCAnZycgKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzYW5pdGl6ZU5vZGVOYW1lKCBuYW1lICkge1xuXG5cdFx0XHRyZXR1cm4gbmFtZS5yZXBsYWNlKCAvXFxzL2csICdfJyApLnJlcGxhY2UoIHJlc2VydmVkUmUsICcnICk7XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdHBhcnNlVHJhY2tOYW1lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBBdHRlbXB0cyB0byBhbGxvdyBub2RlIG5hbWVzIGZyb20gYW55IGxhbmd1YWdlLiBFUzUncyBgXFx3YCByZWdleHAgbWF0Y2hlc1xuXHRcdC8vIG9ubHkgbGF0aW4gY2hhcmFjdGVycywgYW5kIHRoZSB1bmljb2RlIFxccHtMfSBpcyBub3QgeWV0IHN1cHBvcnRlZC4gU29cblx0XHQvLyBpbnN0ZWFkLCB3ZSBleGNsdWRlIHJlc2VydmVkIGNoYXJhY3RlcnMgYW5kIG1hdGNoIGV2ZXJ5dGhpbmcgZWxzZS5cblx0XHR2YXIgd29yZENoYXIgPSAnW14nICsgUkVTRVJWRURfQ0hBUlNfUkUgKyAnXSc7XG5cdFx0dmFyIHdvcmRDaGFyT3JEb3QgPSAnW14nICsgUkVTRVJWRURfQ0hBUlNfUkUucmVwbGFjZSggJ1xcXFwuJywgJycgKSArICddJztcblxuXHRcdC8vIFBhcmVudCBkaXJlY3RvcmllcywgZGVsaW1pdGVkIGJ5ICcvJyBvciAnOicuIEN1cnJlbnRseSB1bnVzZWQsIGJ1dCBtdXN0XG5cdFx0Ly8gYmUgbWF0Y2hlZCB0byBwYXJzZSB0aGUgcmVzdCBvZiB0aGUgdHJhY2sgbmFtZS5cblx0XHR2YXIgZGlyZWN0b3J5UmUgPSAvKCg/OldDK1tcXC86XSkqKS8uc291cmNlLnJlcGxhY2UoICdXQycsIHdvcmRDaGFyICk7XG5cblx0XHQvLyBUYXJnZXQgbm9kZS4gTWF5IGNvbnRhaW4gd29yZCBjaGFyYWN0ZXJzIChhLXpBLVowLTlfKSBhbmQgJy4nIG9yICctJy5cblx0XHR2YXIgbm9kZVJlID0gLyhXQ09EKyk/Ly5zb3VyY2UucmVwbGFjZSggJ1dDT0QnLCB3b3JkQ2hhck9yRG90ICk7XG5cblx0XHQvLyBPYmplY3Qgb24gdGFyZ2V0IG5vZGUsIGFuZCBhY2Nlc3Nvci4gTWF5IG5vdCBjb250YWluIHJlc2VydmVkXG5cdFx0Ly8gY2hhcmFjdGVycy4gQWNjZXNzb3IgbWF5IGNvbnRhaW4gYW55IGNoYXJhY3RlciBleGNlcHQgY2xvc2luZyBicmFja2V0LlxuXHRcdHZhciBvYmplY3RSZSA9IC8oPzpcXC4oV0MrKSg/OlxcWyguKylcXF0pPyk/Ly5zb3VyY2UucmVwbGFjZSggJ1dDJywgd29yZENoYXIgKTtcblxuXHRcdC8vIFByb3BlcnR5IGFuZCBhY2Nlc3Nvci4gTWF5IG5vdCBjb250YWluIHJlc2VydmVkIGNoYXJhY3RlcnMuIEFjY2Vzc29yIG1heVxuXHRcdC8vIGNvbnRhaW4gYW55IG5vbi1icmFja2V0IGNoYXJhY3RlcnMuXG5cdFx0dmFyIHByb3BlcnR5UmUgPSAvXFwuKFdDKykoPzpcXFsoLispXFxdKT8vLnNvdXJjZS5yZXBsYWNlKCAnV0MnLCB3b3JkQ2hhciApO1xuXG5cdFx0dmFyIHRyYWNrUmUgPSBuZXcgUmVnRXhwKCAnJ1xuXHRcdFx0KyAnXidcblx0XHRcdCsgZGlyZWN0b3J5UmVcblx0XHRcdCsgbm9kZVJlXG5cdFx0XHQrIG9iamVjdFJlXG5cdFx0XHQrIHByb3BlcnR5UmVcblx0XHRcdCsgJyQnXG5cdFx0KTtcblxuXHRcdHZhciBzdXBwb3J0ZWRPYmplY3ROYW1lcyA9IFsgJ21hdGVyaWFsJywgJ21hdGVyaWFscycsICdib25lcycgXTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBwYXJzZVRyYWNrTmFtZSggdHJhY2tOYW1lICkge1xuXG5cdFx0XHR2YXIgbWF0Y2hlcyA9IHRyYWNrUmUuZXhlYyggdHJhY2tOYW1lICk7XG5cblx0XHRcdGlmICggISBtYXRjaGVzICkge1xuXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciggJ1Byb3BlcnR5QmluZGluZzogQ2Fubm90IHBhcnNlIHRyYWNrTmFtZTogJyArIHRyYWNrTmFtZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciByZXN1bHRzID0ge1xuXHRcdFx0XHQvLyBkaXJlY3RvcnlOYW1lOiBtYXRjaGVzWyAxIF0sIC8vICh0c2NodykgY3VycmVudGx5IHVudXNlZFxuXHRcdFx0XHRub2RlTmFtZTogbWF0Y2hlc1sgMiBdLFxuXHRcdFx0XHRvYmplY3ROYW1lOiBtYXRjaGVzWyAzIF0sXG5cdFx0XHRcdG9iamVjdEluZGV4OiBtYXRjaGVzWyA0IF0sXG5cdFx0XHRcdHByb3BlcnR5TmFtZTogbWF0Y2hlc1sgNSBdLCAvLyByZXF1aXJlZFxuXHRcdFx0XHRwcm9wZXJ0eUluZGV4OiBtYXRjaGVzWyA2IF1cblx0XHRcdH07XG5cblx0XHRcdHZhciBsYXN0RG90ID0gcmVzdWx0cy5ub2RlTmFtZSAmJiByZXN1bHRzLm5vZGVOYW1lLmxhc3RJbmRleE9mKCAnLicgKTtcblxuXHRcdFx0aWYgKCBsYXN0RG90ICE9PSB1bmRlZmluZWQgJiYgbGFzdERvdCAhPT0gLSAxICkge1xuXG5cdFx0XHRcdHZhciBvYmplY3ROYW1lID0gcmVzdWx0cy5ub2RlTmFtZS5zdWJzdHJpbmcoIGxhc3REb3QgKyAxICk7XG5cblx0XHRcdFx0Ly8gT2JqZWN0IG5hbWVzIG11c3QgYmUgY2hlY2tlZCBhZ2FpbnN0IGEgd2hpdGVsaXN0LiBPdGhlcndpc2UsIHRoZXJlXG5cdFx0XHRcdC8vIGlzIG5vIHdheSB0byBwYXJzZSAnZm9vLmJhci5iYXonOiAnYmF6JyBtdXN0IGJlIGEgcHJvcGVydHksIGJ1dFxuXHRcdFx0XHQvLyAnYmFyJyBjb3VsZCBiZSB0aGUgb2JqZWN0TmFtZSwgb3IgcGFydCBvZiBhIG5vZGVOYW1lICh3aGljaCBjYW5cblx0XHRcdFx0Ly8gaW5jbHVkZSAnLicgY2hhcmFjdGVycykuXG5cdFx0XHRcdGlmICggc3VwcG9ydGVkT2JqZWN0TmFtZXMuaW5kZXhPZiggb2JqZWN0TmFtZSApICE9PSAtIDEgKSB7XG5cblx0XHRcdFx0XHRyZXN1bHRzLm5vZGVOYW1lID0gcmVzdWx0cy5ub2RlTmFtZS5zdWJzdHJpbmcoIDAsIGxhc3REb3QgKTtcblx0XHRcdFx0XHRyZXN1bHRzLm9iamVjdE5hbWUgPSBvYmplY3ROYW1lO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHJlc3VsdHMucHJvcGVydHlOYW1lID09PSBudWxsIHx8IHJlc3VsdHMucHJvcGVydHlOYW1lLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdQcm9wZXJ0eUJpbmRpbmc6IGNhbiBub3QgcGFyc2UgcHJvcGVydHlOYW1lIGZyb20gdHJhY2tOYW1lOiAnICsgdHJhY2tOYW1lICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRmaW5kTm9kZTogZnVuY3Rpb24gKCByb290LCBub2RlTmFtZSApIHtcblxuXHRcdGlmICggISBub2RlTmFtZSB8fCBub2RlTmFtZSA9PT0gXCJcIiB8fCBub2RlTmFtZSA9PT0gXCJyb290XCIgfHwgbm9kZU5hbWUgPT09IFwiLlwiIHx8IG5vZGVOYW1lID09PSAtIDEgfHwgbm9kZU5hbWUgPT09IHJvb3QubmFtZSB8fCBub2RlTmFtZSA9PT0gcm9vdC51dWlkICkge1xuXG5cdFx0XHRyZXR1cm4gcm9vdDtcblxuXHRcdH1cblxuXHRcdC8vIHNlYXJjaCBpbnRvIHNrZWxldG9uIGJvbmVzLlxuXHRcdGlmICggcm9vdC5za2VsZXRvbiApIHtcblxuXHRcdFx0dmFyIGJvbmUgPSByb290LnNrZWxldG9uLmdldEJvbmVCeU5hbWUoIG5vZGVOYW1lICk7XG5cblx0XHRcdGlmICggYm9uZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBib25lO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBzZWFyY2ggaW50byBub2RlIHN1YnRyZWUuXG5cdFx0aWYgKCByb290LmNoaWxkcmVuICkge1xuXG5cdFx0XHR2YXIgc2VhcmNoTm9kZVN1YnRyZWUgPSBmdW5jdGlvbiAoIGNoaWxkcmVuICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHZhciBjaGlsZE5vZGUgPSBjaGlsZHJlblsgaSBdO1xuXG5cdFx0XHRcdFx0aWYgKCBjaGlsZE5vZGUubmFtZSA9PT0gbm9kZU5hbWUgfHwgY2hpbGROb2RlLnV1aWQgPT09IG5vZGVOYW1lICkge1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gY2hpbGROb2RlO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dmFyIHJlc3VsdCA9IHNlYXJjaE5vZGVTdWJ0cmVlKCBjaGlsZE5vZGUuY2hpbGRyZW4gKTtcblxuXHRcdFx0XHRcdGlmICggcmVzdWx0ICkgcmV0dXJuIHJlc3VsdDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH07XG5cblx0XHRcdHZhciBzdWJUcmVlTm9kZSA9IHNlYXJjaE5vZGVTdWJ0cmVlKCByb290LmNoaWxkcmVuICk7XG5cblx0XHRcdGlmICggc3ViVHJlZU5vZGUgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHN1YlRyZWVOb2RlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZSwgeyAvLyBwcm90b3R5cGUsIGNvbnRpbnVlZFxuXG5cdC8vIHRoZXNlIGFyZSB1c2VkIHRvIFwiYmluZFwiIGEgbm9uZXhpc3RlbnQgcHJvcGVydHlcblx0X2dldFZhbHVlX3VuYXZhaWxhYmxlOiBmdW5jdGlvbiAoKSB7fSxcblx0X3NldFZhbHVlX3VuYXZhaWxhYmxlOiBmdW5jdGlvbiAoKSB7fSxcblxuXHRCaW5kaW5nVHlwZToge1xuXHRcdERpcmVjdDogMCxcblx0XHRFbnRpcmVBcnJheTogMSxcblx0XHRBcnJheUVsZW1lbnQ6IDIsXG5cdFx0SGFzRnJvbVRvQXJyYXk6IDNcblx0fSxcblxuXHRWZXJzaW9uaW5nOiB7XG5cdFx0Tm9uZTogMCxcblx0XHROZWVkc1VwZGF0ZTogMSxcblx0XHRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlOiAyXG5cdH0sXG5cblx0R2V0dGVyQnlCaW5kaW5nVHlwZTogW1xuXG5cdFx0ZnVuY3Rpb24gZ2V0VmFsdWVfZGlyZWN0KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0YnVmZmVyWyBvZmZzZXQgXSA9IHRoaXMubm9kZVsgdGhpcy5wcm9wZXJ0eU5hbWUgXTtcblxuXHRcdH0sXG5cblx0XHRmdW5jdGlvbiBnZXRWYWx1ZV9hcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdHZhciBzb3VyY2UgPSB0aGlzLnJlc29sdmVkUHJvcGVydHk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IHNvdXJjZS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKysgXSA9IHNvdXJjZVsgaSBdO1xuXG5cdFx0XHR9XG5cblx0XHR9LFxuXG5cdFx0ZnVuY3Rpb24gZ2V0VmFsdWVfYXJyYXlFbGVtZW50KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0YnVmZmVyWyBvZmZzZXQgXSA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eVsgdGhpcy5wcm9wZXJ0eUluZGV4IF07XG5cblx0XHR9LFxuXG5cdFx0ZnVuY3Rpb24gZ2V0VmFsdWVfdG9BcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eS50b0FycmF5KCBidWZmZXIsIG9mZnNldCApO1xuXG5cdFx0fVxuXG5cdF0sXG5cblx0U2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmc6IFtcblxuXHRcdFtcblx0XHRcdC8vIERpcmVjdFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9kaXJlY3QoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0WyB0aGlzLnByb3BlcnR5TmFtZSBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZGlyZWN0X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdFsgdGhpcy5wcm9wZXJ0eU5hbWUgXSA9IGJ1ZmZlclsgb2Zmc2V0IF07XG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZGlyZWN0X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0WyB0aGlzLnByb3BlcnR5TmFtZSBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdF0sIFtcblxuXHRcdFx0Ly8gRW50aXJlQXJyYXlcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHZhciBkZXN0ID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5O1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGRlc3QubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdFx0ZGVzdFsgaSBdID0gYnVmZmVyWyBvZmZzZXQgKysgXTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2FycmF5X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR2YXIgZGVzdCA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBkZXN0Lmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRcdGRlc3RbIGkgXSA9IGJ1ZmZlclsgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dmFyIGRlc3QgPSB0aGlzLnJlc29sdmVkUHJvcGVydHk7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gZGVzdC5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0XHRkZXN0WyBpIF0gPSBidWZmZXJbIG9mZnNldCArKyBdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XSwgW1xuXG5cdFx0XHQvLyBBcnJheUVsZW1lbnRcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlFbGVtZW50KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHlbIHRoaXMucHJvcGVydHlJbmRleCBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHlbIHRoaXMucHJvcGVydHlJbmRleCBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5WyB0aGlzLnByb3BlcnR5SW5kZXggXSA9IGJ1ZmZlclsgb2Zmc2V0IF07XG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRdLCBbXG5cblx0XHRcdC8vIEhhc1RvRnJvbUFycmF5XG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2Zyb21BcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheSggYnVmZmVyLCBvZmZzZXQgKTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZnJvbUFycmF5X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApO1xuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH0sXG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2Zyb21BcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApO1xuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XVxuXG5cdF0sXG5cblx0Z2V0VmFsdWU6IGZ1bmN0aW9uIGdldFZhbHVlX3VuYm91bmQoIHRhcmdldEFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmJpbmQoKTtcblx0XHR0aGlzLmdldFZhbHVlKCB0YXJnZXRBcnJheSwgb2Zmc2V0ICk7XG5cblx0XHQvLyBOb3RlOiBUaGlzIGNsYXNzIHVzZXMgYSBTdGF0ZSBwYXR0ZXJuIG9uIGEgcGVyLW1ldGhvZCBiYXNpczpcblx0XHQvLyAnYmluZCcgc2V0cyAndGhpcy5nZXRWYWx1ZScgLyAnc2V0VmFsdWUnIGFuZCBzaGFkb3dzIHRoZVxuXHRcdC8vIHByb3RvdHlwZSB2ZXJzaW9uIG9mIHRoZXNlIG1ldGhvZHMgd2l0aCBvbmUgdGhhdCByZXByZXNlbnRzXG5cdFx0Ly8gdGhlIGJvdW5kIHN0YXRlLiBXaGVuIHRoZSBwcm9wZXJ0eSBpcyBub3QgZm91bmQsIHRoZSBtZXRob2RzXG5cdFx0Ly8gYmVjb21lIG5vLW9wcy5cblxuXHR9LFxuXG5cdHNldFZhbHVlOiBmdW5jdGlvbiBnZXRWYWx1ZV91bmJvdW5kKCBzb3VyY2VBcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0dGhpcy5iaW5kKCk7XG5cdFx0dGhpcy5zZXRWYWx1ZSggc291cmNlQXJyYXksIG9mZnNldCApO1xuXG5cdH0sXG5cblx0Ly8gY3JlYXRlIGdldHRlciAvIHNldHRlciBwYWlyIGZvciBhIHByb3BlcnR5IGluIHRoZSBzY2VuZSBncmFwaFxuXHRiaW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdGFyZ2V0T2JqZWN0ID0gdGhpcy5ub2RlLFxuXHRcdFx0cGFyc2VkUGF0aCA9IHRoaXMucGFyc2VkUGF0aCxcblxuXHRcdFx0b2JqZWN0TmFtZSA9IHBhcnNlZFBhdGgub2JqZWN0TmFtZSxcblx0XHRcdHByb3BlcnR5TmFtZSA9IHBhcnNlZFBhdGgucHJvcGVydHlOYW1lLFxuXHRcdFx0cHJvcGVydHlJbmRleCA9IHBhcnNlZFBhdGgucHJvcGVydHlJbmRleDtcblxuXHRcdGlmICggISB0YXJnZXRPYmplY3QgKSB7XG5cblx0XHRcdHRhcmdldE9iamVjdCA9IFByb3BlcnR5QmluZGluZy5maW5kTm9kZSggdGhpcy5yb290Tm9kZSwgcGFyc2VkUGF0aC5ub2RlTmFtZSApIHx8IHRoaXMucm9vdE5vZGU7XG5cblx0XHRcdHRoaXMubm9kZSA9IHRhcmdldE9iamVjdDtcblxuXHRcdH1cblxuXHRcdC8vIHNldCBmYWlsIHN0YXRlIHNvIHdlIGNhbiBqdXN0ICdyZXR1cm4nIG9uIGVycm9yXG5cdFx0dGhpcy5nZXRWYWx1ZSA9IHRoaXMuX2dldFZhbHVlX3VuYXZhaWxhYmxlO1xuXHRcdHRoaXMuc2V0VmFsdWUgPSB0aGlzLl9zZXRWYWx1ZV91bmF2YWlsYWJsZTtcblxuXHRcdC8vIGVuc3VyZSB0aGVyZSBpcyBhIHZhbHVlIG5vZGVcblx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0ICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gdXBkYXRlIG5vZGUgZm9yIHRyYWNrOiAnICsgdGhpcy5wYXRoICsgJyBidXQgaXQgd2FzblxcJ3QgZm91bmQuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3ROYW1lICkge1xuXG5cdFx0XHR2YXIgb2JqZWN0SW5kZXggPSBwYXJzZWRQYXRoLm9iamVjdEluZGV4O1xuXG5cdFx0XHQvLyBzcGVjaWFsIGNhc2VzIHdlcmUgd2UgbmVlZCB0byByZWFjaCBkZWVwZXIgaW50byB0aGUgaGllcmFyY2h5IHRvIGdldCB0aGUgZmFjZSBtYXRlcmlhbHMuLi4uXG5cdFx0XHRzd2l0Y2ggKCBvYmplY3ROYW1lICkge1xuXG5cdFx0XHRcdGNhc2UgJ21hdGVyaWFscyc6XG5cblx0XHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0Lm1hdGVyaWFsICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWwuJywgdGhpcyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5tYXRlcmlhbC5tYXRlcmlhbHMgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbC5tYXRlcmlhbHMgYXMgbm9kZS5tYXRlcmlhbCBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWxzIGFycmF5LicsIHRoaXMgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdC5tYXRlcmlhbC5tYXRlcmlhbHM7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdib25lcyc6XG5cblx0XHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0LnNrZWxldG9uICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gYm9uZXMgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgc2tlbGV0b24uJywgdGhpcyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gcG90ZW50aWFsIGZ1dHVyZSBvcHRpbWl6YXRpb246IHNraXAgdGhpcyBpZiBwcm9wZXJ0eUluZGV4IGlzIGFscmVhZHkgYW4gaW50ZWdlclxuXHRcdFx0XHRcdC8vIGFuZCBjb252ZXJ0IHRoZSBpbnRlZ2VyIHN0cmluZyB0byBhIHRydWUgaW50ZWdlci5cblxuXHRcdFx0XHRcdHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdC5za2VsZXRvbi5ib25lcztcblxuXHRcdFx0XHRcdC8vIHN1cHBvcnQgcmVzb2x2aW5nIG1vcnBoVGFyZ2V0IG5hbWVzIGludG8gaW5kaWNlcy5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0YXJnZXRPYmplY3QubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIHRhcmdldE9iamVjdFsgaSBdLm5hbWUgPT09IG9iamVjdEluZGV4ICkge1xuXG5cdFx0XHRcdFx0XHRcdG9iamVjdEluZGV4ID0gaTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6XG5cblx0XHRcdFx0XHRpZiAoIHRhcmdldE9iamVjdFsgb2JqZWN0TmFtZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBvYmplY3ROYW1lIG9mIG5vZGUgdW5kZWZpbmVkLicsIHRoaXMgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdFsgb2JqZWN0TmFtZSBdO1xuXG5cdFx0XHR9XG5cblxuXHRcdFx0aWYgKCBvYmplY3RJbmRleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGlmICggdGFyZ2V0T2JqZWN0WyBvYmplY3RJbmRleCBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gYmluZCB0byBvYmplY3RJbmRleCBvZiBvYmplY3ROYW1lLCBidXQgaXMgdW5kZWZpbmVkLicsIHRoaXMsIHRhcmdldE9iamVjdCApO1xuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0WyBvYmplY3RJbmRleCBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyByZXNvbHZlIHByb3BlcnR5XG5cdFx0dmFyIG5vZGVQcm9wZXJ0eSA9IHRhcmdldE9iamVjdFsgcHJvcGVydHlOYW1lIF07XG5cblx0XHRpZiAoIG5vZGVQcm9wZXJ0eSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgbm9kZU5hbWUgPSBwYXJzZWRQYXRoLm5vZGVOYW1lO1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gdXBkYXRlIHByb3BlcnR5IGZvciB0cmFjazogJyArIG5vZGVOYW1lICtcblx0XHRcdFx0Jy4nICsgcHJvcGVydHlOYW1lICsgJyBidXQgaXQgd2FzblxcJ3QgZm91bmQuJywgdGFyZ2V0T2JqZWN0ICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHQvLyBkZXRlcm1pbmUgdmVyc2lvbmluZyBzY2hlbWVcblx0XHR2YXIgdmVyc2lvbmluZyA9IHRoaXMuVmVyc2lvbmluZy5Ob25lO1xuXG5cdFx0aWYgKCB0YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgIT09IHVuZGVmaW5lZCApIHsgLy8gbWF0ZXJpYWxcblxuXHRcdFx0dmVyc2lvbmluZyA9IHRoaXMuVmVyc2lvbmluZy5OZWVkc1VwZGF0ZTtcblx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0O1xuXG5cdFx0fSBlbHNlIGlmICggdGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgIT09IHVuZGVmaW5lZCApIHsgLy8gbm9kZSB0cmFuc2Zvcm1cblxuXHRcdFx0dmVyc2lvbmluZyA9IHRoaXMuVmVyc2lvbmluZy5NYXRyaXhXb3JsZE5lZWRzVXBkYXRlO1xuXHRcdFx0dGhpcy50YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3Q7XG5cblx0XHR9XG5cblx0XHQvLyBkZXRlcm1pbmUgaG93IHRoZSBwcm9wZXJ0eSBnZXRzIGJvdW5kXG5cdFx0dmFyIGJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5EaXJlY3Q7XG5cblx0XHRpZiAoIHByb3BlcnR5SW5kZXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gYWNjZXNzIGEgc3ViIGVsZW1lbnQgb2YgdGhlIHByb3BlcnR5IGFycmF5IChvbmx5IHByaW1pdGl2ZXMgYXJlIHN1cHBvcnRlZCByaWdodCBub3cpXG5cblx0XHRcdGlmICggcHJvcGVydHlOYW1lID09PSBcIm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1wiICkge1xuXG5cdFx0XHRcdC8vIHBvdGVudGlhbCBvcHRpbWl6YXRpb24sIHNraXAgdGhpcyBpZiBwcm9wZXJ0eUluZGV4IGlzIGFscmVhZHkgYW4gaW50ZWdlciwgYW5kIGNvbnZlcnQgdGhlIGludGVnZXIgc3RyaW5nIHRvIGEgdHJ1ZSBpbnRlZ2VyLlxuXG5cdFx0XHRcdC8vIHN1cHBvcnQgcmVzb2x2aW5nIG1vcnBoVGFyZ2V0IG5hbWVzIGludG8gaW5kaWNlcy5cblx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5nZW9tZXRyeSApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS4nLCB0aGlzICk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHRhcmdldE9iamVjdC5nZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuJywgdGhpcyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy5ub2RlLmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbi5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggdGFyZ2V0T2JqZWN0Lmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvblsgaSBdLm5hbWUgPT09IHByb3BlcnR5SW5kZXggKSB7XG5cblx0XHRcdFx0XHRcdFx0cHJvcGVydHlJbmRleCA9IGk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5nZW9tZXRyeS5tb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS5tb3JwaFRhcmdldHMuJywgdGhpcyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy5ub2RlLmdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggdGFyZ2V0T2JqZWN0Lmdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1sgaSBdLm5hbWUgPT09IHByb3BlcnR5SW5kZXggKSB7XG5cblx0XHRcdFx0XHRcdFx0cHJvcGVydHlJbmRleCA9IGk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5BcnJheUVsZW1lbnQ7XG5cblx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eSA9IG5vZGVQcm9wZXJ0eTtcblx0XHRcdHRoaXMucHJvcGVydHlJbmRleCA9IHByb3BlcnR5SW5kZXg7XG5cblx0XHR9IGVsc2UgaWYgKCBub2RlUHJvcGVydHkuZnJvbUFycmF5ICE9PSB1bmRlZmluZWQgJiYgbm9kZVByb3BlcnR5LnRvQXJyYXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gbXVzdCB1c2UgY29weSBmb3IgT2JqZWN0M0QuRXVsZXIvUXVhdGVybmlvblxuXG5cdFx0XHRiaW5kaW5nVHlwZSA9IHRoaXMuQmluZGluZ1R5cGUuSGFzRnJvbVRvQXJyYXk7XG5cblx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eSA9IG5vZGVQcm9wZXJ0eTtcblxuXHRcdH0gZWxzZSBpZiAoIEFycmF5LmlzQXJyYXkoIG5vZGVQcm9wZXJ0eSApICkge1xuXG5cdFx0XHRiaW5kaW5nVHlwZSA9IHRoaXMuQmluZGluZ1R5cGUuRW50aXJlQXJyYXk7XG5cblx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eSA9IG5vZGVQcm9wZXJ0eTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lO1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2VsZWN0IGdldHRlciAvIHNldHRlclxuXHRcdHRoaXMuZ2V0VmFsdWUgPSB0aGlzLkdldHRlckJ5QmluZGluZ1R5cGVbIGJpbmRpbmdUeXBlIF07XG5cdFx0dGhpcy5zZXRWYWx1ZSA9IHRoaXMuU2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmdbIGJpbmRpbmdUeXBlIF1bIHZlcnNpb25pbmcgXTtcblxuXHR9LFxuXG5cdHVuYmluZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5ub2RlID0gbnVsbDtcblxuXHRcdC8vIGJhY2sgdG8gdGhlIHByb3RvdHlwZSB2ZXJzaW9uIG9mIGdldFZhbHVlIC8gc2V0VmFsdWVcblx0XHQvLyBub3RlOiBhdm9pZGluZyB0byBtdXRhdGUgdGhlIHNoYXBlIG9mICd0aGlzJyB2aWEgJ2RlbGV0ZSdcblx0XHR0aGlzLmdldFZhbHVlID0gdGhpcy5fZ2V0VmFsdWVfdW5ib3VuZDtcblx0XHR0aGlzLnNldFZhbHVlID0gdGhpcy5fc2V0VmFsdWVfdW5ib3VuZDtcblxuXHR9XG5cbn0gKTtcblxuLy8hXFwgREVDTEFSRSBBTElBUyBBRlRFUiBhc3NpZ24gcHJvdG90eXBlICFcbk9iamVjdC5hc3NpZ24oIFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUsIHtcblxuXHQvLyBpbml0aWFsIHN0YXRlIG9mIHRoZXNlIG1ldGhvZHMgdGhhdCBjYWxscyAnYmluZCdcblx0X2dldFZhbHVlX3VuYm91bmQ6IFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuZ2V0VmFsdWUsXG5cdF9zZXRWYWx1ZV91bmJvdW5kOiBQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLnNldFZhbHVlLFxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgZ3JvdXAgb2Ygb2JqZWN0cyB0aGF0IHJlY2VpdmVzIGEgc2hhcmVkIGFuaW1hdGlvbiBzdGF0ZS5cbiAqXG4gKiBVc2FnZTpcbiAqXG4gKiBcdC1cdEFkZCBvYmplY3RzIHlvdSB3b3VsZCBvdGhlcndpc2UgcGFzcyBhcyAncm9vdCcgdG8gdGhlXG4gKiBcdFx0Y29uc3RydWN0b3Igb3IgdGhlIC5jbGlwQWN0aW9uIG1ldGhvZCBvZiBBbmltYXRpb25NaXhlci5cbiAqXG4gKiBcdC1cdEluc3RlYWQgcGFzcyB0aGlzIG9iamVjdCBhcyAncm9vdCcuXG4gKlxuICogXHQtXHRZb3UgY2FuIGFsc28gYWRkIGFuZCByZW1vdmUgb2JqZWN0cyBsYXRlciB3aGVuIHRoZSBtaXhlclxuICogXHRcdGlzIHJ1bm5pbmcuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgXHRPYmplY3RzIG9mIHRoaXMgY2xhc3MgYXBwZWFyIGFzIG9uZSBvYmplY3QgdG8gdGhlIG1peGVyLFxuICogIFx0c28gY2FjaGUgY29udHJvbCBvZiB0aGUgaW5kaXZpZHVhbCBvYmplY3RzIG11c3QgYmUgZG9uZVxuICogIFx0b24gdGhlIGdyb3VwLlxuICpcbiAqIExpbWl0YXRpb246XG4gKlxuICogXHQtIFx0VGhlIGFuaW1hdGVkIHByb3BlcnRpZXMgbXVzdCBiZSBjb21wYXRpYmxlIGFtb25nIHRoZVxuICogXHRcdGFsbCBvYmplY3RzIGluIHRoZSBncm91cC5cbiAqXG4gKiAgLVx0QSBzaW5nbGUgcHJvcGVydHkgY2FuIGVpdGhlciBiZSBjb250cm9sbGVkIHRocm91Z2ggYVxuICogIFx0dGFyZ2V0IGdyb3VwIG9yIGRpcmVjdGx5LCBidXQgbm90IGJvdGguXG4gKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIEFuaW1hdGlvbk9iamVjdEdyb3VwKCkge1xuXG5cdHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdC8vIGNhY2hlZCBvYmplY3RzIGZvbGxvd2VkIGJ5IHRoZSBhY3RpdmUgb25lc1xuXHR0aGlzLl9vYmplY3RzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFyZ3VtZW50cyApO1xuXG5cdHRoaXMubkNhY2hlZE9iamVjdHNfID0gMDtcdFx0XHQvLyB0aHJlc2hvbGRcblx0Ly8gbm90ZTogcmVhZCBieSBQcm9wZXJ0eUJpbmRpbmcuQ29tcG9zaXRlXG5cblx0dmFyIGluZGljZXMgPSB7fTtcblx0dGhpcy5faW5kaWNlc0J5VVVJRCA9IGluZGljZXM7XHRcdC8vIGZvciBib29ra2VlcGluZ1xuXG5cdGZvciAoIHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRpbmRpY2VzWyBhcmd1bWVudHNbIGkgXS51dWlkIF0gPSBpO1xuXG5cdH1cblxuXHR0aGlzLl9wYXRocyA9IFtdO1x0XHRcdFx0XHQvLyBpbnNpZGU6IHN0cmluZ1xuXHR0aGlzLl9wYXJzZWRQYXRocyA9IFtdO1x0XHRcdFx0Ly8gaW5zaWRlOiB7IHdlIGRvbid0IGNhcmUsIGhlcmUgfVxuXHR0aGlzLl9iaW5kaW5ncyA9IFtdOyBcdFx0XHRcdC8vIGluc2lkZTogQXJyYXk8IFByb3BlcnR5QmluZGluZyA+XG5cdHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCA9IHt9OyBcdC8vIGluc2lkZTogaW5kaWNlcyBpbiB0aGVzZSBhcnJheXNcblxuXHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdHRoaXMuc3RhdHMgPSB7XG5cblx0XHRvYmplY3RzOiB7XG5cdFx0XHRnZXQgdG90YWwoKSB7XG5cblx0XHRcdFx0cmV0dXJuIHNjb3BlLl9vYmplY3RzLmxlbmd0aDtcblxuXHRcdFx0fSxcblx0XHRcdGdldCBpblVzZSgpIHtcblxuXHRcdFx0XHRyZXR1cm4gdGhpcy50b3RhbCAtIHNjb3BlLm5DYWNoZWRPYmplY3RzXztcblxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Z2V0IGJpbmRpbmdzUGVyT2JqZWN0KCkge1xuXG5cdFx0XHRyZXR1cm4gc2NvcGUuX2JpbmRpbmdzLmxlbmd0aDtcblxuXHRcdH1cblxuXHR9O1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEFuaW1hdGlvbk9iamVjdEdyb3VwLnByb3RvdHlwZSwge1xuXG5cdGlzQW5pbWF0aW9uT2JqZWN0R3JvdXA6IHRydWUsXG5cblx0YWRkOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgb2JqZWN0cyA9IHRoaXMuX29iamVjdHMsXG5cdFx0XHRuT2JqZWN0cyA9IG9iamVjdHMubGVuZ3RoLFxuXHRcdFx0bkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdGluZGljZXNCeVVVSUQgPSB0aGlzLl9pbmRpY2VzQnlVVUlELFxuXHRcdFx0cGF0aHMgPSB0aGlzLl9wYXRocyxcblx0XHRcdHBhcnNlZFBhdGhzID0gdGhpcy5fcGFyc2VkUGF0aHMsXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0bkJpbmRpbmdzID0gYmluZGluZ3MubGVuZ3RoLFxuXHRcdFx0a25vd25PYmplY3QgPSB1bmRlZmluZWQ7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR2YXIgb2JqZWN0ID0gYXJndW1lbnRzWyBpIF0sXG5cdFx0XHRcdHV1aWQgPSBvYmplY3QudXVpZCxcblx0XHRcdFx0aW5kZXggPSBpbmRpY2VzQnlVVUlEWyB1dWlkIF07XG5cblx0XHRcdGlmICggaW5kZXggPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHQvLyB1bmtub3duIG9iamVjdCAtPiBhZGQgaXQgdG8gdGhlIEFDVElWRSByZWdpb25cblxuXHRcdFx0XHRpbmRleCA9IG5PYmplY3RzICsrO1xuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyB1dWlkIF0gPSBpbmRleDtcblx0XHRcdFx0b2JqZWN0cy5wdXNoKCBvYmplY3QgKTtcblxuXHRcdFx0XHQvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzXG5cblx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBtOyArKyBqICkge1xuXG5cdFx0XHRcdFx0YmluZGluZ3NbIGogXS5wdXNoKCBuZXcgUHJvcGVydHlCaW5kaW5nKCBvYmplY3QsIHBhdGhzWyBqIF0sIHBhcnNlZFBhdGhzWyBqIF0gKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggaW5kZXggPCBuQ2FjaGVkT2JqZWN0cyApIHtcblxuXHRcdFx0XHRrbm93bk9iamVjdCA9IG9iamVjdHNbIGluZGV4IF07XG5cblx0XHRcdFx0Ly8gbW92ZSBleGlzdGluZyBvYmplY3QgdG8gdGhlIEFDVElWRSByZWdpb25cblxuXHRcdFx0XHR2YXIgZmlyc3RBY3RpdmVJbmRleCA9IC0tIG5DYWNoZWRPYmplY3RzLFxuXHRcdFx0XHRcdGxhc3RDYWNoZWRPYmplY3QgPSBvYmplY3RzWyBmaXJzdEFjdGl2ZUluZGV4IF07XG5cblx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgbGFzdENhY2hlZE9iamVjdC51dWlkIF0gPSBpbmRleDtcblx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGxhc3RDYWNoZWRPYmplY3Q7XG5cblx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgdXVpZCBdID0gZmlyc3RBY3RpdmVJbmRleDtcblx0XHRcdFx0b2JqZWN0c1sgZmlyc3RBY3RpdmVJbmRleCBdID0gb2JqZWN0O1xuXG5cdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7XG5cblx0XHRcdFx0XHR2YXIgYmluZGluZ3NGb3JQYXRoID0gYmluZGluZ3NbIGogXSxcblx0XHRcdFx0XHRcdGxhc3RDYWNoZWQgPSBiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSxcblx0XHRcdFx0XHRcdGJpbmRpbmcgPSBiaW5kaW5nc0ZvclBhdGhbIGluZGV4IF07XG5cblx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGluZGV4IF0gPSBsYXN0Q2FjaGVkO1xuXG5cdFx0XHRcdFx0aWYgKCBiaW5kaW5nID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdC8vIHNpbmNlIHdlIGRvIG5vdCBib3RoZXIgdG8gY3JlYXRlIG5ldyBiaW5kaW5nc1xuXHRcdFx0XHRcdFx0Ly8gZm9yIG9iamVjdHMgdGhhdCBhcmUgY2FjaGVkLCB0aGUgYmluZGluZyBtYXlcblx0XHRcdFx0XHRcdC8vIG9yIG1heSBub3QgZXhpc3RcblxuXHRcdFx0XHRcdFx0YmluZGluZyA9IG5ldyBQcm9wZXJ0eUJpbmRpbmcoIG9iamVjdCwgcGF0aHNbIGogXSwgcGFyc2VkUGF0aHNbIGogXSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBiaW5kaW5nO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0c1sgaW5kZXggXSAhPT0ga25vd25PYmplY3QgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkFuaW1hdGlvbk9iamVjdEdyb3VwOiBEaWZmZXJlbnQgb2JqZWN0cyB3aXRoIHRoZSBzYW1lIFVVSUQgJyArXG5cdFx0XHRcdFx0XHQnZGV0ZWN0ZWQuIENsZWFuIHRoZSBjYWNoZXMgb3IgcmVjcmVhdGUgeW91ciBpbmZyYXN0cnVjdHVyZSB3aGVuIHJlbG9hZGluZyBzY2VuZXMuJyApO1xuXG5cdFx0XHR9IC8vIGVsc2UgdGhlIG9iamVjdCBpcyBhbHJlYWR5IHdoZXJlIHdlIHdhbnQgaXQgdG8gYmVcblxuXHRcdH0gLy8gZm9yIGFyZ3VtZW50c1xuXG5cdFx0dGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2FjaGVkT2JqZWN0cztcblxuXHR9LFxuXG5cdHJlbW92ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9iamVjdHMgPSB0aGlzLl9vYmplY3RzLFxuXHRcdFx0bkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdGluZGljZXNCeVVVSUQgPSB0aGlzLl9pbmRpY2VzQnlVVUlELFxuXHRcdFx0YmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdG5CaW5kaW5ncyA9IGJpbmRpbmdzLmxlbmd0aDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdHZhciBvYmplY3QgPSBhcmd1bWVudHNbIGkgXSxcblx0XHRcdFx0dXVpZCA9IG9iamVjdC51dWlkLFxuXHRcdFx0XHRpbmRleCA9IGluZGljZXNCeVVVSURbIHV1aWQgXTtcblxuXHRcdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICYmIGluZGV4ID49IG5DYWNoZWRPYmplY3RzICkge1xuXG5cdFx0XHRcdC8vIG1vdmUgZXhpc3Rpbmcgb2JqZWN0IGludG8gdGhlIENBQ0hFRCByZWdpb25cblxuXHRcdFx0XHR2YXIgbGFzdENhY2hlZEluZGV4ID0gbkNhY2hlZE9iamVjdHMgKyssXG5cdFx0XHRcdFx0Zmlyc3RBY3RpdmVPYmplY3QgPSBvYmplY3RzWyBsYXN0Q2FjaGVkSW5kZXggXTtcblxuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyBmaXJzdEFjdGl2ZU9iamVjdC51dWlkIF0gPSBpbmRleDtcblx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGZpcnN0QWN0aXZlT2JqZWN0O1xuXG5cdFx0XHRcdGluZGljZXNCeVVVSURbIHV1aWQgXSA9IGxhc3RDYWNoZWRJbmRleDtcblx0XHRcdFx0b2JqZWN0c1sgbGFzdENhY2hlZEluZGV4IF0gPSBvYmplY3Q7XG5cblx0XHRcdFx0Ly8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5nc1xuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRcdHZhciBiaW5kaW5nc0ZvclBhdGggPSBiaW5kaW5nc1sgaiBdLFxuXHRcdFx0XHRcdFx0Zmlyc3RBY3RpdmUgPSBiaW5kaW5nc0ZvclBhdGhbIGxhc3RDYWNoZWRJbmRleCBdLFxuXHRcdFx0XHRcdFx0YmluZGluZyA9IGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXTtcblxuXHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGZpcnN0QWN0aXZlO1xuXHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgbGFzdENhY2hlZEluZGV4IF0gPSBiaW5kaW5nO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSAvLyBmb3IgYXJndW1lbnRzXG5cblx0XHR0aGlzLm5DYWNoZWRPYmplY3RzXyA9IG5DYWNoZWRPYmplY3RzO1xuXG5cdH0sXG5cblx0Ly8gcmVtb3ZlICYgZm9yZ2V0XG5cdHVuY2FjaGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBvYmplY3RzID0gdGhpcy5fb2JqZWN0cyxcblx0XHRcdG5PYmplY3RzID0gb2JqZWN0cy5sZW5ndGgsXG5cdFx0XHRuQ2FjaGVkT2JqZWN0cyA9IHRoaXMubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0aW5kaWNlc0J5VVVJRCA9IHRoaXMuX2luZGljZXNCeVVVSUQsXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0bkJpbmRpbmdzID0gYmluZGluZ3MubGVuZ3RoO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0dmFyIG9iamVjdCA9IGFyZ3VtZW50c1sgaSBdLFxuXHRcdFx0XHR1dWlkID0gb2JqZWN0LnV1aWQsXG5cdFx0XHRcdGluZGV4ID0gaW5kaWNlc0J5VVVJRFsgdXVpZCBdO1xuXG5cdFx0XHRpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0ZGVsZXRlIGluZGljZXNCeVVVSURbIHV1aWQgXTtcblxuXHRcdFx0XHRpZiAoIGluZGV4IDwgbkNhY2hlZE9iamVjdHMgKSB7XG5cblx0XHRcdFx0XHQvLyBvYmplY3QgaXMgY2FjaGVkLCBzaHJpbmsgdGhlIENBQ0hFRCByZWdpb25cblxuXHRcdFx0XHRcdHZhciBmaXJzdEFjdGl2ZUluZGV4ID0gLS0gbkNhY2hlZE9iamVjdHMsXG5cdFx0XHRcdFx0XHRsYXN0Q2FjaGVkT2JqZWN0ID0gb2JqZWN0c1sgZmlyc3RBY3RpdmVJbmRleCBdLFxuXHRcdFx0XHRcdFx0bGFzdEluZGV4ID0gLS0gbk9iamVjdHMsXG5cdFx0XHRcdFx0XHRsYXN0T2JqZWN0ID0gb2JqZWN0c1sgbGFzdEluZGV4IF07XG5cblx0XHRcdFx0XHQvLyBsYXN0IGNhY2hlZCBvYmplY3QgdGFrZXMgdGhpcyBvYmplY3QncyBwbGFjZVxuXHRcdFx0XHRcdGluZGljZXNCeVVVSURbIGxhc3RDYWNoZWRPYmplY3QudXVpZCBdID0gaW5kZXg7XG5cdFx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGxhc3RDYWNoZWRPYmplY3Q7XG5cblx0XHRcdFx0XHQvLyBsYXN0IG9iamVjdCBnb2VzIHRvIHRoZSBhY3RpdmF0ZWQgc2xvdCBhbmQgcG9wXG5cdFx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgbGFzdE9iamVjdC51dWlkIF0gPSBmaXJzdEFjdGl2ZUluZGV4O1xuXHRcdFx0XHRcdG9iamVjdHNbIGZpcnN0QWN0aXZlSW5kZXggXSA9IGxhc3RPYmplY3Q7XG5cdFx0XHRcdFx0b2JqZWN0cy5wb3AoKTtcblxuXHRcdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcblxuXHRcdFx0XHRcdGZvciAoIHZhciBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF0sXG5cdFx0XHRcdFx0XHRcdGxhc3RDYWNoZWQgPSBiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSxcblx0XHRcdFx0XHRcdFx0bGFzdCA9IGJpbmRpbmdzRm9yUGF0aFsgbGFzdEluZGV4IF07XG5cblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGxhc3RDYWNoZWQ7XG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSA9IGxhc3Q7XG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGgucG9wKCk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIG9iamVjdCBpcyBhY3RpdmUsIGp1c3Qgc3dhcCB3aXRoIHRoZSBsYXN0IGFuZCBwb3BcblxuXHRcdFx0XHRcdHZhciBsYXN0SW5kZXggPSAtLSBuT2JqZWN0cyxcblx0XHRcdFx0XHRcdGxhc3RPYmplY3QgPSBvYmplY3RzWyBsYXN0SW5kZXggXTtcblxuXHRcdFx0XHRcdGluZGljZXNCeVVVSURbIGxhc3RPYmplY3QudXVpZCBdID0gaW5kZXg7XG5cdFx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGxhc3RPYmplY3Q7XG5cdFx0XHRcdFx0b2JqZWN0cy5wb3AoKTtcblxuXHRcdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcblxuXHRcdFx0XHRcdGZvciAoIHZhciBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF07XG5cblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGJpbmRpbmdzRm9yUGF0aFsgbGFzdEluZGV4IF07XG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGgucG9wKCk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSAvLyBjYWNoZWQgb3IgYWN0aXZlXG5cblx0XHRcdH0gLy8gaWYgb2JqZWN0IGlzIGtub3duXG5cblx0XHR9IC8vIGZvciBhcmd1bWVudHNcblxuXHRcdHRoaXMubkNhY2hlZE9iamVjdHNfID0gbkNhY2hlZE9iamVjdHM7XG5cblx0fSxcblxuXHQvLyBJbnRlcm5hbCBpbnRlcmZhY2UgdXNlZCBieSBiZWZyaWVuZGVkIFByb3BlcnR5QmluZGluZy5Db21wb3NpdGU6XG5cblx0c3Vic2NyaWJlXzogZnVuY3Rpb24gKCBwYXRoLCBwYXJzZWRQYXRoICkge1xuXG5cdFx0Ly8gcmV0dXJucyBhbiBhcnJheSBvZiBiaW5kaW5ncyBmb3IgdGhlIGdpdmVuIHBhdGggdGhhdCBpcyBjaGFuZ2VkXG5cdFx0Ly8gYWNjb3JkaW5nIHRvIHRoZSBjb250YWluZWQgb2JqZWN0cyBpbiB0aGUgZ3JvdXBcblxuXHRcdHZhciBpbmRpY2VzQnlQYXRoID0gdGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoLFxuXHRcdFx0aW5kZXggPSBpbmRpY2VzQnlQYXRoWyBwYXRoIF0sXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzO1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkgcmV0dXJuIGJpbmRpbmdzWyBpbmRleCBdO1xuXG5cdFx0dmFyIHBhdGhzID0gdGhpcy5fcGF0aHMsXG5cdFx0XHRwYXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBhdGhzLFxuXHRcdFx0b2JqZWN0cyA9IHRoaXMuX29iamVjdHMsXG5cdFx0XHRuT2JqZWN0cyA9IG9iamVjdHMubGVuZ3RoLFxuXHRcdFx0bkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdGJpbmRpbmdzRm9yUGF0aCA9IG5ldyBBcnJheSggbk9iamVjdHMgKTtcblxuXHRcdGluZGV4ID0gYmluZGluZ3MubGVuZ3RoO1xuXG5cdFx0aW5kaWNlc0J5UGF0aFsgcGF0aCBdID0gaW5kZXg7XG5cblx0XHRwYXRocy5wdXNoKCBwYXRoICk7XG5cdFx0cGFyc2VkUGF0aHMucHVzaCggcGFyc2VkUGF0aCApO1xuXHRcdGJpbmRpbmdzLnB1c2goIGJpbmRpbmdzRm9yUGF0aCApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSBuQ2FjaGVkT2JqZWN0cywgbiA9IG9iamVjdHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR2YXIgb2JqZWN0ID0gb2JqZWN0c1sgaSBdO1xuXHRcdFx0YmluZGluZ3NGb3JQYXRoWyBpIF0gPSBuZXcgUHJvcGVydHlCaW5kaW5nKCBvYmplY3QsIHBhdGgsIHBhcnNlZFBhdGggKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBiaW5kaW5nc0ZvclBhdGg7XG5cblx0fSxcblxuXHR1bnN1YnNjcmliZV86IGZ1bmN0aW9uICggcGF0aCApIHtcblxuXHRcdC8vIHRlbGxzIHRoZSBncm91cCB0byBmb3JnZXQgYWJvdXQgYSBwcm9wZXJ0eSBwYXRoIGFuZCBubyBsb25nZXJcblx0XHQvLyB1cGRhdGUgdGhlIGFycmF5IHByZXZpb3VzbHkgb2J0YWluZWQgd2l0aCAnc3Vic2NyaWJlXydcblxuXHRcdHZhciBpbmRpY2VzQnlQYXRoID0gdGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoLFxuXHRcdFx0aW5kZXggPSBpbmRpY2VzQnlQYXRoWyBwYXRoIF07XG5cblx0XHRpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBwYXRocyA9IHRoaXMuX3BhdGhzLFxuXHRcdFx0XHRwYXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBhdGhzLFxuXHRcdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0XHRsYXN0QmluZGluZ3NJbmRleCA9IGJpbmRpbmdzLmxlbmd0aCAtIDEsXG5cdFx0XHRcdGxhc3RCaW5kaW5ncyA9IGJpbmRpbmdzWyBsYXN0QmluZGluZ3NJbmRleCBdLFxuXHRcdFx0XHRsYXN0QmluZGluZ3NQYXRoID0gcGF0aFsgbGFzdEJpbmRpbmdzSW5kZXggXTtcblxuXHRcdFx0aW5kaWNlc0J5UGF0aFsgbGFzdEJpbmRpbmdzUGF0aCBdID0gaW5kZXg7XG5cblx0XHRcdGJpbmRpbmdzWyBpbmRleCBdID0gbGFzdEJpbmRpbmdzO1xuXHRcdFx0YmluZGluZ3MucG9wKCk7XG5cblx0XHRcdHBhcnNlZFBhdGhzWyBpbmRleCBdID0gcGFyc2VkUGF0aHNbIGxhc3RCaW5kaW5nc0luZGV4IF07XG5cdFx0XHRwYXJzZWRQYXRocy5wb3AoKTtcblxuXHRcdFx0cGF0aHNbIGluZGV4IF0gPSBwYXRoc1sgbGFzdEJpbmRpbmdzSW5kZXggXTtcblx0XHRcdHBhdGhzLnBvcCgpO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG4vKipcbiAqXG4gKiBBY3Rpb24gcHJvdmlkZWQgYnkgQW5pbWF0aW9uTWl4ZXIgZm9yIHNjaGVkdWxpbmcgY2xpcCBwbGF5YmFjayBvbiBzcGVjaWZpY1xuICogb2JqZWN0cy5cbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKlxuICovXG5cbmZ1bmN0aW9uIEFuaW1hdGlvbkFjdGlvbiggbWl4ZXIsIGNsaXAsIGxvY2FsUm9vdCApIHtcblxuXHR0aGlzLl9taXhlciA9IG1peGVyO1xuXHR0aGlzLl9jbGlwID0gY2xpcDtcblx0dGhpcy5fbG9jYWxSb290ID0gbG9jYWxSb290IHx8IG51bGw7XG5cblx0dmFyIHRyYWNrcyA9IGNsaXAudHJhY2tzLFxuXHRcdG5UcmFja3MgPSB0cmFja3MubGVuZ3RoLFxuXHRcdGludGVycG9sYW50cyA9IG5ldyBBcnJheSggblRyYWNrcyApO1xuXG5cdHZhciBpbnRlcnBvbGFudFNldHRpbmdzID0ge1xuXHRcdGVuZGluZ1N0YXJ0OiBaZXJvQ3VydmF0dXJlRW5kaW5nLFxuXHRcdGVuZGluZ0VuZDogWmVyb0N1cnZhdHVyZUVuZGluZ1xuXHR9O1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSAhPT0gblRyYWNrczsgKysgaSApIHtcblxuXHRcdHZhciBpbnRlcnBvbGFudCA9IHRyYWNrc1sgaSBdLmNyZWF0ZUludGVycG9sYW50KCBudWxsICk7XG5cdFx0aW50ZXJwb2xhbnRzWyBpIF0gPSBpbnRlcnBvbGFudDtcblx0XHRpbnRlcnBvbGFudC5zZXR0aW5ncyA9IGludGVycG9sYW50U2V0dGluZ3M7XG5cblx0fVxuXG5cdHRoaXMuX2ludGVycG9sYW50U2V0dGluZ3MgPSBpbnRlcnBvbGFudFNldHRpbmdzO1xuXG5cdHRoaXMuX2ludGVycG9sYW50cyA9IGludGVycG9sYW50cztcdC8vIGJvdW5kIGJ5IHRoZSBtaXhlclxuXG5cdC8vIGluc2lkZTogUHJvcGVydHlNaXhlciAobWFuYWdlZCBieSB0aGUgbWl4ZXIpXG5cdHRoaXMuX3Byb3BlcnR5QmluZGluZ3MgPSBuZXcgQXJyYXkoIG5UcmFja3MgKTtcblxuXHR0aGlzLl9jYWNoZUluZGV4ID0gbnVsbDtcdFx0XHQvLyBmb3IgdGhlIG1lbW9yeSBtYW5hZ2VyXG5cdHRoaXMuX2J5Q2xpcENhY2hlSW5kZXggPSBudWxsO1x0XHQvLyBmb3IgdGhlIG1lbW9yeSBtYW5hZ2VyXG5cblx0dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBudWxsO1xuXHR0aGlzLl93ZWlnaHRJbnRlcnBvbGFudCA9IG51bGw7XG5cblx0dGhpcy5sb29wID0gTG9vcFJlcGVhdDtcblx0dGhpcy5fbG9vcENvdW50ID0gLSAxO1xuXG5cdC8vIGdsb2JhbCBtaXhlciB0aW1lIHdoZW4gdGhlIGFjdGlvbiBpcyB0byBiZSBzdGFydGVkXG5cdC8vIGl0J3Mgc2V0IGJhY2sgdG8gJ251bGwnIHVwb24gc3RhcnQgb2YgdGhlIGFjdGlvblxuXHR0aGlzLl9zdGFydFRpbWUgPSBudWxsO1xuXG5cdC8vIHNjYWxlZCBsb2NhbCB0aW1lIG9mIHRoZSBhY3Rpb25cblx0Ly8gZ2V0cyBjbGFtcGVkIG9yIHdyYXBwZWQgdG8gMC4uY2xpcC5kdXJhdGlvbiBhY2NvcmRpbmcgdG8gbG9vcFxuXHR0aGlzLnRpbWUgPSAwO1xuXG5cdHRoaXMudGltZVNjYWxlID0gMTtcblx0dGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlID0gMTtcblxuXHR0aGlzLndlaWdodCA9IDE7XG5cdHRoaXMuX2VmZmVjdGl2ZVdlaWdodCA9IDE7XG5cblx0dGhpcy5yZXBldGl0aW9ucyA9IEluZmluaXR5OyBcdFx0Ly8gbm8uIG9mIHJlcGV0aXRpb25zIHdoZW4gbG9vcGluZ1xuXG5cdHRoaXMucGF1c2VkID0gZmFsc2U7XHRcdFx0XHQvLyB0cnVlIC0+IHplcm8gZWZmZWN0aXZlIHRpbWUgc2NhbGVcblx0dGhpcy5lbmFibGVkID0gdHJ1ZTtcdFx0XHRcdC8vIGZhbHNlIC0+IHplcm8gZWZmZWN0aXZlIHdlaWdodFxuXG5cdHRoaXMuY2xhbXBXaGVuRmluaXNoZWQgXHQ9IGZhbHNlO1x0Ly8ga2VlcCBmZWVkaW5nIHRoZSBsYXN0IGZyYW1lP1xuXG5cdHRoaXMuemVyb1Nsb3BlQXRTdGFydCBcdD0gdHJ1ZTtcdFx0Ly8gZm9yIHNtb290aCBpbnRlcnBvbGF0aW9uIHcvbyBzZXBhcmF0ZVxuXHR0aGlzLnplcm9TbG9wZUF0RW5kXHRcdD0gdHJ1ZTtcdFx0Ly8gY2xpcHMgZm9yIHN0YXJ0LCBsb29wIGFuZCBlbmRcblxufVxuXG5PYmplY3QuYXNzaWduKCBBbmltYXRpb25BY3Rpb24ucHJvdG90eXBlLCB7XG5cblx0Ly8gU3RhdGUgJiBTY2hlZHVsaW5nXG5cblx0cGxheTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5fbWl4ZXIuX2FjdGl2YXRlQWN0aW9uKCB0aGlzICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN0b3A6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuX21peGVyLl9kZWFjdGl2YXRlQWN0aW9uKCB0aGlzICk7XG5cblx0XHRyZXR1cm4gdGhpcy5yZXNldCgpO1xuXG5cdH0sXG5cblx0cmVzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMucGF1c2VkID0gZmFsc2U7XG5cdFx0dGhpcy5lbmFibGVkID0gdHJ1ZTtcblxuXHRcdHRoaXMudGltZSA9IDA7XHRcdFx0Ly8gcmVzdGFydCBjbGlwXG5cdFx0dGhpcy5fbG9vcENvdW50ID0gLSAxO1x0Ly8gZm9yZ2V0IHByZXZpb3VzIGxvb3BzXG5cdFx0dGhpcy5fc3RhcnRUaW1lID0gbnVsbDtcdC8vIGZvcmdldCBzY2hlZHVsaW5nXG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wRmFkaW5nKCkuc3RvcFdhcnBpbmcoKTtcblxuXHR9LFxuXG5cdGlzUnVubmluZzogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZW5hYmxlZCAmJiAhIHRoaXMucGF1c2VkICYmIHRoaXMudGltZVNjYWxlICE9PSAwICYmXG5cdFx0XHRcdHRoaXMuX3N0YXJ0VGltZSA9PT0gbnVsbCAmJiB0aGlzLl9taXhlci5faXNBY3RpdmVBY3Rpb24oIHRoaXMgKTtcblxuXHR9LFxuXG5cdC8vIHJldHVybiB0cnVlIHdoZW4gcGxheSBoYXMgYmVlbiBjYWxsZWRcblx0aXNTY2hlZHVsZWQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLl9taXhlci5faXNBY3RpdmVBY3Rpb24oIHRoaXMgKTtcblxuXHR9LFxuXG5cdHN0YXJ0QXQ6IGZ1bmN0aW9uICggdGltZSApIHtcblxuXHRcdHRoaXMuX3N0YXJ0VGltZSA9IHRpbWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldExvb3A6IGZ1bmN0aW9uICggbW9kZSwgcmVwZXRpdGlvbnMgKSB7XG5cblx0XHR0aGlzLmxvb3AgPSBtb2RlO1xuXHRcdHRoaXMucmVwZXRpdGlvbnMgPSByZXBldGl0aW9ucztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gV2VpZ2h0XG5cblx0Ly8gc2V0IHRoZSB3ZWlnaHQgc3RvcHBpbmcgYW55IHNjaGVkdWxlZCBmYWRpbmdcblx0Ly8gYWx0aG91Z2ggLmVuYWJsZWQgPSBmYWxzZSB5aWVsZHMgYW4gZWZmZWN0aXZlIHdlaWdodCBvZiB6ZXJvLCB0aGlzXG5cdC8vIG1ldGhvZCBkb2VzICpub3QqIGNoYW5nZSAuZW5hYmxlZCwgYmVjYXVzZSBpdCB3b3VsZCBiZSBjb25mdXNpbmdcblx0c2V0RWZmZWN0aXZlV2VpZ2h0OiBmdW5jdGlvbiAoIHdlaWdodCApIHtcblxuXHRcdHRoaXMud2VpZ2h0ID0gd2VpZ2h0O1xuXG5cdFx0Ly8gbm90ZTogc2FtZSBsb2dpYyBhcyB3aGVuIHVwZGF0ZWQgYXQgcnVudGltZVxuXHRcdHRoaXMuX2VmZmVjdGl2ZVdlaWdodCA9IHRoaXMuZW5hYmxlZCA/IHdlaWdodCA6IDA7XG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wRmFkaW5nKCk7XG5cblx0fSxcblxuXHQvLyByZXR1cm4gdGhlIHdlaWdodCBjb25zaWRlcmluZyBmYWRpbmcgYW5kIC5lbmFibGVkXG5cdGdldEVmZmVjdGl2ZVdlaWdodDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVdlaWdodDtcblxuXHR9LFxuXG5cdGZhZGVJbjogZnVuY3Rpb24gKCBkdXJhdGlvbiApIHtcblxuXHRcdHJldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyggZHVyYXRpb24sIDAsIDEgKTtcblxuXHR9LFxuXG5cdGZhZGVPdXQ6IGZ1bmN0aW9uICggZHVyYXRpb24gKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fc2NoZWR1bGVGYWRpbmcoIGR1cmF0aW9uLCAxLCAwICk7XG5cblx0fSxcblxuXHRjcm9zc0ZhZGVGcm9tOiBmdW5jdGlvbiAoIGZhZGVPdXRBY3Rpb24sIGR1cmF0aW9uLCB3YXJwICkge1xuXG5cdFx0ZmFkZU91dEFjdGlvbi5mYWRlT3V0KCBkdXJhdGlvbiApO1xuXHRcdHRoaXMuZmFkZUluKCBkdXJhdGlvbiApO1xuXG5cdFx0aWYgKCB3YXJwICkge1xuXG5cdFx0XHR2YXIgZmFkZUluRHVyYXRpb24gPSB0aGlzLl9jbGlwLmR1cmF0aW9uLFxuXHRcdFx0XHRmYWRlT3V0RHVyYXRpb24gPSBmYWRlT3V0QWN0aW9uLl9jbGlwLmR1cmF0aW9uLFxuXG5cdFx0XHRcdHN0YXJ0RW5kUmF0aW8gPSBmYWRlT3V0RHVyYXRpb24gLyBmYWRlSW5EdXJhdGlvbixcblx0XHRcdFx0ZW5kU3RhcnRSYXRpbyA9IGZhZGVJbkR1cmF0aW9uIC8gZmFkZU91dER1cmF0aW9uO1xuXG5cdFx0XHRmYWRlT3V0QWN0aW9uLndhcnAoIDEuMCwgc3RhcnRFbmRSYXRpbywgZHVyYXRpb24gKTtcblx0XHRcdHRoaXMud2FycCggZW5kU3RhcnRSYXRpbywgMS4wLCBkdXJhdGlvbiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjcm9zc0ZhZGVUbzogZnVuY3Rpb24gKCBmYWRlSW5BY3Rpb24sIGR1cmF0aW9uLCB3YXJwICkge1xuXG5cdFx0cmV0dXJuIGZhZGVJbkFjdGlvbi5jcm9zc0ZhZGVGcm9tKCB0aGlzLCBkdXJhdGlvbiwgd2FycCApO1xuXG5cdH0sXG5cblx0c3RvcEZhZGluZzogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHdlaWdodEludGVycG9sYW50ID0gdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7XG5cblx0XHRpZiAoIHdlaWdodEludGVycG9sYW50ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLl93ZWlnaHRJbnRlcnBvbGFudCA9IG51bGw7XG5cdFx0XHR0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQoIHdlaWdodEludGVycG9sYW50ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIFRpbWUgU2NhbGUgQ29udHJvbFxuXG5cdC8vIHNldCB0aGUgdGltZSBzY2FsZSBzdG9wcGluZyBhbnkgc2NoZWR1bGVkIHdhcnBpbmdcblx0Ly8gYWx0aG91Z2ggLnBhdXNlZCA9IHRydWUgeWllbGRzIGFuIGVmZmVjdGl2ZSB0aW1lIHNjYWxlIG9mIHplcm8sIHRoaXNcblx0Ly8gbWV0aG9kIGRvZXMgKm5vdCogY2hhbmdlIC5wYXVzZWQsIGJlY2F1c2UgaXQgd291bGQgYmUgY29uZnVzaW5nXG5cdHNldEVmZmVjdGl2ZVRpbWVTY2FsZTogZnVuY3Rpb24gKCB0aW1lU2NhbGUgKSB7XG5cblx0XHR0aGlzLnRpbWVTY2FsZSA9IHRpbWVTY2FsZTtcblx0XHR0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUgPSB0aGlzLnBhdXNlZCA/IDAgOiB0aW1lU2NhbGU7XG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpO1xuXG5cdH0sXG5cblx0Ly8gcmV0dXJuIHRoZSB0aW1lIHNjYWxlIGNvbnNpZGVyaW5nIHdhcnBpbmcgYW5kIC5wYXVzZWRcblx0Z2V0RWZmZWN0aXZlVGltZVNjYWxlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlO1xuXG5cdH0sXG5cblx0c2V0RHVyYXRpb246IGZ1bmN0aW9uICggZHVyYXRpb24gKSB7XG5cblx0XHR0aGlzLnRpbWVTY2FsZSA9IHRoaXMuX2NsaXAuZHVyYXRpb24gLyBkdXJhdGlvbjtcblxuXHRcdHJldHVybiB0aGlzLnN0b3BXYXJwaW5nKCk7XG5cblx0fSxcblxuXHRzeW5jV2l0aDogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHR0aGlzLnRpbWUgPSBhY3Rpb24udGltZTtcblx0XHR0aGlzLnRpbWVTY2FsZSA9IGFjdGlvbi50aW1lU2NhbGU7XG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpO1xuXG5cdH0sXG5cblx0aGFsdDogZnVuY3Rpb24gKCBkdXJhdGlvbiApIHtcblxuXHRcdHJldHVybiB0aGlzLndhcnAoIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSwgMCwgZHVyYXRpb24gKTtcblxuXHR9LFxuXG5cdHdhcnA6IGZ1bmN0aW9uICggc3RhcnRUaW1lU2NhbGUsIGVuZFRpbWVTY2FsZSwgZHVyYXRpb24gKSB7XG5cblx0XHR2YXIgbWl4ZXIgPSB0aGlzLl9taXhlciwgbm93ID0gbWl4ZXIudGltZSxcblx0XHRcdGludGVycG9sYW50ID0gdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQsXG5cblx0XHRcdHRpbWVTY2FsZSA9IHRoaXMudGltZVNjYWxlO1xuXG5cdFx0aWYgKCBpbnRlcnBvbGFudCA9PT0gbnVsbCApIHtcblxuXHRcdFx0aW50ZXJwb2xhbnQgPSBtaXhlci5fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpO1xuXHRcdFx0dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudDtcblxuXHRcdH1cblxuXHRcdHZhciB0aW1lcyA9IGludGVycG9sYW50LnBhcmFtZXRlclBvc2l0aW9ucyxcblx0XHRcdHZhbHVlcyA9IGludGVycG9sYW50LnNhbXBsZVZhbHVlcztcblxuXHRcdHRpbWVzWyAwIF0gPSBub3c7XG5cdFx0dGltZXNbIDEgXSA9IG5vdyArIGR1cmF0aW9uO1xuXG5cdFx0dmFsdWVzWyAwIF0gPSBzdGFydFRpbWVTY2FsZSAvIHRpbWVTY2FsZTtcblx0XHR2YWx1ZXNbIDEgXSA9IGVuZFRpbWVTY2FsZSAvIHRpbWVTY2FsZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3RvcFdhcnBpbmc6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0aW1lU2NhbGVJbnRlcnBvbGFudCA9IHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50O1xuXG5cdFx0aWYgKCB0aW1lU2NhbGVJbnRlcnBvbGFudCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBudWxsO1xuXHRcdFx0dGhpcy5fbWl4ZXIuX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KCB0aW1lU2NhbGVJbnRlcnBvbGFudCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyBPYmplY3QgQWNjZXNzb3JzXG5cblx0Z2V0TWl4ZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLl9taXhlcjtcblxuXHR9LFxuXG5cdGdldENsaXA6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLl9jbGlwO1xuXG5cdH0sXG5cblx0Z2V0Um9vdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX2xvY2FsUm9vdCB8fCB0aGlzLl9taXhlci5fcm9vdDtcblxuXHR9LFxuXG5cdC8vIEludGVybmFcblxuXHRfdXBkYXRlOiBmdW5jdGlvbiAoIHRpbWUsIGRlbHRhVGltZSwgdGltZURpcmVjdGlvbiwgYWNjdUluZGV4ICkge1xuXG5cdFx0Ly8gY2FsbGVkIGJ5IHRoZSBtaXhlclxuXG5cdFx0aWYgKCAhIHRoaXMuZW5hYmxlZCApIHtcblxuXHRcdFx0Ly8gY2FsbCAuX3VwZGF0ZVdlaWdodCgpIHRvIHVwZGF0ZSAuX2VmZmVjdGl2ZVdlaWdodFxuXG5cdFx0XHR0aGlzLl91cGRhdGVXZWlnaHQoIHRpbWUgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHZhciBzdGFydFRpbWUgPSB0aGlzLl9zdGFydFRpbWU7XG5cblx0XHRpZiAoIHN0YXJ0VGltZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0Ly8gY2hlY2sgZm9yIHNjaGVkdWxlZCBzdGFydCBvZiBhY3Rpb25cblxuXHRcdFx0dmFyIHRpbWVSdW5uaW5nID0gKCB0aW1lIC0gc3RhcnRUaW1lICkgKiB0aW1lRGlyZWN0aW9uO1xuXHRcdFx0aWYgKCB0aW1lUnVubmluZyA8IDAgfHwgdGltZURpcmVjdGlvbiA9PT0gMCApIHtcblxuXHRcdFx0XHRyZXR1cm47IC8vIHlldCB0byBjb21lIC8gZG9uJ3QgZGVjaWRlIHdoZW4gZGVsdGEgPSAwXG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gc3RhcnRcblxuXHRcdFx0dGhpcy5fc3RhcnRUaW1lID0gbnVsbDsgLy8gdW5zY2hlZHVsZVxuXHRcdFx0ZGVsdGFUaW1lID0gdGltZURpcmVjdGlvbiAqIHRpbWVSdW5uaW5nO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYXBwbHkgdGltZSBzY2FsZSBhbmQgYWR2YW5jZSB0aW1lXG5cblx0XHRkZWx0YVRpbWUgKj0gdGhpcy5fdXBkYXRlVGltZVNjYWxlKCB0aW1lICk7XG5cdFx0dmFyIGNsaXBUaW1lID0gdGhpcy5fdXBkYXRlVGltZSggZGVsdGFUaW1lICk7XG5cblx0XHQvLyBub3RlOiBfdXBkYXRlVGltZSBtYXkgZGlzYWJsZSB0aGUgYWN0aW9uIHJlc3VsdGluZyBpblxuXHRcdC8vIGFuIGVmZmVjdGl2ZSB3ZWlnaHQgb2YgMFxuXG5cdFx0dmFyIHdlaWdodCA9IHRoaXMuX3VwZGF0ZVdlaWdodCggdGltZSApO1xuXG5cdFx0aWYgKCB3ZWlnaHQgPiAwICkge1xuXG5cdFx0XHR2YXIgaW50ZXJwb2xhbnRzID0gdGhpcy5faW50ZXJwb2xhbnRzO1xuXHRcdFx0dmFyIHByb3BlcnR5TWl4ZXJzID0gdGhpcy5fcHJvcGVydHlCaW5kaW5ncztcblxuXHRcdFx0Zm9yICggdmFyIGogPSAwLCBtID0gaW50ZXJwb2xhbnRzLmxlbmd0aDsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRpbnRlcnBvbGFudHNbIGogXS5ldmFsdWF0ZSggY2xpcFRpbWUgKTtcblx0XHRcdFx0cHJvcGVydHlNaXhlcnNbIGogXS5hY2N1bXVsYXRlKCBhY2N1SW5kZXgsIHdlaWdodCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRfdXBkYXRlV2VpZ2h0OiBmdW5jdGlvbiAoIHRpbWUgKSB7XG5cblx0XHR2YXIgd2VpZ2h0ID0gMDtcblxuXHRcdGlmICggdGhpcy5lbmFibGVkICkge1xuXG5cdFx0XHR3ZWlnaHQgPSB0aGlzLndlaWdodDtcblx0XHRcdHZhciBpbnRlcnBvbGFudCA9IHRoaXMuX3dlaWdodEludGVycG9sYW50O1xuXG5cdFx0XHRpZiAoIGludGVycG9sYW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdHZhciBpbnRlcnBvbGFudFZhbHVlID0gaW50ZXJwb2xhbnQuZXZhbHVhdGUoIHRpbWUgKVsgMCBdO1xuXG5cdFx0XHRcdHdlaWdodCAqPSBpbnRlcnBvbGFudFZhbHVlO1xuXG5cdFx0XHRcdGlmICggdGltZSA+IGludGVycG9sYW50LnBhcmFtZXRlclBvc2l0aW9uc1sgMSBdICkge1xuXG5cdFx0XHRcdFx0dGhpcy5zdG9wRmFkaW5nKCk7XG5cblx0XHRcdFx0XHRpZiAoIGludGVycG9sYW50VmFsdWUgPT09IDAgKSB7XG5cblx0XHRcdFx0XHRcdC8vIGZhZGVkIG91dCwgZGlzYWJsZVxuXHRcdFx0XHRcdFx0dGhpcy5lbmFibGVkID0gZmFsc2U7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR0aGlzLl9lZmZlY3RpdmVXZWlnaHQgPSB3ZWlnaHQ7XG5cdFx0cmV0dXJuIHdlaWdodDtcblxuXHR9LFxuXG5cdF91cGRhdGVUaW1lU2NhbGU6IGZ1bmN0aW9uICggdGltZSApIHtcblxuXHRcdHZhciB0aW1lU2NhbGUgPSAwO1xuXG5cdFx0aWYgKCAhIHRoaXMucGF1c2VkICkge1xuXG5cdFx0XHR0aW1lU2NhbGUgPSB0aGlzLnRpbWVTY2FsZTtcblxuXHRcdFx0dmFyIGludGVycG9sYW50ID0gdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7XG5cblx0XHRcdGlmICggaW50ZXJwb2xhbnQgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0dmFyIGludGVycG9sYW50VmFsdWUgPSBpbnRlcnBvbGFudC5ldmFsdWF0ZSggdGltZSApWyAwIF07XG5cblx0XHRcdFx0dGltZVNjYWxlICo9IGludGVycG9sYW50VmFsdWU7XG5cblx0XHRcdFx0aWYgKCB0aW1lID4gaW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zWyAxIF0gKSB7XG5cblx0XHRcdFx0XHR0aGlzLnN0b3BXYXJwaW5nKCk7XG5cblx0XHRcdFx0XHRpZiAoIHRpbWVTY2FsZSA9PT0gMCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gbW90aW9uIGhhcyBoYWx0ZWQsIHBhdXNlXG5cdFx0XHRcdFx0XHR0aGlzLnBhdXNlZCA9IHRydWU7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHQvLyB3YXJwIGRvbmUgLSBhcHBseSBmaW5hbCB0aW1lIHNjYWxlXG5cdFx0XHRcdFx0XHR0aGlzLnRpbWVTY2FsZSA9IHRpbWVTY2FsZTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSA9IHRpbWVTY2FsZTtcblx0XHRyZXR1cm4gdGltZVNjYWxlO1xuXG5cdH0sXG5cblx0X3VwZGF0ZVRpbWU6IGZ1bmN0aW9uICggZGVsdGFUaW1lICkge1xuXG5cdFx0dmFyIHRpbWUgPSB0aGlzLnRpbWUgKyBkZWx0YVRpbWU7XG5cblx0XHRpZiAoIGRlbHRhVGltZSA9PT0gMCApIHJldHVybiB0aW1lO1xuXG5cdFx0dmFyIGR1cmF0aW9uID0gdGhpcy5fY2xpcC5kdXJhdGlvbixcblxuXHRcdFx0bG9vcCA9IHRoaXMubG9vcCxcblx0XHRcdGxvb3BDb3VudCA9IHRoaXMuX2xvb3BDb3VudDtcblxuXHRcdGlmICggbG9vcCA9PT0gTG9vcE9uY2UgKSB7XG5cblx0XHRcdGlmICggbG9vcENvdW50ID09PSAtIDEgKSB7XG5cblx0XHRcdFx0Ly8ganVzdCBzdGFydGVkXG5cblx0XHRcdFx0dGhpcy5fbG9vcENvdW50ID0gMDtcblx0XHRcdFx0dGhpcy5fc2V0RW5kaW5ncyggdHJ1ZSwgdHJ1ZSwgZmFsc2UgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRoYW5kbGVfc3RvcDoge1xuXG5cdFx0XHRcdGlmICggdGltZSA+PSBkdXJhdGlvbiApIHtcblxuXHRcdFx0XHRcdHRpbWUgPSBkdXJhdGlvbjtcblxuXHRcdFx0XHR9IGVsc2UgaWYgKCB0aW1lIDwgMCApIHtcblxuXHRcdFx0XHRcdHRpbWUgPSAwO1xuXG5cdFx0XHRcdH0gZWxzZSBicmVhayBoYW5kbGVfc3RvcDtcblxuXHRcdFx0XHRpZiAoIHRoaXMuY2xhbXBXaGVuRmluaXNoZWQgKSB0aGlzLnBhdXNlZCA9IHRydWU7XG5cdFx0XHRcdGVsc2UgdGhpcy5lbmFibGVkID0gZmFsc2U7XG5cblx0XHRcdFx0dGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCgge1xuXHRcdFx0XHRcdHR5cGU6ICdmaW5pc2hlZCcsIGFjdGlvbjogdGhpcyxcblx0XHRcdFx0XHRkaXJlY3Rpb246IGRlbHRhVGltZSA8IDAgPyAtIDEgOiAxXG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHsgLy8gcmVwZXRpdGl2ZSBSZXBlYXQgb3IgUGluZ1BvbmdcblxuXHRcdFx0dmFyIHBpbmdQb25nID0gKCBsb29wID09PSBMb29wUGluZ1BvbmcgKTtcblxuXHRcdFx0aWYgKCBsb29wQ291bnQgPT09IC0gMSApIHtcblxuXHRcdFx0XHQvLyBqdXN0IHN0YXJ0ZWRcblxuXHRcdFx0XHRpZiAoIGRlbHRhVGltZSA+PSAwICkge1xuXG5cdFx0XHRcdFx0bG9vcENvdW50ID0gMDtcblxuXHRcdFx0XHRcdHRoaXMuX3NldEVuZGluZ3MoIHRydWUsIHRoaXMucmVwZXRpdGlvbnMgPT09IDAsIHBpbmdQb25nICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIHdoZW4gbG9vcGluZyBpbiByZXZlcnNlIGRpcmVjdGlvbiwgdGhlIGluaXRpYWxcblx0XHRcdFx0XHQvLyB0cmFuc2l0aW9uIHRocm91Z2ggemVybyBjb3VudHMgYXMgYSByZXBldGl0aW9uLFxuXHRcdFx0XHRcdC8vIHNvIGxlYXZlIGxvb3BDb3VudCBhdCAtMVxuXG5cdFx0XHRcdFx0dGhpcy5fc2V0RW5kaW5ncyggdGhpcy5yZXBldGl0aW9ucyA9PT0gMCwgdHJ1ZSwgcGluZ1BvbmcgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0aW1lID49IGR1cmF0aW9uIHx8IHRpbWUgPCAwICkge1xuXG5cdFx0XHRcdC8vIHdyYXAgYXJvdW5kXG5cblx0XHRcdFx0dmFyIGxvb3BEZWx0YSA9IE1hdGguZmxvb3IoIHRpbWUgLyBkdXJhdGlvbiApOyAvLyBzaWduZWRcblx0XHRcdFx0dGltZSAtPSBkdXJhdGlvbiAqIGxvb3BEZWx0YTtcblxuXHRcdFx0XHRsb29wQ291bnQgKz0gTWF0aC5hYnMoIGxvb3BEZWx0YSApO1xuXG5cdFx0XHRcdHZhciBwZW5kaW5nID0gdGhpcy5yZXBldGl0aW9ucyAtIGxvb3BDb3VudDtcblxuXHRcdFx0XHRpZiAoIHBlbmRpbmcgPD0gMCApIHtcblxuXHRcdFx0XHRcdC8vIGhhdmUgdG8gc3RvcCAoc3dpdGNoIHN0YXRlLCBjbGFtcCB0aW1lLCBmaXJlIGV2ZW50KVxuXG5cdFx0XHRcdFx0aWYgKCB0aGlzLmNsYW1wV2hlbkZpbmlzaGVkICkgdGhpcy5wYXVzZWQgPSB0cnVlO1xuXHRcdFx0XHRcdGVsc2UgdGhpcy5lbmFibGVkID0gZmFsc2U7XG5cblx0XHRcdFx0XHR0aW1lID0gZGVsdGFUaW1lID4gMCA/IGR1cmF0aW9uIDogMDtcblxuXHRcdFx0XHRcdHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoIHtcblx0XHRcdFx0XHRcdHR5cGU6ICdmaW5pc2hlZCcsIGFjdGlvbjogdGhpcyxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogZGVsdGFUaW1lID4gMCA/IDEgOiAtIDFcblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIGtlZXAgcnVubmluZ1xuXG5cdFx0XHRcdFx0aWYgKCBwZW5kaW5nID09PSAxICkge1xuXG5cdFx0XHRcdFx0XHQvLyBlbnRlcmluZyB0aGUgbGFzdCByb3VuZFxuXG5cdFx0XHRcdFx0XHR2YXIgYXRTdGFydCA9IGRlbHRhVGltZSA8IDA7XG5cdFx0XHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKCBhdFN0YXJ0LCAhIGF0U3RhcnQsIHBpbmdQb25nICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKCBmYWxzZSwgZmFsc2UsIHBpbmdQb25nICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0aGlzLl9sb29wQ291bnQgPSBsb29wQ291bnQ7XG5cblx0XHRcdFx0XHR0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KCB7XG5cdFx0XHRcdFx0XHR0eXBlOiAnbG9vcCcsIGFjdGlvbjogdGhpcywgbG9vcERlbHRhOiBsb29wRGVsdGFcblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggcGluZ1BvbmcgJiYgKCBsb29wQ291bnQgJiAxICkgPT09IDEgKSB7XG5cblx0XHRcdFx0Ly8gaW52ZXJ0IHRpbWUgZm9yIHRoZSBcInBvbmcgcm91bmRcIlxuXG5cdFx0XHRcdHRoaXMudGltZSA9IHRpbWU7XG5cdFx0XHRcdHJldHVybiBkdXJhdGlvbiAtIHRpbWU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMudGltZSA9IHRpbWU7XG5cdFx0cmV0dXJuIHRpbWU7XG5cblx0fSxcblxuXHRfc2V0RW5kaW5nczogZnVuY3Rpb24gKCBhdFN0YXJ0LCBhdEVuZCwgcGluZ1BvbmcgKSB7XG5cblx0XHR2YXIgc2V0dGluZ3MgPSB0aGlzLl9pbnRlcnBvbGFudFNldHRpbmdzO1xuXG5cdFx0aWYgKCBwaW5nUG9uZyApIHtcblxuXHRcdFx0c2V0dGluZ3MuZW5kaW5nU3RhcnQgXHQ9IFplcm9TbG9wZUVuZGluZztcblx0XHRcdHNldHRpbmdzLmVuZGluZ0VuZFx0XHQ9IFplcm9TbG9wZUVuZGluZztcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIGFzc3VtaW5nIGZvciBMb29wT25jZSBhdFN0YXJ0ID09IGF0RW5kID09IHRydWVcblxuXHRcdFx0aWYgKCBhdFN0YXJ0ICkge1xuXG5cdFx0XHRcdHNldHRpbmdzLmVuZGluZ1N0YXJ0ID0gdGhpcy56ZXJvU2xvcGVBdFN0YXJ0ID8gWmVyb1Nsb3BlRW5kaW5nIDogWmVyb0N1cnZhdHVyZUVuZGluZztcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRzZXR0aW5ncy5lbmRpbmdTdGFydCA9IFdyYXBBcm91bmRFbmRpbmc7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBhdEVuZCApIHtcblxuXHRcdFx0XHRzZXR0aW5ncy5lbmRpbmdFbmQgPSB0aGlzLnplcm9TbG9wZUF0RW5kID8gWmVyb1Nsb3BlRW5kaW5nIDogWmVyb0N1cnZhdHVyZUVuZGluZztcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRzZXR0aW5ncy5lbmRpbmdFbmQgXHQgPSBXcmFwQXJvdW5kRW5kaW5nO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRfc2NoZWR1bGVGYWRpbmc6IGZ1bmN0aW9uICggZHVyYXRpb24sIHdlaWdodE5vdywgd2VpZ2h0VGhlbiApIHtcblxuXHRcdHZhciBtaXhlciA9IHRoaXMuX21peGVyLCBub3cgPSBtaXhlci50aW1lLFxuXHRcdFx0aW50ZXJwb2xhbnQgPSB0aGlzLl93ZWlnaHRJbnRlcnBvbGFudDtcblxuXHRcdGlmICggaW50ZXJwb2xhbnQgPT09IG51bGwgKSB7XG5cblx0XHRcdGludGVycG9sYW50ID0gbWl4ZXIuX2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKTtcblx0XHRcdHRoaXMuX3dlaWdodEludGVycG9sYW50ID0gaW50ZXJwb2xhbnQ7XG5cblx0XHR9XG5cblx0XHR2YXIgdGltZXMgPSBpbnRlcnBvbGFudC5wYXJhbWV0ZXJQb3NpdGlvbnMsXG5cdFx0XHR2YWx1ZXMgPSBpbnRlcnBvbGFudC5zYW1wbGVWYWx1ZXM7XG5cblx0XHR0aW1lc1sgMCBdID0gbm93OyBcdFx0XHRcdHZhbHVlc1sgMCBdID0gd2VpZ2h0Tm93O1xuXHRcdHRpbWVzWyAxIF0gPSBub3cgKyBkdXJhdGlvbjtcdHZhbHVlc1sgMSBdID0gd2VpZ2h0VGhlbjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqXG4gKiBQbGF5ZXIgZm9yIEFuaW1hdGlvbkNsaXBzLlxuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gQW5pbWF0aW9uTWl4ZXIoIHJvb3QgKSB7XG5cblx0dGhpcy5fcm9vdCA9IHJvb3Q7XG5cdHRoaXMuX2luaXRNZW1vcnlNYW5hZ2VyKCk7XG5cdHRoaXMuX2FjY3VJbmRleCA9IDA7XG5cblx0dGhpcy50aW1lID0gMDtcblxuXHR0aGlzLnRpbWVTY2FsZSA9IDEuMDtcblxufVxuXG5BbmltYXRpb25NaXhlci5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQW5pbWF0aW9uTWl4ZXIsXG5cblx0X2JpbmRBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uLCBwcm90b3R5cGVBY3Rpb24gKSB7XG5cblx0XHR2YXIgcm9vdCA9IGFjdGlvbi5fbG9jYWxSb290IHx8IHRoaXMuX3Jvb3QsXG5cdFx0XHR0cmFja3MgPSBhY3Rpb24uX2NsaXAudHJhY2tzLFxuXHRcdFx0blRyYWNrcyA9IHRyYWNrcy5sZW5ndGgsXG5cdFx0XHRiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5ncyxcblx0XHRcdGludGVycG9sYW50cyA9IGFjdGlvbi5faW50ZXJwb2xhbnRzLFxuXHRcdFx0cm9vdFV1aWQgPSByb290LnV1aWQsXG5cdFx0XHRiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSxcblx0XHRcdGJpbmRpbmdzQnlOYW1lID0gYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF07XG5cblx0XHRpZiAoIGJpbmRpbmdzQnlOYW1lID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGJpbmRpbmdzQnlOYW1lID0ge307XG5cdFx0XHRiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXSA9IGJpbmRpbmdzQnlOYW1lO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuVHJhY2tzOyArKyBpICkge1xuXG5cdFx0XHR2YXIgdHJhY2sgPSB0cmFja3NbIGkgXSxcblx0XHRcdFx0dHJhY2tOYW1lID0gdHJhY2submFtZSxcblx0XHRcdFx0YmluZGluZyA9IGJpbmRpbmdzQnlOYW1lWyB0cmFja05hbWUgXTtcblxuXHRcdFx0aWYgKCBiaW5kaW5nICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0YmluZGluZ3NbIGkgXSA9IGJpbmRpbmc7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0YmluZGluZyA9IGJpbmRpbmdzWyBpIF07XG5cblx0XHRcdFx0aWYgKCBiaW5kaW5nICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBleGlzdGluZyBiaW5kaW5nLCBtYWtlIHN1cmUgdGhlIGNhY2hlIGtub3dzXG5cblx0XHRcdFx0XHRpZiAoIGJpbmRpbmcuX2NhY2hlSW5kZXggPT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHRcdCsrIGJpbmRpbmcucmVmZXJlbmNlQ291bnQ7XG5cdFx0XHRcdFx0XHR0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcoIGJpbmRpbmcsIHJvb3RVdWlkLCB0cmFja05hbWUgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgcGF0aCA9IHByb3RvdHlwZUFjdGlvbiAmJiBwcm90b3R5cGVBY3Rpb24uXG5cdFx0XHRcdFx0X3Byb3BlcnR5QmluZGluZ3NbIGkgXS5iaW5kaW5nLnBhcnNlZFBhdGg7XG5cblx0XHRcdFx0YmluZGluZyA9IG5ldyBQcm9wZXJ0eU1peGVyKFxuXHRcdFx0XHRcdFByb3BlcnR5QmluZGluZy5jcmVhdGUoIHJvb3QsIHRyYWNrTmFtZSwgcGF0aCApLFxuXHRcdFx0XHRcdHRyYWNrLlZhbHVlVHlwZU5hbWUsIHRyYWNrLmdldFZhbHVlU2l6ZSgpICk7XG5cblx0XHRcdFx0KysgYmluZGluZy5yZWZlcmVuY2VDb3VudDtcblx0XHRcdFx0dGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nLCByb290VXVpZCwgdHJhY2tOYW1lICk7XG5cblx0XHRcdFx0YmluZGluZ3NbIGkgXSA9IGJpbmRpbmc7XG5cblx0XHRcdH1cblxuXHRcdFx0aW50ZXJwb2xhbnRzWyBpIF0ucmVzdWx0QnVmZmVyID0gYmluZGluZy5idWZmZXI7XG5cblx0XHR9XG5cblx0fSxcblxuXHRfYWN0aXZhdGVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0aWYgKCAhIHRoaXMuX2lzQWN0aXZlQWN0aW9uKCBhY3Rpb24gKSApIHtcblxuXHRcdFx0aWYgKCBhY3Rpb24uX2NhY2hlSW5kZXggPT09IG51bGwgKSB7XG5cblx0XHRcdFx0Ly8gdGhpcyBhY3Rpb24gaGFzIGJlZW4gZm9yZ290dGVuIGJ5IHRoZSBjYWNoZSwgYnV0IHRoZSB1c2VyXG5cdFx0XHRcdC8vIGFwcGVhcnMgdG8gYmUgc3RpbGwgdXNpbmcgaXQgLT4gcmViaW5kXG5cblx0XHRcdFx0dmFyIHJvb3RVdWlkID0gKCBhY3Rpb24uX2xvY2FsUm9vdCB8fCB0aGlzLl9yb290ICkudXVpZCxcblx0XHRcdFx0XHRjbGlwVXVpZCA9IGFjdGlvbi5fY2xpcC51dWlkLFxuXHRcdFx0XHRcdGFjdGlvbnNGb3JDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcblxuXHRcdFx0XHR0aGlzLl9iaW5kQWN0aW9uKCBhY3Rpb24sXG5cdFx0XHRcdFx0YWN0aW9uc0ZvckNsaXAgJiYgYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zWyAwIF0gKTtcblxuXHRcdFx0XHR0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbiggYWN0aW9uLCBjbGlwVXVpZCwgcm9vdFV1aWQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgYmluZGluZ3MgPSBhY3Rpb24uX3Byb3BlcnR5QmluZGluZ3M7XG5cblx0XHRcdC8vIGluY3JlbWVudCByZWZlcmVuY2UgY291bnRzIC8gc29ydCBvdXQgc3RhdGVcblx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHR2YXIgYmluZGluZyA9IGJpbmRpbmdzWyBpIF07XG5cblx0XHRcdFx0aWYgKCBiaW5kaW5nLnVzZUNvdW50ICsrID09PSAwICkge1xuXG5cdFx0XHRcdFx0dGhpcy5fbGVuZEJpbmRpbmcoIGJpbmRpbmcgKTtcblx0XHRcdFx0XHRiaW5kaW5nLnNhdmVPcmlnaW5hbFN0YXRlKCk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX2xlbmRBY3Rpb24oIGFjdGlvbiApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0X2RlYWN0aXZhdGVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0aWYgKCB0aGlzLl9pc0FjdGl2ZUFjdGlvbiggYWN0aW9uICkgKSB7XG5cblx0XHRcdHZhciBiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5ncztcblxuXHRcdFx0Ly8gZGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudHMgLyBzb3J0IG91dCBzdGF0ZVxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdHZhciBiaW5kaW5nID0gYmluZGluZ3NbIGkgXTtcblxuXHRcdFx0XHRpZiAoIC0tIGJpbmRpbmcudXNlQ291bnQgPT09IDAgKSB7XG5cblx0XHRcdFx0XHRiaW5kaW5nLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCk7XG5cdFx0XHRcdFx0dGhpcy5fdGFrZUJhY2tCaW5kaW5nKCBiaW5kaW5nICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX3Rha2VCYWNrQWN0aW9uKCBhY3Rpb24gKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdC8vIE1lbW9yeSBtYW5hZ2VyXG5cblx0X2luaXRNZW1vcnlNYW5hZ2VyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLl9hY3Rpb25zID0gW107IC8vICduQWN0aXZlQWN0aW9ucycgZm9sbG93ZWQgYnkgaW5hY3RpdmUgb25lc1xuXHRcdHRoaXMuX25BY3RpdmVBY3Rpb25zID0gMDtcblxuXHRcdHRoaXMuX2FjdGlvbnNCeUNsaXAgPSB7fTtcblx0XHQvLyBpbnNpZGU6XG5cdFx0Ly8ge1xuXHRcdC8vIFx0XHRrbm93bkFjdGlvbnM6IEFycmF5PCBBbmltYXRpb25BY3Rpb24gPlx0LSB1c2VkIGFzIHByb3RvdHlwZXNcblx0XHQvLyBcdFx0YWN0aW9uQnlSb290OiBBbmltYXRpb25BY3Rpb25cdFx0XHQtIGxvb2t1cFxuXHRcdC8vIH1cblxuXG5cdFx0dGhpcy5fYmluZGluZ3MgPSBbXTsgLy8gJ25BY3RpdmVCaW5kaW5ncycgZm9sbG93ZWQgYnkgaW5hY3RpdmUgb25lc1xuXHRcdHRoaXMuX25BY3RpdmVCaW5kaW5ncyA9IDA7XG5cblx0XHR0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUgPSB7fTsgLy8gaW5zaWRlOiBNYXA8IG5hbWUsIFByb3BlcnR5TWl4ZXIgPlxuXG5cblx0XHR0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzID0gW107IC8vIHNhbWUgZ2FtZSBhcyBhYm92ZVxuXHRcdHRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzID0gMDtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR0aGlzLnN0YXRzID0ge1xuXG5cdFx0XHRhY3Rpb25zOiB7XG5cdFx0XHRcdGdldCB0b3RhbCgpIHtcblxuXHRcdFx0XHRcdHJldHVybiBzY29wZS5fYWN0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0fSxcblx0XHRcdFx0Z2V0IGluVXNlKCkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIHNjb3BlLl9uQWN0aXZlQWN0aW9ucztcblxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0YmluZGluZ3M6IHtcblx0XHRcdFx0Z2V0IHRvdGFsKCkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIHNjb3BlLl9iaW5kaW5ncy5sZW5ndGg7XG5cblx0XHRcdFx0fSxcblx0XHRcdFx0Z2V0IGluVXNlKCkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIHNjb3BlLl9uQWN0aXZlQmluZGluZ3M7XG5cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGNvbnRyb2xJbnRlcnBvbGFudHM6IHtcblx0XHRcdFx0Z2V0IHRvdGFsKCkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIHNjb3BlLl9jb250cm9sSW50ZXJwb2xhbnRzLmxlbmd0aDtcblxuXHRcdFx0XHR9LFxuXHRcdFx0XHRnZXQgaW5Vc2UoKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzO1xuXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSxcblxuXHQvLyBNZW1vcnkgbWFuYWdlbWVudCBmb3IgQW5pbWF0aW9uQWN0aW9uIG9iamVjdHNcblxuXHRfaXNBY3RpdmVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0dmFyIGluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4O1xuXHRcdHJldHVybiBpbmRleCAhPT0gbnVsbCAmJiBpbmRleCA8IHRoaXMuX25BY3RpdmVBY3Rpb25zO1xuXG5cdH0sXG5cblx0X2FkZEluYWN0aXZlQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiwgY2xpcFV1aWQsIHJvb3RVdWlkICkge1xuXG5cdFx0dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0YWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXAsXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XG5cblx0XHRpZiAoIGFjdGlvbnNGb3JDbGlwID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGFjdGlvbnNGb3JDbGlwID0ge1xuXG5cdFx0XHRcdGtub3duQWN0aW9uczogWyBhY3Rpb24gXSxcblx0XHRcdFx0YWN0aW9uQnlSb290OiB7fVxuXG5cdFx0XHR9O1xuXG5cdFx0XHRhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSAwO1xuXG5cdFx0XHRhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdID0gYWN0aW9uc0ZvckNsaXA7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIga25vd25BY3Rpb25zID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zO1xuXG5cdFx0XHRhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSBrbm93bkFjdGlvbnMubGVuZ3RoO1xuXHRcdFx0a25vd25BY3Rpb25zLnB1c2goIGFjdGlvbiApO1xuXG5cdFx0fVxuXG5cdFx0YWN0aW9uLl9jYWNoZUluZGV4ID0gYWN0aW9ucy5sZW5ndGg7XG5cdFx0YWN0aW9ucy5wdXNoKCBhY3Rpb24gKTtcblxuXHRcdGFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXSA9IGFjdGlvbjtcblxuXHR9LFxuXG5cdF9yZW1vdmVJbmFjdGl2ZUFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHR2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXG5cdFx0XHRsYXN0SW5hY3RpdmVBY3Rpb24gPSBhY3Rpb25zWyBhY3Rpb25zLmxlbmd0aCAtIDEgXSxcblx0XHRcdGNhY2hlSW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXg7XG5cblx0XHRsYXN0SW5hY3RpdmVBY3Rpb24uX2NhY2hlSW5kZXggPSBjYWNoZUluZGV4O1xuXHRcdGFjdGlvbnNbIGNhY2hlSW5kZXggXSA9IGxhc3RJbmFjdGl2ZUFjdGlvbjtcblx0XHRhY3Rpb25zLnBvcCgpO1xuXG5cdFx0YWN0aW9uLl9jYWNoZUluZGV4ID0gbnVsbDtcblxuXG5cdFx0dmFyIGNsaXBVdWlkID0gYWN0aW9uLl9jbGlwLnV1aWQsXG5cdFx0XHRhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcCxcblx0XHRcdGFjdGlvbnNGb3JDbGlwID0gYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXSxcblx0XHRcdGtub3duQWN0aW9uc0ZvckNsaXAgPSBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnMsXG5cblx0XHRcdGxhc3RLbm93bkFjdGlvbiA9XG5cdFx0XHRcdGtub3duQWN0aW9uc0ZvckNsaXBbIGtub3duQWN0aW9uc0ZvckNsaXAubGVuZ3RoIC0gMSBdLFxuXG5cdFx0XHRieUNsaXBDYWNoZUluZGV4ID0gYWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4O1xuXG5cdFx0bGFzdEtub3duQWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0gYnlDbGlwQ2FjaGVJbmRleDtcblx0XHRrbm93bkFjdGlvbnNGb3JDbGlwWyBieUNsaXBDYWNoZUluZGV4IF0gPSBsYXN0S25vd25BY3Rpb247XG5cdFx0a25vd25BY3Rpb25zRm9yQ2xpcC5wb3AoKTtcblxuXHRcdGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IG51bGw7XG5cblxuXHRcdHZhciBhY3Rpb25CeVJvb3QgPSBhY3Rpb25zRm9yQ2xpcC5hY3Rpb25CeVJvb3QsXG5cdFx0XHRyb290VXVpZCA9ICggYWN0aW9uLl9sb2NhbFJvb3QgfHwgdGhpcy5fcm9vdCApLnV1aWQ7XG5cblx0XHRkZWxldGUgYWN0aW9uQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0aWYgKCBrbm93bkFjdGlvbnNGb3JDbGlwLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdFx0ZGVsZXRlIGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XG5cblx0XHR9XG5cblx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKCBhY3Rpb24gKTtcblxuXHR9LFxuXG5cdF9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiApIHtcblxuXHRcdHZhciBiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5ncztcblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdHZhciBiaW5kaW5nID0gYmluZGluZ3NbIGkgXTtcblxuXHRcdFx0aWYgKCAtLSBiaW5kaW5nLnJlZmVyZW5jZUNvdW50ID09PSAwICkge1xuXG5cdFx0XHRcdHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZyggYmluZGluZyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRfbGVuZEFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHQvLyBbIGFjdGl2ZSBhY3Rpb25zIHwgIGluYWN0aXZlIGFjdGlvbnMgIF1cblx0XHQvLyBbICBhY3RpdmUgYWN0aW9ucyA+fCBpbmFjdGl2ZSBhY3Rpb25zIF1cblx0XHQvLyAgICAgICAgICAgICAgICAgcyAgICAgICAgYVxuXHRcdC8vICAgICAgICAgICAgICAgICAgPC1zd2FwLT5cblx0XHQvLyAgICAgICAgICAgICAgICAgYSAgICAgICAgc1xuXG5cdFx0dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0cHJldkluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4LFxuXG5cdFx0XHRsYXN0QWN0aXZlSW5kZXggPSB0aGlzLl9uQWN0aXZlQWN0aW9ucyArKyxcblxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbIGxhc3RBY3RpdmVJbmRleCBdO1xuXG5cdFx0YWN0aW9uLl9jYWNoZUluZGV4ID0gbGFzdEFjdGl2ZUluZGV4O1xuXHRcdGFjdGlvbnNbIGxhc3RBY3RpdmVJbmRleCBdID0gYWN0aW9uO1xuXG5cdFx0Zmlyc3RJbmFjdGl2ZUFjdGlvbi5fY2FjaGVJbmRleCA9IHByZXZJbmRleDtcblx0XHRhY3Rpb25zWyBwcmV2SW5kZXggXSA9IGZpcnN0SW5hY3RpdmVBY3Rpb247XG5cblx0fSxcblxuXHRfdGFrZUJhY2tBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0Ly8gWyAgYWN0aXZlIGFjdGlvbnMgIHwgaW5hY3RpdmUgYWN0aW9ucyBdXG5cdFx0Ly8gWyBhY3RpdmUgYWN0aW9ucyB8PCBpbmFjdGl2ZSBhY3Rpb25zICBdXG5cdFx0Ly8gICAgICAgIGEgICAgICAgIHNcblx0XHQvLyAgICAgICAgIDwtc3dhcC0+XG5cdFx0Ly8gICAgICAgIHMgICAgICAgIGFcblxuXHRcdHZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcblx0XHRcdHByZXZJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleCxcblxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUluZGV4ID0gLS0gdGhpcy5fbkFjdGl2ZUFjdGlvbnMsXG5cblx0XHRcdGxhc3RBY3RpdmVBY3Rpb24gPSBhY3Rpb25zWyBmaXJzdEluYWN0aXZlSW5kZXggXTtcblxuXHRcdGFjdGlvbi5fY2FjaGVJbmRleCA9IGZpcnN0SW5hY3RpdmVJbmRleDtcblx0XHRhY3Rpb25zWyBmaXJzdEluYWN0aXZlSW5kZXggXSA9IGFjdGlvbjtcblxuXHRcdGxhc3RBY3RpdmVBY3Rpb24uX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7XG5cdFx0YWN0aW9uc1sgcHJldkluZGV4IF0gPSBsYXN0QWN0aXZlQWN0aW9uO1xuXG5cdH0sXG5cblx0Ly8gTWVtb3J5IG1hbmFnZW1lbnQgZm9yIFByb3BlcnR5TWl4ZXIgb2JqZWN0c1xuXG5cdF9hZGRJbmFjdGl2ZUJpbmRpbmc6IGZ1bmN0aW9uICggYmluZGluZywgcm9vdFV1aWQsIHRyYWNrTmFtZSApIHtcblxuXHRcdHZhciBiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSxcblx0XHRcdGJpbmRpbmdCeU5hbWUgPSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXSxcblxuXHRcdFx0YmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcblxuXHRcdGlmICggYmluZGluZ0J5TmFtZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRiaW5kaW5nQnlOYW1lID0ge307XG5cdFx0XHRiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXSA9IGJpbmRpbmdCeU5hbWU7XG5cblx0XHR9XG5cblx0XHRiaW5kaW5nQnlOYW1lWyB0cmFja05hbWUgXSA9IGJpbmRpbmc7XG5cblx0XHRiaW5kaW5nLl9jYWNoZUluZGV4ID0gYmluZGluZ3MubGVuZ3RoO1xuXHRcdGJpbmRpbmdzLnB1c2goIGJpbmRpbmcgKTtcblxuXHR9LFxuXG5cdF9yZW1vdmVJbmFjdGl2ZUJpbmRpbmc6IGZ1bmN0aW9uICggYmluZGluZyApIHtcblxuXHRcdHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0cHJvcEJpbmRpbmcgPSBiaW5kaW5nLmJpbmRpbmcsXG5cdFx0XHRyb290VXVpZCA9IHByb3BCaW5kaW5nLnJvb3ROb2RlLnV1aWQsXG5cdFx0XHR0cmFja05hbWUgPSBwcm9wQmluZGluZy5wYXRoLFxuXHRcdFx0YmluZGluZ3NCeVJvb3QgPSB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsXG5cdFx0XHRiaW5kaW5nQnlOYW1lID0gYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF0sXG5cblx0XHRcdGxhc3RJbmFjdGl2ZUJpbmRpbmcgPSBiaW5kaW5nc1sgYmluZGluZ3MubGVuZ3RoIC0gMSBdLFxuXHRcdFx0Y2FjaGVJbmRleCA9IGJpbmRpbmcuX2NhY2hlSW5kZXg7XG5cblx0XHRsYXN0SW5hY3RpdmVCaW5kaW5nLl9jYWNoZUluZGV4ID0gY2FjaGVJbmRleDtcblx0XHRiaW5kaW5nc1sgY2FjaGVJbmRleCBdID0gbGFzdEluYWN0aXZlQmluZGluZztcblx0XHRiaW5kaW5ncy5wb3AoKTtcblxuXHRcdGRlbGV0ZSBiaW5kaW5nQnlOYW1lWyB0cmFja05hbWUgXTtcblxuXHRcdHJlbW92ZV9lbXB0eV9tYXA6IHtcblxuXHRcdFx0Zm9yICggdmFyIF8gaW4gYmluZGluZ0J5TmFtZSApIGJyZWFrIHJlbW92ZV9lbXB0eV9tYXA7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcblxuXHRcdFx0ZGVsZXRlIGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0X2xlbmRCaW5kaW5nOiBmdW5jdGlvbiAoIGJpbmRpbmcgKSB7XG5cblx0XHR2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdHByZXZJbmRleCA9IGJpbmRpbmcuX2NhY2hlSW5kZXgsXG5cblx0XHRcdGxhc3RBY3RpdmVJbmRleCA9IHRoaXMuX25BY3RpdmVCaW5kaW5ncyArKyxcblxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUJpbmRpbmcgPSBiaW5kaW5nc1sgbGFzdEFjdGl2ZUluZGV4IF07XG5cblx0XHRiaW5kaW5nLl9jYWNoZUluZGV4ID0gbGFzdEFjdGl2ZUluZGV4O1xuXHRcdGJpbmRpbmdzWyBsYXN0QWN0aXZlSW5kZXggXSA9IGJpbmRpbmc7XG5cblx0XHRmaXJzdEluYWN0aXZlQmluZGluZy5fY2FjaGVJbmRleCA9IHByZXZJbmRleDtcblx0XHRiaW5kaW5nc1sgcHJldkluZGV4IF0gPSBmaXJzdEluYWN0aXZlQmluZGluZztcblxuXHR9LFxuXG5cdF90YWtlQmFja0JpbmRpbmc6IGZ1bmN0aW9uICggYmluZGluZyApIHtcblxuXHRcdHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0cHJldkluZGV4ID0gYmluZGluZy5fY2FjaGVJbmRleCxcblxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUluZGV4ID0gLS0gdGhpcy5fbkFjdGl2ZUJpbmRpbmdzLFxuXG5cdFx0XHRsYXN0QWN0aXZlQmluZGluZyA9IGJpbmRpbmdzWyBmaXJzdEluYWN0aXZlSW5kZXggXTtcblxuXHRcdGJpbmRpbmcuX2NhY2hlSW5kZXggPSBmaXJzdEluYWN0aXZlSW5kZXg7XG5cdFx0YmluZGluZ3NbIGZpcnN0SW5hY3RpdmVJbmRleCBdID0gYmluZGluZztcblxuXHRcdGxhc3RBY3RpdmVCaW5kaW5nLl9jYWNoZUluZGV4ID0gcHJldkluZGV4O1xuXHRcdGJpbmRpbmdzWyBwcmV2SW5kZXggXSA9IGxhc3RBY3RpdmVCaW5kaW5nO1xuXG5cdH0sXG5cblxuXHQvLyBNZW1vcnkgbWFuYWdlbWVudCBvZiBJbnRlcnBvbGFudHMgZm9yIHdlaWdodCBhbmQgdGltZSBzY2FsZVxuXG5cdF9sZW5kQ29udHJvbEludGVycG9sYW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaW50ZXJwb2xhbnRzID0gdGhpcy5fY29udHJvbEludGVycG9sYW50cyxcblx0XHRcdGxhc3RBY3RpdmVJbmRleCA9IHRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzICsrLFxuXHRcdFx0aW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudHNbIGxhc3RBY3RpdmVJbmRleCBdO1xuXG5cdFx0aWYgKCBpbnRlcnBvbGFudCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRpbnRlcnBvbGFudCA9IG5ldyBMaW5lYXJJbnRlcnBvbGFudChcblx0XHRcdFx0bmV3IEZsb2F0MzJBcnJheSggMiApLCBuZXcgRmxvYXQzMkFycmF5KCAyICksXG5cdFx0XHRcdDEsIHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXIgKTtcblxuXHRcdFx0aW50ZXJwb2xhbnQuX19jYWNoZUluZGV4ID0gbGFzdEFjdGl2ZUluZGV4O1xuXHRcdFx0aW50ZXJwb2xhbnRzWyBsYXN0QWN0aXZlSW5kZXggXSA9IGludGVycG9sYW50O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGludGVycG9sYW50O1xuXG5cdH0sXG5cblx0X3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50OiBmdW5jdGlvbiAoIGludGVycG9sYW50ICkge1xuXG5cdFx0dmFyIGludGVycG9sYW50cyA9IHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsXG5cdFx0XHRwcmV2SW5kZXggPSBpbnRlcnBvbGFudC5fX2NhY2hlSW5kZXgsXG5cblx0XHRcdGZpcnN0SW5hY3RpdmVJbmRleCA9IC0tIHRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzLFxuXG5cdFx0XHRsYXN0QWN0aXZlSW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudHNbIGZpcnN0SW5hY3RpdmVJbmRleCBdO1xuXG5cdFx0aW50ZXJwb2xhbnQuX19jYWNoZUluZGV4ID0gZmlyc3RJbmFjdGl2ZUluZGV4O1xuXHRcdGludGVycG9sYW50c1sgZmlyc3RJbmFjdGl2ZUluZGV4IF0gPSBpbnRlcnBvbGFudDtcblxuXHRcdGxhc3RBY3RpdmVJbnRlcnBvbGFudC5fX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7XG5cdFx0aW50ZXJwb2xhbnRzWyBwcmV2SW5kZXggXSA9IGxhc3RBY3RpdmVJbnRlcnBvbGFudDtcblxuXHR9LFxuXG5cdF9jb250cm9sSW50ZXJwb2xhbnRzUmVzdWx0QnVmZmVyOiBuZXcgRmxvYXQzMkFycmF5KCAxICksXG5cblx0Ly8gcmV0dXJuIGFuIGFjdGlvbiBmb3IgYSBjbGlwIG9wdGlvbmFsbHkgdXNpbmcgYSBjdXN0b20gcm9vdCB0YXJnZXRcblx0Ly8gb2JqZWN0ICh0aGlzIG1ldGhvZCBhbGxvY2F0ZXMgYSBsb3Qgb2YgZHluYW1pYyBtZW1vcnkgaW4gY2FzZSBhXG5cdC8vIHByZXZpb3VzbHkgdW5rbm93biBjbGlwL3Jvb3QgY29tYmluYXRpb24gaXMgc3BlY2lmaWVkKVxuXHRjbGlwQWN0aW9uOiBmdW5jdGlvbiAoIGNsaXAsIG9wdGlvbmFsUm9vdCApIHtcblxuXHRcdHZhciByb290ID0gb3B0aW9uYWxSb290IHx8IHRoaXMuX3Jvb3QsXG5cdFx0XHRyb290VXVpZCA9IHJvb3QudXVpZCxcblxuXHRcdFx0Y2xpcE9iamVjdCA9IHR5cGVvZiBjbGlwID09PSAnc3RyaW5nJyA/XG5cdFx0XHRcdEFuaW1hdGlvbkNsaXAuZmluZEJ5TmFtZSggcm9vdCwgY2xpcCApIDogY2xpcCxcblxuXHRcdFx0Y2xpcFV1aWQgPSBjbGlwT2JqZWN0ICE9PSBudWxsID8gY2xpcE9iamVjdC51dWlkIDogY2xpcCxcblxuXHRcdFx0YWN0aW9uc0ZvckNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdLFxuXHRcdFx0cHJvdG90eXBlQWN0aW9uID0gbnVsbDtcblxuXHRcdGlmICggYWN0aW9uc0ZvckNsaXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIGV4aXN0aW5nQWN0aW9uID1cblx0XHRcdFx0XHRhY3Rpb25zRm9yQ2xpcC5hY3Rpb25CeVJvb3RbIHJvb3RVdWlkIF07XG5cblx0XHRcdGlmICggZXhpc3RpbmdBY3Rpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gZXhpc3RpbmdBY3Rpb247XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gd2Uga25vdyB0aGUgY2xpcCwgc28gd2UgZG9uJ3QgaGF2ZSB0byBwYXJzZSBhbGxcblx0XHRcdC8vIHRoZSBiaW5kaW5ncyBhZ2FpbiBidXQgY2FuIGp1c3QgY29weVxuXHRcdFx0cHJvdG90eXBlQWN0aW9uID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zWyAwIF07XG5cblx0XHRcdC8vIGFsc28sIHRha2UgdGhlIGNsaXAgZnJvbSB0aGUgcHJvdG90eXBlIGFjdGlvblxuXHRcdFx0aWYgKCBjbGlwT2JqZWN0ID09PSBudWxsIClcblx0XHRcdFx0Y2xpcE9iamVjdCA9IHByb3RvdHlwZUFjdGlvbi5fY2xpcDtcblxuXHRcdH1cblxuXHRcdC8vIGNsaXAgbXVzdCBiZSBrbm93biB3aGVuIHNwZWNpZmllZCB2aWEgc3RyaW5nXG5cdFx0aWYgKCBjbGlwT2JqZWN0ID09PSBudWxsICkgcmV0dXJuIG51bGw7XG5cblx0XHQvLyBhbGxvY2F0ZSBhbGwgcmVzb3VyY2VzIHJlcXVpcmVkIHRvIHJ1biBpdFxuXHRcdHZhciBuZXdBY3Rpb24gPSBuZXcgQW5pbWF0aW9uQWN0aW9uKCB0aGlzLCBjbGlwT2JqZWN0LCBvcHRpb25hbFJvb3QgKTtcblxuXHRcdHRoaXMuX2JpbmRBY3Rpb24oIG5ld0FjdGlvbiwgcHJvdG90eXBlQWN0aW9uICk7XG5cblx0XHQvLyBhbmQgbWFrZSB0aGUgYWN0aW9uIGtub3duIHRvIHRoZSBtZW1vcnkgbWFuYWdlclxuXHRcdHRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKCBuZXdBY3Rpb24sIGNsaXBVdWlkLCByb290VXVpZCApO1xuXG5cdFx0cmV0dXJuIG5ld0FjdGlvbjtcblxuXHR9LFxuXG5cdC8vIGdldCBhbiBleGlzdGluZyBhY3Rpb25cblx0ZXhpc3RpbmdBY3Rpb246IGZ1bmN0aW9uICggY2xpcCwgb3B0aW9uYWxSb290ICkge1xuXG5cdFx0dmFyIHJvb3QgPSBvcHRpb25hbFJvb3QgfHwgdGhpcy5fcm9vdCxcblx0XHRcdHJvb3RVdWlkID0gcm9vdC51dWlkLFxuXG5cdFx0XHRjbGlwT2JqZWN0ID0gdHlwZW9mIGNsaXAgPT09ICdzdHJpbmcnID9cblx0XHRcdFx0QW5pbWF0aW9uQ2xpcC5maW5kQnlOYW1lKCByb290LCBjbGlwICkgOiBjbGlwLFxuXG5cdFx0XHRjbGlwVXVpZCA9IGNsaXBPYmplY3QgPyBjbGlwT2JqZWN0LnV1aWQgOiBjbGlwLFxuXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XG5cblx0XHRpZiAoIGFjdGlvbnNGb3JDbGlwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHJldHVybiBhY3Rpb25zRm9yQ2xpcC5hY3Rpb25CeVJvb3RbIHJvb3RVdWlkIF0gfHwgbnVsbDtcblxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXG5cdH0sXG5cblx0Ly8gZGVhY3RpdmF0ZXMgYWxsIHByZXZpb3VzbHkgc2NoZWR1bGVkIGFjdGlvbnNcblx0c3RvcEFsbEFjdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0bkFjdGlvbnMgPSB0aGlzLl9uQWN0aXZlQWN0aW9ucyxcblx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRuQmluZGluZ3MgPSB0aGlzLl9uQWN0aXZlQmluZGluZ3M7XG5cblx0XHR0aGlzLl9uQWN0aXZlQWN0aW9ucyA9IDA7XG5cdFx0dGhpcy5fbkFjdGl2ZUJpbmRpbmdzID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbkFjdGlvbnM7ICsrIGkgKSB7XG5cblx0XHRcdGFjdGlvbnNbIGkgXS5yZXNldCgpO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuQmluZGluZ3M7ICsrIGkgKSB7XG5cblx0XHRcdGJpbmRpbmdzWyBpIF0udXNlQ291bnQgPSAwO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyBhZHZhbmNlIHRoZSB0aW1lIGFuZCB1cGRhdGUgYXBwbHkgdGhlIGFuaW1hdGlvblxuXHR1cGRhdGU6IGZ1bmN0aW9uICggZGVsdGFUaW1lICkge1xuXG5cdFx0ZGVsdGFUaW1lICo9IHRoaXMudGltZVNjYWxlO1xuXG5cdFx0dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0bkFjdGlvbnMgPSB0aGlzLl9uQWN0aXZlQWN0aW9ucyxcblxuXHRcdFx0dGltZSA9IHRoaXMudGltZSArPSBkZWx0YVRpbWUsXG5cdFx0XHR0aW1lRGlyZWN0aW9uID0gTWF0aC5zaWduKCBkZWx0YVRpbWUgKSxcblxuXHRcdFx0YWNjdUluZGV4ID0gdGhpcy5fYWNjdUluZGV4IF49IDE7XG5cblx0XHQvLyBydW4gYWN0aXZlIGFjdGlvbnNcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbkFjdGlvbnM7ICsrIGkgKSB7XG5cblx0XHRcdHZhciBhY3Rpb24gPSBhY3Rpb25zWyBpIF07XG5cblx0XHRcdGFjdGlvbi5fdXBkYXRlKCB0aW1lLCBkZWx0YVRpbWUsIHRpbWVEaXJlY3Rpb24sIGFjY3VJbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXBkYXRlIHNjZW5lIGdyYXBoXG5cblx0XHR2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdG5CaW5kaW5ncyA9IHRoaXMuX25BY3RpdmVCaW5kaW5ncztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbkJpbmRpbmdzOyArKyBpICkge1xuXG5cdFx0XHRiaW5kaW5nc1sgaSBdLmFwcGx5KCBhY2N1SW5kZXggKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gcmV0dXJuIHRoaXMgbWl4ZXIncyByb290IHRhcmdldCBvYmplY3Rcblx0Z2V0Um9vdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3Jvb3Q7XG5cblx0fSxcblxuXHQvLyBmcmVlIGFsbCByZXNvdXJjZXMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIGNsaXBcblx0dW5jYWNoZUNsaXA6IGZ1bmN0aW9uICggY2xpcCApIHtcblxuXHRcdHZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcblx0XHRcdGNsaXBVdWlkID0gY2xpcC51dWlkLFxuXHRcdFx0YWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXAsXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XG5cblx0XHRpZiAoIGFjdGlvbnNGb3JDbGlwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIG5vdGU6IGp1c3QgY2FsbGluZyBfcmVtb3ZlSW5hY3RpdmVBY3Rpb24gd291bGQgbWVzcyB1cCB0aGVcblx0XHRcdC8vIGl0ZXJhdGlvbiBzdGF0ZSBhbmQgYWxzbyByZXF1aXJlIHVwZGF0aW5nIHRoZSBzdGF0ZSB3ZSBjYW5cblx0XHRcdC8vIGp1c3QgdGhyb3cgYXdheVxuXG5cdFx0XHR2YXIgYWN0aW9uc1RvUmVtb3ZlID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBhY3Rpb25zVG9SZW1vdmUubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdHZhciBhY3Rpb24gPSBhY3Rpb25zVG9SZW1vdmVbIGkgXTtcblxuXHRcdFx0XHR0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKCBhY3Rpb24gKTtcblxuXHRcdFx0XHR2YXIgY2FjaGVJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleCxcblx0XHRcdFx0XHRsYXN0SW5hY3RpdmVBY3Rpb24gPSBhY3Rpb25zWyBhY3Rpb25zLmxlbmd0aCAtIDEgXTtcblxuXHRcdFx0XHRhY3Rpb24uX2NhY2hlSW5kZXggPSBudWxsO1xuXHRcdFx0XHRhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSBudWxsO1xuXG5cdFx0XHRcdGxhc3RJbmFjdGl2ZUFjdGlvbi5fY2FjaGVJbmRleCA9IGNhY2hlSW5kZXg7XG5cdFx0XHRcdGFjdGlvbnNbIGNhY2hlSW5kZXggXSA9IGxhc3RJbmFjdGl2ZUFjdGlvbjtcblx0XHRcdFx0YWN0aW9ucy5wb3AoKTtcblxuXHRcdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKCBhY3Rpb24gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRkZWxldGUgYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdC8vIGZyZWUgYWxsIHJlc291cmNlcyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgcm9vdCB0YXJnZXQgb2JqZWN0XG5cdHVuY2FjaGVSb290OiBmdW5jdGlvbiAoIHJvb3QgKSB7XG5cblx0XHR2YXIgcm9vdFV1aWQgPSByb290LnV1aWQsXG5cdFx0XHRhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcDtcblxuXHRcdGZvciAoIHZhciBjbGlwVXVpZCBpbiBhY3Rpb25zQnlDbGlwICkge1xuXG5cdFx0XHR2YXIgYWN0aW9uQnlSb290ID0gYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXS5hY3Rpb25CeVJvb3QsXG5cdFx0XHRcdGFjdGlvbiA9IGFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXTtcblxuXHRcdFx0aWYgKCBhY3Rpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKCBhY3Rpb24gKTtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVBY3Rpb24oIGFjdGlvbiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgYmluZGluZ3NCeVJvb3QgPSB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsXG5cdFx0XHRiaW5kaW5nQnlOYW1lID0gYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF07XG5cblx0XHRpZiAoIGJpbmRpbmdCeU5hbWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Zm9yICggdmFyIHRyYWNrTmFtZSBpbiBiaW5kaW5nQnlOYW1lICkge1xuXG5cdFx0XHRcdHZhciBiaW5kaW5nID0gYmluZGluZ0J5TmFtZVsgdHJhY2tOYW1lIF07XG5cdFx0XHRcdGJpbmRpbmcucmVzdG9yZU9yaWdpbmFsU3RhdGUoKTtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdC8vIHJlbW92ZSBhIHRhcmdldGVkIGNsaXAgZnJvbSB0aGUgY2FjaGVcblx0dW5jYWNoZUFjdGlvbjogZnVuY3Rpb24gKCBjbGlwLCBvcHRpb25hbFJvb3QgKSB7XG5cblx0XHR2YXIgYWN0aW9uID0gdGhpcy5leGlzdGluZ0FjdGlvbiggY2xpcCwgb3B0aW9uYWxSb290ICk7XG5cblx0XHRpZiAoIGFjdGlvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5fZGVhY3RpdmF0ZUFjdGlvbiggYWN0aW9uICk7XG5cdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUFjdGlvbiggYWN0aW9uICk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBVbmlmb3JtKCB2YWx1ZSApIHtcblxuXHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Vbmlmb3JtOiBUeXBlIHBhcmFtZXRlciBpcyBubyBsb25nZXIgbmVlZGVkLicgKTtcblx0XHR2YWx1ZSA9IGFyZ3VtZW50c1sgMSBdO1xuXG5cdH1cblxuXHR0aGlzLnZhbHVlID0gdmFsdWU7XG5cbn1cblxuVW5pZm9ybS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG5cblx0cmV0dXJuIG5ldyBVbmlmb3JtKCB0aGlzLnZhbHVlLmNsb25lID09PSB1bmRlZmluZWQgPyB0aGlzLnZhbHVlIDogdGhpcy52YWx1ZS5jbG9uZSgpICk7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zXG4gKi9cblxuZnVuY3Rpb24gSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkoKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSc7XG5cdHRoaXMubWF4SW5zdGFuY2VkQ291bnQgPSB1bmRlZmluZWQ7XG5cbn1cblxuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnksXG5cblx0aXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeTogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5tYXhJbnN0YW5jZWRDb3VudCA9IHNvdXJjZS5tYXhJbnN0YW5jZWRDb3VudDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXNcbiAqL1xuXG5mdW5jdGlvbiBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSggaW50ZXJsZWF2ZWRCdWZmZXIsIGl0ZW1TaXplLCBvZmZzZXQsIG5vcm1hbGl6ZWQgKSB7XG5cblx0dGhpcy5kYXRhID0gaW50ZXJsZWF2ZWRCdWZmZXI7XG5cdHRoaXMuaXRlbVNpemUgPSBpdGVtU2l6ZTtcblx0dGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG5cblx0dGhpcy5ub3JtYWxpemVkID0gbm9ybWFsaXplZCA9PT0gdHJ1ZTtcblxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLCB7XG5cblx0Y291bnQ6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5kYXRhLmNvdW50O1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0YXJyYXk6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5O1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUsIHtcblxuXHRpc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlOiB0cnVlLFxuXG5cdHNldFg6IGZ1bmN0aW9uICggaW5kZXgsIHggKSB7XG5cblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0IF0gPSB4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRZOiBmdW5jdGlvbiAoIGluZGV4LCB5ICkge1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDEgXSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFo6IGZ1bmN0aW9uICggaW5kZXgsIHogKSB7XG5cblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMiBdID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0VzogZnVuY3Rpb24gKCBpbmRleCwgdyApIHtcblxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAzIF0gPSB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRYOiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgXTtcblxuXHR9LFxuXG5cdGdldFk6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDEgXTtcblxuXHR9LFxuXG5cdGdldFo6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDIgXTtcblxuXHR9LFxuXG5cdGdldFc6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDMgXTtcblxuXHR9LFxuXG5cdHNldFhZOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5ICkge1xuXG5cdFx0aW5kZXggPSBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldDtcblxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAwIF0gPSB4O1xuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYWVo6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHksIHogKSB7XG5cblx0XHRpbmRleCA9IGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0O1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDIgXSA9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFhZWlc6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHksIHosIHcgKSB7XG5cblx0XHRpbmRleCA9IGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0O1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDIgXSA9IHo7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDMgXSA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXNcbiAqL1xuXG5mdW5jdGlvbiBJbnRlcmxlYXZlZEJ1ZmZlciggYXJyYXksIHN0cmlkZSApIHtcblxuXHR0aGlzLmFycmF5ID0gYXJyYXk7XG5cdHRoaXMuc3RyaWRlID0gc3RyaWRlO1xuXHR0aGlzLmNvdW50ID0gYXJyYXkgIT09IHVuZGVmaW5lZCA/IGFycmF5Lmxlbmd0aCAvIHN0cmlkZSA6IDA7XG5cblx0dGhpcy5keW5hbWljID0gZmFsc2U7XG5cdHRoaXMudXBkYXRlUmFuZ2UgPSB7IG9mZnNldDogMCwgY291bnQ6IC0gMSB9O1xuXG5cdHRoaXMudmVyc2lvbiA9IDA7XG5cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KCBJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUsICduZWVkc1VwZGF0ZScsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHZhbHVlID09PSB0cnVlICkgdGhpcy52ZXJzaW9uICsrO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUsIHtcblxuXHRpc0ludGVybGVhdmVkQnVmZmVyOiB0cnVlLFxuXG5cdG9uVXBsb2FkQ2FsbGJhY2s6IGZ1bmN0aW9uICgpIHt9LFxuXG5cdHNldEFycmF5OiBmdW5jdGlvbiAoIGFycmF5ICkge1xuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCBhcnJheSApICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4nICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmNvdW50ID0gYXJyYXkgIT09IHVuZGVmaW5lZCA/IGFycmF5Lmxlbmd0aCAvIHRoaXMuc3RyaWRlIDogMDtcblx0XHR0aGlzLmFycmF5ID0gYXJyYXk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldER5bmFtaWM6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmR5bmFtaWMgPSB2YWx1ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLmFycmF5ID0gbmV3IHNvdXJjZS5hcnJheS5jb25zdHJ1Y3Rvciggc291cmNlLmFycmF5ICk7XG5cdFx0dGhpcy5jb3VudCA9IHNvdXJjZS5jb3VudDtcblx0XHR0aGlzLnN0cmlkZSA9IHNvdXJjZS5zdHJpZGU7XG5cdFx0dGhpcy5keW5hbWljID0gc291cmNlLmR5bmFtaWM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlBdDogZnVuY3Rpb24gKCBpbmRleDEsIGF0dHJpYnV0ZSwgaW5kZXgyICkge1xuXG5cdFx0aW5kZXgxICo9IHRoaXMuc3RyaWRlO1xuXHRcdGluZGV4MiAqPSBhdHRyaWJ1dGUuc3RyaWRlO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5zdHJpZGU7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmFycmF5WyBpbmRleDEgKyBpIF0gPSBhdHRyaWJ1dGUuYXJyYXlbIGluZGV4MiArIGkgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlLCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHRoaXMuYXJyYXkuc2V0KCB2YWx1ZSwgb2Zmc2V0ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRvblVwbG9hZDogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdHRoaXMub25VcGxvYWRDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zXG4gKi9cblxuZnVuY3Rpb24gSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIoIGFycmF5LCBzdHJpZGUsIG1lc2hQZXJBdHRyaWJ1dGUgKSB7XG5cblx0SW50ZXJsZWF2ZWRCdWZmZXIuY2FsbCggdGhpcywgYXJyYXksIHN0cmlkZSApO1xuXG5cdHRoaXMubWVzaFBlckF0dHJpYnV0ZSA9IG1lc2hQZXJBdHRyaWJ1dGUgfHwgMTtcblxufVxuXG5JbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcixcblxuXHRpc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0SW50ZXJsZWF2ZWRCdWZmZXIucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSBzb3VyY2UubWVzaFBlckF0dHJpYnV0ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtc1xuICovXG5cbmZ1bmN0aW9uIEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBtZXNoUGVyQXR0cmlidXRlICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBhcnJheSwgaXRlbVNpemUgKTtcblxuXHR0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSBtZXNoUGVyQXR0cmlidXRlIHx8IDE7XG5cbn1cblxuSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUsXG5cblx0aXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSBzb3VyY2UubWVzaFBlckF0dHJpYnV0ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBzdGVwaG9taSAvIGh0dHA6Ly9zdGVwaGFuZWdpbmllci5jb20vXG4gKi9cblxuZnVuY3Rpb24gUmF5Y2FzdGVyKCBvcmlnaW4sIGRpcmVjdGlvbiwgbmVhciwgZmFyICkge1xuXG5cdHRoaXMucmF5ID0gbmV3IFJheSggb3JpZ2luLCBkaXJlY3Rpb24gKTtcblx0Ly8gZGlyZWN0aW9uIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZCAoZm9yIGFjY3VyYXRlIGRpc3RhbmNlIGNhbGN1bGF0aW9ucylcblxuXHR0aGlzLm5lYXIgPSBuZWFyIHx8IDA7XG5cdHRoaXMuZmFyID0gZmFyIHx8IEluZmluaXR5O1xuXG5cdHRoaXMucGFyYW1zID0ge1xuXHRcdE1lc2g6IHt9LFxuXHRcdExpbmU6IHt9LFxuXHRcdExPRDoge30sXG5cdFx0UG9pbnRzOiB7IHRocmVzaG9sZDogMSB9LFxuXHRcdFNwcml0ZToge31cblx0fTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyggdGhpcy5wYXJhbXMsIHtcblx0XHRQb2ludENsb3VkOiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXljYXN0ZXI6IHBhcmFtcy5Qb2ludENsb3VkIGhhcyBiZWVuIHJlbmFtZWQgdG8gcGFyYW1zLlBvaW50cy4nICk7XG5cdFx0XHRcdHJldHVybiB0aGlzLlBvaW50cztcblxuXHRcdFx0fVxuXHRcdH1cblx0fSApO1xuXG59XG5cbmZ1bmN0aW9uIGFzY1NvcnQoIGEsIGIgKSB7XG5cblx0cmV0dXJuIGEuZGlzdGFuY2UgLSBiLmRpc3RhbmNlO1xuXG59XG5cbmZ1bmN0aW9uIGludGVyc2VjdE9iamVjdCggb2JqZWN0LCByYXljYXN0ZXIsIGludGVyc2VjdHMsIHJlY3Vyc2l2ZSApIHtcblxuXHRpZiAoIG9iamVjdC52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjtcblxuXHRvYmplY3QucmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICk7XG5cblx0aWYgKCByZWN1cnNpdmUgPT09IHRydWUgKSB7XG5cblx0XHR2YXIgY2hpbGRyZW4gPSBvYmplY3QuY2hpbGRyZW47XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRpbnRlcnNlY3RPYmplY3QoIGNoaWxkcmVuWyBpIF0sIHJheWNhc3RlciwgaW50ZXJzZWN0cywgdHJ1ZSApO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5PYmplY3QuYXNzaWduKCBSYXljYXN0ZXIucHJvdG90eXBlLCB7XG5cblx0bGluZVByZWNpc2lvbjogMSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggb3JpZ2luLCBkaXJlY3Rpb24gKSB7XG5cblx0XHQvLyBkaXJlY3Rpb24gaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkIChmb3IgYWNjdXJhdGUgZGlzdGFuY2UgY2FsY3VsYXRpb25zKVxuXG5cdFx0dGhpcy5yYXkuc2V0KCBvcmlnaW4sIGRpcmVjdGlvbiApO1xuXG5cdH0sXG5cblx0c2V0RnJvbUNhbWVyYTogZnVuY3Rpb24gKCBjb29yZHMsIGNhbWVyYSApIHtcblxuXHRcdGlmICggKCBjYW1lcmEgJiYgY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEgKSApIHtcblxuXHRcdFx0dGhpcy5yYXkub3JpZ2luLnNldEZyb21NYXRyaXhQb3NpdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICk7XG5cdFx0XHR0aGlzLnJheS5kaXJlY3Rpb24uc2V0KCBjb29yZHMueCwgY29vcmRzLnksIDAuNSApLnVucHJvamVjdCggY2FtZXJhICkuc3ViKCB0aGlzLnJheS5vcmlnaW4gKS5ub3JtYWxpemUoKTtcblxuXHRcdH0gZWxzZSBpZiAoICggY2FtZXJhICYmIGNhbWVyYS5pc09ydGhvZ3JhcGhpY0NhbWVyYSApICkge1xuXG5cdFx0XHR0aGlzLnJheS5vcmlnaW4uc2V0KCBjb29yZHMueCwgY29vcmRzLnksICggY2FtZXJhLm5lYXIgKyBjYW1lcmEuZmFyICkgLyAoIGNhbWVyYS5uZWFyIC0gY2FtZXJhLmZhciApICkudW5wcm9qZWN0KCBjYW1lcmEgKTsgLy8gc2V0IG9yaWdpbiBpbiBwbGFuZSBvZiBjYW1lcmFcblx0XHRcdHRoaXMucmF5LmRpcmVjdGlvbi5zZXQoIDAsIDAsIC0gMSApLnRyYW5zZm9ybURpcmVjdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUmF5Y2FzdGVyOiBVbnN1cHBvcnRlZCBjYW1lcmEgdHlwZS4nICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRpbnRlcnNlY3RPYmplY3Q6IGZ1bmN0aW9uICggb2JqZWN0LCByZWN1cnNpdmUsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0dmFyIGludGVyc2VjdHMgPSBvcHRpb25hbFRhcmdldCB8fCBbXTtcblxuXHRcdGludGVyc2VjdE9iamVjdCggb2JqZWN0LCB0aGlzLCBpbnRlcnNlY3RzLCByZWN1cnNpdmUgKTtcblxuXHRcdGludGVyc2VjdHMuc29ydCggYXNjU29ydCApO1xuXG5cdFx0cmV0dXJuIGludGVyc2VjdHM7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RPYmplY3RzOiBmdW5jdGlvbiAoIG9iamVjdHMsIHJlY3Vyc2l2ZSwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHR2YXIgaW50ZXJzZWN0cyA9IG9wdGlvbmFsVGFyZ2V0IHx8IFtdO1xuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCBvYmplY3RzICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0czogb2JqZWN0cyBpcyBub3QgYW4gQXJyYXkuJyApO1xuXHRcdFx0cmV0dXJuIGludGVyc2VjdHM7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBvYmplY3RzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGludGVyc2VjdE9iamVjdCggb2JqZWN0c1sgaSBdLCB0aGlzLCBpbnRlcnNlY3RzLCByZWN1cnNpdmUgKTtcblxuXHRcdH1cblxuXHRcdGludGVyc2VjdHMuc29ydCggYXNjU29ydCApO1xuXG5cdFx0cmV0dXJuIGludGVyc2VjdHM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBDbG9jayggYXV0b1N0YXJ0ICkge1xuXG5cdHRoaXMuYXV0b1N0YXJ0ID0gKCBhdXRvU3RhcnQgIT09IHVuZGVmaW5lZCApID8gYXV0b1N0YXJ0IDogdHJ1ZTtcblxuXHR0aGlzLnN0YXJ0VGltZSA9IDA7XG5cdHRoaXMub2xkVGltZSA9IDA7XG5cdHRoaXMuZWxhcHNlZFRpbWUgPSAwO1xuXG5cdHRoaXMucnVubmluZyA9IGZhbHNlO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIENsb2NrLnByb3RvdHlwZSwge1xuXG5cdHN0YXJ0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnN0YXJ0VGltZSA9ICggdHlwZW9mIHBlcmZvcm1hbmNlID09PSAndW5kZWZpbmVkJyA/IERhdGUgOiBwZXJmb3JtYW5jZSApLm5vdygpOyAvLyBzZWUgIzEwNzMyXG5cblx0XHR0aGlzLm9sZFRpbWUgPSB0aGlzLnN0YXJ0VGltZTtcblx0XHR0aGlzLmVsYXBzZWRUaW1lID0gMDtcblx0XHR0aGlzLnJ1bm5pbmcgPSB0cnVlO1xuXG5cdH0sXG5cblx0c3RvcDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5nZXRFbGFwc2VkVGltZSgpO1xuXHRcdHRoaXMucnVubmluZyA9IGZhbHNlO1xuXHRcdHRoaXMuYXV0b1N0YXJ0ID0gZmFsc2U7XG5cblx0fSxcblxuXHRnZXRFbGFwc2VkVGltZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5nZXREZWx0YSgpO1xuXHRcdHJldHVybiB0aGlzLmVsYXBzZWRUaW1lO1xuXG5cdH0sXG5cblx0Z2V0RGVsdGE6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBkaWZmID0gMDtcblxuXHRcdGlmICggdGhpcy5hdXRvU3RhcnQgJiYgISB0aGlzLnJ1bm5pbmcgKSB7XG5cblx0XHRcdHRoaXMuc3RhcnQoKTtcblx0XHRcdHJldHVybiAwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLnJ1bm5pbmcgKSB7XG5cblx0XHRcdHZhciBuZXdUaW1lID0gKCB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICd1bmRlZmluZWQnID8gRGF0ZSA6IHBlcmZvcm1hbmNlICkubm93KCk7XG5cblx0XHRcdGRpZmYgPSAoIG5ld1RpbWUgLSB0aGlzLm9sZFRpbWUgKSAvIDEwMDA7XG5cdFx0XHR0aGlzLm9sZFRpbWUgPSBuZXdUaW1lO1xuXG5cdFx0XHR0aGlzLmVsYXBzZWRUaW1lICs9IGRpZmY7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZGlmZjtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqXG4gKiBSZWY6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NwaGVyaWNhbF9jb29yZGluYXRlX3N5c3RlbVxuICpcbiAqIFRoZSBwb2xlcyAocGhpKSBhcmUgYXQgdGhlIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSB5IGF4aXMuXG4gKiBUaGUgZXF1YXRvciBzdGFydHMgYXQgcG9zaXRpdmUgei5cbiAqL1xuXG5mdW5jdGlvbiBTcGhlcmljYWwoIHJhZGl1cywgcGhpLCB0aGV0YSApIHtcblxuXHR0aGlzLnJhZGl1cyA9ICggcmFkaXVzICE9PSB1bmRlZmluZWQgKSA/IHJhZGl1cyA6IDEuMDtcblx0dGhpcy5waGkgPSAoIHBoaSAhPT0gdW5kZWZpbmVkICkgPyBwaGkgOiAwOyAvLyB1cCAvIGRvd24gdG93YXJkcyB0b3AgYW5kIGJvdHRvbSBwb2xlXG5cdHRoaXMudGhldGEgPSAoIHRoZXRhICE9PSB1bmRlZmluZWQgKSA/IHRoZXRhIDogMDsgLy8gYXJvdW5kIHRoZSBlcXVhdG9yIG9mIHRoZSBzcGhlcmVcblxuXHRyZXR1cm4gdGhpcztcblxufVxuXG5PYmplY3QuYXNzaWduKCBTcGhlcmljYWwucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHJhZGl1cywgcGhpLCB0aGV0YSApIHtcblxuXHRcdHRoaXMucmFkaXVzID0gcmFkaXVzO1xuXHRcdHRoaXMucGhpID0gcGhpO1xuXHRcdHRoaXMudGhldGEgPSB0aGV0YTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggb3RoZXIgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IG90aGVyLnJhZGl1cztcblx0XHR0aGlzLnBoaSA9IG90aGVyLnBoaTtcblx0XHR0aGlzLnRoZXRhID0gb3RoZXIudGhldGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIHJlc3RyaWN0IHBoaSB0byBiZSBiZXR3ZWUgRVBTIGFuZCBQSS1FUFNcblx0bWFrZVNhZmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBFUFMgPSAwLjAwMDAwMTtcblx0XHR0aGlzLnBoaSA9IE1hdGgubWF4KCBFUFMsIE1hdGgubWluKCBNYXRoLlBJIC0gRVBTLCB0aGlzLnBoaSApICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21WZWN0b3IzOiBmdW5jdGlvbiAoIHZlYzMgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IHZlYzMubGVuZ3RoKCk7XG5cblx0XHRpZiAoIHRoaXMucmFkaXVzID09PSAwICkge1xuXG5cdFx0XHR0aGlzLnRoZXRhID0gMDtcblx0XHRcdHRoaXMucGhpID0gMDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMudGhldGEgPSBNYXRoLmF0YW4yKCB2ZWMzLngsIHZlYzMueiApOyAvLyBlcXVhdG9yIGFuZ2xlIGFyb3VuZCB5LXVwIGF4aXNcblx0XHRcdHRoaXMucGhpID0gTWF0aC5hY29zKCBfTWF0aC5jbGFtcCggdmVjMy55IC8gdGhpcy5yYWRpdXMsIC0gMSwgMSApICk7IC8vIHBvbGFyIGFuZ2xlXG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICpcbiAqIFJlZjogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ3lsaW5kcmljYWxfY29vcmRpbmF0ZV9zeXN0ZW1cbiAqXG4gKi9cblxuZnVuY3Rpb24gQ3lsaW5kcmljYWwoIHJhZGl1cywgdGhldGEsIHkgKSB7XG5cblx0dGhpcy5yYWRpdXMgPSAoIHJhZGl1cyAhPT0gdW5kZWZpbmVkICkgPyByYWRpdXMgOiAxLjA7IC8vIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbiB0byBhIHBvaW50IGluIHRoZSB4LXogcGxhbmVcblx0dGhpcy50aGV0YSA9ICggdGhldGEgIT09IHVuZGVmaW5lZCApID8gdGhldGEgOiAwOyAvLyBjb3VudGVyY2xvY2t3aXNlIGFuZ2xlIGluIHRoZSB4LXogcGxhbmUgbWVhc3VyZWQgaW4gcmFkaWFucyBmcm9tIHRoZSBwb3NpdGl2ZSB6LWF4aXNcblx0dGhpcy55ID0gKCB5ICE9PSB1bmRlZmluZWQgKSA/IHkgOiAwOyAvLyBoZWlnaHQgYWJvdmUgdGhlIHgteiBwbGFuZVxuXG5cdHJldHVybiB0aGlzO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEN5bGluZHJpY2FsLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCByYWRpdXMsIHRoZXRhLCB5ICkge1xuXG5cdFx0dGhpcy5yYWRpdXMgPSByYWRpdXM7XG5cdFx0dGhpcy50aGV0YSA9IHRoZXRhO1xuXHRcdHRoaXMueSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIG90aGVyICkge1xuXG5cdFx0dGhpcy5yYWRpdXMgPSBvdGhlci5yYWRpdXM7XG5cdFx0dGhpcy50aGV0YSA9IG90aGVyLnRoZXRhO1xuXHRcdHRoaXMueSA9IG90aGVyLnk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21WZWN0b3IzOiBmdW5jdGlvbiAoIHZlYzMgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IE1hdGguc3FydCggdmVjMy54ICogdmVjMy54ICsgdmVjMy56ICogdmVjMy56ICk7XG5cdFx0dGhpcy50aGV0YSA9IE1hdGguYXRhbjIoIHZlYzMueCwgdmVjMy56ICk7XG5cdFx0dGhpcy55ID0gdmVjMy55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICovXG5cbmZ1bmN0aW9uIEJveDIoIG1pbiwgbWF4ICkge1xuXG5cdHRoaXMubWluID0gKCBtaW4gIT09IHVuZGVmaW5lZCApID8gbWluIDogbmV3IFZlY3RvcjIoICsgSW5maW5pdHksICsgSW5maW5pdHkgKTtcblx0dGhpcy5tYXggPSAoIG1heCAhPT0gdW5kZWZpbmVkICkgPyBtYXggOiBuZXcgVmVjdG9yMiggLSBJbmZpbml0eSwgLSBJbmZpbml0eSApO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEJveDIucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkge1xuXG5cdFx0dGhpcy5taW4uY29weSggbWluICk7XG5cdFx0dGhpcy5tYXguY29weSggbWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Qb2ludHM6IGZ1bmN0aW9uICggcG9pbnRzICkge1xuXG5cdFx0dGhpcy5tYWtlRW1wdHkoKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuZXhwYW5kQnlQb2ludCggcG9pbnRzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUNlbnRlckFuZFNpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbUNlbnRlckFuZFNpemUoIGNlbnRlciwgc2l6ZSApIHtcblxuXHRcdFx0dmFyIGhhbGZTaXplID0gdjEuY29weSggc2l6ZSApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblx0XHRcdHRoaXMubWluLmNvcHkoIGNlbnRlciApLnN1YiggaGFsZlNpemUgKTtcblx0XHRcdHRoaXMubWF4LmNvcHkoIGNlbnRlciApLmFkZCggaGFsZlNpemUgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHR0aGlzLm1pbi5jb3B5KCBib3gubWluICk7XG5cdFx0dGhpcy5tYXguY29weSggYm94Lm1heCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlRW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMubWluLnggPSB0aGlzLm1pbi55ID0gKyBJbmZpbml0eTtcblx0XHR0aGlzLm1heC54ID0gdGhpcy5tYXgueSA9IC0gSW5maW5pdHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGlzRW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHRoaXMgaXMgYSBtb3JlIHJvYnVzdCBjaGVjayBmb3IgZW1wdHkgdGhhbiAoIHZvbHVtZSA8PSAwICkgYmVjYXVzZSB2b2x1bWUgY2FuIGdldCBwb3NpdGl2ZSB3aXRoIHR3byBuZWdhdGl2ZSBheGVzXG5cblx0XHRyZXR1cm4gKCB0aGlzLm1heC54IDwgdGhpcy5taW4ueCApIHx8ICggdGhpcy5tYXgueSA8IHRoaXMubWluLnkgKTtcblxuXHR9LFxuXG5cdGdldENlbnRlcjogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuZ2V0Q2VudGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyB0YXJnZXQuc2V0KCAwLCAwICkgOiB0YXJnZXQuYWRkVmVjdG9ycyggdGhpcy5taW4sIHRoaXMubWF4ICkubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xuXG5cdH0sXG5cblx0Z2V0U2l6ZTogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuZ2V0U2l6ZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuaXNFbXB0eSgpID8gdGFyZ2V0LnNldCggMCwgMCApIDogdGFyZ2V0LnN1YlZlY3RvcnMoIHRoaXMubWF4LCB0aGlzLm1pbiApO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHRoaXMubWluLm1pbiggcG9pbnQgKTtcblx0XHR0aGlzLm1heC5tYXgoIHBvaW50ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGV4cGFuZEJ5VmVjdG9yOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdHRoaXMubWluLnN1YiggdmVjdG9yICk7XG5cdFx0dGhpcy5tYXguYWRkKCB2ZWN0b3IgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy5taW4uYWRkU2NhbGFyKCAtIHNjYWxhciApO1xuXHRcdHRoaXMubWF4LmFkZFNjYWxhciggc2NhbGFyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gcG9pbnQueCA8IHRoaXMubWluLnggfHwgcG9pbnQueCA+IHRoaXMubWF4LnggfHxcblx0XHRcdHBvaW50LnkgPCB0aGlzLm1pbi55IHx8IHBvaW50LnkgPiB0aGlzLm1heC55ID8gZmFsc2UgOiB0cnVlO1xuXG5cdH0sXG5cblx0Y29udGFpbnNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubWluLnggPD0gYm94Lm1pbi54ICYmIGJveC5tYXgueCA8PSB0aGlzLm1heC54ICYmXG5cdFx0XHR0aGlzLm1pbi55IDw9IGJveC5taW4ueSAmJiBib3gubWF4LnkgPD0gdGhpcy5tYXgueTtcblxuXHR9LFxuXG5cdGdldFBhcmFtZXRlcjogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0Ly8gVGhpcyBjYW4gcG90ZW50aWFsbHkgaGF2ZSBhIGRpdmlkZSBieSB6ZXJvIGlmIHRoZSBib3hcblx0XHQvLyBoYXMgYSBzaXplIGRpbWVuc2lvbiBvZiAwLlxuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmdldFBhcmFtZXRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5zZXQoXG5cdFx0XHQoIHBvaW50LnggLSB0aGlzLm1pbi54ICkgLyAoIHRoaXMubWF4LnggLSB0aGlzLm1pbi54ICksXG5cdFx0XHQoIHBvaW50LnkgLSB0aGlzLm1pbi55ICkgLyAoIHRoaXMubWF4LnkgLSB0aGlzLm1pbi55IClcblx0XHQpO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c0JveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHQvLyB1c2luZyA0IHNwbGl0dGluZyBwbGFuZXMgdG8gcnVsZSBvdXQgaW50ZXJzZWN0aW9uc1xuXG5cdFx0cmV0dXJuIGJveC5tYXgueCA8IHRoaXMubWluLnggfHwgYm94Lm1pbi54ID4gdGhpcy5tYXgueCB8fFxuXHRcdFx0Ym94Lm1heC55IDwgdGhpcy5taW4ueSB8fCBib3gubWluLnkgPiB0aGlzLm1heC55ID8gZmFsc2UgOiB0cnVlO1xuXG5cdH0sXG5cblx0Y2xhbXBQb2ludDogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmNsYW1wUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuY29weSggcG9pbnQgKS5jbGFtcCggdGhpcy5taW4sIHRoaXMubWF4ICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIHtcblxuXHRcdFx0dmFyIGNsYW1wZWRQb2ludCA9IHYxLmNvcHkoIHBvaW50ICkuY2xhbXAoIHRoaXMubWluLCB0aGlzLm1heCApO1xuXHRcdFx0cmV0dXJuIGNsYW1wZWRQb2ludC5zdWIoIHBvaW50ICkubGVuZ3RoKCk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRpbnRlcnNlY3Q6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0dGhpcy5taW4ubWF4KCBib3gubWluICk7XG5cdFx0dGhpcy5tYXgubWluKCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHVuaW9uOiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHRoaXMubWluLm1pbiggYm94Lm1pbiApO1xuXHRcdHRoaXMubWF4Lm1heCggYm94Lm1heCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0cmFuc2xhdGU6IGZ1bmN0aW9uICggb2Zmc2V0ICkge1xuXG5cdFx0dGhpcy5taW4uYWRkKCBvZmZzZXQgKTtcblx0XHR0aGlzLm1heC5hZGQoIG9mZnNldCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIGJveC5taW4uZXF1YWxzKCB0aGlzLm1pbiApICYmIGJveC5tYXguZXF1YWxzKCB0aGlzLm1heCApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gSW1tZWRpYXRlUmVuZGVyT2JqZWN0KCBtYXRlcmlhbCApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsO1xuXHR0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggLyogcmVuZGVyQ2FsbGJhY2sgKi8gKSB7fTtcblxufVxuXG5JbW1lZGlhdGVSZW5kZXJPYmplY3QucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7XG5JbW1lZGlhdGVSZW5kZXJPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW1tZWRpYXRlUmVuZGVyT2JqZWN0O1xuXG5JbW1lZGlhdGVSZW5kZXJPYmplY3QucHJvdG90eXBlLmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0ID0gdHJ1ZTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gVmVydGV4Tm9ybWFsc0hlbHBlciggb2JqZWN0LCBzaXplLCBoZXgsIGxpbmV3aWR0aCApIHtcblxuXHR0aGlzLm9iamVjdCA9IG9iamVjdDtcblxuXHR0aGlzLnNpemUgPSAoIHNpemUgIT09IHVuZGVmaW5lZCApID8gc2l6ZSA6IDE7XG5cblx0dmFyIGNvbG9yID0gKCBoZXggIT09IHVuZGVmaW5lZCApID8gaGV4IDogMHhmZjAwMDA7XG5cblx0dmFyIHdpZHRoID0gKCBsaW5ld2lkdGggIT09IHVuZGVmaW5lZCApID8gbGluZXdpZHRoIDogMTtcblxuXHQvL1xuXG5cdHZhciBuTm9ybWFscyA9IDA7XG5cblx0dmFyIG9iakdlb21ldHJ5ID0gdGhpcy5vYmplY3QuZ2VvbWV0cnk7XG5cblx0aWYgKCBvYmpHZW9tZXRyeSAmJiBvYmpHZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0bk5vcm1hbHMgPSBvYmpHZW9tZXRyeS5mYWNlcy5sZW5ndGggKiAzO1xuXG5cdH0gZWxzZSBpZiAoIG9iakdlb21ldHJ5ICYmIG9iakdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRuTm9ybWFscyA9IG9iakdlb21ldHJ5LmF0dHJpYnV0ZXMubm9ybWFsLmNvdW50O1xuXG5cdH1cblxuXHQvL1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdHZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbk5vcm1hbHMgKiAyICogMywgMyApO1xuXG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgcG9zaXRpb25zICk7XG5cblx0TGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yLCBsaW5ld2lkdGg6IHdpZHRoIH0gKSApO1xuXG5cdC8vXG5cblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy51cGRhdGUoKTtcblxufVxuXG5WZXJ0ZXhOb3JtYWxzSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcblZlcnRleE5vcm1hbHNIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVmVydGV4Tm9ybWFsc0hlbHBlcjtcblxuVmVydGV4Tm9ybWFsc0hlbHBlci5wcm90b3R5cGUudXBkYXRlID0gKCBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHYyID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIG5vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcblxuXHRcdHZhciBrZXlzID0gWyAnYScsICdiJywgJ2MnIF07XG5cblx0XHR0aGlzLm9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0bm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCggdGhpcy5vYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdHZhciBtYXRyaXhXb3JsZCA9IHRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkO1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0Ly9cblxuXHRcdHZhciBvYmpHZW9tZXRyeSA9IHRoaXMub2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0aWYgKCBvYmpHZW9tZXRyeSAmJiBvYmpHZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHR2YXIgdmVydGljZXMgPSBvYmpHZW9tZXRyeS52ZXJ0aWNlcztcblxuXHRcdFx0dmFyIGZhY2VzID0gb2JqR2VvbWV0cnkuZmFjZXM7XG5cblx0XHRcdHZhciBpZHggPSAwO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBmYWNlID0gZmFjZXNbIGkgXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIHZlcnRleCA9IHZlcnRpY2VzWyBmYWNlWyBrZXlzWyBqIF0gXSBdO1xuXG5cdFx0XHRcdFx0dmFyIG5vcm1hbCA9IGZhY2UudmVydGV4Tm9ybWFsc1sgaiBdO1xuXG5cdFx0XHRcdFx0djEuY29weSggdmVydGV4ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdFx0djIuY29weSggbm9ybWFsICkuYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggdGhpcy5zaXplICkuYWRkKCB2MSApO1xuXG5cdFx0XHRcdFx0cG9zaXRpb24uc2V0WFlaKCBpZHgsIHYxLngsIHYxLnksIHYxLnogKTtcblxuXHRcdFx0XHRcdGlkeCA9IGlkeCArIDE7XG5cblx0XHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIGlkeCwgdjIueCwgdjIueSwgdjIueiApO1xuXG5cdFx0XHRcdFx0aWR4ID0gaWR4ICsgMTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9iakdlb21ldHJ5ICYmIG9iakdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdHZhciBvYmpQb3MgPSBvYmpHZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0XHR2YXIgb2JqTm9ybSA9IG9iakdlb21ldHJ5LmF0dHJpYnV0ZXMubm9ybWFsO1xuXG5cdFx0XHR2YXIgaWR4ID0gMDtcblxuXHRcdFx0Ly8gZm9yIHNpbXBsaWNpdHksIGlnbm9yZSBpbmRleCBhbmQgZHJhd2NhbGxzLCBhbmQgcmVuZGVyIGV2ZXJ5IG5vcm1hbFxuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gb2JqUG9zLmNvdW50OyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0djEuc2V0KCBvYmpQb3MuZ2V0WCggaiApLCBvYmpQb3MuZ2V0WSggaiApLCBvYmpQb3MuZ2V0WiggaiApICkuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdHYyLnNldCggb2JqTm9ybS5nZXRYKCBqICksIG9iak5vcm0uZ2V0WSggaiApLCBvYmpOb3JtLmdldFooIGogKSApO1xuXG5cdFx0XHRcdHYyLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIHRoaXMuc2l6ZSApLmFkZCggdjEgKTtcblxuXHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIGlkeCwgdjEueCwgdjEueSwgdjEueiApO1xuXG5cdFx0XHRcdGlkeCA9IGlkeCArIDE7XG5cblx0XHRcdFx0cG9zaXRpb24uc2V0WFlaKCBpZHgsIHYyLngsIHYyLnksIHYyLnogKTtcblxuXHRcdFx0XHRpZHggPSBpZHggKyAxO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0fTtcblxufSgpICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBTcG90TGlnaHRIZWxwZXIoIGxpZ2h0LCBjb2xvciApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5saWdodCA9IGxpZ2h0O1xuXHR0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0dGhpcy5tYXRyaXggPSBsaWdodC5tYXRyaXhXb3JsZDtcblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy5jb2xvciA9IGNvbG9yO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdHZhciBwb3NpdGlvbnMgPSBbXG5cdFx0MCwgMCwgMCwgXHQwLCAwLCAxLFxuXHRcdDAsIDAsIDAsIFx0MSwgMCwgMSxcblx0XHQwLCAwLCAwLFx0LSAxLCAwLCAxLFxuXHRcdDAsIDAsIDAsIFx0MCwgMSwgMSxcblx0XHQwLCAwLCAwLCBcdDAsIC0gMSwgMVxuXHRdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgaiA9IDEsIGwgPSAzMjsgaSA8IGw7IGkgKyssIGogKysgKSB7XG5cblx0XHR2YXIgcDEgPSAoIGkgLyBsICkgKiBNYXRoLlBJICogMjtcblx0XHR2YXIgcDIgPSAoIGogLyBsICkgKiBNYXRoLlBJICogMjtcblxuXHRcdHBvc2l0aW9ucy5wdXNoKFxuXHRcdFx0TWF0aC5jb3MoIHAxICksIE1hdGguc2luKCBwMSApLCAxLFxuXHRcdFx0TWF0aC5jb3MoIHAyICksIE1hdGguc2luKCBwMiApLCAxXG5cdFx0KTtcblxuXHR9XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkgKTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgZm9nOiBmYWxzZSB9ICk7XG5cblx0dGhpcy5jb25lID0gbmV3IExpbmVTZWdtZW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cdHRoaXMuYWRkKCB0aGlzLmNvbmUgKTtcblxuXHR0aGlzLnVwZGF0ZSgpO1xuXG59XG5cblNwb3RMaWdodEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTtcblNwb3RMaWdodEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTcG90TGlnaHRIZWxwZXI7XG5cblNwb3RMaWdodEhlbHBlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR0aGlzLmNvbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHR0aGlzLmNvbmUubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXG59O1xuXG5TcG90TGlnaHRIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHZlY3RvcjIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7XG5cblx0XHR0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0XHR2YXIgY29uZUxlbmd0aCA9IHRoaXMubGlnaHQuZGlzdGFuY2UgPyB0aGlzLmxpZ2h0LmRpc3RhbmNlIDogMTAwMDtcblx0XHR2YXIgY29uZVdpZHRoID0gY29uZUxlbmd0aCAqIE1hdGgudGFuKCB0aGlzLmxpZ2h0LmFuZ2xlICk7XG5cblx0XHR0aGlzLmNvbmUuc2NhbGUuc2V0KCBjb25lV2lkdGgsIGNvbmVXaWR0aCwgY29uZUxlbmd0aCApO1xuXG5cdFx0dmVjdG9yLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5saWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdHZlY3RvcjIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0dGhpcy5jb25lLmxvb2tBdCggdmVjdG9yMi5zdWIoIHZlY3RvciApICk7XG5cblx0XHRpZiAoIHRoaXMuY29sb3IgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLnNldCggdGhpcy5jb2xvciApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblxuXHRcdH1cblxuXHR9O1xuXG59KCk7XG5cbi8qKlxuICogQGF1dGhvciBTZWFuIEdyaWZmaW4gLyBodHRwOi8vdHdpdHRlci5jb20vc2dyaWZcbiAqIEBhdXRob3IgTWljaGFlbCBHdWVycmVybyAvIGh0dHA6Ly9yZWFsaXR5bWVsdGRvd24uY29tXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBpa2VyciAvIGh0dHA6Ly92ZXJvbGQuY29tXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbmZ1bmN0aW9uIGdldEJvbmVMaXN0KCBvYmplY3QgKSB7XG5cblx0dmFyIGJvbmVMaXN0ID0gW107XG5cblx0aWYgKCBvYmplY3QgJiYgb2JqZWN0LmlzQm9uZSApIHtcblxuXHRcdGJvbmVMaXN0LnB1c2goIG9iamVjdCApO1xuXG5cdH1cblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBvYmplY3QuY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0Ym9uZUxpc3QucHVzaC5hcHBseSggYm9uZUxpc3QsIGdldEJvbmVMaXN0KCBvYmplY3QuY2hpbGRyZW5bIGkgXSApICk7XG5cblx0fVxuXG5cdHJldHVybiBib25lTGlzdDtcblxufVxuXG5mdW5jdGlvbiBTa2VsZXRvbkhlbHBlciggb2JqZWN0ICkge1xuXG5cdHZhciBib25lcyA9IGdldEJvbmVMaXN0KCBvYmplY3QgKTtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblxuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIGNvbG9ycyA9IFtdO1xuXG5cdHZhciBjb2xvcjEgPSBuZXcgQ29sb3IoIDAsIDAsIDEgKTtcblx0dmFyIGNvbG9yMiA9IG5ldyBDb2xvciggMCwgMSwgMCApO1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSA8IGJvbmVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdHZhciBib25lID0gYm9uZXNbIGkgXTtcblxuXHRcdGlmICggYm9uZS5wYXJlbnQgJiYgYm9uZS5wYXJlbnQuaXNCb25lICkge1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7XG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7XG5cdFx0XHRjb2xvcnMucHVzaCggY29sb3IxLnIsIGNvbG9yMS5nLCBjb2xvcjEuYiApO1xuXHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yMi5yLCBjb2xvcjIuZywgY29sb3IyLmIgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xuXG5cdHZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IFZlcnRleENvbG9ycywgZGVwdGhUZXN0OiBmYWxzZSwgZGVwdGhXcml0ZTogZmFsc2UsIHRyYW5zcGFyZW50OiB0cnVlIH0gKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy5yb290ID0gb2JqZWN0O1xuXHR0aGlzLmJvbmVzID0gYm9uZXM7XG5cblx0dGhpcy5tYXRyaXggPSBvYmplY3QubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG59XG5cblNrZWxldG9uSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcblNrZWxldG9uSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNrZWxldG9uSGVscGVyO1xuXG5Ta2VsZXRvbkhlbHBlci5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQgPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIGJvbmVNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHR2YXIgbWF0cml4V29ybGRJbnYgPSBuZXcgTWF0cml4NCgpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKSB7XG5cblx0XHR2YXIgYm9uZXMgPSB0aGlzLmJvbmVzO1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblx0XHR2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTtcblxuXHRcdG1hdHJpeFdvcmxkSW52LmdldEludmVyc2UoIHRoaXMucm9vdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBqID0gMDsgaSA8IGJvbmVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGJvbmUgPSBib25lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGJvbmUucGFyZW50ICYmIGJvbmUucGFyZW50LmlzQm9uZSApIHtcblxuXHRcdFx0XHRib25lTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIG1hdHJpeFdvcmxkSW52LCBib25lLm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHZlY3Rvci5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGJvbmVNYXRyaXggKTtcblx0XHRcdFx0cG9zaXRpb24uc2V0WFlaKCBqLCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56ICk7XG5cblx0XHRcdFx0Ym9uZU1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBtYXRyaXhXb3JsZEludiwgYm9uZS5wYXJlbnQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dmVjdG9yLnNldEZyb21NYXRyaXhQb3NpdGlvbiggYm9uZU1hdHJpeCApO1xuXHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIGogKyAxLCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56ICk7XG5cblx0XHRcdFx0aiArPSAyO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTtcblxuXHR9O1xuXG59KCk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gUG9pbnRMaWdodEhlbHBlciggbGlnaHQsIHNwaGVyZVNpemUsIGNvbG9yICkge1xuXG5cdHRoaXMubGlnaHQgPSBsaWdodDtcblx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdHRoaXMuY29sb3IgPSBjb2xvcjtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgU3BoZXJlQnVmZmVyR2VvbWV0cnkoIHNwaGVyZVNpemUsIDQsIDIgKTtcblx0dmFyIG1hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IHdpcmVmcmFtZTogdHJ1ZSwgZm9nOiBmYWxzZSB9ICk7XG5cblx0TWVzaC5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHR0aGlzLm1hdHJpeCA9IHRoaXMubGlnaHQubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMudXBkYXRlKCk7XG5cblxuXHQvKlxuXHR2YXIgZGlzdGFuY2VHZW9tZXRyeSA9IG5ldyBUSFJFRS5JY29zYWhlZHJvbkdlb21ldHJ5KCAxLCAyICk7XG5cdHZhciBkaXN0YW5jZU1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBoZXhDb2xvciwgZm9nOiBmYWxzZSwgd2lyZWZyYW1lOiB0cnVlLCBvcGFjaXR5OiAwLjEsIHRyYW5zcGFyZW50OiB0cnVlIH0gKTtcblxuXHR0aGlzLmxpZ2h0U3BoZXJlID0gbmV3IFRIUkVFLk1lc2goIGJ1bGJHZW9tZXRyeSwgYnVsYk1hdGVyaWFsICk7XG5cdHRoaXMubGlnaHREaXN0YW5jZSA9IG5ldyBUSFJFRS5NZXNoKCBkaXN0YW5jZUdlb21ldHJ5LCBkaXN0YW5jZU1hdGVyaWFsICk7XG5cblx0dmFyIGQgPSBsaWdodC5kaXN0YW5jZTtcblxuXHRpZiAoIGQgPT09IDAuMCApIHtcblxuXHRcdHRoaXMubGlnaHREaXN0YW5jZS52aXNpYmxlID0gZmFsc2U7XG5cblx0fSBlbHNlIHtcblxuXHRcdHRoaXMubGlnaHREaXN0YW5jZS5zY2FsZS5zZXQoIGQsIGQsIGQgKTtcblxuXHR9XG5cblx0dGhpcy5hZGQoIHRoaXMubGlnaHREaXN0YW5jZSApO1xuXHQqL1xuXG59XG5cblBvaW50TGlnaHRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWVzaC5wcm90b3R5cGUgKTtcblBvaW50TGlnaHRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUG9pbnRMaWdodEhlbHBlcjtcblxuUG9pbnRMaWdodEhlbHBlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKTtcblx0dGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7XG5cbn07XG5cblBvaW50TGlnaHRIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRpZiAoIHRoaXMuY29sb3IgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdHRoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdHRoaXMubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xuXG5cdH1cblxuXHQvKlxuXHR2YXIgZCA9IHRoaXMubGlnaHQuZGlzdGFuY2U7XG5cblx0aWYgKCBkID09PSAwLjAgKSB7XG5cblx0XHR0aGlzLmxpZ2h0RGlzdGFuY2UudmlzaWJsZSA9IGZhbHNlO1xuXG5cdH0gZWxzZSB7XG5cblx0XHR0aGlzLmxpZ2h0RGlzdGFuY2UudmlzaWJsZSA9IHRydWU7XG5cdFx0dGhpcy5saWdodERpc3RhbmNlLnNjYWxlLnNldCggZCwgZCwgZCApO1xuXG5cdH1cblx0Ki9cblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGFiZWxuYXRpb24gLyBodHRwOi8vZ2l0aHViLmNvbS9hYmVsbmF0aW9uXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBSZWN0QXJlYUxpZ2h0SGVscGVyKCBsaWdodCwgY29sb3IgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMubGlnaHQgPSBsaWdodDtcblx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdHRoaXMubWF0cml4ID0gbGlnaHQubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMuY29sb3IgPSBjb2xvcjtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgZm9nOiBmYWxzZSB9ICk7XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBuZXcgRmxvYXQzMkFycmF5KCA1ICogMyApLCAzICkgKTtcblxuXHR0aGlzLmxpbmUgPSBuZXcgTGluZSggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cdHRoaXMuYWRkKCB0aGlzLmxpbmUgKTtcblxuXG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuUmVjdEFyZWFMaWdodEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTtcblJlY3RBcmVhTGlnaHRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmVjdEFyZWFMaWdodEhlbHBlcjtcblxuUmVjdEFyZWFMaWdodEhlbHBlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR0aGlzLmNoaWxkcmVuWyAwIF0uZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHR0aGlzLmNoaWxkcmVuWyAwIF0ubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXG59O1xuXG5SZWN0QXJlYUxpZ2h0SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cblx0Ly8gY2FsY3VsYXRlIG5ldyBkaW1lbnNpb25zIG9mIHRoZSBoZWxwZXJcblxuXHR2YXIgaHggPSB0aGlzLmxpZ2h0LndpZHRoICogMC41O1xuXHR2YXIgaHkgPSB0aGlzLmxpZ2h0LmhlaWdodCAqIDAuNTtcblxuXHR2YXIgcG9zaXRpb24gPSB0aGlzLmxpbmUuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblx0dmFyIGFycmF5ID0gcG9zaXRpb24uYXJyYXk7XG5cblx0Ly8gdXBkYXRlIHZlcnRpY2VzXG5cblx0YXJyYXlbIDAgXSA9IGh4OyBhcnJheVsgMSBdID0gLSBoeTsgYXJyYXlbIDIgXSA9IDA7XG5cdGFycmF5WyAzIF0gPSBoeDsgYXJyYXlbIDQgXSA9IGh5OyBhcnJheVsgNSBdID0gMDtcblx0YXJyYXlbIDYgXSA9IC0gaHg7IGFycmF5WyA3IF0gPSBoeTsgYXJyYXlbIDggXSA9IDA7XG5cdGFycmF5WyA5IF0gPSAtIGh4OyBhcnJheVsgMTAgXSA9IC0gaHk7IGFycmF5WyAxMSBdID0gMDtcblx0YXJyYXlbIDEyIF0gPSBoeDsgYXJyYXlbIDEzIF0gPSAtIGh5OyBhcnJheVsgMTQgXSA9IDA7XG5cblx0cG9zaXRpb24ubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdGlmICggdGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0dGhpcy5saW5lLm1hdGVyaWFsLmNvbG9yLnNldCggdGhpcy5jb2xvciApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHR0aGlzLmxpbmUubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xuXG5cdH1cblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuZnVuY3Rpb24gSGVtaXNwaGVyZUxpZ2h0SGVscGVyKCBsaWdodCwgc2l6ZSwgY29sb3IgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMubGlnaHQgPSBsaWdodDtcblx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdHRoaXMubWF0cml4ID0gbGlnaHQubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMuY29sb3IgPSBjb2xvcjtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCBzaXplICk7XG5cdGdlb21ldHJ5LnJvdGF0ZVkoIE1hdGguUEkgKiAwLjUgKTtcblxuXHR0aGlzLm1hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IHdpcmVmcmFtZTogdHJ1ZSwgZm9nOiBmYWxzZSB9ICk7XG5cdGlmICggdGhpcy5jb2xvciA9PT0gdW5kZWZpbmVkICkgdGhpcy5tYXRlcmlhbC52ZXJ0ZXhDb2xvcnMgPSBWZXJ0ZXhDb2xvcnM7XG5cblx0dmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICk7XG5cdHZhciBjb2xvcnMgPSBuZXcgRmxvYXQzMkFycmF5KCBwb3NpdGlvbi5jb3VudCAqIDMgKTtcblxuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XG5cblx0dGhpcy5hZGQoIG5ldyBNZXNoKCBnZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApICk7XG5cblx0dGhpcy51cGRhdGUoKTtcblxufVxuXG5IZW1pc3BoZXJlTGlnaHRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7XG5IZW1pc3BoZXJlTGlnaHRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSGVtaXNwaGVyZUxpZ2h0SGVscGVyO1xuXG5IZW1pc3BoZXJlTGlnaHRIZWxwZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cblx0dGhpcy5jaGlsZHJlblsgMCBdLmdlb21ldHJ5LmRpc3Bvc2UoKTtcblx0dGhpcy5jaGlsZHJlblsgMCBdLm1hdGVyaWFsLmRpc3Bvc2UoKTtcblxufTtcblxuSGVtaXNwaGVyZUxpZ2h0SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIGNvbG9yMSA9IG5ldyBDb2xvcigpO1xuXHR2YXIgY29sb3IyID0gbmV3IENvbG9yKCk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcblxuXHRcdHZhciBtZXNoID0gdGhpcy5jaGlsZHJlblsgMCBdO1xuXG5cdFx0aWYgKCB0aGlzLmNvbG9yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgY29sb3JzID0gbWVzaC5nZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdjb2xvcicgKTtcblxuXHRcdFx0Y29sb3IxLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblx0XHRcdGNvbG9yMi5jb3B5KCB0aGlzLmxpZ2h0Lmdyb3VuZENvbG9yICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGNvbG9ycy5jb3VudDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGNvbG9yID0gKCBpIDwgKCBsIC8gMiApICkgPyBjb2xvcjEgOiBjb2xvcjI7XG5cblx0XHRcdFx0Y29sb3JzLnNldFhZWiggaSwgY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNvbG9ycy5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRtZXNoLmxvb2tBdCggdmVjdG9yLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5saWdodC5tYXRyaXhXb3JsZCApLm5lZ2F0ZSgpICk7XG5cblx0fTtcblxufSgpO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gR3JpZEhlbHBlciggc2l6ZSwgZGl2aXNpb25zLCBjb2xvcjEsIGNvbG9yMiApIHtcblxuXHRzaXplID0gc2l6ZSB8fCAxMDtcblx0ZGl2aXNpb25zID0gZGl2aXNpb25zIHx8IDEwO1xuXHRjb2xvcjEgPSBuZXcgQ29sb3IoIGNvbG9yMSAhPT0gdW5kZWZpbmVkID8gY29sb3IxIDogMHg0NDQ0NDQgKTtcblx0Y29sb3IyID0gbmV3IENvbG9yKCBjb2xvcjIgIT09IHVuZGVmaW5lZCA/IGNvbG9yMiA6IDB4ODg4ODg4ICk7XG5cblx0dmFyIGNlbnRlciA9IGRpdmlzaW9ucyAvIDI7XG5cdHZhciBzdGVwID0gc2l6ZSAvIGRpdmlzaW9ucztcblx0dmFyIGhhbGZTaXplID0gc2l6ZSAvIDI7XG5cblx0dmFyIHZlcnRpY2VzID0gW10sIGNvbG9ycyA9IFtdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgaiA9IDAsIGsgPSAtIGhhbGZTaXplOyBpIDw9IGRpdmlzaW9uczsgaSArKywgayArPSBzdGVwICkge1xuXG5cdFx0dmVydGljZXMucHVzaCggLSBoYWxmU2l6ZSwgMCwgaywgaGFsZlNpemUsIDAsIGsgKTtcblx0XHR2ZXJ0aWNlcy5wdXNoKCBrLCAwLCAtIGhhbGZTaXplLCBrLCAwLCBoYWxmU2l6ZSApO1xuXG5cdFx0dmFyIGNvbG9yID0gaSA9PT0gY2VudGVyID8gY29sb3IxIDogY29sb3IyO1xuXG5cdFx0Y29sb3IudG9BcnJheSggY29sb3JzLCBqICk7IGogKz0gMztcblx0XHRjb2xvci50b0FycmF5KCBjb2xvcnMsIGogKTsgaiArPSAzO1xuXHRcdGNvbG9yLnRvQXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7XG5cdFx0Y29sb3IudG9BcnJheSggY29sb3JzLCBqICk7IGogKz0gMztcblxuXHR9XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgdmVydGV4Q29sb3JzOiBWZXJ0ZXhDb2xvcnMgfSApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxufVxuXG5HcmlkSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcbkdyaWRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR3JpZEhlbHBlcjtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cDovL2dpdGh1Yi5jb20vTXVnZW44N1xuICogQGF1dGhvciBIZWN0YXRlIC8gaHR0cDovL3d3dy5naXRodWIuY29tL0hlY3RhdGVcbiAqL1xuXG5mdW5jdGlvbiBQb2xhckdyaWRIZWxwZXIoIHJhZGl1cywgcmFkaWFscywgY2lyY2xlcywgZGl2aXNpb25zLCBjb2xvcjEsIGNvbG9yMiApIHtcblxuXHRyYWRpdXMgPSByYWRpdXMgfHwgMTA7XG5cdHJhZGlhbHMgPSByYWRpYWxzIHx8IDE2O1xuXHRjaXJjbGVzID0gY2lyY2xlcyB8fCA4O1xuXHRkaXZpc2lvbnMgPSBkaXZpc2lvbnMgfHwgNjQ7XG5cdGNvbG9yMSA9IG5ldyBDb2xvciggY29sb3IxICE9PSB1bmRlZmluZWQgPyBjb2xvcjEgOiAweDQ0NDQ0NCApO1xuXHRjb2xvcjIgPSBuZXcgQ29sb3IoIGNvbG9yMiAhPT0gdW5kZWZpbmVkID8gY29sb3IyIDogMHg4ODg4ODggKTtcblxuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIGNvbG9ycyA9IFtdO1xuXG5cdHZhciB4LCB6O1xuXHR2YXIgdiwgaSwgaiwgciwgY29sb3I7XG5cblx0Ly8gY3JlYXRlIHRoZSByYWRpYWxzXG5cblx0Zm9yICggaSA9IDA7IGkgPD0gcmFkaWFsczsgaSArKyApIHtcblxuXHRcdHYgPSAoIGkgLyByYWRpYWxzICkgKiAoIE1hdGguUEkgKiAyICk7XG5cblx0XHR4ID0gTWF0aC5zaW4oIHYgKSAqIHJhZGl1cztcblx0XHR6ID0gTWF0aC5jb3MoIHYgKSAqIHJhZGl1cztcblxuXHRcdHZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTtcblx0XHR2ZXJ0aWNlcy5wdXNoKCB4LCAwLCB6ICk7XG5cblx0XHRjb2xvciA9ICggaSAmIDEgKSA/IGNvbG9yMSA6IGNvbG9yMjtcblxuXHRcdGNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XG5cdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblxuXHR9XG5cblx0Ly8gY3JlYXRlIHRoZSBjaXJjbGVzXG5cblx0Zm9yICggaSA9IDA7IGkgPD0gY2lyY2xlczsgaSArKyApIHtcblxuXHRcdGNvbG9yID0gKCBpICYgMSApID8gY29sb3IxIDogY29sb3IyO1xuXG5cdFx0ciA9IHJhZGl1cyAtICggcmFkaXVzIC8gY2lyY2xlcyAqIGkgKTtcblxuXHRcdGZvciAoIGogPSAwOyBqIDwgZGl2aXNpb25zOyBqICsrICkge1xuXG5cdFx0XHQvLyBmaXJzdCB2ZXJ0ZXhcblxuXHRcdFx0diA9ICggaiAvIGRpdmlzaW9ucyApICogKCBNYXRoLlBJICogMiApO1xuXG5cdFx0XHR4ID0gTWF0aC5zaW4oIHYgKSAqIHI7XG5cdFx0XHR6ID0gTWF0aC5jb3MoIHYgKSAqIHI7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHgsIDAsIHogKTtcblx0XHRcdGNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XG5cblx0XHRcdC8vIHNlY29uZCB2ZXJ0ZXhcblxuXHRcdFx0diA9ICggKCBqICsgMSApIC8gZGl2aXNpb25zICkgKiAoIE1hdGguUEkgKiAyICk7XG5cblx0XHRcdHggPSBNYXRoLnNpbiggdiApICogcjtcblx0XHRcdHogPSBNYXRoLmNvcyggdiApICogcjtcblxuXHRcdFx0dmVydGljZXMucHVzaCggeCwgMCwgeiApO1xuXHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgdmVydGV4Q29sb3JzOiBWZXJ0ZXhDb2xvcnMgfSApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxufVxuXG5Qb2xhckdyaWRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApO1xuUG9sYXJHcmlkSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBvbGFyR3JpZEhlbHBlcjtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gRmFjZU5vcm1hbHNIZWxwZXIoIG9iamVjdCwgc2l6ZSwgaGV4LCBsaW5ld2lkdGggKSB7XG5cblx0Ly8gRmFjZU5vcm1hbHNIZWxwZXIgb25seSBzdXBwb3J0cyBUSFJFRS5HZW9tZXRyeVxuXG5cdHRoaXMub2JqZWN0ID0gb2JqZWN0O1xuXG5cdHRoaXMuc2l6ZSA9ICggc2l6ZSAhPT0gdW5kZWZpbmVkICkgPyBzaXplIDogMTtcblxuXHR2YXIgY29sb3IgPSAoIGhleCAhPT0gdW5kZWZpbmVkICkgPyBoZXggOiAweGZmZmYwMDtcblxuXHR2YXIgd2lkdGggPSAoIGxpbmV3aWR0aCAhPT0gdW5kZWZpbmVkICkgPyBsaW5ld2lkdGggOiAxO1xuXG5cdC8vXG5cblx0dmFyIG5Ob3JtYWxzID0gMDtcblxuXHR2YXIgb2JqR2VvbWV0cnkgPSB0aGlzLm9iamVjdC5nZW9tZXRyeTtcblxuXHRpZiAoIG9iakdlb21ldHJ5ICYmIG9iakdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRuTm9ybWFscyA9IG9iakdlb21ldHJ5LmZhY2VzLmxlbmd0aDtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRmFjZU5vcm1hbHNIZWxwZXI6IG9ubHkgVEhSRUUuR2VvbWV0cnkgaXMgc3VwcG9ydGVkLiBVc2UgVEhSRUUuVmVydGV4Tm9ybWFsc0hlbHBlciwgaW5zdGVhZC4nICk7XG5cblx0fVxuXG5cdC8vXG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0dmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBuTm9ybWFscyAqIDIgKiAzLCAzICk7XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBwb3NpdGlvbnMgKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIGxpbmV3aWR0aDogd2lkdGggfSApICk7XG5cblx0Ly9cblxuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblx0dGhpcy51cGRhdGUoKTtcblxufVxuXG5GYWNlTm9ybWFsc0hlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5GYWNlTm9ybWFsc0hlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBGYWNlTm9ybWFsc0hlbHBlcjtcblxuRmFjZU5vcm1hbHNIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9ICggZnVuY3Rpb24gKCkge1xuXG5cdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB2MiA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBub3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7XG5cblx0XHR0aGlzLm9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0bm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCggdGhpcy5vYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdHZhciBtYXRyaXhXb3JsZCA9IHRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkO1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0Ly9cblxuXHRcdHZhciBvYmpHZW9tZXRyeSA9IHRoaXMub2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0dmFyIHZlcnRpY2VzID0gb2JqR2VvbWV0cnkudmVydGljZXM7XG5cblx0XHR2YXIgZmFjZXMgPSBvYmpHZW9tZXRyeS5mYWNlcztcblxuXHRcdHZhciBpZHggPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSBmYWNlc1sgaSBdO1xuXG5cdFx0XHR2YXIgbm9ybWFsID0gZmFjZS5ub3JtYWw7XG5cblx0XHRcdHYxLmNvcHkoIHZlcnRpY2VzWyBmYWNlLmEgXSApXG5cdFx0XHRcdC5hZGQoIHZlcnRpY2VzWyBmYWNlLmIgXSApXG5cdFx0XHRcdC5hZGQoIHZlcnRpY2VzWyBmYWNlLmMgXSApXG5cdFx0XHRcdC5kaXZpZGVTY2FsYXIoIDMgKVxuXHRcdFx0XHQuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0XHR2Mi5jb3B5KCBub3JtYWwgKS5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCB0aGlzLnNpemUgKS5hZGQoIHYxICk7XG5cblx0XHRcdHBvc2l0aW9uLnNldFhZWiggaWR4LCB2MS54LCB2MS55LCB2MS56ICk7XG5cblx0XHRcdGlkeCA9IGlkeCArIDE7XG5cblx0XHRcdHBvc2l0aW9uLnNldFhZWiggaWR4LCB2Mi54LCB2Mi55LCB2Mi56ICk7XG5cblx0XHRcdGlkeCA9IGlkeCArIDE7XG5cblx0XHR9XG5cblx0XHRwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0fTtcblxufSgpICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBEaXJlY3Rpb25hbExpZ2h0SGVscGVyKCBsaWdodCwgc2l6ZSwgY29sb3IgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMubGlnaHQgPSBsaWdodDtcblx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdHRoaXMubWF0cml4ID0gbGlnaHQubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMuY29sb3IgPSBjb2xvcjtcblxuXHRpZiAoIHNpemUgPT09IHVuZGVmaW5lZCApIHNpemUgPSAxO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBbXG5cdFx0LSBzaXplLCBzaXplLCAwLFxuXHRcdHNpemUsIHNpemUsIDAsXG5cdFx0c2l6ZSwgLSBzaXplLCAwLFxuXHRcdC0gc2l6ZSwgLSBzaXplLCAwLFxuXHRcdC0gc2l6ZSwgc2l6ZSwgMFxuXHRdLCAzICkgKTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgZm9nOiBmYWxzZSB9ICk7XG5cblx0dGhpcy5saWdodFBsYW5lID0gbmV3IExpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXHR0aGlzLmFkZCggdGhpcy5saWdodFBsYW5lICk7XG5cblx0Z2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggWyAwLCAwLCAwLCAwLCAwLCAxIF0sIDMgKSApO1xuXG5cdHRoaXMudGFyZ2V0TGluZSA9IG5ldyBMaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblx0dGhpcy5hZGQoIHRoaXMudGFyZ2V0TGluZSApO1xuXG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuRGlyZWN0aW9uYWxMaWdodEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTtcbkRpcmVjdGlvbmFsTGlnaHRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRGlyZWN0aW9uYWxMaWdodEhlbHBlcjtcblxuRGlyZWN0aW9uYWxMaWdodEhlbHBlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR0aGlzLmxpZ2h0UGxhbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHR0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXHR0aGlzLnRhcmdldExpbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHR0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXG59O1xuXG5EaXJlY3Rpb25hbExpZ2h0SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHYyID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHYzID0gbmV3IFZlY3RvcjMoKTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkge1xuXG5cdFx0djEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0djIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApO1xuXHRcdHYzLnN1YlZlY3RvcnMoIHYyLCB2MSApO1xuXG5cdFx0dGhpcy5saWdodFBsYW5lLmxvb2tBdCggdjMgKTtcblxuXHRcdGlmICggdGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XG5cdFx0XHR0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xuXHRcdFx0dGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMudGFyZ2V0TGluZS5sb29rQXQoIHYzICk7XG5cdFx0dGhpcy50YXJnZXRMaW5lLnNjYWxlLnogPSB2My5sZW5ndGgoKTtcblxuXHR9O1xuXG59KCk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKlxuICpcdC0gc2hvd3MgZnJ1c3R1bSwgbGluZSBvZiBzaWdodCBhbmQgdXAgb2YgdGhlIGNhbWVyYVxuICpcdC0gc3VpdGFibGUgZm9yIGZhc3QgdXBkYXRlc1xuICogXHQtIGJhc2VkIG9uIGZydXN0dW0gdmlzdWFsaXphdGlvbiBpbiBsaWdodGdsLmpzIHNoYWRvd21hcCBleGFtcGxlXG4gKlx0XHRodHRwOi8vZXZhbncuZ2l0aHViLmNvbS9saWdodGdsLmpzL3Rlc3RzL3NoYWRvd21hcC5odG1sXG4gKi9cblxuZnVuY3Rpb24gQ2FtZXJhSGVscGVyKCBjYW1lcmEgKSB7XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdHZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZmZmZmYsIHZlcnRleENvbG9yczogRmFjZUNvbG9ycyB9ICk7XG5cblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBjb2xvcnMgPSBbXTtcblxuXHR2YXIgcG9pbnRNYXAgPSB7fTtcblxuXHQvLyBjb2xvcnNcblxuXHR2YXIgY29sb3JGcnVzdHVtID0gbmV3IENvbG9yKCAweGZmYWEwMCApO1xuXHR2YXIgY29sb3JDb25lID0gbmV3IENvbG9yKCAweGZmMDAwMCApO1xuXHR2YXIgY29sb3JVcCA9IG5ldyBDb2xvciggMHgwMGFhZmYgKTtcblx0dmFyIGNvbG9yVGFyZ2V0ID0gbmV3IENvbG9yKCAweGZmZmZmZiApO1xuXHR2YXIgY29sb3JDcm9zcyA9IG5ldyBDb2xvciggMHgzMzMzMzMgKTtcblxuXHQvLyBuZWFyXG5cblx0YWRkTGluZSggJ24xJywgJ24yJywgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoICduMicsICduNCcsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCAnbjQnLCAnbjMnLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggJ24zJywgJ24xJywgY29sb3JGcnVzdHVtICk7XG5cblx0Ly8gZmFyXG5cblx0YWRkTGluZSggJ2YxJywgJ2YyJywgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoICdmMicsICdmNCcsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCAnZjQnLCAnZjMnLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggJ2YzJywgJ2YxJywgY29sb3JGcnVzdHVtICk7XG5cblx0Ly8gc2lkZXNcblxuXHRhZGRMaW5lKCAnbjEnLCAnZjEnLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggJ24yJywgJ2YyJywgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoICduMycsICdmMycsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCAnbjQnLCAnZjQnLCBjb2xvckZydXN0dW0gKTtcblxuXHQvLyBjb25lXG5cblx0YWRkTGluZSggJ3AnLCAnbjEnLCBjb2xvckNvbmUgKTtcblx0YWRkTGluZSggJ3AnLCAnbjInLCBjb2xvckNvbmUgKTtcblx0YWRkTGluZSggJ3AnLCAnbjMnLCBjb2xvckNvbmUgKTtcblx0YWRkTGluZSggJ3AnLCAnbjQnLCBjb2xvckNvbmUgKTtcblxuXHQvLyB1cFxuXG5cdGFkZExpbmUoICd1MScsICd1MicsIGNvbG9yVXAgKTtcblx0YWRkTGluZSggJ3UyJywgJ3UzJywgY29sb3JVcCApO1xuXHRhZGRMaW5lKCAndTMnLCAndTEnLCBjb2xvclVwICk7XG5cblx0Ly8gdGFyZ2V0XG5cblx0YWRkTGluZSggJ2MnLCAndCcsIGNvbG9yVGFyZ2V0ICk7XG5cdGFkZExpbmUoICdwJywgJ2MnLCBjb2xvckNyb3NzICk7XG5cblx0Ly8gY3Jvc3NcblxuXHRhZGRMaW5lKCAnY24xJywgJ2NuMicsIGNvbG9yQ3Jvc3MgKTtcblx0YWRkTGluZSggJ2NuMycsICdjbjQnLCBjb2xvckNyb3NzICk7XG5cblx0YWRkTGluZSggJ2NmMScsICdjZjInLCBjb2xvckNyb3NzICk7XG5cdGFkZExpbmUoICdjZjMnLCAnY2Y0JywgY29sb3JDcm9zcyApO1xuXG5cdGZ1bmN0aW9uIGFkZExpbmUoIGEsIGIsIGNvbG9yICkge1xuXG5cdFx0YWRkUG9pbnQoIGEsIGNvbG9yICk7XG5cdFx0YWRkUG9pbnQoIGIsIGNvbG9yICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGFkZFBvaW50KCBpZCwgY29sb3IgKSB7XG5cblx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7XG5cdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblxuXHRcdGlmICggcG9pbnRNYXBbIGlkIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cG9pbnRNYXBbIGlkIF0gPSBbXTtcblxuXHRcdH1cblxuXHRcdHBvaW50TWFwWyBpZCBdLnB1c2goICggdmVydGljZXMubGVuZ3RoIC8gMyApIC0gMSApO1xuXG5cdH1cblxuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XG5cblx0TGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdHRoaXMuY2FtZXJhID0gY2FtZXJhO1xuXHRpZiAoIHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXggKSB0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0dGhpcy5tYXRyaXggPSBjYW1lcmEubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMucG9pbnRNYXAgPSBwb2ludE1hcDtcblxuXHR0aGlzLnVwZGF0ZSgpO1xuXG59XG5cbkNhbWVyYUhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5DYW1lcmFIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2FtZXJhSGVscGVyO1xuXG5DYW1lcmFIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZ2VvbWV0cnksIHBvaW50TWFwO1xuXG5cdHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgY2FtZXJhID0gbmV3IENhbWVyYSgpO1xuXG5cdGZ1bmN0aW9uIHNldFBvaW50KCBwb2ludCwgeCwgeSwgeiApIHtcblxuXHRcdHZlY3Rvci5zZXQoIHgsIHksIHogKS51bnByb2plY3QoIGNhbWVyYSApO1xuXG5cdFx0dmFyIHBvaW50cyA9IHBvaW50TWFwWyBwb2ludCBdO1xuXG5cdFx0aWYgKCBwb2ludHMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHBvc2l0aW9uLnNldFhZWiggcG9pbnRzWyBpIF0sIHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnogKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkge1xuXG5cdFx0Z2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXHRcdHBvaW50TWFwID0gdGhpcy5wb2ludE1hcDtcblxuXHRcdHZhciB3ID0gMSwgaCA9IDE7XG5cblx0XHQvLyB3ZSBuZWVkIGp1c3QgY2FtZXJhIHByb2plY3Rpb24gbWF0cml4XG5cdFx0Ly8gd29ybGQgbWF0cml4IG11c3QgYmUgaWRlbnRpdHlcblxuXHRcdGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIHRoaXMuY2FtZXJhLnByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdC8vIGNlbnRlciAvIHRhcmdldFxuXG5cdFx0c2V0UG9pbnQoICdjJywgMCwgMCwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICd0JywgMCwgMCwgMSApO1xuXG5cdFx0Ly8gbmVhclxuXG5cdFx0c2V0UG9pbnQoICduMScsIC0gdywgLSBoLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ24yJywgdywgLSBoLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ24zJywgLSB3LCBoLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ240JywgdywgaCwgLSAxICk7XG5cblx0XHQvLyBmYXJcblxuXHRcdHNldFBvaW50KCAnZjEnLCAtIHcsIC0gaCwgMSApO1xuXHRcdHNldFBvaW50KCAnZjInLCB3LCAtIGgsIDEgKTtcblx0XHRzZXRQb2ludCggJ2YzJywgLSB3LCBoLCAxICk7XG5cdFx0c2V0UG9pbnQoICdmNCcsIHcsIGgsIDEgKTtcblxuXHRcdC8vIHVwXG5cblx0XHRzZXRQb2ludCggJ3UxJywgdyAqIDAuNywgaCAqIDEuMSwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICd1MicsIC0gdyAqIDAuNywgaCAqIDEuMSwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICd1MycsIDAsIGggKiAyLCAtIDEgKTtcblxuXHRcdC8vIGNyb3NzXG5cblx0XHRzZXRQb2ludCggJ2NmMScsIC0gdywgMCwgMSApO1xuXHRcdHNldFBvaW50KCAnY2YyJywgdywgMCwgMSApO1xuXHRcdHNldFBvaW50KCAnY2YzJywgMCwgLSBoLCAxICk7XG5cdFx0c2V0UG9pbnQoICdjZjQnLCAwLCBoLCAxICk7XG5cblx0XHRzZXRQb2ludCggJ2NuMScsIC0gdywgMCwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICdjbjInLCB3LCAwLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ2NuMycsIDAsIC0gaCwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICdjbjQnLCAwLCBoLCAtIDEgKTtcblxuXHRcdGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHR9O1xuXG59KCk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHA6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5mdW5jdGlvbiBCb3hIZWxwZXIoIG9iamVjdCwgY29sb3IgKSB7XG5cblx0dGhpcy5vYmplY3QgPSBvYmplY3Q7XG5cblx0aWYgKCBjb2xvciA9PT0gdW5kZWZpbmVkICkgY29sb3IgPSAweGZmZmYwMDtcblxuXHR2YXIgaW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheSggWyAwLCAxLCAxLCAyLCAyLCAzLCAzLCAwLCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA0LCAwLCA0LCAxLCA1LCAyLCA2LCAzLCA3IF0gKTtcblx0dmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoIDggKiAzICk7XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdGdlb21ldHJ5LnNldEluZGV4KCBuZXcgQnVmZmVyQXR0cmlidXRlKCBpbmRpY2VzLCAxICkgKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKSApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciB9ICkgKTtcblxuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHR0aGlzLnVwZGF0ZSgpO1xuXG59XG5cbkJveEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5Cb3hIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQm94SGVscGVyO1xuXG5Cb3hIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9ICggZnVuY3Rpb24gKCkge1xuXG5cdHZhciBib3ggPSBuZXcgQm94MygpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoIG9iamVjdCApIHtcblxuXHRcdGlmICggb2JqZWN0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveEhlbHBlcjogLnVwZGF0ZSgpIGhhcyBubyBsb25nZXIgYXJndW1lbnRzLicgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5vYmplY3QgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ym94LnNldEZyb21PYmplY3QoIHRoaXMub2JqZWN0ICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGJveC5pc0VtcHR5KCkgKSByZXR1cm47XG5cblx0XHR2YXIgbWluID0gYm94Lm1pbjtcblx0XHR2YXIgbWF4ID0gYm94Lm1heDtcblxuXHRcdC8qXG5cdFx0ICA1X19fXzRcblx0XHQxL19fXzAvfFxuXHRcdHwgNl9ffF83XG5cdFx0Mi9fX18zL1xuXG5cdFx0MDogbWF4LngsIG1heC55LCBtYXguelxuXHRcdDE6IG1pbi54LCBtYXgueSwgbWF4Lnpcblx0XHQyOiBtaW4ueCwgbWluLnksIG1heC56XG5cdFx0MzogbWF4LngsIG1pbi55LCBtYXguelxuXHRcdDQ6IG1heC54LCBtYXgueSwgbWluLnpcblx0XHQ1OiBtaW4ueCwgbWF4LnksIG1pbi56XG5cdFx0NjogbWluLngsIG1pbi55LCBtaW4uelxuXHRcdDc6IG1heC54LCBtaW4ueSwgbWluLnpcblx0XHQqL1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHRcdHZhciBhcnJheSA9IHBvc2l0aW9uLmFycmF5O1xuXG5cdFx0YXJyYXlbIDAgXSA9IG1heC54OyBhcnJheVsgMSBdID0gbWF4Lnk7IGFycmF5WyAyIF0gPSBtYXguejtcblx0XHRhcnJheVsgMyBdID0gbWluLng7IGFycmF5WyA0IF0gPSBtYXgueTsgYXJyYXlbIDUgXSA9IG1heC56O1xuXHRcdGFycmF5WyA2IF0gPSBtaW4ueDsgYXJyYXlbIDcgXSA9IG1pbi55OyBhcnJheVsgOCBdID0gbWF4Lno7XG5cdFx0YXJyYXlbIDkgXSA9IG1heC54OyBhcnJheVsgMTAgXSA9IG1pbi55OyBhcnJheVsgMTEgXSA9IG1heC56O1xuXHRcdGFycmF5WyAxMiBdID0gbWF4Lng7IGFycmF5WyAxMyBdID0gbWF4Lnk7IGFycmF5WyAxNCBdID0gbWluLno7XG5cdFx0YXJyYXlbIDE1IF0gPSBtaW4ueDsgYXJyYXlbIDE2IF0gPSBtYXgueTsgYXJyYXlbIDE3IF0gPSBtaW4uejtcblx0XHRhcnJheVsgMTggXSA9IG1pbi54OyBhcnJheVsgMTkgXSA9IG1pbi55OyBhcnJheVsgMjAgXSA9IG1pbi56O1xuXHRcdGFycmF5WyAyMSBdID0gbWF4Lng7IGFycmF5WyAyMiBdID0gbWluLnk7IGFycmF5WyAyMyBdID0gbWluLno7XG5cblx0XHRwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR0aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdH07XG5cbn0gKSgpO1xuXG5Cb3hIZWxwZXIucHJvdG90eXBlLnNldEZyb21PYmplY3QgPSBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHR0aGlzLm9iamVjdCA9IG9iamVjdDtcblx0dGhpcy51cGRhdGUoKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBCb3gzSGVscGVyKCBib3gsIGhleCApIHtcblxuXHR0aGlzLnR5cGUgPSAnQm94M0hlbHBlcic7XG5cblx0dGhpcy5ib3ggPSBib3g7XG5cblx0dmFyIGNvbG9yID0gKCBoZXggIT09IHVuZGVmaW5lZCApID8gaGV4IDogMHhmZmZmMDA7XG5cblx0dmFyIGluZGljZXMgPSBuZXcgVWludDE2QXJyYXkoIFsgMCwgMSwgMSwgMiwgMiwgMywgMywgMCwgNCwgNSwgNSwgNiwgNiwgNywgNywgNCwgMCwgNCwgMSwgNSwgMiwgNiwgMywgNyBdICk7XG5cblx0dmFyIHBvc2l0aW9ucyA9IFsgMSwgMSwgMSwgLSAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgMSwgLSAxLCAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgLSAxLCAtIDEsIC0gMSwgLSAxLCAxLCAtIDEsIC0gMSBdO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdGdlb21ldHJ5LnNldEluZGV4KCBuZXcgQnVmZmVyQXR0cmlidXRlKCBpbmRpY2VzLCAxICkgKTtcblxuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKSApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciB9ICkgKTtcblxuXHR0aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG59XG5cbkJveDNIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApO1xuQm94M0hlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCb3gzSGVscGVyO1xuXG5Cb3gzSGVscGVyLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZCA9IGZ1bmN0aW9uICggZm9yY2UgKSB7XG5cblx0dmFyIGJveCA9IHRoaXMuYm94O1xuXG5cdGlmICggYm94LmlzRW1wdHkoKSApIHJldHVybjtcblxuXHRib3guZ2V0Q2VudGVyKCB0aGlzLnBvc2l0aW9uICk7XG5cblx0Ym94LmdldFNpemUoIHRoaXMuc2NhbGUgKTtcblxuXHR0aGlzLnNjYWxlLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblxuXHRPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBQbGFuZUhlbHBlciggcGxhbmUsIHNpemUsIGhleCApIHtcblxuXHR0aGlzLnR5cGUgPSAnUGxhbmVIZWxwZXInO1xuXG5cdHRoaXMucGxhbmUgPSBwbGFuZTtcblxuXHR0aGlzLnNpemUgPSAoIHNpemUgPT09IHVuZGVmaW5lZCApID8gMSA6IHNpemU7XG5cblx0dmFyIGNvbG9yID0gKCBoZXggIT09IHVuZGVmaW5lZCApID8gaGV4IDogMHhmZmZmMDA7XG5cblx0dmFyIHBvc2l0aW9ucyA9IFsgMSwgLSAxLCAxLCAtIDEsIDEsIDEsIC0gMSwgLSAxLCAxLCAxLCAxLCAxLCAtIDEsIDEsIDEsIC0gMSwgLSAxLCAxLCAxLCAtIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDEsIDAsIDAsIDAgXTtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkgKTtcblx0Z2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0TGluZS5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciB9ICkgKTtcblxuXHQvL1xuXG5cdHZhciBwb3NpdGlvbnMyID0gWyAxLCAxLCAxLCAtIDEsIDEsIDEsIC0gMSwgLSAxLCAxLCAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgMSwgLSAxLCAxIF07XG5cblx0dmFyIGdlb21ldHJ5MiA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRnZW9tZXRyeTIuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zMiwgMyApICk7XG5cdGdlb21ldHJ5Mi5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHR0aGlzLmFkZCggbmV3IE1lc2goIGdlb21ldHJ5MiwgbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciwgb3BhY2l0eTogMC4yLCB0cmFuc3BhcmVudDogdHJ1ZSwgZGVwdGhXcml0ZTogZmFsc2UgfSApICkgKTtcblxufVxuXG5QbGFuZUhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lLnByb3RvdHlwZSApO1xuUGxhbmVIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGxhbmVIZWxwZXI7XG5cblBsYW5lSGVscGVyLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZCA9IGZ1bmN0aW9uICggZm9yY2UgKSB7XG5cblx0dmFyIHNjYWxlID0gLSB0aGlzLnBsYW5lLmNvbnN0YW50O1xuXG5cdGlmICggTWF0aC5hYnMoIHNjYWxlICkgPCAxZS04ICkgc2NhbGUgPSAxZS04OyAvLyBzaWduIGRvZXMgbm90IG1hdHRlclxuXG5cdHRoaXMuc2NhbGUuc2V0KCAwLjUgKiB0aGlzLnNpemUsIDAuNSAqIHRoaXMuc2l6ZSwgc2NhbGUgKTtcblxuXHR0aGlzLmxvb2tBdCggdGhpcy5wbGFuZS5ub3JtYWwgKTtcblxuXHRPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly9naXRodWIuY29tL3p6ODVcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqXG4gKiBDcmVhdGVzIGFuIGFycm93IGZvciB2aXN1YWxpemluZyBkaXJlY3Rpb25zXG4gKlxuICogUGFyYW1ldGVyczpcbiAqICBkaXIgLSBWZWN0b3IzXG4gKiAgb3JpZ2luIC0gVmVjdG9yM1xuICogIGxlbmd0aCAtIE51bWJlclxuICogIGNvbG9yIC0gY29sb3IgaW4gaGV4IHZhbHVlXG4gKiAgaGVhZExlbmd0aCAtIE51bWJlclxuICogIGhlYWRXaWR0aCAtIE51bWJlclxuICovXG5cbnZhciBsaW5lR2VvbWV0cnk7XG52YXIgY29uZUdlb21ldHJ5O1xuXG5mdW5jdGlvbiBBcnJvd0hlbHBlciggZGlyLCBvcmlnaW4sIGxlbmd0aCwgY29sb3IsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApIHtcblxuXHQvLyBkaXIgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkXG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdGlmICggY29sb3IgPT09IHVuZGVmaW5lZCApIGNvbG9yID0gMHhmZmZmMDA7XG5cdGlmICggbGVuZ3RoID09PSB1bmRlZmluZWQgKSBsZW5ndGggPSAxO1xuXHRpZiAoIGhlYWRMZW5ndGggPT09IHVuZGVmaW5lZCApIGhlYWRMZW5ndGggPSAwLjIgKiBsZW5ndGg7XG5cdGlmICggaGVhZFdpZHRoID09PSB1bmRlZmluZWQgKSBoZWFkV2lkdGggPSAwLjIgKiBoZWFkTGVuZ3RoO1xuXG5cdGlmICggbGluZUdlb21ldHJ5ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRsaW5lR2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0XHRsaW5lR2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggWyAwLCAwLCAwLCAwLCAxLCAwIF0sIDMgKSApO1xuXG5cdFx0Y29uZUdlb21ldHJ5ID0gbmV3IEN5bGluZGVyQnVmZmVyR2VvbWV0cnkoIDAsIDAuNSwgMSwgNSwgMSApO1xuXHRcdGNvbmVHZW9tZXRyeS50cmFuc2xhdGUoIDAsIC0gMC41LCAwICk7XG5cblx0fVxuXG5cdHRoaXMucG9zaXRpb24uY29weSggb3JpZ2luICk7XG5cblx0dGhpcy5saW5lID0gbmV3IExpbmUoIGxpbmVHZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciB9ICkgKTtcblx0dGhpcy5saW5lLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5hZGQoIHRoaXMubGluZSApO1xuXG5cdHRoaXMuY29uZSA9IG5ldyBNZXNoKCBjb25lR2VvbWV0cnksIG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IgfSApICk7XG5cdHRoaXMuY29uZS5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMuYWRkKCB0aGlzLmNvbmUgKTtcblxuXHR0aGlzLnNldERpcmVjdGlvbiggZGlyICk7XG5cdHRoaXMuc2V0TGVuZ3RoKCBsZW5ndGgsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApO1xuXG59XG5cbkFycm93SGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApO1xuQXJyb3dIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQXJyb3dIZWxwZXI7XG5cbkFycm93SGVscGVyLnByb3RvdHlwZS5zZXREaXJlY3Rpb24gPSAoIGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgYXhpcyA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciByYWRpYW5zO1xuXG5cdHJldHVybiBmdW5jdGlvbiBzZXREaXJlY3Rpb24oIGRpciApIHtcblxuXHRcdC8vIGRpciBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRcdGlmICggZGlyLnkgPiAwLjk5OTk5ICkge1xuXG5cdFx0XHR0aGlzLnF1YXRlcm5pb24uc2V0KCAwLCAwLCAwLCAxICk7XG5cblx0XHR9IGVsc2UgaWYgKCBkaXIueSA8IC0gMC45OTk5OSApIHtcblxuXHRcdFx0dGhpcy5xdWF0ZXJuaW9uLnNldCggMSwgMCwgMCwgMCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0YXhpcy5zZXQoIGRpci56LCAwLCAtIGRpci54ICkubm9ybWFsaXplKCk7XG5cblx0XHRcdHJhZGlhbnMgPSBNYXRoLmFjb3MoIGRpci55ICk7XG5cblx0XHRcdHRoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCByYWRpYW5zICk7XG5cblx0XHR9XG5cblx0fTtcblxufSgpICk7XG5cbkFycm93SGVscGVyLnByb3RvdHlwZS5zZXRMZW5ndGggPSBmdW5jdGlvbiAoIGxlbmd0aCwgaGVhZExlbmd0aCwgaGVhZFdpZHRoICkge1xuXG5cdGlmICggaGVhZExlbmd0aCA9PT0gdW5kZWZpbmVkICkgaGVhZExlbmd0aCA9IDAuMiAqIGxlbmd0aDtcblx0aWYgKCBoZWFkV2lkdGggPT09IHVuZGVmaW5lZCApIGhlYWRXaWR0aCA9IDAuMiAqIGhlYWRMZW5ndGg7XG5cblx0dGhpcy5saW5lLnNjYWxlLnNldCggMSwgTWF0aC5tYXgoIDAsIGxlbmd0aCAtIGhlYWRMZW5ndGggKSwgMSApO1xuXHR0aGlzLmxpbmUudXBkYXRlTWF0cml4KCk7XG5cblx0dGhpcy5jb25lLnNjYWxlLnNldCggaGVhZFdpZHRoLCBoZWFkTGVuZ3RoLCBoZWFkV2lkdGggKTtcblx0dGhpcy5jb25lLnBvc2l0aW9uLnkgPSBsZW5ndGg7XG5cdHRoaXMuY29uZS51cGRhdGVNYXRyaXgoKTtcblxufTtcblxuQXJyb3dIZWxwZXIucHJvdG90eXBlLnNldENvbG9yID0gZnVuY3Rpb24gKCBjb2xvciApIHtcblxuXHR0aGlzLmxpbmUubWF0ZXJpYWwuY29sb3IuY29weSggY29sb3IgKTtcblx0dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIGNvbG9yICk7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBzcm91Y2hlcmF5IC8gaHR0cDovL3Nyb3VjaGVyYXkub3JnL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBBeGVzSGVscGVyKCBzaXplICkge1xuXG5cdHNpemUgPSBzaXplIHx8IDE7XG5cblx0dmFyIHZlcnRpY2VzID0gW1xuXHRcdDAsIDAsIDAsXHRzaXplLCAwLCAwLFxuXHRcdDAsIDAsIDAsXHQwLCBzaXplLCAwLFxuXHRcdDAsIDAsIDAsXHQwLCAwLCBzaXplXG5cdF07XG5cblx0dmFyIGNvbG9ycyA9IFtcblx0XHQxLCAwLCAwLFx0MSwgMC42LCAwLFxuXHRcdDAsIDEsIDAsXHQwLjYsIDEsIDAsXG5cdFx0MCwgMCwgMSxcdDAsIDAuNiwgMVxuXHRdO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XG5cblx0dmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IHZlcnRleENvbG9yczogVmVydGV4Q29sb3JzIH0gKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cbn1cblxuQXhlc0hlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5BeGVzSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEF4ZXNIZWxwZXI7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBGYWNlNCggYSwgYiwgYywgZCwgbm9ybWFsLCBjb2xvciwgbWF0ZXJpYWxJbmRleCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5GYWNlNCBoYXMgYmVlbiByZW1vdmVkLiBBIFRIUkVFLkZhY2UzIHdpbGwgYmUgY3JlYXRlZCBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBGYWNlMyggYSwgYiwgYywgbm9ybWFsLCBjb2xvciwgbWF0ZXJpYWxJbmRleCApO1xuXG59XG5cbnZhciBMaW5lU3RyaXAgPSAwO1xuXG52YXIgTGluZVBpZWNlcyA9IDE7XG5cbmZ1bmN0aW9uIE1lc2hGYWNlTWF0ZXJpYWwoIG1hdGVyaWFscyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5NZXNoRmFjZU1hdGVyaWFsIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBhbiBBcnJheSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG1hdGVyaWFscztcblxufVxuXG5mdW5jdGlvbiBNdWx0aU1hdGVyaWFsKCBtYXRlcmlhbHMgKSB7XG5cblx0aWYgKCBtYXRlcmlhbHMgPT09IHVuZGVmaW5lZCApIG1hdGVyaWFscyA9IFtdO1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLk11bHRpTWF0ZXJpYWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGFuIEFycmF5IGluc3RlYWQuJyApO1xuXHRtYXRlcmlhbHMuaXNNdWx0aU1hdGVyaWFsID0gdHJ1ZTtcblx0bWF0ZXJpYWxzLm1hdGVyaWFscyA9IG1hdGVyaWFscztcblx0bWF0ZXJpYWxzLmNsb25lID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG1hdGVyaWFscy5zbGljZSgpO1xuXG5cdH07XG5cdHJldHVybiBtYXRlcmlhbHM7XG5cbn1cblxuZnVuY3Rpb24gUG9pbnRDbG91ZCggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlBvaW50Q2xvdWQgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHMuJyApO1xuXHRyZXR1cm4gbmV3IFBvaW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cbn1cblxuZnVuY3Rpb24gUGFydGljbGUoIG1hdGVyaWFsICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlBhcnRpY2xlIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuU3ByaXRlLicgKTtcblx0cmV0dXJuIG5ldyBTcHJpdGUoIG1hdGVyaWFsICk7XG5cbn1cblxuZnVuY3Rpb24gUGFydGljbGVTeXN0ZW0oIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5QYXJ0aWNsZVN5c3RlbSBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50cy4nICk7XG5cdHJldHVybiBuZXcgUG9pbnRzKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxufVxuXG5mdW5jdGlvbiBQb2ludENsb3VkTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUG9pbnRDbG91ZE1hdGVyaWFsIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzTWF0ZXJpYWwuJyApO1xuXHRyZXR1cm4gbmV3IFBvaW50c01hdGVyaWFsKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuZnVuY3Rpb24gUGFydGljbGVCYXNpY01hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlBhcnRpY2xlQmFzaWNNYXRlcmlhbCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50c01hdGVyaWFsLicgKTtcblx0cmV0dXJuIG5ldyBQb2ludHNNYXRlcmlhbCggcGFyYW1ldGVycyApO1xuXG59XG5cbmZ1bmN0aW9uIFBhcnRpY2xlU3lzdGVtTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGFydGljbGVTeXN0ZW1NYXRlcmlhbCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50c01hdGVyaWFsLicgKTtcblx0cmV0dXJuIG5ldyBQb2ludHNNYXRlcmlhbCggcGFyYW1ldGVycyApO1xuXG59XG5cbmZ1bmN0aW9uIFZlcnRleCggeCwgeSwgeiApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5WZXJ0ZXggaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLlZlY3RvcjMgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgVmVjdG9yMyggeCwgeSwgeiApO1xuXG59XG5cbi8vXG5cbmZ1bmN0aW9uIER5bmFtaWNCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5EeW5hbWljQnVmZmVyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKCkuc2V0RHluYW1pYyggdHJ1ZSApIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkuc2V0RHluYW1pYyggdHJ1ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEludDhBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5JbnQ4QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuSW50OEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEludDhCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIFVpbnQ4QXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVWludDhBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50OEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IFVpbnQ4QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBVaW50OENsYW1wZWRBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5VaW50OENsYW1wZWRBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEludDE2QXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuSW50MTZBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5JbnQxNkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEludDE2QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBVaW50MTZBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5VaW50MTZBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50MTZCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBVaW50MTZCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEludDMyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuSW50MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5JbnQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEludDMyQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBVaW50MzJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5VaW50MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50MzJCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBVaW50MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEZsb2F0MzJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5GbG9hdDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEZsb2F0NjRBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5GbG9hdDY0QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbi8vXG5cbkN1cnZlLmNyZWF0ZSA9IGZ1bmN0aW9uICggY29uc3RydWN0LCBnZXRQb2ludCApIHtcblxuXHRjb25zb2xlLmxvZyggJ1RIUkVFLkN1cnZlLmNyZWF0ZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQnICk7XG5cblx0Y29uc3RydWN0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuXHRjb25zdHJ1Y3QucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0O1xuXHRjb25zdHJ1Y3QucHJvdG90eXBlLmdldFBvaW50ID0gZ2V0UG9pbnQ7XG5cblx0cmV0dXJuIGNvbnN0cnVjdDtcblxufTtcblxuLy9cblxuT2JqZWN0LmFzc2lnbiggQ3VydmVQYXRoLnByb3RvdHlwZSwge1xuXG5cdGNyZWF0ZVBvaW50c0dlb21ldHJ5OiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZlUGF0aDogLmNyZWF0ZVBvaW50c0dlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5HZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIHBvaW50cyApIGluc3RlYWQuJyApO1xuXG5cdFx0Ly8gZ2VuZXJhdGUgZ2VvbWV0cnkgZnJvbSBwYXRoIHBvaW50cyAoZm9yIExpbmUgb3IgUG9pbnRzIG9iamVjdHMpXG5cblx0XHR2YXIgcHRzID0gdGhpcy5nZXRQb2ludHMoIGRpdmlzaW9ucyApO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUdlb21ldHJ5KCBwdHMgKTtcblxuXHR9LFxuXG5cdGNyZWF0ZVNwYWNlZFBvaW50c0dlb21ldHJ5OiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZlUGF0aDogLmNyZWF0ZVNwYWNlZFBvaW50c0dlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5HZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIHBvaW50cyApIGluc3RlYWQuJyApO1xuXG5cdFx0Ly8gZ2VuZXJhdGUgZ2VvbWV0cnkgZnJvbSBlcXVpZGlzdGFudCBzYW1wbGluZyBhbG9uZyB0aGUgcGF0aFxuXG5cdFx0dmFyIHB0cyA9IHRoaXMuZ2V0U3BhY2VkUG9pbnRzKCBkaXZpc2lvbnMgKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVHZW9tZXRyeSggcHRzICk7XG5cblx0fSxcblxuXHRjcmVhdGVHZW9tZXRyeTogZnVuY3Rpb24gKCBwb2ludHMgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5DdXJ2ZVBhdGg6IC5jcmVhdGVHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKSBpbnN0ZWFkLicgKTtcblxuXHRcdHZhciBnZW9tZXRyeSA9IG5ldyBHZW9tZXRyeSgpO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBwb2ludCA9IHBvaW50c1sgaSBdO1xuXHRcdFx0Z2VvbWV0cnkudmVydGljZXMucHVzaCggbmV3IFZlY3RvcjMoIHBvaW50LngsIHBvaW50LnksIHBvaW50LnogfHwgMCApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZ2VvbWV0cnk7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5hc3NpZ24oIFBhdGgucHJvdG90eXBlLCB7XG5cblx0ZnJvbVBvaW50czogZnVuY3Rpb24gKCBwb2ludHMgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5QYXRoOiAuZnJvbVBvaW50cygpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21Qb2ludHMoKS4nICk7XG5cdFx0dGhpcy5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKTtcblxuXHR9XG5cbn0gKTtcblxuLy9cblxuZnVuY3Rpb24gQ2xvc2VkU3BsaW5lQ3VydmUzKCBwb2ludHMgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ2xvc2VkU3BsaW5lQ3VydmUzIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5DYXRtdWxsUm9tQ3VydmUzIGluc3RlYWQuJyApO1xuXG5cdENhdG11bGxSb21DdXJ2ZTMuY2FsbCggdGhpcywgcG9pbnRzICk7XG5cdHRoaXMudHlwZSA9ICdjYXRtdWxscm9tJztcblx0dGhpcy5jbG9zZWQgPSB0cnVlO1xuXG59XG5cbkNsb3NlZFNwbGluZUN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZSApO1xuXG4vL1xuXG5mdW5jdGlvbiBTcGxpbmVDdXJ2ZTMoIHBvaW50cyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5TcGxpbmVDdXJ2ZTMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTMgaW5zdGVhZC4nICk7XG5cblx0Q2F0bXVsbFJvbUN1cnZlMy5jYWxsKCB0aGlzLCBwb2ludHMgKTtcblx0dGhpcy50eXBlID0gJ2NhdG11bGxyb20nO1xuXG59XG5cblNwbGluZUN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZSApO1xuXG4vL1xuXG5mdW5jdGlvbiBTcGxpbmUoIHBvaW50cyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5TcGxpbmUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTMgaW5zdGVhZC4nICk7XG5cblx0Q2F0bXVsbFJvbUN1cnZlMy5jYWxsKCB0aGlzLCBwb2ludHMgKTtcblx0dGhpcy50eXBlID0gJ2NhdG11bGxyb20nO1xuXG59XG5cblNwbGluZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZSApO1xuXG5PYmplY3QuYXNzaWduKCBTcGxpbmUucHJvdG90eXBlLCB7XG5cblx0aW5pdEZyb21BcnJheTogZnVuY3Rpb24gKCAvKiBhICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNwbGluZTogLmluaXRGcm9tQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRnZXRDb250cm9sUG9pbnRzQXJyYXk6IGZ1bmN0aW9uICggLyogb3B0aW9uYWxUYXJnZXQgKi8gKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuU3BsaW5lOiAuZ2V0Q29udHJvbFBvaW50c0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0cmVwYXJhbWV0cml6ZUJ5QXJjTGVuZ3RoOiBmdW5jdGlvbiAoIC8qIHNhbXBsaW5nQ29lZiAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5TcGxpbmU6IC5yZXBhcmFtZXRyaXplQnlBcmNMZW5ndGgoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9XG5cbn0gKTtcblxuLy9cblxuZnVuY3Rpb24gQXhpc0hlbHBlciggc2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5BeGlzSGVscGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuQXhlc0hlbHBlci4nICk7XG5cdHJldHVybiBuZXcgQXhlc0hlbHBlciggc2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEJvdW5kaW5nQm94SGVscGVyKCBvYmplY3QsIGNvbG9yICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkJvdW5kaW5nQm94SGVscGVyIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIENyZWF0aW5nIGEgVEhSRUUuQm94SGVscGVyIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEJveEhlbHBlciggb2JqZWN0LCBjb2xvciApO1xuXG59XG5cbmZ1bmN0aW9uIEVkZ2VzSGVscGVyKCBvYmplY3QsIGhleCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5FZGdlc0hlbHBlciBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuRWRnZXNHZW9tZXRyeSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBMaW5lU2VnbWVudHMoIG5ldyBFZGdlc0dlb21ldHJ5KCBvYmplY3QuZ2VvbWV0cnkgKSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBoZXggIT09IHVuZGVmaW5lZCA/IGhleCA6IDB4ZmZmZmZmIH0gKSApO1xuXG59XG5cbkdyaWRIZWxwZXIucHJvdG90eXBlLnNldENvbG9ycyA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuR3JpZEhlbHBlcjogc2V0Q29sb3JzKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCwgcGFzcyB0aGVtIGluIHRoZSBjb25zdHJ1Y3RvciBpbnN0ZWFkLicgKTtcblxufTtcblxuU2tlbGV0b25IZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuU2tlbGV0b25IZWxwZXI6IHVwZGF0ZSgpIG5vIGxvbmdlciBuZWVkcyB0byBiZSBjYWxsZWQuJyApO1xuXG59O1xuXG5mdW5jdGlvbiBXaXJlZnJhbWVIZWxwZXIoIG9iamVjdCwgaGV4ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLldpcmVmcmFtZUhlbHBlciBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuV2lyZWZyYW1lR2VvbWV0cnkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgTGluZVNlZ21lbnRzKCBuZXcgV2lyZWZyYW1lR2VvbWV0cnkoIG9iamVjdC5nZW9tZXRyeSApLCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGhleCAhPT0gdW5kZWZpbmVkID8gaGV4IDogMHhmZmZmZmYgfSApICk7XG5cbn1cblxuLy9cblxuT2JqZWN0LmFzc2lnbiggTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGV4dHJhY3RVcmxCYXNlOiBmdW5jdGlvbiAoIHVybCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxvYWRlcjogLmV4dHJhY3RVcmxCYXNlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkxvYWRlclV0aWxzLmV4dHJhY3RVcmxCYXNlKCkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIExvYWRlclV0aWxzLmV4dHJhY3RVcmxCYXNlKCB1cmwgKTtcblxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gWEhSTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlhIUkxvYWRlciBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLkZpbGVMb2FkZXIuJyApO1xuXHRyZXR1cm4gbmV3IEZpbGVMb2FkZXIoIG1hbmFnZXIgKTtcblxufVxuXG5mdW5jdGlvbiBCaW5hcnlUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkJpbmFyeVRleHR1cmVMb2FkZXIgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5EYXRhVGV4dHVyZUxvYWRlci4nICk7XG5cdHJldHVybiBuZXcgRGF0YVRleHR1cmVMb2FkZXIoIG1hbmFnZXIgKTtcblxufVxuXG4vL1xuXG5PYmplY3QuYXNzaWduKCBCb3gyLnByb3RvdHlwZSwge1xuXG5cdGNlbnRlcjogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5jZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKCBvcHRpb25hbFRhcmdldCApO1xuXG5cdH0sXG5cdGVtcHR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuZW1wdHkoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pc0VtcHR5KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmlzRW1wdHkoKTtcblxuXHR9LFxuXHRpc0ludGVyc2VjdGlvbkJveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNCb3goIGJveCApO1xuXG5cdH0sXG5cdHNpemU6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuc2l6ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFNpemUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0U2l6ZSggb3B0aW9uYWxUYXJnZXQgKTtcblxuXHR9XG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEJveDMucHJvdG90eXBlLCB7XG5cblx0Y2VudGVyOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRDZW50ZXIoIG9wdGlvbmFsVGFyZ2V0ICk7XG5cblx0fSxcblx0ZW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5lbXB0eSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmlzRW1wdHkoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaXNFbXB0eSgpO1xuXG5cdH0sXG5cdGlzSW50ZXJzZWN0aW9uQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5pc0ludGVyc2VjdGlvbkJveCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNCb3goKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0JveCggYm94ICk7XG5cblx0fSxcblx0aXNJbnRlcnNlY3Rpb25TcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmlzSW50ZXJzZWN0aW9uU3BoZXJlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c1NwaGVyZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKTtcblxuXHR9LFxuXHRzaXplOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLnNpemUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRTaXplKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldFNpemUoIG9wdGlvbmFsVGFyZ2V0ICk7XG5cblx0fVxufSApO1xuXG5MaW5lMy5wcm90b3R5cGUuY2VudGVyID0gZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lMzogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLicgKTtcblx0cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKCBvcHRpb25hbFRhcmdldCApO1xuXG59O1xuXG5PYmplY3QuYXNzaWduKCBfTWF0aCwge1xuXG5cdHJhbmRvbTE2OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRoOiAucmFuZG9tMTYoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgTWF0aC5yYW5kb20oKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gTWF0aC5yYW5kb20oKTtcblxuXHR9LFxuXG5cdG5lYXJlc3RQb3dlck9mVHdvOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0aDogLm5lYXJlc3RQb3dlck9mVHdvKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZmxvb3JQb3dlck9mVHdvKCkuJyApO1xuXHRcdHJldHVybiBfTWF0aC5mbG9vclBvd2VyT2ZUd28oIHZhbHVlICk7XG5cblx0fSxcblxuXHRuZXh0UG93ZXJPZlR3bzogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGg6IC5uZXh0UG93ZXJPZlR3bygpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmNlaWxQb3dlck9mVHdvKCkuJyApO1xuXHRcdHJldHVybiBfTWF0aC5jZWlsUG93ZXJPZlR3byggdmFsdWUgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggTWF0cml4My5wcm90b3R5cGUsIHtcblxuXHRmbGF0dGVuVG9BcnJheU9mZnNldDogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLk1hdHJpeDM6IC5mbGF0dGVuVG9BcnJheU9mZnNldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudG9BcnJheSgpIGluc3RlYWQuXCIgKTtcblx0XHRyZXR1cm4gdGhpcy50b0FycmF5KCBhcnJheSwgb2Zmc2V0ICk7XG5cblx0fSxcblx0bXVsdGlwbHlWZWN0b3IzOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDM6IC5tdWx0aXBseVZlY3RvcjMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4MyggbWF0cml4ICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDMoIHRoaXMgKTtcblxuXHR9LFxuXHRtdWx0aXBseVZlY3RvcjNBcnJheTogZnVuY3Rpb24gKCAvKiBhICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDM6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdGFwcGx5VG9CdWZmZXI6IGZ1bmN0aW9uICggYnVmZmVyIC8qLCBvZmZzZXQsIGxlbmd0aCAqLyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDM6IC5hcHBseVRvQnVmZmVyKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBidWZmZXIgKTtcblxuXHR9LFxuXHRhcHBseVRvVmVjdG9yM0FycmF5OiBmdW5jdGlvbiAoIC8qIGFycmF5LCBvZmZzZXQsIGxlbmd0aCAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXgzOiAuYXBwbHlUb1ZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBNYXRyaXg0LnByb3RvdHlwZSwge1xuXG5cdGV4dHJhY3RQb3NpdGlvbjogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLmV4dHJhY3RQb3NpdGlvbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmNvcHlQb3NpdGlvbigpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5jb3B5UG9zaXRpb24oIG0gKTtcblxuXHR9LFxuXHRmbGF0dGVuVG9BcnJheU9mZnNldDogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLk1hdHJpeDQ6IC5mbGF0dGVuVG9BcnJheU9mZnNldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudG9BcnJheSgpIGluc3RlYWQuXCIgKTtcblx0XHRyZXR1cm4gdGhpcy50b0FycmF5KCBhcnJheSwgb2Zmc2V0ICk7XG5cblx0fSxcblx0Z2V0UG9zaXRpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRQb3NpdGlvbigpIHtcblxuXHRcdFx0aWYgKCB2MSA9PT0gdW5kZWZpbmVkICkgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLmdldFBvc2l0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB2MS5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAzICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblx0c2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLnNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbigpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbiggcSApO1xuXG5cdH0sXG5cdG11bHRpcGx5VG9BcnJheTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VG9BcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdG11bHRpcGx5VmVjdG9yMzogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCB0aGlzICk7XG5cblx0fSxcblx0bXVsdGlwbHlWZWN0b3I0OiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVZlY3RvcjQoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4NCggbWF0cml4ICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIHRoaXMgKTtcblxuXHR9LFxuXHRtdWx0aXBseVZlY3RvcjNBcnJheTogZnVuY3Rpb24gKCAvKiBhICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHJvdGF0ZUF4aXM6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5yb3RhdGVBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMudHJhbnNmb3JtRGlyZWN0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLicgKTtcblx0XHR2LnRyYW5zZm9ybURpcmVjdGlvbiggdGhpcyApO1xuXG5cdH0sXG5cdGNyb3NzVmVjdG9yOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5jcm9zc1ZlY3RvcigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4NCggdGhpcyApO1xuXG5cdH0sXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC50cmFuc2xhdGUoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRyb3RhdGVYOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnJvdGF0ZVgoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRyb3RhdGVZOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnJvdGF0ZVkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRyb3RhdGVaOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnJvdGF0ZVooKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRyb3RhdGVCeUF4aXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlQnlBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0YXBwbHlUb0J1ZmZlcjogZnVuY3Rpb24gKCBidWZmZXIgLyosIG9mZnNldCwgbGVuZ3RoICovICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLmFwcGx5VG9CdWZmZXIoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbWF0cml4LmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB0aGlzLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGJ1ZmZlciApO1xuXG5cdH0sXG5cdGFwcGx5VG9WZWN0b3IzQXJyYXk6IGZ1bmN0aW9uICggLyogYXJyYXksIG9mZnNldCwgbGVuZ3RoICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5hcHBseVRvVmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0bWFrZUZydXN0dW06IGZ1bmN0aW9uICggbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubWFrZUZydXN0dW0oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLm1ha2VQZXJzcGVjdGl2ZSggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy5tYWtlUGVyc3BlY3RpdmUoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICk7XG5cblx0fVxuXG59ICk7XG5cblBsYW5lLnByb3RvdHlwZS5pc0ludGVyc2VjdGlvbkxpbmUgPSBmdW5jdGlvbiAoIGxpbmUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGxhbmU6IC5pc0ludGVyc2VjdGlvbkxpbmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzTGluZSgpLicgKTtcblx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0xpbmUoIGxpbmUgKTtcblxufTtcblxuUXVhdGVybmlvbi5wcm90b3R5cGUubXVsdGlwbHlWZWN0b3IzID0gZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUXVhdGVybmlvbjogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBpcyBub3cgdmVjdG9yLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbiApIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gdmVjdG9yLmFwcGx5UXVhdGVybmlvbiggdGhpcyApO1xuXG59O1xuXG5PYmplY3QuYXNzaWduKCBSYXkucHJvdG90eXBlLCB7XG5cblx0aXNJbnRlcnNlY3Rpb25Cb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNCb3goIGJveCApO1xuXG5cdH0sXG5cdGlzSW50ZXJzZWN0aW9uUGxhbmU6IGZ1bmN0aW9uICggcGxhbmUgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXk6IC5pc0ludGVyc2VjdGlvblBsYW5lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c1BsYW5lKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNQbGFuZSggcGxhbmUgKTtcblxuXHR9LFxuXHRpc0ludGVyc2VjdGlvblNwaGVyZTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXk6IC5pc0ludGVyc2VjdGlvblNwaGVyZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNTcGhlcmUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFRyaWFuZ2xlLnByb3RvdHlwZSwge1xuXG5cdGFyZWE6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuYXJlYSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldEFyZWEoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QXJlYSgpO1xuXG5cdH0sXG5cdGJhcnljb29yZEZyb21Qb2ludDogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5iYXJ5Y29vcmRGcm9tUG9pbnQoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRCYXJ5Y29vcmQoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QmFyeWNvb3JkKCBwb2ludCwgdGFyZ2V0ICk7XG5cblx0fSxcblx0bWlkcG9pbnQ6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5taWRwb2ludCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE1pZHBvaW50KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldE1pZHBvaW50KCB0YXJnZXQgKTtcblxuXHR9LFxuXHRub3JtYWw6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5ub3JtYWwoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXROb3JtYWwoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0Tm9ybWFsKCB0YXJnZXQgKTtcblxuXHR9LFxuXHRwbGFuZTogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLnBsYW5lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0UGxhbmUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0UGxhbmUoIHRhcmdldCApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBUcmlhbmdsZSwge1xuXG5cdGJhcnljb29yZEZyb21Qb2ludDogZnVuY3Rpb24gKCBwb2ludCwgYSwgYiwgYywgdGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5iYXJ5Y29vcmRGcm9tUG9pbnQoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRCYXJ5Y29vcmQoKS4nICk7XG5cdFx0cmV0dXJuIFRyaWFuZ2xlLmdldEJhcnljb29yZCggcG9pbnQsIGEsIGIsIGMsIHRhcmdldCApO1xuXG5cdH0sXG5cdG5vcm1hbDogZnVuY3Rpb24gKCBhLCBiLCBjLCB0YXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLm5vcm1hbCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE5vcm1hbCgpLicgKTtcblx0XHRyZXR1cm4gVHJpYW5nbGUuZ2V0Tm9ybWFsKCBhLCBiLCBjLCB0YXJnZXQgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggU2hhcGUucHJvdG90eXBlLCB7XG5cblx0ZXh0cmFjdEFsbFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5TaGFwZTogLmV4dHJhY3RBbGxQb2ludHMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLmV4dHJhY3RQb2ludHMoKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy5leHRyYWN0UG9pbnRzKCBkaXZpc2lvbnMgKTtcblxuXHR9LFxuXHRleHRydWRlOiBmdW5jdGlvbiAoIG9wdGlvbnMgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5TaGFwZTogLmV4dHJ1ZGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXh0cnVkZUdlb21ldHJ5KCkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIG5ldyBFeHRydWRlR2VvbWV0cnkoIHRoaXMsIG9wdGlvbnMgKTtcblxuXHR9LFxuXHRtYWtlR2VvbWV0cnk6IGZ1bmN0aW9uICggb3B0aW9ucyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNoYXBlOiAubWFrZUdlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFNoYXBlR2VvbWV0cnkoKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gbmV3IFNoYXBlR2VvbWV0cnkoIHRoaXMsIG9wdGlvbnMgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yMi5wcm90b3R5cGUsIHtcblxuXHRmcm9tQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjI6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKTtcblxuXHR9LFxuXHRkaXN0YW5jZVRvTWFuaGF0dGFuOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiAuZGlzdGFuY2VUb01hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkRpc3RhbmNlVG8oKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMubWFuaGF0dGFuRGlzdGFuY2VUbyggdiApO1xuXG5cdH0sXG5cdGxlbmd0aE1hbmhhdHRhbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogLmxlbmd0aE1hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkxlbmd0aCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5tYW5oYXR0YW5MZW5ndGgoKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yMy5wcm90b3R5cGUsIHtcblxuXHRzZXRFdWxlckZyb21Sb3RhdGlvbk1hdHJpeDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlZlY3RvcjM6IC5zZXRFdWxlckZyb21Sb3RhdGlvbk1hdHJpeCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFdWxlci5zZXRGcm9tUm90YXRpb25NYXRyaXgoKSBpbnN0ZWFkLicgKTtcblxuXHR9LFxuXHRzZXRFdWxlckZyb21RdWF0ZXJuaW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuVmVjdG9yMzogLnNldEV1bGVyRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXVsZXIuc2V0RnJvbVF1YXRlcm5pb24oKSBpbnN0ZWFkLicgKTtcblxuXHR9LFxuXHRnZXRQb3NpdGlvbkZyb21NYXRyaXg6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5nZXRQb3NpdGlvbkZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4UG9zaXRpb24oKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBtICk7XG5cblx0fSxcblx0Z2V0U2NhbGVGcm9tTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZ2V0U2NhbGVGcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeFNjYWxlKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLnNldEZyb21NYXRyaXhTY2FsZSggbSApO1xuXG5cdH0sXG5cdGdldENvbHVtbkZyb21NYXRyaXg6IGZ1bmN0aW9uICggaW5kZXgsIG1hdHJpeCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5nZXRDb2x1bW5Gcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeENvbHVtbigpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCBtYXRyaXgsIGluZGV4ICk7XG5cblx0fSxcblx0YXBwbHlQcm9qZWN0aW9uOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuYXBwbHlQcm9qZWN0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5hcHBseU1hdHJpeDQoIG0gKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQoIG0gKTtcblxuXHR9LFxuXHRmcm9tQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKTtcblxuXHR9LFxuXHRkaXN0YW5jZVRvTWFuaGF0dGFuOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZGlzdGFuY2VUb01hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkRpc3RhbmNlVG8oKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMubWFuaGF0dGFuRGlzdGFuY2VUbyggdiApO1xuXG5cdH0sXG5cdGxlbmd0aE1hbmhhdHRhbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmxlbmd0aE1hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkxlbmd0aCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5tYW5oYXR0YW5MZW5ndGgoKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yNC5wcm90b3R5cGUsIHtcblxuXHRmcm9tQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKTtcblxuXHR9LFxuXHRsZW5ndGhNYW5oYXR0YW46IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMubWFuaGF0dGFuTGVuZ3RoKCk7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5hc3NpZ24oIEdlb21ldHJ5LnByb3RvdHlwZSwge1xuXG5cdGNvbXB1dGVUYW5nZW50czogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkdlb21ldHJ5OiAuY29tcHV0ZVRhbmdlbnRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0Y29tcHV0ZUxpbmVEaXN0YW5jZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5HZW9tZXRyeTogLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkxpbmUuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSBpbnN0ZWFkLicgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggT2JqZWN0M0QucHJvdG90eXBlLCB7XG5cblx0Z2V0Q2hpbGRCeU5hbWU6IGZ1bmN0aW9uICggbmFtZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0Q2hpbGRCeU5hbWUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRPYmplY3RCeU5hbWUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlOYW1lKCBuYW1lICk7XG5cblx0fSxcblx0cmVuZGVyRGVwdGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAucmVuZGVyRGVwdGggaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5yZW5kZXJPcmRlciwgaW5zdGVhZC4nICk7XG5cblx0fSxcblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoIGRpc3RhbmNlLCBheGlzICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC50cmFuc2xhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnRyYW5zbGF0ZU9uQXhpcyggYXhpcywgZGlzdGFuY2UgKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoIGF4aXMsIGRpc3RhbmNlICk7XG5cblx0fSxcblx0Z2V0V29ybGRSb3RhdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGRSb3RhdGlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5PYmplY3QzRC5nZXRXb3JsZFF1YXRlcm5pb24oIHRhcmdldCApIGluc3RlYWQuJyApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggT2JqZWN0M0QucHJvdG90eXBlLCB7XG5cblx0ZXVsZXJPcmRlcjoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLmV1bGVyT3JkZXIgaXMgbm93IC5yb3RhdGlvbi5vcmRlci4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5yb3RhdGlvbi5vcmRlcjtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLmV1bGVyT3JkZXIgaXMgbm93IC5yb3RhdGlvbi5vcmRlci4nICk7XG5cdFx0XHR0aGlzLnJvdGF0aW9uLm9yZGVyID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHVzZVF1YXRlcm5pb246IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC51c2VRdWF0ZXJuaW9uIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSBsaWJyYXJ5IG5vdyB1c2VzIHF1YXRlcm5pb25zIGJ5IGRlZmF1bHQuJyApO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC51c2VRdWF0ZXJuaW9uIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSBsaWJyYXJ5IG5vdyB1c2VzIHF1YXRlcm5pb25zIGJ5IGRlZmF1bHQuJyApO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIExPRC5wcm90b3R5cGUsIHtcblxuXHRvYmplY3RzOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxPRDogLm9iamVjdHMgaGFzIGJlZW4gcmVuYW1lZCB0byAubGV2ZWxzLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmxldmVscztcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggU2tlbGV0b24ucHJvdG90eXBlLCAndXNlVmVydGV4VGV4dHVyZScsIHtcblxuXHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNrZWxldG9uOiB1c2VWZXJ0ZXhUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2tlbGV0b246IHVzZVZlcnRleFRleHR1cmUgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggQ3VydmUucHJvdG90eXBlLCAnX19hcmNMZW5ndGhEaXZpc2lvbnMnLCB7XG5cblx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5DdXJ2ZTogLl9fYXJjTGVuZ3RoRGl2aXNpb25zIGlzIG5vdyAuYXJjTGVuZ3RoRGl2aXNpb25zLicgKTtcblx0XHRyZXR1cm4gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM7XG5cblx0fSxcblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ3VydmU6IC5fX2FyY0xlbmd0aERpdmlzaW9ucyBpcyBub3cgLmFyY0xlbmd0aERpdmlzaW9ucy4nICk7XG5cdFx0dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMgPSB2YWx1ZTtcblxuXHR9XG5cbn0gKTtcblxuLy9cblxuUGVyc3BlY3RpdmVDYW1lcmEucHJvdG90eXBlLnNldExlbnMgPSBmdW5jdGlvbiAoIGZvY2FsTGVuZ3RoLCBmaWxtR2F1Z2UgKSB7XG5cblx0Y29uc29sZS53YXJuKCBcIlRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhLnNldExlbnMgaXMgZGVwcmVjYXRlZC4gXCIgK1xuXHRcdFx0XCJVc2UgLnNldEZvY2FsTGVuZ3RoIGFuZCAuZmlsbUdhdWdlIGZvciBhIHBob3RvZ3JhcGhpYyBzZXR1cC5cIiApO1xuXG5cdGlmICggZmlsbUdhdWdlICE9PSB1bmRlZmluZWQgKSB0aGlzLmZpbG1HYXVnZSA9IGZpbG1HYXVnZTtcblx0dGhpcy5zZXRGb2NhbExlbmd0aCggZm9jYWxMZW5ndGggKTtcblxufTtcblxuLy9cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIExpZ2h0LnByb3RvdHlwZSwge1xuXHRvbmx5U2hhZG93OiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAub25seVNoYWRvdyBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhRm92OiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUZvdiBpcyBub3cgLnNoYWRvdy5jYW1lcmEuZm92LicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5mb3YgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhTGVmdDoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFMZWZ0IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5sZWZ0LicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5sZWZ0ID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYVJpZ2h0OiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVJpZ2h0IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5yaWdodC4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5jYW1lcmEucmlnaHQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhVG9wOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVRvcCBpcyBub3cgLnNoYWRvdy5jYW1lcmEudG9wLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS50b3AgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhQm90dG9tOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUJvdHRvbSBpcyBub3cgLnNoYWRvdy5jYW1lcmEuYm90dG9tLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5ib3R0b20gPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhTmVhcjoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFOZWFyIGlzIG5vdyAuc2hhZG93LmNhbWVyYS5uZWFyLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5uZWFyID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYUZhcjoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFGYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmZhci4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5jYW1lcmEuZmFyID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYVZpc2libGU6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFWaXNpYmxlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuQ2FtZXJhSGVscGVyKCBsaWdodC5zaGFkb3cuY2FtZXJhICkgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0JpYXM6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93QmlhcyBpcyBub3cgLnNoYWRvdy5iaWFzLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmJpYXMgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93RGFya25lc3M6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dEYXJrbmVzcyBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93TWFwV2lkdGg6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93TWFwV2lkdGggaXMgbm93IC5zaGFkb3cubWFwU2l6ZS53aWR0aC4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5tYXBTaXplLndpZHRoID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd01hcEhlaWdodDoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dNYXBIZWlnaHQgaXMgbm93IC5zaGFkb3cubWFwU2l6ZS5oZWlnaHQuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cubWFwU2l6ZS5oZWlnaHQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fVxufSApO1xuXG4vL1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwge1xuXG5cdGxlbmd0aDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IC5sZW5ndGggaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5jb3VudCBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmFycmF5Lmxlbmd0aDtcblxuXHRcdH1cblx0fSxcblx0Y29weUluZGljZXNBcnJheTogZnVuY3Rpb24gKCAvKiBpbmRpY2VzICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogLmNvcHlJbmRpY2VzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLCB7XG5cblx0YWRkSW5kZXg6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZEluZGV4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0SW5kZXgoKS4nICk7XG5cdFx0dGhpcy5zZXRJbmRleCggaW5kZXggKTtcblxuXHR9LFxuXHRhZGREcmF3Q2FsbDogZnVuY3Rpb24gKCBzdGFydCwgY291bnQsIGluZGV4T2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBpbmRleE9mZnNldCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZERyYXdDYWxsKCkgbm8gbG9uZ2VyIHN1cHBvcnRzIGluZGV4T2Zmc2V0LicgKTtcblxuXHRcdH1cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZERyYXdDYWxsKCkgaXMgbm93IC5hZGRHcm91cCgpLicgKTtcblx0XHR0aGlzLmFkZEdyb3VwKCBzdGFydCwgY291bnQgKTtcblxuXHR9LFxuXHRjbGVhckRyYXdDYWxsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jbGVhckRyYXdDYWxscygpIGlzIG5vdyAuY2xlYXJHcm91cHMoKS4nICk7XG5cdFx0dGhpcy5jbGVhckdyb3VwcygpO1xuXG5cdH0sXG5cdGNvbXB1dGVUYW5nZW50czogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jb21wdXRlVGFuZ2VudHMoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRjb21wdXRlT2Zmc2V0czogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jb21wdXRlT2Zmc2V0cygpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLCB7XG5cblx0ZHJhd2NhbGxzOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmRyYXdjYWxscyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuZ3JvdXBzO1xuXG5cdFx0fVxuXHR9LFxuXHRvZmZzZXRzOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAub2Zmc2V0cyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuZ3JvdXBzO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuLy9cblxuT2JqZWN0LmFzc2lnbiggRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSwge1xuXG5cdGdldEFycmF5czogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTogLmdldEFycmF5cygpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cblx0YWRkU2hhcGVMaXN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiAuYWRkU2hhcGVMaXN0KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblxuXHRhZGRTaGFwZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTogLmFkZFNoYXBlKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBVbmlmb3JtLnByb3RvdHlwZSwge1xuXG5cdGR5bmFtaWM6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVW5pZm9ybTogLmR5bmFtaWMgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG9iamVjdC5vbkJlZm9yZVJlbmRlcigpIGluc3RlYWQuJyApO1xuXG5cdFx0fVxuXHR9LFxuXHRvblVwZGF0ZToge1xuXHRcdHZhbHVlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlVuaWZvcm06IC5vblVwZGF0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBvYmplY3Qub25CZWZvcmVSZW5kZXIoKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuLy9cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIE1hdGVyaWFsLnByb3RvdHlwZSwge1xuXG5cdHdyYXBBcm91bmQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWw6IC53cmFwQXJvdW5kIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWw6IC53cmFwQXJvdW5kIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdFx0fVxuXHR9LFxuXHR3cmFwUkdCOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGVyaWFsOiAud3JhcFJHQiBoYXMgYmVlbiByZW1vdmVkLicgKTtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IoKTtcblxuXHRcdH1cblx0fSxcblxuXHRzaGFkaW5nOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS4nICsgdGhpcy50eXBlICsgJzogLnNoYWRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHRoZSBib29sZWFuIC5mbGF0U2hhZGluZyBpbnN0ZWFkLicgKTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS4nICsgdGhpcy50eXBlICsgJzogLnNoYWRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHRoZSBib29sZWFuIC5mbGF0U2hhZGluZyBpbnN0ZWFkLicgKTtcblx0XHRcdHRoaXMuZmxhdFNoYWRpbmcgPSAoIHZhbHVlID09PSBGbGF0U2hhZGluZyApO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIE1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZSwge1xuXG5cdG1ldGFsOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1lc2hQaG9uZ01hdGVyaWFsOiAubWV0YWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw6IC5tZXRhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwgaW5zdGVhZCcgKTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUsIHtcblxuXHRkZXJpdmF0aXZlczoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5TaGFkZXJNYXRlcmlhbDogLmRlcml2YXRpdmVzIGhhcyBiZWVuIG1vdmVkIHRvIC5leHRlbnNpb25zLmRlcml2YXRpdmVzLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXM7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuIFNoYWRlck1hdGVyaWFsOiAuZGVyaXZhdGl2ZXMgaGFzIGJlZW4gbW92ZWQgdG8gLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMuJyApO1xuXHRcdFx0dGhpcy5leHRlbnNpb25zLmRlcml2YXRpdmVzID0gdmFsdWU7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG4vL1xuXG5PYmplY3QuYXNzaWduKCBXZWJHTFJlbmRlcmVyLnByb3RvdHlwZSwge1xuXG5cdGdldEN1cnJlbnRSZW5kZXJUYXJnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5nZXRDdXJyZW50UmVuZGVyVGFyZ2V0KCkgaXMgbm93IC5nZXRSZW5kZXJUYXJnZXQoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0UmVuZGVyVGFyZ2V0KCk7XG5cblx0fSxcblxuXHRnZXRNYXhBbmlzb3Ryb3B5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0TWF4QW5pc290cm9weSgpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKTtcblxuXHR9LFxuXG5cdGdldFByZWNpc2lvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldFByZWNpc2lvbigpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLnByZWNpc2lvbi4nICk7XG5cdFx0cmV0dXJuIHRoaXMuY2FwYWJpbGl0aWVzLnByZWNpc2lvbjtcblxuXHR9LFxuXG5cdHJlc2V0R0xTdGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnJlc2V0R0xTdGF0ZSgpIGlzIG5vdyAuc3RhdGUucmVzZXQoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuc3RhdGUucmVzZXQoKTtcblxuXHR9LFxuXG5cdHN1cHBvcnRzRmxvYXRUZXh0dXJlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzRmxvYXRUZXh0dXJlcygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ09FU190ZXh0dXJlX2Zsb2F0XFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXQnICk7XG5cblx0fSxcblx0c3VwcG9ydHNIYWxmRmxvYXRUZXh0dXJlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzSGFsZkZsb2F0VGV4dHVyZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcXCdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0XFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcgKTtcblxuXHR9LFxuXHRzdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcXCdPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXNcXCcgKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMnICk7XG5cblx0fSxcblx0c3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVMzVEM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUzNUQygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjXFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICk7XG5cblx0fSxcblx0c3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVBWUlRDOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVBWUlRDKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXFwnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjXFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApO1xuXG5cdH0sXG5cdHN1cHBvcnRzQmxlbmRNaW5NYXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0JsZW5kTWluTWF4KCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXFwnRVhUX2JsZW5kX21pbm1heFxcJyApLicgKTtcblx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ0VYVF9ibGVuZF9taW5tYXgnICk7XG5cblx0fSxcblx0c3VwcG9ydHNWZXJ0ZXhUZXh0dXJlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzVmVydGV4VGV4dHVyZXMoKSBpcyBub3cgLmNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlcy4nICk7XG5cdFx0cmV0dXJuIHRoaXMuY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzO1xuXG5cdH0sXG5cdHN1cHBvcnRzSW5zdGFuY2VkQXJyYXlzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNJbnN0YW5jZWRBcnJheXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcXCdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzXFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTtcblxuXHR9LFxuXHRlbmFibGVTY2lzc29yVGVzdDogZnVuY3Rpb24gKCBib29sZWFuICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmVuYWJsZVNjaXNzb3JUZXN0KCkgaXMgbm93IC5zZXRTY2lzc29yVGVzdCgpLicgKTtcblx0XHR0aGlzLnNldFNjaXNzb3JUZXN0KCBib29sZWFuICk7XG5cblx0fSxcblx0aW5pdE1hdGVyaWFsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuaW5pdE1hdGVyaWFsKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0YWRkUHJlUGx1Z2luOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYWRkUHJlUGx1Z2luKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0YWRkUG9zdFBsdWdpbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFkZFBvc3RQbHVnaW4oKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHR1cGRhdGVTaGFkb3dNYXA6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC51cGRhdGVTaGFkb3dNYXAoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRzZXRGYWNlQ3VsbGluZzogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNldEZhY2VDdWxsaW5nKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBXZWJHTFJlbmRlcmVyLnByb3RvdHlwZSwge1xuXG5cdHNoYWRvd01hcEVuYWJsZWQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc2hhZG93TWFwLmVuYWJsZWQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEVuYWJsZWQgaXMgbm93IC5zaGFkb3dNYXAuZW5hYmxlZC4nICk7XG5cdFx0XHR0aGlzLnNoYWRvd01hcC5lbmFibGVkID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd01hcFR5cGU6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc2hhZG93TWFwLnR5cGU7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcFR5cGUgaXMgbm93IC5zaGFkb3dNYXAudHlwZS4nICk7XG5cdFx0XHR0aGlzLnNoYWRvd01hcC50eXBlID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd01hcEN1bGxGYWNlOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXBDdWxsRmFjZSBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCAvKiB2YWx1ZSAqLyApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuJyApO1xuXG5cdFx0fVxuXHR9XG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBXZWJHTFNoYWRvd01hcC5wcm90b3R5cGUsIHtcblxuXHRjdWxsRmFjZToge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLmN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIC8qIGN1bGxGYWNlICovICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLmN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuJyApO1xuXG5cdFx0fVxuXHR9LFxuXHRyZW5kZXJSZXZlcnNlU2lkZWQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJSZXZlcnNlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJSZXZlcnNlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdHJlbmRlclNpbmdsZVNpZGVkOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAucmVuZGVyU2luZ2xlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJTaW5nbGVTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBXZWJHTFJlbmRlclRhcmdldC5wcm90b3R5cGUsIHtcblxuXHR3cmFwUzoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBTIGlzIG5vdyAudGV4dHVyZS53cmFwUy4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLndyYXBTO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFMgaXMgbm93IC50ZXh0dXJlLndyYXBTLicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS53cmFwUyA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHR3cmFwVDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBUIGlzIG5vdyAudGV4dHVyZS53cmFwVC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLndyYXBUO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFQgaXMgbm93IC50ZXh0dXJlLndyYXBULicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS53cmFwVCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRtYWdGaWx0ZXI6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5tYWdGaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1hZ0ZpbHRlci4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLm1hZ0ZpbHRlcjtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5tYWdGaWx0ZXIgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0bWluRmlsdGVyOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWluRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5taW5GaWx0ZXIuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS5taW5GaWx0ZXI7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5taW5GaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1pbkZpbHRlci4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUubWluRmlsdGVyID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdGFuaXNvdHJvcHk6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5hbmlzb3Ryb3B5IGlzIG5vdyAudGV4dHVyZS5hbmlzb3Ryb3B5LicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUuYW5pc290cm9weTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmFuaXNvdHJvcHkgaXMgbm93IC50ZXh0dXJlLmFuaXNvdHJvcHkuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLmFuaXNvdHJvcHkgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0b2Zmc2V0OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAub2Zmc2V0IGlzIG5vdyAudGV4dHVyZS5vZmZzZXQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS5vZmZzZXQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5vZmZzZXQgaXMgbm93IC50ZXh0dXJlLm9mZnNldC4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUub2Zmc2V0ID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHJlcGVhdDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnJlcGVhdCBpcyBub3cgLnRleHR1cmUucmVwZWF0LicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUucmVwZWF0O1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAucmVwZWF0IGlzIG5vdyAudGV4dHVyZS5yZXBlYXQuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLnJlcGVhdCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRmb3JtYXQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5mb3JtYXQgaXMgbm93IC50ZXh0dXJlLmZvcm1hdC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLmZvcm1hdDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmZvcm1hdCBpcyBub3cgLnRleHR1cmUuZm9ybWF0LicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5mb3JtYXQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0dHlwZToge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnR5cGUgaXMgbm93IC50ZXh0dXJlLnR5cGUuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS50eXBlO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAudHlwZSBpcyBub3cgLnRleHR1cmUudHlwZS4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUudHlwZSA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRnZW5lcmF0ZU1pcG1hcHM6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5nZW5lcmF0ZU1pcG1hcHMgaXMgbm93IC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcy4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcztcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmdlbmVyYXRlTWlwbWFwcyBpcyBub3cgLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzLicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSB2YWx1ZTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBXZWJWUk1hbmFnZXIucHJvdG90eXBlLCB7XG5cblx0c3RhbmRpbmc6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggLyogdmFsdWUgKi8gKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYlZSTWFuYWdlcjogLnN0YW5kaW5nIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuLy9cblxuQXVkaW8ucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbiAoIGZpbGUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IC5sb2FkIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5BdWRpb0xvYWRlciBpbnN0ZWFkLicgKTtcblx0dmFyIHNjb3BlID0gdGhpcztcblx0dmFyIGF1ZGlvTG9hZGVyID0gbmV3IEF1ZGlvTG9hZGVyKCk7XG5cdGF1ZGlvTG9hZGVyLmxvYWQoIGZpbGUsIGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0c2NvcGUuc2V0QnVmZmVyKCBidWZmZXIgKTtcblxuXHR9ICk7XG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5BdWRpb0FuYWx5c2VyLnByb3RvdHlwZS5nZXREYXRhID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvQW5hbHlzZXI6IC5nZXREYXRhKCkgaXMgbm93IC5nZXRGcmVxdWVuY3lEYXRhKCkuJyApO1xuXHRyZXR1cm4gdGhpcy5nZXRGcmVxdWVuY3lEYXRhKCk7XG5cbn07XG5cbi8vXG5cbkN1YmVDYW1lcmEucHJvdG90eXBlLnVwZGF0ZUN1YmVNYXAgPSBmdW5jdGlvbiAoIHJlbmRlcmVyLCBzY2VuZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5DdWJlQ2FtZXJhOiAudXBkYXRlQ3ViZU1hcCgpIGlzIG5vdyAudXBkYXRlKCkuJyApO1xuXHRyZXR1cm4gdGhpcy51cGRhdGUoIHJlbmRlcmVyLCBzY2VuZSApO1xuXG59O1xuXG4vL1xuXG52YXIgR2VvbWV0cnlVdGlscyA9IHtcblxuXHRtZXJnZTogZnVuY3Rpb24gKCBnZW9tZXRyeTEsIGdlb21ldHJ5MiwgbWF0ZXJpYWxJbmRleE9mZnNldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkdlb21ldHJ5VXRpbHM6IC5tZXJnZSgpIGhhcyBiZWVuIG1vdmVkIHRvIEdlb21ldHJ5LiBVc2UgZ2VvbWV0cnkubWVyZ2UoIGdlb21ldHJ5MiwgbWF0cml4LCBtYXRlcmlhbEluZGV4T2Zmc2V0ICkgaW5zdGVhZC4nICk7XG5cdFx0dmFyIG1hdHJpeDtcblxuXHRcdGlmICggZ2VvbWV0cnkyLmlzTWVzaCApIHtcblxuXHRcdFx0Z2VvbWV0cnkyLm1hdHJpeEF1dG9VcGRhdGUgJiYgZ2VvbWV0cnkyLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0XHRtYXRyaXggPSBnZW9tZXRyeTIubWF0cml4O1xuXHRcdFx0Z2VvbWV0cnkyID0gZ2VvbWV0cnkyLmdlb21ldHJ5O1xuXG5cdFx0fVxuXG5cdFx0Z2VvbWV0cnkxLm1lcmdlKCBnZW9tZXRyeTIsIG1hdHJpeCwgbWF0ZXJpYWxJbmRleE9mZnNldCApO1xuXG5cdH0sXG5cblx0Y2VudGVyOiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuR2VvbWV0cnlVdGlsczogLmNlbnRlcigpIGhhcyBiZWVuIG1vdmVkIHRvIEdlb21ldHJ5LiBVc2UgZ2VvbWV0cnkuY2VudGVyKCkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIGdlb21ldHJ5LmNlbnRlcigpO1xuXG5cdH1cblxufTtcblxudmFyIEltYWdlVXRpbHMgPSB7XG5cblx0Y3Jvc3NPcmlnaW46IHVuZGVmaW5lZCxcblxuXHRsb2FkVGV4dHVyZTogZnVuY3Rpb24gKCB1cmwsIG1hcHBpbmcsIG9uTG9hZCwgb25FcnJvciApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkltYWdlVXRpbHMubG9hZFRleHR1cmUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLlRleHR1cmVMb2FkZXIoKSBpbnN0ZWFkLicgKTtcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgVGV4dHVyZUxvYWRlcigpO1xuXHRcdGxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApO1xuXG5cdFx0dmFyIHRleHR1cmUgPSBsb2FkZXIubG9hZCggdXJsLCBvbkxvYWQsIHVuZGVmaW5lZCwgb25FcnJvciApO1xuXG5cdFx0aWYgKCBtYXBwaW5nICkgdGV4dHVyZS5tYXBwaW5nID0gbWFwcGluZztcblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH0sXG5cblx0bG9hZFRleHR1cmVDdWJlOiBmdW5jdGlvbiAoIHVybHMsIG1hcHBpbmcsIG9uTG9hZCwgb25FcnJvciApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkltYWdlVXRpbHMubG9hZFRleHR1cmVDdWJlIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5DdWJlVGV4dHVyZUxvYWRlcigpIGluc3RlYWQuJyApO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBDdWJlVGV4dHVyZUxvYWRlcigpO1xuXHRcdGxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApO1xuXG5cdFx0dmFyIHRleHR1cmUgPSBsb2FkZXIubG9hZCggdXJscywgb25Mb2FkLCB1bmRlZmluZWQsIG9uRXJyb3IgKTtcblxuXHRcdGlmICggbWFwcGluZyApIHRleHR1cmUubWFwcGluZyA9IG1hcHBpbmc7XG5cblx0XHRyZXR1cm4gdGV4dHVyZTtcblxuXHR9LFxuXG5cdGxvYWRDb21wcmVzc2VkVGV4dHVyZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkltYWdlVXRpbHMubG9hZENvbXByZXNzZWRUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5ERFNMb2FkZXIgaW5zdGVhZC4nICk7XG5cblx0fSxcblxuXHRsb2FkQ29tcHJlc3NlZFRleHR1cmVDdWJlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuSW1hZ2VVdGlscy5sb2FkQ29tcHJlc3NlZFRleHR1cmVDdWJlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5ERFNMb2FkZXIgaW5zdGVhZC4nICk7XG5cblx0fVxuXG59O1xuXG4vL1xuXG5mdW5jdGlvbiBQcm9qZWN0b3IoKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb2plY3RvciBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvcmVuZGVyZXJzL1Byb2plY3Rvci5qcy4nICk7XG5cblx0dGhpcy5wcm9qZWN0VmVjdG9yID0gZnVuY3Rpb24gKCB2ZWN0b3IsIGNhbWVyYSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlByb2plY3RvcjogLnByb2plY3RWZWN0b3IoKSBpcyBub3cgdmVjdG9yLnByb2plY3QoKS4nICk7XG5cdFx0dmVjdG9yLnByb2plY3QoIGNhbWVyYSApO1xuXG5cdH07XG5cblx0dGhpcy51bnByb2plY3RWZWN0b3IgPSBmdW5jdGlvbiAoIHZlY3RvciwgY2FtZXJhICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUHJvamVjdG9yOiAudW5wcm9qZWN0VmVjdG9yKCkgaXMgbm93IHZlY3Rvci51bnByb2plY3QoKS4nICk7XG5cdFx0dmVjdG9yLnVucHJvamVjdCggY2FtZXJhICk7XG5cblx0fTtcblxuXHR0aGlzLnBpY2tpbmdSYXkgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvamVjdG9yOiAucGlja2luZ1JheSgpIGlzIG5vdyByYXljYXN0ZXIuc2V0RnJvbUNhbWVyYSgpLicgKTtcblxuXHR9O1xuXG59XG5cbi8vXG5cbmZ1bmN0aW9uIENhbnZhc1JlbmRlcmVyKCkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5DYW52YXNSZW5kZXJlciBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvcmVuZGVyZXJzL0NhbnZhc1JlbmRlcmVyLmpzJyApO1xuXG5cdHRoaXMuZG9tRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnY2FudmFzJyApO1xuXHR0aGlzLmNsZWFyID0gZnVuY3Rpb24gKCkge307XG5cdHRoaXMucmVuZGVyID0gZnVuY3Rpb24gKCkge307XG5cdHRoaXMuc2V0Q2xlYXJDb2xvciA9IGZ1bmN0aW9uICgpIHt9O1xuXHR0aGlzLnNldFNpemUgPSBmdW5jdGlvbiAoKSB7fTtcblxufVxuXG4vL1xuXG52YXIgU2NlbmVVdGlscyA9IHtcblxuXHRjcmVhdGVNdWx0aU1hdGVyaWFsT2JqZWN0OiBmdW5jdGlvbiAoIC8qIGdlb21ldHJ5LCBtYXRlcmlhbHMgKi8gKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuU2NlbmVVdGlscyBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvdXRpbHMvU2NlbmVVdGlscy5qcycgKTtcblxuXHR9LFxuXG5cdGRldGFjaDogZnVuY3Rpb24gKCAvKiBjaGlsZCwgcGFyZW50LCBzY2VuZSAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5TY2VuZVV0aWxzIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qcy91dGlscy9TY2VuZVV0aWxzLmpzJyApO1xuXG5cdH0sXG5cblx0YXR0YWNoOiBmdW5jdGlvbiAoIC8qIGNoaWxkLCBzY2VuZSwgcGFyZW50ICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNjZW5lVXRpbHMgaGFzIGJlZW4gbW92ZWQgdG8gL2V4YW1wbGVzL2pzL3V0aWxzL1NjZW5lVXRpbHMuanMnICk7XG5cblx0fVxuXG59O1xuXG4vL1xuXG5mdW5jdGlvbiBMZW5zRmxhcmUoKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkxlbnNGbGFyZSBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvb2JqZWN0cy9MZW5zZmxhcmUuanMnICk7XG5cbn1cblxuZXhwb3J0IHsgV2ViR0xSZW5kZXJUYXJnZXRDdWJlLCBXZWJHTFJlbmRlclRhcmdldCwgV2ViR0xSZW5kZXJlciwgU2hhZGVyTGliLCBVbmlmb3Jtc0xpYiwgVW5pZm9ybXNVdGlscywgU2hhZGVyQ2h1bmssIEZvZ0V4cDIsIEZvZywgU2NlbmUsIFNwcml0ZSwgTE9ELCBTa2lubmVkTWVzaCwgU2tlbGV0b24sIEJvbmUsIE1lc2gsIExpbmVTZWdtZW50cywgTGluZUxvb3AsIExpbmUsIFBvaW50cywgR3JvdXAsIFZpZGVvVGV4dHVyZSwgRGF0YVRleHR1cmUsIENvbXByZXNzZWRUZXh0dXJlLCBDdWJlVGV4dHVyZSwgQ2FudmFzVGV4dHVyZSwgRGVwdGhUZXh0dXJlLCBUZXh0dXJlLCBDb21wcmVzc2VkVGV4dHVyZUxvYWRlciwgRGF0YVRleHR1cmVMb2FkZXIsIEN1YmVUZXh0dXJlTG9hZGVyLCBUZXh0dXJlTG9hZGVyLCBPYmplY3RMb2FkZXIsIE1hdGVyaWFsTG9hZGVyLCBCdWZmZXJHZW9tZXRyeUxvYWRlciwgRGVmYXVsdExvYWRpbmdNYW5hZ2VyLCBMb2FkaW5nTWFuYWdlciwgSlNPTkxvYWRlciwgSW1hZ2VMb2FkZXIsIEltYWdlQml0bWFwTG9hZGVyLCBGb250TG9hZGVyLCBGaWxlTG9hZGVyLCBMb2FkZXIsIExvYWRlclV0aWxzLCBDYWNoZSwgQXVkaW9Mb2FkZXIsIFNwb3RMaWdodFNoYWRvdywgU3BvdExpZ2h0LCBQb2ludExpZ2h0LCBSZWN0QXJlYUxpZ2h0LCBIZW1pc3BoZXJlTGlnaHQsIERpcmVjdGlvbmFsTGlnaHRTaGFkb3csIERpcmVjdGlvbmFsTGlnaHQsIEFtYmllbnRMaWdodCwgTGlnaHRTaGFkb3csIExpZ2h0LCBTdGVyZW9DYW1lcmEsIFBlcnNwZWN0aXZlQ2FtZXJhLCBPcnRob2dyYXBoaWNDYW1lcmEsIEN1YmVDYW1lcmEsIEFycmF5Q2FtZXJhLCBDYW1lcmEsIEF1ZGlvTGlzdGVuZXIsIFBvc2l0aW9uYWxBdWRpbywgQXVkaW9Db250ZXh0LCBBdWRpb0FuYWx5c2VyLCBBdWRpbywgVmVjdG9yS2V5ZnJhbWVUcmFjaywgU3RyaW5nS2V5ZnJhbWVUcmFjaywgUXVhdGVybmlvbktleWZyYW1lVHJhY2ssIE51bWJlcktleWZyYW1lVHJhY2ssIENvbG9yS2V5ZnJhbWVUcmFjaywgQm9vbGVhbktleWZyYW1lVHJhY2ssIFByb3BlcnR5TWl4ZXIsIFByb3BlcnR5QmluZGluZywgS2V5ZnJhbWVUcmFjaywgQW5pbWF0aW9uVXRpbHMsIEFuaW1hdGlvbk9iamVjdEdyb3VwLCBBbmltYXRpb25NaXhlciwgQW5pbWF0aW9uQ2xpcCwgVW5pZm9ybSwgSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnksIEJ1ZmZlckdlb21ldHJ5LCBHZW9tZXRyeSwgSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUsIEluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyLCBJbnRlcmxlYXZlZEJ1ZmZlciwgSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlLCBGYWNlMywgT2JqZWN0M0QsIFJheWNhc3RlciwgTGF5ZXJzLCBFdmVudERpc3BhdGNoZXIsIENsb2NrLCBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQsIExpbmVhckludGVycG9sYW50LCBEaXNjcmV0ZUludGVycG9sYW50LCBDdWJpY0ludGVycG9sYW50LCBJbnRlcnBvbGFudCwgVHJpYW5nbGUsIF9NYXRoIGFzIE1hdGgsIFNwaGVyaWNhbCwgQ3lsaW5kcmljYWwsIFBsYW5lLCBGcnVzdHVtLCBTcGhlcmUsIFJheSwgTWF0cml4NCwgTWF0cml4MywgQm94MywgQm94MiwgTGluZTMsIEV1bGVyLCBWZWN0b3I0LCBWZWN0b3IzLCBWZWN0b3IyLCBRdWF0ZXJuaW9uLCBDb2xvciwgSW1tZWRpYXRlUmVuZGVyT2JqZWN0LCBWZXJ0ZXhOb3JtYWxzSGVscGVyLCBTcG90TGlnaHRIZWxwZXIsIFNrZWxldG9uSGVscGVyLCBQb2ludExpZ2h0SGVscGVyLCBSZWN0QXJlYUxpZ2h0SGVscGVyLCBIZW1pc3BoZXJlTGlnaHRIZWxwZXIsIEdyaWRIZWxwZXIsIFBvbGFyR3JpZEhlbHBlciwgRmFjZU5vcm1hbHNIZWxwZXIsIERpcmVjdGlvbmFsTGlnaHRIZWxwZXIsIENhbWVyYUhlbHBlciwgQm94SGVscGVyLCBCb3gzSGVscGVyLCBQbGFuZUhlbHBlciwgQXJyb3dIZWxwZXIsIEF4ZXNIZWxwZXIsIFNoYXBlLCBQYXRoLCBTaGFwZVBhdGgsIEZvbnQsIEN1cnZlUGF0aCwgQ3VydmUsIFNoYXBlVXRpbHMsIFdlYkdMVXRpbHMsIFdpcmVmcmFtZUdlb21ldHJ5LCBQYXJhbWV0cmljR2VvbWV0cnksIFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSwgVGV0cmFoZWRyb25HZW9tZXRyeSwgVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSwgT2N0YWhlZHJvbkdlb21ldHJ5LCBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnksIEljb3NhaGVkcm9uR2VvbWV0cnksIEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnksIERvZGVjYWhlZHJvbkdlb21ldHJ5LCBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSwgUG9seWhlZHJvbkdlb21ldHJ5LCBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnksIFR1YmVHZW9tZXRyeSwgVHViZUJ1ZmZlckdlb21ldHJ5LCBUb3J1c0tub3RHZW9tZXRyeSwgVG9ydXNLbm90QnVmZmVyR2VvbWV0cnksIFRvcnVzR2VvbWV0cnksIFRvcnVzQnVmZmVyR2VvbWV0cnksIFRleHRHZW9tZXRyeSwgVGV4dEJ1ZmZlckdlb21ldHJ5LCBTcGhlcmVHZW9tZXRyeSwgU3BoZXJlQnVmZmVyR2VvbWV0cnksIFJpbmdHZW9tZXRyeSwgUmluZ0J1ZmZlckdlb21ldHJ5LCBQbGFuZUdlb21ldHJ5LCBQbGFuZUJ1ZmZlckdlb21ldHJ5LCBMYXRoZUdlb21ldHJ5LCBMYXRoZUJ1ZmZlckdlb21ldHJ5LCBTaGFwZUdlb21ldHJ5LCBTaGFwZUJ1ZmZlckdlb21ldHJ5LCBFeHRydWRlR2VvbWV0cnksIEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSwgRWRnZXNHZW9tZXRyeSwgQ29uZUdlb21ldHJ5LCBDb25lQnVmZmVyR2VvbWV0cnksIEN5bGluZGVyR2VvbWV0cnksIEN5bGluZGVyQnVmZmVyR2VvbWV0cnksIENpcmNsZUdlb21ldHJ5LCBDaXJjbGVCdWZmZXJHZW9tZXRyeSwgQm94R2VvbWV0cnksIEJveEJ1ZmZlckdlb21ldHJ5LCBTaGFkb3dNYXRlcmlhbCwgU3ByaXRlTWF0ZXJpYWwsIFJhd1NoYWRlck1hdGVyaWFsLCBTaGFkZXJNYXRlcmlhbCwgUG9pbnRzTWF0ZXJpYWwsIE1lc2hQaHlzaWNhbE1hdGVyaWFsLCBNZXNoU3RhbmRhcmRNYXRlcmlhbCwgTWVzaFBob25nTWF0ZXJpYWwsIE1lc2hUb29uTWF0ZXJpYWwsIE1lc2hOb3JtYWxNYXRlcmlhbCwgTWVzaExhbWJlcnRNYXRlcmlhbCwgTWVzaERlcHRoTWF0ZXJpYWwsIE1lc2hEaXN0YW5jZU1hdGVyaWFsLCBNZXNoQmFzaWNNYXRlcmlhbCwgTGluZURhc2hlZE1hdGVyaWFsLCBMaW5lQmFzaWNNYXRlcmlhbCwgTWF0ZXJpYWwsIEZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUsIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUsIFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSwgSW50MzJCdWZmZXJBdHRyaWJ1dGUsIFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSwgSW50MTZCdWZmZXJBdHRyaWJ1dGUsIFVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSwgVWludDhCdWZmZXJBdHRyaWJ1dGUsIEludDhCdWZmZXJBdHRyaWJ1dGUsIEJ1ZmZlckF0dHJpYnV0ZSwgQXJjQ3VydmUsIENhdG11bGxSb21DdXJ2ZTMsIEN1YmljQmV6aWVyQ3VydmUsIEN1YmljQmV6aWVyQ3VydmUzLCBFbGxpcHNlQ3VydmUsIExpbmVDdXJ2ZSwgTGluZUN1cnZlMywgUXVhZHJhdGljQmV6aWVyQ3VydmUsIFF1YWRyYXRpY0JlemllckN1cnZlMywgU3BsaW5lQ3VydmUsIFJFVklTSU9OLCBNT1VTRSwgQ3VsbEZhY2VOb25lLCBDdWxsRmFjZUJhY2ssIEN1bGxGYWNlRnJvbnQsIEN1bGxGYWNlRnJvbnRCYWNrLCBGcm9udEZhY2VEaXJlY3Rpb25DVywgRnJvbnRGYWNlRGlyZWN0aW9uQ0NXLCBCYXNpY1NoYWRvd01hcCwgUENGU2hhZG93TWFwLCBQQ0ZTb2Z0U2hhZG93TWFwLCBGcm9udFNpZGUsIEJhY2tTaWRlLCBEb3VibGVTaWRlLCBGbGF0U2hhZGluZywgU21vb3RoU2hhZGluZywgTm9Db2xvcnMsIEZhY2VDb2xvcnMsIFZlcnRleENvbG9ycywgTm9CbGVuZGluZywgTm9ybWFsQmxlbmRpbmcsIEFkZGl0aXZlQmxlbmRpbmcsIFN1YnRyYWN0aXZlQmxlbmRpbmcsIE11bHRpcGx5QmxlbmRpbmcsIEN1c3RvbUJsZW5kaW5nLCBBZGRFcXVhdGlvbiwgU3VidHJhY3RFcXVhdGlvbiwgUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb24sIE1pbkVxdWF0aW9uLCBNYXhFcXVhdGlvbiwgWmVyb0ZhY3RvciwgT25lRmFjdG9yLCBTcmNDb2xvckZhY3RvciwgT25lTWludXNTcmNDb2xvckZhY3RvciwgU3JjQWxwaGFGYWN0b3IsIE9uZU1pbnVzU3JjQWxwaGFGYWN0b3IsIERzdEFscGhhRmFjdG9yLCBPbmVNaW51c0RzdEFscGhhRmFjdG9yLCBEc3RDb2xvckZhY3RvciwgT25lTWludXNEc3RDb2xvckZhY3RvciwgU3JjQWxwaGFTYXR1cmF0ZUZhY3RvciwgTmV2ZXJEZXB0aCwgQWx3YXlzRGVwdGgsIExlc3NEZXB0aCwgTGVzc0VxdWFsRGVwdGgsIEVxdWFsRGVwdGgsIEdyZWF0ZXJFcXVhbERlcHRoLCBHcmVhdGVyRGVwdGgsIE5vdEVxdWFsRGVwdGgsIE11bHRpcGx5T3BlcmF0aW9uLCBNaXhPcGVyYXRpb24sIEFkZE9wZXJhdGlvbiwgTm9Ub25lTWFwcGluZywgTGluZWFyVG9uZU1hcHBpbmcsIFJlaW5oYXJkVG9uZU1hcHBpbmcsIFVuY2hhcnRlZDJUb25lTWFwcGluZywgQ2luZW9uVG9uZU1hcHBpbmcsIFVWTWFwcGluZywgQ3ViZVJlZmxlY3Rpb25NYXBwaW5nLCBDdWJlUmVmcmFjdGlvbk1hcHBpbmcsIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nLCBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZywgU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmcsIEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nLCBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZywgUmVwZWF0V3JhcHBpbmcsIENsYW1wVG9FZGdlV3JhcHBpbmcsIE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcsIE5lYXJlc3RGaWx0ZXIsIE5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyLCBOZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyLCBMaW5lYXJGaWx0ZXIsIExpbmVhck1pcE1hcE5lYXJlc3RGaWx0ZXIsIExpbmVhck1pcE1hcExpbmVhckZpbHRlciwgVW5zaWduZWRCeXRlVHlwZSwgQnl0ZVR5cGUsIFNob3J0VHlwZSwgVW5zaWduZWRTaG9ydFR5cGUsIEludFR5cGUsIFVuc2lnbmVkSW50VHlwZSwgRmxvYXRUeXBlLCBIYWxmRmxvYXRUeXBlLCBVbnNpZ25lZFNob3J0NDQ0NFR5cGUsIFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSwgVW5zaWduZWRTaG9ydDU2NVR5cGUsIFVuc2lnbmVkSW50MjQ4VHlwZSwgQWxwaGFGb3JtYXQsIFJHQkZvcm1hdCwgUkdCQUZvcm1hdCwgTHVtaW5hbmNlRm9ybWF0LCBMdW1pbmFuY2VBbHBoYUZvcm1hdCwgUkdCRUZvcm1hdCwgRGVwdGhGb3JtYXQsIERlcHRoU3RlbmNpbEZvcm1hdCwgUkdCX1MzVENfRFhUMV9Gb3JtYXQsIFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCwgUkdCQV9TM1RDX0RYVDNfRm9ybWF0LCBSR0JBX1MzVENfRFhUNV9Gb3JtYXQsIFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0LCBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCwgUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0LCBSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQsIFJHQl9FVEMxX0Zvcm1hdCwgUkdCQV9BU1RDXzR4NF9Gb3JtYXQsIFJHQkFfQVNUQ181eDRfRm9ybWF0LCBSR0JBX0FTVENfNXg1X0Zvcm1hdCwgUkdCQV9BU1RDXzZ4NV9Gb3JtYXQsIFJHQkFfQVNUQ182eDZfRm9ybWF0LCBSR0JBX0FTVENfOHg1X0Zvcm1hdCwgUkdCQV9BU1RDXzh4Nl9Gb3JtYXQsIFJHQkFfQVNUQ184eDhfRm9ybWF0LCBSR0JBX0FTVENfMTB4NV9Gb3JtYXQsIFJHQkFfQVNUQ18xMHg2X0Zvcm1hdCwgUkdCQV9BU1RDXzEweDhfRm9ybWF0LCBSR0JBX0FTVENfMTB4MTBfRm9ybWF0LCBSR0JBX0FTVENfMTJ4MTBfRm9ybWF0LCBSR0JBX0FTVENfMTJ4MTJfRm9ybWF0LCBMb29wT25jZSwgTG9vcFJlcGVhdCwgTG9vcFBpbmdQb25nLCBJbnRlcnBvbGF0ZURpc2NyZXRlLCBJbnRlcnBvbGF0ZUxpbmVhciwgSW50ZXJwb2xhdGVTbW9vdGgsIFplcm9DdXJ2YXR1cmVFbmRpbmcsIFplcm9TbG9wZUVuZGluZywgV3JhcEFyb3VuZEVuZGluZywgVHJpYW5nbGVzRHJhd01vZGUsIFRyaWFuZ2xlU3RyaXBEcmF3TW9kZSwgVHJpYW5nbGVGYW5EcmF3TW9kZSwgTGluZWFyRW5jb2RpbmcsIHNSR0JFbmNvZGluZywgR2FtbWFFbmNvZGluZywgUkdCRUVuY29kaW5nLCBMb2dMdXZFbmNvZGluZywgUkdCTTdFbmNvZGluZywgUkdCTTE2RW5jb2RpbmcsIFJHQkRFbmNvZGluZywgQmFzaWNEZXB0aFBhY2tpbmcsIFJHQkFEZXB0aFBhY2tpbmcsIEJveEdlb21ldHJ5IGFzIEN1YmVHZW9tZXRyeSwgRmFjZTQsIExpbmVTdHJpcCwgTGluZVBpZWNlcywgTWVzaEZhY2VNYXRlcmlhbCwgTXVsdGlNYXRlcmlhbCwgUG9pbnRDbG91ZCwgUGFydGljbGUsIFBhcnRpY2xlU3lzdGVtLCBQb2ludENsb3VkTWF0ZXJpYWwsIFBhcnRpY2xlQmFzaWNNYXRlcmlhbCwgUGFydGljbGVTeXN0ZW1NYXRlcmlhbCwgVmVydGV4LCBEeW5hbWljQnVmZmVyQXR0cmlidXRlLCBJbnQ4QXR0cmlidXRlLCBVaW50OEF0dHJpYnV0ZSwgVWludDhDbGFtcGVkQXR0cmlidXRlLCBJbnQxNkF0dHJpYnV0ZSwgVWludDE2QXR0cmlidXRlLCBJbnQzMkF0dHJpYnV0ZSwgVWludDMyQXR0cmlidXRlLCBGbG9hdDMyQXR0cmlidXRlLCBGbG9hdDY0QXR0cmlidXRlLCBDbG9zZWRTcGxpbmVDdXJ2ZTMsIFNwbGluZUN1cnZlMywgU3BsaW5lLCBBeGlzSGVscGVyLCBCb3VuZGluZ0JveEhlbHBlciwgRWRnZXNIZWxwZXIsIFdpcmVmcmFtZUhlbHBlciwgWEhSTG9hZGVyLCBCaW5hcnlUZXh0dXJlTG9hZGVyLCBHZW9tZXRyeVV0aWxzLCBJbWFnZVV0aWxzLCBQcm9qZWN0b3IsIENhbnZhc1JlbmRlcmVyLCBTY2VuZVV0aWxzLCBMZW5zRmxhcmUgfTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gRXZlbnRzKHRhcmdldCl7XG4gIHZhciBldmVudHMgPSB7fSwgZW1wdHkgPSBbXTtcbiAgdGFyZ2V0ID0gdGFyZ2V0IHx8IHRoaXNcbiAgLyoqXG4gICAqICBPbjogbGlzdGVuIHRvIGV2ZW50c1xuICAgKi9cbiAgdGFyZ2V0Lm9uID0gZnVuY3Rpb24odHlwZSwgZnVuYywgY3R4KXtcbiAgICAoZXZlbnRzW3R5cGVdID0gZXZlbnRzW3R5cGVdIHx8IFtdKS5wdXNoKFtmdW5jLCBjdHhdKVxuICAgIHJldHVybiB0YXJnZXRcbiAgfVxuICAvKipcbiAgICogIE9mZjogc3RvcCBsaXN0ZW5pbmcgdG8gZXZlbnQgLyBzcGVjaWZpYyBjYWxsYmFja1xuICAgKi9cbiAgdGFyZ2V0Lm9mZiA9IGZ1bmN0aW9uKHR5cGUsIGZ1bmMpe1xuICAgIHR5cGUgfHwgKGV2ZW50cyA9IHt9KVxuICAgIHZhciBsaXN0ID0gZXZlbnRzW3R5cGVdIHx8IGVtcHR5LFxuICAgICAgICBpID0gbGlzdC5sZW5ndGggPSBmdW5jID8gbGlzdC5sZW5ndGggOiAwO1xuICAgIHdoaWxlKGktLSkgZnVuYyA9PSBsaXN0W2ldWzBdICYmIGxpc3Quc3BsaWNlKGksMSlcbiAgICByZXR1cm4gdGFyZ2V0XG4gIH1cbiAgLyoqIFxuICAgKiBFbWl0OiBzZW5kIGV2ZW50LCBjYWxsYmFja3Mgd2lsbCBiZSB0cmlnZ2VyZWRcbiAgICovXG4gIHRhcmdldC5lbWl0ID0gZnVuY3Rpb24odHlwZSl7XG4gICAgdmFyIGUgPSBldmVudHNbdHlwZV0gfHwgZW1wdHksIGxpc3QgPSBlLmxlbmd0aCA+IDAgPyBlLnNsaWNlKDAsIGUubGVuZ3RoKSA6IGUsIGk9MCwgajtcbiAgICB3aGlsZShqPWxpc3RbaSsrXSkgalswXS5hcHBseShqWzFdLCBlbXB0eS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpXG4gICAgcmV0dXJuIHRhcmdldFxuICB9O1xufTsiLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuLy8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHsgY3JlYXRlOiByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJykgfSk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QuY3JlYXRlJyk7XG52YXIgJE9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Q7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyZWF0ZShQLCBEKSB7XG4gIHJldHVybiAkT2JqZWN0LmNyZWF0ZShQLCBEKTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2NyZWF0ZVwiKTsiLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBUWVBFKSB7XG4gIGlmICghaXNPYmplY3QoaXQpIHx8IGl0Ll90ICE9PSBUWVBFKSB0aHJvdyBUeXBlRXJyb3IoJ0luY29tcGF0aWJsZSByZWNlaXZlciwgJyArIFRZUEUgKyAnIHJlcXVpcmVkIScpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKTtcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKTtcbnZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xudmFyICRpdGVyRGVmaW5lID0gcmVxdWlyZSgnLi9faXRlci1kZWZpbmUnKTtcbnZhciBzdGVwID0gcmVxdWlyZSgnLi9faXRlci1zdGVwJyk7XG52YXIgc2V0U3BlY2llcyA9IHJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyIGZhc3RLZXkgPSByZXF1aXJlKCcuL19tZXRhJykuZmFzdEtleTtcbnZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJy4vX3ZhbGlkYXRlLWNvbGxlY3Rpb24nKTtcbnZhciBTSVpFID0gREVTQ1JJUFRPUlMgPyAnX3MnIDogJ3NpemUnO1xuXG52YXIgZ2V0RW50cnkgPSBmdW5jdGlvbiAodGhhdCwga2V5KSB7XG4gIC8vIGZhc3QgY2FzZVxuICB2YXIgaW5kZXggPSBmYXN0S2V5KGtleSk7XG4gIHZhciBlbnRyeTtcbiAgaWYgKGluZGV4ICE9PSAnRicpIHJldHVybiB0aGF0Ll9pW2luZGV4XTtcbiAgLy8gZnJvemVuIG9iamVjdCBjYXNlXG4gIGZvciAoZW50cnkgPSB0aGF0Ll9mOyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uKSB7XG4gICAgaWYgKGVudHJ5LmsgPT0ga2V5KSByZXR1cm4gZW50cnk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRDb25zdHJ1Y3RvcjogZnVuY3Rpb24gKHdyYXBwZXIsIE5BTUUsIElTX01BUCwgQURERVIpIHtcbiAgICB2YXIgQyA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGl0ZXJhYmxlKSB7XG4gICAgICBhbkluc3RhbmNlKHRoYXQsIEMsIE5BTUUsICdfaScpO1xuICAgICAgdGhhdC5fdCA9IE5BTUU7ICAgICAgICAgLy8gY29sbGVjdGlvbiB0eXBlXG4gICAgICB0aGF0Ll9pID0gY3JlYXRlKG51bGwpOyAvLyBpbmRleFxuICAgICAgdGhhdC5fZiA9IHVuZGVmaW5lZDsgICAgLy8gZmlyc3QgZW50cnlcbiAgICAgIHRoYXQuX2wgPSB1bmRlZmluZWQ7ICAgIC8vIGxhc3QgZW50cnlcbiAgICAgIHRoYXRbU0laRV0gPSAwOyAgICAgICAgIC8vIHNpemVcbiAgICAgIGlmIChpdGVyYWJsZSAhPSB1bmRlZmluZWQpIGZvck9mKGl0ZXJhYmxlLCBJU19NQVAsIHRoYXRbQURERVJdLCB0aGF0KTtcbiAgICB9KTtcbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwge1xuICAgICAgLy8gMjMuMS4zLjEgTWFwLnByb3RvdHlwZS5jbGVhcigpXG4gICAgICAvLyAyMy4yLjMuMiBTZXQucHJvdG90eXBlLmNsZWFyKClcbiAgICAgIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgICAgZm9yICh2YXIgdGhhdCA9IHZhbGlkYXRlKHRoaXMsIE5BTUUpLCBkYXRhID0gdGhhdC5faSwgZW50cnkgPSB0aGF0Ll9mOyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uKSB7XG4gICAgICAgICAgZW50cnkuciA9IHRydWU7XG4gICAgICAgICAgaWYgKGVudHJ5LnApIGVudHJ5LnAgPSBlbnRyeS5wLm4gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgZGVsZXRlIGRhdGFbZW50cnkuaV07XG4gICAgICAgIH1cbiAgICAgICAgdGhhdC5fZiA9IHRoYXQuX2wgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoYXRbU0laRV0gPSAwO1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy4zIE1hcC5wcm90b3R5cGUuZGVsZXRlKGtleSlcbiAgICAgIC8vIDIzLjIuMy40IFNldC5wcm90b3R5cGUuZGVsZXRlKHZhbHVlKVxuICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHRoYXQgPSB2YWxpZGF0ZSh0aGlzLCBOQU1FKTtcbiAgICAgICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KTtcbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgdmFyIG5leHQgPSBlbnRyeS5uO1xuICAgICAgICAgIHZhciBwcmV2ID0gZW50cnkucDtcbiAgICAgICAgICBkZWxldGUgdGhhdC5faVtlbnRyeS5pXTtcbiAgICAgICAgICBlbnRyeS5yID0gdHJ1ZTtcbiAgICAgICAgICBpZiAocHJldikgcHJldi5uID0gbmV4dDtcbiAgICAgICAgICBpZiAobmV4dCkgbmV4dC5wID0gcHJldjtcbiAgICAgICAgICBpZiAodGhhdC5fZiA9PSBlbnRyeSkgdGhhdC5fZiA9IG5leHQ7XG4gICAgICAgICAgaWYgKHRoYXQuX2wgPT0gZW50cnkpIHRoYXQuX2wgPSBwcmV2O1xuICAgICAgICAgIHRoYXRbU0laRV0tLTtcbiAgICAgICAgfSByZXR1cm4gISFlbnRyeTtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4yLjMuNiBTZXQucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbiAgICAgIC8vIDIzLjEuMy41IE1hcC5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICAgICAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qICwgdGhhdCA9IHVuZGVmaW5lZCAqLykge1xuICAgICAgICB2YWxpZGF0ZSh0aGlzLCBOQU1FKTtcbiAgICAgICAgdmFyIGYgPSBjdHgoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpO1xuICAgICAgICB2YXIgZW50cnk7XG4gICAgICAgIHdoaWxlIChlbnRyeSA9IGVudHJ5ID8gZW50cnkubiA6IHRoaXMuX2YpIHtcbiAgICAgICAgICBmKGVudHJ5LnYsIGVudHJ5LmssIHRoaXMpO1xuICAgICAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yKSBlbnRyeSA9IGVudHJ5LnA7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyAyMy4xLjMuNyBNYXAucHJvdG90eXBlLmhhcyhrZXkpXG4gICAgICAvLyAyMy4yLjMuNyBTZXQucHJvdG90eXBlLmhhcyh2YWx1ZSlcbiAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICByZXR1cm4gISFnZXRFbnRyeSh2YWxpZGF0ZSh0aGlzLCBOQU1FKSwga2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoREVTQ1JJUFRPUlMpIGRQKEMucHJvdG90eXBlLCAnc2l6ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGUodGhpcywgTkFNRSlbU0laRV07XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIEM7XG4gIH0sXG4gIGRlZjogZnVuY3Rpb24gKHRoYXQsIGtleSwgdmFsdWUpIHtcbiAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgIHZhciBwcmV2LCBpbmRleDtcbiAgICAvLyBjaGFuZ2UgZXhpc3RpbmcgZW50cnlcbiAgICBpZiAoZW50cnkpIHtcbiAgICAgIGVudHJ5LnYgPSB2YWx1ZTtcbiAgICAvLyBjcmVhdGUgbmV3IGVudHJ5XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoYXQuX2wgPSBlbnRyeSA9IHtcbiAgICAgICAgaTogaW5kZXggPSBmYXN0S2V5KGtleSwgdHJ1ZSksIC8vIDwtIGluZGV4XG4gICAgICAgIGs6IGtleSwgICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSBrZXlcbiAgICAgICAgdjogdmFsdWUsICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIHZhbHVlXG4gICAgICAgIHA6IHByZXYgPSB0aGF0Ll9sLCAgICAgICAgICAgICAvLyA8LSBwcmV2aW91cyBlbnRyeVxuICAgICAgICBuOiB1bmRlZmluZWQsICAgICAgICAgICAgICAgICAgLy8gPC0gbmV4dCBlbnRyeVxuICAgICAgICByOiBmYWxzZSAgICAgICAgICAgICAgICAgICAgICAgLy8gPC0gcmVtb3ZlZFxuICAgICAgfTtcbiAgICAgIGlmICghdGhhdC5fZikgdGhhdC5fZiA9IGVudHJ5O1xuICAgICAgaWYgKHByZXYpIHByZXYubiA9IGVudHJ5O1xuICAgICAgdGhhdFtTSVpFXSsrO1xuICAgICAgLy8gYWRkIHRvIGluZGV4XG4gICAgICBpZiAoaW5kZXggIT09ICdGJykgdGhhdC5faVtpbmRleF0gPSBlbnRyeTtcbiAgICB9IHJldHVybiB0aGF0O1xuICB9LFxuICBnZXRFbnRyeTogZ2V0RW50cnksXG4gIHNldFN0cm9uZzogZnVuY3Rpb24gKEMsIE5BTUUsIElTX01BUCkge1xuICAgIC8vIGFkZCAua2V5cywgLnZhbHVlcywgLmVudHJpZXMsIFtAQGl0ZXJhdG9yXVxuICAgIC8vIDIzLjEuMy40LCAyMy4xLjMuOCwgMjMuMS4zLjExLCAyMy4xLjMuMTIsIDIzLjIuMy41LCAyMy4yLjMuOCwgMjMuMi4zLjEwLCAyMy4yLjMuMTFcbiAgICAkaXRlckRlZmluZShDLCBOQU1FLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgICAgIHRoaXMuX3QgPSB2YWxpZGF0ZShpdGVyYXRlZCwgTkFNRSk7IC8vIHRhcmdldFxuICAgICAgdGhpcy5fayA9IGtpbmQ7ICAgICAgICAgICAgICAgICAgICAgLy8ga2luZFxuICAgICAgdGhpcy5fbCA9IHVuZGVmaW5lZDsgICAgICAgICAgICAgICAgLy8gcHJldmlvdXNcbiAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICB2YXIga2luZCA9IHRoYXQuX2s7XG4gICAgICB2YXIgZW50cnkgPSB0aGF0Ll9sO1xuICAgICAgLy8gcmV2ZXJ0IHRvIHRoZSBsYXN0IGV4aXN0aW5nIGVudHJ5XG4gICAgICB3aGlsZSAoZW50cnkgJiYgZW50cnkucikgZW50cnkgPSBlbnRyeS5wO1xuICAgICAgLy8gZ2V0IG5leHQgZW50cnlcbiAgICAgIGlmICghdGhhdC5fdCB8fCAhKHRoYXQuX2wgPSBlbnRyeSA9IGVudHJ5ID8gZW50cnkubiA6IHRoYXQuX3QuX2YpKSB7XG4gICAgICAgIC8vIG9yIGZpbmlzaCB0aGUgaXRlcmF0aW9uXG4gICAgICAgIHRoYXQuX3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBzdGVwKDEpO1xuICAgICAgfVxuICAgICAgLy8gcmV0dXJuIHN0ZXAgYnkga2luZFxuICAgICAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4gc3RlcCgwLCBlbnRyeS5rKTtcbiAgICAgIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4gc3RlcCgwLCBlbnRyeS52KTtcbiAgICAgIHJldHVybiBzdGVwKDAsIFtlbnRyeS5rLCBlbnRyeS52XSk7XG4gICAgfSwgSVNfTUFQID8gJ2VudHJpZXMnIDogJ3ZhbHVlcycsICFJU19NQVAsIHRydWUpO1xuXG4gICAgLy8gYWRkIFtAQHNwZWNpZXNdLCAyMy4xLjIuMiwgMjMuMi4yLjJcbiAgICBzZXRTcGVjaWVzKE5BTUUpO1xuICB9XG59O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4vX2lzLWFycmF5Jyk7XG52YXIgU1BFQ0lFUyA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9yaWdpbmFsKSB7XG4gIHZhciBDO1xuICBpZiAoaXNBcnJheShvcmlnaW5hbCkpIHtcbiAgICBDID0gb3JpZ2luYWwuY29uc3RydWN0b3I7XG4gICAgLy8gY3Jvc3MtcmVhbG0gZmFsbGJhY2tcbiAgICBpZiAodHlwZW9mIEMgPT0gJ2Z1bmN0aW9uJyAmJiAoQyA9PT0gQXJyYXkgfHwgaXNBcnJheShDLnByb3RvdHlwZSkpKSBDID0gdW5kZWZpbmVkO1xuICAgIGlmIChpc09iamVjdChDKSkge1xuICAgICAgQyA9IENbU1BFQ0lFU107XG4gICAgICBpZiAoQyA9PT0gbnVsbCkgQyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0gcmV0dXJuIEMgPT09IHVuZGVmaW5lZCA/IEFycmF5IDogQztcbn07XG4iLCIvLyA5LjQuMi4zIEFycmF5U3BlY2llc0NyZWF0ZShvcmlnaW5hbEFycmF5LCBsZW5ndGgpXG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fYXJyYXktc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcmlnaW5hbCwgbGVuZ3RoKSB7XG4gIHJldHVybiBuZXcgKHNwZWNpZXNDb25zdHJ1Y3RvcihvcmlnaW5hbCkpKGxlbmd0aCk7XG59O1xuIiwiLy8gMCAtPiBBcnJheSNmb3JFYWNoXG4vLyAxIC0+IEFycmF5I21hcFxuLy8gMiAtPiBBcnJheSNmaWx0ZXJcbi8vIDMgLT4gQXJyYXkjc29tZVxuLy8gNCAtPiBBcnJheSNldmVyeVxuLy8gNSAtPiBBcnJheSNmaW5kXG4vLyA2IC0+IEFycmF5I2ZpbmRJbmRleFxudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGFzYyA9IHJlcXVpcmUoJy4vX2FycmF5LXNwZWNpZXMtY3JlYXRlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUWVBFLCAkY3JlYXRlKSB7XG4gIHZhciBJU19NQVAgPSBUWVBFID09IDE7XG4gIHZhciBJU19GSUxURVIgPSBUWVBFID09IDI7XG4gIHZhciBJU19TT01FID0gVFlQRSA9PSAzO1xuICB2YXIgSVNfRVZFUlkgPSBUWVBFID09IDQ7XG4gIHZhciBJU19GSU5EX0lOREVYID0gVFlQRSA9PSA2O1xuICB2YXIgTk9fSE9MRVMgPSBUWVBFID09IDUgfHwgSVNfRklORF9JTkRFWDtcbiAgdmFyIGNyZWF0ZSA9ICRjcmVhdGUgfHwgYXNjO1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBjYWxsYmFja2ZuLCB0aGF0KSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCgkdGhpcyk7XG4gICAgdmFyIHNlbGYgPSBJT2JqZWN0KE8pO1xuICAgIHZhciBmID0gY3R4KGNhbGxiYWNrZm4sIHRoYXQsIDMpO1xuICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aChzZWxmLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgcmVzdWx0ID0gSVNfTUFQID8gY3JlYXRlKCR0aGlzLCBsZW5ndGgpIDogSVNfRklMVEVSID8gY3JlYXRlKCR0aGlzLCAwKSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgdmFsLCByZXM7XG4gICAgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChOT19IT0xFUyB8fCBpbmRleCBpbiBzZWxmKSB7XG4gICAgICB2YWwgPSBzZWxmW2luZGV4XTtcbiAgICAgIHJlcyA9IGYodmFsLCBpbmRleCwgTyk7XG4gICAgICBpZiAoVFlQRSkge1xuICAgICAgICBpZiAoSVNfTUFQKSByZXN1bHRbaW5kZXhdID0gcmVzOyAgIC8vIG1hcFxuICAgICAgICBlbHNlIGlmIChyZXMpIHN3aXRjaCAoVFlQRSkge1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuIHRydWU7ICAgICAgICAgICAgIC8vIHNvbWVcbiAgICAgICAgICBjYXNlIDU6IHJldHVybiB2YWw7ICAgICAgICAgICAgICAvLyBmaW5kXG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gaW5kZXg7ICAgICAgICAgICAgLy8gZmluZEluZGV4XG4gICAgICAgICAgY2FzZSAyOiByZXN1bHQucHVzaCh2YWwpOyAgICAgICAgLy8gZmlsdGVyXG4gICAgICAgIH0gZWxzZSBpZiAoSVNfRVZFUlkpIHJldHVybiBmYWxzZTsgLy8gZXZlcnlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIElTX0ZJTkRfSU5ERVggPyAtMSA6IElTX1NPTUUgfHwgSVNfRVZFUlkgPyBJU19FVkVSWSA6IHJlc3VsdDtcbiAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIG1ldGEgPSByZXF1aXJlKCcuL19tZXRhJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKTtcbnZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBlYWNoID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDApO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTkFNRSwgd3JhcHBlciwgbWV0aG9kcywgY29tbW9uLCBJU19NQVAsIElTX1dFQUspIHtcbiAgdmFyIEJhc2UgPSBnbG9iYWxbTkFNRV07XG4gIHZhciBDID0gQmFzZTtcbiAgdmFyIEFEREVSID0gSVNfTUFQID8gJ3NldCcgOiAnYWRkJztcbiAgdmFyIHByb3RvID0gQyAmJiBDLnByb3RvdHlwZTtcbiAgdmFyIE8gPSB7fTtcbiAgaWYgKCFERVNDUklQVE9SUyB8fCB0eXBlb2YgQyAhPSAnZnVuY3Rpb24nIHx8ICEoSVNfV0VBSyB8fCBwcm90by5mb3JFYWNoICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgbmV3IEMoKS5lbnRyaWVzKCkubmV4dCgpO1xuICB9KSkpIHtcbiAgICAvLyBjcmVhdGUgY29sbGVjdGlvbiBjb25zdHJ1Y3RvclxuICAgIEMgPSBjb21tb24uZ2V0Q29uc3RydWN0b3Iod3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUik7XG4gICAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIG1ldGhvZHMpO1xuICAgIG1ldGEuTkVFRCA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgQyA9IHdyYXBwZXIoZnVuY3Rpb24gKHRhcmdldCwgaXRlcmFibGUpIHtcbiAgICAgIGFuSW5zdGFuY2UodGFyZ2V0LCBDLCBOQU1FLCAnX2MnKTtcbiAgICAgIHRhcmdldC5fYyA9IG5ldyBCYXNlKCk7XG4gICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBmb3JPZihpdGVyYWJsZSwgSVNfTUFQLCB0YXJnZXRbQURERVJdLCB0YXJnZXQpO1xuICAgIH0pO1xuICAgIGVhY2goJ2FkZCxjbGVhcixkZWxldGUsZm9yRWFjaCxnZXQsaGFzLHNldCxrZXlzLHZhbHVlcyxlbnRyaWVzLHRvSlNPTicuc3BsaXQoJywnKSwgZnVuY3Rpb24gKEtFWSkge1xuICAgICAgdmFyIElTX0FEREVSID0gS0VZID09ICdhZGQnIHx8IEtFWSA9PSAnc2V0JztcbiAgICAgIGlmIChLRVkgaW4gcHJvdG8gJiYgIShJU19XRUFLICYmIEtFWSA9PSAnY2xlYXInKSkgaGlkZShDLnByb3RvdHlwZSwgS0VZLCBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICBhbkluc3RhbmNlKHRoaXMsIEMsIEtFWSk7XG4gICAgICAgIGlmICghSVNfQURERVIgJiYgSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkpIHJldHVybiBLRVkgPT0gJ2dldCcgPyB1bmRlZmluZWQgOiBmYWxzZTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2NbS0VZXShhID09PSAwID8gMCA6IGEsIGIpO1xuICAgICAgICByZXR1cm4gSVNfQURERVIgPyB0aGlzIDogcmVzdWx0O1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgSVNfV0VBSyB8fCBkUChDLnByb3RvdHlwZSwgJ3NpemUnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Muc2l6ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldFRvU3RyaW5nVGFnKEMsIE5BTUUpO1xuXG4gIE9bTkFNRV0gPSBDO1xuICAkZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiwgTyk7XG5cbiAgaWYgKCFJU19XRUFLKSBjb21tb24uc2V0U3Ryb25nKEMsIE5BTUUsIElTX01BUCk7XG5cbiAgcmV0dXJuIEM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHN0cm9uZyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tc3Ryb25nJyk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCcuL192YWxpZGF0ZS1jb2xsZWN0aW9uJyk7XG52YXIgTUFQID0gJ01hcCc7XG5cbi8vIDIzLjEgTWFwIE9iamVjdHNcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKE1BUCwgZnVuY3Rpb24gKGdldCkge1xuICByZXR1cm4gZnVuY3Rpb24gTWFwKCkgeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuMS4zLjYgTWFwLnByb3RvdHlwZS5nZXQoa2V5KVxuICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICB2YXIgZW50cnkgPSBzdHJvbmcuZ2V0RW50cnkodmFsaWRhdGUodGhpcywgTUFQKSwga2V5KTtcbiAgICByZXR1cm4gZW50cnkgJiYgZW50cnkudjtcbiAgfSxcbiAgLy8gMjMuMS4zLjkgTWFwLnByb3RvdHlwZS5zZXQoa2V5LCB2YWx1ZSlcbiAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiBzdHJvbmcuZGVmKHZhbGlkYXRlKHRoaXMsIE1BUCksIGtleSA9PT0gMCA/IDAgOiBrZXksIHZhbHVlKTtcbiAgfVxufSwgc3Ryb25nLCB0cnVlKTtcbiIsInZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyLCBJVEVSQVRPUikge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGZvck9mKGl0ZXIsIGZhbHNlLCByZXN1bHQucHVzaCwgcmVzdWx0LCBJVEVSQVRPUik7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL0RhdmlkQnJ1YW50L01hcC1TZXQucHJvdG90eXBlLnRvSlNPTlxudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgZnJvbSA9IHJlcXVpcmUoJy4vX2FycmF5LWZyb20taXRlcmFibGUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE5BTUUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICBpZiAoY2xhc3NvZih0aGlzKSAhPSBOQU1FKSB0aHJvdyBUeXBlRXJyb3IoTkFNRSArIFwiI3RvSlNPTiBpc24ndCBnZW5lcmljXCIpO1xuICAgIHJldHVybiBmcm9tKHRoaXMpO1xuICB9O1xufTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EYXZpZEJydWFudC9NYXAtU2V0LnByb3RvdHlwZS50b0pTT05cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5SLCAnTWFwJywgeyB0b0pTT046IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tdG8tanNvbicpKCdNYXAnKSB9KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS9cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTExFQ1RJT04pIHtcbiAgJGV4cG9ydCgkZXhwb3J0LlMsIENPTExFQ1RJT04sIHsgb2Y6IGZ1bmN0aW9uIG9mKCkge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBBID0gbmV3IEFycmF5KGxlbmd0aCk7XG4gICAgd2hpbGUgKGxlbmd0aC0tKSBBW2xlbmd0aF0gPSBhcmd1bWVudHNbbGVuZ3RoXTtcbiAgICByZXR1cm4gbmV3IHRoaXMoQSk7XG4gIH0gfSk7XG59O1xuIiwiLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtbWFwLm9mXG5yZXF1aXJlKCcuL19zZXQtY29sbGVjdGlvbi1vZicpKCdNYXAnKTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS9cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTExFQ1RJT04pIHtcbiAgJGV4cG9ydCgkZXhwb3J0LlMsIENPTExFQ1RJT04sIHsgZnJvbTogZnVuY3Rpb24gZnJvbShzb3VyY2UgLyogLCBtYXBGbiwgdGhpc0FyZyAqLykge1xuICAgIHZhciBtYXBGbiA9IGFyZ3VtZW50c1sxXTtcbiAgICB2YXIgbWFwcGluZywgQSwgbiwgY2I7XG4gICAgYUZ1bmN0aW9uKHRoaXMpO1xuICAgIG1hcHBpbmcgPSBtYXBGbiAhPT0gdW5kZWZpbmVkO1xuICAgIGlmIChtYXBwaW5nKSBhRnVuY3Rpb24obWFwRm4pO1xuICAgIGlmIChzb3VyY2UgPT0gdW5kZWZpbmVkKSByZXR1cm4gbmV3IHRoaXMoKTtcbiAgICBBID0gW107XG4gICAgaWYgKG1hcHBpbmcpIHtcbiAgICAgIG4gPSAwO1xuICAgICAgY2IgPSBjdHgobWFwRm4sIGFyZ3VtZW50c1syXSwgMik7XG4gICAgICBmb3JPZihzb3VyY2UsIGZhbHNlLCBmdW5jdGlvbiAobmV4dEl0ZW0pIHtcbiAgICAgICAgQS5wdXNoKGNiKG5leHRJdGVtLCBuKyspKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3JPZihzb3VyY2UsIGZhbHNlLCBBLnB1c2gsIEEpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IHRoaXMoQSk7XG4gIH0gfSk7XG59O1xuIiwiLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtbWFwLmZyb21cbnJlcXVpcmUoJy4vX3NldC1jb2xsZWN0aW9uLWZyb20nKSgnTWFwJyk7XG4iLCJyZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYubWFwJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNy5tYXAudG8tanNvbicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczcubWFwLm9mJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNy5tYXAuZnJvbScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9tb2R1bGVzL19jb3JlJykuTWFwO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL21hcFwiKTsiLCIndXNlIHN0cmljdCc7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgaW52b2tlID0gcmVxdWlyZSgnLi9faW52b2tlJyk7XG52YXIgYXJyYXlTbGljZSA9IFtdLnNsaWNlO1xudmFyIGZhY3RvcmllcyA9IHt9O1xuXG52YXIgY29uc3RydWN0ID0gZnVuY3Rpb24gKEYsIGxlbiwgYXJncykge1xuICBpZiAoIShsZW4gaW4gZmFjdG9yaWVzKSkge1xuICAgIGZvciAodmFyIG4gPSBbXSwgaSA9IDA7IGkgPCBsZW47IGkrKykgbltpXSA9ICdhWycgKyBpICsgJ10nO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAgIGZhY3Rvcmllc1tsZW5dID0gRnVuY3Rpb24oJ0YsYScsICdyZXR1cm4gbmV3IEYoJyArIG4uam9pbignLCcpICsgJyknKTtcbiAgfSByZXR1cm4gZmFjdG9yaWVzW2xlbl0oRiwgYXJncyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZ1bmN0aW9uLmJpbmQgfHwgZnVuY3Rpb24gYmluZCh0aGF0IC8qICwgLi4uYXJncyAqLykge1xuICB2YXIgZm4gPSBhRnVuY3Rpb24odGhpcyk7XG4gIHZhciBwYXJ0QXJncyA9IGFycmF5U2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICB2YXIgYm91bmQgPSBmdW5jdGlvbiAoLyogYXJncy4uLiAqLykge1xuICAgIHZhciBhcmdzID0gcGFydEFyZ3MuY29uY2F0KGFycmF5U2xpY2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGJvdW5kID8gY29uc3RydWN0KGZuLCBhcmdzLmxlbmd0aCwgYXJncykgOiBpbnZva2UoZm4sIGFyZ3MsIHRoYXQpO1xuICB9O1xuICBpZiAoaXNPYmplY3QoZm4ucHJvdG90eXBlKSkgYm91bmQucHJvdG90eXBlID0gZm4ucHJvdG90eXBlO1xuICByZXR1cm4gYm91bmQ7XG59O1xuIiwiLy8gMjYuMS4yIFJlZmxlY3QuY29uc3RydWN0KHRhcmdldCwgYXJndW1lbnRzTGlzdCBbLCBuZXdUYXJnZXRdKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4vX2JpbmQnKTtcbnZhciByQ29uc3RydWN0ID0gKHJlcXVpcmUoJy4vX2dsb2JhbCcpLlJlZmxlY3QgfHwge30pLmNvbnN0cnVjdDtcblxuLy8gTVMgRWRnZSBzdXBwb3J0cyBvbmx5IDIgYXJndW1lbnRzIGFuZCBhcmd1bWVudHNMaXN0IGFyZ3VtZW50IGlzIG9wdGlvbmFsXG4vLyBGRiBOaWdodGx5IHNldHMgdGhpcmQgYXJndW1lbnQgYXMgYG5ldy50YXJnZXRgLCBidXQgZG9lcyBub3QgY3JlYXRlIGB0aGlzYCBmcm9tIGl0XG52YXIgTkVXX1RBUkdFVF9CVUcgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEYoKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuICEockNvbnN0cnVjdChmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0sIFtdLCBGKSBpbnN0YW5jZW9mIEYpO1xufSk7XG52YXIgQVJHU19CVUcgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICByQ29uc3RydWN0KGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7XG59KTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTkVXX1RBUkdFVF9CVUcgfHwgQVJHU19CVUcpLCAnUmVmbGVjdCcsIHtcbiAgY29uc3RydWN0OiBmdW5jdGlvbiBjb25zdHJ1Y3QoVGFyZ2V0LCBhcmdzIC8qICwgbmV3VGFyZ2V0ICovKSB7XG4gICAgYUZ1bmN0aW9uKFRhcmdldCk7XG4gICAgYW5PYmplY3QoYXJncyk7XG4gICAgdmFyIG5ld1RhcmdldCA9IGFyZ3VtZW50cy5sZW5ndGggPCAzID8gVGFyZ2V0IDogYUZ1bmN0aW9uKGFyZ3VtZW50c1syXSk7XG4gICAgaWYgKEFSR1NfQlVHICYmICFORVdfVEFSR0VUX0JVRykgcmV0dXJuIHJDb25zdHJ1Y3QoVGFyZ2V0LCBhcmdzLCBuZXdUYXJnZXQpO1xuICAgIGlmIChUYXJnZXQgPT0gbmV3VGFyZ2V0KSB7XG4gICAgICAvLyB3L28gYWx0ZXJlZCBuZXdUYXJnZXQsIG9wdGltaXphdGlvbiBmb3IgMC00IGFyZ3VtZW50c1xuICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6IHJldHVybiBuZXcgVGFyZ2V0KCk7XG4gICAgICAgIGNhc2UgMTogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSk7XG4gICAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgIGNhc2UgMzogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgIGNhc2UgNDogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gICAgICB9XG4gICAgICAvLyB3L28gYWx0ZXJlZCBuZXdUYXJnZXQsIGxvdCBvZiBhcmd1bWVudHMgY2FzZVxuICAgICAgdmFyICRhcmdzID0gW251bGxdO1xuICAgICAgJGFyZ3MucHVzaC5hcHBseSgkYXJncywgYXJncyk7XG4gICAgICByZXR1cm4gbmV3IChiaW5kLmFwcGx5KFRhcmdldCwgJGFyZ3MpKSgpO1xuICAgIH1cbiAgICAvLyB3aXRoIGFsdGVyZWQgbmV3VGFyZ2V0LCBub3Qgc3VwcG9ydCBidWlsdC1pbiBjb25zdHJ1Y3RvcnNcbiAgICB2YXIgcHJvdG8gPSBuZXdUYXJnZXQucHJvdG90eXBlO1xuICAgIHZhciBpbnN0YW5jZSA9IGNyZWF0ZShpc09iamVjdChwcm90bykgPyBwcm90byA6IE9iamVjdC5wcm90b3R5cGUpO1xuICAgIHZhciByZXN1bHQgPSBGdW5jdGlvbi5hcHBseS5jYWxsKFRhcmdldCwgaW5zdGFuY2UsIGFyZ3MpO1xuICAgIHJldHVybiBpc09iamVjdChyZXN1bHQpID8gcmVzdWx0IDogaW5zdGFuY2U7XG4gIH1cbn0pO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYucmVmbGVjdC5jb25zdHJ1Y3QnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLlJlZmxlY3QuY29uc3RydWN0O1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL3JlZmxlY3QvY29uc3RydWN0XCIpOyIsInZhciBfUmVmbGVjdCRjb25zdHJ1Y3QgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9yZWZsZWN0L2NvbnN0cnVjdFwiKTtcblxudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZShcIi4vc2V0UHJvdG90eXBlT2ZcIik7XG5cbmZ1bmN0aW9uIF9jb25zdHJ1Y3QoUGFyZW50LCBhcmdzLCBDbGFzcykge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgIT09IFwidW5kZWZpbmVkXCIgJiYgX1JlZmxlY3QkY29uc3RydWN0KSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfY29uc3RydWN0ID0gX1JlZmxlY3QkY29uc3RydWN0O1xuICB9IGVsc2Uge1xuICAgIG1vZHVsZS5leHBvcnRzID0gX2NvbnN0cnVjdCA9IGZ1bmN0aW9uIF9jb25zdHJ1Y3QoUGFyZW50LCBhcmdzLCBDbGFzcykge1xuICAgICAgdmFyIGEgPSBbbnVsbF07XG4gICAgICBhLnB1c2guYXBwbHkoYSwgYXJncyk7XG4gICAgICB2YXIgQ29uc3RydWN0b3IgPSBQYXJlbnQuYmluZC5hcHBseShQYXJlbnQsIGEpO1xuICAgICAgdmFyIGluc3RhbmNlID0gbmV3IENvbnN0cnVjdG9yKCk7XG4gICAgICBpZiAoQ2xhc3MpIHNldFByb3RvdHlwZU9mKGluc3RhbmNlLCBDbGFzcy5wcm90b3R5cGUpO1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gX2NvbnN0cnVjdC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9jb25zdHJ1Y3Q7IiwidmFyIF9PYmplY3QkY3JlYXRlID0gcmVxdWlyZShcIi4uL2NvcmUtanMvb2JqZWN0L2NyZWF0ZVwiKTtcblxudmFyIF9NYXAgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9tYXBcIik7XG5cbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCIuL2dldFByb3RvdHlwZU9mXCIpO1xuXG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiLi9zZXRQcm90b3R5cGVPZlwiKTtcblxudmFyIGNvbnN0cnVjdCA9IHJlcXVpcmUoXCIuL2NvbnN0cnVjdFwiKTtcblxuZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcihDbGFzcykge1xuICB2YXIgX2NhY2hlID0gdHlwZW9mIF9NYXAgPT09IFwiZnVuY3Rpb25cIiA/IG5ldyBfTWFwKCkgOiB1bmRlZmluZWQ7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBfd3JhcE5hdGl2ZVN1cGVyID0gZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcihDbGFzcykge1xuICAgIGlmICh0eXBlb2YgQ2xhc3MgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgX2NhY2hlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoX2NhY2hlLmhhcyhDbGFzcykpIHJldHVybiBfY2FjaGUuZ2V0KENsYXNzKTtcblxuICAgICAgX2NhY2hlLnNldChDbGFzcywgV3JhcHBlcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gV3JhcHBlcigpIHt9XG5cbiAgICBXcmFwcGVyLnByb3RvdHlwZSA9IF9PYmplY3QkY3JlYXRlKENsYXNzLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IFdyYXBwZXIsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHNldFByb3RvdHlwZU9mKFdyYXBwZXIsIHNldFByb3RvdHlwZU9mKGZ1bmN0aW9uIFN1cGVyKCkge1xuICAgICAgcmV0dXJuIGNvbnN0cnVjdChDbGFzcywgYXJndW1lbnRzLCBnZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3Rvcik7XG4gICAgfSwgQ2xhc3MpKTtcbiAgfTtcblxuICByZXR1cm4gX3dyYXBOYXRpdmVTdXBlcihDbGFzcyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3dyYXBOYXRpdmVTdXBlcjsiLCJleHBvcnQgY2xhc3MgQ29tcG9zaXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoY2xhc3NJbnN0YW5jZSwgbWVzc2FnZSwgY29tcG9uZW50KSB7XG4gICAgc3VwZXIoYEAke2NsYXNzSW5zdGFuY2V9OiAke21lc3NhZ2V9YCk7XG5cbiAgICBjb25zdCBzdGFja0FycmF5ID0gdGhpcy5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgc3RhY2tBcnJheS5zcGxpY2UoMSwgMik7XG5cbiAgICB0aGlzLnN0YWNrID0gc3RhY2tBcnJheS5qb2luKCdcXG4nKTtcblxuICAgIGlmIChjb25zb2xlKSBjb25zb2xlLmVycm9yKCdDb21wb25lbnQ6JywgY29tcG9uZW50KTtcblxuICAgIHRoaXMubmFtZSA9ICdDb21wb3NpdGlvbkVycm9yJztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVwZW5kZW5jeUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihjbGFzc0luc3RhbmNlLCBtZXNzYWdlLCBhY3RpdmVNb2R1bGUsIGRlcGVuZGVuY3lNb2R1bGUgPSBmYWxzZSkge1xuICAgIHN1cGVyKGBAJHtjbGFzc0luc3RhbmNlfTogJHttZXNzYWdlfWApO1xuXG4gICAgY29uc3Qgc3RhY2tBcnJheSA9IHRoaXMuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgIHN0YWNrQXJyYXkuc3BsaWNlKDEsIDIpO1xuXG4gICAgdGhpcy5zdGFjayA9IHN0YWNrQXJyYXkuam9pbignXFxuJyk7XG5cbiAgICBpZiAoY29uc29sZSkgY29uc29sZS5lcnJvcignQWN0aXZlIG1vZHVsZTonLCBhY3RpdmVNb2R1bGUpO1xuICAgIGlmIChjb25zb2xlICYmIGRlcGVuZGVuY3lNb2R1bGUpIGNvbnNvbGUuZXJyb3IoJ0RlcGVuZGVuY3kgcHVibGlzaGVkIGJ5IG1vZHVsZTonLCBkZXBlbmRlbmN5TW9kdWxlKTtcblxuICAgIHRoaXMubmFtZSA9ICdEZXBlbmRlbmN5RXJyb3InO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYW5hZ2VyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGNsYXNzSW5zdGFuY2UsIG1lc3NhZ2UsIGNvbXBvbmVudCwgYWN0aXZlTW9kdWxlID0gZmFsc2UpIHtcbiAgICBzdXBlcihgQCR7Y2xhc3NJbnN0YW5jZX06ICR7bWVzc2FnZX1gKTtcblxuICAgIGNvbnN0IHN0YWNrQXJyYXkgPSB0aGlzLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICBzdGFja0FycmF5LnNwbGljZSgxLCAyKTtcblxuICAgIHRoaXMuc3RhY2sgPSBzdGFja0FycmF5LmpvaW4oJ1xcbicpO1xuXG4gICAgaWYgKGNvbnNvbGUpIGNvbnNvbGUuZXJyb3IoJ0NvbXBvbmVudDonLCBjb21wb25lbnQpO1xuICAgIGlmIChjb25zb2xlICYmIGFjdGl2ZU1vZHVsZSkgY29uc29sZS5lcnJvcignQWN0aXZlIG1vZHVsZTonLCBhY3RpdmVNb2R1bGUpO1xuXG4gICAgdGhpcy5uYW1lID0gJ01hbmFnZXJFcnJvcic7XG4gIH1cbn1cbiIsImltcG9ydCB7UkVWSVNJT059IGZyb20gJ3RocmVlJztcbmltcG9ydCBFdmVudHMgZnJvbSAnbWluaXZlbnRzJztcbmltcG9ydCB7TWFuYWdlckVycm9yfSBmcm9tICcuL2Vycm9ycyc7XG5cbi8vIENoZWNrIGZvciBUaHJlZS5qc1xuY29uc3Qgd2FybkRlcHMgPSAoKSA9PiB7XG4gIHRocm93IG5ldyBFcnJvcignV2hpdGVzdG9ybUpTIEZyYW1ld29yayByZXF1IGlyZXMgVGhyZWUuanMgcjkyLiBodHRwczovL3RocmVlanMub3JnLycpO1xufTtcblxudHJ5IHtcbiAgaWYgKCFSRVZJU0lPTikgd2FybkRlcHMoKTtcbn0gY2F0Y2ggKGVycikge1xuICB3YXJuRGVwcygpO1xufVxuXG4vKipcbiAqIEBjbGFzcyBNb2R1bGVTeXN0ZW1cbiAqIEBjYXRlZ29yeSBjb3JlXG4gKiBAZGVzY3JpcHRpb24gIFByb3ZpZGVzIEFQSSBmb3IgY2xhc3NlcyB0aGF0IHdpbGwgdXNlIE1vZHVsZXMuPGJyLz5cbiAqIFRoaXMgY2xhc3MgaW5jbHVkZXMgYmFzaWMgZXZlbnQgc3lzdGVtIHdpdGggdGhvc2Ugc3VwcG9ydGVkIG1ldGhvZHM6XG4gKiA8cHJlPi5vbigpPC9wcmU+PHByZT4ub2ZmKCk8L3ByZT48cHJlPi5lbWl0KCk8L3ByZT5cbiAqIEBleHRlbmRzIEV2ZW50c1xuICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2R1bGVTeXN0ZW0gZXh0ZW5kcyBFdmVudHMge1xuICAvLyBJTlRFR1JBVElOR1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGludGVncmF0ZU1vZHVsZXNcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBUaGlzIG1ldGhvZCBhcHBsaWVzIGFsbCBtb2R1bGVzIGZyb20gLm1vZHVsZXMgY29sbGVjdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IFtzb3VyY2VdIElmIHNvdXJjZSAoc2hvdWxkIGJlIGEgY29tcG9uZW50KSBpcyBwcm92aWRlZCwgd2lsbCByZXBsYWNlIC5tb2R1bGVzIHdpdGggc291cmNlJ3Mgb25lIGJlZm9yZSBleGVjdXRpbmcgbW9kdWxlcy5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZVN5c3RlbVxuICAgKi9cbiAgaW50ZWdyYXRlTW9kdWxlcyhzb3VyY2UpIHtcbiAgICBpZiAoIXRoaXMubW9kdWxlcyAmJiAhc291cmNlKSByZXR1cm47XG4gICAgaWYgKHNvdXJjZSAmJiBzb3VyY2UubW9kdWxlcykgdGhpcy5tb2R1bGVzID0gc291cmNlLm1vZHVsZXMuc2xpY2UoMCk7XG5cbiAgICBpZiAodGhpcy5tb2R1bGVzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMCwgbWF4ID0gdGhpcy5tb2R1bGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKVxuICAgICAgICB0aGlzLmFwcGx5TW9kdWxlKHRoaXMubW9kdWxlc1tpXSwgZmFsc2UpO1xuICAgIH1cblxuICAgIGlmIChzb3VyY2UpIHRoaXMuYXBwbHlCcmlkZ2Uoe29uQ29weTogc291cmNlfSk7XG4gIH1cblxuICAvLyBBUFBMWUlORyBNT0RVTEUgKC4uLmFuZCBhIFwiYnJpZGdlXCIgZm9yIG1vZHVsZSlcblxuICAvKipcbiAgICogQG1ldGhvZCBhcHBseUJyaWRnZVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIE1ha2VzIGNvbXBvbmVudC1zcGVjaWZpYyBBUEkgdG8gd29yayB3aXRoIG1vZHVsZXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBicmlkZ2VNYXBcbiAgICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIG9iamVjdCB3aXRoIG1vZGlmaWVkIHZhbHVlcy5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZVN5c3RlbVxuICAgKi9cbiAgYXBwbHlCcmlkZ2UoYnJpZGdlTWFwID0ge30pIHtcbiAgICBjb25zdCB7bW9kdWxlc30gPSB0aGlzO1xuICAgIGlmICghbW9kdWxlcykgcmV0dXJuIGJyaWRnZU1hcDtcblxuICAgIGZvciAobGV0IGkgPSAwLCBtYXggPSBtb2R1bGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBicmlkZ2VNYXApIHtcbiAgICAgICAgaWYgKGJyaWRnZU1hcFtrZXldKSB7XG4gICAgICAgICAgY29uc3QgbW9kdWxlID0gbW9kdWxlc1tpXTtcblxuICAgICAgICAgIGlmIChtb2R1bGUgJiYgbW9kdWxlLmJyaWRnZSAmJiBtb2R1bGUuYnJpZGdlW2tleV0pXG4gICAgICAgICAgICBicmlkZ2VNYXBba2V5XSA9IG1vZHVsZS5icmlkZ2Vba2V5XS5hcHBseSh0aGlzLCBbYnJpZGdlTWFwW2tleV0sIG1vZHVsZV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJyaWRnZU1hcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGFwcGx5Q29tbWFuZFxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIC5hcHBseUNvbW1hbmQgcnVucyBhIG1ldGhvZCBjYWxsZWQgYG5hbWVgIG9uIGFsbCBtb2R1bGVzLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbWV0aG9kIG5hbWUuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYj0oZnVuYywgbW9kdWxlU2NvcGUpID0+IGZ1bmMuYXBwbHkodGhpcywgW21vZHVsZVNjb3BlXSldIEhvdyB0aGUgZnVuY3Rpb24gaXMgd3JhcHBlZC9cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZVN5c3RlbVxuICAgKi9cbiAgYXBwbHlDb21tYW5kKG5hbWUsIGNiID0gKGZ1bmMsIG1vZHVsZVNjb3BlKSA9PiBmdW5jLmFwcGx5KHRoaXMsIFttb2R1bGVTY29wZV0pKSB7XG4gICAgY29uc3Qge21vZHVsZXN9ID0gdGhpcztcbiAgICBpZiAoIW1vZHVsZXMpIHJldHVybjtcblxuICAgIGZvciAobGV0IGkgPSAwLCBtYXggPSBtb2R1bGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7XG4gICAgICBjb25zdCBtb2R1bGUgPSBtb2R1bGVzW2ldO1xuICAgICAgaWYgKG5hbWUgaW4gbW9kdWxlKSBjYihtb2R1bGVbbmFtZV0sIG1vZHVsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYXBwbHlNb2R1bGVcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiAuYXBwbHlNb2R1bGUgaXMgYWxzbyB1c2VkIGluIC5pbnRlZ3JhdGVNb2R1bGVzKCkgZnVuY3Rpb24uXG4gICAqIEl0IGRvZXMgZXhhY3RseSB3aGF0IGl0cyBuYW1lIHNheXMgKGFwcGxpZXMgbW9kdWxlIHRvIGNvbXBvbmVudCBvciBhcHApLlxuICAgKiBAcGFyYW0ge09iamVjdH0gbW9kdWxlIHRoZSBtb2R1bGUgdG8gYXBwbHlcbiAgICogQHBhcmFtIHtCb29sZWFufSBbcHVzaD10cnVlXVxuICAgKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgbW9kdWxlIHRoYXQgd2FzIGFwcGxpZWQuXG4gICAqIEB0aHJvd3Mge01hbmFnZXJFcnJvcn1cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZVN5c3RlbVxuICAgKi9cbiAgYXBwbHlNb2R1bGUobW9kdWxlLCBwdXNoID0gdHJ1ZSkge1xuICAgIGlmICghbW9kdWxlKSByZXR1cm47XG4gICAgaWYgKHB1c2ggJiYgdGhpcy5tb2R1bGVzKSB0aGlzLm1vZHVsZXMucHVzaChtb2R1bGUpO1xuICAgIGVsc2UgaWYgKHB1c2gpIHRoaXMubW9kdWxlcyA9IFttb2R1bGVdO1xuXG4gICAgaWYgKHRoaXMubWFuYWdlcikgdGhpcy5tYW5hZ2VyLmFjdGl2ZShtb2R1bGUpO1xuXG4gICAgaWYgKG1vZHVsZS5tYW5hZ2VyICYmIHRoaXMubWFuYWdlcikgbW9kdWxlLm1hbmFnZXIodGhpcy5tYW5hZ2VyKTtcbiAgICBlbHNlIGlmIChtb2R1bGUubWFuYWdlcikge1xuICAgICAgdGhyb3cgbmV3IE1hbmFnZXJFcnJvcihcbiAgICAgICAgJ0NvbXBvbmVudCcsXG4gICAgICAgIGBNb2R1bGUgcmVxdWlyZXMgTW9kdWxlTWFuYWdlciB0aGF0IGlzIHR1cm5lZCBvZmYgZm9yIHRoaXMgY29tcG9uZW50YCxcbiAgICAgICAgdGhpcywgbW9kdWxlXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtb2R1bGUuaW50ZWdyYXRlKSBtb2R1bGUuaW50ZWdyYXRlLmJpbmQodGhpcykobW9kdWxlKTtcblxuICAgIHJldHVybiBtb2R1bGU7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBkaXNwb3NlTW9kdWxlc1xuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIERpc3Bvc2VzIG9mIGFsbCBtb2R1bGVzXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVTeXN0ZW1cbiAgICovXG4gIGRpc3Bvc2VNb2R1bGVzKCkge1xuICAgIHdoaWxlICh0aGlzLm1vZHVsZXMubGVuZ3RoKVxuICAgICAgdGhpcy5kaXNwb3NlTW9kdWxlKHRoaXMubW9kdWxlc1swXSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBkaXNwb3NlTW9kdWxlXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gRGlzcG9zZXMgb2YgdGhlIGdpdmVuIG1vZHVsZVxuICAgKiBAcGFyYW0ge09iamVjdH0gbW9kdWxlIHRoZSBtb2R1bGUgdG8gZGlzcG9zZVxuICAgKiBAcmV0dXJuIHtNb2R1bGV9IFJldHVybnMgbW9kdWxlIHRoYXQgd2FzIHJlbW92ZWQuXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVTeXN0ZW1cbiAgICovXG4gIGRpc3Bvc2VNb2R1bGUobW9kdWxlKSB7XG4gICAgaWYgKCFtb2R1bGUpIHJldHVybjtcblxuICAgIHRoaXMubW9kdWxlcy5zcGxpY2UodGhpcy5tb2R1bGVzLmluZGV4T2YobW9kdWxlKSwgMSk7XG5cbiAgICBpZiAobW9kdWxlLmRpc3Bvc2UpIG1vZHVsZS5kaXNwb3NlLmJpbmQodGhpcykobW9kdWxlKTtcblxuICAgIHJldHVybiBtb2R1bGU7XG4gIH1cblxuICAvLyBQSVBFRCBNRVRIT0RcblxuICAvKipcbiAgICogQG1ldGhvZCBtb2R1bGVcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBwaXBlZCB2ZXJzaW9uIG9mIC5hcHBseU1vZHVsZSgpLlxuICAgKiBAcGFyYW0ge09iamVjdH0gbW9kdWxlIHRoZSBtb2R1bGUgdG8gYXBwbHlcbiAgICogQHJldHVybiB7dGhpc30gcmV0dXJucyB0aGlzIC0gYXBwL2NvbXBvbmVudFxuICAgKiBAdGhyb3dzIHtNYW5hZ2VyRXJyb3J9XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVTeXN0ZW1cbiAgICogQGV4YW1wbGUgPGNhcHRpb24+UGlwZWQgbW9kdWxlczwvY2FwdGlvbj5cbiAgICogY29tcG9uZW50XG4gICAqICAgLm1vZHVsZShuZXcgTW9kdWxlMSgpKVxuICAgKiAgIC5tb2R1bGUobmV3IE1vZHVsZTIoKSlcbiAgICogICAubW9kdWxlKG5ldyBNb2R1bGUzKCkpXG4gICAqL1xuICBtb2R1bGUobW9kdWxlKSB7XG4gICAgdGhpcy5hcHBseU1vZHVsZShtb2R1bGUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG4iLCJmdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2FycmF5V2l0aEhvbGVzOyIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGdldCA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvciA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgaXRlckZuID0gZ2V0KGl0KTtcbiAgaWYgKHR5cGVvZiBpdGVyRm4gIT0gJ2Z1bmN0aW9uJykgdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgaXRlcmFibGUhJyk7XG4gIHJldHVybiBhbk9iamVjdChpdGVyRm4uY2FsbChpdCkpO1xufTtcbiIsInJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3InKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9nZXQtaXRlcmF0b3JcIik7IiwidmFyIF9nZXRJdGVyYXRvciA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL2dldC1pdGVyYXRvclwiKTtcblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkge1xuICB2YXIgX2FyciA9IFtdO1xuICB2YXIgX24gPSB0cnVlO1xuICB2YXIgX2QgPSBmYWxzZTtcbiAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgX2kgPSBfZ2V0SXRlcmF0b3IoYXJyKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgIF9hcnIucHVzaChfcy52YWx1ZSk7XG5cbiAgICAgIGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhaztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9kID0gdHJ1ZTtcbiAgICBfZSA9IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoX2QpIHRocm93IF9lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBfYXJyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pdGVyYWJsZVRvQXJyYXlMaW1pdDsiLCJmdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfbm9uSXRlcmFibGVSZXN0OyIsInZhciBhcnJheVdpdGhIb2xlcyA9IHJlcXVpcmUoXCIuL2FycmF5V2l0aEhvbGVzXCIpO1xuXG52YXIgaXRlcmFibGVUb0FycmF5TGltaXQgPSByZXF1aXJlKFwiLi9pdGVyYWJsZVRvQXJyYXlMaW1pdFwiKTtcblxudmFyIG5vbkl0ZXJhYmxlUmVzdCA9IHJlcXVpcmUoXCIuL25vbkl0ZXJhYmxlUmVzdFwiKTtcblxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7XG4gIHJldHVybiBhcnJheVdpdGhIb2xlcyhhcnIpIHx8IGl0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgbm9uSXRlcmFibGVSZXN0KCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3NsaWNlZFRvQXJyYXk7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3ltYm9sT2JzZXJ2YWJsZVBvbnlmaWxsKHJvb3QpIHtcblx0dmFyIHJlc3VsdDtcblx0dmFyIFN5bWJvbCA9IHJvb3QuU3ltYm9sO1xuXG5cdGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0aWYgKFN5bWJvbC5vYnNlcnZhYmxlKSB7XG5cdFx0XHRyZXN1bHQgPSBTeW1ib2wub2JzZXJ2YWJsZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVzdWx0ID0gU3ltYm9sKCdvYnNlcnZhYmxlJyk7XG5cdFx0XHRTeW1ib2wub2JzZXJ2YWJsZSA9IHJlc3VsdDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmVzdWx0ID0gJ0BAb2JzZXJ2YWJsZSc7XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufTtcbiIsIi8qIGdsb2JhbCB3aW5kb3cgKi9cbmltcG9ydCBwb255ZmlsbCBmcm9tICcuL3BvbnlmaWxsLmpzJztcblxudmFyIHJvb3Q7XG5cbmlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgcm9vdCA9IHNlbGY7XG59IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIHJvb3QgPSB3aW5kb3c7XG59IGVsc2UgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG4gIHJvb3QgPSBnbG9iYWw7XG59IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSB7XG4gIHJvb3QgPSBtb2R1bGU7XG59IGVsc2Uge1xuICByb290ID0gRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbn1cblxudmFyIHJlc3VsdCA9IHBvbnlmaWxsKHJvb3QpO1xuZXhwb3J0IGRlZmF1bHQgcmVzdWx0O1xuIiwiaW1wb3J0ICQkb2JzZXJ2YWJsZSBmcm9tICdzeW1ib2wtb2JzZXJ2YWJsZSc7XG5cbi8qKlxuICogVGhlc2UgYXJlIHByaXZhdGUgYWN0aW9uIHR5cGVzIHJlc2VydmVkIGJ5IFJlZHV4LlxuICogRm9yIGFueSB1bmtub3duIGFjdGlvbnMsIHlvdSBtdXN0IHJldHVybiB0aGUgY3VycmVudCBzdGF0ZS5cbiAqIElmIHRoZSBjdXJyZW50IHN0YXRlIGlzIHVuZGVmaW5lZCwgeW91IG11c3QgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLlxuICogRG8gbm90IHJlZmVyZW5jZSB0aGVzZSBhY3Rpb24gdHlwZXMgZGlyZWN0bHkgaW4geW91ciBjb2RlLlxuICovXG52YXIgQWN0aW9uVHlwZXMgPSB7XG4gIElOSVQ6ICdAQHJlZHV4L0lOSVQnICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpLnNwbGl0KCcnKS5qb2luKCcuJyksXG4gIFJFUExBQ0U6ICdAQHJlZHV4L1JFUExBQ0UnICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpLnNwbGl0KCcnKS5qb2luKCcuJylcbn07XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqO1xufSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG59O1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gb2JqIFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBhcmd1bWVudCBhcHBlYXJzIHRvIGJlIGEgcGxhaW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikge1xuICBpZiAoKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKG9iaikpICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICB2YXIgcHJvdG8gPSBvYmo7XG4gIHdoaWxlIChPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pICE9PSBudWxsKSB7XG4gICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopID09PSBwcm90bztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgUmVkdXggc3RvcmUgdGhhdCBob2xkcyB0aGUgc3RhdGUgdHJlZS5cbiAqIFRoZSBvbmx5IHdheSB0byBjaGFuZ2UgdGhlIGRhdGEgaW4gdGhlIHN0b3JlIGlzIHRvIGNhbGwgYGRpc3BhdGNoKClgIG9uIGl0LlxuICpcbiAqIFRoZXJlIHNob3VsZCBvbmx5IGJlIGEgc2luZ2xlIHN0b3JlIGluIHlvdXIgYXBwLiBUbyBzcGVjaWZ5IGhvdyBkaWZmZXJlbnRcbiAqIHBhcnRzIG9mIHRoZSBzdGF0ZSB0cmVlIHJlc3BvbmQgdG8gYWN0aW9ucywgeW91IG1heSBjb21iaW5lIHNldmVyYWwgcmVkdWNlcnNcbiAqIGludG8gYSBzaW5nbGUgcmVkdWNlciBmdW5jdGlvbiBieSB1c2luZyBgY29tYmluZVJlZHVjZXJzYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWR1Y2VyIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBuZXh0IHN0YXRlIHRyZWUsIGdpdmVuXG4gKiB0aGUgY3VycmVudCBzdGF0ZSB0cmVlIGFuZCB0aGUgYWN0aW9uIHRvIGhhbmRsZS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gW3ByZWxvYWRlZFN0YXRlXSBUaGUgaW5pdGlhbCBzdGF0ZS4gWW91IG1heSBvcHRpb25hbGx5IHNwZWNpZnkgaXRcbiAqIHRvIGh5ZHJhdGUgdGhlIHN0YXRlIGZyb20gdGhlIHNlcnZlciBpbiB1bml2ZXJzYWwgYXBwcywgb3IgdG8gcmVzdG9yZSBhXG4gKiBwcmV2aW91c2x5IHNlcmlhbGl6ZWQgdXNlciBzZXNzaW9uLlxuICogSWYgeW91IHVzZSBgY29tYmluZVJlZHVjZXJzYCB0byBwcm9kdWNlIHRoZSByb290IHJlZHVjZXIgZnVuY3Rpb24sIHRoaXMgbXVzdCBiZVxuICogYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgc2hhcGUgYXMgYGNvbWJpbmVSZWR1Y2Vyc2Aga2V5cy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZW5oYW5jZXJdIFRoZSBzdG9yZSBlbmhhbmNlci4gWW91IG1heSBvcHRpb25hbGx5IHNwZWNpZnkgaXRcbiAqIHRvIGVuaGFuY2UgdGhlIHN0b3JlIHdpdGggdGhpcmQtcGFydHkgY2FwYWJpbGl0aWVzIHN1Y2ggYXMgbWlkZGxld2FyZSxcbiAqIHRpbWUgdHJhdmVsLCBwZXJzaXN0ZW5jZSwgZXRjLiBUaGUgb25seSBzdG9yZSBlbmhhbmNlciB0aGF0IHNoaXBzIHdpdGggUmVkdXhcbiAqIGlzIGBhcHBseU1pZGRsZXdhcmUoKWAuXG4gKlxuICogQHJldHVybnMge1N0b3JlfSBBIFJlZHV4IHN0b3JlIHRoYXQgbGV0cyB5b3UgcmVhZCB0aGUgc3RhdGUsIGRpc3BhdGNoIGFjdGlvbnNcbiAqIGFuZCBzdWJzY3JpYmUgdG8gY2hhbmdlcy5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlU3RvcmUocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUsIGVuaGFuY2VyKSB7XG4gIHZhciBfcmVmMjtcblxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBlbmhhbmNlciA9IHByZWxvYWRlZFN0YXRlO1xuICAgIHByZWxvYWRlZFN0YXRlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlbmhhbmNlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAodHlwZW9mIGVuaGFuY2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRoZSBlbmhhbmNlciB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIHJldHVybiBlbmhhbmNlcihjcmVhdGVTdG9yZSkocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiByZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0aGUgcmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRSZWR1Y2VyID0gcmVkdWNlcjtcbiAgdmFyIGN1cnJlbnRTdGF0ZSA9IHByZWxvYWRlZFN0YXRlO1xuICB2YXIgY3VycmVudExpc3RlbmVycyA9IFtdO1xuICB2YXIgbmV4dExpc3RlbmVycyA9IGN1cnJlbnRMaXN0ZW5lcnM7XG4gIHZhciBpc0Rpc3BhdGNoaW5nID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpIHtcbiAgICBpZiAobmV4dExpc3RlbmVycyA9PT0gY3VycmVudExpc3RlbmVycykge1xuICAgICAgbmV4dExpc3RlbmVycyA9IGN1cnJlbnRMaXN0ZW5lcnMuc2xpY2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIHN0YXRlIHRyZWUgbWFuYWdlZCBieSB0aGUgc3RvcmUuXG4gICAqXG4gICAqIEByZXR1cm5zIHthbnl9IFRoZSBjdXJyZW50IHN0YXRlIHRyZWUgb2YgeW91ciBhcHBsaWNhdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIGdldFN0YXRlKCkge1xuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtYXkgbm90IGNhbGwgc3RvcmUuZ2V0U3RhdGUoKSB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuICcgKyAnVGhlIHJlZHVjZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgdGhlIHN0YXRlIGFzIGFuIGFyZ3VtZW50LiAnICsgJ1Bhc3MgaXQgZG93biBmcm9tIHRoZSB0b3AgcmVkdWNlciBpbnN0ZWFkIG9mIHJlYWRpbmcgaXQgZnJvbSB0aGUgc3RvcmUuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnRTdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2hhbmdlIGxpc3RlbmVyLiBJdCB3aWxsIGJlIGNhbGxlZCBhbnkgdGltZSBhbiBhY3Rpb24gaXMgZGlzcGF0Y2hlZCxcbiAgICogYW5kIHNvbWUgcGFydCBvZiB0aGUgc3RhdGUgdHJlZSBtYXkgcG90ZW50aWFsbHkgaGF2ZSBjaGFuZ2VkLiBZb3UgbWF5IHRoZW5cbiAgICogY2FsbCBgZ2V0U3RhdGUoKWAgdG8gcmVhZCB0aGUgY3VycmVudCBzdGF0ZSB0cmVlIGluc2lkZSB0aGUgY2FsbGJhY2suXG4gICAqXG4gICAqIFlvdSBtYXkgY2FsbCBgZGlzcGF0Y2goKWAgZnJvbSBhIGNoYW5nZSBsaXN0ZW5lciwgd2l0aCB0aGUgZm9sbG93aW5nXG4gICAqIGNhdmVhdHM6XG4gICAqXG4gICAqIDEuIFRoZSBzdWJzY3JpcHRpb25zIGFyZSBzbmFwc2hvdHRlZCBqdXN0IGJlZm9yZSBldmVyeSBgZGlzcGF0Y2goKWAgY2FsbC5cbiAgICogSWYgeW91IHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSB3aGlsZSB0aGUgbGlzdGVuZXJzIGFyZSBiZWluZyBpbnZva2VkLCB0aGlzXG4gICAqIHdpbGwgbm90IGhhdmUgYW55IGVmZmVjdCBvbiB0aGUgYGRpc3BhdGNoKClgIHRoYXQgaXMgY3VycmVudGx5IGluIHByb2dyZXNzLlxuICAgKiBIb3dldmVyLCB0aGUgbmV4dCBgZGlzcGF0Y2goKWAgY2FsbCwgd2hldGhlciBuZXN0ZWQgb3Igbm90LCB3aWxsIHVzZSBhIG1vcmVcbiAgICogcmVjZW50IHNuYXBzaG90IG9mIHRoZSBzdWJzY3JpcHRpb24gbGlzdC5cbiAgICpcbiAgICogMi4gVGhlIGxpc3RlbmVyIHNob3VsZCBub3QgZXhwZWN0IHRvIHNlZSBhbGwgc3RhdGUgY2hhbmdlcywgYXMgdGhlIHN0YXRlXG4gICAqIG1pZ2h0IGhhdmUgYmVlbiB1cGRhdGVkIG11bHRpcGxlIHRpbWVzIGR1cmluZyBhIG5lc3RlZCBgZGlzcGF0Y2goKWAgYmVmb3JlXG4gICAqIHRoZSBsaXN0ZW5lciBpcyBjYWxsZWQuIEl0IGlzLCBob3dldmVyLCBndWFyYW50ZWVkIHRoYXQgYWxsIHN1YnNjcmliZXJzXG4gICAqIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBgZGlzcGF0Y2goKWAgc3RhcnRlZCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBsYXRlc3RcbiAgICogc3RhdGUgYnkgdGhlIHRpbWUgaXQgZXhpdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIEEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBvbiBldmVyeSBkaXNwYXRjaC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRvIHJlbW92ZSB0aGlzIGNoYW5nZSBsaXN0ZW5lci5cbiAgICovXG4gIGZ1bmN0aW9uIHN1YnNjcmliZShsaXN0ZW5lcikge1xuICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdGhlIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG1heSBub3QgY2FsbCBzdG9yZS5zdWJzY3JpYmUoKSB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuICcgKyAnSWYgeW91IHdvdWxkIGxpa2UgdG8gYmUgbm90aWZpZWQgYWZ0ZXIgdGhlIHN0b3JlIGhhcyBiZWVuIHVwZGF0ZWQsIHN1YnNjcmliZSBmcm9tIGEgJyArICdjb21wb25lbnQgYW5kIGludm9rZSBzdG9yZS5nZXRTdGF0ZSgpIGluIHRoZSBjYWxsYmFjayB0byBhY2Nlc3MgdGhlIGxhdGVzdCBzdGF0ZS4gJyArICdTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvYXBpLXJlZmVyZW5jZS9zdG9yZSNzdWJzY3JpYmUobGlzdGVuZXIpIGZvciBtb3JlIGRldGFpbHMuJyk7XG4gICAgfVxuXG4gICAgdmFyIGlzU3Vic2NyaWJlZCA9IHRydWU7XG5cbiAgICBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCk7XG4gICAgbmV4dExpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcblxuICAgIHJldHVybiBmdW5jdGlvbiB1bnN1YnNjcmliZSgpIHtcbiAgICAgIGlmICghaXNTdWJzY3JpYmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbWF5IG5vdCB1bnN1YnNjcmliZSBmcm9tIGEgc3RvcmUgbGlzdGVuZXIgd2hpbGUgdGhlIHJlZHVjZXIgaXMgZXhlY3V0aW5nLiAnICsgJ1NlZSBodHRwczovL3JlZHV4LmpzLm9yZy9hcGktcmVmZXJlbmNlL3N0b3JlI3N1YnNjcmliZShsaXN0ZW5lcikgZm9yIG1vcmUgZGV0YWlscy4nKTtcbiAgICAgIH1cblxuICAgICAgaXNTdWJzY3JpYmVkID0gZmFsc2U7XG5cbiAgICAgIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKTtcbiAgICAgIHZhciBpbmRleCA9IG5leHRMaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICBuZXh0TGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGFuIGFjdGlvbi4gSXQgaXMgdGhlIG9ubHkgd2F5IHRvIHRyaWdnZXIgYSBzdGF0ZSBjaGFuZ2UuXG4gICAqXG4gICAqIFRoZSBgcmVkdWNlcmAgZnVuY3Rpb24sIHVzZWQgdG8gY3JlYXRlIHRoZSBzdG9yZSwgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGVcbiAgICogY3VycmVudCBzdGF0ZSB0cmVlIGFuZCB0aGUgZ2l2ZW4gYGFjdGlvbmAuIEl0cyByZXR1cm4gdmFsdWUgd2lsbFxuICAgKiBiZSBjb25zaWRlcmVkIHRoZSAqKm5leHQqKiBzdGF0ZSBvZiB0aGUgdHJlZSwgYW5kIHRoZSBjaGFuZ2UgbGlzdGVuZXJzXG4gICAqIHdpbGwgYmUgbm90aWZpZWQuXG4gICAqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9ubHkgc3VwcG9ydHMgcGxhaW4gb2JqZWN0IGFjdGlvbnMuIElmIHlvdSB3YW50IHRvXG4gICAqIGRpc3BhdGNoIGEgUHJvbWlzZSwgYW4gT2JzZXJ2YWJsZSwgYSB0aHVuaywgb3Igc29tZXRoaW5nIGVsc2UsIHlvdSBuZWVkIHRvXG4gICAqIHdyYXAgeW91ciBzdG9yZSBjcmVhdGluZyBmdW5jdGlvbiBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIG1pZGRsZXdhcmUuIEZvclxuICAgKiBleGFtcGxlLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBgcmVkdXgtdGh1bmtgIHBhY2thZ2UuIEV2ZW4gdGhlXG4gICAqIG1pZGRsZXdhcmUgd2lsbCBldmVudHVhbGx5IGRpc3BhdGNoIHBsYWluIG9iamVjdCBhY3Rpb25zIHVzaW5nIHRoaXMgbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uIEEgcGxhaW4gb2JqZWN0IHJlcHJlc2VudGluZyDigJx3aGF0IGNoYW5nZWTigJ0uIEl0IGlzXG4gICAqIGEgZ29vZCBpZGVhIHRvIGtlZXAgYWN0aW9ucyBzZXJpYWxpemFibGUgc28geW91IGNhbiByZWNvcmQgYW5kIHJlcGxheSB1c2VyXG4gICAqIHNlc3Npb25zLCBvciB1c2UgdGhlIHRpbWUgdHJhdmVsbGluZyBgcmVkdXgtZGV2dG9vbHNgLiBBbiBhY3Rpb24gbXVzdCBoYXZlXG4gICAqIGEgYHR5cGVgIHByb3BlcnR5IHdoaWNoIG1heSBub3QgYmUgYHVuZGVmaW5lZGAuIEl0IGlzIGEgZ29vZCBpZGVhIHRvIHVzZVxuICAgKiBzdHJpbmcgY29uc3RhbnRzIGZvciBhY3Rpb24gdHlwZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEZvciBjb252ZW5pZW5jZSwgdGhlIHNhbWUgYWN0aW9uIG9iamVjdCB5b3UgZGlzcGF0Y2hlZC5cbiAgICpcbiAgICogTm90ZSB0aGF0LCBpZiB5b3UgdXNlIGEgY3VzdG9tIG1pZGRsZXdhcmUsIGl0IG1heSB3cmFwIGBkaXNwYXRjaCgpYCB0b1xuICAgKiByZXR1cm4gc29tZXRoaW5nIGVsc2UgKGZvciBleGFtcGxlLCBhIFByb21pc2UgeW91IGNhbiBhd2FpdCkuXG4gICAqL1xuICBmdW5jdGlvbiBkaXNwYXRjaChhY3Rpb24pIHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3QoYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBY3Rpb25zIG11c3QgYmUgcGxhaW4gb2JqZWN0cy4gJyArICdVc2UgY3VzdG9tIG1pZGRsZXdhcmUgZm9yIGFzeW5jIGFjdGlvbnMuJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBhY3Rpb24udHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWN0aW9ucyBtYXkgbm90IGhhdmUgYW4gdW5kZWZpbmVkIFwidHlwZVwiIHByb3BlcnR5LiAnICsgJ0hhdmUgeW91IG1pc3NwZWxsZWQgYSBjb25zdGFudD8nKTtcbiAgICB9XG5cbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWR1Y2VycyBtYXkgbm90IGRpc3BhdGNoIGFjdGlvbnMuJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlzRGlzcGF0Y2hpbmcgPSB0cnVlO1xuICAgICAgY3VycmVudFN0YXRlID0gY3VycmVudFJlZHVjZXIoY3VycmVudFN0YXRlLCBhY3Rpb24pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpc0Rpc3BhdGNoaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIGxpc3RlbmVycyA9IGN1cnJlbnRMaXN0ZW5lcnMgPSBuZXh0TGlzdGVuZXJzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07XG4gICAgICBsaXN0ZW5lcigpO1xuICAgIH1cblxuICAgIHJldHVybiBhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZXMgdGhlIHJlZHVjZXIgY3VycmVudGx5IHVzZWQgYnkgdGhlIHN0b3JlIHRvIGNhbGN1bGF0ZSB0aGUgc3RhdGUuXG4gICAqXG4gICAqIFlvdSBtaWdodCBuZWVkIHRoaXMgaWYgeW91ciBhcHAgaW1wbGVtZW50cyBjb2RlIHNwbGl0dGluZyBhbmQgeW91IHdhbnQgdG9cbiAgICogbG9hZCBzb21lIG9mIHRoZSByZWR1Y2VycyBkeW5hbWljYWxseS4gWW91IG1pZ2h0IGFsc28gbmVlZCB0aGlzIGlmIHlvdVxuICAgKiBpbXBsZW1lbnQgYSBob3QgcmVsb2FkaW5nIG1lY2hhbmlzbSBmb3IgUmVkdXguXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG5leHRSZWR1Y2VyIFRoZSByZWR1Y2VyIGZvciB0aGUgc3RvcmUgdG8gdXNlIGluc3RlYWQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZVJlZHVjZXIobmV4dFJlZHVjZXIpIHtcbiAgICBpZiAodHlwZW9mIG5leHRSZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRoZSBuZXh0UmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIGN1cnJlbnRSZWR1Y2VyID0gbmV4dFJlZHVjZXI7XG4gICAgZGlzcGF0Y2goeyB0eXBlOiBBY3Rpb25UeXBlcy5SRVBMQUNFIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVyb3BlcmFiaWxpdHkgcG9pbnQgZm9yIG9ic2VydmFibGUvcmVhY3RpdmUgbGlicmFyaWVzLlxuICAgKiBAcmV0dXJucyB7b2JzZXJ2YWJsZX0gQSBtaW5pbWFsIG9ic2VydmFibGUgb2Ygc3RhdGUgY2hhbmdlcy5cbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgb2JzZXJ2YWJsZSBwcm9wb3NhbDpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb2JzZXJ2YWJsZVxuICAgKi9cbiAgZnVuY3Rpb24gb2JzZXJ2YWJsZSgpIHtcbiAgICB2YXIgX3JlZjtcblxuICAgIHZhciBvdXRlclN1YnNjcmliZSA9IHN1YnNjcmliZTtcbiAgICByZXR1cm4gX3JlZiA9IHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG1pbmltYWwgb2JzZXJ2YWJsZSBzdWJzY3JpcHRpb24gbWV0aG9kLlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9ic2VydmVyIEFueSBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBvYnNlcnZlci5cbiAgICAgICAqIFRoZSBvYnNlcnZlciBvYmplY3Qgc2hvdWxkIGhhdmUgYSBgbmV4dGAgbWV0aG9kLlxuICAgICAgICogQHJldHVybnMge3N1YnNjcmlwdGlvbn0gQW4gb2JqZWN0IHdpdGggYW4gYHVuc3Vic2NyaWJlYCBtZXRob2QgdGhhdCBjYW5cbiAgICAgICAqIGJlIHVzZWQgdG8gdW5zdWJzY3JpYmUgdGhlIG9ic2VydmFibGUgZnJvbSB0aGUgc3RvcmUsIGFuZCBwcmV2ZW50IGZ1cnRoZXJcbiAgICAgICAqIGVtaXNzaW9uIG9mIHZhbHVlcyBmcm9tIHRoZSBvYnNlcnZhYmxlLlxuICAgICAgICovXG4gICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uIHN1YnNjcmliZShvYnNlcnZlcikge1xuICAgICAgICBpZiAoKHR5cGVvZiBvYnNlcnZlciA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2Yob2JzZXJ2ZXIpKSAhPT0gJ29iamVjdCcgfHwgb2JzZXJ2ZXIgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCB0aGUgb2JzZXJ2ZXIgdG8gYmUgYW4gb2JqZWN0LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gb2JzZXJ2ZVN0YXRlKCkge1xuICAgICAgICAgIGlmIChvYnNlcnZlci5uZXh0KSB7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KGdldFN0YXRlKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG9ic2VydmVTdGF0ZSgpO1xuICAgICAgICB2YXIgdW5zdWJzY3JpYmUgPSBvdXRlclN1YnNjcmliZShvYnNlcnZlU3RhdGUpO1xuICAgICAgICByZXR1cm4geyB1bnN1YnNjcmliZTogdW5zdWJzY3JpYmUgfTtcbiAgICAgIH1cbiAgICB9LCBfcmVmWyQkb2JzZXJ2YWJsZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LCBfcmVmO1xuICB9XG5cbiAgLy8gV2hlbiBhIHN0b3JlIGlzIGNyZWF0ZWQsIGFuIFwiSU5JVFwiIGFjdGlvbiBpcyBkaXNwYXRjaGVkIHNvIHRoYXQgZXZlcnlcbiAgLy8gcmVkdWNlciByZXR1cm5zIHRoZWlyIGluaXRpYWwgc3RhdGUuIFRoaXMgZWZmZWN0aXZlbHkgcG9wdWxhdGVzXG4gIC8vIHRoZSBpbml0aWFsIHN0YXRlIHRyZWUuXG4gIGRpc3BhdGNoKHsgdHlwZTogQWN0aW9uVHlwZXMuSU5JVCB9KTtcblxuICByZXR1cm4gX3JlZjIgPSB7XG4gICAgZGlzcGF0Y2g6IGRpc3BhdGNoLFxuICAgIHN1YnNjcmliZTogc3Vic2NyaWJlLFxuICAgIGdldFN0YXRlOiBnZXRTdGF0ZSxcbiAgICByZXBsYWNlUmVkdWNlcjogcmVwbGFjZVJlZHVjZXJcbiAgfSwgX3JlZjJbJCRvYnNlcnZhYmxlXSA9IG9ic2VydmFibGUsIF9yZWYyO1xufVxuXG4vKipcbiAqIFByaW50cyBhIHdhcm5pbmcgaW4gdGhlIGNvbnNvbGUgaWYgaXQgZXhpc3RzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIFRoZSB3YXJuaW5nIG1lc3NhZ2UuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gd2FybmluZyhtZXNzYWdlKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbiAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY29uc29sZS5lcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gIH1cbiAgLyogZXNsaW50LWVuYWJsZSBuby1jb25zb2xlICovXG4gIHRyeSB7XG4gICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCBpZiB5b3UgZW5hYmxlXG4gICAgLy8gXCJicmVhayBvbiBhbGwgZXhjZXB0aW9uc1wiIGluIHlvdXIgY29uc29sZSxcbiAgICAvLyBpdCB3b3VsZCBwYXVzZSB0aGUgZXhlY3V0aW9uIGF0IHRoaXMgbGluZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIH0gY2F0Y2ggKGUpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcbn1cblxuZnVuY3Rpb24gZ2V0VW5kZWZpbmVkU3RhdGVFcnJvck1lc3NhZ2Uoa2V5LCBhY3Rpb24pIHtcbiAgdmFyIGFjdGlvblR5cGUgPSBhY3Rpb24gJiYgYWN0aW9uLnR5cGU7XG4gIHZhciBhY3Rpb25EZXNjcmlwdGlvbiA9IGFjdGlvblR5cGUgJiYgJ2FjdGlvbiBcIicgKyBTdHJpbmcoYWN0aW9uVHlwZSkgKyAnXCInIHx8ICdhbiBhY3Rpb24nO1xuXG4gIHJldHVybiAnR2l2ZW4gJyArIGFjdGlvbkRlc2NyaXB0aW9uICsgJywgcmVkdWNlciBcIicgKyBrZXkgKyAnXCIgcmV0dXJuZWQgdW5kZWZpbmVkLiAnICsgJ1RvIGlnbm9yZSBhbiBhY3Rpb24sIHlvdSBtdXN0IGV4cGxpY2l0bHkgcmV0dXJuIHRoZSBwcmV2aW91cyBzdGF0ZS4gJyArICdJZiB5b3Ugd2FudCB0aGlzIHJlZHVjZXIgdG8gaG9sZCBubyB2YWx1ZSwgeW91IGNhbiByZXR1cm4gbnVsbCBpbnN0ZWFkIG9mIHVuZGVmaW5lZC4nO1xufVxuXG5mdW5jdGlvbiBnZXRVbmV4cGVjdGVkU3RhdGVTaGFwZVdhcm5pbmdNZXNzYWdlKGlucHV0U3RhdGUsIHJlZHVjZXJzLCBhY3Rpb24sIHVuZXhwZWN0ZWRLZXlDYWNoZSkge1xuICB2YXIgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gIHZhciBhcmd1bWVudE5hbWUgPSBhY3Rpb24gJiYgYWN0aW9uLnR5cGUgPT09IEFjdGlvblR5cGVzLklOSVQgPyAncHJlbG9hZGVkU3RhdGUgYXJndW1lbnQgcGFzc2VkIHRvIGNyZWF0ZVN0b3JlJyA6ICdwcmV2aW91cyBzdGF0ZSByZWNlaXZlZCBieSB0aGUgcmVkdWNlcic7XG5cbiAgaWYgKHJlZHVjZXJLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnU3RvcmUgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIHJlZHVjZXIuIE1ha2Ugc3VyZSB0aGUgYXJndW1lbnQgcGFzc2VkICcgKyAndG8gY29tYmluZVJlZHVjZXJzIGlzIGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIHJlZHVjZXJzLic7XG4gIH1cblxuICBpZiAoIWlzUGxhaW5PYmplY3QoaW5wdXRTdGF0ZSkpIHtcbiAgICByZXR1cm4gJ1RoZSAnICsgYXJndW1lbnROYW1lICsgJyBoYXMgdW5leHBlY3RlZCB0eXBlIG9mIFwiJyArIHt9LnRvU3RyaW5nLmNhbGwoaW5wdXRTdGF0ZSkubWF0Y2goL1xccyhbYS16fEEtWl0rKS8pWzFdICsgJ1wiLiBFeHBlY3RlZCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nICcgKyAoJ2tleXM6IFwiJyArIHJlZHVjZXJLZXlzLmpvaW4oJ1wiLCBcIicpICsgJ1wiJyk7XG4gIH1cblxuICB2YXIgdW5leHBlY3RlZEtleXMgPSBPYmplY3Qua2V5cyhpbnB1dFN0YXRlKS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiAhcmVkdWNlcnMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhdW5leHBlY3RlZEtleUNhY2hlW2tleV07XG4gIH0pO1xuXG4gIHVuZXhwZWN0ZWRLZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHVuZXhwZWN0ZWRLZXlDYWNoZVtrZXldID0gdHJ1ZTtcbiAgfSk7XG5cbiAgaWYgKGFjdGlvbiAmJiBhY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZXMuUkVQTEFDRSkgcmV0dXJuO1xuXG4gIGlmICh1bmV4cGVjdGVkS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuICdVbmV4cGVjdGVkICcgKyAodW5leHBlY3RlZEtleXMubGVuZ3RoID4gMSA/ICdrZXlzJyA6ICdrZXknKSArICcgJyArICgnXCInICsgdW5leHBlY3RlZEtleXMuam9pbignXCIsIFwiJykgKyAnXCIgZm91bmQgaW4gJyArIGFyZ3VtZW50TmFtZSArICcuICcpICsgJ0V4cGVjdGVkIHRvIGZpbmQgb25lIG9mIHRoZSBrbm93biByZWR1Y2VyIGtleXMgaW5zdGVhZDogJyArICgnXCInICsgcmVkdWNlcktleXMuam9pbignXCIsIFwiJykgKyAnXCIuIFVuZXhwZWN0ZWQga2V5cyB3aWxsIGJlIGlnbm9yZWQuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0UmVkdWNlclNoYXBlKHJlZHVjZXJzKSB7XG4gIE9iamVjdC5rZXlzKHJlZHVjZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgcmVkdWNlciA9IHJlZHVjZXJzW2tleV07XG4gICAgdmFyIGluaXRpYWxTdGF0ZSA9IHJlZHVjZXIodW5kZWZpbmVkLCB7IHR5cGU6IEFjdGlvblR5cGVzLklOSVQgfSk7XG5cbiAgICBpZiAodHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVkdWNlciBcIicgKyBrZXkgKyAnXCIgcmV0dXJuZWQgdW5kZWZpbmVkIGR1cmluZyBpbml0aWFsaXphdGlvbi4gJyArICdJZiB0aGUgc3RhdGUgcGFzc2VkIHRvIHRoZSByZWR1Y2VyIGlzIHVuZGVmaW5lZCwgeW91IG11c3QgJyArICdleHBsaWNpdGx5IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5ICcgKyAnbm90IGJlIHVuZGVmaW5lZC4gSWYgeW91IGRvblxcJ3Qgd2FudCB0byBzZXQgYSB2YWx1ZSBmb3IgdGhpcyByZWR1Y2VyLCAnICsgJ3lvdSBjYW4gdXNlIG51bGwgaW5zdGVhZCBvZiB1bmRlZmluZWQuJyk7XG4gICAgfVxuXG4gICAgdmFyIHR5cGUgPSAnQEByZWR1eC9QUk9CRV9VTktOT1dOX0FDVElPTl8nICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpLnNwbGl0KCcnKS5qb2luKCcuJyk7XG4gICAgaWYgKHR5cGVvZiByZWR1Y2VyKHVuZGVmaW5lZCwgeyB0eXBlOiB0eXBlIH0pID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWR1Y2VyIFwiJyArIGtleSArICdcIiByZXR1cm5lZCB1bmRlZmluZWQgd2hlbiBwcm9iZWQgd2l0aCBhIHJhbmRvbSB0eXBlLiAnICsgKCdEb25cXCd0IHRyeSB0byBoYW5kbGUgJyArIEFjdGlvblR5cGVzLklOSVQgKyAnIG9yIG90aGVyIGFjdGlvbnMgaW4gXCJyZWR1eC8qXCIgJykgKyAnbmFtZXNwYWNlLiBUaGV5IGFyZSBjb25zaWRlcmVkIHByaXZhdGUuIEluc3RlYWQsIHlvdSBtdXN0IHJldHVybiB0aGUgJyArICdjdXJyZW50IHN0YXRlIGZvciBhbnkgdW5rbm93biBhY3Rpb25zLCB1bmxlc3MgaXQgaXMgdW5kZWZpbmVkLCAnICsgJ2luIHdoaWNoIGNhc2UgeW91IG11c3QgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLCByZWdhcmRsZXNzIG9mIHRoZSAnICsgJ2FjdGlvbiB0eXBlLiBUaGUgaW5pdGlhbCBzdGF0ZSBtYXkgbm90IGJlIHVuZGVmaW5lZCwgYnV0IGNhbiBiZSBudWxsLicpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogVHVybnMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgZGlmZmVyZW50IHJlZHVjZXIgZnVuY3Rpb25zLCBpbnRvIGEgc2luZ2xlXG4gKiByZWR1Y2VyIGZ1bmN0aW9uLiBJdCB3aWxsIGNhbGwgZXZlcnkgY2hpbGQgcmVkdWNlciwgYW5kIGdhdGhlciB0aGVpciByZXN1bHRzXG4gKiBpbnRvIGEgc2luZ2xlIHN0YXRlIG9iamVjdCwgd2hvc2Uga2V5cyBjb3JyZXNwb25kIHRvIHRoZSBrZXlzIG9mIHRoZSBwYXNzZWRcbiAqIHJlZHVjZXIgZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWR1Y2VycyBBbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGNvcnJlc3BvbmQgdG8gZGlmZmVyZW50XG4gKiByZWR1Y2VyIGZ1bmN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgY29tYmluZWQgaW50byBvbmUuIE9uZSBoYW5keSB3YXkgdG8gb2J0YWluXG4gKiBpdCBpcyB0byB1c2UgRVM2IGBpbXBvcnQgKiBhcyByZWR1Y2Vyc2Agc3ludGF4LiBUaGUgcmVkdWNlcnMgbWF5IG5ldmVyIHJldHVyblxuICogdW5kZWZpbmVkIGZvciBhbnkgYWN0aW9uLiBJbnN0ZWFkLCB0aGV5IHNob3VsZCByZXR1cm4gdGhlaXIgaW5pdGlhbCBzdGF0ZVxuICogaWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGVtIHdhcyB1bmRlZmluZWQsIGFuZCB0aGUgY3VycmVudCBzdGF0ZSBmb3IgYW55XG4gKiB1bnJlY29nbml6ZWQgYWN0aW9uLlxuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSByZWR1Y2VyIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBldmVyeSByZWR1Y2VyIGluc2lkZSB0aGVcbiAqIHBhc3NlZCBvYmplY3QsIGFuZCBidWlsZHMgYSBzdGF0ZSBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaGFwZS5cbiAqL1xuZnVuY3Rpb24gY29tYmluZVJlZHVjZXJzKHJlZHVjZXJzKSB7XG4gIHZhciByZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKHJlZHVjZXJzKTtcbiAgdmFyIGZpbmFsUmVkdWNlcnMgPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWR1Y2VyS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSByZWR1Y2VyS2V5c1tpXTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHdhcm5pbmcoJ05vIHJlZHVjZXIgcHJvdmlkZWQgZm9yIGtleSBcIicgKyBrZXkgKyAnXCInKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGZpbmFsUmVkdWNlcnNba2V5XSA9IHJlZHVjZXJzW2tleV07XG4gICAgfVxuICB9XG4gIHZhciBmaW5hbFJlZHVjZXJLZXlzID0gT2JqZWN0LmtleXMoZmluYWxSZWR1Y2Vycyk7XG5cbiAgdmFyIHVuZXhwZWN0ZWRLZXlDYWNoZSA9IHZvaWQgMDtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB1bmV4cGVjdGVkS2V5Q2FjaGUgPSB7fTtcbiAgfVxuXG4gIHZhciBzaGFwZUFzc2VydGlvbkVycm9yID0gdm9pZCAwO1xuICB0cnkge1xuICAgIGFzc2VydFJlZHVjZXJTaGFwZShmaW5hbFJlZHVjZXJzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNoYXBlQXNzZXJ0aW9uRXJyb3IgPSBlO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbWJpbmF0aW9uKCkge1xuICAgIHZhciBzdGF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgdmFyIGFjdGlvbiA9IGFyZ3VtZW50c1sxXTtcblxuICAgIGlmIChzaGFwZUFzc2VydGlvbkVycm9yKSB7XG4gICAgICB0aHJvdyBzaGFwZUFzc2VydGlvbkVycm9yO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgd2FybmluZ01lc3NhZ2UgPSBnZXRVbmV4cGVjdGVkU3RhdGVTaGFwZVdhcm5pbmdNZXNzYWdlKHN0YXRlLCBmaW5hbFJlZHVjZXJzLCBhY3Rpb24sIHVuZXhwZWN0ZWRLZXlDYWNoZSk7XG4gICAgICBpZiAod2FybmluZ01lc3NhZ2UpIHtcbiAgICAgICAgd2FybmluZyh3YXJuaW5nTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGhhc0NoYW5nZWQgPSBmYWxzZTtcbiAgICB2YXIgbmV4dFN0YXRlID0ge307XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGZpbmFsUmVkdWNlcktleXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2tleSA9IGZpbmFsUmVkdWNlcktleXNbX2ldO1xuICAgICAgdmFyIHJlZHVjZXIgPSBmaW5hbFJlZHVjZXJzW19rZXldO1xuICAgICAgdmFyIHByZXZpb3VzU3RhdGVGb3JLZXkgPSBzdGF0ZVtfa2V5XTtcbiAgICAgIHZhciBuZXh0U3RhdGVGb3JLZXkgPSByZWR1Y2VyKHByZXZpb3VzU3RhdGVGb3JLZXksIGFjdGlvbik7XG4gICAgICBpZiAodHlwZW9mIG5leHRTdGF0ZUZvcktleSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdmFyIGVycm9yTWVzc2FnZSA9IGdldFVuZGVmaW5lZFN0YXRlRXJyb3JNZXNzYWdlKF9rZXksIGFjdGlvbik7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgfVxuICAgICAgbmV4dFN0YXRlW19rZXldID0gbmV4dFN0YXRlRm9yS2V5O1xuICAgICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgbmV4dFN0YXRlRm9yS2V5ICE9PSBwcmV2aW91c1N0YXRlRm9yS2V5O1xuICAgIH1cbiAgICByZXR1cm4gaGFzQ2hhbmdlZCA/IG5leHRTdGF0ZSA6IHN0YXRlO1xuICB9O1xufVxuXG5mdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb25DcmVhdG9yLCBkaXNwYXRjaCkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBkaXNwYXRjaChhY3Rpb25DcmVhdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9O1xufVxuXG4vKipcbiAqIFR1cm5zIGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIGFjdGlvbiBjcmVhdG9ycywgaW50byBhbiBvYmplY3Qgd2l0aCB0aGVcbiAqIHNhbWUga2V5cywgYnV0IHdpdGggZXZlcnkgZnVuY3Rpb24gd3JhcHBlZCBpbnRvIGEgYGRpc3BhdGNoYCBjYWxsIHNvIHRoZXlcbiAqIG1heSBiZSBpbnZva2VkIGRpcmVjdGx5LiBUaGlzIGlzIGp1c3QgYSBjb252ZW5pZW5jZSBtZXRob2QsIGFzIHlvdSBjYW4gY2FsbFxuICogYHN0b3JlLmRpc3BhdGNoKE15QWN0aW9uQ3JlYXRvcnMuZG9Tb21ldGhpbmcoKSlgIHlvdXJzZWxmIGp1c3QgZmluZS5cbiAqXG4gKiBGb3IgY29udmVuaWVuY2UsIHlvdSBjYW4gYWxzbyBwYXNzIGEgc2luZ2xlIGZ1bmN0aW9uIGFzIHRoZSBmaXJzdCBhcmd1bWVudCxcbiAqIGFuZCBnZXQgYSBmdW5jdGlvbiBpbiByZXR1cm4uXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R9IGFjdGlvbkNyZWF0b3JzIEFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIGFjdGlvblxuICogY3JlYXRvciBmdW5jdGlvbnMuIE9uZSBoYW5keSB3YXkgdG8gb2J0YWluIGl0IGlzIHRvIHVzZSBFUzYgYGltcG9ydCAqIGFzYFxuICogc3ludGF4LiBZb3UgbWF5IGFsc28gcGFzcyBhIHNpbmdsZSBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBkaXNwYXRjaCBUaGUgYGRpc3BhdGNoYCBmdW5jdGlvbiBhdmFpbGFibGUgb24geW91ciBSZWR1eFxuICogc3RvcmUuXG4gKlxuICogQHJldHVybnMge0Z1bmN0aW9ufE9iamVjdH0gVGhlIG9iamVjdCBtaW1pY2tpbmcgdGhlIG9yaWdpbmFsIG9iamVjdCwgYnV0IHdpdGhcbiAqIGV2ZXJ5IGFjdGlvbiBjcmVhdG9yIHdyYXBwZWQgaW50byB0aGUgYGRpc3BhdGNoYCBjYWxsLiBJZiB5b3UgcGFzc2VkIGFcbiAqIGZ1bmN0aW9uIGFzIGBhY3Rpb25DcmVhdG9yc2AsIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBhbHNvIGJlIGEgc2luZ2xlXG4gKiBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3JzKGFjdGlvbkNyZWF0b3JzLCBkaXNwYXRjaCkge1xuICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3JzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3JzLCBkaXNwYXRjaCk7XG4gIH1cblxuICBpZiAoKHR5cGVvZiBhY3Rpb25DcmVhdG9ycyA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YoYWN0aW9uQ3JlYXRvcnMpKSAhPT0gJ29iamVjdCcgfHwgYWN0aW9uQ3JlYXRvcnMgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2JpbmRBY3Rpb25DcmVhdG9ycyBleHBlY3RlZCBhbiBvYmplY3Qgb3IgYSBmdW5jdGlvbiwgaW5zdGVhZCByZWNlaXZlZCAnICsgKGFjdGlvbkNyZWF0b3JzID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIGFjdGlvbkNyZWF0b3JzID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihhY3Rpb25DcmVhdG9ycykpICsgJy4gJyArICdEaWQgeW91IHdyaXRlIFwiaW1wb3J0IEFjdGlvbkNyZWF0b3JzIGZyb21cIiBpbnN0ZWFkIG9mIFwiaW1wb3J0ICogYXMgQWN0aW9uQ3JlYXRvcnMgZnJvbVwiPycpO1xuICB9XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhY3Rpb25DcmVhdG9ycyk7XG4gIHZhciBib3VuZEFjdGlvbkNyZWF0b3JzID0ge307XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIHZhciBhY3Rpb25DcmVhdG9yID0gYWN0aW9uQ3JlYXRvcnNba2V5XTtcbiAgICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGJvdW5kQWN0aW9uQ3JlYXRvcnNba2V5XSA9IGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3IsIGRpc3BhdGNoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJvdW5kQWN0aW9uQ3JlYXRvcnM7XG59XG5cbi8qKlxuICogQ29tcG9zZXMgc2luZ2xlLWFyZ3VtZW50IGZ1bmN0aW9ucyBmcm9tIHJpZ2h0IHRvIGxlZnQuIFRoZSByaWdodG1vc3RcbiAqIGZ1bmN0aW9uIGNhbiB0YWtlIG11bHRpcGxlIGFyZ3VtZW50cyBhcyBpdCBwcm92aWRlcyB0aGUgc2lnbmF0dXJlIGZvclxuICogdGhlIHJlc3VsdGluZyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gZnVuY3MgVGhlIGZ1bmN0aW9ucyB0byBjb21wb3NlLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIG9idGFpbmVkIGJ5IGNvbXBvc2luZyB0aGUgYXJndW1lbnQgZnVuY3Rpb25zXG4gKiBmcm9tIHJpZ2h0IHRvIGxlZnQuIEZvciBleGFtcGxlLCBjb21wb3NlKGYsIGcsIGgpIGlzIGlkZW50aWNhbCB0byBkb2luZ1xuICogKC4uLmFyZ3MpID0+IGYoZyhoKC4uLmFyZ3MpKSkuXG4gKi9cblxuZnVuY3Rpb24gY29tcG9zZSgpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGZ1bmNzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgZnVuY3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBpZiAoZnVuY3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhcmcpIHtcbiAgICAgIHJldHVybiBhcmc7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChmdW5jcy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZnVuY3NbMF07XG4gIH1cblxuICByZXR1cm4gZnVuY3MucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBhKGIuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpKTtcbiAgICB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RvcmUgZW5oYW5jZXIgdGhhdCBhcHBsaWVzIG1pZGRsZXdhcmUgdG8gdGhlIGRpc3BhdGNoIG1ldGhvZFxuICogb2YgdGhlIFJlZHV4IHN0b3JlLiBUaGlzIGlzIGhhbmR5IGZvciBhIHZhcmlldHkgb2YgdGFza3MsIHN1Y2ggYXMgZXhwcmVzc2luZ1xuICogYXN5bmNocm9ub3VzIGFjdGlvbnMgaW4gYSBjb25jaXNlIG1hbm5lciwgb3IgbG9nZ2luZyBldmVyeSBhY3Rpb24gcGF5bG9hZC5cbiAqXG4gKiBTZWUgYHJlZHV4LXRodW5rYCBwYWNrYWdlIGFzIGFuIGV4YW1wbGUgb2YgdGhlIFJlZHV4IG1pZGRsZXdhcmUuXG4gKlxuICogQmVjYXVzZSBtaWRkbGV3YXJlIGlzIHBvdGVudGlhbGx5IGFzeW5jaHJvbm91cywgdGhpcyBzaG91bGQgYmUgdGhlIGZpcnN0XG4gKiBzdG9yZSBlbmhhbmNlciBpbiB0aGUgY29tcG9zaXRpb24gY2hhaW4uXG4gKlxuICogTm90ZSB0aGF0IGVhY2ggbWlkZGxld2FyZSB3aWxsIGJlIGdpdmVuIHRoZSBgZGlzcGF0Y2hgIGFuZCBgZ2V0U3RhdGVgIGZ1bmN0aW9uc1xuICogYXMgbmFtZWQgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSB7Li4uRnVuY3Rpb259IG1pZGRsZXdhcmVzIFRoZSBtaWRkbGV3YXJlIGNoYWluIHRvIGJlIGFwcGxpZWQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgc3RvcmUgZW5oYW5jZXIgYXBwbHlpbmcgdGhlIG1pZGRsZXdhcmUuXG4gKi9cbmZ1bmN0aW9uIGFwcGx5TWlkZGxld2FyZSgpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1pZGRsZXdhcmVzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgbWlkZGxld2FyZXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGNyZWF0ZVN0b3JlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgdmFyIHN0b3JlID0gY3JlYXRlU3RvcmUuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgIHZhciBfZGlzcGF0Y2ggPSBmdW5jdGlvbiBkaXNwYXRjaCgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEaXNwYXRjaGluZyB3aGlsZSBjb25zdHJ1Y3RpbmcgeW91ciBtaWRkbGV3YXJlIGlzIG5vdCBhbGxvd2VkLiAnICsgJ090aGVyIG1pZGRsZXdhcmUgd291bGQgbm90IGJlIGFwcGxpZWQgdG8gdGhpcyBkaXNwYXRjaC4nKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBtaWRkbGV3YXJlQVBJID0ge1xuICAgICAgICBnZXRTdGF0ZTogc3RvcmUuZ2V0U3RhdGUsXG4gICAgICAgIGRpc3BhdGNoOiBmdW5jdGlvbiBkaXNwYXRjaCgpIHtcbiAgICAgICAgICByZXR1cm4gX2Rpc3BhdGNoLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHZhciBjaGFpbiA9IG1pZGRsZXdhcmVzLm1hcChmdW5jdGlvbiAobWlkZGxld2FyZSkge1xuICAgICAgICByZXR1cm4gbWlkZGxld2FyZShtaWRkbGV3YXJlQVBJKTtcbiAgICAgIH0pO1xuICAgICAgX2Rpc3BhdGNoID0gY29tcG9zZS5hcHBseSh1bmRlZmluZWQsIGNoYWluKShzdG9yZS5kaXNwYXRjaCk7XG5cbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RvcmUsIHtcbiAgICAgICAgZGlzcGF0Y2g6IF9kaXNwYXRjaFxuICAgICAgfSk7XG4gICAgfTtcbiAgfTtcbn1cblxuLypcbiAqIFRoaXMgaXMgYSBkdW1teSBmdW5jdGlvbiB0byBjaGVjayBpZiB0aGUgZnVuY3Rpb24gbmFtZSBoYXMgYmVlbiBhbHRlcmVkIGJ5IG1pbmlmaWNhdGlvbi5cbiAqIElmIHRoZSBmdW5jdGlvbiBoYXMgYmVlbiBtaW5pZmllZCBhbmQgTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJywgd2FybiB0aGUgdXNlci5cbiAqL1xuZnVuY3Rpb24gaXNDcnVzaGVkKCkge31cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdHlwZW9mIGlzQ3J1c2hlZC5uYW1lID09PSAnc3RyaW5nJyAmJiBpc0NydXNoZWQubmFtZSAhPT0gJ2lzQ3J1c2hlZCcpIHtcbiAgd2FybmluZyhcIllvdSBhcmUgY3VycmVudGx5IHVzaW5nIG1pbmlmaWVkIGNvZGUgb3V0c2lkZSBvZiBOT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nLiBcIiArICdUaGlzIG1lYW5zIHRoYXQgeW91IGFyZSBydW5uaW5nIGEgc2xvd2VyIGRldmVsb3BtZW50IGJ1aWxkIG9mIFJlZHV4LiAnICsgJ1lvdSBjYW4gdXNlIGxvb3NlLWVudmlmeSAoaHR0cHM6Ly9naXRodWIuY29tL3plcnRvc2gvbG9vc2UtZW52aWZ5KSBmb3IgYnJvd3NlcmlmeSAnICsgJ29yIERlZmluZVBsdWdpbiBmb3Igd2VicGFjayAoaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zMDAzMDAzMSkgJyArICd0byBlbnN1cmUgeW91IGhhdmUgdGhlIGNvcnJlY3QgY29kZSBmb3IgeW91ciBwcm9kdWN0aW9uIGJ1aWxkLicpO1xufVxuXG5leHBvcnQgeyBjcmVhdGVTdG9yZSwgY29tYmluZVJlZHVjZXJzLCBiaW5kQWN0aW9uQ3JlYXRvcnMsIGFwcGx5TWlkZGxld2FyZSwgY29tcG9zZSwgQWN0aW9uVHlwZXMgYXMgX19ET19OT1RfVVNFX19BY3Rpb25UeXBlcyB9O1xuIiwiaW1wb3J0IHtjcmVhdGVTdG9yZX0gZnJvbSAncmVkdXgnO1xuaW1wb3J0IHtEZXBlbmRlbmN5RXJyb3J9IGZyb20gJy4vZXJyb3JzJztcblxuLyoqXG4gKiBAY2xhc3MgTW9kdWxlTWFuYWdlclxuICogQGNhdGVnb3J5IGNvcmVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgaGFuZGxlclxuICogQGRlc2NyaXB0aW9uICBTb2x2ZXMgbW9kdWxlcyBkZXBlbmRlbmNpZXNcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgY2xhc3MgTW9kdWxlTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKG9iamVjdCkge1xuICAgIHRoaXMuaGFuZGxlciA9IG9iamVjdDtcbiAgICB0aGlzLmN1cnJlbnRNb2R1bGUgPSBudWxsO1xuXG4gICAgdGhpcy5zdG9yZSA9IGNyZWF0ZVN0b3JlKChzdGF0ZSA9IFt7fSwgJyddLCBhY3Rpb24pID0+IHtcbiAgICAgIHN0YXRlWzBdW2FjdGlvbi5rZXldID0gYWN0aW9uLmRhdGE7XG4gICAgICBzdGF0ZVsxXSA9IGFjdGlvbi5rZXk7XG5cbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9KTtcblxuICAgIHRoaXMubW9kdWxlcyA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYWN0aXZlXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyAuY3VycmVudE1vZHVsZSB0byBwcm92aWRlZCBtb2R1bGUuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBtb2R1bGUgdGhlIG1vZHVsZSB0byBtYWtlIGN1cnJlbnRcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZU1hbmFnZXJcbiAgICovXG4gIGFjdGl2ZShtb2R1bGUpIHtcbiAgICB0aGlzLmN1cnJlbnRNb2R1bGUgPSBtb2R1bGU7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCByZXNldFxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIFNldCdzIC5jdXJyZW50TW9kdWxlIHRvIG51bGwuXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVNYW5hZ2VyXG4gICAqL1xuICByZXNldCgpIHtcbiAgICB0aGlzLmN1cnJlbnRNb2R1bGUgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgZGVmaW5lXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gRGVmaW5lIHRoZSBtb2R1bGUgaW4gbWFuYWdlclxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbW9kdWxlIG5hbWVcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZU1hbmFnZXJcbiAgICovXG4gIGRlZmluZShuYW1lKSB7XG4gICAgdGhpcy5tb2R1bGVzW25hbWVdID0gdGhpcy5jdXJyZW50TW9kdWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgdXNlXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gR2V0IHRoZSBkZWZpbmVkIG1vZHVsZSBmcm9tIG1hbmFnZXJcbiAgICogQHBhcmFtIG5hbWUgVGhlIG1vZHVsZSBuYW1lXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVNYW5hZ2VyXG4gICAqL1xuICB1c2UobmFtZSkge1xuICAgIHJldHVybiB0aGlzLm1vZHVsZXNbbmFtZV07XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBzZXRcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBBbiBhbGlhcyBmb3IgLmFkZCgpIDxici8+PGJyLz5cbiAgICogVXNlIHRoaXMgbWV0aG9kIGlmIHlvdSBrbm93IHRoYXQgeW91IHdpbGwgb3ZlcndyaXRlIGV4aXN0aW5nIGRlcGVuZGVuY3kuPGJyLz5cbiAgICogVXNlIGl0IGluIHlvdXIgYXBwLCBidXQgbm90IGluIG1vZHVsZSB0aGF0IHlvdSBwcm92aWRlIHRvIG90aGVyIHBlb3BsZS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGtleSB0aGUga2V5IG9mIHRoZSBkZXBlbmRlbmN5XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIHRoZSB2YWx1ZSBvZiB0aGUgZGVwZW5kZW5jeVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTW9kdWxlTWFuYWdlclxuICAgKi9cbiAgc2V0KGtleSwgZGF0YSkge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goe1xuICAgICAgdHlwZTogJ0FERCcsXG4gICAgICBrZXksXG4gICAgICBkYXRhXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBnZXRcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGRlcGVuZGVuY3kgaW4gc3RvcmUgb2JqZWN0LCBieSBrZXkuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgdGhlIGtleSBvZiB0aGUgZGVwZW5kZW5jeVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTW9kdWxlTWFuYWdlclxuICAgKiBAcmV0dXJuIHtPYmplY3R8TW9kdWxlfVxuICAgKiBAdGhyb3dzIHtEZXBlbmRlbmN5RXJyb3J9IGlmIGRlcGVuZGVuY3kgaXMgbm90IGluIHRoZSBzdG9yZVxuICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5HZXQgdGhlICdoZWxsbycgZGVwZW5kZW5jeTwvY2FwdGlvbj5cbiAgICogbWFuYWdlci5nZXQoJ2hlbGxvJyk7IC8vIC0+IHt3b3JsZDogdHJ1ZX1cbiAgICovXG4gIGdldChrZXkpIHtcbiAgICBpZiAoIXRoaXMuc3RvcmUuZ2V0U3RhdGUoKVswXVtrZXldKSB7XG4gICAgICB0aHJvdyBuZXcgRGVwZW5kZW5jeUVycm9yKFxuICAgICAgICAnTW9kdWxlTWFuYWdlcicsXG4gICAgICAgIGBNb2R1bGUgcmVxdWlyZXMgJyR7a2V5fScgZGVwZW5kZW5jeWAsXG4gICAgICAgIHRoaXMuY3VycmVudE1vZHVsZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRTdGF0ZSgpWzBdW2tleV07XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBoYXNcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHdoZXRoZXIgbWFuYWdlciBoYXMgYSBkZXBlbmRlbmN5IHdpdGggdGhlIGdpdmVuIGtleVxuICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBrZXkgb2YgdGhlIGRlcGVuZGVuY3lcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZU1hbmFnZXJcbiAgICogQHJldHVybiB7Qm9vbGVhbn0gUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gYWxsIHByb21pc2VzIGNvbXBsZXRlZC5cbiAgICogQGV4YW1wbGUgPGNhcHRpb24+Q2hlY2sgd2hldGhlciB0aGUgc3RvcmUgaGFzIHRoZSAnaGVsbG8nIGRlcGVuZGVuY3k8L2NhcHRpb24+XG4gICAqIG1hbmFnZXIuaGFzKCdoZWxsbycpOyAvLyAtPiB0cnVlXG4gICAqL1xuICBoYXMoa2V5KSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5zdG9yZS5nZXRTdGF0ZSgpWzBdW2tleV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgdXBkYXRlXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBkZXBzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbZGVwc01hcD17fV1cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZU1hbmFnZXJcbiAgICovXG4gIHVwZGF0ZShkZXBzTWFwID0ge30pIHtcbiAgICB0aGlzLnN0b3JlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBjb25zdCBbZGF0YSwgY2hhbmdlZEtleV0gPSB0aGlzLnN0b3JlLmdldFN0YXRlKCk7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IGRlcHNNYXBbY2hhbmdlZEtleV07XG5cbiAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soZGF0YVtjaGFuZ2VkS2V5XSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBhZGRcbiAgICogQGFsaWFzIG1vZHVsZTpjb3JlLk1vZHVsZU1hbmFnZXIjc2V0XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVNYW5hZ2VyXG4gICAqL1xuICBhZGQoLi4uZGF0YSkge1xuICAgIGNvbnNvbGUud2FybignLmFkZCgpIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBVc2UgLnNldCgpIGluc3RlYWQnKTtcbiAgICByZXR1cm4gdGhpcy5zZXQoLi4uZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCByZXF1aXJlXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gUmVxdWlyZSBtb2R1bGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgRGVmaW5lZCBuYW1lXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZHVsZUV4ZWN1dG9yIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhcHBsaWVkIG1vZHVsZVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTW9kdWxlTWFuYWdlclxuICAgKi9cbiAgcmVxdWlyZShuYW1lLCBtb2R1bGVFeGVjdXRvcikge1xuICAgIGlmICh0aGlzLnVzZShuYW1lKSA9PT0gdW5kZWZpbmVkKSB0aGlzLmhhbmRsZXIuYXBwbHlNb2R1bGUobW9kdWxlRXhlY3V0b3IoKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7ZXh0ZW5kLCB0cmFuc2Zvcm1EYXRhfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQge01vZHVsZVN5c3RlbX0gZnJvbSAnLi9Nb2R1bGVTeXN0ZW0nO1xuaW1wb3J0IHtNb2R1bGVNYW5hZ2VyfSBmcm9tICcuL01vZHVsZU1hbmFnZXInO1xuaW1wb3J0IHtNYW5hZ2VyRXJyb3IsIENvbXBvc2l0aW9uRXJyb3J9IGZyb20gJy4vZXJyb3JzJztcblxuLyoqXG4gKiBAY2xhc3MgQ29tcG9uZW50XG4gKiBAY2F0ZWdvcnkgY29yZVxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtZXRlcnMgb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtpbnN0cnVjdGlvbnNdIC0gVGhlIGluc3RydWN0aW9ucyBvYmplY3QuXG4gKiBAZXh0ZW5kcyBNb2R1bGVTeXN0ZW1cbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZVxuICovXG5jbGFzcyBDb21wb25lbnQgZXh0ZW5kcyBNb2R1bGVTeXN0ZW0ge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29yZS5Db21wb25lbnQjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCB7XG4gICAqICAgbW9kdWxlczogW10sXG4gICAqICAgbWFuYWdlcjogdHJ1ZVxuICAgKiB9XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgbW9kdWxlczogbnVsbCxcbiAgICBtYW5hZ2VyOiB0cnVlXG4gIH07XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBpbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29yZS5Db21wb25lbnQjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQge31cbiAgICovXG4gIHN0YXRpYyBpbnN0cnVjdGlvbnMgPSB7fTtcblxuICAvKipcbiAgICogQXJyYXkgb2YgcHJvbWlzZXMgdGhhdCBzaG91bGQgYmUgcmVzb2x2ZWQgYmVmb3JlIENvbXBvbmVudCBpcyByZWFkeS5cbiAgICogQG1lbWJlciB7QXJyYXl9IG1vZHVsZTpjb3JlLkNvbXBvbmVudCNfd2FpdFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3dhaXQgPSBbXTsgLy8gQ29sbGVjdGlvbiBvZiBwcm9taXNlcztcblxuICAvKipcbiAgICogQ29sbGVjdGlvbiBvZiBgbW9kdWxlc2AuXG4gICAqIEBtZW1iZXIge0FycmF5fSBtb2R1bGU6Y29yZS5Db21wb25lbnQjbW9kdWxlc1xuICAgKiBAcHVibGljXG4gICAqL1xuICBtb2R1bGVzID0gW107IC8vIENvbGxlY3Rpb24gb2YgbW9kdWxlcztcblxuICAvKipcbiAgICogQ29sbGVjdGlvbiBvZiBgY2hpbGRgIENvbXBvbmVudHMuXG4gICAqIEBtZW1iZXIge0FycmF5fSBtb2R1bGU6Y29yZS5Db21wb25lbnQjY2hpbGRyZW5cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgY2hpbGRyZW4gPSBbXTsgLy8gRm9yIGtlZXBpbmcgY2hpbGRyZW4gY29tcG9uZW50cztcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSwgZGVmYXVsdHMgPSBDb21wb25lbnQuZGVmYXVsdHMsIGluc3RydWN0aW9ucyA9IENvbXBvbmVudC5pbnN0cnVjdGlvbnMpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gQXBwbHkgcG9seWZpbGxlZCBwYXJhbWV0ZXJzIHRvIC5wYXJhbXM7XG4gICAgdGhpcy5wYXJhbXMgPSBleHRlbmQodHJhbnNmb3JtRGF0YShwYXJhbXMsIGluc3RydWN0aW9ucyksIGRlZmF1bHRzKTtcbiAgICBpZiAodGhpcy5wYXJhbXMubWFuYWdlcikgdGhpcy5tYW5hZ2VyID0gbmV3IE1vZHVsZU1hbmFnZXIodGhpcyk7XG5cbiAgICB0aGlzLm1vZHVsZXMgPSB0aGlzLnBhcmFtcy5tb2R1bGVzO1xuXG4gICAgdGhpcy5pbnRlZ3JhdGVNb2R1bGVzKCk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCB3YWl0XG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gV2FpdCBmb3IgYSBwcm9taXNlLlxuICAgKiBAcGFyYW0ge1Byb21pc2V9IFtwcm9taXNlXSAtIFRoZSBwcm9taXNlIHRoYXQgc2hvdWxkIGJlIGFkZGVkIHRvIGEgcXVldWUuXG4gICAqIEByZXR1cm4ge1Byb21pc2V9IFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIGFsbCBwcm9taXNlcyBjb21wbGV0ZWQuXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Db21wb25lbnRcbiAgICovXG4gIHdhaXQocHJvbWlzZSkge1xuICAgIGlmIChwcm9taXNlKSB0aGlzLl93YWl0LnB1c2gocHJvbWlzZSk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHRoaXMuX3dhaXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgZGVmZXJcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlIGBmdW5jYCAoQ2FsbGJhY2spIHdoZW4gQ29tcG9uZW50IGlzIHJlYWR5LlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIC0gQ2FsbGJhY2suXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Db21wb25lbnRcbiAgICovXG4gIGRlZmVyKGZ1bmMpIHtcbiAgICBpZiAodGhpcy5pc0RlZmZlcmVkKSB0aGlzLndhaXQoKS50aGVuKCgpID0+IGZ1bmModGhpcykpO1xuICAgIGVsc2UgZnVuYyh0aGlzKTtcbiAgfVxuXG4gIC8vIFBBUkFNRVRFUlNcblxuICAvKipcbiAgICogQG1ldGhvZCB1cGRhdGVQYXJhbXNcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIHBhcmFtZXRlcnMgb2YgdGhlIENvbXBvbmVudC5cbiAgICogQHJldHVybiB7T2JqZWN0fSBQYXJhbXMgb2YgdGhpcyBDb21wb25lbnRcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkNvbXBvbmVudFxuICAgKi9cbiAgdXBkYXRlUGFyYW1zKHBhcmFtcyA9IHt9KSB7XG4gICAgdGhpcy5wYXJhbXMgPSBleHRlbmQocGFyYW1zLCB0aGlzLnBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1zO1xuICB9XG5cbiAgLy8gQ09QWUlORyAmIENMT05JTkdcblxuICAvKipcbiAgICogQG1ldGhvZCBjbG9uZVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIENsb25lIHRoaXMgY29tcG9uZW50XG4gICAqIEByZXR1cm4ge29iamVjdH0gYSBjbG9uZWQgY29tcG9uZW50IHdpdGggYWxsIGl0cyBzb3VyY2UgY29tcG9uZW50JyBwYXJhbXMgY29waWVkLlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQ29tcG9uZW50XG4gICAqL1xuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5wYXJhbXMpLmNvcHkodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBjb3B5XG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gQ29weSBzb3VyY2UgbmF0aXZlIGFuZCBpbnRlZ3JhdGUgYG1vZHVsZXNgIHRvIGl0LlxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gc291cmNlIC0gU291cmNlIGNvbXBvbmVudCB0aGF0IGlzIHVzZWQgZm9yIGBjb3B5KClgIGFjdGlvbi5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZV0gLSBDYWxsYmFjayBleGVjdXRlZCBiZWZvcmUgbW9kdWxlcyBpbnRlZ3JhdGlvbiBwcm9jZXNzLlxuICAgKiBAcmV0dXJuIHt0aGlzfSBDb21wb25lbnRcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkNvbXBvbmVudFxuICAgKi9cbiAgY29weShzb3VyY2UsIGN1c3RvbWl6ZSkge1xuICAgIHRoaXMucGFyYW1zID0gey4uLnNvdXJjZS5wYXJhbXN9O1xuXG4gICAgaWYgKHNvdXJjZS5uYXRpdmUpIHRoaXMubmF0aXZlID0gc291cmNlLm5hdGl2ZS5jbG9uZShzb3VyY2UucGFyYW1zKTtcbiAgICBpZiAoY3VzdG9taXplKSBjdXN0b21pemUoKTtcbiAgICB0aGlzLmludGVncmF0ZU1vZHVsZXMoc291cmNlKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYWRkXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gQWRkIGEgY2hpbGQgYENvbXBvbmVudGAuXG4gICAqIEBwYXJhbSB7Q29tcG9uZW50fSBvYmplY3QgLSBDb21wb25lbnQgdGhhdCBzaG91bGQgYmUgYWRkZWQgYXMgYSBgY2hpbGRgLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlZCB3aGVuIGFjdGlvbiBpcyBkb25lLlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQ29tcG9uZW50XG4gICAqL1xuICBhc3luYyBhZGQob2JqZWN0KSB7XG4gICAgaWYgKG9iamVjdC5wYXJlbnQpIGF3YWl0IG9iamVjdC5wYXJlbnQucmVtb3ZlKG9iamVjdCk7XG5cbiAgICBhd2FpdCB0aGlzLndhaXQoKTtcbiAgICBhd2FpdCBvYmplY3Qud2FpdCgpO1xuXG4gICAgaWYgKCFvYmplY3QubmF0aXZlKSB7XG4gICAgICB0aHJvdyBuZXcgQ29tcG9zaXRpb25FcnJvcihcbiAgICAgICAgJ0NvbXBvbmVudCcsXG4gICAgICAgICd0aGVyZSBpcyBubyBvYmplY3QubmF0aXZlJyxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBvYmplY3QucGFyZW50ID0gdGhpcztcbiAgICBhd2FpdCB0aGlzLmFwcGx5QnJpZGdlKHtvbkFkZDogb2JqZWN0fSkub25BZGQ7XG4gICAgdGhpcy5uYXRpdmUuYWRkKG9iamVjdC5uYXRpdmUpO1xuICAgIHRoaXMuY2hpbGRyZW4ucHVzaChvYmplY3QpO1xuXG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHJlbW92ZVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIFJlbW92ZSBhIGNoaWxkIGBDb21wb25lbnRgLlxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gb2JqZWN0IC0gQ29tcG9uZW50IHRoYXQgc2hvdWxkIGJlIGEgKipjaGlsZCoqIG9mIHRoaXMgQ29tcG9uZW50LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlZCB3aGVuIGFjdGlvbiBpcyBkb25lLlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQ29tcG9uZW50XG4gICAqL1xuICBhc3luYyByZW1vdmUob2JqZWN0KSB7XG4gICAgaWYgKG9iamVjdC5wYXJlbnQgIT09IHRoaXMpIHJldHVybjtcblxuICAgIGF3YWl0IHRoaXMud2FpdCgpO1xuICAgIGF3YWl0IG9iamVjdC53YWl0KCk7XG5cbiAgICBvYmplY3QucGFyZW50ID0gbnVsbDtcbiAgICB0aGlzLm5hdGl2ZS5yZW1vdmUob2JqZWN0Lm5hdGl2ZSk7XG4gICAgdGhpcy5jaGlsZHJlbi5zcGxpY2UodGhpcy5jaGlsZHJlbi5pbmRleE9mKG9iamVjdCksIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYWRkVG9cbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBBZGRzIGB0aGlzYCBDb21wb25lbnQgdG8gc3BlY2lmaWVkIGBBcHBgL2BDb21wb25lbnRgLlxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gb2JqZWN0IC0gQ29tcG9uZW50IHRoYXQgd2lsbCBiZSBhIHBhcmVudCBvZiBgdGhpc2AuXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Db21wb25lbnRcbiAgICovXG4gIGFkZFRvKG9iamVjdCkge1xuICAgIHJldHVybiBvYmplY3QuYWRkKHRoaXMpO1xuICB9XG5cbiAgZ2V0KGtleSkge1xuICAgIHJldHVybiB0aGlzLm1hbmFnZXIuZ2V0KGtleSk7XG4gIH1cblxuICB1c2Uoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMubWFuYWdlci51c2Uoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG9iamVjdCBpcyBgYXN5bmNgIChgd2FpdGAgcHJvbWlzZXMgYXJlIG1vcmUgdGhhbiBgMGApLlxuICAgKiBAbWVtYmVyIHtCb29sZWFufSBtb2R1bGU6Y29yZS5Db21wb25lbnQjaXNEZWZmZXJlZFxuICAgKi9cbiAgZ2V0IGlzRGVmZmVyZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dhaXQubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBgTW9kdWxlTWFuYWdlcmAgdXNlZCBmb3IgdGhpcyBjb21wb25lbnQuXG4gICAqIEBtZW1iZXIge01vZHVsZU1hbmFnZXJ9IG1vZHVsZTpjb3JlLkNvbXBvbmVudCNtYW5hZ2VyXG4gICAqIEB0aHJvd3Mge01hbmFnZXJFcnJvcn1cbiAgICovXG4gIGdldCBtYW5hZ2VyKCkge1xuICAgIGlmICh0aGlzLl9tYW5hZ2VyKSByZXR1cm4gdGhpcy5fbWFuYWdlcjtcblxuICAgIHRocm93IG5ldyBNYW5hZ2VyRXJyb3IoXG4gICAgICAnQ29tcG9uZW50JyxcbiAgICAgIGBNb2R1bGVNYW5hZ2VyIGlzIG5vdCB1c2VkIGluIHRoaXMgY29tcG9uZW50LiAnbWFuYWdlcicgcGFyYW1ldGVyIHNob3VsZCBiZSBzZXQgYXMgJ3RydWUnYCxcbiAgICAgIHRoaXNcbiAgICApO1xuICB9XG5cbiAgc2V0IG1hbmFnZXIobWFuYWdlcikge1xuICAgIHRoaXMuX21hbmFnZXIgPSBtYW5hZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGBuYXRpdmVgIG9iamVjdCB1c2VkIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29yZS5Db21wb25lbnQjbmF0aXZlXG4gICAqL1xuICBnZXQgbmF0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLl9uYXRpdmU7XG4gIH1cblxuICBzZXQgbmF0aXZlKG1lc2gpIHtcbiAgICB0aGlzLl9uYXRpdmUgPSBtZXNoO1xuICAgIHRoaXMuX25hdGl2ZS5jb21wb25lbnQgPSB0aGlzO1xuICAgIHJldHVybiB0aGlzLl9uYXRpdmU7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgQ29tcG9uZW50XG59O1xuIiwiLy8gMjYuMS42IFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcGVydHlLZXkgWywgcmVjZWl2ZXJdKVxudmFyIGdPUEQgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5cbmZ1bmN0aW9uIGdldCh0YXJnZXQsIHByb3BlcnR5S2V5IC8qICwgcmVjZWl2ZXIgKi8pIHtcbiAgdmFyIHJlY2VpdmVyID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB0YXJnZXQgOiBhcmd1bWVudHNbMl07XG4gIHZhciBkZXNjLCBwcm90bztcbiAgaWYgKGFuT2JqZWN0KHRhcmdldCkgPT09IHJlY2VpdmVyKSByZXR1cm4gdGFyZ2V0W3Byb3BlcnR5S2V5XTtcbiAgaWYgKGRlc2MgPSBnT1BELmYodGFyZ2V0LCBwcm9wZXJ0eUtleSkpIHJldHVybiBoYXMoZGVzYywgJ3ZhbHVlJylcbiAgICA/IGRlc2MudmFsdWVcbiAgICA6IGRlc2MuZ2V0ICE9PSB1bmRlZmluZWRcbiAgICAgID8gZGVzYy5nZXQuY2FsbChyZWNlaXZlcilcbiAgICAgIDogdW5kZWZpbmVkO1xuICBpZiAoaXNPYmplY3QocHJvdG8gPSBnZXRQcm90b3R5cGVPZih0YXJnZXQpKSkgcmV0dXJuIGdldChwcm90bywgcHJvcGVydHlLZXksIHJlY2VpdmVyKTtcbn1cblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0JywgeyBnZXQ6IGdldCB9KTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5SZWZsZWN0LmdldDtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9yZWZsZWN0L2dldFwiKTsiLCJ2YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiLi9nZXRQcm90b3R5cGVPZlwiKTtcblxuZnVuY3Rpb24gX3N1cGVyUHJvcEJhc2Uob2JqZWN0LCBwcm9wZXJ0eSkge1xuICB3aGlsZSAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KSkge1xuICAgIG9iamVjdCA9IGdldFByb3RvdHlwZU9mKG9iamVjdCk7XG4gICAgaWYgKG9iamVjdCA9PT0gbnVsbCkgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gb2JqZWN0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9zdXBlclByb3BCYXNlOyIsInZhciBfT2JqZWN0JGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3JcIik7XG5cbnZhciBfUmVmbGVjdCRnZXQgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9yZWZsZWN0L2dldFwiKTtcblxudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZShcIi4vZ2V0UHJvdG90eXBlT2ZcIik7XG5cbnZhciBzdXBlclByb3BCYXNlID0gcmVxdWlyZShcIi4vc3VwZXJQcm9wQmFzZVwiKTtcblxuZnVuY3Rpb24gX2dldCh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlcikge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgIT09IFwidW5kZWZpbmVkXCIgJiYgX1JlZmxlY3QkZ2V0KSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfZ2V0ID0gX1JlZmxlY3QkZ2V0O1xuICB9IGVsc2Uge1xuICAgIG1vZHVsZS5leHBvcnRzID0gX2dldCA9IGZ1bmN0aW9uIF9nZXQodGFyZ2V0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpIHtcbiAgICAgIHZhciBiYXNlID0gc3VwZXJQcm9wQmFzZSh0YXJnZXQsIHByb3BlcnR5KTtcbiAgICAgIGlmICghYmFzZSkgcmV0dXJuO1xuXG4gICAgICB2YXIgZGVzYyA9IF9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGJhc2UsIHByb3BlcnR5KTtcblxuICAgICAgaWYgKGRlc2MuZ2V0KSB7XG4gICAgICAgIHJldHVybiBkZXNjLmdldC5jYWxsKHJlY2VpdmVyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlc2MudmFsdWU7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyIHx8IHRhcmdldCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2dldDsiLCJleHBvcnQgZnVuY3Rpb24gYXR0cmlidXRlcyguLi5tYXBwZXJzKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXBwZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBtYXBwZXIgPSBtYXBwZXJzW2ldO1xuXG4gICAgICBmb3IgKGxldCBrID0gMDsgayA8IG1hcHBlci5tYXAubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlID0gbWFwcGVyLm1hcFtrXTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LnByb3RvdHlwZSwgYXR0cmlidXRlLCB7XG4gICAgICAgICAgZ2V0OiBtYXBwZXIuZ2V0dGVyKGF0dHJpYnV0ZSksXG4gICAgICAgICAgc2V0OiBtYXBwZXIuc2V0dGVyKGF0dHJpYnV0ZSksXG4gICAgICAgICAgY29uZmlndXJhYmxlOiBtYXBwZXIuY29uZmlndXJhYmxlLFxuICAgICAgICAgIGVudW1lcmFibGU6IG1hcHBlci5lbnVtZXJhYmxlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHkoLi4ubWFwKSB7XG4gIHJldHVybiB7XG4gICAgbWFwLFxuICAgIGdldHRlcihuYW1lKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVbbmFtZV07XG4gICAgICB9O1xuICAgIH0sXG4gICAgc2V0dGVyKG5hbWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5uYXRpdmVbbmFtZV0uY29weSh2YWx1ZSk7XG4gICAgICB9O1xuICAgIH0sXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWVcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pcnJvciguLi5tYXApIHtcbiAgcmV0dXJuIHtcbiAgICBtYXAsXG4gICAgZ2V0dGVyKG5hbWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdGl2ZVtuYW1lXTtcbiAgICAgIH07XG4gICAgfSxcbiAgICBzZXR0ZXIobmFtZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLm5hdGl2ZVtuYW1lXSA9IHZhbHVlO1xuICAgICAgfTtcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlXG4gIH07XG59XG4iLCJpbXBvcnQge01lc2h9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7Q29tcG9uZW50fSBmcm9tICcuL0NvbXBvbmVudCc7XG5cbmltcG9ydCB7YXR0cmlidXRlcywgY29weSwgbWlycm9yfSBmcm9tICcuL3Byb3RvdHlwZS9hdHRyaWJ1dGVzJztcbmltcG9ydCB7Q29tcG9zaXRpb25FcnJvcn0gZnJvbSAnLi9lcnJvcnMnO1xuXG5AYXR0cmlidXRlcyhcbiAgY29weSgncG9zaXRpb24nLCAncm90YXRpb24nLCAncXVhdGVybmlvbicsICdzY2FsZScpLFxuICBtaXJyb3IoJ21hdGVyaWFsJywgJ2dlb21ldHJ5Jylcbilcbi8qKlxuICogQGNsYXNzIE1lc2hDb21wb25lbnRcbiAqIEBjYXRlZ29yeSBjb3JlXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1ldGVycyBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW2luc3RydWN0aW9uc10gLSBUaGUgaW5zdHJ1Y3Rpb25zIG9iamVjdC5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLkNvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlXG4gKi9cbmNsYXNzIE1lc2hDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnQge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50I2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHRcbiAgICoge1xuICAgKiAgIGJ1aWxkOiB0cnVlLFxuICAgKiAgIGdlb21ldHJ5OiB7fSxcbiAgICogICBtYXRlcmlhbDogZmFsc2UsXG4gICAqXG4gICAqICAgc2hhZG93OiB7XG4gICAqICAgICBjYXN0OiB0cnVlLFxuICAgKiAgICAgcmVjZWl2ZTogdHJ1ZVxuICAgKiAgIH0sXG4gICAqXG4gICAqICAgcG9zaXRpb246IHt4OiAwLCB5OiAwLCB6OiAwfSxcbiAgICogICByb3RhdGlvbjoge3g6IDAsIHk6IDAsIHo6IDB9LFxuICAgKiAgIHNjYWxlOiB7eDogMSwgeTogMSwgejogMX1cbiAgICogfVxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIC4uLkNvbXBvbmVudC5kZWZhdWx0cyxcblxuICAgIGJ1aWxkOiB0cnVlLFxuICAgIGdlb21ldHJ5OiB7fSxcbiAgICBtYXRlcmlhbDogZmFsc2UsXG5cbiAgICBzaGFkb3c6IHtcbiAgICAgIGNhc3Q6IHRydWUsXG4gICAgICByZWNlaXZlOiB0cnVlXG4gICAgfSxcblxuICAgIHBvc2l0aW9uOiB7eDogMCwgeTogMCwgejogMH0sXG4gICAgcm90YXRpb246IHt4OiAwLCB5OiAwLCB6OiAwfSxcbiAgICBzY2FsZToge3g6IDEsIHk6IDEsIHo6IDF9XG4gIH07XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBpbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50I2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0XG4gICAqIHtcbiAgICogICBwb3NpdGlvbjogWyd4JywgJ3knLCAneiddLFxuICAgKiAgIHJvdGF0aW9uOiBbJ3gnLCAneScsICd6J10sXG4gICAqICAgc2NhbGU6IFsneCcsICd5JywgJ3onXVxuICAgKiB9XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIHBvc2l0aW9uOiBbJ3gnLCAneScsICd6J10sXG4gICAgcm90YXRpb246IFsneCcsICd5JywgJ3onXSxcbiAgICBzY2FsZTogWyd4JywgJ3knLCAneiddXG4gIH07XG5cbiAgLy8gQ1VTVE9NIEdFT01FVFJZIEhBTkRMSU5HXG5cbiAgc3RhdGljIGN1c3RvbShnZW9tLCBjb25zdHJ1Y3RvciA9IE1lc2gpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBNZXNoQ29tcG9uZW50IHtcbiAgICAgIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IHtnZW9tZXRyeSwgbWF0ZXJpYWx9ID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgICAgZ2VvbWV0cnk6IGdlb20sXG4gICAgICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7bWVzaDogbmV3IGNvbnN0cnVjdG9yKGdlb21ldHJ5LCBtYXRlcmlhbCl9KS5tZXNoO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlKGdlb20sIHBhcmFtcywgY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gbmV3IChNZXNoQ29tcG9uZW50LmN1c3RvbShnZW9tLCBjb25zdHJ1Y3RvcikpKHBhcmFtcyk7XG4gIH1cblxuICBzdGF0aWMgZnJvbShtZXNoLCBwYXJhbXMgPSB7fSkge1xuICAgIHBhcmFtcy5idWlsZCA9IGZhbHNlO1xuXG4gICAgY29uc3QgY29tcG9uZW50ID0gbmV3IE1lc2hDb21wb25lbnQocGFyYW1zKTtcblxuICAgIGNvbXBvbmVudC5uYXRpdmUgPSBtZXNoO1xuICAgIGNvbXBvbmVudC53cmFwKCk7XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9XG5cbiAgY29uc3RydWN0b3IocGFyYW1zLCBkZWZhdWx0cyA9IE1lc2hDb21wb25lbnQuZGVmYXVsdHMsIGluc3RydWN0aW9ucyA9IE1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zKSB7XG4gICAgc3VwZXIocGFyYW1zLCBkZWZhdWx0cywgaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmICh0aGlzLnBhcmFtcy5idWlsZCkge1xuICAgICAgY29uc3QgYnVpbGQgPSB0aGlzLmJ1aWxkKHRoaXMucGFyYW1zKTtcblxuICAgICAgaWYgKCFidWlsZCkge1xuICAgICAgICB0aHJvdyBuZXcgQ29tcG9zaXRpb25FcnJvcihcbiAgICAgICAgICAnTWVzaENvbXBvbmVudCcsXG4gICAgICAgICAgJy5idWlsZCgpIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgVEhSRUUuT2JqZWN0M0Qgb3IgYSBQcm9taXNlIHJlc29sdmVkIHdpdGggVEhSRUUuT2JqZWN0M0QuJyxcbiAgICAgICAgICB0aGlzXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChidWlsZCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgdGhpcy53YWl0KGJ1aWxkKTtcblxuICAgICAgICB0aGlzLndhaXQobmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgYnVpbGQudGhlbihuYXRpdmUgPT4ge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmUgPSBuYXRpdmU7XG4gICAgICAgICAgICB0aGlzLndyYXAoKS50aGVuKHJlc29sdmUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm5hdGl2ZSA9IGJ1aWxkO1xuICAgICAgICB0aGlzLndhaXQodGhpcy53cmFwKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuYXBwbHlDb21tYW5kKCdwb3N0SW50ZWdyYXRlJyk7XG4gIH1cblxuICAvLyBCVUlMRElORyAmIFdSQVBQSU5HXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpdmVjeWNsZSBzaG91bGQgcmV0dXJuIGEgbmF0aXZlIG9iamVjdC5cbiAgICogQHRocm93cyB7Q29tcG9zaXRpb25FcnJvcn1cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAgICovXG4gIGJ1aWxkKCkge1xuICAgIHRocm93IG5ldyBDb21wb3NpdGlvbkVycm9yKFxuICAgICAgJ01lc2hDb21wb25lbnQnLFxuICAgICAgJ0luc3RhbmNlIHNob3VsZCBoYXZlIGl0XFwncyBvd24gLmJ1aWxkKCkuJyxcbiAgICAgIHRoaXNcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgd3JhcFxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIFdyYXBzIHRyYW5zZm9ybXMgKGBwb3NpdGlvbmAgJiBgcm90YXRpb25gKVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlZCB3aGVuIGFjdGlvbiBpcyBjb21wbGV0ZWRcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAgICovXG4gIHdyYXAoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgLy8gVE9ETzogRml4IGRlZmVyIHdpdGggcGh5c2ljc1xuICAgICAgLy8gdGhpcy5kZWZlcigoKSA9PiB7XG4gICAgICBjb25zdCB7cG9zaXRpb24sIHJvdGF0aW9uLCBzY2FsZSwgc2hhZG93fSA9IHRoaXMucGFyYW1zO1xuXG4gICAgICB0aGlzLnBvc2l0aW9uLnNldChwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KTtcbiAgICAgIHRoaXMucm90YXRpb24uc2V0KHJvdGF0aW9uLngsIHJvdGF0aW9uLnksIHJvdGF0aW9uLnopO1xuICAgICAgdGhpcy5zY2FsZS5zZXQoc2NhbGUueCwgc2NhbGUueSwgc2NhbGUueik7XG5cbiAgICAgIHRoaXMubmF0aXZlLmNhc3RTaGFkb3cgPSBzaGFkb3cuY2FzdDtcbiAgICAgIHRoaXMubmF0aXZlLnJlY2VpdmVTaGFkb3cgPSBzaGFkb3cucmVjZWl2ZTtcblxuICAgICAgdGhpcy5hcHBseUJyaWRnZSh7b25XcmFwOiAxfSk7XG5cbiAgICAgIHJlc29sdmUodGhpcyk7XG4gICAgICAvLyB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIENPUFlJTkcgJiBDTE9OSU5HXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgY29weVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIENvcHkgc291cmNlIHRyYW5zZm9ybXMgJiBleGVjdXRlIGBDb21wb25lbnQuY29weSgpYFxuICAgKiBAcmV0dXJuIHt0aGlzfSBNZXNoQ29tcG9uZW50XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gICAqL1xuICBjb3B5KHNvdXJjZSkge1xuICAgIHJldHVybiBzdXBlci5jb3B5KHNvdXJjZSwgKCkgPT4ge1xuICAgICAgdGhpcy5wb3NpdGlvbi5jb3B5KHNvdXJjZS5wb3NpdGlvbik7XG4gICAgICB0aGlzLnJvdGF0aW9uLmNvcHkoc291cmNlLnJvdGF0aW9uKTtcbiAgICAgIHRoaXMucXVhdGVybmlvbi5jb3B5KHNvdXJjZS5xdWF0ZXJuaW9uKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGNsb25lXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gTWFrZSBhIGNsb25lIG9mIHRoaXMgTWVzaENvbXBvbmVudCB1c2luZyBgLmNvcHkoKWBcbiAgICogQHJldHVybiB7TWVzaENvbXBvbmVudH0gY2xvbmUgb2YgdGhpcyBvYmplY3RcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAgICovXG4gIGNsb25lKGdlb21ldHJ5LCBtYXRlcmlhbCkge1xuICAgIGNvbnN0IGRlc3QgPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih7YnVpbGQ6IGZhbHNlfSkuY29weSh0aGlzKTtcblxuICAgIGlmIChnZW9tZXRyeSkgZGVzdC5nZW9tZXRyeSA9IGRlc3QuZ2VvbWV0cnkuY2xvbmUoKTtcbiAgICBpZiAobWF0ZXJpYWwpIGRlc3QubWF0ZXJpYWwgPSBkZXN0Lm1hdGVyaWFsLmNsb25lKCk7XG5cbiAgICByZXR1cm4gZGVzdDtcbiAgfVxufVxuXG5leHBvcnQge1xuICBNZXNoQ29tcG9uZW50XG59O1xuIiwiaW1wb3J0IHtDb21wb25lbnR9IGZyb20gJy4vQ29tcG9uZW50JztcblxuaW1wb3J0IHthdHRyaWJ1dGVzLCBjb3B5fSBmcm9tICcuL3Byb3RvdHlwZS9hdHRyaWJ1dGVzJztcbmltcG9ydCB7Q29tcG9zaXRpb25FcnJvcn0gZnJvbSAnLi9lcnJvcnMnO1xuXG5AYXR0cmlidXRlcyhcbiAgY29weSgncG9zaXRpb24nLCAncm90YXRpb24nLCAncXVhdGVybmlvbicsICd0YXJnZXQnKVxuKVxuLyoqXG4gKiBAY2xhc3MgTGlnaHRDb21wb25lbnRcbiAqIEBjYXRlZ29yeSBjb3JlXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1ldGVycyBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW2luc3RydWN0aW9uc10gLSBUaGUgaW5zdHJ1Y3Rpb25zIG9iamVjdC5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLkNvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlXG4gKi9cbmNsYXNzIExpZ2h0Q29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvcmUuTGlnaHRDb21wb25lbnQjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdFxuICAgKiB7XG4gICAqICAgYnVpbGQ6IHRydWUsXG4gICAqXG4gICAqICAgc2hhZG93OiB7XG4gICAqICAgICBjYXN0OiB0cnVlLFxuICAgKlxuICAgKiAgICAgYmlhczogMCxcbiAgICogICAgIHJhZGl1czogMSxcbiAgICpcbiAgICogICAgIG1hcFNpemU6IHtcbiAgICogICAgICAgd2lkdGg6IDEwMjQsXG4gICAqICAgICAgIGhlaWdodDogMTAyNFxuICAgKiAgICAgfSxcbiAgICpcbiAgICogICAgIGNhbWVyYToge1xuICAgKiAgICAgICBuZWFyOiB0cnVlLFxuICAgKiAgICAgICBmYXI6IDQwMCxcbiAgICogICAgICAgZm92OiA5MCxcbiAgICpcbiAgICogICAgICAgdG9wOiAyMDAsXG4gICAqICAgICAgIGJvdHRvbTogLTIwMCxcbiAgICogICAgICAgbGVmdDogLTIwMCxcbiAgICogICAgICAgcmlnaHQ6IDIwMFxuICAgKiAgICAgfVxuICAgKiAgIH0sXG4gICAqXG4gICAqICAgcG9zaXRpb246IHt4OiAwLCB5OiAwLCB6OiAwfSxcbiAgICogICByb3RhdGlvbjoge3g6IDAsIHk6IDAsIHo6IDB9XG4gICAqIH1cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5Db21wb25lbnQuZGVmYXVsdHMsXG5cbiAgICBidWlsZDogdHJ1ZSxcblxuICAgIHNoYWRvdzoge1xuICAgICAgY2FzdDogdHJ1ZSxcblxuICAgICAgYmlhczogMCxcbiAgICAgIHJhZGl1czogMSxcblxuICAgICAgbWFwU2l6ZToge1xuICAgICAgICB3aWR0aDogMTAyNCxcbiAgICAgICAgaGVpZ2h0OiAxMDI0XG4gICAgICB9LFxuXG4gICAgICBjYW1lcmE6IHtcbiAgICAgICAgbmVhcjogdHJ1ZSxcbiAgICAgICAgZmFyOiA0MDAsXG4gICAgICAgIGZvdjogOTAsXG5cbiAgICAgICAgdG9wOiAyMDAsXG4gICAgICAgIGJvdHRvbTogLTIwMCxcbiAgICAgICAgbGVmdDogLTIwMCxcbiAgICAgICAgcmlnaHQ6IDIwMFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwb3NpdGlvbjoge3g6IDAsIHk6IDAsIHo6IDB9LFxuICAgIHJvdGF0aW9uOiB7eDogMCwgeTogMCwgejogMH1cbiAgfTtcblxuICAvKipcbiAgICogU3RhdGljIGluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb3JlLkxpZ2h0Q29tcG9uZW50I2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0XG4gICAqIHtcbiAgICogICBwb3NpdGlvbjogWyd4JywgJ3knLCAneiddLFxuICAgKiAgIHJvdGF0aW9uOiBbJ3gnLCAneScsICd6J11cbiAgICogfVxuICAgKi9cbiAgc3RhdGljIGluc3RydWN0aW9ucyA9IHtcbiAgICBwb3NpdGlvbjogWyd4JywgJ3knLCAneiddLFxuICAgIHJvdGF0aW9uOiBbJ3gnLCAneScsICd6J11cbiAgfTtcblxuICBzdGF0aWMgZnJvbShsaWdodCwgcGFyYW1zID0ge30sIHdyYXBTaGFkb3cgPSB0cnVlKSB7XG4gICAgcGFyYW1zLmJ1aWxkID0gZmFsc2U7XG5cbiAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgTGlnaHRDb21wb25lbnQocGFyYW1zKTtcblxuICAgIGNvbXBvbmVudC5uYXRpdmUgPSBsaWdodDtcbiAgICBjb21wb25lbnQud3JhcCgpO1xuICAgIGlmICh3cmFwU2hhZG93KSBjb21wb25lbnQud3JhcFNoYWRvdygpO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHBhcmFtcywgZGVmYXVsdHMgPSBMaWdodENvbXBvbmVudC5kZWZhdWx0cywgaW5zdHJ1Y3Rpb25zID0gTGlnaHRDb21wb25lbnQuaW5zdHJ1Y3Rpb25zKSB7XG4gICAgc3VwZXIocGFyYW1zLCBkZWZhdWx0cywgaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmICh0aGlzLnBhcmFtcy5idWlsZCkge1xuICAgICAgY29uc3QgYnVpbGQgPSB0aGlzLmJ1aWxkKHRoaXMucGFyYW1zKTtcblxuICAgICAgaWYgKCFidWlsZCkge1xuICAgICAgICB0aHJvdyBuZXcgQ29tcG9zaXRpb25FcnJvcihcbiAgICAgICAgICAnTGlnaHRDb21wb25lbnQnLFxuICAgICAgICAgICcuYnVpbGQoKSBtZXRob2Qgc2hvdWxkIHJldHVybiBhIFRIUkVFLk9iamVjdDNEIG9yIGEgUHJvbWlzZSByZXNvbHZlZCB3aXRoIFRIUkVFLk9iamVjdDNELicsXG4gICAgICAgICAgdGhpc1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoYnVpbGQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIGJ1aWxkLnRoZW4obmF0aXZlID0+IHtcbiAgICAgICAgICB0aGlzLm5hdGl2ZSA9IG5hdGl2ZTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgdGhpcy5uYXRpdmUgPSBidWlsZDtcblxuICAgICAgdGhpcy53YWl0KHRoaXMud3JhcCgpKTtcbiAgICB9XG5cbiAgICB0aGlzLmFwcGx5Q29tbWFuZCgncG9zdEludGVncmF0ZScpO1xuICB9XG5cbiAgLy8gQlVJTERJTkcgJiBXUkFQUElOR1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGl2ZWN5Y2xlIHNob3VsZCByZXR1cm4gYSBuYXRpdmUgb2JqZWN0LlxuICAgKiBAdGhyb3dzIHtDb21wb3NpdGlvbkVycm9yfVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTGlnaHRDb21wb25lbnRcbiAgICovXG4gIGJ1aWxkKCkge1xuICAgIHRocm93IG5ldyBDb21wb3NpdGlvbkVycm9yKFxuICAgICAgJ01lc2hDb21wb25lbnQnLFxuICAgICAgJ0luc3RhbmNlIHNob3VsZCBoYXZlIGl0XFwncyBvd24gLmJ1aWxkKCkuJyxcbiAgICAgIHRoaXNcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgd3JhcFxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIFdyYXBzIHRyYW5zZm9ybXMgKGBwb3NpdGlvbmAgJiBgcm90YXRpb25gKVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlZCB3aGVuIGFjdGlvbiBpcyBjb21wbGV0ZWRcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkxpZ2h0Q29tcG9uZW50XG4gICAqL1xuICB3cmFwKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIHRoaXMuZGVmZXIoKCkgPT4ge1xuICAgICAgICBjb25zdCB7cG9zaXRpb24sIHJvdGF0aW9ufSA9IHRoaXMucGFyYW1zO1xuXG4gICAgICAgIHRoaXMucG9zaXRpb24uc2V0KHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnopO1xuICAgICAgICB0aGlzLnJvdGF0aW9uLnNldChyb3RhdGlvbi54LCByb3RhdGlvbi55LCByb3RhdGlvbi56KTtcblxuICAgICAgICB0aGlzLmFwcGx5QnJpZGdlKHtvbldyYXA6IDF9KTtcblxuICAgICAgICByZXNvbHZlKHRoaXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCB3cmFwU2hhZG93XG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gV3JhcHMgc2hhZG93IHByb3BlcnRpZXNcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkxpZ2h0Q29tcG9uZW50XG4gICAqL1xuICB3cmFwU2hhZG93KCkge1xuICAgIGNvbnN0IHtuYXRpdmUsIHBhcmFtczoge3NoYWRvd319ID0gdGhpcztcblxuICAgIG5hdGl2ZS5jYXN0U2hhZG93ID0gc2hhZG93LmNhc3Q7XG4gICAgbmF0aXZlLnNoYWRvdy5tYXBTaXplLndpZHRoID0gc2hhZG93Lm1hcFNpemUud2lkdGg7XG4gICAgbmF0aXZlLnNoYWRvdy5tYXBTaXplLmhlaWdodCA9IHNoYWRvdy5tYXBTaXplLmhlaWdodDtcbiAgICBuYXRpdmUuc2hhZG93LmJpYXMgPSBzaGFkb3cuYmlhcztcbiAgICBuYXRpdmUuc2hhZG93LnJhZGl1cyA9IHNoYWRvdy5yYWRpdXM7XG5cbiAgICBjb25zdCBzaGFkb3dDYW1lcmEgPSBuYXRpdmUuc2hhZG93LmNhbWVyYTtcbiAgICBjb25zdCB7Y2FtZXJhfSA9IHNoYWRvdztcblxuICAgIHNoYWRvd0NhbWVyYS5uZWFyID0gY2FtZXJhLm5lYXI7XG4gICAgc2hhZG93Q2FtZXJhLmZhciA9IGNhbWVyYS5mYXI7XG4gICAgc2hhZG93Q2FtZXJhLmZvdiA9IGNhbWVyYS5mb3Y7XG5cbiAgICBzaGFkb3dDYW1lcmEubGVmdCA9IGNhbWVyYS5sZWZ0O1xuICAgIHNoYWRvd0NhbWVyYS5yaWdodCA9IGNhbWVyYS5yaWdodDtcbiAgICBzaGFkb3dDYW1lcmEudG9wID0gY2FtZXJhLnRvcDtcbiAgICBzaGFkb3dDYW1lcmEuYm90dG9tID0gY2FtZXJhLmJvdHRvbTtcbiAgfVxuXG4gIC8vIENPUFlJTkcgJiBDTE9OSU5HXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgY29weVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIENvcHkgc291cmNlIHRyYW5zZm9ybXMgJiBleGVjdXRlIGBDb21wb25lbnQuY29weSgpYFxuICAgKiBAcmV0dXJuIHt0aGlzfSBMaWdodENvbXBvbmVudFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTGlnaHRDb21wb25lbnRcbiAgICovXG4gIGNvcHkoc291cmNlKSB7XG4gICAgcmV0dXJuIHN1cGVyLmNvcHkoc291cmNlLCAoKSA9PiB7XG4gICAgICBpZiAodGhpcy50YXJnZXQpIHRoaXMudGFyZ2V0LmNvcHkoc291cmNlLnRhcmdldCgpKTtcblxuICAgICAgdGhpcy5wb3NpdGlvbi5jb3B5KHNvdXJjZS5wb3NpdGlvbik7XG4gICAgICB0aGlzLnJvdGF0aW9uLmNvcHkoc291cmNlLnJvdGF0aW9uKTtcbiAgICAgIHRoaXMucXVhdGVybmlvbi5jb3B5KHNvdXJjZS5xdWF0ZXJuaW9uKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGNsb25lXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gTWFrZSBhIGNsb25lIG9mIHRoaXMgTGlnaHRDb21wb25lbnQgdXNpbmcgYC5jb3B5KClgXG4gICAqIEByZXR1cm4ge0xpZ2h0Q29tcG9uZW50fSBjbG9uZSBvZiB0aGlzIG9iamVjdFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTGlnaHRDb21wb25lbnRcbiAgICovXG4gIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih7YnVpbGQ6IGZhbHNlfSkuY29weSh0aGlzKTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBMaWdodENvbXBvbmVudFxufTtcbiIsImltcG9ydCB7Q29tcG9uZW50fSBmcm9tICcuL0NvbXBvbmVudCc7XG5cbmltcG9ydCB7YXR0cmlidXRlcywgY29weX0gZnJvbSAnLi9wcm90b3R5cGUvYXR0cmlidXRlcyc7XG5pbXBvcnQge0NvbXBvc2l0aW9uRXJyb3J9IGZyb20gJy4vZXJyb3JzJztcblxuQGF0dHJpYnV0ZXMoXG4gIGNvcHkoJ3Bvc2l0aW9uJywgJ3JvdGF0aW9uJywgJ3F1YXRlcm5pb24nLCAndGFyZ2V0Jylcbilcbi8qKlxuICogQGNsYXNzIENhbWVyYUNvbXBvbmVudFxuICogQGNhdGVnb3J5IGNvcmVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbWV0ZXJzIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbaW5zdHJ1Y3Rpb25zXSAtIFRoZSBpbnN0cnVjdGlvbnMgb2JqZWN0LlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmVcbiAqL1xuY2xhc3MgQ2FtZXJhQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvcmUuQ2FtZXJhQ29tcG9uZW50I2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHRcbiAgICoge1xuICAgKiAgIGJ1aWxkOiB0cnVlLFxuICAgKlxuICAgKiAgIHBvc2l0aW9uOiB7eDogMCwgeTogMCwgejogMH0sXG4gICAqICAgcm90YXRpb246IHt4OiAwLCB5OiAwLCB6OiAwfVxuICAgKiB9XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uQ29tcG9uZW50LmRlZmF1bHRzLFxuXG4gICAgYnVpbGQ6IHRydWUsXG5cbiAgICBwb3NpdGlvbjoge3g6IDAsIHk6IDAsIHo6IDB9LFxuICAgIHJvdGF0aW9uOiB7eDogMCwgeTogMCwgejogMH1cbiAgfTtcblxuICAvKipcbiAgICogU3RhdGljIGluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb3JlLkNhbWVyYUNvbXBvbmVudCNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdFxuICAgKiB7XG4gICAqICAgcG9zaXRpb246IFsneCcsICd5JywgJ3onXSxcbiAgICogICByb3RhdGlvbjogWyd4JywgJ3knLCAneiddLFxuICAgKiAgIHNjYWxlOiBbJ3gnLCAneScsICd6J11cbiAgICogfVxuICAgKi9cbiAgc3RhdGljIGluc3RydWN0aW9ucyA9IHtcbiAgICBwb3NpdGlvbjogWyd4JywgJ3knLCAneiddLFxuICAgIHJvdGF0aW9uOiBbJ3gnLCAneScsICd6J10sXG4gICAgc2NhbGU6IFsneCcsICd5JywgJ3onXVxuICB9O1xuXG4gIHN0YXRpYyBmcm9tKGNhbWVyYSwgcGFyYW1zID0ge30pIHtcbiAgICBwYXJhbXMuYnVpbGQgPSBmYWxzZTtcblxuICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBDYW1lcmFDb21wb25lbnQocGFyYW1zKTtcblxuICAgIGNvbXBvbmVudC5uYXRpdmUgPSBjYW1lcmE7XG4gICAgY29tcG9uZW50LndyYXAoKTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwYXJhbXMsIGRlZmF1bHRzID0gQ2FtZXJhQ29tcG9uZW50LmRlZmF1bHRzLCBpbnN0cnVjdGlvbnMgPSBDYW1lcmFDb21wb25lbnQuaW5zdHJ1Y3Rpb25zKSB7XG4gICAgc3VwZXIocGFyYW1zLCBkZWZhdWx0cywgaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmICh0aGlzLnBhcmFtcy5idWlsZCkge1xuICAgICAgY29uc3QgYnVpbGQgPSB0aGlzLmJ1aWxkKHRoaXMucGFyYW1zKTtcblxuICAgICAgaWYgKCFidWlsZCkge1xuICAgICAgICB0aHJvdyBuZXcgQ29tcG9zaXRpb25FcnJvcihcbiAgICAgICAgICAnQ2FtZXJhQ29tcG9uZW50JyxcbiAgICAgICAgICAnLmJ1aWxkKCkgbWV0aG9kIHNob3VsZCByZXR1cm4gYSBUSFJFRS5PYmplY3QzRCBvciBhIFByb21pc2UgcmVzb2x2ZWQgd2l0aCBUSFJFRS5PYmplY3QzRC4nLFxuICAgICAgICAgIHRoaXNcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJ1aWxkIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICBidWlsZC50aGVuKG5hdGl2ZSA9PiB7XG4gICAgICAgICAgdGhpcy5uYXRpdmUgPSBuYXRpdmU7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHRoaXMubmF0aXZlID0gYnVpbGQ7XG5cbiAgICAgIHRoaXMud2FpdCh0aGlzLndyYXAoKSk7XG4gICAgfVxuXG4gICAgdGhpcy5hcHBseUNvbW1hbmQoJ3Bvc3RJbnRlZ3JhdGUnKTtcbiAgfVxuXG4gIC8vIEJVSUxESU5HICYgV1JBUFBJTkdcblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpdmVjeWNsZSBzaG91bGQgcmV0dXJuIGEgbmF0aXZlIG9iamVjdC5cbiAgICogQHRocm93cyB7Q29tcG9zaXRpb25FcnJvcn1cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkNhbWVyYUNvbXBvbmVudFxuICAgKi9cbiAgYnVpbGQoKSB7XG4gICAgdGhyb3cgbmV3IENvbXBvc2l0aW9uRXJyb3IoXG4gICAgICAnQ2FtZXJhQ29tcG9uZW50JyxcbiAgICAgICdJbnN0YW5jZSBzaG91bGQgaGF2ZSBpdFxcJ3Mgb3duIC5idWlsZCgpLicsXG4gICAgICB0aGlzXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHdyYXBcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBXcmFwcyB0cmFuc2Zvcm1zIChgcG9zaXRpb25gICYgYHJvdGF0aW9uYClcbiAgICogQHJldHVybiB7UHJvbWlzZX0gUmVzb2x2ZWQgd2hlbiBhY3Rpb24gaXMgY29tcGxldGVkXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5DYW1lcmFDb21wb25lbnRcbiAgICovXG4gIHdyYXAoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgdGhpcy5kZWZlcigoKSA9PiB7XG4gICAgICAgIHRoaXMucG9zaXRpb24uc2V0KHRoaXMucGFyYW1zLnBvc2l0aW9uLngsIHRoaXMucGFyYW1zLnBvc2l0aW9uLnksIHRoaXMucGFyYW1zLnBvc2l0aW9uLnopO1xuICAgICAgICB0aGlzLnJvdGF0aW9uLnNldCh0aGlzLnBhcmFtcy5yb3RhdGlvbi54LCB0aGlzLnBhcmFtcy5yb3RhdGlvbi55LCB0aGlzLnBhcmFtcy5yb3RhdGlvbi56KTtcblxuICAgICAgICB0aGlzLmFwcGx5QnJpZGdlKHtvbldyYXA6IDF9KTtcblxuICAgICAgICByZXNvbHZlKHRoaXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBjb3B5XG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gQ29weSBzb3VyY2UgdHJhbnNmb3JtcyAmIGV4ZWN1dGUgYENvbXBvbmVudC5jb3B5KClgXG4gICAqIEByZXR1cm4ge3RoaXN9IENhbWVyYUNvbXBvbmVudFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQ2FtZXJhQ29tcG9uZW50XG4gICAqL1xuICBjb3B5KHNvdXJjZSkge1xuICAgIHJldHVybiBzdXBlci5jb3B5KHNvdXJjZSwgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMudGFyZ2V0KSB0aGlzLnRhcmdldC5jb3B5KHNvdXJjZS50YXJnZXQoKSk7XG5cbiAgICAgIHRoaXMucG9zaXRpb24uY29weShzb3VyY2UucG9zaXRpb24pO1xuICAgICAgdGhpcy5yb3RhdGlvbi5jb3B5KHNvdXJjZS5yb3RhdGlvbik7XG4gICAgICB0aGlzLnF1YXRlcm5pb24uY29weShzb3VyY2UucXVhdGVybmlvbik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBjbG9uZVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIE1ha2UgYSBjbG9uZSBvZiB0aGlzIENhbWVyYUNvbXBvbmVudCB1c2luZyBgLmNvcHkoKWBcbiAgICogQHJldHVybiB7Q2FtZXJhQ29tcG9uZW50fSBjbG9uZSBvZiB0aGlzIG9iamVjdFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQ2FtZXJhQ29tcG9uZW50XG4gICAqL1xuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3Ioe2J1aWxkOiBmYWxzZX0pLmNvcHkodGhpcyk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgQ2FtZXJhQ29tcG9uZW50XG59O1xuIiwiZXhwb3J0IGNvbnN0IHN5c3RlbSA9IHtcbiAgd2luZG93OiB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHdpbmRvd1xufTtcbiIsImltcG9ydCB7dmVyc2lvbn0gZnJvbSAnLi4vLi4vcGFja2FnZS5qc29uJztcbmltcG9ydCB7c3lzdGVtfSBmcm9tICcuLi9wb2x5ZmlsbCc7XG5pbXBvcnQge01vZHVsZVN5c3RlbX0gZnJvbSAnLi9Nb2R1bGVTeXN0ZW0nO1xuaW1wb3J0IHtNb2R1bGVNYW5hZ2VyfSBmcm9tICcuL01vZHVsZU1hbmFnZXInO1xuXG4vKipcbiAqIEBjbGFzcyBBcHBcbiAqIEBjYXRlZ29yeSBjb3JlXG4gKiBAZGVzY3JpcHRpb24gVGhpcyBjb21wb25lbnQgaXMgdXNlZCB0byBwcmVwYXJlIGEgd29ybGQgc2NlbmUsIHNldHVwIHBoeXNpY3MsIGNhbWVyYSwgcmVuZGVyZXIgYW5kIGFsbCBvdGhlciB0aGluZ3MgdGhhdCB5b3UgdXN1YWxseSBkbyBiZWZvcmUgbWFraW5nIG1lc2hlcy5cbiAqIEBwYXJhbSB7QXJyYXl9IFttb2R1bGVzPVtdXSAtIEFycmF5IG9mIE1vZHVsZXNcbiAqIEBleHRlbmRzIE1vZHVsZVN5c3RlbVxuICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlXG4gKi9cbmNsYXNzIEFwcCBleHRlbmRzIE1vZHVsZVN5c3RlbSB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVmaW5lcyB3aGV0aGVyIHRoZSBzY2VuZSBzaG91bGQgcmVuZGVyIG9yIG5vdFxuICAgKiBAbWVtYmVyIHtCb29sZWFufSBtb2R1bGU6Y29yZS5BcHAjZW5hYmxlZFxuICAgKiBAcHVibGljXG4gICAqL1xuICBlbmFibGVkID0gdHJ1ZTtcblxuICAvKipcbiAgICogTG9vcHMgaW4gdGhpcyBhcHBcbiAgICogQGRlc2NyaXB0aW9uIEFycmF5IG9mIGxvb3BzIHRoYXQgYXJlIGV4ZWN1dGVkIGJ5IHRoaXMgYXBwLlxuICAgKiBAbWVtYmVyIHtBcnJheX0gbW9kdWxlOmNvcmUuQXBwI2xvb3BzXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGxvb3BzID0gW107XG5cbiAgY29uc3RydWN0b3IobW9kdWxlcyA9IFtdKSB7XG4gICAgY29uc29sZS5sb2coYFdIUy5BcHAgJHt2ZXJzaW9ufWApO1xuXG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLm1hbmFnZXIgPSBuZXcgTW9kdWxlTWFuYWdlcih0aGlzKTtcbiAgICB0aGlzLm1vZHVsZXMgPSBtb2R1bGVzO1xuXG4gICAgdGhpcy5pbnRlZ3JhdGVNb2R1bGVzKCk7XG4gIH1cblxuICAvLyBDT05UUk9MUyAmIFVQREFUSU5HXG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc3RhcnRcbiAgICogQGRlc2NyaXB0aW9uIFN0YXJ0IHJlbmRlcmluZyBsb29wIGFuZCBwaHlzaWNzIHNpbXVsYXRpb24gKGlmIHlvdSB1c2UgdmVyc2lvbiB3aXRoIHBoeXNpY3MpLlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQXBwXG4gICAqL1xuICBzdGFydCgpIHtcbiAgICBjb25zdCByZXF1ZXN0QW5pbUZyYW1lID0gKCgpID0+IHtcbiAgICAgIHJldHVybiBzeXN0ZW0ud2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICB8fCBzeXN0ZW0ud2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICB8fCBzeXN0ZW0ud2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICB8fCBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICBzeXN0ZW0ud2luZG93LnNldFRpbWVvdXQoY2FsbGJhY2ssIDEwMDAgLyA2MCk7XG4gICAgICAgIH07XG4gICAgfSkoKTtcblxuICAgIGNvbnN0IHByb2Nlc3MgPSAoKSA9PiB7XG4gICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0QW5pbUZyYW1lKCgpID0+IHByb2Nlc3MoKSk7XG4gICAgICBpZiAoIXRoaXMuZW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBmb3IgKGxldCBpID0gMCwgbGwgPSB0aGlzLmxvb3BzLmxlbmd0aDsgaSA8IGxsOyBpKyspIHtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMubG9vcHNbaV07XG4gICAgICAgIGlmIChlLmVuYWJsZWQpIGUuZXhlY3V0ZShlLmNsb2NrKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcblxuICAgIGlmICghdGhpcy5yZXF1ZXN0KVxuICAgICAgcHJvY2VzcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc3RvcFxuICAgKiBAZGVzY3JpcHRpb24gU3RvcHMgcmVuZGVyaW5nIGxvb3BzXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5BcHBcbiAgICovXG4gIHN0b3AoKSB7XG4gICAgdGhpcy5lbmFibGVkID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBhZGRMb29wXG4gICAqIEBkZXNjcmlwdGlvbiBBZGRzIGxvb3AgdG8gdGhpcyBhcHAuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBsb29wIC0gdGhlIGxvb3AgdG8gYWRkXG4gICAqIEByZXR1cm4ge1Byb21pc2V9IFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHByb21pc2VzIGNvbXBsZXRlZC5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkFwcFxuICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5BZGRpbmcgYSBsb29wIHRvIGFuIGFwcDwvY2FwdGlvbj5cbiAgICogY29uc3QgbG9vcCA9IG5ldyBMb29wKCgpID0+IHtcbiAgICogIC8vIC4uLlxuICAgKiB9KTtcbiAgICpcbiAgICogY29uc3QgYXBwID0gbmV3IEFwcCgpO1xuICAgKlxuICAgKiBhcHAuYWRkTG9vcChsb29wKTtcbiAgICogbG9vcC5zdGFydCgpO1xuICAgKi9cbiAgYWRkTG9vcChsb29wKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgdGhpcy5sb29wcy5wdXNoKGxvb3ApO1xuICAgICAgcmVzb2x2ZShsb29wKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHJlbW92ZUxvb3BcbiAgICogQGRlc2NyaXB0aW9uIFJlbW92ZXMgbG9vcCBmcm9tIHRoaXMgYXBwLlxuICAgKiBAcGFyYW0ge09iamVjdH0gbG9vcCAtIHRoZSBsb29wIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiBwcm9taXNlcyBjb21wbGV0ZWQuXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5BcHBcbiAgICovXG4gIHJlbW92ZUxvb3AobG9vcCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5sb29wcy5pbmRleE9mKGxvb3ApO1xuICAgICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy5sb29wcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgICByZXNvbHZlKGxvb3ApO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0KGtleSkge1xuICAgIHJldHVybiB0aGlzLm1hbmFnZXIuZ2V0KGtleSk7XG4gIH1cblxuICB1c2Uoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMubWFuYWdlci51c2Uoa2V5KTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBBcHBcbn07XG4iLCJpbXBvcnQge0Nsb2NrfSBmcm9tICd0aHJlZSc7XG5cbi8qKlxuICogQGNsYXNzIExvb3BcbiAqIEBjYXRlZ29yeSBjb3JlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgb24gZWFjaCBhbmltYXRpb24gZnJhbWVcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW3VzZUNsb2NrPXRydWVdIHBhc3NlcyBhIENsb2NrIHRvIHRoZSBmdW5jdGlvbiB3aGVuIGNhbGxlZCwgaWYgdHJ1ZVxuICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlXG4gKi9cbmNsYXNzIExvb3Age1xuICBjb25zdHJ1Y3RvcihmdW5jLCB1c2VDbG9jayA9IHRydWUpIHtcbiAgICB0aGlzLmZ1bmMgPSBmdW5jO1xuICAgIHRoaXMuY2xvY2sgPSB1c2VDbG9jayA/IG5ldyBDbG9jaygpIDogbnVsbDtcbiAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIENPTlRST0xTXG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc3RhcnRcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBTdGFydHMgdGhpcyBsb29wLCBjbG9jayBpZiBpdCBoYXMgb25lLiBXb24ndCBkbyBhbnl0aGluZyBpZiBsb29wIGVuYWJsZWQgYWxyZWFkeS5cbiAgICogQHBhcmFtIHtDb21wb25lbnR9IFt3b3JsZF0gYXBwIHRvIGFkZCB0aGlzIGxvb3AgdG8sIGlmIHByb3ZpZGVkLlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTG9vcFxuICAgKi9cbiAgc3RhcnQod29ybGQpIHtcbiAgICBpZiAodGhpcy5lbmFibGVkKSByZXR1cm47XG5cbiAgICBpZiAod29ybGQpIHdvcmxkLmFkZExvb3AodGhpcyk7XG5cbiAgICBpZiAodGhpcy5jbG9jaykgdGhpcy5jbG9jay5zdGFydCgpO1xuICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBzdG9wXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gU3RvcHMgdGhpcyBsb29wIGFuZCBpdHMgY2xvY2sgaWYgaXQgaGFzIG9uZSwgd29uJ3QgZG8gYW55dGhpbmcgaWYgdGhpcyBsb29wIGlzIG5vdCBlbmFibGVkKVxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gW3dvcmxkXSBhcHAgdG8gcmVtb3ZlIHRoaXMgbG9vcCBmcm9tLCBpZiBwcm92aWRlZC5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkxvb3BcbiAgICovXG4gIHN0b3Aod29ybGQpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuY2xvY2spIHRoaXMuY2xvY2suc3RvcCgpO1xuICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuXG4gICAgaWYgKHdvcmxkKSB3b3JsZC5yZW1vdmVMb29wKHRoaXMpO1xuICB9XG5cbiAgLy8gRVhFQ1VUSU9OXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgZXhlY3V0ZVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIHRoZSBmdW5jdGlvbiBvZiB0aGlzIGxvb3BcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkxvb3BcbiAgICogQHJldHVybnMgeyp9IHdoYXRldmVyIHRoZSBmdW5jdGlvbiBvZiB0aGlzIGxvb3AgcmV0dXJuc1xuICAgKi9cbiAgZXhlY3V0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5mdW5jKHRoaXMuY2xvY2spO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIExvb3Bcbn07XG4iLCIvKiogQG1vZHVsZSBjb3JlICovXG5leHBvcnQgKiBmcm9tICcuL0NvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL01lc2hDb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9MaWdodENvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL0NhbWVyYUNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL0FwcCc7XG5leHBvcnQgKiBmcm9tICcuL0xvb3AnO1xuZXhwb3J0ICogZnJvbSAnLi9Nb2R1bGVNYW5hZ2VyJztcbiIsImltcG9ydCB7QW1iaWVudExpZ2h0IGFzIEFtYmllbnRMaWdodE5hdGl2ZX0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHtMaWdodENvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29yZS9MaWdodENvbXBvbmVudCc7XG5cbi8qKlxuICogQGNsYXNzIEFtYmllbnRMaWdodFxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbGlnaHRzXG4gKiBAZGVzY3JpcHRpb24gQW1iaWVudExpZ2h0IGlzIGEgc2ltcGxlIGNsYXNzLCBpdCBleHRlbmRzIExpZ2h0IGFuZCBpbmhlcml0cyBhbGwgaXRzIG1ldGhvZHMuXG4gKiBBbWJpZW50TGlnaHQgY3JlYXRlcyBiYXNpYyBsaWdodCBhcm91bmQgYWxsIHNjZW5lLCBzbyBpdCBkb2Vzbid0IG5lZWQgcHJvcGVydGllcyBsaWtlIHBvcyBvciB0YXJnZXQuXG4gKiBJdCBzdXBwb3J0cyBvbmx5IGNvbG9yIGFuZCBpbnRlbnNpdHkgYXMgcGFyYW1ldGVycywgd2hpY2ggZGVmaW5lcyB0aGUgY29sb3Igb2YgdGhlIHN1cnJvdW5kZWQgbGlnaHQgYW5kIGludGVuc2l0eSBvZiBsaWdodC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zPXtsaWdodDoge2NvbG9yOiAweGZmZmZmZiwgaW50ZW5zaXR5OiAxfX1dIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLkxpZ2h0Q29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbGlnaHRzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhbiBBbWJpZW50TGlnaHQgPC9jYXB0aW9uPlxuICogbmV3IEFtYmllbnRMaWdodCh7XG4gKiAgIGNvbG9yOiAweGZmZmZmZixcbiAqICAgaW50ZW5zaXR5OiAwLjJcbiAqIH0pLmFkZFRvKHdvcmxkKTtcbiAqL1xuY2xhc3MgQW1iaWVudExpZ2h0IGV4dGVuZHMgTGlnaHRDb21wb25lbnQge1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTGlnaHRDb21wb25lbnQuZGVmYXVsdHMsXG5cbiAgICBjb2xvcjogMHhmZmZmZmYsXG4gICAgaW50ZW5zaXR5OiAxXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIEFtYmllbnRMaWdodC5kZWZhdWx0cyk7XG4gIH1cblxuICBidWlsZChwYXJhbXMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtsaWdodDogbmV3IEFtYmllbnRMaWdodE5hdGl2ZShcbiAgICAgIHBhcmFtcy5jb2xvcixcbiAgICAgIHBhcmFtcy5pbnRlbnNpdHlcbiAgICApfSkubGlnaHQ7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgQW1iaWVudExpZ2h0XG59O1xuIiwiaW1wb3J0IHtEaXJlY3Rpb25hbExpZ2h0IGFzIERpcmVjdGlvbmFsTGlnaHROYXRpdmUsIERpcmVjdGlvbmFsTGlnaHRIZWxwZXJ9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7TGlnaHRDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTGlnaHRDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBEaXJlY3Rpb25hbExpZ2h0XG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9saWdodHNcbiAqIEBkZXNjcmlwdGlvbiBEaXJlY3RpbmFsTGlnaHQgY3JlYXRlcyBhIGxpZ2h0IHRoYXQgc2hpbmVzIGZyb20gYSBzcGVjaWZpYyBkaXJlY3Rpb24gbm90IGZyb20gYSBzcGVjaWZpYyBwb3NpdGlvbi48YnIvPjxici8+XG4gKiBUaGlzIGxpZ2h0IHdpbGwgYmVoYXZlIGFzIHRob3VnaCBpdCBpcyBpbmZpbml0ZWx5IGZhciBhd2F5IGFuZCB0aGUgcmF5cyBwcm9kdWNlZCBmcm9tIGl0IGFyZSBhbGwgcGFyYWxsZWwuIDxici8+PGJyLz5cbiAqIFRoZSBiZXN0IGFuYWxvZ3kgd291bGQgYmUgYSBsaWdodCBzb3VyY2UgdGhhdCBhY3RzIGxpa2UgdGhlIHN1bjogdGhlIHN1biBpcyBzbyBmYXIgYXdheSB0aGF0IGFsbCBzdW5saWdodCBoaXR0aW5nIG9iamVjdHMgY29tZXMgZnJvbSB0aGUgc2FtZSBhbmdsZS48YnIvPjxici8+XG4gKiBJdCBoYXMgdGhlIHNhbWUgb3B0aW9ucyBhcyBBbWJpZW50TGlnaHQgaW4gbGlnaHQgcGFyYW1hdGVyLCBidXQgaXQgYWxzbyBzdXBwb3J0cyBwb3MgYW5kIHRhcmdldCBwYXJhbWF0ZXJzLlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXM9e2xpZ2h0OiB7Y29sb3I6IDB4ZmZmZmZmLCBpbnRlbnNpdHk6IDF9fV0gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTGlnaHRDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9saWdodHNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgRGlyZWN0aW9uYWxMaWdodCB0byBmYWxsIGRvd24gZnJvbSB2ZWMzKDEwLCAyMCwgMTApIHRvIHZlYzMoMCwgMCwgMCk8L2NhcHRpb24+XG4gKiBuZXcgRGlyZWN0aW9uYWxMaWdodCh7XG4gKiAgIGNvbG9yOiAweGZmZmZmZixcbiAqICAgaW50ZW5zaXR5OiAwLjIsXG4gKlxuICogICBwb3NpdGlvbjogWzEwLCAyMCwgMTBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBEaXJlY3Rpb25hbExpZ2h0IGV4dGVuZHMgTGlnaHRDb21wb25lbnQge1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTGlnaHRDb21wb25lbnQuZGVmYXVsdHMsXG5cbiAgICBjb2xvcjogMHhmZmZmZmYsXG4gICAgaW50ZW5zaXR5OiAxXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIERpcmVjdGlvbmFsTGlnaHQuZGVmYXVsdHMpO1xuICAgIHRoaXMud3JhcFNoYWRvdygpO1xuICB9XG5cbiAgYnVpbGQocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7bGlnaHQ6IG5ldyBEaXJlY3Rpb25hbExpZ2h0TmF0aXZlKFxuICAgICAgcGFyYW1zLmNvbG9yLFxuICAgICAgcGFyYW1zLmludGVuc2l0eVxuICAgICl9KS5saWdodDtcbiAgfVxufVxuXG5leHBvcnQge1xuICBEaXJlY3Rpb25hbExpZ2h0XG59O1xuIiwiaW1wb3J0IHtIZW1pc3BoZXJlTGlnaHQgYXMgSGVtaXNwaGVyZUxpZ2h0TmF0aXZlLCBIZW1pc3BoZXJlTGlnaHRIZWxwZXJ9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7TGlnaHRDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTGlnaHRDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBIZW1pc3BoZXJlTGlnaHRcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL2xpZ2h0c1xuICogQGRlc2NyaXB0aW9uIEhlbWlzcGhlcmVMaWdodCBpcyBhIGxpZ2h0IHNvdXJjZSBwb3NpdGlvbmVkIGRpcmVjdGx5IGFib3ZlIHRoZSBzY2VuZS48YnIvPlxuICogSXQgYWxzbyBkb2Vzbid0IG5lZWQgcG9zaXRpb24gYW5kIHRhcmdldCBwcm9wZXJ0aWVzLlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2V4YW1wbGVzL3dlYmdsX2xpZ2h0c19oZW1pc3BoZXJlLmh0bWxcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zPXtsaWdodDoge3NreUNvbG9yOiAweGZmZmZmZiwgZ3JvdW5kQ29sb3I6IDB4ZmZmZmZmLCBpbnRlbnNpdHk6IDF9fV0gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTGlnaHRDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9saWdodHNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgSGVtaXNwaGVyZUxpZ2h0PC9jYXB0aW9uPlxuICogbmV3IEhlbWlzcGhlcmVMaWdodCh7XG4gKiAgIHNreUNvbG9yOiAweGZmMDAwMCxcbiAqICAgZ3JvdW5kQ29sb3I6IDB4MDAwMGZmLFxuICogICBpbnRlbnNpdHk6IDAuMlxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgSGVtaXNwaGVyZUxpZ2h0IGV4dGVuZHMgTGlnaHRDb21wb25lbnQge1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTGlnaHRDb21wb25lbnQuZGVmYXVsdHMsXG5cbiAgICBza3lDb2xvcjogMHhmZmZmZmYsXG4gICAgZ3JvdW5kQ29sb3I6IDB4ZmZmZmZmLFxuICAgIGludGVuc2l0eTogMVxuICB9XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIEhlbWlzcGhlcmVMaWdodC5kZWZhdWx0cyk7XG4gIH1cblxuICBidWlsZChwYXJhbXMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtsaWdodDogbmV3IEhlbWlzcGhlcmVMaWdodE5hdGl2ZShcbiAgICAgIHBhcmFtcy5za3lDb2xvcixcbiAgICAgIHBhcmFtcy5ncm91bmRDb2xvcixcbiAgICAgIHBhcmFtcy5pbnRlbnNpdHlcbiAgICApfSkubGlnaHQ7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgSGVtaXNwaGVyZUxpZ2h0XG59O1xuIiwiaW1wb3J0IHtQb2ludExpZ2h0IGFzIFBvaW50TGlnaHROYXRpdmUsIFBvaW50TGlnaHRIZWxwZXJ9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7TGlnaHRDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTGlnaHRDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBQb2ludExpZ2h0XG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9saWdodHNcbiAqIEBkZXNjcmlwdGlvbiBQb2ludExpZ2h0IGNyZWF0ZXMgYSBsaWdodCBhdCBhIHNwZWNpZmljIHBvc2l0aW9uIGluIHRoZSBzY2VuZS4gVGhlIGxpZ2h0IHNoaW5lcyBpbiBhbGwgZGlyZWN0aW9ucyAocm91Z2hseSBzaW1pbGFyIHRvIGEgbGlnaHQgYnVsYi4pPGJyLz48YnIvPlxuICogSXQgaGFzIHRoZSBzYW1lIG9wdGlvbnMgYXMgQW1iaWVudExpZ2h0IGluIGxpZ2h0IHBhcmFtYXRlciwgYnV0IGl0IGFsc28gc3VwcG9ydHMgcG9zaXRpb24sIGRpc3RhbmNlIGFuZCBkZWNheS48YnIvPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXM9e2xpZ2h0OiB7Y29sb3I6IDB4ZmZmZmZmLCBpbnRlbnNpdHk6IDEsIGRpc3RhbmNlOiAxMDAsIGRlY2F5OiAxfX1dIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIExpZ2h0Q29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbGlnaHRzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIFBvaW50TGlnaHQ8L2NhcHRpb24+XG4gKiBuZXcgUG9pbnRMaWdodCgge1xuICogICBjb2xvcjogMHhmZjAwMDAsXG4gKiAgIGludGVuc2l0eTogMixcbiAqICAgZGlzdGFuY2U6IDMwMFxuICpcbiAqICAgcG9zaXRpb246IFsxMCwgMjAsIDEwXVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgUG9pbnRMaWdodCBleHRlbmRzIExpZ2h0Q29tcG9uZW50IHtcbiAgc3RhdGljIGRlZmF1bHRzPSB7XG4gICAgLi4uTGlnaHRDb21wb25lbnQuZGVmYXVsdHMsXG5cbiAgICBjb2xvcjogMHhmZmZmZmYsXG4gICAgaW50ZW5zaXR5OiAxLFxuICAgIGRpc3RhbmNlOiAxMDAsXG4gICAgZGVjYXk6IDFcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHBhcmFtcyA9IHt9KSB7XG4gICAgc3VwZXIocGFyYW1zLCBQb2ludExpZ2h0LmRlZmF1bHRzKTtcbiAgICB0aGlzLndyYXBTaGFkb3coKTtcbiAgfVxuXG4gIGJ1aWxkKHBhcmFtcyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe2xpZ2h0OiBuZXcgUG9pbnRMaWdodE5hdGl2ZShcbiAgICAgIHBhcmFtcy5jb2xvcixcbiAgICAgIHBhcmFtcy5pbnRlbnNpdHksXG4gICAgICBwYXJhbXMuZGlzdGFuY2UsXG4gICAgICBwYXJhbXMuZGVjYXlcbiAgICApfSkubGlnaHQ7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgUG9pbnRMaWdodFxufTtcbiIsImltcG9ydCB7U3BvdExpZ2h0IGFzIFNwb3RMaWdodE5hdGl2ZX0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHtMaWdodENvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29yZS9MaWdodENvbXBvbmVudCc7XG5cbi8qKlxuICogQGNsYXNzIFNwb3RMaWdodFxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbGlnaHRzXG4gKiBAZGVzY3JpcHRpb24gU3BvdExpZ2h0IGNyZWF0ZXMgc3BvdCBsaWdodCB0aGF0IGNhbiBjYXN0IHNoYWRvdyBpbiBvbmUgZGlyZWN0aW9uLiA8YnIvPjxici8+XG4gKiBJdCBoYXMgdGhlIHNhbWUgcGFyYW1ldGVycyBhcyBBbWJpZW50TGlnaHQgaW4gbGlnaHQsIGJ1dCBpdCBhbHNvIHN1cHBvcnRzIHBvcyBhbmQgdGFyZ2V0LiA8YnIvPjxici8+XG4gKiBTcG90TGlnaHQgYWZmZWN0cyBtZXNoZXMgd2l0aCBsYW1iZXJ0IGFuZCBwaG9uZyBtYXRlcmlhbC5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9leGFtcGxlcy93ZWJnbF9saWdodHNfc3BvdGxpZ2h0Lmh0bWxcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zPXtsaWdodDoge2NvbG9yOiAweGZmZmZmZiwgaW50ZW5zaXR5OiAxLCBkaXN0YW5jZTogMTAwLCBhbmdsZTogTWF0aC5QSSAvIDMsIGV4cG9uZW50OiAwLCBkZWNheTogMX19XSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5MaWdodENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL2xpZ2h0c1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBTcG90TGlnaHQgdGhhdCBmYWxscyBkb3duIGZyb20gdmVjMygxMCwgMjAsIDEwKSB0byB2ZWMzKDAsIDAsIDApPC9jYXB0aW9uPlxuICogbmV3IFNwb3RMaWdodCh7XG4gKiAgIGNvbG9yOiAweDAwZmYwMCxcbiAqICAgaW50ZW5zaXR5OiAzLFxuICogICBkaXN0YW5jZTogMTAwMFxuICpcbiAqICAgcG9zaXRpb246IFsxMCwgMjAsIDEwXVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgU3BvdExpZ2h0IGV4dGVuZHMgTGlnaHRDb21wb25lbnQge1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTGlnaHRDb21wb25lbnQuZGVmYXVsdHMsXG5cbiAgICBjb2xvcjogMHhmZmZmZmYsXG4gICAgaW50ZW5zaXR5OiAxLFxuICAgIGRpc3RhbmNlOiAxMDAsXG4gICAgYW5nbGU6IE1hdGguUEkgLyAzLFxuICAgIGV4cG9uZW50OiAwLFxuICAgIGRlY2F5OiAxXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIFNwb3RMaWdodC5kZWZhdWx0cyk7XG4gICAgdGhpcy53cmFwU2hhZG93KCk7XG4gIH1cblxuICBidWlsZChwYXJhbXMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtsaWdodDogbmV3IFNwb3RMaWdodE5hdGl2ZShcbiAgICAgIHBhcmFtcy5jb2xvcixcbiAgICAgIHBhcmFtcy5pbnRlbnNpdHksXG4gICAgICBwYXJhbXMuZGlzdGFuY2UsXG4gICAgICBwYXJhbXMuYW5nbGUsXG4gICAgICBwYXJhbXMuZXhwb25lbnQsXG4gICAgICBwYXJhbXMuZGVjYXlcbiAgICApfSkubGlnaHQ7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgU3BvdExpZ2h0XG59O1xuIiwiaW1wb3J0IHtSZWN0QXJlYUxpZ2h0IGFzIFJlY3RBcmVhTGlnaHROYXRpdmV9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7TGlnaHRDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTGlnaHRDb21wb25lbnQnO1xuXG5jbGFzcyBBcmVhTGlnaHQgZXh0ZW5kcyBMaWdodENvbXBvbmVudCB7XG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5MaWdodENvbXBvbmVudC5kZWZhdWx0cyxcblxuICAgIGNvbG9yOiAweGZmZmZmZixcbiAgICBpbnRlbnNpdHk6IDEsXG4gICAgd2lkdGg6IDEwLFxuICAgIGhlaWdodDogMTBcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHN1cGVyKHBhcmFtcywgQXJlYUxpZ2h0LmRlZmF1bHRzKTtcbiAgfVxuXG4gIGJ1aWxkKHBhcmFtcyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe2xpZ2h0OiBuZXcgUmVjdEFyZWFMaWdodE5hdGl2ZShcbiAgICAgIHBhcmFtcy5jb2xvcixcbiAgICAgIHBhcmFtcy5pbnRlbnNpdHksXG4gICAgICBwYXJhbXMud2lkdGgsXG4gICAgICBwYXJhbXMuaGVpZ2h0XG4gICAgKX0pLmxpZ2h0O1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIEFyZWFMaWdodFxufTtcbiIsIi8qKiBAbW9kdWxlIGNvbXBvbmVudHMvbGlnaHRzICovXG5leHBvcnQgKiBmcm9tICcuL0FtYmllbnRMaWdodCc7XG5leHBvcnQgKiBmcm9tICcuL0RpcmVjdGlvbmFsTGlnaHQnO1xuZXhwb3J0ICogZnJvbSAnLi9IZW1pc3BoZXJlTGlnaHQnO1xuZXhwb3J0ICogZnJvbSAnLi9Qb2ludExpZ2h0JztcbmV4cG9ydCAqIGZyb20gJy4vU3BvdExpZ2h0JztcbmV4cG9ydCAqIGZyb20gJy4vQXJlYUxpZ2h0JztcbiIsImltcG9ydCB7Q3ViZUNhbWVyYSBhcyBDdWJlQ2FtZXJhTmF0aXZlfSBmcm9tICd0aHJlZSc7XG5pbXBvcnQge0NhbWVyYUNvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29yZS9DYW1lcmFDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBDdWJlQ2FtZXJhXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9jYW1lcmFzXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyA2IGNhbWVyYXMgdGhhdCByZW5kZXIgdG8gYSBXZWJHTFJlbmRlclRhcmdldEN1YmVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbWV0ZXJzIG9iamVjdC5cbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9jYW1lcmFzXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5DYW1lcmFDb21wb25lbnRcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0ZXMgYSBDdWJlQ2FtZXJhIGFuZCBzZXQgaXQgYXMgYXBwJ3MgY2FtZXJhPC9jYXB0aW9uPlxuICogY29uc3QgY2FtZXJhID0gbmV3IEN1YmVDYW1lcmEoe1xuICogICBjYW1lcmE6IHtcbiAqICAgICBjdWJlUmVzb2x1dGlvbjogMjU2XG4gKiAgIH0sXG4gKlxuICogICBwb3NpdGlvbjoge1xuICogICAgIHg6IDAsXG4gKiAgICAgeTogMTAwLFxuICogICAgIHo6IDBcbiAqICAgfVxuICogfSk7XG4gKlxuICogYXBwLmNhbWVyYSA9IGNhbWVyYTtcbiAqL1xuY2xhc3MgQ3ViZUNhbWVyYSBleHRlbmRzIENhbWVyYUNvbXBvbmVudCB7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvY2FtZXJhcy5DdWJlQ2FtZXJhI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGNhbWVyYToge1xuICAgKiAgICAgbmVhcjogMSxcbiAgICogICAgIGZhcjogMTAwMCxcbiAgICogICAgIGN1YmVSZXNvbHV0aW9uOiAxMjhcbiAgICogICB9XG4gICAqIH08L3ByZT5cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5DYW1lcmFDb21wb25lbnQuZGVmYXVsdHMsXG5cbiAgICBuZWFyOiAxLFxuICAgIGZhcjogMTAwMCxcbiAgICBjdWJlUmVzb2x1dGlvbjogMTI4XG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIEN1YmVDYW1lcmEuZGVmYXVsdHMpO1xuICB9XG5cbiAgYnVpbGQocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7Y2FtZXJhOiBuZXcgQ3ViZUNhbWVyYU5hdGl2ZShcbiAgICAgIHBhcmFtcy5uZWFyLFxuICAgICAgcGFyYW1zLmZhcixcbiAgICAgIHBhcmFtcy5jdWJlUmVzb2x1dGlvblxuICAgICl9KS5jYW1lcmE7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgQ3ViZUNhbWVyYVxufTtcbiIsImltcG9ydCB7T3J0aG9ncmFwaGljQ2FtZXJhIGFzIE9ydGhvZ3JhcGhpY0NhbWVyYU5hdGl2ZX0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHtDYW1lcmFDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvQ2FtZXJhQ29tcG9uZW50JztcbmltcG9ydCB7c3lzdGVtfSBmcm9tICcuLi8uLi9wb2x5ZmlsbCc7XG5cbi8qKlxuICogQGNsYXNzIE9ydGhvZ3JhcGhpY0NhbWVyYVxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvY2FtZXJhc1xuICogQGRlc2NyaXB0aW9uIENhbWVyYSB3aXRoIG9ydGhvZ3JhcGhpYyBwcm9qZWN0aW9uLlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtZXRlcnMgb2JqZWN0LlxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL2NhbWVyYXNcbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLkNhbWVyYUNvbXBvbmVudFxuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRlIGFuIE9ydGhvZ3JhcGhpY0NhbWVyYSBhbmQgc2V0IGl0IGFzIGFwcCdzIGNhbWVyYTwvY2FwdGlvbj5cbiAqIGNvbnN0IGNhbWVyYSA9IG5ldyBPcnRob2dyYXBoaWNDYW1lcmEoe1xuICogICBjYW1lcmE6IHtcbiAqICAgICBmYXI6IDEwMDAwXG4gKiAgIH0sXG4gKlxuICogICBwb3NpdGlvbjoge1xuICogICAgIHk6IDUwXG4gKiAgIH1cbiAqIH0pO1xuICpcbiAqIGFwcC5jYW1lcmEgPSBjYW1lcmE7XG4gKi9cbmNsYXNzIE9ydGhvZ3JhcGhpY0NhbWVyYSBleHRlbmRzIENhbWVyYUNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL2NhbWVyYXMuT3J0aG9ncmFwaGljQ2FtZXJhI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIG5lYXI6IDEsXG4gICAqICAgZmFyOiAxMDAwLFxuICAgKiAgIGxlZnQ6IHN5c3RlbS53aW5kb3cuaW5uZXJXaWR0aCAvIC0yLFxuICAgKiAgIHJpZ2h0OiBzeXN0ZW0ud2luZG93LmlubmVyV2lkdGggLyAyLFxuICAgKiAgIHRvcDogc3lzdGVtLndpbmRvdy5pbm5lckhlaWdodCAvIDIsXG4gICAqICAgYm90dG9tOiBzeXN0ZW0ud2luZG93LmlubmVySGVpZ2h0IC8gLTJcbiAgICogfTwvcHJlPlxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIC4uLkNhbWVyYUNvbXBvbmVudC5kZWZhdWx0cyxcblxuICAgIG5lYXI6IDEsXG4gICAgZmFyOiAxMDAwLFxuICAgIGxlZnQ6IHN5c3RlbS53aW5kb3cuaW5uZXJXaWR0aCAvIC0yLFxuICAgIHJpZ2h0OiBzeXN0ZW0ud2luZG93LmlubmVyV2lkdGggLyAyLFxuICAgIHRvcDogc3lzdGVtLndpbmRvdy5pbm5lckhlaWdodCAvIDIsXG4gICAgYm90dG9tOiBzeXN0ZW0ud2luZG93LmlubmVySGVpZ2h0IC8gLTJcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHN1cGVyKHBhcmFtcywgT3J0aG9ncmFwaGljQ2FtZXJhLmRlZmF1bHRzKTtcbiAgfVxuXG4gIGJ1aWxkKHBhcmFtcyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe2NhbWVyYTogbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYU5hdGl2ZShcbiAgICAgIHBhcmFtcy5sZWZ0LFxuICAgICAgcGFyYW1zLnJpZ2h0LFxuICAgICAgcGFyYW1zLnRvcCxcbiAgICAgIHBhcmFtcy5ib3R0b20sXG4gICAgICBwYXJhbXMubmVhcixcbiAgICAgIHBhcmFtcy5mYXJcbiAgICApfSkuY2FtZXJhO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIE9ydGhvZ3JhcGhpY0NhbWVyYVxufTtcbiIsImltcG9ydCB7UGVyc3BlY3RpdmVDYW1lcmEgYXMgUGVyc3BlY3RpdmVDYW1lcmFOYXRpdmV9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7Q2FtZXJhQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL0NhbWVyYUNvbXBvbmVudCc7XG5pbXBvcnQge3N5c3RlbX0gZnJvbSAnLi4vLi4vcG9seWZpbGwnO1xuXG4vKipcbiAqIEBjbGFzcyBQZXJzcGVjdGl2ZUNhbWVyYVxuICogQGRlc2NyaXB0aW9uIENhbWVyYSB3aXRoIHBlcnNwZWN0aXZlIHByb2plY3Rpb24uXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9jYW1lcmFzXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1ldGVycyBvYmplY3QuXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvY2FtZXJhc1xuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuQ2FtZXJhQ29tcG9uZW50XG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGUgYW4gUGVyc3BlY3RpdmVDYW1lcmEgYW5kIHNldCBpdCBhcyBhcHAncyBjYW1lcmE8L2NhcHRpb24+XG4gKiBjb25zdCBjYW1lcmEgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoe1xuICogICBmb3Y6IDc1LFxuICogICBhc3BlY3Q6IHdpbmRvdy5pbm5lcldpZHRoIC8gd2luZG93LmlubmVySGVpZ2h0LFxuICpcbiAqICAgcG9zaXRpb246IHtcbiAqICAgICB4OiAwLFxuICogICAgIHk6IDEwMCxcbiAqICAgICB6OiAwXG4gKiAgIH1cbiAqIH0pO1xuICpcbiAqIGFwcC5jYW1lcmEgPSBjYW1lcmE7XG4gKi9cbmNsYXNzIFBlcnNwZWN0aXZlQ2FtZXJhIGV4dGVuZHMgQ2FtZXJhQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvY2FtZXJhcy5QZXJzcGVjdGl2ZUNhbWVyYSNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBuZWFyOiAxLFxuICAgKiAgIGZhcjogMTAwMCxcbiAgICogICBmb3Y6IDc1LFxuICAgKiAgIGFzcGVjdDogc3lzdGVtLndpbmRvdy5pbm5lcldpZHRoIC8gc3lzdGVtLndpbmRvdy5pbm5lckhlaWdodFxuICAgKiB9PC9wcmU+XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uQ2FtZXJhQ29tcG9uZW50LmRlZmF1bHRzLFxuXG4gICAgbmVhcjogMSxcbiAgICBmYXI6IDEwMDAsXG4gICAgZm92OiA3NSxcbiAgICBhc3BlY3Q6IHN5c3RlbS53aW5kb3cuaW5uZXJXaWR0aCAvIHN5c3RlbS53aW5kb3cuaW5uZXJIZWlnaHRcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHN1cGVyKHBhcmFtcywgUGVyc3BlY3RpdmVDYW1lcmEuZGVmYXVsdHMpO1xuICB9XG5cbiAgYnVpbGQocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7Y2FtZXJhOiBuZXcgUGVyc3BlY3RpdmVDYW1lcmFOYXRpdmUoXG4gICAgICBwYXJhbXMuZm92LFxuICAgICAgcGFyYW1zLmFzcGVjdCxcbiAgICAgIHBhcmFtcy5uZWFyLFxuICAgICAgcGFyYW1zLmZhclxuICAgICl9KS5jYW1lcmE7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgUGVyc3BlY3RpdmVDYW1lcmFcbn07XG4iLCIvKiogQG1vZHVsZSBjb21wb25lbnRzL2NhbWVyYXMgKi9cbmV4cG9ydCAqIGZyb20gJy4vQ3ViZUNhbWVyYSc7XG5leHBvcnQgKiBmcm9tICcuL09ydGhvZ3JhcGhpY0NhbWVyYSc7XG5leHBvcnQgKiBmcm9tICcuL1BlcnNwZWN0aXZlQ2FtZXJhJztcbiIsImltcG9ydCB7XG4gIE1lc2gsXG4gIEJveEJ1ZmZlckdlb21ldHJ5LFxuICBCb3hHZW9tZXRyeVxufSBmcm9tICd0aHJlZSc7XG5cbmltcG9ydCB7TWVzaENvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29yZS9NZXNoQ29tcG9uZW50JztcblxuLyoqXG4gKiBAY2xhc3MgQm94XG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBBcyB0b2xkIG9uIENvbXBvbmVudCBkZWZpbml0aW9uLCB3aGlsZSB5b3UgY2FuIHBhc3MgYW55IG9mIHRoZSBpbmhlcml0ZWQgcGFyYW1zIGZvciB0aGlzIGNvbXBvbmVudCBjb25zdHJ1Y3Rpb24sIHlvdSB3aWxsIG5lZWQgdG9cbiAqIHBhc3Mgc3BlY2lmaWMgcGFyYW1ldGVycyB0byBidWlsZCB0aGlzIG1lc2ggYXMgYSBnZW9tZXRyeSBvYmplY3QuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI0JveEdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBCb3gsIGFuZCBhZGRpbmcgdG8gYXBwPC9jYXB0aW9uPlxuICogIG5ldyBCb3goe1xuICogICAgZ2VvbWV0cnk6IHtcbiAqICAgICAgd2lkdGg6IDIsXG4gKiAgICAgIGhlaWdodDogMixcbiAqICAgICAgZGVwdGg6IDJcbiAqICAgIH0sXG4gKlxuICogICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgIGNvbG9yOiAweGZmZmZmZlxuICogICAgfSksXG4gKlxuICogICAgcG9zaXRpb246IFs1MCwgNjAsIDcwXVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgQm94IGV4dGVuZHMgTWVzaENvbXBvbmVudCB7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkJveCNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgd2lkdGg6IDEsXG4gICAqICAgICBoZWlnaHQ6IDEsXG4gICAqICAgICBkZXB0aDogMSxcbiAgICogICAgIHdpZHRoU2VnbWVudHM6IDEsXG4gICAqICAgICBoZWlnaHRTZWdtZW50czogMSxcbiAgICogICAgIGRlcHRoU2VnbWVudHM6IDFcbiAgICogICB9XG4gICAqIH08L3ByZT5cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50LmRlZmF1bHRzLFxuICAgIGdlb21ldHJ5OiB7XG4gICAgICB3aWR0aDogMSxcbiAgICAgIGhlaWdodDogMSxcbiAgICAgIGRlcHRoOiAxLFxuICAgICAgd2lkdGhTZWdtZW50czogMSxcbiAgICAgIGhlaWdodFNlZ21lbnRzOiAxLFxuICAgICAgZGVwdGhTZWdtZW50czogMVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkJveCNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCBnZW9tZXRyeTogWyd3aWR0aCcsICdoZWlnaHQnLCAnZGVwdGgnLCAnd2lkdGhTZWdtZW50cycsICdoZWlnaHRTZWdtZW50cycsICdkZXB0aFNlZ2VtZW50cyddXG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbJ3dpZHRoJywgJ2hlaWdodCcsICdkZXB0aCcsICd3aWR0aFNlZ21lbnRzJywgJ2hlaWdodFNlZ21lbnRzJywgJ2RlcHRoU2VnZW1lbnRzJ11cbiAgfTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHN1cGVyKHBhcmFtcywgQm94LmRlZmF1bHRzLCBCb3guaW5zdHJ1Y3Rpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuQm94XG4gICAqL1xuICBidWlsZChwYXJhbXMgPSB0aGlzLnBhcmFtcykge1xuICAgIGNvbnN0IHtnZW9tZXRyeSwgbWF0ZXJpYWx9ID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7bWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKX0pLm1lc2g7XG4gIH1cblxuICBidWlsZEdlb21ldHJ5KHBhcmFtcyA9IHt9KSB7XG4gICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgKHBhcmFtcy5idWZmZXIgPyBCb3hCdWZmZXJHZW9tZXRyeSA6IEJveEdlb21ldHJ5KShcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS53aWR0aCxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5oZWlnaHQsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkuZGVwdGgsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkud2lkdGhTZWdtZW50cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5oZWlnaHRTZWdtZW50cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5kZXB0aFNlZ21lbnRzXG4gICAgKTtcblxuICAgIHJldHVybiBnZW9tZXRyeTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBCb3hcbn07XG4iLCJpbXBvcnQge1xuICBNZXNoLFxuICBDaXJjbGVCdWZmZXJHZW9tZXRyeSxcbiAgQ2lyY2xlR2VvbWV0cnlcbn0gZnJvbSAndGhyZWUnO1xuXG5pbXBvcnQge01lc2hDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTWVzaENvbXBvbmVudCc7XG5cbi8qKlxuICogQGNsYXNzIENpcmNsZVxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gQXMgdG9sZCBvbiBDb21wb25lbnQgZGVmaW5pdGlvbiwgd2hpbGUgeW91IGNhbiBwYXNzIGFueSBvZiB0aGUgaW5oZXJpdGVkIHBhcmFtcyBmb3IgdGhpcyBjb21wb25lbnQgY29uc3RydWN0aW9uLCB5b3Ugd2lsbCBuZWVkIHRvXG4gKiBwYXNzIHNwZWNpZmljIHBhcmFtZXRlcnMgdG8gYnVpbGQgdGhpcyBtZXNoIGFzIGEgZ2VvbWV0cnkgb2JqZWN0LlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNDaXJjbGVHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgQ2lyY2xlLCBhbmQgYWRkaW5nIHRvIGFwcDwvY2FwdGlvbj5cbiAqICBuZXcgQ2lyY2xlKHtcbiAqICAgIGdlb21ldHJ5OiB7XG4gKiAgICAgIHJhZGl1czogNCxcbiAqICAgICAgc2VnbWVudHM6IDE2XG4gKiAgICB9LFxuICpcbiAqICAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgIH0pLFxuICpcbiAqICAgIHBvc2l0aW9uOiBbNTAsIDYwLCA3MF1cbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cbmNsYXNzIENpcmNsZSBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5DaXJjbGUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHJhZGl1czogNTAsXG4gICAqICAgICBzZWdtZW50czogOCxcbiAgICogICAgIHRoZXRhU3RhcnQ6IDAsXG4gICAqICAgICB0aGV0YUxlbmd0aDogTWF0aC5QSSAqIDJcbiAgICogICB9XG4gICAqIH08L3ByZT5cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50LmRlZmF1bHRzLFxuXG4gICAgZ2VvbWV0cnk6IHtcbiAgICAgIHJhZGl1czogNTAsXG4gICAgICBzZWdtZW50czogOCxcbiAgICAgIHRoZXRhU3RhcnQ6IDAsXG4gICAgICB0aGV0YUxlbmd0aDogTWF0aC5QSSAqIDJcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5DaXJjbGUjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgZ2VvbWV0cnk6IFsncmFkaXVzJywgJ3NlZ21lbnRzJywgJ3RoZXRhU3RhcnQnLCAndGhldGFMZW5ndGgnXVxuICAgKi9cbiAgc3RhdGljIGluc3RydWN0aW9ucyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50Lmluc3RydWN0aW9ucyxcbiAgICBnZW9tZXRyeTogWydyYWRpdXMnLCAnc2VnbWVudHMnLCAndGhldGFTdGFydCcsICd0aGV0YUxlbmd0aCddXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIENpcmNsZS5kZWZhdWx0cywgQ2lyY2xlLmluc3RydWN0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkNpcmNsZVxuICAgKi9cbiAgYnVpbGQocGFyYW1zID0gdGhpcy5wYXJhbXMpIHtcbiAgICBjb25zdCB7Z2VvbWV0cnksIG1hdGVyaWFsfSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe21lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbCl9KS5tZXNoO1xuICB9XG5cbiAgYnVpbGRHZW9tZXRyeShwYXJhbXMgPSB7fSkge1xuICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IChwYXJhbXMuYnVmZmVyID8gQ2lyY2xlQnVmZmVyR2VvbWV0cnkgOiBDaXJjbGVHZW9tZXRyeSkoXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkucmFkaXVzLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnNlZ21lbnRzLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnRoZXRhU3RhcnQsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkudGhldGFMZW5ndGhcbiAgICApO1xuXG4gICAgcmV0dXJuIGdlb21ldHJ5O1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIENpcmNsZVxufTtcbiIsImltcG9ydCB7XG4gIE1lc2gsXG4gIENvbmVCdWZmZXJHZW9tZXRyeSxcbiAgQ29uZUdlb21ldHJ5XG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBDb25lXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBBIGN5bGluZGVyIGlzIG9uZSBvZiB0aGUgbW9zdCBiYXNpYyBjdXJ2aWxpbmVhciBnZW9tZXRyaWMgc2hhcGVzLCB0aGUgc3VyZmFjZSBmb3JtZWQgYnkgdGhlIHBvaW50cyBhdCBhIGZpeGVkIGRpc3RhbmNlIGZyb20gYSBnaXZlbiBzdHJhaWdodCBsaW5lLCB0aGUgYXhpcyBvZiB0aGUgY3lsaW5kZXIuIDxici8+PGJyLz5cbiAqIFRoZSBzb2xpZCBlbmNsb3NlZCBieSB0aGlzIHN1cmZhY2UgYW5kIGJ5IHR3byBwbGFuZXMgcGVycGVuZGljdWxhciB0byB0aGUgYXhpcyBpcyBhbHNvIGNhbGxlZCBhIGN5bGluZGVyLjxici8+XG4gKiBUaGUgc3VyZmFjZSBhcmVhIGFuZCB0aGUgdm9sdW1lIG9mIGEgY3lsaW5kZXIgaGF2ZSBiZWVuIGtub3duIHNpbmNlIGRlZXAgYW50aXF1aXR5LlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNDb25lR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIENvbmUsIGFuZCBhZGRpbmcgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IENvbmUoe1xuICogICBnZW9tZXRyeToge1xuICogICAgIHJhZGl1c1RvcDogMixcbiAqICAgICByYWRpdXNCb3R0b206IDQsXG4gKiAgICAgaGVpZ2h0OiA1XG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSksXG4gKlxuICogICBwb3M6IFswLCAxMDAsIDBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBDb25lIGV4dGVuZHMgTWVzaENvbXBvbmVudCB7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkNvbmUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHJhZGl1czogMjAsXG4gICAqICAgICBoZWlnaHQ6IDEwMCxcbiAgICogICAgIHJhZGl1c1NlZ21lbnRzOiAzMixcbiAgICogICAgIGhlaWdodFNlZ21lbnRzOiAxLFxuICAgKiAgICAgb3BlbkVuZGVkOiBmYWxzZSxcbiAgICogICAgIHRoZXRhU3RhcnQ6IDAsXG4gICAqICAgICB0aGV0YUxlbmd0aDogTWF0aC5QSSAqIDJcbiAgICogICB9XG4gICAqIH08L3ByZT5cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50LmRlZmF1bHRzLFxuXG4gICAgZ2VvbWV0cnk6IHtcbiAgICAgIHJhZGl1czogMjAsXG4gICAgICBoZWlnaHQ6IDEwMCxcbiAgICAgIHJhZGl1c1NlZ21lbnRzOiAzMixcbiAgICAgIGhlaWdodFNlZ21lbnRzOiAxLFxuICAgICAgb3BlbkVuZGVkOiBmYWxzZSxcbiAgICAgIHRoZXRhU3RhcnQ6IDAsXG4gICAgICB0aGV0YUxlbmd0aDogTWF0aC5QSSAqIDJcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Db25lI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIGdlb21ldHJ5OiBbXG4gICAqICAgJ3JhZGl1cycsXG4gICAqICAgJ2hlaWdodCcsXG4gICAqICAgJ3JhZGl1c1NlZ21lbnRzJyxcbiAgICogICAnaGVpZ2h0U2VnbWVudHMnLFxuICAgKiAgICdvcGVuRW5kZWQnLFxuICAgKiAgICd0aGV0YVN0YXJ0JyxcbiAgICogICAndGhldGFMZW5ndGgnXG4gICAqIF1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbXG4gICAgICAncmFkaXVzJyxcbiAgICAgICdoZWlnaHQnLFxuICAgICAgJ3JhZGl1c1NlZ21lbnRzJyxcbiAgICAgICdoZWlnaHRTZWdtZW50cycsXG4gICAgICAnb3BlbkVuZGVkJyxcbiAgICAgICd0aGV0YVN0YXJ0JyxcbiAgICAgICd0aGV0YUxlbmd0aCdcbiAgICBdXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIENvbmUuZGVmYXVsdHMsIENvbmUuaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIHRoaXMuYnVpbGQocGFyYW1zKTtcbiAgICAgIHN1cGVyLndyYXAoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkNvbmVcbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICBjb25zdCBnZW9tZXRyeSA9IG5ldyAocGFyYW1zLmJ1ZmZlciA/IENvbmVCdWZmZXJHZW9tZXRyeSA6IENvbmVHZW9tZXRyeSkoXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkucmFkaXVzLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LmhlaWdodCxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5yYWRpdXNTZWdtZW50cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5oZWlnaHRTZWdtZW50cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5vcGVuRW5kZWQsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkudGhldGFTdGFydCxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS50aGV0YUxlbmd0aFxuICAgICk7XG5cbiAgICByZXR1cm4gZ2VvbWV0cnk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgQ29uZVxufTtcbiIsImltcG9ydCB7XG4gIE1lc2gsXG4gIEN5bGluZGVyQnVmZmVyR2VvbWV0cnksXG4gIEN5bGluZGVyR2VvbWV0cnlcbn0gZnJvbSAndGhyZWUnO1xuXG5pbXBvcnQge01lc2hDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTWVzaENvbXBvbmVudCc7XG5cbi8qKlxuICogQGNsYXNzIEN5bGluZGVyXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBBIGN5bGluZGVyIGlzIG9uZSBvZiB0aGUgbW9zdCBiYXNpYyBjdXJ2aWxpbmVhciBnZW9tZXRyaWMgc2hhcGVzLCB0aGUgc3VyZmFjZSBmb3JtZWQgYnkgdGhlIHBvaW50cyBhdCBhIGZpeGVkIGRpc3RhbmNlIGZyb20gYSBnaXZlbiBzdHJhaWdodCBsaW5lLCB0aGUgYXhpcyBvZiB0aGUgY3lsaW5kZXIuIDxici8+PGJyLz5cbiAqIFRoZSBzb2xpZCBlbmNsb3NlZCBieSB0aGlzIHN1cmZhY2UgYW5kIGJ5IHR3byBwbGFuZXMgcGVycGVuZGljdWxhciB0byB0aGUgYXhpcyBpcyBhbHNvIGNhbGxlZCBhIGN5bGluZGVyLjxici8+XG4gKiBUaGUgc3VyZmFjZSBhcmVhIGFuZCB0aGUgdm9sdW1lIG9mIGEgY3lsaW5kZXIgaGF2ZSBiZWVuIGtub3duIHNpbmNlIGRlZXAgYW50aXF1aXR5LlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNDeWxpbmRlckdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBDeWxpbmRlciwgYW5kIGFkZGluZyB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgQ3lsaW5kZXIoe1xuICogICBnZW9tZXRyeToge1xuICogICAgIHJhZGl1c1RvcDogMixcbiAqICAgICByYWRpdXNCb3R0b206IDQsXG4gKiAgICAgaGVpZ2h0OiA1XG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSksXG4gKlxuICogICBwb3M6IFswLCAxMDAsIDBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBDeWxpbmRlciBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5DeWxpbmRlciNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgcmFkaXVzVG9wOiAyMCxcbiAgICogICAgIHJhZGl1c0JvdHRvbTogMjAsXG4gICAqICAgICBoZWlnaHQ6IDEwMCxcbiAgICogICAgIHJhZGl1c1NlZ21lbnRzOiAzMixcbiAgICogICAgIGhlaWdodFNlZ21lbnRzOiAxLFxuICAgKiAgICAgb3BlbkVuZGVkOiBmYWxzZSxcbiAgICogICAgIHRoZXRhU3RhcnQ6IDAsXG4gICAqICAgICB0aGV0YUxlbmd0aDogTWF0aC5QSSAqIDJcbiAgICogICB9XG4gICAqIH08L3ByZT5cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50LmRlZmF1bHRzLFxuICAgIGdlb21ldHJ5OiB7XG4gICAgICByYWRpdXNUb3A6IDAsXG4gICAgICByYWRpdXNCb3R0b206IDEsXG4gICAgICBoZWlnaHQ6IDEsXG4gICAgICByYWRpdXNTZWdtZW50czogMzIsXG4gICAgICBoZWlnaHRTZWdtZW50czogMSxcbiAgICAgIG9wZW5FbmRlZDogZmFsc2UsXG4gICAgICB0aGV0YVN0YXJ0OiAwLFxuICAgICAgdGhldGFMZW5ndGg6IE1hdGguUEkgKiAyXG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuQ3lsaW5kZXIjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICogZ2VvbWV0cnk6IFtcbiAgICogICAncmFkaXVzVG9wJyxcbiAgICogICAncmFkaXVzQm90dG9tJyxcbiAgICogICAnaGVpZ2h0JyxcbiAgICogICAncmFkaXVzU2VnbWVudHMnLFxuICAgKiAgICdoZWlnaHRTZWdtZW50cycsXG4gICAqICAgJ29wZW5FbmRlZCcsXG4gICAqICAgJ3RoZXRhU3RhcnQnLFxuICAgKiAgICd0aGV0YUxlbmd0aCdcbiAgICogXVxuICAgKiA8L3ByZT5cbiAgICovXG4gIHN0YXRpYyBpbnN0cnVjdGlvbnMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMsXG4gICAgZ2VvbWV0cnk6IFtcbiAgICAgICdyYWRpdXNUb3AnLFxuICAgICAgJ3JhZGl1c0JvdHRvbScsXG4gICAgICAnaGVpZ2h0JyxcbiAgICAgICdyYWRpdXNTZWdtZW50cycsXG4gICAgICAnaGVpZ2h0U2VnbWVudHMnLFxuICAgICAgJ29wZW5FbmRlZCcsXG4gICAgICAndGhldGFTdGFydCcsXG4gICAgICAndGhldGFMZW5ndGgnXG4gICAgXVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHBhcmFtcyA9IHt9KSB7XG4gICAgc3VwZXIocGFyYW1zLCBDeWxpbmRlci5kZWZhdWx0cywgQ3lsaW5kZXIuaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIHRoaXMuYnVpbGQocGFyYW1zKTtcbiAgICAgIHN1cGVyLndyYXAoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkN5bGluZGVyXG4gICAqL1xuICBidWlsZChwYXJhbXMgPSB0aGlzLnBhcmFtcykge1xuICAgIGNvbnN0IHtnZW9tZXRyeSwgbWF0ZXJpYWx9ID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7bWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKX0pLm1lc2g7XG4gIH1cblxuICBidWlsZEdlb21ldHJ5KHBhcmFtcyA9IHt9KSB7XG4gICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgKHBhcmFtcy5idWZmZXIgPyBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5IDogQ3lsaW5kZXJHZW9tZXRyeSkoXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkucmFkaXVzVG9wLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnJhZGl1c0JvdHRvbSxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5oZWlnaHQsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkucmFkaXVzU2VnbWVudHMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkuaGVpZ2h0U2VnbWVudHMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkub3BlbkVuZGVkLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnRoZXRhU3RhcnQsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkudGhldGFMZW5ndGhcbiAgICApO1xuXG4gICAgcmV0dXJuIGdlb21ldHJ5O1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIEN5bGluZGVyXG59O1xuIiwiaW1wb3J0IHtcbiAgTWVzaCxcbiAgRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnksXG4gIERvZGVjYWhlZHJvbkdlb21ldHJ5XG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBEb2RlY2FoZWRyb25cbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIEluIGdlb21ldHJ5LCBhIGRvZGVjYWhlZHJvbiBpcyBhbnkgcG9seWhlZHJvbiB3aXRoIHR3ZWx2ZSBmbGF0IGZhY2VzLiA8YnIvPjxici8+XG4gKiBUaGUgbW9zdCBmYW1pbGlhciBkb2RlY2FoZWRyb24gaXMgdGhlIHJlZ3VsYXIgZG9kZWNhaGVkcm9uLCB3aGljaCBpcyBhIFBsYXRvbmljIHNvbGlkLiA8YnIvPlxuICogVGhlcmUgYXJlIGFsc28gdGhyZWUgcmVndWxhciBzdGFyIGRvZGVjYWhlZHJhLCB3aGljaCBhcmUgY29uc3RydWN0ZWQgYXMgc3RlbGxhdGlvbnMgb2YgdGhlIGNvbnZleCBmb3JtLiA8YnIvPlxuICogQWxsIG9mIHRoZXNlIGhhdmUgaWNvc2FoZWRyYWwgc3ltbWV0cnksIG9yZGVyIDEyMC5cbiAqIERvZGVjYWhlZHJvbiBjcmVhdGVzIERvZGVjYWhlZHJvbiBvYmplY3QgYnkgaXQncyByYWRpdXMgYW5kIGRldGFpbC5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjRG9kZWNhaGVkcm9uR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIERvZGVjYWhlZHJvbiwgYW5kIGFkZGluZyB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgRG9kZWNhaGVkcm9uKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICByYWRpdXM6IDJcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiB7XG4gKiAgICAgeTogMTBcbiAqICAgfVxuICAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cbmNsYXNzIERvZGVjYWhlZHJvbiBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuRG9kZWNhaGVkcm9uI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICogZ2VvbWV0cnk6IHtcbiAgICogICByYWRpdXM6IDEsXG4gICAqICAgZGV0YWlsOiAwXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5kZWZhdWx0cyxcbiAgICBnZW9tZXRyeToge1xuICAgICAgcmFkaXVzOiAxLFxuICAgICAgZGV0YWlsOiAwXG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuRG9kZWNhaGVkcm9uI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIGdlb21ldHJ5OiBbJ3JhZGl1cycsICdkZXRhaWwnXVxuICAgKiA8L3ByZT5cbiAgICovXG4gIHN0YXRpYyBpbnN0cnVjdGlvbnMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMsXG4gICAgZ2VvbWV0cnk6IFsncmFkaXVzJywgJ2RldGFpbCddXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIERvZGVjYWhlZHJvbi5kZWZhdWx0cywgRG9kZWNhaGVkcm9uLmluc3RydWN0aW9ucyk7XG5cbiAgICBpZiAocGFyYW1zLmJ1aWxkKSB7XG4gICAgICB0aGlzLmJ1aWxkKHBhcmFtcyk7XG4gICAgICBzdXBlci53cmFwKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Eb2RlY2FoZWRyb25cbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnkgOiBEb2RlY2FoZWRyb25HZW9tZXRyeSkoXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkucmFkaXVzLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LmRldGFpbFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgRG9kZWNhaGVkcm9uXG59O1xuIiwiaW1wb3J0IHtcbiAgTWVzaCxcbiAgQnVmZmVyR2VvbWV0cnksXG4gIEV4dHJ1ZGVHZW9tZXRyeVxufSBmcm9tICd0aHJlZSc7XG5cbmltcG9ydCB7TWVzaENvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29yZS9NZXNoQ29tcG9uZW50JztcblxuLyoqXG4gKiBAY2xhc3MgRXh0cnVkZVxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gRXh0cnVkZSBnZW9tZXRyeSBtZWFucyB0aGF0IHlvdSBjYW4gY3JlYXRlIGEgM0QgbWVzaCBmcm9tIGFueSAyRCBzaGFwZSB1c2luZyB0aHJlZS5qcyBnZW9tZXRyeSBiYXNlZCBvbiA8YSBocmVmPSdodHRwczovL3RocmVlanMub3JnL2RvY3MvI2FwaS9tYXRoL1ZlY3RvcjInPlRIUkVFLlZlY3RvcjIuPC9hPiA8YnIvPlxuICogU3VjaCBpbXBsZW1lbnRhdGlvbiB3aWxsIGhlbHAgeW91IHRvIG1ha2Ugdm9sdW1lZCBzaGFwZXMgdGhhdCBoYXZlIHRoZWlyIG93biBkZXB0aCBhbmQgY2FuIGJlIHNlZW4gZnJvbSBhbGwgYW5nZWxzLjxici8+PGJyLz5cbiAqIFlvdSBjYW4gYWxzbyBmaW5kIHNvbWUgaW50ZXJlc3RpbmcgZXhhbXBsZXMgbWFkZSB1c2luZyA8YSBocmVmPSd0aHJlZWpzLm9yZyc+dGhyZWUuanM8L2E+IHdoaWNoIGlzIGEgY29yZSBvZiB3aHMuanMsIHN1Y2ggYXM6XG4gKiAtIDxhIGhyZWY9J2h0dHA6Ly90aHJlZWpzLm9yZy9leGFtcGxlcy93ZWJnbF9nZW9tZXRyeV9leHRydWRlX3NoYXBlcy5odG1sJz5XZWJnbCBnZW9tZXRyeSBleHRydWRlPC9hPlxuICogLSA8YSBocmVmPSdodHRwOi8vdGhyZWVqcy5vcmcvZXhhbXBsZXMvd2ViZ2xfZ2VvbWV0cnlfZXh0cnVkZV9zaGFwZXMyLmh0bWwnPkV4dHJ1ZGUgc2hhcGVzIGZyb20gZ2VvZGF0YTwvYT5cbiAqIC0gPGEgaHJlZj0naHR0cDovL3RocmVlanMub3JnL2V4YW1wbGVzL3dlYmdsX2dlb21ldHJ5X2V4dHJ1ZGVfc3BsaW5lcy5odG1sJz5FeHRydWRlIHNwbGluZXM8L2E+XG4gKlxuICogU3VjaCBleGFtcGxlcyBjYW4gYmUgZWFzaWx5IGltcGxlbWVudGVkIHVzaW5nIHdoaXRlc3Rvcm0uanMgb3IgaXQncyBwbHVnaW5zLiBVc2UgYEV4dHJ1ZGVgIGNsYXNzIHdpdGggPGEgaHJlZj0naHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzLyNhcGkvZXh0cmFzL2NvcmUvU2hhcGUnPlRIUkVFLlNoYXBlPC9hPiB0byBnZXQgZXh0cnVkZSBlZmZlY3Qgb2Ygc2hhcGUgZGVmaW5lZCBieSAyRCB2ZWN0b3JzLlxuICogVGhpcyBjbGFzcyBpcyBzaW1pbGFyIHRvIDxhIGhyZWY9J2h0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy8jYXBpL2dlb21ldHJpZXMvRXh0cnVkZUdlb21ldHJ5Jz5USFJFRS5FeHRydWRlR2VvbWV0cnk8L2E+LFxuICogYnV0IGl0IGFsc28gY29udGFpbnMgYWxsIHByb3BlcnRpZXMsIGFwcGxpZWQgYnkgYFNoYXBlYCwgc3VjaCBhcyBtYXRlcmlhbCwgbWFzcyBhbmQgdmVjdG9ycyBsaWtlIHBvc2l0aW9uIChwb3MpIGFuZCByb3RhdGlvbiAocm90KS5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjRXh0cnVkZUdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBzaGFwZSwgdGhlbiBhbiBFeHRydWRlIGZyb20gaXQ8L2NhcHRpb24+XG4gKiBjb25zdCBzaGFwZSA9IG5ldyBUSFJFRS5TaGFwZShbXG4gKiAgIG5ldyBUSFJFRS5WZWN0b3IyKC00LC00KSxcbiAqICAgbmV3IFRIUkVFLlZlY3RvcjIoLTIsMCksXG4gKiAgIG5ldyBUSFJFRS5WZWN0b3IyKC00LDQpLFxuICogICBuZXcgVEhSRUUuVmVjdG9yMigwLDIpLFxuICogICBuZXcgVEhSRUUuVmVjdG9yMig0LDQpLFxuICogICBuZXcgVEhSRUUuVmVjdG9yMigyLDApLFxuICogICBuZXcgVEhSRUUuVmVjdG9yMig0LC00KSxcbiAqICAgbmV3IFRIUkVFLlZlY3RvcjIoMCwtMilcbiAqIF0pO1xuICpcbiAqIGNvbnN0IGV4dHJ1ZGUgPSBuZXcgRXh0cnVkZSh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgc2hhcGVzOiBzaGFwZSxcbiAqICAgICBvcHRpb25zOiB7XG4gKiAgICAgICBiZXZlbEVuYWJsZWQ6IGZhbHNlLFxuICogICAgICAgYmV2ZWxTaXplOiAwLFxuICogICAgICAgYW1vdW50OiAyXG4gKiAgICAgfVxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zaXRpb246IFswLCAxMDAsIDBdXG4gKiB9KTtcbiAqXG4gKiBleHRydWRlLmFkZFRvKGFwcCk7XG4gKi9cbmNsYXNzIEV4dHJ1ZGUgZXh0ZW5kcyBNZXNoQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkV4dHJ1ZGUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHNoYXBlczogW10sXG4gICAqICAgICBvcHRpb25zOiB7fVxuICAgKiAgIH1cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50LmRlZmF1bHRzLFxuICAgIGdlb21ldHJ5OiB7XG4gICAgICBzaGFwZXM6IFtdLFxuICAgICAgb3B0aW9uczoge31cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5FeHRydWRlI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeTogWydzaGFwZXMnLCAnb3B0aW9ucyddXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbJ3NoYXBlcycsICdvcHRpb25zJ11cbiAgfTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHN1cGVyKHBhcmFtcywgRXh0cnVkZS5kZWZhdWx0cywgRXh0cnVkZS5pbnN0cnVjdGlvbnMpO1xuXG4gICAgaWYgKHBhcmFtcy5idWlsZCkge1xuICAgICAgdGhpcy5idWlsZChwYXJhbXMpO1xuICAgICAgc3VwZXIud3JhcCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuRXh0cnVkZVxuICAgKi9cbiAgYnVpbGQocGFyYW1zID0gdGhpcy5wYXJhbXMpIHtcbiAgICBjb25zdCB7Z2VvbWV0cnksIG1hdGVyaWFsfSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe21lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbCl9KS5tZXNoO1xuICB9XG5cbiAgYnVpbGRHZW9tZXRyeShwYXJhbXMgPSB7fSkge1xuICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IEV4dHJ1ZGVHZW9tZXRyeShcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5zaGFwZXMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkub3B0aW9uc1xuICAgICk7XG5cbiAgICByZXR1cm4gcGFyYW1zLmJ1ZmZlciA/IG5ldyBCdWZmZXJHZW9tZXRyeSgpLmZyb21HZW9tZXRyeShnZW9tZXRyeSkgOiBnZW9tZXRyeTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBFeHRydWRlXG59O1xuIiwiaW1wb3J0IHtcbiAgTWVzaCxcbiAgSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSxcbiAgSWNvc2FoZWRyb25HZW9tZXRyeVxufSBmcm9tICd0aHJlZSc7XG5cbmltcG9ydCB7TWVzaENvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29yZS9NZXNoQ29tcG9uZW50JztcblxuLyoqXG4gKiBAY2xhc3MgSWNvc2FoZWRyb25cbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIEluIGdlb21ldHJ5LCBhbiBpY29zYWhlZHJvbiBpcyBhIHBvbHloZWRyb24gd2l0aCAyMCBmYWNlcy48YnIvPlxuICogVGhlcmUgYXJlIG1hbnkga2luZHMgb2YgaWNvc2FoZWRyYSwgd2l0aCBzb21lIGJlaW5nIG1vcmUgc3ltbWV0cmljYWwgdGhhbiBvdGhlcnMuIFRoZSBtb3N0IHdlbGwga25vd24gaXMgdGhlIFBsYXRvbmljLCBjb252ZXggcmVndWxhciBpY29zYWhlZHJvbi48YnIvPlxuICogYEljb3NhaGVkcm9uYCBjcmVhdGVzIGFuIEljb3NhaGVkcm9uIG9iamVjdCBieSBpdHMgcmFkaXVzIGFuZCBkZXRhaWwuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI0ljb3NhaGVkcm9uR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIEljb3NhaGVkcm9uLCBhbmQgYWRkaW5nIHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBJY29zYWhlZHJvbih7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgcmFkaXVzOiAyLFxuICogICAgIGRldGFpbDogMVxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zaXRpb246IFswLCAxMDAsIDBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBJY29zYWhlZHJvbiBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuSWNvc2FoZWRyb24jZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHJhZGl1czogMSxcbiAgICogICAgIGRldGFpbDogMFxuICAgKiAgIH1cbiAgICogfTwvcHJlPlxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuZGVmYXVsdHMsXG4gICAgZ2VvbWV0cnk6IHtcbiAgICAgIHJhZGl1czogMSxcbiAgICAgIGRldGFpbDogMFxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkljb3NhaGVkcm9uI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IHtnZW9tZXRyeTogWydyYWRpdXMnLCAnZGV0YWlsJ119XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbJ3JhZGl1cycsICdkZXRhaWwnXVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHBhcmFtcyA9IHt9KSB7XG4gICAgc3VwZXIocGFyYW1zLCBJY29zYWhlZHJvbi5kZWZhdWx0cywgSWNvc2FoZWRyb24uaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIHRoaXMuYnVpbGQocGFyYW1zKTtcbiAgICAgIHN1cGVyLndyYXAoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkljb3NhaGVkcm9uXG4gICAqL1xuICBidWlsZChwYXJhbXMgPSB0aGlzLnBhcmFtcykge1xuICAgIGNvbnN0IHtnZW9tZXRyeSwgbWF0ZXJpYWx9ID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7bWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKX0pLm1lc2g7XG4gIH1cblxuICBidWlsZEdlb21ldHJ5KHBhcmFtcyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyAocGFyYW1zLmJ1ZmZlciA/IEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkgOiBJY29zYWhlZHJvbkdlb21ldHJ5KShcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5yYWRpdXMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkuZGV0YWlsXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBJY29zYWhlZHJvblxufTtcbiIsImltcG9ydCB7XG4gIE1lc2gsXG4gIExhdGhlQnVmZmVyR2VvbWV0cnksXG4gIExhdGhlR2VvbWV0cnlcbn0gZnJvbSAndGhyZWUnO1xuXG5pbXBvcnQge01lc2hDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTWVzaENvbXBvbmVudCc7XG5cbi8qKlxuICogQGNsYXNzIExhdGhlXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBBIGBMYXRoZUdlb21ldHJ5YCBhbGxvd3MgeW91IHRvIGNyZWF0ZSBzaGFwZXMgZnJvbSBhIHNtb290aCBjdXJ2ZS5cbiAqIFRoaXMgY3VydmUgaXMgZGVmaW5lZCBieSBhIG51bWJlciBvZiBwb2ludHMgKGFsc28gY2FsbGVkIGtub3RzKSBhbmQgaXMgbW9zdCBvZnRlbiBjYWxsZWQgYSBzcGxpbmUuIFRoaXMgc3BsaW5lIGlzIHJvdGF0ZWQgYXJvdW5kIGEgZml4ZWQgcG9pbnQgYW5kIHJlc3VsdHMgaW4gdmFzZS0gYW5kIGJlbGwtbGlrZSBzaGFwZXMuPGJyLz48YnIvPlxuICogSW4gM0QgY29tcHV0ZXIgZ3JhcGhpY3MsIGEgbGF0aGVkIG9iamVjdCBpcyBhIDNEIG1vZGVsIHdob3NlIHZlcnRleCBnZW9tZXRyeSBpcyBwcm9kdWNlZCBieSByb3RhdGluZyB0aGUgcG9pbnRzIG9mIGEgc3BsaW5lIG9yIG90aGVyIHBvaW50IHNldCBhcm91bmQgYSBmaXhlZCBheGlzLlxuICogVGhlIGxhdGhpbmcgbWF5IGJlIHBhcnRpYWw7IHRoZSBhbW91bnQgb2Ygcm90YXRpb24gaXMgbm90IG5lY2Vzc2FyaWx5IGEgZnVsbCAzNjAgZGVncmVlcy5cbiAqIFRoZSBwb2ludCBzZXQgcHJvdmlkaW5nIHRoZSBpbml0aWFsIHNvdXJjZSBkYXRhIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGEgY3Jvc3Mgc2VjdGlvbiB0aHJvdWdoIHRoZSBvYmplY3QgYWxvbmcgYSBwbGFuZSBjb250YWluaW5nIGl0cyBheGlzIG9mIHJhZGlhbCBzeW1tZXRyeS4gPGJyLz48YnIvPlxuICogVGhlIDxhIGhyZWY9J2h0dHA6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjTGF0aGVHZW9tZXRyeSc+Zm9sbG93aW5nIGV4YW1wbGU8L2E+IHNob3dzIGEgZ2VvbWV0cnkgd2hpY2ggY2FuIGJlIGdlbmVyYXRlZCB1c2luZyBgTGF0aGVgIGNsYXNzLlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNMYXRoZUdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBMYXRoLCBhbmQgYWRkaW5nIHRvIGFwcDwvY2FwdGlvbj5cbiAqIGNvbnN0IHBvaW50cyA9IFtdO1xuICpcbiAqIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICogICBwb2ludHMucHVzaChcbiAqICAgICBuZXcgVEhSRUUuVmVjdG9yMihcbiAqICAgICAgIChNYXRoLnNpbihpICogMC43KSAqIDE1ICsgNTApIC8gMTAsXG4gKiAgICAgICAoaSAtIDUpICogMC4yXG4gKiAgICAgKVxuICogICApO1xuICogfVxuICpcbiAqIGNvbnN0IGxhdGhlID0gbmV3IExhdGhlKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICBwb2ludHM6IHBvaW50c1xuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zaXRpb246IFswLCA1MCwgMTBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBMYXRoZSBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuTGF0aGUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHBvaW50czogW11cbiAgICogICB9XG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5kZWZhdWx0cyxcbiAgICBnZW9tZXRyeToge1xuICAgICAgcG9pbnRzOiBbXVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkxhdGhlI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+e1xuICAgKiAgIGdlb21ldHJ5OiBbJ3BvaW50cyddXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbJ3BvaW50cyddXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIExhdGhlLmRlZmF1bHRzLCBMYXRoZS5pbnN0cnVjdGlvbnMpO1xuXG4gICAgaWYgKHBhcmFtcy5idWlsZCkge1xuICAgICAgdGhpcy5idWlsZChwYXJhbXMpO1xuICAgICAgc3VwZXIud3JhcCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuTGF0aGVcbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gTGF0aGVCdWZmZXJHZW9tZXRyeSA6IExhdGhlR2VvbWV0cnkpKFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnBvaW50c1xuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgTGF0aGVcbn07XG4iLCJpbXBvcnQge1xuICBMaW5lIGFzIExpbmVOYXRpdmUsXG4gIEJ1ZmZlckdlb21ldHJ5LFxuICBHZW9tZXRyeSxcbiAgQnVmZmVyQXR0cmlidXRlLFxuICBMaW5lQ3VydmUzLFxuICBWZWN0b3IzXG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBMaW5lXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBMaW5lIGNvbXBvbmVudCBpcyBnZW5lcmF0ZWQgZnJvbSBhIGN1cnZlL2xpbmUgYW5kIGFtb3VudCBvZiB2ZWN0b3JzIHRoYXQgc2hvdWxkIGJlIHVzZWQgKHBvaW50cykuXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBMaW5lLCBhbmQgYWRkaW5nIHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBMaW5lKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICBjdXJ2ZTogbmV3IFRIUkVFLkxpbmVDdXJ2ZTMobmV3IFRIUkVFLlZlY3RvcjMoMTAsIDEwLCAwKSwgbmV3IFRIUkVFLlZlY3RvcjMoMTAsIDMwLCAwKSlcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgTGluZSBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuTGluZSNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBjdXJ2ZTogbmV3IExpbmVDdXJ2ZTMobmV3IFZlY3RvcjMoMCwgMCwgMCksIG5ldyBWZWN0b3IzKDEwLCAwLCAwKSksXG4gICAqICAgcG9pbnRzOiA1MFxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuZGVmYXVsdHMsXG5cbiAgICBjdXJ2ZTogbnVsbCxcbiAgICBwb2ludHM6IDUwXG4gIH07XG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5MaW5lI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+e1xuICAgKiAgIGdlb21ldHJ5OiBbJ2N1cnZlJywgJ3BvaW50cyddXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbJ2N1cnZlJywgJ3BvaW50cyddXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgc3VwZXIocGFyYW1zLCBMaW5lLmRlZmF1bHRzLCBMaW5lLmluc3RydWN0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkxpbmVcbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTGluZU5hdGl2ZShnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICBjb25zdCBnZW9tZXRyeSA9IHBhcmFtcy5idWZmZXIgPyBuZXcgQnVmZmVyR2VvbWV0cnkoKSA6IG5ldyBHZW9tZXRyeSgpO1xuXG4gICAgaWYgKHBhcmFtcy5idWZmZXIpIHtcbiAgICAgIGNvbnN0IHBwID0gcGFyYW1zLmN1cnZlLmdldFBvaW50cyhwYXJhbXMucG9pbnRzKTtcbiAgICAgIGNvbnN0IHZlcnRzID0gbmV3IEZsb2F0MzJBcnJheShwcC5sZW5ndGggKiAzKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDAsIG1heCA9IHBwLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGkzID0gaSAqIDM7XG5cbiAgICAgICAgdmVydHNbaTNdID0gcHBbaV0ueDtcbiAgICAgICAgdmVydHNbaTMgKyAxXSA9IHBwW2ldLnk7XG4gICAgICAgIHZlcnRzW2kzICsgMl0gPSBwcFtpXS56O1xuICAgICAgfVxuXG4gICAgICBnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSh2ZXJ0cywgMykpO1xuICAgIH0gZWxzZSBnZW9tZXRyeS52ZXJ0aWNlcyA9IHBhcmFtcy5jdXJ2ZS5nZXRQb2ludHMocGFyYW1zLnBvaW50cyk7XG5cbiAgICByZXR1cm4gZ2VvbWV0cnk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgTGluZVxufTtcbiIsImltcG9ydCB7XG4gIE1lc2gsXG4gIEpTT05Mb2FkZXIsXG4gIFNraW5uZWRNZXNoXG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBJbXBvcnRlclxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gSW1wb3J0ZXIgaXMgYSBsb2FkZXIgZm9yIG1lc2hlcyBhbmQgYW55IG90aGVyIGRhdGEgdG8geW91ciBzY2VuZVxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgSW1wb3J0ZXIsIGFuZCBhZGRpbmcgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IEltcG9ydGVyKHtcbiAqICAgbG9hZGVyOiBuZXcgVEhSRUUuT0JKTG9hZGVyKCksXG4gKlxuICogICBwYXJzZXIoZ2VvbWV0cnksIG1hdGVyaWFsKSB7IC8vIGRhdGEgZnJvbSBsb2FkZXJcbiAqICAgICByZXR1cm4gbmV3IFRIUkVFLk1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKTsgLy8gc2hvdWxkIHJldHVybiB5b3VyIC5uYXRpdmUgKG1lc2ggaW4gdGhpcyBjYXNlKVxuICogICB9LFxuICpcbiAqICAgcG9zaXRpb246IFswLCAxMDAsIDBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBJbXBvcnRlciBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5JbXBvcnRlciNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICB1cmw6ICcnLFxuICAgKiAgIGxvYWRlcjogbmV3IEpTT05Mb2FkZXIoKSxcbiAgICpcbiAgICogICBvbkxvYWQoKSB7fSxcbiAgICogICBvblByb2dyZXNzKCkge30sXG4gICAqICAgb25FcnJvcigpIHt9LFxuICAgKlxuICAgKiAgIHRleHR1cmVQYXRoOiBudWxsLFxuICAgKiAgIHVzZUN1c3RvbU1hdGVyaWFsOiBmYWxzZSxcbiAgICpcbiAgICogICBwYXJzZXIoZ2VvbWV0cnksIG1hdGVyaWFscykge1xuICAgKiAgICAgcmV0dXJuIG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbHMpO1xuICAgKiAgIH1cbiAgICogfTwvcHJlPlxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuZGVmYXVsdHMsXG5cbiAgICB1cmw6ICcnLFxuICAgIGxvYWRlcjogbmV3IEpTT05Mb2FkZXIoKSxcblxuICAgIG9uTG9hZCgpIHt9LFxuICAgIG9uUHJvZ3Jlc3MoKSB7fSxcbiAgICAvLyBUT0RPIGFkZCBvbkNvbXBsZXRlP1xuICAgIG9uRXJyb3IoKSB7fSxcblxuICAgIHRleHR1cmVQYXRoOiBudWxsLFxuICAgIHVzZUN1c3RvbU1hdGVyaWFsOiBmYWxzZSxcblxuICAgIHBhcnNlcihnZW9tZXRyeSwgbWF0ZXJpYWwpIHtcbiAgICAgIGNvbnN0IHtnZW9tZXRyeTogZ2VvbSwgbWF0ZXJpYWw6IG1hdH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtnZW9tZXRyeSwgbWF0ZXJpYWx9KTtcblxuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBtZXNoOiBnZW9tLmJvbmVzID8gbmV3IFNraW5uZWRNZXNoKGdlb20sIG1hdCkgOiBuZXcgTWVzaChnZW9tLCBtYXQpXG4gICAgICB9KS5tZXNoO1xuICAgIH1cbiAgfTtcblxuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zXG4gIH07XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgZmlsdGVyXG4gICAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IHZhbHVlcyBmb3IgZmlsdGVyXG4gICAqIEBzdGF0aWNcbiAgICogQHBhcmFtIHtUSFJFRS5NZXNofSBvYmplY3QgSW5zdGFuY2UgZm9yIGl0ZXJhdGluZyB0aHJvdWdoIGl0J3MgY2hpbGRyZW4uXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZpbHRlciBGdW5jdGlvbiB3aXRoIGNoaWxkIGFzIGFyZ3VtZW50LCBzaG91bGQgcmV0dXJuIGEgYm9vbGVhbiB3aGV0aGVyIGluY2x1ZGUgdGhlIGNoaWxkIG9yIG5vdC5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gb2JqZWN0IHdpdGggY2hpbGRyZW5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5JbXBvcnRlclxuICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5SZW1vdmluZyB1bm5lY2Vzc2FyeSBsaWdodHMgZnJvbSBjaGlsZHJlbjwvY2FwdGlvbj5cbiAgICogbmV3IEltcG9ydGVyKHtcbiAgICogICBsb2FkZXI6IG5ldyBUSFJFRS5PQkpMb2FkZXIoKSxcbiAgICpcbiAgICogICBwYXJzZShncm91cCkgeyAvLyBkYXRhIGZyb20gbG9hZGVyXG4gICAqICAgICByZXR1cm4gSW1wb3J0ZXIuZmlsdGVyKGdyb3VwLCBjaGlsZCA9PiAhY2hpbGQuaXNMaWdodCk7IC8vIHJlbW92ZSBsaWdodHNcbiAgICogICB9LFxuICAgKlxuICAgKiAgIHBvc2l0aW9uOiBbMCwgMTAwLCAwXVxuICAgKiB9KS5hZGRUbyhhcHApO1xuICAgKi9cbiAgc3RhdGljIGZpbHRlcihvYmplY3QsIGZpbHRlcikge1xuICAgIGNvbnN0IHByb2Nlc3NGaWx0ZXIgPSBvYmplY3QgPT4ge1xuICAgICAgb2JqZWN0LmNoaWxkcmVuLmZvckVhY2goKGVsLCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoZWwuY2hpbGRyZW4pIHByb2Nlc3NGaWx0ZXIoZWwpO1xuICAgICAgICBpZiAoIWZpbHRlcihlbCkpIG9iamVjdC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfTtcblxuICAgIHJldHVybiBwcm9jZXNzRmlsdGVyKG9iamVjdCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHN1cGVyKHBhcmFtcywgSW1wb3J0ZXIuZGVmYXVsdHMsIEltcG9ydGVyLmluc3RydWN0aW9ucywgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5JbXBvcnRlclxuICAgKi9cbiAgYnVpbGQocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBpZiAocGFyYW1zLnRleHR1cmVQYXRoKSBwYXJhbXMubG9hZGVyLnNldFRleHR1cmVQYXRoKHBhcmFtcy50ZXh0dXJlUGF0aCk7XG5cbiAgICAgIHBhcmFtcy5sb2FkZXIubG9hZChwYXJhbXMudXJsLCAoLi4uZGF0YSkgPT4geyAvLyBnZW9tZXRyeSwgbWF0ZXJpYWxzXG4gICAgICAgIHBhcmFtcy5vbkxvYWQoLi4uZGF0YSk7XG5cbiAgICAgICAgY29uc3Qgb2JqZWN0ID0gcGFyYW1zLnBhcnNlci5hcHBseSh0aGlzLCBkYXRhKTtcbiAgICAgICAgaWYgKHBhcmFtcy5tYXRlcmlhbCkgb2JqZWN0Lm1hdGVyaWFsID0gdGhpcy5hcHBseUJyaWRnZSh7bWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbH0pLm1hdGVyaWFsO1xuXG4gICAgICAgIHJlc29sdmUob2JqZWN0KTtcbiAgICAgIH0sIHBhcmFtcy5vblByb2dyZXNzLCBwYXJhbXMub25FcnJvcik7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgSW1wb3J0ZXJcbn07XG4iLCJpbXBvcnQge1xuICBNZXNoLFxuICBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnksXG4gIE9jdGFoZWRyb25HZW9tZXRyeVxufSBmcm9tICd0aHJlZSc7XG5cbmltcG9ydCB7TWVzaENvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29yZS9NZXNoQ29tcG9uZW50JztcblxuLyoqXG4gKiBAY2xhc3MgT2N0YWhlZHJvblxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gSW4gZ2VvbWV0cnksIGFuIG9jdGFoZWRyb24gaXMgYSBwb2x5aGVkcm9uIHdpdGggZWlnaHQgZmFjZXMuXG4gKiBBIHJlZ3VsYXIgb2N0YWhlZHJvbiBpcyBhIFBsYXRvbmljIHNvbGlkIGNvbXBvc2VkIG9mIGVpZ2h0IGVxdWlsYXRlcmFsIHRyaWFuZ2xlcywgZm91ciBvZiB3aGljaCBtZWV0IGF0IGVhY2ggdmVydGV4LlxuICogPGJyLz48YnIvPlxuICogYE9jdGFoZWRyb25gIGNyZWF0ZXMgYW4gT2N0YWhlZHJvbiBvYmplY3QgYnkgaXRzIGByYWRpdXNgIGFuZCBgZGV0YWlsYC5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjT2N0YWhlZHJvbkdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYW4gT2N0YWhlZHJvbiwgYW5kIGFkZGluZyB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgT2N0YWhlZHJvbih7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgcmFkaXVzOiAyLFxuICogICAgIGRldGFpbDogMVxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zaXRpb246IFswLCAxMDAsIDBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBPY3RhaGVkcm9uIGV4dGVuZHMgTWVzaENvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5PY3RhaGVkcm9uI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICByYWRpdXM6IDEsXG4gICAqICAgICBkZXRhaWw6IDBcbiAgICogICB9XG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5kZWZhdWx0cyxcbiAgICBnZW9tZXRyeToge1xuICAgICAgcmFkaXVzOiAxLFxuICAgICAgZGV0YWlsOiAwXG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIE9jdGFoZWRyb24uZGVmYXVsdHMsIE9jdGFoZWRyb24uaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIHRoaXMuYnVpbGQocGFyYW1zKTtcbiAgICAgIHN1cGVyLndyYXAoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLk9jdGFoZWRyb25cbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5IDogT2N0YWhlZHJvbkdlb21ldHJ5KShcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5yYWRpdXMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkuZGV0YWlsXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBPY3RhaGVkcm9uXG59O1xuIiwiaW1wb3J0IHtcbiAgTWVzaCxcbiAgUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5LFxuICBQYXJhbWV0cmljR2VvbWV0cnksXG4gIFZlY3RvcjNcbn0gZnJvbSAndGhyZWUnO1xuXG5pbXBvcnQge01lc2hDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTWVzaENvbXBvbmVudCc7XG5cbi8qKlxuICogQGNsYXNzIFBhcmFtZXRyaWNcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIGBQYXJhbWV0cmljYCBnZW5lcmF0ZXMgYSBnZW9tZXRyeSByZXByZXNlbnRpbmcgYSA8YSBocmVmPSdodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9QYXJhbWV0cmljX3N1cmZhY2UnPlBhcmFtZXRyaWMgc3VyZmFjZTwvYT5cbiAqIDxici8+PGJyLz5cbiAqIEl0IGlzIHVzdWFsbHkgdXNlZCB0byBkZXZlbG9wIGRpZmZlcmVudCBraW5kcyBvZiBoaWdoZmllbGRzIG9yIHZpc3VhbGl6ZSBhIDxhIGhyZWY9J2h0dHBzOi8vc3RlbWtvc2tpLmdpdGh1Yi5pby9UaHJlZS5qcy9HcmFwaHVsdXMtRnVuY3Rpb24uaHRtbCc+bWF0aCBmdW5jdGlvbjwvYT4uXG4gKiA8YnIvPlxuICogLSA8YSBocmVmPSdodHRwOi8vbWF0aC5od3MuZWR1L2dyYXBoaWNzYm9vay9zb3VyY2UvdGhyZWVqcy9jdXJ2ZXMtYW5kLXN1cmZhY2VzLmh0bWwnPlBhcmFtZXRyaWMgc3VyZmFjZTwvYT5cbiAqIC0gPGEgaHJlZj0naHR0cHM6Ly9zdGVta29za2kuZ2l0aHViLmlvL1RocmVlLmpzL0dyYXBodWx1cy1TdXJmYWNlLmh0bWwnPlwiR3JhcGh1bHVzXCI8L2E+XG4gKiA8YnIvPjxici8+XG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI1BhcmFtZXRyaWNHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkV4YW1wbGUgY3JlYXRpbmcgYW4gaGVpZ2h0ZmllbGQtbGlrZSBnZW9tZXRyeS4gYHVgIGFuZCBgdmAgYXJlIGxpa2UgYHhgIGFuZCBgeWAgaW4gc2hhcGUsIGJ1dCB0aGVpciB2YWx1ZXMgYXJlIGFsd2F5cyBmcm9tIGAwYCB0byBgMWAuXG4gKiBXZSB1c2UgdGhlbSBpbiBgVEhSRUUuVmVjdG9yM2AgbGlrZSBgeGAgYW5kIGB6YCBhbmQgYE1hdGgucmFuZG9tKCkgKiA1YCBmb3IgYHlgLjwvY2FwdGlvbj5cbiAqIGNvbnN0IGNyZWF0ZVBhcmFtZXRyaWMgPSAodSwgdikgPT4ge1xuICogICByZXR1cm4gbmV3IFRIUkVFLlZlY3RvcjModSAqIDMwLCBNYXRoLnJhbmRvbSgpICogNSwgdiAqIDMwKTtcbiAqIH1cbiAqXG4gKiBuZXcgUGFyYW1ldHJpYyh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgZnVuYzogY3JlYXRlUGFyYW1ldHJpY1xuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoTGFtYmVydE1hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmYsXG4gKiAgICAgc2lkZTogVEhSRUUuRG91YmxlU2lkZVxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiBbMCwgMTAwLCAtMTAwXVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgUGFyYW1ldHJpYyBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuUGFyYW1ldHJpYyNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgZnVuYzogKHUsIHYpID0+IG5ldyBWZWN0b3IzKHUsIHYsIDApLFxuICAgKiAgICAgc2xpY2VzOiAxMCxcbiAgICogICAgIHRhY2tzOiAxMFxuICAgKiAgIH1cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50LmRlZmF1bHRzLFxuICAgIGdlb21ldHJ5OiB7XG4gICAgICBmdW5jOiAodSwgdikgPT4gbmV3IFZlY3RvcjModSwgdiwgMCksXG4gICAgICBzbGljZXM6IDEwLFxuICAgICAgc3RhY2tzOiAxMFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHBhcmFtcyA9IHt9KSB7XG4gICAgc3VwZXIocGFyYW1zLCBQYXJhbWV0cmljLmRlZmF1bHRzLCBQYXJhbWV0cmljLmluc3RydWN0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlBhcmFtZXRyaWNcbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5IDogUGFyYW1ldHJpY0dlb21ldHJ5KShcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5mdW5jLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnNsaWNlcyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5zdGFja3NcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIFBhcmFtZXRyaWNcbn07XG4iLCJpbXBvcnQge1xuICBNZXNoLFxuICBQbGFuZUJ1ZmZlckdlb21ldHJ5LFxuICBQbGFuZUdlb21ldHJ5XG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBQbGFuZVxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gYFBsYW5lYCBpcyB1c2VkIGZvciBjcmVhdGluZyBwbGFuZXMgZ2l2ZW4gc29tZSBgd2lkdGhgIGFuZCBgaGVpZ2h0YC5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjUGxhbmVHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgUGxhbmUsIGFuZCBhZGRpbmcgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IFBsYW5lKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICB3aWR0aDogMjAsXG4gKiAgICAgaGVpZ2h0OiAzMFxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBQbGFuZSBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuUGxhbmUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHdpZHRoOiAxMCxcbiAgICogICAgIGhlaWdodDogMTAsXG4gICAqICAgICB3U2VnbWVudHM6IDEsXG4gICAqICAgICBoU2VnbWVudHM6IDFcbiAgICogICB9XG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5kZWZhdWx0cyxcbiAgICBnZW9tZXRyeToge1xuICAgICAgd2lkdGg6IDEwLFxuICAgICAgaGVpZ2h0OiAxMCxcbiAgICAgIHdTZWdtZW50czogMSxcbiAgICAgIGhTZWdtZW50czogMVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlBsYW5lI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeTogWyd3aWR0aCcsICdoZWlnaHQnLCAnd1NlZ21lbnRzJywgJ2hTZWdtZW50cyddXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbJ3dpZHRoJywgJ2hlaWdodCcsICd3U2VnbWVudHMnLCAnaFNlZ21lbnRzJ11cbiAgfTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHN1cGVyKHBhcmFtcywgUGxhbmUuZGVmYXVsdHMsIFBsYW5lLmluc3RydWN0aW9ucyk7XG5cbiAgICBpZiAocGFyYW1zLmJ1aWxkKSB7XG4gICAgICB0aGlzLmJ1aWxkKHBhcmFtcyk7XG4gICAgICBzdXBlci53cmFwKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5QbGFuZVxuICAgKi9cbiAgYnVpbGQocGFyYW1zID0gdGhpcy5wYXJhbXMpIHtcbiAgICBjb25zdCB7Z2VvbWV0cnksIG1hdGVyaWFsfSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe21lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbCl9KS5tZXNoO1xuICB9XG5cbiAgYnVpbGRHZW9tZXRyeShwYXJhbXMgPSB7fSkge1xuICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IChwYXJhbXMuYnVmZmVyID8gUGxhbmVCdWZmZXJHZW9tZXRyeSA6IFBsYW5lR2VvbWV0cnkpKFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LndpZHRoLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LmhlaWdodCxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS53U2VnbWVudHMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkuaFNlZ21lbnRzXG4gICAgKTtcblxuICAgIHJldHVybiBnZW9tZXRyeTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBQbGFuZVxufTtcbiIsImltcG9ydCB7XG4gIE1lc2gsXG4gIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSxcbiAgUG9seWhlZHJvbkdlb21ldHJ5XG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuXG5jb25zdCBbdmVydGljZXNPZkN1YmUsIGluZGljZXNPZkZhY2VzXSA9IFtcbiAgW1xuICAgIC0xLCAtMSwgLTEsIDEsIC0xLCAtMSwgMSwgMSwgLTEsIC0xLCAxLCAtMSxcbiAgICAtMSwgLTEsIDEsIDEsIC0xLCAxLCAxLCAxLCAxLCAtMSwgMSwgMVxuICBdLFxuICBbXG4gICAgMiwgMSwgMCwgMCwgMywgMixcbiAgICAwLCA0LCA3LCA3LCAzLCAwLFxuICAgIDAsIDEsIDUsIDUsIDQsIDAsXG4gICAgMSwgMiwgNiwgNiwgNSwgMSxcbiAgICAyLCAzLCA3LCA3LCA2LCAyLFxuICAgIDQsIDUsIDYsIDYsIDcsIDRcbiAgXVxuXTtcblxuLyoqXG4gKiBAY2xhc3MgUG9seWhlZHJvblxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gSW4gZWxlbWVudGFyeSBnZW9tZXRyeSwgYSBwb2x5aGVkcm9uIGlzIGEgc29saWQgaW4gdGhyZWUgZGltZW5zaW9ucyB3aXRoIGZsYXQgcG9seWdvbmFsIGZhY2VzLCBzdHJhaWdodCBlZGdlcyBhbmQgc2hhcnAgY29ybmVycyBvciB2ZXJ0aWNlcy5cbiAqIDxici8+PGJyLz5cbiAqIGBQb2x5aGVkcm9uYCBjcmVhdGVzIGEgUG9seWhlZHJvbiBieSBpdHMgYHJhZGl1c2AgYW5kIGBkZXRhaWxgLlxuICogPGJyLz48YnIvPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGFuIFBvbHloZWRyb24sIGFuZCBhZGRpbmcgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IFBvbHloZWRyb24oe1xuICogICBnZW9tZXRyeToge1xuICogICAgIHJhZGl1czogMixcbiAqICAgICBkZXRhaWw6IDFcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiBbMCwgMTAwLCAwXVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgUG9seWhlZHJvbiBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICBzdGF0aWMgdmVydGljZXNPZkN1YmUgPSB2ZXJ0aWNlc09mQ3ViZTtcbiAgc3RhdGljIGluZGljZXNPZkZhY2VzID0gaW5kaWNlc09mRmFjZXM7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlBvbHloZWRyb24jZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHZlcnRpY2VzT2ZDdWJlOiBbXG4gICAqICAgICAgIC0xLCAtMSwgLTEsIDEsIC0xLCAtMSwgMSwgMSwgLTEsIC0xLCAxLCAtMSxcbiAgICogICAgICAgLTEsIC0xLCAxLCAxLCAtMSwgMSwgMSwgMSwgMSwgLTEsIDEsIDFcbiAgICogICAgIF0sXG4gICAqXG4gICAqICAgICBpbmRpY2VzT2ZGYWNlczogW1xuICAgKiAgICAgICAyLCAxLCAwLCAwLCAzLCAyLFxuICAgKiAgICAgICAwLCA0LCA3LCA3LCAzLCAwLFxuICAgKiAgICAgICAwLCAxLCA1LCA1LCA0LCAwLFxuICAgKiAgICAgICAxLCAyLCA2LCA2LCA1LCAxLFxuICAgKiAgICAgICAyLCAzLCA3LCA3LCA2LCAyLFxuICAgKiAgICAgICA0LCA1LCA2LCA2LCA3LCA0XG4gICAqICAgICBdLFxuICAgKlxuICAgKiAgICAgcmFkaXVzOiA2LFxuICAgKiAgICAgZGV0YWlsOiAyXG4gICAqICAgfVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuZGVmYXVsdHMsXG4gICAgZ2VvbWV0cnk6IHtcbiAgICAgIHZlcnRpY2VzT2ZDdWJlLFxuICAgICAgaW5kaWNlc09mRmFjZXMsXG4gICAgICByYWRpdXM6IDYsXG4gICAgICBkZXRhaWw6IDJcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Qb2x5aGVkcm9uI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeTogWyd2ZXJ0aWNlc09mQ3ViZScsICdpbmRpY2VzT2ZGYWNlcycsICdyYWRpdXMnLCAnZGV0YWlsJ11cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIHN0YXRpYyBpbnN0cnVjdGlvbnMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMsXG4gICAgZ2VvbWV0cnk6IFsndmVydGljZXNPZkN1YmUnLCAnaW5kaWNlc09mRmFjZXMnLCAncmFkaXVzJywgJ2RldGFpbCddXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIFBvbHloZWRyb24uZGVmYXVsdHMsIFBvbHloZWRyb24uaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIHRoaXMuYnVpbGQocGFyYW1zKTtcbiAgICAgIHN1cGVyLndyYXAoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlBvbHloZWRyb25cbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5IDogUG9seWhlZHJvbkdlb21ldHJ5KShcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS52ZXJ0aWNlc09mQ3ViZSxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5pbmRpY2VzT2ZGYWNlcyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5yYWRpdXMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkuZGV0YWlsXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBQb2x5aGVkcm9uXG59O1xuIiwiaW1wb3J0IHtcbiAgTWVzaCxcbiAgUmluZ0dlb21ldHJ5LFxuICBSaW5nQnVmZmVyR2VvbWV0cnlcbn0gZnJvbSAndGhyZWUnO1xuXG5pbXBvcnQge01lc2hDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTWVzaENvbXBvbmVudCc7XG5cbi8qKlxuICogQGNsYXNzIFJpbmdcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIFJpbmcgY2xhc3MgY3JlYXRlcyBhIGNpcmNsZSBvciBqdXN0IDJEIFRvcnVzLiBEb2VzIG5vdCBzdXBwb3J0IHBoeXNpY3MuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI1JpbmdHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgUmluZywgYW5kIGFkZGluZyB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgUmluZyh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgaW5uZXJSYWRpdXM6IDUsXG4gKiAgICAgb3V0ZXJSYWRpdXM6IDJcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaExhbWJlcnRNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmLFxuICogICAgIHNpZGUgVEhSRUUuRG91YmxlU2lkZVxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiBbMCwgOCwgMF0sXG4gKlxuICogICByb3RhdGlvbjoge1xuICogICAgIHg6IE1hdGguUEkvNFxuICogICB9XG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBSaW5nIGV4dGVuZHMgTWVzaENvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5SaW5nI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICBpbm5lclJhZGl1czogMCxcbiAgICogICAgIG91dGVyUmFkaXVzOiA1MCxcbiAgICogICAgIHRoZXRhU2VnbWVudHM6IDgsXG4gICAqICAgICBwaGlTZWdtZW50czogOCxcbiAgICogICAgIHRoZXRhU3RhcnQ6IDAsXG4gICAqICAgICB0aGV0YUxlbmd0aDogTWF0aC5QSSAqIDJcbiAgICogICB9XG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5kZWZhdWx0cyxcbiAgICBnZW9tZXRyeToge1xuICAgICAgaW5uZXJSYWRpdXM6IDAsXG4gICAgICBvdXRlclJhZGl1czogNTAsXG4gICAgICB0aGV0YVNlZ21lbnRzOiA4LFxuICAgICAgcGhpU2VnbWVudHM6IDgsXG4gICAgICB0aGV0YVN0YXJ0OiAwLFxuICAgICAgdGhldGFMZW5ndGg6IE1hdGguUEkgKiAyXG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuUmluZyNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IFtcbiAgICogICAgICdpbm5lclJhZGl1cycsXG4gICAqICAgICAnb3V0ZXJSYWRpdXMnLFxuICAgKiAgICAgJ3RoZXRhU2VnbWVudHMnLFxuICAgKiAgICAgJ3BoaVNlZ21lbnRzJyxcbiAgICogICAgICd0aGV0YVN0YXJ0JyxcbiAgICogICAgICd0aGV0YUxlbmd0aCdcbiAgICogICBdXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuZGVmYXVsdHMsXG4gICAgZ2VvbWV0cnk6IFtcbiAgICAgICdpbm5lclJhZGl1cycsXG4gICAgICAnb3V0ZXJSYWRpdXMnLFxuICAgICAgJ3RoZXRhU2VnbWVudHMnLFxuICAgICAgJ3BoaVNlZ21lbnRzJyxcbiAgICAgICd0aGV0YVN0YXJ0JyxcbiAgICAgICd0aGV0YUxlbmd0aCdcbiAgICBdXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIFJpbmcuZGVmYXVsdHMsIFJpbmcuaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIHRoaXMuYnVpbGQocGFyYW1zKTtcbiAgICAgIHN1cGVyLndyYXAoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlJpbmdcbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gUmluZ0J1ZmZlckdlb21ldHJ5IDogUmluZ0dlb21ldHJ5KShcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5pbm5lclJhZGl1cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5vdXRlclJhZGl1cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS50aGV0YVNlZ21lbnRzLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnBoaVNlZ21lbnRzLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnRoZXRhU3RhcnQsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkudGhldGFMZW5ndGhcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIFJpbmdcbn07XG4iLCJpbXBvcnQge1xuICBNZXNoLFxuICBTaGFwZUJ1ZmZlckdlb21ldHJ5LFxuICBTaGFwZUdlb21ldHJ5XG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBTaGFwZVxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gU2hhcGUgaXMgYSB1bml2ZXJzYWwgY2xhc3MuIEl0IGFsbG93cyB5b3UgdG8gY3JlYXRlIGRpZmZlcmVudCAyRCBzaGFwZXMgaW4gM0Qgc2NlbmUuPGJyLz5cbiAqIFVuZm9ydHVuYXRlbHksIG5vdCBhbGwgb2YgdGhlbSBzdXBwb3J0IHBoeXNpY3MsIGFuIGFsdGVybmF0aXZlIGlzIHRvIG1ha2UgYSBzaW1pbGFyIDNEIG9iamVjdCBhbmQgc2NhbGUgaXRzIHdpZHRoIGRvd24gdG8gbmVhciB6ZXJvLlxuICogPGJyLz48YnIvPlxuICogYFNoYXBlYCBjb25zaXN0cyBvZiBzaGFwZXMgdGhhdCBhcmUgaW4gaXRzIHNoYXBlcyBwYXJhbWV0ZXIuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI1NoYXBlR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIHBsYW5lIGxvb2tpbmcgU2hhcGUgZnJvbSBhIFRIUkVFLlNoYXBlLCBhbmQgYWRkaW5nIGl0IHRvIGFwcDwvY2FwdGlvbj5cbiAqIGNvbnN0IHJlY3RXaWR0aCA9IDEwLFxuICogcmVjdExlbmd0aCA9IDU7XG4gKlxuICogY29uc3QgcmVjdFNoYXBlID0gbmV3IFRIUkVFLlNoYXBlKCk7XG4gKiByZWN0U2hhcGUubW92ZVRvKDAsMCk7XG4gKiByZWN0U2hhcGUubGluZVRvKDAsIHJlY3RXaWR0aCk7XG4gKiByZWN0U2hhcGUubGluZVRvKHJlY3RMZW5ndGgsIHJlY3RXaWR0aCk7XG4gKiByZWN0U2hhcGUubGluZVRvKHJlY3RMZW5ndGgsIDApO1xuICogcmVjdFNoYXBlLmxpbmVUbygwLCAwKTtcbiAqXG4gKiBjb25zdCBwbGFuZSA9IG5ldyBTaGFwZSh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgc2hhcGU6IHJlY3RTaGFwZVxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBTaGFwZSBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuU2hhcGUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHNoYXBlczogW11cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50LmRlZmF1bHRzLFxuICAgIGdlb21ldHJ5OiB7XG4gICAgICBzaGFwZXM6IFtdXG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuU2hhcGUjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiBbJ3NoYXBlcyddXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbJ3NoYXBlcyddXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIFNoYXBlLmRlZmF1bHRzLCBTaGFwZS5pbnN0cnVjdGlvbnMpO1xuXG4gICAgaWYgKHBhcmFtcy5idWlsZCkge1xuICAgICAgdGhpcy5idWlsZChwYXJhbXMpO1xuICAgICAgc3VwZXIud3JhcCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuU2hhcGVcbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gU2hhcGVCdWZmZXJHZW9tZXRyeSA6IFNoYXBlR2VvbWV0cnkpKFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnNoYXBlc1xuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgU2hhcGVcbn07XG4iLCJpbXBvcnQge1xuICBNZXNoLFxuICBTcGhlcmVCdWZmZXJHZW9tZXRyeSxcbiAgU3BoZXJlR2VvbWV0cnlcbn0gZnJvbSAndGhyZWUnO1xuXG5pbXBvcnQge01lc2hDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTWVzaENvbXBvbmVudCc7XG5cbi8qKlxuICogQGNsYXNzIFNwaGVyZVxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gU3BoZXJlIGNsYXNzIGlzIHVzZWQgdG8gY3JlYXRlIHNwaGVyZSBvYmplY3RzIGJ5IGl0cyByYWRpdXMgcHJvcGVydHkgYW5kIG90aGVyIHZhbHVlcyB0aGF0IGRldGVybWluZXMgaXRzIGRldGFsaXR5LlxuICogPGJyLz48YnIvPlxuICogSXQgaXMgc2ltaWxhciB0byBUSFJFRS5TcGhlcmVHZW9tZXRyeSwgYnV0IGl0IGFsc28gY29udGFpbnMgYWxsIGBTaGFwZWAgcHJvcGVydGllcywgc3VjaCBhcyBtYXRlcmlhbCwgbWFzcyBhbmQgdmVjdG9ycyBsaWtlIHBvc2l0aW9uIChwb3MpIGFuZCByb3RhdGlvbiAocm90KS5cbiAqIDxici8+PGJyLz5cbiAqIFRoZW4gaXQgY3JlYXRlcyBhbiBgVGhyZWUuanMgbWVzaGAgb3IgYSBgUGh5c2lqcyBtZXNoYCwgdGhhdCBpcyBzaW1pbGFyIHRvIGBUaHJlZS5qcyBtZXNoYCwgYnV0IGl0IGFsc28gdGFrZSBpbnRvIGNvbnNpZGVyYXRpb24gY29sbGlzaW9uIGNhbGN1bGF0aW9ucy5cbiAqIFRoaXMgbWVzaCBpcyBhIGNvbWJpbmF0aW9uIG9mIGBUaHJlZS5qcyBnZW9tZXRyeWAgYW5kIGBQaHlzaWpzIG1hdGVyaWFsYCAoVGhlIHNhbWUgYXMgaW4gdGhyZWUuanMsIGJ1dCB3aXRoIGZyaWN0aW9uIGFuZCByZXN0aXR1dGlvbikuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI1NwaGVyZUdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBTcGhlcmUsIGFuZCBhZGRpbmcgaXQgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IFNwaGVyZSh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgcmFkaXVzOiAyXG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSksXG4gKlxuICogICBwb3NpdGlvbjoge1xuICogICAgIHk6IDEwMFxuICogICB9XG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBTcGhlcmUgZXh0ZW5kcyBNZXNoQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlNwaGVyZSNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgcmFkaXVzOiAxLFxuICAgKiAgICAgd2lkdGhTZWdtZW50czogOCxcbiAgICogICAgIGhlaWdodFNlZ21lbnRzOiA2XG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5kZWZhdWx0cyxcbiAgICBnZW9tZXRyeToge1xuICAgICAgcmFkaXVzOiAxLFxuICAgICAgd2lkdGhTZWdtZW50czogOCxcbiAgICAgIGhlaWdodFNlZ21lbnRzOiA2XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuU3BoZXJlI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeTogWydyYWRpdXMnLCAnd2lkdGhTZWdtZW50cycsICdoZWlnaHRTZWdtZW50cyddXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbJ3JhZGl1cycsICd3aWR0aFNlZ21lbnRzJywgJ2hlaWdodFNlZ21lbnRzJ11cbiAgfTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHN1cGVyKHBhcmFtcywgU3BoZXJlLmRlZmF1bHRzLCBTcGhlcmUuaW5zdHJ1Y3Rpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuU3BoZXJlXG4gICAqL1xuICBidWlsZChwYXJhbXMgPSB0aGlzLnBhcmFtcykge1xuICAgIGNvbnN0IHtnZW9tZXRyeSwgbWF0ZXJpYWx9ID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7bWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKX0pLm1lc2g7XG4gIH1cblxuICBidWlsZEdlb21ldHJ5KHBhcmFtcyA9IHt9KSB7XG4gICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgKHBhcmFtcy5idWZmZXIgPyBTcGhlcmVCdWZmZXJHZW9tZXRyeSA6IFNwaGVyZUdlb21ldHJ5KShcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5yYWRpdXMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkud2lkdGhTZWdtZW50cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5oZWlnaHRTZWdtZW50c1xuICAgICk7XG5cbiAgICByZXR1cm4gZ2VvbWV0cnk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgU3BoZXJlXG59O1xuIiwiaW1wb3J0IHtcbiAgTWVzaCxcbiAgVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSxcbiAgVGV0cmFoZWRyb25HZW9tZXRyeVxufSBmcm9tICd0aHJlZSc7XG5cbmltcG9ydCB7TWVzaENvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29yZS9NZXNoQ29tcG9uZW50JztcblxuLyoqXG4gKiBAY2xhc3MgVGV0cmFoZWRyb25cbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIEluIGdlb21ldHJ5LCBhIHRldHJhaGVkcm9uIGlzIGEgcG9seWhlZHJvbiBjb21wb3NlZCBvZiBmb3VyIHRyaWFuZ3VsYXIgZmFjZXMsIHNpeCBzdHJhaWdodCBlZGdlcywgYW5kIGZvdXIgdmVydGV4IGNvcm5lcnMuXG4gKiBUaGUgdGV0cmFoZWRyb24gaXMgdGhlIHNpbXBsZXN0IG9mIGFsbCB0aGUgb3JkaW5hcnkgY29udmV4IHBvbHloZWRyYSBhbmQgdGhlIG9ubHkgb25lIHRoYXQgaGFzIGZld2VyIHRoYW4gNSBmYWNlcy5cbiAqIDxici8+PGJyLz5cbiAqIGBUZXRyYWhlZHJvbmAgY3JlYXRlcyBhIFRldHJhaGVkcm9uIG9iamVjdCBieSBpdHMgYHJhZGl1c2AgYW5kIGBkZXRhaWxgXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI1RldHJhaGVkcm9uR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIFRldHJhaGVkcm9uLCBhbmQgYWRkaW5nIGl0IHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBUZXRyYWhlZHJvbih7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgcmFkaXVzOiAyLFxuICogICAgIGRldGFpbDogMVxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zaXRpb246IHtcbiAqICAgICB4OiAwLFxuICogICAgIHk6IDEwMCxcbiAqICAgICB6OiAwXG4gKiAgIH1cbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cbmNsYXNzIFRldHJhaGVkcm9uIGV4dGVuZHMgTWVzaENvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5UZXRyYWhlZHJvbiNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgcmFkaXVzOiAxLFxuICAgKiAgICAgZGV0YWlsOiAwXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5kZWZhdWx0cyxcbiAgICBnZW9tZXRyeToge1xuICAgICAgcmFkaXVzOiAxLFxuICAgICAgZGV0YWlsOiAwXG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuVGV0cmFoZWRyb24jaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiBbJ3JhZGl1cycsICdkZXRhaWwnXVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgc3RhdGljIGluc3RydWN0aW9ucyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50Lmluc3RydWN0aW9ucyxcbiAgICBnZW9tZXRyeTogWydyYWRpdXMnLCAnZGV0YWlsJ11cbiAgfTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHN1cGVyKHBhcmFtcywgVGV0cmFoZWRyb24uZGVmYXVsdHMsIFRldHJhaGVkcm9uLmluc3RydWN0aW9ucyk7XG5cbiAgICBpZiAocGFyYW1zLmJ1aWxkKSB7XG4gICAgICB0aGlzLmJ1aWxkKHBhcmFtcyk7XG4gICAgICBzdXBlci53cmFwKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5UZXRyYWhlZHJvblxuICAgKi9cbiAgYnVpbGQocGFyYW1zID0gdGhpcy5wYXJhbXMpIHtcbiAgICBjb25zdCB7Z2VvbWV0cnksIG1hdGVyaWFsfSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe21lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbCl9KS5tZXNoO1xuICB9XG5cbiAgYnVpbGRHZW9tZXRyeShwYXJhbXMgPSB7fSkge1xuICAgIHJldHVybiBuZXcgKHBhcmFtcy5idWZmZXIgPyBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5IDogVGV0cmFoZWRyb25HZW9tZXRyeSkoXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkucmFkaXVzLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LmRldGFpbFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgVGV0cmFoZWRyb25cbn07XG4iLCJpbXBvcnQge1xuICBGb250LFxuICBNZXNoLFxuICBUZXh0R2VvbWV0cnksXG4gIEZvbnRMb2FkZXJcbn0gZnJvbSAndGhyZWUnO1xuXG5pbXBvcnQge01lc2hDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTWVzaENvbXBvbmVudCc7XG5cbi8qKlxuICogQGNsYXNzIFRleHRcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIFRleHQgY2xhc3MgaXMgbWFkZSBmb3IgY3JlYXRpbmcgM0QgdGV4dCBvYmplY3RzLlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNUZXh0R2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIDxici8+PGJyLz5cbiAqIFBoeXNpY3MgdGV4dCBvYmplY3QgY2FuIGJlIGNvbnZleCBvciBjb25jYXZlLiBCeSBkZWZhdWx0IGl0J3MgY29udmV4IGJ1dCB5b3UgY2FuIGFsc28gc3dpdGNoIHRvIGNvbmNhdmUuXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBUZXh0LCBhbmQgYWRkaW5nIGl0IHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBUZXh0KHtcbiAqICAgICB0ZXh0OiAnU29tZSB0ZXh0JyxcbiAqICAgICBwYXJhbWV0ZXJzOiB7XG4gKiAgICAgICBmb250OiAncGF0aC90by9mb250LnR5cGVmYWNlLmpzJyxcbiAqICAgICAgIHNpemU6IDIwLFxuICogICAgICAgaGVpZ2h0OiA1LFxuICogICAgICAgY3VydmVTZWdtZW50czogNlxuICogICAgIH1cbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiB7XG4gKiAgICAgeDogLTQwLFxuICogICAgIHk6IDIwLFxuICogICAgIHo6IDBcbiAqICAgfVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgVGV4dCBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuVGV4dCNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICB0ZXh0OiAnSGVsbG8gV29ybGQhJyxcbiAgICogICBmb250OiBudWxsLFxuICAgKlxuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICBzaXplOiAxMixcbiAgICogICAgIGhlaWdodDogNTAsXG4gICAqICAgICBjdXJ2ZVNlZ21lbnRzOiAxMixcbiAgICogICAgIGZvbnQ6IG5ldyBGb250KCksXG4gICAqICAgICBiZXZlbEVuYWJsZWQ6IGZhbHNlLFxuICAgKiAgICAgYmV2ZWxUaGlja25lc3M6IDEwLFxuICAgKiAgICAgYmV2ZWxTaXplOiA4XG4gICAqICAgfVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuZGVmYXVsdHMsXG4gICAgdGV4dDogJ0hlbGxvIFdvcmxkIScsXG4gICAgZm9udDogbnVsbCxcblxuICAgIGdlb21ldHJ5OiB7XG4gICAgICBzaXplOiAxMixcbiAgICAgIGhlaWdodDogNTAsXG4gICAgICBjdXJ2ZVNlZ21lbnRzOiAxMixcbiAgICAgIGZvbnQ6IG5ldyBGb250KCksXG4gICAgICBiZXZlbEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgYmV2ZWxUaGlja25lc3M6IDEwLFxuICAgICAgYmV2ZWxTaXplOiA4XG4gICAgfVxuICB9O1xuXG4gIHN0YXRpYyBpbnN0cnVjdGlvbnMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnNcbiAgfTtcblxuICAvKipcbiAgICogRGVmYXVsdCBGb250TG9hZGVyXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlRleHQjbG9hZGVyXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgbmV3IEZvbnRMb2FkZXIoKVxuICAgKi9cbiAgc3RhdGljIGxvYWRlciA9IG5ldyBGb250TG9hZGVyKCk7XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgbG9hZFxuICAgKiBAc3RhdGljXG4gICAqIEBkZXNjcmlwdGlvbiBsb2FkKCkgcHJlbG9hZHMgYSBGb250IG9iamVjdCBhbmQgcmV0dXJucyBhIFByb21pc2Ugd2l0aCBpdC5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggUGF0aCB0byB0aGUgZm9udFxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBBIHByb21pc2UgcmVzb2x2ZWQgd2l0aCBhIGZvbnRcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5UZXh0XG4gICAqL1xuICBzdGF0aWMgbG9hZChwYXRoLCBsb2FkZXIgPSBUZXh0LmxvYWRlcikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGxvYWRlci5sb2FkKHBhdGgsIHJlc29sdmUpO1xuICAgIH0pO1xuICB9XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIFRleHQuZGVmYXVsdHMsIFRleHQuaW5zdHJ1Y3Rpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBpcyBjYWxsZWQgYXMgcGFydCBvZiB0aGUgbGlmZWN5Y2xlIHRvIGNyZWF0ZSBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuVGV4dFxuICAgKi9cbiAgYnVpbGQocGFyYW1zID0gdGhpcy5wYXJhbXMpIHtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAocGFyYW1zLmZvbnQgaW5zdGFuY2VvZiBQcm9taXNlID8gcGFyYW1zLmZvbnQgOiBQcm9taXNlLnJlc29sdmUocGFyYW1zLmZvbnQpKVxuICAgICAgLnRoZW4oZm9udCA9PiB7XG4gICAgICAgIGNvbnN0IHtnZW9tZXRyeSwgbWF0ZXJpYWx9ID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgICAgZ2VvbWV0cnk6IG5ldyBUZXh0R2VvbWV0cnkoXG4gICAgICAgICAgICBwYXJhbXMudGV4dCxcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgIHBhcmFtcy5nZW9tZXRyeSxcbiAgICAgICAgICAgICAge2ZvbnR9XG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcblxuICAgICAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVzb2x2ZShcbiAgICAgICAgICB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgICAgIG1lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbClcbiAgICAgICAgICB9KS5tZXNoXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHN1cGVyLndhaXQocHJvbWlzZSk7XG5cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBUZXh0XG59O1xuIiwiaW1wb3J0IHtcbiAgTWVzaCxcbiAgVG9ydXNHZW9tZXRyeVxufSBmcm9tICd0aHJlZSc7XG5cbmltcG9ydCB7TWVzaENvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29yZS9NZXNoQ29tcG9uZW50JztcblxuLyoqXG4gKiBAY2xhc3MgVG9ydXNcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIFRvcnVzIGNsYXNzIG1ha2VzIGEgdG9ydXMgZmlndXJlLiBBIGRvbnV0IGlzIGEgdG9ydXMuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9pbmRleC5odG1sI2FwaS9nZW9tZXRyaWVzL1RvcnVzR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIFRvcnVzLCBhbmQgYWRkaW5nIGl0IHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBUb3J1cyh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgcmFkaXVzOiA1LFxuICogICAgIHR1YmU6IDJcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiB7XG4gKiAgICAgeTogMzVcbiAqICAgfVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgVG9ydXMgZXh0ZW5kcyBNZXNoQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlRvcnVzI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICByYWRpdXM6IDEwMCxcbiAgICogICAgIHR1YmU6IDQwLFxuICAgKiAgICAgcmFkaWFsU2VnbWVudHM6IDgsXG4gICAqICAgICB0dWJ1bGFyU2VnbWVudHM6IDYsXG4gICAqICAgICBhcmM6IE1hdGguUEkgKiAyXG4gICAqICAgfVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuZGVmYXVsdHMsXG4gICAgZ2VvbWV0cnk6IHtcbiAgICAgIHJhZGl1czogMTAwLFxuICAgICAgdHViZTogNDAsXG4gICAgICByYWRpYWxTZWdtZW50czogOCxcbiAgICAgIHR1YnVsYXJTZWdtZW50czogNixcbiAgICAgIGFyYzogTWF0aC5QSSAqIDJcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Ub3J1cyNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IFtcbiAgICogICAgICdyYWRpdXMnLFxuICAgKiAgICAgJ3R1YmUnLFxuICAgKiAgICAgJ3JhZGlhbFNlZ21lbnRzJyxcbiAgICogICAgICd0dWJ1bGFyU2VnbWVudHMnLFxuICAgKiAgICAgJ2FyYydcbiAgICogICBdXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbXG4gICAgICAncmFkaXVzJyxcbiAgICAgICd0dWJlJyxcbiAgICAgICdyYWRpYWxTZWdtZW50cycsXG4gICAgICAndHVidWxhclNlZ21lbnRzJyxcbiAgICAgICdhcmMnXG4gICAgXVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHBhcmFtcyA9IHt9KSB7XG4gICAgc3VwZXIocGFyYW1zLCBUb3J1cy5kZWZhdWx0cywgVG9ydXMuaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIHRoaXMuYnVpbGQocGFyYW1zKTtcbiAgICAgIHN1cGVyLndyYXAoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlRvcnVzXG4gICAqL1xuICBidWlsZChwYXJhbXMgPSB0aGlzLnBhcmFtcykge1xuICAgIGNvbnN0IHtnZW9tZXRyeSwgbWF0ZXJpYWx9ID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7bWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKX0pLm1lc2g7XG4gIH1cblxuICBidWlsZEdlb21ldHJ5KHBhcmFtcyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBUb3J1c0dlb21ldHJ5KFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnJhZGl1cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS50dWJlLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnJhZGlhbFNlZ21lbnRzLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnR1YnVsYXJTZWdtZW50cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5hcmNcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIFRvcnVzXG59O1xuIiwiaW1wb3J0IHtcbiAgTWVzaCxcbiAgVG9ydXNLbm90QnVmZmVyR2VvbWV0cnksXG4gIFRvcnVzS25vdEdlb21ldHJ5XG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBUb3J1c2tub3RcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIFRvcnVza25vdCBjbGFzcyBtYWtlcyBhIHRvcnVza25vdCBmaWd1cmUuIEl0J3MgbGlrZSBhIGNyb29rZWQgZG9udXQsIHZlcnkgY3Jvb2tlZC5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjVG9ydXNLbm90R2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIFRvcnVza25vdCwgYW5kIGFkZGluZyBpdCB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgVG9ydXNrbm90KHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICByYWRpdXM6NSxcbiAqICAgICB0dWJlOiAyXG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSksXG4gKlxuICogICBwb3M6IHtcbiAqICAgICB5OiAxMDBcbiAqICAgfVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgVG9ydXNrbm90IGV4dGVuZHMgTWVzaENvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Ub3J1c2tub3QjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHJhZGl1czogMTAwLFxuICAgKiAgICAgdHViZTogNDAsXG4gICAqICAgICByYWRpYWxTZWdtZW50czogNjQsXG4gICAqICAgICB0dWJ1bGFyU2VnbWVudHM6IDgsXG4gICAqICAgICBwOiAyLFxuICAgKiAgICAgcTogM1xuICAgKiAgIH1cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50LmRlZmF1bHRzLFxuICAgIGdlb21ldHJ5OiB7XG4gICAgICByYWRpdXM6IDEwMCxcbiAgICAgIHR1YmU6IDQwLFxuICAgICAgcmFkaWFsU2VnbWVudHM6IDY0LFxuICAgICAgdHVidWxhclNlZ21lbnRzOiA4LFxuICAgICAgcDogMixcbiAgICAgIHE6IDNcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Ub3J1c2tub3QjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiBbXG4gICAqICAgICAncmFkaXVzJyxcbiAgICogICAgICd0dWJlJyxcbiAgICogICAgICdyYWRpYWxTZWdtZW50cycsXG4gICAqICAgICAndHVidWxhclNlZ21lbnRzJyxcbiAgICogICAgICdwJyxcbiAgICogICAgICdxJ1xuICAgKiAgIF1cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIHN0YXRpYyBpbnN0cnVjdGlvbnMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMsXG4gICAgZ2VvbWV0cnk6IFtcbiAgICAgICdyYWRpdXMnLFxuICAgICAgJ3R1YmUnLFxuICAgICAgJ3JhZGlhbFNlZ21lbnRzJyxcbiAgICAgICd0dWJ1bGFyU2VnbWVudHMnLFxuICAgICAgJ3AnLFxuICAgICAgJ3EnXG4gICAgXVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHBhcmFtcyA9IHt9KSB7XG4gICAgc3VwZXIocGFyYW1zLCBUb3J1c2tub3QuZGVmYXVsdHMsIFRvcnVza25vdC5pbnN0cnVjdGlvbnMpO1xuXG4gICAgaWYgKHBhcmFtcy5idWlsZCkge1xuICAgICAgdGhpcy5idWlsZChwYXJhbXMpO1xuICAgICAgc3VwZXIud3JhcCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuVG9ydXNrbm90XG4gICAqL1xuICBidWlsZChwYXJhbXMgPSB0aGlzLnBhcmFtcykge1xuICAgIGNvbnN0IHtnZW9tZXRyeSwgbWF0ZXJpYWx9ID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7bWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKX0pLm1lc2g7XG4gIH1cblxuICBidWlsZEdlb21ldHJ5KHBhcmFtcyA9IHt9KSB7XG4gICAgY29uc3QgR0NvbnN0cnVjdCA9IHBhcmFtcy5idWZmZXIgPyBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSA6IFRvcnVzS25vdEdlb21ldHJ5O1xuXG4gICAgcmV0dXJuIG5ldyBHQ29uc3RydWN0KFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnJhZGl1cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS50dWJlLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnJhZGlhbFNlZ21lbnRzLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnR1YnVsYXJTZWdtZW50cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5wLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnFcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIFRvcnVza25vdFxufTtcbiIsImltcG9ydCB7XG4gIE1lc2gsXG4gIExpbmVDdXJ2ZTMsXG4gIFZlY3RvcjMsXG4gIFR1YmVCdWZmZXJHZW9tZXRyeSxcbiAgVHViZUdlb21ldHJ5XG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBUdWJlXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBUdWJlIGNsYXNzIG1ha2VzIGEgdHViZSB0aGF0IGV4dHJ1ZGVzIGFsb25nIGEgM2QgY3VydmUuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9pbmRleC5odG1sI2FwaS9nZW9tZXRyaWVzL1R1YmVHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgVHViZSBmcm9tIGEgdGhyZWUuanMgQ3VydmUsIGFuZCBhZGRpbmcgaXQgdG8gYXBwPC9jYXB0aW9uPlxuICogY29uc3QgQ3VzdG9tU2luQ3VydmUgPSBUSFJFRS5DdXJ2ZS5jcmVhdGUoXG4gKiAgIGZ1bmN0aW9uIChzY2FsZSkgeyAvLyBjdXN0b20gY3VydmUgY29uc3RydWN0b3JcbiAqICAgICB0aGlzLnNjYWxlID0gKHNjYWxlID09PSB1bmRlZmluZWQpID8gMSA6IHNjYWxlO1xuICogICB9LFxuICpcbiAqICAgZnVuY3Rpb24gKHQpIHsgLy8gZ2V0UG9pbnQ6IHQgaXMgYmV0d2VlbiAwLTFcbiAqICAgICBjb25zdCB0eCA9IHQgKiAzIC0gMS41LFxuICogICAgIHR5ID0gTWF0aC5zaW4oIDIgKiBNYXRoLlBJICogdCApLFxuICogICAgIHR6ID0gMDtcbiAqXG4gKiAgICAgcmV0dXJuIG5ldyBUSFJFRS5WZWN0b3IzKHR4LCB0eSwgdHopLm11bHRpcGx5U2NhbGFyKHRoaXMuc2NhbGUpO1xuICogICB9XG4gKiApO1xuICpcbiAqIGNvbnN0IHBhdGggPSBuZXcgQ3VzdG9tU2luQ3VydmUoMTApO1xuICpcbiAqIG5ldyBUdWJlKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICBwYXRoOiBwYXRoXG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSlcbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cbmNsYXNzIFR1YmUgZXh0ZW5kcyBNZXNoQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlR1YmUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHBhdGg6IG5ldyBUSFJFRS5MaW5lQ3VydmUzKG5ldyBWZWN0b3IzKDAsIDAsIDApLCBuZXcgVmVjdG9yMygwLCAwLCAxKSksXG4gICAqICAgICBzZWdtZW50czogMjAsXG4gICAqICAgICByYWRpdXM6IDIsXG4gICAqICAgICByYWRpdXNTZWdtZW50czogOCxcbiAgICogICAgIGNsb3NlZDogZmFsc2VcbiAgICogICB9XG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5kZWZhdWx0cyxcbiAgICBnZW9tZXRyeToge1xuICAgICAgcGF0aDogbmV3IExpbmVDdXJ2ZTMobmV3IFZlY3RvcjMoMCwgMCwgMCksIG5ldyBWZWN0b3IzKDAsIDAsIDEpKSxcbiAgICAgIHNlZ21lbnRzOiAyMCxcbiAgICAgIHJhZGl1czogMixcbiAgICAgIHJhZGl1c1NlZ21lbnRzOiA4LFxuICAgICAgY2xvc2VkOiBmYWxzZVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlR1YmUjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiBbXG4gICAqICAgICAncGF0aCcsXG4gICAqICAgICAnc2VnbWVudHMnLFxuICAgKiAgICAgJ3JhZGl1cycsXG4gICAqICAgICAncmFkaXVzU2VnbWVudHMnLFxuICAgKiAgICAgJ2Nsb3NlZCdcbiAgICogICBdXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbXG4gICAgICAncGF0aCcsXG4gICAgICAnc2VnbWVudHMnLFxuICAgICAgJ3JhZGl1cycsXG4gICAgICAncmFkaXVzU2VnbWVudHMnLFxuICAgICAgJ2Nsb3NlZCdcbiAgICBdXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIFR1YmUuZGVmYXVsdHMsIFR1YmUuaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIHRoaXMuYnVpbGQocGFyYW1zKTtcbiAgICAgIHN1cGVyLndyYXAoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlR1YmVcbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICBjb25zdCBnZW9tZXRyeSA9IG5ldyAocGFyYW1zLmJ1ZmZlciA/IFR1YmVCdWZmZXJHZW9tZXRyeSA6IFR1YmVHZW9tZXRyeSkoXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkucGF0aCxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5zZWdtZW50cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5yYWRpdXMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkucmFkaXVzU2VnbWVudHMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkuY2xvc2VkXG4gICAgKTtcblxuICAgIHJldHVybiBnZW9tZXRyeTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBUdWJlXG59O1xuIiwiaW1wb3J0IHtPYmplY3QzRH0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuaW1wb3J0IHtDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvQ29tcG9uZW50JztcblxuLyoqXG4gKiBAY2xhc3MgR3JvdXBcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIFNvbWV0aW1lcyB5b3UgbmVlZCB0byBtYWtlIGdyb3VwcyBvZiBvYmplY3RzIChpdCdzIG5vdCBjb252ZW5pZW50bHkgdG8gYXBwbHkgdHJhbnNmb3JtcyB0byBlYWNoIG9iamVjdCB3aGVuIGNhbiBtYWtlIGp1c3Qgb25lIHRvIGEgZ3JvdXApLjxici8+XG4gKiBJbiBUaHJlZS5qcyB5b3UgbWFrZSBpdCB1c2luZyBgVEhSRUUuT2JqZWN0M0RgIGFuZCBpdCdzIGNoaWxkcmVuLiA8YnIvPjxici8+XG4gKiBJbiB3aHMuanMgd2UgaGF2ZSBgR3JvdXBgXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5BcHByb2FjaCAyIC0gQWRkaW5nIG9iamVjdHMgdG8gYW4gZW1wdHkgZ3JvdXA8L2NhcHRpb24+XG4gKiBjb25zdCBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG4gKiBjb25zdCBib3ggPSBuZXcgQm94KCk7XG4gKiBjb25zdCBncm91cCA9IG5ldyBHcm91cCgpO1xuICpcbiAqIHNwaGVyZS5hZGRUbyhncm91cCk7XG4gKiBib3guYWRkVG8oZ3JvdXApO1xuKiBAZXhhbXBsZSA8Y2FwdGlvbj5BcHByb2FjaCAyIC0gTWFraW5nIGEgZ3JvdXAgZnJvbSBvYmplY3RzPC9jYXB0aW9uPlxuICogY29uc3Qgc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuICogY29uc3QgYm94ID0gbmV3IEJveCgpO1xuICogY29uc3QgZ3JvdXAgPSBuZXcgR3JvdXAoYm94LCBzcGhlcmUpO1xuICogLy8gT1I6IGNvbnN0IGdyb3VwID0gbmV3IEdyb3VwKFtib3gsIHNwaGVyZV0pO1xuICovXG5jbGFzcyBHcm91cCBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvciguLi5vYmplY3RzKSB7XG4gICAgc3VwZXIoe30pO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBvYmogPSBvYmplY3RzW2ldO1xuXG4gICAgICBpZiAob2JqIGluc3RhbmNlb2YgQ29tcG9uZW50KSBvYmouYWRkVG8odGhpcyk7XG4gICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBPYmplY3QzRCkgdGhpcy5uYXRpdmUuYWRkKG9iaik7XG4gICAgfVxuICB9XG5cbiAgYnVpbGQoKSB7XG4gICAgcmV0dXJuIG5ldyBPYmplY3QzRCgpO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIEdyb3VwXG59O1xuIiwiLyoqIEBtb2R1bGUgY29tcG9uZW50cy9tZXNoZXMgKi9cbmV4cG9ydCAqIGZyb20gJy4vQm94JztcbmV4cG9ydCAqIGZyb20gJy4vQ2lyY2xlJztcbmV4cG9ydCAqIGZyb20gJy4vQ29uZSc7XG5leHBvcnQgKiBmcm9tICcuL0N5bGluZGVyJztcbmV4cG9ydCAqIGZyb20gJy4vRG9kZWNhaGVkcm9uJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0cnVkZSc7XG5leHBvcnQgKiBmcm9tICcuL0ljb3NhaGVkcm9uJztcbmV4cG9ydCAqIGZyb20gJy4vTGF0aGUnO1xuZXhwb3J0ICogZnJvbSAnLi9MaW5lJztcbmV4cG9ydCAqIGZyb20gJy4vSW1wb3J0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9PY3RhaGVkcm9uJztcbmV4cG9ydCAqIGZyb20gJy4vUGFyYW1ldHJpYyc7XG5leHBvcnQgKiBmcm9tICcuL1BsYW5lJztcbmV4cG9ydCAqIGZyb20gJy4vUG9seWhlZHJvbic7XG5leHBvcnQgKiBmcm9tICcuL1JpbmcnO1xuZXhwb3J0ICogZnJvbSAnLi9TaGFwZSc7XG5leHBvcnQgKiBmcm9tICcuL1NwaGVyZSc7XG5leHBvcnQgKiBmcm9tICcuL1RldHJhaGVkcm9uJztcbmV4cG9ydCAqIGZyb20gJy4vVGV4dCc7XG5leHBvcnQgKiBmcm9tICcuL1RvcnVzJztcbmV4cG9ydCAqIGZyb20gJy4vVG9ydXNrbm90JztcbmV4cG9ydCAqIGZyb20gJy4vVHViZSc7XG5leHBvcnQgKiBmcm9tICcuL0dyb3VwJztcbiIsIi8qKlxuICogQGNsYXNzIEVsZW1lbnRNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtPYmplY3R9IFtjb250YWluZXI9ZG9jdW1lbnQuYm9keV0gY29udGFpbmVyIGlzIHRoZSBET00gb2JqZWN0IHRvIHdoaWNoIGFwcGxpY2F0aW9uJ3MgY2FudmFzIHdpbGwgYmUgYWRkZWQgdG8uXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhbiBlbGVtZW50IG1vZHVsZSwgcGFzc2luZyBpdCB0byB0aGUgQXBwPC9jYXB0aW9uPlxuICogbmV3IEFwcChbXG4gKiAgIG5ldyBFbGVtZW50TW9kdWxlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAnKSlcbiAqIF0pO1xuICovXG5leHBvcnQgY2xhc3MgRWxlbWVudE1vZHVsZSB7XG4gIGNvbnN0cnVjdG9yKGNvbnRhaW5lciA9IGRvY3VtZW50LmJvZHkpIHtcbiAgICBpZiAoY29udGFpbmVyLmNvbnRhaW5lcikge1xuICAgICAgY29uc29sZS53YXJuKCdFbGVtZW50TW9kdWxlIG5vdyBhY2NlcHRzIG9ubHkgYXJndW1lbnQgd2hpY2ggaXMgYSBET00gb2JqZWN0LCBub3QgYSBwYXJhbXMgb2JqZWN0LicpO1xuICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXIuY29udGFpbmVyO1xuICAgIH0gZWxzZSB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcblxuICAgIHRoaXMuY3JlYXRlRWxlbWVudCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgY3JlYXRlRWxlbWVudFxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBjYW52YXMgZWxlbWVudC5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5FbGVtZW50TW9kdWxlXG4gICAqL1xuICBjcmVhdGVFbGVtZW50KCkge1xuICAgIHRoaXMuZWxlbWVudCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgIHRoaXMuZWxlbWVudC5jbGFzc05hbWUgPSAnd2hzLWFwcCc7XG4gICAgdGhpcy5lbGVtZW50LnN0eWxlLndpZHRoID0gJ2luaGVyaXQnO1xuICAgIHRoaXMuZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnaW5oZXJpdCc7XG4gICAgdGhpcy5lbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgfVxuXG4gIG1hbmFnZXIobWFuYWdlcikge1xuICAgIG1hbmFnZXIuc2V0KCdlbGVtZW50JywgdGhpcy5lbGVtZW50KTtcbiAgICBtYW5hZ2VyLnNldCgnY29udGFpbmVyJywgdGhpcy5jb250YWluZXIpO1xuICB9XG5cbiAgaW50ZWdyYXRlKHNlbGYpIHtcbiAgICBzZWxmLmNvbnRhaW5lci5hcHBlbmRDaGlsZChzZWxmLmVsZW1lbnQpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBXZWJHTFJlbmRlcmVyLFxuICBWZWN0b3IyXG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtMb29wfSBmcm9tICcuLi8uLi9jb3JlL0xvb3AnO1xuXG4vKipcbiAqIEBjbGFzcyBSZW5kZXJpbmdNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj4gQ3JlYXRpbmcgYSByZW5kZXJpbmcgbW9kdWxlIGFuZCBwYXNzaW5nIGl0IHRvIEFwcCdzIG1vZHVsZXM8L2NhcHRpb24+XG4gKiBuZXcgQXBwKFtcbiAqICAgbmV3IEVsZW1lbnRNb2R1bGUoKSxcbiAqICAgbmV3IFNjZW5lTW9kdWxlKCksXG4gKiAgIG5ldyBEZWZpbmVNb2R1bGUoJ2NhbWVyYScsIG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSh7XG4gKiAgICAgcG9zaXRpb246IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDYsIDE4KSxcbiAqICAgICBmYXI6IDEwMDAwXG4gKiAgIH0pKSxcbiAqICAgbmV3IFJlbmRlcmluZ01vZHVsZSh7XG4gKiAgICAgYmdDb2xvcjogMHgxNjIxMjksXG4gKlxuICogICAgIHJlbmRlcmVyOiB7XG4gKiAgICAgICBhbnRpYWxpYXM6IHRydWVcbiAqICAgICB9XG4gKiAgIH0sIHtzaGFkb3c6IHRydWV9KVxuICogXSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBSZW5kZXJpbmdNb2R1bGUge1xuICAvKipcbiAgICogYWRkaXRpb25hbFxuICAgKiBAZGVzY3JpcHRpb24gY29sbGVjdGlvbiBvZiBhZGRpdGlvbmFsIHNjcmlwdHNcbiAgICogQHN0YXRpY1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb3JlLkFwcCNhZGRpdGlvbmFsXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIHN0YXRpYyBhZGRpdGlvbmFsID0ge1xuICAgIHNoYWRvdyhyZW5kZXJlcikge1xuICAgICAgcmVuZGVyZXIuc2hhZG93TWFwLmVuYWJsZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBlbmFibGVkXG4gICAqIEBzdGF0aWNcbiAgICogQG1lbWJlciB7Qm9vbGVhbn0gbW9kdWxlOmNvcmUuQXBwI2VuYWJsZWRcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgZW5hYmxlZCA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30sIGFkZGl0aW9uYWwpIHtcbiAgICB0aGlzLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgd2lkdGg6IHdpbmRvdy5pbm5lcldpZHRoLFxuICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQsXG5cbiAgICAgIHJlc29sdXRpb246IG5ldyBWZWN0b3IyKDEsIDEpLFxuICAgICAgcGl4ZWxSYXRpbzogd2luZG93LmRldmljZVBpeGVsUmF0aW8sXG5cbiAgICAgIGJnQ29sb3I6IDB4MDAwMDAwLFxuICAgICAgYmdPcGFjaXR5OiAxLFxuXG4gICAgICByZW5kZXJlcjoge30sXG4gICAgICBmaXgoKSB7fVxuICAgIH0sIHBhcmFtcyk7XG5cbiAgICBjb25zdCB7XG4gICAgICBiZ0NvbG9yLFxuICAgICAgYmdPcGFjaXR5LFxuICAgICAgcmVuZGVyZXIsXG4gICAgICBwaXhlbFJhdGlvLFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICByZXNvbHV0aW9uLFxuICAgICAgZml4XG4gICAgfSA9IHRoaXMucGFyYW1zO1xuXG4gICAgdGhpcy5yZW5kZXJlciA9IG5ldyBXZWJHTFJlbmRlcmVyKHJlbmRlcmVyKTtcbiAgICB0aGlzLmVmZmVjdHMgPSBbXTtcblxuICAgIHRoaXMucmVuZGVyZXIuc2V0Q2xlYXJDb2xvcihcbiAgICAgIGJnQ29sb3IsXG4gICAgICBiZ09wYWNpdHlcbiAgICApO1xuXG4gICAgaWYgKHBpeGVsUmF0aW8pIHRoaXMucmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyhwaXhlbFJhdGlvKTtcblxuICAgIHRoaXMuc2V0U2l6ZShcbiAgICAgIE51bWJlcih3aWR0aCAqIHJlc29sdXRpb24ueCkudG9GaXhlZCgpLFxuICAgICAgTnVtYmVyKGhlaWdodCAqIHJlc29sdXRpb24ueSkudG9GaXhlZCgpXG4gICAgKTtcblxuICAgIGZvciAoY29uc3Qga2V5IGluIGFkZGl0aW9uYWwpXG4gICAgICBpZiAoYWRkaXRpb25hbFtrZXldKSB0aGlzLmFwcGx5QWRkaXRpb25hbChrZXkpO1xuXG4gICAgZml4KHRoaXMucmVuZGVyZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYXBwbHlBZGRpdGlvbmFsXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBseSBhZGRpdGlvbmFsIHNjcmlwdCBmcm9tIFJlbmRlcmluZ01vZHVsZS5hZGRpdGlvbmFsXG4gICAqIEBwYXJhbSB7U3Rpcm5nfSBuYW1lIFNjcmlwdCBuYW1lXG4gICAqIEByZXR1cm4ge3RoaXN9XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVuZGVyaW5nTW9kdWxlXG4gICAqL1xuICBhcHBseUFkZGl0aW9uYWwobmFtZSkge1xuICAgIFJlbmRlcmluZ01vZHVsZS5hZGRpdGlvbmFsW25hbWVdLmFwcGx5KHRoaXMsIFt0aGlzLnJlbmRlcmVyXSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBpbnRlZ3JhdGVSZW5kZXJlclxuICAgKiBAZGVzY3JpcHRpb24gSW50ZWdyYXRlIHJlbmRlcmVyXG4gICAqIEBwYXJhbSB7Tm9kZUVsZW1lbnR9IGVsZW1lbnQgRE9NIG9iamVjdFxuICAgKiBAcGFyYW0ge1RIUkVFLlNjZW5lfSBzY2VuZSB1c2VkIHNjZW5lXG4gICAqIEBwYXJhbSB7VEhSRUUuQ2FtZXJhfSBjYW1lcmEgdXNlZCBjYW1lcmFcbiAgICogQHJldHVybiB7TG9vcH0gcmVuZGVyTG9vcFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlJlbmRlcmluZ01vZHVsZVxuICAgKi9cbiAgaW50ZWdyYXRlUmVuZGVyZXIoZWxlbWVudCwgc2NlbmUsIGNhbWVyYSkge1xuICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcbiAgICB0aGlzLmNhbWVyYSA9IGNhbWVyYTtcbiAgICB0aGlzLmF0dGFjaFRvQ2FudmFzKGVsZW1lbnQpO1xuXG4gICAgcmV0dXJuIG5ldyBMb29wKCgpID0+IHRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhKSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBlZmZlY3RcbiAgICogQGRlc2NyaXB0aW9uIEFkZCB0aHJlZS5qcyBlZmZlY3RcbiAgICogQHBhcmFtIHtPYmplY3R9IGVmZmVjdCB0aHJlZS5qcyBlZmZlY3RcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gZWZmZWN0TG9vcCB1cGRhdGUgZnVuY3Rpb24gZm9yIGVmZmVjdFxuICAgKiBAcmV0dXJuIHt0aGlzfVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlJlbmRlcmluZ01vZHVsZVxuICAgKi9cbiAgZWZmZWN0KGVmZmVjdCwgZWZmZWN0TG9vcCA9ICgpID0+IHtcbiAgICBlZmZlY3QucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhKTtcbiAgfSkge1xuICAgIHRoaXMucmVuZGVyTG9vcC5zdG9wKCk7XG5cbiAgICBjb25zdCBzaXplID0gdGhpcy5yZW5kZXJlci5nZXRTaXplKCk7XG4gICAgZWZmZWN0LnNldFNpemUoc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpO1xuXG4gICAgY29uc3QgbG9vcCA9IG5ldyBMb29wKGVmZmVjdExvb3ApO1xuXG4gICAgdGhpcy5lZmZlY3RzLnB1c2gobG9vcCk7XG4gICAgaWYgKHRoaXMuZW5hYmxlZCkgbG9vcC5zdGFydCh0aGlzLmFwcCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHNldFNpemVcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZSByZW5kZXIgdGFyZ2V0IHdpZHRoIGFuZCBoZWlnaHQuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICAgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVuZGVyaW5nTW9kdWxlXG4gICAqL1xuICBzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICBpZiAodGhpcy5yZW5kZXJlcikgdGhpcy5yZW5kZXJlci5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYXR0YWNoVG9DYW52YXNcbiAgICogQGRlc2NyaXB0aW9uIEF0dGFjaCByZW5kZXJlci5kb21FbGVtZW50IHRvIGVsZW1lbnRcbiAgICogQHBhcmFtIHtOb2RlRWxlbWVudH0gZWxlbWVudCBET00gb2JqZWN0XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVuZGVyaW5nTW9kdWxlXG4gICAqL1xuICBhdHRhY2hUb0NhbnZhcyhlbGVtZW50KSB7XG4gICAgY29uc3QgY2FudmFzID0gdGhpcy5yZW5kZXJlci5kb21FbGVtZW50O1xuXG4gICAgLy8gYXR0YWNoIHRvIG5ldyBwYXJlbnQgd29ybGQgZG9tXG4gICAgZWxlbWVudC5hcHBlbmRDaGlsZChjYW52YXMpO1xuICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc3RvcFxuICAgKiBAZGVzY3JpcHRpb24gU3RvcHMgcmVuZGVyTG9vcCBhbmQgZWZmZWN0IGxvb3BzXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVuZGVyaW5nTW9kdWxlXG4gICAqL1xuICBzdG9wKCkge1xuICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuICAgIHRoaXMucmVuZGVyTG9vcC5zdG9wKCk7XG4gICAgdGhpcy5lZmZlY3RzLmZvckVhY2gobG9vcCA9PiBsb29wLnN0b3AoKSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBwbGF5XG4gICAqIEBkZXNjcmlwdGlvbiBSZXN1bWVzIHJlbmRlckxvb3AgYW5kIGVmZmVjdCBsb29wc1xuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlJlbmRlcmluZ01vZHVsZVxuICAgKi9cbiAgcGxheSgpIHtcbiAgICB0aGlzLmVuYWJsZWQgPSB0cnVlO1xuICAgIHRoaXMucmVuZGVyTG9vcC5zdGFydCgpO1xuICAgIHRoaXMuZWZmZWN0cy5mb3JFYWNoKGxvb3AgPT4gbG9vcC5zdGFydCgpKTtcbiAgfVxuXG4gIG1hbmFnZXIobWFuYWdlcikge1xuICAgIG1hbmFnZXIuZGVmaW5lKCdyZW5kZXJpbmcnKTtcbiAgICBtYW5hZ2VyLnNldCgncmVuZGVyZXInLCB0aGlzLnJlbmRlcmVyKTtcblxuICAgIHRoaXMuYXBwID0gbWFuYWdlci5oYW5kbGVyO1xuXG4gICAgdGhpcy5yZW5kZXJMb29wID0gdGhpcy5pbnRlZ3JhdGVSZW5kZXJlcihcbiAgICAgIG1hbmFnZXIuZ2V0KCdlbGVtZW50JyksXG4gICAgICBtYW5hZ2VyLmdldCgnc2NlbmUnKSxcbiAgICAgIG1hbmFnZXIuZ2V0KCdjYW1lcmEnKS5uYXRpdmVcbiAgICApO1xuXG4gICAgbWFuYWdlci51cGRhdGUoe1xuICAgICAgZWxlbWVudDogZWxlbWVudCA9PiB7XG4gICAgICAgIHRoaXMuYXR0YWNoVG9DYW52YXMoZWxlbWVudCk7XG4gICAgICB9LFxuICAgICAgc2NlbmU6IHNjZW5lID0+IHtcbiAgICAgICAgdGhpcy5zY2VuZSA9IHNjZW5lO1xuICAgICAgfSxcbiAgICAgIGNhbWVyYTogY2FtZXJhID0+IHtcbiAgICAgICAgdGhpcy5jYW1lcmEgPSBjYW1lcmEubmF0aXZlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaW50ZWdyYXRlKHNlbGYpIHtcbiAgICBzZWxmLnJlbmRlckxvb3Auc3RhcnQodGhpcyk7XG4gICAgc2VsZi5lZmZlY3RzLmZvckVhY2gobG9vcCA9PiBsb29wLnN0YXJ0KHRoaXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGRpc3Bvc2VcbiAgICogQGRlc2NyaXB0aW9uIERpc3Bvc2UgcmVuZGVyaW5nIGNvbnRleHRcbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5SZW5kZXJpbmdNb2R1bGVcbiAgICovXG4gIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5zdG9wKCk7XG4gICAgdGhpcy5yZW5kZXJlci5mb3JjZUNvbnRleHRMb3NzKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIFNjZW5lLFxufSBmcm9tICd0aHJlZSc7XG5cbmNvbnN0IFNZTUJPTF9DSElMRFJFTl9GT1JfU0NFTkUgPSBTeW1ib2woJ1NZTUJPTF9DSElMRFJFTl9GT1JfU0NFTkUnKVxuXG4vKipcbiAqIEBjbGFzcyBTY2VuZU1vZHVsZVxuICogQGNhdGVnb3J5IG1vZHVsZXMvYXBwXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFt3aWxsU2NlbmVCZVJlcGxhY2VkPWZhbHNlXSB3aWxsU2NlbmVCZVJlcGxhY2VkIHNob3VsZCBiZSB0cnVlIG9ubHkgaWYgeW91IGFyZSBnb2luZyB0byBvdmVyd3JpdGUgc2NlbmUgZGVwZW5kZW5jeSBldmVuIHdpdGhvdXQgdGhlIHVzZSBvZiBkZWZhdWx0IG9uZS5cbiAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHBcbiAqL1xuZXhwb3J0IGNsYXNzIFNjZW5lTW9kdWxlIHtcbiAgY29uc3RydWN0b3Iod2lsbFNjZW5lQmVSZXBsYWNlZCA9IGZhbHNlKSB7XG4gICAgdGhpcy5zY2VuZSA9IHdpbGxTY2VuZUJlUmVwbGFjZWQgPyBudWxsIDogbmV3IFNjZW5lKCk7XG4gIH1cblxuICBtYW5hZ2VyKG1hbmFnZXIpIHtcbiAgICBtYW5hZ2VyLnNldCgnc2NlbmUnLCB0aGlzLnNjZW5lKTtcbiAgfVxuXG4gIGludGVncmF0ZShzZWxmKSB7XG4gICAgT2JqZWN0LmFzc2lnbihcbiAgICAgIHRoaXMsXG4gICAgICB7XG4gICAgICAgIGFzeW5jIGFkZChvYmplY3QpIHtcbiAgICAgICAgICBpZiAob2JqZWN0LnBhcmVudCkgYXdhaXQgb2JqZWN0LnBhcmVudC5yZW1vdmUob2JqZWN0KTtcbiAgICAgIFxuICAgICAgICAgIGF3YWl0IG9iamVjdC53YWl0KCk7XG4gICAgICBcbiAgICAgICAgICBpZiAoIW9iamVjdC5uYXRpdmUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb21wb3NpdGlvbkVycm9yKFxuICAgICAgICAgICAgICAnU2NlbmVNb2R1bGUnLFxuICAgICAgICAgICAgICAndGhlcmUgaXMgbm8gb2JqZWN0Lm5hdGl2ZScsXG4gICAgICAgICAgICAgIHRoaXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgXG4gICAgICAgICAgb2JqZWN0LnBhcmVudCA9IHRoaXM7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hcHBseUJyaWRnZSh7b25BZGQ6IG9iamVjdH0pLm9uQWRkO1xuICAgICAgICAgIHNlbGYuc2NlbmUuYWRkKG9iamVjdC5uYXRpdmUpO1xuICAgICAgICAgIHRoaXMuY2hpbGRyZW4ucHVzaChvYmplY3QpO1xuICAgICAgXG4gICAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgcmVtb3ZlKG9iamVjdCkge1xuICAgICAgICAgIGlmIChvYmplY3QucGFyZW50ICE9PSB0aGlzKSByZXR1cm47XG4gICAgICBcbiAgICAgICAgICBhd2FpdCBvYmplY3Qud2FpdCgpO1xuICAgICAgICAgIHRoaXMuYXBwbHlCcmlkZ2Uoe29uUmVtb3ZlOiBvYmplY3R9KTtcbiAgICAgIFxuICAgICAgICAgIG9iamVjdC5wYXJlbnQgPSBudWxsO1xuICAgICAgICAgIHNlbGYuc2NlbmUucmVtb3ZlKG9iamVjdC5uYXRpdmUpO1xuICAgICAgICAgIHRoaXMuY2hpbGRyZW4uc3BsaWNlKHRoaXMuY2hpbGRyZW4uaW5kZXhPZihvYmplY3QpLCAxKTtcbiAgICAgICAgfSxcbiAgICAgICAgX3NldFNjZW5lKHNjZW5lKSB7XG4gICAgICAgICAgdGhpcy5jaGlsZHJlbiA9IHNjZW5lW1NZTUJPTF9DSElMRFJFTl9GT1JfU0NFTkVdID0gc2NlbmVbU1lNQk9MX0NISUxEUkVOX0ZPUl9TQ0VORV0gfHwgW11cbiAgICAgICAgICBzZWxmLnNjZW5lID0gc2NlbmU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldFNjZW5lKHNjZW5lKSB7XG4gICAgICAgICAgdGhpcy5fc2V0U2NlbmUoc2NlbmUpO1xuICAgICAgICAgIHRoaXMubWFuYWdlci5zZXQoJ3NjZW5lJywgc2NlbmUpO1xuICAgICAgICB9LFxuICAgICAgICBnZXRTY2VuZSgpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZi5zY2VuZTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBpZiAoc2VsZi5zY2VuZSkgdGhpcy5fc2V0U2NlbmUoc2VsZi5zY2VuZSk7XG4gIH1cbn1cbiIsIi8vIGltcG9ydCB7YWRkUmVzaXplTGlzdGVuZXJ9IGZyb20gJ2RldGVjdC1lbGVtZW50LXJlc2l6ZSc7XG5cbi8qKlxuICogQGNsYXNzIFJlc2l6ZU1vZHVsZVxuICogQGNhdGVnb3J5IG1vZHVsZXMvYXBwXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtcz17YXV0bzogdHJ1ZX1dIC0gSWYgYXV0byBpcyBzZXQgdG8gdHJ1ZSAtIHJlc2l6ZSB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIGNvbnRhaW5lciByZXNpemVzXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNpemVNb2R1bGUge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHRoaXMucGFyYW1zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBhdXRvOiB0cnVlXG4gICAgfSwgcGFyYW1zKTtcblxuICAgIHRoaXMuY2FsbGJhY2tzID0gW3RoaXMuc2V0U2l6ZS5iaW5kKHRoaXMpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZnVuY3Rpb24gc2V0U2l6ZVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgcHJvdmlkZWQgd2lkdGggJiBoZWlnaHQgdG8gdGhlIHJlbmRlcmVyIG9iamVjdC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFt3aWR0aD0xXSAtIFRoZSBwcm9taXNlIHRoYXQgc2hvdWxkIGJlIGFkZGVkIHRvIGEgcXVldWUuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbaGVpZ2h0PTFdIC0gdGhhdCBpcyByZXNvbHZlZCB3aGVuIGFsbCBwcm9taXNlcyBjb21wbGV0ZWQuXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVzaXplTW9kdWxlXG4gICAqL1xuICBzZXRTaXplKHdpZHRoID0gMSwgaGVpZ2h0ID0gMSkge1xuICAgIHRoaXMuY2FtZXJhLm5hdGl2ZS5hc3BlY3QgPSB3aWR0aCAvIGhlaWdodDtcbiAgICB0aGlzLmNhbWVyYS5uYXRpdmUudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG4gICAgaWYgKHRoaXMucmVuZGVyaW5nKSB0aGlzLnJlbmRlcmluZy5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgdHJpZ2dlclxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIFRyaWdnZXJzIHJlc2l6ZSB3aGVuIGNhbGxlZC4gd2lkdGggJiBoZWlnaHQgYXJlIGRldGVybWluZWQgYXV0b21hdGljYWxseVxuICAgKiBUaGlzIGludm9rZXMgZWFjaCBjYWxsYmFja3Mgd2l0aCB0aGUgbmV3IHdpZHRoIGFuZCBoZWlnaHQgYXMgcGFyYW1zXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVzaXplTW9kdWxlXG4gICAqL1xuICB0cmlnZ2VyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbnRhaW5lcjoge1xuICAgICAgICBvZmZzZXRXaWR0aCxcbiAgICAgICAgb2Zmc2V0SGVpZ2h0XG4gICAgICB9LFxuICAgICAgcmVzb2x1dGlvblxuICAgIH0gPSB0aGlzO1xuXG4gICAgY29uc3Qgd2lkdGggPSBOdW1iZXIob2Zmc2V0V2lkdGggKiByZXNvbHV0aW9uLngpLnRvRml4ZWQoKTtcbiAgICBjb25zdCBoZWlnaHQgPSBOdW1iZXIob2Zmc2V0SGVpZ2h0ICogcmVzb2x1dGlvbi55KS50b0ZpeGVkKCk7XG5cbiAgICB0aGlzLmNhbGxiYWNrcy5mb3JFYWNoKGNiID0+IHtcbiAgICAgIGNiKHdpZHRoLCBoZWlnaHQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYWRkQXV0b3Jlc2l6ZVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgbW9kdWxlIHRvIGF1dG9yZXNpemUsIHRoaXMgYWRkcyBhbiBldmVudCBsaXN0ZW5lIG9uIHdpbmRvdyByZXNpemUgdG8gdHJpZ2dlciB0aGUgcmVzaXplXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVzaXplTW9kdWxlXG4gICAqL1xuICBhZGRBdXRvcmVzaXplKCkge1xuICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5nZXRDb250YWluZXIoKTtcbiAgICB0aGlzLnJlc29sdXRpb24gPSB0aGlzLmdldFJlc29sdXRpb24oKTtcblxuICAgIGlmICh0aGlzLnBhcmFtcy5hdXRvKSB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy50cmlnZ2VyLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYWRkQ2FsbGJhY2tcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBBZGRzIGEgY2FsbCBiYWNrIGZ1bmN0aW9uIHRvIHRoZSBleGlzdGluZyBjYWxsYmFja3MgbGlzdC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBhZGRcbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5SZXNpemVNb2R1bGVcbiAgICovXG4gIGFkZENhbGxiYWNrKGZ1bmMpIHtcbiAgICB0aGlzLmNhbGxiYWNrcy5wdXNoKGZ1bmMpO1xuICB9XG5cbiAgbWFuYWdlcihtYW5hZ2VyKSB7XG4gICAgbWFuYWdlci5kZWZpbmUoJ3Jlc2l6ZScpO1xuXG4gICAgdGhpcy5yZW5kZXJpbmcgPSBtYW5hZ2VyLmdldCgncmVuZGVyZXInKTtcbiAgICB0aGlzLmNhbWVyYSA9IG1hbmFnZXIuZ2V0KCdjYW1lcmEnKTtcblxuICAgIHRoaXMuZ2V0UmVzb2x1dGlvbiA9ICgpID0+IG1hbmFnZXIudXNlKCdyZW5kZXJpbmcnKS5wYXJhbXMucmVzb2x1dGlvbjtcbiAgICB0aGlzLmdldENvbnRhaW5lciA9ICgpID0+IG1hbmFnZXIuZ2V0KCdjb250YWluZXInKTtcblxuICAgIG1hbmFnZXIudXBkYXRlKHtcbiAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyID0+IHtcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZEF1dG9yZXNpemUoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwsIFVuaWZvcm0gfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmNvbnN0IGZyYWdtZW50ID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0UHJldmlvdXNMdW07XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdEN1cnJlbnRMdW07XFxyXFxudW5pZm9ybSBmbG9hdCBtaW5MdW1pbmFuY2U7XFxyXFxudW5pZm9ybSBmbG9hdCBkZWx0YTtcXHJcXG51bmlmb3JtIGZsb2F0IHRhdTtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHRmbG9hdCBwcmV2aW91c0x1bSA9IHRleHR1cmUyRCh0UHJldmlvdXNMdW0sIHZVdiwgTUlQX0xFVkVMXzFYMSkucjtcXHJcXG5cXHRmbG9hdCBjdXJyZW50THVtID0gdGV4dHVyZTJEKHRDdXJyZW50THVtLCB2VXYsIE1JUF9MRVZFTF8xWDEpLnI7XFxyXFxuXFxyXFxuXFx0cHJldmlvdXNMdW0gPSBtYXgobWluTHVtaW5hbmNlLCBwcmV2aW91c0x1bSk7XFxyXFxuXFx0Y3VycmVudEx1bSA9IG1heChtaW5MdW1pbmFuY2UsIGN1cnJlbnRMdW0pO1xcclxcblxcclxcblxcdC8vIEFkYXB0IHRoZSBsdW1pbmFuY2UgdXNpbmcgUGF0dGFuYWlrJ3MgdGVjaG5pcXVlLlxcclxcblxcdGZsb2F0IGFkYXB0ZWRMdW0gPSBwcmV2aW91c0x1bSArIChjdXJyZW50THVtIC0gcHJldmlvdXNMdW0pICogKDEuMCAtIGV4cCgtZGVsdGEgKiB0YXUpKTtcXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IuciA9IGFkYXB0ZWRMdW07XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5jb25zdCB2ZXJ0ZXggPSBcInZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5cclxuLyoqXHJcbiAqIEFuIGFkYXB0aXZlIGx1bWlub3NpdHkgc2hhZGVyIG1hdGVyaWFsLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBBZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBhZGFwdGl2ZSBsdW1pbm9zaXR5IG1hdGVyaWFsLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlcih7XHJcblxyXG5cdFx0XHR0eXBlOiBcIkFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsXCIsXHJcblxyXG5cdFx0XHRkZWZpbmVzOiB7XHJcblxyXG5cdFx0XHRcdE1JUF9MRVZFTF8xWDE6IFwiMC4wXCJcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHR1bmlmb3Jtczoge1xyXG5cclxuXHRcdFx0XHR0UHJldmlvdXNMdW06IG5ldyBVbmlmb3JtKG51bGwpLFxyXG5cdFx0XHRcdHRDdXJyZW50THVtOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHRcdFx0XHRtaW5MdW1pbmFuY2U6IG5ldyBVbmlmb3JtKDAuMDEpLFxyXG5cdFx0XHRcdGRlbHRhOiBuZXcgVW5pZm9ybSgwLjApLFxyXG5cdFx0XHRcdHRhdTogbmV3IFVuaWZvcm0oMS4wKVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCxcclxuXHRcdFx0dmVydGV4U2hhZGVyOiB2ZXJ0ZXgsXHJcblxyXG5cdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhUZXN0OiBmYWxzZVxyXG5cclxuXHRcdH0pO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFNoYWRlck1hdGVyaWFsLCBVbmlmb3JtIH0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5jb25zdCBmcmFnbWVudCA9IFwidW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdERlcHRoO1xcclxcblxcclxcbnVuaWZvcm0gZmxvYXQgZm9jdXM7XFxyXFxudW5pZm9ybSBmbG9hdCBkb2Y7XFxyXFxudW5pZm9ybSBmbG9hdCBhc3BlY3Q7XFxyXFxudW5pZm9ybSBmbG9hdCBhcGVydHVyZTtcXHJcXG51bmlmb3JtIGZsb2F0IG1heEJsdXI7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG4jaWZuZGVmIFVTRV9MT0dERVBUSEJVRlxcclxcblxcclxcblxcdCNpbmNsdWRlIDxwYWNraW5nPlxcclxcblxcclxcblxcdHVuaWZvcm0gZmxvYXQgY2FtZXJhTmVhcjtcXHJcXG5cXHR1bmlmb3JtIGZsb2F0IGNhbWVyYUZhcjtcXHJcXG5cXHJcXG5cXHRmbG9hdCByZWFkRGVwdGgoc2FtcGxlcjJEIGRlcHRoU2FtcGxlciwgdmVjMiBjb29yZCkge1xcclxcblxcclxcblxcdFxcdGZsb2F0IGZyYWdDb29yZFogPSB0ZXh0dXJlMkQoZGVwdGhTYW1wbGVyLCBjb29yZCkueDtcXHJcXG5cXHRcXHRmbG9hdCB2aWV3WiA9IHBlcnNwZWN0aXZlRGVwdGhUb1ZpZXdaKGZyYWdDb29yZFosIGNhbWVyYU5lYXIsIGNhbWVyYUZhcik7XFxyXFxuXFxyXFxuXFx0XFx0cmV0dXJuIHZpZXdaVG9PcnRob2dyYXBoaWNEZXB0aCh2aWV3WiwgY2FtZXJhTmVhciwgY2FtZXJhRmFyKTtcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZlYzIgYXNwZWN0Q29ycmVjdGlvbiA9IHZlYzIoMS4wLCBhc3BlY3QpO1xcclxcblxcclxcblxcdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBkZXB0aCA9IHRleHR1cmUyRCh0RGVwdGgsIHZVdikueDtcXHJcXG5cXHJcXG5cXHQjZWxzZVxcclxcblxcclxcblxcdFxcdGZsb2F0IGRlcHRoID0gcmVhZERlcHRoKHREZXB0aCwgdlV2KTtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRmbG9hdCBmb2N1c05lYXIgPSBjbGFtcChmb2N1cyAtIGRvZiwgMC4wLCAxLjApO1xcclxcblxcdGZsb2F0IGZvY3VzRmFyID0gY2xhbXAoZm9jdXMgKyBkb2YsIDAuMCwgMS4wKTtcXHJcXG5cXHJcXG5cXHQvLyBDYWxjdWxhdGUgYSBEb0YgbWFzay5cXHJcXG5cXHRmbG9hdCBsb3cgPSBzdGVwKGRlcHRoLCBmb2N1c05lYXIpO1xcclxcblxcdGZsb2F0IGhpZ2ggPSBzdGVwKGZvY3VzRmFyLCBkZXB0aCk7XFxyXFxuXFxyXFxuXFx0ZmxvYXQgZmFjdG9yID0gKGRlcHRoIC0gZm9jdXNOZWFyKSAqIGxvdyArIChkZXB0aCAtIGZvY3VzRmFyKSAqIGhpZ2g7XFxyXFxuXFxyXFxuXFx0dmVjMiBkb2ZCbHVyID0gdmVjMihjbGFtcChmYWN0b3IgKiBhcGVydHVyZSwgLW1heEJsdXIsIG1heEJsdXIpKTtcXHJcXG5cXHJcXG5cXHR2ZWMyIGRvZmJsdXI5ID0gZG9mQmx1ciAqIDAuOTtcXHJcXG5cXHR2ZWMyIGRvZmJsdXI3ID0gZG9mQmx1ciAqIDAuNztcXHJcXG5cXHR2ZWMyIGRvZmJsdXI0ID0gZG9mQmx1ciAqIDAuNDtcXHJcXG5cXHJcXG5cXHR2ZWM0IGNvbG9yID0gdmVjNCgwLjApO1xcclxcblxcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2KTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjAsICAgMC40ICkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMTUsICAwLjM3KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4yOSwgIDAuMjkpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKC0wLjM3LCAgMC4xNSkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuNDAsICAwLjAgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4zNywgLTAuMTUpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjI5LCAtMC4yOSkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMTUsIC0wLjM3KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4wLCAgLTAuNCApICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKC0wLjE1LCAgMC4zNykgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMjksICAwLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4zNywgIDAuMTUpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKC0wLjQsICAgMC4wICkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMzcsIC0wLjE1KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMigtMC4yOSwgLTAuMjkpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjE1LCAtMC4zNykgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMTUsICAwLjM3KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMzcsICAwLjE1KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMzcsIC0wLjE1KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMTUsIC0wLjM3KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMTUsICAwLjM3KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMzcsICAwLjE1KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMzcsIC0wLjE1KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMTUsIC0wLjM3KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMjksICAwLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuNDAsICAwLjAgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMjksIC0wLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMCwgIC0wLjQgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMjksICAwLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuNCwgICAwLjAgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMjksIC0wLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMCwgICAwLjQgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMjksICAwLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuNCwgICAwLjAgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMjksIC0wLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMCwgIC0wLjQgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMjksICAwLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuNCwgICAwLjAgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMjksIC0wLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMCwgICAwLjQgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvciA9IGNvbG9yIC8gNDEuMDtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcbmNvbnN0IHZlcnRleCA9IFwidmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcblxyXG4vKipcclxuICogRGVwdGggb2YgRmllbGQgc2hhZGVyIChCb2tlaCkuXHJcbiAqXHJcbiAqIE9yaWdpbmFsIHNoYWRlciBjb2RlIGJ5IE1hcnRpbnMgVXBpdGlzOlxyXG4gKiAgaHR0cDovL2FydG1hcnRpbnNoLmJsb2dzcG90LmNvbS8yMDEwLzAyL2dsc2wtbGVucy1ibHVyLWZpbHRlci13aXRoLWJva2VoLmh0bWxcclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgQm9rZWhNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBib2tlaCBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UGVyc3BlY3RpdmVDYW1lcmF9IFtjYW1lcmFdIC0gQSBjYW1lcmEuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5mb2N1cz0xLjBdIC0gVGhlIGZvY3VzIGRpc3RhbmNlLCBjb3JyZXNwb25kcyBkaXJlY3RseSB3aXRoIHRoZSBzY2VuZSBkZXB0aC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZG9mPTAuMDJdIC0gRGVwdGggb2YgZmllbGQuIEFuIGFyZWEgaW4gZnJvbnQgb2YgYW5kIGJlaGluZCB0aGUgZm9jdXMgcG9pbnQgdGhhdCBzdGlsbCBhcHBlYXJzIHNoYXJwLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5hcGVydHVyZT0wLjAyNV0gLSBDYW1lcmEgYXBlcnR1cmUgc2NhbGUuIEJpZ2dlciB2YWx1ZXMgZm9yIHN0cm9uZ2VyIGJsdXIgYW5kIHNoYWxsb3dlciBkZXB0aCBvZiBmaWVsZC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWF4Qmx1cj0xLjBdIC0gTWF4aW11bSBibHVyIHN0cmVuZ3RoLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcihjYW1lcmEsIG9wdGlvbnMgPSB7fSkge1xyXG5cclxuXHRcdGNvbnN0IHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7XHJcblx0XHRcdGZvY3VzOiAxLjAsXHJcblx0XHRcdGRvZjogMC4wMixcclxuXHRcdFx0YXBlcnR1cmU6IDAuMDI1LFxyXG5cdFx0XHRtYXhCbHVyOiAxLjBcclxuXHRcdH0sIG9wdGlvbnMpO1xyXG5cclxuXHRcdHN1cGVyKHtcclxuXHJcblx0XHRcdHR5cGU6IFwiQm9rZWhNYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0dW5pZm9ybXM6IHtcclxuXHJcblx0XHRcdFx0Y2FtZXJhTmVhcjogbmV3IFVuaWZvcm0oMC4xKSxcclxuXHRcdFx0XHRjYW1lcmFGYXI6IG5ldyBVbmlmb3JtKDIwMDApLFxyXG5cdFx0XHRcdGFzcGVjdDogbmV3IFVuaWZvcm0oMS4wKSxcclxuXHJcblx0XHRcdFx0dERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxyXG5cdFx0XHRcdHREZXB0aDogbmV3IFVuaWZvcm0obnVsbCksXHJcblxyXG5cdFx0XHRcdGZvY3VzOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5mb2N1cyksXHJcblx0XHRcdFx0ZG9mOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5kb2YpLFxyXG5cdFx0XHRcdGFwZXJ0dXJlOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5hcGVydHVyZSksXHJcblx0XHRcdFx0bWF4Qmx1cjogbmV3IFVuaWZvcm0oc2V0dGluZ3MubWF4Qmx1cilcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQsXHJcblx0XHRcdHZlcnRleFNoYWRlcjogdmVydGV4LFxyXG5cclxuXHRcdFx0ZGVwdGhXcml0ZTogZmFsc2UsXHJcblx0XHRcdGRlcHRoVGVzdDogZmFsc2VcclxuXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLmFkb3B0Q2FtZXJhU2V0dGluZ3MoY2FtZXJhKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZG9wdHMgdGhlIHNldHRpbmdzIG9mIHRoZSBnaXZlbiBjYW1lcmEuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1BlcnNwZWN0aXZlQ2FtZXJhfSBbY2FtZXJhPW51bGxdIC0gQSBjYW1lcmEuXHJcblx0ICovXHJcblxyXG5cdGFkb3B0Q2FtZXJhU2V0dGluZ3MoY2FtZXJhID0gbnVsbCkge1xyXG5cclxuXHRcdGlmKGNhbWVyYSAhPT0gbnVsbCkge1xyXG5cclxuXHRcdFx0dGhpcy51bmlmb3Jtcy5jYW1lcmFOZWFyLnZhbHVlID0gY2FtZXJhLm5lYXI7XHJcblx0XHRcdHRoaXMudW5pZm9ybXMuY2FtZXJhRmFyLnZhbHVlID0gY2FtZXJhLmZhcjtcclxuXHRcdFx0dGhpcy51bmlmb3Jtcy5hc3BlY3QudmFsdWUgPSBjYW1lcmEuYXNwZWN0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBTaGFkZXJNYXRlcmlhbCwgVW5pZm9ybSwgVmVjdG9yMiB9IGZyb20gXCJ0aHJlZVwiO1xyXG5cclxuY29uc3QgZnJhZ21lbnQgPSBcInVuaWZvcm0gc2FtcGxlcjJEIHREaWZmdXNlO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxudmFyeWluZyB2ZWM0IHZPZmZzZXRbM107XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdGNvbnN0IHZlYzIgdGhyZXNob2xkID0gdmVjMihFREdFX1RIUkVTSE9MRCk7XFxyXFxuXFxyXFxuXFx0Ly8gQ2FsY3VsYXRlIGNvbG9yIGRlbHRhcy5cXHJcXG5cXHR2ZWM0IGRlbHRhO1xcclxcblxcdHZlYzMgYyA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2KS5yZ2I7XFxyXFxuXFxyXFxuXFx0dmVjMyBjTGVmdCA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdk9mZnNldFswXS54eSkucmdiO1xcclxcblxcdHZlYzMgdCA9IGFicyhjIC0gY0xlZnQpO1xcclxcblxcdGRlbHRhLnggPSBtYXgobWF4KHQuciwgdC5nKSwgdC5iKTtcXHJcXG5cXHJcXG5cXHR2ZWMzIGNUb3AgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZPZmZzZXRbMF0uencpLnJnYjtcXHJcXG5cXHR0ID0gYWJzKGMgLSBjVG9wKTtcXHJcXG5cXHRkZWx0YS55ID0gbWF4KG1heCh0LnIsIHQuZyksIHQuYik7XFxyXFxuXFxyXFxuXFx0Ly8gV2UgZG8gdGhlIHVzdWFsIHRocmVzaG9sZC5cXHJcXG5cXHR2ZWMyIGVkZ2VzID0gc3RlcCh0aHJlc2hvbGQsIGRlbHRhLnh5KTtcXHJcXG5cXHJcXG5cXHQvLyBUaGVuIGRpc2NhcmQgaWYgdGhlcmUgaXMgbm8gZWRnZS5cXHJcXG5cXHRpZihkb3QoZWRnZXMsIHZlYzIoMS4wKSkgPT0gMC4wKSB7XFxyXFxuXFxyXFxuXFx0XFx0ZGlzY2FyZDtcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0Ly8gQ2FsY3VsYXRlIHJpZ2h0IGFuZCBib3R0b20gZGVsdGFzLlxcclxcblxcdHZlYzMgY1JpZ2h0ID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2T2Zmc2V0WzFdLnh5KS5yZ2I7XFxyXFxuXFx0dCA9IGFicyhjIC0gY1JpZ2h0KTtcXHJcXG5cXHRkZWx0YS56ID0gbWF4KG1heCh0LnIsIHQuZyksIHQuYik7XFxyXFxuXFxyXFxuXFx0dmVjMyBjQm90dG9tID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2T2Zmc2V0WzFdLnp3KS5yZ2I7XFxyXFxuXFx0dCA9IGFicyhjIC0gY0JvdHRvbSk7XFxyXFxuXFx0ZGVsdGEudyA9IG1heChtYXgodC5yLCB0LmcpLCB0LmIpO1xcclxcblxcclxcblxcdC8vIENhbGN1bGF0ZSB0aGUgbWF4aW11bSBkZWx0YSBpbiB0aGUgZGlyZWN0IG5laWdoYm9yaG9vZC5cXHJcXG5cXHRmbG9hdCBtYXhEZWx0YSA9IG1heChtYXgobWF4KGRlbHRhLngsIGRlbHRhLnkpLCBkZWx0YS56KSwgZGVsdGEudyk7XFxyXFxuXFxyXFxuXFx0Ly8gQ2FsY3VsYXRlIGxlZnQtbGVmdCBhbmQgdG9wLXRvcCBkZWx0YXMuXFxyXFxuXFx0dmVjMyBjTGVmdExlZnQgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZPZmZzZXRbMl0ueHkpLnJnYjtcXHJcXG5cXHR0ID0gYWJzKGMgLSBjTGVmdExlZnQpO1xcclxcblxcdGRlbHRhLnogPSBtYXgobWF4KHQuciwgdC5nKSwgdC5iKTtcXHJcXG5cXHJcXG5cXHR2ZWMzIGNUb3BUb3AgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZPZmZzZXRbMl0uencpLnJnYjtcXHJcXG5cXHR0ID0gYWJzKGMgLSBjVG9wVG9wKTtcXHJcXG5cXHRkZWx0YS53ID0gbWF4KG1heCh0LnIsIHQuZyksIHQuYik7XFxyXFxuXFxyXFxuXFx0Ly8gQ2FsY3VsYXRlIHRoZSBmaW5hbCBtYXhpbXVtIGRlbHRhLlxcclxcblxcdG1heERlbHRhID0gbWF4KG1heChtYXhEZWx0YSwgZGVsdGEueiksIGRlbHRhLncpO1xcclxcblxcclxcblxcdC8vIExvY2FsIGNvbnRyYXN0IGFkYXB0YXRpb24gaW4gYWN0aW9uLlxcclxcblxcdGVkZ2VzLnh5ICo9IHN0ZXAoMC41ICogbWF4RGVsdGEsIGRlbHRhLnh5KTtcXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KGVkZ2VzLCAwLjAsIDAuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5jb25zdCB2ZXJ0ZXggPSBcInVuaWZvcm0gdmVjMiB0ZXhlbFNpemU7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG52YXJ5aW5nIHZlYzQgdk9mZnNldFszXTtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFxyXFxuXFx0dk9mZnNldFswXSA9IHV2Lnh5eHkgKyB0ZXhlbFNpemUueHl4eSAqIHZlYzQoLTEuMCwgMC4wLCAwLjAsIDEuMCk7IC8vIENoYW5nZWQgc2lnbiBpbiBXIGNvbXBvbmVudC5cXHJcXG5cXHR2T2Zmc2V0WzFdID0gdXYueHl4eSArIHRleGVsU2l6ZS54eXh5ICogdmVjNCgxLjAsIDAuMCwgMC4wLCAtMS4wKTsgLy8gQ2hhbmdlZCBzaWduIGluIFcgY29tcG9uZW50LlxcclxcblxcdHZPZmZzZXRbMl0gPSB1di54eXh5ICsgdGV4ZWxTaXplLnh5eHkgKiB2ZWM0KC0yLjAsIDAuMCwgMC4wLCAyLjApOyAvLyBDaGFuZ2VkIHNpZ24gaW4gVyBjb21wb25lbnQuXFxyXFxuXFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcblxyXG4vKipcclxuICogQSBtYXRlcmlhbCB0aGF0IGRldGVjdHMgZWRnZXMgaW4gYSBjb2xvciB0ZXh0dXJlLlxyXG4gKlxyXG4gKiBNYWlubHkgdXNlZCBmb3IgU3VicGl4ZWwgTW9ycGhvbG9naWNhbCBBbnRpYWxpYXNpbmcuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbG9yRWRnZXNNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjb2xvciBlZGdlcyBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gW3RleGVsU2l6ZV0gLSBUaGUgYWJzb2x1dGUgc2NyZWVuIHRleGVsIHNpemUuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKHRleGVsU2l6ZSA9IG5ldyBWZWN0b3IyKCkpIHtcclxuXHJcblx0XHRzdXBlcih7XHJcblxyXG5cdFx0XHR0eXBlOiBcIkNvbG9yRWRnZXNNYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0ZGVmaW5lczoge1xyXG5cclxuXHRcdFx0XHRFREdFX1RIUkVTSE9MRDogXCIwLjFcIlxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdHVuaWZvcm1zOiB7XHJcblxyXG5cdFx0XHRcdHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHRcdFx0XHR0ZXhlbFNpemU6IG5ldyBVbmlmb3JtKHRleGVsU2l6ZSlcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQsXHJcblx0XHRcdHZlcnRleFNoYWRlcjogdmVydGV4LFxyXG5cclxuXHRcdFx0ZGVwdGhXcml0ZTogZmFsc2UsXHJcblx0XHRcdGRlcHRoVGVzdDogZmFsc2VcclxuXHJcblx0XHR9KTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBlZGdlIGRldGVjdGlvbiBzZW5zaXRpdml0eS5cclxuXHQgKlxyXG5cdCAqIEEgbG93ZXIgdmFsdWUgcmVzdWx0cyBpbiBtb3JlIGVkZ2VzIGJlaW5nIGRldGVjdGVkIGF0IHRoZSBleHBlbnNlIG9mXHJcblx0ICogcGVyZm9ybWFuY2UuXHJcblx0ICpcclxuXHQgKiAwLjEgaXMgYSByZWFzb25hYmxlIHZhbHVlLCBhbmQgYWxsb3dzIHRvIGNhdGNoIG1vc3QgdmlzaWJsZSBlZGdlcy5cclxuXHQgKiAwLjA1IGlzIGEgcmF0aGVyIG92ZXJraWxsIHZhbHVlLCB0aGF0IGFsbG93cyB0byBjYXRjaCAnZW0gYWxsLlxyXG5cdCAqXHJcblx0ICogSWYgdGVtcG9yYWwgc3VwZXJzYW1wbGluZyBpcyB1c2VkLCAwLjIgY291bGQgYmUgYSByZWFzb25hYmxlIHZhbHVlLFxyXG5cdCAqIGFzIGxvdyBjb250cmFzdCBlZGdlcyBhcmUgcHJvcGVybHkgZmlsdGVyZWQgYnkganVzdCAyeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB0aHJlc2hvbGQgLSBUaGUgZWRnZSBkZXRlY3Rpb24gc2Vuc2l0aXZpdHkuIFJhbmdlOiBbMCwgMC41XS5cclxuXHQgKi9cclxuXHJcblx0c2V0RWRnZURldGVjdGlvblRocmVzaG9sZCh0aHJlc2hvbGQpIHtcclxuXHJcblx0XHR0aGlzLmRlZmluZXMuRURHRV9USFJFU0hPTEQgPSB0aHJlc2hvbGQudG9GaXhlZChcIjJcIik7XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwsIFVuaWZvcm0gfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmNvbnN0IGZyYWdtZW50ID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlMTtcXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlMjtcXHJcXG5cXHJcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHkxO1xcclxcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTI7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjNCB0ZXhlbDEgPSBvcGFjaXR5MSAqIHRleHR1cmUyRCh0ZXh0dXJlMSwgdlV2KTtcXHJcXG5cXHR2ZWM0IHRleGVsMiA9IG9wYWNpdHkyICogdGV4dHVyZTJEKHRleHR1cmUyLCB2VXYpO1xcclxcblxcclxcblxcdCNpZmRlZiBTQ1JFRU5fTU9ERVxcclxcblxcclxcblxcdFxcdHZlYzMgaW52VGV4ZWwxID0gdmVjMygxLjApIC0gdGV4ZWwxLnJnYjtcXHJcXG5cXHRcXHR2ZWMzIGludlRleGVsMiA9IHZlYzMoMS4wKSAtIHRleGVsMi5yZ2I7XFxyXFxuXFxyXFxuXFx0XFx0dmVjNCBjb2xvciA9IHZlYzQoXFxyXFxuXFx0XFx0XFx0dmVjMygxLjApIC0gaW52VGV4ZWwxICogaW52VGV4ZWwyLFxcclxcblxcdFxcdFxcdHRleGVsMS5hICsgdGV4ZWwyLmFcXHJcXG5cXHRcXHQpO1xcclxcblxcclxcblxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0dmVjNCBjb2xvciA9IHRleGVsMSArIHRleGVsMjtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSBjb2xvcjtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcbmNvbnN0IHZlcnRleCA9IFwidmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcblxyXG4vKipcclxuICogQSBtYXRlcmlhbCBmb3IgY29tYmluaW5nIHR3byB0ZXh0dXJlcy5cclxuICpcclxuICogVGhpcyBtYXRlcmlhbCBzdXBwb3J0cyB0aGUgdHdvIGJsZW5kIG1vZGVzIEFkZCBhbmQgU2NyZWVuLlxyXG4gKlxyXG4gKiBJbiBTY3JlZW4gbW9kZSwgdGhlIHR3byB0ZXh0dXJlcyBhcmUgZWZmZWN0aXZlbHkgcHJvamVjdGVkIG9uIGEgd2hpdGUgc2NyZWVuXHJcbiAqIHNpbXVsdGFuZW91c2x5LiBJbiBBZGQgbW9kZSwgdGhlIHRleHR1cmVzIGFyZSBzaW1wbHkgYWRkZWQgdG9nZXRoZXIgd2hpY2hcclxuICogb2Z0ZW4gcHJvZHVjZXMgdW5kZXNpcmVkLCB3YXNoZWQgb3V0IHJlc3VsdHMuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbWJpbmVNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjb21iaW5lIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc2NyZWVuTW9kZT1mYWxzZV0gLSBXaGV0aGVyIHRoZSBzY3JlZW4gYmxlbmQgbW9kZSBzaG91bGQgYmUgdXNlZC5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3Ioc2NyZWVuTW9kZSA9IGZhbHNlKSB7XHJcblxyXG5cdFx0c3VwZXIoe1xyXG5cclxuXHRcdFx0dHlwZTogXCJDb21iaW5lTWF0ZXJpYWxcIixcclxuXHJcblx0XHRcdHVuaWZvcm1zOiB7XHJcblxyXG5cdFx0XHRcdHRleHR1cmUxOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHRcdFx0XHR0ZXh0dXJlMjogbmV3IFVuaWZvcm0obnVsbCksXHJcblxyXG5cdFx0XHRcdG9wYWNpdHkxOiBuZXcgVW5pZm9ybSgxLjApLFxyXG5cdFx0XHRcdG9wYWNpdHkyOiBuZXcgVW5pZm9ybSgxLjApXHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50LFxyXG5cdFx0XHR2ZXJ0ZXhTaGFkZXI6IHZlcnRleCxcclxuXHJcblx0XHRcdGRlcHRoV3JpdGU6IGZhbHNlLFxyXG5cdFx0XHRkZXB0aFRlc3Q6IGZhbHNlXHJcblxyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5zZXRTY3JlZW5Nb2RlRW5hYmxlZChzY3JlZW5Nb2RlKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBTY3JlZW4gYmxlbmQgbW9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhlIFNjcmVlbiBibGVuZCBtb2RlIHNob3VsZCBiZSBlbmFibGVkLlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTY3JlZW5Nb2RlRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLlNDUkVFTl9NT0RFID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuU0NSRUVOX01PREU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFNoYWRlck1hdGVyaWFsLCBVbmlmb3JtLCBWZWN0b3IyIH0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5jb25zdCBmcmFnbWVudCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXHJcXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XFxyXFxuXFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjA7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjE7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjI7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjM7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdC8vIFNhbXBsZSB0b3AgbGVmdCB0ZXhlbC5cXHJcXG5cXHR2ZWM0IHN1bSA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2MCk7XFxyXFxuXFxyXFxuXFx0Ly8gU2FtcGxlIHRvcCByaWdodCB0ZXhlbC5cXHJcXG5cXHRzdW0gKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYxKTtcXHJcXG5cXHJcXG5cXHQvLyBTYW1wbGUgYm90dG9tIHJpZ2h0IHRleGVsLlxcclxcblxcdHN1bSArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdjIpO1xcclxcblxcclxcblxcdC8vIFNhbXBsZSBib3R0b20gbGVmdCB0ZXhlbC5cXHJcXG5cXHRzdW0gKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYzKTtcXHJcXG5cXHJcXG5cXHQvLyBDb21wdXRlIHRoZSBhdmVyYWdlLlxcclxcblxcdGdsX0ZyYWdDb2xvciA9IHN1bSAqIDAuMjU7XFxyXFxuXFxyXFxuXFx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcbmNvbnN0IHZlcnRleCA9IFwidW5pZm9ybSB2ZWMyIHRleGVsU2l6ZTtcXHJcXG51bmlmb3JtIHZlYzIgaGFsZlRleGVsU2l6ZTtcXHJcXG51bmlmb3JtIGZsb2F0IGtlcm5lbDtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2MDtcXHJcXG52YXJ5aW5nIHZlYzIgdlV2MTtcXHJcXG52YXJ5aW5nIHZlYzIgdlV2MjtcXHJcXG52YXJ5aW5nIHZlYzIgdlV2MztcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjMiBkVXYgPSAodGV4ZWxTaXplICogdmVjMihrZXJuZWwpKSArIGhhbGZUZXhlbFNpemU7XFxyXFxuXFxyXFxuXFx0dlV2MCA9IHZlYzIodXYueCAtIGRVdi54LCB1di55ICsgZFV2LnkpO1xcclxcblxcdHZVdjEgPSB2ZWMyKHV2LnggKyBkVXYueCwgdXYueSArIGRVdi55KTtcXHJcXG5cXHR2VXYyID0gdmVjMih1di54ICsgZFV2LngsIHV2LnkgLSBkVXYueSk7XFxyXFxuXFx0dlV2MyA9IHZlYzIodXYueCAtIGRVdi54LCB1di55IC0gZFV2LnkpO1xcclxcblxcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5cclxuLyoqXHJcbiAqIEFuIG9wdGltaXNlZCBjb252b2x1dGlvbiBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIFRoaXMgbWF0ZXJpYWwgc3VwcG9ydHMgZGl0aGVyaW5nLlxyXG4gKlxyXG4gKiBCYXNlZCBvbiB0aGUgR0RDMjAwMyBQcmVzZW50YXRpb24gYnkgTWFzYWtpIEthd2FzZSwgQnVua2FzaGEgR2FtZXM6XHJcbiAqICBGcmFtZSBCdWZmZXIgUG9zdHByb2Nlc3NpbmcgRWZmZWN0cyBpbiBET1VCTEUtUy5ULkUuQS5MIChXcmVja2xlc3MpXHJcbiAqIGFuZCBhbiBhcnRpY2xlIGJ5IEZpbGlwIFN0cnVnYXIsIEludGVsOlxyXG4gKiAgQW4gaW52ZXN0aWdhdGlvbiBvZiBmYXN0IHJlYWwtdGltZSBHUFUtYmFzZWQgaW1hZ2UgYmx1ciBhbGdvcml0aG1zXHJcbiAqXHJcbiAqIEZ1cnRoZXIgbW9kaWZpZWQgYWNjb3JkaW5nIHRvIEFwcGxlJ3NcclxuICogW0Jlc3QgUHJhY3RpY2VzIGZvciBTaGFkZXJzXShodHRwczovL2dvby5nbC9sbVJvTTUpLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBDb252b2x1dGlvbk1hdGVyaWFsIGV4dGVuZHMgU2hhZGVyTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGNvbnZvbHV0aW9uIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBbdGV4ZWxTaXplXSAtIFRoZSBhYnNvbHV0ZSBzY3JlZW4gdGV4ZWwgc2l6ZS5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3IodGV4ZWxTaXplID0gbmV3IFZlY3RvcjIoKSkge1xyXG5cclxuXHRcdHN1cGVyKHtcclxuXHJcblx0XHRcdHR5cGU6IFwiQ29udm9sdXRpb25NYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0dW5pZm9ybXM6IHtcclxuXHJcblx0XHRcdFx0dERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxyXG5cdFx0XHRcdHRleGVsU2l6ZTogbmV3IFVuaWZvcm0obmV3IFZlY3RvcjIoKSksXHJcblx0XHRcdFx0aGFsZlRleGVsU2l6ZTogbmV3IFVuaWZvcm0obmV3IFZlY3RvcjIoKSksXHJcblx0XHRcdFx0a2VybmVsOiBuZXcgVW5pZm9ybSgwLjApXHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50LFxyXG5cdFx0XHR2ZXJ0ZXhTaGFkZXI6IHZlcnRleCxcclxuXHJcblx0XHRcdGRlcHRoV3JpdGU6IGZhbHNlLFxyXG5cdFx0XHRkZXB0aFRlc3Q6IGZhbHNlXHJcblxyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5zZXRUZXhlbFNpemUodGV4ZWxTaXplLngsIHRleGVsU2l6ZS55KTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjdXJyZW50IGtlcm5lbCBzaXplLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtLZXJuZWxTaXplfVxyXG5cdFx0ICogQGRlZmF1bHQgS2VybmVsU2l6ZS5MQVJHRVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5rZXJuZWxTaXplID0gS2VybmVsU2l6ZS5MQVJHRTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBrZXJuZWwuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtGbG9hdDMyQXJyYXl9IFRoZSBrZXJuZWwuXHJcblx0ICovXHJcblxyXG5cdGdldEtlcm5lbCgpIHtcclxuXHJcblx0XHRyZXR1cm4ga2VybmVsUHJlc2V0c1t0aGlzLmtlcm5lbFNpemVdO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHRleGVsIHNpemUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0geCAtIFRoZSB0ZXhlbCB3aWR0aC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0geSAtIFRoZSB0ZXhlbCBoZWlnaHQuXHJcblx0ICovXHJcblxyXG5cdHNldFRleGVsU2l6ZSh4LCB5KSB7XHJcblxyXG5cdFx0dGhpcy51bmlmb3Jtcy50ZXhlbFNpemUudmFsdWUuc2V0KHgsIHkpO1xyXG5cdFx0dGhpcy51bmlmb3Jtcy5oYWxmVGV4ZWxTaXplLnZhbHVlLnNldCh4LCB5KS5tdWx0aXBseVNjYWxhcigwLjUpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVGhlIEthd2FzZSBibHVyIGtlcm5lbCBwcmVzZXRzLlxyXG4gKlxyXG4gKiBAdHlwZSB7RmxvYXQzMkFycmF5W119XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5cclxuY29uc3Qga2VybmVsUHJlc2V0cyA9IFtcclxuXHRuZXcgRmxvYXQzMkFycmF5KFswLjAsIDAuMF0pLFxyXG5cdG5ldyBGbG9hdDMyQXJyYXkoWzAuMCwgMS4wLCAxLjBdKSxcclxuXHRuZXcgRmxvYXQzMkFycmF5KFswLjAsIDEuMCwgMS4wLCAyLjBdKSxcclxuXHRuZXcgRmxvYXQzMkFycmF5KFswLjAsIDEuMCwgMi4wLCAyLjAsIDMuMF0pLFxyXG5cdG5ldyBGbG9hdDMyQXJyYXkoWzAuMCwgMS4wLCAyLjAsIDMuMCwgNC4wLCA0LjAsIDUuMF0pLFxyXG5cdG5ldyBGbG9hdDMyQXJyYXkoWzAuMCwgMS4wLCAyLjAsIDMuMCwgNC4wLCA1LjAsIDcuMCwgOC4wLCA5LjAsIDEwLjBdKVxyXG5dO1xyXG5cclxuLyoqXHJcbiAqIEEga2VybmVsIHNpemUgZW51bWVyYXRpb24uXHJcbiAqXHJcbiAqIEB0eXBlIHtPYmplY3R9XHJcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBWRVJZX1NNQUxMIC0gQSB2ZXJ5IHNtYWxsIGtlcm5lbCB0aGF0IG1hdGNoZXMgYSA3eDcgR2F1c3MgYmx1ciBrZXJuZWwuXHJcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBTTUFMTCAtIEEgc21hbGwga2VybmVsIHRoYXQgbWF0Y2hlcyBhIDE1eDE1IEdhdXNzIGJsdXIga2VybmVsLlxyXG4gKiBAcHJvcGVydHkge051bWJlcn0gTUVESVVNIC0gQSBtZWRpdW0gc2l6ZWQga2VybmVsIHRoYXQgbWF0Y2hlcyBhIDIzeDIzIEdhdXNzIGJsdXIga2VybmVsLlxyXG4gKiBAcHJvcGVydHkge051bWJlcn0gTEFSR0UgLSBBIGxhcmdlIGtlcm5lbCB0aGF0IG1hdGNoZXMgYSAzNXgzNSBHYXVzcyBibHVyIGtlcm5lbC5cclxuICogQHByb3BlcnR5IHtOdW1iZXJ9IFZFUllfTEFSR0UgLSBBIHZlcnkgbGFyZ2Uga2VybmVsIHRoYXQgbWF0Y2hlcyBhIDYzeDYzIEdhdXNzIGJsdXIga2VybmVsLlxyXG4gKiBAcHJvcGVydHkge051bWJlcn0gSFVHRSAtIEEgaHVnZSBrZXJuZWwgdGhhdCBtYXRjaGVzIGEgMTI3eDEyNyBHYXVzcyBibHVyIGtlcm5lbC5cclxuICovXHJcblxyXG5leHBvcnQgY29uc3QgS2VybmVsU2l6ZSA9IHtcclxuXHJcblx0VkVSWV9TTUFMTDogMCxcclxuXHRTTUFMTDogMSxcclxuXHRNRURJVU06IDIsXHJcblx0TEFSR0U6IDMsXHJcblx0VkVSWV9MQVJHRTogNCxcclxuXHRIVUdFOiA1XHJcblxyXG59O1xyXG4iLCJpbXBvcnQgeyBTaGFkZXJNYXRlcmlhbCwgVW5pZm9ybSB9IGZyb20gXCJ0aHJlZVwiO1xyXG5cclxuY29uc3QgZnJhZ21lbnQgPSBcInVuaWZvcm0gc2FtcGxlcjJEIHREaWZmdXNlO1xcclxcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWM0IHRleGVsID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYpO1xcclxcblxcdGdsX0ZyYWdDb2xvciA9IG9wYWNpdHkgKiB0ZXhlbDtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcbmNvbnN0IHZlcnRleCA9IFwidmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcblxyXG4vKipcclxuICogQSBzaW1wbGUgY29weSBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIENvcHlNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjb3B5IG1hdGVyaWFsLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlcih7XHJcblxyXG5cdFx0XHR0eXBlOiBcIkNvcHlNYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0dW5pZm9ybXM6IHtcclxuXHJcblx0XHRcdFx0dERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxyXG5cdFx0XHRcdG9wYWNpdHk6IG5ldyBVbmlmb3JtKDEuMClcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQsXHJcblx0XHRcdHZlcnRleFNoYWRlcjogdmVydGV4LFxyXG5cclxuXHRcdFx0ZGVwdGhXcml0ZTogZmFsc2UsXHJcblx0XHRcdGRlcHRoVGVzdDogZmFsc2VcclxuXHJcblx0XHR9KTtcclxuXHJcblx0fVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBQZXJzcGVjdGl2ZUNhbWVyYSwgU2hhZGVyTWF0ZXJpYWwsIFVuaWZvcm0gfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmNvbnN0IGZyYWdtZW50ID0gXCIjaW5jbHVkZSA8cGFja2luZz5cXHJcXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxyXFxuXFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdERlcHRoO1xcclxcbnVuaWZvcm0gZmxvYXQgY2FtZXJhTmVhcjtcXHJcXG51bmlmb3JtIGZsb2F0IGNhbWVyYUZhcjtcXHJcXG5cXHJcXG52YXJ5aW5nIGZsb2F0IHZWaWV3WjtcXHJcXG52YXJ5aW5nIHZlYzQgdlByb2pUZXhDb29yZDtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXHJcXG5cXHJcXG5cXHQvLyBUcmFuc2Zvcm0gaW50byBDYXJ0ZXNpYW4gY29vcmRpbmF0ZSAobm90IG1pcnJvcmVkKS5cXHJcXG5cXHR2ZWMyIHByb2pUZXhDb29yZCA9ICh2UHJvalRleENvb3JkLnh5IC8gdlByb2pUZXhDb29yZC53KSAqIDAuNSArIDAuNTtcXHJcXG5cXHRwcm9qVGV4Q29vcmQgPSBjbGFtcChwcm9qVGV4Q29vcmQsIDAuMDAyLCAwLjk5OCk7XFxyXFxuXFxyXFxuXFx0ZmxvYXQgZnJhZ0Nvb3JkWiA9IHVucGFja1JHQkFUb0RlcHRoKHRleHR1cmUyRCh0RGVwdGgsIHByb2pUZXhDb29yZCkpO1xcclxcblxcclxcblxcdCNpZmRlZiBQRVJTUEVDVElWRV9DQU1FUkFcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCB2aWV3WiA9IHBlcnNwZWN0aXZlRGVwdGhUb1ZpZXdaKGZyYWdDb29yZFosIGNhbWVyYU5lYXIsIGNhbWVyYUZhcik7XFxyXFxuXFxyXFxuXFx0I2Vsc2VcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCB2aWV3WiA9IG9ydGhvZ3JhcGhpY0RlcHRoVG9WaWV3WihmcmFnQ29vcmRaLCBjYW1lcmFOZWFyLCBjYW1lcmFGYXIpO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdGZsb2F0IGRlcHRoVGVzdCA9ICgtdlZpZXdaID4gLXZpZXdaKSA/IDEuMCA6IDAuMDtcXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IucmdiID0gdmVjMygwLjAsIGRlcHRoVGVzdCwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcbmNvbnN0IHZlcnRleCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXHJcXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxyXFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcclxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxyXFxuXFxyXFxudmFyeWluZyBmbG9hdCB2Vmlld1o7XFxyXFxudmFyeWluZyB2ZWM0IHZQcm9qVGV4Q29vcmQ7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxyXFxuXFxyXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXHJcXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcclxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxyXFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcclxcblxcclxcblxcdHZWaWV3WiA9IG12UG9zaXRpb24uejtcXHJcXG5cXHR2UHJvalRleENvb3JkID0gZ2xfUG9zaXRpb247XFxyXFxuXFxyXFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5cclxuLyoqXHJcbiAqIEEgZGVwdGggY29tcGFyaXNvbiBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIERlcHRoQ29tcGFyaXNvbk1hdGVyaWFsIGV4dGVuZHMgU2hhZGVyTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGRlcHRoIGNvbXBhcmlzb24gbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IFtkZXB0aFRleHR1cmU9bnVsbF0gLSBBIGRlcHRoIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtQZXJzcGVjdGl2ZUNhbWVyYX0gW2NhbWVyYV0gLSBBIGNhbWVyYS5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3IoZGVwdGhUZXh0dXJlID0gbnVsbCwgY2FtZXJhKSB7XHJcblxyXG5cdFx0c3VwZXIoe1xyXG5cclxuXHRcdFx0dHlwZTogXCJEZXB0aENvbXBhcmlzb25NYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0dW5pZm9ybXM6IHtcclxuXHJcblx0XHRcdFx0dERlcHRoOiBuZXcgVW5pZm9ybShkZXB0aFRleHR1cmUpLFxyXG5cdFx0XHRcdGNhbWVyYU5lYXI6IG5ldyBVbmlmb3JtKDAuMSksXHJcblx0XHRcdFx0Y2FtZXJhRmFyOiBuZXcgVW5pZm9ybSgyMDAwKVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCxcclxuXHRcdFx0dmVydGV4U2hhZGVyOiB2ZXJ0ZXgsXHJcblxyXG5cdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhUZXN0OiBmYWxzZSxcclxuXHJcblx0XHRcdG1vcnBoVGFyZ2V0czogdHJ1ZSxcclxuXHRcdFx0c2tpbm5pbmc6IHRydWVcclxuXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLmFkb3B0Q2FtZXJhU2V0dGluZ3MoY2FtZXJhKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZG9wdHMgdGhlIHNldHRpbmdzIG9mIHRoZSBnaXZlbiBjYW1lcmEuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gW2NhbWVyYT1udWxsXSAtIEEgY2FtZXJhLlxyXG5cdCAqL1xyXG5cclxuXHRhZG9wdENhbWVyYVNldHRpbmdzKGNhbWVyYSA9IG51bGwpIHtcclxuXHJcblx0XHRpZihjYW1lcmEgIT09IG51bGwpIHtcclxuXHJcblx0XHRcdHRoaXMudW5pZm9ybXMuY2FtZXJhTmVhci52YWx1ZSA9IGNhbWVyYS5uZWFyO1xyXG5cdFx0XHR0aGlzLnVuaWZvcm1zLmNhbWVyYUZhci52YWx1ZSA9IGNhbWVyYS5mYXI7XHJcblxyXG5cdFx0XHRpZihjYW1lcmEgaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZUNhbWVyYSkge1xyXG5cclxuXHRcdFx0XHR0aGlzLmRlZmluZXMuUEVSU1BFQ1RJVkVfQ0FNRVJBID0gXCIxXCI7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRkZWxldGUgdGhpcy5kZWZpbmVzLlBFUlNQRUNUSVZFX0NBTUVSQTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwsIFVuaWZvcm0sIFZlY3RvcjQgfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmNvbnN0IGZyYWdtZW50ID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG5cXHJcXG51bmlmb3JtIGZsb2F0IGFuZ2xlO1xcclxcbnVuaWZvcm0gZmxvYXQgc2NhbGU7XFxyXFxudW5pZm9ybSBmbG9hdCBpbnRlbnNpdHk7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG52YXJ5aW5nIHZlYzIgdlV2UGF0dGVybjtcXHJcXG5cXHJcXG5mbG9hdCBwYXR0ZXJuKCkge1xcclxcblxcclxcblxcdGZsb2F0IHMgPSBzaW4oYW5nbGUpO1xcclxcblxcdGZsb2F0IGMgPSBjb3MoYW5nbGUpO1xcclxcblxcclxcblxcdHZlYzIgcG9pbnQgPSB2ZWMyKGMgKiB2VXZQYXR0ZXJuLnggLSBzICogdlV2UGF0dGVybi55LCBzICogdlV2UGF0dGVybi54ICsgYyAqIHZVdlBhdHRlcm4ueSkgKiBzY2FsZTtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gKHNpbihwb2ludC54KSAqIHNpbihwb2ludC55KSkgKiA0LjA7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWM0IHRleGVsID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYpO1xcclxcblxcdHZlYzMgY29sb3IgPSB0ZXhlbC5yZ2I7XFxyXFxuXFxyXFxuXFx0I2lmZGVmIEFWRVJBR0VcXHJcXG5cXHJcXG5cXHRcXHRjb2xvciA9IHZlYzMoKGNvbG9yLnIgKyBjb2xvci5nICsgY29sb3IuYikgLyAzLjApO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdGNvbG9yID0gdmVjMyhjb2xvciAqIDEwLjAgLSA1LjAgKyBwYXR0ZXJuKCkpO1xcclxcblxcdGNvbG9yID0gdGV4ZWwucmdiICsgKGNvbG9yIC0gdGV4ZWwucmdiKSAqIGludGVuc2l0eTtcXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yLCB0ZXhlbC5hKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcbmNvbnN0IHZlcnRleCA9IFwidW5pZm9ybSB2ZWM0IG9mZnNldFJlcGVhdDtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcbnZhcnlpbmcgdmVjMiB2VXZQYXR0ZXJuO1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2VXYgPSB1djtcXHJcXG5cXHR2VXZQYXR0ZXJuID0gdXYgKiBvZmZzZXRSZXBlYXQuencgKyBvZmZzZXRSZXBlYXQueHk7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcblxyXG4vKipcclxuICogQSBkb3Qgc2NyZWVuIHNoYWRlciBtYXRlcmlhbC5cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgRG90U2NyZWVuTWF0ZXJpYWwgZXh0ZW5kcyBTaGFkZXJNYXRlcmlhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZG90IHNjcmVlbiBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hdmVyYWdlPWZhbHNlXSAtIFdoZXRoZXIgdGhlIHNoYWRlciBzaG91bGQgb3V0cHV0IHRoZSBjb2xvdXIgYXZlcmFnZSAoYmxhY2sgYW5kIHdoaXRlKS5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmFuZ2xlPTEuNTddIC0gVGhlIGFuZ2xlIG9mIHRoZSBkb3QgcGF0dGVybi5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNjYWxlPTEuMF0gLSBUaGUgc2NhbGUgb2YgdGhlIGRvdCBwYXR0ZXJuLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaW50ZW5zaXR5PTEuMF0gLSBUaGUgaW50ZW5zaXR5IG9mIHRoZSBlZmZlY3QuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xyXG5cclxuXHRcdGNvbnN0IHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7XHJcblx0XHRcdGF2ZXJhZ2U6IGZhbHNlLFxyXG5cdFx0XHRhbmdsZTogMS41NyxcclxuXHRcdFx0c2NhbGU6IDEuMCxcclxuXHRcdFx0aW50ZW5zaXR5OiAxLjBcclxuXHRcdH0sIG9wdGlvbnMpO1xyXG5cclxuXHRcdHN1cGVyKHtcclxuXHJcblx0XHRcdHR5cGU6IFwiRG90U2NyZWVuTWF0ZXJpYWxcIixcclxuXHJcblx0XHRcdHVuaWZvcm1zOiB7XHJcblxyXG5cdFx0XHRcdHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHJcblx0XHRcdFx0YW5nbGU6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmFuZ2xlKSxcclxuXHRcdFx0XHRzY2FsZTogbmV3IFVuaWZvcm0oc2V0dGluZ3Muc2NhbGUpLFxyXG5cdFx0XHRcdGludGVuc2l0eTogbmV3IFVuaWZvcm0oc2V0dGluZ3MuaW50ZW5zaXR5KSxcclxuXHJcblx0XHRcdFx0b2Zmc2V0UmVwZWF0OiBuZXcgVW5pZm9ybShuZXcgVmVjdG9yNCgwLjUsIDAuNSwgMS4wLCAxLjApKVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCxcclxuXHRcdFx0dmVydGV4U2hhZGVyOiB2ZXJ0ZXgsXHJcblxyXG5cdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhUZXN0OiBmYWxzZVxyXG5cclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMuc2V0QXZlcmFnZUVuYWJsZWQoc2V0dGluZ3MuYXZlcmFnZSk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgU2NyZWVuIGJsZW5kIG1vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBTY3JlZW4gYmxlbmQgbW9kZSBzaG91bGQgYmUgZW5hYmxlZC5cclxuXHQgKi9cclxuXHJcblx0c2V0QXZlcmFnZUVuYWJsZWQoZW5hYmxlZCkge1xyXG5cclxuXHRcdGlmKGVuYWJsZWQpIHtcclxuXHJcblx0XHRcdHRoaXMuZGVmaW5lcy5BVkVSQUdFID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuQVZFUkFHRTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwsIFVuaWZvcm0sIFZlY3RvcjIgfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmNvbnN0IGZyYWdtZW50ID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIGZsb2F0IHRpbWU7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG4jaWZkZWYgTk9JU0VcXHJcXG5cXHJcXG5cXHR1bmlmb3JtIGZsb2F0IG5vaXNlSW50ZW5zaXR5O1xcclxcblxcclxcbiNlbmRpZlxcclxcblxcclxcbiNpZmRlZiBTQ0FOTElORVNcXHJcXG5cXHJcXG5cXHR1bmlmb3JtIGZsb2F0IHNjYW5saW5lSW50ZW5zaXR5O1xcclxcblxcdHVuaWZvcm0gZmxvYXQgc2NhbmxpbmVDb3VudDtcXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG4jaWZkZWYgR1JJRFxcclxcblxcclxcblxcdHVuaWZvcm0gZmxvYXQgZ3JpZEludGVuc2l0eTtcXHJcXG5cXHR1bmlmb3JtIHZlYzIgZ3JpZFNjYWxlO1xcclxcblxcdHVuaWZvcm0gZmxvYXQgZ3JpZExpbmVXaWR0aDtcXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG4jaWZkZWYgR1JFWVNDQUxFXFxyXFxuXFxyXFxuXFx0I2luY2x1ZGUgPGNvbW1vbj5cXHJcXG5cXHJcXG5cXHR1bmlmb3JtIGZsb2F0IGdyZXlzY2FsZUludGVuc2l0eTtcXHJcXG5cXHJcXG4jZWxpZiBkZWZpbmVkKFNFUElBKVxcclxcblxcclxcblxcdHVuaWZvcm0gZmxvYXQgc2VwaWFJbnRlbnNpdHk7XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxuI2lmZGVmIFZJR05FVFRFXFxyXFxuXFxyXFxuXFx0dW5pZm9ybSBmbG9hdCB2aWduZXR0ZU9mZnNldDtcXHJcXG5cXHR1bmlmb3JtIGZsb2F0IHZpZ25ldHRlRGFya25lc3M7XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZlYzQgdGV4ZWwgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdik7XFxyXFxuXFx0dmVjMyBjb2xvciA9IHRleGVsLnJnYjtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgU0NSRUVOX01PREVcXHJcXG5cXHJcXG5cXHRcXHR2ZWMzIGludkNvbG9yO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdCNpZmRlZiBOT0lTRVxcclxcblxcclxcblxcdFxcdGZsb2F0IHggPSB2VXYueCAqIHZVdi55ICogdGltZSAqIDEwMDAuMDtcXHJcXG5cXHRcXHR4ID0gbW9kKHgsIDEzLjApICogbW9kKHgsIDEyMy4wKTtcXHJcXG5cXHRcXHR4ID0gbW9kKHgsIDAuMDEpO1xcclxcblxcclxcblxcdFxcdHZlYzMgbm9pc2UgPSB0ZXhlbC5yZ2IgKiBjbGFtcCgwLjEgKyB4ICogMTAwLjAsIDAuMCwgMS4wKSAqIG5vaXNlSW50ZW5zaXR5O1xcclxcblxcclxcblxcdFxcdCNpZmRlZiBTQ1JFRU5fTU9ERVxcclxcblxcclxcblxcdFxcdFxcdGludkNvbG9yID0gdmVjMygxLjApIC0gY29sb3I7XFxyXFxuXFx0XFx0XFx0dmVjMyBpbnZOb2lzZSA9IHZlYzMoMS4wKSAtIG5vaXNlO1xcclxcblxcclxcblxcdFxcdFxcdGNvbG9yID0gdmVjMygxLjApIC0gaW52Q29sb3IgKiBpbnZOb2lzZTtcXHJcXG5cXHJcXG5cXHRcXHQjZWxzZVxcclxcblxcclxcblxcdFxcdFxcdGNvbG9yICs9IG5vaXNlO1xcclxcblxcclxcblxcdFxcdCNlbmRpZlxcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdCNpZmRlZiBTQ0FOTElORVNcXHJcXG5cXHJcXG5cXHRcXHR2ZWMyIHNsID0gdmVjMihzaW4odlV2LnkgKiBzY2FubGluZUNvdW50KSwgY29zKHZVdi55ICogc2NhbmxpbmVDb3VudCkpO1xcclxcblxcdFxcdHZlYzMgc2NhbmxpbmVzID0gdGV4ZWwucmdiICogdmVjMyhzbC54LCBzbC55LCBzbC54KSAqIHNjYW5saW5lSW50ZW5zaXR5O1xcclxcblxcclxcblxcdFxcdCNpZmRlZiBTQ1JFRU5fTU9ERVxcclxcblxcclxcblxcdFxcdFxcdGludkNvbG9yID0gdmVjMygxLjApIC0gY29sb3I7XFxyXFxuXFx0XFx0XFx0dmVjMyBpbnZTY2FubGluZXMgPSB2ZWMzKDEuMCkgLSBzY2FubGluZXM7XFxyXFxuXFxyXFxuXFx0XFx0XFx0Y29sb3IgPSB2ZWMzKDEuMCkgLSBpbnZDb2xvciAqIGludlNjYW5saW5lcztcXHJcXG5cXHJcXG5cXHRcXHQjZWxzZVxcclxcblxcclxcblxcdFxcdFxcdGNvbG9yICs9IHNjYW5saW5lcztcXHJcXG5cXHJcXG5cXHRcXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHQjaWZkZWYgR1JJRFxcclxcblxcclxcblxcdFxcdGZsb2F0IGdyaWQgPSAwLjUgLSBtYXgoYWJzKG1vZCh2VXYueCAqIGdyaWRTY2FsZS54LCAxLjApIC0gMC41KSwgYWJzKG1vZCh2VXYueSAqIGdyaWRTY2FsZS55LCAxLjApIC0gMC41KSk7XFxyXFxuXFx0XFx0Y29sb3IgKj0gKDEuMCAtIGdyaWRJbnRlbnNpdHkpICsgdmVjMyhzbW9vdGhzdGVwKDAuMCwgZ3JpZExpbmVXaWR0aCwgZ3JpZCkpICogZ3JpZEludGVuc2l0eTtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHQjaWZkZWYgR1JFWVNDQUxFXFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IgPSBtaXgoY29sb3IsIHZlYzMobGluZWFyVG9SZWxhdGl2ZUx1bWluYW5jZShjb2xvcikpLCBncmV5c2NhbGVJbnRlbnNpdHkpO1xcclxcblxcclxcblxcdCNlbGlmIGRlZmluZWQoU0VQSUEpXFxyXFxuXFxyXFxuXFx0XFx0dmVjMyBjID0gY29sb3IucmdiO1xcclxcblxcclxcblxcdFxcdGNvbG9yLnIgPSBkb3QoYywgdmVjMygxLjAgLSAwLjYwNyAqIHNlcGlhSW50ZW5zaXR5LCAwLjc2OSAqIHNlcGlhSW50ZW5zaXR5LCAwLjE4OSAqIHNlcGlhSW50ZW5zaXR5KSk7XFxyXFxuXFx0XFx0Y29sb3IuZyA9IGRvdChjLCB2ZWMzKDAuMzQ5ICogc2VwaWFJbnRlbnNpdHksIDEuMCAtIDAuMzE0ICogc2VwaWFJbnRlbnNpdHksIDAuMTY4ICogc2VwaWFJbnRlbnNpdHkpKTtcXHJcXG5cXHRcXHRjb2xvci5iID0gZG90KGMsIHZlYzMoMC4yNzIgKiBzZXBpYUludGVuc2l0eSwgMC41MzQgKiBzZXBpYUludGVuc2l0eSwgMS4wIC0gMC44NjkgKiBzZXBpYUludGVuc2l0eSkpO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdCNpZmRlZiBWSUdORVRURVxcclxcblxcclxcblxcdFxcdGNvbnN0IHZlYzIgY2VudGVyID0gdmVjMigwLjUpO1xcclxcblxcclxcblxcdFxcdCNpZmRlZiBFU0tJTFxcclxcblxcclxcblxcdFxcdFxcdHZlYzIgdXYgPSAodlV2IC0gY2VudGVyKSAqIHZlYzIodmlnbmV0dGVPZmZzZXQpO1xcclxcblxcdFxcdFxcdGNvbG9yID0gbWl4KGNvbG9yLnJnYiwgdmVjMygxLjAgLSB2aWduZXR0ZURhcmtuZXNzKSwgZG90KHV2LCB1dikpO1xcclxcblxcclxcblxcdFxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0XFx0ZmxvYXQgZGlzdCA9IGRpc3RhbmNlKHZVdiwgY2VudGVyKTtcXHJcXG5cXHRcXHRcXHRjb2xvciAqPSBzbW9vdGhzdGVwKDAuOCwgdmlnbmV0dGVPZmZzZXQgKiAwLjc5OSwgZGlzdCAqICh2aWduZXR0ZURhcmtuZXNzICsgdmlnbmV0dGVPZmZzZXQpKTtcXHJcXG5cXHJcXG5cXHRcXHQjZW5kaWZcXHRcXHRcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KGNsYW1wKGNvbG9yLCAwLjAsIDEuMCksIHRleGVsLmEpO1xcclxcblxcclxcbn1cXHJcXG5cIjtcclxuY29uc3QgdmVydGV4ID0gXCJ2YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2VXYgPSB1djtcXHJcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcclxuXHJcbi8qKlxyXG4gKiBBIGNpbmVtYXRpYyBzaGFkZXIgdGhhdCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGVmZmVjdHM6XHJcbiAqICAtIEZpbG0gR3JhaW5cclxuICogIC0gU2NhbmxpbmVzXHJcbiAqICAtIFZpZ25ldHRlXHJcbiAqICAtIEdyZXlzY2FsZVxyXG4gKiAgLSBTZXBpYVxyXG4gKlxyXG4gKiBPcmlnaW5hbCBzY2FubGluZXMgYWxnb3JpdGhtIGJ5IFBhdCBcIkhhd3Rob3JuZVwiIFNoZWFyb24uXHJcbiAqICBodHRwOi8vd3d3LnRydWV2aXNpb24zZC5jb20vZm9ydW1zL3Nob3djYXNlL3N0YXRpY25vaXNlX2NvbG9yYmxhY2t3aGl0ZV9zY2FubGluZV9zaGFkZXJzLXQxODY5OC4wLmh0bWxcclxuICpcclxuICogT3B0aW1pc2VkIHNjYW5saW5lcyBhbmQgbm9pc2Ugd2l0aCBpbnRlbnNpdHkgc2NhbGluZyBieSBHZW9yZyBcIkxldmlhdGhhblwiXHJcbiAqIFN0ZWlucm9oZGVyLiBUaGlzIHZlcnNpb24gd2FzIHByb3ZpZGVkIHVuZGVyIGEgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvblxyXG4gKiAzLjAgTGljZW5zZTogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLlxyXG4gKlxyXG4gKiBUaGUgc2VwaWEgZWZmZWN0IGlzIGJhc2VkIG9uOlxyXG4gKiAgaHR0cHM6Ly9naXRodWIuY29tL2V2YW53L2dsZnguanNcclxuICpcclxuICogVGhlIHZpZ25ldHRlIGNvZGUgaXMgYmFzZWQgb24gUGFpbnRFZmZlY3QgcG9zdHByb2Nlc3MgZnJvbSByby5tZTpcclxuICogIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC8zLWRyZWFtcy1vZi1ibGFjay9zb3VyY2UvYnJvd3NlL2RlcGxveS9qcy9lZmZlY3RzL1BhaW50RWZmZWN0LmpzXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIEZpbG1NYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBmaWxtIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLiBEaXNhYmxlZCBlZmZlY3RzIHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBmaW5hbCBzaGFkZXIgYW5kIGhhdmUgbm8gbmVnYXRpdmUgaW1wYWN0IG9uIHBlcmZvcm1hbmNlLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZ3JleXNjYWxlPWZhbHNlXSAtIEVuYWJsZSBncmV5c2NhbGUgZWZmZWN0LiBHcmV5c2NhbGUgYW5kIHNlcGlhIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zZXBpYT1mYWxzZV0gLSBFbmFibGUgc2VwaWEgZWZmZWN0LiBHcmV5c2NhbGUgYW5kIHNlcGlhIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy52aWduZXR0ZT1mYWxzZV0gLSBBcHBseSB2aWduZXR0ZSBlZmZlY3QuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5lc2tpbD1mYWxzZV0gLSBVc2UgRXNraWwncyB2aWduZXR0ZSBhcHByb2FjaC4gVGhlIGRlZmF1bHQgbG9va3MgZHVzdHkgd2hpbGUgRXNraWwgbG9va3MgYnVybmVkIG91dC5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNjcmVlbk1vZGU9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBzY3JlZW4gYmxlbmQgbW9kZSBzaG91bGQgYmUgdXNlZCBmb3Igbm9pc2UgYW5kIHNjYW5saW5lcy4gQm90aCBvZiB0aGVzZSBlZmZlY3RzIGFyZSBjb21wdXRlZCBpbmRlcGVuZGVudGx5LlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubm9pc2U9dHJ1ZV0gLSBTaG93IG5vaXNlLWJhc2VkIGZpbG0gZ3JhaW4uXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zY2FubGluZXM9dHJ1ZV0gLSBTaG93IHNjYW5saW5lcy5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmdyaWQ9dHJ1ZV0gLSBTaG93IGEgZ3JpZC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubm9pc2VJbnRlbnNpdHk9MC41XSAtIFRoZSBub2lzZSBpbnRlbnNpdHkuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnNjYW5saW5lSW50ZW5zaXR5PTAuMDVdIC0gVGhlIHNjYW5saW5lIGludGVuc2l0eS5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZ3JpZEludGVuc2l0eT0xLjBdIC0gVGhlIGdyaWQgc3RyZW5ndGguIDAuMCB0byAxLjAuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmdyZXlzY2FsZUludGVuc2l0eT0xLjBdIC0gVGhlIGludGVuc2l0eSBvZiB0aGUgZ3JleXNjYWxlIGVmZmVjdC4gMC4wIHRvIDEuMC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuc2VwaWFJbnRlbnNpdHk9MS4wXSAtIFRoZSBpbnRlbnNpdHkgb2YgdGhlIHNlcGlhIGVmZmVjdC4gMC4wIHRvIDEuMC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMudmlnbmV0dGVPZmZzZXQ9MS4wXSAtIFRoZSBvZmZzZXQgb2YgdGhlIHZpZ25ldHRlIGVmZmVjdC4gMC4wIHRvIDEuMC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMudmlnbmV0dGVEYXJrbmVzcz0xLjBdIC0gVGhlIGRhcmtuZXNzIG9mIHRoZSB2aWduZXR0ZSBlZmZlY3QuIDAuMCB0byAxLjAuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xyXG5cclxuXHRcdGNvbnN0IHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7XHJcblxyXG5cdFx0XHRzY3JlZW5Nb2RlOiB0cnVlLFxyXG5cdFx0XHRub2lzZTogdHJ1ZSxcclxuXHRcdFx0c2NhbmxpbmVzOiB0cnVlLFxyXG5cdFx0XHRncmlkOiBmYWxzZSxcclxuXHJcblx0XHRcdGdyZXlzY2FsZTogZmFsc2UsXHJcblx0XHRcdHNlcGlhOiBmYWxzZSxcclxuXHRcdFx0dmlnbmV0dGU6IGZhbHNlLFxyXG5cdFx0XHRlc2tpbDogZmFsc2UsXHJcblxyXG5cdFx0XHRub2lzZUludGVuc2l0eTogMC41LFxyXG5cdFx0XHRzY2FubGluZUludGVuc2l0eTogMC4wNSxcclxuXHRcdFx0Z3JpZEludGVuc2l0eTogMS4wLFxyXG5cdFx0XHRncmV5c2NhbGVJbnRlbnNpdHk6IDEuMCxcclxuXHRcdFx0c2VwaWFJbnRlbnNpdHk6IDEuMCxcclxuXHJcblx0XHRcdHZpZ25ldHRlT2Zmc2V0OiAxLjAsXHJcblx0XHRcdHZpZ25ldHRlRGFya25lc3M6IDEuMFxyXG5cclxuXHRcdH0sIG9wdGlvbnMpO1xyXG5cclxuXHRcdHN1cGVyKHtcclxuXHJcblx0XHRcdHR5cGU6IFwiRmlsbU1hdGVyaWFsXCIsXHJcblxyXG5cdFx0XHR1bmlmb3Jtczoge1xyXG5cclxuXHRcdFx0XHR0RGlmZnVzZTogbmV3IFVuaWZvcm0obnVsbCksXHJcblx0XHRcdFx0dGltZTogbmV3IFVuaWZvcm0oMC4wKSxcclxuXHJcblx0XHRcdFx0bm9pc2VJbnRlbnNpdHk6IG5ldyBVbmlmb3JtKHNldHRpbmdzLm5vaXNlSW50ZW5zaXR5KSxcclxuXHRcdFx0XHRzY2FubGluZUludGVuc2l0eTogbmV3IFVuaWZvcm0oc2V0dGluZ3Muc2NhbmxpbmVJbnRlbnNpdHkpLFxyXG5cdFx0XHRcdGdyaWRJbnRlbnNpdHk6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmdyaWRJbnRlbnNpdHkpLFxyXG5cclxuXHRcdFx0XHRzY2FubGluZUNvdW50OiBuZXcgVW5pZm9ybSgwLjApLFxyXG5cdFx0XHRcdGdyaWRTY2FsZTogbmV3IFVuaWZvcm0obmV3IFZlY3RvcjIoKSksXHJcblx0XHRcdFx0Z3JpZExpbmVXaWR0aDogbmV3IFVuaWZvcm0oMC4wKSxcclxuXHJcblx0XHRcdFx0Z3JleXNjYWxlSW50ZW5zaXR5OiBuZXcgVW5pZm9ybShzZXR0aW5ncy5ncmV5c2NhbGVJbnRlbnNpdHkpLFxyXG5cdFx0XHRcdHNlcGlhSW50ZW5zaXR5OiBuZXcgVW5pZm9ybShzZXR0aW5ncy5zZXBpYUludGVuc2l0eSksXHJcblxyXG5cdFx0XHRcdHZpZ25ldHRlT2Zmc2V0OiBuZXcgVW5pZm9ybShzZXR0aW5ncy52aWduZXR0ZU9mZnNldCksXHJcblx0XHRcdFx0dmlnbmV0dGVEYXJrbmVzczogbmV3IFVuaWZvcm0oc2V0dGluZ3MudmlnbmV0dGVEYXJrbmVzcylcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQsXHJcblx0XHRcdHZlcnRleFNoYWRlcjogdmVydGV4LFxyXG5cclxuXHRcdFx0ZGVwdGhXcml0ZTogZmFsc2UsXHJcblx0XHRcdGRlcHRoVGVzdDogZmFsc2VcclxuXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnNldFNjcmVlbk1vZGVFbmFibGVkKHNldHRpbmdzLnNjcmVlbk1vZGUpO1xyXG5cdFx0dGhpcy5zZXROb2lzZUVuYWJsZWQoc2V0dGluZ3Mubm9pc2UpO1xyXG5cdFx0dGhpcy5zZXRTY2FubGluZXNFbmFibGVkKHNldHRpbmdzLnNjYW5saW5lcyk7XHJcblx0XHR0aGlzLnNldEdyaWRFbmFibGVkKHNldHRpbmdzLmdyaWQpO1xyXG5cdFx0dGhpcy5zZXRHcmV5c2NhbGVFbmFibGVkKHNldHRpbmdzLmdyZXlzY2FsZSk7XHJcblx0XHR0aGlzLnNldFNlcGlhRW5hYmxlZChzZXR0aW5ncy5zZXBpYSk7XHJcblx0XHR0aGlzLnNldFZpZ25ldHRlRW5hYmxlZChzZXR0aW5ncy52aWduZXR0ZSk7XHJcblx0XHR0aGlzLnNldEVza2lsRW5hYmxlZChzZXR0aW5ncy5lc2tpbCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgU2NyZWVuIGJsZW5kIG1vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBTY3JlZW4gYmxlbmQgbW9kZSBzaG91bGQgYmUgZW5hYmxlZC5cclxuXHQgKi9cclxuXHJcblx0c2V0U2NyZWVuTW9kZUVuYWJsZWQoZW5hYmxlZCkge1xyXG5cclxuXHRcdGlmKGVuYWJsZWQpIHtcclxuXHJcblx0XHRcdHRoaXMuZGVmaW5lcy5TQ1JFRU5fTU9ERSA9IFwiMVwiO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRkZWxldGUgdGhpcy5kZWZpbmVzLlNDUkVFTl9NT0RFO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBub2lzZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBub2lzZSBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQuXHJcblx0ICovXHJcblxyXG5cdHNldE5vaXNlRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLk5PSVNFID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuTk9JU0U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNjYW5saW5lcyBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBzY2FubGluZXMgZWZmZWN0IHNob3VsZCBiZSBlbmFibGVkLlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTY2FubGluZXNFbmFibGVkKGVuYWJsZWQpIHtcclxuXHJcblx0XHRpZihlbmFibGVkKSB7XHJcblxyXG5cdFx0XHR0aGlzLmRlZmluZXMuU0NBTkxJTkVTID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuU0NBTkxJTkVTO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBncmlkIGVmZmVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhlIGdyaWQgZWZmZWN0IHNob3VsZCBiZSBlbmFibGVkLlxyXG5cdCAqL1xyXG5cclxuXHRzZXRHcmlkRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLkdSSUQgPSBcIjFcIjtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0ZGVsZXRlIHRoaXMuZGVmaW5lcy5HUklEO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBncmV5c2NhbGUgZWZmZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkIC0gV2hldGhlciB0aGUgZ3JleXNjYWxlIGVmZmVjdCBzaG91bGQgYmUgZW5hYmxlZC5cclxuXHQgKi9cclxuXHJcblx0c2V0R3JleXNjYWxlRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLkdSRVlTQ0FMRSA9IFwiMVwiO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRkZWxldGUgdGhpcy5kZWZpbmVzLkdSRVlTQ0FMRTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc2VwaWEgZWZmZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkIC0gV2hldGhlciB0aGUgc2VwaWEgZWZmZWN0IHNob3VsZCBiZSBlbmFibGVkLlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTZXBpYUVuYWJsZWQoZW5hYmxlZCkge1xyXG5cclxuXHRcdGlmKGVuYWJsZWQpIHtcclxuXHJcblx0XHRcdHRoaXMuZGVmaW5lcy5TRVBJQSA9IFwiMVwiO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRkZWxldGUgdGhpcy5kZWZpbmVzLlNFUElBO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBWaWduZXR0ZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBWaWduZXR0ZSBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQuXHJcblx0ICovXHJcblxyXG5cdHNldFZpZ25ldHRlRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLlZJR05FVFRFID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuVklHTkVUVEU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIEVza2lsIFZpZ25ldHRlIGVmZmVjdC5cclxuXHQgKlxyXG5cdCAqIEhhcyBubyBlZmZlY3QgaWYgVmlnbmV0dGUgaXMgZGlzYWJsZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBFc2tpbCBWaWduZXR0ZSBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQuXHJcblx0ICovXHJcblxyXG5cdHNldEVza2lsRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLkVTS0lMID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuRVNLSUw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFNoYWRlck1hdGVyaWFsLCBVbmlmb3JtIH0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5jb25zdCBmcmFnbWVudCA9IFwidW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdFBlcnR1cmI7XFxyXFxuXFxyXFxudW5pZm9ybSBib29sIGFjdGl2ZTtcXHJcXG5cXHJcXG51bmlmb3JtIGZsb2F0IGFtb3VudDtcXHJcXG51bmlmb3JtIGZsb2F0IGFuZ2xlO1xcclxcbnVuaWZvcm0gZmxvYXQgc2VlZDtcXHJcXG51bmlmb3JtIGZsb2F0IHNlZWRYO1xcclxcbnVuaWZvcm0gZmxvYXQgc2VlZFk7XFxyXFxudW5pZm9ybSBmbG9hdCBkaXN0b3J0aW9uWDtcXHJcXG51bmlmb3JtIGZsb2F0IGRpc3RvcnRpb25ZO1xcclxcbnVuaWZvcm0gZmxvYXQgY29sUztcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbmZsb2F0IHJhbmQodmVjMiB0Yykge1xcclxcblxcclxcblxcdGNvbnN0IGZsb2F0IGEgPSAxMi45ODk4O1xcclxcblxcdGNvbnN0IGZsb2F0IGIgPSA3OC4yMzM7XFxyXFxuXFx0Y29uc3QgZmxvYXQgYyA9IDQzNzU4LjU0NTM7XFxyXFxuXFxyXFxuXFx0ZmxvYXQgZHQgPSBkb3QodGMsIHZlYzIoYSwgYikpO1xcclxcblxcdGZsb2F0IHNuID0gbW9kKGR0LCAzLjE0KTtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gZnJhY3Qoc2luKHNuKSAqIGMpO1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjMiBjb29yZCA9IHZVdjtcXHJcXG5cXHJcXG5cXHRmbG9hdCB4cywgeXM7XFxyXFxuXFx0dmVjNCBub3JtYWw7XFxyXFxuXFxyXFxuXFx0dmVjMiBvZmZzZXQ7XFxyXFxuXFx0dmVjNCBjciwgY2dhLCBjYjtcXHJcXG5cXHR2ZWM0IHNub3csIGNvbG9yO1xcclxcblxcclxcblxcdGZsb2F0IHN4LCBzeTtcXHJcXG5cXHJcXG5cXHRpZihhY3RpdmUpIHtcXHJcXG5cXHJcXG5cXHRcXHR4cyA9IGZsb29yKGdsX0ZyYWdDb29yZC54IC8gMC41KTtcXHJcXG5cXHRcXHR5cyA9IGZsb29yKGdsX0ZyYWdDb29yZC55IC8gMC41KTtcXHJcXG5cXHJcXG5cXHRcXHRub3JtYWwgPSB0ZXh0dXJlMkQodFBlcnR1cmIsIGNvb3JkICogc2VlZCAqIHNlZWQpO1xcclxcblxcclxcblxcdFxcdGlmKGNvb3JkLnkgPCBkaXN0b3J0aW9uWCArIGNvbFMgJiYgY29vcmQueSA+IGRpc3RvcnRpb25YIC0gY29sUyAqIHNlZWQpIHtcXHJcXG5cXHJcXG5cXHRcXHRcXHRzeCA9IGNsYW1wKGNlaWwoc2VlZFgpLCAwLjAsIDEuMCk7XFxyXFxuXFx0XFx0XFx0Y29vcmQueSA9IHN4ICogKDEuMCAtIChjb29yZC55ICsgZGlzdG9ydGlvblkpKSArICgxLjAgLSBzeCkgKiBkaXN0b3J0aW9uWTtcXHJcXG5cXHJcXG5cXHRcXHR9XFxyXFxuXFxyXFxuXFx0XFx0aWYoY29vcmQueCA8IGRpc3RvcnRpb25ZICsgY29sUyAmJiBjb29yZC54ID4gZGlzdG9ydGlvblkgLSBjb2xTICogc2VlZCkge1xcclxcblxcclxcblxcdFxcdFxcdHN5ID0gY2xhbXAoY2VpbChzZWVkWSksIDAuMCwgMS4wKTtcXHJcXG5cXHRcXHRcXHRjb29yZC54ID0gc3kgKiBkaXN0b3J0aW9uWCArICgxLjAgLSBzeSkgKiAoMS4wIC0gKGNvb3JkLnggKyBkaXN0b3J0aW9uWCkpO1xcclxcblxcclxcblxcdFxcdH1cXHJcXG5cXHJcXG5cXHRcXHRjb29yZC54ICs9IG5vcm1hbC54ICogc2VlZFggKiAoc2VlZCAvIDUuMCk7XFxyXFxuXFx0XFx0Y29vcmQueSArPSBub3JtYWwueSAqIHNlZWRZICogKHNlZWQgLyA1LjApO1xcclxcblxcclxcblxcdFxcdG9mZnNldCA9IGFtb3VudCAqIHZlYzIoY29zKGFuZ2xlKSwgc2luKGFuZ2xlKSk7XFxyXFxuXFxyXFxuXFx0XFx0Y3IgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIGNvb3JkICsgb2Zmc2V0KTtcXHJcXG5cXHRcXHRjZ2EgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIGNvb3JkKTtcXHJcXG5cXHRcXHRjYiA9IHRleHR1cmUyRCh0RGlmZnVzZSwgY29vcmQgLSBvZmZzZXQpO1xcclxcblxcclxcblxcdFxcdGNvbG9yID0gdmVjNChjci5yLCBjZ2EuZywgY2IuYiwgY2dhLmEpO1xcclxcblxcdFxcdHNub3cgPSAyMDAuMCAqIGFtb3VudCAqIHZlYzQocmFuZCh2ZWMyKHhzICogc2VlZCwgeXMgKiBzZWVkICogNTAuMCkpICogMC4yKTtcXHJcXG5cXHRcXHRjb2xvciArPSBzbm93O1xcclxcblxcclxcblxcdH0gZWxzZSB7XFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdik7XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvciA9IGNvbG9yO1xcclxcblxcclxcbn1cXHJcXG5cIjtcclxuY29uc3QgdmVydGV4ID0gXCJ2YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2VXYgPSB1djtcXHJcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcclxuXHJcbi8qKlxyXG4gKiBBIGdsaXRjaCBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIFJlZmVyZW5jZTpcclxuICogIGh0dHBzOi8vZ2l0aHViLmNvbS9zdGFmZmFudGFuL3VuaXR5Z2xpdGNoXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIEdsaXRjaE1hdGVyaWFsIGV4dGVuZHMgU2hhZGVyTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGdsaXRjaCBtYXRlcmlhbC5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0c3VwZXIoe1xyXG5cclxuXHRcdFx0dHlwZTogXCJHbGl0Y2hNYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0dW5pZm9ybXM6IHtcclxuXHJcblx0XHRcdFx0dERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxyXG5cdFx0XHRcdHRQZXJ0dXJiOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHJcblx0XHRcdFx0YWN0aXZlOiBuZXcgVW5pZm9ybSgxKSxcclxuXHJcblx0XHRcdFx0YW1vdW50OiBuZXcgVW5pZm9ybSgwLjgpLFxyXG5cdFx0XHRcdGFuZ2xlOiBuZXcgVW5pZm9ybSgwLjAyKSxcclxuXHRcdFx0XHRzZWVkOiBuZXcgVW5pZm9ybSgwLjAyKSxcclxuXHRcdFx0XHRzZWVkWDogbmV3IFVuaWZvcm0oMC4wMiksXHJcblx0XHRcdFx0c2VlZFk6IG5ldyBVbmlmb3JtKDAuMDIpLFxyXG5cdFx0XHRcdGRpc3RvcnRpb25YOiBuZXcgVW5pZm9ybSgwLjUpLFxyXG5cdFx0XHRcdGRpc3RvcnRpb25ZOiBuZXcgVW5pZm9ybSgwLjYpLFxyXG5cdFx0XHRcdGNvbFM6IG5ldyBVbmlmb3JtKDAuMDUpXHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50LFxyXG5cdFx0XHR2ZXJ0ZXhTaGFkZXI6IHZlcnRleCxcclxuXHJcblx0XHRcdGRlcHRoV3JpdGU6IGZhbHNlLFxyXG5cdFx0XHRkZXB0aFRlc3Q6IGZhbHNlXHJcblxyXG5cdFx0fSk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwsIFVuaWZvcm0gfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmNvbnN0IGZyYWdtZW50ID0gXCIjaW5jbHVkZSA8Y29tbW9uPlxcclxcbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cXHJcXG5cXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIHZlYzMgbGlnaHRQb3NpdGlvbjtcXHJcXG5cXHJcXG51bmlmb3JtIGZsb2F0IGV4cG9zdXJlO1xcclxcbnVuaWZvcm0gZmxvYXQgZGVjYXk7XFxyXFxudW5pZm9ybSBmbG9hdCBkZW5zaXR5O1xcclxcbnVuaWZvcm0gZmxvYXQgd2VpZ2h0O1xcclxcbnVuaWZvcm0gZmxvYXQgY2xhbXBNYXg7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjMiB0ZXhDb29yZCA9IHZVdjtcXHJcXG5cXHJcXG5cXHQvLyBDYWxjdWxhdGUgdmVjdG9yIGZyb20gcGl4ZWwgdG8gbGlnaHQgc291cmNlIGluIHNjcmVlbiBzcGFjZS5cXHJcXG5cXHR2ZWMyIGRlbHRhVGV4Q29vcmQgPSB0ZXhDb29yZCAtIGxpZ2h0UG9zaXRpb24uc3Q7XFxyXFxuXFx0ZGVsdGFUZXhDb29yZCAqPSAxLjAgLyBOVU1fU0FNUExFU19GTE9BVCAqIGRlbnNpdHk7XFxyXFxuXFxyXFxuXFx0Ly8gQSBkZWNyZWFzaW5nIGlsbHVtaW5hdGlvbiBmYWN0b3IuXFxyXFxuXFx0ZmxvYXQgaWxsdW1pbmF0aW9uRGVjYXkgPSAxLjA7XFxyXFxuXFxyXFxuXFx0dmVjNCBzYW1wbGU7XFxyXFxuXFx0dmVjNCBjb2xvciA9IHZlYzQoMC4wKTtcXHJcXG5cXHJcXG5cXHQvLyBFc3RpbWF0ZSB0aGUgcHJvYmFiaWxpdHkgb2Ygb2NjbHVzaW9uIGF0IGVhY2ggcGl4ZWwgYnkgc3VtbWluZyBzYW1wbGVzIGFsb25nIGEgcmF5IHRvIHRoZSBsaWdodCBzb3VyY2UuXFxyXFxuXFx0Zm9yKGludCBpID0gMDsgaSA8IE5VTV9TQU1QTEVTX0lOVDsgKytpKSB7XFxyXFxuXFxyXFxuXFx0XFx0dGV4Q29vcmQgLT0gZGVsdGFUZXhDb29yZDtcXHJcXG5cXHRcXHRzYW1wbGUgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHRleENvb3JkKTtcXHJcXG5cXHJcXG5cXHRcXHQvLyBBcHBseSBzYW1wbGUgYXR0ZW51YXRpb24gc2NhbGUvZGVjYXkgZmFjdG9ycy5cXHJcXG5cXHRcXHRzYW1wbGUgKj0gaWxsdW1pbmF0aW9uRGVjYXkgKiB3ZWlnaHQ7XFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IgKz0gc2FtcGxlO1xcclxcblxcclxcblxcdFxcdC8vIFVwZGF0ZSBleHBvbmVudGlhbCBkZWNheSBmYWN0b3IuXFxyXFxuXFx0XFx0aWxsdW1pbmF0aW9uRGVjYXkgKj0gZGVjYXk7XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvciA9IGNsYW1wKGNvbG9yICogZXhwb3N1cmUsIDAuMCwgY2xhbXBNYXgpO1xcclxcblxcclxcblxcdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5jb25zdCB2ZXJ0ZXggPSBcInZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5cclxuLyoqXHJcbiAqIEEgY3JlcHVzY3VsYXIgcmF5cyBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIFRoaXMgbWF0ZXJpYWwgc3VwcG9ydHMgZGl0aGVyaW5nLlxyXG4gKlxyXG4gKiBSZWZlcmVuY2VzOlxyXG4gKlxyXG4gKiBUaGliYXV0IERlc3BvdWxhaW4sIDIwMTI6XHJcbiAqICBbKFdlYkdMKSBWb2x1bWV0cmljIExpZ2h0IEFwcHJveGltYXRpb24gaW4gVGhyZWUuanNdKFxyXG4gKiAgaHR0cDovL2JrY29yZS5jb20vYmxvZy8zZC93ZWJnbC10aHJlZS1qcy12b2x1bWV0cmljLWxpZ2h0LWdvZHJheXMuaHRtbClcclxuICpcclxuICogTnZpZGlhLCBHUFUgR2VtcyAzLCAyMDA4OlxyXG4gKiAgW0NoYXB0ZXIgMTMuIFZvbHVtZXRyaWMgTGlnaHQgU2NhdHRlcmluZyBhcyBhIFBvc3QtUHJvY2Vzc10oXHJcbiAqICBodHRwczovL2RldmVsb3Blci5udmlkaWEuY29tL2dwdWdlbXMvR1BVR2VtczMvZ3B1Z2VtczNfY2gxMy5odG1sKVxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBHb2RSYXlzTWF0ZXJpYWwgZXh0ZW5kcyBTaGFkZXJNYXRlcmlhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZ29kIHJheXMgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRlbnNpdHk9MC45Nl0gLSBUaGUgZGVuc2l0eSBvZiB0aGUgbGlnaHQgcmF5cy5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZGVjYXk9MC45M10gLSBBbiBpbGx1bWluYXRpb24gZGVjYXkgZmFjdG9yLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy53ZWlnaHQ9MC40XSAtIEEgbGlnaHQgcmF5IHdlaWdodCBmYWN0b3IuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmV4cG9zdXJlPTAuNl0gLSBBIGNvbnN0YW50IGF0dGVudWF0aW9uIGNvZWZmaWNpZW50LlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5jbGFtcE1heD0xLjBdIC0gQW4gdXBwZXIgYm91bmQgZm9yIHRoZSBzYXR1cmF0aW9uIG9mIHRoZSBvdmVyYWxsIGVmZmVjdC5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XHJcblxyXG5cdFx0Y29uc3Qgc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHtcclxuXHRcdFx0ZXhwb3N1cmU6IDAuNixcclxuXHRcdFx0ZGVuc2l0eTogMC45MyxcclxuXHRcdFx0ZGVjYXk6IDAuOTYsXHJcblx0XHRcdHdlaWdodDogMC40LFxyXG5cdFx0XHRjbGFtcE1heDogMS4wXHJcblx0XHR9LCBvcHRpb25zKTtcclxuXHJcblx0XHRzdXBlcih7XHJcblxyXG5cdFx0XHR0eXBlOiBcIkdvZFJheXNNYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0ZGVmaW5lczoge1xyXG5cclxuXHRcdFx0XHROVU1fU0FNUExFU19GTE9BVDogXCI2MC4wXCIsXHJcblx0XHRcdFx0TlVNX1NBTVBMRVNfSU5UOiBcIjYwXCJcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHR1bmlmb3Jtczoge1xyXG5cclxuXHRcdFx0XHR0RGlmZnVzZTogbmV3IFVuaWZvcm0obnVsbCksXHJcblx0XHRcdFx0bGlnaHRQb3NpdGlvbjogbmV3IFVuaWZvcm0obnVsbCksXHJcblxyXG5cdFx0XHRcdGV4cG9zdXJlOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5leHBvc3VyZSksXHJcblx0XHRcdFx0ZGVjYXk6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmRlY2F5KSxcclxuXHRcdFx0XHRkZW5zaXR5OiBuZXcgVW5pZm9ybShzZXR0aW5ncy5kZW5zaXR5KSxcclxuXHRcdFx0XHR3ZWlnaHQ6IG5ldyBVbmlmb3JtKHNldHRpbmdzLndlaWdodCksXHJcblx0XHRcdFx0Y2xhbXBNYXg6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmNsYW1wTWF4KVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCxcclxuXHRcdFx0dmVydGV4U2hhZGVyOiB2ZXJ0ZXgsXHJcblxyXG5cdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhUZXN0OiBmYWxzZVxyXG5cclxuXHRcdH0pO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFNoYWRlck1hdGVyaWFsLCBVbmlmb3JtLCBWZWN0b3IyIH0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5jb25zdCBmcmFnbWVudCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXHJcXG5cXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIGZsb2F0IGRpc3RpbmN0aW9uO1xcclxcbnVuaWZvcm0gdmVjMiByYW5nZTtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWM0IHRleGVsID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYpO1xcclxcblxcdGZsb2F0IGwgPSBsaW5lYXJUb1JlbGF0aXZlTHVtaW5hbmNlKHRleGVsLnJnYik7XFxyXFxuXFxyXFxuXFx0I2lmZGVmIFJBTkdFXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgbG93ID0gc3RlcChyYW5nZS54LCBsKTtcXHJcXG5cXHRcXHRmbG9hdCBoaWdoID0gc3RlcChsLCByYW5nZS55KTtcXHJcXG5cXHJcXG5cXHRcXHQvLyBBcHBseSB0aGUgbWFzay5cXHJcXG5cXHRcXHRsICo9IGxvdyAqIGhpZ2g7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0bCA9IHBvdyhhYnMobCksIGRpc3RpbmN0aW9uKTtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgQ09MT1JcXHJcXG5cXHJcXG5cXHRcXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KHRleGVsLnJnYiAqIGwsIHRleGVsLmEpO1xcclxcblxcclxcblxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0Z2xfRnJhZ0NvbG9yID0gdmVjNChsLCBsLCBsLCB0ZXhlbC5hKTtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcbmNvbnN0IHZlcnRleCA9IFwidmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcblxyXG4vKipcclxuICogQSBsdW1pbm9zaXR5IHNoYWRlciBtYXRlcmlhbC5cclxuICpcclxuICogVGhpcyBzaGFkZXIgcHJvZHVjZXMgYSBncmV5c2NhbGUgbHVtaW5hbmNlIG1hcCB0aGF0IGRlc2NyaWJlcyB0aGUgYWJzb2x1dGVcclxuICogYW1vdW50IG9mIGxpZ2h0IGVtaXR0ZWQgYnkgYSBzY2VuZS4gSXQgY2FuIGFsc28gYmUgY29uZmlndXJlZCB0byBvdXRwdXRcclxuICogY29sb3VycyB0aGF0IGFyZSBzY2FsZWQgd2l0aCB0aGVpciByZXNwZWN0aXZlIGx1bWluYW5jZSB2YWx1ZS4gQWRkaXRpb25hbGx5LFxyXG4gKiBhIHJhbmdlIG1heSBiZSBwcm92aWRlZCB0byBtYXNrIG91dCB1bmRlc2lyZWQgdGV4ZWxzLlxyXG4gKlxyXG4gKiBUaGUgYWxwaGEgY2hhbm5lbCB3aWxsIHJlbWFpbiB1bmFmZmVjdGVkIGluIGFsbCBjYXNlcy5cclxuICpcclxuICogT24gbHVtaW5hbmNlIGNvZWZmaWNpZW50czpcclxuICogIGh0dHA6Ly93d3cucG95bnRvbi5jb20vbm90ZXMvY29sb3VyX2FuZF9nYW1tYS9Db2xvckZBUS5odG1sI1JURlRvQzlcclxuICpcclxuICogQ29lZmZpY2llbnRzIGZvciBkaWZmZXJlbnQgY29sb3VyIHNwYWNlczpcclxuICogIGh0dHBzOi8vaHN0by5vcmcvZ2V0cHJvL2hhYnIvcG9zdF9pbWFnZXMvMmFiLzY5ZC8wODQvMmFiNjlkMDg0ZjlhNTk3ZTAzMjYyNGJjZDc0ZDU3YTcucG5nXHJcbiAqXHJcbiAqIEx1bWluYW5jZSByYW5nZSByZWZlcmVuY2U6XHJcbiAqICBodHRwczovL2N5Y2xpbmc3NC5jb20vMjAwNy8wNS8yMy95b3VyLWZpcnN0LXNoYWRlci8jLlZ0eTlGZmtyTDRaXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIEx1bWlub3NpdHlNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBsdW1pbm9zaXR5IG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbY29sb3JPdXRwdXQ9ZmFsc2VdIC0gRGVmaW5lcyB3aGV0aGVyIHRoZSBzaGFkZXIgc2hvdWxkIG91dHB1dCBjb2xvdXJzIHNjYWxlZCB3aXRoIHRoZWlyIGx1bWluYW5jZSB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IFtsdW1pbmFuY2VSYW5nZV0gLSBJZiBwcm92aWRlZCwgdGhlIHNoYWRlciB3aWxsIG1hc2sgb3V0IHRleGVscyB0aGF0IGFyZW4ndCBpbiB0aGUgc3BlY2lmaWVkIGx1bWluYW5jZSByYW5nZS5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3IoY29sb3JPdXRwdXQgPSBmYWxzZSwgbHVtaW5hbmNlUmFuZ2UgPSBudWxsKSB7XHJcblxyXG5cdFx0Y29uc3QgbWFza0x1bWluYW5jZSA9IChsdW1pbmFuY2VSYW5nZSAhPT0gbnVsbCk7XHJcblxyXG5cdFx0c3VwZXIoe1xyXG5cclxuXHRcdFx0dHlwZTogXCJMdW1pbm9zaXR5TWF0ZXJpYWxcIixcclxuXHJcblx0XHRcdHVuaWZvcm1zOiB7XHJcblxyXG5cdFx0XHRcdHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHRcdFx0XHRkaXN0aW5jdGlvbjogbmV3IFVuaWZvcm0oMS4wKSxcclxuXHRcdFx0XHRyYW5nZTogbmV3IFVuaWZvcm0obWFza0x1bWluYW5jZSA/IGx1bWluYW5jZVJhbmdlIDogbmV3IFZlY3RvcjIoKSlcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQsXHJcblx0XHRcdHZlcnRleFNoYWRlcjogdmVydGV4XHJcblxyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5zZXRDb2xvck91dHB1dEVuYWJsZWQoY29sb3JPdXRwdXQpO1xyXG5cdFx0dGhpcy5zZXRMdW1pbmFuY2VSYW5nZUVuYWJsZWQobWFza0x1bWluYW5jZSk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRW5hYmxlcyBvciBkaXNhYmxlcyBjb2xvciBvdXRwdXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIGNvbG9yIG91dHB1dCBzaG91bGQgYmUgZW5hYmxlZC5cclxuXHQgKi9cclxuXHJcblx0c2V0Q29sb3JPdXRwdXRFbmFibGVkKGVuYWJsZWQpIHtcclxuXHJcblx0XHRpZihlbmFibGVkKSB7XHJcblxyXG5cdFx0XHR0aGlzLmRlZmluZXMuQ09MT1IgPSBcIjFcIjtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0ZGVsZXRlIHRoaXMuZGVmaW5lcy5DT0xPUjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgbHVtaW5hbmNlIG1hc2suXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBsdW1pbmFuY2UgbWFzayBzaG91bGQgYmUgZW5hYmxlZC5cclxuXHQgKi9cclxuXHJcblx0c2V0THVtaW5hbmNlUmFuZ2VFbmFibGVkKGVuYWJsZWQpIHtcclxuXHJcblx0XHRpZihlbmFibGVkKSB7XHJcblxyXG5cdFx0XHR0aGlzLmRlZmluZXMuUkFOR0UgPSBcIjFcIjtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0ZGVsZXRlIHRoaXMuZGVmaW5lcy5SQU5HRTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgQ29sb3IsIFNoYWRlck1hdGVyaWFsLCBVbmlmb3JtIH0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5jb25zdCBmcmFnbWVudCA9IFwidW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdE1hc2s7XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdEVkZ2VzO1xcclxcblxcclxcbnVuaWZvcm0gdmVjMyB2aXNpYmxlRWRnZUNvbG9yO1xcclxcbnVuaWZvcm0gdmVjMyBoaWRkZW5FZGdlQ29sb3I7XFxyXFxudW5pZm9ybSBmbG9hdCBwdWxzZTtcXHJcXG51bmlmb3JtIGZsb2F0IGVkZ2VTdHJlbmd0aDtcXHJcXG5cXHJcXG4jaWZkZWYgVVNFX1BBVFRFUk5cXHJcXG5cXHJcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCB0UGF0dGVybjtcXHJcXG5cXHR2YXJ5aW5nIHZlYzIgdlBhdHRlcm5Db29yZDtcXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWM0IGNvbG9yID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYpO1xcclxcblxcdHZlYzIgZWRnZSA9IHRleHR1cmUyRCh0RWRnZXMsIHZVdikucmc7XFxyXFxuXFx0dmVjMiBtYXNrID0gdGV4dHVyZTJEKHRNYXNrLCB2VXYpLnJnO1xcclxcblxcclxcblxcdCNpZm5kZWYgWF9SQVlcXHJcXG5cXHJcXG5cXHRcXHRlZGdlLnkgPSAwLjA7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0ZWRnZSAqPSAoZWRnZVN0cmVuZ3RoICogbWFzay54ICogcHVsc2UpO1xcclxcblxcdHZlYzMgb3V0bGluZUNvbG9yID0gZWRnZS54ICogdmlzaWJsZUVkZ2VDb2xvciArIGVkZ2UueSAqIGhpZGRlbkVkZ2VDb2xvcjtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgQUxQSEFfQkxFTkRJTkdcXHJcXG5cXHJcXG5cXHRcXHRjb2xvci5yZ2IgPSBtaXgoY29sb3IucmdiLCBvdXRsaW5lQ29sb3IsIG1heChlZGdlLngsIGVkZ2UueSkpO1xcclxcblxcclxcblxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IucmdiICs9IG91dGxpbmVDb2xvcjtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHQjaWZkZWYgVVNFX1BBVFRFUk5cXHJcXG5cXHJcXG5cXHRcXHR2ZWMzIHBhdHRlcm5Db2xvciA9IHRleHR1cmUyRCh0UGF0dGVybiwgdlBhdHRlcm5Db29yZCkucmdiO1xcclxcblxcclxcblxcdFxcdCNpZmRlZiBYX1JBWVxcclxcblxcclxcblxcdFxcdFxcdGZsb2F0IGhpZGRlbkZhY3RvciA9IDAuNTtcXHJcXG5cXHJcXG5cXHRcXHQjZWxzZVxcclxcblxcclxcblxcdFxcdFxcdGZsb2F0IGhpZGRlbkZhY3RvciA9IDAuMDtcXHJcXG5cXHJcXG5cXHRcXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCB2aXNpYmlsaXR5RmFjdG9yID0gKDEuMCAtIG1hc2sueSA+IDAuMCkgPyAxLjAgOiBoaWRkZW5GYWN0b3I7XFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IucmdiICs9IHZpc2liaWxpdHlGYWN0b3IgKiAoMS4wIC0gbWFzay54KSAqICgxLjAgLSBwYXR0ZXJuQ29sb3IpO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvciA9IGNvbG9yO1xcclxcblxcclxcbn1cXHJcXG5cIjtcclxuY29uc3QgdmVydGV4ID0gXCIjaWZkZWYgVVNFX1BBVFRFUk5cXHJcXG5cXHJcXG5cXHR1bmlmb3JtIGZsb2F0IGFzcGVjdDtcXHJcXG5cXHR1bmlmb3JtIGZsb2F0IHBhdHRlcm5TY2FsZTtcXHJcXG5cXHR2YXJ5aW5nIHZlYzIgdlBhdHRlcm5Db29yZDtcXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgVVNFX1BBVFRFUk5cXHJcXG5cXHJcXG5cXHRcXHR2ZWMyIGFzcGVjdENvcnJlY3Rpb24gPSB2ZWMyKGFzcGVjdCwgMS4wKTtcXHJcXG5cXHRcXHR2UGF0dGVybkNvb3JkID0gdXYgKiBhc3BlY3RDb3JyZWN0aW9uICogcGF0dGVyblNjYWxlO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5cclxuLyoqXHJcbiAqIEFuIG91dGxpbmUgYmxlbmQgc2hhZGVyIG1hdGVyaWFsLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBPdXRsaW5lQmxlbmRNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBvdXRsaW5lIGJsZW5kIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5lZGdlU3RyZW5ndGg9MS4wXSAtIFRoZSBlZGdlIHN0cmVuZ3RoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5wYXR0ZXJuU2NhbGU9MS4wXSAtIFRoZSBzY2FsZSBvZiB0aGUgcGF0dGVybiB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy52aXNpYmxlRWRnZUNvbG9yPTB4ZmZmZmZmXSAtIFRoZSBjb2xvciBvZiB2aXNpYmxlIGVkZ2VzLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5oaWRkZW5FZGdlQ29sb3I9MHgyMjA5MEFdIC0gVGhlIGNvbG9yIG9mIGhpZGRlbiBlZGdlcy5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFthbHBoYUJsZW5kaW5nPWZhbHNlXSAtIFdoZXRoZXIgdGhlIG91dGxpbmUgc2hvdWxkIGJlIGJsZW5kZWQgdXNpbmcgYWxwaGEuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbeFJheT10cnVlXSAtIFdoZXRoZXIgaGlkZGVuIHBhcnRzIG9mIHNlbGVjdGVkIG9iamVjdHMgc2hvdWxkIGJlIHZpc2libGUuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xyXG5cclxuXHRcdGNvbnN0IHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7XHJcblx0XHRcdGVkZ2VTdHJlbmd0aDogMS4wLFxyXG5cdFx0XHRwYXR0ZXJuU2NhbGU6IDEuMCxcclxuXHRcdFx0dmlzaWJsZUVkZ2VDb2xvcjogMHhmZmZmZmYsXHJcblx0XHRcdGhpZGRlbkVkZ2VDb2xvcjogMHgyMjA5MEEsXHJcblx0XHRcdGFscGhhQmxlbmRpbmc6IGZhbHNlLFxyXG5cdFx0XHR4UmF5OiB0cnVlXHJcblx0XHR9LCBvcHRpb25zKTtcclxuXHJcblx0XHRzdXBlcih7XHJcblxyXG5cdFx0XHR0eXBlOiBcIk91dGxpbmVCbGVuZE1hdGVyaWFsXCIsXHJcblxyXG5cdFx0XHR1bmlmb3Jtczoge1xyXG5cclxuXHRcdFx0XHRwdWxzZTogbmV3IFVuaWZvcm0oMS4wKSxcclxuXHRcdFx0XHRhc3BlY3Q6IG5ldyBVbmlmb3JtKDEuMCksXHJcblxyXG5cdFx0XHRcdHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHRcdFx0XHR0TWFzazogbmV3IFVuaWZvcm0obnVsbCksXHJcblx0XHRcdFx0dEVkZ2VzOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHRcdFx0XHR0UGF0dGVybjogbmV3IFVuaWZvcm0obnVsbCksXHJcblxyXG5cdFx0XHRcdGVkZ2VTdHJlbmd0aDogbmV3IFVuaWZvcm0oc2V0dGluZ3MuZWRnZVN0cmVuZ3RoKSxcclxuXHRcdFx0XHRwYXR0ZXJuU2NhbGU6IG5ldyBVbmlmb3JtKHNldHRpbmdzLnBhdHRlcm5TY2FsZSksXHJcblxyXG5cdFx0XHRcdHZpc2libGVFZGdlQ29sb3I6IG5ldyBVbmlmb3JtKG5ldyBDb2xvcihzZXR0aW5ncy52aXNpYmxlRWRnZUNvbG9yKSksXHJcblx0XHRcdFx0aGlkZGVuRWRnZUNvbG9yOiBuZXcgVW5pZm9ybShuZXcgQ29sb3Ioc2V0dGluZ3MuaGlkZGVuRWRnZUNvbG9yKSlcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQsXHJcblx0XHRcdHZlcnRleFNoYWRlcjogdmVydGV4LFxyXG5cclxuXHRcdFx0ZGVwdGhXcml0ZTogZmFsc2UsXHJcblx0XHRcdGRlcHRoVGVzdDogZmFsc2VcclxuXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnNldEFscGhhQmxlbmRpbmdFbmFibGVkKHNldHRpbmdzLmFscGhhQmxlbmRpbmcpO1xyXG5cdFx0dGhpcy5zZXRYUmF5RW5hYmxlZChzZXR0aW5ncy54UmF5KTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBhbHBoYSBibGVuZGluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhlIGFscGhhIGJsZW5kaW5nIHNob3VsZCBiZSBlbmFibGVkLlxyXG5cdCAqL1xyXG5cclxuXHRzZXRBbHBoYUJsZW5kaW5nRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLkFMUEhBX0JMRU5ESU5HID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuQUxQSEFfQkxFTkRJTkc7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgd2hldGhlciBoaWRkZW4gcGFydHMgb2Ygc2VsZWN0ZWQgb2JqZWN0cyBzaG91bGQgYmUgdmlzaWJsZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgaGlkZGVuIHBhcnRzIG9mIHNlbGVjdGVkIG9iamVjdHMgc2hvdWxkIGJlIHZpc2libGUuXHJcblx0ICovXHJcblxyXG5cdHNldFhSYXlFbmFibGVkKGVuYWJsZWQpIHtcclxuXHJcblx0XHRpZihlbmFibGVkKSB7XHJcblxyXG5cdFx0XHR0aGlzLmRlZmluZXMuWF9SQVkgPSBcIjFcIjtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0ZGVsZXRlIHRoaXMuZGVmaW5lcy5YX1JBWTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyBhIHBhdHRlcm4gdGV4dHVyZSB0byB1c2UgYXMgb3ZlcmxheS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gW3RleHR1cmU9bnVsbF0gLSBBIHBhdHRlcm4gdGV4dHVyZS4gU2V0IHRvIG51bGwgdG8gZGlzYWJsZSB0aGUgcGF0dGVybi5cclxuXHQgKi9cclxuXHJcblx0c2V0UGF0dGVyblRleHR1cmUodGV4dHVyZSA9IG51bGwpIHtcclxuXHJcblx0XHRpZih0ZXh0dXJlICE9PSBudWxsKSB7XHJcblxyXG5cdFx0XHR0aGlzLmRlZmluZXMuVVNFX1BBVFRFUk4gPSBcIjFcIjtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0ZGVsZXRlIHRoaXMuZGVmaW5lcy5VU0VfUEFUVEVSTjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy51bmlmb3Jtcy50UGF0dGVybi52YWx1ZSA9IHRleHR1cmU7XHJcblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBTaGFkZXJNYXRlcmlhbCwgVW5pZm9ybSwgVmVjdG9yMiB9IGZyb20gXCJ0aHJlZVwiO1xyXG5cclxuY29uc3QgZnJhZ21lbnQgPSBcInVuaWZvcm0gc2FtcGxlcjJEIHRNYXNrO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXYwO1xcclxcbnZhcnlpbmcgdmVjMiB2VXYxO1xcclxcbnZhcnlpbmcgdmVjMiB2VXYyO1xcclxcbnZhcnlpbmcgdmVjMiB2VXYzO1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWMyIGMwID0gdGV4dHVyZTJEKHRNYXNrLCB2VXYwKS5yZztcXHJcXG5cXHR2ZWMyIGMxID0gdGV4dHVyZTJEKHRNYXNrLCB2VXYxKS5yZztcXHJcXG5cXHR2ZWMyIGMyID0gdGV4dHVyZTJEKHRNYXNrLCB2VXYyKS5yZztcXHJcXG5cXHR2ZWMyIGMzID0gdGV4dHVyZTJEKHRNYXNrLCB2VXYzKS5yZztcXHJcXG5cXHJcXG5cXHRmbG9hdCBkMCA9IChjMC54IC0gYzEueCkgKiAwLjU7XFxyXFxuXFx0ZmxvYXQgZDEgPSAoYzIueCAtIGMzLngpICogMC41O1xcclxcblxcdGZsb2F0IGQgPSBsZW5ndGgodmVjMihkMCwgZDEpKTtcXHJcXG5cXHJcXG5cXHRmbG9hdCBhMCA9IG1pbihjMC55LCBjMS55KTtcXHJcXG5cXHRmbG9hdCBhMSA9IG1pbihjMi55LCBjMy55KTtcXHJcXG5cXHRmbG9hdCB2aXNpYmlsaXR5RmFjdG9yID0gbWluKGEwLCBhMSk7XFxyXFxuXFxyXFxuXFx0Z2xfRnJhZ0NvbG9yLnJnID0gKDEuMCAtIHZpc2liaWxpdHlGYWN0b3IgPiAwLjAwMSkgPyB2ZWMyKGQsIDAuMCkgOiB2ZWMyKDAuMCwgZCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5jb25zdCB2ZXJ0ZXggPSBcInVuaWZvcm0gdmVjMiB0ZXhlbFNpemU7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjA7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjE7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjI7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjM7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdjAgPSB2ZWMyKHV2LnggKyB0ZXhlbFNpemUueCwgdXYueSk7XFxyXFxuXFx0dlV2MSA9IHZlYzIodXYueCAtIHRleGVsU2l6ZS54LCB1di55KTtcXHJcXG5cXHR2VXYyID0gdmVjMih1di54LCB1di55ICsgdGV4ZWxTaXplLnkpO1xcclxcblxcdHZVdjMgPSB2ZWMyKHV2LngsIHV2LnkgLSB0ZXhlbFNpemUueSk7XFxyXFxuXFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcblxyXG4vKipcclxuICogQW4gb3V0bGluZSBlZGdlIGRldGVjdGlvbiBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIE91dGxpbmVFZGdlc01hdGVyaWFsIGV4dGVuZHMgU2hhZGVyTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG91dGxpbmUgZWRnZSBkZXRlY3Rpb24gbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IFt0ZXhlbFNpemVdIC0gVGhlIGFic29sdXRlIHNjcmVlbiB0ZXhlbCBzaXplLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3Rvcih0ZXhlbFNpemUgPSBuZXcgVmVjdG9yMigpKSB7XHJcblxyXG5cdFx0c3VwZXIoe1xyXG5cclxuXHRcdFx0dHlwZTogXCJPdXRsaW5lRWRnZXNNYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0dW5pZm9ybXM6IHtcclxuXHJcblx0XHRcdFx0dE1hc2s6IG5ldyBVbmlmb3JtKG51bGwpLFxyXG5cdFx0XHRcdHRleGVsU2l6ZTogbmV3IFVuaWZvcm0obmV3IFZlY3RvcjIoKSlcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQsXHJcblx0XHRcdHZlcnRleFNoYWRlcjogdmVydGV4LFxyXG5cclxuXHRcdFx0ZGVwdGhXcml0ZTogZmFsc2UsXHJcblx0XHRcdGRlcHRoVGVzdDogZmFsc2VcclxuXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnNldFRleGVsU2l6ZSh0ZXhlbFNpemUueCwgdGV4ZWxTaXplLnkpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHRleGVsIHNpemUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0geCAtIFRoZSB0ZXhlbCB3aWR0aC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0geSAtIFRoZSB0ZXhlbCBoZWlnaHQuXHJcblx0ICovXHJcblxyXG5cdHNldFRleGVsU2l6ZSh4LCB5KSB7XHJcblxyXG5cdFx0dGhpcy51bmlmb3Jtcy50ZXhlbFNpemUudmFsdWUuc2V0KHgsIHkpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFNoYWRlck1hdGVyaWFsLCBVbmlmb3JtLCBWZWN0b3IyIH0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5jb25zdCBmcmFnbWVudCA9IFwidW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxudW5pZm9ybSBmbG9hdCBncmFudWxhcml0eTtcXHJcXG51bmlmb3JtIGZsb2F0IGR4O1xcclxcbnVuaWZvcm0gZmxvYXQgZHk7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjNCB0ZXhlbDtcXHJcXG5cXHJcXG5cXHRpZihncmFudWxhcml0eSA+IDAuMCkge1xcclxcblxcclxcblxcdFxcdHZlYzIgY29vcmQgPSB2ZWMyKFxcclxcblxcdFxcdFxcdGR4ICogKGZsb29yKHZVdi54IC8gZHgpICsgMC41KSxcXHJcXG5cXHRcXHRcXHRkeSAqIChmbG9vcih2VXYueSAvIGR5KSArIDAuNSlcXHJcXG5cXHRcXHQpO1xcclxcblxcclxcblxcdFxcdHRleGVsID0gdGV4dHVyZTJEKHREaWZmdXNlLCBjb29yZCk7XFxyXFxuXFxyXFxuXFx0fSBlbHNlIHtcXHJcXG5cXHJcXG5cXHRcXHR0ZXhlbCA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2KTtcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0Z2xfRnJhZ0NvbG9yID0gdGV4ZWw7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5jb25zdCB2ZXJ0ZXggPSBcInZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5cclxuLyoqXHJcbiAqIEEgcGl4ZWxhdGlvbiBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIE9yaWdpbmFsIHNoYWRlciBjb2RlIGJ5IFJvYmVydCBDYXNhbm92YTpcclxuICogIGh0dHBzOi8vZ2l0aHViLmNvbS9yb2JlcnRjYXNhbm92YS9waXhlbGF0ZS1zaGFkZXJcclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgUGl4ZWxhdGlvbk1hdGVyaWFsIGV4dGVuZHMgU2hhZGVyTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHBpeGVsYXRpb24gbWF0ZXJpYWwuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKHtcclxuXHJcblx0XHRcdHR5cGU6IFwiUGl4ZWxhdGlvbk1hdGVyaWFsXCIsXHJcblxyXG5cdFx0XHR1bmlmb3Jtczoge1xyXG5cclxuXHRcdFx0XHR0RGlmZnVzZTogbmV3IFVuaWZvcm0obnVsbCksXHJcblx0XHRcdFx0Z3JhbnVsYXJpdHk6IG5ldyBVbmlmb3JtKDEuMCksXHJcblx0XHRcdFx0cmVzb2x1dGlvbjogbmV3IFVuaWZvcm0obmV3IFZlY3RvcjIoMS4wLCAxLjApKSxcclxuXHRcdFx0XHRkeDogbmV3IFVuaWZvcm0oMS4wKSxcclxuXHRcdFx0XHRkeTogbmV3IFVuaWZvcm0oMS4wKVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCxcclxuXHRcdFx0dmVydGV4U2hhZGVyOiB2ZXJ0ZXgsXHJcblxyXG5cdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhUZXN0OiBmYWxzZVxyXG5cclxuXHRcdH0pO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBwaXhlbCBncmFudWxhcml0eS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0ICovXHJcblxyXG5cdGdldCBncmFudWxhcml0eSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy51bmlmb3Jtcy5ncmFudWxhcml0eS52YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBIGhpZ2hlciB2YWx1ZSB5aWVsZHMgY29hcnNlciB2aXN1YWxzLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge051bWJlcn1cclxuXHQgKi9cclxuXHJcblx0c2V0IGdyYW51bGFyaXR5KHgpIHtcclxuXHJcblx0XHRjb25zdCB1bmlmb3JtcyA9IHRoaXMudW5pZm9ybXM7XHJcblx0XHRjb25zdCByZXNvbHV0aW9uID0gdW5pZm9ybXMucmVzb2x1dGlvbi52YWx1ZTtcclxuXHJcblx0XHR1bmlmb3Jtcy5ncmFudWxhcml0eS52YWx1ZSA9IHg7XHJcblx0XHR1bmlmb3Jtcy5keC52YWx1ZSA9IHggLyByZXNvbHV0aW9uLng7XHJcblx0XHR1bmlmb3Jtcy5keS52YWx1ZSA9IHggLyByZXNvbHV0aW9uLnk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgcmVzb2x1dGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodC5cclxuXHQgKi9cclxuXHJcblx0c2V0UmVzb2x1dGlvbih3aWR0aCwgaGVpZ2h0KSB7XHJcblxyXG5cdFx0dGhpcy51bmlmb3Jtcy5yZXNvbHV0aW9uLnZhbHVlLnNldCh3aWR0aCwgaGVpZ2h0KTtcclxuXHRcdHRoaXMuZ3JhbnVsYXJpdHkgPSB0aGlzLmdyYW51bGFyaXR5O1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFNoYWRlck1hdGVyaWFsLCBVbmlmb3JtLCBWZWN0b3IyIH0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5jb25zdCBmcmFnbWVudCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXHJcXG5cXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0RGVwdGg7XFxyXFxuXFxyXFxudW5pZm9ybSB2ZWMyIHRleGVsU2l6ZTtcXHJcXG51bmlmb3JtIHZlYzIgaGFsZlRleGVsU2l6ZTtcXHJcXG5cXHJcXG51bmlmb3JtIGZsb2F0IGNhbWVyYU5lYXI7XFxyXFxudW5pZm9ybSBmbG9hdCBjYW1lcmFGYXI7XFxyXFxuXFxyXFxudW5pZm9ybSBmbG9hdCBmb2NhbExlbmd0aDtcXHJcXG51bmlmb3JtIGZsb2F0IGZvY2FsU3RvcDtcXHJcXG5cXHJcXG51bmlmb3JtIGZsb2F0IG1heEJsdXI7XFxyXFxudW5pZm9ybSBmbG9hdCBsdW1pbmFuY2VUaHJlc2hvbGQ7XFxyXFxudW5pZm9ybSBmbG9hdCBsdW1pbmFuY2VHYWluO1xcclxcbnVuaWZvcm0gZmxvYXQgYmlhcztcXHJcXG51bmlmb3JtIGZsb2F0IGZyaW5nZTtcXHJcXG51bmlmb3JtIGZsb2F0IGRpdGhlclN0cmVuZ3RoO1xcclxcblxcclxcbiNpZmRlZiBTSEFERVJfRk9DVVNcXHJcXG5cXHJcXG5cXHR1bmlmb3JtIHZlYzIgZm9jdXNDb29yZHM7XFxyXFxuXFxyXFxuI2Vsc2VcXHJcXG5cXHJcXG5cXHR1bmlmb3JtIGZsb2F0IGZvY2FsRGVwdGg7XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG4jaWZuZGVmIFVTRV9MT0dERVBUSEJVRlxcclxcblxcclxcblxcdCNpbmNsdWRlIDxwYWNraW5nPlxcclxcblxcclxcblxcdGZsb2F0IHJlYWREZXB0aChzYW1wbGVyMkQgZGVwdGhTYW1wbGVyLCB2ZWMyIGNvb3JkKSB7XFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgZnJhZ0Nvb3JkWiA9IHRleHR1cmUyRChkZXB0aFNhbXBsZXIsIGNvb3JkKS54O1xcclxcblxcdFxcdGZsb2F0IHZpZXdaID0gcGVyc3BlY3RpdmVEZXB0aFRvVmlld1ooZnJhZ0Nvb3JkWiwgY2FtZXJhTmVhciwgY2FtZXJhRmFyKTtcXHJcXG5cXHJcXG5cXHRcXHRyZXR1cm4gdmlld1pUb09ydGhvZ3JhcGhpY0RlcHRoKHZpZXdaLCBjYW1lcmFOZWFyLCBjYW1lcmFGYXIpO1xcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG4jaWZkZWYgUEVOVEFHT05cXHJcXG5cXHJcXG5cXHRmbG9hdCBwZW50YSh2ZWMyIGNvb3Jkcykge1xcclxcblxcclxcblxcdFxcdGNvbnN0IHZlYzQgSFMwID0gdmVjNCggMS4wLCAgICAgICAgICAwLjAsICAgICAgICAgMC4wLCAxLjApO1xcclxcblxcdFxcdGNvbnN0IHZlYzQgSFMxID0gdmVjNCggMC4zMDkwMTY5OTQsICAwLjk1MTA1NjUxNiwgMC4wLCAxLjApO1xcclxcblxcdFxcdGNvbnN0IHZlYzQgSFMyID0gdmVjNCgtMC44MDkwMTY5OTQsICAwLjU4Nzc4NTI1MiwgMC4wLCAxLjApO1xcclxcblxcdFxcdGNvbnN0IHZlYzQgSFMzID0gdmVjNCgtMC44MDkwMTY5OTQsIC0wLjU4Nzc4NTI1MiwgMC4wLCAxLjApO1xcclxcblxcdFxcdGNvbnN0IHZlYzQgSFM0ID0gdmVjNCggMC4zMDkwMTY5OTQsIC0wLjk1MTA1NjUxNiwgMC4wLCAxLjApO1xcclxcblxcdFxcdGNvbnN0IHZlYzQgSFM1ID0gdmVjNCggMC4wLCAgICAgICAgICAwLjAsICAgICAgICAgMS4wLCAxLjApO1xcclxcblxcclxcblxcdFxcdGNvbnN0IHZlYzQgT05FID0gdmVjNCgxLjApO1xcclxcblxcclxcblxcdFxcdGNvbnN0IGZsb2F0IFBfRkVBVEhFUiA9IDAuNDtcXHJcXG5cXHRcXHRjb25zdCBmbG9hdCBOX0ZFQVRIRVIgPSAtUF9GRUFUSEVSO1xcclxcblxcclxcblxcdFxcdGZsb2F0IGluT3JPdXQgPSAtNC4wO1xcclxcblxcclxcblxcdFxcdHZlYzQgUCA9IHZlYzQoY29vcmRzLCB2ZWMyKFJJTkdTX0ZMT0FUIC0gMS4zKSk7XFxyXFxuXFxyXFxuXFx0XFx0dmVjNCBkaXN0ID0gdmVjNChcXHJcXG5cXHRcXHRcXHRkb3QoUCwgSFMwKSxcXHJcXG5cXHRcXHRcXHRkb3QoUCwgSFMxKSxcXHJcXG5cXHRcXHRcXHRkb3QoUCwgSFMyKSxcXHJcXG5cXHRcXHRcXHRkb3QoUCwgSFMzKVxcclxcblxcdFxcdCk7XFxyXFxuXFxyXFxuXFx0XFx0ZGlzdCA9IHNtb290aHN0ZXAoTl9GRUFUSEVSLCBQX0ZFQVRIRVIsIGRpc3QpO1xcclxcblxcclxcblxcdFxcdGluT3JPdXQgKz0gZG90KGRpc3QsIE9ORSk7XFxyXFxuXFxyXFxuXFx0XFx0ZGlzdC54ID0gZG90KFAsIEhTNCk7XFxyXFxuXFx0XFx0ZGlzdC55ID0gSFM1LncgLSBhYnMoUC56KTtcXHJcXG5cXHJcXG5cXHRcXHRkaXN0ID0gc21vb3Roc3RlcChOX0ZFQVRIRVIsIFBfRkVBVEhFUiwgZGlzdCk7XFxyXFxuXFx0XFx0aW5Pck91dCArPSBkaXN0Lng7XFxyXFxuXFxyXFxuXFx0XFx0cmV0dXJuIGNsYW1wKGluT3JPdXQsIDAuMCwgMS4wKTtcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxuI2lmZGVmIFNIT1dfRk9DVVNcXHJcXG5cXHJcXG5cXHR2ZWMzIGRlYnVnRm9jdXModmVjMyBjLCBmbG9hdCBibHVyLCBmbG9hdCBkZXB0aCkge1xcclxcblxcclxcblxcdFxcdGZsb2F0IGVkZ2UgPSAwLjAwMiAqIGRlcHRoO1xcclxcblxcdFxcdGZsb2F0IG0gPSBjbGFtcChzbW9vdGhzdGVwKDAuMCwgZWRnZSwgYmx1ciksIDAuMCwgMS4wKTtcXHJcXG5cXHRcXHRmbG9hdCBlID0gY2xhbXAoc21vb3Roc3RlcCgxLjAgLSBlZGdlLCAxLjAsIGJsdXIpLCAwLjAsIDEuMCk7XFxyXFxuXFxyXFxuXFx0XFx0YyA9IG1peChjLCB2ZWMzKDEuMCwgMC41LCAwLjApLCAoMS4wIC0gbSkgKiAwLjYpO1xcclxcblxcdFxcdGMgPSBtaXgoYywgdmVjMygwLjAsIDAuNSwgMS4wKSwgKCgxLjAgLSBlKSAtICgxLjAgLSBtKSkgKiAwLjIpO1xcclxcblxcclxcblxcdFxcdHJldHVybiBjO1xcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG4jaWZkZWYgVklHTkVUVEVcXHJcXG5cXHJcXG5cXHRmbG9hdCB2aWduZXR0ZSgpIHtcXHJcXG5cXHJcXG5cXHRcXHRjb25zdCB2ZWMyIENFTlRFUiA9IHZlYzIoMC41KTtcXHJcXG5cXHJcXG5cXHRcXHRjb25zdCBmbG9hdCBWSUdORVRURV9PVVQgPSAxLjM7XFxyXFxuXFx0XFx0Y29uc3QgZmxvYXQgVklHTkVUVEVfSU4gPSAwLjA7XFxyXFxuXFx0XFx0Y29uc3QgZmxvYXQgVklHTkVUVEVfRkFERSA9IDIyLjA7IFxcclxcblxcclxcblxcdFxcdGZsb2F0IGQgPSBkaXN0YW5jZSh2VXYsIENFTlRFUik7XFxyXFxuXFx0XFx0ZCA9IHNtb290aHN0ZXAoVklHTkVUVEVfT1VUICsgKGZvY2FsU3RvcCAvIFZJR05FVFRFX0ZBREUpLCBWSUdORVRURV9JTiArIChmb2NhbFN0b3AgLyBWSUdORVRURV9GQURFKSwgZCk7XFxyXFxuXFxyXFxuXFx0XFx0cmV0dXJuIGNsYW1wKGQsIDAuMCwgMS4wKTtcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxudmVjMiByYW5kMih2ZWMyIGNvb3JkKSB7XFxyXFxuXFxyXFxuXFx0dmVjMiBub2lzZTtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgTk9JU0VcXHJcXG5cXHJcXG5cXHRcXHRjb25zdCBmbG9hdCBhID0gMTIuOTg5ODtcXHJcXG5cXHRcXHRjb25zdCBmbG9hdCBiID0gNzguMjMzO1xcclxcblxcdFxcdGNvbnN0IGZsb2F0IGMgPSA0Mzc1OC41NDUzO1xcclxcblxcclxcblxcdFxcdG5vaXNlLnggPSBjbGFtcChmcmFjdChzaW4obW9kKGRvdChjb29yZCwgdmVjMihhLCBiKSksIDMuMTQpKSAqIGMpLCAwLjAsIDEuMCkgKiAyLjAgLSAxLjA7XFxyXFxuXFx0XFx0bm9pc2UueSA9IGNsYW1wKGZyYWN0KHNpbihtb2QoZG90KGNvb3JkLCB2ZWMyKGEsIGIpICogMi4wKSwgMy4xNCkpICogYyksIDAuMCwgMS4wKSAqIDIuMCAtIDEuMDtcXHJcXG5cXHJcXG5cXHQjZWxzZVxcclxcblxcclxcblxcdFxcdG5vaXNlLnggPSAoKGZyYWN0KDEuMCAtIGNvb3JkLnMgKiBoYWxmVGV4ZWxTaXplLngpICogMC4yNSkgKyAoZnJhY3QoY29vcmQudCAqIGhhbGZUZXhlbFNpemUueSkgKiAwLjc1KSkgKiAyLjAgLSAxLjA7XFxyXFxuXFx0XFx0bm9pc2UueSA9ICgoZnJhY3QoMS4wIC0gY29vcmQucyAqIGhhbGZUZXhlbFNpemUueCkgKiAwLjc1KSArIChmcmFjdChjb29yZC50ICogaGFsZlRleGVsU2l6ZS55KSAqIDAuMjUpKSAqIDIuMCAtIDEuMDtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRyZXR1cm4gbm9pc2U7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbnZlYzMgcHJvY2Vzc1RleGVsKHZlYzIgY29vcmRzLCBmbG9hdCBibHVyKSB7XFxyXFxuXFxyXFxuXFx0dmVjMyBjO1xcclxcblxcdGMuciA9IHRleHR1cmUyRCh0RGlmZnVzZSwgY29vcmRzICsgdmVjMigwLjAsIDEuMCkgKiB0ZXhlbFNpemUgKiBmcmluZ2UgKiBibHVyKS5yO1xcclxcblxcdGMuZyA9IHRleHR1cmUyRCh0RGlmZnVzZSwgY29vcmRzICsgdmVjMigtMC44NjYsIC0wLjUpICogdGV4ZWxTaXplICogZnJpbmdlICogYmx1cikuZztcXHJcXG5cXHRjLmIgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIGNvb3JkcyArIHZlYzIoMC44NjYsIC0wLjUpICogdGV4ZWxTaXplICogZnJpbmdlICogYmx1cikuYjtcXHJcXG5cXHJcXG5cXHQvLyBDYWxjdWxhdGUgdGhlIGx1bWluYW5jZSBvZiB0aGUgY29uc3RydWN0ZWQgY29sb3VyLlxcclxcblxcdGZsb2F0IGx1bWluYW5jZSA9IGxpbmVhclRvUmVsYXRpdmVMdW1pbmFuY2UoYyk7XFxyXFxuXFx0ZmxvYXQgdGhyZXNob2xkID0gbWF4KChsdW1pbmFuY2UgLSBsdW1pbmFuY2VUaHJlc2hvbGQpICogbHVtaW5hbmNlR2FpbiwgMC4wKTtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gYyArIG1peCh2ZWMzKDAuMCksIGMsIHRocmVzaG9sZCAqIGJsdXIpO1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG5mbG9hdCBsaW5lYXJpemUoZmxvYXQgZGVwdGgpIHtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gLWNhbWVyYUZhciAqIGNhbWVyYU5lYXIgLyAoZGVwdGggKiAoY2FtZXJhRmFyIC0gY2FtZXJhTmVhcikgLSBjYW1lcmFGYXIpO1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG5mbG9hdCBnYXRoZXIoZmxvYXQgaSwgZmxvYXQgaiwgZmxvYXQgcmluZ1NhbXBsZXMsIGlub3V0IHZlYzMgY29sb3IsIGZsb2F0IHcsIGZsb2F0IGgsIGZsb2F0IGJsdXIpIHtcXHJcXG5cXHJcXG5cXHRjb25zdCBmbG9hdCBUV09fUEkgPSA2LjI4MzE4NTMxO1xcclxcblxcclxcblxcdGZsb2F0IHN0ZXAgPSBUV09fUEkgLyByaW5nU2FtcGxlcztcXHJcXG5cXHRmbG9hdCBwdyA9IGNvcyhqICogc3RlcCkgKiBpO1xcclxcblxcdGZsb2F0IHBoID0gc2luKGogKiBzdGVwKSAqIGk7XFxyXFxuXFxyXFxuXFx0I2lmZGVmIFBFTlRBR09OXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgcCA9IHBlbnRhKHZlYzIocHcsIHBoKSk7XFxyXFxuXFxyXFxuXFx0I2Vsc2VcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBwID0gMS4wO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdGNvbG9yICs9IHByb2Nlc3NUZXhlbCh2VXYgKyB2ZWMyKHB3ICogdywgcGggKiBoKSwgYmx1cikgKiBtaXgoMS4wLCBpIC8gUklOR1NfRkxPQVQsIGJpYXMpICogcDtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gbWl4KDEuMCwgaSAvIFJJTkdTX0ZMT0FULCBiaWFzKSAqIHA7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgZGVwdGggPSBsaW5lYXJpemUodGV4dHVyZTJEKHREZXB0aCwgdlV2KS54KTtcXHJcXG5cXHJcXG5cXHQjZWxzZVxcclxcblxcclxcblxcdFxcdGZsb2F0IGRlcHRoID0gbGluZWFyaXplKHJlYWREZXB0aCh0RGVwdGgsIHZVdikpO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdCNpZmRlZiBTSEFERVJfRk9DVVNcXHJcXG5cXHJcXG5cXHRcXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXFxyXFxuXFxyXFxuXFx0XFx0XFx0ZmxvYXQgZkRlcHRoID0gbGluZWFyaXplKHRleHR1cmUyRCh0RGVwdGgsIGZvY3VzQ29vcmRzKS54KTtcXHJcXG5cXHJcXG5cXHRcXHQjZWxzZVxcclxcblxcclxcblxcdFxcdFxcdGZsb2F0IGZEZXB0aCA9IGxpbmVhcml6ZShyZWFkRGVwdGgodERlcHRoLCBmb2N1c0Nvb3JkcykpO1xcclxcblxcclxcblxcdFxcdCNlbmRpZlxcclxcblxcclxcblxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgZkRlcHRoID0gZm9jYWxEZXB0aDtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHQjaWZkZWYgTUFOVUFMX0RPRlxcclxcblxcclxcblxcdFxcdGNvbnN0IGZsb2F0IG5Eb0ZTdGFydCA9IDEuMDsgXFxyXFxuXFx0XFx0Y29uc3QgZmxvYXQgbkRvRkRpc3QgPSAyLjA7XFxyXFxuXFx0XFx0Y29uc3QgZmxvYXQgZkRvRlN0YXJ0ID0gMS4wO1xcclxcblxcdFxcdGNvbnN0IGZsb2F0IGZEb0ZEaXN0ID0gMy4wO1xcclxcblxcclxcblxcdFxcdGZsb2F0IGZvY2FsUGxhbmUgPSBkZXB0aCAtIGZEZXB0aDtcXHJcXG5cXHRcXHRmbG9hdCBmYXJEb0YgPSAoZm9jYWxQbGFuZSAtIGZEb0ZTdGFydCkgLyBmRG9GRGlzdDtcXHJcXG5cXHRcXHRmbG9hdCBuZWFyRG9GID0gKC1mb2NhbFBsYW5lIC0gbkRvRlN0YXJ0KSAvIG5Eb0ZEaXN0O1xcclxcblxcclxcblxcdFxcdGZsb2F0IGJsdXIgPSAoZm9jYWxQbGFuZSA+IDAuMCkgPyBmYXJEb0YgOiBuZWFyRG9GO1xcclxcblxcclxcblxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0Y29uc3QgZmxvYXQgQ0lSQ0xFX09GX0NPTkZVU0lPTiA9IDAuMDM7IC8vIDM1bW0gZmlsbSA9IDAuMDNtbSBDb0MuXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgZm9jYWxQbGFuZU1NID0gZkRlcHRoICogMTAwMC4wO1xcclxcblxcdFxcdGZsb2F0IGRlcHRoTU0gPSBkZXB0aCAqIDEwMDAuMDtcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBmb2NhbFBsYW5lID0gKGRlcHRoTU0gKiBmb2NhbExlbmd0aCkgLyAoZGVwdGhNTSAtIGZvY2FsTGVuZ3RoKTtcXHJcXG5cXHRcXHRmbG9hdCBmYXJEb0YgPSAoZm9jYWxQbGFuZU1NICogZm9jYWxMZW5ndGgpIC8gKGZvY2FsUGxhbmVNTSAtIGZvY2FsTGVuZ3RoKTtcXHJcXG5cXHRcXHRmbG9hdCBuZWFyRG9GID0gKGZvY2FsUGxhbmVNTSAtIGZvY2FsTGVuZ3RoKSAvIChmb2NhbFBsYW5lTU0gKiBmb2NhbFN0b3AgKiBDSVJDTEVfT0ZfQ09ORlVTSU9OKTtcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBibHVyID0gYWJzKGZvY2FsUGxhbmUgLSBmYXJEb0YpICogbmVhckRvRjtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRibHVyID0gY2xhbXAoYmx1ciwgMC4wLCAxLjApO1xcclxcblxcclxcblxcdC8vIERpdGhlcmluZy5cXHJcXG5cXHR2ZWMyIG5vaXNlID0gcmFuZDIodlV2KSAqIGRpdGhlclN0cmVuZ3RoICogYmx1cjtcXHJcXG5cXHJcXG5cXHRmbG9hdCBibHVyRmFjdG9yWCA9IHRleGVsU2l6ZS54ICogYmx1ciAqIG1heEJsdXIgKyBub2lzZS54O1xcclxcblxcdGZsb2F0IGJsdXJGYWN0b3JZID0gdGV4ZWxTaXplLnkgKiBibHVyICogbWF4Qmx1ciArIG5vaXNlLnk7XFxyXFxuXFxyXFxuXFx0Y29uc3QgaW50IE1BWF9SSU5HX1NBTVBMRVMgPSBSSU5HU19JTlQgKiBTQU1QTEVTX0lOVDtcXHJcXG5cXHJcXG5cXHQvLyBDYWxjdWxhdGlvbiBvZiBmaW5hbCBjb2xvci5cXHJcXG5cXHR2ZWM0IGNvbG9yO1xcclxcblxcclxcblxcdGlmKGJsdXIgPCAwLjA1KSB7XFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdik7XFxyXFxuXFxyXFxuXFx0fSBlbHNlIHtcXHJcXG5cXHJcXG5cXHRcXHRjb2xvciA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2KTtcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBzID0gMS4wO1xcclxcblxcdFxcdGludCByaW5nU2FtcGxlcztcXHJcXG5cXHJcXG5cXHRcXHRmb3IoaW50IGkgPSAxOyBpIDw9IFJJTkdTX0lOVDsgKytpKSB7XFxyXFxuXFxyXFxuXFx0XFx0XFx0cmluZ1NhbXBsZXMgPSBpICogU0FNUExFU19JTlQ7XFxyXFxuXFxyXFxuXFx0XFx0XFx0Ly8gQ29uc3RhbnQgbG9vcC5cXHJcXG5cXHRcXHRcXHRmb3IoaW50IGogPSAwOyBqIDwgTUFYX1JJTkdfU0FNUExFUzsgKytqKSB7XFxyXFxuXFxyXFxuXFx0XFx0XFx0XFx0Ly8gQnJlYWsgZWFybGllci5cXHJcXG5cXHRcXHRcXHRcXHRpZihqID49IHJpbmdTYW1wbGVzKSB7IGJyZWFrOyB9XFxyXFxuXFxyXFxuXFx0XFx0XFx0XFx0cyArPSBnYXRoZXIoZmxvYXQoaSksIGZsb2F0KGopLCBmbG9hdChyaW5nU2FtcGxlcyksIGNvbG9yLnJnYiwgYmx1ckZhY3RvclgsIGJsdXJGYWN0b3JZLCBibHVyKTtcXHJcXG5cXHJcXG5cXHRcXHRcXHR9XFxyXFxuXFxyXFxuXFx0XFx0fVxcclxcblxcclxcblxcdFxcdGNvbG9yLnJnYiAvPSBzOyAvLyBEaXZpZGUgYnkgc2FtcGxlIGNvdW50LlxcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG5cXHQjaWZkZWYgU0hPV19GT0NVU1xcclxcblxcclxcblxcdFxcdGNvbG9yLnJnYiA9IGRlYnVnRm9jdXMoY29sb3IucmdiLCBibHVyLCBkZXB0aCk7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0I2lmZGVmIFZJR05FVFRFXFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IucmdiICo9IHZpZ25ldHRlKCk7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0Z2xfRnJhZ0NvbG9yID0gY29sb3I7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5jb25zdCB2ZXJ0ZXggPSBcInZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5cclxuLyoqXHJcbiAqIERlcHRoIG9mIEZpZWxkIHNoYWRlciB2Mi40LlxyXG4gKlxyXG4gKiBPcmlnaW5hbCBzaGFkZXIgY29kZSBieSBNYXJ0aW5zIFVwaXRpczpcclxuICogIGh0dHA6Ly9ibGVuZGVyYXJ0aXN0cy5vcmcvZm9ydW0vc2hvd3RocmVhZC5waHA/MjM3NDg4LUdMU0wtZGVwdGgtb2YtZmllbGQtd2l0aC1ib2tlaC12Mi00LSh1cGRhdGUpXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIFJlYWxpc3RpY0Jva2VoTWF0ZXJpYWwgZXh0ZW5kcyBTaGFkZXJNYXRlcmlhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYm9rZWgyIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtQZXJzcGVjdGl2ZUNhbWVyYX0gW2NhbWVyYV0gLSBUaGUgbWFpbiBjYW1lcmEuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIEFkZGl0aW9uYWwgb3B0aW9ucy5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IFtvcHRpb25zLnRleGVsU2l6ZV0gLSBUaGUgYWJzb2x1dGUgc2NyZWVuIHRleGVsIHNpemUuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5yaW5ncz0zXSAtIFRoZSBudW1iZXIgb2YgYmx1cnJpbmcgaXRlcmF0aW9ucy5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNhbXBsZXM9Ml0gLSBUaGUgYW1vdW50IG9mIHNhbXBsZXMgdGFrZW4gcGVyIHJpbmcuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zaG93Rm9jdXM9ZmFsc2VdIC0gV2hldGhlciB0aGUgZm9jdXMgcG9pbnQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubWFudWFsRG9GPWZhbHNlXSAtIEVuYWJsZXMgbWFudWFsIGRlcHRoIG9mIGZpZWxkIGJsdXIuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy52aWduZXR0ZT1mYWxzZV0gLSBFbmFibGVzIGEgdmlnbmV0dGUgZWZmZWN0LlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucGVudGFnb249ZmFsc2VdIC0gRW5hYmxlIHRvIHVzZSBhIHBlbnRhZ29uYWwgc2hhcGUgdG8gc2NhbGUgZ2F0aGVyZWQgdGV4ZWxzLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc2hhZGVyRm9jdXM9dHJ1ZV0gLSBEaXNhYmxlIGlmIHlvdSBjb21wdXRlIHlvdXIgb3duIGZvY2FsRGVwdGggKGluIG1ldHJlcyEpLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubm9pc2U9dHJ1ZV0gLSBEaXNhYmxlIGlmIHlvdSBkb24ndCB3YW50IG5vaXNlIHBhdHRlcm5zIGZvciBkaXRoZXJpbmcuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLm1heEJsdXI9MS4wXSAtIFRoZSBtYXhpbXVtIGJsdXIgc3RyZW5ndGguXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmx1bWluYW5jZVRocmVzaG9sZD0wLjVdIC0gQSBsdW1pbmFuY2UgdGhyZXNob2xkLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5sdW1pbmFuY2VHYWluPTIuMF0gLSBBIGx1bWluYW5jZSBnYWluIGZhY3Rvci5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuYmlhcz0wLjVdIC0gQSBibHVyIGJpYXMuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmZyaW5nZT0wLjddIC0gQSBibHVyIG9mZnNldC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZGl0aGVyU3RyZW5ndGg9MC4wMDAxXSAtIFRoZSBkaXRoZXIgc3RyZW5ndGguXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKGNhbWVyYSA9IG51bGwsIG9wdGlvbnMgPSB7fSkge1xyXG5cclxuXHRcdGNvbnN0IHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7XHJcblx0XHRcdHRleGVsU2l6ZTogbnVsbCxcclxuXHRcdFx0cmluZ3M6IDMsXHJcblx0XHRcdHNhbXBsZXM6IDIsXHJcblx0XHRcdHNob3dGb2N1czogZmFsc2UsXHJcblx0XHRcdG1hbnVhbERvRjogZmFsc2UsXHJcblx0XHRcdHZpZ25ldHRlOiBmYWxzZSxcclxuXHRcdFx0cGVudGFnb246IGZhbHNlLFxyXG5cdFx0XHRzaGFkZXJGb2N1czogdHJ1ZSxcclxuXHRcdFx0bm9pc2U6IHRydWUsXHJcblx0XHRcdG1heEJsdXI6IDEuMCxcclxuXHRcdFx0bHVtaW5hbmNlVGhyZXNob2xkOiAwLjUsXHJcblx0XHRcdGx1bWluYW5jZUdhaW46IDIuMCxcclxuXHRcdFx0YmlhczogMC41LFxyXG5cdFx0XHRmcmluZ2U6IDAuNyxcclxuXHRcdFx0ZGl0aGVyU3RyZW5ndGg6IDAuMDAwMVxyXG5cdFx0fSwgb3B0aW9ucyk7XHJcblxyXG5cdFx0c3VwZXIoe1xyXG5cclxuXHRcdFx0dHlwZTogXCJSZWFsaXN0aWNCb2tlaE1hdGVyaWFsXCIsXHJcblxyXG5cdFx0XHRkZWZpbmVzOiB7XHJcblxyXG5cdFx0XHRcdFJJTkdTX0lOVDogc2V0dGluZ3MucmluZ3MudG9GaXhlZCgwKSxcclxuXHRcdFx0XHRSSU5HU19GTE9BVDogc2V0dGluZ3MucmluZ3MudG9GaXhlZCgxKSxcclxuXHRcdFx0XHRTQU1QTEVTX0lOVDogc2V0dGluZ3Muc2FtcGxlcy50b0ZpeGVkKDApLFxyXG5cdFx0XHRcdFNBTVBMRVNfRkxPQVQ6IHNldHRpbmdzLnNhbXBsZXMudG9GaXhlZCgxKVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdHVuaWZvcm1zOiB7XHJcblxyXG5cdFx0XHRcdHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHRcdFx0XHR0RGVwdGg6IG5ldyBVbmlmb3JtKG51bGwpLFxyXG5cclxuXHRcdFx0XHR0ZXhlbFNpemU6IG5ldyBVbmlmb3JtKG5ldyBWZWN0b3IyKCkpLFxyXG5cdFx0XHRcdGhhbGZUZXhlbFNpemU6IG5ldyBVbmlmb3JtKG5ldyBWZWN0b3IyKCkpLFxyXG5cclxuXHRcdFx0XHRjYW1lcmFOZWFyOiBuZXcgVW5pZm9ybSgwLjEpLFxyXG5cdFx0XHRcdGNhbWVyYUZhcjogbmV3IFVuaWZvcm0oMjAwMCksXHJcblxyXG5cdFx0XHRcdGZvY2FsTGVuZ3RoOiBuZXcgVW5pZm9ybSgyNC4wKSxcclxuXHRcdFx0XHRmb2NhbFN0b3A6IG5ldyBVbmlmb3JtKDAuOSksXHJcblxyXG5cdFx0XHRcdG1heEJsdXI6IG5ldyBVbmlmb3JtKHNldHRpbmdzLm1heEJsdXIpLFxyXG5cdFx0XHRcdGx1bWluYW5jZVRocmVzaG9sZDogbmV3IFVuaWZvcm0oc2V0dGluZ3MubHVtaW5hbmNlVGhyZXNob2xkKSxcclxuXHRcdFx0XHRsdW1pbmFuY2VHYWluOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5sdW1pbmFuY2VHYWluKSxcclxuXHRcdFx0XHRiaWFzOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5iaWFzKSxcclxuXHRcdFx0XHRmcmluZ2U6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmZyaW5nZSksXHJcblx0XHRcdFx0ZGl0aGVyU3RyZW5ndGg6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmRpdGhlclN0cmVuZ3RoKSxcclxuXHJcblx0XHRcdFx0Zm9jdXNDb29yZHM6IG5ldyBVbmlmb3JtKG5ldyBWZWN0b3IyKDAuNSwgMC41KSksXHJcblx0XHRcdFx0Zm9jYWxEZXB0aDogbmV3IFVuaWZvcm0oMS4wKVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCxcclxuXHRcdFx0dmVydGV4U2hhZGVyOiB2ZXJ0ZXgsXHJcblxyXG5cdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhUZXN0OiBmYWxzZVxyXG5cclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMuc2V0U2hvd0ZvY3VzRW5hYmxlZChzZXR0aW5ncy5zaG93Rm9jdXMpO1xyXG5cdFx0dGhpcy5zZXRNYW51YWxEZXB0aE9mRmllbGRFbmFibGVkKHNldHRpbmdzLm1hbnVhbERvRik7XHJcblx0XHR0aGlzLnNldFZpZ25ldHRlRW5hYmxlZChzZXR0aW5ncy52aWduZXR0ZSk7XHJcblx0XHR0aGlzLnNldFBlbnRhZ29uRW5hYmxlZChzZXR0aW5ncy5wZW50YWdvbik7XHJcblx0XHR0aGlzLnNldFNoYWRlckZvY3VzRW5hYmxlZChzZXR0aW5ncy5zaGFkZXJGb2N1cyk7XHJcblx0XHR0aGlzLnNldE5vaXNlRW5hYmxlZChzZXR0aW5ncy5ub2lzZSk7XHJcblxyXG5cdFx0aWYoc2V0dGluZ3MudGV4ZWxTaXplICE9PSBudWxsKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNldFRleGVsU2l6ZShzZXR0aW5ncy50ZXhlbFNpemUueCwgc2V0dGluZ3MudGV4ZWxTaXplLnkpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmFkb3B0Q2FtZXJhU2V0dGluZ3MoY2FtZXJhKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHdoZXRoZXIgdGhlIGZvY3VzIHNob3VsZCBiZSBzaG93bi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFRydWUgaWYgdGhlIGZvY3VzIHNob3VsZCBiZSBzaG93biwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTaG93Rm9jdXNFbmFibGVkKGVuYWJsZWQpIHtcclxuXHJcblx0XHRpZihlbmFibGVkKSB7XHJcblxyXG5cdFx0XHR0aGlzLmRlZmluZXMuU0hPV19GT0NVUyA9IFwiMVwiO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRkZWxldGUgdGhpcy5kZWZpbmVzLlNIT1dfRk9DVVM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgd2hldGhlciBtYW51YWwgRGVwdGggb2YgRmllbGQgc2hvdWxkIGJlIGVuYWJsZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIG1hbnVhbCBEb0Ygc2hvdWxkIGJlIGVuYWJsZWQuXHJcblx0ICovXHJcblxyXG5cdHNldE1hbnVhbERlcHRoT2ZGaWVsZEVuYWJsZWQoZW5hYmxlZCkge1xyXG5cclxuXHRcdGlmKGVuYWJsZWQpIHtcclxuXHJcblx0XHRcdHRoaXMuZGVmaW5lcy5NQU5VQUxfRE9GID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuTUFOVUFMX0RPRjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyB3aGV0aGVyIHRoZSBWaWduZXR0ZSBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBWaWduZXR0ZSBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQuXHJcblx0ICovXHJcblxyXG5cdHNldFZpZ25ldHRlRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLlZJR05FVFRFID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuVklHTkVUVEU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgd2hldGhlciB0aGUgcGVudGFnb25hbCBibHVyIGVmZmVjdCBzaG91bGQgYmUgZW5hYmxlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhlIHBlbnRhZ29uYWwgYmx1ciBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQuXHJcblx0ICovXHJcblxyXG5cdHNldFBlbnRhZ29uRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLlBFTlRBR09OID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuUEVOVEFHT047XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGF1dG9tYXRpYyBzaGFkZXIgZm9jdXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBzaGFkZXIgZm9jdXMgc2hvdWxkIGJlIGVuYWJsZWQuXHJcblx0ICovXHJcblxyXG5cdHNldFNoYWRlckZvY3VzRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLlNIQURFUl9GT0NVUyA9IFwiMVwiO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRkZWxldGUgdGhpcy5kZWZpbmVzLlNIQURFUl9GT0NVUztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyB3aGV0aGVyIHRoZSBkaXRoZXJpbmcgc2hvdWxkIGNvbXB1dGUgbm9pc2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIG5vaXNlLWJhc2VkIGRpdGhlcmluZyBzaG91bGQgYmUgZW5hYmxlZC5cclxuXHQgKi9cclxuXHJcblx0c2V0Tm9pc2VFbmFibGVkKGVuYWJsZWQpIHtcclxuXHJcblx0XHRpZihlbmFibGVkKSB7XHJcblxyXG5cdFx0XHR0aGlzLmRlZmluZXMuTk9JU0UgPSBcIjFcIjtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0ZGVsZXRlIHRoaXMuZGVmaW5lcy5OT0lTRTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdGV4ZWwgc2l6ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB4IC0gVGhlIHRleGVsIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB5IC0gVGhlIHRleGVsIGhlaWdodC5cclxuXHQgKi9cclxuXHJcblx0c2V0VGV4ZWxTaXplKHgsIHkpIHtcclxuXHJcblx0XHR0aGlzLnVuaWZvcm1zLnRleGVsU2l6ZS52YWx1ZS5zZXQoeCwgeSk7XHJcblx0XHR0aGlzLnVuaWZvcm1zLmhhbGZUZXhlbFNpemUudmFsdWUuc2V0KHgsIHkpLm11bHRpcGx5U2NhbGFyKDAuNSk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRvcHRzIHRoZSBuZWFyIGFuZCBmYXIgcGxhbmUgYW5kIHRoZSBmb2NhbCBsZW5ndGggb2YgdGhlIGdpdmVuIGNhbWVyYS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UGVyc3BlY3RpdmVDYW1lcmF9IGNhbWVyYSAtIFRoZSBtYWluIGNhbWVyYS5cclxuXHQgKi9cclxuXHJcblx0YWRvcHRDYW1lcmFTZXR0aW5ncyhjYW1lcmEpIHtcclxuXHJcblx0XHRpZihjYW1lcmEgIT09IG51bGwpIHtcclxuXHJcblx0XHRcdHRoaXMudW5pZm9ybXMuY2FtZXJhTmVhci52YWx1ZSA9IGNhbWVyYS5uZWFyO1xyXG5cdFx0XHR0aGlzLnVuaWZvcm1zLmNhbWVyYUZhci52YWx1ZSA9IGNhbWVyYS5mYXI7XHJcblx0XHRcdHRoaXMudW5pZm9ybXMuZm9jYWxMZW5ndGgudmFsdWUgPSBjYW1lcmEuZ2V0Rm9jYWxMZW5ndGgoKTsgLy8gdW5pdDogbW0uXHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFNoYWRlck1hdGVyaWFsLCBVbmlmb3JtLCBWZWN0b3IyIH0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5jb25zdCBmcmFnbWVudCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXHJcXG5cXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIHZlYzIgY2VudGVyO1xcclxcbnVuaWZvcm0gZmxvYXQgYXNwZWN0O1xcclxcbnVuaWZvcm0gZmxvYXQgd2F2ZVNpemU7XFxyXFxudW5pZm9ybSBmbG9hdCByYWRpdXM7XFxyXFxudW5pZm9ybSBmbG9hdCBtYXhSYWRpdXM7XFxyXFxudW5pZm9ybSBmbG9hdCBhbXBsaXR1ZGU7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG52YXJ5aW5nIGZsb2F0IHZTaXplO1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWMyIGFzcGVjdENvcnJlY3Rpb24gPSB2ZWMyKGFzcGVjdCwgMS4wKTtcXHJcXG5cXHJcXG5cXHR2ZWMyIGRpZmZlcmVuY2UgPSB2VXYgKiBhc3BlY3RDb3JyZWN0aW9uIC0gY2VudGVyICogYXNwZWN0Q29ycmVjdGlvbjtcXHJcXG5cXHRmbG9hdCBkaXN0YW5jZSA9IHNxcnQoZG90KGRpZmZlcmVuY2UsIGRpZmZlcmVuY2UpKSAqIHZTaXplO1xcclxcblxcclxcblxcdHZlYzIgZGlzcGxhY2VtZW50ID0gdmVjMigwLjApO1xcclxcblxcclxcblxcdGlmKGRpc3RhbmNlID4gcmFkaXVzKSB7XFxyXFxuXFxyXFxuXFx0XFx0aWYoZGlzdGFuY2UgPCByYWRpdXMgKyB3YXZlU2l6ZSkge1xcclxcblxcclxcblxcdFxcdFxcdGZsb2F0IGFuZ2xlID0gKGRpc3RhbmNlIC0gcmFkaXVzKSAqIFBJMiAvIHdhdmVTaXplO1xcclxcblxcdFxcdFxcdGZsb2F0IGNvc1NpbiA9ICgxLjAgLSBjb3MoYW5nbGUpKSAqIDAuNTtcXHJcXG5cXHJcXG5cXHRcXHRcXHRmbG9hdCBleHRlbnQgPSBtYXhSYWRpdXMgKyB3YXZlU2l6ZTtcXHJcXG5cXHRcXHRcXHRmbG9hdCBkZWNheSA9IG1heChleHRlbnQgLSBkaXN0YW5jZSAqIGRpc3RhbmNlLCAwLjApIC8gZXh0ZW50O1xcclxcblxcclxcblxcdFxcdFxcdGRpc3BsYWNlbWVudCA9ICgoY29zU2luICogYW1wbGl0dWRlICogZGlmZmVyZW5jZSkgLyBkaXN0YW5jZSkgKiBkZWNheTtcXHJcXG5cXHJcXG5cXHRcXHR9XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2IC0gZGlzcGxhY2VtZW50KTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcbmNvbnN0IHZlcnRleCA9IFwidW5pZm9ybSBmbG9hdCBzaXplO1xcclxcbnVuaWZvcm0gZmxvYXQgc2NhbGU7XFxyXFxudW5pZm9ybSBmbG9hdCBjYW1lcmFEaXN0YW5jZTtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcbnZhcnlpbmcgZmxvYXQgdlNpemU7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdHZTaXplID0gKDAuMSAqIGNhbWVyYURpc3RhbmNlKSAvIHNpemU7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcblxyXG4vKipcclxuICogQSBzaG9jayB3YXZlIHNoYWRlciBtYXRlcmlhbC5cclxuICpcclxuICogQmFzZWQgb24gYSBHaXN0IGJ5IEplYW4tUGhpbGlwcGUgU2FyZGE6XHJcbiAqICBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9qcHNhcmRhLzMzY2VhNjdhOWYyZWNiMGEwZWRhXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIFNob2NrV2F2ZU1hdGVyaWFsIGV4dGVuZHMgU2hhZGVyTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNob2NrIHdhdmUgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLndhdmVTaXplPTAuMl0gLSBUaGUgd2F2ZSBzaXplLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5hbXBsaXR1ZGU9MC4wNV0gLSBUaGUgZGlzdG9ydGlvbiBhbXBsaXR1ZGUuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xyXG5cclxuXHRcdGNvbnN0IHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7XHJcblx0XHRcdG1heFJhZGl1czogMS4wLFxyXG5cdFx0XHR3YXZlU2l6ZTogMC4yLFxyXG5cdFx0XHRhbXBsaXR1ZGU6IDAuMDVcclxuXHRcdH0sIG9wdGlvbnMpO1xyXG5cclxuXHRcdHN1cGVyKHtcclxuXHJcblx0XHRcdHR5cGU6IFwiU2hvY2tXYXZlTWF0ZXJpYWxcIixcclxuXHJcblx0XHRcdHVuaWZvcm1zOiB7XHJcblxyXG5cdFx0XHRcdHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHJcblx0XHRcdFx0Y2VudGVyOiBuZXcgVW5pZm9ybShuZXcgVmVjdG9yMigwLjUsIDAuNSkpLFxyXG5cdFx0XHRcdGFzcGVjdDogbmV3IFVuaWZvcm0oMS4wKSxcclxuXHRcdFx0XHRjYW1lcmFEaXN0YW5jZTogbmV3IFVuaWZvcm0oMS4wKSxcclxuXHJcblx0XHRcdFx0c2l6ZTogbmV3IFVuaWZvcm0oMS4wKSxcclxuXHRcdFx0XHRyYWRpdXM6IG5ldyBVbmlmb3JtKC1zZXR0aW5ncy53YXZlU2l6ZSksXHJcblx0XHRcdFx0bWF4UmFkaXVzOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5tYXhSYWRpdXMpLFxyXG5cdFx0XHRcdHdhdmVTaXplOiBuZXcgVW5pZm9ybShzZXR0aW5ncy53YXZlU2l6ZSksXHJcblx0XHRcdFx0YW1wbGl0dWRlOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5hbXBsaXR1ZGUpXHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50LFxyXG5cdFx0XHR2ZXJ0ZXhTaGFkZXI6IHZlcnRleCxcclxuXHJcblx0XHRcdGRlcHRoV3JpdGU6IGZhbHNlLFxyXG5cdFx0XHRkZXB0aFRlc3Q6IGZhbHNlXHJcblxyXG5cdFx0fSk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwsIFVuaWZvcm0sIFZlY3RvcjIgfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmNvbnN0IGZyYWdtZW50ID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0V2VpZ2h0cztcXHJcXG5cXHJcXG51bmlmb3JtIHZlYzIgdGV4ZWxTaXplO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxudmFyeWluZyB2ZWM0IHZPZmZzZXQ7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdC8vIEZldGNoIHRoZSBibGVuZGluZyB3ZWlnaHRzIGZvciBjdXJyZW50IHBpeGVsLlxcclxcblxcdHZlYzQgYTtcXHJcXG5cXHRhLnh6ID0gdGV4dHVyZTJEKHRXZWlnaHRzLCB2VXYpLnh6O1xcclxcblxcdGEueSA9IHRleHR1cmUyRCh0V2VpZ2h0cywgdk9mZnNldC56dykuZztcXHJcXG5cXHRhLncgPSB0ZXh0dXJlMkQodFdlaWdodHMsIHZPZmZzZXQueHkpLmE7XFxyXFxuXFxyXFxuXFx0dmVjNCBjb2xvcjtcXHJcXG5cXHJcXG5cXHQvLyBDaGVjayBpZiB0aGVyZSBpcyBhbnkgYmxlbmRpbmcgd2VpZ2h0IHdpdGggYSB2YWx1ZSBncmVhdGVyIHRoYW4gMC4wLlxcclxcblxcdGlmKGRvdChhLCB2ZWM0KDEuMCkpIDwgMWUtNSkge1xcclxcblxcclxcblxcdFxcdGNvbG9yID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYsIDAuMCk7XFxyXFxuXFxyXFxuXFx0fSBlbHNlIHtcXHJcXG5cXHJcXG5cXHRcXHQvKiBVcCB0byBmb3VyIGxpbmVzIGNhbiBiZSBjcm9zc2luZyBhIHBpeGVsIChvbmUgdGhyb3VnaCBlYWNoIGVkZ2UpLlxcclxcblxcdFxcdCAqIFRoZSBsaW5lIHdpdGggdGhlIG1heGltdW0gd2VpZ2h0IGZvciBlYWNoIGRpcmVjdGlvbiBpcyBmYXZvdXJlZC5cXHJcXG5cXHRcXHQgKi9cXHJcXG5cXHJcXG5cXHRcXHR2ZWMyIG9mZnNldDtcXHJcXG5cXHRcXHRvZmZzZXQueCA9IGEuYSA+IGEuYiA/IGEuYSA6IC1hLmI7IC8vIExlZnQgdnMuIHJpZ2h0LlxcclxcblxcdFxcdG9mZnNldC55ID0gYS5nID4gYS5yID8gLWEuZyA6IGEucjsgLy8gVG9wIHZzLiBib3R0b20gKGNoYW5nZWQgc2lnbnMpLlxcclxcblxcclxcblxcdFxcdC8vIEdvIGluIHRoZSBkaXJlY3Rpb24gd2l0aCB0aGUgbWF4aW11bSB3ZWlnaHQgKGhvcml6b250YWwgdnMuIHZlcnRpY2FsKS5cXHJcXG5cXHRcXHRpZihhYnMob2Zmc2V0LngpID4gYWJzKG9mZnNldC55KSkge1xcclxcblxcclxcblxcdFxcdFxcdG9mZnNldC55ID0gMC4wO1xcclxcblxcclxcblxcdFxcdH0gZWxzZSB7XFxyXFxuXFxyXFxuXFx0XFx0XFx0b2Zmc2V0LnggPSAwLjA7XFxyXFxuXFxyXFxuXFx0XFx0fVxcclxcblxcclxcblxcdFxcdC8vIEZldGNoIHRoZSBvcHBvc2l0ZSBjb2xvciBhbmQgbGVycCBieSBoYW5kLlxcclxcblxcdFxcdGNvbG9yID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYsIDAuMCk7XFxyXFxuXFx0XFx0dmVjMiBjb29yZCA9IHZVdiArIHNpZ24ob2Zmc2V0KSAqIHRleGVsU2l6ZTtcXHJcXG5cXHRcXHR2ZWM0IG9wcG9zaXRlQ29sb3IgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIGNvb3JkLCAwLjApO1xcclxcblxcdFxcdGZsb2F0IHMgPSBhYnMob2Zmc2V0LngpID4gYWJzKG9mZnNldC55KSA/IGFicyhvZmZzZXQueCkgOiBhYnMob2Zmc2V0LnkpO1xcclxcblxcclxcblxcdFxcdC8vIEdhbW1hIGNvcnJlY3Rpb24uXFxyXFxuXFx0XFx0Y29sb3IucmdiID0gcG93KGFicyhjb2xvci5yZ2IpLCB2ZWMzKDIuMikpO1xcclxcblxcdFxcdG9wcG9zaXRlQ29sb3IucmdiID0gcG93KGFicyhvcHBvc2l0ZUNvbG9yLnJnYiksIHZlYzMoMi4yKSk7XFxyXFxuXFx0XFx0Y29sb3IgPSBtaXgoY29sb3IsIG9wcG9zaXRlQ29sb3IsIHMpO1xcclxcblxcdFxcdGNvbG9yLnJnYiA9IHBvdyhhYnMoY29sb3IucmdiKSwgdmVjMygxLjAgLyAyLjIpKTtcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0Z2xfRnJhZ0NvbG9yID0gY29sb3I7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5jb25zdCB2ZXJ0ZXggPSBcInVuaWZvcm0gdmVjMiB0ZXhlbFNpemU7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG52YXJ5aW5nIHZlYzQgdk9mZnNldDtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFxyXFxuXFx0dk9mZnNldCA9IHV2Lnh5eHkgKyB0ZXhlbFNpemUueHl4eSAqIHZlYzQoMS4wLCAwLjAsIDAuMCwgLTEuMCk7IC8vIENoYW5nZWQgc2lnbiBpbiBXIGNvbXBvbmVudC5cXHJcXG5cXHJcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcclxuXHJcbi8qKlxyXG4gKiBTdWJwaXhlbCBNb3JwaG9sb2dpY2FsIEFudGlhbGlhc2luZy5cclxuICpcclxuICogVGhpcyBtYXRlcmlhbCBpcyB1c2VkIHRvIHJlbmRlciB0aGUgZmluYWwgYW50aWFsaWFzaW5nLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBTTUFBQmxlbmRNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBTTUFBIGJsZW5kIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBbdGV4ZWxTaXplXSAtIFRoZSBhYnNvbHV0ZSBzY3JlZW4gdGV4ZWwgc2l6ZS5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3IodGV4ZWxTaXplID0gbmV3IFZlY3RvcjIoKSkge1xyXG5cclxuXHRcdHN1cGVyKHtcclxuXHJcblx0XHRcdHR5cGU6IFwiU01BQUJsZW5kTWF0ZXJpYWxcIixcclxuXHJcblx0XHRcdHVuaWZvcm1zOiB7XHJcblxyXG5cdFx0XHRcdHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHRcdFx0XHR0V2VpZ2h0czogbmV3IFVuaWZvcm0obnVsbCksXHJcblx0XHRcdFx0dGV4ZWxTaXplOiBuZXcgVW5pZm9ybSh0ZXhlbFNpemUpXHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50LFxyXG5cdFx0XHR2ZXJ0ZXhTaGFkZXI6IHZlcnRleCxcclxuXHJcblx0XHRcdGRlcHRoV3JpdGU6IGZhbHNlLFxyXG5cdFx0XHRkZXB0aFRlc3Q6IGZhbHNlXHJcblxyXG5cdFx0fSk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwsIFVuaWZvcm0sIFZlY3RvcjIgfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmNvbnN0IGZyYWdtZW50ID0gXCIjZGVmaW5lIHNhbXBsZUxldmVsWmVyb09mZnNldCh0LCBjb29yZCwgb2Zmc2V0KSB0ZXh0dXJlMkQodCwgY29vcmQgKyBmbG9hdChvZmZzZXQpICogdGV4ZWxTaXplLCAwLjApXFxyXFxuXFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdEFyZWE7XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdFNlYXJjaDtcXHJcXG5cXHJcXG51bmlmb3JtIHZlYzIgdGV4ZWxTaXplO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxudmFyeWluZyB2ZWM0IHZPZmZzZXRbM107XFxyXFxudmFyeWluZyB2ZWMyIHZQaXhDb29yZDtcXHJcXG5cXHJcXG52ZWMyIHJvdW5kKHZlYzIgeCkge1xcclxcblxcclxcblxcdHJldHVybiBzaWduKHgpICogZmxvb3IoYWJzKHgpICsgMC41KTtcXHJcXG5cXHJcXG59XFxyXFxuXFxyXFxuZmxvYXQgc2VhcmNoTGVuZ3RoKHZlYzIgZSwgZmxvYXQgYmlhcywgZmxvYXQgc2NhbGUpIHtcXHJcXG5cXHJcXG5cXHQvLyBOb3QgcmVxdWlyZWQgaWYgdFNlYXJjaCBhY2Nlc3NlcyBhcmUgc2V0IHRvIHBvaW50LlxcclxcblxcdC8vIGNvbnN0IHZlYzIgU0VBUkNIX1RFWF9QSVhFTF9TSVpFID0gMS4wIC8gdmVjMig2Ni4wLCAzMy4wKTtcXHJcXG5cXHQvLyBlID0gdmVjMihiaWFzLCAwLjApICsgMC41ICogU0VBUkNIX1RFWF9QSVhFTF9TSVpFICsgZSAqIHZlYzIoc2NhbGUsIDEuMCkgKiB2ZWMyKDY0LjAsIDMyLjApICogU0VBUkNIX1RFWF9QSVhFTF9TSVpFO1xcclxcblxcclxcblxcdGUuciA9IGJpYXMgKyBlLnIgKiBzY2FsZTtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gMjU1LjAgKiB0ZXh0dXJlMkQodFNlYXJjaCwgZSwgMC4wKS5yO1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG5mbG9hdCBzZWFyY2hYTGVmdCh2ZWMyIHRleENvb3JkLCBmbG9hdCBlbmQpIHtcXHJcXG5cXHJcXG5cXHQvKiBAUFNFVURPX0dBVEhFUjRcXHJcXG5cXHQgKiBUaGlzIHRleENvb3JkIGhhcyBiZWVuIG9mZnNldCBieSAoLTAuMjUsIC0wLjEyNSkgaW4gdGhlIHZlcnRleCBzaGFkZXIgdG9cXHJcXG5cXHQgKiBzYW1wbGUgYmV0d2VlbiBlZGdlLCB0aHVzIGZldGNoaW5nIGZvdXIgZWRnZXMgaW4gYSByb3cuXFxyXFxuXFx0ICogU2FtcGxpbmcgd2l0aCBkaWZmZXJlbnQgb2Zmc2V0cyBpbiBlYWNoIGRpcmVjdGlvbiBhbGxvd3MgdG8gZGlzYW1iaWd1YXRlXFxyXFxuXFx0ICogd2hpY2ggZWRnZXMgYXJlIGFjdGl2ZSBmcm9tIHRoZSBmb3VyIGZldGNoZWQgb25lcy5cXHJcXG5cXHQgKi9cXHJcXG5cXHJcXG5cXHR2ZWMyIGUgPSB2ZWMyKDAuMCwgMS4wKTtcXHJcXG5cXHJcXG5cXHRmb3IoaW50IGkgPSAwOyBpIDwgTUFYX1NFQVJDSF9TVEVQU19JTlQ7ICsraSkge1xcclxcblxcclxcblxcdFxcdGUgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHRleENvb3JkLCAwLjApLnJnO1xcclxcblxcdFxcdHRleENvb3JkIC09IHZlYzIoMi4wLCAwLjApICogdGV4ZWxTaXplO1xcclxcblxcclxcblxcdFxcdGlmKCEodGV4Q29vcmQueCA+IGVuZCAmJiBlLmcgPiAwLjgyODEgJiYgZS5yID09IDAuMCkpIHsgYnJlYWs7IH1cXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0Ly8gQ29ycmVjdCB0aGUgcHJldmlvdXNseSBhcHBsaWVkIG9mZnNldCAoLTAuMjUsIC0wLjEyNSkuXFxyXFxuXFx0dGV4Q29vcmQueCArPSAwLjI1ICogdGV4ZWxTaXplLng7XFxyXFxuXFxyXFxuXFx0Ly8gVGhlIHNlYXJjaGVzIGFyZSBiaWFzZWQgYnkgMSwgc28gYWRqdXN0IHRoZSBjb29yZHMgYWNjb3JkaW5nbHkuXFxyXFxuXFx0dGV4Q29vcmQueCArPSB0ZXhlbFNpemUueDtcXHJcXG5cXHJcXG5cXHQvLyBEaXNhbWJpZ3VhdGUgdGhlIGxlbmd0aCBhZGRlZCBieSB0aGUgbGFzdCBzdGVwLlxcclxcblxcdHRleENvb3JkLnggKz0gMi4wICogdGV4ZWxTaXplLng7IC8vIFVuZG8gbGFzdCBzdGVwLlxcclxcblxcdHRleENvb3JkLnggLT0gdGV4ZWxTaXplLnggKiBzZWFyY2hMZW5ndGgoZSwgMC4wLCAwLjUpO1xcclxcblxcclxcblxcdHJldHVybiB0ZXhDb29yZC54O1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG5mbG9hdCBzZWFyY2hYUmlnaHQodmVjMiB0ZXhDb29yZCwgZmxvYXQgZW5kKSB7XFxyXFxuXFxyXFxuXFx0dmVjMiBlID0gdmVjMigwLjAsIDEuMCk7XFxyXFxuXFxyXFxuXFx0Zm9yKGludCBpID0gMDsgaSA8IE1BWF9TRUFSQ0hfU1RFUFNfSU5UOyArK2kpIHtcXHJcXG5cXHJcXG5cXHRcXHRlID0gdGV4dHVyZTJEKHREaWZmdXNlLCB0ZXhDb29yZCwgMC4wKS5yZztcXHJcXG5cXHRcXHR0ZXhDb29yZCArPSB2ZWMyKDIuMCwgMC4wKSAqIHRleGVsU2l6ZTtcXHJcXG5cXHJcXG5cXHRcXHRpZighKHRleENvb3JkLnggPCBlbmQgJiYgZS5nID4gMC44MjgxICYmIGUuciA9PSAwLjApKSB7IGJyZWFrOyB9XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcblxcdHRleENvb3JkLnggLT0gMC4yNSAqIHRleGVsU2l6ZS54O1xcclxcblxcdHRleENvb3JkLnggLT0gdGV4ZWxTaXplLng7XFxyXFxuXFx0dGV4Q29vcmQueCAtPSAyLjAgKiB0ZXhlbFNpemUueDtcXHJcXG5cXHR0ZXhDb29yZC54ICs9IHRleGVsU2l6ZS54ICogc2VhcmNoTGVuZ3RoKGUsIDAuNSwgMC41KTtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gdGV4Q29vcmQueDtcXHJcXG5cXHJcXG59XFxyXFxuXFxyXFxuZmxvYXQgc2VhcmNoWVVwKHZlYzIgdGV4Q29vcmQsIGZsb2F0IGVuZCkge1xcclxcblxcclxcblxcdHZlYzIgZSA9IHZlYzIoMS4wLCAwLjApO1xcclxcblxcclxcblxcdGZvcihpbnQgaSA9IDA7IGkgPCBNQVhfU0VBUkNIX1NURVBTX0lOVDsgKytpKSB7XFxyXFxuXFxyXFxuXFx0XFx0ZSA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdGV4Q29vcmQsIDAuMCkucmc7XFxyXFxuXFx0XFx0dGV4Q29vcmQgKz0gdmVjMigwLjAsIDIuMCkgKiB0ZXhlbFNpemU7IC8vIENoYW5nZWQgc2lnbi5cXHJcXG5cXHJcXG5cXHRcXHRpZighKHRleENvb3JkLnkgPiBlbmQgJiYgZS5yID4gMC44MjgxICYmIGUuZyA9PSAwLjApKSB7IGJyZWFrOyB9XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcblxcdHRleENvb3JkLnkgLT0gMC4yNSAqIHRleGVsU2l6ZS55OyAvLyBDaGFuZ2VkIHNpZ24uXFxyXFxuXFx0dGV4Q29vcmQueSAtPSB0ZXhlbFNpemUueTsgLy8gQ2hhbmdlZCBzaWduLlxcclxcblxcdHRleENvb3JkLnkgLT0gMi4wICogdGV4ZWxTaXplLnk7IC8vIENoYW5nZWQgc2lnbi5cXHJcXG5cXHR0ZXhDb29yZC55ICs9IHRleGVsU2l6ZS55ICogc2VhcmNoTGVuZ3RoKGUuZ3IsIDAuMCwgMC41KTsgLy8gQ2hhbmdlZCBzaWduLlxcclxcblxcclxcblxcdHJldHVybiB0ZXhDb29yZC55O1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG5mbG9hdCBzZWFyY2hZRG93bih2ZWMyIHRleENvb3JkLCBmbG9hdCBlbmQpIHtcXHJcXG5cXHJcXG5cXHR2ZWMyIGUgPSB2ZWMyKDEuMCwgMC4wKTtcXHJcXG5cXHJcXG5cXHRmb3IoaW50IGkgPSAwOyBpIDwgTUFYX1NFQVJDSF9TVEVQU19JTlQ7ICsraSApIHtcXHJcXG5cXHJcXG5cXHRcXHRlID0gdGV4dHVyZTJEKHREaWZmdXNlLCB0ZXhDb29yZCwgMC4wKS5yZztcXHJcXG5cXHRcXHR0ZXhDb29yZCAtPSB2ZWMyKDAuMCwgMi4wKSAqIHRleGVsU2l6ZTsgLy8gQ2hhbmdlZCBzaWduLlxcclxcblxcclxcblxcdFxcdGlmKCEodGV4Q29vcmQueSA8IGVuZCAmJiBlLnIgPiAwLjgyODEgJiYgZS5nID09IDAuMCkpIHsgYnJlYWs7IH1cXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0dGV4Q29vcmQueSArPSAwLjI1ICogdGV4ZWxTaXplLnk7IC8vIENoYW5nZWQgc2lnbi5cXHJcXG5cXHR0ZXhDb29yZC55ICs9IHRleGVsU2l6ZS55OyAvLyBDaGFuZ2VkIHNpZ24uXFxyXFxuXFx0dGV4Q29vcmQueSArPSAyLjAgKiB0ZXhlbFNpemUueTsgLy8gQ2hhbmdlZCBzaWduLlxcclxcblxcdHRleENvb3JkLnkgLT0gdGV4ZWxTaXplLnkgKiBzZWFyY2hMZW5ndGgoZS5nciwgMC41LCAwLjUpOyAvLyBDaGFuZ2VkIHNpZ24uXFxyXFxuXFxyXFxuXFx0cmV0dXJuIHRleENvb3JkLnk7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbnZlYzIgYXJlYSh2ZWMyIGRpc3QsIGZsb2F0IGUxLCBmbG9hdCBlMiwgZmxvYXQgb2Zmc2V0KSB7XFxyXFxuXFxyXFxuXFx0Ly8gUm91bmRpbmcgcHJldmVudHMgcHJlY2lzaW9uIGVycm9ycyBvZiBiaWxpbmVhciBmaWx0ZXJpbmcuXFxyXFxuXFx0dmVjMiB0ZXhDb29yZCA9IEFSRUFURVhfTUFYX0RJU1RBTkNFICogcm91bmQoNC4wICogdmVjMihlMSwgZTIpKSArIGRpc3Q7XFxyXFxuXFxyXFxuXFx0Ly8gU2NhbGUgYW5kIGJpYXMgZm9yIHRleGVsIHNwYWNlIHRyYW5zbGF0aW9uLlxcclxcblxcdHRleENvb3JkID0gQVJFQVRFWF9QSVhFTF9TSVpFICogdGV4Q29vcmQgKyAoMC41ICogQVJFQVRFWF9QSVhFTF9TSVpFKTtcXHJcXG5cXHJcXG5cXHQvLyBNb3ZlIHRvIHByb3BlciBwbGFjZSwgYWNjb3JkaW5nIHRvIHRoZSBzdWJwaXhlbCBvZmZzZXQuXFxyXFxuXFx0dGV4Q29vcmQueSArPSBBUkVBVEVYX1NVQlRFWF9TSVpFICogb2Zmc2V0O1xcclxcblxcclxcblxcdHJldHVybiB0ZXh0dXJlMkQodEFyZWEsIHRleENvb3JkLCAwLjApLnJnO1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjNCB3ZWlnaHRzID0gdmVjNCgwLjApO1xcclxcblxcdHZlYzQgc3Vic2FtcGxlSW5kaWNlcyA9IHZlYzQoMC4wKTtcXHJcXG5cXHR2ZWMyIGUgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdikucmc7XFxyXFxuXFxyXFxuXFx0aWYoZS5nID4gMC4wKSB7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gRWRnZSBhdCBub3J0aC5cXHJcXG5cXHRcXHR2ZWMyIGQ7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gRmluZCB0aGUgZGlzdGFuY2UgdG8gdGhlIGxlZnQuXFxyXFxuXFx0XFx0dmVjMiBjb29yZHM7XFxyXFxuXFx0XFx0Y29vcmRzLnggPSBzZWFyY2hYTGVmdCh2T2Zmc2V0WzBdLnh5LCB2T2Zmc2V0WzJdLngpO1xcclxcblxcdFxcdGNvb3Jkcy55ID0gdk9mZnNldFsxXS55OyAvLyB2T2Zmc2V0WzFdLnkgPSB2VXYueSAtIDAuMjUgKiB0ZXhlbFNpemUueSAoQENST1NTSU5HX09GRlNFVClcXHJcXG5cXHRcXHRkLnggPSBjb29yZHMueDtcXHJcXG5cXHJcXG5cXHRcXHQvKiBOb3cgZmV0Y2ggdGhlIGxlZnQgY3Jvc3NpbmcgZWRnZXMsIHR3byBhdCBhIHRpbWUgdXNpbmcgYmlsaW5lYXJcXHJcXG5cXHRcXHRmaWx0ZXJpbmcuIFNhbXBsaW5nIGF0IC0wLjI1IChzZWUgQENST1NTSU5HX09GRlNFVCkgZW5hYmxlcyB0byBkaXNjZXJuIHdoYXRcXHJcXG5cXHRcXHR2YWx1ZSBlYWNoIGVkZ2UgaGFzLiAqL1xcclxcblxcdFxcdGZsb2F0IGUxID0gdGV4dHVyZTJEKHREaWZmdXNlLCBjb29yZHMsIDAuMCkucjtcXHJcXG5cXHJcXG5cXHRcXHQvLyBGaW5kIHRoZSBkaXN0YW5jZSB0byB0aGUgcmlnaHQuXFxyXFxuXFx0XFx0Y29vcmRzLnggPSBzZWFyY2hYUmlnaHQodk9mZnNldFswXS56dywgdk9mZnNldFsyXS55KTtcXHJcXG5cXHRcXHRkLnkgPSBjb29yZHMueDtcXHJcXG5cXHJcXG5cXHRcXHQvKiBUcmFuc2xhdGUgZGlzdGFuY2VzIHRvIHBpeGVsIHVuaXRzIGZvciBiZXR0ZXIgaW50ZXJsZWF2ZSBhcml0aG1ldGljIGFuZFxcclxcblxcdFxcdG1lbW9yeSBhY2Nlc3Nlcy4gKi9cXHJcXG5cXHRcXHRkID0gZCAvIHRleGVsU2l6ZS54IC0gdlBpeENvb3JkLng7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gVGhlIGFyZWEgdGV4dHVyZSBpcyBjb21wcmVzc2VkIHF1YWRyYXRpY2FsbHkuXFxyXFxuXFx0XFx0dmVjMiBzcXJ0RCA9IHNxcnQoYWJzKGQpKTtcXHJcXG5cXHJcXG5cXHRcXHQvLyBGZXRjaCB0aGUgcmlnaHQgY3Jvc3NpbmcgZWRnZXMuXFxyXFxuXFx0XFx0Y29vcmRzLnkgLT0gdGV4ZWxTaXplLnk7IC8vIFdlYkdMIHBvcnQgbm90ZTogQWRkZWQuXFxyXFxuXFx0XFx0ZmxvYXQgZTIgPSBzYW1wbGVMZXZlbFplcm9PZmZzZXQodERpZmZ1c2UsIGNvb3JkcywgaXZlYzIoMSwgMCkpLnI7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gUGF0dGVybiByZWNvZ25pc2VkLCBub3cgZ2V0IHRoZSBhY3R1YWwgYXJlYS5cXHJcXG5cXHRcXHR3ZWlnaHRzLnJnID0gYXJlYShzcXJ0RCwgZTEsIGUyLCBzdWJzYW1wbGVJbmRpY2VzLnkpO1xcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG5cXHRpZihlLnIgPiAwLjApIHtcXHJcXG5cXHJcXG5cXHRcXHQvLyBFZGdlIGF0IHdlc3QuXFxyXFxuXFx0XFx0dmVjMiBkO1xcclxcblxcclxcblxcdFxcdC8vIEZpbmQgdGhlIGRpc3RhbmNlIHRvIHRoZSB0b3AuXFxyXFxuXFx0XFx0dmVjMiBjb29yZHM7XFxyXFxuXFx0XFx0Y29vcmRzLnkgPSBzZWFyY2hZVXAodk9mZnNldFsxXS54eSwgdk9mZnNldFsyXS56KTtcXHJcXG5cXHRcXHRjb29yZHMueCA9IHZPZmZzZXRbMF0ueDsgLy8gdk9mZnNldFsxXS54ID0gdlV2LnggLSAwLjI1ICogdGV4ZWxTaXplLng7XFxyXFxuXFx0XFx0ZC54ID0gY29vcmRzLnk7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gRmV0Y2ggdGhlIHRvcCBjcm9zc2luZyBlZGdlcy5cXHJcXG5cXHRcXHRmbG9hdCBlMSA9IHRleHR1cmUyRCh0RGlmZnVzZSwgY29vcmRzLCAwLjApLmc7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gRmluZCB0aGUgZGlzdGFuY2UgdG8gdGhlIGJvdHRvbS5cXHJcXG5cXHRcXHRjb29yZHMueSA9IHNlYXJjaFlEb3duKHZPZmZzZXRbMV0uencsIHZPZmZzZXRbMl0udyk7XFxyXFxuXFx0XFx0ZC55ID0gY29vcmRzLnk7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gRGlzdGFuY2VzIGluIHBpeGVsIHVuaXRzLlxcclxcblxcdFxcdGQgPSBkIC8gdGV4ZWxTaXplLnkgLSB2UGl4Q29vcmQueTtcXHJcXG5cXHJcXG5cXHRcXHQvLyBUaGUgYXJlYSB0ZXh0dXJlIGlzIGNvbXByZXNzZWQgcXVhZHJhdGljYWxseS5cXHJcXG5cXHRcXHR2ZWMyIHNxcnREID0gc3FydChhYnMoZCkpO1xcclxcblxcclxcblxcdFxcdC8vIEZldGNoIHRoZSBib3R0b20gY3Jvc3NpbmcgZWRnZXMuXFxyXFxuXFx0XFx0Y29vcmRzLnkgLT0gdGV4ZWxTaXplLnk7IC8vIFdlYkdMIHBvcnQgbm90ZTogQWRkZWQuXFxyXFxuXFx0XFx0ZmxvYXQgZTIgPSBzYW1wbGVMZXZlbFplcm9PZmZzZXQodERpZmZ1c2UsIGNvb3JkcywgaXZlYzIoMCwgMSkpLmc7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gR2V0IHRoZSBhcmVhIGZvciB0aGlzIGRpcmVjdGlvbi5cXHJcXG5cXHRcXHR3ZWlnaHRzLmJhID0gYXJlYShzcXJ0RCwgZTEsIGUyLCBzdWJzYW1wbGVJbmRpY2VzLngpO1xcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSB3ZWlnaHRzO1xcclxcblxcclxcbn1cXHJcXG5cIjtcclxuY29uc3QgdmVydGV4ID0gXCJ1bmlmb3JtIHZlYzIgdGV4ZWxTaXplO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxudmFyeWluZyB2ZWM0IHZPZmZzZXRbM107XFxyXFxudmFyeWluZyB2ZWMyIHZQaXhDb29yZDtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFxyXFxuXFx0dlBpeENvb3JkID0gdXYgLyB0ZXhlbFNpemU7XFxyXFxuXFxyXFxuXFx0Ly8gT2Zmc2V0cyBmb3IgdGhlIHNlYXJjaGVzIChzZWUgQFBTRVVET19HQVRIRVI0KS5cXHJcXG5cXHR2T2Zmc2V0WzBdID0gdXYueHl4eSArIHRleGVsU2l6ZS54eXh5ICogdmVjNCgtMC4yNSwgMC4xMjUsIDEuMjUsIDAuMTI1KTsgLy8gQ2hhbmdlZCBzaWduIGluIFkgYW5kIFcgY29tcG9uZW50cy5cXHJcXG5cXHR2T2Zmc2V0WzFdID0gdXYueHl4eSArIHRleGVsU2l6ZS54eXh5ICogdmVjNCgtMC4xMjUsIDAuMjUsIC0wLjEyNSwgLTEuMjUpOyAvL0NoYW5nZWQgc2lnbiBpbiBZIGFuZCBXIGNvbXBvbmVudHMuXFxyXFxuXFxyXFxuXFx0Ly8gVGhpcyBpbmRpY2F0ZXMgdGhlIGVuZHMgb2YgdGhlIGxvb3BzLlxcclxcblxcdHZPZmZzZXRbMl0gPSB2ZWM0KHZPZmZzZXRbMF0ueHosIHZPZmZzZXRbMV0ueXcpICsgdmVjNCgtMi4wLCAyLjAsIC0yLjAsIDIuMCkgKiB0ZXhlbFNpemUueHh5eSAqIE1BWF9TRUFSQ0hfU1RFUFNfRkxPQVQ7XFxyXFxuXFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcblxyXG4vKipcclxuICogU3VicGl4ZWwgTW9ycGhvbG9naWNhbCBBbnRpYWxpYXNpbmcuXHJcbiAqXHJcbiAqIFRoaXMgbWF0ZXJpYWwgY29tcHV0ZXMgd2VpZ2h0cyBmb3IgZGV0ZWN0ZWQgZWRnZXMuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIFNNQUFXZWlnaHRzTWF0ZXJpYWwgZXh0ZW5kcyBTaGFkZXJNYXRlcmlhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgU01BQSB3ZWlnaHRzIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBbdGV4ZWxTaXplXSAtIFRoZSBhYnNvbHV0ZSBzY3JlZW4gdGV4ZWwgc2l6ZS5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3IodGV4ZWxTaXplID0gbmV3IFZlY3RvcjIoKSkge1xyXG5cclxuXHRcdHN1cGVyKHtcclxuXHJcblx0XHRcdHR5cGU6IFwiU01BQVdlaWdodHNNYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0ZGVmaW5lczoge1xyXG5cclxuXHRcdFx0XHQvLyBDb25maWd1cmFibGUgc2V0dGluZ3M6XHJcblx0XHRcdFx0TUFYX1NFQVJDSF9TVEVQU19JTlQ6IFwiOFwiLFxyXG5cdFx0XHRcdE1BWF9TRUFSQ0hfU1RFUFNfRkxPQVQ6IFwiOC4wXCIsXHJcblxyXG5cdFx0XHRcdC8vIE5vbi1jb25maWd1cmFibGUgc2V0dGluZ3M6XHJcblx0XHRcdFx0QVJFQVRFWF9NQVhfRElTVEFOQ0U6IFwiMTYuMFwiLFxyXG5cdFx0XHRcdEFSRUFURVhfUElYRUxfU0laRTogXCIoMS4wIC8gdmVjMigxNjAuMCwgNTYwLjApKVwiLFxyXG5cdFx0XHRcdEFSRUFURVhfU1VCVEVYX1NJWkU6IFwiKDEuMCAvIDcuMClcIixcclxuXHRcdFx0XHRTRUFSQ0hURVhfU0laRTogXCJ2ZWMyKDY2LjAsIDMzLjApXCIsXHJcblx0XHRcdFx0U0VBUkNIVEVYX1BBQ0tFRF9TSVpFOiBcInZlYzIoNjQuMCwgMTYuMClcIlxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdHVuaWZvcm1zOiB7XHJcblxyXG5cdFx0XHRcdHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHRcdFx0XHR0QXJlYTogbmV3IFVuaWZvcm0obnVsbCksXHJcblx0XHRcdFx0dFNlYXJjaDogbmV3IFVuaWZvcm0obnVsbCksXHJcblx0XHRcdFx0dGV4ZWxTaXplOiBuZXcgVW5pZm9ybSh0ZXhlbFNpemUpXHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50LFxyXG5cdFx0XHR2ZXJ0ZXhTaGFkZXI6IHZlcnRleCxcclxuXHJcblx0XHRcdGRlcHRoV3JpdGU6IGZhbHNlLFxyXG5cdFx0XHRkZXB0aFRlc3Q6IGZhbHNlXHJcblxyXG5cdFx0fSk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgbWF4aW11bSBhbW91bnQgb2Ygc3RlcHMgcGVyZm9ybWVkIGluIHRoZSBob3Jpem9udGFsL3ZlcnRpY2FsXHJcblx0ICogcGF0dGVybiBzZWFyY2hlcywgYXQgZWFjaCBzaWRlIG9mIHRoZSBwaXhlbC5cclxuXHQgKlxyXG5cdCAqIEluIG51bWJlciBvZiBwaXhlbHMsIGl0J3MgYWN0dWFsbHkgdGhlIGRvdWJsZS4gU28gdGhlIG1heGltdW0gbGluZSBsZW5ndGhcclxuXHQgKiBwZXJmZWN0bHkgaGFuZGxlZCBieSwgZm9yIGV4YW1wbGUgMTYsIGlzIDY0IChwZXJmZWN0bHkgbWVhbnMgdGhhdCBsb25nZXJcclxuXHQgKiBsaW5lcyB3b24ndCBsb29rIGFzIGdvb2QsIGJ1dCBhcmUgc3RpbGwgYW50aWFsaWFzZWQpLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHN0ZXBzIC0gVGhlIHNlYXJjaCBzdGVwcy4gUmFuZ2U6IFswLCAxMTJdLlxyXG5cdCAqL1xyXG5cclxuXHRzZXRPcnRob2dvbmFsU2VhcmNoU3RlcHMoc3RlcHMpIHtcclxuXHJcblx0XHR0aGlzLmRlZmluZXMuTUFYX1NFQVJDSF9TVEVQU19JTlQgPSBzdGVwcy50b0ZpeGVkKFwiMFwiKTtcclxuXHRcdHRoaXMuZGVmaW5lcy5NQVhfU0VBUkNIX1NURVBTX0ZMT0FUID0gc3RlcHMudG9GaXhlZChcIjFcIik7XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwsIFVuaWZvcm0gfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmNvbnN0IGZyYWdtZW50ID0gXCIjaW5jbHVkZSA8Y29tbW9uPlxcclxcbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cXHJcXG5cXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIGZsb2F0IG1pZGRsZUdyZXk7XFxyXFxudW5pZm9ybSBmbG9hdCBtYXhMdW1pbmFuY2U7XFxyXFxuXFxyXFxuI2lmZGVmIEFEQVBURURfTFVNSU5BTkNFXFxyXFxuXFxyXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbHVtaW5hbmNlTWFwO1xcclxcblxcclxcbiNlbHNlXFxyXFxuXFxyXFxuXFx0dW5pZm9ybSBmbG9hdCBhdmVyYWdlTHVtaW5hbmNlO1xcclxcblxcclxcbiNlbmRpZlxcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudmVjMyB0b25lTWFwKHZlYzMgYykge1xcclxcblxcclxcblxcdCNpZmRlZiBBREFQVEVEX0xVTUlOQU5DRVxcclxcblxcclxcblxcdFxcdC8vIEdldCB0aGUgY2FsY3VsYXRlZCBhdmVyYWdlIGx1bWluYW5jZSBieSBzYW1wbGluZyB0aGUgY2VudGVyLlxcclxcblxcdFxcdGZsb2F0IGx1bUF2ZyA9IHRleHR1cmUyRChsdW1pbmFuY2VNYXAsIHZlYzIoMC41KSkucjtcXHJcXG5cXHJcXG5cXHQjZWxzZVxcclxcblxcclxcblxcdFxcdGZsb2F0IGx1bUF2ZyA9IGF2ZXJhZ2VMdW1pbmFuY2U7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0Ly8gQ2FsY3VsYXRlIHRoZSBsdW1pbmFuY2Ugb2YgdGhlIGN1cnJlbnQgcGl4ZWwuXFxyXFxuXFx0ZmxvYXQgbHVtUGl4ZWwgPSBsaW5lYXJUb1JlbGF0aXZlTHVtaW5hbmNlKGMpO1xcclxcblxcclxcblxcdC8vIEFwcGx5IHRoZSBtb2RpZmllZCBvcGVyYXRvciAoUmVpbmhhcmQgRXEuIDQpLlxcclxcblxcdGZsb2F0IGx1bVNjYWxlZCA9IChsdW1QaXhlbCAqIG1pZGRsZUdyZXkpIC8gbHVtQXZnO1xcclxcblxcclxcblxcdGZsb2F0IGx1bUNvbXByZXNzZWQgPSAobHVtU2NhbGVkICogKDEuMCArIChsdW1TY2FsZWQgLyAobWF4THVtaW5hbmNlICogbWF4THVtaW5hbmNlKSkpKSAvICgxLjAgKyBsdW1TY2FsZWQpO1xcclxcblxcclxcblxcdHJldHVybiBsdW1Db21wcmVzc2VkICogYztcXHJcXG5cXHJcXG59XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZlYzQgdGV4ZWwgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdik7XFxyXFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCh0b25lTWFwKHRleGVsLnJnYiksIHRleGVsLmEpO1xcclxcblxcclxcblxcdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5jb25zdCB2ZXJ0ZXggPSBcInZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5cclxuLyoqXHJcbiAqIEZ1bGwtc2NyZWVuIHRvbmUtbWFwcGluZyBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIFRoaXMgbWF0ZXJpYWwgc3VwcG9ydHMgZGl0aGVyaW5nLlxyXG4gKlxyXG4gKiBSZWZlcmVuY2U6XHJcbiAqICBodHRwOi8vd3d3LmNpcy5yaXQuZWR1L3Blb3BsZS9mYWN1bHR5L2ZlcndlcmRhL3B1YmxpY2F0aW9ucy9zaWcwMl9wYXBlci5wZGZcclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgVG9uZU1hcHBpbmdNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB0b25lIG1hcHBpbmcgbWF0ZXJpYWwuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKHtcclxuXHJcblx0XHRcdHR5cGU6IFwiVG9uZU1hcHBpbmdNYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0dW5pZm9ybXM6IHtcclxuXHJcblx0XHRcdFx0dERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxyXG5cdFx0XHRcdGx1bWluYW5jZU1hcDogbmV3IFVuaWZvcm0obnVsbCksXHJcblx0XHRcdFx0YXZlcmFnZUx1bWluYW5jZTogbmV3IFVuaWZvcm0oMS4wKSxcclxuXHRcdFx0XHRtYXhMdW1pbmFuY2U6IG5ldyBVbmlmb3JtKDE2LjApLFxyXG5cdFx0XHRcdG1pZGRsZUdyZXk6IG5ldyBVbmlmb3JtKDAuNilcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQsXHJcblx0XHRcdHZlcnRleFNoYWRlcjogdmVydGV4LFxyXG5cclxuXHRcdFx0ZGVwdGhXcml0ZTogZmFsc2UsXHJcblx0XHRcdGRlcHRoVGVzdDogZmFsc2VcclxuXHJcblx0XHR9KTtcclxuXHJcblx0fVxyXG5cclxufVxyXG4iLCIvKipcclxuICogQSBjb2xsZWN0aW9uIG9mIHNoYWRlciBtYXRlcmlhbHMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgcG9zdCBwcm9jZXNzaW5nIHBhc3Nlcy5cclxuICpcclxuICogQG1vZHVsZSBwb3N0cHJvY2Vzc2luZy9tYXRlcmlhbHNcclxuICovXHJcblxyXG5leHBvcnQgeyBBZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbCB9IGZyb20gXCIuL0FkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsLmpzXCI7XHJcbmV4cG9ydCB7IEJva2VoTWF0ZXJpYWwgfSBmcm9tIFwiLi9Cb2tlaE1hdGVyaWFsLmpzXCI7XHJcbmV4cG9ydCB7IENvbG9yRWRnZXNNYXRlcmlhbCB9IGZyb20gXCIuL0NvbG9yRWRnZXNNYXRlcmlhbC5qc1wiO1xyXG5leHBvcnQgeyBDb21iaW5lTWF0ZXJpYWwgfSBmcm9tIFwiLi9Db21iaW5lTWF0ZXJpYWwuanNcIjtcclxuZXhwb3J0IHsgQ29udm9sdXRpb25NYXRlcmlhbCwgS2VybmVsU2l6ZSB9IGZyb20gXCIuL0NvbnZvbHV0aW9uTWF0ZXJpYWwuanNcIjtcclxuZXhwb3J0IHsgQ29weU1hdGVyaWFsIH0gZnJvbSBcIi4vQ29weU1hdGVyaWFsLmpzXCI7XHJcbmV4cG9ydCB7IERlcHRoQ29tcGFyaXNvbk1hdGVyaWFsIH0gZnJvbSBcIi4vRGVwdGhDb21wYXJpc29uTWF0ZXJpYWwuanNcIjtcclxuZXhwb3J0IHsgRG90U2NyZWVuTWF0ZXJpYWwgfSBmcm9tIFwiLi9Eb3RTY3JlZW5NYXRlcmlhbC5qc1wiO1xyXG5leHBvcnQgeyBGaWxtTWF0ZXJpYWwgfSBmcm9tIFwiLi9GaWxtTWF0ZXJpYWwuanNcIjtcclxuZXhwb3J0IHsgR2xpdGNoTWF0ZXJpYWwgfSBmcm9tIFwiLi9HbGl0Y2hNYXRlcmlhbC5qc1wiO1xyXG5leHBvcnQgeyBHb2RSYXlzTWF0ZXJpYWwgfSBmcm9tIFwiLi9Hb2RSYXlzTWF0ZXJpYWwuanNcIjtcclxuZXhwb3J0IHsgTHVtaW5vc2l0eU1hdGVyaWFsIH0gZnJvbSBcIi4vTHVtaW5vc2l0eU1hdGVyaWFsLmpzXCI7XHJcbmV4cG9ydCB7IE91dGxpbmVCbGVuZE1hdGVyaWFsIH0gZnJvbSBcIi4vT3V0bGluZUJsZW5kTWF0ZXJpYWwuanNcIjtcclxuZXhwb3J0IHsgT3V0bGluZUVkZ2VzTWF0ZXJpYWwgfSBmcm9tIFwiLi9PdXRsaW5lRWRnZXNNYXRlcmlhbC5qc1wiO1xyXG5leHBvcnQgeyBQaXhlbGF0aW9uTWF0ZXJpYWwgfSBmcm9tIFwiLi9QaXhlbGF0aW9uTWF0ZXJpYWwuanNcIjtcclxuZXhwb3J0IHsgUmVhbGlzdGljQm9rZWhNYXRlcmlhbCB9IGZyb20gXCIuL1JlYWxpc3RpY0Jva2VoTWF0ZXJpYWwuanNcIjtcclxuZXhwb3J0IHsgU2hvY2tXYXZlTWF0ZXJpYWwgfSBmcm9tIFwiLi9TaG9ja1dhdmVNYXRlcmlhbC5qc1wiO1xyXG5leHBvcnQgeyBTTUFBQmxlbmRNYXRlcmlhbCB9IGZyb20gXCIuL1NNQUFCbGVuZE1hdGVyaWFsLmpzXCI7XHJcbmV4cG9ydCB7IFNNQUFXZWlnaHRzTWF0ZXJpYWwgfSBmcm9tIFwiLi9TTUFBV2VpZ2h0c01hdGVyaWFsLmpzXCI7XHJcbmV4cG9ydCB7IFRvbmVNYXBwaW5nTWF0ZXJpYWwgfSBmcm9tIFwiLi9Ub25lTWFwcGluZ01hdGVyaWFsLmpzXCI7XHJcbiIsImltcG9ydCB7IFNjZW5lLCBNZXNoLCBPcnRob2dyYXBoaWNDYW1lcmEsIFBsYW5lQnVmZmVyR2VvbWV0cnkgfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbi8qKlxyXG4gKiBBbiBhYnN0cmFjdCBwYXNzLlxyXG4gKlxyXG4gKiBQYXNzZXMgdGhhdCBkbyBub3QgcmVseSBvbiB0aGUgZGVwdGggYnVmZmVyIHNob3VsZCBleHBsaWNpdGx5IGRpc2FibGUgdGhlXHJcbiAqIGRlcHRoIHRlc3QgYW5kIGRlcHRoIHdyaXRlIGluIHRoZWlyIHJlc3BlY3RpdmUgc2hhZGVyIG1hdGVyaWFscy5cclxuICpcclxuICogQGltcGxlbWVudHMge1Jlc2l6YWJsZX1cclxuICogQGltcGxlbWVudHMge0Rpc3Bvc2FibGV9XHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIFBhc3Mge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1N0cmluZ30gW25hbWVdIC0gVGhlIG5hbWUgb2YgdGhpcyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IFtzY2VuZV0gLSBUaGUgc2NlbmUgdG8gcmVuZGVyLlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBbY2FtZXJhXSAtIFRoZSBjYW1lcmEuXHJcblx0ICogQHBhcmFtIHtNZXNofSBbcXVhZF0gLSBBIHF1YWQgdGhhdCBmaWxscyB0aGUgc2NyZWVuIHRvIHJlbmRlciAyRCBmaWx0ZXIgZWZmZWN0cy4gU2V0IHRoaXMgdG8gbnVsbCwgaWYgeW91IGRvbid0IG5lZWQgaXQgKHNlZSB7QGxpbmsgUmVuZGVyUGFzc30pLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdG5hbWUgPSBcIlBhc3NcIixcclxuXHRcdHNjZW5lID0gbmV3IFNjZW5lKCksXHJcblx0XHRjYW1lcmEgPSBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhKC0xLCAxLCAxLCAtMSwgMCwgMSksXHJcblx0XHRxdWFkID0gbmV3IE1lc2gobmV3IFBsYW5lQnVmZmVyR2VvbWV0cnkoMiwgMiksIG51bGwpXHJcblx0KSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmFtZSBvZiB0aGlzIHBhc3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1N0cmluZ31cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMubmFtZSA9IG5hbWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2NlbmUgdG8gcmVuZGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtTY2VuZX1cclxuXHRcdCAqIEBwcm90ZWN0ZWRcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuc2NlbmUgPSBzY2VuZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjYW1lcmEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NhbWVyYX1cclxuXHRcdCAqIEBwcm90ZWN0ZWRcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuY2FtZXJhID0gY2FtZXJhO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBxdWFkIG1lc2ggdGhhdCBmaWxscyB0aGUgc2NyZWVuLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtNZXNofVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucXVhZCA9IHF1YWQ7XHJcblxyXG5cdFx0aWYodGhpcy5xdWFkICE9PSBudWxsKSB7XHJcblxyXG5cdFx0XHR0aGlzLnF1YWQuZnJ1c3R1bUN1bGxlZCA9IGZhbHNlO1xyXG5cclxuXHRcdFx0aWYodGhpcy5zY2VuZSAhPT0gbnVsbCkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnNjZW5lLmFkZCh0aGlzLnF1YWQpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgcGFzcyBzaG91bGQgcmVuZGVyIHRvIHNjcmVlbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVG9TY3JlZW4gPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgcGFzcyBzaG91bGQgYmUgZXhlY3V0ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLmVuYWJsZWQgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHtAbGluayBFZmZlY3RDb21wb3Nlcn0gc2hvdWxkIHN3YXAgdGhlIGZyYW1lXHJcblx0XHQgKiBidWZmZXJzIGFmdGVyIHRoaXMgcGFzcyBoYXMgZmluaXNoZWQgcmVuZGVyaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIFNldCB0aGlzIHRvIGBmYWxzZWAgaWYgdGhpcyBwYXNzIGRvZXNuJ3QgcmVuZGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVyIG9yXHJcblx0XHQgKiB0aGUgc2NyZWVuLiBPdGhlcndpc2UsIHRoZSBjb250ZW50cyBvZiB0aGUgaW5wdXQgYnVmZmVyIHdpbGwgYmUgbG9zdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMubmVlZHNTd2FwID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgZnVsbHNjcmVlbiBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtNYXRlcmlhbH1cclxuXHQgKi9cclxuXHJcblx0Z2V0IG1hdGVyaWFsKCkge1xyXG5cclxuXHRcdHJldHVybiAodGhpcy5xdWFkICE9PSBudWxsKSA/IHRoaXMucXVhZC5tYXRlcmlhbCA6IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZnVsbHNjcmVlbiBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIFRoZSBtYXRlcmlhbCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBxdWFkIG1lc2ggdGhhdCBmaWxscyB0aGUgc2NyZWVuLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge01hdGVyaWFsfVxyXG5cdCAqL1xyXG5cclxuXHRzZXQgbWF0ZXJpYWwodmFsdWUpIHtcclxuXHJcblx0XHRpZih0aGlzLnF1YWQgIT09IG51bGwpIHtcclxuXHJcblx0XHRcdHRoaXMucXVhZC5tYXRlcmlhbCA9IHZhbHVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBUaGlzIGlzIGFuIGFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgb3ZlcnJpZGRlbi5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEB0aHJvd3Mge0Vycm9yfSBBbiBlcnJvciBpcyB0aHJvd24gaWYgdGhlIG1ldGhvZCBpcyBub3Qgb3ZlcnJpZGRlbi5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdHRocm93IG5ldyBFcnJvcihcIlJlbmRlciBtZXRob2Qgbm90IGltcGxlbWVudGVkIVwiKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoaXMgcGFzcyB3aXRoIHRoZSByZW5kZXJlcidzIHNpemUuXHJcblx0ICpcclxuXHQgKiBZb3UgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIGNhc2UgeW91IHdhbnQgdG8gYmUgaW5mb3JtZWQgYWJvdXQgdGhlIG1haW5cclxuXHQgKiByZW5kZXIgc2l6ZS5cclxuXHQgKlxyXG5cdCAqIFRoZSB7QGxpbmsgRWZmZWN0Q29tcG9zZXJ9IGNhbGxzIHRoaXMgbWV0aG9kIGJlZm9yZSB0aGlzIHBhc3MgaXNcclxuXHQgKiBpbml0aWFsaXplZCBhbmQgZXZlcnkgdGltZSBpdHMgb3duIHNpemUgaXMgdXBkYXRlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aCAtIFRoZSByZW5kZXJlcidzIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgcmVuZGVyZXIncyBoZWlnaHQuXHJcblx0ICogQGV4YW1wbGUgdGhpcy5teVJlbmRlclRhcmdldC5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG5cdCAqL1xyXG5cclxuXHRzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHt9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIHRhc2tzLlxyXG5cdCAqXHJcblx0ICogQnkgb3ZlcnJpZGluZyB0aGlzIG1ldGhvZCB5b3UgZ2FpbiBhY2Nlc3MgdG8gdGhlIHJlbmRlcmVyLiBZb3UnbGwgYWxzbyBiZVxyXG5cdCAqIGFibGUgdG8gY29uZmlndXJlIHlvdXIgY3VzdG9tIHJlbmRlciB0YXJnZXRzIHRvIHVzZSB0aGUgYXBwcm9wcmlhdGUgZm9ybWF0XHJcblx0ICogKFJHQiBvciBSR0JBKS5cclxuXHQgKlxyXG5cdCAqIFRoZSBwcm92aWRlZCByZW5kZXJlciBjYW4gYmUgdXNlZCB0byB3YXJtIHVwIHNwZWNpYWwgb2ZmLXNjcmVlbiByZW5kZXJcclxuXHQgKiB0YXJnZXRzIGJ5IHBlcmZvcm1pbmcgYSBwcmVsaW1pbmFyeSByZW5kZXIgb3BlcmF0aW9uLlxyXG5cdCAqXHJcblx0ICogVGhlIHtAbGluayBFZmZlY3RDb21wb3Nlcn0gY2FsbHMgdGhpcyBtZXRob2Qgd2hlbiB0aGlzIHBhc3MgaXMgYWRkZWQgdG8gaXRzXHJcblx0ICogcXVldWUsIGJ1dCBub3QgYmVmb3JlIGl0cyBzaXplIGhhcyBiZWVuIHNldC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBhbHBoYSAtIFdoZXRoZXIgdGhlIHJlbmRlcmVyIHVzZXMgdGhlIGFscGhhIGNoYW5uZWwgb3Igbm90LlxyXG5cdCAqIEBleGFtcGxlIGlmKCFhbHBoYSkgeyB0aGlzLm15UmVuZGVyVGFyZ2V0LnRleHR1cmUuZm9ybWF0ID0gUkdCRm9ybWF0OyB9XHJcblx0ICovXHJcblxyXG5cdGluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKSB7fVxyXG5cclxuXHQvKipcclxuXHQgKiBQZXJmb3JtcyBhIHNoYWxsb3cgc2VhcmNoIGZvciBwcm9wZXJ0aWVzIHRoYXQgZGVmaW5lIGEgZGlzcG9zZSBtZXRob2QgYW5kXHJcblx0ICogZGVsZXRlcyB0aGVtLiBUaGUgcGFzcyB3aWxsIGJlIGlub3BlcmF0aXZlIGFmdGVyIHRoaXMgbWV0aG9kIHdhcyBjYWxsZWQhXHJcblx0ICpcclxuXHQgKiBEaXNwb3NhYmxlIG9iamVjdHM6XHJcblx0ICogIC0gcmVuZGVyIHRhcmdldHNcclxuXHQgKiAgLSBtYXRlcmlhbHNcclxuXHQgKiAgLSB0ZXh0dXJlc1xyXG5cdCAqXHJcblx0ICogVGhlIHtAbGluayBFZmZlY3RDb21wb3Nlcn0gY2FsbHMgdGhpcyBtZXRob2Qgd2hlbiBpdCBpcyBiZWluZyBkZXN0cm95ZWQuXHJcblx0ICogWW91IG1heSwgaG93ZXZlciwgdXNlIGl0IGluZGVwZW5kZW50bHkgdG8gZnJlZSBtZW1vcnkgd2hlbiB5b3UgYXJlIGNlcnRhaW5cclxuXHQgKiB0aGF0IHlvdSBkb24ndCBuZWVkIHRoaXMgcGFzcyBhbnltb3JlLlxyXG5cdCAqL1xyXG5cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdGxldCBrZXk7XHJcblxyXG5cdFx0Zm9yKGtleSBvZiBPYmplY3Qua2V5cyh0aGlzKSkge1xyXG5cclxuXHRcdFx0aWYodGhpc1trZXldICE9PSBudWxsICYmIHR5cGVvZiB0aGlzW2tleV0uZGlzcG9zZSA9PT0gXCJmdW5jdGlvblwiKSB7XHJcblxyXG5cdFx0XHRcdHRoaXNba2V5XS5kaXNwb3NlKCk7XHJcblx0XHRcdFx0dGhpc1trZXldID0gbnVsbDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYodGhpcy5tYXRlcmlhbCAhPT0gbnVsbCkge1xyXG5cclxuXHRcdFx0dGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IExpbmVhckZpbHRlciwgUkdCRm9ybWF0LCBXZWJHTFJlbmRlclRhcmdldCB9IGZyb20gXCJ0aHJlZVwiO1xyXG5pbXBvcnQgeyBDb252b2x1dGlvbk1hdGVyaWFsLCBLZXJuZWxTaXplIH0gZnJvbSBcIi4uL21hdGVyaWFsc1wiO1xyXG5pbXBvcnQgeyBQYXNzIH0gZnJvbSBcIi4vUGFzcy5qc1wiO1xyXG5cclxuLyoqXHJcbiAqIEFuIGVmZmljaWVudCwgaW5jcmVtZW50YWwgYmx1ciBwYXNzLlxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIHBhc3MgYWxsb3dzIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlciB0byBiZSB0aGUgc2FtZS5cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgQmx1clBhc3MgZXh0ZW5kcyBQYXNzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBibHVyIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnJlc29sdXRpb25TY2FsZT0wLjVdIC0gVGhlIHJlbmRlciB0ZXh0dXJlIHJlc29sdXRpb24gc2NhbGUsIHJlbGF0aXZlIHRvIHRoZSBzY3JlZW4gcmVuZGVyIHNpemUuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmtlcm5lbFNpemU9S2VybmVsU2l6ZS5MQVJHRV0gLSBUaGUgYmx1ciBrZXJuZWwgc2l6ZS5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XHJcblxyXG5cdFx0c3VwZXIoXCJCbHVyUGFzc1wiKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVuZGVyIHRhcmdldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRYID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KDEsIDEsIHtcclxuXHRcdFx0bWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXHJcblx0XHRcdG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyLFxyXG5cdFx0XHRzdGVuY2lsQnVmZmVyOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhCdWZmZXI6IGZhbHNlXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldFgudGV4dHVyZS5uYW1lID0gXCJCbHVyLlRhcmdldFhcIjtcclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0WC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBzZWNvbmQgcmVuZGVyIHRhcmdldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRZID0gdGhpcy5yZW5kZXJUYXJnZXRYLmNsb25lKCk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRZLnRleHR1cmUubmFtZSA9IFwiQmx1ci5UYXJnZXRZXCI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcmVzb2x1dGlvbiBzY2FsZS5cclxuXHRcdCAqXHJcblx0XHQgKiBZb3UgbmVlZCB0byBjYWxsIHtAbGluayBFZmZlY3RDb21wb3NlciNzZXRTaXplfSBhZnRlciBjaGFuZ2luZyB0aGlzXHJcblx0XHQgKiB2YWx1ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZXNvbHV0aW9uU2NhbGUgPSAob3B0aW9ucy5yZXNvbHV0aW9uU2NhbGUgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLnJlc29sdXRpb25TY2FsZSA6IDAuNTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgY29udm9sdXRpb24gc2hhZGVyIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb252b2x1dGlvbk1hdGVyaWFsfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuY29udm9sdXRpb25NYXRlcmlhbCA9IG5ldyBDb252b2x1dGlvbk1hdGVyaWFsKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGNvbnZvbHV0aW9uIHNoYWRlciBtYXRlcmlhbCB0aGF0IHVzZXMgZGl0aGVyaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb252b2x1dGlvbk1hdGVyaWFsfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuZGl0aGVyZWRDb252b2x1dGlvbk1hdGVyaWFsID0gbmV3IENvbnZvbHV0aW9uTWF0ZXJpYWwoKTtcclxuXHRcdHRoaXMuZGl0aGVyZWRDb252b2x1dGlvbk1hdGVyaWFsLmRpdGhlcmluZyA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBibHVycmVkIHJlc3VsdCBzaG91bGQgYWxzbyBiZSBkaXRoZXJlZCB1c2luZyBub2lzZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuZGl0aGVyaW5nID0gZmFsc2U7XHJcblxyXG5cdFx0dGhpcy5rZXJuZWxTaXplID0gb3B0aW9ucy5rZXJuZWxTaXplO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBhYnNvbHV0ZSB3aWR0aCBvZiB0aGUgaW50ZXJuYWwgcmVuZGVyIHRhcmdldHMuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgd2lkdGgoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucmVuZGVyVGFyZ2V0WC53aWR0aDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgYWJzb2x1dGUgaGVpZ2h0IG9mIHRoZSBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0cy5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0ICovXHJcblxyXG5cdGdldCBoZWlnaHQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucmVuZGVyVGFyZ2V0WC5oZWlnaHQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGtlcm5lbCBzaXplLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0tlcm5lbFNpemV9XHJcblx0ICovXHJcblxyXG5cdGdldCBrZXJuZWxTaXplKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmNvbnZvbHV0aW9uTWF0ZXJpYWwua2VybmVsU2l6ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBAdHlwZSB7S2VybmVsU2l6ZX1cclxuXHQgKi9cclxuXHJcblx0c2V0IGtlcm5lbFNpemUodmFsdWUgPSBLZXJuZWxTaXplLkxBUkdFKSB7XHJcblxyXG5cdFx0dGhpcy5jb252b2x1dGlvbk1hdGVyaWFsLmtlcm5lbFNpemUgPSB2YWx1ZTtcclxuXHRcdHRoaXMuZGl0aGVyZWRDb252b2x1dGlvbk1hdGVyaWFsLmtlcm5lbFNpemUgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBCbHVycyB0aGUgaW5wdXQgYnVmZmVyIGFuZCB3cml0ZXMgdGhlIHJlc3VsdCB0byB0aGUgb3V0cHV0IGJ1ZmZlci4gVGhlXHJcblx0ICogaW5wdXQgYnVmZmVyIHJlbWFpbnMgaW50YWN0LCB1bmxlc3MgaXRzIGFsc28gdGhlIG91dHB1dCBidWZmZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdGNvbnN0IHNjZW5lID0gdGhpcy5zY2VuZTtcclxuXHRcdGNvbnN0IGNhbWVyYSA9IHRoaXMuY2FtZXJhO1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlclRhcmdldFggPSB0aGlzLnJlbmRlclRhcmdldFg7XHJcblx0XHRjb25zdCByZW5kZXJUYXJnZXRZID0gdGhpcy5yZW5kZXJUYXJnZXRZO1xyXG5cclxuXHRcdGxldCBtYXRlcmlhbCA9IHRoaXMuY29udm9sdXRpb25NYXRlcmlhbDtcclxuXHRcdGxldCB1bmlmb3JtcyA9IG1hdGVyaWFsLnVuaWZvcm1zO1xyXG5cdFx0Y29uc3Qga2VybmVsID0gbWF0ZXJpYWwuZ2V0S2VybmVsKCk7XHJcblxyXG5cdFx0bGV0IGxhc3RSVCA9IGlucHV0QnVmZmVyO1xyXG5cdFx0bGV0IGRlc3RSVDtcclxuXHRcdGxldCBpLCBsO1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDtcclxuXHJcblx0XHQvLyBBcHBseSB0aGUgbXVsdGktcGFzcyBibHVyLlxyXG5cdFx0Zm9yKGkgPSAwLCBsID0ga2VybmVsLmxlbmd0aCAtIDE7IGkgPCBsOyArK2kpIHtcclxuXHJcblx0XHRcdC8vIEFsdGVybmF0ZSBiZXR3ZWVuIHRhcmdldHMuXHJcblx0XHRcdGRlc3RSVCA9ICgoaSAlIDIpID09PSAwKSA/IHJlbmRlclRhcmdldFggOiByZW5kZXJUYXJnZXRZO1xyXG5cclxuXHRcdFx0dW5pZm9ybXMua2VybmVsLnZhbHVlID0ga2VybmVsW2ldO1xyXG5cdFx0XHR1bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGxhc3RSVC50ZXh0dXJlO1xyXG5cdFx0XHRyZW5kZXJlci5yZW5kZXIoc2NlbmUsIGNhbWVyYSwgZGVzdFJUKTtcclxuXHJcblx0XHRcdGxhc3RSVCA9IGRlc3RSVDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYodGhpcy5kaXRoZXJpbmcpIHtcclxuXHJcblx0XHRcdG1hdGVyaWFsID0gdGhpcy5kaXRoZXJlZENvbnZvbHV0aW9uTWF0ZXJpYWw7XHJcblx0XHRcdHVuaWZvcm1zID0gbWF0ZXJpYWwudW5pZm9ybXM7XHJcblx0XHRcdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dW5pZm9ybXMua2VybmVsLnZhbHVlID0ga2VybmVsW2ldO1xyXG5cdFx0dW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBsYXN0UlQudGV4dHVyZTtcclxuXHRcdHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhLCB0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IG91dHB1dEJ1ZmZlcik7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgc2l6ZSBvZiB0aGlzIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgd2lkdGguXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcblx0ICovXHJcblxyXG5cdHNldFNpemUod2lkdGgsIGhlaWdodCkge1xyXG5cclxuXHRcdHdpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcih3aWR0aCAqIHRoaXMucmVzb2x1dGlvblNjYWxlKSk7XHJcblx0XHRoZWlnaHQgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKGhlaWdodCAqIHRoaXMucmVzb2x1dGlvblNjYWxlKSk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRYLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblx0XHR0aGlzLnJlbmRlclRhcmdldFkuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHJcblx0XHR0aGlzLmNvbnZvbHV0aW9uTWF0ZXJpYWwuc2V0VGV4ZWxTaXplKDEuMCAvIHdpZHRoLCAxLjAgLyBoZWlnaHQpO1xyXG5cdFx0dGhpcy5kaXRoZXJlZENvbnZvbHV0aW9uTWF0ZXJpYWwuc2V0VGV4ZWxTaXplKDEuMCAvIHdpZHRoLCAxLjAgLyBoZWlnaHQpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIHRhc2tzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGFscGhhIC0gV2hldGhlciB0aGUgcmVuZGVyZXIgdXNlcyB0aGUgYWxwaGEgY2hhbm5lbCBvciBub3QuXHJcblx0ICovXHJcblxyXG5cdGluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKSB7XHJcblxyXG5cdFx0aWYoIWFscGhhKSB7XHJcblxyXG5cdFx0XHR0aGlzLnJlbmRlclRhcmdldFgudGV4dHVyZS5mb3JtYXQgPSBSR0JGb3JtYXQ7XHJcblx0XHRcdHRoaXMucmVuZGVyVGFyZ2V0WS50ZXh0dXJlLmZvcm1hdCA9IFJHQkZvcm1hdDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgTGluZWFyRmlsdGVyLCBSR0JGb3JtYXQsIFdlYkdMUmVuZGVyVGFyZ2V0IH0gZnJvbSBcInRocmVlXCI7XHJcbmltcG9ydCB7IENvbWJpbmVNYXRlcmlhbCwgS2VybmVsU2l6ZSwgTHVtaW5vc2l0eU1hdGVyaWFsIH0gZnJvbSBcIi4uL21hdGVyaWFsc1wiO1xyXG5pbXBvcnQgeyBCbHVyUGFzcyB9IGZyb20gXCIuL0JsdXJQYXNzLmpzXCI7XHJcbmltcG9ydCB7IFBhc3MgfSBmcm9tIFwiLi9QYXNzLmpzXCI7XHJcblxyXG4vKipcclxuICogQSBibG9vbSBwYXNzLlxyXG4gKlxyXG4gKiBUaGlzIHBhc3MgcmVuZGVycyBhIHNjZW5lIHdpdGggc3VwZXJpbXBvc2VkIGJsdXIgYnkgdXRpbGl6aW5nIHRoZSBmYXN0IEthd2FzZVxyXG4gKiBjb252b2x1dGlvbiBhcHByb2FjaC5cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgQmxvb21QYXNzIGV4dGVuZHMgUGFzcyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYmxvb20gcGFzcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBUaGUgb3B0aW9ucy5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMucmVzb2x1dGlvblNjYWxlPTAuNV0gLSBUaGUgcmVuZGVyIHRleHR1cmUgcmVzb2x1dGlvbiBzY2FsZSwgcmVsYXRpdmUgdG8gdGhlIHNjcmVlbiByZW5kZXIgc2l6ZS5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMua2VybmVsU2l6ZT1LZXJuZWxTaXplLkxBUkdFXSAtIFRoZSBibHVyIGtlcm5lbCBzaXplLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5pbnRlbnNpdHk9MS4wXSAtIFRoZSBzdHJlbmd0aCBvZiB0aGUgYmxvb20gZWZmZWN0LlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kaXN0aW5jdGlvbj0xLjBdIC0gVGhlIGx1bWluYW5jZSBkaXN0aW5jdGlvbiBmYWN0b3IuIFJhaXNlIHRoaXMgdmFsdWUgdG8gYnJpbmcgb3V0IHRoZSBicmlnaHRlciBlbGVtZW50cyBpbiB0aGUgc2NlbmUuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnNjcmVlbk1vZGU9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBzY3JlZW4gYmxlbmQgbW9kZSBzaG91bGQgYmUgdXNlZCBmb3IgY29tYmluaW5nIHRoZSBibG9vbSB0ZXh0dXJlIHdpdGggdGhlIHNjZW5lIGNvbG9ycy5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XHJcblxyXG5cdFx0c3VwZXIoXCJCbG9vbVBhc3NcIik7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlbmRlciB0YXJnZXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0ID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KDEsIDEsIHtcclxuXHRcdFx0bWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXHJcblx0XHRcdG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyLFxyXG5cdFx0XHRzdGVuY2lsQnVmZmVyOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhCdWZmZXI6IGZhbHNlXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlLm5hbWUgPSBcIkJsb29tLlRhcmdldFwiO1xyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgYmx1ciBwYXNzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtCbHVyUGFzc31cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLmJsdXJQYXNzID0gbmV3IEJsdXJQYXNzKG9wdGlvbnMpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBjb21iaW5lIHNoYWRlciBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29tYmluZU1hdGVyaWFsfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuY29tYmluZU1hdGVyaWFsID0gbmV3IENvbWJpbmVNYXRlcmlhbCgob3B0aW9ucy5zY3JlZW5Nb2RlICE9PSB1bmRlZmluZWQpID8gb3B0aW9ucy5zY3JlZW5Nb2RlIDogdHJ1ZSk7XHJcblxyXG5cdFx0dGhpcy5pbnRlbnNpdHkgPSBvcHRpb25zLmludGVuc2l0eTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgbHVtaW5vc2l0eSBzaGFkZXIgbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0x1bWlub3NpdHlNYXRlcmlhbH1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLmx1bWlub3NpdHlNYXRlcmlhbCA9IG5ldyBMdW1pbm9zaXR5TWF0ZXJpYWwodHJ1ZSk7XHJcblxyXG5cdFx0dGhpcy5kaXN0aW5jdGlvbiA9IG9wdGlvbnMuZGlzdGluY3Rpb247XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIHJlc29sdXRpb24gc2NhbGUuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgcmVzb2x1dGlvblNjYWxlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmJsdXJQYXNzLnJlc29sdXRpb25TY2FsZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBZb3UgbmVlZCB0byBjYWxsIHtAbGluayBFZmZlY3RDb21wb3NlciNzZXRTaXplfSBhZnRlciBjaGFuZ2luZyB0aGlzIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge051bWJlcn1cclxuXHQgKi9cclxuXHJcblx0c2V0IHJlc29sdXRpb25TY2FsZSh2YWx1ZSA9IDAuNSkge1xyXG5cclxuXHRcdHRoaXMuYmx1clBhc3MucmVzb2x1dGlvblNjYWxlID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGJsdXIga2VybmVsIHNpemUuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7S2VybmVsU2l6ZX1cclxuXHQgKi9cclxuXHJcblx0Z2V0IGtlcm5lbFNpemUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYmx1clBhc3Mua2VybmVsU2l6ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBAdHlwZSB7S2VybmVsU2l6ZX1cclxuXHQgKi9cclxuXHJcblx0c2V0IGtlcm5lbFNpemUodmFsdWUgPSBLZXJuZWxTaXplLkxBUkdFKSB7XHJcblxyXG5cdFx0dGhpcy5ibHVyUGFzcy5rZXJuZWxTaXplID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIG92ZXJhbGwgaW50ZW5zaXR5IG9mIHRoZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgaW50ZW5zaXR5KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmNvbWJpbmVNYXRlcmlhbC51bmlmb3Jtcy5vcGFjaXR5Mi52YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdCAqL1xyXG5cclxuXHRzZXQgaW50ZW5zaXR5KHZhbHVlID0gMS4wKSB7XHJcblxyXG5cdFx0dGhpcy5jb21iaW5lTWF0ZXJpYWwudW5pZm9ybXMub3BhY2l0eTIudmFsdWUgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgbHVtaW5hbmNlIGRpc3RpbmN0aW9uIGZhY3Rvci5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0ICovXHJcblxyXG5cdGdldCBkaXN0aW5jdGlvbigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5sdW1pbm9zaXR5TWF0ZXJpYWwudW5pZm9ybXMuZGlzdGluY3Rpb24udmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQHR5cGUge051bWJlcn1cclxuXHQgKi9cclxuXHJcblx0c2V0IGRpc3RpbmN0aW9uKHZhbHVlID0gMS4wKSB7XHJcblxyXG5cdFx0dGhpcy5sdW1pbm9zaXR5TWF0ZXJpYWwudW5pZm9ybXMuZGlzdGluY3Rpb24udmFsdWUgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbmRpY2F0ZXMgd2hldGhlciBkaXRoZXJpbmcgaXMgZW5hYmxlZC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtCb29sZWFufVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgZGl0aGVyaW5nKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmJsdXJQYXNzLmRpdGhlcmluZztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJZiBlbmFibGVkLCB0aGUgcmVzdWx0IHdpbGwgYmUgZGl0aGVyZWQgdG8gcmVtb3ZlIGJhbmRpbmcgYXJ0aWZhY3RzLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0ICovXHJcblxyXG5cdHNldCBkaXRoZXJpbmcodmFsdWUpIHtcclxuXHJcblx0XHR0aGlzLmJsdXJQYXNzLmRpdGhlcmluZyA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlZmZlY3Qgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIGlucHV0IGJ1ZmZlci5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtCb29sZWFufVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgYmxlbmQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubmVlZHNTd2FwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIGRpc2FibGVkLCB0aGUgaW5wdXQgYnVmZmVyIHdpbGwgcmVtYWluIHVuYWZmZWN0ZWQuXHJcblx0ICpcclxuXHQgKiBZb3UgbWF5IHVzZSB0aGUge0BsaW5rIEJsb29tUGFzcyNvdmVybGF5fSB0ZXh0dXJlIHRvIGFwcGx5IHRoZSBlZmZlY3QgdG9cclxuXHQgKiB5b3VyIHNjZW5lLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0ICovXHJcblxyXG5cdHNldCBibGVuZCh2YWx1ZSkge1xyXG5cclxuXHRcdHRoaXMubmVlZHNTd2FwID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGVmZmVjdCBvdmVybGF5IHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7VGV4dHVyZX1cclxuXHQgKi9cclxuXHJcblx0Z2V0IG92ZXJsYXkoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucmVuZGVyVGFyZ2V0LnRleHR1cmU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuXHQgKi9cclxuXHJcblx0cmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcclxuXHJcblx0XHRjb25zdCBzY2VuZSA9IHRoaXMuc2NlbmU7XHJcblx0XHRjb25zdCBjYW1lcmEgPSB0aGlzLmNhbWVyYTtcclxuXHRcdGNvbnN0IGJsdXJQYXNzID0gdGhpcy5ibHVyUGFzcztcclxuXHJcblx0XHRjb25zdCBsdW1pbm9zaXR5TWF0ZXJpYWwgPSB0aGlzLmx1bWlub3NpdHlNYXRlcmlhbDtcclxuXHRcdGNvbnN0IGNvbWJpbmVNYXRlcmlhbCA9IHRoaXMuY29tYmluZU1hdGVyaWFsO1xyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0ID0gdGhpcy5yZW5kZXJUYXJnZXQ7XHJcblxyXG5cdFx0Ly8gTHVtaW5hbmNlIGZpbHRlci5cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSBsdW1pbm9zaXR5TWF0ZXJpYWw7XHJcblx0XHRsdW1pbm9zaXR5TWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xyXG5cdFx0cmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldCk7XHJcblxyXG5cdFx0Ly8gQ29udm9sdXRpb24gcGhhc2UuXHJcblx0XHRibHVyUGFzcy5yZW5kZXIocmVuZGVyZXIsIHJlbmRlclRhcmdldCwgcmVuZGVyVGFyZ2V0KTtcclxuXHJcblx0XHRpZih0aGlzLmJsZW5kKSB7XHJcblxyXG5cdFx0XHQvLyBSZW5kZXIgdGhlIG9yaWdpbmFsIHNjZW5lIHdpdGggc3VwZXJpbXBvc2VkIGJsdXIuXHJcblx0XHRcdHRoaXMubWF0ZXJpYWwgPSBjb21iaW5lTWF0ZXJpYWw7XHJcblx0XHRcdGNvbWJpbmVNYXRlcmlhbC51bmlmb3Jtcy50ZXh0dXJlMS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XHJcblx0XHRcdGNvbWJpbmVNYXRlcmlhbC51bmlmb3Jtcy50ZXh0dXJlMi52YWx1ZSA9IHJlbmRlclRhcmdldC50ZXh0dXJlO1xyXG5cclxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogb3V0cHV0QnVmZmVyKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgc2l6ZSBvZiB0aGlzIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgd2lkdGguXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcblx0ICovXHJcblxyXG5cdHNldFNpemUod2lkdGgsIGhlaWdodCkge1xyXG5cclxuXHRcdHRoaXMuYmx1clBhc3Muc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHJcblx0XHR3aWR0aCA9IHRoaXMuYmx1clBhc3Mud2lkdGg7XHJcblx0XHRoZWlnaHQgPSB0aGlzLmJsdXJQYXNzLmhlaWdodDtcclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldC5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIHRhc2tzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGFscGhhIC0gV2hldGhlciB0aGUgcmVuZGVyZXIgdXNlcyB0aGUgYWxwaGEgY2hhbm5lbCBvciBub3QuXHJcblx0ICovXHJcblxyXG5cdGluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKSB7XHJcblxyXG5cdFx0dGhpcy5ibHVyUGFzcy5pbml0aWFsaXplKHJlbmRlcmVyLCBhbHBoYSk7XHJcblxyXG5cdFx0aWYoIWFscGhhKSB7XHJcblxyXG5cdFx0XHR0aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlLmZvcm1hdCA9IFJHQkZvcm1hdDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgQm9rZWhNYXRlcmlhbCB9IGZyb20gXCIuLi9tYXRlcmlhbHNcIjtcclxuaW1wb3J0IHsgUGFzcyB9IGZyb20gXCIuL1Bhc3MuanNcIjtcclxuXHJcbi8qKlxyXG4gKiBBIERlcHRoIG9mIEZpZWxkIChEb0YpIHBhc3MgdXNpbmcgYSBib2tlaCBzaGFkZXIuXHJcbiAqXHJcbiAqIFRoaXMgcGFzcyByZXF1aXJlcyBhIHtAbGluayBFZmZlY3RDb21wb3NlciNkZXB0aFRleHR1cmV9LlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBCb2tlaFBhc3MgZXh0ZW5kcyBQYXNzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBib2tlaCBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtQZXJzcGVjdGl2ZUNhbWVyYX0gY2FtZXJhIC0gVGhlIG1haW4gY2FtZXJhLiBVc2VkIHRvIG9idGFpbiB0aGUgYXNwZWN0IHJhdGlvIGFuZCB0aGUgbmVhciBhbmQgZmFyIHBsYW5lIHNldHRpbmdzLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBBZGRpdGlvbmFsIHBhcmFtZXRlcnMuIFNlZSB7QGxpbmsgQm9rZWhNYXRlcmlhbH0gZm9yIGRldGFpbHMuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKGNhbWVyYSwgb3B0aW9ucyA9IHt9KSB7XHJcblxyXG5cdFx0c3VwZXIoXCJCb2tlaFBhc3NcIik7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbCA9IG5ldyBCb2tlaE1hdGVyaWFsKGNhbWVyYSwgb3B0aW9ucyk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuXHQgKi9cclxuXHJcblx0cmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcclxuXHRcdHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudERlcHRoLnZhbHVlID0gaW5wdXRCdWZmZXIuZGVwdGhUZXh0dXJlO1xyXG5cclxuXHRcdHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLmFzcGVjdC52YWx1ZSA9IHdpZHRoIC8gaGVpZ2h0O1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFBhc3MgfSBmcm9tIFwiLi9QYXNzLmpzXCI7XHJcblxyXG4vKipcclxuICogQSBwYXNzIHRoYXQgZGlzYWJsZXMgdGhlIHN0ZW5jaWwgdGVzdC5cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgQ2xlYXJNYXNrUGFzcyBleHRlbmRzIFBhc3Mge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGNsZWFyIG1hc2sgcGFzcy5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0c3VwZXIoXCJDbGVhck1hc2tQYXNzXCIsIG51bGwsIG51bGwsIG51bGwpO1xyXG5cclxuXHRcdHRoaXMubmVlZHNTd2FwID0gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGlzYWJsZXMgdGhlIGdsb2JhbCBzdGVuY2lsIHRlc3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdHJlbmRlcmVyLnN0YXRlLmJ1ZmZlcnMuc3RlbmNpbC5zZXRUZXN0KGZhbHNlKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBDb2xvciB9IGZyb20gXCJ0aHJlZVwiO1xyXG5pbXBvcnQgeyBQYXNzIH0gZnJvbSBcIi4vUGFzcy5qc1wiO1xyXG5cclxuLyoqXHJcbiAqIFVzZWQgZm9yIHNhdmluZyB0aGUgb3JpZ2luYWwgY2xlYXIgY29sb3Igb2YgdGhlIHJlbmRlcmVyLlxyXG4gKlxyXG4gKiBAdHlwZSB7Q29sb3J9XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5cclxuY29uc3QgY29sb3IgPSBuZXcgQ29sb3IoKTtcclxuXHJcbi8qKlxyXG4gKiBBIHBhc3MgdGhhdCBjbGVhcnMgdGhlIGlucHV0IGJ1ZmZlciBvciB0aGUgc2NyZWVuLlxyXG4gKlxyXG4gKiBZb3UgY2FuIHByZXZlbnQgc3BlY2lmaWMgYml0cyBmcm9tIGJlaW5nIGNsZWFyZWQgYnkgc2V0dGluZyBlaXRoZXIgdGhlXHJcbiAqIGF1dG9DbGVhckNvbG9yLCBhdXRvQ2xlYXJTdGVuY2lsIG9yIGF1dG9DbGVhckRlcHRoIHByb3BlcnRpZXMgb2YgdGhlIHJlbmRlcmVyXHJcbiAqIHRvIGZhbHNlLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBDbGVhclBhc3MgZXh0ZW5kcyBQYXNzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjbGVhciBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIEFkZGl0aW9uYWwgb3B0aW9ucy5cclxuXHQgKiBAcGFyYW0ge0NvbG9yfSBbb3B0aW9ucy5jbGVhckNvbG9yPW51bGxdIC0gQW4gb3ZlcnJpZGUgY2xlYXIgY29sb3IuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmNsZWFyQWxwaGE9MC4wXSAtIEFuIG92ZXJyaWRlIGNsZWFyIGFscGhhLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcclxuXHJcblx0XHRzdXBlcihcIkNsZWFyUGFzc1wiLCBudWxsLCBudWxsLCBudWxsKTtcclxuXHJcblx0XHR0aGlzLm5lZWRzU3dhcCA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNsZWFyIGNvbG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb2xvcn1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuY2xlYXJDb2xvciA9IChvcHRpb25zLmNsZWFyQ29sb3IgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLmNsZWFyQ29sb3IgOiBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNsZWFyIGFscGhhLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLmNsZWFyQWxwaGEgPSAob3B0aW9ucy5jbGVhckFscGhhICE9PSB1bmRlZmluZWQpID8gb3B0aW9ucy5jbGVhckFscGhhIDogMC4wO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENsZWFycyB0aGUgaW5wdXQgYnVmZmVyIG9yIHRoZSBzY3JlZW4uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdGNvbnN0IGNsZWFyQ29sb3IgPSB0aGlzLmNsZWFyQ29sb3I7XHJcblxyXG5cdFx0bGV0IGNsZWFyQWxwaGE7XHJcblxyXG5cdFx0aWYoY2xlYXJDb2xvciAhPT0gbnVsbCkge1xyXG5cclxuXHRcdFx0Y29sb3IuY29weShyZW5kZXJlci5nZXRDbGVhckNvbG9yKCkpO1xyXG5cdFx0XHRjbGVhckFscGhhID0gcmVuZGVyZXIuZ2V0Q2xlYXJBbHBoYSgpO1xyXG5cdFx0XHRyZW5kZXJlci5zZXRDbGVhckNvbG9yKGNsZWFyQ29sb3IsIHRoaXMuY2xlYXJBbHBoYSk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCh0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IGlucHV0QnVmZmVyKTtcclxuXHRcdHJlbmRlcmVyLmNsZWFyKCk7XHJcblxyXG5cdFx0aWYoY2xlYXJDb2xvciAhPT0gbnVsbCkge1xyXG5cclxuXHRcdFx0cmVuZGVyZXIuc2V0Q2xlYXJDb2xvcihjb2xvciwgY2xlYXJBbHBoYSk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IERvdFNjcmVlbk1hdGVyaWFsIH0gZnJvbSBcIi4uL21hdGVyaWFsc1wiO1xyXG5pbXBvcnQgeyBQYXNzIH0gZnJvbSBcIi4vUGFzcy5qc1wiO1xyXG5cclxuLyoqXHJcbiAqIEEgZG90IHNjcmVlbiBwYXNzLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBEb3RTY3JlZW5QYXNzIGV4dGVuZHMgUGFzcyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZG90IHNjcmVlbiBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYXZlcmFnZT1mYWxzZV0gLSBXaGV0aGVyIHRoZSBzaGFkZXIgc2hvdWxkIG91dHB1dCBhIGNvbG91ciBhdmVyYWdlIChibGFjayBhbmQgd2hpdGUpLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5hbmdsZT0xLjU3XSAtIFRoZSBhbmdsZSBvZiB0aGUgcGF0dGVybi5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuc2NhbGU9MS4wXSAtIFRoZSBzY2FsZSBvZiB0aGUgb3ZlcmFsbCBlZmZlY3QuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmludGVuc2l0eT0xLjBdIC0gVGhlIGludGVuc2l0eSBvZiB0aGUgZWZmZWN0LlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcclxuXHJcblx0XHRzdXBlcihcIkRvdFNjcmVlblBhc3NcIik7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbCA9IG5ldyBEb3RTY3JlZW5NYXRlcmlhbChvcHRpb25zKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xyXG5cclxuXHRcdHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcclxuXHJcblx0XHR3aWR0aCA9IE1hdGgubWF4KDEsIHdpZHRoKTtcclxuXHRcdGhlaWdodCA9IE1hdGgubWF4KDEsIGhlaWdodCk7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbC51bmlmb3Jtcy5vZmZzZXRSZXBlYXQudmFsdWUueiA9IHdpZHRoO1xyXG5cdFx0dGhpcy5tYXRlcmlhbC51bmlmb3Jtcy5vZmZzZXRSZXBlYXQudmFsdWUudyA9IGhlaWdodDtcclxuXHJcblx0fVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBGaWxtTWF0ZXJpYWwgfSBmcm9tIFwiLi4vbWF0ZXJpYWxzXCI7XHJcbmltcG9ydCB7IFBhc3MgfSBmcm9tIFwiLi9QYXNzLmpzXCI7XHJcblxyXG4vKipcclxuICogQSBmaWxtIHBhc3MuXHJcbiAqXHJcbiAqIFByb3ZpZGVzIHZhcmlvdXMgY2luZW1hdGljIGVmZmVjdHMuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIEZpbG1QYXNzIGV4dGVuZHMgUGFzcyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZmlsbSBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLiBTZWUge0BsaW5rIEZpbG1NYXRlcmlhbH0gZm9yIG1vcmUgb3B0aW9ucy5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuc2NhbmxpbmVEZW5zaXR5PTEuMjVdIC0gVGhlIHNjYW5saW5lIGRlbnNpdHksIHJlbGF0aXZlIHRvIHRoZSBzY3JlZW4gaGVpZ2h0LlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5ncmlkU2NhbGU9MS4wXSAtIFRoZSBncmlkIHNjYWxlLCByZWxhdGl2ZSB0byB0aGUgc2NyZWVuIGhlaWdodC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZ3JpZExpbmVXaWR0aD0wLjBdIC0gVGhlIGdyaWQgbGluZSB3aWR0aC4gVGhpcyB2YWx1ZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBiYXNlIGxpbmUgd2lkdGguXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xyXG5cclxuXHRcdHN1cGVyKFwiRmlsbVBhc3NcIik7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbCA9IG5ldyBGaWxtTWF0ZXJpYWwob3B0aW9ucyk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYW1vdW50IG9mIHNjYW5saW5lcywgcmVsYXRpdmUgdG8gdGhlIHNjcmVlbiBoZWlnaHQuXHJcblx0XHQgKlxyXG5cdFx0ICogWW91IG5lZWQgdG8gY2FsbCB7QGxpbmsgRWZmZWN0Q29tcG9zZXIjc2V0U2l6ZX0gYWZ0ZXIgY2hhbmdpbmcgdGhpc1xyXG5cdFx0ICogdmFsdWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge051bWJlcn1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuc2NhbmxpbmVEZW5zaXR5ID0gKG9wdGlvbnMuc2NhbmxpbmVEZW5zaXR5ID09PSB1bmRlZmluZWQpID8gMS4yNSA6IG9wdGlvbnMuc2NhbmxpbmVEZW5zaXR5O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGdyaWQgc2NhbGUsIHJlbGF0aXZlIHRvIHRoZSBzY3JlZW4gaGVpZ2h0LlxyXG5cdFx0ICpcclxuXHRcdCAqIFlvdSBuZWVkIHRvIGNhbGwge0BsaW5rIEVmZmVjdENvbXBvc2VyI3NldFNpemV9IGFmdGVyIGNoYW5naW5nIHRoaXNcclxuXHRcdCAqIHZhbHVlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLmdyaWRTY2FsZSA9IChvcHRpb25zLmdyaWRTY2FsZSA9PT0gdW5kZWZpbmVkKSA/IDEuMCA6IE1hdGgubWF4KG9wdGlvbnMuZ3JpZFNjYWxlLCAxZS02KTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBncmlkIGxpbmUgd2lkdGguXHJcblx0XHQgKlxyXG5cdFx0ICogWW91IG5lZWQgdG8gY2FsbCB7QGxpbmsgRWZmZWN0Q29tcG9zZXIjc2V0U2l6ZX0gYWZ0ZXIgY2hhbmdpbmcgdGhpc1xyXG5cdFx0ICogdmFsdWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge051bWJlcn1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuZ3JpZExpbmVXaWR0aCA9IChvcHRpb25zLmdyaWRMaW5lV2lkdGggPT09IHVuZGVmaW5lZCkgPyAwLjAgOiBNYXRoLm1heChvcHRpb25zLmdyaWRMaW5lV2lkdGgsIDAuMCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuXHQgKi9cclxuXHJcblx0cmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcclxuXHRcdHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudGltZS52YWx1ZSArPSBkZWx0YTtcclxuXHJcblx0XHRyZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogb3V0cHV0QnVmZmVyKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBzaXplIG9mIHRoaXMgcGFzcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodC5cclxuXHQgKi9cclxuXHJcblx0c2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XHJcblxyXG5cdFx0Y29uc3QgYXNwZWN0ID0gd2lkdGggLyBoZWlnaHQ7XHJcblx0XHRjb25zdCBncmlkU2NhbGUgPSB0aGlzLmdyaWRTY2FsZSAqIChoZWlnaHQgKiAwLjEyNSk7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbC51bmlmb3Jtcy5zY2FubGluZUNvdW50LnZhbHVlID0gTWF0aC5yb3VuZChoZWlnaHQgKiB0aGlzLnNjYW5saW5lRGVuc2l0eSk7XHJcblx0XHR0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLmdyaWRTY2FsZS52YWx1ZS5zZXQoYXNwZWN0ICogZ3JpZFNjYWxlLCBncmlkU2NhbGUpO1xyXG5cdFx0dGhpcy5tYXRlcmlhbC51bmlmb3Jtcy5ncmlkTGluZVdpZHRoLnZhbHVlID0gKGdyaWRTY2FsZSAvIGhlaWdodCkgKyB0aGlzLmdyaWRMaW5lV2lkdGg7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgRGF0YVRleHR1cmUsIFJHQkZvcm1hdCwgRmxvYXRUeXBlIH0gZnJvbSBcInRocmVlXCI7XHJcbmltcG9ydCB7IEdsaXRjaE1hdGVyaWFsIH0gZnJvbSBcIi4uL21hdGVyaWFsc1wiO1xyXG5pbXBvcnQgeyBQYXNzIH0gZnJvbSBcIi4vUGFzcy5qc1wiO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSByYW5kb20gaW50ZWdlciBpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbG93IC0gVGhlIGxvd2VzdCBwb3NzaWJsZSB2YWx1ZS5cclxuICogQHBhcmFtIHtOdW1iZXJ9IGhpZ2ggLSBUaGUgaGlnaGVzdCBwb3NzaWJsZSB2YWx1ZS5cclxuICogQHJldHVybiB7TnVtYmVyfSBUaGUgcmFuZG9tIHZhbHVlLlxyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIHJhbmRvbUludChsb3csIGhpZ2gpIHtcclxuXHJcblx0cmV0dXJuIGxvdyArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChoaWdoIC0gbG93ICsgMSkpO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSByYW5kb20gZmxvYXQgaW4gdGhlIHNwZWNpZmllZCByYW5nZS5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IGxvdyAtIFRoZSBsb3dlc3QgcG9zc2libGUgdmFsdWUuXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBoaWdoIC0gVGhlIGhpZ2hlc3QgcG9zc2libGUgdmFsdWUuXHJcbiAqIEByZXR1cm4ge051bWJlcn0gVGhlIHJhbmRvbSB2YWx1ZS5cclxuICovXHJcblxyXG5mdW5jdGlvbiByYW5kb21GbG9hdChsb3csIGhpZ2gpIHtcclxuXHJcblx0cmV0dXJuIGxvdyArIE1hdGgucmFuZG9tKCkgKiAoaGlnaCAtIGxvdyk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQSBnbGl0Y2ggcGFzcy5cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgR2xpdGNoUGFzcyBleHRlbmRzIFBhc3Mge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGdsaXRjaCBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gW29wdGlvbnMucGVydHVyYk1hcF0gLSBBIHBlcnR1cmJhdGlvbiBtYXAuIElmIG5vbmUgaXMgcHJvdmlkZWQsIGEgbm9pc2UgdGV4dHVyZSB3aWxsIGJlIGNyZWF0ZWQuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmR0U2l6ZT02NF0gLSBUaGUgc2l6ZSBvZiB0aGUgZ2VuZXJhdGVkIG5vaXNlIG1hcC4gV2lsbCBiZSBpZ25vcmVkIGlmIGEgcGVydHVyYmF0aW9uIG1hcCBpcyBwcm92aWRlZC5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XHJcblxyXG5cdFx0c3VwZXIoXCJHbGl0Y2hQYXNzXCIpO1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSBuZXcgR2xpdGNoTWF0ZXJpYWwoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcGVydHVyYmF0aW9uIG1hcC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VGV4dHVyZX1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnRleHR1cmUgPSBudWxsO1xyXG5cclxuXHRcdHRoaXMucGVydHVyYk1hcCA9IChvcHRpb25zLnBlcnR1cmJNYXAgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLnBlcnR1cmJNYXAgOiB0aGlzLmdlbmVyYXRlUGVydHVyYk1hcChvcHRpb25zLmR0U2l6ZSk7XHJcblx0XHR0aGlzLnBlcnR1cmJNYXAubmFtZSA9IFwiR2xpdGNoLlBlcnR1cmJhdGlvblwiO1xyXG5cdFx0dGhpcy5wZXJ0dXJiTWFwLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGVmZmVjdCBtb2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtHbGl0Y2hNb2RlfVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5tb2RlID0gR2xpdGNoTW9kZS5TUE9SQURJQztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgY291bnRlciBmb3IgdGhlIGdsaXRjaCBhY3RpdmF0aW9uIGFuZCBkZWFjdGl2YXRpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge051bWJlcn1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLmNvdW50ZXIgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByYW5kb20gYnJlYWsgcG9pbnQgZm9yIHRoZSBzcG9yYWRpYyBnbGl0Y2ggYWN0aXZhdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuYnJlYWtQb2ludCA9IHJhbmRvbUludCgxMjAsIDI0MCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGN1cnJlbnQgcGVydHVyYmF0aW9uIG1hcC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtUZXh0dXJlfVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgcGVydHVyYk1hcCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFzc2lnbmluZyBhIG5ldyBwZXJ0dXJiYXRpb24gbWFwIGRvZXMgbm90IGRlc3Ryb3kgdGhlIGN1cnJlbnQgb25lIVxyXG5cdCAqXHJcblx0ICogQHR5cGUge1RleHR1cmV9XHJcblx0ICovXHJcblxyXG5cdHNldCBwZXJ0dXJiTWFwKHZhbHVlKSB7XHJcblxyXG5cdFx0dGhpcy50ZXh0dXJlID0gdmFsdWU7XHJcblx0XHR0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLnRQZXJ0dXJiLnZhbHVlID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVzdHJveXMgdGhlIGN1cnJlbnQgcGVydHVyYmF0aW9uIG1hcCBhbmQgcmVwbGFjZXMgaXQgd2l0aCBhIG5ldyBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW3NpemU9NjRdIC0gVGhlIHRleHR1cmUgc2l6ZS5cclxuXHQgKiBAcmV0dXJuIHtEYXRhVGV4dHVyZX0gVGhlIHBlcnR1cmJhdGlvbiB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cclxuXHRnZW5lcmF0ZVBlcnR1cmJNYXAoc2l6ZSA9IDY0KSB7XHJcblxyXG5cdFx0Y29uc3QgcGl4ZWxzID0gc2l6ZSAqIHNpemU7XHJcblx0XHRjb25zdCBkYXRhID0gbmV3IEZsb2F0MzJBcnJheShwaXhlbHMgKiAzKTtcclxuXHJcblx0XHRsZXQgZHQgPSB0aGlzLnBlcnR1cmJNYXA7XHJcblx0XHRsZXQgaSwgeDtcclxuXHJcblx0XHRmb3IoaSA9IDA7IGkgPCBwaXhlbHM7ICsraSkge1xyXG5cclxuXHRcdFx0eCA9IE1hdGgucmFuZG9tKCk7XHJcblxyXG5cdFx0XHRkYXRhW2kgKiAzXSA9IHg7XHJcblx0XHRcdGRhdGFbaSAqIDMgKyAxXSA9IHg7XHJcblx0XHRcdGRhdGFbaSAqIDMgKyAyXSA9IHg7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmKGR0ICE9PSBudWxsKSB7XHJcblxyXG5cdFx0XHRkdC5kaXNwb3NlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGR0ID0gbmV3IERhdGFUZXh0dXJlKGRhdGEsIHNpemUsIHNpemUsIFJHQkZvcm1hdCwgRmxvYXRUeXBlKTtcclxuXHRcdGR0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnBlcnR1cmJNYXAgPSBkdDtcclxuXHJcblx0XHRyZXR1cm4gZHQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuXHQgKi9cclxuXHJcblx0cmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcclxuXHJcblx0XHRjb25zdCBtb2RlID0gdGhpcy5tb2RlO1xyXG5cdFx0Y29uc3QgY291bnRlciA9IHRoaXMuY291bnRlcjtcclxuXHRcdGNvbnN0IGJyZWFrUG9pbnQgPSB0aGlzLmJyZWFrUG9pbnQ7XHJcblx0XHRjb25zdCB1bmlmb3JtcyA9IHRoaXMubWF0ZXJpYWwudW5pZm9ybXM7XHJcblxyXG5cdFx0dW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xyXG5cdFx0dW5pZm9ybXMuc2VlZC52YWx1ZSA9IE1hdGgucmFuZG9tKCk7XHJcblx0XHR1bmlmb3Jtcy5hY3RpdmUudmFsdWUgPSB0cnVlO1xyXG5cclxuXHRcdGlmKGNvdW50ZXIgJSBicmVha1BvaW50ID09PSAwIHx8IG1vZGUgPT09IEdsaXRjaE1vZGUuQ09OU1RBTlRfV0lMRCkge1xyXG5cclxuXHRcdFx0dW5pZm9ybXMuYW1vdW50LnZhbHVlID0gTWF0aC5yYW5kb20oKSAvIDMwLjA7XHJcblx0XHRcdHVuaWZvcm1zLmFuZ2xlLnZhbHVlID0gcmFuZG9tRmxvYXQoLU1hdGguUEksIE1hdGguUEkpO1xyXG5cdFx0XHR1bmlmb3Jtcy5zZWVkWC52YWx1ZSA9IHJhbmRvbUZsb2F0KC0xLjAsIDEuMCk7XHJcblx0XHRcdHVuaWZvcm1zLnNlZWRZLnZhbHVlID0gcmFuZG9tRmxvYXQoLTEuMCwgMS4wKTtcclxuXHRcdFx0dW5pZm9ybXMuZGlzdG9ydGlvblgudmFsdWUgPSByYW5kb21GbG9hdCgwLjAsIDEuMCk7XHJcblx0XHRcdHVuaWZvcm1zLmRpc3RvcnRpb25ZLnZhbHVlID0gcmFuZG9tRmxvYXQoMC4wLCAxLjApO1xyXG5cclxuXHRcdFx0dGhpcy5icmVha1BvaW50ID0gcmFuZG9tSW50KDEyMCwgMjQwKTtcclxuXHRcdFx0dGhpcy5jb3VudGVyID0gMDtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0aWYoY291bnRlciAlIGJyZWFrUG9pbnQgPCBicmVha1BvaW50IC8gNSB8fCBtb2RlID09PSBHbGl0Y2hNb2RlLkNPTlNUQU5UX01JTEQpIHtcclxuXHJcblx0XHRcdFx0dW5pZm9ybXMuYW1vdW50LnZhbHVlID0gTWF0aC5yYW5kb20oKSAvIDkwLjA7XHJcblx0XHRcdFx0dW5pZm9ybXMuYW5nbGUudmFsdWUgPSByYW5kb21GbG9hdCgtTWF0aC5QSSwgTWF0aC5QSSk7XHJcblx0XHRcdFx0dW5pZm9ybXMuZGlzdG9ydGlvblgudmFsdWUgPSByYW5kb21GbG9hdCgwLjAsIDEuMCk7XHJcblx0XHRcdFx0dW5pZm9ybXMuZGlzdG9ydGlvblkudmFsdWUgPSByYW5kb21GbG9hdCgwLjAsIDEuMCk7XHJcblx0XHRcdFx0dW5pZm9ybXMuc2VlZFgudmFsdWUgPSByYW5kb21GbG9hdCgtMC4zLCAwLjMpO1xyXG5cdFx0XHRcdHVuaWZvcm1zLnNlZWRZLnZhbHVlID0gcmFuZG9tRmxvYXQoLTAuMywgMC4zKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdC8vIFNwb3JhZGljLlxyXG5cdFx0XHRcdHVuaWZvcm1zLmFjdGl2ZS52YWx1ZSA9IGZhbHNlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQrK3RoaXMuY291bnRlcjtcclxuXHJcblx0XHRyZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogb3V0cHV0QnVmZmVyKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgZ2xpdGNoIG1vZGUgZW51bWVyYXRpb24uXHJcbiAqXHJcbiAqIEB0eXBlIHtPYmplY3R9XHJcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBTUE9SQURJQyAtIFNwb3JhZGljIGdsaXRjaGVzLlxyXG4gKiBAcHJvcGVydHkge051bWJlcn0gQ09OU1RBTlRfTUlMRCAtIENvbnN0YW50IG1pbGQgZ2xpdGNoZXMuXHJcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBDT05TVEFOVF9XSUxEIC0gQ29uc3RhbnQgd2lsZCBnbGl0Y2hlcy5cclxuICovXHJcblxyXG5leHBvcnQgY29uc3QgR2xpdGNoTW9kZSA9IHtcclxuXHJcblx0U1BPUkFESUM6IDAsXHJcblx0Q09OU1RBTlRfTUlMRDogMSxcclxuXHRDT05TVEFOVF9XSUxEOiAyXHJcblxyXG59O1xyXG4iLCJpbXBvcnQgeyBDbGVhclBhc3MgfSBmcm9tIFwiLi9DbGVhclBhc3MuanNcIjtcclxuaW1wb3J0IHsgUGFzcyB9IGZyb20gXCIuL1Bhc3MuanNcIjtcclxuXHJcbi8qKlxyXG4gKiBBIHBhc3MgdGhhdCByZW5kZXJzIGEgZ2l2ZW4gc2NlbmUgZGlyZWN0bHkgb24gc2NyZWVuIG9yIGludG8gdGhlIHJlYWQgYnVmZmVyXHJcbiAqIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIFJlbmRlclBhc3MgZXh0ZW5kcyBQYXNzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyByZW5kZXIgcGFzcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lIHRvIHJlbmRlci5cclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0byB1c2UgdG8gcmVuZGVyIHRoZSBzY2VuZS5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gQWRkaXRpb25hbCBvcHRpb25zLlxyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx9IFtvcHRpb25zLm92ZXJyaWRlTWF0ZXJpYWw9bnVsbF0gLSBBbiBvdmVycmlkZSBtYXRlcmlhbCBmb3IgdGhlIHNjZW5lLlxyXG5cdCAqIEBwYXJhbSB7Q29sb3J9IFtvcHRpb25zLmNsZWFyQ29sb3I9bnVsbF0gLSBBbiBvdmVycmlkZSBjbGVhciBjb2xvci5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuY2xlYXJBbHBoYT0xLjBdIC0gQW4gb3ZlcnJpZGUgY2xlYXIgYWxwaGEuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5jbGVhckRlcHRoPWZhbHNlXSAtIFdoZXRoZXIgZGVwdGggc2hvdWxkIGJlIGNsZWFyZWQgZXhwbGljaXRseS5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmNsZWFyPXRydWVdIC0gV2hldGhlciBhbGwgYnVmZmVycyBzaG91bGQgYmUgY2xlYXJlZC5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3Ioc2NlbmUsIGNhbWVyYSwgb3B0aW9ucyA9IHt9KSB7XHJcblxyXG5cdFx0c3VwZXIoXCJSZW5kZXJQYXNzXCIsIHNjZW5lLCBjYW1lcmEsIG51bGwpO1xyXG5cclxuXHRcdHRoaXMubmVlZHNTd2FwID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGNsZWFyIHBhc3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NsZWFyUGFzc31cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuY2xlYXJQYXNzID0gbmV3IENsZWFyUGFzcyhvcHRpb25zKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIG92ZXJyaWRlIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtNYXRlcmlhbH1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMub3ZlcnJpZGVNYXRlcmlhbCA9IChvcHRpb25zLm92ZXJyaWRlTWF0ZXJpYWwgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLm92ZXJyaWRlTWF0ZXJpYWwgOiBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRlcHRoIGJ1ZmZlciBzaG91bGQgYmUgY2xlYXJlZCBleHBsaWNpdGx5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtCb29sZWFufVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5jbGVhckRlcHRoID0gKG9wdGlvbnMuY2xlYXJEZXB0aCAhPT0gdW5kZWZpbmVkKSA/IG9wdGlvbnMuY2xlYXJEZXB0aCA6IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbG9yLCBkZXB0aCBhbmQgc3RlbmNpbCBidWZmZXJzIHNob3VsZCBiZSBjbGVhcmVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEV2ZW4gd2l0aCBjbGVhciBzZXQgdG8gdHJ1ZSB5b3UgY2FuIHByZXZlbnQgc3BlY2lmaWMgYnVmZmVycyBmcm9tIGJlaW5nXHJcblx0XHQgKiBjbGVhcmVkIGJ5IHNldHRpbmcgZWl0aGVyIHRoZSBhdXRvQ2xlYXJDb2xvciwgYXV0b0NsZWFyU3RlbmNpbCBvclxyXG5cdFx0ICogYXV0b0NsZWFyRGVwdGggcHJvcGVydGllcyBvZiB0aGUgcmVuZGVyZXIgdG8gZmFsc2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLmNsZWFyID0gKG9wdGlvbnMuY2xlYXIgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLmNsZWFyIDogdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHRoZSBzY2VuZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcblx0ICovXHJcblxyXG5cdHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XHJcblxyXG5cdFx0Y29uc3Qgc2NlbmUgPSB0aGlzLnNjZW5lO1xyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0ID0gdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBpbnB1dEJ1ZmZlcjtcclxuXHRcdGNvbnN0IG92ZXJyaWRlTWF0ZXJpYWwgPSBzY2VuZS5vdmVycmlkZU1hdGVyaWFsO1xyXG5cclxuXHRcdGlmKHRoaXMuY2xlYXIpIHtcclxuXHJcblx0XHRcdHRoaXMuY2xlYXJQYXNzLnJlbmRlclRvU2NyZWVuID0gdGhpcy5yZW5kZXJUb1NjcmVlbjtcclxuXHRcdFx0dGhpcy5jbGVhclBhc3MucmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlcik7XHJcblxyXG5cdFx0fSBlbHNlIGlmKHRoaXMuY2xlYXJEZXB0aCkge1xyXG5cclxuXHRcdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KHJlbmRlclRhcmdldCk7XHJcblx0XHRcdHJlbmRlcmVyLmNsZWFyRGVwdGgoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c2NlbmUub3ZlcnJpZGVNYXRlcmlhbCA9IHRoaXMub3ZlcnJpZGVNYXRlcmlhbDtcclxuXHRcdHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgdGhpcy5jYW1lcmEsIHJlbmRlclRhcmdldCk7XHJcblx0XHRzY2VuZS5vdmVycmlkZU1hdGVyaWFsID0gb3ZlcnJpZGVNYXRlcmlhbDtcclxuXHJcblx0fVxyXG5cclxufVxyXG4iLCJpbXBvcnQge1xyXG5cdENvbG9yLFxyXG5cdExpbmVhckZpbHRlcixcclxuXHRNZXNoQmFzaWNNYXRlcmlhbCxcclxuXHRSR0JGb3JtYXQsXHJcblx0U2NlbmUsXHJcblx0VmVjdG9yMyxcclxuXHRXZWJHTFJlbmRlclRhcmdldFxyXG59IGZyb20gXCJ0aHJlZVwiO1xyXG5cclxuaW1wb3J0IHsgQ29tYmluZU1hdGVyaWFsLCBHb2RSYXlzTWF0ZXJpYWwsIEtlcm5lbFNpemUgfSBmcm9tIFwiLi4vbWF0ZXJpYWxzXCI7XHJcbmltcG9ydCB7IFJlbmRlclBhc3MgfSBmcm9tIFwiLi9SZW5kZXJQYXNzLmpzXCI7XHJcbmltcG9ydCB7IEJsdXJQYXNzIH0gZnJvbSBcIi4vQmx1clBhc3MuanNcIjtcclxuaW1wb3J0IHsgUGFzcyB9IGZyb20gXCIuL1Bhc3MuanNcIjtcclxuXHJcbi8qKlxyXG4gKiBDbGFtcHMgYSBnaXZlbiB2YWx1ZS5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNsYW1wLlxyXG4gKiBAcGFyYW0ge051bWJlcn0gbWluIC0gVGhlIGxvd2VzdCBwb3NzaWJsZSB2YWx1ZS5cclxuICogQHBhcmFtIHtOdW1iZXJ9IG1heCAtIFRoZSBoaWdoZXN0IHBvc3NpYmxlIHZhbHVlLlxyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IFRoZSBjbGFtcGVkIHZhbHVlLlxyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIGNsYW1wKHZhbHVlLCBtaW4sIG1heCkge1xyXG5cclxuXHRyZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihtYXgsIHZhbHVlKSk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQSBjcmVwdXNjdWxhciByYXlzIHBhc3MuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIEdvZFJheXNQYXNzIGV4dGVuZHMgUGFzcyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZ29kIHJheXMgcGFzcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIG1haW4gc2NlbmUuXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBtYWluIGNhbWVyYS5cclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBsaWdodFNvdXJjZSAtIFRoZSBtYWluIGxpZ2h0IHNvdXJjZS5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRlbnNpdHk9MC45Nl0gLSBUaGUgZGVuc2l0eSBvZiB0aGUgbGlnaHQgcmF5cy5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZGVjYXk9MC45M10gLSBBbiBpbGx1bWluYXRpb24gZGVjYXkgZmFjdG9yLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy53ZWlnaHQ9MC40XSAtIEEgbGlnaHQgcmF5IHdlaWdodCBmYWN0b3IuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmV4cG9zdXJlPTAuNl0gLSBBIGNvbnN0YW50IGF0dGVudWF0aW9uIGNvZWZmaWNpZW50LlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5jbGFtcE1heD0xLjBdIC0gQW4gdXBwZXIgYm91bmQgZm9yIHRoZSBzYXR1cmF0aW9uIG9mIHRoZSBvdmVyYWxsIGVmZmVjdC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuaW50ZW5zaXR5PTEuMF0gLSBBIGNvbnN0YW50IGZhY3RvciBmb3IgYWRkaXRpdmUgYmxlbmRpbmcuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnJlc29sdXRpb25TY2FsZT0wLjVdIC0gVGhlIHJlbmRlciB0ZXh0dXJlIHJlc29sdXRpb24gc2NhbGUsIHJlbGF0aXZlIHRvIHRoZSBzY3JlZW4gcmVuZGVyIHNpemUuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmtlcm5lbFNpemU9S2VybmVsU2l6ZS5MQVJHRV0gLSBUaGUgYmx1ciBrZXJuZWwgc2l6ZS5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuc2FtcGxlcz02MF0gLSBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIHBpeGVsLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5zY3JlZW5Nb2RlPXRydWVdIC0gV2hldGhlciB0aGUgc2NyZWVuIGJsZW5kIG1vZGUgc2hvdWxkIGJlIHVzZWQgZm9yIGNvbWJpbmluZyB0aGUgZ29kIHJheXMgdGV4dHVyZSB3aXRoIHRoZSBzY2VuZSBjb2xvcnMuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKHNjZW5lLCBjYW1lcmEsIGxpZ2h0U291cmNlLCBvcHRpb25zID0ge30pIHtcclxuXHJcblx0XHRzdXBlcihcIkdvZFJheXNQYXNzXCIpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBzY2VuZSB0aGF0IG9ubHkgY29udGFpbnMgdGhlIGxpZ2h0IHNvdXJjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7U2NlbmV9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5saWdodFNjZW5lID0gbmV3IFNjZW5lKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbWFpbiBzY2VuZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7U2NlbmV9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5tYWluU2NlbmUgPSBzY2VuZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBtYWluIGNhbWVyYS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q2FtZXJhfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMubWFpbkNhbWVyYSA9IGNhbWVyYTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVuZGVyIHRhcmdldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRYID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KDEsIDEsIHtcclxuXHRcdFx0bWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXHJcblx0XHRcdG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyLFxyXG5cdFx0XHRzdGVuY2lsQnVmZmVyOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhCdWZmZXI6IGZhbHNlXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldFgudGV4dHVyZS5uYW1lID0gXCJHb2RSYXlzLlRhcmdldFhcIjtcclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0WC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBzZWNvbmQgcmVuZGVyIHRhcmdldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRZID0gdGhpcy5yZW5kZXJUYXJnZXRYLmNsb25lKCk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRZLnRleHR1cmUubmFtZSA9IFwiR29kUmF5cy5UYXJnZXRZXCI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlbmRlciB0YXJnZXQgZm9yIHRoZSBtYXNrZWQgbGlnaHQgc2NlbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0TWFzayA9IG5ldyBXZWJHTFJlbmRlclRhcmdldCgxLCAxLCB7XHJcblx0XHRcdG1pbkZpbHRlcjogTGluZWFyRmlsdGVyLFxyXG5cdFx0XHRtYWdGaWx0ZXI6IExpbmVhckZpbHRlclxyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRNYXNrLnRleHR1cmUubmFtZSA9IFwiR29kUmF5cy5NYXNrXCI7XHJcblx0XHR0aGlzLnJlbmRlclRhcmdldE1hc2sudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcGFzcyB0aGF0IG9ubHkgcmVuZGVycyB0aGUgbGlnaHQgc291cmNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtSZW5kZXJQYXNzfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucmVuZGVyUGFzc0xpZ2h0ID0gbmV3IFJlbmRlclBhc3ModGhpcy5saWdodFNjZW5lLCB0aGlzLm1haW5DYW1lcmEsIHtcclxuXHRcdFx0Y2xlYXJDb2xvcjogbmV3IENvbG9yKDB4MDAwMDAwKVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHBhc3MgdGhhdCByZW5kZXJzIHRoZSBtYXNrZWQgc2NlbmUgb3ZlciB0aGUgbGlnaHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1JlbmRlclBhc3N9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZW5kZXJQYXNzTWFzayA9IG5ldyBSZW5kZXJQYXNzKHRoaXMubWFpblNjZW5lLCB0aGlzLm1haW5DYW1lcmEsIHtcclxuXHRcdFx0b3ZlcnJpZGVNYXRlcmlhbDogbmV3IE1lc2hCYXNpY01hdGVyaWFsKHsgY29sb3I6IDB4MDAwMDAwIH0pXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnJlbmRlclBhc3NNYXNrLmNsZWFyID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGJsdXIgcGFzcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Qmx1clBhc3N9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5ibHVyUGFzcyA9IG5ldyBCbHVyUGFzcyhvcHRpb25zKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsaWdodCBzb3VyY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDNEfVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5saWdodFNvdXJjZSA9IGxpZ2h0U291cmNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxpZ2h0IHBvc2l0aW9uIGluIHNjcmVlbiBzcGFjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yM31cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnNjcmVlblBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgZ29kIHJheXMgc2hhZGVyIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtHb2RSYXlzTWF0ZXJpYWx9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5nb2RSYXlzTWF0ZXJpYWwgPSBuZXcgR29kUmF5c01hdGVyaWFsKG9wdGlvbnMpO1xyXG5cdFx0dGhpcy5nb2RSYXlzTWF0ZXJpYWwudW5pZm9ybXMubGlnaHRQb3NpdGlvbi52YWx1ZSA9IHRoaXMuc2NyZWVuUG9zaXRpb247XHJcblxyXG5cdFx0dGhpcy5zYW1wbGVzID0gb3B0aW9ucy5zYW1wbGVzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBjb21iaW5lIHNoYWRlciBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29tYmluZU1hdGVyaWFsfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuY29tYmluZU1hdGVyaWFsID0gbmV3IENvbWJpbmVNYXRlcmlhbCgob3B0aW9ucy5zY3JlZW5Nb2RlICE9PSB1bmRlZmluZWQpID8gb3B0aW9ucy5zY3JlZW5Nb2RlIDogdHJ1ZSk7XHJcblxyXG5cdFx0dGhpcy5pbnRlbnNpdHkgPSBvcHRpb25zLmludGVuc2l0eTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgcmVzb2x1dGlvbiBzY2FsZS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0ICovXHJcblxyXG5cdGdldCByZXNvbHV0aW9uU2NhbGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYmx1clBhc3MucmVzb2x1dGlvblNjYWxlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFlvdSBuZWVkIHRvIGNhbGwge0BsaW5rIEVmZmVjdENvbXBvc2VyI3NldFNpemV9IGFmdGVyIGNoYW5naW5nIHRoaXMgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdCAqL1xyXG5cclxuXHRzZXQgcmVzb2x1dGlvblNjYWxlKHZhbHVlID0gMC41KSB7XHJcblxyXG5cdFx0dGhpcy5ibHVyUGFzcy5yZXNvbHV0aW9uU2NhbGUgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgYmx1ciBrZXJuZWwgc2l6ZS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtLZXJuZWxTaXplfVxyXG5cdCAqL1xyXG5cclxuXHRnZXQga2VybmVsU2l6ZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ibHVyUGFzcy5rZXJuZWxTaXplO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEB0eXBlIHtLZXJuZWxTaXplfVxyXG5cdCAqL1xyXG5cclxuXHRzZXQga2VybmVsU2l6ZSh2YWx1ZSA9IEtlcm5lbFNpemUuTEFSR0UpIHtcclxuXHJcblx0XHR0aGlzLmJsdXJQYXNzLmtlcm5lbFNpemUgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgb3ZlcmFsbCBpbnRlbnNpdHkgb2YgdGhlIGVmZmVjdC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0ICovXHJcblxyXG5cdGdldCBpbnRlbnNpdHkoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuY29tYmluZU1hdGVyaWFsLnVuaWZvcm1zLm9wYWNpdHkyLnZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0ICovXHJcblxyXG5cdHNldCBpbnRlbnNpdHkodmFsdWUgPSAxLjApIHtcclxuXHJcblx0XHR0aGlzLmNvbWJpbmVNYXRlcmlhbC51bmlmb3Jtcy5vcGFjaXR5Mi52YWx1ZSA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgcGl4ZWwuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgc2FtcGxlcygpIHtcclxuXHJcblx0XHRyZXR1cm4gTnVtYmVyLnBhcnNlSW50KHRoaXMuZ29kUmF5c01hdGVyaWFsLmRlZmluZXMuTlVNX1NBTVBMRVNfSU5UKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIHZhbHVlIG11c3QgYmUgY2FyZWZ1bGx5IGNob3Nlbi4gQSBoaWdoZXIgdmFsdWUgZGlyZWN0bHkgaW5jcmVhc2VzIHRoZVxyXG5cdCAqIEdQVSBsb2FkLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge051bWJlcn1cclxuXHQgKi9cclxuXHJcblx0c2V0IHNhbXBsZXModmFsdWUgPSA2MCkge1xyXG5cclxuXHRcdHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSk7XHJcblxyXG5cdFx0dGhpcy5nb2RSYXlzTWF0ZXJpYWwuZGVmaW5lcy5OVU1fU0FNUExFU19GTE9BVCA9IHZhbHVlLnRvRml4ZWQoMSk7XHJcblx0XHR0aGlzLmdvZFJheXNNYXRlcmlhbC5kZWZpbmVzLk5VTV9TQU1QTEVTX0lOVCA9IHZhbHVlLnRvRml4ZWQoMCk7XHJcblx0XHR0aGlzLmdvZFJheXNNYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgZGl0aGVyaW5nIGlzIGVuYWJsZWQuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHQgKi9cclxuXHJcblx0Z2V0IGRpdGhlcmluZygpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nb2RSYXlzTWF0ZXJpYWwuZGl0aGVyaW5nO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIGVuYWJsZWQsIHRoZSByZXN1bHQgd2lsbCBiZSBkaXRoZXJlZCB0byByZW1vdmUgYmFuZGluZyBhcnRpZmFjdHMuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHQgKi9cclxuXHJcblx0c2V0IGRpdGhlcmluZyh2YWx1ZSkge1xyXG5cclxuXHRcdGlmKHRoaXMuZGl0aGVyaW5nICE9PSB2YWx1ZSkge1xyXG5cclxuXHRcdFx0dGhpcy5nb2RSYXlzTWF0ZXJpYWwuZGl0aGVyaW5nID0gdmFsdWU7XHJcblx0XHRcdHRoaXMuZ29kUmF5c01hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVmZmVjdCBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgaW5wdXQgYnVmZmVyLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0ICovXHJcblxyXG5cdGdldCBibGVuZCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5uZWVkc1N3YXA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSWYgZGlzYWJsZWQsIHRoZSBpbnB1dCBidWZmZXIgd2lsbCByZW1haW4gdW5hZmZlY3RlZC5cclxuXHQgKlxyXG5cdCAqIFlvdSBtYXkgdXNlIHRoZSB7QGxpbmsgQmxvb21QYXNzI292ZXJsYXl9IHRleHR1cmUgdG8gYXBwbHkgdGhlIGVmZmVjdCB0b1xyXG5cdCAqIHlvdXIgc2NlbmUuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHQgKi9cclxuXHJcblx0c2V0IGJsZW5kKHZhbHVlKSB7XHJcblxyXG5cdFx0dGhpcy5uZWVkc1N3YXAgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgZWZmZWN0IG92ZXJsYXkgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtUZXh0dXJlfVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgb3ZlcmxheSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5yZW5kZXJUYXJnZXRZLnRleHR1cmU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuXHQgKi9cclxuXHJcblx0cmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcclxuXHJcblx0XHRjb25zdCBzY2VuZSA9IHRoaXMuc2NlbmU7XHJcblx0XHRjb25zdCBjYW1lcmEgPSB0aGlzLmNhbWVyYTtcclxuXHRcdGNvbnN0IG1haW5TY2VuZSA9IHRoaXMubWFpblNjZW5lO1xyXG5cclxuXHRcdGNvbnN0IGxpZ2h0U291cmNlID0gdGhpcy5saWdodFNvdXJjZTtcclxuXHRcdGNvbnN0IHNjcmVlblBvc2l0aW9uID0gdGhpcy5zY3JlZW5Qb3NpdGlvbjtcclxuXHJcblx0XHRjb25zdCBnb2RSYXlzTWF0ZXJpYWwgPSB0aGlzLmdvZFJheXNNYXRlcmlhbDtcclxuXHRcdGNvbnN0IGNvbWJpbmVNYXRlcmlhbCA9IHRoaXMuY29tYmluZU1hdGVyaWFsO1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlclRhcmdldE1hc2sgPSB0aGlzLnJlbmRlclRhcmdldE1hc2s7XHJcblx0XHRjb25zdCByZW5kZXJUYXJnZXRYID0gdGhpcy5yZW5kZXJUYXJnZXRYO1xyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0WSA9IHRoaXMucmVuZGVyVGFyZ2V0WTtcclxuXHJcblx0XHRsZXQgYmFja2dyb3VuZCwgcGFyZW50O1xyXG5cclxuXHRcdC8vIENvbXB1dGUgdGhlIHNjcmVlbiBsaWdodCBwb3NpdGlvbiBhbmQgdHJhbnNsYXRlIGl0IHRvIFswLjAsIDEuMF0uXHJcblx0XHRzY3JlZW5Qb3NpdGlvbi5jb3B5KGxpZ2h0U291cmNlLnBvc2l0aW9uKS5wcm9qZWN0KHRoaXMubWFpbkNhbWVyYSk7XHJcblx0XHRzY3JlZW5Qb3NpdGlvbi54ID0gY2xhbXAoKHNjcmVlblBvc2l0aW9uLnggKyAxLjApICogMC41LCAwLjAsIDEuMCk7XHJcblx0XHRzY3JlZW5Qb3NpdGlvbi55ID0gY2xhbXAoKHNjcmVlblBvc2l0aW9uLnkgKyAxLjApICogMC41LCAwLjAsIDEuMCk7XHJcblxyXG5cdFx0cGFyZW50ID0gbGlnaHRTb3VyY2UucGFyZW50O1xyXG5cdFx0YmFja2dyb3VuZCA9IG1haW5TY2VuZS5iYWNrZ3JvdW5kO1xyXG5cdFx0bWFpblNjZW5lLmJhY2tncm91bmQgPSBudWxsO1xyXG5cdFx0dGhpcy5saWdodFNjZW5lLmFkZChsaWdodFNvdXJjZSk7XHJcblxyXG5cdFx0LyogRmlyc3QsIHJlbmRlciB0aGUgbGlnaHQgc291cmNlLiBUaGVuIHJlbmRlciB0aGUgc2NlbmUgaW50byB0aGUgc2FtZVxyXG5cdFx0YnVmZmVyIHVzaW5nIGEgbWFzayBvdmVycmlkZSBtYXRlcmlhbCB3aXRoIGRlcHRoIHRlc3QgZW5hYmxlZC4gKi9cclxuXHRcdHRoaXMucmVuZGVyUGFzc0xpZ2h0LnJlbmRlcihyZW5kZXJlciwgcmVuZGVyVGFyZ2V0TWFzayk7XHJcblx0XHR0aGlzLnJlbmRlclBhc3NNYXNrLnJlbmRlcihyZW5kZXJlciwgcmVuZGVyVGFyZ2V0TWFzayk7XHJcblxyXG5cdFx0aWYocGFyZW50ICE9PSBudWxsKSB7XHJcblxyXG5cdFx0XHRwYXJlbnQuYWRkKGxpZ2h0U291cmNlKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bWFpblNjZW5lLmJhY2tncm91bmQgPSBiYWNrZ3JvdW5kO1xyXG5cclxuXHRcdC8vIEJsdXIgdGhlIG1hc2tlZCBzY2VuZSB0byByZWR1Y2UgYXJ0aWZhY3RzLlxyXG5cdFx0dGhpcy5ibHVyUGFzcy5yZW5kZXIocmVuZGVyZXIsIHRoaXMucmVuZGVyVGFyZ2V0TWFzaywgcmVuZGVyVGFyZ2V0WCk7XHJcblxyXG5cdFx0Ly8gQmx1ciB0aGUgbWFza2VkIHNjZW5lIGFsb25nIHJhZGlhbCBsaW5lcyB0b3dhcmRzIHRoZSBsaWdodCBzb3VyY2UuXHJcblx0XHR0aGlzLm1hdGVyaWFsID0gZ29kUmF5c01hdGVyaWFsO1xyXG5cdFx0Z29kUmF5c01hdGVyaWFsLnVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gcmVuZGVyVGFyZ2V0WC50ZXh0dXJlO1xyXG5cdFx0cmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldFkpO1xyXG5cclxuXHRcdGlmKHRoaXMuYmxlbmQpIHtcclxuXHJcblx0XHRcdC8vIENvbWJpbmUgdGhlIGdvZCByYXlzIHdpdGggdGhlIHNjZW5lIGNvbG9ycy5cclxuXHRcdFx0dGhpcy5tYXRlcmlhbCA9IGNvbWJpbmVNYXRlcmlhbDtcclxuXHRcdFx0Y29tYmluZU1hdGVyaWFsLnVuaWZvcm1zLnRleHR1cmUxLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcclxuXHRcdFx0Y29tYmluZU1hdGVyaWFsLnVuaWZvcm1zLnRleHR1cmUyLnZhbHVlID0gcmVuZGVyVGFyZ2V0WS50ZXh0dXJlO1xyXG5cclxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogb3V0cHV0QnVmZmVyKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgc2l6ZSBvZiB0aGlzIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgd2lkdGguXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcblx0ICovXHJcblxyXG5cdHNldFNpemUod2lkdGgsIGhlaWdodCkge1xyXG5cclxuXHRcdHRoaXMucmVuZGVyUGFzc0xpZ2h0LnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblx0XHR0aGlzLnJlbmRlclBhc3NNYXNrLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblx0XHR0aGlzLmJsdXJQYXNzLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblxyXG5cdFx0d2lkdGggPSB0aGlzLmJsdXJQYXNzLndpZHRoO1xyXG5cdFx0aGVpZ2h0ID0gdGhpcy5ibHVyUGFzcy5oZWlnaHQ7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRNYXNrLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblx0XHR0aGlzLnJlbmRlclRhcmdldFguc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0WS5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIHRhc2tzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGFscGhhIC0gV2hldGhlciB0aGUgcmVuZGVyZXIgdXNlcyB0aGUgYWxwaGEgY2hhbm5lbCBvciBub3QuXHJcblx0ICovXHJcblxyXG5cdGluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKSB7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJQYXNzTGlnaHQuaW5pdGlhbGl6ZShyZW5kZXJlciwgYWxwaGEpO1xyXG5cdFx0dGhpcy5yZW5kZXJQYXNzTWFzay5pbml0aWFsaXplKHJlbmRlcmVyLCBhbHBoYSk7XHJcblx0XHR0aGlzLmJsdXJQYXNzLmluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKTtcclxuXHJcblx0XHRpZighYWxwaGEpIHtcclxuXHJcblx0XHRcdHRoaXMucmVuZGVyVGFyZ2V0TWFzay50ZXh0dXJlLmZvcm1hdCA9IFJHQkZvcm1hdDtcclxuXHRcdFx0dGhpcy5yZW5kZXJUYXJnZXRYLnRleHR1cmUuZm9ybWF0ID0gUkdCRm9ybWF0O1xyXG5cdFx0XHR0aGlzLnJlbmRlclRhcmdldFkudGV4dHVyZS5mb3JtYXQgPSBSR0JGb3JtYXQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFBhc3MgfSBmcm9tIFwiLi9QYXNzLmpzXCI7XHJcblxyXG4vKipcclxuICogQSBtYXNrIHBhc3MuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIE1hc2tQYXNzIGV4dGVuZHMgUGFzcyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbWFzayBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBUaGUgc2NlbmUgdG8gcmVuZGVyLlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRvIHVzZS5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3Ioc2NlbmUsIGNhbWVyYSkge1xyXG5cclxuXHRcdHN1cGVyKFwiTWFza1Bhc3NcIiwgc2NlbmUsIGNhbWVyYSwgbnVsbCk7XHJcblxyXG5cdFx0dGhpcy5uZWVkc1N3YXAgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEludmVyc2UgZmxhZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuaW52ZXJzZSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU3RlbmNpbCBidWZmZXIgY2xlYXIgZmxhZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuY2xlYXJTdGVuY2lsID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdGNvbnN0IGNvbnRleHQgPSByZW5kZXJlci5jb250ZXh0O1xyXG5cdFx0Y29uc3Qgc3RhdGUgPSByZW5kZXJlci5zdGF0ZTtcclxuXHJcblx0XHRjb25zdCBzY2VuZSA9IHRoaXMuc2NlbmU7XHJcblx0XHRjb25zdCBjYW1lcmEgPSB0aGlzLmNhbWVyYTtcclxuXHJcblx0XHRjb25zdCB3cml0ZVZhbHVlID0gdGhpcy5pbnZlcnNlID8gMCA6IDE7XHJcblx0XHRjb25zdCBjbGVhclZhbHVlID0gMSAtIHdyaXRlVmFsdWU7XHJcblxyXG5cdFx0Ly8gRG9uJ3QgdXBkYXRlIGNvbG9yIG9yIGRlcHRoLlxyXG5cdFx0c3RhdGUuYnVmZmVycy5jb2xvci5zZXRNYXNrKGZhbHNlKTtcclxuXHRcdHN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0TWFzayhmYWxzZSk7XHJcblxyXG5cdFx0Ly8gTG9jayB0aGUgYnVmZmVycy5cclxuXHRcdHN0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0TG9ja2VkKHRydWUpO1xyXG5cdFx0c3RhdGUuYnVmZmVycy5kZXB0aC5zZXRMb2NrZWQodHJ1ZSk7XHJcblxyXG5cdFx0Ly8gQ29uZmlndXJlIHRoZSBzdGVuY2lsLlxyXG5cdFx0c3RhdGUuYnVmZmVycy5zdGVuY2lsLnNldFRlc3QodHJ1ZSk7XHJcblx0XHRzdGF0ZS5idWZmZXJzLnN0ZW5jaWwuc2V0T3AoY29udGV4dC5SRVBMQUNFLCBjb250ZXh0LlJFUExBQ0UsIGNvbnRleHQuUkVQTEFDRSk7XHJcblx0XHRzdGF0ZS5idWZmZXJzLnN0ZW5jaWwuc2V0RnVuYyhjb250ZXh0LkFMV0FZUywgd3JpdGVWYWx1ZSwgMHhmZmZmZmZmZik7XHJcblx0XHRzdGF0ZS5idWZmZXJzLnN0ZW5jaWwuc2V0Q2xlYXIoY2xlYXJWYWx1ZSk7XHJcblxyXG5cdFx0Ly8gQ2xlYXIgdGhlIHN0ZW5jaWwuXHJcblx0XHRpZih0aGlzLmNsZWFyU3RlbmNpbCkge1xyXG5cclxuXHRcdFx0aWYodGhpcy5yZW5kZXJUb1NjcmVlbikge1xyXG5cclxuXHRcdFx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQobnVsbCk7XHJcblx0XHRcdFx0cmVuZGVyZXIuY2xlYXJTdGVuY2lsKCk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoaW5wdXRCdWZmZXIpO1xyXG5cdFx0XHRcdHJlbmRlcmVyLmNsZWFyU3RlbmNpbCgpO1xyXG5cclxuXHRcdFx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQob3V0cHV0QnVmZmVyKTtcclxuXHRcdFx0XHRyZW5kZXJlci5jbGVhclN0ZW5jaWwoKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gRHJhdyB0aGUgbWFzay5cclxuXHRcdGlmKHRoaXMucmVuZGVyVG9TY3JlZW4pIHtcclxuXHJcblx0XHRcdHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhLCBudWxsKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIGlucHV0QnVmZmVyKTtcclxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIG91dHB1dEJ1ZmZlcik7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFVubG9jayB0aGUgYnVmZmVycy5cclxuXHRcdHN0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0TG9ja2VkKGZhbHNlKTtcclxuXHRcdHN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0TG9ja2VkKGZhbHNlKTtcclxuXHJcblx0XHQvLyBPbmx5IHJlbmRlciB3aGVyZSB0aGUgc3RlbmNpbCBpcyBzZXQgdG8gMS5cclxuXHRcdHN0YXRlLmJ1ZmZlcnMuc3RlbmNpbC5zZXRGdW5jKGNvbnRleHQuRVFVQUwsIDEsIDB4ZmZmZmZmZmYpO1xyXG5cdFx0c3RhdGUuYnVmZmVycy5zdGVuY2lsLnNldE9wKGNvbnRleHQuS0VFUCwgY29udGV4dC5LRUVQLCBjb250ZXh0LktFRVApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFBhc3MgfSBmcm9tIFwiLi9QYXNzLmpzXCI7XHJcblxyXG4vKipcclxuICogQSBzaGFkZXIgcGFzcy5cclxuICpcclxuICogVXNlZCB0byByZW5kZXIgYW55IHNoYWRlciBtYXRlcmlhbCBhcyBhIDJEIGZpbHRlci5cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgU2hhZGVyUGFzcyBleHRlbmRzIFBhc3Mge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNoYWRlciBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTaGFkZXJNYXRlcmlhbH0gbWF0ZXJpYWwgLSBUaGUgc2hhZGVyIG1hdGVyaWFsIHRvIHVzZS5cclxuXHQgKiBAcGFyYW0ge1N0cmluZ30gW3RleHR1cmVJRD1cInREaWZmdXNlXCJdIC0gVGhlIHRleHR1cmUgdW5pZm9ybSBpZGVudGlmaWVyLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcihtYXRlcmlhbCwgdGV4dHVyZUlEID0gXCJ0RGlmZnVzZVwiKSB7XHJcblxyXG5cdFx0c3VwZXIoXCJTaGFkZXJQYXNzXCIpO1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYW1lIG9mIHRoZSBjb2xvciBzYW1wbGVyIHVuaWZvcm0gb2YgdGhlIGdpdmVuIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtTdHJpbmd9XHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnRleHR1cmVJRCA9IHRleHR1cmVJRDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdGlmKHRoaXMubWF0ZXJpYWwudW5pZm9ybXNbdGhpcy50ZXh0dXJlSURdICE9PSB1bmRlZmluZWQpIHtcclxuXHJcblx0XHRcdHRoaXMubWF0ZXJpYWwudW5pZm9ybXNbdGhpcy50ZXh0dXJlSURdLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IG91dHB1dEJ1ZmZlcik7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHtcclxuXHRDb2xvcixcclxuXHRMaW5lYXJGaWx0ZXIsXHJcblx0TWVzaERlcHRoTWF0ZXJpYWwsXHJcblx0UkdCQURlcHRoUGFja2luZyxcclxuXHRSR0JGb3JtYXQsXHJcblx0V2ViR0xSZW5kZXJUYXJnZXRcclxufSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmltcG9ydCB7XHJcblx0Q29weU1hdGVyaWFsLFxyXG5cdERlcHRoQ29tcGFyaXNvbk1hdGVyaWFsLFxyXG5cdE91dGxpbmVCbGVuZE1hdGVyaWFsLFxyXG5cdE91dGxpbmVFZGdlc01hdGVyaWFsLFxyXG5cdEtlcm5lbFNpemVcclxufSBmcm9tIFwiLi4vbWF0ZXJpYWxzXCI7XHJcblxyXG5pbXBvcnQgeyBCbHVyUGFzcyB9IGZyb20gXCIuL0JsdXJQYXNzLmpzXCI7XHJcbmltcG9ydCB7IFBhc3MgfSBmcm9tIFwiLi9QYXNzLmpzXCI7XHJcbmltcG9ydCB7IFJlbmRlclBhc3MgfSBmcm9tIFwiLi9SZW5kZXJQYXNzLmpzXCI7XHJcbmltcG9ydCB7IFNoYWRlclBhc3MgfSBmcm9tIFwiLi9TaGFkZXJQYXNzLmpzXCI7XHJcblxyXG4vKipcclxuICogQW4gb3V0bGluZSBwYXNzLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBPdXRsaW5lUGFzcyBleHRlbmRzIFBhc3Mge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG91dGxpbmUgcGFzcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIG1haW4gc2NlbmUuXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBtYWluIGNhbWVyYS5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gQWRkaXRpb25hbCBwYXJhbWV0ZXJzLiBTZWUge0BsaW5rIEJsdXJQYXNzfSwge0BsaW5rIE91dGxpbmVCbGVuZE1hdGVyaWFsfSBhbmQge0BsaW5rIE91dGxpbmVFZGdlc01hdGVyaWFsfSBmb3IgZGV0YWlscy5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMucHVsc2VTcGVlZD0wLjBdIC0gVGhlIHB1bHNlIHNwZWVkLiBBIHZhbHVlIG9mIHplcm8gZGlzYWJsZXMgdGhlIHB1bHNlIGVmZmVjdC5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmJsdXI9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBvdXRsaW5lIHNob3VsZCBiZSBibHVycmVkLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcihzY2VuZSwgY2FtZXJhLCBvcHRpb25zID0ge30pIHtcclxuXHJcblx0XHRzdXBlcihcIk91dGxpbmVQYXNzXCIpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG1haW4gc2NlbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1NjZW5lfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMubWFpblNjZW5lID0gc2NlbmU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbWFpbiBjYW1lcmEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NhbWVyYX1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLm1haW5DYW1lcmEgPSBjYW1lcmE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlbmRlciB0YXJnZXQgZm9yIGRlcHRoIGluZm9ybWF0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldERlcHRoID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KDEsIDEsIHtcclxuXHRcdFx0bWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXHJcblx0XHRcdG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldERlcHRoLnRleHR1cmUubmFtZSA9IFwiT3V0bGluZS5EZXB0aFwiO1xyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXREZXB0aC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZW5kZXIgdGFyZ2V0IGZvciB0aGUgb3V0bGluZSBtYXNrLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldE1hc2sgPSB0aGlzLnJlbmRlclRhcmdldERlcHRoLmNsb25lKCk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRNYXNrLnRleHR1cmUuZm9ybWF0ID0gUkdCRm9ybWF0O1xyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRNYXNrLnRleHR1cmUubmFtZSA9IFwiT3V0bGluZS5NYXNrXCI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlbmRlciB0YXJnZXQgZm9yIHRoZSBlZGdlIGRldGVjdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRFZGdlcyA9IG5ldyBXZWJHTFJlbmRlclRhcmdldCgxLCAxLCB7XHJcblx0XHRcdG1pbkZpbHRlcjogTGluZWFyRmlsdGVyLFxyXG5cdFx0XHRtYWdGaWx0ZXI6IExpbmVhckZpbHRlcixcclxuXHRcdFx0c3RlbmNpbEJ1ZmZlcjogZmFsc2UsXHJcblx0XHRcdGRlcHRoQnVmZmVyOiBmYWxzZSxcclxuXHRcdFx0Zm9ybWF0OiBSR0JGb3JtYXRcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0RWRnZXMudGV4dHVyZS5uYW1lID0gXCJPdXRsaW5lLkVkZ2VzXCI7XHJcblx0XHR0aGlzLnJlbmRlclRhcmdldEVkZ2VzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlbmRlciB0YXJnZXQgZm9yIHRoZSBibHVycmVkIG91dGxpbmUgb3ZlcmxheS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRCbHVycmVkRWRnZXMgPSB0aGlzLnJlbmRlclRhcmdldEVkZ2VzLmNsb25lKCk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRCbHVycmVkRWRnZXMudGV4dHVyZS5uYW1lID0gXCJPdXRsaW5lLkJsdXJyZWRFZGdlc1wiO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBkZXB0aCBwYXNzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtSZW5kZXJQYXNzfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucmVuZGVyUGFzc0RlcHRoID0gbmV3IFJlbmRlclBhc3ModGhpcy5tYWluU2NlbmUsIHRoaXMubWFpbkNhbWVyYSwge1xyXG5cdFx0XHRvdmVycmlkZU1hdGVyaWFsOiBuZXcgTWVzaERlcHRoTWF0ZXJpYWwoe1xyXG5cdFx0XHRcdGRlcHRoUGFja2luZzogUkdCQURlcHRoUGFja2luZyxcclxuXHRcdFx0XHRtb3JwaFRhcmdldHM6IHRydWUsXHJcblx0XHRcdFx0c2tpbm5pbmc6IHRydWVcclxuXHRcdFx0fSksXHJcblx0XHRcdGNsZWFyQ29sb3I6IG5ldyBDb2xvcigweGZmZmZmZiksXHJcblx0XHRcdGNsZWFyQWxwaGE6IDEuMFxyXG5cdFx0fSk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGRlcHRoIGNvbXBhcmlzb24gbWFzayBwYXNzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtSZW5kZXJQYXNzfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucmVuZGVyUGFzc01hc2sgPSBuZXcgUmVuZGVyUGFzcyh0aGlzLm1haW5TY2VuZSwgdGhpcy5tYWluQ2FtZXJhLCB7XHJcblx0XHRcdG92ZXJyaWRlTWF0ZXJpYWw6IG5ldyBEZXB0aENvbXBhcmlzb25NYXRlcmlhbCh0aGlzLnJlbmRlclRhcmdldERlcHRoLnRleHR1cmUsIHRoaXMubWFpbkNhbWVyYSksXHJcblx0XHRcdGNsZWFyQ29sb3I6IG5ldyBDb2xvcigweGZmZmZmZiksXHJcblx0XHRcdGNsZWFyQWxwaGE6IDEuMFxyXG5cdFx0fSk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGJsdXIgcGFzcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Qmx1clBhc3N9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5ibHVyUGFzcyA9IG5ldyBCbHVyUGFzcyhvcHRpb25zKTtcclxuXHJcblx0XHR0aGlzLmtlcm5lbFNpemUgPSBvcHRpb25zLmtlcm5lbFNpemU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGNvcHkgcGFzcyB0aGF0IHJlbmRlcnMgdGhlIHJlYWQgYnVmZmVyIHRvIHNjcmVlbiBpZiBuZWVkZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1NoYWRlclBhc3N9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5jb3B5UGFzcyA9IG5ldyBTaGFkZXJQYXNzKG5ldyBDb3B5TWF0ZXJpYWwoKSk7XHJcblx0XHR0aGlzLmNvcHlQYXNzLnJlbmRlclRvU2NyZWVuID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIG91dGxpbmUgZWRnZSBkZXRlY3Rpb24gbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge091dGxpbmVFZGdlc01hdGVyaWFsfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMub3V0bGluZUVkZ2VzTWF0ZXJpYWwgPSBuZXcgT3V0bGluZUVkZ2VzTWF0ZXJpYWwob3B0aW9ucyk7XHJcblx0XHR0aGlzLm91dGxpbmVFZGdlc01hdGVyaWFsLnVuaWZvcm1zLnRNYXNrLnZhbHVlID0gdGhpcy5yZW5kZXJUYXJnZXRNYXNrLnRleHR1cmU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBvdXRsaW5lIGJsZW5kIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPdXRsaW5lQmxlbmRNYXRlcmlhbH1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLm91dGxpbmVCbGVuZE1hdGVyaWFsID0gbmV3IE91dGxpbmVCbGVuZE1hdGVyaWFsKG9wdGlvbnMpO1xyXG5cdFx0dGhpcy5vdXRsaW5lQmxlbmRNYXRlcmlhbC51bmlmb3Jtcy50TWFzay52YWx1ZSA9IHRoaXMucmVuZGVyVGFyZ2V0TWFzay50ZXh0dXJlO1xyXG5cclxuXHRcdHRoaXMuYmx1ciA9IChvcHRpb25zLmJsdXIgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLmJsdXIgOiB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBsaXN0IG9mIG9iamVjdHMgdG8gb3V0bGluZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0M0RbXX1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnNlbGVjdGlvbiA9IFtdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGN1cnJlbnQgYW5pbWF0aW9uIHRpbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge051bWJlcn1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnRpbWUgPSAwLjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcHVsc2Ugc3BlZWQuIEEgdmFsdWUgb2YgemVybyBkaXNhYmxlcyB0aGUgcHVsc2UgZWZmZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnB1bHNlU3BlZWQgPSAob3B0aW9ucy5wdWxzZVNwZWVkICE9PSB1bmRlZmluZWQpID8gb3B0aW9ucy5wdWxzZVNwZWVkIDogMC4wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBkZWRpY2F0ZWQgcmVuZGVyIGxheWVyIGZvciBzZWxlY3RlZCBvYmplY3RzLlxyXG5cdFx0ICpcclxuXHRcdCAqIFRoaXMgbGF5ZXIgaXMgc2V0IHRvIDEwIGJ5IGRlZmF1bHQuIElmIHRoaXMgY29sbGlkZXMgd2l0aCB5b3VyIG93biBjdXN0b21cclxuXHRcdCAqIGxheWVycywgcGxlYXNlIGNoYW5nZSBpdCB0byBhIGZyZWUgbGF5ZXIgYmVmb3JlIHJlbmRlcmluZyFcclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5zZWxlY3Rpb25MYXllciA9IDEwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSByZXNvbHV0aW9uIHNjYWxlLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge051bWJlcn1cclxuXHQgKi9cclxuXHJcblx0Z2V0IHJlc29sdXRpb25TY2FsZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ibHVyUGFzcy5yZXNvbHV0aW9uU2NhbGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogWW91IG5lZWQgdG8gY2FsbCB7QGxpbmsgRWZmZWN0Q29tcG9zZXIjc2V0U2l6ZX0gYWZ0ZXIgY2hhbmdpbmcgdGhpcyB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0ICovXHJcblxyXG5cdHNldCByZXNvbHV0aW9uU2NhbGUodmFsdWUgPSAwLjUpIHtcclxuXHJcblx0XHR0aGlzLmJsdXJQYXNzLnJlc29sdXRpb25TY2FsZSA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBibHVyIGtlcm5lbCBzaXplLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0tlcm5lbFNpemV9XHJcblx0ICovXHJcblxyXG5cdGdldCBrZXJuZWxTaXplKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmJsdXJQYXNzLmtlcm5lbFNpemU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQHR5cGUge0tlcm5lbFNpemV9XHJcblx0ICovXHJcblxyXG5cdHNldCBrZXJuZWxTaXplKHZhbHVlID0gS2VybmVsU2l6ZS5WRVJZX1NNQUxMKSB7XHJcblxyXG5cdFx0dGhpcy5ibHVyUGFzcy5rZXJuZWxTaXplID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIG91dGxpbmUgb3ZlcmxheSBzaG91bGQgYmUgYmx1cnJlZC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtCb29sZWFufVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgYmx1cigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ibHVyUGFzcy5lbmFibGVkO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEB0eXBlIHtCb29sZWFufVxyXG5cdCAqL1xyXG5cclxuXHRzZXQgYmx1cih2YWx1ZSkge1xyXG5cclxuXHRcdHRoaXMuYmx1clBhc3MuZW5hYmxlZCA9IHZhbHVlO1xyXG5cclxuXHRcdHRoaXMub3V0bGluZUJsZW5kTWF0ZXJpYWwudW5pZm9ybXMudEVkZ2VzLnZhbHVlID0gdmFsdWUgP1xyXG5cdFx0XHR0aGlzLnJlbmRlclRhcmdldEJsdXJyZWRFZGdlcy50ZXh0dXJlIDpcclxuXHRcdFx0dGhpcy5yZW5kZXJUYXJnZXRFZGdlcy50ZXh0dXJlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIGRpdGhlcmluZyBpcyBlbmFibGVkLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0ICovXHJcblxyXG5cdGdldCBkaXRoZXJpbmcoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYmx1clBhc3MuZGl0aGVyaW5nO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIGVuYWJsZWQsIHRoZSByZXN1bHQgd2lsbCBiZSBkaXRoZXJlZCB0byByZW1vdmUgYmFuZGluZyBhcnRpZmFjdHMuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHQgKi9cclxuXHJcblx0c2V0IGRpdGhlcmluZyh2YWx1ZSkge1xyXG5cclxuXHRcdHRoaXMuYmx1clBhc3MuZGl0aGVyaW5nID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVmZmVjdCBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgaW5wdXQgYnVmZmVyLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0ICovXHJcblxyXG5cdGdldCBibGVuZCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5uZWVkc1N3YXA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSWYgZGlzYWJsZWQsIHRoZSBpbnB1dCBidWZmZXIgd2lsbCByZW1haW4gdW5hZmZlY3RlZC5cclxuXHQgKlxyXG5cdCAqIFlvdSBtYXkgdXNlIHRoZSB7QGxpbmsgQmxvb21QYXNzI292ZXJsYXl9IHRleHR1cmUgdG8gYXBwbHkgdGhlIGVmZmVjdCB0b1xyXG5cdCAqIHlvdXIgc2NlbmUuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHQgKi9cclxuXHJcblx0c2V0IGJsZW5kKHZhbHVlKSB7XHJcblxyXG5cdFx0dGhpcy5uZWVkc1N3YXAgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgZWZmZWN0IG92ZXJsYXkgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtUZXh0dXJlfVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgb3ZlcmxheSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5vdXRsaW5lQmxlbmRNYXRlcmlhbC51bmlmb3Jtcy50RWRnZXMudmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyBhIHBhdHRlcm4gdGV4dHVyZSB0byB1c2UgYXMgYW4gb3ZlcmxheSBmb3Igc2VsZWN0ZWQgb2JqZWN0cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gW3RleHR1cmU9bnVsbF0gLSBBIHBhdHRlcm4gdGV4dHVyZS4gU2V0IHRvIG51bGwgdG8gZGlzYWJsZSB0aGUgcGF0dGVybi5cclxuXHQgKi9cclxuXHJcblx0c2V0UGF0dGVyblRleHR1cmUodGV4dHVyZSA9IG51bGwpIHtcclxuXHJcblx0XHR0aGlzLm91dGxpbmVCbGVuZE1hdGVyaWFsLnNldFBhdHRlcm5UZXh0dXJlKHRleHR1cmUpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENsZWFycyB0aGUgY3VycmVudCBzZWxlY3Rpb24gYW5kIHNlbGVjdHMgYSBsaXN0IG9mIG9iamVjdHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEW119IG9iamVjdHMgLSBUaGUgb2JqZWN0cyB0aGF0IHNob3VsZCBiZSBvdXRsaW5lZC4gVGhpcyBhcnJheSB3aWxsIGJlIGNvcGllZC5cclxuXHQgKiBAcmV0dXJuIHtPdXRsaW5lUGFzc30gVGhpcyBwYXNzLlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTZWxlY3Rpb24ob2JqZWN0cykge1xyXG5cclxuXHRcdGNvbnN0IHNlbGVjdGlvbiA9IG9iamVjdHMuc2xpY2UoMCk7XHJcblx0XHRjb25zdCBzZWxlY3Rpb25MYXllciA9IHRoaXMuc2VsZWN0aW9uTGF5ZXI7XHJcblxyXG5cdFx0bGV0IGksIGw7XHJcblxyXG5cdFx0dGhpcy5jbGVhclNlbGVjdGlvbigpO1xyXG5cclxuXHRcdGZvcihpID0gMCwgbCA9IHNlbGVjdGlvbi5sZW5ndGg7IGkgPCBsOyArK2kpIHtcclxuXHJcblx0XHRcdHNlbGVjdGlvbltpXS5sYXllcnMuZW5hYmxlKHNlbGVjdGlvbkxheWVyKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2xlYXJzIHRoZSBsaXN0IG9mIHNlbGVjdGVkIG9iamVjdHMuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtPdXRsaW5lUGFzc30gVGhpcyBwYXNzLlxyXG5cdCAqL1xyXG5cclxuXHRjbGVhclNlbGVjdGlvbigpIHtcclxuXHJcblx0XHRjb25zdCBzZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbjtcclxuXHRcdGNvbnN0IHNlbGVjdGlvbkxheWVyID0gdGhpcy5zZWxlY3Rpb25MYXllcjtcclxuXHJcblx0XHRsZXQgaSwgbDtcclxuXHJcblx0XHRmb3IoaSA9IDAsIGwgPSBzZWxlY3Rpb24ubGVuZ3RoOyBpIDwgbDsgKytpKSB7XHJcblxyXG5cdFx0XHRzZWxlY3Rpb25baV0ubGF5ZXJzLmRpc2FibGUoc2VsZWN0aW9uTGF5ZXIpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnNlbGVjdGlvbiA9IFtdO1xyXG5cdFx0dGhpcy50aW1lID0gMC4wO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlbGVjdHMgYW4gb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIG9iamVjdCB0aGF0IHNob3VsZCBiZSBvdXRsaW5lZC5cclxuXHQgKiBAcmV0dXJuIHtPdXRsaW5lUGFzc30gVGhpcyBwYXNzLlxyXG5cdCAqL1xyXG5cclxuXHRzZWxlY3RPYmplY3Qob2JqZWN0KSB7XHJcblxyXG5cdFx0b2JqZWN0LmxheWVycy5lbmFibGUodGhpcy5zZWxlY3Rpb25MYXllcik7XHJcblx0XHR0aGlzLnNlbGVjdGlvbi5wdXNoKG9iamVjdCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVzZWxlY3RzIGFuIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSBvYmplY3QgdGhhdCBzaG91bGQgbm8gbG9uZ2VyIGJlIG91dGxpbmVkLlxyXG5cdCAqIEByZXR1cm4ge091dGxpbmVQYXNzfSBUaGlzIHBhc3MuXHJcblx0ICovXHJcblxyXG5cdGRlc2VsZWN0T2JqZWN0KG9iamVjdCkge1xyXG5cclxuXHRcdGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uO1xyXG5cdFx0Y29uc3QgaW5kZXggPSBzZWxlY3Rpb24uaW5kZXhPZihvYmplY3QpO1xyXG5cclxuXHRcdGlmKGluZGV4ID49IDApIHtcclxuXHJcblx0XHRcdHNlbGVjdGlvbltpbmRleF0ubGF5ZXJzLmRpc2FibGUodGhpcy5zZWxlY3Rpb25MYXllcik7XHJcblx0XHRcdHNlbGVjdGlvbi5zcGxpY2UoaW5kZXgsIDEpO1xyXG5cclxuXHRcdFx0aWYoc2VsZWN0aW9uLmxlbmd0aCA9PT0gMCkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnRpbWUgPSAwLjA7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZpc2liaWxpdHkgb2YgYWxsIHNlbGVjdGVkIG9iamVjdHMuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gdmlzaWJsZSAtIFdoZXRoZXIgdGhlIHNlbGVjdGVkIG9iamVjdHMgc2hvdWxkIGJlIHZpc2libGUuXHJcblx0ICovXHJcblxyXG5cdHNldFNlbGVjdGlvblZpc2libGUodmlzaWJsZSkge1xyXG5cclxuXHRcdGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uO1xyXG5cclxuXHRcdGxldCBpLCBsO1xyXG5cclxuXHRcdGZvcihpID0gMCwgbCA9IHNlbGVjdGlvbi5sZW5ndGg7IGkgPCBsOyArK2kpIHtcclxuXHJcblx0XHRcdGlmKHZpc2libGUpIHtcclxuXHJcblx0XHRcdFx0c2VsZWN0aW9uW2ldLmxheWVycy5lbmFibGUoMCk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRzZWxlY3Rpb25baV0ubGF5ZXJzLmRpc2FibGUoMCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbmRlcnMgdGhlIGVmZmVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcblx0ICovXHJcblxyXG5cdHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XHJcblxyXG5cdFx0Y29uc3QgbWFpblNjZW5lID0gdGhpcy5tYWluU2NlbmU7XHJcblx0XHRjb25zdCBtYWluQ2FtZXJhID0gdGhpcy5tYWluQ2FtZXJhO1xyXG5cdFx0Y29uc3QgcHVsc2UgPSB0aGlzLm91dGxpbmVCbGVuZE1hdGVyaWFsLnVuaWZvcm1zLnB1bHNlO1xyXG5cclxuXHRcdGxldCBiYWNrZ3JvdW5kLCBtYXNrO1xyXG5cclxuXHRcdGlmKHRoaXMuc2VsZWN0aW9uLmxlbmd0aCA+IDApIHtcclxuXHJcblx0XHRcdGJhY2tncm91bmQgPSBtYWluU2NlbmUuYmFja2dyb3VuZDtcclxuXHRcdFx0bWFzayA9IG1haW5DYW1lcmEubGF5ZXJzLm1hc2s7XHJcblx0XHRcdG1haW5TY2VuZS5iYWNrZ3JvdW5kID0gbnVsbDtcclxuXHJcblx0XHRcdHB1bHNlLnZhbHVlID0gMS4wO1xyXG5cclxuXHRcdFx0aWYodGhpcy5wdWxzZVNwZWVkID4gMC4wKSB7XHJcblxyXG5cdFx0XHRcdHB1bHNlLnZhbHVlID0gMC42MjUgKyBNYXRoLmNvcyh0aGlzLnRpbWUgKiB0aGlzLnB1bHNlU3BlZWQgKiAxMC4wKSAqIDAuMzc1O1xyXG5cdFx0XHRcdHRoaXMudGltZSArPSBkZWx0YTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFJlbmRlciBhIGN1c3RvbSBkZXB0aCB0ZXh0dXJlIGFuZCBpZ25vcmUgc2VsZWN0ZWQgb2JqZWN0cy5cclxuXHRcdFx0dGhpcy5zZXRTZWxlY3Rpb25WaXNpYmxlKGZhbHNlKTtcclxuXHRcdFx0dGhpcy5yZW5kZXJQYXNzRGVwdGgucmVuZGVyKHJlbmRlcmVyLCB0aGlzLnJlbmRlclRhcmdldERlcHRoKTtcclxuXHRcdFx0dGhpcy5zZXRTZWxlY3Rpb25WaXNpYmxlKHRydWUpO1xyXG5cclxuXHRcdFx0Ly8gQ3JlYXRlIGEgbWFzayBmb3IgdGhlIHNlbGVjdGVkIG9iamVjdHMgdXNpbmcgdGhlIGRlcHRoIGluZm9ybWF0aW9uLlxyXG5cdFx0XHRtYWluQ2FtZXJhLmxheWVycy5tYXNrID0gMSA8PCB0aGlzLnNlbGVjdGlvbkxheWVyO1xyXG5cdFx0XHR0aGlzLnJlbmRlclBhc3NNYXNrLnJlbmRlcihyZW5kZXJlciwgdGhpcy5yZW5kZXJUYXJnZXRNYXNrKTtcclxuXHJcblx0XHRcdC8vIFJlc3RvcmUgdGhlIGNhbWVyYSBsYXllciBtYXNrIGFuZCB0aGUgc2NlbmUgYmFja2dyb3VuZC5cclxuXHRcdFx0bWFpbkNhbWVyYS5sYXllcnMubWFzayA9IG1hc2s7XHJcblx0XHRcdG1haW5TY2VuZS5iYWNrZ3JvdW5kID0gYmFja2dyb3VuZDtcclxuXHJcblx0XHRcdC8vIERldGVjdCB0aGUgb3V0bGluZS5cclxuXHRcdFx0dGhpcy5tYXRlcmlhbCA9IHRoaXMub3V0bGluZUVkZ2VzTWF0ZXJpYWw7XHJcblx0XHRcdHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUYXJnZXRFZGdlcyk7XHJcblxyXG5cdFx0XHRpZih0aGlzLmJsdXJQYXNzLmVuYWJsZWQpIHtcclxuXHJcblx0XHRcdFx0Ly8gQmx1ciB0aGUgZWRnZXMuXHJcblx0XHRcdFx0dGhpcy5ibHVyUGFzcy5yZW5kZXIocmVuZGVyZXIsIHRoaXMucmVuZGVyVGFyZ2V0RWRnZXMsIHRoaXMucmVuZGVyVGFyZ2V0Qmx1cnJlZEVkZ2VzKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmKHRoaXMuYmxlbmQpIHtcclxuXHJcblx0XHRcdFx0Ly8gRHJhdyB0aGUgZmluYWwgb3ZlcmxheSBvbnRvIHRoZSBzY2VuZSBjb2xvdXJzLlxyXG5cdFx0XHRcdHRoaXMubWF0ZXJpYWwgPSB0aGlzLm91dGxpbmVCbGVuZE1hdGVyaWFsO1xyXG5cdFx0XHRcdHRoaXMub3V0bGluZUJsZW5kTWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xyXG5cdFx0XHRcdHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiB0aGlzLm91dHB1dEJ1ZmZlcik7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmKHRoaXMucmVuZGVyVG9TY3JlZW4pIHtcclxuXHJcblx0XHRcdC8vIERyYXcgdGhlIHJlYWQgYnVmZmVyIHRvIHNjcmVlbi5cclxuXHRcdFx0dGhpcy5jb3B5UGFzcy5yZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgc2l6ZSBvZiB0aGlzIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgd2lkdGguXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcblx0ICovXHJcblxyXG5cdHNldFNpemUod2lkdGgsIGhlaWdodCkge1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0RGVwdGguc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0TWFzay5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyUGFzc0RlcHRoLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblx0XHR0aGlzLnJlbmRlclBhc3NNYXNrLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblx0XHR0aGlzLmJsdXJQYXNzLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblxyXG5cdFx0d2lkdGggPSB0aGlzLmJsdXJQYXNzLndpZHRoO1xyXG5cdFx0aGVpZ2h0ID0gdGhpcy5ibHVyUGFzcy5oZWlnaHQ7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRFZGdlcy5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRCbHVycmVkRWRnZXMuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHJcblx0XHR0aGlzLm91dGxpbmVCbGVuZE1hdGVyaWFsLnVuaWZvcm1zLmFzcGVjdC52YWx1ZSA9IHdpZHRoIC8gaGVpZ2h0O1xyXG5cdFx0dGhpcy5vdXRsaW5lRWRnZXNNYXRlcmlhbC5zZXRUZXhlbFNpemUoMS4wIC8gd2lkdGgsIDEuMCAvIGhlaWdodCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gdGFza3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gYWxwaGEgLSBXaGV0aGVyIHRoZSByZW5kZXJlciB1c2VzIHRoZSBhbHBoYSBjaGFubmVsIG9yIG5vdC5cclxuXHQgKi9cclxuXHJcblx0aW5pdGlhbGl6ZShyZW5kZXJlciwgYWxwaGEpIHtcclxuXHJcblx0XHR0aGlzLnJlbmRlclBhc3NEZXB0aC5pbml0aWFsaXplKHJlbmRlcmVyLCBhbHBoYSk7XHJcblx0XHR0aGlzLnJlbmRlclBhc3NNYXNrLmluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKTtcclxuXHRcdHRoaXMuYmx1clBhc3MuaW5pdGlhbGl6ZShyZW5kZXJlciwgYWxwaGEpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFBpeGVsYXRpb25NYXRlcmlhbCB9IGZyb20gXCIuLi9tYXRlcmlhbHNcIjtcclxuaW1wb3J0IHsgUGFzcyB9IGZyb20gXCIuL1Bhc3MuanNcIjtcclxuXHJcbi8qKlxyXG4gKiBBIHBpeGVsYXRpb24gcGFzcy5cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgUGl4ZWxhdGlvblBhc3MgZXh0ZW5kcyBQYXNzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBwaXhlbGF0aW9uIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2dyYW51bGFyaXR5PTMwLjBdIC0gVGhlIGludGVuc2l0eSBvZiB0aGUgZWZmZWN0LlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcihncmFudWxhcml0eSA9IDMwLjApIHtcclxuXHJcblx0XHRzdXBlcihcIlBpeGVsYXRpb25QYXNzXCIpO1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSBuZXcgUGl4ZWxhdGlvbk1hdGVyaWFsKCk7XHJcblxyXG5cdFx0dGhpcy5ncmFudWxhcml0eSA9IGdyYW51bGFyaXR5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBwaXhlbCBncmFudWxhcml0eS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0ICovXHJcblxyXG5cdGdldCBncmFudWxhcml0eSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5tYXRlcmlhbC5ncmFudWxhcml0eTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBIGhpZ2hlciB2YWx1ZSB5aWVsZHMgY29hcnNlciB2aXN1YWxzLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge051bWJlcn1cclxuXHQgKi9cclxuXHJcblx0c2V0IGdyYW51bGFyaXR5KHZhbHVlID0gMzApIHtcclxuXHJcblx0XHR2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpO1xyXG5cclxuXHRcdGlmKHZhbHVlICUgMiA+IDApIHtcclxuXHJcblx0XHRcdHZhbHVlICs9IDE7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwuZ3JhbnVsYXJpdHkgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xyXG5cclxuXHRcdHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsLnNldFJlc29sdXRpb24od2lkdGgsIGhlaWdodCk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgUmVhbGlzdGljQm9rZWhNYXRlcmlhbCB9IGZyb20gXCIuLi9tYXRlcmlhbHNcIjtcclxuaW1wb3J0IHsgUGFzcyB9IGZyb20gXCIuL1Bhc3MuanNcIjtcclxuXHJcbi8qKlxyXG4gKiBBbiBhZHZhbmNlZCBEZXB0aCBvZiBGaWVsZCAoRG9GKSBwYXNzLlxyXG4gKlxyXG4gKiBZaWVsZHMgbW9yZSByZWFsaXN0aWMgcmVzdWx0cyBidXQgaXMgYWxzbyBtb3JlIGRlbWFuZGluZy5cclxuICpcclxuICogVGhpcyBwYXNzIHJlcXVpcmVzIGEge0BsaW5rIEVmZmVjdENvbXBvc2VyI2RlcHRoVGV4dHVyZX0uXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIFJlYWxpc3RpY0Jva2VoUGFzcyBleHRlbmRzIFBhc3Mge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJva2VoIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1BlcnNwZWN0aXZlQ2FtZXJhfSBjYW1lcmEgLSBUaGUgbWFpbiBjYW1lcmEuIFVzZWQgdG8gb2J0YWluIHRoZSBmb2NhbCBsZW5ndGggYW5kIHRoZSBuZWFyIGFuZCBmYXIgcGxhbmUgc2V0dGluZ3MuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIEFkZGl0aW9uYWwgcGFyYW1ldGVycy4gU2VlIHtAbGluayBSZWFsaXN0aWNCb2tlaE1hdGVyaWFsfSBmb3IgZGV0YWlscy5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3IoY2FtZXJhLCBvcHRpb25zID0ge30pIHtcclxuXHJcblx0XHRzdXBlcihcIlJlYWxpc3RpY0Jva2VoUGFzc1wiKTtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsID0gbmV3IFJlYWxpc3RpY0Jva2VoTWF0ZXJpYWwoY2FtZXJhLCBvcHRpb25zKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xyXG5cdFx0dGhpcy5tYXRlcmlhbC51bmlmb3Jtcy50RGVwdGgudmFsdWUgPSBpbnB1dEJ1ZmZlci5kZXB0aFRleHR1cmU7XHJcblxyXG5cdFx0cmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IG91dHB1dEJ1ZmZlcik7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgc2l6ZSBvZiB0aGlzIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgd2lkdGguXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcblx0ICovXHJcblxyXG5cdHNldFNpemUod2lkdGgsIGhlaWdodCkge1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwuc2V0VGV4ZWxTaXplKDEuMCAvIHdpZHRoLCAxLjAgLyBoZWlnaHQpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IExpbmVhckZpbHRlciwgUkdCRm9ybWF0LCBXZWJHTFJlbmRlclRhcmdldCB9IGZyb20gXCJ0aHJlZVwiO1xyXG5pbXBvcnQgeyBDb3B5TWF0ZXJpYWwgfSBmcm9tIFwiLi4vbWF0ZXJpYWxzXCI7XHJcbmltcG9ydCB7IFBhc3MgfSBmcm9tIFwiLi9QYXNzLmpzXCI7XHJcblxyXG4vKipcclxuICogQSBwYXNzIHRoYXQgcmVuZGVycyB0aGUgcmVzdWx0IGZyb20gYSBwcmV2aW91cyBwYXNzIHRvIGFub3RoZXIgcmVuZGVyIHRhcmdldC5cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgU2F2ZVBhc3MgZXh0ZW5kcyBQYXNzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzYXZlIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBbcmVuZGVyVGFyZ2V0XSAtIFRoZSByZW5kZXIgdGFyZ2V0IHRvIHVzZSBmb3Igc2F2aW5nIHRoZSBpbnB1dCBidWZmZXIuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbcmVzaXplPXRydWVdIC0gV2hldGhlciB0aGUgcmVuZGVyIHRhcmdldCBzaG91bGQgYWRqdXN0IHRvIHRoZSBzaXplIG9mIHRoZSBpbnB1dCBidWZmZXIuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKHJlbmRlclRhcmdldCwgcmVzaXplID0gdHJ1ZSkge1xyXG5cclxuXHRcdHN1cGVyKFwiU2F2ZVBhc3NcIik7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbCA9IG5ldyBDb3B5TWF0ZXJpYWwoKTtcclxuXHJcblx0XHR0aGlzLm5lZWRzU3dhcCA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlbmRlciB0YXJnZXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXQgPSAocmVuZGVyVGFyZ2V0ICE9PSB1bmRlZmluZWQpID8gcmVuZGVyVGFyZ2V0IDogbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KDEsIDEsIHtcclxuXHRcdFx0bWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXHJcblx0XHRcdG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyLFxyXG5cdFx0XHRzdGVuY2lsQnVmZmVyOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhCdWZmZXI6IGZhbHNlXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlLm5hbWUgPSBcIlNhdmUuVGFyZ2V0XCI7XHJcblx0XHR0aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJlbmRlciB0YXJnZXQgc2hvdWxkIGJlIHJlc2l6ZWQgd2hlbiB0aGUgc2l6ZSBvZlxyXG5cdFx0ICogdGhlIGNvbXBvc2VyJ3MgZnJhbWUgYnVmZmVyIGNoYW5nZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnJlc2l6ZSA9IHJlc2l6ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xyXG5cclxuXHRcdHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUYXJnZXQpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcclxuXHJcblx0XHRpZih0aGlzLnJlc2l6ZSkge1xyXG5cclxuXHRcdFx0d2lkdGggPSBNYXRoLm1heCgxLCB3aWR0aCk7XHJcblx0XHRcdGhlaWdodCA9IE1hdGgubWF4KDEsIGhlaWdodCk7XHJcblxyXG5cdFx0XHR0aGlzLnJlbmRlclRhcmdldC5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQZXJmb3JtcyBpbml0aWFsaXphdGlvbiB0YXNrcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBhbHBoYSAtIFdoZXRoZXIgdGhlIHJlbmRlcmVyIHVzZXMgdGhlIGFscGhhIGNoYW5uZWwgb3Igbm90LlxyXG5cdCAqL1xyXG5cclxuXHRpbml0aWFsaXplKHJlbmRlcmVyLCBhbHBoYSkge1xyXG5cclxuXHRcdGlmKCFhbHBoYSkge1xyXG5cclxuXHRcdFx0dGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZS5mb3JtYXQgPSBSR0JGb3JtYXQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tIFwidGhyZWVcIjtcclxuaW1wb3J0IHsgQ29weU1hdGVyaWFsLCBTaG9ja1dhdmVNYXRlcmlhbCB9IGZyb20gXCIuLi9tYXRlcmlhbHNcIjtcclxuaW1wb3J0IHsgUGFzcyB9IGZyb20gXCIuL1Bhc3MuanNcIjtcclxuXHJcbi8qKlxyXG4gKiBIYWxmIFBJLlxyXG4gKlxyXG4gKiBAdHlwZSB7TnVtYmVyfVxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuXHJcbmNvbnN0IEhBTEZfUEkgPSBNYXRoLlBJICogMC41O1xyXG5cclxuLyoqXHJcbiAqIEEgdmVjdG9yLlxyXG4gKlxyXG4gKiBAdHlwZSB7VmVjdG9yM31cclxuICogQHByaXZhdGVcclxuICovXHJcblxyXG5jb25zdCB2ID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcbi8qKlxyXG4gKiBBIHZlY3Rvci5cclxuICpcclxuICogQHR5cGUge1ZlY3RvcjN9XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5cclxuY29uc3QgYWIgPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuLyoqXHJcbiAqIEEgc2hvY2sgd2F2ZSBwYXNzLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBTaG9ja1dhdmVQYXNzIGV4dGVuZHMgUGFzcyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc2hvY2sgd2F2ZSBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBtYWluIGNhbWVyYS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFtlcGljZW50ZXJdIC0gVGhlIHdvcmxkIHBvc2l0aW9uIG9mIHRoZSBzaG9jayB3YXZlIGVwaWNlbnRlci5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnNwZWVkPTEuMF0gLSBUaGUgYW5pbWF0aW9uIHNwZWVkLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5tYXhSYWRpdXM9MS4wXSAtIFRoZSBleHRlbnQgb2YgdGhlIHNob2NrIHdhdmUuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLndhdmVTaXplPTAuMl0gLSBUaGUgd2F2ZSBzaXplLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5hbXBsaXR1ZGU9MC4wNV0gLSBUaGUgZGlzdG9ydGlvbiBhbXBsaXR1ZGUuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKGNhbWVyYSwgZXBpY2VudGVyID0gbmV3IFZlY3RvcjMoKSwgb3B0aW9ucyA9IHt9KSB7XHJcblxyXG5cdFx0c3VwZXIoXCJTaG9ja1dhdmVQYXNzXCIpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG1haW4gY2FtZXJhLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3QzRH1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMubWFpbkNhbWVyYSA9IGNhbWVyYTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBlcGljZW50ZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjN9XHJcblx0XHQgKiBAZXhhbXBsZSBzaG9ja1dhdmVQYXNzLmVwaWNlbnRlciA9IG15TWVzaC5wb3NpdGlvbjtcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuZXBpY2VudGVyID0gZXBpY2VudGVyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG9iamVjdCBwb3NpdGlvbiBpbiBzY3JlZW4gc3BhY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjN9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5zY3JlZW5Qb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc3BlZWQgb2YgdGhlIHNob2NrIHdhdmUgYW5pbWF0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnNwZWVkID0gKG9wdGlvbnMuc3BlZWQgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLnNwZWVkIDogMi4wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSB0aW1lIGFjY3VtdWxhdG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy50aW1lID0gMC4wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNob2NrIHdhdmUgYW5pbWF0aW9uIGlzIGFjdGl2ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLmFjdGl2ZSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBzaG9jayB3YXZlIHNoYWRlciBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7U2hvY2tXYXZlTWF0ZXJpYWx9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5zaG9ja1dhdmVNYXRlcmlhbCA9IG5ldyBTaG9ja1dhdmVNYXRlcmlhbChvcHRpb25zKTtcclxuXHJcblx0XHR0aGlzLnNob2NrV2F2ZU1hdGVyaWFsLnVuaWZvcm1zLmNlbnRlci52YWx1ZSA9IHRoaXMuc2NyZWVuUG9zaXRpb247XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGNvcHkgc2hhZGVyIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb3B5TWF0ZXJpYWx9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5jb3B5TWF0ZXJpYWwgPSBuZXcgQ29weU1hdGVyaWFsKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRW1pdHMgdGhlIHNob2NrIHdhdmUuXHJcblx0ICovXHJcblxyXG5cdGV4cGxvZGUoKSB7XHJcblxyXG5cdFx0dGhpcy50aW1lID0gMC4wO1xyXG5cdFx0dGhpcy5hY3RpdmUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbmRlcnMgdGhlIGVmZmVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcblx0ICovXHJcblxyXG5cdHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XHJcblxyXG5cdFx0Y29uc3QgZXBpY2VudGVyID0gdGhpcy5lcGljZW50ZXI7XHJcblx0XHRjb25zdCBtYWluQ2FtZXJhID0gdGhpcy5tYWluQ2FtZXJhO1xyXG5cdFx0Y29uc3Qgc2NyZWVuUG9zaXRpb24gPSB0aGlzLnNjcmVlblBvc2l0aW9uO1xyXG5cclxuXHRcdGNvbnN0IHNob2NrV2F2ZU1hdGVyaWFsID0gdGhpcy5zaG9ja1dhdmVNYXRlcmlhbDtcclxuXHRcdGNvbnN0IHVuaWZvcm1zID0gc2hvY2tXYXZlTWF0ZXJpYWwudW5pZm9ybXM7XHJcblx0XHRjb25zdCBjZW50ZXIgPSB1bmlmb3Jtcy5jZW50ZXI7XHJcblx0XHRjb25zdCByYWRpdXMgPSB1bmlmb3Jtcy5yYWRpdXM7XHJcblx0XHRjb25zdCBtYXhSYWRpdXMgPSB1bmlmb3Jtcy5tYXhSYWRpdXM7XHJcblx0XHRjb25zdCB3YXZlU2l6ZSA9IHVuaWZvcm1zLndhdmVTaXplO1xyXG5cclxuXHRcdHRoaXMuY29weU1hdGVyaWFsLnVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcclxuXHRcdHRoaXMubWF0ZXJpYWwgPSB0aGlzLmNvcHlNYXRlcmlhbDtcclxuXHJcblx0XHRpZih0aGlzLmFjdGl2ZSkge1xyXG5cclxuXHRcdFx0Ly8gQ2FsY3VsYXRlIGRpcmVjdGlvbiB2ZWN0b3JzLlxyXG5cdFx0XHRtYWluQ2FtZXJhLmdldFdvcmxkRGlyZWN0aW9uKHYpO1xyXG5cdFx0XHRhYi5jb3B5KG1haW5DYW1lcmEucG9zaXRpb24pLnN1YihlcGljZW50ZXIpO1xyXG5cclxuXHRcdFx0Ly8gRG9uJ3QgcmVuZGVyIHRoZSBlZmZlY3QgaWYgdGhlIG9iamVjdCBpcyBiZWhpbmQgdGhlIGNhbWVyYS5cclxuXHRcdFx0aWYodi5hbmdsZVRvKGFiKSA+IEhBTEZfUEkpIHtcclxuXHJcblx0XHRcdFx0Ly8gU2NhbGUgdGhlIGVmZmVjdCBiYXNlZCBvbiBkaXN0YW5jZSB0byB0aGUgb2JqZWN0LlxyXG5cdFx0XHRcdHVuaWZvcm1zLmNhbWVyYURpc3RhbmNlLnZhbHVlID0gbWFpbkNhbWVyYS5wb3NpdGlvbi5kaXN0YW5jZVRvKGVwaWNlbnRlcik7XHJcblxyXG5cdFx0XHRcdC8vIENhbGN1bGF0ZSB0aGUgc2NyZWVuIHBvc2l0aW9uIG9mIHRoZSBlcGljZW50ZXIuXHJcblx0XHRcdFx0c2NyZWVuUG9zaXRpb24uY29weShlcGljZW50ZXIpLnByb2plY3QobWFpbkNhbWVyYSk7XHJcblx0XHRcdFx0Y2VudGVyLnZhbHVlLnggPSAoc2NyZWVuUG9zaXRpb24ueCArIDEuMCkgKiAwLjU7XHJcblx0XHRcdFx0Y2VudGVyLnZhbHVlLnkgPSAoc2NyZWVuUG9zaXRpb24ueSArIDEuMCkgKiAwLjU7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcclxuXHRcdFx0XHR0aGlzLm1hdGVyaWFsID0gc2hvY2tXYXZlTWF0ZXJpYWw7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBVcGRhdGUgdGhlIHNob2NrIHdhdmUgcmFkaXVzIGJhc2VkIG9uIHRpbWUuXHJcblx0XHRcdHRoaXMudGltZSArPSBkZWx0YSAqIHRoaXMuc3BlZWQ7XHJcblx0XHRcdHJhZGl1cy52YWx1ZSA9IHRoaXMudGltZSAtIHdhdmVTaXplLnZhbHVlO1xyXG5cclxuXHRcdFx0aWYocmFkaXVzLnZhbHVlID49IChtYXhSYWRpdXMudmFsdWUgKyB3YXZlU2l6ZS52YWx1ZSkgKiAyKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuYWN0aXZlID0gZmFsc2U7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcclxuXHJcblx0XHR0aGlzLnNob2NrV2F2ZU1hdGVyaWFsLnVuaWZvcm1zLmFzcGVjdC52YWx1ZSA9IHdpZHRoIC8gaGVpZ2h0O1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsIi8vIEdlbmVyYXRlZCB3aXRoIFNNQUFTZWFyY2hJbWFnZURhdGEuZ2VuZXJhdGUoKS50b0NhbnZhcygpLnRvRGF0YVVSTCgpLCBub3QgY3JvcHBlZCwgbG93IGR5bmFtaWMgcmFuZ2UuXHJcbmV4cG9ydCBkZWZhdWx0IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFFSUFBQUFoQ0FBQUFBQklYeUxBQUFBQU9FbEVRVlJJeDJOZ0dBV2pZQlNNZ2xFd0VJQ1JFWVJnRkJaQnFEQ1NMQTJNR1BVSVZRRVRFOWlOVUFxTFI1Z0llb1FLUmd3WGp3QUFHbjRBdGFGZVlMRUFBQUFBU1VWT1JLNUNZSUlcIjtcclxuIiwiLy8gR2VuZXJhdGVkIHdpdGggU01BQUFyZWFJbWFnZURhdGEuZ2VuZXJhdGUoKS50b0NhbnZhcygpLnRvRGF0YVVSTCgpLlxyXG5leHBvcnQgZGVmYXVsdCBcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBS0FBQUFJd0NBWUFBQUFCTm1CSEFBQWdBRWxFUVZSNFh1eTlDYmhsVjFrdE92YnBxMDlEa2lJa1VCSTZreEFTSUgwRGxBUWlJSzF3UmZTSlR4K2k0Slg3dktJaWdzOEhYcFh2cVZjdnJjQzlhZ1E3SURUU1NXZ3FDUVFsaURSQkpLa2toRFNrcVZQTnFWT25QKzhiLy9ySDNQK2VaKzE5OXRsem5WVGx2VnJmdDcrMVQ3T2F1ZVpZNDIvbTM3UUFMS05rMndIZzFwSVRsQjE3bUMrUHAxMVczWC9MSHlUMzJ2aGc0OC81U092K1Bud3BzSEE3MEpvR2x1ZUIxaUtBcGVxenZPem40NEdhdFRCNzZYemhkN3N1QlI3K1dXQURnREVBd3dDRy9MNTRiL3BvRExySHV2dm03MFoyQXZoc2MrUFZjeHNjQlU4RjhDOEFEZzUraXBJakQvUGxHd2ZnanU4QjkyNEU1c2VBUlVmTHNpTm1xUVcwSWpMOCs3TDJOWUQvN0NPQnpmY0NtK2FCOFNWZ2RBa1lJUkNYS3lEYXg0RWRBYW5MNVB1TlBsbE52WERsQUh3RmdQOEFjQzJBaFJJb0RYYnNZYjQ4ZGw1V2tWRlRFM0xHRGNDOW00Q1pDV0J1RkZnZUFaYUdBWUpRUUNScURIVCtNY0pyVmI4endBVFVYSDAyTUhZZk1IRUlHRnNBeGdqQXBRcUFDWVFPUmp0ZC9CN0F4dC96NzlzQzArY01QZ2pqbHdQd1Z3SGNBK0RmQUh6VHhjVmdXQnJvcU1OOCtjWUJlTTcxd0gwVHdLRXhZSFlVV0NJQUhZUkxUbGtDWWdjSUJjQWdVL24zcXk4R1J1NEhSZ25BT1dCa0VSaGRkUEFKaEdKREJ4a3Z3N2NxaW1yK3pGTS9aTG5aRjY0Y2dMOEJZRCtBV3dCOHgvZGxXdVdhZ0hpWUw5ODRBSi8wUldCeTFBRTRBaXp5TTF5eFlBY1RpZ1c1NXhNYkFreEVpd0Vka0ovWkNReFBBaU9IZ0JFQ2NLRUM0VEJaY0trU3YrbVRpZU5jTlBOQzI2bUxOc2o0NVFEOExRRFRBTzRHY0p0LzdpdzJiZm9HNFdHK3ZBR3dtOUV4aUVnNjl6cGcvd2d3UFFMTWpnQUx6bjRFNGFJem9KalE5ZzQwMjR1eWdraitweXVBb1gwVkFJZm5nT0g1TmdDSE1oQW04U3YyeTNYRFplQmhOSXA4T3pKRThPc0J6QUtZQkhBWGdEdDgvNE8rTVZUMGo0ZjU4bzBEOFB4cmdmM0R3TXdJTUVQUUVZUmtOd2Znc3V1RFpMc2tpcDBObzBnV01ELzlIR0RvQURBa0FDNEF3L3dzQWdaQWdzMlowQUJJMEdVNklWbUt2K2YyOEtEbkh4a0EvRzBBOHk2RzczTjlrT0NqWG5oL0ViYjZPdmd3WDc1eEFGNXdMVEExVklIUEFEZ01MRGo0eUlBNUFBbTZhQ1VudjRvejQ2ZWVEd3hOQVVNendKQXo0QkFCU05ERlR3U2ZnN0RES0hFMjNNRzVQcUlZOEExdS9kSU5zOWRCZHk4QWduR1BNMk5mVUJyc253N3o1UnNINElYWEFBY0p2aUZnbHVBYnlnQklOblNMV09Bakd4SjRwZ09LRFYwdi9PU0xLcDhpR1hCb3ZoTEJCT0NRTTJBQ29UT2huWXJBZEl0WWJDaWo1SkZ6UnlJQXFSY2NBbkRBUVVqZzZVTlE3aHNNWFAwY1JRQWV4c3MzRHNDTENFQ0NMd0NRek1jUHdVaTJNd0FTY0FLYmZuWS9ZUkxGUThESFgrSUFKQU1TZkRrQUYxM2tMdmxlSWpoalFRSHhVVlMzampnR3BLZWVOellWUUVqZ1VTOGsrUGdoT05kaEl3QVA0K1hYQllDSEtJSmJ3SnlEVGdhSUFkQ0JKeDNRMk04dFlBSFA5bTRkZi95bFFPc1EwSnF0UkxDeDMwSzF3dExCZ2dTY1FPZ3NLQkdjV0hBSmVPd1JDMEJTTTFtUUlLUmJoaCtCajk4SlFQNnQ0VTBBUEV5WFh4Y0FFbnhrUUFGd29WVXhJRDlrdlFnK2MxQzd2aWRSYklEa2MyNEIvL2hUUUd1bURjQ1dBNURnTXhBU2ROSUZCVUk1cENNTDh2OEFQSTV6ZkVReDRCdWRncWljenZpU25KaFF3Q1A0Qk1DR2wrd084K1U3QUppL1c0TzRZUzYrcG1LLzJjaUFEc0FPQmhUSUlpQUpuUEI3QXZOalArMEFuQU5hWWtBSFgySkJBYyt0WWFKWE9xQlp2MjRWYzM4NlhXNWR0a0hHVys0SEZBSm9ucE9lK1lZUVpBU2hnS2p2M1BOdlBRYXhWb0k4ekpkZkZ3QVNmUHpNVXdTM0t0MXYwVUZJbG9zNm9ERmRBR0ZjbGlNQVAvcnlBRUFHTndRUm5ET2dMYmRsSUV3cklzNkFaL1Fna01NSFFGNlpBS1FjSkFzU1lQd0llQUlrOXdKZ29QSzFnaTcrUHdGNEdDL2ZPQUF2SVFQU3MwVVJUUEJKL1BwM0dTRUdSSGZCQ0lRMHhvd0J0VWJjQWo3eXM1WDRKZnUxSElBR1FySWdRUlhFc0FGUUlPUkRGaGlEWS9yTUhtclU0UVVnUjA4QWtnVWpDQVc2Q0Q2Q2t3QnNBSVFDNEdHNmZQTUEzT1hpTnpDZzJJOWdOQ01rc21BQW9lbUR6b2ltRndMNDhNODVBS2tpdVFWTUFBcDhDWVJSREF0OEdRaUo2N042R0pPREFYQUhsc0dndXNjQTJBSmcxSVBHWW14T3BCeEZXa1JOOUxzQVRnSXdYbk5zL3YvNXovOVhDZjhCTzNZQXR4YmMvNDYvS0R0KzUrZWExWWt1MlZVeEh6L3owdjI0RndNR0sxZ1dzSzJPVVV4SEhkQ0JlUlVCNk94SEFCcjRaSUNJQmQwUVdTRitYUmRNVEFqZ0NkVHJHOWNCTndFNEY4Q3BEa0lDeVlMR3N1aEZ0NnpzK2dJU3dVZW44ekVBamdNdzRjZngySDZPLzkweUFGbzg0Q2JnNElEMy85VGZMVHQrNStlYm5SQUJrT0RqeDBTd1BpNWVjL0ZyWXBtcVNBeE04RG42MENzcUFGSTZHZmhxQU1pREUvZ29rbXZFcjBDNFBnRGtCUW00MHdFOHpNRkVVREtFVm94SU1MbC9LUzczbUU3SDlkK3ZjS0hRUWNqd1cwWXU5blA4bThzQW1PSUJ1V1k2d1AyLzRzMGV6ampnOFR1dmFSNkFCSjcwdnhVQXBHcm03RWJHRStpNDcyQkFCK1dIZnFIUy9lb0FhRXdZMkU5K3dMU1hUcWhJN0NYZ25CNkxDb09KNEJpU1QraFRuRzBIY0N3QWdsQ3gzQVJvWkVWRlhuQlBwL08vQS9oWEFDYzdDUHM5L2kxbEFPeUlCK1JEWCtQOS8rcGJRampqQU1mdi9QTDZBRkRzMXdGQWdzLzlmZ0tmZ2RFL1pFcHVpUWxid0FkZTZRQU1CZ2lSbXNTd0E5QlkwSmZqb3ZHUkRCTUg0VGxjWEdoY0JPYzZIa0YwZ2pQaFpnY2h4VExaTUFjaS8wNFcvQjZBYjN0MDlFUFhjUHlmbGdGd1JUd2dKMk1OOS84YmY1cUZNNjd4K0IvYVc0WFF6NDJGZUwwWXJSeWlrenRVRncwNzA0bWY5a1hneGhPQXFjM0FBc1B5Unh4UUNzL1BkWE9GWTBXMUtIeTNRSVVHdHgrNnZkbngxdnNCK2RzVG5jbTJBb2dnbEZnVkVBbFVXck9NQjJSeUVtTUNHUS9ZNy9IdktuczZ0ZkdBbkpRK3IvOWI3Nm9KWjF6RDhXZHlRallCaDhhQmhWRUhqRUxvdVE4dWtRN1ZSU0NKQUFMd2tyK3NBTGhuR3pERDNKQUpZSkhnOXVob2k0Yng4eXRrV1V0dkhULzcrWmM0ZHcxdVozNjEyZkgyZGtRZjd5eElFRW9ja3drSlFuNElRb3E4dW5oQWhtUFJLS0Z4MHV2NEs4dWVUczk0d0Q3dS8vVlg5Z2huN09QNGMrNEc3aDhIcHNlQitkRjJBS2xGTHd1QUlaOGpENk5Qck9oQWZmbWZBOS9aQnV6WkNreVJXU2VxQkNXeW9ZR1E1eVFyQnBEYnVtL01FMUhvUG8wWEVrU0QyemxmYm5hOHE2K0VVSmNUQ3hLRXRITDVFUWpQNkJFUHlJZ1lBWkJ2WXQzeEh5eDdPcXZHQTY1eS83Lzl3VlhDR1ZjNS9zbDdxeEQ2NmRFcWlZZ1J6QXFoTjFBNENCTkFBbER5QUZJK2laOS9OM0RMSnVDK2pjRFVCbUNXeVVuT3JtVFlDTUlPa05jbExnMEI4L1JzTkxnOStVdk5qbmQxQVBMbW1RcEZIeUVCUk91V0FDUVQ4bk4rSC9HQXZZNy9WTm5UNlNzZXNNZjEzL0NwYWhHblp6aGpqK1BQbXdYMk1ZZERJZlFleFd5QkF3RVVPUURyUkROLzk4cDNBN2R2QU82ZkFBNXNxSEpEQkVBeW9VVkdrd0VkNkhSMTJYVTRrd3pmbDZmQ1hUWnpqeTU3dnZuUjUxM1g3SGo3QXlEdmdnQVVpOUV5RmdpWnFOeFBRRjYzNDVuT1diRDFIUS9ZNWZwdnVMYS8yKzgyL3ZOSGdBUERGUURuaG9GNWoyQzJxQldDSThidzFlUnc1Q0w1bDk0TDNERU9USTREQjhZOU9XbXNFdS96QkozcmdzYXlicUJvYi83QTRDN2p0V2Nvb1JyY3pyK3UyZkgyRDBBT1FnQVVDeEtFUDdhR2dMeTY0K202S2RqV0ZBOVljLzAzL09zYTRnbHJqcitBdXBxSHoxc0VzMGN4RzBCQzlISWVQTG9pdDllTmtWZjlMK0R1VVdCeURKZ2FxNHliR1lMUEFXZ2lYbUxlZFVFN2R3QzdzYUw3Q3FmUEtYaTROWWRheWtDRDQxMGJBSGxERXNOaXdaOXdBUFlia0pjZno2VDJnbTNOOFlEWjlkL3dIeFVBKzczOWZQd1hQclNLWUdiK0J1UDNqQUZERWxGSDlISVd3YnpDSUdrQnIvb3I0SjRSWU84b01PVzZaVmNBdXZpMUNnb2hhMDRCQ3dUNWdmTUtIbTdOb1JkZTIreDQxdzVBM2hRWmtBRGs1K2NHaUFlTXgzKy83QUVORkE4WXJ2L0c3MWNBWEZNNFl6aitvdE9BYVFMUUEwZ1p4YUlJWnRNREZUaWdLSlY4SDlJcTZhWjU5WlhBdlNQQXZwRUtnQlR0Qk9EY1NDV0NaZVJZdHB6cm1MeWVHTkNBeUZsMXYrSGVpOHFlYjM3MFJkYzJPOTdCQU1pN0VnQi8yUUc0MW5oQUhVOUx1V0FiT0I3UXIvL0dQUlVBMTNyN0d2OUZad0lNb1ZjRXN3RXdmRG9pbUVQMHNoS0t0SXBoYVpRQVh2MStZTSt3QTNERWRjdlJLa0dKQURRUUVzUXVoaTFUanQ5NXZCc2g1bngySU81OVNzSERyVG1VT1N0TmpuZHdBQXFFcnkwSXlDTUlDa095aXVJQk53QnZQRlFRVDdnQnVQamM5b1JZQUlIeU9FTDR2SUZFWVZOYU9vdTV2Q0dFL3RWL0Ewd09WY25wekk0N05PcmkzUUZJQnBTZWFTRFVkWUxPU1d2WUltU0dnZnRwSkRhNE1XSmJBR3hpdkdVQTVNQU9jMEJlNmVWTGo3LzRNaytoekNPWVBZcFpEQmlOa0xoK0cvTTN5Rnl2L2x0Z0wzVzNZUWZnY0ZVaGdSWTJQd1krWjcvRWhBUjFTRnlYQ09iNTdyMjhRZlFCc0pRQk1uNUQ0eTBIWUxQamU5Q2Q3UklDMFBNM0VpTW9mRjRnVkNCcDFQODQwaXgvZ3l6NTZyK3ZBTWprOUdsMzc1aUI0K0N6dmV1WmRMa2tFUEo4WkVmWC82Ujczdk9qelQ1U2k5aHVjTHhIQVZnNFB3SmdSd2g5Q0tPWEs4WUE0WkVxS1pYU1FXaDVQKzVBZnRYZkEvdUdLdllqQ0tuNzJjY3RiRnJaTkVDa2E1TDVDUHdJUHRNSDNUVnoxN01MQjVnZExnQTJOZDZqQUN5Y0h3TFF4RkVVU1I1QVN2QVJEQjBoOUFRYjliWElnQ0drNmxVZkFQWVRnRVBBSVRLZ2cxQk9iazU4c3JUSmdHNThXTWtXTWFBYlFRVDFuYzhySEdBTkFKc2M3MUVBRnM0UEFhZ1Flc3RnQzFsc0JKNEJNQ1NPSzZkRFVjd3FxYUZpUXIvMFFlQUFBZGp5K2pCaVFRZWVNU0JaVDNuQ1BVRElhOXorL01JQjFnQ3d5ZkVlQldEaC9CQ0FlUVN6Z2tqRmZHTEJCRDVueFE0RHhOMHd2M2hWeFg1VEJHRHdMNW9ieHZWQTVZcVlMNUJlTUxkNjZZWXhKcFJCMGdLKzk2TENBZFlBc01ueEhnVmc0ZndJZ01yaFVQS1EyQytCejBQbUJUcUJNUWVoQWJEbElqajRGODBLSmd1U1ZaMEZ1WHBqb0NPZ1hhd0xqQUxoYlQ5ZU9NQXVBR3hxdkVjQldEZy9sMUlFMDVFZDB5Z1pueUhkejBWd0NxRVBJZk55eDBRUXZ2TERGUUNwKzhuZlprNXVuZDh0WHdJZ1djSFNOWDBOMkNKbW5BbDN2NlJ3Z05uaGwxN1Q3SGlQQXJCd2ZnaEFTN21WL2hleTJKUzlGdk0zQkxwVVVpMVl3RFJNWHZrUllKb0FsQWgybDBkY1owNHM2SlVURElqeUJjcmw0eURjL2RMQ0FkWUFzTW54SGdWZzRmeHdLVndKZ0dFSk5tV3R4cFFNcFg5b24yZVJoVkErTzU2QWpNZm5QK2UzWHZmM053RzR4SVBUbGVpWTU1YnBHaDZVYmFmTlUwbDB6MHArNUpoNUhxWUo2YjUxblA2WFA4Y3gxMlhOSFFWZ0lRQi9iRlBWZzJPQzdRK1dnVkZXbmcvRnZ0V0xJMDZ1V2g1b2d1S0VjWFZTLzlzRUFGLy9WR0Q3dDRFVERnSmJGNENOaThDR1pXQnMyZlBML0g2VndwMktFdFZrNGZKK3YvRUlZUE45d0thNXF1K0luY2ZQd1hIVlplL2FPTDNFYndTN3h2OEExclF2bk8wajhQQXJUZ1RHWjRCeEZ2OW1JeGhPQ0dzdiswT1BZRFJnaGNMZmtXa0V1cTArRzAweDRPdGZER3orZDJEYkhtRExqTDhzaThBWVAvN0NHSUFpRUVNVEc5MnpYcVNiSCtkOVIyYUEwWG52TytKanRoaUlyT1ZESEhQT2tCcnpVUUFXQVBzWnAzb1BEcGEvWGFnNkVWa0xCSys1ckFuSkMzL25Zay9BUEQ3MDRXaUVBVjhPVEh3WDJMUUgyRGdGYkpnRk5yQmhqZDhyNzlkZUdvRXdzbGxnTkJPenk4Q2Rqd2VHOXdCajA4QUlBY2kyRDZIYWZteUFrNC9aN1NKNzJoR1lSd0ZZQU1ETFR3T0dwNEZSRmdEM0hoenFSR1FpeWV1cnFPZEc2cjBSbThJRVpqelJsa2lxQ1dvRWdLOEF4bTRCSnU0SEpoeUFiRmhEeG1iREduWk80ajBTZ0xHRGtwaWJnRXE2NlRKdy8xbkEwRjVnZExwcSt6RHFGZmQ1TE1lV3F1NUhOU1QwdUpPSWxsZytxZ01XZ0krSFB2MHh3TEEzZ1dIcFcyc0M0NDFnQ0VDYm1LemlhR3JuVWRNTzRhSGVoNk14QVA0U01ISTdNTDRIR0Q4QWpIdkhKR05BZ3BEZ1kvY2szc3RpcFJlbXZWaGMrdUFTTVBVRVlHaC85ZElSZ0d4OFkrTU5iUi8wMHVWdEgwd0V4OTRqL3Ywb0F4YUE4RWQrR0JpZUFZWlpnNWtBREMwUVdHT0Z6R0psY0dQemwxQnhOTFhEOHNrNHhmdHdOQWJBL3d3TTN3R01VbXhPT1FCbkhYemV0SVl2aWJvbm1TaXVZVE5qcmlWZzdnbEFpd0JrMGZOWkg2K1BtWDlQNmtmTm1DWEdwZnRKN1RnS3dCSUFubG4xNEJBQVl4TVltNUM2UmpDeUNvT3lyMHFrRC9jK0hJMEI4RFhBOE4zQXlDUXdlc0QxVlFLSDdFY0FTbTFRK3k0Q2tOOXBVS2lWRjVuTHZ5K2ZCYlRVZDhRQmFIMUh2TkJST2ladmZzTm5yRjRrY3ZQd3Bkc0JMQmVVMThOZjdBQjIzRHA0ZWNIQzhvQmdVbEpKZWNMUys3K1dPcEUzZ2JFK0hLdyt5b2V2Q1lrTUdLcVBKcmRFS0FSdXRhRllSczFmaUVaMHdQOENETjhMRE84RlJxWXEzVzEwcGdLZ2ZZTGFZQ3pvb3RnQTZLWGFUQTkweTM3NFRLQjFzQm96eTc3eEhGWjUzNnV0UmdBbUVhdzZnNWtVU0Zad1NYbkEzMzBxc09sZmdITVBEbFplc0xBOElPam9MeXBQV0hqLzExRW5DaVZ3a3o3a0FFeHRzR3JhWVVXZFNEWDVUbXNhZ0w4S0RCR0E3QmQzMEpzVzBvV2l2bkVPUU5QN3lHVFNCUjEwMUFsWlNVdEd5ZmdaRGtDV1kxSG5KZGNCVmU2MzI1aFR2ZWxnMkNRalpORHlnRy8yQW4wajF3S25MNnk5dkdCaGVVQzhwclE4WWVIOVgzOU9WUVNjN01jNmZDYUt2QWVIZENJVmY0eU1ZQ3luVHBYK25iOTdOSm1sU1FiOHI4RFFIbTlZT0ZVWlRLT3pvWEdoczZBeEYwSElleGNMQnZXQnVpSE44czJuZTk4UjNxYzZMNFZ5YjJvQlZqZm05TUlGSGJqRENoNmtQT0JiUW9HK29XOENPNWJXVmw2d3NEd2dmcjIwUEdIaC9YLzFpYUVJdURjQ1RJVy8xUTRyRnY4T25ZaVczYytXMmlLd1VqS2J5alFOd0wxdXVSNnNBRWdEZ3ExYnJYT21WODFQeGhOQjZEVURCU1l6UUp3RnR6NjIzWGNrdFgxUTFWV0thVEYvelpoVmF6QlZZQTF0WDVNYXpzR3ZvYndlL2pRcjBOZTZCVGg1dWYveWdvWGxBZkc2MHZLRWhmZi9yU2UxaTREblRXRFVBQ1kxZ3VGVERxTFlkQ0J2ZjZESllTTVlBVEJmT3gxa0xmajF2MWF4SDEwblEzU2QwR1VrQm5UZnBlbXRCSmdzZUlLUUFITFFjVnhhMlRudU1XMEFxdWk1ZXM4eEJJZWdWZFZWRThWaHpIbkxoNjVXTUI5QW4rWDE4SzZhQW4ydE80RVRsNnZxYkt1VkZ5d3NEd2hldnFnOFllSDkzL1JrNzBKRTkwbm93eFpiSUpqdlMzV1lOU0dVd0dISlRwUHh3d2NiQnVCcmdSWUJlS0FDbjdWdHBkVXUvYzBOSnhPOUJJeGNLdTRUVE9EemJrb25QTG9hTDB2eVVRUmIyeThIc0wxY2tmV3pNZXVGaTQwUWV6cWkreWlQaHl0N0ZPanI2L2dDRndnUDdYYjV2c3NURnQ3L25RUmc2TUdSV21EUm9leVRscGd3NjhHUlR3Z1pnbzFnR21YQVg2LzhkdGF5bFNLWS9rb3lJRDlCaHpNTDNxMWdBb3MyQWNPclpZU29xL3BKcDFWdE9EUm05WjNMUy83V2pWa3ZYT3pFdE9wS3lHcmxBVCs0U29HK1ZZOHZCR0N2eS9kVm5yRHcvdmVlNjVOQkppQWpCSVZjQUpRak9tK0RrQ1pFZWlHQU13NnNBd0Rac0pyQWRoRk05clBHaGQ0OTA0Q281b1Z1Q1pQVjZrRDQwRWM2KzlXOGRCVEJzZmRjM25rcHZuQjgyZnAyUlBjczc5ZEhnYjUxTEE5b2ZzRFY2dnV0NS8zUG54Y0FtTFZCaURxZ2V2RGFKTGtZcnB1UXh6Y053TjhBV2dJZ1JiQjhsb0VCelhEd2w0Y0dpREdmdDU4U0NPV0dlZGdqdk9KK2JQdmdSa2l1QStaanpoblFRT2lGTlZibG9hN2wvZm9zMExkTzVRRU5nRVhsQ2ZzOFFiZjdIeU1BM1FWallpaFloTEVOZ2pYOXkvcXd4UW1SVS9hc2ZkMFpjTFUyQ0hWR3l1c0pRTEtmVmk5OENTMTJUNWY3aUVDa0hwc01rQWhDRjgrbnNoV0gySS9qWHNPWU8xNDRHVi85QXBBSXJTM3Z0NFlDZmV0UUh0QUEyRysvNFBXNC8yUFBiek1nbVVNaTJOb2VTQ1J4SXQyL0Z2dXhXVVJJV0NYZzM1N2dmVGpFRE5JSG5UUlhSQ3BINXVnS3dHbDNIcE1CWFFjMHY2V0xZVm0vNWxpbWowNHJHNzYySzJ1WVk5akJrcjkrckkwM05MNVpiY3pTL2RKK0xReW9nYTRvNzdmR0FuME5sd2RNQU95M3ZsL1Q5MzhLQWNqMTIxejhCbitZOWVXUUpSejhZNmtOYWdEaDJleTVFdnhqeFFEOFRXZEF1bmVDQ080QW4xdnc1dmR6UU1tZGt0d3E3cExaUVIrZE0zNCtadW1BeHZZMVkwNHVxT0FKNkZzRXh6ZXRvN3pmQUFYNkdpd1BhTFdSMWxyZnI4bjdmL1JsM1FHem1zaXMrL3VPNzFWOU9GZ1AyZ3BQaGdyN1RHUnFSVVQ2ZHl2cjRhSXMvcG0vMnpWVU5iQlN2Nkc4ZTVwRXYwQ3ZlYzdQbzcrYlR0amxCUmxrdkFNQmtEZVF5dnNOV0tDdm9mS0FDWUJycmUvWDFQMC9vV0VBbm5GRDFZZGpodFh4UjczbVgxMEZmQ0hIRTlwVldjR0FJL1MwZ0tzZkEyeSt0d3JGWnc2SHhmL0YwUGs4Umkva3BHU25NdUR4NVQwaUFDZ1FIaW9vME5kQWVjQlVIVzZRZHNWMi9jTDd2L0N5cXI1Z25jNDJDQ09jZlgxVklaL1Y4V2U5SURtVHpWWHdQREppWHVLWFB4dERCbWE4K2x6UDRXQWdLa1B4Q1VBUEU0djVHekV1TVgwUFlKUExoQjZGSnNjN01BTW1rVnhhWUMvSzlnRytGMSsrOEFRN0d3YmdrNzhJN0dGcFhnSXdGaVJYT3dhSlpQVWJpUjB5Q1VEUmsrY0hmK1lwd01qOUhnZkk4Q2xHUHl2c1NpSDBXU0tSdVlsaXRMYi96SE0vSk9TczVDL1lJQzljTVFEWnIvZHd4Z09XOWd0R1lVQmkwd0E4bDMwNHZEUXZBY2hpbEZicElCUWhaN0VqcTZaUTAvWWhpbDh5NGo4OUF4aWU5REFzRDZGWDlIT0szUXRST1RGa3ZpTjgza0c0ZmVsSVk4RENlTHJTZU1EU2ZzRW92QUVDVUZzVGpIRCt0Y0IrdGtGZ2NYS3ZCUmlyN3F0Rmw5b3dtTzRYeS8xRzNiQUZmUHJaSG9yRk5XQkZ3SGpRQUZjdElnaGoya0JhcncwNklmLytNTTlacVRONkRnc0RvakNlcmpRZXNMUmZNQXB2b0drQVdoOE9iL3RnQVBTS1dDcDhuZ05RdGFkam1UZGx0dk52bjNwZUZZaGdRUWdoK2lVbUVhVUFVb1hNMXlSTG1XdUZMYUU5WitYSUFXQmhQRjFwUEdCcHYyQVUza0RUQUx6d21xbzZxdFZoOWtKRXJBdWRBQmlhMzhUQzV3SmdTMnhJaEF3Qm4zeWhCeUw0RWh6WGZSWHhZc0RUSjRJdnJOTjJKRk14WmNCelZvNGNBQmJHMDVYR0E1YjJDMGJoRFRRTlFMWkJZSDFBVnNRU0FBVStpbUkxb2JIeWJsbmpHL2tKazNVOEJIejh4VlVRQWhuUUlsNUN5TmdLQUdwNUxLU1NDb0F5U2g1Smo3OXZUYWdjeFVhSUJlUk5lNzlnOWdxK0RYaWc0d0d6eStQT05mVDdSV0ZBNG5vQWtHWFpWQWhjQmNrSlFnTmdyTGlhTmIzcGFJRG8xdkhIWCtvQTlMUUJpNER4SmNPVVBKVW5UZ1UyTkpVeVJPczhpckdBUnhRQUMrUHBDdHNGZDQwSC9BRWYwZ01Ra0xnZUFDVDQxUGlHb0xPS3F5ckpxM0svWWE5bU55cjVGdXNOL3VQTFBJZURhOEJjK3czcnR5bDRWRkhhTVpjM2k5UldCTTlqanpnQUZzYlRGYllMUm1tL1lCVGVRTk1BdEQ0Y0JLRFhCVFFHZEFCMk1HQm84U0NMbUV1UzFBRlZBSjNBL05oUHQwUG9DY0E4YlNERzc2WEk3YXlTZzZKWXVHZkt3SkhGZ0gwRTVCM3VlTUNlL1k0TCt4VkhBT1orOUVIY0VnUWd3YmVpRVl4Nmp3VGR6NHFmdTdFaEVKcXhHcXJ1Zi9SbkhJQUVueGd3Qk0wYUM4YVVBWVdOQlJDbW9JbGw0SFRxTzEyMlFjWmJyZ01XeHRNVnRndnVPeDZ3YTcvandodG9Hb0RXaDRNQkoxNldONGxmcjhBcUkwVFZWMU8xZmE5QmJRem92a0F5NEVkK05nQ1FVU3haQ0ZXdkNPYU9GUkVYeVV3Wk9QSUEyR2RBM3VHT0I2d1BhT3orUVB2NVMrTUEzT1hpTjlhY2xnaFcrZDNJZ3VwQkYycFBxeGN4R2VuRFB4ZlNSaDJBU2lLS2lWUDJQYVpTY3ZBS29BMFZEYzZjT2xJQjJHZEEzdUdPQjF6Ujc3aXdYL0Y2QUZCOU9OU09RVzBmckE1MHNJTFZjY2tXSnlJRFNnd1BBVmNKZ0ZiWXVaM0ZKdkFsRUhiSjNJc2dKTEdlZGVCSUErQUFBWG1IT3g2d285OXhZYi9pOVFLZzJpQUlmREpFSkhxajRTRXhiRXR5MGdrZGhCLzZQOW9aYkJaSUdpS1lWYjlHS2FONTBsUkhCTE92aER4aC81RUt3RFVHNUIzdWVNQjJRR00vZ3JiNy82d0hBUE5HTUFZK0dTR1VqQzUyVlgyZjJDRDQrSE8wZ3FrWmZlZ1hLZ0JhSGtjV3RTMEFXaWk5eEcxSW1yTGxONVhSOEw4Zm1RRDA1QlZybUVFTm1wWVNQOVFYK0tIaXFqMi84MitIcXFEV3duYkJSZkdBVGR6QWVnR3dydTJEcFJxN016cTJmcEFmME5xMFJsMndCWHpnbFo0eVVBUEFtRFNWV0RCUEhRakxjZ1RxT1o2elV2ZEtIaDRydURDZXJveC9EbnU3WXF3WEFDMU5JL1FjRVF1SzZXSy9rZGdDVEdDMFBZQVAvS0lETUJnZ2xxK2hJa3JPZnNhQ3ZpTFNvZmNKZ0o1QWRNN2trU2FDai9IcVFLVklHdkQ0c3dGOGJjQmptempzYVEySDVELzZhY0JkOXdBTEI0REZXV0I1QVZoZXJNcDRHS0lZRU9wNysyNlVGMGFTZlQveFl1REc3d0RqcklwQUVSeXRYZjJ2YWpqN3VlcnlRWFNGbDEwSy9PTjNnSVdEd0NMdmpmR0I4WjU0TytFZTR2ZTY1MTN1QjJSMXl6c3FDK3R3YkM4SGNOVmhmQWVhQnVEUC9Udnd0UzNBL2VQQUlmWUZWbFBxMkhIVHV5dWxaQ1RsaGJqaEVURjV5eFRRR2dQR2hvSGhJV0M0VlNYR0QzbjB0TGtNSFhIeHUrWXlCK01sUHdEdVpzNUs2RmxzYkN6ZFZPOUR1S2ZrSE04QUVrUDdCOGZPa3dEY0QrQjducDQyK0prR092S2RBTDRFNEs4UDB6dlFkRVQwYjE0RDNEZ0IzRDBCN0I4SFprYTlXenJEODhONnNGbStZY1Vqcm43RTFaRHZNdEY5REJnZUFZYUhnU0dCMFBOSENENEJMd0xSc0J5QXlYL2lqMC9kRFV4dXFsSUc1aGl4N2VGaHZMY09WVUF0eVBTeWRBRm1PUU5lNkVZR1YvOVpFU2lLZ0lFZ3RiYUQvZ0hBTFFDNG92WTVyNUt3dGpPVS9YZlRBSHp6THVDbUllRHVNV0R2S0hCd3BNb04wV1F6TnRBYVlTczBLNFpsT1NBakdHOWtQakNCUndaMEFCS0VCSmV4WUFaRUFVM0E3T2kxQmVEeW00RURualExVHdDR1dNVzhNWGNLa3MwWU95Wk5sUU9RamNnWUlVSGxsRXpZUTBrdG0rcjZvejhHNEY0QVh3WHdSZDgva085QTB3Qjh5NjVLbVB4Z0dKZ2NxWUpUS1lwVHYyQ0N6eWRkUUpSRE9qS2l2bitEZWg4QkY4Qm53QnRhQ1VBK1lZRXlBVThoK2M2QXo5Z05ISFJtcmdPZ21EQTNqSFEraVd1cENlVUF2TlNyQTlITndxeCttdWs5bkpWTmcvQ1Rmcm1iQVB3YmdLOEQrUGNIa0lpYmpvYjVvMTNBM1h5cFdzQWtHMWNQQTlQREZRRFpNMWlkMGkxS3hzV2ZPcktuQUZYbGlmQ0ZGTU1SY0FTaWdPY3MyTUdBSWZFOWlXWHBsUzZPbjdVYm1QYVVVVFhRcmdzVk16Y1JqNUZvbGcyVjVheVVBNUJXWUt3T3hLVWFmbm9zV2pjSndrKzdXNUYyRUt2bEUzeGNYYU5ZZmlDWXNHa0Evc211cXVnNmhjbGVBbkFJbVBiTzZZd1JwTWdqQ0FWQW0veVFtS1R2NWhOc0FmL2k3U3lOQlNsMmE4UXYvNC9NMXlGK0JaU1lsTlFDbm5WcnBiQyttVG9BQUNBQVNVUkJWSmNhSTdzT1NFWTJOcGFEWExxcFIrdkUvT1Zrc0RnSW1nR2dnaEhvWUpiVFdjN29KdEZXYzY1L2NnMkFZdmgyQUxzQjNBemdWdjk1blMvZjRRZHNJa1Q5VDNjQnJHdElUV1pmQzVocXRRSEluc0VHUW4zVUREdkVERVkvSUNmN1N4TU9yQWc4VCtjMDBKR2t2SEdkMkRBQlVZWklBT056Q1VEcHBDRmhTdWtDQnNMUXJGdFplL0lpeFlRcFN5RW9Kb3FudVBXclZSQXViUWg4M0hObFpCMjN6N2oxeXdtajZDSUlxVVB4dzJYZXU5YngyangxMHd6NFo3c3FUWVphREQ4RUlEdW9FM2hNVkVwaFdnNjZKSXA5MGswc0J4QmN5K2lQSUlhVDFSdEVzSFMveUlBcXcrVlNOUFdRZmU1dGxWRWs4YXVYZ1ZhNUJVc0VKdVQ1dW9saUFiRTVBR290bUlBakNQblI5eERHM1RRZXJuWUFVdXBUZEJHRUZNZjgzT2tBcEhHK1hsdlRBUHdmdXlyZ1NaT2hhczN1NmN3VHNVQlZuMmdUd3lGTWk4d2pIWkFBMU05ZllHSERVTEpEMW04Q3BhOGZSeERhZCtsK1lrZi8zWE52ZDExVStxaUwzOVN4WGV2U3NzaGRERnZnYkkxTzJBd0F0UlpNWnpUQlJ1REZqeGUxWGc4UUVJQjh5eWo1eVlJVXhmUUlrZmtJUm5tSENNNzEySm9HNEZzZGdISHAzQUNvTUgyRzZqTTRsV3pvUWFyU3Z3UTZNU0IvdnBvclZhRmtoK21DTGxwVlI4WitkcURaTG9ET3BIU2lRZUFGRGtCalBybGdDSGdDVWFGaWZnNjdILzl1WWpuNEFpMXZwVEVSVEFBU0Jhb1FKQkFLZU5xSGxMNm13UERaWUFPUk9hZy9FWVJrUFgzNE13SEl2elc5clFjQStUTHBJMjJHN0VjUUtsSkdzWUlKaEM2Q2xVTWlYZkJUYkZVUUFlajZuUFMvT3VBbDlwT09xSWMyQkx6ZysrM1ZtV2dJRVV6ODJjUnVDQXRMSUhRUW0wZ081MnVPQWIyMnNDM0pFV2dSZlBwWmYyc1FCUUlnTHlkUEVJRkd3UEVqOE1sRjJiU2JzdWxnaExmdHFzQ1hxOUhHZ0h5c3puckdnaTVxelRVVEZIOEZMaEFVbjNoSUp3Q04wSExuY3czN3FhRjJ6b1l2dUtOaXZtUUl1VU5jN0d2V3Q2c0hOczI2dHdBNnZoeXE4TkVNQUhseW50RnJEQ2NRZWh5YVBUbCtGd0FiWERjbUFLTVJUaGFrRWs4UThrUGc4U1BMMHF6TEJsK0E5UUNnUjZ1WkdzM3ZmSHo4VHRCWnZrZ0dRckVQQlZBVWcyU2lqNTBRQU9qaVZLSTNzYUFESlJtN2RTTFlXZlNGRGtDZW0vZGhaZU15OXBQWTVRdlNEWVF5VUpvRElLOHFNZXpoM3dZNmZTTDQ5UGNHZ0NBQThwU2NKTElnQVVZUUVtejhSUEExN1N0dkdvQnYzOVcyNGVSRWlCb05RU2dXTkkxSEJrZGd4SlN3MUFJK2RGSWJnT1lta2ppbVExcjZYWEMzckFiQ0h5Y0FneXRvaGY4dnNCL3IyS1JhUnE3enBaK0QzN0hNWDBzM0REY0NVR0xZYXc1M01KNFlVT0R6dXNxbEdDUUFPUUNlanV4QThVVUxVa3hJd0FtTUFwOFdhM3FrTi9SOVcrc0J3T2hJRVBqazVTTHI4SGVLRmJUUWZiNzdjc1BJTUhHbC80TVBiUmVzbFBoTmU0K01pVHBpOUFGR1Y0bkk3TWZ2YWdOUUxoL3BmclluREFTOGFKUTQyQTJ3NGVtMmNBeVdRVXVKVlFUR1dMczF1TDdERzlKMVJqaEEranZZazR0M0tYZU1xaWpwenJ1ZDRBdDl6M1h0UDE2eUdmaktabUNHb29ZaDF0Wnp2djh4WFBGbDRQb0pZQzk3azlGbHdaV0QrQXppL2RlTVpXZVAxM2VRQ0dFeW9FUnVkQ2hJamJiM21KWXdIN1YwUUlLdUN3ai9nZk1qMGFzbjJJMEZYUlNIWGZML2lSa05nTHllVmo4Y2NNWS8vSjFmeXh6VEFYVDIreG9RVmlLWUQvMWhEcUx4UGlZeFRnU3ZRcnBocGhHOTd0ejRTbHFhZm5qN3VrMWtJUURacnZXVHc4QjNqd0VXK1JMeFBnU2lDRVJkUHdQUjcrd0NQZy9ndWxGZ2ZydURrT01Ra0ZjNXg4NGU3MDhKQU1tQ3VSTkJYaTRUSWc1Q0dSekdpQkdFL0Q0RS9DMnIydmNBWUpvaWZ5NjJpMGFKU01oQisySUhvTnd1MGZrY2pRODVwdTNhY2s1bklCUkVxbmVZRnlXTGtBWElKSEVTZTAwQ3l4NVF5ZUw2Ri90eUVjRGNyT1cybjdmWDhkZjBtTUUrL3ZRL1BRamhveTNnem8zQUlTWWY4ME1RYVF4MXBlSDl3Yjd2Mm1ydG1DQmtJTU1lanAzaklKRDFNc2F4YU1aOHY1Ti82N0lOQXNCM0JBWVU0Skw0RFNvMUoxNUFGUEFFd3VRSFpKemtLZlVBdE9ITEpTT1FSV25kQllRdkNRQTAxY2ZuTm9wZnNhQ0phRDJiYUJuNzlRalNUaU9FUDFFY2F3SXBrcTJrZWdCVE5nSFdFcE9LRjhVd3EyTlJGUE00QXFDZjQ2L3JBMlU5L3VWRHZ1ckIwMXp2QUpwaWl3T2wzZkVlY2lDR0YrSWoxMWYrUWtiU2ZNUGZJenF3NTdtRUZaOURsM1BzNUhYV0FZQnlISkFKS1Y3TitzMGNDUVFod1NsZm00bEdaMEtCOEMvckFCZ1pVUzZaSElUQlNFaENvd1VZQUFrc0Y3Y1N0V1JFeXhSd3R1UHBPbGd3KzVzOXNxNk9hSUpJSWxVZ0VoQTFlZG9UZ0h4YTlIVnc1amliWk5GK2ovOXlHUUEvN3BidWpaNGJ3djIrY1dCNnRGbzBOellua3hGQStjdkVBbzQzVkJvRW8yZSs0OEVNWEVPbUQ5RjZ4aENFOFJ3WkVKODBWYmxLdkRsbXp3aWNmcXk5My9vKzhLOFR3QjJqVlNnVzEzOEZySlFUWEJObG5KZ21yalp3YW5vdzlDQlAvckw5d0YwandBR1dEdEZ5b045UEh1dG5JSFQwNW1QWHo5M2RNR1FBUG5pSnNqaUJYaVRieERaRk1GOU5MVVBReEtSNXFlenoxWTYvWVpESDBENkdrZEFrWUpJdlJhbEFkSEFNbVBab1loYjZOaERXdkV5Zi9tYTczN0NYTjdSMVpDN2hVYlBnY0ZncXQvWlpqQURuTTF4cUVWaFlCcGI0Q1VrNVVzTDdqUXZqLy8vNWJ1RHJMZUNPRWVEK1lRY2hZd0c5VklmeWcxTmFac3pGaUNINkRrUkdMemU1L2RnazhJTVdjTUNqZENpQ3pSOG9kMUI4T1R3dkpNOEpFU2hGdXQxZnpNaGkrZVJKcjZMSTdoWVAyTS94Vkx3S05vWmpVVHdSTUFRUW1ZeWhXR1F4c1NBRE9mbFo0a3VrajdQaFo3NWJFVGpCcGtBR2FoTWtjckdnd2hzWGVDeUJIQmoxd21PQlF3dkF3cUt6b0ZlUlY4WmFlcmpLWUF1aXJtUFkvbzlYN3E1Q3lyN2ZBdllNQWZ0Q1BHQUVvWWxCaVZ0RndManRwMlU0aXJqN3lPQU5iaStjckh5cmZDYlRxdUpWNDRPMEYxRnJ3UUdJTVpGcWRRRHlQL2dHU1o4VEMwWlJSc09sVnp6Z2FzZC91K3pwTUJ5TGVoQWZDZ01RQ0R5R1pKSEZDQ2dMWjJmOG1nSTVxYXVFY1Z4OWU1dkFDVGdDVHdFTVdyNVRkSXBXS0piNU12cm5vb2NEc3d2QVBBRzRWTEdnNlVLZXFtaTRpdUR6NGVyMzBvWDBGUDd1NW1vTXZJZjdXOEIrandsVU5BekZubFpDSWh2R0ZSQ2VXenJnWFNTSUJyZVhURlpTZ1ZMSEFwNFVIT0Z1b2NpRUVzbjJQSndsL1hFazBkemZTb2plZXJGZzFJT281QktBdmVJQmV4MVA2N2xnVXpnV1FhSndMQUtSSDA0aTE0SXRnREtFdEdzUm5XeDQ5YjJWa2s5d1VlZlRHcktDRjdSMEp4Wk1xeE44Y21QQXhXY0FjeEdBQktFQUtQQTV1OWxFYUFiQ21LTUkrc0ROMVgzeitybzI0d0VaRmMwVkVFNjRBQmdUMTgwUEY5WmRCY0RiNkpwcWNQdFBrKzFBQ2JtS2pKbmxsd3l1SUx1bkVBV2paSGtCc3JzUlVuZkQwcUVpQzVJSmZ5aXNnTWh6V2hjUDJPMTRSbzRXYkFTZ0FNUUo0OFNKd2NobUJDREZhOHFweUJiU1A3T3ZVNFBRMHAyVzcrTFNuU0pVRk9ySTRWN3c1SW9CVFFRVGZKNm9UU1lrMm1RY3BHUnlIMnN5R2pJRjZFTTNWL2ZNKytDMUNmd1VFeGhDc216Q2FRVDQzbFpDM2UxaEJwRUhoMzZYRXFyQjdTY21xNWRWMFhaeG1WOFd1REZ6QUY5aXdob3c5c2VBR29CY0d0S2pxQWMrMWw5ckxiLzFpZ2VzTzU1eXNtQ3JDOGVpNkl4Uk1BS1RXTkJpNlh3OTh4TlRGVWkwakVjbXBZZ1JBUGhkZHBWaTlPSUVQUDVjWUQ0Q2NMa0Nvb0hQd2FXOWtWK2l3V3JRSFQ4dUExZmQzRjdERnZnVUhVUDJrOGpUaW9nQXFMb3hGcERnYk1qOWpYU3VON2k5ZExJZGF4ekJwNVhWQk1JTWdGRW5GQVBLVDlxUGQ2QTlCSUdJN01mUG1mNFUrNDBIekk4bldncTJQQnhMNEZFa2pLSml4R1JSRnlRUVB6emQxaUFVekNBUWFzMVlPbUFFb0Zqd2tlY0RDL1BBd2hLdzZDeElrQ1h3T2RWSkx4VG9iTWpCZHlJZ2Z2aW1Odk5KN0V2ZjRqV3RkblJZRDFZTkdWdUc5M1ZXdVdzNEpmK21sWkNDWnh3UC9jbko2bVhWS2syK3RLOGxRUVZIUlRHYzY0U0RBWkIzRXkzSmN4eUFDa1RvSng0d0hsK1l3cWxvR0RJQ21ZbVRGZ01RRkJFVDh5eVl6eUFHL0FmV1g4bUNHUWcwQlRSb0h3dDlLVmFQRS9IUTg5MEFJZmdXSytDUkFhTVJZblZkeEhiaGRZOFdzbHcxVjkzVURzbVBJajlHeGdpQWlvUlJNSUpOdm90aStTVy9Ja2QwZ3dBVTgrWHhKY2JHSVRKUER2STZYZENGUkVGU2tuVEI4M3hrYTQwSDFQR0Y5ZG55Y0N4Rnd5Z2tLMGJBU0pRU1ZBYkFZZUQ5OHhVQWU1VTNqS0l3Qm9zU2dOc3VBQllvZ2wzL0l3Z0ZQck9JZzFYYzRacnBBc1NydnJ1eWtsMnVjeWthcGtNTWg0Q0V4RDVEd0pmV0FZQXh3azRNS1BBSmdPSWpHU0VHd3VDYWtSaGVtdzZZdjBVVXdSZjdMMDBMOXBuc054NlF4NGZlWTRPOHBERWNpeE9qc29US0twTVlqU0ZZWWpPQzhFcTNXbm5yMFlZUyswVG1pMkh5c3JQR0xxd0FTTll6Qm5UMk16MlFEOTFsYXhMQjBnczEyR0FoODFjZi9vL09jSHlKK3FqMFMvenhuaFVaYlN5WVdhTDgrUnEyUzI5d293aVdrSlBhbjRNdmdyRERHQWxSZTdLSXl3RElnUjNtZUVEV2c5SGJKZ0FwTlRrWG84bzBpN29WZ3huRWdGcjhGN2pFZG5VNUd2cWZKUUtRS3lFT1Bsc05JUXZ5dnVwQUdIUy9Pa3Y0cXY5b2grUEh4TUxrOGdnQkNSeHZBbUVOK0FpRXp6MmlRZlFCZU5ta2g0SzUyaEpCS09hTmUvRlNMb2JMUlhDejQzclFudTJ5aTlvTVNNRHhzMmpvODMwM0VSejF3c0NHWkVDRjRrZDNEd0VZWXdKamhvTmxRcmdJamxZb2RiQlByd01BWmZFbXl6Y0l2MjdnczZYRHpDL0lSMURPZ0E5YTZEUno0d1pBc1orTFlYdlFZc0hvRDR6aU9Ga2xuYTZZRDMrbm5VNmRaN2JHREFjQlVJbUlBbUVVdy96YkoxaS9zY0dOREppTFhtbGUzUmhRK2wvYXE1N2dVUUNXend3QktQZUxzWi9MRnJHZy9TaFJYQWU2NEFqa3YzMGtBTEFqRjhSMTFEeTNLN0tSd0pjc1VUYXFXU2NBUm91M3cvSU5WbkNIK0EzNm44UnZNM25CNVhQNG9ENkRBVEJZd0diNWFqbE9MT2g2WDhKYUJLUkc3Nys3eWdHWXAxYm4rVjI1LzAxQXpCbndRMXlwYW5EN0tXZkExUURZQzN6SklqN0tnT1V6YzluRmJldFgvcitPNWJpd05oeVg1dVNFRHI1bzB4c0p3THA4L200QTdHYUpVdi9qMy81K0hRRllKM29GUFBraG8vaE5lcUJjTWtjQjJCQUE2WHJ4bU1Ca2ZGQWNpL20wSnB3elh3MFRYdlh0enJ6K1BLYy9NbC91Z3pNOU1EcUNBYnova2VWampHY1FBL1lMdmpvZ3VvMW1Sc2xSSTZSd2ZzaUE1bnFoTDVENm5zY0Y4Z2ZUZGZ4cFMrL2hMenZXZnpNUUNvQjFGcS84YjNWV2FQSURacXNSVjY0REFMc1pIVkhzMWdFdnNxRkFlQlNBcFFDOHBISzkwT3FsNFVFQXl2Q3dOZUdjQlhOTE9QTUxmdGdac0k3NW91VXI5b3VzcDJURXlJSi9zVTRBekMxZStXSUZzaHlBSFBaUkVWd0l0cnJEM3dHQWhpYlRZQmh4VnBlL3hlUHlyTkJ1V2FvTnAzRGdGd0M4MU8rUkFlcEsvYTVMZmU1MWp4cjdKd0E4M25QWFlncTFhc2wweVg1TjQ4K2Y0VkVHTEFUbEsxdkFvNVlCMWdCU1Jtc00rTkZFNTdsY2ZQRDVwUEZXQ0pJbXR5dkdnR2ZPQWFjQllPNTl6RmdsZ0hnUGVmWnNYVjYvZ1BYQlllQzBSVmd5Sk5PR1l1SmpQa2E5ZUhXZ2pMOWJXemhXazAvbi93UG4razhiZ0ZObWdZY3NWZmxabkJSbUlTaHRKTS9tN0pHaWJHQm9PSUllejl3S1BQNEFjTnB5bGZiTmxHZmRJKzlOakJqejhKVnpwcGNrWnVKK2RCdzRhUTQ0ZHJrNmoxTElZOUprUEQ3UDRzMmx3VkVHTEh3Sm5uY3NjTkloNE5oNVlNc1NzSG01bmRPdTFCR0ZUaEo4L0s2SnJadG9zbFNUMitYSEE2ZnRCMDVaQUU1Y3JnQXVwczVUZmFMNkVGK1V5SWlmM2dBY093dHNYZXA4MmVJWVk5SmtYcE1nTXAvQWVaUUJDMmI4T2R1Qll3OEMyK2FBTFF2QVJnSndHWmhZN3N3RXpiTmE4OElSdkFWTzFxa0Y5MUozNkROT0JFN2VEMnlmQjQ1ZnFwaExuZXZ6ZEdlQktCZkw4VVg1L0NaZ3l5eXdlUkhZc0Z3eFlIelJOSzZvZXRTQk1ETGpVUUFXVFBxUG5ncHNuUUsyemdLYkNNQWxZTU1TTUU0QUxyY25SNkpZUUl3c29VbmpwRFJzdE9MeTdjQkpCNENIVUd3dUF0dVcyblVEVkgxRUZVaHljU3dXakdENjRtWmcweHl3Y2FFQ29JMHo1UDNYNVA2bldsSGRnSGdVZ0FVQWZPWU9ZTXRCWU5Nc3NIRWUyTGdJVEJDQURrSXpTSlpYcENPbklnMjV1UHJoZ251cE8vVHlod0xISHdTT213VzJMVlNpazJwQ3JEc1Fza3pOSUJHSXBCZEdJK1ZmTmdNYjVvRU5DeFg0eVBSalBqNHhhSjArV0dlRUhSWEJEVXoyTXg0RmJEb0liSnlwQURpeFVBRnd6QUZJOEtVSkNoTVYyU1VhQUdjMWNFL3hGSmVmM0ZZUnRpNjRua3FXRHJxcUVoYnJzbTV6dlpDZFBDZDhuSHpKT0xadUFCUno5aFRIWndQTDdMbkxub05NSVkyVnlhS2NqdFpMSE9BYk5nTlBuZ0tlNEJhY2ZHRjFwbnlkRCtocGhRLzhYVjVVaUV1ZUxHbkROMXRXWGovMy80Y1R3QVV6d0dQY1JjRkppRHBQdDNGTG1mNXZqd0UySEFRMnpQckV6RHY3T1FnNU9TTStTY1lReTVYYm84NDY1dS9aZkxUSjdmS0hBZHVtS3hWaDh3S3dlYWxTRTZpbkVvU3kyTVdDZGJVSElnaHYzQXFNendIamk5VkxadUR6RDhjWHh4V1pzNWM3YXBtVzBmTUJuSUhLbjVYN2Q2STVucHZSejk0TzdMZ1h1R0lSZUpTYitYbDF0enFmbHlid1J3cWY5aTk3QlFSV29tV0pRN29aVkZ0Sm9xRFgvYi9vR09Ec3ZjQlRBVEI5Z3NmR3FtemRqdFZ6K0crUEF5YW1nWW1aQ29EakZFMmFuQ1ZnMUNlSndPTW5UUkIvRG1VSU5Wa2tnaWEzeTA4QnRrd0RXK1lxQUZKRk1EMVZBQXc2WEc2MVIzMU85L2ZkcmNEWVBERG1ZMHpqYzFVaml2QnVBTXgxUWRNQitXQVlYVThkaEVVMTZkT1NrcHBiY0hGU3JuZzhNSHduc0dNUGNONXlwVVJIcDJ4TUlhN3pEejJ6OEduL2tWZTBZb21PMHdFd0JZS3VqTDd2L3pIQTZDM0F4Zk9WaDU4ZzVBc1p4eDRmWk03c2YzaDZCY0R4V1dlR0JaK2NNRUZpd0dFSEhSbkR6dW43T05Icy9kamtSZ0J1bnFsMFZET1NISURVM2N4U0Q0YUVhamhGWFM0SDRTMWJnVkdOMFY4d2U3RTBGaDlqVkRHNk9icjFMSk1Sd24ra09DYVRFWVQwZHNmcVpIWGwvcDdQckxpOXdJWTdnTzBIMnlBZ0NBV0NXQ293S3JZRThuTUxuL2E3UFFuOVg3eklKUFBrQ2NLKzc1OHk3eDdndU5zQjZsOThnWmpMTFlldDNBeTVuMHN2NFIrZkNZeFBBMk1Pd0xFQVFMSURQeVA4dUJnMmNSWW16RndlQVlpbEtrbitPQzgvRmRoMENOaEVBNG5HQTQwa2Q2RkVTMTNXTE84djFxSEtBZmg5QitEb1lqVTJBay9qcy84TkFJd2c3T1ViN0xDQytXQWZCNENwQkpvSWlUUk5SbVMxbDEza3FXaDNBZHYyQThjZHFxcDFNQithSU9TeFd2NnBxNUQya2tJQXZ0OHJGN0JMSmtzTi9qTXFmYTd2KzcvQWs0QjNBNmNlcXBhc0tNcTVha0FtbExXWTM3dDhaVzk3UERCMnFBTGcyQnhnQUZ3QU5FR2NuSTVKY3JEWlJQbGthWEw0dTFLSlVBZkFqYlRRNTl4NmRTdmRMUFhBZ0dZc2haV1I2SklSYVhCL053Rkk4QzFXd0xNWHpNZVN3TGZjWHVLckEyRyt3ckxDRGNOL0lJZzRFUlJuMHF2eXlTQVFYNm1HMVh1QTRmdUFiVE9Wd2t0UlJyMk1MQ29ReXZFWi9VWS9Xd2pBajNqdEZKWmtVNzlnMWdoa2dFQmY5OCswVW1iLzNBMk0zbGtCbC9mT2NkTW9rMkVqa1p5djg3NzNMQWZnSERES2p3Tnd4RVV3OXlhaWxwd2R4QkFFWWhCYkF1R3pHM2FLa1FFSndBa0NrT0NqbGI3WTZTWXlmMlV3bEFTK3ZLWW5BWGpmTm1ERVg3REVmQTVDalVjc256dmJ1MW5EdFVNbUNEa1JaRUV5R2RsQWs2RzZsUVRTYTZtME1QNkh1WTczQXhOVGxjSkxaNldPSllDNS9DTnhMcEhNZ2RLSUtObDY5UXZ1Ni83NUFqSE9pVFU4N2dLT09WaUpiNzQ4QktDV3JuSy9tYVRBKzU4QWpNMEFvN1BBNkx4L3hCQXVwb1lEQzlva0JSQW1QZEJaNDdsTkEvRGh3TVJzeFg3bVBnbCtTcm1LNUVhUk5Sc2xYRlE5Q0tCOURrQURuNzljWnRrSEZreXNKMTAzZUJicWxoOTdEcG1UUVRZZ2s5Vk54dSt4WWJYS1UzbGhGb0pQT2dkRkdZK2xQa2dReG9ra2dGOVhnajRBdmZvRnM4NGVYNEtlOXg5ZklDK3RSZkR4dnZuaWlmMzU4c1NpcjJMQ2o1d05qQktBYzhDSWkyQXh4TEN6SUFHWTlMN0FoR0lLZ3BBVHc0bDh3VG9CMEpqUHJmVGtwK1NMUWJIck9xbTVqTnlhalM2VkNNSXBBcERBV3dRNExyR2dYcXpJZm5xNWN2MHZOMFpYSFRJbk1FNUdCTkxiMURHZE9ZUXNJN0FmR0tGamxncXZlOHdKd0c0VCtmdUZBRnl0WHpDTGIrVmdXbkgvZklHWWZjNDZIczdpSEM4WmtQY2RYeDRWZlZYSnc4K2NBNHdJZ002QUhTTEtXWkNURVNmTGZnN1dzSXlSRjNja2lSUStIQUNYa3dIcHR5UDRLSHJwSnZLVkduT2hSRjllQkY5d0UwbVVFb2d6MndDK1dHSS92VnhpUVFJeEFzOStybUhBNkUxWUZZQjhESndRTVpsME9yTForK2k3c2ZUOHpyb1lITFM5ZGY0UkFDV0t4U1p2TFh6Ry9mUUxacWsyZ3FuMi92VUNVUTlVWmFNOXdEYVBlU1ByQzRBNUMxS1YrTklUS3dDUy9TaUNSL2pSQkRsTG1QN25IeW5zeG5vMUlQd0pTeVJwYmlNQURYenVQRFlmWmZCVEVvQW1jdVZRZGlhVzB6d1h3UXNDWURZbU1hREExd0c4VEJTdmFvUjBHNzdFY0dTRVQ2aGpPdlZBcGZSUEFVTjB6anI0NUp6VmNTcWlUeEQrVmVHelhrdS80TnI3SndESk9reEZJd3Q2ajYrUnFVcmxrTzRiWHpwMWdDQUF2MDRBemdMRERzQmhLdWdMRlV2UVVoVHdDRUtibktDdzE0SHdKOWNEZ0dROVdlZ1JnREk4WEVjVkVEdkFsN2xWbGdsQWdpK0k0Q1IrWmYxbUxHZ01tREZoQkdGZkRDaWNSSkZFUnZpU0FCakxTN0ZDME1GS01VKzA3d09QRTBrR3Zhb1FnR3Z0Rjl6MS9pT0Rrd24zVldvRVh4cmVzNWliOXh4MXdadWZCQXdMZ0FRZXhiQUQwSmlRd0pPdUpCQTY4L0gzWmhrNiszQ2lmcXF3V05NS044d2pLZ2JrNmdXSmdDK0ZNYUJiNXZKVm1zVWJWMnZDcW8zY1JXWmNDSUFDb2F4NTMrdWxrcU5kN2lxT2NVMVdjQzljeEVtNWtRQlVkWitzVG5TTC9qRXRUV25naTIxamhKTkpCaXZaQnVrWHZPTCt5WUJrY09xeEtqSjRBR2d4ek1yQlZ3ZEFNbUhyWk9BWUYybDZ5L213VjZ4RDE3em1XbzZNYlJ5ZVd0T0h3eEo5MUlJaHI2cnFaUzcwRFBQTFhEVlVyZkJ3ekhLcjFFVXA2L2gwVC82TC9HY0Nxc2x0NElob1Rjd2RBcURTczdJNjBXUUg2UjMyOXBIdUZ5dVhESm1FanVPU2JkQit3U3Z1UDViR1VqbXNBNVhvVXZjdkJYS0tBUW5BcFVkWHdhaDBiOGpYUjJZekpUc0MwWkhCMzNGTCsyeWlYM2gvMVllRDFmRlpHVDgxZy9INnlxa1ZhOVlFcHFNaFRBRGxlOGVySEE2dDdNaDZqNFpCWGRCR2pGeU80Q1NJbTl3R0JpQnZncXh3SUFKUWxYSXlFSkx5SS9pMFNrQUcvRmJoYUVyNkJYZmN2KzVkTEtoQ2c0ejFDMUhFQko4K0JPRFFHWlhmay9xdUFaQzZrZXRBWkVRQ1RXQVU4UElKdDBmZ3dIelp2VldOYUtxaTdKTE9tdERXRnk0MmcxRnhIL1hmcUdrSUkwQythMHRuRGtmc0d4UWpuM1ZQc2s3dFhtdXkrWHAwSmh0b0pvc0FhRmNVQUpVWUtpWUp4Y3FIcUtBSDlyUGxHMmNNcm1DVWJNWDlndU1McEdUY0NNS0RsWkdoTUs4SVBuUEluMVg1UEEyQXdlZ3dFRVltREdCTWpPSTV3aEdRUDNOUEJUN1ZKbFJOYUt2RjR0MklXSGJERXJ0RGxTazFwNGxKNy96ZDI0NnRnbEdacnlJZnJGaFE3cFU4V0NBWDBaRU5HKzU3VTE0WjRZckNlTHJTeFhkZXY2VGZMd3JieFQ3em5NcmZLUVhmSExRQ255dm1SSXYwUTM0MzBlek1tTDk4UDM5M0czd3F6NmFtMU5ZenpvR24rc3ZxUm1UQVUyY2l0Y3RxQVgvMkVJOEY5QUNFbUxIWExaR29GeHRTbDJ4eUsyYkFZd3JqNlhyMTIrMW5vTC9qVVRDRDl2dkZybjZ1MHYxL252R2thb1ZCQVFpMGV1bW1NQXVYUUhNV0pBQTdnQ2l4RzhVMGdGZmNYZGxCS2s0WjZ6RUxnQUpmWkVLcnhwQzF4T0lsLytTazdqa2NkWWxTY285MHk5K2dLNnZKclJpQUREMHBpYWQ3UnVGbzN1ZE5DZ2Z0OTR2Q2RyR1huK3R1amdWM1FBY0hMY0Zucm9lbGl2SGtjaEVMOHVlMHVRNzRTM2V1YkFJVFMzSVFoS2tNUmpCTW9rZ1dHM0wvLzJ6M1ZTblA0VkRnUVd4VUVFVXhBWkZITDBlUjNIRGZtM0lSYkRIa0JmRjB6eTRFSUtOaFN2cjlnb0dFQmR2VHovTUlZUUxRZFZzVHdSVEZEajVqUW1kQXJSRFlKUU5EU3M5NjFSM3RQaHg1TlhvVmdveGxlSG5hcmpvaGdMZWMzRDJISTQ5MnlRTnZJd3ZxTzlmSm05ektHYkF3bnU2RmhhUDVwRnVNZy9iN3RUYnBCZHZUejY4Y3ovekk4YXpWajhpQUhUcWdtRkhYRFVCODlSMmR0YUM3dFVHdzRrRE9nRmIwUjJ3WVJER1o4ZzlPOGFVNFh3UE9jemhpd0dsTWpxcUxXaUZZR3U1NzB3QURGc2JUdmF4Zzhua293N0U4bk0vYXRmS3psbjYvMW1TNFlIdjZCUTQrWjBCYnFIY2QwTnd3WWJWRDMrMXlXaFhKeFBCcmJxOEFxRS9YQXBTcUF4aUJWMk1aLzU0RE1PWndLRTAwcm5EVVdjUjVLaVYvYnJqdFNBTUFMSXluKy9tQ3llZWhqSVlwNmZkcnZWRUx0aDhSQUNseUhYeG1oUGk2cjFtOEZNMHVjZ2s4K3k0UkhDMWtBSy81WGdXKzJoWllvZmFmV2NQcTFCNUFxRHFFWXNRM25lcFIyZ3FoVjJ5aW9sMUNPa0QwQythT2FvR3g0YUw3RFFDd01KN3VWd29tbjRmbTdWclgydS9YQWxFTHRoKzVzSFB0TitsL0FwNnNYMmRDc1ovcGhaa0lKZ3Y5bCsrMXdiY3ErMldGdjJOWElqTktBUHp1dzdNVUFWOERUdXluRklFc1F5ODNSZ1RBaGl2K05nQkFCYVFPR0UvM213V1RMd0FxSG5hUWZyOUdud1ViQVJnRE5CVWxrcHpRYm95WUN5WURZZElMZGYwbDROZHVXOWtHb2E0Z2VOZGF6TEVsS29BM1ByeDdEb2ZpRVR0QzZYdkU3aEdFekpscGNpczNRZ3JqNmQ1VU9Kb1lEY01nbHJYMit5ME5QdGw1VVpVamtmeC9IcWJlY29lME9aemRGMWdIUXJsbjlCaGVlNHMzZjNaeG00TXZBazlWU0ZkVUl3MGkrUTJQYUJ0SVNpQlNTRmdDWU1qTVcwME1QN3B3dnZMRG13RmdRVHpkSHhjT1NHdkJnL2I3WlJaQnlXWUFsT0VSbHVLTTNSYTlDS1djMHE3M2RUQmhNRlQ0WndJdzlsNUxycGVzK0hqZUJpR0NVT0tYZXVCdlBjS1RpRUlPUjBmK1JoREJNWWkwTGhlYTRHVGFhNU5iT1FBVkR6aGdQQjFMYTVSc3NWM3JJUDErN3l5NU9BQURvQWNoRUhCa0ZiS2ZHUnBpd2VBUHRNczVJRk5va3lPR2svN3JBWUM5T2hCRndOWFZZMWF0NXRmdENCSGFXVlMyQUpkRWNFaW5yRE5DK0x1bWl5YzFCOEFCNCttdUxBUkFYVERDV3ZyOTNsUjQvWjBYdDZPREZRa2o4V3R1bUV3SFRLRExRZWpBZk4zdWRzL2Rmam9RZGF0R0x4YjhqUUJBWXo2L2JveGlGZ0FWdWR6TkljMi9zM3hMazFzekFPUm9CNHluKzJEaGFBVEFHSkN0YnBrQ1lxOSt2NFYrYUJnQVE0aTY2WHRhQzg1WWtEb2cvemRadnpVZ2ZOMU43YTYzM1hxdjZmZTltc0RJSGZOYUI2QXkySlJFMUFIQUVESWZJNW56WkNMZU40TmJtOXlhQStDQThYU3N1bDZ5cVYwckoyV1FmcitzcGxDeUNZQlIvSEp5S1g0cGhzMFBLQlowbHFPWVRwdm5pQWlVQW1BZCtIS2pvMWN2RGpIZ3IrM3dQSlFzVkN5bVVaclBNdVJzUkJERzRBUUNzdW55SnRGR0h3QUFJQUJKUkVGVWNjMEJVSmx4UW9INjJxOFNUOGNnZ3BLTkFGUkd3Q0Q5Zmt1dmJ3QWt5R2dKRTNDK056MVAxcTkvVDNGMUVaQnh2Wmg1MHM2QUVZQzV5eVVIWHQ1L1E4ekk1L0tyQW1BSWtraXBreUdQWXdYejFhUlQ4djVaTzZqSnJSeUF2S092TlhsTGF6c1hzOWJvL3p0YzI5UG9oZ290cDVKNDlSY2ovcHpmSXdHUy8vM09NNENOZDFkcG50UXBGVW1qRUg0TFlJZ255bi9PTGpMOEZlREdod0piTmdGakk4RElFREE4QkF5MVBGSzdGU0tmNDNjTktydkh4KzhDL3ZteHdNZ21ZSGdFYUEzNUowU3RwdnZ6TC9uUDhSYkxBZmh5VDIwN1RDaGdEUml1L1pMOURzZldOQUJ2WXpiaENEQktvQkFrL3BFb2JHV1RxcDgxOWh6UTEvMGswUG9hTURFSmJKanhWWkZnRGFkMFNhVU81TGtzV1ZqK1hTY0RtdzVVRVVESjZVNGQwblZiQzkxUzNvdmZWSHA1YWw2NGNnQytrN21aQVA3NjhLQ0EwV0QzQS9pZUx6MDkwQ0RjZVZtbEF1aEJsakxncmZjQXc2UEF5REF3UEZ3QmtDQWJJdE00YS9GaU50RVJqQmw3Nlc5ZmZEMkFid0pEZHdGais2c3lJbVJYcmQ1WTJGaklZY256V1BMRXFuc2ZDMHpzcjZxQk1RbWZJRFIvcHlKNnhNaEt5TXJTRGlLRDJ4amE2VEFEVHQwL0FHQXMxS2NBVUNGck9MRjZ0YnRpUlZGYXZUL3d1TUNhN01mVlRsSDA5OFlCZUJjd05BSU1FWUFVbFM0dUJVTE9tSzNMQ253T1BBTmxFSU9Tb0Y5K0M0RHZWb1dYaHZkV1pWT1lxV2dpM3ZPWERVUWhnaWVCMEVFbFZpTVlKMDhIeHFlcW5HOEQ0SUlEa0F6bzUxREtRUUp2QktVbUtBQ3piTTQrNWhVaXZ3cmdpd0M0THp2am1nQ2g2bkJjZ2lNVGN2OUFibzBEOEU2ZzVlQ2pmcFVBNkF4b1FJemdpOEFMbVd3QzR6Ly9EeGNQUHdCYWs4RFFGREI4eUpQcFBaSGVHQ3lDMEtONURGQ0J5Zmg5LytPQXNla0tnRXpDVHdEMDQ3WDBTQ1BNMUlZUWpDdjJFL01Kb0dWd1VVUW9QYm9xME1kcWtXVm43UnRERE1haEI0ZytQNnFoWEZwalZ0a0R0UkdBMm5Lam9zN0l5T3lIRlViSXJYZTBGWHNUdXpJWWZOYjRPMk0zQVRHSVlRT21QbjZoRzZnaTNlVWtRUUFlQUlZT0FVT3pBTE1WaDJwQWxFU3FHRkJBWEFZT01RVmp4bGwwM2lPL3lZS1JBVDBGUVhrd1pranAxcHo1MUxPMlhBVDNLdEQzQUlBd2o0V2cwNWtmaXVVSFlsc1hBSkxWblAwSU5MTTBPWUZ4NzhBemNSeVNlVHN3MkFKdWVJK0RqMkZuZTRFV0t6NU1BME16RGtDQ2tBQnlVV3FzSnphckVhbnpqMnpYd2pFR0ZIdUdZK3BZc01vanpaTDFHOUVCZXhYb3UzMzlJUkJyQzNsSkdtTkR1U0hYK3c3V0M0Q202d1d4bThEbmdMVEltZ0M4cEJjR0J1VFhmLzFmWG55VHVnbkZ3eFRRT2dpMENFQ3lJRmxzdnZKZkVuaDBtaHNZSS9zNXV4RllpMXhab2Y3b09xU0Fhd3dZalJHQnpZR1hidFdYYUNJcmx2SFVhZ1g2U1AvcnVNVllDRWJFcUVDWEFNamZyZWUySGdBMEVTdXIxLzB2dG5Od0dTc0cwUnNaTUUyMC8rL1hXSDZNdWdrL3luZ1BBR3k1R0RZQUxqaUlISWdSVUlyc1pqTTdBeCtCU3gxUzRwZmZmUVZJZXA4ZEw3ZE1Ec1RHakpCK0N2UXhUSG1kdHJ3NGwwQ292RnJ1QzJOT2U5NzVlZ0RRc0NYUksvZUs2MzRKaEJLOTBxMkM3STFpK0d0MGp4RjQwazFjUEpBQjdVUDJtM01HSkFBRlFyR2VpOWlVVEg5eUJVRFRIZlUzQjUrQk9JS1E0M0JXdE50UGNXSU96RVpFOEZvSzlLMERDR054TGkzRnFhS0E5Z1RnZW9Gd1BRQW9JME91bFdUMTFvRXdpRno3Y3diRXJ6TnhXdEVZQkIrVlk3NlZoNERXckg4SU9vR1E3T2NnMUNxTVJMUGx0bXh2czEvU0hhUDRkY0FKZVBZeXlVQ1JJenJUQjh0RThGb0w5RFVNd2w2MWtRUTg3Um15MlBTMnJnQjBhMWNpMThSdWRFSkg1N09zWTAyeS8rODMvc1pkQktyNEZYUVRBcEJ2cHJHZ1FDZzlVRUFNK2g5RjZ1Z0pEa0MzZ0pQQkV2UkdyWW9ZQ0JYOUl4RWNTNUs0aTZjWkFISXc4b1hRNG1MQmIzNVlINWQ3T2VrYWR0VFYxVVpTamFFSVBING5RellOd2dqQUhOd0R1V0dZcFpjN2x6UGZYMWNRdXI1b0JvcmZ6RGYremkweVZUdVNrdXhCSTJRK1BoUURJVUVuTUxvMVRCQ1pMdWZHdy9peGJRYTBLQjhDVE9EalBvaGRZNzhJUW1mRGptVzdZby9kb0FYNkdxSWlBdERIYVlzd1NtZU11YlY4MWtwMTFMNmh5MlBkQWNnYmxmc2xPS0MxSWlLUm15UnhaZ1YvOCsrRFM4QkZyeFhpNUhkL1U2TWVTS2RxRXNFS2hwQlJzZ1JNYkF0dUc0S1UvKzlyeTVicnpQL2xQVk12MUVQT1FlZ2hhcnJWY2daVWhWSEZ4TlBjcDlWRnRsT1drTDQzN0MwV0FCV3lwRlJHc1Ywc2I1SG4yellCd3ZVR29LbDEwdjFrbkRnbzB5N1hBOFBmdjBVQUNuamFLMzNDbzlnSlFBT2U2NEZrTnZ0WkFIUWRqejl2Mk56MkdTYTNqWWVqMlczS0d1WjlpeEdkSVZTb0tUMTNCMnM1QUhrR2hlU1Q2cW4wZXJIdjVBSWdBQVUrTFZmdy93cTNDRUFWN2NsQktEREdaRzkvNW9WWHgvb3lZQVJjemNxSDVHeUg4ZUZwbFRhd0Z2QXRydFhMR3BOclFER2JlanVwQjNvbWxJSFFHYy9FcnpPY0dTUnM4enJoQWJidUwxVGNvL0pmYkxsTndIT21pMmtJY3Mzb3diZHdOcFl0eW5EUWhzRmNndnVHOS9ZYXBHRnZZWDIyelpjQVUwL0d3QTJMSi80QW1HRjltd0ViQnU5OFkzY01GK3VBR1FDajJIVnAzQmJQdW8zSWxxeEF5NXdIQXE0T2ZBUm1FQlhHZk5JQmEwQklzRzBlY3dDNjdtZXJIZ1JwWkx3b2NyV2FvdnVUeGV3L1YwdHhKUTJEV2VhZTNXQUdiZGhiMkRCNCt3Unc3dzVnOFFwdjg4bGl5R3RvV0h6TWk0QzlmQUVIYkJpOGt3VUt1MnhOQWRCeGFHQkxiSmRadXgxTHdBR0VDWUFFbTZ3eWZwZWxKckVnRm5SRHhFU3dneVV4SVVzVk13alZ5NUFZTzBiRzg5QXV1MS81QkYzOEtxakJIbFVBWVhzdGVOQ0d3VGVXTnV3dGs0Sk1rcmx6R05pekExaG02OWcxTml4K3pET0JXMGFCZVJaWkdxQmg4TTRlbWZXTkFERFQrenFNalF5RVNkUUZIZkRiWkVDQ0xSZ2RIZUNUZThDQmFLSlkxckRuQlJDSUF1R1c0VFlBWmVGRzhadU1rR2lRMUlFd0dDSnRIWkJteTFvYkJzdlZNbkREM2pJQWVydGkzTEVCT01qR2NPcGEzV2ZENGljOXQ2b3ZlRHRMZnc3UU1Iam5INndQQXliVzZ5YUc0KzhENEhJUWZ2dERJVnRMZWpwQkZzVnZVSTdOSUJIdzNEVWpSekwzckRWdHNZUE9rQVNjdVgzY29ORHluVDJWWUpDa24rUGpxdlVEOGhWYlM4TmdqcGhHeGNBTmU4c0FHTm9WWS84MjRCQ0J0SWFHeFJlOHBMS1pkcE1rVHZYaUoydG9HSHpTTkhEUFNjQXlxM2VyNHFQeUdhTmM3SkNSWFdMVDJUandHbUNPZVFhc2hxNitxU3BabXA4dm9qUXBoZUY1OG5jZFpWakxualdQSHI0VldLVEt4ckhHVXFxOTdxWHUzanAwd1B5K2VFQy9EWU5ac1pBTzZJRWI5cFk5bE5DdUdQY05WODMwWm1rTTlkbXcrT0tmYmRjWHZKTVBkWTBOZzAvN0duRFhLY0RNY2NCUzdNd2RLejhLQ0FLUUlnWTBNV0dDdHI0VE9IQWFzTXdPa1RxZjZ1bnl1THlrZmQyNTRua2I3cXN3L2lWZzdqaGdtU1gzMVZwZDl5UkhlTHgrelJoakVHUmJCNndEWVQ4TmR5bXl1YnpEekNDR2ZwTUpXZlNSWWZyOUhQL2FNZ0JtN1lveE5RSE1iUUhtK0lENmFGaDh5UzkzdEF2R1FiN2RhMmdZZlBvWGdidFBBcWFQQSthM0FFdWJnR1UxUk02QjA2MGZna1JvQ3pqK1RjRCswNENGRTRCbGRaZFJjNC9ZeGx4Z2pKTWV3U2l3TjF6V2ZzT25nZGxqcTNFbVkwOHZtNWkvN2o1eUlNcXB2dXBLeUdvTmc5bG5nWW9zbDl3WS8wZFpkck16WWw4TmU4c0FXTk91Mk1BM3p3L0YyQ29OaXk5OVhidmZ0cmNMcml6NlBoc0duM1U5Y005eE1PRE9iUVlXQ01BTndQSjQ5VWxpdVc2U2FxcUJuL2dHWVA4cHdQeUp3Tkl4d0RLNzZhaERlTjZ1WFlDdVl5QUJrRXphNExicFk1V0VXZFNMeGpGMjYvZFFCMFNKNnI0QnlBTjZOUXhta1djcXJuUTAweDFERURKRmpSOENjTldHdldWUHA2WmRNUTZPVk9DYjN3QXNjUEo2TkN5KzdQZXJrUDVRM3RCWTFQclQ5dEV3K0p3YmdQdTJBbE5iZ1ZrQ2NDT3d0QUZZY2dBdWl3V2xNL1hxRGpNRWJQOXQ0TUIyWU81NFlKRk1vLzVnSEljQUxWMVRSWjE3RlhPaFB0dmd0dmtxZjlINGt2SERseUtLNGw2Vnp2VlNCRjIydXdqT2I3cGJ3K0NmY3dCU2t5ZUZFSEFVeC95dzlKVHlFYm8yN0MxN09sM2FGV051QWxnSW45UXhPMnRZZk5sYks2TXZheGVNUllxdXZMOXJUY1BnSjMwVHVIOExjSEF6TU91Z1gzUUFMbzIxV1hCWkxFSHdSRjFPZ0hTMmVPZ2JnSVBIQTdQSEFlek51N1FGV0ZaN0puWEo1cm5xeEhFdWx2bHp3eVZOTjMrd2VybjVZb3ZsN1NYTEd3dm40cmlMV080ZmdNUkpYY1BkLytwbU95bUVMRWhSekJ4SkFvOWdWTDRrd1ZuYnNMY2NnSEVwV2kzZXBvY0NBTWVCUlU1ZVRjUGl5LzZxdGwwd3B2aEErMmdZZk83TndPUW00T0JHWUdhRHMrNUV4WURHZ3FQK2NjQWtJTmFWcEI4R1R2NGQ0T0J4d053MllHRnJ4WUNtVjBZeExOWWhlQ1hhdTdFaFYzZ2EzTGI4ZzQrUjQ1dW9HTEFEZ0hXcWhzQlhBOEsxQVpBRHlSdnV2dGtCU0FyaCtpOURzUWhDT3RmMFVVZ1cvN2FpWVcvWjArblJyaGl6b3hYd0ZoeUFpNXk0ckdIeFU2NnFBRmhUM3JEU0lWZHBHSHplbmNEZWpjREJEY0RzQkRCUDF1WDFDTUpSd0ZpUUlCenhpZUwzS0lZMVlXNU1QT3hOd0xSYjhnczBhZ2hBc3MxR1oxTytTRkhzZFJQdDBpL1BMSHUrK2RGYi94NG1YZmhjYld4aGZDdFlNRnIvdVd2S3hmRGFBY2c3aXBQQ3ZGT1ZwdW8zSHJDallXL1pBK3JScnRpNlRTNk1WUStMNE5QSDJueDY5OEduWEYwQnNLYThJYWI0ZEZacEdIeitKTEJ2QXBpZXFBQTRKOENQT1F1T0JCQU9WMENVWWJJc2tSa0FlY3J2QWROYlhjL2FEQ3hTcHlUNENFSXlUZ1JnbmVpTElwM25QNmZzK2E0QTROOEI4LzQ4Q1VDK1pHSkEyOWZwdUxteEpXKzVoNWtORmcyamlXSFNpMHIwVXY0cENvWnN4dzhEVWZuaGQ0VmswWEdkR3ZhV1BhQlYyaFZqZGpnQTBCbHBrUS9LOWJtbi9IT1ZxdENsdktFQnFsZkQ0QXRtZ1AzakRzQnhCNkRBN3RkYmN2WXpKdlFKa2lpMm40Tk9lTXBiZ0prdGJZUEdBQ2lGM3dGb0V4MVpNTmUvNGpuUExYdStLd0Q0dC81U08vaU1CY1h1ZXNIeWx5QUNNQlBEZ3pHZzdvcE04bUVISUdkd3JmR0ExckMzN0FIMTBhNjRZcjRBUHZ2T1Nkd0VQT1ZiS3h1K0sycGRLUlRtZEkzZHFrUFBWZ2JTVEJHQVk4QXNBVGpXbmlCZHgwUXhKeWxPRkNjcjZIQml3MVAvQ0RnVTNFZ0VJTVc1Mk04WWtMb2xRUmRkSU4xQXlLV2lCcmV0ZjlNSlFONkhzYUNQeGU0cnZnRGRIT2NPeERJQWNtREZEWHZMbms0ZjdZcXQ2M2dFSUIvWW9qKzRwOXhhQWJCSGVVUE04cUYyYVJoODRRUXdOUVljR2dkbXg0QzUwV3FDRm5nTnNnU3ZRK0R4dTRNdWlhd2h3SUFYVmsxTytlL0E3Q1pnVGhZMWRjbm8xbkhMMm9ESXlaVUxwQnNBRlRCWjlwalQwUVFnbjJWNnVmUmljUzhRUmdiczVaWXBFc0VORGVqQmZwb0xyd0FPamdJelpNQlJaMEFIb1VDK1NPQTU2eEp3TmxFeVRGdzVGeEJQZVd2bHpwbmJBTkNkUTFlU0dUUnliTXV5ZGdNZ2dWQnNLbXRZb0M2TXQ4em5aeHNaTUx6QXhvQU92c2greWREcXRYeDRGSURsOEwvb21RN0EwUXFBODJTL0VSZFRJMjJtTmZhVHVCSUl4UjRCaEtlK3k2MXB1blFDK015dEkvWnovYzlFdXZ5QmVldExBZkdaNVdPTVo5ajIvZ3FBQkIxZk1Mc0hBVkJxaGZUY3lINWQ5TUJ5RWR6cytCNTBaN3ZvR1pYK056TlNzZDhjd1VjRzVBU1JLWWJkSFJOWXdoaERJSFJnR21PMGdGUCtISmgxNWpPWGpueUtibFZUNUNiZm9xK3lKT3N6RjhQOCtWbk5QbElDa01BemRzL1lMeGxZem5ySndJcE82ZWdUUE1xQTVaTkRBQjZpQ0NZQXlZQmNCcVRSUTBlNDYzMFN4WnlRSlFJdk1KOG1TZUxyWWUrcC9HekdmblRwRUlCeTZVUy9vdXQrSzF3ZyticnM4OHJIbURPZ0FWQ01uckVmeHhNdGUxTXQ2ajd1OXp6S2dJWHpjekVCT0pJQjBCbkNKb3FnSWZERWhNNThTV3pKRVBHSmU5aGZWSDQydW4vTWZ4bDliZ1NpQnlTSUJXbkFKQkRHRURBQjhRV0ZBOHdPMy9hK3dINCtyZzRSTFBZTHVsOHRDSThDc0ptSk1RQU91d0ZDOXFNSTlnOVowQ3hoWno2NUswd2ZGQlBxdTdQRXlWZFdBT1RIVmxUY3B4aFhIWkx6MXcwWkE2RURMaGtDc2tSZjBzdzRkUllDMFBRL3ZWU1JBWVBvN1FDZGo3R3FWT1NNZUJTQXpVek14WmNETXdMZ2NLWC96YnY0NVNRbEhYRElnYWdKYytialpCcUFXaFVvSC9ZK0IyRDBKN3JGYTZMWURSbXpvbXNBYU9lS3F4RXZiV2FjSFFCMDhKa1JJdGVTWGlTQkxZSk9MQitYNHhyekF6WTd2Z2ZkMlM0UkFLa0REZ1B6TkVBSXhNQVNTV0YzOFdzZ2t1WEx5WFRSU1JDZS9EZHVTWk1CTXdlNk9iVGQ4SkJqMjRBb3QwN3VET2JQUDlYc0l6VUdGUHM1K0pKL002b1Q0YnV4SHY5WDdCZVk4S2dPV0RnL1o1OEdUQzlYcTVGeFRYT3c5YzNDbTZrNWZQY2pnYkhiZ0FsdlZHMnRIMVQzT2F2b3E2QmxuaVorMTJuNXUvMnNEYk92YXNxb0ZnOHgyTG5iY2QxR2RoU0FoWE4rN3FNckFDNHNBOHNPUko2eUh3RDI4eitGdDRmZHY4VXlxVURyRG1DRUJjcFozOWtMUzZhcTlsNEQyckxiL0tZc0ZUUFdkZmJ2aDg2dlF1MnMxSy9LK3pJalRzWElWUTlhNTlFZ3M0WTZzWmZJQS9FY1NwL2pFWHY4QldjQWh4YUErU1ZnU1FBa0dBTUlDY3dWbE5MbHFUYzlHYnYvSEFBN01yTDQrZjFWbFh3clVxN1N2Q295R2NycldwR2h1dXIyZk5HWXdNOFlUNjdoVDNzMUxhWnZxbjVNTE0wYnptSE1tSUZTZ2RGTmovbUlCY3Q2M05oRlp3RXpEc0JGZ3BEUGVhbk5nQVRmQ3RHc1g5VElLd05yZzl0dVZraGxuZzdUSS9ZQXJYMVZrWEtyRWUxbDJTeW5OMVJDc0ZKc3FuUXYzVUlNeGh3SVJqVTVBR045UVV0ZVZ6M0JVQXZhaHVOZ2pDM0h4TEFORDduQnAvY2dPTlhGNXdDejh4VURHZ0NqS1BidmV2bHpjS1VISDJhZzZjbll6ZXBZQkI5WmkyRnhESmRqb1hKdjFXREZpTEo2TUtxS1pVem9RRlRmajJIbXdUS2NUcFZXdmN4SEttNmtLZ29PUkFFdlZjbFBENk5kekxYcE1UOElZTlBjTFY3eUpHQjJBVmhZckFDNFNOQTVBeEtNOXJ5RFBFNWZzNmVlVktXR1oyTTNTM01RZkV5SlVLVjhMMVpwSlhwVko5cExpbG1sQXhXa1ZKSEt3SWhqakQ5VHRWWFZtMUhkT3kvcEppYU1GUldNK2JvMHJXbDR5TTFON29QaFRKZWNDOHdSZ0F0dEJqUVdkQkJHRVN3Z1NpVjBQYjlEUmd1MFRZMTlOK00xbVJLaDhuaXFGeDNyUkRzTHFqZ2w5eWFHWFQ4MHZjTDF3bkUyNTJQQVpDekFIUUNvaXFvVzN5WVdGSXQ2NjRmVXBLYVJFcjFOUGFrSDZYa3VPUStZRHd5NEZNU3dnVThHU1JTejBVSngzVngvNXZGTmJycy9FaUxSWSt2NEFDSVR3dzZpSkVvZFFLd0JJeUJSdjl2d2hLelVXNno2NlRVR0V3aERTM2V6cXVzQXlOeG5Kbjh4YTFLUlBTRnRzOVlmRkIvUURaY0FtNzhDbkRCVDVVOHJDcWpmYzN5aDhHbi9oR2QvTXNLZjErUXpZSjQ4OTFKeWUxM2l5MWNBRTljREorNkZwWXJFa2lkeEROM090WFIrRndCR01lem9NbXhKTE91bUF1RDRKNHJ4SnJmZEgvWENvTEdGVktpVWJ3K0xBUFFxV1dhTU1McmQ2LytKeWNTSW04NXc5bE9wdDFqMU13QXdGVGlxQVdFVXhlWUg1RU5uL2pJblVWSGVNWFEvZi9qUmVQdkNhNERoVHdMSGZCYzRmckdxcWFOSnpMUHc2aVp4VitIVHBsRkd2WnJYWlQ0NU4zOStIVzNUdWpsWnY4RDZmcDhIUnE4RHRzOVhJT1I1WXRha2dCZ2RycnJ0NVFzcThTc2QwQmhRNEhNd21WaXRBV0hBWS9MYkxEUU5RRGFUVko4UTZXNHFWQjUxT09xRFpEUFZCM1RMT0JlcFc1am1xYUxiZWMzakdnQkdNU3h2dmVtRFlrUTlHb0tGMVNoVUNTS0NxQmVRcnZtZlZaUEMxa2VCalhjQ213OTExdFRKOHE1WGdPTGFRZ0EreC9PZFdBMkVHWjk4Z2JqbGVUSGRRSFFOKzJpd2xzM25LMy9aaGozVmVRaG92WXpkeG1BclN3UWdEUkEzUWlTQ0pVclRuamZsNEtvelJDU0NDZVltdDkwRW9KSmJWQ2svMStGaUN3Rlp4TGs0ZFJmTEZpYTZ4OExiWWtEOXY5Y1h0TEc2K080QVlRUmZyZ1B5Z1ZJY3F5aFRYY1dGT0pIOGZoM3J6N0VLd25VQXJxOG1jR3dLMk1DQzFpN1dZN1plbmg1NmZlSFQvakUzeWxpRTRUWm5jZDYzNmdQRkNLV2F2R2hjUngySitjdnM5TWxTdzBUeTNjQ20rYzduMEcwTUV4ZFc0Qk1JYlRYRTlVQ3ludnlDQ1grT3ZtNGdiQnlBL3hpc1ZnSlBwWHJ6TGo0RW9SSmpKSVpyV0hBclM5aXBySytLY2VmZ2l5QjBYVktHak9tQ21XOXhoUlZNVVN5UkZuTmVGR0VkSTJxKy9IRlhjbGtwOVdzQWJnVEc5d0dqMDhDSTY0V3hSay9PVERjVUF2QkhYU0xReGNWQ0RNUVNXYnp2KzFlN1dWYnorazV3MnRKdHNiY0NZVjZXSlk3aG1Bc0RBN3IxU3ozT2dPZ29NK0tUT0piY2pTSTV5R0lhTkUxdXV3bEFBVS9NRit0RjUvMHNJZ2hWTGRWZE0yUzBiU3pIeDJNaStGVHhYZjhYOTI1TkM0QnljSzhRd2ZtZ1ZYMUxsY0ZpeWtFTWNMMkJuZEpKN2FRZmlqS2Z4TEdEd0FoQnlNN2FDNVU0cXdQek53dWZObk51T0g0VlphQ1BsUG8yQWFocUZxb1BWRmMxNGdhMm0rV0VFTDBjQXo5a2RQck9tTXU4cjFvL3JUc1h6N2Y5b3N3RnMrak82TEFxa3ZDM0dnZzVGZzZtd1cwM0NVSTZYMTJoOGx5ZmN6M1FIcXIzRElsNjREYnFhUUtjOW1JODdRWEFDRDZ2cEpxWTBFVnh6MkNFeUNJNWVNU0dYMmU3VnRJNUo0eVRSeVpoc2NydnQxblF1aXZPQWFOTGxZRVN3Y3lTZ2lWYnIzN0JmZDAvdTMxeUVnZzJGVmFpUENlVk9ndXFBZkdvdjBpUjBSOUpBQkowYm53azluTXh3K2ZPaDU1RWJnUmh6b3pyQlVBMXBvbE45Q0x3b2s1SEVFVVFCakZNUUI3RCtqNjU2UFcrSXJKOE8vYkJDbzRzR0ZkR2VqcWl5WUN4M21LZTkvSnRUaUJ2bUk1T0ZpVGlzZzlMdEpGRjdnWkdEclViSEtzNzkraHl1NWhTYVV2aDFmb0ZyM3IvNnZaSkNpWGdDRHdWVkZKN01WbVJMc3JHbHR1RkNjNjh5RmRBQ01EQWZsd1I0UU0zSFBvS2dJRXh0NGd6NDJTdWFRYjhoQk9FMm9abWx1K0tGbEtSM1FTc3NNSnhEUFdiYmpwZkxvSnJ4RzhDWVQ4TUtHWlNWVEN4WUZUSWI4NG5rQ3hDSVBMRGlieTMwZ1hGZ2hhRjRjMlJlUjQ2NlV1MmZ2b0ZyM3IvZktBRUZ4dnBxTWNkOXlvbklya3VLNUxMVjdNVkNNKy91REpDeUlDMko4YTB6MWl3cXlFU2dNbDE1U2EzM1FLZ210UEVCbnAxMW13dVhnTzcwVWQ0REhXemZnRFlDM3pCRU9rN0hsQTZYS3lIUXpiOEhnR29DU1FMcXN4b3JJeTFCeGllN1d4MHJGYWYrd3I5WHYzMkMrNTYvN0hiSjVWSHRSWVQrR0pyc2VoSGN5YTU3UHlLQVFrNit2QmtCWlBwalBFRXhsd1U1OWF3ZzNDMjRXNktCc0M2dHFIUitNaWR5VkczaTNyZEFuQXNIMlQwOTNYVCt6THIxOTdNVEE4MGgzU2ZzWlAyVXFwQ3JQUTQ2b0YzMTdWcnBlaUtYVEo5TWhNTGtnR2RDYWNLRy9tdXBWOXcxL3Zud3lHZ0NEQ0tXekplM2xxc3l6TFdaV2U2L2tjL29LemdLSDRqQzdvb2xoZEM0aml1ek0wV1BvK2NQUTJBc1gxb2JGQ1RPNUp6bjU2NlB3YlJlaXduZlRXakk0S3ZEb2gxanVoK2FUK1dLU1lEM2k4QXFsMnJKaytWc1ZRbHk1a2tkZHYyRnZIVDYxaWNxTzdGcjcxL0lrTE5YT2kwRlFqVjAwNDZvQnk2d1o5MjJROTVJQ3FERWFMNFhXdzNDT2NmOU13NzNERkI5QXFFNndaQUFTOFh1ekdRSURLZitvVmtxeHQwMHR0QWMrWVQwUEo5cVJGU0I4eG95ZTVYdTFaVmVDU2dDTGJZTFZOc3dvbmNIeG9lTHdDekJHakJOa2kvNEJYM3o5bFhnVUN5SUlHbWhvdmE4M2NSZ081VGU5eUxnUDNNZm1zQlM4eHM4L1U2N2VQUU9xeTl1bUJVcnVEY2hxbzhzSFNkM1BNZlQ1aWZvK2FjazhlRkhJNlFFY25UNUd2ZE9uVmRYb2YrcHRKK0JWUFdjZWlhUkhBOFVzL25rQUNvOG16cWxxbVdyYkZEcHBUNUE1VUlabTdDUEEyVmdtM1Fmc0VkOTA5a0tJcUIxcUpBS0NCRzhac3RaejN4SE9BQWl3bXBESWRuZzFtYVpRQWtaenNIWjUzN1lmUXJ3Tnl4b1ErSGFrcm5TMGgxbVVBMUM5NlRkSlRtT1J5aEMzb2VxZHdST2krR0Roa0ZJNmJZTnJjTkRFRGVBa1h3UWl6UFJwbW5JczNPZHFaUFNhUkZVY2JjaEhsZ2llNmFncTJrWDdEZC8rZDhsVUpWWHVVems4RVJtUysydmZkNHV2TjJWT1Y1clN3YjB5M0poZ0loOXdKZU4zWU1RQ0lnUjc4UStuREVWWUJZWlVyVXBiWEZuTTdDT1NkZjdONElQdnREblQyQlkvaDhDaGgxME1YUWVZR1MrN0dHamFRaUFCcHVOSUZpRUNuemRXSk1JVUhjYXpMcHRDN1lpdnNGOC83RmdMRk1xcGlRTDVUdU5iS2ZBL0RDNDZycXFBYkF3SUtXSyt0aW1SVUJFaU5Hc09Rc3lRbStHcGpkNG4wNDZoYlQ4NEtQdVlqT21ISHlwOTJnY2dEUzJPb0l1VkllaC94eVVrYVZ3eUVXZExyZXdIRTN1QlVEY0tJd25xNDBIcERYTCtuM0N6YmFLZGd1ZWw1Vm5GSmwyYXdhZ2hMUUJUenRlWjBjakxxMkEybjBNNkVQaDJwQzU3V2c0MXBvTHpac0FaTnNvMEh3NmVWUi9KOGJGOVlqV0dtVkNwR0t3UUxCUkNjcmJpU3hOTGdWQXhDRjhYU2w4WURISEZQVzd4ZUZCUnd2L3JHcU9LVUJrT0R6cWdkV1BZQU01M3ZUQVNNUXU0Qng5Sis2OU9ISUYrTjcxRjFPMWdVQitBc0JmRnFLQys0V2k0QldYK0NZZ09UQVUzNndkTVZOVktrYTNNb0JXQmhQeHlpdWtvM3hrU1g5ZnZHTWtxc0RsenpIQzFONlNRNERvSU5PZTdLZWxXV1RoZXppT2JlS0NkQVJBcEQxQWRWblJIMDQ4Z0tVQW1BRVlpNk9oNERKVjRWb0dEV3FqcTRYTGJPNW8xakJvaW1FUGhQSm13dTlGdm5UTGdkZ1lUd2Qyd3lYYk15UktlbjNpMmVYWEIyNDVGbFZZVXBWeFVwR2lMdG1HQmxyVEVoVlV3VjhkRWtWS0FxM01ISjF1elJiUngrT09nRFdGWDZNc1hKVS8zNmxKb0VvQTJBS3Z3OCt1d1RFRElCYlN0ZE9zOGRkRHNEQ2VEb203WmRzekJJczZmY0w5cm9yMkM3NVVTOUl4SkpzRXNIZEdGQmlsNHlZdVV3a25vZkpnRjRYY0VVZmpyeitYN2ZLbzRFSkovL1BrTU9STzZGclZqUU1lTDVrSmhaTU1Yekx3TlpDdDFuekRGZ1lUOGNRd3BMdDRoRE9OMGkvWDd5czVPckFKVmUwUy9JU2dGWTdqOVp2blE3STMrbHlxcFlhTDk4Q1dwL04rbkRrWmRoaTZiVzhBbjFrUDNmUlRMS1ZXbHdGNlJaQ0gyTDR6RERSMGsxSXFlVE5iMk9RU1lOYk9RTVd4dE14ZXF0a1k2SStueTlWRXo2YnRmYjd4YytYWEIyNDlBb1h2ODUrdElCVmdKSjZuNGxmNm9WK21mamRESk5NSDB3QVZGWDkwR01rMWY1VHhsUzNGZ2doOTJEeU4wSU9SeTU2NjVLSWZDa3RzbCtLM1ZzR3RwVk9XT01pdURDZXJsU25qUTJyQituM0MrcElCZHVsejh3cW9uck5QTEtnd0thQzVCM3M1M3FoWFZxNm9ETmc2c09ocXZxaEVyM1YyVk5MQmptblNTTmRyT0xKMXprQXU2VlBSakZjRno0ZlhESjhpNDVoRzk0R3QzSUdqT0ZZQThUVGxRWi9xR0gxb1AxKzhadGxUMU1BdEhLOG1RZzI1ek9aVVNDTElsaVdjYnc4d2ZXNUxuMDRzc3FuSFgwNGV1aUNrNi8zZGU2Nk1QcHVBUVZaQUVGa3cyTUtGdzZhMXdFTDQrbFNCdm1BT01oRDh2a09rRlg3N2ZlTE53MTRZVC9zc21jNEE2b09kSEJFa3dYbGdqSDJrNE5hbDZ3QjRmSXVYOUx6WmpBbW9yTmVITW81VGMwT2V3SHdEVFVoOUhYeGZHSnNZa0FiQUFBZ0FFbEVRVlMvdXZDcG9BY2V3NnpCQnJkeUJsUXd3b0R4ZExaV1hMREZrSHlGOHhHRS9mYjd4UjhYWEJ5QUFWQzFvQjE4SFFZSVQrOHVHZlA3NVNDVXMxbzY0aGU4djRqNmNJUStJcWtQaHhyQkNIamRqQkg2QWJsUWtBZVkxb25kdWtTaUVMbXNVUHBqYnlwN1h1dkRnQVh4ZE5aVnZXQ0xJZm1LZzZCYmhyanVwOTh2M2xWd2NRTHc4Z3FBNXY5ekM5akVydXRsdGc4Z014RFdXTUJhTVZrbUFOV0Z5RVY2UjB1SDJJMUl6Vzd5cGJrUU9UUDVmMmNoOUtzRmt3cDBrUWxEQU9teHpIcHNjR3VHQVF2aTZWRDRSZ21BZy9iN3haVmxUNU1BVE5Yd3FRYzZLR3dmMlUydUdWMnV6ZzNENHVhN2ZEblB3WmNLZ0lkcTlHYUlCUFpiMFlkRDdoZ3lJRldNWGlIMGVRNXZYUzVIY01rYysrOWx6MnQ5R0xBZ25zN0t4eFpzQ2tnZHROOHZXRCt2WURNQVVwY2phN2xPUjllTFZjSVA0dGN1b2IvM0FPSENkVzAyVlRYNjJBcEI0TXYxdjI0Z25QeTlIaUgwM2ZKMzY2S1lIWVRIc2dCQmcxczVBeGJHMCtITFphT3A2NWkrbG42L1lNNUV3ZFlCd0dqMWNtVWtFNys4VEhMTmRBSGh3clVPWHRjck8vcHdoRjRjY3Qyb042OEJNRENmbXNKTS9uNlBFUG9ZUHA4Ykgza0NrYnRqamkydEpKQTk2MllBV0JCUFowV0JDcmJZc0ZvT2Y5cERBaUVOazE3OWZrdXZmOW5UWGV3S2NCU2pzbjdsZG9uV2JnUXB4KzI2b3RhTEl3QWxmaTJRUVNKWTNZank1aTlkbXNGTS9vRURNTS9aN1VmMFJpWVVBN0orVG9OYk9RQzNlMFdCQm05cUxhZDZISUNHMVpLMVhCNVBveG51T09JY3hTWGUvT2Y4eEhWL1ArRnB3TjQ3Z0tVcFlIbXVTdmUwcEtaZ0NLU3E1d3FuaVdFMVdaei94b3VCbTc0S1RNd0JJMTdsVkJYd3RXU3MrOC92TDQ1RmYzdmhwY0FudndvczhkNDhEWlgzTTJoeDlYSUFudTBJSU8wY2h1MzVBT2dMTDB5dUcvak9td2JnMDI4Ry9tTnoxWVdkRVRibTRJNUJyRmxvditFdEQyd0lvN2wrQXRnOEQyeFk3aXczVjVkaUVxTzU0bW5qNlhkTUFZY1UrNmdvbjdBM05TTzJxRmpseVpZRGtBWDZ1RDVJYW00NFlhVWZWTkROeGFKY0xJUFhjR0dwZmk2UG5aZFZEMXdQc3BRQlgvd2w0T2FOd042SnFnK3h3cnhzbGNWRnVZSmJsZWhrY1lZWkdQUzNMMjBCeHVlQmNTOG53ZzVINWtaa3g2VFFTYlhGWmNDUUthZHg1Q3o1bVB1ckFGeHJSYWExN3BBUjJQRkMrRWxTSEtRLzBRalFjZ0N5R3lNOXYzU25zREJSSmdMNm1zV0NmNklmV2VVSmFjOFVGbHBZODUwMERjQ2Z2Z2I0M2hpd1p3eVlWaGQyRC9WU3JLR0FtSURuQmtpYWZFY045Y3BySGdLTXpnTmpTMVY3clJqUmxjZXlycWlmNktBa01nWElNKzZ0QW5EbCt6U0wzNk85K1U4cDlqR0hRbzI4NS8yWEEvQW5YZU5uS0FvckRYSC9BSUx3YlN2TEV6NlFsMitjQWYvM1hjQ2R3OERrS0hCd3BPcEZiRTJ3YWR6SWR5aDNqak5RaXJZV0V3WXErL3pKd01oOHBmK3hLTlN3TTZEWk1tek5SUmJNMksrMklpNlRsRnJBV2ZkNVYzaS9GN0lnVDJMQkY1TGJJZGtxeExQV3Z0emxBR1EzUnBVM1k3QWlpeE14TE9VQjJ0N3BLUThNMHFDVG5wOEhrb2pKZ05xYU1FSmVzUXY0QVIzSXc4REI0UXFBcys2U1dSaXFnSmdZMEhWREFkQkE0QmE0eE43bmRsU0ZBQWpBWVg0SVBPNWRCRE1BZFMyaStKeDdYVGYxZUVkVERmZ0FRblIzNHAvd1FrUm1qTkFvQnlEVC91Z0ZwaFhBbWpBRW44cWFQUUFnWkNzMGxTY2tDTm1WaWdFYkZNc1BCQkUzRGNCWDdnTHVhd0g3aG9BRDdFTThETXc0OEFoQVRyanRRd2lYb3FrVEV3V2Q3TE9uZVhOQ2J6NlRpcS9USW5iMk04WnpJRnJUUWJHaXk5Mm9HejdwWGwvN2p2ZEFKbmIyNDcwSWJCM1Q3N1NhaStoeUFQNXZvVHFXNnNLd0ZBYy9UQWRjNSszZHZjc1RydlBWWVNLNFNRYjh4VjMrNklhQXFTSGcwRkRWaDNpT0lGVElGeHRpdDlvckw1Wi9MRDFRNHMrQjhPbkhWdVh3aGhkZDVEb0xHc2dDQ0owNHE2NlgvSnUvdlNhZUF4RFB2YmR0bWR0S0RWOTBnVkVQSWwveHlTa3ZpT2htQUVqcmx6U2t3ajQwU2xRWllaMzlJKzhKQk14OG1acnloT3NLd3FZQitLcGRWU0RGdmhZd1BWUjlCRDd1eVg0U3dSUzU5bk5JK2JSY2svRHpKMDV2MTJNMG5ZOGZBazhpV0w1QkI1cUFTUEdSQ2k4RVZqenYzbXFwa0M5QUNycndoS3VrQjY3R2hwcVJSb3dRTXFDaVliajhvT29IZVVXcGRZSUJBVWo4YzhXanJqeWhOSUoxdW56akRQanFYZFVqSkFBUDhUTUV6TFlxOXVPSElDUUFMZS9Fd1dlK1FnZGRBcUN6ekQ4K3ZnSWdnMHFwKzVuWWphRHpDZ2ptbkNZb25lMGtscVA0SlNndnZLKzZMb0ZQb0ZNbGtQR2grMHJQV3RhNFJIVE5KSlF6NE04RUFHb05UUFZVOG9wUzY0Q0M5em9BV1RGQ2hjcTdsQ2RjaDZzM0w0Si8yUUZJRUJLQTFQOW1ISUJtaFBoM0FpMzU0UnlBQW1Xc1IvUFJzNnZPUjhaOEZNUFM5N3l4dElsWWdWQi9JN2pDMHJJS1NmTFhGMUVFQitCRkZqUTNqQ0xBNDlPV3NSVFRFUHp2elFFd3J5N1ZyWjVLd3pBUUFQc3NUOWp3MWRjSGdDck9SUUNTL2JnbisxSHNDWVFTdmVhSGt6dkd2MXNjZ1UvNlI1NVkxWUl4aHZPbTFFWmVrUVdsOHdWRHhKZ3djODhRaUpjNkFLWC9tZUhEYXdYOXoxNk0vRW03Yk84UTA4R0JQL2pFa0FFVmpNQm9BRldYVWpSQTNLdE53T0JYVzNFa0FaaHJBTGt0cEM2bEt0VFY0T1U3UkhCKzNrSFdndi96cm5ZWmwya0NrRjR1RjhNR1FHYytNcUVZVUNBMG4xdGt3eGJ3NFNjSEFIcjcxUTdXNCsrYzhjendjQkFtSFZCL2M3QmNlazliM0Z1d2JkRC9rakdXZ3pKalEzdGhHbVZBM2poZk95VStSeEI2RmFtT0ZwOE5yaHNUZ0x5OENwem01UWxWcHRBVSs2Q2lOZ1hDYUlRMEJjRFlWOGIwUDRwaTMwdmZJeEQ1K3c3MkM5YWxpZWdXOE1IenFybWgvbWV1RmhZaTBwS2JzNkQ5ZnNoL24xWEZNcllNYlBnVUJ5Q1p6NkordUVrbkRBOUFvcm5XRlJiMDFXWkVzQUNvSGhPcXlDN3dkZXRUMFFBSzJLcU9iNU1DVXZQeWhMRTBvUXh6cWFZTlhMNXhCdnlWWGUxMnZCeUxBRGpYQXZneEJ2U1BHRkdNSWpDbUpiRVc4SGZudHh0UW14VDBjbXhwOVVQQWRLQVoxdXBBNkVCN3FnRG82b0NVeFhSdFBWU3BBd0pwblVodXhBcVdDQ1lLMU1CRXhabGpZNVM4U1lyK3B4QUZBdUJheWhORzI2anc4dXNDUUxYMFNBQWt3d2NBRW5neVFpemFYb3ppSWxpK09lNy85a0p2TmsxTG1CTWU5RUNPM1hSQjdhUGVGMEVZSE5WUGRUOGdqMDE2WUJjV3RCZkJWWUp1ejdtRjdWZ0dZL3BPOGY1V2RRMS83VTY3bklLTlM3ajB3SWJEUEZac3lOSEhZN29kL3hkbEVIajhDY0MzVGdDV0hnR0FQU3hpU2R0NDMxMnUvOFNQQWw4L0RsaDRwRGVaVzJQRDRKMWM5K3V5RGFJRGtnRUpRS25UZkcvTjhuVUFtdTVIVW5NVzVBUmJQZkV1SUh5L0FDalJLN0ZMNXBPUjRSYXhnVEhvZktsOHIvUzFaV0JuQUdES2VmYm4zQUZJUFJQWEI3c0ZpVlFpbUtWZ0dkbDVvb053TFExLzFVK0RRR1NYUTlyNUV2eTFxOXJaYlAxbEdRRFpzUHB6SThBUEhnWGdvZDdxVXgxMVl0QmJGekMrL0MrQkw3U0FXd2hnZG9Ma09OU0xxeTVvTG9nWWZ0M1pJMUY3RUFDK3Boc0FuZWtva2hQNEhJem1sL1B2dGhRV21QQjlMSjdqeGtjU3IxNGpXajQvMHdGbGdKRDVlb0R3NmZlNER6QVlQSG9rV2hISlozVEZTa240aDdZT1NPQndFdGlNVHYxYVkwdWt0RllUbUkyLzQzRU1RbUN1QUptVUUwZ21WRDhFRmRQcGRueGhWaHF6RHI4RjROTXRZTTlKZmc5OEVWVGVOdTlRMk9GWkJYN3ZyOXZ0Z20vbGNlemN6WjYxWk5OOERDdmlsWUNkUFhxTkRRcEFsZkdUS20wTTZBQTBQVEF5b01TeDY0Y1JmUFFIWHNuaU9USStmRVdERkdwK1FiOUJleVNSQlYya3BsMFF4eEdBbEhEbWtJNTZYNnorRVA3VURZU2RSZ2gvSW91d0laMzZsSGFiQkUwR0owcjEwUmdiL3hBL3R0L2ovNmFNQWYrN1I0Q3h6dUJYV1JHVUx3QmZJclk2VU5mcHZMYWU3bjBJK0xPL3Jlb0xNcWlWTWJXMzhvVWhrTmtRSXpaTzd0SXdlR2VQY21XbEFGVGpBWUhQVkd3WHhXb0xZYmxFRGtMdVRUOE1EUGhYTEo0akFMcGFKQitnZ1U2eGZnSmtuVDdJS1hJUVhoNFkwRlpDb2crd3hpVVR3U2tYVWJTTVYxckIvQTMxT1hXdUZwUFVkYS9tUkhLaTFlNlUraEE3WnE3bCtBK1VBZkR0SGcvTHJwdGtRcFo3MjdjUldPTDk1NDJQYTNyT3Z1T3FhZ1VsdGd0bUpNMDhqNC9QSUxiSURLejZ3NVBBSHNicmFUbk1HZFpXSXdJenhJZmVLMHJuNTc4SjNMQVZ1SDhDT0RSYWhWL0ZGUS8xSXVtSXZYUDFRdWROZnlOVDhvVnFjSHZpUGNCZDQ4QTBnMlJEdW9EcUhkYjJTYWxaQWRHOWRuZkRrQUUwZ1huSDVpaldDRGJLQ3E1L01SaVYwUUQ4SGdIUTYzakcwaGRzTEd4QTN4OUJ3MUFzbGk3aE8zQndBcGduZy9HanZxMDFJSHJYSjdxM0N6N0UrK1l6aUYycnMxWkxaKzhIOWpKc1NvRUNXWGo2aWdtUjg3YUxnZmJHcTRHdmJnTHUyZ2pzSHdkbUNFSVBTSTFoK1NrQ1JqcGZVQzNpTldjcG9ScmNucllidUdzVU9NQm83UUJDeFNURy9pZ3hWY0JJVkdQV00xaDFKWVFQbnlLTkV4R1pNRElKOWI2NmVFQkd4UERZMVk1bnYrR0NqZkdBeEQrRERwaWF3cGhBQldaUGp3TnpOTEFFSUg0WENIME03LzVjOTNiQmZJOFlrMmNnVkFkdmRUMTBpZkRrQldDL3I5bEdINTFOaElzbnNXSE9mUG1FVUtUOTRXZUFHOGVBTzhhQWZXUEF3VkVISVNOUWxLUVVnbEpqSkV4cUMrSDZOcTkza09wVWc5c3pid0x1SGE2NlF6RldrYUZpZVh4aTZoZ1ZIT01DWUdSdUorNVY0allKSURLSTlLbHNBdkZEcThRRHJuYjhOV1ZQaDlFd2RGa1E3OVRsU01Jc04wTWk1czlNb09Hbm80VTZmM1lBdmVmTDdZN3J2ZG9GTHhPQU5TQThmN3hTZ1dtZDBrQ1FibVo2bVRMRW5KMFVxV0xoVWt4bHJCbjZuM3dXdUdrWXVHdWtDc3VmR3EyaW9qblJGcGFmc1U3TUR4RXJKdVpoWUNzSm9zSHRXVGNCZTFvZXEraHhpZ0pnWEJyTW1UQlBuSktMcnIrVkVENTRpYkhZdlpvczhzTytETmNySHJEWDhZVlZ5Z2xBS3VkMEx0TWpGUHROTXo2UUxEWTdWb21MSmQ2NzFBRUg0WHUrM2c3bldxMjhJU3ZYNTgvaGd1T0JnOHZ0RlF2Vi9oRXp4ZnFPZXZ1VGZwanJpOHZBV3o4TDNOWUNmakJjNlpZSG1CY2l0bkZkMDZweHliOFc0Z1BsZ29uQnFmZlR0ZFRnOXB5YnFpVk5Cc3N5VXNkVUQ3ZUdPOWFtbmYzc1h0eFFpcGw3V2cvc0Q0QThBd0hJeVpNWWt5NTBUcC94Z04yT0w4eTA1MXF3MmhYendSQ0VkVDJubWNrMVJ4SEcrdzVqZU85TkZRQnBSNmxkTUlNWGxGV2dWbmRxRjJkVkZzSnp1T2dSd01FbEI2RGNJNnJ6bmVtRDBSbmJ3UWlTUlMzZzdaK3RWSWw3UEM5a2FoaVlabTZJaXp1TGlnbGlUL1ZvVW9nK3A4UDlsM3dKN3FHRWFuQjc3azNWY3pyb1VUb1dMQ3NBQnVkNHlwYUxDVW94ZjlpLzl3OUFEaUlDVUxyUVJXdUlCNnc3bnVacndhWndMQkd3Q2xTcVN5ejNBaEhiYVJHRUZHT21DNDRENzJVVmdqVzJDMlo0bElGNEFyam9kT0RRY3FVR3FBeGZjcEc0bUpWdVZxY0w1dGJzMnovdmVWMHRZSy9uaFRBcWVzWU5IZE81UENKWm9zK1d1enhISklWaXVYRnlKeHVwTkxnOTc2WksybGl6VUtvZGlsR1VnenlHaG9rRjh5dzVNZitxUmtqZGpmdUR0d2trbTdEVGtOYUJhUTJveDFxM2VNRDgrQjZPM0g2ZW04S3gxQ2N4OXB0V2w5aVlJVUFBV3JJM0kzbkhnUGRPdHNPNWVPdXhYWEJkajBWMXZPTC9zbzNDeGVmNjB0bFNwWXd2ZUtmMHBBdTZvaGZkSjhrNENVcWd2cjVqVjZWR1RCS0FMZUNBaCtWYlpMVG5oNWd1NkQ0NEE2SDhjVmxrTks5NU8xV2tCcmZuMzFSNUhTeStKQ3dQcGxBeFJlZ0UvMlQrQWxvR25jTm1iUXlvZ1VReC9Ld0I0Z0hqOFlXTlR3UkFPVzBGSUlJbmRvcU5rVEF4ei9iZDA5WERHTEJkTU02L3BMS2k1d2hBWDYwZ0NLMnVqeHpFQXFHTDJwUTFKaXM1QUpFQUZIdlR1allBS2pSZitTRXVnbTFkMkNPUUxVL0RBd1E0NGNhRXc4QXRaelNJUGdBdnVLa2RyV01NNk03eENNQm9pQm40WXBDRTJOQ2Z4V0FBNU1FdXd2Q0NFSUN3bG5oQUhWK1lPUmZEc1dKR2dQcE1Ld2cxYjlRcEZuekhiRDJCSzJKR3VsOXM4S2tZVzE3dkxBTFFSVENCcHpYWnBTNGd0Q1hYTUFrZHV1QXk4RTdQaWpQV3ByWEo1Q1IzOHlndzFmSkRvaGgyQmxSQWdxMk9lTjd1VFdjMUQwQUZOdG1MNTRFU0JzQ2FKY0xrRGFqeGo1WlhSaUNJR0Ewd2FEd2dqeThzazUrSFkrWDlwcFViSlNDcDZUbkZDTVh3bnkxV0FGUThyVUFjMndVclJMNm1YVEFlZlduRmZuejNGcGJhZ1FLTEFxQXpvWmpBS2trcFhrTk81R0NFdk9NTEZYT25uQzR4SUtPam5RR05kV1NNK0dxSFFHZDdKU3N4VWYrSnpRTHdoVGRWNGplMW5RdnIxTWtQR3RsZjl5UDJEeStnQXFaNnJReXRmdmRIU0R4Z0x3QkY4QW1BWWpIV2x1RURpS0dNaXFPVnZ0ZWpYVEJPdVJTWUp3REpBQVJnWkFHV0w5TmsrSU0zU3pnVHlkRTRlZWMxblpIYnREYU5BZjFEcGQvU014MkVORDZrRDBvWHRGaEJYbWNZK09ZNkFGQ2huS256bDdOZmRNUjNxQ0FhZTJCK1ZWTVlYQVN2RHMzL1gvekhKWmNCODR2dWlxQUJFbzBRUG5obndxUUx5UlVSbVpCUHl0bndIZGUwTTF2TjJsUjZwaWNvS1VMYXhIRElFZEhrVzJpV2c0LzdiNXpiN0RTUUFWZDAvZ3JpVjJKWW9qZnB3UkdFWXNHQnJPQm14L09nUDVzQUtBTmtjYkZ6TldUUm5YL0dTR0ltTVlIL0xZbGsrZ0d2ZFQrYlcrU1dIK0lnMUdxTDVRZVR0UjJFWWo1TFZIZmp3L1pEd0w4eUo2VEI3VVUzVlZvVGpUWXhZREsrSXZ2N2R6TkFaSXhwWlNpVThqaktnSVdUY3lrWmtCYXdEQkJuUWRNcjVRZVRLSTVpV0NCMDlBbUViNyt1Y25PUS9hVFBXbjZ3dXp5UzR1K1IwT2I2Q1VHcUpwSURBOTdBZHFJTmJnUmdCSjY5Q0c0SnA2cS9ja2pYcUIvUktsYTRXcGtPMk9EZ0hveW5pZ0EwSmlMd2FOaUV0OTVZUUtKNEZSQys3YnJLelJIOWpaYk42aUpZdVNIbTlJNWlPQU9oSE5KZlpraCtneHNCS1BiTHUzK0pnYVdEZG9qaE1PNWtrRFdTbE5UZzRCNk1weUlBamYzSWdnSmdNRDRNQ0FSakZNVTlRQ2dBeWtoU0tuVUNZSEI5SkIwd3k1YVRSVXhtdXA0aCtRMXVBbURzK2hwWGdGTG5CNlVMT05PbjV4QUNOSnF4Z2hzYzNJUHhWQkdBaVFHOWFMZWlsV1VKVzFGdlZYRU4wVEtwMUM2QXQxOVRNU0NCcHoxZEh0VC9KSDdOOXlheHA2UWtGNzNLQnhZSXIxMG5BTXByb0I0NHFRR1RqNnNqVXJ0T0ZQdExlRlFITEVTOUFkREZycTFFNk0xM01heFZDVE5BWE5GVGhJeWxMY29yNDB6eHRnREFQS3VWd0RNck9LdytTQlRidFIyTU5EN3Nad0M3UXZtNHdxSGE0VC91SXJoYis3bjBFZ2JRZFRpam95ZythZ1dYVDhsbERzQUZXci9COHFQMUs3YlQwcHZ0VndIaFc2K3QyQy9tOHN2dlpsYXdpMkNLZTM3bmhGdGFwa0RuSUxScUJRQSt2MDRBak15bjc5RUlrWE8vRG56eUNCd1Z3ZVg0d3hzOUI0clJaZ3lQVkZxeWtnRGQrNUpTcEJVNXIwdkh5SHoranNjM3ViMEtBQnNaTUN5UWdlRXhLeUZQVkl6M2xtY002T2ZQQUdDQURZUEU2N0pmczZoN0cwbyt4dmk3b3lLNGNMWmZPZ3BzWHdDMkxxOU13dXVWRVJvbktuNG5TSnJjWG5RS2NNN2R3TU1YZ1ljc1Z4a1NlYkpnek9XUHFkQjFhZDJmM2dwc253SzJMWFdlUjltM2RhblVJVjFsQlNDUEFyQnd0cCs3RFRodUJ0aTZVRFdEbVdBL0R2WGs4TFJwdGZQdE5VbGloWVpUT1BDaTA0R0gzd0ZzbndHT1c2aUFzNW4zR2VKSitLTG9FKzlWRENsUThSNnZPUUhZZWdEWXd1WTNTNkgvaUo4amIxMWNrMHE5UWhvYzlRTVdnUEJaSndGYnBvRk44OERHUldCaXFRSWdXeUpZM2xQb3phR0oxS1RFUGgzNnpwVGtKcmNYUFJFNDRTN2crQ25nMkRsZ3l5S3dhY2xmRm9Jd3ZDd3g5Wm4zUTFEbUlQeC8yL3NTYU11dXNzenZqZlhxMVpSVUVsSmtLc0JFR1F5WWhKQ0JTa1VxQVcxdHNCZHB1eEVWYUJ6b3dYWnFlMWc5MEcyTG90alFkbU1qS3F0QnhRRVJkQVdVQWtVbFpOQkdrUVJOeUlBRU1Ba3hwRktwcWpmVUczdDkvL20vYy8rNzM3bmpQcTl1VmVxY3RlNjZiN2pubm4zMi9zNi8vLzN2Ly8rK1R6MGRtRDBLekM0RE02dkFGcGQvMEwzR2g2eVREZ252THdLekFXREdpSC9UaGNDMk9XRHJFckIxcFJnUWlzSVFoQWErQUVEK0hFRVk2dU5MeXJSblpMU2w2dFNicmdMT2VCUTQ0eWl3OHppd2ZhVjRVR2JkZWdtQTVRTVRMRmxxc2ZuN1hlY0RXK2VBbWVQQWx0WGlYbmt1WlNCa1JjbTRVR1h0VTJ1bzN4c0FaZ3o2eTU0SnpNd0RXemtnQk9BcU1NVkJDU0FVT2JoOFF1Ti9DaVRnY1dBdXlXaEwxYW12dkJiWStWZ3hiVzQ3N3BhYTdnSUJxQ25VcmJVQmlRdWhBS0RVb3QxM0liQmxEdGl5QkV5dnRPNVZEeHZ2VmZ4Vy9Ka1dORnJDZUs4TkFHc1k3QnN2S1FDNGhRQ2tKTmFLeTJMUklzZzZTSjNJUVNlMW9uS0tDMkNzT1lNZU4rMER0ajBPYkRzR2JGc0VabVdwNVM3NGcySXIydUEyMkJTY0FKR0ErZEpGd1BROE1MMEVUQVVBa2dEVFBxOXpkSy8rc01XcFBGMTlOeFl3QTRnM1B0c0h4QUU0U1FDNkZkU2dtR1dSUklKTFpKbGw4RUdLakhpWDFqd2FOMTBIekQ0QmJEMEd6QzRXcnNLTVcycE5vYlpvQ3U2Q0xDRGZDVHF6Z2c2c3Ird0ZwaGFBS1FmZ1pIS3ZwUlNZZzdITjVYQ0wyQWJBWndQclpHYWo2aXBwWGhnbjBrcW1VMXdveG5IZWRnNUFBVHVXSGlnMkZFMXVWUndveG9YK1djYmc4OVMzQXFDS1BPTmNDaThvUHRWUCs5KytHM2orb1NLMnhSQkZERWxVeGJUUyszbnZjNEZwRHNqeGxsWFFvSmc4RmdkQ1FvR0pKVFRpY0xjUTZ2UEw2d2JnOWNETTRjSnYyN29BekZBNWt5OS9VT1N2bWc4b1A4Nm4wZElDQm4yNUp3akFSV0RTQVVnQkhONnZmZGJ2MTBBYkFSaDhYOTF2RE0yc3MrTnZBRUNLUFZMQ3NIb3lVZ1JxcmxiblJ3QjkzM09CYys0RFhySUMwSUVtaUxuRTc1ZGk4SHN5QWNqeldVVkdVaTZ1SUNNcFZ3d0pWTVhkZU9rM1hBeGMrSG5nK3ZWMmVzQVl3K3NXb1AzMXIzZUxjTHdRQmVRVXJFSGg0Sm8yaDR2RG1KUHVBeU1MR0FlRW43dXFiZ0IrSTdEbFNXQkdDd2UzMUdiOWFMMjBrR0RiL0VHUnhZNldUejhmMnd0TThsNHBnTDFTZ004ZXNIQ3ZzdXlsTUU0bm45Y2ZRTHRsZGc2VFowa1VLb3JBZmlqMjN2QVBDbXFwM2ZjQ2w2MFhGSU5pZDFQbFpyZjQxL2RuQXBCNndTUWp1dFVmSURKUjhDR0lRT3dXRUg3RHl3cEtyV2M4Q0Z6cVJMSGtWWXJCMmpTMkZRSDV2a3VCeWNYQ0FsSVVVQUFrQ00yaVJCQTYrQVJDZTdEalltUWR1TFlUbGVpUS9YVFRTNERwSSs2bkxoWlcybnpWQ0VCYU1MZCtzb0lHcWpEMWFtcGR1Z2lZV0NwZUJLQTliQkpDOUFjdEFrOExFUzI2U3FzZnRJbkxaNDRkUWlmNElnZGh5bTVXTHJQRHl1WUgvN0hUQ053RG5Qa284TFhyQmNjalFhaW9lNkJpS2FkMytRWS9NR1RINnJTM09CdkNuUUR1QUl5cWhpRGtROVJYKzI5eUUzb244SXdqeFFQSTh6a1RpQXBHVTNvVmtELzRmR0RpZUF1QWRNdzVNRlFqRWdnMURZc1VrdSthM3VJMFRHQmZWN1BvdHdId2FPRW1iSEVBVHZ1REl1dG5pNlVBUW9GUklGUlloZmUvZGhFdzd0YmU5T2YwU2kxZzhIa3J3UmNldkRhanowN2dJSjduMDVyWXlXSXBiNHlhLzd2djhQUmRGcGovTFhEbWtRTEFuQTRqQ0NPbFRCUk4vckZNQUpLZ2trVkhwR1VqeVNTQlNGZWc3L2F6cWs4RWdiU0VxOFVEUkFDTEtEWFN5YVE3QnIvL0RjQTRMU0N0d25LaFRFa1FjbUFJUWh0TStVYWFqbDB1UzlOYXRJVFhXenB6ZmNkTkI0RHBZKzZuQmdEYUN0YW5ZTE42ZkNqNHUxYXkwUUlxdE1ML0VZQzYxd1NBOXRBSmVQNmVXc0FvRHlzRnBnMWVCMEhJUVJDSUlrVmVDcVFmLzA1UDNXQ0IrVVBBK0NQQXp2bUNhRldES0V1WWNsMXlNTitZMmRja3FHVGVIUEV2dldEU05oT0FmYmVmWDBBNnJTOENVdzhYOTA2NmJGSWZkcU1ISklEKytESmdMQUNRdW15YzNneUFFWVJSS0ZDTEQxZXU1T0RMRjZRdlhlZHgwdzNBMUJ3d3hkQUpMVFhqZDhzZVFuR3JaOWJQRnhMeUE3V0lLT042M3RZdENRQk4vc3Y5UVBtNkJrTHAwdmw5dC9tNmlldFI2ZmJ5QkE0Z25YdE9Sd1JScE5uVHRQcFc2Z1dMSDgzbEtxY09GVEVuRGlLdG9Id3k4Uk5GaHJlZnllenRibnJCZmJXZmd0dHNQK2tJeU8zMkVMRDFjSEh2SW5ybHZXczZUc25CN3FBVWxnL3N1RnRBV2tFNTV6WVEwUXBxY0FMb05DWFRFdDdBM0tvYUR3R1FmcW9BT0VVQmE3ZlViS2N0bHR3Q2FqVmJ4dlNpeXZvYXNNMEJhQkt3d2RLYjlmTjdOZmNxQldHaVNXeWtXWEVSMHVtZWFjVUVvblFnQ0tSZklnREZqeWE1eXE4V2ZzZnM4ZFlnaXVNeGdwQWcvdm5NenU2bUYwejZaajVBUGR2UFFlYzBURW9zbnZRb3NHT2hhTHVJWXZud0VZU2l0aEU1MkYxWEZBQTBwNXlpZ0Q0b3RDcXlnRktucEhVcExZUDBPY0tVUll2Nk1qNE1OUjQzM1FoTTBnTDZRb25nYXdPZys2cmw5Q3N3S29Ta0VJeFB5VHN1QVBpZ0NZQm1BWFZmWWNWZituMFNSWXc2ZFAxWXdOZ0hzZ1NhamlKUDQyOVJycFdPTTZjeERpSkI2TklOTTR3N0xiVUdNUVV3Qi9NOW1aM2RTeStZVkcwRW9CaURCU1Q1ZGRaK1BrQ3NBaUlsUVpEYTNMVmF0SjBXWEcyUGJMOThBQis0b21CM29QL0hnVFVobUdnQmZScVdmMlRUclVTakV4RFNQL3FXelFEZ2ZBRkFXeXpSOHJrRnREQUtYNzVqbzZuVWd1WnhaOE5CeUhidnZxQlEzNlQxc3djc0JhQkFHR1JnNDBJcitydDlXVURoUTVaQVU3RXMyZTlMTHpnbHFIUnhOa2JldVcrb1FSUmxzNWphTWpuSzBhOWVjTmYyUjRMQXdPODI5a1FCM0xUdEVZUVBVd3pRQVdnVzBBR284QVFIMGxqcC9WMTdwbTBLUmNFaWZHdU5Pbm9jTzFyQUNRYktQWGhzOFR0TndWcjV1aCtuNlpmM3dEZ3UyOWcyRmRNdE9jOEI2UGRwRmowOFpGcnBsdytaQTVGVHZBUVEwL0JUMzZGUERrUnFCVDlKYWc3eFlsUUl0WTBmODhqNzhzWnpDY0tQWmxyQVFmU0NLOXV2QjRoNTc3U0NvdFVpRUo4b3BxOElRRmwvUFVCUEVvQkx4YlJFNjJMU3FHNGRGQjhyNWJIY090aU9RU3FUNVQ3Ukt6WURnSngrQlVDQ1R4WlFDd2hhUWM5b0tjRW5FQktrbmo1RnNKMUxBUG85eG9XV1BXRHkrNklJb3FiZWFPMFZBK3pIQjB6eElRREtrbjFHZ3RYaVJ4TUlBeDBWbjBEYitsa3VGakxSQ3Q1V0V3RDcxUXZ1Mkg1T2Zla0Q1RmFjaVFheS9HSWJGZ0JYcml3QXlHbUpBRFIxY2szRHdURTNUUTRCMExldHpCSkVyVFlBcjJCQlNJM0hUUzh0TEtCWlBvL2ZXUURacDE5N1ozc2NqR2I1QkRwL0wzK25qTXdlQjZCODNHajl3ajNhdE9zUFdpbjlXZ1hDRmxWTy8zY3RmNGlEOFhrQmtINVVTbEFabE5QWkFRcUFScjV2eHUxeWptSDBnaXZiWDBVUUtJNjNvMFd1bi94SHVSOEU0Vm5QSzVKUUxkNFZOdHRUQnZLMnVvaUtPVWYvZitHandNTkJoME5NVjZKMGMwTnBjUnY3bXJZdjNraDgvdUh4WXArYlZwd0xwM1I3c3RzMll6b3VTcTNLR2ErcTcreDdDbzRuYXpBZXJSS3NWbFYxUWl0RjU5ZHl5RlphWVkwSE11OW1XTDNndHZaWE1ieW1CSUZNWjFvdjJoMEIrTFRMaXN4Z1crRXE1dVU5MmlaNzJ1ZDl2dlIrNEpGcDROamtSaDJPTmkwT0IxL1VCQ2t2RVlSaGZ1TnM0T21oaGlQS25GUWx4NmFBak1uU1hKVUFBQ0FBU1VSQlZQam16MXc0MW5ud080Y0NJQnZCd1pnVEFPVUhScTNneURFeEQ0elJHVllFbnBtNUxxbVFjME01ZXNGdDdhY0ZsMFNsSGlCeHVUa1l4eGRhaWhVQzRRVlhGdTVGQ1VENVF0Smw4NXNqR0EwemlReHFldS9mZW0raHcwRjJmTExRR3hGbFlNUnZvN3YxV21JVnRwdDFERmtYdk9SN0x3SjJIU2t5b1ptRXlwb1ZWZThwN2I2cUVNbmlkR0cvVmwvTDJhUE9Jd3VBMXBBSVFFM0RBbUZhNGo5ZjdDUGFGcENIS3VqcjV4elplc0dkSHFBcUt6NVgrRkxSQWw1OGxlK2p1aStrVEJBTE1jZ1o3M0NEQmtwTjIvNytiZmNXT2h3VXlDRUFqUVRjQVZoS2Rqa1BjMlJhamV3S3l1L24xLy9xSmNBMnVoQk1SR1hRT2NuOVU2SklPalhIUXFTWU9zVm9RcDFITmdBdno4eW55ODBINVBWejlINlJxVmQ4NDlXdFhRL3pBME93MmF5R0xKNDc0TDBHNzl2dmJ1bHdrSmk4QkdDZzRTMDFTS3FvZm9OdlNJQys1emtoRlV1cFY4clVUcEpOMDZLcGFCa0ZRbTVNMUhsa0EzQXlNNS91OVpsMzh6cms2ZjBpVTYvNGhtc2NnSzVJU1V0Q1Rvd3lEcWI3VXh3c3FGSlczZm8vdmJ1SUJKRVoxWVJneUh3UUtOaTBLRWwxT0tUQ1pKZHh0UERuLy92OG9vYURhVmdxRnlpVEQySUtmY2paUzRGbys3ZytIWE9Qdjg0akc0REl6S2ZMelFmOEtWZkkvRk5LclE2aDk0dGZ6K3ZPQTljR0FBYnJweWxZMlNEbFZUVHQrdUNuVjMvVjNhN0RRUUF5c0pBd29iWkpnVVhpNzhRYXloZDgxMldlaU9BWnpFeVVpQWtITWV1NUJGNUZ3WlFBV0xQd2tua0xReTlDclBNeTgrbElIWkZ6dk4zVCtZYlYrOFg3YzY0T0hIaXg3NFY2ekl4QitSSjB3UStVVTk5MnRZb0Z5M2ZjWGNURHhRa29Qc0NVaEZJY3pLVkNlZ1NnNUI4QS9QSUxOOVp3eEJTeHRpS2lVQU9pN0pXMGRMVHVzdEY4QUdibTAvMW8zdmpqblNHZGorbFlsR3dkUk84WE4rYzF3QUJJb0hrNms2MXl1U0NKSVRxM2pEWTlWeDBCcUsrK3V3QWZYNkprSS9oTUUwU0MxRUdndWlRK2lzcWNRUkxyRjYvMGpPMncrNkZNblpoeVpZc1ExVzUwcU9IZ1BYMU5YbmR0T0RzZmdNd0h6TWluKzArWk4wUzlZT2xsTXpXZkx3S1FTUzM5NlAzaVkza05PTERQTTF5MDY1SDRnT1czcDR1VERrQjh6V2RiN0ZnYmREaEVnSmtDVURSdm9nVG1kL3ZQdjNCVkFVQnV2eWxOekFBWWk0aGlzVlFuRUhvSXFXYmxyeHFtNE14OHVqZmxqVCtZanNXQllnSU9jMG9KUHNxMXNsQ3BINzFmS3liSk9Fb0F1dVZUUlNDbllsbVU2UC9aNGlTSkVjYkx2K1l1OS8xRUFoN0pLRVhES3hxNENoVWlLeW1SYndqZ0hkY1VXVEFSZ0xZWEhTcjJMT1UrQlY3TVZ3enh3T2ZrT1d5YllBR1pENWlSVDBlZGpweEQ2VmhjT1E2ajk0dFA1MXdkT0hCZE1lWGE5T3FXUmNtV1hBMVhMVUlVSDZ6eUN3bEFzM3orWUJrZnMxdStWSWVqSkVGM2NrcmpJOVQweS9hTUEyKy90Z0FnMDhWVVJLVDh2YktNVWdBTUlHenpBY09pNUhrbkhRQXo4K2wrTVcvODI5S3hodEg3dFR6K2pJTUFKUENZTVVMQVdkNmZ2aStFWTlvdW9aQk0vS3gvNExVQmdGTGdOQzVvMTZGckU4SkpWSmdraUZoYVFRQnYzK2RWYk1yV1ZzQzhVeEZSa2pqYVZzVzJEdFJkT0ovdkF5b2hWWUs3QStiVHZUZGo4SGxxVE1jYVJ1L1h4SGt6amdOa0lPV3VEcjhqbllZREtEdXRncFVocmEwdUFsQXlDQ1VBSzhCWGNqQlhnTENrL2gwRC9oY0J5RHhGQWRBem9GVXFVQllSSlRVY01XZFBQN09OTDZpNWJMUWVBTEpSUStiVC9XN0c0QXVBT1hxL2xzR2RjUmdBWStnbExrWWNsSlZUc2E2cHRDWDN1UWpBS0lOUXN0RnJBWktJd1d4UUloSUp1b3ZCL054K3IyTHpGQ3dsajhZMGV2bC9NWWswa2llVnRjdnJ3R1VuSFFDVmpqVmtQbDNtSXRRc0lQdUVseDlHNzlkT3pEZ01nR2tBV2xOeUJKbjh4S3ByQlJDK3pnRW80TFdSZ2NkVmNPQ2pqbE52bXg4NERyek5BYWhhRlpXTHlnS1d4VU5pYkloVGNQRDlCTUxMYTY1YnpyZUFNU0dWb1h2Si9DZ2gxV1VmTytYVFpTNUNEWURzOUdIMWZuT3JJRGNBa0FCVFREQ0NMWUswQ3dpLzU4NldjS0pVaUVwQzhDQ0JZRHNpaVNwbHFVSVVtT2pmK28ydElpS1ZVSmJnVTV1U1dsNERXd1g0K1BjWG5yUUFUQk5TKzh5bnkxeUVvcGRjYXkrOTMweTVZaGdBZys5bjJPb1VlSTVUZFFlciszMmZkaG1Hb09CWmFuQm8rZzF5RUtVNGRZZ0ZTdnFCLy92WkJJQnQ5UnNoa1RiVzhaWloyaFVndkRMM2lVM3V1eDRMU0JNMFpEN2RQUm5USDA4VkFJZlYrMlhBT3VjUUFNdVZjS2ZGU0QvK0lBQUJzRW9Hd1lBb0haSUtFRVl4UklId0xTOHBVdWhqRlZzNi9aWmhJVld5eFZLQkJJUlhuYlFBVEJOUys4eW5JNHRCemtFQUN2K2NobFVWSUtFLzVjUkdzV21sS2ZJenVkYzNBUExRU2xnM0UyT0N5VlJjMWtwVTNEZ0JtS29Rc1d0bEJjc3dqUHUrbmZUWXRCTCtHUWRnT2YxNkdDWlc2cFhsQkNxV1NncUp5cG9PQUZmWFhEaWZid0ZKTHZpNUhBamxuVXNpSWU2QWpPcDRpUU5RSFJsVDJQbGdKQ1ViYmMycyt2L2hGd0ZiL3E3Z202SGxZcEJibVRWMnNzY1F5eS9xRkJqMnYwL2NBZHovSEdEN05EQTFBVXlPT1UrMUN3V09ld05qS2o2L08wM0YxL1d1dWdXNC9YSmdmQm9ZbXdER2RIN0l4QjVrTFBJQitJOEFmTndaZ2dhNWNrMmZKYkVtOFY5ek5XUGZyYXNiZ011UEFjdXNlSjhFeHNiOUZkQmhBKzdnYVFOS0I2VGZjZ0NZdWcrWUpUK2c4OWFvQkRNbUlNU2NQMTJ1VEtqMTN1RHY4enNLaWcvdUoxdVFPc25vam0zcUI1UDVBQ1JCSDNPaFB1enpSTjlEVjg4SHFRTEVXUEpudlR5NW5tL3QvMXM0QmN1U3BSWnRHQXU0Zmkrd3RCVllFeWNjcll3bjZoRjgvRmtKcDliS3hBS1ZGc24vZDh1cmdiSFBBOU5QT0VPV2w0KzJjZm9GSGhmVnJKVFpQS0hTajVkYU90dXA2SnlDcFB4OHJIV1JWUTdXT2xyWUNNeDhBSEl6bHhrQUxQRDljMFZCK3gvQTNFLytFMmZVWUhYZEY3S1RHd2R2VGQwQUhQOXI0UGdXWUcwS1dCZGZzQmRzTVBmUHJLS3NvTDlYQVZMQXZPMmZGeWxDRTRjS2xpeXJEVlpOY0dTMUNxRVloV0ZpQVpWK1hudGFVUmRUTG1wQ0VicGNoVFlMcWk2TnJrTUN6THp0NVhjNEh3eUptbWtKK1o3M2pRT2g0TldlRFVaaUsxSzA4ZjBFWHQ3Q01IVmF3SWs3Z2FWcFlKVUE5TEkxQW84YnpLWDFjeXRvRnRGZnBkQ0lXejdyZ3pIZ3RoOHUwb1BHRHdFVGM4Q0VNeVNVekZhaWtndGxwVzFUYThKcU5iYTdsVmxqU1JnVytRNlpQLzU3V1F2ajZmeWRCalhmQWpLYmdFdk1Md1dDdmhOb2lwZ05wblFzaGxTNElHRld6SWs2eWxXd0F6OTNFVEx4R1dCNUNsaWRMQUJvSU9TN3BtR2ZHKzMzWUFHNW1ORDBHOEY0Njc4dmtpUEpjek5PQUM0VXlRbTJOOHc5NGtpckZsZklBbDdpNDAyZDZkYlBXV0F0cnNqT0ZpdUN2QUpaT1FFMHBIVEZzY2tIWURlQ3ZoTmdpcFFOeG9BejgvOElQcjVuYnZIMmpkKzZBVGhKQUU0QXF3VGRaS0VCTERvRGdVNCtZVmtQSElCb1B3YXJlT3QvQmtEZXhzTUZBRm5iek5KWW0wSURuVndidDR1eXVyMWt3TDdUcCtpWk0vMDhXVDlSYzdESFVtdVlUci94KzZvNG92dnU5ZmpCYmdSOUp5QStvbXd3eHZaSTVVTGc2Wlc3eTlGUGY5UU53S20vQ2dDY0tBQm92aDhCeVZ5L1VDdEpxMmYrWDF5WUpQR1UyN2xJWkxidUVXRHNXQkhlc1plRHo0aVVSTFVXYTFURTQ3THFLMTJmWm1kM09YaWRGY3RxbTkyS2F0VnMxakFFc052NnNkeW1hYTJnOCt4VUw0SStQbjJiZUNnYkxHV0hJL2g4RzNvVHI0NWlLODZQT2xiQlU5eUtJL0FjZkxSK291UXdIOUJmbW1iTGxUSGJvT25aL1Q5KzV2YWY4RlVhQVRoWHNGT1E0NW1VY2daQ1dUQXhlMFVRK3VyWU1PMS8zN0d0eFFtb0xDQnRSU3AzMExyRHAyU0ZkellNZ2svUitWTnd2d1I5bXdRRHNhc3BHU2ZKZ1lEWU5UYnA4cHNDUUZKeEVJQmtRakRyeHQ4ZFhDVUlZK0NPSDVNVkZQaThTT24ybi9RWUxaOUdwMGN4QU5JUDVJdkFrelZ6eGl2UnlkbktOekJhOGZkZE04NGI2QUZ5QXJpTUYycGFqazlrWUllb0NsWG1BM0FRZ3I1TlFFSE1CcU1WRk1OYUlPYXlOUkwvdmhsSDNSWndtaGJRUVVjQWFzclZWR3o0RXRqQ3UvM2RmYi9JRDNQYlQ3dUtBWi9NaGNJQzB2cVJUbzRXMElCSUVBbUV0RndDWXFqVzAzYmNtZHdCWWVvV2dldFViclI4c25ybG9pUjJkcnBBQ2YrckQ0RDlFdlRWaklKdTdIQlYrNzgxWDc1MkN6ajlsd1Vaa1RFZ2NQb05QcDVOdjRvQlJoQ0c2ZGQrMURrTXoxSkloUjFCQUhKN3p3cU8zZklSUk01dG1ESzVDb1FLc1NnT2VCWUJLRlpVTFRxY0I5cjZOaTVLWW1kM1dLRFVBMEJsaE5MTThFYlQxUUJYQlU3MmFJNVpqVWNWT3h6N1dMa1E4ZDM3dnNhcnQvdUE2UmNQc3hOU0F0QVhIRFlOQzFBRXBmOXMwMWtLd3VCd0dVN0hnVnQvMWp0RDFlNjBmZ1FpZ1NlL2o1YlFwK0tZcEdCK0g2MmpUN1A4L1p5cEJJQzhEaGN4OGVZOXdGMDE1YWJobW5vQXlKNVdTcktlTmdLTzlTSHhuVC9MU2FzSkJpbTVsUmpXQkVJVmVST0luS0wxcXVueWJSYXdMZ0FTZEV5NzRxamFOTnpKQ2dxRUVZekJHdkswMjk3bUFGU0hFSUI2ZWJLRGdjOEoxa3NtVjh0MjlmMWVuNkw1djZjeElLNWlLNlhuZS81akNUaUZjVHFWbi9yL3RXRFBXd1huRVBUVmdJS1VIVTdsakFTYXdLZWZJd0RwTWRSeFJCK3dGZ0QrUlJFREpBQnB3U3p6MmMwTGZ4Y3pWamtWS3dhWWd0QkJlenUzU3ZYMDhkMzlQNXVPM1FLYWhYTVFjaW91clpSQUdLWldhci9ZWjF4WFJQZTh3UXIyQVVLN1R2Yk9WVFpCWHg0TUJFQ1JuQ29uVUJTRkVYVDZtZi9USysvcW16QUYvMFVCT1BxQlpZRjUySHJURkN3MkxINUc4VUN6SkVrbzVuWnFtUm5QaC91Q1htcG5WcERUc0lQUHdLQXBPYVNBMlFMRExTSGY5N2lQeDB0cElTTGZ6N2JsNGlGZnNVc25qK0haV0VlT1lEQ0RuRG1DdlprRWdlZGNDanhHc2VJaEJZdDN2eDA0OUh3TUxSaDhnQTlnaDJNb0g5QUJxS0p6eGYwTWNPN1hsU0FVNEh6aFlZRnErNUQ3aHdCdS85OE9RTGxJQkNLblczOVNsWE5ZK25xZWlxMmRrUWcrZ25HUGI5L1pwVDBscTZNVjVEOTZnTEN3Z0RtQ3diZG5DdlptQ2dZL2R4eTQ3eHhnNVNXdVVqaWdZUEhGYndBK2Z5R3dmcjJyWHJNdlBCK3ZwM0wzR0hDZ2k5Sk9IUUNrUlZQcHBlVUJpZ1hMRnlteWVqWVRCNFlzZ2ZBMjBvZlJBbFlCMEZmQWx2UXFQMC9Uc1g1UExPQjVETnU0NzFjbUl3aUJhUnd3L0YwMUorbXoycHFDaHhVTVp2cEpsbUJ2M2lUb2NzVzRkemV3ZmhrR0ZpeCsyZmViWERBZUpPL1lFSUxCQjdwVTFnOExRRm85OFFBU1ZHWU5RNkRaZkVHM2ZuRXFyZ0xoYmYvSFYxNWFuYmtGTkN2b2hXU2w5WFBRMlhUTS8yczNJNER3UElad0JFRGZnaXRIMEVrNk42eCt1L2lEN1Q0Zy9ZZEJCWVBwV0hFYUhscXdOdytBUWE0WWo1NEpySk8rYVFEQjRwdCtvQ0F5WXZPUEVJUURDZ1lmZUYvOVUzQWJBTVg3SXRBbFZ0QXNwS1pkejVTT2x2QTJwc3R4akVTM3dKKzkyTmdBR0syZ3dpNzhRb1ZmRWhCZVFBQ3FOTlAxUmRvQTE4a0tkZ0RoeGtVSS96S0lZRENucXl6QjNqd0FKbkxGT0VJVzdRRUVpMS8xWTIxeXdWZ2xDQWNRREQ1L0VmajdNNENWclo1QUtsa2h4ZVFVYXhCSTRudkZ6eGY4SWZDVkM0SFY3Y0M2WkVYNW5lbjNWWDF2QUdMWnE4eXNydkhZK1FCd2JHZkkyRTZKcEx2ZFgra3N0aHBVdlFybVgvc1ZER1pWVUpaZ2IxN3ZKSExGZUdRY21DZFZiNStDeGQvNXhqWjZRenpNTE9RQkJJT2ZUVjJQczRIRkhRN0NMUVVRbVVyVjByZ0tKTXNDanN4R0FxVG4vaHp3MEVYQTR0bkF5ZzVnYlRZQm9yS2tVeUxua0I5WVZoVHh1K2tUMTNpY2N3dHdkQmV3UEF1cytiMmFyOXhKQWFmcWZnTVFPNGRoK0o5K0JIZTVncVpaWnpZb2sxSkpVY3BhUjZicDkzUCtXL042cDBLdUdJZW1nRVdLZ1BRaFdQeGRQN05CTGhpSEtZSFVwMkR3cFo4ckxPRDh0bUpRVnBsT0x4QXFtYlJLQzZFRFlDNy9DZUNSUGNDeDNjRFNyc0lTcnMwNENQbTlBclprNTVVdktBc3BZTHFQYVBkUjQvSDBnOERSSGNEeVZyL1g2VmFiTEhrMlBoanBQVlpZN2Q1eHdGNkN3Uzl5LzRMYmJWeVFzRUtJdWZHaUtlMHAySnZYT3gza2luRjBHamhPUVkrb05SdGxqamk5VFFQZi9mT1Y5SVpZNEdxNEQ4SGd5LzRXK09vMllHNWJVVXkwNHZVY0xDcVNKVlJXc3pKYk5neFNtTWF1K3EvQW8yY0JSODhFanRPcWJnTldXYVRrSUZ6M1lpV3JGNG5BanROMG5CWnJKblUrLzhQQTNDeHdmTVlCNkxVcmEzb2dsTDB0cHM2d2xWaGE1ckxpcWQ5QWREZkI0SmU2VTBzLzBCWFREWWg4MFNyMkZPek5BMkFYdVdJc3pBQkwxSmFLV3ExUitud0dlTTE3T3NvRlk1WFRWdy9CNEN2K0RqZzBDOHh2TFlxSkNFQ3pnc3htWmxxOVQ4ZTBYR1V5YVVpemF2UHR4b0ZyL3p2dzJCbkEwWjNBOGUyRlZWM3g2YzRzcXdPYmNrZXloaVhBb3dVU0FEaEQxWGhjZURNd3gzN2x2VTRYeFZOMm4zckpJb2N5Z2tyL1ZiczdmZStFZEJMY2ZhWFhRM0lQV0lycEJCNlhsbndwUjc2allHOWU3L1NRS3phcnhNN3FKRmo4bWc4VWFyTVY5SVo0Z3ZOREQ4SGdLeDhIRHM4QTh6TUZBRm5QWVFQRGwwQ28yZzRmcERaTHFLQ3hUMC83ZmhKNGZDZHdiRnZoUml3UmdKcnVDT3dVZ0NwZUN2VWpabUVGeGhmazlXOTY5a1cvQjh4dktRcW5WZ2crQjZDQjBNc0k3UDcwQUhnbWQybjFOUTBydjdGdkFMSWxWWUs3M01uUUNETFRoU0dab0RwdVA3dUNldVg1bjh6cm9CNXl4VGhHblEwQ2d5Qk14WTYzQXEvNWFCSEc2RUJ2aURsT0xWMEVnMSswQUJ5WkxnYmwrSFJ4blpYSm9xcXR0QTRPRG92bEpaVnVTalRRRnRxK053TlBiSE1BenJhbWRWcFZzNndFb1B0ZE5nMzd3SmZ2c1lpSlA5TkZxdkhZKzd2QXdqU3d4QWVOeFZPOFQ2YU5WUlJSbFQ2aEhySjBPdmF3MFdESkNLbmc3Zzg2QVB2TkI5d2cySnZYTzMzSUZXT0JnbjhFSWYyblJMRDR0YmUxK0FVN3lBV2JaZXNrR0h3VmRkMm1nQVVDY05LbkpnTFFyWi9WOS9Kbm41SlVZbW5BRTNoQ212Myt0OEFXUWZTenlQSy9QT09nSmdEZHNncUE1bmZKQXZMZExWK2J6MGtLNFJxUFozd1FXSnh5QVBxRFZoWlF5UXI3Z3lhWEk5YXhXQ0ZWQUdMdlJVaFY0NlBnTG5VV0JzMEhiQlBzemV1ZFB1V0tzVFJaQUpEVG84bDh1aS80Mmp1TDV2ZVFDN1pwc0VvdytPclpRbHFWVnVINEZMQThXVnlEQU9UQW1IVVFDQVdRa09sc1FBd0R0LzkvQUU4U2dQUXBOYTA3K0FoQUE2SExYYmI1WHI0SWFBTWZ2L2VHdlA1Tnp5WUE3VUdqQldUV2poNDB2OWZTeXNjSEx0YXhoSld4RlZzTk5BWEgxa2h3OTgzK0RZUG1BNWFDdlhrZE5JQmNjZW1mY2Vvb0FmaEFBY0ErNkEyeEx1QUd1Y3hyemdLT01leERmVjlPd2JTMkJCL0JFb3FMU3JCb1lHZ0ozRThxTGNJRXNQL25nQ1B1VXk3UzEzTDN3YjZQVTU2L20vWGo0UHMwVEtDWFFBNkFYdU5lWlkzSE16NVFBTkFlTkQxa3djS1hsajZ3T1pRK2I3UitQaTBQRDBEZUZBZms1OTBDS2c4cW5jZm9GeklSVldWcWZGZkJoZ24yNXZYT0FITEZXQ0RidlBzdEJzSlo0TFVQdCtqZGVzZ0ZnK3FWcHRXcTExYmcyZ3RnZnVMaVJBQWdRZWcrb0Vtc091anNYYjVTc0FvQ0lOLzN2eDA0T2xOTTZZdjB0ZHgxTUt2SzcvVEZqVm1lQ0Q0SFFRUWhmMTU5ZVY3L3BtYy9rd0NjS0FCb2VZdlIwb2VwdDdTRW9aUTBUcjFsUHVQUUZsQXRPMG55QWNXaHB6dy9GU2pGekdqTHgrUkd2eHpvU2VDMWh3c0E5a2x2YUZONUZBeSs5bUpnbmhhUTBxcWFnZ2xBRG80YzlBaENEcEpQbDVab21tUTg3MzhIY0d3NkFKQlcxVmVjWnYwY2VQd09ZMC93bDFsQUQvV1VDeDBtTWxETHI4YmptYitEd3AzeDRua0RZYkQwdGhJTzVhTnRmbURpL3hHRWVSYXd4aHM3VmIvcTJodUFCUUp3QWxoeXkyY0MweG9nZ2pBQVVDV1dBa2tzT2lJWTk3OFRtT09xZXFxd3FBeDNXR2hISzA2bjdURHdPY0FWL2lpcFBBS2p3Z3JabTJvOG5rVUEwZ0ttQUhUcnArbzlNVHJFWXZxNDRvOXBaSU90Z211OG1hZkNWNzJZQUtUL1J3QXk1T1BPdVZsQUFrOU91bGU2eFFSVFdVS2xXdGtVL0l2QUhBSHRpNW9Jd0RLODQxWlBGdENtZHIwVThQYUM5aFZ1bHRkNENJQzhQMlp0dC9tNS9xQzExVEpYbEpER0dwZkdBbVlPRGdGb0N4QUNrTHB1V2gzS0NncUU4Z05WWks0S3R4Z2pKQUIvMlgxS3JhbzFyZk43Q1daZjNMU0JUNHVBRUl5V0JWcGlwTDdHZ3dBMEFXMjVHYkdFTkJUUngzcm0xTTJ3MzltbXJGVndqVGQxS24rVkFaQUxFRTVMdElEeU1XVUJ2YkxOTEdIZ2Q1SC9WMDdCRHA3cjN1VStKYWRnbjNwdHhla0E1TUJyaTAvV3A0d3pCakRiQ25rTVdNcVZwRThHSndMUXF2ZmMwcHFia1ZqNWFOazdnYkN4Z0pubzMwY0FqbnRvd3RYTmFaMXN1dlNLTmhzWVRjVkttdzlGNXhHRSs5NGRmRW9QK0pZaEQvOE9DOGVJUFVzVUhva1ZWS0I3OFhzemJ6QUY0UHZkLy9QQ0tWR0lwT0FyNzhtbjREWk9tOFlDMWpjbyt3NkVGVEREUEpxZUNFQlpCYTVHZmZWYmhtUThEdFpXNVRZT3ZQaFhpcDBHVHV1MjJsVE1MU3crYUFWbDlRaEVXanVySS9hUWlMSmtUTUxzWDlSM3IveW1aNzNmcDErMzdPVTlodW5YU2tkbDdUM1FyaEtDdGxDTTU5azJpNUNNTVNJQUdkcXhFSXdybXB0elRzQ0V1dDV5aWxLb0pMQWN4Q3EzZmU4dExDREJGd08rdEtqeXV4U0NNZFlFWG9lRHJIY0h2dTB0VHdMem13SEE0Ti9HaDZ6TkNxcWVPU3hDMmxiOHRRU2lNd2J1cVhJcUFjakZoMkpqQktHSnlTaFFHNnlnVmJmSmVnVUxXQlljTVIzcnZiNm9DUmFRd0ZQZ2wxTTVyUjcvSnRCWk9JWld4LzArczRRZVk1ei8xL1gydEZuQXhQcEZFTGFWa2RMTjhNV0dWcjRwQ0JzZk1ITjhibVRLZkNqWjBOY3A0NTYveDU4ekx6Znc2UWYzQUJkOHBVZ0VZbXFrNWJHeWVrMDZJUWwxYmtYU2NubE4vdThMMjRHZHgxcVZxOTFLUXZycGd3YUFBdzlwK3duWFB3MVlqeVdNR3REbzJBU09GR01VN1NJRVV6ZFlEMzR2TVBtWHdMYkhnZGtGWUF0bEdpaW02RHB4SnR2cTlMdGxWci9hV0tFQjhwVVhBT09QQUZQendCVFo5cjA0dmRROVRzNHBBWjNjZCt5SHhnZk1BT0grdmNBNjkvOVV4aWptei9BZXJZcGRhcjFsTlNNWXpWK3ZXWS8zNEk4RFk1OEdwaDhCcG84QTA0dkFGRUZJa25JSG9oR1ZSNjJRaEZSU1lqUUU2cUZyaTJ6M2lhUEFoSE5ObHhLd0FySTBRMUlBeHdmUmVhY2JDNWdCUHA2Ni81SUNnTEtDdHFuc3JLS2xyRlpVRlBLT3I3b3NNVHRkc3h6cVFSWjkzUTFNUEFSTVBsbG9oVXhScWtFSzZnU2hPUDBTK2RZMmhsUnY5OXkrb3ZSaTdJaVRuVHZMcW1nNnhEUFlwcUFVZ1Jnc29SN014Z0ptZ0hEL2M0RTFGWHU3RlJSYnZFZ2Q3ZXZYV2xiUHBwOUVnVWppSnB3ZTZ6d09NbHZwQVdDTVZ1c0pZUElZTU9sU0RaUnBvR2lOeEt6YmRJUWxYT05NV0piR3R3NHN2ZGd6M0VsNDduelRSdlBycktwdEFKVDZacnpmaW50dkFKZ3g0dnN2ZFF2SVhLNVZZRjNzVVp4bUpVdmdBMUZPdndGOHNwS3lCdE0xeTZFZXBJNExxVk1lZGJFYVRwMEVJS2RQS2g1RnFZWXFTeGdvMmpnRnIxM2o2WFhIbk9pU1pPZUJWU3Z5QzhxQzJyMDVGVnZWdzljQU1BT0ExNzhBV1BNcDJMSmFhZWtpQ1BYRXh3SHc2NjBuMW9CL25pR1FhendPa2tTZXBiSi83MkkxeDRDSitjSjZsWUkxcmljY3JWaWNVdVZTbUlXODJwa3duSEhWT0tiRnNPb3pRR2tGa3dld25CRVMzN0FCWU1hQVgzOVpBVUNDYjgybklsbys0MHAyZ05udnNvS3VueEgxeEd3QS9MT3pkUU9RSlBJdUh6VjJHQmc3Q293N0FJMGwzM1hmak9zdjZvVm9kZXM2SVNiQnNBWk1YK2tKeFU1NktZN3BrbUZWaE9jaXV2VHpTdDA1djArcnl1VC85Z0RyWk5lNHdQTXNJN1ZKUDNHY1A3Z1VPT2R2Z0wxclJZSjBaSTVJVjNoVjQvd3JHWVBQVTMvQWlSaFl1c3kySzdtVTk5OVArejkwT2JEN0x1QlpLMFhka2VxOU5TWDIrbzRITHdmV2xvcEZDQzBmZ2NpQk10QUZDOENHcllYVm9Wam5VMkc3clRYcnpoNGtmUnpMWTFreUd3Qm9laUdjUGlYYjVlQXpkWFduYXpQQ1NTY2I0ajN4Zm1hdjhDeDJwNTBsQU1XMFZYSU5pdENvZ2wycjlIMmRjY3RXd1F4UXNuNlpUQmJNTnRjZ2RLSWJpWmo1MVZjQmszOENYUHhvUWNmQ1VnOHBqY1lnWlNjdy9tb21BQ25YeXI0bGVCaHM1UWFCVEhwZjdYOGRNUFlKWU84WGdBdjllOFFKbEFaWnE4RDR4U3VBTllLUEpRbjBBUjJBSEt5MU1BQ0tlOW5mRkk2SUVxZHVFV29ISUo5d2xzVktMZWtvTUNhOUVBZWdTVFlRZU00VFhjbzJTRU1rQUhFYkJab2o0YmJZdGR5Q1ZyRnFHWGdUU3hnWFlUWmVITGk5QU1qRVFSQ1ZVWFAvbjRLVWFhVDh2VlRpK1J0ZzdHUEF1WWNBV2xNQ2dVVmtRZkoyUTEyeUJ2UFhNd0hJbWhEV3dmODFpbXNUaUxTRXZIWmtyK2pZL3A5Q1FSRDRwOERPQnd0ZUl0YWkwNXFuMzFGRmRmTGxGeFlXZ0NEVUlrUmtqL1R4YkNFaS84OWpmUFozWDJWcVlTSlFibVVOUVkzSFFUN2hidjJzTG9lclZ3S1FITkVFb0NzbThSNE1oUFJqWFVHelZFSUtJb1k3eWFFWXVZNGRnR2I1UlhydW9TZ3RTQ0xMYXJrSUNROWY2UU55a0dqRmRqc0lCYUk0a0dsdDhXK1JnNWcwSEo4cUFwNDduaWhBekZwdVd0UElNQlpKbEFTSUx2UjZmUTBEQ1ZiSkNrSk9KQ3FuazRwR3BiOTl0WjhNb3B5aUtEWDdXV0Rpd1lLWGlFUU9laENyZ0toK2VKUStFUUhvMUxieS96Umx5ZjhUSWJmOVhTNWZ0SWI4STkyWXVnSDRheTJwTHVzb3JsN2RBb29uV3RNd1FTVGRPRnVRU0xUR0h5SUM4a3hTSVF1QTRod1UyV1VBb080L2dyQmNEYnNmV0VsU3pnK0pDb1lEb0VHTTFpeFNrSHpnRi93Rzd5OHNJYTNKN0pQQUdXdUZKU1FJYVUwMWlKSFVpWVA0ZTMzQnJQT0htRy9KTWFPZlRaVllSaHdHYXY4N3ZXS1BKOS9yU0g0SU9HTzVzSVRxZy9nZ3hYczRUT2FCQUVDYmVvT3NnZmwrRHJRU2hGcWNFSWh5eXQwTWJNdXNFa3g3NmlBWlhLTThCdlhpWkFHbEYrS2FJYmFhZFlwZW00YURncEpaUXo2WUpBQlY1VmNIQUpaMHY0RnhYNktHNVVwWXMwS25xamhSdWFnRVZnUGdsWUFsOWNpSGY4bWRVckpoMFF4OXZrREJ6Qnl3ZmJrWVFJR3dhaEEva2dsQVRzSHNEektBMEJBVGlQeVo0TkVEd0llb2EvdUZZS0tYTDJmMjRuUW9JZ2Q5UjN5UUNNVEZxd0lBZmRCV0k3K3lCNVpMRUNZTEVUZDg1WUpsKzJZQVVOb3NMSWVsL3hZbHU0SnNsNmJoTmhENml0NFdKQ3ZBMlpjNEd4bzczUmNnSmVPcUZtR1I2cmNDaExZQUN5R29qbUVZZGo1OUtuWit0SVFSaEg5SXZXQTJoaVJFakRlUkk5Q2x5N2ZNRjNFdFdSRmF3aFFJZjVJSndFNTZ3ZFRJWWR0N3RwOXlzMUs4Sm5vSnZvZDlXbjY4MlBOa1A0aFV5MW5kV2dzdEF0QkRNTFlONS82UEFjNURHTm9GNFNyWmZOKzQrSWhUOGpxd2cyQ3A4VGhJSjV2ZlNXQlhBVkNyV045U014REsrc2thT3Zob0FjOG1lNjU0cG1VQjNmMHd5dCtFOEZ5UkFHbVBsT0VvaVNEMnFndm1BS29PbTUyZkF1aVRESFN5SVJ4eCtsSTBReHhBRHViZkY1dmZmTW1TYWpyV2xQN25tWjNkU3krNHIvWnpBVUVIblE4UjcwSHNYbEsrUGdKc1c2OEc0WFlHWmowRVkyRVlBVENBVDZ0QWhtRTBEWGNDNGZhYXBjd01nQUlmTGIwa3V6VDlRbXc1dXdBQUlBQkpSRUZVU2krRWZlQUxrU3JwQm92YnJRRG5rbTh3QW84L0UzaStDQ3NaOThOQ3BBcDhjVWVrWnlCYXZJNEVUL1RuYUFrL1JRQ3lBWHk2dU5TUEEwaSt3TWVCNmVQQTVIRmdacTJ3cE5HSzNGVURBSG12M2ZTQ2U3YWZYOENCNFVORUVPb2xWaS8zb2Jhc3ROd0o5Y081Qk9CS0VRTXNBY2lmSFd6UkFpZ1dXQWxDbjVLMmJRWUFPZTFLTWpUSVIya1JVaEtWUzdJckxpYTB2KzN4d0hNWk1DYllOUDBLZkc3OXpBcUs1RHhPdnlFdVd1NlZENUtTSHkyWUFFUUFmcGFSZGw1VWt1VWN0SXBCbkNJSWw0cHNEMDNGdElJUDFBREFsQnVKTTQ3RXFxVVgzTFg5a1NCUWN1dXlmdEs3OHhVa0h5UStSTHFIWjNGdjFLY2dMajVrQVExczBRbzZJQTFuSGhOTFF6QThaeHZCWHVOeDhEY1M1VVlwTm5vWXhzQ25VSXF2Wm8wRjN3UFRNYTdIdjUzSE9KVmJTL2wrNWJ1bVg3ZCs1V0xFNDRoeElSSkIyTk1DcWo5aXh3dUU5MHN2V0NhSUE2YkFwOTU5RUtlV0NoQXlBMFBUT1YydW5HTVF2ZUNPN2JmcUhiY1M0ckpSN0V3cW53NUFXaEx1SW1nMnVGUUFYQVZzOFJHbW50VzQrZzJoQjNQNzlML0VKOXpHdnFyeE9QaWJpVmloQU9ncldRT2YvRUJmQmNzUE5CQnFXOUh2Nnp6R3FGem1vWHozQjlBZVBnWGlxNmJnaXY0WU9COVFIUzhBZnBrQUZNTWpyV0FjUUEwaU85WEppUXlBbm9zMnZWN0VTSE9PUWZXQ083WmY3RjQwbVpGUVNjUktBWUJhU1U2dkFWY1RnTjd4WEhpVUZwRFRNSzJkRmg1NjkxMkJUaURjdnBrQVRJWHpDTDRnM1dYVFo0anBHZmpvRi9vaWhMK2Z4KzB5V1VBQkx3SXd0WUtLSWFiZ0N6SFF2aTJnZ0JLbjBNY0VRRGFLVDVjR2tJT282U3V5WXpFZmpRQjBFTTVuWmdBUG94ZThvZjNzZ1NxQ1FNM2prZEZMdnBSdlIxMys3VVZSdWhVRlNhdk5PNm90d3A4OFpaMyt0NE02SEx0Y2g2T1Q5QUcvcTljbXRmLy9nVjFKRFljblEyelk2L1lha2ZTclUrUGcxTTQ1TnFQdDNJRXRvTTdXRkhva3lyV0trb29nbENNV0xZamlVWE10SzNnOFV6ZDFXTDNnRGUzdlJSQ29VRVlDd0d0WUZ4eHFnQTJFL2pJMjBGNWhobVFvZDk4QkhObmx4T1RpZzFhR2lEYW5PMjF5VjREeWdXdUI4WWVCNmZuQzlXRXRpS1ZWS2VFMFpHaVhXY3plSm9XTUlpZzVhOVY1REExQU5vS0RlRHlsWjlOU1h4eUFzaUthd3JRcW1DdjJIVmY1ZThhUm94ZmMxbjd4cytraEl0QVV2b2p2eVdyeXhWY1dKWmtzVlN5Wm9RUkEzZGNBb0h6YXg0R2oyd3R1NkZWS003Z01ndGkwMmpiVjQ3Nm9VSkpzMWovQWJBMW1RM1BtOGVUUnNvWkR0Uit4WktDaUVLbU1YVEllWEhQR2RoWUFyWDhGd0c0REdNRW5BSElLNHl2VDU4bldDMmI3M2NleGFaZ1dXYUVLZ1UxZ2pOYlBQN1B2T1lHc1VTQmt2M2hCdG1SV056eGpUazlSV2t0dnhwNlBPajB2QVJqWTlzV2tGZWw4Uld4ZWdqSUY0Ump3QU9uWldNUEJUR2pxdkhtc3p4Sk9CVUQzeHl6bkwyYnFST3ZvUDNOM3E4NGpHNEM3TS9QcGN2TUJlZjBjdlY5azZoWHYrMllubzVRZkdBclJiYUNDMG1XdjJZdEYzZWNlck5EaGtOWklJc1hRUnY1ZGxUdEdBREpTejJnRUUxRUpRTS8vMDI2SGRJRVpMQzhCNkEwdGswZzFKYThEdXpKZHBoUzgyUUJFWmo1ZGJqN2d4Wk41ZXIvSVpJKzY3cHNjZ0U3UWFET1VNeUMwV2I4K2dYanVSNEY1SjZZc2FYbkZoQm9BR0VWdlVoYjYwaklTZ0NRbm9oL09MQmd2SXJMOHY3RGRGa0VZTTVkdE5nOTd0dno1ekpxemRmSUJtSmxQbDVzUCtESlA1eHRXN3hmZm56ZWg3SCtaKzMrUnBreVdUMVl4dVVSSllWdHg2VDBmQ1RvY291UVY4NVZrSFJJR2VnRXVFdi9ZS3BrQS9KY2VWbUw4a3Y2dDUvOXB1NjJ0ZmlQV2NGUVZFYTBEWjlXY0xKRVB3TXg4dXZmbmpUOUlnWnlqOTR0L2xkZUEvUzl0TWFHYTlTTmRtc0l4YnZWc2NWSjFHU2NvTXQ0VVB3aEFzbU1aMGFYelFCc3ZkR1JCalF6MEZVcEVKUkFKUU9xNEtBbkJkeitzZmlQSjNiT1luOGZzeWt5VldNZmlOM0JPemNrUytRRE16S2U3T1cvODhhcVF6c2ZFNWtIMWZ2R2plUTB3QURvZG1WR3dPZWlNc1VxSHJHT25TNFVGeTlQL3dBRW9qa0VuSStJcU9JSlFOTGdwQ1hoY21MQXREL0Qra2dRRTIzNUw5M3RqK1lCcWdUWDlCaUNlVy9OZWRUNEFtUStZa1UvM3NienhCeW1RdVpobThnMVQrUWJWK3dXRmRqS08vVGUybUVGTmxDYjZnUEY3MDhWSjFUWEhnS2Q5MUduWnBEZmkxay9nTTJ2cVUzRFVuQ3VCbU5RZTNQOXZ3NnBlMjI5S092QjBLMWsrWlMrcm5yZk0yQWxBM0pNWnRhaC9FWktaVDNkcnh1RHoxTy95eEF3dTlKZ0p4cjNsUWZSKzhhYThCdXkvd2RXUVpBVmwrWnpDckczcTljL1lya21IeTNJUllyeUFBcUFrRUJJbG9wSnhOTlViRVIrZkEvSCsvK0FBZFA5UG1TOWRhemljSnlibTdtbEI4blIyZEkxSHZnVmtPbFpHUHQybk0yOUdDYW1jR1pqQXdsUSt2dnJWKzhYL3pHc0FBVWlMVlBwL3dkK3phVE1GV3crL2tBQTBHUVFucEN3NW1Ec0FNSXJjUkI1bUMvK01BZmZUd2dmd0tZMktmbUNaNlpJa1VTaHJ4WHhCWDR5WWFWOEh6bWNuMTNqVUE4Q01mRHFXWWVRY1NraFZPbDhVNnV4SDd4ZWtyc2c0OWg4b2lDRU5nQzVUVUc1dkt4eFQ4ZjJhUnRPdGNBS1Exczhzb1B1T1ZVSXdwY2hObEVFSU95TlNJcnJ2djNod25ja1dJWlBac25iY0R5elRwdmczbFU4bXBaUXFvenlmSzc0YWozd0FLaDFMZ3JzRDV0TXhpei9ua0dEMXNIcS9ZTkZPeGtFQWN1VzdvcW1YbGlzdVFPVDdWVjJqd2kva1RnajFSa29aaEJqZThaODNTQ0FFRUpaVzBDM2dmZjh0QURDdDRWQVNhV0lCSzBISTlxOEJGNXlVQU16SXA4dE54NUpnOWJCNnYvamREUFNSbnMwQldJWmVVaXRJbzlJaEhtaFhUdnpDUFFkZGNjblo3NlUxVi9JdkM0U0JDRnlnMjZERk5nN2MrK01oaGI2cWlDaWtUN1dWVW1yNmxZbjJuUkt5cmRaNTFHTUJsWkljMDdHVUJkTWpueTZYQ2lVbXBBNmo5NHZNWmJnQk1GbzU1MnB1MjdQWEFxWFR5QVVRY2l0T1FqQW05eFgwTjlwSXdJUG1TQ21INVF1UHFFUjBMNGtEWWdwOXpPVUw2Zll4a2JaY0ZjZXlBcmVBRjNHbFYrTlJEd0F6OHVrc25UM2ppSUxWU21wV05saE16ZStrOTR2TVpmZ0dBUEplSERqcENyZ00wMVRkcnk5T3p2bVlBekFxTFZXSXdFU2h3emJSd3dTRW4rTXFQNmJRSzV0WmxXeWhqQ0NDc0MxOVh2N2dPbkJSYmdwN2N1LzVBT3lWanFWTW1BNzVkSlo5bkhGMHlvaFdObGhNeEtuUyswWG1NdHdBbUZxNGltbllickVxTkpQYys5a2ZkNjJSS2gwT244cVY5aFhaOWFza0VQZ0FmSTU2emlvY1VnVmJ6R1QyOGxFdFJNb0t0ZzdsQkh0em5mWk5BK0NRK1hRV004azR1Z2xXSy9OTFlLelMrOFU5R1JlWEQwZy9UeXZoNE5lMTdZYjRaYnI2ZzZ5Ny9hTldjb1BwaktSVHNKSWFnczVJSndrRUF2NmVuMDVTNkdVQmZSV3NVRXhaeVZaVlFDUXdyZ043V2ZkZDQxR1BCY3pJcDhPRGVYZlRTYkJhNllZeGxZOC9wM3EvdWRjM0MralRidHZxdDJvYWRuQjJtNG9OZ01uMFcwcCtoWVdIV2J3Zzl5VS8wS2I5RUl5KzV5MmhpQ2l0NFVnS3lUZUFrTjhWYWxrNExlL2xkbE9OUno0QVdXQlJNNmZkSVBmSHN0dy9HK1NFNXJNblZRL2tBNUFrTEhTMGFrN1Y3cmVYZmhnQUNhQnFEdEQzZS9ubWM1azlrQS9BODBKUmVxK1UzOHpHVnAzT2JKby9CdkFPRDNkdHdpV2FyOXpFSHNnSElHbEZ1YnFTeDcrSmphMzZhbkxMY0R2dmd3QStORHBEZklMditxbHp1WHdBWHVTanJrS2VtbE8yZTNVMXVXVVluTDhkd0IvNWUyYXBjYTlMTnYrdnNRZnlBVWhlWDRWZ3VCK216SXNhRzludHF4aEY0WGJlM1FEK243L3VITEFXOXdRMXRibE1SUS9VQTBDYUhDN3BsWEVoK3E0VDBPV2NmaGxlWVRTSEJLMEVIL21pK2ZjUnVLUW40STZmV3Blb0I0QWV2Q3ozSE9PbTl5YjNGNW1CbFpCTmNsWUNqMWFSZnlmcmJnUENUUjZBeksrdkQ0Q3lnbFg3anBtTjdIWTY2ZDFFMGN0ZElyRUVFNHdFSU1sYW0rUGs3WUY2QU1qN0V3QVZiVTgydlRlckN3aEFYb3BKTjl6VkkrQVlyT2VVTExaZ0VyWTJ4OG5aQS9rQUpHV3IwbmFVV2RGcHkyY1Qrb0NXanBkakxGeEU1VXpZSUJCcEVVWDVuTG5sdkFrdGI3NlNQVkFmQU9VSHBpQU1tOTZic1Z0Q0FNYUtBTElDTXl4RHE2Y1hmeWNBK2IvbU9MbDZvRjRBaXFCUklFekJwNy9YMkFmMCtmaTFYSWlvTUlsQUkrQUlQSUdQbWVST1dWM2oxWnV2eXUyQitnSG9GZlppRFMybEMwTGlZNTJXVUFEa1FvVFRNSDFCRlNZUmRIb1JmS1N1NXY5cXJpek1IWVBUK3Z4NkFSaFN1RGNBenptRG81WkdIVDFQQUtZTXdReE1FMmppU28vZ0V3QnJycSt1NDFaT3krK29ENEJhQ2NzWFRQaVNJM2V5OHM0S0dvRzhRd0NNRk0rMGdnUWhMUjBCRjE5U1h1RC9heWFrejd1UjAvVHNNY3hnM1NqZnFXTkEwaHNyZ2Evb2phcS84V1BjQytZSWs0S2U0Q01TdUIyWFZodDFPajh6SWZYbFU4QnRVOERobVlSWFdkZnJkRjFmZ3IzK1M4QXQ0OENEMDREVmpYUVNETzcwUFRVbmFKNXVPQ3dzSUlGSFNTRnkxcEtQV0NEc1p4Q3B3OFVWZ0tTUHhMWE05MzdPenh4QWxqemNQQWJjc3dVNFFoNFYzVU44bUtvZUttL2J1NzhJZktKUWE4VkQ0OEN5bEhRaUwzTzMvcWc1UmYzMEJLQUNNdEpYalhLUWNmQlNLOERmcWMzS1ZDd3VOMlZGR1JubS95S1p0cTRSZTVpZnlRUWdNMkErQmVCM0dIYVpCbzVNQUl1ZTBsN0t0M2NDNHhodys1ZUw3VHVDa0prMWpCdHllcmJVZllHNUV4alovcHFyeEU1ZkFPck9xNVNtb3dWSXJScDFJeVQyUjYrZmcwYmdWWUc0Q3N5WmUyVXNhaU9HS1hyNFNmcDlrOEN4Q1lBRlNLeXZYZVkxbzFCeFF1eDkxeU10ZnNIUHV0Z25ueVV1VXZoYzBac2dVWGliK25Wa3E2K1pLYUFCSUhzZ1ZabnV3RDlzVm82NnJyUjRJbWRoTEdTUTh6UEwvSmdCUXhlVTFvdVdrTzlQVGdEemJnbVh4cnpNa2F0bDNrZWl2Zkc1eDRyNElSY3o1QmZrTzV2RVowa2dwSWZCWjh5S2psTDE3c3l5MHRNTmNPbjlkbDRGeTZkTEZhYmoxTXB2b3c5SWZ5K0k0TmxvOVh0K1pxVTlWZEpwcVpoNFFERHl4VXlZT1lKd0hEZytEaGdJL1dVVlpsN2FTRXQ5MytHTzlJYTJpdVpLT2ZBN2xocDlKcHZBVnk2MXcybU93TzVobUNnTUhDMUg5TzI0Z3U2VUQ5alArWm1idExSYVNzZWk5U0w0WERQYkFFaC9rR1EvcFNVY2MwbGJBcEZXYjY3bFFVaHBWbkxCc29LcXFaY2xGTW1VdHJ4UGN3eGwzWDd2T0NBdFlMU0NjdWdGUW1xaGRzc0g3SFUrUnpuamlPbFlYQTh3cWtPZmtJdFRBb20rb0t5Z2NhNEVTOGpZK04zejdmU0c0aGZVdHAzaWhVSHJ1VlNzRnkxaVJ2TlArMU43QTVCZEpBQ21WcEFnWlBoR095Q2lnRWpsUEx1ZG43a3ZGdE94dUI0ZzZPakQ4VVdMUmtDWkZSd3JMQ0VYSlFRaHAySyszN2xRZUJDUlgxQTdLUFF0bzFwckZFbVNZbjJtQjlFQXNPK2tZZms4S1FoWkY4eWpWejVncC9NenR5T1VqaVc5YkNVaEVCaEtSQ0NnU2lzNDV1US9QaFgveGZGV01nT25XdTJneEIwVEYvbzBrRVova0NETTFUcyszUkhZbndWVUw2WGhERnJBc3dmSUI2dzZQMU1yVHVsWTBzdW0xVklDZ2xLd0NFQUNxdlFGQ1VLM2dIY3NGUUNNL0lMYXlxUDFrOUpzaFZxcm5jTWFsT1lZdmdjR0F5Q3ZJd3VvZDhZQkpRbVpwbUdKZXlSd2tHdzRuOGpKT0pRTnczaWRMRmhNUk5CMFNnQVNUSnlLb3kvNGllWENlRmZKQlVlVjJTb0FjbEZ5UjBiYm0xT0hUVWlOMC9EVEF3RDd6UWVNNTJkcWo4VnNHRWtWRTJqS2V0RzdBRWhRMGZySkF2NlJDMHRyQzFza2wrSVdsTmluR0xiU2FaZzdNYzB4ZkE4TWJnRjFMUVYxejA4QTJHOCtvTTdQVkY5TXMyR1VFMGdReXArTHd1MnlhZ0xnUjlaYVlwa1N5cFE2YTZRMkRDcXpwa3ZpZXRYSUZkb1pmdWllR21jT0QwRGVQMEhFYkJoTndZUG1BL0w4ekpRc0FUQUtuZ3VFcVMrWFRxa0U0WWZXV3dDVUZaVGtzWUFZd1pmSUJlTjlUdzBjak93dThnRElacXNvU1N2aEVlUURpaUdZRm95V2lTRFJ5cFdnaTY5VVA1c2M1ZkljcXVTQ05lWHFlMlg5WkFIZk03S2hlMnBjT0IrQVQ0MSthTzVpUkQzUUFIQkVIZDljdHVpQkJvQU5Fa2JhQXcwQVI5cjl6Y1ViQURZWUdHa1BOQUFjYWZjM0YyOEEyR0JncEQzUUFIQ2szZDljdkFGZ2c0R1I5a0FEd0pGMmYzUHhCb0FOQmtiYUF3MEFSOXI5emNVYkFEWVlHR2tQTkFBY2FmYzNGMjhBMkdCZ3BEM1FBSENrM2Q5Y2ZPeHFZSjJhdTlSZFB0ZHAva2hvRU9sZ2xEWVQzOVYxUHpRRlhMc01YQWxndDlQQ3hKS1BidWZ5ZjgvS0hJUGZCUEFaQUJmNzlYYzVYUTBaUTFRNzM2ME5ieG9IcmxzRHZzNVpSc2dvMHVuZTA2Ynk2WDFtWnZ0UDk5UE5BcDRGNExzQlhBNWdqdzhFR1RlcWFHRjRRaHpRRjgwQ1g3Y0F2R0lkZURZQWZoZFoyc1RLVWNWcnBFN25kMzFONWdqOGUyZElvMm9zazdOWnBNZEswWjE5dHYrYko0RjlLOEQxQUNqOHlmTlNpa0hlZys1Wjk2OW01N1kvOC9aUCtkUExLWmhQL3JjQStBWUFGN2cxb1JVaEVNVXpGTXQ2ZVNKZlg3OGIyRGtQZk0waThHSUFYK3VXbEFNcHByZVVVRXJuOHAyZ3pUbCsyZmxnL3NEYlRrdklPaWsrQ1AyMC8vbXp3QVh6d0RjQ3VOVFBKZUZYcEVwTTZRRWpJSG0velRGOEQ3VDVnQVRZTlFDZTY5YUFsb1JUR3VsZkJFU0JTWU55eFI1Zy9CaHc3aEt3WndsNHZrOUxuTTVKbXNCelV5REdBWDNCOEcyM016L2c5QnVVYS8wSWl1dGZNa2o3endLbW5nQXVYU3ZPcFV2QVdZQnRGNEJUbnNwSWovTzh6UGFmN3FkdldJVHc2ZVpBMEpMUUVoS0VHZ3haaFVqL2R6M056U0t3YlI0NGV4bll2VktjeSttTTVLbTBKaHhJblV0ckdrbXpDUGljZzNXNUxNR2tRaVpaVG05eFM5WjMrNG0ybzhDNWM0WDE1cFRLVzJMYitmQ3g3V0x0all4enFpcWwyOUljdy9kQTVTcVlmNlJUVGlsZytsWUNJWG1JQ0tRNElLOXd4ZlNKWThBWks4Q3VGV0RuYW5FdWE5WlRBTXNhQ29nM0R0OTJPL012blJHQnRHd2txS1JtTUVrcUNhYSsyayswTFFEVGg0clA4OFVIajc0a0YxV2FBVG85UUhRN21tUDRIdWdZaHRFS2o0UEI2WlErRlMwaFFhaHBsZFB5YTFrWFRPcU5ZOERzY2dHK0hhdkF0dFVDdkJ4SW5pdHJrZ0w0bGNPMzNjN3NwQmRNM2tBdVNucTJueDlnUWZBaDRKeVZ3dnJ4d2VsMnozcDRhTWx6SDZETTJ6L2xUKzhhQitRL09UNEVFcWNrV1FTQmtHRDZFUUtRbkRDTHdCU25ZZ2NmMzJmWGlvR1VGYXdDNGVzeXU3Q1hYbkRQOXRPQ3N5RDRLTEIxcm1ndlg3emZidTJXRy9KdG1lMC8zVS92S3hCTkFNb2kwS2Nqa0FUQ04zSE9FcjNVQWpEcndPUDcxclhpeFlFa2VLTUZsU1g4b2N3UjZLVVhUSjdBYU5FMnRGOFdmQTRZZTdLdzFtd3ZYL3labitlS252Y3JmekM2SUsvT2JQL3BmbnBmQUdRbnlTb0lTQnFVWHlBQVNTMUFLMEpmYWdXWWNSRE9yQUY2NlR4WlFVN2pCT0ViTTBlZ0g3MWdjZ1hTRlpBVjU0TlF0ajlZY05JcGJPTkN5aDhZZ2k4Q1Zvc3BBcER1QjYzZzkyVzIvM1Evdlc4QXNxTTRnTElLQkJJSDhiY0p3TUNOTVg2OEJUcUJiOHM2c0dXdHNJQTZqd0RrNjYyWkk5Q3ZYakE1QTZOVmEydC9JQWljbkMvYUdWKzhUNzRJUVBtL0FtR3VCYys4L1ZQKzlJRUF5THNsQUtNVi9MZ0F5SVVJbmZuandQUXFNT09nSS9Ec3RRNU1yN1VBcU1GOFYyWVhEcW9YWE5sK0VRUTZOOXYyOWFLZGVzVXBXSlpiQVB5UG1lMC8zVThmR0lEc3NEaWQvcFVBU0N2Q2FYZ0ptRmd1QUVmZ0VYVDI3Z0RrdXdhVWcvbmJtU013akY3d2h2YkxoU0RMNVR3d3ZkUnFvOW9xSHpBQ2tDQjhVMmI3VC9mVGh3SWdPMDFUMUlNQ29BWnhHUmhiS29BWFFVY1FUamtJK2E0QjVlNUZ6akdzWHZDRzlnZHFyTEdGWXJwVkcvVXVIekJPdzIvTGFYeHpiaDQzREtlb0p3bEFIcUxuZFNzNHVkb0NvSUJIUUU0NUVQazNEdWl0bVlPUW94ZGN0cDgrckZ3SVdzR0ZZaUZGb0xHTmNoY0VRQzZlK09KQzVKMlo3VC9kVHgvYUFwWWRKMzdBeUpLL0RJd3ZGeFl2V3IwSXdFbi9IMU9wY281c3ZlRFVoU0FBRjRISnBRSmtXaXhwNmsybjRJWWZNR2YwYW1ESGV2Mkk4K2w0L1Vidk53OEVvenc3MndKZVBPSjh1bmQ3RWtLajl6dEtHQTEvN1d3QVRvNDRuNDVwV0kzZTcvQUFHUFdaMlFCa1lIQ1UrWFRNZkdHUW1ZSXhqZDd2cU9FMCtQWHpBVGppZkRyS3RUWjZ2NE1QL01seVJqNEFSNXhQRitWYXFaTEpGMVV6S2RQVjZQMmVMRERyM0k1OEFJNDRuMDdaTUFSYm8vZDc4Z011YldFK0FFZWNUOGU5WU9uMlVoZXUwZnM5dFVDWUQ4QVI1OU1wRzZiUit6MjFnS2ZXMWdOQXo0Z2VSVDVkVEVabzlINVBQUkRtQXpCbVJNOEJKenFmTGlZalNLS3IwZnM5ZFlCWUR3QkhtRTlYdFJmTXNJejA0YVFaMStqOW5weWdyQStBa3FzOHdmbDBCQ0NUV1JxOTM1TVRZTDFhVlE4QW8xemxBbkFpOCtrRVFHWlROWHEvdlliNzVQdC9mUUFjVVQ1ZEJHQ2o5M3Z5QWF4WGkrb0RvRkx5VDNBKzNSY2F2ZDllWTN4Uy96OGZnQ1FYL0xQUjNTT3prb241NWpnMWV5QWZnRDhNNE5jQVBENmFEbUJ0QjFlNE5NRE5jZXIxUUQ0QWJ3Ynd4d0RlNFV2UkU5d0haRzFnTlNYRExsd0xOY2VwMVFQNUFQeHp6d2o5SUlBUG5YaFQ1T1JjNUVZQ0E5SE5jV3IxUUQ0QW1SSDZGUUJNVFNaWkg5OFptRDVCaDVnMUZvcGlObnMxeDZuVEEva0F2QWZBRXdEdWRuSStFdlF4UGZrRXpZZmFDWFJTQmx1UU1CN1lIS2RHRCtRRHNCTkJILzkrQWtBb2JxVEFER0s3SW53MXg4bmZBL2tBN0VYUXQ4a2dyR0FHTWZCeFo1Q3Y1amk1ZXlBZmdMMEkrcjY4dVIwUW1VRm9CUVU4dmZOdnpYSHk5a0E5QU9Sb013N0NkR1FDam9VWkR3TDRrdi8rOE9aMWdKaEJJakdEZ01oM3ZUYXZCYzAzNS9SQVBnRDdKZWdqT0RmaGlNd2dvcWVKd05QUFRhQjZFenEvaHErc0I0QWNYZVhFUCtaaEdWbzl2UmltSVFENXY1b1BBWkN1cGdESTl3ZzgvcXovMVh6NTV1c3lleUFmZ01NUTlHVTJPcDRlQWNocE9JSlFRRXovVnVQbG02L0s3SUg2QU1qZ0d6ZGw2UXR5WDVqV2pwUUZldkYzbHEzeGY2eWhyT2xJQVVnUUNvalI4Z21FK2w5TmwyKytKck1INmdFZ1I1VUE1S1lzYytBWm1DYlFDRGkrSXZnRVFNb2IxWEJFQUhJYWpnQk1MViswa0Nkd3M2YUd1M3pxZmtWOUFHVHdqZnRnM0pSVlZSQXRIUUVYWC93YkFjb1hQNWQ1Q0lEOEdvSkt2cURBbG9LT29Jei95N3g4YzNwbUQ0emhhcXdqUnpDWXlRZzVncjJaZ3NGVEx3ZVdyOFhRZ3NYamJ3TFdybk50TWxLZ05vTEJtWkFhN1BUQ0F1WUlCbE12bFdRc3d3cjJVbFV3NDVqZERTeDhIYkQrQ3RkK0hWQ3dlUEtiZ0pWOWFBU0RNOFlnNTlUV0ZEeXNZUEJ0bVlLOTFJYk5PSGFQQS9NN2dVWEtYQTRoV0R6NzljQTgrVzBhd2VDTVVSaisxSFlmY0JqQllPNTRNTVkzdEdEdjhJM25tV1NIT3pZT0xKMExMUEdYQVFXTHozb0I4TVFVc0VhMTZrWXdPRzh3aGpoNzR5SmtVTUZnYnNObENmWU8wZXB3aXNzVlkzNGJzSHcyc0VJUmtBRUVpL2RjVTBTUDVxaEYxZ2dHNXczR0VHZFhyNEw1MTM0Rmc0a0FqdURRZ3IxRHREcWNVbVpFVHdBclp3QXJ1NEJWcXN2MEtWaDgvbzNGNHYwUVhaQkdNRGh2TUlZNHUzTVlodjk1WmgrQ3UxeEJjeHVPVS9IZmVESXE1Y3Y3RnV3ZG90WGhsQ0JYak9YWkFueXJPNEJWNmluMElWaDh3U3RMdVdDc1VBeXZFUXpPRzVBQnorNGVCK1IvZXdudS9rT1AvM0cvbDRrSlRFUmxsalF0SW90MmU1My9Jd08yT1BsNEZMdGNuQ3FBcDljYWhUNTZDQlpmK0xwU0xoaHoxTjVxQklQekJtVEFzL3NMUkhjVERLYmlOSGRCR0d5bU9DLzNoZ2xFdmdqQW5vSzlBN1k0K1hnaVY0elZXWURBcy9ldHhhdWJZUEZGUDFRa0x0Q0lQOG5lYUFTRDh3Wmt3TFA3QXlDL3RKTmc4TC94TE5CdStZQmRCWHNIYkhFRkFJTmNNVmFtZ2RXWkFvUnJmUGRYbThLaXRMZG1nWXZlV0FxKzJ5N2lNcWZ1UmpBNGIxQUdPTHQvQVBKTHF3U0QzK3k1VDF5STBBb1NiQXhNTXpHVjFvOC9NeTJybzJEdkFLMnQrR2dpVjR6ajQrM0FJd0RYdHdCclZKZXVFQ3plKzlhVzREdXQ0UHhrSWhZc2RldEdNRGh2b0RxY1BSZ0ErU1dwNE80dmVRNVV2L21BR3dSNzgrNnJRcTRZcTlQQU9pMmZBNC92QmtLdWRLVlU3Vlp3Nzd1S3ZXRnVaYnRjTU5iNXYwWXdPRzlnK2p4N2NBRHlpNlBnN2djY2dJeGxjQTVUS2hhRDAxeVlLQm1WRnBCWk1meC9tMkJ2bnkzdDhMR3FvcVRsaVpiVkkrZ01nSHduTUFuQ0lGaTg5N2NMQUFaNlF5ekZ6elNDd1hrRDFPUHM0UURJTDVYZ0xtazVKSGsvU0Q1Z0tkaWJkMzhWY3NWWUdtdUJUYUF6RUhMSGd5Q2Nhb2tCNy8xSWtVRVQ1SUt4d0Y1cEJJUHpCcWJQczRjSElDL0FhZXF2UEw5cG1IeEFFK3p0czZWZExDRC9sY2dWWTNVeVdEMEJqMVp3cWdDZ2dYQTdzUGZXQW9BSnZhRXRaQnJCNEx5eDZlZnNQQUR5Q3RtQ3ZmMDBzL05uT3NnVlkzbThCVFJaUFp1R0JVQUNkQXJZKzVsV0RxR21ZYklyTEhFeDBnZ0c1dzFPSDJmbkE3Q1BpelFmYVhxZ1V3ODBBR3l3TWRJZWFBQTQwdTV2THQ0QXNNSEFTSHVnQWVCSXU3KzVlQVBBQmdNajdZRUdnQ1B0L3ViaURRQWJESXkwQnhvQWpyVDdtNHMzQUd3d01OSWVhQUE0MHU1dkx0NEFzTUhBU0h1Z0FlQkl1Nys1ZUFQQUJnTWo3WUVHZ0NQdC91YmlEUUFiREl5MEI4WllOTWJrWCtaZWtwdUlpT1FyUGFyK3hzODg5SEpnNmpaZzVqQXd2Vlo4QitsbDlQbE81L0ZjL28rRUNqbkhmaTh6WWZrdk01dWxtcDRxSlhWcXg1ZGVENHpmQWt3L0NHeGRBWmdvSGZ1aDEzMVFrYUk1aHU4QnM0RHM4QjBBV0xuSVJHQ0JzRmZuODdKZmZETXdkak93NVI1ZzhnaXdaYTM0am5RUVV3RG85OXdCZko0VE03Q09pTmRsYWoyckEvamVWL3ZmRGVBVEFQNFVHSDhJMkxyYzZnYytTSHFZNG9NWjc0VlNLTTB4ZkErVVV6Qi9vQlVVQ0tNbDZ6U1EvUHNYcVpENUtRQy9BMHcvREV3Y0FjWVhnWW5Wd3Bwd0FEdUJrZWZuQ2ltOTBGbUJXWHduSzg3VWVuNTNCSThzYnV3cWF6OXA1VWduUWhCUytaTjF6RThBazB1dHZpQ3dxOERJOC9ueDVoaStCemI0Z0p6S1pFMVNFRlpaZ1M5LzJwV1IvZ1RBSjRISlE4REVNV0I4QVJoZkJzYVdDd0RxdXdRS3Z2TmdIWHZPY1lWYlBGSlBrdytkRHhDL1cxWTR0V0Rwdy9SbGdvNGxvMVQ0L0t4VGloRE5wSndqMy9VaU1MWGVtcHJqZmZDN2VXcHpETjhEbFlzUURpS3RWeHpFcW9Ia3lYOUhSaXpXK25JZ2FRbnZBaWFlQkNibUMwczR0Z1NNdTJyTWVQQVI5WDI1MmpYa2xhVEZVMTA4SzBNSGF2L252SjZaeFZWazlPSTdHUjJJWm9HUU5jL0hnYkhnSXdxSUxJVnVqdUY3b09NcVdGYXdDb1J4a2ZFSUI1Q1dna1JFQkNOZjl3TVRjOEE0UWNpQld5b0d6MTZyd05nYU1MNWVXS3BjdFlaTDNOK1RXTFgwZ3Z0dVAwSEhrMm4xNkpEeXhYbVZoZlUwcXl3YkpicjVHU3VYS3hBL3NWNVk5VVlXZG5qd3lTM3FLS2dhcldBNjlXZzZmalFPSUswSGFkbklqUFZGQitBaU1FNEF1aVVrQ0ZuRVN5Q1NrbUF1VTdDam0xNXdYKzJYMmlmQlJuOUE4bUtjVzJVRmpVTFZRY2dWRGw4MHU0MFNZaDc2M0ZmdnF1aExDeGl0b0JZVXNvSmZqWEt0dEJ5TXE5Q0tjSG40c1B1Q2JnWE5Kd3lXa0VDY3o1UTM3NlVYM0xObmNaeVFBQUFERWtsRVFWVDlmRmdJSnM2bEJCd3RuM1R0NkZwSXo0UldudVF4UGgyWElHem00Q3dROWhXSUZnQlRLMGdRSGlJQUpkZEtxMEVMUWgrS0wxcVVSNE12U0Vzb0VOSUtyZ0FMSE5pTW94Kzk0Szd0bDlxbm5NaW84TVNmNlNOd0dwWVZqQ0RrL0p1N2lzcTQ5NmZDcVgwQmtEZXFsV3dLd2ljMWdBUVNwekdSRW5GZ1JFejAxZUFMTHZ2cTJLZmk0NW02Y2YzcUJYZHNmeFJiSk1obzhkaW1xT2hFSzhjWFFScjlRVnB2UG9ETk1YUVA5QTNBQ0VMRnhQaCtqQUNrUDBmTElLRkNDUlJxS3VQVWRxamxDOW8wN0pad0tWTkhlQkM5NERRY1pPMFhBQWttZ290QWs5UVlyUjlmL0J2QnlZZk1TQVREVk16d1RYTU0zUU1EQVZBZ1ZIQ1o3L01hUUs0UVpVSGlOQ2JCUWxxVXc3NFlDYjdnY21Za2VsQzlZRmx3dlZ2N1JSQW9yVHVCa0VDVTlhc0NJRDkveDlCOTM1ell6eUtrcXBmaU5IeGNBMGdMUWd2QkFhUFZrQ3FtM2gyQXRDNW0vUnlFcXp3LzR4aEdMM2hEKytNbXNsZ3FDYmdVZkxLQWNScm1UbEJ6RE4wREExdEFYVWxXY0RtMUlPSUlKQWpsVC9GZDA1bGJGUUZ3amR0Z0djZXdlc0Z0N1JjL0d4OGlXalVDakdDVDFZdldUMU13Z1VxcmYzTkc0NXRUYmN1MGF4aW1XeDl4RU5jRVFIR2JjWUFFd3RTWFNxWTBnbkNkZ2V1TUkwY3Z1R3gvRlVHZ0Zod0VZclI4MFFja1dOK1gwZmptMUR3QVd2OFJnSkZpbEpaQnpuejBwUWcrQVpBQWxWV2gxR3ZHa2EwWHpCMGNDUWkzMGFTR1ZhOUFGNjJmTE9CN01ocmZuSm9Qd1BFUjU5UHgrbzNlNzZtTDVLd3AyRzU3eFBsMGt4YzNlcituTHZ5S3RMbWhmVUM3OFJIbjA4MU9ObnEvcHpjQVI1eFBSOW1SUnUvMzFJVmd2Z1VjY1Q0ZE5hb2J2ZC9UR1lBanpxZWp1bXFqOTNzNkEzREUrWFJVZzJWU0NqZGFHcjNmVXcrSStWUHdpUFBwcUpqTzhKMU53NDNlN3ltSHdIb0FLTUZkN1FFckFlRUU1Tk5KTWIzUit6M2xzR2NOemdmZ2lQUHBvbUo2by9kNzZvR3dQZ0NPS0o4dUtxWTNlcituS3dCSG1FK25vcVJHNy9mVUExOTlVL0FJOCtrRXdFYnY5M1FIb0VoWlRuQStuWXFTR3IzZkJvQXRhaXFCVUltZG01aFBKd0EyZXIrbkt3QkhuRStYMWdVelNiblIrejExd1BqL0FlQ3BQREQzdDdydkFBQUFBRWxGVGtTdVFtQ0NcIjtcclxuIiwiaW1wb3J0IHtcclxuXHRDb2xvcixcclxuXHRMaW5lYXJGaWx0ZXIsXHJcblx0TmVhcmVzdEZpbHRlcixcclxuXHRSR0JBRm9ybWF0LFxyXG5cdFJHQkZvcm1hdCxcclxuXHRUZXh0dXJlLFxyXG5cdFdlYkdMUmVuZGVyVGFyZ2V0XHJcbn0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5pbXBvcnQgeyBDb2xvckVkZ2VzTWF0ZXJpYWwsIFNNQUFCbGVuZE1hdGVyaWFsLCBTTUFBV2VpZ2h0c01hdGVyaWFsIH0gZnJvbSBcIi4uL21hdGVyaWFsc1wiO1xyXG5pbXBvcnQgeyBDbGVhclBhc3MgfSBmcm9tIFwiLi9DbGVhclBhc3MuanNcIjtcclxuaW1wb3J0IHsgUGFzcyB9IGZyb20gXCIuL1Bhc3MuanNcIjtcclxuXHJcbmltcG9ydCBzZWFyY2hJbWFnZURhdGFVUkwgZnJvbSBcIi4uL21hdGVyaWFscy9pbWFnZXMvc21hYS9zZWFyY2hJbWFnZURhdGFVUkwuanNcIjtcclxuaW1wb3J0IGFyZWFJbWFnZURhdGFVUkwgZnJvbSBcIi4uL21hdGVyaWFscy9pbWFnZXMvc21hYS9hcmVhSW1hZ2VEYXRhVVJMLmpzXCI7XHJcblxyXG4vKipcclxuICogU3VicGl4ZWwgTW9ycGhvbG9naWNhbCBBbnRpYWxpYXNpbmcgKFNNQUEpIHYyLjguXHJcbiAqXHJcbiAqIFByZXNldDogU01BQSAxeCBNZWRpdW0gKHdpdGggY29sb3IgZWRnZSBkZXRlY3Rpb24pLlxyXG4gKiAgaHR0cHM6Ly9naXRodWIuY29tL2lyeW9rdS9zbWFhL3JlbGVhc2VzL3RhZy92Mi44XHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIFNNQUFQYXNzIGV4dGVuZHMgUGFzcyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgU01BQSBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtJbWFnZX0gc2VhcmNoSW1hZ2UgLSBUaGUgU01BQSBzZWFyY2ggaW1hZ2UuIFByZWxvYWQgdGhpcyBpbWFnZSB1c2luZyB0aGUge0BsaW5rIHNlYXJjaEltYWdlRGF0YVVSTH0uXHJcblx0ICogQHBhcmFtIHtJbWFnZX0gYXJlYUltYWdlIC0gVGhlIFNNQUEgYXJlYSBpbWFnZS4gUHJlbG9hZCB0aGlzIGltYWdlIHVzaW5nIHRoZSB7QGxpbmsgYXJlYUltYWdlRGF0YVVSTH0uXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKHNlYXJjaEltYWdlLCBhcmVhSW1hZ2UpIHtcclxuXHJcblx0XHRzdXBlcihcIlNNQUFQYXNzXCIpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBjbGVhciBwYXNzIGZvciB0aGUgY29sb3IgZWRnZXMgYnVmZmVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDbGVhclBhc3N9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5jbGVhclBhc3MgPSBuZXcgQ2xlYXJQYXNzKHtcclxuXHRcdFx0Y2xlYXJDb2xvcjogbmV3IENvbG9yKDB4MDAwMDAwKSxcclxuXHRcdFx0Y2xlYXJBbHBoYTogMS4wXHJcblx0XHR9KTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVuZGVyIHRhcmdldCBmb3IgdGhlIGNvbG9yIGVkZ2UgZGV0ZWN0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldENvbG9yRWRnZXMgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoMSwgMSwge1xyXG5cdFx0XHRtaW5GaWx0ZXI6IExpbmVhckZpbHRlcixcclxuXHRcdFx0Zm9ybWF0OiBSR0JGb3JtYXQsXHJcblx0XHRcdHN0ZW5jaWxCdWZmZXI6IGZhbHNlLFxyXG5cdFx0XHRkZXB0aEJ1ZmZlcjogZmFsc2VcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0Q29sb3JFZGdlcy50ZXh0dXJlLm5hbWUgPSBcIlNNQUEuQ29sb3JFZGdlc1wiO1xyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRDb2xvckVkZ2VzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlbmRlciB0YXJnZXQgZm9yIHRoZSBTTUFBIHdlaWdodHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0V2VpZ2h0cyA9IHRoaXMucmVuZGVyVGFyZ2V0Q29sb3JFZGdlcy5jbG9uZSgpO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0V2VpZ2h0cy50ZXh0dXJlLm5hbWUgPSBcIlNNQUEuV2VpZ2h0c1wiO1xyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRXZWlnaHRzLnRleHR1cmUuZm9ybWF0ID0gUkdCQUZvcm1hdDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbG9yIGVkZ2UgZGV0ZWN0aW9uIHNoYWRlciBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29sb3JFZGdlc01hdGVyaWFsfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuY29sb3JFZGdlc01hdGVyaWFsID0gbmV3IENvbG9yRWRnZXNNYXRlcmlhbCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU01BQSB3ZWlnaHRzIHNoYWRlciBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7U01BQVdlaWdodHNNYXRlcmlhbH1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLndlaWdodHNNYXRlcmlhbCA9IG5ldyBTTUFBV2VpZ2h0c01hdGVyaWFsKCk7XHJcblxyXG5cdFx0dGhpcy53ZWlnaHRzTWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSB0aGlzLnJlbmRlclRhcmdldENvbG9yRWRnZXMudGV4dHVyZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBTTUFBIHNlYXJjaCB0ZXh0dXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtUZXh0dXJlfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuc2VhcmNoVGV4dHVyZSA9IG5ldyBUZXh0dXJlKHNlYXJjaEltYWdlKTtcclxuXHJcblx0XHR0aGlzLnNlYXJjaFRleHR1cmUubmFtZSA9IFwiU01BQS5TZWFyY2hcIjtcclxuXHRcdHRoaXMuc2VhcmNoVGV4dHVyZS5tYWdGaWx0ZXIgPSBOZWFyZXN0RmlsdGVyO1xyXG5cdFx0dGhpcy5zZWFyY2hUZXh0dXJlLm1pbkZpbHRlciA9IE5lYXJlc3RGaWx0ZXI7XHJcblx0XHR0aGlzLnNlYXJjaFRleHR1cmUuZm9ybWF0ID0gUkdCQUZvcm1hdDtcclxuXHRcdHRoaXMuc2VhcmNoVGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcclxuXHRcdHRoaXMuc2VhcmNoVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblx0XHR0aGlzLnNlYXJjaFRleHR1cmUuZmxpcFkgPSBmYWxzZTtcclxuXHJcblx0XHR0aGlzLndlaWdodHNNYXRlcmlhbC51bmlmb3Jtcy50U2VhcmNoLnZhbHVlID0gdGhpcy5zZWFyY2hUZXh0dXJlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIFNNQUEgYXJlYSB0ZXh0dXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtUZXh0dXJlfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuYXJlYVRleHR1cmUgPSBuZXcgVGV4dHVyZShhcmVhSW1hZ2UpO1xyXG5cclxuXHRcdHRoaXMuYXJlYVRleHR1cmUubmFtZSA9IFwiU01BQS5BcmVhXCI7XHJcblx0XHR0aGlzLmFyZWFUZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcclxuXHRcdHRoaXMuYXJlYVRleHR1cmUuZm9ybWF0ID0gUkdCQUZvcm1hdDtcclxuXHRcdHRoaXMuYXJlYVRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XHJcblx0XHR0aGlzLmFyZWFUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHRcdHRoaXMuYXJlYVRleHR1cmUuZmxpcFkgPSBmYWxzZTtcclxuXHJcblx0XHR0aGlzLndlaWdodHNNYXRlcmlhbC51bmlmb3Jtcy50QXJlYS52YWx1ZSA9IHRoaXMuYXJlYVRleHR1cmU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTTUFBIGJsZW5kIHNoYWRlciBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7U01BQUJsZW5kTWF0ZXJpYWx9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5ibGVuZE1hdGVyaWFsID0gbmV3IFNNQUFCbGVuZE1hdGVyaWFsKCk7XHJcblxyXG5cdFx0dGhpcy5ibGVuZE1hdGVyaWFsLnVuaWZvcm1zLnRXZWlnaHRzLnZhbHVlID0gdGhpcy5yZW5kZXJUYXJnZXRXZWlnaHRzLnRleHR1cmU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuXHQgKi9cclxuXHJcblx0cmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcclxuXHJcblx0XHQvLyBEZXRlY3QgY29sb3IgZWRnZXMuXHJcblx0XHR0aGlzLm1hdGVyaWFsID0gdGhpcy5jb2xvckVkZ2VzTWF0ZXJpYWw7XHJcblx0XHR0aGlzLmNvbG9yRWRnZXNNYXRlcmlhbC51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XHJcblx0XHR0aGlzLmNsZWFyUGFzcy5yZW5kZXIocmVuZGVyZXIsIHRoaXMucmVuZGVyVGFyZ2V0Q29sb3JFZGdlcyk7XHJcblx0XHRyZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyVGFyZ2V0Q29sb3JFZGdlcyk7XHJcblxyXG5cdFx0Ly8gQ29tcHV0ZSBlZGdlIHdlaWdodHMuXHJcblx0XHR0aGlzLm1hdGVyaWFsID0gdGhpcy53ZWlnaHRzTWF0ZXJpYWw7XHJcblx0XHRyZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyVGFyZ2V0V2VpZ2h0cyk7XHJcblxyXG5cdFx0Ly8gQXBwbHkgdGhlIGFudGlhbGlhc2luZyBmaWx0ZXIgdG8gdGhlIGNvbG9ycy5cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSB0aGlzLmJsZW5kTWF0ZXJpYWw7XHJcblx0XHR0aGlzLmJsZW5kTWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xyXG5cclxuXHRcdHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldENvbG9yRWRnZXMuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0V2VpZ2h0cy5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuXHRcdHRoaXMuY29sb3JFZGdlc01hdGVyaWFsLnVuaWZvcm1zLnRleGVsU2l6ZS52YWx1ZS5jb3B5KFxyXG5cdFx0XHR0aGlzLndlaWdodHNNYXRlcmlhbC51bmlmb3Jtcy50ZXhlbFNpemUudmFsdWUuY29weShcclxuXHRcdFx0XHR0aGlzLmJsZW5kTWF0ZXJpYWwudW5pZm9ybXMudGV4ZWxTaXplLnZhbHVlLnNldChcclxuXHRcdFx0XHRcdDEuMCAvIHdpZHRoLCAxLjAgLyBoZWlnaHQpKSk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIFNNQUEgc2VhcmNoIGltYWdlLCBlbmNvZGVkIGFzIGEgYmFzZTY0IGRhdGEgVVJMLlxyXG5cdCAqXHJcblx0ICogVXNlIHRoaXMgaW1hZ2UgZGF0YSB0byBjcmVhdGUgYW4gSW1hZ2UgaW5zdGFuY2UgYW5kIHVzZSBpdCB0b2dldGhlciB3aXRoXHJcblx0ICogdGhlIGFyZWEgaW1hZ2UgdG8gY3JlYXRlIGFuIFNNQUFQYXNzLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge1N0cmluZ31cclxuXHQgKiBAZXhhbXBsZVxyXG5cdCAqIGNvbnN0IHNlYXJjaEltYWdlID0gbmV3IEltYWdlKCk7XHJcblx0ICogc2VhcmNoSW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwgcHJvZ3Jlc3MpO1xyXG5cdCAqIHNlYXJjaEltYWdlLnNyYyA9IFNNQUFQYXNzLnNlYXJjaEltYWdlRGF0YVVSTDtcclxuXHQgKi9cclxuXHJcblx0c3RhdGljIGdldCBzZWFyY2hJbWFnZURhdGFVUkwoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHNlYXJjaEltYWdlRGF0YVVSTDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgU01BQSBhcmVhIGltYWdlLCBlbmNvZGVkIGFzIGEgYmFzZTY0IGRhdGEgVVJMLlxyXG5cdCAqXHJcblx0ICogVXNlIHRoaXMgaW1hZ2UgZGF0YSB0byBjcmVhdGUgYW4gSW1hZ2UgaW5zdGFuY2UgYW5kIHVzZSBpdCB0b2dldGhlciB3aXRoXHJcblx0ICogdGhlIHNlYXJjaCBpbWFnZSB0byBjcmVhdGUgYW4gU01BQVBhc3MuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7U3RyaW5nfVxyXG5cdCAqIEBleGFtcGxlXHJcblx0ICogY29uc3QgYXJlYUltYWdlID0gbmV3IEltYWdlKCk7XHJcblx0ICogYXJlYUltYWdlLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsIHByb2dyZXNzKTtcclxuXHQgKiBhcmVhSW1hZ2Uuc3JjID0gU01BQVBhc3MuYXJlYUltYWdlRGF0YVVSTDtcclxuXHQgKi9cclxuXHJcblx0c3RhdGljIGdldCBhcmVhSW1hZ2VEYXRhVVJMKCkge1xyXG5cclxuXHRcdHJldHVybiBhcmVhSW1hZ2VEYXRhVVJMO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IENvbWJpbmVNYXRlcmlhbCB9IGZyb20gXCIuLi9tYXRlcmlhbHNcIjtcclxuaW1wb3J0IHsgUGFzcyB9IGZyb20gXCIuL1Bhc3MuanNcIjtcclxuXHJcbi8qKlxyXG4gKiBBIHBhc3MgdGhhdCByZW5kZXJzIGEgZ2l2ZW4gdGV4dHVyZS5cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgVGV4dHVyZVBhc3MgZXh0ZW5kcyBQYXNzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB0ZXh0dXJlIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wYWNpdHk9MS4wXSAtIFRoZSB0ZXh0dXJlIG9wYWNpdHkuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc2NyZWVuTW9kZT10cnVlXSAtIFdoZXRoZXIgdGhlIHNjcmVlbiBibGVuZCBtb2RlIHNob3VsZCBiZSB1c2VkIGZvciBjb21iaW5pbmcgdGhlIHRleHR1cmUgd2l0aCB0aGUgc2NlbmUgY29sb3JzLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3Rvcih0ZXh0dXJlLCBvcGFjaXR5ID0gMS4wLCBzY3JlZW5Nb2RlID0gdHJ1ZSkge1xyXG5cclxuXHRcdHN1cGVyKFwiVGV4dHVyZVBhc3NcIik7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbCA9IG5ldyBDb21iaW5lTWF0ZXJpYWwoc2NyZWVuTW9kZSk7XHJcblxyXG5cdFx0dGhpcy50ZXh0dXJlID0gdGV4dHVyZTtcclxuXHRcdHRoaXMub3BhY2l0eVNvdXJjZSA9IG9wYWNpdHk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7VGV4dHVyZX1cclxuXHQgKi9cclxuXHJcblx0Z2V0IHRleHR1cmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudGV4dHVyZTIudmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQHR5cGUge1RleHR1cmV9XHJcblx0ICovXHJcblxyXG5cdHNldCB0ZXh0dXJlKHZhbHVlKSB7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbC51bmlmb3Jtcy50ZXh0dXJlMi52YWx1ZSA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBvcGFjaXR5IG9mIHRoZSBpbnB1dCBidWZmZXIuXHJcblx0ICpcclxuXHQgKiBUaGUgZGVzdGluYXRpb24gY29sb3IgaXMgdGhlIGNvbG9yIGZyb20gdGhlIGltYWdlIGluIHRoZSBpbnB1dCBidWZmZXIuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgb3BhY2l0eURlc3RpbmF0aW9uKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLm9wYWNpdHkxLnZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0ICovXHJcblxyXG5cdHNldCBvcGFjaXR5RGVzdGluYXRpb24odmFsdWUgPSAxLjApIHtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLm9wYWNpdHkxLnZhbHVlID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIG9wYWNpdHkgb2YgdGhlIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBUaGUgc291cmNlIGNvbG9yIGlzIHRoZSBjb2xvciBmcm9tIHRoZSB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge051bWJlcn1cclxuXHQgKi9cclxuXHJcblx0Z2V0IG9wYWNpdHlTb3VyY2UoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubWF0ZXJpYWwudW5pZm9ybXMub3BhY2l0eTIudmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQHR5cGUge051bWJlcn1cclxuXHQgKi9cclxuXHJcblx0c2V0IG9wYWNpdHlTb3VyY2UodmFsdWUgPSAxLjApIHtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLm9wYWNpdHkyLnZhbHVlID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuXHQgKi9cclxuXHJcblx0cmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLnRleHR1cmUxLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcclxuXHRcdHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7XHJcblx0TGluZWFyRmlsdGVyLFxyXG5cdExpbmVhck1pcE1hcExpbmVhckZpbHRlcixcclxuXHRNZXNoQmFzaWNNYXRlcmlhbCxcclxuXHRSR0JGb3JtYXQsXHJcblx0V2ViR0xSZW5kZXJUYXJnZXRcclxufSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmltcG9ydCB7XHJcblx0QWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWwsXHJcblx0Q29weU1hdGVyaWFsLFxyXG5cdEx1bWlub3NpdHlNYXRlcmlhbCxcclxuXHRUb25lTWFwcGluZ01hdGVyaWFsXHJcbn0gZnJvbSBcIi4uL21hdGVyaWFsc1wiO1xyXG5cclxuaW1wb3J0IHsgUGFzcyB9IGZyb20gXCIuL1Bhc3MuanNcIjtcclxuXHJcbi8qKlxyXG4gKiBBIHRvbmUgbWFwcGluZyBwYXNzIHRoYXQgc3VwcG9ydHMgYWRhcHRpdmUgbHVtaW5vc2l0eS5cclxuICpcclxuICogSWYgYWRhcHRpdml0eSBpcyBlbmFibGVkLCB0aGlzIHBhc3MgZ2VuZXJhdGVzIGEgdGV4dHVyZSB0aGF0IHJlcHJlc2VudHMgdGhlXHJcbiAqIGx1bWlub3NpdHkgb2YgdGhlIGN1cnJlbnQgc2NlbmUgYW5kIGFkanVzdHMgaXQgb3ZlciB0aW1lIHRvIHNpbXVsYXRlIHRoZVxyXG4gKiBvcHRpYyBuZXJ2ZSByZXNwb25kaW5nIHRvIHRoZSBhbW91bnQgb2YgbGlnaHQgaXQgaXMgcmVjZWl2aW5nLlxyXG4gKlxyXG4gKiBSZWZlcmVuY2U6XHJcbiAqICBHREMyMDA3IC0gV29sZmdhbmcgRW5nZWwsIFBvc3QtUHJvY2Vzc2luZyBQaXBlbGluZVxyXG4gKiAgaHR0cDovL3BlcnNvLnVuaXYtbHlvbjEuZnIvamVhbi1jbGF1ZGUuaWVobC9QdWJsaWMvZWR1Yy9HQU1BLzIwMDcvZ2RjMDcvUG9zdC1Qcm9jZXNzaW5nX1BpcGVsaW5lLnBkZlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBUb25lTWFwcGluZ1Bhc3MgZXh0ZW5kcyBQYXNzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB0b25lIG1hcHBpbmcgcGFzcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBUaGUgb3B0aW9ucy5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmFkYXB0aXZlPXRydWVdIC0gV2hldGhlciB0aGUgdG9uZSBtYXBwaW5nIHNob3VsZCB1c2UgYW4gYWRhcHRpdmUgbHVtaW5hbmNlIG1hcC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMucmVzb2x1dGlvbj0yNTZdIC0gVGhlIHJlbmRlciB0ZXh0dXJlIHJlc29sdXRpb24uXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRpc3RpbmN0aW9uPTEuMF0gLSBBIGx1bWluYW5jZSBkaXN0aW5jdGlvbiBmYWN0b3IuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xyXG5cclxuXHRcdHN1cGVyKFwiVG9uZU1hcHBpbmdQYXNzXCIpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlbmRlciB0YXJnZXQgZm9yIHRoZSBjdXJyZW50IGx1bWlub3NpdHkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0b2RvIFVzZSBSRUQgZm9ybWF0IGluIFdlYkdMIDIuMC5cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0THVtaW5vc2l0eSA9IG5ldyBXZWJHTFJlbmRlclRhcmdldCgxLCAxLCB7XHJcblx0XHRcdG1pbkZpbHRlcjogTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyLFxyXG5cdFx0XHRtYWdGaWx0ZXI6IExpbmVhckZpbHRlcixcclxuXHRcdFx0Zm9ybWF0OiBSR0JGb3JtYXQsXHJcblx0XHRcdHN0ZW5jaWxCdWZmZXI6IGZhbHNlLFxyXG5cdFx0XHRkZXB0aEJ1ZmZlcjogZmFsc2VcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0THVtaW5vc2l0eS50ZXh0dXJlLm5hbWUgPSBcIlRvbmVNYXBwaW5nLkx1bWlub3NpdHlcIjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZW5kZXIgdGFyZ2V0IGZvciBhZGFwdGVkIGx1bWlub3NpdHkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0QWRhcHRlZCA9IHRoaXMucmVuZGVyVGFyZ2V0THVtaW5vc2l0eS5jbG9uZSgpO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0QWRhcHRlZC50ZXh0dXJlLm5hbWUgPSBcIlRvbmVNYXBwaW5nLkFkYXB0ZWRMdW1pbm9zaXR5XCI7XHJcblx0XHR0aGlzLnJlbmRlclRhcmdldEFkYXB0ZWQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0QWRhcHRlZC50ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVuZGVyIHRhcmdldCB0aGF0IGhvbGRzIGEgY29weSBvZiB0aGUgYWRhcHRlZCBsaW1vbm9zaXR5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldFByZXZpb3VzID0gdGhpcy5yZW5kZXJUYXJnZXRBZGFwdGVkLmNsb25lKCk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRQcmV2aW91cy50ZXh0dXJlLm5hbWUgPSBcIlRvbmVNYXBwaW5nLlByZXZpb3VzTHVtaW5vc2l0eVwiO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29weSBzaGFkZXIgbWF0ZXJpYWwgdXNlZCBmb3Igc2F2aW5nIHRoZSBsdW1pbmFuY2UgbWFwLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb3B5TWF0ZXJpYWx9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5jb3B5TWF0ZXJpYWwgPSBuZXcgQ29weU1hdGVyaWFsKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGx1bWlub3NpdHkgc2hhZGVyIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtMdW1pbm9zaXR5TWF0ZXJpYWx9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5sdW1pbm9zaXR5TWF0ZXJpYWwgPSBuZXcgTHVtaW5vc2l0eU1hdGVyaWFsKCk7XHJcblxyXG5cdFx0dGhpcy5sdW1pbm9zaXR5TWF0ZXJpYWwudW5pZm9ybXMuZGlzdGluY3Rpb24udmFsdWUgPSAob3B0aW9ucy5kaXN0aW5jdGlvbiAhPT0gdW5kZWZpbmVkKSA/IG9wdGlvbnMuZGlzdGluY3Rpb24gOiAxLjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhZGFwdGl2ZSBsdW1pbmFuY2Ugc2hhZGVyIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbH1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLmFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsID0gbmV3IEFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsKCk7XHJcblxyXG5cdFx0dGhpcy5yZXNvbHV0aW9uID0gb3B0aW9ucy5yZXNvbHV0aW9uO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSB0b25lIG1hcHBpbmcgc2hhZGVyIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtUb25lTWFwcGluZ01hdGVyaWFsfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMudG9uZU1hcHBpbmdNYXRlcmlhbCA9IG5ldyBUb25lTWFwcGluZ01hdGVyaWFsKCk7XHJcblxyXG5cdFx0dGhpcy5hZGFwdGl2ZSA9IG9wdGlvbnMuYWRhcHRpdmU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIHJlc29sdXRpb24gb2YgdGhlIHJlbmRlciB0YXJnZXRzLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge051bWJlcn1cclxuXHQgKi9cclxuXHJcblx0Z2V0IHJlc29sdXRpb24oKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucmVuZGVyVGFyZ2V0THVtaW5vc2l0eS53aWR0aDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgcmVzb2x1dGlvbiBvZiB0aGUgcmVuZGVyIHRhcmdldHMuIE11c3QgYmUgYSBwb3dlciBvZiB0d28gZm9yIG1pcG1hcHMuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdCAqL1xyXG5cclxuXHRzZXQgcmVzb2x1dGlvbih2YWx1ZSA9IDI1Nikge1xyXG5cclxuXHRcdC8vIFJvdW5kIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgbmV4dCBwb3dlciBvZiB0d28uXHJcblx0XHRjb25zdCBleHBvbmVudCA9IE1hdGgubWF4KDAsIE1hdGguY2VpbChNYXRoLmxvZzIodmFsdWUpKSk7XHJcblx0XHR2YWx1ZSA9IE1hdGgucG93KDIsIGV4cG9uZW50KTtcclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldEx1bWlub3NpdHkuc2V0U2l6ZSh2YWx1ZSwgdmFsdWUpO1xyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRQcmV2aW91cy5zZXRTaXplKHZhbHVlLCB2YWx1ZSk7XHJcblx0XHR0aGlzLnJlbmRlclRhcmdldEFkYXB0ZWQuc2V0U2l6ZSh2YWx1ZSwgdmFsdWUpO1xyXG5cclxuXHRcdHRoaXMuYWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWwuZGVmaW5lcy5NSVBfTEVWRUxfMVgxID0gZXhwb25lbnQudG9GaXhlZCgxKTtcclxuXHRcdHRoaXMuYWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZXRoZXIgdGhpcyBwYXNzIHVzZXMgYWRhcHRpdmUgbHVtaW5vc2l0eS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtCb29sZWFufVxyXG5cdCAqIEBkZWZhdWx0IHRydWVcclxuXHQgKi9cclxuXHJcblx0Z2V0IGFkYXB0aXZlKCkge1xyXG5cclxuXHRcdHJldHVybiAodGhpcy50b25lTWFwcGluZ01hdGVyaWFsLmRlZmluZXMuQURBUFRFRF9MVU1JTkFOQ0UgIT09IHVuZGVmaW5lZCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciB0aGlzIHBhc3Mgc2hvdWxkIHVzZSBhZGFwdGl2ZSBsdW1pbm9zaXR5LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0ICovXHJcblxyXG5cdHNldCBhZGFwdGl2ZSh2YWx1ZSA9IHRydWUpIHtcclxuXHJcblx0XHRpZih2YWx1ZSkge1xyXG5cclxuXHRcdFx0dGhpcy50b25lTWFwcGluZ01hdGVyaWFsLmRlZmluZXMuQURBUFRFRF9MVU1JTkFOQ0UgPSBcIjFcIjtcclxuXHRcdFx0dGhpcy50b25lTWFwcGluZ01hdGVyaWFsLnVuaWZvcm1zLmx1bWluYW5jZU1hcC52YWx1ZSA9IHRoaXMucmVuZGVyVGFyZ2V0QWRhcHRlZC50ZXh0dXJlO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRkZWxldGUgdGhpcy50b25lTWFwcGluZ01hdGVyaWFsLmRlZmluZXMuQURBUFRFRF9MVU1JTkFOQ0U7XHJcblx0XHRcdHRoaXMudG9uZU1hcHBpbmdNYXRlcmlhbC51bmlmb3Jtcy5sdW1pbmFuY2VNYXAudmFsdWUgPSBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnRvbmVNYXBwaW5nTWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIGRpdGhlcmluZyBpcyBlbmFibGVkLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0ICovXHJcblxyXG5cdGdldCBkaXRoZXJpbmcoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudG9uZU1hcHBpbmdNYXRlcmlhbC5kaXRoZXJpbmc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSWYgZW5hYmxlZCwgdGhlIHJlc3VsdCB3aWxsIGJlIGRpdGhlcmVkIHRvIHJlbW92ZSBiYW5kaW5nIGFydGlmYWN0cy5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtCb29sZWFufVxyXG5cdCAqL1xyXG5cclxuXHRzZXQgZGl0aGVyaW5nKHZhbHVlKSB7XHJcblxyXG5cdFx0aWYodGhpcy5kaXRoZXJpbmcgIT09IHZhbHVlKSB7XHJcblxyXG5cdFx0XHR0aGlzLnRvbmVNYXBwaW5nTWF0ZXJpYWwuZGl0aGVyaW5nID0gdmFsdWU7XHJcblx0XHRcdHRoaXMudG9uZU1hcHBpbmdNYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbmRlcnMgdGhlIGVmZmVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcblx0ICovXHJcblxyXG5cdHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XHJcblxyXG5cdFx0Y29uc3Qgc2NlbmUgPSB0aGlzLnNjZW5lO1xyXG5cdFx0Y29uc3QgY2FtZXJhID0gdGhpcy5jYW1lcmE7XHJcblxyXG5cdFx0Y29uc3QgYWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWwgPSB0aGlzLmFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsO1xyXG5cdFx0Y29uc3QgbHVtaW5vc2l0eU1hdGVyaWFsID0gdGhpcy5sdW1pbm9zaXR5TWF0ZXJpYWw7XHJcblx0XHRjb25zdCB0b25lTWFwcGluZ01hdGVyaWFsID0gdGhpcy50b25lTWFwcGluZ01hdGVyaWFsO1xyXG5cdFx0Y29uc3QgY29weU1hdGVyaWFsID0gdGhpcy5jb3B5TWF0ZXJpYWw7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0UHJldmlvdXMgPSB0aGlzLnJlbmRlclRhcmdldFByZXZpb3VzO1xyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0THVtaW5vc2l0eSA9IHRoaXMucmVuZGVyVGFyZ2V0THVtaW5vc2l0eTtcclxuXHRcdGNvbnN0IHJlbmRlclRhcmdldEFkYXB0ZWQgPSB0aGlzLnJlbmRlclRhcmdldEFkYXB0ZWQ7XHJcblxyXG5cdFx0aWYodGhpcy5hZGFwdGl2ZSkge1xyXG5cclxuXHRcdFx0Ly8gUmVuZGVyIHRoZSBsdW1pbmFuY2Ugb2YgdGhlIGN1cnJlbnQgc2NlbmUgaW50byBhIHJlbmRlciB0YXJnZXQgd2l0aCBtaXBtYXBwaW5nIGVuYWJsZWQuXHJcblx0XHRcdHRoaXMubWF0ZXJpYWwgPSBsdW1pbm9zaXR5TWF0ZXJpYWw7XHJcblx0XHRcdGx1bWlub3NpdHlNYXRlcmlhbC51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XHJcblx0XHRcdHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhLCByZW5kZXJUYXJnZXRMdW1pbm9zaXR5KTtcclxuXHJcblx0XHRcdC8vIFVzZSB0aGUgbmV3IGx1bWluYW5jZSB2YWx1ZXMsIHRoZSBwcmV2aW91cyBsdW1pbmFuY2UgYW5kIHRoZSBmcmFtZSBkZWx0YSB0byBhZGFwdCB0aGUgbHVtaW5hbmNlIG92ZXIgdGltZS5cclxuXHRcdFx0dGhpcy5tYXRlcmlhbCA9IGFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsO1xyXG5cdFx0XHRhZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbC51bmlmb3Jtcy5kZWx0YS52YWx1ZSA9IGRlbHRhO1xyXG5cdFx0XHRhZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbC51bmlmb3Jtcy50UHJldmlvdXNMdW0udmFsdWUgPSByZW5kZXJUYXJnZXRQcmV2aW91cy50ZXh0dXJlO1xyXG5cdFx0XHRhZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbC51bmlmb3Jtcy50Q3VycmVudEx1bS52YWx1ZSA9IHJlbmRlclRhcmdldEx1bWlub3NpdHkudGV4dHVyZTtcclxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldEFkYXB0ZWQpO1xyXG5cclxuXHRcdFx0Ly8gQ29weSB0aGUgbmV3IGFkYXB0ZWQgbHVtaW5hbmNlIHZhbHVlIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYnkgdGhlIG5leHQgZnJhbWUuXHJcblx0XHRcdHRoaXMubWF0ZXJpYWwgPSBjb3B5TWF0ZXJpYWw7XHJcblx0XHRcdGNvcHlNYXRlcmlhbC51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IHJlbmRlclRhcmdldEFkYXB0ZWQudGV4dHVyZTtcclxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldFByZXZpb3VzKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQXBwbHkgdGhlIHRvbmUgbWFwcGluZyB0byB0aGUgY29sb3Vycy5cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSB0b25lTWFwcGluZ01hdGVyaWFsO1xyXG5cdFx0dG9uZU1hcHBpbmdNYXRlcmlhbC51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XHJcblxyXG5cdFx0cmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IG91dHB1dEJ1ZmZlcik7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gdGFza3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gYWxwaGEgLSBXaGV0aGVyIHRoZSByZW5kZXJlciB1c2VzIHRoZSBhbHBoYSBjaGFubmVsIG9yIG5vdC5cclxuXHQgKi9cclxuXHJcblx0aW5pdGlhbGl6ZShyZW5kZXJlciwgYWxwaGEpIHtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKHsgY29sb3I6IDB4N2ZmZmZmIH0pO1xyXG5cdFx0cmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlclRhcmdldFByZXZpb3VzKTtcclxuXHRcdHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsIi8qKlxyXG4gKiBBIGNvbXBpbGF0aW9uIG9mIHRoZSBwb3N0IHByb2Nlc3NpbmcgcGFzc2VzLlxyXG4gKlxyXG4gKiBAbW9kdWxlIHBvc3Rwcm9jZXNzaW5nL3Bhc3Nlc1xyXG4gKi9cclxuXHJcbmV4cG9ydCB7IEJsb29tUGFzcyB9IGZyb20gXCIuL0Jsb29tUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBCbHVyUGFzcyB9IGZyb20gXCIuL0JsdXJQYXNzLmpzXCI7XHJcbmV4cG9ydCB7IEJva2VoUGFzcyB9IGZyb20gXCIuL0Jva2VoUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBDbGVhck1hc2tQYXNzIH0gZnJvbSBcIi4vQ2xlYXJNYXNrUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBDbGVhclBhc3MgfSBmcm9tIFwiLi9DbGVhclBhc3MuanNcIjtcclxuZXhwb3J0IHsgRG90U2NyZWVuUGFzcyB9IGZyb20gXCIuL0RvdFNjcmVlblBhc3MuanNcIjtcclxuZXhwb3J0IHsgRmlsbVBhc3MgfSBmcm9tIFwiLi9GaWxtUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBHbGl0Y2hNb2RlLCBHbGl0Y2hQYXNzIH0gZnJvbSBcIi4vR2xpdGNoUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBHb2RSYXlzUGFzcyB9IGZyb20gXCIuL0dvZFJheXNQYXNzLmpzXCI7XHJcbmV4cG9ydCB7IE1hc2tQYXNzIH0gZnJvbSBcIi4vTWFza1Bhc3MuanNcIjtcclxuZXhwb3J0IHsgT3V0bGluZVBhc3MgfSBmcm9tIFwiLi9PdXRsaW5lUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBQYXNzIH0gZnJvbSBcIi4vUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBQaXhlbGF0aW9uUGFzcyB9IGZyb20gXCIuL1BpeGVsYXRpb25QYXNzLmpzXCI7XHJcbmV4cG9ydCB7IFJlYWxpc3RpY0Jva2VoUGFzcyB9IGZyb20gXCIuL1JlYWxpc3RpY0Jva2VoUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBSZW5kZXJQYXNzIH0gZnJvbSBcIi4vUmVuZGVyUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBTYXZlUGFzcyB9IGZyb20gXCIuL1NhdmVQYXNzLmpzXCI7XHJcbmV4cG9ydCB7IFNoYWRlclBhc3MgfSBmcm9tIFwiLi9TaGFkZXJQYXNzLmpzXCI7XHJcbmV4cG9ydCB7IFNob2NrV2F2ZVBhc3MgfSBmcm9tIFwiLi9TaG9ja1dhdmVQYXNzLmpzXCI7XHJcbmV4cG9ydCB7IFNNQUFQYXNzIH0gZnJvbSBcIi4vU01BQVBhc3MuanNcIjtcclxuZXhwb3J0IHsgVGV4dHVyZVBhc3MgfSBmcm9tIFwiLi9UZXh0dXJlUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBUb25lTWFwcGluZ1Bhc3MgfSBmcm9tIFwiLi9Ub25lTWFwcGluZ1Bhc3MuanNcIjtcclxuIiwiaW1wb3J0IHtcclxuXHREZXB0aFN0ZW5jaWxGb3JtYXQsXHJcblx0RGVwdGhUZXh0dXJlLFxyXG5cdExpbmVhckZpbHRlcixcclxuXHRSR0JBRm9ybWF0LFxyXG5cdFJHQkZvcm1hdCxcclxuXHRVbnNpZ25lZEludDI0OFR5cGUsXHJcblx0V2ViR0xSZW5kZXJUYXJnZXRcclxufSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmltcG9ydCB7IENsZWFyTWFza1Bhc3MsIE1hc2tQYXNzLCBTaGFkZXJQYXNzIH0gZnJvbSBcIi4uL3Bhc3Nlc1wiO1xyXG5pbXBvcnQgeyBDb3B5TWF0ZXJpYWwgfSBmcm9tIFwiLi4vbWF0ZXJpYWxzXCI7XHJcblxyXG4vKipcclxuICogVGhlIEVmZmVjdENvbXBvc2VyIG1heSBiZSB1c2VkIGluIHBsYWNlIG9mIGEgbm9ybWFsIFdlYkdMUmVuZGVyZXIuXHJcbiAqXHJcbiAqIFRoZSBhdXRvIGNsZWFyIGJlaGF2aW91ciBvZiB0aGUgcHJvdmlkZWQgcmVuZGVyZXIgd2lsbCBiZSBkaXNhYmxlZCB0byBwcmV2ZW50XHJcbiAqIHVubmVjZXNzYXJ5IGNsZWFyIG9wZXJhdGlvbnMuXHJcbiAqXHJcbiAqIEl0IGlzIGNvbW1vbiBwcmFjdGljZSB0byB1c2UgYSB7QGxpbmsgUmVuZGVyUGFzc30gYXMgdGhlIGZpcnN0IHBhc3MgdG9cclxuICogYXV0b21hdGljYWxseSBjbGVhciB0aGUgc2NyZWVuIGFuZCByZW5kZXIgdGhlIHNjZW5lIHRvIGEgdGV4dHVyZSBmb3IgZnVydGhlclxyXG4gKiBwcm9jZXNzaW5nLlxyXG4gKlxyXG4gKiBAaW1wbGVtZW50cyB7UmVzaXphYmxlfVxyXG4gKiBAaW1wbGVtZW50cyB7RGlzcG9zYWJsZX1cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgRWZmZWN0Q29tcG9zZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGVmZmVjdCBjb21wb3Nlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gW3JlbmRlcmVyXSAtIFRoZSByZW5kZXJlciB0aGF0IHNob3VsZCBiZSB1c2VkLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBUaGUgb3B0aW9ucy5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmRlcHRoQnVmZmVyPXRydWVdIC0gV2hldGhlciB0aGUgbWFpbiByZW5kZXIgdGFyZ2V0cyBzaG91bGQgaGF2ZSBhIGRlcHRoIGJ1ZmZlci5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnN0ZW5jaWxCdWZmZXI9ZmFsc2VdIC0gV2hldGhlciB0aGUgbWFpbiByZW5kZXIgdGFyZ2V0cyBzaG91bGQgaGF2ZSBhIHN0ZW5jaWwgYnVmZmVyLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZGVwdGhUZXh0dXJlPWZhbHNlXSAtIFNldCB0byB0cnVlIGlmIG9uZSBvZiB5b3VyIHBhc3NlcyByZWxpZXMgb24gYSBkZXB0aCB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcihyZW5kZXJlciA9IG51bGwsIG9wdGlvbnMgPSB7fSkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlbmRlcmVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIFlvdSBtYXkgcmVwbGFjZSB0aGUgcmVuZGVyZXIgYXQgYW55IHRpbWUgYnkgdXNpbmdcclxuXHRcdCAqIHtAbGluayBFZmZlY3RDb21wb3NlciNyZXBsYWNlUmVuZGVyZXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWJHTFJlbmRlcmVyfVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGlucHV0IGJ1ZmZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBSZWFkaW5nIGZyb20gYW5kIHdyaXRpbmcgdG8gdGhlIHNhbWUgcmVuZGVyIHRhcmdldCBzaG91bGQgYmUgYXZvaWRlZC5cclxuXHRcdCAqIFRoZXJlZm9yZSwgdHdvIHNlcGVyYXRlIHlldCBpZGVudGljYWwgYnVmZmVycyBhcmUgdXNlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5pbnB1dEJ1ZmZlciA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgb3V0cHV0IGJ1ZmZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5vdXRwdXRCdWZmZXIgPSBudWxsO1xyXG5cclxuXHRcdGlmKHRoaXMucmVuZGVyZXIgIT09IG51bGwpIHtcclxuXHJcblx0XHRcdHRoaXMucmVuZGVyZXIuYXV0b0NsZWFyID0gZmFsc2U7XHJcblxyXG5cdFx0XHR0aGlzLmlucHV0QnVmZmVyID0gdGhpcy5jcmVhdGVCdWZmZXIoXHJcblx0XHRcdFx0KG9wdGlvbnMuZGVwdGhCdWZmZXIgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLmRlcHRoQnVmZmVyIDogdHJ1ZSxcclxuXHRcdFx0XHQob3B0aW9ucy5zdGVuY2lsQnVmZmVyICE9PSB1bmRlZmluZWQpID8gb3B0aW9ucy5zdGVuY2lsQnVmZmVyIDogZmFsc2UsXHJcblx0XHRcdFx0KG9wdGlvbnMuZGVwdGhUZXh0dXJlICE9PSB1bmRlZmluZWQpID8gb3B0aW9ucy5kZXB0aFRleHR1cmUgOiBmYWxzZVxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdFx0dGhpcy5vdXRwdXRCdWZmZXIgPSB0aGlzLmlucHV0QnVmZmVyLmNsb25lKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBjb3B5IHBhc3MgdXNlZCBmb3IgY29weWluZyBtYXNrZWQgc2NlbmVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtTaGFkZXJQYXNzfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuY29weVBhc3MgPSBuZXcgU2hhZGVyUGFzcyhuZXcgQ29weU1hdGVyaWFsKCkpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHBhc3Nlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7UGFzc1tdfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucGFzc2VzID0gW107XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGRlcHRoIHRleHR1cmUgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycy5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtEZXB0aFRleHR1cmV9XHJcblx0ICovXHJcblxyXG5cdGdldCBkZXB0aFRleHR1cmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuaW5wdXRCdWZmZXIuZGVwdGhUZXh0dXJlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgc2hhcmUgYSBzaW5nbGUgZGVwdGggdGV4dHVyZS4gRGVwdGggd2lsbCBiZVxyXG5cdCAqIHdyaXR0ZW4gdG8gdGhpcyB0ZXh0dXJlIHdoZW4gc29tZXRoaW5nIGlzIHJlbmRlcmVkIGludG8gb25lIG9mIHRoZSBidWZmZXJzXHJcblx0ICogYW5kIHRoZSBpbnZvbHZlZCBtYXRlcmlhbHMgaGF2ZSBkZXB0aCB3cml0ZSBlbmFibGVkLlxyXG5cdCAqXHJcblx0ICogWW91IG1heSBlbmFibGUgdGhpcyBtZWNoYW5pc20gZHVyaW5nIHRoZSBpbnN0YW50aWF0aW9uIG9mIHRoZSBjb21wb3NlciBvclxyXG5cdCAqIGJ5IGFzc2lnbmluZyBhIERlcHRoVGV4dHVyZSBpbnN0YW5jZSBsYXRlciBvbi4gWW91IG1heSBhbHNvIGRpc2FibGUgaXQgYnlcclxuXHQgKiBhc3NpZ25pbmcgbnVsbC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtEZXB0aFRleHR1cmV9XHJcblx0ICovXHJcblxyXG5cdHNldCBkZXB0aFRleHR1cmUoeCkge1xyXG5cclxuXHRcdHRoaXMuaW5wdXRCdWZmZXIuZGVwdGhUZXh0dXJlID0geDtcclxuXHRcdHRoaXMub3V0cHV0QnVmZmVyLmRlcHRoVGV4dHVyZSA9IHg7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVwbGFjZXMgdGhlIGN1cnJlbnQgcmVuZGVyZXIgd2l0aCB0aGUgZ2l2ZW4gb25lLiBUaGUgRE9NIGVsZW1lbnQgb2YgdGhlXHJcblx0ICogY3VycmVudCByZW5kZXJlciB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQgbm9kZSBhbmQgdGhlXHJcblx0ICogRE9NIGVsZW1lbnQgb2YgdGhlIG5ldyByZW5kZXJlciB3aWxsIHRha2UgaXRzIHBsYWNlLlxyXG5cdCAqXHJcblx0ICogVGhlIGF1dG8gY2xlYXIgbWVjaGFuaXNtIG9mIHRoZSBwcm92aWRlZCByZW5kZXJlciB3aWxsIGJlIGRpc2FibGVkLlxyXG5cdCAqXHJcblx0ICogU3dpdGNoaW5nIGJldHdlZW4gcmVuZGVyZXJzIGFsbG93cyB5b3UgdG8gZHluYW1pY2FsbHkgZW5hYmxlIG9yIGRpc2FibGVcclxuXHQgKiBhbnRpYWxpYXNpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIG5ldyByZW5kZXJlci5cclxuXHQgKiBAcmV0dXJuIHtXZWJHTFJlbmRlcmVyfSBUaGUgb2xkIHJlbmRlcmVyLlxyXG5cdCAqL1xyXG5cclxuXHRyZXBsYWNlUmVuZGVyZXIocmVuZGVyZXIpIHtcclxuXHJcblx0XHRjb25zdCBvbGRSZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XHJcblxyXG5cdFx0bGV0IHBhcmVudCwgb2xkU2l6ZSwgbmV3U2l6ZTtcclxuXHJcblx0XHRpZihvbGRSZW5kZXJlciAhPT0gbnVsbCAmJiBvbGRSZW5kZXJlciAhPT0gcmVuZGVyZXIpIHtcclxuXHJcblx0XHRcdHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5hdXRvQ2xlYXIgPSBmYWxzZTtcclxuXHJcblx0XHRcdHBhcmVudCA9IG9sZFJlbmRlcmVyLmRvbUVsZW1lbnQucGFyZW50Tm9kZTtcclxuXHRcdFx0b2xkU2l6ZSA9IG9sZFJlbmRlcmVyLmdldFNpemUoKTtcclxuXHRcdFx0bmV3U2l6ZSA9IHJlbmRlcmVyLmdldFNpemUoKTtcclxuXHJcblx0XHRcdGlmKHBhcmVudCAhPT0gbnVsbCkge1xyXG5cclxuXHRcdFx0XHRwYXJlbnQucmVtb3ZlQ2hpbGQob2xkUmVuZGVyZXIuZG9tRWxlbWVudCk7XHJcblx0XHRcdFx0cGFyZW50LmFwcGVuZENoaWxkKHJlbmRlcmVyLmRvbUVsZW1lbnQpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYob2xkU2l6ZS53aWR0aCAhPT0gbmV3U2l6ZS53aWR0aCB8fCBvbGRTaXplLmhlaWdodCAhPT0gbmV3U2l6ZS5oZWlnaHQpIHtcclxuXHJcblx0XHRcdFx0dGhpcy5zZXRTaXplKCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBvbGRSZW5kZXJlcjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgbmV3IHJlbmRlciB0YXJnZXQgYnkgcmVwbGljYXRpbmcgdGhlIHJlbmRlcmVyJ3MgY2FudmFzLlxyXG5cdCAqXHJcblx0ICogVGhlIGNyZWF0ZWQgcmVuZGVyIHRhcmdldCB1c2VzIGEgbGluZWFyIGZpbHRlciBmb3IgdGV4ZWwgbWluaWZpY2F0aW9uIGFuZFxyXG5cdCAqIG1hZ25pZmljYXRpb24uIEl0cyByZW5kZXIgdGV4dHVyZSBmb3JtYXQgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZSByZW5kZXJlclxyXG5cdCAqIHVzZXMgdGhlIGFscGhhIGNoYW5uZWwuIE1pcG1hcHMgYXJlIGRpc2FibGVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBkZXB0aEJ1ZmZlciAtIFdoZXRoZXIgdGhlIHJlbmRlciB0YXJnZXQgc2hvdWxkIGhhdmUgYSBkZXB0aCBidWZmZXIuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBzdGVuY2lsQnVmZmVyIC0gV2hldGhlciB0aGUgcmVuZGVyIHRhcmdldCBzaG91bGQgaGF2ZSBhIHN0ZW5jaWwgYnVmZmVyLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gZGVwdGhUZXh0dXJlIC0gV2hldGhlciB0aGUgcmVuZGVyIHRhcmdldCBzaG91bGQgaGF2ZSBhIGRlcHRoIHRleHR1cmUuXHJcblx0ICogQHJldHVybiB7V2ViR0xSZW5kZXJUYXJnZXR9IEEgbmV3IHJlbmRlciB0YXJnZXQgdGhhdCBlcXVhbHMgdGhlIHJlbmRlcmVyJ3MgY2FudmFzLlxyXG5cdCAqL1xyXG5cclxuXHRjcmVhdGVCdWZmZXIoZGVwdGhCdWZmZXIsIHN0ZW5jaWxCdWZmZXIsIGRlcHRoVGV4dHVyZSkge1xyXG5cclxuXHRcdGNvbnN0IGRyYXdpbmdCdWZmZXJTaXplID0gdGhpcy5yZW5kZXJlci5nZXREcmF3aW5nQnVmZmVyU2l6ZSgpO1xyXG5cdFx0Y29uc3QgYWxwaGEgPSB0aGlzLnJlbmRlcmVyLmNvbnRleHQuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKS5hbHBoYTtcclxuXHJcblx0XHRjb25zdCByZW5kZXJUYXJnZXQgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoZHJhd2luZ0J1ZmZlclNpemUud2lkdGgsIGRyYXdpbmdCdWZmZXJTaXplLmhlaWdodCwge1xyXG5cdFx0XHRtaW5GaWx0ZXI6IExpbmVhckZpbHRlcixcclxuXHRcdFx0bWFnRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXHJcblx0XHRcdGZvcm1hdDogYWxwaGEgPyBSR0JBRm9ybWF0IDogUkdCRm9ybWF0LFxyXG5cdFx0XHRkZXB0aEJ1ZmZlcjogZGVwdGhCdWZmZXIsXHJcblx0XHRcdHN0ZW5jaWxCdWZmZXI6IHN0ZW5jaWxCdWZmZXIsXHJcblx0XHRcdGRlcHRoVGV4dHVyZTogZGVwdGhUZXh0dXJlID8gbmV3IERlcHRoVGV4dHVyZSgpIDogbnVsbFxyXG5cdFx0fSk7XHJcblxyXG5cdFx0aWYoZGVwdGhUZXh0dXJlICYmIHN0ZW5jaWxCdWZmZXIpIHtcclxuXHJcblx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuZm9ybWF0ID0gRGVwdGhTdGVuY2lsRm9ybWF0O1xyXG5cdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLnR5cGUgPSBVbnNpZ25lZEludDI0OFR5cGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJlbmRlclRhcmdldC50ZXh0dXJlLm5hbWUgPSBcIkVmZmVjdENvbXBvc2VyLkJ1ZmZlclwiO1xyXG5cdFx0cmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XHJcblxyXG5cdFx0cmV0dXJuIHJlbmRlclRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGEgcGFzcywgb3B0aW9uYWxseSBhdCBhIHNwZWNpZmljIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtQYXNzfSBwYXNzIC0gQSBuZXcgcGFzcy5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2luZGV4XSAtIEFuIGluZGV4IGF0IHdoaWNoIHRoZSBwYXNzIHNob3VsZCBiZSBpbnNlcnRlZC5cclxuXHQgKi9cclxuXHJcblx0YWRkUGFzcyhwYXNzLCBpbmRleCkge1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlcjtcclxuXHRcdGNvbnN0IGRyYXdpbmdCdWZmZXJTaXplID0gcmVuZGVyZXIuZ2V0RHJhd2luZ0J1ZmZlclNpemUoKTtcclxuXHJcblx0XHRwYXNzLnNldFNpemUoZHJhd2luZ0J1ZmZlclNpemUud2lkdGgsIGRyYXdpbmdCdWZmZXJTaXplLmhlaWdodCk7XHJcblx0XHRwYXNzLmluaXRpYWxpemUocmVuZGVyZXIsIHJlbmRlcmVyLmNvbnRleHQuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKS5hbHBoYSk7XHJcblxyXG5cdFx0aWYoaW5kZXggIT09IHVuZGVmaW5lZCkge1xyXG5cclxuXHRcdFx0dGhpcy5wYXNzZXMuc3BsaWNlKGluZGV4LCAwLCBwYXNzKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5wYXNzZXMucHVzaChwYXNzKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyBhIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1Bhc3N9IHBhc3MgLSBUaGUgcGFzcy5cclxuXHQgKi9cclxuXHJcblx0cmVtb3ZlUGFzcyhwYXNzKSB7XHJcblxyXG5cdFx0dGhpcy5wYXNzZXMuc3BsaWNlKHRoaXMucGFzc2VzLmluZGV4T2YocGFzcyksIDEpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbmRlcnMgYWxsIGVuYWJsZWQgcGFzc2VzIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IHdlcmUgYWRkZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0gZGVsdGEgLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuXHQgKi9cclxuXHJcblx0cmVuZGVyKGRlbHRhKSB7XHJcblxyXG5cdFx0Y29uc3QgcGFzc2VzID0gdGhpcy5wYXNzZXM7XHJcblx0XHRjb25zdCBjb3B5UGFzcyA9IHRoaXMuY29weVBhc3M7XHJcblx0XHRjb25zdCByZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XHJcblxyXG5cdFx0bGV0IGlucHV0QnVmZmVyID0gdGhpcy5pbnB1dEJ1ZmZlcjtcclxuXHRcdGxldCBvdXRwdXRCdWZmZXIgPSB0aGlzLm91dHB1dEJ1ZmZlcjtcclxuXHJcblx0XHRsZXQgc3RlbmNpbFRlc3QgPSBmYWxzZTtcclxuXHRcdGxldCBwYXNzLCBjb250ZXh0LCBzdGF0ZSwgYnVmZmVyO1xyXG5cdFx0bGV0IGksIGw7XHJcblxyXG5cdFx0Zm9yKGkgPSAwLCBsID0gcGFzc2VzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xyXG5cclxuXHRcdFx0cGFzcyA9IHBhc3Nlc1tpXTtcclxuXHJcblx0XHRcdGlmKHBhc3MuZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0XHRwYXNzLnJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KTtcclxuXHJcblx0XHRcdFx0aWYocGFzcy5uZWVkc1N3YXApIHtcclxuXHJcblx0XHRcdFx0XHRpZihzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29weVBhc3MucmVuZGVyVG9TY3JlZW4gPSBwYXNzLnJlbmRlclRvU2NyZWVuO1xyXG5cclxuXHRcdFx0XHRcdFx0Y29udGV4dCA9IHJlbmRlcmVyLmNvbnRleHQ7XHJcblx0XHRcdFx0XHRcdHN0YXRlID0gcmVuZGVyZXIuc3RhdGU7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBQcmVzZXJ2ZSB0aGUgdW5hZmZlY3RlZCBwaXhlbHMuXHJcblx0XHRcdFx0XHRcdHN0YXRlLmJ1ZmZlcnMuc3RlbmNpbC5zZXRGdW5jKGNvbnRleHQuTk9URVFVQUwsIDEsIDB4ZmZmZmZmZmYpO1xyXG5cdFx0XHRcdFx0XHRjb3B5UGFzcy5yZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCk7XHJcblx0XHRcdFx0XHRcdHN0YXRlLmJ1ZmZlcnMuc3RlbmNpbC5zZXRGdW5jKGNvbnRleHQuRVFVQUwsIDEsIDB4ZmZmZmZmZmYpO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRidWZmZXIgPSBpbnB1dEJ1ZmZlcjtcclxuXHRcdFx0XHRcdGlucHV0QnVmZmVyID0gb3V0cHV0QnVmZmVyO1xyXG5cdFx0XHRcdFx0b3V0cHV0QnVmZmVyID0gYnVmZmVyO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmKHBhc3MgaW5zdGFuY2VvZiBNYXNrUGFzcykge1xyXG5cclxuXHRcdFx0XHRcdHN0ZW5jaWxUZXN0ID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmKHBhc3MgaW5zdGFuY2VvZiBDbGVhck1hc2tQYXNzKSB7XHJcblxyXG5cdFx0XHRcdFx0c3RlbmNpbFRlc3QgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBidWZmZXJzIGFuZCB0aGUgcmVuZGVyZXIncyBvdXRwdXQgY2FudmFzLlxyXG5cdCAqXHJcblx0ICogRXZlcnkgcGFzcyB3aWxsIGJlIGluZm9ybWVkIG9mIHRoZSBuZXcgc2l6ZS4gSXQncyB1cCB0byBlYWNoIHBhc3MgaG93IHRoYXRcclxuXHQgKiBpbmZvcm1hdGlvbiBpcyB1c2VkLlxyXG5cdCAqXHJcblx0ICogSWYgbm8gd2lkdGggb3IgaGVpZ2h0IGlzIHNwZWNpZmllZCwgdGhlIHJlbmRlciB0YXJnZXRzIGFuZCBwYXNzZXMgd2lsbCBiZVxyXG5cdCAqIHVwZGF0ZWQgd2l0aCB0aGUgY3VycmVudCBzaXplIG9mIHRoZSByZW5kZXJlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbd2lkdGhdIC0gVGhlIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbaGVpZ2h0XSAtIFRoZSBoZWlnaHQuXHJcblx0ICovXHJcblxyXG5cdHNldFNpemUod2lkdGgsIGhlaWdodCkge1xyXG5cclxuXHRcdGNvbnN0IHBhc3NlcyA9IHRoaXMucGFzc2VzO1xyXG5cdFx0Y29uc3QgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyO1xyXG5cclxuXHRcdGxldCBzaXplLCBkcmF3aW5nQnVmZmVyU2l6ZTtcclxuXHRcdGxldCBpLCBsO1xyXG5cclxuXHRcdGlmKHdpZHRoID09PSB1bmRlZmluZWQgfHwgaGVpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuXHJcblx0XHRcdHNpemUgPSByZW5kZXJlci5nZXRTaXplKCk7XHJcblx0XHRcdHdpZHRoID0gc2l6ZS53aWR0aDtcclxuXHRcdFx0aGVpZ2h0ID0gc2l6ZS5oZWlnaHQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFVwZGF0ZSB0aGUgbG9naWNhbCByZW5kZXIgc2l6ZS5cclxuXHRcdHJlbmRlcmVyLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblxyXG5cdFx0Ly8gVGhlIGRyYXdpbmcgYnVmZmVyIHNpemUgdGFrZXMgdGhlIGRldmljZSBwaXhlbCByYXRpbyBpbnRvIGFjY291bnQuXHJcblx0XHRkcmF3aW5nQnVmZmVyU2l6ZSA9IHJlbmRlcmVyLmdldERyYXdpbmdCdWZmZXJTaXplKCk7XHJcblxyXG5cdFx0dGhpcy5pbnB1dEJ1ZmZlci5zZXRTaXplKGRyYXdpbmdCdWZmZXJTaXplLndpZHRoLCBkcmF3aW5nQnVmZmVyU2l6ZS5oZWlnaHQpO1xyXG5cdFx0dGhpcy5vdXRwdXRCdWZmZXIuc2V0U2l6ZShkcmF3aW5nQnVmZmVyU2l6ZS53aWR0aCwgZHJhd2luZ0J1ZmZlclNpemUuaGVpZ2h0KTtcclxuXHJcblx0XHRmb3IoaSA9IDAsIGwgPSBwYXNzZXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XHJcblxyXG5cdFx0XHRwYXNzZXNbaV0uc2V0U2l6ZShkcmF3aW5nQnVmZmVyU2l6ZS53aWR0aCwgZHJhd2luZ0J1ZmZlclNpemUuaGVpZ2h0KTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVzZXRzIHRoaXMgY29tcG9zZXIgYnkgZGVsZXRpbmcgYWxsIHBhc3NlcyBhbmQgY3JlYXRpbmcgbmV3IGJ1ZmZlcnMuXHJcblx0ICovXHJcblxyXG5cdHJlc2V0KCkge1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlclRhcmdldCA9IHRoaXMuY3JlYXRlQnVmZmVyKFxyXG5cdFx0XHR0aGlzLmlucHV0QnVmZmVyLmRlcHRoQnVmZmVyLFxyXG5cdFx0XHR0aGlzLmlucHV0QnVmZmVyLnN0ZW5jaWxCdWZmZXIsXHJcblx0XHRcdCh0aGlzLmlucHV0QnVmZmVyLmRlcHRoVGV4dHVyZSAhPT0gbnVsbClcclxuXHRcdCk7XHJcblxyXG5cdFx0dGhpcy5kaXNwb3NlKCk7XHJcblxyXG5cdFx0Ly8gUmVhbmltYXRlLlxyXG5cdFx0dGhpcy5pbnB1dEJ1ZmZlciA9IHJlbmRlclRhcmdldDtcclxuXHRcdHRoaXMub3V0cHV0QnVmZmVyID0gcmVuZGVyVGFyZ2V0LmNsb25lKCk7XHJcblx0XHR0aGlzLmNvcHlQYXNzID0gbmV3IFNoYWRlclBhc3MobmV3IENvcHlNYXRlcmlhbCgpKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZXN0cm95cyB0aGlzIGNvbXBvc2VyIGFuZCBhbGwgcGFzc2VzLlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgZGVhbGxvY2F0ZXMgYWxsIGRpc3Bvc2FibGUgb2JqZWN0cyBjcmVhdGVkIGJ5IHRoZSBwYXNzZXMuIEl0XHJcblx0ICogYWxzbyBkZWxldGVzIHRoZSBtYWluIGZyYW1lIGJ1ZmZlcnMgb2YgdGhpcyBjb21wb3Nlci5cclxuXHQgKi9cclxuXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHRjb25zdCBwYXNzZXMgPSB0aGlzLnBhc3NlcztcclxuXHJcblx0XHRsZXQgaSwgbDtcclxuXHJcblx0XHRmb3IoaSA9IDAsIGwgPSBwYXNzZXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XHJcblxyXG5cdFx0XHRwYXNzZXNbaV0uZGlzcG9zZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnBhc3NlcyA9IFtdO1xyXG5cclxuXHRcdGlmKHRoaXMuaW5wdXRCdWZmZXIgIT09IG51bGwpIHtcclxuXHJcblx0XHRcdHRoaXMuaW5wdXRCdWZmZXIuZGlzcG9zZSgpO1xyXG5cdFx0XHR0aGlzLmlucHV0QnVmZmVyID0gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYodGhpcy5vdXRwdXRCdWZmZXIgIT09IG51bGwpIHtcclxuXHJcblx0XHRcdHRoaXMub3V0cHV0QnVmZmVyLmRpc3Bvc2UoKTtcclxuXHRcdFx0dGhpcy5vdXRwdXRCdWZmZXIgPSBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmNvcHlQYXNzLmRpc3Bvc2UoKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG4iLCJpbXBvcnQge0VmZmVjdENvbXBvc2VyfSBmcm9tICdwb3N0cHJvY2Vzc2luZy9zcmMvY29yZS9FZmZlY3RDb21wb3Nlcic7XG5pbXBvcnQge1JlbmRlclBhc3N9IGZyb20gJ3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvUmVuZGVyUGFzcyc7XG5pbXBvcnQge1NoYWRlclBhc3N9IGZyb20gJ3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvU2hhZGVyUGFzcyc7XG5cbmltcG9ydCB7TG9vcH0gZnJvbSAnLi4vLi4vY29yZS9Mb29wJztcblxuY29uc3QgcG9seWZpbGwgPSAob2JqZWN0LCBtZXRob2QsIHNob3dXYXJuID0gdHJ1ZSkgPT4ge1xuICBpZiAob2JqZWN0W21ldGhvZF0pIHJldHVybjtcbiAgaWYgKHNob3dXYXJuKSBjb25zb2xlLndhcm4oYEBQb3N0UHJvY2Vzc29yTW9kdWxlOiBwYXNzLiR7bWV0aG9kfSgpIHdhcyBub3QgZm91bmQuYCwgb2JqZWN0KTtcbiAgb2JqZWN0W21ldGhvZF0gPSAoKSA9PiB7fTtcbn07XG5cbi8qKlxuICogQGNsYXNzIFBvc3RQcm9jZXNzb3JNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj4gQ3JlYXRpbmcgYSByZW5kZXJpbmcgbW9kdWxlIGFuZCBwYXNzaW5nIGl0IHRvIEFwcCdzIG1vZHVsZXM8L2NhcHRpb24+XG4gKiBuZXcgQXBwKFtcbiAqICAgbmV3IEVsZW1lbnRNb2R1bGUoKSxcbiAqICAgbmV3IFNjZW5lTW9kdWxlKCksXG4gKiAgIG5ldyBEZWZpbmVNb2R1bGUoJ2NhbWVyYScsIG5ldyBXSFMuUGVyc3BlY3RpdmVDYW1lcmEoe1xuICogICAgIHBvc2l0aW9uOiBuZXcgVEhSRUUuVmVjdG9yMygwLCA2LCAxOCksXG4gKiAgICAgZmFyOiAxMDAwMFxuICogICB9KSksXG4gKiAgIG5ldyBSZW5kZXJpbmdNb2R1bGUoKSxcbiAqICAgbmV3IFBvc3RQcm9jZXNzb3JNb2R1bGUoKVxuICogXSk7XG4gKlxuICogY29uc3QgcHJvY2Vzc29yID0gYXBwLnVzZSgncG9zdHByb2Nlc3NvcicpO1xuICpcbiAqIHByb2Nlc3NvclxuICogICAucmVuZGVyKClcbiAqICAgLnBhc3MobmV3IEdsaXRjaFBhc3MoKSlcbiAqICAgLnJlbmRlclRvU2NyZWVuKClcbiAqL1xuZXhwb3J0IGNsYXNzIFBvc3RQcm9jZXNzb3JNb2R1bGUge1xuICBjdXJyZW50UGFzcyA9IG51bGw7XG5cbiAgZGVmZXIgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlO1xuICB9KTtcblxuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgZGVidWc6IHRydWVcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSBQb3N0UHJvY2Vzc29yTW9kdWxlLmRlZmF1bHRzKSB7XG4gICAgdGhpcy5kZWJ1ZyA9IHBhcmFtcy5kZWJ1ZztcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgfVxuXG4gIG1hbmFnZXIobWFuYWdlcikge1xuICAgIG1hbmFnZXIuZGVmaW5lKCdwb3N0cHJvY2Vzc29yJyk7XG5cbiAgICB0aGlzLmVmZmVjdHMgPSBtYW5hZ2VyLnVzZSgncmVuZGVyaW5nJykuZWZmZWN0cztcbiAgICB0aGlzLnJlbmRlcmVyID0gbWFuYWdlci5nZXQoJ3JlbmRlcmVyJyk7XG4gICAgdGhpcy5zY2VuZSA9IG1hbmFnZXIuZ2V0KCdzY2VuZScpO1xuICAgIHRoaXMuY2FtZXJhID0gbWFuYWdlci5nZXQoJ2NhbWVyYScpO1xuXG4gICAgdGhpcy5jb21wb3NlciA9IG5ldyBFZmZlY3RDb21wb3Nlcih0aGlzLnJlbmRlcmVyLCB0aGlzLnBhcmFtcyk7XG5cbiAgICBtYW5hZ2VyLnVzZSgncmVuZGVyaW5nJykuc3RvcCgpO1xuXG4gICAgY29uc3QgY29tcG9zZXIgPSB0aGlzLmNvbXBvc2VyO1xuICAgIHRoaXMucmVuZGVyTG9vcCA9IG5ldyBMb29wKGNsb2NrID0+IGNvbXBvc2VyLnJlbmRlcihjbG9jay5nZXREZWx0YSgpKSkuc3RhcnQobWFuYWdlci5oYW5kbGVyKTtcblxuICAgIG1hbmFnZXIudXBkYXRlKHtcbiAgICAgIHJlbmRlcmVyOiByZW5kZXJlciA9PiB7XG4gICAgICAgIHRoaXMuY29tcG9zZXIucmVwbGFjZVJlbmRlcmVyKHJlbmRlcmVyKTtcbiAgICAgIH0sXG5cbiAgICAgIHNjZW5lOiBzY2VuZSA9PiB7XG4gICAgICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcbiAgICAgIH0sXG5cbiAgICAgIGNhbWVyYTogY2FtZXJhID0+IHtcbiAgICAgICAgdGhpcy5jYW1lcmEgPSBjYW1lcmE7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlc29sdmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHJlbmRlclxuICAgKiBAZGVzY3JpcHRpb24gQWRkcyBSZW5kZXJQYXNzXG4gICAqIEByZXR1cm4ge3RoaXN9XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUG9zdFByb2Nlc3Nvck1vZHVsZVxuICAgKi9cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuZGVmZXIudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCBwYXNzID0gbmV3IFJlbmRlclBhc3ModGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEubmF0aXZlKTtcblxuICAgICAgLy8gVE9ETzogU3VwcG9ydCBmb3IgZWZmZWN0cy5cblxuICAgICAgdGhpcy5jb21wb3Nlci5hZGRQYXNzKHBhc3MpO1xuICAgICAgdGhpcy5jdXJyZW50UGFzcyA9IHBhc3M7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHBhc3NcbiAgICogQGRlc2NyaXB0aW9uIEFkZHMgeW91ciBjdXN0b20gcGFzc1xuICAgKiBAcGFyYW0ge1Bhc3N9IHBhc3MgQSBjdXN0b20gcGFzc1xuICAgKiBAcmV0dXJuIHt0aGlzfVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlBvc3RQcm9jZXNzb3JNb2R1bGVcbiAgICovXG4gIHBhc3MocGFzcykge1xuICAgIHRoaXMuZGVmZXIudGhlbigoKSA9PiB7XG4gICAgICBwb2x5ZmlsbChwYXNzLCAnc2V0U2l6ZScsIHRoaXMuZGVidWcpO1xuICAgICAgcG9seWZpbGwocGFzcywgJ2luaXRpYWxpc2UnLCB0aGlzLmRlYnVnKTtcblxuICAgICAgdGhpcy5jb21wb3Nlci5hZGRQYXNzKHBhc3MpO1xuICAgICAgdGhpcy5jdXJyZW50UGFzcyA9IHBhc3M7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHNoYWRlclxuICAgKiBAZGVzY3JpcHRpb24gQWRkcyBhIHBhc3MgbWFkZSBmcm9tIHNoYWRlciBtYXRlcmlhbFxuICAgKiBAcGFyYW0ge01hdGVyaWFsfSBtYXRlcmlhbCBBIFNoYWRlck1hdGVyaWFsXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0dXJlSUQgTmFtZSBvZiB0aGUgcmVhZEJ1ZmZlciB1bmlmb3JtXG4gICAqIEByZXR1cm4ge3RoaXN9XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUG9zdFByb2Nlc3Nvck1vZHVsZVxuICAgKi9cbiAgc2hhZGVyKG1hdGVyaWFsLCB0ZXh0dXJlSUQgPSAncmVhZEJ1ZmZlcicpIHtcbiAgICB0aGlzLmRlZmVyLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKCFtYXRlcmlhbC51bmlmb3Jtc1t0ZXh0dXJlSURdKVxuICAgICAgICBtYXRlcmlhbC51bmlmb3Jtc1t0ZXh0dXJlSURdID0ge3ZhbHVlOiBudWxsfTtcblxuICAgICAgY29uc3QgcGFzcyA9IG5ldyBTaGFkZXJQYXNzKG1hdGVyaWFsLCB0ZXh0dXJlSUQpO1xuXG4gICAgICB0aGlzLmNvbXBvc2VyLmFkZFBhc3MocGFzcyk7XG4gICAgICB0aGlzLmN1cnJlbnRQYXNzID0gcGFzcztcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgZ2V0XG4gICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGEgcGFzcyBieSB0aGUgZ2l2ZW4gbmFtZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcGFzc1xuICAgKiBAcmV0dXJuIHt0aGlzfVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlBvc3RQcm9jZXNzb3JNb2R1bGVcbiAgICovXG4gIGdldChuYW1lKSB7XG4gICAgcmV0dXJuIG5hbWVcbiAgICAgID8gdGhpcy5jb21wb3Nlci5wYXNzZXMuZmlsdGVyKHBhc3MgPT4gcGFzcy5uYW1lID09PSBuYW1lKVswXVxuICAgICAgOiB0aGlzLmN1cnJlbnRQYXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgcmVuZGVyVG9TY3JlZW5cbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHJlbmRlclRvU2NyZWVuIHByb3BlcnR5IG9mIGN1cnJlbnRQYXNzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbbmFtZT10cnVlXSBUaGUgbmFtZSBvZiB0aGUgcGFzc1xuICAgKiBAcmV0dXJuIHt0aGlzfVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlBvc3RQcm9jZXNzb3JNb2R1bGVcbiAgICovXG4gIHJlbmRlclRvU2NyZWVuKGJvb2wgPSB0cnVlKSB7XG4gICAgdGhpcy5kZWZlci50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuY3VycmVudFBhc3MucmVuZGVyVG9TY3JlZW4gPSBib29sO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbiIsIi8qKlxuICogQGNsYXNzIEV2ZW50c1BhdGNoTW9kdWxlXG4gKiBAZGVzY3JpcHRpb24gVGhpcyBvbmUgaXMgdXNlZCBpbiB0aGUgY29yZSB0byBoYW5kbGUgZXZlbnRzIHVzZWQgYnkgbW9kdWxlcy4gSWYgeW91IHdhbnQgdG8gbWFrZSBjdXN0b20gZXZlbnRzIC0gcGxlYXNlIG1ha2UgYSBzaW1pbGFyIG9uZS5cbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcFxuICovXG5leHBvcnQgY2xhc3MgRXZlbnRzUGF0Y2hNb2R1bGUge1xuICBtYW5hZ2VyKG1hbmFnZXIpIHtcbiAgICBtYW5hZ2VyLmRlZmluZSgnZXZlbnRzJyk7XG4gICAgdGhpcy5lbGVtZW50ID0gbWFuYWdlci5nZXQoJ3JlbmRlcmVyJykuZG9tRWxlbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZnVuY3Rpb24gcGF0Y2hFdmVudHNcbiAgICogQGRlc2NyaXB0aW9uIFRoaXMgbWV0aG9kcyBwYXRjaGVzIHRoZSBsaXN0IG9mIGV2ZW50cyBvbiBzcGVjaWZpYyBvYmplY3QuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBvcmlnaW5PYmplY3QgLSBUaGUgb2JqZWN0IHRoYXQgZ2l2ZXMgZXZlbnRzLlxuICAgKiBAcGFyYW0ge051bWJlcn0gW2Rlc3RPYmplY3Q9dGhpc10gLSBUaGUgb2JqZWN0IHRoYXQgdGFrZXMgZXZlbnRzLlxuICAgKiBAcGFyYW0ge0FycmF5W1N0cmluZ3NdfSBbZXZlbnRzPVtdXSAtIFRoZSBsaXN0IG9mIGV2ZW50cyBieSBuYW1lcy5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5FdmVudHNQYXRjaE1vZHVsZVxuICAgKi9cbiAgcGF0Y2hFdmVudHMob3JpZ2luT2JqZWN0LCBkZXN0T2JqZWN0ID0gdGhpcywgZXZlbnRzID0gW10pIHtcbiAgICBldmVudHMuZm9yRWFjaChldmVudCA9PlxuICAgICAgb3JpZ2luT2JqZWN0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGUgPT4gZGVzdE9iamVjdC5lbWl0KGV2ZW50LCBlKSlcbiAgICApO1xuICB9XG5cbiAgaW50ZWdyYXRlKHNlbGYpIHtcbiAgICBjb25zdCB7ZWxlbWVudCwgcGF0Y2hFdmVudHN9ID0gc2VsZjtcblxuICAgIHBhdGNoRXZlbnRzKGVsZW1lbnQsIHRoaXMsIFtcbiAgICAgICdtb3VzZW1vdmUnLFxuICAgICAgJ21vdXNldXAnLFxuICAgICAgJ2NvbnRleHRtZW51JyxcbiAgICAgICdtb3VzZWRvd24nLFxuICAgICAgJ2NsaWNrJyxcbiAgICAgICd3aGVlbCcsXG4gICAgICAndG91Y2hzdGFydCcsXG4gICAgICAndG91Y2hlbmQnLFxuICAgICAgJ3RvdWNobW92ZScsXG4gICAgICAna2V5ZG93bicsXG4gICAgICAna2V5dXAnLFxuICAgICAgJ2tleXByZXNzJ1xuICAgIF0pO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBWZWN0b3IyLFxuICBSYXljYXN0ZXIsXG4gIFBsYW5lLFxuICBWZWN0b3IzXG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IEV2ZW50cyBmcm9tICdtaW5pdmVudHMnO1xuaW1wb3J0IHtFdmVudHNQYXRjaE1vZHVsZX0gZnJvbSAnLi9FdmVudHNQYXRjaE1vZHVsZSc7XG5cbi8qKlxuICogQGNsYXNzIFZpcnR1YWxNb3VzZU1vZHVsZVxuICogQGNhdGVnb3J5IG1vZHVsZXMvYXBwXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtnbG9iYWxNb3ZlbWVudD1mYWxzZV1cbiAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHBcbiAqIEBleHRlbmRzIEV2ZW50c1xuICovXG5leHBvcnQgY2xhc3MgVmlydHVhbE1vdXNlTW9kdWxlIGV4dGVuZHMgRXZlbnRzIHtcbiAgbW91c2UgPSBuZXcgVmVjdG9yMigpO1xuICByYXljYXN0ZXIgPSBuZXcgUmF5Y2FzdGVyKCk7XG4gIHdvcmxkID0gbnVsbDtcbiAgY2FudmFzID0gbnVsbDtcbiAgcHJvamVjdGlvblBsYW5lID0gbmV3IFBsYW5lKG5ldyBWZWN0b3IzKDAsIDAsIDEpLCAwKTtcblxuICBjb25zdHJ1Y3RvcihnbG9iYWxNb3ZlbWVudCA9IGZhbHNlKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmdsb2JhbE1vdmVtZW50ID0gZ2xvYmFsTW92ZW1lbnQ7XG4gIH1cblxuICB1cGRhdGUoZSwgY3VzdG9tWCwgY3VzdG9tWSkge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLmNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGNvbnN0IHggPSBjdXN0b21YIHx8IGUuY2xpZW50WDtcbiAgICBjb25zdCB5ID0gY3VzdG9tWSB8fCBlLmNsaWVudFk7XG5cbiAgICB0aGlzLm1vdXNlLnggPSAoKHggLSByZWN0LmxlZnQpIC8gKHJlY3QucmlnaHQgLSByZWN0LmxlZnQpKSAqIDIgLSAxO1xuICAgIHRoaXMubW91c2UueSA9IC0oKHkgLSByZWN0LnRvcCkgLyAocmVjdC5ib3R0b20gLSByZWN0LnRvcCkpICogMiArIDE7XG5cbiAgICB0aGlzLnByb2plY3Rpb25QbGFuZS5ub3JtYWwuY29weSh0aGlzLmNhbWVyYS5nZXRXb3JsZERpcmVjdGlvbigpKTtcblxuICAgIHRoaXMucmF5Y2FzdGVyLnNldEZyb21DYW1lcmEodGhpcy5tb3VzZSwgdGhpcy5jYW1lcmEpO1xuICAgIHRoaXMuZW1pdCgnbW92ZScpO1xuICB9XG5cbiAgbWFuYWdlcihtYW5hZ2VyKSB7XG4gICAgbWFuYWdlci5kZWZpbmUoJ21vdXNlJyk7XG4gICAgbWFuYWdlci5yZXF1aXJlKCdldmVudHMnLCAoKSA9PiBuZXcgRXZlbnRzUGF0Y2hNb2R1bGUoKSk7XG5cbiAgICB0aGlzLmNhbnZhcyA9IG1hbmFnZXIuZ2V0KCdyZW5kZXJlcicpLmRvbUVsZW1lbnQ7XG4gICAgdGhpcy5jYW1lcmEgPSBtYW5hZ2VyLmdldCgnY2FtZXJhJykubmF0aXZlO1xuICB9XG5cbiAgaW50ZWdyYXRlKHNlbGYpIHtcbiAgICBbXG4gICAgICAnY2xpY2snLFxuICAgICAgJ21vdXNlZG93bicsXG4gICAgICAnbW91c2V1cCcsXG4gICAgICAnbW91c2Vtb3ZlJ1xuICAgIF0uZm9yRWFjaChldiA9PiB0aGlzLm9uKGV2LCBlID0+IHNlbGYuZW1pdChldiwgZSkpKTtcblxuICAgIHNlbGYuZ2xvYmFsWCA9IDA7XG4gICAgc2VsZi5nbG9iYWxZID0gMDtcblxuICAgIHRoaXMub24oJ21vdXNlbW92ZScsIGUgPT4ge1xuICAgICAgaWYgKGRvY3VtZW50LnBvaW50ZXJMb2NrRWxlbWVudCAhPT0gbnVsbCkge1xuICAgICAgICBzZWxmLmdsb2JhbFggKz0gZS5tb3ZlbWVudFg7XG4gICAgICAgIHNlbGYuZ2xvYmFsWSArPSBlLm1vdmVtZW50WTtcblxuICAgICAgICBzZWxmLnVwZGF0ZShlLCBzZWxmLmdsb2JhbFgsIHNlbGYuZ2xvYmFsWSk7XG4gICAgICB9IGVsc2Ugc2VsZi51cGRhdGUoZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCB0cmFja1xuICAgKiBAZGVzY3JpcHRpb24gU3RhcnRzIHRyYWNraW5nIGV2ZW50cyBvbiBhIGNvbXBvbmVudFxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gY29tcG9uZW50IEEgY29tcG9uZW50LCB0aGF0IHNob3VsZCBiZSB0cmFja2VkIGJ5IHRoZSBtb3VzZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IG5lc3RlZCBXaGV0aGVyIGNvbXBvbmVudCdzIGNoaWxkcmVuIHNob3VsZCBiZSB0cmFja2VkIG9yIG5vdFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlZpcnR1YWxNb3VzZU1vZHVsZVxuICAgKi9cbiAgdHJhY2soY29tcG9uZW50LCBuZXN0ZWQgPSB0cnVlKSB7XG4gICAgbGV0IGlzSG92ZXJlZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5vbignbW92ZScsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmhvdmVycyhjb21wb25lbnQsIG5lc3RlZCkpIHtcbiAgICAgICAgaWYgKGlzSG92ZXJlZCkgY29tcG9uZW50LmVtaXQoJ21vdXNlbW92ZScpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjb21wb25lbnQuZW1pdCgnbW91c2VvdmVyJyk7XG4gICAgICAgICAgaXNIb3ZlcmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc0hvdmVyZWQpIHtcbiAgICAgICAgY29tcG9uZW50LmVtaXQoJ21vdXNlb3V0Jyk7XG4gICAgICAgIGlzSG92ZXJlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICBpZiAoaXNIb3ZlcmVkKSBjb21wb25lbnQuZW1pdCgnY2xpY2snKTtcbiAgICAgIGVsc2UgY29tcG9uZW50LmVtaXQoJ29mZkNsaWNrJyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKCdtb3VzZWRvd24nLCAoKSA9PiB7XG4gICAgICBpZiAoaXNIb3ZlcmVkKSBjb21wb25lbnQuZW1pdCgnbW91c2Vkb3duJyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKCdtb3VzZXVwJywgKCkgPT4ge1xuICAgICAgaWYgKGlzSG92ZXJlZCkgY29tcG9uZW50LmVtaXQoJ21vdXNldXAnKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGludGVyc2VjdGlvblxuICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhbiBpbnRlcnNlY3Rpb24gZGF0YVxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gY29tcG9uZW50IEEgY29tcG9uZW50IHRoYXQgaW50ZXJzZWN0cyB3aXRoIG1vdXNlIHJheSAob3IgZG9lc24ndClcbiAgICogQHBhcmFtIHtCb29sZWFufSBuZXN0ZWQgV2hldGhlciBjb21wb25lbnQncyBjaGlsZHJlbiBzaG91bGQgYmUgdHJhY2tlZCBvciBub3RcbiAgICogQHJldHVybiB7QXJyYXl9IGludGVyc2VjdGlvbiBkYXRhLlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlZpcnR1YWxNb3VzZU1vZHVsZVxuICAgKi9cbiAgaW50ZXJzZWN0aW9uKHtuYXRpdmV9LCBuZXN0ZWQgPSB0cnVlKSB7XG4gICAgaWYgKG5hdGl2ZS5jaGlsZHJlbi5sZW5ndGggPiAwICYmIG5lc3RlZCkge1xuICAgICAgY29uc3Qgb2JqZWN0cyA9IFtdO1xuICAgICAgbmF0aXZlLnRyYXZlcnNlKGNoaWxkID0+IG9iamVjdHMucHVzaChjaGlsZCkpO1xuXG4gICAgICByZXR1cm4gdGhpcy5yYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0cyhvYmplY3RzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0KG5hdGl2ZSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBwcm9qZWN0XG4gICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGEgdmVjdG9yIGJhc2VkIG9uIG1vdXNlIHJheSBpbnRlcnNlY3Rpb24gd2l0aCBwbGFuZVxuICAgKiBAcGFyYW0ge1RIUkVFLlBsYW5lfSBbcGxhbmU9dGhpcy5wcm9qZWN0aW9uUGxhbmVdIE1hdGggcGxhbmUgdGhhdCBpcyB1c2VkXG4gICAqIEBwYXJhbSB7VmVjdG9yM30gW3RhcmdldF0gT3B0aW9uYWwgdGFyZ2V0XG4gICAqIEByZXR1cm4ge1ZlY3RvcjN9IEFuIGludGVyc2VjdGlvbiBwb2ludC5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5WaXJ0dWFsTW91c2VNb2R1bGVcbiAgICovXG4gIHByb2plY3QocGxhbmUgPSB0aGlzLnByb2plY3Rpb25QbGFuZSwgdGFyZ2V0KSB7XG4gICAgcmV0dXJuIHRoaXMucmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RQbGFuZShwbGFuZSwgdGFyZ2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGhvdmVyc1xuICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhIGJvb2xlYW4gYmFzZWQgb24gaW50ZXJzZWN0aW9uIGRhdGEgKFdoZXRoZXIgbW91c2UgaG92ZXJzIHRoZSBjb21wb25lbnQpXG4gICAqIEBwYXJhbSB7Q29tcG9uZW50fSBjb21wb25lbnQgQSBjb21wb25lbnQgdGhhdCBpbnRlcnNlY3RzIHdpdGggbW91c2UgcmF5IChvciBkb2Vzbid0KVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IG5lc3RlZCBXaGV0aGVyIGNvbXBvbmVudCdzIGNoaWxkcmVuIHNob3VsZCBiZSB0cmFja2VkIG9yIG5vdFxuICAgKiBAcmV0dXJuIHtCb29sZWFufSBXaGV0aGVyIHRoZSBjb21wb25lbnQgaXMgaG92ZXJlZC5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5WaXJ0dWFsTW91c2VNb2R1bGVcbiAgICovXG4gIGhvdmVycyhjb21wb25lbnQsIG5lc3RlZCA9IHRydWUpIHtcbiAgICByZXR1cm4gdGhpcy5pbnRlcnNlY3Rpb24oY29tcG9uZW50LCBuZXN0ZWQpLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKipcbiAgICogTW91c2UgcmF5XG4gICAqIEBtZW1iZXIge1RIUkVFLlJheX0gbW9kdWxlOm1vZHVsZXMvYXBwLlZpcnR1YWxNb3VzZU1vZHVsZSNyYXlcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgZ2V0IHJheSgpIHtcbiAgICByZXR1cm4gdGhpcy5yYXljYXN0ZXIucmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdXNlIHggWy0xOyAxXVxuICAgKiBAbWVtYmVyIHtOdW1iZXJ9IG1vZHVsZTptb2R1bGVzL2FwcC5WaXJ0dWFsTW91c2VNb2R1bGUjeFxuICAgKiBAcHVibGljXG4gICAqL1xuICBnZXQgeCgpIHtcbiAgICByZXR1cm4gdGhpcy5tb3VzZS54O1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdXNlIHkgWy0xOyAxXVxuICAgKiBAbWVtYmVyIHtOdW1iZXJ9IG1vZHVsZTptb2R1bGVzL2FwcC5WaXJ0dWFsTW91c2VNb2R1bGUjeVxuICAgKiBAcHVibGljXG4gICAqL1xuICBnZXQgeSgpIHtcbiAgICByZXR1cm4gdGhpcy5tb3VzZS55O1xuICB9XG59XG4iLCJpbXBvcnQge0xvb3B9IGZyb20gJy4uLy4uL2NvcmUvTG9vcCc7XG5pbXBvcnQge0V2ZW50c1BhdGNoTW9kdWxlfSBmcm9tICcuL0V2ZW50c1BhdGNoTW9kdWxlJztcblxuLyoqXG4gKiBAY2xhc3MgQ29udHJvbHNNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj4gQ3JlYXRpbmcgYSByZW5kZXJpbmcgbW9kdWxlIGFuZCBwYXNzaW5nIGl0IHRvIEFwcCdzIG1vZHVsZXM8L2NhcHRpb24+XG4gKiBuZXcgQXBwKFtcbiAqICAgbmV3IEVsZW1lbnRNb2R1bGUoKSxcbiAqICAgbmV3IFNjZW5lTW9kdWxlKCksXG4gKiAgIG5ldyBEZWZpbmVNb2R1bGUoJ2NhbWVyYScsIG5ldyBXSFMuUGVyc3BlY3RpdmVDYW1lcmEoe1xuICogICAgIHBvc2l0aW9uOiBuZXcgVEhSRUUuVmVjdG9yMygwLCA2LCAxOCksXG4gKiAgICAgZmFyOiAxMDAwMFxuICogICB9KSksXG4gKiAgIG5ldyBSZW5kZXJpbmdNb2R1bGUoKSxcbiAqICAgbmV3IENvbnRyb2xzTW9kdWxlLmZyb20obmV3IFRIUkVFLlRyYWNrYmFsbENvbnRyb2xzKCkpXG4gKiBdKTtcbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRyb2xzTW9kdWxlIHtcbiAgc3RhdGljIGZyb20oY29udHJvbHMpIHtcbiAgICByZXR1cm4gbmV3IENvbnRyb2xzTW9kdWxlKHtjb250cm9sc30pO1xuICB9XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICB0aGlzLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgY29udHJvbHM6IGZhbHNlLFxuICAgICAgZml4OiBjb250cm9scyA9PiBjb250cm9scyxcblxuICAgICAgdXBkYXRlKGMpIHtcbiAgICAgICAgdGhpcy5jb250cm9scy51cGRhdGUoYy5nZXREZWx0YSgpKTtcbiAgICAgIH1cbiAgICB9LCBwYXJhbXMpO1xuXG4gICAgdGhpcy5jb250cm9scyA9IHRoaXMucGFyYW1zLmNvbnRyb2xzO1xuICAgIHRoaXMudXBkYXRlID0gdGhpcy5wYXJhbXMudXBkYXRlO1xuICB9XG5cbiAgbWFuYWdlcihtYW5hZ2VyKSB7XG4gICAgbWFuYWdlci5kZWZpbmUoJ2NvbnRyb2xzJyk7XG4gICAgbWFuYWdlci5yZXF1aXJlKCdldmVudHMnLCAoKSA9PiBuZXcgRXZlbnRzUGF0Y2hNb2R1bGUoKSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBzZXRDb250cm9sc1xuICAgKiBAZGVzY3JpcHRpb24gU2V0IHdvcmtpbmcgY29udHJvbHNcbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbnRyb2xzIFdvcmtpbmcgdGhyZWUuanMgY29udHJvbHMgb2JqZWN0LlxuICAgKiBAcmV0dXJuIHt0aGlzfVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLkNvbnRyb2xzTW9kdWxlXG4gICAqL1xuICBzZXRDb250cm9scyhjb250cm9scykge1xuICAgIHRoaXMuY29udHJvbHMgPSBjb250cm9scztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHNldFVwZGF0ZVxuICAgKiBAZGVzY3JpcHRpb24gU2V0IGNvbnRyb2xzIHVwZGF0ZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGUgVXBkYXRlIGZ1bmN0aW9uXG4gICAqIEByZXR1cm4ge3RoaXN9XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuQ29udHJvbHNNb2R1bGVcbiAgICovXG4gIHNldFVwZGF0ZSh1cGRhdGUpIHtcbiAgICB0aGlzLnVwZGF0ZSA9IHVwZGF0ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGludGVncmF0ZShzZWxmKSB7XG4gICAgc2VsZi51cGRhdGVMb29wID0gbmV3IExvb3Aoc2VsZi51cGRhdGUuYmluZChzZWxmKSk7XG4gICAgc2VsZi51cGRhdGVMb29wLnN0YXJ0KHRoaXMpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBGb2dFeHAyLFxuICBGb2dcbn0gZnJvbSAndGhyZWUnO1xuXG4vKipcbiAqIEBjbGFzcyBGb2dNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXM9e2NvbG9yOiAweGVmZDFiNSwgZGVuc2l0eTogMC4wMjAsIG5lYXI6IDEwLCBmYXI6IDEwMDB9XSAtIFRoZSBwYXJhbWV0ZXJzIG9iamVjdC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBbdHlwZT1leHAyXSAtIFRoZSB0eXBlIG9mIGZvZyAtIGV4cDIgb3IgbGluZWFyXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5Ib3cgdG8gY3JlYXRlIGFuZCBhcHBseSBhIEZvZ01vZHVsZTwvY2FwdGlvbj5cbiAqIGNvbnN0IGZvZ01vZHVsZSA9IG5ldyBGb2dNb2R1bGUoe1xuICogICAgY29sb3I6IDB4ZmZmZmZmLFxuICogICAgZGVuc2l0eTogMC4wMyxcbiAqICAgIG5lYXI6IDIwLFxuICogICAgZmFyOiAyMDBcbiAqICB9LCAnZXhwMicpO1xuICpcbiAqIG5ldyBBcHAoW1xuICogIC4uLixcbiAqICBmb2dNb2R1bGVcbiAqIF0pO1xuICovXG5leHBvcnQgY2xhc3MgRm9nTW9kdWxlIHtcbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30sIHR5cGUpIHtcbiAgICB0aGlzLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgY29sb3I6IDB4ZWZkMWI1LFxuICAgICAgZGVuc2l0eTogMC4wMjAsXG4gICAgICBuZWFyOiAxMCxcbiAgICAgIGZhcjogMTAwMFxuICAgIH0sIHBhcmFtcyk7XG4gICAgaWYgKCF0eXBlIHx8IHR5cGUgPT09ICdleHAyJykgdGhpcy5mb2cgPSBuZXcgRm9nRXhwMih0aGlzLnBhcmFtcy5jb2xvciwgdGhpcy5wYXJhbXMuZGVuc2l0eSk7XG4gICAgZWxzZSBpZiAodHlwZSA9PT0gJ2xpbmVhcicpIHRoaXMuZm9nID0gbmV3IEZvZyh0aGlzLnBhcmFtcy5jb2xvciwgdGhpcy5wYXJhbXMubmVhciwgdGhpcy5wYXJhbXMuZmFyKTtcbiAgfVxuXG4gIG1hbmFnZXIobWFuYWdlcikge1xuICAgIG1hbmFnZXIuc2V0KCdmb2cnLCB0aGlzLmZvZyk7XG4gICAgbWFuYWdlci5nZXQoJ3NjZW5lJykuZm9nID0gdGhpcy5mb2c7XG4gIH1cbn1cbiIsImltcG9ydCB7Y3JlYXRlU3RvcmV9IGZyb20gJ3JlZHV4JztcblxuY29uc3QgaXNFcXVhbERlZmF1bHQgPSAoYSwgYikgPT4ge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG4gIGVsc2UgaWYgKGEgJiYgYS5lcXVhbHMgJiYgYS5lcXVhbHMoYikpIHJldHVybiB0cnVlO1xuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogQGNsYXNzIFN0YXRlTW9kdWxlXG4gKiBAZGVzY3JpcHRpb24gYFN0YXRlTW9kdWxlYCBpcyB1c2VmdWwgZm9yIGFwcHMsIHdoZXJlIHlvdSBuZWVkIHN0YXRlIG1hbmlwdWxhdGlvbi5cbiAqIFRoaXMgY2FuIGJlOiBfdHJhbnNpdGlvbnMgYmV0d2VlbiBzY3JlZW5zLCBnYW1lcywgZGV2ZWxvcG1lbnQgbW9tZW50c18uXG4gKiBZb3UgY2FuIGNoZWNrIFtiYXNpYy9zdGF0ZV0oaHR0cHM6Ly93aHMtZGV2LnN1cmdlLnNoL2V4YW1wbGVzLz9iYXNpYy9zdGF0ZSkgZXhhbXBsZS5cbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj4gQ3JlYXRpbmcgYSBzdGF0ZSBtb2R1bGU8L2NhcHRpb24+XG4gKiBuZXcgQXBwKFtcbiAqICAgLy8gLi4uXG4gKiAgIG5ldyBTdGF0ZU1vZHVsZSgpLmRlZmF1bHQoe1xuICogICAgIHNwaGVyZUNvbG9yOiAweGZmMDAwMFxuICogICB9KVxuICogXSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBTdGF0ZU1vZHVsZSB7XG4gIHN0YXRpYyBhY3Rpb25HZW5lcmF0ZShpc0VxdWFsKSB7XG4gICAgcmV0dXJuIChzdGF0ZSA9IFt7fSwgJyddLCB7a2V5LCBkYXRhfSkgPT4ge1xuICAgICAgaWYgKGlzRXF1YWwoc3RhdGVbMF1ba2V5XSwgZGF0YSkpIHJldHVybiBzdGF0ZTtcblxuICAgICAgc3RhdGVbMF1ba2V5XSA9IGRhdGE7XG4gICAgICBzdGF0ZVsxXSA9IGtleTtcblxuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH07XG4gIH1cblxuICBjb25zdHJ1Y3RvcihlcXVhbENoZWNrID0gaXNFcXVhbERlZmF1bHQpIHtcbiAgICB0aGlzLnN0b3JlID0gY3JlYXRlU3RvcmUoXG4gICAgICBTdGF0ZU1vZHVsZS5hY3Rpb25HZW5lcmF0ZShlcXVhbENoZWNrKVxuICAgICk7XG5cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSB7fTtcbiAgICB0aGlzLmN1cnJlbnRDb25maWcgPSAnZGVmYXVsdCc7XG4gICAgdGhpcy5wcmV2Q29uZmlnID0gJ2RlZmF1bHQnO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgZGVmYXVsdFxuICAgKiBAZGVzY3JpcHRpb24gQWRkIGRlZmF1bHQgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgQ29uZmlndXJhdGlvbiBzZXR1cFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlN0YXRlTW9kdWxlXG4gICAqIEBleGFtcGxlXG4gICAqIG5ldyBXSFMuU3RhdGVNb2R1bGUoKS5kZWZhdWx0KHtcbiAgICogICBzcGhlcmVDb2xvcjogVVRJTFMuJGNvbG9ycy5tZXNoLFxuICAgKiAgIHBsYW5lQ29sb3I6IDB4NDQ3RjhCXG4gICAqIH0pXG4gICAqL1xuICBkZWZhdWx0KGRhdGEpIHtcbiAgICB0aGlzLmNvbmZpZyh7ZGVmYXVsdDogZGF0YX0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc2V0RXF1YWxDaGVja1xuICAgKiBAZGVzY3JpcHRpb24gU2V0cyBhbiBlcXVhbENoZWNrIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgZXF1YWwgY2hlY2tcbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5TdGF0ZU1vZHVsZVxuICAgKi9cbiAgc2V0RXF1YWxDaGVjayhmdW5jKSB7XG4gICAgdGhpcy5zdG9yZS5yZXBsYWNlUmVkdWNlcihcbiAgICAgIFN0YXRlTW9kdWxlLmFjdGlvbkdlbmVyYXRlKGZ1bmMpXG4gICAgKTtcbiAgfVxuXG4gIG1hbmFnZXIobWFuYWdlcikge1xuICAgIG1hbmFnZXIuZGVmaW5lKCdzdGF0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgY29uZmlnXG4gICAqIEBkZXNjcmlwdGlvbiBMb2FkIGNvbmZpZ3VyYXRpb25zIGZyb20gb2JqZWN0LlxuICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlncyBDb25maWd1cmF0aW9uIGRhdGFcbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5TdGF0ZU1vZHVsZVxuICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj4gQWRkaW5nIGBncmVlbmAgY29uZmlndXJhdGlvbjwvY2FwdGlvbj5cbiAgICogc3RhdGUuY29uZmlnKHtcbiAgICogICBncmVlbjoge1xuICAgKiAgICAgc3BoZXJlQ29sb3I6IDB4MDBmZjAwLFxuICAgKiAgICAgcGxhbmVDb2xvcjogMHgwMGZmMDBcbiAgICogICB9XG4gICAqIH0pO1xuICAgKi9cbiAgY29uZmlnKGNvbmZpZ3MpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBjb25maWdzKSB7XG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbltrZXldID0ga2V5ID09PSAnZGVmYXVsdCdcbiAgICAgICAgICA/IGNvbmZpZ3Nba2V5XVxuICAgICAgICAgIDogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHQsIGNvbmZpZ3Nba2V5XSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgdXBkYXRlXG4gICAqIEBkZXNjcmlwdGlvbiBMb2FkIHVwZGF0ZXMgZnJvbSBvYmplY3QuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB1cGRhdGVzIFVwZGF0ZXMgZGF0YVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlN0YXRlTW9kdWxlXG4gICAqIEBleGFtcGxlIDxjYXB0aW9uPiBVcGRhdGUgY2FsbGJhY2sgZm9yIGBzcGhlcmVDb2xvcmA8L2NhcHRpb24+XG4gICAqIHN0YXRlLnVwZGF0ZSh7XG4gICAqICAgc3BoZXJlQ29sb3I6IGNvbG9yID0+IHNwaGVyZS5tYXRlcmlhbC5jb2xvci5zZXRIZXgoY29sb3IpXG4gICAqIH0pO1xuICAgKi9cbiAgdXBkYXRlKHVwZGF0ZXMgPSB7fSkge1xuICAgIHRoaXMuc3RvcmUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGNvbnN0IFtkYXRhLCBjaGFuZ2VkS2V5XSA9IHRoaXMuc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gdXBkYXRlc1tjaGFuZ2VkS2V5XTtcblxuICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhkYXRhW2NoYW5nZWRLZXldKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHRvXG4gICAqIEBkZXNjcmlwdGlvbiBTd2l0Y2ggdG8gY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGNvbmZpZ05hbWUgQ29uZmlndXJhdGlvbiBuYW1lLlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlN0YXRlTW9kdWxlXG4gICAqIEBleGFtcGxlIDxjYXB0aW9uPiBDaGFuZ2VzIGNvbmZpZ3VyYXRpb24gdG8gYGdyZWVuYDwvY2FwdGlvbj5cbiAgICogc3RhdGUudG8oJ2dyZWVuJyk7XG4gICAqL1xuICB0byhjb25maWdOYW1lKSB7XG4gICAgdGhpcy5wcmV2Q29uZmlnID0gdGhpcy5jdXJyZW50Q29uZmlnO1xuICAgIHRoaXMuY3VycmVudENvbmZpZyA9IGNvbmZpZ05hbWU7XG5cbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZ3VyYXRpb25bY29uZmlnTmFtZV1cbiAgICAgID8gdGhpcy5jb25maWd1cmF0aW9uW2NvbmZpZ05hbWVdXG4gICAgICA6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0O1xuXG4gICAgdGhpcy5zZXQoY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHNldFxuICAgKiBAZGVzY3JpcHRpb24gU2V0IGN1cnJlbnQgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlN0YXRlTW9kdWxlXG4gICAqIEBleGFtcGxlXG4gICAqIHN0YXRlLnNldCh7XG4gICAqICAgc3BoZXJlQ29sb3I6IDB4MDBmZjAwXG4gICAqIH0pO1xuICAgKi9cbiAgc2V0KGRhdGEpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKVxuICAgICAgaWYgKGtleSkgdGhpcy5zdG9yZS5kaXNwYXRjaCh7dHlwZTogJ0FERCcsIGtleSwgZGF0YTogZGF0YVtrZXldfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBnZXRcbiAgICogQGRlc2NyaXB0aW9uIFJldHVybiBkYXRhIG9mIHBhcmFtZXRlci5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGtleSBQYXJhbWV0ZXIgbmFtZS5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5TdGF0ZU1vZHVsZVxuICAgKiBAZXhhbXBsZVxuICAgKiBzdGF0ZS5nZXQoJ3NwaGVyZUNvbG9yJyk7IC8vIDB4MDBmZjAwXG4gICAqL1xuICBnZXQoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0U3RhdGUoKVswXVtrZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgcHJldlxuICAgKiBAZGVzY3JpcHRpb24gUmV0dXJuIGB0cnVlVmFsYCBpZiBgY29uZmlnYCBtYXRjaCBwcmV2aW91cyBjb25maWd1cmF0aW9uLCBpbiBvdGhlciBjYXNlIC0gcmV0dXJuIGBmYWxzZVZhbGAuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjb25maWcgQ29uZmlndXJhdGlvbiBuYW1lLlxuICAgKiBAcGFyYW0ge0FueX0gdHJ1ZVZhbCBWYWx1ZSByZXR1cm5lZCBpZiBjb25kaXRpb24gaXMgdHJ1dGh5LlxuICAgKiBAcGFyYW0ge0FueX0gZmFsc2VWYWwgVmFsdWUgcmV0dXJuZWQgaWYgY29uZGl0aW9uIGlzIGZhbHN5LlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlN0YXRlTW9kdWxlXG4gICAqL1xuICBwcmV2KGNvbmZpZywgdHJ1ZVZhbCwgZmFsc2VWYWwpIHtcbiAgICByZXR1cm4gdGhpcy5wcmV2Q29uZmlnID09PSBjb25maWcgPyB0cnVlVmFsIDogZmFsc2VWYWw7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBjdXJyZW50XG4gICAqIEBkZXNjcmlwdGlvbiBSZXR1cm4gYHRydWVWYWxgIGlmIGBjb25maWdgIG1hdGNoIGN1cnJlbnQgY29uZmlndXJhdGlvbiwgaW4gb3RoZXIgY2FzZSAtIHJldHVybiBgZmFsc2VWYWxgLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY29uZmlnIENvbmZpZ3VyYXRpb24gbmFtZS5cbiAgICogQHBhcmFtIHtBbnl9IHRydWVWYWwgVmFsdWUgcmV0dXJuZWQgaWYgY29uZGl0aW9uIGlzIHRydXRoeS5cbiAgICogQHBhcmFtIHtBbnl9IGZhbHNlVmFsIFZhbHVlIHJldHVybmVkIGlmIGNvbmRpdGlvbiBpcyBmYWxzeS5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5TdGF0ZU1vZHVsZVxuICAgKi9cbiAgY3VycmVudChjb25maWcsIHRydWVWYWwsIGZhbHNlVmFsKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudENvbmZpZyA9PT0gY29uZmlnID8gdHJ1ZVZhbCA6IGZhbHNlVmFsO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBNT1VTRSxcbiAgUXVhdGVybmlvbixcbiAgU3BoZXJpY2FsLFxuICBWZWN0b3IyLFxuICBQZXJzcGVjdGl2ZUNhbWVyYSxcbiAgT3J0aG9ncmFwaGljQ2FtZXJhLFxuICBFdmVudERpc3BhdGNoZXIsXG4gIFZlY3RvcjNcbn0gZnJvbSAndGhyZWUnO1xuXG4vLyBUaGlzIHNldCBvZiBjb250cm9scyBwZXJmb3JtcyBvcmJpdGluZywgZG9sbHlpbmcgKHpvb21pbmcpLCBhbmQgcGFubmluZy5cbi8vIFVubGlrZSBUcmFja2JhbGxDb250cm9scywgaXQgbWFpbnRhaW5zIHRoZSBcInVwXCIgZGlyZWN0aW9uIG9iamVjdC51cCAoK1kgYnkgZGVmYXVsdCkuXG4vL1xuLy8gICAgT3JiaXQgLSBsZWZ0IG1vdXNlIC8gdG91Y2g6IG9uZSBmaW5nZXIgbW92ZVxuLy8gICAgWm9vbSAtIG1pZGRsZSBtb3VzZSwgb3IgbW91c2V3aGVlbCAvIHRvdWNoOiB0d28gZmluZ2VyIHNwcmVhZCBvciBzcXVpc2hcbi8vICAgIFBhbiAtIHJpZ2h0IG1vdXNlLCBvciBhcnJvdyBrZXlzIC8gdG91Y2g6IHRocmVlIGZpbnRlciBzd2lwZVxuXG5leHBvcnQgY2xhc3MgVGhyZWVPcmJpdENvbnRyb2xzIGV4dGVuZHMgRXZlbnREaXNwYXRjaGVyIHtcbiAgY29uc3RydWN0b3Iob2JqZWN0LCBkb21FbGVtZW50LCBldmVudEhhbmRsZXIpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7XG5cbiAgICB0aGlzLmRvbUVsZW1lbnQgPSAoZG9tRWxlbWVudCA9PT0gdW5kZWZpbmVkKSA/IGRvY3VtZW50IDogZG9tRWxlbWVudDtcbiAgICB0aGlzLmV2ZW50SGFuZGxlciA9IGV2ZW50SGFuZGxlcjtcblxuICAgIC8vIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIHRoaXMgY29udHJvbFxuICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XG5cbiAgICAvLyBcInRhcmdldFwiIHNldHMgdGhlIGxvY2F0aW9uIG9mIGZvY3VzLCB3aGVyZSB0aGUgb2JqZWN0IG9yYml0cyBhcm91bmRcbiAgICB0aGlzLnRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cbiAgICAvLyBIb3cgZmFyIHlvdSBjYW4gZG9sbHkgaW4gYW5kIG91dCAoIFBlcnNwZWN0aXZlQ2FtZXJhIG9ubHkgKVxuICAgIHRoaXMubWluRGlzdGFuY2UgPSAwO1xuICAgIHRoaXMubWF4RGlzdGFuY2UgPSBJbmZpbml0eTtcblxuICAgIC8vIEhvdyBmYXIgeW91IGNhbiB6b29tIGluIGFuZCBvdXQgKCBPcnRob2dyYXBoaWNDYW1lcmEgb25seSApXG4gICAgdGhpcy5taW5ab29tID0gMDtcbiAgICB0aGlzLm1heFpvb20gPSBJbmZpbml0eTtcblxuICAgIC8vIEhvdyBmYXIgeW91IGNhbiBvcmJpdCB2ZXJ0aWNhbGx5LCB1cHBlciBhbmQgbG93ZXIgbGltaXRzLlxuICAgIC8vIFJhbmdlIGlzIDAgdG8gTWF0aC5QSSByYWRpYW5zLlxuICAgIHRoaXMubWluUG9sYXJBbmdsZSA9IDA7IC8vIHJhZGlhbnNcbiAgICB0aGlzLm1heFBvbGFyQW5nbGUgPSBNYXRoLlBJOyAvLyByYWRpYW5zXG5cbiAgICAvLyBIb3cgZmFyIHlvdSBjYW4gb3JiaXQgaG9yaXpvbnRhbGx5LCB1cHBlciBhbmQgbG93ZXIgbGltaXRzLlxuICAgIC8vIElmIHNldCwgbXVzdCBiZSBhIHN1Yi1pbnRlcnZhbCBvZiB0aGUgaW50ZXJ2YWwgWyAtIE1hdGguUEksIE1hdGguUEkgXS5cbiAgICB0aGlzLm1pbkF6aW11dGhBbmdsZSA9IC1JbmZpbml0eTsgLy8gcmFkaWFuc1xuICAgIHRoaXMubWF4QXppbXV0aEFuZ2xlID0gSW5maW5pdHk7IC8vIHJhZGlhbnNcblxuICAgIC8vIFNldCB0byB0cnVlIHRvIGVuYWJsZSBkYW1waW5nIChpbmVydGlhKVxuICAgIC8vIElmIGRhbXBpbmcgaXMgZW5hYmxlZCwgeW91IG11c3QgY2FsbCBjb250cm9scy51cGRhdGUoKSBpbiB5b3VyIGFuaW1hdGlvbiBsb29wXG4gICAgdGhpcy5lbmFibGVEYW1waW5nID0gZmFsc2U7XG4gICAgdGhpcy5kYW1waW5nRmFjdG9yID0gMC4yNTtcblxuICAgIC8vIFRoaXMgb3B0aW9uIGFjdHVhbGx5IGVuYWJsZXMgZG9sbHlpbmcgaW4gYW5kIG91dDsgbGVmdCBhcyBcInpvb21cIiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gICAgLy8gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgem9vbWluZ1xuICAgIHRoaXMuZW5hYmxlWm9vbSA9IHRydWU7XG4gICAgdGhpcy56b29tU3BlZWQgPSAxLjA7XG5cbiAgICAvLyBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZSByb3RhdGluZ1xuICAgIHRoaXMuZW5hYmxlUm90YXRlID0gdHJ1ZTtcbiAgICB0aGlzLnJvdGF0ZVNwZWVkID0gMS4wO1xuXG4gICAgLy8gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgcGFubmluZ1xuICAgIHRoaXMuZW5hYmxlUGFuID0gdHJ1ZTtcbiAgICB0aGlzLmtleVBhblNwZWVkID0gNy4wOyAvLyBwaXhlbHMgbW92ZWQgcGVyIGFycm93IGtleSBwdXNoXG5cbiAgICAvLyBTZXQgdG8gdHJ1ZSB0byBhdXRvbWF0aWNhbGx5IHJvdGF0ZSBhcm91bmQgdGhlIHRhcmdldFxuICAgIC8vIElmIGF1dG8tcm90YXRlIGlzIGVuYWJsZWQsIHlvdSBtdXN0IGNhbGwgY29udHJvbHMudXBkYXRlKCkgaW4geW91ciBhbmltYXRpb24gbG9vcFxuICAgIHRoaXMuYXV0b1JvdGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuYXV0b1JvdGF0ZVNwZWVkID0gMi4wOyAvLyAzMCBzZWNvbmRzIHBlciByb3VuZCB3aGVuIGZwcyBpcyA2MFxuXG4gICAgLy8gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgdXNlIG9mIHRoZSBrZXlzXG4gICAgdGhpcy5lbmFibGVLZXlzID0gdHJ1ZTtcblxuICAgIC8vIFRoZSBmb3VyIGFycm93IGtleXNcbiAgICB0aGlzLmtleXMgPSB7TEVGVDogMzcsIFVQOiAzOCwgUklHSFQ6IDM5LCBCT1RUT006IDQwfTtcblxuICAgIC8vIE1vdXNlIGJ1dHRvbnNcbiAgICB0aGlzLm1vdXNlQnV0dG9ucyA9IHtPUkJJVDogTU9VU0UuTEVGVCwgWk9PTTogTU9VU0UuTUlERExFLCBQQU46IE1PVVNFLlJJR0hUfTtcblxuICAgIC8vIGZvciByZXNldFxuICAgIHRoaXMudGFyZ2V0MCA9IHRoaXMudGFyZ2V0LmNsb25lKCk7XG4gICAgdGhpcy5wb3NpdGlvbjAgPSB0aGlzLm9iamVjdC5wb3NpdGlvbi5jbG9uZSgpO1xuICAgIHRoaXMuem9vbTAgPSB0aGlzLm9iamVjdC56b29tO1xuXG4gICAgLy9cbiAgICAvLyBwdWJsaWMgbWV0aG9kc1xuICAgIC8vXG5cbiAgICB0aGlzLmdldFBvbGFyQW5nbGUgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gc3BoZXJpY2FsLnBoaTtcbiAgICB9O1xuXG4gICAgdGhpcy5nZXRBemltdXRoYWxBbmdsZSA9ICgpID0+IHtcbiAgICAgIHJldHVybiBzcGhlcmljYWwudGhldGE7XG4gICAgfTtcblxuICAgIHRoaXMucmVzZXQgPSAoKSA9PiB7XG4gICAgICB0aGlzLnRhcmdldC5jb3B5KHRoaXMudGFyZ2V0MCk7XG4gICAgICB0aGlzLm9iamVjdC5wb3NpdGlvbi5jb3B5KHRoaXMucG9zaXRpb24wKTtcbiAgICAgIHRoaXMub2JqZWN0Lnpvb20gPSB0aGlzLnpvb20wO1xuXG4gICAgICB0aGlzLm9iamVjdC51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoY2hhbmdlRXZlbnQpO1xuXG4gICAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgICBzdGF0ZSA9IFNUQVRFLk5PTkU7XG4gICAgfTtcblxuICAgIC8vIHRoaXMgbWV0aG9kIGlzIGV4cG9zZWQsIGJ1dCBwZXJoYXBzIGl0IHdvdWxkIGJlIGJldHRlciBpZiB3ZSBjYW4gbWFrZSBpdCBwcml2YXRlLi4uXG4gICAgdGhpcy51cGRhdGUgPSAoKSA9PiB7XG4gICAgICBjb25zdCBvZmZzZXQgPSBuZXcgVmVjdG9yMygpO1xuXG4gICAgICAvLyBzbyBjYW1lcmEudXAgaXMgdGhlIG9yYml0IGF4aXNcbiAgICAgIGNvbnN0IHF1YXQgPSBuZXcgUXVhdGVybmlvbigpLnNldEZyb21Vbml0VmVjdG9ycyhvYmplY3QudXAsIG5ldyBWZWN0b3IzKDAsIDEsIDApKTtcbiAgICAgIGNvbnN0IHF1YXRJbnZlcnNlID0gcXVhdC5jbG9uZSgpLmludmVyc2UoKTtcblxuICAgICAgY29uc3QgbGFzdFBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcbiAgICAgIGNvbnN0IGxhc3RRdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblxuICAgICAgcmV0dXJuICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5vYmplY3QucG9zaXRpb247XG5cbiAgICAgICAgb2Zmc2V0LmNvcHkocG9zaXRpb24pLnN1Yih0aGlzLnRhcmdldCk7XG5cbiAgICAgICAgLy8gcm90YXRlIG9mZnNldCB0byBcInktYXhpcy1pcy11cFwiIHNwYWNlXG4gICAgICAgIG9mZnNldC5hcHBseVF1YXRlcm5pb24ocXVhdCk7XG5cbiAgICAgICAgLy8gYW5nbGUgZnJvbSB6LWF4aXMgYXJvdW5kIHktYXhpc1xuICAgICAgICBzcGhlcmljYWwuc2V0RnJvbVZlY3RvcjMob2Zmc2V0KTtcblxuICAgICAgICBpZiAodGhpcy5hdXRvUm90YXRlICYmIHN0YXRlID09PSBTVEFURS5OT05FKVxuICAgICAgICAgIHJvdGF0ZUxlZnQoZ2V0QXV0b1JvdGF0aW9uQW5nbGUoKSk7XG5cbiAgICAgICAgc3BoZXJpY2FsLnRoZXRhICs9IHNwaGVyaWNhbERlbHRhLnRoZXRhO1xuICAgICAgICBzcGhlcmljYWwucGhpICs9IHNwaGVyaWNhbERlbHRhLnBoaTtcblxuICAgICAgICAvLyByZXN0cmljdCB0aGV0YSB0byBiZSBiZXR3ZWVuIGRlc2lyZWQgbGltaXRzXG4gICAgICAgIHNwaGVyaWNhbC50aGV0YSA9IE1hdGgubWF4KHRoaXMubWluQXppbXV0aEFuZ2xlLCBNYXRoLm1pbih0aGlzLm1heEF6aW11dGhBbmdsZSwgc3BoZXJpY2FsLnRoZXRhKSk7XG5cbiAgICAgICAgLy8gcmVzdHJpY3QgcGhpIHRvIGJlIGJldHdlZW4gZGVzaXJlZCBsaW1pdHNcbiAgICAgICAgc3BoZXJpY2FsLnBoaSA9IE1hdGgubWF4KHRoaXMubWluUG9sYXJBbmdsZSwgTWF0aC5taW4odGhpcy5tYXhQb2xhckFuZ2xlLCBzcGhlcmljYWwucGhpKSk7XG5cbiAgICAgICAgc3BoZXJpY2FsLm1ha2VTYWZlKCk7XG5cbiAgICAgICAgc3BoZXJpY2FsLnJhZGl1cyAqPSBzY2FsZTtcblxuICAgICAgICAvLyByZXN0cmljdCByYWRpdXMgdG8gYmUgYmV0d2VlbiBkZXNpcmVkIGxpbWl0c1xuICAgICAgICBzcGhlcmljYWwucmFkaXVzID0gTWF0aC5tYXgodGhpcy5taW5EaXN0YW5jZSwgTWF0aC5taW4odGhpcy5tYXhEaXN0YW5jZSwgc3BoZXJpY2FsLnJhZGl1cykpO1xuXG4gICAgICAgIC8vIG1vdmUgdGFyZ2V0IHRvIHBhbm5lZCBsb2NhdGlvblxuICAgICAgICB0aGlzLnRhcmdldC5hZGQocGFuT2Zmc2V0KTtcblxuICAgICAgICBvZmZzZXQuc2V0RnJvbVNwaGVyaWNhbChzcGhlcmljYWwpO1xuXG4gICAgICAgIC8vIHJvdGF0ZSBvZmZzZXQgYmFjayB0byBcImNhbWVyYS11cC12ZWN0b3ItaXMtdXBcIiBzcGFjZVxuICAgICAgICBvZmZzZXQuYXBwbHlRdWF0ZXJuaW9uKHF1YXRJbnZlcnNlKTtcblxuICAgICAgICBwb3NpdGlvbi5jb3B5KHRoaXMudGFyZ2V0KS5hZGQob2Zmc2V0KTtcblxuICAgICAgICB0aGlzLm9iamVjdC5sb29rQXQodGhpcy50YXJnZXQpO1xuXG4gICAgICAgIGlmICh0aGlzLmVuYWJsZURhbXBpbmcgPT09IHRydWUpIHtcbiAgICAgICAgICBzcGhlcmljYWxEZWx0YS50aGV0YSAqPSAoMSAtIHRoaXMuZGFtcGluZ0ZhY3Rvcik7XG4gICAgICAgICAgc3BoZXJpY2FsRGVsdGEucGhpICo9ICgxIC0gdGhpcy5kYW1waW5nRmFjdG9yKTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgc3BoZXJpY2FsRGVsdGEuc2V0KDAsIDAsIDApO1xuXG4gICAgICAgIHNjYWxlID0gMTtcbiAgICAgICAgcGFuT2Zmc2V0LnNldCgwLCAwLCAwKTtcblxuICAgICAgICAvLyB1cGRhdGUgY29uZGl0aW9uIGlzOlxuICAgICAgICAvLyBtaW4oY2FtZXJhIGRpc3BsYWNlbWVudCwgY2FtZXJhIHJvdGF0aW9uIGluIHJhZGlhbnMpXjIgPiBFUFNcbiAgICAgICAgLy8gdXNpbmcgc21hbGwtYW5nbGUgYXBwcm94aW1hdGlvbiBjb3MoeC8yKSA9IDEgLSB4XjIgLyA4XG5cbiAgICAgICAgaWYgKHpvb21DaGFuZ2VkXG4gICAgICAgICAgfHwgbGFzdFBvc2l0aW9uLmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMub2JqZWN0LnBvc2l0aW9uKSA+IEVQU1xuICAgICAgICAgIHx8IDggKiAoMSAtIGxhc3RRdWF0ZXJuaW9uLmRvdCh0aGlzLm9iamVjdC5xdWF0ZXJuaW9uKSkgPiBFUFMpIHtcbiAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoY2hhbmdlRXZlbnQpO1xuXG4gICAgICAgICAgbGFzdFBvc2l0aW9uLmNvcHkodGhpcy5vYmplY3QucG9zaXRpb24pO1xuICAgICAgICAgIGxhc3RRdWF0ZXJuaW9uLmNvcHkodGhpcy5vYmplY3QucXVhdGVybmlvbik7XG4gICAgICAgICAgem9vbUNoYW5nZWQgPSBmYWxzZTtcblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSkoKTtcbiAgICB9O1xuXG4gICAgdGhpcy5kaXNwb3NlID0gKCkgPT4ge1xuICAgICAgdGhpcy5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jywgb25Db250ZXh0TWVudSwgZmFsc2UpO1xuICAgICAgdGhpcy5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG9uTW91c2VEb3duLCBmYWxzZSk7XG4gICAgICB0aGlzLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBvbk1vdXNlV2hlZWwsIGZhbHNlKTtcblxuICAgICAgdGhpcy5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvblRvdWNoU3RhcnQsIGZhbHNlKTtcbiAgICAgIHRoaXMuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uVG91Y2hFbmQsIGZhbHNlKTtcbiAgICAgIHRoaXMuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBvblRvdWNoTW92ZSwgZmFsc2UpO1xuXG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSwgZmFsc2UpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCwgZmFsc2UpO1xuXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5RG93biwgZmFsc2UpO1xuXG4gICAgICAvLyB0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTsgLy8gc2hvdWxkIHRoaXMgYmUgYWRkZWQgaGVyZT9cbiAgICB9O1xuXG4gICAgLy9cbiAgICAvLyBpbnRlcm5hbHNcbiAgICAvL1xuXG4gICAgY29uc3QgY2hhbmdlRXZlbnQgPSB7dHlwZTogJ2NoYW5nZSd9O1xuICAgIGNvbnN0IHN0YXJ0RXZlbnQgPSB7dHlwZTogJ3N0YXJ0J307XG4gICAgY29uc3QgZW5kRXZlbnQgPSB7dHlwZTogJ2VuZCd9O1xuXG4gICAgY29uc3QgU1RBVEUgPSB7Tk9ORTogLTEsIFJPVEFURTogMCwgRE9MTFk6IDEsIFBBTjogMiwgVE9VQ0hfUk9UQVRFOiAzLCBUT1VDSF9ET0xMWTogNCwgVE9VQ0hfUEFOOiA1fTtcblxuICAgIGxldCBzdGF0ZSA9IFNUQVRFLk5PTkU7XG5cbiAgICBjb25zdCBFUFMgPSAwLjAwMDAwMTtcblxuICAgIC8vIGN1cnJlbnQgcG9zaXRpb24gaW4gc3BoZXJpY2FsIGNvb3JkaW5hdGVzXG4gICAgY29uc3Qgc3BoZXJpY2FsID0gbmV3IFNwaGVyaWNhbCgpO1xuICAgIGNvbnN0IHNwaGVyaWNhbERlbHRhID0gbmV3IFNwaGVyaWNhbCgpO1xuXG4gICAgbGV0IHNjYWxlID0gMTtcbiAgICBjb25zdCBwYW5PZmZzZXQgPSBuZXcgVmVjdG9yMygpO1xuICAgIGxldCB6b29tQ2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgY29uc3Qgcm90YXRlU3RhcnQgPSBuZXcgVmVjdG9yMigpO1xuICAgIGNvbnN0IHJvdGF0ZUVuZCA9IG5ldyBWZWN0b3IyKCk7XG4gICAgY29uc3Qgcm90YXRlRGVsdGEgPSBuZXcgVmVjdG9yMigpO1xuXG4gICAgY29uc3QgcGFuU3RhcnQgPSBuZXcgVmVjdG9yMigpO1xuICAgIGNvbnN0IHBhbkVuZCA9IG5ldyBWZWN0b3IyKCk7XG4gICAgY29uc3QgcGFuRGVsdGEgPSBuZXcgVmVjdG9yMigpO1xuXG4gICAgY29uc3QgZG9sbHlTdGFydCA9IG5ldyBWZWN0b3IyKCk7XG4gICAgY29uc3QgZG9sbHlFbmQgPSBuZXcgVmVjdG9yMigpO1xuICAgIGNvbnN0IGRvbGx5RGVsdGEgPSBuZXcgVmVjdG9yMigpO1xuXG4gICAgY29uc3QgZ2V0QXV0b1JvdGF0aW9uQW5nbGUgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gMiAqIE1hdGguUEkgLyA2MCAvIDYwICogdGhpcy5hdXRvUm90YXRlU3BlZWQ7XG4gICAgfTtcblxuICAgIGNvbnN0IGdldFpvb21TY2FsZSA9ICgpID0+IHtcbiAgICAgIHJldHVybiBNYXRoLnBvdygwLjk1LCB0aGlzLnpvb21TcGVlZCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJvdGF0ZUxlZnQgPSBhbmdsZSA9PiB7XG4gICAgICBzcGhlcmljYWxEZWx0YS50aGV0YSAtPSBhbmdsZTtcbiAgICB9O1xuXG4gICAgY29uc3Qgcm90YXRlVXAgPSBhbmdsZSA9PiB7XG4gICAgICBzcGhlcmljYWxEZWx0YS5waGkgLT0gYW5nbGU7XG4gICAgfTtcblxuICAgIGNvbnN0IHBhbkxlZnQgPSAoKCkgPT4ge1xuICAgICAgY29uc3QgdiA9IG5ldyBWZWN0b3IzKCk7XG5cbiAgICAgIHJldHVybiAoZGlzdGFuY2UsIG9iamVjdE1hdHJpeCkgPT4ge1xuICAgICAgICB2LnNldEZyb21NYXRyaXhDb2x1bW4ob2JqZWN0TWF0cml4LCAwKTsgLy8gZ2V0IFggY29sdW1uIG9mIG9iamVjdE1hdHJpeFxuICAgICAgICB2Lm11bHRpcGx5U2NhbGFyKC1kaXN0YW5jZSk7XG4gICAgICAgIHBhbk9mZnNldC5hZGQodik7XG4gICAgICB9O1xuICAgIH0pKCk7XG5cbiAgICBjb25zdCBwYW5VcCA9ICgoKSA9PiB7XG4gICAgICBjb25zdCB2ID0gbmV3IFZlY3RvcjMoKTtcblxuICAgICAgcmV0dXJuIChkaXN0YW5jZSwgb2JqZWN0TWF0cml4KSA9PiB7XG4gICAgICAgIHYuc2V0RnJvbU1hdHJpeENvbHVtbihvYmplY3RNYXRyaXgsIDEpOyAvLyBnZXQgWSBjb2x1bW4gb2Ygb2JqZWN0TWF0cml4XG4gICAgICAgIHYubXVsdGlwbHlTY2FsYXIoZGlzdGFuY2UpO1xuICAgICAgICBwYW5PZmZzZXQuYWRkKHYpO1xuICAgICAgfTtcbiAgICB9KSgpO1xuXG4gICAgLy8gZGVsdGFYIGFuZCBkZWx0YVkgYXJlIGluIHBpeGVsczsgcmlnaHQgYW5kIGRvd24gYXJlIHBvc2l0aXZlXG4gICAgY29uc3QgcGFuID0gKCgpID0+IHtcbiAgICAgIGNvbnN0IG9mZnNldCA9IG5ldyBWZWN0b3IzKCk7XG5cbiAgICAgIHJldHVybiAoZGVsdGFYLCBkZWx0YVkpID0+IHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZG9tRWxlbWVudCA9PT0gZG9jdW1lbnQgPyB0aGlzLmRvbUVsZW1lbnQuYm9keSA6IHRoaXMuZG9tRWxlbWVudDtcblxuICAgICAgICBpZiAodGhpcy5vYmplY3QgaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZUNhbWVyYSkge1xuICAgICAgICAgIC8vIHBlcnNwZWN0aXZlXG4gICAgICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLm9iamVjdC5wb3NpdGlvbjtcbiAgICAgICAgICBvZmZzZXQuY29weShwb3NpdGlvbikuc3ViKHRoaXMudGFyZ2V0KTtcbiAgICAgICAgICBsZXQgdGFyZ2V0RGlzdGFuY2UgPSBvZmZzZXQubGVuZ3RoKCk7XG5cbiAgICAgICAgICAvLyBoYWxmIG9mIHRoZSBmb3YgaXMgY2VudGVyIHRvIHRvcCBvZiBzY3JlZW5cbiAgICAgICAgICB0YXJnZXREaXN0YW5jZSAqPSBNYXRoLnRhbigodGhpcy5vYmplY3QuZm92IC8gMikgKiBNYXRoLlBJIC8gMTgwLjApO1xuXG4gICAgICAgICAgLy8gd2UgYWN0dWFsbHkgZG9uJ3QgdXNlIHNjcmVlbldpZHRoLCBzaW5jZSBwZXJzcGVjdGl2ZSBjYW1lcmEgaXMgZml4ZWQgdG8gc2NyZWVuIGhlaWdodFxuICAgICAgICAgIHBhbkxlZnQoMiAqIGRlbHRhWCAqIHRhcmdldERpc3RhbmNlIC8gZWxlbWVudC5jbGllbnRIZWlnaHQsIHRoaXMub2JqZWN0Lm1hdHJpeCk7XG4gICAgICAgICAgcGFuVXAoMiAqIGRlbHRhWSAqIHRhcmdldERpc3RhbmNlIC8gZWxlbWVudC5jbGllbnRIZWlnaHQsIHRoaXMub2JqZWN0Lm1hdHJpeCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5vYmplY3QgaW5zdGFuY2VvZiBPcnRob2dyYXBoaWNDYW1lcmEpIHtcbiAgICAgICAgICAvLyBvcnRob2dyYXBoaWNcbiAgICAgICAgICBwYW5MZWZ0KGRlbHRhWCAqICh0aGlzLm9iamVjdC5yaWdodCAtIHRoaXMub2JqZWN0LmxlZnQpIC8gdGhpcy5vYmplY3Quem9vbSAvIGVsZW1lbnQuY2xpZW50V2lkdGgsIHRoaXMub2JqZWN0Lm1hdHJpeCk7XG4gICAgICAgICAgcGFuVXAoZGVsdGFZICogKHRoaXMub2JqZWN0LnRvcCAtIHRoaXMub2JqZWN0LmJvdHRvbSkgLyB0aGlzLm9iamVjdC56b29tIC8gZWxlbWVudC5jbGllbnRIZWlnaHQsIHRoaXMub2JqZWN0Lm1hdHJpeCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gY2FtZXJhIG5laXRoZXIgb3J0aG9ncmFwaGljIG5vciBwZXJzcGVjdGl2ZVxuICAgICAgICAgIGNvbnNvbGUud2FybignV0FSTklORzogT3JiaXRDb250cm9sc01vZHVsZS5qcyBlbmNvdW50ZXJlZCBhbiB1bmtub3duIGNhbWVyYSB0eXBlIC0gcGFuIGRpc2FibGVkLicpO1xuICAgICAgICAgIHRoaXMuZW5hYmxlUGFuID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSkoKTtcblxuICAgIGNvbnN0IGRvbGx5SW4gPSBkb2xseVNjYWxlID0+IHtcbiAgICAgIGlmICh0aGlzLm9iamVjdCBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlQ2FtZXJhKVxuICAgICAgICBzY2FsZSAvPSBkb2xseVNjYWxlO1xuXG4gICAgICBlbHNlIGlmICh0aGlzLm9iamVjdCBpbnN0YW5jZW9mIE9ydGhvZ3JhcGhpY0NhbWVyYSkge1xuICAgICAgICB0aGlzLm9iamVjdC56b29tID0gTWF0aC5tYXgodGhpcy5taW5ab29tLCBNYXRoLm1pbih0aGlzLm1heFpvb20sIHRoaXMub2JqZWN0Lnpvb20gKiBkb2xseVNjYWxlKSk7XG4gICAgICAgIHRoaXMub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcbiAgICAgICAgem9vbUNoYW5nZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdXQVJOSU5HOiBPcmJpdENvbnRyb2xzTW9kdWxlLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUgLSBkb2xseS96b29tIGRpc2FibGVkLicpO1xuICAgICAgICB0aGlzLmVuYWJsZVpvb20gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgZG9sbHlPdXQgPSBkb2xseVNjYWxlID0+IHtcbiAgICAgIGlmICh0aGlzLm9iamVjdCBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlQ2FtZXJhKVxuICAgICAgICBzY2FsZSAqPSBkb2xseVNjYWxlO1xuXG4gICAgICBlbHNlIGlmICh0aGlzLm9iamVjdCBpbnN0YW5jZW9mIE9ydGhvZ3JhcGhpY0NhbWVyYSkge1xuICAgICAgICB0aGlzLm9iamVjdC56b29tID0gTWF0aC5tYXgodGhpcy5taW5ab29tLCBNYXRoLm1pbih0aGlzLm1heFpvb20sIHRoaXMub2JqZWN0Lnpvb20gLyBkb2xseVNjYWxlKSk7XG4gICAgICAgIHRoaXMub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcbiAgICAgICAgem9vbUNoYW5nZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdXQVJOSU5HOiBPcmJpdENvbnRyb2xzTW9kdWxlLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUgLSBkb2xseS96b29tIGRpc2FibGVkLicpO1xuICAgICAgICB0aGlzLmVuYWJsZVpvb20gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy9cbiAgICAvLyBldmVudCBjYWxsYmFja3MgLSB1cGRhdGUgdGhlIG9iamVjdCBzdGF0ZVxuICAgIC8vXG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZURvd25Sb3RhdGUgPSBldmVudCA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlRG93blJvdGF0ZScgKTtcblxuICAgICAgcm90YXRlU3RhcnQuc2V0KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZURvd25Eb2xseSA9IGV2ZW50ID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCAnaGFuZGxlTW91c2VEb3duRG9sbHknICk7XG5cbiAgICAgIGRvbGx5U3RhcnQuc2V0KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZURvd25QYW4gPSBldmVudCA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlRG93blBhbicgKTtcblxuICAgICAgcGFuU3RhcnQuc2V0KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZU1vdmVSb3RhdGUgPSBldmVudCA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlTW92ZVJvdGF0ZScgKTtcblxuICAgICAgcm90YXRlRW5kLnNldChldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcbiAgICAgIHJvdGF0ZURlbHRhLnN1YlZlY3RvcnMocm90YXRlRW5kLCByb3RhdGVTdGFydCk7XG5cbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmRvbUVsZW1lbnQgPT09IGRvY3VtZW50ID8gdGhpcy5kb21FbGVtZW50LmJvZHkgOiB0aGlzLmRvbUVsZW1lbnQ7XG5cbiAgICAgIC8vIHJvdGF0aW5nIGFjcm9zcyB3aG9sZSBzY3JlZW4gZ29lcyAzNjAgZGVncmVlcyBhcm91bmRcbiAgICAgIHJvdGF0ZUxlZnQoMiAqIE1hdGguUEkgKiByb3RhdGVEZWx0YS54IC8gZWxlbWVudC5jbGllbnRXaWR0aCAqIHRoaXMucm90YXRlU3BlZWQpO1xuXG4gICAgICAvLyByb3RhdGluZyB1cCBhbmQgZG93biBhbG9uZyB3aG9sZSBzY3JlZW4gYXR0ZW1wdHMgdG8gZ28gMzYwLCBidXQgbGltaXRlZCB0byAxODBcbiAgICAgIHJvdGF0ZVVwKDIgKiBNYXRoLlBJICogcm90YXRlRGVsdGEueSAvIGVsZW1lbnQuY2xpZW50SGVpZ2h0ICogdGhpcy5yb3RhdGVTcGVlZCk7XG5cbiAgICAgIHJvdGF0ZVN0YXJ0LmNvcHkocm90YXRlRW5kKTtcblxuICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlTW91c2VNb3ZlRG9sbHkgPSBldmVudCA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlTW92ZURvbGx5JyApO1xuXG4gICAgICBkb2xseUVuZC5zZXQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG5cbiAgICAgIGRvbGx5RGVsdGEuc3ViVmVjdG9ycyhkb2xseUVuZCwgZG9sbHlTdGFydCk7XG5cbiAgICAgIGlmIChkb2xseURlbHRhLnkgPiAwKVxuICAgICAgICBkb2xseUluKGdldFpvb21TY2FsZSgpKTtcblxuICAgICAgZWxzZSBpZiAoZG9sbHlEZWx0YS55IDwgMClcbiAgICAgICAgZG9sbHlPdXQoZ2V0Wm9vbVNjYWxlKCkpO1xuXG4gICAgICBkb2xseVN0YXJ0LmNvcHkoZG9sbHlFbmQpO1xuXG4gICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZU1vdmVQYW4gPSBldmVudCA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlTW92ZVBhbicgKTtcblxuICAgICAgcGFuRW5kLnNldChldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcblxuICAgICAgcGFuRGVsdGEuc3ViVmVjdG9ycyhwYW5FbmQsIHBhblN0YXJ0KTtcblxuICAgICAgcGFuKHBhbkRlbHRhLngsIHBhbkRlbHRhLnkpO1xuXG4gICAgICBwYW5TdGFydC5jb3B5KHBhbkVuZCk7XG5cbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZU1vdXNlVXAgPSBldmVudCA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlVXAnICk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZU1vdXNlV2hlZWwgPSBldmVudCA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlV2hlZWwnICk7XG5cbiAgICAgIGlmIChldmVudC5kZWx0YVkgPCAwKVxuICAgICAgICBkb2xseU91dChnZXRab29tU2NhbGUoKSk7XG5cbiAgICAgIGVsc2UgaWYgKGV2ZW50LmRlbHRhWSA+IDApXG4gICAgICAgIGRvbGx5SW4oZ2V0Wm9vbVNjYWxlKCkpO1xuXG4gICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVLZXlEb3duID0gZXZlbnQgPT4ge1xuICAgICAgLy8gY29uc29sZS5sb2coICdoYW5kbGVLZXlEb3duJyApO1xuXG4gICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcbiAgICAgICAgY2FzZSB0aGlzLmtleXMuVVA6XG4gICAgICAgICAgcGFuKDAsIHRoaXMua2V5UGFuU3BlZWQpO1xuICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSB0aGlzLmtleXMuQk9UVE9NOlxuICAgICAgICAgIHBhbigwLCAtdGhpcy5rZXlQYW5TcGVlZCk7XG4gICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIHRoaXMua2V5cy5MRUZUOlxuICAgICAgICAgIHBhbih0aGlzLmtleVBhblNwZWVkLCAwKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgdGhpcy5rZXlzLlJJR0hUOlxuICAgICAgICAgIHBhbigtdGhpcy5rZXlQYW5TcGVlZCwgMCk7XG4gICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVUb3VjaFN0YXJ0Um90YXRlID0gZXZlbnQgPT4ge1xuICAgICAgLy8gY29uc29sZS5sb2coICdoYW5kbGVUb3VjaFN0YXJ0Um90YXRlJyApO1xuXG4gICAgICByb3RhdGVTdGFydC5zZXQoZXZlbnQudG91Y2hlc1swXS5wYWdlWCwgZXZlbnQudG91Y2hlc1swXS5wYWdlWSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZVRvdWNoU3RhcnREb2xseSA9IGV2ZW50ID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCAnaGFuZGxlVG91Y2hTdGFydERvbGx5JyApO1xuXG4gICAgICBjb25zdCBkeCA9IGV2ZW50LnRvdWNoZXNbMF0ucGFnZVggLSBldmVudC50b3VjaGVzWzFdLnBhZ2VYO1xuICAgICAgY29uc3QgZHkgPSBldmVudC50b3VjaGVzWzBdLnBhZ2VZIC0gZXZlbnQudG91Y2hlc1sxXS5wYWdlWTtcblxuICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuXG4gICAgICBkb2xseVN0YXJ0LnNldCgwLCBkaXN0YW5jZSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZVRvdWNoU3RhcnRQYW4gPSBldmVudCA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZVRvdWNoU3RhcnRQYW4nICk7XG5cbiAgICAgIHBhblN0YXJ0LnNldChldmVudC50b3VjaGVzWzBdLnBhZ2VYLCBldmVudC50b3VjaGVzWzBdLnBhZ2VZKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlVG91Y2hNb3ZlUm90YXRlID0gZXZlbnQgPT4ge1xuICAgICAgLy8gY29uc29sZS5sb2coICdoYW5kbGVUb3VjaE1vdmVSb3RhdGUnICk7XG5cbiAgICAgIHJvdGF0ZUVuZC5zZXQoZXZlbnQudG91Y2hlc1swXS5wYWdlWCwgZXZlbnQudG91Y2hlc1swXS5wYWdlWSk7XG4gICAgICByb3RhdGVEZWx0YS5zdWJWZWN0b3JzKHJvdGF0ZUVuZCwgcm90YXRlU3RhcnQpO1xuXG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5kb21FbGVtZW50ID09PSBkb2N1bWVudCA/IHRoaXMuZG9tRWxlbWVudC5ib2R5IDogdGhpcy5kb21FbGVtZW50O1xuXG4gICAgICAvLyByb3RhdGluZyBhY3Jvc3Mgd2hvbGUgc2NyZWVuIGdvZXMgMzYwIGRlZ3JlZXMgYXJvdW5kXG4gICAgICByb3RhdGVMZWZ0KDIgKiBNYXRoLlBJICogcm90YXRlRGVsdGEueCAvIGVsZW1lbnQuY2xpZW50V2lkdGggKiB0aGlzLnJvdGF0ZVNwZWVkKTtcblxuICAgICAgLy8gcm90YXRpbmcgdXAgYW5kIGRvd24gYWxvbmcgd2hvbGUgc2NyZWVuIGF0dGVtcHRzIHRvIGdvIDM2MCwgYnV0IGxpbWl0ZWQgdG8gMTgwXG4gICAgICByb3RhdGVVcCgyICogTWF0aC5QSSAqIHJvdGF0ZURlbHRhLnkgLyBlbGVtZW50LmNsaWVudEhlaWdodCAqIHRoaXMucm90YXRlU3BlZWQpO1xuXG4gICAgICByb3RhdGVTdGFydC5jb3B5KHJvdGF0ZUVuZCk7XG5cbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZVRvdWNoTW92ZURvbGx5ID0gZXZlbnQgPT4ge1xuICAgICAgLy8gY29uc29sZS5sb2coICdoYW5kbGVUb3VjaE1vdmVEb2xseScgKTtcblxuICAgICAgY29uc3QgZHggPSBldmVudC50b3VjaGVzWzBdLnBhZ2VYIC0gZXZlbnQudG91Y2hlc1sxXS5wYWdlWDtcbiAgICAgIGNvbnN0IGR5ID0gZXZlbnQudG91Y2hlc1swXS5wYWdlWSAtIGV2ZW50LnRvdWNoZXNbMV0ucGFnZVk7XG5cbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTtcblxuICAgICAgZG9sbHlFbmQuc2V0KDAsIGRpc3RhbmNlKTtcblxuICAgICAgZG9sbHlEZWx0YS5zdWJWZWN0b3JzKGRvbGx5RW5kLCBkb2xseVN0YXJ0KTtcblxuICAgICAgaWYgKGRvbGx5RGVsdGEueSA+IDApXG4gICAgICAgIGRvbGx5T3V0KGdldFpvb21TY2FsZSgpKTtcblxuICAgICAgZWxzZSBpZiAoZG9sbHlEZWx0YS55IDwgMClcbiAgICAgICAgZG9sbHlJbihnZXRab29tU2NhbGUoKSk7XG5cbiAgICAgIGRvbGx5U3RhcnQuY29weShkb2xseUVuZCk7XG5cbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZVRvdWNoTW92ZVBhbiA9IGV2ZW50ID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCAnaGFuZGxlVG91Y2hNb3ZlUGFuJyApO1xuXG4gICAgICBwYW5FbmQuc2V0KGV2ZW50LnRvdWNoZXNbMF0ucGFnZVgsIGV2ZW50LnRvdWNoZXNbMF0ucGFnZVkpO1xuXG4gICAgICBwYW5EZWx0YS5zdWJWZWN0b3JzKHBhbkVuZCwgcGFuU3RhcnQpO1xuXG4gICAgICBwYW4ocGFuRGVsdGEueCwgcGFuRGVsdGEueSk7XG5cbiAgICAgIHBhblN0YXJ0LmNvcHkocGFuRW5kKTtcblxuICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlVG91Y2hFbmQgPSAoKSA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZVRvdWNoRW5kJyApO1xuICAgIH07XG5cbiAgICAvL1xuICAgIC8vIGV2ZW50IGhhbmRsZXJzIC0gRlNNOiBsaXN0ZW4gZm9yIGV2ZW50cyBhbmQgcmVzZXQgc3RhdGVcbiAgICAvL1xuXG4gICAgY29uc3Qgb25Nb3VzZURvd24gPSBldmVudCA9PiB7XG4gICAgICBpZiAodGhpcy5lbmFibGVkID09PSBmYWxzZSkgcmV0dXJuO1xuXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBpZiAoZXZlbnQuYnV0dG9uID09PSB0aGlzLm1vdXNlQnV0dG9ucy5PUkJJVCkge1xuICAgICAgICBpZiAodGhpcy5lbmFibGVSb3RhdGUgPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICAgICAgaGFuZGxlTW91c2VEb3duUm90YXRlKGV2ZW50KTtcblxuICAgICAgICBzdGF0ZSA9IFNUQVRFLlJPVEFURTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQuYnV0dG9uID09PSB0aGlzLm1vdXNlQnV0dG9ucy5aT09NKSB7XG4gICAgICAgIGlmICh0aGlzLmVuYWJsZVpvb20gPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICAgICAgaGFuZGxlTW91c2VEb3duRG9sbHkoZXZlbnQpO1xuXG4gICAgICAgIHN0YXRlID0gU1RBVEUuRE9MTFk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gdGhpcy5tb3VzZUJ1dHRvbnMuUEFOKSB7XG4gICAgICAgIGlmICh0aGlzLmVuYWJsZVBhbiA9PT0gZmFsc2UpIHJldHVybjtcblxuICAgICAgICBoYW5kbGVNb3VzZURvd25QYW4oZXZlbnQpO1xuXG4gICAgICAgIHN0YXRlID0gU1RBVEUuUEFOO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUgIT09IFNUQVRFLk5PTkUpIHtcbiAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIub24oJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLm9uKCdtb3VzZXVwJywgb25Nb3VzZVVwLCBmYWxzZSk7XG5cbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KHN0YXJ0RXZlbnQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvbk1vdXNlTW92ZSA9IGV2ZW50ID0+IHtcbiAgICAgIGlmICh0aGlzLmVuYWJsZWQgPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gU1RBVEUuUk9UQVRFKSB7XG4gICAgICAgIGlmICh0aGlzLmVuYWJsZVJvdGF0ZSA9PT0gZmFsc2UpIHJldHVybjtcblxuICAgICAgICBoYW5kbGVNb3VzZU1vdmVSb3RhdGUoZXZlbnQpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gU1RBVEUuRE9MTFkpIHtcbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlWm9vbSA9PT0gZmFsc2UpIHJldHVybjtcblxuICAgICAgICBoYW5kbGVNb3VzZU1vdmVEb2xseShldmVudCk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBTVEFURS5QQU4pIHtcbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlUGFuID09PSBmYWxzZSkgcmV0dXJuO1xuXG4gICAgICAgIGhhbmRsZU1vdXNlTW92ZVBhbihldmVudCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uTW91c2VVcCA9IGV2ZW50ID0+IHtcbiAgICAgIGlmICh0aGlzLmVuYWJsZWQgPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICAgIGhhbmRsZU1vdXNlVXAoZXZlbnQpO1xuXG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSwgZmFsc2UpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCwgZmFsc2UpO1xuXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoZW5kRXZlbnQpO1xuXG4gICAgICBzdGF0ZSA9IFNUQVRFLk5PTkU7XG4gICAgfTtcblxuICAgIGNvbnN0IG9uTW91c2VXaGVlbCA9IGV2ZW50ID0+IHtcbiAgICAgIGlmICh0aGlzLmVuYWJsZWQgPT09IGZhbHNlIHx8IHRoaXMuZW5hYmxlWm9vbSA9PT0gZmFsc2UgfHwgKHN0YXRlICE9PSBTVEFURS5OT05FICYmIHN0YXRlICE9PSBTVEFURS5ST1RBVEUpKSByZXR1cm47XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgaGFuZGxlTW91c2VXaGVlbChldmVudCk7XG5cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChzdGFydEV2ZW50KTsgLy8gbm90IHN1cmUgd2h5IHRoZXNlIGFyZSBoZXJlLi4uXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoZW5kRXZlbnQpO1xuICAgIH07XG5cbiAgICBjb25zdCBvbktleURvd24gPSBldmVudCA9PiB7XG4gICAgICBpZiAodGhpcy5lbmFibGVkID09PSBmYWxzZSB8fCB0aGlzLmVuYWJsZUtleXMgPT09IGZhbHNlIHx8IHRoaXMuZW5hYmxlUGFuID09PSBmYWxzZSkgcmV0dXJuO1xuXG4gICAgICBoYW5kbGVLZXlEb3duKGV2ZW50KTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb25Ub3VjaFN0YXJ0ID0gZXZlbnQgPT4ge1xuICAgICAgaWYgKHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UpIHJldHVybjtcblxuICAgICAgc3dpdGNoIChldmVudC50b3VjaGVzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDE6IC8vIG9uZS1maW5nZXJlZCB0b3VjaDogcm90YXRlXG5cbiAgICAgICAgICBpZiAodGhpcy5lbmFibGVSb3RhdGUgPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICAgICAgICBoYW5kbGVUb3VjaFN0YXJ0Um90YXRlKGV2ZW50KTtcblxuICAgICAgICAgIHN0YXRlID0gU1RBVEUuVE9VQ0hfUk9UQVRFO1xuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAyOiAvLyB0d28tZmluZ2VyZWQgdG91Y2g6IGRvbGx5XG5cbiAgICAgICAgICBpZiAodGhpcy5lbmFibGVab29tID09PSBmYWxzZSkgcmV0dXJuO1xuXG4gICAgICAgICAgaGFuZGxlVG91Y2hTdGFydERvbGx5KGV2ZW50KTtcblxuICAgICAgICAgIHN0YXRlID0gU1RBVEUuVE9VQ0hfRE9MTFk7XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDM6IC8vIHRocmVlLWZpbmdlcmVkIHRvdWNoOiBwYW5cblxuICAgICAgICAgIGlmICh0aGlzLmVuYWJsZVBhbiA9PT0gZmFsc2UpIHJldHVybjtcblxuICAgICAgICAgIGhhbmRsZVRvdWNoU3RhcnRQYW4oZXZlbnQpO1xuXG4gICAgICAgICAgc3RhdGUgPSBTVEFURS5UT1VDSF9QQU47XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuXG4gICAgICAgICAgc3RhdGUgPSBTVEFURS5OT05FO1xuXG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSAhPT0gU1RBVEUuTk9ORSlcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KHN0YXJ0RXZlbnQpO1xuICAgIH07XG5cbiAgICBjb25zdCBvblRvdWNoTW92ZSA9IGV2ZW50ID0+IHtcbiAgICAgIGlmICh0aGlzLmVuYWJsZWQgPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgc3dpdGNoIChldmVudC50b3VjaGVzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDE6IC8vIG9uZS1maW5nZXJlZCB0b3VjaDogcm90YXRlXG5cbiAgICAgICAgICBpZiAodGhpcy5lbmFibGVSb3RhdGUgPT09IGZhbHNlKSByZXR1cm47XG4gICAgICAgICAgaWYgKHN0YXRlICE9PSBTVEFURS5UT1VDSF9ST1RBVEUpIHJldHVybjsgLy8gaXMgdGhpcyBuZWVkZWQ/Li4uXG5cbiAgICAgICAgICBoYW5kbGVUb3VjaE1vdmVSb3RhdGUoZXZlbnQpO1xuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAyOiAvLyB0d28tZmluZ2VyZWQgdG91Y2g6IGRvbGx5XG5cbiAgICAgICAgICBpZiAodGhpcy5lbmFibGVab29tID09PSBmYWxzZSkgcmV0dXJuO1xuICAgICAgICAgIGlmIChzdGF0ZSAhPT0gU1RBVEUuVE9VQ0hfRE9MTFkpIHJldHVybjsgLy8gaXMgdGhpcyBuZWVkZWQ/Li4uXG5cbiAgICAgICAgICBoYW5kbGVUb3VjaE1vdmVEb2xseShldmVudCk7XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDM6IC8vIHRocmVlLWZpbmdlcmVkIHRvdWNoOiBwYW5cblxuICAgICAgICAgIGlmICh0aGlzLmVuYWJsZVBhbiA9PT0gZmFsc2UpIHJldHVybjtcbiAgICAgICAgICBpZiAoc3RhdGUgIT09IFNUQVRFLlRPVUNIX1BBTikgcmV0dXJuOyAvLyBpcyB0aGlzIG5lZWRlZD8uLi5cblxuICAgICAgICAgIGhhbmRsZVRvdWNoTW92ZVBhbihldmVudCk7XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuXG4gICAgICAgICAgc3RhdGUgPSBTVEFURS5OT05FO1xuXG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uVG91Y2hFbmQgPSBldmVudCA9PiB7XG4gICAgICBpZiAodGhpcy5lbmFibGVkID09PSBmYWxzZSkgcmV0dXJuO1xuXG4gICAgICBoYW5kbGVUb3VjaEVuZChldmVudCk7XG5cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChlbmRFdmVudCk7XG5cbiAgICAgIHN0YXRlID0gU1RBVEUuTk9ORTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb25Db250ZXh0TWVudSA9IGV2ZW50ID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfTtcblxuICAgIC8vXG5cbiAgICB0aGlzLmV2ZW50SGFuZGxlci5vbignY29udGV4dG1lbnUnLCBvbkNvbnRleHRNZW51LCBmYWxzZSk7XG5cbiAgICB0aGlzLmV2ZW50SGFuZGxlci5vbignbW91c2Vkb3duJywgb25Nb3VzZURvd24sIGZhbHNlKTtcbiAgICB0aGlzLmV2ZW50SGFuZGxlci5vbignd2hlZWwnLCBvbk1vdXNlV2hlZWwsIGZhbHNlKTtcblxuICAgIHRoaXMuZXZlbnRIYW5kbGVyLm9uKCd0b3VjaHN0YXJ0Jywgb25Ub3VjaFN0YXJ0LCBmYWxzZSk7XG4gICAgdGhpcy5ldmVudEhhbmRsZXIub24oJ3RvdWNoZW5kJywgb25Ub3VjaEVuZCwgZmFsc2UpO1xuICAgIHRoaXMuZXZlbnRIYW5kbGVyLm9uKCd0b3VjaG1vdmUnLCBvblRvdWNoTW92ZSwgZmFsc2UpO1xuXG4gICAgdGhpcy5ldmVudEhhbmRsZXIub24oJ2tleWRvd24nLCBvbktleURvd24sIGZhbHNlKTtcblxuICAgIC8vIGZvcmNlIGFuIHVwZGF0ZSBhdCBzdGFydFxuXG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfVxuXG4gIGdldCBjZW50ZXIoKSB7XG4gICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAuY2VudGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnRhcmdldCcpO1xuICAgIHJldHVybiB0aGlzLnRhcmdldDtcbiAgfVxuXG4gIGdldCBub1pvb20oKSB7XG4gICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAubm9ab29tIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuZW5hYmxlWm9vbSBpbnN0ZWFkLicpO1xuICAgIHJldHVybiAhdGhpcy5lbmFibGVab29tO1xuICB9XG5cbiAgc2V0IG5vWm9vbSh2YWx1ZSkge1xuICAgIGNvbnNvbGUud2FybignT3JiaXRDb250cm9sczogLm5vWm9vbSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZVpvb20gaW5zdGVhZC4nKTtcbiAgICB0aGlzLmVuYWJsZVpvb20gPSAhdmFsdWU7XG4gIH1cblxuICBnZXQgbm9Sb3RhdGUoKSB7XG4gICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAubm9Sb3RhdGUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5lbmFibGVSb3RhdGUgaW5zdGVhZC4nKTtcbiAgICByZXR1cm4gIXRoaXMuZW5hYmxlUm90YXRlO1xuICB9XG5cbiAgc2V0IG5vUm90YXRlKHZhbHVlKSB7XG4gICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAubm9Sb3RhdGUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5lbmFibGVSb3RhdGUgaW5zdGVhZC4nKTtcbiAgICB0aGlzLmVuYWJsZVJvdGF0ZSA9ICF2YWx1ZTtcbiAgfVxuXG4gIGdldCBub1BhbigpIHtcbiAgICBjb25zb2xlLndhcm4oJ09yYml0Q29udHJvbHM6IC5ub1BhbiBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZVBhbiBpbnN0ZWFkLicpO1xuICAgIHJldHVybiAhdGhpcy5lbmFibGVQYW47XG4gIH1cblxuICBzZXQgbm9QYW4odmFsdWUpIHtcbiAgICBjb25zb2xlLndhcm4oJ09yYml0Q29udHJvbHM6IC5ub1BhbiBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZVBhbiBpbnN0ZWFkLicpO1xuICAgIHRoaXMuZW5hYmxlUGFuID0gIXZhbHVlO1xuICB9XG5cbiAgZ2V0IG5vS2V5cygpIHtcbiAgICBjb25zb2xlLndhcm4oJ09yYml0Q29udHJvbHM6IC5ub0tleXMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5lbmFibGVLZXlzIGluc3RlYWQuJyk7XG4gICAgcmV0dXJuICF0aGlzLmVuYWJsZUtleXM7XG4gIH1cblxuICBzZXQgbm9LZXlzKHZhbHVlKSB7XG4gICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAubm9LZXlzIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuZW5hYmxlS2V5cyBpbnN0ZWFkLicpO1xuICAgIHRoaXMuZW5hYmxlS2V5cyA9ICF2YWx1ZTtcbiAgfVxuXG4gIGdldCBzdGF0aWNNb3ZpbmcoKSB7XG4gICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAuc3RhdGljTW92aW5nIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuZW5hYmxlRGFtcGluZyBpbnN0ZWFkLicpO1xuICAgIHJldHVybiAhdGhpcy5lbmFibGVEYW1waW5nO1xuICB9XG5cbiAgc2V0IHN0YXRpY01vdmluZyh2YWx1ZSkge1xuICAgIGNvbnNvbGUud2FybignT3JiaXRDb250cm9sczogLnN0YXRpY01vdmluZyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZURhbXBpbmcgaW5zdGVhZC4nKTtcbiAgICB0aGlzLmVuYWJsZURhbXBpbmcgPSAhdmFsdWU7XG4gIH1cblxuICBnZXQgZHluYW1pY0RhbXBpbmdGYWN0b3IoKSB7XG4gICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAuZHluYW1pY0RhbXBpbmdGYWN0b3IgaGFzIGJlZW4gcmVuYW1lZC4gVXNlIC5kYW1waW5nRmFjdG9yIGluc3RlYWQuJyk7XG4gICAgcmV0dXJuIHRoaXMuZGFtcGluZ0ZhY3RvcjtcbiAgfVxuXG4gIHNldCBkeW5hbWljRGFtcGluZ0ZhY3Rvcih2YWx1ZSkge1xuICAgIGNvbnNvbGUud2FybignT3JiaXRDb250cm9sczogLmR5bmFtaWNEYW1waW5nRmFjdG9yIGhhcyBiZWVuIHJlbmFtZWQuIFVzZSAuZGFtcGluZ0ZhY3RvciBpbnN0ZWFkLicpO1xuICAgIHRoaXMuZGFtcGluZ0ZhY3RvciA9IHZhbHVlO1xuICB9XG59XG4iLCJpbXBvcnQge1ZlY3RvcjN9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7Q29udHJvbHNNb2R1bGV9IGZyb20gJy4uL0NvbnRyb2xzTW9kdWxlJztcblxuaW1wb3J0IHtUaHJlZU9yYml0Q29udHJvbHN9IGZyb20gJy4vbGliL1RocmVlT3JiaXRDb250cm9scyc7XG5cbi8qKlxuICogQGNsYXNzIE9yYml0Q29udHJvbHNNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtcy5vYmplY3Q9Y2FtZXJhXSBPYmplY3QgdG8gd2hpY2ggY29udHJvbHMgYXJlIGFwcGxpZWQuXG4gKiBAcGFyYW0ge1RIUkVFLlZlY3RvcjN9IFtwYXJhbXMudGFyZ2V0PW5ldyBWZWN0b3IzKCldIENvbnRyb2xzIGNlbnRlciB2ZWN0b3IuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtwYXJhbXMuZm9sbG93PWZhbHNlXSBGb2xsb3cgdGhlIHRhcmdldFxuICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcFxuICogQGV4YW1wbGUgPGNhcHRpb24+IENyZWF0aW5nIGEgcmVuZGVyaW5nIG1vZHVsZSBhbmQgcGFzc2luZyBpdCB0byBBcHAncyBtb2R1bGVzPC9jYXB0aW9uPlxuICogbmV3IEFwcChbXG4gKiAgIG5ldyBFbGVtZW50TW9kdWxlKCksXG4gKiAgIG5ldyBTY2VuZU1vZHVsZSgpLFxuICogICBuZXcgRGVmaW5lTW9kdWxlKCdjYW1lcmEnLCBuZXcgV0hTLlBlcnNwZWN0aXZlQ2FtZXJhKHtcbiAqICAgICBwb3NpdGlvbjogbmV3IFRIUkVFLlZlY3RvcjMoMCwgNiwgMTgpLFxuICogICAgIGZhcjogMTAwMDBcbiAqICAgfSkpLFxuICogICBuZXcgUmVuZGVyaW5nTW9kdWxlKCksXG4gKiAgIG5ldyBPcmJpdENvbnRyb2xzTW9kdWxlKClcbiAqIF0pO1xuICovXG5leHBvcnQgY2xhc3MgT3JiaXRDb250cm9sc01vZHVsZSBleHRlbmRzIENvbnRyb2xzTW9kdWxlIHtcbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMpO1xuXG4gICAgdGhpcy5wYXJhbXMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIGZvbGxvdzogZmFsc2UsXG4gICAgICBvYmplY3Q6IG51bGwsXG4gICAgICB0YXJnZXQ6IG5ldyBWZWN0b3IzKClcbiAgICB9LCBwYXJhbXMpO1xuICB9XG5cbiAgbWFuYWdlcihtYW5hZ2VyKSB7XG4gICAgc3VwZXIubWFuYWdlcihtYW5hZ2VyKTtcblxuICAgIGNvbnN0IHtvYmplY3Q6IG9iaiwgZm9sbG93LCB0YXJnZXR9ID0gdGhpcy5wYXJhbXM7XG4gICAgY29uc3Qgb2JqZWN0ID0gb2JqID8gb2JqLm5hdGl2ZSA6IG1hbmFnZXIuZ2V0KCdjYW1lcmEnKS5uYXRpdmU7XG5cbiAgICBjb25zdCBjb250cm9scyA9IG5ldyBUaHJlZU9yYml0Q29udHJvbHMoXG4gICAgICBvYmplY3QsXG4gICAgICBtYW5hZ2VyLmdldCgnZWxlbWVudCcpLFxuICAgICAgbWFuYWdlci5oYW5kbGVyXG4gICAgKTtcblxuICAgIGNvbnN0IHVwZGF0ZVByb2Nlc3NvciA9IGZvbGxvdyA/IGMgPT4ge1xuICAgICAgY29udHJvbHMudXBkYXRlKGMuZ2V0RGVsdGEoKSk7XG4gICAgICBjb250cm9scy50YXJnZXQuY29weSh0YXJnZXQpO1xuICAgIH0gOiBjID0+IHtcbiAgICAgIGNvbnRyb2xzLnVwZGF0ZShjLmdldERlbHRhKCkpO1xuICAgIH07XG5cbiAgICB0aGlzLnNldENvbnRyb2xzKGNvbnRyb2xzKTtcbiAgICB0aGlzLnNldFVwZGF0ZSh1cGRhdGVQcm9jZXNzb3IpO1xuXG4gICAgbWFuYWdlci51cGRhdGUoe1xuICAgICAgY2FtZXJhOiBjYW1lcmEgPT4ge1xuICAgICAgICBpZiAob2JqKSByZXR1cm47XG4gICAgICAgIGNvbnRyb2xzLm9iamVjdCA9IGNhbWVyYS5uYXRpdmU7XG4gICAgICB9LFxuICAgICAgZWxlbWVudDogZWxlbWVudCA9PiB7XG4gICAgICAgIGNvbnRyb2xzLmRvbUVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29udHJvbHMudGFyZ2V0LmNvcHkodGFyZ2V0KTtcbiAgfVxufVxuIiwiLyoqIEBtb2R1bGUgbW9kdWxlcy9hcHAvY29udHJvbHMgKi9cbmV4cG9ydCAqIGZyb20gJy4vT3JiaXRDb250cm9sc01vZHVsZSc7XG4iLCIvKiogQG1vZHVsZSBtb2R1bGVzL2FwcCAqL1xuZXhwb3J0ICogZnJvbSAnLi9FbGVtZW50TW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vUmVuZGVyaW5nTW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vU2NlbmVNb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9SZXNpemVNb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9Qb3N0UHJvY2Vzc29yTW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vVmlydHVhbE1vdXNlTW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vRXZlbnRzUGF0Y2hNb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9Db250cm9sc01vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL0ZvZ01vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL1N0YXRlTW9kdWxlJztcblxuLy8gY29udHJvbHNcbmV4cG9ydCAqIGZyb20gJy4vY29udHJvbHMvaW5kZXgnO1xuIiwiLyoqXG4gKiBAY2xhc3MgRHluYW1pY0dlb21ldHJ5TW9kdWxlXG4gKiBAY2F0ZWdvcnkgbW9kdWxlcy9tZXNoXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtcz17YXR0cmlidXRlczogZmFsc2V9XSAtIHBhcmFtc1xuICogQHBhcmFtIHtCb29sZWFufSBbcGF0Y2hFdmVudHM9dHJ1ZV1cbiAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9tZXNoXG4gKi9cbmV4cG9ydCBjbGFzcyBEeW5hbWljR2VvbWV0cnlNb2R1bGUge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHRoaXMucGFyYW1zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBhdHRyaWJ1dGVzOiBmYWxzZVxuICAgIH0sIHBhcmFtcyk7XG4gIH1cblxuICBpbnRlZ3JhdGUoc2VsZikge1xuICAgIGNvbnN0IHBhcmFtcyA9IHNlbGYucGFyYW1zO1xuXG4gICAgdGhpcy5nXyA9IGZ1bmN0aW9uIChwYXJhbXMgPSB7fSkge1xuICAgICAgaWYgKHRoaXMuYnVpbGRHZW9tZXRyeSkge1xuICAgICAgICB0aGlzLm5hdGl2ZS5nZW9tZXRyeSA9IHRoaXMuYnVpbGRHZW9tZXRyeShcbiAgICAgICAgICB0aGlzLnVwZGF0ZVBhcmFtcyh7Z2VvbWV0cnk6IHBhcmFtc30pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChwYXJhbXMuYXR0cmlidXRlcykge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5wYXJhbXMuZ2VvbWV0cnkpIHtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBgZ18ke2tleX1gLCB7XG4gICAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLm5hdGl2ZS5nZW9tZXRyeS5wYXJhbWV0ZXJzW2tleV07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICAgIHRoaXMubmF0aXZlLmdlb21ldHJ5ID0gdGhpcy5idWlsZEdlb21ldHJ5KHRoaXMudXBkYXRlUGFyYW1zKHtnZW9tZXRyeToge1trZXldOiB2YWx1ZX19KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBSZXBlYXRXcmFwcGluZyxcbiAgVVZNYXBwaW5nLFxuICBOZWFyZXN0RmlsdGVyLFxuICBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXIsXG4gIFRleHR1cmVMb2FkZXIsXG4gIFZlY3RvcjJcbn0gZnJvbSAndGhyZWUnO1xuXG5jb25zdCBsb2FkZXIgPSBuZXcgVGV4dHVyZUxvYWRlcigpO1xuXG4vKipcbiAqIEBjbGFzcyBUZXh0dXJlTW9kdWxlXG4gKiBAY2F0ZWdvcnkgbW9kdWxlcy9tZXNoXG4gKiBAZGVzY3JpcHRpb24gQSBUZXh0dXJlTW9kdWxlIGNhbiBiZSBhcHBsaWVkIHRvIGFueSBNZXNoIG9yIE1vZGVsLlxuICogQHBhcmFtIHtBcnJheX0gW3RleHR1cmVzXSAtIGFycmF5IG9mIHRleHR1cmUgb2JqZWN0c1xuICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL21lc2hcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGFuIGluc3RhbmNlLiB1cmwgdGFrZXMgYSBwYXRoLCBvciBhIGRhdGEgb2JqZWN0LjwvY2FwdGlvbj5cbiAqIHZhciB3b29kVGV4dHVyZSA9IG5ldyBUZXh0dXJlTW9kdWxlKHtcbiAqICAgdXJsOiBgJHtwcm9jZXNzLmFzc2V0c1BhdGh9L3RleHR1cmVzL3dvb2QuanBnYFxuICogfSk7XG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5Nb3JlIGNvbXByZWhlbnNpdmUgZXhhbXBsZSwgd29vZCB0ZXh0dXJlIGFwcGxpZWQgdG8gYSBCb3guPC9jYXB0aW9uPlxuICogbmV3IEJveCh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgd2lkdGg6IDIsXG4gKiAgICAgaGVpZ2h0OiAyLFxuICogICAgIGRlcHRoOiAyXG4gKiAgIH0sXG4gKiAgIG1vZHVsZXM6IFtcbiAqICAgICBuZXcgVGV4dHVyZU1vZHVsZSh7XG4gKiAgICAgICB1cmw6IGBwYXRoL3RvL3RleHR1cmUuanBnYCxcbiAqICAgICAgIHJlcGVhdDogbmV3IFRIUkVFLlZlY3RvcjIoMSwgMSkgLy8gb3B0aW9uYWxcbiAqICAgICB9KVxuICogICBdLFxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSksXG4gKiAgIHBvc2l0aW9uOiBbNTAsIDYwLCA3MF1cbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cbmV4cG9ydCBjbGFzcyBUZXh0dXJlTW9kdWxlIHtcbiAgc3RhdGljIGxvYWQodXJsKSB7XG4gICAgcmV0dXJuIG5ldyBUZXh0dXJlTW9kdWxlKHt1cmx9KS50ZXh0dXJlc1swXVsxXTtcbiAgfVxuXG4gIHRleHR1cmVzID0gW107XG5cbiAgY29uc3RydWN0b3IoLi4udGV4dHVyZXMpIHtcbiAgICB0ZXh0dXJlcy5mb3JFYWNoKCh7XG4gICAgICB1cmwsXG4gICAgICB0eXBlID0gJ21hcCcsXG4gICAgICBvZmZzZXQgPSBuZXcgVmVjdG9yMigwLCAwKSxcbiAgICAgIHJlcGVhdCA9IG5ldyBWZWN0b3IyKDEsIDEpLFxuICAgICAgd3JhcCA9IFJlcGVhdFdyYXBwaW5nLFxuICAgICAgbWFwcGluZyA9IFVWTWFwcGluZyxcbiAgICAgIGZpeCA9IHRleCA9PiB0ZXhcbiAgICB9KSA9PiB7XG4gICAgICBjb25zdCB0ZXh0dXJlID0gbG9hZGVyLmxvYWQodXJsKTtcblxuICAgICAgaWYgKHdyYXAubGVuZ3RoID4gMCkge1xuICAgICAgICB0ZXh0dXJlLndyYXBTID0gd3JhcFswXTtcbiAgICAgICAgdGV4dHVyZS53cmFwVCA9IHdyYXBbMV07XG4gICAgICB9IGVsc2VcbiAgICAgICAgdGV4dHVyZS53cmFwUyA9IHRleHR1cmUud3JhcFQgPSB3cmFwO1xuXG4gICAgICB0ZXh0dXJlLm1hcHBpbmcgPSBtYXBwaW5nO1xuXG4gICAgICB0ZXh0dXJlLm9mZnNldC5jb3B5KG9mZnNldCk7XG4gICAgICB0ZXh0dXJlLnJlcGVhdC5jb3B5KHJlcGVhdCk7XG5cbiAgICAgIHRleHR1cmUubWFnRmlsdGVyID0gTmVhcmVzdEZpbHRlcjtcbiAgICAgIHRleHR1cmUubWluRmlsdGVyID0gTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyO1xuXG4gICAgICB0aGlzLnRleHR1cmVzLnB1c2goW3R5cGUsIGZpeCh0ZXh0dXJlKV0pO1xuICAgIH0pO1xuICB9XG5cbiAgYnJpZGdlID0ge1xuICAgIG1hdGVyaWFsKG1hdGVyaWFsLCBzZWxmKSB7XG4gICAgICBzZWxmLnRleHR1cmVzLmZvckVhY2godGV4dHVyZSA9PiB7XG4gICAgICAgIG1hdGVyaWFsW3RleHR1cmVbMF1dID0gdGV4dHVyZVsxXTtcbiAgICAgIH0pO1xuXG4gICAgICBtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgICByZXR1cm4gbWF0ZXJpYWw7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBBbmltYXRpb25NaXhlcixcbiAgQW5pbWF0aW9uQ2xpcFxufSBmcm9tICd0aHJlZSc7XG5cbmltcG9ydCB7TG9vcH0gZnJvbSAnLi4vLi4vY29yZS9Mb29wJztcblxuLyoqXG4gKiBAY2xhc3MgQW5pbWF0aW9uTW9kdWxlXG4gKiBAY2F0ZWdvcnkgbW9kdWxlcy9tZXNoXG4gKiBAZGVzY3JpcHRpb24gQ29udmVuaWVuY2UgbW9kdWxlIHRoYXQgd3JhcHMgdGhlIDxhIGhyZWY9J2h0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy8jbWFudWFsL2ludHJvZHVjdGlvbi9BbmltYXRpb24tc3lzdGVtJz50aHJlZS5qcyBhbmltYXRpb24gc3lzdGVtPC9hPlxuICogQHBhcmFtIHtBcHB9IGFwcCAtIHRoZSBhcHBcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW2lzRGVmZXJyZWQ9ZmFsc2VdIC0gc2V0IHRvIHRydWUgaWYgYW5pbWF0aW9uIHNob3VsZCBub3Qgc3RhcnQgYXV0b21hdGljYWxseVxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXM9e3NwZWVkOiAxfV0gLSB0aGUgcGFyYW1zXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvbWVzaFxuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRlIGFuaW1hdGlvbiBtb2R1bGUgYW5kIHBsYXkgYSBnaXZlbiBjbGlwIG9mIGFuIGltcG9ydGVkIG1vZGVsPC9jYXB0aW9uPlxuICogY29uc3QgYW5pbWF0aW9uTW9kdWxlID0gbmV3IEFuaW1hdGlvbk1vZHVsZShhcHAsIGZhbHNlLCB7XG4gKiAgIHNwZWVkOiAxLjIgLy8gc3BlZWQgdXAgYW5pbWF0aW9uIGJ5IDIwJVxuICogfSk7XG4gKlxuICogbmV3IEltcG9ydGVyKHtcbiAqICAgcGFyc2VyKGdlb21ldHJ5LCBtYXRlcmlhbHMpIHtcbiAqICAgICAvLyBPdmVycmlkZSBwYXJzZSB0byBnZW5lcmF0ZSBhIHNraW5uZWRNZXNoLCBuZWVkZWQgZm9yIHNraW5uZWQgbW9kZWxzXG4gKiAgICAgcmV0dXJuIG5ldyBUSFJFRS5Ta2lubmVkTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWxzKTtcbiAqICAgfSxcbiAqXG4gKiAgIHVybDogYHBhdGgvdG8vbW9kZWwuanNvbmAsXG4gKiAgIHVzZUN1c3RvbU1hdGVyaWFsOiB0cnVlLFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7XG4gKiAgICAgc2tpbm5pbmc6IHRydWVcbiAqICAgfSksXG4gKlxuICogICBtb2R1bGVzOiBbYW5pbWF0aW9uTW9kdWxlXVxuICogfSkuYWRkVG8oYXBwKS50aGVuKCgpID0+IHtcbiAqICAgLy8gYWRkaW5nIG1vZGVsIHRvIGFwcCByZXR1cm5zIGEgcHJvbWlzZSwgc28gcGlwZSB0aGUgZnVuY3Rpb24gdG8ga2ljayBvZmYgdGhlIGFuaW1hdGlvbiBjbGlwXG4gKiAgIGFuaW1hdGlvbk1vZHVsZS5wbGF5KCdjbGlwTmFtZScpO1xuICogfSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBBbmltYXRpb25Nb2R1bGUge1xuICBjb25zdHJ1Y3RvcihhcHAsIGlzRGVmZXJyZWQsIHBhcmFtcyA9IHt9KSB7XG4gICAgdGhpcy5wYXJhbXMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIHNwZWVkOiAxXG4gICAgfSwgcGFyYW1zKTtcblxuICAgIHRoaXMuYXBwID0gYXBwO1xuICAgIHRoaXMuaXNEZWZlcnJlZCA9IGlzRGVmZXJyZWQ7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBwbGF5XG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gUGxheXMgdGhlIGdpdmVuIGNsaXAgbmFtZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gY2xpcE5hbWUgLSB0aGUgY2xpcCB0byBwbGF5XG4gICAqIEByZXR1cm4ge1RIUkVFLkFuaW1hdGlvbkFjdGlvbn0gUGxheWluZyBhY3Rpb24gXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9tZXNoLkFuaW1hdGlvbk1vZHVsZVxuICAgKi9cbiAgcGxheShjbGlwTmFtZSkge1xuICAgIGNvbnN0IGNsaXAgPSBBbmltYXRpb25DbGlwLmZpbmRCeU5hbWUodGhpcy5jbGlwcywgY2xpcE5hbWUpO1xuICAgIHJldHVybiB0aGlzLm1peGVyLmNsaXBBY3Rpb24oY2xpcCkucGxheSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgdXBkYXRlXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlIHRoZSBtaXhlciAoYmVpbmcgY2FsbGVkIG9uIGZyYW1lIGFuaW1hdGlvbiBsb29wKVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvbWVzaC5BbmltYXRpb25Nb2R1bGVcbiAgICovXG4gIHVwZGF0ZShjbG9jaykge1xuICAgIGlmICh0aGlzLm1peGVyKSB0aGlzLm1peGVyLnVwZGF0ZShjbG9jay5nZXREZWx0YSgpICogdGhpcy5wYXJhbXMuc3BlZWQpO1xuICB9XG5cbiAgaW50ZWdyYXRlKHNlbGYpIHtcbiAgICBzZWxmLmxvb3AgPSBuZXcgTG9vcCgoY2xvY2spID0+IHNlbGYudXBkYXRlKGNsb2NrKSk7XG5cbiAgICBpZiAoIXNlbGYuaXNEZWZlcnJlZCkgc2VsZi5sb29wLnN0YXJ0KHNlbGYuYXBwKTtcbiAgfVxuXG4gIG1hbmFnZXIobWFuYWdlcikge1xuICAgIG1hbmFnZXIuZGVmaW5lKCdhbmltYXRpb24nKTtcbiAgfVxuXG4gIGJyaWRnZSA9IHtcbiAgICBtZXNoKG1lc2gsIHNlbGYpIHtcbiAgICAgIG1lc2guZ2VvbWV0cnkuc2tlbGV0b24gPSBtZXNoLnNrZWxldG9uO1xuXG4gICAgICBzZWxmLm1peGVyID0gbmV3IEFuaW1hdGlvbk1peGVyKG1lc2guZ2VvbWV0cnkpO1xuICAgICAgc2VsZi5jbGlwcyA9IG1lc2guZ2VvbWV0cnkuYW5pbWF0aW9ucztcblxuICAgICAgcmV0dXJuIG1lc2g7XG4gICAgfVxuICB9XG59XG4iLCIvKiogQG1vZHVsZSBtb2R1bGVzL21lc2ggKi9cbmV4cG9ydCAqIGZyb20gJy4vRHluYW1pY0dlb21ldHJ5TW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vVGV4dHVyZU1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL0FuaW1hdGlvbk1vZHVsZSc7XG4iLCIvKipcbiAqIEBjbGFzcyBEZWZpbmVNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+IENyZWF0aW5nIGEgRGVmaW5lTW9kdWxlIHdpdGggUGVyc3BlY3RpdmVDYW1lcmEgYXMgY2FtZXJhIG1vZHVsZSBhbmQgcGFzc2luZyBpdCB0byBBcHAncyBtb2R1bGVzPC9jYXB0aW9uPlxuICogbmV3IEFwcChbXG4gKiAgIC8vIC4uLlxuICogICBuZXcgRGVmaW5lTW9kdWxlKCdjYW1lcmEnLCBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKSlcbiAqIF0pO1xuICovXG5leHBvcnQgY2xhc3MgRGVmaW5lTW9kdWxlIHtcbiAgY29uc3RydWN0b3IobmFtZSwgZGF0YSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgfVxuXG4gIG1hbmFnZXIobWFuYWdlcikge1xuICAgIG1hbmFnZXIuc2V0KHRoaXMubmFtZSwgdGhpcy5kYXRhKTtcbiAgfVxufVxuIiwiLyoqIEBtb2R1bGUgbW9kdWxlcyAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2FwcC9pbmRleCc7XG5leHBvcnQgKiBmcm9tICcuL21lc2gvaW5kZXgnO1xuXG4vLyBtb2R1bGVzXG5leHBvcnQgKiBmcm9tICcuL0RlZmluZU1vZHVsZSc7XG4iLCJpbXBvcnQge0ltcG9ydGVyfSBmcm9tICcuL2NvbXBvbmVudHMvbWVzaGVzL0ltcG9ydGVyJztcbmltcG9ydCB7UGVyc3BlY3RpdmVDYW1lcmF9IGZyb20gJy4vY29tcG9uZW50cy9jYW1lcmFzL1BlcnNwZWN0aXZlQ2FtZXJhJztcblxuZXhwb3J0IGNsYXNzIE1vZGVsIGV4dGVuZHMgSW1wb3J0ZXIge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMsIC4uLmFkZGl0aW9uYWwpIHtcbiAgICBjb25zb2xlLndhcm4oJ01vZGVsIGlzIGRlcHJlY2F0ZWQuIFVzZSBJbXBvcnRlciBpbnN0ZWFkLicpO1xuXG4gICAgaWYgKHBhcmFtcy5nZW9tZXRyeSkge1xuICAgICAgcGFyYW1zLnVybCA9IHBhcmFtcy5nZW9tZXRyeS5wYXRoO1xuICAgICAgcGFyYW1zLmxvYWRlciA9IHBhcmFtcy5nZW9tZXRyeS5sb2FkZXI7XG4gICAgfVxuXG4gICAgc3VwZXIocGFyYW1zLCAuLi5hZGRpdGlvbmFsKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2FtZXJhTW9kdWxlIHtcbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBjb25zb2xlLndhcm4oJ0NhbWVyYU1vZHVsZSBpcyBkZXByZWNhdGVkLiBVc2UgRGVmaW5lTW9kdWxlIGluc3RlYWQuJyk7XG4gICAgdGhpcy5jYW1lcmEgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEocGFyYW1zKTtcbiAgfVxuXG4gIGludGVncmF0ZShzZWxmKSB7XG4gICAgdGhpcy5hZGQoc2VsZi5jYW1lcmEpO1xuICB9XG5cbiAgbWFuYWdlcihtYW5hZ2VyKSB7XG4gICAgbWFuYWdlci5zZXQoJ2NhbWVyYScsIHRoaXMuY2FtZXJhKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBOYW1lc3BhY2UgY29udGFpbmluZyBhbGwgY2xhc3NlcyBmcm9tIGFsbCBtb2R1bGVzLiBVc2VkIGFzIGdsb2JhbCBpbiBVTUQgcGF0dGVybi5cbiAqIEBuYW1lc3BhY2UgV0hTXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5UaGUgdXNlIG9mIFdIUyBuYW1lc3BhY2UuPC9jYXB0aW9uPlxuICogbmV3IFdIUy5BcHAoKSAvLyBjb3JlXG4gKiBuZXcgV0hTLlBlcnNwZWN0aXZlQ2FtZXJhKCkgLy8gY29tcG9uZW50c1xuICogbmV3IFdIUy5SZXNpemVNb2R1bGUoKSAvLyBtb2R1bGVzXG4gKiBXSFMuZXh0ZW5kKCkgLy8gdXRpbHNcbiAqL1xuXG5cbmV4cG9ydCAqIGZyb20gJy4vY29yZS9pbmRleCc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudHMvbGlnaHRzL2luZGV4JztcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50cy9jYW1lcmFzL2luZGV4JztcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50cy9tZXNoZXMvaW5kZXgnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9pbmRleCc7XG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvaW5kZXgnO1xuXG4vLyBERVBSRUNBVElPTlxuZXhwb3J0ICogZnJvbSAnLi9kZXByZWNhdGlvbic7XG4iXSwibmFtZXMiOlsicmVxdWlyZSQkMCIsImRlZmluZWQiLCJ0b0ludGVnZXIiLCJhRnVuY3Rpb24iLCJpc09iamVjdCIsImRvY3VtZW50IiwicmVxdWlyZSQkMSIsInJlcXVpcmUkJDIiLCJhbk9iamVjdCIsInRvUHJpbWl0aXZlIiwiSUU4X0RPTV9ERUZJTkUiLCJkUCIsImNyZWF0ZURlc2MiLCJjb3JlIiwiZ2xvYmFsIiwiaGFzIiwiY3R4IiwiaGlkZSIsImNvZiIsIklPYmplY3QiLCJtaW4iLCJ0b0lPYmplY3QiLCJ0b0xlbmd0aCIsInRvQWJzb2x1dGVJbmRleCIsInVpZCIsIiRrZXlzIiwiZW51bUJ1Z0tleXMiLCJnZXRLZXlzIiwiSUVfUFJPVE8iLCJQUk9UT1RZUEUiLCJkUHMiLCJjcmVhdGUiLCJkZXNjcmlwdG9yIiwic2V0VG9TdHJpbmdUYWciLCJ0b09iamVjdCIsIiRpdGVyQ3JlYXRlIiwiZ2V0UHJvdG90eXBlT2YiLCJMSUJSQVJZIiwiSXRlcmF0b3JzIiwicmVkZWZpbmUiLCIkZXhwb3J0Iiwic3RlcCIsIlRBRyIsIklURVJBVE9SIiwiY2xhc3NvZiIsImdldEl0ZXJGbiIsImlzQXJyYXlJdGVyIiwiY2FsbCIsImludm9rZSIsImNlbCIsImh0bWwiLCJwcm9jZXNzIiwiUHJvbWlzZSIsIm5ld1Byb21pc2VDYXBhYmlsaXR5IiwiU1BFQ0lFUyIsIkRFU0NSSVBUT1JTIiwiVHlwZUVycm9yIiwiaXNOb2RlIiwibmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUiLCJ1c2VyQWdlbnQiLCJwZXJmb3JtIiwiYW5JbnN0YW5jZSIsInJlcXVpcmUkJDMiLCJzcGVjaWVzQ29uc3RydWN0b3IiLCJyZXF1aXJlJCQ0IiwicmVxdWlyZSQkNSIsInJlcXVpcmUkJDYiLCJwcm9taXNlUmVzb2x2ZSIsInJlcXVpcmUkJDciLCJmb3JPZiIsIl9Qcm9taXNlIiwicElFIiwiZmFpbHMiLCJ3a3NFeHQiLCJnT1BTIiwidG9TdHJpbmciLCJnT1BEIiwiJEdPUEQiLCIkRFAiLCJnT1BOIiwiZ09QTkV4dCIsIndrcyIsInNoYXJlZCIsIk9iamVjdFByb3RvIiwiVVNFX05BVElWRSIsIiRmYWlscyIsIl9jcmVhdGUiLCJlbnVtS2V5cyIsIiRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ3a3NEZWZpbmUiLCJpc0FycmF5IiwiJE9iamVjdCIsIl9PYmplY3QkZGVmaW5lUHJvcGVydHkiLCJfT2JqZWN0JGtleXMiLCJfT2JqZWN0JGdldE93blByb3BlcnR5U3ltYm9scyIsIl9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZGVmaW5lUHJvcGVydHkiLCJfT2JqZWN0JHNldFByb3RvdHlwZU9mIiwic2V0UHJvdG90eXBlT2YiLCJfU3ltYm9sIiwiX1N5bWJvbCRpdGVyYXRvciIsIl90eXBlb2YiLCIkZ2V0UHJvdG90eXBlT2YiLCJfT2JqZWN0JGdldFByb3RvdHlwZU9mIiwiZXh0ZW5kIiwib2JqZWN0IiwiZXh0ZW5zaW9ucyIsImV4dGVuc2lvbiIsIk9iamVjdCIsImdldE93blByb3BlcnR5TmFtZXMiLCJwcm9wIiwidW5kZWZpbmVkIiwiY29uc3RydWN0b3IiLCJBcnJheSIsInNsaWNlIiwiaW5zdHJ1Y3QiLCJhcnJheSIsImluc3RBcnJheSIsInRlbXBPYmplY3QiLCJpIiwibWF4IiwibGVuZ3RoIiwiZ3VpZGUiLCJ0cmFuc2Zvcm1EYXRhIiwiaW5zdHJ1Y3Rpb25zIiwia2V5IiwidG9BcnJheSIsImluc3RydWN0aW9uIiwidGVtcEFycmF5IiwicHgiLCJyZWRlZmluZUFsbCIsInZhbGlkYXRlIiwiJGl0ZXJEZWZpbmUiLCJzZXRTcGVjaWVzIiwiYXNjIiwibWV0YSIsInN0cm9uZyIsImZyb20iLCJiaW5kIiwiX1JlZmxlY3QkY29uc3RydWN0IiwiX01hcCIsIl9PYmplY3QkY3JlYXRlIiwiY29uc3RydWN0IiwiQ29tcG9zaXRpb25FcnJvciIsImNsYXNzSW5zdGFuY2UiLCJtZXNzYWdlIiwiY29tcG9uZW50Iiwic3RhY2tBcnJheSIsInN0YWNrIiwic3BsaXQiLCJzcGxpY2UiLCJqb2luIiwiY29uc29sZSIsImVycm9yIiwibmFtZSIsIkVycm9yIiwiRGVwZW5kZW5jeUVycm9yIiwiYWN0aXZlTW9kdWxlIiwiZGVwZW5kZW5jeU1vZHVsZSIsIk1hbmFnZXJFcnJvciIsIndhcm5EZXBzIiwiUkVWSVNJT04iLCJlcnIiLCJNb2R1bGVTeXN0ZW0iLCJzb3VyY2UiLCJtb2R1bGVzIiwiYXBwbHlNb2R1bGUiLCJhcHBseUJyaWRnZSIsIm9uQ29weSIsImJyaWRnZU1hcCIsIm1vZHVsZSIsImJyaWRnZSIsImFwcGx5IiwiY2IiLCJmdW5jIiwibW9kdWxlU2NvcGUiLCJwdXNoIiwibWFuYWdlciIsImFjdGl2ZSIsImludGVncmF0ZSIsImRpc3Bvc2VNb2R1bGUiLCJpbmRleE9mIiwiZGlzcG9zZSIsIkV2ZW50cyIsImdldCIsIl9nZXRJdGVyYXRvciIsInBvbnlmaWxsIiwiJCRvYnNlcnZhYmxlIiwiTW9kdWxlTWFuYWdlciIsImhhbmRsZXIiLCJjdXJyZW50TW9kdWxlIiwic3RvcmUiLCJjcmVhdGVTdG9yZSIsInN0YXRlIiwiYWN0aW9uIiwiZGF0YSIsImRpc3BhdGNoIiwidHlwZSIsImdldFN0YXRlIiwiQm9vbGVhbiIsImRlcHNNYXAiLCJzdWJzY3JpYmUiLCJjaGFuZ2VkS2V5IiwiY2FsbGJhY2siLCJ3YXJuIiwic2V0IiwibW9kdWxlRXhlY3V0b3IiLCJ1c2UiLCJDb21wb25lbnQiLCJwYXJhbXMiLCJkZWZhdWx0cyIsImludGVncmF0ZU1vZHVsZXMiLCJwcm9taXNlIiwiX3dhaXQiLCJhbGwiLCJpc0RlZmZlcmVkIiwid2FpdCIsInRoZW4iLCJjb3B5IiwiY3VzdG9taXplIiwibmF0aXZlIiwiY2xvbmUiLCJwYXJlbnQiLCJyZW1vdmUiLCJvbkFkZCIsImFkZCIsImNoaWxkcmVuIiwiX21hbmFnZXIiLCJfbmF0aXZlIiwibWVzaCIsIl9SZWZsZWN0JGdldCIsImF0dHJpYnV0ZXMiLCJtYXBwZXJzIiwidGFyZ2V0IiwibWFwcGVyIiwiayIsIm1hcCIsImF0dHJpYnV0ZSIsInByb3RvdHlwZSIsImdldHRlciIsInNldHRlciIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJ2YWx1ZSIsIm1pcnJvciIsIk1lc2hDb21wb25lbnQiLCJnZW9tIiwiTWVzaCIsImdlb21ldHJ5IiwibWF0ZXJpYWwiLCJjdXN0b20iLCJidWlsZCIsIndyYXAiLCJyZXNvbHZlIiwiYXBwbHlDb21tYW5kIiwicG9zaXRpb24iLCJyb3RhdGlvbiIsInNjYWxlIiwic2hhZG93IiwieCIsInkiLCJ6IiwiY2FzdFNoYWRvdyIsImNhc3QiLCJyZWNlaXZlU2hhZG93IiwicmVjZWl2ZSIsIm9uV3JhcCIsInF1YXRlcm5pb24iLCJkZXN0IiwiTGlnaHRDb21wb25lbnQiLCJsaWdodCIsIndyYXBTaGFkb3ciLCJkZWZlciIsIm1hcFNpemUiLCJ3aWR0aCIsImhlaWdodCIsImJpYXMiLCJyYWRpdXMiLCJzaGFkb3dDYW1lcmEiLCJjYW1lcmEiLCJuZWFyIiwiZmFyIiwiZm92IiwibGVmdCIsInJpZ2h0IiwidG9wIiwiYm90dG9tIiwiQ2FtZXJhQ29tcG9uZW50Iiwic3lzdGVtIiwid2luZG93IiwiQXBwIiwibG9nIiwidmVyc2lvbiIsInJlcXVlc3RBbmltRnJhbWUiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJ3ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJtb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJzZXRUaW1lb3V0IiwicmVxdWVzdCIsImVuYWJsZWQiLCJsbCIsImxvb3BzIiwiZSIsImV4ZWN1dGUiLCJjbG9jayIsImxvb3AiLCJpbmRleCIsIkxvb3AiLCJ1c2VDbG9jayIsIkNsb2NrIiwid29ybGQiLCJhZGRMb29wIiwic3RhcnQiLCJzdG9wIiwicmVtb3ZlTG9vcCIsIkFtYmllbnRMaWdodCIsIkFtYmllbnRMaWdodE5hdGl2ZSIsImNvbG9yIiwiaW50ZW5zaXR5IiwiRGlyZWN0aW9uYWxMaWdodCIsIkRpcmVjdGlvbmFsTGlnaHROYXRpdmUiLCJIZW1pc3BoZXJlTGlnaHQiLCJIZW1pc3BoZXJlTGlnaHROYXRpdmUiLCJza3lDb2xvciIsImdyb3VuZENvbG9yIiwiUG9pbnRMaWdodCIsIlBvaW50TGlnaHROYXRpdmUiLCJkaXN0YW5jZSIsImRlY2F5IiwiU3BvdExpZ2h0IiwiU3BvdExpZ2h0TmF0aXZlIiwiYW5nbGUiLCJleHBvbmVudCIsIk1hdGgiLCJQSSIsIkFyZWFMaWdodCIsIlJlY3RBcmVhTGlnaHROYXRpdmUiLCJDdWJlQ2FtZXJhIiwiQ3ViZUNhbWVyYU5hdGl2ZSIsImN1YmVSZXNvbHV0aW9uIiwiT3J0aG9ncmFwaGljQ2FtZXJhIiwiT3J0aG9ncmFwaGljQ2FtZXJhTmF0aXZlIiwiaW5uZXJXaWR0aCIsImlubmVySGVpZ2h0IiwiUGVyc3BlY3RpdmVDYW1lcmEiLCJQZXJzcGVjdGl2ZUNhbWVyYU5hdGl2ZSIsImFzcGVjdCIsIkJveCIsImJ1aWxkR2VvbWV0cnkiLCJidWZmZXIiLCJCb3hCdWZmZXJHZW9tZXRyeSIsIkJveEdlb21ldHJ5IiwiZGVwdGgiLCJ3aWR0aFNlZ21lbnRzIiwiaGVpZ2h0U2VnbWVudHMiLCJkZXB0aFNlZ21lbnRzIiwiQ2lyY2xlIiwiQ2lyY2xlQnVmZmVyR2VvbWV0cnkiLCJDaXJjbGVHZW9tZXRyeSIsInNlZ21lbnRzIiwidGhldGFTdGFydCIsInRoZXRhTGVuZ3RoIiwiQ29uZSIsIkNvbmVCdWZmZXJHZW9tZXRyeSIsIkNvbmVHZW9tZXRyeSIsInJhZGl1c1NlZ21lbnRzIiwib3BlbkVuZGVkIiwiQ3lsaW5kZXIiLCJDeWxpbmRlckJ1ZmZlckdlb21ldHJ5IiwiQ3lsaW5kZXJHZW9tZXRyeSIsInJhZGl1c1RvcCIsInJhZGl1c0JvdHRvbSIsIkRvZGVjYWhlZHJvbiIsIkRvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5IiwiRG9kZWNhaGVkcm9uR2VvbWV0cnkiLCJkZXRhaWwiLCJFeHRydWRlIiwiRXh0cnVkZUdlb21ldHJ5Iiwic2hhcGVzIiwib3B0aW9ucyIsIkJ1ZmZlckdlb21ldHJ5IiwiZnJvbUdlb21ldHJ5IiwiSWNvc2FoZWRyb24iLCJJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5IiwiSWNvc2FoZWRyb25HZW9tZXRyeSIsIkxhdGhlIiwiTGF0aGVCdWZmZXJHZW9tZXRyeSIsIkxhdGhlR2VvbWV0cnkiLCJwb2ludHMiLCJMaW5lIiwiTGluZU5hdGl2ZSIsIkdlb21ldHJ5IiwicHAiLCJjdXJ2ZSIsImdldFBvaW50cyIsInZlcnRzIiwiRmxvYXQzMkFycmF5IiwiaTMiLCJhZGRBdHRyaWJ1dGUiLCJCdWZmZXJBdHRyaWJ1dGUiLCJ2ZXJ0aWNlcyIsIkltcG9ydGVyIiwiZmlsdGVyIiwicHJvY2Vzc0ZpbHRlciIsImZvckVhY2giLCJlbCIsInRleHR1cmVQYXRoIiwibG9hZGVyIiwic2V0VGV4dHVyZVBhdGgiLCJsb2FkIiwidXJsIiwib25Mb2FkIiwicGFyc2VyIiwib25Qcm9ncmVzcyIsIm9uRXJyb3IiLCJKU09OTG9hZGVyIiwidXNlQ3VzdG9tTWF0ZXJpYWwiLCJtYXQiLCJib25lcyIsIlNraW5uZWRNZXNoIiwiT2N0YWhlZHJvbiIsIk9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSIsIk9jdGFoZWRyb25HZW9tZXRyeSIsIlBhcmFtZXRyaWMiLCJQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnkiLCJQYXJhbWV0cmljR2VvbWV0cnkiLCJzbGljZXMiLCJzdGFja3MiLCJ1IiwidiIsIlZlY3RvcjMiLCJQbGFuZSIsIlBsYW5lQnVmZmVyR2VvbWV0cnkiLCJQbGFuZUdlb21ldHJ5Iiwid1NlZ21lbnRzIiwiaFNlZ21lbnRzIiwidmVydGljZXNPZkN1YmUiLCJpbmRpY2VzT2ZGYWNlcyIsIlBvbHloZWRyb24iLCJQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkiLCJQb2x5aGVkcm9uR2VvbWV0cnkiLCJSaW5nIiwiUmluZ0J1ZmZlckdlb21ldHJ5IiwiUmluZ0dlb21ldHJ5IiwiaW5uZXJSYWRpdXMiLCJvdXRlclJhZGl1cyIsInRoZXRhU2VnbWVudHMiLCJwaGlTZWdtZW50cyIsIlNoYXBlIiwiU2hhcGVCdWZmZXJHZW9tZXRyeSIsIlNoYXBlR2VvbWV0cnkiLCJTcGhlcmUiLCJTcGhlcmVCdWZmZXJHZW9tZXRyeSIsIlNwaGVyZUdlb21ldHJ5IiwiVGV0cmFoZWRyb24iLCJUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5IiwiVGV0cmFoZWRyb25HZW9tZXRyeSIsIlRleHQiLCJwYXRoIiwiZm9udCIsIlRleHRHZW9tZXRyeSIsInRleHQiLCJhc3NpZ24iLCJzaXplIiwiY3VydmVTZWdtZW50cyIsIkZvbnQiLCJiZXZlbEVuYWJsZWQiLCJiZXZlbFRoaWNrbmVzcyIsImJldmVsU2l6ZSIsIkZvbnRMb2FkZXIiLCJUb3J1cyIsIlRvcnVzR2VvbWV0cnkiLCJ0dWJlIiwicmFkaWFsU2VnbWVudHMiLCJ0dWJ1bGFyU2VnbWVudHMiLCJhcmMiLCJUb3J1c2tub3QiLCJHQ29uc3RydWN0IiwiVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkiLCJUb3J1c0tub3RHZW9tZXRyeSIsInAiLCJxIiwiVHViZSIsIlR1YmVCdWZmZXJHZW9tZXRyeSIsIlR1YmVHZW9tZXRyeSIsImNsb3NlZCIsIkxpbmVDdXJ2ZTMiLCJHcm91cCIsIm9iaiIsImFkZFRvIiwiT2JqZWN0M0QiLCJFbGVtZW50TW9kdWxlIiwiY29udGFpbmVyIiwiYm9keSIsImNyZWF0ZUVsZW1lbnQiLCJlbGVtZW50IiwiY2xhc3NOYW1lIiwic3R5bGUiLCJzZWxmIiwiYXBwZW5kQ2hpbGQiLCJSZW5kZXJpbmdNb2R1bGUiLCJhZGRpdGlvbmFsIiwicmVzb2x1dGlvbiIsIlZlY3RvcjIiLCJwaXhlbFJhdGlvIiwiZGV2aWNlUGl4ZWxSYXRpbyIsImJnQ29sb3IiLCJiZ09wYWNpdHkiLCJyZW5kZXJlciIsImZpeCIsIldlYkdMUmVuZGVyZXIiLCJlZmZlY3RzIiwic2V0Q2xlYXJDb2xvciIsInNldFBpeGVsUmF0aW8iLCJzZXRTaXplIiwiTnVtYmVyIiwidG9GaXhlZCIsImFwcGx5QWRkaXRpb25hbCIsInNjZW5lIiwiYXR0YWNoVG9DYW52YXMiLCJyZW5kZXIiLCJlZmZlY3QiLCJlZmZlY3RMb29wIiwicmVuZGVyTG9vcCIsImdldFNpemUiLCJhcHAiLCJjYW52YXMiLCJkb21FbGVtZW50IiwiZGVmaW5lIiwiaW50ZWdyYXRlUmVuZGVyZXIiLCJ1cGRhdGUiLCJmb3JjZUNvbnRleHRMb3NzIiwic2hhZG93TWFwIiwiU1lNQk9MX0NISUxEUkVOX0ZPUl9TQ0VORSIsIlN5bWJvbCIsIlNjZW5lTW9kdWxlIiwid2lsbFNjZW5lQmVSZXBsYWNlZCIsIlNjZW5lIiwib25SZW1vdmUiLCJfc2V0U2NlbmUiLCJzZXRTY2VuZSIsImdldFNjZW5lIiwiUmVzaXplTW9kdWxlIiwiYXV0byIsImNhbGxiYWNrcyIsInVwZGF0ZVByb2plY3Rpb25NYXRyaXgiLCJyZW5kZXJpbmciLCJvZmZzZXRXaWR0aCIsIm9mZnNldEhlaWdodCIsImdldENvbnRhaW5lciIsImdldFJlc29sdXRpb24iLCJhZGRFdmVudExpc3RlbmVyIiwidHJpZ2dlciIsImFkZEF1dG9yZXNpemUiLCJmcmFnbWVudCIsInZlcnRleCIsIkFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsIiwiZGVmaW5lcyIsIk1JUF9MRVZFTF8xWDEiLCJ1bmlmb3JtcyIsInRQcmV2aW91c0x1bSIsIlVuaWZvcm0iLCJ0Q3VycmVudEx1bSIsIm1pbkx1bWluYW5jZSIsImRlbHRhIiwidGF1IiwiZnJhZ21lbnRTaGFkZXIiLCJ2ZXJ0ZXhTaGFkZXIiLCJkZXB0aFdyaXRlIiwiZGVwdGhUZXN0IiwiU2hhZGVyTWF0ZXJpYWwiLCJCb2tlaE1hdGVyaWFsIiwic2V0dGluZ3MiLCJmb2N1cyIsImRvZiIsImFwZXJ0dXJlIiwibWF4Qmx1ciIsImNhbWVyYU5lYXIiLCJjYW1lcmFGYXIiLCJ0RGlmZnVzZSIsInREZXB0aCIsImFkb3B0Q2FtZXJhU2V0dGluZ3MiLCJDb2xvckVkZ2VzTWF0ZXJpYWwiLCJ0ZXhlbFNpemUiLCJFREdFX1RIUkVTSE9MRCIsInRocmVzaG9sZCIsIm5lZWRzVXBkYXRlIiwiQ29tYmluZU1hdGVyaWFsIiwic2NyZWVuTW9kZSIsInRleHR1cmUxIiwidGV4dHVyZTIiLCJvcGFjaXR5MSIsIm9wYWNpdHkyIiwic2V0U2NyZWVuTW9kZUVuYWJsZWQiLCJTQ1JFRU5fTU9ERSIsIkNvbnZvbHV0aW9uTWF0ZXJpYWwiLCJoYWxmVGV4ZWxTaXplIiwia2VybmVsIiwic2V0VGV4ZWxTaXplIiwia2VybmVsU2l6ZSIsIktlcm5lbFNpemUiLCJMQVJHRSIsImtlcm5lbFByZXNldHMiLCJtdWx0aXBseVNjYWxhciIsIlZFUllfU01BTEwiLCJTTUFMTCIsIk1FRElVTSIsIlZFUllfTEFSR0UiLCJIVUdFIiwiQ29weU1hdGVyaWFsIiwib3BhY2l0eSIsIkRlcHRoQ29tcGFyaXNvbk1hdGVyaWFsIiwiZGVwdGhUZXh0dXJlIiwibW9ycGhUYXJnZXRzIiwic2tpbm5pbmciLCJQRVJTUEVDVElWRV9DQU1FUkEiLCJEb3RTY3JlZW5NYXRlcmlhbCIsImF2ZXJhZ2UiLCJvZmZzZXRSZXBlYXQiLCJWZWN0b3I0Iiwic2V0QXZlcmFnZUVuYWJsZWQiLCJBVkVSQUdFIiwiRmlsbU1hdGVyaWFsIiwibm9pc2UiLCJzY2FubGluZXMiLCJncmlkIiwiZ3JleXNjYWxlIiwic2VwaWEiLCJ2aWduZXR0ZSIsImVza2lsIiwibm9pc2VJbnRlbnNpdHkiLCJzY2FubGluZUludGVuc2l0eSIsImdyaWRJbnRlbnNpdHkiLCJncmV5c2NhbGVJbnRlbnNpdHkiLCJzZXBpYUludGVuc2l0eSIsInZpZ25ldHRlT2Zmc2V0IiwidmlnbmV0dGVEYXJrbmVzcyIsInRpbWUiLCJzY2FubGluZUNvdW50IiwiZ3JpZFNjYWxlIiwiZ3JpZExpbmVXaWR0aCIsInNldE5vaXNlRW5hYmxlZCIsInNldFNjYW5saW5lc0VuYWJsZWQiLCJzZXRHcmlkRW5hYmxlZCIsInNldEdyZXlzY2FsZUVuYWJsZWQiLCJzZXRTZXBpYUVuYWJsZWQiLCJzZXRWaWduZXR0ZUVuYWJsZWQiLCJzZXRFc2tpbEVuYWJsZWQiLCJOT0lTRSIsIlNDQU5MSU5FUyIsIkdSSUQiLCJHUkVZU0NBTEUiLCJTRVBJQSIsIlZJR05FVFRFIiwiRVNLSUwiLCJHbGl0Y2hNYXRlcmlhbCIsInRQZXJ0dXJiIiwiYW1vdW50Iiwic2VlZCIsInNlZWRYIiwic2VlZFkiLCJkaXN0b3J0aW9uWCIsImRpc3RvcnRpb25ZIiwiY29sUyIsIkdvZFJheXNNYXRlcmlhbCIsImV4cG9zdXJlIiwiZGVuc2l0eSIsIndlaWdodCIsImNsYW1wTWF4IiwiTlVNX1NBTVBMRVNfRkxPQVQiLCJOVU1fU0FNUExFU19JTlQiLCJsaWdodFBvc2l0aW9uIiwiTHVtaW5vc2l0eU1hdGVyaWFsIiwiY29sb3JPdXRwdXQiLCJsdW1pbmFuY2VSYW5nZSIsIm1hc2tMdW1pbmFuY2UiLCJkaXN0aW5jdGlvbiIsInJhbmdlIiwic2V0Q29sb3JPdXRwdXRFbmFibGVkIiwic2V0THVtaW5hbmNlUmFuZ2VFbmFibGVkIiwiQ09MT1IiLCJSQU5HRSIsIk91dGxpbmVCbGVuZE1hdGVyaWFsIiwiZWRnZVN0cmVuZ3RoIiwicGF0dGVyblNjYWxlIiwidmlzaWJsZUVkZ2VDb2xvciIsImhpZGRlbkVkZ2VDb2xvciIsImFscGhhQmxlbmRpbmciLCJ4UmF5IiwicHVsc2UiLCJ0TWFzayIsInRFZGdlcyIsInRQYXR0ZXJuIiwiQ29sb3IiLCJzZXRBbHBoYUJsZW5kaW5nRW5hYmxlZCIsInNldFhSYXlFbmFibGVkIiwiQUxQSEFfQkxFTkRJTkciLCJYX1JBWSIsInRleHR1cmUiLCJVU0VfUEFUVEVSTiIsIk91dGxpbmVFZGdlc01hdGVyaWFsIiwiUGl4ZWxhdGlvbk1hdGVyaWFsIiwiZ3JhbnVsYXJpdHkiLCJkeCIsImR5IiwiUmVhbGlzdGljQm9rZWhNYXRlcmlhbCIsInJpbmdzIiwic2FtcGxlcyIsInNob3dGb2N1cyIsIm1hbnVhbERvRiIsInBlbnRhZ29uIiwic2hhZGVyRm9jdXMiLCJsdW1pbmFuY2VUaHJlc2hvbGQiLCJsdW1pbmFuY2VHYWluIiwiZnJpbmdlIiwiZGl0aGVyU3RyZW5ndGgiLCJSSU5HU19JTlQiLCJSSU5HU19GTE9BVCIsIlNBTVBMRVNfSU5UIiwiU0FNUExFU19GTE9BVCIsImZvY2FsTGVuZ3RoIiwiZm9jYWxTdG9wIiwiZm9jdXNDb29yZHMiLCJmb2NhbERlcHRoIiwic2V0U2hvd0ZvY3VzRW5hYmxlZCIsInNldE1hbnVhbERlcHRoT2ZGaWVsZEVuYWJsZWQiLCJzZXRQZW50YWdvbkVuYWJsZWQiLCJzZXRTaGFkZXJGb2N1c0VuYWJsZWQiLCJTSE9XX0ZPQ1VTIiwiTUFOVUFMX0RPRiIsIlBFTlRBR09OIiwiU0hBREVSX0ZPQ1VTIiwiZ2V0Rm9jYWxMZW5ndGgiLCJTaG9ja1dhdmVNYXRlcmlhbCIsIm1heFJhZGl1cyIsIndhdmVTaXplIiwiYW1wbGl0dWRlIiwiY2VudGVyIiwiY2FtZXJhRGlzdGFuY2UiLCJTTUFBQmxlbmRNYXRlcmlhbCIsInRXZWlnaHRzIiwiU01BQVdlaWdodHNNYXRlcmlhbCIsIk1BWF9TRUFSQ0hfU1RFUFNfSU5UIiwiTUFYX1NFQVJDSF9TVEVQU19GTE9BVCIsIkFSRUFURVhfTUFYX0RJU1RBTkNFIiwiQVJFQVRFWF9QSVhFTF9TSVpFIiwiQVJFQVRFWF9TVUJURVhfU0laRSIsIlNFQVJDSFRFWF9TSVpFIiwiU0VBUkNIVEVYX1BBQ0tFRF9TSVpFIiwidEFyZWEiLCJ0U2VhcmNoIiwic3RlcHMiLCJUb25lTWFwcGluZ01hdGVyaWFsIiwibHVtaW5hbmNlTWFwIiwiYXZlcmFnZUx1bWluYW5jZSIsIm1heEx1bWluYW5jZSIsIm1pZGRsZUdyZXkiLCJQYXNzIiwicXVhZCIsImZydXN0dW1DdWxsZWQiLCJyZW5kZXJUb1NjcmVlbiIsIm5lZWRzU3dhcCIsImlucHV0QnVmZmVyIiwib3V0cHV0QnVmZmVyIiwic3RlbmNpbFRlc3QiLCJhbHBoYSIsImtleXMiLCJCbHVyUGFzcyIsInJlbmRlclRhcmdldFgiLCJXZWJHTFJlbmRlclRhcmdldCIsIm1pbkZpbHRlciIsIkxpbmVhckZpbHRlciIsIm1hZ0ZpbHRlciIsInN0ZW5jaWxCdWZmZXIiLCJkZXB0aEJ1ZmZlciIsImdlbmVyYXRlTWlwbWFwcyIsInJlbmRlclRhcmdldFkiLCJyZXNvbHV0aW9uU2NhbGUiLCJjb252b2x1dGlvbk1hdGVyaWFsIiwiZGl0aGVyZWRDb252b2x1dGlvbk1hdGVyaWFsIiwiZGl0aGVyaW5nIiwiZ2V0S2VybmVsIiwibGFzdFJUIiwiZGVzdFJUIiwibCIsImZsb29yIiwiZm9ybWF0IiwiUkdCRm9ybWF0IiwiQmxvb21QYXNzIiwicmVuZGVyVGFyZ2V0IiwiYmx1clBhc3MiLCJjb21iaW5lTWF0ZXJpYWwiLCJsdW1pbm9zaXR5TWF0ZXJpYWwiLCJibGVuZCIsImluaXRpYWxpemUiLCJCb2tlaFBhc3MiLCJDbGVhck1hc2tQYXNzIiwiYnVmZmVycyIsInN0ZW5jaWwiLCJzZXRUZXN0IiwiQ2xlYXJQYXNzIiwiY2xlYXJDb2xvciIsImNsZWFyQWxwaGEiLCJnZXRDbGVhckNvbG9yIiwiZ2V0Q2xlYXJBbHBoYSIsInNldFJlbmRlclRhcmdldCIsImNsZWFyIiwiRG90U2NyZWVuUGFzcyIsInciLCJGaWxtUGFzcyIsInNjYW5saW5lRGVuc2l0eSIsInJvdW5kIiwicmFuZG9tSW50IiwibG93IiwiaGlnaCIsInJhbmRvbSIsInJhbmRvbUZsb2F0IiwiR2xpdGNoUGFzcyIsInBlcnR1cmJNYXAiLCJnZW5lcmF0ZVBlcnR1cmJNYXAiLCJkdFNpemUiLCJtb2RlIiwiR2xpdGNoTW9kZSIsIlNQT1JBRElDIiwiY291bnRlciIsImJyZWFrUG9pbnQiLCJwaXhlbHMiLCJkdCIsIkRhdGFUZXh0dXJlIiwiRmxvYXRUeXBlIiwiQ09OU1RBTlRfV0lMRCIsIkNPTlNUQU5UX01JTEQiLCJSZW5kZXJQYXNzIiwiY2xlYXJQYXNzIiwib3ZlcnJpZGVNYXRlcmlhbCIsImNsZWFyRGVwdGgiLCJjbGFtcCIsIkdvZFJheXNQYXNzIiwibGlnaHRTb3VyY2UiLCJsaWdodFNjZW5lIiwibWFpblNjZW5lIiwibWFpbkNhbWVyYSIsInJlbmRlclRhcmdldE1hc2siLCJyZW5kZXJQYXNzTGlnaHQiLCJyZW5kZXJQYXNzTWFzayIsIk1lc2hCYXNpY01hdGVyaWFsIiwic2NyZWVuUG9zaXRpb24iLCJnb2RSYXlzTWF0ZXJpYWwiLCJiYWNrZ3JvdW5kIiwicHJvamVjdCIsInBhcnNlSW50IiwiTWFza1Bhc3MiLCJpbnZlcnNlIiwiY2xlYXJTdGVuY2lsIiwiY29udGV4dCIsIndyaXRlVmFsdWUiLCJjbGVhclZhbHVlIiwic2V0TWFzayIsInNldExvY2tlZCIsInNldE9wIiwiUkVQTEFDRSIsInNldEZ1bmMiLCJBTFdBWVMiLCJzZXRDbGVhciIsIkVRVUFMIiwiS0VFUCIsIlNoYWRlclBhc3MiLCJ0ZXh0dXJlSUQiLCJPdXRsaW5lUGFzcyIsInJlbmRlclRhcmdldERlcHRoIiwicmVuZGVyVGFyZ2V0RWRnZXMiLCJyZW5kZXJUYXJnZXRCbHVycmVkRWRnZXMiLCJyZW5kZXJQYXNzRGVwdGgiLCJNZXNoRGVwdGhNYXRlcmlhbCIsImRlcHRoUGFja2luZyIsIlJHQkFEZXB0aFBhY2tpbmciLCJjb3B5UGFzcyIsIm91dGxpbmVFZGdlc01hdGVyaWFsIiwib3V0bGluZUJsZW5kTWF0ZXJpYWwiLCJibHVyIiwic2VsZWN0aW9uIiwicHVsc2VTcGVlZCIsInNlbGVjdGlvbkxheWVyIiwic2V0UGF0dGVyblRleHR1cmUiLCJvYmplY3RzIiwiY2xlYXJTZWxlY3Rpb24iLCJsYXllcnMiLCJlbmFibGUiLCJkaXNhYmxlIiwidmlzaWJsZSIsIm1hc2siLCJjb3MiLCJzZXRTZWxlY3Rpb25WaXNpYmxlIiwiUGl4ZWxhdGlvblBhc3MiLCJzZXRSZXNvbHV0aW9uIiwiUmVhbGlzdGljQm9rZWhQYXNzIiwiU2F2ZVBhc3MiLCJyZXNpemUiLCJIQUxGX1BJIiwiYWIiLCJTaG9ja1dhdmVQYXNzIiwiZXBpY2VudGVyIiwic3BlZWQiLCJzaG9ja1dhdmVNYXRlcmlhbCIsImNvcHlNYXRlcmlhbCIsImdldFdvcmxkRGlyZWN0aW9uIiwic3ViIiwiYW5nbGVUbyIsImRpc3RhbmNlVG8iLCJTTUFBUGFzcyIsInNlYXJjaEltYWdlIiwiYXJlYUltYWdlIiwicmVuZGVyVGFyZ2V0Q29sb3JFZGdlcyIsInJlbmRlclRhcmdldFdlaWdodHMiLCJSR0JBRm9ybWF0IiwiY29sb3JFZGdlc01hdGVyaWFsIiwid2VpZ2h0c01hdGVyaWFsIiwic2VhcmNoVGV4dHVyZSIsIlRleHR1cmUiLCJOZWFyZXN0RmlsdGVyIiwiZmxpcFkiLCJhcmVhVGV4dHVyZSIsImJsZW5kTWF0ZXJpYWwiLCJzZWFyY2hJbWFnZURhdGFVUkwiLCJhcmVhSW1hZ2VEYXRhVVJMIiwiVGV4dHVyZVBhc3MiLCJvcGFjaXR5U291cmNlIiwiVG9uZU1hcHBpbmdQYXNzIiwicmVuZGVyVGFyZ2V0THVtaW5vc2l0eSIsIkxpbmVhck1pcE1hcExpbmVhckZpbHRlciIsInJlbmRlclRhcmdldEFkYXB0ZWQiLCJyZW5kZXJUYXJnZXRQcmV2aW91cyIsImFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsIiwidG9uZU1hcHBpbmdNYXRlcmlhbCIsImFkYXB0aXZlIiwiY2VpbCIsImxvZzIiLCJwb3ciLCJBREFQVEVEX0xVTUlOQU5DRSIsIkVmZmVjdENvbXBvc2VyIiwiYXV0b0NsZWFyIiwiY3JlYXRlQnVmZmVyIiwicGFzc2VzIiwib2xkUmVuZGVyZXIiLCJvbGRTaXplIiwibmV3U2l6ZSIsInBhcmVudE5vZGUiLCJyZW1vdmVDaGlsZCIsImRyYXdpbmdCdWZmZXJTaXplIiwiZ2V0RHJhd2luZ0J1ZmZlclNpemUiLCJnZXRDb250ZXh0QXR0cmlidXRlcyIsIkRlcHRoVGV4dHVyZSIsIkRlcHRoU3RlbmNpbEZvcm1hdCIsIlVuc2lnbmVkSW50MjQ4VHlwZSIsInBhc3MiLCJOT1RFUVVBTCIsInBvbHlmaWxsIiwibWV0aG9kIiwic2hvd1dhcm4iLCJQb3N0UHJvY2Vzc29yTW9kdWxlIiwiZGVidWciLCJjb21wb3NlciIsImdldERlbHRhIiwicmVwbGFjZVJlbmRlcmVyIiwiYWRkUGFzcyIsImN1cnJlbnRQYXNzIiwiYm9vbCIsIkV2ZW50c1BhdGNoTW9kdWxlIiwib3JpZ2luT2JqZWN0IiwiZGVzdE9iamVjdCIsImV2ZW50cyIsImV2ZW50IiwiZW1pdCIsInBhdGNoRXZlbnRzIiwiVmlydHVhbE1vdXNlTW9kdWxlIiwiZ2xvYmFsTW92ZW1lbnQiLCJSYXljYXN0ZXIiLCJjdXN0b21YIiwiY3VzdG9tWSIsInJlY3QiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJjbGllbnRYIiwiY2xpZW50WSIsIm1vdXNlIiwicHJvamVjdGlvblBsYW5lIiwibm9ybWFsIiwicmF5Y2FzdGVyIiwic2V0RnJvbUNhbWVyYSIsInJlcXVpcmUiLCJvbiIsImV2IiwiZ2xvYmFsWCIsImdsb2JhbFkiLCJwb2ludGVyTG9ja0VsZW1lbnQiLCJtb3ZlbWVudFgiLCJtb3ZlbWVudFkiLCJuZXN0ZWQiLCJpc0hvdmVyZWQiLCJob3ZlcnMiLCJ0cmF2ZXJzZSIsImNoaWxkIiwiaW50ZXJzZWN0T2JqZWN0cyIsImludGVyc2VjdE9iamVjdCIsInBsYW5lIiwicmF5IiwiaW50ZXJzZWN0UGxhbmUiLCJpbnRlcnNlY3Rpb24iLCJDb250cm9sc01vZHVsZSIsImNvbnRyb2xzIiwiYyIsInVwZGF0ZUxvb3AiLCJGb2dNb2R1bGUiLCJmb2ciLCJGb2dFeHAyIiwiRm9nIiwiaXNFcXVhbERlZmF1bHQiLCJhIiwiYiIsImVxdWFscyIsIlN0YXRlTW9kdWxlIiwiaXNFcXVhbCIsImVxdWFsQ2hlY2siLCJhY3Rpb25HZW5lcmF0ZSIsImNvbmZpZ3VyYXRpb24iLCJjdXJyZW50Q29uZmlnIiwicHJldkNvbmZpZyIsImNvbmZpZyIsImRlZmF1bHQiLCJyZXBsYWNlUmVkdWNlciIsImNvbmZpZ3MiLCJ1cGRhdGVzIiwiY29uZmlnTmFtZSIsInRydWVWYWwiLCJmYWxzZVZhbCIsIlRocmVlT3JiaXRDb250cm9scyIsImV2ZW50SGFuZGxlciIsIm1pbkRpc3RhbmNlIiwibWF4RGlzdGFuY2UiLCJJbmZpbml0eSIsIm1pblpvb20iLCJtYXhab29tIiwibWluUG9sYXJBbmdsZSIsIm1heFBvbGFyQW5nbGUiLCJtaW5BemltdXRoQW5nbGUiLCJtYXhBemltdXRoQW5nbGUiLCJlbmFibGVEYW1waW5nIiwiZGFtcGluZ0ZhY3RvciIsImVuYWJsZVpvb20iLCJ6b29tU3BlZWQiLCJlbmFibGVSb3RhdGUiLCJyb3RhdGVTcGVlZCIsImVuYWJsZVBhbiIsImtleVBhblNwZWVkIiwiYXV0b1JvdGF0ZSIsImF1dG9Sb3RhdGVTcGVlZCIsImVuYWJsZUtleXMiLCJMRUZUIiwiVVAiLCJSSUdIVCIsIkJPVFRPTSIsIm1vdXNlQnV0dG9ucyIsIk9SQklUIiwiTU9VU0UiLCJaT09NIiwiTUlERExFIiwiUEFOIiwidGFyZ2V0MCIsInBvc2l0aW9uMCIsInpvb20wIiwiem9vbSIsImdldFBvbGFyQW5nbGUiLCJzcGhlcmljYWwiLCJwaGkiLCJnZXRBemltdXRoYWxBbmdsZSIsInRoZXRhIiwicmVzZXQiLCJkaXNwYXRjaEV2ZW50IiwiY2hhbmdlRXZlbnQiLCJTVEFURSIsIk5PTkUiLCJvZmZzZXQiLCJxdWF0IiwiUXVhdGVybmlvbiIsInNldEZyb21Vbml0VmVjdG9ycyIsInVwIiwicXVhdEludmVyc2UiLCJsYXN0UG9zaXRpb24iLCJsYXN0UXVhdGVybmlvbiIsImFwcGx5UXVhdGVybmlvbiIsInNldEZyb21WZWN0b3IzIiwicm90YXRlTGVmdCIsImdldEF1dG9Sb3RhdGlvbkFuZ2xlIiwic3BoZXJpY2FsRGVsdGEiLCJtYWtlU2FmZSIsInBhbk9mZnNldCIsInNldEZyb21TcGhlcmljYWwiLCJsb29rQXQiLCJ6b29tQ2hhbmdlZCIsImRpc3RhbmNlVG9TcXVhcmVkIiwiRVBTIiwiZG90IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIm9uQ29udGV4dE1lbnUiLCJvbk1vdXNlRG93biIsIm9uTW91c2VXaGVlbCIsIm9uVG91Y2hTdGFydCIsIm9uVG91Y2hFbmQiLCJvblRvdWNoTW92ZSIsIm9uTW91c2VNb3ZlIiwib25Nb3VzZVVwIiwib25LZXlEb3duIiwic3RhcnRFdmVudCIsImVuZEV2ZW50IiwiUk9UQVRFIiwiRE9MTFkiLCJUT1VDSF9ST1RBVEUiLCJUT1VDSF9ET0xMWSIsIlRPVUNIX1BBTiIsIlNwaGVyaWNhbCIsInJvdGF0ZVN0YXJ0Iiwicm90YXRlRW5kIiwicm90YXRlRGVsdGEiLCJwYW5TdGFydCIsInBhbkVuZCIsInBhbkRlbHRhIiwiZG9sbHlTdGFydCIsImRvbGx5RW5kIiwiZG9sbHlEZWx0YSIsImdldFpvb21TY2FsZSIsInJvdGF0ZVVwIiwicGFuTGVmdCIsIm9iamVjdE1hdHJpeCIsInNldEZyb21NYXRyaXhDb2x1bW4iLCJwYW5VcCIsInBhbiIsImRlbHRhWCIsImRlbHRhWSIsInRhcmdldERpc3RhbmNlIiwidGFuIiwiY2xpZW50SGVpZ2h0IiwibWF0cml4IiwiY2xpZW50V2lkdGgiLCJkb2xseUluIiwiZG9sbHlTY2FsZSIsImRvbGx5T3V0IiwiaGFuZGxlTW91c2VEb3duUm90YXRlIiwiaGFuZGxlTW91c2VEb3duRG9sbHkiLCJoYW5kbGVNb3VzZURvd25QYW4iLCJoYW5kbGVNb3VzZU1vdmVSb3RhdGUiLCJzdWJWZWN0b3JzIiwiaGFuZGxlTW91c2VNb3ZlRG9sbHkiLCJoYW5kbGVNb3VzZU1vdmVQYW4iLCJoYW5kbGVNb3VzZVdoZWVsIiwiaGFuZGxlS2V5RG93biIsImtleUNvZGUiLCJoYW5kbGVUb3VjaFN0YXJ0Um90YXRlIiwidG91Y2hlcyIsInBhZ2VYIiwicGFnZVkiLCJoYW5kbGVUb3VjaFN0YXJ0RG9sbHkiLCJzcXJ0IiwiaGFuZGxlVG91Y2hTdGFydFBhbiIsImhhbmRsZVRvdWNoTW92ZVJvdGF0ZSIsImhhbmRsZVRvdWNoTW92ZURvbGx5IiwiaGFuZGxlVG91Y2hNb3ZlUGFuIiwicHJldmVudERlZmF1bHQiLCJidXR0b24iLCJoYW5kbGVNb3VzZVVwIiwic3RvcFByb3BhZ2F0aW9uIiwiaGFuZGxlVG91Y2hFbmQiLCJFdmVudERpc3BhdGNoZXIiLCJPcmJpdENvbnRyb2xzTW9kdWxlIiwiZm9sbG93IiwidXBkYXRlUHJvY2Vzc29yIiwic2V0Q29udHJvbHMiLCJzZXRVcGRhdGUiLCJEeW5hbWljR2VvbWV0cnlNb2R1bGUiLCJnXyIsInVwZGF0ZVBhcmFtcyIsInBhcmFtZXRlcnMiLCJUZXh0dXJlTG9hZGVyIiwiVGV4dHVyZU1vZHVsZSIsInRleHR1cmVzIiwicmVwZWF0IiwiUmVwZWF0V3JhcHBpbmciLCJtYXBwaW5nIiwiVVZNYXBwaW5nIiwidGV4Iiwid3JhcFMiLCJ3cmFwVCIsIkFuaW1hdGlvbk1vZHVsZSIsImlzRGVmZXJyZWQiLCJza2VsZXRvbiIsIm1peGVyIiwiQW5pbWF0aW9uTWl4ZXIiLCJjbGlwcyIsImFuaW1hdGlvbnMiLCJjbGlwTmFtZSIsImNsaXAiLCJBbmltYXRpb25DbGlwIiwiZmluZEJ5TmFtZSIsImNsaXBBY3Rpb24iLCJwbGF5IiwiRGVmaW5lTW9kdWxlIiwiTW9kZWwiLCJDYW1lcmFNb2R1bGUiXSwibWFwcGluZ3MiOiI7Ozs7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QUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ2xDLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQ1gsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDM0MsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQ3BCLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNwRCxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQzdCLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDN0QsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFDdEMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkUsQ0FBQyxPQUFP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QUFFOztDQUV2QixDQUFDLFlBQVksRUFBRSxFQUFFLFlBQVk7O0NBRTdCOztDQUVBLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDOztDQUVmLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFbkMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUUzRCxHQUFHOztDQUVILEVBQUUsT0FBTyxTQUFTLFlBQVksR0FBRzs7Q0FFakMsR0FBRyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQztDQUMzQyxHQUFHLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0NBQzNDLEdBQUcsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUM7Q0FDM0MsR0FBRyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQztDQUMzQyxHQUFHLElBQUksSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRztDQUM5RyxJQUFJLEdBQUcsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxHQUFHO0NBQ2pILElBQUksR0FBRyxFQUFFLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksRUFBRTtDQUMzRyxJQUFJLEdBQUcsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7O0NBRS9GO0NBQ0EsR0FBRyxPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7Q0FFN0IsR0FBRyxDQUFDOztDQUVKLEVBQUUsSUFBSTs7Q0FFTixDQUFDLEtBQUssRUFBRSxXQUFXLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHOztDQUVyQyxFQUFFLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQzs7Q0FFakQsRUFBRTs7Q0FFRjtDQUNBOztDQUVBLENBQUMsZUFBZSxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFcEMsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7O0NBRS9CLEVBQUU7O0NBRUY7O0NBRUEsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHOztDQUUzQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDOztDQUVyRCxFQUFFOztDQUVGOztDQUVBLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRTVCLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRS9CLEVBQUU7O0NBRUY7O0NBRUEsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRzs7Q0FFdEMsRUFBRSxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUM7Q0FDM0IsRUFBRSxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUM7O0NBRTNCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsT0FBTyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7O0NBRWxDLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0NBRS9CLEVBQUU7O0NBRUYsQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRzs7Q0FFeEMsRUFBRSxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUM7Q0FDM0IsRUFBRSxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUM7O0NBRTNCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsT0FBTyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7O0NBRWxDLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFH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LEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNaLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNaLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNaLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFWixFQUFFLENBQUM7O0NBRUgsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHOztDQUU3QixFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsK0VBQStFLEVBQUUsQ0FBQzs7Q0FFbkcsRUFBRTs7Q0FFRixDQUFDOztDQUVELE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRTs7Q0FFbEMsQ0FBQyxTQUFTLEVBQUUsSUFBSTs7Q0FFaEIsQ0FBQyxHQUFHLEVBQUUsV0FBVyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUc7O0NBRWxHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Q0FFekIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDO0NBQzlELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQztDQUM5RCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7Q0FDL0QsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDOztDQUUvRCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxRQUFRLEVBQUUsWUFBWTs7Q0FFdkIsRUFBRSxJQUFJLENBQUMsR0FBRzs7Q0FFVixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDYixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDYixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDYixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWIsR0FBRyxDQUFDOztDQUVKLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRSxZQUFZOztDQUVwQixFQUFFLE9BQU8sSUFBSSxPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDOztDQUVsRCxFQUFFOztDQUVGLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUV0QixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Q0FDekIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDOztDQUV0QixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDN0UsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzdFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUNqRixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFD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QUUsR0FBRyxNQUFNLENBQUM7O0NBRTlCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUM7Q0FDOUIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQztDQUM5QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDOztDQUU5QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDO0NBQzlCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUM7Q0FDOUIsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQzs7Q0FFaEMsR0FBRyxPQUFPLElBQUksQ0FBQzs7Q0FFZixHQUFHLENBQUM7O0NBRUosRUFBRSxFQUFFOztDQUVKLENBQUMscUJBQXFCLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRTNDLEVBQUUsS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUc7O0NBRXRDLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSx1R0FBdUcsRUFBRSxDQUFDOztDQUU1SCxHQUFHOztDQUVILEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Q0FFekIsRUFBRSxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0NBQzVDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUMzQyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDM0MsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUzQyxFQUFFLEtBQUssS0FBSyxDQUFDLEtBQUssS0FBSyxLQUFLLEdBQUc7O0NBRS9CLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFdEQsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNuQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDckIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUVmLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3pCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3pCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFckIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDekIsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFcEIsR0FBRyxNQUFNLEtBQUssS0FBSyxDQUFDLEtBQUssS0FBSyxLQUFLLEdBQUc7O0NBRXRDLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFdEQsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFbkIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNuQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ25CLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDOztDQUVqQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztDQUN6QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUN6QixHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUVwQixHQUFHLE1BQU0sS0FBSyxLQUFLLENBQUMsS0FBSyxLQUFLLEtBQUssR0FBRzs7Q0FFdEMsR0FBRyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUV0RCxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUN6QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDckIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRXpCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3pCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDbkIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRXpCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNyQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDZixHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUVwQixHQUFHLE1BQU0sS0FBSyxLQUFLLENBQUMsS0FBSyxLQUFLLEtBQUssR0FBRzs7Q0FFdEMsR0FBRyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUV0RCxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ25CLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0NBQ3pCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUV6QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ25CLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0NBQ3pCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUV6QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztDQUNqQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ25CLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRXBCLEdBQUcsTUFBTSxLQUFLLEtBQUssQ0FBQyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUV0QyxHQUFHLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRXRELEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDbkIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7O0NBRXpCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNmLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDbkIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUVyQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDckIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDekIsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRTFCLEdBQUcsTUFBTSxLQUFLLEtBQUssQ0FBQyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUV0QyxHQUFHLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRXRELEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDbkIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7Q0FDakIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFbkIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNuQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7Q0FFekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNuQixHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7Q0FFMUIsR0FBRzs7Q0FFSDtDQUNBLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNkLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNkLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFZjtDQUNBLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNmLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNmLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNmLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFZixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQywwQkFBMEIsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFNUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUV6QixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDN0MsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ3pDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztDQUM1QyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDNUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUU1QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO0NBQzVCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDcEIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFcEIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUNwQixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO0NBQzVCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXBCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDcEIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUNwQixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDOztDQUU3QjtDQUNBLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNkLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNk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QUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDbkUsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRW5FLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ2xFLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ2xFLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ25FLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUVuRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Q0FDMUQsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUMxRCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztDQUUzRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Q0FDMUQsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUMxRCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztDQUUzRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Q0FDMUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUMzRCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztDQUUzRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Q0FDMUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUMzRCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztDQUUzRCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRWhDLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Q0FFekIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0NBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztDQUMxRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7Q0FDM0QsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDOztDQUUzRCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxzQkFBc0IsRUFBRSxZQUFZOztDQUVyQyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRXpCLEVBQUUsT0FBTyxTQUFTLHNCQUFzQixFQUFFLFNBQVMsR0FBRzs7Q0FFdEQsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV2RCxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUMvQixJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUMvQixJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFL0IsSUFBSSxFQUFFLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUU1QixJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRTVDLElBQUk7O0NBRUosR0FBRyxPQUFPLFNBQVMsQ0FBQzs7Q0FFcEIsR0FBRyxDQUFDOztDQUVKLEVBQUUsRUFBRTs7Q0FFSixDQUFDLFdBQVcsRUFBRSxZQUFZOztDQUUxQixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7O0NBRXpCLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ2xFLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ2xFLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ25FLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUVuRTtDQUNBOztDQUVBLEVBQUU7Q0FDRixHQUFHLEdBQUc7Q0FDTixJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3JCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLElBQUk7Q0FDSixHQUFHLEdBQUc7Q0FDTixJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3JCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLElBQUk7Q0FDSixHQUFHLEdBQUc7Q0FDTixJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3JCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLElBQUk7Q0FDSixHQUFHLEdBQUc7Q0FDTixJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3JCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLElBQUk7O0NBRUosSUFBSTs7Q0FFSixFQUFFOztDQUVGLENBQUMsU0FBUyxFQUFFLFlBQVk7O0NBRXhCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztDQUN6QixFQUFFLElBQUksR0FBRyxDQUFDOztDQUVWLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0NBQ2xELEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0NBQ2xELEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDOztDQUVsRCxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQztDQUNwRCxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQztDQUNwRCxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQzs7Q0FFdEQsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUU3QixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7O0NBRXpCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDakIsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNqQixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztDQUVqQixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLEVBQUUsaUJBQWlCLEdBQUc7O0NBRS9DO0NBQ0EsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUTtDQUN4QixHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUTs7Q0FFbEIsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRTtDQUM3RCxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0NBQzdELEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUU7Q0FDL0QsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRTs7Q0FFakUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ2xILEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztDQUNsSCxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Q0FDbEgsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7O0NBRW5ILEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7Q0FFMUQsRUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUc7O0NBRW5CLEdBQUcsSUFBSSxHQUFHLEdBQUcsb0VBQW9FLENBQUM7O0NBRWxGLEdBQUcsS0FBSyxpQkFBaUIsS0FBSyxJQUFJLEdBQUc7O0NBRXJDLElBQUksTUFBTSxJQUFJLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFM0IsSUFBSSxNQUFNOztDQUVWLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFeEIsSUFBSTs7Q0FFSixHQUFHLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDOztDQUUxQixHQUFHOztDQUVILEVBQUUsSUFBSSxNQUFNLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQzs7Q0FFdkIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztDQUN6QixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNuSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNuSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQzs7Q0FFbkksRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztDQUN6QixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNuSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNuSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQzs7Q0FFbkksRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztDQUN6QixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNuSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNwSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQzs7Q0FFcEksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztDQUMxQixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNwSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNwSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQzs7Q0FFcEksRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUV2QixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Q0FDekIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztDQUVoQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztDQUMzQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztDQUMzQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztDQUM1QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQzs7Q0FFNUMsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsaUJBQWlCLEVBQUUsWUFBWTs7Q0FFaEMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUV6QixFQUFFLElBQUksUUFBUSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzNFLEVBQUUsSUFBSSxRQUFRLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDM0UsRUFBRSxJQUFJLFFBQVEsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdB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QU8sRUFBRSxDQUFDOztDQUU3QixFQUFFLE9BQU8sU0FBUyxTQUFTLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxLQUFLLEdBQUc7O0NBRTNELEdBQUcsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Q0FFMUIsR0FBRyxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7Q0FDN0QsR0FBRyxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7Q0FDN0QsR0FBRyxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRTlEO0NBQ0EsR0FBRyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDaEMsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDOztDQUU1QixHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ3pCLEdBQUcsUUFBUSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDekIsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFekI7Q0FDQSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXZCLEdBQUcsSUFBSSxLQUFLLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztDQUN0QixHQUFHLElBQUksS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDdEIsR0FBRyxJQUFJLEtBQUssR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUV0QixHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDO0NBQ2pDLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUM7Q0FDakMsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQzs7Q0FFakMsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQztDQUNqQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDO0NBQ2pDLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUM7O0NBRWpDLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUM7Q0FDakMsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQztDQUNqQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLElBQUksS0FBSyxDQUFDOztDQUVsQyxHQUFHLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFOUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztDQUNoQixHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0NBQ2hCLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7O0NBRWhCLEdBQUcsT0FBTyxJQUFJLENBQUM7O0NBRWYsR0FBRyxDQUFDOztDQUVKLEVBQUUsRUFBRTs7Q0FFSixDQUFDLGVBQWUsRUFBRSxXQUFXLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHOztDQUVuRSxFQUFFLEtBQUssR0FBRyxLQUFLLFNBQVMsR0FBRzs7Q0FFM0IsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLHNHQUFzRyxFQUFFLENBQUM7O0NBRTFILEdBQUc7O0NBRUgsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0NBQ3pCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksS0FBSyxLQUFLLEdBQUcsSUFBSSxFQUFFLENBQUM7Q0FDdEMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxLQUFLLEdBQUcsR0FBRyxNQUFNLEVBQUUsQ0FBQzs7Q0FFdEMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssR0FBRyxJQUFJLE9BQU8sS0FBSyxHQUFHLElBQUksRUFBRSxDQUFDO0NBQzlDLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsTUFBTSxPQUFPLEdBQUcsR0FBRyxNQUFNLEVBQUUsQ0FBQztDQUM5QyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxHQUFHLElBQUksRUFBRSxLQUFLLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQztDQUM1QyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLEtBQUssR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDOztDQUU1QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDdEQsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3RELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUN2RCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFekQsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRzs7Q0FFcEUsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0NBQ3pCLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLEtBQUssR0FBRyxJQUFJLEVBQUUsQ0FBQztDQUNqQyxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUM7Q0FDakMsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDOztDQUUvQixFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUM7Q0FDL0IsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQyxDQUFDO0NBQy9CLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQzs7Q0FFN0IsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0NBQzVELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztDQUM1RCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztDQUMvRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRXZELEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLE1BQU0sRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFN0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0NBQ3pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQzs7Q0FFM0IsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVsQyxHQUFHLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxPQUFPLEtBQUssQ0FBQzs7Q0FFM0MsR0FBRzs7Q0FFSCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxTQUFTLEVBQUUsV0FBVyxLQUFLLEVBQUUsTUFBTSxHQUFHOztDQUV2QyxFQUFFLEtBQUssTUFBTSxLQUFLLFNBQVMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDOztDQUV6QyxFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRWxDLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDOztDQUU1QyxHQUFHOztDQUVILEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLE9BQU8sRUFBRSxXQUFXLEtBQUssRUFBRSxNQUFNLEdBQUc7O0NBRXJDLEVBQUUsS0FBSyxLQUFLLEtBQUssU0FBUyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7Q0FDeEMsRUFBRSxLQUFLLE1BQU0sS0FBSyxTQUFTLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQzs7Q0FFekMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUV6QixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDNUIsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNoQyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2hDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWhDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDaEMsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNoQyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2hDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWhDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDaEMsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNoQyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ2xDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRWxDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDbEMsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUNsQyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFF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Q0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztDQUNsQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7O0NBRWxDLElBQUk7O0NBRUosR0FBRyxJQUFJLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDOztDQUV0QixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7Q0FDM0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0NBQzNCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztDQUMzQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7O0NBRTNCO0NBQ0EsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHOztDQUV0QixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQzs7Q0FFbkUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0NBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0NBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0NBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDOztDQUVaLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDeEIsRUFBRSxHQUFHLEVBQUUsU0FBUyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUM1QixFQUFFLEdBQUcsRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUFFLEdBQUcs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R0FBRyxDQUFDLEVBQUUsQ0FBQzs7Q0FFeEIsRUFBRSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7O0NBRXpCLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN6QyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDekMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3pDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFekMsR0FBRyxNQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRzs7Q0FFaEMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3pDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN6QyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDekMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUV6QyxHQUFHLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUVoQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDekMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3pDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN6QyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXpDLEdBQUcsTUFBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7O0NBRWhDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN6QyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDekMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3pDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFekMsR0FBRyxNQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRzs7Q0FFaEMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3pDLEdBQUcsSUFBSSxDQUFDLEVB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LEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQzs7Q0FFdEMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7Q0FDdEIsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7Q0FDL0IsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7Q0FDL0IsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7O0NBRS9CLEdBQUcsTUFBTSxLQUFLLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRzs7Q0FFdkMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7O0NBRWhELEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0NBQy9CLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0NBQ3RCLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0NBQy9CLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDOztDQUUvQixHQUFHLE1BQU0sS0FBSyxHQUFHLEdBQUcsR0FBRyxHQUFHOztDQUUxQixHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQzs7Q0FFaEQsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFH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LEdBQUc7O0NBRUgsRUFBRSxPQUFPLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTdDLEVBQUU7O0NBRUYsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRTdCLEVBQUUsT0FBTyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDOztDQUU3QyxFQUFFOztDQUVGLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHOztDQUV4Qzs7Q0FFQSxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDckQsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVyRCxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUMxRCxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUMxRCxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUMxRCxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7Q0FFMUQsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzs7Q0FFMUIsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxFQUFFLENBQUMsR0FBRzs7Q0FFM0IsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxJQUFJLENBQUM7Q0FDN0IsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUV4QyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7O0NBRXpEOztDQUVBLEVBQUUsSUFBSSxZQUFZLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRW5FLEVBQUUsS0FBSyxZQUFZLEdBQUcsQ0FBQyxHQUFHOztDQUUxQixHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ3JCLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDckIsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNyQixHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVyQixHQUFHLFlBQVksR0FBRyxFQUFFLFlBQVks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QUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUVoRCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRTlCLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztDQUN6QyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUM7O0NBRXJCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUVsRSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0NBQ2xFLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7Q0FDbEUsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQzs7Q0FFbkUsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsZUFBZSxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUVqQyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7Q0FDekMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztDQUU3Qzs7Q0FFQSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3BDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDcEMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNwQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRXRDOztDQUVBLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO0NBQ3ZELEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdB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QUUsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQzs7Q0FFM0MsRUFBRTs7Q0FFRixDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFckIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDbkMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDbkMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRW5DLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFckIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDbkMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDbkMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRW5DLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRSxXQUFXLEdBQUcsRUFBRSxHQUFHLEdBQUc7O0NBRTlCOztDQUVBLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcs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QUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDVixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNWLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVWLEdBQUcsQ0FBQzs7Q0FFSixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxLQUFLLEVBQUUsWUFBWTs7Q0FFcEIsRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7O0NBRTNELEVBQUU7O0NBRUYsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRXRCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztDQUN6QixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUM7O0NBRXRCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUxRCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRWhDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQzs7Q0FFdEIsRUFBRSxJQUFJLENBQUMsR0FBRzs7Q0FFVixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTtDQUM1QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTtDQUM1QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTs7Q0FFN0IsR0FBRyxDQUFDOztDQUVKLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLHNCQUFzQixFQUFFLFlBQVk7O0NBRXJDLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFekIsRUFBRSxPQUFPLFNBQVMsc0JBQXNCLEVBQUUsU0FBUyxHQUFHOztDQUV0RCxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXZELElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQy9CLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQy9CLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUvQixJQUFJLEVBQUUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRTVCLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFNUMsSUFBSTs7Q0FFSixHQUFHLE9BQU8sU0FBUyxDQUFDOztDQUVwQixHQUFHLENBQUM7O0NBRUosRUFBRSxFQUFFOztDQUVKLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUUxQixFQUFFLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFMUMsRUFBRTs7Q0FFRixDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFN0IsRUFBRSxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRTFDLEVBQUU7O0NBRUYsQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRXJDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQztDQUN0QixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUM7Q0FDdEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUV6QixFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDbEQsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2xELEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFbEQsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2xELEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNsRCxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWxELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQzlDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQzlDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztDQUU5QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUM5QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUM5QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7Q0FFOUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Q0FDOUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Q0FDOUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7O0NBRTlDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFaEMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUV6QixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztDQUMzQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztDQUMzQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJ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QUNsQixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDbEIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2xCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNsQixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDbEIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVsQixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxjQUFjLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUc7O0NBRS9ELEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQztDQUMvQixFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRS9CLEVBQUUsSUFBSSxDQUFDLEdBQUc7Q0FDVixHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtDQUN2RCxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7Q0FDM0QsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDVixHQUFHLENBQUM7O0NBRUosRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLEdBQUc7O0NBRTVCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Q0FFekIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7Q0FDOUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRTlDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLE1BQU0sRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFNUIsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDO0NBQzVCLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFNUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUV6QixFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDbEQsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVsRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7Q0FDOUIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0NBQzlCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQzs7Q0FFOUIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7Q0FDaEMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7Q0FDaEMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7O0NBRWhDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLEdBQUc7O0NBRWhDLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Q0FFekIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDNUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFF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LENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQzs7Q0FFbkIsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUU5QixFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7Q0FDckQsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDOztDQUVyQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUM5RCxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUM5RCxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUMvRCxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFL0QsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsWUFBWSxFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUVuQyxFQUFFLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUM7O0NBRTNDLEVBQUU7O0NBRUYsQ0FBQywwQkFBMEIsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFNUM7O0NBRUE7O0NBRUEsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFaEMsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFckMsRUFBRSxLQUFLLENBQUMsR0FBRyxNQUFNLEdBQUc7O0NBRXBCLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDZCxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ2QsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFZCxHQUFHLE1BQU07O0NBRVQsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ3BCLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNwQixHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRXBCLEdBQUc7O0NBRUgsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsOEJBQThCLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRWhEOztDQUVBOztDQUVBLEVBQUUsSUFBSSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ3BCLEdBQUcsT0FBTyxHQUFHLElBQUk7Q0FDakIsR0FBRyxRQUFRLEdBQUcsR0FBRzs7Q0FFakIsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVE7O0NBRWxCLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0NBQzlDLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0NBQzlDLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRWhELEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLE9BQU87Q0FDeEMsU0FBUyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUU7Q0FDMUMsU0FBUyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsR0FBRzs7Q0FFN0M7Q0FDQTtDQUNBOztDQUVBLEdBQUcsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLFFBQVE7Q0FDMUMsVUFBVSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxRQUFRLEVBQUU7Q0FDNUMsVUFBVSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFH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R0FBRzs7Q0FFSDs7Q0FFQSxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxPQUFPLEdBQUcsR0FBRyxHQUFHLEVBQUU7Q0FDbEQscUJBQXFCLEVBQUUsR0FBRyxHQUFHLEdBQUcsT0FBTyxHQUFHLEdBQUcsR0FBRyxFQUFFO0NBQ2xELHFCQUFxQixFQUFFLEdBQUcsR0FBRyxHQUFHLE9BQU8sR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUM7O0NBRXJELEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUVyQztDQUNBOztDQUVBLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0NBQzdCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0NBQzdCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0NBQzdCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDOztDQUVwRCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRXJCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVuQyxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRXJCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVuQyxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxLQUFLLEVBQUUsV0FBVyxHQUFHLEVBQUUsR0FBRyxHQUFHOztDQUU5Qjs7Q0FFQSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUN4RCxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUN4RCxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUN4RCxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFeEQsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsV0FBVyxFQUFFLFlBQVk7O0NBRTFCLEVBQUUsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDOztDQUVmLEVBQUUsT0FBTyxTQUFTLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxHQUFHOztDQUVoRCxHQUFHLEtBQUssR0FBRyxLQUFLLFNBQVMsR0FBRzs7Q0FFNUIsSUFBSSxHQUFHLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztDQUN4QixJQUFJLEdBQUcsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUV4QixJQUFJOztDQUVKLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztDQUM3QyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRTdDLEdBQUcsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFakMsR0FBRyxDQUFDOztDQUVKLEVBQUUsRUFBRTs7Q0FFSixDQUFDLFdBQVcsRUFBRSxXQUFXLEdBQUcsRUFBRSxHQUFHLEdBQUc7O0NBRXBDLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUU3QixFQUFFLE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFckcsRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRSxZQUFZOztDQUVwQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDaEMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ2hDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUNoQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRWhDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLElBQUksRUFBRSxZQUFZOztDQUVuQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDL0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQy9CLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUMvQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRS9CLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRSxZQUFZOztDQUVwQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDaEMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ2hDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUNoQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRWhDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLFdBQVcsRUFBRSxZQUFZOztDQUUxQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUN2RSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUN2RSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUN2RSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFdkUsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsTUFBTSxFQUFFLFlBQVk7O0NBRXJCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7Q0FDcEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztDQUNwQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0NBQ3BCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7O0NBRXBCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFckIsRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Q0FFbkUsRUFBRTs7Q0FFRixDQUFDLFFBQVEsRUFBRSxZQUFZOztDQUV2QixFQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDOztDQUUvRSxFQUFFOztDQUVGLENBQUMsTUFBTSxFQUFFLFlBQVk7O0NBRXJCLEVBQUUsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUU1RixFQUFFOztDQUVGLENBQUMsZUFBZSxFQUFFLFlBQVk7O0NBRTlCLEVBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFM0YsRUFBRTs7Q0FFRixDQUFDLFNBQVMsRUFBRSxZQUFZOztDQUV4QixFQUFFLE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7O0NBRWpELEVBQUU7O0NBRUYsQ0FBQyxTQUFTLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0NBRWhDLEVBQUUsT0FBTyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUVuRCxFQUFFOztDQUVGLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxFQUFFLEtBQUssR0FBRzs7Q0FFN0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQztDQUNyQyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDO0NBQ3JDLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUM7Q0FDckMsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQzs7Q0FFckMsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEdBQUc7O0NBRXpDLEVBQUUsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxjQUFjLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUVyRSxFQUFFOztDQUVGLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUV4QixFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUc7O0NBRWxHLEVBQUU7O0NBRUYsQ0FBQyxTQUFTLEVBQUUsV0FBVyxLQUFLLEVBQUUsTUFBTSxHQUFHOztDQUV2QyxFQUFFLEtBQUssTUFBTSxLQUFLLFNBQVMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDOztDQUV6QyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDO0NBQzNCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO0NBQy9CLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO0NBQy9CLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDOztDQUUvQixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxPQUFPLEVBQUUsV0FBVyxLQUFLLEVBQUUsTUFBTSxHQUFHOztDQUVyQyxFQUFFLEtBQUssS0FBSyxLQUFLLFNBQVMsR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDO0NBQ3hDLEVBQUUsS0FBSyxNQUFNLEtBQUssU0FBUyxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUM7O0NBRXpDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7Q0FDM0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7Q0FDL0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7Q0FDL0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7O0NBRS9CLEVBQUUsT0FBTyxLQUFLLENBQUM7O0NBRWYsRUFBRTs7Q0FFRixDQUFDLG1CQUFtQixFQUFFLFdBQVcsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUc7O0NBRTVELEVBQUUsS0FBSyxNQUFNLEtBQUssU0FBUyxHQUFHOztDQUU5QixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUscUVBQXFFLEVBQUUsQ0FBQzs7Q0FFekYsR0FBRzs7Q0FFSCxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztDQUNuQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztDQUNuQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztDQUNuQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFbkMsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsRUFBRSxDQUFDOztDQUVKO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7O0NBRUE7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBLFNBQVMsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLEdBQUc7O0NBRXJELENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Q0FDcEIsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQzs7Q0FFdEIsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDO0NBQ25ELENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7O0NBRTFCLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFcEQsQ0FBQyxPQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQzs7Q0FFekIsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxTQUFTLEtBQUssU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDOztDQUV6RSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQzs7Q0FFNUwsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxXQUFXLEtBQUssU0FBUyxHQUFHLE9BQU8sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0NBQ25GLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxLQUFLLFNBQVMsR0FBRyxPQUFPLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztDQUN6RixDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLFlBQVksS0FBSyxTQUFTLEdBQUcsT0FBTyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7O0NBRXRGLENBQUM7O0NBRUQsaUJBQWlCLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsU0FBUyxFQUFFLEVBQUU7O0NBRXpGLENBQUMsV0FBVyxFQUFFLGlCQUFpQjs7Q0FFL0IsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJOztDQUUxQixDQUFDLE9BQU8sRUFBRSxXQUFXLEtBQUssRUFBRSxNQUFNLEdBQUc7O0NBRXJDLEVBQUUsS0FBSyxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLE1BQU0sR0FBRzs7Q0FFeEQsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztDQUN0QixHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDOztDQUV4QixHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7Q0FFbEIsR0FBRzs7Q0FFSCxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDO0NBQzNDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRTFDLEVBQUU7O0NBRUYsQ0FBQyxLQUFLLEVBQUUsWUFBWTs7Q0FFcEIsRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFN0MsRUFBRTs7Q0FFRixDQUFDLElBQUksRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFM0IsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7Q0FDNUIsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7O0NBRTlCLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDOztDQUV4QyxFQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7Q0FFeEMsRUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7Q0FDeEMsRUFBRSxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7Q0FDNUMsRUFBRSxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7O0NBRTFDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLE9BQU8sRUFBRSxZQUFZOztDQUV0QixFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQzs7Q0FFNUMsRUFBRTs7Q0FFRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSjtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxxQkFBcUIsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sR0FBRzs7Q0FFekQsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUM7O0NBRXhELENBQUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUM7Q0FDekIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDOztDQUU1QixDQUFDOztDQUVELHFCQUFxQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxDQUFDO0NBQy9FLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcscUJBQXFCLENBQUM7O0NBRXBFLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUM7O0NBRS9EO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLFdBQVcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsR0FBRzs7Q0FFN0gsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFN0csQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFM0QsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsS0FBSyxTQUFTLEdBQUcsU0FBUyxHQUFHLGFBQWEsQ0FBQztDQUN0RSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxLQUFLLFNBQVMsR0FBRyxTQUFTLEdBQUcsYUFBYSxDQUFDOztDQUV0RSxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0NBQzlCLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Q0FDcEIsQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQzs7Q0FFMUIsQ0FBQzs7Q0FFRCxXQUFXLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO0NBQzNELFdBQVcsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQzs7Q0FFaEQsV0FBVyxDQUFDLFNBQVMsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDOztDQUUzQztDQUNBO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHOztDQUUxQixDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEtBQUssU0FBUyxLQUFLLEdBQUcsR0FBRyxJQUFJLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDO0NBQzVGLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsS0FBSyxTQUFTLEtBQUssR0FBRyxHQUFHLElBQUksT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRTVGLENBQUM7O0NBRUQsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFOztDQUUvQixDQUFDLE1BQU0sRUFBRSxJQUFJOztDQUViLENBQUMsR0FBRyxFQUFFLFdBQVcsR0FBRyxFQUFFLEdBQUcsR0FBRzs7Q0FFNUIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN2QixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUV2QixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxZQUFZLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRWxDLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxRQUFRLENBQUM7Q0FDeEIsRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLFFBQVEsQ0FBQztDQUN4QixFQUFFLElBQUksSUFBSSxHQUFHLEVBQUUsUUFBUSxDQUFDOztDQUV4QixFQUFFLElBQUksSUFBSSxHQUFHLEVBQUUsUUFBUSxDQUFDO0NBQ3hCLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxRQUFRLENBQUM7Q0FDeEIsRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLFFBQVEsQ0FBQzs7Q0FFeEIsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUc7O0NBRXJELEdBQUcsSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ3RCLEdBQUcsSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztDQUMxQixHQUFHLElBQUksQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0NBRTFCLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7Q0FDNUIsR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztDQUM1QixHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDOztDQUU1QixHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0NBQzVCLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7Q0FDNUIsR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQzs7Q0FFNUIsR0FBRzs7Q0FFSCxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7Q0FDbkMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUVuQyxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxzQkFBc0IsRUFBRSxXQUFXLFNBQVMsR0FBRzs7Q0FFaEQsRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLFFBQVEsQ0FBQztDQUN4QixFQUFFLElBQUksSUFBSSxHQUFHLEVBQUUsUUFBUSxDQUFDO0NBQ3hCLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxRQUFRLENBQUM7O0NBRXhCLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxRQUFRLENBQUM7Q0FDeEIsRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLFFBQVEsQ0FBQztDQUN4QixFQUFFLElBQUksSUFBSSxHQUFHLEVBQUUsUUFBUSxDQUFDOztDQUV4QixFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXRELEdBQUcsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUMvQixHQUFHLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDL0IsR0FBRyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUvQixHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0NBQzVCLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7Q0FDNUIsR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQzs7Q0FFNUIsR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztDQUM1QixHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0NBQzVCLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7O0NBRTVCLEdBQUc7O0NBRUgsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFbkMsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsYUFBYSxFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUVwQyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7Q0FFbkIsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV0RCxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRXJDLEdBQUc7O0NBRUgsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsb0JBQW9CLEVBQUUsWUFBWTs7Q0FFbkMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUV6QixFQUFFLE9BQU8sU0FBUyxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsSUFBSSxHQUFHOztDQUV2RCxHQUFHLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUV4RCxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQztDQUMzQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFM0MsR0FBRyxPQUFPLElBQUksQ0FBQzs7Q0FFZixHQUFHLENBQUM7O0NBRUosRUFBRSxFQUFFOztDQUVKLENBQUMsYUFBYSxFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUVwQyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7Q0FFbkIsRUFBRSxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRXZDLEVBQUU7O0NBRUYsQ0FBQyxLQUFLLEVBQUUsWUFBWTs7Q0FFcEIsRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFN0MsRUFBRTs7Q0FFRixDQUFDLElBQUksRUFBRSxXQUFXLEdBQUcsR0FBRzs7Q0FFeEIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDM0IsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7O0NBRTNCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLFNBQVMsRUFBRSxZQUFZOztDQUV4QixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDO0NBQ3BELEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUM7O0NBRXBELEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLE9BQU8sRUFBRSxZQUFZOztDQUV0Qjs7Q0FFQSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRW5HLEVBQUU7O0NBRUYsQ0FBQyxTQUFTLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0NBRWhDLEVBQUUsS0FBSyxNQUFNLEtBQUssU0FBUyxHQUFHOztDQUU5QixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsaURBQWlELEVBQUUsQ0FBQztDQUNyRSxHQUFHLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUUxQixHQUFHOztDQUVILEVBQUUsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUVoSCxFQUFFOztDQUVGLENBQUMsT0FBTyxFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUU5QixFQUFFLEtBQUssTUFBTSxLQUFLLFNBQVMsR0FBRzs7Q0FFOUIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLCtDQUErQyxFQUFFLENBQUM7Q0FDbkUsR0FBRyxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFMUIsR0FBRzs7Q0FFSCxFQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUUxRixFQUFFOztDQUVGLENBQUMsYUFBYSxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUVuQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDO0NBQ3hCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRXhCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLGNBQWMsRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFckMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQztDQUN6QixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUV6QixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxjQUFjLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0NBRXJDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQztDQUNqQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUUvQixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxjQUFjLEVBQUUsWUFBWTs7Q0FFN0I7Q0FDQTs7Q0FFQSxFQUFFLElBQUksS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7O0NBRWxCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFekIsRUFBRSxTQUFTLFFBQVEsRUFBRSxJQUFJLEdBQUc7O0NBRTVCLEdBQUcsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Q0FFaEMsR0FBRyxLQUFLLFFBQVEsS0FBSyxTQUFTLEdBQUc7O0NBRWpDLElBQUksS0FBSyxRQUFRLENBQUMsVUFBVSxHQUFHOztDQUUvQixLQUFLLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7O0NBRXRDLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXJELE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUMvQixNQUFNLEVBQUUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDOztDQUUxQyxNQUFNLEtBQUssQ0FBQyxhQUFhLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRWhDLE1BQU07O0NBRU4sS0FBSyxNQUFNLEtBQUssUUFBUSxDQUFDLGdCQUFnQixHQUFHOztDQUU1QyxLQUFLLElBQUksU0FBUyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDOztDQUVsRCxLQUFLLEtBQUssU0FBUyxLQUFLLFNBQVMsR0FBRzs7Q0FFcEMsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFdEQsT0FBTyxFQUFFLENBQUMsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7O0NBRS9FLE9BQU8sS0FBSyxDQUFDLGFBQWEsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFakMsT0FBTzs7Q0FFUCxNQUFNOztDQUVOLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHOztDQUVILEVBQUUsT0FBTyxTQUFTLGNBQWMsRUFBRSxNQUFNLEdBQUc7O0NBRTNDLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQzs7Q0FFaEIsR0FBRyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXBDLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFL0IsR0FBRyxPQUFPLElBQUksQ0FBQzs7Q0FFZixHQUFHLENBQUM7O0NBRUosRUFBRSxFQUFFOztDQUVKLENBQUMsYUFBYSxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUVuQyxFQUFFLE9BQU8sS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNyRCxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDL0MsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQzs7Q0FFL0QsRUFBRTs7Q0FFRixDQUFDLFdBQVcsRUFBRSxXQUFXLEdBQUcsR0FBRzs7Q0FFL0IsRUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUMzRCxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNyRCxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDOztDQUV0RCxFQUFFOztDQUVGLENBQUMsWUFBWSxFQUFFLFdBQVcsS0FBSyxFQUFFLE1BQU0sR0FBRzs7Q0FFMUM7Q0FDQTs7Q0FFQSxFQUFFLEtBQUssTUFBTSxLQUFLLFNBQVMsR0FBRzs7Q0FFOUIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLG9EQUFvRCxFQUFFLENBQUM7Q0FDeEUsR0FBRyxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFMUIsR0FBRzs7Q0FFSCxFQUFFLE9BQU8sTUFBTSxDQUFDLEdBQUc7Q0FDbkIsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Q0FDekQsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Q0FDekQsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Q0FDekQsR0FBRyxDQUFDOztDQUVKLEVBQUU7O0NBRUYsQ0FBQyxhQUFhLEVBQUUsV0FBVyxHQUFHLEdBQUc7O0NBRWpDO0NBQ0EsRUFBRSxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUN6RCxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNuRCxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUM7O0NBRW5FLEVBQUU7O0NBRUYsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLFlBQVk7O0NBRWpDLEVBQUUsSUFBSSxZQUFZLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFbkMsRUFBRSxPQUFPLFNBQVMsZ0JBQWdCLEVBQUUsTUFBTSxHQUFHOztDQUU3QztDQUNBLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDOztDQUVsRDtDQUNBLEdBQUcsT0FBTyxZQUFZLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUUvRixHQUFHLENBQUM7O0NBRUosRUFBRSxJQUFJOztDQUVOLENBQUMsZUFBZSxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUVyQztDQUNBOztDQUVBLEVBQUUsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDOztDQUVmLEVBQUUsS0FBSyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUc7O0NBRTVCLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQ3JDLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDOztDQUVyQyxHQUFHLE1BQU07O0NBRVQsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDckMsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7O0NBRXJDLEdBQUc7O0NBRUgsRUFBRSxLQUFLLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRzs7Q0FFNUIsR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDdEMsR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7O0NBRXRDLEdBQUcsTUFBTTs7Q0FFVCxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztDQUN0QyxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzs7Q0FFdEMsR0FBRzs7Q0FFSCxFQUFFLEtBQUssS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHOztDQUU1QixHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztDQUN0QyxHQUFHLEdBQUcsSUFBSSxLQUFL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RUFBRSxRQUFRLEdBQUc7O0NBRWpELEdBQUcsS0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUc7O0NBRXpCLElBQUksT0FBTyxLQUFLLENBQUM7O0NBRWpCLElBQUk7O0NBRUo7Q0FDQSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDNUIsR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRTFDO0NBQ0EsR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDdkMsR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDdkMsR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRXZDO0NBQ0EsR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUMzQixHQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQzNCLEdBQUcsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRTNCO0NBQ0E7Q0FDQTtDQUNBLEdBQUcsSUFBSSxJQUFJLEdBQUc7Q0FDZCxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztDQUNyRCxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxF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QSxHQUFHLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLE9BQU8sSUFBSSxDQUFDOztDQUVyQztDQUNBLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQztDQUNoRixHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDaEYsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDO0NBQ2hGLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQztDQUNoRixHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDaEYsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDO0NBQ2hGLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQztDQUNoRixHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRWhGLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFaEMsR0FBRyxPQUFPLElBQUksQ0FBQzs7Q0FFZixHQUFHLENBQUM7O0NBRUosRUFBRSxFQUFFOztDQUVKLENBQUMsU0FBUyxFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUVoQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDO0NBQ3pCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRXpCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLE1BQU0sRUFBRSxXQUFXLEdBQUcsR0FBRzs7Q0FFMUIsRUFBRSxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7O0NBRWxFLEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7O0NBRUo7Q0FDQTtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRzs7Q0FFbEMsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsTUFBTSxLQUFLLFNBQVMsS0FBSyxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztDQUNqRSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxNQUFNLEtBQUssU0FBUyxLQUFLLE1BQU0sR0FBRyxDQUFDLENBQUM7O0NBRXJELENBQUM7O0NBRUQsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFOztDQUVqQyxDQUFDLEdBQUcsRUFBRSxXQUFXLE1BQU0sRUFBRSxNQUFNLEdBQUc7O0NBRWxDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDN0IsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQzs7Q0FFdkIsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsYUFBYSxFQUFFLFlBQVk7O0NBRTVCLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQzs7Q0FFdkIsRUFBRSxPQUFPLFNBQVMsYUFBYSxFQUFFLE1BQU0sRUFBRSxjQUFjLEdBQUc7O0NBRTFELEdBQUcsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7Q0FFNUIsR0FBRyxLQUFLLGNBQWMsS0FBSyxTQUFTLEdBQUc7O0NBRXZDLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsQ0FBQzs7Q0FFbEMsSUFBSSxNQUFNOztDQUVWLElBQUksR0FBRyxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRXBELElBQUk7O0NBRUosR0FBRyxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUM7O0NBRXZCLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFdkQsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRW5GLElBQUk7O0NBRUosR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUM7O0NBRTFDLEdBQUcsT0FBTyxJQUFJLENBQUM7O0NBRWYsR0FBRyxDQUFDOztDQUVKLEVBQUUsRUFBRTs7Q0FFSixDQUFDLEtBQUssRUFBRSxZQUFZOztDQUVwQixFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUU3QyxFQUFFOztDQUVGLENBQUMsSUFBSSxFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUUzQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztDQUNwQyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQzs7Q0FFOUIsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsS0FBSyxFQUFFLFlBQVk7O0NBRXBCLEVBQUUsU0FBUyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRzs7Q0FFOUIsRUFBRTs7Q0FFRixDQUFDLGFBQWEsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFbkMsRUFBRSxTQUFTLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUc7O0NBRXJGLEVBQUU7O0NBRUYsQ0FBQyxlQUFlLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRXJDLEVBQUUsU0FBUyxLQUFLLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHOztDQUUzRCxFQUFFOztDQUVGLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0NBRXZDLEVBQUUsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDOztDQUU5QyxFQUFFLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sU0FBUyxHQUFHLFNBQVMsRUFBRSxDQUFDOztDQUVyRixFQUFFOztDQUVGLENBQUMsYUFBYSxFQUFFLFdBQVcsR0FBRyxHQUFHOztDQUVqQyxFQUFFLE9BQU8sR0FBRyxDQUFDLGdCQUFnQixFQUFFLElBQUksRUFBRSxDQUFDOztDQUV0QyxFQUFFOztDQUVGLENBQUMsZUFBZSxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUVyQyxFQUFFLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUM7O0NBRXpFLEVBQUU7O0NBRUYsQ0FBQyxVQUFVLEVBQUUsV0FBVyxLQUFLLEVBQUUsTUFBTSxHQUFHOztDQUV4QyxFQUFFLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRTdELEVBQUUsS0FBSyxNQUFNLEtBQUssU0FBUyxHQUFHOztDQUU5QixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsb0RBQW9ELEVBQUUsQ0FBQztDQUN4RSxHQUFHLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUUxQixHQUFHOztDQUVILEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFdkIsRUFBRSxLQUFLLGFBQWEsS0FBSyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRzs7Q0FFdkQsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUN6QyxHQUFHLE1BQU0sQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRTNELEdBQUc7O0NBRUgsRUFBRSxPQUFPLE1BQU0sQ0FBQzs7Q0FFaEIsRUFBRTs7Q0FFRixDQUFDLGNBQWMsRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFckMsRUFBRSxLQUFLLE1BQU0sS0FBSyxTQUFTLEdBQUc7O0NBRTlCLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSx3REFBd0QsRUFBRSxDQUFDO0NBQzVFLEdBQUcsTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7O0NBRXZCLEdBQUc7O0NBRUgsRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQ3pDLEVBQUUsTUFBTSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRXZDLEVBQUUsT0FBTyxNQUFNLENBQUM7O0NBRWhCLEVBQUU7O0NBRUYsQ0FBQyxZQUFZLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0NBRW5DLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDckMsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixFQUFFLENBQUM7O0NBRXpELEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLFNBQVMsRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFaEMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFNUIsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsTUFBTSxFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUU3QixFQUFFLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUVsRixFQUFFOztDQUVGLENBQUMsRUFBRSxDQUFDOztDQUVKO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxHQUFHOztDQUVuQzs7Q0FFQSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxNQUFNLEtBQUssU0FBUyxLQUFLLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzFFLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLFFBQVEsS0FBSyxTQUFTLEtBQUssUUFBUSxHQUFHLENBQUMsQ0FBQzs7Q0FFM0QsQ0FBQzs7Q0FFRCxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUU7O0NBRWhDLENBQUMsR0FBRyxFQUFFLFdBQVcsTUFBTSxFQUFFLFFBQVEsR0FBRzs7Q0FFcEMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztDQUM3QixFQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDOztDQUUzQixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRXhDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUM3QixFQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDOztDQUVwQixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyw2QkFBNkIsRUFBRSxXQUFXLE1BQU0sRUFBRSxLQUFLLEdBQUc7O0NBRTNELEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDN0IsRUFBRSxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRTdDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLHFCQUFxQixFQUFFLFlBQVk7O0NBRXBDLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztDQUN6QixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRXpCLEVBQUUsT0FBTyxTQUFTLHFCQUFxQixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHOztDQUVuRCxHQUFHLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDOztDQUVqRjs7Q0FFQSxHQUFHLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRW5ELEdBQUcsT0FBTyxJQUFJLENBQUM7O0NBRWYsR0FBRyxDQUFDOztDQUVKLEVBQUUsRUFBRTs7Q0FFSixDQUFDLEtBQUssRUFBRSxZQUFZOztDQUVwQixFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUU3QyxFQUFFOztDQUVGLENBQUMsSUFBSSxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUUxQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztDQUNuQyxFQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQzs7Q0FFakMsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsU0FBUyxFQUFFLFlBQVk7O0NBRXhCOztDQUVBLEVBQUUsSUFBSSxtQkFBbUIsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztDQUN2RCxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLG1CQUFtQixFQUFFLENBQUM7Q0FDcEQsRUFBRSxJQUFJLENBQUMsUUFBUSxJQUFJLG1CQUFtQixDQUFDOztDQUV2QyxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxNQUFNLEVBQUUsWUFBWTs7Q0FFckIsRUFBRSxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0NBQ3ZCLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7Q0FFdkIsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsZUFBZSxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUVyQyxFQUFFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Q0FFbEQsRUFBRTs7Q0FFRixDQUFDLGdCQUFnQixFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUV2QyxFQUFFLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQzs7Q0FFL0QsRUFBRTs7Q0FFRixDQUFDLFlBQVksRUFBRSxXQUFXLEtBQUssRUFBRSxNQUFNLEdBQUc7O0NBRTFDLEVBQUUsS0FBSyxNQUFNLEtBQUssU0FBUyxHQUFHOztDQUU5QixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUscURBQXFELEVBQUUsQ0FBQztDQUN6RSxHQUFHLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUUxQixHQUFHOztDQUVILEVBQUUsT0FBTyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxjQUFjLEVBQUUsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUVuRyxFQUFFOztDQUVGLENBQUMsYUFBYSxFQUFFLFlBQVk7O0NBRTVCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFekIsRUFBRSxPQUFPLFNBQVMsYUFBYSxFQUFFLElBQUksRUFBRSxNQUFNLEdBQUc7O0NBRWhELEdBQUcsS0FBSyxNQUFNLEtBQUssU0FBUyxHQUFHOztDQUUvQixJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsc0RBQXNELEVBQUUsQ0FBQztDQUMzRSxJQUFJLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUUzQixJQUFJOztDQUVKLEdBQUcsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFcEMsR0FBRyxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQzs7Q0FFbEQsR0FBRyxLQUFLLFdBQVcsS0FBSyxDQUFDLEdBQUc7O0NBRTVCO0NBQ0EsSUFBSSxLQUFLLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRzs7Q0FFcEQsS0FBSyxPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDOztDQUV0QyxLQUFLOztDQUVMO0NBQ0EsSUFBSSxPQUFPLFNBQVMsQ0FBQzs7Q0FFckIsSUFBSTs7Q0FFSixHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxXQUFXLENBQUM7O0NBRTdFLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUc7O0NBRXpCLElBQUksT0FBTyxTQUFTLENBQUM7O0NBRXJCLElBQUk7O0NBRUosR0FBRyxPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRXpFLEdBQUcsQ0FBQzs7Q0FFSixFQUFFLEVBQUU7O0NBRUosQ0FBQyxjQUFjLEVBQUUsV0FBVyxJQUFJLEdBQUc7O0NBRW5DOztDQUVBLEVBQUUsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Q0FDckQsRUFBRSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7Q0FFakQsRUFBRSxPQUFPLEVBQUUsU0FBUyxHQUFHLENBQUMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxRQUFRLE9BQU8sR0FBRyxDQUFDLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDOztDQUU5RSxFQUFFOztDQUVGLENBQUMsYUFBYSxFQUFFLFdBQVcsR0FBRyxHQUFHOztDQUVqQyxFQUFFLE9BQU8sR0FBRyxDQUFDLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFckMsRUFBRTs7Q0FFRixDQUFDLGdCQUFnQixFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUV2QyxFQUFFLE9BQU8sTUFBTSxDQUFDLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFeEMsRUFBRTs7Q0FFRixDQUFDLGFBQWEsRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFcEMsRUFBRSxLQUFLLE1BQU0sS0FBSyxTQUFTLEdBQUc7O0NBRTlCLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxzREFBc0QsRUFBRSxDQUFDO0NBQzFFLEdBQUcsTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRTFCLEdBQUc7O0NBRUgsRUFBRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzs7Q0FFdEUsRUFBRTs7Q0FFRixDQUFDLFlBQVksRUFBRSxZQUFZOztDQUUzQixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Q0FDekIsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUV6QixFQUFFLE9BQU8sU0FBUyxZQUFZLEVBQUUsTUFBTSxFQUFFLG9CQUFvQixHQUFHOztDQUUvRCxHQUFHLElBQUksWUFBWSxHQUFHLG9CQUFvQixJQUFJLEVBQUUsQ0FBQyxlQUFlLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRTNFLEdBQUcsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRXhFLEdBQUcsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7O0NBRXJFLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLGNBQWMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRWxELEdBQUcsT0FBTyxJQUFJLENBQUM7O0NBRWYsR0FBRyxDQUFDOztDQUVKLEVBQUUsRUFBRTs7Q0FFSixDQUFDLFNBQVMsRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFaEMsRUFBRSxJQUFJLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUU3QyxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxNQUFNLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRTVCLEVBQUUsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sS0FBSyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7O0NBRXBGLEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7O0NBRUo7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRzs7Q0FFM0MsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHOztDQUVmLEVBQUUsRUFBRSxFQUFFLEtBQUssU0FBUyxLQUFLLEVBQUUsR0FBRyxJQUFJLEtBQUssRUFBRTtDQUN6QyxFQUFFLEVBQUUsRUFBRSxLQUFLLFNBQVMsS0FBSyxFQUFFLEdBQUcsSUFBSSxLQUFLLEVBQUU7Q0FDekMsRUFBRSxFQUFFLEVBQUUsS0FBSyxTQUFTLEtBQUssRUFBRSxHQUFHLElBQUksS0FBSyxFQUFFO0NBQ3pDLEVBQUUsRUFBRSxFQUFFLEtBQUssU0FBUyxLQUFLLEVBQUUsR0FBRyxJQUFJLEtBQUssRUFBRTtDQUN6QyxFQUFFLEVBQUUsRUFBRSxLQUFLLFNBQVMsS0FBSyxFQUFFLEdBQUcsSUFBSSxLQUFLLEVBQUU7Q0FDekMsRUFBRSxFQUFFLEVBQUUsS0FBSyxTQUFTLEtBQUssRUFBRSxHQUFHLElBQUksS0FBSyxFQUFFOztDQUV6QyxFQUFFLENBQUM7O0NBRUgsQ0FBQzs7Q0FFRCxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUU7O0NBRWxDLENBQUMsR0FBRyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUc7O0NBRTFDLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7Q0FFM0IsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ3pCLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUN6QixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDekIsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ3pCLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUN6QixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRXpCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRSxZQUFZOztDQUVwQixFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUU3QyxFQUFFOztDQUVGLENBQUMsSUFBSSxFQUFFLFdBQVcsT0FBTyxHQUFHOztDQUU1QixFQUFFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7O0NBRTNCLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFakMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFM0MsR0FBRzs7Q0FFSCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRS9CLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztDQUMzQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUM7Q0FDdEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDakUsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDakUsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDckUsRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRXpFLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7Q0FDekYsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUN6RixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHLElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO0NBQ3pGLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7Q0FDekYsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUMxRixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsSUFBSSxHQUFHLElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDOztDQUUxRixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxnQkFBZ0IsRUFBRSxZQUFZOztDQUUvQixFQUFFLElBQUksTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7O0NBRTVCLEVBQUUsT0FBTyxTQUFTLGdCQUFnQixFQUFFLE1BQU0sR0FBRzs7Q0FFN0MsR0FBRyxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDOztDQUVsQyxHQUFHLEtBQUssUUFBUSxDQUFDLGNBQWMsS0FBSyxJQUFJO0NBQ3hDLElBQUksUUFBUSxDQUFDLHFCQUFxQixFQUFFLENBQUM7O0NBRXJDLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsY0FBYyxFQUFFO0NBQ3pDLEtBQUssWUFBWSxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7Q0FFeEMsR0FBRyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFMUMsR0FBRyxDQUFDOztDQUVKLEVBQUUsRUFBRTs7Q0FFSixDQUFDLGdCQUFnQixFQUFFLFlBQVk7O0NBRS9CLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQzs7Q0FFNUIsRUFBRSxPQUFPLFNBQVMsZ0JBQWdCLEVBQUUsTUFBTSxHQUFHOztDQUU3QyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDaEMsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLGtCQUFrQixDQUFDO0NBQ3RDLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7O0NBRTdDLEdBQUcsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRTFDLEdBQUcsQ0FBQzs7Q0FFSixFQUFFLEVBQUU7O0NBRUosQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFdkMsRUFBRSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0NBQzNCLEVBQUUsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztDQUM3QixFQUFFLElBQUksU0FBUyxHQUFHLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQzs7Q0FFbEMsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVqQyxHQUFHLElBQUksUUFBUSxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxlQUFlLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRXhELEdBQUcsS0FBSyxRQUFRLEdBQUcsU0FBUyxHQUFHOztDQUUvQixJQUFJLE9BQU8sS0FBSyxDQUFDOztDQUVqQixJQUFJOztDQUVKLEdBQUc7O0NBRUgsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsYUFBYSxFQUFFLFlBQVk7O0NBRTVCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUU7Q0FDeEIsR0FBRyxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFdEIsRUFBRSxPQUFPLFNBQVMsYUFBYSxFQUFFLEdBQUcsR0FBRzs7Q0FFdkMsR0FBRyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDOztDQUU1QixHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRWxDLElBQUksSUFBSSxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUU1QixJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQ3RELElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDdEQsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztDQUN0RCxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQ3RELElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDdEQsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzs7Q0FFdEQsSUFBSSxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsZUFBZSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ3pDLElBQUksSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLGVBQWUsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFekM7O0NBRUEsSUFBSSxLQUFLLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRzs7Q0FFNUIsS0FBSyxPQUFPLEtBQUssQ0FBQzs7Q0FFbEIsS0FBSzs7Q0FFTCxJQUFJOztDQUVKLEdBQUcsT0FBTyxJQUFJLENBQUM7O0NBRWYsR0FBRyxDQUFDOztDQUVKLEVBQUUsRUFBRTs7Q0FFSixDQUFDLGFBQWEsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFbkMsRUFBRSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDOztDQUUzQixFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRWpDLEdBQUcsS0FBSyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsZUFBZSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRzs7Q0FFbkQsSUFBSSxPQUFPLEtBQUssQ0FBQzs7Q0FFakIsSUFBSTs7Q0FFSixHQUFHOztDQUVILEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSixJQUFJLGlCQUFpQixHQUFHLGtGQUFrRixDQUFDOztDQUUzRyxJQUFJLHNCQUFzQixHQUFHLDhEQUE4RCxDQUFDOztDQUU1RixJQUFJLGtCQUFrQixHQUFHLDBFQUEwRSxDQUFDOztDQUVwRyxJQUFJLGNBQWMsR0FBRyw0YUFBNGEsQ0FBQzs7Q0FFbGMsSUFBSSxtQkFBbUIsR0FBRyx1RkFBdUYsQ0FBQzs7Q0FFbEgsSUFBSSxZQUFZLEdBQUcsMENBQTBDLENBQUM7O0NBRTlELElBQUksa0JBQWtCLEdBQUcseUNBQXlDLENBQUM7O0NBRW5FLElBQUksS0FBSyxHQUFHLG83TEFBbzdMLENBQUM7O0NBRWo4TCxJQUFJLHFCQUFxQixHQUFHLDQ1QkFBNDVCLENBQUM7O0NBRXo3QixJQUFJLHdCQUF3QixHQUFHLDBqQkFBMGpCLENBQUM7O0NBRTFsQixJQUFJLDZCQUE2QixHQUFHLDRMQUE0TCxDQUFDOztDQUVqTyxJQUFJLDJCQUEyQixHQUFHLHFIQUFxSCxDQUFDOztDQUV4SixJQUFJLHNCQUFzQixHQUFHLDJIQUEySCxDQUFDOztDQUV6SixJQUFJLGNBQWMsR0FBRyx5REFBeUQsQ0FBQzs7Q0FFL0UsSUFBSSxtQkFBbUIsR0FBRyxvREFBb0QsQ0FBQzs7Q0FFL0UsSUFBSSxpQkFBaUIsR0FBRyxrREFBa0QsQ0FBQzs7Q0FFM0UsSUFBSSxZQUFZLEdBQUcscURBQXFELENBQUM7O0NBRXpFLElBQUksTUFBTSxHQUFHLDJyRUFBMnJFLENBQUM7O0NBRXpzRSxJQUFJLDJCQUEyQixHQUFHLG9sSUFBb2xJLENBQUM7O0NBRXZuSSxJQUFJLG9CQUFvQixHQUFHLGdJQUFnSSxDQUFDOztDQUU1SixJQUFJLDJCQUEyQixHQUFHLG1KQUFtSixDQUFDOztDQUV0TCxJQUFJLHNCQUFzQixHQUFHLG1LQUFtSyxDQUFDOztDQUVqTSxJQUFJLG9CQUFvQixHQUFHLDhNQUE4TSxDQUFDOztDQUUxTyxJQUFJLHlCQUF5QixHQUFHLG9FQUFvRSxDQUFDOztDQUVyRyxJQUFJLGtCQUFrQixHQUFHLHlEQUF5RCxDQUFDOztDQUVuRixJQUFJLHVCQUF1QixHQUFHLCt1RkFBK3VGLENBQUM7O0NBRTl3RixJQUFJLGVBQWUsR0FBRyxncURBQWdxRCxDQUFDOztDQUV2ckQsSUFBSSxvQkFBb0IsR0FBRyw4b0JBQThvQixDQUFDOztDQUUxcUIsSUFBSSxrQkFBa0IsR0FBRyxnT0FBZ08sQ0FBQzs7Q0FFMVAsSUFBSSxhQUFhLEdBQUcsc2dCQUFzZ0IsQ0FBQzs7Q0FFM2hCLElBQUksVUFBVSxHQUFHLHFEQUFxRCxDQUFDOztDQUV2RSxJQUFJLGVBQWUsR0FBRyxxREFBcUQsQ0FBQzs7Q0FFNUUsSUFBSSxZQUFZLEdBQUcsOFNBQThTLENBQUM7O0NBRWxVLElBQUksaUJBQWlCLEdBQUcsMk1BQTJNLENBQUM7O0NBRXBPLElBQUkseUJBQXlCLEdBQUcseVlBQXlZLENBQUM7O0NBRTFhLElBQUksaUJBQWlCLEdBQUcsOEhBQThILENBQUM7O0NBRXZKLElBQUksc0JBQXNCLEdBQUcsZ0dBQWdHLENBQUM7O0NBRTlILElBQUkscUJBQXFCLEdBQUcsd3VFQUF3dUUsQ0FBQzs7Q0FFcndFLElBQUksaUJBQWlCLEdBQUcscXBIQUFxcEgsQ0FBQzs7Q0FFOXFILElBQUksZ0JBQWdCLEdBQUcsazVHQUFrNUcsQ0FBQzs7Q0FFMTZHLElBQUkscUJBQXFCLEdBQUcsdU1BQXVNLENBQUM7O0NBRXBPLElBQUksMEJBQTBCLEdBQUcsNDZDQUE0NkMsQ0FBQzs7Q0FFOThDLElBQUksd0JBQXdCLEdBQUcsNmlCQUE2aUIsQ0FBQzs7Q0FFN2tCLElBQUksNkJBQTZCLEdBQUcsOHVKQUE4dUosQ0FBQzs7Q0FFbnhKLElBQUkscUJBQXFCLEdBQUcsNnhGQUE2eEYsQ0FBQzs7Q0FFMXpGLElBQUksb0JBQW9CLEdBQUcsMHlCQUEweUIsQ0FBQzs7Q0FFdDBCLElBQUksbUJBQW1CLEdBQUcsNlBBQTZQLENBQUM7O0NBRXhSLElBQUksb0JBQW9CLEdBQUcseUlBQXlJLENBQUM7O0NBRXJLLElBQUkseUJBQXlCLEdBQUcseUlBQXlJLENBQUM7O0NBRTFLLElBQUksdUJBQXVCLEdBQUcsdUlBQXVJLENBQUM7O0NBRXRLLElBQUksa0JBQWtCLEdBQUcsdVBBQXVQLENBQUM7O0NBRWpSLElBQUksWUFBWSxHQUFHLHFKQUFxSixDQUFDOztDQUV6SyxJQUFJLGlCQUFpQixHQUFHLG9EQUFvRCxDQUFDOztDQUU3RSxJQUFJLHFCQUFxQixHQUFHLHlNQUF5TSxDQUFDOztDQUV0TyxJQUFJLDBCQUEwQixHQUFHLGlGQUFpRixDQUFDOztDQUVuSCxJQUFJLHFCQUFxQixHQUFHLHdLQUF3SyxDQUFDOztDQUVyTSxJQUFJLDBCQUEwQixHQUFHLG9FQUFvRSxDQUFDOztDQUV0RyxJQUFJLGtCQUFrQixHQUFHLCtVQUErVSxDQUFDOztDQUV6VyxJQUFJLHVCQUF1QixHQUFHLDBLQUEwSyxDQUFDOztDQUV6TSxJQUFJLGtCQUFrQixHQUFHLHlxQkFBeXFCLENBQUM7O0NBRW5zQixJQUFJLHFCQUFxQixHQUFHLGdhQUFnYSxDQUFDOztDQUU3YixJQUFJLG9CQUFvQixHQUFHLDRMQUE0TCxDQUFDOztDQUV4TixJQUFJLHVCQUF1QixHQUFHLDJ6QkFBMnpCLENBQUM7O0NBRTExQixJQUFJLE9BQU8sR0FBRyxveUNBQW95QyxDQUFDOztDQUVuekMsSUFBSSw0QkFBNEIsR0FBRyw2RUFBNkUsQ0FBQzs7Q0FFakgsSUFBSSxjQUFjLEdBQUcsK0dBQStHLENBQUM7O0NBRXJJLElBQUksa0JBQWtCLEdBQUcseUZBQXlGLENBQUM7O0NBRW5ILElBQUksdUJBQXVCLEdBQUcsb1ZBQW9WLENBQUM7O0NBRW5YLElBQUkscUJBQXFCLEdBQUcsd0tBQXdLLENBQUM7O0NBRXJNLElBQUksMEJBQTBCLEdBQUcsb0VBQW9FLENBQUM7O0NBRXRHLElBQUksdUJBQXVCLEdBQUcsaXBOQUFpcE4sQ0FBQzs7Q0FFaHJOLElBQUkscUJBQXFCLEdBQUcseWVBQXllLENBQUM7O0NBRXRnQixJQUFJLGdCQUFnQixHQUFHLHFsQkFBcWxCLENBQUM7O0NBRTdtQixJQUFJLHdCQUF3QixHQUFHLDJ3Q0FBMndDLENBQUM7O0NBRTN5QyxJQUFJLGVBQWUsR0FBRyxpT0FBaU8sQ0FBQzs7Q0FFeFAsSUFBSSxvQkFBb0IsR0FBRywyZ0NBQTJnQyxDQUFDOztDQUV2aUMsSUFBSSxlQUFlLEdBQUcsZ1lBQWdZLENBQUM7O0NBRXZaLElBQUksaUJBQWlCLEdBQUcsNldBQTZXLENBQUM7O0NBRXRZLElBQUksb0JBQW9CLEdBQUcseUxBQXlMLENBQUM7O0NBRXJOLElBQUkseUJBQXlCLEdBQUcsa0VBQWtFLENBQUM7O0NBRW5HLElBQUksb0JBQW9CLEdBQUcsOEZBQThGLENBQUM7O0NBRTFILElBQUkseUJBQXlCLEdBQUcsKzZCQUErNkIsQ0FBQzs7Q0FFaDlCLElBQUksZ0JBQWdCLEdBQUcsZ1FBQWdRLENBQUM7O0NBRXhSLElBQUksY0FBYyxHQUFHLCtSQUErUixDQUFDOztDQUVyVCxJQUFJLFNBQVMsR0FBRyx3UkFBd1IsQ0FBQzs7Q0FFelMsSUFBSSxpQkFBaUIsR0FBRyxtRkFBbUYsQ0FBQzs7Q0FFNUcsSUFBSSxlQUFlLEdBQUcsMEdBQTBHLENBQUM7O0NBRWpJLElBQUksVUFBVSxHQUFHLDRFQUE0RSxDQUFDOztDQUU5RixJQUFJLGVBQWUsR0FBRyx5SkFBeUosQ0FBQzs7Q0FFaEwsSUFBSSxTQUFTLEdBQUcsdVBBQXVQLENBQUM7O0NBRXhRLElBQUksU0FBUyxHQUFHLGdPQUFnTyxDQUFDOztDQUVqUCxJQUFJLFVBQVUsR0FBRyxzdkJBQXN2QixDQUFDOztDQUV4d0IsSUFBSSxVQUFVLEdBQUcsbXFCQUFtcUIsQ0FBQzs7Q0FFcnJCLElBQUksaUJBQWlCLEdBQUcsOHJCQUE4ckIsQ0FBQzs7Q0FFdnRCLElBQUksaUJBQWlCLEdBQUcsbXRCQUFtdEIsQ0FBQzs7Q0FFNXVCLElBQUksYUFBYSxHQUFHLG1YQUFtWCxDQUFDOztDQUV4WSxJQUFJLGFBQWEsR0FBRyw4TEFBOEwsQ0FBQzs7Q0FFbk4sSUFBSSxlQUFlLEdBQUcsb3lCQUFveUIsQ0FBQzs7Q0FFM3pCLElBQUksZUFBZSxHQUFHLGloQkFBaWhCLENBQUM7O0NBRXhpQixJQUFJLGNBQWMsR0FBRyx1OENBQXU4QyxDQUFDOztDQUU3OUMsSUFBSSxjQUFjLEdBQUcsczJCQUFzMkIsQ0FBQzs7Q0FFNTNCLElBQUksZ0JBQWdCLEdBQUcscW5FQUFxbkUsQ0FBQzs7Q0FFN29FLElBQUksZ0JBQWdCLEdBQUcsOGxDQUE4bEMsQ0FBQzs7Q0FFdG5DLElBQUksY0FBYyxHQUFHLHNoRUFBc2hFLENBQUM7O0NBRTVpRSxJQUFJLGNBQWMsR0FBRyxzcUNBQXNxQyxDQUFDOztDQUU1ckMsSUFBSSxpQkFBaUIsR0FBRyxnd0VBQWd3RSxDQUFDOztDQUV6eEUsSUFBSSxpQkFBaUIsR0FBRyw4bUNBQThtQyxDQUFDOztDQUV2b0MsSUFBSSxXQUFXLEdBQUcsZ2pCQUFnakIsQ0FBQzs7Q0FFbmtCLElBQUksV0FBVyxHQUFHLGc4QkFBZzhCLENBQUM7O0NBRW45QixJQUFJLFdBQVcsR0FBRyw2eUJBQTZ5QixDQUFDOztDQUVoMEIsSUFBSSxXQUFXLEdBQUcsMm1CQUEybUIsQ0FBQzs7Q0FFOW5CLElBQUksV0FBVyxHQUFHLGdXQUFnVyxDQUFDOztDQUVuWCxJQUFJLFdBQVcsR0FBRyxnT0FBZ08sQ0FBQzs7Q0FFblAsSUFBSSxXQUFXLEdBQUc7Q0FDbEIsQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUI7Q0FDckMsQ0FBQyxzQkFBc0IsRUFBRSxzQkFBc0I7Q0FDL0MsQ0FBQyxrQkFBa0IsRUFBRSxrQkFBa0I7Q0FDdkMsQ0FBQyxjQUFjLEVBQUUsY0FBYztDQUMvQixDQUFDLG1CQUFtQixFQUFFLG1CQUFtQjtDQUN6QyxDQUFDLFlBQVksRUFBRSxZQUFZO0NBQzNCLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCO0NBQ3ZDLENBQUMsS0FBSyxFQUFFLEtBQUs7Q0FDYixDQUFDLHFCQUFxQixFQUFFLHFCQUFxQjtDQUM3QyxDQUFDLHdCQUF3QixFQUFFLHdCQUF3QjtDQUNuRCxDQUFDLDZCQUE2QixFQUFFLDZCQUE2QjtDQUM3RCxDQUFDLDJCQUEyQixFQUFFLDJCQUEyQjtDQUN6RCxDQUFDLHNCQUFzQixFQUFFLHNCQUFzQjtDQUMvQyxDQUFDLGNBQWMsRUFBRSxjQUFjO0NBQy9CLENBQUMsbUJBQW1CLEVBQUUsbUJBQW1CO0NBQ3pDLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCO0NBQ3JDLENBQUMsWUFBWSxFQUFFLFlBQVk7Q0FDM0IsQ0FBQyxNQUFNLEVBQUUsTUFBTTtDQUNmLENBQUMsMkJBQTJCLEVBQUUsMkJBQTJCO0NBQ3pELENBQUMsb0JBQW9CLEVBQUUsb0JBQW9CO0NBQzNDLENBQUMsMkJBQTJCLEVBQUUsMkJBQTJCO0NBQ3pELENBQUMsc0JBQXNCLEVBQUUsc0JBQXNCO0NBQy9DLENBQUMsb0JBQW9CLEVBQUUsb0JBQW9CO0NBQzNDLENBQUMseUJBQXlCLEVBQUUseUJBQXlCO0NBQ3JELENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCO0NBQ3ZDLENBQUMsdUJBQXVCLEVBQUUsdUJBQXVCO0NBQ2pELENBQUMsZUFBZSxFQUFFLGVBQWU7Q0FDakMsQ0FBQyxvQkFBb0IsRUFBRSxvQkFBb0I7Q0FDM0MsQ0FBQyxrQkFBa0IsRUFBRSxrQkFBa0I7Q0FDdkMsQ0FBQyxhQUFhLEVBQUUsYUFBYTtDQUM3QixDQUFDLFVBQVUsRUFBRSxVQUFVO0NBQ3ZCLENBQUMsZUFBZSxFQUFFLGVBQWU7Q0FDakMsQ0FBQyxZQUFZLEVBQUUsWUFBWTtDQUMzQixDQUFDLGlCQUFpQixFQUFFLGlCQUFpQjtDQUNyQyxDQUFDLHlCQUF5QixFQUFFLHlCQUF5QjtDQUNyRCxDQUFDLGlCQUFpQixFQUFFLGlCQUFpQjtDQUNyQyxDQUFDLHNCQUFzQixFQUFFLHNCQUFzQjtDQUMvQyxDQUFDLHFCQUFxQixFQUFFLHFCQUFxQjtDQUM3QyxDQUFDLGlCQUFpQixFQUFFLGlCQUFpQjtDQUNyQyxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQjtDQUNuQyxDQUFDLHFCQUFxQixFQUFFLHFCQUFxQjtDQUM3QyxDQUFDLDBCQUEwQixFQUFFLDBCQUEwQjtDQUN2RCxDQUFDLHdCQUF3QixFQUFFLHdCQUF3QjtDQUNuRCxDQUFDLDZCQUE2QixFQUFFLDZCQUE2QjtDQUM3RCxDQUFDLHFCQUFxQixFQUFFLHFCQUFxQjtDQUM3QyxDQUFDLG9CQUFvQixFQUFFLG9CQUFvQjtDQUMzQyxDQUFDLG1CQUFtQixFQUFFLG1CQUFtQjtDQUN6QyxDQUFDLG9CQUFvQixFQUFFLG9CQUFvQjtDQUMzQyxDQUFDLHlCQUF5QixFQUFFLHlCQUF5QjtDQUNyRCxDQUFDLHVCQUF1QixFQUFFLHVCQUF1QjtDQUNqRCxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQjtDQUN2QyxDQUFDLFlBQVksRUFBRSxZQUFZO0NBQzNCLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCO0NBQ3JDLENBQUMscUJBQXFCLEVBQUUscUJBQXFCO0NBQzdDLENBQUMsMEJBQTBCLEVBQUUsMEJBQTBCO0NBQ3ZELENBQUMscUJBQXFCLEVBQUUscUJBQXFCO0NBQzdDLENBQUMsMEJBQTBCLEVBQUUsMEJBQTBCO0NBQ3ZELENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCO0NBQ3ZDLENBQUMsdUJBQXVCLEVBQUUsdUJBQXVCO0NBQ2pELENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCO0NBQ3ZDLENBQUMscUJBQXFCLEVBQUUscUJBQXFCO0NBQzdDLENBQUMsb0JBQW9CLEVBQUUsb0JBQW9CO0NBQzNDLENBQUMsdUJBQXVCLEVBQUUsdUJBQXVCO0NBQ2pELENBQUMsT0FBTyxFQUFFLE9BQU87Q0FDakIsQ0FBQyw0QkFBNEIsRUFBRSw0QkFBNEI7Q0FDM0QsQ0FBQyxjQUFjLEVBQUUsY0FBYztDQUMvQixDQUFDLGtCQUFrQixFQUFFLGtCQUFrQjtDQUN2QyxDQUFDLHVCQUF1QixFQUFFLHVCQUF1QjtDQUNqRCxDQUFDLHFCQUFxQixFQUFFLHFCQUFxQjtDQUM3QyxDQUFDLDBCQUEwQixFQUFFLDBCQUEwQjtDQUN2RCxDQUFDLHVCQUF1QixFQUFFLHVCQUF1QjtDQUNqRCxDQUFDLHFCQUFxQixFQUFFLHFCQUFxQjtDQUM3QyxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQjtDQUNuQyxDQUFDLHdCQUF3QixFQUFFLHdCQUF3QjtDQUNuRCxDQUFDLGVBQWUsRUFBRSxlQUFlO0NBQ2pDLENBQUMsb0JBQW9CLEVBQUUsb0JBQW9CO0NBQzNDLENBQUMsZUFBZSxFQUFFLGVBQWU7Q0FDakMsQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUI7Q0FDckMsQ0FBQyxvQkFBb0IsRUFBRSxvQkFBb0I7Q0FDM0MsQ0FBQyx5QkFBeUIsRUFBRSx5QkFBeUI7Q0FDckQsQ0FBQyxvQkFBb0IsRUFBRSxvQkFBb0I7Q0FDM0MsQ0FBQyx5QkFBeUIsRUFBRSx5QkFBeUI7Q0FDckQsQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0I7Q0FDbkMsQ0FBQyxjQUFjLEVBQUUsY0FBYztDQUMvQixDQUFDLFNBQVMsRUFBRSxTQUFTO0NBQ3JCLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCO0NBQ3JDLENBQUMsZUFBZSxFQUFFLGVBQWU7Q0FDakMsQ0FBQyxVQUFVLEVBQUUsVUFBVTtDQUN2QixDQUFDLGVBQWUsRUFBRSxlQUFlOztDQUVqQyxDQUFDLFNBQVMsRUFBRSxTQUFTO0NBQ3JCLENBQUMsU0FBUyxFQUFFLFNBQVM7Q0FDckIsQ0FBQyxVQUFVLEVBQUUsVUFBVTtDQUN2QixDQUFDLFVBQVUsRUFBRSxVQUFVO0NBQ3ZCLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCO0NBQ3JDLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCO0NBQ3JDLENBQUMsYUFBYSxFQUFFLGFBQWE7Q0FDN0IsQ0FBQyxhQUFhLEVBQUUsYUFBYTtDQUM3QixDQUFDLGVBQWUsRUFBRSxlQUFlO0NBQ2pDLENBQUMsZUFBZSxFQUFFLGVBQWU7Q0FDakMsQ0FBQyxjQUFjLEVBQUUsY0FBYztDQUMvQixDQUFDLGNBQWMsRUFBRSxjQUFjO0NBQy9CLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCO0NBQ25DLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCO0NBQ25DLENBQUMsY0FBYyxFQUFFLGNBQWM7Q0FDL0IsQ0FBQyxjQUFjLEVBQUUsY0FBYztDQUMvQixDQUFDLGlCQUFpQixFQUFFLGlCQUFpQjtDQUNyQyxDQUFDLGlCQUFpQixFQUFFLGlCQUFpQjtDQUNyQyxDQUFDLFdBQVcsRUFBRSxXQUFXO0NBQ3pCLENBQUMsV0FBVyxFQUFFLFdBQVc7Q0FDekIsQ0FBQyxXQUFXLEVBQUUsV0FBVztDQUN6QixDQUFDLFdBQVcsRUFBRSxXQUFXO0NBQ3pCLENBQUMsV0FBVyxFQUFFLFdBQVc7Q0FDekIsQ0FBQyxXQUFXLEVBQUUsV0FBVztDQUN6QixDQUFDLENBQUM7O0NBRUY7Q0FDQTtDQUNBOztDQUVBLElBQUksYUFBYSxHQUFHOztDQUVwQixDQUFDLEtBQUssRUFBRSxXQUFXLFFBQVEsR0FBRzs7Q0FFOUIsRUFBRSxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7O0NBRWxCLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRS9DLEdBQUcsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFekMsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRzs7Q0FFeEIsSUFBSSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUzQixJQUFJOztDQUVKLEdBQUc7O0NBRUgsRUFBRSxPQUFPLE1BQU0sQ0FBQzs7Q0FFaEIsRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRSxXQUFXLFlBQVksR0FBRzs7Q0FFbEMsRUFBRSxJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7O0NBRXhCLEVBQUUsTUFBTSxJQUFJLENBQUMsSUFBSSxZQUFZLEdBQUc7O0NBRWhDLEdBQUcsWUFBWSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFMUIsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLFlBQVksRUFBRSxDQUFDLEVBQUUsR0FBRzs7Q0FFdEMsSUFBSSxJQUFJLGFBQWEsR0FBRyxZQUFZLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRS9DLElBQUksS0FBSyxhQUFhLE1BQU0sYUFBYSxDQUFDLE9BQU87Q0FDakQsS0FBSyxhQUFhLENBQUMsU0FBUyxJQUFJLGFBQWEsQ0FBQyxTQUFTO0NBQ3ZELEtBQUssYUFBYSxDQUFDLFNBQVMsSUFBSSxhQUFhLENBQUMsU0FBUyxJQUFJLGFBQWEsQ0FBQyxTQUFTO0NBQ2xGLEtBQUssYUFBYSxDQUFDLFNBQVMsRUFBRSxHQUFHOztDQUVqQyxLQUFLLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRXBELEtBQUssTUFBTSxLQUFLLEtBQUssQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLEdBQUc7O0NBRWpELEtBQUssWUFBWSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7Q0FFcEQsS0FBSyxNQUFNOztDQUVYLEtBQUssWUFBWSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLGFBQWEsQ0FBQzs7Q0FFNUMsS0FBSzs7Q0FFTCxJQUFJOztDQUVKLEdBQUc7O0NBRUgsRUFBRSxPQUFPLFlBQVksQ0FBQzs7Q0FFdEIsRUFBRTs7Q0FFRixDQUFDLENBQUM7O0NBRUY7Q0FDQTtDQUNBOztDQUVBLElBQUksYUFBYSxHQUFHLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUTtDQUNsSSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxRQUFRO0NBQy9ILENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRO0NBQ2xJLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFFBQVE7Q0FDcEksQ0FBQyxlQUFlLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLFFBQVE7Q0FDN0ksQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsUUFBUTtDQUNsSixDQUFDLGVBQWUsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVE7Q0FDbkksQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFFBQVE7Q0FDdkksQ0FBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVE7Q0FDdkksQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUTtDQUNqSixDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxRQUFRO0NBQ3hKLENBQUMsY0FBYyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxzQkFBc0IsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFFBQVE7Q0FDeEosQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLFFBQVE7Q0FDbkosQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFFBQVE7Q0FDckosQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsUUFBUTtDQUMzSSxDQUFDLGNBQWMsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsUUFBUTtDQUM5SSxDQUFDLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxRQUFRO0NBQ25KLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVE7Q0FDL0ksQ0FBQyxlQUFlLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFFBQVE7Q0FDdEosQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxRQUFRO0NBQ3BLLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRO0NBQ3ZJLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVE7Q0FDbkosQ0FBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsUUFBUTtDQUNsSixDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRWpJLFNBQVMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHOztDQUUxQixDQUFDLEtBQUssQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssU0FBUyxHQUFHOztDQUUzQztDQUNBLEVBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUV2QixFQUFFOztDQUVGLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRS9CLENBQUM7O0NBRUQsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFOztDQUVoQyxDQUFDLE9BQU8sRUFBRSxJQUFJOztDQUVkLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVqQixDQUFDLEdBQUcsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFekIsRUFBRSxLQUFLLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxHQUFHOztDQUVoQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRXRCLEdBQUcsTUFBTSxLQUFLLE9BQU8sS0FBSyxLQUFLLFFBQVEsR0FBRzs7Q0FFMUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUV4QixHQUFHLE1BQU0sS0FBSyxPQUFPLEtBQUssS0FBSyxRQUFRLEdBQUc7O0NBRTFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFMUIsR0FBRzs7Q0FFSCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxTQUFTLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0NBRWhDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7Q0FDbEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztDQUNsQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDOztDQUVsQixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxNQUFNLEVBQUUsV0FBVyxHQUFHLEdBQUc7O0NBRTFCLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRTFCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxLQUFLLEdBQUcsQ0FBQztDQUNyQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxHQUFHLENBQUM7Q0FDcEMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLENBQUM7O0NBRS9CLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHOztDQUU5QixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ2IsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNiLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRWIsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsTUFBTSxFQUFFLFlBQVk7O0NBRXJCLEVBQUUsU0FBUyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRTlCLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7Q0FDdkIsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUN2QixHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDakQsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO0NBQzdCLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Q0FDN0QsR0FBRyxPQUFPLENBQUMsQ0FBQzs7Q0FFWixHQUFHOztDQUVILEVBQUUsT0FBTyxTQUFTLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFcEM7Q0FDQSxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNyQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDOUIsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUU5QixHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRzs7Q0FFbEIsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRWpDLElBQUksTUFBTTs7Q0FFVixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztDQUN6RCxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7O0NBRTFCLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0NBQ3hDLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNoQyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7Q0FFeEMsSUFBSTs7Q0FFSixHQUFHLE9BQU8sSUFBSSxDQUFDOztDQUVmLEdBQUcsQ0FBQzs7Q0FFSixFQUFFLEVBQUU7O0NBRUosQ0FBQyxRQUFRLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRTlCLEVBQUUsU0FBUyxXQUFXLEVBQUUsTUFBTSxHQUFHOztDQUVqQyxHQUFHLEtBQUssTUFBTSxLQUFLLFNBQVMsR0FBRyxPQUFPOztDQUV0QyxHQUFHLEtBQUssVUFBVSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRzs7Q0FFbkMsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLGtDQUFrQyxHQUFHLEtBQUssR0FBRyxtQkFBbUIsRUFBRSxDQUFDOztDQUVyRixJQUFJOztDQUVKLEdBQUc7OztDQUdILEVBQUUsSUFBSSxDQUFDLENBQUM7O0NBRVIsRUFBRSxLQUFLLENBQUMsR0FBRyxpQ0FBaUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUc7O0NBRTdEOztDQUVBLEdBQUcsSUFBSSxLQUFLLENBQUM7Q0FDYixHQUFHLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNyQixHQUFHLElBQUksVUFBVSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFM0IsR0FBRyxTQUFTLElBQUk7O0NBRWhCLElBQUksS0FBSyxLQUFLLENBQUM7Q0FDZixJQUFJLEtBQUssTUFBTTs7Q0FFZixLQUFLLEtBQUssS0FBSyxHQUFHLCtEQUErRCxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsR0FBRzs7Q0FFdkc7Q0FDQSxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQztDQUNqRSxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQztDQUNqRSxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQzs7Q0FFakUsTUFBTSxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRWhDLE1BQU0sT0FBTyxJQUFJLENBQUM7O0NBRWxCLE1BQU07O0NBRU4sS0FBSyxLQUFLLEtBQUssR0FBRyxxRUFBcUUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQUc7O0NBRTdHO0NBQ0EsTUFBTSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7Q0FDakUsTUFBTSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7Q0FDakUsTUFBTSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7O0NBRWpFLE1BQU0sV0FBVyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUVoQyxNQUFNLE9BQU8sSUFBSSxDQUFDOztDQUVsQixNQUFNOztDQUVOLEtBQUssTUFBTTs7Q0FFWCxJQUFJLEtBQUssS0FBSyxDQUFDO0NBQ2YsSUFBSSxLQUFLLE1BQU07O0NBRWYsS0FBSyxLQUFLLEtBQUssR0FBRywrRUFBK0UsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQUc7O0NBRXZIO0NBQ0EsTUFBTSxJQUFJLENBQUMsR0FBRyxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDO0NBQzdDLE1BQU0sSUFBSSxDQUFDLEdBQUcsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7Q0FDL0MsTUFBTSxJQUFJLENBQUMsR0FBRyxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQzs7Q0FFL0MsTUFBTSxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRWhDLE1BQU0sT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXBDLE1BQU07O0NBRU4sS0FBSyxNQUFNOztDQUVYLElBQUk7O0NBRUosR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLG9CQUFvQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRzs7Q0FFdkQ7O0NBRUEsR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDcEIsR0FBRyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDOztDQUV6QixHQUFHLEtBQUssSUFBSSxLQUFLLENBQUMsR0FBRzs7Q0FFckI7Q0FDQSxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsUUFBUSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7Q0FDckUsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDO0NBQ3JFLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxRQUFRLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQzs7Q0FFckUsSUFBSSxPQUFPLElBQUksQ0FBQzs7Q0FFaEIsSUFBSSxNQUFNLEtBQUssSUFBSSxLQUFLLENBQUMsR0FBRzs7Q0FFNUI7Q0FDQSxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsUUFBUSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7Q0FDckUsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDO0NBQ3JFLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxRQUFRLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQzs7Q0FFckUsSUFBSSxPQUFPLElBQUksQ0FBQzs7Q0FFaEIsSUFBSTs7Q0FFSixHQUFHOztDQUVILEVBQUUsS0FBSyxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUc7O0NBRW5DO0NBQ0EsR0FBRyxJQUFJLEdBQUcsR0FBRyxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRXBDLEdBQUcsS0FBSyxHQUFHLEtBQUssU0FBUyxHQUFHOztDQUU1QjtDQUNBLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFdkIsSUFBSSxNQUFNOztDQUVWO0NBQ0EsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLDZCQUE2QixHQUFHLEtBQUssRUFBRSxDQUFDOztDQUUxRCxJQUFJOztDQUVKLEdBQUc7O0NBRUgsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsS0FBSyxFQUFFLFlBQVk7O0NBRXBCLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFeEQsRUFBRTs7Q0FFRixDQUFDLElBQUksRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFMUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7Q0FDbkIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7Q0FDbkIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7O0NBRW5CLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLGlCQUFpQixFQUFFLFdBQVcsS0FBSyxFQUFFLFdBQVcsR0FBRzs7Q0FFcEQsRUFBRSxLQUFLLFdBQVcsS0FBSyxTQUFTLEdBQUcsV0FBVyxHQUFHLEdBQUcsQ0FBQzs7Q0FFckQsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQztDQUM1QyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDO0NBQzVDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUM7O0NBRTVDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLGlCQUFpQixFQUFFLFdBQVcsS0FBSyxFQUFFLFdBQVcsR0FBRzs7Q0FFcEQsRUFBRSxLQUFLLFdBQVcsS0FBSyxTQUFTLEdBQUcsV0FBVyxHQUFHLEdBQUcsQ0FBQzs7Q0FFckQsRUFBRSxJQUFJLFdBQVcsR0FBRyxFQUFFLFdBQVcsR0FBRyxDQUFDLE9BQU8sR0FBRyxHQUFHLFdBQVcsS0FBSyxHQUFHLENBQUM7O0NBRXRFLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUM7Q0FDNUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFH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LElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0NBQy9CLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7O0NBRS9CLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFM0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUNkLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7Q0FDZCxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDOztDQUVkLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEdBQUcsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFekIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQzNDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUMzQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRTNDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLFFBQVEsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFOUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7Q0FDcEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7Q0FD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LENBQUM7O0NBRTFCOztDQUVBLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQztDQUN0QixFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDbEQsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2xELEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFbkQsRUFBRSxLQUFLLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUM7O0NBRS9CLEVBQUUsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUV6QixHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRS9DLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLE9BQU8sR0FBRzs7Q0FFcEMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDdkMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXZDLElBQUksTUFBTTs7Q0FFVixJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDckMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFaEIsSUFBSTs7Q0FFSixHQUFHLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUVoQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFakQsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsT0FBTyxHQUFHOztDQUVwQyxJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDckMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUVyQyxJQUFJLE1BQU07O0NBRVYsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDdkMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFaEIsSUFBSTs7Q0FFSixHQUFHLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUVoQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRS9DLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLE9BQU8sR0FBRzs7Q0FFcEMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDdkMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXZDLElBQUksTUFBTTs7Q0FFVixJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ2hCLElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFckMsSUFBSTs7Q0FFSixHQUFHLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUVoQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFakQsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsT0FBTyxHQUFHOztDQUVwQyxJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDckMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUVyQyxJQUFJLE1BQU07O0NBRVYsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNoQixJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFdkMsSUFBSTs7Q0FFSixHQUFHLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUVoQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRS9D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QUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRXBGLElBQUk7O0NBRUosR0FBRyxLQUFLLEdBQUcsS0FBSyxTQUFTLEdBQUc7O0NBRTVCLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRTFELElBQUk7O0NBRUosR0FBRyxLQUFLLElBQUksS0FBSyxTQUFTLEdBQUc7O0NBRTdCLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRTdELElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFLFNBQVMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLGFBQWEsR0FBRzs7Q0FFN0MsR0FBRyxJQUFJLGFBQWEsR0FBRyxPQUFPLEtBQUssU0FBUyxHQUFHLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDckksR0FBRyxJQUFJLFlBQVksR0FBRyxNQUFNLEtBQUssU0FBUyxHQUFHLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXRJLEdBQUcsSUFBSSxJQUFJLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsQ0FBQzs7Q0FFL0UsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFNUIsR0FBRyxLQUFLLEdBQUcsS0FBSyxTQUFTLEdBQUc7O0NBRTVCLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRTFHLElBQUk7O0NBRUosR0FBRyxLQUFLLElBQUksS0FBSyxTQUFTLEdBQUc7O0NBRTdCLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRTdHLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7O0NBRS9CLEVBQUUsS0FBSyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRzs7Q0FFM0IsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFOUMsSUFBSSxJQUFJLEtBQUssR0FBRyxNQUFNLEVB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QUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFakMsSUFBSTs7Q0FFSixHQUFHLE1BQU07O0NBRVQsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzs7Q0FFN0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXZELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTNCLElBQUksUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQzFDLElBQUksUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQzFDLElBQUksUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUUxQyxJQUFJOztDQUVKLEdBQUc7O0NBRUgsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXpELEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDOztDQUU3QixHQUFHOztDQUVILEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV0RCxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUxQixHQUFHLElBQUks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QyxHQUFHOztDQUVIOztDQUVBLEVBQUUsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQzs7Q0FFdkMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFdkQsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQzs7Q0FFckQsR0FBRzs7Q0FFSDs7Q0FFQSxFQUFFLElBQUksV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7O0NBRXZDLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXZELEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7O0NBRXJELEdBQUc7O0NBRUg7O0NBRUEsRUFBRSxJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDOztDQUUzQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV6RCxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUVqRCxHQUFHOztDQUVIOztDQUVBLEVBQUUsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQzs7Q0FFdkMsRUFBRSxLQUFLLFdBQVcsS0FBSyxJQUFJLEdBQUc7O0NBRTlCLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRTFDLEdBQUc7O0NBRUg7O0NBRUEsRUFBRSxJQUFJLGNBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDOztDQUU3QyxFQUFFLEtBQUssY0FBYyxLQUFLLElBQUksR0FBRzs7Q0FFakMsR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7Q0FFaEQsR0FBRzs7Q0FFSDs7Q0FFQSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUM7Q0FDdEQsRUFBRSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDO0NBQ3RELEVBQUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO0NBQzVDLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztDQUNwRCxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7Q0FDbEQsRUFBRSxJQUFJLENBQUMsdUJBQXVCLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixDQUFDO0NBQ2hFLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQzs7Q0FFbEQsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsT0FBTyxFQUFFLFlBQVk7O0NBRXRCLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDOztDQUU1QyxFQUFFOztDQUVGLENBQUMsRUFBRSxDQUFDOztDQUVKO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLGVBQWUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsR0FBRzs7Q0FFeEQsQ0FBQyxLQUFLLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUc7O0NBRS9CLEVBQUUsTUFBTSxJQUFJLFNBQVMsRUFBRSx1REFBdUQsRUFBRSxDQUFDOztDQUVqRixFQUFFOztDQUVGLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7O0NBRWhCLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Q0FDcEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztDQUMxQixDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxLQUFLLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUM7Q0FDaEUsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsS0FBSyxJQUFJLENBQUM7O0NBRXZDLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7Q0FDdEIsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFOUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQzs7Q0FFbEIsQ0FBQzs7Q0FFRCxNQUFNLENBQUMsY0FBYyxFQUFFLGVBQWUsQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFOztDQUVqRSxDQUFDLEdBQUcsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFekIsRUFBRSxLQUFLLEtBQUssS0FBSyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDOztDQUV4QyxFQUFFOztDQUVGLENBQUMsRUFBRSxDQUFDOztDQUVKLE1BQU0sQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLFNBQVMsRUFBRTs7Q0FFMUMsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJOztDQUV4QixDQUFDLGdCQUFnQixFQUFFLFlBQVksRUFBRTs7Q0FFakMsQ0FBQyxRQUFRLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRTlCLEVBQUUsS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHOztDQUVoQyxHQUFHLE1BQU0sSUFBSSxTQUFTLEVBQUUsdURBQXVELEVBQUUsQ0FBQzs7Q0FFbEYsR0FBRzs7Q0FFSCxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxLQUFLLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0NBQ3RFLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7O0NBRXJCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLFVBQVUsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFaEMsRUFBRSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzs7Q0FFdkIsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsSUFBSSxFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUUzQixFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztDQUMxQixFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7Q0FDNUQsRUFBRSxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7Q0FDbEMsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7Q0FDNUIsRUFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7O0NBRXRDLEVBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDOztDQUVoQyxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxNQUFNLEVBQUUsV0FBVyxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sR0FBRzs7Q0FFaEQsRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQztDQUMxQixFQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDOztDQUUvQixFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXBELEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0NBRTVELEdBQUc7O0NBRUgsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsU0FBUyxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUUvQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUUxQixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxlQUFlLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0NBRXRDLEVBQUUsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDOztDQUVyQyxFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXBELEdBQUcsSUFBSSxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUzQixHQUFHLEtBQUssS0FBSyxLQUFLLFNBQVMsR0FBRzs7Q0FFOUIsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLDZEQUE2RCxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ3JGLElBQUksS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7O0NBRXhCLElBQUk7O0NBRUosR0FBRyxLQUFLLEVBQUUsTUFBTSxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0NBQ2hDLEdBQUcsS0FBSyxFQUFFLE1BQU0sR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztDQUNoQyxHQUFHLEtBQUssRUFBRSxNQUFNLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7O0NBRWhDLEdBQUc7O0NBRUgsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsaUJBQWlCLEVBQUUsV0FBVyxPQUFPLEdBQUc7O0NBRXpDLEVBQUUsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDOztDQUVyQyxFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXJELEdBQUcsSUFBSSxNQUFNLEdBQUcsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUU3QixHQUFHLEtBQUssTUFBTSxLQUFLLFNBQVMsR0FBRzs7Q0FFL0IsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLGdFQUFnRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ3hGLElBQUksTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRTNCLElBQUk7O0NBRUosR0FBRyxLQUFLLEVBQUUsTUFBTSxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0NBQ2pDLEdBQUcsS0FBSyxFQUFFLE1BQU0sR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQzs7Q0FFakMsR0FBRzs7Q0FFSCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxpQkFBaUIsRUFBRSxXQUFXLE9BQU8sR0FBRzs7Q0FFekMsRUFBRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUM7O0NBRXJDLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFckQsR0FBRyxJQUFJLE1BQU0sR0FBRyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTdCLEdBQUcsS0FBSyxNQUFNLEtBQUssU0FBUyxHQUFHOztDQUUvQixJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsZ0VBQWdFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDeEYsSUFBSSxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFM0IsSUFBSTs7Q0FFSixHQUFHLEtBQUssRUFBRSxNQUFNLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7Q0FDakMsR0FBRyxLQUFLLEVBQUUsTUFBTSxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0NBQ2pDLEdBQUcsS0FBSyxFQUFFLE1BQU0sR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQzs7Q0FFakMsR0FBRzs7Q0FFSCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxpQkFBaUIsRUFBRSxXQUFXLE9BQU8sR0FBRzs7Q0FFekMsRUFBRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUM7O0NBRXJDLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFckQsR0FBRyxJQUFJLE1BQU0sR0FBRyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTdCLEdBQUcsS0FBSyxNQUFNLEtBQUssU0FBUyxHQUFHOztDQUUvQixJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsZ0VBQWdFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDeEYsSUFBSSxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFM0IsSUFBSTs7Q0FFSixHQUFHLEtBQUssRUFBRSxNQUFNLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7Q0FDakMsR0FBRyxLQUFLLEVBQUUsTUFBTSxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0NBQ2pDLEdBQUcsS0FBSyxFQUFFLE1BQU0sR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztDQUNqQyxHQUFHLEtBQUssRUFBRSxNQUFNLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7O0NBRWpDLEdBQUc7O0NBRUgsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsR0FBRyxFQUFFLFdBQVcsS0FBSyxFQUFFLE1BQU0sR0FBRzs7Q0FFakMsRUFBRSxLQUFLLE1BQU0sS0FBSyxTQUFTLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQzs7Q0FFekMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRWxDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLElBQUksRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFMUIsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzs7Q0FFN0MsRUFBRTs7Q0FFRixDQUFDLElBQUksRUFBRSxXQUFXLEtBQUssRUFBRSxDQUFDLEdBQUc7O0NBRTdCLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFMUMsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsSUFBSSxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUUxQixFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7Q0FFakQsRUFBRTs7Q0FFRixDQUFDLElBQUksRUFBRSxXQUFXLEtBQUssRUFBRSxDQUFDLEdBQUc7O0NBRTdCLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRTlDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLElBQUksRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFMUIsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0NBRWpELEVBQUU7O0NBRUYsQ0FBQyxJQUFJLEVBQUUsV0FBVyxLQUFLLEVBQUUsQ0FBQyxHQUFHOztDQUU3QixFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUU5QyxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxJQUFJLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRTFCLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDOztDQUVqRCxFQUFFOztDQUVGLENBQUMsSUFBSSxFQUFFLFdBQVcsS0FBSyxFQUFFLENBQUMsR0FBRzs7Q0FFN0IsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFOUMsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsS0FBSyxFQUFFLFdBQVcsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRWpDLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUM7O0NBRXpCLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQzlCLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUU5QixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxNQUFNLEVBQUUsV0FBVyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRXJDLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUM7O0NBRXpCLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQzlCLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQzlCLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUU5QixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxPQUFPLEVBQUUsV0FBVyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHOztDQUV6QyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUV6QixFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUM5QixFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUM5QixFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUM5QixFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFOUIsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsUUFBUSxFQUFFLFdBQVcsUUFBUSxHQUFHOztDQUVqQyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7O0NBRW5DLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRSxZQUFZOztDQUVwQixFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFeEUsRUFBRTs7Q0FFRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSjs7Q0FFQSxTQUFTLG1CQUFtQixFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsVUFBVSxHQUFHOztDQUU1RCxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsQ0FBQzs7Q0FFNUUsQ0FBQzs7Q0FFRCxtQkFBbUIsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsU0FBUyxFQUFFLENBQUM7Q0FDM0UsbUJBQW1CLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxtQkFBbUIsQ0FBQzs7O0NBR2hFLFNBQVMsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxVQUFVLEdBQUc7O0NBRTdELENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxVQUFVLEVBQUUsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDOztDQUU3RSxDQUFDOztDQUVELG9CQUFvQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUM1RSxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLG9CQUFvQixDQUFDOzs7Q0FHbEUsU0FBUywyQkFBMkIsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsR0FBRzs7Q0FFcEUsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLGlCQUFpQixFQUFFLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsQ0FBQzs7Q0FFcEYsQ0FBQzs7Q0FFRCwyQkFBMkIsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsU0FBUyxFQUFFLENBQUM7Q0FDbkYsMkJBQTJCLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRywyQkFBMkIsQ0FBQzs7O0NBR2hGLFNBQVMsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxVQUFVLEdBQUc7O0NBRTdELENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxVQUFVLEVBQUUsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDOztDQUU3RSxDQUFDOztDQUVELG9CQUFvQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUM1RSxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLG9CQUFvQixDQUFDOzs7Q0FHbEUsU0FBUyxxQkFBcUIsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsR0FBRzs7Q0FFOUQsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLFdBQVcsRUFBRSxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUM7O0NBRTlFLENBQUM7O0NBRUQscUJBQXFCLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLFNBQVMsRUFBRSxDQUFDO0NBQzdFLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcscUJBQXFCLENBQUM7OztDQUdwRSxTQUFTLG9CQUFvQixFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsVUFBVSxHQUFHOztDQUU3RCxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksVUFBVSxFQUFFLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsQ0FBQzs7Q0FFN0UsQ0FBQzs7Q0FFRCxvQkFBb0IsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsU0FBUyxFQUFFLENBQUM7Q0FDNUUsb0JBQW9CLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQzs7O0NBR2xFLFNBQVMscUJBQXFCLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxVQUFVLEdBQUc7O0NBRTlELENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxXQUFXLEVBQUUsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDOztDQUU5RSxDQUFDOztDQUVELHFCQUFxQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUM3RSxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLHFCQUFxQixDQUFDOzs7Q0FHcEUsU0FBUyxzQkFBc0IsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsR0FBRzs7Q0FFL0QsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLFlBQVksRUFBRSxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUM7O0NBRS9FLENBQUM7O0NBRUQsc0JBQXNCLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLFNBQVMsRUFBRSxDQUFDO0NBQzlFLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsc0JBQXNCLENBQUM7OztDQUd0RSxTQUFTLHNCQUFzQixFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsVUFBVSxHQUFHOztDQUUvRCxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksWUFBWSxFQUFFLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsQ0FBQzs7Q0FFL0UsQ0FBQzs7Q0FFRCxzQkFBc0IsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsU0FBUyxFQUFFLENBQUM7Q0FDOUUsc0JBQXNCLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQzs7Q0FFdEU7Q0FDQTtDQUNBOztDQUVBLFNBQVMsY0FBYyxHQUFHOztDQUUxQixDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0NBQ3BCLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Q0FDbkIsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztDQUNsQixDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO0NBQ2YsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQzs7Q0FFaEIsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQzs7Q0FFbEIsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQzs7Q0FFeEIsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztDQUN2QixDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDOztDQUV2Qjs7Q0FFQSxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0NBQ3pCLENBQUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7O0NBRTVCOztDQUVBLENBQUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztDQUNqQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7Q0FDaEMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0NBQy9CLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7Q0FDNUIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDOztDQUUvQixDQUFDOztDQUVELE1BQU0sQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLFNBQVMsRUFBRTs7Q0FFekMsQ0FBQyxhQUFhLEVBQUUsV0FBVyxRQUFRLEdBQUc7O0NBRXRDLEVBQUUsSUFBSSxLQUFLLENBQUM7Q0FDWixFQUFFLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztDQUNsQixFQUFFLElBQUksYUFBYSxHQUFHLFNBQVMsQ0FBQzs7Q0FFaEMsRUFBRSxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDOztDQUU3QixFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUU1QyxHQUFHLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFekI7O0NBRUEsR0FBRyxLQUFLLElBQUksQ0FBQyxhQUFhLEtBQUssYUFBYSxHQUFHOztDQUUvQyxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDOztDQUV2QyxJQUFJLEtBQUssS0FBSyxLQUFLLFNBQVMsR0FBRzs7Q0FFL0IsS0FBSyxLQUFLLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLENBQUMsS0FBSyxDQUFDO0NBQzNDLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFMUIsS0FBSzs7Q0FFTCxJQUFJLEtBQUssR0FBRztDQUNaLEtBQUssS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDO0NBQ2pCLEtBQUssYUFBYSxFQUFFLGFBQWE7Q0FDakMsS0FBSyxDQUFDOztDQUVOLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFLEtBQUssS0FBSyxLQUFLLFNBQVMsR0FBRzs7Q0FFN0IsR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLENBQUMsS0FBSyxDQUFDO0NBQ3pDLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFeEIsR0FBRzs7Q0FFSCxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDOztDQUV2QixFQUFFOztDQUVGLENBQUMsWUFBWSxFQUFFLFdBQVcsUUFBUSxHQUFHOztDQUVyQyxFQUFFLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7Q0FDN0IsRUFBRSxJQUFJLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxhQUFhLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQzs7Q0FFN0MsRUFBRSxJQUFJLGVBQWUsR0FBRyxhQUFhLEVBQUUsQ0FBQyxFQUFFLElBQUksYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Q0FDNUUsRUFBRSxJQUFJLGdCQUFnQixHQUFHLGFBQWEsRUFBRSxDQUFDLEVBQUUsSUFBSSxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzs7Q0FFN0U7O0NBRUEsRUFBRSxJQUFJLFlBQVksR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDO0NBQzNDLEVBQUUsSUFBSSxrQkFBa0IsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDOztDQUUvQyxFQUFFLElBQUksb0JBQW9CLENBQUM7O0NBRTNCLEVBQUUsS0FBSyxrQkFBa0IsR0FBRyxDQUFDLEdBQUc7O0NBRWhDLEdBQUcsb0JBQW9CLEdBQUcsRUFBRSxDQUFDOztDQUU3QixHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxrQkFBa0IsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFbkQsSUFBSSxvQkFBb0IsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRW5DLElBQUk7O0NBRUosR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsR0FBRyxvQkFBb0IsQ0FBQzs7Q0FFckQsR0FBRzs7Q0FFSCxFQUFFLElBQUksWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7Q0FDM0MsRUFBRSxJQUFJLGtCQUFrQixHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUM7O0NBRS9DLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQzs7Q0FFekIsRUFBRSxLQUFLLGtCQUFrQixHQUFHLENBQUMsR0FBRzs7Q0FFaEMsR0FBRyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7O0NBRTNCLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGtCQUFrQixFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVuRCxJQUFJLGtCQUFrQixFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFakMsSUFBSTs7Q0FFSixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLGtCQUFrQixDQUFDOztDQUVqRCxHQUFHOztDQUVIOztDQUVBLEVBQUUsSUFBSSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztDQUN6QyxFQUFFLElBQUksV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7O0NBRXpDLEVBQUUsSUFBSSxjQUFjLEdBQUcsV0FBVyxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsTUFBTSxDQUFDO0NBQzlELEVBQUUsSUFBSSxjQUFjLEdBQUcsV0FBVyxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsTUFBTSxDQUFDOztDQUU5RDs7Q0FFQSxFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUU1QyxHQUFHLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFekIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUVwRixHQUFHLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7O0NBRTFDLEdBQUcsS0FBSyxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsR0FBRzs7Q0FFckMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLEVBQUUsYUFBYSxFQUFFLENBQUMsRUFBRSxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUVwRixJQUFJLE1BQU07O0NBRVYsSUFBSSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDOztDQUU3QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRWhELElBQUk7O0NBRUosR0FBRyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDOztDQUV4QyxHQUFHLEtBQUssWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEdBQUc7O0NBRXBDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFaEYsSUFBSSxNQUFNOztDQUVWLElBQUksSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQzs7Q0FFM0IsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUU1QyxJQUFJOztDQUVKLEdBQUcsS0FBSyxlQUFlLEtBQUssSUFBSSxHQUFHOztDQUVuQyxJQUFJLElBQUksU0FBUyxHQUFHLGFBQWEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFNUMsSUFBSSxLQUFLLFNBQVMsS0FBSyxTQUFTLEdBQUc7O0NBRW5DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFckUsS0FBSyxNQUFNOztDQUVYLEtBQUssT0FBTyxDQUFDLElBQUksRUFBRSwwREFBMEQsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFbkYsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLE9BQU8sRUFBRSxFQUFFLElBQUksT0FBTyxFQUFFLEVBQUUsSUFBSSxPQUFPLEVBQUUsRUFBRSxDQUFDOztDQUVsRSxLQUFLOztDQUVMLElBQUk7O0NBRUosR0FBRyxLQUFLLGdCQUFnQixLQUFLLElBQUksR0FBRzs7Q0FFcEMsSUFBSSxJQUFJLFNBQVMsR0FBRyxhQUFhLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTVDLElBQUksS0FBSyxTQUFTLEtBQUssU0FBUyxHQUFHOztDQUVuQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRXRFLEtBQUssTUFBTTs7Q0FFWCxLQUFLLE9BQU8sQ0FBQyxJQUFJLEVBQUUsMkRBQTJELEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXBGLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxPQUFPLEVBQUUsRUFBRSxJQUFJLE9BQU8sRUFBRSxFQUFFLElBQUksT0FBTyxFQUFFLEVBQUUsQ0FBQzs7Q0FFbkUsS0FBSzs7Q0FFTCxJQUFJOztDQUVKOztDQUVBLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGtCQUFrQixFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVuRCxJQUFJLElBQUksV0FBVyxHQUFHLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUM7O0NBRWpELElBQUksb0JBQW9CLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRTFHLElBQUk7O0NBRUosR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRW5ELElBQUksSUFBSSxXQUFXLEdBQUcsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFM0QsSUFBSSxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFaEYsSUFBSTs7Q0FFSjs7Q0FFQSxHQUFHLEtBQUssY0FBYyxHQUFHOztDQUV6QixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRWpHLElBQUk7O0NBRUosR0FBRyxLQUFLLGNBQWMsR0FBRzs7Q0FFekIsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUVqRyxJQUFJOztDQUVKLEdBQUc7O0NBRUgsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUVqQyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxRQUFRLENBQUMsa0JBQWtCLENBQUM7Q0FDeEQsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUFDO0NBQ3RELEVBQUUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztDQUNwRCxFQUFFLElBQUksQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQztDQUM5QyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUM7O0NBRXBELEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSjtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxRQUFRLEVBQUUsS0FBSyxHQUFHOztDQUUzQixDQUFDLEtBQUssS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEdBQUcsT0FBTyxFQUFFLFFBQVEsQ0FBQzs7Q0FFN0MsQ0FBQyxJQUFJLEdBQUcsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXRCLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRzs7Q0FFbEQsRUFBRSxLQUFLLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFM0MsRUFBRTs7Q0FFRixDQUFDLE9BQU8sR0FBRyxDQUFDOztDQUVaLENBQUM7O0NBRUQ7Q0FDQTtDQUNBO0NBQ0E7O0NBRUEsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7O0NBRXpCLFNBQVMsY0FBYyxHQUFHOztDQUUxQixDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUV2RSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDOztDQUVsQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0NBQ2hCLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxnQkFBZ0IsQ0FBQzs7Q0FFOUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztDQUNuQixDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDOztDQUV0QixDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDOztDQUUzQixDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDOztDQUVsQixDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0NBQ3pCLENBQUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7O0NBRTVCLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUVoRCxDQUFDOztDQUVELGNBQWMsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxTQUFTLEVBQUUsRUFBRTs7Q0FFdEYsQ0FBQyxXQUFXLEVBQUUsY0FBYzs7Q0FFNUIsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJOztDQUV2QixDQUFDLFFBQVEsRUFBRSxZQUFZOztDQUV2QixFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQzs7Q0FFcEIsRUFBRTs7Q0FFRixDQUFDLFFBQVEsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFOUIsRUFBRSxLQUFLLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUc7O0NBRWhDLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLFFBQVEsRUFBRSxLQUFLLEVBQUUsR0FBRyxLQUFLLEdBQUcscUJBQXFCLEdBQUcscUJBQXFCLElBQUksS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUU5RyxHQUFHLE1BQU07O0NBRVQsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQzs7Q0FFdEIsR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsWUFBWSxFQUFFLFdBQVcsSUFBSSxFQUFFLFNBQVMsR0FBRzs7Q0FFNUMsRUFBRSxLQUFLLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyw0QkFBNEIsRUFBRSxHQUFHOztDQUVySCxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsd0VBQXdFLEVBQUUsQ0FBQzs7Q0FFNUYsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLGVBQWUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFcEYsR0FBRyxPQUFPOztDQUVWLEdBQUc7O0NBRUgsRUFBRSxLQUFLLElBQUksS0FBSyxPQUFPLEdBQUc7O0NBRTFCLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSx5RUFBeUUsRUFBRSxDQUFDO0NBQzdGLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsQ0FBQzs7Q0FFOUIsR0FBRyxPQUFPOztDQUVWLEdBQUc7O0NBRUgsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHLFNBQVMsQ0FBQzs7Q0FFdEMsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsWUFBWSxFQUFFLFdBQVcsSUFBSSxHQUFHOztDQUVqQyxFQUFFLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFakMsRUFBRTs7Q0FFRixDQUFDLGVBQWUsRUFBRSxXQUFXLElBQUksR0FBRzs7Q0FFcEMsRUFBRSxPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRWpDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLFFBQVEsRUFBRSxXQUFXLEtBQUssRUFBRSxLQUFLLEVBQUUsYUFBYSxHQUFHOztDQUVwRCxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFOztDQUVwQixHQUFHLEtBQUssRUFBRSxLQUFLO0NBQ2YsR0FBRyxLQUFLLEVBQUUsS0FBSztDQUNmLEdBQUcsYUFBYSxFQUFFLGFBQWEsS0FBSyxTQUFTLEdBQUcsYUFBYSxHQUFHLENBQUM7O0NBRWpFLEdBQUcsRUFBRSxDQUFDOztDQUVOLEVBQUU7O0NBRUYsQ0FBQyxXQUFXLEVBQUUsWUFBWTs7Q0FFMUIsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQzs7Q0FFbkIsRUFBRTs7Q0FFRixDQUFDLFlBQVksRUFBRSxXQUFXLEtBQUssRUFBRSxLQUFLLEdBQUc7O0NBRXpDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0NBQy9CLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDOztDQUUvQixFQUFFOztDQUVGLENBQUMsV0FBVyxFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUVsQyxFQUFFLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDOztDQUUxQyxFQUFFLEtBQUssUUFBUSxLQUFLLFNBQVMsR0FBRzs7Q0FFaEMsR0FBRyxNQUFNLENBQUMsc0JBQXNCLEVBQUUsUUFBUSxFQUFFLENBQUM7Q0FDN0MsR0FBRyxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7Q0FFL0IsR0FBRzs7Q0FFSCxFQUFFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDOztDQUV0QyxFQUFFLEtBQUssTUFBTSxLQUFLLFNBQVMsR0FBRzs7Q0FFOUIsR0FBRyxJQUFJLFlBQVksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDLGVBQWUsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFOUQsR0FBRyxZQUFZLENBQUMsc0JBQXNCLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDakQsR0FBRyxNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7Q0FFN0IsR0FBRzs7Q0FFSCxFQUFFLEtBQUssSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLEdBQUc7O0NBRW5DLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7O0NBRTdCLEdBQUc7O0NBRUgsRUFBRSxLQUFLLElBQUksQ0FBQyxjQUFjLEtBQUssSUFBSSxHQUFHOztDQUV0QyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDOztDQUVoQyxHQUFHOztDQUVILEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLE9BQU8sRUFBRSxZQUFZOztDQUV0Qjs7Q0FFQSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRXpCLEVBQUUsT0FBTyxTQUFTLE9BQU8sRUFBRSxLQUFLLEdBQUc7O0NBRW5DLEdBQUcsRUFBRSxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFN0IsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUUxQixHQUFHLE9BQU8sSUFBSSxDQUFDOztDQUVmLEdBQUcsQ0FBQzs7Q0FFSixFQUFFLEVBQUU7O0NBRUosQ0FBQyxPQUFPLEVBQUUsWUFBWTs7Q0FFdEI7O0NBRUEsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUV6QixFQUFFLE9BQU8sU0FBUyxPQUFPLEVBQUUsS0FBSyxHQUFHOztDQUVuQyxHQUFHLEVBQUUsQ0FBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRTdCLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFMUIsR0FBRyxPQUFPLElBQUksQ0FBQzs7Q0FFZixHQUFHLENBQUM7O0NBRUosRUFBRSxFQUFFOztDQUVKLENBQUMsT0FBTyxFQUFFLFlBQVk7O0NBRXRCOztDQUVBLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFekIsRUFBRSxPQUFPLFNBQVMsT0FBTyxFQUFFLEtBQUssR0FBRzs7Q0FFbkMsR0FBRyxFQUFFLENBQUMsYUFBYSxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUU3QixHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRTFCLEdBQUcsT0FBTyxJQUFJLENBQUM7O0NBRWYsR0FBRyxDQUFDOztDQUVKLEVBQUUsRUFBRTs7Q0FFSixDQUFDLFNBQVMsRUFBRSxZQUFZOztDQUV4Qjs7Q0FFQSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRXpCLEVBQUUsT0FBTyxTQUFTLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFdkMsR0FBRyxFQUFFLENBQUMsZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWpDLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFMUIsR0FBRyxPQUFPLElBQUksQ0FBQzs7Q0FFZixHQUFHLENBQUM7O0NBRUosRUFBRSxFQUFFOztDQUVKLENBQUMsS0FBSyxFQUFFLFlBQVk7O0NBRXBCOztDQUVBLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFekIsRUFBRSxPQUFPLFNBQVMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHOztDQUVuQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFM0IsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUUxQixHQUFHLE9BQU8sSUFBSSxDQUFDOztDQUVmLEdBQUcsQ0FBQzs7Q0FFSixFQUFFLEVBQUU7O0NBRUosQ0FBQyxNQUFNLEVBQUUsWUFBWTs7Q0FFckIsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDOztDQUUzQixFQUFFLE9BQU8sU0FBUyxNQUFNLEVBQUUsTUFBTSxHQUFHOztDQUVuQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRXhCLEdBQUcsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDOztDQUV0QixHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUVsQyxHQUFHLENBQUM7O0NBRUosRUFBRSxFQUFFOztDQUVKLENBQUMsTUFBTSxFQUFFLFlBQVk7O0NBRXJCLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFN0IsRUFBRSxPQUFPLFNBQVMsTUFBTSxHQUFHOztDQUUzQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDOztDQUU3QixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUVqRCxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFbEQsR0FBRyxPQUFPLElBQUksQ0FBQzs7Q0FFZixHQUFHLENBQUM7O0NBRUosRUFBRSxFQUFFOztDQUVKLENBQUMsYUFBYSxFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUVwQzs7Q0FFQSxFQUFFLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7O0NBRWpDLEVBQUUsS0FBSyxNQUFNLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUc7O0NBRTFDLEdBQUcsSUFBSSxTQUFTLEdBQUcsSUFBSSxzQkFBc0IsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDakYsR0FBRyxJQUFJLE1BQU0sR0FBRyxJQUFJLHNCQUFzQixFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFNUUsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsaUJBQWlCLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7Q0FDckYsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsZUFBZSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDOztDQUUzRSxHQUFHLEtBQUssUUFBUSxDQUFDLGFBQWEsSUFBSSxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRzs7Q0FFL0YsSUFBSSxJQUFJLGFBQWEsR0FBRyxJQUFJLHNCQUFzQixFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUV2RixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsY0FBYyxFQUFFLGFBQWEsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUM7O0NBRTNGLElBQUk7O0NBRUosR0FBRyxLQUFLLFFBQVEsQ0FBQyxjQUFjLEtBQUssSUFBSSxHQUFHOztDQUUzQyxJQUFJLElBQUksQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7Q0FFMUQsSUFBSTs7Q0FFSixHQUFHLEtBQUssUUFBUSxDQUFDLFdBQVcsS0FBSyxJQUFJLEdBQUc7O0NBRXhDLElBQUksSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDOztDQUVwRCxJQUFJOztDQUVKLEdBQUcsTUFBTSxLQUFLLE1BQU0sQ0FBQyxNQUFNLEdBQUc7O0NBRTlCLEdBQUcsS0FBSyxRQUFRLElBQUksUUFBUSxDQUFDLFVBQVUsR0FBRzs7Q0FFMUMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUVsQyxJQUFJOztDQUVKLEdBQUc7O0NBRUgsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsYUFBYSxFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUVwQyxFQUFFLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQzs7Q0FFcEIsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVwRCxHQUFHLElBQUksS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUMzQixHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7O0NBRW5ELEdBQUc7O0NBRUgsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxJQUFJLHNCQUFzQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUU3RSxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFdkMsRUFBRSxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDOztDQUVqQyxFQUFFLEtBQUssTUFBTSxDQUFDLE1BQU0sR0FBRzs7Q0FFdkIsR0FBRyxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUM7O0NBRTFDLEdBQUcsS0FBSyxRQUFRLENBQUMsa0JBQWtCLEtBQUssSUFBSSxHQUFHOztDQUUvQyxJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUM7Q0FDdkIsSUFBSSxRQUFRLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDOztDQUV4QyxJQUFJOztDQUVKLEdBQUcsS0FBSyxNQUFNLEtBQUssU0FBUyxHQUFHOztDQUUvQixJQUFJLE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFekMsSUFBSTs7Q0FFSixHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsR0FBRyxRQUFRLENBQUMsa0JBQWtCLENBQUM7Q0FDM0QsR0FBRyxNQUFNLENBQUMsaUJBQWlCLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUFDO0NBQ3pELEdBQUcsTUFBTSxDQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztDQUN2RCxHQUFHLE1BQU0sQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQztDQUNqRCxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUM7O0NBRXZELEdBQUcsUUFBUSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztDQUN2QyxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7Q0FDdEMsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0NBQ3JDLEdBQUcsUUFBUSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7Q0FDbEMsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDOztDQUVyQyxHQUFHLFFBQVEsR0FBRyxNQUFNLENBQUM7O0NBRXJCLEdBQUc7O0NBRUgsRUFBRSxJQUFJLFNBQVMsQ0FBQzs7Q0FFaEIsRUFBRSxLQUFLLFFBQVEsQ0FBQyxrQkFBa0IsS0FBSyxJQUFJLEdBQUc7O0NBRTlDLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDOztDQUV4QyxHQUFHLEtBQUssU0FBUyxLQUFLLFNBQVMsR0FBRzs7Q0FFbEMsSUFBSSxTQUFTLENBQUMsaUJBQWlCLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0NBQ3JELElBQUksU0FBUyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7O0NBRWpDLElBQUk7O0NBRUosR0FBRyxRQUFRLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDOztDQUV2QyxHQUFHOztDQUVILEVBQUUsS0FBSyxRQUFRLENBQUMsaUJBQWlCLEtBQUssSUFBSSxHQUFHOztDQUU3QyxHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQzs7Q0FFdEMsR0FBRyxLQUFLLFNBQVMsS0FBSyxTQUFTLEdBQUc7O0NBRWxDLElBQUksU0FBUyxDQUFDLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztDQUNwRCxJQUFJLFNBQVMsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDOztDQUVqQyxJQUFJOztDQUVKLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQzs7Q0FFdEMsR0FBRzs7Q0FFSCxFQUFFLEtBQUssUUFBUSxDQUFDLGdCQUFnQixLQUFLLElBQUksR0FBRzs7Q0FFNUMsR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7O0NBRXJDLEdBQUcsS0FBSyxTQUFTLEtBQUssU0FBUyxHQUFHOztDQUVsQyxJQUFJLFNBQVMsQ0FBQyxlQUFlLEVBQUUsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQ2pELElBQUksU0FBUyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7O0NBRWpDLElBQUk7O0NBRUosR0FBRyxRQUFRLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDOztDQUVyQyxHQUFHOztDQUVILEVBQUUsS0FBSyxRQUFRLENBQUMsYUFBYSxHQUFHOztDQUVoQyxHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQzs7Q0FFbEMsR0FBRyxLQUFLLFNBQVMsS0FBSyxTQUFTLEdBQUc7O0NBRWxDLElBQUksU0FBUyxDQUFDLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztDQUNoRCxJQUFJLFNBQVMsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDOztDQUVqQyxJQUFJOztDQUVKLEdBQUcsUUFBUSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7O0NBRWxDLEdBQUc7O0NBRUgsRUFBRSxLQUFLLFFBQVEsQ0FBQyx1QkFBdUIsR0FBRzs7Q0FFMUMsR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUM7O0NBRTVDLEdBQUcsS0FBSyxTQUFTLEtBQUssU0FBUyxHQUFHOztDQUVsQyxJQUFJLFNBQVMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDO0NBQ2xELElBQUksU0FBUyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7O0NBRWpDLElBQUk7O0NBRUosR0FBRyxRQUFRLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDOztDQUU1QyxHQUFHOztDQUVILEVBQUUsS0FBSyxRQUFRLENBQUMsZ0JBQWdCLEdBQUc7O0NBRW5DLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7Q0FDN0MsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7O0NBRWpDLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQzs7Q0FFckMsR0FBRzs7Q0FFSCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxZQUFZLEVBQUUsV0FBVyxRQUFRLEdBQUc7O0NBRXJDLEVBQUUsUUFBUSxDQUFDLGdCQUFnQixHQUFHLElBQUksY0FBYyxFQUFFLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUU1RSxFQUFFLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixFQUFFLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDOztDQUU5RCxFQUFFOztDQUVGLENBQUMsa0JBQWtCLEVBQUUsV0FBVyxRQUFRLEdBQUc7O0NBRTNDLEVBQUUsSUFBSSxTQUFTLEdBQUcsSUFBSSxZQUFZLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Q0FDbkUsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxJQUFJLGVBQWUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7O0NBRTlHLEVBQUUsS0FBSyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUc7O0NBRXJDLEdBQUcsSUFBSSxPQUFPLEdBQUcsSUFBSSxZQUFZLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Q0FDakUsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLGVBQWUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7O0NBRTFHLEdBQUc7O0NBRUgsRUFBRSxLQUFLLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRzs7Q0FFcEMsR0FBRyxJQUFJLE1BQU0sR0FBRyxJQUFJLFlBQVksRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztDQUMvRCxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLElBQUksZUFBZSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxlQUFlLEVBQUUsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7O0NBRXJHLEdBQUc7O0NBRUgsRUFBRSxLQUFLLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRzs7Q0FFakMsR0FBRyxJQUFJLEdBQUcsR0FBRyxJQUFJLFlBQVksRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztDQUN6RCxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLElBQUksZUFBZSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQzs7Q0FFOUYsR0FBRzs7Q0FFSCxFQUFFLEtBQUssUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHOztDQUVsQyxHQUFHLElBQUksSUFBSSxHQUFHLElBQUksWUFBWSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO0NBQzNELEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsSUFBSSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDOztDQUVqRyxHQUFHOztDQUVIOztDQUVBLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDOztDQUVoQzs7Q0FFQSxFQUFFLE1BQU0sSUFBSSxJQUFJLElBQUksUUFBUSxDQUFDLFlBQVksR0FBRzs7Q0FFNUMsR0FBRyxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7Q0FDbEIsR0FBRyxJQUFJLFlBQVksR0FBRyxRQUFRLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUVwRCxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRTNELElBQUksSUFBSSxXQUFXLEdBQUcsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUV4QyxJQUFJLElBQUksU0FBUyxHQUFHLElBQUksc0JBQXNCLEVBQUUsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTVFLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLEVBQUUsQ0FBQzs7Q0FFN0QsSUFBSTs7Q0FFSixHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDOztDQUV4QyxHQUFHOztDQUVIOztDQUVBLEVBQUUsS0FBSyxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUc7O0NBRXpDLEdBQUcsSUFBSSxXQUFXLEdBQUcsSUFBSSxzQkFBc0IsRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDdEYsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMsaUJBQWlCLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7O0NBRTNGLEdBQUc7O0NBRUgsRUFBRSxLQUFLLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRzs7Q0FFekMsR0FBRyxJQUFJLFdBQVcsR0FBRyxJQUFJLHNCQUFzQixFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUN0RixHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQzs7Q0FFNUYsR0FBRzs7Q0FFSDs7Q0FFQSxFQUFFLEtBQUssUUFBUSxDQUFDLGNBQWMsS0FBSyxJQUFJLEdBQUc7O0NBRTFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDOztDQUV6RCxHQUFHOztDQUVILEVBQUUsS0FBSyxRQUFRLENBQUMsV0FBVyxLQUFLLElBQUksR0FBRzs7Q0FFdkMsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRW5ELEdBQUc7O0NBRUgsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsa0JBQWtCLEVBQUUsWUFBWTs7Q0FFakMsRUFBRSxLQUFLLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSSxHQUFHOztDQUVuQyxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQzs7Q0FFakMsR0FBRzs7Q0FFSCxFQUFFLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDOztDQUUxQyxFQUFFLEtBQUssUUFBUSxLQUFLLFNBQVMsR0FBRzs7Q0FFaEMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUV2RCxHQUFHLE1BQU07O0NBRVQsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDOztDQUVoQyxHQUFHOztDQUVILEVBQUUsS0FBSyxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRzs7Q0FFL0csR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLG1JQUFtSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUU5SixHQUFHOztDQUVILEVBQUU7O0NBRUYsQ0FBQyxxQkFBcUIsRUFBRSxZQUFZOztDQUVwQyxFQUFFLElBQUksR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7Q0FDdkIsRUFBRSxJQUFJLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUU3QixFQUFFLE9BQU8sU0FBUyxxQkFBcUIsR0FBRzs7Q0FFMUMsR0FBRyxLQUFLLElBQUksQ0FBQyxjQUFjLEtBQUssSUFBSSxHQUFHOztDQUV2QyxJQUFJLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQzs7Q0FFdkMsSUFBSTs7Q0FFSixHQUFHLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDOztDQUUzQyxHQUFHLEtBQUssUUFBUSxHQUFHOztDQUVuQixJQUFJLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDOztDQUU1QyxJQUFJLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxRQUFRLEVBQUUsQ0FBQztDQUMzQyxJQUFJLEdBQUcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRTVCO0NBQ0E7O0NBRUEsSUFBSSxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUM7O0NBRXhCLElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFekQsS0FBSyxNQUFNLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDbkMsS0FBSyxNQUFNLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDbkMsS0FBSyxNQUFNLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDbkMsS0FBSyxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUM7O0NBRS9FLEtBQUs7O0NBRUwsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDOztDQUUxRCxJQUFJLEtBQUssS0FBSyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEdBQUc7O0NBRS9DLEtBQUssT0FBTyxDQUFDLEtBQUssRUFBRSw4SEFBOEgsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFM0osS0FBSzs7Q0FFTCxJQUFJOztDQUVKLEdBQUcsQ0FBQzs7Q0FFSixFQUFFLEVBQUU7O0NBRUosQ0FBQyxrQkFBa0IsRUFBRSxZQUFZOztDQUVqQzs7Q0FFQSxFQUFFOztDQUVGLENBQUMsb0JBQW9CLEVBQUUsWUFBWTs7Q0FFbkMsRUFBRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0NBQ3pCLEVBQUUsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztDQUNuQyxFQUFFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7O0NBRTNCLEVBQUUsS0FBSyxVQUFVLENBQUMsUUFBUSxHQUFHOztDQUU3QixHQUFHLElBQUksU0FBUyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDOztDQUU3QyxHQUFHLEtBQUssVUFBVSxDQUFDLE1BQU0sS0FBSyxTQUFTLEdBQUc7O0NBRTFDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxlQUFlLEVBQUUsSUFBSSxZQUFZLEVBQUUsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRWxHLElBQUksTUFBTTs7Q0FFVjs7Q0FFQSxJQUFJLElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDOztDQUV4QyxJQUFJLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXZELEtBQUssS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFcEIsS0FBSzs7Q0FFTCxJQUFJOztDQUVKLEdBQUcsSUFBSSxPQUFPLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7O0NBRXpDLEdBQUcsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUNsQixHQUFHLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Q0FDbEUsR0FBRyxJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUU5Qzs7Q0FFQSxHQUFHLEtBQUssS0FBSyxHQUFHOztDQUVoQixJQUFJLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7O0NBRTlCLElBQUksS0FBSyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsR0FBRzs7Q0FFL0IsS0FBSyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRXhDLEtBQUs7O0NBRUwsSUFBSSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHOztDQUV4RCxLQUFLLElBQUksS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFN0IsS0FBSyxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO0NBQzdCLEtBQUssSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQzs7Q0FFN0IsS0FBSyxNQUFNLElBQUksQ0FBQyxHQUFHLEtBQUssRUFBRSxFQUFFLEdBQUcsS0FBSyxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUc7O0NBRS9ELE1BQU0sRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ2hDLE1BQU0sRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ2hDLE1BQU0sRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUVoQyxNQUFNLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ3BDLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDcEMsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFcEMsTUFBTSxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUM5QixNQUFNLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQzlCLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFckIsTUFBTSxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztDQUM1QixNQUFNLE9BQU8sRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztDQUNoQyxNQUFNLE9BQU8sRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQzs7Q0FFaEMsTUFBTSxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztDQUM1QixNQUFNLE9BQU8sRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztDQUNoQyxNQUFNLE9BQU8sRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQzs7Q0FFaEMsTUFBTSxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztDQUM1QixNQUFNLE9BQU8sRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztDQUNoQyxNQUFNLE9BQU8sRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQzs7Q0FFaEMsTUFBTTs7Q0FFTixLQUFLOztDQUVMLElBQUksTUFBTTs7Q0FFVjs7Q0FFQSxJQUFJLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRzs7Q0FFN0QsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNsQyxLQUFLLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztDQUN0QyxLQUFLLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7Q0FFdEMsS0FBSyxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUM3QixLQUFLLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQzdCLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFcEIsS0FBSyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztDQUN6QixLQUFLLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztDQUM3QixLQUFLLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQzs7Q0FFN0IsS0FBSyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7Q0FDN0IsS0FBSyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7Q0FDN0IsS0FBSyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7O0NBRTdCLEtBQUssT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0NB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QUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7Q0FDdkQsRUFBRSxLQUFLLElBQUksQ0FBQyxZQUFZLEtBQUssUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQzs7Q0FFOUUsRUFBRSxLQUFLLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztDQUN0RCxFQUFFLEtBQUssSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDOztDQUV2RSxFQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztDQUNsQyxFQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztDQUNsQyxFQUFFLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQzs7Q0FFcEM7Q0FDQSxFQUFFLEtBQUssSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUUzRCxFQUFFLEtBQUssSUFBSSxDQUFDLFNBQVMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO0NBQzlELEVBQUUsS0FBSyxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Q0FDbkUsRUFBRSxLQUFLLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztDQUNoRSxFQUFFLEtBQUssSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDOztDQUUxRCxFQUFFLEtBQUss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QUcsR0FBRyxTQUFTLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUN2RCxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUM7Q0FDM0YsTUFBTSxPQUFPLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFckQsTUFBTSxNQUFNLEtBQUssRUFBRSxJQUFJLE1BQU0sR0FBRzs7Q0FFaEM7O0NBRUEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ2IsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUM7Q0FDaEUsTUFBTSxPQUFPLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUV6QyxNQUFNLE1BQU07O0NBRVo7O0NBRUEsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxHQUFHLEdBQUcsU0FBUyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDckQsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQztDQUN6RixNQUFNLE9BQU8sR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFB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QUFJLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQzs7Q0FFN0MsR0FBRzs7Q0FFSCxFQUFFLEtBQUssT0FBTyxJQUFJLENBQUMsR0FBRzs7Q0FFdEIsR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQztDQUM5QyxHQUFHLEtBQUssR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDOztDQUU5QyxHQUFHLE1BQU07O0NBRVQsR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQztDQUM5QyxHQUFHLEtBQUssR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDOztDQUU5QyxHQUFHOztDQUVILEVBQUUsS0FBSyxFQUFFLElBQUksR0FBRyxLQUFLLFFBQVEsS0FBSyxHQUFHLElBQUksRUFBRSxHQUFHLE9BQU8sSUFBSSxDQUFDOztDQUUxRDtDQUNBOztDQUVBLEVBQUUsS0FBSyxLQUFLLEdBQUcsSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQzs7Q0FFcEQsRUFBRSxLQUFLLEtBQUssR0FBRyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDOztDQUVwRCxFQUFFLEtBQUssT0FBTyxJQUFJLENBQUMsR0FBRzs7Q0FFdEIsR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQztDQUM5QyxHQUFHLEtBQUssR0FBRyxFQUFFLEdBQUcsQ0FB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QyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRW5HLEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7O0NBRUo7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLFNBQVMsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUc7O0NBRXBDLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFdkIsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQzs7Q0FFcEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsS0FBSyxTQUFTLEdBQUcsUUFBUSxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7Q0FDMUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsS0FBSyxTQUFTLEdBQUcsUUFBUSxHQUFHLElBQUksaUJBQWlCLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLFFBQVEsRUFBRSxFQUFFLENBQUM7O0NBRWxILENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQzs7Q0FFbkMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzs7Q0FFM0IsQ0FBQzs7Q0FFRCxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUU7O0NBRXJFLENBQUMsV0FBVyxFQUFFLElBQUk7O0NBRWxCLENBQUMsTUFBTSxFQUFFLElBQUk7O0NBRWIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRWpDLEVBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7O0NBRXhCLEVBQUU7O0NBRUYsQ0FB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LEVBQUUsQ0FBQzs7Q0FFMUQsTUFBTTs7Q0FFTixLQUFLOztDQUVMLElBQUksTUFBTSxLQUFLLFFBQVEsQ0FBQyxVQUFVLEdBQUc7O0NBRXJDLElBQUksSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztDQUN0QixJQUFJLElBQUksZUFBZSxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRXBELElBQUksSUFBSSxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztDQUNyQyxJQUFJLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7Q0FDL0IsSUFBSSxJQUFJLEdBQUcsQ0FBQzs7Q0FFWixJQUFJLElBQUksYUFBYSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDcEQsSUFBSSxLQUFLLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxhQUFhLENBQUM7O0NBRXhELElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFdkQsS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDM0IsS0FBSyxJQUFJLFlBQVksR0FBRyxlQUFlLEdBQUcsUUFBUSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsR0FBRyxRQUFRLENBQUM7O0NBRXBGLEtBQUssS0FBSyxZQUFZLEtBQUssU0FBUyxHQUFHLFNBQVM7O0NBRWhELEtBQUssR0FBRyxHQUFHLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDOUIsS0FBSyxHQUFHLEdBQUcsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUM5QixLQUFLLEdBQUcsR0FBRyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUU5QixLQUFLLEtBQUssWUFB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SUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFOUIsQ0FBQzs7Q0FFRDs7Q0FFQSxTQUFTLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztDQUU5QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEdBQUc7O0NBRTFCLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVoQyxFQUFFLE1BQU07O0NBRVIsRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRXRDLEVBQUU7O0NBRUYsQ0FBQzs7Q0FFRCxTQUFTLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztDQUU5QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEdBQUc7O0NBRTFCLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRTNDLEVBQUUsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxHQUFHOztDQUVqQyxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUUzQyxFQUFFLE1BQU07O0NBRVIsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWhDLEVBQUU7O0NBRUYsQ0FBQzs7Q0FFRCxTQUFTLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztDQUU5QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEdBQUc7O0NBRTFCLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVoQyxFQUFFLE1BQU07O0NBRVIsR0FBRyxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVqRCxFQUFFOztDQUVGLENBQUM7O0NBRUQ7O0NBRUEsU0FBUyxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRzs7Q0FFOUIsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQzs7Q0FFMUQsQ0FBQzs7Q0FFRCxTQUFTLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztDQUU5QixDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsS0FBSyxTQUFTLEdBQUc7O0NBRWpDLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUU3QyxFQUFFLE1BQU07O0NBRVIsRUFBRSxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztDQUM5QixFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQzs7Q0FFckQsRUFBRTs7Q0FFRixDQUFDOztDQUVELFNBQVMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUc7O0NBRTlCLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxLQUFLLFNBQVMsR0FBRzs7Q0FFakMsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTdDLEVBQUUsTUFBTTs7Q0FFUixFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0NBQzlCLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDOztDQUVyRCxFQUFFOztDQUVGLENBQUM7O0NBRUQ7O0NBRUEsU0FBUyxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxRQUFRLEdBQUc7O0NBRXZDLENBQUMsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Q0FDeEMsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7Q0FDakMsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRWxELENBQUM7O0NBRUQsU0FBUyxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxRQUFRLEdBQUc7O0NBRXZDLENBQUMsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Q0FDeEMsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7Q0FDakMsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLENBQUMsSUFBSSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFeEQsQ0FBQzs7Q0FFRDs7Q0FFQSxTQUFTLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztDQUU5QixDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFL0IsQ0FBQzs7Q0FFRCxTQUFTLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztDQUU5QixDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFL0IsQ0FBQzs7Q0FFRCxTQUFTLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztDQUU5QixDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFL0IsQ0FBQzs7Q0FFRDs7Q0FFQSxTQUFTLGlCQUFpQixFQUFFLElBQUksR0FBRzs7Q0FFbkMsQ0FBQyxTQUFTLElBQUk7O0NBRWQsRUFBRSxLQUFLLE1BQU0sRUFBRSxPQUFPLFVBQVUsQ0FBQztDQUNqQyxFQUFFLEtBQUssTUFBTSxFQUFFLE9BQU8sV0FBVyxDQUFDO0NBQ2xDLEVBQUUsS0FBSyxNQUFNLEVBQUUsT0FBTyxXQUFXLENBQUM7Q0FDbEMsRUFBRSxLQUFLLE1BQU0sRUFBRSxPQUFPLFdBQVcsQ0FBQzs7Q0FFbEMsRUFBRSxLQUFLLE1BQU0sRUFBRSxPQUFPLFdBQVcsQ0FBQztDQUNsQyxFQUFFLEtBQUssTUFBTSxFQUFFLE9BQU8sV0FBVyxDQUFDO0NBQ2xDLEVBQUUsS0FBSyxNQUFNLEVBQUUsT0FBTyxXQUFXLENBQUM7O0NBRWxDLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQyxLQUFLLE1BQU0sRUFBRSxPQUFPLFVBQVUsQ0FBQztDQUM5QyxFQUFFLEtBQUssTUFBTSxFQUFFLE9BQU8sVUFBVSxDQUFDOztDQUVqQyxFQUFFLEtBQUssTUFBTSxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUUsT0FBTyxVQUFVLENBQUM7Q0FDOUMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDLEtBQUssTUFBTSxFQUFFLE9BQU8sV0FBVyxDQUFDO0NBQy9DLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQyxLQUFLLE1BQU0sRUFBRSxPQUFPLFdBQVcsQ0FBQztDQUMvQyxFQUFFLEtBQUssTUFBTSxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUUsT0FBTyxXQUFXLENBQUM7O0NBRS9DLEVBQUU7O0NBRUYsQ0FBQzs7Q0FFRDs7Q0FFQSxTQUFTLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztDQUU5QixDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFL0IsQ0FBQztDQUNELFNBQVMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUc7O0NBRTlCLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUvQixDQUFDOztDQUVEOztDQUVBLFNBQVMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUc7O0NBRTlCLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUV4RCxDQUFDOztDQUVELFNBQVMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUc7O0NBRTlCLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUV4RCxDQUFDOztDQUVELFNBQVMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUc7O0NBRTlCLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUV4RCxDQUFDOztDQUVEOztDQUVBLFNBQVMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUc7O0NBRTlCLENBQUMsRUFBRSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxD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RyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRzs7Q0FFbEQsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0NBQ2xCLEdBQUcsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRXRCLEVBQUUsS0FBSyxDQUFDLENBQUMsV0FBVyxLQUFLLEtBQUssR0FBRzs7Q0FFakM7Q0FDQSxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRXZDLEdBQUc7O0NBRUgsRUFBRTs7Q0FFRixDQUFDLENBQUM7O0NBRUYsYUFBYSxDQUFDLFlBQVksR0FBRyxXQUFXLEdBQUcsRUFBRSxNQUFNLEdBQUc7O0NBRXRELENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUVaLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRzs7Q0FFbEQsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDbkIsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXBDLEVBQUU7O0NBRUYsQ0FBQyxPQUFPLENBQUMsQ0FBQzs7Q0FFVixDQUFDLENBQUM7O0NBRUY7Q0FDQTtDQUNBOztDQUVBLFNBQVMsY0FBYyxFQUFFLE1BQU0sR0FBRzs7Q0FFbEMsQ0FBQyxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDOztDQUVsQyxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMs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LEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0NBQ3ZFLEtBQUssSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7O0NBRXZFLEtBQUssS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDekIsS0FBSyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN6QixLQUFLLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUV6QixLQUFLLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3pCLEtBQUssS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDekIsS0FBSyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFekIsS0FBSyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN6QixLQUFLLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3pCLEtBQUssS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXpCLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQzs7Q0FFNUUsR0FBRyxLQUFLLENBQUMsZUFBZSxFQUFFLGlCQUFpQixDQUFDLE1BQU0sRUFB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LEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXZCOztDQUVBLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0NBQzNCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO0NBQ3pDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0NBQzVDLElBQUksS0FBSyxLQUFLLENBQUMsR0FBRyxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7O0NBRXJFLElBQUk7O0NBRUo7O0NBRUEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVoRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFckMsSUFBSSxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sS0FBSyxFQUFFLENBQUMsUUFBUSxLQUFLLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRSxNQUFNLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssU0FBUyxFQUFFLEdBQUc7O0NBRTVHOztDQUVBLEtBQUssS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRTdDLEtBQUssTUFBTTs7Q0FFWDs7Q0FFQSxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRTVCLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHOztDQUVIO0NBQ0E7O0NB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LEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztDQUMvQixJQUFJLElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7Q0FDekMsSUFBSSxJQUFJLFNBQVMsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQzs7Q0FFOUMsSUFBSSxLQUFLLEtBQUssS0FBSyxJQUFJLEdBQUc7O0NBRTFCLEtBQUssSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQzs7Q0FFL0IsS0FBSyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUUxRCxNQUFNLElBQUksQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFM0IsTUFBTSxRQUFRLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0NBRTdDLE1BQU0sU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFL0IsTUFBTTs7Q0FFTixLQUFLLE1BQU07O0NBRVgsS0FBSyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFOUQsTUFBTSxRQUFRLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0NBRTdDLE1BQU0sU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFL0IsTUFBTTs7Q0FFTixLQUFLOztDQUVMLElBQUksTUFBTTs7Q0FFVixJQUFJLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7O0NBRXJDLElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUs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QU0sQ0FBQzs7Q0FFWjs7Q0FFQSxDQUFDLEtBQUssUUFBUSxJQUFJLFFBQVEsQ0FBQyxVQUFVLEdBQUc7O0NBRXhDOztDQUVBLEVBQUUsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQzs7Q0FFN0IsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFL0MsR0FBRyxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXpCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRTlCLElBQUksS0FBSyxHQUFHLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUM5QixJQUFJLEtBQUssR0FBRyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQzFDLElBQUksSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO0NBQ3pDLElBQUksSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUV6QyxJQUFJLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFdEMsSUFBSSxLQUFLLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxTQUFTLEdBQUc7O0NBRXRDLEtBQUssS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7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LEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXhDLE1BQU0sS0FBSyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssU0FBUyxHQUFHOztDQUV4QyxPQUFPLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUUvRCxPQUFPOztDQUVQLE1BQU07O0NBRU4sS0FBSzs7Q0FFTCxJQUFJOztDQUVKOztDQUVBLEdBQUcsTUFBTSxHQUFHLElBQUksS0FBSyxHQUFHOztDQUV4QixJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXJCLElBQUksTUFBTSxDQUFDLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7Q0FDckQsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRWxELElBQUksTUFBTSxDQUFDLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7Q0FDckQsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRWxELElBQUk7O0NBRUosR0FBRyxNQUFNOztDQUVUOztDQUVBLEdBQUcsUUFBUSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDOztDQUUzQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFH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Q0FFZCxDQUFDLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQzs7Q0FFbkIsQ0FBQyxJQUFJLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUU1QixDQUFDLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Q0FDNUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUU1QyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzs7Q0FFVjs7Q0FFQSxDQUFDLElBQUksVUFBVSxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUM7O0NBRTdCLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRWxDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQzs7Q0FFckIsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFbkMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDOztDQUV0Qjs7Q0FFQSxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ3BCLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVyQzs7Q0FFQTs7Q0FFQSxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUc7O0NBRXZCLElBQUksSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQzNCLElBQUksRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENB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QUFFLENBQUM7Q0FDaEYsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDaEYsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRWhGLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUNuRCxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDbkQsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUVuRCxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTFELEdBQUcsSUFBSSxHQUFHLEdBQUcsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUVqQyxHQUFHLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDbkMsR0FBRyxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FB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Q0FBQyxJQUFJLFFBQVEsR0FBRztDQUNoQixFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQy9DLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDL0MsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNoRCxFQUFFLENBQUM7O0NBRUgsQ0FBQyxJQUFJLE9BQU8sR0FBRztDQUNmLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFO0NBQ3RELEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ25ELEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFB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RSxDQUFDLEVBQUUsQ0FBQzs7Q0FFckI7Q0FDQSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUN4QixHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVyQjtDQUNBLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQ3hCLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDcEIsRUFBRSxDQUFDOztDQUVILENBQUMsSUFBSSxPQUFPLEdBQUc7Q0FDZixFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRTtDQUNqQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtDQUNqQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUNsQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtDQUNoQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRTtDQUNqQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMs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R0FBRyxDQUFDLEdBQUc7O0NBRTNDO0NBQ0E7O0NBRUEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsY0FBYyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQzVDLEdBQUcsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNuQyxHQUFHLElBQUksRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVqQztDQUNBOztDQUVBLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDN0MsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUM3QyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUU3QyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFakQ7O0NBRUEsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7Q0FFL0MsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRWhEOztDQUVBLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsZUFBZSxFQUFFLENBQUM7Q0FDbkMsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxjQUFjLEVBQUUsQ0FBQzs7Q0FFbEMsR0FBRzs7Q0FFSCxFQUFFOztDQUVGOztDQUVBLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxlQUFlLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRTNDLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxjQUFjLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRTNDOztDQUVBLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxjQUFjLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Q0FDMUQsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLGNBQWMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztDQUNsRCxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsY0FBYyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQzFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxjQUFjLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRWxEOztDQUVBLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzNCLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUzQixHQUFHOztDQUVILEVBQUU7O0NBRUY7O0NBRUEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDO0NBQzFCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsSUFBSSxzQkFBc0IsRUFBRSxRQUFR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LEdBQUcsQ0FBQyxHQUFHLGVBQWUsR0FBRyxHQUFHLENBQUM7Q0FDckMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsY0FBYyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUU1Qzs7Q0FFQSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNoRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNoRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRW5DLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVqRDs7Q0FFQSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDckMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ3JDLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7O0NBRW5ELEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVoRDs7Q0FFQSxHQUFHLEdBQUcsQ0FBQyxJ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LENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0NBQzNFLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7Q0FDM0UsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUU1RTs7Q0FFQSxDQUFDLElBQUksSUFBSSxHQUFHLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO0NBQ3ZELEVBQUUsSUFBSSxHQUFHLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7O0NBRXJEOztDQUVBLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQzs7Q0FFbkIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksR0FBRzs7Q0FFNUIsRUFBRSxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSTtDQUN2QyxJQUFJLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7Q0FDN0QsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxPQUFPLEtBQUssQ0FBQztDQUNsRCxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDOztDQUVkLEVBQUU7O0NBRUY7O0NBRUEsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQzs7Q0FFZixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxHQUFHOztDQUU1QixFQUFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJO0NBQ3ZDLElBQUksZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRTtDQUM3RCxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLE9BQU8sS0FBSyxDQUFDOztDQUVsRCxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxPQUFPLElBQUksQ0FBQzs7Q0FFYixDQUFDOztDQUVEOztDQUVBLFNBQVMsc0JBQXNCLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxH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SUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0NBQzNDLE1BQU0sZUFBZSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHOztDQUUxRixHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFN0MsR0FBRyxLQUFLLEVBQUUsR0FBRyxHQUFHLE1BQU0sTUFBTSxHQUFHLEtBQUssTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLGFBQWEsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUc7O0NBRTFGLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNWLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQzs7Q0FFakIsSUFBSTs7Q0FFSixHQUFHOztDQUVILEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7O0NBRWIsRUFBRTs7Q0FFRixDQUFDLE9BQU8sQ0FBQyxDQUFDOztDQUVWLENBQUM7O0NBRUQ7O0NBRUEsU0FBUyxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxHQUFHOztDQUVsRCxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQzs7Q0FFZixDQUFDLEdBQUc7O0NBRUosRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUs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LElBQUksRUFBRSxPQUFPLEdBQUc7O0NBRTdDOztDQUVBLENBQUMsQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDO0NBQ3BDLENBQUMsQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDOztDQUVwQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssVUFBVSxDQUFDO0NBQ3JDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxVQUFVLENBQUM7Q0FDckMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLFVBQVUsQ0FBQztDQUNyQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssVUFBVSxDQUFDOztDQUVyQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssVUFBVSxDQUFDO0NBQ3JDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxVQUFVLENBQUM7Q0FDckMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLFVBQVUsQ0FBQztDQUNyQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssVUFBVSxDQUFDOztDQUVyQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQzs7Q0FFdkIsQ0FBQzs7Q0FFRDs7Q0FFQSxTQUFTLFdBQVcsRUFBRSxLQUFLLEdBQUc7O0NBRTlCLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLFFBQVEsR0FBRyxLQUFLLENBQUM7O0NBRWpDLENBQUMsR0FBRzs7Q0FFSixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUM7Q0FDdkMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQzs7Q0FFYixFQUFFLFNBQVMsQ0FBQyxLQUFLLEtBQUssR0FBRzs7Q0FFekIsQ0FBQyxPQUFPLFFBQVEsQ0FBQzs7Q0FFakIsQ0FBQzs7Q0FFRDs7Q0FFQSxTQUFTLGVBQWUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHOztDQUUzRCxDQUFDLE9BQU8sRUFBRSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUM7Q0FDbEUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQztDQUM1RCxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7O0NBRTdELENBQUM7O0NBRUQ7O0NBRUEsU0FBUyxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFakMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7Q0FDM0UsRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFekUsQ0FBQzs7Q0FFRDs7Q0FFQSxTQUFTLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFekIsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUV0RSxDQUFDOztDQUVEOztDQUVBLFNBQVMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUc7O0NBRTFCLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDOztDQUV2QyxDQUFDOztDQUVEOztDQUVBLFNBQVMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRzs7Q0FFdEMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtDQUM1QyxLQUFLLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLE9BQU8sSUFBSSxDQUFDOztDQUUxRCxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUM7Q0FDekQsS0FBSyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUV2RCxDQUFDOztDQUVEOztDQUVBLFNBQVMsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFbkMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRVgsQ0FBQyxHQUFHOztDQUVKLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Q0FDekUsTUFBTSxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHOztDQUV0QyxHQUFHLE9BQU8sSUFBSSxDQUFDOztDQUVmLEdBQUc7O0NBRUgsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQzs7Q0FFYixFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRzs7Q0FFckIsQ0FBQyxPQUFPLEtBQUssQ0FBQzs7Q0FFZCxDQUFDOztDQUVEOztDQUVBLFNBQVMsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRS9CLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7Q0FDckMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDO0NBQ3hELEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUV2RCxDQUFDOztDQUVEOztDQUVBLFNBQVMsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRTlCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztDQUNWLEVBQUUsTUFBTSxHQUFHLEtBQUs7Q0FDaEIsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztDQUN4QixFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7O0NBRXpCLENBQUMsR0FBRzs7Q0FFSixFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0NBQ2pFLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUc7O0NBRTlFLEdBQUcsTUFBTSxHQUFHLEVBQUUsTUFBTSxDQUFDOztDQUVyQixHQUFHOztDQUVILEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7O0NBRWIsRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUc7O0NBRXJCLENBQUMsT0FBTyxNQUFNLENBQUM7O0NBRWYsQ0FBQzs7Q0FFRDtDQUNBOztDQUVBLFNBQVMsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRTlCLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7Q0FDbkMsRUFBRSxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7Q0FDaEMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUk7Q0FDYixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDOztDQUVkLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7Q0FDWixDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDOztDQUVaLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7Q0FDZCxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDOztDQUVkLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7Q0FDZCxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDOztDQUVkLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7Q0FDZCxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDOztDQUVkLENBQUMsT0FBTyxFQUFFLENBQUM7O0NBRVgsQ0FBQzs7Q0FFRDs7Q0FFQSxTQUFTLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEdBQUc7O0NBRXJDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFN0IsQ0FBQyxLQUFLLEVB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RSxDQUFDOztDQUVsQjs7Q0FFQSxFQUFFLGNBQWMsRUFBRSxDQUFDOzs7Q0FHbkI7O0NBRUEsRUFBRSxTQUFTLGFBQWEsR0FBRzs7Q0FFM0IsR0FBRyxJQUFJLEtBQUssR0FBRyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzs7Q0FFeEMsR0FBRyxLQUFLLFlBQVksR0FBRzs7Q0FFdkIsSUFBSSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7Q0FDbEIsSUFBSSxJQUFJLE1BQU0sR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDOztDQUU5Qjs7Q0FFQSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVsQyxLQUFLLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDdkIsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQzs7Q0FFdEUsS0FBSzs7Q0FFTCxJQUFJLEtBQUssR0FBRyxLQUFLLEdBQUcsYUFBYSxHQUFHLENBQUMsQ0FBQztDQUN0QyxJQUFJLE1BQU0sR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDOztDQUUxQjs7Q0FFQSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVsQyxLQUFLLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDdkIsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQzs7Q0FFdEUsS0FBSzs7Q0FFTCxJQUFJLE1BQU07O0NBRVY7O0NBRUEsSUFB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QUM7Q0FDckIsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDckIsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRXJCLEdBQUc7O0NBRUgsRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRTVCLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2xCLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2xCLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVsQixHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNsQixHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNsQixHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7O0NBR2xCLEdBQUcsSUFBSSxTQUFTLEdBQUcsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Q0FDNUMsR0FBRyxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUFFLFNBQVMsR0FBRyxDQUFDLEVBQUUsU0FBUyxHQUFHLENBQUMsRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0NBRTFILEdBQUcsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQ3JCLEdBQUcsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQ3JCLEdBQUcsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUVyQixHQUFHLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUNyQixHQUFHLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUNyQixHQUFHLEtBQUssRUFBRSxHQUFHLEVBQUUs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QUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRTVCLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVsRDs7Q0FFQSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7Q0FDbEMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Q0FDNUIsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDOztDQUVsQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFakQ7O0NBRUEsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUM7Q0FDdkIsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDOztDQUVwQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7OztDQUcxQixHQUFHOztDQUVILEVBQUU7O0NBRUY7O0NBRUEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFbkMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRWpELEdBQUcsSUFBSSxHQUFHLENB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QUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVsRCxFQUFFLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFeEIsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVqQyxHQUFHLEtBQUssR0FBRyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDN0IsR0FBRyxLQUFLLEdBQUcsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUN6QyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztDQUN4QyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFeEMsR0FBRyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXJDLEdBQUcsS0FBSyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssU0FBUyxHQUFHOztDQUVyQyxJQUFJLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQzs7Q0FFeEYsSUFBSSxNQUFNOztDQUVWLElBQUksS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7O0NBRTNCLElB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QU8sRUFBRSxDQUFDOztDQUU3QixFQUFFLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQzs7Q0FFckI7Q0FDQSxFQUFFLElBQUksS0FBSyxHQUFHLEVBQUUsWUFBWSxHQUFHLFNBQVMsS0FBSyxNQUFNLENBQUM7O0NBRXBEOztDQUVBLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxjQUFjLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRTNDLEdBQUcsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDOztDQUVyQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxjQUFjLENBQUM7O0NBRTlCOztDQUVBLEdBQUcsSUFBSSxNQUFNLEdBQUcsQ0FBQyxLQUFLLFlBQVksR0FBRyxTQUFTLEVBQUUsR0FBRyxTQUFTLENBQUM7O0NBRTdELEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxjQUFjLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRTVDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGNBQWMsQ0FBQzs7Q0FFL0IsSUFBSSxJQUFJLEtBQUssR0FBRyxDQUFDLEdBQUcsV0FBVyxHQUFHLFVBQVUsQ0FBQzs7Q0FFN0MsSUFBSSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDO0NBQ3JDLElBQUksSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFckM7O0NBRUEsSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxRQUFRLENBQUM7Q0FDakMsSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLE1BQU0sR0FBRyxVQUFVLENBQUM7Q0FDekMsSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxRQUFRLENBQUM7Q0FDakMsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFB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TyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFakQsSUFBSSxLQUFLLFFBQVEsQ0FBQyxTQUFTLEdBQUc7O0NBRTlCLEtBQUssSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQzs7Q0FFaEUsS0FBSyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV4QyxNQUFNLE1BQU0sRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFcEMsTUFBTSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFeEQsT0FBTyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDcEYsT0FBTyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7Q0FDNUMsT0FBTyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7Q0FDMUMsT0FBTyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7O0NBRTVDLE9BQU87O0NBRVAsTUFBTTs7Q0FFTixLQUFLLE1BQU07O0NBRVgsS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO0NBQzFDLEtBQUssT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztDQUM1QyxLQUFLLE9BQU8sQ0FBQyxPQUFPLEdBQUcsUUFBUSxD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OztDQUVBO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLFNBQVMsU0FBUyxHQUFHOztDQUVyQixDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFcEM7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBLENBQUMsU0FBUyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHOztDQUVqQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDVixFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDVixFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN2QyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFakMsRUFBRTs7Q0FFRixDQUFDLE9BQU87O0NBRVIsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxHQUFHOztDQUV2RCxHQUFHLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsT0FBTyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUVoRSxHQUFHOztDQUVILEVBQUUsd0JBQXdCLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUc7O0NBRXZFO0NBQ0EsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVB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USxJQUFJLFFBQVEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7O0NBRXBGLEVBQUUsTUFBTSxLQUFLLE1BQU0sS0FBSyxDQUFDLElBQUksUUFBUSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUc7O0NBRWxELEVBQUUsUUFBUSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDbkIsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDOztDQUViLEVBQUU7O0NBRUYsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFcEIsQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLElBQUksUUFBUSxHQUFHLENBQUMsR0FBRzs7Q0FFcEMsRUFBRSxFQUFFLEdBQUcsTUFBTSxFQUFFLEVBQUUsUUFBUSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzs7Q0FFdEMsRUFBRSxNQUFNOztDQUVSO0NBQ0EsRUFBRSxHQUFHLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDaEUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDOztDQUVYLEVBQUU7O0NBRUYsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQztDQUM3QixDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsRUFBRSxRQUFRLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDOztDQUVyQyxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sSUFBSSxRQUFRLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRzs7Q0FFeEMsRUFBRSxFQUFFLEdBQUcsTUFBTSxFQUFFLEVBQUUsUUFBUSxH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QUksT0FBTyxFQUFFLENBQUM7O0NBRTdDLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQzs7Q0FFNUQsQ0FBQyxLQUFLLENBQUMsR0FBRztDQUNWLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO0NBQzFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO0NBQzFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO0NBQzFDLEVBQUUsQ0FBQzs7Q0FFSCxDQUFDLE9BQU8sS0FBSyxDQUFDOztDQUVkLENBQUMsQ0FBQzs7Q0FFRixpQkFBaUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFdBQVcsTUFBTSxHQUFHOztDQUV2RCxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRTNDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQzNCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQzNCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFD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O0NBQzFCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7O0NBRW5DLENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNoQyxDQUFDLElBQUksTUFBTSxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUM7O0NBRTNCLENBQUMsSUFBSSxFQUFFLEdBQUcsTUFBTSxFQUFFLFFBQVEsS0FBSyxDQUFDLEdBQUcsUUFBUSxHQUFHLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQztDQUM3RCxDQUFDLElBQUksRUFBRSxHQUFHLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQztDQUM3QixDQUFDLElBQUksRUFBRSxHQUFHLE1BQU0sRUFBRSxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDO0NBQ3BGLENBQUMsSUFBSSxFQUFFLEdBQUcsTUFBTSxFQUFFLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0NBRXBGLENBQUMsS0FBSyxDQUFDLEdBQUc7Q0FDVixFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtDQUM5QyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtDQUM5QyxFQUFFLENBQUM7O0NBRUgsQ0FBQyxPQUFPLEtBQUssQ0FBQzs7Q0FFZCxDQUFDLENBQUM7O0NBRUYsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsV0FBVyxNQUFNLEdBQUc7O0NBRWpELENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFM0MsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQzs7Q0FFbEIsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFMUQsRUFBRSxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVqQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDOztDQUVwQyxFQUFFOztDQUVGLENBQUMsT0FBTyxJQUFJLENBQUM7O0NBRWIsQ0FBQyxDQUFDOztDQUVGLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFlBQVk7O0NBRTNDLENBQUMsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUVoRCxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDOztDQUVsQixDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV4RCxFQUFFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDL0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQzs7Q0FFdEMsRUFBRTs7Q0FFRixD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LEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQzs7Q0FFcEMsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsTUFBTSxFQUFFLFdBQVcsSUFBSSxHQUFHOztDQUUzQixFQUFFLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRTFELEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztDQUMxQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7O0NBRXpDLEVBQUUsS0FBSyxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUU1RixFQUFFLEtBQUssSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztDQUMxRSxFQUFFLEtBQUssSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztDQUNqRSxFQUFFLEtBQUssSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztDQUNqRSxFQUFFLEtBQUssSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Q0FFMUUsRUFBRSxLQUFLLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxH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QyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7Q0FFdEMsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRXRDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSjtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxZQUFZLEVBQUUsS0FBSyxFQUFFLFNBQVMsR0FBRzs7Q0FFMUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUM7O0NBRXRDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxjQUFjLENBQUM7O0NBRTVCLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7O0NBRTdCLENBQUM7O0NBRUQsWUFBWSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFOztDQUUxRSxDQUFDLFdBQVcsRUFBRSxZQUFZOztDQUUxQixDQUFDLGNBQWMsRUFBRSxJQUFJOztDQUVyQixDQUFDLEVBQUUsQ0FBQzs7Q0FFSjtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxhQUFhLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHOztDQUUxRCxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQzs7Q0FFdEMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQzs7Q0FFN0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsS0FBSyxLQUFLLFNBQVMsS0FBSyxLQUFLLEdBQUcsRUFBRSxDQUFDO0NBQ25ELENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLE1BQU0sS0FBSyxTQUFTLEtBQUssTUFBTSxHQUFHLEVBQUUsQ0FBQzs7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LEVBQUUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFO0NBQy9CLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDO0NBQ2IsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFaEI7O0NBRUEsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUM3QyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQy9FLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztDQUM1RCxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFOUI7O0NBRUEsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHOztDQUV4QyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUU7Q0FDZCxLQUFLLEVBQUUsR0FBRyxNQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRTtDQUMxQixLQUFLLEVBQUUsR0FBRyxNQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRTtDQUMxQixLQUFLLEVBQUUsR0FBRyxNQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRTtDQUMxQixLQUFLLEVBQUUsR0FBRyxNQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFD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LEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztDQUNuRixFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxTQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO0NBQ3hELEVBQUUsS0FBSyxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7Q0FDaEYsRUFBRSxLQUFLLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztDQUN2RSxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLEdBQUcsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0NBQzNELEVBQUUsS0FBSyxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7Q0FDcEUsRUFBRSxLQUFLLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztDQUNoRixFQUFFLEtBQUssSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO0NBQzFFLEVBQUUsS0FBSyxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7Q0FDMUUsRUFBRSxLQUFLLElBQUksQ0FBQyxVQUFVLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztDQUM3RSxFQUFFLEtBQUssSUFBSSxDQUFDLFVBQVUsS0FBSyxTQUFTLEdBQUcsUUFBUSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO0NBQzdFLEVBQUUsS0FB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QUMsT0FBTyxFQUFFLENBQUM7Q0FDL0MsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxXQUFXLElBQUksR0FBRzs7Q0FFdEMsR0FBRyxNQUFNLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFL0MsR0FBRyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsQ0FBQzs7Q0FFM0IsRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRSxXQUFXLElBQUksR0FBRzs7Q0FFMUIsRUFBRSxJQUFJLFFBQVEsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDOztDQUV0QyxFQUFFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDOztDQUU5QixFQUFFLEtBQUssS0FBSyxLQUFLLFNBQVMsR0FBRzs7Q0FFN0IsR0FBRyxJQUFJLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0NBQ2xFLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxJQUFJLGVBQWUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFN0QsR0FBRzs7Q0FFSCxFQUFFLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDOztDQUV4QyxFQUFFLE1BQU0sSUFBSSxHQUFHLElBQUksVUFBVSxHQUFHOztDQUVoQyxHQUFHLElBQUksU0FBUyxHQUFHLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUNyQyxHQUFHLElBQUksVUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRTFFLEdBQUcsUUFBUSxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsSUFBSSxlQUFlLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUs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QUMsV0FBVyxHQUFHOztDQUUzQixJQUFJLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxtQkFBbUIsR0FBRzs7Q0FFcEYsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ25DLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3pFLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3pFLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUV6RSxLQUFLLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRTVELEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHLFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQzs7Q0FFL0IsR0FBRyxLQUFLLFFBQVEsQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFF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QUFFLENBQUM7Q0FDNUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUMzQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRXRCLENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUNoRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUM5QixDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDN0MsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUV0QixDQUFDLElBQUksUUFBUSxHQUFHLElBQUksaUJBQWlCLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDaEUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDOUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUMzQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRXRCLENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUNoRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUM5QixDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDN0MsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUV0QixDQUFDLElBQUksT0FBTyxHQUFHLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsQ0FBQzs7Q0FFdkYsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUkscUJBQXFCLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsQ0FBQztDQUMxRixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxZQUFZLENBQUM7O0NBRS9DLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxXQUFXLFFBQVEsRUFBRSxLQUFLLEdBQUc7O0NBRTVDLEVBQUUsS0FBSyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzs7Q0FFdkQsRUFBRSxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO0NBQ3ZDLEVBQUUsSUFBSSxlQUFlLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUM7O0NBRTdELEVBQUUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDOztDQUUvQyxFQUFFLFlBQVksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO0NBQ2xDLEVBQUUsUUFBUSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxDQUFDOztDQUVuRCxFQUFFLFlBQVksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO0NBQ2xDLEVBQUUsUUFBUSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxDQUFDOztDQUVuRCxFQUFFLFlBQVksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO0NBQ2xDLEVBQUUsUUFBUSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxDQUFDOztDQUVuRCxFQUFFLFlBQVksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO0NBQ2xDLEVBQUUsUUFBUSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxDQUFDOztDQUVuRCxFQUFFLFlBQVksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO0NBQ2xDLEVBQUUsUUFBUSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxDQUFDOztDQUVuRCxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQzs7Q0FFekQsRUFBRSxZQUFZLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQztDQUNsQyxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsQ0FBQzs7Q0FFbkQsRUFBRSxRQUFRLENBQUMsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUVuQyxFQUFFLENBQUM7O0NBRUgsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLFdBQVcsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxHQUFHOztDQUUzRCxFQUFFLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7O0NBRXZDLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFakMsR0FBRyxZQUFZLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQztDQUNuQyxHQUFHLFFBQVEsQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLENBQUM7O0NBRTVDLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDOztDQUUzQyxHQUFHOztDQUVILEVBQUUsUUFBUSxDQUFDLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFbkMsRUFBRSxDQUFDOztDQUVILENBQUM7O0NBRUQsVUFBVSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUMzRCxVQUFVLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7O0NBRTlDO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLGFBQWEsR0FBRzs7Q0FFekIsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUV2QixDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDOztDQUU3QixDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDOztDQUUxQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztDQUN2QyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7O0NBRS9DLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7O0NBRXBCLENBQUM7O0NBRUQsYUFBYSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRSxFQUFFOztDQUU5RSxDQUFDLFdBQVcsRUFBRSxhQUFhOztDQUUzQixDQUFDLFFBQVEsRUFBRSxZQUFZOztDQUV2QixFQUFFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQzs7Q0FFbkIsRUFBRTs7Q0FFRixDQUFDLFlBQVksRUFBRSxhQUFhOztDQUU1QixFQUFFLEtBQUssSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLEdBQUc7O0NBRTlCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQ3ZDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztDQUN0RCxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDakQsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQzs7Q0FFdEIsR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsU0FBUyxFQUFFLFlBQVk7O0NBRXhCLEVBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDOztDQUVyQixFQUFFOztDQUVGLENBQUMsU0FBUyxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUUvQixFQUFFLEtBQUssSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLEdBQUc7O0NBRTlCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQ3ZDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7Q0FFdEQsR0FBRyxNQUFNOztDQUVULEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7Q0FFcEQsR0FBRzs7Q0FFSCxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0NBQ3RCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7Q0FFbEQsRUFBRTs7Q0FFRixDQUFDLGVBQWUsRUFBRSxZQUFZOztDQUU5QixFQUFFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDOztDQUU5QixFQUFFOztDQUVGLENBQUMsZUFBZSxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUVyQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRTFFLEVBQUU7O0NBRUYsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLFlBQVk7O0NBRWxDLEVBQUUsSUFBSSxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztDQUMvQixFQUFFLElBQUksVUFBVSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7Q0FDcEMsRUFBRSxJQUFJLEtBQUssR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUU1QixFQUFFLElBQUksV0FBVyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRWxDLEVBQUUsT0FBTyxTQUFTLGlCQUFpQixFQUFFLEtBQUssR0FBRzs7Q0FFN0MsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRTVELEdBQUcsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7Q0FDeEMsR0FBRyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDOztDQUVwQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRTdELEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsZUFBZSxFQUFFLFVBQVUsRUFBRSxDQUFDOztDQUU5RCxHQUFHLEtBQUssUUFBUSxDQUFDLFNBQVMsR0FBRzs7Q0FFN0IsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDOUUsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDOUUsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDOUUsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDaEYsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDaEYsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDaEYsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDbEUsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDbEUsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7O0NBRWxFLElBQUksTUFBTTs7Q0FFVixJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLFFB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QUFlLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7Q0FFMUQsRUFBRSxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQzs7Q0FFNUMsRUFBRSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7O0NBRW5EOztDQUVBLEVBQUUsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7O0NBRXpDLEVBQUUsS0FBSyxXQUFXLElBQUksV0FBVyxDQUFDLFVBQVUsR0FBRzs7Q0FFL0MsR0FBRyxJQUFJLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDOztDQUV2QyxHQUFHLElBQUksS0FBSyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUM7O0NBRWpDLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDOztDQUVmLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFcEQsSUFBSSxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTFCLElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXBFLEtBQUssSUFBSSxNQUFNLEdBQUcsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUVoRCxLQUFLLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTFDLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLENBQUM7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SyxDQUFDLGlCQUFpQixFQUFFLENBQUM7O0NBRWhDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO0NBQ2pDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQzs7Q0FFL0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQzs7Q0FFcEIsQ0FBQyxJQUFJLFFBQVEsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDOztDQUVyQyxDQUFDLElBQUksU0FBUyxHQUFHO0NBQ2pCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ25CLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ25CLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDcEIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDbkIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNyQixFQUFFLENBQUM7O0NBRUgsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFckQsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDbkMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRW5DLEVBQUUsU0FB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LEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDcEQsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDbEQsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNwRCxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDeEQsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFdkQsQ0FBQyxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7Q0FFN0IsQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxHQUFHOztDQUVqQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDOztDQUU3QyxFQUFFLE1BQU07O0NBRVIsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRXBELEVBQUU7O0NBRUYsQ0FBQyxDQUFDOztDQUVGO0NBQ0E7Q0FDQTtDQUNBO0NB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RSxDQUFDO0NBQ2hFLENBQUMsTUFBTSxHQUFHLElBQUksS0FBSyxFQUFFLE1BQU0sS0FBSyxTQUFTLEdBQUcsTUFBTSxHQUFHLFFBQVEsRUFBRSxDQUFDOztDQUVoRSxDQUFDLElBQUksTUFBTSxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUM7Q0FDNUIsQ0FBQyxJQUFJLElBQUksR0FBRyxJQUFJLEdBQUcsU0FBUyxDQUFDO0NBQzdCLENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQzs7Q0FFekIsQ0FBQyxJQUFJLFFBQVEsR0FBRyxFQUFFLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQzs7Q0FFaEMsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLElBQUksU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxJQUFJLEdBQUc7O0NBRTNFLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDcEQsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFcEQsRUFBRSxJQUFJLEtBQUssR0FBRyxDQUFDLEtBQUssTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUM7O0NBRTdDLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ3JDLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ3JDLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ3JDLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDOztDQUVyQyxFQUFFOztDQUVGLENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztDQUNyQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLElBQUksc0JBQXNCLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDaEYsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxJQUFJLHNCQUFzQixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUUzRSxDQUFDLElBQUksUUFBUSxHQUFHLElBQUksaUJBQWlCLEVBQUUsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEVBQUUsQ0FBQzs7Q0FFeEUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRS9DLENBQUM7O0NBRUQsVUFBVSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUMvRCxVQUFVLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7O0NBRTlDO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxlQUFlLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEdBQUc7O0NBRWhGLENBQUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7Q0FDdkIsQ0FBQyxPQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztDQUN6QixDQUFDLE9BQU8sR0FBRyxPQUFPLElBQUksQ0FBQyxDQUFDO0NBQ3hCLENBQUMsU0FBUyxHQUFHLFNBQVMsSUFBSSxFQUFFLENBQUM7Q0FDN0IsQ0FBQyxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQUUsTUFBTSxLQUFLLFNBQVMsR0FBRyxNQUFNLEdBQUcsUUFBUSxFQUFFLENBQUM7Q0FDaEUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQUUsTUFBTSxLQUFLLFNBQVMsR0FBRyxNQUFNLEdBQUcsUUFBUSxFQUFFLENBQUM7O0NBRWhFLENBQUMsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO0NBQ25CLENBQUMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDOztDQUVqQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztDQUNWLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDOztDQUV2Qjs7Q0FFQSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVuQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxPQUFPLE9BQU8sSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7Q0FFeEMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUM7Q0FDN0IsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUM7O0NBRTdCLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzNCLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUzQixFQUFFLEtBQUssR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssTUFBTSxHQUFHLE1BQU0sQ0FBQzs7Q0FFdEMsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDM0MsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRTNDLEVBQUU7O0NBRUY7O0NBRUEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFbkMsRUFBRSxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLE1BQU0sR0FBRyxNQUFNLENBQUM7O0NBRXRDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sS0FBSyxNQUFNLEdBQUcsT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDOztDQUV4QyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVyQzs7Q0FFQSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxTQUFTLE9BQU8sSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7Q0FFM0MsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDekIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRXpCLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzVCLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUU1Qzs7Q0FFQSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLE9BQU8sSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVB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LEVBQUUsQ0FBQztDQUNyQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO0NBQ3JDLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7O0NBRXJDOztDQUVBLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7Q0FDckMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztDQUNyQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO0NBQ3JDLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7O0NBRXJDOztDQUVBLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7Q0FDckMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztDQUNyQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO0NBQ3JDLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7O0NBRXJDOztDQUVBLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7Q0FDakMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztDQUNqQyxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDO0NBQ2pDLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7O0NBRWpDOztDQUVBLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7Q0FDaEMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztDQUNoQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDOztDQUVoQzs7Q0FFQSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxDQUFDO0NBQ2xDLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLENBQUM7O0NBRWpDOztDQUVBLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLENBQUM7Q0FDckMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsQ0FBQzs7Q0FFckMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsQ0FBQztDQUNyQyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxDQUFDOztDQUVyQyxDQUFDLFNBQVMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxHQUFHOztDQUVqQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUM7Q0FDdkIsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUV2QixFQUFFOztDQUVGLENBQUMsU0FBUyxRQUFRLEVBQUUsRUFBRSxFQUFFLEtBQUssR0FBRzs7Q0FFaEMsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDM0IsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRTNDLEVBQUUsS0FBSyxRQUFRLEVBQUUsRUFBRSxFQUFFLEtBQUssU0FBUyxHQUFHOztDQUV0QyxHQUFHLFFBQVEsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXZCLEdBQUc7O0NBRUgsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7O0NBRXJELEVBQUU7O0NBRUYsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxJQUFJLHNCQUFzQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQ2hGLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsSUFBSSxzQkFBc0IsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFM0UsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRS9DLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7Q0FDdEIsQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDOztDQUVoRixDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztDQUNsQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7O0NBRS9CLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7O0NBRTFCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUVmLENBQUM7O0NBRUQsWUFBWSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUNqRSxZQUFZLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUM7O0NBRWxELFlBQVksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFlBQVk7O0NBRTVDLENBQUMsSUFBSSxRQUFRLEVBQUUsUUFBUSxDQUFDOztDQUV4QixDQUFDLElBQUksTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Q0FDNUIsQ0FBQyxJQUFJLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDOztDQUUzQixDQUFDLFNBQVMsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFckMsRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUU1QyxFQUFFLElBQUksTUFBTSxHQUFHLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFakMsRUFBRSxLQUFLLE1BQU0sS0FBSyxTQUFTLEdBQUc7O0NBRTlCLEdBQUcsSUFBSSxRQUFRLEdBQUcsUUFBUSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsQ0FBQzs7Q0FFdEQsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVyRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRWpFLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsT0FBTyxTQUFTLE1BQU0sR0FBRzs7Q0FFMUIsRUFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztDQUMzQixFQUFFLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUUzQixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUVuQjtDQUNBOztDQUVBLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7O0NBRS9EOztDQUVBLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDN0IsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTNCOztDQUVBLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2xDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNoQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDaEMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFOUI7O0NBRUEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2hDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDOUIsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUM5QixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFNUI7O0NBRUEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzVDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVsQzs7Q0FFQSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQy9CLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzdCLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDL0IsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTdCLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNqQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQy9CLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNqQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUvQixFQUFFLFFBQVEsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7Q0FFekQsRUFBRSxDQUFDOztDQUVILENBQUMsRUFBRSxDQUFDOztDQUVKO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLFNBQVMsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEdBQUc7O0NBRXBDLENBQUMsSUFBSSxDQUFDLE1B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LEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQzdELEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQzdELEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQy9ELEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQ2hFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQ2hFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFF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 diff --git a/lib/whs.js.map b/lib/whs.js.map new file mode 100644 index 0000000..844a14c --- /dev/null +++ b/lib/whs.js.map @@ -0,0 +1 @@ +{"version":3,"file":"whs.js","sources":["../node_modules/@babel/runtime/node_modules/regenerator-runtime/runtime.js","../node_modules/@babel/runtime/node_modules/regenerator-runtime/runtime-module.js","../node_modules/@babel/runtime/regenerator/index.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_to-integer.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_defined.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_string-at.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_library.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_global.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_core.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_a-function.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_ctx.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_is-object.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_an-object.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_fails.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_descriptors.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_dom-create.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_ie8-dom-define.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_to-primitive.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_object-dp.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_property-desc.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_hide.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_has.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_export.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_redefine.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_iterators.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_cof.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_iobject.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_to-iobject.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_to-length.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_to-absolute-index.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_array-includes.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_shared.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_uid.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_shared-key.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_object-keys-internal.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_enum-bug-keys.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_object-keys.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_object-dps.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_html.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_object-create.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_wks.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_set-to-string-tag.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_iter-create.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_to-object.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_object-gpo.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_iter-define.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es6.string.iterator.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_iter-step.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es6.array.iterator.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/web.dom.iterable.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_classof.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_an-instance.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_iter-call.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_is-array-iter.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/core.get-iterator-method.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_for-of.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_species-constructor.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_invoke.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_task.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_microtask.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_new-promise-capability.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_perform.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_user-agent.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_promise-resolve.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_redefine-all.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_set-species.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_iter-detect.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es6.promise.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es7.promise.finally.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es7.promise.try.js","../node_modules/@babel/runtime/node_modules/core-js/library/fn/promise.js","../node_modules/@babel/runtime/core-js/promise.js","../node_modules/@babel/runtime/helpers/asyncToGenerator.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_object-pie.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_object-gopd.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_object-sap.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es6.object.get-own-property-descriptor.js","../node_modules/@babel/runtime/node_modules/core-js/library/fn/object/get-own-property-descriptor.js","../node_modules/@babel/runtime/core-js/object/get-own-property-descriptor.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_meta.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_wks-ext.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_wks-define.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_object-gops.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_enum-keys.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_is-array.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_object-gopn.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_object-gopn-ext.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es6.symbol.js","../node_modules/@babel/runtime/node_modules/core-js/library/fn/object/get-own-property-symbols.js","../node_modules/@babel/runtime/core-js/object/get-own-property-symbols.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es6.object.keys.js","../node_modules/@babel/runtime/node_modules/core-js/library/fn/object/keys.js","../node_modules/@babel/runtime/core-js/object/keys.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es6.object.define-property.js","../node_modules/@babel/runtime/node_modules/core-js/library/fn/object/define-property.js","../node_modules/@babel/runtime/core-js/object/define-property.js","../node_modules/@babel/runtime/helpers/defineProperty.js","../node_modules/@babel/runtime/helpers/objectSpread.js","../node_modules/@babel/runtime/helpers/classCallCheck.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_set-proto.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es6.object.set-prototype-of.js","../node_modules/@babel/runtime/node_modules/core-js/library/fn/object/set-prototype-of.js","../node_modules/@babel/runtime/core-js/object/set-prototype-of.js","../node_modules/@babel/runtime/helpers/setPrototypeOf.js","../node_modules/@babel/runtime/helpers/inherits.js","../node_modules/@babel/runtime/helpers/createClass.js","../node_modules/@babel/runtime/node_modules/core-js/library/fn/symbol/iterator.js","../node_modules/@babel/runtime/core-js/symbol/iterator.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es7.symbol.async-iterator.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es7.symbol.observable.js","../node_modules/@babel/runtime/node_modules/core-js/library/fn/symbol/index.js","../node_modules/@babel/runtime/core-js/symbol.js","../node_modules/@babel/runtime/helpers/typeof.js","../node_modules/@babel/runtime/helpers/assertThisInitialized.js","../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es6.object.get-prototype-of.js","../node_modules/@babel/runtime/node_modules/core-js/library/fn/object/get-prototype-of.js","../node_modules/@babel/runtime/core-js/object/get-prototype-of.js","../node_modules/@babel/runtime/helpers/getPrototypeOf.js","../src/utils/extend.js","../src/utils/transformData.js","../node_modules/three/build/three.module.js","../node_modules/minivents/dist/minivents.commonjs.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es6.object.create.js","../node_modules/@babel/runtime/node_modules/core-js/library/fn/object/create.js","../node_modules/@babel/runtime/core-js/object/create.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_validate-collection.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_collection-strong.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_array-species-constructor.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_array-species-create.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_array-methods.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_collection.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es6.map.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_array-from-iterable.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_collection-to-json.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es7.map.to-json.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_set-collection-of.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es7.map.of.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_set-collection-from.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es7.map.from.js","../node_modules/@babel/runtime/node_modules/core-js/library/fn/map.js","../node_modules/@babel/runtime/core-js/map.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/_bind.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es6.reflect.construct.js","../node_modules/@babel/runtime/node_modules/core-js/library/fn/reflect/construct.js","../node_modules/@babel/runtime/core-js/reflect/construct.js","../node_modules/@babel/runtime/helpers/construct.js","../node_modules/@babel/runtime/helpers/wrapNativeSuper.js","../src/core/errors.js","../src/core/ModuleSystem.js","../node_modules/@babel/runtime/helpers/arrayWithHoles.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/core.get-iterator.js","../node_modules/@babel/runtime/node_modules/core-js/library/fn/get-iterator.js","../node_modules/@babel/runtime/core-js/get-iterator.js","../node_modules/@babel/runtime/helpers/iterableToArrayLimit.js","../node_modules/@babel/runtime/helpers/nonIterableRest.js","../node_modules/@babel/runtime/helpers/slicedToArray.js","../node_modules/symbol-observable/es/ponyfill.js","../node_modules/symbol-observable/es/index.js","../node_modules/redux/es/redux.js","../src/core/ModuleManager.js","../src/core/Component.js","../node_modules/@babel/runtime/node_modules/core-js/library/modules/es6.reflect.get.js","../node_modules/@babel/runtime/node_modules/core-js/library/fn/reflect/get.js","../node_modules/@babel/runtime/core-js/reflect/get.js","../node_modules/@babel/runtime/helpers/superPropBase.js","../node_modules/@babel/runtime/helpers/get.js","../src/core/prototype/attributes.js","../src/core/MeshComponent.js","../src/core/LightComponent.js","../src/core/CameraComponent.js","../src/polyfill.js","../src/core/App.js","../src/core/Loop.js","../src/core/index.js","../src/components/lights/AmbientLight.js","../src/components/lights/DirectionalLight.js","../src/components/lights/HemisphereLight.js","../src/components/lights/PointLight.js","../src/components/lights/SpotLight.js","../src/components/lights/AreaLight.js","../src/components/lights/index.js","../src/components/cameras/CubeCamera.js","../src/components/cameras/OrthographicCamera.js","../src/components/cameras/PerspectiveCamera.js","../src/components/cameras/index.js","../src/components/meshes/Box.js","../src/components/meshes/Circle.js","../src/components/meshes/Cone.js","../src/components/meshes/Cylinder.js","../src/components/meshes/Dodecahedron.js","../src/components/meshes/Extrude.js","../src/components/meshes/Icosahedron.js","../src/components/meshes/Lathe.js","../src/components/meshes/Line.js","../src/components/meshes/Importer.js","../src/components/meshes/Octahedron.js","../src/components/meshes/Parametric.js","../src/components/meshes/Plane.js","../src/components/meshes/Polyhedron.js","../src/components/meshes/Ring.js","../src/components/meshes/Shape.js","../src/components/meshes/Sphere.js","../src/components/meshes/Tetrahedron.js","../src/components/meshes/Text.js","../src/components/meshes/Torus.js","../src/components/meshes/Torusknot.js","../src/components/meshes/Tube.js","../src/components/meshes/Group.js","../src/components/meshes/index.js","../src/modules/app/ElementModule.js","../src/modules/app/RenderingModule.js","../src/modules/app/SceneModule.js","../src/modules/app/ResizeModule.js","../node_modules/postprocessing/src/materials/AdaptiveLuminosityMaterial.js","../node_modules/postprocessing/src/materials/BokehMaterial.js","../node_modules/postprocessing/src/materials/ColorEdgesMaterial.js","../node_modules/postprocessing/src/materials/CombineMaterial.js","../node_modules/postprocessing/src/materials/ConvolutionMaterial.js","../node_modules/postprocessing/src/materials/CopyMaterial.js","../node_modules/postprocessing/src/materials/DepthComparisonMaterial.js","../node_modules/postprocessing/src/materials/DotScreenMaterial.js","../node_modules/postprocessing/src/materials/FilmMaterial.js","../node_modules/postprocessing/src/materials/GlitchMaterial.js","../node_modules/postprocessing/src/materials/GodRaysMaterial.js","../node_modules/postprocessing/src/materials/LuminosityMaterial.js","../node_modules/postprocessing/src/materials/OutlineBlendMaterial.js","../node_modules/postprocessing/src/materials/OutlineEdgesMaterial.js","../node_modules/postprocessing/src/materials/PixelationMaterial.js","../node_modules/postprocessing/src/materials/RealisticBokehMaterial.js","../node_modules/postprocessing/src/materials/ShockWaveMaterial.js","../node_modules/postprocessing/src/materials/SMAABlendMaterial.js","../node_modules/postprocessing/src/materials/SMAAWeightsMaterial.js","../node_modules/postprocessing/src/materials/ToneMappingMaterial.js","../node_modules/postprocessing/src/materials/index.js","../node_modules/postprocessing/src/passes/Pass.js","../node_modules/postprocessing/src/passes/BlurPass.js","../node_modules/postprocessing/src/passes/BloomPass.js","../node_modules/postprocessing/src/passes/BokehPass.js","../node_modules/postprocessing/src/passes/ClearMaskPass.js","../node_modules/postprocessing/src/passes/ClearPass.js","../node_modules/postprocessing/src/passes/DotScreenPass.js","../node_modules/postprocessing/src/passes/FilmPass.js","../node_modules/postprocessing/src/passes/GlitchPass.js","../node_modules/postprocessing/src/passes/RenderPass.js","../node_modules/postprocessing/src/passes/GodRaysPass.js","../node_modules/postprocessing/src/passes/MaskPass.js","../node_modules/postprocessing/src/passes/ShaderPass.js","../node_modules/postprocessing/src/passes/OutlinePass.js","../node_modules/postprocessing/src/passes/PixelationPass.js","../node_modules/postprocessing/src/passes/RealisticBokehPass.js","../node_modules/postprocessing/src/passes/SavePass.js","../node_modules/postprocessing/src/passes/ShockWavePass.js","../node_modules/postprocessing/src/materials/images/smaa/searchImageDataURL.js","../node_modules/postprocessing/src/materials/images/smaa/areaImageDataURL.js","../node_modules/postprocessing/src/passes/SMAAPass.js","../node_modules/postprocessing/src/passes/TexturePass.js","../node_modules/postprocessing/src/passes/ToneMappingPass.js","../node_modules/postprocessing/src/passes/index.js","../node_modules/postprocessing/src/core/EffectComposer.js","../src/modules/app/PostProcessorModule.js","../src/modules/app/EventsPatchModule.js","../src/modules/app/VirtualMouseModule.js","../src/modules/app/ControlsModule.js","../src/modules/app/FogModule.js","../src/modules/app/StateModule.js","../src/modules/app/controls/lib/ThreeOrbitControls.js","../src/modules/app/controls/OrbitControlsModule.js","../src/modules/app/controls/index.js","../src/modules/app/index.js","../src/modules/mesh/DynamicGeometryModule.js","../src/modules/mesh/TextureModule.js","../src/modules/mesh/AnimationModule.js","../src/modules/mesh/index.js","../src/modules/DefineModule.js","../src/modules/index.js","../src/deprecation.js","../src/index.js"],"sourcesContent":["/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n!(function(global) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n var inModule = typeof module === \"object\";\n var runtime = global.regeneratorRuntime;\n if (runtime) {\n if (inModule) {\n // If regeneratorRuntime is defined globally and we're in a module,\n // make the exports object identical to regeneratorRuntime.\n module.exports = runtime;\n }\n // Don't bother evaluating the rest of this file if the runtime was\n // already defined globally.\n return;\n }\n\n // Define the runtime globally (as expected by generated code) as either\n // module.exports (if we're in a module) or a new, empty object.\n runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n runtime.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n runtime.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n runtime.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = \"GeneratorFunction\";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n runtime.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration. If the Promise is rejected, however, the\n // result for this iteration will be rejected with the same\n // reason. Note that rejections of yielded Promises are not\n // thrown back into the generator function, as is the case\n // when an awaited Promise is rejected. This difference in\n // behavior between yield and await is important, because it\n // allows the consumer to decide what to do with the yielded\n // rejection (swallow it and continue, manually .throw it back\n // into the generator, abandon iteration, whatever). With\n // await, by contrast, there is no opportunity to examine the\n // rejection reason outside the generator function, so the\n // only option is to throw it from the await expression, and\n // let the generator function handle the exception.\n result.value = unwrapped;\n resolve(result);\n }, reject);\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n runtime.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return runtime.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n if (delegate.iterator.return) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n runtime.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n runtime.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n})(\n // In sloppy mode, unbound `this` refers to the global object, fallback to\n // Function constructor if we're in global strict mode. That is sadly a form\n // of indirect eval which violates Content Security Policy.\n (function() { return this })() || Function(\"return this\")()\n);\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n// This method of obtaining a reference to the global object needs to be\n// kept identical to the way it is obtained in runtime.js\nvar g = (function() { return this })() || Function(\"return this\")();\n\n// Use `getOwnPropertyNames` because not all browsers support calling\n// `hasOwnProperty` on the global `self` object in a worker. See #183.\nvar hadRuntime = g.regeneratorRuntime &&\n Object.getOwnPropertyNames(g).indexOf(\"regeneratorRuntime\") >= 0;\n\n// Save the old regeneratorRuntime in case it needs to be restored later.\nvar oldRuntime = hadRuntime && g.regeneratorRuntime;\n\n// Force reevalutation of runtime.js.\ng.regeneratorRuntime = undefined;\n\nmodule.exports = require(\"./runtime\");\n\nif (hadRuntime) {\n // Restore the original runtime.\n g.regeneratorRuntime = oldRuntime;\n} else {\n // Remove the global property added by runtime.js.\n try {\n delete g.regeneratorRuntime;\n } catch(e) {\n g.regeneratorRuntime = undefined;\n }\n}\n","module.exports = require(\"regenerator-runtime\");\n","// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","var toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n return function (that, pos) {\n var s = String(defined(that));\n var i = toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n","module.exports = true;\n","// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n","var core = module.exports = { version: '2.5.6' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","var global = require('./_global');\nvar core = require('./_core');\nvar ctx = require('./_ctx');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var IS_WRAP = type & $export.W;\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE];\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE];\n var key, own, out;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n if (own && has(exports, key)) continue;\n // export native or passed\n out = own ? target[key] : source[key];\n // prevent global pollution for namespaces\n exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]\n // bind timers to global for call from export context\n : IS_BIND && own ? ctx(out, global)\n // wrap global constructors for prevent change them in library\n : IS_WRAP && target[key] == out ? (function (C) {\n var F = function (a, b, c) {\n if (this instanceof C) {\n switch (arguments.length) {\n case 0: return new C();\n case 1: return new C(a);\n case 2: return new C(a, b);\n } return new C(a, b, c);\n } return C.apply(this, arguments);\n };\n F[PROTOTYPE] = C[PROTOTYPE];\n return F;\n // make static versions for prototype methods\n })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%\n if (IS_PROTO) {\n (exports.virtual || (exports.virtual = {}))[key] = out;\n // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%\n if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out);\n }\n }\n};\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n","module.exports = require('./_hide');\n","module.exports = {};\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n","var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n","// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n","var core = require('./_core');\nvar global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: core.version,\n mode: require('./_library') ? 'pure' : 'global',\n copyright: '© 2018 Denis Pushkarev (zloirock.ru)'\n});\n","var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n","var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n","var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n","// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n","var dP = require('./_object-dp');\nvar anObject = require('./_an-object');\nvar getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n","var document = require('./_global').document;\nmodule.exports = document && document.documentElement;\n","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object');\nvar dPs = require('./_object-dps');\nvar enumBugKeys = require('./_enum-bug-keys');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = require('./_dom-create')('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n require('./_html').appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n","var store = require('./_shared')('wks');\nvar uid = require('./_uid');\nvar Symbol = require('./_global').Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n","var def = require('./_object-dp').f;\nvar has = require('./_has');\nvar TAG = require('./_wks')('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n","'use strict';\nvar create = require('./_object-create');\nvar descriptor = require('./_property-desc');\nvar setToStringTag = require('./_set-to-string-tag');\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n setToStringTag(Constructor, NAME + ' Iterator');\n};\n","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n","// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = require('./_has');\nvar toObject = require('./_to-object');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar $iterCreate = require('./_iter-create');\nvar setToStringTag = require('./_set-to-string-tag');\nvar getPrototypeOf = require('./_object-gpo');\nvar ITERATOR = require('./_wks')('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n $iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = $native || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n","'use strict';\nvar $at = require('./_string-at')(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\nrequire('./_iter-define')(String, 'String', function (iterated) {\n this._t = String(iterated); // target\n this._i = 0; // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var index = this._i;\n var point;\n if (index >= O.length) return { value: undefined, done: true };\n point = $at(O, index);\n this._i += point.length;\n return { value: point, done: false };\n});\n","module.exports = function (done, value) {\n return { value: value, done: !!done };\n};\n","'use strict';\nvar addToUnscopables = require('./_add-to-unscopables');\nvar step = require('./_iter-step');\nvar Iterators = require('./_iterators');\nvar toIObject = require('./_to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./_iter-define')(Array, 'Array', function (iterated, kind) {\n this._t = toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return step(1);\n }\n if (kind == 'keys') return step(0, index);\n if (kind == 'values') return step(0, O[index]);\n return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","require('./es6.array.iterator');\nvar global = require('./_global');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar TO_STRING_TAG = require('./_wks')('toStringTag');\n\nvar DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' +\n 'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' +\n 'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' +\n 'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' +\n 'TextTrackList,TouchList').split(',');\n\nfor (var i = 0; i < DOMIterables.length; i++) {\n var NAME = DOMIterables[i];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n if (proto && !proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = Iterators.Array;\n}\n","// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./_cof');\nvar TAG = require('./_wks')('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n","module.exports = function (it, Constructor, name, forbiddenField) {\n if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n throw TypeError(name + ': incorrect invocation!');\n } return it;\n};\n","// call something on iterator step with safe closing on error\nvar anObject = require('./_an-object');\nmodule.exports = function (iterator, fn, value, entries) {\n try {\n return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (e) {\n var ret = iterator['return'];\n if (ret !== undefined) anObject(ret.call(iterator));\n throw e;\n }\n};\n","// check on default Array iterator\nvar Iterators = require('./_iterators');\nvar ITERATOR = require('./_wks')('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n","var classof = require('./_classof');\nvar ITERATOR = require('./_wks')('iterator');\nvar Iterators = require('./_iterators');\nmodule.exports = require('./_core').getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","var ctx = require('./_ctx');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar anObject = require('./_an-object');\nvar toLength = require('./_to-length');\nvar getIterFn = require('./core.get-iterator-method');\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n var f = ctx(fn, that, entries ? 2 : 1);\n var index = 0;\n var length, step, iterator, result;\n if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n // fast case for arrays with default iterator\n if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n if (result === BREAK || result === RETURN) return result;\n } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n result = call(iterator, f, step.value, entries);\n if (result === BREAK || result === RETURN) return result;\n }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n","// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = require('./_an-object');\nvar aFunction = require('./_a-function');\nvar SPECIES = require('./_wks')('species');\nmodule.exports = function (O, D) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n","// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n var un = that === undefined;\n switch (args.length) {\n case 0: return un ? fn()\n : fn.call(that);\n case 1: return un ? fn(args[0])\n : fn.call(that, args[0]);\n case 2: return un ? fn(args[0], args[1])\n : fn.call(that, args[0], args[1]);\n case 3: return un ? fn(args[0], args[1], args[2])\n : fn.call(that, args[0], args[1], args[2]);\n case 4: return un ? fn(args[0], args[1], args[2], args[3])\n : fn.call(that, args[0], args[1], args[2], args[3]);\n } return fn.apply(that, args);\n};\n","var ctx = require('./_ctx');\nvar invoke = require('./_invoke');\nvar html = require('./_html');\nvar cel = require('./_dom-create');\nvar global = require('./_global');\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n var id = +this;\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\nvar listener = function (event) {\n run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n setTask = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n invoke(typeof fn == 'function' ? fn : Function(fn), args);\n };\n defer(counter);\n return counter;\n };\n clearTask = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (require('./_cof')(process) == 'process') {\n defer = function (id) {\n process.nextTick(ctx(run, id, 1));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(ctx(run, id, 1));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = ctx(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n defer = function (id) {\n global.postMessage(id + '', '*');\n };\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in cel('script')) {\n defer = function (id) {\n html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run.call(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(ctx(run, id, 1), 0);\n };\n }\n}\nmodule.exports = {\n set: setTask,\n clear: clearTask\n};\n","var global = require('./_global');\nvar macrotask = require('./_task').set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = require('./_cof')(process) == 'process';\n\nmodule.exports = function () {\n var head, last, notify;\n\n var flush = function () {\n var parent, fn;\n if (isNode && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (e) {\n if (head) notify();\n else last = undefined;\n throw e;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (isNode) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n var toggle = true;\n var node = document.createTextNode('');\n new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n var promise = Promise.resolve(undefined);\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(global, flush);\n };\n }\n\n return function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n };\n};\n","'use strict';\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = require('./_a-function');\n\nfunction PromiseCapability(C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","module.exports = function (exec) {\n try {\n return { e: false, v: exec() };\n } catch (e) {\n return { e: true, v: e };\n }\n};\n","var global = require('./_global');\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n","var anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar newPromiseCapability = require('./_new-promise-capability');\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n","var hide = require('./_hide');\nmodule.exports = function (target, src, safe) {\n for (var key in src) {\n if (safe && target[key]) target[key] = src[key];\n else hide(target, key, src[key]);\n } return target;\n};\n","'use strict';\nvar global = require('./_global');\nvar core = require('./_core');\nvar dP = require('./_object-dp');\nvar DESCRIPTORS = require('./_descriptors');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (KEY) {\n var C = typeof core[KEY] == 'function' ? core[KEY] : global[KEY];\n if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n};\n","var ITERATOR = require('./_wks')('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var riter = [7][ITERATOR]();\n riter['return'] = function () { SAFE_CLOSING = true; };\n // eslint-disable-next-line no-throw-literal\n Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n if (!skipClosing && !SAFE_CLOSING) return false;\n var safe = false;\n try {\n var arr = [7];\n var iter = arr[ITERATOR]();\n iter.next = function () { return { done: safe = true }; };\n arr[ITERATOR] = function () { return iter; };\n exec(arr);\n } catch (e) { /* empty */ }\n return safe;\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar global = require('./_global');\nvar ctx = require('./_ctx');\nvar classof = require('./_classof');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar aFunction = require('./_a-function');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar speciesConstructor = require('./_species-constructor');\nvar task = require('./_task').set;\nvar microtask = require('./_microtask')();\nvar newPromiseCapabilityModule = require('./_new-promise-capability');\nvar perform = require('./_perform');\nvar userAgent = require('./_user-agent');\nvar promiseResolve = require('./_promise-resolve');\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8 || '';\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n try {\n // correct subclassing with @@species support\n var promise = $Promise.resolve(1);\n var FakePromise = (promise.constructor = {})[require('./_wks')('species')] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return (isNode || typeof PromiseRejectionEvent == 'function')\n && promise.then(empty) instanceof FakePromise\n // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // we can't detect it synchronously, so just check versions\n && v8.indexOf('6.6') !== 0\n && userAgent.indexOf('Chrome/66') === -1;\n } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n if (promise._n) return;\n promise._n = true;\n var chain = promise._c;\n microtask(function () {\n var value = promise._v;\n var ok = promise._s == 1;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then, exited;\n try {\n if (handler) {\n if (!ok) {\n if (promise._h == 2) onHandleUnhandled(promise);\n promise._h = 1;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // may throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (e) {\n if (domain && !exited) domain.exit();\n reject(e);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n promise._c = [];\n promise._n = false;\n if (isReject && !promise._h) onUnhandled(promise);\n });\n};\nvar onUnhandled = function (promise) {\n task.call(global, function () {\n var value = promise._v;\n var unhandled = isUnhandled(promise);\n var result, handler, console;\n if (unhandled) {\n result = perform(function () {\n if (isNode) {\n process.emit('unhandledRejection', value, promise);\n } else if (handler = global.onunhandledrejection) {\n handler({ promise: promise, reason: value });\n } else if ((console = global.console) && console.error) {\n console.error('Unhandled promise rejection', value);\n }\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n } promise._a = undefined;\n if (unhandled && result.e) throw result.v;\n });\n};\nvar isUnhandled = function (promise) {\n return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n task.call(global, function () {\n var handler;\n if (isNode) {\n process.emit('rejectionHandled', promise);\n } else if (handler = global.onrejectionhandled) {\n handler({ promise: promise, reason: promise._v });\n }\n });\n};\nvar $reject = function (value) {\n var promise = this;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n promise._v = value;\n promise._s = 2;\n if (!promise._a) promise._a = promise._c.slice();\n notify(promise, true);\n};\nvar $resolve = function (value) {\n var promise = this;\n var then;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n if (then = isThenable(value)) {\n microtask(function () {\n var wrapper = { _w: promise, _d: false }; // wrap\n try {\n then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n } catch (e) {\n $reject.call(wrapper, e);\n }\n });\n } else {\n promise._v = value;\n promise._s = 1;\n notify(promise, false);\n }\n } catch (e) {\n $reject.call({ _w: promise, _d: false }, e); // wrap\n }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n // 25.4.3.1 Promise(executor)\n $Promise = function Promise(executor) {\n anInstance(this, $Promise, PROMISE, '_h');\n aFunction(executor);\n Internal.call(this);\n try {\n executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n } catch (err) {\n $reject.call(this, err);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n this._c = []; // <- awaiting reactions\n this._a = undefined; // <- checked in isUnhandled reactions\n this._s = 0; // <- state\n this._d = false; // <- done\n this._v = undefined; // <- value\n this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n this._n = false; // <- notify\n };\n Internal.prototype = require('./_redefine-all')($Promise.prototype, {\n // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n then: function then(onFulfilled, onRejected) {\n var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = isNode ? process.domain : undefined;\n this._c.push(reaction);\n if (this._a) this._a.push(reaction);\n if (this._s) notify(this, false);\n return reaction.promise;\n },\n // 25.4.5.1 Promise.prototype.catch(onRejected)\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n this.promise = promise;\n this.resolve = ctx($resolve, promise, 1);\n this.reject = ctx($reject, promise, 1);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === $Promise || C === Wrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\nrequire('./_set-to-string-tag')($Promise, PROMISE);\nrequire('./_set-species')(PROMISE);\nWrapper = require('./_core')[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n // 25.4.4.5 Promise.reject(r)\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n var $$reject = capability.reject;\n $$reject(r);\n return capability.promise;\n }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n // 25.4.4.6 Promise.resolve(x)\n resolve: function resolve(x) {\n return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n }\n});\n$export($export.S + $export.F * !(USE_NATIVE && require('./_iter-detect')(function (iter) {\n $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n // 25.4.4.1 Promise.all(iterable)\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var values = [];\n var index = 0;\n var remaining = 1;\n forOf(iterable, false, function (promise) {\n var $index = index++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n C.resolve(promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[$index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.e) reject(result.v);\n return capability.promise;\n },\n // 25.4.4.4 Promise.race(iterable)\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n forOf(iterable, false, function (promise) {\n C.resolve(promise).then(capability.resolve, reject);\n });\n });\n if (result.e) reject(result.v);\n return capability.promise;\n }\n});\n","// https://github.com/tc39/proposal-promise-finally\n'use strict';\nvar $export = require('./_export');\nvar core = require('./_core');\nvar global = require('./_global');\nvar speciesConstructor = require('./_species-constructor');\nvar promiseResolve = require('./_promise-resolve');\n\n$export($export.P + $export.R, 'Promise', { 'finally': function (onFinally) {\n var C = speciesConstructor(this, core.Promise || global.Promise);\n var isFunction = typeof onFinally == 'function';\n return this.then(\n isFunction ? function (x) {\n return promiseResolve(C, onFinally()).then(function () { return x; });\n } : onFinally,\n isFunction ? function (e) {\n return promiseResolve(C, onFinally()).then(function () { throw e; });\n } : onFinally\n );\n} });\n","'use strict';\n// https://github.com/tc39/proposal-promise-try\nvar $export = require('./_export');\nvar newPromiseCapability = require('./_new-promise-capability');\nvar perform = require('./_perform');\n\n$export($export.S, 'Promise', { 'try': function (callbackfn) {\n var promiseCapability = newPromiseCapability.f(this);\n var result = perform(callbackfn);\n (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v);\n return promiseCapability.promise;\n} });\n","require('../modules/es6.object.to-string');\nrequire('../modules/es6.string.iterator');\nrequire('../modules/web.dom.iterable');\nrequire('../modules/es6.promise');\nrequire('../modules/es7.promise.finally');\nrequire('../modules/es7.promise.try');\nmodule.exports = require('../modules/_core').Promise;\n","module.exports = require(\"core-js/library/fn/promise\");","var _Promise = require(\"../core-js/promise\");\n\nfunction _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new _Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n\n function step(key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n _Promise.resolve(value).then(_next, _throw);\n }\n }\n\n function _next(value) {\n step(\"next\", value);\n }\n\n function _throw(err) {\n step(\"throw\", err);\n }\n\n _next();\n });\n };\n}\n\nmodule.exports = _asyncToGenerator;","exports.f = {}.propertyIsEnumerable;\n","var pIE = require('./_object-pie');\nvar createDesc = require('./_property-desc');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar has = require('./_has');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = toIObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n","// most Object methods by ES6 should accept primitives\nvar $export = require('./_export');\nvar core = require('./_core');\nvar fails = require('./_fails');\nmodule.exports = function (KEY, exec) {\n var fn = (core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n","// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\nvar toIObject = require('./_to-iobject');\nvar $getOwnPropertyDescriptor = require('./_object-gopd').f;\n\nrequire('./_object-sap')('getOwnPropertyDescriptor', function () {\n return function getOwnPropertyDescriptor(it, key) {\n return $getOwnPropertyDescriptor(toIObject(it), key);\n };\n});\n","require('../../modules/es6.object.get-own-property-descriptor');\nvar $Object = require('../../modules/_core').Object;\nmodule.exports = function getOwnPropertyDescriptor(it, key) {\n return $Object.getOwnPropertyDescriptor(it, key);\n};\n","module.exports = require(\"core-js/library/fn/object/get-own-property-descriptor\");","var META = require('./_uid')('meta');\nvar isObject = require('./_is-object');\nvar has = require('./_has');\nvar setDesc = require('./_object-dp').f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\nvar FREEZE = !require('./_fails')(function () {\n return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n setDesc(it, META, { value: {\n i: 'O' + ++id, // object ID\n w: {} // weak collections IDs\n } });\n};\nvar fastKey = function (it, create) {\n // return primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMeta(it);\n // return object ID\n } return it[META].i;\n};\nvar getWeak = function (it, create) {\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMeta(it);\n // return hash weak collections IDs\n } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n return it;\n};\nvar meta = module.exports = {\n KEY: META,\n NEED: false,\n fastKey: fastKey,\n getWeak: getWeak,\n onFreeze: onFreeze\n};\n","exports.f = require('./_wks');\n","var global = require('./_global');\nvar core = require('./_core');\nvar LIBRARY = require('./_library');\nvar wksExt = require('./_wks-ext');\nvar defineProperty = require('./_object-dp').f;\nmodule.exports = function (name) {\n var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });\n};\n","exports.f = Object.getOwnPropertySymbols;\n","// all enumerable object keys, includes symbols\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nmodule.exports = function (it) {\n var result = getKeys(it);\n var getSymbols = gOPS.f;\n if (getSymbols) {\n var symbols = getSymbols(it);\n var isEnum = pIE.f;\n var i = 0;\n var key;\n while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n } return result;\n};\n","// 7.2.2 IsArray(argument)\nvar cof = require('./_cof');\nmodule.exports = Array.isArray || function isArray(arg) {\n return cof(arg) == 'Array';\n};\n","// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = require('./_object-keys-internal');\nvar hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return $keys(O, hiddenKeys);\n};\n","// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = require('./_to-iobject');\nvar gOPN = require('./_object-gopn').f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return gOPN(it);\n } catch (e) {\n return windowNames.slice();\n }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n","'use strict';\n// ECMAScript 6 symbols shim\nvar global = require('./_global');\nvar has = require('./_has');\nvar DESCRIPTORS = require('./_descriptors');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar META = require('./_meta').KEY;\nvar $fails = require('./_fails');\nvar shared = require('./_shared');\nvar setToStringTag = require('./_set-to-string-tag');\nvar uid = require('./_uid');\nvar wks = require('./_wks');\nvar wksExt = require('./_wks-ext');\nvar wksDefine = require('./_wks-define');\nvar enumKeys = require('./_enum-keys');\nvar isArray = require('./_is-array');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar createDesc = require('./_property-desc');\nvar _create = require('./_object-create');\nvar gOPNExt = require('./_object-gopn-ext');\nvar $GOPD = require('./_object-gopd');\nvar $DP = require('./_object-dp');\nvar $keys = require('./_object-keys');\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function';\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n return _create(dP({}, 'a', {\n get: function () { return dP(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (it, key, D) {\n var protoDesc = gOPD(ObjectProto, key);\n if (protoDesc) delete ObjectProto[key];\n dP(it, key, D);\n if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function (tag) {\n var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n sym._k = tag;\n return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n anObject(it);\n key = toPrimitive(key, true);\n anObject(D);\n if (has(AllSymbols, key)) {\n if (!D.enumerable) {\n if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n it[HIDDEN][key] = true;\n } else {\n if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n D = _create(D, { enumerable: createDesc(0, false) });\n } return setSymbolDesc(it, key, D);\n } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n anObject(it);\n var keys = enumKeys(P = toIObject(P));\n var i = 0;\n var l = keys.length;\n var key;\n while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n return it;\n};\nvar $create = function create(it, P) {\n return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n var E = isEnum.call(this, key = toPrimitive(key, true));\n if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n it = toIObject(it);\n key = toPrimitive(key, true);\n if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n var D = gOPD(it, key);\n if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n var names = gOPN(toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n var IS_OP = it === ObjectProto;\n var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n var $set = function (value) {\n if (this === ObjectProto) $set.call(OPSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDesc(this, tag, createDesc(1, value));\n };\n if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });\n return wrap(tag);\n };\n redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n return this._k;\n });\n\n $GOPD.f = $getOwnPropertyDescriptor;\n $DP.f = $defineProperty;\n require('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames;\n require('./_object-pie').f = $propertyIsEnumerable;\n require('./_object-gops').f = $getOwnPropertySymbols;\n\n if (DESCRIPTORS && !require('./_library')) {\n redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n }\n\n wksExt.f = function (name) {\n return wrap(wks(name));\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n // 19.4.2.1 Symbol.for(key)\n 'for': function (key) {\n return has(SymbolRegistry, key += '')\n ? SymbolRegistry[key]\n : SymbolRegistry[key] = $Symbol(key);\n },\n // 19.4.2.5 Symbol.keyFor(sym)\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n },\n useSetter: function () { setter = true; },\n useSimple: function () { setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n // 19.1.2.2 Object.create(O [, Properties])\n create: $create,\n // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n defineProperty: $defineProperty,\n // 19.1.2.3 Object.defineProperties(O, Properties)\n defineProperties: $defineProperties,\n // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n // 19.1.2.7 Object.getOwnPropertyNames(O)\n getOwnPropertyNames: $getOwnPropertyNames,\n // 19.1.2.8 Object.getOwnPropertySymbols(O)\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n var S = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n // WebKit converts symbol values to JSON as null\n // V8 throws on boxed symbols\n return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n stringify: function stringify(it) {\n var args = [it];\n var i = 1;\n var replacer, $replacer;\n while (arguments.length > i) args.push(arguments[i++]);\n $replacer = replacer = args[1];\n if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n if (!isArray(replacer)) replacer = function (key, value) {\n if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n if (!isSymbol(value)) return value;\n };\n args[1] = replacer;\n return _stringify.apply($JSON, args);\n }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || require('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n","require('../../modules/es6.symbol');\nmodule.exports = require('../../modules/_core').Object.getOwnPropertySymbols;\n","module.exports = require(\"core-js/library/fn/object/get-own-property-symbols\");","// 19.1.2.14 Object.keys(O)\nvar toObject = require('./_to-object');\nvar $keys = require('./_object-keys');\n\nrequire('./_object-sap')('keys', function () {\n return function keys(it) {\n return $keys(toObject(it));\n };\n});\n","require('../../modules/es6.object.keys');\nmodule.exports = require('../../modules/_core').Object.keys;\n","module.exports = require(\"core-js/library/fn/object/keys\");","var $export = require('./_export');\n// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)\n$export($export.S + $export.F * !require('./_descriptors'), 'Object', { defineProperty: require('./_object-dp').f });\n","require('../../modules/es6.object.define-property');\nvar $Object = require('../../modules/_core').Object;\nmodule.exports = function defineProperty(it, key, desc) {\n return $Object.defineProperty(it, key, desc);\n};\n","module.exports = require(\"core-js/library/fn/object/define-property\");","var _Object$defineProperty = require(\"../core-js/object/define-property\");\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n _Object$defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nmodule.exports = _defineProperty;","var _Object$getOwnPropertyDescriptor = require(\"../core-js/object/get-own-property-descriptor\");\n\nvar _Object$getOwnPropertySymbols = require(\"../core-js/object/get-own-property-symbols\");\n\nvar _Object$keys = require(\"../core-js/object/keys\");\n\nvar defineProperty = require(\"./defineProperty\");\n\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n var ownKeys = _Object$keys(source);\n\n if (typeof _Object$getOwnPropertySymbols === 'function') {\n ownKeys = ownKeys.concat(_Object$getOwnPropertySymbols(source).filter(function (sym) {\n return _Object$getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n }\n\n ownKeys.forEach(function (key) {\n defineProperty(target, key, source[key]);\n });\n }\n\n return target;\n}\n\nmodule.exports = _objectSpread;","function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nmodule.exports = _classCallCheck;","// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\nvar check = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n};\n","// 19.1.3.19 Object.setPrototypeOf(O, proto)\nvar $export = require('./_export');\n$export($export.S, 'Object', { setPrototypeOf: require('./_set-proto').set });\n","require('../../modules/es6.object.set-prototype-of');\nmodule.exports = require('../../modules/_core').Object.setPrototypeOf;\n","module.exports = require(\"core-js/library/fn/object/set-prototype-of\");","var _Object$setPrototypeOf = require(\"../core-js/object/set-prototype-of\");\n\nfunction _setPrototypeOf(o, p) {\n module.exports = _setPrototypeOf = _Object$setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}\n\nmodule.exports = _setPrototypeOf;","var setPrototypeOf = require(\"./setPrototypeOf\");\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n setPrototypeOf(subClass.prototype, superClass && superClass.prototype);\n if (superClass) setPrototypeOf(subClass, superClass);\n}\n\nmodule.exports = _inherits;","var _Object$defineProperty = require(\"../core-js/object/define-property\");\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n\n _Object$defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;","require('../../modules/es6.string.iterator');\nrequire('../../modules/web.dom.iterable');\nmodule.exports = require('../../modules/_wks-ext').f('iterator');\n","module.exports = require(\"core-js/library/fn/symbol/iterator\");","require('./_wks-define')('asyncIterator');\n","require('./_wks-define')('observable');\n","require('../../modules/es6.symbol');\nrequire('../../modules/es6.object.to-string');\nrequire('../../modules/es7.symbol.async-iterator');\nrequire('../../modules/es7.symbol.observable');\nmodule.exports = require('../../modules/_core').Symbol;\n","module.exports = require(\"core-js/library/fn/symbol\");","var _Symbol$iterator = require(\"../core-js/symbol/iterator\");\n\nvar _Symbol = require(\"../core-js/symbol\");\n\nfunction _typeof2(obj) { if (typeof _Symbol === \"function\" && typeof _Symbol$iterator === \"symbol\") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof _Symbol === \"function\" && obj.constructor === _Symbol && obj !== _Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof2(obj); }\n\nfunction _typeof(obj) {\n if (typeof _Symbol === \"function\" && _typeof2(_Symbol$iterator) === \"symbol\") {\n module.exports = _typeof = function _typeof(obj) {\n return _typeof2(obj);\n };\n } else {\n module.exports = _typeof = function _typeof(obj) {\n return obj && typeof _Symbol === \"function\" && obj.constructor === _Symbol && obj !== _Symbol.prototype ? \"symbol\" : _typeof2(obj);\n };\n }\n\n return _typeof(obj);\n}\n\nmodule.exports = _typeof;","function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}\n\nmodule.exports = _assertThisInitialized;","var _typeof = require(\"../helpers/typeof\");\n\nvar assertThisInitialized = require(\"./assertThisInitialized\");\n\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n\n return assertThisInitialized(self);\n}\n\nmodule.exports = _possibleConstructorReturn;","// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = require('./_to-object');\nvar $getPrototypeOf = require('./_object-gpo');\n\nrequire('./_object-sap')('getPrototypeOf', function () {\n return function getPrototypeOf(it) {\n return $getPrototypeOf(toObject(it));\n };\n});\n","require('../../modules/es6.object.get-prototype-of');\nmodule.exports = require('../../modules/_core').Object.getPrototypeOf;\n","module.exports = require(\"core-js/library/fn/object/get-prototype-of\");","var _Object$getPrototypeOf = require(\"../core-js/object/get-prototype-of\");\n\nfunction _getPrototypeOf(o) {\n module.exports = _getPrototypeOf = _Object$getPrototypeOf || function _getPrototypeOf(o) {\n return o.__proto__;\n };\n\n return _getPrototypeOf(o);\n}\n\nmodule.exports = _getPrototypeOf;","export const extend = (object, ...extensions) => { // $.extend alternative, ... is the spread operator.\n for (const extension of extensions) {\n // console.log(extension);\n // console.log(typeof extension);\n\n if (!extension)\n continue; // Ignore null and undefined objects and parameters.\n\n for (const prop of Object.getOwnPropertyNames(extension)) { // Do not traverse the prototype chain.\n if (object[prop] !== undefined && extension[prop]\n && object[prop].toString() === '[object Object]'\n && extension[prop].toString() === '[object Object]') {\n // Goes deep only if object[prop] and extension[prop] are both objects !\n if (object[prop].constructor === Object) extend(object[prop], extension[prop]);\n } else\n object[prop] = typeof object[prop] === 'undefined' ? extension[prop] : object[prop];\n\n if (typeof object[prop] === 'undefined' && Array.isArray(extension[prop])) object[prop] = extension[prop].slice(); // Add values that do not already exist.\n else if (typeof object[prop] === 'undefined' && Array.isArray(extension[prop])) object[prop] = extension[prop];\n }\n }\n\n return object;\n};\n","export const instruct = (array, instArray) => {\n const tempObject = {};\n\n for (let i = 0, max = instArray.length; i < max; i++) {\n const guide = instArray[i];\n\n tempObject[guide] = array[i];\n }\n\n return tempObject;\n};\n\nexport const transformData = (object, instructions) => {\n for (const key in instructions) {\n if (Array.isArray(object[key]))\n object[key] = instruct(object[key], instructions[key]);\n else if (object[key] instanceof Object && !(Array.isArray(instructions[key])))\n object[key] = transformData(object[key], instructions[key]);\n }\n\n return object;\n};\n\nexport const toArray = (object, instruction) => {\n const tempArray = [];\n\n for (let i = 0, max = instruction.length; i < max; i++) {\n const guide = instruction[i];\n\n tempArray[i] = object[guide];\n }\n\n return tempArray;\n};\n","// Polyfills\n\nif ( Number.EPSILON === undefined ) {\n\n\tNumber.EPSILON = Math.pow( 2, - 52 );\n\n}\n\nif ( Number.isInteger === undefined ) {\n\n\t// Missing in IE\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger\n\n\tNumber.isInteger = function ( value ) {\n\n\t\treturn typeof value === 'number' && isFinite( value ) && Math.floor( value ) === value;\n\n\t};\n\n}\n\n//\n\nif ( Math.sign === undefined ) {\n\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign\n\n\tMath.sign = function ( x ) {\n\n\t\treturn ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x;\n\n\t};\n\n}\n\nif ( 'name' in Function.prototype === false ) {\n\n\t// Missing in IE\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name\n\n\tObject.defineProperty( Function.prototype, 'name', {\n\n\t\tget: function () {\n\n\t\t\treturn this.toString().match( /^\\s*function\\s*([^\\(\\s]*)/ )[ 1 ];\n\n\t\t}\n\n\t} );\n\n}\n\nif ( Object.assign === undefined ) {\n\n\t// Missing in IE\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\n\n\t( function () {\n\n\t\tObject.assign = function ( target ) {\n\n\t\t\tif ( target === undefined || target === null ) {\n\n\t\t\t\tthrow new TypeError( 'Cannot convert undefined or null to object' );\n\n\t\t\t}\n\n\t\t\tvar output = Object( target );\n\n\t\t\tfor ( var index = 1; index < arguments.length; index ++ ) {\n\n\t\t\t\tvar source = arguments[ index ];\n\n\t\t\t\tif ( source !== undefined && source !== null ) {\n\n\t\t\t\t\tfor ( var nextKey in source ) {\n\n\t\t\t\t\t\tif ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) {\n\n\t\t\t\t\t\t\toutput[ nextKey ] = source[ nextKey ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn output;\n\n\t\t};\n\n\t} )();\n\n}\n\n/**\n * https://github.com/mrdoob/eventdispatcher.js/\n */\n\nfunction EventDispatcher() {}\n\nObject.assign( EventDispatcher.prototype, {\n\n\taddEventListener: function ( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\tvar listeners = this._listeners;\n\n\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\tlisteners[ type ] = [];\n\n\t\t}\n\n\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\tlisteners[ type ].push( listener );\n\n\t\t}\n\n\t},\n\n\thasEventListener: function ( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return false;\n\n\t\tvar listeners = this._listeners;\n\n\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;\n\n\t},\n\n\tremoveEventListener: function ( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tvar listeners = this._listeners;\n\t\tvar listenerArray = listeners[ type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tvar index = listenerArray.indexOf( listener );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\tdispatchEvent: function ( event ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tvar listeners = this._listeners;\n\t\tvar listenerArray = listeners[ event.type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tevent.target = this;\n\n\t\t\tvar array = listenerArray.slice( 0 );\n\n\t\t\tfor ( var i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n} );\n\nvar REVISION = '92';\nvar MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 };\nvar CullFaceNone = 0;\nvar CullFaceBack = 1;\nvar CullFaceFront = 2;\nvar CullFaceFrontBack = 3;\nvar FrontFaceDirectionCW = 0;\nvar FrontFaceDirectionCCW = 1;\nvar BasicShadowMap = 0;\nvar PCFShadowMap = 1;\nvar PCFSoftShadowMap = 2;\nvar FrontSide = 0;\nvar BackSide = 1;\nvar DoubleSide = 2;\nvar FlatShading = 1;\nvar SmoothShading = 2;\nvar NoColors = 0;\nvar FaceColors = 1;\nvar VertexColors = 2;\nvar NoBlending = 0;\nvar NormalBlending = 1;\nvar AdditiveBlending = 2;\nvar SubtractiveBlending = 3;\nvar MultiplyBlending = 4;\nvar CustomBlending = 5;\nvar AddEquation = 100;\nvar SubtractEquation = 101;\nvar ReverseSubtractEquation = 102;\nvar MinEquation = 103;\nvar MaxEquation = 104;\nvar ZeroFactor = 200;\nvar OneFactor = 201;\nvar SrcColorFactor = 202;\nvar OneMinusSrcColorFactor = 203;\nvar SrcAlphaFactor = 204;\nvar OneMinusSrcAlphaFactor = 205;\nvar DstAlphaFactor = 206;\nvar OneMinusDstAlphaFactor = 207;\nvar DstColorFactor = 208;\nvar OneMinusDstColorFactor = 209;\nvar SrcAlphaSaturateFactor = 210;\nvar NeverDepth = 0;\nvar AlwaysDepth = 1;\nvar LessDepth = 2;\nvar LessEqualDepth = 3;\nvar EqualDepth = 4;\nvar GreaterEqualDepth = 5;\nvar GreaterDepth = 6;\nvar NotEqualDepth = 7;\nvar MultiplyOperation = 0;\nvar MixOperation = 1;\nvar AddOperation = 2;\nvar NoToneMapping = 0;\nvar LinearToneMapping = 1;\nvar ReinhardToneMapping = 2;\nvar Uncharted2ToneMapping = 3;\nvar CineonToneMapping = 4;\nvar UVMapping = 300;\nvar CubeReflectionMapping = 301;\nvar CubeRefractionMapping = 302;\nvar EquirectangularReflectionMapping = 303;\nvar EquirectangularRefractionMapping = 304;\nvar SphericalReflectionMapping = 305;\nvar CubeUVReflectionMapping = 306;\nvar CubeUVRefractionMapping = 307;\nvar RepeatWrapping = 1000;\nvar ClampToEdgeWrapping = 1001;\nvar MirroredRepeatWrapping = 1002;\nvar NearestFilter = 1003;\nvar NearestMipMapNearestFilter = 1004;\nvar NearestMipMapLinearFilter = 1005;\nvar LinearFilter = 1006;\nvar LinearMipMapNearestFilter = 1007;\nvar LinearMipMapLinearFilter = 1008;\nvar UnsignedByteType = 1009;\nvar ByteType = 1010;\nvar ShortType = 1011;\nvar UnsignedShortType = 1012;\nvar IntType = 1013;\nvar UnsignedIntType = 1014;\nvar FloatType = 1015;\nvar HalfFloatType = 1016;\nvar UnsignedShort4444Type = 1017;\nvar UnsignedShort5551Type = 1018;\nvar UnsignedShort565Type = 1019;\nvar UnsignedInt248Type = 1020;\nvar AlphaFormat = 1021;\nvar RGBFormat = 1022;\nvar RGBAFormat = 1023;\nvar LuminanceFormat = 1024;\nvar LuminanceAlphaFormat = 1025;\nvar RGBEFormat = RGBAFormat;\nvar DepthFormat = 1026;\nvar DepthStencilFormat = 1027;\nvar RGB_S3TC_DXT1_Format = 33776;\nvar RGBA_S3TC_DXT1_Format = 33777;\nvar RGBA_S3TC_DXT3_Format = 33778;\nvar RGBA_S3TC_DXT5_Format = 33779;\nvar RGB_PVRTC_4BPPV1_Format = 35840;\nvar RGB_PVRTC_2BPPV1_Format = 35841;\nvar RGBA_PVRTC_4BPPV1_Format = 35842;\nvar RGBA_PVRTC_2BPPV1_Format = 35843;\nvar RGB_ETC1_Format = 36196;\nvar RGBA_ASTC_4x4_Format = 37808;\nvar RGBA_ASTC_5x4_Format = 37809;\nvar RGBA_ASTC_5x5_Format = 37810;\nvar RGBA_ASTC_6x5_Format = 37811;\nvar RGBA_ASTC_6x6_Format = 37812;\nvar RGBA_ASTC_8x5_Format = 37813;\nvar RGBA_ASTC_8x6_Format = 37814;\nvar RGBA_ASTC_8x8_Format = 37815;\nvar RGBA_ASTC_10x5_Format = 37816;\nvar RGBA_ASTC_10x6_Format = 37817;\nvar RGBA_ASTC_10x8_Format = 37818;\nvar RGBA_ASTC_10x10_Format = 37819;\nvar RGBA_ASTC_12x10_Format = 37820;\nvar RGBA_ASTC_12x12_Format = 37821;\nvar LoopOnce = 2200;\nvar LoopRepeat = 2201;\nvar LoopPingPong = 2202;\nvar InterpolateDiscrete = 2300;\nvar InterpolateLinear = 2301;\nvar InterpolateSmooth = 2302;\nvar ZeroCurvatureEnding = 2400;\nvar ZeroSlopeEnding = 2401;\nvar WrapAroundEnding = 2402;\nvar TrianglesDrawMode = 0;\nvar TriangleStripDrawMode = 1;\nvar TriangleFanDrawMode = 2;\nvar LinearEncoding = 3000;\nvar sRGBEncoding = 3001;\nvar GammaEncoding = 3007;\nvar RGBEEncoding = 3002;\nvar LogLuvEncoding = 3003;\nvar RGBM7Encoding = 3004;\nvar RGBM16Encoding = 3005;\nvar RGBDEncoding = 3006;\nvar BasicDepthPacking = 3200;\nvar RGBADepthPacking = 3201;\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author mrdoob / http://mrdoob.com/\n */\n\nvar _Math = {\n\n\tDEG2RAD: Math.PI / 180,\n\tRAD2DEG: 180 / Math.PI,\n\n\tgenerateUUID: ( function () {\n\n\t\t// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\n\n\t\tvar lut = [];\n\n\t\tfor ( var i = 0; i < 256; i ++ ) {\n\n\t\t\tlut[ i ] = ( i < 16 ? '0' : '' ) + ( i ).toString( 16 );\n\n\t\t}\n\n\t\treturn function generateUUID() {\n\n\t\t\tvar d0 = Math.random() * 0xffffffff | 0;\n\t\t\tvar d1 = Math.random() * 0xffffffff | 0;\n\t\t\tvar d2 = Math.random() * 0xffffffff | 0;\n\t\t\tvar d3 = Math.random() * 0xffffffff | 0;\n\t\t\tvar uuid = lut[ d0 & 0xff ] + lut[ d0 >> 8 & 0xff ] + lut[ d0 >> 16 & 0xff ] + lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t\tlut[ d1 & 0xff ] + lut[ d1 >> 8 & 0xff ] + '-' + lut[ d1 >> 16 & 0x0f | 0x40 ] + lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t\tlut[ d2 & 0x3f | 0x80 ] + lut[ d2 >> 8 & 0xff ] + '-' + lut[ d2 >> 16 & 0xff ] + lut[ d2 >> 24 & 0xff ] +\n\t\t\t\tlut[ d3 & 0xff ] + lut[ d3 >> 8 & 0xff ] + lut[ d3 >> 16 & 0xff ] + lut[ d3 >> 24 & 0xff ];\n\n\t\t\t// .toUpperCase() here flattens concatenated strings to save heap memory space.\n\t\t\treturn uuid.toUpperCase();\n\n\t\t};\n\n\t} )(),\n\n\tclamp: function ( value, min, max ) {\n\n\t\treturn Math.max( min, Math.min( max, value ) );\n\n\t},\n\n\t// compute euclidian modulo of m % n\n\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\teuclideanModulo: function ( n, m ) {\n\n\t\treturn ( ( n % m ) + m ) % m;\n\n\t},\n\n\t// Linear mapping from range to range \n\n\tmapLinear: function ( x, a1, a2, b1, b2 ) {\n\n\t\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n\t},\n\n\t// https://en.wikipedia.org/wiki/Linear_interpolation\n\n\tlerp: function ( x, y, t ) {\n\n\t\treturn ( 1 - t ) * x + t * y;\n\n\t},\n\n\t// http://en.wikipedia.org/wiki/Smoothstep\n\n\tsmoothstep: function ( x, min, max ) {\n\n\t\tif ( x <= min ) return 0;\n\t\tif ( x >= max ) return 1;\n\n\t\tx = ( x - min ) / ( max - min );\n\n\t\treturn x * x * ( 3 - 2 * x );\n\n\t},\n\n\tsmootherstep: function ( x, min, max ) {\n\n\t\tif ( x <= min ) return 0;\n\t\tif ( x >= max ) return 1;\n\n\t\tx = ( x - min ) / ( max - min );\n\n\t\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n\t},\n\n\t// Random integer from interval\n\n\trandInt: function ( low, high ) {\n\n\t\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n\t},\n\n\t// Random float from interval\n\n\trandFloat: function ( low, high ) {\n\n\t\treturn low + Math.random() * ( high - low );\n\n\t},\n\n\t// Random float from <-range/2, range/2> interval\n\n\trandFloatSpread: function ( range ) {\n\n\t\treturn range * ( 0.5 - Math.random() );\n\n\t},\n\n\tdegToRad: function ( degrees ) {\n\n\t\treturn degrees * _Math.DEG2RAD;\n\n\t},\n\n\tradToDeg: function ( radians ) {\n\n\t\treturn radians * _Math.RAD2DEG;\n\n\t},\n\n\tisPowerOfTwo: function ( value ) {\n\n\t\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n\t},\n\n\tceilPowerOfTwo: function ( value ) {\n\n\t\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n\t},\n\n\tfloorPowerOfTwo: function ( value ) {\n\n\t\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n\t}\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author philogb / http://blog.thejit.org/\n * @author egraether / http://egraether.com/\n * @author zz85 / http://www.lab4games.net/zz85/blog\n */\n\nfunction Vector2( x, y ) {\n\n\tthis.x = x || 0;\n\tthis.y = y || 0;\n\n}\n\nObject.defineProperties( Vector2.prototype, {\n\n\t\"width\": {\n\n\t\tget: function () {\n\n\t\t\treturn this.x;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis.x = value;\n\n\t\t}\n\n\t},\n\n\t\"height\": {\n\n\t\tget: function () {\n\n\t\t\treturn this.y;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis.y = value;\n\n\t\t}\n\n\t}\n\n} );\n\nObject.assign( Vector2.prototype, {\n\n\tisVector2: true,\n\n\tset: function ( x, y ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetScalar: function ( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\n\t\treturn this;\n\n\t},\n\n\tsetX: function ( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t},\n\n\tsetY: function ( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetComponent: function ( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetComponent: function ( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.x, this.y );\n\n\t},\n\n\tcopy: function ( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\n\t\treturn this;\n\n\t},\n\n\tadd: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\n\t\treturn this;\n\n\t},\n\n\taddScalar: function ( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\n\t\treturn this;\n\n\t},\n\n\taddVectors: function ( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\n\t\treturn this;\n\n\t},\n\n\taddScaledVector: function ( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\n\t\treturn this;\n\n\t},\n\n\tsub: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\n\t\treturn this;\n\n\t},\n\n\tsubScalar: function ( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\n\t\treturn this;\n\n\t},\n\n\tsubVectors: function ( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\n\t\treturn this;\n\n\t},\n\n\tmultiply: function ( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\n\t\treturn this;\n\n\t},\n\n\tmultiplyScalar: function ( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\n\t\treturn this;\n\n\t},\n\n\tdivide: function ( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\n\t\treturn this;\n\n\t},\n\n\tdivideScalar: function ( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t},\n\n\tapplyMatrix3: function ( m ) {\n\n\t\tvar x = this.x, y = this.y;\n\t\tvar e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ];\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ];\n\n\t\treturn this;\n\n\t},\n\n\tmin: function ( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\n\t\treturn this;\n\n\t},\n\n\tmax: function ( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\n\t\treturn this;\n\n\t},\n\n\tclamp: function ( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\n\t\treturn this;\n\n\t},\n\n\tclampScalar: function () {\n\n\t\tvar min = new Vector2();\n\t\tvar max = new Vector2();\n\n\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\tmin.set( minVal, minVal );\n\t\t\tmax.set( maxVal, maxVal );\n\n\t\t\treturn this.clamp( min, max );\n\n\t\t};\n\n\t}(),\n\n\tclampLength: function ( min, max ) {\n\n\t\tvar length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t},\n\n\tfloor: function () {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\n\t\treturn this;\n\n\t},\n\n\tceil: function () {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\n\t\treturn this;\n\n\t},\n\n\tround: function () {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\n\t\treturn this;\n\n\t},\n\n\troundToZero: function () {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\n\t\treturn this;\n\n\t},\n\n\tnegate: function () {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\n\t\treturn this;\n\n\t},\n\n\tdot: function ( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y;\n\n\t},\n\n\tlengthSq: function () {\n\n\t\treturn this.x * this.x + this.y * this.y;\n\n\t},\n\n\tlength: function () {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t},\n\n\tmanhattanLength: function () {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t},\n\n\tnormalize: function () {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t},\n\n\tangle: function () {\n\n\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\tvar angle = Math.atan2( this.y, this.x );\n\n\t\tif ( angle < 0 ) angle += 2 * Math.PI;\n\n\t\treturn angle;\n\n\t},\n\n\tdistanceTo: function ( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t},\n\n\tdistanceToSquared: function ( v ) {\n\n\t\tvar dx = this.x - v.x, dy = this.y - v.y;\n\t\treturn dx * dx + dy * dy;\n\n\t},\n\n\tmanhattanDistanceTo: function ( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t},\n\n\tsetLength: function ( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t},\n\n\tlerp: function ( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\treturn this;\n\n\t},\n\n\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t},\n\n\tequals: function ( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t},\n\n\tfromArray: function ( array, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\n\t\treturn array;\n\n\t},\n\n\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\n\t\treturn this;\n\n\t},\n\n\trotateAround: function ( center, angle ) {\n\n\t\tvar c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\tvar x = this.x - center.x;\n\t\tvar y = this.y - center.y;\n\n\t\tthis.x = x * c - y * s + center.x;\n\t\tthis.y = x * s + y * c + center.y;\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author supereggbert / http://www.paulbrunt.co.uk/\n * @author philogb / http://blog.thejit.org/\n * @author jordi_ros / http://plattsoft.com\n * @author D1plo1d / http://github.com/D1plo1d\n * @author alteredq / http://alteredqualia.com/\n * @author mikael emtinger / http://gomo.se/\n * @author timknip / http://www.floorplanner.com/\n * @author bhouston / http://clara.io\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction Matrix4() {\n\n\tthis.elements = [\n\n\t\t1, 0, 0, 0,\n\t\t0, 1, 0, 0,\n\t\t0, 0, 1, 0,\n\t\t0, 0, 0, 1\n\n\t];\n\n\tif ( arguments.length > 0 ) {\n\n\t\tconsole.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' );\n\n\t}\n\n}\n\nObject.assign( Matrix4.prototype, {\n\n\tisMatrix4: true,\n\n\tset: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tvar te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\treturn this;\n\n\t},\n\n\tidentity: function () {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new Matrix4().fromArray( this.elements );\n\n\t},\n\n\tcopy: function ( m ) {\n\n\t\tvar te = this.elements;\n\t\tvar me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];\n\t\tte[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];\n\t\tte[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];\n\t\tte[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];\n\n\t\treturn this;\n\n\t},\n\n\tcopyPosition: function ( m ) {\n\n\t\tvar te = this.elements, me = m.elements;\n\n\t\tte[ 12 ] = me[ 12 ];\n\t\tte[ 13 ] = me[ 13 ];\n\t\tte[ 14 ] = me[ 14 ];\n\n\t\treturn this;\n\n\t},\n\n\textractBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\treturn this;\n\n\t},\n\n\tmakeBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\tthis.set(\n\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\textractRotation: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function extractRotation( m ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = m.elements;\n\n\t\t\tvar scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length();\n\t\t\tvar scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length();\n\t\t\tvar scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\n\t\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\n\t\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tmakeRotationFromEuler: function ( euler ) {\n\n\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );\n\n\t\t}\n\n\t\tvar te = this.elements;\n\n\t\tvar x = euler.x, y = euler.y, z = euler.z;\n\t\tvar a = Math.cos( x ), b = Math.sin( x );\n\t\tvar c = Math.cos( y ), d = Math.sin( y );\n\t\tvar e = Math.cos( z ), f = Math.sin( z );\n\n\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - c * f;\n\t\t\tte[ 8 ] = d;\n\n\t\t\tte[ 1 ] = af + be * d;\n\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\tte[ 9 ] = - b * c;\n\n\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\tte[ 6 ] = be + af * d;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce + df * b;\n\t\t\tte[ 4 ] = de * b - cf;\n\t\t\tte[ 8 ] = a * d;\n\n\t\t\tte[ 1 ] = a * f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b;\n\n\t\t\tte[ 2 ] = cf * b - de;\n\t\t\tte[ 6 ] = df + ce * b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce - df * b;\n\t\t\tte[ 4 ] = - a * f;\n\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\tte[ 1 ] = cf + de * b;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\tte[ 2 ] = - a * d;\n\t\t\tte[ 6 ] = b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = be * d - af;\n\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\tte[ 1 ] = c * f;\n\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\tte[ 2 ] = - d;\n\t\t\tte[ 6 ] = b * c;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\tte[ 1 ] = f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b * e;\n\n\t\t\tte[ 2 ] = - d * e;\n\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - f;\n\t\t\tte[ 8 ] = d * e;\n\n\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\tte[ 6 ] = b * e;\n\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t}\n\n\t\t// last column\n\t\tte[ 3 ] = 0;\n\t\tte[ 7 ] = 0;\n\t\tte[ 11 ] = 0;\n\n\t\t// bottom row\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t},\n\n\tmakeRotationFromQuaternion: function ( q ) {\n\n\t\tvar te = this.elements;\n\n\t\tvar x = q._x, y = q._y, z = q._z, w = q._w;\n\t\tvar x2 = x + x, y2 = y + y, z2 = z + z;\n\t\tvar xx = x * x2, xy = x * y2, xz = x * z2;\n\t\tvar yy = y * y2, yz = y * z2, zz = z * z2;\n\t\tvar wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\tte[ 0 ] = 1 - ( yy + zz );\n\t\tte[ 4 ] = xy - wz;\n\t\tte[ 8 ] = xz + wy;\n\n\t\tte[ 1 ] = xy + wz;\n\t\tte[ 5 ] = 1 - ( xx + zz );\n\t\tte[ 9 ] = yz - wx;\n\n\t\tte[ 2 ] = xz - wy;\n\t\tte[ 6 ] = yz + wx;\n\t\tte[ 10 ] = 1 - ( xx + yy );\n\n\t\t// last column\n\t\tte[ 3 ] = 0;\n\t\tte[ 7 ] = 0;\n\t\tte[ 11 ] = 0;\n\n\t\t// bottom row\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t},\n\n\tlookAt: function () {\n\n\t\tvar x = new Vector3();\n\t\tvar y = new Vector3();\n\t\tvar z = new Vector3();\n\n\t\treturn function lookAt( eye, target, up ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tz.subVectors( eye, target );\n\n\t\t\tif ( z.lengthSq() === 0 ) {\n\n\t\t\t\t// eye and target are in the same position\n\n\t\t\t\tz.z = 1;\n\n\t\t\t}\n\n\t\t\tz.normalize();\n\t\t\tx.crossVectors( up, z );\n\n\t\t\tif ( x.lengthSq() === 0 ) {\n\n\t\t\t\t// up and z are parallel\n\n\t\t\t\tif ( Math.abs( up.z ) === 1 ) {\n\n\t\t\t\t\tz.x += 0.0001;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tz.z += 0.0001;\n\n\t\t\t\t}\n\n\t\t\t\tz.normalize();\n\t\t\t\tx.crossVectors( up, z );\n\n\t\t\t}\n\n\t\t\tx.normalize();\n\t\t\ty.crossVectors( z, x );\n\n\t\t\tte[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x;\n\t\t\tte[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y;\n\t\t\tte[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tmultiply: function ( m, n ) {\n\n\t\tif ( n !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );\n\t\t\treturn this.multiplyMatrices( m, n );\n\n\t\t}\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t},\n\n\tpremultiply: function ( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t},\n\n\tmultiplyMatrices: function ( a, b ) {\n\n\t\tvar ae = a.elements;\n\t\tvar be = b.elements;\n\t\tvar te = this.elements;\n\n\t\tvar a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\tvar a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\tvar a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\tvar a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\tvar b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\tvar b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\tvar b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\tvar b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\treturn this;\n\n\t},\n\n\tmultiplyScalar: function ( s ) {\n\n\t\tvar te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\treturn this;\n\n\t},\n\n\tapplyToBufferAttribute: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function applyToBufferAttribute( attribute ) {\n\n\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\tv1.x = attribute.getX( i );\n\t\t\t\tv1.y = attribute.getY( i );\n\t\t\t\tv1.z = attribute.getZ( i );\n\n\t\t\t\tv1.applyMatrix4( this );\n\n\t\t\t\tattribute.setXYZ( i, v1.x, v1.y, v1.z );\n\n\t\t\t}\n\n\t\t\treturn attribute;\n\n\t\t};\n\n\t}(),\n\n\tdeterminant: function () {\n\n\t\tvar te = this.elements;\n\n\t\tvar n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\tvar n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\tvar n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\tvar n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t//TODO: make this more efficient\n\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\treturn (\n\t\t\tn41 * (\n\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t - n13 * n24 * n32\n\t\t\t\t - n14 * n22 * n33\n\t\t\t\t + n12 * n24 * n33\n\t\t\t\t + n13 * n22 * n34\n\t\t\t\t - n12 * n23 * n34\n\t\t\t) +\n\t\t\tn42 * (\n\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t - n11 * n24 * n33\n\t\t\t\t + n14 * n21 * n33\n\t\t\t\t - n13 * n21 * n34\n\t\t\t\t + n13 * n24 * n31\n\t\t\t\t - n14 * n23 * n31\n\t\t\t) +\n\t\t\tn43 * (\n\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t - n11 * n22 * n34\n\t\t\t\t - n14 * n21 * n32\n\t\t\t\t + n12 * n21 * n34\n\t\t\t\t + n14 * n22 * n31\n\t\t\t\t - n12 * n24 * n31\n\t\t\t) +\n\t\t\tn44 * (\n\t\t\t\t- n13 * n22 * n31\n\t\t\t\t - n11 * n23 * n32\n\t\t\t\t + n11 * n22 * n33\n\t\t\t\t + n13 * n21 * n32\n\t\t\t\t - n12 * n21 * n33\n\t\t\t\t + n12 * n23 * n31\n\t\t\t)\n\n\t\t);\n\n\t},\n\n\ttranspose: function () {\n\n\t\tvar te = this.elements;\n\t\tvar tmp;\n\n\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\treturn this;\n\n\t},\n\n\tsetPosition: function ( v ) {\n\n\t\tvar te = this.elements;\n\n\t\tte[ 12 ] = v.x;\n\t\tte[ 13 ] = v.y;\n\t\tte[ 14 ] = v.z;\n\n\t\treturn this;\n\n\t},\n\n\tgetInverse: function ( m, throwOnDegenerate ) {\n\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\tvar te = this.elements,\n\t\t\tme = m.elements,\n\n\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ],\n\t\t\tn12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ],\n\t\t\tn13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ],\n\t\t\tn14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ],\n\n\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\tvar det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\tif ( det === 0 ) {\n\n\t\t\tvar msg = \"THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0\";\n\n\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\tthrow new Error( msg );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( msg );\n\n\t\t\t}\n\n\t\t\treturn this.identity();\n\n\t\t}\n\n\t\tvar detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\tte[ 4 ] = t12 * detInv;\n\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\tte[ 8 ] = t13 * detInv;\n\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\tte[ 12 ] = t14 * detInv;\n\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\treturn this;\n\n\t},\n\n\tscale: function ( v ) {\n\n\t\tvar te = this.elements;\n\t\tvar x = v.x, y = v.y, z = v.z;\n\n\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\treturn this;\n\n\t},\n\n\tgetMaxScaleOnAxis: function () {\n\n\t\tvar te = this.elements;\n\n\t\tvar scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\tvar scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\tvar scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t},\n\n\tmakeTranslation: function ( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, x,\n\t\t\t0, 1, 0, y,\n\t\t\t0, 0, 1, z,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tmakeRotationX: function ( theta ) {\n\n\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, c, - s, 0,\n\t\t\t0, s, c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tmakeRotationY: function ( theta ) {\n\n\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t c, 0, s, 0,\n\t\t\t 0, 1, 0, 0,\n\t\t\t- s, 0, c, 0,\n\t\t\t 0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tmakeRotationZ: function ( theta ) {\n\n\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0, 0,\n\t\t\ts, c, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tmakeRotationAxis: function ( axis, angle ) {\n\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\tvar c = Math.cos( angle );\n\t\tvar s = Math.sin( angle );\n\t\tvar t = 1 - c;\n\t\tvar x = axis.x, y = axis.y, z = axis.z;\n\t\tvar tx = t * x, ty = t * y;\n\n\t\tthis.set(\n\n\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\t return this;\n\n\t},\n\n\tmakeScale: function ( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0, 0,\n\t\t\t0, y, 0, 0,\n\t\t\t0, 0, z, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tmakeShear: function ( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\t1, y, z, 0,\n\t\t\tx, 1, z, 0,\n\t\t\tx, y, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tcompose: function ( position, quaternion, scale ) {\n\n\t\tthis.makeRotationFromQuaternion( quaternion );\n\t\tthis.scale( scale );\n\t\tthis.setPosition( position );\n\n\t\treturn this;\n\n\t},\n\n\tdecompose: function () {\n\n\t\tvar vector = new Vector3();\n\t\tvar matrix = new Matrix4();\n\n\t\treturn function decompose( position, quaternion, scale ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\t\tvar sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\t\tvar sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t\t// if determine is negative, we need to invert one scale\n\t\t\tvar det = this.determinant();\n\t\t\tif ( det < 0 ) sx = - sx;\n\n\t\t\tposition.x = te[ 12 ];\n\t\t\tposition.y = te[ 13 ];\n\t\t\tposition.z = te[ 14 ];\n\n\t\t\t// scale the rotation part\n\t\t\tmatrix.copy( this );\n\n\t\t\tvar invSX = 1 / sx;\n\t\t\tvar invSY = 1 / sy;\n\t\t\tvar invSZ = 1 / sz;\n\n\t\t\tmatrix.elements[ 0 ] *= invSX;\n\t\t\tmatrix.elements[ 1 ] *= invSX;\n\t\t\tmatrix.elements[ 2 ] *= invSX;\n\n\t\t\tmatrix.elements[ 4 ] *= invSY;\n\t\t\tmatrix.elements[ 5 ] *= invSY;\n\t\t\tmatrix.elements[ 6 ] *= invSY;\n\n\t\t\tmatrix.elements[ 8 ] *= invSZ;\n\t\t\tmatrix.elements[ 9 ] *= invSZ;\n\t\t\tmatrix.elements[ 10 ] *= invSZ;\n\n\t\t\tquaternion.setFromRotationMatrix( matrix );\n\n\t\t\tscale.x = sx;\n\t\t\tscale.y = sy;\n\t\t\tscale.z = sz;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tmakePerspective: function ( left, right, top, bottom, near, far ) {\n\n\t\tif ( far === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' );\n\n\t\t}\n\n\t\tvar te = this.elements;\n\t\tvar x = 2 * near / ( right - left );\n\t\tvar y = 2 * near / ( top - bottom );\n\n\t\tvar a = ( right + left ) / ( right - left );\n\t\tvar b = ( top + bottom ) / ( top - bottom );\n\t\tvar c = - ( far + near ) / ( far - near );\n\t\tvar d = - 2 * far * near / ( far - near );\n\n\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a;\tte[ 12 ] = 0;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b;\tte[ 13 ] = 0;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c;\tte[ 14 ] = d;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\n\n\t\treturn this;\n\n\t},\n\n\tmakeOrthographic: function ( left, right, top, bottom, near, far ) {\n\n\t\tvar te = this.elements;\n\t\tvar w = 1.0 / ( right - left );\n\t\tvar h = 1.0 / ( top - bottom );\n\t\tvar p = 1.0 / ( far - near );\n\n\t\tvar x = ( right + left ) * w;\n\t\tvar y = ( top + bottom ) * h;\n\t\tvar z = ( far + near ) * p;\n\n\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\tte[ 8 ] = 0;\tte[ 12 ] = - x;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0;\tte[ 13 ] = - y;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = - 2 * p;\tte[ 14 ] = - z;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = 0;\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( matrix ) {\n\n\t\tvar te = this.elements;\n\t\tvar me = matrix.elements;\n\n\t\tfor ( var i = 0; i < 16; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t},\n\n\tfromArray: function ( array, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tfor ( var i = 0; i < 16; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tvar te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\treturn array;\n\n\t}\n\n} );\n\n/**\n * @author mikael emtinger / http://gomo.se/\n * @author alteredq / http://alteredqualia.com/\n * @author WestLangley / http://github.com/WestLangley\n * @author bhouston / http://clara.io\n */\n\nfunction Quaternion( x, y, z, w ) {\n\n\tthis._x = x || 0;\n\tthis._y = y || 0;\n\tthis._z = z || 0;\n\tthis._w = ( w !== undefined ) ? w : 1;\n\n}\n\nObject.assign( Quaternion, {\n\n\tslerp: function ( qa, qb, qm, t ) {\n\n\t\treturn qm.copy( qa ).slerp( qb, t );\n\n\t},\n\n\tslerpFlat: function ( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\tvar x0 = src0[ srcOffset0 + 0 ],\n\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\tw0 = src0[ srcOffset0 + 3 ],\n\n\t\t\tx1 = src1[ srcOffset1 + 0 ],\n\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\tvar s = 1 - t,\n\n\t\t\t\tcos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\n\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\n\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\tvar sin = Math.sqrt( sqrSin ),\n\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t}\n\n\t\t\tvar tDir = t * dir;\n\n\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t// Normalize in case we just did a lerp:\n\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\tvar f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\tx0 *= f;\n\t\t\t\ty0 *= f;\n\t\t\t\tz0 *= f;\n\t\t\t\tw0 *= f;\n\n\t\t\t}\n\n\t\t}\n\n\t\tdst[ dstOffset ] = x0;\n\t\tdst[ dstOffset + 1 ] = y0;\n\t\tdst[ dstOffset + 2 ] = z0;\n\t\tdst[ dstOffset + 3 ] = w0;\n\n\t}\n\n} );\n\nObject.defineProperties( Quaternion.prototype, {\n\n\tx: {\n\n\t\tget: function () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t}\n\n\t},\n\n\ty: {\n\n\t\tget: function () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t}\n\n\t},\n\n\tz: {\n\n\t\tget: function () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t}\n\n\t},\n\n\tw: {\n\n\t\tget: function () {\n\n\t\t\treturn this._w;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._w = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t}\n\n\t}\n\n} );\n\nObject.assign( Quaternion.prototype, {\n\n\tset: function ( x, y, z, w ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t},\n\n\tcopy: function ( quaternion ) {\n\n\t\tthis._x = quaternion.x;\n\t\tthis._y = quaternion.y;\n\t\tthis._z = quaternion.z;\n\t\tthis._w = quaternion.w;\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tsetFromEuler: function ( euler, update ) {\n\n\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\tthrow new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t}\n\n\t\tvar x = euler._x, y = euler._y, z = euler._z, order = euler.order;\n\n\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t//\tcontent/SpinCalc.m\n\n\t\tvar cos = Math.cos;\n\t\tvar sin = Math.sin;\n\n\t\tvar c1 = cos( x / 2 );\n\t\tvar c2 = cos( y / 2 );\n\t\tvar c3 = cos( z / 2 );\n\n\t\tvar s1 = sin( x / 2 );\n\t\tvar s2 = sin( y / 2 );\n\t\tvar s3 = sin( z / 2 );\n\n\t\tif ( order === 'XYZ' ) {\n\n\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t} else if ( order === 'YXZ' ) {\n\n\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t} else if ( order === 'ZXY' ) {\n\n\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t} else if ( order === 'ZYX' ) {\n\n\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t} else if ( order === 'YZX' ) {\n\n\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t} else if ( order === 'XZY' ) {\n\n\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t}\n\n\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tsetFromAxisAngle: function ( axis, angle ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t// assumes axis is normalized\n\n\t\tvar halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\tthis._x = axis.x * s;\n\t\tthis._y = axis.y * s;\n\t\tthis._z = axis.z * s;\n\t\tthis._w = Math.cos( halfAngle );\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tsetFromRotationMatrix: function ( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tvar te = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\ttrace = m11 + m22 + m33,\n\t\t\ts;\n\n\t\tif ( trace > 0 ) {\n\n\t\t\ts = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\tthis._w = 0.25 / s;\n\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\ts = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\tthis._x = 0.25 * s;\n\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t} else if ( m22 > m33 ) {\n\n\t\t\ts = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\tthis._y = 0.25 * s;\n\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t} else {\n\n\t\t\ts = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\tthis._z = 0.25 * s;\n\n\t\t}\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tsetFromUnitVectors: function () {\n\n\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\tvar v1 = new Vector3();\n\t\tvar r;\n\n\t\tvar EPS = 0.000001;\n\n\t\treturn function setFromUnitVectors( vFrom, vTo ) {\n\n\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\tr = vFrom.dot( vTo ) + 1;\n\n\t\t\tif ( r < EPS ) {\n\n\t\t\t\tr = 0;\n\n\t\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\t\tv1.set( - vFrom.y, vFrom.x, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tv1.set( 0, - vFrom.z, vFrom.y );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tv1.crossVectors( vFrom, vTo );\n\n\t\t\t}\n\n\t\t\tthis._x = v1.x;\n\t\t\tthis._y = v1.y;\n\t\t\tthis._z = v1.z;\n\t\t\tthis._w = r;\n\n\t\t\treturn this.normalize();\n\n\t\t};\n\n\t}(),\n\n\tinverse: function () {\n\n\t\t// quaternion is assumed to have unit length\n\n\t\treturn this.conjugate();\n\n\t},\n\n\tconjugate: function () {\n\n\t\tthis._x *= - 1;\n\t\tthis._y *= - 1;\n\t\tthis._z *= - 1;\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tdot: function ( v ) {\n\n\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t},\n\n\tlengthSq: function () {\n\n\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t},\n\n\tlength: function () {\n\n\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t},\n\n\tnormalize: function () {\n\n\t\tvar l = this.length();\n\n\t\tif ( l === 0 ) {\n\n\t\t\tthis._x = 0;\n\t\t\tthis._y = 0;\n\t\t\tthis._z = 0;\n\t\t\tthis._w = 1;\n\n\t\t} else {\n\n\t\t\tl = 1 / l;\n\n\t\t\tthis._x = this._x * l;\n\t\t\tthis._y = this._y * l;\n\t\t\tthis._z = this._z * l;\n\t\t\tthis._w = this._w * l;\n\n\t\t}\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tmultiply: function ( q, p ) {\n\n\t\tif ( p !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );\n\t\t\treturn this.multiplyQuaternions( q, p );\n\n\t\t}\n\n\t\treturn this.multiplyQuaternions( this, q );\n\n\t},\n\n\tpremultiply: function ( q ) {\n\n\t\treturn this.multiplyQuaternions( q, this );\n\n\t},\n\n\tmultiplyQuaternions: function ( a, b ) {\n\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\tvar qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\tvar qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tslerp: function ( qb, t ) {\n\n\t\tif ( t === 0 ) return this;\n\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\tvar x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\tvar cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\tthis._w = - qb._w;\n\t\t\tthis._x = - qb._x;\n\t\t\tthis._y = - qb._y;\n\t\t\tthis._z = - qb._z;\n\n\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t} else {\n\n\t\t\tthis.copy( qb );\n\n\t\t}\n\n\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\tthis._w = w;\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tvar sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );\n\n\t\tif ( Math.abs( sinHalfTheta ) < 0.001 ) {\n\n\t\t\tthis._w = 0.5 * ( w + this._w );\n\t\t\tthis._x = 0.5 * ( x + this._x );\n\t\t\tthis._y = 0.5 * ( y + this._y );\n\t\t\tthis._z = 0.5 * ( z + this._z );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tvar halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\tvar ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( quaternion ) {\n\n\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t},\n\n\tfromArray: function ( array, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tthis._x = array[ offset ];\n\t\tthis._y = array[ offset + 1 ];\n\t\tthis._z = array[ offset + 2 ];\n\t\tthis._w = array[ offset + 3 ];\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._w;\n\n\t\treturn array;\n\n\t},\n\n\tonChange: function ( callback ) {\n\n\t\tthis.onChangeCallback = callback;\n\n\t\treturn this;\n\n\t},\n\n\tonChangeCallback: function () {}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author kile / http://kile.stravaganza.org/\n * @author philogb / http://blog.thejit.org/\n * @author mikael emtinger / http://gomo.se/\n * @author egraether / http://egraether.com/\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction Vector3( x, y, z ) {\n\n\tthis.x = x || 0;\n\tthis.y = y || 0;\n\tthis.z = z || 0;\n\n}\n\nObject.assign( Vector3.prototype, {\n\n\tisVector3: true,\n\n\tset: function ( x, y, z ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t},\n\n\tsetScalar: function ( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\n\t\treturn this;\n\n\t},\n\n\tsetX: function ( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t},\n\n\tsetY: function ( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetZ: function ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t},\n\n\tsetComponent: function ( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetComponent: function ( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t},\n\n\tcopy: function ( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\n\t\treturn this;\n\n\t},\n\n\tadd: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\n\t\treturn this;\n\n\t},\n\n\taddScalar: function ( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\n\t\treturn this;\n\n\t},\n\n\taddVectors: function ( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\n\t\treturn this;\n\n\t},\n\n\taddScaledVector: function ( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\n\t\treturn this;\n\n\t},\n\n\tsub: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\n\t\treturn this;\n\n\t},\n\n\tsubScalar: function ( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\n\t\treturn this;\n\n\t},\n\n\tsubVectors: function ( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\n\t\treturn this;\n\n\t},\n\n\tmultiply: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );\n\t\t\treturn this.multiplyVectors( v, w );\n\n\t\t}\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\n\t\treturn this;\n\n\t},\n\n\tmultiplyScalar: function ( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\n\t\treturn this;\n\n\t},\n\n\tmultiplyVectors: function ( a, b ) {\n\n\t\tthis.x = a.x * b.x;\n\t\tthis.y = a.y * b.y;\n\t\tthis.z = a.z * b.z;\n\n\t\treturn this;\n\n\t},\n\n\tapplyEuler: function () {\n\n\t\tvar quaternion = new Quaternion();\n\n\t\treturn function applyEuler( euler ) {\n\n\t\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\t\tconsole.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\treturn this.applyQuaternion( quaternion.setFromEuler( euler ) );\n\n\t\t};\n\n\t}(),\n\n\tapplyAxisAngle: function () {\n\n\t\tvar quaternion = new Quaternion();\n\n\t\treturn function applyAxisAngle( axis, angle ) {\n\n\t\t\treturn this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) );\n\n\t\t};\n\n\t}(),\n\n\tapplyMatrix3: function ( m ) {\n\n\t\tvar x = this.x, y = this.y, z = this.z;\n\t\tvar e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\treturn this;\n\n\t},\n\n\tapplyMatrix4: function ( m ) {\n\n\t\tvar x = this.x, y = this.y, z = this.z;\n\t\tvar e = m.elements;\n\n\t\tvar w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );\n\n\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;\n\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;\n\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;\n\n\t\treturn this;\n\n\t},\n\n\tapplyQuaternion: function ( q ) {\n\n\t\tvar x = this.x, y = this.y, z = this.z;\n\t\tvar qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t// calculate quat * vector\n\n\t\tvar ix = qw * x + qy * z - qz * y;\n\t\tvar iy = qw * y + qz * x - qx * z;\n\t\tvar iz = qw * z + qx * y - qy * x;\n\t\tvar iw = - qx * x - qy * y - qz * z;\n\n\t\t// calculate result * inverse quat\n\n\t\tthis.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n\t\tthis.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n\t\tthis.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n\t\treturn this;\n\n\t},\n\n\tproject: function () {\n\n\t\tvar matrix = new Matrix4();\n\n\t\treturn function project( camera ) {\n\n\t\t\tmatrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) );\n\t\t\treturn this.applyMatrix4( matrix );\n\n\t\t};\n\n\t}(),\n\n\tunproject: function () {\n\n\t\tvar matrix = new Matrix4();\n\n\t\treturn function unproject( camera ) {\n\n\t\t\tmatrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) );\n\t\t\treturn this.applyMatrix4( matrix );\n\n\t\t};\n\n\t}(),\n\n\ttransformDirection: function ( m ) {\n\n\t\t// input: THREE.Matrix4 affine matrix\n\t\t// vector interpreted as a direction\n\n\t\tvar x = this.x, y = this.y, z = this.z;\n\t\tvar e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\treturn this.normalize();\n\n\t},\n\n\tdivide: function ( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\n\t\treturn this;\n\n\t},\n\n\tdivideScalar: function ( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t},\n\n\tmin: function ( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\n\t\treturn this;\n\n\t},\n\n\tmax: function ( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\n\t\treturn this;\n\n\t},\n\n\tclamp: function ( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\treturn this;\n\n\t},\n\n\tclampScalar: function () {\n\n\t\tvar min = new Vector3();\n\t\tvar max = new Vector3();\n\n\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\tmin.set( minVal, minVal, minVal );\n\t\t\tmax.set( maxVal, maxVal, maxVal );\n\n\t\t\treturn this.clamp( min, max );\n\n\t\t};\n\n\t}(),\n\n\tclampLength: function ( min, max ) {\n\n\t\tvar length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t},\n\n\tfloor: function () {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\n\t\treturn this;\n\n\t},\n\n\tceil: function () {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\n\t\treturn this;\n\n\t},\n\n\tround: function () {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\n\t\treturn this;\n\n\t},\n\n\troundToZero: function () {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\n\t\treturn this;\n\n\t},\n\n\tnegate: function () {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\n\t\treturn this;\n\n\t},\n\n\tdot: function ( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t},\n\n\t// TODO lengthSquared?\n\n\tlengthSq: function () {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t},\n\n\tlength: function () {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t},\n\n\tmanhattanLength: function () {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t},\n\n\tnormalize: function () {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t},\n\n\tsetLength: function ( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t},\n\n\tlerp: function ( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\treturn this;\n\n\t},\n\n\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t},\n\n\tcross: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );\n\t\t\treturn this.crossVectors( v, w );\n\n\t\t}\n\n\t\treturn this.crossVectors( this, v );\n\n\t},\n\n\tcrossVectors: function ( a, b ) {\n\n\t\tvar ax = a.x, ay = a.y, az = a.z;\n\t\tvar bx = b.x, by = b.y, bz = b.z;\n\n\t\tthis.x = ay * bz - az * by;\n\t\tthis.y = az * bx - ax * bz;\n\t\tthis.z = ax * by - ay * bx;\n\n\t\treturn this;\n\n\t},\n\n\tprojectOnVector: function ( vector ) {\n\n\t\tvar scalar = vector.dot( this ) / vector.lengthSq();\n\n\t\treturn this.copy( vector ).multiplyScalar( scalar );\n\n\t},\n\n\tprojectOnPlane: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function projectOnPlane( planeNormal ) {\n\n\t\t\tv1.copy( this ).projectOnVector( planeNormal );\n\n\t\t\treturn this.sub( v1 );\n\n\t\t};\n\n\t}(),\n\n\treflect: function () {\n\n\t\t// reflect incident vector off plane orthogonal to normal\n\t\t// normal is assumed to have unit length\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function reflect( normal ) {\n\n\t\t\treturn this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t\t};\n\n\t}(),\n\n\tangleTo: function ( v ) {\n\n\t\tvar theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) );\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( _Math.clamp( theta, - 1, 1 ) );\n\n\t},\n\n\tdistanceTo: function ( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t},\n\n\tdistanceToSquared: function ( v ) {\n\n\t\tvar dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t},\n\n\tmanhattanDistanceTo: function ( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t},\n\n\tsetFromSpherical: function ( s ) {\n\n\t\tvar sinPhiRadius = Math.sin( s.phi ) * s.radius;\n\n\t\tthis.x = sinPhiRadius * Math.sin( s.theta );\n\t\tthis.y = Math.cos( s.phi ) * s.radius;\n\t\tthis.z = sinPhiRadius * Math.cos( s.theta );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromCylindrical: function ( c ) {\n\n\t\tthis.x = c.radius * Math.sin( c.theta );\n\t\tthis.y = c.y;\n\t\tthis.z = c.radius * Math.cos( c.theta );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromMatrixPosition: function ( m ) {\n\n\t\tvar e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\n\t\treturn this;\n\n\t},\n\n\tsetFromMatrixScale: function ( m ) {\n\n\t\tvar sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\tvar sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\tvar sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\tthis.x = sx;\n\t\tthis.y = sy;\n\t\tthis.z = sz;\n\n\t\treturn this;\n\n\t},\n\n\tsetFromMatrixColumn: function ( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t},\n\n\tequals: function ( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t},\n\n\tfromArray: function ( array, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\n\t\treturn array;\n\n\t},\n\n\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author WestLangley / http://github.com/WestLangley\n * @author bhouston / http://clara.io\n * @author tschw\n */\n\nfunction Matrix3() {\n\n\tthis.elements = [\n\n\t\t1, 0, 0,\n\t\t0, 1, 0,\n\t\t0, 0, 1\n\n\t];\n\n\tif ( arguments.length > 0 ) {\n\n\t\tconsole.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );\n\n\t}\n\n}\n\nObject.assign( Matrix3.prototype, {\n\n\tisMatrix3: true,\n\n\tset: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\tvar te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\treturn this;\n\n\t},\n\n\tidentity: function () {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().fromArray( this.elements );\n\n\t},\n\n\tcopy: function ( m ) {\n\n\t\tvar te = this.elements;\n\t\tvar me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];\n\t\tte[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];\n\t\tte[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];\n\n\t\treturn this;\n\n\t},\n\n\tsetFromMatrix4: function ( m ) {\n\n\t\tvar me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tapplyToBufferAttribute: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function applyToBufferAttribute( attribute ) {\n\n\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\tv1.x = attribute.getX( i );\n\t\t\t\tv1.y = attribute.getY( i );\n\t\t\t\tv1.z = attribute.getZ( i );\n\n\t\t\t\tv1.applyMatrix3( this );\n\n\t\t\t\tattribute.setXYZ( i, v1.x, v1.y, v1.z );\n\n\t\t\t}\n\n\t\t\treturn attribute;\n\n\t\t};\n\n\t}(),\n\n\tmultiply: function ( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t},\n\n\tpremultiply: function ( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t},\n\n\tmultiplyMatrices: function ( a, b ) {\n\n\t\tvar ae = a.elements;\n\t\tvar be = b.elements;\n\t\tvar te = this.elements;\n\n\t\tvar a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];\n\t\tvar a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];\n\t\tvar a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];\n\n\t\tvar b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];\n\t\tvar b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];\n\t\tvar b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;\n\t\tte[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;\n\t\tte[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;\n\t\tte[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;\n\t\tte[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;\n\t\tte[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;\n\t\tte[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;\n\n\t\treturn this;\n\n\t},\n\n\tmultiplyScalar: function ( s ) {\n\n\t\tvar te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\treturn this;\n\n\t},\n\n\tdeterminant: function () {\n\n\t\tvar te = this.elements;\n\n\t\tvar a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t},\n\n\tgetInverse: function ( matrix, throwOnDegenerate ) {\n\n\t\tif ( matrix && matrix.isMatrix4 ) {\n\n\t\t\tconsole.error( \"THREE.Matrix3: .getInverse() no longer takes a Matrix4 argument.\" );\n\n\t\t}\n\n\t\tvar me = matrix.elements,\n\t\t\tte = this.elements,\n\n\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ],\n\t\t\tn12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ],\n\t\t\tn13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ],\n\n\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\tif ( det === 0 ) {\n\n\t\t\tvar msg = \"THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0\";\n\n\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\tthrow new Error( msg );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( msg );\n\n\t\t\t}\n\n\t\t\treturn this.identity();\n\n\t\t}\n\n\t\tvar detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\tte[ 3 ] = t12 * detInv;\n\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\tte[ 6 ] = t13 * detInv;\n\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\treturn this;\n\n\t},\n\n\ttranspose: function () {\n\n\t\tvar tmp, m = this.elements;\n\n\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\treturn this;\n\n\t},\n\n\tgetNormalMatrix: function ( matrix4 ) {\n\n\t\treturn this.setFromMatrix4( matrix4 ).getInverse( this ).transpose();\n\n\t},\n\n\ttransposeIntoArray: function ( r ) {\n\n\t\tvar m = this.elements;\n\n\t\tr[ 0 ] = m[ 0 ];\n\t\tr[ 1 ] = m[ 3 ];\n\t\tr[ 2 ] = m[ 6 ];\n\t\tr[ 3 ] = m[ 1 ];\n\t\tr[ 4 ] = m[ 4 ];\n\t\tr[ 5 ] = m[ 7 ];\n\t\tr[ 6 ] = m[ 2 ];\n\t\tr[ 7 ] = m[ 5 ];\n\t\tr[ 8 ] = m[ 8 ];\n\n\t\treturn this;\n\n\t},\n\n\tsetUvTransform: function ( tx, ty, sx, sy, rotation, cx, cy ) {\n\n\t\tvar c = Math.cos( rotation );\n\t\tvar s = Math.sin( rotation );\n\n\t\tthis.set(\n\t\t\tsx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx,\n\t\t\t- sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty,\n\t\t\t0, 0, 1\n\t\t);\n\n\t},\n\n\tscale: function ( sx, sy ) {\n\n\t\tvar te = this.elements;\n\n\t\tte[ 0 ] *= sx; te[ 3 ] *= sx; te[ 6 ] *= sx;\n\t\tte[ 1 ] *= sy; te[ 4 ] *= sy; te[ 7 ] *= sy;\n\n\t\treturn this;\n\n\t},\n\n\trotate: function ( theta ) {\n\n\t\tvar c = Math.cos( theta );\n\t\tvar s = Math.sin( theta );\n\n\t\tvar te = this.elements;\n\n\t\tvar a11 = te[ 0 ], a12 = te[ 3 ], a13 = te[ 6 ];\n\t\tvar a21 = te[ 1 ], a22 = te[ 4 ], a23 = te[ 7 ];\n\n\t\tte[ 0 ] = c * a11 + s * a21;\n\t\tte[ 3 ] = c * a12 + s * a22;\n\t\tte[ 6 ] = c * a13 + s * a23;\n\n\t\tte[ 1 ] = - s * a11 + c * a21;\n\t\tte[ 4 ] = - s * a12 + c * a22;\n\t\tte[ 7 ] = - s * a13 + c * a23;\n\n\t\treturn this;\n\n\t},\n\n\ttranslate: function ( tx, ty ) {\n\n\t\tvar te = this.elements;\n\n\t\tte[ 0 ] += tx * te[ 2 ]; te[ 3 ] += tx * te[ 5 ]; te[ 6 ] += tx * te[ 8 ];\n\t\tte[ 1 ] += ty * te[ 2 ]; te[ 4 ] += ty * te[ 5 ]; te[ 7 ] += ty * te[ 8 ];\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( matrix ) {\n\n\t\tvar te = this.elements;\n\t\tvar me = matrix.elements;\n\n\t\tfor ( var i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t},\n\n\tfromArray: function ( array, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tfor ( var i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tvar te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\treturn array;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n * @author szimek / https://github.com/szimek/\n */\n\nvar textureId = 0;\n\nfunction Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\tObject.defineProperty( this, 'id', { value: textureId ++ } );\n\n\tthis.uuid = _Math.generateUUID();\n\n\tthis.name = '';\n\n\tthis.image = image !== undefined ? image : Texture.DEFAULT_IMAGE;\n\tthis.mipmaps = [];\n\n\tthis.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING;\n\n\tthis.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping;\n\tthis.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping;\n\n\tthis.magFilter = magFilter !== undefined ? magFilter : LinearFilter;\n\tthis.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter;\n\n\tthis.anisotropy = anisotropy !== undefined ? anisotropy : 1;\n\n\tthis.format = format !== undefined ? format : RGBAFormat;\n\tthis.type = type !== undefined ? type : UnsignedByteType;\n\n\tthis.offset = new Vector2( 0, 0 );\n\tthis.repeat = new Vector2( 1, 1 );\n\tthis.center = new Vector2( 0, 0 );\n\tthis.rotation = 0;\n\n\tthis.matrixAutoUpdate = true;\n\tthis.matrix = new Matrix3();\n\n\tthis.generateMipmaps = true;\n\tthis.premultiplyAlpha = false;\n\tthis.flipY = true;\n\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\t// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.\n\t//\n\t// Also changing the encoding after already used by a Material will not automatically make the Material\n\t// update. You need to explicitly call Material.needsUpdate to trigger it to recompile.\n\tthis.encoding = encoding !== undefined ? encoding : LinearEncoding;\n\n\tthis.version = 0;\n\tthis.onUpdate = null;\n\n}\n\nTexture.DEFAULT_IMAGE = undefined;\nTexture.DEFAULT_MAPPING = UVMapping;\n\nTexture.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: Texture,\n\n\tisTexture: true,\n\n\tupdateMatrix: function () {\n\n\t\tthis.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y );\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.image = source.image;\n\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\tthis.mapping = source.mapping;\n\n\t\tthis.wrapS = source.wrapS;\n\t\tthis.wrapT = source.wrapT;\n\n\t\tthis.magFilter = source.magFilter;\n\t\tthis.minFilter = source.minFilter;\n\n\t\tthis.anisotropy = source.anisotropy;\n\n\t\tthis.format = source.format;\n\t\tthis.type = source.type;\n\n\t\tthis.offset.copy( source.offset );\n\t\tthis.repeat.copy( source.repeat );\n\t\tthis.center.copy( source.center );\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrix.copy( source.matrix );\n\n\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\tthis.flipY = source.flipY;\n\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\tthis.encoding = source.encoding;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tvar isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t}\n\n\t\tfunction getDataURL( image ) {\n\n\t\t\tvar canvas;\n\n\t\t\tif ( image instanceof HTMLCanvasElement ) {\n\n\t\t\t\tcanvas = image;\n\n\t\t\t} else {\n\n\t\t\t\tcanvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = image.width;\n\t\t\t\tcanvas.height = image.height;\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\n\t\t\t\tif ( image instanceof ImageData ) {\n\n\t\t\t\t\tcontext.putImageData( image, 0, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( canvas.width > 2048 || canvas.height > 2048 ) {\n\n\t\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\n\n\t\t\t} else {\n\n\t\t\t\treturn canvas.toDataURL( 'image/png' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar output = {\n\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Texture',\n\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t},\n\n\t\t\tuuid: this.uuid,\n\t\t\tname: this.name,\n\n\t\t\tmapping: this.mapping,\n\n\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\tcenter: [ this.center.x, this.center.y ],\n\t\t\trotation: this.rotation,\n\n\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\tformat: this.format,\n\t\t\tminFilter: this.minFilter,\n\t\t\tmagFilter: this.magFilter,\n\t\t\tanisotropy: this.anisotropy,\n\n\t\t\tflipY: this.flipY\n\n\t\t};\n\n\t\tif ( this.image !== undefined ) {\n\n\t\t\t// TODO: Move to THREE.Image\n\n\t\t\tvar image = this.image;\n\n\t\t\tif ( image.uuid === undefined ) {\n\n\t\t\t\timage.uuid = _Math.generateUUID(); // UGH\n\n\t\t\t}\n\n\t\t\tif ( ! isRootObject && meta.images[ image.uuid ] === undefined ) {\n\n\t\t\t\tmeta.images[ image.uuid ] = {\n\t\t\t\t\tuuid: image.uuid,\n\t\t\t\t\turl: getDataURL( image )\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\toutput.image = image.uuid;\n\n\t\t}\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t},\n\n\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t},\n\n\ttransformUv: function ( uv ) {\n\n\t\tif ( this.mapping !== UVMapping ) return;\n\n\t\tuv.applyMatrix3( this.matrix );\n\n\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.flipY ) {\n\n\t\t\tuv.y = 1 - uv.y;\n\n\t\t}\n\n\t}\n\n} );\n\nObject.defineProperty( Texture.prototype, \"needsUpdate\", {\n\n\tset: function ( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n} );\n\n/**\n * @author supereggbert / http://www.paulbrunt.co.uk/\n * @author philogb / http://blog.thejit.org/\n * @author mikael emtinger / http://gomo.se/\n * @author egraether / http://egraether.com/\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction Vector4( x, y, z, w ) {\n\n\tthis.x = x || 0;\n\tthis.y = y || 0;\n\tthis.z = z || 0;\n\tthis.w = ( w !== undefined ) ? w : 1;\n\n}\n\nObject.assign( Vector4.prototype, {\n\n\tisVector4: true,\n\n\tset: function ( x, y, z, w ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t},\n\n\tsetScalar: function ( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\t\tthis.w = scalar;\n\n\t\treturn this;\n\n\t},\n\n\tsetX: function ( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t},\n\n\tsetY: function ( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetZ: function ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t},\n\n\tsetW: function ( w ) {\n\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t},\n\n\tsetComponent: function ( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tcase 3: this.w = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetComponent: function ( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tcase 3: return this.w;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t},\n\n\tcopy: function ( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\treturn this;\n\n\t},\n\n\tadd: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\t\tthis.w += v.w;\n\n\t\treturn this;\n\n\t},\n\n\taddScalar: function ( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\t\tthis.w += s;\n\n\t\treturn this;\n\n\t},\n\n\taddVectors: function ( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\t\tthis.w = a.w + b.w;\n\n\t\treturn this;\n\n\t},\n\n\taddScaledVector: function ( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\t\tthis.w += v.w * s;\n\n\t\treturn this;\n\n\t},\n\n\tsub: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\t\tthis.w -= v.w;\n\n\t\treturn this;\n\n\t},\n\n\tsubScalar: function ( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\t\tthis.w -= s;\n\n\t\treturn this;\n\n\t},\n\n\tsubVectors: function ( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\t\tthis.w = a.w - b.w;\n\n\t\treturn this;\n\n\t},\n\n\tmultiplyScalar: function ( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\t\tthis.w *= scalar;\n\n\t\treturn this;\n\n\t},\n\n\tapplyMatrix4: function ( m ) {\n\n\t\tvar x = this.x, y = this.y, z = this.z, w = this.w;\n\t\tvar e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\treturn this;\n\n\t},\n\n\tdivideScalar: function ( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t},\n\n\tsetAxisAngleFromQuaternion: function ( q ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t// q is assumed to be normalized\n\n\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\tvar s = Math.sqrt( 1 - q.w * q.w );\n\n\t\tif ( s < 0.0001 ) {\n\n\t\t\tthis.x = 1;\n\t\t\tthis.y = 0;\n\t\t\tthis.z = 0;\n\n\t\t} else {\n\n\t\t\tthis.x = q.x / s;\n\t\t\tthis.y = q.y / s;\n\t\t\tthis.z = q.z / s;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetAxisAngleFromRotationMatrix: function ( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tvar angle, x, y, z,\t\t// variables for result\n\t\t\tepsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\tte = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t// singularity found\n\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t}\n\n\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\tangle = Math.PI;\n\n\t\t\tvar xx = ( m11 + 1 ) / 2;\n\t\t\tvar yy = ( m22 + 1 ) / 2;\n\t\t\tvar zz = ( m33 + 1 ) / 2;\n\t\t\tvar xy = ( m12 + m21 ) / 4;\n\t\t\tvar xz = ( m13 + m31 ) / 4;\n\t\t\tvar yz = ( m23 + m32 ) / 4;\n\n\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\tx = 0;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\ty = xy / x;\n\t\t\t\t\tz = xz / x;\n\n\t\t\t\t}\n\n\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\tx = xy / y;\n\t\t\t\t\tz = yz / y;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\tx = xz / z;\n\t\t\t\t\ty = yz / z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.set( x, y, z, angle );\n\n\t\t\treturn this; // return 180 deg rotation\n\n\t\t}\n\n\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\tvar s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t ( m13 - m31 ) * ( m13 - m31 ) +\n\t\t ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\tthis.x = ( m32 - m23 ) / s;\n\t\tthis.y = ( m13 - m31 ) / s;\n\t\tthis.z = ( m21 - m12 ) / s;\n\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\treturn this;\n\n\t},\n\n\tmin: function ( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\t\tthis.w = Math.min( this.w, v.w );\n\n\t\treturn this;\n\n\t},\n\n\tmax: function ( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\t\tthis.w = Math.max( this.w, v.w );\n\n\t\treturn this;\n\n\t},\n\n\tclamp: function ( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\t\tthis.w = Math.max( min.w, Math.min( max.w, this.w ) );\n\n\t\treturn this;\n\n\t},\n\n\tclampScalar: function () {\n\n\t\tvar min, max;\n\n\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\tif ( min === undefined ) {\n\n\t\t\t\tmin = new Vector4();\n\t\t\t\tmax = new Vector4();\n\n\t\t\t}\n\n\t\t\tmin.set( minVal, minVal, minVal, minVal );\n\t\t\tmax.set( maxVal, maxVal, maxVal, maxVal );\n\n\t\t\treturn this.clamp( min, max );\n\n\t\t};\n\n\t}(),\n\n\tclampLength: function ( min, max ) {\n\n\t\tvar length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t},\n\n\tfloor: function () {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\t\tthis.w = Math.floor( this.w );\n\n\t\treturn this;\n\n\t},\n\n\tceil: function () {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\t\tthis.w = Math.ceil( this.w );\n\n\t\treturn this;\n\n\t},\n\n\tround: function () {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\t\tthis.w = Math.round( this.w );\n\n\t\treturn this;\n\n\t},\n\n\troundToZero: function () {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\t\tthis.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );\n\n\t\treturn this;\n\n\t},\n\n\tnegate: function () {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\t\tthis.w = - this.w;\n\n\t\treturn this;\n\n\t},\n\n\tdot: function ( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t},\n\n\tlengthSq: function () {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t},\n\n\tlength: function () {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t},\n\n\tmanhattanLength: function () {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t},\n\n\tnormalize: function () {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t},\n\n\tsetLength: function ( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t},\n\n\tlerp: function ( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\treturn this;\n\n\t},\n\n\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t},\n\n\tequals: function ( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t},\n\n\tfromArray: function ( array, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\t\tthis.w = array[ offset + 3 ];\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\t\tarray[ offset + 3 ] = this.w;\n\n\t\treturn array;\n\n\t},\n\n\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\t\tthis.w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author szimek / https://github.com/szimek/\n * @author alteredq / http://alteredqualia.com/\n * @author Marius Kintel / https://github.com/kintel\n */\n\n/*\n In options, we can specify:\n * Texture parameters for an auto-generated target texture\n * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\n*/\nfunction WebGLRenderTarget( width, height, options ) {\n\n\tthis.width = width;\n\tthis.height = height;\n\n\tthis.scissor = new Vector4( 0, 0, width, height );\n\tthis.scissorTest = false;\n\n\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\toptions = options || {};\n\n\tif ( options.minFilter === undefined ) options.minFilter = LinearFilter;\n\n\tthis.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\n\tthis.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;\n\tthis.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true;\n\tthis.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;\n\n}\n\nWebGLRenderTarget.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: WebGLRenderTarget,\n\n\tisWebGLRenderTarget: true,\n\n\tsetSize: function ( width, height ) {\n\n\t\tif ( this.width !== width || this.height !== height ) {\n\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t\tthis.viewport.set( 0, 0, width, height );\n\t\tthis.scissor.set( 0, 0, width, height );\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\n\t\tthis.viewport.copy( source.viewport );\n\n\t\tthis.texture = source.texture.clone();\n\n\t\tthis.depthBuffer = source.depthBuffer;\n\t\tthis.stencilBuffer = source.stencilBuffer;\n\t\tthis.depthTexture = source.depthTexture;\n\n\t\treturn this;\n\n\t},\n\n\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n} );\n\n/**\n * @author alteredq / http://alteredqualia.com\n */\n\nfunction WebGLRenderTargetCube( width, height, options ) {\n\n\tWebGLRenderTarget.call( this, width, height, options );\n\n\tthis.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5\n\tthis.activeMipMapLevel = 0;\n\n}\n\nWebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype );\nWebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube;\n\nWebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true;\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\tthis.image = { data: data, width: width, height: height };\n\n\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\tthis.generateMipmaps = false;\n\tthis.flipY = false;\n\tthis.unpackAlignment = 1;\n\n}\n\nDataTexture.prototype = Object.create( Texture.prototype );\nDataTexture.prototype.constructor = DataTexture;\n\nDataTexture.prototype.isDataTexture = true;\n\n/**\n * @author bhouston / http://clara.io\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction Box3( min, max ) {\n\n\tthis.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity );\n\tthis.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity );\n\n}\n\nObject.assign( Box3.prototype, {\n\n\tisBox3: true,\n\n\tset: function ( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromArray: function ( array ) {\n\n\t\tvar minX = + Infinity;\n\t\tvar minY = + Infinity;\n\t\tvar minZ = + Infinity;\n\n\t\tvar maxX = - Infinity;\n\t\tvar maxY = - Infinity;\n\t\tvar maxZ = - Infinity;\n\n\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\tvar x = array[ i ];\n\t\t\tvar y = array[ i + 1 ];\n\t\t\tvar z = array[ i + 2 ];\n\n\t\t\tif ( x < minX ) minX = x;\n\t\t\tif ( y < minY ) minY = y;\n\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\tif ( x > maxX ) maxX = x;\n\t\t\tif ( y > maxY ) maxY = y;\n\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t}\n\n\t\tthis.min.set( minX, minY, minZ );\n\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromBufferAttribute: function ( attribute ) {\n\n\t\tvar minX = + Infinity;\n\t\tvar minY = + Infinity;\n\t\tvar minZ = + Infinity;\n\n\t\tvar maxX = - Infinity;\n\t\tvar maxY = - Infinity;\n\t\tvar maxZ = - Infinity;\n\n\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\tvar x = attribute.getX( i );\n\t\t\tvar y = attribute.getY( i );\n\t\t\tvar z = attribute.getZ( i );\n\n\t\t\tif ( x < minX ) minX = x;\n\t\t\tif ( y < minY ) minY = y;\n\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\tif ( x > maxX ) maxX = x;\n\t\t\tif ( y > maxY ) maxY = y;\n\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t}\n\n\t\tthis.min.set( minX, minY, minZ );\n\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromPoints: function ( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetFromCenterAndSize: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\n\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tsetFromObject: function ( object ) {\n\n\t\tthis.makeEmpty();\n\n\t\treturn this.expandByObject( object );\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t},\n\n\tmakeEmpty: function () {\n\n\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\treturn this;\n\n\t},\n\n\tisEmpty: function () {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t},\n\n\tgetCenter: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .getCenter() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t},\n\n\tgetSize: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .getSize() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t},\n\n\texpandByPoint: function ( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t},\n\n\texpandByVector: function ( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t},\n\n\texpandByScalar: function ( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t},\n\n\texpandByObject: function () {\n\n\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t// accounting for both the object's, and children's, world transforms\n\n\t\tvar scope, i, l;\n\n\t\tvar v1 = new Vector3();\n\n\t\tfunction traverse( node ) {\n\n\t\t\tvar geometry = node.geometry;\n\n\t\t\tif ( geometry !== undefined ) {\n\n\t\t\t\tif ( geometry.isGeometry ) {\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\n\t\t\t\t\tfor ( i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tv1.copy( vertices[ i ] );\n\t\t\t\t\t\tv1.applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\tscope.expandByPoint( v1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tvar attribute = geometry.attributes.position;\n\n\t\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\t\tfor ( i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tv1.fromBufferAttribute( attribute, i ).applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\tscope.expandByPoint( v1 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn function expandByObject( object ) {\n\n\t\t\tscope = this;\n\n\t\t\tobject.updateMatrixWorld( true );\n\n\t\t\tobject.traverse( traverse );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tcontainsPoint: function ( point ) {\n\n\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\tpoint.y < this.min.y || point.y > this.max.y ||\n\t\t\tpoint.z < this.min.z || point.z > this.max.z ? false : true;\n\n\t},\n\n\tcontainsBox: function ( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t},\n\n\tgetParameter: function ( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .getParameter() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t);\n\n\t},\n\n\tintersectsBox: function ( box ) {\n\n\t\t// using 6 splitting planes to rule out intersections.\n\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ||\n\t\t\tbox.max.z < this.min.z || box.min.z > this.max.z ? false : true;\n\n\t},\n\n\tintersectsSphere: ( function () {\n\n\t\tvar closestPoint = new Vector3();\n\n\t\treturn function intersectsSphere( sphere ) {\n\n\t\t\t// Find the point on the AABB closest to the sphere center.\n\t\t\tthis.clampPoint( sphere.center, closestPoint );\n\n\t\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\t\treturn closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t\t};\n\n\t} )(),\n\n\tintersectsPlane: function ( plane ) {\n\n\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\tvar min, max;\n\n\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t} else {\n\n\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t}\n\n\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t}\n\n\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t}\n\n\t\treturn ( min <= plane.constant && max >= plane.constant );\n\n\t},\n\n\tintersectsTriangle: ( function () {\n\n\t\t// triangle centered vertices\n\t\tvar v0 = new Vector3();\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\n\t\t// triangle edge vectors\n\t\tvar f0 = new Vector3();\n\t\tvar f1 = new Vector3();\n\t\tvar f2 = new Vector3();\n\n\t\tvar testAxis = new Vector3();\n\n\t\tvar center = new Vector3();\n\t\tvar extents = new Vector3();\n\n\t\tvar triangleNormal = new Vector3();\n\n\t\tfunction satForAxes( axes ) {\n\n\t\t\tvar i, j;\n\n\t\t\tfor ( i = 0, j = axes.length - 3; i <= j; i += 3 ) {\n\n\t\t\t\ttestAxis.fromArray( axes, i );\n\t\t\t\t// project the aabb onto the seperating axis\n\t\t\t\tvar r = extents.x * Math.abs( testAxis.x ) + extents.y * Math.abs( testAxis.y ) + extents.z * Math.abs( testAxis.z );\n\t\t\t\t// project all 3 vertices of the triangle onto the seperating axis\n\t\t\t\tvar p0 = v0.dot( testAxis );\n\t\t\t\tvar p1 = v1.dot( testAxis );\n\t\t\t\tvar p2 = v2.dot( testAxis );\n\t\t\t\t// actual test, basically see if either of the most extreme of the triangle points intersects r\n\t\t\t\tif ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {\n\n\t\t\t\t\t// points of the projected triangle are outside the projected half-length of the aabb\n\t\t\t\t\t// the axis is seperating and we can exit\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn function intersectsTriangle( triangle ) {\n\n\t\t\tif ( this.isEmpty() ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\t// compute box center and extents\n\t\t\tthis.getCenter( center );\n\t\t\textents.subVectors( this.max, center );\n\n\t\t\t// translate triangle to aabb origin\n\t\t\tv0.subVectors( triangle.a, center );\n\t\t\tv1.subVectors( triangle.b, center );\n\t\t\tv2.subVectors( triangle.c, center );\n\n\t\t\t// compute edge vectors for triangle\n\t\t\tf0.subVectors( v1, v0 );\n\t\t\tf1.subVectors( v2, v1 );\n\t\t\tf2.subVectors( v0, v2 );\n\n\t\t\t// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb\n\t\t\t// 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\n\t\t\t// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)\n\t\t\tvar axes = [\n\t\t\t\t0, - f0.z, f0.y, 0, - f1.z, f1.y, 0, - f2.z, f2.y,\n\t\t\t\tf0.z, 0, - f0.x, f1.z, 0, - f1.x, f2.z, 0, - f2.x,\n\t\t\t\t- f0.y, f0.x, 0, - f1.y, f1.x, 0, - f2.y, f2.x, 0\n\t\t\t];\n\t\t\tif ( ! satForAxes( axes ) ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\t// test 3 face normals from the aabb\n\t\t\taxes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];\n\t\t\tif ( ! satForAxes( axes ) ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\t// finally testing the face normal of the triangle\n\t\t\t// use already existing triangle edge vectors here\n\t\t\ttriangleNormal.crossVectors( f0, f1 );\n\t\t\taxes = [ triangleNormal.x, triangleNormal.y, triangleNormal.z ];\n\t\t\treturn satForAxes( axes );\n\n\t\t};\n\n\t} )(),\n\n\tclampPoint: function ( point, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .clampPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t},\n\n\tdistanceToPoint: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function distanceToPoint( point ) {\n\n\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t};\n\n\t}(),\n\n\tgetBoundingSphere: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function getBoundingSphere( target ) {\n\n\t\t\tif ( target === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Box3: .getBoundingSphere() target is now required' );\n\t\t\t\ttarget = new Sphere();\n\n\t\t\t}\n\n\t\t\tthis.getCenter( target.center );\n\n\t\t\ttarget.radius = this.getSize( v1 ).length() * 0.5;\n\n\t\t\treturn target;\n\n\t\t};\n\n\t}(),\n\n\tintersect: function ( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\t// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t},\n\n\tunion: function ( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t},\n\n\tapplyMatrix4: function () {\n\n\t\tvar points = [\n\t\t\tnew Vector3(),\n\t\t\tnew Vector3(),\n\t\t\tnew Vector3(),\n\t\t\tnew Vector3(),\n\t\t\tnew Vector3(),\n\t\t\tnew Vector3(),\n\t\t\tnew Vector3(),\n\t\t\tnew Vector3()\n\t\t];\n\n\t\treturn function applyMatrix4( matrix ) {\n\n\t\t\t// transform of empty box is an empty box.\n\t\t\tif ( this.isEmpty() ) return this;\n\n\t\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t\tpoints[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t\tpoints[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t\tpoints[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t\tpoints[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t\tpoints[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t\tpoints[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t\tpoints[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t\tpoints[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix );\t// 111\n\n\t\t\tthis.setFromPoints( points );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\ttranslate: function ( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n} );\n\n/**\n * @author bhouston / http://clara.io\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction Sphere( center, radius ) {\n\n\tthis.center = ( center !== undefined ) ? center : new Vector3();\n\tthis.radius = ( radius !== undefined ) ? radius : 0;\n\n}\n\nObject.assign( Sphere.prototype, {\n\n\tset: function ( center, radius ) {\n\n\t\tthis.center.copy( center );\n\t\tthis.radius = radius;\n\n\t\treturn this;\n\n\t},\n\n\tsetFromPoints: function () {\n\n\t\tvar box = new Box3();\n\n\t\treturn function setFromPoints( points, optionalCenter ) {\n\n\t\t\tvar center = this.center;\n\n\t\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\t\tcenter.copy( optionalCenter );\n\n\t\t\t} else {\n\n\t\t\t\tbox.setFromPoints( points ).getCenter( center );\n\n\t\t\t}\n\n\t\t\tvar maxRadiusSq = 0;\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t\t}\n\n\t\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( sphere ) {\n\n\t\tthis.center.copy( sphere.center );\n\t\tthis.radius = sphere.radius;\n\n\t\treturn this;\n\n\t},\n\n\tempty: function () {\n\n\t\treturn ( this.radius <= 0 );\n\n\t},\n\n\tcontainsPoint: function ( point ) {\n\n\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t},\n\n\tdistanceToPoint: function ( point ) {\n\n\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t},\n\n\tintersectsSphere: function ( sphere ) {\n\n\t\tvar radiusSum = this.radius + sphere.radius;\n\n\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t},\n\n\tintersectsBox: function ( box ) {\n\n\t\treturn box.intersectsSphere( this );\n\n\t},\n\n\tintersectsPlane: function ( plane ) {\n\n\t\treturn Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;\n\n\t},\n\n\tclampPoint: function ( point, target ) {\n\n\t\tvar deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Sphere: .clampPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\ttarget.copy( point );\n\n\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\ttarget.sub( this.center ).normalize();\n\t\t\ttarget.multiplyScalar( this.radius ).add( this.center );\n\n\t\t}\n\n\t\treturn target;\n\n\t},\n\n\tgetBoundingBox: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Sphere: .getBoundingBox() target is now required' );\n\t\t\ttarget = new Box3();\n\n\t\t}\n\n\t\ttarget.set( this.center, this.center );\n\t\ttarget.expandByScalar( this.radius );\n\n\t\treturn target;\n\n\t},\n\n\tapplyMatrix4: function ( matrix ) {\n\n\t\tthis.center.applyMatrix4( matrix );\n\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\treturn this;\n\n\t},\n\n\ttranslate: function ( offset ) {\n\n\t\tthis.center.add( offset );\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( sphere ) {\n\n\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t}\n\n} );\n\n/**\n * @author bhouston / http://clara.io\n */\n\nfunction Plane( normal, constant ) {\n\n\t// normal is assumed to be normalized\n\n\tthis.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 );\n\tthis.constant = ( constant !== undefined ) ? constant : 0;\n\n}\n\nObject.assign( Plane.prototype, {\n\n\tset: function ( normal, constant ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = constant;\n\n\t\treturn this;\n\n\t},\n\n\tsetComponents: function ( x, y, z, w ) {\n\n\t\tthis.normal.set( x, y, z );\n\t\tthis.constant = w;\n\n\t\treturn this;\n\n\t},\n\n\tsetFromNormalAndCoplanarPoint: function ( normal, point ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = - point.dot( this.normal );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromCoplanarPoints: function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\n\t\treturn function setFromCoplanarPoints( a, b, c ) {\n\n\t\t\tvar normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize();\n\n\t\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( plane ) {\n\n\t\tthis.normal.copy( plane.normal );\n\t\tthis.constant = plane.constant;\n\n\t\treturn this;\n\n\t},\n\n\tnormalize: function () {\n\n\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\tvar inverseNormalLength = 1.0 / this.normal.length();\n\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\tthis.constant *= inverseNormalLength;\n\n\t\treturn this;\n\n\t},\n\n\tnegate: function () {\n\n\t\tthis.constant *= - 1;\n\t\tthis.normal.negate();\n\n\t\treturn this;\n\n\t},\n\n\tdistanceToPoint: function ( point ) {\n\n\t\treturn this.normal.dot( point ) + this.constant;\n\n\t},\n\n\tdistanceToSphere: function ( sphere ) {\n\n\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t},\n\n\tprojectPoint: function ( point, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Plane: .projectPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.distanceToPoint( point ) ).add( point );\n\n\t},\n\n\tintersectLine: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function intersectLine( line, target ) {\n\n\t\t\tif ( target === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Plane: .intersectLine() target is now required' );\n\t\t\t\ttarget = new Vector3();\n\n\t\t\t}\n\n\t\t\tvar direction = line.delta( v1 );\n\n\t\t\tvar denominator = this.normal.dot( direction );\n\n\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t// line is coplanar, return origin\n\t\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\t\treturn target.copy( line.start );\n\n\t\t\t\t}\n\n\t\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\n\t\t\tvar t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\n\t\t\treturn target.copy( direction ).multiplyScalar( t ).add( line.start );\n\n\t\t};\n\n\t}(),\n\n\tintersectsLine: function ( line ) {\n\n\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\tvar startSign = this.distanceToPoint( line.start );\n\t\tvar endSign = this.distanceToPoint( line.end );\n\n\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t},\n\n\tintersectsBox: function ( box ) {\n\n\t\treturn box.intersectsPlane( this );\n\n\t},\n\n\tintersectsSphere: function ( sphere ) {\n\n\t\treturn sphere.intersectsPlane( this );\n\n\t},\n\n\tcoplanarPoint: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Plane: .coplanarPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t},\n\n\tapplyMatrix4: function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar m1 = new Matrix3();\n\n\t\treturn function applyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\t\tvar normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix );\n\n\t\t\tvar referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix );\n\n\t\t\tvar normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\ttranslate: function ( offset ) {\n\n\t\tthis.constant -= offset.dot( this.normal );\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( plane ) {\n\n\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n * @author bhouston / http://clara.io\n */\n\nfunction Frustum( p0, p1, p2, p3, p4, p5 ) {\n\n\tthis.planes = [\n\n\t\t( p0 !== undefined ) ? p0 : new Plane(),\n\t\t( p1 !== undefined ) ? p1 : new Plane(),\n\t\t( p2 !== undefined ) ? p2 : new Plane(),\n\t\t( p3 !== undefined ) ? p3 : new Plane(),\n\t\t( p4 !== undefined ) ? p4 : new Plane(),\n\t\t( p5 !== undefined ) ? p5 : new Plane()\n\n\t];\n\n}\n\nObject.assign( Frustum.prototype, {\n\n\tset: function ( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tvar planes = this.planes;\n\n\t\tplanes[ 0 ].copy( p0 );\n\t\tplanes[ 1 ].copy( p1 );\n\t\tplanes[ 2 ].copy( p2 );\n\t\tplanes[ 3 ].copy( p3 );\n\t\tplanes[ 4 ].copy( p4 );\n\t\tplanes[ 5 ].copy( p5 );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( frustum ) {\n\n\t\tvar planes = this.planes;\n\n\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetFromMatrix: function ( m ) {\n\n\t\tvar planes = this.planes;\n\t\tvar me = m.elements;\n\t\tvar me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\tvar me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\tvar me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\tvar me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\n\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\treturn this;\n\n\t},\n\n\tintersectsObject: function () {\n\n\t\tvar sphere = new Sphere();\n\n\t\treturn function intersectsObject( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\tsphere.copy( geometry.boundingSphere )\n\t\t\t\t.applyMatrix4( object.matrixWorld );\n\n\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t};\n\n\t}(),\n\n\tintersectsSprite: function () {\n\n\t\tvar sphere = new Sphere();\n\n\t\treturn function intersectsSprite( sprite ) {\n\n\t\t\tsphere.center.set( 0, 0, 0 );\n\t\t\tsphere.radius = 0.7071067811865476;\n\t\t\tsphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t};\n\n\t}(),\n\n\tintersectsSphere: function ( sphere ) {\n\n\t\tvar planes = this.planes;\n\t\tvar center = sphere.center;\n\t\tvar negRadius = - sphere.radius;\n\n\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\tvar distance = planes[ i ].distanceToPoint( center );\n\n\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t},\n\n\tintersectsBox: function () {\n\n\t\tvar p1 = new Vector3(),\n\t\t\tp2 = new Vector3();\n\n\t\treturn function intersectsBox( box ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tvar plane = planes[ i ];\n\n\t\t\t\tp1.x = plane.normal.x > 0 ? box.min.x : box.max.x;\n\t\t\t\tp2.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t\tp1.y = plane.normal.y > 0 ? box.min.y : box.max.y;\n\t\t\t\tp2.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t\tp1.z = plane.normal.z > 0 ? box.min.z : box.max.z;\n\t\t\t\tp2.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\t\tvar d1 = plane.distanceToPoint( p1 );\n\t\t\t\tvar d2 = plane.distanceToPoint( p2 );\n\n\t\t\t\t// if both outside plane, no intersection\n\n\t\t\t\tif ( d1 < 0 && d2 < 0 ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t};\n\n\t}(),\n\n\tcontainsPoint: function ( point ) {\n\n\t\tvar planes = this.planes;\n\n\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n} );\n\nvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\\n#endif\\n\";\n\nvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\\n\";\n\nvar alphatest_fragment = \"#ifdef ALPHATEST\\n\\tif ( diffuseColor.a < ALPHATEST ) discard;\\n#endif\\n\";\n\nvar aomap_fragment = \"#ifdef USE_AOMAP\\n\\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\\n\\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\\n\\t#endif\\n#endif\\n\";\n\nvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\nvar begin_vertex = \"\\nvec3 transformed = vec3( position );\\n\";\n\nvar beginnormal_vertex = \"\\nvec3 objectNormal = vec3( normal );\\n\";\n\nvar bsdfs = \"float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n\\tif( decayExponent > 0.0 ) {\\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\\n\\t\\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\\t\\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\\t\\treturn distanceFalloff * maxDistanceCutoffFactor;\\n#else\\n\\t\\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\\n#endif\\n\\t}\\n\\treturn 1.0;\\n}\\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\\n\\treturn 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 G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\treturn 1.0 / ( gl * gv );\\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}\\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;\\n\\treturn RECIPROCAL_PI * a2 / pow2( denom );\\n}\\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\\n\\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\\n\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\\n\\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\\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 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\\n\\tconst float LUT_SIZE = 64.0;\\n\\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\\n\\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\\n\\tfloat dotNV = saturate( dot( N, V ) );\\n\\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\\n\\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\\treturn uv;\\n}\\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\\n\\tfloat l = length( f );\\n\\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\\n}\\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\\n\\tfloat x = dot( v1, v2 );\\n\\tfloat y = abs( x );\\n\\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\\n\\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\\n\\tfloat v = a / b;\\n\\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\\n\\treturn cross( v1, v2 ) * theta_sintheta;\\n}\\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\\n\\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\\n\\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\\n\\tvec3 lightNormal = cross( v1, v2 );\\n\\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\\n\\tvec3 T1, T2;\\n\\tT1 = normalize( V - N * dot( V, N ) );\\n\\tT2 = - cross( N, T1 );\\n\\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\\n\\tvec3 coords[ 4 ];\\n\\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\\n\\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\\n\\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\\n\\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\\n\\tcoords[ 0 ] = normalize( coords[ 0 ] );\\n\\tcoords[ 1 ] = normalize( coords[ 1 ] );\\n\\tcoords[ 2 ] = normalize( coords[ 2 ] );\\n\\tcoords[ 3 ] = normalize( coords[ 3 ] );\\n\\tvec3 vectorFormFactor = vec3( 0.0 );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\\n\\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\\n\\treturn vec3( result );\\n}\\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\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\\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\\n\\treturn specularColor * AB.x + AB.y;\\n}\\nfloat G_BlinnPhong_Implicit( ) {\\n\\treturn 0.25;\\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}\\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\\n\\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\\n\\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, dotLH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n}\\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\\n\\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\\n}\\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\\n\\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\\n}\\n\";\n\nvar bumpmap_pars_fragment = \"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd() {\\n\\t\\tvec2 dSTdx = dFdx( vUv );\\n\\t\\tvec2 dSTdy = dFdy( vUv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + 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\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\t}\\n#endif\\n\";\n\nvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvec4 plane;\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\tplane = clippingPlanes[ i ];\\n\\t\\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\\n\\t}\\n\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\tbool clipped = true;\\n\\t\\t#pragma unroll_loop\\n\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t}\\n\\t\\tif ( clipped ) discard;\\n\\t#endif\\n#endif\\n\";\n\nvar clipping_planes_pars_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\t\\tvarying vec3 vViewPosition;\\n\\t#endif\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\\n\";\n\nvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n\";\n\nvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n\";\n\nvar color_fragment = \"#ifdef USE_COLOR\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\nvar color_pars_fragment = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\\n\";\n\nvar color_pars_vertex = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_vertex = \"#ifdef USE_COLOR\\n\\tvColor.xyz = color.xyz;\\n#endif\";\n\nvar common = \"#define PI 3.14159265359\\n#define PI2 6.28318530718\\n#define PI_HALF 1.5707963267949\\n#define RECIPROCAL_PI 0.31830988618\\n#define RECIPROCAL_PI2 0.15915494\\n#define LOG2 1.442695\\n#define EPSILON 1e-6\\n#define saturate(a) clamp( a, 0.0, 1.0 )\\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract(sin(sn) * c);\\n}\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\nstruct GeometricContext {\\n\\tvec3 position;\\n\\tvec3 normal;\\n\\tvec3 viewDir;\\n};\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\tfloat distance = dot( planeNormal, point - pointOnPlane );\\n\\treturn - distance * planeNormal + point;\\n}\\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn sign( dot( point - pointOnPlane, planeNormal ) );\\n}\\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\\n}\\nmat3 transposeMat3( const in mat3 m ) {\\n\\tmat3 tmp;\\n\\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\\n\\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\\n\\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\\n\\treturn tmp;\\n}\\nfloat linearToRelativeLuminance( const in vec3 color ) {\\n\\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\\n\\treturn dot( weights, color.rgb );\\n}\\n\";\n\nvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n#define cubeUV_textureSize (1024.0)\\nint getFaceFromDirection(vec3 direction) {\\n\\tvec3 absDirection = abs(direction);\\n\\tint face = -1;\\n\\tif( absDirection.x > absDirection.z ) {\\n\\t\\tif(absDirection.x > absDirection.y )\\n\\t\\t\\tface = direction.x > 0.0 ? 0 : 3;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\telse {\\n\\t\\tif(absDirection.z > absDirection.y )\\n\\t\\t\\tface = direction.z > 0.0 ? 2 : 5;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\treturn face;\\n}\\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\\n\\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\\n\\tfloat dxRoughness = dFdx(roughness);\\n\\tfloat dyRoughness = dFdy(roughness);\\n\\tvec3 dx = dFdx( vec * scale * dxRoughness );\\n\\tvec3 dy = dFdy( vec * scale * dyRoughness );\\n\\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\\n\\td = clamp(d, 1.0, cubeUV_rangeClamp);\\n\\tfloat mipLevel = 0.5 * log2(d);\\n\\treturn vec2(floor(mipLevel), fract(mipLevel));\\n}\\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\\n\\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\\n\\tfloat a = 16.0 * cubeUV_rcpTextureSize;\\n\\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\\n\\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\\n\\tfloat powScale = exp2_packed.x * exp2_packed.y;\\n\\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\\n\\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\\n\\tbool bRes = mipLevel == 0.0;\\n\\tscale = bRes && (scale < a) ? a : scale;\\n\\tvec3 r;\\n\\tvec2 offset;\\n\\tint face = getFaceFromDirection(direction);\\n\\tfloat rcpPowScale = 1.0 / powScale;\\n\\tif( face == 0) {\\n\\t\\tr = vec3(direction.x, -direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 1) {\\n\\t\\tr = vec3(direction.y, direction.x, direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 2) {\\n\\t\\tr = vec3(direction.z, direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 3) {\\n\\t\\tr = vec3(direction.x, direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse if( face == 4) {\\n\\t\\tr = vec3(direction.y, direction.x, -direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse {\\n\\t\\tr = vec3(direction.z, -direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\tr = normalize(r);\\n\\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\\n\\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\\n\\tvec2 base = offset + vec2( texelOffset );\\n\\treturn base + s * ( scale - 2.0 * texelOffset );\\n}\\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\\n\\tfloat roughnessVal = roughness* cubeUV_maxLods3;\\n\\tfloat r1 = floor(roughnessVal);\\n\\tfloat r2 = r1 + 1.0;\\n\\tfloat t = fract(roughnessVal);\\n\\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\\n\\tfloat s = mipInfo.y;\\n\\tfloat level0 = mipInfo.x;\\n\\tfloat level1 = level0 + 1.0;\\n\\tlevel1 = level1 > 5.0 ? 5.0 : level1;\\n\\tlevel0 += min( floor( s + 0.5 ), 5.0 );\\n\\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\\n\\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\\n\\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\\n\\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\\n\\tvec4 result = mix(color10, color20, t);\\n\\treturn vec4(result.rgb, 1.0);\\n}\\n#endif\\n\";\n\nvar defaultnormal_vertex = \"vec3 transformedNormal = normalMatrix * objectNormal;\\n#ifdef FLIP_SIDED\\n\\ttransformedNormal = - transformedNormal;\\n#endif\\n\";\n\nvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\\n\";\n\nvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\\n#endif\\n\";\n\nvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\\n\\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\\n\";\n\nvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\\n\";\n\nvar encodings_fragment = \" gl_FragColor = linearToOutputTexel( gl_FragColor );\\n\";\n\nvar encodings_pars_fragment = \"\\nvec4 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}\\nvec4 RGBEToLinear( in vec4 value ) {\\n\\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\\n}\\nvec4 LinearToRGBE( in vec4 value ) {\\n\\tfloat maxComponent = max( max( value.r, value.g ), value.b );\\n\\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\\n\\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\\n}\\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\\n}\\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\\n\\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\\n\\tM = ceil( M * 255.0 ) / 255.0;\\n\\treturn vec4( value.rgb / ( M * maxRange ), M );\\n}\\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\\n}\\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\\n\\tfloat D = max( maxRange / maxRGB, 1.0 );\\n\\tD = min( floor( D ) / 255.0, 1.0 );\\n\\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\\n}\\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\\nvec4 LinearToLogLuv( in vec4 value ) {\\n\\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\\n\\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\\n\\tvec4 vResult;\\n\\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\\n\\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\\n\\tvResult.w = fract(Le);\\n\\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\\n\\treturn vResult;\\n}\\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\\nvec4 LogLuvToLinear( in vec4 value ) {\\n\\tfloat Le = value.z * 255.0 + value.w;\\n\\tvec3 Xp_Y_XYZp;\\n\\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\\n\\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\\n\\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\\n\\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\\n\\treturn vec4( max(vRGB, 0.0), 1.0 );\\n}\\n\";\n\nvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\tvec2 sampleUV;\\n\\t\\treflectVec = normalize( reflectVec );\\n\\t\\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\t\\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\tvec4 envColor = texture2D( envMap, sampleUV );\\n\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\treflectVec = normalize( reflectVec );\\n\\t\\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\\n\\t\\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\\n\\t#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\tenvColor = envMapTexelToLinear( envColor );\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\\n\";\n\nvar envmap_pars_fragment = \"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\\n\\tuniform float reflectivity;\\n\\tuniform float envMapIntensity;\\n#endif\\n#ifdef USE_ENVMAP\\n\\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n\\tuniform float flipEnvMap;\\n\\tuniform int maxMipLevel;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\\n\\t\\tuniform float refractionRatio;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t#endif\\n#endif\\n\";\n\nvar envmap_pars_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n#endif\\n\";\n\nvar envmap_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvWorldPosition = worldPosition.xyz;\\n\\t#else\\n\\t\\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvReflect = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#endif\\n#endif\\n\";\n\nvar fog_vertex = \"\\n#ifdef USE_FOG\\nfogDepth = -mvPosition.z;\\n#endif\";\n\nvar fog_pars_vertex = \"#ifdef USE_FOG\\n varying float fogDepth;\\n#endif\\n\";\n\nvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\\n\";\n\nvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float fogDepth;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\\n\";\n\nvar gradientmap_pars_fragment = \"#ifdef TOON\\n\\tuniform sampler2D gradientMap;\\n\\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\t\\tfloat dotNL = dot( normal, lightDirection );\\n\\t\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t\\t#ifdef USE_GRADIENTMAP\\n\\t\\t\\treturn texture2D( gradientMap, coord ).rgb;\\n\\t\\t#else\\n\\t\\t\\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\";\n\nvar lightmap_fragment = \"#ifdef USE_LIGHTMAP\\n\\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n#endif\\n\";\n\nvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\nvar lights_lambert_vertex = \"vec3 diffuse = vec3( 1.0 );\\nGeometricContext geometry;\\ngeometry.position = mvPosition.xyz;\\ngeometry.normal = normalize( transformedNormal );\\ngeometry.viewDir = normalize( -mvPosition.xyz );\\nGeometricContext backGeometry;\\nbackGeometry.position = geometry.position;\\nbackGeometry.normal = -geometry.normal;\\nbackGeometry.viewDir = geometry.viewDir;\\nvLightFront = vec3( 0.0 );\\n#ifdef DOUBLE_SIDED\\n\\tvLightBack = vec3( 0.0 );\\n#endif\\nIncidentLight directLight;\\nfloat dotNL;\\nvec3 directLightColor_Diffuse;\\n#if NUM_POINT_LIGHTS > 0\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_DIR_LIGHTS > 0\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\";\n\nvar lights_pars_begin = \"uniform vec3 ambientLightColor;\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treturn irradiance;\\n}\\n#if NUM_DIR_LIGHTS > 0\\n\\tstruct DirectionalLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\\n\\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tdirectLight.color = directionalLight.color;\\n\\t\\tdirectLight.direction = directionalLight.direction;\\n\\t\\tdirectLight.visible = true;\\n\\t}\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\tstruct PointLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t\\tfloat shadowCameraNear;\\n\\t\\tfloat shadowCameraFar;\\n\\t};\\n\\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\\n\\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = pointLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tdirectLight.color = pointLight.color;\\n\\t\\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = spotLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tfloat angleCos = dot( directLight.direction, spotLight.direction );\\n\\t\\tif ( angleCos > spotLight.coneCos ) {\\n\\t\\t\\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\t\\tdirectLight.color = spotLight.color;\\n\\t\\t\\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tdirectLight.visible = true;\\n\\t\\t} else {\\n\\t\\t\\tdirectLight.color = vec3( 0.0 );\\n\\t\\t\\tdirectLight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tstruct RectAreaLight {\\n\\t\\tvec3 color;\\n\\t\\tvec3 position;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\\t};\\n\\tuniform sampler2D ltc_1;\\tuniform sampler2D ltc_2;\\n\\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\\n\\t\\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tirradiance *= PI;\\n\\t\\t#endif\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\\n\";\n\nvar lights_pars_maps = \"#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\\n\\t\\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\\n\\t\\t#else\\n\\t\\t\\tvec4 envMapColor = vec4( 0.0 );\\n\\t\\t#endif\\n\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t}\\n\\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\tfloat maxMIPLevelScalar = float( maxMIPLevel );\\n\\t\\tfloat desiredMIPLevel = maxMIPLevelScalar + 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\\n\\t\\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\\n\\t}\\n\\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\\n\\t\\t#endif\\n\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\\n\\t\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\t\\tvec2 sampleUV;\\n\\t\\t\\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\t\\t\\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\t\\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#endif\\n\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t}\\n#endif\\n\";\n\nvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\\n\";\n\nvar lights_phong_pars_fragment = \"varying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\nstruct BlinnPhongMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tvec3\\tspecularColor;\\n\\tfloat\\tspecularShininess;\\n\\tfloat\\tspecularStrength;\\n};\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifdef TOON\\n\\t\\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\\n\\t#else\\n\\t\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\t\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#endif\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\\n#define Material_LightProbeLOD( material )\\t(0)\\n\";\n\nvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\\n#ifdef STANDARD\\n\\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.clearCoat = saturate( clearCoat );\\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\\n#endif\\n\";\n\nvar lights_physical_pars_fragment = \"struct PhysicalMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tfloat\\tspecularRoughness;\\n\\tvec3\\tspecularColor;\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoat;\\n\\t\\tfloat clearCoatRoughness;\\n\\t#endif\\n};\\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\\n\\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 normal = geometry.normal;\\n\\t\\tvec3 viewDir = geometry.viewDir;\\n\\t\\tvec3 position = geometry.position;\\n\\t\\tvec3 lightPos = rectAreaLight.position;\\n\\t\\tvec3 halfWidth = rectAreaLight.halfWidth;\\n\\t\\tvec3 halfHeight = rectAreaLight.halfHeight;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = material.specularRoughness;\\n\\t\\tvec3 rectCoords[ 4 ];\\n\\t\\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\\t\\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\\n\\t\\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\\n\\t\\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\\n\\t\\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\\n\\t\\tvec4 t1 = texture2D( ltc_1, uv );\\n\\t\\tvec4 t2 = texture2D( ltc_2, uv );\\n\\t\\tmat3 mInv = mat3(\\n\\t\\t\\tvec3( t1.x, 0, t1.y ),\\n\\t\\t\\tvec3( 0, 1, 0 ),\\n\\t\\t\\tvec3( t1.z, 0, t1.w )\\n\\t\\t);\\n\\t\\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\\n\\t\\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\\n\\t\\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\\n\\t}\\n#endif\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\\n\\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifndef STANDARD\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\tfloat dotNL = dotNV;\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\\nfloat 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\";\n\nvar lights_fragment_begin = \"\\nGeometricContext geometry;\\ngeometry.position = - vViewPosition;\\ngeometry.normal = normal;\\ngeometry.viewDir = normalize( vViewPosition );\\nIncidentLight directLight;\\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tPointLight pointLight;\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tSpotLight spotLight;\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tDirectionalLight directionalLight;\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\t#if ( NUM_HEMI_LIGHTS > 0 )\\n\\t\\t#pragma unroll_loop\\n\\t\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\\n\\t\\t}\\n\\t#endif\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tvec3 radiance = vec3( 0.0 );\\n\\tvec3 clearCoatRadiance = vec3( 0.0 );\\n#endif\\n\";\n\nvar lights_fragment_maps = \"#if defined( RE_IndirectDiffuse )\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tlightMapIrradiance *= PI;\\n\\t\\t#endif\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tirradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\\n\\t#endif\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\tradiance += getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), maxMipLevel );\\n\\t#ifndef STANDARD\\n\\t\\tclearCoatRadiance += getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), maxMipLevel );\\n\\t#endif\\n#endif\\n\";\n\nvar lights_fragment_end = \"#if defined( RE_IndirectDiffuse )\\n\\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\\n#endif\\n\";\n\nvar logdepthbuf_fragment = \"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\\n\\tgl_FragDepthEXT = log2( vFragDepth ) * logDepthBufFC * 0.5;\\n#endif\";\n\nvar logdepthbuf_pars_fragment = \"#ifdef USE_LOGDEPTHBUF\\n\\tuniform float logDepthBufFC;\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t#endif\\n#endif\\n\";\n\nvar logdepthbuf_pars_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t#endif\\n\\tuniform float logDepthBufFC;\\n#endif\";\n\nvar logdepthbuf_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvFragDepth = 1.0 + gl_Position.w;\\n\\t#else\\n\\t\\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\\n\\t\\tgl_Position.z *= gl_Position.w;\\n\\t#endif\\n#endif\\n\";\n\nvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 texelColor = texture2D( map, vUv );\\n\\ttexelColor = mapTexelToLinear( texelColor );\\n\\tdiffuseColor *= texelColor;\\n#endif\\n\";\n\nvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\nvar map_particle_fragment = \"#ifdef USE_MAP\\n\\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\\n\\tvec4 mapTexel = texture2D( map, uv );\\n\\tdiffuseColor *= mapTexelToLinear( mapTexel );\\n#endif\\n\";\n\nvar map_particle_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform mat3 uvTransform;\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\nvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\\n\\tmetalnessFactor *= texelMetalness.b;\\n#endif\\n\";\n\nvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\nvar morphnormal_vertex = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\\n\\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\\n\\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\\n\\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\\n#endif\\n\";\n\nvar morphtarget_pars_vertex = \"#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\";\n\nvar morphtarget_vertex = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\\n\\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\\n\\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\\n\\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\\n\\t#ifndef USE_MORPHNORMALS\\n\\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\\n\\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\\n\\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\\n\\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\\n\\t#endif\\n#endif\\n\";\n\nvar normal_fragment_begin = \"#ifdef FLAT_SHADED\\n\\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\\n\\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\\n\\tvec3 normal = normalize( cross( fdx, fdy ) );\\n#else\\n\\tvec3 normal = normalize( vNormal );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n\\t#endif\\n#endif\\n\";\n\nvar normal_fragment_maps = \"#ifdef USE_NORMALMAP\\n\\tnormal = perturbNormal2Arb( -vViewPosition, normal );\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\\n#endif\\n\";\n\nvar normalmap_pars_fragment = \"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n\\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\\n\\t\\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\\n\\t\\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\\n\\t\\tvec2 st0 = dFdx( vUv.st );\\n\\t\\tvec2 st1 = dFdy( vUv.st );\\n\\t\\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\\t\\tscale *= float( gl_FrontFacing ) * 2.0 - 1.0;\\n\\t\\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\\n\\t\\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\\n\\t\\tvec3 N = normalize( surf_norm );\\n\\t\\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\n\\t\\tmapN.xy = normalScale * mapN.xy;\\n\\t\\tmat3 tsn = mat3( S, T, N );\\n\\t\\treturn normalize( tsn * mapN );\\n\\t}\\n#endif\\n\";\n\nvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n\\treturn normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n\\treturn 2.0 * rgb.xyz - 1.0;\\n}\\nconst 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\\tvec4 r = vec4( fract( v * PackFactors ), v );\\n\\tr.yzw -= r.xyz * ShiftRight8;\\treturn r * PackUpscale;\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\\n\\treturn linearClipZ * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\\n}\\n\";\n\nvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\\n\";\n\nvar project_vertex = \"vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\\ngl_Position = projectionMatrix * mvPosition;\\n\";\n\nvar dithering_fragment = \"#if defined( DITHERING )\\n gl_FragColor.rgb = dithering( gl_FragColor.rgb );\\n#endif\\n\";\n\nvar dithering_pars_fragment = \"#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\\n\";\n\nvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\\n\\troughnessFactor *= texelRoughness.g;\\n#endif\\n\";\n\nvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\nvar shadowmap_pars_fragment = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\t\\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\\n\\t#endif\\n\\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\\n\\t\\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\\n\\t}\\n\\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\\n\\t\\tconst vec2 offset = vec2( 0.0, 1.0 );\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / size;\\n\\t\\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\\n\\t\\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\\n\\t\\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\\n\\t\\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\\n\\t\\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\\n\\t\\tvec2 f = fract( uv * size + 0.5 );\\n\\t\\tfloat a = mix( lb, lt, f.y );\\n\\t\\tfloat b = mix( rb, rt, f.y );\\n\\t\\tfloat c = mix( a, b, f.x );\\n\\t\\treturn c;\\n\\t}\\n\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\tshadowCoord.z += shadowBias;\\n\\t\\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\\n\\t\\tbool inFrustum = all( inFrustumVec );\\n\\t\\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\\n\\t\\tbool frustumTest = all( frustumTestVec );\\n\\t\\tif ( frustumTest ) {\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#else\\n\\t\\t\\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn shadow;\\n\\t}\\n\\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\\n\\t\\tvec3 absV = abs( v );\\n\\t\\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\\n\\t\\tabsV *= scaleToCube;\\n\\t\\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\\n\\t\\tvec2 planar = v.xy;\\n\\t\\tfloat almostATexel = 1.5 * texelSizeY;\\n\\t\\tfloat almostOne = 1.0 - almostATexel;\\n\\t\\tif ( absV.z >= almostOne ) {\\n\\t\\t\\tif ( v.z > 0.0 )\\n\\t\\t\\t\\tplanar.x = 4.0 - v.x;\\n\\t\\t} else if ( absV.x >= almostOne ) {\\n\\t\\t\\tfloat signX = sign( v.x );\\n\\t\\t\\tplanar.x = v.z * signX + 2.0 * signX;\\n\\t\\t} else if ( absV.y >= almostOne ) {\\n\\t\\t\\tfloat signY = sign( v.y );\\n\\t\\t\\tplanar.x = v.x + 2.0 * signY + 2.0;\\n\\t\\t\\tplanar.y = v.z * signY - 2.0;\\n\\t\\t}\\n\\t\\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\\n\\t}\\n\\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\\t\\tdp += shadowBias;\\n\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\\n\\t\\t\\treturn (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#else\\n\\t\\t\\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\";\n\nvar shadowmap_pars_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\t\\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\\n\\t#endif\\n#endif\\n\";\n\nvar shadowmap_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n#endif\\n\";\n\nvar shadowmask_pars_fragment = \"float getShadowMask() {\\n\\tfloat shadow = 1.0;\\n\\t#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\tDirectionalLight directionalLight;\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\tSpotLight spotLight;\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\tPointLight pointLight;\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#endif\\n\\treturn shadow;\\n}\\n\";\n\nvar skinbase_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\\n\\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\\n\\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\\n\\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\\n#endif\";\n\nvar skinning_pars_vertex = \"#ifdef USE_SKINNING\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\t#ifdef BONE_TEXTURE\\n\\t\\tuniform sampler2D boneTexture;\\n\\t\\tuniform int boneTextureSize;\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\t\\tfloat j = i * 4.0;\\n\\t\\t\\tfloat x = mod( j, float( boneTextureSize ) );\\n\\t\\t\\tfloat y = floor( j / float( boneTextureSize ) );\\n\\t\\t\\tfloat dx = 1.0 / float( boneTextureSize );\\n\\t\\t\\tfloat dy = 1.0 / float( boneTextureSize );\\n\\t\\t\\ty = dy * ( y + 0.5 );\\n\\t\\t\\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\\n\\t\\t\\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\\n\\t\\t\\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\\n\\t\\t\\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\\n\\t\\t\\tmat4 bone = mat4( v1, v2, v3, v4 );\\n\\t\\t\\treturn bone;\\n\\t\\t}\\n\\t#else\\n\\t\\tuniform mat4 boneMatrices[ MAX_BONES ];\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\t\\tmat4 bone = boneMatrices[ int(i) ];\\n\\t\\t\\treturn bone;\\n\\t\\t}\\n\\t#endif\\n#endif\\n\";\n\nvar skinning_vertex = \"#ifdef USE_SKINNING\\n\\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\\n\\tvec4 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\\ttransformed = ( bindMatrixInverse * skinned ).xyz;\\n#endif\\n\";\n\nvar skinnormal_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 skinMatrix = mat4( 0.0 );\\n\\tskinMatrix += skinWeight.x * boneMatX;\\n\\tskinMatrix += skinWeight.y * boneMatY;\\n\\tskinMatrix += skinWeight.z * boneMatZ;\\n\\tskinMatrix += skinWeight.w * boneMatW;\\n\\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\\n\\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\\n#endif\\n\";\n\nvar specularmap_fragment = \"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, vUv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\";\n\nvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\nvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\\n\";\n\nvar tonemapping_pars_fragment = \"#ifndef saturate\\n\\t#define saturate(a) clamp( a, 0.0, 1.0 )\\n#endif\\nuniform float toneMappingExposure;\\nuniform float toneMappingWhitePoint;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn toneMappingExposure * color;\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\\nvec3 Uncharted2ToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\\n}\\nvec3 OptimizedCineonToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = max( vec3( 0.0 ), color - 0.004 );\\n\\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\n\";\n\nvar uv_pars_fragment = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvarying vec2 vUv;\\n#endif\";\n\nvar uv_pars_vertex = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvarying vec2 vUv;\\n\\tuniform mat3 uvTransform;\\n#endif\\n\";\n\nvar uv_vertex = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n#endif\";\n\nvar uv2_pars_fragment = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvarying vec2 vUv2;\\n#endif\";\n\nvar uv2_pars_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tattribute vec2 uv2;\\n\\tvarying vec2 vUv2;\\n#endif\";\n\nvar uv2_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvUv2 = uv2;\\n#endif\";\n\nvar worldpos_vertex = \"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\\n\\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\\n#endif\\n\";\n\nvar cube_frag = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldPosition;\\nvoid main() {\\n\\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\\n\\tgl_FragColor.a *= opacity;\\n}\\n\";\n\nvar cube_vert = \"varying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n\\tgl_Position.z = gl_Position.w;\\n}\\n\";\n\nvar depth_frag = \"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tgl_FragColor = vec4( vec3( 1.0 - gl_FragCoord.z ), opacity );\\n\\t#elif DEPTH_PACKING == 3201\\n\\t\\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\\n\\t#endif\\n}\\n\";\n\nvar depth_vert = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\nvar distanceRGBA_frag = \"#define DISTANCE\\nuniform vec3 referencePosition;\\nuniform float nearDistance;\\nuniform float farDistance;\\nvarying vec3 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main () {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\tfloat dist = length( vWorldPosition - referencePosition );\\n\\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\\n\\tdist = saturate( dist );\\n\\tgl_FragColor = packDepthToRGBA( dist );\\n}\\n\";\n\nvar distanceRGBA_vert = \"#define DISTANCE\\nvarying vec3 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvWorldPosition = worldPosition.xyz;\\n}\\n\";\n\nvar equirect_frag = \"uniform sampler2D tEquirect;\\nvarying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvec3 direction = normalize( vWorldPosition );\\n\\tvec2 sampleUV;\\n\\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\\n\\tgl_FragColor = texture2D( tEquirect, sampleUV );\\n}\\n\";\n\nvar equirect_vert = \"varying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\\n\";\n\nvar linedashed_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\\n\\t\\tdiscard;\\n\\t}\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\nvar linedashed_vert = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvLineDistance = scale * lineDistance;\\n\\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\nvar meshbasic_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\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\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\nvar meshbasic_vert = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_ENVMAP\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\nvar meshlambert_frag = \"uniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\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 \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\\n\\t#else\\n\\t\\treflectedLight.directDiffuse = vLightFront;\\n\\t#endif\\n\\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\nvar meshlambert_vert = \"#define LAMBERT\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\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\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\nvar meshphong_frag = \"#define PHONG\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\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 \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\nvar meshphong_vert = \"#define PHONG\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\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\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\nvar meshphysical_frag = \"#define PHYSICAL\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifndef STANDARD\\n\\tuniform float clearCoat;\\n\\tuniform float clearCoatRoughness;\\n#endif\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\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 \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\nvar meshphysical_vert = \"#define PHYSICAL\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\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\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\nvar normal_frag = \"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\\n}\\n\";\n\nvar normal_vert = \"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\\n\";\n\nvar points_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\nvar points_vert = \"uniform float size;\\nuniform float scale;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tgl_PointSize = size * ( scale / - mvPosition.z );\\n\\t#else\\n\\t\\tgl_PointSize = size;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\nvar shadow_frag = \"uniform vec3 color;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\\n\\t#include \\n}\\n\";\n\nvar shadow_vert = \"#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\nvar ShaderChunk = {\n\talphamap_fragment: alphamap_fragment,\n\talphamap_pars_fragment: alphamap_pars_fragment,\n\talphatest_fragment: alphatest_fragment,\n\taomap_fragment: aomap_fragment,\n\taomap_pars_fragment: aomap_pars_fragment,\n\tbegin_vertex: begin_vertex,\n\tbeginnormal_vertex: beginnormal_vertex,\n\tbsdfs: bsdfs,\n\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\tclipping_planes_fragment: clipping_planes_fragment,\n\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\tclipping_planes_vertex: clipping_planes_vertex,\n\tcolor_fragment: color_fragment,\n\tcolor_pars_fragment: color_pars_fragment,\n\tcolor_pars_vertex: color_pars_vertex,\n\tcolor_vertex: color_vertex,\n\tcommon: common,\n\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\tdefaultnormal_vertex: defaultnormal_vertex,\n\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\tdisplacementmap_vertex: displacementmap_vertex,\n\temissivemap_fragment: emissivemap_fragment,\n\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\tencodings_fragment: encodings_fragment,\n\tencodings_pars_fragment: encodings_pars_fragment,\n\tenvmap_fragment: envmap_fragment,\n\tenvmap_pars_fragment: envmap_pars_fragment,\n\tenvmap_pars_vertex: envmap_pars_vertex,\n\tenvmap_vertex: envmap_vertex,\n\tfog_vertex: fog_vertex,\n\tfog_pars_vertex: fog_pars_vertex,\n\tfog_fragment: fog_fragment,\n\tfog_pars_fragment: fog_pars_fragment,\n\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\tlightmap_fragment: lightmap_fragment,\n\tlightmap_pars_fragment: lightmap_pars_fragment,\n\tlights_lambert_vertex: lights_lambert_vertex,\n\tlights_pars_begin: lights_pars_begin,\n\tlights_pars_maps: lights_pars_maps,\n\tlights_phong_fragment: lights_phong_fragment,\n\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\tlights_physical_fragment: lights_physical_fragment,\n\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\tlights_fragment_begin: lights_fragment_begin,\n\tlights_fragment_maps: lights_fragment_maps,\n\tlights_fragment_end: lights_fragment_end,\n\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\tmap_fragment: map_fragment,\n\tmap_pars_fragment: map_pars_fragment,\n\tmap_particle_fragment: map_particle_fragment,\n\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\tmetalnessmap_fragment: metalnessmap_fragment,\n\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\tmorphnormal_vertex: morphnormal_vertex,\n\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\tmorphtarget_vertex: morphtarget_vertex,\n\tnormal_fragment_begin: normal_fragment_begin,\n\tnormal_fragment_maps: normal_fragment_maps,\n\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\tpacking: packing,\n\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\tproject_vertex: project_vertex,\n\tdithering_fragment: dithering_fragment,\n\tdithering_pars_fragment: dithering_pars_fragment,\n\troughnessmap_fragment: roughnessmap_fragment,\n\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\tshadowmap_vertex: shadowmap_vertex,\n\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\tskinbase_vertex: skinbase_vertex,\n\tskinning_pars_vertex: skinning_pars_vertex,\n\tskinning_vertex: skinning_vertex,\n\tskinnormal_vertex: skinnormal_vertex,\n\tspecularmap_fragment: specularmap_fragment,\n\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\ttonemapping_fragment: tonemapping_fragment,\n\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\tuv_pars_fragment: uv_pars_fragment,\n\tuv_pars_vertex: uv_pars_vertex,\n\tuv_vertex: uv_vertex,\n\tuv2_pars_fragment: uv2_pars_fragment,\n\tuv2_pars_vertex: uv2_pars_vertex,\n\tuv2_vertex: uv2_vertex,\n\tworldpos_vertex: worldpos_vertex,\n\n\tcube_frag: cube_frag,\n\tcube_vert: cube_vert,\n\tdepth_frag: depth_frag,\n\tdepth_vert: depth_vert,\n\tdistanceRGBA_frag: distanceRGBA_frag,\n\tdistanceRGBA_vert: distanceRGBA_vert,\n\tequirect_frag: equirect_frag,\n\tequirect_vert: equirect_vert,\n\tlinedashed_frag: linedashed_frag,\n\tlinedashed_vert: linedashed_vert,\n\tmeshbasic_frag: meshbasic_frag,\n\tmeshbasic_vert: meshbasic_vert,\n\tmeshlambert_frag: meshlambert_frag,\n\tmeshlambert_vert: meshlambert_vert,\n\tmeshphong_frag: meshphong_frag,\n\tmeshphong_vert: meshphong_vert,\n\tmeshphysical_frag: meshphysical_frag,\n\tmeshphysical_vert: meshphysical_vert,\n\tnormal_frag: normal_frag,\n\tnormal_vert: normal_vert,\n\tpoints_frag: points_frag,\n\tpoints_vert: points_vert,\n\tshadow_frag: shadow_frag,\n\tshadow_vert: shadow_vert\n};\n\n/**\n * Uniform Utilities\n */\n\nvar UniformsUtils = {\n\n\tmerge: function ( uniforms ) {\n\n\t\tvar merged = {};\n\n\t\tfor ( var u = 0; u < uniforms.length; u ++ ) {\n\n\t\t\tvar tmp = this.clone( uniforms[ u ] );\n\n\t\t\tfor ( var p in tmp ) {\n\n\t\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn merged;\n\n\t},\n\n\tclone: function ( uniforms_src ) {\n\n\t\tvar uniforms_dst = {};\n\n\t\tfor ( var u in uniforms_src ) {\n\n\t\t\tuniforms_dst[ u ] = {};\n\n\t\t\tfor ( var p in uniforms_src[ u ] ) {\n\n\t\t\t\tvar parameter_src = uniforms_src[ u ][ p ];\n\n\t\t\t\tif ( parameter_src && ( parameter_src.isColor ||\n\t\t\t\t\tparameter_src.isMatrix3 || parameter_src.isMatrix4 ||\n\t\t\t\t\tparameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 ||\n\t\t\t\t\tparameter_src.isTexture ) ) {\n\n\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.clone();\n\n\t\t\t\t} else if ( Array.isArray( parameter_src ) ) {\n\n\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.slice();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn uniforms_dst;\n\n\t}\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nvar ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\nfunction Color( r, g, b ) {\n\n\tif ( g === undefined && b === undefined ) {\n\n\t\t// r is THREE.Color, hex or string\n\t\treturn this.set( r );\n\n\t}\n\n\treturn this.setRGB( r, g, b );\n\n}\n\nObject.assign( Color.prototype, {\n\n\tisColor: true,\n\n\tr: 1, g: 1, b: 1,\n\n\tset: function ( value ) {\n\n\t\tif ( value && value.isColor ) {\n\n\t\t\tthis.copy( value );\n\n\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\tthis.setHex( value );\n\n\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\tthis.setStyle( value );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetScalar: function ( scalar ) {\n\n\t\tthis.r = scalar;\n\t\tthis.g = scalar;\n\t\tthis.b = scalar;\n\n\t\treturn this;\n\n\t},\n\n\tsetHex: function ( hex ) {\n\n\t\thex = Math.floor( hex );\n\n\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\treturn this;\n\n\t},\n\n\tsetRGB: function ( r, g, b ) {\n\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\n\t\treturn this;\n\n\t},\n\n\tsetHSL: function () {\n\n\t\tfunction hue2rgb( p, q, t ) {\n\n\t\t\tif ( t < 0 ) t += 1;\n\t\t\tif ( t > 1 ) t -= 1;\n\t\t\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\t\t\tif ( t < 1 / 2 ) return q;\n\t\t\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\t\t\treturn p;\n\n\t\t}\n\n\t\treturn function setHSL( h, s, l ) {\n\n\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\t\th = _Math.euclideanModulo( h, 1 );\n\t\t\ts = _Math.clamp( s, 0, 1 );\n\t\t\tl = _Math.clamp( l, 0, 1 );\n\n\t\t\tif ( s === 0 ) {\n\n\t\t\t\tthis.r = this.g = this.b = l;\n\n\t\t\t} else {\n\n\t\t\t\tvar p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\t\tvar q = ( 2 * l ) - p;\n\n\t\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tsetStyle: function ( style ) {\n\n\t\tfunction handleAlpha( string ) {\n\n\t\t\tif ( string === undefined ) return;\n\n\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tvar m;\n\n\t\tif ( m = /^((?:rgb|hsl)a?)\\(\\s*([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t// rgb / hsl\n\n\t\t\tvar color;\n\t\t\tvar name = m[ 1 ];\n\t\t\tvar components = m[ 2 ];\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'rgb':\n\t\t\t\tcase 'rgba':\n\n\t\t\t\t\tif ( color = /^(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\t\t\t\t\t\tthis.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;\n\t\t\t\t\t\tthis.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;\n\t\t\t\t\t\tthis.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;\n\n\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( color = /^(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\t\t\t\t\t\tthis.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;\n\t\t\t\t\t\tthis.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;\n\t\t\t\t\t\tthis.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;\n\n\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'hsl':\n\t\t\t\tcase 'hsla':\n\n\t\t\t\t\tif ( color = /^([0-9]*\\.?[0-9]+)\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\t\t\t\t\t\tvar h = parseFloat( color[ 1 ] ) / 360;\n\t\t\t\t\t\tvar s = parseInt( color[ 2 ], 10 ) / 100;\n\t\t\t\t\t\tvar l = parseInt( color[ 3 ], 10 ) / 100;\n\n\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\treturn this.setHSL( h, s, l );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t} else if ( m = /^\\#([A-Fa-f0-9]+)$/.exec( style ) ) {\n\n\t\t\t// hex color\n\n\t\t\tvar hex = m[ 1 ];\n\t\t\tvar size = hex.length;\n\n\t\t\tif ( size === 3 ) {\n\n\t\t\t\t// #ff0\n\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;\n\t\t\t\tthis.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\tthis.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;\n\n\t\t\t\treturn this;\n\n\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t// #ff0000\n\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\tthis.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;\n\t\t\t\tthis.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( style && style.length > 0 ) {\n\n\t\t\t// color keywords\n\t\t\tvar hex = ColorKeywords[ style ];\n\n\t\t\tif ( hex !== undefined ) {\n\n\t\t\t\t// red\n\t\t\t\tthis.setHex( hex );\n\n\t\t\t} else {\n\n\t\t\t\t// unknown color\n\t\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t},\n\n\tcopy: function ( color ) {\n\n\t\tthis.r = color.r;\n\t\tthis.g = color.g;\n\t\tthis.b = color.b;\n\n\t\treturn this;\n\n\t},\n\n\tcopyGammaToLinear: function ( color, gammaFactor ) {\n\n\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\tthis.r = Math.pow( color.r, gammaFactor );\n\t\tthis.g = Math.pow( color.g, gammaFactor );\n\t\tthis.b = Math.pow( color.b, gammaFactor );\n\n\t\treturn this;\n\n\t},\n\n\tcopyLinearToGamma: function ( color, gammaFactor ) {\n\n\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\tvar safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0;\n\n\t\tthis.r = Math.pow( color.r, safeInverse );\n\t\tthis.g = Math.pow( color.g, safeInverse );\n\t\tthis.b = Math.pow( color.b, safeInverse );\n\n\t\treturn this;\n\n\t},\n\n\tconvertGammaToLinear: function () {\n\n\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\tthis.r = r * r;\n\t\tthis.g = g * g;\n\t\tthis.b = b * b;\n\n\t\treturn this;\n\n\t},\n\n\tconvertLinearToGamma: function () {\n\n\t\tthis.r = Math.sqrt( this.r );\n\t\tthis.g = Math.sqrt( this.g );\n\t\tthis.b = Math.sqrt( this.b );\n\n\t\treturn this;\n\n\t},\n\n\tgetHex: function () {\n\n\t\treturn ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;\n\n\t},\n\n\tgetHexString: function () {\n\n\t\treturn ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );\n\n\t},\n\n\tgetHSL: function ( target ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Color: .getHSL() target is now required' );\n\t\t\ttarget = { h: 0, s: 0, l: 0 };\n\n\t\t}\n\n\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\tvar max = Math.max( r, g, b );\n\t\tvar min = Math.min( r, g, b );\n\n\t\tvar hue, saturation;\n\t\tvar lightness = ( min + max ) / 2.0;\n\n\t\tif ( min === max ) {\n\n\t\t\thue = 0;\n\t\t\tsaturation = 0;\n\n\t\t} else {\n\n\t\t\tvar delta = max - min;\n\n\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\tswitch ( max ) {\n\n\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t}\n\n\t\t\thue /= 6;\n\n\t\t}\n\n\t\ttarget.h = hue;\n\t\ttarget.s = saturation;\n\t\ttarget.l = lightness;\n\n\t\treturn target;\n\n\t},\n\n\tgetStyle: function () {\n\n\t\treturn 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';\n\n\t},\n\n\toffsetHSL: function () {\n\n\t\tvar hsl = {};\n\n\t\treturn function ( h, s, l ) {\n\n\t\t\tthis.getHSL( hsl );\n\n\t\t\thsl.h += h; hsl.s += s; hsl.l += l;\n\n\t\t\tthis.setHSL( hsl.h, hsl.s, hsl.l );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tadd: function ( color ) {\n\n\t\tthis.r += color.r;\n\t\tthis.g += color.g;\n\t\tthis.b += color.b;\n\n\t\treturn this;\n\n\t},\n\n\taddColors: function ( color1, color2 ) {\n\n\t\tthis.r = color1.r + color2.r;\n\t\tthis.g = color1.g + color2.g;\n\t\tthis.b = color1.b + color2.b;\n\n\t\treturn this;\n\n\t},\n\n\taddScalar: function ( s ) {\n\n\t\tthis.r += s;\n\t\tthis.g += s;\n\t\tthis.b += s;\n\n\t\treturn this;\n\n\t},\n\n\tsub: function ( color ) {\n\n\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\treturn this;\n\n\t},\n\n\tmultiply: function ( color ) {\n\n\t\tthis.r *= color.r;\n\t\tthis.g *= color.g;\n\t\tthis.b *= color.b;\n\n\t\treturn this;\n\n\t},\n\n\tmultiplyScalar: function ( s ) {\n\n\t\tthis.r *= s;\n\t\tthis.g *= s;\n\t\tthis.b *= s;\n\n\t\treturn this;\n\n\t},\n\n\tlerp: function ( color, alpha ) {\n\n\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( c ) {\n\n\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t},\n\n\tfromArray: function ( array, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tthis.r = array[ offset ];\n\t\tthis.g = array[ offset + 1 ];\n\t\tthis.b = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tarray[ offset ] = this.r;\n\t\tarray[ offset + 1 ] = this.g;\n\t\tarray[ offset + 2 ] = this.b;\n\n\t\treturn array;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\treturn this.getHex();\n\n\t}\n\n} );\n\n/**\n * Uniforms library for shared webgl shaders\n */\n\nvar UniformsLib = {\n\n\tcommon: {\n\n\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\topacity: { value: 1.0 },\n\n\t\tmap: { value: null },\n\t\tuvTransform: { value: new Matrix3() },\n\n\t\talphaMap: { value: null },\n\n\t},\n\n\tspecularmap: {\n\n\t\tspecularMap: { value: null },\n\n\t},\n\n\tenvmap: {\n\n\t\tenvMap: { value: null },\n\t\tflipEnvMap: { value: - 1 },\n\t\treflectivity: { value: 1.0 },\n\t\trefractionRatio: { value: 0.98 },\n\t\tmaxMipLevel: { value: 0 }\n\n\t},\n\n\taomap: {\n\n\t\taoMap: { value: null },\n\t\taoMapIntensity: { value: 1 }\n\n\t},\n\n\tlightmap: {\n\n\t\tlightMap: { value: null },\n\t\tlightMapIntensity: { value: 1 }\n\n\t},\n\n\temissivemap: {\n\n\t\temissiveMap: { value: null }\n\n\t},\n\n\tbumpmap: {\n\n\t\tbumpMap: { value: null },\n\t\tbumpScale: { value: 1 }\n\n\t},\n\n\tnormalmap: {\n\n\t\tnormalMap: { value: null },\n\t\tnormalScale: { value: new Vector2( 1, 1 ) }\n\n\t},\n\n\tdisplacementmap: {\n\n\t\tdisplacementMap: { value: null },\n\t\tdisplacementScale: { value: 1 },\n\t\tdisplacementBias: { value: 0 }\n\n\t},\n\n\troughnessmap: {\n\n\t\troughnessMap: { value: null }\n\n\t},\n\n\tmetalnessmap: {\n\n\t\tmetalnessMap: { value: null }\n\n\t},\n\n\tgradientmap: {\n\n\t\tgradientMap: { value: null }\n\n\t},\n\n\tfog: {\n\n\t\tfogDensity: { value: 0.00025 },\n\t\tfogNear: { value: 1 },\n\t\tfogFar: { value: 2000 },\n\t\tfogColor: { value: new Color( 0xffffff ) }\n\n\t},\n\n\tlights: {\n\n\t\tambientLightColor: { value: [] },\n\n\t\tdirectionalLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tcolor: {},\n\n\t\t\tshadow: {},\n\t\t\tshadowBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tdirectionalShadowMap: { value: [] },\n\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\tspotLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdirection: {},\n\t\t\tdistance: {},\n\t\t\tconeCos: {},\n\t\t\tpenumbraCos: {},\n\t\t\tdecay: {},\n\n\t\t\tshadow: {},\n\t\t\tshadowBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tspotShadowMap: { value: [] },\n\t\tspotShadowMatrix: { value: [] },\n\n\t\tpointLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdecay: {},\n\t\t\tdistance: {},\n\n\t\t\tshadow: {},\n\t\t\tshadowBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {},\n\t\t\tshadowCameraNear: {},\n\t\t\tshadowCameraFar: {}\n\t\t} },\n\n\t\tpointShadowMap: { value: [] },\n\t\tpointShadowMatrix: { value: [] },\n\n\t\themisphereLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tskyColor: {},\n\t\t\tgroundColor: {}\n\t\t} },\n\n\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\trectAreaLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\twidth: {},\n\t\t\theight: {}\n\t\t} }\n\n\t},\n\n\tpoints: {\n\n\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\topacity: { value: 1.0 },\n\t\tsize: { value: 1.0 },\n\t\tscale: { value: 1.0 },\n\t\tmap: { value: null },\n\t\tuvTransform: { value: new Matrix3() }\n\n\t}\n\n};\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author mrdoob / http://mrdoob.com/\n * @author mikael emtinger / http://gomo.se/\n */\n\nvar ShaderLib = {\n\n\tbasic: {\n\n\t\tuniforms: UniformsUtils.merge( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t},\n\n\tlambert: {\n\n\t\tuniforms: UniformsUtils.merge( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t},\n\n\tphong: {\n\n\t\tuniforms: UniformsUtils.merge( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.gradientmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\tspecular: { value: new Color( 0x111111 ) },\n\t\t\t\tshininess: { value: 30 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t},\n\n\tstandard: {\n\n\t\tuniforms: UniformsUtils.merge( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.roughnessmap,\n\t\t\tUniformsLib.metalnessmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\troughness: { value: 0.5 },\n\t\t\t\tmetalness: { value: 0.5 },\n\t\t\t\tenvMapIntensity: { value: 1 } // temporary\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t},\n\n\tpoints: {\n\n\t\tuniforms: UniformsUtils.merge( [\n\t\t\tUniformsLib.points,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.points_vert,\n\t\tfragmentShader: ShaderChunk.points_frag\n\n\t},\n\n\tdashed: {\n\n\t\tuniforms: UniformsUtils.merge( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tscale: { value: 1 },\n\t\t\t\tdashSize: { value: 1 },\n\t\t\t\ttotalSize: { value: 2 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t},\n\n\tdepth: {\n\n\t\tuniforms: UniformsUtils.merge( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.depth_vert,\n\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t},\n\n\tnormal: {\n\n\t\tuniforms: UniformsUtils.merge( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.normal_vert,\n\t\tfragmentShader: ShaderChunk.normal_frag\n\n\t},\n\n\t/* -------------------------------------------------------------------------\n\t//\tCube map shader\n\t ------------------------------------------------------------------------- */\n\n\tcube: {\n\n\t\tuniforms: {\n\t\t\ttCube: { value: null },\n\t\t\ttFlip: { value: - 1 },\n\t\t\topacity: { value: 1.0 }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.cube_vert,\n\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t},\n\n\tequirect: {\n\n\t\tuniforms: {\n\t\t\ttEquirect: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t},\n\n\tdistanceRGBA: {\n\n\t\tuniforms: UniformsUtils.merge( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\treferencePosition: { value: new Vector3() },\n\t\t\t\tnearDistance: { value: 1 },\n\t\t\t\tfarDistance: { value: 1000 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t},\n\n\tshadow: {\n\n\t\tuniforms: UniformsUtils.merge( [\n\t\t\tUniformsLib.lights,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tcolor: { value: new Color( 0x00000 ) },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.shadow_vert,\n\t\tfragmentShader: ShaderChunk.shadow_frag\n\n\t}\n\n};\n\nShaderLib.physical = {\n\n\tuniforms: UniformsUtils.merge( [\n\t\tShaderLib.standard.uniforms,\n\t\t{\n\t\t\tclearCoat: { value: 0 },\n\t\t\tclearCoatRoughness: { value: 0 }\n\t\t}\n\t] ),\n\n\tvertexShader: ShaderChunk.meshphysical_vert,\n\tfragmentShader: ShaderChunk.meshphysical_frag\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLAttributes( gl ) {\n\n\tvar buffers = new WeakMap();\n\n\tfunction createBuffer( attribute, bufferType ) {\n\n\t\tvar array = attribute.array;\n\t\tvar usage = attribute.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW;\n\n\t\tvar buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\t\tgl.bufferData( bufferType, array, usage );\n\n\t\tattribute.onUploadCallback();\n\n\t\tvar type = gl.FLOAT;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\ttype = gl.FLOAT;\n\n\t\t} else if ( array instanceof Float64Array ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.' );\n\n\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\ttype = gl.UNSIGNED_SHORT;\n\n\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\ttype = gl.SHORT;\n\n\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\ttype = gl.UNSIGNED_INT;\n\n\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\ttype = gl.INT;\n\n\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\ttype = gl.BYTE;\n\n\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t}\n\n\t\treturn {\n\t\t\tbuffer: buffer,\n\t\t\ttype: type,\n\t\t\tbytesPerElement: array.BYTES_PER_ELEMENT,\n\t\t\tversion: attribute.version\n\t\t};\n\n\t}\n\n\tfunction updateBuffer( buffer, attribute, bufferType ) {\n\n\t\tvar array = attribute.array;\n\t\tvar updateRange = attribute.updateRange;\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\n\t\tif ( attribute.dynamic === false ) {\n\n\t\t\tgl.bufferData( bufferType, array, gl.STATIC_DRAW );\n\n\t\t} else if ( updateRange.count === - 1 ) {\n\n\t\t\t// Not using update ranges\n\n\t\t\tgl.bufferSubData( bufferType, 0, array );\n\n\t\t} else if ( updateRange.count === 0 ) {\n\n\t\t\tconsole.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' );\n\n\t\t} else {\n\n\t\t\tgl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\tarray.subarray( updateRange.offset, updateRange.offset + updateRange.count ) );\n\n\t\t\tupdateRange.count = - 1; // reset range\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction get( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\treturn buffers.get( attribute );\n\n\t}\n\n\tfunction remove( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tvar data = buffers.get( attribute );\n\n\t\tif ( data ) {\n\n\t\t\tgl.deleteBuffer( data.buffer );\n\n\t\t\tbuffers.delete( attribute );\n\n\t\t}\n\n\t}\n\n\tfunction update( attribute, bufferType ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tvar data = buffers.get( attribute );\n\n\t\tif ( data === undefined ) {\n\n\t\t\tbuffers.set( attribute, createBuffer( attribute, bufferType ) );\n\n\t\t} else if ( data.version < attribute.version ) {\n\n\t\t\tupdateBuffer( data.buffer, attribute, bufferType );\n\n\t\t\tdata.version = attribute.version;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update\n\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author WestLangley / http://github.com/WestLangley\n * @author bhouston / http://clara.io\n */\n\nfunction Euler( x, y, z, order ) {\n\n\tthis._x = x || 0;\n\tthis._y = y || 0;\n\tthis._z = z || 0;\n\tthis._order = order || Euler.DefaultOrder;\n\n}\n\nEuler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];\n\nEuler.DefaultOrder = 'XYZ';\n\nObject.defineProperties( Euler.prototype, {\n\n\tx: {\n\n\t\tget: function () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t}\n\n\t},\n\n\ty: {\n\n\t\tget: function () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t}\n\n\t},\n\n\tz: {\n\n\t\tget: function () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t}\n\n\t},\n\n\torder: {\n\n\t\tget: function () {\n\n\t\t\treturn this._order;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._order = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t}\n\n\t}\n\n} );\n\nObject.assign( Euler.prototype, {\n\n\tisEuler: true,\n\n\tset: function ( x, y, z, order ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order || this._order;\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t},\n\n\tcopy: function ( euler ) {\n\n\t\tthis._x = euler._x;\n\t\tthis._y = euler._y;\n\t\tthis._z = euler._z;\n\t\tthis._order = euler._order;\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tsetFromRotationMatrix: function ( m, order, update ) {\n\n\t\tvar clamp = _Math.clamp;\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tvar te = m.elements;\n\t\tvar m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\tvar m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\tvar m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\torder = order || this._order;\n\n\t\tif ( order === 'XYZ' ) {\n\n\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\tif ( Math.abs( m13 ) < 0.99999 ) {\n\n\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\tthis._z = 0;\n\n\t\t\t}\n\n\t\t} else if ( order === 'YXZ' ) {\n\n\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\tif ( Math.abs( m23 ) < 0.99999 ) {\n\n\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t} else {\n\n\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\tthis._z = 0;\n\n\t\t\t}\n\n\t\t} else if ( order === 'ZXY' ) {\n\n\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\tif ( Math.abs( m32 ) < 0.99999 ) {\n\n\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t} else {\n\n\t\t\t\tthis._y = 0;\n\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t}\n\n\t\t} else if ( order === 'ZYX' ) {\n\n\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\tif ( Math.abs( m31 ) < 0.99999 ) {\n\n\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t}\n\n\t\t} else if ( order === 'YZX' ) {\n\n\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\tif ( Math.abs( m21 ) < 0.99999 ) {\n\n\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t}\n\n\t\t} else if ( order === 'XZY' ) {\n\n\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\tif ( Math.abs( m12 ) < 0.99999 ) {\n\n\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\tthis._y = 0;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order );\n\n\t\t}\n\n\t\tthis._order = order;\n\n\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tsetFromQuaternion: function () {\n\n\t\tvar matrix = new Matrix4();\n\n\t\treturn function setFromQuaternion( q, order, update ) {\n\n\t\t\tmatrix.makeRotationFromQuaternion( q );\n\n\t\t\treturn this.setFromRotationMatrix( matrix, order, update );\n\n\t\t};\n\n\t}(),\n\n\tsetFromVector3: function ( v, order ) {\n\n\t\treturn this.set( v.x, v.y, v.z, order || this._order );\n\n\t},\n\n\treorder: function () {\n\n\t\t// WARNING: this discards revolution information -bhouston\n\n\t\tvar q = new Quaternion();\n\n\t\treturn function reorder( newOrder ) {\n\n\t\t\tq.setFromEuler( this );\n\n\t\t\treturn this.setFromQuaternion( q, newOrder );\n\n\t\t};\n\n\t}(),\n\n\tequals: function ( euler ) {\n\n\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t},\n\n\tfromArray: function ( array ) {\n\n\t\tthis._x = array[ 0 ];\n\t\tthis._y = array[ 1 ];\n\t\tthis._z = array[ 2 ];\n\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._order;\n\n\t\treturn array;\n\n\t},\n\n\ttoVector3: function ( optionalResult ) {\n\n\t\tif ( optionalResult ) {\n\n\t\t\treturn optionalResult.set( this._x, this._y, this._z );\n\n\t\t} else {\n\n\t\t\treturn new Vector3( this._x, this._y, this._z );\n\n\t\t}\n\n\t},\n\n\tonChange: function ( callback ) {\n\n\t\tthis.onChangeCallback = callback;\n\n\t\treturn this;\n\n\t},\n\n\tonChangeCallback: function () {}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction Layers() {\n\n\tthis.mask = 1 | 0;\n\n}\n\nObject.assign( Layers.prototype, {\n\n\tset: function ( channel ) {\n\n\t\tthis.mask = 1 << channel | 0;\n\n\t},\n\n\tenable: function ( channel ) {\n\n\t\tthis.mask |= 1 << channel | 0;\n\n\t},\n\n\ttoggle: function ( channel ) {\n\n\t\tthis.mask ^= 1 << channel | 0;\n\n\t},\n\n\tdisable: function ( channel ) {\n\n\t\tthis.mask &= ~ ( 1 << channel | 0 );\n\n\t},\n\n\ttest: function ( layers ) {\n\n\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author mikael emtinger / http://gomo.se/\n * @author alteredq / http://alteredqualia.com/\n * @author WestLangley / http://github.com/WestLangley\n * @author elephantatwork / www.elephantatwork.ch\n */\n\nvar object3DId = 0;\n\nfunction Object3D() {\n\n\tObject.defineProperty( this, 'id', { value: object3DId ++ } );\n\n\tthis.uuid = _Math.generateUUID();\n\n\tthis.name = '';\n\tthis.type = 'Object3D';\n\n\tthis.parent = null;\n\tthis.children = [];\n\n\tthis.up = Object3D.DefaultUp.clone();\n\n\tvar position = new Vector3();\n\tvar rotation = new Euler();\n\tvar quaternion = new Quaternion();\n\tvar scale = new Vector3( 1, 1, 1 );\n\n\tfunction onRotationChange() {\n\n\t\tquaternion.setFromEuler( rotation, false );\n\n\t}\n\n\tfunction onQuaternionChange() {\n\n\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t}\n\n\trotation.onChange( onRotationChange );\n\tquaternion.onChange( onQuaternionChange );\n\n\tObject.defineProperties( this, {\n\t\tposition: {\n\t\t\tenumerable: true,\n\t\t\tvalue: position\n\t\t},\n\t\trotation: {\n\t\t\tenumerable: true,\n\t\t\tvalue: rotation\n\t\t},\n\t\tquaternion: {\n\t\t\tenumerable: true,\n\t\t\tvalue: quaternion\n\t\t},\n\t\tscale: {\n\t\t\tenumerable: true,\n\t\t\tvalue: scale\n\t\t},\n\t\tmodelViewMatrix: {\n\t\t\tvalue: new Matrix4()\n\t\t},\n\t\tnormalMatrix: {\n\t\t\tvalue: new Matrix3()\n\t\t}\n\t} );\n\n\tthis.matrix = new Matrix4();\n\tthis.matrixWorld = new Matrix4();\n\n\tthis.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate;\n\tthis.matrixWorldNeedsUpdate = false;\n\n\tthis.layers = new Layers();\n\tthis.visible = true;\n\n\tthis.castShadow = false;\n\tthis.receiveShadow = false;\n\n\tthis.frustumCulled = true;\n\tthis.renderOrder = 0;\n\n\tthis.userData = {};\n\n}\n\nObject3D.DefaultUp = new Vector3( 0, 1, 0 );\nObject3D.DefaultMatrixAutoUpdate = true;\n\nObject3D.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: Object3D,\n\n\tisObject3D: true,\n\n\tonBeforeRender: function () {},\n\tonAfterRender: function () {},\n\n\tapplyMatrix: function ( matrix ) {\n\n\t\tthis.matrix.multiplyMatrices( matrix, this.matrix );\n\n\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t},\n\n\tapplyQuaternion: function ( q ) {\n\n\t\tthis.quaternion.premultiply( q );\n\n\t\treturn this;\n\n\t},\n\n\tsetRotationFromAxisAngle: function ( axis, angle ) {\n\n\t\t// assumes axis is normalized\n\n\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t},\n\n\tsetRotationFromEuler: function ( euler ) {\n\n\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t},\n\n\tsetRotationFromMatrix: function ( m ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t},\n\n\tsetRotationFromQuaternion: function ( q ) {\n\n\t\t// assumes q is normalized\n\n\t\tthis.quaternion.copy( q );\n\n\t},\n\n\trotateOnAxis: function () {\n\n\t\t// rotate object on axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\tvar q1 = new Quaternion();\n\n\t\treturn function rotateOnAxis( axis, angle ) {\n\n\t\t\tq1.setFromAxisAngle( axis, angle );\n\n\t\t\tthis.quaternion.multiply( q1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\trotateOnWorldAxis: function () {\n\n\t\t// rotate object on axis in world space\n\t\t// axis is assumed to be normalized\n\t\t// method assumes no rotated parent\n\n\t\tvar q1 = new Quaternion();\n\n\t\treturn function rotateOnWorldAxis( axis, angle ) {\n\n\t\t\tq1.setFromAxisAngle( axis, angle );\n\n\t\t\tthis.quaternion.premultiply( q1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\trotateX: function () {\n\n\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\treturn function rotateX( angle ) {\n\n\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t};\n\n\t}(),\n\n\trotateY: function () {\n\n\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\treturn function rotateY( angle ) {\n\n\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t};\n\n\t}(),\n\n\trotateZ: function () {\n\n\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\treturn function rotateZ( angle ) {\n\n\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t};\n\n\t}(),\n\n\ttranslateOnAxis: function () {\n\n\t\t// translate object by distance along axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function translateOnAxis( axis, distance ) {\n\n\t\t\tv1.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\t\tthis.position.add( v1.multiplyScalar( distance ) );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\ttranslateX: function () {\n\n\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\treturn function translateX( distance ) {\n\n\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t};\n\n\t}(),\n\n\ttranslateY: function () {\n\n\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\treturn function translateY( distance ) {\n\n\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t};\n\n\t}(),\n\n\ttranslateZ: function () {\n\n\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\treturn function translateZ( distance ) {\n\n\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t};\n\n\t}(),\n\n\tlocalToWorld: function ( vector ) {\n\n\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t},\n\n\tworldToLocal: function () {\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function worldToLocal( vector ) {\n\n\t\t\treturn vector.applyMatrix4( m1.getInverse( this.matrixWorld ) );\n\n\t\t};\n\n\t}(),\n\n\tlookAt: function () {\n\n\t\t// This method does not support objects with rotated and/or translated parent(s)\n\n\t\tvar m1 = new Matrix4();\n\t\tvar vector = new Vector3();\n\n\t\treturn function lookAt( x, y, z ) {\n\n\t\t\tif ( x.isVector3 ) {\n\n\t\t\t\tvector.copy( x );\n\n\t\t\t} else {\n\n\t\t\t\tvector.set( x, y, z );\n\n\t\t\t}\n\n\t\t\tif ( this.isCamera ) {\n\n\t\t\t\tm1.lookAt( this.position, vector, this.up );\n\n\t\t\t} else {\n\n\t\t\t\tm1.lookAt( vector, this.position, this.up );\n\n\t\t\t}\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t};\n\n\t}(),\n\n\tadd: function ( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object === this ) {\n\n\t\t\tconsole.error( \"THREE.Object3D.add: object can't be added as a child of itself.\", object );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( ( object && object.isObject3D ) ) {\n\n\t\t\tif ( object.parent !== null ) {\n\n\t\t\t\tobject.parent.remove( object );\n\n\t\t\t}\n\n\t\t\tobject.parent = this;\n\t\t\tobject.dispatchEvent( { type: 'added' } );\n\n\t\t\tthis.children.push( object );\n\n\t\t} else {\n\n\t\t\tconsole.error( \"THREE.Object3D.add: object not an instance of THREE.Object3D.\", object );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tremove: function ( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tvar index = this.children.indexOf( object );\n\n\t\tif ( index !== - 1 ) {\n\n\t\t\tobject.parent = null;\n\n\t\t\tobject.dispatchEvent( { type: 'removed' } );\n\n\t\t\tthis.children.splice( index, 1 );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetObjectById: function ( id ) {\n\n\t\treturn this.getObjectByProperty( 'id', id );\n\n\t},\n\n\tgetObjectByName: function ( name ) {\n\n\t\treturn this.getObjectByProperty( 'name', name );\n\n\t},\n\n\tgetObjectByProperty: function ( name, value ) {\n\n\t\tif ( this[ name ] === value ) return this;\n\n\t\tfor ( var i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\tvar child = this.children[ i ];\n\t\t\tvar object = child.getObjectByProperty( name, value );\n\n\t\t\tif ( object !== undefined ) {\n\n\t\t\t\treturn object;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t},\n\n\tgetWorldPosition: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .getWorldPosition() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\tthis.updateMatrixWorld( true );\n\n\t\treturn target.setFromMatrixPosition( this.matrixWorld );\n\n\t},\n\n\tgetWorldQuaternion: function () {\n\n\t\tvar position = new Vector3();\n\t\tvar scale = new Vector3();\n\n\t\treturn function getWorldQuaternion( target ) {\n\n\t\t\tif ( target === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .getWorldQuaternion() target is now required' );\n\t\t\t\ttarget = new Quaternion();\n\n\t\t\t}\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\tthis.matrixWorld.decompose( position, target, scale );\n\n\t\t\treturn target;\n\n\t\t};\n\n\t}(),\n\n\tgetWorldScale: function () {\n\n\t\tvar position = new Vector3();\n\t\tvar quaternion = new Quaternion();\n\n\t\treturn function getWorldScale( target ) {\n\n\t\t\tif ( target === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .getWorldScale() target is now required' );\n\t\t\t\ttarget = new Vector3();\n\n\t\t\t}\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\tthis.matrixWorld.decompose( position, quaternion, target );\n\n\t\t\treturn target;\n\n\t\t};\n\n\t}(),\n\n\tgetWorldDirection: function () {\n\n\t\tvar quaternion = new Quaternion();\n\n\t\treturn function getWorldDirection( target ) {\n\n\t\t\tif ( target === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .getWorldDirection() target is now required' );\n\t\t\t\ttarget = new Vector3();\n\n\t\t\t}\n\n\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\treturn target.set( 0, 0, 1 ).applyQuaternion( quaternion );\n\n\t\t};\n\n\t}(),\n\n\traycast: function () {},\n\n\ttraverse: function ( callback ) {\n\n\t\tcallback( this );\n\n\t\tvar children = this.children;\n\n\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverse( callback );\n\n\t\t}\n\n\t},\n\n\ttraverseVisible: function ( callback ) {\n\n\t\tif ( this.visible === false ) return;\n\n\t\tcallback( this );\n\n\t\tvar children = this.children;\n\n\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t}\n\n\t},\n\n\ttraverseAncestors: function ( callback ) {\n\n\t\tvar parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tcallback( parent );\n\n\t\t\tparent.traverseAncestors( callback );\n\n\t\t}\n\n\t},\n\n\tupdateMatrix: function () {\n\n\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t},\n\n\tupdateMatrixWorld: function ( force ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldNeedsUpdate || force ) {\n\n\t\t\tif ( this.parent === null ) {\n\n\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\n\t\t}\n\n\t\t// update children\n\n\t\tvar children = this.children;\n\n\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].updateMatrixWorld( force );\n\n\t\t}\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\t// meta is a string when called from JSON.stringify\n\t\tvar isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tvar output = {};\n\n\t\t// meta is a hash used to collect geometries, materials.\n\t\t// not providing it implies that this is the root object\n\t\t// being serialized.\n\t\tif ( isRootObject ) {\n\n\t\t\t// initialize meta obj\n\t\t\tmeta = {\n\t\t\t\tgeometries: {},\n\t\t\t\tmaterials: {},\n\t\t\t\ttextures: {},\n\t\t\t\timages: {},\n\t\t\t\tshapes: {}\n\t\t\t};\n\n\t\t\toutput.metadata = {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Object',\n\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t};\n\n\t\t}\n\n\t\t// standard Object3D serialization\n\n\t\tvar object = {};\n\n\t\tobject.uuid = this.uuid;\n\t\tobject.type = this.type;\n\n\t\tif ( this.name !== '' ) object.name = this.name;\n\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\tif ( this.visible === false ) object.visible = false;\n\t\tif ( this.frustumCulled === false ) object.frustumCulled = false;\n\t\tif ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder;\n\t\tif ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;\n\n\t\tobject.matrix = this.matrix.toArray();\n\n\t\tif ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false;\n\n\t\t//\n\n\t\tfunction serialize( library, element ) {\n\n\t\t\tif ( library[ element.uuid ] === undefined ) {\n\n\t\t\t\tlibrary[ element.uuid ] = element.toJSON( meta );\n\n\t\t\t}\n\n\t\t\treturn element.uuid;\n\n\t\t}\n\n\t\tif ( this.geometry !== undefined ) {\n\n\t\t\tobject.geometry = serialize( meta.geometries, this.geometry );\n\n\t\t\tvar parameters = this.geometry.parameters;\n\n\t\t\tif ( parameters !== undefined && parameters.shapes !== undefined ) {\n\n\t\t\t\tvar shapes = parameters.shapes;\n\n\t\t\t\tif ( Array.isArray( shapes ) ) {\n\n\t\t\t\t\tfor ( var i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tvar shape = shapes[ i ];\n\n\t\t\t\t\t\tserialize( meta.shapes, shape );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tserialize( meta.shapes, shapes );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.material !== undefined ) {\n\n\t\t\tif ( Array.isArray( this.material ) ) {\n\n\t\t\t\tvar uuids = [];\n\n\t\t\t\tfor ( var i = 0, l = this.material.length; i < l; i ++ ) {\n\n\t\t\t\t\tuuids.push( serialize( meta.materials, this.material[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = uuids;\n\n\t\t\t} else {\n\n\t\t\t\tobject.material = serialize( meta.materials, this.material );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.children.length > 0 ) {\n\n\t\t\tobject.children = [];\n\n\t\t\tfor ( var i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tvar geometries = extractFromCache( meta.geometries );\n\t\t\tvar materials = extractFromCache( meta.materials );\n\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\tvar images = extractFromCache( meta.images );\n\t\t\tvar shapes = extractFromCache( meta.shapes );\n\n\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\tif ( images.length > 0 ) output.images = images;\n\t\t\tif ( shapes.length > 0 ) output.shapes = shapes;\n\n\t\t}\n\n\t\toutput.object = object;\n\n\t\treturn output;\n\n\t\t// extract data from the cache hash\n\t\t// remove metadata on each item\n\t\t// and return as array\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tvar values = [];\n\t\t\tfor ( var key in cache ) {\n\n\t\t\t\tvar data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\t\t\treturn values;\n\n\t\t}\n\n\t},\n\n\tclone: function ( recursive ) {\n\n\t\treturn new this.constructor().copy( this, recursive );\n\n\t},\n\n\tcopy: function ( source, recursive ) {\n\n\t\tif ( recursive === undefined ) recursive = true;\n\n\t\tthis.name = source.name;\n\n\t\tthis.up.copy( source.up );\n\n\t\tthis.position.copy( source.position );\n\t\tthis.quaternion.copy( source.quaternion );\n\t\tthis.scale.copy( source.scale );\n\n\t\tthis.matrix.copy( source.matrix );\n\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\tthis.layers.mask = source.layers.mask;\n\t\tthis.visible = source.visible;\n\n\t\tthis.castShadow = source.castShadow;\n\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\tthis.frustumCulled = source.frustumCulled;\n\t\tthis.renderOrder = source.renderOrder;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tfor ( var i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\tvar child = source.children[ i ];\n\t\t\t\tthis.add( child.clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author mikael emtinger / http://gomo.se/\n * @author WestLangley / http://github.com/WestLangley\n*/\n\nfunction Camera() {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Camera';\n\n\tthis.matrixWorldInverse = new Matrix4();\n\tthis.projectionMatrix = new Matrix4();\n\n}\n\nCamera.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Camera,\n\n\tisCamera: true,\n\n\tcopy: function ( source, recursive ) {\n\n\t\tObject3D.prototype.copy.call( this, source, recursive );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\n\t\treturn this;\n\n\t},\n\n\tgetWorldDirection: function () {\n\n\t\tvar quaternion = new Quaternion();\n\n\t\treturn function getWorldDirection( target ) {\n\n\t\t\tif ( target === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Camera: .getWorldDirection() target is now required' );\n\t\t\t\ttarget = new Vector3();\n\n\t\t\t}\n\n\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\treturn target.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t};\n\n\t}(),\n\n\tupdateMatrixWorld: function ( force ) {\n\n\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\tthis.matrixWorldInverse.getInverse( this.matrixWorld );\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n} );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author arose / http://github.com/arose\n */\n\nfunction OrthographicCamera( left, right, top, bottom, near, far ) {\n\n\tCamera.call( this );\n\n\tthis.type = 'OrthographicCamera';\n\n\tthis.zoom = 1;\n\tthis.view = null;\n\n\tthis.left = left;\n\tthis.right = right;\n\tthis.top = top;\n\tthis.bottom = bottom;\n\n\tthis.near = ( near !== undefined ) ? near : 0.1;\n\tthis.far = ( far !== undefined ) ? far : 2000;\n\n\tthis.updateProjectionMatrix();\n\n}\n\nOrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\tconstructor: OrthographicCamera,\n\n\tisOrthographicCamera: true,\n\n\tcopy: function ( source, recursive ) {\n\n\t\tCamera.prototype.copy.call( this, source, recursive );\n\n\t\tthis.left = source.left;\n\t\tthis.right = source.right;\n\t\tthis.top = source.top;\n\t\tthis.bottom = source.bottom;\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\n\t\tthis.zoom = source.zoom;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\treturn this;\n\n\t},\n\n\tsetViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t},\n\n\tclearViewOffset: function () {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t},\n\n\tupdateProjectionMatrix: function () {\n\n\t\tvar dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\tvar dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\tvar cx = ( this.right + this.left ) / 2;\n\t\tvar cy = ( this.top + this.bottom ) / 2;\n\n\t\tvar left = cx - dx;\n\t\tvar right = cx + dx;\n\t\tvar top = cy + dy;\n\t\tvar bottom = cy - dy;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tvar zoomW = this.zoom / ( this.view.width / this.view.fullWidth );\n\t\t\tvar zoomH = this.zoom / ( this.view.height / this.view.fullHeight );\n\t\t\tvar scaleW = ( this.right - this.left ) / this.view.width;\n\t\t\tvar scaleH = ( this.top - this.bottom ) / this.view.height;\n\n\t\t\tleft += scaleW * ( this.view.offsetX / zoomW );\n\t\t\tright = left + scaleW * ( this.view.width / zoomW );\n\t\t\ttop -= scaleH * ( this.view.offsetY / zoomH );\n\t\t\tbottom = top - scaleH * ( this.view.height / zoomH );\n\n\t\t}\n\n\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tdata.object.zoom = this.zoom;\n\t\tdata.object.left = this.left;\n\t\tdata.object.right = this.right;\n\t\tdata.object.top = this.top;\n\t\tdata.object.bottom = this.bottom;\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\treturn data;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction Face3( a, b, c, normal, color, materialIndex ) {\n\n\tthis.a = a;\n\tthis.b = b;\n\tthis.c = c;\n\n\tthis.normal = ( normal && normal.isVector3 ) ? normal : new Vector3();\n\tthis.vertexNormals = Array.isArray( normal ) ? normal : [];\n\n\tthis.color = ( color && color.isColor ) ? color : new Color();\n\tthis.vertexColors = Array.isArray( color ) ? color : [];\n\n\tthis.materialIndex = materialIndex !== undefined ? materialIndex : 0;\n\n}\n\nObject.assign( Face3.prototype, {\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.a = source.a;\n\t\tthis.b = source.b;\n\t\tthis.c = source.c;\n\n\t\tthis.normal.copy( source.normal );\n\t\tthis.color.copy( source.color );\n\n\t\tthis.materialIndex = source.materialIndex;\n\n\t\tfor ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\tthis.vertexNormals[ i ] = source.vertexNormals[ i ].clone();\n\n\t\t}\n\n\t\tfor ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) {\n\n\t\t\tthis.vertexColors[ i ] = source.vertexColors[ i ].clone();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author kile / http://kile.stravaganza.org/\n * @author alteredq / http://alteredqualia.com/\n * @author mikael emtinger / http://gomo.se/\n * @author zz85 / http://www.lab4games.net/zz85/blog\n * @author bhouston / http://clara.io\n */\n\nvar geometryId = 0; // Geometry uses even numbers as Id\n\nfunction Geometry() {\n\n\tObject.defineProperty( this, 'id', { value: geometryId += 2 } );\n\n\tthis.uuid = _Math.generateUUID();\n\n\tthis.name = '';\n\tthis.type = 'Geometry';\n\n\tthis.vertices = [];\n\tthis.colors = [];\n\tthis.faces = [];\n\tthis.faceVertexUvs = [[]];\n\n\tthis.morphTargets = [];\n\tthis.morphNormals = [];\n\n\tthis.skinWeights = [];\n\tthis.skinIndices = [];\n\n\tthis.lineDistances = [];\n\n\tthis.boundingBox = null;\n\tthis.boundingSphere = null;\n\n\t// update flags\n\n\tthis.elementsNeedUpdate = false;\n\tthis.verticesNeedUpdate = false;\n\tthis.uvsNeedUpdate = false;\n\tthis.normalsNeedUpdate = false;\n\tthis.colorsNeedUpdate = false;\n\tthis.lineDistancesNeedUpdate = false;\n\tthis.groupsNeedUpdate = false;\n\n}\n\nGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: Geometry,\n\n\tisGeometry: true,\n\n\tapplyMatrix: function ( matrix ) {\n\n\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\tfor ( var i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\tvar vertex = this.vertices[ i ];\n\t\t\tvertex.applyMatrix4( matrix );\n\n\t\t}\n\n\t\tfor ( var i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\tvar face = this.faces[ i ];\n\t\t\tface.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\tface.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\tthis.verticesNeedUpdate = true;\n\t\tthis.normalsNeedUpdate = true;\n\n\t\treturn this;\n\n\t},\n\n\trotateX: function () {\n\n\t\t// rotate geometry around world x-axis\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function rotateX( angle ) {\n\n\t\t\tm1.makeRotationX( angle );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\trotateY: function () {\n\n\t\t// rotate geometry around world y-axis\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function rotateY( angle ) {\n\n\t\t\tm1.makeRotationY( angle );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\trotateZ: function () {\n\n\t\t// rotate geometry around world z-axis\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function rotateZ( angle ) {\n\n\t\t\tm1.makeRotationZ( angle );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\ttranslate: function () {\n\n\t\t// translate geometry\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function translate( x, y, z ) {\n\n\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tscale: function () {\n\n\t\t// scale geometry\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function scale( x, y, z ) {\n\n\t\t\tm1.makeScale( x, y, z );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tlookAt: function () {\n\n\t\tvar obj = new Object3D();\n\n\t\treturn function lookAt( vector ) {\n\n\t\t\tobj.lookAt( vector );\n\n\t\t\tobj.updateMatrix();\n\n\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t};\n\n\t}(),\n\n\tfromBufferGeometry: function ( geometry ) {\n\n\t\tvar scope = this;\n\n\t\tvar indices = geometry.index !== null ? geometry.index.array : undefined;\n\t\tvar attributes = geometry.attributes;\n\n\t\tvar positions = attributes.position.array;\n\t\tvar normals = attributes.normal !== undefined ? attributes.normal.array : undefined;\n\t\tvar colors = attributes.color !== undefined ? attributes.color.array : undefined;\n\t\tvar uvs = attributes.uv !== undefined ? attributes.uv.array : undefined;\n\t\tvar uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined;\n\n\t\tif ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = [];\n\n\t\tvar tempNormals = [];\n\t\tvar tempUVs = [];\n\t\tvar tempUVs2 = [];\n\n\t\tfor ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) {\n\n\t\t\tscope.vertices.push( new Vector3( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) );\n\n\t\t\tif ( normals !== undefined ) {\n\n\t\t\t\ttempNormals.push( new Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) );\n\n\t\t\t}\n\n\t\t\tif ( colors !== undefined ) {\n\n\t\t\t\tscope.colors.push( new Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) );\n\n\t\t\t}\n\n\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\ttempUVs.push( new Vector2( uvs[ j ], uvs[ j + 1 ] ) );\n\n\t\t\t}\n\n\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\ttempUVs2.push( new Vector2( uvs2[ j ], uvs2[ j + 1 ] ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction addFace( a, b, c, materialIndex ) {\n\n\t\t\tvar vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : [];\n\t\t\tvar vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : [];\n\n\t\t\tvar face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex );\n\n\t\t\tscope.faces.push( face );\n\n\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\tscope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] );\n\n\t\t\t}\n\n\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\tscope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar groups = geometry.groups;\n\n\t\tif ( groups.length > 0 ) {\n\n\t\t\tfor ( var i = 0; i < groups.length; i ++ ) {\n\n\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\tvar start = group.start;\n\t\t\t\tvar count = group.count;\n\n\t\t\t\tfor ( var j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\t\tif ( indices !== undefined ) {\n\n\t\t\t\t\t\taddFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\taddFace( j, j + 1, j + 2, group.materialIndex );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( indices !== undefined ) {\n\n\t\t\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t\taddFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( var i = 0; i < positions.length / 3; i += 3 ) {\n\n\t\t\t\t\taddFace( i, i + 1, i + 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.computeFaceNormals();\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t}\n\n\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcenter: function () {\n\n\t\tvar offset = new Vector3();\n\n\t\treturn function center() {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tthis.boundingBox.getCenter( offset ).negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tnormalize: function () {\n\n\t\tthis.computeBoundingSphere();\n\n\t\tvar center = this.boundingSphere.center;\n\t\tvar radius = this.boundingSphere.radius;\n\n\t\tvar s = radius === 0 ? 1 : 1.0 / radius;\n\n\t\tvar matrix = new Matrix4();\n\t\tmatrix.set(\n\t\t\ts, 0, 0, - s * center.x,\n\t\t\t0, s, 0, - s * center.y,\n\t\t\t0, 0, s, - s * center.z,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\tthis.applyMatrix( matrix );\n\n\t\treturn this;\n\n\t},\n\n\tcomputeFaceNormals: function () {\n\n\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\tfor ( var f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\tvar face = this.faces[ f ];\n\n\t\t\tvar vA = this.vertices[ face.a ];\n\t\t\tvar vB = this.vertices[ face.b ];\n\t\t\tvar vC = this.vertices[ face.c ];\n\n\t\t\tcb.subVectors( vC, vB );\n\t\t\tab.subVectors( vA, vB );\n\t\t\tcb.cross( ab );\n\n\t\t\tcb.normalize();\n\n\t\t\tface.normal.copy( cb );\n\n\t\t}\n\n\t},\n\n\tcomputeVertexNormals: function ( areaWeighted ) {\n\n\t\tif ( areaWeighted === undefined ) areaWeighted = true;\n\n\t\tvar v, vl, f, fl, face, vertices;\n\n\t\tvertices = new Array( this.vertices.length );\n\n\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\tvertices[ v ] = new Vector3();\n\n\t\t}\n\n\t\tif ( areaWeighted ) {\n\n\t\t\t// vertex normals weighted by triangle areas\n\t\t\t// http://www.iquilezles.org/www/articles/normals/normals.htm\n\n\t\t\tvar vA, vB, vC;\n\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvA = this.vertices[ face.a ];\n\t\t\t\tvB = this.vertices[ face.b ];\n\t\t\t\tvC = this.vertices[ face.c ];\n\n\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\tcb.cross( ab );\n\n\t\t\t\tvertices[ face.a ].add( cb );\n\t\t\t\tvertices[ face.b ].add( cb );\n\t\t\t\tvertices[ face.c ].add( cb );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvertices[ face.a ].add( face.normal );\n\t\t\t\tvertices[ face.b ].add( face.normal );\n\t\t\t\tvertices[ face.c ].add( face.normal );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\tvertices[ v ].normalize();\n\n\t\t}\n\n\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\tface = this.faces[ f ];\n\n\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\tvertexNormals[ 0 ].copy( vertices[ face.a ] );\n\t\t\t\tvertexNormals[ 1 ].copy( vertices[ face.b ] );\n\t\t\t\tvertexNormals[ 2 ].copy( vertices[ face.c ] );\n\n\t\t\t} else {\n\n\t\t\t\tvertexNormals[ 0 ] = vertices[ face.a ].clone();\n\t\t\t\tvertexNormals[ 1 ] = vertices[ face.b ].clone();\n\t\t\t\tvertexNormals[ 2 ] = vertices[ face.c ].clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.faces.length > 0 ) {\n\n\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t}\n\n\t},\n\n\tcomputeFlatVertexNormals: function () {\n\n\t\tvar f, fl, face;\n\n\t\tthis.computeFaceNormals();\n\n\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\tface = this.faces[ f ];\n\n\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\tvertexNormals[ 0 ].copy( face.normal );\n\t\t\t\tvertexNormals[ 1 ].copy( face.normal );\n\t\t\t\tvertexNormals[ 2 ].copy( face.normal );\n\n\t\t\t} else {\n\n\t\t\t\tvertexNormals[ 0 ] = face.normal.clone();\n\t\t\t\tvertexNormals[ 1 ] = face.normal.clone();\n\t\t\t\tvertexNormals[ 2 ] = face.normal.clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.faces.length > 0 ) {\n\n\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t}\n\n\t},\n\n\tcomputeMorphNormals: function () {\n\n\t\tvar i, il, f, fl, face;\n\n\t\t// save original normals\n\t\t// - create temp variables on first access\n\t\t// otherwise just copy (for faster repeated calls)\n\n\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\tface = this.faces[ f ];\n\n\t\t\tif ( ! face.__originalFaceNormal ) {\n\n\t\t\t\tface.__originalFaceNormal = face.normal.clone();\n\n\t\t\t} else {\n\n\t\t\t\tface.__originalFaceNormal.copy( face.normal );\n\n\t\t\t}\n\n\t\t\tif ( ! face.__originalVertexNormals ) face.__originalVertexNormals = [];\n\n\t\t\tfor ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\tif ( ! face.__originalVertexNormals[ i ] ) {\n\n\t\t\t\t\tface.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tface.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// use temp geometry to compute face and vertex normals for each morph\n\n\t\tvar tmpGeo = new Geometry();\n\t\ttmpGeo.faces = this.faces;\n\n\t\tfor ( i = 0, il = this.morphTargets.length; i < il; i ++ ) {\n\n\t\t\t// create on first access\n\n\t\t\tif ( ! this.morphNormals[ i ] ) {\n\n\t\t\t\tthis.morphNormals[ i ] = {};\n\t\t\t\tthis.morphNormals[ i ].faceNormals = [];\n\t\t\t\tthis.morphNormals[ i ].vertexNormals = [];\n\n\t\t\t\tvar dstNormalsFace = this.morphNormals[ i ].faceNormals;\n\t\t\t\tvar dstNormalsVertex = this.morphNormals[ i ].vertexNormals;\n\n\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tfaceNormal = new Vector3();\n\t\t\t\t\tvertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() };\n\n\t\t\t\t\tdstNormalsFace.push( faceNormal );\n\t\t\t\t\tdstNormalsVertex.push( vertexNormals );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar morphNormals = this.morphNormals[ i ];\n\n\t\t\t// set vertices to morph target\n\n\t\t\ttmpGeo.vertices = this.morphTargets[ i ].vertices;\n\n\t\t\t// compute morph normals\n\n\t\t\ttmpGeo.computeFaceNormals();\n\t\t\ttmpGeo.computeVertexNormals();\n\n\t\t\t// store morph normals\n\n\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tfaceNormal = morphNormals.faceNormals[ f ];\n\t\t\t\tvertexNormals = morphNormals.vertexNormals[ f ];\n\n\t\t\t\tfaceNormal.copy( face.normal );\n\n\t\t\t\tvertexNormals.a.copy( face.vertexNormals[ 0 ] );\n\t\t\t\tvertexNormals.b.copy( face.vertexNormals[ 1 ] );\n\t\t\t\tvertexNormals.c.copy( face.vertexNormals[ 2 ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// restore original normals\n\n\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\tface = this.faces[ f ];\n\n\t\t\tface.normal = face.__originalFaceNormal;\n\t\t\tface.vertexNormals = face.__originalVertexNormals;\n\n\t\t}\n\n\t},\n\n\tcomputeBoundingBox: function () {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tthis.boundingBox.setFromPoints( this.vertices );\n\n\t},\n\n\tcomputeBoundingSphere: function () {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tthis.boundingSphere.setFromPoints( this.vertices );\n\n\t},\n\n\tmerge: function ( geometry, matrix, materialIndexOffset ) {\n\n\t\tif ( ! ( geometry && geometry.isGeometry ) ) {\n\n\t\t\tconsole.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry );\n\t\t\treturn;\n\n\t\t}\n\n\t\tvar normalMatrix,\n\t\t\tvertexOffset = this.vertices.length,\n\t\t\tvertices1 = this.vertices,\n\t\t\tvertices2 = geometry.vertices,\n\t\t\tfaces1 = this.faces,\n\t\t\tfaces2 = geometry.faces,\n\t\t\tuvs1 = this.faceVertexUvs[ 0 ],\n\t\t\tuvs2 = geometry.faceVertexUvs[ 0 ],\n\t\t\tcolors1 = this.colors,\n\t\t\tcolors2 = geometry.colors;\n\n\t\tif ( materialIndexOffset === undefined ) materialIndexOffset = 0;\n\n\t\tif ( matrix !== undefined ) {\n\n\t\t\tnormalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t}\n\n\t\t// vertices\n\n\t\tfor ( var i = 0, il = vertices2.length; i < il; i ++ ) {\n\n\t\t\tvar vertex = vertices2[ i ];\n\n\t\t\tvar vertexCopy = vertex.clone();\n\n\t\t\tif ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix );\n\n\t\t\tvertices1.push( vertexCopy );\n\n\t\t}\n\n\t\t// colors\n\n\t\tfor ( var i = 0, il = colors2.length; i < il; i ++ ) {\n\n\t\t\tcolors1.push( colors2[ i ].clone() );\n\n\t\t}\n\n\t\t// faces\n\n\t\tfor ( i = 0, il = faces2.length; i < il; i ++ ) {\n\n\t\t\tvar face = faces2[ i ], faceCopy, normal, color,\n\t\t\t\tfaceVertexNormals = face.vertexNormals,\n\t\t\t\tfaceVertexColors = face.vertexColors;\n\n\t\t\tfaceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset );\n\t\t\tfaceCopy.normal.copy( face.normal );\n\n\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\tfaceCopy.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t}\n\n\t\t\tfor ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\tnormal = faceVertexNormals[ j ].clone();\n\n\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\tnormal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.vertexNormals.push( normal );\n\n\t\t\t}\n\n\t\t\tfaceCopy.color.copy( face.color );\n\n\t\t\tfor ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {\n\n\t\t\t\tcolor = faceVertexColors[ j ];\n\t\t\t\tfaceCopy.vertexColors.push( color.clone() );\n\n\t\t\t}\n\n\t\t\tfaceCopy.materialIndex = face.materialIndex + materialIndexOffset;\n\n\t\t\tfaces1.push( faceCopy );\n\n\t\t}\n\n\t\t// uvs\n\n\t\tfor ( i = 0, il = uvs2.length; i < il; i ++ ) {\n\n\t\t\tvar uv = uvs2[ i ], uvCopy = [];\n\n\t\t\tif ( uv === undefined ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tfor ( var j = 0, jl = uv.length; j < jl; j ++ ) {\n\n\t\t\t\tuvCopy.push( uv[ j ].clone() );\n\n\t\t\t}\n\n\t\t\tuvs1.push( uvCopy );\n\n\t\t}\n\n\t},\n\n\tmergeMesh: function ( mesh ) {\n\n\t\tif ( ! ( mesh && mesh.isMesh ) ) {\n\n\t\t\tconsole.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( mesh.matrixAutoUpdate ) mesh.updateMatrix();\n\n\t\tthis.merge( mesh.geometry, mesh.matrix );\n\n\t},\n\n\t/*\n\t * Checks for duplicate vertices with hashmap.\n\t * Duplicated vertices are removed\n\t * and faces' vertices are updated.\n\t */\n\n\tmergeVertices: function () {\n\n\t\tvar verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique)\n\t\tvar unique = [], changes = [];\n\n\t\tvar v, key;\n\t\tvar precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001\n\t\tvar precision = Math.pow( 10, precisionPoints );\n\t\tvar i, il, face;\n\t\tvar indices, j, jl;\n\n\t\tfor ( i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\tv = this.vertices[ i ];\n\t\t\tkey = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision );\n\n\t\t\tif ( verticesMap[ key ] === undefined ) {\n\n\t\t\t\tverticesMap[ key ] = i;\n\t\t\t\tunique.push( this.vertices[ i ] );\n\t\t\t\tchanges[ i ] = unique.length - 1;\n\n\t\t\t} else {\n\n\t\t\t\t//console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);\n\t\t\t\tchanges[ i ] = changes[ verticesMap[ key ] ];\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// if faces are completely degenerate after merging vertices, we\n\t\t// have to remove them from the geometry.\n\t\tvar faceIndicesToRemove = [];\n\n\t\tfor ( i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\tface = this.faces[ i ];\n\n\t\t\tface.a = changes[ face.a ];\n\t\t\tface.b = changes[ face.b ];\n\t\t\tface.c = changes[ face.c ];\n\n\t\t\tindices = [ face.a, face.b, face.c ];\n\n\t\t\t// if any duplicate vertices are found in a Face3\n\t\t\t// we have to remove the face as nothing can be saved\n\t\t\tfor ( var n = 0; n < 3; n ++ ) {\n\n\t\t\t\tif ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) {\n\n\t\t\t\t\tfaceIndicesToRemove.push( i );\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) {\n\n\t\t\tvar idx = faceIndicesToRemove[ i ];\n\n\t\t\tthis.faces.splice( idx, 1 );\n\n\t\t\tfor ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\tthis.faceVertexUvs[ j ].splice( idx, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Use unique set of vertices\n\n\t\tvar diff = this.vertices.length - unique.length;\n\t\tthis.vertices = unique;\n\t\treturn diff;\n\n\t},\n\n\tsetFromPoints: function ( points ) {\n\n\t\tthis.vertices = [];\n\n\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tvar point = points[ i ];\n\t\t\tthis.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsortFacesByMaterialIndex: function () {\n\n\t\tvar faces = this.faces;\n\t\tvar length = faces.length;\n\n\t\t// tag faces\n\n\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\tfaces[ i ]._id = i;\n\n\t\t}\n\n\t\t// sort faces\n\n\t\tfunction materialIndexSort( a, b ) {\n\n\t\t\treturn a.materialIndex - b.materialIndex;\n\n\t\t}\n\n\t\tfaces.sort( materialIndexSort );\n\n\t\t// sort uvs\n\n\t\tvar uvs1 = this.faceVertexUvs[ 0 ];\n\t\tvar uvs2 = this.faceVertexUvs[ 1 ];\n\n\t\tvar newUvs1, newUvs2;\n\n\t\tif ( uvs1 && uvs1.length === length ) newUvs1 = [];\n\t\tif ( uvs2 && uvs2.length === length ) newUvs2 = [];\n\n\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\tvar id = faces[ i ]._id;\n\n\t\t\tif ( newUvs1 ) newUvs1.push( uvs1[ id ] );\n\t\t\tif ( newUvs2 ) newUvs2.push( uvs2[ id ] );\n\n\t\t}\n\n\t\tif ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1;\n\t\tif ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tvar data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Geometry',\n\t\t\t\tgenerator: 'Geometry.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard Geometry serialization\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tvar vertices = [];\n\n\t\tfor ( var i = 0; i < this.vertices.length; i ++ ) {\n\n\t\t\tvar vertex = this.vertices[ i ];\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tvar faces = [];\n\t\tvar normals = [];\n\t\tvar normalsHash = {};\n\t\tvar colors = [];\n\t\tvar colorsHash = {};\n\t\tvar uvs = [];\n\t\tvar uvsHash = {};\n\n\t\tfor ( var i = 0; i < this.faces.length; i ++ ) {\n\n\t\t\tvar face = this.faces[ i ];\n\n\t\t\tvar hasMaterial = true;\n\t\t\tvar hasFaceUv = false; // deprecated\n\t\t\tvar hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined;\n\t\t\tvar hasFaceNormal = face.normal.length() > 0;\n\t\t\tvar hasFaceVertexNormal = face.vertexNormals.length > 0;\n\t\t\tvar hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1;\n\t\t\tvar hasFaceVertexColor = face.vertexColors.length > 0;\n\n\t\t\tvar faceType = 0;\n\n\t\t\tfaceType = setBit( faceType, 0, 0 ); // isQuad\n\t\t\tfaceType = setBit( faceType, 1, hasMaterial );\n\t\t\tfaceType = setBit( faceType, 2, hasFaceUv );\n\t\t\tfaceType = setBit( faceType, 3, hasFaceVertexUv );\n\t\t\tfaceType = setBit( faceType, 4, hasFaceNormal );\n\t\t\tfaceType = setBit( faceType, 5, hasFaceVertexNormal );\n\t\t\tfaceType = setBit( faceType, 6, hasFaceColor );\n\t\t\tfaceType = setBit( faceType, 7, hasFaceVertexColor );\n\n\t\t\tfaces.push( faceType );\n\t\t\tfaces.push( face.a, face.b, face.c );\n\t\t\tfaces.push( face.materialIndex );\n\n\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\tvar faceVertexUvs = this.faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\tfaces.push(\n\t\t\t\t\tgetUvIndex( faceVertexUvs[ 0 ] ),\n\t\t\t\t\tgetUvIndex( faceVertexUvs[ 1 ] ),\n\t\t\t\t\tgetUvIndex( faceVertexUvs[ 2 ] )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\tfaces.push( getNormalIndex( face.normal ) );\n\n\t\t\t}\n\n\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tfaces.push(\n\t\t\t\t\tgetNormalIndex( vertexNormals[ 0 ] ),\n\t\t\t\t\tgetNormalIndex( vertexNormals[ 1 ] ),\n\t\t\t\t\tgetNormalIndex( vertexNormals[ 2 ] )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\tfaces.push( getColorIndex( face.color ) );\n\n\t\t\t}\n\n\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\tfaces.push(\n\t\t\t\t\tgetColorIndex( vertexColors[ 0 ] ),\n\t\t\t\t\tgetColorIndex( vertexColors[ 1 ] ),\n\t\t\t\t\tgetColorIndex( vertexColors[ 2 ] )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setBit( value, position, enabled ) {\n\n\t\t\treturn enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) );\n\n\t\t}\n\n\t\tfunction getNormalIndex( normal ) {\n\n\t\t\tvar hash = normal.x.toString() + normal.y.toString() + normal.z.toString();\n\n\t\t\tif ( normalsHash[ hash ] !== undefined ) {\n\n\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tnormalsHash[ hash ] = normals.length / 3;\n\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\treturn normalsHash[ hash ];\n\n\t\t}\n\n\t\tfunction getColorIndex( color ) {\n\n\t\t\tvar hash = color.r.toString() + color.g.toString() + color.b.toString();\n\n\t\t\tif ( colorsHash[ hash ] !== undefined ) {\n\n\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tcolorsHash[ hash ] = colors.length;\n\t\t\tcolors.push( color.getHex() );\n\n\t\t\treturn colorsHash[ hash ];\n\n\t\t}\n\n\t\tfunction getUvIndex( uv ) {\n\n\t\t\tvar hash = uv.x.toString() + uv.y.toString();\n\n\t\t\tif ( uvsHash[ hash ] !== undefined ) {\n\n\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tuvsHash[ hash ] = uvs.length / 2;\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\treturn uvsHash[ hash ];\n\n\t\t}\n\n\t\tdata.data = {};\n\n\t\tdata.data.vertices = vertices;\n\t\tdata.data.normals = normals;\n\t\tif ( colors.length > 0 ) data.data.colors = colors;\n\t\tif ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility\n\t\tdata.data.faces = faces;\n\n\t\treturn data;\n\n\t},\n\n\tclone: function () {\n\n\t\t/*\n\t\t // Handle primitives\n\n\t\t var parameters = this.parameters;\n\n\t\t if ( parameters !== undefined ) {\n\n\t\t var values = [];\n\n\t\t for ( var key in parameters ) {\n\n\t\t values.push( parameters[ key ] );\n\n\t\t }\n\n\t\t var geometry = Object.create( this.constructor.prototype );\n\t\t this.constructor.apply( geometry, values );\n\t\t return geometry;\n\n\t\t }\n\n\t\t return new this.constructor().copy( this );\n\t\t */\n\n\t\treturn new Geometry().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tvar i, il, j, jl, k, kl;\n\n\t\t// reset\n\n\t\tthis.vertices = [];\n\t\tthis.colors = [];\n\t\tthis.faces = [];\n\t\tthis.faceVertexUvs = [[]];\n\t\tthis.morphTargets = [];\n\t\tthis.morphNormals = [];\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\t\tthis.lineDistances = [];\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// vertices\n\n\t\tvar vertices = source.vertices;\n\n\t\tfor ( i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\tthis.vertices.push( vertices[ i ].clone() );\n\n\t\t}\n\n\t\t// colors\n\n\t\tvar colors = source.colors;\n\n\t\tfor ( i = 0, il = colors.length; i < il; i ++ ) {\n\n\t\t\tthis.colors.push( colors[ i ].clone() );\n\n\t\t}\n\n\t\t// faces\n\n\t\tvar faces = source.faces;\n\n\t\tfor ( i = 0, il = faces.length; i < il; i ++ ) {\n\n\t\t\tthis.faces.push( faces[ i ].clone() );\n\n\t\t}\n\n\t\t// face vertex uvs\n\n\t\tfor ( i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) {\n\n\t\t\tvar faceVertexUvs = source.faceVertexUvs[ i ];\n\n\t\t\tif ( this.faceVertexUvs[ i ] === undefined ) {\n\n\t\t\t\tthis.faceVertexUvs[ i ] = [];\n\n\t\t\t}\n\n\t\t\tfor ( j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\tvar uvs = faceVertexUvs[ j ], uvsCopy = [];\n\n\t\t\t\tfor ( k = 0, kl = uvs.length; k < kl; k ++ ) {\n\n\t\t\t\t\tvar uv = uvs[ k ];\n\n\t\t\t\t\tuvsCopy.push( uv.clone() );\n\n\t\t\t\t}\n\n\t\t\t\tthis.faceVertexUvs[ i ].push( uvsCopy );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// morph targets\n\n\t\tvar morphTargets = source.morphTargets;\n\n\t\tfor ( i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\tvar morphTarget = {};\n\t\t\tmorphTarget.name = morphTargets[ i ].name;\n\n\t\t\t// vertices\n\n\t\t\tif ( morphTargets[ i ].vertices !== undefined ) {\n\n\t\t\t\tmorphTarget.vertices = [];\n\n\t\t\t\tfor ( j = 0, jl = morphTargets[ i ].vertices.length; j < jl; j ++ ) {\n\n\t\t\t\t\tmorphTarget.vertices.push( morphTargets[ i ].vertices[ j ].clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// normals\n\n\t\t\tif ( morphTargets[ i ].normals !== undefined ) {\n\n\t\t\t\tmorphTarget.normals = [];\n\n\t\t\t\tfor ( j = 0, jl = morphTargets[ i ].normals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tmorphTarget.normals.push( morphTargets[ i ].normals[ j ].clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.morphTargets.push( morphTarget );\n\n\t\t}\n\n\t\t// morph normals\n\n\t\tvar morphNormals = source.morphNormals;\n\n\t\tfor ( i = 0, il = morphNormals.length; i < il; i ++ ) {\n\n\t\t\tvar morphNormal = {};\n\n\t\t\t// vertex normals\n\n\t\t\tif ( morphNormals[ i ].vertexNormals !== undefined ) {\n\n\t\t\t\tmorphNormal.vertexNormals = [];\n\n\t\t\t\tfor ( j = 0, jl = morphNormals[ i ].vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tvar srcVertexNormal = morphNormals[ i ].vertexNormals[ j ];\n\t\t\t\t\tvar destVertexNormal = {};\n\n\t\t\t\t\tdestVertexNormal.a = srcVertexNormal.a.clone();\n\t\t\t\t\tdestVertexNormal.b = srcVertexNormal.b.clone();\n\t\t\t\t\tdestVertexNormal.c = srcVertexNormal.c.clone();\n\n\t\t\t\t\tmorphNormal.vertexNormals.push( destVertexNormal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// face normals\n\n\t\t\tif ( morphNormals[ i ].faceNormals !== undefined ) {\n\n\t\t\t\tmorphNormal.faceNormals = [];\n\n\t\t\t\tfor ( j = 0, jl = morphNormals[ i ].faceNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tmorphNormal.faceNormals.push( morphNormals[ i ].faceNormals[ j ].clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.morphNormals.push( morphNormal );\n\n\t\t}\n\n\t\t// skin weights\n\n\t\tvar skinWeights = source.skinWeights;\n\n\t\tfor ( i = 0, il = skinWeights.length; i < il; i ++ ) {\n\n\t\t\tthis.skinWeights.push( skinWeights[ i ].clone() );\n\n\t\t}\n\n\t\t// skin indices\n\n\t\tvar skinIndices = source.skinIndices;\n\n\t\tfor ( i = 0, il = skinIndices.length; i < il; i ++ ) {\n\n\t\t\tthis.skinIndices.push( skinIndices[ i ].clone() );\n\n\t\t}\n\n\t\t// line distances\n\n\t\tvar lineDistances = source.lineDistances;\n\n\t\tfor ( i = 0, il = lineDistances.length; i < il; i ++ ) {\n\n\t\t\tthis.lineDistances.push( lineDistances[ i ] );\n\n\t\t}\n\n\t\t// bounding box\n\n\t\tvar boundingBox = source.boundingBox;\n\n\t\tif ( boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t}\n\n\t\t// bounding sphere\n\n\t\tvar boundingSphere = source.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t}\n\n\t\t// update flags\n\n\t\tthis.elementsNeedUpdate = source.elementsNeedUpdate;\n\t\tthis.verticesNeedUpdate = source.verticesNeedUpdate;\n\t\tthis.uvsNeedUpdate = source.uvsNeedUpdate;\n\t\tthis.normalsNeedUpdate = source.normalsNeedUpdate;\n\t\tthis.colorsNeedUpdate = source.colorsNeedUpdate;\n\t\tthis.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate;\n\t\tthis.groupsNeedUpdate = source.groupsNeedUpdate;\n\n\t\treturn this;\n\n\t},\n\n\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction BufferAttribute( array, itemSize, normalized ) {\n\n\tif ( Array.isArray( array ) ) {\n\n\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t}\n\n\tthis.name = '';\n\n\tthis.array = array;\n\tthis.itemSize = itemSize;\n\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\tthis.normalized = normalized === true;\n\n\tthis.dynamic = false;\n\tthis.updateRange = { offset: 0, count: - 1 };\n\n\tthis.version = 0;\n\n}\n\nObject.defineProperty( BufferAttribute.prototype, 'needsUpdate', {\n\n\tset: function ( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n} );\n\nObject.assign( BufferAttribute.prototype, {\n\n\tisBufferAttribute: true,\n\n\tonUploadCallback: function () {},\n\n\tsetArray: function ( array ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\tthis.count = array !== undefined ? array.length / this.itemSize : 0;\n\t\tthis.array = array;\n\n\t\treturn this;\n\n\t},\n\n\tsetDynamic: function ( value ) {\n\n\t\tthis.dynamic = value;\n\n\t\treturn this;\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.itemSize = source.itemSize;\n\t\tthis.count = source.count;\n\t\tthis.normalized = source.normalized;\n\n\t\tthis.dynamic = source.dynamic;\n\n\t\treturn this;\n\n\t},\n\n\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.itemSize;\n\t\tindex2 *= attribute.itemSize;\n\n\t\tfor ( var i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcopyArray: function ( array ) {\n\n\t\tthis.array.set( array );\n\n\t\treturn this;\n\n\t},\n\n\tcopyColorsArray: function ( colors ) {\n\n\t\tvar array = this.array, offset = 0;\n\n\t\tfor ( var i = 0, l = colors.length; i < l; i ++ ) {\n\n\t\t\tvar color = colors[ i ];\n\n\t\t\tif ( color === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );\n\t\t\t\tcolor = new Color();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = color.r;\n\t\t\tarray[ offset ++ ] = color.g;\n\t\t\tarray[ offset ++ ] = color.b;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcopyVector2sArray: function ( vectors ) {\n\n\t\tvar array = this.array, offset = 0;\n\n\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tvar vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector2();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcopyVector3sArray: function ( vectors ) {\n\n\t\tvar array = this.array, offset = 0;\n\n\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tvar vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector3();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\tarray[ offset ++ ] = vector.z;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcopyVector4sArray: function ( vectors ) {\n\n\t\tvar array = this.array, offset = 0;\n\n\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tvar vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector4();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\tarray[ offset ++ ] = vector.z;\n\t\t\tarray[ offset ++ ] = vector.w;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tset: function ( value, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t},\n\n\tgetX: function ( index ) {\n\n\t\treturn this.array[ index * this.itemSize ];\n\n\t},\n\n\tsetX: function ( index, x ) {\n\n\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\treturn this;\n\n\t},\n\n\tgetY: function ( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 1 ];\n\n\t},\n\n\tsetY: function ( index, y ) {\n\n\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\treturn this;\n\n\t},\n\n\tgetZ: function ( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 2 ];\n\n\t},\n\n\tsetZ: function ( index, z ) {\n\n\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\treturn this;\n\n\t},\n\n\tgetW: function ( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 3 ];\n\n\t},\n\n\tsetW: function ( index, w ) {\n\n\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\treturn this;\n\n\t},\n\n\tsetXY: function ( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetXYZ: function ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t},\n\n\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\t\tthis.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t},\n\n\tonUpload: function ( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t}\n\n} );\n\n//\n\nfunction Int8BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Int8Array( array ), itemSize, normalized );\n\n}\n\nInt8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nInt8BufferAttribute.prototype.constructor = Int8BufferAttribute;\n\n\nfunction Uint8BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Uint8Array( array ), itemSize, normalized );\n\n}\n\nUint8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nUint8BufferAttribute.prototype.constructor = Uint8BufferAttribute;\n\n\nfunction Uint8ClampedBufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Uint8ClampedArray( array ), itemSize, normalized );\n\n}\n\nUint8ClampedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nUint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute;\n\n\nfunction Int16BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Int16Array( array ), itemSize, normalized );\n\n}\n\nInt16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nInt16BufferAttribute.prototype.constructor = Int16BufferAttribute;\n\n\nfunction Uint16BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Uint16Array( array ), itemSize, normalized );\n\n}\n\nUint16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nUint16BufferAttribute.prototype.constructor = Uint16BufferAttribute;\n\n\nfunction Int32BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Int32Array( array ), itemSize, normalized );\n\n}\n\nInt32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nInt32BufferAttribute.prototype.constructor = Int32BufferAttribute;\n\n\nfunction Uint32BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Uint32Array( array ), itemSize, normalized );\n\n}\n\nUint32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nUint32BufferAttribute.prototype.constructor = Uint32BufferAttribute;\n\n\nfunction Float32BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Float32Array( array ), itemSize, normalized );\n\n}\n\nFloat32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nFloat32BufferAttribute.prototype.constructor = Float32BufferAttribute;\n\n\nfunction Float64BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Float64Array( array ), itemSize, normalized );\n\n}\n\nFloat64BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nFloat64BufferAttribute.prototype.constructor = Float64BufferAttribute;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction DirectGeometry() {\n\n\tthis.vertices = [];\n\tthis.normals = [];\n\tthis.colors = [];\n\tthis.uvs = [];\n\tthis.uvs2 = [];\n\n\tthis.groups = [];\n\n\tthis.morphTargets = {};\n\n\tthis.skinWeights = [];\n\tthis.skinIndices = [];\n\n\t// this.lineDistances = [];\n\n\tthis.boundingBox = null;\n\tthis.boundingSphere = null;\n\n\t// update flags\n\n\tthis.verticesNeedUpdate = false;\n\tthis.normalsNeedUpdate = false;\n\tthis.colorsNeedUpdate = false;\n\tthis.uvsNeedUpdate = false;\n\tthis.groupsNeedUpdate = false;\n\n}\n\nObject.assign( DirectGeometry.prototype, {\n\n\tcomputeGroups: function ( geometry ) {\n\n\t\tvar group;\n\t\tvar groups = [];\n\t\tvar materialIndex = undefined;\n\n\t\tvar faces = geometry.faces;\n\n\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\n\t\t\t// materials\n\n\t\t\tif ( face.materialIndex !== materialIndex ) {\n\n\t\t\t\tmaterialIndex = face.materialIndex;\n\n\t\t\t\tif ( group !== undefined ) {\n\n\t\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\t\tgroups.push( group );\n\n\t\t\t\t}\n\n\t\t\t\tgroup = {\n\t\t\t\t\tstart: i * 3,\n\t\t\t\t\tmaterialIndex: materialIndex\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( group !== undefined ) {\n\n\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\tgroups.push( group );\n\n\t\t}\n\n\t\tthis.groups = groups;\n\n\t},\n\n\tfromGeometry: function ( geometry ) {\n\n\t\tvar faces = geometry.faces;\n\t\tvar vertices = geometry.vertices;\n\t\tvar faceVertexUvs = geometry.faceVertexUvs;\n\n\t\tvar hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0;\n\t\tvar hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0;\n\n\t\t// morphs\n\n\t\tvar morphTargets = geometry.morphTargets;\n\t\tvar morphTargetsLength = morphTargets.length;\n\n\t\tvar morphTargetsPosition;\n\n\t\tif ( morphTargetsLength > 0 ) {\n\n\t\t\tmorphTargetsPosition = [];\n\n\t\t\tfor ( var i = 0; i < morphTargetsLength; i ++ ) {\n\n\t\t\t\tmorphTargetsPosition[ i ] = [];\n\n\t\t\t}\n\n\t\t\tthis.morphTargets.position = morphTargetsPosition;\n\n\t\t}\n\n\t\tvar morphNormals = geometry.morphNormals;\n\t\tvar morphNormalsLength = morphNormals.length;\n\n\t\tvar morphTargetsNormal;\n\n\t\tif ( morphNormalsLength > 0 ) {\n\n\t\t\tmorphTargetsNormal = [];\n\n\t\t\tfor ( var i = 0; i < morphNormalsLength; i ++ ) {\n\n\t\t\t\tmorphTargetsNormal[ i ] = [];\n\n\t\t\t}\n\n\t\t\tthis.morphTargets.normal = morphTargetsNormal;\n\n\t\t}\n\n\t\t// skins\n\n\t\tvar skinIndices = geometry.skinIndices;\n\t\tvar skinWeights = geometry.skinWeights;\n\n\t\tvar hasSkinIndices = skinIndices.length === vertices.length;\n\t\tvar hasSkinWeights = skinWeights.length === vertices.length;\n\n\t\t//\n\n\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\n\t\t\tthis.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] );\n\n\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\tthis.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] );\n\n\t\t\t} else {\n\n\t\t\t\tvar normal = face.normal;\n\n\t\t\t\tthis.normals.push( normal, normal, normal );\n\n\t\t\t}\n\n\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\tif ( vertexColors.length === 3 ) {\n\n\t\t\t\tthis.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] );\n\n\t\t\t} else {\n\n\t\t\t\tvar color = face.color;\n\n\t\t\t\tthis.colors.push( color, color, color );\n\n\t\t\t}\n\n\t\t\tif ( hasFaceVertexUv === true ) {\n\n\t\t\t\tvar vertexUvs = faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\tthis.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i );\n\n\t\t\t\t\tthis.uvs.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hasFaceVertexUv2 === true ) {\n\n\t\t\t\tvar vertexUvs = faceVertexUvs[ 1 ][ i ];\n\n\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\tthis.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i );\n\n\t\t\t\t\tthis.uvs2.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// morphs\n\n\t\t\tfor ( var j = 0; j < morphTargetsLength; j ++ ) {\n\n\t\t\t\tvar morphTarget = morphTargets[ j ].vertices;\n\n\t\t\t\tmorphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] );\n\n\t\t\t}\n\n\t\t\tfor ( var j = 0; j < morphNormalsLength; j ++ ) {\n\n\t\t\t\tvar morphNormal = morphNormals[ j ].vertexNormals[ i ];\n\n\t\t\t\tmorphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c );\n\n\t\t\t}\n\n\t\t\t// skins\n\n\t\t\tif ( hasSkinIndices ) {\n\n\t\t\t\tthis.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] );\n\n\t\t\t}\n\n\t\t\tif ( hasSkinWeights ) {\n\n\t\t\t\tthis.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.computeGroups( geometry );\n\n\t\tthis.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\tthis.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\tthis.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\tthis.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\tthis.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction arrayMax( array ) {\n\n\tif ( array.length === 0 ) return - Infinity;\n\n\tvar max = array[ 0 ];\n\n\tfor ( var i = 1, l = array.length; i < l; ++ i ) {\n\n\t\tif ( array[ i ] > max ) max = array[ i ];\n\n\t}\n\n\treturn max;\n\n}\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author mrdoob / http://mrdoob.com/\n */\n\nvar bufferGeometryId = 1; // BufferGeometry uses odd numbers as Id\n\nfunction BufferGeometry() {\n\n\tObject.defineProperty( this, 'id', { value: bufferGeometryId += 2 } );\n\n\tthis.uuid = _Math.generateUUID();\n\n\tthis.name = '';\n\tthis.type = 'BufferGeometry';\n\n\tthis.index = null;\n\tthis.attributes = {};\n\n\tthis.morphAttributes = {};\n\n\tthis.groups = [];\n\n\tthis.boundingBox = null;\n\tthis.boundingSphere = null;\n\n\tthis.drawRange = { start: 0, count: Infinity };\n\n}\n\nBufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: BufferGeometry,\n\n\tisBufferGeometry: true,\n\n\tgetIndex: function () {\n\n\t\treturn this.index;\n\n\t},\n\n\tsetIndex: function ( index ) {\n\n\t\tif ( Array.isArray( index ) ) {\n\n\t\t\tthis.index = new ( arrayMax( index ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t} else {\n\n\t\t\tthis.index = index;\n\n\t\t}\n\n\t},\n\n\taddAttribute: function ( name, attribute ) {\n\n\t\tif ( ! ( attribute && attribute.isBufferAttribute ) && ! ( attribute && attribute.isInterleavedBufferAttribute ) ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' );\n\n\t\t\tthis.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( name === 'index' ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' );\n\t\t\tthis.setIndex( attribute );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.attributes[ name ] = attribute;\n\n\t\treturn this;\n\n\t},\n\n\tgetAttribute: function ( name ) {\n\n\t\treturn this.attributes[ name ];\n\n\t},\n\n\tremoveAttribute: function ( name ) {\n\n\t\tdelete this.attributes[ name ];\n\n\t\treturn this;\n\n\t},\n\n\taddGroup: function ( start, count, materialIndex ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex !== undefined ? materialIndex : 0\n\n\t\t} );\n\n\t},\n\n\tclearGroups: function () {\n\n\t\tthis.groups = [];\n\n\t},\n\n\tsetDrawRange: function ( start, count ) {\n\n\t\tthis.drawRange.start = start;\n\t\tthis.drawRange.count = count;\n\n\t},\n\n\tapplyMatrix: function ( matrix ) {\n\n\t\tvar position = this.attributes.position;\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tmatrix.applyToBufferAttribute( position );\n\t\t\tposition.needsUpdate = true;\n\n\t\t}\n\n\t\tvar normal = this.attributes.normal;\n\n\t\tif ( normal !== undefined ) {\n\n\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tnormalMatrix.applyToBufferAttribute( normal );\n\t\t\tnormal.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\trotateX: function () {\n\n\t\t// rotate geometry around world x-axis\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function rotateX( angle ) {\n\n\t\t\tm1.makeRotationX( angle );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\trotateY: function () {\n\n\t\t// rotate geometry around world y-axis\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function rotateY( angle ) {\n\n\t\t\tm1.makeRotationY( angle );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\trotateZ: function () {\n\n\t\t// rotate geometry around world z-axis\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function rotateZ( angle ) {\n\n\t\t\tm1.makeRotationZ( angle );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\ttranslate: function () {\n\n\t\t// translate geometry\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function translate( x, y, z ) {\n\n\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tscale: function () {\n\n\t\t// scale geometry\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function scale( x, y, z ) {\n\n\t\t\tm1.makeScale( x, y, z );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tlookAt: function () {\n\n\t\tvar obj = new Object3D();\n\n\t\treturn function lookAt( vector ) {\n\n\t\t\tobj.lookAt( vector );\n\n\t\t\tobj.updateMatrix();\n\n\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t};\n\n\t}(),\n\n\tcenter: function () {\n\n\t\tvar offset = new Vector3();\n\n\t\treturn function center() {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tthis.boundingBox.getCenter( offset ).negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tsetFromObject: function ( object ) {\n\n\t\t// console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this );\n\n\t\tvar geometry = object.geometry;\n\n\t\tif ( object.isPoints || object.isLine ) {\n\n\t\t\tvar positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 );\n\t\t\tvar colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 );\n\n\t\t\tthis.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) );\n\t\t\tthis.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) );\n\n\t\t\tif ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) {\n\n\t\t\t\tvar lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 );\n\n\t\t\t\tthis.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t} else if ( object.isMesh ) {\n\n\t\t\tif ( geometry && geometry.isGeometry ) {\n\n\t\t\t\tthis.fromGeometry( geometry );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetFromPoints: function ( points ) {\n\n\t\tvar position = [];\n\n\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tvar point = points[ i ];\n\t\t\tposition.push( point.x, point.y, point.z || 0 );\n\n\t\t}\n\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( position, 3 ) );\n\n\t\treturn this;\n\n\t},\n\n\tupdateFromObject: function ( object ) {\n\n\t\tvar geometry = object.geometry;\n\n\t\tif ( object.isMesh ) {\n\n\t\t\tvar direct = geometry.__directGeometry;\n\n\t\t\tif ( geometry.elementsNeedUpdate === true ) {\n\n\t\t\t\tdirect = undefined;\n\t\t\t\tgeometry.elementsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( direct === undefined ) {\n\n\t\t\t\treturn this.fromGeometry( geometry );\n\n\t\t\t}\n\n\t\t\tdirect.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\tdirect.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\tdirect.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\tdirect.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\tdirect.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\tgeometry.verticesNeedUpdate = false;\n\t\t\tgeometry.normalsNeedUpdate = false;\n\t\t\tgeometry.colorsNeedUpdate = false;\n\t\t\tgeometry.uvsNeedUpdate = false;\n\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\tgeometry = direct;\n\n\t\t}\n\n\t\tvar attribute;\n\n\t\tif ( geometry.verticesNeedUpdate === true ) {\n\n\t\t\tattribute = this.attributes.position;\n\n\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\tattribute.copyVector3sArray( geometry.vertices );\n\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tgeometry.verticesNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( geometry.normalsNeedUpdate === true ) {\n\n\t\t\tattribute = this.attributes.normal;\n\n\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\tattribute.copyVector3sArray( geometry.normals );\n\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tgeometry.normalsNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( geometry.colorsNeedUpdate === true ) {\n\n\t\t\tattribute = this.attributes.color;\n\n\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\tattribute.copyColorsArray( geometry.colors );\n\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tgeometry.colorsNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( geometry.uvsNeedUpdate ) {\n\n\t\t\tattribute = this.attributes.uv;\n\n\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\tattribute.copyVector2sArray( geometry.uvs );\n\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tgeometry.uvsNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( geometry.lineDistancesNeedUpdate ) {\n\n\t\t\tattribute = this.attributes.lineDistance;\n\n\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\tattribute.copyArray( geometry.lineDistances );\n\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tgeometry.lineDistancesNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( geometry.groupsNeedUpdate ) {\n\n\t\t\tgeometry.computeGroups( object.geometry );\n\t\t\tthis.groups = geometry.groups;\n\n\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tfromGeometry: function ( geometry ) {\n\n\t\tgeometry.__directGeometry = new DirectGeometry().fromGeometry( geometry );\n\n\t\treturn this.fromDirectGeometry( geometry.__directGeometry );\n\n\t},\n\n\tfromDirectGeometry: function ( geometry ) {\n\n\t\tvar positions = new Float32Array( geometry.vertices.length * 3 );\n\t\tthis.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) );\n\n\t\tif ( geometry.normals.length > 0 ) {\n\n\t\t\tvar normals = new Float32Array( geometry.normals.length * 3 );\n\t\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) );\n\n\t\t}\n\n\t\tif ( geometry.colors.length > 0 ) {\n\n\t\t\tvar colors = new Float32Array( geometry.colors.length * 3 );\n\t\t\tthis.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) );\n\n\t\t}\n\n\t\tif ( geometry.uvs.length > 0 ) {\n\n\t\t\tvar uvs = new Float32Array( geometry.uvs.length * 2 );\n\t\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) );\n\n\t\t}\n\n\t\tif ( geometry.uvs2.length > 0 ) {\n\n\t\t\tvar uvs2 = new Float32Array( geometry.uvs2.length * 2 );\n\t\t\tthis.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) );\n\n\t\t}\n\n\t\t// groups\n\n\t\tthis.groups = geometry.groups;\n\n\t\t// morphs\n\n\t\tfor ( var name in geometry.morphTargets ) {\n\n\t\t\tvar array = [];\n\t\t\tvar morphTargets = geometry.morphTargets[ name ];\n\n\t\t\tfor ( var i = 0, l = morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\tvar morphTarget = morphTargets[ i ];\n\n\t\t\t\tvar attribute = new Float32BufferAttribute( morphTarget.length * 3, 3 );\n\n\t\t\t\tarray.push( attribute.copyVector3sArray( morphTarget ) );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\t// skinning\n\n\t\tif ( geometry.skinIndices.length > 0 ) {\n\n\t\t\tvar skinIndices = new Float32BufferAttribute( geometry.skinIndices.length * 4, 4 );\n\t\t\tthis.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) );\n\n\t\t}\n\n\t\tif ( geometry.skinWeights.length > 0 ) {\n\n\t\t\tvar skinWeights = new Float32BufferAttribute( geometry.skinWeights.length * 4, 4 );\n\t\t\tthis.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t}\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcomputeBoundingBox: function () {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tvar position = this.attributes.position;\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t} else {\n\n\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t}\n\n\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t}\n\n\t},\n\n\tcomputeBoundingSphere: function () {\n\n\t\tvar box = new Box3();\n\t\tvar vector = new Vector3();\n\n\t\treturn function computeBoundingSphere() {\n\n\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t}\n\n\t\t\tvar position = this.attributes.position;\n\n\t\t\tif ( position ) {\n\n\t\t\t\tvar center = this.boundingSphere.center;\n\n\t\t\t\tbox.setFromBufferAttribute( position );\n\t\t\t\tbox.getCenter( center );\n\n\t\t\t\t// hoping to find a boundingSphere with a radius smaller than the\n\t\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\tfor ( var i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t\tvector.x = position.getX( i );\n\t\t\t\t\tvector.y = position.getY( i );\n\t\t\t\t\tvector.z = position.getZ( i );\n\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t}(),\n\n\tcomputeFaceNormals: function () {\n\n\t\t// backwards compatibility\n\n\t},\n\n\tcomputeVertexNormals: function () {\n\n\t\tvar index = this.index;\n\t\tvar attributes = this.attributes;\n\t\tvar groups = this.groups;\n\n\t\tif ( attributes.position ) {\n\n\t\t\tvar positions = attributes.position.array;\n\n\t\t\tif ( attributes.normal === undefined ) {\n\n\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) );\n\n\t\t\t} else {\n\n\t\t\t\t// reset existing normals to zero\n\n\t\t\t\tvar array = attributes.normal.array;\n\n\t\t\t\tfor ( var i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t\t\tarray[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar normals = attributes.normal.array;\n\n\t\t\tvar vA, vB, vC;\n\t\t\tvar pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\t// indexed elements\n\n\t\t\tif ( index ) {\n\n\t\t\t\tvar indices = index.array;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tthis.addGroup( 0, indices.length );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = groups.length; j < jl; ++ j ) {\n\n\t\t\t\t\tvar group = groups[ j ];\n\n\t\t\t\t\tvar start = group.start;\n\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\tfor ( var i = start, il = start + count; i < il; i += 3 ) {\n\n\t\t\t\t\t\tvA = indices[ i + 0 ] * 3;\n\t\t\t\t\t\tvB = indices[ i + 1 ] * 3;\n\t\t\t\t\t\tvC = indices[ i + 2 ] * 3;\n\n\t\t\t\t\t\tpA.fromArray( positions, vA );\n\t\t\t\t\t\tpB.fromArray( positions, vB );\n\t\t\t\t\t\tpC.fromArray( positions, vC );\n\n\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\tnormals[ vA ] += cb.x;\n\t\t\t\t\t\tnormals[ vA + 1 ] += cb.y;\n\t\t\t\t\t\tnormals[ vA + 2 ] += cb.z;\n\n\t\t\t\t\t\tnormals[ vB ] += cb.x;\n\t\t\t\t\t\tnormals[ vB + 1 ] += cb.y;\n\t\t\t\t\t\tnormals[ vB + 2 ] += cb.z;\n\n\t\t\t\t\t\tnormals[ vC ] += cb.x;\n\t\t\t\t\t\tnormals[ vC + 1 ] += cb.y;\n\t\t\t\t\t\tnormals[ vC + 2 ] += cb.z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\tfor ( var i = 0, il = positions.length; i < il; i += 9 ) {\n\n\t\t\t\t\tpA.fromArray( positions, i );\n\t\t\t\t\tpB.fromArray( positions, i + 3 );\n\t\t\t\t\tpC.fromArray( positions, i + 6 );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnormals[ i ] = cb.x;\n\t\t\t\t\tnormals[ i + 1 ] = cb.y;\n\t\t\t\t\tnormals[ i + 2 ] = cb.z;\n\n\t\t\t\t\tnormals[ i + 3 ] = cb.x;\n\t\t\t\t\tnormals[ i + 4 ] = cb.y;\n\t\t\t\t\tnormals[ i + 5 ] = cb.z;\n\n\t\t\t\t\tnormals[ i + 6 ] = cb.x;\n\t\t\t\t\tnormals[ i + 7 ] = cb.y;\n\t\t\t\t\tnormals[ i + 8 ] = cb.z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.normalizeNormals();\n\n\t\t\tattributes.normal.needsUpdate = true;\n\n\t\t}\n\n\t},\n\n\tmerge: function ( geometry, offset ) {\n\n\t\tif ( ! ( geometry && geometry.isBufferGeometry ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( offset === undefined ) {\n\n\t\t\toffset = 0;\n\n\t\t\tconsole.warn(\n\t\t\t\t'THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. '\n\t\t\t\t+ 'Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge.'\n\t\t\t);\n\n\t\t}\n\n\t\tvar attributes = this.attributes;\n\n\t\tfor ( var key in attributes ) {\n\n\t\t\tif ( geometry.attributes[ key ] === undefined ) continue;\n\n\t\t\tvar attribute1 = attributes[ key ];\n\t\t\tvar attributeArray1 = attribute1.array;\n\n\t\t\tvar attribute2 = geometry.attributes[ key ];\n\t\t\tvar attributeArray2 = attribute2.array;\n\n\t\t\tvar attributeSize = attribute2.itemSize;\n\n\t\t\tfor ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) {\n\n\t\t\t\tattributeArray1[ j ] = attributeArray2[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tnormalizeNormals: function () {\n\n\t\tvar vector = new Vector3();\n\n\t\treturn function normalizeNormals() {\n\n\t\t\tvar normals = this.attributes.normal;\n\n\t\t\tfor ( var i = 0, il = normals.count; i < il; i ++ ) {\n\n\t\t\t\tvector.x = normals.getX( i );\n\t\t\t\tvector.y = normals.getY( i );\n\t\t\t\tvector.z = normals.getZ( i );\n\n\t\t\t\tvector.normalize();\n\n\t\t\t\tnormals.setXYZ( i, vector.x, vector.y, vector.z );\n\n\t\t\t}\n\n\t\t};\n\n\t}(),\n\n\ttoNonIndexed: function () {\n\n\t\tif ( this.index === null ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tvar geometry2 = new BufferGeometry();\n\n\t\tvar indices = this.index.array;\n\t\tvar attributes = this.attributes;\n\n\t\tfor ( var name in attributes ) {\n\n\t\t\tvar attribute = attributes[ name ];\n\n\t\t\tvar array = attribute.array;\n\t\t\tvar itemSize = attribute.itemSize;\n\n\t\t\tvar array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\tvar index = 0, index2 = 0;\n\n\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\tfor ( var j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgeometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) );\n\n\t\t}\n\n\t\tvar groups = this.groups;\n\n\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tvar group = groups[ i ];\n\t\t\tgeometry2.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn geometry2;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tvar data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard BufferGeometry serialization\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tdata.data = { attributes: {} };\n\n\t\tvar index = this.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tvar array = Array.prototype.slice.call( index.array );\n\n\t\t\tdata.data.index = {\n\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\tarray: array\n\t\t\t};\n\n\t\t}\n\n\t\tvar attributes = this.attributes;\n\n\t\tfor ( var key in attributes ) {\n\n\t\t\tvar attribute = attributes[ key ];\n\n\t\t\tvar array = Array.prototype.slice.call( attribute.array );\n\n\t\t\tdata.data.attributes[ key ] = {\n\t\t\t\titemSize: attribute.itemSize,\n\t\t\t\ttype: attribute.array.constructor.name,\n\t\t\t\tarray: array,\n\t\t\t\tnormalized: attribute.normalized\n\t\t\t};\n\n\t\t}\n\n\t\tvar groups = this.groups;\n\n\t\tif ( groups.length > 0 ) {\n\n\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t}\n\n\t\tvar boundingSphere = this.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tdata.data.boundingSphere = {\n\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\tradius: boundingSphere.radius\n\t\t\t};\n\n\t\t}\n\n\t\treturn data;\n\n\t},\n\n\tclone: function () {\n\n\t\t/*\n\t\t // Handle primitives\n\n\t\t var parameters = this.parameters;\n\n\t\t if ( parameters !== undefined ) {\n\n\t\t var values = [];\n\n\t\t for ( var key in parameters ) {\n\n\t\t values.push( parameters[ key ] );\n\n\t\t }\n\n\t\t var geometry = Object.create( this.constructor.prototype );\n\t\t this.constructor.apply( geometry, values );\n\t\t return geometry;\n\n\t\t }\n\n\t\t return new this.constructor().copy( this );\n\t\t */\n\n\t\treturn new BufferGeometry().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tvar name, i, l;\n\n\t\t// reset\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\t\tthis.morphAttributes = {};\n\t\tthis.groups = [];\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// index\n\n\t\tvar index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone() );\n\n\t\t}\n\n\t\t// attributes\n\n\t\tvar attributes = source.attributes;\n\n\t\tfor ( name in attributes ) {\n\n\t\t\tvar attribute = attributes[ name ];\n\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tvar morphAttributes = source.morphAttributes;\n\n\t\tfor ( name in morphAttributes ) {\n\n\t\t\tvar array = [];\n\t\t\tvar morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\tarray.push( morphAttribute[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\t// groups\n\n\t\tvar groups = source.groups;\n\n\t\tfor ( i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tvar group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\t// bounding box\n\n\t\tvar boundingBox = source.boundingBox;\n\n\t\tif ( boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t}\n\n\t\t// bounding sphere\n\n\t\tvar boundingSphere = source.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t}\n\n\t\t// draw range\n\n\t\tthis.drawRange.start = source.drawRange.start;\n\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\treturn this;\n\n\t},\n\n\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// BoxGeometry\n\nfunction BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'BoxGeometry';\n\n\tthis.parameters = {\n\t\twidth: width,\n\t\theight: height,\n\t\tdepth: depth,\n\t\twidthSegments: widthSegments,\n\t\theightSegments: heightSegments,\n\t\tdepthSegments: depthSegments\n\t};\n\n\tthis.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) );\n\tthis.mergeVertices();\n\n}\n\nBoxGeometry.prototype = Object.create( Geometry.prototype );\nBoxGeometry.prototype.constructor = BoxGeometry;\n\n// BoxBufferGeometry\n\nfunction BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'BoxBufferGeometry';\n\n\tthis.parameters = {\n\t\twidth: width,\n\t\theight: height,\n\t\tdepth: depth,\n\t\twidthSegments: widthSegments,\n\t\theightSegments: heightSegments,\n\t\tdepthSegments: depthSegments\n\t};\n\n\tvar scope = this;\n\n\twidth = width || 1;\n\theight = height || 1;\n\tdepth = depth || 1;\n\n\t// segments\n\n\twidthSegments = Math.floor( widthSegments ) || 1;\n\theightSegments = Math.floor( heightSegments ) || 1;\n\tdepthSegments = Math.floor( depthSegments ) || 1;\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\t// helper variables\n\n\tvar numberOfVertices = 0;\n\tvar groupStart = 0;\n\n\t// build each side of the box geometry\n\n\tbuildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\tbuildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\tbuildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\tbuildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\tbuildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\tvar segmentWidth = width / gridX;\n\t\tvar segmentHeight = height / gridY;\n\n\t\tvar widthHalf = width / 2;\n\t\tvar heightHalf = height / 2;\n\t\tvar depthHalf = depth / 2;\n\n\t\tvar gridX1 = gridX + 1;\n\t\tvar gridY1 = gridY + 1;\n\n\t\tvar vertexCounter = 0;\n\t\tvar groupCount = 0;\n\n\t\tvar ix, iy;\n\n\t\tvar vector = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tvar y = iy * segmentHeight - heightHalf;\n\n\t\t\tfor ( ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tvar x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t// set values to correct vector component\n\n\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t// set values to correct vector component\n\n\t\t\t\tvector[ u ] = 0;\n\t\t\t\tvector[ v ] = 0;\n\t\t\t\tvector[ w ] = depth > 0 ? 1 : - 1;\n\n\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t// uvs\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t// counters\n\n\t\t\t\tvertexCounter += 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\t// 1. you need three indices to draw a single face\n\t\t// 2. a single segment consists of two faces\n\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\tfor ( iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tvar a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\tvar b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\tvar c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tvar d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t// increase counter\n\n\t\t\t\tgroupCount += 6;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t// calculate new start value for groups\n\n\t\tgroupStart += groupCount;\n\n\t\t// update total number of vertices\n\n\t\tnumberOfVertices += vertexCounter;\n\n\t}\n\n}\n\nBoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nBoxBufferGeometry.prototype.constructor = BoxBufferGeometry;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// PlaneGeometry\n\nfunction PlaneGeometry( width, height, widthSegments, heightSegments ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'PlaneGeometry';\n\n\tthis.parameters = {\n\t\twidth: width,\n\t\theight: height,\n\t\twidthSegments: widthSegments,\n\t\theightSegments: heightSegments\n\t};\n\n\tthis.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) );\n\tthis.mergeVertices();\n\n}\n\nPlaneGeometry.prototype = Object.create( Geometry.prototype );\nPlaneGeometry.prototype.constructor = PlaneGeometry;\n\n// PlaneBufferGeometry\n\nfunction PlaneBufferGeometry( width, height, widthSegments, heightSegments ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'PlaneBufferGeometry';\n\n\tthis.parameters = {\n\t\twidth: width,\n\t\theight: height,\n\t\twidthSegments: widthSegments,\n\t\theightSegments: heightSegments\n\t};\n\n\twidth = width || 1;\n\theight = height || 1;\n\n\tvar width_half = width / 2;\n\tvar height_half = height / 2;\n\n\tvar gridX = Math.floor( widthSegments ) || 1;\n\tvar gridY = Math.floor( heightSegments ) || 1;\n\n\tvar gridX1 = gridX + 1;\n\tvar gridY1 = gridY + 1;\n\n\tvar segment_width = width / gridX;\n\tvar segment_height = height / gridY;\n\n\tvar ix, iy;\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\t// generate vertices, normals and uvs\n\n\tfor ( iy = 0; iy < gridY1; iy ++ ) {\n\n\t\tvar y = iy * segment_height - height_half;\n\n\t\tfor ( ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\tvar x = ix * segment_width - width_half;\n\n\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\tuvs.push( ix / gridX );\n\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t}\n\n\t}\n\n\t// indices\n\n\tfor ( iy = 0; iy < gridY; iy ++ ) {\n\n\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\tvar a = ix + gridX1 * iy;\n\t\t\tvar b = ix + gridX1 * ( iy + 1 );\n\t\t\tvar c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\tvar d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t// faces\n\n\t\t\tindices.push( a, b, d );\n\t\t\tindices.push( b, c, d );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n}\n\nPlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nPlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n */\n\nvar materialId = 0;\n\nfunction Material() {\n\n\tObject.defineProperty( this, 'id', { value: materialId ++ } );\n\n\tthis.uuid = _Math.generateUUID();\n\n\tthis.name = '';\n\tthis.type = 'Material';\n\n\tthis.fog = true;\n\tthis.lights = true;\n\n\tthis.blending = NormalBlending;\n\tthis.side = FrontSide;\n\tthis.flatShading = false;\n\tthis.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors\n\n\tthis.opacity = 1;\n\tthis.transparent = false;\n\n\tthis.blendSrc = SrcAlphaFactor;\n\tthis.blendDst = OneMinusSrcAlphaFactor;\n\tthis.blendEquation = AddEquation;\n\tthis.blendSrcAlpha = null;\n\tthis.blendDstAlpha = null;\n\tthis.blendEquationAlpha = null;\n\n\tthis.depthFunc = LessEqualDepth;\n\tthis.depthTest = true;\n\tthis.depthWrite = true;\n\n\tthis.clippingPlanes = null;\n\tthis.clipIntersection = false;\n\tthis.clipShadows = false;\n\n\tthis.shadowSide = null;\n\n\tthis.colorWrite = true;\n\n\tthis.precision = null; // override the renderer's default precision for this material\n\n\tthis.polygonOffset = false;\n\tthis.polygonOffsetFactor = 0;\n\tthis.polygonOffsetUnits = 0;\n\n\tthis.dithering = false;\n\n\tthis.alphaTest = 0;\n\tthis.premultipliedAlpha = false;\n\n\tthis.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer\n\n\tthis.visible = true;\n\n\tthis.userData = {};\n\n\tthis.needsUpdate = true;\n\n}\n\nMaterial.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: Material,\n\n\tisMaterial: true,\n\n\tonBeforeCompile: function () {},\n\n\tsetValues: function ( values ) {\n\n\t\tif ( values === undefined ) return;\n\n\t\tfor ( var key in values ) {\n\n\t\t\tvar newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\tconsole.warn( \"THREE.Material: '\" + key + \"' parameter is undefined.\" );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// for backward compatability if shading is set in the constructor\n\t\t\tif ( key === 'shading' ) {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );\n\t\t\t\tthis.flatShading = ( newValue === FlatShading ) ? true : false;\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tvar currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\tconsole.warn( \"THREE.\" + this.type + \": '\" + key + \"' is not a property of this material.\" );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else if ( key === 'overdraw' ) {\n\n\t\t\t\t// ensure overdraw is backwards-compatible with legacy boolean type\n\t\t\t\tthis[ key ] = Number( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tvar isRoot = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( isRoot ) {\n\n\t\t\tmeta = {\n\t\t\t\ttextures: {},\n\t\t\t\timages: {}\n\t\t\t};\n\n\t\t}\n\n\t\tvar data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Material',\n\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard Material serialization\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\tif ( this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity;\n\n\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\tif ( this.clearCoat !== undefined ) data.clearCoat = this.clearCoat;\n\t\tif ( this.clearCoatRoughness !== undefined ) data.clearCoatRoughness = this.clearCoatRoughness;\n\n\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\t\tif ( this.lightMap && this.lightMap.isTexture ) data.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t}\n\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t}\n\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t}\n\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\n\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\t\t\tdata.reflectivity = this.reflectivity; // Scale behind envMap\n\n\t\t}\n\n\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\tif ( this.flatShading === true ) data.flatShading = this.flatShading;\n\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\tif ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors;\n\n\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\tif ( this.transparent === true ) data.transparent = this.transparent;\n\n\t\tdata.depthFunc = this.depthFunc;\n\t\tdata.depthTest = this.depthTest;\n\t\tdata.depthWrite = this.depthWrite;\n\n\t\t// rotation (SpriteMaterial)\n\t\tif ( this.rotation !== 0 ) data.rotation = this.rotation;\n\n\t\tif ( this.linewidth !== 1 ) data.linewidth = this.linewidth;\n\t\tif ( this.dashSize !== undefined ) data.dashSize = this.dashSize;\n\t\tif ( this.gapSize !== undefined ) data.gapSize = this.gapSize;\n\t\tif ( this.scale !== undefined ) data.scale = this.scale;\n\n\t\tif ( this.dithering === true ) data.dithering = true;\n\n\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;\n\n\t\tif ( this.wireframe === true ) data.wireframe = this.wireframe;\n\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\tif ( this.morphTargets === true ) data.morphTargets = true;\n\t\tif ( this.skinning === true ) data.skinning = true;\n\n\t\tif ( this.visible === false ) data.visible = false;\n\t\tif ( JSON.stringify( this.userData ) !== '{}' ) data.userData = this.userData;\n\n\t\t// TODO: Copied from Object3D.toJSON\n\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tvar values = [];\n\n\t\t\tfor ( var key in cache ) {\n\n\t\t\t\tvar data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t\tif ( isRoot ) {\n\n\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t}\n\n\t\treturn data;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.fog = source.fog;\n\t\tthis.lights = source.lights;\n\n\t\tthis.blending = source.blending;\n\t\tthis.side = source.side;\n\t\tthis.flatShading = source.flatShading;\n\t\tthis.vertexColors = source.vertexColors;\n\n\t\tthis.opacity = source.opacity;\n\t\tthis.transparent = source.transparent;\n\n\t\tthis.blendSrc = source.blendSrc;\n\t\tthis.blendDst = source.blendDst;\n\t\tthis.blendEquation = source.blendEquation;\n\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\n\t\tthis.depthFunc = source.depthFunc;\n\t\tthis.depthTest = source.depthTest;\n\t\tthis.depthWrite = source.depthWrite;\n\n\t\tthis.colorWrite = source.colorWrite;\n\n\t\tthis.precision = source.precision;\n\n\t\tthis.polygonOffset = source.polygonOffset;\n\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\tthis.dithering = source.dithering;\n\n\t\tthis.alphaTest = source.alphaTest;\n\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\n\t\tthis.overdraw = source.overdraw;\n\n\t\tthis.visible = source.visible;\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tthis.clipShadows = source.clipShadows;\n\t\tthis.clipIntersection = source.clipIntersection;\n\n\t\tvar srcPlanes = source.clippingPlanes,\n\t\t\tdstPlanes = null;\n\n\t\tif ( srcPlanes !== null ) {\n\n\t\t\tvar n = srcPlanes.length;\n\t\t\tdstPlanes = new Array( n );\n\n\t\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t}\n\n\t\tthis.clippingPlanes = dstPlanes;\n\n\t\tthis.shadowSide = source.shadowSide;\n\n\t\treturn this;\n\n\t},\n\n\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n *\n * parameters = {\n * color: ,\n * opacity: ,\n * map: new THREE.Texture( ),\n *\n * lightMap: new THREE.Texture( ),\n * lightMapIntensity: \n *\n * aoMap: new THREE.Texture( ),\n * aoMapIntensity: \n *\n * specularMap: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n * combine: THREE.Multiply,\n * reflectivity: ,\n * refractionRatio: ,\n *\n * depthTest: ,\n * depthWrite: ,\n *\n * wireframe: ,\n * wireframeLinewidth: ,\n *\n * skinning: ,\n * morphTargets: \n * }\n */\n\nfunction MeshBasicMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshBasicMaterial';\n\n\tthis.color = new Color( 0xffffff ); // emissive\n\n\tthis.map = null;\n\n\tthis.lightMap = null;\n\tthis.lightMapIntensity = 1.0;\n\n\tthis.aoMap = null;\n\tthis.aoMapIntensity = 1.0;\n\n\tthis.specularMap = null;\n\n\tthis.alphaMap = null;\n\n\tthis.envMap = null;\n\tthis.combine = MultiplyOperation;\n\tthis.reflectivity = 1;\n\tthis.refractionRatio = 0.98;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\tthis.wireframeLinecap = 'round';\n\tthis.wireframeLinejoin = 'round';\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\n\tthis.lights = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshBasicMaterial.prototype = Object.create( Material.prototype );\nMeshBasicMaterial.prototype.constructor = MeshBasicMaterial;\n\nMeshBasicMaterial.prototype.isMeshBasicMaterial = true;\n\nMeshBasicMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\n\tthis.map = source.map;\n\n\tthis.lightMap = source.lightMap;\n\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\tthis.aoMap = source.aoMap;\n\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\tthis.specularMap = source.specularMap;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.envMap = source.envMap;\n\tthis.combine = source.combine;\n\tthis.reflectivity = source.reflectivity;\n\tthis.refractionRatio = source.refractionRatio;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\tthis.wireframeLinecap = source.wireframeLinecap;\n\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\n\treturn this;\n\n};\n\n/**\n * @author alteredq / http://alteredqualia.com/\n *\n * parameters = {\n * defines: { \"label\" : \"value\" },\n * uniforms: { \"parameter1\": { value: 1.0 }, \"parameter2\": { value2: 2 } },\n *\n * fragmentShader: ,\n * vertexShader: ,\n *\n * wireframe: ,\n * wireframeLinewidth: ,\n *\n * lights: ,\n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \n * }\n */\n\nfunction ShaderMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'ShaderMaterial';\n\n\tthis.defines = {};\n\tthis.uniforms = {};\n\n\tthis.vertexShader = 'void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}';\n\tthis.fragmentShader = 'void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}';\n\n\tthis.linewidth = 1;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\n\tthis.fog = false; // set to use scene fog\n\tthis.lights = false; // set to use scene lights\n\tthis.clipping = false; // set to use user-defined clipping planes\n\n\tthis.skinning = false; // set to use skinning attribute streams\n\tthis.morphTargets = false; // set to use morph targets\n\tthis.morphNormals = false; // set to use morph normals\n\n\tthis.extensions = {\n\t\tderivatives: false, // set to use derivatives\n\t\tfragDepth: false, // set to use fragment depth values\n\t\tdrawBuffers: false, // set to use draw buffers\n\t\tshaderTextureLOD: false // set to use shader texture LOD\n\t};\n\n\t// When rendered geometry doesn't include these attributes but the material does,\n\t// use these default values in WebGL. This avoids errors when buffer data is missing.\n\tthis.defaultAttributeValues = {\n\t\t'color': [ 1, 1, 1 ],\n\t\t'uv': [ 0, 0 ],\n\t\t'uv2': [ 0, 0 ]\n\t};\n\n\tthis.index0AttributeName = undefined;\n\tthis.uniformsNeedUpdate = false;\n\n\tif ( parameters !== undefined ) {\n\n\t\tif ( parameters.attributes !== undefined ) {\n\n\t\t\tconsole.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );\n\n\t\t}\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n}\n\nShaderMaterial.prototype = Object.create( Material.prototype );\nShaderMaterial.prototype.constructor = ShaderMaterial;\n\nShaderMaterial.prototype.isShaderMaterial = true;\n\nShaderMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.fragmentShader = source.fragmentShader;\n\tthis.vertexShader = source.vertexShader;\n\n\tthis.uniforms = UniformsUtils.clone( source.uniforms );\n\n\tthis.defines = Object.assign( {}, source.defines );\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\tthis.lights = source.lights;\n\tthis.clipping = source.clipping;\n\n\tthis.skinning = source.skinning;\n\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\tthis.extensions = source.extensions;\n\n\treturn this;\n\n};\n\nShaderMaterial.prototype.toJSON = function ( meta ) {\n\n\tvar data = Material.prototype.toJSON.call( this, meta );\n\n\tdata.uniforms = this.uniforms;\n\tdata.vertexShader = this.vertexShader;\n\tdata.fragmentShader = this.fragmentShader;\n\n\treturn data;\n\n};\n\n/**\n * @author bhouston / http://clara.io\n */\n\nfunction Ray( origin, direction ) {\n\n\tthis.origin = ( origin !== undefined ) ? origin : new Vector3();\n\tthis.direction = ( direction !== undefined ) ? direction : new Vector3();\n\n}\n\nObject.assign( Ray.prototype, {\n\n\tset: function ( origin, direction ) {\n\n\t\tthis.origin.copy( origin );\n\t\tthis.direction.copy( direction );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( ray ) {\n\n\t\tthis.origin.copy( ray.origin );\n\t\tthis.direction.copy( ray.direction );\n\n\t\treturn this;\n\n\t},\n\n\tat: function ( t, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .at() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.copy( this.direction ).multiplyScalar( t ).add( this.origin );\n\n\t},\n\n\tlookAt: function ( v ) {\n\n\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\treturn this;\n\n\t},\n\n\trecast: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function recast( t ) {\n\n\t\t\tthis.origin.copy( this.at( t, v1 ) );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tclosestPointToPoint: function ( point, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .closestPointToPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\ttarget.subVectors( point, this.origin );\n\n\t\tvar directionDistance = target.dot( this.direction );\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn target.copy( this.origin );\n\n\t\t}\n\n\t\treturn target.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t},\n\n\tdistanceToPoint: function ( point ) {\n\n\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t},\n\n\tdistanceSqToPoint: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function distanceSqToPoint( point ) {\n\n\t\t\tvar directionDistance = v1.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t\t// point behind the ray\n\n\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t\t}\n\n\t\t\tv1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t\treturn v1.distanceToSquared( point );\n\n\t\t};\n\n\t}(),\n\n\tdistanceSqToSegment: function () {\n\n\t\tvar segCenter = new Vector3();\n\t\tvar segDir = new Vector3();\n\t\tvar diff = new Vector3();\n\n\t\treturn function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t\t// It returns the min distance between the ray and the segment\n\t\t\t// defined by v0 and v1\n\t\t\t// It can also set two optional targets :\n\t\t\t// - The closest point on the ray\n\t\t\t// - The closest point on the segment\n\n\t\t\tsegCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t\tsegDir.copy( v1 ).sub( v0 ).normalize();\n\t\t\tdiff.copy( this.origin ).sub( segCenter );\n\n\t\t\tvar segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\t\tvar a01 = - this.direction.dot( segDir );\n\t\t\tvar b0 = diff.dot( this.direction );\n\t\t\tvar b1 = - diff.dot( segDir );\n\t\t\tvar c = diff.lengthSq();\n\t\t\tvar det = Math.abs( 1 - a01 * a01 );\n\t\t\tvar s0, s1, sqrDist, extDet;\n\n\t\t\tif ( det > 0 ) {\n\n\t\t\t\t// The ray and segment are not parallel.\n\n\t\t\t\ts0 = a01 * b1 - b0;\n\t\t\t\ts1 = a01 * b0 - b1;\n\t\t\t\textDet = segExtent * det;\n\n\t\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\t\tvar invDet = 1 / det;\n\t\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// region 5\n\n\t\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t\t// region 4\n\n\t\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t\t// region 3\n\n\t\t\t\t\t\ts0 = 0;\n\t\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// region 2\n\n\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// Ray and segment are parallel.\n\n\t\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t}\n\n\t\t\tif ( optionalPointOnRay ) {\n\n\t\t\t\toptionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );\n\n\t\t\t}\n\n\t\t\tif ( optionalPointOnSegment ) {\n\n\t\t\t\toptionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter );\n\n\t\t\t}\n\n\t\t\treturn sqrDist;\n\n\t\t};\n\n\t}(),\n\n\tintersectSphere: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function intersectSphere( sphere, target ) {\n\n\t\t\tv1.subVectors( sphere.center, this.origin );\n\t\t\tvar tca = v1.dot( this.direction );\n\t\t\tvar d2 = v1.dot( v1 ) - tca * tca;\n\t\t\tvar radius2 = sphere.radius * sphere.radius;\n\n\t\t\tif ( d2 > radius2 ) return null;\n\n\t\t\tvar thc = Math.sqrt( radius2 - d2 );\n\n\t\t\t// t0 = first intersect point - entrance on front of sphere\n\t\t\tvar t0 = tca - thc;\n\n\t\t\t// t1 = second intersect point - exit point on back of sphere\n\t\t\tvar t1 = tca + thc;\n\n\t\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\n\t\t\tif ( t0 < 0 && t1 < 0 ) return null;\n\n\t\t\t// test to see if t0 is behind the ray:\n\t\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t\t// in order to always return an intersect point that is in front of the ray.\n\t\t\tif ( t0 < 0 ) return this.at( t1, target );\n\n\t\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\t\treturn this.at( t0, target );\n\n\t\t};\n\n\t}(),\n\n\tintersectsSphere: function ( sphere ) {\n\n\t\treturn this.distanceToPoint( sphere.center ) <= sphere.radius;\n\n\t},\n\n\tdistanceToPlane: function ( plane ) {\n\n\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tvar t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t// Return if the ray never intersects the plane\n\n\t\treturn t >= 0 ? t : null;\n\n\t},\n\n\tintersectPlane: function ( plane, target ) {\n\n\t\tvar t = this.distanceToPlane( plane );\n\n\t\tif ( t === null ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn this.at( t, target );\n\n\t},\n\n\tintersectsPlane: function ( plane ) {\n\n\t\t// check if the ray lies on the plane first\n\n\t\tvar distToPoint = plane.distanceToPoint( this.origin );\n\n\t\tif ( distToPoint === 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\treturn false;\n\n\t},\n\n\tintersectBox: function ( box, target ) {\n\n\t\tvar tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\tvar invdirx = 1 / this.direction.x,\n\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\tvar origin = this.origin;\n\n\t\tif ( invdirx >= 0 ) {\n\n\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t} else {\n\n\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t}\n\n\t\tif ( invdiry >= 0 ) {\n\n\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t} else {\n\n\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t}\n\n\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\t// These lines also handle the case where tmin or tmax is NaN\n\t\t// (result of 0 * Infinity). x !== x returns true if x is NaN\n\n\t\tif ( tymin > tmin || tmin !== tmin ) tmin = tymin;\n\n\t\tif ( tymax < tmax || tmax !== tmax ) tmax = tymax;\n\n\t\tif ( invdirz >= 0 ) {\n\n\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t} else {\n\n\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t}\n\n\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t//return point closest to the ray (positive side)\n\n\t\tif ( tmax < 0 ) return null;\n\n\t\treturn this.at( tmin >= 0 ? tmin : tmax, target );\n\n\t},\n\n\tintersectsBox: ( function () {\n\n\t\tvar v = new Vector3();\n\n\t\treturn function intersectsBox( box ) {\n\n\t\t\treturn this.intersectBox( box, v ) !== null;\n\n\t\t};\n\n\t} )(),\n\n\tintersectTriangle: function () {\n\n\t\t// Compute the offset origin, edges, and normal.\n\t\tvar diff = new Vector3();\n\t\tvar edge1 = new Vector3();\n\t\tvar edge2 = new Vector3();\n\t\tvar normal = new Vector3();\n\n\t\treturn function intersectTriangle( a, b, c, backfaceCulling, target ) {\n\n\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t\tedge1.subVectors( b, a );\n\t\t\tedge2.subVectors( c, a );\n\t\t\tnormal.crossVectors( edge1, edge2 );\n\n\t\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\t\tvar DdN = this.direction.dot( normal );\n\t\t\tvar sign;\n\n\t\t\tif ( DdN > 0 ) {\n\n\t\t\t\tif ( backfaceCulling ) return null;\n\t\t\t\tsign = 1;\n\n\t\t\t} else if ( DdN < 0 ) {\n\n\t\t\t\tsign = - 1;\n\t\t\t\tDdN = - DdN;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tdiff.subVectors( this.origin, a );\n\t\t\tvar DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) );\n\n\t\t\t// b1 < 0, no intersection\n\t\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) );\n\n\t\t\t// b2 < 0, no intersection\n\t\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\t// b1+b2 > 1, no intersection\n\t\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\t// Line intersects triangle, check if ray does.\n\t\t\tvar QdN = - sign * diff.dot( normal );\n\n\t\t\t// t < 0, no intersection\n\t\t\tif ( QdN < 0 ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\t// Ray intersects triangle.\n\t\t\treturn this.at( QdN / DdN, target );\n\n\t\t};\n\n\t}(),\n\n\tapplyMatrix4: function ( matrix4 ) {\n\n\t\tthis.origin.applyMatrix4( matrix4 );\n\t\tthis.direction.transformDirection( matrix4 );\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( ray ) {\n\n\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t}\n\n} );\n\n/**\n * @author bhouston / http://clara.io\n */\n\nfunction Line3( start, end ) {\n\n\tthis.start = ( start !== undefined ) ? start : new Vector3();\n\tthis.end = ( end !== undefined ) ? end : new Vector3();\n\n}\n\nObject.assign( Line3.prototype, {\n\n\tset: function ( start, end ) {\n\n\t\tthis.start.copy( start );\n\t\tthis.end.copy( end );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( line ) {\n\n\t\tthis.start.copy( line.start );\n\t\tthis.end.copy( line.end );\n\n\t\treturn this;\n\n\t},\n\n\tgetCenter: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Line3: .getCenter() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t},\n\n\tdelta: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Line3: .delta() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.subVectors( this.end, this.start );\n\n\t},\n\n\tdistanceSq: function () {\n\n\t\treturn this.start.distanceToSquared( this.end );\n\n\t},\n\n\tdistance: function () {\n\n\t\treturn this.start.distanceTo( this.end );\n\n\t},\n\n\tat: function ( t, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Line3: .at() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t},\n\n\tclosestPointToPointParameter: function () {\n\n\t\tvar startP = new Vector3();\n\t\tvar startEnd = new Vector3();\n\n\t\treturn function closestPointToPointParameter( point, clampToLine ) {\n\n\t\t\tstartP.subVectors( point, this.start );\n\t\t\tstartEnd.subVectors( this.end, this.start );\n\n\t\t\tvar startEnd2 = startEnd.dot( startEnd );\n\t\t\tvar startEnd_startP = startEnd.dot( startP );\n\n\t\t\tvar t = startEnd_startP / startEnd2;\n\n\t\t\tif ( clampToLine ) {\n\n\t\t\t\tt = _Math.clamp( t, 0, 1 );\n\n\t\t\t}\n\n\t\t\treturn t;\n\n\t\t};\n\n\t}(),\n\n\tclosestPointToPoint: function ( point, clampToLine, target ) {\n\n\t\tvar t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Line3: .closestPointToPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t},\n\n\tapplyMatrix4: function ( matrix ) {\n\n\t\tthis.start.applyMatrix4( matrix );\n\t\tthis.end.applyMatrix4( matrix );\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( line ) {\n\n\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t}\n\n} );\n\n/**\n * @author bhouston / http://clara.io\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction Triangle( a, b, c ) {\n\n\tthis.a = ( a !== undefined ) ? a : new Vector3();\n\tthis.b = ( b !== undefined ) ? b : new Vector3();\n\tthis.c = ( c !== undefined ) ? c : new Vector3();\n\n}\n\nObject.assign( Triangle, {\n\n\tgetNormal: function () {\n\n\t\tvar v0 = new Vector3();\n\n\t\treturn function getNormal( a, b, c, target ) {\n\n\t\t\tif ( target === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Triangle: .getNormal() target is now required' );\n\t\t\t\ttarget = new Vector3();\n\n\t\t\t}\n\n\t\t\ttarget.subVectors( c, b );\n\t\t\tv0.subVectors( a, b );\n\t\t\ttarget.cross( v0 );\n\n\t\t\tvar targetLengthSq = target.lengthSq();\n\t\t\tif ( targetLengthSq > 0 ) {\n\n\t\t\t\treturn target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) );\n\n\t\t\t}\n\n\t\t\treturn target.set( 0, 0, 0 );\n\n\t\t};\n\n\t}(),\n\n\t// static/instance method to calculate barycentric coordinates\n\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\tgetBarycoord: function () {\n\n\t\tvar v0 = new Vector3();\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\n\t\treturn function getBarycoord( point, a, b, c, target ) {\n\n\t\t\tv0.subVectors( c, a );\n\t\t\tv1.subVectors( b, a );\n\t\t\tv2.subVectors( point, a );\n\n\t\t\tvar dot00 = v0.dot( v0 );\n\t\t\tvar dot01 = v0.dot( v1 );\n\t\t\tvar dot02 = v0.dot( v2 );\n\t\t\tvar dot11 = v1.dot( v1 );\n\t\t\tvar dot12 = v1.dot( v2 );\n\n\t\t\tvar denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t\tif ( target === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Triangle: .getBarycoord() target is now required' );\n\t\t\t\ttarget = new Vector3();\n\n\t\t\t}\n\n\t\t\t// collinear or singular triangle\n\t\t\tif ( denom === 0 ) {\n\n\t\t\t\t// arbitrary location outside of triangle?\n\t\t\t\t// not sure if this is the best idea, maybe should be returning undefined\n\t\t\t\treturn target.set( - 2, - 1, - 1 );\n\n\t\t\t}\n\n\t\t\tvar invDenom = 1 / denom;\n\t\t\tvar u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\t\tvar v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t\t// barycentric coordinates must always sum to 1\n\t\t\treturn target.set( 1 - u - v, v, u );\n\n\t\t};\n\n\t}(),\n\n\tcontainsPoint: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function containsPoint( point, a, b, c ) {\n\n\t\t\tTriangle.getBarycoord( point, a, b, c, v1 );\n\n\t\t\treturn ( v1.x >= 0 ) && ( v1.y >= 0 ) && ( ( v1.x + v1.y ) <= 1 );\n\n\t\t};\n\n\t}()\n\n} );\n\nObject.assign( Triangle.prototype, {\n\n\tset: function ( a, b, c ) {\n\n\t\tthis.a.copy( a );\n\t\tthis.b.copy( b );\n\t\tthis.c.copy( c );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromPointsAndIndices: function ( points, i0, i1, i2 ) {\n\n\t\tthis.a.copy( points[ i0 ] );\n\t\tthis.b.copy( points[ i1 ] );\n\t\tthis.c.copy( points[ i2 ] );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( triangle ) {\n\n\t\tthis.a.copy( triangle.a );\n\t\tthis.b.copy( triangle.b );\n\t\tthis.c.copy( triangle.c );\n\n\t\treturn this;\n\n\t},\n\n\tgetArea: function () {\n\n\t\tvar v0 = new Vector3();\n\t\tvar v1 = new Vector3();\n\n\t\treturn function getArea() {\n\n\t\t\tv0.subVectors( this.c, this.b );\n\t\t\tv1.subVectors( this.a, this.b );\n\n\t\t\treturn v0.cross( v1 ).length() * 0.5;\n\n\t\t};\n\n\t}(),\n\n\tgetMidpoint: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Triangle: .getMidpoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t},\n\n\tgetNormal: function ( target ) {\n\n\t\treturn Triangle.getNormal( this.a, this.b, this.c, target );\n\n\t},\n\n\tgetPlane: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Triangle: .getPlane() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t},\n\n\tgetBarycoord: function ( point, target ) {\n\n\t\treturn Triangle.getBarycoord( point, this.a, this.b, this.c, target );\n\n\t},\n\n\tcontainsPoint: function ( point ) {\n\n\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t},\n\n\tintersectsBox: function ( box ) {\n\n\t\treturn box.intersectsTriangle( this );\n\n\t},\n\n\tclosestPointToPoint: function () {\n\n\t\tvar plane = new Plane();\n\t\tvar edgeList = [ new Line3(), new Line3(), new Line3() ];\n\t\tvar projectedPoint = new Vector3();\n\t\tvar closestPoint = new Vector3();\n\n\t\treturn function closestPointToPoint( point, target ) {\n\n\t\t\tif ( target === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Triangle: .closestPointToPoint() target is now required' );\n\t\t\t\ttarget = new Vector3();\n\n\t\t\t}\n\n\t\t\tvar minDistance = Infinity;\n\n\t\t\t// project the point onto the plane of the triangle\n\n\t\t\tplane.setFromCoplanarPoints( this.a, this.b, this.c );\n\t\t\tplane.projectPoint( point, projectedPoint );\n\n\t\t\t// check if the projection lies within the triangle\n\n\t\t\tif ( this.containsPoint( projectedPoint ) === true ) {\n\n\t\t\t\t// if so, this is the closest point\n\n\t\t\t\ttarget.copy( projectedPoint );\n\n\t\t\t} else {\n\n\t\t\t\t// if not, the point falls outside the triangle. the target is the closest point to the triangle's edges or vertices\n\n\t\t\t\tedgeList[ 0 ].set( this.a, this.b );\n\t\t\t\tedgeList[ 1 ].set( this.b, this.c );\n\t\t\t\tedgeList[ 2 ].set( this.c, this.a );\n\n\t\t\t\tfor ( var i = 0; i < edgeList.length; i ++ ) {\n\n\t\t\t\t\tedgeList[ i ].closestPointToPoint( projectedPoint, true, closestPoint );\n\n\t\t\t\t\tvar distance = projectedPoint.distanceToSquared( closestPoint );\n\n\t\t\t\t\tif ( distance < minDistance ) {\n\n\t\t\t\t\t\tminDistance = distance;\n\n\t\t\t\t\t\ttarget.copy( closestPoint );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn target;\n\n\t\t};\n\n\t}(),\n\n\tequals: function ( triangle ) {\n\n\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n * @author mikael emtinger / http://gomo.se/\n * @author jonobr1 / http://jonobr1.com/\n */\n\nfunction Mesh( geometry, material ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Mesh';\n\n\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\tthis.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\tthis.drawMode = TrianglesDrawMode;\n\n\tthis.updateMorphTargets();\n\n}\n\nMesh.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Mesh,\n\n\tisMesh: true,\n\n\tsetDrawMode: function ( value ) {\n\n\t\tthis.drawMode = value;\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tthis.drawMode = source.drawMode;\n\n\t\tif ( source.morphTargetInfluences !== undefined ) {\n\n\t\t\tthis.morphTargetInfluences = source.morphTargetInfluences.slice();\n\n\t\t}\n\n\t\tif ( source.morphTargetDictionary !== undefined ) {\n\n\t\t\tthis.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tupdateMorphTargets: function () {\n\n\t\tvar geometry = this.geometry;\n\t\tvar m, ml, name;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tvar morphAttributes = geometry.morphAttributes;\n\t\t\tvar keys = Object.keys( morphAttributes );\n\n\t\t\tif ( keys.length > 0 ) {\n\n\t\t\t\tvar morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\t\tfor ( m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\tname = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tvar morphTargets = geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( m = 0, ml = morphTargets.length; m < ml; m ++ ) {\n\n\t\t\t\t\tname = morphTargets[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\traycast: ( function () {\n\n\t\tvar inverseMatrix = new Matrix4();\n\t\tvar ray = new Ray();\n\t\tvar sphere = new Sphere();\n\n\t\tvar vA = new Vector3();\n\t\tvar vB = new Vector3();\n\t\tvar vC = new Vector3();\n\n\t\tvar tempA = new Vector3();\n\t\tvar tempB = new Vector3();\n\t\tvar tempC = new Vector3();\n\n\t\tvar uvA = new Vector2();\n\t\tvar uvB = new Vector2();\n\t\tvar uvC = new Vector2();\n\n\t\tvar barycoord = new Vector3();\n\n\t\tvar intersectionPoint = new Vector3();\n\t\tvar intersectionPointWorld = new Vector3();\n\n\t\tfunction uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) {\n\n\t\t\tTriangle.getBarycoord( point, p1, p2, p3, barycoord );\n\n\t\t\tuv1.multiplyScalar( barycoord.x );\n\t\t\tuv2.multiplyScalar( barycoord.y );\n\t\t\tuv3.multiplyScalar( barycoord.z );\n\n\t\t\tuv1.add( uv2 ).add( uv3 );\n\n\t\t\treturn uv1.clone();\n\n\t\t}\n\n\t\tfunction checkIntersection( object, material, raycaster, ray, pA, pB, pC, point ) {\n\n\t\t\tvar intersect;\n\n\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t\t\t} else {\n\n\t\t\t\tintersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );\n\n\t\t\t}\n\n\t\t\tif ( intersect === null ) return null;\n\n\t\t\tintersectionPointWorld.copy( point );\n\t\t\tintersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectionPointWorld );\n\n\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\t\t\treturn {\n\t\t\t\tdistance: distance,\n\t\t\t\tpoint: intersectionPointWorld.clone(),\n\t\t\t\tobject: object\n\t\t\t};\n\n\t\t}\n\n\t\tfunction checkBufferGeometryIntersection( object, raycaster, ray, position, uv, a, b, c ) {\n\n\t\t\tvA.fromBufferAttribute( position, a );\n\t\t\tvB.fromBufferAttribute( position, b );\n\t\t\tvC.fromBufferAttribute( position, c );\n\n\t\t\tvar intersection = checkIntersection( object, object.material, raycaster, ray, vA, vB, vC, intersectionPoint );\n\n\t\t\tif ( intersection ) {\n\n\t\t\t\tif ( uv ) {\n\n\t\t\t\t\tuvA.fromBufferAttribute( uv, a );\n\t\t\t\t\tuvB.fromBufferAttribute( uv, b );\n\t\t\t\t\tuvC.fromBufferAttribute( uv, c );\n\n\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC );\n\n\t\t\t\t}\n\n\t\t\t\tvar face = new Face3( a, b, c );\n\t\t\t\tTriangle.getNormal( vA, vB, vC, face.normal );\n\n\t\t\t\tintersection.face = face;\n\t\t\t\tintersection.faceIndex = a;\n\n\t\t\t}\n\n\t\t\treturn intersection;\n\n\t\t}\n\n\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\tvar geometry = this.geometry;\n\t\t\tvar material = this.material;\n\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\tif ( material === undefined ) return;\n\n\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t//\n\n\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t// Check boundingBox before continuing\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tif ( ray.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t\t}\n\n\t\t\tvar intersection;\n\n\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\tvar a, b, c;\n\t\t\t\tvar index = geometry.index;\n\t\t\t\tvar position = geometry.attributes.position;\n\t\t\t\tvar uv = geometry.attributes.uv;\n\t\t\t\tvar i, l;\n\n\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t// indexed buffer geometry\n\n\t\t\t\t\tfor ( i = 0, l = index.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\ta = index.getX( i );\n\t\t\t\t\t\tb = index.getX( i + 1 );\n\t\t\t\t\t\tc = index.getX( i + 2 );\n\n\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indices buffer semantics\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( position !== undefined ) {\n\n\t\t\t\t\t// non-indexed buffer geometry\n\n\t\t\t\t\tfor ( i = 0, l = position.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\ta = i;\n\t\t\t\t\t\tb = i + 1;\n\t\t\t\t\t\tc = i + 2;\n\n\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) intersects.push( intersection );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\tvar fvA, fvB, fvC;\n\t\t\t\tvar isMultiMaterial = Array.isArray( material );\n\n\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\tvar faces = geometry.faces;\n\t\t\t\tvar uvs;\n\n\t\t\t\tvar faceVertexUvs = geometry.faceVertexUvs[ 0 ];\n\t\t\t\tif ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs;\n\n\t\t\t\tfor ( var f = 0, fl = faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tvar face = faces[ f ];\n\t\t\t\t\tvar faceMaterial = isMultiMaterial ? material[ face.materialIndex ] : material;\n\n\t\t\t\t\tif ( faceMaterial === undefined ) continue;\n\n\t\t\t\t\tfvA = vertices[ face.a ];\n\t\t\t\t\tfvB = vertices[ face.b ];\n\t\t\t\t\tfvC = vertices[ face.c ];\n\n\t\t\t\t\tif ( faceMaterial.morphTargets === true ) {\n\n\t\t\t\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\t\t\t\tvar morphInfluences = this.morphTargetInfluences;\n\n\t\t\t\t\t\tvA.set( 0, 0, 0 );\n\t\t\t\t\t\tvB.set( 0, 0, 0 );\n\t\t\t\t\t\tvC.set( 0, 0, 0 );\n\n\t\t\t\t\t\tfor ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) {\n\n\t\t\t\t\t\t\tvar influence = morphInfluences[ t ];\n\n\t\t\t\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t\t\t\tvar targets = morphTargets[ t ].vertices;\n\n\t\t\t\t\t\t\tvA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence );\n\t\t\t\t\t\t\tvB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence );\n\t\t\t\t\t\t\tvC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvA.add( fvA );\n\t\t\t\t\t\tvB.add( fvB );\n\t\t\t\t\t\tvC.add( fvC );\n\n\t\t\t\t\t\tfvA = vA;\n\t\t\t\t\t\tfvB = vB;\n\t\t\t\t\t\tfvC = vC;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tintersection = checkIntersection( this, faceMaterial, raycaster, ray, fvA, fvB, fvC, intersectionPoint );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tif ( uvs && uvs[ f ] ) {\n\n\t\t\t\t\t\t\tvar uvs_f = uvs[ f ];\n\t\t\t\t\t\t\tuvA.copy( uvs_f[ 0 ] );\n\t\t\t\t\t\t\tuvB.copy( uvs_f[ 1 ] );\n\t\t\t\t\t\t\tuvC.copy( uvs_f[ 2 ] );\n\n\t\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tintersection.face = face;\n\t\t\t\t\t\tintersection.faceIndex = f;\n\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t}() ),\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLBackground( renderer, state, geometries, premultipliedAlpha ) {\n\n\tvar clearColor = new Color( 0x000000 );\n\tvar clearAlpha = 0;\n\n\tvar planeCamera, planeMesh;\n\tvar boxMesh;\n\n\tfunction render( renderList, scene, camera, forceClear ) {\n\n\t\tvar background = scene.background;\n\n\t\tif ( background === null ) {\n\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t} else if ( background && background.isColor ) {\n\n\t\t\tsetClear( background, 1 );\n\t\t\tforceClear = true;\n\n\t\t}\n\n\t\tif ( renderer.autoClear || forceClear ) {\n\n\t\t\trenderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\n\t\t}\n\n\t\tif ( background && background.isCubeTexture ) {\n\n\t\t\tif ( boxMesh === undefined ) {\n\n\t\t\t\tboxMesh = new Mesh(\n\t\t\t\t\tnew BoxBufferGeometry( 1, 1, 1 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tuniforms: ShaderLib.cube.uniforms,\n\t\t\t\t\t\tvertexShader: ShaderLib.cube.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.cube.fragmentShader,\n\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\tdepthTest: true,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tboxMesh.geometry.removeAttribute( 'normal' );\n\t\t\t\tboxMesh.geometry.removeAttribute( 'uv' );\n\n\t\t\t\tboxMesh.onBeforeRender = function ( renderer, scene, camera ) {\n\n\t\t\t\t\tthis.matrixWorld.copyPosition( camera.matrixWorld );\n\n\t\t\t\t};\n\n\t\t\t\tgeometries.update( boxMesh.geometry );\n\n\t\t\t}\n\n\t\t\tboxMesh.material.uniforms.tCube.value = background;\n\n\t\t\trenderList.push( boxMesh, boxMesh.geometry, boxMesh.material, 0, null );\n\n\t\t} else if ( background && background.isTexture ) {\n\n\t\t\tif ( planeCamera === undefined ) {\n\n\t\t\t\tplaneCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n\t\t\t\tplaneMesh = new Mesh(\n\t\t\t\t\tnew PlaneBufferGeometry( 2, 2 ),\n\t\t\t\t\tnew MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false } )\n\t\t\t\t);\n\n\t\t\t\tgeometries.update( planeMesh.geometry );\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.map = background;\n\n\t\t\t// TODO Push this to renderList\n\n\t\t\trenderer.renderBufferDirect( planeCamera, null, planeMesh.geometry, planeMesh.material, planeMesh, null );\n\n\t\t}\n\n\t}\n\n\tfunction setClear( color, alpha ) {\n\n\t\tstate.buffers.color.setClear( color.r, color.g, color.b, alpha, premultipliedAlpha );\n\n\t}\n\n\treturn {\n\n\t\tgetClearColor: function () {\n\n\t\t\treturn clearColor;\n\n\t\t},\n\t\tsetClearColor: function ( color, alpha ) {\n\n\t\t\tclearColor.set( color );\n\t\t\tclearAlpha = alpha !== undefined ? alpha : 1;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\tgetClearAlpha: function () {\n\n\t\t\treturn clearAlpha;\n\n\t\t},\n\t\tsetClearAlpha: function ( alpha ) {\n\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\trender: render\n\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLBufferRenderer( gl, extensions, info ) {\n\n\tvar mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawArrays( mode, start, count );\n\n\t\tinfo.update( count, mode );\n\n\t}\n\n\tfunction renderInstances( geometry, start, count ) {\n\n\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\tif ( extension === null ) {\n\n\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tvar position = geometry.attributes.position;\n\n\t\tif ( position.isInterleavedBufferAttribute ) {\n\n\t\t\tcount = position.data.count;\n\n\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\n\n\t\t} else {\n\n\t\t\textension.drawArraysInstancedANGLE( mode, start, count, geometry.maxInstancedCount );\n\n\t\t}\n\n\t\tinfo.update( count, mode, geometry.maxInstancedCount );\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLCapabilities( gl, extensions, parameters ) {\n\n\tvar maxAnisotropy;\n\n\tfunction getMaxAnisotropy() {\n\n\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\tvar extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\tif ( extension !== null ) {\n\n\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t} else {\n\n\t\t\tmaxAnisotropy = 0;\n\n\t\t}\n\n\t\treturn maxAnisotropy;\n\n\t}\n\n\tfunction getMaxPrecision( precision ) {\n\n\t\tif ( precision === 'highp' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'highp';\n\n\t\t\t}\n\n\t\t\tprecision = 'mediump';\n\n\t\t}\n\n\t\tif ( precision === 'mediump' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'mediump';\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn 'lowp';\n\n\t}\n\n\tvar precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\tvar maxPrecision = getMaxPrecision( precision );\n\n\tif ( maxPrecision !== precision ) {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\tprecision = maxPrecision;\n\n\t}\n\n\tvar logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;\n\n\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\tvar maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\tvar maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\tvar maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\tvar maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\tvar maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\tvar maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\tvar maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\tvar vertexTextures = maxVertexTextures > 0;\n\tvar floatFragmentTextures = !! extensions.get( 'OES_texture_float' );\n\tvar floatVertexTextures = vertexTextures && floatFragmentTextures;\n\n\treturn {\n\n\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\tprecision: precision,\n\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\tmaxTextures: maxTextures,\n\t\tmaxVertexTextures: maxVertexTextures,\n\t\tmaxTextureSize: maxTextureSize,\n\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\tmaxAttributes: maxAttributes,\n\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\tmaxVaryings: maxVaryings,\n\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\tvertexTextures: vertexTextures,\n\t\tfloatFragmentTextures: floatFragmentTextures,\n\t\tfloatVertexTextures: floatVertexTextures\n\n\t};\n\n}\n\n/**\n * @author tschw\n */\n\nfunction WebGLClipping() {\n\n\tvar scope = this,\n\n\t\tglobalState = null,\n\t\tnumGlobalPlanes = 0,\n\t\tlocalClippingEnabled = false,\n\t\trenderingShadows = false,\n\n\t\tplane = new Plane(),\n\t\tviewNormalMatrix = new Matrix3(),\n\n\t\tuniform = { value: null, needsUpdate: false };\n\n\tthis.uniform = uniform;\n\tthis.numPlanes = 0;\n\tthis.numIntersection = 0;\n\n\tthis.init = function ( planes, enableLocalClipping, camera ) {\n\n\t\tvar enabled =\n\t\t\tplanes.length !== 0 ||\n\t\t\tenableLocalClipping ||\n\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t// run another frame in order to reset the state:\n\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\tlocalClippingEnabled;\n\n\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\tglobalState = projectPlanes( planes, camera, 0 );\n\t\tnumGlobalPlanes = planes.length;\n\n\t\treturn enabled;\n\n\t};\n\n\tthis.beginShadows = function () {\n\n\t\trenderingShadows = true;\n\t\tprojectPlanes( null );\n\n\t};\n\n\tthis.endShadows = function () {\n\n\t\trenderingShadows = false;\n\t\tresetGlobalState();\n\n\t};\n\n\tthis.setState = function ( planes, clipIntersection, clipShadows, camera, cache, fromCache ) {\n\n\t\tif ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) {\n\n\t\t\t// there's no local clipping\n\n\t\t\tif ( renderingShadows ) {\n\n\t\t\t\t// there's no global clipping\n\n\t\t\t\tprojectPlanes( null );\n\n\t\t\t} else {\n\n\t\t\t\tresetGlobalState();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tvar nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\tlGlobal = nGlobal * 4,\n\n\t\t\t\tdstArray = cache.clippingState || null;\n\n\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, fromCache );\n\n\t\t\tfor ( var i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t}\n\n\t\t\tcache.clippingState = dstArray;\n\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\tthis.numPlanes += nGlobal;\n\n\t\t}\n\n\n\t};\n\n\tfunction resetGlobalState() {\n\n\t\tif ( uniform.value !== globalState ) {\n\n\t\t\tuniform.value = globalState;\n\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t}\n\n\t\tscope.numPlanes = numGlobalPlanes;\n\t\tscope.numIntersection = 0;\n\n\t}\n\n\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\tvar nPlanes = planes !== null ? planes.length : 0,\n\t\t\tdstArray = null;\n\n\t\tif ( nPlanes !== 0 ) {\n\n\t\t\tdstArray = uniform.value;\n\n\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\tvar flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\tplane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tuniform.value = dstArray;\n\t\t\tuniform.needsUpdate = true;\n\n\t\t}\n\n\t\tscope.numPlanes = nPlanes;\n\n\t\treturn dstArray;\n\n\t}\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLExtensions( gl ) {\n\n\tvar extensions = {};\n\n\treturn {\n\n\t\tget: function ( name ) {\n\n\t\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\t\treturn extensions[ name ];\n\n\t\t\t}\n\n\t\t\tvar extension;\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'WEBGL_depth_texture':\n\t\t\t\t\textension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'EXT_texture_filter_anisotropic':\n\t\t\t\t\textension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\textension = gl.getExtension( name );\n\n\t\t\t}\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t}\n\n\t\t\textensions[ name ] = extension;\n\n\t\t\treturn extension;\n\n\t\t}\n\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLGeometries( gl, attributes, info ) {\n\n\tvar geometries = {};\n\tvar wireframeAttributes = {};\n\n\tfunction onGeometryDispose( event ) {\n\n\t\tvar geometry = event.target;\n\t\tvar buffergeometry = geometries[ geometry.id ];\n\n\t\tif ( buffergeometry.index !== null ) {\n\n\t\t\tattributes.remove( buffergeometry.index );\n\n\t\t}\n\n\t\tfor ( var name in buffergeometry.attributes ) {\n\n\t\t\tattributes.remove( buffergeometry.attributes[ name ] );\n\n\t\t}\n\n\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\tdelete geometries[ geometry.id ];\n\n\t\t// TODO Remove duplicate code\n\n\t\tvar attribute = wireframeAttributes[ geometry.id ];\n\n\t\tif ( attribute ) {\n\n\t\t\tattributes.remove( attribute );\n\t\t\tdelete wireframeAttributes[ geometry.id ];\n\n\t\t}\n\n\t\tattribute = wireframeAttributes[ buffergeometry.id ];\n\n\t\tif ( attribute ) {\n\n\t\t\tattributes.remove( attribute );\n\t\t\tdelete wireframeAttributes[ buffergeometry.id ];\n\n\t\t}\n\n\t\t//\n\n\t\tinfo.memory.geometries --;\n\n\t}\n\n\tfunction get( object, geometry ) {\n\n\t\tvar buffergeometry = geometries[ geometry.id ];\n\n\t\tif ( buffergeometry ) return buffergeometry;\n\n\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tbuffergeometry = geometry;\n\n\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\tif ( geometry._bufferGeometry === undefined ) {\n\n\t\t\t\tgeometry._bufferGeometry = new BufferGeometry().setFromObject( object );\n\n\t\t\t}\n\n\t\t\tbuffergeometry = geometry._bufferGeometry;\n\n\t\t}\n\n\t\tgeometries[ geometry.id ] = buffergeometry;\n\n\t\tinfo.memory.geometries ++;\n\n\t\treturn buffergeometry;\n\n\t}\n\n\tfunction update( geometry ) {\n\n\t\tvar index = geometry.index;\n\t\tvar geometryAttributes = geometry.attributes;\n\n\t\tif ( index !== null ) {\n\n\t\t\tattributes.update( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t}\n\n\t\tfor ( var name in geometryAttributes ) {\n\n\t\t\tattributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t}\n\n\t\t// morph targets\n\n\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\tfor ( var name in morphAttributes ) {\n\n\t\t\tvar array = morphAttributes[ name ];\n\n\t\t\tfor ( var i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tattributes.update( array[ i ], gl.ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction getWireframeAttribute( geometry ) {\n\n\t\tvar attribute = wireframeAttributes[ geometry.id ];\n\n\t\tif ( attribute ) return attribute;\n\n\t\tvar indices = [];\n\n\t\tvar geometryIndex = geometry.index;\n\t\tvar geometryAttributes = geometry.attributes;\n\n\t\t// console.time( 'wireframe' );\n\n\t\tif ( geometryIndex !== null ) {\n\n\t\t\tvar array = geometryIndex.array;\n\n\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tvar a = array[ i + 0 ];\n\t\t\t\tvar b = array[ i + 1 ];\n\t\t\t\tvar c = array[ i + 2 ];\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tvar array = geometryAttributes.position.array;\n\n\t\t\tfor ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\tvar a = i + 0;\n\t\t\t\tvar b = i + 1;\n\t\t\t\tvar c = i + 2;\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// console.timeEnd( 'wireframe' );\n\n\t\tattribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\n\t\tattributes.update( attribute, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\twireframeAttributes[ geometry.id ] = attribute;\n\n\t\treturn attribute;\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tupdate: update,\n\n\t\tgetWireframeAttribute: getWireframeAttribute\n\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLIndexedBufferRenderer( gl, extensions, info ) {\n\n\tvar mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tvar type, bytesPerElement;\n\n\tfunction setIndex( value ) {\n\n\t\ttype = value.type;\n\t\tbytesPerElement = value.bytesPerElement;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawElements( mode, count, type, start * bytesPerElement );\n\n\t\tinfo.update( count, mode );\n\n\t}\n\n\tfunction renderInstances( geometry, start, count ) {\n\n\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\tif ( extension === null ) {\n\n\t\t\tconsole.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\textension.drawElementsInstancedANGLE( mode, count, type, start * bytesPerElement, geometry.maxInstancedCount );\n\n\t\tinfo.update( count, mode, geometry.maxInstancedCount );\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.setIndex = setIndex;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\n}\n\n/**\n * @author Mugen87 / https://github.com/Mugen87\n */\n\nfunction WebGLInfo( gl ) {\n\n\tvar memory = {\n\t\tgeometries: 0,\n\t\ttextures: 0\n\t};\n\n\tvar render = {\n\t\tframe: 0,\n\t\tcalls: 0,\n\t\ttriangles: 0,\n\t\tpoints: 0,\n\t\tlines: 0\n\t};\n\n\tfunction update( count, mode, instanceCount ) {\n\n\t\tinstanceCount = instanceCount || 1;\n\n\t\trender.calls ++;\n\n\t\tswitch ( mode ) {\n\n\t\t\tcase gl.TRIANGLES:\n\t\t\t\trender.triangles += instanceCount * ( count / 3 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.TRIANGLE_STRIP:\n\t\t\tcase gl.TRIANGLE_FAN:\n\t\t\t\trender.triangles += instanceCount * ( count - 2 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINES:\n\t\t\t\trender.lines += instanceCount * ( count / 2 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_STRIP:\n\t\t\t\trender.lines += instanceCount * ( count - 1 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_LOOP:\n\t\t\t\trender.lines += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tcase gl.POINTS:\n\t\t\t\trender.points += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.error( 'THREE.WebGLInfo: Unknown draw mode:', mode );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\trender.frame ++;\n\t\trender.calls = 0;\n\t\trender.triangles = 0;\n\t\trender.points = 0;\n\t\trender.lines = 0;\n\n\t}\n\n\treturn {\n\t\tmemory: memory,\n\t\trender: render,\n\t\tprograms: null,\n\t\tautoReset: true,\n\t\treset: reset,\n\t\tupdate: update\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction absNumericalSort( a, b ) {\n\n\treturn Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] );\n\n}\n\nfunction WebGLMorphtargets( gl ) {\n\n\tvar influencesList = {};\n\tvar morphInfluences = new Float32Array( 8 );\n\n\tfunction update( object, geometry, material, program ) {\n\n\t\tvar objectInfluences = object.morphTargetInfluences;\n\n\t\tvar length = objectInfluences.length;\n\n\t\tvar influences = influencesList[ geometry.id ];\n\n\t\tif ( influences === undefined ) {\n\n\t\t\t// initialise list\n\n\t\t\tinfluences = [];\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tinfluences[ i ] = [ i, 0 ];\n\n\t\t\t}\n\n\t\t\tinfluencesList[ geometry.id ] = influences;\n\n\t\t}\n\n\t\tvar morphTargets = material.morphTargets && geometry.morphAttributes.position;\n\t\tvar morphNormals = material.morphNormals && geometry.morphAttributes.normal;\n\n\t\t// Remove current morphAttributes\n\n\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\tvar influence = influences[ i ];\n\n\t\t\tif ( influence[ 1 ] !== 0 ) {\n\n\t\t\t\tif ( morphTargets ) geometry.removeAttribute( 'morphTarget' + i );\n\t\t\t\tif ( morphNormals ) geometry.removeAttribute( 'morphNormal' + i );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Collect influences\n\n\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\tvar influence = influences[ i ];\n\n\t\t\tinfluence[ 0 ] = i;\n\t\t\tinfluence[ 1 ] = objectInfluences[ i ];\n\n\t\t}\n\n\t\tinfluences.sort( absNumericalSort );\n\n\t\t// Add morphAttributes\n\n\t\tfor ( var i = 0; i < 8; i ++ ) {\n\n\t\t\tvar influence = influences[ i ];\n\n\t\t\tif ( influence ) {\n\n\t\t\t\tvar index = influence[ 0 ];\n\t\t\t\tvar value = influence[ 1 ];\n\n\t\t\t\tif ( value ) {\n\n\t\t\t\t\tif ( morphTargets ) geometry.addAttribute( 'morphTarget' + i, morphTargets[ index ] );\n\t\t\t\t\tif ( morphNormals ) geometry.addAttribute( 'morphNormal' + i, morphNormals[ index ] );\n\n\t\t\t\t\tmorphInfluences[ i ] = value;\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tmorphInfluences[ i ] = 0;\n\n\t\t}\n\n\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update\n\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLObjects( geometries, info ) {\n\n\tvar updateList = {};\n\n\tfunction update( object ) {\n\n\t\tvar frame = info.render.frame;\n\n\t\tvar geometry = object.geometry;\n\t\tvar buffergeometry = geometries.get( object, geometry );\n\n\t\t// Update once per frame\n\n\t\tif ( updateList[ buffergeometry.id ] !== frame ) {\n\n\t\t\tif ( geometry.isGeometry ) {\n\n\t\t\t\tbuffergeometry.updateFromObject( object );\n\n\t\t\t}\n\n\t\t\tgeometries.update( buffergeometry );\n\n\t\t\tupdateList[ buffergeometry.id ] = frame;\n\n\t\t}\n\n\t\treturn buffergeometry;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tupdateList = {};\n\n\t}\n\n\treturn {\n\n\t\tupdate: update,\n\t\tdispose: dispose\n\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\timages = images !== undefined ? images : [];\n\tmapping = mapping !== undefined ? mapping : CubeReflectionMapping;\n\n\tTexture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\tthis.flipY = false;\n\n}\n\nCubeTexture.prototype = Object.create( Texture.prototype );\nCubeTexture.prototype.constructor = CubeTexture;\n\nCubeTexture.prototype.isCubeTexture = true;\n\nObject.defineProperty( CubeTexture.prototype, 'images', {\n\n\tget: function () {\n\n\t\treturn this.image;\n\n\t},\n\n\tset: function ( value ) {\n\n\t\tthis.image = value;\n\n\t}\n\n} );\n\n/**\n * @author tschw\n *\n * Uniforms of a program.\n * Those form a tree structure with a special top-level container for the root,\n * which you get by calling 'new WebGLUniforms( gl, program, renderer )'.\n *\n *\n * Properties of inner nodes including the top-level container:\n *\n * .seq - array of nested uniforms\n * .map - nested uniforms by name\n *\n *\n * Methods of all nodes except the top-level container:\n *\n * .setValue( gl, value, [renderer] )\n *\n * \t\tuploads a uniform value(s)\n * \tthe 'renderer' parameter is needed for sampler uniforms\n *\n *\n * Static methods of the top-level container (renderer factorizations):\n *\n * .upload( gl, seq, values, renderer )\n *\n * \t\tsets uniforms in 'seq' to 'values[id].value'\n *\n * .seqWithValue( seq, values ) : filteredSeq\n *\n * \t\tfilters 'seq' entries with corresponding entry in values\n *\n *\n * Methods of the top-level container (renderer factorizations):\n *\n * .setValue( gl, name, value )\n *\n * \t\tsets uniform with name 'name' to 'value'\n *\n * .set( gl, obj, prop )\n *\n * \t\tsets uniform from object and property with same name than uniform\n *\n * .setOptional( gl, obj, prop )\n *\n * \t\tlike .set for an optional property of the object\n *\n */\n\nvar emptyTexture = new Texture();\nvar emptyCubeTexture = new CubeTexture();\n\n// --- Base for inner nodes (including the root) ---\n\nfunction UniformContainer() {\n\n\tthis.seq = [];\n\tthis.map = {};\n\n}\n\n// --- Utilities ---\n\n// Array Caches (provide typed arrays for temporary by size)\n\nvar arrayCacheF32 = [];\nvar arrayCacheI32 = [];\n\n// Float32Array caches used for uploading Matrix uniforms\n\nvar mat4array = new Float32Array( 16 );\nvar mat3array = new Float32Array( 9 );\n\n// Flattening for arrays of vectors and matrices\n\nfunction flatten( array, nBlocks, blockSize ) {\n\n\tvar firstElem = array[ 0 ];\n\n\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t// unoptimized: ! isNaN( firstElem )\n\t// see http://jacksondunstan.com/articles/983\n\n\tvar n = nBlocks * blockSize,\n\t\tr = arrayCacheF32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Float32Array( n );\n\t\tarrayCacheF32[ n ] = r;\n\n\t}\n\n\tif ( nBlocks !== 0 ) {\n\n\t\tfirstElem.toArray( r, 0 );\n\n\t\tfor ( var i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\toffset += blockSize;\n\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t}\n\n\t}\n\n\treturn r;\n\n}\n\n// Texture unit allocation\n\nfunction allocTexUnits( renderer, n ) {\n\n\tvar r = arrayCacheI32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Int32Array( n );\n\t\tarrayCacheI32[ n ] = r;\n\n\t}\n\n\tfor ( var i = 0; i !== n; ++ i )\n\t\tr[ i ] = renderer.allocTextureUnit();\n\n\treturn r;\n\n}\n\n// --- Setters ---\n\n// Note: Defining these methods externally, because they come in a bunch\n// and this way their names minify.\n\n// Single scalar\n\nfunction setValue1f( gl, v ) {\n\n\tgl.uniform1f( this.addr, v );\n\n}\n\nfunction setValue1i( gl, v ) {\n\n\tgl.uniform1i( this.addr, v );\n\n}\n\n// Single float vector (from flat array or THREE.VectorN)\n\nfunction setValue2fv( gl, v ) {\n\n\tif ( v.x === undefined ) {\n\n\t\tgl.uniform2fv( this.addr, v );\n\n\t} else {\n\n\t\tgl.uniform2f( this.addr, v.x, v.y );\n\n\t}\n\n}\n\nfunction setValue3fv( gl, v ) {\n\n\tif ( v.x !== undefined ) {\n\n\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\n\t} else if ( v.r !== undefined ) {\n\n\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\n\t} else {\n\n\t\tgl.uniform3fv( this.addr, v );\n\n\t}\n\n}\n\nfunction setValue4fv( gl, v ) {\n\n\tif ( v.x === undefined ) {\n\n\t\tgl.uniform4fv( this.addr, v );\n\n\t} else {\n\n\t\t gl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t}\n\n}\n\n// Single matrix (from flat array or MatrixN)\n\nfunction setValue2fm( gl, v ) {\n\n\tgl.uniformMatrix2fv( this.addr, false, v.elements || v );\n\n}\n\nfunction setValue3fm( gl, v ) {\n\n\tif ( v.elements === undefined ) {\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v );\n\n\t} else {\n\n\t\tmat3array.set( v.elements );\n\t\tgl.uniformMatrix3fv( this.addr, false, mat3array );\n\n\t}\n\n}\n\nfunction setValue4fm( gl, v ) {\n\n\tif ( v.elements === undefined ) {\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v );\n\n\t} else {\n\n\t\tmat4array.set( v.elements );\n\t\tgl.uniformMatrix4fv( this.addr, false, mat4array );\n\n\t}\n\n}\n\n// Single texture (2D / Cube)\n\nfunction setValueT1( gl, v, renderer ) {\n\n\tvar unit = renderer.allocTextureUnit();\n\tgl.uniform1i( this.addr, unit );\n\trenderer.setTexture2D( v || emptyTexture, unit );\n\n}\n\nfunction setValueT6( gl, v, renderer ) {\n\n\tvar unit = renderer.allocTextureUnit();\n\tgl.uniform1i( this.addr, unit );\n\trenderer.setTextureCube( v || emptyCubeTexture, unit );\n\n}\n\n// Integer / Boolean vectors or arrays thereof (always flat arrays)\n\nfunction setValue2iv( gl, v ) {\n\n\tgl.uniform2iv( this.addr, v );\n\n}\n\nfunction setValue3iv( gl, v ) {\n\n\tgl.uniform3iv( this.addr, v );\n\n}\n\nfunction setValue4iv( gl, v ) {\n\n\tgl.uniform4iv( this.addr, v );\n\n}\n\n// Helper to pick the right setter for the singular case\n\nfunction getSingularSetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValue1f; // FLOAT\n\t\tcase 0x8b50: return setValue2fv; // _VEC2\n\t\tcase 0x8b51: return setValue3fv; // _VEC3\n\t\tcase 0x8b52: return setValue4fv; // _VEC4\n\n\t\tcase 0x8b5a: return setValue2fm; // _MAT2\n\t\tcase 0x8b5b: return setValue3fm; // _MAT3\n\t\tcase 0x8b5c: return setValue4fm; // _MAT4\n\n\t\tcase 0x8b5e: case 0x8d66: return setValueT1; // SAMPLER_2D, SAMPLER_EXTERNAL_OES\n\t\tcase 0x8b60: return setValueT6; // SAMPLER_CUBE\n\n\t\tcase 0x1404: case 0x8b56: return setValue1i; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t}\n\n}\n\n// Array of scalars\n\nfunction setValue1fv( gl, v ) {\n\n\tgl.uniform1fv( this.addr, v );\n\n}\nfunction setValue1iv( gl, v ) {\n\n\tgl.uniform1iv( this.addr, v );\n\n}\n\n// Array of vectors (flat or from THREE classes)\n\nfunction setValueV2a( gl, v ) {\n\n\tgl.uniform2fv( this.addr, flatten( v, this.size, 2 ) );\n\n}\n\nfunction setValueV3a( gl, v ) {\n\n\tgl.uniform3fv( this.addr, flatten( v, this.size, 3 ) );\n\n}\n\nfunction setValueV4a( gl, v ) {\n\n\tgl.uniform4fv( this.addr, flatten( v, this.size, 4 ) );\n\n}\n\n// Array of matrices (flat or from THREE clases)\n\nfunction setValueM2a( gl, v ) {\n\n\tgl.uniformMatrix2fv( this.addr, false, flatten( v, this.size, 4 ) );\n\n}\n\nfunction setValueM3a( gl, v ) {\n\n\tgl.uniformMatrix3fv( this.addr, false, flatten( v, this.size, 9 ) );\n\n}\n\nfunction setValueM4a( gl, v ) {\n\n\tgl.uniformMatrix4fv( this.addr, false, flatten( v, this.size, 16 ) );\n\n}\n\n// Array of textures (2D / Cube)\n\nfunction setValueT1a( gl, v, renderer ) {\n\n\tvar n = v.length,\n\t\tunits = allocTexUnits( renderer, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\trenderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT6a( gl, v, renderer ) {\n\n\tvar n = v.length,\n\t\tunits = allocTexUnits( renderer, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\trenderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t}\n\n}\n\n// Helper to pick the right setter for a pure (bottom-level) array\n\nfunction getPureArraySetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValue1fv; // FLOAT\n\t\tcase 0x8b50: return setValueV2a; // _VEC2\n\t\tcase 0x8b51: return setValueV3a; // _VEC3\n\t\tcase 0x8b52: return setValueV4a; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2a; // _MAT2\n\t\tcase 0x8b5b: return setValueM3a; // _MAT3\n\t\tcase 0x8b5c: return setValueM4a; // _MAT4\n\n\t\tcase 0x8b5e: return setValueT1a; // SAMPLER_2D\n\t\tcase 0x8b60: return setValueT6a; // SAMPLER_CUBE\n\n\t\tcase 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t}\n\n}\n\n// --- Uniform Classes ---\n\nfunction SingleUniform( id, activeInfo, addr ) {\n\n\tthis.id = id;\n\tthis.addr = addr;\n\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t// this.path = activeInfo.name; // DEBUG\n\n}\n\nfunction PureArrayUniform( id, activeInfo, addr ) {\n\n\tthis.id = id;\n\tthis.addr = addr;\n\tthis.size = activeInfo.size;\n\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t// this.path = activeInfo.name; // DEBUG\n\n}\n\nfunction StructuredUniform( id ) {\n\n\tthis.id = id;\n\n\tUniformContainer.call( this ); // mix-in\n\n}\n\nStructuredUniform.prototype.setValue = function ( gl, value ) {\n\n\t// Note: Don't need an extra 'renderer' parameter, since samplers\n\t// are not allowed in structured uniforms.\n\n\tvar seq = this.seq;\n\n\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tvar u = seq[ i ];\n\t\tu.setValue( gl, value[ u.id ] );\n\n\t}\n\n};\n\n// --- Top-level ---\n\n// Parser - builds up the property tree from the path strings\n\nvar RePathPart = /([\\w\\d_]+)(\\])?(\\[|\\.)?/g;\n\n// extracts\n// \t- the identifier (member name or array index)\n// - followed by an optional right bracket (found when array index)\n// - followed by an optional left bracket or dot (type of subscript)\n//\n// Note: These portions can be read in a non-overlapping fashion and\n// allow straightforward parsing of the hierarchy that WebGL encodes\n// in the uniform names.\n\nfunction addUniform( container, uniformObject ) {\n\n\tcontainer.seq.push( uniformObject );\n\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n}\n\nfunction parseUniform( activeInfo, addr, container ) {\n\n\tvar path = activeInfo.name,\n\t\tpathLength = path.length;\n\n\t// reset RegExp object, because of the early exit of a previous run\n\tRePathPart.lastIndex = 0;\n\n\tfor ( ; ; ) {\n\n\t\tvar match = RePathPart.exec( path ),\n\t\t\tmatchEnd = RePathPart.lastIndex,\n\n\t\t\tid = match[ 1 ],\n\t\t\tidIsIndex = match[ 2 ] === ']',\n\t\t\tsubscript = match[ 3 ];\n\n\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\tif ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) {\n\n\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\tbreak;\n\n\t\t} else {\n\n\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\tvar map = container.map, next = map[ id ];\n\n\t\t\tif ( next === undefined ) {\n\n\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\taddUniform( container, next );\n\n\t\t\t}\n\n\t\t\tcontainer = next;\n\n\t\t}\n\n\t}\n\n}\n\n// Root Container\n\nfunction WebGLUniforms( gl, program, renderer ) {\n\n\tUniformContainer.call( this );\n\n\tthis.renderer = renderer;\n\n\tvar n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\tfor ( var i = 0; i < n; ++ i ) {\n\n\t\tvar info = gl.getActiveUniform( program, i ),\n\t\t\taddr = gl.getUniformLocation( program, info.name );\n\n\t\tparseUniform( info, addr, this );\n\n\t}\n\n}\n\nWebGLUniforms.prototype.setValue = function ( gl, name, value ) {\n\n\tvar u = this.map[ name ];\n\n\tif ( u !== undefined ) u.setValue( gl, value, this.renderer );\n\n};\n\nWebGLUniforms.prototype.setOptional = function ( gl, object, name ) {\n\n\tvar v = object[ name ];\n\n\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n};\n\n\n// Static interface\n\nWebGLUniforms.upload = function ( gl, seq, values, renderer ) {\n\n\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tvar u = seq[ i ],\n\t\t\tv = values[ u.id ];\n\n\t\tif ( v.needsUpdate !== false ) {\n\n\t\t\t// note: always updating when .needsUpdate is undefined\n\t\t\tu.setValue( gl, v.value, renderer );\n\n\t\t}\n\n\t}\n\n};\n\nWebGLUniforms.seqWithValue = function ( seq, values ) {\n\n\tvar r = [];\n\n\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tvar u = seq[ i ];\n\t\tif ( u.id in values ) r.push( u );\n\n\t}\n\n\treturn r;\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction addLineNumbers( string ) {\n\n\tvar lines = string.split( '\\n' );\n\n\tfor ( var i = 0; i < lines.length; i ++ ) {\n\n\t\tlines[ i ] = ( i + 1 ) + ': ' + lines[ i ];\n\n\t}\n\n\treturn lines.join( '\\n' );\n\n}\n\nfunction WebGLShader( gl, type, string ) {\n\n\tvar shader = gl.createShader( type );\n\n\tgl.shaderSource( shader, string );\n\tgl.compileShader( shader );\n\n\tif ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) {\n\n\t\tconsole.error( 'THREE.WebGLShader: Shader couldn\\'t compile.' );\n\n\t}\n\n\tif ( gl.getShaderInfoLog( shader ) !== '' ) {\n\n\t\tconsole.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) );\n\n\t}\n\n\t// --enable-privileged-webgl-extension\n\t// console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\treturn shader;\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nvar programIdCount = 0;\n\nfunction getEncodingComponents( encoding ) {\n\n\tswitch ( encoding ) {\n\n\t\tcase LinearEncoding:\n\t\t\treturn [ 'Linear', '( value )' ];\n\t\tcase sRGBEncoding:\n\t\t\treturn [ 'sRGB', '( value )' ];\n\t\tcase RGBEEncoding:\n\t\t\treturn [ 'RGBE', '( value )' ];\n\t\tcase RGBM7Encoding:\n\t\t\treturn [ 'RGBM', '( value, 7.0 )' ];\n\t\tcase RGBM16Encoding:\n\t\t\treturn [ 'RGBM', '( value, 16.0 )' ];\n\t\tcase RGBDEncoding:\n\t\t\treturn [ 'RGBD', '( value, 256.0 )' ];\n\t\tcase GammaEncoding:\n\t\t\treturn [ 'Gamma', '( value, float( GAMMA_FACTOR ) )' ];\n\t\tdefault:\n\t\t\tthrow new Error( 'unsupported encoding: ' + encoding );\n\n\t}\n\n}\n\nfunction getTexelDecodingFunction( functionName, encoding ) {\n\n\tvar components = getEncodingComponents( encoding );\n\treturn 'vec4 ' + functionName + '( vec4 value ) { return ' + components[ 0 ] + 'ToLinear' + components[ 1 ] + '; }';\n\n}\n\nfunction getTexelEncodingFunction( functionName, encoding ) {\n\n\tvar components = getEncodingComponents( encoding );\n\treturn 'vec4 ' + functionName + '( vec4 value ) { return LinearTo' + components[ 0 ] + components[ 1 ] + '; }';\n\n}\n\nfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\tvar toneMappingName;\n\n\tswitch ( toneMapping ) {\n\n\t\tcase LinearToneMapping:\n\t\t\ttoneMappingName = 'Linear';\n\t\t\tbreak;\n\n\t\tcase ReinhardToneMapping:\n\t\t\ttoneMappingName = 'Reinhard';\n\t\t\tbreak;\n\n\t\tcase Uncharted2ToneMapping:\n\t\t\ttoneMappingName = 'Uncharted2';\n\t\t\tbreak;\n\n\t\tcase CineonToneMapping:\n\t\t\ttoneMappingName = 'OptimizedCineon';\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tthrow new Error( 'unsupported toneMapping: ' + toneMapping );\n\n\t}\n\n\treturn 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }';\n\n}\n\nfunction generateExtensions( extensions, parameters, rendererExtensions ) {\n\n\textensions = extensions || {};\n\n\tvar chunks = [\n\t\t( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '',\n\t\t( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '',\n\t\t( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '',\n\t\t( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : ''\n\t];\n\n\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n}\n\nfunction generateDefines( defines ) {\n\n\tvar chunks = [];\n\n\tfor ( var name in defines ) {\n\n\t\tvar value = defines[ name ];\n\n\t\tif ( value === false ) continue;\n\n\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t}\n\n\treturn chunks.join( '\\n' );\n\n}\n\nfunction fetchAttributeLocations( gl, program ) {\n\n\tvar attributes = {};\n\n\tvar n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\tfor ( var i = 0; i < n; i ++ ) {\n\n\t\tvar info = gl.getActiveAttrib( program, i );\n\t\tvar name = info.name;\n\n\t\t// console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i );\n\n\t\tattributes[ name ] = gl.getAttribLocation( program, name );\n\n\t}\n\n\treturn attributes;\n\n}\n\nfunction filterEmptyLine( string ) {\n\n\treturn string !== '';\n\n}\n\nfunction replaceLightNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights );\n\n}\n\nfunction replaceClippingPlaneNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes )\n\t\t.replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) );\n\n}\n\nfunction parseIncludes( string ) {\n\n\tvar pattern = /^[ \\t]*#include +<([\\w\\d.]+)>/gm;\n\n\tfunction replace( match, include ) {\n\n\t\tvar replace = ShaderChunk[ include ];\n\n\t\tif ( replace === undefined ) {\n\n\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t\t}\n\n\t\treturn parseIncludes( replace );\n\n\t}\n\n\treturn string.replace( pattern, replace );\n\n}\n\nfunction unrollLoops( string ) {\n\n\tvar pattern = /#pragma unroll_loop[\\s]+?for \\( int i \\= (\\d+)\\; i < (\\d+)\\; i \\+\\+ \\) \\{([\\s\\S]+?)(?=\\})\\}/g;\n\n\tfunction replace( match, start, end, snippet ) {\n\n\t\tvar unroll = '';\n\n\t\tfor ( var i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\t\tunroll += snippet.replace( /\\[ i \\]/g, '[ ' + i + ' ]' );\n\n\t\t}\n\n\t\treturn unroll;\n\n\t}\n\n\treturn string.replace( pattern, replace );\n\n}\n\nfunction WebGLProgram( renderer, extensions, code, material, shader, parameters ) {\n\n\tvar gl = renderer.context;\n\n\tvar defines = material.defines;\n\n\tvar vertexShader = shader.vertexShader;\n\tvar fragmentShader = shader.fragmentShader;\n\n\tvar shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t}\n\n\tvar envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\tvar envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\tvar envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\tcase CubeReflectionMapping:\n\t\t\tcase CubeRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\tbreak;\n\n\t\t\tcase CubeUVReflectionMapping:\n\t\t\tcase CubeUVRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\tbreak;\n\n\t\t\tcase EquirectangularReflectionMapping:\n\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_EQUIREC';\n\t\t\t\tbreak;\n\n\t\t\tcase SphericalReflectionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_SPHERE';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\tcase CubeRefractionMapping:\n\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tswitch ( material.combine ) {\n\n\t\t\tcase MultiplyOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\tbreak;\n\n\t\t\tcase MixOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\tbreak;\n\n\t\t\tcase AddOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tvar gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;\n\n\t// console.log( 'building new program ' );\n\n\t//\n\n\tvar customExtensions = generateExtensions( material.extensions, parameters, extensions );\n\n\tvar customDefines = generateDefines( defines );\n\n\t//\n\n\tvar program = gl.createProgram();\n\n\tvar prefixVertex, prefixFragment;\n\n\tif ( material.isRawShaderMaterial ) {\n\n\t\tprefixVertex = [\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixVertex.length > 0 ) {\n\n\t\t\tprefixVertex += '\\n';\n\n\t\t}\n\n\t\tprefixFragment = [\n\n\t\t\tcustomExtensions,\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixFragment.length > 0 ) {\n\n\t\t\tprefixFragment += '\\n';\n\n\t\t}\n\n\t} else {\n\n\t\tprefixVertex = [\n\n\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t'#define SHADER_NAME ' + shader.name,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',\n\n\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t'#define MAX_BONES ' + parameters.maxBones,\n\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\tparameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\t\t\tparameters.useVertexTexture ? '#define BONE_TEXTURE' : '',\n\n\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\tparameters.logarithmicDepthBuffer && extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t'attribute vec3 position;',\n\t\t\t'attribute vec3 normal;',\n\t\t\t'attribute vec2 uv;',\n\n\t\t\t'#ifdef USE_COLOR',\n\n\t\t\t'\tattribute vec3 color;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_MORPHTARGETS',\n\n\t\t\t'\tattribute vec3 morphTarget0;',\n\t\t\t'\tattribute vec3 morphTarget1;',\n\t\t\t'\tattribute vec3 morphTarget2;',\n\t\t\t'\tattribute vec3 morphTarget3;',\n\n\t\t\t'\t#ifdef USE_MORPHNORMALS',\n\n\t\t\t'\t\tattribute vec3 morphNormal0;',\n\t\t\t'\t\tattribute vec3 morphNormal1;',\n\t\t\t'\t\tattribute vec3 morphNormal2;',\n\t\t\t'\t\tattribute vec3 morphNormal3;',\n\n\t\t\t'\t#else',\n\n\t\t\t'\t\tattribute vec3 morphTarget4;',\n\t\t\t'\t\tattribute vec3 morphTarget5;',\n\t\t\t'\t\tattribute vec3 morphTarget6;',\n\t\t\t'\t\tattribute vec3 morphTarget7;',\n\n\t\t\t'\t#endif',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t'#endif',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tprefixFragment = [\n\n\t\t\tcustomExtensions,\n\n\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t'#define SHADER_NAME ' + shader.name,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '',\n\n\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '',\n\n\t\t\tparameters.physicallyCorrectLights ? '#define PHYSICALLY_CORRECT_LIGHTS' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\tparameters.logarithmicDepthBuffer && extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\tparameters.envMap && extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '',\n\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '',\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '',\n\n\t\t\tparameters.dithering ? '#define DITHERING' : '',\n\n\t\t\t( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\tparameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '',\n\t\t\tparameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '',\n\t\t\tparameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '',\n\t\t\tparameters.outputEncoding ? getTexelEncodingFunction( 'linearToOutputTexel', parameters.outputEncoding ) : '',\n\n\t\t\tparameters.depthPacking ? '#define DEPTH_PACKING ' + material.depthPacking : '',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tvertexShader = parseIncludes( vertexShader );\n\tvertexShader = replaceLightNums( vertexShader, parameters );\n\tvertexShader = replaceClippingPlaneNums( vertexShader, parameters );\n\n\tfragmentShader = parseIncludes( fragmentShader );\n\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\tfragmentShader = replaceClippingPlaneNums( fragmentShader, parameters );\n\n\tvertexShader = unrollLoops( vertexShader );\n\tfragmentShader = unrollLoops( fragmentShader );\n\n\tvar vertexGlsl = prefixVertex + vertexShader;\n\tvar fragmentGlsl = prefixFragment + fragmentShader;\n\n\t// console.log( '*VERTEX*', vertexGlsl );\n\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\tvar glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\tvar glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\tgl.attachShader( program, glVertexShader );\n\tgl.attachShader( program, glFragmentShader );\n\n\t// Force a particular attribute to index 0.\n\n\tif ( material.index0AttributeName !== undefined ) {\n\n\t\tgl.bindAttribLocation( program, 0, material.index0AttributeName );\n\n\t} else if ( parameters.morphTargets === true ) {\n\n\t\t// programs with morphTargets displace position out of attribute 0\n\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t}\n\n\tgl.linkProgram( program );\n\n\tvar programLog = gl.getProgramInfoLog( program ).trim();\n\tvar vertexLog = gl.getShaderInfoLog( glVertexShader ).trim();\n\tvar fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim();\n\n\tvar runnable = true;\n\tvar haveDiagnostics = true;\n\n\t// console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) );\n\t// console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) );\n\n\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\trunnable = false;\n\n\t\tconsole.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog );\n\n\t} else if ( programLog !== '' ) {\n\n\t\tconsole.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog );\n\n\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\thaveDiagnostics = false;\n\n\t}\n\n\tif ( haveDiagnostics ) {\n\n\t\tthis.diagnostics = {\n\n\t\t\trunnable: runnable,\n\t\t\tmaterial: material,\n\n\t\t\tprogramLog: programLog,\n\n\t\t\tvertexShader: {\n\n\t\t\t\tlog: vertexLog,\n\t\t\t\tprefix: prefixVertex\n\n\t\t\t},\n\n\t\t\tfragmentShader: {\n\n\t\t\t\tlog: fragmentLog,\n\t\t\t\tprefix: prefixFragment\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t// clean up\n\n\tgl.deleteShader( glVertexShader );\n\tgl.deleteShader( glFragmentShader );\n\n\t// set up caching for uniform locations\n\n\tvar cachedUniforms;\n\n\tthis.getUniforms = function () {\n\n\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\tcachedUniforms = new WebGLUniforms( gl, program, renderer );\n\n\t\t}\n\n\t\treturn cachedUniforms;\n\n\t};\n\n\t// set up caching for attribute locations\n\n\tvar cachedAttributes;\n\n\tthis.getAttributes = function () {\n\n\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t\t}\n\n\t\treturn cachedAttributes;\n\n\t};\n\n\t// free resource\n\n\tthis.destroy = function () {\n\n\t\tgl.deleteProgram( program );\n\t\tthis.program = undefined;\n\n\t};\n\n\t// DEPRECATED\n\n\tObject.defineProperties( this, {\n\n\t\tuniforms: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' );\n\t\t\t\treturn this.getUniforms();\n\n\t\t\t}\n\t\t},\n\n\t\tattributes: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' );\n\t\t\t\treturn this.getAttributes();\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\n\t//\n\n\tthis.name = shader.name;\n\tthis.id = programIdCount ++;\n\tthis.code = code;\n\tthis.usedTimes = 1;\n\tthis.program = program;\n\tthis.vertexShader = glVertexShader;\n\tthis.fragmentShader = glFragmentShader;\n\n\treturn this;\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLPrograms( renderer, extensions, capabilities ) {\n\n\tvar programs = [];\n\n\tvar shaderIDs = {\n\t\tMeshDepthMaterial: 'depth',\n\t\tMeshDistanceMaterial: 'distanceRGBA',\n\t\tMeshNormalMaterial: 'normal',\n\t\tMeshBasicMaterial: 'basic',\n\t\tMeshLambertMaterial: 'lambert',\n\t\tMeshPhongMaterial: 'phong',\n\t\tMeshToonMaterial: 'phong',\n\t\tMeshStandardMaterial: 'physical',\n\t\tMeshPhysicalMaterial: 'physical',\n\t\tLineBasicMaterial: 'basic',\n\t\tLineDashedMaterial: 'dashed',\n\t\tPointsMaterial: 'points',\n\t\tShadowMaterial: 'shadow'\n\t};\n\n\tvar parameterNames = [\n\t\t\"precision\", \"supportsVertexTextures\", \"map\", \"mapEncoding\", \"envMap\", \"envMapMode\", \"envMapEncoding\",\n\t\t\"lightMap\", \"aoMap\", \"emissiveMap\", \"emissiveMapEncoding\", \"bumpMap\", \"normalMap\", \"displacementMap\", \"specularMap\",\n\t\t\"roughnessMap\", \"metalnessMap\", \"gradientMap\",\n\t\t\"alphaMap\", \"combine\", \"vertexColors\", \"fog\", \"useFog\", \"fogExp\",\n\t\t\"flatShading\", \"sizeAttenuation\", \"logarithmicDepthBuffer\", \"skinning\",\n\t\t\"maxBones\", \"useVertexTexture\", \"morphTargets\", \"morphNormals\",\n\t\t\"maxMorphTargets\", \"maxMorphNormals\", \"premultipliedAlpha\",\n\t\t\"numDirLights\", \"numPointLights\", \"numSpotLights\", \"numHemiLights\", \"numRectAreaLights\",\n\t\t\"shadowMapEnabled\", \"shadowMapType\", \"toneMapping\", 'physicallyCorrectLights',\n\t\t\"alphaTest\", \"doubleSided\", \"flipSided\", \"numClippingPlanes\", \"numClipIntersection\", \"depthPacking\", \"dithering\"\n\t];\n\n\n\tfunction allocateBones( object ) {\n\n\t\tvar skeleton = object.skeleton;\n\t\tvar bones = skeleton.bones;\n\n\t\tif ( capabilities.floatVertexTextures ) {\n\n\t\t\treturn 1024;\n\n\t\t} else {\n\n\t\t\t// default for when object is not specified\n\t\t\t// ( for example when prebuilding shader to be used with multiple objects )\n\t\t\t//\n\t\t\t// - leave some extra space for other uniforms\n\t\t\t// - limit here is ANGLE's 254 max uniform vectors\n\t\t\t// (up to 54 should be safe)\n\n\t\t\tvar nVertexUniforms = capabilities.maxVertexUniforms;\n\t\t\tvar nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );\n\n\t\t\tvar maxBones = Math.min( nVertexMatrices, bones.length );\n\n\t\t\tif ( maxBones < bones.length ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Skeleton has ' + bones.length + ' bones. This GPU supports ' + maxBones + '.' );\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\treturn maxBones;\n\n\t\t}\n\n\t}\n\n\tfunction getTextureEncodingFromMap( map, gammaOverrideLinear ) {\n\n\t\tvar encoding;\n\n\t\tif ( ! map ) {\n\n\t\t\tencoding = LinearEncoding;\n\n\t\t} else if ( map.isTexture ) {\n\n\t\t\tencoding = map.encoding;\n\n\t\t} else if ( map.isWebGLRenderTarget ) {\n\n\t\t\tconsole.warn( \"THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\tencoding = map.texture.encoding;\n\n\t\t}\n\n\t\t// add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point.\n\t\tif ( encoding === LinearEncoding && gammaOverrideLinear ) {\n\n\t\t\tencoding = GammaEncoding;\n\n\t\t}\n\n\t\treturn encoding;\n\n\t}\n\n\tthis.getParameters = function ( material, lights, shadows, fog, nClipPlanes, nClipIntersection, object ) {\n\n\t\tvar shaderID = shaderIDs[ material.type ];\n\n\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t// (not to blow over maxLights budget)\n\n\t\tvar maxBones = object.isSkinnedMesh ? allocateBones( object ) : 0;\n\t\tvar precision = capabilities.precision;\n\n\t\tif ( material.precision !== null ) {\n\n\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar currentRenderTarget = renderer.getRenderTarget();\n\n\t\tvar parameters = {\n\n\t\t\tshaderID: shaderID,\n\n\t\t\tprecision: precision,\n\t\t\tsupportsVertexTextures: capabilities.vertexTextures,\n\t\t\toutputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ),\n\t\t\tmap: !! material.map,\n\t\t\tmapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ),\n\t\t\tenvMap: !! material.envMap,\n\t\t\tenvMapMode: material.envMap && material.envMap.mapping,\n\t\t\tenvMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ),\n\t\t\tenvMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ),\n\t\t\tlightMap: !! material.lightMap,\n\t\t\taoMap: !! material.aoMap,\n\t\t\temissiveMap: !! material.emissiveMap,\n\t\t\temissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ),\n\t\t\tbumpMap: !! material.bumpMap,\n\t\t\tnormalMap: !! material.normalMap,\n\t\t\tdisplacementMap: !! material.displacementMap,\n\t\t\troughnessMap: !! material.roughnessMap,\n\t\t\tmetalnessMap: !! material.metalnessMap,\n\t\t\tspecularMap: !! material.specularMap,\n\t\t\talphaMap: !! material.alphaMap,\n\n\t\t\tgradientMap: !! material.gradientMap,\n\n\t\t\tcombine: material.combine,\n\n\t\t\tvertexColors: material.vertexColors,\n\n\t\t\tfog: !! fog,\n\t\t\tuseFog: material.fog,\n\t\t\tfogExp: ( fog && fog.isFogExp2 ),\n\n\t\t\tflatShading: material.flatShading,\n\n\t\t\tsizeAttenuation: material.sizeAttenuation,\n\t\t\tlogarithmicDepthBuffer: capabilities.logarithmicDepthBuffer,\n\n\t\t\tskinning: material.skinning && maxBones > 0,\n\t\t\tmaxBones: maxBones,\n\t\t\tuseVertexTexture: capabilities.floatVertexTextures,\n\n\t\t\tmorphTargets: material.morphTargets,\n\t\t\tmorphNormals: material.morphNormals,\n\t\t\tmaxMorphTargets: renderer.maxMorphTargets,\n\t\t\tmaxMorphNormals: renderer.maxMorphNormals,\n\n\t\t\tnumDirLights: lights.directional.length,\n\t\t\tnumPointLights: lights.point.length,\n\t\t\tnumSpotLights: lights.spot.length,\n\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\tnumClippingPlanes: nClipPlanes,\n\t\t\tnumClipIntersection: nClipIntersection,\n\n\t\t\tdithering: material.dithering,\n\n\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && shadows.length > 0,\n\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\ttoneMapping: renderer.toneMapping,\n\t\t\tphysicallyCorrectLights: renderer.physicallyCorrectLights,\n\n\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\talphaTest: material.alphaTest,\n\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\tflipSided: material.side === BackSide,\n\n\t\t\tdepthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false\n\n\t\t};\n\n\t\treturn parameters;\n\n\t};\n\n\tthis.getProgramCode = function ( material, parameters ) {\n\n\t\tvar array = [];\n\n\t\tif ( parameters.shaderID ) {\n\n\t\t\tarray.push( parameters.shaderID );\n\n\t\t} else {\n\n\t\t\tarray.push( material.fragmentShader );\n\t\t\tarray.push( material.vertexShader );\n\n\t\t}\n\n\t\tif ( material.defines !== undefined ) {\n\n\t\t\tfor ( var name in material.defines ) {\n\n\t\t\t\tarray.push( name );\n\t\t\t\tarray.push( material.defines[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( var i = 0; i < parameterNames.length; i ++ ) {\n\n\t\t\tarray.push( parameters[ parameterNames[ i ] ] );\n\n\t\t}\n\n\t\tarray.push( material.onBeforeCompile.toString() );\n\n\t\tarray.push( renderer.gammaOutput );\n\n\t\treturn array.join();\n\n\t};\n\n\tthis.acquireProgram = function ( material, shader, parameters, code ) {\n\n\t\tvar program;\n\n\t\t// Check if code has been already compiled\n\t\tfor ( var p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\tvar programInfo = programs[ p ];\n\n\t\t\tif ( programInfo.code === code ) {\n\n\t\t\t\tprogram = programInfo;\n\t\t\t\t++ program.usedTimes;\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( program === undefined ) {\n\n\t\t\tprogram = new WebGLProgram( renderer, extensions, code, material, shader, parameters );\n\t\t\tprograms.push( program );\n\n\t\t}\n\n\t\treturn program;\n\n\t};\n\n\tthis.releaseProgram = function ( program ) {\n\n\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t// Remove from unordered set\n\t\t\tvar i = programs.indexOf( program );\n\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\tprograms.pop();\n\n\t\t\t// Free WebGL resources\n\t\t\tprogram.destroy();\n\n\t\t}\n\n\t};\n\n\t// Exposed for resource monitoring & error feedback via renderer.info:\n\tthis.programs = programs;\n\n}\n\n/**\n * @author fordacious / fordacious.github.io\n */\n\nfunction WebGLProperties() {\n\n\tvar properties = new WeakMap();\n\n\tfunction get( object ) {\n\n\t\tvar map = properties.get( object );\n\n\t\tif ( map === undefined ) {\n\n\t\t\tmap = {};\n\t\t\tproperties.set( object, map );\n\n\t\t}\n\n\t\treturn map;\n\n\t}\n\n\tfunction remove( object ) {\n\n\t\tproperties.delete( object );\n\n\t}\n\n\tfunction update( object, key, value ) {\n\n\t\tproperties.get( object )[ key ] = value;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tproperties = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update,\n\t\tdispose: dispose\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction painterSortStable( a, b ) {\n\n\tif ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.program && b.program && a.program !== b.program ) {\n\n\t\treturn a.program.id - b.program.id;\n\n\t} else if ( a.material.id !== b.material.id ) {\n\n\t\treturn a.material.id - b.material.id;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn a.z - b.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\nfunction reversePainterSortStable( a, b ) {\n\n\tif ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} if ( a.z !== b.z ) {\n\n\t\treturn b.z - a.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\nfunction WebGLRenderList() {\n\n\tvar renderItems = [];\n\tvar renderItemsIndex = 0;\n\n\tvar opaque = [];\n\tvar transparent = [];\n\n\tfunction init() {\n\n\t\trenderItemsIndex = 0;\n\n\t\topaque.length = 0;\n\t\ttransparent.length = 0;\n\n\t}\n\n\tfunction push( object, geometry, material, z, group ) {\n\n\t\tvar renderItem = renderItems[ renderItemsIndex ];\n\n\t\tif ( renderItem === undefined ) {\n\n\t\t\trenderItem = {\n\t\t\t\tid: object.id,\n\t\t\t\tobject: object,\n\t\t\t\tgeometry: geometry,\n\t\t\t\tmaterial: material,\n\t\t\t\tprogram: material.program,\n\t\t\t\trenderOrder: object.renderOrder,\n\t\t\t\tz: z,\n\t\t\t\tgroup: group\n\t\t\t};\n\n\t\t\trenderItems[ renderItemsIndex ] = renderItem;\n\n\t\t} else {\n\n\t\t\trenderItem.id = object.id;\n\t\t\trenderItem.object = object;\n\t\t\trenderItem.geometry = geometry;\n\t\t\trenderItem.material = material;\n\t\t\trenderItem.program = material.program;\n\t\t\trenderItem.renderOrder = object.renderOrder;\n\t\t\trenderItem.z = z;\n\t\t\trenderItem.group = group;\n\n\t\t}\n\n\t\t( material.transparent === true ? transparent : opaque ).push( renderItem );\n\n\t\trenderItemsIndex ++;\n\n\t}\n\n\tfunction sort() {\n\n\t\tif ( opaque.length > 1 ) opaque.sort( painterSortStable );\n\t\tif ( transparent.length > 1 ) transparent.sort( reversePainterSortStable );\n\n\t}\n\n\treturn {\n\t\topaque: opaque,\n\t\ttransparent: transparent,\n\n\t\tinit: init,\n\t\tpush: push,\n\n\t\tsort: sort\n\t};\n\n}\n\nfunction WebGLRenderLists() {\n\n\tvar lists = {};\n\n\tfunction get( scene, camera ) {\n\n\t\tvar hash = scene.id + ',' + camera.id;\n\t\tvar list = lists[ hash ];\n\n\t\tif ( list === undefined ) {\n\n\t\t\t// console.log( 'THREE.WebGLRenderLists:', hash );\n\n\t\t\tlist = new WebGLRenderList();\n\t\t\tlists[ hash ] = list;\n\n\t\t}\n\n\t\treturn list;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tlists = {};\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction UniformsCache() {\n\n\tvar lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tvar uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\n\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2(),\n\t\t\t\t\t\tshadowCameraNear: 1,\n\t\t\t\t\t\tshadowCameraFar: 1000\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\nvar count = 0;\n\nfunction WebGLLights() {\n\n\tvar cache = new UniformsCache();\n\n\tvar state = {\n\n\t\tid: count ++,\n\n\t\thash: '',\n\n\t\tambient: [ 0, 0, 0 ],\n\t\tdirectional: [],\n\t\tdirectionalShadowMap: [],\n\t\tdirectionalShadowMatrix: [],\n\t\tspot: [],\n\t\tspotShadowMap: [],\n\t\tspotShadowMatrix: [],\n\t\trectArea: [],\n\t\tpoint: [],\n\t\tpointShadowMap: [],\n\t\tpointShadowMatrix: [],\n\t\themi: []\n\n\t};\n\n\tvar vector3 = new Vector3();\n\tvar matrix4 = new Matrix4();\n\tvar matrix42 = new Matrix4();\n\n\tfunction setup( lights, shadows, camera ) {\n\n\t\tvar r = 0, g = 0, b = 0;\n\n\t\tvar directionalLength = 0;\n\t\tvar pointLength = 0;\n\t\tvar spotLength = 0;\n\t\tvar rectAreaLength = 0;\n\t\tvar hemiLength = 0;\n\n\t\tvar viewMatrix = camera.matrixWorldInverse;\n\n\t\tfor ( var i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tvar light = lights[ i ];\n\n\t\t\tvar color = light.color;\n\t\t\tvar intensity = light.intensity;\n\t\t\tvar distance = light.distance;\n\n\t\t\tvar shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\tr += color.r * intensity;\n\t\t\t\tg += color.g * intensity;\n\t\t\t\tb += color.b * intensity;\n\n\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\tvar uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tvar shadow = light.shadow;\n\n\t\t\t\t\tuniforms.shadowBias = shadow.bias;\n\t\t\t\t\tuniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tuniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t}\n\n\t\t\t\tstate.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\tstate.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\t\t\t\tstate.directional[ directionalLength ] = uniforms;\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tvar uniforms = cache.get( light );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tvar shadow = light.shadow;\n\n\t\t\t\t\tuniforms.shadowBias = shadow.bias;\n\t\t\t\t\tuniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tuniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t}\n\n\t\t\t\tstate.spotShadowMap[ spotLength ] = shadowMap;\n\t\t\t\tstate.spotShadowMatrix[ spotLength ] = light.shadow.matrix;\n\t\t\t\tstate.spot[ spotLength ] = uniforms;\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tvar uniforms = cache.get( light );\n\n\t\t\t\t// (a) intensity is the total visible light emitted\n\t\t\t\t//uniforms.color.copy( color ).multiplyScalar( intensity / ( light.width * light.height * Math.PI ) );\n\n\t\t\t\t// (b) intensity is the brightness of the light\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\tmatrix42.identity();\n\t\t\t\tmatrix4.copy( light.matrixWorld );\n\t\t\t\tmatrix4.premultiply( viewMatrix );\n\t\t\t\tmatrix42.extractRotation( matrix4 );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tuniforms.halfWidth.applyMatrix4( matrix42 );\n\t\t\t\tuniforms.halfHeight.applyMatrix4( matrix42 );\n\n\t\t\t\t// TODO (abelnation): RectAreaLight distance?\n\t\t\t\t// uniforms.distance = distance;\n\n\t\t\t\tstate.rectArea[ rectAreaLength ] = uniforms;\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tvar uniforms = cache.get( light );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tvar shadow = light.shadow;\n\n\t\t\t\t\tuniforms.shadowBias = shadow.bias;\n\t\t\t\t\tuniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tuniforms.shadowMapSize = shadow.mapSize;\n\t\t\t\t\tuniforms.shadowCameraNear = shadow.camera.near;\n\t\t\t\t\tuniforms.shadowCameraFar = shadow.camera.far;\n\n\t\t\t\t}\n\n\t\t\t\tstate.pointShadowMap[ pointLength ] = shadowMap;\n\t\t\t\tstate.pointShadowMatrix[ pointLength ] = light.shadow.matrix;\n\t\t\t\tstate.point[ pointLength ] = uniforms;\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tvar uniforms = cache.get( light );\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\t\t\t\tuniforms.direction.normalize();\n\n\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\n\n\t\t\t\tstate.hemi[ hemiLength ] = uniforms;\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.ambient[ 0 ] = r;\n\t\tstate.ambient[ 1 ] = g;\n\t\tstate.ambient[ 2 ] = b;\n\n\t\tstate.directional.length = directionalLength;\n\t\tstate.spot.length = spotLength;\n\t\tstate.rectArea.length = rectAreaLength;\n\t\tstate.point.length = pointLength;\n\t\tstate.hemi.length = hemiLength;\n\n\t\tstate.hash = state.id + ',' + directionalLength + ',' + pointLength + ',' + spotLength + ',' + rectAreaLength + ',' + hemiLength + ',' + shadows.length;\n\n\t}\n\n\treturn {\n\t\tsetup: setup,\n\t\tstate: state\n\t};\n\n}\n\n/**\n * @author Mugen87 / https://github.com/Mugen87\n */\n\nfunction WebGLRenderState() {\n\n\tvar lights = new WebGLLights();\n\n\tvar lightsArray = [];\n\tvar shadowsArray = [];\n\tvar spritesArray = [];\n\n\tfunction init() {\n\n\t\tlightsArray.length = 0;\n\t\tshadowsArray.length = 0;\n\t\tspritesArray.length = 0;\n\n\t}\n\n\tfunction pushLight( light ) {\n\n\t\tlightsArray.push( light );\n\n\t}\n\n\tfunction pushShadow( shadowLight ) {\n\n\t\tshadowsArray.push( shadowLight );\n\n\t}\n\n\tfunction pushSprite( shadowLight ) {\n\n\t\tspritesArray.push( shadowLight );\n\n\t}\n\n\tfunction setupLights( camera ) {\n\n\t\tlights.setup( lightsArray, shadowsArray, camera );\n\n\t}\n\n\tvar state = {\n\t\tlightsArray: lightsArray,\n\t\tshadowsArray: shadowsArray,\n\t\tspritesArray: spritesArray,\n\n\t\tlights: lights\n\t};\n\n\treturn {\n\t\tinit: init,\n\t\tstate: state,\n\t\tsetupLights: setupLights,\n\n\t\tpushLight: pushLight,\n\t\tpushShadow: pushShadow,\n\t\tpushSprite: pushSprite\n\t};\n\n}\n\nfunction WebGLRenderStates() {\n\n\tvar renderStates = {};\n\n\tfunction get( scene, camera ) {\n\n\t\tvar hash = scene.id + ',' + camera.id;\n\n\t\tvar renderState = renderStates[ hash ];\n\n\t\tif ( renderState === undefined ) {\n\n\t\t\trenderState = new WebGLRenderState();\n\t\t\trenderStates[ hash ] = renderState;\n\n\t\t}\n\n\t\treturn renderState;\n\n\t}\n\n\tfunction dispose() {\n\n\t\trenderStates = {};\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n * @author bhouston / https://clara.io\n * @author WestLangley / http://github.com/WestLangley\n *\n * parameters = {\n *\n * opacity: ,\n *\n * map: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: ,\n *\n * wireframe: ,\n * wireframeLinewidth: \n * }\n */\n\nfunction MeshDepthMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshDepthMaterial';\n\n\tthis.depthPacking = BasicDepthPacking;\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\n\tthis.map = null;\n\n\tthis.alphaMap = null;\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\n\tthis.fog = false;\n\tthis.lights = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshDepthMaterial.prototype = Object.create( Material.prototype );\nMeshDepthMaterial.prototype.constructor = MeshDepthMaterial;\n\nMeshDepthMaterial.prototype.isMeshDepthMaterial = true;\n\nMeshDepthMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.depthPacking = source.depthPacking;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\n\tthis.map = source.map;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\treturn this;\n\n};\n\n/**\n * @author WestLangley / http://github.com/WestLangley\n *\n * parameters = {\n *\n * referencePosition: ,\n * nearDistance: ,\n * farDistance: ,\n *\n * skinning: ,\n * morphTargets: ,\n *\n * map: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: \n *\n * }\n */\n\nfunction MeshDistanceMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshDistanceMaterial';\n\n\tthis.referencePosition = new Vector3();\n\tthis.nearDistance = 1;\n\tthis.farDistance = 1000;\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\n\tthis.map = null;\n\n\tthis.alphaMap = null;\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.fog = false;\n\tthis.lights = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshDistanceMaterial.prototype = Object.create( Material.prototype );\nMeshDistanceMaterial.prototype.constructor = MeshDistanceMaterial;\n\nMeshDistanceMaterial.prototype.isMeshDistanceMaterial = true;\n\nMeshDistanceMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.referencePosition.copy( source.referencePosition );\n\tthis.nearDistance = source.nearDistance;\n\tthis.farDistance = source.farDistance;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\n\tthis.map = source.map;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\treturn this;\n\n};\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLShadowMap( _renderer, _objects, maxTextureSize ) {\n\n\tvar _frustum = new Frustum(),\n\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t_shadowMapSize = new Vector2(),\n\t\t_maxShadowMapSize = new Vector2( maxTextureSize, maxTextureSize ),\n\n\t\t_lookTarget = new Vector3(),\n\t\t_lightPositionWorld = new Vector3(),\n\n\t\t_MorphingFlag = 1,\n\t\t_SkinningFlag = 2,\n\n\t\t_NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1,\n\n\t\t_depthMaterials = new Array( _NumberOfMaterialVariants ),\n\t\t_distanceMaterials = new Array( _NumberOfMaterialVariants ),\n\n\t\t_materialCache = {};\n\n\tvar shadowSide = { 0: BackSide, 1: FrontSide, 2: DoubleSide };\n\n\tvar cubeDirections = [\n\t\tnew Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ),\n\t\tnew Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 )\n\t];\n\n\tvar cubeUps = [\n\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),\n\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ),\tnew Vector3( 0, 0, - 1 )\n\t];\n\n\tvar cube2DViewPorts = [\n\t\tnew Vector4(), new Vector4(), new Vector4(),\n\t\tnew Vector4(), new Vector4(), new Vector4()\n\t];\n\n\t// init\n\n\tfor ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) {\n\n\t\tvar useMorphing = ( i & _MorphingFlag ) !== 0;\n\t\tvar useSkinning = ( i & _SkinningFlag ) !== 0;\n\n\t\tvar depthMaterial = new MeshDepthMaterial( {\n\n\t\t\tdepthPacking: RGBADepthPacking,\n\n\t\t\tmorphTargets: useMorphing,\n\t\t\tskinning: useSkinning\n\n\t\t} );\n\n\t\t_depthMaterials[ i ] = depthMaterial;\n\n\t\t//\n\n\t\tvar distanceMaterial = new MeshDistanceMaterial( {\n\n\t\t\tmorphTargets: useMorphing,\n\t\t\tskinning: useSkinning\n\n\t\t} );\n\n\t\t_distanceMaterials[ i ] = distanceMaterial;\n\n\t}\n\n\t//\n\n\tvar scope = this;\n\n\tthis.enabled = false;\n\n\tthis.autoUpdate = true;\n\tthis.needsUpdate = false;\n\n\tthis.type = PCFShadowMap;\n\n\tthis.render = function ( lights, scene, camera ) {\n\n\t\tif ( scope.enabled === false ) return;\n\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\tif ( lights.length === 0 ) return;\n\n\t\t// TODO Clean up (needed in case of contextlost)\n\t\tvar _gl = _renderer.context;\n\t\tvar _state = _renderer.state;\n\n\t\t// Set GL state for depth map.\n\t\t_state.disable( _gl.BLEND );\n\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\t\t_state.buffers.depth.setTest( true );\n\t\t_state.setScissorTest( false );\n\n\t\t// render depth map\n\n\t\tvar faceCount;\n\n\t\tfor ( var i = 0, il = lights.length; i < il; i ++ ) {\n\n\t\t\tvar light = lights[ i ];\n\t\t\tvar shadow = light.shadow;\n\t\t\tvar isPointLight = light && light.isPointLight;\n\n\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tvar shadowCamera = shadow.camera;\n\n\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\t\t\t_shadowMapSize.min( _maxShadowMapSize );\n\n\t\t\tif ( isPointLight ) {\n\n\t\t\t\tvar vpWidth = _shadowMapSize.x;\n\t\t\t\tvar vpHeight = _shadowMapSize.y;\n\n\t\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t\t// following orientation:\n\t\t\t\t//\n\t\t\t\t// xzXZ\n\t\t\t\t// y Y\n\t\t\t\t//\n\t\t\t\t// X - Positive x direction\n\t\t\t\t// x - Negative x direction\n\t\t\t\t// Y - Positive y direction\n\t\t\t\t// y - Negative y direction\n\t\t\t\t// Z - Positive z direction\n\t\t\t\t// z - Negative z direction\n\n\t\t\t\t// positive X\n\t\t\t\tcube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight );\n\t\t\t\t// negative X\n\t\t\t\tcube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight );\n\t\t\t\t// positive Z\n\t\t\t\tcube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight );\n\t\t\t\t// negative Z\n\t\t\t\tcube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight );\n\t\t\t\t// positive Y\n\t\t\t\tcube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight );\n\t\t\t\t// negative Y\n\t\t\t\tcube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight );\n\n\t\t\t\t_shadowMapSize.x *= 4.0;\n\t\t\t\t_shadowMapSize.y *= 2.0;\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null ) {\n\n\t\t\t\tvar pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat };\n\n\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\t\t\t\tshadow.map.texture.name = light.name + \".shadowMap\";\n\n\t\t\t\tshadowCamera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\tif ( shadow.isSpotLightShadow ) {\n\n\t\t\t\tshadow.update( light );\n\n\t\t\t}\n\n\t\t\tvar shadowMap = shadow.map;\n\t\t\tvar shadowMatrix = shadow.matrix;\n\n\t\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\t\tshadowCamera.position.copy( _lightPositionWorld );\n\n\t\t\tif ( isPointLight ) {\n\n\t\t\t\tfaceCount = 6;\n\n\t\t\t\t// for point lights we set the shadow matrix to be a translation-only matrix\n\t\t\t\t// equal to inverse of the light's position\n\n\t\t\t\tshadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );\n\n\t\t\t} else {\n\n\t\t\t\tfaceCount = 1;\n\n\t\t\t\t_lookTarget.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\t\t\t\tshadowCamera.updateMatrixWorld();\n\n\t\t\t\t// compute shadow matrix\n\n\t\t\t\tshadowMatrix.set(\n\t\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t\t);\n\n\t\t\t\tshadowMatrix.multiply( shadowCamera.projectionMatrix );\n\t\t\t\tshadowMatrix.multiply( shadowCamera.matrixWorldInverse );\n\n\t\t\t}\n\n\t\t\t_renderer.setRenderTarget( shadowMap );\n\t\t\t_renderer.clear();\n\n\t\t\t// render shadow map for each cube face (if omni-directional) or\n\t\t\t// run a single pass if not\n\n\t\t\tfor ( var face = 0; face < faceCount; face ++ ) {\n\n\t\t\t\tif ( isPointLight ) {\n\n\t\t\t\t\t_lookTarget.copy( shadowCamera.position );\n\t\t\t\t\t_lookTarget.add( cubeDirections[ face ] );\n\t\t\t\t\tshadowCamera.up.copy( cubeUps[ face ] );\n\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\t\t\t\t\tshadowCamera.updateMatrixWorld();\n\n\t\t\t\t\tvar vpDimensions = cube2DViewPorts[ face ];\n\t\t\t\t\t_state.viewport( vpDimensions );\n\n\t\t\t\t}\n\n\t\t\t\t// update camera matrices and frustum\n\n\t\t\t\t_projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\t\t// set object matrices & frustum culling\n\n\t\t\t\trenderObject( scene, camera, shadowCamera, isPointLight );\n\n\t\t\t}\n\n\t\t}\n\n\t\tscope.needsUpdate = false;\n\n\t};\n\n\tfunction getDepthMaterial( object, material, isPointLight, lightPositionWorld, shadowCameraNear, shadowCameraFar ) {\n\n\t\tvar geometry = object.geometry;\n\n\t\tvar result = null;\n\n\t\tvar materialVariants = _depthMaterials;\n\t\tvar customMaterial = object.customDepthMaterial;\n\n\t\tif ( isPointLight ) {\n\n\t\t\tmaterialVariants = _distanceMaterials;\n\t\t\tcustomMaterial = object.customDistanceMaterial;\n\n\t\t}\n\n\t\tif ( ! customMaterial ) {\n\n\t\t\tvar useMorphing = false;\n\n\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\tif ( geometry && geometry.isBufferGeometry ) {\n\n\t\t\t\t\tuseMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0;\n\n\t\t\t\t} else if ( geometry && geometry.isGeometry ) {\n\n\t\t\t\t\tuseMorphing = geometry.morphTargets && geometry.morphTargets.length > 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( object.isSkinnedMesh && material.skinning === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:', object );\n\n\t\t\t}\n\n\t\t\tvar useSkinning = object.isSkinnedMesh && material.skinning;\n\n\t\t\tvar variantIndex = 0;\n\n\t\t\tif ( useMorphing ) variantIndex |= _MorphingFlag;\n\t\t\tif ( useSkinning ) variantIndex |= _SkinningFlag;\n\n\t\t\tresult = materialVariants[ variantIndex ];\n\n\t\t} else {\n\n\t\t\tresult = customMaterial;\n\n\t\t}\n\n\t\tif ( _renderer.localClippingEnabled &&\n\t\t\t\tmaterial.clipShadows === true &&\n\t\t\t\tmaterial.clippingPlanes.length !== 0 ) {\n\n\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t// appropriate state\n\n\t\t\tvar keyA = result.uuid, keyB = material.uuid;\n\n\t\t\tvar materialsForVariant = _materialCache[ keyA ];\n\n\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t}\n\n\t\t\tvar cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\n\t\t\t}\n\n\t\t\tresult = cachedMaterial;\n\n\t\t}\n\n\t\tresult.visible = material.visible;\n\t\tresult.wireframe = material.wireframe;\n\n\t\tresult.side = ( material.shadowSide != null ) ? material.shadowSide : shadowSide[ material.side ];\n\n\t\tresult.clipShadows = material.clipShadows;\n\t\tresult.clippingPlanes = material.clippingPlanes;\n\t\tresult.clipIntersection = material.clipIntersection;\n\n\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\tresult.linewidth = material.linewidth;\n\n\t\tif ( isPointLight && result.isMeshDistanceMaterial ) {\n\n\t\t\tresult.referencePosition.copy( lightPositionWorld );\n\t\t\tresult.nearDistance = shadowCameraNear;\n\t\t\tresult.farDistance = shadowCameraFar;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tfunction renderObject( object, camera, shadowCamera, isPointLight ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tvar visible = object.layers.test( camera.layers );\n\n\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\tif ( object.castShadow && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) {\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\n\t\t\t\tvar geometry = _objects.update( object );\n\t\t\t\tvar material = object.material;\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tvar groups = geometry.groups;\n\n\t\t\t\t\tfor ( var k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tvar group = groups[ k ];\n\t\t\t\t\t\tvar groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld, shadowCamera.near, shadowCamera.far );\n\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld, shadowCamera.near, shadowCamera.far );\n\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar children = object.children;\n\n\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\trenderObject( children[ i ], camera, shadowCamera, isPointLight );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\tTexture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\tthis.needsUpdate = true;\n\n}\n\nCanvasTexture.prototype = Object.create( Texture.prototype );\nCanvasTexture.prototype.constructor = CanvasTexture;\n\n/**\n * @author mikael emtinger / http://gomo.se/\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction WebGLSpriteRenderer( renderer, gl, state, textures, capabilities ) {\n\n\tvar vertexBuffer, elementBuffer;\n\tvar program, attributes, uniforms;\n\n\tvar texture;\n\n\t// decompose matrixWorld\n\n\tvar spritePosition = new Vector3();\n\tvar spriteRotation = new Quaternion();\n\tvar spriteScale = new Vector3();\n\n\tfunction init() {\n\n\t\tvar vertices = new Float32Array( [\n\t\t\t- 0.5, - 0.5, 0, 0,\n\t\t\t 0.5, - 0.5, 1, 0,\n\t\t\t 0.5, 0.5, 1, 1,\n\t\t\t- 0.5, 0.5, 0, 1\n\t\t] );\n\n\t\tvar faces = new Uint16Array( [\n\t\t\t0, 1, 2,\n\t\t\t0, 2, 3\n\t\t] );\n\n\t\tvertexBuffer = gl.createBuffer();\n\t\telementBuffer = gl.createBuffer();\n\n\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\tprogram = createProgram();\n\n\t\tattributes = {\n\t\t\tposition: gl.getAttribLocation( program, 'position' ),\n\t\t\tuv: gl.getAttribLocation( program, 'uv' )\n\t\t};\n\n\t\tuniforms = {\n\t\t\tuvOffset: gl.getUniformLocation( program, 'uvOffset' ),\n\t\t\tuvScale: gl.getUniformLocation( program, 'uvScale' ),\n\n\t\t\trotation: gl.getUniformLocation( program, 'rotation' ),\n\t\t\tcenter: gl.getUniformLocation( program, 'center' ),\n\t\t\tscale: gl.getUniformLocation( program, 'scale' ),\n\n\t\t\tcolor: gl.getUniformLocation( program, 'color' ),\n\t\t\tmap: gl.getUniformLocation( program, 'map' ),\n\t\t\topacity: gl.getUniformLocation( program, 'opacity' ),\n\n\t\t\tmodelViewMatrix: gl.getUniformLocation( program, 'modelViewMatrix' ),\n\t\t\tprojectionMatrix: gl.getUniformLocation( program, 'projectionMatrix' ),\n\n\t\t\tfogType: gl.getUniformLocation( program, 'fogType' ),\n\t\t\tfogDensity: gl.getUniformLocation( program, 'fogDensity' ),\n\t\t\tfogNear: gl.getUniformLocation( program, 'fogNear' ),\n\t\t\tfogFar: gl.getUniformLocation( program, 'fogFar' ),\n\t\t\tfogColor: gl.getUniformLocation( program, 'fogColor' ),\n\t\t\tfogDepth: gl.getUniformLocation( program, 'fogDepth' ),\n\n\t\t\talphaTest: gl.getUniformLocation( program, 'alphaTest' )\n\t\t};\n\n\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\tcanvas.width = 8;\n\t\tcanvas.height = 8;\n\n\t\tvar context = canvas.getContext( '2d' );\n\t\tcontext.fillStyle = 'white';\n\t\tcontext.fillRect( 0, 0, 8, 8 );\n\n\t\ttexture = new CanvasTexture( canvas );\n\n\t}\n\n\tthis.render = function ( sprites, scene, camera ) {\n\n\t\tif ( sprites.length === 0 ) return;\n\n\t\t// setup gl\n\n\t\tif ( program === undefined ) {\n\n\t\t\tinit();\n\n\t\t}\n\n\t\tstate.useProgram( program );\n\n\t\tstate.initAttributes();\n\t\tstate.enableAttribute( attributes.position );\n\t\tstate.enableAttribute( attributes.uv );\n\t\tstate.disableUnusedAttributes();\n\n\t\tstate.disable( gl.CULL_FACE );\n\t\tstate.enable( gl.BLEND );\n\n\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\tgl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\tgl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements );\n\n\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\tgl.uniform1i( uniforms.map, 0 );\n\n\t\tvar oldFogType = 0;\n\t\tvar sceneFogType = 0;\n\t\tvar fog = scene.fog;\n\n\t\tif ( fog ) {\n\n\t\t\tgl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b );\n\n\t\t\tif ( fog.isFog ) {\n\n\t\t\t\tgl.uniform1f( uniforms.fogNear, fog.near );\n\t\t\t\tgl.uniform1f( uniforms.fogFar, fog.far );\n\n\t\t\t\tgl.uniform1i( uniforms.fogType, 1 );\n\t\t\t\toldFogType = 1;\n\t\t\t\tsceneFogType = 1;\n\n\t\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\t\tgl.uniform1f( uniforms.fogDensity, fog.density );\n\n\t\t\t\tgl.uniform1i( uniforms.fogType, 2 );\n\t\t\t\toldFogType = 2;\n\t\t\t\tsceneFogType = 2;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tgl.uniform1i( uniforms.fogType, 0 );\n\t\t\toldFogType = 0;\n\t\t\tsceneFogType = 0;\n\n\t\t}\n\n\n\t\t// update positions and sort\n\n\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\tvar sprite = sprites[ i ];\n\n\t\t\tsprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld );\n\t\t\tsprite.z = - sprite.modelViewMatrix.elements[ 14 ];\n\n\t\t}\n\n\t\tsprites.sort( painterSortStable );\n\n\t\t// render all sprites\n\n\t\tvar scale = [];\n\t\tvar center = [];\n\n\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\tvar sprite = sprites[ i ];\n\t\t\tvar material = sprite.material;\n\n\t\t\tif ( material.visible === false ) continue;\n\n\t\t\tsprite.onBeforeRender( renderer, scene, camera, undefined, material, undefined );\n\n\t\t\tgl.uniform1f( uniforms.alphaTest, material.alphaTest );\n\t\t\tgl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements );\n\n\t\t\tsprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale );\n\n\t\t\tscale[ 0 ] = spriteScale.x;\n\t\t\tscale[ 1 ] = spriteScale.y;\n\n\t\t\tcenter[ 0 ] = sprite.center.x - 0.5;\n\t\t\tcenter[ 1 ] = sprite.center.y - 0.5;\n\n\t\t\tvar fogType = 0;\n\n\t\t\tif ( scene.fog && material.fog ) {\n\n\t\t\t\tfogType = sceneFogType;\n\n\t\t\t}\n\n\t\t\tif ( oldFogType !== fogType ) {\n\n\t\t\t\tgl.uniform1i( uniforms.fogType, fogType );\n\t\t\t\toldFogType = fogType;\n\n\t\t\t}\n\n\t\t\tif ( material.map !== null ) {\n\n\t\t\t\tgl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y );\n\t\t\t\tgl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y );\n\n\t\t\t} else {\n\n\t\t\t\tgl.uniform2f( uniforms.uvOffset, 0, 0 );\n\t\t\t\tgl.uniform2f( uniforms.uvScale, 1, 1 );\n\n\t\t\t}\n\n\t\t\tgl.uniform1f( uniforms.opacity, material.opacity );\n\t\t\tgl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b );\n\n\t\t\tgl.uniform1f( uniforms.rotation, material.rotation );\n\t\t\tgl.uniform2fv( uniforms.center, center );\n\t\t\tgl.uniform2fv( uniforms.scale, scale );\n\n\t\t\tstate.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha );\n\t\t\tstate.buffers.depth.setTest( material.depthTest );\n\t\t\tstate.buffers.depth.setMask( material.depthWrite );\n\t\t\tstate.buffers.color.setMask( material.colorWrite );\n\n\t\t\ttextures.setTexture2D( material.map || texture, 0 );\n\n\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\t\t\tsprite.onAfterRender( renderer, scene, camera, undefined, material, undefined );\n\n\t\t}\n\n\t\t// restore gl\n\n\t\tstate.enable( gl.CULL_FACE );\n\n\t\tstate.reset();\n\n\t};\n\n\tfunction createProgram() {\n\n\t\tvar program = gl.createProgram();\n\n\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\n\t\tgl.shaderSource( vertexShader, [\n\n\t\t\t'precision ' + capabilities.precision + ' float;',\n\n\t\t\t'#define SHADER_NAME ' + 'SpriteMaterial',\n\n\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t'uniform float rotation;',\n\t\t\t'uniform vec2 center;',\n\t\t\t'uniform vec2 scale;',\n\t\t\t'uniform vec2 uvOffset;',\n\t\t\t'uniform vec2 uvScale;',\n\n\t\t\t'attribute vec2 position;',\n\t\t\t'attribute vec2 uv;',\n\n\t\t\t'varying vec2 vUV;',\n\t\t\t'varying float fogDepth;',\n\n\t\t\t'void main() {',\n\n\t\t\t'\tvUV = uvOffset + uv * uvScale;',\n\n\t\t\t'\tvec2 alignedPosition = ( position - center ) * scale;',\n\n\t\t\t'\tvec2 rotatedPosition;',\n\t\t\t'\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;',\n\t\t\t'\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;',\n\n\t\t\t'\tvec4 mvPosition;',\n\n\t\t\t'\tmvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );',\n\t\t\t'\tmvPosition.xy += rotatedPosition;',\n\n\t\t\t'\tgl_Position = projectionMatrix * mvPosition;',\n\n\t\t\t'\tfogDepth = - mvPosition.z;',\n\n\t\t\t'}'\n\n\t\t].join( '\\n' ) );\n\n\t\tgl.shaderSource( fragmentShader, [\n\n\t\t\t'precision ' + capabilities.precision + ' float;',\n\n\t\t\t'#define SHADER_NAME ' + 'SpriteMaterial',\n\n\t\t\t'uniform vec3 color;',\n\t\t\t'uniform sampler2D map;',\n\t\t\t'uniform float opacity;',\n\n\t\t\t'uniform int fogType;',\n\t\t\t'uniform vec3 fogColor;',\n\t\t\t'uniform float fogDensity;',\n\t\t\t'uniform float fogNear;',\n\t\t\t'uniform float fogFar;',\n\t\t\t'uniform float alphaTest;',\n\n\t\t\t'varying vec2 vUV;',\n\t\t\t'varying float fogDepth;',\n\n\t\t\t'void main() {',\n\n\t\t\t'\tvec4 texture = texture2D( map, vUV );',\n\n\t\t\t'\tgl_FragColor = vec4( color * texture.xyz, texture.a * opacity );',\n\n\t\t\t'\tif ( gl_FragColor.a < alphaTest ) discard;',\n\n\t\t\t'\tif ( fogType > 0 ) {',\n\n\t\t\t'\t\tfloat fogFactor = 0.0;',\n\n\t\t\t'\t\tif ( fogType == 1 ) {',\n\n\t\t\t'\t\t\tfogFactor = smoothstep( fogNear, fogFar, fogDepth );',\n\n\t\t\t'\t\t} else {',\n\n\t\t\t'\t\t\tconst float LOG2 = 1.442695;',\n\t\t\t'\t\t\tfogFactor = exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 );',\n\t\t\t'\t\t\tfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );',\n\n\t\t\t'\t\t}',\n\n\t\t\t'\t\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );',\n\n\t\t\t'\t}',\n\n\t\t\t'}'\n\n\t\t].join( '\\n' ) );\n\n\t\tgl.compileShader( vertexShader );\n\t\tgl.compileShader( fragmentShader );\n\n\t\tgl.attachShader( program, vertexShader );\n\t\tgl.attachShader( program, fragmentShader );\n\n\t\tgl.linkProgram( program );\n\n\t\treturn program;\n\n\t}\n\n\tfunction painterSortStable( a, b ) {\n\n\t\tif ( a.renderOrder !== b.renderOrder ) {\n\n\t\t\treturn a.renderOrder - b.renderOrder;\n\n\t\t} else if ( a.z !== b.z ) {\n\n\t\t\treturn b.z - a.z;\n\n\t\t} else {\n\n\t\t\treturn b.id - a.id;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLState( gl, extensions, utils ) {\n\n\tfunction ColorBuffer() {\n\n\t\tvar locked = false;\n\n\t\tvar color = new Vector4();\n\t\tvar currentColorMask = null;\n\t\tvar currentColorClear = new Vector4( 0, 0, 0, 0 );\n\n\t\treturn {\n\n\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t}\n\n\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentColorMask = null;\n\t\t\t\tcurrentColorClear.set( - 1, 0, 0, 0 ); // set to invalid state\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction DepthBuffer() {\n\n\t\tvar locked = false;\n\n\t\tvar currentDepthMask = null;\n\t\tvar currentDepthFunc = null;\n\t\tvar currentDepthClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\tif ( depthFunc ) {\n\n\t\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentDepthMask = null;\n\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\tcurrentDepthClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction StencilBuffer() {\n\n\t\tvar locked = false;\n\n\t\tvar currentStencilMask = null;\n\t\tvar currentStencilFunc = null;\n\t\tvar currentStencilRef = null;\n\t\tvar currentStencilFuncMask = null;\n\t\tvar currentStencilFail = null;\n\t\tvar currentStencilZFail = null;\n\t\tvar currentStencilZPass = null;\n\t\tvar currentStencilClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\tenable( gl.STENCIL_TEST );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdisable( gl.STENCIL_TEST );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t currentStencilRef \t!== stencilRef \t||\n\t\t\t\t currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\tif ( currentStencilFail\t !== stencilFail \t||\n\t\t\t\t currentStencilZFail !== stencilZFail ||\n\t\t\t\t currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentStencilMask = null;\n\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\tcurrentStencilRef = null;\n\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\tcurrentStencilFail = null;\n\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tvar colorBuffer = new ColorBuffer();\n\tvar depthBuffer = new DepthBuffer();\n\tvar stencilBuffer = new StencilBuffer();\n\n\tvar maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\tvar newAttributes = new Uint8Array( maxVertexAttributes );\n\tvar enabledAttributes = new Uint8Array( maxVertexAttributes );\n\tvar attributeDivisors = new Uint8Array( maxVertexAttributes );\n\n\tvar capabilities = {};\n\n\tvar compressedTextureFormats = null;\n\n\tvar currentProgram = null;\n\n\tvar currentBlending = null;\n\tvar currentBlendEquation = null;\n\tvar currentBlendSrc = null;\n\tvar currentBlendDst = null;\n\tvar currentBlendEquationAlpha = null;\n\tvar currentBlendSrcAlpha = null;\n\tvar currentBlendDstAlpha = null;\n\tvar currentPremultipledAlpha = false;\n\n\tvar currentFlipSided = null;\n\tvar currentCullFace = null;\n\n\tvar currentLineWidth = null;\n\n\tvar currentPolygonOffsetFactor = null;\n\tvar currentPolygonOffsetUnits = null;\n\n\tvar maxTextures = gl.getParameter( gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS );\n\n\tvar lineWidthAvailable = false;\n\tvar version = 0;\n\tvar glVersion = gl.getParameter( gl.VERSION );\n\n\tif ( glVersion.indexOf( 'WebGL' ) !== - 1 ) {\n\n\t\tversion = parseFloat( /^WebGL\\ ([0-9])/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 1.0 );\n\n\t} else if ( glVersion.indexOf( 'OpenGL ES' ) !== - 1 ) {\n\n\t\tversion = parseFloat( /^OpenGL\\ ES\\ ([0-9])/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 2.0 );\n\n\t}\n\n\tvar currentTextureSlot = null;\n\tvar currentBoundTextures = {};\n\n\tvar currentScissor = new Vector4();\n\tvar currentViewport = new Vector4();\n\n\tfunction createTexture( type, target, count ) {\n\n\t\tvar data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\tvar texture = gl.createTexture();\n\n\t\tgl.bindTexture( type, texture );\n\t\tgl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\tgl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\tfor ( var i = 0; i < count; i ++ ) {\n\n\t\t\tgl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tvar emptyTextures = {};\n\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\n\t// init\n\n\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\tdepthBuffer.setClear( 1 );\n\tstencilBuffer.setClear( 0 );\n\n\tenable( gl.DEPTH_TEST );\n\tdepthBuffer.setFunc( LessEqualDepth );\n\n\tsetFlipSided( false );\n\tsetCullFace( CullFaceBack );\n\tenable( gl.CULL_FACE );\n\n\tenable( gl.BLEND );\n\tsetBlending( NormalBlending );\n\n\t//\n\n\tfunction initAttributes() {\n\n\t\tfor ( var i = 0, l = newAttributes.length; i < l; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\tfunction enableAttribute( attribute ) {\n\n\t\tnewAttributes[ attribute ] = 1;\n\n\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t}\n\n\t\tif ( attributeDivisors[ attribute ] !== 0 ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\textension.vertexAttribDivisorANGLE( attribute, 0 );\n\t\t\tattributeDivisors[ attribute ] = 0;\n\n\t\t}\n\n\t}\n\n\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute ) {\n\n\t\tnewAttributes[ attribute ] = 1;\n\n\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t}\n\n\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\textension.vertexAttribDivisorANGLE( attribute, meshPerAttribute );\n\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t}\n\n\t}\n\n\tfunction disableUnusedAttributes() {\n\n\t\tfor ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) {\n\n\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction enable( id ) {\n\n\t\tif ( capabilities[ id ] !== true ) {\n\n\t\t\tgl.enable( id );\n\t\t\tcapabilities[ id ] = true;\n\n\t\t}\n\n\t}\n\n\tfunction disable( id ) {\n\n\t\tif ( capabilities[ id ] !== false ) {\n\n\t\t\tgl.disable( id );\n\t\t\tcapabilities[ id ] = false;\n\n\t\t}\n\n\t}\n\n\tfunction getCompressedTextureFormats() {\n\n\t\tif ( compressedTextureFormats === null ) {\n\n\t\t\tcompressedTextureFormats = [];\n\n\t\t\tif ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) ||\n\t\t\t extensions.get( 'WEBGL_compressed_texture_s3tc' ) ||\n\t\t\t extensions.get( 'WEBGL_compressed_texture_etc1' ) ||\n\t\t\t extensions.get( 'WEBGL_compressed_texture_astc' ) ) {\n\n\t\t\t\tvar formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS );\n\n\t\t\t\tfor ( var i = 0; i < formats.length; i ++ ) {\n\n\t\t\t\t\tcompressedTextureFormats.push( formats[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn compressedTextureFormats;\n\n\t}\n\n\tfunction useProgram( program ) {\n\n\t\tif ( currentProgram !== program ) {\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tcurrentProgram = program;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {\n\n\t\tif ( blending !== NoBlending ) {\n\n\t\t\tenable( gl.BLEND );\n\n\t\t} else {\n\n\t\t\tdisable( gl.BLEND );\n\n\t\t}\n\n\t\tif ( blending !== CustomBlending ) {\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\tcase AdditiveBlending:\n\n\t\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE, gl.ONE, gl.ONE );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\t\tgl.blendFunc( gl.SRC_ALPHA, gl.ONE );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase SubtractiveBlending:\n\n\t\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MultiplyBlending:\n\n\t\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.SRC_COLOR );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tcurrentBlendEquation = null;\n\t\t\tcurrentBlendSrc = null;\n\t\t\tcurrentBlendDst = null;\n\t\t\tcurrentBlendEquationAlpha = null;\n\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\tcurrentBlendDstAlpha = null;\n\n\t\t} else {\n\n\t\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\t\tgl.blendEquationSeparate( utils.convert( blendEquation ), utils.convert( blendEquationAlpha ) );\n\n\t\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t\t}\n\n\t\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\t\tgl.blendFuncSeparate( utils.convert( blendSrc ), utils.convert( blendDst ), utils.convert( blendSrcAlpha ), utils.convert( blendDstAlpha ) );\n\n\t\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\t\tcurrentBlendDst = blendDst;\n\t\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t\t}\n\n\t\t}\n\n\t\tcurrentBlending = blending;\n\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t}\n\n\tfunction setMaterial( material, frontFaceCW ) {\n\n\t\tmaterial.side === DoubleSide\n\t\t\t? disable( gl.CULL_FACE )\n\t\t\t: enable( gl.CULL_FACE );\n\n\t\tvar flipSided = ( material.side === BackSide );\n\t\tif ( frontFaceCW ) flipSided = ! flipSided;\n\n\t\tsetFlipSided( flipSided );\n\n\t\tmaterial.transparent === true\n\t\t\t? setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha )\n\t\t\t: setBlending( NoBlending );\n\n\t\tdepthBuffer.setFunc( material.depthFunc );\n\t\tdepthBuffer.setTest( material.depthTest );\n\t\tdepthBuffer.setMask( material.depthWrite );\n\t\tcolorBuffer.setMask( material.colorWrite );\n\n\t\tsetPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t}\n\n\t//\n\n\tfunction setFlipSided( flipSided ) {\n\n\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\tif ( flipSided ) {\n\n\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t} else {\n\n\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t}\n\n\t\t\tcurrentFlipSided = flipSided;\n\n\t\t}\n\n\t}\n\n\tfunction setCullFace( cullFace ) {\n\n\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\tenable( gl.CULL_FACE );\n\n\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.CULL_FACE );\n\n\t\t}\n\n\t\tcurrentCullFace = cullFace;\n\n\t}\n\n\tfunction setLineWidth( width ) {\n\n\t\tif ( width !== currentLineWidth ) {\n\n\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\tcurrentLineWidth = width;\n\n\t\t}\n\n\t}\n\n\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\tif ( polygonOffset ) {\n\n\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t}\n\n\t}\n\n\tfunction setScissorTest( scissorTest ) {\n\n\t\tif ( scissorTest ) {\n\n\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t} else {\n\n\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t}\n\n\t}\n\n\t// texture\n\n\tfunction activeTexture( webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\tgl.activeTexture( webglSlot );\n\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t}\n\n\t}\n\n\tfunction bindTexture( webglType, webglTexture ) {\n\n\t\tif ( currentTextureSlot === null ) {\n\n\t\t\tactiveTexture();\n\n\t\t}\n\n\t\tvar boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture === undefined ) {\n\n\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\tcurrentBoundTextures[ currentTextureSlot ] = boundTexture;\n\n\t\t}\n\n\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\tboundTexture.type = webglType;\n\t\t\tboundTexture.texture = webglTexture;\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction scissor( scissor ) {\n\n\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\tcurrentScissor.copy( scissor );\n\n\t\t}\n\n\t}\n\n\tfunction viewport( viewport ) {\n\n\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\tcurrentViewport.copy( viewport );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction reset() {\n\n\t\tfor ( var i = 0; i < enabledAttributes.length; i ++ ) {\n\n\t\t\tif ( enabledAttributes[ i ] === 1 ) {\n\n\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tcapabilities = {};\n\n\t\tcompressedTextureFormats = null;\n\n\t\tcurrentTextureSlot = null;\n\t\tcurrentBoundTextures = {};\n\n\t\tcurrentProgram = null;\n\n\t\tcurrentBlending = null;\n\n\t\tcurrentFlipSided = null;\n\t\tcurrentCullFace = null;\n\n\t\tcolorBuffer.reset();\n\t\tdepthBuffer.reset();\n\t\tstencilBuffer.reset();\n\n\t}\n\n\treturn {\n\n\t\tbuffers: {\n\t\t\tcolor: colorBuffer,\n\t\t\tdepth: depthBuffer,\n\t\t\tstencil: stencilBuffer\n\t\t},\n\n\t\tinitAttributes: initAttributes,\n\t\tenableAttribute: enableAttribute,\n\t\tenableAttributeAndDivisor: enableAttributeAndDivisor,\n\t\tdisableUnusedAttributes: disableUnusedAttributes,\n\t\tenable: enable,\n\t\tdisable: disable,\n\t\tgetCompressedTextureFormats: getCompressedTextureFormats,\n\n\t\tuseProgram: useProgram,\n\n\t\tsetBlending: setBlending,\n\t\tsetMaterial: setMaterial,\n\n\t\tsetFlipSided: setFlipSided,\n\t\tsetCullFace: setCullFace,\n\n\t\tsetLineWidth: setLineWidth,\n\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\tsetScissorTest: setScissorTest,\n\n\t\tactiveTexture: activeTexture,\n\t\tbindTexture: bindTexture,\n\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\ttexImage2D: texImage2D,\n\n\t\tscissor: scissor,\n\t\tviewport: viewport,\n\n\t\treset: reset\n\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) {\n\n\tvar _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext ); /* global WebGL2RenderingContext */\n\tvar _videoTextures = {};\n\tvar _canvas;\n\n\t//\n\n\tfunction clampToMaxSize( image, maxSize ) {\n\n\t\tif ( image.width > maxSize || image.height > maxSize ) {\n\n\t\t\tif ( 'data' in image ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: image in DataTexture is too big (' + image.width + 'x' + image.height + ').' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// Warning: Scaling through the canvas will only work with images that use\n\t\t\t// premultiplied alpha.\n\n\t\t\tvar scale = maxSize / Math.max( image.width, image.height );\n\n\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\tcanvas.width = Math.floor( image.width * scale );\n\t\t\tcanvas.height = Math.floor( image.height * scale );\n\n\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height );\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image );\n\n\t\t\treturn canvas;\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction isPowerOfTwo( image ) {\n\n\t\treturn _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height );\n\n\t}\n\n\tfunction makePowerOfTwo( image ) {\n\n\t\tif ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof ImageBitmap ) {\n\n\t\t\tif ( _canvas === undefined ) _canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\n\t\t\t_canvas.width = _Math.floorPowerOfTwo( image.width );\n\t\t\t_canvas.height = _Math.floorPowerOfTwo( image.height );\n\n\t\t\tvar context = _canvas.getContext( '2d' );\n\t\t\tcontext.drawImage( image, 0, 0, _canvas.width, _canvas.height );\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + _canvas.width + 'x' + _canvas.height, image );\n\n\t\t\treturn _canvas;\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction textureNeedsPowerOfTwo( texture ) {\n\n\t\treturn ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) ||\n\t\t\t( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter );\n\n\t}\n\n\tfunction textureNeedsGenerateMipmaps( texture, isPowerOfTwo ) {\n\n\t\treturn texture.generateMipmaps && isPowerOfTwo &&\n\t\t\ttexture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter;\n\n\t}\n\n\tfunction generateMipmap( target, texture, width, height ) {\n\n\t\t_gl.generateMipmap( target );\n\n\t\tvar textureProperties = properties.get( texture );\n\n\t\t// Note: Math.log( x ) * Math.LOG2E used instead of Math.log2( x ) which is not supported by IE11\n\t\ttextureProperties.__maxMipLevel = Math.log( Math.max( width, height ) ) * Math.LOG2E;\n\n\t}\n\n\t// Fallback filters for non-power-of-2 textures\n\n\tfunction filterFallback( f ) {\n\n\t\tif ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) {\n\n\t\t\treturn _gl.NEAREST;\n\n\t\t}\n\n\t\treturn _gl.LINEAR;\n\n\t}\n\n\t//\n\n\tfunction onTextureDispose( event ) {\n\n\t\tvar texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tdeallocateTexture( texture );\n\n\t\tif ( texture.isVideoTexture ) {\n\n\t\t\tdelete _videoTextures[ texture.id ];\n\n\t\t}\n\n\t\tinfo.memory.textures --;\n\n\t}\n\n\tfunction onRenderTargetDispose( event ) {\n\n\t\tvar renderTarget = event.target;\n\n\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tdeallocateRenderTarget( renderTarget );\n\n\t\tinfo.memory.textures --;\n\n\t}\n\n\t//\n\n\tfunction deallocateTexture( texture ) {\n\n\t\tvar textureProperties = properties.get( texture );\n\n\t\tif ( texture.image && textureProperties.__image__webglTextureCube ) {\n\n\t\t\t// cube texture\n\n\t\t\t_gl.deleteTexture( textureProperties.__image__webglTextureCube );\n\n\t\t} else {\n\n\t\t\t// 2D texture\n\n\t\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t}\n\n\t\t// remove all webgl properties\n\t\tproperties.remove( texture );\n\n\t}\n\n\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\tif ( ! renderTarget ) return;\n\n\t\tif ( textureProperties.__webglTexture !== undefined ) {\n\n\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t}\n\n\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLRenderTargetCube ) {\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\n\t\t}\n\n\t\tproperties.remove( renderTarget.texture );\n\t\tproperties.remove( renderTarget );\n\n\t}\n\n\t//\n\n\n\n\tfunction setTexture2D( texture, slot ) {\n\n\t\tvar textureProperties = properties.get( texture );\n\n\t\tif ( texture.isVideoTexture ) updateVideoTexture( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tvar image = texture.image;\n\n\t\t\tif ( image === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture );\n\n\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture );\n\n\t\t\t} else {\n\n\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t}\n\n\tfunction setTextureCube( texture, slot ) {\n\n\t\tvar textureProperties = properties.get( texture );\n\n\t\tif ( texture.image.length === 6 ) {\n\n\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\tif ( ! textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\ttextureProperties.__image__webglTextureCube = _gl.createTexture();\n\n\t\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\n\t\t\t\tvar isCompressed = ( texture && texture.isCompressedTexture );\n\t\t\t\tvar isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\t\t\tvar cubeImage = [];\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\t\tcubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar image = cubeImage[ 0 ],\n\t\t\t\t\tisPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\t\t\tglFormat = utils.convert( texture.format ),\n\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage );\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tif ( ! isCompressed ) {\n\n\t\t\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvar mipmap, mipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\t\tfor ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tmipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! isCompressed ) {\n\n\t\t\t\t\ttextureProperties.__maxMipLevel = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttextureProperties.__maxMipLevel = mipmaps.length - 1;\n\n\t\t\t\t}\n\n\t\t\t\tif ( textureNeedsGenerateMipmaps( texture, isPowerOfTwoImage ) ) {\n\n\t\t\t\t\t// We assume images for cube map have the same size.\n\t\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP, texture, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t\t} else {\n\n\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction setTextureCubeDynamic( texture, slot ) {\n\n\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture );\n\n\t}\n\n\tfunction setTextureParameters( textureType, texture, isPowerOfTwoImage ) {\n\n\t\tvar extension;\n\n\t\tif ( isPowerOfTwoImage ) {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, utils.convert( texture.wrapS ) );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, utils.convert( texture.wrapT ) );\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, utils.convert( texture.magFilter ) );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, utils.convert( texture.minFilter ) );\n\n\t\t} else {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );\n\n\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.', texture );\n\n\t\t\t}\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) );\n\n\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.', texture );\n\n\t\t\t}\n\n\t\t}\n\n\t\textension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\tif ( extension ) {\n\n\t\t\tif ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return;\n\t\t\tif ( texture.type === HalfFloatType && extensions.get( 'OES_texture_half_float_linear' ) === null ) return;\n\n\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\tinfo.memory.textures ++;\n\n\t\t}\n\n\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\n\t\tvar image = clampToMaxSize( texture.image, capabilities.maxTextureSize );\n\n\t\tif ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) {\n\n\t\t\timage = makePowerOfTwo( image );\n\n\t\t}\n\n\t\tvar isPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\tglFormat = utils.convert( texture.format ),\n\t\t\tglType = utils.convert( texture.type );\n\n\t\tsetTextureParameters( _gl.TEXTURE_2D, texture, isPowerOfTwoImage );\n\n\t\tvar mipmap, mipmaps = texture.mipmaps;\n\n\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t// populate depth texture with dummy data\n\n\t\t\tvar internalFormat = _gl.DEPTH_COMPONENT;\n\n\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\tif ( ! _isWebGL2 ) throw new Error( 'Float Depth Texture only supported in WebGL2.0' );\n\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t} else if ( _isWebGL2 ) {\n\n\t\t\t\t// WebGL 2.0 requires signed internalformat for glTexImage2D\n\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\t}\n\n\t\t\tif ( texture.format === DepthFormat && internalFormat === _gl.DEPTH_COMPONENT ) {\n\n\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t// DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' );\n\n\t\t\t\t\ttexture.type = UnsignedShortType;\n\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Depth stencil textures need the DEPTH_STENCIL internal format\n\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\tif ( texture.format === DepthStencilFormat ) {\n\n\t\t\t\tinternalFormat = _gl.DEPTH_STENCIL;\n\n\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t// DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL.\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.type !== UnsignedInt248Type ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' );\n\n\t\t\t\t\ttexture.type = UnsignedInt248Type;\n\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t// use manually created mipmaps if available\n\t\t\t// if there are no manual mipmaps\n\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\tif ( mipmaps.length > 0 && isPowerOfTwoImage ) {\n\n\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t}\n\n\t\t\t\ttexture.generateMipmaps = false;\n\t\t\t\ttextureProperties.__maxMipLevel = mipmaps.length - 1;\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\t\t\t\ttextureProperties.__maxMipLevel = 0;\n\n\t\t\t}\n\n\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttextureProperties.__maxMipLevel = mipmaps.length - 1;\n\n\t\t} else {\n\n\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t// use manually created mipmaps if available\n\t\t\t// if there are no manual mipmaps\n\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\tif ( mipmaps.length > 0 && isPowerOfTwoImage ) {\n\n\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap );\n\n\t\t\t\t}\n\n\t\t\t\ttexture.generateMipmaps = false;\n\t\t\t\ttextureProperties.__maxMipLevel = mipmaps.length - 1;\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image );\n\t\t\t\ttextureProperties.__maxMipLevel = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( textureNeedsGenerateMipmaps( texture, isPowerOfTwoImage ) ) {\n\n\t\t\tgenerateMipmap( _gl.TEXTURE_2D, texture, image.width, image.height );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t}\n\n\t// Render targets\n\n\t// Setup storage for target texture and bind it to correct framebuffer\n\tfunction setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) {\n\n\t\tvar glFormat = utils.convert( renderTarget.texture.format );\n\t\tvar glType = utils.convert( renderTarget.texture.type );\n\t\tstate.texImage2D( textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\n\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 );\n\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\tfunction setupRenderBufferStorage( renderbuffer, renderTarget ) {\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\n\n\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height );\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\n\n\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t} else {\n\n\t\t\t// FIXME: We don't support !depth !stencil\n\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height );\n\n\t\t}\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t}\n\n\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\tvar isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube );\n\t\tif ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' );\n\n\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\tthrow new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' );\n\n\t\t}\n\n\t\t// upload an empty depth texture with framebuffer size\n\t\tif ( ! properties.get( renderTarget.depthTexture ).__webglTexture ||\n\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\n\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\tvar webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\n\n\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Unknown depthTexture format' );\n\n\t\t}\n\n\t}\n\n\t// Setup GL resources for a non-texture depth buffer\n\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\tvar isCube = ( renderTarget.isWebGLRenderTargetCube === true );\n\n\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\tif ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' );\n\n\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t} else {\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\t// Set up GL resources for the render target\n\tfunction setupRenderTarget( renderTarget ) {\n\n\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\tinfo.memory.textures ++;\n\n\t\tvar isCube = ( renderTarget.isWebGLRenderTargetCube === true );\n\t\tvar isTargetPowerOfTwo = isPowerOfTwo( renderTarget );\n\n\t\t// Setup framebuffer\n\n\t\tif ( isCube ) {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t}\n\n\t\t// Setup color buffer\n\n\t\tif ( isCube ) {\n\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo );\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( renderTarget.texture, isTargetPowerOfTwo ) ) {\n\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, null );\n\n\t\t} else {\n\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo );\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );\n\n\t\t\tif ( textureNeedsGenerateMipmaps( renderTarget.texture, isTargetPowerOfTwo ) ) {\n\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_2D, renderTarget.texture, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, null );\n\n\t\t}\n\n\t\t// Setup depth and stencil buffers\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\tvar texture = renderTarget.texture;\n\t\tvar isTargetPowerOfTwo = isPowerOfTwo( renderTarget );\n\n\t\tif ( textureNeedsGenerateMipmaps( texture, isTargetPowerOfTwo ) ) {\n\n\t\t\tvar target = renderTarget.isWebGLRenderTargetCube ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D;\n\t\t\tvar webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\tgenerateMipmap( target, texture, renderTarget.width, renderTarget.height );\n\t\t\tstate.bindTexture( target, null );\n\n\t\t}\n\n\t}\n\n\tfunction updateVideoTexture( texture ) {\n\n\t\tvar id = texture.id;\n\t\tvar frame = info.render.frame;\n\n\t\t// Check the last frame we updated the VideoTexture\n\n\t\tif ( _videoTextures[ id ] !== frame ) {\n\n\t\t\t_videoTextures[ id ] = frame;\n\t\t\ttexture.update();\n\n\t\t}\n\n\t}\n\n\tthis.setTexture2D = setTexture2D;\n\tthis.setTextureCube = setTextureCube;\n\tthis.setTextureCubeDynamic = setTextureCubeDynamic;\n\tthis.setupRenderTarget = setupRenderTarget;\n\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\n}\n\n/**\n * @author thespite / http://www.twitter.com/thespite\n */\n\nfunction WebGLUtils( gl, extensions ) {\n\n\tfunction convert( p ) {\n\n\t\tvar extension;\n\n\t\tif ( p === RepeatWrapping ) return gl.REPEAT;\n\t\tif ( p === ClampToEdgeWrapping ) return gl.CLAMP_TO_EDGE;\n\t\tif ( p === MirroredRepeatWrapping ) return gl.MIRRORED_REPEAT;\n\n\t\tif ( p === NearestFilter ) return gl.NEAREST;\n\t\tif ( p === NearestMipMapNearestFilter ) return gl.NEAREST_MIPMAP_NEAREST;\n\t\tif ( p === NearestMipMapLinearFilter ) return gl.NEAREST_MIPMAP_LINEAR;\n\n\t\tif ( p === LinearFilter ) return gl.LINEAR;\n\t\tif ( p === LinearMipMapNearestFilter ) return gl.LINEAR_MIPMAP_NEAREST;\n\t\tif ( p === LinearMipMapLinearFilter ) return gl.LINEAR_MIPMAP_LINEAR;\n\n\t\tif ( p === UnsignedByteType ) return gl.UNSIGNED_BYTE;\n\t\tif ( p === UnsignedShort4444Type ) return gl.UNSIGNED_SHORT_4_4_4_4;\n\t\tif ( p === UnsignedShort5551Type ) return gl.UNSIGNED_SHORT_5_5_5_1;\n\t\tif ( p === UnsignedShort565Type ) return gl.UNSIGNED_SHORT_5_6_5;\n\n\t\tif ( p === ByteType ) return gl.BYTE;\n\t\tif ( p === ShortType ) return gl.SHORT;\n\t\tif ( p === UnsignedShortType ) return gl.UNSIGNED_SHORT;\n\t\tif ( p === IntType ) return gl.INT;\n\t\tif ( p === UnsignedIntType ) return gl.UNSIGNED_INT;\n\t\tif ( p === FloatType ) return gl.FLOAT;\n\n\t\tif ( p === HalfFloatType ) {\n\n\t\t\textension = extensions.get( 'OES_texture_half_float' );\n\n\t\t\tif ( extension !== null ) return extension.HALF_FLOAT_OES;\n\n\t\t}\n\n\t\tif ( p === AlphaFormat ) return gl.ALPHA;\n\t\tif ( p === RGBFormat ) return gl.RGB;\n\t\tif ( p === RGBAFormat ) return gl.RGBA;\n\t\tif ( p === LuminanceFormat ) return gl.LUMINANCE;\n\t\tif ( p === LuminanceAlphaFormat ) return gl.LUMINANCE_ALPHA;\n\t\tif ( p === DepthFormat ) return gl.DEPTH_COMPONENT;\n\t\tif ( p === DepthStencilFormat ) return gl.DEPTH_STENCIL;\n\n\t\tif ( p === AddEquation ) return gl.FUNC_ADD;\n\t\tif ( p === SubtractEquation ) return gl.FUNC_SUBTRACT;\n\t\tif ( p === ReverseSubtractEquation ) return gl.FUNC_REVERSE_SUBTRACT;\n\n\t\tif ( p === ZeroFactor ) return gl.ZERO;\n\t\tif ( p === OneFactor ) return gl.ONE;\n\t\tif ( p === SrcColorFactor ) return gl.SRC_COLOR;\n\t\tif ( p === OneMinusSrcColorFactor ) return gl.ONE_MINUS_SRC_COLOR;\n\t\tif ( p === SrcAlphaFactor ) return gl.SRC_ALPHA;\n\t\tif ( p === OneMinusSrcAlphaFactor ) return gl.ONE_MINUS_SRC_ALPHA;\n\t\tif ( p === DstAlphaFactor ) return gl.DST_ALPHA;\n\t\tif ( p === OneMinusDstAlphaFactor ) return gl.ONE_MINUS_DST_ALPHA;\n\n\t\tif ( p === DstColorFactor ) return gl.DST_COLOR;\n\t\tif ( p === OneMinusDstColorFactor ) return gl.ONE_MINUS_DST_COLOR;\n\t\tif ( p === SrcAlphaSaturateFactor ) return gl.SRC_ALPHA_SATURATE;\n\n\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format ||\n\t\t\tp === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format ||\n\t\t\tp === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === RGB_ETC1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc1' );\n\n\t\t\tif ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t\t}\n\n\t\tif ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format ||\n\t\t\tp === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format ||\n\t\t\tp === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format ||\n\t\t\tp === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format ||\n\t\t\tp === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_astc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn p;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === MinEquation || p === MaxEquation ) {\n\n\t\t\textension = extensions.get( 'EXT_blend_minmax' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === MinEquation ) return extension.MIN_EXT;\n\t\t\t\tif ( p === MaxEquation ) return extension.MAX_EXT;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === UnsignedInt248Type ) {\n\n\t\t\textension = extensions.get( 'WEBGL_depth_texture' );\n\n\t\t\tif ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL;\n\n\t\t}\n\n\t\treturn 0;\n\n\t}\n\n\treturn { convert: convert };\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author greggman / http://games.greggman.com/\n * @author zz85 / http://www.lab4games.net/zz85/blog\n * @author tschw\n */\n\nfunction PerspectiveCamera( fov, aspect, near, far ) {\n\n\tCamera.call( this );\n\n\tthis.type = 'PerspectiveCamera';\n\n\tthis.fov = fov !== undefined ? fov : 50;\n\tthis.zoom = 1;\n\n\tthis.near = near !== undefined ? near : 0.1;\n\tthis.far = far !== undefined ? far : 2000;\n\tthis.focus = 10;\n\n\tthis.aspect = aspect !== undefined ? aspect : 1;\n\tthis.view = null;\n\n\tthis.filmGauge = 35;\t// width of the film (default in millimeters)\n\tthis.filmOffset = 0;\t// horizontal film offset (same unit as gauge)\n\n\tthis.updateProjectionMatrix();\n\n}\n\nPerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\tconstructor: PerspectiveCamera,\n\n\tisPerspectiveCamera: true,\n\n\tcopy: function ( source, recursive ) {\n\n\t\tCamera.prototype.copy.call( this, source, recursive );\n\n\t\tthis.fov = source.fov;\n\t\tthis.zoom = source.zoom;\n\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\t\tthis.focus = source.focus;\n\n\t\tthis.aspect = source.aspect;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\tthis.filmGauge = source.filmGauge;\n\t\tthis.filmOffset = source.filmOffset;\n\n\t\treturn this;\n\n\t},\n\n\t/**\n\t * Sets the FOV by focal length in respect to the current .filmGauge.\n\t *\n\t * The default film gauge is 35, so that the focal length can be specified for\n\t * a 35mm (full frame) camera.\n\t *\n\t * Values for focal length and film gauge must have the same unit.\n\t */\n\tsetFocalLength: function ( focalLength ) {\n\n\t\t// see http://www.bobatkins.com/photography/technical/field_of_view.html\n\t\tvar vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\tthis.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\tthis.updateProjectionMatrix();\n\n\t},\n\n\t/**\n\t * Calculates the focal length from the current .fov and .filmGauge.\n\t */\n\tgetFocalLength: function () {\n\n\t\tvar vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov );\n\n\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t},\n\n\tgetEffectiveFOV: function () {\n\n\t\treturn _Math.RAD2DEG * 2 * Math.atan(\n\t\t\tMath.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t},\n\n\tgetFilmWidth: function () {\n\n\t\t// film not completely covered in portrait format (aspect < 1)\n\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t},\n\n\tgetFilmHeight: function () {\n\n\t\t// film not completely covered in landscape format (aspect > 1)\n\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t},\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t * the monitors are in grid like this\n\t *\n\t * +---+---+---+\n\t * | A | B | C |\n\t * +---+---+---+\n\t * | D | E | F |\n\t * +---+---+---+\n\t *\n\t * then for each monitor you would call it like this\n\t *\n\t * var w = 1920;\n\t * var h = 1080;\n\t * var fullWidth = w * 3;\n\t * var fullHeight = h * 2;\n\t *\n\t * --A--\n\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t * --B--\n\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t * --C--\n\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t * --D--\n\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t * --E--\n\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t * --F--\n\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t *\n\t * Note there is no reason monitors have to be the same size or in a grid.\n\t */\n\tsetViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t},\n\n\tclearViewOffset: function () {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t},\n\n\tupdateProjectionMatrix: function () {\n\n\t\tvar near = this.near,\n\t\t\ttop = near * Math.tan(\n\t\t\t\t_Math.DEG2RAD * 0.5 * this.fov ) / this.zoom,\n\t\t\theight = 2 * top,\n\t\t\twidth = this.aspect * height,\n\t\t\tleft = - 0.5 * width,\n\t\t\tview = this.view;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tvar fullWidth = view.fullWidth,\n\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\twidth *= view.width / fullWidth;\n\t\t\theight *= view.height / fullHeight;\n\n\t\t}\n\n\t\tvar skew = this.filmOffset;\n\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far );\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tdata.object.fov = this.fov;\n\t\tdata.object.zoom = this.zoom;\n\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\t\tdata.object.focus = this.focus;\n\n\t\tdata.object.aspect = this.aspect;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\tdata.object.filmGauge = this.filmGauge;\n\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\treturn data;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction ArrayCamera( array ) {\n\n\tPerspectiveCamera.call( this );\n\n\tthis.cameras = array || [];\n\n}\n\nArrayCamera.prototype = Object.assign( Object.create( PerspectiveCamera.prototype ), {\n\n\tconstructor: ArrayCamera,\n\n\tisArrayCamera: true\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebVRManager( renderer ) {\n\n\tvar scope = this;\n\n\tvar device = null;\n\tvar frameData = null;\n\n\tvar poseTarget = null;\n\n\tvar standingMatrix = new Matrix4();\n\tvar standingMatrixInverse = new Matrix4();\n\n\tif ( typeof window !== 'undefined' && 'VRFrameData' in window ) {\n\n\t\tframeData = new window.VRFrameData();\n\t\twindow.addEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange, false );\n\n\t}\n\n\tvar matrixWorldInverse = new Matrix4();\n\tvar tempQuaternion = new Quaternion();\n\tvar tempPosition = new Vector3();\n\n\tvar cameraL = new PerspectiveCamera();\n\tcameraL.bounds = new Vector4( 0.0, 0.0, 0.5, 1.0 );\n\tcameraL.layers.enable( 1 );\n\n\tvar cameraR = new PerspectiveCamera();\n\tcameraR.bounds = new Vector4( 0.5, 0.0, 0.5, 1.0 );\n\tcameraR.layers.enable( 2 );\n\n\tvar cameraVR = new ArrayCamera( [ cameraL, cameraR ] );\n\tcameraVR.layers.enable( 1 );\n\tcameraVR.layers.enable( 2 );\n\n\t//\n\n\tfunction isPresenting() {\n\n\t\treturn device !== null && device.isPresenting === true;\n\n\t}\n\n\tvar currentSize, currentPixelRatio;\n\n\tfunction onVRDisplayPresentChange() {\n\n\t\tif ( isPresenting() ) {\n\n\t\t\tvar eyeParameters = device.getEyeParameters( 'left' );\n\t\t\tvar renderWidth = eyeParameters.renderWidth;\n\t\t\tvar renderHeight = eyeParameters.renderHeight;\n\n\t\t\tcurrentPixelRatio = renderer.getPixelRatio();\n\t\t\tcurrentSize = renderer.getSize();\n\n\t\t\trenderer.setDrawingBufferSize( renderWidth * 2, renderHeight, 1 );\n\n\t\t} else if ( scope.enabled ) {\n\n\t\t\trenderer.setDrawingBufferSize( currentSize.width, currentSize.height, currentPixelRatio );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tthis.enabled = false;\n\tthis.userHeight = 1.6;\n\n\tthis.getDevice = function () {\n\n\t\treturn device;\n\n\t};\n\n\tthis.setDevice = function ( value ) {\n\n\t\tif ( value !== undefined ) device = value;\n\n\t};\n\n\tthis.setPoseTarget = function ( object ) {\n\n\t\tif ( object !== undefined ) poseTarget = object;\n\n\t};\n\n\tthis.getCamera = function ( camera ) {\n\n\t\tif ( device === null ) return camera;\n\n\t\tdevice.depthNear = camera.near;\n\t\tdevice.depthFar = camera.far;\n\n\t\tdevice.getFrameData( frameData );\n\n\t\t//\n\n\t\tvar stageParameters = device.stageParameters;\n\n\t\tif ( stageParameters ) {\n\n\t\t\tstandingMatrix.fromArray( stageParameters.sittingToStandingTransform );\n\n\t\t} else {\n\n\t\t\tstandingMatrix.makeTranslation( 0, scope.userHeight, 0 );\n\n\t\t}\n\n\n\t\tvar pose = frameData.pose;\n\t\tvar poseObject = poseTarget !== null ? poseTarget : camera;\n\n\t\t// We want to manipulate poseObject by its position and quaternion components since users may rely on them.\n\t\tposeObject.matrix.copy( standingMatrix );\n\t\tposeObject.matrix.decompose( poseObject.position, poseObject.quaternion, poseObject.scale );\n\n\t\tif ( pose.orientation !== null ) {\n\n\t\t\ttempQuaternion.fromArray( pose.orientation );\n\t\t\tposeObject.quaternion.multiply( tempQuaternion );\n\n\t\t}\n\n\t\tif ( pose.position !== null ) {\n\n\t\t\ttempQuaternion.setFromRotationMatrix( standingMatrix );\n\t\t\ttempPosition.fromArray( pose.position );\n\t\t\ttempPosition.applyQuaternion( tempQuaternion );\n\t\t\tposeObject.position.add( tempPosition );\n\n\t\t}\n\n\t\tposeObject.updateMatrixWorld();\n\n\t\tif ( device.isPresenting === false ) return camera;\n\n\t\t//\n\n\t\tcameraL.near = camera.near;\n\t\tcameraR.near = camera.near;\n\n\t\tcameraL.far = camera.far;\n\t\tcameraR.far = camera.far;\n\n\t\tcameraVR.matrixWorld.copy( camera.matrixWorld );\n\t\tcameraVR.matrixWorldInverse.copy( camera.matrixWorldInverse );\n\n\t\tcameraL.matrixWorldInverse.fromArray( frameData.leftViewMatrix );\n\t\tcameraR.matrixWorldInverse.fromArray( frameData.rightViewMatrix );\n\n\t\t// TODO (mrdoob) Double check this code\n\n\t\tstandingMatrixInverse.getInverse( standingMatrix );\n\n\t\tcameraL.matrixWorldInverse.multiply( standingMatrixInverse );\n\t\tcameraR.matrixWorldInverse.multiply( standingMatrixInverse );\n\n\t\tvar parent = poseObject.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tmatrixWorldInverse.getInverse( parent.matrixWorld );\n\n\t\t\tcameraL.matrixWorldInverse.multiply( matrixWorldInverse );\n\t\t\tcameraR.matrixWorldInverse.multiply( matrixWorldInverse );\n\n\t\t}\n\n\t\t// envMap and Mirror needs camera.matrixWorld\n\n\t\tcameraL.matrixWorld.getInverse( cameraL.matrixWorldInverse );\n\t\tcameraR.matrixWorld.getInverse( cameraR.matrixWorldInverse );\n\n\t\tcameraL.projectionMatrix.fromArray( frameData.leftProjectionMatrix );\n\t\tcameraR.projectionMatrix.fromArray( frameData.rightProjectionMatrix );\n\n\t\t// HACK (mrdoob)\n\t\t// https://github.com/w3c/webvr/issues/203\n\n\t\tcameraVR.projectionMatrix.copy( cameraL.projectionMatrix );\n\n\t\t//\n\n\t\tvar layers = device.getLayers();\n\n\t\tif ( layers.length ) {\n\n\t\t\tvar layer = layers[ 0 ];\n\n\t\t\tif ( layer.leftBounds !== null && layer.leftBounds.length === 4 ) {\n\n\t\t\t\tcameraL.bounds.fromArray( layer.leftBounds );\n\n\t\t\t}\n\n\t\t\tif ( layer.rightBounds !== null && layer.rightBounds.length === 4 ) {\n\n\t\t\t\tcameraR.bounds.fromArray( layer.rightBounds );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn cameraVR;\n\n\t};\n\n\tthis.getStandingMatrix = function () {\n\n\t\treturn standingMatrix;\n\n\t};\n\n\tthis.submitFrame = function () {\n\n\t\tif ( isPresenting() ) device.submitFrame();\n\n\t};\n\n\tthis.dispose = function () {\n\n\t\tif ( typeof window !== 'undefined' ) {\n\n\t\t\twindow.removeEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange );\n\n\t\t}\n\n\t};\n\n}\n\n/**\n * @author supereggbert / http://www.paulbrunt.co.uk/\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n * @author szimek / https://github.com/szimek/\n * @author tschw\n */\n\nfunction WebGLRenderer( parameters ) {\n\n\tconsole.log( 'THREE.WebGLRenderer', REVISION );\n\n\tparameters = parameters || {};\n\n\tvar _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ),\n\t\t_context = parameters.context !== undefined ? parameters.context : null,\n\n\t\t_alpha = parameters.alpha !== undefined ? parameters.alpha : false,\n\t\t_depth = parameters.depth !== undefined ? parameters.depth : true,\n\t\t_stencil = parameters.stencil !== undefined ? parameters.stencil : true,\n\t\t_antialias = parameters.antialias !== undefined ? parameters.antialias : false,\n\t\t_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,\n\t\t_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false,\n\t\t_powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default';\n\n\tvar currentRenderList = null;\n\tvar currentRenderState = null;\n\n\t// public properties\n\n\tthis.domElement = _canvas;\n\tthis.context = null;\n\n\t// clearing\n\n\tthis.autoClear = true;\n\tthis.autoClearColor = true;\n\tthis.autoClearDepth = true;\n\tthis.autoClearStencil = true;\n\n\t// scene graph\n\n\tthis.sortObjects = true;\n\n\t// user-defined clipping\n\n\tthis.clippingPlanes = [];\n\tthis.localClippingEnabled = false;\n\n\t// physically based shading\n\n\tthis.gammaFactor = 2.0;\t// for backwards compatibility\n\tthis.gammaInput = false;\n\tthis.gammaOutput = false;\n\n\t// physical lights\n\n\tthis.physicallyCorrectLights = false;\n\n\t// tone mapping\n\n\tthis.toneMapping = LinearToneMapping;\n\tthis.toneMappingExposure = 1.0;\n\tthis.toneMappingWhitePoint = 1.0;\n\n\t// morphs\n\n\tthis.maxMorphTargets = 8;\n\tthis.maxMorphNormals = 4;\n\n\t// internal properties\n\n\tvar _this = this,\n\n\t\t_isContextLost = false,\n\n\t\t// internal state cache\n\n\t\t_currentRenderTarget = null,\n\t\t_currentFramebuffer = null,\n\t\t_currentMaterialId = - 1,\n\t\t_currentGeometryProgram = '',\n\n\t\t_currentCamera = null,\n\t\t_currentArrayCamera = null,\n\n\t\t_currentViewport = new Vector4(),\n\t\t_currentScissor = new Vector4(),\n\t\t_currentScissorTest = null,\n\n\t\t//\n\n\t\t_usedTextureUnits = 0,\n\n\t\t//\n\n\t\t_width = _canvas.width,\n\t\t_height = _canvas.height,\n\n\t\t_pixelRatio = 1,\n\n\t\t_viewport = new Vector4( 0, 0, _width, _height ),\n\t\t_scissor = new Vector4( 0, 0, _width, _height ),\n\t\t_scissorTest = false,\n\n\t\t// frustum\n\n\t\t_frustum = new Frustum(),\n\n\t\t// clipping\n\n\t\t_clipping = new WebGLClipping(),\n\t\t_clippingEnabled = false,\n\t\t_localClippingEnabled = false,\n\n\t\t// camera matrices cache\n\n\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t_vector3 = new Vector3();\n\n\tfunction getTargetPixelRatio() {\n\n\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t}\n\n\t// initialize\n\n\tvar _gl;\n\n\ttry {\n\n\t\tvar contextAttributes = {\n\t\t\talpha: _alpha,\n\t\t\tdepth: _depth,\n\t\t\tstencil: _stencil,\n\t\t\tantialias: _antialias,\n\t\t\tpremultipliedAlpha: _premultipliedAlpha,\n\t\t\tpreserveDrawingBuffer: _preserveDrawingBuffer,\n\t\t\tpowerPreference: _powerPreference\n\t\t};\n\n\t\t// event listeners must be registered before WebGL context is created, see #12753\n\n\t\t_canvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\t\t_canvas.addEventListener( 'webglcontextrestored', onContextRestore, false );\n\n\t\t_gl = _context || _canvas.getContext( 'webgl', contextAttributes ) || _canvas.getContext( 'experimental-webgl', contextAttributes );\n\n\t\tif ( _gl === null ) {\n\n\t\t\tif ( _canvas.getContext( 'webgl' ) !== null ) {\n\n\t\t\t\tthrow new Error( 'Error creating WebGL context with your selected attributes.' );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'Error creating WebGL context.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Some experimental-webgl implementations do not have getShaderPrecisionFormat\n\n\t\tif ( _gl.getShaderPrecisionFormat === undefined ) {\n\n\t\t\t_gl.getShaderPrecisionFormat = function () {\n\n\t\t\t\treturn { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };\n\n\t\t\t};\n\n\t\t}\n\n\t} catch ( error ) {\n\n\t\tconsole.error( 'THREE.WebGLRenderer: ' + error.message );\n\n\t}\n\n\tvar extensions, capabilities, state, info;\n\tvar properties, textures, attributes, geometries, objects;\n\tvar programCache, renderLists, renderStates;\n\n\tvar background, morphtargets, bufferRenderer, indexedBufferRenderer;\n\tvar spriteRenderer;\n\n\tvar utils;\n\n\tfunction initGLContext() {\n\n\t\textensions = new WebGLExtensions( _gl );\n\t\textensions.get( 'WEBGL_depth_texture' );\n\t\textensions.get( 'OES_texture_float' );\n\t\textensions.get( 'OES_texture_float_linear' );\n\t\textensions.get( 'OES_texture_half_float' );\n\t\textensions.get( 'OES_texture_half_float_linear' );\n\t\textensions.get( 'OES_standard_derivatives' );\n\t\textensions.get( 'OES_element_index_uint' );\n\t\textensions.get( 'ANGLE_instanced_arrays' );\n\n\t\tutils = new WebGLUtils( _gl, extensions );\n\n\t\tcapabilities = new WebGLCapabilities( _gl, extensions, parameters );\n\n\t\tstate = new WebGLState( _gl, extensions, utils );\n\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) );\n\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) );\n\n\t\tinfo = new WebGLInfo( _gl );\n\t\tproperties = new WebGLProperties();\n\t\ttextures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );\n\t\tattributes = new WebGLAttributes( _gl );\n\t\tgeometries = new WebGLGeometries( _gl, attributes, info );\n\t\tobjects = new WebGLObjects( geometries, info );\n\t\tmorphtargets = new WebGLMorphtargets( _gl );\n\t\tprogramCache = new WebGLPrograms( _this, extensions, capabilities );\n\t\trenderLists = new WebGLRenderLists();\n\t\trenderStates = new WebGLRenderStates();\n\n\t\tbackground = new WebGLBackground( _this, state, geometries, _premultipliedAlpha );\n\n\t\tbufferRenderer = new WebGLBufferRenderer( _gl, extensions, info );\n\t\tindexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info );\n\n\t\tspriteRenderer = new WebGLSpriteRenderer( _this, _gl, state, textures, capabilities );\n\n\t\tinfo.programs = programCache.programs;\n\n\t\t_this.context = _gl;\n\t\t_this.capabilities = capabilities;\n\t\t_this.extensions = extensions;\n\t\t_this.properties = properties;\n\t\t_this.renderLists = renderLists;\n\t\t_this.state = state;\n\t\t_this.info = info;\n\n\t}\n\n\tinitGLContext();\n\n\t// vr\n\n\tvar vr = new WebVRManager( _this );\n\n\tthis.vr = vr;\n\n\t// shadow map\n\n\tvar shadowMap = new WebGLShadowMap( _this, objects, capabilities.maxTextureSize );\n\n\tthis.shadowMap = shadowMap;\n\n\t// API\n\n\tthis.getContext = function () {\n\n\t\treturn _gl;\n\n\t};\n\n\tthis.getContextAttributes = function () {\n\n\t\treturn _gl.getContextAttributes();\n\n\t};\n\n\tthis.forceContextLoss = function () {\n\n\t\tvar extension = extensions.get( 'WEBGL_lose_context' );\n\t\tif ( extension ) extension.loseContext();\n\n\t};\n\n\tthis.forceContextRestore = function () {\n\n\t\tvar extension = extensions.get( 'WEBGL_lose_context' );\n\t\tif ( extension ) extension.restoreContext();\n\n\t};\n\n\tthis.getPixelRatio = function () {\n\n\t\treturn _pixelRatio;\n\n\t};\n\n\tthis.setPixelRatio = function ( value ) {\n\n\t\tif ( value === undefined ) return;\n\n\t\t_pixelRatio = value;\n\n\t\tthis.setSize( _width, _height, false );\n\n\t};\n\n\tthis.getSize = function () {\n\n\t\treturn {\n\t\t\twidth: _width,\n\t\t\theight: _height\n\t\t};\n\n\t};\n\n\tthis.setSize = function ( width, height, updateStyle ) {\n\n\t\tvar device = vr.getDevice();\n\n\t\tif ( device && device.isPresenting ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Can\\'t change size while VR device is presenting.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\t_width = width;\n\t\t_height = height;\n\n\t\t_canvas.width = width * _pixelRatio;\n\t\t_canvas.height = height * _pixelRatio;\n\n\t\tif ( updateStyle !== false ) {\n\n\t\t\t_canvas.style.width = width + 'px';\n\t\t\t_canvas.style.height = height + 'px';\n\n\t\t}\n\n\t\tthis.setViewport( 0, 0, width, height );\n\n\t};\n\n\tthis.getDrawingBufferSize = function () {\n\n\t\treturn {\n\t\t\twidth: _width * _pixelRatio,\n\t\t\theight: _height * _pixelRatio\n\t\t};\n\n\t};\n\n\tthis.setDrawingBufferSize = function ( width, height, pixelRatio ) {\n\n\t\t_width = width;\n\t\t_height = height;\n\n\t\t_pixelRatio = pixelRatio;\n\n\t\t_canvas.width = width * pixelRatio;\n\t\t_canvas.height = height * pixelRatio;\n\n\t\tthis.setViewport( 0, 0, width, height );\n\n\t};\n\n\tthis.getCurrentViewport = function () {\n\n\t\treturn _currentViewport;\n\n\t};\n\n\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\t_viewport.set( x, _height - y - height, width, height );\n\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) );\n\n\t};\n\n\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\t_scissor.set( x, _height - y - height, width, height );\n\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) );\n\n\t};\n\n\tthis.setScissorTest = function ( boolean ) {\n\n\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t};\n\n\t// Clearing\n\n\tthis.getClearColor = function () {\n\n\t\treturn background.getClearColor();\n\n\t};\n\n\tthis.setClearColor = function () {\n\n\t\tbackground.setClearColor.apply( background, arguments );\n\n\t};\n\n\tthis.getClearAlpha = function () {\n\n\t\treturn background.getClearAlpha();\n\n\t};\n\n\tthis.setClearAlpha = function () {\n\n\t\tbackground.setClearAlpha.apply( background, arguments );\n\n\t};\n\n\tthis.clear = function ( color, depth, stencil ) {\n\n\t\tvar bits = 0;\n\n\t\tif ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT;\n\t\tif ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT;\n\t\tif ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT;\n\n\t\t_gl.clear( bits );\n\n\t};\n\n\tthis.clearColor = function () {\n\n\t\tthis.clear( true, false, false );\n\n\t};\n\n\tthis.clearDepth = function () {\n\n\t\tthis.clear( false, true, false );\n\n\t};\n\n\tthis.clearStencil = function () {\n\n\t\tthis.clear( false, false, true );\n\n\t};\n\n\tthis.clearTarget = function ( renderTarget, color, depth, stencil ) {\n\n\t\tthis.setRenderTarget( renderTarget );\n\t\tthis.clear( color, depth, stencil );\n\n\t};\n\n\t//\n\n\tthis.dispose = function () {\n\n\t\t_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\t\t_canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );\n\n\t\trenderLists.dispose();\n\t\trenderStates.dispose();\n\t\tproperties.dispose();\n\t\tobjects.dispose();\n\n\t\tvr.dispose();\n\n\t\tstopAnimation();\n\n\t};\n\n\t// Events\n\n\tfunction onContextLost( event ) {\n\n\t\tevent.preventDefault();\n\n\t\tconsole.log( 'THREE.WebGLRenderer: Context Lost.' );\n\n\t\t_isContextLost = true;\n\n\t}\n\n\tfunction onContextRestore( /* event */ ) {\n\n\t\tconsole.log( 'THREE.WebGLRenderer: Context Restored.' );\n\n\t\t_isContextLost = false;\n\n\t\tinitGLContext();\n\n\t}\n\n\tfunction onMaterialDispose( event ) {\n\n\t\tvar material = event.target;\n\n\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\tdeallocateMaterial( material );\n\n\t}\n\n\t// Buffer deallocation\n\n\tfunction deallocateMaterial( material ) {\n\n\t\treleaseMaterialProgramReference( material );\n\n\t\tproperties.remove( material );\n\n\t}\n\n\n\tfunction releaseMaterialProgramReference( material ) {\n\n\t\tvar programInfo = properties.get( material ).program;\n\n\t\tmaterial.program = undefined;\n\n\t\tif ( programInfo !== undefined ) {\n\n\t\t\tprogramCache.releaseProgram( programInfo );\n\n\t\t}\n\n\t}\n\n\t// Buffer rendering\n\n\tfunction renderObjectImmediate( object, program, material ) {\n\n\t\tobject.render( function ( object ) {\n\n\t\t\t_this.renderBufferImmediate( object, program, material );\n\n\t\t} );\n\n\t}\n\n\tthis.renderBufferImmediate = function ( object, program, material ) {\n\n\t\tstate.initAttributes();\n\n\t\tvar buffers = properties.get( object );\n\n\t\tif ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer();\n\t\tif ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer();\n\t\tif ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer();\n\t\tif ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer();\n\n\t\tvar programAttributes = program.getAttributes();\n\n\t\tif ( object.hasPositions ) {\n\n\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position );\n\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW );\n\n\t\t\tstate.enableAttribute( programAttributes.position );\n\t\t\t_gl.vertexAttribPointer( programAttributes.position, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t}\n\n\t\tif ( object.hasNormals ) {\n\n\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal );\n\n\t\t\tif ( ! material.isMeshPhongMaterial &&\n\t\t\t\t! material.isMeshStandardMaterial &&\n\t\t\t\t! material.isMeshNormalMaterial &&\n\t\t\t\tmaterial.flatShading === true ) {\n\n\t\t\t\tfor ( var i = 0, l = object.count * 3; i < l; i += 9 ) {\n\n\t\t\t\t\tvar array = object.normalArray;\n\n\t\t\t\t\tvar nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3;\n\t\t\t\t\tvar ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3;\n\t\t\t\t\tvar nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3;\n\n\t\t\t\t\tarray[ i + 0 ] = nx;\n\t\t\t\t\tarray[ i + 1 ] = ny;\n\t\t\t\t\tarray[ i + 2 ] = nz;\n\n\t\t\t\t\tarray[ i + 3 ] = nx;\n\t\t\t\t\tarray[ i + 4 ] = ny;\n\t\t\t\t\tarray[ i + 5 ] = nz;\n\n\t\t\t\t\tarray[ i + 6 ] = nx;\n\t\t\t\t\tarray[ i + 7 ] = ny;\n\t\t\t\t\tarray[ i + 8 ] = nz;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW );\n\n\t\t\tstate.enableAttribute( programAttributes.normal );\n\n\t\t\t_gl.vertexAttribPointer( programAttributes.normal, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t}\n\n\t\tif ( object.hasUvs && material.map ) {\n\n\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv );\n\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW );\n\n\t\t\tstate.enableAttribute( programAttributes.uv );\n\n\t\t\t_gl.vertexAttribPointer( programAttributes.uv, 2, _gl.FLOAT, false, 0, 0 );\n\n\t\t}\n\n\t\tif ( object.hasColors && material.vertexColors !== NoColors ) {\n\n\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color );\n\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW );\n\n\t\t\tstate.enableAttribute( programAttributes.color );\n\n\t\t\t_gl.vertexAttribPointer( programAttributes.color, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t}\n\n\t\tstate.disableUnusedAttributes();\n\n\t\t_gl.drawArrays( _gl.TRIANGLES, 0, object.count );\n\n\t\tobject.count = 0;\n\n\t};\n\n\tthis.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) {\n\n\t\tvar frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );\n\n\t\tstate.setMaterial( material, frontFaceCW );\n\n\t\tvar program = setProgram( camera, fog, material, object );\n\t\tvar geometryProgram = geometry.id + '_' + program.id + '_' + ( material.wireframe === true );\n\n\t\tvar updateBuffers = false;\n\n\t\tif ( geometryProgram !== _currentGeometryProgram ) {\n\n\t\t\t_currentGeometryProgram = geometryProgram;\n\t\t\tupdateBuffers = true;\n\n\t\t}\n\n\t\tif ( object.morphTargetInfluences ) {\n\n\t\t\tmorphtargets.update( object, geometry, material, program );\n\n\t\t\tupdateBuffers = true;\n\n\t\t}\n\n\t\t//\n\n\t\tvar index = geometry.index;\n\t\tvar position = geometry.attributes.position;\n\t\tvar rangeFactor = 1;\n\n\t\tif ( material.wireframe === true ) {\n\n\t\t\tindex = geometries.getWireframeAttribute( geometry );\n\t\t\trangeFactor = 2;\n\n\t\t}\n\n\t\tvar attribute;\n\t\tvar renderer = bufferRenderer;\n\n\t\tif ( index !== null ) {\n\n\t\t\tattribute = attributes.get( index );\n\n\t\t\trenderer = indexedBufferRenderer;\n\t\t\trenderer.setIndex( attribute );\n\n\t\t}\n\n\t\tif ( updateBuffers ) {\n\n\t\t\tsetupVertexAttributes( material, program, geometry );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, attribute.buffer );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tvar dataCount = Infinity;\n\n\t\tif ( index !== null ) {\n\n\t\t\tdataCount = index.count;\n\n\t\t} else if ( position !== undefined ) {\n\n\t\t\tdataCount = position.count;\n\n\t\t}\n\n\t\tvar rangeStart = geometry.drawRange.start * rangeFactor;\n\t\tvar rangeCount = geometry.drawRange.count * rangeFactor;\n\n\t\tvar groupStart = group !== null ? group.start * rangeFactor : 0;\n\t\tvar groupCount = group !== null ? group.count * rangeFactor : Infinity;\n\n\t\tvar drawStart = Math.max( rangeStart, groupStart );\n\t\tvar drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;\n\n\t\tvar drawCount = Math.max( 0, drawEnd - drawStart + 1 );\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\t//\n\n\t\tif ( object.isMesh ) {\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t} else {\n\n\t\t\t\tswitch ( object.drawMode ) {\n\n\t\t\t\t\tcase TrianglesDrawMode:\n\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase TriangleStripDrawMode:\n\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_STRIP );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase TriangleFanDrawMode:\n\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_FAN );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t} else if ( object.isLine ) {\n\n\t\t\tvar lineWidth = material.linewidth;\n\n\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t} else if ( object.isLineLoop ) {\n\n\t\t\t\trenderer.setMode( _gl.LINE_LOOP );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.setMode( _gl.LINE_STRIP );\n\n\t\t\t}\n\n\t\t} else if ( object.isPoints ) {\n\n\t\t\trenderer.setMode( _gl.POINTS );\n\n\t\t}\n\n\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\tif ( geometry.maxInstancedCount > 0 ) {\n\n\t\t\t\trenderer.renderInstances( geometry, drawStart, drawCount );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t}\n\n\t};\n\n\tfunction setupVertexAttributes( material, program, geometry ) {\n\n\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\tif ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.initAttributes();\n\n\t\tvar geometryAttributes = geometry.attributes;\n\n\t\tvar programAttributes = program.getAttributes();\n\n\t\tvar materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\tfor ( var name in programAttributes ) {\n\n\t\t\tvar programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute >= 0 ) {\n\n\t\t\t\tvar geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\tvar normalized = geometryAttribute.normalized;\n\t\t\t\t\tvar size = geometryAttribute.itemSize;\n\n\t\t\t\t\tvar attribute = attributes.get( geometryAttribute );\n\n\t\t\t\t\t// TODO Attribute may not be available on context restore\n\n\t\t\t\t\tif ( attribute === undefined ) continue;\n\n\t\t\t\t\tvar buffer = attribute.buffer;\n\t\t\t\t\tvar type = attribute.type;\n\t\t\t\t\tvar bytesPerElement = attribute.bytesPerElement;\n\n\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tvar data = geometryAttribute.data;\n\t\t\t\t\t\tvar stride = data.stride;\n\t\t\t\t\t\tvar offset = geometryAttribute.offset;\n\n\t\t\t\t\t\tif ( data && data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute );\n\n\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * bytesPerElement, offset * bytesPerElement );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute );\n\n\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\tvar value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\t_gl.vertexAttrib2fv( programAttribute, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\t_gl.vertexAttrib3fv( programAttribute, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\t_gl.vertexAttrib4fv( programAttribute, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t_gl.vertexAttrib1fv( programAttribute, value );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.disableUnusedAttributes();\n\n\t}\n\n\t// Compile\n\n\tthis.compile = function ( scene, camera ) {\n\n\t\tcurrentRenderState = renderStates.get( scene, camera );\n\t\tcurrentRenderState.init();\n\n\t\tscene.traverse( function ( object ) {\n\n\t\t\tif ( object.isLight ) {\n\n\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t\tcurrentRenderState.setupLights( camera );\n\n\t\tscene.traverse( function ( object ) {\n\n\t\t\tif ( object.material ) {\n\n\t\t\t\tif ( Array.isArray( object.material ) ) {\n\n\t\t\t\t\tfor ( var i = 0; i < object.material.length; i ++ ) {\n\n\t\t\t\t\t\tinitMaterial( object.material[ i ], scene.fog, object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tinitMaterial( object.material, scene.fog, object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t};\n\n\t// Animation Loop\n\n\tvar isAnimating = false;\n\tvar onAnimationFrame = null;\n\n\tfunction startAnimation() {\n\n\t\tif ( isAnimating ) return;\n\n\t\trequestAnimationLoopFrame();\n\n\t\tisAnimating = true;\n\n\t}\n\n\tfunction stopAnimation() {\n\n\t\tisAnimating = false;\n\n\t}\n\n\tfunction requestAnimationLoopFrame() {\n\n\t\tvar device = vr.getDevice();\n\n\t\tif ( device && device.isPresenting ) {\n\n\t\t\tdevice.requestAnimationFrame( animationLoop );\n\n\t\t} else {\n\n\t\t\twindow.requestAnimationFrame( animationLoop );\n\n\t\t}\n\n\t}\n\n\tfunction animationLoop( time ) {\n\n\t\tif ( isAnimating === false ) return;\n\n\t\tonAnimationFrame( time );\n\n\t\trequestAnimationLoopFrame();\n\n\t}\n\n\tthis.animate = function ( callback ) {\n\n\t\tonAnimationFrame = callback;\n\t\tonAnimationFrame !== null ? startAnimation() : stopAnimation();\n\n\t};\n\n\t// Rendering\n\n\tthis.render = function ( scene, camera, renderTarget, forceClear ) {\n\n\t\tif ( ! ( camera && camera.isCamera ) ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( _isContextLost ) return;\n\n\t\t// reset caching for this frame\n\n\t\t_currentGeometryProgram = '';\n\t\t_currentMaterialId = - 1;\n\t\t_currentCamera = null;\n\n\t\t// update scene graph\n\n\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t// update camera matrices and frustum\n\n\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\tif ( vr.enabled ) {\n\n\t\t\tcamera = vr.getCamera( camera );\n\n\t\t}\n\n\t\t//\n\n\t\tcurrentRenderState = renderStates.get( scene, camera );\n\t\tcurrentRenderState.init();\n\n\t\tscene.onBeforeRender( _this, scene, camera, renderTarget );\n\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t_clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera );\n\n\t\tcurrentRenderList = renderLists.get( scene, camera );\n\t\tcurrentRenderList.init();\n\n\t\tprojectObject( scene, camera, _this.sortObjects );\n\n\t\tif ( _this.sortObjects === true ) {\n\n\t\t\tcurrentRenderList.sort();\n\n\t\t}\n\n\t\t//\n\n\t\tif ( _clippingEnabled ) _clipping.beginShadows();\n\n\t\tvar shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\tshadowMap.render( shadowsArray, scene, camera );\n\n\t\tcurrentRenderState.setupLights( camera );\n\n\t\tif ( _clippingEnabled ) _clipping.endShadows();\n\n\t\t//\n\n\t\tif ( this.info.autoReset ) this.info.reset();\n\n\t\tif ( renderTarget === undefined ) {\n\n\t\t\trenderTarget = null;\n\n\t\t}\n\n\t\tthis.setRenderTarget( renderTarget );\n\n\t\t//\n\n\t\tbackground.render( currentRenderList, scene, camera, forceClear );\n\n\t\t// render scene\n\n\t\tvar opaqueObjects = currentRenderList.opaque;\n\t\tvar transparentObjects = currentRenderList.transparent;\n\n\t\tif ( scene.overrideMaterial ) {\n\n\t\t\tvar overrideMaterial = scene.overrideMaterial;\n\n\t\t\tif ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera, overrideMaterial );\n\t\t\tif ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera, overrideMaterial );\n\n\t\t} else {\n\n\t\t\t// opaque pass (front-to-back order)\n\n\t\t\tif ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera );\n\n\t\t\t// transparent pass (back-to-front order)\n\n\t\t\tif ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera );\n\n\t\t}\n\n\t\t// custom renderers\n\n\t\tvar spritesArray = currentRenderState.state.spritesArray;\n\n\t\tspriteRenderer.render( spritesArray, scene, camera );\n\n\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\tif ( renderTarget ) {\n\n\t\t\ttextures.updateRenderTargetMipmap( renderTarget );\n\n\t\t}\n\n\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\tstate.buffers.depth.setTest( true );\n\t\tstate.buffers.depth.setMask( true );\n\t\tstate.buffers.color.setMask( true );\n\n\t\tstate.setPolygonOffset( false );\n\n\t\tscene.onAfterRender( _this, scene, camera );\n\n\t\tif ( vr.enabled ) {\n\n\t\t\tvr.submitFrame();\n\n\t\t}\n\n\t\t// _gl.finish();\n\n\t\tcurrentRenderList = null;\n\t\tcurrentRenderState = null;\n\n\t};\n\n\t/*\n\t// TODO Duplicated code (Frustum)\n\n\tvar _sphere = new Sphere();\n\n\tfunction isObjectViewable( object ) {\n\n\t\tvar geometry = object.geometry;\n\n\t\tif ( geometry.boundingSphere === null )\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t_sphere.copy( geometry.boundingSphere ).\n\t\tapplyMatrix4( object.matrixWorld );\n\n\t\treturn isSphereViewable( _sphere );\n\n\t}\n\n\tfunction isSpriteViewable( sprite ) {\n\n\t\t_sphere.center.set( 0, 0, 0 );\n\t\t_sphere.radius = 0.7071067811865476;\n\t\t_sphere.applyMatrix4( sprite.matrixWorld );\n\n\t\treturn isSphereViewable( _sphere );\n\n\t}\n\n\tfunction isSphereViewable( sphere ) {\n\n\t\tif ( ! _frustum.intersectsSphere( sphere ) ) return false;\n\n\t\tvar numPlanes = _clipping.numPlanes;\n\n\t\tif ( numPlanes === 0 ) return true;\n\n\t\tvar planes = _this.clippingPlanes,\n\n\t\t\tcenter = sphere.center,\n\t\t\tnegRad = - sphere.radius,\n\t\t\ti = 0;\n\n\t\tdo {\n\n\t\t\t// out when deeper than radius in the negative halfspace\n\t\t\tif ( planes[ i ].distanceToPoint( center ) < negRad ) return false;\n\n\t\t} while ( ++ i !== numPlanes );\n\n\t\treturn true;\n\n\t}\n\t*/\n\n\tfunction projectObject( object, camera, sortObjects ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tvar visible = object.layers.test( camera.layers );\n\n\t\tif ( visible ) {\n\n\t\t\tif ( object.isLight ) {\n\n\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {\n\n\t\t\t\t\tcurrentRenderState.pushSprite( object );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isImmediateRenderObject ) {\n\n\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t}\n\n\t\t\t\tcurrentRenderList.push( object, null, object.material, _vector3.z, null );\n\n\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\t\tobject.skeleton.update();\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {\n\n\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar geometry = objects.update( object );\n\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\tvar groups = geometry.groups;\n\n\t\t\t\t\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tvar group = groups[ i ];\n\t\t\t\t\t\t\tvar groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, groupMaterial, _vector3.z, group );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, _vector3.z, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar children = object.children;\n\n\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tprojectObject( children[ i ], camera, sortObjects );\n\n\t\t}\n\n\t}\n\n\tfunction renderObjects( renderList, scene, camera, overrideMaterial ) {\n\n\t\tfor ( var i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\tvar renderItem = renderList[ i ];\n\n\t\t\tvar object = renderItem.object;\n\t\t\tvar geometry = renderItem.geometry;\n\t\t\tvar material = overrideMaterial === undefined ? renderItem.material : overrideMaterial;\n\t\t\tvar group = renderItem.group;\n\n\t\t\tif ( camera.isArrayCamera ) {\n\n\t\t\t\t_currentArrayCamera = camera;\n\n\t\t\t\tvar cameras = camera.cameras;\n\n\t\t\t\tfor ( var j = 0, jl = cameras.length; j < jl; j ++ ) {\n\n\t\t\t\t\tvar camera2 = cameras[ j ];\n\n\t\t\t\t\tif ( object.layers.test( camera2.layers ) ) {\n\n\t\t\t\t\t\tvar bounds = camera2.bounds;\n\n\t\t\t\t\t\tvar x = bounds.x * _width;\n\t\t\t\t\t\tvar y = bounds.y * _height;\n\t\t\t\t\t\tvar width = bounds.z * _width;\n\t\t\t\t\t\tvar height = bounds.w * _height;\n\n\t\t\t\t\t\tstate.viewport( _currentViewport.set( x, y, width, height ).multiplyScalar( _pixelRatio ) );\n\n\t\t\t\t\t\trenderObject( object, scene, camera2, geometry, material, group );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_currentArrayCamera = null;\n\n\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction renderObject( object, scene, camera, geometry, material, group ) {\n\n\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\t\tcurrentRenderState = renderStates.get( scene, _currentArrayCamera || camera );\n\n\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\tif ( object.isImmediateRenderObject ) {\n\n\t\t\tvar frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );\n\n\t\t\tstate.setMaterial( material, frontFaceCW );\n\n\t\t\tvar program = setProgram( camera, scene.fog, material, object );\n\n\t\t\t_currentGeometryProgram = '';\n\n\t\t\trenderObjectImmediate( object, program, material );\n\n\t\t} else {\n\n\t\t\t_this.renderBufferDirect( camera, scene.fog, geometry, material, object, group );\n\n\t\t}\n\n\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\t\tcurrentRenderState = renderStates.get( scene, _currentArrayCamera || camera );\n\n\t}\n\n\tfunction initMaterial( material, fog, object ) {\n\n\t\tvar materialProperties = properties.get( material );\n\n\t\tvar lights = currentRenderState.state.lights;\n\t\tvar shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\tvar parameters = programCache.getParameters(\n\t\t\tmaterial, lights.state, shadowsArray, fog, _clipping.numPlanes, _clipping.numIntersection, object );\n\n\t\tvar code = programCache.getProgramCode( material, parameters );\n\n\t\tvar program = materialProperties.program;\n\t\tvar programChange = true;\n\n\t\tif ( program === undefined ) {\n\n\t\t\t// new material\n\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t} else if ( program.code !== code ) {\n\n\t\t\t// changed glsl or parameters\n\t\t\treleaseMaterialProgramReference( material );\n\n\t\t} else if ( materialProperties.lightsHash !== lights.state.hash ) {\n\n\t\t\tproperties.update( material, 'lightsHash', lights.state.hash );\n\t\t\tprogramChange = false;\n\n\t\t} else if ( parameters.shaderID !== undefined ) {\n\n\t\t\t// same glsl and uniform list\n\t\t\treturn;\n\n\t\t} else {\n\n\t\t\t// only rebuild uniform list\n\t\t\tprogramChange = false;\n\n\t\t}\n\n\t\tif ( programChange ) {\n\n\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\tvar shader = ShaderLib[ parameters.shaderID ];\n\n\t\t\t\tmaterialProperties.shader = {\n\t\t\t\t\tname: material.type,\n\t\t\t\t\tuniforms: UniformsUtils.clone( shader.uniforms ),\n\t\t\t\t\tvertexShader: shader.vertexShader,\n\t\t\t\t\tfragmentShader: shader.fragmentShader\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tmaterialProperties.shader = {\n\t\t\t\t\tname: material.type,\n\t\t\t\t\tuniforms: material.uniforms,\n\t\t\t\t\tvertexShader: material.vertexShader,\n\t\t\t\t\tfragmentShader: material.fragmentShader\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tmaterial.onBeforeCompile( materialProperties.shader, _this );\n\n\t\t\tprogram = programCache.acquireProgram( material, materialProperties.shader, parameters, code );\n\n\t\t\tmaterialProperties.program = program;\n\t\t\tmaterial.program = program;\n\n\t\t}\n\n\t\tvar programAttributes = program.getAttributes();\n\n\t\tif ( material.morphTargets ) {\n\n\t\t\tmaterial.numSupportedMorphTargets = 0;\n\n\t\t\tfor ( var i = 0; i < _this.maxMorphTargets; i ++ ) {\n\n\t\t\t\tif ( programAttributes[ 'morphTarget' + i ] >= 0 ) {\n\n\t\t\t\t\tmaterial.numSupportedMorphTargets ++;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.morphNormals ) {\n\n\t\t\tmaterial.numSupportedMorphNormals = 0;\n\n\t\t\tfor ( var i = 0; i < _this.maxMorphNormals; i ++ ) {\n\n\t\t\t\tif ( programAttributes[ 'morphNormal' + i ] >= 0 ) {\n\n\t\t\t\t\tmaterial.numSupportedMorphNormals ++;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar uniforms = materialProperties.shader.uniforms;\n\n\t\tif ( ! material.isShaderMaterial &&\n\t\t\t! material.isRawShaderMaterial ||\n\t\t\tmaterial.clipping === true ) {\n\n\t\t\tmaterialProperties.numClippingPlanes = _clipping.numPlanes;\n\t\t\tmaterialProperties.numIntersection = _clipping.numIntersection;\n\t\t\tuniforms.clippingPlanes = _clipping.uniform;\n\n\t\t}\n\n\t\tmaterialProperties.fog = fog;\n\n\t\t// store the light setup it was created for\n\n\t\tmaterialProperties.lightsHash = lights.state.hash;\n\n\t\tif ( material.lights ) {\n\n\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\tuniforms.ambientLightColor.value = lights.state.ambient;\n\t\t\tuniforms.directionalLights.value = lights.state.directional;\n\t\t\tuniforms.spotLights.value = lights.state.spot;\n\t\t\tuniforms.rectAreaLights.value = lights.state.rectArea;\n\t\t\tuniforms.pointLights.value = lights.state.point;\n\t\t\tuniforms.hemisphereLights.value = lights.state.hemi;\n\n\t\t\tuniforms.directionalShadowMap.value = lights.state.directionalShadowMap;\n\t\t\tuniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;\n\t\t\tuniforms.spotShadowMap.value = lights.state.spotShadowMap;\n\t\t\tuniforms.spotShadowMatrix.value = lights.state.spotShadowMatrix;\n\t\t\tuniforms.pointShadowMap.value = lights.state.pointShadowMap;\n\t\t\tuniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;\n\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t}\n\n\t\tvar progUniforms = materialProperties.program.getUniforms(),\n\t\t\tuniformsList =\n\t\t\t\tWebGLUniforms.seqWithValue( progUniforms.seq, uniforms );\n\n\t\tmaterialProperties.uniformsList = uniformsList;\n\n\t}\n\n\tfunction setProgram( camera, fog, material, object ) {\n\n\t\t_usedTextureUnits = 0;\n\n\t\tvar materialProperties = properties.get( material );\n\t\tvar lights = currentRenderState.state.lights;\n\n\t\tif ( _clippingEnabled ) {\n\n\t\t\tif ( _localClippingEnabled || camera !== _currentCamera ) {\n\n\t\t\t\tvar useCache =\n\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t// (#8465, #8379)\n\t\t\t\t_clipping.setState(\n\t\t\t\t\tmaterial.clippingPlanes, material.clipIntersection, material.clipShadows,\n\t\t\t\t\tcamera, materialProperties, useCache );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.needsUpdate === false ) {\n\n\t\t\tif ( materialProperties.program === undefined ) {\n\n\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t} else if ( material.fog && materialProperties.fog !== fog ) {\n\n\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t} else if ( material.lights && materialProperties.lightsHash !== lights.state.hash ) {\n\n\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t( materialProperties.numClippingPlanes !== _clipping.numPlanes ||\n\t\t\t\tmaterialProperties.numIntersection !== _clipping.numIntersection ) ) {\n\n\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.needsUpdate ) {\n\n\t\t\tinitMaterial( material, fog, object );\n\t\t\tmaterial.needsUpdate = false;\n\n\t\t}\n\n\t\tvar refreshProgram = false;\n\t\tvar refreshMaterial = false;\n\t\tvar refreshLights = false;\n\n\t\tvar program = materialProperties.program,\n\t\t\tp_uniforms = program.getUniforms(),\n\t\t\tm_uniforms = materialProperties.shader.uniforms;\n\n\t\tif ( state.useProgram( program.program ) ) {\n\n\t\t\trefreshProgram = true;\n\t\t\trefreshMaterial = true;\n\t\t\trefreshLights = true;\n\n\t\t}\n\n\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t_currentMaterialId = material.id;\n\n\t\t\trefreshMaterial = true;\n\n\t\t}\n\n\t\tif ( refreshProgram || camera !== _currentCamera ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );\n\n\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t}\n\n\t\t\t// Avoid unneeded uniform updates per ArrayCamera's sub-camera\n\n\t\t\tif ( _currentCamera !== ( _currentArrayCamera || camera ) ) {\n\n\t\t\t\t_currentCamera = ( _currentArrayCamera || camera );\n\n\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t}\n\n\t\t\t// load material specific uniforms\n\t\t\t// (shader material also gets them for the sake of genericity)\n\n\t\t\tif ( material.isShaderMaterial ||\n\t\t\t\tmaterial.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.envMap ) {\n\n\t\t\t\tvar uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\tuCamPos.setValue( _gl,\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.isShaderMaterial ||\n\t\t\t\tmaterial.skinning ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// skinning uniforms must be set even if material didn't change\n\t\t// auto-setting of texture unit for bone texture must go before other textures\n\t\t// not sure why, but otherwise weird things happen\n\n\t\tif ( material.skinning ) {\n\n\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\tvar skeleton = object.skeleton;\n\n\t\t\tif ( skeleton ) {\n\n\t\t\t\tvar bones = skeleton.bones;\n\n\t\t\t\tif ( capabilities.floatVertexTextures ) {\n\n\t\t\t\t\tif ( skeleton.boneTexture === undefined ) {\n\n\t\t\t\t\t\t// layout (1 matrix = 4 pixels)\n\t\t\t\t\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t\t\t\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\n\t\t\t\t\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\n\t\t\t\t\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\n\t\t\t\t\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\n\t\t\t\t\t\tvar size = Math.sqrt( bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\t\t\t\t\tsize = _Math.ceilPowerOfTwo( size );\n\t\t\t\t\t\tsize = Math.max( size, 4 );\n\n\t\t\t\t\t\tvar boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\t\t\t\t\tboneMatrices.set( skeleton.boneMatrices ); // copy current values\n\n\t\t\t\t\t\tvar boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType );\n\t\t\t\t\t\tboneTexture.needsUpdate = true;\n\n\t\t\t\t\t\tskeleton.boneMatrices = boneMatrices;\n\t\t\t\t\t\tskeleton.boneTexture = boneTexture;\n\t\t\t\t\t\tskeleton.boneTextureSize = size;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture );\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tp_uniforms.setOptional( _gl, skeleton, 'boneMatrices' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( refreshMaterial ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );\n\t\t\tp_uniforms.setValue( _gl, 'toneMappingWhitePoint', _this.toneMappingWhitePoint );\n\n\t\t\tif ( material.lights ) {\n\n\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t// values\n\t\t\t\t//\n\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t// the GL state when required\n\n\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t}\n\n\t\t\t// refresh uniforms common to several materials\n\n\t\t\tif ( fog && material.fog ) {\n\n\t\t\t\trefreshUniformsFog( m_uniforms, fog );\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshBasicMaterial ) {\n\n\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\n\t\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\t\t\t\trefreshUniformsLambert( m_uniforms, material );\n\n\t\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\n\t\t\t\tif ( material.isMeshToonMaterial ) {\n\n\t\t\t\t\trefreshUniformsToon( m_uniforms, material );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trefreshUniformsPhong( m_uniforms, material );\n\n\t\t\t\t}\n\n\t\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\n\t\t\t\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\t\trefreshUniformsPhysical( m_uniforms, material );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trefreshUniformsStandard( m_uniforms, material );\n\n\t\t\t\t}\n\n\t\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\t\t\t\trefreshUniformsDepth( m_uniforms, material );\n\n\t\t\t} else if ( material.isMeshDistanceMaterial ) {\n\n\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\t\t\t\trefreshUniformsDistance( m_uniforms, material );\n\n\t\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\t\t\t\trefreshUniformsNormal( m_uniforms, material );\n\n\t\t\t} else if ( material.isLineBasicMaterial ) {\n\n\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\n\t\t\t\tif ( material.isLineDashedMaterial ) {\n\n\t\t\t\t\trefreshUniformsDash( m_uniforms, material );\n\n\t\t\t\t}\n\n\t\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\t\trefreshUniformsPoints( m_uniforms, material );\n\n\t\t\t} else if ( material.isShadowMaterial ) {\n\n\t\t\t\tm_uniforms.color.value = material.color;\n\t\t\t\tm_uniforms.opacity.value = material.opacity;\n\n\t\t\t}\n\n\t\t\t// RectAreaLight Texture\n\t\t\t// TODO (mrdoob): Find a nicer implementation\n\n\t\t\tif ( m_uniforms.ltc_1 !== undefined ) m_uniforms.ltc_1.value = UniformsLib.LTC_1;\n\t\t\tif ( m_uniforms.ltc_2 !== undefined ) m_uniforms.ltc_2.value = UniformsLib.LTC_2;\n\n\t\t\tWebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, _this );\n\n\t\t}\n\n\t\tif ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {\n\n\t\t\tWebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, _this );\n\t\t\tmaterial.uniformsNeedUpdate = false;\n\n\t\t}\n\n\t\t// common matrices\n\n\t\tp_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );\n\t\tp_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );\n\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\treturn program;\n\n\t}\n\n\t// Uniforms (refresh uniforms objects)\n\n\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.color ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t}\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\tif ( material.specularMap ) {\n\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\n\t\t}\n\n\t\tif ( material.envMap ) {\n\n\t\t\tuniforms.envMap.value = material.envMap;\n\n\t\t\t// don't flip CubeTexture envMaps, flip everything else:\n\t\t\t// WebGLRenderTargetCube will be flipped for backwards compatibility\n\t\t\t// WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture\n\t\t\t// this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future\n\t\t\tuniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t\tuniforms.maxMipLevel.value = properties.get( material.envMap ).__maxMipLevel;\n\n\t\t}\n\n\t\tif ( material.lightMap ) {\n\n\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t}\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. specular map\n\t\t// 3. normal map\n\t\t// 4. bump map\n\t\t// 5. alpha map\n\t\t// 6. emissive map\n\n\t\tvar uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.specularMap ) {\n\n\t\t\tuvScaleMap = material.specularMap;\n\n\t\t} else if ( material.displacementMap ) {\n\n\t\t\tuvScaleMap = material.displacementMap;\n\n\t\t} else if ( material.normalMap ) {\n\n\t\t\tuvScaleMap = material.normalMap;\n\n\t\t} else if ( material.bumpMap ) {\n\n\t\t\tuvScaleMap = material.bumpMap;\n\n\t\t} else if ( material.roughnessMap ) {\n\n\t\t\tuvScaleMap = material.roughnessMap;\n\n\t\t} else if ( material.metalnessMap ) {\n\n\t\t\tuvScaleMap = material.metalnessMap;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t} else if ( material.emissiveMap ) {\n\n\t\t\tuvScaleMap = material.emissiveMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\t// backwards compatibility\n\t\t\tif ( uvScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\tuvScaleMap = uvScaleMap.texture;\n\n\t\t\t}\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\tuniforms.diffuse.value = material.color;\n\t\tuniforms.opacity.value = material.opacity;\n\n\t}\n\n\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\tuniforms.dashSize.value = material.dashSize;\n\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\tuniforms.scale.value = material.scale;\n\n\t}\n\n\tfunction refreshUniformsPoints( uniforms, material ) {\n\n\t\tuniforms.diffuse.value = material.color;\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.size.value = material.size * _pixelRatio;\n\t\tuniforms.scale.value = _height * 0.5;\n\n\t\tuniforms.map.value = material.map;\n\n\t\tif ( material.map !== null ) {\n\n\t\t\tif ( material.map.matrixAutoUpdate === true ) {\n\n\t\t\t\tmaterial.map.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( material.map.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsFog( uniforms, fog ) {\n\n\t\tuniforms.fogColor.value = fog.color;\n\n\t\tif ( fog.isFog ) {\n\n\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLambert( uniforms, material ) {\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\tuniforms.specular.value = material.specular;\n\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\trefreshUniformsPhong( uniforms, material );\n\n\t\tif ( material.gradientMap ) {\n\n\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\tuniforms.roughness.value = material.roughness;\n\t\tuniforms.metalness.value = material.metalness;\n\n\t\tif ( material.roughnessMap ) {\n\n\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t}\n\n\t\tif ( material.metalnessMap ) {\n\n\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t}\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tif ( material.envMap ) {\n\n\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhysical( uniforms, material ) {\n\n\t\tuniforms.clearCoat.value = material.clearCoat;\n\t\tuniforms.clearCoatRoughness.value = material.clearCoatRoughness;\n\n\t\trefreshUniformsStandard( uniforms, material );\n\n\t}\n\n\tfunction refreshUniformsDepth( uniforms, material ) {\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDistance( uniforms, material ) {\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tuniforms.referencePosition.value.copy( material.referencePosition );\n\t\tuniforms.nearDistance.value = material.nearDistance;\n\t\tuniforms.farDistance.value = material.farDistance;\n\n\t}\n\n\tfunction refreshUniformsNormal( uniforms, material ) {\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\tuniforms.ambientLightColor.needsUpdate = value;\n\n\t\tuniforms.directionalLights.needsUpdate = value;\n\t\tuniforms.pointLights.needsUpdate = value;\n\t\tuniforms.spotLights.needsUpdate = value;\n\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t}\n\n\t// Textures\n\n\tfunction allocTextureUnit() {\n\n\t\tvar textureUnit = _usedTextureUnits;\n\n\t\tif ( textureUnit >= capabilities.maxTextures ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );\n\n\t\t}\n\n\t\t_usedTextureUnits += 1;\n\n\t\treturn textureUnit;\n\n\t}\n\n\tthis.allocTextureUnit = allocTextureUnit;\n\n\t// this.setTexture2D = setTexture2D;\n\tthis.setTexture2D = ( function () {\n\n\t\tvar warned = false;\n\n\t\t// backwards compatibility: peel texture.texture\n\t\treturn function setTexture2D( texture, slot ) {\n\n\t\t\tif ( texture && texture.isWebGLRenderTarget ) {\n\n\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\twarned = true;\n\n\t\t\t\t}\n\n\t\t\t\ttexture = texture.texture;\n\n\t\t\t}\n\n\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t};\n\n\t}() );\n\n\tthis.setTexture = ( function () {\n\n\t\tvar warned = false;\n\n\t\treturn function setTexture( texture, slot ) {\n\n\t\t\tif ( ! warned ) {\n\n\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead.\" );\n\t\t\t\twarned = true;\n\n\t\t\t}\n\n\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t};\n\n\t}() );\n\n\tthis.setTextureCube = ( function () {\n\n\t\tvar warned = false;\n\n\t\treturn function setTextureCube( texture, slot ) {\n\n\t\t\t// backwards compatibility: peel texture.texture\n\t\t\tif ( texture && texture.isWebGLRenderTargetCube ) {\n\n\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\twarned = true;\n\n\t\t\t\t}\n\n\t\t\t\ttexture = texture.texture;\n\n\t\t\t}\n\n\t\t\t// currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture\n\t\t\t// TODO: unify these code paths\n\t\t\tif ( ( texture && texture.isCubeTexture ) ||\n\t\t\t\t( Array.isArray( texture.image ) && texture.image.length === 6 ) ) {\n\n\t\t\t\t// CompressedTexture can have Array in image :/\n\n\t\t\t\t// this function alone should take care of cube textures\n\t\t\t\ttextures.setTextureCube( texture, slot );\n\n\t\t\t} else {\n\n\t\t\t\t// assumed: texture property of THREE.WebGLRenderTargetCube\n\n\t\t\t\ttextures.setTextureCubeDynamic( texture, slot );\n\n\t\t\t}\n\n\t\t};\n\n\t}() );\n\n\tthis.getRenderTarget = function () {\n\n\t\treturn _currentRenderTarget;\n\n\t};\n\n\tthis.setRenderTarget = function ( renderTarget ) {\n\n\t\t_currentRenderTarget = renderTarget;\n\n\t\tif ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) {\n\n\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t}\n\n\t\tvar framebuffer = null;\n\t\tvar isCube = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tvar __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( renderTarget.isWebGLRenderTargetCube ) {\n\n\t\t\t\tframebuffer = __webglFramebuffer[ renderTarget.activeCubeFace ];\n\t\t\t\tisCube = true;\n\n\t\t\t} else {\n\n\t\t\t\tframebuffer = __webglFramebuffer;\n\n\t\t\t}\n\n\t\t\t_currentViewport.copy( renderTarget.viewport );\n\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t} else {\n\n\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio );\n\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio );\n\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t}\n\n\t\tif ( _currentFramebuffer !== framebuffer ) {\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t_currentFramebuffer = framebuffer;\n\n\t\t}\n\n\t\tstate.viewport( _currentViewport );\n\t\tstate.scissor( _currentScissor );\n\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\tif ( isCube ) {\n\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel );\n\n\t\t}\n\n\t};\n\n\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) {\n\n\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tvar framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\tif ( framebuffer ) {\n\n\t\t\tvar restore = false;\n\n\t\t\tif ( framebuffer !== _currentFramebuffer ) {\n\n\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\trestore = true;\n\n\t\t\t}\n\n\t\t\ttry {\n\n\t\t\t\tvar texture = renderTarget.texture;\n\t\t\t\tvar textureFormat = texture.format;\n\t\t\t\tvar textureType = texture.type;\n\n\t\t\t\tif ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513)\n\t\t\t\t\t! ( textureType === FloatType && ( extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox\n\t\t\t\t\t! ( textureType === HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) {\n\n\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' );\n\n\t\t\t\t}\n\n\t\t\t} finally {\n\n\t\t\t\tif ( restore ) {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.copyFramebufferToTexture = function ( position, texture, level ) {\n\n\t\tvar width = texture.image.width;\n\t\tvar height = texture.image.height;\n\t\tvar glFormat = utils.convert( texture.format );\n\n\t\tthis.setTexture2D( texture, 0 );\n\n\t\t_gl.copyTexImage2D( _gl.TEXTURE_2D, level || 0, glFormat, position.x, position.y, width, height, 0 );\n\n\t};\n\n\tthis.copyTextureToTexture = function ( position, srcTexture, dstTexture, level ) {\n\n\t\tvar width = srcTexture.image.width;\n\t\tvar height = srcTexture.image.height;\n\t\tvar glFormat = utils.convert( dstTexture.format );\n\t\tvar glType = utils.convert( dstTexture.type );\n\t\tvar pixels = srcTexture.isDataTexture ? srcTexture.image.data : srcTexture.image;\n\n\t\tthis.setTexture2D( dstTexture, 0 );\n\n\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, level || 0, position.x, position.y, width, height, glFormat, glType, pixels );\n\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction FogExp2( color, density ) {\n\n\tthis.name = '';\n\n\tthis.color = new Color( color );\n\tthis.density = ( density !== undefined ) ? density : 0.00025;\n\n}\n\nFogExp2.prototype.isFogExp2 = true;\n\nFogExp2.prototype.clone = function () {\n\n\treturn new FogExp2( this.color.getHex(), this.density );\n\n};\n\nFogExp2.prototype.toJSON = function ( /* meta */ ) {\n\n\treturn {\n\t\ttype: 'FogExp2',\n\t\tcolor: this.color.getHex(),\n\t\tdensity: this.density\n\t};\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction Fog( color, near, far ) {\n\n\tthis.name = '';\n\n\tthis.color = new Color( color );\n\n\tthis.near = ( near !== undefined ) ? near : 1;\n\tthis.far = ( far !== undefined ) ? far : 1000;\n\n}\n\nFog.prototype.isFog = true;\n\nFog.prototype.clone = function () {\n\n\treturn new Fog( this.color.getHex(), this.near, this.far );\n\n};\n\nFog.prototype.toJSON = function ( /* meta */ ) {\n\n\treturn {\n\t\ttype: 'Fog',\n\t\tcolor: this.color.getHex(),\n\t\tnear: this.near,\n\t\tfar: this.far\n\t};\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction Scene() {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Scene';\n\n\tthis.background = null;\n\tthis.fog = null;\n\tthis.overrideMaterial = null;\n\n\tthis.autoUpdate = true; // checked by the renderer\n\n}\n\nScene.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Scene,\n\n\tcopy: function ( source, recursive ) {\n\n\t\tObject3D.prototype.copy.call( this, source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tif ( this.background !== null ) data.object.background = this.background.toJSON( meta );\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\treturn data;\n\n\t}\n\n} );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n *\n * parameters = {\n * color: ,\n * opacity: ,\n * map: new THREE.Texture( ),\n *\n *\tuvOffset: new THREE.Vector2(),\n *\tuvScale: new THREE.Vector2()\n * }\n */\n\nfunction SpriteMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'SpriteMaterial';\n\n\tthis.color = new Color( 0xffffff );\n\tthis.map = null;\n\n\tthis.rotation = 0;\n\n\tthis.fog = false;\n\tthis.lights = false;\n\n\tthis.setValues( parameters );\n\n}\n\nSpriteMaterial.prototype = Object.create( Material.prototype );\nSpriteMaterial.prototype.constructor = SpriteMaterial;\nSpriteMaterial.prototype.isSpriteMaterial = true;\n\nSpriteMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\tthis.map = source.map;\n\n\tthis.rotation = source.rotation;\n\n\treturn this;\n\n};\n\n/**\n * @author mikael emtinger / http://gomo.se/\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction Sprite( material ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Sprite';\n\n\tthis.material = ( material !== undefined ) ? material : new SpriteMaterial();\n\n\tthis.center = new Vector2( 0.5, 0.5 );\n\n}\n\nSprite.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Sprite,\n\n\tisSprite: true,\n\n\traycast: ( function () {\n\n\t\tvar intersectPoint = new Vector3();\n\t\tvar worldPosition = new Vector3();\n\t\tvar worldScale = new Vector3();\n\n\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\tworldPosition.setFromMatrixPosition( this.matrixWorld );\n\t\t\traycaster.ray.closestPointToPoint( worldPosition, intersectPoint );\n\n\t\t\tworldScale.setFromMatrixScale( this.matrixWorld );\n\t\t\tvar guessSizeSq = worldScale.x * worldScale.y / 4;\n\n\t\t\tif ( worldPosition.distanceToSquared( intersectPoint ) > guessSizeSq ) return;\n\n\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\t\tintersects.push( {\n\n\t\t\t\tdistance: distance,\n\t\t\t\tpoint: intersectPoint.clone(),\n\t\t\t\tface: null,\n\t\t\t\tobject: this\n\n\t\t\t} );\n\n\t\t};\n\n\t}() ),\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.material ).copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tif ( source.center !== undefined ) this.center.copy( source.center );\n\n\t\treturn this;\n\n\t}\n\n\n} );\n\n/**\n * @author mikael emtinger / http://gomo.se/\n * @author alteredq / http://alteredqualia.com/\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction LOD() {\n\n\tObject3D.call( this );\n\n\tthis.type = 'LOD';\n\n\tObject.defineProperties( this, {\n\t\tlevels: {\n\t\t\tenumerable: true,\n\t\t\tvalue: []\n\t\t}\n\t} );\n\n}\n\nLOD.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: LOD,\n\n\tcopy: function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source, false );\n\n\t\tvar levels = source.levels;\n\n\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tvar level = levels[ i ];\n\n\t\t\tthis.addLevel( level.object.clone(), level.distance );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\taddLevel: function ( object, distance ) {\n\n\t\tif ( distance === undefined ) distance = 0;\n\n\t\tdistance = Math.abs( distance );\n\n\t\tvar levels = this.levels;\n\n\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlevels.splice( l, 0, { distance: distance, object: object } );\n\n\t\tthis.add( object );\n\n\t},\n\n\tgetObjectForDistance: function ( distance ) {\n\n\t\tvar levels = this.levels;\n\n\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\tif ( distance < levels[ i ].distance ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn levels[ i - 1 ].object;\n\n\t},\n\n\traycast: ( function () {\n\n\t\tvar matrixPosition = new Vector3();\n\n\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tvar distance = raycaster.ray.origin.distanceTo( matrixPosition );\n\n\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t};\n\n\t}() ),\n\n\tupdate: function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\n\t\treturn function update( camera ) {\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tif ( levels.length > 1 ) {\n\n\t\t\t\tv1.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\tv2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distance = v1.distanceTo( v2 );\n\n\t\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\t\tif ( distance >= levels[ i ].distance ) {\n\n\t\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t}(),\n\n\ttoJSON: function ( meta ) {\n\n\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tdata.object.levels = [];\n\n\t\tvar levels = this.levels;\n\n\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tvar level = levels[ i ];\n\n\t\t\tdata.object.levels.push( {\n\t\t\t\tobject: level.object.uuid,\n\t\t\t\tdistance: level.distance\n\t\t\t} );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n} );\n\n/**\n * @author mikael emtinger / http://gomo.se/\n * @author alteredq / http://alteredqualia.com/\n * @author michael guerrero / http://realitymeltdown.com\n * @author ikerr / http://verold.com\n */\n\nfunction Skeleton( bones, boneInverses ) {\n\n\t// copy the bone array\n\n\tbones = bones || [];\n\n\tthis.bones = bones.slice( 0 );\n\tthis.boneMatrices = new Float32Array( this.bones.length * 16 );\n\n\t// use the supplied bone inverses or calculate the inverses\n\n\tif ( boneInverses === undefined ) {\n\n\t\tthis.calculateInverses();\n\n\t} else {\n\n\t\tif ( this.bones.length === boneInverses.length ) {\n\n\t\t\tthis.boneInverses = boneInverses.slice( 0 );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.Skeleton boneInverses is the wrong length.' );\n\n\t\t\tthis.boneInverses = [];\n\n\t\t\tfor ( var i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\t\tthis.boneInverses.push( new Matrix4() );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nObject.assign( Skeleton.prototype, {\n\n\tcalculateInverses: function () {\n\n\t\tthis.boneInverses = [];\n\n\t\tfor ( var i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tvar inverse = new Matrix4();\n\n\t\t\tif ( this.bones[ i ] ) {\n\n\t\t\t\tinverse.getInverse( this.bones[ i ].matrixWorld );\n\n\t\t\t}\n\n\t\t\tthis.boneInverses.push( inverse );\n\n\t\t}\n\n\t},\n\n\tpose: function () {\n\n\t\tvar bone, i, il;\n\n\t\t// recover the bind-time world matrices\n\n\t\tfor ( i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tbone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tbone.matrixWorld.getInverse( this.boneInverses[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// compute the local matrices, positions, rotations and scales\n\n\t\tfor ( i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tbone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\tbone.matrix.getInverse( bone.parent.matrixWorld );\n\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\tupdate: ( function () {\n\n\t\tvar offsetMatrix = new Matrix4();\n\t\tvar identityMatrix = new Matrix4();\n\n\t\treturn function update() {\n\n\t\t\tvar bones = this.bones;\n\t\t\tvar boneInverses = this.boneInverses;\n\t\t\tvar boneMatrices = this.boneMatrices;\n\t\t\tvar boneTexture = this.boneTexture;\n\n\t\t\t// flatten bone matrices to array\n\n\t\t\tfor ( var i = 0, il = bones.length; i < il; i ++ ) {\n\n\t\t\t\t// compute the offset between the current and the original transform\n\n\t\t\t\tvar matrix = bones[ i ] ? bones[ i ].matrixWorld : identityMatrix;\n\n\t\t\t\toffsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] );\n\t\t\t\toffsetMatrix.toArray( boneMatrices, i * 16 );\n\n\t\t\t}\n\n\t\t\tif ( boneTexture !== undefined ) {\n\n\t\t\t\tboneTexture.needsUpdate = true;\n\n\t\t\t}\n\n\t\t};\n\n\t} )(),\n\n\tclone: function () {\n\n\t\treturn new Skeleton( this.bones, this.boneInverses );\n\n\t},\n\n\tgetBoneByName: function ( name ) {\n\n\t\tfor ( var i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tvar bone = this.bones[ i ];\n\n\t\t\tif ( bone.name === name ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n} );\n\n/**\n * @author mikael emtinger / http://gomo.se/\n * @author alteredq / http://alteredqualia.com/\n * @author ikerr / http://verold.com\n */\n\nfunction Bone() {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Bone';\n\n}\n\nBone.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Bone,\n\n\tisBone: true\n\n} );\n\n/**\n * @author mikael emtinger / http://gomo.se/\n * @author alteredq / http://alteredqualia.com/\n * @author ikerr / http://verold.com\n */\n\nfunction SkinnedMesh( geometry, material ) {\n\n\tMesh.call( this, geometry, material );\n\n\tthis.type = 'SkinnedMesh';\n\n\tthis.bindMode = 'attached';\n\tthis.bindMatrix = new Matrix4();\n\tthis.bindMatrixInverse = new Matrix4();\n\n\tvar bones = this.initBones();\n\tvar skeleton = new Skeleton( bones );\n\n\tthis.bind( skeleton, this.matrixWorld );\n\n\tthis.normalizeSkinWeights();\n\n}\n\nSkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), {\n\n\tconstructor: SkinnedMesh,\n\n\tisSkinnedMesh: true,\n\n\tinitBones: function () {\n\n\t\tvar bones = [], bone, gbone;\n\t\tvar i, il;\n\n\t\tif ( this.geometry && this.geometry.bones !== undefined ) {\n\n\t\t\t// first, create array of 'Bone' objects from geometry data\n\n\t\t\tfor ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) {\n\n\t\t\t\tgbone = this.geometry.bones[ i ];\n\n\t\t\t\t// create new 'Bone' object\n\n\t\t\t\tbone = new Bone();\n\t\t\t\tbones.push( bone );\n\n\t\t\t\t// apply values\n\n\t\t\t\tbone.name = gbone.name;\n\t\t\t\tbone.position.fromArray( gbone.pos );\n\t\t\t\tbone.quaternion.fromArray( gbone.rotq );\n\t\t\t\tif ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl );\n\n\t\t\t}\n\n\t\t\t// second, create bone hierarchy\n\n\t\t\tfor ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) {\n\n\t\t\t\tgbone = this.geometry.bones[ i ];\n\n\t\t\t\tif ( ( gbone.parent !== - 1 ) && ( gbone.parent !== null ) && ( bones[ gbone.parent ] !== undefined ) ) {\n\n\t\t\t\t\t// subsequent bones in the hierarchy\n\n\t\t\t\t\tbones[ gbone.parent ].add( bones[ i ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// topmost bone, immediate child of the skinned mesh\n\n\t\t\t\t\tthis.add( bones[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// now the bones are part of the scene graph and children of the skinned mesh.\n\t\t// let's update the corresponding matrices\n\n\t\tthis.updateMatrixWorld( true );\n\n\t\treturn bones;\n\n\t},\n\n\tbind: function ( skeleton, bindMatrix ) {\n\n\t\tthis.skeleton = skeleton;\n\n\t\tif ( bindMatrix === undefined ) {\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t}\n\n\t\tthis.bindMatrix.copy( bindMatrix );\n\t\tthis.bindMatrixInverse.getInverse( bindMatrix );\n\n\t},\n\n\tpose: function () {\n\n\t\tthis.skeleton.pose();\n\n\t},\n\n\tnormalizeSkinWeights: function () {\n\n\t\tvar scale, i;\n\n\t\tif ( this.geometry && this.geometry.isGeometry ) {\n\n\t\t\tfor ( i = 0; i < this.geometry.skinWeights.length; i ++ ) {\n\n\t\t\t\tvar sw = this.geometry.skinWeights[ i ];\n\n\t\t\t\tscale = 1.0 / sw.manhattanLength();\n\n\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\tsw.multiplyScalar( scale );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsw.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( this.geometry && this.geometry.isBufferGeometry ) {\n\n\t\t\tvar vec = new Vector4();\n\n\t\t\tvar skinWeight = this.geometry.attributes.skinWeight;\n\n\t\t\tfor ( i = 0; i < skinWeight.count; i ++ ) {\n\n\t\t\t\tvec.x = skinWeight.getX( i );\n\t\t\t\tvec.y = skinWeight.getY( i );\n\t\t\t\tvec.z = skinWeight.getZ( i );\n\t\t\t\tvec.w = skinWeight.getW( i );\n\n\t\t\t\tscale = 1.0 / vec.manhattanLength();\n\n\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\tvec.multiplyScalar( scale );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvec.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t}\n\n\t\t\t\tskinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\tupdateMatrixWorld: function ( force ) {\n\n\t\tMesh.prototype.updateMatrixWorld.call( this, force );\n\n\t\tif ( this.bindMode === 'attached' ) {\n\n\t\t\tthis.bindMatrixInverse.getInverse( this.matrixWorld );\n\n\t\t} else if ( this.bindMode === 'detached' ) {\n\n\t\t\tthis.bindMatrixInverse.getInverse( this.bindMatrix );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode );\n\n\t\t}\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n *\n * parameters = {\n * color: ,\n * opacity: ,\n *\n * linewidth: ,\n * linecap: \"round\",\n * linejoin: \"round\"\n * }\n */\n\nfunction LineBasicMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'LineBasicMaterial';\n\n\tthis.color = new Color( 0xffffff );\n\n\tthis.linewidth = 1;\n\tthis.linecap = 'round';\n\tthis.linejoin = 'round';\n\n\tthis.lights = false;\n\n\tthis.setValues( parameters );\n\n}\n\nLineBasicMaterial.prototype = Object.create( Material.prototype );\nLineBasicMaterial.prototype.constructor = LineBasicMaterial;\n\nLineBasicMaterial.prototype.isLineBasicMaterial = true;\n\nLineBasicMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\n\tthis.linewidth = source.linewidth;\n\tthis.linecap = source.linecap;\n\tthis.linejoin = source.linejoin;\n\n\treturn this;\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction Line( geometry, material, mode ) {\n\n\tif ( mode === 1 ) {\n\n\t\tconsole.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' );\n\t\treturn new LineSegments( geometry, material );\n\n\t}\n\n\tObject3D.call( this );\n\n\tthis.type = 'Line';\n\n\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\tthis.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } );\n\n}\n\nLine.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Line,\n\n\tisLine: true,\n\n\tcomputeLineDistances: ( function () {\n\n\t\tvar start = new Vector3();\n\t\tvar end = new Vector3();\n\n\t\treturn function computeLineDistances() {\n\n\t\t\tvar geometry = this.geometry;\n\n\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t// we assume non-indexed geometry\n\n\t\t\t\tif ( geometry.index === null ) {\n\n\t\t\t\t\tvar positionAttribute = geometry.attributes.position;\n\t\t\t\t\tvar lineDistances = [ 0 ];\n\n\t\t\t\t\tfor ( var i = 1, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t\t\tstart.fromBufferAttribute( positionAttribute, i - 1 );\n\t\t\t\t\t\tend.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\t\t\tlineDistances[ i ] = lineDistances[ i - 1 ];\n\t\t\t\t\t\tlineDistances[ i ] += start.distanceTo( end );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.addAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t\t\t}\n\n\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\tvar lineDistances = geometry.lineDistances;\n\n\t\t\t\tlineDistances[ 0 ] = 0;\n\n\t\t\t\tfor ( var i = 1, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\tlineDistances[ i ] = lineDistances[ i - 1 ];\n\t\t\t\t\tlineDistances[ i ] += vertices[ i - 1 ].distanceTo( vertices[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() ),\n\n\traycast: ( function () {\n\n\t\tvar inverseMatrix = new Matrix4();\n\t\tvar ray = new Ray();\n\t\tvar sphere = new Sphere();\n\n\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\tvar precision = raycaster.linePrecision;\n\t\t\tvar precisionSq = precision * precision;\n\n\t\t\tvar geometry = this.geometry;\n\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t//\n\n\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\tvar vStart = new Vector3();\n\t\t\tvar vEnd = new Vector3();\n\t\t\tvar interSegment = new Vector3();\n\t\t\tvar interRay = new Vector3();\n\t\t\tvar step = ( this && this.isLineSegments ) ? 2 : 1;\n\n\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\tvar index = geometry.index;\n\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\tfor ( var i = 0, l = indices.length - 1; i < l; i += step ) {\n\n\t\t\t\t\t\tvar a = indices[ i ];\n\t\t\t\t\t\tvar b = indices[ i + 1 ];\n\n\t\t\t\t\t\tvStart.fromArray( positions, a * 3 );\n\t\t\t\t\t\tvEnd.fromArray( positions, b * 3 );\n\n\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) {\n\n\t\t\t\t\t\tvStart.fromArray( positions, 3 * i );\n\t\t\t\t\t\tvEnd.fromArray( positions, 3 * i + 3 );\n\n\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\tvar nbVertices = vertices.length;\n\n\t\t\t\tfor ( var i = 0; i < nbVertices - 1; i += step ) {\n\n\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment );\n\n\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\tface: null,\n\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t}() ),\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction LineSegments( geometry, material ) {\n\n\tLine.call( this, geometry, material );\n\n\tthis.type = 'LineSegments';\n\n}\n\nLineSegments.prototype = Object.assign( Object.create( Line.prototype ), {\n\n\tconstructor: LineSegments,\n\n\tisLineSegments: true,\n\n\tcomputeLineDistances: ( function () {\n\n\t\tvar start = new Vector3();\n\t\tvar end = new Vector3();\n\n\t\treturn function computeLineDistances() {\n\n\t\t\tvar geometry = this.geometry;\n\n\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t// we assume non-indexed geometry\n\n\t\t\t\tif ( geometry.index === null ) {\n\n\t\t\t\t\tvar positionAttribute = geometry.attributes.position;\n\t\t\t\t\tvar lineDistances = [];\n\n\t\t\t\t\tfor ( var i = 0, l = positionAttribute.count; i < l; i += 2 ) {\n\n\t\t\t\t\t\tstart.fromBufferAttribute( positionAttribute, i );\n\t\t\t\t\t\tend.fromBufferAttribute( positionAttribute, i + 1 );\n\n\t\t\t\t\t\tlineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];\n\t\t\t\t\t\tlineDistances[ i + 1 ] = lineDistances[ i ] + start.distanceTo( end );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.addAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t\t\t}\n\n\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\tvar lineDistances = geometry.lineDistances;\n\n\t\t\t\tfor ( var i = 0, l = vertices.length; i < l; i += 2 ) {\n\n\t\t\t\t\tstart.copy( vertices[ i ] );\n\t\t\t\t\tend.copy( vertices[ i + 1 ] );\n\n\t\t\t\t\tlineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];\n\t\t\t\t\tlineDistances[ i + 1 ] = lineDistances[ i ] + start.distanceTo( end );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() )\n\n} );\n\n/**\n * @author mgreter / http://github.com/mgreter\n */\n\nfunction LineLoop( geometry, material ) {\n\n\tLine.call( this, geometry, material );\n\n\tthis.type = 'LineLoop';\n\n}\n\nLineLoop.prototype = Object.assign( Object.create( Line.prototype ), {\n\n\tconstructor: LineLoop,\n\n\tisLineLoop: true,\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n *\n * parameters = {\n * color: ,\n * opacity: ,\n * map: new THREE.Texture( ),\n *\n * size: ,\n * sizeAttenuation: \n * }\n */\n\nfunction PointsMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'PointsMaterial';\n\n\tthis.color = new Color( 0xffffff );\n\n\tthis.map = null;\n\n\tthis.size = 1;\n\tthis.sizeAttenuation = true;\n\n\tthis.lights = false;\n\n\tthis.setValues( parameters );\n\n}\n\nPointsMaterial.prototype = Object.create( Material.prototype );\nPointsMaterial.prototype.constructor = PointsMaterial;\n\nPointsMaterial.prototype.isPointsMaterial = true;\n\nPointsMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\n\tthis.map = source.map;\n\n\tthis.size = source.size;\n\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\treturn this;\n\n};\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction Points( geometry, material ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Points';\n\n\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\tthis.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } );\n\n}\n\nPoints.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Points,\n\n\tisPoints: true,\n\n\traycast: ( function () {\n\n\t\tvar inverseMatrix = new Matrix4();\n\t\tvar ray = new Ray();\n\t\tvar sphere = new Sphere();\n\n\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\tvar object = this;\n\t\t\tvar geometry = this.geometry;\n\t\t\tvar matrixWorld = this.matrixWorld;\n\t\t\tvar threshold = raycaster.params.Points.threshold;\n\n\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\tsphere.applyMatrix4( matrixWorld );\n\t\t\tsphere.radius += threshold;\n\n\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t//\n\n\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\tvar localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\t\tvar localThresholdSq = localThreshold * localThreshold;\n\t\t\tvar position = new Vector3();\n\t\t\tvar intersectPoint = new Vector3();\n\n\t\t\tfunction testPoint( point, index ) {\n\n\t\t\t\tvar rayPointDistanceSq = ray.distanceSqToPoint( point );\n\n\t\t\t\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\t\t\t\tray.closestPointToPoint( point, intersectPoint );\n\t\t\t\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\t\t\t\tpoint: intersectPoint.clone(),\n\t\t\t\t\t\tindex: index,\n\t\t\t\t\t\tface: null,\n\t\t\t\t\t\tobject: object\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\tvar index = geometry.index;\n\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\tfor ( var i = 0, il = indices.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tvar a = indices[ i ];\n\n\t\t\t\t\t\tposition.fromArray( positions, a * 3 );\n\n\t\t\t\t\t\ttestPoint( position, a );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( var i = 0, l = positions.length / 3; i < l; i ++ ) {\n\n\t\t\t\t\t\tposition.fromArray( positions, i * 3 );\n\n\t\t\t\t\t\ttestPoint( position, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar vertices = geometry.vertices;\n\n\t\t\t\tfor ( var i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\ttestPoint( vertices[ i ], i );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t}() ),\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction Group() {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Group';\n\n}\n\nGroup.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Group,\n\n\tisGroup: true\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\tTexture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\tthis.generateMipmaps = false;\n\n}\n\nVideoTexture.prototype = Object.assign( Object.create( Texture.prototype ), {\n\n\tconstructor: VideoTexture,\n\n\tisVideoTexture: true,\n\n\tupdate: function () {\n\n\t\tvar video = this.image;\n\n\t\tif ( video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n} );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\tthis.image = { width: width, height: height };\n\tthis.mipmaps = mipmaps;\n\n\t// no flipping for cube textures\n\t// (also flipping doesn't work for compressed textures )\n\n\tthis.flipY = false;\n\n\t// can't generate mipmaps for compressed textures\n\t// mips must be embedded in DDS files\n\n\tthis.generateMipmaps = false;\n\n}\n\nCompressedTexture.prototype = Object.create( Texture.prototype );\nCompressedTexture.prototype.constructor = CompressedTexture;\n\nCompressedTexture.prototype.isCompressedTexture = true;\n\n/**\n * @author Matt DesLauriers / @mattdesl\n * @author atix / arthursilber.de\n */\n\nfunction DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) {\n\n\tformat = format !== undefined ? format : DepthFormat;\n\n\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' );\n\n\t}\n\n\tif ( type === undefined && format === DepthFormat ) type = UnsignedShortType;\n\tif ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type;\n\n\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\tthis.image = { width: width, height: height };\n\n\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\tthis.flipY = false;\n\tthis.generateMipmaps\t= false;\n\n}\n\nDepthTexture.prototype = Object.create( Texture.prototype );\nDepthTexture.prototype.constructor = DepthTexture;\nDepthTexture.prototype.isDepthTexture = true;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author Mugen87 / https://github.com/Mugen87\n */\n\nfunction WireframeGeometry( geometry ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'WireframeGeometry';\n\n\t// buffer\n\n\tvar vertices = [];\n\n\t// helper variables\n\n\tvar i, j, l, o, ol;\n\tvar edge = [ 0, 0 ], edges = {}, e, edge1, edge2;\n\tvar key, keys = [ 'a', 'b', 'c' ];\n\tvar vertex;\n\n\t// different logic for Geometry and BufferGeometry\n\n\tif ( geometry && geometry.isGeometry ) {\n\n\t\t// create a data structure that contains all edges without duplicates\n\n\t\tvar faces = geometry.faces;\n\n\t\tfor ( i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\n\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\tedge1 = face[ keys[ j ] ];\n\t\t\t\tedge2 = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\tedge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates\n\t\t\t\tedge[ 1 ] = Math.max( edge1, edge2 );\n\n\t\t\t\tkey = edge[ 0 ] + ',' + edge[ 1 ];\n\n\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate vertices\n\n\t\tfor ( key in edges ) {\n\n\t\t\te = edges[ key ];\n\n\t\t\tvertex = geometry.vertices[ e.index1 ];\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\tvertex = geometry.vertices[ e.index2 ];\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t} else if ( geometry && geometry.isBufferGeometry ) {\n\n\t\tvar position, indices, groups;\n\t\tvar group, start, count;\n\t\tvar index1, index2;\n\n\t\tvertex = new Vector3();\n\n\t\tif ( geometry.index !== null ) {\n\n\t\t\t// indexed BufferGeometry\n\n\t\t\tposition = geometry.attributes.position;\n\t\t\tindices = geometry.index;\n\t\t\tgroups = geometry.groups;\n\n\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\tgroups = [ { start: 0, count: indices.count, materialIndex: 0 } ];\n\n\t\t\t}\n\n\t\t\t// create a data structure that contains all eges without duplicates\n\n\t\t\tfor ( o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\tgroup = groups[ o ];\n\n\t\t\t\tstart = group.start;\n\t\t\t\tcount = group.count;\n\n\t\t\t\tfor ( i = start, l = ( start + count ); i < l; i += 3 ) {\n\n\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\tedge1 = indices.getX( i + j );\n\t\t\t\t\t\tedge2 = indices.getX( i + ( j + 1 ) % 3 );\n\t\t\t\t\t\tedge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates\n\t\t\t\t\t\tedge[ 1 ] = Math.max( edge1, edge2 );\n\n\t\t\t\t\t\tkey = edge[ 0 ] + ',' + edge[ 1 ];\n\n\t\t\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// generate vertices\n\n\t\t\tfor ( key in edges ) {\n\n\t\t\t\te = edges[ key ];\n\n\t\t\t\tvertex.fromBufferAttribute( position, e.index1 );\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\tvertex.fromBufferAttribute( position, e.index2 );\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// non-indexed BufferGeometry\n\n\t\t\tposition = geometry.attributes.position;\n\n\t\t\tfor ( i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\t\t\t\t// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)\n\n\t\t\t\t\tindex1 = 3 * i + j;\n\t\t\t\t\tvertex.fromBufferAttribute( position, index1 );\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\tindex2 = 3 * i + ( ( j + 1 ) % 3 );\n\t\t\t\t\tvertex.fromBufferAttribute( position, index2 );\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n}\n\nWireframeGeometry.prototype = Object.create( BufferGeometry.prototype );\nWireframeGeometry.prototype.constructor = WireframeGeometry;\n\n/**\n * @author zz85 / https://github.com/zz85\n * @author Mugen87 / https://github.com/Mugen87\n *\n * Parametric Surfaces Geometry\n * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n */\n\n// ParametricGeometry\n\nfunction ParametricGeometry( func, slices, stacks ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'ParametricGeometry';\n\n\tthis.parameters = {\n\t\tfunc: func,\n\t\tslices: slices,\n\t\tstacks: stacks\n\t};\n\n\tthis.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) );\n\tthis.mergeVertices();\n\n}\n\nParametricGeometry.prototype = Object.create( Geometry.prototype );\nParametricGeometry.prototype.constructor = ParametricGeometry;\n\n// ParametricBufferGeometry\n\nfunction ParametricBufferGeometry( func, slices, stacks ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'ParametricBufferGeometry';\n\n\tthis.parameters = {\n\t\tfunc: func,\n\t\tslices: slices,\n\t\tstacks: stacks\n\t};\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\tvar EPS = 0.00001;\n\n\tvar normal = new Vector3();\n\n\tvar p0 = new Vector3(), p1 = new Vector3();\n\tvar pu = new Vector3(), pv = new Vector3();\n\n\tvar i, j;\n\n\t// generate vertices, normals and uvs\n\n\tvar sliceCount = slices + 1;\n\n\tfor ( i = 0; i <= stacks; i ++ ) {\n\n\t\tvar v = i / stacks;\n\n\t\tfor ( j = 0; j <= slices; j ++ ) {\n\n\t\t\tvar u = j / slices;\n\n\t\t\t// vertex\n\n\t\t\tfunc( u, v, p0 );\n\t\t\tvertices.push( p0.x, p0.y, p0.z );\n\n\t\t\t// normal\n\n\t\t\t// approximate tangent vectors via finite differences\n\n\t\t\tif ( u - EPS >= 0 ) {\n\n\t\t\t\tfunc( u - EPS, v, p1 );\n\t\t\t\tpu.subVectors( p0, p1 );\n\n\t\t\t} else {\n\n\t\t\t\tfunc( u + EPS, v, p1 );\n\t\t\t\tpu.subVectors( p1, p0 );\n\n\t\t\t}\n\n\t\t\tif ( v - EPS >= 0 ) {\n\n\t\t\t\tfunc( u, v - EPS, p1 );\n\t\t\t\tpv.subVectors( p0, p1 );\n\n\t\t\t} else {\n\n\t\t\t\tfunc( u, v + EPS, p1 );\n\t\t\t\tpv.subVectors( p1, p0 );\n\n\t\t\t}\n\n\t\t\t// cross product of tangent vectors returns surface normal\n\n\t\t\tnormal.crossVectors( pu, pv ).normalize();\n\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t// uv\n\n\t\t\tuvs.push( u, v );\n\n\t\t}\n\n\t}\n\n\t// generate indices\n\n\tfor ( i = 0; i < stacks; i ++ ) {\n\n\t\tfor ( j = 0; j < slices; j ++ ) {\n\n\t\t\tvar a = i * sliceCount + j;\n\t\t\tvar b = i * sliceCount + j + 1;\n\t\t\tvar c = ( i + 1 ) * sliceCount + j + 1;\n\t\t\tvar d = ( i + 1 ) * sliceCount + j;\n\n\t\t\t// faces one and two\n\n\t\t\tindices.push( a, b, d );\n\t\t\tindices.push( b, c, d );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n}\n\nParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry;\n\n/**\n * @author clockworkgeek / https://github.com/clockworkgeek\n * @author timothypratley / https://github.com/timothypratley\n * @author WestLangley / http://github.com/WestLangley\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// PolyhedronGeometry\n\nfunction PolyhedronGeometry( vertices, indices, radius, detail ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'PolyhedronGeometry';\n\n\tthis.parameters = {\n\t\tvertices: vertices,\n\t\tindices: indices,\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n\tthis.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) );\n\tthis.mergeVertices();\n\n}\n\nPolyhedronGeometry.prototype = Object.create( Geometry.prototype );\nPolyhedronGeometry.prototype.constructor = PolyhedronGeometry;\n\n// PolyhedronBufferGeometry\n\nfunction PolyhedronBufferGeometry( vertices, indices, radius, detail ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'PolyhedronBufferGeometry';\n\n\tthis.parameters = {\n\t\tvertices: vertices,\n\t\tindices: indices,\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n\tradius = radius || 1;\n\tdetail = detail || 0;\n\n\t// default buffer data\n\n\tvar vertexBuffer = [];\n\tvar uvBuffer = [];\n\n\t// the subdivision creates the vertex buffer data\n\n\tsubdivide( detail );\n\n\t// all vertices should lie on a conceptual sphere with a given radius\n\n\tappplyRadius( radius );\n\n\t// finally, create the uv data\n\n\tgenerateUVs();\n\n\t// build non-indexed geometry\n\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\n\tif ( detail === 0 ) {\n\n\t\tthis.computeVertexNormals(); // flat normals\n\n\t} else {\n\n\t\tthis.normalizeNormals(); // smooth normals\n\n\t}\n\n\t// helper functions\n\n\tfunction subdivide( detail ) {\n\n\t\tvar a = new Vector3();\n\t\tvar b = new Vector3();\n\t\tvar c = new Vector3();\n\n\t\t// iterate over all faces and apply a subdivison with the given detail value\n\n\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t// get the vertices of the face\n\n\t\t\tgetVertexByIndex( indices[ i + 0 ], a );\n\t\t\tgetVertexByIndex( indices[ i + 1 ], b );\n\t\t\tgetVertexByIndex( indices[ i + 2 ], c );\n\n\t\t\t// perform subdivision\n\n\t\t\tsubdivideFace( a, b, c, detail );\n\n\t\t}\n\n\t}\n\n\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\tvar cols = Math.pow( 2, detail );\n\n\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\tvar v = [];\n\n\t\tvar i, j;\n\n\t\t// construct all of the vertices for this subdivision\n\n\t\tfor ( i = 0; i <= cols; i ++ ) {\n\n\t\t\tv[ i ] = [];\n\n\t\t\tvar aj = a.clone().lerp( c, i / cols );\n\t\t\tvar bj = b.clone().lerp( c, i / cols );\n\n\t\t\tvar rows = cols - i;\n\n\t\t\tfor ( j = 0; j <= rows; j ++ ) {\n\n\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// construct all of the faces\n\n\t\tfor ( i = 0; i < cols; i ++ ) {\n\n\t\t\tfor ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\tvar k = Math.floor( j / 2 );\n\n\t\t\t\tif ( j % 2 === 0 ) {\n\n\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\t\t\t\t\tpushVertex( v[ i ][ k ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\tpushVertex( v[ i + 1 ][ k + 1 ] );\n\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction appplyRadius( radius ) {\n\n\t\tvar vertex = new Vector3();\n\n\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\tfor ( var i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\tvertex.normalize().multiplyScalar( radius );\n\n\t\t\tvertexBuffer[ i + 0 ] = vertex.x;\n\t\t\tvertexBuffer[ i + 1 ] = vertex.y;\n\t\t\tvertexBuffer[ i + 2 ] = vertex.z;\n\n\t\t}\n\n\t}\n\n\tfunction generateUVs() {\n\n\t\tvar vertex = new Vector3();\n\n\t\tfor ( var i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\tvar u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\tvar v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t}\n\n\t\tcorrectUVs();\n\n\t\tcorrectSeam();\n\n\t}\n\n\tfunction correctSeam() {\n\n\t\t// handle case when face straddles the seam, see #3269\n\n\t\tfor ( var i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t// uv data of a single face\n\n\t\t\tvar x0 = uvBuffer[ i + 0 ];\n\t\t\tvar x1 = uvBuffer[ i + 2 ];\n\t\t\tvar x2 = uvBuffer[ i + 4 ];\n\n\t\t\tvar max = Math.max( x0, x1, x2 );\n\t\t\tvar min = Math.min( x0, x1, x2 );\n\n\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\n\t\t\t\tif ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;\n\t\t\t\tif ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;\n\t\t\t\tif ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction pushVertex( vertex ) {\n\n\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t}\n\n\tfunction getVertexByIndex( index, vertex ) {\n\n\t\tvar stride = index * 3;\n\n\t\tvertex.x = vertices[ stride + 0 ];\n\t\tvertex.y = vertices[ stride + 1 ];\n\t\tvertex.z = vertices[ stride + 2 ];\n\n\t}\n\n\tfunction correctUVs() {\n\n\t\tvar a = new Vector3();\n\t\tvar b = new Vector3();\n\t\tvar c = new Vector3();\n\n\t\tvar centroid = new Vector3();\n\n\t\tvar uvA = new Vector2();\n\t\tvar uvB = new Vector2();\n\t\tvar uvC = new Vector2();\n\n\t\tfor ( var i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\n\t\t\ta.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );\n\t\t\tb.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );\n\t\t\tc.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );\n\n\t\t\tuvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );\n\t\t\tuvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );\n\t\t\tuvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );\n\n\t\t\tcentroid.copy( a ).add( b ).add( c ).divideScalar( 3 );\n\n\t\t\tvar azi = azimuth( centroid );\n\n\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\n\t\t}\n\n\t}\n\n\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t}\n\n\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t}\n\n\t}\n\n\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\tfunction azimuth( vector ) {\n\n\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t}\n\n\n\t// Angle above the XZ plane.\n\n\tfunction inclination( vector ) {\n\n\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t}\n\n}\n\nPolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nPolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry;\n\n/**\n * @author timothypratley / https://github.com/timothypratley\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// TetrahedronGeometry\n\nfunction TetrahedronGeometry( radius, detail ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'TetrahedronGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n\tthis.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) );\n\tthis.mergeVertices();\n\n}\n\nTetrahedronGeometry.prototype = Object.create( Geometry.prototype );\nTetrahedronGeometry.prototype.constructor = TetrahedronGeometry;\n\n// TetrahedronBufferGeometry\n\nfunction TetrahedronBufferGeometry( radius, detail ) {\n\n\tvar vertices = [\n\t\t1, 1, 1, \t- 1, - 1, 1, \t- 1, 1, - 1, \t1, - 1, - 1\n\t];\n\n\tvar indices = [\n\t\t2, 1, 0, \t0, 3, 2,\t1, 3, 0,\t2, 3, 1\n\t];\n\n\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\tthis.type = 'TetrahedronBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n}\n\nTetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\nTetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry;\n\n/**\n * @author timothypratley / https://github.com/timothypratley\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// OctahedronGeometry\n\nfunction OctahedronGeometry( radius, detail ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'OctahedronGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n\tthis.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) );\n\tthis.mergeVertices();\n\n}\n\nOctahedronGeometry.prototype = Object.create( Geometry.prototype );\nOctahedronGeometry.prototype.constructor = OctahedronGeometry;\n\n// OctahedronBufferGeometry\n\nfunction OctahedronBufferGeometry( radius, detail ) {\n\n\tvar vertices = [\n\t\t1, 0, 0, \t- 1, 0, 0,\t0, 1, 0,\n\t\t0, - 1, 0, \t0, 0, 1,\t0, 0, - 1\n\t];\n\n\tvar indices = [\n\t\t0, 2, 4,\t0, 4, 3,\t0, 3, 5,\n\t\t0, 5, 2,\t1, 2, 5,\t1, 5, 3,\n\t\t1, 3, 4,\t1, 4, 2\n\t];\n\n\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\tthis.type = 'OctahedronBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n}\n\nOctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\nOctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry;\n\n/**\n * @author timothypratley / https://github.com/timothypratley\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// IcosahedronGeometry\n\nfunction IcosahedronGeometry( radius, detail ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'IcosahedronGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n\tthis.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) );\n\tthis.mergeVertices();\n\n}\n\nIcosahedronGeometry.prototype = Object.create( Geometry.prototype );\nIcosahedronGeometry.prototype.constructor = IcosahedronGeometry;\n\n// IcosahedronBufferGeometry\n\nfunction IcosahedronBufferGeometry( radius, detail ) {\n\n\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\tvar vertices = [\n\t\t- 1, t, 0, \t1, t, 0, \t- 1, - t, 0, \t1, - t, 0,\n\t\t 0, - 1, t, \t0, 1, t,\t0, - 1, - t, \t0, 1, - t,\n\t\t t, 0, - 1, \tt, 0, 1, \t- t, 0, - 1, \t- t, 0, 1\n\t];\n\n\tvar indices = [\n\t\t 0, 11, 5, \t0, 5, 1, \t0, 1, 7, \t0, 7, 10, \t0, 10, 11,\n\t\t 1, 5, 9, \t5, 11, 4,\t11, 10, 2,\t10, 7, 6,\t7, 1, 8,\n\t\t 3, 9, 4, \t3, 4, 2,\t3, 2, 6,\t3, 6, 8,\t3, 8, 9,\n\t\t 4, 9, 5, \t2, 4, 11,\t6, 2, 10,\t8, 6, 7,\t9, 8, 1\n\t];\n\n\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\tthis.type = 'IcosahedronBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n}\n\nIcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\nIcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry;\n\n/**\n * @author Abe Pazos / https://hamoid.com\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// DodecahedronGeometry\n\nfunction DodecahedronGeometry( radius, detail ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'DodecahedronGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n\tthis.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) );\n\tthis.mergeVertices();\n\n}\n\nDodecahedronGeometry.prototype = Object.create( Geometry.prototype );\nDodecahedronGeometry.prototype.constructor = DodecahedronGeometry;\n\n// DodecahedronBufferGeometry\n\nfunction DodecahedronBufferGeometry( radius, detail ) {\n\n\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\tvar r = 1 / t;\n\n\tvar vertices = [\n\n\t\t// (±1, ±1, ±1)\n\t\t- 1, - 1, - 1,\t- 1, - 1, 1,\n\t\t- 1, 1, - 1, - 1, 1, 1,\n\t\t1, - 1, - 1, 1, - 1, 1,\n\t\t1, 1, - 1, 1, 1, 1,\n\n\t\t// (0, ±1/φ, ±φ)\n\t\t 0, - r, - t, 0, - r, t,\n\t\t 0, r, - t, 0, r, t,\n\n\t\t// (±1/φ, ±φ, 0)\n\t\t- r, - t, 0, - r, t, 0,\n\t\t r, - t, 0, r, t, 0,\n\n\t\t// (±φ, 0, ±1/φ)\n\t\t- t, 0, - r, t, 0, - r,\n\t\t- t, 0, r, t, 0, r\n\t];\n\n\tvar indices = [\n\t\t3, 11, 7, \t3, 7, 15, \t3, 15, 13,\n\t\t7, 19, 17, \t7, 17, 6, \t7, 6, 15,\n\t\t17, 4, 8, \t17, 8, 10, \t17, 10, 6,\n\t\t8, 0, 16, \t8, 16, 2, \t8, 2, 10,\n\t\t0, 12, 1, \t0, 1, 18, \t0, 18, 16,\n\t\t6, 10, 2, \t6, 2, 13, \t6, 13, 15,\n\t\t2, 16, 18, \t2, 18, 3, \t2, 3, 13,\n\t\t18, 1, 9, \t18, 9, 11, \t18, 11, 3,\n\t\t4, 14, 12, \t4, 12, 0, \t4, 0, 8,\n\t\t11, 9, 5, \t11, 5, 19, \t11, 19, 7,\n\t\t19, 5, 14, \t19, 14, 4, \t19, 4, 17,\n\t\t1, 12, 14, \t1, 14, 5, \t1, 5, 9\n\t];\n\n\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\tthis.type = 'DodecahedronBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n}\n\nDodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\nDodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry;\n\n/**\n * @author oosmoxiecode / https://github.com/oosmoxiecode\n * @author WestLangley / https://github.com/WestLangley\n * @author zz85 / https://github.com/zz85\n * @author miningold / https://github.com/miningold\n * @author jonobr1 / https://github.com/jonobr1\n * @author Mugen87 / https://github.com/Mugen87\n *\n */\n\n// TubeGeometry\n\nfunction TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'TubeGeometry';\n\n\tthis.parameters = {\n\t\tpath: path,\n\t\ttubularSegments: tubularSegments,\n\t\tradius: radius,\n\t\tradialSegments: radialSegments,\n\t\tclosed: closed\n\t};\n\n\tif ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' );\n\n\tvar bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed );\n\n\t// expose internals\n\n\tthis.tangents = bufferGeometry.tangents;\n\tthis.normals = bufferGeometry.normals;\n\tthis.binormals = bufferGeometry.binormals;\n\n\t// create geometry\n\n\tthis.fromBufferGeometry( bufferGeometry );\n\tthis.mergeVertices();\n\n}\n\nTubeGeometry.prototype = Object.create( Geometry.prototype );\nTubeGeometry.prototype.constructor = TubeGeometry;\n\n// TubeBufferGeometry\n\nfunction TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'TubeBufferGeometry';\n\n\tthis.parameters = {\n\t\tpath: path,\n\t\ttubularSegments: tubularSegments,\n\t\tradius: radius,\n\t\tradialSegments: radialSegments,\n\t\tclosed: closed\n\t};\n\n\ttubularSegments = tubularSegments || 64;\n\tradius = radius || 1;\n\tradialSegments = radialSegments || 8;\n\tclosed = closed || false;\n\n\tvar frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t// expose internals\n\n\tthis.tangents = frames.tangents;\n\tthis.normals = frames.normals;\n\tthis.binormals = frames.binormals;\n\n\t// helper variables\n\n\tvar vertex = new Vector3();\n\tvar normal = new Vector3();\n\tvar uv = new Vector2();\n\tvar P = new Vector3();\n\n\tvar i, j;\n\n\t// buffer\n\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\tvar indices = [];\n\n\t// create buffer data\n\n\tgenerateBufferData();\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t// functions\n\n\tfunction generateBufferData() {\n\n\t\tfor ( i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\tgenerateSegment( i );\n\n\t\t}\n\n\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t// at the regular position on the given path\n\t\t//\n\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t// uvs are generated in a separate function.\n\t\t// this makes it easy compute correct values for closed geometries\n\n\t\tgenerateUVs();\n\n\t\t// finally create faces\n\n\t\tgenerateIndices();\n\n\t}\n\n\tfunction generateSegment( i ) {\n\n\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\tP = path.getPointAt( i / tubularSegments, P );\n\n\t\t// retrieve corresponding normal and binormal\n\n\t\tvar N = frames.normals[ i ];\n\t\tvar B = frames.binormals[ i ];\n\n\t\t// generate normals and vertices for the current segment\n\n\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\tvar sin = Math.sin( v );\n\t\t\tvar cos = - Math.cos( v );\n\n\t\t\t// normal\n\n\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\tnormal.normalize();\n\n\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t}\n\n\tfunction generateIndices() {\n\n\t\tfor ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tvar d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction generateUVs() {\n\n\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nTubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nTubeBufferGeometry.prototype.constructor = TubeBufferGeometry;\n\n/**\n * @author oosmoxiecode\n * @author Mugen87 / https://github.com/Mugen87\n *\n * based on http://www.blackpawn.com/texts/pqtorus/\n */\n\n// TorusKnotGeometry\n\nfunction TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'TorusKnotGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\ttube: tube,\n\t\ttubularSegments: tubularSegments,\n\t\tradialSegments: radialSegments,\n\t\tp: p,\n\t\tq: q\n\t};\n\n\tif ( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' );\n\n\tthis.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) );\n\tthis.mergeVertices();\n\n}\n\nTorusKnotGeometry.prototype = Object.create( Geometry.prototype );\nTorusKnotGeometry.prototype.constructor = TorusKnotGeometry;\n\n// TorusKnotBufferGeometry\n\nfunction TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'TorusKnotBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\ttube: tube,\n\t\ttubularSegments: tubularSegments,\n\t\tradialSegments: radialSegments,\n\t\tp: p,\n\t\tq: q\n\t};\n\n\tradius = radius || 1;\n\ttube = tube || 0.4;\n\ttubularSegments = Math.floor( tubularSegments ) || 64;\n\tradialSegments = Math.floor( radialSegments ) || 8;\n\tp = p || 2;\n\tq = q || 3;\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\t// helper variables\n\n\tvar i, j;\n\n\tvar vertex = new Vector3();\n\tvar normal = new Vector3();\n\n\tvar P1 = new Vector3();\n\tvar P2 = new Vector3();\n\n\tvar B = new Vector3();\n\tvar T = new Vector3();\n\tvar N = new Vector3();\n\n\t// generate vertices, normals and uvs\n\n\tfor ( i = 0; i <= tubularSegments; ++ i ) {\n\n\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segement\n\n\t\tvar u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t// calculate orthonormal basis\n\n\t\tT.subVectors( P2, P1 );\n\t\tN.addVectors( P2, P1 );\n\t\tB.crossVectors( T, N );\n\t\tN.crossVectors( B, T );\n\n\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\tB.normalize();\n\t\tN.normalize();\n\n\t\tfor ( j = 0; j <= radialSegments; ++ j ) {\n\n\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\t\t\tvar cx = - tube * Math.cos( v );\n\t\t\tvar cy = tube * Math.sin( v );\n\n\t\t\t// now calculate the final vertex position.\n\t\t\t// first we orient the extrusion with our basis vectos, then we add it to the current position on the curve\n\n\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\n\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t// uv\n\n\t\t\tuvs.push( i / tubularSegments );\n\t\t\tuvs.push( j / radialSegments );\n\n\t\t}\n\n\t}\n\n\t// generate indices\n\n\tfor ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t// indices\n\n\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\tvar d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t// faces\n\n\t\t\tindices.push( a, b, d );\n\t\t\tindices.push( b, c, d );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t// this function calculates the current position on the torus curve\n\n\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\n\n\t\tvar cu = Math.cos( u );\n\t\tvar su = Math.sin( u );\n\t\tvar quOverP = q / p * u;\n\t\tvar cs = Math.cos( quOverP );\n\n\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t}\n\n}\n\nTorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nTorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry;\n\n/**\n * @author oosmoxiecode\n * @author mrdoob / http://mrdoob.com/\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// TorusGeometry\n\nfunction TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'TorusGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\ttube: tube,\n\t\tradialSegments: radialSegments,\n\t\ttubularSegments: tubularSegments,\n\t\tarc: arc\n\t};\n\n\tthis.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) );\n\tthis.mergeVertices();\n\n}\n\nTorusGeometry.prototype = Object.create( Geometry.prototype );\nTorusGeometry.prototype.constructor = TorusGeometry;\n\n// TorusBufferGeometry\n\nfunction TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'TorusBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\ttube: tube,\n\t\tradialSegments: radialSegments,\n\t\ttubularSegments: tubularSegments,\n\t\tarc: arc\n\t};\n\n\tradius = radius || 1;\n\ttube = tube || 0.4;\n\tradialSegments = Math.floor( radialSegments ) || 8;\n\ttubularSegments = Math.floor( tubularSegments ) || 6;\n\tarc = arc || Math.PI * 2;\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\t// helper variables\n\n\tvar center = new Vector3();\n\tvar vertex = new Vector3();\n\tvar normal = new Vector3();\n\n\tvar j, i;\n\n\t// generate vertices, normals and uvs\n\n\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\tvar u = i / tubularSegments * arc;\n\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t// uv\n\n\t\t\tuvs.push( i / tubularSegments );\n\t\t\tuvs.push( j / radialSegments );\n\n\t\t}\n\n\t}\n\n\t// generate indices\n\n\tfor ( j = 1; j <= radialSegments; j ++ ) {\n\n\t\tfor ( i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t// indices\n\n\t\t\tvar a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\tvar b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\tvar c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\tvar d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t// faces\n\n\t\t\tindices.push( a, b, d );\n\t\t\tindices.push( b, c, d );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n}\n\nTorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nTorusBufferGeometry.prototype.constructor = TorusBufferGeometry;\n\n/**\n * @author Mugen87 / https://github.com/Mugen87\n * Port from https://github.com/mapbox/earcut (v2.1.2)\n */\n\nvar Earcut = {\n\n\ttriangulate: function ( data, holeIndices, dim ) {\n\n\t\tdim = dim || 2;\n\n\t\tvar hasHoles = holeIndices && holeIndices.length,\n\t\t\touterLen = hasHoles ? holeIndices[ 0 ] * dim : data.length,\n\t\t\touterNode = linkedList( data, 0, outerLen, dim, true ),\n\t\t\ttriangles = [];\n\n\t\tif ( ! outerNode ) return triangles;\n\n\t\tvar minX, minY, maxX, maxY, x, y, invSize;\n\n\t\tif ( hasHoles ) outerNode = eliminateHoles( data, holeIndices, outerNode, dim );\n\n\t\t// if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n\n\t\tif ( data.length > 80 * dim ) {\n\n\t\t\tminX = maxX = data[ 0 ];\n\t\t\tminY = maxY = data[ 1 ];\n\n\t\t\tfor ( var i = dim; i < outerLen; i += dim ) {\n\n\t\t\t\tx = data[ i ];\n\t\t\t\ty = data[ i + 1 ];\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\n\t\t\t}\n\n\t\t\t// minX, minY and invSize are later used to transform coords into integers for z-order calculation\n\n\t\t\tinvSize = Math.max( maxX - minX, maxY - minY );\n\t\t\tinvSize = invSize !== 0 ? 1 / invSize : 0;\n\n\t\t}\n\n\t\tearcutLinked( outerNode, triangles, dim, minX, minY, invSize );\n\n\t\treturn triangles;\n\n\t}\n\n};\n\n// create a circular doubly linked list from polygon points in the specified winding order\n\nfunction linkedList( data, start, end, dim, clockwise ) {\n\n\tvar i, last;\n\n\tif ( clockwise === ( signedArea( data, start, end, dim ) > 0 ) ) {\n\n\t\tfor ( i = start; i < end; i += dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );\n\n\t} else {\n\n\t\tfor ( i = end - dim; i >= start; i -= dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );\n\n\t}\n\n\tif ( last && equals( last, last.next ) ) {\n\n\t\tremoveNode( last );\n\t\tlast = last.next;\n\n\t}\n\n\treturn last;\n\n}\n\n// eliminate colinear or duplicate points\n\nfunction filterPoints( start, end ) {\n\n\tif ( ! start ) return start;\n\tif ( ! end ) end = start;\n\n\tvar p = start, again;\n\n\tdo {\n\n\t\tagain = false;\n\n\t\tif ( ! p.steiner && ( equals( p, p.next ) || area( p.prev, p, p.next ) === 0 ) ) {\n\n\t\t\tremoveNode( p );\n\t\t\tp = end = p.prev;\n\t\t\tif ( p === p.next ) break;\n\t\t\tagain = true;\n\n\t\t} else {\n\n\t\t\tp = p.next;\n\n\t\t}\n\n\t} while ( again || p !== end );\n\n\treturn end;\n\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\n\nfunction earcutLinked( ear, triangles, dim, minX, minY, invSize, pass ) {\n\n\tif ( ! ear ) return;\n\n\t// interlink polygon nodes in z-order\n\n\tif ( ! pass && invSize ) indexCurve( ear, minX, minY, invSize );\n\n\tvar stop = ear, prev, next;\n\n\t// iterate through ears, slicing them one by one\n\n\twhile ( ear.prev !== ear.next ) {\n\n\t\tprev = ear.prev;\n\t\tnext = ear.next;\n\n\t\tif ( invSize ? isEarHashed( ear, minX, minY, invSize ) : isEar( ear ) ) {\n\n\t\t\t// cut off the triangle\n\t\t\ttriangles.push( prev.i / dim );\n\t\t\ttriangles.push( ear.i / dim );\n\t\t\ttriangles.push( next.i / dim );\n\n\t\t\tremoveNode( ear );\n\n\t\t\t// skipping the next vertice leads to less sliver triangles\n\t\t\tear = next.next;\n\t\t\tstop = next.next;\n\n\t\t\tcontinue;\n\n\t\t}\n\n\t\tear = next;\n\n\t\t// if we looped through the whole remaining polygon and can't find any more ears\n\n\t\tif ( ear === stop ) {\n\n\t\t\t// try filtering points and slicing again\n\n\t\t\tif ( ! pass ) {\n\n\t\t\t\tearcutLinked( filterPoints( ear ), triangles, dim, minX, minY, invSize, 1 );\n\n\t\t\t\t// if this didn't work, try curing all small self-intersections locally\n\n\t\t\t} else if ( pass === 1 ) {\n\n\t\t\t\tear = cureLocalIntersections( ear, triangles, dim );\n\t\t\t\tearcutLinked( ear, triangles, dim, minX, minY, invSize, 2 );\n\n\t\t\t// as a last resort, try splitting the remaining polygon into two\n\n\t\t\t} else if ( pass === 2 ) {\n\n\t\t\t\tsplitEarcut( ear, triangles, dim, minX, minY, invSize );\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\n\nfunction isEar( ear ) {\n\n\tvar a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear\n\n\t// now make sure we don't have other points inside the potential ear\n\tvar p = ear.next.next;\n\n\twhile ( p !== ear.prev ) {\n\n\t\tif ( pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) && area( p.prev, p, p.next ) >= 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tp = p.next;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction isEarHashed( ear, minX, minY, invSize ) {\n\n\tvar a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear\n\n\t// triangle bbox; min & max are calculated like this for speed\n\n\tvar minTX = a.x < b.x ? ( a.x < c.x ? a.x : c.x ) : ( b.x < c.x ? b.x : c.x ),\n\t\tminTY = a.y < b.y ? ( a.y < c.y ? a.y : c.y ) : ( b.y < c.y ? b.y : c.y ),\n\t\tmaxTX = a.x > b.x ? ( a.x > c.x ? a.x : c.x ) : ( b.x > c.x ? b.x : c.x ),\n\t\tmaxTY = a.y > b.y ? ( a.y > c.y ? a.y : c.y ) : ( b.y > c.y ? b.y : c.y );\n\n\t// z-order range for the current triangle bbox;\n\n\tvar minZ = zOrder( minTX, minTY, minX, minY, invSize ),\n\t\tmaxZ = zOrder( maxTX, maxTY, minX, minY, invSize );\n\n\t// first look for points inside the triangle in increasing z-order\n\n\tvar p = ear.nextZ;\n\n\twhile ( p && p.z <= maxZ ) {\n\n\t\tif ( p !== ear.prev && p !== ear.next &&\n\t\t\t\tpointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) &&\n\t\t\t\tarea( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.nextZ;\n\n\t}\n\n\t// then look for points in decreasing z-order\n\n\tp = ear.prevZ;\n\n\twhile ( p && p.z >= minZ ) {\n\n\t\tif ( p !== ear.prev && p !== ear.next &&\n\t\t\t\tpointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) &&\n\t\t\t\tarea( p.prev, p, p.next ) >= 0 ) return false;\n\n\t\tp = p.prevZ;\n\n\t}\n\n\treturn true;\n\n}\n\n// go through all polygon nodes and cure small local self-intersections\n\nfunction cureLocalIntersections( start, triangles, dim ) {\n\n\tvar p = start;\n\n\tdo {\n\n\t\tvar a = p.prev, b = p.next.next;\n\n\t\tif ( ! equals( a, b ) && intersects( a, p, p.next, b ) && locallyInside( a, b ) && locallyInside( b, a ) ) {\n\n\t\t\ttriangles.push( a.i / dim );\n\t\t\ttriangles.push( p.i / dim );\n\t\t\ttriangles.push( b.i / dim );\n\n\t\t\t// remove two nodes involved\n\n\t\t\tremoveNode( p );\n\t\t\tremoveNode( p.next );\n\n\t\t\tp = start = b;\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\treturn p;\n\n}\n\n// try splitting polygon into two and triangulate them independently\n\nfunction splitEarcut( start, triangles, dim, minX, minY, invSize ) {\n\n\t// look for a valid diagonal that divides the polygon into two\n\n\tvar a = start;\n\n\tdo {\n\n\t\tvar b = a.next.next;\n\n\t\twhile ( b !== a.prev ) {\n\n\t\t\tif ( a.i !== b.i && isValidDiagonal( a, b ) ) {\n\n\t\t\t\t// split the polygon in two by the diagonal\n\n\t\t\t\tvar c = splitPolygon( a, b );\n\n\t\t\t\t// filter colinear points around the cuts\n\n\t\t\t\ta = filterPoints( a, a.next );\n\t\t\t\tc = filterPoints( c, c.next );\n\n\t\t\t\t// run earcut on each half\n\n\t\t\t\tearcutLinked( a, triangles, dim, minX, minY, invSize );\n\t\t\t\tearcutLinked( c, triangles, dim, minX, minY, invSize );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tb = b.next;\n\n\t\t}\n\n\t\ta = a.next;\n\n\t} while ( a !== start );\n\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\n\nfunction eliminateHoles( data, holeIndices, outerNode, dim ) {\n\n\tvar queue = [], i, len, start, end, list;\n\n\tfor ( i = 0, len = holeIndices.length; i < len; i ++ ) {\n\n\t\tstart = holeIndices[ i ] * dim;\n\t\tend = i < len - 1 ? holeIndices[ i + 1 ] * dim : data.length;\n\t\tlist = linkedList( data, start, end, dim, false );\n\t\tif ( list === list.next ) list.steiner = true;\n\t\tqueue.push( getLeftmost( list ) );\n\n\t}\n\n\tqueue.sort( compareX );\n\n\t// process holes from left to right\n\n\tfor ( i = 0; i < queue.length; i ++ ) {\n\n\t\teliminateHole( queue[ i ], outerNode );\n\t\touterNode = filterPoints( outerNode, outerNode.next );\n\n\t}\n\n\treturn outerNode;\n\n}\n\nfunction compareX( a, b ) {\n\n\treturn a.x - b.x;\n\n}\n\n// find a bridge between vertices that connects hole with an outer ring and and link it\n\nfunction eliminateHole( hole, outerNode ) {\n\n\touterNode = findHoleBridge( hole, outerNode );\n\n\tif ( outerNode ) {\n\n\t\tvar b = splitPolygon( outerNode, hole );\n\n\t\tfilterPoints( b, b.next );\n\n\t}\n\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\n\nfunction findHoleBridge( hole, outerNode ) {\n\n\tvar p = outerNode,\n\t\thx = hole.x,\n\t\thy = hole.y,\n\t\tqx = - Infinity,\n\t\tm;\n\n\t// find a segment intersected by a ray from the hole's leftmost point to the left;\n\t// segment's endpoint with lesser x will be potential connection point\n\n\tdo {\n\n\t\tif ( hy <= p.y && hy >= p.next.y && p.next.y !== p.y ) {\n\n\t\t\tvar x = p.x + ( hy - p.y ) * ( p.next.x - p.x ) / ( p.next.y - p.y );\n\n\t\t\tif ( x <= hx && x > qx ) {\n\n\t\t\t\tqx = x;\n\n\t\t\t\tif ( x === hx ) {\n\n\t\t\t\t\tif ( hy === p.y ) return p;\n\t\t\t\t\tif ( hy === p.next.y ) return p.next;\n\n\t\t\t\t}\n\n\t\t\t\tm = p.x < p.next.x ? p : p.next;\n\n\t\t\t}\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== outerNode );\n\n\tif ( ! m ) return null;\n\n\tif ( hx === qx ) return m.prev; // hole touches outer segment; pick lower endpoint\n\n\t// look for points inside the triangle of hole point, segment intersection and endpoint;\n\t// if there are no points found, we have a valid connection;\n\t// otherwise choose the point of the minimum angle with the ray as connection point\n\n\tvar stop = m,\n\t\tmx = m.x,\n\t\tmy = m.y,\n\t\ttanMin = Infinity,\n\t\ttan;\n\n\tp = m.next;\n\n\twhile ( p !== stop ) {\n\n\t\tif ( hx >= p.x && p.x >= mx && hx !== p.x &&\n\t\t\t\t\t\tpointInTriangle( hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y ) ) {\n\n\t\t\ttan = Math.abs( hy - p.y ) / ( hx - p.x ); // tangential\n\n\t\t\tif ( ( tan < tanMin || ( tan === tanMin && p.x > m.x ) ) && locallyInside( p, hole ) ) {\n\n\t\t\t\tm = p;\n\t\t\t\ttanMin = tan;\n\n\t\t\t}\n\n\t\t}\n\n\t\tp = p.next;\n\n\t}\n\n\treturn m;\n\n}\n\n// interlink polygon nodes in z-order\n\nfunction indexCurve( start, minX, minY, invSize ) {\n\n\tvar p = start;\n\n\tdo {\n\n\t\tif ( p.z === null ) p.z = zOrder( p.x, p.y, minX, minY, invSize );\n\t\tp.prevZ = p.prev;\n\t\tp.nextZ = p.next;\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\tp.prevZ.nextZ = null;\n\tp.prevZ = null;\n\n\tsortLinked( p );\n\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\n\nfunction sortLinked( list ) {\n\n\tvar i, p, q, e, tail, numMerges, pSize, qSize, inSize = 1;\n\n\tdo {\n\n\t\tp = list;\n\t\tlist = null;\n\t\ttail = null;\n\t\tnumMerges = 0;\n\n\t\twhile ( p ) {\n\n\t\t\tnumMerges ++;\n\t\t\tq = p;\n\t\t\tpSize = 0;\n\n\t\t\tfor ( i = 0; i < inSize; i ++ ) {\n\n\t\t\t\tpSize ++;\n\t\t\t\tq = q.nextZ;\n\t\t\t\tif ( ! q ) break;\n\n\t\t\t}\n\n\t\t\tqSize = inSize;\n\n\t\t\twhile ( pSize > 0 || ( qSize > 0 && q ) ) {\n\n\t\t\t\tif ( pSize !== 0 && ( qSize === 0 || ! q || p.z <= q.z ) ) {\n\n\t\t\t\t\te = p;\n\t\t\t\t\tp = p.nextZ;\n\t\t\t\t\tpSize --;\n\n\t\t\t\t} else {\n\n\t\t\t\t\te = q;\n\t\t\t\t\tq = q.nextZ;\n\t\t\t\t\tqSize --;\n\n\t\t\t\t}\n\n\t\t\t\tif ( tail ) tail.nextZ = e;\n\t\t\t\telse list = e;\n\n\t\t\t\te.prevZ = tail;\n\t\t\t\ttail = e;\n\n\t\t\t}\n\n\t\t\tp = q;\n\n\t\t}\n\n\t\ttail.nextZ = null;\n\t\tinSize *= 2;\n\n\t} while ( numMerges > 1 );\n\n\treturn list;\n\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\n\nfunction zOrder( x, y, minX, minY, invSize ) {\n\n\t// coords are transformed into non-negative 15-bit integer range\n\n\tx = 32767 * ( x - minX ) * invSize;\n\ty = 32767 * ( y - minY ) * invSize;\n\n\tx = ( x | ( x << 8 ) ) & 0x00FF00FF;\n\tx = ( x | ( x << 4 ) ) & 0x0F0F0F0F;\n\tx = ( x | ( x << 2 ) ) & 0x33333333;\n\tx = ( x | ( x << 1 ) ) & 0x55555555;\n\n\ty = ( y | ( y << 8 ) ) & 0x00FF00FF;\n\ty = ( y | ( y << 4 ) ) & 0x0F0F0F0F;\n\ty = ( y | ( y << 2 ) ) & 0x33333333;\n\ty = ( y | ( y << 1 ) ) & 0x55555555;\n\n\treturn x | ( y << 1 );\n\n}\n\n// find the leftmost node of a polygon ring\n\nfunction getLeftmost( start ) {\n\n\tvar p = start, leftmost = start;\n\n\tdo {\n\n\t\tif ( p.x < leftmost.x ) leftmost = p;\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\treturn leftmost;\n\n}\n\n// check if a point lies within a convex triangle\n\nfunction pointInTriangle( ax, ay, bx, by, cx, cy, px, py ) {\n\n\treturn ( cx - px ) * ( ay - py ) - ( ax - px ) * ( cy - py ) >= 0 &&\n\t ( ax - px ) * ( by - py ) - ( bx - px ) * ( ay - py ) >= 0 &&\n\t ( bx - px ) * ( cy - py ) - ( cx - px ) * ( by - py ) >= 0;\n\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\n\nfunction isValidDiagonal( a, b ) {\n\n\treturn a.next.i !== b.i && a.prev.i !== b.i && ! intersectsPolygon( a, b ) &&\n\t\tlocallyInside( a, b ) && locallyInside( b, a ) && middleInside( a, b );\n\n}\n\n// signed area of a triangle\n\nfunction area( p, q, r ) {\n\n\treturn ( q.y - p.y ) * ( r.x - q.x ) - ( q.x - p.x ) * ( r.y - q.y );\n\n}\n\n// check if two points are equal\n\nfunction equals( p1, p2 ) {\n\n\treturn p1.x === p2.x && p1.y === p2.y;\n\n}\n\n// check if two segments intersect\n\nfunction intersects( p1, q1, p2, q2 ) {\n\n\tif ( ( equals( p1, q1 ) && equals( p2, q2 ) ) ||\n\t\t\t( equals( p1, q2 ) && equals( p2, q1 ) ) ) return true;\n\n\treturn area( p1, q1, p2 ) > 0 !== area( p1, q1, q2 ) > 0 &&\n\t\t\t\t area( p2, q2, p1 ) > 0 !== area( p2, q2, q1 ) > 0;\n\n}\n\n// check if a polygon diagonal intersects any polygon segments\n\nfunction intersectsPolygon( a, b ) {\n\n\tvar p = a;\n\n\tdo {\n\n\t\tif ( p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n\t\t\t\t\t\tintersects( p, p.next, a, b ) ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== a );\n\n\treturn false;\n\n}\n\n// check if a polygon diagonal is locally inside the polygon\n\nfunction locallyInside( a, b ) {\n\n\treturn area( a.prev, a, a.next ) < 0 ?\n\t\tarea( a, b, a.next ) >= 0 && area( a, a.prev, b ) >= 0 :\n\t\tarea( a, b, a.prev ) < 0 || area( a, a.next, b ) < 0;\n\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\n\nfunction middleInside( a, b ) {\n\n\tvar p = a,\n\t\tinside = false,\n\t\tpx = ( a.x + b.x ) / 2,\n\t\tpy = ( a.y + b.y ) / 2;\n\n\tdo {\n\n\t\tif ( ( ( p.y > py ) !== ( p.next.y > py ) ) && p.next.y !== p.y &&\n\t\t\t\t\t\t( px < ( p.next.x - p.x ) * ( py - p.y ) / ( p.next.y - p.y ) + p.x ) ) {\n\n\t\t\tinside = ! inside;\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== a );\n\n\treturn inside;\n\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\n\nfunction splitPolygon( a, b ) {\n\n\tvar a2 = new Node( a.i, a.x, a.y ),\n\t\tb2 = new Node( b.i, b.x, b.y ),\n\t\tan = a.next,\n\t\tbp = b.prev;\n\n\ta.next = b;\n\tb.prev = a;\n\n\ta2.next = an;\n\tan.prev = a2;\n\n\tb2.next = a2;\n\ta2.prev = b2;\n\n\tbp.next = b2;\n\tb2.prev = bp;\n\n\treturn b2;\n\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\n\nfunction insertNode( i, x, y, last ) {\n\n\tvar p = new Node( i, x, y );\n\n\tif ( ! last ) {\n\n\t\tp.prev = p;\n\t\tp.next = p;\n\n\t} else {\n\n\t\tp.next = last.next;\n\t\tp.prev = last;\n\t\tlast.next.prev = p;\n\t\tlast.next = p;\n\n\t}\n\n\treturn p;\n\n}\n\nfunction removeNode( p ) {\n\n\tp.next.prev = p.prev;\n\tp.prev.next = p.next;\n\n\tif ( p.prevZ ) p.prevZ.nextZ = p.nextZ;\n\tif ( p.nextZ ) p.nextZ.prevZ = p.prevZ;\n\n}\n\nfunction Node( i, x, y ) {\n\n\t// vertice index in coordinates array\n\tthis.i = i;\n\n\t// vertex coordinates\n\tthis.x = x;\n\tthis.y = y;\n\n\t// previous and next vertice nodes in a polygon ring\n\tthis.prev = null;\n\tthis.next = null;\n\n\t// z-order curve value\n\tthis.z = null;\n\n\t// previous and next nodes in z-order\n\tthis.prevZ = null;\n\tthis.nextZ = null;\n\n\t// indicates whether this is a steiner point\n\tthis.steiner = false;\n\n}\n\nfunction signedArea( data, start, end, dim ) {\n\n\tvar sum = 0;\n\n\tfor ( var i = start, j = end - dim; i < end; i += dim ) {\n\n\t\tsum += ( data[ j ] - data[ i ] ) * ( data[ i + 1 ] + data[ j + 1 ] );\n\t\tj = i;\n\n\t}\n\n\treturn sum;\n\n}\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n */\n\nvar ShapeUtils = {\n\n\t// calculate area of the contour polygon\n\n\tarea: function ( contour ) {\n\n\t\tvar n = contour.length;\n\t\tvar a = 0.0;\n\n\t\tfor ( var p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t}\n\n\t\treturn a * 0.5;\n\n\t},\n\n\tisClockWise: function ( pts ) {\n\n\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t},\n\n\ttriangulateShape: function ( contour, holes ) {\n\n\t\tvar vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]\n\t\tvar holeIndices = []; // array of hole indices\n\t\tvar faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ]\n\n\t\tremoveDupEndPts( contour );\n\t\taddContour( vertices, contour );\n\n\t\t//\n\n\t\tvar holeIndex = contour.length;\n\n\t\tholes.forEach( removeDupEndPts );\n\n\t\tfor ( var i = 0; i < holes.length; i ++ ) {\n\n\t\t\tholeIndices.push( holeIndex );\n\t\t\tholeIndex += holes[ i ].length;\n\t\t\taddContour( vertices, holes[ i ] );\n\n\t\t}\n\n\t\t//\n\n\t\tvar triangles = Earcut.triangulate( vertices, holeIndices );\n\n\t\t//\n\n\t\tfor ( var i = 0; i < triangles.length; i += 3 ) {\n\n\t\t\tfaces.push( triangles.slice( i, i + 3 ) );\n\n\t\t}\n\n\t\treturn faces;\n\n\t}\n\n};\n\nfunction removeDupEndPts( points ) {\n\n\tvar l = points.length;\n\n\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\tpoints.pop();\n\n\t}\n\n}\n\nfunction addContour( vertices, contour ) {\n\n\tfor ( var i = 0; i < contour.length; i ++ ) {\n\n\t\tvertices.push( contour[ i ].x );\n\t\tvertices.push( contour[ i ].y );\n\n\t}\n\n}\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n *\n * Creates extruded geometry from a path shape.\n *\n * parameters = {\n *\n * curveSegments: , // number of points on the curves\n * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n * amount: , // Depth to extrude the shape\n *\n * bevelEnabled: , // turn on bevel\n * bevelThickness: , // how deep into the original shape bevel goes\n * bevelSize: , // how far from shape outline is bevel\n * bevelSegments: , // number of bevel layers\n *\n * extrudePath: // curve to extrude shape along\n *\n * UVGenerator: // object that provides UV generator functions\n *\n * }\n */\n\n// ExtrudeGeometry\n\nfunction ExtrudeGeometry( shapes, options ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'ExtrudeGeometry';\n\n\tthis.parameters = {\n\t\tshapes: shapes,\n\t\toptions: options\n\t};\n\n\tthis.fromBufferGeometry( new ExtrudeBufferGeometry( shapes, options ) );\n\tthis.mergeVertices();\n\n}\n\nExtrudeGeometry.prototype = Object.create( Geometry.prototype );\nExtrudeGeometry.prototype.constructor = ExtrudeGeometry;\n\n// ExtrudeBufferGeometry\n\nfunction ExtrudeBufferGeometry( shapes, options ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'ExtrudeBufferGeometry';\n\n\tthis.parameters = {\n\t\tshapes: shapes,\n\t\toptions: options\n\t};\n\n\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\tvar scope = this;\n\n\tvar verticesArray = [];\n\tvar uvArray = [];\n\n\tfor ( var i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\tvar shape = shapes[ i ];\n\t\taddShape( shape, options );\n\n\t}\n\n\t// build geometry\n\n\tthis.addAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) );\n\n\tthis.computeVertexNormals();\n\n\t// functions\n\n\tfunction addShape( shape ) {\n\n\t\tvar placeholder = [];\n\n\t\t// options\n\n\t\tvar curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\t\tvar steps = options.steps !== undefined ? options.steps : 1;\n\t\tvar amount = options.amount !== undefined ? options.amount : 100;\n\n\t\tvar bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true;\n\t\tvar bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6;\n\t\tvar bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2;\n\t\tvar bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\tvar extrudePath = options.extrudePath;\n\n\t\tvar uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator;\n\n\t\t//\n\n\t\tvar extrudePts, extrudeByPath = false;\n\t\tvar splineTube, binormal, normal, position2;\n\n\t\tif ( extrudePath ) {\n\n\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\textrudeByPath = true;\n\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t// SETUP TNB variables\n\n\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\tsplineTube = extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\tbinormal = new Vector3();\n\t\t\tnormal = new Vector3();\n\t\t\tposition2 = new Vector3();\n\n\t\t}\n\n\t\t// Safeguards if bevels are not enabled\n\n\t\tif ( ! bevelEnabled ) {\n\n\t\t\tbevelSegments = 0;\n\t\t\tbevelThickness = 0;\n\t\t\tbevelSize = 0;\n\n\t\t}\n\n\t\t// Variables initialization\n\n\t\tvar ahole, h, hl; // looping of holes\n\n\t\tvar shapePoints = shape.extractPoints( curveSegments );\n\n\t\tvar vertices = shapePoints.shape;\n\t\tvar holes = shapePoints.holes;\n\n\t\tvar reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\tif ( reverse ) {\n\n\t\t\tvertices = vertices.reverse();\n\n\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tvar faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t/* Vertices */\n\n\t\tvar contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\tvertices = vertices.concat( ahole );\n\n\t\t}\n\n\n\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\tif ( ! vec ) console.error( \"THREE.ExtrudeGeometry: vec does not exist\" );\n\n\t\t\treturn vec.clone().multiplyScalar( size ).add( pt );\n\n\t\t}\n\n\t\tvar b, bs, t, z,\n\t\t\tvert, vlen = vertices.length,\n\t\t\tface, flen = faces.length;\n\n\n\t\t// Find directions for point movement\n\n\n\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t// shifted by 1 unit (length of normalized vector) to the left\n\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t//\n\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\tvar v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt\n\n\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\tvar v_prev_x = inPt.x - inPrev.x,\n\t\t\t\tv_prev_y = inPt.y - inPrev.y;\n\t\t\tvar v_next_x = inNext.x - inPt.x,\n\t\t\t\tv_next_y = inNext.y - inPt.y;\n\n\t\t\tvar v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t// check for collinear edges\n\t\t\tvar collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t// not collinear\n\n\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\tvar v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\tvar v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\tvar ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\tvar ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\tvar ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\tvar ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\tvar sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t// but prevent crazy spikes\n\t\t\t\tvar v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\treturn new Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\tvar direction_eq = false; // assumes: opposite\n\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight spike\");\n\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t}\n\n\n\t\tvar contourMovements = [];\n\n\t\tfor ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\tif ( j === il ) j = 0;\n\t\t\tif ( k === il ) k = 0;\n\n\t\t\t// (j)---(i)---(k)\n\t\t\t// console.log('i,j,k', i, j , k)\n\n\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t}\n\n\t\tvar holesMovements = [],\n\t\t\toneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\toneHoleMovements = [];\n\n\t\t\tfor ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t// (j)---(i)---(k)\n\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t}\n\n\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t}\n\n\n\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\tfor ( b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tbs = bevelSize;\n\n\t\t// Back facing vertices\n\n\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t} else {\n\n\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add stepped vertices...\n\t\t// Including front facing vertices\n\n\t\tvar s;\n\n\t\tfor ( s = 1; s <= steps; s ++ ) {\n\n\t\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, amount / steps * s );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// Add bevel segments planes\n\n\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\tfor ( b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/* Faces */\n\n\t\t// Top and bottom faces\n\n\t\tbuildLidFaces();\n\n\t\t// Sides faces\n\n\t\tbuildSideFaces();\n\n\n\t\t///// Internal functions\n\n\t\tfunction buildLidFaces() {\n\n\t\t\tvar start = verticesArray.length / 3;\n\n\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\tvar layer = 0; // steps + 1\n\t\t\t\tvar offset = vlen * layer;\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 0 );\n\n\t\t}\n\n\t\t// Create faces for the z-sides of the shape\n\n\t\tfunction buildSideFaces() {\n\n\t\t\tvar start = verticesArray.length / 3;\n\t\t\tvar layeroffset = 0;\n\t\t\tsidewalls( contour, layeroffset );\n\t\t\tlayeroffset += contour.length;\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t//, true\n\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t}\n\n\n\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 1 );\n\n\n\t\t}\n\n\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\tvar j, k;\n\t\t\ti = contour.length;\n\n\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\tj = i;\n\t\t\t\tk = i - 1;\n\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\tvar s = 0,\n\t\t\t\t\tsl = steps + bevelSegments * 2;\n\n\t\t\t\tfor ( s = 0; s < sl; s ++ ) {\n\n\t\t\t\t\tvar slen1 = vlen * s;\n\t\t\t\t\tvar slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\tvar a = layeroffset + j + slen1,\n\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\tf4( a, b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction v( x, y, z ) {\n\n\t\t\tplaceholder.push( x );\n\t\t\tplaceholder.push( y );\n\t\t\tplaceholder.push( z );\n\n\t\t}\n\n\n\t\tfunction f3( a, b, c ) {\n\n\t\t\taddVertex( a );\n\t\t\taddVertex( b );\n\t\t\taddVertex( c );\n\n\t\t\tvar nextIndex = verticesArray.length / 3;\n\t\t\tvar uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\taddUV( uvs[ 0 ] );\n\t\t\taddUV( uvs[ 1 ] );\n\t\t\taddUV( uvs[ 2 ] );\n\n\t\t}\n\n\t\tfunction f4( a, b, c, d ) {\n\n\t\t\taddVertex( a );\n\t\t\taddVertex( b );\n\t\t\taddVertex( d );\n\n\t\t\taddVertex( b );\n\t\t\taddVertex( c );\n\t\t\taddVertex( d );\n\n\n\t\t\tvar nextIndex = verticesArray.length / 3;\n\t\t\tvar uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\taddUV( uvs[ 0 ] );\n\t\t\taddUV( uvs[ 1 ] );\n\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\taddUV( uvs[ 1 ] );\n\t\t\taddUV( uvs[ 2 ] );\n\t\t\taddUV( uvs[ 3 ] );\n\n\t\t}\n\n\t\tfunction addVertex( index ) {\n\n\t\t\tverticesArray.push( placeholder[ index * 3 + 0 ] );\n\t\t\tverticesArray.push( placeholder[ index * 3 + 1 ] );\n\t\t\tverticesArray.push( placeholder[ index * 3 + 2 ] );\n\n\t\t}\n\n\n\t\tfunction addUV( vector2 ) {\n\n\t\t\tuvArray.push( vector2.x );\n\t\t\tuvArray.push( vector2.y );\n\n\t\t}\n\n\t}\n\n}\n\nExtrudeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nExtrudeBufferGeometry.prototype.constructor = ExtrudeBufferGeometry;\n\nvar WorldUVGenerator = {\n\n\tgenerateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) {\n\n\t\tvar a_x = vertices[ indexA * 3 ];\n\t\tvar a_y = vertices[ indexA * 3 + 1 ];\n\t\tvar b_x = vertices[ indexB * 3 ];\n\t\tvar b_y = vertices[ indexB * 3 + 1 ];\n\t\tvar c_x = vertices[ indexC * 3 ];\n\t\tvar c_y = vertices[ indexC * 3 + 1 ];\n\n\t\treturn [\n\t\t\tnew Vector2( a_x, a_y ),\n\t\t\tnew Vector2( b_x, b_y ),\n\t\t\tnew Vector2( c_x, c_y )\n\t\t];\n\n\t},\n\n\tgenerateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) {\n\n\t\tvar a_x = vertices[ indexA * 3 ];\n\t\tvar a_y = vertices[ indexA * 3 + 1 ];\n\t\tvar a_z = vertices[ indexA * 3 + 2 ];\n\t\tvar b_x = vertices[ indexB * 3 ];\n\t\tvar b_y = vertices[ indexB * 3 + 1 ];\n\t\tvar b_z = vertices[ indexB * 3 + 2 ];\n\t\tvar c_x = vertices[ indexC * 3 ];\n\t\tvar c_y = vertices[ indexC * 3 + 1 ];\n\t\tvar c_z = vertices[ indexC * 3 + 2 ];\n\t\tvar d_x = vertices[ indexD * 3 ];\n\t\tvar d_y = vertices[ indexD * 3 + 1 ];\n\t\tvar d_z = vertices[ indexD * 3 + 2 ];\n\n\t\tif ( Math.abs( a_y - b_y ) < 0.01 ) {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_x, 1 - a_z ),\n\t\t\t\tnew Vector2( b_x, 1 - b_z ),\n\t\t\t\tnew Vector2( c_x, 1 - c_z ),\n\t\t\t\tnew Vector2( d_x, 1 - d_z )\n\t\t\t];\n\n\t\t} else {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_y, 1 - a_z ),\n\t\t\t\tnew Vector2( b_y, 1 - b_z ),\n\t\t\t\tnew Vector2( c_y, 1 - c_z ),\n\t\t\t\tnew Vector2( d_y, 1 - d_z )\n\t\t\t];\n\n\t\t}\n\n\t}\n};\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n * @author alteredq / http://alteredqualia.com/\n *\n * Text = 3D Text\n *\n * parameters = {\n * font: , // font\n *\n * size: , // size of the text\n * height: , // thickness to extrude text\n * curveSegments: , // number of points on the curves\n *\n * bevelEnabled: , // turn on bevel\n * bevelThickness: , // how deep into text bevel goes\n * bevelSize: // how far from text outline is bevel\n * }\n */\n\n// TextGeometry\n\nfunction TextGeometry( text, parameters ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'TextGeometry';\n\n\tthis.parameters = {\n\t\ttext: text,\n\t\tparameters: parameters\n\t};\n\n\tthis.fromBufferGeometry( new TextBufferGeometry( text, parameters ) );\n\tthis.mergeVertices();\n\n}\n\nTextGeometry.prototype = Object.create( Geometry.prototype );\nTextGeometry.prototype.constructor = TextGeometry;\n\n// TextBufferGeometry\n\nfunction TextBufferGeometry( text, parameters ) {\n\n\tparameters = parameters || {};\n\n\tvar font = parameters.font;\n\n\tif ( ! ( font && font.isFont ) ) {\n\n\t\tconsole.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' );\n\t\treturn new Geometry();\n\n\t}\n\n\tvar shapes = font.generateShapes( text, parameters.size, parameters.curveSegments );\n\n\t// translate parameters to ExtrudeGeometry API\n\n\tparameters.amount = parameters.height !== undefined ? parameters.height : 50;\n\n\t// defaults\n\n\tif ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10;\n\tif ( parameters.bevelSize === undefined ) parameters.bevelSize = 8;\n\tif ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false;\n\n\tExtrudeBufferGeometry.call( this, shapes, parameters );\n\n\tthis.type = 'TextBufferGeometry';\n\n}\n\nTextBufferGeometry.prototype = Object.create( ExtrudeBufferGeometry.prototype );\nTextBufferGeometry.prototype.constructor = TextBufferGeometry;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author benaadams / https://twitter.com/ben_a_adams\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// SphereGeometry\n\nfunction SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'SphereGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\twidthSegments: widthSegments,\n\t\theightSegments: heightSegments,\n\t\tphiStart: phiStart,\n\t\tphiLength: phiLength,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tthis.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) );\n\tthis.mergeVertices();\n\n}\n\nSphereGeometry.prototype = Object.create( Geometry.prototype );\nSphereGeometry.prototype.constructor = SphereGeometry;\n\n// SphereBufferGeometry\n\nfunction SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'SphereBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\twidthSegments: widthSegments,\n\t\theightSegments: heightSegments,\n\t\tphiStart: phiStart,\n\t\tphiLength: phiLength,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tradius = radius || 1;\n\n\twidthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 );\n\theightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 );\n\n\tphiStart = phiStart !== undefined ? phiStart : 0;\n\tphiLength = phiLength !== undefined ? phiLength : Math.PI * 2;\n\n\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI;\n\n\tvar thetaEnd = thetaStart + thetaLength;\n\n\tvar ix, iy;\n\n\tvar index = 0;\n\tvar grid = [];\n\n\tvar vertex = new Vector3();\n\tvar normal = new Vector3();\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\t// generate vertices, normals and uvs\n\n\tfor ( iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\tvar verticesRow = [];\n\n\t\tvar v = iy / heightSegments;\n\n\t\tfor ( ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\tvar u = ix / widthSegments;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormal.set( vertex.x, vertex.y, vertex.z ).normalize();\n\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t// uv\n\n\t\t\tuvs.push( u, 1 - v );\n\n\t\t\tverticesRow.push( index ++ );\n\n\t\t}\n\n\t\tgrid.push( verticesRow );\n\n\t}\n\n\t// indices\n\n\tfor ( iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\tfor ( ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\tvar a = grid[ iy ][ ix + 1 ];\n\t\t\tvar b = grid[ iy ][ ix ];\n\t\t\tvar c = grid[ iy + 1 ][ ix ];\n\t\t\tvar d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n}\n\nSphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nSphereBufferGeometry.prototype.constructor = SphereBufferGeometry;\n\n/**\n * @author Kaleb Murphy\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// RingGeometry\n\nfunction RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'RingGeometry';\n\n\tthis.parameters = {\n\t\tinnerRadius: innerRadius,\n\t\touterRadius: outerRadius,\n\t\tthetaSegments: thetaSegments,\n\t\tphiSegments: phiSegments,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tthis.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) );\n\tthis.mergeVertices();\n\n}\n\nRingGeometry.prototype = Object.create( Geometry.prototype );\nRingGeometry.prototype.constructor = RingGeometry;\n\n// RingBufferGeometry\n\nfunction RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'RingBufferGeometry';\n\n\tthis.parameters = {\n\t\tinnerRadius: innerRadius,\n\t\touterRadius: outerRadius,\n\t\tthetaSegments: thetaSegments,\n\t\tphiSegments: phiSegments,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tinnerRadius = innerRadius || 0.5;\n\touterRadius = outerRadius || 1;\n\n\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\tthetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8;\n\tphiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1;\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\t// some helper variables\n\n\tvar segment;\n\tvar radius = innerRadius;\n\tvar radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\tvar vertex = new Vector3();\n\tvar uv = new Vector2();\n\tvar j, i;\n\n\t// generate vertices, normals and uvs\n\n\tfor ( j = 0; j <= phiSegments; j ++ ) {\n\n\t\tfor ( i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\tsegment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t// uv\n\n\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// increase the radius for next row of vertices\n\n\t\tradius += radiusStep;\n\n\t}\n\n\t// indices\n\n\tfor ( j = 0; j < phiSegments; j ++ ) {\n\n\t\tvar thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\tfor ( i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\tsegment = i + thetaSegmentLevel;\n\n\t\t\tvar a = segment;\n\t\t\tvar b = segment + thetaSegments + 1;\n\t\t\tvar c = segment + thetaSegments + 2;\n\t\t\tvar d = segment + 1;\n\n\t\t\t// faces\n\n\t\t\tindices.push( a, b, d );\n\t\t\tindices.push( b, c, d );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n}\n\nRingBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nRingBufferGeometry.prototype.constructor = RingBufferGeometry;\n\n/**\n * @author astrodud / http://astrodud.isgreat.org/\n * @author zz85 / https://github.com/zz85\n * @author bhouston / http://clara.io\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// LatheGeometry\n\nfunction LatheGeometry( points, segments, phiStart, phiLength ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'LatheGeometry';\n\n\tthis.parameters = {\n\t\tpoints: points,\n\t\tsegments: segments,\n\t\tphiStart: phiStart,\n\t\tphiLength: phiLength\n\t};\n\n\tthis.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) );\n\tthis.mergeVertices();\n\n}\n\nLatheGeometry.prototype = Object.create( Geometry.prototype );\nLatheGeometry.prototype.constructor = LatheGeometry;\n\n// LatheBufferGeometry\n\nfunction LatheBufferGeometry( points, segments, phiStart, phiLength ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'LatheBufferGeometry';\n\n\tthis.parameters = {\n\t\tpoints: points,\n\t\tsegments: segments,\n\t\tphiStart: phiStart,\n\t\tphiLength: phiLength\n\t};\n\n\tsegments = Math.floor( segments ) || 12;\n\tphiStart = phiStart || 0;\n\tphiLength = phiLength || Math.PI * 2;\n\n\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\tphiLength = _Math.clamp( phiLength, 0, Math.PI * 2 );\n\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar uvs = [];\n\n\t// helper variables\n\n\tvar base;\n\tvar inverseSegments = 1.0 / segments;\n\tvar vertex = new Vector3();\n\tvar uv = new Vector2();\n\tvar i, j;\n\n\t// generate vertices and uvs\n\n\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\tvar phi = phiStart + i * inverseSegments * phiLength;\n\n\t\tvar sin = Math.sin( phi );\n\t\tvar cos = Math.cos( phi );\n\n\t\tfor ( j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\tvertex.y = points[ j ].y;\n\t\t\tvertex.z = points[ j ].x * cos;\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// uv\n\n\t\t\tuv.x = i / segments;\n\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\n\t\t}\n\n\t}\n\n\t// indices\n\n\tfor ( i = 0; i < segments; i ++ ) {\n\n\t\tfor ( j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\tbase = j + i * points.length;\n\n\t\t\tvar a = base;\n\t\t\tvar b = base + points.length;\n\t\t\tvar c = base + points.length + 1;\n\t\t\tvar d = base + 1;\n\n\t\t\t// faces\n\n\t\t\tindices.push( a, b, d );\n\t\t\tindices.push( b, c, d );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t// generate normals\n\n\tthis.computeVertexNormals();\n\n\t// if the geometry is closed, we need to average the normals along the seam.\n\t// because the corresponding vertices are identical (but still have different UVs).\n\n\tif ( phiLength === Math.PI * 2 ) {\n\n\t\tvar normals = this.attributes.normal.array;\n\t\tvar n1 = new Vector3();\n\t\tvar n2 = new Vector3();\n\t\tvar n = new Vector3();\n\n\t\t// this is the buffer offset for the last line of vertices\n\n\t\tbase = segments * points.length * 3;\n\n\t\tfor ( i = 0, j = 0; i < points.length; i ++, j += 3 ) {\n\n\t\t\t// select the normal of the vertex in the first line\n\n\t\t\tn1.x = normals[ j + 0 ];\n\t\t\tn1.y = normals[ j + 1 ];\n\t\t\tn1.z = normals[ j + 2 ];\n\n\t\t\t// select the normal of the vertex in the last line\n\n\t\t\tn2.x = normals[ base + j + 0 ];\n\t\t\tn2.y = normals[ base + j + 1 ];\n\t\t\tn2.z = normals[ base + j + 2 ];\n\n\t\t\t// average normals\n\n\t\t\tn.addVectors( n1, n2 ).normalize();\n\n\t\t\t// assign the new values to both normals\n\n\t\t\tnormals[ j + 0 ] = normals[ base + j + 0 ] = n.x;\n\t\t\tnormals[ j + 1 ] = normals[ base + j + 1 ] = n.y;\n\t\t\tnormals[ j + 2 ] = normals[ base + j + 2 ] = n.z;\n\n\t\t}\n\n\t}\n\n}\n\nLatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nLatheBufferGeometry.prototype.constructor = LatheBufferGeometry;\n\n/**\n * @author jonobr1 / http://jonobr1.com\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// ShapeGeometry\n\nfunction ShapeGeometry( shapes, curveSegments ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'ShapeGeometry';\n\n\tif ( typeof curveSegments === 'object' ) {\n\n\t\tconsole.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' );\n\n\t\tcurveSegments = curveSegments.curveSegments;\n\n\t}\n\n\tthis.parameters = {\n\t\tshapes: shapes,\n\t\tcurveSegments: curveSegments\n\t};\n\n\tthis.fromBufferGeometry( new ShapeBufferGeometry( shapes, curveSegments ) );\n\tthis.mergeVertices();\n\n}\n\nShapeGeometry.prototype = Object.create( Geometry.prototype );\nShapeGeometry.prototype.constructor = ShapeGeometry;\n\nShapeGeometry.prototype.toJSON = function () {\n\n\tvar data = Geometry.prototype.toJSON.call( this );\n\n\tvar shapes = this.parameters.shapes;\n\n\treturn toJSON( shapes, data );\n\n};\n\n// ShapeBufferGeometry\n\nfunction ShapeBufferGeometry( shapes, curveSegments ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'ShapeBufferGeometry';\n\n\tthis.parameters = {\n\t\tshapes: shapes,\n\t\tcurveSegments: curveSegments\n\t};\n\n\tcurveSegments = curveSegments || 12;\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\t// helper variables\n\n\tvar groupStart = 0;\n\tvar groupCount = 0;\n\n\t// allow single and array values for \"shapes\" parameter\n\n\tif ( Array.isArray( shapes ) === false ) {\n\n\t\taddShape( shapes );\n\n\t} else {\n\n\t\tfor ( var i = 0; i < shapes.length; i ++ ) {\n\n\t\t\taddShape( shapes[ i ] );\n\n\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\tgroupStart += groupCount;\n\t\t\tgroupCount = 0;\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t// helper functions\n\n\tfunction addShape( shape ) {\n\n\t\tvar i, l, shapeHole;\n\n\t\tvar indexOffset = vertices.length / 3;\n\t\tvar points = shape.extractPoints( curveSegments );\n\n\t\tvar shapeVertices = points.shape;\n\t\tvar shapeHoles = points.holes;\n\n\t\t// check direction of vertices\n\n\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t\t// also check if holes are in the opposite direction\n\n\t\t\tfor ( i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tshapeHole = shapeHoles[ i ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( shapeHole ) === true ) {\n\n\t\t\t\t\tshapeHoles[ i ] = shapeHole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t// join vertices of inner and outer paths to a single array\n\n\t\tfor ( i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\tshapeHole = shapeHoles[ i ];\n\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t}\n\n\t\t// vertices, normals, uvs\n\n\t\tfor ( i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\tvar vertex = shapeVertices[ i ];\n\n\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\tnormals.push( 0, 0, 1 );\n\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t}\n\n\t\t// incides\n\n\t\tfor ( i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\n\t\t\tvar a = face[ 0 ] + indexOffset;\n\t\t\tvar b = face[ 1 ] + indexOffset;\n\t\t\tvar c = face[ 2 ] + indexOffset;\n\n\t\t\tindices.push( a, b, c );\n\t\t\tgroupCount += 3;\n\n\t\t}\n\n\t}\n\n}\n\nShapeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nShapeBufferGeometry.prototype.constructor = ShapeBufferGeometry;\n\nShapeBufferGeometry.prototype.toJSON = function () {\n\n\tvar data = BufferGeometry.prototype.toJSON.call( this );\n\n\tvar shapes = this.parameters.shapes;\n\n\treturn toJSON( shapes, data );\n\n};\n\n//\n\nfunction toJSON( shapes, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( var i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tvar shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\treturn data;\n\n}\n\n/**\n * @author WestLangley / http://github.com/WestLangley\n * @author Mugen87 / https://github.com/Mugen87\n */\n\nfunction EdgesGeometry( geometry, thresholdAngle ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'EdgesGeometry';\n\n\tthis.parameters = {\n\t\tthresholdAngle: thresholdAngle\n\t};\n\n\tthresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1;\n\n\t// buffer\n\n\tvar vertices = [];\n\n\t// helper variables\n\n\tvar thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle );\n\tvar edge = [ 0, 0 ], edges = {}, edge1, edge2;\n\tvar key, keys = [ 'a', 'b', 'c' ];\n\n\t// prepare source geometry\n\n\tvar geometry2;\n\n\tif ( geometry.isBufferGeometry ) {\n\n\t\tgeometry2 = new Geometry();\n\t\tgeometry2.fromBufferGeometry( geometry );\n\n\t} else {\n\n\t\tgeometry2 = geometry.clone();\n\n\t}\n\n\tgeometry2.mergeVertices();\n\tgeometry2.computeFaceNormals();\n\n\tvar sourceVertices = geometry2.vertices;\n\tvar faces = geometry2.faces;\n\n\t// now create a data structure where each entry represents an edge with its adjoining faces\n\n\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\tvar face = faces[ i ];\n\n\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\tedge1 = face[ keys[ j ] ];\n\t\t\tedge2 = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\tedge[ 0 ] = Math.min( edge1, edge2 );\n\t\t\tedge[ 1 ] = Math.max( edge1, edge2 );\n\n\t\t\tkey = edge[ 0 ] + ',' + edge[ 1 ];\n\n\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ], face1: i, face2: undefined };\n\n\t\t\t} else {\n\n\t\t\t\tedges[ key ].face2 = i;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// generate vertices\n\n\tfor ( key in edges ) {\n\n\t\tvar e = edges[ key ];\n\n\t\t// an edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. default = 1 degree.\n\n\t\tif ( e.face2 === undefined || faces[ e.face1 ].normal.dot( faces[ e.face2 ].normal ) <= thresholdDot ) {\n\n\t\t\tvar vertex = sourceVertices[ e.index1 ];\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\tvertex = sourceVertices[ e.index2 ];\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n}\n\nEdgesGeometry.prototype = Object.create( BufferGeometry.prototype );\nEdgesGeometry.prototype.constructor = EdgesGeometry;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// CylinderGeometry\n\nfunction CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'CylinderGeometry';\n\n\tthis.parameters = {\n\t\tradiusTop: radiusTop,\n\t\tradiusBottom: radiusBottom,\n\t\theight: height,\n\t\tradialSegments: radialSegments,\n\t\theightSegments: heightSegments,\n\t\topenEnded: openEnded,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tthis.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) );\n\tthis.mergeVertices();\n\n}\n\nCylinderGeometry.prototype = Object.create( Geometry.prototype );\nCylinderGeometry.prototype.constructor = CylinderGeometry;\n\n// CylinderBufferGeometry\n\nfunction CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'CylinderBufferGeometry';\n\n\tthis.parameters = {\n\t\tradiusTop: radiusTop,\n\t\tradiusBottom: radiusBottom,\n\t\theight: height,\n\t\tradialSegments: radialSegments,\n\t\theightSegments: heightSegments,\n\t\topenEnded: openEnded,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tvar scope = this;\n\n\tradiusTop = radiusTop !== undefined ? radiusTop : 1;\n\tradiusBottom = radiusBottom !== undefined ? radiusBottom : 1;\n\theight = height || 1;\n\n\tradialSegments = Math.floor( radialSegments ) || 8;\n\theightSegments = Math.floor( heightSegments ) || 1;\n\n\topenEnded = openEnded !== undefined ? openEnded : false;\n\tthetaStart = thetaStart !== undefined ? thetaStart : 0.0;\n\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\t// helper variables\n\n\tvar index = 0;\n\tvar indexArray = [];\n\tvar halfHeight = height / 2;\n\tvar groupStart = 0;\n\n\t// generate geometry\n\n\tgenerateTorso();\n\n\tif ( openEnded === false ) {\n\n\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\tfunction generateTorso() {\n\n\t\tvar x, y;\n\t\tvar normal = new Vector3();\n\t\tvar vertex = new Vector3();\n\n\t\tvar groupCount = 0;\n\n\t\t// this will be used to calculate the normal\n\t\tvar slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\tvar indexRow = [];\n\n\t\t\tvar v = y / heightSegments;\n\n\t\t\t// calculate the radius of the current row\n\n\t\t\tvar radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tvar u = x / radialSegments;\n\n\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\tvar sinTheta = Math.sin( theta );\n\t\t\t\tvar cosTheta = Math.cos( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\t// now save vertices of the row in our index array\n\n\t\t\tindexArray.push( indexRow );\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\tfor ( y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\tvar a = indexArray[ y ][ x ];\n\t\t\t\tvar b = indexArray[ y + 1 ][ x ];\n\t\t\t\tvar c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\tvar d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t// update group counter\n\n\t\t\t\tgroupCount += 6;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t// calculate new start value for groups\n\n\t\tgroupStart += groupCount;\n\n\t}\n\n\tfunction generateCap( top ) {\n\n\t\tvar x, centerIndexStart, centerIndexEnd;\n\n\t\tvar uv = new Vector2();\n\t\tvar vertex = new Vector3();\n\n\t\tvar groupCount = 0;\n\n\t\tvar radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\tvar sign = ( top === true ) ? 1 : - 1;\n\n\t\t// save the index of the first center vertex\n\t\tcenterIndexStart = index;\n\n\t\t// first we generate the center vertex data of the cap.\n\t\t// because the geometry needs one set of uvs per face,\n\t\t// we must generate a center vertex per face/segment\n\n\t\tfor ( x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t// vertex\n\n\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t// uv\n\n\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t// increase index\n\n\t\t\tindex ++;\n\n\t\t}\n\n\t\t// save the index of the last center vertex\n\n\t\tcenterIndexEnd = index;\n\n\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\tvar u = x / radialSegments;\n\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\tvar cosTheta = Math.cos( theta );\n\t\t\tvar sinTheta = Math.sin( theta );\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * sinTheta;\n\t\t\tvertex.y = halfHeight * sign;\n\t\t\tvertex.z = radius * cosTheta;\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t// uv\n\n\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t// increase index\n\n\t\t\tindex ++;\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\tvar c = centerIndexStart + x;\n\t\t\tvar i = centerIndexEnd + x;\n\n\t\t\tif ( top === true ) {\n\n\t\t\t\t// face top\n\n\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t} else {\n\n\t\t\t\t// face bottom\n\n\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t}\n\n\t\t\tgroupCount += 3;\n\n\t\t}\n\n\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t// calculate new start value for groups\n\n\t\tgroupStart += groupCount;\n\n\t}\n\n}\n\nCylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nCylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry;\n\n/**\n * @author abelnation / http://github.com/abelnation\n */\n\n// ConeGeometry\n\nfunction ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\tCylinderGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\tthis.type = 'ConeGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\theight: height,\n\t\tradialSegments: radialSegments,\n\t\theightSegments: heightSegments,\n\t\topenEnded: openEnded,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n}\n\nConeGeometry.prototype = Object.create( CylinderGeometry.prototype );\nConeGeometry.prototype.constructor = ConeGeometry;\n\n// ConeBufferGeometry\n\nfunction ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\tCylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\tthis.type = 'ConeBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\theight: height,\n\t\tradialSegments: radialSegments,\n\t\theightSegments: heightSegments,\n\t\topenEnded: openEnded,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n}\n\nConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype );\nConeBufferGeometry.prototype.constructor = ConeBufferGeometry;\n\n/**\n * @author benaadams / https://twitter.com/ben_a_adams\n * @author Mugen87 / https://github.com/Mugen87\n * @author hughes\n */\n\n// CircleGeometry\n\nfunction CircleGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'CircleGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tsegments: segments,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tthis.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) );\n\tthis.mergeVertices();\n\n}\n\nCircleGeometry.prototype = Object.create( Geometry.prototype );\nCircleGeometry.prototype.constructor = CircleGeometry;\n\n// CircleBufferGeometry\n\nfunction CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'CircleBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tsegments: segments,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tradius = radius || 1;\n\tsegments = segments !== undefined ? Math.max( 3, segments ) : 8;\n\n\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\t// helper variables\n\n\tvar i, s;\n\tvar vertex = new Vector3();\n\tvar uv = new Vector2();\n\n\t// center point\n\n\tvertices.push( 0, 0, 0 );\n\tnormals.push( 0, 0, 1 );\n\tuvs.push( 0.5, 0.5 );\n\n\tfor ( s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\tvar segment = thetaStart + s / segments * thetaLength;\n\n\t\t// vertex\n\n\t\tvertex.x = radius * Math.cos( segment );\n\t\tvertex.y = radius * Math.sin( segment );\n\n\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t// normal\n\n\t\tnormals.push( 0, 0, 1 );\n\n\t\t// uvs\n\n\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\tuvs.push( uv.x, uv.y );\n\n\t}\n\n\t// indices\n\n\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\tindices.push( i, i + 1, 0 );\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n}\n\nCircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nCircleBufferGeometry.prototype.constructor = CircleBufferGeometry;\n\n\n\nvar Geometries = Object.freeze({\n\tWireframeGeometry: WireframeGeometry,\n\tParametricGeometry: ParametricGeometry,\n\tParametricBufferGeometry: ParametricBufferGeometry,\n\tTetrahedronGeometry: TetrahedronGeometry,\n\tTetrahedronBufferGeometry: TetrahedronBufferGeometry,\n\tOctahedronGeometry: OctahedronGeometry,\n\tOctahedronBufferGeometry: OctahedronBufferGeometry,\n\tIcosahedronGeometry: IcosahedronGeometry,\n\tIcosahedronBufferGeometry: IcosahedronBufferGeometry,\n\tDodecahedronGeometry: DodecahedronGeometry,\n\tDodecahedronBufferGeometry: DodecahedronBufferGeometry,\n\tPolyhedronGeometry: PolyhedronGeometry,\n\tPolyhedronBufferGeometry: PolyhedronBufferGeometry,\n\tTubeGeometry: TubeGeometry,\n\tTubeBufferGeometry: TubeBufferGeometry,\n\tTorusKnotGeometry: TorusKnotGeometry,\n\tTorusKnotBufferGeometry: TorusKnotBufferGeometry,\n\tTorusGeometry: TorusGeometry,\n\tTorusBufferGeometry: TorusBufferGeometry,\n\tTextGeometry: TextGeometry,\n\tTextBufferGeometry: TextBufferGeometry,\n\tSphereGeometry: SphereGeometry,\n\tSphereBufferGeometry: SphereBufferGeometry,\n\tRingGeometry: RingGeometry,\n\tRingBufferGeometry: RingBufferGeometry,\n\tPlaneGeometry: PlaneGeometry,\n\tPlaneBufferGeometry: PlaneBufferGeometry,\n\tLatheGeometry: LatheGeometry,\n\tLatheBufferGeometry: LatheBufferGeometry,\n\tShapeGeometry: ShapeGeometry,\n\tShapeBufferGeometry: ShapeBufferGeometry,\n\tExtrudeGeometry: ExtrudeGeometry,\n\tExtrudeBufferGeometry: ExtrudeBufferGeometry,\n\tEdgesGeometry: EdgesGeometry,\n\tConeGeometry: ConeGeometry,\n\tConeBufferGeometry: ConeBufferGeometry,\n\tCylinderGeometry: CylinderGeometry,\n\tCylinderBufferGeometry: CylinderBufferGeometry,\n\tCircleGeometry: CircleGeometry,\n\tCircleBufferGeometry: CircleBufferGeometry,\n\tBoxGeometry: BoxGeometry,\n\tBoxBufferGeometry: BoxBufferGeometry\n});\n\n/**\n * @author mrdoob / http://mrdoob.com/\n *\n * parameters = {\n * color: \n * }\n */\n\nfunction ShadowMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'ShadowMaterial';\n\n\tthis.color = new Color( 0x000000 );\n\tthis.transparent = true;\n\n\tthis.setValues( parameters );\n\n}\n\nShadowMaterial.prototype = Object.create( Material.prototype );\nShadowMaterial.prototype.constructor = ShadowMaterial;\n\nShadowMaterial.prototype.isShadowMaterial = true;\n\nShadowMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\n\treturn this;\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction RawShaderMaterial( parameters ) {\n\n\tShaderMaterial.call( this, parameters );\n\n\tthis.type = 'RawShaderMaterial';\n\n}\n\nRawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype );\nRawShaderMaterial.prototype.constructor = RawShaderMaterial;\n\nRawShaderMaterial.prototype.isRawShaderMaterial = true;\n\n/**\n * @author WestLangley / http://github.com/WestLangley\n *\n * parameters = {\n * color: ,\n * roughness: ,\n * metalness: ,\n * opacity: ,\n *\n * map: new THREE.Texture( ),\n *\n * lightMap: new THREE.Texture( ),\n * lightMapIntensity: \n *\n * aoMap: new THREE.Texture( ),\n * aoMapIntensity: \n *\n * emissive: ,\n * emissiveIntensity: \n * emissiveMap: new THREE.Texture( ),\n *\n * bumpMap: new THREE.Texture( ),\n * bumpScale: ,\n *\n * normalMap: new THREE.Texture( ),\n * normalScale: ,\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: ,\n *\n * roughnessMap: new THREE.Texture( ),\n *\n * metalnessMap: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n * envMapIntensity: \n *\n * refractionRatio: ,\n *\n * wireframe: ,\n * wireframeLinewidth: ,\n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \n * }\n */\n\nfunction MeshStandardMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.defines = { 'STANDARD': '' };\n\n\tthis.type = 'MeshStandardMaterial';\n\n\tthis.color = new Color( 0xffffff ); // diffuse\n\tthis.roughness = 0.5;\n\tthis.metalness = 0.5;\n\n\tthis.map = null;\n\n\tthis.lightMap = null;\n\tthis.lightMapIntensity = 1.0;\n\n\tthis.aoMap = null;\n\tthis.aoMapIntensity = 1.0;\n\n\tthis.emissive = new Color( 0x000000 );\n\tthis.emissiveIntensity = 1.0;\n\tthis.emissiveMap = null;\n\n\tthis.bumpMap = null;\n\tthis.bumpScale = 1;\n\n\tthis.normalMap = null;\n\tthis.normalScale = new Vector2( 1, 1 );\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.roughnessMap = null;\n\n\tthis.metalnessMap = null;\n\n\tthis.alphaMap = null;\n\n\tthis.envMap = null;\n\tthis.envMapIntensity = 1.0;\n\n\tthis.refractionRatio = 0.98;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\tthis.wireframeLinecap = 'round';\n\tthis.wireframeLinejoin = 'round';\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\tthis.morphNormals = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshStandardMaterial.prototype = Object.create( Material.prototype );\nMeshStandardMaterial.prototype.constructor = MeshStandardMaterial;\n\nMeshStandardMaterial.prototype.isMeshStandardMaterial = true;\n\nMeshStandardMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.defines = { 'STANDARD': '' };\n\n\tthis.color.copy( source.color );\n\tthis.roughness = source.roughness;\n\tthis.metalness = source.metalness;\n\n\tthis.map = source.map;\n\n\tthis.lightMap = source.lightMap;\n\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\tthis.aoMap = source.aoMap;\n\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\tthis.emissive.copy( source.emissive );\n\tthis.emissiveMap = source.emissiveMap;\n\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\tthis.bumpMap = source.bumpMap;\n\tthis.bumpScale = source.bumpScale;\n\n\tthis.normalMap = source.normalMap;\n\tthis.normalScale.copy( source.normalScale );\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\tthis.roughnessMap = source.roughnessMap;\n\n\tthis.metalnessMap = source.metalnessMap;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.envMap = source.envMap;\n\tthis.envMapIntensity = source.envMapIntensity;\n\n\tthis.refractionRatio = source.refractionRatio;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\tthis.wireframeLinecap = source.wireframeLinecap;\n\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\treturn this;\n\n};\n\n/**\n * @author WestLangley / http://github.com/WestLangley\n *\n * parameters = {\n * reflectivity: \n * }\n */\n\nfunction MeshPhysicalMaterial( parameters ) {\n\n\tMeshStandardMaterial.call( this );\n\n\tthis.defines = { 'PHYSICAL': '' };\n\n\tthis.type = 'MeshPhysicalMaterial';\n\n\tthis.reflectivity = 0.5; // maps to F0 = 0.04\n\n\tthis.clearCoat = 0.0;\n\tthis.clearCoatRoughness = 0.0;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype );\nMeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial;\n\nMeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true;\n\nMeshPhysicalMaterial.prototype.copy = function ( source ) {\n\n\tMeshStandardMaterial.prototype.copy.call( this, source );\n\n\tthis.defines = { 'PHYSICAL': '' };\n\n\tthis.reflectivity = source.reflectivity;\n\n\tthis.clearCoat = source.clearCoat;\n\tthis.clearCoatRoughness = source.clearCoatRoughness;\n\n\treturn this;\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n *\n * parameters = {\n * color: ,\n * specular: ,\n * shininess: ,\n * opacity: ,\n *\n * map: new THREE.Texture( ),\n *\n * lightMap: new THREE.Texture( ),\n * lightMapIntensity: \n *\n * aoMap: new THREE.Texture( ),\n * aoMapIntensity: \n *\n * emissive: ,\n * emissiveIntensity: \n * emissiveMap: new THREE.Texture( ),\n *\n * bumpMap: new THREE.Texture( ),\n * bumpScale: ,\n *\n * normalMap: new THREE.Texture( ),\n * normalScale: ,\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: ,\n *\n * specularMap: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n * combine: THREE.Multiply,\n * reflectivity: ,\n * refractionRatio: ,\n *\n * wireframe: ,\n * wireframeLinewidth: ,\n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \n * }\n */\n\nfunction MeshPhongMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshPhongMaterial';\n\n\tthis.color = new Color( 0xffffff ); // diffuse\n\tthis.specular = new Color( 0x111111 );\n\tthis.shininess = 30;\n\n\tthis.map = null;\n\n\tthis.lightMap = null;\n\tthis.lightMapIntensity = 1.0;\n\n\tthis.aoMap = null;\n\tthis.aoMapIntensity = 1.0;\n\n\tthis.emissive = new Color( 0x000000 );\n\tthis.emissiveIntensity = 1.0;\n\tthis.emissiveMap = null;\n\n\tthis.bumpMap = null;\n\tthis.bumpScale = 1;\n\n\tthis.normalMap = null;\n\tthis.normalScale = new Vector2( 1, 1 );\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.specularMap = null;\n\n\tthis.alphaMap = null;\n\n\tthis.envMap = null;\n\tthis.combine = MultiplyOperation;\n\tthis.reflectivity = 1;\n\tthis.refractionRatio = 0.98;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\tthis.wireframeLinecap = 'round';\n\tthis.wireframeLinejoin = 'round';\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\tthis.morphNormals = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshPhongMaterial.prototype = Object.create( Material.prototype );\nMeshPhongMaterial.prototype.constructor = MeshPhongMaterial;\n\nMeshPhongMaterial.prototype.isMeshPhongMaterial = true;\n\nMeshPhongMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\tthis.specular.copy( source.specular );\n\tthis.shininess = source.shininess;\n\n\tthis.map = source.map;\n\n\tthis.lightMap = source.lightMap;\n\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\tthis.aoMap = source.aoMap;\n\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\tthis.emissive.copy( source.emissive );\n\tthis.emissiveMap = source.emissiveMap;\n\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\tthis.bumpMap = source.bumpMap;\n\tthis.bumpScale = source.bumpScale;\n\n\tthis.normalMap = source.normalMap;\n\tthis.normalScale.copy( source.normalScale );\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\tthis.specularMap = source.specularMap;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.envMap = source.envMap;\n\tthis.combine = source.combine;\n\tthis.reflectivity = source.reflectivity;\n\tthis.refractionRatio = source.refractionRatio;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\tthis.wireframeLinecap = source.wireframeLinecap;\n\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\treturn this;\n\n};\n\n/**\n * @author takahirox / http://github.com/takahirox\n *\n * parameters = {\n * gradientMap: new THREE.Texture( )\n * }\n */\n\nfunction MeshToonMaterial( parameters ) {\n\n\tMeshPhongMaterial.call( this );\n\n\tthis.defines = { 'TOON': '' };\n\n\tthis.type = 'MeshToonMaterial';\n\n\tthis.gradientMap = null;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshToonMaterial.prototype = Object.create( MeshPhongMaterial.prototype );\nMeshToonMaterial.prototype.constructor = MeshToonMaterial;\n\nMeshToonMaterial.prototype.isMeshToonMaterial = true;\n\nMeshToonMaterial.prototype.copy = function ( source ) {\n\n\tMeshPhongMaterial.prototype.copy.call( this, source );\n\n\tthis.gradientMap = source.gradientMap;\n\n\treturn this;\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author WestLangley / http://github.com/WestLangley\n *\n * parameters = {\n * opacity: ,\n *\n * bumpMap: new THREE.Texture( ),\n * bumpScale: ,\n *\n * normalMap: new THREE.Texture( ),\n * normalScale: ,\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: ,\n *\n * wireframe: ,\n * wireframeLinewidth: \n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \n * }\n */\n\nfunction MeshNormalMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshNormalMaterial';\n\n\tthis.bumpMap = null;\n\tthis.bumpScale = 1;\n\n\tthis.normalMap = null;\n\tthis.normalScale = new Vector2( 1, 1 );\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\n\tthis.fog = false;\n\tthis.lights = false;\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\tthis.morphNormals = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshNormalMaterial.prototype = Object.create( Material.prototype );\nMeshNormalMaterial.prototype.constructor = MeshNormalMaterial;\n\nMeshNormalMaterial.prototype.isMeshNormalMaterial = true;\n\nMeshNormalMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.bumpMap = source.bumpMap;\n\tthis.bumpScale = source.bumpScale;\n\n\tthis.normalMap = source.normalMap;\n\tthis.normalScale.copy( source.normalScale );\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\treturn this;\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n *\n * parameters = {\n * color: ,\n * opacity: ,\n *\n * map: new THREE.Texture( ),\n *\n * lightMap: new THREE.Texture( ),\n * lightMapIntensity: \n *\n * aoMap: new THREE.Texture( ),\n * aoMapIntensity: \n *\n * emissive: ,\n * emissiveIntensity: \n * emissiveMap: new THREE.Texture( ),\n *\n * specularMap: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n * combine: THREE.Multiply,\n * reflectivity: ,\n * refractionRatio: ,\n *\n * wireframe: ,\n * wireframeLinewidth: ,\n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \n * }\n */\n\nfunction MeshLambertMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshLambertMaterial';\n\n\tthis.color = new Color( 0xffffff ); // diffuse\n\n\tthis.map = null;\n\n\tthis.lightMap = null;\n\tthis.lightMapIntensity = 1.0;\n\n\tthis.aoMap = null;\n\tthis.aoMapIntensity = 1.0;\n\n\tthis.emissive = new Color( 0x000000 );\n\tthis.emissiveIntensity = 1.0;\n\tthis.emissiveMap = null;\n\n\tthis.specularMap = null;\n\n\tthis.alphaMap = null;\n\n\tthis.envMap = null;\n\tthis.combine = MultiplyOperation;\n\tthis.reflectivity = 1;\n\tthis.refractionRatio = 0.98;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\tthis.wireframeLinecap = 'round';\n\tthis.wireframeLinejoin = 'round';\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\tthis.morphNormals = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshLambertMaterial.prototype = Object.create( Material.prototype );\nMeshLambertMaterial.prototype.constructor = MeshLambertMaterial;\n\nMeshLambertMaterial.prototype.isMeshLambertMaterial = true;\n\nMeshLambertMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\n\tthis.map = source.map;\n\n\tthis.lightMap = source.lightMap;\n\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\tthis.aoMap = source.aoMap;\n\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\tthis.emissive.copy( source.emissive );\n\tthis.emissiveMap = source.emissiveMap;\n\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\tthis.specularMap = source.specularMap;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.envMap = source.envMap;\n\tthis.combine = source.combine;\n\tthis.reflectivity = source.reflectivity;\n\tthis.refractionRatio = source.refractionRatio;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\tthis.wireframeLinecap = source.wireframeLinecap;\n\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\treturn this;\n\n};\n\n/**\n * @author alteredq / http://alteredqualia.com/\n *\n * parameters = {\n * color: ,\n * opacity: ,\n *\n * linewidth: ,\n *\n * scale: ,\n * dashSize: ,\n * gapSize: \n * }\n */\n\nfunction LineDashedMaterial( parameters ) {\n\n\tLineBasicMaterial.call( this );\n\n\tthis.type = 'LineDashedMaterial';\n\n\tthis.scale = 1;\n\tthis.dashSize = 3;\n\tthis.gapSize = 1;\n\n\tthis.setValues( parameters );\n\n}\n\nLineDashedMaterial.prototype = Object.create( LineBasicMaterial.prototype );\nLineDashedMaterial.prototype.constructor = LineDashedMaterial;\n\nLineDashedMaterial.prototype.isLineDashedMaterial = true;\n\nLineDashedMaterial.prototype.copy = function ( source ) {\n\n\tLineBasicMaterial.prototype.copy.call( this, source );\n\n\tthis.scale = source.scale;\n\tthis.dashSize = source.dashSize;\n\tthis.gapSize = source.gapSize;\n\n\treturn this;\n\n};\n\n\n\nvar Materials = Object.freeze({\n\tShadowMaterial: ShadowMaterial,\n\tSpriteMaterial: SpriteMaterial,\n\tRawShaderMaterial: RawShaderMaterial,\n\tShaderMaterial: ShaderMaterial,\n\tPointsMaterial: PointsMaterial,\n\tMeshPhysicalMaterial: MeshPhysicalMaterial,\n\tMeshStandardMaterial: MeshStandardMaterial,\n\tMeshPhongMaterial: MeshPhongMaterial,\n\tMeshToonMaterial: MeshToonMaterial,\n\tMeshNormalMaterial: MeshNormalMaterial,\n\tMeshLambertMaterial: MeshLambertMaterial,\n\tMeshDepthMaterial: MeshDepthMaterial,\n\tMeshDistanceMaterial: MeshDistanceMaterial,\n\tMeshBasicMaterial: MeshBasicMaterial,\n\tLineDashedMaterial: LineDashedMaterial,\n\tLineBasicMaterial: LineBasicMaterial,\n\tMaterial: Material\n});\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nvar Cache = {\n\n\tenabled: false,\n\n\tfiles: {},\n\n\tadd: function ( key, file ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// console.log( 'THREE.Cache', 'Adding key:', key );\n\n\t\tthis.files[ key ] = file;\n\n\t},\n\n\tget: function ( key ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// console.log( 'THREE.Cache', 'Checking key:', key );\n\n\t\treturn this.files[ key ];\n\n\t},\n\n\tremove: function ( key ) {\n\n\t\tdelete this.files[ key ];\n\n\t},\n\n\tclear: function () {\n\n\t\tthis.files = {};\n\n\t}\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction LoadingManager( onLoad, onProgress, onError ) {\n\n\tvar scope = this;\n\n\tvar isLoading = false;\n\tvar itemsLoaded = 0;\n\tvar itemsTotal = 0;\n\tvar urlModifier = undefined;\n\n\tthis.onStart = undefined;\n\tthis.onLoad = onLoad;\n\tthis.onProgress = onProgress;\n\tthis.onError = onError;\n\n\tthis.itemStart = function ( url ) {\n\n\t\titemsTotal ++;\n\n\t\tif ( isLoading === false ) {\n\n\t\t\tif ( scope.onStart !== undefined ) {\n\n\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\n\n\t\t\t}\n\n\t\t}\n\n\t\tisLoading = true;\n\n\t};\n\n\tthis.itemEnd = function ( url ) {\n\n\t\titemsLoaded ++;\n\n\t\tif ( scope.onProgress !== undefined ) {\n\n\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\n\n\t\t}\n\n\t\tif ( itemsLoaded === itemsTotal ) {\n\n\t\t\tisLoading = false;\n\n\t\t\tif ( scope.onLoad !== undefined ) {\n\n\t\t\t\tscope.onLoad();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.itemError = function ( url ) {\n\n\t\tif ( scope.onError !== undefined ) {\n\n\t\t\tscope.onError( url );\n\n\t\t}\n\n\t};\n\n\tthis.resolveURL = function ( url ) {\n\n\t\tif ( urlModifier ) {\n\n\t\t\treturn urlModifier( url );\n\n\t\t}\n\n\t\treturn url;\n\n\t};\n\n\tthis.setURLModifier = function ( transform ) {\n\n\t\turlModifier = transform;\n\t\treturn this;\n\n\t};\n\n}\n\nvar DefaultLoadingManager = new LoadingManager();\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nvar loading = {};\n\nfunction FileLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n}\n\nObject.assign( FileLoader.prototype, {\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tvar scope = this;\n\n\t\tvar cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\t// Check if request is duplicate\n\n\t\tif ( loading[ url ] !== undefined ) {\n\n\t\t\tloading[ url ].push( {\n\n\t\t\t\tonLoad: onLoad,\n\t\t\t\tonProgress: onProgress,\n\t\t\t\tonError: onError\n\n\t\t\t} );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Check for data: URI\n\t\tvar dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/;\n\t\tvar dataUriRegexResult = url.match( dataUriRegex );\n\n\t\t// Safari can not handle Data URIs through XMLHttpRequest so process manually\n\t\tif ( dataUriRegexResult ) {\n\n\t\t\tvar mimeType = dataUriRegexResult[ 1 ];\n\t\t\tvar isBase64 = !! dataUriRegexResult[ 2 ];\n\t\t\tvar data = dataUriRegexResult[ 3 ];\n\n\t\t\tdata = window.decodeURIComponent( data );\n\n\t\t\tif ( isBase64 ) data = window.atob( data );\n\n\t\t\ttry {\n\n\t\t\t\tvar response;\n\t\t\t\tvar responseType = ( this.responseType || '' ).toLowerCase();\n\n\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\tcase 'arraybuffer':\n\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\tvar view = new Uint8Array( data.length );\n\n\t\t\t\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\t\t\t\tview[ i ] = data.charCodeAt( i );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( responseType === 'blob' ) {\n\n\t\t\t\t\t\t\tresponse = new Blob( [ view.buffer ], { type: mimeType } );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tresponse = view.buffer;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\tvar parser = new DOMParser();\n\t\t\t\t\t\tresponse = parser.parseFromString( data, mimeType );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\tresponse = JSON.parse( data );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // 'text' or other\n\n\t\t\t\t\t\tresponse = data;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\t// Wait for next browser tick like standard XMLHttpRequest event dispatching does\n\t\t\t\twindow.setTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\t// Wait for next browser tick like standard XMLHttpRequest event dispatching does\n\t\t\t\twindow.setTimeout( function () {\n\n\t\t\t\t\tif ( onError ) onError( error );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// Initialise array for duplicate requests\n\n\t\t\tloading[ url ] = [];\n\n\t\t\tloading[ url ].push( {\n\n\t\t\t\tonLoad: onLoad,\n\t\t\t\tonProgress: onProgress,\n\t\t\t\tonError: onError\n\n\t\t\t} );\n\n\t\t\tvar request = new XMLHttpRequest();\n\n\t\t\trequest.open( 'GET', url, true );\n\n\t\t\trequest.addEventListener( 'load', function ( event ) {\n\n\t\t\t\tvar response = this.response;\n\n\t\t\t\tCache.add( url, response );\n\n\t\t\t\tvar callbacks = loading[ url ];\n\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tif ( this.status === 200 ) {\n\n\t\t\t\t\tfor ( var i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tvar callback = callbacks[ i ];\n\t\t\t\t\t\tif ( callback.onLoad ) callback.onLoad( response );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t} else if ( this.status === 0 ) {\n\n\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\tconsole.warn( 'THREE.FileLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\tfor ( var i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tvar callback = callbacks[ i ];\n\t\t\t\t\t\tif ( callback.onLoad ) callback.onLoad( response );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( var i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tvar callback = callbacks[ i ];\n\t\t\t\t\t\tif ( callback.onError ) callback.onError( event );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t}\n\n\t\t\t}, false );\n\n\t\t\trequest.addEventListener( 'progress', function ( event ) {\n\n\t\t\t\tvar callbacks = loading[ url ];\n\n\t\t\t\tfor ( var i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tvar callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onProgress ) callback.onProgress( event );\n\n\t\t\t\t}\n\n\t\t\t}, false );\n\n\t\t\trequest.addEventListener( 'error', function ( event ) {\n\n\t\t\t\tvar callbacks = loading[ url ];\n\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( var i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tvar callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onError ) callback.onError( event );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemEnd( url );\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}, false );\n\n\t\t\tif ( this.responseType !== undefined ) request.responseType = this.responseType;\n\t\t\tif ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials;\n\n\t\t\tif ( request.overrideMimeType ) request.overrideMimeType( this.mimeType !== undefined ? this.mimeType : 'text/plain' );\n\n\t\t\tfor ( var header in this.requestHeader ) {\n\n\t\t\t\trequest.setRequestHeader( header, this.requestHeader[ header ] );\n\n\t\t\t}\n\n\t\t\trequest.send( null );\n\n\t\t}\n\n\t\tscope.manager.itemStart( url );\n\n\t\treturn request;\n\n\t},\n\n\tsetPath: function ( value ) {\n\n\t\tthis.path = value;\n\t\treturn this;\n\n\t},\n\n\tsetResponseType: function ( value ) {\n\n\t\tthis.responseType = value;\n\t\treturn this;\n\n\t},\n\n\tsetWithCredentials: function ( value ) {\n\n\t\tthis.withCredentials = value;\n\t\treturn this;\n\n\t},\n\n\tsetMimeType: function ( value ) {\n\n\t\tthis.mimeType = value;\n\t\treturn this;\n\n\t},\n\n\tsetRequestHeader: function ( value ) {\n\n\t\tthis.requestHeader = value;\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n *\n * Abstract Base class to block based textures loader (dds, pvr, ...)\n */\n\nfunction CompressedTextureLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t// override in sub classes\n\tthis._parser = null;\n\n}\n\nObject.assign( CompressedTextureLoader.prototype, {\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar images = [];\n\n\t\tvar texture = new CompressedTexture();\n\t\ttexture.image = images;\n\n\t\tvar loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\timages[ i ] = {\n\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t};\n\n\t\t\t\tloaded += 1;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 )\n\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\tif ( Array.isArray( url ) ) {\n\n\t\t\tvar loaded = 0;\n\n\t\t\tfor ( var i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\tvar faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\tfor ( var f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\timages[ f ] = { mipmaps: [] };\n\n\t\t\t\t\t\tfor ( var i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\treturn texture;\n\n\t},\n\n\tsetPath: function ( value ) {\n\n\t\tthis.path = value;\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author Nikos M. / https://github.com/foo123/\n *\n * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)\n */\n\nfunction DataTextureLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t// override in sub classes\n\tthis._parser = null;\n\n}\n\nObject.assign( DataTextureLoader.prototype, {\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar texture = new DataTexture();\n\n\t\tvar loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\tvar texData = scope._parser( buffer );\n\n\t\t\tif ( ! texData ) return;\n\n\t\t\tif ( undefined !== texData.image ) {\n\n\t\t\t\ttexture.image = texData.image;\n\n\t\t\t} else if ( undefined !== texData.data ) {\n\n\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t}\n\n\t\t\ttexture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\ttexture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\ttexture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter;\n\t\t\ttexture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter;\n\n\t\t\ttexture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1;\n\n\t\t\tif ( undefined !== texData.format ) {\n\n\t\t\t\ttexture.format = texData.format;\n\n\t\t\t}\n\t\t\tif ( undefined !== texData.type ) {\n\n\t\t\t\ttexture.type = texData.type;\n\n\t\t\t}\n\n\t\t\tif ( undefined !== texData.mipmaps ) {\n\n\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\n\t\t\t}\n\n\t\t\tif ( 1 === texData.mipmapCount ) {\n\n\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t}\n\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}, onProgress, onError );\n\n\n\t\treturn texture;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction ImageLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n}\n\nObject.assign( ImageLoader.prototype, {\n\n\tcrossOrigin: 'Anonymous',\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tvar scope = this;\n\n\t\tvar cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tvar image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' );\n\n\t\timage.addEventListener( 'load', function () {\n\n\t\t\tCache.add( url, this );\n\n\t\t\tif ( onLoad ) onLoad( this );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}, false );\n\n\t\t/*\n\t\timage.addEventListener( 'progress', function ( event ) {\n\n\t\t\tif ( onProgress ) onProgress( event );\n\n\t\t}, false );\n\t\t*/\n\n\t\timage.addEventListener( 'error', function ( event ) {\n\n\t\t\tif ( onError ) onError( event );\n\n\t\t\tscope.manager.itemEnd( url );\n\t\t\tscope.manager.itemError( url );\n\n\t\t}, false );\n\n\t\tif ( url.substr( 0, 5 ) !== 'data:' ) {\n\n\t\t\tif ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;\n\n\t\t}\n\n\t\tscope.manager.itemStart( url );\n\n\t\timage.src = url;\n\n\t\treturn image;\n\n\t},\n\n\tsetCrossOrigin: function ( value ) {\n\n\t\tthis.crossOrigin = value;\n\t\treturn this;\n\n\t},\n\n\tsetPath: function ( value ) {\n\n\t\tthis.path = value;\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction CubeTextureLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n}\n\nObject.assign( CubeTextureLoader.prototype, {\n\n\tcrossOrigin: 'Anonymous',\n\n\tload: function ( urls, onLoad, onProgress, onError ) {\n\n\t\tvar texture = new CubeTexture();\n\n\t\tvar loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tvar loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\tloaded ++;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, undefined, onError );\n\n\t\t}\n\n\t\tfor ( var i = 0; i < urls.length; ++ i ) {\n\n\t\t\tloadTexture( i );\n\n\t\t}\n\n\t\treturn texture;\n\n\t},\n\n\tsetCrossOrigin: function ( value ) {\n\n\t\tthis.crossOrigin = value;\n\t\treturn this;\n\n\t},\n\n\tsetPath: function ( value ) {\n\n\t\tthis.path = value;\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction TextureLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n}\n\nObject.assign( TextureLoader.prototype, {\n\n\tcrossOrigin: 'Anonymous',\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar texture = new Texture();\n\n\t\tvar loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tloader.load( url, function ( image ) {\n\n\t\t\ttexture.image = image;\n\n\t\t\t// JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB.\n\t\t\tvar isJPEG = url.search( /\\.(jpg|jpeg)$/ ) > 0 || url.search( /^data\\:image\\/jpeg/ ) === 0;\n\n\t\t\ttexture.format = isJPEG ? RGBFormat : RGBAFormat;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\tonLoad( texture );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\treturn texture;\n\n\t},\n\n\tsetCrossOrigin: function ( value ) {\n\n\t\tthis.crossOrigin = value;\n\t\treturn this;\n\n\t},\n\n\tsetPath: function ( value ) {\n\n\t\tthis.path = value;\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n * Extensible curve object\n *\n * Some common of curve methods:\n * .getPoint( t, optionalTarget ), .getTangent( t )\n * .getPointAt( u, optionalTarget ), .getTangentAt( u )\n * .getPoints(), .getSpacedPoints()\n * .getLength()\n * .updateArcLengths()\n *\n * This following curves inherit from THREE.Curve:\n *\n * -- 2D curves --\n * THREE.ArcCurve\n * THREE.CubicBezierCurve\n * THREE.EllipseCurve\n * THREE.LineCurve\n * THREE.QuadraticBezierCurve\n * THREE.SplineCurve\n *\n * -- 3D curves --\n * THREE.CatmullRomCurve3\n * THREE.CubicBezierCurve3\n * THREE.LineCurve3\n * THREE.QuadraticBezierCurve3\n *\n * A series of curves can be represented as a THREE.CurvePath.\n *\n **/\n\n/**************************************************************\n *\tAbstract Curve base class\n **************************************************************/\n\nfunction Curve() {\n\n\tthis.type = 'Curve';\n\n\tthis.arcLengthDivisions = 200;\n\n}\n\nObject.assign( Curve.prototype, {\n\n\t// Virtual base class method to overwrite and implement in subclasses\n\t//\t- t [0 .. 1]\n\n\tgetPoint: function ( /* t, optionalTarget */ ) {\n\n\t\tconsole.warn( 'THREE.Curve: .getPoint() not implemented.' );\n\t\treturn null;\n\n\t},\n\n\t// Get point at relative position in curve according to arc length\n\t// - u [0 .. 1]\n\n\tgetPointAt: function ( u, optionalTarget ) {\n\n\t\tvar t = this.getUtoTmapping( u );\n\t\treturn this.getPoint( t, optionalTarget );\n\n\t},\n\n\t// Get sequence of points using getPoint( t )\n\n\tgetPoints: function ( divisions ) {\n\n\t\tif ( divisions === undefined ) divisions = 5;\n\n\t\tvar points = [];\n\n\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t},\n\n\t// Get sequence of points using getPointAt( u )\n\n\tgetSpacedPoints: function ( divisions ) {\n\n\t\tif ( divisions === undefined ) divisions = 5;\n\n\t\tvar points = [];\n\n\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t},\n\n\t// Get total curve arc length\n\n\tgetLength: function () {\n\n\t\tvar lengths = this.getLengths();\n\t\treturn lengths[ lengths.length - 1 ];\n\n\t},\n\n\t// Get list of cumulative segment lengths\n\n\tgetLengths: function ( divisions ) {\n\n\t\tif ( divisions === undefined ) divisions = this.arcLengthDivisions;\n\n\t\tif ( this.cacheArcLengths &&\n\t\t\t( this.cacheArcLengths.length === divisions + 1 ) &&\n\t\t\t! this.needsUpdate ) {\n\n\t\t\treturn this.cacheArcLengths;\n\n\t\t}\n\n\t\tthis.needsUpdate = false;\n\n\t\tvar cache = [];\n\t\tvar current, last = this.getPoint( 0 );\n\t\tvar p, sum = 0;\n\n\t\tcache.push( 0 );\n\n\t\tfor ( p = 1; p <= divisions; p ++ ) {\n\n\t\t\tcurrent = this.getPoint( p / divisions );\n\t\t\tsum += current.distanceTo( last );\n\t\t\tcache.push( sum );\n\t\t\tlast = current;\n\n\t\t}\n\n\t\tthis.cacheArcLengths = cache;\n\n\t\treturn cache; // { sums: cache, sum: sum }; Sum is in the last element.\n\n\t},\n\n\tupdateArcLengths: function () {\n\n\t\tthis.needsUpdate = true;\n\t\tthis.getLengths();\n\n\t},\n\n\t// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant\n\n\tgetUtoTmapping: function ( u, distance ) {\n\n\t\tvar arcLengths = this.getLengths();\n\n\t\tvar i = 0, il = arcLengths.length;\n\n\t\tvar targetArcLength; // The targeted u distance value to get\n\n\t\tif ( distance ) {\n\n\t\t\ttargetArcLength = distance;\n\n\t\t} else {\n\n\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t}\n\n\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\tvar low = 0, high = il - 1, comparison;\n\n\t\twhile ( low <= high ) {\n\n\t\t\ti = 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\n\n\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\tlow = i + 1;\n\n\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\thigh = i - 1;\n\n\t\t\t} else {\n\n\t\t\t\thigh = i;\n\t\t\t\tbreak;\n\n\t\t\t\t// DONE\n\n\t\t\t}\n\n\t\t}\n\n\t\ti = high;\n\n\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\treturn i / ( il - 1 );\n\n\t\t}\n\n\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\tvar lengthBefore = arcLengths[ i ];\n\t\tvar lengthAfter = arcLengths[ i + 1 ];\n\n\t\tvar segmentLength = lengthAfter - lengthBefore;\n\n\t\t// determine where we are between the 'before' and 'after' points\n\n\t\tvar segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t// add that fractional amount to t\n\n\t\tvar t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\treturn t;\n\n\t},\n\n\t// Returns a unit vector tangent at t\n\t// In case any sub curve does not implement its tangent derivation,\n\t// 2 points a small delta apart will be used to find its gradient\n\t// which seems to give a reasonable approximation\n\n\tgetTangent: function ( t ) {\n\n\t\tvar delta = 0.0001;\n\t\tvar t1 = t - delta;\n\t\tvar t2 = t + delta;\n\n\t\t// Capping in case of danger\n\n\t\tif ( t1 < 0 ) t1 = 0;\n\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\tvar pt1 = this.getPoint( t1 );\n\t\tvar pt2 = this.getPoint( t2 );\n\n\t\tvar vec = pt2.clone().sub( pt1 );\n\t\treturn vec.normalize();\n\n\t},\n\n\tgetTangentAt: function ( u ) {\n\n\t\tvar t = this.getUtoTmapping( u );\n\t\treturn this.getTangent( t );\n\n\t},\n\n\tcomputeFrenetFrames: function ( segments, closed ) {\n\n\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\tvar normal = new Vector3();\n\n\t\tvar tangents = [];\n\t\tvar normals = [];\n\t\tvar binormals = [];\n\n\t\tvar vec = new Vector3();\n\t\tvar mat = new Matrix4();\n\n\t\tvar i, u, theta;\n\n\t\t// compute the tangent vectors for each segment on the curve\n\n\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\tu = i / segments;\n\n\t\t\ttangents[ i ] = this.getTangentAt( u );\n\t\t\ttangents[ i ].normalize();\n\n\t\t}\n\n\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t// and in the direction of the minimum tangent xyz component\n\n\t\tnormals[ 0 ] = new Vector3();\n\t\tbinormals[ 0 ] = new Vector3();\n\t\tvar min = Number.MAX_VALUE;\n\t\tvar tx = Math.abs( tangents[ 0 ].x );\n\t\tvar ty = Math.abs( tangents[ 0 ].y );\n\t\tvar tz = Math.abs( tangents[ 0 ].z );\n\n\t\tif ( tx <= min ) {\n\n\t\t\tmin = tx;\n\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t}\n\n\t\tif ( ty <= min ) {\n\n\t\t\tmin = ty;\n\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t}\n\n\t\tif ( tz <= min ) {\n\n\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t}\n\n\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\tvec.normalize();\n\n\t\t\t\ttheta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t}\n\n\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t}\n\n\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\tif ( closed === true ) {\n\n\t\t\ttheta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) );\n\t\t\ttheta /= segments;\n\n\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\ttheta = - theta;\n\n\t\t\t}\n\n\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t// twist a little...\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttangents: tangents,\n\t\t\tnormals: normals,\n\t\t\tbinormals: binormals\n\t\t};\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.arcLengthDivisions = source.arcLengthDivisions;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tvar data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Curve',\n\t\t\t\tgenerator: 'Curve.toJSON'\n\t\t\t}\n\t\t};\n\n\t\tdata.arcLengthDivisions = this.arcLengthDivisions;\n\t\tdata.type = this.type;\n\n\t\treturn data;\n\n\t},\n\n\tfromJSON: function ( json ) {\n\n\t\tthis.arcLengthDivisions = json.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'EllipseCurve';\n\n\tthis.aX = aX || 0;\n\tthis.aY = aY || 0;\n\n\tthis.xRadius = xRadius || 1;\n\tthis.yRadius = yRadius || 1;\n\n\tthis.aStartAngle = aStartAngle || 0;\n\tthis.aEndAngle = aEndAngle || 2 * Math.PI;\n\n\tthis.aClockwise = aClockwise || false;\n\n\tthis.aRotation = aRotation || 0;\n\n}\n\nEllipseCurve.prototype = Object.create( Curve.prototype );\nEllipseCurve.prototype.constructor = EllipseCurve;\n\nEllipseCurve.prototype.isEllipseCurve = true;\n\nEllipseCurve.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tvar point = optionalTarget || new Vector2();\n\n\tvar twoPi = Math.PI * 2;\n\tvar deltaAngle = this.aEndAngle - this.aStartAngle;\n\tvar samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t// ensures that deltaAngle is 0 .. 2 PI\n\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\tif ( samePoints ) {\n\n\t\t\tdeltaAngle = 0;\n\n\t\t} else {\n\n\t\t\tdeltaAngle = twoPi;\n\n\t\t}\n\n\t}\n\n\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\tdeltaAngle = - twoPi;\n\n\t\t} else {\n\n\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t}\n\n\t}\n\n\tvar angle = this.aStartAngle + t * deltaAngle;\n\tvar x = this.aX + this.xRadius * Math.cos( angle );\n\tvar y = this.aY + this.yRadius * Math.sin( angle );\n\n\tif ( this.aRotation !== 0 ) {\n\n\t\tvar cos = Math.cos( this.aRotation );\n\t\tvar sin = Math.sin( this.aRotation );\n\n\t\tvar tx = x - this.aX;\n\t\tvar ty = y - this.aY;\n\n\t\t// Rotate the point about the center of the ellipse.\n\t\tx = tx * cos - ty * sin + this.aX;\n\t\ty = tx * sin + ty * cos + this.aY;\n\n\t}\n\n\treturn point.set( x, y );\n\n};\n\nEllipseCurve.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.aX = source.aX;\n\tthis.aY = source.aY;\n\n\tthis.xRadius = source.xRadius;\n\tthis.yRadius = source.yRadius;\n\n\tthis.aStartAngle = source.aStartAngle;\n\tthis.aEndAngle = source.aEndAngle;\n\n\tthis.aClockwise = source.aClockwise;\n\n\tthis.aRotation = source.aRotation;\n\n\treturn this;\n\n};\n\n\nEllipseCurve.prototype.toJSON = function () {\n\n\tvar data = Curve.prototype.toJSON.call( this );\n\n\tdata.aX = this.aX;\n\tdata.aY = this.aY;\n\n\tdata.xRadius = this.xRadius;\n\tdata.yRadius = this.yRadius;\n\n\tdata.aStartAngle = this.aStartAngle;\n\tdata.aEndAngle = this.aEndAngle;\n\n\tdata.aClockwise = this.aClockwise;\n\n\tdata.aRotation = this.aRotation;\n\n\treturn data;\n\n};\n\nEllipseCurve.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.aX = json.aX;\n\tthis.aY = json.aY;\n\n\tthis.xRadius = json.xRadius;\n\tthis.yRadius = json.yRadius;\n\n\tthis.aStartAngle = json.aStartAngle;\n\tthis.aEndAngle = json.aEndAngle;\n\n\tthis.aClockwise = json.aClockwise;\n\n\tthis.aRotation = json.aRotation;\n\n\treturn this;\n\n};\n\nfunction ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\tEllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\tthis.type = 'ArcCurve';\n\n}\n\nArcCurve.prototype = Object.create( EllipseCurve.prototype );\nArcCurve.prototype.constructor = ArcCurve;\n\nArcCurve.prototype.isArcCurve = true;\n\n/**\n * @author zz85 https://github.com/zz85\n *\n * Centripetal CatmullRom Curve - which is useful for avoiding\n * cusps and self-intersections in non-uniform catmull rom curves.\n * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n *\n * curve.type accepts centripetal(default), chordal and catmullrom\n * curve.tension is used for catmullrom which defaults to 0.5\n */\n\n\n/*\nBased on an optimized c++ solution in\n - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n - http://ideone.com/NoEbVM\n\nThis CubicPoly class could be used for reusing some variables and calculations,\nbut for three.js curve use, it could be possible inlined and flatten into a single function call\nwhich can be placed in CurveUtils.\n*/\n\nfunction CubicPoly() {\n\n\tvar c0 = 0, c1 = 0, c2 = 0, c3 = 0;\n\n\t/*\n\t * Compute coefficients for a cubic polynomial\n\t * p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t * such that\n\t * p(0) = x0, p(1) = x1\n\t * and\n\t * p'(0) = t0, p'(1) = t1.\n\t */\n\tfunction init( x0, x1, t0, t1 ) {\n\n\t\tc0 = x0;\n\t\tc1 = t0;\n\t\tc2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\tc3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t}\n\n\treturn {\n\n\t\tinitCatmullRom: function ( x0, x1, x2, x3, tension ) {\n\n\t\t\tinit( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t},\n\n\t\tinitNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\tvar t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\tvar t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\tt1 *= dt1;\n\t\t\tt2 *= dt1;\n\n\t\t\tinit( x1, x2, t1, t2 );\n\n\t\t},\n\n\t\tcalc: function ( t ) {\n\n\t\t\tvar t2 = t * t;\n\t\t\tvar t3 = t2 * t;\n\t\t\treturn c0 + c1 * t + c2 * t2 + c3 * t3;\n\n\t\t}\n\n\t};\n\n}\n\n//\n\nvar tmp = new Vector3();\nvar px = new CubicPoly();\nvar py = new CubicPoly();\nvar pz = new CubicPoly();\n\nfunction CatmullRomCurve3( points, closed, curveType, tension ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'CatmullRomCurve3';\n\n\tthis.points = points || [];\n\tthis.closed = closed || false;\n\tthis.curveType = curveType || 'centripetal';\n\tthis.tension = tension || 0.5;\n\n}\n\nCatmullRomCurve3.prototype = Object.create( Curve.prototype );\nCatmullRomCurve3.prototype.constructor = CatmullRomCurve3;\n\nCatmullRomCurve3.prototype.isCatmullRomCurve3 = true;\n\nCatmullRomCurve3.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tvar point = optionalTarget || new Vector3();\n\n\tvar points = this.points;\n\tvar l = points.length;\n\n\tvar p = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\tvar intPoint = Math.floor( p );\n\tvar weight = p - intPoint;\n\n\tif ( this.closed ) {\n\n\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l;\n\n\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\tintPoint = l - 2;\n\t\tweight = 1;\n\n\t}\n\n\tvar p0, p1, p2, p3; // 4 points\n\n\tif ( this.closed || intPoint > 0 ) {\n\n\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t} else {\n\n\t\t// extrapolate first point\n\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\tp0 = tmp;\n\n\t}\n\n\tp1 = points[ intPoint % l ];\n\tp2 = points[ ( intPoint + 1 ) % l ];\n\n\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t} else {\n\n\t\t// extrapolate last point\n\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\tp3 = tmp;\n\n\t}\n\n\tif ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) {\n\n\t\t// init Centripetal / Chordal Catmull-Rom\n\t\tvar pow = this.curveType === 'chordal' ? 0.5 : 0.25;\n\t\tvar dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\tvar dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\tvar dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t// safety check for repeated points\n\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t} else if ( this.curveType === 'catmullrom' ) {\n\n\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension );\n\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension );\n\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension );\n\n\t}\n\n\tpoint.set(\n\t\tpx.calc( weight ),\n\t\tpy.calc( weight ),\n\t\tpz.calc( weight )\n\t);\n\n\treturn point;\n\n};\n\nCatmullRomCurve3.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.points = [];\n\n\tfor ( var i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\tvar point = source.points[ i ];\n\n\t\tthis.points.push( point.clone() );\n\n\t}\n\n\tthis.closed = source.closed;\n\tthis.curveType = source.curveType;\n\tthis.tension = source.tension;\n\n\treturn this;\n\n};\n\nCatmullRomCurve3.prototype.toJSON = function () {\n\n\tvar data = Curve.prototype.toJSON.call( this );\n\n\tdata.points = [];\n\n\tfor ( var i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\tvar point = this.points[ i ];\n\t\tdata.points.push( point.toArray() );\n\n\t}\n\n\tdata.closed = this.closed;\n\tdata.curveType = this.curveType;\n\tdata.tension = this.tension;\n\n\treturn data;\n\n};\n\nCatmullRomCurve3.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.points = [];\n\n\tfor ( var i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\tvar point = json.points[ i ];\n\t\tthis.points.push( new Vector3().fromArray( point ) );\n\n\t}\n\n\tthis.closed = json.closed;\n\tthis.curveType = json.curveType;\n\tthis.tension = json.tension;\n\n\treturn this;\n\n};\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n *\n * Bezier Curves formulas obtained from\n * http://en.wikipedia.org/wiki/Bézier_curve\n */\n\nfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\tvar v0 = ( p2 - p0 ) * 0.5;\n\tvar v1 = ( p3 - p1 ) * 0.5;\n\tvar t2 = t * t;\n\tvar t3 = t * t2;\n\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n}\n\n//\n\nfunction QuadraticBezierP0( t, p ) {\n\n\tvar k = 1 - t;\n\treturn k * k * p;\n\n}\n\nfunction QuadraticBezierP1( t, p ) {\n\n\treturn 2 * ( 1 - t ) * t * p;\n\n}\n\nfunction QuadraticBezierP2( t, p ) {\n\n\treturn t * t * p;\n\n}\n\nfunction QuadraticBezier( t, p0, p1, p2 ) {\n\n\treturn QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +\n\t\tQuadraticBezierP2( t, p2 );\n\n}\n\n//\n\nfunction CubicBezierP0( t, p ) {\n\n\tvar k = 1 - t;\n\treturn k * k * k * p;\n\n}\n\nfunction CubicBezierP1( t, p ) {\n\n\tvar k = 1 - t;\n\treturn 3 * k * k * t * p;\n\n}\n\nfunction CubicBezierP2( t, p ) {\n\n\treturn 3 * ( 1 - t ) * t * t * p;\n\n}\n\nfunction CubicBezierP3( t, p ) {\n\n\treturn t * t * t * p;\n\n}\n\nfunction CubicBezier( t, p0, p1, p2, p3 ) {\n\n\treturn CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +\n\t\tCubicBezierP3( t, p3 );\n\n}\n\nfunction CubicBezierCurve( v0, v1, v2, v3 ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'CubicBezierCurve';\n\n\tthis.v0 = v0 || new Vector2();\n\tthis.v1 = v1 || new Vector2();\n\tthis.v2 = v2 || new Vector2();\n\tthis.v3 = v3 || new Vector2();\n\n}\n\nCubicBezierCurve.prototype = Object.create( Curve.prototype );\nCubicBezierCurve.prototype.constructor = CubicBezierCurve;\n\nCubicBezierCurve.prototype.isCubicBezierCurve = true;\n\nCubicBezierCurve.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tvar point = optionalTarget || new Vector2();\n\n\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\tpoint.set(\n\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t);\n\n\treturn point;\n\n};\n\nCubicBezierCurve.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v0.copy( source.v0 );\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\tthis.v3.copy( source.v3 );\n\n\treturn this;\n\n};\n\nCubicBezierCurve.prototype.toJSON = function () {\n\n\tvar data = Curve.prototype.toJSON.call( this );\n\n\tdata.v0 = this.v0.toArray();\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\tdata.v3 = this.v3.toArray();\n\n\treturn data;\n\n};\n\nCubicBezierCurve.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v0.fromArray( json.v0 );\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\tthis.v3.fromArray( json.v3 );\n\n\treturn this;\n\n};\n\nfunction CubicBezierCurve3( v0, v1, v2, v3 ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'CubicBezierCurve3';\n\n\tthis.v0 = v0 || new Vector3();\n\tthis.v1 = v1 || new Vector3();\n\tthis.v2 = v2 || new Vector3();\n\tthis.v3 = v3 || new Vector3();\n\n}\n\nCubicBezierCurve3.prototype = Object.create( Curve.prototype );\nCubicBezierCurve3.prototype.constructor = CubicBezierCurve3;\n\nCubicBezierCurve3.prototype.isCubicBezierCurve3 = true;\n\nCubicBezierCurve3.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tvar point = optionalTarget || new Vector3();\n\n\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\tpoint.set(\n\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t);\n\n\treturn point;\n\n};\n\nCubicBezierCurve3.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v0.copy( source.v0 );\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\tthis.v3.copy( source.v3 );\n\n\treturn this;\n\n};\n\nCubicBezierCurve3.prototype.toJSON = function () {\n\n\tvar data = Curve.prototype.toJSON.call( this );\n\n\tdata.v0 = this.v0.toArray();\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\tdata.v3 = this.v3.toArray();\n\n\treturn data;\n\n};\n\nCubicBezierCurve3.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v0.fromArray( json.v0 );\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\tthis.v3.fromArray( json.v3 );\n\n\treturn this;\n\n};\n\nfunction LineCurve( v1, v2 ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'LineCurve';\n\n\tthis.v1 = v1 || new Vector2();\n\tthis.v2 = v2 || new Vector2();\n\n}\n\nLineCurve.prototype = Object.create( Curve.prototype );\nLineCurve.prototype.constructor = LineCurve;\n\nLineCurve.prototype.isLineCurve = true;\n\nLineCurve.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tvar point = optionalTarget || new Vector2();\n\n\tif ( t === 1 ) {\n\n\t\tpoint.copy( this.v2 );\n\n\t} else {\n\n\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t}\n\n\treturn point;\n\n};\n\n// Line curve is linear, so we can overwrite default getPointAt\n\nLineCurve.prototype.getPointAt = function ( u, optionalTarget ) {\n\n\treturn this.getPoint( u, optionalTarget );\n\n};\n\nLineCurve.prototype.getTangent = function ( /* t */ ) {\n\n\tvar tangent = this.v2.clone().sub( this.v1 );\n\n\treturn tangent.normalize();\n\n};\n\nLineCurve.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\n\treturn this;\n\n};\n\nLineCurve.prototype.toJSON = function () {\n\n\tvar data = Curve.prototype.toJSON.call( this );\n\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\n\treturn data;\n\n};\n\nLineCurve.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\n\treturn this;\n\n};\n\nfunction LineCurve3( v1, v2 ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'LineCurve3';\n\n\tthis.v1 = v1 || new Vector3();\n\tthis.v2 = v2 || new Vector3();\n\n}\n\nLineCurve3.prototype = Object.create( Curve.prototype );\nLineCurve3.prototype.constructor = LineCurve3;\n\nLineCurve3.prototype.isLineCurve3 = true;\n\nLineCurve3.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tvar point = optionalTarget || new Vector3();\n\n\tif ( t === 1 ) {\n\n\t\tpoint.copy( this.v2 );\n\n\t} else {\n\n\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t}\n\n\treturn point;\n\n};\n\n// Line curve is linear, so we can overwrite default getPointAt\n\nLineCurve3.prototype.getPointAt = function ( u, optionalTarget ) {\n\n\treturn this.getPoint( u, optionalTarget );\n\n};\n\nLineCurve3.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\n\treturn this;\n\n};\n\nLineCurve3.prototype.toJSON = function () {\n\n\tvar data = Curve.prototype.toJSON.call( this );\n\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\n\treturn data;\n\n};\n\nLineCurve3.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\n\treturn this;\n\n};\n\nfunction QuadraticBezierCurve( v0, v1, v2 ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'QuadraticBezierCurve';\n\n\tthis.v0 = v0 || new Vector2();\n\tthis.v1 = v1 || new Vector2();\n\tthis.v2 = v2 || new Vector2();\n\n}\n\nQuadraticBezierCurve.prototype = Object.create( Curve.prototype );\nQuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve;\n\nQuadraticBezierCurve.prototype.isQuadraticBezierCurve = true;\n\nQuadraticBezierCurve.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tvar point = optionalTarget || new Vector2();\n\n\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\tpoint.set(\n\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t);\n\n\treturn point;\n\n};\n\nQuadraticBezierCurve.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v0.copy( source.v0 );\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\n\treturn this;\n\n};\n\nQuadraticBezierCurve.prototype.toJSON = function () {\n\n\tvar data = Curve.prototype.toJSON.call( this );\n\n\tdata.v0 = this.v0.toArray();\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\n\treturn data;\n\n};\n\nQuadraticBezierCurve.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v0.fromArray( json.v0 );\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\n\treturn this;\n\n};\n\nfunction QuadraticBezierCurve3( v0, v1, v2 ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'QuadraticBezierCurve3';\n\n\tthis.v0 = v0 || new Vector3();\n\tthis.v1 = v1 || new Vector3();\n\tthis.v2 = v2 || new Vector3();\n\n}\n\nQuadraticBezierCurve3.prototype = Object.create( Curve.prototype );\nQuadraticBezierCurve3.prototype.constructor = QuadraticBezierCurve3;\n\nQuadraticBezierCurve3.prototype.isQuadraticBezierCurve3 = true;\n\nQuadraticBezierCurve3.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tvar point = optionalTarget || new Vector3();\n\n\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\tpoint.set(\n\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t);\n\n\treturn point;\n\n};\n\nQuadraticBezierCurve3.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v0.copy( source.v0 );\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\n\treturn this;\n\n};\n\nQuadraticBezierCurve3.prototype.toJSON = function () {\n\n\tvar data = Curve.prototype.toJSON.call( this );\n\n\tdata.v0 = this.v0.toArray();\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\n\treturn data;\n\n};\n\nQuadraticBezierCurve3.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v0.fromArray( json.v0 );\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\n\treturn this;\n\n};\n\nfunction SplineCurve( points /* array of Vector2 */ ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'SplineCurve';\n\n\tthis.points = points || [];\n\n}\n\nSplineCurve.prototype = Object.create( Curve.prototype );\nSplineCurve.prototype.constructor = SplineCurve;\n\nSplineCurve.prototype.isSplineCurve = true;\n\nSplineCurve.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tvar point = optionalTarget || new Vector2();\n\n\tvar points = this.points;\n\tvar p = ( points.length - 1 ) * t;\n\n\tvar intPoint = Math.floor( p );\n\tvar weight = p - intPoint;\n\n\tvar p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\tvar p1 = points[ intPoint ];\n\tvar p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\tvar p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\tpoint.set(\n\t\tCatmullRom( weight, p0.x, p1.x, p2.x, p3.x ),\n\t\tCatmullRom( weight, p0.y, p1.y, p2.y, p3.y )\n\t);\n\n\treturn point;\n\n};\n\nSplineCurve.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.points = [];\n\n\tfor ( var i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\tvar point = source.points[ i ];\n\n\t\tthis.points.push( point.clone() );\n\n\t}\n\n\treturn this;\n\n};\n\nSplineCurve.prototype.toJSON = function () {\n\n\tvar data = Curve.prototype.toJSON.call( this );\n\n\tdata.points = [];\n\n\tfor ( var i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\tvar point = this.points[ i ];\n\t\tdata.points.push( point.toArray() );\n\n\t}\n\n\treturn data;\n\n};\n\nSplineCurve.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.points = [];\n\n\tfor ( var i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\tvar point = json.points[ i ];\n\t\tthis.points.push( new Vector2().fromArray( point ) );\n\n\t}\n\n\treturn this;\n\n};\n\n\n\nvar Curves = Object.freeze({\n\tArcCurve: ArcCurve,\n\tCatmullRomCurve3: CatmullRomCurve3,\n\tCubicBezierCurve: CubicBezierCurve,\n\tCubicBezierCurve3: CubicBezierCurve3,\n\tEllipseCurve: EllipseCurve,\n\tLineCurve: LineCurve,\n\tLineCurve3: LineCurve3,\n\tQuadraticBezierCurve: QuadraticBezierCurve,\n\tQuadraticBezierCurve3: QuadraticBezierCurve3,\n\tSplineCurve: SplineCurve\n});\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n *\n **/\n\n/**************************************************************\n *\tCurved Path - a curve path is simply a array of connected\n * curves, but retains the api of a curve\n **************************************************************/\n\nfunction CurvePath() {\n\n\tCurve.call( this );\n\n\tthis.type = 'CurvePath';\n\n\tthis.curves = [];\n\tthis.autoClose = false; // Automatically closes the path\n\n}\n\nCurvePath.prototype = Object.assign( Object.create( Curve.prototype ), {\n\n\tconstructor: CurvePath,\n\n\tadd: function ( curve ) {\n\n\t\tthis.curves.push( curve );\n\n\t},\n\n\tclosePath: function () {\n\n\t\t// Add a line curve if start and end of lines are not connected\n\t\tvar startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\tvar endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\tthis.curves.push( new LineCurve( endPoint, startPoint ) );\n\n\t\t}\n\n\t},\n\n\t// To get accurate point with reference to\n\t// entire path distance at time t,\n\t// following has to be done:\n\n\t// 1. Length of each sub path have to be known\n\t// 2. Locate and identify type of curve\n\t// 3. Get t for the curve\n\t// 4. Return curve.getPointAt(t')\n\n\tgetPoint: function ( t ) {\n\n\t\tvar d = t * this.getLength();\n\t\tvar curveLengths = this.getCurveLengths();\n\t\tvar i = 0;\n\n\t\t// To think about boundaries points.\n\n\t\twhile ( i < curveLengths.length ) {\n\n\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\tvar diff = curveLengths[ i ] - d;\n\t\t\t\tvar curve = this.curves[ i ];\n\n\t\t\t\tvar segmentLength = curve.getLength();\n\t\t\t\tvar u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\treturn curve.getPointAt( u );\n\n\t\t\t}\n\n\t\t\ti ++;\n\n\t\t}\n\n\t\treturn null;\n\n\t\t// loop where sum != 0, sum > d , sum+1 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tCurve.prototype.copy.call( this, source );\n\n\t\tthis.curves = [];\n\n\t\tfor ( var i = 0, l = source.curves.length; i < l; i ++ ) {\n\n\t\t\tvar curve = source.curves[ i ];\n\n\t\t\tthis.curves.push( curve.clone() );\n\n\t\t}\n\n\t\tthis.autoClose = source.autoClose;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tvar data = Curve.prototype.toJSON.call( this );\n\n\t\tdata.autoClose = this.autoClose;\n\t\tdata.curves = [];\n\n\t\tfor ( var i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tvar curve = this.curves[ i ];\n\t\t\tdata.curves.push( curve.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t},\n\n\tfromJSON: function ( json ) {\n\n\t\tCurve.prototype.fromJSON.call( this, json );\n\n\t\tthis.autoClose = json.autoClose;\n\t\tthis.curves = [];\n\n\t\tfor ( var i = 0, l = json.curves.length; i < l; i ++ ) {\n\n\t\t\tvar curve = json.curves[ i ];\n\t\t\tthis.curves.push( new Curves[ curve.type ]().fromJSON( curve ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n * Creates free form 2d path using series of points, lines or curves.\n **/\n\nfunction Path( points ) {\n\n\tCurvePath.call( this );\n\n\tthis.type = 'Path';\n\n\tthis.currentPoint = new Vector2();\n\n\tif ( points ) {\n\n\t\tthis.setFromPoints( points );\n\n\t}\n\n}\n\nPath.prototype = Object.assign( Object.create( CurvePath.prototype ), {\n\n\tconstructor: Path,\n\n\tsetFromPoints: function ( points ) {\n\n\t\tthis.moveTo( points[ 0 ].x, points[ 0 ].y );\n\n\t\tfor ( var i = 1, l = points.length; i < l; i ++ ) {\n\n\t\t\tthis.lineTo( points[ i ].x, points[ i ].y );\n\n\t\t}\n\n\t},\n\n\tmoveTo: function ( x, y ) {\n\n\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t},\n\n\tlineTo: function ( x, y ) {\n\n\t\tvar curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( x, y );\n\n\t},\n\n\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\tvar curve = new QuadraticBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t},\n\n\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tvar curve = new CubicBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t},\n\n\tsplineThru: function ( pts /*Array of Vector*/ ) {\n\n\t\tvar npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\tvar curve = new SplineCurve( npts );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t},\n\n\tarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tvar x0 = this.currentPoint.x;\n\t\tvar y0 = this.currentPoint.y;\n\n\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t},\n\n\tabsarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t},\n\n\tellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tvar x0 = this.currentPoint.x;\n\t\tvar y0 = this.currentPoint.y;\n\n\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t},\n\n\tabsellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tvar curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t// if a previous curve is present, attempt to join\n\t\t\tvar firstPoint = curve.getPoint( 0 );\n\n\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.curves.push( curve );\n\n\t\tvar lastPoint = curve.getPoint( 1 );\n\t\tthis.currentPoint.copy( lastPoint );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tCurvePath.prototype.copy.call( this, source );\n\n\t\tthis.currentPoint.copy( source.currentPoint );\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tvar data = CurvePath.prototype.toJSON.call( this );\n\n\t\tdata.currentPoint = this.currentPoint.toArray();\n\n\t\treturn data;\n\n\t},\n\n\tfromJSON: function ( json ) {\n\n\t\tCurvePath.prototype.fromJSON.call( this, json );\n\n\t\tthis.currentPoint.fromArray( json.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n * Defines a 2d shape plane using paths.\n **/\n\n// STEP 1 Create a path.\n// STEP 2 Turn path into shape.\n// STEP 3 ExtrudeGeometry takes in Shape/Shapes\n// STEP 3a - Extract points from each shape, turn to vertices\n// STEP 3b - Triangulate each shape, add faces.\n\nfunction Shape( points ) {\n\n\tPath.call( this, points );\n\n\tthis.uuid = _Math.generateUUID();\n\n\tthis.type = 'Shape';\n\n\tthis.holes = [];\n\n}\n\nShape.prototype = Object.assign( Object.create( Path.prototype ), {\n\n\tconstructor: Shape,\n\n\tgetPointsHoles: function ( divisions ) {\n\n\t\tvar holesPts = [];\n\n\t\tfor ( var i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t}\n\n\t\treturn holesPts;\n\n\t},\n\n\t// get points of shape and holes (keypoints based on segments parameter)\n\n\textractPoints: function ( divisions ) {\n\n\t\treturn {\n\n\t\t\tshape: this.getPoints( divisions ),\n\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t};\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tPath.prototype.copy.call( this, source );\n\n\t\tthis.holes = [];\n\n\t\tfor ( var i = 0, l = source.holes.length; i < l; i ++ ) {\n\n\t\t\tvar hole = source.holes[ i ];\n\n\t\t\tthis.holes.push( hole.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tvar data = Path.prototype.toJSON.call( this );\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.holes = [];\n\n\t\tfor ( var i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tvar hole = this.holes[ i ];\n\t\t\tdata.holes.push( hole.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t},\n\n\tfromJSON: function ( json ) {\n\n\t\tPath.prototype.fromJSON.call( this, json );\n\n\t\tthis.uuid = json.uuid;\n\t\tthis.holes = [];\n\n\t\tfor ( var i = 0, l = json.holes.length; i < l; i ++ ) {\n\n\t\t\tvar hole = json.holes[ i ];\n\t\t\tthis.holes.push( new Path().fromJSON( hole ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction Light( color, intensity ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Light';\n\n\tthis.color = new Color( color );\n\tthis.intensity = intensity !== undefined ? intensity : 1;\n\n\tthis.receiveShadow = undefined;\n\n}\n\nLight.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Light,\n\n\tisLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.intensity = source.intensity;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tdata.object.color = this.color.getHex();\n\t\tdata.object.intensity = this.intensity;\n\n\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\n\t\treturn data;\n\n\t}\n\n} );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction HemisphereLight( skyColor, groundColor, intensity ) {\n\n\tLight.call( this, skyColor, intensity );\n\n\tthis.type = 'HemisphereLight';\n\n\tthis.castShadow = undefined;\n\n\tthis.position.copy( Object3D.DefaultUp );\n\tthis.updateMatrix();\n\n\tthis.groundColor = new Color( groundColor );\n\n}\n\nHemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: HemisphereLight,\n\n\tisHemisphereLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.groundColor.copy( source.groundColor );\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction LightShadow( camera ) {\n\n\tthis.camera = camera;\n\n\tthis.bias = 0;\n\tthis.radius = 1;\n\n\tthis.mapSize = new Vector2( 512, 512 );\n\n\tthis.map = null;\n\tthis.matrix = new Matrix4();\n\n}\n\nObject.assign( LightShadow.prototype, {\n\n\tcopy: function ( source ) {\n\n\t\tthis.camera = source.camera.clone();\n\n\t\tthis.bias = source.bias;\n\t\tthis.radius = source.radius;\n\n\t\tthis.mapSize.copy( source.mapSize );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tvar object = {};\n\n\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\tdelete object.camera.matrix;\n\n\t\treturn object;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction SpotLightShadow() {\n\n\tLightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n}\n\nSpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\tconstructor: SpotLightShadow,\n\n\tisSpotLightShadow: true,\n\n\tupdate: function ( light ) {\n\n\t\tvar camera = this.camera;\n\n\t\tvar fov = _Math.RAD2DEG * 2 * light.angle;\n\t\tvar aspect = this.mapSize.width / this.mapSize.height;\n\t\tvar far = light.distance || camera.far;\n\n\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\tcamera.fov = fov;\n\t\t\tcamera.aspect = aspect;\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t}\n\n} );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction SpotLight( color, intensity, distance, angle, penumbra, decay ) {\n\n\tLight.call( this, color, intensity );\n\n\tthis.type = 'SpotLight';\n\n\tthis.position.copy( Object3D.DefaultUp );\n\tthis.updateMatrix();\n\n\tthis.target = new Object3D();\n\n\tObject.defineProperty( this, 'power', {\n\t\tget: function () {\n\n\t\t\t// intensity = power per solid angle.\n\t\t\t// ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\n\t\t\treturn this.intensity * Math.PI;\n\n\t\t},\n\t\tset: function ( power ) {\n\n\t\t\t// intensity = power per solid angle.\n\t\t\t// ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\n\t\t\tthis.intensity = power / Math.PI;\n\n\t\t}\n\t} );\n\n\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\tthis.angle = ( angle !== undefined ) ? angle : Math.PI / 3;\n\tthis.penumbra = ( penumbra !== undefined ) ? penumbra : 0;\n\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\tthis.shadow = new SpotLightShadow();\n\n}\n\nSpotLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: SpotLight,\n\n\tisSpotLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.distance = source.distance;\n\t\tthis.angle = source.angle;\n\t\tthis.penumbra = source.penumbra;\n\t\tthis.decay = source.decay;\n\n\t\tthis.target = source.target.clone();\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\n\nfunction PointLight( color, intensity, distance, decay ) {\n\n\tLight.call( this, color, intensity );\n\n\tthis.type = 'PointLight';\n\n\tObject.defineProperty( this, 'power', {\n\t\tget: function () {\n\n\t\t\t// intensity = power per solid angle.\n\t\t\t// ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\n\t\t\treturn this.intensity * 4 * Math.PI;\n\n\t\t},\n\t\tset: function ( power ) {\n\n\t\t\t// intensity = power per solid angle.\n\t\t\t// ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\n\t\t\tthis.intensity = power / ( 4 * Math.PI );\n\n\t\t}\n\t} );\n\n\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\tthis.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n}\n\nPointLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: PointLight,\n\n\tisPointLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.distance = source.distance;\n\t\tthis.decay = source.decay;\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction DirectionalLightShadow( ) {\n\n\tLightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );\n\n}\n\nDirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\tconstructor: DirectionalLightShadow\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction DirectionalLight( color, intensity ) {\n\n\tLight.call( this, color, intensity );\n\n\tthis.type = 'DirectionalLight';\n\n\tthis.position.copy( Object3D.DefaultUp );\n\tthis.updateMatrix();\n\n\tthis.target = new Object3D();\n\n\tthis.shadow = new DirectionalLightShadow();\n\n}\n\nDirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: DirectionalLight,\n\n\tisDirectionalLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.target = source.target.clone();\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction AmbientLight( color, intensity ) {\n\n\tLight.call( this, color, intensity );\n\n\tthis.type = 'AmbientLight';\n\n\tthis.castShadow = undefined;\n\n}\n\nAmbientLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: AmbientLight,\n\n\tisAmbientLight: true\n\n} );\n\n/**\n * @author abelnation / http://github.com/abelnation\n */\n\nfunction RectAreaLight( color, intensity, width, height ) {\n\n\tLight.call( this, color, intensity );\n\n\tthis.type = 'RectAreaLight';\n\n\tthis.width = ( width !== undefined ) ? width : 10;\n\tthis.height = ( height !== undefined ) ? height : 10;\n\n}\n\nRectAreaLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: RectAreaLight,\n\n\tisRectAreaLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tvar data = Light.prototype.toJSON.call( this, meta );\n\n\t\tdata.object.width = this.width;\n\t\tdata.object.height = this.height;\n\n\t\treturn data;\n\n\t}\n\n} );\n\n/**\n *\n * A Track that interpolates Strings\n *\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\nfunction StringKeyframeTrack( name, times, values, interpolation ) {\n\n\tKeyframeTrack.call( this, name, times, values, interpolation );\n\n}\n\nStringKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: StringKeyframeTrack,\n\n\tValueTypeName: 'string',\n\tValueBufferType: Array,\n\n\tDefaultInterpolation: InterpolateDiscrete,\n\n\tInterpolantFactoryMethodLinear: undefined,\n\n\tInterpolantFactoryMethodSmooth: undefined\n\n} );\n\n/**\n *\n * A Track of Boolean keyframe values.\n *\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\nfunction BooleanKeyframeTrack( name, times, values ) {\n\n\tKeyframeTrack.call( this, name, times, values );\n\n}\n\nBooleanKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: BooleanKeyframeTrack,\n\n\tValueTypeName: 'bool',\n\tValueBufferType: Array,\n\n\tDefaultInterpolation: InterpolateDiscrete,\n\n\tInterpolantFactoryMethodLinear: undefined,\n\tInterpolantFactoryMethodSmooth: undefined\n\n\t// Note: Actually this track could have a optimized / compressed\n\t// representation of a single value and a custom interpolant that\n\t// computes \"firstValue ^ isOdd( index )\".\n\n} );\n\n/**\n * Abstract base class of interpolants over parametric samples.\n *\n * The parameter domain is one dimensional, typically the time or a path\n * along a curve defined by the data.\n *\n * The sample values can have any dimensionality and derived classes may\n * apply special interpretations to the data.\n *\n * This class provides the interval seek in a Template Method, deferring\n * the actual interpolation to derived classes.\n *\n * Time complexity is O(1) for linear access crossing at most two points\n * and O(log N) for random access, where N is the number of positions.\n *\n * References:\n *\n * \t\thttp://www.oodesign.com/template-method-pattern.html\n *\n * @author tschw\n */\n\nfunction Interpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\tthis.parameterPositions = parameterPositions;\n\tthis._cachedIndex = 0;\n\n\tthis.resultBuffer = resultBuffer !== undefined ?\n\t\tresultBuffer : new sampleValues.constructor( sampleSize );\n\tthis.sampleValues = sampleValues;\n\tthis.valueSize = sampleSize;\n\n}\n\nObject.assign( Interpolant.prototype, {\n\n\tevaluate: function ( t ) {\n\n\t\tvar pp = this.parameterPositions,\n\t\t\ti1 = this._cachedIndex,\n\n\t\t\tt1 = pp[ i1 ],\n\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\tvalidate_interval: {\n\n\t\t\tseek: {\n\n\t\t\t\tvar right;\n\n\t\t\t\tlinear_scan: {\n\n\t\t\t\t\t//- See http://jsperf.com/comparison-to-undefined/3\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\n\t\t\t\t\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\tfor ( var giveUpAt = i1 + 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t, t0 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the right side of the index\n\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\tvar t1global = pp[ 1 ];\n\n\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\tfor ( var giveUpAt = i1 - 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the left side of the index\n\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t} // linear scan\n\n\t\t\t\t// binary search\n\n\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\tvar mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t// check boundary cases, again\n\n\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\treturn this.afterEnd_( i1 - 1, t0, t );\n\n\t\t\t\t}\n\n\t\t\t} // seek\n\n\t\t\tthis._cachedIndex = i1;\n\n\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t} // validate_interval\n\n\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t},\n\n\tsettings: null, // optional, subclass-specific settings structure\n\t// Note: The indirection allows central control of many interpolants.\n\n\t// --- Protected interface\n\n\tDefaultSettings_: {},\n\n\tgetSettings_: function () {\n\n\t\treturn this.settings || this.DefaultSettings_;\n\n\t},\n\n\tcopySampleValue_: function ( index ) {\n\n\t\t// copies a sample value to the result buffer\n\n\t\tvar result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = index * stride;\n\n\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t},\n\n\t// Template methods for derived classes:\n\n\tinterpolate_: function ( /* i1, t0, t, t1 */ ) {\n\n\t\tthrow new Error( 'call to abstract method' );\n\t\t// implementations shall return this.resultBuffer\n\n\t},\n\n\tintervalChanged_: function ( /* i1, t0, t1 */ ) {\n\n\t\t// empty\n\n\t}\n\n} );\n\n//!\\ DECLARE ALIAS AFTER assign prototype !\nObject.assign( Interpolant.prototype, {\n\n\t//( 0, t, t0 ), returns this.resultBuffer\n\tbeforeStart_: Interpolant.prototype.copySampleValue_,\n\n\t//( N-1, tN-1, t ), returns this.resultBuffer\n\tafterEnd_: Interpolant.prototype.copySampleValue_,\n\n} );\n\n/**\n * Spherical linear unit quaternion interpolant.\n *\n * @author tschw\n */\n\nfunction QuaternionLinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\tInterpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n}\n\nQuaternionLinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {\n\n\tconstructor: QuaternionLinearInterpolant,\n\n\tinterpolate_: function ( i1, t0, t, t1 ) {\n\n\t\tvar result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\toffset = i1 * stride,\n\n\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\tfor ( var end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\tQuaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n} );\n\n/**\n *\n * A Track of quaternion keyframe values.\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\nfunction QuaternionKeyframeTrack( name, times, values, interpolation ) {\n\n\tKeyframeTrack.call( this, name, times, values, interpolation );\n\n}\n\nQuaternionKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: QuaternionKeyframeTrack,\n\n\tValueTypeName: 'quaternion',\n\n\t// ValueBufferType is inherited\n\n\tDefaultInterpolation: InterpolateLinear,\n\n\tInterpolantFactoryMethodLinear: function ( result ) {\n\n\t\treturn new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t},\n\n\tInterpolantFactoryMethodSmooth: undefined // not yet implemented\n\n} );\n\n/**\n *\n * A Track of keyframe values that represent color.\n *\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\nfunction ColorKeyframeTrack( name, times, values, interpolation ) {\n\n\tKeyframeTrack.call( this, name, times, values, interpolation );\n\n}\n\nColorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: ColorKeyframeTrack,\n\n\tValueTypeName: 'color'\n\n\t// ValueBufferType is inherited\n\n\t// DefaultInterpolation is inherited\n\n\t// Note: Very basic implementation and nothing special yet.\n\t// However, this is the place for color space parameterization.\n\n} );\n\n/**\n *\n * A Track of numeric keyframe values.\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\nfunction NumberKeyframeTrack( name, times, values, interpolation ) {\n\n\tKeyframeTrack.call( this, name, times, values, interpolation );\n\n}\n\nNumberKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: NumberKeyframeTrack,\n\n\tValueTypeName: 'number'\n\n\t// ValueBufferType is inherited\n\n\t// DefaultInterpolation is inherited\n\n} );\n\n/**\n * Fast and simple cubic spline interpolant.\n *\n * It was derived from a Hermitian construction setting the first derivative\n * at each sample position to the linear slope between neighboring positions\n * over their parameter interval.\n *\n * @author tschw\n */\n\nfunction CubicInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\tInterpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\tthis._weightPrev = - 0;\n\tthis._offsetPrev = - 0;\n\tthis._weightNext = - 0;\n\tthis._offsetNext = - 0;\n\n}\n\nCubicInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {\n\n\tconstructor: CubicInterpolant,\n\n\tDefaultSettings_: {\n\n\t\tendingStart: ZeroCurvatureEnding,\n\t\tendingEnd: ZeroCurvatureEnding\n\n\t},\n\n\tintervalChanged_: function ( i1, t0, t1 ) {\n\n\t\tvar pp = this.parameterPositions,\n\t\t\tiPrev = i1 - 2,\n\t\t\tiNext = i1 + 1,\n\n\t\t\ttPrev = pp[ iPrev ],\n\t\t\ttNext = pp[ iNext ];\n\n\t\tif ( tPrev === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = t1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tNext === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\tiNext = i1;\n\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiNext = 1;\n\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\ttNext = t0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar halfDt = ( t1 - t0 ) * 0.5,\n\t\t\tstride = this.valueSize;\n\n\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\tthis._offsetPrev = iPrev * stride;\n\t\tthis._offsetNext = iNext * stride;\n\n\t},\n\n\tinterpolate_: function ( i1, t0, t, t1 ) {\n\n\t\tvar result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tpp = p * p,\n\t\t\tppp = pp * p;\n\n\t\t// evaluate polynomials\n\n\t\tvar sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\tvar s0 = ( 1 + wP ) * ppp + ( - 1.5 - 2 * wP ) * pp + ( - 0.5 + wP ) * p + 1;\n\t\tvar s1 = ( - 1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\tvar sN = wN * ppp - wN * pp;\n\n\t\t// combine data linearly\n\n\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n} );\n\n/**\n * @author tschw\n */\n\nfunction LinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\tInterpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n}\n\nLinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {\n\n\tconstructor: LinearInterpolant,\n\n\tinterpolate_: function ( i1, t0, t, t1 ) {\n\n\t\tvar result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\toffset1 = i1 * stride,\n\t\t\toffset0 = offset1 - stride,\n\n\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tweight0 = 1 - weight1;\n\n\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n} );\n\n/**\n *\n * Interpolant that evaluates to the sample value at the position preceeding\n * the parameter.\n *\n * @author tschw\n */\n\nfunction DiscreteInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\tInterpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n}\n\nDiscreteInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {\n\n\tconstructor: DiscreteInterpolant,\n\n\tinterpolate_: function ( i1 /*, t0, t, t1 */ ) {\n\n\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t}\n\n} );\n\n/**\n * @author tschw\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n */\n\nvar AnimationUtils = {\n\n\t// same as Array.prototype.slice, but also works on typed arrays\n\tarraySlice: function ( array, from, to ) {\n\n\t\tif ( AnimationUtils.isTypedArray( array ) ) {\n\n\t\t\t// in ios9 array.subarray(from, undefined) will return empty array\n\t\t\t// but array.subarray(from) or array.subarray(from, len) is correct\n\t\t\treturn new array.constructor( array.subarray( from, to !== undefined ? to : array.length ) );\n\n\t\t}\n\n\t\treturn array.slice( from, to );\n\n\t},\n\n\t// converts an array to a specific type\n\tconvertArray: function ( array, type, forceClone ) {\n\n\t\tif ( ! array || // let 'undefined' and 'null' pass\n\t\t\t\t! forceClone && array.constructor === type ) return array;\n\n\t\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\t\treturn new type( array ); // create typed array\n\n\t\t}\n\n\t\treturn Array.prototype.slice.call( array ); // create Array\n\n\t},\n\n\tisTypedArray: function ( object ) {\n\n\t\treturn ArrayBuffer.isView( object ) &&\n\t\t\t\t! ( object instanceof DataView );\n\n\t},\n\n\t// returns an array by which times and values can be sorted\n\tgetKeyframeOrder: function ( times ) {\n\n\t\tfunction compareTime( i, j ) {\n\n\t\t\treturn times[ i ] - times[ j ];\n\n\t\t}\n\n\t\tvar n = times.length;\n\t\tvar result = new Array( n );\n\t\tfor ( var i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\t\tresult.sort( compareTime );\n\n\t\treturn result;\n\n\t},\n\n\t// uses the array previously returned by 'getKeyframeOrder' to sort data\n\tsortedArray: function ( values, stride, order ) {\n\n\t\tvar nValues = values.length;\n\t\tvar result = new values.constructor( nValues );\n\n\t\tfor ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\t\tvar srcOffset = order[ i ] * stride;\n\n\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn result;\n\n\t},\n\n\t// function for parsing AOS keyframe formats\n\tflattenJSON: function ( jsonKeys, times, values, valuePropertyName ) {\n\n\t\tvar i = 1, key = jsonKeys[ 0 ];\n\n\t\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t}\n\n\t\tif ( key === undefined ) return; // no data\n\n\t\tvar value = key[ valuePropertyName ];\n\t\tif ( value === undefined ) return; // no data\n\n\t\tif ( Array.isArray( value ) ) {\n\n\t\t\tdo {\n\n\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\tvalues.push.apply( values, value ); // push all elements\n\n\t\t\t\t}\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t} while ( key !== undefined );\n\n\t\t} else if ( value.toArray !== undefined ) {\n\n\t\t\t// ...assume THREE.Math-ish\n\n\t\t\tdo {\n\n\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t\t}\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t} while ( key !== undefined );\n\n\t\t} else {\n\n\t\t\t// otherwise push as-is\n\n\t\t\tdo {\n\n\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\tvalues.push( value );\n\n\t\t\t\t}\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t} while ( key !== undefined );\n\n\t\t}\n\n\t}\n\n};\n\n/**\n *\n * A timed sequence of keyframes for a specific property.\n *\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\nfunction KeyframeTrack( name, times, values, interpolation ) {\n\n\tif ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' );\n\tif ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name );\n\n\tthis.name = name;\n\n\tthis.times = AnimationUtils.convertArray( times, this.TimeBufferType );\n\tthis.values = AnimationUtils.convertArray( values, this.ValueBufferType );\n\n\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\tthis.validate();\n\tthis.optimize();\n\n}\n\n// Static methods:\n\nObject.assign( KeyframeTrack, {\n\n\t// Serialization (in static context, because of constructor invocation\n\t// and automatic invocation of .toJSON):\n\n\tparse: function ( json ) {\n\n\t\tif ( json.type === undefined ) {\n\n\t\t\tthrow new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' );\n\n\t\t}\n\n\t\tvar trackType = KeyframeTrack._getTrackTypeForValueTypeName( json.type );\n\n\t\tif ( json.times === undefined ) {\n\n\t\t\tvar times = [], values = [];\n\n\t\t\tAnimationUtils.flattenJSON( json.keys, times, values, 'value' );\n\n\t\t\tjson.times = times;\n\t\t\tjson.values = values;\n\n\t\t}\n\n\t\t// derived classes can define a static parse method\n\t\tif ( trackType.parse !== undefined ) {\n\n\t\t\treturn trackType.parse( json );\n\n\t\t} else {\n\n\t\t\t// by default, we assume a constructor compatible with the base\n\t\t\treturn new trackType( json.name, json.times, json.values, json.interpolation );\n\n\t\t}\n\n\t},\n\n\ttoJSON: function ( track ) {\n\n\t\tvar trackType = track.constructor;\n\n\t\tvar json;\n\n\t\t// derived classes can define a static toJSON method\n\t\tif ( trackType.toJSON !== undefined ) {\n\n\t\t\tjson = trackType.toJSON( track );\n\n\t\t} else {\n\n\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\tjson = {\n\n\t\t\t\t'name': track.name,\n\t\t\t\t'times': AnimationUtils.convertArray( track.times, Array ),\n\t\t\t\t'values': AnimationUtils.convertArray( track.values, Array )\n\n\t\t\t};\n\n\t\t\tvar interpolation = track.getInterpolation();\n\n\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t}\n\n\t\t}\n\n\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\treturn json;\n\n\t},\n\n\t_getTrackTypeForValueTypeName: function ( typeName ) {\n\n\t\tswitch ( typeName.toLowerCase() ) {\n\n\t\t\tcase 'scalar':\n\t\t\tcase 'double':\n\t\t\tcase 'float':\n\t\t\tcase 'number':\n\t\t\tcase 'integer':\n\n\t\t\t\treturn NumberKeyframeTrack;\n\n\t\t\tcase 'vector':\n\t\t\tcase 'vector2':\n\t\t\tcase 'vector3':\n\t\t\tcase 'vector4':\n\n\t\t\t\treturn VectorKeyframeTrack;\n\n\t\t\tcase 'color':\n\n\t\t\t\treturn ColorKeyframeTrack;\n\n\t\t\tcase 'quaternion':\n\n\t\t\t\treturn QuaternionKeyframeTrack;\n\n\t\t\tcase 'bool':\n\t\t\tcase 'boolean':\n\n\t\t\t\treturn BooleanKeyframeTrack;\n\n\t\t\tcase 'string':\n\n\t\t\t\treturn StringKeyframeTrack;\n\n\t\t}\n\n\t\tthrow new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName );\n\n\t}\n\n} );\n\nObject.assign( KeyframeTrack.prototype, {\n\n\tconstructor: KeyframeTrack,\n\n\tTimeBufferType: Float32Array,\n\n\tValueBufferType: Float32Array,\n\n\tDefaultInterpolation: InterpolateLinear,\n\n\tInterpolantFactoryMethodDiscrete: function ( result ) {\n\n\t\treturn new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t},\n\n\tInterpolantFactoryMethodLinear: function ( result ) {\n\n\t\treturn new LinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t},\n\n\tInterpolantFactoryMethodSmooth: function ( result ) {\n\n\t\treturn new CubicInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t},\n\n\tsetInterpolation: function ( interpolation ) {\n\n\t\tvar factoryMethod;\n\n\t\tswitch ( interpolation ) {\n\n\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateLinear:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateSmooth:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( factoryMethod === undefined ) {\n\n\t\t\tvar message = \"unsupported interpolation for \" +\n\t\t\t\tthis.ValueTypeName + \" keyframe track named \" + this.name;\n\n\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconsole.warn( 'THREE.KeyframeTrack:', message );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.createInterpolant = factoryMethod;\n\n\t},\n\n\tgetInterpolation: function () {\n\n\t\tswitch ( this.createInterpolant ) {\n\n\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\treturn InterpolateLinear;\n\n\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\treturn InterpolateSmooth;\n\n\t\t}\n\n\t},\n\n\tgetValueSize: function () {\n\n\t\treturn this.values.length / this.times.length;\n\n\t},\n\n\t// move all keyframes either forwards or backwards in time\n\tshift: function ( timeOffset ) {\n\n\t\tif ( timeOffset !== 0.0 ) {\n\n\t\t\tvar times = this.times;\n\n\t\t\tfor ( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// scale all keyframe times by a factor (useful for frame <-> seconds conversions)\n\tscale: function ( timeScale ) {\n\n\t\tif ( timeScale !== 1.0 ) {\n\n\t\t\tvar times = this.times;\n\n\t\t\tfor ( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// removes keyframes before and after animation without changing any values within the range [startTime, endTime].\n\t// IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values\n\ttrim: function ( startTime, endTime ) {\n\n\t\tvar times = this.times,\n\t\t\tnKeys = times.length,\n\t\t\tfrom = 0,\n\t\t\tto = nKeys - 1;\n\n\t\twhile ( from !== nKeys && times[ from ] < startTime ) {\n\n\t\t\t++ from;\n\n\t\t}\n\n\t\twhile ( to !== - 1 && times[ to ] > endTime ) {\n\n\t\t\t-- to;\n\n\t\t}\n\n\t\t++ to; // inclusive -> exclusive bound\n\n\t\tif ( from !== 0 || to !== nKeys ) {\n\n\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\tif ( from >= to ) to = Math.max( to, 1 ), from = to - 1;\n\n\t\t\tvar stride = this.getValueSize();\n\t\t\tthis.times = AnimationUtils.arraySlice( times, from, to );\n\t\t\tthis.values = AnimationUtils.arraySlice( this.values, from * stride, to * stride );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable\n\tvalidate: function () {\n\n\t\tvar valid = true;\n\n\t\tvar valueSize = this.getValueSize();\n\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\tconsole.error( 'THREE.KeyframeTrack: Invalid value size in track.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tvar times = this.times,\n\t\t\tvalues = this.values,\n\n\t\t\tnKeys = times.length;\n\n\t\tif ( nKeys === 0 ) {\n\n\t\t\tconsole.error( 'THREE.KeyframeTrack: Track is empty.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tvar prevTime = null;\n\n\t\tfor ( var i = 0; i !== nKeys; i ++ ) {\n\n\t\t\tvar currTime = times[ i ];\n\n\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Time is not a valid number.', this, i, currTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Out of order keys.', this, i, currTime, prevTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tprevTime = currTime;\n\n\t\t}\n\n\t\tif ( values !== undefined ) {\n\n\t\t\tif ( AnimationUtils.isTypedArray( values ) ) {\n\n\t\t\t\tfor ( var i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar value = values[ i ];\n\n\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Value is not a valid number.', this, i, value );\n\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn valid;\n\n\t},\n\n\t// removes equivalent sequential keys as common in morph target sequences\n\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\toptimize: function () {\n\n\t\tvar times = this.times,\n\t\t\tvalues = this.values,\n\t\t\tstride = this.getValueSize(),\n\n\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\twriteIndex = 1,\n\t\t\tlastIndex = times.length - 1;\n\n\t\tfor ( var i = 1; i < lastIndex; ++ i ) {\n\n\t\t\tvar keep = false;\n\n\t\t\tvar time = times[ i ];\n\t\t\tvar timeNext = times[ i + 1 ];\n\n\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\tif ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) {\n\n\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\tvar offset = i * stride,\n\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tvar value = values[ offset + j ];\n\n\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tkeep = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// in-place compaction\n\n\t\t\tif ( keep ) {\n\n\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\tvar readOffset = i * stride,\n\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// flush last keyframe (compaction looks ahead)\n\n\t\tif ( lastIndex > 0 ) {\n\n\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\tfor ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) {\n\n\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t}\n\n\t\t\t++ writeIndex;\n\n\t\t}\n\n\t\tif ( writeIndex !== times.length ) {\n\n\t\t\tthis.times = AnimationUtils.arraySlice( times, 0, writeIndex );\n\t\t\tthis.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n *\n * A Track of vectored keyframe values.\n *\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\nfunction VectorKeyframeTrack( name, times, values, interpolation ) {\n\n\tKeyframeTrack.call( this, name, times, values, interpolation );\n\n}\n\nVectorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: VectorKeyframeTrack,\n\n\tValueTypeName: 'vector'\n\n\t// ValueBufferType is inherited\n\n\t// DefaultInterpolation is inherited\n\n} );\n\n/**\n *\n * Reusable set of Tracks that represent an animation.\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n */\n\nfunction AnimationClip( name, duration, tracks ) {\n\n\tthis.name = name;\n\tthis.tracks = tracks;\n\tthis.duration = ( duration !== undefined ) ? duration : - 1;\n\n\tthis.uuid = _Math.generateUUID();\n\n\t// this means it should figure out its duration by scanning the tracks\n\tif ( this.duration < 0 ) {\n\n\t\tthis.resetDuration();\n\n\t}\n\n\tthis.optimize();\n\n}\n\nObject.assign( AnimationClip, {\n\n\tparse: function ( json ) {\n\n\t\tvar tracks = [],\n\t\t\tjsonTracks = json.tracks,\n\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\tfor ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( KeyframeTrack.parse( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t}\n\n\t\treturn new AnimationClip( json.name, json.duration, tracks );\n\n\t},\n\n\ttoJSON: function ( clip ) {\n\n\t\tvar tracks = [],\n\t\t\tclipTracks = clip.tracks;\n\n\t\tvar json = {\n\n\t\t\t'name': clip.name,\n\t\t\t'duration': clip.duration,\n\t\t\t'tracks': tracks\n\n\t\t};\n\n\t\tfor ( var i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t}\n\n\t\treturn json;\n\n\t},\n\n\tCreateFromMorphTargetSequence: function ( name, morphTargetSequence, fps, noLoop ) {\n\n\t\tvar numMorphTargets = morphTargetSequence.length;\n\t\tvar tracks = [];\n\n\t\tfor ( var i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\tvar times = [];\n\t\t\tvar values = [];\n\n\t\t\ttimes.push(\n\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\ti,\n\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\tvar order = AnimationUtils.getKeyframeOrder( times );\n\t\t\ttimes = AnimationUtils.sortedArray( times, 1, order );\n\t\t\tvalues = AnimationUtils.sortedArray( values, 1, order );\n\n\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t// last frame as well for perfect loop.\n\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t}\n\n\t\t\ttracks.push(\n\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\ttimes, values\n\t\t\t\t).scale( 1.0 / fps ) );\n\n\t\t}\n\n\t\treturn new AnimationClip( name, - 1, tracks );\n\n\t},\n\n\tfindByName: function ( objectOrClipArray, name ) {\n\n\t\tvar clipArray = objectOrClipArray;\n\n\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\tvar o = objectOrClipArray;\n\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t}\n\n\t\tfor ( var i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\treturn clipArray[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t},\n\n\tCreateClipsFromMorphTargetSequences: function ( morphTargets, fps, noLoop ) {\n\n\t\tvar animationToMorphTargets = {};\n\n\t\t// tested with https://regex101.com/ on trick sequences\n\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\tvar pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t// sort morph target names into animation groups based\n\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\tfor ( var i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\tvar morphTarget = morphTargets[ i ];\n\t\t\tvar parts = morphTarget.name.match( pattern );\n\n\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\tvar name = parts[ 1 ];\n\n\t\t\t\tvar animationMorphTargets = animationToMorphTargets[ name ];\n\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t}\n\n\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar clips = [];\n\n\t\tfor ( var name in animationToMorphTargets ) {\n\n\t\t\tclips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t}\n\n\t\treturn clips;\n\n\t},\n\n\t// parse the animation.hierarchy format\n\tparseAnimation: function ( animation, bones ) {\n\n\t\tif ( ! animation ) {\n\n\t\t\tconsole.error( 'THREE.AnimationClip: No animation in JSONLoader data.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tvar addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t// only return track if there are actually keys.\n\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\tvar times = [];\n\t\t\t\tvar values = [];\n\n\t\t\t\tAnimationUtils.flattenJSON( animationKeys, times, values, propertyName );\n\n\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tvar tracks = [];\n\n\t\tvar clipName = animation.name || 'default';\n\t\t// automatic length determination in AnimationClip.\n\t\tvar duration = animation.length || - 1;\n\t\tvar fps = animation.fps || 30;\n\n\t\tvar hierarchyTracks = animation.hierarchy || [];\n\n\t\tfor ( var h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\tvar animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t// skip empty tracks\n\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t// process morph targets\n\t\t\tif ( animationKeys[ 0 ].morphTargets ) {\n\n\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\tvar morphTargetNames = {};\n\n\t\t\t\tfor ( var k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\tif ( animationKeys[ k ].morphTargets ) {\n\n\t\t\t\t\t\tfor ( var m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// create a track for each morph target with all zero\n\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t// the morphTarget is named.\n\t\t\t\tfor ( var morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\tvar times = [];\n\t\t\t\t\tvar values = [];\n\n\t\t\t\t\tfor ( var m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\tvar animationKey = animationKeys[ k ];\n\n\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t}\n\n\t\t\t\tduration = morphTargetNames.length * ( fps || 1.0 );\n\n\t\t\t} else {\n\n\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\tvar boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tracks.length === 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tvar clip = new AnimationClip( clipName, duration, tracks );\n\n\t\treturn clip;\n\n\t}\n\n} );\n\nObject.assign( AnimationClip.prototype, {\n\n\tresetDuration: function () {\n\n\t\tvar tracks = this.tracks, duration = 0;\n\n\t\tfor ( var i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\tvar track = this.tracks[ i ];\n\n\t\t\tduration = Math.max( duration, track.times[ track.times.length - 1 ] );\n\n\t\t}\n\n\t\tthis.duration = duration;\n\n\t},\n\n\ttrim: function () {\n\n\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\toptimize: function () {\n\n\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].optimize();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction MaterialLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\tthis.textures = {};\n\n}\n\nObject.assign( MaterialLoader.prototype, {\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar loader = new FileLoader( scope.manager );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\tsetTextures: function ( value ) {\n\n\t\tthis.textures = value;\n\n\t},\n\n\tparse: function ( json ) {\n\n\t\tvar textures = this.textures;\n\n\t\tfunction getTexture( name ) {\n\n\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.MaterialLoader: Undefined texture', name );\n\n\t\t\t}\n\n\t\t\treturn textures[ name ];\n\n\t\t}\n\n\t\tvar material = new Materials[ json.type ]();\n\n\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\tif ( json.color !== undefined ) material.color.setHex( json.color );\n\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\tif ( json.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\tif ( json.specular !== undefined ) material.specular.setHex( json.specular );\n\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\tif ( json.clearCoat !== undefined ) material.clearCoat = json.clearCoat;\n\t\tif ( json.clearCoatRoughness !== undefined ) material.clearCoatRoughness = json.clearCoatRoughness;\n\t\tif ( json.uniforms !== undefined ) material.uniforms = json.uniforms;\n\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\t\tif ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors;\n\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\tif ( json.flatShading !== undefined ) material.flatShading = json.flatShading;\n\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\n\t\tif ( json.rotation !== undefined ) material.rotation = json.rotation;\n\n\t\tif ( json.linewidth !== 1 ) material.linewidth = json.linewidth;\n\t\tif ( json.dashSize !== undefined ) material.dashSize = json.dashSize;\n\t\tif ( json.gapSize !== undefined ) material.gapSize = json.gapSize;\n\t\tif ( json.scale !== undefined ) material.scale = json.scale;\n\n\t\tif ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset;\n\t\tif ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor;\n\t\tif ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits;\n\n\t\tif ( json.skinning !== undefined ) material.skinning = json.skinning;\n\t\tif ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets;\n\t\tif ( json.dithering !== undefined ) material.dithering = json.dithering;\n\n\t\tif ( json.visible !== undefined ) material.visible = json.visible;\n\t\tif ( json.userData !== undefined ) material.userData = json.userData;\n\n\t\t// Deprecated\n\n\t\tif ( json.shading !== undefined ) material.flatShading = json.shading === 1; // THREE.FlatShading\n\n\t\t// for PointsMaterial\n\n\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t// maps\n\n\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\n\t\tif ( json.alphaMap !== undefined ) {\n\n\t\t\tmaterial.alphaMap = getTexture( json.alphaMap );\n\t\t\tmaterial.transparent = true;\n\n\t\t}\n\n\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\tvar normalScale = json.normalScale;\n\n\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t}\n\n\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t}\n\n\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\n\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\n\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\n\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\tif ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );\n\n\t\treturn material;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction BufferGeometryLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n}\n\nObject.assign( BufferGeometryLoader.prototype, {\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar loader = new FileLoader( scope.manager );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\tparse: function ( json ) {\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar index = json.data.index;\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tvar typedArray = new TYPED_ARRAYS[ index.type ]( index.array );\n\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t}\n\n\t\tvar attributes = json.data.attributes;\n\n\t\tfor ( var key in attributes ) {\n\n\t\t\tvar attribute = attributes[ key ];\n\t\t\tvar typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array );\n\n\t\t\tgeometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) );\n\n\t\t}\n\n\t\tvar groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\tif ( groups !== undefined ) {\n\n\t\t\tfor ( var i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar boundingSphere = json.data.boundingSphere;\n\n\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\tvar center = new Vector3();\n\n\t\t\tif ( boundingSphere.center !== undefined ) {\n\n\t\t\t\tcenter.fromArray( boundingSphere.center );\n\n\t\t\t}\n\n\t\t\tgeometry.boundingSphere = new Sphere( center, boundingSphere.radius );\n\n\t\t}\n\n\t\treturn geometry;\n\n\t}\n\n} );\n\nvar TYPED_ARRAYS = {\n\tInt8Array: Int8Array,\n\tUint8Array: Uint8Array,\n\t// Workaround for IE11 pre KB2929437. See #11440\n\tUint8ClampedArray: typeof Uint8ClampedArray !== 'undefined' ? Uint8ClampedArray : Uint8Array,\n\tInt16Array: Int16Array,\n\tUint16Array: Uint16Array,\n\tInt32Array: Int32Array,\n\tUint32Array: Uint32Array,\n\tFloat32Array: Float32Array,\n\tFloat64Array: Float64Array\n};\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction Loader() {}\n\nLoader.Handlers = {\n\n\thandlers: [],\n\n\tadd: function ( regex, loader ) {\n\n\t\tthis.handlers.push( regex, loader );\n\n\t},\n\n\tget: function ( file ) {\n\n\t\tvar handlers = this.handlers;\n\n\t\tfor ( var i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\tvar regex = handlers[ i ];\n\t\t\tvar loader = handlers[ i + 1 ];\n\n\t\t\tif ( regex.test( file ) ) {\n\n\t\t\t\treturn loader;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n};\n\nObject.assign( Loader.prototype, {\n\n\tcrossOrigin: undefined,\n\n\tonLoadStart: function () {},\n\n\tonLoadProgress: function () {},\n\n\tonLoadComplete: function () {},\n\n\tinitMaterials: function ( materials, texturePath, crossOrigin ) {\n\n\t\tvar array = [];\n\n\t\tfor ( var i = 0; i < materials.length; ++ i ) {\n\n\t\t\tarray[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin );\n\n\t\t}\n\n\t\treturn array;\n\n\t},\n\n\tcreateMaterial: ( function () {\n\n\t\tvar BlendingMode = {\n\t\t\tNoBlending: NoBlending,\n\t\t\tNormalBlending: NormalBlending,\n\t\t\tAdditiveBlending: AdditiveBlending,\n\t\t\tSubtractiveBlending: SubtractiveBlending,\n\t\t\tMultiplyBlending: MultiplyBlending,\n\t\t\tCustomBlending: CustomBlending\n\t\t};\n\n\t\tvar color = new Color();\n\t\tvar textureLoader = new TextureLoader();\n\t\tvar materialLoader = new MaterialLoader();\n\n\t\treturn function createMaterial( m, texturePath, crossOrigin ) {\n\n\t\t\t// convert from old material format\n\n\t\t\tvar textures = {};\n\n\t\t\tfunction loadTexture( path, repeat, offset, wrap, anisotropy ) {\n\n\t\t\t\tvar fullPath = texturePath + path;\n\t\t\t\tvar loader = Loader.Handlers.get( fullPath );\n\n\t\t\t\tvar texture;\n\n\t\t\t\tif ( loader !== null ) {\n\n\t\t\t\t\ttexture = loader.load( fullPath );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttextureLoader.setCrossOrigin( crossOrigin );\n\t\t\t\t\ttexture = textureLoader.load( fullPath );\n\n\t\t\t\t}\n\n\t\t\t\tif ( repeat !== undefined ) {\n\n\t\t\t\t\ttexture.repeat.fromArray( repeat );\n\n\t\t\t\t\tif ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\tif ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping;\n\n\t\t\t\t}\n\n\t\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\t\ttexture.offset.fromArray( offset );\n\n\t\t\t\t}\n\n\t\t\t\tif ( wrap !== undefined ) {\n\n\t\t\t\t\tif ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\tif ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping;\n\n\t\t\t\t\tif ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping;\n\t\t\t\t\tif ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping;\n\n\t\t\t\t}\n\n\t\t\t\tif ( anisotropy !== undefined ) {\n\n\t\t\t\t\ttexture.anisotropy = anisotropy;\n\n\t\t\t\t}\n\n\t\t\t\tvar uuid = _Math.generateUUID();\n\n\t\t\t\ttextures[ uuid ] = texture;\n\n\t\t\t\treturn uuid;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar json = {\n\t\t\t\tuuid: _Math.generateUUID(),\n\t\t\t\ttype: 'MeshLambertMaterial'\n\t\t\t};\n\n\t\t\tfor ( var name in m ) {\n\n\t\t\t\tvar value = m[ name ];\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'DbgColor':\n\t\t\t\t\tcase 'DbgIndex':\n\t\t\t\t\tcase 'opticalDensity':\n\t\t\t\t\tcase 'illumination':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'DbgName':\n\t\t\t\t\t\tjson.name = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'blending':\n\t\t\t\t\t\tjson.blending = BlendingMode[ value ];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'colorAmbient':\n\t\t\t\t\tcase 'mapAmbient':\n\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'colorDiffuse':\n\t\t\t\t\t\tjson.color = color.fromArray( value ).getHex();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'colorSpecular':\n\t\t\t\t\t\tjson.specular = color.fromArray( value ).getHex();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'colorEmissive':\n\t\t\t\t\t\tjson.emissive = color.fromArray( value ).getHex();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'specularCoef':\n\t\t\t\t\t\tjson.shininess = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'shading':\n\t\t\t\t\t\tif ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial';\n\t\t\t\t\t\tif ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial';\n\t\t\t\t\t\tif ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapDiffuse':\n\t\t\t\t\t\tjson.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapDiffuseRepeat':\n\t\t\t\t\tcase 'mapDiffuseOffset':\n\t\t\t\t\tcase 'mapDiffuseWrap':\n\t\t\t\t\tcase 'mapDiffuseAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapEmissive':\n\t\t\t\t\t\tjson.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapEmissiveRepeat':\n\t\t\t\t\tcase 'mapEmissiveOffset':\n\t\t\t\t\tcase 'mapEmissiveWrap':\n\t\t\t\t\tcase 'mapEmissiveAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapLight':\n\t\t\t\t\t\tjson.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapLightRepeat':\n\t\t\t\t\tcase 'mapLightOffset':\n\t\t\t\t\tcase 'mapLightWrap':\n\t\t\t\t\tcase 'mapLightAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapAO':\n\t\t\t\t\t\tjson.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapAORepeat':\n\t\t\t\t\tcase 'mapAOOffset':\n\t\t\t\t\tcase 'mapAOWrap':\n\t\t\t\t\tcase 'mapAOAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapBump':\n\t\t\t\t\t\tjson.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapBumpScale':\n\t\t\t\t\t\tjson.bumpScale = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapBumpRepeat':\n\t\t\t\t\tcase 'mapBumpOffset':\n\t\t\t\t\tcase 'mapBumpWrap':\n\t\t\t\t\tcase 'mapBumpAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapNormal':\n\t\t\t\t\t\tjson.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapNormalFactor':\n\t\t\t\t\t\tjson.normalScale = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapNormalRepeat':\n\t\t\t\t\tcase 'mapNormalOffset':\n\t\t\t\t\tcase 'mapNormalWrap':\n\t\t\t\t\tcase 'mapNormalAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapSpecular':\n\t\t\t\t\t\tjson.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapSpecularRepeat':\n\t\t\t\t\tcase 'mapSpecularOffset':\n\t\t\t\t\tcase 'mapSpecularWrap':\n\t\t\t\t\tcase 'mapSpecularAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapMetalness':\n\t\t\t\t\t\tjson.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapMetalnessRepeat':\n\t\t\t\t\tcase 'mapMetalnessOffset':\n\t\t\t\t\tcase 'mapMetalnessWrap':\n\t\t\t\t\tcase 'mapMetalnessAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapRoughness':\n\t\t\t\t\t\tjson.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapRoughnessRepeat':\n\t\t\t\t\tcase 'mapRoughnessOffset':\n\t\t\t\t\tcase 'mapRoughnessWrap':\n\t\t\t\t\tcase 'mapRoughnessAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapAlpha':\n\t\t\t\t\t\tjson.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapAlphaRepeat':\n\t\t\t\t\tcase 'mapAlphaOffset':\n\t\t\t\t\tcase 'mapAlphaWrap':\n\t\t\t\t\tcase 'mapAlphaAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'flipSided':\n\t\t\t\t\t\tjson.side = BackSide;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'doubleSided':\n\t\t\t\t\t\tjson.side = DoubleSide;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'transparency':\n\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' );\n\t\t\t\t\t\tjson.opacity = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'depthTest':\n\t\t\t\t\tcase 'depthWrite':\n\t\t\t\t\tcase 'colorWrite':\n\t\t\t\t\tcase 'opacity':\n\t\t\t\t\tcase 'reflectivity':\n\t\t\t\t\tcase 'transparent':\n\t\t\t\t\tcase 'visible':\n\t\t\t\t\tcase 'wireframe':\n\t\t\t\t\t\tjson[ name ] = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'vertexColors':\n\t\t\t\t\t\tif ( value === true ) json.vertexColors = VertexColors;\n\t\t\t\t\t\tif ( value === 'face' ) json.vertexColors = FaceColors;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.error( 'THREE.Loader.createMaterial: Unsupported', name, value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( json.type === 'MeshBasicMaterial' ) delete json.emissive;\n\t\t\tif ( json.type !== 'MeshPhongMaterial' ) delete json.specular;\n\n\t\t\tif ( json.opacity < 1 ) json.transparent = true;\n\n\t\t\tmaterialLoader.setTextures( textures );\n\n\t\t\treturn materialLoader.parse( json );\n\n\t\t};\n\n\t} )()\n\n} );\n\n/**\n * @author Don McCurdy / https://www.donmccurdy.com\n */\n\nvar LoaderUtils = {\n\n\tdecodeText: function ( array ) {\n\n\t\tif ( typeof TextDecoder !== 'undefined' ) {\n\n\t\t\treturn new TextDecoder().decode( array );\n\n\t\t}\n\n\t\t// Avoid the String.fromCharCode.apply(null, array) shortcut, which\n\t\t// throws a \"maximum call stack size exceeded\" error for large arrays.\n\n\t\tvar s = '';\n\n\t\tfor ( var i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t// Implicitly assumes little-endian.\n\t\t\ts += String.fromCharCode( array[ i ] );\n\n\t\t}\n\n\t\t// Merges multi-byte utf-8 characters.\n\t\treturn decodeURIComponent( escape( s ) );\n\n\t},\n\n\textractUrlBase: function ( url ) {\n\n\t\tvar index = url.lastIndexOf( '/' );\n\n\t\tif ( index === - 1 ) return './';\n\n\t\treturn url.substr( 0, index + 1 );\n\n\t}\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction JSONLoader( manager ) {\n\n\tif ( typeof manager === 'boolean' ) {\n\n\t\tconsole.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' );\n\t\tmanager = undefined;\n\n\t}\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\tthis.withCredentials = false;\n\n}\n\nObject.assign( JSONLoader.prototype, {\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar texturePath = this.texturePath && ( typeof this.texturePath === 'string' ) ? this.texturePath : LoaderUtils.extractUrlBase( url );\n\n\t\tvar loader = new FileLoader( this.manager );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tvar json = JSON.parse( text );\n\t\t\tvar metadata = json.metadata;\n\n\t\t\tif ( metadata !== undefined ) {\n\n\t\t\t\tvar type = metadata.type;\n\n\t\t\t\tif ( type !== undefined ) {\n\n\t\t\t\t\tif ( type.toLowerCase() === 'object' ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar object = scope.parse( json, texturePath );\n\t\t\tonLoad( object.geometry, object.materials );\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\tsetTexturePath: function ( value ) {\n\n\t\tthis.texturePath = value;\n\n\t},\n\n\tparse: ( function () {\n\n\t\tfunction parseModel( json, geometry ) {\n\n\t\t\tfunction isBitSet( value, position ) {\n\n\t\t\t\treturn value & ( 1 << position );\n\n\t\t\t}\n\n\t\t\tvar i, j, fi,\n\n\t\t\t\toffset, zLength,\n\n\t\t\t\tcolorIndex, normalIndex, uvIndex, materialIndex,\n\n\t\t\t\ttype,\n\t\t\t\tisQuad,\n\t\t\t\thasMaterial,\n\t\t\t\thasFaceVertexUv,\n\t\t\t\thasFaceNormal, hasFaceVertexNormal,\n\t\t\t\thasFaceColor, hasFaceVertexColor,\n\n\t\t\t\tvertex, face, faceA, faceB, hex, normal,\n\n\t\t\t\tuvLayer, uv, u, v,\n\n\t\t\t\tfaces = json.faces,\n\t\t\t\tvertices = json.vertices,\n\t\t\t\tnormals = json.normals,\n\t\t\t\tcolors = json.colors,\n\n\t\t\t\tscale = json.scale,\n\n\t\t\t\tnUvLayers = 0;\n\n\n\t\t\tif ( json.uvs !== undefined ) {\n\n\t\t\t\t// disregard empty arrays\n\n\t\t\t\tfor ( i = 0; i < json.uvs.length; i ++ ) {\n\n\t\t\t\t\tif ( json.uvs[ i ].length ) nUvLayers ++;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\tgeometry.faceVertexUvs[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\toffset = 0;\n\t\t\tzLength = vertices.length;\n\n\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\tvertex = new Vector3();\n\n\t\t\t\tvertex.x = vertices[ offset ++ ] * scale;\n\t\t\t\tvertex.y = vertices[ offset ++ ] * scale;\n\t\t\t\tvertex.z = vertices[ offset ++ ] * scale;\n\n\t\t\t\tgeometry.vertices.push( vertex );\n\n\t\t\t}\n\n\t\t\toffset = 0;\n\t\t\tzLength = faces.length;\n\n\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\ttype = faces[ offset ++ ];\n\n\t\t\t\tisQuad = isBitSet( type, 0 );\n\t\t\t\thasMaterial = isBitSet( type, 1 );\n\t\t\t\thasFaceVertexUv = isBitSet( type, 3 );\n\t\t\t\thasFaceNormal = isBitSet( type, 4 );\n\t\t\t\thasFaceVertexNormal = isBitSet( type, 5 );\n\t\t\t\thasFaceColor = isBitSet( type, 6 );\n\t\t\t\thasFaceVertexColor = isBitSet( type, 7 );\n\n\t\t\t\t// console.log(\"type\", type, \"bits\", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor);\n\n\t\t\t\tif ( isQuad ) {\n\n\t\t\t\t\tfaceA = new Face3();\n\t\t\t\t\tfaceA.a = faces[ offset ];\n\t\t\t\t\tfaceA.b = faces[ offset + 1 ];\n\t\t\t\t\tfaceA.c = faces[ offset + 3 ];\n\n\t\t\t\t\tfaceB = new Face3();\n\t\t\t\t\tfaceB.a = faces[ offset + 1 ];\n\t\t\t\t\tfaceB.b = faces[ offset + 2 ];\n\t\t\t\t\tfaceB.c = faces[ offset + 3 ];\n\n\t\t\t\t\toffset += 4;\n\n\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\tfaceA.materialIndex = materialIndex;\n\t\t\t\t\t\tfaceB.materialIndex = materialIndex;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi + 1 ] = [];\n\n\t\t\t\t\t\t\tfor ( j = 0; j < 4; j ++ ) {\n\n\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\tif ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv );\n\t\t\t\t\t\t\t\tif ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\tfaceA.normal.set(\n\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tfaceB.normal.copy( faceA.normal );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\n\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexNormals.push( normal );\n\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexNormals.push( normal );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\tfaceA.color.setHex( hex );\n\t\t\t\t\t\tfaceB.color.setHex( hex );\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) );\n\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.faces.push( faceA );\n\t\t\t\t\tgeometry.faces.push( faceB );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tface = new Face3();\n\t\t\t\t\tface.a = faces[ offset ++ ];\n\t\t\t\t\tface.b = faces[ offset ++ ];\n\t\t\t\t\tface.c = faces[ offset ++ ];\n\n\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\tface.materialIndex = materialIndex;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\n\t\t\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ].push( uv );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\tface.normal.set(\n\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tface.vertexNormals.push( normal );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\tface.color.setHex( colors[ colorIndex ] );\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.vertexColors.push( new Color( colors[ colorIndex ] ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.faces.push( face );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseSkin( json, geometry ) {\n\n\t\t\tvar influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2;\n\n\t\t\tif ( json.skinWeights ) {\n\n\t\t\t\tfor ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\tvar x = json.skinWeights[ i ];\n\t\t\t\t\tvar y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0;\n\t\t\t\t\tvar z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0;\n\t\t\t\t\tvar w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0;\n\n\t\t\t\t\tgeometry.skinWeights.push( new Vector4( x, y, z, w ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( json.skinIndices ) {\n\n\t\t\t\tfor ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\tvar a = json.skinIndices[ i ];\n\t\t\t\t\tvar b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0;\n\t\t\t\t\tvar c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0;\n\t\t\t\t\tvar d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0;\n\n\t\t\t\t\tgeometry.skinIndices.push( new Vector4( a, b, c, d ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgeometry.bones = json.bones;\n\n\t\t\tif ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) {\n\n\t\t\t\tconsole.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' +\n\t\t\t\t\tgeometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseMorphing( json, geometry ) {\n\n\t\t\tvar scale = json.scale;\n\n\t\t\tif ( json.morphTargets !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\tgeometry.morphTargets[ i ] = {};\n\t\t\t\t\tgeometry.morphTargets[ i ].name = json.morphTargets[ i ].name;\n\t\t\t\t\tgeometry.morphTargets[ i ].vertices = [];\n\n\t\t\t\t\tvar dstVertices = geometry.morphTargets[ i ].vertices;\n\t\t\t\t\tvar srcVertices = json.morphTargets[ i ].vertices;\n\n\t\t\t\t\tfor ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) {\n\n\t\t\t\t\t\tvar vertex = new Vector3();\n\t\t\t\t\t\tvertex.x = srcVertices[ v ] * scale;\n\t\t\t\t\t\tvertex.y = srcVertices[ v + 1 ] * scale;\n\t\t\t\t\t\tvertex.z = srcVertices[ v + 2 ] * scale;\n\n\t\t\t\t\t\tdstVertices.push( vertex );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( json.morphColors !== undefined && json.morphColors.length > 0 ) {\n\n\t\t\t\tconsole.warn( 'THREE.JSONLoader: \"morphColors\" no longer supported. Using them as face colors.' );\n\n\t\t\t\tvar faces = geometry.faces;\n\t\t\t\tvar morphColors = json.morphColors[ 0 ].colors;\n\n\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\tfaces[ i ].color.fromArray( morphColors, i * 3 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseAnimations( json, geometry ) {\n\n\t\t\tvar outputAnimations = [];\n\n\t\t\t// parse old style Bone/Hierarchy animations\n\t\t\tvar animations = [];\n\n\t\t\tif ( json.animation !== undefined ) {\n\n\t\t\t\tanimations.push( json.animation );\n\n\t\t\t}\n\n\t\t\tif ( json.animations !== undefined ) {\n\n\t\t\t\tif ( json.animations.length ) {\n\n\t\t\t\t\tanimations = animations.concat( json.animations );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tanimations.push( json.animations );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < animations.length; i ++ ) {\n\n\t\t\t\tvar clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones );\n\t\t\t\tif ( clip ) outputAnimations.push( clip );\n\n\t\t\t}\n\n\t\t\t// parse implicit morph animations\n\t\t\tif ( geometry.morphTargets ) {\n\n\t\t\t\t// TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary.\n\t\t\t\tvar morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 );\n\t\t\t\toutputAnimations = outputAnimations.concat( morphAnimationClips );\n\n\t\t\t}\n\n\t\t\tif ( outputAnimations.length > 0 ) geometry.animations = outputAnimations;\n\n\t\t}\n\n\t\treturn function parse( json, texturePath ) {\n\n\t\t\tif ( json.data !== undefined ) {\n\n\t\t\t\t// Geometry 4.0 spec\n\t\t\t\tjson = json.data;\n\n\t\t\t}\n\n\t\t\tif ( json.scale !== undefined ) {\n\n\t\t\t\tjson.scale = 1.0 / json.scale;\n\n\t\t\t} else {\n\n\t\t\t\tjson.scale = 1.0;\n\n\t\t\t}\n\n\t\t\tvar geometry = new Geometry();\n\n\t\t\tparseModel( json, geometry );\n\t\t\tparseSkin( json, geometry );\n\t\t\tparseMorphing( json, geometry );\n\t\t\tparseAnimations( json, geometry );\n\n\t\t\tgeometry.computeFaceNormals();\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\tif ( json.materials === undefined || json.materials.length === 0 ) {\n\n\t\t\t\treturn { geometry: geometry };\n\n\t\t\t} else {\n\n\t\t\t\tvar materials = Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin );\n\n\t\t\t\treturn { geometry: geometry, materials: materials };\n\n\t\t\t}\n\n\t\t};\n\n\t} )()\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction ObjectLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\tthis.texturePath = '';\n\n}\n\nObject.assign( ObjectLoader.prototype, {\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tif ( this.texturePath === '' ) {\n\n\t\t\tthis.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 );\n\n\t\t}\n\n\t\tvar scope = this;\n\n\t\tvar loader = new FileLoader( scope.manager );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tvar json = null;\n\n\t\t\ttry {\n\n\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( error );\n\n\t\t\t\tconsole.error( 'THREE:ObjectLoader: Can\\'t parse ' + url + '.', error.message );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar metadata = json.metadata;\n\n\t\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\t\tconsole.error( 'THREE.ObjectLoader: Can\\'t load ' + url + '. Use THREE.JSONLoader instead.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tscope.parse( json, onLoad );\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\tsetTexturePath: function ( value ) {\n\n\t\tthis.texturePath = value;\n\n\t},\n\n\tsetCrossOrigin: function ( value ) {\n\n\t\tthis.crossOrigin = value;\n\n\t},\n\n\tparse: function ( json, onLoad ) {\n\n\t\tvar shapes = this.parseShape( json.shapes );\n\t\tvar geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tvar images = this.parseImages( json.images, function () {\n\n\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t} );\n\n\t\tvar textures = this.parseTextures( json.textures, images );\n\t\tvar materials = this.parseMaterials( json.materials, textures );\n\n\t\tvar object = this.parseObject( json.object, geometries, materials );\n\n\t\tif ( json.animations ) {\n\n\t\t\tobject.animations = this.parseAnimations( json.animations );\n\n\t\t}\n\n\t\tif ( json.images === undefined || json.images.length === 0 ) {\n\n\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t}\n\n\t\treturn object;\n\n\t},\n\n\tparseShape: function ( json ) {\n\n\t\tvar shapes = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tvar shape = new Shape().fromJSON( json[ i ] );\n\n\t\t\t\tshapes[ shape.uuid ] = shape;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn shapes;\n\n\t},\n\n\tparseGeometries: function ( json, shapes ) {\n\n\t\tvar geometries = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tvar geometryLoader = new JSONLoader();\n\t\t\tvar bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tvar geometry;\n\t\t\t\tvar data = json[ i ];\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'PlaneGeometry':\n\t\t\t\t\tcase 'PlaneBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\tdata.heightSegments\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'BoxGeometry':\n\t\t\t\t\tcase 'BoxBufferGeometry':\n\t\t\t\t\tcase 'CubeGeometry': // backwards compatible\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\tdata.depth,\n\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\tdata.depthSegments\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'CircleGeometry':\n\t\t\t\t\tcase 'CircleBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'CylinderGeometry':\n\t\t\t\t\tcase 'CylinderBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radiusTop,\n\t\t\t\t\t\t\tdata.radiusBottom,\n\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'ConeGeometry':\n\t\t\t\t\tcase 'ConeBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SphereGeometry':\n\t\t\t\t\tcase 'SphereBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\tdata.phiLength,\n\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'DodecahedronGeometry':\n\t\t\t\t\tcase 'DodecahedronBufferGeometry':\n\t\t\t\t\tcase 'IcosahedronGeometry':\n\t\t\t\t\tcase 'IcosahedronBufferGeometry':\n\t\t\t\t\tcase 'OctahedronGeometry':\n\t\t\t\t\tcase 'OctahedronBufferGeometry':\n\t\t\t\t\tcase 'TetrahedronGeometry':\n\t\t\t\t\tcase 'TetrahedronBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.detail\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'RingGeometry':\n\t\t\t\t\tcase 'RingBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.innerRadius,\n\t\t\t\t\t\t\tdata.outerRadius,\n\t\t\t\t\t\t\tdata.thetaSegments,\n\t\t\t\t\t\t\tdata.phiSegments,\n\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'TorusGeometry':\n\t\t\t\t\tcase 'TorusBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\tdata.arc\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'TorusKnotGeometry':\n\t\t\t\t\tcase 'TorusKnotBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\tdata.p,\n\t\t\t\t\t\t\tdata.q\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LatheGeometry':\n\t\t\t\t\tcase 'LatheBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.points,\n\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\tdata.phiLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PolyhedronGeometry':\n\t\t\t\t\tcase 'PolyhedronBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.vertices,\n\t\t\t\t\t\t\tdata.indices,\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.details\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'ShapeGeometry':\n\t\t\t\t\tcase 'ShapeBufferGeometry':\n\n\t\t\t\t\t\tvar geometryShapes = [];\n\n\t\t\t\t\t\tfor ( var j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tvar shape = shapes[ data.shapes[ j ] ];\n\n\t\t\t\t\t\t\tgeometryShapes.push( shape );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tgeometryShapes,\n\t\t\t\t\t\t\tdata.curveSegments\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'BufferGeometry':\n\n\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Geometry':\n\n\t\t\t\t\t\tgeometry = geometryLoader.parse( data, this.texturePath ).geometry;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Unsupported geometry type \"' + data.type + '\"' );\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\n\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn geometries;\n\n\t},\n\n\tparseMaterials: function ( json, textures ) {\n\n\t\tvar materials = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tvar loader = new MaterialLoader();\n\t\t\tloader.setTextures( textures );\n\n\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tvar data = json[ i ];\n\n\t\t\t\tif ( data.type === 'MultiMaterial' ) {\n\n\t\t\t\t\t// Deprecated\n\n\t\t\t\t\tvar array = [];\n\n\t\t\t\t\tfor ( var j = 0; j < data.materials.length; j ++ ) {\n\n\t\t\t\t\t\tarray.push( loader.parse( data.materials[ j ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmaterials[ data.uuid ] = array;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmaterials[ data.uuid ] = loader.parse( data );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn materials;\n\n\t},\n\n\tparseAnimations: function ( json ) {\n\n\t\tvar animations = [];\n\n\t\tfor ( var i = 0; i < json.length; i ++ ) {\n\n\t\t\tvar clip = AnimationClip.parse( json[ i ] );\n\n\t\t\tanimations.push( clip );\n\n\t\t}\n\n\t\treturn animations;\n\n\t},\n\n\tparseImages: function ( json, onLoad ) {\n\n\t\tvar scope = this;\n\t\tvar images = {};\n\n\t\tfunction loadImage( url ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn loader.load( url, function () {\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, undefined, function () {\n\n\t\t\t\tscope.manager.itemEnd( url );\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tvar manager = new LoadingManager( onLoad );\n\n\t\t\tvar loader = new ImageLoader( manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tvar image = json[ i ];\n\t\t\t\tvar path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url;\n\n\t\t\t\timages[ image.uuid ] = loadImage( path );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t},\n\n\tparseTextures: function ( json, images ) {\n\n\t\tfunction parseConstant( value, type ) {\n\n\t\t\tif ( typeof value === 'number' ) return value;\n\n\t\t\tconsole.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\treturn type[ value ];\n\n\t\t}\n\n\t\tvar textures = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tvar data = json[ i ];\n\n\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t}\n\n\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t}\n\n\t\t\t\tvar texture = new Texture( images[ data.image ] );\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING );\n\n\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\tif ( data.center !== undefined ) texture.center.fromArray( data.center );\n\t\t\t\tif ( data.rotation !== undefined ) texture.rotation = data.rotation;\n\n\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING );\n\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.format !== undefined ) texture.format = data.format;\n\n\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn textures;\n\n\t},\n\n\tparseObject: function ( data, geometries, materials ) {\n\n\t\tvar object;\n\n\t\tfunction getGeometry( name ) {\n\n\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined geometry', name );\n\n\t\t\t}\n\n\t\t\treturn geometries[ name ];\n\n\t\t}\n\n\t\tfunction getMaterial( name ) {\n\n\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\n\t\t\t\tvar array = [];\n\n\t\t\t\tfor ( var i = 0, l = name.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar uuid = name[ i ];\n\n\t\t\t\t\tif ( materials[ uuid ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tarray.push( materials[ uuid ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t}\n\n\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', name );\n\n\t\t\t}\n\n\t\t\treturn materials[ name ];\n\n\t\t}\n\n\t\tswitch ( data.type ) {\n\n\t\t\tcase 'Scene':\n\n\t\t\t\tobject = new Scene();\n\n\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\t\t\t\tobject.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );\n\n\t\t\t\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'AmbientLight':\n\n\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'DirectionalLight':\n\n\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointLight':\n\n\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'RectAreaLight':\n\n\t\t\t\tobject = new RectAreaLight( data.color, data.intensity, data.width, data.height );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SpotLight':\n\n\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'HemisphereLight':\n\n\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SkinnedMesh':\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.' );\n\n\t\t\tcase 'Mesh':\n\n\t\t\t\tvar geometry = getGeometry( data.geometry );\n\t\t\t\tvar material = getMaterial( data.material );\n\n\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 ) {\n\n\t\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LOD':\n\n\t\t\t\tobject = new LOD();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Line':\n\n\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineLoop':\n\n\t\t\t\tobject = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineSegments':\n\n\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointCloud':\n\t\t\tcase 'Points':\n\n\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Sprite':\n\n\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Group':\n\n\t\t\t\tobject = new Group();\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tobject = new Object3D();\n\n\t\t}\n\n\t\tobject.uuid = data.uuid;\n\n\t\tif ( data.name !== undefined ) object.name = data.name;\n\n\t\tif ( data.matrix !== undefined ) {\n\n\t\t\tobject.matrix.fromArray( data.matrix );\n\n\t\t\tif ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate;\n\t\t\tif ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t} else {\n\n\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t}\n\n\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\tif ( data.shadow ) {\n\n\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t}\n\n\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\tif ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled;\n\t\tif ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder;\n\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\n\t\tif ( data.children !== undefined ) {\n\n\t\t\tvar children = data.children;\n\n\t\t\tfor ( var i = 0; i < children.length; i ++ ) {\n\n\t\t\t\tobject.add( this.parseObject( children[ i ], geometries, materials ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.type === 'LOD' ) {\n\n\t\t\tvar levels = data.levels;\n\n\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tvar level = levels[ l ];\n\t\t\t\tvar child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\tobject.addLevel( child, level.distance );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n} );\n\nvar TEXTURE_MAPPING = {\n\tUVMapping: UVMapping,\n\tCubeReflectionMapping: CubeReflectionMapping,\n\tCubeRefractionMapping: CubeRefractionMapping,\n\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\tSphericalReflectionMapping: SphericalReflectionMapping,\n\tCubeUVReflectionMapping: CubeUVReflectionMapping,\n\tCubeUVRefractionMapping: CubeUVRefractionMapping\n};\n\nvar TEXTURE_WRAPPING = {\n\tRepeatWrapping: RepeatWrapping,\n\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\tMirroredRepeatWrapping: MirroredRepeatWrapping\n};\n\nvar TEXTURE_FILTER = {\n\tNearestFilter: NearestFilter,\n\tNearestMipMapNearestFilter: NearestMipMapNearestFilter,\n\tNearestMipMapLinearFilter: NearestMipMapLinearFilter,\n\tLinearFilter: LinearFilter,\n\tLinearMipMapNearestFilter: LinearMipMapNearestFilter,\n\tLinearMipMapLinearFilter: LinearMipMapLinearFilter\n};\n\n/**\n * @author thespite / http://clicktorelease.com/\n */\n\nfunction ImageBitmapLoader( manager ) {\n\n\tif ( typeof createImageBitmap === 'undefined' ) {\n\n\t\tconsole.warn( 'THREE.ImageBitmapLoader: createImageBitmap() not supported.' );\n\n\t}\n\n\tif ( typeof fetch === 'undefined' ) {\n\n\t\tconsole.warn( 'THREE.ImageBitmapLoader: fetch() not supported.' );\n\n\t}\n\n\tthis.manager = manager !== undefined ? manager : DefaultLoadingManager;\n\tthis.options = undefined;\n\n}\n\nImageBitmapLoader.prototype = {\n\n\tconstructor: ImageBitmapLoader,\n\n\tsetOptions: function setOptions( options ) {\n\n\t\tthis.options = options;\n\n\t\treturn this;\n\n\t},\n\n\tload: function load( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\tvar scope = this;\n\n\t\tvar cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tfetch( url ).then( function ( res ) {\n\n\t\t\treturn res.blob();\n\n\t\t} ).then( function ( blob ) {\n\n\t\t\treturn createImageBitmap( blob, scope.options );\n\n\t\t} ).then( function ( imageBitmap ) {\n\n\t\t\tCache.add( url, imageBitmap );\n\n\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t} ).catch( function ( e ) {\n\n\t\t\tif ( onError ) onError( e );\n\n\t\t\tscope.manager.itemEnd( url );\n\t\t\tscope.manager.itemError( url );\n\n\t\t} );\n\n\t},\n\n\tsetCrossOrigin: function ( /* value */ ) {\n\n\t\treturn this;\n\n\t},\n\n\tsetPath: function ( value ) {\n\n\t\tthis.path = value;\n\t\treturn this;\n\n\t}\n\n};\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n * minimal class for proxing functions to Path. Replaces old \"extractSubpaths()\"\n **/\n\nfunction ShapePath() {\n\n\tthis.type = 'ShapePath';\n\n\tthis.color = new Color();\n\n\tthis.subPaths = [];\n\tthis.currentPath = null;\n\n}\n\nObject.assign( ShapePath.prototype, {\n\n\tmoveTo: function ( x, y ) {\n\n\t\tthis.currentPath = new Path();\n\t\tthis.subPaths.push( this.currentPath );\n\t\tthis.currentPath.moveTo( x, y );\n\n\t},\n\n\tlineTo: function ( x, y ) {\n\n\t\tthis.currentPath.lineTo( x, y );\n\n\t},\n\n\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\n\t},\n\n\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\n\t},\n\n\tsplineThru: function ( pts ) {\n\n\t\tthis.currentPath.splineThru( pts );\n\n\t},\n\n\ttoShapes: function ( isCCW, noHoles ) {\n\n\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\tvar shapes = [];\n\n\t\t\tfor ( var i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\tvar tmpPath = inSubpaths[ i ];\n\n\t\t\t\tvar tmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\tvar polyLen = inPolygon.length;\n\n\t\t\t// inPt on polygon contour => immediate success or\n\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t// with the horizontal line through inPt, left of inPt\n\t\t\t// not counting lowerY endpoints of edges and whole edges on that line\n\t\t\tvar inside = false;\n\t\t\tfor ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\tvar edgeLowPt = inPolygon[ p ];\n\t\t\t\tvar edgeHighPt = inPolygon[ q ];\n\n\t\t\t\tvar edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\tvar edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\t\t\t\t\tif ( inPt.x === edgeLowPt.x )\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvar perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\t\t\t\t\tif ( perpEdge === 0 )\t\t\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\t\t\t\t\t ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) )\t\treturn\ttrue;\t// inPt: Point on contour !\n\t\t\t\t\t// continue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tinside;\n\n\t\t}\n\n\t\tvar isClockWise = ShapeUtils.isClockWise;\n\n\t\tvar subPaths = this.subPaths;\n\t\tif ( subPaths.length === 0 ) return [];\n\n\t\tif ( noHoles === true )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\tvar solid, tmpPath, tmpShape, shapes = [];\n\n\t\tif ( subPaths.length === 1 ) {\n\n\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\ttmpShape = new Shape();\n\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\tshapes.push( tmpShape );\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tvar holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t// console.log(\"Holes first\", holesFirst);\n\n\t\tvar betterShapeHoles = [];\n\t\tvar newShapes = [];\n\t\tvar newShapeHoles = [];\n\t\tvar mainIdx = 0;\n\t\tvar tmpPoints;\n\n\t\tnewShapes[ mainIdx ] = undefined;\n\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\tfor ( var i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\ttmpPath = subPaths[ i ];\n\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\tif ( solid ) {\n\n\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t//console.log('cw', i);\n\n\t\t\t} else {\n\n\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t//console.log('ccw', i);\n\n\t\t\t}\n\n\t\t}\n\n\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\tif ( newShapes.length > 1 ) {\n\n\t\t\tvar ambiguous = false;\n\t\t\tvar toChange = [];\n\n\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t}\n\n\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tvar sho = newShapeHoles[ sIdx ];\n\n\t\t\t\tfor ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\tvar ho = sho[ hIdx ];\n\t\t\t\t\tvar hole_unassigned = true;\n\n\t\t\t\t\tfor ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } );\n\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t\t// console.log(\"ambiguous: \", ambiguous);\n\t\t\tif ( toChange.length > 0 ) {\n\n\t\t\t\t// console.log(\"to change: \", toChange);\n\t\t\t\tif ( ! ambiguous )\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar tmpHoles;\n\n\t\tfor ( var i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\tshapes.push( tmpShape );\n\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\tfor ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//console.log(\"shape\", shapes);\n\n\t\treturn shapes;\n\n\t}\n\n} );\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction Font( data ) {\n\n\tthis.type = 'Font';\n\n\tthis.data = data;\n\n}\n\nObject.assign( Font.prototype, {\n\n\tisFont: true,\n\n\tgenerateShapes: function ( text, size, divisions ) {\n\n\t\tif ( size === undefined ) size = 100;\n\t\tif ( divisions === undefined ) divisions = 4;\n\n\t\tvar shapes = [];\n\t\tvar paths = createPaths( text, size, divisions, this.data );\n\n\t\tfor ( var p = 0, pl = paths.length; p < pl; p ++ ) {\n\n\t\t\tArray.prototype.push.apply( shapes, paths[ p ].toShapes() );\n\n\t\t}\n\n\t\treturn shapes;\n\n\t}\n\n} );\n\nfunction createPaths( text, size, divisions, data ) {\n\n\tvar chars = String( text ).split( '' );\n\tvar scale = size / data.resolution;\n\tvar line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale;\n\n\tvar paths = [];\n\n\tvar offsetX = 0, offsetY = 0;\n\n\tfor ( var i = 0; i < chars.length; i ++ ) {\n\n\t\tvar char = chars[ i ];\n\n\t\tif ( char === '\\n' ) {\n\n\t\t\toffsetX = 0;\n\t\t\toffsetY -= line_height;\n\n\t\t} else {\n\n\t\t\tvar ret = createPath( char, divisions, scale, offsetX, offsetY, data );\n\t\t\toffsetX += ret.offsetX;\n\t\t\tpaths.push( ret.path );\n\n\t\t}\n\n\t}\n\n\treturn paths;\n\n}\n\nfunction createPath( char, divisions, scale, offsetX, offsetY, data ) {\n\n\tvar glyph = data.glyphs[ char ] || data.glyphs[ '?' ];\n\n\tif ( ! glyph ) return;\n\n\tvar path = new ShapePath();\n\n\tvar x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2;\n\n\tif ( glyph.o ) {\n\n\t\tvar outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );\n\n\t\tfor ( var i = 0, l = outline.length; i < l; ) {\n\n\t\t\tvar action = outline[ i ++ ];\n\n\t\t\tswitch ( action ) {\n\n\t\t\t\tcase 'm': // moveTo\n\n\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'l': // lineTo\n\n\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'q': // quadraticCurveTo\n\n\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.quadraticCurveTo( cpx1, cpy1, cpx, cpy );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'b': // bezierCurveTo\n\n\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx2 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy2 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn { offsetX: glyph.ha * scale, path: path };\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction FontLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n}\n\nObject.assign( FontLoader.prototype, {\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tvar json;\n\n\t\t\ttry {\n\n\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tconsole.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' );\n\t\t\t\tjson = JSON.parse( text.substring( 65, text.length - 2 ) );\n\n\t\t\t}\n\n\t\t\tvar font = scope.parse( json );\n\n\t\t\tif ( onLoad ) onLoad( font );\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\tparse: function ( json ) {\n\n\t\treturn new Font( json );\n\n\t},\n\n\tsetPath: function ( value ) {\n\n\t\tthis.path = value;\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nvar context;\n\nvar AudioContext = {\n\n\tgetContext: function () {\n\n\t\tif ( context === undefined ) {\n\n\t\t\tcontext = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t}\n\n\t\treturn context;\n\n\t},\n\n\tsetContext: function ( value ) {\n\n\t\tcontext = value;\n\n\t}\n\n};\n\n/**\n * @author Reece Aaron Lecrivain / http://reecenotes.com/\n */\n\nfunction AudioLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n}\n\nObject.assign( AudioLoader.prototype, {\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\tvar context = AudioContext.getContext();\n\n\t\t\tcontext.decodeAudioData( buffer, function ( audioBuffer ) {\n\n\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t} );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction StereoCamera() {\n\n\tthis.type = 'StereoCamera';\n\n\tthis.aspect = 1;\n\n\tthis.eyeSep = 0.064;\n\n\tthis.cameraL = new PerspectiveCamera();\n\tthis.cameraL.layers.enable( 1 );\n\tthis.cameraL.matrixAutoUpdate = false;\n\n\tthis.cameraR = new PerspectiveCamera();\n\tthis.cameraR.layers.enable( 2 );\n\tthis.cameraR.matrixAutoUpdate = false;\n\n}\n\nObject.assign( StereoCamera.prototype, {\n\n\tupdate: ( function () {\n\n\t\tvar instance, focus, fov, aspect, near, far, zoom, eyeSep;\n\n\t\tvar eyeRight = new Matrix4();\n\t\tvar eyeLeft = new Matrix4();\n\n\t\treturn function update( camera ) {\n\n\t\t\tvar needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov ||\n\t\t\t\t\t\t\t\t\t\t\t\taspect !== camera.aspect * this.aspect || near !== camera.near ||\n\t\t\t\t\t\t\t\t\t\t\t\tfar !== camera.far || zoom !== camera.zoom || eyeSep !== this.eyeSep;\n\n\t\t\tif ( needsUpdate ) {\n\n\t\t\t\tinstance = this;\n\t\t\t\tfocus = camera.focus;\n\t\t\t\tfov = camera.fov;\n\t\t\t\taspect = camera.aspect * this.aspect;\n\t\t\t\tnear = camera.near;\n\t\t\t\tfar = camera.far;\n\t\t\t\tzoom = camera.zoom;\n\n\t\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t\tvar projectionMatrix = camera.projectionMatrix.clone();\n\t\t\t\teyeSep = this.eyeSep / 2;\n\t\t\t\tvar eyeSepOnProjection = eyeSep * near / focus;\n\t\t\t\tvar ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom;\n\t\t\t\tvar xmin, xmax;\n\n\t\t\t\t// translate xOffset\n\n\t\t\t\teyeLeft.elements[ 12 ] = - eyeSep;\n\t\t\t\teyeRight.elements[ 12 ] = eyeSep;\n\n\t\t\t\t// for left eye\n\n\t\t\t\txmin = - ymax * aspect + eyeSepOnProjection;\n\t\t\t\txmax = ymax * aspect + eyeSepOnProjection;\n\n\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\tthis.cameraL.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t// for right eye\n\n\t\t\t\txmin = - ymax * aspect - eyeSepOnProjection;\n\t\t\t\txmax = ymax * aspect - eyeSepOnProjection;\n\n\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\tthis.cameraR.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t}\n\n\t\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft );\n\t\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight );\n\n\t\t};\n\n\t} )()\n\n} );\n\n/**\n * Camera for rendering cube maps\n *\t- renders scene into axis-aligned cube\n *\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction CubeCamera( near, far, cubeResolution ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'CubeCamera';\n\n\tvar fov = 90, aspect = 1;\n\n\tvar cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraPX.up.set( 0, - 1, 0 );\n\tcameraPX.lookAt( new Vector3( 1, 0, 0 ) );\n\tthis.add( cameraPX );\n\n\tvar cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraNX.up.set( 0, - 1, 0 );\n\tcameraNX.lookAt( new Vector3( - 1, 0, 0 ) );\n\tthis.add( cameraNX );\n\n\tvar cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraPY.up.set( 0, 0, 1 );\n\tcameraPY.lookAt( new Vector3( 0, 1, 0 ) );\n\tthis.add( cameraPY );\n\n\tvar cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraNY.up.set( 0, 0, - 1 );\n\tcameraNY.lookAt( new Vector3( 0, - 1, 0 ) );\n\tthis.add( cameraNY );\n\n\tvar cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraPZ.up.set( 0, - 1, 0 );\n\tcameraPZ.lookAt( new Vector3( 0, 0, 1 ) );\n\tthis.add( cameraPZ );\n\n\tvar cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraNZ.up.set( 0, - 1, 0 );\n\tcameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );\n\tthis.add( cameraNZ );\n\n\tvar options = { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter };\n\n\tthis.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options );\n\tthis.renderTarget.texture.name = \"CubeCamera\";\n\n\tthis.update = function ( renderer, scene ) {\n\n\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\tvar renderTarget = this.renderTarget;\n\t\tvar generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\trenderTarget.activeCubeFace = 0;\n\t\trenderer.render( scene, cameraPX, renderTarget );\n\n\t\trenderTarget.activeCubeFace = 1;\n\t\trenderer.render( scene, cameraNX, renderTarget );\n\n\t\trenderTarget.activeCubeFace = 2;\n\t\trenderer.render( scene, cameraPY, renderTarget );\n\n\t\trenderTarget.activeCubeFace = 3;\n\t\trenderer.render( scene, cameraNY, renderTarget );\n\n\t\trenderTarget.activeCubeFace = 4;\n\t\trenderer.render( scene, cameraPZ, renderTarget );\n\n\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\trenderTarget.activeCubeFace = 5;\n\t\trenderer.render( scene, cameraNZ, renderTarget );\n\n\t\trenderer.setRenderTarget( null );\n\n\t};\n\n\tthis.clear = function ( renderer, color, depth, stencil ) {\n\n\t\tvar renderTarget = this.renderTarget;\n\n\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\trenderTarget.activeCubeFace = i;\n\t\t\trenderer.setRenderTarget( renderTarget );\n\n\t\t\trenderer.clear( color, depth, stencil );\n\n\t\t}\n\n\t\trenderer.setRenderTarget( null );\n\n\t};\n\n}\n\nCubeCamera.prototype = Object.create( Object3D.prototype );\nCubeCamera.prototype.constructor = CubeCamera;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction AudioListener() {\n\n\tObject3D.call( this );\n\n\tthis.type = 'AudioListener';\n\n\tthis.context = AudioContext.getContext();\n\n\tthis.gain = this.context.createGain();\n\tthis.gain.connect( this.context.destination );\n\n\tthis.filter = null;\n\n}\n\nAudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: AudioListener,\n\n\tgetInput: function () {\n\n\t\treturn this.gain;\n\n\t},\n\n\tremoveFilter: function ( ) {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\tthis.gain.connect( this.context.destination );\n\t\t\tthis.filter = null;\n\n\t\t}\n\n\t},\n\n\tgetFilter: function () {\n\n\t\treturn this.filter;\n\n\t},\n\n\tsetFilter: function ( value ) {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t} else {\n\n\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t}\n\n\t\tthis.filter = value;\n\t\tthis.gain.connect( this.filter );\n\t\tthis.filter.connect( this.context.destination );\n\n\t},\n\n\tgetMasterVolume: function () {\n\n\t\treturn this.gain.gain.value;\n\n\t},\n\n\tsetMasterVolume: function ( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t},\n\n\tupdateMatrixWorld: ( function () {\n\n\t\tvar position = new Vector3();\n\t\tvar quaternion = new Quaternion();\n\t\tvar scale = new Vector3();\n\n\t\tvar orientation = new Vector3();\n\n\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\tvar listener = this.context.listener;\n\t\t\tvar up = this.up;\n\n\t\t\tthis.matrixWorld.decompose( position, quaternion, scale );\n\n\t\t\torientation.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t\tif ( listener.positionX ) {\n\n\t\t\t\tlistener.positionX.setValueAtTime( position.x, this.context.currentTime );\n\t\t\t\tlistener.positionY.setValueAtTime( position.y, this.context.currentTime );\n\t\t\t\tlistener.positionZ.setValueAtTime( position.z, this.context.currentTime );\n\t\t\t\tlistener.forwardX.setValueAtTime( orientation.x, this.context.currentTime );\n\t\t\t\tlistener.forwardY.setValueAtTime( orientation.y, this.context.currentTime );\n\t\t\t\tlistener.forwardZ.setValueAtTime( orientation.z, this.context.currentTime );\n\t\t\t\tlistener.upX.setValueAtTime( up.x, this.context.currentTime );\n\t\t\t\tlistener.upY.setValueAtTime( up.y, this.context.currentTime );\n\t\t\t\tlistener.upZ.setValueAtTime( up.z, this.context.currentTime );\n\n\t\t\t} else {\n\n\t\t\t\tlistener.setPosition( position.x, position.y, position.z );\n\t\t\t\tlistener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z );\n\n\t\t\t}\n\n\t\t};\n\n\t} )()\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author Reece Aaron Lecrivain / http://reecenotes.com/\n */\n\nfunction Audio( listener ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Audio';\n\n\tthis.context = listener.context;\n\n\tthis.gain = this.context.createGain();\n\tthis.gain.connect( listener.getInput() );\n\n\tthis.autoplay = false;\n\n\tthis.buffer = null;\n\tthis.loop = false;\n\tthis.startTime = 0;\n\tthis.offset = 0;\n\tthis.playbackRate = 1;\n\tthis.isPlaying = false;\n\tthis.hasPlaybackControl = true;\n\tthis.sourceType = 'empty';\n\n\tthis.filters = [];\n\n}\n\nAudio.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Audio,\n\n\tgetOutput: function () {\n\n\t\treturn this.gain;\n\n\t},\n\n\tsetNodeSource: function ( audioNode ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'audioNode';\n\t\tthis.source = audioNode;\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t},\n\n\tsetBuffer: function ( audioBuffer ) {\n\n\t\tthis.buffer = audioBuffer;\n\t\tthis.sourceType = 'buffer';\n\n\t\tif ( this.autoplay ) this.play();\n\n\t\treturn this;\n\n\t},\n\n\tplay: function () {\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: Audio is already playing.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tvar source = this.context.createBufferSource();\n\n\t\tsource.buffer = this.buffer;\n\t\tsource.loop = this.loop;\n\t\tsource.onended = this.onEnded.bind( this );\n\t\tsource.playbackRate.setValueAtTime( this.playbackRate, this.startTime );\n\t\tthis.startTime = this.context.currentTime;\n\t\tsource.start( this.startTime, this.offset );\n\n\t\tthis.isPlaying = true;\n\n\t\tthis.source = source;\n\n\t\treturn this.connect();\n\n\t},\n\n\tpause: function () {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.stop();\n\t\t\tthis.offset += ( this.context.currentTime - this.startTime ) * this.playbackRate;\n\t\t\tthis.isPlaying = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tstop: function () {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.source.stop();\n\t\tthis.offset = 0;\n\t\tthis.isPlaying = false;\n\n\t\treturn this;\n\n\t},\n\n\tconnect: function () {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tdisconnect: function () {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetFilters: function () {\n\n\t\treturn this.filters;\n\n\t},\n\n\tsetFilters: function ( value ) {\n\n\t\tif ( ! value ) value = [];\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.disconnect();\n\t\t\tthis.filters = value;\n\t\t\tthis.connect();\n\n\t\t} else {\n\n\t\t\tthis.filters = value;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetFilter: function () {\n\n\t\treturn this.getFilters()[ 0 ];\n\n\t},\n\n\tsetFilter: function ( filter ) {\n\n\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t},\n\n\tsetPlaybackRate: function ( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.playbackRate = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.playbackRate.setValueAtTime( this.playbackRate, this.context.currentTime );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetPlaybackRate: function () {\n\n\t\treturn this.playbackRate;\n\n\t},\n\n\tonEnded: function () {\n\n\t\tthis.isPlaying = false;\n\n\t},\n\n\tgetLoop: function () {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn this.loop;\n\n\t},\n\n\tsetLoop: function ( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.loop = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.loop = this.loop;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetVolume: function () {\n\n\t\treturn this.gain.gain.value;\n\n\t},\n\n\tsetVolume: function ( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction PositionalAudio( listener ) {\n\n\tAudio.call( this, listener );\n\n\tthis.panner = this.context.createPanner();\n\tthis.panner.connect( this.gain );\n\n}\n\nPositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), {\n\n\tconstructor: PositionalAudio,\n\n\tgetOutput: function () {\n\n\t\treturn this.panner;\n\n\t},\n\n\tgetRefDistance: function () {\n\n\t\treturn this.panner.refDistance;\n\n\t},\n\n\tsetRefDistance: function ( value ) {\n\n\t\tthis.panner.refDistance = value;\n\n\t},\n\n\tgetRolloffFactor: function () {\n\n\t\treturn this.panner.rolloffFactor;\n\n\t},\n\n\tsetRolloffFactor: function ( value ) {\n\n\t\tthis.panner.rolloffFactor = value;\n\n\t},\n\n\tgetDistanceModel: function () {\n\n\t\treturn this.panner.distanceModel;\n\n\t},\n\n\tsetDistanceModel: function ( value ) {\n\n\t\tthis.panner.distanceModel = value;\n\n\t},\n\n\tgetMaxDistance: function () {\n\n\t\treturn this.panner.maxDistance;\n\n\t},\n\n\tsetMaxDistance: function ( value ) {\n\n\t\tthis.panner.maxDistance = value;\n\n\t},\n\n\tupdateMatrixWorld: ( function () {\n\n\t\tvar position = new Vector3();\n\n\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\tposition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tthis.panner.setPosition( position.x, position.y, position.z );\n\n\t\t};\n\n\t} )()\n\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction AudioAnalyser( audio, fftSize ) {\n\n\tthis.analyser = audio.context.createAnalyser();\n\tthis.analyser.fftSize = fftSize !== undefined ? fftSize : 2048;\n\n\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\taudio.getOutput().connect( this.analyser );\n\n}\n\nObject.assign( AudioAnalyser.prototype, {\n\n\tgetFrequencyData: function () {\n\n\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\treturn this.data;\n\n\t},\n\n\tgetAverageFrequency: function () {\n\n\t\tvar value = 0, data = this.getFrequencyData();\n\n\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\tvalue += data[ i ];\n\n\t\t}\n\n\t\treturn value / data.length;\n\n\t}\n\n} );\n\n/**\n *\n * Buffered scene graph property that allows weighted accumulation.\n *\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\nfunction PropertyMixer( binding, typeName, valueSize ) {\n\n\tthis.binding = binding;\n\tthis.valueSize = valueSize;\n\n\tvar bufferType = Float64Array,\n\t\tmixFunction;\n\n\tswitch ( typeName ) {\n\n\t\tcase 'quaternion':\n\t\t\tmixFunction = this._slerp;\n\t\t\tbreak;\n\n\t\tcase 'string':\n\t\tcase 'bool':\n\t\t\tbufferType = Array;\n\t\t\tmixFunction = this._select;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tmixFunction = this._lerp;\n\n\t}\n\n\tthis.buffer = new bufferType( valueSize * 4 );\n\t// layout: [ incoming | accu0 | accu1 | orig ]\n\t//\n\t// interpolators can use .buffer as their .result\n\t// the data then goes to 'incoming'\n\t//\n\t// 'accu0' and 'accu1' are used frame-interleaved for\n\t// the cumulative result and are compared to detect\n\t// changes\n\t//\n\t// 'orig' stores the original state of the property\n\n\tthis._mixBufferRegion = mixFunction;\n\n\tthis.cumulativeWeight = 0;\n\n\tthis.useCount = 0;\n\tthis.referenceCount = 0;\n\n}\n\nObject.assign( PropertyMixer.prototype, {\n\n\t// accumulate data in the 'incoming' region into 'accu'\n\taccumulate: function ( accuIndex, weight ) {\n\n\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t// the weight and shouldn't have made the call in the first place\n\n\t\tvar buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\tcurrentWeight = this.cumulativeWeight;\n\n\t\tif ( currentWeight === 0 ) {\n\n\t\t\t// accuN := incoming * weight\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t}\n\n\t\t\tcurrentWeight = weight;\n\n\t\t} else {\n\n\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\tcurrentWeight += weight;\n\t\t\tvar mix = weight / currentWeight;\n\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t}\n\n\t\tthis.cumulativeWeight = currentWeight;\n\n\t},\n\n\t// apply the state of 'accu' to the binding when accus differ\n\tapply: function ( accuIndex ) {\n\n\t\tvar stride = this.valueSize,\n\t\t\tbuffer = this.buffer,\n\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\tweight = this.cumulativeWeight,\n\n\t\t\tbinding = this.binding;\n\n\t\tthis.cumulativeWeight = 0;\n\n\t\tif ( weight < 1 ) {\n\n\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\tvar originalValueOffset = stride * 3;\n\n\t\t\tthis._mixBufferRegion(\n\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t}\n\n\t\tfor ( var i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\t// remember the state of the bound property and copy it to both accus\n\tsaveOriginalState: function () {\n\n\t\tvar binding = this.binding;\n\n\t\tvar buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\n\t\t\toriginalValueOffset = stride * 3;\n\n\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\tfor ( var i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t}\n\n\t\tthis.cumulativeWeight = 0;\n\n\t},\n\n\t// apply the state previously taken via 'saveOriginalState' to the binding\n\trestoreOriginalState: function () {\n\n\t\tvar originalValueOffset = this.valueSize * 3;\n\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t},\n\n\n\t// mix functions\n\n\t_select: function ( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tif ( t >= 0.5 ) {\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\t_slerp: function ( buffer, dstOffset, srcOffset, t ) {\n\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t );\n\n\t},\n\n\t_lerp: function ( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tvar s = 1 - t;\n\n\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\tvar j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n} );\n\n/**\n *\n * A reference to a real property in the scene graph.\n *\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\n// Characters [].:/ are reserved for track binding syntax.\nvar RESERVED_CHARS_RE = '\\\\[\\\\]\\\\.:\\\\/';\n\nfunction Composite( targetGroup, path, optionalParsedPath ) {\n\n\tvar parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path );\n\n\tthis._targetGroup = targetGroup;\n\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n}\n\nObject.assign( Composite.prototype, {\n\n\tgetValue: function ( array, offset ) {\n\n\t\tthis.bind(); // bind all binding\n\n\t\tvar firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t// and only call .getValue on the first\n\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t},\n\n\tsetValue: function ( array, offset ) {\n\n\t\tvar bindings = this._bindings;\n\n\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t}\n\n\t},\n\n\tbind: function () {\n\n\t\tvar bindings = this._bindings;\n\n\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].bind();\n\n\t\t}\n\n\t},\n\n\tunbind: function () {\n\n\t\tvar bindings = this._bindings;\n\n\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].unbind();\n\n\t\t}\n\n\t}\n\n} );\n\n\nfunction PropertyBinding( rootNode, path, parsedPath ) {\n\n\tthis.path = path;\n\tthis.parsedPath = parsedPath || PropertyBinding.parseTrackName( path );\n\n\tthis.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ) || rootNode;\n\n\tthis.rootNode = rootNode;\n\n}\n\nObject.assign( PropertyBinding, {\n\n\tComposite: Composite,\n\n\tcreate: function ( root, path, parsedPath ) {\n\n\t\tif ( ! ( root && root.isAnimationObjectGroup ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t},\n\n\t/**\n\t * Replaces spaces with underscores and removes unsupported characters from\n\t * node names, to ensure compatibility with parseTrackName().\n\t *\n\t * @param {string} name Node name to be sanitized.\n\t * @return {string}\n\t */\n\tsanitizeNodeName: ( function () {\n\n\t\tvar reservedRe = new RegExp( '[' + RESERVED_CHARS_RE + ']', 'g' );\n\n\t\treturn function sanitizeNodeName( name ) {\n\n\t\t\treturn name.replace( /\\s/g, '_' ).replace( reservedRe, '' );\n\n\t\t};\n\n\t}() ),\n\n\tparseTrackName: function () {\n\n\t\t// Attempts to allow node names from any language. ES5's `\\w` regexp matches\n\t\t// only latin characters, and the unicode \\p{L} is not yet supported. So\n\t\t// instead, we exclude reserved characters and match everything else.\n\t\tvar wordChar = '[^' + RESERVED_CHARS_RE + ']';\n\t\tvar wordCharOrDot = '[^' + RESERVED_CHARS_RE.replace( '\\\\.', '' ) + ']';\n\n\t\t// Parent directories, delimited by '/' or ':'. Currently unused, but must\n\t\t// be matched to parse the rest of the track name.\n\t\tvar directoryRe = /((?:WC+[\\/:])*)/.source.replace( 'WC', wordChar );\n\n\t\t// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.\n\t\tvar nodeRe = /(WCOD+)?/.source.replace( 'WCOD', wordCharOrDot );\n\n\t\t// Object on target node, and accessor. May not contain reserved\n\t\t// characters. Accessor may contain any character except closing bracket.\n\t\tvar objectRe = /(?:\\.(WC+)(?:\\[(.+)\\])?)?/.source.replace( 'WC', wordChar );\n\n\t\t// Property and accessor. May not contain reserved characters. Accessor may\n\t\t// contain any non-bracket characters.\n\t\tvar propertyRe = /\\.(WC+)(?:\\[(.+)\\])?/.source.replace( 'WC', wordChar );\n\n\t\tvar trackRe = new RegExp( ''\n\t\t\t+ '^'\n\t\t\t+ directoryRe\n\t\t\t+ nodeRe\n\t\t\t+ objectRe\n\t\t\t+ propertyRe\n\t\t\t+ '$'\n\t\t);\n\n\t\tvar supportedObjectNames = [ 'material', 'materials', 'bones' ];\n\n\t\treturn function parseTrackName( trackName ) {\n\n\t\t\tvar matches = trackRe.exec( trackName );\n\n\t\t\tif ( ! matches ) {\n\n\t\t\t\tthrow new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName );\n\n\t\t\t}\n\n\t\t\tvar results = {\n\t\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\t\tnodeName: matches[ 2 ],\n\t\t\t\tobjectName: matches[ 3 ],\n\t\t\t\tobjectIndex: matches[ 4 ],\n\t\t\t\tpropertyName: matches[ 5 ], // required\n\t\t\t\tpropertyIndex: matches[ 6 ]\n\t\t\t};\n\n\t\t\tvar lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' );\n\n\t\t\tif ( lastDot !== undefined && lastDot !== - 1 ) {\n\n\t\t\t\tvar objectName = results.nodeName.substring( lastDot + 1 );\n\n\t\t\t\t// Object names must be checked against a whitelist. Otherwise, there\n\t\t\t\t// is no way to parse 'foo.bar.baz': 'baz' must be a property, but\n\t\t\t\t// 'bar' could be the objectName, or part of a nodeName (which can\n\t\t\t\t// include '.' characters).\n\t\t\t\tif ( supportedObjectNames.indexOf( objectName ) !== - 1 ) {\n\n\t\t\t\t\tresults.nodeName = results.nodeName.substring( 0, lastDot );\n\t\t\t\t\tresults.objectName = objectName;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\t\tthrow new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName );\n\n\t\t\t}\n\n\t\t\treturn results;\n\n\t\t};\n\n\t}(),\n\n\tfindNode: function ( root, nodeName ) {\n\n\t\tif ( ! nodeName || nodeName === \"\" || nodeName === \"root\" || nodeName === \".\" || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tvar bone = root.skeleton.getBoneByName( nodeName );\n\n\t\t\tif ( bone !== undefined ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tvar searchNodeSubtree = function ( children ) {\n\n\t\t\t\tfor ( var i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tvar childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tvar subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n} );\n\nObject.assign( PropertyBinding.prototype, { // prototype, continued\n\n\t// these are used to \"bind\" a nonexistent property\n\t_getValue_unavailable: function () {},\n\t_setValue_unavailable: function () {},\n\n\tBindingType: {\n\t\tDirect: 0,\n\t\tEntireArray: 1,\n\t\tArrayElement: 2,\n\t\tHasFromToArray: 3\n\t},\n\n\tVersioning: {\n\t\tNone: 0,\n\t\tNeedsUpdate: 1,\n\t\tMatrixWorldNeedsUpdate: 2\n\t},\n\n\tGetterByBindingType: [\n\n\t\tfunction getValue_direct( buffer, offset ) {\n\n\t\t\tbuffer[ offset ] = this.node[ this.propertyName ];\n\n\t\t},\n\n\t\tfunction getValue_array( buffer, offset ) {\n\n\t\t\tvar source = this.resolvedProperty;\n\n\t\t\tfor ( var i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t\t}\n\n\t\t},\n\n\t\tfunction getValue_arrayElement( buffer, offset ) {\n\n\t\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t\t},\n\n\t\tfunction getValue_toArray( buffer, offset ) {\n\n\t\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t\t}\n\n\t],\n\n\tSetterByBindingTypeAndVersioning: [\n\n\t\t[\n\t\t\t// Direct\n\n\t\t\tfunction setValue_direct( buffer, offset ) {\n\n\t\t\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\n\t\t\t},\n\n\t\t\tfunction setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t},\n\n\t\t\tfunction setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t}\n\n\t\t], [\n\n\t\t\t// EntireArray\n\n\t\t\tfunction setValue_array( buffer, offset ) {\n\n\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tfunction setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t}\n\n\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t},\n\n\t\t\tfunction setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t}\n\n\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t}\n\n\t\t], [\n\n\t\t\t// ArrayElement\n\n\t\t\tfunction setValue_arrayElement( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t\t\t},\n\n\t\t\tfunction setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t},\n\n\t\t\tfunction setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t}\n\n\t\t], [\n\n\t\t\t// HasToFromArray\n\n\t\t\tfunction setValue_fromArray( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t\t\t},\n\n\t\t\tfunction setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t},\n\n\t\t\tfunction setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t}\n\n\t\t]\n\n\t],\n\n\tgetValue: function getValue_unbound( targetArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.getValue( targetArray, offset );\n\n\t\t// Note: This class uses a State pattern on a per-method basis:\n\t\t// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n\t\t// prototype version of these methods with one that represents\n\t\t// the bound state. When the property is not found, the methods\n\t\t// become no-ops.\n\n\t},\n\n\tsetValue: function getValue_unbound( sourceArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.setValue( sourceArray, offset );\n\n\t},\n\n\t// create getter / setter pair for a property in the scene graph\n\tbind: function () {\n\n\t\tvar targetObject = this.node,\n\t\t\tparsedPath = this.parsedPath,\n\n\t\t\tobjectName = parsedPath.objectName,\n\t\t\tpropertyName = parsedPath.propertyName,\n\t\t\tpropertyIndex = parsedPath.propertyIndex;\n\n\t\tif ( ! targetObject ) {\n\n\t\t\ttargetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName ) || this.rootNode;\n\n\t\t\tthis.node = targetObject;\n\n\t\t}\n\n\t\t// set fail state so we can just 'return' on error\n\t\tthis.getValue = this._getValue_unavailable;\n\t\tthis.setValue = this._setValue_unavailable;\n\n\t\t// ensure there is a value node\n\t\tif ( ! targetObject ) {\n\n\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to update node for track: ' + this.path + ' but it wasn\\'t found.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( objectName ) {\n\n\t\t\tvar objectIndex = parsedPath.objectIndex;\n\n\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\tswitch ( objectName ) {\n\n\t\t\t\tcase 'materials':\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bones':\n\n\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\tfor ( var i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t}\n\n\n\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// resolve property\n\t\tvar nodeProperty = targetObject[ propertyName ];\n\n\t\tif ( nodeProperty === undefined ) {\n\n\t\t\tvar nodeName = parsedPath.nodeName;\n\n\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName +\n\t\t\t\t'.' + propertyName + ' but it wasn\\'t found.', targetObject );\n\t\t\treturn;\n\n\t\t}\n\n\t\t// determine versioning scheme\n\t\tvar versioning = this.Versioning.None;\n\n\t\tif ( targetObject.needsUpdate !== undefined ) { // material\n\n\t\t\tversioning = this.Versioning.NeedsUpdate;\n\t\t\tthis.targetObject = targetObject;\n\n\t\t} else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform\n\n\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\t\t\tthis.targetObject = targetObject;\n\n\t\t}\n\n\t\t// determine how the property gets bound\n\t\tvar bindingType = this.BindingType.Direct;\n\n\t\tif ( propertyIndex !== undefined ) {\n\n\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\tif ( propertyName === \"morphTargetInfluences\" ) {\n\n\t\t\t\t// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.\n\n\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( targetObject.geometry.isBufferGeometry ) {\n\n\t\t\t\t\tif ( ! targetObject.geometry.morphAttributes ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0; i < this.node.geometry.morphAttributes.position.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject.geometry.morphAttributes.position[ i ].name === propertyIndex ) {\n\n\t\t\t\t\t\t\tpropertyIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( ! targetObject.geometry.morphTargets ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) {\n\n\t\t\t\t\t\t\tpropertyIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\n\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else if ( Array.isArray( nodeProperty ) ) {\n\n\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else {\n\n\t\t\tthis.propertyName = propertyName;\n\n\t\t}\n\n\t\t// select getter / setter\n\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t},\n\n\tunbind: function () {\n\n\t\tthis.node = null;\n\n\t\t// back to the prototype version of getValue / setValue\n\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n} );\n\n//!\\ DECLARE ALIAS AFTER assign prototype !\nObject.assign( PropertyBinding.prototype, {\n\n\t// initial state of these methods that calls 'bind'\n\t_getValue_unbound: PropertyBinding.prototype.getValue,\n\t_setValue_unbound: PropertyBinding.prototype.setValue,\n\n} );\n\n/**\n *\n * A group of objects that receives a shared animation state.\n *\n * Usage:\n *\n * \t-\tAdd objects you would otherwise pass as 'root' to the\n * \t\tconstructor or the .clipAction method of AnimationMixer.\n *\n * \t-\tInstead pass this object as 'root'.\n *\n * \t-\tYou can also add and remove objects later when the mixer\n * \t\tis running.\n *\n * Note:\n *\n * \tObjects of this class appear as one object to the mixer,\n * \tso cache control of the individual objects must be done\n * \ton the group.\n *\n * Limitation:\n *\n * \t- \tThe animated properties must be compatible among the\n * \t\tall objects in the group.\n *\n * -\tA single property can either be controlled through a\n * \ttarget group or directly, but not both.\n *\n * @author tschw\n */\n\nfunction AnimationObjectGroup() {\n\n\tthis.uuid = _Math.generateUUID();\n\n\t// cached objects followed by the active ones\n\tthis._objects = Array.prototype.slice.call( arguments );\n\n\tthis.nCachedObjects_ = 0;\t\t\t// threshold\n\t// note: read by PropertyBinding.Composite\n\n\tvar indices = {};\n\tthis._indicesByUUID = indices;\t\t// for bookkeeping\n\n\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\tindices[ arguments[ i ].uuid ] = i;\n\n\t}\n\n\tthis._paths = [];\t\t\t\t\t// inside: string\n\tthis._parsedPaths = [];\t\t\t\t// inside: { we don't care, here }\n\tthis._bindings = []; \t\t\t\t// inside: Array< PropertyBinding >\n\tthis._bindingsIndicesByPath = {}; \t// inside: indices in these arrays\n\n\tvar scope = this;\n\n\tthis.stats = {\n\n\t\tobjects: {\n\t\t\tget total() {\n\n\t\t\t\treturn scope._objects.length;\n\n\t\t\t},\n\t\t\tget inUse() {\n\n\t\t\t\treturn this.total - scope.nCachedObjects_;\n\n\t\t\t}\n\t\t},\n\t\tget bindingsPerObject() {\n\n\t\t\treturn scope._bindings.length;\n\n\t\t}\n\n\t};\n\n}\n\nObject.assign( AnimationObjectGroup.prototype, {\n\n\tisAnimationObjectGroup: true,\n\n\tadd: function () {\n\n\t\tvar objects = this._objects,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tpaths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length,\n\t\t\tknownObject = undefined;\n\n\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tvar object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index === undefined ) {\n\n\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\tindex = nObjects ++;\n\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\tobjects.push( object );\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tbindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t}\n\n\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\tknownObject = objects[ index ];\n\n\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\tbinding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t} else if ( objects[ index ] !== knownObject ) {\n\n\t\t\t\tconsole.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID ' +\n\t\t\t\t\t\t'detected. Clean the caches or recreate your infrastructure when reloading scenes.' );\n\n\t\t\t} // else the object is already where we want it to be\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t},\n\n\tremove: function () {\n\n\t\tvar objects = this._objects,\n\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tvar object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\tvar lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t},\n\n\t// remove & forget\n\tuncache: function () {\n\n\t\tvar objects = this._objects,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tvar object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\tvar lastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} // cached or active\n\n\t\t\t} // if object is known\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t},\n\n\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\tsubscribe_: function ( path, parsedPath ) {\n\n\t\t// returns an array of bindings for the given path that is changed\n\t\t// according to the contained objects in the group\n\n\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\tindex = indicesByPath[ path ],\n\t\t\tbindings = this._bindings;\n\n\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\tvar paths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tobjects = this._objects,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\tindex = bindings.length;\n\n\t\tindicesByPath[ path ] = index;\n\n\t\tpaths.push( path );\n\t\tparsedPaths.push( parsedPath );\n\t\tbindings.push( bindingsForPath );\n\n\t\tfor ( var i = nCachedObjects, n = objects.length; i !== n; ++ i ) {\n\n\t\t\tvar object = objects[ i ];\n\t\t\tbindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath );\n\n\t\t}\n\n\t\treturn bindingsForPath;\n\n\t},\n\n\tunsubscribe_: function ( path ) {\n\n\t\t// tells the group to forget about a property path and no longer\n\t\t// update the array previously obtained with 'subscribe_'\n\n\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\tindex = indicesByPath[ path ];\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tvar paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\tbindings[ index ] = lastBindings;\n\t\t\tbindings.pop();\n\n\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\tparsedPaths.pop();\n\n\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\tpaths.pop();\n\n\t\t}\n\n\t}\n\n} );\n\n/**\n *\n * Action provided by AnimationMixer for scheduling clip playback on specific\n * objects.\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n *\n */\n\nfunction AnimationAction( mixer, clip, localRoot ) {\n\n\tthis._mixer = mixer;\n\tthis._clip = clip;\n\tthis._localRoot = localRoot || null;\n\n\tvar tracks = clip.tracks,\n\t\tnTracks = tracks.length,\n\t\tinterpolants = new Array( nTracks );\n\n\tvar interpolantSettings = {\n\t\tendingStart: ZeroCurvatureEnding,\n\t\tendingEnd: ZeroCurvatureEnding\n\t};\n\n\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\tvar interpolant = tracks[ i ].createInterpolant( null );\n\t\tinterpolants[ i ] = interpolant;\n\t\tinterpolant.settings = interpolantSettings;\n\n\t}\n\n\tthis._interpolantSettings = interpolantSettings;\n\n\tthis._interpolants = interpolants;\t// bound by the mixer\n\n\t// inside: PropertyMixer (managed by the mixer)\n\tthis._propertyBindings = new Array( nTracks );\n\n\tthis._cacheIndex = null;\t\t\t// for the memory manager\n\tthis._byClipCacheIndex = null;\t\t// for the memory manager\n\n\tthis._timeScaleInterpolant = null;\n\tthis._weightInterpolant = null;\n\n\tthis.loop = LoopRepeat;\n\tthis._loopCount = - 1;\n\n\t// global mixer time when the action is to be started\n\t// it's set back to 'null' upon start of the action\n\tthis._startTime = null;\n\n\t// scaled local time of the action\n\t// gets clamped or wrapped to 0..clip.duration according to loop\n\tthis.time = 0;\n\n\tthis.timeScale = 1;\n\tthis._effectiveTimeScale = 1;\n\n\tthis.weight = 1;\n\tthis._effectiveWeight = 1;\n\n\tthis.repetitions = Infinity; \t\t// no. of repetitions when looping\n\n\tthis.paused = false;\t\t\t\t// true -> zero effective time scale\n\tthis.enabled = true;\t\t\t\t// false -> zero effective weight\n\n\tthis.clampWhenFinished \t= false;\t// keep feeding the last frame?\n\n\tthis.zeroSlopeAtStart \t= true;\t\t// for smooth interpolation w/o separate\n\tthis.zeroSlopeAtEnd\t\t= true;\t\t// clips for start, loop and end\n\n}\n\nObject.assign( AnimationAction.prototype, {\n\n\t// State & Scheduling\n\n\tplay: function () {\n\n\t\tthis._mixer._activateAction( this );\n\n\t\treturn this;\n\n\t},\n\n\tstop: function () {\n\n\t\tthis._mixer._deactivateAction( this );\n\n\t\treturn this.reset();\n\n\t},\n\n\treset: function () {\n\n\t\tthis.paused = false;\n\t\tthis.enabled = true;\n\n\t\tthis.time = 0;\t\t\t// restart clip\n\t\tthis._loopCount = - 1;\t// forget previous loops\n\t\tthis._startTime = null;\t// forget scheduling\n\n\t\treturn this.stopFading().stopWarping();\n\n\t},\n\n\tisRunning: function () {\n\n\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t},\n\n\t// return true when play has been called\n\tisScheduled: function () {\n\n\t\treturn this._mixer._isActiveAction( this );\n\n\t},\n\n\tstartAt: function ( time ) {\n\n\t\tthis._startTime = time;\n\n\t\treturn this;\n\n\t},\n\n\tsetLoop: function ( mode, repetitions ) {\n\n\t\tthis.loop = mode;\n\t\tthis.repetitions = repetitions;\n\n\t\treturn this;\n\n\t},\n\n\t// Weight\n\n\t// set the weight stopping any scheduled fading\n\t// although .enabled = false yields an effective weight of zero, this\n\t// method does *not* change .enabled, because it would be confusing\n\tsetEffectiveWeight: function ( weight ) {\n\n\t\tthis.weight = weight;\n\n\t\t// note: same logic as when updated at runtime\n\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\treturn this.stopFading();\n\n\t},\n\n\t// return the weight considering fading and .enabled\n\tgetEffectiveWeight: function () {\n\n\t\treturn this._effectiveWeight;\n\n\t},\n\n\tfadeIn: function ( duration ) {\n\n\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t},\n\n\tfadeOut: function ( duration ) {\n\n\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t},\n\n\tcrossFadeFrom: function ( fadeOutAction, duration, warp ) {\n\n\t\tfadeOutAction.fadeOut( duration );\n\t\tthis.fadeIn( duration );\n\n\t\tif ( warp ) {\n\n\t\t\tvar fadeInDuration = this._clip.duration,\n\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcrossFadeTo: function ( fadeInAction, duration, warp ) {\n\n\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t},\n\n\tstopFading: function () {\n\n\t\tvar weightInterpolant = this._weightInterpolant;\n\n\t\tif ( weightInterpolant !== null ) {\n\n\t\t\tthis._weightInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// Time Scale Control\n\n\t// set the time scale stopping any scheduled warping\n\t// although .paused = true yields an effective time scale of zero, this\n\t// method does *not* change .paused, because it would be confusing\n\tsetEffectiveTimeScale: function ( timeScale ) {\n\n\t\tthis.timeScale = timeScale;\n\t\tthis._effectiveTimeScale = this.paused ? 0 : timeScale;\n\n\t\treturn this.stopWarping();\n\n\t},\n\n\t// return the time scale considering warping and .paused\n\tgetEffectiveTimeScale: function () {\n\n\t\treturn this._effectiveTimeScale;\n\n\t},\n\n\tsetDuration: function ( duration ) {\n\n\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\treturn this.stopWarping();\n\n\t},\n\n\tsyncWith: function ( action ) {\n\n\t\tthis.time = action.time;\n\t\tthis.timeScale = action.timeScale;\n\n\t\treturn this.stopWarping();\n\n\t},\n\n\thalt: function ( duration ) {\n\n\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t},\n\n\twarp: function ( startTimeScale, endTimeScale, duration ) {\n\n\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\tinterpolant = this._timeScaleInterpolant,\n\n\t\t\ttimeScale = this.timeScale;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t}\n\n\t\tvar times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\ttimes[ 1 ] = now + duration;\n\n\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\treturn this;\n\n\t},\n\n\tstopWarping: function () {\n\n\t\tvar timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\tthis._timeScaleInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// Object Accessors\n\n\tgetMixer: function () {\n\n\t\treturn this._mixer;\n\n\t},\n\n\tgetClip: function () {\n\n\t\treturn this._clip;\n\n\t},\n\n\tgetRoot: function () {\n\n\t\treturn this._localRoot || this._mixer._root;\n\n\t},\n\n\t// Interna\n\n\t_update: function ( time, deltaTime, timeDirection, accuIndex ) {\n\n\t\t// called by the mixer\n\n\t\tif ( ! this.enabled ) {\n\n\t\t\t// call ._updateWeight() to update ._effectiveWeight\n\n\t\t\tthis._updateWeight( time );\n\t\t\treturn;\n\n\t\t}\n\n\t\tvar startTime = this._startTime;\n\n\t\tif ( startTime !== null ) {\n\n\t\t\t// check for scheduled start of action\n\n\t\t\tvar timeRunning = ( time - startTime ) * timeDirection;\n\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\treturn; // yet to come / don't decide when delta = 0\n\n\t\t\t}\n\n\t\t\t// start\n\n\t\t\tthis._startTime = null; // unschedule\n\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t}\n\n\t\t// apply time scale and advance time\n\n\t\tdeltaTime *= this._updateTimeScale( time );\n\t\tvar clipTime = this._updateTime( deltaTime );\n\n\t\t// note: _updateTime may disable the action resulting in\n\t\t// an effective weight of 0\n\n\t\tvar weight = this._updateWeight( time );\n\n\t\tif ( weight > 0 ) {\n\n\t\t\tvar interpolants = this._interpolants;\n\t\t\tvar propertyMixers = this._propertyBindings;\n\n\t\t\tfor ( var j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\t_updateWeight: function ( time ) {\n\n\t\tvar weight = 0;\n\n\t\tif ( this.enabled ) {\n\n\t\t\tweight = this.weight;\n\t\t\tvar interpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\tthis.enabled = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveWeight = weight;\n\t\treturn weight;\n\n\t},\n\n\t_updateTimeScale: function ( time ) {\n\n\t\tvar timeScale = 0;\n\n\t\tif ( ! this.paused ) {\n\n\t\t\ttimeScale = this.timeScale;\n\n\t\t\tvar interpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\tthis.timeScale = timeScale;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveTimeScale = timeScale;\n\t\treturn timeScale;\n\n\t},\n\n\t_updateTime: function ( deltaTime ) {\n\n\t\tvar time = this.time + deltaTime;\n\n\t\tif ( deltaTime === 0 ) return time;\n\n\t\tvar duration = this._clip.duration,\n\n\t\t\tloop = this.loop,\n\t\t\tloopCount = this._loopCount;\n\n\t\tif ( loop === LoopOnce ) {\n\n\t\t\tif ( loopCount === - 1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tthis._loopCount = 0;\n\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t}\n\n\t\t\thandle_stop: {\n\n\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\ttime = duration;\n\n\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\ttime = 0;\n\n\t\t\t\t} else break handle_stop;\n\n\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\telse this.enabled = false;\n\n\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\tdirection: deltaTime < 0 ? - 1 : 1\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\tvar pingPong = ( loop === LoopPingPong );\n\n\t\t\tif ( loopCount === - 1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\tthis._setEndings( true, this.repetitions === 0, pingPong );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\tthis._setEndings( this.repetitions === 0, true, pingPong );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( time >= duration || time < 0 ) {\n\n\t\t\t\t// wrap around\n\n\t\t\t\tvar loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\tvar pending = this.repetitions - loopCount;\n\n\t\t\t\tif ( pending <= 0 ) {\n\n\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : - 1\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// keep running\n\n\t\t\t\t\tif ( pending === 1 ) {\n\n\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\tvar atStart = deltaTime < 0;\n\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\n\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\tthis.time = time;\n\t\t\t\treturn duration - time;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.time = time;\n\t\treturn time;\n\n\t},\n\n\t_setEndings: function ( atStart, atEnd, pingPong ) {\n\n\t\tvar settings = this._interpolantSettings;\n\n\t\tif ( pingPong ) {\n\n\t\t\tsettings.endingStart \t= ZeroSlopeEnding;\n\t\t\tsettings.endingEnd\t\t= ZeroSlopeEnding;\n\n\t\t} else {\n\n\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\tif ( atStart ) {\n\n\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t\tif ( atEnd ) {\n\n\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\t_scheduleFading: function ( duration, weightNow, weightThen ) {\n\n\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\tinterpolant = this._weightInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t}\n\n\t\tvar times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now; \t\t\t\tvalues[ 0 ] = weightNow;\n\t\ttimes[ 1 ] = now + duration;\tvalues[ 1 ] = weightThen;\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n *\n * Player for AnimationClips.\n *\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\nfunction AnimationMixer( root ) {\n\n\tthis._root = root;\n\tthis._initMemoryManager();\n\tthis._accuIndex = 0;\n\n\tthis.time = 0;\n\n\tthis.timeScale = 1.0;\n\n}\n\nAnimationMixer.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: AnimationMixer,\n\n\t_bindAction: function ( action, prototypeAction ) {\n\n\t\tvar root = action._localRoot || this._root,\n\t\t\ttracks = action._clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tbindings = action._propertyBindings,\n\t\t\tinterpolants = action._interpolants,\n\t\t\trootUuid = root.uuid,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingsByName === undefined ) {\n\n\t\t\tbindingsByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t}\n\n\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tvar track = tracks[ i ],\n\t\t\t\ttrackName = track.name,\n\t\t\t\tbinding = bindingsByName[ trackName ];\n\n\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t} else {\n\n\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar path = prototypeAction && prototypeAction.\n\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t}\n\n\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t}\n\n\t},\n\n\t_activateAction: function ( action ) {\n\n\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\tvar rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\tthis._bindAction( action,\n\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t}\n\n\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t// increment reference counts / sort out state\n\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._lendAction( action );\n\n\t\t}\n\n\t},\n\n\t_deactivateAction: function ( action ) {\n\n\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t// decrement reference counts / sort out state\n\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._takeBackAction( action );\n\n\t\t}\n\n\t},\n\n\t// Memory manager\n\n\t_initMemoryManager: function () {\n\n\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\tthis._nActiveActions = 0;\n\n\t\tthis._actionsByClip = {};\n\t\t// inside:\n\t\t// {\n\t\t// \t\tknownActions: Array< AnimationAction >\t- used as prototypes\n\t\t// \t\tactionByRoot: AnimationAction\t\t\t- lookup\n\t\t// }\n\n\n\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\tthis._nActiveBindings = 0;\n\n\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\tthis._controlInterpolants = []; // same game as above\n\t\tthis._nActiveControlInterpolants = 0;\n\n\t\tvar scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tactions: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._actions.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveActions;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tbindings: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._bindings.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveBindings;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontrolInterpolants: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._controlInterpolants.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveControlInterpolants;\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t};\n\n\t},\n\n\t// Memory management for AnimationAction objects\n\n\t_isActiveAction: function ( action ) {\n\n\t\tvar index = action._cacheIndex;\n\t\treturn index !== null && index < this._nActiveActions;\n\n\t},\n\n\t_addInactiveAction: function ( action, clipUuid, rootUuid ) {\n\n\t\tvar actions = this._actions,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip === undefined ) {\n\n\t\t\tactionsForClip = {\n\n\t\t\t\tknownActions: [ action ],\n\t\t\t\tactionByRoot: {}\n\n\t\t\t};\n\n\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t} else {\n\n\t\t\tvar knownActions = actionsForClip.knownActions;\n\n\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\tknownActions.push( action );\n\n\t\t}\n\n\t\taction._cacheIndex = actions.length;\n\t\tactions.push( action );\n\n\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t},\n\n\t_removeInactiveAction: function ( action ) {\n\n\t\tvar actions = this._actions,\n\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\tcacheIndex = action._cacheIndex;\n\n\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\tactions.pop();\n\n\t\taction._cacheIndex = null;\n\n\n\t\tvar clipUuid = action._clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\tlastKnownAction =\n\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\tknownActionsForClip.pop();\n\n\t\taction._byClipCacheIndex = null;\n\n\n\t\tvar actionByRoot = actionsForClip.actionByRoot,\n\t\t\trootUuid = ( action._localRoot || this._root ).uuid;\n\n\t\tdelete actionByRoot[ rootUuid ];\n\n\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t\tthis._removeInactiveBindingsForAction( action );\n\n\t},\n\n\t_removeInactiveBindingsForAction: function ( action ) {\n\n\t\tvar bindings = action._propertyBindings;\n\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tvar binding = bindings[ i ];\n\n\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\t_lendAction: function ( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions >| inactive actions ]\n\t\t// s a\n\t\t// <-swap->\n\t\t// a s\n\n\t\tvar actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\taction._cacheIndex = lastActiveIndex;\n\t\tactions[ lastActiveIndex ] = action;\n\n\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t},\n\n\t_takeBackAction: function ( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions |< inactive actions ]\n\t\t// a s\n\t\t// <-swap->\n\t\t// s a\n\n\t\tvar actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\taction._cacheIndex = firstInactiveIndex;\n\t\tactions[ firstInactiveIndex ] = action;\n\n\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t},\n\n\t// Memory management for PropertyMixer objects\n\n\t_addInactiveBinding: function ( binding, rootUuid, trackName ) {\n\n\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\tbindings = this._bindings;\n\n\t\tif ( bindingByName === undefined ) {\n\n\t\t\tbindingByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t}\n\n\t\tbindingByName[ trackName ] = binding;\n\n\t\tbinding._cacheIndex = bindings.length;\n\t\tbindings.push( binding );\n\n\t},\n\n\t_removeInactiveBinding: function ( binding ) {\n\n\t\tvar bindings = this._bindings,\n\t\t\tpropBinding = binding.binding,\n\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\ttrackName = propBinding.path,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\tbindings.pop();\n\n\t\tdelete bindingByName[ trackName ];\n\n\t\tremove_empty_map: {\n\n\t\t\tfor ( var _ in bindingByName ) break remove_empty_map; // eslint-disable-line no-unused-vars\n\n\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t}\n\n\t},\n\n\t_lendBinding: function ( binding ) {\n\n\t\tvar bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\tbinding._cacheIndex = lastActiveIndex;\n\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t},\n\n\t_takeBackBinding: function ( binding ) {\n\n\t\tvar bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t},\n\n\n\t// Memory management of Interpolants for weight and time scale\n\n\t_lendControlInterpolant: function () {\n\n\t\tvar interpolants = this._controlInterpolants,\n\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++,\n\t\t\tinterpolant = interpolants[ lastActiveIndex ];\n\n\t\tif ( interpolant === undefined ) {\n\n\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t1, this._controlInterpolantsResultBuffer );\n\n\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t}\n\n\t\treturn interpolant;\n\n\t},\n\n\t_takeBackControlInterpolant: function ( interpolant ) {\n\n\t\tvar interpolants = this._controlInterpolants,\n\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t},\n\n\t_controlInterpolantsResultBuffer: new Float32Array( 1 ),\n\n\t// return an action for a clip optionally using a custom root target\n\t// object (this method allocates a lot of dynamic memory in case a\n\t// previously unknown clip/root combination is specified)\n\tclipAction: function ( clip, optionalRoot ) {\n\n\t\tvar root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid,\n\n\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\tclipUuid = clipObject !== null ? clipObject.uuid : clip,\n\n\t\t\tactionsForClip = this._actionsByClip[ clipUuid ],\n\t\t\tprototypeAction = null;\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\tvar existingAction =\n\t\t\t\t\tactionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\tif ( existingAction !== undefined ) {\n\n\t\t\t\treturn existingAction;\n\n\t\t\t}\n\n\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t// the bindings again but can just copy\n\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t// also, take the clip from the prototype action\n\t\t\tif ( clipObject === null )\n\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t}\n\n\t\t// clip must be known when specified via string\n\t\tif ( clipObject === null ) return null;\n\n\t\t// allocate all resources required to run it\n\t\tvar newAction = new AnimationAction( this, clipObject, optionalRoot );\n\n\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t// and make the action known to the memory manager\n\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\treturn newAction;\n\n\t},\n\n\t// get an existing action\n\texistingAction: function ( clip, optionalRoot ) {\n\n\t\tvar root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid,\n\n\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t}\n\n\t\treturn null;\n\n\t},\n\n\t// deactivates all previously scheduled actions\n\tstopAllAction: function () {\n\n\t\tvar actions = this._actions,\n\t\t\tnActions = this._nActiveActions,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = this._nActiveBindings;\n\n\t\tthis._nActiveActions = 0;\n\t\tthis._nActiveBindings = 0;\n\n\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\tactions[ i ].reset();\n\n\t\t}\n\n\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\tbindings[ i ].useCount = 0;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// advance the time and update apply the animation\n\tupdate: function ( deltaTime ) {\n\n\t\tdeltaTime *= this.timeScale;\n\n\t\tvar actions = this._actions,\n\t\t\tnActions = this._nActiveActions,\n\n\t\t\ttime = this.time += deltaTime,\n\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t// run active actions\n\n\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\tvar action = actions[ i ];\n\n\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t}\n\n\t\t// update scene graph\n\n\t\tvar bindings = this._bindings,\n\t\t\tnBindings = this._nActiveBindings;\n\n\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// return this mixer's root target object\n\tgetRoot: function () {\n\n\t\treturn this._root;\n\n\t},\n\n\t// free all resources specific to a particular clip\n\tuncacheClip: function ( clip ) {\n\n\t\tvar actions = this._actions,\n\t\t\tclipUuid = clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t// iteration state and also require updating the state we can\n\t\t\t// just throw away\n\n\t\t\tvar actionsToRemove = actionsForClip.knownActions;\n\n\t\t\tfor ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\tvar action = actionsToRemove[ i ];\n\n\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\tvar cacheIndex = action._cacheIndex,\n\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\taction._cacheIndex = null;\n\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\tactions.pop();\n\n\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t}\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t},\n\n\t// free all resources specific to a particular root target object\n\tuncacheRoot: function ( root ) {\n\n\t\tvar rootUuid = root.uuid,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tfor ( var clipUuid in actionsByClip ) {\n\n\t\t\tvar actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\tif ( action !== undefined ) {\n\n\t\t\t\tthis._deactivateAction( action );\n\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName !== undefined ) {\n\n\t\t\tfor ( var trackName in bindingByName ) {\n\n\t\t\t\tvar binding = bindingByName[ trackName ];\n\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\t// remove a targeted clip from the cache\n\tuncacheAction: function ( clip, optionalRoot ) {\n\n\t\tvar action = this.existingAction( clip, optionalRoot );\n\n\t\tif ( action !== null ) {\n\n\t\t\tthis._deactivateAction( action );\n\t\t\tthis._removeInactiveAction( action );\n\n\t\t}\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction Uniform( value ) {\n\n\tif ( typeof value === 'string' ) {\n\n\t\tconsole.warn( 'THREE.Uniform: Type parameter is no longer needed.' );\n\t\tvalue = arguments[ 1 ];\n\n\t}\n\n\tthis.value = value;\n\n}\n\nUniform.prototype.clone = function () {\n\n\treturn new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );\n\n};\n\n/**\n * @author benaadams / https://twitter.com/ben_a_adams\n */\n\nfunction InstancedBufferGeometry() {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'InstancedBufferGeometry';\n\tthis.maxInstancedCount = undefined;\n\n}\n\nInstancedBufferGeometry.prototype = Object.assign( Object.create( BufferGeometry.prototype ), {\n\n\tconstructor: InstancedBufferGeometry,\n\n\tisInstancedBufferGeometry: true,\n\n\tcopy: function ( source ) {\n\n\t\tBufferGeometry.prototype.copy.call( this, source );\n\n\t\tthis.maxInstancedCount = source.maxInstancedCount;\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n} );\n\n/**\n * @author benaadams / https://twitter.com/ben_a_adams\n */\n\nfunction InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) {\n\n\tthis.data = interleavedBuffer;\n\tthis.itemSize = itemSize;\n\tthis.offset = offset;\n\n\tthis.normalized = normalized === true;\n\n}\n\nObject.defineProperties( InterleavedBufferAttribute.prototype, {\n\n\tcount: {\n\n\t\tget: function () {\n\n\t\t\treturn this.data.count;\n\n\t\t}\n\n\t},\n\n\tarray: {\n\n\t\tget: function () {\n\n\t\t\treturn this.data.array;\n\n\t\t}\n\n\t}\n\n} );\n\nObject.assign( InterleavedBufferAttribute.prototype, {\n\n\tisInterleavedBufferAttribute: true,\n\n\tsetX: function ( index, x ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\treturn this;\n\n\t},\n\n\tsetY: function ( index, y ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetZ: function ( index, z ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\treturn this;\n\n\t},\n\n\tsetW: function ( index, w ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\treturn this;\n\n\t},\n\n\tgetX: function ( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset ];\n\n\t},\n\n\tgetY: function ( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t},\n\n\tgetZ: function ( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t},\n\n\tgetW: function ( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t},\n\n\tsetXY: function ( index, x, y ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetXYZ: function ( index, x, y, z ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t},\n\n\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\t\tthis.data.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author benaadams / https://twitter.com/ben_a_adams\n */\n\nfunction InterleavedBuffer( array, stride ) {\n\n\tthis.array = array;\n\tthis.stride = stride;\n\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\tthis.dynamic = false;\n\tthis.updateRange = { offset: 0, count: - 1 };\n\n\tthis.version = 0;\n\n}\n\nObject.defineProperty( InterleavedBuffer.prototype, 'needsUpdate', {\n\n\tset: function ( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n} );\n\nObject.assign( InterleavedBuffer.prototype, {\n\n\tisInterleavedBuffer: true,\n\n\tonUploadCallback: function () {},\n\n\tsetArray: function ( array ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\tthis.count = array !== undefined ? array.length / this.stride : 0;\n\t\tthis.array = array;\n\n\t\treturn this;\n\n\t},\n\n\tsetDynamic: function ( value ) {\n\n\t\tthis.dynamic = value;\n\n\t\treturn this;\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.count = source.count;\n\t\tthis.stride = source.stride;\n\t\tthis.dynamic = source.dynamic;\n\n\t\treturn this;\n\n\t},\n\n\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.stride;\n\t\tindex2 *= attribute.stride;\n\n\t\tfor ( var i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tset: function ( value, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tonUpload: function ( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author benaadams / https://twitter.com/ben_a_adams\n */\n\nfunction InstancedInterleavedBuffer( array, stride, meshPerAttribute ) {\n\n\tInterleavedBuffer.call( this, array, stride );\n\n\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n}\n\nInstancedInterleavedBuffer.prototype = Object.assign( Object.create( InterleavedBuffer.prototype ), {\n\n\tconstructor: InstancedInterleavedBuffer,\n\n\tisInstancedInterleavedBuffer: true,\n\n\tcopy: function ( source ) {\n\n\t\tInterleavedBuffer.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author benaadams / https://twitter.com/ben_a_adams\n */\n\nfunction InstancedBufferAttribute( array, itemSize, meshPerAttribute ) {\n\n\tBufferAttribute.call( this, array, itemSize );\n\n\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n}\n\nInstancedBufferAttribute.prototype = Object.assign( Object.create( BufferAttribute.prototype ), {\n\n\tconstructor: InstancedBufferAttribute,\n\n\tisInstancedBufferAttribute: true,\n\n\tcopy: function ( source ) {\n\n\t\tBufferAttribute.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author bhouston / http://clara.io/\n * @author stephomi / http://stephaneginier.com/\n */\n\nfunction Raycaster( origin, direction, near, far ) {\n\n\tthis.ray = new Ray( origin, direction );\n\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\tthis.near = near || 0;\n\tthis.far = far || Infinity;\n\n\tthis.params = {\n\t\tMesh: {},\n\t\tLine: {},\n\t\tLOD: {},\n\t\tPoints: { threshold: 1 },\n\t\tSprite: {}\n\t};\n\n\tObject.defineProperties( this.params, {\n\t\tPointCloud: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' );\n\t\t\t\treturn this.Points;\n\n\t\t\t}\n\t\t}\n\t} );\n\n}\n\nfunction ascSort( a, b ) {\n\n\treturn a.distance - b.distance;\n\n}\n\nfunction intersectObject( object, raycaster, intersects, recursive ) {\n\n\tif ( object.visible === false ) return;\n\n\tobject.raycast( raycaster, intersects );\n\n\tif ( recursive === true ) {\n\n\t\tvar children = object.children;\n\n\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tintersectObject( children[ i ], raycaster, intersects, true );\n\n\t\t}\n\n\t}\n\n}\n\nObject.assign( Raycaster.prototype, {\n\n\tlinePrecision: 1,\n\n\tset: function ( origin, direction ) {\n\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.ray.set( origin, direction );\n\n\t},\n\n\tsetFromCamera: function ( coords, camera ) {\n\n\t\tif ( ( camera && camera.isPerspectiveCamera ) ) {\n\n\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\n\t\t} else if ( ( camera && camera.isOrthographicCamera ) ) {\n\n\t\t\tthis.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera\n\t\t\tthis.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.Raycaster: Unsupported camera type.' );\n\n\t\t}\n\n\t},\n\n\tintersectObject: function ( object, recursive, optionalTarget ) {\n\n\t\tvar intersects = optionalTarget || [];\n\n\t\tintersectObject( object, this, intersects, recursive );\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t},\n\n\tintersectObjects: function ( objects, recursive, optionalTarget ) {\n\n\t\tvar intersects = optionalTarget || [];\n\n\t\tif ( Array.isArray( objects ) === false ) {\n\n\t\t\tconsole.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' );\n\t\t\treturn intersects;\n\n\t\t}\n\n\t\tfor ( var i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\tintersectObject( objects[ i ], this, intersects, recursive );\n\n\t\t}\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n} );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction Clock( autoStart ) {\n\n\tthis.autoStart = ( autoStart !== undefined ) ? autoStart : true;\n\n\tthis.startTime = 0;\n\tthis.oldTime = 0;\n\tthis.elapsedTime = 0;\n\n\tthis.running = false;\n\n}\n\nObject.assign( Clock.prototype, {\n\n\tstart: function () {\n\n\t\tthis.startTime = ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732\n\n\t\tthis.oldTime = this.startTime;\n\t\tthis.elapsedTime = 0;\n\t\tthis.running = true;\n\n\t},\n\n\tstop: function () {\n\n\t\tthis.getElapsedTime();\n\t\tthis.running = false;\n\t\tthis.autoStart = false;\n\n\t},\n\n\tgetElapsedTime: function () {\n\n\t\tthis.getDelta();\n\t\treturn this.elapsedTime;\n\n\t},\n\n\tgetDelta: function () {\n\n\t\tvar diff = 0;\n\n\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\tthis.start();\n\t\t\treturn 0;\n\n\t\t}\n\n\t\tif ( this.running ) {\n\n\t\t\tvar newTime = ( typeof performance === 'undefined' ? Date : performance ).now();\n\n\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\tthis.oldTime = newTime;\n\n\t\t\tthis.elapsedTime += diff;\n\n\t\t}\n\n\t\treturn diff;\n\n\t}\n\n} );\n\n/**\n * @author bhouston / http://clara.io\n * @author WestLangley / http://github.com/WestLangley\n *\n * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system\n *\n * The poles (phi) are at the positive and negative y axis.\n * The equator starts at positive z.\n */\n\nfunction Spherical( radius, phi, theta ) {\n\n\tthis.radius = ( radius !== undefined ) ? radius : 1.0;\n\tthis.phi = ( phi !== undefined ) ? phi : 0; // up / down towards top and bottom pole\n\tthis.theta = ( theta !== undefined ) ? theta : 0; // around the equator of the sphere\n\n\treturn this;\n\n}\n\nObject.assign( Spherical.prototype, {\n\n\tset: function ( radius, phi, theta ) {\n\n\t\tthis.radius = radius;\n\t\tthis.phi = phi;\n\t\tthis.theta = theta;\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.phi = other.phi;\n\t\tthis.theta = other.theta;\n\n\t\treturn this;\n\n\t},\n\n\t// restrict phi to be betwee EPS and PI-EPS\n\tmakeSafe: function () {\n\n\t\tvar EPS = 0.000001;\n\t\tthis.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromVector3: function ( vec3 ) {\n\n\t\tthis.radius = vec3.length();\n\n\t\tif ( this.radius === 0 ) {\n\n\t\t\tthis.theta = 0;\n\t\t\tthis.phi = 0;\n\n\t\t} else {\n\n\t\t\tthis.theta = Math.atan2( vec3.x, vec3.z ); // equator angle around y-up axis\n\t\t\tthis.phi = Math.acos( _Math.clamp( vec3.y / this.radius, - 1, 1 ) ); // polar angle\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author Mugen87 / https://github.com/Mugen87\n *\n * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system\n *\n */\n\nfunction Cylindrical( radius, theta, y ) {\n\n\tthis.radius = ( radius !== undefined ) ? radius : 1.0; // distance from the origin to a point in the x-z plane\n\tthis.theta = ( theta !== undefined ) ? theta : 0; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis\n\tthis.y = ( y !== undefined ) ? y : 0; // height above the x-z plane\n\n\treturn this;\n\n}\n\nObject.assign( Cylindrical.prototype, {\n\n\tset: function ( radius, theta, y ) {\n\n\t\tthis.radius = radius;\n\t\tthis.theta = theta;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.theta = other.theta;\n\t\tthis.y = other.y;\n\n\t\treturn this;\n\n\t},\n\n\tsetFromVector3: function ( vec3 ) {\n\n\t\tthis.radius = Math.sqrt( vec3.x * vec3.x + vec3.z * vec3.z );\n\t\tthis.theta = Math.atan2( vec3.x, vec3.z );\n\t\tthis.y = vec3.y;\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author bhouston / http://clara.io\n */\n\nfunction Box2( min, max ) {\n\n\tthis.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity );\n\tthis.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity );\n\n}\n\nObject.assign( Box2.prototype, {\n\n\tset: function ( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromPoints: function ( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetFromCenterAndSize: function () {\n\n\t\tvar v1 = new Vector2();\n\n\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t},\n\n\tmakeEmpty: function () {\n\n\t\tthis.min.x = this.min.y = + Infinity;\n\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\treturn this;\n\n\t},\n\n\tisEmpty: function () {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t},\n\n\tgetCenter: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .getCenter() target is now required' );\n\t\t\ttarget = new Vector2();\n\n\t\t}\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t},\n\n\tgetSize: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .getSize() target is now required' );\n\t\t\ttarget = new Vector2();\n\n\t\t}\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t},\n\n\texpandByPoint: function ( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t},\n\n\texpandByVector: function ( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t},\n\n\texpandByScalar: function ( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t},\n\n\tcontainsPoint: function ( point ) {\n\n\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\tpoint.y < this.min.y || point.y > this.max.y ? false : true;\n\n\t},\n\n\tcontainsBox: function ( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y;\n\n\t},\n\n\tgetParameter: function ( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .getParameter() target is now required' );\n\t\t\ttarget = new Vector2();\n\n\t\t}\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t);\n\n\t},\n\n\tintersectsBox: function ( box ) {\n\n\t\t// using 4 splitting planes to rule out intersections\n\n\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ? false : true;\n\n\t},\n\n\tclampPoint: function ( point, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .clampPoint() target is now required' );\n\t\t\ttarget = new Vector2();\n\n\t\t}\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t},\n\n\tdistanceToPoint: function () {\n\n\t\tvar v1 = new Vector2();\n\n\t\treturn function distanceToPoint( point ) {\n\n\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t};\n\n\t}(),\n\n\tintersect: function ( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\treturn this;\n\n\t},\n\n\tunion: function ( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t},\n\n\ttranslate: function ( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n} );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction ImmediateRenderObject( material ) {\n\n\tObject3D.call( this );\n\n\tthis.material = material;\n\tthis.render = function ( /* renderCallback */ ) {};\n\n}\n\nImmediateRenderObject.prototype = Object.create( Object3D.prototype );\nImmediateRenderObject.prototype.constructor = ImmediateRenderObject;\n\nImmediateRenderObject.prototype.isImmediateRenderObject = true;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction VertexNormalsHelper( object, size, hex, linewidth ) {\n\n\tthis.object = object;\n\n\tthis.size = ( size !== undefined ) ? size : 1;\n\n\tvar color = ( hex !== undefined ) ? hex : 0xff0000;\n\n\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t//\n\n\tvar nNormals = 0;\n\n\tvar objGeometry = this.object.geometry;\n\n\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\tnNormals = objGeometry.faces.length * 3;\n\n\t} else if ( objGeometry && objGeometry.isBufferGeometry ) {\n\n\t\tnNormals = objGeometry.attributes.normal.count;\n\n\t}\n\n\t//\n\n\tvar geometry = new BufferGeometry();\n\n\tvar positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 );\n\n\tgeometry.addAttribute( 'position', positions );\n\n\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t//\n\n\tthis.matrixAutoUpdate = false;\n\n\tthis.update();\n\n}\n\nVertexNormalsHelper.prototype = Object.create( LineSegments.prototype );\nVertexNormalsHelper.prototype.constructor = VertexNormalsHelper;\n\nVertexNormalsHelper.prototype.update = ( function () {\n\n\tvar v1 = new Vector3();\n\tvar v2 = new Vector3();\n\tvar normalMatrix = new Matrix3();\n\n\treturn function update() {\n\n\t\tvar keys = [ 'a', 'b', 'c' ];\n\n\t\tthis.object.updateMatrixWorld( true );\n\n\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\tvar position = this.geometry.attributes.position;\n\n\t\t//\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\tvar faces = objGeometry.faces;\n\n\t\t\tvar idx = 0;\n\n\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tvar vertex = vertices[ face[ keys[ j ] ] ];\n\n\t\t\t\t\tvar normal = face.vertexNormals[ j ];\n\n\t\t\t\t\tv1.copy( vertex ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( objGeometry && objGeometry.isBufferGeometry ) {\n\n\t\t\tvar objPos = objGeometry.attributes.position;\n\n\t\t\tvar objNorm = objGeometry.attributes.normal;\n\n\t\t\tvar idx = 0;\n\n\t\t\t// for simplicity, ignore index and drawcalls, and render every normal\n\n\t\t\tfor ( var j = 0, jl = objPos.count; j < jl; j ++ ) {\n\n\t\t\t\tv1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld );\n\n\t\t\t\tv2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) );\n\n\t\t\t\tv2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tposition.needsUpdate = true;\n\n\t};\n\n}() );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author mrdoob / http://mrdoob.com/\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction SpotLightHelper( light, color ) {\n\n\tObject3D.call( this );\n\n\tthis.light = light;\n\tthis.light.updateMatrixWorld();\n\n\tthis.matrix = light.matrixWorld;\n\tthis.matrixAutoUpdate = false;\n\n\tthis.color = color;\n\n\tvar geometry = new BufferGeometry();\n\n\tvar positions = [\n\t\t0, 0, 0, \t0, 0, 1,\n\t\t0, 0, 0, \t1, 0, 1,\n\t\t0, 0, 0,\t- 1, 0, 1,\n\t\t0, 0, 0, \t0, 1, 1,\n\t\t0, 0, 0, \t0, - 1, 1\n\t];\n\n\tfor ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\tvar p1 = ( i / l ) * Math.PI * 2;\n\t\tvar p2 = ( j / l ) * Math.PI * 2;\n\n\t\tpositions.push(\n\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\n\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\n\t\t);\n\n\t}\n\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\tvar material = new LineBasicMaterial( { fog: false } );\n\n\tthis.cone = new LineSegments( geometry, material );\n\tthis.add( this.cone );\n\n\tthis.update();\n\n}\n\nSpotLightHelper.prototype = Object.create( Object3D.prototype );\nSpotLightHelper.prototype.constructor = SpotLightHelper;\n\nSpotLightHelper.prototype.dispose = function () {\n\n\tthis.cone.geometry.dispose();\n\tthis.cone.material.dispose();\n\n};\n\nSpotLightHelper.prototype.update = function () {\n\n\tvar vector = new Vector3();\n\tvar vector2 = new Vector3();\n\n\treturn function update() {\n\n\t\tthis.light.updateMatrixWorld();\n\n\t\tvar coneLength = this.light.distance ? this.light.distance : 1000;\n\t\tvar coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\tvector.setFromMatrixPosition( this.light.matrixWorld );\n\t\tvector2.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\tthis.cone.lookAt( vector2.sub( vector ) );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.cone.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.cone.material.color.copy( this.light.color );\n\n\t\t}\n\n\t};\n\n}();\n\n/**\n * @author Sean Griffin / http://twitter.com/sgrif\n * @author Michael Guerrero / http://realitymeltdown.com\n * @author mrdoob / http://mrdoob.com/\n * @author ikerr / http://verold.com\n * @author Mugen87 / https://github.com/Mugen87\n */\n\nfunction getBoneList( object ) {\n\n\tvar boneList = [];\n\n\tif ( object && object.isBone ) {\n\n\t\tboneList.push( object );\n\n\t}\n\n\tfor ( var i = 0; i < object.children.length; i ++ ) {\n\n\t\tboneList.push.apply( boneList, getBoneList( object.children[ i ] ) );\n\n\t}\n\n\treturn boneList;\n\n}\n\nfunction SkeletonHelper( object ) {\n\n\tvar bones = getBoneList( object );\n\n\tvar geometry = new BufferGeometry();\n\n\tvar vertices = [];\n\tvar colors = [];\n\n\tvar color1 = new Color( 0, 0, 1 );\n\tvar color2 = new Color( 0, 1, 0 );\n\n\tfor ( var i = 0; i < bones.length; i ++ ) {\n\n\t\tvar bone = bones[ i ];\n\n\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tcolors.push( color1.r, color1.g, color1.b );\n\t\t\tcolors.push( color2.r, color2.g, color2.b );\n\n\t\t}\n\n\t}\n\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\tvar material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } );\n\n\tLineSegments.call( this, geometry, material );\n\n\tthis.root = object;\n\tthis.bones = bones;\n\n\tthis.matrix = object.matrixWorld;\n\tthis.matrixAutoUpdate = false;\n\n}\n\nSkeletonHelper.prototype = Object.create( LineSegments.prototype );\nSkeletonHelper.prototype.constructor = SkeletonHelper;\n\nSkeletonHelper.prototype.updateMatrixWorld = function () {\n\n\tvar vector = new Vector3();\n\n\tvar boneMatrix = new Matrix4();\n\tvar matrixWorldInv = new Matrix4();\n\n\treturn function updateMatrixWorld( force ) {\n\n\t\tvar bones = this.bones;\n\n\t\tvar geometry = this.geometry;\n\t\tvar position = geometry.getAttribute( 'position' );\n\n\t\tmatrixWorldInv.getInverse( this.root.matrixWorld );\n\n\t\tfor ( var i = 0, j = 0; i < bones.length; i ++ ) {\n\n\t\t\tvar bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld );\n\t\t\t\tvector.setFromMatrixPosition( boneMatrix );\n\t\t\t\tposition.setXYZ( j, vector.x, vector.y, vector.z );\n\n\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\tvector.setFromMatrixPosition( boneMatrix );\n\t\t\t\tposition.setXYZ( j + 1, vector.x, vector.y, vector.z );\n\n\t\t\t\tj += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t};\n\n}();\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction PointLightHelper( light, sphereSize, color ) {\n\n\tthis.light = light;\n\tthis.light.updateMatrixWorld();\n\n\tthis.color = color;\n\n\tvar geometry = new SphereBufferGeometry( sphereSize, 4, 2 );\n\tvar material = new MeshBasicMaterial( { wireframe: true, fog: false } );\n\n\tMesh.call( this, geometry, material );\n\n\tthis.matrix = this.light.matrixWorld;\n\tthis.matrixAutoUpdate = false;\n\n\tthis.update();\n\n\n\t/*\n\tvar distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\tvar distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\tvar d = light.distance;\n\n\tif ( d === 0.0 ) {\n\n\t\tthis.lightDistance.visible = false;\n\n\t} else {\n\n\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t}\n\n\tthis.add( this.lightDistance );\n\t*/\n\n}\n\nPointLightHelper.prototype = Object.create( Mesh.prototype );\nPointLightHelper.prototype.constructor = PointLightHelper;\n\nPointLightHelper.prototype.dispose = function () {\n\n\tthis.geometry.dispose();\n\tthis.material.dispose();\n\n};\n\nPointLightHelper.prototype.update = function () {\n\n\tif ( this.color !== undefined ) {\n\n\t\tthis.material.color.set( this.color );\n\n\t} else {\n\n\t\tthis.material.color.copy( this.light.color );\n\n\t}\n\n\t/*\n\tvar d = this.light.distance;\n\n\tif ( d === 0.0 ) {\n\n\t\tthis.lightDistance.visible = false;\n\n\t} else {\n\n\t\tthis.lightDistance.visible = true;\n\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t}\n\t*/\n\n};\n\n/**\n * @author abelnation / http://github.com/abelnation\n * @author Mugen87 / http://github.com/Mugen87\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction RectAreaLightHelper( light, color ) {\n\n\tObject3D.call( this );\n\n\tthis.light = light;\n\tthis.light.updateMatrixWorld();\n\n\tthis.matrix = light.matrixWorld;\n\tthis.matrixAutoUpdate = false;\n\n\tthis.color = color;\n\n\tvar material = new LineBasicMaterial( { fog: false } );\n\n\tvar geometry = new BufferGeometry();\n\n\tgeometry.addAttribute( 'position', new BufferAttribute( new Float32Array( 5 * 3 ), 3 ) );\n\n\tthis.line = new Line( geometry, material );\n\tthis.add( this.line );\n\n\n\tthis.update();\n\n}\n\nRectAreaLightHelper.prototype = Object.create( Object3D.prototype );\nRectAreaLightHelper.prototype.constructor = RectAreaLightHelper;\n\nRectAreaLightHelper.prototype.dispose = function () {\n\n\tthis.children[ 0 ].geometry.dispose();\n\tthis.children[ 0 ].material.dispose();\n\n};\n\nRectAreaLightHelper.prototype.update = function () {\n\n\t// calculate new dimensions of the helper\n\n\tvar hx = this.light.width * 0.5;\n\tvar hy = this.light.height * 0.5;\n\n\tvar position = this.line.geometry.attributes.position;\n\tvar array = position.array;\n\n\t// update vertices\n\n\tarray[ 0 ] = hx; array[ 1 ] = - hy; array[ 2 ] = 0;\n\tarray[ 3 ] = hx; array[ 4 ] = hy; array[ 5 ] = 0;\n\tarray[ 6 ] = - hx; array[ 7 ] = hy; array[ 8 ] = 0;\n\tarray[ 9 ] = - hx; array[ 10 ] = - hy; array[ 11 ] = 0;\n\tarray[ 12 ] = hx; array[ 13 ] = - hy; array[ 14 ] = 0;\n\n\tposition.needsUpdate = true;\n\n\tif ( this.color !== undefined ) {\n\n\t\tthis.line.material.color.set( this.color );\n\n\t} else {\n\n\t\tthis.line.material.color.copy( this.light.color );\n\n\t}\n\n};\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author mrdoob / http://mrdoob.com/\n * @author Mugen87 / https://github.com/Mugen87\n */\n\nfunction HemisphereLightHelper( light, size, color ) {\n\n\tObject3D.call( this );\n\n\tthis.light = light;\n\tthis.light.updateMatrixWorld();\n\n\tthis.matrix = light.matrixWorld;\n\tthis.matrixAutoUpdate = false;\n\n\tthis.color = color;\n\n\tvar geometry = new OctahedronBufferGeometry( size );\n\tgeometry.rotateY( Math.PI * 0.5 );\n\n\tthis.material = new MeshBasicMaterial( { wireframe: true, fog: false } );\n\tif ( this.color === undefined ) this.material.vertexColors = VertexColors;\n\n\tvar position = geometry.getAttribute( 'position' );\n\tvar colors = new Float32Array( position.count * 3 );\n\n\tgeometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\tthis.add( new Mesh( geometry, this.material ) );\n\n\tthis.update();\n\n}\n\nHemisphereLightHelper.prototype = Object.create( Object3D.prototype );\nHemisphereLightHelper.prototype.constructor = HemisphereLightHelper;\n\nHemisphereLightHelper.prototype.dispose = function () {\n\n\tthis.children[ 0 ].geometry.dispose();\n\tthis.children[ 0 ].material.dispose();\n\n};\n\nHemisphereLightHelper.prototype.update = function () {\n\n\tvar vector = new Vector3();\n\n\tvar color1 = new Color();\n\tvar color2 = new Color();\n\n\treturn function update() {\n\n\t\tvar mesh = this.children[ 0 ];\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tvar colors = mesh.geometry.getAttribute( 'color' );\n\n\t\t\tcolor1.copy( this.light.color );\n\t\t\tcolor2.copy( this.light.groundColor );\n\n\t\t\tfor ( var i = 0, l = colors.count; i < l; i ++ ) {\n\n\t\t\t\tvar color = ( i < ( l / 2 ) ) ? color1 : color2;\n\n\t\t\t\tcolors.setXYZ( i, color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t\tcolors.needsUpdate = true;\n\n\t\t}\n\n\t\tmesh.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\n\t};\n\n}();\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction GridHelper( size, divisions, color1, color2 ) {\n\n\tsize = size || 10;\n\tdivisions = divisions || 10;\n\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\tvar center = divisions / 2;\n\tvar step = size / divisions;\n\tvar halfSize = size / 2;\n\n\tvar vertices = [], colors = [];\n\n\tfor ( var i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {\n\n\t\tvertices.push( - halfSize, 0, k, halfSize, 0, k );\n\t\tvertices.push( k, 0, - halfSize, k, 0, halfSize );\n\n\t\tvar color = i === center ? color1 : color2;\n\n\t\tcolor.toArray( colors, j ); j += 3;\n\t\tcolor.toArray( colors, j ); j += 3;\n\t\tcolor.toArray( colors, j ); j += 3;\n\t\tcolor.toArray( colors, j ); j += 3;\n\n\t}\n\n\tvar geometry = new BufferGeometry();\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\tLineSegments.call( this, geometry, material );\n\n}\n\nGridHelper.prototype = Object.create( LineSegments.prototype );\nGridHelper.prototype.constructor = GridHelper;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author Mugen87 / http://github.com/Mugen87\n * @author Hectate / http://www.github.com/Hectate\n */\n\nfunction PolarGridHelper( radius, radials, circles, divisions, color1, color2 ) {\n\n\tradius = radius || 10;\n\tradials = radials || 16;\n\tcircles = circles || 8;\n\tdivisions = divisions || 64;\n\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\tvar vertices = [];\n\tvar colors = [];\n\n\tvar x, z;\n\tvar v, i, j, r, color;\n\n\t// create the radials\n\n\tfor ( i = 0; i <= radials; i ++ ) {\n\n\t\tv = ( i / radials ) * ( Math.PI * 2 );\n\n\t\tx = Math.sin( v ) * radius;\n\t\tz = Math.cos( v ) * radius;\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tvertices.push( x, 0, z );\n\n\t\tcolor = ( i & 1 ) ? color1 : color2;\n\n\t\tcolors.push( color.r, color.g, color.b );\n\t\tcolors.push( color.r, color.g, color.b );\n\n\t}\n\n\t// create the circles\n\n\tfor ( i = 0; i <= circles; i ++ ) {\n\n\t\tcolor = ( i & 1 ) ? color1 : color2;\n\n\t\tr = radius - ( radius / circles * i );\n\n\t\tfor ( j = 0; j < divisions; j ++ ) {\n\n\t\t\t// first vertex\n\n\t\t\tv = ( j / divisions ) * ( Math.PI * 2 );\n\n\t\t\tx = Math.sin( v ) * r;\n\t\t\tz = Math.cos( v ) * r;\n\n\t\t\tvertices.push( x, 0, z );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t// second vertex\n\n\t\t\tv = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );\n\n\t\t\tx = Math.sin( v ) * r;\n\t\t\tz = Math.cos( v ) * r;\n\n\t\t\tvertices.push( x, 0, z );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t}\n\n\t}\n\n\tvar geometry = new BufferGeometry();\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\tLineSegments.call( this, geometry, material );\n\n}\n\nPolarGridHelper.prototype = Object.create( LineSegments.prototype );\nPolarGridHelper.prototype.constructor = PolarGridHelper;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction FaceNormalsHelper( object, size, hex, linewidth ) {\n\n\t// FaceNormalsHelper only supports THREE.Geometry\n\n\tthis.object = object;\n\n\tthis.size = ( size !== undefined ) ? size : 1;\n\n\tvar color = ( hex !== undefined ) ? hex : 0xffff00;\n\n\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t//\n\n\tvar nNormals = 0;\n\n\tvar objGeometry = this.object.geometry;\n\n\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\tnNormals = objGeometry.faces.length;\n\n\t} else {\n\n\t\tconsole.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' );\n\n\t}\n\n\t//\n\n\tvar geometry = new BufferGeometry();\n\n\tvar positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 );\n\n\tgeometry.addAttribute( 'position', positions );\n\n\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t//\n\n\tthis.matrixAutoUpdate = false;\n\tthis.update();\n\n}\n\nFaceNormalsHelper.prototype = Object.create( LineSegments.prototype );\nFaceNormalsHelper.prototype.constructor = FaceNormalsHelper;\n\nFaceNormalsHelper.prototype.update = ( function () {\n\n\tvar v1 = new Vector3();\n\tvar v2 = new Vector3();\n\tvar normalMatrix = new Matrix3();\n\n\treturn function update() {\n\n\t\tthis.object.updateMatrixWorld( true );\n\n\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\tvar position = this.geometry.attributes.position;\n\n\t\t//\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tvar vertices = objGeometry.vertices;\n\n\t\tvar faces = objGeometry.faces;\n\n\t\tvar idx = 0;\n\n\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\n\t\t\tvar normal = face.normal;\n\n\t\t\tv1.copy( vertices[ face.a ] )\n\t\t\t\t.add( vertices[ face.b ] )\n\t\t\t\t.add( vertices[ face.c ] )\n\t\t\t\t.divideScalar( 3 )\n\t\t\t\t.applyMatrix4( matrixWorld );\n\n\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\tidx = idx + 1;\n\n\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\tidx = idx + 1;\n\n\t\t}\n\n\t\tposition.needsUpdate = true;\n\n\t};\n\n}() );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author mrdoob / http://mrdoob.com/\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction DirectionalLightHelper( light, size, color ) {\n\n\tObject3D.call( this );\n\n\tthis.light = light;\n\tthis.light.updateMatrixWorld();\n\n\tthis.matrix = light.matrixWorld;\n\tthis.matrixAutoUpdate = false;\n\n\tthis.color = color;\n\n\tif ( size === undefined ) size = 1;\n\n\tvar geometry = new BufferGeometry();\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( [\n\t\t- size, size, 0,\n\t\tsize, size, 0,\n\t\tsize, - size, 0,\n\t\t- size, - size, 0,\n\t\t- size, size, 0\n\t], 3 ) );\n\n\tvar material = new LineBasicMaterial( { fog: false } );\n\n\tthis.lightPlane = new Line( geometry, material );\n\tthis.add( this.lightPlane );\n\n\tgeometry = new BufferGeometry();\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\tthis.targetLine = new Line( geometry, material );\n\tthis.add( this.targetLine );\n\n\tthis.update();\n\n}\n\nDirectionalLightHelper.prototype = Object.create( Object3D.prototype );\nDirectionalLightHelper.prototype.constructor = DirectionalLightHelper;\n\nDirectionalLightHelper.prototype.dispose = function () {\n\n\tthis.lightPlane.geometry.dispose();\n\tthis.lightPlane.material.dispose();\n\tthis.targetLine.geometry.dispose();\n\tthis.targetLine.material.dispose();\n\n};\n\nDirectionalLightHelper.prototype.update = function () {\n\n\tvar v1 = new Vector3();\n\tvar v2 = new Vector3();\n\tvar v3 = new Vector3();\n\n\treturn function update() {\n\n\t\tv1.setFromMatrixPosition( this.light.matrixWorld );\n\t\tv2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\tv3.subVectors( v2, v1 );\n\n\t\tthis.lightPlane.lookAt( v3 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.lightPlane.material.color.set( this.color );\n\t\t\tthis.targetLine.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.lightPlane.material.color.copy( this.light.color );\n\t\t\tthis.targetLine.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\tthis.targetLine.lookAt( v3 );\n\t\tthis.targetLine.scale.z = v3.length();\n\n\t};\n\n}();\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author Mugen87 / https://github.com/Mugen87\n *\n *\t- shows frustum, line of sight and up of the camera\n *\t- suitable for fast updates\n * \t- based on frustum visualization in lightgl.js shadowmap example\n *\t\thttp://evanw.github.com/lightgl.js/tests/shadowmap.html\n */\n\nfunction CameraHelper( camera ) {\n\n\tvar geometry = new BufferGeometry();\n\tvar material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } );\n\n\tvar vertices = [];\n\tvar colors = [];\n\n\tvar pointMap = {};\n\n\t// colors\n\n\tvar colorFrustum = new Color( 0xffaa00 );\n\tvar colorCone = new Color( 0xff0000 );\n\tvar colorUp = new Color( 0x00aaff );\n\tvar colorTarget = new Color( 0xffffff );\n\tvar colorCross = new Color( 0x333333 );\n\n\t// near\n\n\taddLine( 'n1', 'n2', colorFrustum );\n\taddLine( 'n2', 'n4', colorFrustum );\n\taddLine( 'n4', 'n3', colorFrustum );\n\taddLine( 'n3', 'n1', colorFrustum );\n\n\t// far\n\n\taddLine( 'f1', 'f2', colorFrustum );\n\taddLine( 'f2', 'f4', colorFrustum );\n\taddLine( 'f4', 'f3', colorFrustum );\n\taddLine( 'f3', 'f1', colorFrustum );\n\n\t// sides\n\n\taddLine( 'n1', 'f1', colorFrustum );\n\taddLine( 'n2', 'f2', colorFrustum );\n\taddLine( 'n3', 'f3', colorFrustum );\n\taddLine( 'n4', 'f4', colorFrustum );\n\n\t// cone\n\n\taddLine( 'p', 'n1', colorCone );\n\taddLine( 'p', 'n2', colorCone );\n\taddLine( 'p', 'n3', colorCone );\n\taddLine( 'p', 'n4', colorCone );\n\n\t// up\n\n\taddLine( 'u1', 'u2', colorUp );\n\taddLine( 'u2', 'u3', colorUp );\n\taddLine( 'u3', 'u1', colorUp );\n\n\t// target\n\n\taddLine( 'c', 't', colorTarget );\n\taddLine( 'p', 'c', colorCross );\n\n\t// cross\n\n\taddLine( 'cn1', 'cn2', colorCross );\n\taddLine( 'cn3', 'cn4', colorCross );\n\n\taddLine( 'cf1', 'cf2', colorCross );\n\taddLine( 'cf3', 'cf4', colorCross );\n\n\tfunction addLine( a, b, color ) {\n\n\t\taddPoint( a, color );\n\t\taddPoint( b, color );\n\n\t}\n\n\tfunction addPoint( id, color ) {\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tcolors.push( color.r, color.g, color.b );\n\n\t\tif ( pointMap[ id ] === undefined ) {\n\n\t\t\tpointMap[ id ] = [];\n\n\t\t}\n\n\t\tpointMap[ id ].push( ( vertices.length / 3 ) - 1 );\n\n\t}\n\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\tLineSegments.call( this, geometry, material );\n\n\tthis.camera = camera;\n\tif ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();\n\n\tthis.matrix = camera.matrixWorld;\n\tthis.matrixAutoUpdate = false;\n\n\tthis.pointMap = pointMap;\n\n\tthis.update();\n\n}\n\nCameraHelper.prototype = Object.create( LineSegments.prototype );\nCameraHelper.prototype.constructor = CameraHelper;\n\nCameraHelper.prototype.update = function () {\n\n\tvar geometry, pointMap;\n\n\tvar vector = new Vector3();\n\tvar camera = new Camera();\n\n\tfunction setPoint( point, x, y, z ) {\n\n\t\tvector.set( x, y, z ).unproject( camera );\n\n\t\tvar points = pointMap[ point ];\n\n\t\tif ( points !== undefined ) {\n\n\t\t\tvar position = geometry.getAttribute( 'position' );\n\n\t\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\tposition.setXYZ( points[ i ], vector.x, vector.y, vector.z );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn function update() {\n\n\t\tgeometry = this.geometry;\n\t\tpointMap = this.pointMap;\n\n\t\tvar w = 1, h = 1;\n\n\t\t// we need just camera projection matrix\n\t\t// world matrix must be identity\n\n\t\tcamera.projectionMatrix.copy( this.camera.projectionMatrix );\n\n\t\t// center / target\n\n\t\tsetPoint( 'c', 0, 0, - 1 );\n\t\tsetPoint( 't', 0, 0, 1 );\n\n\t\t// near\n\n\t\tsetPoint( 'n1', - w, - h, - 1 );\n\t\tsetPoint( 'n2', w, - h, - 1 );\n\t\tsetPoint( 'n3', - w, h, - 1 );\n\t\tsetPoint( 'n4', w, h, - 1 );\n\n\t\t// far\n\n\t\tsetPoint( 'f1', - w, - h, 1 );\n\t\tsetPoint( 'f2', w, - h, 1 );\n\t\tsetPoint( 'f3', - w, h, 1 );\n\t\tsetPoint( 'f4', w, h, 1 );\n\n\t\t// up\n\n\t\tsetPoint( 'u1', w * 0.7, h * 1.1, - 1 );\n\t\tsetPoint( 'u2', - w * 0.7, h * 1.1, - 1 );\n\t\tsetPoint( 'u3', 0, h * 2, - 1 );\n\n\t\t// cross\n\n\t\tsetPoint( 'cf1', - w, 0, 1 );\n\t\tsetPoint( 'cf2', w, 0, 1 );\n\t\tsetPoint( 'cf3', 0, - h, 1 );\n\t\tsetPoint( 'cf4', 0, h, 1 );\n\n\t\tsetPoint( 'cn1', - w, 0, - 1 );\n\t\tsetPoint( 'cn2', w, 0, - 1 );\n\t\tsetPoint( 'cn3', 0, - h, - 1 );\n\t\tsetPoint( 'cn4', 0, h, - 1 );\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t};\n\n}();\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author Mugen87 / http://github.com/Mugen87\n */\n\nfunction BoxHelper( object, color ) {\n\n\tthis.object = object;\n\n\tif ( color === undefined ) color = 0xffff00;\n\n\tvar 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 ] );\n\tvar positions = new Float32Array( 8 * 3 );\n\n\tvar geometry = new BufferGeometry();\n\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\tgeometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) );\n\n\tthis.matrixAutoUpdate = false;\n\n\tthis.update();\n\n}\n\nBoxHelper.prototype = Object.create( LineSegments.prototype );\nBoxHelper.prototype.constructor = BoxHelper;\n\nBoxHelper.prototype.update = ( function () {\n\n\tvar box = new Box3();\n\n\treturn function update( object ) {\n\n\t\tif ( object !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.BoxHelper: .update() has no longer arguments.' );\n\n\t\t}\n\n\t\tif ( this.object !== undefined ) {\n\n\t\t\tbox.setFromObject( this.object );\n\n\t\t}\n\n\t\tif ( box.isEmpty() ) return;\n\n\t\tvar min = box.min;\n\t\tvar max = box.max;\n\n\t\t/*\n\t\t 5____4\n\t\t1/___0/|\n\t\t| 6__|_7\n\t\t2/___3/\n\n\t\t0: max.x, max.y, max.z\n\t\t1: min.x, max.y, max.z\n\t\t2: min.x, min.y, max.z\n\t\t3: max.x, min.y, max.z\n\t\t4: max.x, max.y, min.z\n\t\t5: min.x, max.y, min.z\n\t\t6: min.x, min.y, min.z\n\t\t7: max.x, min.y, min.z\n\t\t*/\n\n\t\tvar position = this.geometry.attributes.position;\n\t\tvar array = position.array;\n\n\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\tposition.needsUpdate = true;\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t};\n\n} )();\n\nBoxHelper.prototype.setFromObject = function ( object ) {\n\n\tthis.object = object;\n\tthis.update();\n\n\treturn this;\n\n};\n\n/**\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction Box3Helper( box, hex ) {\n\n\tthis.type = 'Box3Helper';\n\n\tthis.box = box;\n\n\tvar color = ( hex !== undefined ) ? hex : 0xffff00;\n\n\tvar 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 ] );\n\n\tvar 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 ];\n\n\tvar geometry = new BufferGeometry();\n\n\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) );\n\n\tthis.geometry.computeBoundingSphere();\n\n}\n\nBox3Helper.prototype = Object.create( LineSegments.prototype );\nBox3Helper.prototype.constructor = Box3Helper;\n\nBox3Helper.prototype.updateMatrixWorld = function ( force ) {\n\n\tvar box = this.box;\n\n\tif ( box.isEmpty() ) return;\n\n\tbox.getCenter( this.position );\n\n\tbox.getSize( this.scale );\n\n\tthis.scale.multiplyScalar( 0.5 );\n\n\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n};\n\n/**\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction PlaneHelper( plane, size, hex ) {\n\n\tthis.type = 'PlaneHelper';\n\n\tthis.plane = plane;\n\n\tthis.size = ( size === undefined ) ? 1 : size;\n\n\tvar color = ( hex !== undefined ) ? hex : 0xffff00;\n\n\tvar 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, 0, 0, 1, 0, 0, 0 ];\n\n\tvar geometry = new BufferGeometry();\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\tgeometry.computeBoundingSphere();\n\n\tLine.call( this, geometry, new LineBasicMaterial( { color: color } ) );\n\n\t//\n\n\tvar positions2 = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, - 1, 1, 1, - 1, 1 ];\n\n\tvar geometry2 = new BufferGeometry();\n\tgeometry2.addAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );\n\tgeometry2.computeBoundingSphere();\n\n\tthis.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false } ) ) );\n\n}\n\nPlaneHelper.prototype = Object.create( Line.prototype );\nPlaneHelper.prototype.constructor = PlaneHelper;\n\nPlaneHelper.prototype.updateMatrixWorld = function ( force ) {\n\n\tvar scale = - this.plane.constant;\n\n\tif ( Math.abs( scale ) < 1e-8 ) scale = 1e-8; // sign does not matter\n\n\tthis.scale.set( 0.5 * this.size, 0.5 * this.size, scale );\n\n\tthis.lookAt( this.plane.normal );\n\n\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n};\n\n/**\n * @author WestLangley / http://github.com/WestLangley\n * @author zz85 / http://github.com/zz85\n * @author bhouston / http://clara.io\n *\n * Creates an arrow for visualizing directions\n *\n * Parameters:\n * dir - Vector3\n * origin - Vector3\n * length - Number\n * color - color in hex value\n * headLength - Number\n * headWidth - Number\n */\n\nvar lineGeometry;\nvar coneGeometry;\n\nfunction ArrowHelper( dir, origin, length, color, headLength, headWidth ) {\n\n\t// dir is assumed to be normalized\n\n\tObject3D.call( this );\n\n\tif ( color === undefined ) color = 0xffff00;\n\tif ( length === undefined ) length = 1;\n\tif ( headLength === undefined ) headLength = 0.2 * length;\n\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\tif ( lineGeometry === undefined ) {\n\n\t\tlineGeometry = new BufferGeometry();\n\t\tlineGeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\t\tconeGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 );\n\t\tconeGeometry.translate( 0, - 0.5, 0 );\n\n\t}\n\n\tthis.position.copy( origin );\n\n\tthis.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) );\n\tthis.line.matrixAutoUpdate = false;\n\tthis.add( this.line );\n\n\tthis.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) );\n\tthis.cone.matrixAutoUpdate = false;\n\tthis.add( this.cone );\n\n\tthis.setDirection( dir );\n\tthis.setLength( length, headLength, headWidth );\n\n}\n\nArrowHelper.prototype = Object.create( Object3D.prototype );\nArrowHelper.prototype.constructor = ArrowHelper;\n\nArrowHelper.prototype.setDirection = ( function () {\n\n\tvar axis = new Vector3();\n\tvar radians;\n\n\treturn function setDirection( dir ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t} else if ( dir.y < - 0.99999 ) {\n\n\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t} else {\n\n\t\t\taxis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\tradians = Math.acos( dir.y );\n\n\t\t\tthis.quaternion.setFromAxisAngle( axis, radians );\n\n\t\t}\n\n\t};\n\n}() );\n\nArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) {\n\n\tif ( headLength === undefined ) headLength = 0.2 * length;\n\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\tthis.line.scale.set( 1, Math.max( 0, length - headLength ), 1 );\n\tthis.line.updateMatrix();\n\n\tthis.cone.scale.set( headWidth, headLength, headWidth );\n\tthis.cone.position.y = length;\n\tthis.cone.updateMatrix();\n\n};\n\nArrowHelper.prototype.setColor = function ( color ) {\n\n\tthis.line.material.color.copy( color );\n\tthis.cone.material.color.copy( color );\n\n};\n\n/**\n * @author sroucheray / http://sroucheray.org/\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction AxesHelper( size ) {\n\n\tsize = size || 1;\n\n\tvar vertices = [\n\t\t0, 0, 0,\tsize, 0, 0,\n\t\t0, 0, 0,\t0, size, 0,\n\t\t0, 0, 0,\t0, 0, size\n\t];\n\n\tvar colors = [\n\t\t1, 0, 0,\t1, 0.6, 0,\n\t\t0, 1, 0,\t0.6, 1, 0,\n\t\t0, 0, 1,\t0, 0.6, 1\n\t];\n\n\tvar geometry = new BufferGeometry();\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\tLineSegments.call( this, geometry, material );\n\n}\n\nAxesHelper.prototype = Object.create( LineSegments.prototype );\nAxesHelper.prototype.constructor = AxesHelper;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction Face4( a, b, c, d, normal, color, materialIndex ) {\n\n\tconsole.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' );\n\treturn new Face3( a, b, c, normal, color, materialIndex );\n\n}\n\nvar LineStrip = 0;\n\nvar LinePieces = 1;\n\nfunction MeshFaceMaterial( materials ) {\n\n\tconsole.warn( 'THREE.MeshFaceMaterial has been removed. Use an Array instead.' );\n\treturn materials;\n\n}\n\nfunction MultiMaterial( materials ) {\n\n\tif ( materials === undefined ) materials = [];\n\n\tconsole.warn( 'THREE.MultiMaterial has been removed. Use an Array instead.' );\n\tmaterials.isMultiMaterial = true;\n\tmaterials.materials = materials;\n\tmaterials.clone = function () {\n\n\t\treturn materials.slice();\n\n\t};\n\treturn materials;\n\n}\n\nfunction PointCloud( geometry, material ) {\n\n\tconsole.warn( 'THREE.PointCloud has been renamed to THREE.Points.' );\n\treturn new Points( geometry, material );\n\n}\n\nfunction Particle( material ) {\n\n\tconsole.warn( 'THREE.Particle has been renamed to THREE.Sprite.' );\n\treturn new Sprite( material );\n\n}\n\nfunction ParticleSystem( geometry, material ) {\n\n\tconsole.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' );\n\treturn new Points( geometry, material );\n\n}\n\nfunction PointCloudMaterial( parameters ) {\n\n\tconsole.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' );\n\treturn new PointsMaterial( parameters );\n\n}\n\nfunction ParticleBasicMaterial( parameters ) {\n\n\tconsole.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' );\n\treturn new PointsMaterial( parameters );\n\n}\n\nfunction ParticleSystemMaterial( parameters ) {\n\n\tconsole.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' );\n\treturn new PointsMaterial( parameters );\n\n}\n\nfunction Vertex( x, y, z ) {\n\n\tconsole.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' );\n\treturn new Vector3( x, y, z );\n\n}\n\n//\n\nfunction DynamicBufferAttribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' );\n\treturn new BufferAttribute( array, itemSize ).setDynamic( true );\n\n}\n\nfunction Int8Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' );\n\treturn new Int8BufferAttribute( array, itemSize );\n\n}\n\nfunction Uint8Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' );\n\treturn new Uint8BufferAttribute( array, itemSize );\n\n}\n\nfunction Uint8ClampedAttribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' );\n\treturn new Uint8ClampedBufferAttribute( array, itemSize );\n\n}\n\nfunction Int16Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' );\n\treturn new Int16BufferAttribute( array, itemSize );\n\n}\n\nfunction Uint16Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' );\n\treturn new Uint16BufferAttribute( array, itemSize );\n\n}\n\nfunction Int32Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' );\n\treturn new Int32BufferAttribute( array, itemSize );\n\n}\n\nfunction Uint32Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' );\n\treturn new Uint32BufferAttribute( array, itemSize );\n\n}\n\nfunction Float32Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' );\n\treturn new Float32BufferAttribute( array, itemSize );\n\n}\n\nfunction Float64Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' );\n\treturn new Float64BufferAttribute( array, itemSize );\n\n}\n\n//\n\nCurve.create = function ( construct, getPoint ) {\n\n\tconsole.log( 'THREE.Curve.create() has been deprecated' );\n\n\tconstruct.prototype = Object.create( Curve.prototype );\n\tconstruct.prototype.constructor = construct;\n\tconstruct.prototype.getPoint = getPoint;\n\n\treturn construct;\n\n};\n\n//\n\nObject.assign( CurvePath.prototype, {\n\n\tcreatePointsGeometry: function ( divisions ) {\n\n\t\tconsole.warn( 'THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' );\n\n\t\t// generate geometry from path points (for Line or Points objects)\n\n\t\tvar pts = this.getPoints( divisions );\n\t\treturn this.createGeometry( pts );\n\n\t},\n\n\tcreateSpacedPointsGeometry: function ( divisions ) {\n\n\t\tconsole.warn( 'THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' );\n\n\t\t// generate geometry from equidistant sampling along the path\n\n\t\tvar pts = this.getSpacedPoints( divisions );\n\t\treturn this.createGeometry( pts );\n\n\t},\n\n\tcreateGeometry: function ( points ) {\n\n\t\tconsole.warn( 'THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' );\n\n\t\tvar geometry = new Geometry();\n\n\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tvar point = points[ i ];\n\t\t\tgeometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );\n\n\t\t}\n\n\t\treturn geometry;\n\n\t}\n\n} );\n\n//\n\nObject.assign( Path.prototype, {\n\n\tfromPoints: function ( points ) {\n\n\t\tconsole.warn( 'THREE.Path: .fromPoints() has been renamed to .setFromPoints().' );\n\t\tthis.setFromPoints( points );\n\n\t}\n\n} );\n\n//\n\nfunction ClosedSplineCurve3( points ) {\n\n\tconsole.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' );\n\n\tCatmullRomCurve3.call( this, points );\n\tthis.type = 'catmullrom';\n\tthis.closed = true;\n\n}\n\nClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n//\n\nfunction SplineCurve3( points ) {\n\n\tconsole.warn( 'THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' );\n\n\tCatmullRomCurve3.call( this, points );\n\tthis.type = 'catmullrom';\n\n}\n\nSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n//\n\nfunction Spline( points ) {\n\n\tconsole.warn( 'THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.' );\n\n\tCatmullRomCurve3.call( this, points );\n\tthis.type = 'catmullrom';\n\n}\n\nSpline.prototype = Object.create( CatmullRomCurve3.prototype );\n\nObject.assign( Spline.prototype, {\n\n\tinitFromArray: function ( /* a */ ) {\n\n\t\tconsole.error( 'THREE.Spline: .initFromArray() has been removed.' );\n\n\t},\n\tgetControlPointsArray: function ( /* optionalTarget */ ) {\n\n\t\tconsole.error( 'THREE.Spline: .getControlPointsArray() has been removed.' );\n\n\t},\n\treparametrizeByArcLength: function ( /* samplingCoef */ ) {\n\n\t\tconsole.error( 'THREE.Spline: .reparametrizeByArcLength() has been removed.' );\n\n\t}\n\n} );\n\n//\n\nfunction AxisHelper( size ) {\n\n\tconsole.warn( 'THREE.AxisHelper has been renamed to THREE.AxesHelper.' );\n\treturn new AxesHelper( size );\n\n}\n\nfunction BoundingBoxHelper( object, color ) {\n\n\tconsole.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' );\n\treturn new BoxHelper( object, color );\n\n}\n\nfunction EdgesHelper( object, hex ) {\n\n\tconsole.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' );\n\treturn new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n}\n\nGridHelper.prototype.setColors = function () {\n\n\tconsole.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' );\n\n};\n\nSkeletonHelper.prototype.update = function () {\n\n\tconsole.error( 'THREE.SkeletonHelper: update() no longer needs to be called.' );\n\n};\n\nfunction WireframeHelper( object, hex ) {\n\n\tconsole.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' );\n\treturn new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n}\n\n//\n\nObject.assign( Loader.prototype, {\n\n\textractUrlBase: function ( url ) {\n\n\t\tconsole.warn( 'THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.' );\n\t\treturn LoaderUtils.extractUrlBase( url );\n\n\t}\n\n} );\n\nfunction XHRLoader( manager ) {\n\n\tconsole.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' );\n\treturn new FileLoader( manager );\n\n}\n\nfunction BinaryTextureLoader( manager ) {\n\n\tconsole.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' );\n\treturn new DataTextureLoader( manager );\n\n}\n\n//\n\nObject.assign( Box2.prototype, {\n\n\tcenter: function ( optionalTarget ) {\n\n\t\tconsole.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' );\n\t\treturn this.getCenter( optionalTarget );\n\n\t},\n\tempty: function () {\n\n\t\tconsole.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' );\n\t\treturn this.isEmpty();\n\n\t},\n\tisIntersectionBox: function ( box ) {\n\n\t\tconsole.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\treturn this.intersectsBox( box );\n\n\t},\n\tsize: function ( optionalTarget ) {\n\n\t\tconsole.warn( 'THREE.Box2: .size() has been renamed to .getSize().' );\n\t\treturn this.getSize( optionalTarget );\n\n\t}\n} );\n\nObject.assign( Box3.prototype, {\n\n\tcenter: function ( optionalTarget ) {\n\n\t\tconsole.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' );\n\t\treturn this.getCenter( optionalTarget );\n\n\t},\n\tempty: function () {\n\n\t\tconsole.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' );\n\t\treturn this.isEmpty();\n\n\t},\n\tisIntersectionBox: function ( box ) {\n\n\t\tconsole.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\treturn this.intersectsBox( box );\n\n\t},\n\tisIntersectionSphere: function ( sphere ) {\n\n\t\tconsole.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\treturn this.intersectsSphere( sphere );\n\n\t},\n\tsize: function ( optionalTarget ) {\n\n\t\tconsole.warn( 'THREE.Box3: .size() has been renamed to .getSize().' );\n\t\treturn this.getSize( optionalTarget );\n\n\t}\n} );\n\nLine3.prototype.center = function ( optionalTarget ) {\n\n\tconsole.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' );\n\treturn this.getCenter( optionalTarget );\n\n};\n\nObject.assign( _Math, {\n\n\trandom16: function () {\n\n\t\tconsole.warn( 'THREE.Math: .random16() has been deprecated. Use Math.random() instead.' );\n\t\treturn Math.random();\n\n\t},\n\n\tnearestPowerOfTwo: function ( value ) {\n\n\t\tconsole.warn( 'THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo().' );\n\t\treturn _Math.floorPowerOfTwo( value );\n\n\t},\n\n\tnextPowerOfTwo: function ( value ) {\n\n\t\tconsole.warn( 'THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo().' );\n\t\treturn _Math.ceilPowerOfTwo( value );\n\n\t}\n\n} );\n\nObject.assign( Matrix3.prototype, {\n\n\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\tconsole.warn( \"THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.\" );\n\t\treturn this.toArray( array, offset );\n\n\t},\n\tmultiplyVector3: function ( vector ) {\n\n\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );\n\t\treturn vector.applyMatrix3( this );\n\n\t},\n\tmultiplyVector3Array: function ( /* a */ ) {\n\n\t\tconsole.error( 'THREE.Matrix3: .multiplyVector3Array() has been removed.' );\n\n\t},\n\tapplyToBuffer: function ( buffer /*, offset, length */ ) {\n\n\t\tconsole.warn( 'THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' );\n\t\treturn this.applyToBufferAttribute( buffer );\n\n\t},\n\tapplyToVector3Array: function ( /* array, offset, length */ ) {\n\n\t\tconsole.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' );\n\n\t}\n\n} );\n\nObject.assign( Matrix4.prototype, {\n\n\textractPosition: function ( m ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' );\n\t\treturn this.copyPosition( m );\n\n\t},\n\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\tconsole.warn( \"THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.\" );\n\t\treturn this.toArray( array, offset );\n\n\t},\n\tgetPosition: function () {\n\n\t\tvar v1;\n\n\t\treturn function getPosition() {\n\n\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\tconsole.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' );\n\t\t\treturn v1.setFromMatrixColumn( this, 3 );\n\n\t\t};\n\n\t}(),\n\tsetRotationFromQuaternion: function ( q ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' );\n\t\treturn this.makeRotationFromQuaternion( q );\n\n\t},\n\tmultiplyToArray: function () {\n\n\t\tconsole.warn( 'THREE.Matrix4: .multiplyToArray() has been removed.' );\n\n\t},\n\tmultiplyVector3: function ( vector ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\treturn vector.applyMatrix4( this );\n\n\t},\n\tmultiplyVector4: function ( vector ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\treturn vector.applyMatrix4( this );\n\n\t},\n\tmultiplyVector3Array: function ( /* a */ ) {\n\n\t\tconsole.error( 'THREE.Matrix4: .multiplyVector3Array() has been removed.' );\n\n\t},\n\trotateAxis: function ( v ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' );\n\t\tv.transformDirection( this );\n\n\t},\n\tcrossVector: function ( vector ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\treturn vector.applyMatrix4( this );\n\n\t},\n\ttranslate: function () {\n\n\t\tconsole.error( 'THREE.Matrix4: .translate() has been removed.' );\n\n\t},\n\trotateX: function () {\n\n\t\tconsole.error( 'THREE.Matrix4: .rotateX() has been removed.' );\n\n\t},\n\trotateY: function () {\n\n\t\tconsole.error( 'THREE.Matrix4: .rotateY() has been removed.' );\n\n\t},\n\trotateZ: function () {\n\n\t\tconsole.error( 'THREE.Matrix4: .rotateZ() has been removed.' );\n\n\t},\n\trotateByAxis: function () {\n\n\t\tconsole.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' );\n\n\t},\n\tapplyToBuffer: function ( buffer /*, offset, length */ ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' );\n\t\treturn this.applyToBufferAttribute( buffer );\n\n\t},\n\tapplyToVector3Array: function ( /* array, offset, length */ ) {\n\n\t\tconsole.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' );\n\n\t},\n\tmakeFrustum: function ( left, right, bottom, top, near, far ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' );\n\t\treturn this.makePerspective( left, right, top, bottom, near, far );\n\n\t}\n\n} );\n\nPlane.prototype.isIntersectionLine = function ( line ) {\n\n\tconsole.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' );\n\treturn this.intersectsLine( line );\n\n};\n\nQuaternion.prototype.multiplyVector3 = function ( vector ) {\n\n\tconsole.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );\n\treturn vector.applyQuaternion( this );\n\n};\n\nObject.assign( Ray.prototype, {\n\n\tisIntersectionBox: function ( box ) {\n\n\t\tconsole.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\treturn this.intersectsBox( box );\n\n\t},\n\tisIntersectionPlane: function ( plane ) {\n\n\t\tconsole.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' );\n\t\treturn this.intersectsPlane( plane );\n\n\t},\n\tisIntersectionSphere: function ( sphere ) {\n\n\t\tconsole.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\treturn this.intersectsSphere( sphere );\n\n\t}\n\n} );\n\nObject.assign( Triangle.prototype, {\n\n\tarea: function () {\n\n\t\tconsole.warn( 'THREE.Triangle: .area() has been renamed to .getArea().' );\n\t\treturn this.getArea();\n\n\t},\n\tbarycoordFromPoint: function ( point, target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' );\n\t\treturn this.getBarycoord( point, target );\n\n\t},\n\tmidpoint: function ( target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .midpoint() has been renamed to .getMidpoint().' );\n\t\treturn this.getMidpoint( target );\n\n\t},\n\tnormal: function ( target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' );\n\t\treturn this.getNormal( target );\n\n\t},\n\tplane: function ( target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .plane() has been renamed to .getPlane().' );\n\t\treturn this.getPlane( target );\n\n\t}\n\n} );\n\nObject.assign( Triangle, {\n\n\tbarycoordFromPoint: function ( point, a, b, c, target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' );\n\t\treturn Triangle.getBarycoord( point, a, b, c, target );\n\n\t},\n\tnormal: function ( a, b, c, target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' );\n\t\treturn Triangle.getNormal( a, b, c, target );\n\n\t}\n\n} );\n\nObject.assign( Shape.prototype, {\n\n\textractAllPoints: function ( divisions ) {\n\n\t\tconsole.warn( 'THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.' );\n\t\treturn this.extractPoints( divisions );\n\n\t},\n\textrude: function ( options ) {\n\n\t\tconsole.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' );\n\t\treturn new ExtrudeGeometry( this, options );\n\n\t},\n\tmakeGeometry: function ( options ) {\n\n\t\tconsole.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' );\n\t\treturn new ShapeGeometry( this, options );\n\n\t}\n\n} );\n\nObject.assign( Vector2.prototype, {\n\n\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\tconsole.warn( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t},\n\tdistanceToManhattan: function ( v ) {\n\n\t\tconsole.warn( 'THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' );\n\t\treturn this.manhattanDistanceTo( v );\n\n\t},\n\tlengthManhattan: function () {\n\n\t\tconsole.warn( 'THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().' );\n\t\treturn this.manhattanLength();\n\n\t}\n\n} );\n\nObject.assign( Vector3.prototype, {\n\n\tsetEulerFromRotationMatrix: function () {\n\n\t\tconsole.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );\n\n\t},\n\tsetEulerFromQuaternion: function () {\n\n\t\tconsole.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );\n\n\t},\n\tgetPositionFromMatrix: function ( m ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );\n\t\treturn this.setFromMatrixPosition( m );\n\n\t},\n\tgetScaleFromMatrix: function ( m ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );\n\t\treturn this.setFromMatrixScale( m );\n\n\t},\n\tgetColumnFromMatrix: function ( index, matrix ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );\n\t\treturn this.setFromMatrixColumn( matrix, index );\n\n\t},\n\tapplyProjection: function ( m ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' );\n\t\treturn this.applyMatrix4( m );\n\n\t},\n\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t},\n\tdistanceToManhattan: function ( v ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' );\n\t\treturn this.manhattanDistanceTo( v );\n\n\t},\n\tlengthManhattan: function () {\n\n\t\tconsole.warn( 'THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().' );\n\t\treturn this.manhattanLength();\n\n\t}\n\n} );\n\nObject.assign( Vector4.prototype, {\n\n\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\tconsole.warn( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t},\n\tlengthManhattan: function () {\n\n\t\tconsole.warn( 'THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().' );\n\t\treturn this.manhattanLength();\n\n\t}\n\n} );\n\n//\n\nObject.assign( Geometry.prototype, {\n\n\tcomputeTangents: function () {\n\n\t\tconsole.error( 'THREE.Geometry: .computeTangents() has been removed.' );\n\n\t},\n\tcomputeLineDistances: function () {\n\n\t\tconsole.error( 'THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.' );\n\n\t}\n\n} );\n\nObject.assign( Object3D.prototype, {\n\n\tgetChildByName: function ( name ) {\n\n\t\tconsole.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' );\n\t\treturn this.getObjectByName( name );\n\n\t},\n\trenderDepth: function () {\n\n\t\tconsole.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' );\n\n\t},\n\ttranslate: function ( distance, axis ) {\n\n\t\tconsole.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' );\n\t\treturn this.translateOnAxis( axis, distance );\n\n\t},\n\tgetWorldRotation: function () {\n\n\t\tconsole.error( 'THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.' );\n\n\t}\n\n} );\n\nObject.defineProperties( Object3D.prototype, {\n\n\teulerOrder: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\treturn this.rotation.order;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\tthis.rotation.order = value;\n\n\t\t}\n\t},\n\tuseQuaternion: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t}\n\t}\n\n} );\n\nObject.defineProperties( LOD.prototype, {\n\n\tobjects: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.LOD: .objects has been renamed to .levels.' );\n\t\t\treturn this.levels;\n\n\t\t}\n\t}\n\n} );\n\nObject.defineProperty( Skeleton.prototype, 'useVertexTexture', {\n\n\tget: function () {\n\n\t\tconsole.warn( 'THREE.Skeleton: useVertexTexture has been removed.' );\n\n\t},\n\tset: function () {\n\n\t\tconsole.warn( 'THREE.Skeleton: useVertexTexture has been removed.' );\n\n\t}\n\n} );\n\nObject.defineProperty( Curve.prototype, '__arcLengthDivisions', {\n\n\tget: function () {\n\n\t\tconsole.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' );\n\t\treturn this.arcLengthDivisions;\n\n\t},\n\tset: function ( value ) {\n\n\t\tconsole.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' );\n\t\tthis.arcLengthDivisions = value;\n\n\t}\n\n} );\n\n//\n\nPerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) {\n\n\tconsole.warn( \"THREE.PerspectiveCamera.setLens is deprecated. \" +\n\t\t\t\"Use .setFocalLength and .filmGauge for a photographic setup.\" );\n\n\tif ( filmGauge !== undefined ) this.filmGauge = filmGauge;\n\tthis.setFocalLength( focalLength );\n\n};\n\n//\n\nObject.defineProperties( Light.prototype, {\n\tonlyShadow: {\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Light: .onlyShadow has been removed.' );\n\n\t\t}\n\t},\n\tshadowCameraFov: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' );\n\t\t\tthis.shadow.camera.fov = value;\n\n\t\t}\n\t},\n\tshadowCameraLeft: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' );\n\t\t\tthis.shadow.camera.left = value;\n\n\t\t}\n\t},\n\tshadowCameraRight: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' );\n\t\t\tthis.shadow.camera.right = value;\n\n\t\t}\n\t},\n\tshadowCameraTop: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' );\n\t\t\tthis.shadow.camera.top = value;\n\n\t\t}\n\t},\n\tshadowCameraBottom: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' );\n\t\t\tthis.shadow.camera.bottom = value;\n\n\t\t}\n\t},\n\tshadowCameraNear: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' );\n\t\t\tthis.shadow.camera.near = value;\n\n\t\t}\n\t},\n\tshadowCameraFar: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' );\n\t\t\tthis.shadow.camera.far = value;\n\n\t\t}\n\t},\n\tshadowCameraVisible: {\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' );\n\n\t\t}\n\t},\n\tshadowBias: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' );\n\t\t\tthis.shadow.bias = value;\n\n\t\t}\n\t},\n\tshadowDarkness: {\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowDarkness has been removed.' );\n\n\t\t}\n\t},\n\tshadowMapWidth: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' );\n\t\t\tthis.shadow.mapSize.width = value;\n\n\t\t}\n\t},\n\tshadowMapHeight: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' );\n\t\t\tthis.shadow.mapSize.height = value;\n\n\t\t}\n\t}\n} );\n\n//\n\nObject.defineProperties( BufferAttribute.prototype, {\n\n\tlength: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' );\n\t\t\treturn this.array.length;\n\n\t\t}\n\t},\n\tcopyIndicesArray: function ( /* indices */ ) {\n\n\t\tconsole.error( 'THREE.BufferAttribute: .copyIndicesArray() has been removed.' );\n\n\t}\n\n} );\n\nObject.assign( BufferGeometry.prototype, {\n\n\taddIndex: function ( index ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' );\n\t\tthis.setIndex( index );\n\n\t},\n\taddDrawCall: function ( start, count, indexOffset ) {\n\n\t\tif ( indexOffset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' );\n\n\t\t}\n\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' );\n\t\tthis.addGroup( start, count );\n\n\t},\n\tclearDrawCalls: function () {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' );\n\t\tthis.clearGroups();\n\n\t},\n\tcomputeTangents: function () {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' );\n\n\t},\n\tcomputeOffsets: function () {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' );\n\n\t}\n\n} );\n\nObject.defineProperties( BufferGeometry.prototype, {\n\n\tdrawcalls: {\n\t\tget: function () {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' );\n\t\t\treturn this.groups;\n\n\t\t}\n\t},\n\toffsets: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' );\n\t\t\treturn this.groups;\n\n\t\t}\n\t}\n\n} );\n\n//\n\nObject.assign( ExtrudeBufferGeometry.prototype, {\n\n\tgetArrays: function () {\n\n\t\tconsole.error( 'THREE.ExtrudeBufferGeometry: .getArrays() has been removed.' );\n\n\t},\n\n\taddShapeList: function () {\n\n\t\tconsole.error( 'THREE.ExtrudeBufferGeometry: .addShapeList() has been removed.' );\n\n\t},\n\n\taddShape: function () {\n\n\t\tconsole.error( 'THREE.ExtrudeBufferGeometry: .addShape() has been removed.' );\n\n\t}\n\n} );\n\n//\n\nObject.defineProperties( Uniform.prototype, {\n\n\tdynamic: {\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' );\n\n\t\t}\n\t},\n\tonUpdate: {\n\t\tvalue: function () {\n\n\t\t\tconsole.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' );\n\t\t\treturn this;\n\n\t\t}\n\t}\n\n} );\n\n//\n\nObject.defineProperties( Material.prototype, {\n\n\twrapAround: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .wrapAround has been removed.' );\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .wrapAround has been removed.' );\n\n\t\t}\n\t},\n\twrapRGB: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .wrapRGB has been removed.' );\n\t\t\treturn new Color();\n\n\t\t}\n\t},\n\n\tshading: {\n\t\tget: function () {\n\n\t\t\tconsole.error( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );\n\t\t\tthis.flatShading = ( value === FlatShading );\n\n\t\t}\n\t}\n\n} );\n\nObject.defineProperties( MeshPhongMaterial.prototype, {\n\n\tmetal: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' );\n\t\t\treturn false;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' );\n\n\t\t}\n\t}\n\n} );\n\nObject.defineProperties( ShaderMaterial.prototype, {\n\n\tderivatives: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\treturn this.extensions.derivatives;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\tthis.extensions.derivatives = value;\n\n\t\t}\n\t}\n\n} );\n\n//\n\nObject.assign( WebGLRenderer.prototype, {\n\n\tgetCurrentRenderTarget: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().' );\n\t\treturn this.getRenderTarget();\n\n\t},\n\n\tgetMaxAnisotropy: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().' );\n\t\treturn this.capabilities.getMaxAnisotropy();\n\n\t},\n\n\tgetPrecision: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.' );\n\t\treturn this.capabilities.precision;\n\n\t},\n\n\tresetGLState: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .resetGLState() is now .state.reset().' );\n\t\treturn this.state.reset();\n\n\t},\n\n\tsupportsFloatTextures: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \\'OES_texture_float\\' ).' );\n\t\treturn this.extensions.get( 'OES_texture_float' );\n\n\t},\n\tsupportsHalfFloatTextures: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \\'OES_texture_half_float\\' ).' );\n\t\treturn this.extensions.get( 'OES_texture_half_float' );\n\n\t},\n\tsupportsStandardDerivatives: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \\'OES_standard_derivatives\\' ).' );\n\t\treturn this.extensions.get( 'OES_standard_derivatives' );\n\n\t},\n\tsupportsCompressedTextureS3TC: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \\'WEBGL_compressed_texture_s3tc\\' ).' );\n\t\treturn this.extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t},\n\tsupportsCompressedTexturePVRTC: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \\'WEBGL_compressed_texture_pvrtc\\' ).' );\n\t\treturn this.extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t},\n\tsupportsBlendMinMax: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \\'EXT_blend_minmax\\' ).' );\n\t\treturn this.extensions.get( 'EXT_blend_minmax' );\n\n\t},\n\tsupportsVertexTextures: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' );\n\t\treturn this.capabilities.vertexTextures;\n\n\t},\n\tsupportsInstancedArrays: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \\'ANGLE_instanced_arrays\\' ).' );\n\t\treturn this.extensions.get( 'ANGLE_instanced_arrays' );\n\n\t},\n\tenableScissorTest: function ( boolean ) {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' );\n\t\tthis.setScissorTest( boolean );\n\n\t},\n\tinitMaterial: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' );\n\n\t},\n\taddPrePlugin: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' );\n\n\t},\n\taddPostPlugin: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' );\n\n\t},\n\tupdateShadowMap: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' );\n\n\t},\n\tsetFaceCulling: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .setFaceCulling() has been removed.' );\n\n\t}\n\n} );\n\nObject.defineProperties( WebGLRenderer.prototype, {\n\n\tshadowMapEnabled: {\n\t\tget: function () {\n\n\t\t\treturn this.shadowMap.enabled;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' );\n\t\t\tthis.shadowMap.enabled = value;\n\n\t\t}\n\t},\n\tshadowMapType: {\n\t\tget: function () {\n\n\t\t\treturn this.shadowMap.type;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' );\n\t\t\tthis.shadowMap.type = value;\n\n\t\t}\n\t},\n\tshadowMapCullFace: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' );\n\t\t\treturn undefined;\n\n\t\t},\n\t\tset: function ( /* value */ ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' );\n\n\t\t}\n\t}\n} );\n\nObject.defineProperties( WebGLShadowMap.prototype, {\n\n\tcullFace: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' );\n\t\t\treturn undefined;\n\n\t\t},\n\t\tset: function ( /* cullFace */ ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' );\n\n\t\t}\n\t},\n\trenderReverseSided: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' );\n\t\t\treturn undefined;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' );\n\n\t\t}\n\t},\n\trenderSingleSided: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' );\n\t\t\treturn undefined;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' );\n\n\t\t}\n\t}\n\n} );\n\n//\n\nObject.defineProperties( WebGLRenderTarget.prototype, {\n\n\twrapS: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\treturn this.texture.wrapS;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\tthis.texture.wrapS = value;\n\n\t\t}\n\t},\n\twrapT: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\treturn this.texture.wrapT;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\tthis.texture.wrapT = value;\n\n\t\t}\n\t},\n\tmagFilter: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\treturn this.texture.magFilter;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\tthis.texture.magFilter = value;\n\n\t\t}\n\t},\n\tminFilter: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\treturn this.texture.minFilter;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\tthis.texture.minFilter = value;\n\n\t\t}\n\t},\n\tanisotropy: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\treturn this.texture.anisotropy;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\tthis.texture.anisotropy = value;\n\n\t\t}\n\t},\n\toffset: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\treturn this.texture.offset;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\tthis.texture.offset = value;\n\n\t\t}\n\t},\n\trepeat: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\treturn this.texture.repeat;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\tthis.texture.repeat = value;\n\n\t\t}\n\t},\n\tformat: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\treturn this.texture.format;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\tthis.texture.format = value;\n\n\t\t}\n\t},\n\ttype: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\treturn this.texture.type;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\tthis.texture.type = value;\n\n\t\t}\n\t},\n\tgenerateMipmaps: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\treturn this.texture.generateMipmaps;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\tthis.texture.generateMipmaps = value;\n\n\t\t}\n\t}\n\n} );\n\n//\n\nObject.defineProperties( WebVRManager.prototype, {\n\n\tstanding: {\n\t\tset: function ( /* value */ ) {\n\n\t\t\tconsole.warn( 'THREE.WebVRManager: .standing has been removed.' );\n\n\t\t}\n\t}\n\n} );\n\n//\n\nAudio.prototype.load = function ( file ) {\n\n\tconsole.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' );\n\tvar scope = this;\n\tvar audioLoader = new AudioLoader();\n\taudioLoader.load( file, function ( buffer ) {\n\n\t\tscope.setBuffer( buffer );\n\n\t} );\n\treturn this;\n\n};\n\nAudioAnalyser.prototype.getData = function () {\n\n\tconsole.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' );\n\treturn this.getFrequencyData();\n\n};\n\n//\n\nCubeCamera.prototype.updateCubeMap = function ( renderer, scene ) {\n\n\tconsole.warn( 'THREE.CubeCamera: .updateCubeMap() is now .update().' );\n\treturn this.update( renderer, scene );\n\n};\n\n//\n\nvar GeometryUtils = {\n\n\tmerge: function ( geometry1, geometry2, materialIndexOffset ) {\n\n\t\tconsole.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' );\n\t\tvar matrix;\n\n\t\tif ( geometry2.isMesh ) {\n\n\t\t\tgeometry2.matrixAutoUpdate && geometry2.updateMatrix();\n\n\t\t\tmatrix = geometry2.matrix;\n\t\t\tgeometry2 = geometry2.geometry;\n\n\t\t}\n\n\t\tgeometry1.merge( geometry2, matrix, materialIndexOffset );\n\n\t},\n\n\tcenter: function ( geometry ) {\n\n\t\tconsole.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' );\n\t\treturn geometry.center();\n\n\t}\n\n};\n\nvar ImageUtils = {\n\n\tcrossOrigin: undefined,\n\n\tloadTexture: function ( url, mapping, onLoad, onError ) {\n\n\t\tconsole.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' );\n\n\t\tvar loader = new TextureLoader();\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\tvar texture = loader.load( url, onLoad, undefined, onError );\n\n\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\treturn texture;\n\n\t},\n\n\tloadTextureCube: function ( urls, mapping, onLoad, onError ) {\n\n\t\tconsole.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' );\n\n\t\tvar loader = new CubeTextureLoader();\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\tvar texture = loader.load( urls, onLoad, undefined, onError );\n\n\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\treturn texture;\n\n\t},\n\n\tloadCompressedTexture: function () {\n\n\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' );\n\n\t},\n\n\tloadCompressedTextureCube: function () {\n\n\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' );\n\n\t}\n\n};\n\n//\n\nfunction Projector() {\n\n\tconsole.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' );\n\n\tthis.projectVector = function ( vector, camera ) {\n\n\t\tconsole.warn( 'THREE.Projector: .projectVector() is now vector.project().' );\n\t\tvector.project( camera );\n\n\t};\n\n\tthis.unprojectVector = function ( vector, camera ) {\n\n\t\tconsole.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' );\n\t\tvector.unproject( camera );\n\n\t};\n\n\tthis.pickingRay = function () {\n\n\t\tconsole.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' );\n\n\t};\n\n}\n\n//\n\nfunction CanvasRenderer() {\n\n\tconsole.error( 'THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js' );\n\n\tthis.domElement = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\tthis.clear = function () {};\n\tthis.render = function () {};\n\tthis.setClearColor = function () {};\n\tthis.setSize = function () {};\n\n}\n\n//\n\nvar SceneUtils = {\n\n\tcreateMultiMaterialObject: function ( /* geometry, materials */ ) {\n\n\t\tconsole.error( 'THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js' );\n\n\t},\n\n\tdetach: function ( /* child, parent, scene */ ) {\n\n\t\tconsole.error( 'THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js' );\n\n\t},\n\n\tattach: function ( /* child, scene, parent */ ) {\n\n\t\tconsole.error( 'THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js' );\n\n\t}\n\n};\n\n//\n\nfunction LensFlare() {\n\n\tconsole.error( 'THREE.LensFlare has been moved to /examples/js/objects/Lensflare.js' );\n\n}\n\nexport { WebGLRenderTargetCube, WebGLRenderTarget, WebGLRenderer, ShaderLib, UniformsLib, UniformsUtils, ShaderChunk, FogExp2, Fog, Scene, Sprite, LOD, SkinnedMesh, Skeleton, Bone, Mesh, LineSegments, LineLoop, Line, Points, Group, VideoTexture, DataTexture, CompressedTexture, CubeTexture, CanvasTexture, DepthTexture, Texture, CompressedTextureLoader, DataTextureLoader, CubeTextureLoader, TextureLoader, ObjectLoader, MaterialLoader, BufferGeometryLoader, DefaultLoadingManager, LoadingManager, JSONLoader, ImageLoader, ImageBitmapLoader, FontLoader, FileLoader, Loader, LoaderUtils, Cache, AudioLoader, SpotLightShadow, SpotLight, PointLight, RectAreaLight, HemisphereLight, DirectionalLightShadow, DirectionalLight, AmbientLight, LightShadow, Light, StereoCamera, PerspectiveCamera, OrthographicCamera, CubeCamera, ArrayCamera, Camera, AudioListener, PositionalAudio, AudioContext, AudioAnalyser, Audio, VectorKeyframeTrack, StringKeyframeTrack, QuaternionKeyframeTrack, NumberKeyframeTrack, ColorKeyframeTrack, BooleanKeyframeTrack, PropertyMixer, PropertyBinding, KeyframeTrack, AnimationUtils, AnimationObjectGroup, AnimationMixer, AnimationClip, Uniform, InstancedBufferGeometry, BufferGeometry, Geometry, InterleavedBufferAttribute, InstancedInterleavedBuffer, InterleavedBuffer, InstancedBufferAttribute, Face3, Object3D, Raycaster, Layers, EventDispatcher, Clock, QuaternionLinearInterpolant, LinearInterpolant, DiscreteInterpolant, CubicInterpolant, Interpolant, Triangle, _Math as Math, Spherical, Cylindrical, Plane, Frustum, Sphere, Ray, Matrix4, Matrix3, Box3, Box2, Line3, Euler, Vector4, Vector3, Vector2, Quaternion, Color, ImmediateRenderObject, VertexNormalsHelper, SpotLightHelper, SkeletonHelper, PointLightHelper, RectAreaLightHelper, HemisphereLightHelper, GridHelper, PolarGridHelper, FaceNormalsHelper, DirectionalLightHelper, CameraHelper, BoxHelper, Box3Helper, PlaneHelper, ArrowHelper, AxesHelper, Shape, Path, ShapePath, Font, CurvePath, Curve, ShapeUtils, WebGLUtils, WireframeGeometry, ParametricGeometry, ParametricBufferGeometry, TetrahedronGeometry, TetrahedronBufferGeometry, OctahedronGeometry, OctahedronBufferGeometry, IcosahedronGeometry, IcosahedronBufferGeometry, DodecahedronGeometry, DodecahedronBufferGeometry, PolyhedronGeometry, PolyhedronBufferGeometry, TubeGeometry, TubeBufferGeometry, TorusKnotGeometry, TorusKnotBufferGeometry, TorusGeometry, TorusBufferGeometry, TextGeometry, TextBufferGeometry, SphereGeometry, SphereBufferGeometry, RingGeometry, RingBufferGeometry, PlaneGeometry, PlaneBufferGeometry, LatheGeometry, LatheBufferGeometry, ShapeGeometry, ShapeBufferGeometry, ExtrudeGeometry, ExtrudeBufferGeometry, EdgesGeometry, ConeGeometry, ConeBufferGeometry, CylinderGeometry, CylinderBufferGeometry, CircleGeometry, CircleBufferGeometry, BoxGeometry, BoxBufferGeometry, ShadowMaterial, SpriteMaterial, RawShaderMaterial, ShaderMaterial, PointsMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshPhongMaterial, MeshToonMaterial, MeshNormalMaterial, MeshLambertMaterial, MeshDepthMaterial, MeshDistanceMaterial, MeshBasicMaterial, LineDashedMaterial, LineBasicMaterial, Material, Float64BufferAttribute, Float32BufferAttribute, Uint32BufferAttribute, Int32BufferAttribute, Uint16BufferAttribute, Int16BufferAttribute, Uint8ClampedBufferAttribute, Uint8BufferAttribute, Int8BufferAttribute, BufferAttribute, ArcCurve, CatmullRomCurve3, CubicBezierCurve, CubicBezierCurve3, EllipseCurve, LineCurve, LineCurve3, QuadraticBezierCurve, QuadraticBezierCurve3, SplineCurve, REVISION, MOUSE, CullFaceNone, CullFaceBack, CullFaceFront, CullFaceFrontBack, FrontFaceDirectionCW, FrontFaceDirectionCCW, BasicShadowMap, PCFShadowMap, PCFSoftShadowMap, FrontSide, BackSide, DoubleSide, FlatShading, SmoothShading, NoColors, FaceColors, VertexColors, NoBlending, NormalBlending, AdditiveBlending, SubtractiveBlending, MultiplyBlending, CustomBlending, AddEquation, SubtractEquation, ReverseSubtractEquation, MinEquation, MaxEquation, ZeroFactor, OneFactor, SrcColorFactor, OneMinusSrcColorFactor, SrcAlphaFactor, OneMinusSrcAlphaFactor, DstAlphaFactor, OneMinusDstAlphaFactor, DstColorFactor, OneMinusDstColorFactor, SrcAlphaSaturateFactor, NeverDepth, AlwaysDepth, LessDepth, LessEqualDepth, EqualDepth, GreaterEqualDepth, GreaterDepth, NotEqualDepth, MultiplyOperation, MixOperation, AddOperation, NoToneMapping, LinearToneMapping, ReinhardToneMapping, Uncharted2ToneMapping, CineonToneMapping, UVMapping, CubeReflectionMapping, CubeRefractionMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping, SphericalReflectionMapping, CubeUVReflectionMapping, CubeUVRefractionMapping, RepeatWrapping, ClampToEdgeWrapping, MirroredRepeatWrapping, NearestFilter, NearestMipMapNearestFilter, NearestMipMapLinearFilter, LinearFilter, LinearMipMapNearestFilter, LinearMipMapLinearFilter, UnsignedByteType, ByteType, ShortType, UnsignedShortType, IntType, UnsignedIntType, FloatType, HalfFloatType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShort565Type, UnsignedInt248Type, AlphaFormat, RGBFormat, RGBAFormat, LuminanceFormat, LuminanceAlphaFormat, RGBEFormat, DepthFormat, DepthStencilFormat, RGB_S3TC_DXT1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGB_PVRTC_4BPPV1_Format, RGB_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_PVRTC_2BPPV1_Format, RGB_ETC1_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, LoopOnce, LoopRepeat, LoopPingPong, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, ZeroCurvatureEnding, ZeroSlopeEnding, WrapAroundEnding, TrianglesDrawMode, TriangleStripDrawMode, TriangleFanDrawMode, LinearEncoding, sRGBEncoding, GammaEncoding, RGBEEncoding, LogLuvEncoding, RGBM7Encoding, RGBM16Encoding, RGBDEncoding, BasicDepthPacking, RGBADepthPacking, BoxGeometry as CubeGeometry, Face4, LineStrip, LinePieces, MeshFaceMaterial, MultiMaterial, PointCloud, Particle, ParticleSystem, PointCloudMaterial, ParticleBasicMaterial, ParticleSystemMaterial, Vertex, DynamicBufferAttribute, Int8Attribute, Uint8Attribute, Uint8ClampedAttribute, Int16Attribute, Uint16Attribute, Int32Attribute, Uint32Attribute, Float32Attribute, Float64Attribute, ClosedSplineCurve3, SplineCurve3, Spline, AxisHelper, BoundingBoxHelper, EdgesHelper, WireframeHelper, XHRLoader, BinaryTextureLoader, GeometryUtils, ImageUtils, Projector, CanvasRenderer, SceneUtils, LensFlare };\n","module.exports = function Events(target){\n var events = {}, empty = [];\n target = target || this\n /**\n * On: listen to events\n */\n target.on = function(type, func, ctx){\n (events[type] = events[type] || []).push([func, ctx])\n return target\n }\n /**\n * Off: stop listening to event / specific callback\n */\n target.off = function(type, func){\n type || (events = {})\n var list = events[type] || empty,\n i = list.length = func ? list.length : 0;\n while(i--) func == list[i][0] && list.splice(i,1)\n return target\n }\n /** \n * Emit: send event, callbacks will be triggered\n */\n target.emit = function(type){\n var e = events[type] || empty, list = e.length > 0 ? e.slice(0, e.length) : e, i=0, j;\n while(j=list[i++]) j[0].apply(j[1], empty.slice.call(arguments, 1))\n return target\n };\n};","var $export = require('./_export');\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\n$export($export.S, 'Object', { create: require('./_object-create') });\n","require('../../modules/es6.object.create');\nvar $Object = require('../../modules/_core').Object;\nmodule.exports = function create(P, D) {\n return $Object.create(P, D);\n};\n","module.exports = require(\"core-js/library/fn/object/create\");","var isObject = require('./_is-object');\nmodule.exports = function (it, TYPE) {\n if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n return it;\n};\n","'use strict';\nvar dP = require('./_object-dp').f;\nvar create = require('./_object-create');\nvar redefineAll = require('./_redefine-all');\nvar ctx = require('./_ctx');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar $iterDefine = require('./_iter-define');\nvar step = require('./_iter-step');\nvar setSpecies = require('./_set-species');\nvar DESCRIPTORS = require('./_descriptors');\nvar fastKey = require('./_meta').fastKey;\nvar validate = require('./_validate-collection');\nvar SIZE = DESCRIPTORS ? '_s' : 'size';\n\nvar getEntry = function (that, key) {\n // fast case\n var index = fastKey(key);\n var entry;\n if (index !== 'F') return that._i[index];\n // frozen object case\n for (entry = that._f; entry; entry = entry.n) {\n if (entry.k == key) return entry;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = create(null); // index\n that._f = undefined; // first entry\n that._l = undefined; // last entry\n that[SIZE] = 0; // size\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.1.3.1 Map.prototype.clear()\n // 23.2.3.2 Set.prototype.clear()\n clear: function clear() {\n for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {\n entry.r = true;\n if (entry.p) entry.p = entry.p.n = undefined;\n delete data[entry.i];\n }\n that._f = that._l = undefined;\n that[SIZE] = 0;\n },\n // 23.1.3.3 Map.prototype.delete(key)\n // 23.2.3.4 Set.prototype.delete(value)\n 'delete': function (key) {\n var that = validate(this, NAME);\n var entry = getEntry(that, key);\n if (entry) {\n var next = entry.n;\n var prev = entry.p;\n delete that._i[entry.i];\n entry.r = true;\n if (prev) prev.n = next;\n if (next) next.p = prev;\n if (that._f == entry) that._f = next;\n if (that._l == entry) that._l = prev;\n that[SIZE]--;\n } return !!entry;\n },\n // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n forEach: function forEach(callbackfn /* , that = undefined */) {\n validate(this, NAME);\n var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n var entry;\n while (entry = entry ? entry.n : this._f) {\n f(entry.v, entry.k, this);\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n }\n },\n // 23.1.3.7 Map.prototype.has(key)\n // 23.2.3.7 Set.prototype.has(value)\n has: function has(key) {\n return !!getEntry(validate(this, NAME), key);\n }\n });\n if (DESCRIPTORS) dP(C.prototype, 'size', {\n get: function () {\n return validate(this, NAME)[SIZE];\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var entry = getEntry(that, key);\n var prev, index;\n // change existing entry\n if (entry) {\n entry.v = value;\n // create new entry\n } else {\n that._l = entry = {\n i: index = fastKey(key, true), // <- index\n k: key, // <- key\n v: value, // <- value\n p: prev = that._l, // <- previous entry\n n: undefined, // <- next entry\n r: false // <- removed\n };\n if (!that._f) that._f = entry;\n if (prev) prev.n = entry;\n that[SIZE]++;\n // add to index\n if (index !== 'F') that._i[index] = entry;\n } return that;\n },\n getEntry: getEntry,\n setStrong: function (C, NAME, IS_MAP) {\n // add .keys, .values, .entries, [@@iterator]\n // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n $iterDefine(C, NAME, function (iterated, kind) {\n this._t = validate(iterated, NAME); // target\n this._k = kind; // kind\n this._l = undefined; // previous\n }, function () {\n var that = this;\n var kind = that._k;\n var entry = that._l;\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n // get next entry\n if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {\n // or finish the iteration\n that._t = undefined;\n return step(1);\n }\n // return step by kind\n if (kind == 'keys') return step(0, entry.k);\n if (kind == 'values') return step(0, entry.v);\n return step(0, [entry.k, entry.v]);\n }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n // add [@@species], 23.1.2.2, 23.2.2.2\n setSpecies(NAME);\n }\n};\n","var isObject = require('./_is-object');\nvar isArray = require('./_is-array');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (original) {\n var C;\n if (isArray(original)) {\n C = original.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n};\n","// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = require('./_array-species-constructor');\n\nmodule.exports = function (original, length) {\n return new (speciesConstructor(original))(length);\n};\n","// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = require('./_ctx');\nvar IObject = require('./_iobject');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar asc = require('./_array-species-create');\nmodule.exports = function (TYPE, $create) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = $create || asc;\n return function ($this, callbackfn, that) {\n var O = toObject($this);\n var self = IObject(O);\n var f = ctx(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var val, res;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n val = self[index];\n res = f(val, index, O);\n if (TYPE) {\n if (IS_MAP) result[index] = res; // map\n else if (res) switch (TYPE) {\n case 3: return true; // some\n case 5: return val; // find\n case 6: return index; // findIndex\n case 2: result.push(val); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n };\n};\n","'use strict';\nvar global = require('./_global');\nvar $export = require('./_export');\nvar meta = require('./_meta');\nvar fails = require('./_fails');\nvar hide = require('./_hide');\nvar redefineAll = require('./_redefine-all');\nvar forOf = require('./_for-of');\nvar anInstance = require('./_an-instance');\nvar isObject = require('./_is-object');\nvar setToStringTag = require('./_set-to-string-tag');\nvar dP = require('./_object-dp').f;\nvar each = require('./_array-methods')(0);\nvar DESCRIPTORS = require('./_descriptors');\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n var Base = global[NAME];\n var C = Base;\n var ADDER = IS_MAP ? 'set' : 'add';\n var proto = C && C.prototype;\n var O = {};\n if (!DESCRIPTORS || typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n new C().entries().next();\n }))) {\n // create collection constructor\n C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n redefineAll(C.prototype, methods);\n meta.NEED = true;\n } else {\n C = wrapper(function (target, iterable) {\n anInstance(target, C, NAME, '_c');\n target._c = new Base();\n if (iterable != undefined) forOf(iterable, IS_MAP, target[ADDER], target);\n });\n each('add,clear,delete,forEach,get,has,set,keys,values,entries,toJSON'.split(','), function (KEY) {\n var IS_ADDER = KEY == 'add' || KEY == 'set';\n if (KEY in proto && !(IS_WEAK && KEY == 'clear')) hide(C.prototype, KEY, function (a, b) {\n anInstance(this, C, KEY);\n if (!IS_ADDER && IS_WEAK && !isObject(a)) return KEY == 'get' ? undefined : false;\n var result = this._c[KEY](a === 0 ? 0 : a, b);\n return IS_ADDER ? this : result;\n });\n });\n IS_WEAK || dP(C.prototype, 'size', {\n get: function () {\n return this._c.size;\n }\n });\n }\n\n setToStringTag(C, NAME);\n\n O[NAME] = C;\n $export($export.G + $export.W + $export.F, O);\n\n if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n return C;\n};\n","'use strict';\nvar strong = require('./_collection-strong');\nvar validate = require('./_validate-collection');\nvar MAP = 'Map';\n\n// 23.1 Map Objects\nmodule.exports = require('./_collection')(MAP, function (get) {\n return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.1.3.6 Map.prototype.get(key)\n get: function get(key) {\n var entry = strong.getEntry(validate(this, MAP), key);\n return entry && entry.v;\n },\n // 23.1.3.9 Map.prototype.set(key, value)\n set: function set(key, value) {\n return strong.def(validate(this, MAP), key === 0 ? 0 : key, value);\n }\n}, strong, true);\n","var forOf = require('./_for-of');\n\nmodule.exports = function (iter, ITERATOR) {\n var result = [];\n forOf(iter, false, result.push, result, ITERATOR);\n return result;\n};\n","// https://github.com/DavidBruant/Map-Set.prototype.toJSON\nvar classof = require('./_classof');\nvar from = require('./_array-from-iterable');\nmodule.exports = function (NAME) {\n return function toJSON() {\n if (classof(this) != NAME) throw TypeError(NAME + \"#toJSON isn't generic\");\n return from(this);\n };\n};\n","// https://github.com/DavidBruant/Map-Set.prototype.toJSON\nvar $export = require('./_export');\n\n$export($export.P + $export.R, 'Map', { toJSON: require('./_collection-to-json')('Map') });\n","'use strict';\n// https://tc39.github.io/proposal-setmap-offrom/\nvar $export = require('./_export');\n\nmodule.exports = function (COLLECTION) {\n $export($export.S, COLLECTION, { of: function of() {\n var length = arguments.length;\n var A = new Array(length);\n while (length--) A[length] = arguments[length];\n return new this(A);\n } });\n};\n","// https://tc39.github.io/proposal-setmap-offrom/#sec-map.of\nrequire('./_set-collection-of')('Map');\n","'use strict';\n// https://tc39.github.io/proposal-setmap-offrom/\nvar $export = require('./_export');\nvar aFunction = require('./_a-function');\nvar ctx = require('./_ctx');\nvar forOf = require('./_for-of');\n\nmodule.exports = function (COLLECTION) {\n $export($export.S, COLLECTION, { from: function from(source /* , mapFn, thisArg */) {\n var mapFn = arguments[1];\n var mapping, A, n, cb;\n aFunction(this);\n mapping = mapFn !== undefined;\n if (mapping) aFunction(mapFn);\n if (source == undefined) return new this();\n A = [];\n if (mapping) {\n n = 0;\n cb = ctx(mapFn, arguments[2], 2);\n forOf(source, false, function (nextItem) {\n A.push(cb(nextItem, n++));\n });\n } else {\n forOf(source, false, A.push, A);\n }\n return new this(A);\n } });\n};\n","// https://tc39.github.io/proposal-setmap-offrom/#sec-map.from\nrequire('./_set-collection-from')('Map');\n","require('../modules/es6.object.to-string');\nrequire('../modules/es6.string.iterator');\nrequire('../modules/web.dom.iterable');\nrequire('../modules/es6.map');\nrequire('../modules/es7.map.to-json');\nrequire('../modules/es7.map.of');\nrequire('../modules/es7.map.from');\nmodule.exports = require('../modules/_core').Map;\n","module.exports = require(\"core-js/library/fn/map\");","'use strict';\nvar aFunction = require('./_a-function');\nvar isObject = require('./_is-object');\nvar invoke = require('./_invoke');\nvar arraySlice = [].slice;\nvar factories = {};\n\nvar construct = function (F, len, args) {\n if (!(len in factories)) {\n for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']';\n // eslint-disable-next-line no-new-func\n factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');\n } return factories[len](F, args);\n};\n\nmodule.exports = Function.bind || function bind(that /* , ...args */) {\n var fn = aFunction(this);\n var partArgs = arraySlice.call(arguments, 1);\n var bound = function (/* args... */) {\n var args = partArgs.concat(arraySlice.call(arguments));\n return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);\n };\n if (isObject(fn.prototype)) bound.prototype = fn.prototype;\n return bound;\n};\n","// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])\nvar $export = require('./_export');\nvar create = require('./_object-create');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar bind = require('./_bind');\nvar rConstruct = (require('./_global').Reflect || {}).construct;\n\n// MS Edge supports only 2 arguments and argumentsList argument is optional\n// FF Nightly sets third argument as `new.target`, but does not create `this` from it\nvar NEW_TARGET_BUG = fails(function () {\n function F() { /* empty */ }\n return !(rConstruct(function () { /* empty */ }, [], F) instanceof F);\n});\nvar ARGS_BUG = !fails(function () {\n rConstruct(function () { /* empty */ });\n});\n\n$export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {\n construct: function construct(Target, args /* , newTarget */) {\n aFunction(Target);\n anObject(args);\n var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);\n if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget);\n if (Target == newTarget) {\n // w/o altered newTarget, optimization for 0-4 arguments\n switch (args.length) {\n case 0: return new Target();\n case 1: return new Target(args[0]);\n case 2: return new Target(args[0], args[1]);\n case 3: return new Target(args[0], args[1], args[2]);\n case 4: return new Target(args[0], args[1], args[2], args[3]);\n }\n // w/o altered newTarget, lot of arguments case\n var $args = [null];\n $args.push.apply($args, args);\n return new (bind.apply(Target, $args))();\n }\n // with altered newTarget, not support built-in constructors\n var proto = newTarget.prototype;\n var instance = create(isObject(proto) ? proto : Object.prototype);\n var result = Function.apply.call(Target, instance, args);\n return isObject(result) ? result : instance;\n }\n});\n","require('../../modules/es6.reflect.construct');\nmodule.exports = require('../../modules/_core').Reflect.construct;\n","module.exports = require(\"core-js/library/fn/reflect/construct\");","var _Reflect$construct = require(\"../core-js/reflect/construct\");\n\nvar setPrototypeOf = require(\"./setPrototypeOf\");\n\nfunction _construct(Parent, args, Class) {\n if (typeof Reflect !== \"undefined\" && _Reflect$construct) {\n module.exports = _construct = _Reflect$construct;\n } else {\n module.exports = _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Parent.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n\n return _construct.apply(null, arguments);\n}\n\nmodule.exports = _construct;","var _Object$create = require(\"../core-js/object/create\");\n\nvar _Map = require(\"../core-js/map\");\n\nvar getPrototypeOf = require(\"./getPrototypeOf\");\n\nvar setPrototypeOf = require(\"./setPrototypeOf\");\n\nvar construct = require(\"./construct\");\n\nfunction _wrapNativeSuper(Class) {\n var _cache = typeof _Map === \"function\" ? new _Map() : undefined;\n\n module.exports = _wrapNativeSuper = function _wrapNativeSuper(Class) {\n if (typeof Class !== \"function\") {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n\n _cache.set(Class, Wrapper);\n }\n\n function Wrapper() {}\n\n Wrapper.prototype = _Object$create(Class.prototype, {\n constructor: {\n value: Wrapper,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n return setPrototypeOf(Wrapper, setPrototypeOf(function Super() {\n return construct(Class, arguments, getPrototypeOf(this).constructor);\n }, Class));\n };\n\n return _wrapNativeSuper(Class);\n}\n\nmodule.exports = _wrapNativeSuper;","export class CompositionError extends Error {\n constructor(classInstance, message, component) {\n super(`@${classInstance}: ${message}`);\n\n const stackArray = this.stack.split('\\n');\n stackArray.splice(1, 2);\n\n this.stack = stackArray.join('\\n');\n\n if (console) console.error('Component:', component);\n\n this.name = 'CompositionError';\n }\n}\n\nexport class DependencyError extends Error {\n constructor(classInstance, message, activeModule, dependencyModule = false) {\n super(`@${classInstance}: ${message}`);\n\n const stackArray = this.stack.split('\\n');\n stackArray.splice(1, 2);\n\n this.stack = stackArray.join('\\n');\n\n if (console) console.error('Active module:', activeModule);\n if (console && dependencyModule) console.error('Dependency published by module:', dependencyModule);\n\n this.name = 'DependencyError';\n }\n}\n\nexport class ManagerError extends Error {\n constructor(classInstance, message, component, activeModule = false) {\n super(`@${classInstance}: ${message}`);\n\n const stackArray = this.stack.split('\\n');\n stackArray.splice(1, 2);\n\n this.stack = stackArray.join('\\n');\n\n if (console) console.error('Component:', component);\n if (console && activeModule) console.error('Active module:', activeModule);\n\n this.name = 'ManagerError';\n }\n}\n","import {REVISION} from 'three';\nimport Events from 'minivents';\nimport {ManagerError} from './errors';\n\n// Check for Three.js\nconst warnDeps = () => {\n throw new Error('WhitestormJS Framework requ ires Three.js r92. https://threejs.org/');\n};\n\ntry {\n if (!REVISION) warnDeps();\n} catch (err) {\n warnDeps();\n}\n\n/**\n * @class ModuleSystem\n * @category core\n * @description Provides API for classes that will use Modules.
    \n * This class includes basic event system with those supported methods:\n *
    .on()
    .off()
    .emit()
    \n * @extends Events\n * @memberof module:core\n */\nexport class ModuleSystem extends Events {\n // INTEGRATING\n\n /**\n * @method integrateModules\n * @instance\n * @description This method applies all modules from .modules collection.\n * @param {Object} [source] If source (should be a component) is provided, will replace .modules with source's one before executing modules.\n * @memberof module:core.ModuleSystem\n */\n integrateModules(source) {\n if (!this.modules && !source) return;\n if (source && source.modules) this.modules = source.modules.slice(0);\n\n if (this.modules) {\n for (let i = 0, max = this.modules.length; i < max; i++)\n this.applyModule(this.modules[i], false);\n }\n\n if (source) this.applyBridge({onCopy: source});\n }\n\n // APPLYING MODULE (...and a \"bridge\" for module)\n\n /**\n * @method applyBridge\n * @instance\n * @description Makes component-specific API to work with modules.\n * @param {Object} bridgeMap\n * @return {Object} Returns object with modified values.\n * @memberof module:core.ModuleSystem\n */\n applyBridge(bridgeMap = {}) {\n const {modules} = this;\n if (!modules) return bridgeMap;\n\n for (let i = 0, max = modules.length; i < max; i++) {\n for (const key in bridgeMap) {\n if (bridgeMap[key]) {\n const module = modules[i];\n\n if (module && module.bridge && module.bridge[key])\n bridgeMap[key] = module.bridge[key].apply(this, [bridgeMap[key], module]);\n }\n }\n }\n\n return bridgeMap;\n }\n\n /**\n * @method applyCommand\n * @instance\n * @description .applyCommand runs a method called `name` on all modules.\n * @param {String} name the method name.\n * @param {Function} [cb=(func, moduleScope) => func.apply(this, [moduleScope])] How the function is wrapped/\n * @memberof module:core.ModuleSystem\n */\n applyCommand(name, cb = (func, moduleScope) => func.apply(this, [moduleScope])) {\n const {modules} = this;\n if (!modules) return;\n\n for (let i = 0, max = modules.length; i < max; i++) {\n const module = modules[i];\n if (name in module) cb(module[name], module);\n }\n }\n\n /**\n * @method applyModule\n * @instance\n * @description .applyModule is also used in .integrateModules() function.\n * It does exactly what its name says (applies module to component or app).\n * @param {Object} module the module to apply\n * @param {Boolean} [push=true]\n * @return {Object} Returns module that was applied.\n * @throws {ManagerError}\n * @memberof module:core.ModuleSystem\n */\n applyModule(module, push = true) {\n if (!module) return;\n if (push && this.modules) this.modules.push(module);\n else if (push) this.modules = [module];\n\n if (this.manager) this.manager.active(module);\n\n if (module.manager && this.manager) module.manager(this.manager);\n else if (module.manager) {\n throw new ManagerError(\n 'Component',\n `Module requires ModuleManager that is turned off for this component`,\n this, module\n );\n }\n\n if (module.integrate) module.integrate.bind(this)(module);\n\n return module;\n }\n\n /**\n * @method disposeModules\n * @instance\n * @description Disposes of all modules\n * @memberof module:core.ModuleSystem\n */\n disposeModules() {\n while (this.modules.length)\n this.disposeModule(this.modules[0]);\n }\n\n /**\n * @method disposeModule\n * @instance\n * @description Disposes of the given module\n * @param {Object} module the module to dispose\n * @return {Module} Returns module that was removed.\n * @memberof module:core.ModuleSystem\n */\n disposeModule(module) {\n if (!module) return;\n\n this.modules.splice(this.modules.indexOf(module), 1);\n\n if (module.dispose) module.dispose.bind(this)(module);\n\n return module;\n }\n\n // PIPED METHOD\n\n /**\n * @method module\n * @instance\n * @description piped version of .applyModule().\n * @param {Object} module the module to apply\n * @return {this} returns this - app/component\n * @throws {ManagerError}\n * @memberof module:core.ModuleSystem\n * @example Piped modules\n * component\n * .module(new Module1())\n * .module(new Module2())\n * .module(new Module3())\n */\n module(module) {\n this.applyModule(module);\n return this;\n }\n}\n","function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nmodule.exports = _arrayWithHoles;","var anObject = require('./_an-object');\nvar get = require('./core.get-iterator-method');\nmodule.exports = require('./_core').getIterator = function (it) {\n var iterFn = get(it);\n if (typeof iterFn != 'function') throw TypeError(it + ' is not iterable!');\n return anObject(iterFn.call(it));\n};\n","require('../modules/web.dom.iterable');\nrequire('../modules/es6.string.iterator');\nmodule.exports = require('../modules/core.get-iterator');\n","module.exports = require(\"core-js/library/fn/get-iterator\");","var _getIterator = require(\"../core-js/get-iterator\");\n\nfunction _iterableToArrayLimit(arr, i) {\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = _getIterator(arr), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nmodule.exports = _iterableToArrayLimit;","function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\nmodule.exports = _nonIterableRest;","var arrayWithHoles = require(\"./arrayWithHoles\");\n\nvar iterableToArrayLimit = require(\"./iterableToArrayLimit\");\n\nvar nonIterableRest = require(\"./nonIterableRest\");\n\nfunction _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || nonIterableRest();\n}\n\nmodule.exports = _slicedToArray;","export default function symbolObservablePonyfill(root) {\n\tvar result;\n\tvar Symbol = root.Symbol;\n\n\tif (typeof Symbol === 'function') {\n\t\tif (Symbol.observable) {\n\t\t\tresult = Symbol.observable;\n\t\t} else {\n\t\t\tresult = Symbol('observable');\n\t\t\tSymbol.observable = result;\n\t\t}\n\t} else {\n\t\tresult = '@@observable';\n\t}\n\n\treturn result;\n};\n","/* global window */\nimport ponyfill from './ponyfill.js';\n\nvar root;\n\nif (typeof self !== 'undefined') {\n root = self;\n} else if (typeof window !== 'undefined') {\n root = window;\n} else if (typeof global !== 'undefined') {\n root = global;\n} else if (typeof module !== 'undefined') {\n root = module;\n} else {\n root = Function('return this')();\n}\n\nvar result = ponyfill(root);\nexport default result;\n","import $$observable from 'symbol-observable';\n\n/**\n * These are private action types reserved by Redux.\n * For any unknown actions, you must return the current state.\n * If the current state is undefined, you must return the initial state.\n * Do not reference these action types directly in your code.\n */\nvar ActionTypes = {\n INIT: '@@redux/INIT' + Math.random().toString(36).substring(7).split('').join('.'),\n REPLACE: '@@redux/REPLACE' + Math.random().toString(36).substring(7).split('').join('.')\n};\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\n/**\n * @param {any} obj The object to inspect.\n * @returns {boolean} True if the argument appears to be a plain object.\n */\nfunction isPlainObject(obj) {\n if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) !== 'object' || obj === null) return false;\n\n var proto = obj;\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto);\n }\n\n return Object.getPrototypeOf(obj) === proto;\n}\n\n/**\n * Creates a Redux store that holds the state tree.\n * The only way to change the data in the store is to call `dispatch()` on it.\n *\n * There should only be a single store in your app. To specify how different\n * parts of the state tree respond to actions, you may combine several reducers\n * into a single reducer function by using `combineReducers`.\n *\n * @param {Function} reducer A function that returns the next state tree, given\n * the current state tree and the action to handle.\n *\n * @param {any} [preloadedState] The initial state. You may optionally specify it\n * to hydrate the state from the server in universal apps, or to restore a\n * previously serialized user session.\n * If you use `combineReducers` to produce the root reducer function, this must be\n * an object with the same shape as `combineReducers` keys.\n *\n * @param {Function} [enhancer] The store enhancer. You may optionally specify it\n * to enhance the store with third-party capabilities such as middleware,\n * time travel, persistence, etc. The only store enhancer that ships with Redux\n * is `applyMiddleware()`.\n *\n * @returns {Store} A Redux store that lets you read the state, dispatch actions\n * and subscribe to changes.\n */\nfunction createStore(reducer, preloadedState, enhancer) {\n var _ref2;\n\n if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {\n enhancer = preloadedState;\n preloadedState = undefined;\n }\n\n if (typeof enhancer !== 'undefined') {\n if (typeof enhancer !== 'function') {\n throw new Error('Expected the enhancer to be a function.');\n }\n\n return enhancer(createStore)(reducer, preloadedState);\n }\n\n if (typeof reducer !== 'function') {\n throw new Error('Expected the reducer to be a function.');\n }\n\n var currentReducer = reducer;\n var currentState = preloadedState;\n var currentListeners = [];\n var nextListeners = currentListeners;\n var isDispatching = false;\n\n function ensureCanMutateNextListeners() {\n if (nextListeners === currentListeners) {\n nextListeners = currentListeners.slice();\n }\n }\n\n /**\n * Reads the state tree managed by the store.\n *\n * @returns {any} The current state tree of your application.\n */\n function getState() {\n if (isDispatching) {\n throw new Error('You may not call store.getState() while the reducer is executing. ' + 'The reducer has already received the state as an argument. ' + 'Pass it down from the top reducer instead of reading it from the store.');\n }\n\n return currentState;\n }\n\n /**\n * Adds a change listener. It will be called any time an action is dispatched,\n * and some part of the state tree may potentially have changed. You may then\n * call `getState()` to read the current state tree inside the callback.\n *\n * You may call `dispatch()` from a change listener, with the following\n * caveats:\n *\n * 1. The subscriptions are snapshotted just before every `dispatch()` call.\n * If you subscribe or unsubscribe while the listeners are being invoked, this\n * will not have any effect on the `dispatch()` that is currently in progress.\n * However, the next `dispatch()` call, whether nested or not, will use a more\n * recent snapshot of the subscription list.\n *\n * 2. The listener should not expect to see all state changes, as the state\n * might have been updated multiple times during a nested `dispatch()` before\n * the listener is called. It is, however, guaranteed that all subscribers\n * registered before the `dispatch()` started will be called with the latest\n * state by the time it exits.\n *\n * @param {Function} listener A callback to be invoked on every dispatch.\n * @returns {Function} A function to remove this change listener.\n */\n function subscribe(listener) {\n if (typeof listener !== 'function') {\n throw new Error('Expected the listener to be a function.');\n }\n\n if (isDispatching) {\n throw new Error('You may not call store.subscribe() while the reducer is executing. ' + 'If you would like to be notified after the store has been updated, subscribe from a ' + 'component and invoke store.getState() in the callback to access the latest state. ' + 'See https://redux.js.org/api-reference/store#subscribe(listener) for more details.');\n }\n\n var isSubscribed = true;\n\n ensureCanMutateNextListeners();\n nextListeners.push(listener);\n\n return function unsubscribe() {\n if (!isSubscribed) {\n return;\n }\n\n if (isDispatching) {\n throw new Error('You may not unsubscribe from a store listener while the reducer is executing. ' + 'See https://redux.js.org/api-reference/store#subscribe(listener) for more details.');\n }\n\n isSubscribed = false;\n\n ensureCanMutateNextListeners();\n var index = nextListeners.indexOf(listener);\n nextListeners.splice(index, 1);\n };\n }\n\n /**\n * Dispatches an action. It is the only way to trigger a state change.\n *\n * The `reducer` function, used to create the store, will be called with the\n * current state tree and the given `action`. Its return value will\n * be considered the **next** state of the tree, and the change listeners\n * will be notified.\n *\n * The base implementation only supports plain object actions. If you want to\n * dispatch a Promise, an Observable, a thunk, or something else, you need to\n * wrap your store creating function into the corresponding middleware. For\n * example, see the documentation for the `redux-thunk` package. Even the\n * middleware will eventually dispatch plain object actions using this method.\n *\n * @param {Object} action A plain object representing “what changed”. It is\n * a good idea to keep actions serializable so you can record and replay user\n * sessions, or use the time travelling `redux-devtools`. An action must have\n * a `type` property which may not be `undefined`. It is a good idea to use\n * string constants for action types.\n *\n * @returns {Object} For convenience, the same action object you dispatched.\n *\n * Note that, if you use a custom middleware, it may wrap `dispatch()` to\n * return something else (for example, a Promise you can await).\n */\n function dispatch(action) {\n if (!isPlainObject(action)) {\n throw new Error('Actions must be plain objects. ' + 'Use custom middleware for async actions.');\n }\n\n if (typeof action.type === 'undefined') {\n throw new Error('Actions may not have an undefined \"type\" property. ' + 'Have you misspelled a constant?');\n }\n\n if (isDispatching) {\n throw new Error('Reducers may not dispatch actions.');\n }\n\n try {\n isDispatching = true;\n currentState = currentReducer(currentState, action);\n } finally {\n isDispatching = false;\n }\n\n var listeners = currentListeners = nextListeners;\n for (var i = 0; i < listeners.length; i++) {\n var listener = listeners[i];\n listener();\n }\n\n return action;\n }\n\n /**\n * Replaces the reducer currently used by the store to calculate the state.\n *\n * You might need this if your app implements code splitting and you want to\n * load some of the reducers dynamically. You might also need this if you\n * implement a hot reloading mechanism for Redux.\n *\n * @param {Function} nextReducer The reducer for the store to use instead.\n * @returns {void}\n */\n function replaceReducer(nextReducer) {\n if (typeof nextReducer !== 'function') {\n throw new Error('Expected the nextReducer to be a function.');\n }\n\n currentReducer = nextReducer;\n dispatch({ type: ActionTypes.REPLACE });\n }\n\n /**\n * Interoperability point for observable/reactive libraries.\n * @returns {observable} A minimal observable of state changes.\n * For more information, see the observable proposal:\n * https://github.com/tc39/proposal-observable\n */\n function observable() {\n var _ref;\n\n var outerSubscribe = subscribe;\n return _ref = {\n /**\n * The minimal observable subscription method.\n * @param {Object} observer Any object that can be used as an observer.\n * The observer object should have a `next` method.\n * @returns {subscription} An object with an `unsubscribe` method that can\n * be used to unsubscribe the observable from the store, and prevent further\n * emission of values from the observable.\n */\n subscribe: function subscribe(observer) {\n if ((typeof observer === 'undefined' ? 'undefined' : _typeof(observer)) !== 'object' || observer === null) {\n throw new TypeError('Expected the observer to be an object.');\n }\n\n function observeState() {\n if (observer.next) {\n observer.next(getState());\n }\n }\n\n observeState();\n var unsubscribe = outerSubscribe(observeState);\n return { unsubscribe: unsubscribe };\n }\n }, _ref[$$observable] = function () {\n return this;\n }, _ref;\n }\n\n // When a store is created, an \"INIT\" action is dispatched so that every\n // reducer returns their initial state. This effectively populates\n // the initial state tree.\n dispatch({ type: ActionTypes.INIT });\n\n return _ref2 = {\n dispatch: dispatch,\n subscribe: subscribe,\n getState: getState,\n replaceReducer: replaceReducer\n }, _ref2[$$observable] = observable, _ref2;\n}\n\n/**\n * Prints a warning in the console if it exists.\n *\n * @param {String} message The warning message.\n * @returns {void}\n */\nfunction warning(message) {\n /* eslint-disable no-console */\n if (typeof console !== 'undefined' && typeof console.error === 'function') {\n console.error(message);\n }\n /* eslint-enable no-console */\n try {\n // This error was thrown as a convenience so that if you enable\n // \"break on all exceptions\" in your console,\n // it would pause the execution at this line.\n throw new Error(message);\n } catch (e) {} // eslint-disable-line no-empty\n}\n\nfunction getUndefinedStateErrorMessage(key, action) {\n var actionType = action && action.type;\n var actionDescription = actionType && 'action \"' + String(actionType) + '\"' || 'an action';\n\n return 'Given ' + actionDescription + ', reducer \"' + key + '\" returned undefined. ' + 'To ignore an action, you must explicitly return the previous state. ' + 'If you want this reducer to hold no value, you can return null instead of undefined.';\n}\n\nfunction getUnexpectedStateShapeWarningMessage(inputState, reducers, action, unexpectedKeyCache) {\n var reducerKeys = Object.keys(reducers);\n var argumentName = action && action.type === ActionTypes.INIT ? 'preloadedState argument passed to createStore' : 'previous state received by the reducer';\n\n if (reducerKeys.length === 0) {\n return 'Store does not have a valid reducer. Make sure the argument passed ' + 'to combineReducers is an object whose values are reducers.';\n }\n\n if (!isPlainObject(inputState)) {\n return 'The ' + argumentName + ' has unexpected type of \"' + {}.toString.call(inputState).match(/\\s([a-z|A-Z]+)/)[1] + '\". Expected argument to be an object with the following ' + ('keys: \"' + reducerKeys.join('\", \"') + '\"');\n }\n\n var unexpectedKeys = Object.keys(inputState).filter(function (key) {\n return !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key];\n });\n\n unexpectedKeys.forEach(function (key) {\n unexpectedKeyCache[key] = true;\n });\n\n if (action && action.type === ActionTypes.REPLACE) return;\n\n if (unexpectedKeys.length > 0) {\n return 'Unexpected ' + (unexpectedKeys.length > 1 ? 'keys' : 'key') + ' ' + ('\"' + unexpectedKeys.join('\", \"') + '\" found in ' + argumentName + '. ') + 'Expected to find one of the known reducer keys instead: ' + ('\"' + reducerKeys.join('\", \"') + '\". Unexpected keys will be ignored.');\n }\n}\n\nfunction assertReducerShape(reducers) {\n Object.keys(reducers).forEach(function (key) {\n var reducer = reducers[key];\n var initialState = reducer(undefined, { type: ActionTypes.INIT });\n\n if (typeof initialState === 'undefined') {\n throw new Error('Reducer \"' + key + '\" returned undefined during initialization. ' + 'If the state passed to the reducer is undefined, you must ' + 'explicitly return the initial state. The initial state may ' + 'not be undefined. If you don\\'t want to set a value for this reducer, ' + 'you can use null instead of undefined.');\n }\n\n var type = '@@redux/PROBE_UNKNOWN_ACTION_' + Math.random().toString(36).substring(7).split('').join('.');\n if (typeof reducer(undefined, { type: type }) === 'undefined') {\n throw new Error('Reducer \"' + key + '\" returned undefined when probed with a random type. ' + ('Don\\'t try to handle ' + ActionTypes.INIT + ' or other actions in \"redux/*\" ') + 'namespace. They are considered private. Instead, you must return the ' + 'current state for any unknown actions, unless it is undefined, ' + 'in which case you must return the initial state, regardless of the ' + 'action type. The initial state may not be undefined, but can be null.');\n }\n });\n}\n\n/**\n * Turns an object whose values are different reducer functions, into a single\n * reducer function. It will call every child reducer, and gather their results\n * into a single state object, whose keys correspond to the keys of the passed\n * reducer functions.\n *\n * @param {Object} reducers An object whose values correspond to different\n * reducer functions that need to be combined into one. One handy way to obtain\n * it is to use ES6 `import * as reducers` syntax. The reducers may never return\n * undefined for any action. Instead, they should return their initial state\n * if the state passed to them was undefined, and the current state for any\n * unrecognized action.\n *\n * @returns {Function} A reducer function that invokes every reducer inside the\n * passed object, and builds a state object with the same shape.\n */\nfunction combineReducers(reducers) {\n var reducerKeys = Object.keys(reducers);\n var finalReducers = {};\n for (var i = 0; i < reducerKeys.length; i++) {\n var key = reducerKeys[i];\n\n if (process.env.NODE_ENV !== 'production') {\n if (typeof reducers[key] === 'undefined') {\n warning('No reducer provided for key \"' + key + '\"');\n }\n }\n\n if (typeof reducers[key] === 'function') {\n finalReducers[key] = reducers[key];\n }\n }\n var finalReducerKeys = Object.keys(finalReducers);\n\n var unexpectedKeyCache = void 0;\n if (process.env.NODE_ENV !== 'production') {\n unexpectedKeyCache = {};\n }\n\n var shapeAssertionError = void 0;\n try {\n assertReducerShape(finalReducers);\n } catch (e) {\n shapeAssertionError = e;\n }\n\n return function combination() {\n var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var action = arguments[1];\n\n if (shapeAssertionError) {\n throw shapeAssertionError;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n var warningMessage = getUnexpectedStateShapeWarningMessage(state, finalReducers, action, unexpectedKeyCache);\n if (warningMessage) {\n warning(warningMessage);\n }\n }\n\n var hasChanged = false;\n var nextState = {};\n for (var _i = 0; _i < finalReducerKeys.length; _i++) {\n var _key = finalReducerKeys[_i];\n var reducer = finalReducers[_key];\n var previousStateForKey = state[_key];\n var nextStateForKey = reducer(previousStateForKey, action);\n if (typeof nextStateForKey === 'undefined') {\n var errorMessage = getUndefinedStateErrorMessage(_key, action);\n throw new Error(errorMessage);\n }\n nextState[_key] = nextStateForKey;\n hasChanged = hasChanged || nextStateForKey !== previousStateForKey;\n }\n return hasChanged ? nextState : state;\n };\n}\n\nfunction bindActionCreator(actionCreator, dispatch) {\n return function () {\n return dispatch(actionCreator.apply(this, arguments));\n };\n}\n\n/**\n * Turns an object whose values are action creators, into an object with the\n * same keys, but with every function wrapped into a `dispatch` call so they\n * may be invoked directly. This is just a convenience method, as you can call\n * `store.dispatch(MyActionCreators.doSomething())` yourself just fine.\n *\n * For convenience, you can also pass a single function as the first argument,\n * and get a function in return.\n *\n * @param {Function|Object} actionCreators An object whose values are action\n * creator functions. One handy way to obtain it is to use ES6 `import * as`\n * syntax. You may also pass a single function.\n *\n * @param {Function} dispatch The `dispatch` function available on your Redux\n * store.\n *\n * @returns {Function|Object} The object mimicking the original object, but with\n * every action creator wrapped into the `dispatch` call. If you passed a\n * function as `actionCreators`, the return value will also be a single\n * function.\n */\nfunction bindActionCreators(actionCreators, dispatch) {\n if (typeof actionCreators === 'function') {\n return bindActionCreator(actionCreators, dispatch);\n }\n\n if ((typeof actionCreators === 'undefined' ? 'undefined' : _typeof(actionCreators)) !== 'object' || actionCreators === null) {\n throw new Error('bindActionCreators expected an object or a function, instead received ' + (actionCreators === null ? 'null' : typeof actionCreators === 'undefined' ? 'undefined' : _typeof(actionCreators)) + '. ' + 'Did you write \"import ActionCreators from\" instead of \"import * as ActionCreators from\"?');\n }\n\n var keys = Object.keys(actionCreators);\n var boundActionCreators = {};\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var actionCreator = actionCreators[key];\n if (typeof actionCreator === 'function') {\n boundActionCreators[key] = bindActionCreator(actionCreator, dispatch);\n }\n }\n return boundActionCreators;\n}\n\n/**\n * Composes single-argument functions from right to left. The rightmost\n * function can take multiple arguments as it provides the signature for\n * the resulting composite function.\n *\n * @param {...Function} funcs The functions to compose.\n * @returns {Function} A function obtained by composing the argument functions\n * from right to left. For example, compose(f, g, h) is identical to doing\n * (...args) => f(g(h(...args))).\n */\n\nfunction compose() {\n for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) {\n funcs[_key] = arguments[_key];\n }\n\n if (funcs.length === 0) {\n return function (arg) {\n return arg;\n };\n }\n\n if (funcs.length === 1) {\n return funcs[0];\n }\n\n return funcs.reduce(function (a, b) {\n return function () {\n return a(b.apply(undefined, arguments));\n };\n });\n}\n\n/**\n * Creates a store enhancer that applies middleware to the dispatch method\n * of the Redux store. This is handy for a variety of tasks, such as expressing\n * asynchronous actions in a concise manner, or logging every action payload.\n *\n * See `redux-thunk` package as an example of the Redux middleware.\n *\n * Because middleware is potentially asynchronous, this should be the first\n * store enhancer in the composition chain.\n *\n * Note that each middleware will be given the `dispatch` and `getState` functions\n * as named arguments.\n *\n * @param {...Function} middlewares The middleware chain to be applied.\n * @returns {Function} A store enhancer applying the middleware.\n */\nfunction applyMiddleware() {\n for (var _len = arguments.length, middlewares = Array(_len), _key = 0; _key < _len; _key++) {\n middlewares[_key] = arguments[_key];\n }\n\n return function (createStore) {\n return function () {\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n var store = createStore.apply(undefined, args);\n var _dispatch = function dispatch() {\n throw new Error('Dispatching while constructing your middleware is not allowed. ' + 'Other middleware would not be applied to this dispatch.');\n };\n\n var middlewareAPI = {\n getState: store.getState,\n dispatch: function dispatch() {\n return _dispatch.apply(undefined, arguments);\n }\n };\n var chain = middlewares.map(function (middleware) {\n return middleware(middlewareAPI);\n });\n _dispatch = compose.apply(undefined, chain)(store.dispatch);\n\n return _extends({}, store, {\n dispatch: _dispatch\n });\n };\n };\n}\n\n/*\n * This is a dummy function to check if the function name has been altered by minification.\n * If the function has been minified and NODE_ENV !== 'production', warn the user.\n */\nfunction isCrushed() {}\n\nif (process.env.NODE_ENV !== 'production' && typeof isCrushed.name === 'string' && isCrushed.name !== 'isCrushed') {\n warning(\"You are currently using minified code outside of NODE_ENV === 'production'. \" + 'This means that you are running a slower development build of Redux. ' + 'You can use loose-envify (https://github.com/zertosh/loose-envify) for browserify ' + 'or DefinePlugin for webpack (http://stackoverflow.com/questions/30030031) ' + 'to ensure you have the correct code for your production build.');\n}\n\nexport { createStore, combineReducers, bindActionCreators, applyMiddleware, compose, ActionTypes as __DO_NOT_USE__ActionTypes };\n","import {createStore} from 'redux';\nimport {DependencyError} from './errors';\n\n/**\n * @class ModuleManager\n * @category core\n * @param {Object} object handler\n * @description Solves modules dependencies\n * @memberof module:core\n */\nexport class ModuleManager {\n constructor(object) {\n this.handler = object;\n this.currentModule = null;\n\n this.store = createStore((state = [{}, ''], action) => {\n state[0][action.key] = action.data;\n state[1] = action.key;\n\n return state;\n });\n\n this.modules = {};\n }\n\n /**\n * @method active\n * @instance\n * @description Sets .currentModule to provided module.\n * @param {Object} module the module to make current\n * @memberof module:core.ModuleManager\n */\n active(module) {\n this.currentModule = module;\n }\n\n /**\n * @method reset\n * @instance\n * @description Set's .currentModule to null.\n * @memberof module:core.ModuleManager\n */\n reset() {\n this.currentModule = null;\n }\n\n /**\n * @method define\n * @instance\n * @description Define the module in manager\n * @param name The module name\n * @memberof module:core.ModuleManager\n */\n define(name) {\n this.modules[name] = this.currentModule;\n }\n\n /**\n * @method use\n * @instance\n * @description Get the defined module from manager\n * @param name The module name\n * @memberof module:core.ModuleManager\n */\n use(name) {\n return this.modules[name];\n }\n\n /**\n * @method set\n * @instance\n * @description An alias for .add()

    \n * Use this method if you know that you will overwrite existing dependency.
    \n * Use it in your app, but not in module that you provide to other people.\n * @param {String} key the key of the dependency\n * @param {Object} data the value of the dependency\n * @memberof module:core.ModuleManager\n */\n set(key, data) {\n this.store.dispatch({\n type: 'ADD',\n key,\n data\n });\n }\n\n /**\n * @method get\n * @instance\n * @description Returns dependency in store object, by key.\n * @param {String} key the key of the dependency\n * @memberof module:core.ModuleManager\n * @return {Object|Module}\n * @throws {DependencyError} if dependency is not in the store\n * @example Get the 'hello' dependency\n * manager.get('hello'); // -> {world: true}\n */\n get(key) {\n if (!this.store.getState()[0][key]) {\n throw new DependencyError(\n 'ModuleManager',\n `Module requires '${key}' dependency`,\n this.currentModule\n );\n }\n\n return this.store.getState()[0][key];\n }\n\n /**\n * @method has\n * @instance\n * @description Returns whether manager has a dependency with the given key\n * @param {String} key the key of the dependency\n * @memberof module:core.ModuleManager\n * @return {Boolean} Promise that is resolved when all promises completed.\n * @example Check whether the store has the 'hello' dependency\n * manager.has('hello'); // -> true\n */\n has(key) {\n return Boolean(this.store.getState()[0][key]);\n }\n\n /**\n * @method update\n * @instance\n * @description Updates deps\n * @param {Object} [depsMap={}]\n * @memberof module:core.ModuleManager\n */\n update(depsMap = {}) {\n this.store.subscribe(() => {\n const [data, changedKey] = this.store.getState();\n const callback = depsMap[changedKey];\n\n if (callback) callback(data[changedKey]);\n });\n }\n\n /**\n * @method add\n * @alias module:core.ModuleManager#set\n * @memberof module:core.ModuleManager\n */\n add(...data) {\n console.warn('.add() method is deprecated. Use .set() instead');\n return this.set(...data);\n }\n\n /**\n * @method require\n * @instance\n * @description Require module\n * @param {String} name Defined name\n * @param {Function} moduleExecutor Function that returns applied module\n * @memberof module:core.ModuleManager\n */\n require(name, moduleExecutor) {\n if (this.use(name) === undefined) this.handler.applyModule(moduleExecutor());\n }\n}\n","import {extend, transformData} from '../utils';\nimport {ModuleSystem} from './ModuleSystem';\nimport {ModuleManager} from './ModuleManager';\nimport {ManagerError, CompositionError} from './errors';\n\n/**\n * @class Component\n * @category core\n * @param {Object} [params] - The parameters object.\n * @param {Object} [instructions] - The instructions object.\n * @extends ModuleSystem\n * @memberof module:core\n */\nclass Component extends ModuleSystem {\n /**\n * Default values for parameters\n * @member {Object} module:core.Component#defaults\n * @static\n * @default {\n * modules: [],\n * manager: true\n * }\n */\n static defaults = {\n modules: null,\n manager: true\n };\n\n /**\n * Static instructions\n * @member {Object} module:core.Component#instructions\n * @static\n * @default {}\n */\n static instructions = {};\n\n /**\n * Array of promises that should be resolved before Component is ready.\n * @member {Array} module:core.Component#_wait\n * @private\n */\n _wait = []; // Collection of promises;\n\n /**\n * Collection of `modules`.\n * @member {Array} module:core.Component#modules\n * @public\n */\n modules = []; // Collection of modules;\n\n /**\n * Collection of `child` Components.\n * @member {Array} module:core.Component#children\n * @public\n */\n children = []; // For keeping children components;\n\n constructor(params = {}, defaults = Component.defaults, instructions = Component.instructions) {\n super();\n\n // Apply polyfilled parameters to .params;\n this.params = extend(transformData(params, instructions), defaults);\n if (this.params.manager) this.manager = new ModuleManager(this);\n\n this.modules = this.params.modules;\n\n this.integrateModules();\n }\n\n /**\n * @method wait\n * @instance\n * @description Wait for a promise.\n * @param {Promise} [promise] - The promise that should be added to a queue.\n * @return {Promise} Promise that is resolved when all promises completed.\n * @memberof module:core.Component\n */\n wait(promise) {\n if (promise) this._wait.push(promise);\n return Promise.all(this._wait);\n }\n\n /**\n * @method defer\n * @instance\n * @description Execute `func` (Callback) when Component is ready.\n * @param {Function} func - Callback.\n * @memberof module:core.Component\n */\n defer(func) {\n if (this.isDeffered) this.wait().then(() => func(this));\n else func(this);\n }\n\n // PARAMETERS\n\n /**\n * @method updateParams\n * @instance\n * @description Updates parameters of the Component.\n * @return {Object} Params of this Component\n * @memberof module:core.Component\n */\n updateParams(params = {}) {\n this.params = extend(params, this.params);\n return this.params;\n }\n\n // COPYING & CLONING\n\n /**\n * @method clone\n * @instance\n * @description Clone this component\n * @return {object} a cloned component with all its source component' params copied.\n * @memberof module:core.Component\n */\n clone() {\n return new this.constructor(this.params).copy(this);\n }\n\n /**\n * @method copy\n * @instance\n * @description Copy source native and integrate `modules` to it.\n * @param {Component} source - Source component that is used for `copy()` action.\n * @param {Function} [customize] - Callback executed before modules integration process.\n * @return {this} Component\n * @memberof module:core.Component\n */\n copy(source, customize) {\n this.params = {...source.params};\n\n if (source.native) this.native = source.native.clone(source.params);\n if (customize) customize();\n this.integrateModules(source);\n\n return this;\n }\n\n /**\n * @method add\n * @instance\n * @description Add a child `Component`.\n * @param {Component} object - Component that should be added as a `child`.\n * @return {Promise} Resolved when action is done.\n * @memberof module:core.Component\n */\n async add(object) {\n if (object.parent) await object.parent.remove(object);\n\n await this.wait();\n await object.wait();\n\n if (!object.native) {\n throw new CompositionError(\n 'Component',\n 'there is no object.native',\n this\n );\n }\n\n object.parent = this;\n await this.applyBridge({onAdd: object}).onAdd;\n this.native.add(object.native);\n this.children.push(object);\n\n return object;\n }\n\n /**\n * @method remove\n * @instance\n * @description Remove a child `Component`.\n * @param {Component} object - Component that should be a **child** of this Component.\n * @return {Promise} Resolved when action is done.\n * @memberof module:core.Component\n */\n async remove(object) {\n if (object.parent !== this) return;\n\n await this.wait();\n await object.wait();\n\n object.parent = null;\n this.native.remove(object.native);\n this.children.splice(this.children.indexOf(object), 1);\n }\n\n /**\n * @method addTo\n * @instance\n * @description Adds `this` Component to specified `App`/`Component`.\n * @param {Component} object - Component that will be a parent of `this`.\n * @memberof module:core.Component\n */\n addTo(object) {\n return object.add(this);\n }\n\n get(key) {\n return this.manager.get(key);\n }\n\n use(key) {\n return this.manager.use(key);\n }\n\n /**\n * Returns whether the object is `async` (`wait` promises are more than `0`).\n * @member {Boolean} module:core.Component#isDeffered\n */\n get isDeffered() {\n return this._wait.length > 0;\n }\n\n /**\n * Returns the `ModuleManager` used for this component.\n * @member {ModuleManager} module:core.Component#manager\n * @throws {ManagerError}\n */\n get manager() {\n if (this._manager) return this._manager;\n\n throw new ManagerError(\n 'Component',\n `ModuleManager is not used in this component. 'manager' parameter should be set as 'true'`,\n this\n );\n }\n\n set manager(manager) {\n this._manager = manager;\n }\n\n /**\n * Returns the `native` object used for this component.\n * @member {Object} module:core.Component#native\n */\n get native() {\n return this._native;\n }\n\n set native(mesh) {\n this._native = mesh;\n this._native.component = this;\n return this._native;\n }\n}\n\nexport {\n Component\n};\n","// 26.1.6 Reflect.get(target, propertyKey [, receiver])\nvar gOPD = require('./_object-gopd');\nvar getPrototypeOf = require('./_object-gpo');\nvar has = require('./_has');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\n\nfunction get(target, propertyKey /* , receiver */) {\n var receiver = arguments.length < 3 ? target : arguments[2];\n var desc, proto;\n if (anObject(target) === receiver) return target[propertyKey];\n if (desc = gOPD.f(target, propertyKey)) return has(desc, 'value')\n ? desc.value\n : desc.get !== undefined\n ? desc.get.call(receiver)\n : undefined;\n if (isObject(proto = getPrototypeOf(target))) return get(proto, propertyKey, receiver);\n}\n\n$export($export.S, 'Reflect', { get: get });\n","require('../../modules/es6.reflect.get');\nmodule.exports = require('../../modules/_core').Reflect.get;\n","module.exports = require(\"core-js/library/fn/reflect/get\");","var getPrototypeOf = require(\"./getPrototypeOf\");\n\nfunction _superPropBase(object, property) {\n while (!Object.prototype.hasOwnProperty.call(object, property)) {\n object = getPrototypeOf(object);\n if (object === null) break;\n }\n\n return object;\n}\n\nmodule.exports = _superPropBase;","var _Object$getOwnPropertyDescriptor = require(\"../core-js/object/get-own-property-descriptor\");\n\nvar _Reflect$get = require(\"../core-js/reflect/get\");\n\nvar getPrototypeOf = require(\"./getPrototypeOf\");\n\nvar superPropBase = require(\"./superPropBase\");\n\nfunction _get(target, property, receiver) {\n if (typeof Reflect !== \"undefined\" && _Reflect$get) {\n module.exports = _get = _Reflect$get;\n } else {\n module.exports = _get = function _get(target, property, receiver) {\n var base = superPropBase(target, property);\n if (!base) return;\n\n var desc = _Object$getOwnPropertyDescriptor(base, property);\n\n if (desc.get) {\n return desc.get.call(receiver);\n }\n\n return desc.value;\n };\n }\n\n return _get(target, property, receiver || target);\n}\n\nmodule.exports = _get;","export function attributes(...mappers) {\n return function (target) {\n for (let i = 0; i < mappers.length; i++) {\n const mapper = mappers[i];\n\n for (let k = 0; k < mapper.map.length; k++) {\n const attribute = mapper.map[k];\n\n Object.defineProperty(target.prototype, attribute, {\n get: mapper.getter(attribute),\n set: mapper.setter(attribute),\n configurable: mapper.configurable,\n enumerable: mapper.enumerable\n });\n }\n }\n };\n}\n\nexport function copy(...map) {\n return {\n map,\n getter(name) {\n return function () {\n return this.native[name];\n };\n },\n setter(name) {\n return function (value) {\n this.native[name].copy(value);\n };\n },\n configurable: true,\n enumerable: true\n };\n}\n\nexport function mirror(...map) {\n return {\n map,\n getter(name) {\n return function () {\n return this.native[name];\n };\n },\n setter(name) {\n return function (value) {\n this.native[name] = value;\n };\n },\n configurable: true,\n enumerable: true\n };\n}\n","import {Mesh} from 'three';\nimport {Component} from './Component';\n\nimport {attributes, copy, mirror} from './prototype/attributes';\nimport {CompositionError} from './errors';\n\n@attributes(\n copy('position', 'rotation', 'quaternion', 'scale'),\n mirror('material', 'geometry')\n)\n/**\n * @class MeshComponent\n * @category core\n * @param {Object} [params] - The parameters object.\n * @param {Object} [instructions] - The instructions object.\n * @extends module:core.Component\n * @memberof module:core\n */\nclass MeshComponent extends Component {\n /**\n * Default values for parameters\n * @member {Object} module:core.MeshComponent#defaults\n * @static\n * @default\n * {\n * build: true,\n * geometry: {},\n * material: false,\n *\n * shadow: {\n * cast: true,\n * receive: true\n * },\n *\n * position: {x: 0, y: 0, z: 0},\n * rotation: {x: 0, y: 0, z: 0},\n * scale: {x: 1, y: 1, z: 1}\n * }\n */\n static defaults = {\n ...Component.defaults,\n\n build: true,\n geometry: {},\n material: false,\n\n shadow: {\n cast: true,\n receive: true\n },\n\n position: {x: 0, y: 0, z: 0},\n rotation: {x: 0, y: 0, z: 0},\n scale: {x: 1, y: 1, z: 1}\n };\n\n /**\n * Static instructions\n * @member {Object} module:core.MeshComponent#instructions\n * @static\n * @default\n * {\n * position: ['x', 'y', 'z'],\n * rotation: ['x', 'y', 'z'],\n * scale: ['x', 'y', 'z']\n * }\n */\n static instructions = {\n position: ['x', 'y', 'z'],\n rotation: ['x', 'y', 'z'],\n scale: ['x', 'y', 'z']\n };\n\n // CUSTOM GEOMETRY HANDLING\n\n static custom(geom, constructor = Mesh) {\n return class extends MeshComponent {\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: geom,\n material: params.material\n });\n\n return this.applyBridge({mesh: new constructor(geometry, material)}).mesh;\n }\n };\n }\n\n static create(geom, params, constructor) {\n return new (MeshComponent.custom(geom, constructor))(params);\n }\n\n static from(mesh, params = {}) {\n params.build = false;\n\n const component = new MeshComponent(params);\n\n component.native = mesh;\n component.wrap();\n\n return component;\n }\n\n constructor(params, defaults = MeshComponent.defaults, instructions = MeshComponent.instructions) {\n super(params, defaults, instructions);\n\n if (this.params.build) {\n const build = this.build(this.params);\n\n if (!build) {\n throw new CompositionError(\n 'MeshComponent',\n '.build() method should return a THREE.Object3D or a Promise resolved with THREE.Object3D.',\n this\n );\n }\n\n if (build instanceof Promise) {\n this.wait(build);\n\n this.wait(new Promise(resolve => {\n build.then(native => {\n this.native = native;\n this.wrap().then(resolve);\n });\n }));\n } else {\n this.native = build;\n this.wait(this.wrap());\n }\n }\n\n this.applyCommand('postIntegrate');\n }\n\n // BUILDING & WRAPPING\n\n /**\n * @method build\n * @description Build livecycle should return a native object.\n * @throws {CompositionError}\n * @memberof module:core.MeshComponent\n */\n build() {\n throw new CompositionError(\n 'MeshComponent',\n 'Instance should have it\\'s own .build().',\n this\n );\n }\n\n /**\n * @method wrap\n * @instance\n * @description Wraps transforms (`position` & `rotation`)\n * @return {Promise} Resolved when action is completed\n * @memberof module:core.MeshComponent\n */\n wrap() {\n return new Promise(resolve => {\n // TODO: Fix defer with physics\n // this.defer(() => {\n const {position, rotation, scale, shadow} = this.params;\n\n this.position.set(position.x, position.y, position.z);\n this.rotation.set(rotation.x, rotation.y, rotation.z);\n this.scale.set(scale.x, scale.y, scale.z);\n\n this.native.castShadow = shadow.cast;\n this.native.receiveShadow = shadow.receive;\n\n this.applyBridge({onWrap: 1});\n\n resolve(this);\n // });\n });\n }\n\n // COPYING & CLONING\n\n /**\n * @method copy\n * @instance\n * @description Copy source transforms & execute `Component.copy()`\n * @return {this} MeshComponent\n * @memberof module:core.MeshComponent\n */\n copy(source) {\n return super.copy(source, () => {\n this.position.copy(source.position);\n this.rotation.copy(source.rotation);\n this.quaternion.copy(source.quaternion);\n });\n }\n\n /**\n * @method clone\n * @instance\n * @description Make a clone of this MeshComponent using `.copy()`\n * @return {MeshComponent} clone of this object\n * @memberof module:core.MeshComponent\n */\n clone(geometry, material) {\n const dest = new this.constructor({build: false}).copy(this);\n\n if (geometry) dest.geometry = dest.geometry.clone();\n if (material) dest.material = dest.material.clone();\n\n return dest;\n }\n}\n\nexport {\n MeshComponent\n};\n","import {Component} from './Component';\n\nimport {attributes, copy} from './prototype/attributes';\nimport {CompositionError} from './errors';\n\n@attributes(\n copy('position', 'rotation', 'quaternion', 'target')\n)\n/**\n * @class LightComponent\n * @category core\n * @param {Object} [params] - The parameters object.\n * @param {Object} [instructions] - The instructions object.\n * @extends module:core.Component\n * @memberof module:core\n */\nclass LightComponent extends Component {\n /**\n * Default values for parameters\n * @member {Object} module:core.LightComponent#defaults\n * @static\n * @default\n * {\n * build: true,\n *\n * shadow: {\n * cast: true,\n *\n * bias: 0,\n * radius: 1,\n *\n * mapSize: {\n * width: 1024,\n * height: 1024\n * },\n *\n * camera: {\n * near: true,\n * far: 400,\n * fov: 90,\n *\n * top: 200,\n * bottom: -200,\n * left: -200,\n * right: 200\n * }\n * },\n *\n * position: {x: 0, y: 0, z: 0},\n * rotation: {x: 0, y: 0, z: 0}\n * }\n */\n static defaults = {\n ...Component.defaults,\n\n build: true,\n\n shadow: {\n cast: true,\n\n bias: 0,\n radius: 1,\n\n mapSize: {\n width: 1024,\n height: 1024\n },\n\n camera: {\n near: true,\n far: 400,\n fov: 90,\n\n top: 200,\n bottom: -200,\n left: -200,\n right: 200\n }\n },\n\n position: {x: 0, y: 0, z: 0},\n rotation: {x: 0, y: 0, z: 0}\n };\n\n /**\n * Static instructions\n * @member {Object} module:core.LightComponent#instructions\n * @static\n * @default\n * {\n * position: ['x', 'y', 'z'],\n * rotation: ['x', 'y', 'z']\n * }\n */\n static instructions = {\n position: ['x', 'y', 'z'],\n rotation: ['x', 'y', 'z']\n };\n\n static from(light, params = {}, wrapShadow = true) {\n params.build = false;\n\n const component = new LightComponent(params);\n\n component.native = light;\n component.wrap();\n if (wrapShadow) component.wrapShadow();\n\n return component;\n }\n\n constructor(params, defaults = LightComponent.defaults, instructions = LightComponent.instructions) {\n super(params, defaults, instructions);\n\n if (this.params.build) {\n const build = this.build(this.params);\n\n if (!build) {\n throw new CompositionError(\n 'LightComponent',\n '.build() method should return a THREE.Object3D or a Promise resolved with THREE.Object3D.',\n this\n );\n }\n\n if (build instanceof Promise) {\n build.then(native => {\n this.native = native;\n });\n } else this.native = build;\n\n this.wait(this.wrap());\n }\n\n this.applyCommand('postIntegrate');\n }\n\n // BUILDING & WRAPPING\n\n /**\n * @method build\n * @instance\n * @description Build livecycle should return a native object.\n * @throws {CompositionError}\n * @memberof module:core.LightComponent\n */\n build() {\n throw new CompositionError(\n 'MeshComponent',\n 'Instance should have it\\'s own .build().',\n this\n );\n }\n\n /**\n * @method wrap\n * @instance\n * @description Wraps transforms (`position` & `rotation`)\n * @return {Promise} Resolved when action is completed\n * @memberof module:core.LightComponent\n */\n wrap() {\n return new Promise(resolve => {\n this.defer(() => {\n const {position, rotation} = this.params;\n\n this.position.set(position.x, position.y, position.z);\n this.rotation.set(rotation.x, rotation.y, rotation.z);\n\n this.applyBridge({onWrap: 1});\n\n resolve(this);\n });\n });\n }\n\n /**\n * @method wrapShadow\n * @instance\n * @description Wraps shadow properties\n * @memberof module:core.LightComponent\n */\n wrapShadow() {\n const {native, params: {shadow}} = this;\n\n native.castShadow = shadow.cast;\n native.shadow.mapSize.width = shadow.mapSize.width;\n native.shadow.mapSize.height = shadow.mapSize.height;\n native.shadow.bias = shadow.bias;\n native.shadow.radius = shadow.radius;\n\n const shadowCamera = native.shadow.camera;\n const {camera} = shadow;\n\n shadowCamera.near = camera.near;\n shadowCamera.far = camera.far;\n shadowCamera.fov = camera.fov;\n\n shadowCamera.left = camera.left;\n shadowCamera.right = camera.right;\n shadowCamera.top = camera.top;\n shadowCamera.bottom = camera.bottom;\n }\n\n // COPYING & CLONING\n\n /**\n * @method copy\n * @instance\n * @description Copy source transforms & execute `Component.copy()`\n * @return {this} LightComponent\n * @memberof module:core.LightComponent\n */\n copy(source) {\n return super.copy(source, () => {\n if (this.target) this.target.copy(source.target());\n\n this.position.copy(source.position);\n this.rotation.copy(source.rotation);\n this.quaternion.copy(source.quaternion);\n });\n }\n\n /**\n * @method clone\n * @instance\n * @description Make a clone of this LightComponent using `.copy()`\n * @return {LightComponent} clone of this object\n * @memberof module:core.LightComponent\n */\n clone() {\n return new this.constructor({build: false}).copy(this);\n }\n}\n\nexport {\n LightComponent\n};\n","import {Component} from './Component';\n\nimport {attributes, copy} from './prototype/attributes';\nimport {CompositionError} from './errors';\n\n@attributes(\n copy('position', 'rotation', 'quaternion', 'target')\n)\n/**\n * @class CameraComponent\n * @category core\n * @param {Object} [params] - The parameters object.\n * @param {Object} [instructions] - The instructions object.\n * @extends module:core.Component\n * @memberof module:core\n */\nclass CameraComponent extends Component {\n /**\n * Default values for parameters\n * @member {Object} module:core.CameraComponent#defaults\n * @static\n * @default\n * {\n * build: true,\n *\n * position: {x: 0, y: 0, z: 0},\n * rotation: {x: 0, y: 0, z: 0}\n * }\n */\n static defaults = {\n ...Component.defaults,\n\n build: true,\n\n position: {x: 0, y: 0, z: 0},\n rotation: {x: 0, y: 0, z: 0}\n };\n\n /**\n * Static instructions\n * @member {Object} module:core.CameraComponent#instructions\n * @static\n * @default\n * {\n * position: ['x', 'y', 'z'],\n * rotation: ['x', 'y', 'z'],\n * scale: ['x', 'y', 'z']\n * }\n */\n static instructions = {\n position: ['x', 'y', 'z'],\n rotation: ['x', 'y', 'z'],\n scale: ['x', 'y', 'z']\n };\n\n static from(camera, params = {}) {\n params.build = false;\n\n const component = new CameraComponent(params);\n\n component.native = camera;\n component.wrap();\n\n return component;\n }\n\n constructor(params, defaults = CameraComponent.defaults, instructions = CameraComponent.instructions) {\n super(params, defaults, instructions);\n\n if (this.params.build) {\n const build = this.build(this.params);\n\n if (!build) {\n throw new CompositionError(\n 'CameraComponent',\n '.build() method should return a THREE.Object3D or a Promise resolved with THREE.Object3D.',\n this\n );\n }\n\n if (build instanceof Promise) {\n build.then(native => {\n this.native = native;\n });\n } else this.native = build;\n\n this.wait(this.wrap());\n }\n\n this.applyCommand('postIntegrate');\n }\n\n // BUILDING & WRAPPING\n\n /**\n * @method build\n * @instance\n * @description Build livecycle should return a native object.\n * @throws {CompositionError}\n * @memberof module:core.CameraComponent\n */\n build() {\n throw new CompositionError(\n 'CameraComponent',\n 'Instance should have it\\'s own .build().',\n this\n );\n }\n\n /**\n * @method wrap\n * @instance\n * @description Wraps transforms (`position` & `rotation`)\n * @return {Promise} Resolved when action is completed\n * @memberof module:core.CameraComponent\n */\n wrap() {\n return new Promise(resolve => {\n this.defer(() => {\n this.position.set(this.params.position.x, this.params.position.y, this.params.position.z);\n this.rotation.set(this.params.rotation.x, this.params.rotation.y, this.params.rotation.z);\n\n this.applyBridge({onWrap: 1});\n\n resolve(this);\n });\n });\n }\n\n /**\n * @method copy\n * @instance\n * @description Copy source transforms & execute `Component.copy()`\n * @return {this} CameraComponent\n * @memberof module:core.CameraComponent\n */\n copy(source) {\n return super.copy(source, () => {\n if (this.target) this.target.copy(source.target());\n\n this.position.copy(source.position);\n this.rotation.copy(source.rotation);\n this.quaternion.copy(source.quaternion);\n });\n }\n\n /**\n * @method clone\n * @instance\n * @description Make a clone of this CameraComponent using `.copy()`\n * @return {CameraComponent} clone of this object\n * @memberof module:core.CameraComponent\n */\n clone() {\n return new this.constructor({build: false}).copy(this);\n }\n}\n\nexport {\n CameraComponent\n};\n","export const system = {\n window: typeof window === 'undefined' ? global : window\n};\n","import {version} from '../../package.json';\nimport {system} from '../polyfill';\nimport {ModuleSystem} from './ModuleSystem';\nimport {ModuleManager} from './ModuleManager';\n\n/**\n * @class App\n * @category core\n * @description This component is used to prepare a world scene, setup physics, camera, renderer and all other things that you usually do before making meshes.\n * @param {Array} [modules=[]] - Array of Modules\n * @extends ModuleSystem\n * @memberof module:core\n */\nclass App extends ModuleSystem {\n /**\n * @description Defines whether the scene should render or not\n * @member {Boolean} module:core.App#enabled\n * @public\n */\n enabled = true;\n\n /**\n * Loops in this app\n * @description Array of loops that are executed by this app.\n * @member {Array} module:core.App#loops\n * @public\n */\n loops = [];\n\n constructor(modules = []) {\n console.log(`WHS.App ${version}`);\n\n super();\n this.manager = new ModuleManager(this);\n this.modules = modules;\n\n this.integrateModules();\n }\n\n // CONTROLS & UPDATING\n\n /**\n * @method start\n * @description Start rendering loop and physics simulation (if you use version with physics).\n * @memberof module:core.App\n */\n start() {\n const requestAnimFrame = (() => {\n return system.window.requestAnimationFrame\n || system.window.webkitRequestAnimationFrame\n || system.window.mozRequestAnimationFrame\n || function (callback) {\n system.window.setTimeout(callback, 1000 / 60);\n };\n })();\n\n const {loops, enabled} = this;\n\n function process() {\n requestAnimFrame(process);\n if (!enabled) return;\n\n for (let i = 0, ll = loops.length; i < ll; i++) {\n const e = loops[i];\n if (e.enabled) e.execute(e.clock);\n }\n }\n\n this.enabled = true;\n process();\n }\n\n /**\n * @method stop\n * @description Stops rendering loops\n * @memberof module:core.App\n */\n stop() {\n this.enabled = false;\n }\n\n /**\n * @method addLoop\n * @description Adds loop to this app.\n * @param {Object} loop - the loop to add\n * @return {Promise} Promise that is resolved when promises completed.\n * @memberof module:core.App\n * @example Adding a loop to an app\n * const loop = new Loop(() => {\n * // ...\n * });\n *\n * const app = new App();\n *\n * app.addLoop(loop);\n * loop.start();\n */\n addLoop(loop) {\n return new Promise(resolve => {\n this.loops.push(loop);\n resolve(loop);\n });\n }\n\n /**\n * @method removeLoop\n * @description Removes loop from this app.\n * @param {Object} loop - the loop to remove\n * @return {Promise} Promise that is resolved when promises completed.\n * @memberof module:core.App\n */\n removeLoop(loop) {\n return new Promise(resolve => {\n const index = this.loops.indexOf(loop);\n if (index !== -1) this.loops.splice(index, 1);\n\n resolve(loop);\n });\n }\n\n get(key) {\n return this.manager.get(key);\n }\n\n use(key) {\n return this.manager.use(key);\n }\n}\n\nexport {\n App\n};\n","import {Clock} from 'three';\n\n/**\n * @class Loop\n * @category core\n * @param {Function} func function to execute on each animation frame\n * @param {Boolean} [useClock=true] passes a Clock to the function when called, if true\n * @memberof module:core\n */\nclass Loop {\n constructor(func, useClock = true) {\n this.func = func;\n this.clock = useClock ? new Clock() : null;\n this.enabled = false;\n }\n\n // CONTROLS\n\n /**\n * @method start\n * @instance\n * @description Starts this loop, clock if it has one. Won't do anything if loop enabled already.\n * @param {Component} [world] app to add this loop to, if provided.\n * @memberof module:core.Loop\n */\n start(world) {\n if (this.enabled) return;\n\n if (world) world.addLoop(this);\n\n if (this.clock) this.clock.start();\n this.enabled = true;\n }\n\n /**\n * @method stop\n * @instance\n * @description Stops this loop and its clock if it has one, won't do anything if this loop is not enabled)\n * @param {Component} [world] app to remove this loop from, if provided.\n * @memberof module:core.Loop\n */\n stop(world) {\n if (!this.enabled) return;\n\n if (this.clock) this.clock.stop();\n this.enabled = false;\n\n if (world) world.removeLoop(this);\n }\n\n // EXECUTION\n\n /**\n * @method execute\n * @instance\n * @description Executes the function of this loop\n * @memberof module:core.Loop\n * @returns {*} whatever the function of this loop returns\n */\n execute() {\n return this.func(this.clock);\n }\n}\n\nexport {\n Loop\n};\n","/** @module core */\nexport * from './Component';\nexport * from './MeshComponent';\nexport * from './LightComponent';\nexport * from './CameraComponent';\nexport * from './App';\nexport * from './Loop';\nexport * from './ModuleManager';\n","import {AmbientLight as AmbientLightNative} from 'three';\nimport {LightComponent} from '../../core/LightComponent';\n\n/**\n * @class AmbientLight\n * @category components/lights\n * @description AmbientLight is a simple class, it extends Light and inherits all its methods.\n * AmbientLight creates basic light around all scene, so it doesn't need properties like pos or target.\n * It supports only color and intensity as parameters, which defines the color of the surrounded light and intensity of light.\n * @param {Object} [params={light: {color: 0xffffff, intensity: 1}}] - The params.\n * @extends module:core.LightComponent\n * @memberof module:components/lights\n * @example Creating an AmbientLight \n * new AmbientLight({\n * color: 0xffffff,\n * intensity: 0.2\n * }).addTo(world);\n */\nclass AmbientLight extends LightComponent {\n static defaults = {\n ...LightComponent.defaults,\n\n color: 0xffffff,\n intensity: 1\n };\n\n constructor(params = {}) {\n super(params, AmbientLight.defaults);\n }\n\n build(params = {}) {\n return this.applyBridge({light: new AmbientLightNative(\n params.color,\n params.intensity\n )}).light;\n }\n}\n\nexport {\n AmbientLight\n};\n","import {DirectionalLight as DirectionalLightNative, DirectionalLightHelper} from 'three';\nimport {LightComponent} from '../../core/LightComponent';\n\n/**\n * @class DirectionalLight\n * @category components/lights\n * @description DirectinalLight creates a light that shines from a specific direction not from a specific position.

    \n * This light will behave as though it is infinitely far away and the rays produced from it are all parallel.

    \n * The best analogy would be a light source that acts like the sun: the sun is so far away that all sunlight hitting objects comes from the same angle.

    \n * It has the same options as AmbientLight in light paramater, but it also supports pos and target paramaters.\n * @param {Object} [params={light: {color: 0xffffff, intensity: 1}}] - The params.\n * @extends module:core.LightComponent\n * @memberof module:components/lights\n * @example Creating a DirectionalLight to fall down from vec3(10, 20, 10) to vec3(0, 0, 0)\n * new DirectionalLight({\n * color: 0xffffff,\n * intensity: 0.2,\n *\n * position: [10, 20, 10]\n * }).addTo(app);\n */\nclass DirectionalLight extends LightComponent {\n static defaults = {\n ...LightComponent.defaults,\n\n color: 0xffffff,\n intensity: 1\n };\n\n constructor(params = {}) {\n super(params, DirectionalLight.defaults);\n this.wrapShadow();\n }\n\n build(params = {}) {\n return this.applyBridge({light: new DirectionalLightNative(\n params.color,\n params.intensity\n )}).light;\n }\n}\n\nexport {\n DirectionalLight\n};\n","import {HemisphereLight as HemisphereLightNative, HemisphereLightHelper} from 'three';\nimport {LightComponent} from '../../core/LightComponent';\n\n/**\n * @class HemisphereLight\n * @category components/lights\n * @description HemisphereLight is a light source positioned directly above the scene.
    \n * It also doesn't need position and target properties.\n * @classDesc\n * \n * @param {Object} [params={light: {skyColor: 0xffffff, groundColor: 0xffffff, intensity: 1}}] - The params.\n * @extends module:core.LightComponent\n * @memberof module:components/lights\n * @example Creating a HemisphereLight\n * new HemisphereLight({\n * skyColor: 0xff0000,\n * groundColor: 0x0000ff,\n * intensity: 0.2\n * }).addTo(app);\n */\nclass HemisphereLight extends LightComponent {\n static defaults = {\n ...LightComponent.defaults,\n\n skyColor: 0xffffff,\n groundColor: 0xffffff,\n intensity: 1\n }\n\n constructor(params = {}) {\n super(params, HemisphereLight.defaults);\n }\n\n build(params = {}) {\n return this.applyBridge({light: new HemisphereLightNative(\n params.skyColor,\n params.groundColor,\n params.intensity\n )}).light;\n }\n}\n\nexport {\n HemisphereLight\n};\n","import {PointLight as PointLightNative, PointLightHelper} from 'three';\nimport {LightComponent} from '../../core/LightComponent';\n\n/**\n * @class PointLight\n * @category components/lights\n * @description PointLight creates a light at a specific position in the scene. The light shines in all directions (roughly similar to a light bulb.)

    \n * It has the same options as AmbientLight in light paramater, but it also supports position, distance and decay.
    \n * @param {Object} [params={light: {color: 0xffffff, intensity: 1, distance: 100, decay: 1}}] - The params.\n * @extends LightComponent\n * @memberof module:components/lights\n * @example Creating a PointLight\n * new PointLight( {\n * color: 0xff0000,\n * intensity: 2,\n * distance: 300\n *\n * position: [10, 20, 10]\n * }).addTo(app);\n */\nclass PointLight extends LightComponent {\n static defaults= {\n ...LightComponent.defaults,\n\n color: 0xffffff,\n intensity: 1,\n distance: 100,\n decay: 1\n }\n\n constructor(params = {}) {\n super(params, PointLight.defaults);\n this.wrapShadow();\n }\n\n build(params = {}) {\n return this.applyBridge({light: new PointLightNative(\n params.color,\n params.intensity,\n params.distance,\n params.decay\n )}).light;\n }\n}\n\nexport {\n PointLight\n};\n","import {SpotLight as SpotLightNative} from 'three';\nimport {LightComponent} from '../../core/LightComponent';\n\n/**\n * @class SpotLight\n * @category components/lights\n * @description SpotLight creates spot light that can cast shadow in one direction.

    \n * It has the same parameters as AmbientLight in light, but it also supports pos and target.

    \n * SpotLight affects meshes with lambert and phong material.\n * @classDesc\n * \n * @param {Object} [params={light: {color: 0xffffff, intensity: 1, distance: 100, angle: Math.PI / 3, exponent: 0, decay: 1}}] - The params.\n * @extends module:core.LightComponent\n * @memberof module:components/lights\n * @example Creating a SpotLight that falls down from vec3(10, 20, 10) to vec3(0, 0, 0)\n * new SpotLight({\n * color: 0x00ff00,\n * intensity: 3,\n * distance: 1000\n *\n * position: [10, 20, 10]\n * }).addTo(app);\n */\nclass SpotLight extends LightComponent {\n static defaults = {\n ...LightComponent.defaults,\n\n color: 0xffffff,\n intensity: 1,\n distance: 100,\n angle: Math.PI / 3,\n exponent: 0,\n decay: 1\n };\n\n constructor(params = {}) {\n super(params, SpotLight.defaults);\n this.wrapShadow();\n }\n\n build(params = {}) {\n return this.applyBridge({light: new SpotLightNative(\n params.color,\n params.intensity,\n params.distance,\n params.angle,\n params.exponent,\n params.decay\n )}).light;\n }\n}\n\nexport {\n SpotLight\n};\n","import {RectAreaLight as RectAreaLightNative} from 'three';\nimport {LightComponent} from '../../core/LightComponent';\n\nclass AreaLight extends LightComponent {\n static defaults = {\n ...LightComponent.defaults,\n\n color: 0xffffff,\n intensity: 1,\n width: 10,\n height: 10\n };\n\n constructor(params = {}) {\n super(params, AreaLight.defaults);\n }\n\n build(params = {}) {\n return this.applyBridge({light: new RectAreaLightNative(\n params.color,\n params.intensity,\n params.width,\n params.height\n )}).light;\n }\n}\n\nexport {\n AreaLight\n};\n","/** @module components/lights */\nexport * from './AmbientLight';\nexport * from './DirectionalLight';\nexport * from './HemisphereLight';\nexport * from './PointLight';\nexport * from './SpotLight';\nexport * from './AreaLight';\n","import {CubeCamera as CubeCameraNative} from 'three';\nimport {CameraComponent} from '../../core/CameraComponent';\n\n/**\n * @class CubeCamera\n * @category components/cameras\n * @description Creates 6 cameras that render to a WebGLRenderTargetCube\n * @param {Object} [params] - The parameters object.\n * @memberof module:components/cameras\n * @extends module:core.CameraComponent\n * @example Creates a CubeCamera and set it as app's camera\n * const camera = new CubeCamera({\n * camera: {\n * cubeResolution: 256\n * },\n *\n * position: {\n * x: 0,\n * y: 100,\n * z: 0\n * }\n * });\n *\n * app.camera = camera;\n */\nclass CubeCamera extends CameraComponent {\n\n /**\n * Default values for parameters\n * @member {Object} module:components/cameras.CubeCamera#defaults\n * @static\n * @default
    \n   * {\n   *   camera: {\n   *     near: 1,\n   *     far: 1000,\n   *     cubeResolution: 128\n   *   }\n   * }
    \n */\n static defaults = {\n ...CameraComponent.defaults,\n\n near: 1,\n far: 1000,\n cubeResolution: 128\n };\n\n constructor(params = {}) {\n super(params, CubeCamera.defaults);\n }\n\n build(params = {}) {\n return this.applyBridge({camera: new CubeCameraNative(\n params.near,\n params.far,\n params.cubeResolution\n )}).camera;\n }\n}\n\nexport {\n CubeCamera\n};\n","import {OrthographicCamera as OrthographicCameraNative} from 'three';\nimport {CameraComponent} from '../../core/CameraComponent';\nimport {system} from '../../polyfill';\n\n/**\n * @class OrthographicCamera\n * @category components/cameras\n * @description Camera with orthographic projection.\n * @param {Object} [params] - The parameters object.\n * @memberof module:components/cameras\n * @extends module:core.CameraComponent\n * @example Create an OrthographicCamera and set it as app's camera\n * const camera = new OrthographicCamera({\n * camera: {\n * far: 10000\n * },\n *\n * position: {\n * y: 50\n * }\n * });\n *\n * app.camera = camera;\n */\nclass OrthographicCamera extends CameraComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/cameras.OrthographicCamera#defaults\n * @static\n * @default
    \n   * {\n   *   near: 1,\n   *   far: 1000,\n   *   left: system.window.innerWidth / -2,\n   *   right: system.window.innerWidth / 2,\n   *   top: system.window.innerHeight / 2,\n   *   bottom: system.window.innerHeight / -2\n   * }
    \n */\n static defaults = {\n ...CameraComponent.defaults,\n\n near: 1,\n far: 1000,\n left: system.window.innerWidth / -2,\n right: system.window.innerWidth / 2,\n top: system.window.innerHeight / 2,\n bottom: system.window.innerHeight / -2\n };\n\n constructor(params = {}) {\n super(params, OrthographicCamera.defaults);\n }\n\n build(params = {}) {\n return this.applyBridge({camera: new OrthographicCameraNative(\n params.left,\n params.right,\n params.top,\n params.bottom,\n params.near,\n params.far\n )}).camera;\n }\n}\n\nexport {\n OrthographicCamera\n};\n","import {PerspectiveCamera as PerspectiveCameraNative} from 'three';\nimport {CameraComponent} from '../../core/CameraComponent';\nimport {system} from '../../polyfill';\n\n/**\n * @class PerspectiveCamera\n * @description Camera with perspective projection.\n * @category components/cameras\n * @param {Object} [params] - The parameters object.\n * @memberof module:components/cameras\n * @extends module:core.CameraComponent\n * @example Create an PerspectiveCamera and set it as app's camera\n * const camera = new PerspectiveCamera({\n * fov: 75,\n * aspect: window.innerWidth / window.innerHeight,\n *\n * position: {\n * x: 0,\n * y: 100,\n * z: 0\n * }\n * });\n *\n * app.camera = camera;\n */\nclass PerspectiveCamera extends CameraComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/cameras.PerspectiveCamera#defaults\n * @static\n * @default
    \n   * {\n   *   near: 1,\n   *   far: 1000,\n   *   fov: 75,\n   *   aspect: system.window.innerWidth / system.window.innerHeight\n   * }
    \n */\n static defaults = {\n ...CameraComponent.defaults,\n\n near: 1,\n far: 1000,\n fov: 75,\n aspect: system.window.innerWidth / system.window.innerHeight\n };\n\n constructor(params = {}) {\n super(params, PerspectiveCamera.defaults);\n }\n\n build(params = {}) {\n return this.applyBridge({camera: new PerspectiveCameraNative(\n params.fov,\n params.aspect,\n params.near,\n params.far\n )}).camera;\n }\n}\n\nexport {\n PerspectiveCamera\n};\n","/** @module components/cameras */\nexport * from './CubeCamera';\nexport * from './OrthographicCamera';\nexport * from './PerspectiveCamera';\n","import {\n Mesh,\n BoxBufferGeometry,\n BoxGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Box\n * @category components/meshes\n * @description As told on Component definition, while you can pass any of the inherited params for this component construction, you will need to\n * pass specific parameters to build this mesh as a geometry object.\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Box, and adding to app\n * new Box({\n * geometry: {\n * width: 2,\n * height: 2,\n * depth: 2\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * position: [50, 60, 70]\n * }).addTo(app);\n */\nclass Box extends MeshComponent {\n\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Box#defaults\n * @static\n * @default
    \n   * {\n   *   geometry: {\n   *     width: 1,\n   *     height: 1,\n   *     depth: 1,\n   *     widthSegments: 1,\n   *     heightSegments: 1,\n   *     depthSegments: 1\n   *   }\n   * }
    \n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n width: 1,\n height: 1,\n depth: 1,\n widthSegments: 1,\n heightSegments: 1,\n depthSegments: 1\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Box#instructions\n * @static\n * @default geometry: ['width', 'height', 'depth', 'widthSegments', 'heightSegments', 'depthSegements']\n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: ['width', 'height', 'depth', 'widthSegments', 'heightSegments', 'depthSegements']\n };\n\n constructor(params = {}) {\n super(params, Box.defaults, Box.instructions);\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Box\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n const geometry = new (params.buffer ? BoxBufferGeometry : BoxGeometry)(\n params.geometry.width,\n params.geometry.height,\n params.geometry.depth,\n params.geometry.widthSegments,\n params.geometry.heightSegments,\n params.geometry.depthSegments\n );\n\n return geometry;\n }\n}\n\nexport {\n Box\n};\n","import {\n Mesh,\n CircleBufferGeometry,\n CircleGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Circle\n * @category components/meshes\n * @description As told on Component definition, while you can pass any of the inherited params for this component construction, you will need to\n * pass specific parameters to build this mesh as a geometry object.\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Circle, and adding to app\n * new Circle({\n * geometry: {\n * radius: 4,\n * segments: 16\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * position: [50, 60, 70]\n * }).addTo(app);\n */\nclass Circle extends MeshComponent {\n\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Circle#defaults\n * @static\n * @default
    \n   * {\n   *   geometry: {\n   *     radius: 50,\n   *     segments: 8,\n   *     thetaStart: 0,\n   *     thetaLength: Math.PI * 2\n   *   }\n   * }
    \n */\n static defaults = {\n ...MeshComponent.defaults,\n\n geometry: {\n radius: 50,\n segments: 8,\n thetaStart: 0,\n thetaLength: Math.PI * 2\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Circle#instructions\n * @static\n * @default geometry: ['radius', 'segments', 'thetaStart', 'thetaLength']\n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: ['radius', 'segments', 'thetaStart', 'thetaLength']\n };\n\n constructor(params = {}) {\n super(params, Circle.defaults, Circle.instructions);\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Circle\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n const geometry = new (params.buffer ? CircleBufferGeometry : CircleGeometry)(\n params.geometry.radius,\n params.geometry.segments,\n params.geometry.thetaStart,\n params.geometry.thetaLength\n );\n\n return geometry;\n }\n}\n\nexport {\n Circle\n};\n","import {\n Mesh,\n ConeBufferGeometry,\n ConeGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Cone\n * @category components/meshes\n * @description A cylinder is one of the most basic curvilinear geometric shapes, the surface formed by the points at a fixed distance from a given straight line, the axis of the cylinder.

    \n * The solid enclosed by this surface and by two planes perpendicular to the axis is also called a cylinder.
    \n * The surface area and the volume of a cylinder have been known since deep antiquity.\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Cone, and adding to app\n * new Cone({\n * geometry: {\n * radiusTop: 2,\n * radiusBottom: 4,\n * height: 5\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * pos: [0, 100, 0]\n * }).addTo(app);\n */\nclass Cone extends MeshComponent {\n\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Cone#defaults\n * @static\n * @default
    \n   * {\n   *   geometry: {\n   *     radius: 20,\n   *     height: 100,\n   *     radiusSegments: 32,\n   *     heightSegments: 1,\n   *     openEnded: false,\n   *     thetaStart: 0,\n   *     thetaLength: Math.PI * 2\n   *   }\n   * }
    \n */\n static defaults = {\n ...MeshComponent.defaults,\n\n geometry: {\n radius: 20,\n height: 100,\n radiusSegments: 32,\n heightSegments: 1,\n openEnded: false,\n thetaStart: 0,\n thetaLength: Math.PI * 2\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Cone#instructions\n * @static\n * @default
    \n   * geometry: [\n   *   'radius',\n   *   'height',\n   *   'radiusSegments',\n   *   'heightSegments',\n   *   'openEnded',\n   *   'thetaStart',\n   *   'thetaLength'\n   * ]\n   * 
    \n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: [\n 'radius',\n 'height',\n 'radiusSegments',\n 'heightSegments',\n 'openEnded',\n 'thetaStart',\n 'thetaLength'\n ]\n };\n\n constructor(params = {}) {\n super(params, Cone.defaults, Cone.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Cone\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n const geometry = new (params.buffer ? ConeBufferGeometry : ConeGeometry)(\n params.geometry.radius,\n params.geometry.height,\n params.geometry.radiusSegments,\n params.geometry.heightSegments,\n params.geometry.openEnded,\n params.geometry.thetaStart,\n params.geometry.thetaLength\n );\n\n return geometry;\n }\n}\n\nexport {\n Cone\n};\n","import {\n Mesh,\n CylinderBufferGeometry,\n CylinderGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Cylinder\n * @category components/meshes\n * @description A cylinder is one of the most basic curvilinear geometric shapes, the surface formed by the points at a fixed distance from a given straight line, the axis of the cylinder.

    \n * The solid enclosed by this surface and by two planes perpendicular to the axis is also called a cylinder.
    \n * The surface area and the volume of a cylinder have been known since deep antiquity.\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Cylinder, and adding to app\n * new Cylinder({\n * geometry: {\n * radiusTop: 2,\n * radiusBottom: 4,\n * height: 5\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * pos: [0, 100, 0]\n * }).addTo(app);\n */\nclass Cylinder extends MeshComponent {\n\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Cylinder#defaults\n * @static\n * @default
    \n   * {\n   *   geometry: {\n   *     radiusTop: 20,\n   *     radiusBottom: 20,\n   *     height: 100,\n   *     radiusSegments: 32,\n   *     heightSegments: 1,\n   *     openEnded: false,\n   *     thetaStart: 0,\n   *     thetaLength: Math.PI * 2\n   *   }\n   * }
    \n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n radiusTop: 0,\n radiusBottom: 1,\n height: 1,\n radiusSegments: 32,\n heightSegments: 1,\n openEnded: false,\n thetaStart: 0,\n thetaLength: Math.PI * 2\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Cylinder#instructions\n * @static\n * @default
    \n   * geometry: [\n   *   'radiusTop',\n   *   'radiusBottom',\n   *   'height',\n   *   'radiusSegments',\n   *   'heightSegments',\n   *   'openEnded',\n   *   'thetaStart',\n   *   'thetaLength'\n   * ]\n   * 
    \n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: [\n 'radiusTop',\n 'radiusBottom',\n 'height',\n 'radiusSegments',\n 'heightSegments',\n 'openEnded',\n 'thetaStart',\n 'thetaLength'\n ]\n };\n\n constructor(params = {}) {\n super(params, Cylinder.defaults, Cylinder.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Cylinder\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n const geometry = new (params.buffer ? CylinderBufferGeometry : CylinderGeometry)(\n params.geometry.radiusTop,\n params.geometry.radiusBottom,\n params.geometry.height,\n params.geometry.radiusSegments,\n params.geometry.heightSegments,\n params.geometry.openEnded,\n params.geometry.thetaStart,\n params.geometry.thetaLength\n );\n\n return geometry;\n }\n}\n\nexport {\n Cylinder\n};\n","import {\n Mesh,\n DodecahedronBufferGeometry,\n DodecahedronGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Dodecahedron\n * @category components/meshes\n * @description In geometry, a dodecahedron is any polyhedron with twelve flat faces.

    \n * The most familiar dodecahedron is the regular dodecahedron, which is a Platonic solid.
    \n * There are also three regular star dodecahedra, which are constructed as stellations of the convex form.
    \n * All of these have icosahedral symmetry, order 120.\n * Dodecahedron creates Dodecahedron object by it's radius and detail.\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Dodecahedron, and adding to app\n * new Dodecahedron({\n * geometry: {\n * radius: 2\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * position: {\n * y: 10\n * }\n * }).addTo(app);\n */\nclass Dodecahedron extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Dodecahedron#defaults\n * @static\n * @default
    \n   * geometry: {\n   *   radius: 1,\n   *   detail: 0\n   * }\n   * 
    \n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n radius: 1,\n detail: 0\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Dodecahedron#instructions\n * @static\n * @default
    \n   * geometry: ['radius', 'detail']\n   * 
    \n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: ['radius', 'detail']\n };\n\n constructor(params = {}) {\n super(params, Dodecahedron.defaults, Dodecahedron.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Dodecahedron\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n return new (params.buffer ? DodecahedronBufferGeometry : DodecahedronGeometry)(\n params.geometry.radius,\n params.geometry.detail\n );\n }\n}\n\nexport {\n Dodecahedron\n};\n","import {\n Mesh,\n BufferGeometry,\n ExtrudeGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Extrude\n * @category components/meshes\n * @description Extrude geometry means that you can create a 3D mesh from any 2D shape using three.js geometry based on THREE.Vector2.
    \n * Such implementation will help you to make volumed shapes that have their own depth and can be seen from all angels.

    \n * You can also find some interesting examples made using three.js which is a core of whs.js, such as:\n * - Webgl geometry extrude\n * - Extrude shapes from geodata\n * - Extrude splines\n *\n * Such examples can be easily implemented using whitestorm.js or it's plugins. Use `Extrude` class with THREE.Shape to get extrude effect of shape defined by 2D vectors.\n * This class is similar to THREE.ExtrudeGeometry,\n * but it also contains all properties, applied by `Shape`, such as material, mass and vectors like position (pos) and rotation (rot).\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a shape, then an Extrude from it\n * const shape = new THREE.Shape([\n * new THREE.Vector2(-4,-4),\n * new THREE.Vector2(-2,0),\n * new THREE.Vector2(-4,4),\n * new THREE.Vector2(0,2),\n * new THREE.Vector2(4,4),\n * new THREE.Vector2(2,0),\n * new THREE.Vector2(4,-4),\n * new THREE.Vector2(0,-2)\n * ]);\n *\n * const extrude = new Extrude({\n * geometry: {\n * shapes: shape,\n * options: {\n * bevelEnabled: false,\n * bevelSize: 0,\n * amount: 2\n * }\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * position: [0, 100, 0]\n * });\n *\n * extrude.addTo(app);\n */\nclass Extrude extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Extrude#defaults\n * @static\n * @default
    \n   * {\n   *   geometry: {\n   *     shapes: [],\n   *     options: {}\n   *   }\n   * }\n   * 
    \n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n shapes: [],\n options: {}\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Extrude#instructions\n * @static\n * @default
    \n   * {\n   *   geometry: ['shapes', 'options']\n   * }\n   * 
    \n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: ['shapes', 'options']\n };\n\n constructor(params = {}) {\n super(params, Extrude.defaults, Extrude.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Extrude\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n const geometry = new ExtrudeGeometry(\n params.geometry.shapes,\n params.geometry.options\n );\n\n return params.buffer ? new BufferGeometry().fromGeometry(geometry) : geometry;\n }\n}\n\nexport {\n Extrude\n};\n","import {\n Mesh,\n IcosahedronBufferGeometry,\n IcosahedronGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Icosahedron\n * @category components/meshes\n * @description In geometry, an icosahedron is a polyhedron with 20 faces.
    \n * There are many kinds of icosahedra, with some being more symmetrical than others. The most well known is the Platonic, convex regular icosahedron.
    \n * `Icosahedron` creates an Icosahedron object by its radius and detail.\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Icosahedron, and adding to app\n * new Icosahedron({\n * geometry: {\n * radius: 2,\n * detail: 1\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * position: [0, 100, 0]\n * }).addTo(app);\n */\nclass Icosahedron extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Icosahedron#defaults\n * @static\n * @default
    \n   * {\n   *   geometry: {\n   *     radius: 1,\n   *     detail: 0\n   *   }\n   * }
    \n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n radius: 1,\n detail: 0\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Icosahedron#instructions\n * @static\n * @default {geometry: ['radius', 'detail']}\n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: ['radius', 'detail']\n };\n\n constructor(params = {}) {\n super(params, Icosahedron.defaults, Icosahedron.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Icosahedron\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n return new (params.buffer ? IcosahedronBufferGeometry : IcosahedronGeometry)(\n params.geometry.radius,\n params.geometry.detail\n );\n }\n}\n\nexport {\n Icosahedron\n};\n","import {\n Mesh,\n LatheBufferGeometry,\n LatheGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Lathe\n * @category components/meshes\n * @description A `LatheGeometry` allows you to create shapes from a smooth curve.\n * This curve is defined by a number of points (also called knots) and is most often called a spline. This spline is rotated around a fixed point and results in vase- and bell-like shapes.

    \n * In 3D computer graphics, a lathed object is a 3D model whose vertex geometry is produced by rotating the points of a spline or other point set around a fixed axis.\n * The lathing may be partial; the amount of rotation is not necessarily a full 360 degrees.\n * The point set providing the initial source data can be thought of as a cross section through the object along a plane containing its axis of radial symmetry.

    \n * The following example shows a geometry which can be generated using `Lathe` class.\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Lath, and adding to app\n * const points = [];\n *\n * for (let i = 0; i < 10; i++) {\n * points.push(\n * new THREE.Vector2(\n * (Math.sin(i * 0.7) * 15 + 50) / 10,\n * (i - 5) * 0.2\n * )\n * );\n * }\n *\n * const lathe = new Lathe({\n * geometry: {\n * points: points\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * position: [0, 50, 10]\n * }).addTo(app);\n */\nclass Lathe extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Lathe#defaults\n * @static\n * @default
    \n   * {\n   *   geometry: {\n   *     points: []\n   *   }\n   * }\n   * 
    \n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n points: []\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Lathe#instructions\n * @static\n * @default
    {\n   *   geometry: ['points']\n   * }\n   * 
    \n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: ['points']\n };\n\n constructor(params = {}) {\n super(params, Lathe.defaults, Lathe.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Lathe\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n return new (params.buffer ? LatheBufferGeometry : LatheGeometry)(\n params.geometry.points\n );\n }\n}\n\nexport {\n Lathe\n};\n","import {\n Line as LineNative,\n BufferGeometry,\n Geometry,\n BufferAttribute,\n LineCurve3,\n Vector3\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Line\n * @category components/meshes\n * @description Line component is generated from a curve/line and amount of vectors that should be used (points).\n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Line, and adding to app\n * new Line({\n * geometry: {\n * curve: new THREE.LineCurve3(new THREE.Vector3(10, 10, 0), new THREE.Vector3(10, 30, 0))\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * })\n * }).addTo(app);\n */\nclass Line extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Line#defaults\n * @static\n * @default
    \n   * {\n   *   curve: new LineCurve3(new Vector3(0, 0, 0), new Vector3(10, 0, 0)),\n   *   points: 50\n   * }\n   * 
    \n */\n static defaults = {\n ...MeshComponent.defaults,\n\n curve: null,\n points: 50\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Line#instructions\n * @static\n * @default
    {\n   *   geometry: ['curve', 'points']\n   * }\n   * 
    \n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: ['curve', 'points']\n };\n\n constructor(params) {\n super(params, Line.defaults, Line.instructions);\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Line\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new LineNative(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n const geometry = params.buffer ? new BufferGeometry() : new Geometry();\n\n if (params.buffer) {\n const pp = params.curve.getPoints(params.points);\n const verts = new Float32Array(pp.length * 3);\n\n for (let i = 0, max = pp.length; i < max; i++) {\n const i3 = i * 3;\n\n verts[i3] = pp[i].x;\n verts[i3 + 1] = pp[i].y;\n verts[i3 + 2] = pp[i].z;\n }\n\n geometry.addAttribute('position', new BufferAttribute(verts, 3));\n } else geometry.vertices = params.curve.getPoints(params.points);\n\n return geometry;\n }\n}\n\nexport {\n Line\n};\n","import {\n Mesh,\n JSONLoader,\n SkinnedMesh\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Importer\n * @category components/meshes\n * @description Importer is a loader for meshes and any other data to your scene\n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Importer, and adding to app\n * new Importer({\n * loader: new THREE.OBJLoader(),\n *\n * parser(geometry, material) { // data from loader\n * return new THREE.Mesh(geometry, material); // should return your .native (mesh in this case)\n * },\n *\n * position: [0, 100, 0]\n * }).addTo(app);\n */\nclass Importer extends MeshComponent {\n\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Importer#defaults\n * @static\n * @default
    \n   * {\n   *   url: '',\n   *   loader: new JSONLoader(),\n   *\n   *   onLoad() {},\n   *   onProgress() {},\n   *   onError() {},\n   *\n   *   texturePath: null,\n   *   useCustomMaterial: false,\n   *\n   *   parser(geometry, materials) {\n   *     return new Mesh(geometry, materials);\n   *   }\n   * }
    \n */\n static defaults = {\n ...MeshComponent.defaults,\n\n url: '',\n loader: new JSONLoader(),\n\n onLoad() {},\n onProgress() {},\n // TODO add onComplete?\n onError() {},\n\n texturePath: null,\n useCustomMaterial: false,\n\n parser(geometry, material) {\n const {geometry: geom, material: mat} = this.applyBridge({geometry, material});\n\n return this.applyBridge({\n mesh: geom.bones ? new SkinnedMesh(geom, mat) : new Mesh(geom, mat)\n }).mesh;\n }\n };\n\n static instructions = {\n ...MeshComponent.instructions\n };\n\n /**\n * @method filter\n * @description Default values for filter\n * @static\n * @param {THREE.Mesh} object Instance for iterating through it's children.\n * @param {Function} filter Function with child as argument, should return a boolean whether include the child or not.\n * @return {THREE.Mesh} object with children\n * @memberof module:components/meshes.Importer\n * @example Removing unnecessary lights from children\n * new Importer({\n * loader: new THREE.OBJLoader(),\n *\n * parse(group) { // data from loader\n * return Importer.filter(group, child => !child.isLight); // remove lights\n * },\n *\n * position: [0, 100, 0]\n * }).addTo(app);\n */\n static filter(object, filter) {\n const processFilter = object => {\n object.children.forEach((el, index) => {\n if (el.children) processFilter(el);\n if (!filter(el)) object.children.splice(index, 1);\n });\n\n return object;\n };\n\n return processFilter(object);\n }\n\n constructor(params = {}) {\n super(params, Importer.defaults, Importer.instructions, false);\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Importer\n */\n build(params = {}) {\n return new Promise(resolve => {\n if (params.texturePath) params.loader.setTexturePath(params.texturePath);\n\n params.loader.load(params.url, (...data) => { // geometry, materials\n params.onLoad(...data);\n\n const object = params.parser.apply(this, data);\n if (params.material) object.material = this.applyBridge({material: params.material}).material;\n\n resolve(object);\n }, params.onProgress, params.onError);\n });\n }\n}\n\nexport {\n Importer\n};\n","import {\n Mesh,\n OctahedronBufferGeometry,\n OctahedronGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Octahedron\n * @category components/meshes\n * @description In geometry, an octahedron is a polyhedron with eight faces.\n * A regular octahedron is a Platonic solid composed of eight equilateral triangles, four of which meet at each vertex.\n *

    \n * `Octahedron` creates an Octahedron object by its `radius` and `detail`.\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating an Octahedron, and adding to app\n * new Octahedron({\n * geometry: {\n * radius: 2,\n * detail: 1\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * position: [0, 100, 0]\n * }).addTo(app);\n */\nclass Octahedron extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Octahedron#defaults\n * @static\n * @default
    \n   * {\n   *   geometry: {\n   *     radius: 1,\n   *     detail: 0\n   *   }\n   * }\n   * 
    \n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n radius: 1,\n detail: 0\n }\n }\n\n constructor(params = {}) {\n super(params, Octahedron.defaults, Octahedron.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Octahedron\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n return new (params.buffer ? OctahedronBufferGeometry : OctahedronGeometry)(\n params.geometry.radius,\n params.geometry.detail\n );\n }\n}\n\nexport {\n Octahedron\n};\n","import {\n Mesh,\n ParametricBufferGeometry,\n ParametricGeometry,\n Vector3\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Parametric\n * @category components/meshes\n * @description `Parametric` generates a geometry representing a Parametric surface\n *

    \n * It is usually used to develop different kinds of highfields or visualize a math function.\n *
    \n * - Parametric surface\n * - \"Graphulus\"\n *

    \n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Example creating an heightfield-like geometry. `u` and `v` are like `x` and `y` in shape, but their values are always from `0` to `1`.\n * We use them in `THREE.Vector3` like `x` and `z` and `Math.random() * 5` for `y`.\n * const createParametric = (u, v) => {\n * return new THREE.Vector3(u * 30, Math.random() * 5, v * 30);\n * }\n *\n * new Parametric({\n * geometry: {\n * func: createParametric\n * },\n *\n * material: new THREE.MeshLambertMaterial({\n * color: 0xffffff,\n * side: THREE.DoubleSide\n * }),\n *\n * position: [0, 100, -100]\n * }).addTo(app);\n */\nclass Parametric extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Parametric#defaults\n * @static\n * @default
    \n   * {\n   *   geometry: {\n   *     func: (u, v) => new Vector3(u, v, 0),\n   *     slices: 10,\n   *     tacks: 10\n   *   }\n   * }\n   * 
    \n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n func: (u, v) => new Vector3(u, v, 0),\n slices: 10,\n stacks: 10\n }\n }\n\n constructor(params = {}) {\n super(params, Parametric.defaults, Parametric.instructions);\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Parametric\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n return new (params.buffer ? ParametricBufferGeometry : ParametricGeometry)(\n params.geometry.func,\n params.geometry.slices,\n params.geometry.stacks\n );\n }\n}\n\nexport {\n Parametric\n};\n","import {\n Mesh,\n PlaneBufferGeometry,\n PlaneGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Plane\n * @category components/meshes\n * @description `Plane` is used for creating planes given some `width` and `height`.\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Plane, and adding to app\n * new Plane({\n * geometry: {\n * width: 20,\n * height: 30\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * })\n * }).addTo(app);\n */\nclass Plane extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Plane#defaults\n * @static\n * @default
    \n   * {\n   *   geometry: {\n   *     width: 10,\n   *     height: 10,\n   *     wSegments: 1,\n   *     hSegments: 1\n   *   }\n   * }\n   * 
    \n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n width: 10,\n height: 10,\n wSegments: 1,\n hSegments: 1\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Plane#instructions\n * @static\n * @default
    \n   * {\n   *   geometry: ['width', 'height', 'wSegments', 'hSegments']\n   * }\n   * 
    \n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: ['width', 'height', 'wSegments', 'hSegments']\n };\n\n constructor(params = {}) {\n super(params, Plane.defaults, Plane.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Plane\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n const geometry = new (params.buffer ? PlaneBufferGeometry : PlaneGeometry)(\n params.geometry.width,\n params.geometry.height,\n params.geometry.wSegments,\n params.geometry.hSegments\n );\n\n return geometry;\n }\n}\n\nexport {\n Plane\n};\n","import {\n Mesh,\n PolyhedronBufferGeometry,\n PolyhedronGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\nconst [verticesOfCube, indicesOfFaces] = [\n [\n -1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1,\n -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1\n ],\n [\n 2, 1, 0, 0, 3, 2,\n 0, 4, 7, 7, 3, 0,\n 0, 1, 5, 5, 4, 0,\n 1, 2, 6, 6, 5, 1,\n 2, 3, 7, 7, 6, 2,\n 4, 5, 6, 6, 7, 4\n ]\n];\n\n/**\n * @class Polyhedron\n * @category components/meshes\n * @description In elementary geometry, a polyhedron is a solid in three dimensions with flat polygonal faces, straight edges and sharp corners or vertices.\n *

    \n * `Polyhedron` creates a Polyhedron by its `radius` and `detail`.\n *

    \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating an Polyhedron, and adding to app\n * new Polyhedron({\n * geometry: {\n * radius: 2,\n * detail: 1\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * position: [0, 100, 0]\n * }).addTo(app);\n */\nclass Polyhedron extends MeshComponent {\n static verticesOfCube = verticesOfCube;\n static indicesOfFaces = indicesOfFaces;\n\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Polyhedron#defaults\n * @static\n * @default
    \n   * {\n   *   geometry: {\n   *     verticesOfCube: [\n   *       -1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1,\n   *       -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1\n   *     ],\n   *\n   *     indicesOfFaces: [\n   *       2, 1, 0, 0, 3, 2,\n   *       0, 4, 7, 7, 3, 0,\n   *       0, 1, 5, 5, 4, 0,\n   *       1, 2, 6, 6, 5, 1,\n   *       2, 3, 7, 7, 6, 2,\n   *       4, 5, 6, 6, 7, 4\n   *     ],\n   *\n   *     radius: 6,\n   *     detail: 2\n   *   }\n   * }\n   * 
    \n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n verticesOfCube,\n indicesOfFaces,\n radius: 6,\n detail: 2\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Polyhedron#instructions\n * @static\n * @default
    \n   * {\n   *   geometry: ['verticesOfCube', 'indicesOfFaces', 'radius', 'detail']\n   * }\n   * 
    \n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: ['verticesOfCube', 'indicesOfFaces', 'radius', 'detail']\n };\n\n constructor(params = {}) {\n super(params, Polyhedron.defaults, Polyhedron.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Polyhedron\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n return new (params.buffer ? PolyhedronBufferGeometry : PolyhedronGeometry)(\n params.geometry.verticesOfCube,\n params.geometry.indicesOfFaces,\n params.geometry.radius,\n params.geometry.detail\n );\n }\n}\n\nexport {\n Polyhedron\n};\n","import {\n Mesh,\n RingGeometry,\n RingBufferGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Ring\n * @category components/meshes\n * @description Ring class creates a circle or just 2D Torus. Does not support physics.\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Ring, and adding to app\n * new Ring({\n * geometry: {\n * innerRadius: 5,\n * outerRadius: 2\n * },\n *\n * material: new THREE.MeshLambertMaterial({\n * color: 0xffffff,\n * side THREE.DoubleSide\n * }),\n *\n * position: [0, 8, 0],\n *\n * rotation: {\n * x: Math.PI/4\n * }\n * }).addTo(app);\n */\nclass Ring extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Ring#defaults\n * @static\n * @default
    \n   * {\n   *   geometry: {\n   *     innerRadius: 0,\n   *     outerRadius: 50,\n   *     thetaSegments: 8,\n   *     phiSegments: 8,\n   *     thetaStart: 0,\n   *     thetaLength: Math.PI * 2\n   *   }\n   * }\n   * 
    \n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n innerRadius: 0,\n outerRadius: 50,\n thetaSegments: 8,\n phiSegments: 8,\n thetaStart: 0,\n thetaLength: Math.PI * 2\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Ring#instructions\n * @static\n * @default
    \n   * {\n   *   geometry: [\n   *     'innerRadius',\n   *     'outerRadius',\n   *     'thetaSegments',\n   *     'phiSegments',\n   *     'thetaStart',\n   *     'thetaLength'\n   *   ]\n   * }\n   * 
    \n */\n static instructions = {\n ...MeshComponent.defaults,\n geometry: [\n 'innerRadius',\n 'outerRadius',\n 'thetaSegments',\n 'phiSegments',\n 'thetaStart',\n 'thetaLength'\n ]\n };\n\n constructor(params = {}) {\n super(params, Ring.defaults, Ring.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Ring\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n return new (params.buffer ? RingBufferGeometry : RingGeometry)(\n params.geometry.innerRadius,\n params.geometry.outerRadius,\n params.geometry.thetaSegments,\n params.geometry.phiSegments,\n params.geometry.thetaStart,\n params.geometry.thetaLength\n );\n }\n}\n\nexport {\n Ring\n};\n","import {\n Mesh,\n ShapeBufferGeometry,\n ShapeGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Shape\n * @category components/meshes\n * @description Shape is a universal class. It allows you to create different 2D shapes in 3D scene.
    \n * Unfortunately, not all of them support physics, an alternative is to make a similar 3D object and scale its width down to near zero.\n *

    \n * `Shape` consists of shapes that are in its shapes parameter.\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a plane looking Shape from a THREE.Shape, and adding it to app\n * const rectWidth = 10,\n * rectLength = 5;\n *\n * const rectShape = new THREE.Shape();\n * rectShape.moveTo(0,0);\n * rectShape.lineTo(0, rectWidth);\n * rectShape.lineTo(rectLength, rectWidth);\n * rectShape.lineTo(rectLength, 0);\n * rectShape.lineTo(0, 0);\n *\n * const plane = new Shape({\n * geometry: {\n * shape: rectShape\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * })\n * }).addTo(app);\n */\nclass Shape extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Shape#defaults\n * @static\n * @default
    \n   * {\n   *   geometry: {\n   *     shapes: []\n   * }\n   * 
    \n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n shapes: []\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Shape#instructions\n * @static\n * @default
    \n   * {\n   *   geometry: ['shapes']\n   * }\n   * 
    \n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: ['shapes']\n };\n\n constructor(params = {}) {\n super(params, Shape.defaults, Shape.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Shape\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n return new (params.buffer ? ShapeBufferGeometry : ShapeGeometry)(\n params.geometry.shapes\n );\n }\n}\n\nexport {\n Shape\n};\n","import {\n Mesh,\n SphereBufferGeometry,\n SphereGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Sphere\n * @category components/meshes\n * @description Sphere class is used to create sphere objects by its radius property and other values that determines its detality.\n *

    \n * It is similar to THREE.SphereGeometry, but it also contains all `Shape` properties, such as material, mass and vectors like position (pos) and rotation (rot).\n *

    \n * Then it creates an `Three.js mesh` or a `Physijs mesh`, that is similar to `Three.js mesh`, but it also take into consideration collision calculations.\n * This mesh is a combination of `Three.js geometry` and `Physijs material` (The same as in three.js, but with friction and restitution).\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Sphere, and adding it to app\n * new Sphere({\n * geometry: {\n * radius: 2\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * position: {\n * y: 100\n * }\n * }).addTo(app);\n */\nclass Sphere extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Sphere#defaults\n * @static\n * @default
    \n   * {\n   *   geometry: {\n   *     radius: 1,\n   *     widthSegments: 8,\n   *     heightSegments: 6\n   * }\n   * 
    \n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n radius: 1,\n widthSegments: 8,\n heightSegments: 6\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Sphere#instructions\n * @static\n * @default
    \n   * {\n   *   geometry: ['radius', 'widthSegments', 'heightSegments']\n   * }\n   * 
    \n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: ['radius', 'widthSegments', 'heightSegments']\n };\n\n constructor(params = {}) {\n super(params, Sphere.defaults, Sphere.instructions);\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Sphere\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n const geometry = new (params.buffer ? SphereBufferGeometry : SphereGeometry)(\n params.geometry.radius,\n params.geometry.widthSegments,\n params.geometry.heightSegments\n );\n\n return geometry;\n }\n}\n\nexport {\n Sphere\n};\n","import {\n Mesh,\n TetrahedronBufferGeometry,\n TetrahedronGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Tetrahedron\n * @category components/meshes\n * @description In geometry, a tetrahedron is a polyhedron composed of four triangular faces, six straight edges, and four vertex corners.\n * The tetrahedron is the simplest of all the ordinary convex polyhedra and the only one that has fewer than 5 faces.\n *

    \n * `Tetrahedron` creates a Tetrahedron object by its `radius` and `detail`\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Tetrahedron, and adding it to app\n * new Tetrahedron({\n * geometry: {\n * radius: 2,\n * detail: 1\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * position: {\n * x: 0,\n * y: 100,\n * z: 0\n * }\n * }).addTo(app);\n */\nclass Tetrahedron extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Tetrahedron#defaults\n * @static\n * @default
    \n   * {\n   *   geometry: {\n   *     radius: 1,\n   *     detail: 0\n   * }\n   * 
    \n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n radius: 1,\n detail: 0\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Tetrahedron#instructions\n * @static\n * @default
    \n   * {\n   *   geometry: ['radius', 'detail']\n   * }\n   * 
    \n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: ['radius', 'detail']\n };\n\n constructor(params = {}) {\n super(params, Tetrahedron.defaults, Tetrahedron.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Tetrahedron\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n return new (params.buffer ? TetrahedronBufferGeometry : TetrahedronGeometry)(\n params.geometry.radius,\n params.geometry.detail\n );\n }\n}\n\nexport {\n Tetrahedron\n};\n","import {\n Font,\n Mesh,\n TextGeometry,\n FontLoader\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Text\n * @category components/meshes\n * @description Text class is made for creating 3D text objects.\n * @classDesc\n * \n *

    \n * Physics text object can be convex or concave. By default it's convex but you can also switch to concave.\n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Text, and adding it to app\n * new Text({\n * text: 'Some text',\n * parameters: {\n * font: 'path/to/font.typeface.js',\n * size: 20,\n * height: 5,\n * curveSegments: 6\n * }\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * position: {\n * x: -40,\n * y: 20,\n * z: 0\n * }\n * }).addTo(app);\n */\nclass Text extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Text#defaults\n * @static\n * @default
    \n   * {\n   *   text: 'Hello World!',\n   *   font: null,\n   *\n   *   geometry: {\n   *     size: 12,\n   *     height: 50,\n   *     curveSegments: 12,\n   *     font: new Font(),\n   *     bevelEnabled: false,\n   *     bevelThickness: 10,\n   *     bevelSize: 8\n   *   }\n   * }\n   * 
    \n */\n static defaults = {\n ...MeshComponent.defaults,\n text: 'Hello World!',\n font: null,\n\n geometry: {\n size: 12,\n height: 50,\n curveSegments: 12,\n font: new Font(),\n bevelEnabled: false,\n bevelThickness: 10,\n bevelSize: 8\n }\n };\n\n static instructions = {\n ...MeshComponent.instructions\n };\n\n /**\n * Default FontLoader\n * @member {Object} module:components/meshes.Text#loader\n * @static\n * @default new FontLoader()\n */\n static loader = new FontLoader();\n\n /**\n * @method load\n * @static\n * @description load() preloads a Font object and returns a Promise with it.\n * @param {String} path Path to the font\n * @return {Promise} A promise resolved with a font\n * @memberof module:components/meshes.Text\n */\n static load(path, loader = Text.loader) {\n return new Promise(resolve => {\n loader.load(path, resolve);\n });\n }\n\n constructor(params = {}) {\n super(params, Text.defaults, Text.instructions);\n }\n\n /**\n * @method build\n * @description Build is called as part of the lifecycle to create a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Text\n */\n build(params = this.params) {\n const promise = new Promise(resolve => {\n (params.font instanceof Promise ? params.font : Promise.resolve(params.font))\n .then(font => {\n const {geometry, material} = this.applyBridge({\n geometry: new TextGeometry(\n params.text,\n Object.assign(\n params.geometry,\n {font}\n )\n ),\n\n material: params.material\n });\n\n resolve(\n this.applyBridge({\n mesh: new Mesh(geometry, material)\n }).mesh\n );\n });\n });\n\n super.wait(promise);\n\n return promise;\n }\n}\n\nexport {\n Text\n};\n","import {\n Mesh,\n TorusGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Torus\n * @category components/meshes\n * @description Torus class makes a torus figure. A donut is a torus.\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Torus, and adding it to app\n * new Torus({\n * geometry: {\n * radius: 5,\n * tube: 2\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * position: {\n * y: 35\n * }\n * }).addTo(app);\n */\nclass Torus extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Torus#defaults\n * @static\n * @default
    \n   * {\n   *   geometry: {\n   *     radius: 100,\n   *     tube: 40,\n   *     radialSegments: 8,\n   *     tubularSegments: 6,\n   *     arc: Math.PI * 2\n   *   }\n   * }\n   * 
    \n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n radius: 100,\n tube: 40,\n radialSegments: 8,\n tubularSegments: 6,\n arc: Math.PI * 2\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Torus#instructions\n * @static\n * @default
    \n   * {\n   *   geometry: [\n   *     'radius',\n   *     'tube',\n   *     'radialSegments',\n   *     'tubularSegments',\n   *     'arc'\n   *   ]\n   * }\n   * 
    \n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: [\n 'radius',\n 'tube',\n 'radialSegments',\n 'tubularSegments',\n 'arc'\n ]\n };\n\n constructor(params = {}) {\n super(params, Torus.defaults, Torus.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Torus\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n return new TorusGeometry(\n params.geometry.radius,\n params.geometry.tube,\n params.geometry.radialSegments,\n params.geometry.tubularSegments,\n params.geometry.arc\n );\n }\n}\n\nexport {\n Torus\n};\n","import {\n Mesh,\n TorusKnotBufferGeometry,\n TorusKnotGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Torusknot\n * @category components/meshes\n * @description Torusknot class makes a torusknot figure. It's like a crooked donut, very crooked.\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Torusknot, and adding it to app\n * new Torusknot({\n * geometry: {\n * radius:5,\n * tube: 2\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n *\n * pos: {\n * y: 100\n * }\n * }).addTo(app);\n */\nclass Torusknot extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Torusknot#defaults\n * @static\n * @default
    \n   * {\n   *   geometry: {\n   *     radius: 100,\n   *     tube: 40,\n   *     radialSegments: 64,\n   *     tubularSegments: 8,\n   *     p: 2,\n   *     q: 3\n   *   }\n   * }\n   * 
    \n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n radius: 100,\n tube: 40,\n radialSegments: 64,\n tubularSegments: 8,\n p: 2,\n q: 3\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Torusknot#instructions\n * @static\n * @default
    \n   * {\n   *   geometry: [\n   *     'radius',\n   *     'tube',\n   *     'radialSegments',\n   *     'tubularSegments',\n   *     'p',\n   *     'q'\n   *   ]\n   * }\n   * 
    \n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: [\n 'radius',\n 'tube',\n 'radialSegments',\n 'tubularSegments',\n 'p',\n 'q'\n ]\n };\n\n constructor(params = {}) {\n super(params, Torusknot.defaults, Torusknot.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Torusknot\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n const GConstruct = params.buffer ? TorusKnotBufferGeometry : TorusKnotGeometry;\n\n return new GConstruct(\n params.geometry.radius,\n params.geometry.tube,\n params.geometry.radialSegments,\n params.geometry.tubularSegments,\n params.geometry.p,\n params.geometry.q\n );\n }\n}\n\nexport {\n Torusknot\n};\n","import {\n Mesh,\n LineCurve3,\n Vector3,\n TubeBufferGeometry,\n TubeGeometry\n} from 'three';\n\nimport {MeshComponent} from '../../core/MeshComponent';\n\n/**\n * @class Tube\n * @category components/meshes\n * @description Tube class makes a tube that extrudes along a 3d curve.\n * @classDesc\n * \n * @param {Object} [params] - The params.\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Creating a Tube from a three.js Curve, and adding it to app\n * const CustomSinCurve = THREE.Curve.create(\n * function (scale) { // custom curve constructor\n * this.scale = (scale === undefined) ? 1 : scale;\n * },\n *\n * function (t) { // getPoint: t is between 0-1\n * const tx = t * 3 - 1.5,\n * ty = Math.sin( 2 * Math.PI * t ),\n * tz = 0;\n *\n * return new THREE.Vector3(tx, ty, tz).multiplyScalar(this.scale);\n * }\n * );\n *\n * const path = new CustomSinCurve(10);\n *\n * new Tube({\n * geometry: {\n * path: path\n * },\n *\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * })\n * }).addTo(app);\n */\nclass Tube extends MeshComponent {\n /**\n * Default values for parameters\n * @member {Object} module:components/meshes.Tube#defaults\n * @static\n * @default
    \n   * {\n   *   geometry: {\n   *     path: new THREE.LineCurve3(new Vector3(0, 0, 0), new Vector3(0, 0, 1)),\n   *     segments: 20,\n   *     radius: 2,\n   *     radiusSegments: 8,\n   *     closed: false\n   *   }\n   * }\n   * 
    \n */\n static defaults = {\n ...MeshComponent.defaults,\n geometry: {\n path: new LineCurve3(new Vector3(0, 0, 0), new Vector3(0, 0, 1)),\n segments: 20,\n radius: 2,\n radiusSegments: 8,\n closed: false\n }\n };\n\n /**\n * Instructions\n * @member {Object} module:components/meshes.Tube#instructions\n * @static\n * @default
    \n   * {\n   *   geometry: [\n   *     'path',\n   *     'segments',\n   *     'radius',\n   *     'radiusSegments',\n   *     'closed'\n   *   ]\n   * }\n   * 
    \n */\n static instructions = {\n ...MeshComponent.instructions,\n geometry: [\n 'path',\n 'segments',\n 'radius',\n 'radiusSegments',\n 'closed'\n ]\n };\n\n constructor(params = {}) {\n super(params, Tube.defaults, Tube.instructions);\n\n if (params.build) {\n this.build(params);\n super.wrap();\n }\n }\n\n /**\n * @method build\n * @description Build lifecycle creates a mesh using input params.\n * @param {Object} params Component parameters.\n * @return {THREE.Mesh} Built mesh\n * @memberof module:components/meshes.Tube\n */\n build(params = this.params) {\n const {geometry, material} = this.applyBridge({\n geometry: this.buildGeometry(params),\n material: params.material\n });\n\n return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;\n }\n\n buildGeometry(params = {}) {\n const geometry = new (params.buffer ? TubeBufferGeometry : TubeGeometry)(\n params.geometry.path,\n params.geometry.segments,\n params.geometry.radius,\n params.geometry.radiusSegments,\n params.geometry.closed\n );\n\n return geometry;\n }\n}\n\nexport {\n Tube\n};\n","import {Object3D} from 'three';\nimport {MeshComponent} from '../../core/MeshComponent';\nimport {Component} from '../../core/Component';\n\n/**\n * @class Group\n * @category components/meshes\n * @description Sometimes you need to make groups of objects (it's not conveniently to apply transforms to each object when can make just one to a group).
    \n * In Three.js you make it using `THREE.Object3D` and it's children.

    \n * In whs.js we have `Group`\n * @extends module:core.MeshComponent\n * @memberof module:components/meshes\n * @example Approach 2 - Adding objects to an empty group\n * const sphere = new Sphere();\n * const box = new Box();\n * const group = new Group();\n *\n * sphere.addTo(group);\n * box.addTo(group);\n* @example Approach 2 - Making a group from objects\n * const sphere = new Sphere();\n * const box = new Box();\n * const group = new Group(box, sphere);\n * // OR: const group = new Group([box, sphere]);\n */\nclass Group extends MeshComponent {\n constructor(...objects) {\n super({});\n\n for (let i = 0; i < objects.length; i++) {\n const obj = objects[i];\n\n if (obj instanceof Component) obj.addTo(this);\n else if (obj instanceof Object3D) this.native.add(obj);\n }\n }\n\n build() {\n return new Object3D();\n }\n}\n\nexport {\n Group\n};\n","/** @module components/meshes */\nexport * from './Box';\nexport * from './Circle';\nexport * from './Cone';\nexport * from './Cylinder';\nexport * from './Dodecahedron';\nexport * from './Extrude';\nexport * from './Icosahedron';\nexport * from './Lathe';\nexport * from './Line';\nexport * from './Importer';\nexport * from './Octahedron';\nexport * from './Parametric';\nexport * from './Plane';\nexport * from './Polyhedron';\nexport * from './Ring';\nexport * from './Shape';\nexport * from './Sphere';\nexport * from './Tetrahedron';\nexport * from './Text';\nexport * from './Torus';\nexport * from './Torusknot';\nexport * from './Tube';\nexport * from './Group';\n","/**\n * @class ElementModule\n * @category modules/app\n * @param {Object} [container=document.body] container is the DOM object to which application's canvas will be added to.\n * @memberof module:modules/app\n * @example Creating an element module, passing it to the App\n * new App([\n * new ElementModule(document.getElementById('app'))\n * ]);\n */\nexport class ElementModule {\n constructor(container = document.body) {\n if (container.container) {\n console.warn('ElementModule now accepts only argument which is a DOM object, not a params object.');\n this.container = container.container;\n } else this.container = container;\n\n this.createElement();\n }\n\n /**\n * @method createElement\n * @instance\n * @description Creates a canvas element.\n * @memberof module:modules/app.ElementModule\n */\n createElement() {\n this.element = window.document.createElement('div');\n\n this.element.className = 'whs-app';\n this.element.style.width = 'inherit';\n this.element.style.height = 'inherit';\n this.element.style.position = 'relative';\n }\n\n manager(manager) {\n manager.set('element', this.element);\n manager.set('container', this.container);\n }\n\n integrate(self) {\n self.container.appendChild(self.element);\n }\n}\n","import {\n WebGLRenderer,\n Vector2\n} from 'three';\n\nimport {Loop} from '../../core/Loop';\n\n/**\n * @class RenderingModule\n * @category modules/app\n * @param {Object} [params]\n * @memberof module:modules/app\n * @example Creating a rendering module and passing it to App's modules\n * new App([\n * new ElementModule(),\n * new SceneModule(),\n * new DefineModule('camera', new PerspectiveCamera({\n * position: new THREE.Vector3(0, 6, 18),\n * far: 10000\n * })),\n * new RenderingModule({\n * bgColor: 0x162129,\n *\n * renderer: {\n * antialias: true\n * }\n * }, {shadow: true})\n * ]);\n */\nexport class RenderingModule {\n /**\n * additional\n * @description collection of additional scripts\n * @static\n * @member {Object} module:core.App#additional\n * @public\n */\n static additional = {\n shadow(renderer) {\n renderer.shadowMap.enabled = true;\n }\n }\n\n /**\n * enabled\n * @static\n * @member {Boolean} module:core.App#enabled\n * @public\n */\n enabled = true;\n\n constructor(params = {}, additional) {\n this.params = Object.assign({\n width: window.innerWidth,\n height: window.innerHeight,\n\n resolution: new Vector2(1, 1),\n pixelRatio: window.devicePixelRatio,\n\n bgColor: 0x000000,\n bgOpacity: 1,\n\n renderer: {},\n fix() {}\n }, params);\n\n const {\n bgColor,\n bgOpacity,\n renderer,\n pixelRatio,\n width,\n height,\n resolution,\n fix\n } = this.params;\n\n this.renderer = new WebGLRenderer(renderer);\n this.effects = [];\n\n this.renderer.setClearColor(\n bgColor,\n bgOpacity\n );\n\n if (pixelRatio) this.renderer.setPixelRatio(pixelRatio);\n\n this.setSize(\n Number(width * resolution.x).toFixed(),\n Number(height * resolution.y).toFixed()\n );\n\n for (const key in additional)\n if (additional[key]) this.applyAdditional(key);\n\n fix(this.renderer);\n }\n\n /**\n * @method applyAdditional\n * @description Apply additional script from RenderingModule.additional\n * @param {Stirng} name Script name\n * @return {this}\n * @memberof module:modules/app.RenderingModule\n */\n applyAdditional(name) {\n RenderingModule.additional[name].apply(this, [this.renderer]);\n }\n\n /**\n * @method integrateRenderer\n * @description Integrate renderer\n * @param {NodeElement} element DOM object\n * @param {THREE.Scene} scene used scene\n * @param {THREE.Camera} camera used camera\n * @return {Loop} renderLoop\n * @memberof module:modules/app.RenderingModule\n */\n integrateRenderer(element, scene, camera) {\n this.scene = scene;\n this.camera = camera;\n this.attachToCanvas(element);\n\n return new Loop(() => this.renderer.render(this.scene, this.camera));\n }\n\n /**\n * @method effect\n * @description Add three.js effect\n * @param {Object} effect three.js effect\n * @param {function} effectLoop update function for effect\n * @return {this}\n * @memberof module:modules/app.RenderingModule\n */\n effect(effect, effectLoop = () => {\n effect.render(this.scene, this.camera);\n }) {\n this.renderLoop.stop();\n\n const size = this.renderer.getSize();\n effect.setSize(size.width, size.height);\n\n const loop = new Loop(effectLoop);\n\n this.effects.push(loop);\n if (this.enabled) loop.start(this.app);\n\n return this;\n }\n\n /**\n * @method setSize\n * @description Update render target width and height.\n * @param {Number} width\n * @param {Number} height\n * @memberof module:modules/app.RenderingModule\n */\n setSize(width, height) {\n if (this.renderer) this.renderer.setSize(width, height);\n }\n\n /**\n * @method attachToCanvas\n * @description Attach renderer.domElement to element\n * @param {NodeElement} element DOM object\n * @memberof module:modules/app.RenderingModule\n */\n attachToCanvas(element) {\n const canvas = this.renderer.domElement;\n\n // attach to new parent world dom\n element.appendChild(canvas);\n canvas.style.width = '100%';\n canvas.style.height = '100%';\n }\n\n /**\n * @method stop\n * @description Stops renderLoop and effect loops\n * @memberof module:modules/app.RenderingModule\n */\n stop() {\n this.enabled = false;\n this.renderLoop.stop();\n this.effects.forEach(loop => loop.stop());\n }\n\n /**\n * @method play\n * @description Resumes renderLoop and effect loops\n * @memberof module:modules/app.RenderingModule\n */\n play() {\n this.enabled = true;\n this.renderLoop.start();\n this.effects.forEach(loop => loop.start());\n }\n\n manager(manager) {\n manager.define('rendering');\n manager.set('renderer', this.renderer);\n\n this.app = manager.handler;\n\n this.renderLoop = this.integrateRenderer(\n manager.get('element'),\n manager.get('scene'),\n manager.get('camera').native\n );\n\n manager.update({\n element: element => {\n this.attachToCanvas(element);\n },\n scene: scene => {\n this.scene = scene;\n },\n camera: camera => {\n this.camera = camera.native;\n }\n });\n }\n\n integrate(self) {\n self.renderLoop.start(this);\n self.effects.forEach(loop => loop.start(this));\n }\n\n /**\n * @method dispose\n * @description Dispose rendering context\n * @memberof module:modules/app.RenderingModule\n */\n dispose() {\n this.stop();\n this.renderer.forceContextLoss();\n }\n}\n","import {\n Scene,\n} from 'three';\n\nconst SYMBOL_CHILDREN_FOR_SCENE = Symbol('SYMBOL_CHILDREN_FOR_SCENE')\n\n/**\n * @class SceneModule\n * @category modules/app\n * @param {Boolean} [willSceneBeReplaced=false] willSceneBeReplaced should be true only if you are going to overwrite scene dependency even without the use of default one.\n * @memberof module:modules/app\n */\nexport class SceneModule {\n constructor(willSceneBeReplaced = false) {\n this.scene = willSceneBeReplaced ? null : new Scene();\n }\n\n manager(manager) {\n manager.set('scene', this.scene);\n }\n\n integrate(self) {\n Object.assign(\n this,\n {\n async add(object) {\n if (object.parent) await object.parent.remove(object);\n \n await object.wait();\n \n if (!object.native) {\n throw new CompositionError(\n 'SceneModule',\n 'there is no object.native',\n this\n );\n }\n \n object.parent = this;\n await this.applyBridge({onAdd: object}).onAdd;\n self.scene.add(object.native);\n this.children.push(object);\n \n return object;\n },\n async remove(object) {\n if (object.parent !== this) return;\n \n await object.wait();\n this.applyBridge({onRemove: object});\n \n object.parent = null;\n self.scene.remove(object.native);\n this.children.splice(this.children.indexOf(object), 1);\n },\n _setScene(scene) {\n this.children = scene[SYMBOL_CHILDREN_FOR_SCENE] = scene[SYMBOL_CHILDREN_FOR_SCENE] || []\n self.scene = scene;\n },\n setScene(scene) {\n this._setScene(scene);\n this.manager.set('scene', scene);\n },\n getScene() {\n return self.scene;\n },\n },\n );\n if (self.scene) this._setScene(self.scene);\n }\n}\n","// import {addResizeListener} from 'detect-element-resize';\n\n/**\n * @class ResizeModule\n * @category modules/app\n * @param {Object} [params={auto: true}] - If auto is set to true - resize will be triggered when container resizes\n * @memberof module:modules/app\n */\nexport class ResizeModule {\n constructor(params = {}) {\n this.params = Object.assign({\n auto: true\n }, params);\n\n this.callbacks = [this.setSize.bind(this)];\n }\n\n /**\n * @function setSize\n * @instance\n * @description This function sets the provided width & height to the renderer object.\n * @param {Number} [width=1] - The promise that should be added to a queue.\n * @param {Number} [height=1] - that is resolved when all promises completed.\n * @memberof module:modules/app.ResizeModule\n */\n setSize(width = 1, height = 1) {\n this.camera.native.aspect = width / height;\n this.camera.native.updateProjectionMatrix();\n\n if (this.rendering) this.rendering.setSize(width, height);\n }\n\n /**\n * @method trigger\n * @instance\n * @description Triggers resize when called. width & height are determined automatically\n * This invokes each callbacks with the new width and height as params\n * @memberof module:modules/app.ResizeModule\n */\n trigger() {\n const {\n container: {\n offsetWidth,\n offsetHeight\n },\n resolution\n } = this;\n\n const width = Number(offsetWidth * resolution.x).toFixed();\n const height = Number(offsetHeight * resolution.y).toFixed();\n\n this.callbacks.forEach(cb => {\n cb(width, height);\n });\n }\n\n /**\n * @method addAutoresize\n * @instance\n * @description Sets module to autoresize, this adds an event listene on window resize to trigger the resize\n * @memberof module:modules/app.ResizeModule\n */\n addAutoresize() {\n this.container = this.getContainer();\n this.resolution = this.getResolution();\n\n if (this.params.auto) window.addEventListener('resize', this.trigger.bind(this));\n }\n\n /**\n * @method addCallback\n * @instance\n * @description Adds a call back function to the existing callbacks list.\n * @param {Function} func - The callback function to add\n * @memberof module:modules/app.ResizeModule\n */\n addCallback(func) {\n this.callbacks.push(func);\n }\n\n manager(manager) {\n manager.define('resize');\n\n this.rendering = manager.get('renderer');\n this.camera = manager.get('camera');\n\n this.getResolution = () => manager.use('rendering').params.resolution;\n this.getContainer = () => manager.get('container');\n\n manager.update({\n container: container => {\n this.container = container;\n }\n });\n\n this.addAutoresize();\n }\n}\n","import { ShaderMaterial, Uniform } from \"three\";\r\n\r\nconst fragment = \"uniform sampler2D tPreviousLum;\\r\\nuniform sampler2D tCurrentLum;\\r\\nuniform float minLuminance;\\r\\nuniform float delta;\\r\\nuniform float tau;\\r\\n\\r\\nvarying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tfloat previousLum = texture2D(tPreviousLum, vUv, MIP_LEVEL_1X1).r;\\r\\n\\tfloat currentLum = texture2D(tCurrentLum, vUv, MIP_LEVEL_1X1).r;\\r\\n\\r\\n\\tpreviousLum = max(minLuminance, previousLum);\\r\\n\\tcurrentLum = max(minLuminance, currentLum);\\r\\n\\r\\n\\t// Adapt the luminance using Pattanaik's technique.\\r\\n\\tfloat adaptedLum = previousLum + (currentLum - previousLum) * (1.0 - exp(-delta * tau));\\r\\n\\r\\n\\tgl_FragColor.r = adaptedLum;\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"varying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * An adaptive luminosity shader material.\r\n */\r\n\r\nexport class AdaptiveLuminosityMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new adaptive luminosity material.\r\n\t */\r\n\r\n\tconstructor() {\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"AdaptiveLuminosityMaterial\",\r\n\r\n\t\t\tdefines: {\r\n\r\n\t\t\t\tMIP_LEVEL_1X1: \"0.0\"\r\n\r\n\t\t\t},\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttPreviousLum: new Uniform(null),\r\n\t\t\t\ttCurrentLum: new Uniform(null),\r\n\t\t\t\tminLuminance: new Uniform(0.01),\r\n\t\t\t\tdelta: new Uniform(0.0),\r\n\t\t\t\ttau: new Uniform(1.0)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform } from \"three\";\r\n\r\nconst fragment = \"uniform sampler2D tDiffuse;\\r\\nuniform sampler2D tDepth;\\r\\n\\r\\nuniform float focus;\\r\\nuniform float dof;\\r\\nuniform float aspect;\\r\\nuniform float aperture;\\r\\nuniform float maxBlur;\\r\\n\\r\\nvarying vec2 vUv;\\r\\n\\r\\n#ifndef USE_LOGDEPTHBUF\\r\\n\\r\\n\\t#include \\r\\n\\r\\n\\tuniform float cameraNear;\\r\\n\\tuniform float cameraFar;\\r\\n\\r\\n\\tfloat readDepth(sampler2D depthSampler, vec2 coord) {\\r\\n\\r\\n\\t\\tfloat fragCoordZ = texture2D(depthSampler, coord).x;\\r\\n\\t\\tfloat viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\\r\\n\\r\\n\\t\\treturn viewZToOrthographicDepth(viewZ, cameraNear, cameraFar);\\r\\n\\r\\n\\t}\\r\\n\\r\\n#endif\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec2 aspectCorrection = vec2(1.0, aspect);\\r\\n\\r\\n\\t#ifdef USE_LOGDEPTHBUF\\r\\n\\r\\n\\t\\tfloat depth = texture2D(tDepth, vUv).x;\\r\\n\\r\\n\\t#else\\r\\n\\r\\n\\t\\tfloat depth = readDepth(tDepth, vUv);\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\tfloat focusNear = clamp(focus - dof, 0.0, 1.0);\\r\\n\\tfloat focusFar = clamp(focus + dof, 0.0, 1.0);\\r\\n\\r\\n\\t// Calculate a DoF mask.\\r\\n\\tfloat low = step(depth, focusNear);\\r\\n\\tfloat high = step(focusFar, depth);\\r\\n\\r\\n\\tfloat factor = (depth - focusNear) * low + (depth - focusFar) * high;\\r\\n\\r\\n\\tvec2 dofBlur = vec2(clamp(factor * aperture, -maxBlur, maxBlur));\\r\\n\\r\\n\\tvec2 dofblur9 = dofBlur * 0.9;\\r\\n\\tvec2 dofblur7 = dofBlur * 0.7;\\r\\n\\tvec2 dofblur4 = dofBlur * 0.4;\\r\\n\\r\\n\\tvec4 color = vec4(0.0);\\r\\n\\r\\n\\tcolor += texture2D(tDiffuse, vUv);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, 0.4 ) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, 0.37) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, 0.29) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, 0.15) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.40, 0.0 ) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, -0.15) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, -0.29) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, -0.37) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, -0.4 ) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, 0.37) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, 0.29) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, 0.15) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.4, 0.0 ) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, -0.15) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, -0.29) * aspectCorrection) * dofBlur);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, -0.37) * aspectCorrection) * dofBlur);\\r\\n\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, 0.37) * aspectCorrection) * dofblur9);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, 0.15) * aspectCorrection) * dofblur9);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, -0.15) * aspectCorrection) * dofblur9);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, -0.37) * aspectCorrection) * dofblur9);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, 0.37) * aspectCorrection) * dofblur9);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, 0.15) * aspectCorrection) * dofblur9);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, -0.15) * aspectCorrection) * dofblur9);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, -0.37) * aspectCorrection) * dofblur9);\\r\\n\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, 0.29) * aspectCorrection) * dofblur7);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.40, 0.0 ) * aspectCorrection) * dofblur7);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, -0.29) * aspectCorrection) * dofblur7);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, -0.4 ) * aspectCorrection) * dofblur7);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, 0.29) * aspectCorrection) * dofblur7);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.4, 0.0 ) * aspectCorrection) * dofblur7);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, -0.29) * aspectCorrection) * dofblur7);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, 0.4 ) * aspectCorrection) * dofblur7);\\r\\n\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, 0.29) * aspectCorrection) * dofblur4);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.4, 0.0 ) * aspectCorrection) * dofblur4);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, -0.29) * aspectCorrection) * dofblur4);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, -0.4 ) * aspectCorrection) * dofblur4);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, 0.29) * aspectCorrection) * dofblur4);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.4, 0.0 ) * aspectCorrection) * dofblur4);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, -0.29) * aspectCorrection) * dofblur4);\\r\\n\\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, 0.4 ) * aspectCorrection) * dofblur4);\\r\\n\\r\\n\\tgl_FragColor = color / 41.0;\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"varying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * Depth of Field shader (Bokeh).\r\n *\r\n * Original shader code by Martins Upitis:\r\n * http://artmartinsh.blogspot.com/2010/02/glsl-lens-blur-filter-with-bokeh.html\r\n */\r\n\r\nexport class BokehMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new bokeh material.\r\n\t *\r\n\t * @param {PerspectiveCamera} [camera] - A camera.\r\n\t * @param {Object} [options] - The options.\r\n\t * @param {Number} [options.focus=1.0] - The focus distance, corresponds directly with the scene depth.\r\n\t * @param {Number} [options.dof=0.02] - Depth of field. An area in front of and behind the focus point that still appears sharp.\r\n\t * @param {Number} [options.aperture=0.025] - Camera aperture scale. Bigger values for stronger blur and shallower depth of field.\r\n\t * @param {Number} [options.maxBlur=1.0] - Maximum blur strength.\r\n\t */\r\n\r\n\tconstructor(camera, options = {}) {\r\n\r\n\t\tconst settings = Object.assign({\r\n\t\t\tfocus: 1.0,\r\n\t\t\tdof: 0.02,\r\n\t\t\taperture: 0.025,\r\n\t\t\tmaxBlur: 1.0\r\n\t\t}, options);\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"BokehMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\tcameraNear: new Uniform(0.1),\r\n\t\t\t\tcameraFar: new Uniform(2000),\r\n\t\t\t\taspect: new Uniform(1.0),\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\t\t\t\ttDepth: new Uniform(null),\r\n\r\n\t\t\t\tfocus: new Uniform(settings.focus),\r\n\t\t\t\tdof: new Uniform(settings.dof),\r\n\t\t\t\taperture: new Uniform(settings.aperture),\r\n\t\t\t\tmaxBlur: new Uniform(settings.maxBlur)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t\tthis.adoptCameraSettings(camera);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Adopts the settings of the given camera.\r\n\t *\r\n\t * @param {PerspectiveCamera} [camera=null] - A camera.\r\n\t */\r\n\r\n\tadoptCameraSettings(camera = null) {\r\n\r\n\t\tif(camera !== null) {\r\n\r\n\t\t\tthis.uniforms.cameraNear.value = camera.near;\r\n\t\t\tthis.uniforms.cameraFar.value = camera.far;\r\n\t\t\tthis.uniforms.aspect.value = camera.aspect;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform, Vector2 } from \"three\";\r\n\r\nconst fragment = \"uniform sampler2D tDiffuse;\\r\\n\\r\\nvarying vec2 vUv;\\r\\nvarying vec4 vOffset[3];\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tconst vec2 threshold = vec2(EDGE_THRESHOLD);\\r\\n\\r\\n\\t// Calculate color deltas.\\r\\n\\tvec4 delta;\\r\\n\\tvec3 c = texture2D(tDiffuse, vUv).rgb;\\r\\n\\r\\n\\tvec3 cLeft = texture2D(tDiffuse, vOffset[0].xy).rgb;\\r\\n\\tvec3 t = abs(c - cLeft);\\r\\n\\tdelta.x = max(max(t.r, t.g), t.b);\\r\\n\\r\\n\\tvec3 cTop = texture2D(tDiffuse, vOffset[0].zw).rgb;\\r\\n\\tt = abs(c - cTop);\\r\\n\\tdelta.y = max(max(t.r, t.g), t.b);\\r\\n\\r\\n\\t// We do the usual threshold.\\r\\n\\tvec2 edges = step(threshold, delta.xy);\\r\\n\\r\\n\\t// Then discard if there is no edge.\\r\\n\\tif(dot(edges, vec2(1.0)) == 0.0) {\\r\\n\\r\\n\\t\\tdiscard;\\r\\n\\r\\n\\t}\\r\\n\\r\\n\\t// Calculate right and bottom deltas.\\r\\n\\tvec3 cRight = texture2D(tDiffuse, vOffset[1].xy).rgb;\\r\\n\\tt = abs(c - cRight);\\r\\n\\tdelta.z = max(max(t.r, t.g), t.b);\\r\\n\\r\\n\\tvec3 cBottom = texture2D(tDiffuse, vOffset[1].zw).rgb;\\r\\n\\tt = abs(c - cBottom);\\r\\n\\tdelta.w = max(max(t.r, t.g), t.b);\\r\\n\\r\\n\\t// Calculate the maximum delta in the direct neighborhood.\\r\\n\\tfloat maxDelta = max(max(max(delta.x, delta.y), delta.z), delta.w);\\r\\n\\r\\n\\t// Calculate left-left and top-top deltas.\\r\\n\\tvec3 cLeftLeft = texture2D(tDiffuse, vOffset[2].xy).rgb;\\r\\n\\tt = abs(c - cLeftLeft);\\r\\n\\tdelta.z = max(max(t.r, t.g), t.b);\\r\\n\\r\\n\\tvec3 cTopTop = texture2D(tDiffuse, vOffset[2].zw).rgb;\\r\\n\\tt = abs(c - cTopTop);\\r\\n\\tdelta.w = max(max(t.r, t.g), t.b);\\r\\n\\r\\n\\t// Calculate the final maximum delta.\\r\\n\\tmaxDelta = max(max(maxDelta, delta.z), delta.w);\\r\\n\\r\\n\\t// Local contrast adaptation in action.\\r\\n\\tedges.xy *= step(0.5 * maxDelta, delta.xy);\\r\\n\\r\\n\\tgl_FragColor = vec4(edges, 0.0, 0.0);\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"uniform vec2 texelSize;\\r\\n\\r\\nvarying vec2 vUv;\\r\\nvarying vec4 vOffset[3];\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\r\\n\\tvOffset[0] = uv.xyxy + texelSize.xyxy * vec4(-1.0, 0.0, 0.0, 1.0); // Changed sign in W component.\\r\\n\\tvOffset[1] = uv.xyxy + texelSize.xyxy * vec4(1.0, 0.0, 0.0, -1.0); // Changed sign in W component.\\r\\n\\tvOffset[2] = uv.xyxy + texelSize.xyxy * vec4(-2.0, 0.0, 0.0, 2.0); // Changed sign in W component.\\r\\n\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * A material that detects edges in a color texture.\r\n *\r\n * Mainly used for Subpixel Morphological Antialiasing.\r\n */\r\n\r\nexport class ColorEdgesMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new color edges material.\r\n\t *\r\n\t * @param {Vector2} [texelSize] - The absolute screen texel size.\r\n\t */\r\n\r\n\tconstructor(texelSize = new Vector2()) {\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"ColorEdgesMaterial\",\r\n\r\n\t\t\tdefines: {\r\n\r\n\t\t\t\tEDGE_THRESHOLD: \"0.1\"\r\n\r\n\t\t\t},\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\t\t\t\ttexelSize: new Uniform(texelSize)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the edge detection sensitivity.\r\n\t *\r\n\t * A lower value results in more edges being detected at the expense of\r\n\t * performance.\r\n\t *\r\n\t * 0.1 is a reasonable value, and allows to catch most visible edges.\r\n\t * 0.05 is a rather overkill value, that allows to catch 'em all.\r\n\t *\r\n\t * If temporal supersampling is used, 0.2 could be a reasonable value,\r\n\t * as low contrast edges are properly filtered by just 2x.\r\n\t *\r\n\t * @param {Number} threshold - The edge detection sensitivity. Range: [0, 0.5].\r\n\t */\r\n\r\n\tsetEdgeDetectionThreshold(threshold) {\r\n\r\n\t\tthis.defines.EDGE_THRESHOLD = threshold.toFixed(\"2\");\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform } from \"three\";\r\n\r\nconst fragment = \"uniform sampler2D texture1;\\r\\nuniform sampler2D texture2;\\r\\n\\r\\nuniform float opacity1;\\r\\nuniform float opacity2;\\r\\n\\r\\nvarying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec4 texel1 = opacity1 * texture2D(texture1, vUv);\\r\\n\\tvec4 texel2 = opacity2 * texture2D(texture2, vUv);\\r\\n\\r\\n\\t#ifdef SCREEN_MODE\\r\\n\\r\\n\\t\\tvec3 invTexel1 = vec3(1.0) - texel1.rgb;\\r\\n\\t\\tvec3 invTexel2 = vec3(1.0) - texel2.rgb;\\r\\n\\r\\n\\t\\tvec4 color = vec4(\\r\\n\\t\\t\\tvec3(1.0) - invTexel1 * invTexel2,\\r\\n\\t\\t\\ttexel1.a + texel2.a\\r\\n\\t\\t);\\r\\n\\r\\n\\t#else\\r\\n\\r\\n\\t\\tvec4 color = texel1 + texel2;\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\tgl_FragColor = color;\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"varying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * A material for combining two textures.\r\n *\r\n * This material supports the two blend modes Add and Screen.\r\n *\r\n * In Screen mode, the two textures are effectively projected on a white screen\r\n * simultaneously. In Add mode, the textures are simply added together which\r\n * often produces undesired, washed out results.\r\n */\r\n\r\nexport class CombineMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new combine material.\r\n\t *\r\n\t * @param {Boolean} [screenMode=false] - Whether the screen blend mode should be used.\r\n\t */\r\n\r\n\tconstructor(screenMode = false) {\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"CombineMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttexture1: new Uniform(null),\r\n\t\t\t\ttexture2: new Uniform(null),\r\n\r\n\t\t\t\topacity1: new Uniform(1.0),\r\n\t\t\t\topacity2: new Uniform(1.0)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t\tthis.setScreenModeEnabled(screenMode);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Enables or disables the Screen blend mode.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the Screen blend mode should be enabled.\r\n\t */\r\n\r\n\tsetScreenModeEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.SCREEN_MODE = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.SCREEN_MODE;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform, Vector2 } from \"three\";\r\n\r\nconst fragment = \"#include \\r\\n#include \\r\\n\\r\\nuniform sampler2D tDiffuse;\\r\\n\\r\\nvarying vec2 vUv0;\\r\\nvarying vec2 vUv1;\\r\\nvarying vec2 vUv2;\\r\\nvarying vec2 vUv3;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\t// Sample top left texel.\\r\\n\\tvec4 sum = texture2D(tDiffuse, vUv0);\\r\\n\\r\\n\\t// Sample top right texel.\\r\\n\\tsum += texture2D(tDiffuse, vUv1);\\r\\n\\r\\n\\t// Sample bottom right texel.\\r\\n\\tsum += texture2D(tDiffuse, vUv2);\\r\\n\\r\\n\\t// Sample bottom left texel.\\r\\n\\tsum += texture2D(tDiffuse, vUv3);\\r\\n\\r\\n\\t// Compute the average.\\r\\n\\tgl_FragColor = sum * 0.25;\\r\\n\\r\\n\\t#include \\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"uniform vec2 texelSize;\\r\\nuniform vec2 halfTexelSize;\\r\\nuniform float kernel;\\r\\n\\r\\nvarying vec2 vUv0;\\r\\nvarying vec2 vUv1;\\r\\nvarying vec2 vUv2;\\r\\nvarying vec2 vUv3;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec2 dUv = (texelSize * vec2(kernel)) + halfTexelSize;\\r\\n\\r\\n\\tvUv0 = vec2(uv.x - dUv.x, uv.y + dUv.y);\\r\\n\\tvUv1 = vec2(uv.x + dUv.x, uv.y + dUv.y);\\r\\n\\tvUv2 = vec2(uv.x + dUv.x, uv.y - dUv.y);\\r\\n\\tvUv3 = vec2(uv.x - dUv.x, uv.y - dUv.y);\\r\\n\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * An optimised convolution shader material.\r\n *\r\n * This material supports dithering.\r\n *\r\n * Based on the GDC2003 Presentation by Masaki Kawase, Bunkasha Games:\r\n * Frame Buffer Postprocessing Effects in DOUBLE-S.T.E.A.L (Wreckless)\r\n * and an article by Filip Strugar, Intel:\r\n * An investigation of fast real-time GPU-based image blur algorithms\r\n *\r\n * Further modified according to Apple's\r\n * [Best Practices for Shaders](https://goo.gl/lmRoM5).\r\n */\r\n\r\nexport class ConvolutionMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new convolution material.\r\n\t *\r\n\t * @param {Vector2} [texelSize] - The absolute screen texel size.\r\n\t */\r\n\r\n\tconstructor(texelSize = new Vector2()) {\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"ConvolutionMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\t\t\t\ttexelSize: new Uniform(new Vector2()),\r\n\t\t\t\thalfTexelSize: new Uniform(new Vector2()),\r\n\t\t\t\tkernel: new Uniform(0.0)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t\tthis.setTexelSize(texelSize.x, texelSize.y);\r\n\r\n\t\t/**\r\n\t\t * The current kernel size.\r\n\t\t *\r\n\t\t * @type {KernelSize}\r\n\t\t * @default KernelSize.LARGE\r\n\t\t */\r\n\r\n\t\tthis.kernelSize = KernelSize.LARGE;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the kernel.\r\n\t *\r\n\t * @return {Float32Array} The kernel.\r\n\t */\r\n\r\n\tgetKernel() {\r\n\r\n\t\treturn kernelPresets[this.kernelSize];\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the texel size.\r\n\t *\r\n\t * @param {Number} x - The texel width.\r\n\t * @param {Number} y - The texel height.\r\n\t */\r\n\r\n\tsetTexelSize(x, y) {\r\n\r\n\t\tthis.uniforms.texelSize.value.set(x, y);\r\n\t\tthis.uniforms.halfTexelSize.value.set(x, y).multiplyScalar(0.5);\r\n\r\n\t}\r\n\r\n}\r\n\r\n/**\r\n * The Kawase blur kernel presets.\r\n *\r\n * @type {Float32Array[]}\r\n * @private\r\n */\r\n\r\nconst kernelPresets = [\r\n\tnew Float32Array([0.0, 0.0]),\r\n\tnew Float32Array([0.0, 1.0, 1.0]),\r\n\tnew Float32Array([0.0, 1.0, 1.0, 2.0]),\r\n\tnew Float32Array([0.0, 1.0, 2.0, 2.0, 3.0]),\r\n\tnew Float32Array([0.0, 1.0, 2.0, 3.0, 4.0, 4.0, 5.0]),\r\n\tnew Float32Array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 7.0, 8.0, 9.0, 10.0])\r\n];\r\n\r\n/**\r\n * A kernel size enumeration.\r\n *\r\n * @type {Object}\r\n * @property {Number} VERY_SMALL - A very small kernel that matches a 7x7 Gauss blur kernel.\r\n * @property {Number} SMALL - A small kernel that matches a 15x15 Gauss blur kernel.\r\n * @property {Number} MEDIUM - A medium sized kernel that matches a 23x23 Gauss blur kernel.\r\n * @property {Number} LARGE - A large kernel that matches a 35x35 Gauss blur kernel.\r\n * @property {Number} VERY_LARGE - A very large kernel that matches a 63x63 Gauss blur kernel.\r\n * @property {Number} HUGE - A huge kernel that matches a 127x127 Gauss blur kernel.\r\n */\r\n\r\nexport const KernelSize = {\r\n\r\n\tVERY_SMALL: 0,\r\n\tSMALL: 1,\r\n\tMEDIUM: 2,\r\n\tLARGE: 3,\r\n\tVERY_LARGE: 4,\r\n\tHUGE: 5\r\n\r\n};\r\n","import { ShaderMaterial, Uniform } from \"three\";\r\n\r\nconst fragment = \"uniform sampler2D tDiffuse;\\r\\nuniform float opacity;\\r\\n\\r\\nvarying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec4 texel = texture2D(tDiffuse, vUv);\\r\\n\\tgl_FragColor = opacity * texel;\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"varying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * A simple copy shader material.\r\n */\r\n\r\nexport class CopyMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new copy material.\r\n\t */\r\n\r\n\tconstructor() {\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"CopyMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\t\t\t\topacity: new Uniform(1.0)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t}\r\n\r\n}\r\n","import { PerspectiveCamera, ShaderMaterial, Uniform } from \"three\";\r\n\r\nconst fragment = \"#include \\r\\n#include \\r\\n\\r\\nuniform sampler2D tDepth;\\r\\nuniform float cameraNear;\\r\\nuniform float cameraFar;\\r\\n\\r\\nvarying float vViewZ;\\r\\nvarying vec4 vProjTexCoord;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\t#include \\r\\n\\r\\n\\t// Transform into Cartesian coordinate (not mirrored).\\r\\n\\tvec2 projTexCoord = (vProjTexCoord.xy / vProjTexCoord.w) * 0.5 + 0.5;\\r\\n\\tprojTexCoord = clamp(projTexCoord, 0.002, 0.998);\\r\\n\\r\\n\\tfloat fragCoordZ = unpackRGBAToDepth(texture2D(tDepth, projTexCoord));\\r\\n\\r\\n\\t#ifdef PERSPECTIVE_CAMERA\\r\\n\\r\\n\\t\\tfloat viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\\r\\n\\r\\n\\t#else\\r\\n\\r\\n\\t\\tfloat viewZ = orthographicDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\tfloat depthTest = (-vViewZ > -viewZ) ? 1.0 : 0.0;\\r\\n\\r\\n\\tgl_FragColor.rgb = vec3(0.0, depthTest, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"#include \\r\\n#include \\r\\n#include \\r\\n#include \\r\\n\\r\\nvarying float vViewZ;\\r\\nvarying vec4 vProjTexCoord;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\t#include \\r\\n\\r\\n\\t#include \\r\\n\\t#include \\r\\n\\t#include \\r\\n\\t#include \\r\\n\\r\\n\\tvViewZ = mvPosition.z;\\r\\n\\tvProjTexCoord = gl_Position;\\r\\n\\r\\n\\t#include \\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * A depth comparison shader material.\r\n */\r\n\r\nexport class DepthComparisonMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new depth comparison material.\r\n\t *\r\n\t * @param {Texture} [depthTexture=null] - A depth texture.\r\n\t * @param {PerspectiveCamera} [camera] - A camera.\r\n\t */\r\n\r\n\tconstructor(depthTexture = null, camera) {\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"DepthComparisonMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDepth: new Uniform(depthTexture),\r\n\t\t\t\tcameraNear: new Uniform(0.1),\r\n\t\t\t\tcameraFar: new Uniform(2000)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false,\r\n\r\n\t\t\tmorphTargets: true,\r\n\t\t\tskinning: true\r\n\r\n\t\t});\r\n\r\n\t\tthis.adoptCameraSettings(camera);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Adopts the settings of the given camera.\r\n\t *\r\n\t * @param {Camera} [camera=null] - A camera.\r\n\t */\r\n\r\n\tadoptCameraSettings(camera = null) {\r\n\r\n\t\tif(camera !== null) {\r\n\r\n\t\t\tthis.uniforms.cameraNear.value = camera.near;\r\n\t\t\tthis.uniforms.cameraFar.value = camera.far;\r\n\r\n\t\t\tif(camera instanceof PerspectiveCamera) {\r\n\r\n\t\t\t\tthis.defines.PERSPECTIVE_CAMERA = \"1\";\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tdelete this.defines.PERSPECTIVE_CAMERA;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform, Vector4 } from \"three\";\r\n\r\nconst fragment = \"uniform sampler2D tDiffuse;\\r\\n\\r\\nuniform float angle;\\r\\nuniform float scale;\\r\\nuniform float intensity;\\r\\n\\r\\nvarying vec2 vUv;\\r\\nvarying vec2 vUvPattern;\\r\\n\\r\\nfloat pattern() {\\r\\n\\r\\n\\tfloat s = sin(angle);\\r\\n\\tfloat c = cos(angle);\\r\\n\\r\\n\\tvec2 point = vec2(c * vUvPattern.x - s * vUvPattern.y, s * vUvPattern.x + c * vUvPattern.y) * scale;\\r\\n\\r\\n\\treturn (sin(point.x) * sin(point.y)) * 4.0;\\r\\n\\r\\n}\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec4 texel = texture2D(tDiffuse, vUv);\\r\\n\\tvec3 color = texel.rgb;\\r\\n\\r\\n\\t#ifdef AVERAGE\\r\\n\\r\\n\\t\\tcolor = vec3((color.r + color.g + color.b) / 3.0);\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\tcolor = vec3(color * 10.0 - 5.0 + pattern());\\r\\n\\tcolor = texel.rgb + (color - texel.rgb) * intensity;\\r\\n\\r\\n\\tgl_FragColor = vec4(color, texel.a);\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"uniform vec4 offsetRepeat;\\r\\n\\r\\nvarying vec2 vUv;\\r\\nvarying vec2 vUvPattern;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\tvUvPattern = uv * offsetRepeat.zw + offsetRepeat.xy;\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * A dot screen shader material.\r\n */\r\n\r\nexport class DotScreenMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new dot screen material.\r\n\t *\r\n\t * @param {Boolean} [options] - The options.\r\n\t * @param {Boolean} [options.average=false] - Whether the shader should output the colour average (black and white).\r\n\t * @param {Boolean} [options.angle=1.57] - The angle of the dot pattern.\r\n\t * @param {Boolean} [options.scale=1.0] - The scale of the dot pattern.\r\n\t * @param {Boolean} [options.intensity=1.0] - The intensity of the effect.\r\n\t */\r\n\r\n\tconstructor(options = {}) {\r\n\r\n\t\tconst settings = Object.assign({\r\n\t\t\taverage: false,\r\n\t\t\tangle: 1.57,\r\n\t\t\tscale: 1.0,\r\n\t\t\tintensity: 1.0\r\n\t\t}, options);\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"DotScreenMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\r\n\t\t\t\tangle: new Uniform(settings.angle),\r\n\t\t\t\tscale: new Uniform(settings.scale),\r\n\t\t\t\tintensity: new Uniform(settings.intensity),\r\n\r\n\t\t\t\toffsetRepeat: new Uniform(new Vector4(0.5, 0.5, 1.0, 1.0))\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t\tthis.setAverageEnabled(settings.average);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Enables or disables the Screen blend mode.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the Screen blend mode should be enabled.\r\n\t */\r\n\r\n\tsetAverageEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.AVERAGE = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.AVERAGE;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform, Vector2 } from \"three\";\r\n\r\nconst fragment = \"uniform sampler2D tDiffuse;\\r\\nuniform float time;\\r\\n\\r\\nvarying vec2 vUv;\\r\\n\\r\\n#ifdef NOISE\\r\\n\\r\\n\\tuniform float noiseIntensity;\\r\\n\\r\\n#endif\\r\\n\\r\\n#ifdef SCANLINES\\r\\n\\r\\n\\tuniform float scanlineIntensity;\\r\\n\\tuniform float scanlineCount;\\r\\n\\r\\n#endif\\r\\n\\r\\n#ifdef GRID\\r\\n\\r\\n\\tuniform float gridIntensity;\\r\\n\\tuniform vec2 gridScale;\\r\\n\\tuniform float gridLineWidth;\\r\\n\\r\\n#endif\\r\\n\\r\\n#ifdef GREYSCALE\\r\\n\\r\\n\\t#include \\r\\n\\r\\n\\tuniform float greyscaleIntensity;\\r\\n\\r\\n#elif defined(SEPIA)\\r\\n\\r\\n\\tuniform float sepiaIntensity;\\r\\n\\r\\n#endif\\r\\n\\r\\n#ifdef VIGNETTE\\r\\n\\r\\n\\tuniform float vignetteOffset;\\r\\n\\tuniform float vignetteDarkness;\\r\\n\\r\\n#endif\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec4 texel = texture2D(tDiffuse, vUv);\\r\\n\\tvec3 color = texel.rgb;\\r\\n\\r\\n\\t#ifdef SCREEN_MODE\\r\\n\\r\\n\\t\\tvec3 invColor;\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\t#ifdef NOISE\\r\\n\\r\\n\\t\\tfloat x = vUv.x * vUv.y * time * 1000.0;\\r\\n\\t\\tx = mod(x, 13.0) * mod(x, 123.0);\\r\\n\\t\\tx = mod(x, 0.01);\\r\\n\\r\\n\\t\\tvec3 noise = texel.rgb * clamp(0.1 + x * 100.0, 0.0, 1.0) * noiseIntensity;\\r\\n\\r\\n\\t\\t#ifdef SCREEN_MODE\\r\\n\\r\\n\\t\\t\\tinvColor = vec3(1.0) - color;\\r\\n\\t\\t\\tvec3 invNoise = vec3(1.0) - noise;\\r\\n\\r\\n\\t\\t\\tcolor = vec3(1.0) - invColor * invNoise;\\r\\n\\r\\n\\t\\t#else\\r\\n\\r\\n\\t\\t\\tcolor += noise;\\r\\n\\r\\n\\t\\t#endif\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\t#ifdef SCANLINES\\r\\n\\r\\n\\t\\tvec2 sl = vec2(sin(vUv.y * scanlineCount), cos(vUv.y * scanlineCount));\\r\\n\\t\\tvec3 scanlines = texel.rgb * vec3(sl.x, sl.y, sl.x) * scanlineIntensity;\\r\\n\\r\\n\\t\\t#ifdef SCREEN_MODE\\r\\n\\r\\n\\t\\t\\tinvColor = vec3(1.0) - color;\\r\\n\\t\\t\\tvec3 invScanlines = vec3(1.0) - scanlines;\\r\\n\\r\\n\\t\\t\\tcolor = vec3(1.0) - invColor * invScanlines;\\r\\n\\r\\n\\t\\t#else\\r\\n\\r\\n\\t\\t\\tcolor += scanlines;\\r\\n\\r\\n\\t\\t#endif\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\t#ifdef GRID\\r\\n\\r\\n\\t\\tfloat grid = 0.5 - max(abs(mod(vUv.x * gridScale.x, 1.0) - 0.5), abs(mod(vUv.y * gridScale.y, 1.0) - 0.5));\\r\\n\\t\\tcolor *= (1.0 - gridIntensity) + vec3(smoothstep(0.0, gridLineWidth, grid)) * gridIntensity;\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\t#ifdef GREYSCALE\\r\\n\\r\\n\\t\\tcolor = mix(color, vec3(linearToRelativeLuminance(color)), greyscaleIntensity);\\r\\n\\r\\n\\t#elif defined(SEPIA)\\r\\n\\r\\n\\t\\tvec3 c = color.rgb;\\r\\n\\r\\n\\t\\tcolor.r = dot(c, vec3(1.0 - 0.607 * sepiaIntensity, 0.769 * sepiaIntensity, 0.189 * sepiaIntensity));\\r\\n\\t\\tcolor.g = dot(c, vec3(0.349 * sepiaIntensity, 1.0 - 0.314 * sepiaIntensity, 0.168 * sepiaIntensity));\\r\\n\\t\\tcolor.b = dot(c, vec3(0.272 * sepiaIntensity, 0.534 * sepiaIntensity, 1.0 - 0.869 * sepiaIntensity));\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\t#ifdef VIGNETTE\\r\\n\\r\\n\\t\\tconst vec2 center = vec2(0.5);\\r\\n\\r\\n\\t\\t#ifdef ESKIL\\r\\n\\r\\n\\t\\t\\tvec2 uv = (vUv - center) * vec2(vignetteOffset);\\r\\n\\t\\t\\tcolor = mix(color.rgb, vec3(1.0 - vignetteDarkness), dot(uv, uv));\\r\\n\\r\\n\\t\\t#else\\r\\n\\r\\n\\t\\t\\tfloat dist = distance(vUv, center);\\r\\n\\t\\t\\tcolor *= smoothstep(0.8, vignetteOffset * 0.799, dist * (vignetteDarkness + vignetteOffset));\\r\\n\\r\\n\\t\\t#endif\\t\\t\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\tgl_FragColor = vec4(clamp(color, 0.0, 1.0), texel.a);\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"varying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * A cinematic shader that provides the following effects:\r\n * - Film Grain\r\n * - Scanlines\r\n * - Vignette\r\n * - Greyscale\r\n * - Sepia\r\n *\r\n * Original scanlines algorithm by Pat \"Hawthorne\" Shearon.\r\n * http://www.truevision3d.com/forums/showcase/staticnoise_colorblackwhite_scanline_shaders-t18698.0.html\r\n *\r\n * Optimised scanlines and noise with intensity scaling by Georg \"Leviathan\"\r\n * Steinrohder. This version was provided under a Creative Commons Attribution\r\n * 3.0 License: http://creativecommons.org/licenses/by/3.0.\r\n *\r\n * The sepia effect is based on:\r\n * https://github.com/evanw/glfx.js\r\n *\r\n * The vignette code is based on PaintEffect postprocess from ro.me:\r\n * http://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js\r\n */\r\n\r\nexport class FilmMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new film material.\r\n\t *\r\n\t * @param {Object} [options] - The options. Disabled effects will not be included in the final shader and have no negative impact on performance.\r\n\t * @param {Boolean} [options.greyscale=false] - Enable greyscale effect. Greyscale and sepia are mutually exclusive.\r\n\t * @param {Boolean} [options.sepia=false] - Enable sepia effect. Greyscale and sepia are mutually exclusive.\r\n\t * @param {Boolean} [options.vignette=false] - Apply vignette effect.\r\n\t * @param {Boolean} [options.eskil=false] - Use Eskil's vignette approach. The default looks dusty while Eskil looks burned out.\r\n\t * @param {Boolean} [options.screenMode=true] - Whether the screen blend mode should be used for noise and scanlines. Both of these effects are computed independently.\r\n\t * @param {Boolean} [options.noise=true] - Show noise-based film grain.\r\n\t * @param {Boolean} [options.scanlines=true] - Show scanlines.\r\n\t * @param {Boolean} [options.grid=true] - Show a grid.\r\n\t * @param {Number} [options.noiseIntensity=0.5] - The noise intensity.\r\n\t * @param {Number} [options.scanlineIntensity=0.05] - The scanline intensity.\r\n\t * @param {Number} [options.gridIntensity=1.0] - The grid strength. 0.0 to 1.0.\r\n\t * @param {Number} [options.greyscaleIntensity=1.0] - The intensity of the greyscale effect. 0.0 to 1.0.\r\n\t * @param {Number} [options.sepiaIntensity=1.0] - The intensity of the sepia effect. 0.0 to 1.0.\r\n\t * @param {Number} [options.vignetteOffset=1.0] - The offset of the vignette effect. 0.0 to 1.0.\r\n\t * @param {Number} [options.vignetteDarkness=1.0] - The darkness of the vignette effect. 0.0 to 1.0.\r\n\t */\r\n\r\n\tconstructor(options = {}) {\r\n\r\n\t\tconst settings = Object.assign({\r\n\r\n\t\t\tscreenMode: true,\r\n\t\t\tnoise: true,\r\n\t\t\tscanlines: true,\r\n\t\t\tgrid: false,\r\n\r\n\t\t\tgreyscale: false,\r\n\t\t\tsepia: false,\r\n\t\t\tvignette: false,\r\n\t\t\teskil: false,\r\n\r\n\t\t\tnoiseIntensity: 0.5,\r\n\t\t\tscanlineIntensity: 0.05,\r\n\t\t\tgridIntensity: 1.0,\r\n\t\t\tgreyscaleIntensity: 1.0,\r\n\t\t\tsepiaIntensity: 1.0,\r\n\r\n\t\t\tvignetteOffset: 1.0,\r\n\t\t\tvignetteDarkness: 1.0\r\n\r\n\t\t}, options);\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"FilmMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\t\t\t\ttime: new Uniform(0.0),\r\n\r\n\t\t\t\tnoiseIntensity: new Uniform(settings.noiseIntensity),\r\n\t\t\t\tscanlineIntensity: new Uniform(settings.scanlineIntensity),\r\n\t\t\t\tgridIntensity: new Uniform(settings.gridIntensity),\r\n\r\n\t\t\t\tscanlineCount: new Uniform(0.0),\r\n\t\t\t\tgridScale: new Uniform(new Vector2()),\r\n\t\t\t\tgridLineWidth: new Uniform(0.0),\r\n\r\n\t\t\t\tgreyscaleIntensity: new Uniform(settings.greyscaleIntensity),\r\n\t\t\t\tsepiaIntensity: new Uniform(settings.sepiaIntensity),\r\n\r\n\t\t\t\tvignetteOffset: new Uniform(settings.vignetteOffset),\r\n\t\t\t\tvignetteDarkness: new Uniform(settings.vignetteDarkness)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t\tthis.setScreenModeEnabled(settings.screenMode);\r\n\t\tthis.setNoiseEnabled(settings.noise);\r\n\t\tthis.setScanlinesEnabled(settings.scanlines);\r\n\t\tthis.setGridEnabled(settings.grid);\r\n\t\tthis.setGreyscaleEnabled(settings.greyscale);\r\n\t\tthis.setSepiaEnabled(settings.sepia);\r\n\t\tthis.setVignetteEnabled(settings.vignette);\r\n\t\tthis.setEskilEnabled(settings.eskil);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Enables or disables the Screen blend mode.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the Screen blend mode should be enabled.\r\n\t */\r\n\r\n\tsetScreenModeEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.SCREEN_MODE = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.SCREEN_MODE;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Enables or disables the noise effect.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the noise effect should be enabled.\r\n\t */\r\n\r\n\tsetNoiseEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.NOISE = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.NOISE;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Enables or disables the scanlines effect.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the scanlines effect should be enabled.\r\n\t */\r\n\r\n\tsetScanlinesEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.SCANLINES = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.SCANLINES;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Enables or disables the grid effect.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the grid effect should be enabled.\r\n\t */\r\n\r\n\tsetGridEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.GRID = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.GRID;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Enables or disables the greyscale effect.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the greyscale effect should be enabled.\r\n\t */\r\n\r\n\tsetGreyscaleEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.GREYSCALE = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.GREYSCALE;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Enables or disables the sepia effect.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the sepia effect should be enabled.\r\n\t */\r\n\r\n\tsetSepiaEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.SEPIA = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.SEPIA;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Enables or disables the Vignette effect.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the Vignette effect should be enabled.\r\n\t */\r\n\r\n\tsetVignetteEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.VIGNETTE = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.VIGNETTE;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Enables or disables the Eskil Vignette effect.\r\n\t *\r\n\t * Has no effect if Vignette is disabled.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the Eskil Vignette effect should be enabled.\r\n\t */\r\n\r\n\tsetEskilEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.ESKIL = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.ESKIL;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform } from \"three\";\r\n\r\nconst fragment = \"uniform sampler2D tDiffuse;\\r\\nuniform sampler2D tPerturb;\\r\\n\\r\\nuniform bool active;\\r\\n\\r\\nuniform float amount;\\r\\nuniform float angle;\\r\\nuniform float seed;\\r\\nuniform float seedX;\\r\\nuniform float seedY;\\r\\nuniform float distortionX;\\r\\nuniform float distortionY;\\r\\nuniform float colS;\\r\\n\\r\\nvarying vec2 vUv;\\r\\n\\r\\nfloat rand(vec2 tc) {\\r\\n\\r\\n\\tconst float a = 12.9898;\\r\\n\\tconst float b = 78.233;\\r\\n\\tconst float c = 43758.5453;\\r\\n\\r\\n\\tfloat dt = dot(tc, vec2(a, b));\\r\\n\\tfloat sn = mod(dt, 3.14);\\r\\n\\r\\n\\treturn fract(sin(sn) * c);\\r\\n\\r\\n}\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec2 coord = vUv;\\r\\n\\r\\n\\tfloat xs, ys;\\r\\n\\tvec4 normal;\\r\\n\\r\\n\\tvec2 offset;\\r\\n\\tvec4 cr, cga, cb;\\r\\n\\tvec4 snow, color;\\r\\n\\r\\n\\tfloat sx, sy;\\r\\n\\r\\n\\tif(active) {\\r\\n\\r\\n\\t\\txs = floor(gl_FragCoord.x / 0.5);\\r\\n\\t\\tys = floor(gl_FragCoord.y / 0.5);\\r\\n\\r\\n\\t\\tnormal = texture2D(tPerturb, coord * seed * seed);\\r\\n\\r\\n\\t\\tif(coord.y < distortionX + colS && coord.y > distortionX - colS * seed) {\\r\\n\\r\\n\\t\\t\\tsx = clamp(ceil(seedX), 0.0, 1.0);\\r\\n\\t\\t\\tcoord.y = sx * (1.0 - (coord.y + distortionY)) + (1.0 - sx) * distortionY;\\r\\n\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tif(coord.x < distortionY + colS && coord.x > distortionY - colS * seed) {\\r\\n\\r\\n\\t\\t\\tsy = clamp(ceil(seedY), 0.0, 1.0);\\r\\n\\t\\t\\tcoord.x = sy * distortionX + (1.0 - sy) * (1.0 - (coord.x + distortionX));\\r\\n\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tcoord.x += normal.x * seedX * (seed / 5.0);\\r\\n\\t\\tcoord.y += normal.y * seedY * (seed / 5.0);\\r\\n\\r\\n\\t\\toffset = amount * vec2(cos(angle), sin(angle));\\r\\n\\r\\n\\t\\tcr = texture2D(tDiffuse, coord + offset);\\r\\n\\t\\tcga = texture2D(tDiffuse, coord);\\r\\n\\t\\tcb = texture2D(tDiffuse, coord - offset);\\r\\n\\r\\n\\t\\tcolor = vec4(cr.r, cga.g, cb.b, cga.a);\\r\\n\\t\\tsnow = 200.0 * amount * vec4(rand(vec2(xs * seed, ys * seed * 50.0)) * 0.2);\\r\\n\\t\\tcolor += snow;\\r\\n\\r\\n\\t} else {\\r\\n\\r\\n\\t\\tcolor = texture2D(tDiffuse, vUv);\\r\\n\\r\\n\\t}\\r\\n\\r\\n\\tgl_FragColor = color;\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"varying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * A glitch shader material.\r\n *\r\n * Reference:\r\n * https://github.com/staffantan/unityglitch\r\n */\r\n\r\nexport class GlitchMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new glitch material.\r\n\t */\r\n\r\n\tconstructor() {\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"GlitchMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\t\t\t\ttPerturb: new Uniform(null),\r\n\r\n\t\t\t\tactive: new Uniform(1),\r\n\r\n\t\t\t\tamount: new Uniform(0.8),\r\n\t\t\t\tangle: new Uniform(0.02),\r\n\t\t\t\tseed: new Uniform(0.02),\r\n\t\t\t\tseedX: new Uniform(0.02),\r\n\t\t\t\tseedY: new Uniform(0.02),\r\n\t\t\t\tdistortionX: new Uniform(0.5),\r\n\t\t\t\tdistortionY: new Uniform(0.6),\r\n\t\t\t\tcolS: new Uniform(0.05)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform } from \"three\";\r\n\r\nconst fragment = \"#include \\r\\n#include \\r\\n\\r\\nuniform sampler2D tDiffuse;\\r\\nuniform vec3 lightPosition;\\r\\n\\r\\nuniform float exposure;\\r\\nuniform float decay;\\r\\nuniform float density;\\r\\nuniform float weight;\\r\\nuniform float clampMax;\\r\\n\\r\\nvarying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec2 texCoord = vUv;\\r\\n\\r\\n\\t// Calculate vector from pixel to light source in screen space.\\r\\n\\tvec2 deltaTexCoord = texCoord - lightPosition.st;\\r\\n\\tdeltaTexCoord *= 1.0 / NUM_SAMPLES_FLOAT * density;\\r\\n\\r\\n\\t// A decreasing illumination factor.\\r\\n\\tfloat illuminationDecay = 1.0;\\r\\n\\r\\n\\tvec4 sample;\\r\\n\\tvec4 color = vec4(0.0);\\r\\n\\r\\n\\t// Estimate the probability of occlusion at each pixel by summing samples along a ray to the light source.\\r\\n\\tfor(int i = 0; i < NUM_SAMPLES_INT; ++i) {\\r\\n\\r\\n\\t\\ttexCoord -= deltaTexCoord;\\r\\n\\t\\tsample = texture2D(tDiffuse, texCoord);\\r\\n\\r\\n\\t\\t// Apply sample attenuation scale/decay factors.\\r\\n\\t\\tsample *= illuminationDecay * weight;\\r\\n\\r\\n\\t\\tcolor += sample;\\r\\n\\r\\n\\t\\t// Update exponential decay factor.\\r\\n\\t\\tilluminationDecay *= decay;\\r\\n\\r\\n\\t}\\r\\n\\r\\n\\tgl_FragColor = clamp(color * exposure, 0.0, clampMax);\\r\\n\\r\\n\\t#include \\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"varying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * A crepuscular rays shader material.\r\n *\r\n * This material supports dithering.\r\n *\r\n * References:\r\n *\r\n * Thibaut Despoulain, 2012:\r\n * [(WebGL) Volumetric Light Approximation in Three.js](\r\n * http://bkcore.com/blog/3d/webgl-three-js-volumetric-light-godrays.html)\r\n *\r\n * Nvidia, GPU Gems 3, 2008:\r\n * [Chapter 13. Volumetric Light Scattering as a Post-Process](\r\n * https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch13.html)\r\n */\r\n\r\nexport class GodRaysMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new god rays material.\r\n\t *\r\n\t * @param {Object} [options] - The options.\r\n\t * @param {Number} [options.density=0.96] - The density of the light rays.\r\n\t * @param {Number} [options.decay=0.93] - An illumination decay factor.\r\n\t * @param {Number} [options.weight=0.4] - A light ray weight factor.\r\n\t * @param {Number} [options.exposure=0.6] - A constant attenuation coefficient.\r\n\t * @param {Number} [options.clampMax=1.0] - An upper bound for the saturation of the overall effect.\r\n\t */\r\n\r\n\tconstructor(options = {}) {\r\n\r\n\t\tconst settings = Object.assign({\r\n\t\t\texposure: 0.6,\r\n\t\t\tdensity: 0.93,\r\n\t\t\tdecay: 0.96,\r\n\t\t\tweight: 0.4,\r\n\t\t\tclampMax: 1.0\r\n\t\t}, options);\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"GodRaysMaterial\",\r\n\r\n\t\t\tdefines: {\r\n\r\n\t\t\t\tNUM_SAMPLES_FLOAT: \"60.0\",\r\n\t\t\t\tNUM_SAMPLES_INT: \"60\"\r\n\r\n\t\t\t},\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\t\t\t\tlightPosition: new Uniform(null),\r\n\r\n\t\t\t\texposure: new Uniform(settings.exposure),\r\n\t\t\t\tdecay: new Uniform(settings.decay),\r\n\t\t\t\tdensity: new Uniform(settings.density),\r\n\t\t\t\tweight: new Uniform(settings.weight),\r\n\t\t\t\tclampMax: new Uniform(settings.clampMax)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform, Vector2 } from \"three\";\r\n\r\nconst fragment = \"#include \\r\\n\\r\\nuniform sampler2D tDiffuse;\\r\\nuniform float distinction;\\r\\nuniform vec2 range;\\r\\n\\r\\nvarying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec4 texel = texture2D(tDiffuse, vUv);\\r\\n\\tfloat l = linearToRelativeLuminance(texel.rgb);\\r\\n\\r\\n\\t#ifdef RANGE\\r\\n\\r\\n\\t\\tfloat low = step(range.x, l);\\r\\n\\t\\tfloat high = step(l, range.y);\\r\\n\\r\\n\\t\\t// Apply the mask.\\r\\n\\t\\tl *= low * high;\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\tl = pow(abs(l), distinction);\\r\\n\\r\\n\\t#ifdef COLOR\\r\\n\\r\\n\\t\\tgl_FragColor = vec4(texel.rgb * l, texel.a);\\r\\n\\r\\n\\t#else\\r\\n\\r\\n\\t\\tgl_FragColor = vec4(l, l, l, texel.a);\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"varying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * A luminosity shader material.\r\n *\r\n * This shader produces a greyscale luminance map that describes the absolute\r\n * amount of light emitted by a scene. It can also be configured to output\r\n * colours that are scaled with their respective luminance value. Additionally,\r\n * a range may be provided to mask out undesired texels.\r\n *\r\n * The alpha channel will remain unaffected in all cases.\r\n *\r\n * On luminance coefficients:\r\n * http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC9\r\n *\r\n * Coefficients for different colour spaces:\r\n * https://hsto.org/getpro/habr/post_images/2ab/69d/084/2ab69d084f9a597e032624bcd74d57a7.png\r\n *\r\n * Luminance range reference:\r\n * https://cycling74.com/2007/05/23/your-first-shader/#.Vty9FfkrL4Z\r\n */\r\n\r\nexport class LuminosityMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new luminosity material.\r\n\t *\r\n\t * @param {Boolean} [colorOutput=false] - Defines whether the shader should output colours scaled with their luminance value.\r\n\t * @param {Vector2} [luminanceRange] - If provided, the shader will mask out texels that aren't in the specified luminance range.\r\n\t */\r\n\r\n\tconstructor(colorOutput = false, luminanceRange = null) {\r\n\r\n\t\tconst maskLuminance = (luminanceRange !== null);\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"LuminosityMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\t\t\t\tdistinction: new Uniform(1.0),\r\n\t\t\t\trange: new Uniform(maskLuminance ? luminanceRange : new Vector2())\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex\r\n\r\n\t\t});\r\n\r\n\t\tthis.setColorOutputEnabled(colorOutput);\r\n\t\tthis.setLuminanceRangeEnabled(maskLuminance);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Enables or disables color output.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether color output should be enabled.\r\n\t */\r\n\r\n\tsetColorOutputEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.COLOR = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.COLOR;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Enables or disables the luminance mask.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the luminance mask should be enabled.\r\n\t */\r\n\r\n\tsetLuminanceRangeEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.RANGE = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.RANGE;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n}\r\n","import { Color, ShaderMaterial, Uniform } from \"three\";\r\n\r\nconst fragment = \"uniform sampler2D tDiffuse;\\r\\nuniform sampler2D tMask;\\r\\nuniform sampler2D tEdges;\\r\\n\\r\\nuniform vec3 visibleEdgeColor;\\r\\nuniform vec3 hiddenEdgeColor;\\r\\nuniform float pulse;\\r\\nuniform float edgeStrength;\\r\\n\\r\\n#ifdef USE_PATTERN\\r\\n\\r\\n\\tuniform sampler2D tPattern;\\r\\n\\tvarying vec2 vPatternCoord;\\r\\n\\r\\n#endif\\r\\n\\r\\nvarying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec4 color = texture2D(tDiffuse, vUv);\\r\\n\\tvec2 edge = texture2D(tEdges, vUv).rg;\\r\\n\\tvec2 mask = texture2D(tMask, vUv).rg;\\r\\n\\r\\n\\t#ifndef X_RAY\\r\\n\\r\\n\\t\\tedge.y = 0.0;\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\tedge *= (edgeStrength * mask.x * pulse);\\r\\n\\tvec3 outlineColor = edge.x * visibleEdgeColor + edge.y * hiddenEdgeColor;\\r\\n\\r\\n\\t#ifdef ALPHA_BLENDING\\r\\n\\r\\n\\t\\tcolor.rgb = mix(color.rgb, outlineColor, max(edge.x, edge.y));\\r\\n\\r\\n\\t#else\\r\\n\\r\\n\\t\\tcolor.rgb += outlineColor;\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\t#ifdef USE_PATTERN\\r\\n\\r\\n\\t\\tvec3 patternColor = texture2D(tPattern, vPatternCoord).rgb;\\r\\n\\r\\n\\t\\t#ifdef X_RAY\\r\\n\\r\\n\\t\\t\\tfloat hiddenFactor = 0.5;\\r\\n\\r\\n\\t\\t#else\\r\\n\\r\\n\\t\\t\\tfloat hiddenFactor = 0.0;\\r\\n\\r\\n\\t\\t#endif\\r\\n\\r\\n\\t\\tfloat visibilityFactor = (1.0 - mask.y > 0.0) ? 1.0 : hiddenFactor;\\r\\n\\r\\n\\t\\tcolor.rgb += visibilityFactor * (1.0 - mask.x) * (1.0 - patternColor);\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\tgl_FragColor = color;\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"#ifdef USE_PATTERN\\r\\n\\r\\n\\tuniform float aspect;\\r\\n\\tuniform float patternScale;\\r\\n\\tvarying vec2 vPatternCoord;\\r\\n\\r\\n#endif\\r\\n\\r\\nvarying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\t#ifdef USE_PATTERN\\r\\n\\r\\n\\t\\tvec2 aspectCorrection = vec2(aspect, 1.0);\\r\\n\\t\\tvPatternCoord = uv * aspectCorrection * patternScale;\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * An outline blend shader material.\r\n */\r\n\r\nexport class OutlineBlendMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new outline blend material.\r\n\t *\r\n\t * @param {Object} [options] - The options.\r\n\t * @param {Number} [options.edgeStrength=1.0] - The edge strength.\r\n\t * @param {Number} [options.patternScale=1.0] - The scale of the pattern texture.\r\n\t * @param {Number} [options.visibleEdgeColor=0xffffff] - The color of visible edges.\r\n\t * @param {Number} [options.hiddenEdgeColor=0x22090A] - The color of hidden edges.\r\n\t * @param {Boolean} [alphaBlending=false] - Whether the outline should be blended using alpha.\r\n\t * @param {Boolean} [xRay=true] - Whether hidden parts of selected objects should be visible.\r\n\t */\r\n\r\n\tconstructor(options = {}) {\r\n\r\n\t\tconst settings = Object.assign({\r\n\t\t\tedgeStrength: 1.0,\r\n\t\t\tpatternScale: 1.0,\r\n\t\t\tvisibleEdgeColor: 0xffffff,\r\n\t\t\thiddenEdgeColor: 0x22090A,\r\n\t\t\talphaBlending: false,\r\n\t\t\txRay: true\r\n\t\t}, options);\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"OutlineBlendMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\tpulse: new Uniform(1.0),\r\n\t\t\t\taspect: new Uniform(1.0),\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\t\t\t\ttMask: new Uniform(null),\r\n\t\t\t\ttEdges: new Uniform(null),\r\n\t\t\t\ttPattern: new Uniform(null),\r\n\r\n\t\t\t\tedgeStrength: new Uniform(settings.edgeStrength),\r\n\t\t\t\tpatternScale: new Uniform(settings.patternScale),\r\n\r\n\t\t\t\tvisibleEdgeColor: new Uniform(new Color(settings.visibleEdgeColor)),\r\n\t\t\t\thiddenEdgeColor: new Uniform(new Color(settings.hiddenEdgeColor))\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t\tthis.setAlphaBlendingEnabled(settings.alphaBlending);\r\n\t\tthis.setXRayEnabled(settings.xRay);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Enables or disables the alpha blending.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the alpha blending should be enabled.\r\n\t */\r\n\r\n\tsetAlphaBlendingEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.ALPHA_BLENDING = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.ALPHA_BLENDING;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Defines whether hidden parts of selected objects should be visible.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether hidden parts of selected objects should be visible.\r\n\t */\r\n\r\n\tsetXRayEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.X_RAY = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.X_RAY;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Sets a pattern texture to use as overlay.\r\n\t *\r\n\t * @param {Texture} [texture=null] - A pattern texture. Set to null to disable the pattern.\r\n\t */\r\n\r\n\tsetPatternTexture(texture = null) {\r\n\r\n\t\tif(texture !== null) {\r\n\r\n\t\t\tthis.defines.USE_PATTERN = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.USE_PATTERN;\r\n\r\n\t\t}\r\n\r\n\t\tthis.uniforms.tPattern.value = texture;\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform, Vector2 } from \"three\";\r\n\r\nconst fragment = \"uniform sampler2D tMask;\\r\\n\\r\\nvarying vec2 vUv0;\\r\\nvarying vec2 vUv1;\\r\\nvarying vec2 vUv2;\\r\\nvarying vec2 vUv3;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec2 c0 = texture2D(tMask, vUv0).rg;\\r\\n\\tvec2 c1 = texture2D(tMask, vUv1).rg;\\r\\n\\tvec2 c2 = texture2D(tMask, vUv2).rg;\\r\\n\\tvec2 c3 = texture2D(tMask, vUv3).rg;\\r\\n\\r\\n\\tfloat d0 = (c0.x - c1.x) * 0.5;\\r\\n\\tfloat d1 = (c2.x - c3.x) * 0.5;\\r\\n\\tfloat d = length(vec2(d0, d1));\\r\\n\\r\\n\\tfloat a0 = min(c0.y, c1.y);\\r\\n\\tfloat a1 = min(c2.y, c3.y);\\r\\n\\tfloat visibilityFactor = min(a0, a1);\\r\\n\\r\\n\\tgl_FragColor.rg = (1.0 - visibilityFactor > 0.001) ? vec2(d, 0.0) : vec2(0.0, d);\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"uniform vec2 texelSize;\\r\\n\\r\\nvarying vec2 vUv0;\\r\\nvarying vec2 vUv1;\\r\\nvarying vec2 vUv2;\\r\\nvarying vec2 vUv3;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv0 = vec2(uv.x + texelSize.x, uv.y);\\r\\n\\tvUv1 = vec2(uv.x - texelSize.x, uv.y);\\r\\n\\tvUv2 = vec2(uv.x, uv.y + texelSize.y);\\r\\n\\tvUv3 = vec2(uv.x, uv.y - texelSize.y);\\r\\n\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * An outline edge detection shader material.\r\n */\r\n\r\nexport class OutlineEdgesMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new outline edge detection material.\r\n\t *\r\n\t * @param {Vector2} [texelSize] - The absolute screen texel size.\r\n\t */\r\n\r\n\tconstructor(texelSize = new Vector2()) {\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"OutlineEdgesMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttMask: new Uniform(null),\r\n\t\t\t\ttexelSize: new Uniform(new Vector2())\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t\tthis.setTexelSize(texelSize.x, texelSize.y);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the texel size.\r\n\t *\r\n\t * @param {Number} x - The texel width.\r\n\t * @param {Number} y - The texel height.\r\n\t */\r\n\r\n\tsetTexelSize(x, y) {\r\n\r\n\t\tthis.uniforms.texelSize.value.set(x, y);\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform, Vector2 } from \"three\";\r\n\r\nconst fragment = \"uniform sampler2D tDiffuse;\\r\\nuniform float granularity;\\r\\nuniform float dx;\\r\\nuniform float dy;\\r\\n\\r\\nvarying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec4 texel;\\r\\n\\r\\n\\tif(granularity > 0.0) {\\r\\n\\r\\n\\t\\tvec2 coord = vec2(\\r\\n\\t\\t\\tdx * (floor(vUv.x / dx) + 0.5),\\r\\n\\t\\t\\tdy * (floor(vUv.y / dy) + 0.5)\\r\\n\\t\\t);\\r\\n\\r\\n\\t\\ttexel = texture2D(tDiffuse, coord);\\r\\n\\r\\n\\t} else {\\r\\n\\r\\n\\t\\ttexel = texture2D(tDiffuse, vUv);\\r\\n\\r\\n\\t}\\r\\n\\r\\n\\tgl_FragColor = texel;\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"varying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * A pixelation shader material.\r\n *\r\n * Original shader code by Robert Casanova:\r\n * https://github.com/robertcasanova/pixelate-shader\r\n */\r\n\r\nexport class PixelationMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new pixelation material.\r\n\t */\r\n\r\n\tconstructor() {\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"PixelationMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\t\t\t\tgranularity: new Uniform(1.0),\r\n\t\t\t\tresolution: new Uniform(new Vector2(1.0, 1.0)),\r\n\t\t\t\tdx: new Uniform(1.0),\r\n\t\t\t\tdy: new Uniform(1.0)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The pixel granularity.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tget granularity() {\r\n\r\n\t\treturn this.uniforms.granularity.value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * A higher value yields coarser visuals.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tset granularity(x) {\r\n\r\n\t\tconst uniforms = this.uniforms;\r\n\t\tconst resolution = uniforms.resolution.value;\r\n\r\n\t\tuniforms.granularity.value = x;\r\n\t\tuniforms.dx.value = x / resolution.x;\r\n\t\tuniforms.dy.value = x / resolution.y;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the resolution.\r\n\t *\r\n\t * @param {Number} width - The width.\r\n\t * @param {Number} height - The height.\r\n\t */\r\n\r\n\tsetResolution(width, height) {\r\n\r\n\t\tthis.uniforms.resolution.value.set(width, height);\r\n\t\tthis.granularity = this.granularity;\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform, Vector2 } from \"three\";\r\n\r\nconst fragment = \"#include \\r\\n\\r\\nuniform sampler2D tDiffuse;\\r\\nuniform sampler2D tDepth;\\r\\n\\r\\nuniform vec2 texelSize;\\r\\nuniform vec2 halfTexelSize;\\r\\n\\r\\nuniform float cameraNear;\\r\\nuniform float cameraFar;\\r\\n\\r\\nuniform float focalLength;\\r\\nuniform float focalStop;\\r\\n\\r\\nuniform float maxBlur;\\r\\nuniform float luminanceThreshold;\\r\\nuniform float luminanceGain;\\r\\nuniform float bias;\\r\\nuniform float fringe;\\r\\nuniform float ditherStrength;\\r\\n\\r\\n#ifdef SHADER_FOCUS\\r\\n\\r\\n\\tuniform vec2 focusCoords;\\r\\n\\r\\n#else\\r\\n\\r\\n\\tuniform float focalDepth;\\r\\n\\r\\n#endif\\r\\n\\r\\nvarying vec2 vUv;\\r\\n\\r\\n#ifndef USE_LOGDEPTHBUF\\r\\n\\r\\n\\t#include \\r\\n\\r\\n\\tfloat readDepth(sampler2D depthSampler, vec2 coord) {\\r\\n\\r\\n\\t\\tfloat fragCoordZ = texture2D(depthSampler, coord).x;\\r\\n\\t\\tfloat viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\\r\\n\\r\\n\\t\\treturn viewZToOrthographicDepth(viewZ, cameraNear, cameraFar);\\r\\n\\r\\n\\t}\\r\\n\\r\\n#endif\\r\\n\\r\\n#ifdef PENTAGON\\r\\n\\r\\n\\tfloat penta(vec2 coords) {\\r\\n\\r\\n\\t\\tconst vec4 HS0 = vec4( 1.0, 0.0, 0.0, 1.0);\\r\\n\\t\\tconst vec4 HS1 = vec4( 0.309016994, 0.951056516, 0.0, 1.0);\\r\\n\\t\\tconst vec4 HS2 = vec4(-0.809016994, 0.587785252, 0.0, 1.0);\\r\\n\\t\\tconst vec4 HS3 = vec4(-0.809016994, -0.587785252, 0.0, 1.0);\\r\\n\\t\\tconst vec4 HS4 = vec4( 0.309016994, -0.951056516, 0.0, 1.0);\\r\\n\\t\\tconst vec4 HS5 = vec4( 0.0, 0.0, 1.0, 1.0);\\r\\n\\r\\n\\t\\tconst vec4 ONE = vec4(1.0);\\r\\n\\r\\n\\t\\tconst float P_FEATHER = 0.4;\\r\\n\\t\\tconst float N_FEATHER = -P_FEATHER;\\r\\n\\r\\n\\t\\tfloat inOrOut = -4.0;\\r\\n\\r\\n\\t\\tvec4 P = vec4(coords, vec2(RINGS_FLOAT - 1.3));\\r\\n\\r\\n\\t\\tvec4 dist = vec4(\\r\\n\\t\\t\\tdot(P, HS0),\\r\\n\\t\\t\\tdot(P, HS1),\\r\\n\\t\\t\\tdot(P, HS2),\\r\\n\\t\\t\\tdot(P, HS3)\\r\\n\\t\\t);\\r\\n\\r\\n\\t\\tdist = smoothstep(N_FEATHER, P_FEATHER, dist);\\r\\n\\r\\n\\t\\tinOrOut += dot(dist, ONE);\\r\\n\\r\\n\\t\\tdist.x = dot(P, HS4);\\r\\n\\t\\tdist.y = HS5.w - abs(P.z);\\r\\n\\r\\n\\t\\tdist = smoothstep(N_FEATHER, P_FEATHER, dist);\\r\\n\\t\\tinOrOut += dist.x;\\r\\n\\r\\n\\t\\treturn clamp(inOrOut, 0.0, 1.0);\\r\\n\\r\\n\\t}\\r\\n\\r\\n#endif\\r\\n\\r\\n#ifdef SHOW_FOCUS\\r\\n\\r\\n\\tvec3 debugFocus(vec3 c, float blur, float depth) {\\r\\n\\r\\n\\t\\tfloat edge = 0.002 * depth;\\r\\n\\t\\tfloat m = clamp(smoothstep(0.0, edge, blur), 0.0, 1.0);\\r\\n\\t\\tfloat e = clamp(smoothstep(1.0 - edge, 1.0, blur), 0.0, 1.0);\\r\\n\\r\\n\\t\\tc = mix(c, vec3(1.0, 0.5, 0.0), (1.0 - m) * 0.6);\\r\\n\\t\\tc = mix(c, vec3(0.0, 0.5, 1.0), ((1.0 - e) - (1.0 - m)) * 0.2);\\r\\n\\r\\n\\t\\treturn c;\\r\\n\\r\\n\\t}\\r\\n\\r\\n#endif\\r\\n\\r\\n#ifdef VIGNETTE\\r\\n\\r\\n\\tfloat vignette() {\\r\\n\\r\\n\\t\\tconst vec2 CENTER = vec2(0.5);\\r\\n\\r\\n\\t\\tconst float VIGNETTE_OUT = 1.3;\\r\\n\\t\\tconst float VIGNETTE_IN = 0.0;\\r\\n\\t\\tconst float VIGNETTE_FADE = 22.0; \\r\\n\\r\\n\\t\\tfloat d = distance(vUv, CENTER);\\r\\n\\t\\td = smoothstep(VIGNETTE_OUT + (focalStop / VIGNETTE_FADE), VIGNETTE_IN + (focalStop / VIGNETTE_FADE), d);\\r\\n\\r\\n\\t\\treturn clamp(d, 0.0, 1.0);\\r\\n\\r\\n\\t}\\r\\n\\r\\n#endif\\r\\n\\r\\nvec2 rand2(vec2 coord) {\\r\\n\\r\\n\\tvec2 noise;\\r\\n\\r\\n\\t#ifdef NOISE\\r\\n\\r\\n\\t\\tconst float a = 12.9898;\\r\\n\\t\\tconst float b = 78.233;\\r\\n\\t\\tconst float c = 43758.5453;\\r\\n\\r\\n\\t\\tnoise.x = clamp(fract(sin(mod(dot(coord, vec2(a, b)), 3.14)) * c), 0.0, 1.0) * 2.0 - 1.0;\\r\\n\\t\\tnoise.y = clamp(fract(sin(mod(dot(coord, vec2(a, b) * 2.0), 3.14)) * c), 0.0, 1.0) * 2.0 - 1.0;\\r\\n\\r\\n\\t#else\\r\\n\\r\\n\\t\\tnoise.x = ((fract(1.0 - coord.s * halfTexelSize.x) * 0.25) + (fract(coord.t * halfTexelSize.y) * 0.75)) * 2.0 - 1.0;\\r\\n\\t\\tnoise.y = ((fract(1.0 - coord.s * halfTexelSize.x) * 0.75) + (fract(coord.t * halfTexelSize.y) * 0.25)) * 2.0 - 1.0;\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\treturn noise;\\r\\n\\r\\n}\\r\\n\\r\\nvec3 processTexel(vec2 coords, float blur) {\\r\\n\\r\\n\\tvec3 c;\\r\\n\\tc.r = texture2D(tDiffuse, coords + vec2(0.0, 1.0) * texelSize * fringe * blur).r;\\r\\n\\tc.g = texture2D(tDiffuse, coords + vec2(-0.866, -0.5) * texelSize * fringe * blur).g;\\r\\n\\tc.b = texture2D(tDiffuse, coords + vec2(0.866, -0.5) * texelSize * fringe * blur).b;\\r\\n\\r\\n\\t// Calculate the luminance of the constructed colour.\\r\\n\\tfloat luminance = linearToRelativeLuminance(c);\\r\\n\\tfloat threshold = max((luminance - luminanceThreshold) * luminanceGain, 0.0);\\r\\n\\r\\n\\treturn c + mix(vec3(0.0), c, threshold * blur);\\r\\n\\r\\n}\\r\\n\\r\\nfloat linearize(float depth) {\\r\\n\\r\\n\\treturn -cameraFar * cameraNear / (depth * (cameraFar - cameraNear) - cameraFar);\\r\\n\\r\\n}\\r\\n\\r\\nfloat gather(float i, float j, float ringSamples, inout vec3 color, float w, float h, float blur) {\\r\\n\\r\\n\\tconst float TWO_PI = 6.28318531;\\r\\n\\r\\n\\tfloat step = TWO_PI / ringSamples;\\r\\n\\tfloat pw = cos(j * step) * i;\\r\\n\\tfloat ph = sin(j * step) * i;\\r\\n\\r\\n\\t#ifdef PENTAGON\\r\\n\\r\\n\\t\\tfloat p = penta(vec2(pw, ph));\\r\\n\\r\\n\\t#else\\r\\n\\r\\n\\t\\tfloat p = 1.0;\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\tcolor += processTexel(vUv + vec2(pw * w, ph * h), blur) * mix(1.0, i / RINGS_FLOAT, bias) * p;\\r\\n\\r\\n\\treturn mix(1.0, i / RINGS_FLOAT, bias) * p;\\r\\n\\r\\n}\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\t#ifdef USE_LOGDEPTHBUF\\r\\n\\r\\n\\t\\tfloat depth = linearize(texture2D(tDepth, vUv).x);\\r\\n\\r\\n\\t#else\\r\\n\\r\\n\\t\\tfloat depth = linearize(readDepth(tDepth, vUv));\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\t#ifdef SHADER_FOCUS\\r\\n\\r\\n\\t\\t#ifdef USE_LOGDEPTHBUF\\r\\n\\r\\n\\t\\t\\tfloat fDepth = linearize(texture2D(tDepth, focusCoords).x);\\r\\n\\r\\n\\t\\t#else\\r\\n\\r\\n\\t\\t\\tfloat fDepth = linearize(readDepth(tDepth, focusCoords));\\r\\n\\r\\n\\t\\t#endif\\r\\n\\r\\n\\t#else\\r\\n\\r\\n\\t\\tfloat fDepth = focalDepth;\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\t#ifdef MANUAL_DOF\\r\\n\\r\\n\\t\\tconst float nDoFStart = 1.0; \\r\\n\\t\\tconst float nDoFDist = 2.0;\\r\\n\\t\\tconst float fDoFStart = 1.0;\\r\\n\\t\\tconst float fDoFDist = 3.0;\\r\\n\\r\\n\\t\\tfloat focalPlane = depth - fDepth;\\r\\n\\t\\tfloat farDoF = (focalPlane - fDoFStart) / fDoFDist;\\r\\n\\t\\tfloat nearDoF = (-focalPlane - nDoFStart) / nDoFDist;\\r\\n\\r\\n\\t\\tfloat blur = (focalPlane > 0.0) ? farDoF : nearDoF;\\r\\n\\r\\n\\t#else\\r\\n\\r\\n\\t\\tconst float CIRCLE_OF_CONFUSION = 0.03; // 35mm film = 0.03mm CoC.\\r\\n\\r\\n\\t\\tfloat focalPlaneMM = fDepth * 1000.0;\\r\\n\\t\\tfloat depthMM = depth * 1000.0;\\r\\n\\r\\n\\t\\tfloat focalPlane = (depthMM * focalLength) / (depthMM - focalLength);\\r\\n\\t\\tfloat farDoF = (focalPlaneMM * focalLength) / (focalPlaneMM - focalLength);\\r\\n\\t\\tfloat nearDoF = (focalPlaneMM - focalLength) / (focalPlaneMM * focalStop * CIRCLE_OF_CONFUSION);\\r\\n\\r\\n\\t\\tfloat blur = abs(focalPlane - farDoF) * nearDoF;\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\tblur = clamp(blur, 0.0, 1.0);\\r\\n\\r\\n\\t// Dithering.\\r\\n\\tvec2 noise = rand2(vUv) * ditherStrength * blur;\\r\\n\\r\\n\\tfloat blurFactorX = texelSize.x * blur * maxBlur + noise.x;\\r\\n\\tfloat blurFactorY = texelSize.y * blur * maxBlur + noise.y;\\r\\n\\r\\n\\tconst int MAX_RING_SAMPLES = RINGS_INT * SAMPLES_INT;\\r\\n\\r\\n\\t// Calculation of final color.\\r\\n\\tvec4 color;\\r\\n\\r\\n\\tif(blur < 0.05) {\\r\\n\\r\\n\\t\\tcolor = texture2D(tDiffuse, vUv);\\r\\n\\r\\n\\t} else {\\r\\n\\r\\n\\t\\tcolor = texture2D(tDiffuse, vUv);\\r\\n\\r\\n\\t\\tfloat s = 1.0;\\r\\n\\t\\tint ringSamples;\\r\\n\\r\\n\\t\\tfor(int i = 1; i <= RINGS_INT; ++i) {\\r\\n\\r\\n\\t\\t\\tringSamples = i * SAMPLES_INT;\\r\\n\\r\\n\\t\\t\\t// Constant loop.\\r\\n\\t\\t\\tfor(int j = 0; j < MAX_RING_SAMPLES; ++j) {\\r\\n\\r\\n\\t\\t\\t\\t// Break earlier.\\r\\n\\t\\t\\t\\tif(j >= ringSamples) { break; }\\r\\n\\r\\n\\t\\t\\t\\ts += gather(float(i), float(j), float(ringSamples), color.rgb, blurFactorX, blurFactorY, blur);\\r\\n\\r\\n\\t\\t\\t}\\r\\n\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\tcolor.rgb /= s; // Divide by sample count.\\r\\n\\r\\n\\t}\\r\\n\\r\\n\\t#ifdef SHOW_FOCUS\\r\\n\\r\\n\\t\\tcolor.rgb = debugFocus(color.rgb, blur, depth);\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\t#ifdef VIGNETTE\\r\\n\\r\\n\\t\\tcolor.rgb *= vignette();\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\tgl_FragColor = color;\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"varying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * Depth of Field shader v2.4.\r\n *\r\n * Original shader code by Martins Upitis:\r\n * http://blenderartists.org/forum/showthread.php?237488-GLSL-depth-of-field-with-bokeh-v2-4-(update)\r\n */\r\n\r\nexport class RealisticBokehMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new bokeh2 material.\r\n\t *\r\n\t * @param {PerspectiveCamera} [camera] - The main camera.\r\n\t * @param {Object} [options] - Additional options.\r\n\t * @param {Vector2} [options.texelSize] - The absolute screen texel size.\r\n\t * @param {Boolean} [options.rings=3] - The number of blurring iterations.\r\n\t * @param {Boolean} [options.samples=2] - The amount of samples taken per ring.\r\n\t * @param {Boolean} [options.showFocus=false] - Whether the focus point should be highlighted.\r\n\t * @param {Boolean} [options.manualDoF=false] - Enables manual depth of field blur.\r\n\t * @param {Boolean} [options.vignette=false] - Enables a vignette effect.\r\n\t * @param {Boolean} [options.pentagon=false] - Enable to use a pentagonal shape to scale gathered texels.\r\n\t * @param {Boolean} [options.shaderFocus=true] - Disable if you compute your own focalDepth (in metres!).\r\n\t * @param {Boolean} [options.noise=true] - Disable if you don't want noise patterns for dithering.\r\n\t * @param {Number} [options.maxBlur=1.0] - The maximum blur strength.\r\n\t * @param {Number} [options.luminanceThreshold=0.5] - A luminance threshold.\r\n\t * @param {Number} [options.luminanceGain=2.0] - A luminance gain factor.\r\n\t * @param {Number} [options.bias=0.5] - A blur bias.\r\n\t * @param {Number} [options.fringe=0.7] - A blur offset.\r\n\t * @param {Number} [options.ditherStrength=0.0001] - The dither strength.\r\n\t */\r\n\r\n\tconstructor(camera = null, options = {}) {\r\n\r\n\t\tconst settings = Object.assign({\r\n\t\t\ttexelSize: null,\r\n\t\t\trings: 3,\r\n\t\t\tsamples: 2,\r\n\t\t\tshowFocus: false,\r\n\t\t\tmanualDoF: false,\r\n\t\t\tvignette: false,\r\n\t\t\tpentagon: false,\r\n\t\t\tshaderFocus: true,\r\n\t\t\tnoise: true,\r\n\t\t\tmaxBlur: 1.0,\r\n\t\t\tluminanceThreshold: 0.5,\r\n\t\t\tluminanceGain: 2.0,\r\n\t\t\tbias: 0.5,\r\n\t\t\tfringe: 0.7,\r\n\t\t\tditherStrength: 0.0001\r\n\t\t}, options);\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"RealisticBokehMaterial\",\r\n\r\n\t\t\tdefines: {\r\n\r\n\t\t\t\tRINGS_INT: settings.rings.toFixed(0),\r\n\t\t\t\tRINGS_FLOAT: settings.rings.toFixed(1),\r\n\t\t\t\tSAMPLES_INT: settings.samples.toFixed(0),\r\n\t\t\t\tSAMPLES_FLOAT: settings.samples.toFixed(1)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\t\t\t\ttDepth: new Uniform(null),\r\n\r\n\t\t\t\ttexelSize: new Uniform(new Vector2()),\r\n\t\t\t\thalfTexelSize: new Uniform(new Vector2()),\r\n\r\n\t\t\t\tcameraNear: new Uniform(0.1),\r\n\t\t\t\tcameraFar: new Uniform(2000),\r\n\r\n\t\t\t\tfocalLength: new Uniform(24.0),\r\n\t\t\t\tfocalStop: new Uniform(0.9),\r\n\r\n\t\t\t\tmaxBlur: new Uniform(settings.maxBlur),\r\n\t\t\t\tluminanceThreshold: new Uniform(settings.luminanceThreshold),\r\n\t\t\t\tluminanceGain: new Uniform(settings.luminanceGain),\r\n\t\t\t\tbias: new Uniform(settings.bias),\r\n\t\t\t\tfringe: new Uniform(settings.fringe),\r\n\t\t\t\tditherStrength: new Uniform(settings.ditherStrength),\r\n\r\n\t\t\t\tfocusCoords: new Uniform(new Vector2(0.5, 0.5)),\r\n\t\t\t\tfocalDepth: new Uniform(1.0)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t\tthis.setShowFocusEnabled(settings.showFocus);\r\n\t\tthis.setManualDepthOfFieldEnabled(settings.manualDoF);\r\n\t\tthis.setVignetteEnabled(settings.vignette);\r\n\t\tthis.setPentagonEnabled(settings.pentagon);\r\n\t\tthis.setShaderFocusEnabled(settings.shaderFocus);\r\n\t\tthis.setNoiseEnabled(settings.noise);\r\n\r\n\t\tif(settings.texelSize !== null) {\r\n\r\n\t\t\tthis.setTexelSize(settings.texelSize.x, settings.texelSize.y);\r\n\r\n\t\t}\r\n\r\n\t\tthis.adoptCameraSettings(camera);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Defines whether the focus should be shown.\r\n\t *\r\n\t * @param {Boolean} enabled - True if the focus should be shown, false otherwise.\r\n\t */\r\n\r\n\tsetShowFocusEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.SHOW_FOCUS = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.SHOW_FOCUS;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Defines whether manual Depth of Field should be enabled.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether manual DoF should be enabled.\r\n\t */\r\n\r\n\tsetManualDepthOfFieldEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.MANUAL_DOF = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.MANUAL_DOF;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Defines whether the Vignette effect should be enabled.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the Vignette effect should be enabled.\r\n\t */\r\n\r\n\tsetVignetteEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.VIGNETTE = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.VIGNETTE;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Defines whether the pentagonal blur effect should be enabled.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the pentagonal blur effect should be enabled.\r\n\t */\r\n\r\n\tsetPentagonEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.PENTAGON = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.PENTAGON;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Enables or disables the automatic shader focus.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether the shader focus should be enabled.\r\n\t */\r\n\r\n\tsetShaderFocusEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.SHADER_FOCUS = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.SHADER_FOCUS;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Defines whether the dithering should compute noise.\r\n\t *\r\n\t * @param {Boolean} enabled - Whether noise-based dithering should be enabled.\r\n\t */\r\n\r\n\tsetNoiseEnabled(enabled) {\r\n\r\n\t\tif(enabled) {\r\n\r\n\t\t\tthis.defines.NOISE = \"1\";\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.defines.NOISE;\r\n\r\n\t\t}\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the texel size.\r\n\t *\r\n\t * @param {Number} x - The texel width.\r\n\t * @param {Number} y - The texel height.\r\n\t */\r\n\r\n\tsetTexelSize(x, y) {\r\n\r\n\t\tthis.uniforms.texelSize.value.set(x, y);\r\n\t\tthis.uniforms.halfTexelSize.value.set(x, y).multiplyScalar(0.5);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Adopts the near and far plane and the focal length of the given camera.\r\n\t *\r\n\t * @param {PerspectiveCamera} camera - The main camera.\r\n\t */\r\n\r\n\tadoptCameraSettings(camera) {\r\n\r\n\t\tif(camera !== null) {\r\n\r\n\t\t\tthis.uniforms.cameraNear.value = camera.near;\r\n\t\t\tthis.uniforms.cameraFar.value = camera.far;\r\n\t\t\tthis.uniforms.focalLength.value = camera.getFocalLength(); // unit: mm.\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform, Vector2 } from \"three\";\r\n\r\nconst fragment = \"#include \\r\\n\\r\\nuniform sampler2D tDiffuse;\\r\\nuniform vec2 center;\\r\\nuniform float aspect;\\r\\nuniform float waveSize;\\r\\nuniform float radius;\\r\\nuniform float maxRadius;\\r\\nuniform float amplitude;\\r\\n\\r\\nvarying vec2 vUv;\\r\\nvarying float vSize;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec2 aspectCorrection = vec2(aspect, 1.0);\\r\\n\\r\\n\\tvec2 difference = vUv * aspectCorrection - center * aspectCorrection;\\r\\n\\tfloat distance = sqrt(dot(difference, difference)) * vSize;\\r\\n\\r\\n\\tvec2 displacement = vec2(0.0);\\r\\n\\r\\n\\tif(distance > radius) {\\r\\n\\r\\n\\t\\tif(distance < radius + waveSize) {\\r\\n\\r\\n\\t\\t\\tfloat angle = (distance - radius) * PI2 / waveSize;\\r\\n\\t\\t\\tfloat cosSin = (1.0 - cos(angle)) * 0.5;\\r\\n\\r\\n\\t\\t\\tfloat extent = maxRadius + waveSize;\\r\\n\\t\\t\\tfloat decay = max(extent - distance * distance, 0.0) / extent;\\r\\n\\r\\n\\t\\t\\tdisplacement = ((cosSin * amplitude * difference) / distance) * decay;\\r\\n\\r\\n\\t\\t}\\r\\n\\r\\n\\t}\\r\\n\\r\\n\\tgl_FragColor = texture2D(tDiffuse, vUv - displacement);\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"uniform float size;\\r\\nuniform float scale;\\r\\nuniform float cameraDistance;\\r\\n\\r\\nvarying vec2 vUv;\\r\\nvarying float vSize;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\tvSize = (0.1 * cameraDistance) / size;\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * A shock wave shader material.\r\n *\r\n * Based on a Gist by Jean-Philippe Sarda:\r\n * https://gist.github.com/jpsarda/33cea67a9f2ecb0a0eda\r\n */\r\n\r\nexport class ShockWaveMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new shock wave material.\r\n\t *\r\n\t * @param {Object} [options] - The options.\r\n\t * @param {Number} [options.waveSize=0.2] - The wave size.\r\n\t * @param {Number} [options.amplitude=0.05] - The distortion amplitude.\r\n\t */\r\n\r\n\tconstructor(options = {}) {\r\n\r\n\t\tconst settings = Object.assign({\r\n\t\t\tmaxRadius: 1.0,\r\n\t\t\twaveSize: 0.2,\r\n\t\t\tamplitude: 0.05\r\n\t\t}, options);\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"ShockWaveMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\r\n\t\t\t\tcenter: new Uniform(new Vector2(0.5, 0.5)),\r\n\t\t\t\taspect: new Uniform(1.0),\r\n\t\t\t\tcameraDistance: new Uniform(1.0),\r\n\r\n\t\t\t\tsize: new Uniform(1.0),\r\n\t\t\t\tradius: new Uniform(-settings.waveSize),\r\n\t\t\t\tmaxRadius: new Uniform(settings.maxRadius),\r\n\t\t\t\twaveSize: new Uniform(settings.waveSize),\r\n\t\t\t\tamplitude: new Uniform(settings.amplitude)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform, Vector2 } from \"three\";\r\n\r\nconst fragment = \"uniform sampler2D tDiffuse;\\r\\nuniform sampler2D tWeights;\\r\\n\\r\\nuniform vec2 texelSize;\\r\\n\\r\\nvarying vec2 vUv;\\r\\nvarying vec4 vOffset;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\t// Fetch the blending weights for current pixel.\\r\\n\\tvec4 a;\\r\\n\\ta.xz = texture2D(tWeights, vUv).xz;\\r\\n\\ta.y = texture2D(tWeights, vOffset.zw).g;\\r\\n\\ta.w = texture2D(tWeights, vOffset.xy).a;\\r\\n\\r\\n\\tvec4 color;\\r\\n\\r\\n\\t// Check if there is any blending weight with a value greater than 0.0.\\r\\n\\tif(dot(a, vec4(1.0)) < 1e-5) {\\r\\n\\r\\n\\t\\tcolor = texture2D(tDiffuse, vUv, 0.0);\\r\\n\\r\\n\\t} else {\\r\\n\\r\\n\\t\\t/* Up to four lines can be crossing a pixel (one through each edge).\\r\\n\\t\\t * The line with the maximum weight for each direction is favoured.\\r\\n\\t\\t */\\r\\n\\r\\n\\t\\tvec2 offset;\\r\\n\\t\\toffset.x = a.a > a.b ? a.a : -a.b; // Left vs. right.\\r\\n\\t\\toffset.y = a.g > a.r ? -a.g : a.r; // Top vs. bottom (changed signs).\\r\\n\\r\\n\\t\\t// Go in the direction with the maximum weight (horizontal vs. vertical).\\r\\n\\t\\tif(abs(offset.x) > abs(offset.y)) {\\r\\n\\r\\n\\t\\t\\toffset.y = 0.0;\\r\\n\\r\\n\\t\\t} else {\\r\\n\\r\\n\\t\\t\\toffset.x = 0.0;\\r\\n\\r\\n\\t\\t}\\r\\n\\r\\n\\t\\t// Fetch the opposite color and lerp by hand.\\r\\n\\t\\tcolor = texture2D(tDiffuse, vUv, 0.0);\\r\\n\\t\\tvec2 coord = vUv + sign(offset) * texelSize;\\r\\n\\t\\tvec4 oppositeColor = texture2D(tDiffuse, coord, 0.0);\\r\\n\\t\\tfloat s = abs(offset.x) > abs(offset.y) ? abs(offset.x) : abs(offset.y);\\r\\n\\r\\n\\t\\t// Gamma correction.\\r\\n\\t\\tcolor.rgb = pow(abs(color.rgb), vec3(2.2));\\r\\n\\t\\toppositeColor.rgb = pow(abs(oppositeColor.rgb), vec3(2.2));\\r\\n\\t\\tcolor = mix(color, oppositeColor, s);\\r\\n\\t\\tcolor.rgb = pow(abs(color.rgb), vec3(1.0 / 2.2));\\r\\n\\r\\n\\t}\\r\\n\\r\\n\\tgl_FragColor = color;\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"uniform vec2 texelSize;\\r\\n\\r\\nvarying vec2 vUv;\\r\\nvarying vec4 vOffset;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\r\\n\\tvOffset = uv.xyxy + texelSize.xyxy * vec4(1.0, 0.0, 0.0, -1.0); // Changed sign in W component.\\r\\n\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * Subpixel Morphological Antialiasing.\r\n *\r\n * This material is used to render the final antialiasing.\r\n */\r\n\r\nexport class SMAABlendMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new SMAA blend material.\r\n\t *\r\n\t * @param {Vector2} [texelSize] - The absolute screen texel size.\r\n\t */\r\n\r\n\tconstructor(texelSize = new Vector2()) {\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"SMAABlendMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\t\t\t\ttWeights: new Uniform(null),\r\n\t\t\t\ttexelSize: new Uniform(texelSize)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform, Vector2 } from \"three\";\r\n\r\nconst fragment = \"#define sampleLevelZeroOffset(t, coord, offset) texture2D(t, coord + float(offset) * texelSize, 0.0)\\r\\n\\r\\nuniform sampler2D tDiffuse;\\r\\nuniform sampler2D tArea;\\r\\nuniform sampler2D tSearch;\\r\\n\\r\\nuniform vec2 texelSize;\\r\\n\\r\\nvarying vec2 vUv;\\r\\nvarying vec4 vOffset[3];\\r\\nvarying vec2 vPixCoord;\\r\\n\\r\\nvec2 round(vec2 x) {\\r\\n\\r\\n\\treturn sign(x) * floor(abs(x) + 0.5);\\r\\n\\r\\n}\\r\\n\\r\\nfloat searchLength(vec2 e, float bias, float scale) {\\r\\n\\r\\n\\t// Not required if tSearch accesses are set to point.\\r\\n\\t// const vec2 SEARCH_TEX_PIXEL_SIZE = 1.0 / vec2(66.0, 33.0);\\r\\n\\t// e = vec2(bias, 0.0) + 0.5 * SEARCH_TEX_PIXEL_SIZE + e * vec2(scale, 1.0) * vec2(64.0, 32.0) * SEARCH_TEX_PIXEL_SIZE;\\r\\n\\r\\n\\te.r = bias + e.r * scale;\\r\\n\\r\\n\\treturn 255.0 * texture2D(tSearch, e, 0.0).r;\\r\\n\\r\\n}\\r\\n\\r\\nfloat searchXLeft(vec2 texCoord, float end) {\\r\\n\\r\\n\\t/* @PSEUDO_GATHER4\\r\\n\\t * This texCoord has been offset by (-0.25, -0.125) in the vertex shader to\\r\\n\\t * sample between edge, thus fetching four edges in a row.\\r\\n\\t * Sampling with different offsets in each direction allows to disambiguate\\r\\n\\t * which edges are active from the four fetched ones.\\r\\n\\t */\\r\\n\\r\\n\\tvec2 e = vec2(0.0, 1.0);\\r\\n\\r\\n\\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i) {\\r\\n\\r\\n\\t\\te = texture2D(tDiffuse, texCoord, 0.0).rg;\\r\\n\\t\\ttexCoord -= vec2(2.0, 0.0) * texelSize;\\r\\n\\r\\n\\t\\tif(!(texCoord.x > end && e.g > 0.8281 && e.r == 0.0)) { break; }\\r\\n\\r\\n\\t}\\r\\n\\r\\n\\t// Correct the previously applied offset (-0.25, -0.125).\\r\\n\\ttexCoord.x += 0.25 * texelSize.x;\\r\\n\\r\\n\\t// The searches are biased by 1, so adjust the coords accordingly.\\r\\n\\ttexCoord.x += texelSize.x;\\r\\n\\r\\n\\t// Disambiguate the length added by the last step.\\r\\n\\ttexCoord.x += 2.0 * texelSize.x; // Undo last step.\\r\\n\\ttexCoord.x -= texelSize.x * searchLength(e, 0.0, 0.5);\\r\\n\\r\\n\\treturn texCoord.x;\\r\\n\\r\\n}\\r\\n\\r\\nfloat searchXRight(vec2 texCoord, float end) {\\r\\n\\r\\n\\tvec2 e = vec2(0.0, 1.0);\\r\\n\\r\\n\\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i) {\\r\\n\\r\\n\\t\\te = texture2D(tDiffuse, texCoord, 0.0).rg;\\r\\n\\t\\ttexCoord += vec2(2.0, 0.0) * texelSize;\\r\\n\\r\\n\\t\\tif(!(texCoord.x < end && e.g > 0.8281 && e.r == 0.0)) { break; }\\r\\n\\r\\n\\t}\\r\\n\\r\\n\\ttexCoord.x -= 0.25 * texelSize.x;\\r\\n\\ttexCoord.x -= texelSize.x;\\r\\n\\ttexCoord.x -= 2.0 * texelSize.x;\\r\\n\\ttexCoord.x += texelSize.x * searchLength(e, 0.5, 0.5);\\r\\n\\r\\n\\treturn texCoord.x;\\r\\n\\r\\n}\\r\\n\\r\\nfloat searchYUp(vec2 texCoord, float end) {\\r\\n\\r\\n\\tvec2 e = vec2(1.0, 0.0);\\r\\n\\r\\n\\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i) {\\r\\n\\r\\n\\t\\te = texture2D(tDiffuse, texCoord, 0.0).rg;\\r\\n\\t\\ttexCoord += vec2(0.0, 2.0) * texelSize; // Changed sign.\\r\\n\\r\\n\\t\\tif(!(texCoord.y > end && e.r > 0.8281 && e.g == 0.0)) { break; }\\r\\n\\r\\n\\t}\\r\\n\\r\\n\\ttexCoord.y -= 0.25 * texelSize.y; // Changed sign.\\r\\n\\ttexCoord.y -= texelSize.y; // Changed sign.\\r\\n\\ttexCoord.y -= 2.0 * texelSize.y; // Changed sign.\\r\\n\\ttexCoord.y += texelSize.y * searchLength(e.gr, 0.0, 0.5); // Changed sign.\\r\\n\\r\\n\\treturn texCoord.y;\\r\\n\\r\\n}\\r\\n\\r\\nfloat searchYDown(vec2 texCoord, float end) {\\r\\n\\r\\n\\tvec2 e = vec2(1.0, 0.0);\\r\\n\\r\\n\\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i ) {\\r\\n\\r\\n\\t\\te = texture2D(tDiffuse, texCoord, 0.0).rg;\\r\\n\\t\\ttexCoord -= vec2(0.0, 2.0) * texelSize; // Changed sign.\\r\\n\\r\\n\\t\\tif(!(texCoord.y < end && e.r > 0.8281 && e.g == 0.0)) { break; }\\r\\n\\r\\n\\t}\\r\\n\\r\\n\\ttexCoord.y += 0.25 * texelSize.y; // Changed sign.\\r\\n\\ttexCoord.y += texelSize.y; // Changed sign.\\r\\n\\ttexCoord.y += 2.0 * texelSize.y; // Changed sign.\\r\\n\\ttexCoord.y -= texelSize.y * searchLength(e.gr, 0.5, 0.5); // Changed sign.\\r\\n\\r\\n\\treturn texCoord.y;\\r\\n\\r\\n}\\r\\n\\r\\nvec2 area(vec2 dist, float e1, float e2, float offset) {\\r\\n\\r\\n\\t// Rounding prevents precision errors of bilinear filtering.\\r\\n\\tvec2 texCoord = AREATEX_MAX_DISTANCE * round(4.0 * vec2(e1, e2)) + dist;\\r\\n\\r\\n\\t// Scale and bias for texel space translation.\\r\\n\\ttexCoord = AREATEX_PIXEL_SIZE * texCoord + (0.5 * AREATEX_PIXEL_SIZE);\\r\\n\\r\\n\\t// Move to proper place, according to the subpixel offset.\\r\\n\\ttexCoord.y += AREATEX_SUBTEX_SIZE * offset;\\r\\n\\r\\n\\treturn texture2D(tArea, texCoord, 0.0).rg;\\r\\n\\r\\n}\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec4 weights = vec4(0.0);\\r\\n\\tvec4 subsampleIndices = vec4(0.0);\\r\\n\\tvec2 e = texture2D(tDiffuse, vUv).rg;\\r\\n\\r\\n\\tif(e.g > 0.0) {\\r\\n\\r\\n\\t\\t// Edge at north.\\r\\n\\t\\tvec2 d;\\r\\n\\r\\n\\t\\t// Find the distance to the left.\\r\\n\\t\\tvec2 coords;\\r\\n\\t\\tcoords.x = searchXLeft(vOffset[0].xy, vOffset[2].x);\\r\\n\\t\\tcoords.y = vOffset[1].y; // vOffset[1].y = vUv.y - 0.25 * texelSize.y (@CROSSING_OFFSET)\\r\\n\\t\\td.x = coords.x;\\r\\n\\r\\n\\t\\t/* Now fetch the left crossing edges, two at a time using bilinear\\r\\n\\t\\tfiltering. Sampling at -0.25 (see @CROSSING_OFFSET) enables to discern what\\r\\n\\t\\tvalue each edge has. */\\r\\n\\t\\tfloat e1 = texture2D(tDiffuse, coords, 0.0).r;\\r\\n\\r\\n\\t\\t// Find the distance to the right.\\r\\n\\t\\tcoords.x = searchXRight(vOffset[0].zw, vOffset[2].y);\\r\\n\\t\\td.y = coords.x;\\r\\n\\r\\n\\t\\t/* Translate distances to pixel units for better interleave arithmetic and\\r\\n\\t\\tmemory accesses. */\\r\\n\\t\\td = d / texelSize.x - vPixCoord.x;\\r\\n\\r\\n\\t\\t// The area texture is compressed quadratically.\\r\\n\\t\\tvec2 sqrtD = sqrt(abs(d));\\r\\n\\r\\n\\t\\t// Fetch the right crossing edges.\\r\\n\\t\\tcoords.y -= texelSize.y; // WebGL port note: Added.\\r\\n\\t\\tfloat e2 = sampleLevelZeroOffset(tDiffuse, coords, ivec2(1, 0)).r;\\r\\n\\r\\n\\t\\t// Pattern recognised, now get the actual area.\\r\\n\\t\\tweights.rg = area(sqrtD, e1, e2, subsampleIndices.y);\\r\\n\\r\\n\\t}\\r\\n\\r\\n\\tif(e.r > 0.0) {\\r\\n\\r\\n\\t\\t// Edge at west.\\r\\n\\t\\tvec2 d;\\r\\n\\r\\n\\t\\t// Find the distance to the top.\\r\\n\\t\\tvec2 coords;\\r\\n\\t\\tcoords.y = searchYUp(vOffset[1].xy, vOffset[2].z);\\r\\n\\t\\tcoords.x = vOffset[0].x; // vOffset[1].x = vUv.x - 0.25 * texelSize.x;\\r\\n\\t\\td.x = coords.y;\\r\\n\\r\\n\\t\\t// Fetch the top crossing edges.\\r\\n\\t\\tfloat e1 = texture2D(tDiffuse, coords, 0.0).g;\\r\\n\\r\\n\\t\\t// Find the distance to the bottom.\\r\\n\\t\\tcoords.y = searchYDown(vOffset[1].zw, vOffset[2].w);\\r\\n\\t\\td.y = coords.y;\\r\\n\\r\\n\\t\\t// Distances in pixel units.\\r\\n\\t\\td = d / texelSize.y - vPixCoord.y;\\r\\n\\r\\n\\t\\t// The area texture is compressed quadratically.\\r\\n\\t\\tvec2 sqrtD = sqrt(abs(d));\\r\\n\\r\\n\\t\\t// Fetch the bottom crossing edges.\\r\\n\\t\\tcoords.y -= texelSize.y; // WebGL port note: Added.\\r\\n\\t\\tfloat e2 = sampleLevelZeroOffset(tDiffuse, coords, ivec2(0, 1)).g;\\r\\n\\r\\n\\t\\t// Get the area for this direction.\\r\\n\\t\\tweights.ba = area(sqrtD, e1, e2, subsampleIndices.x);\\r\\n\\r\\n\\t}\\r\\n\\r\\n\\tgl_FragColor = weights;\\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"uniform vec2 texelSize;\\r\\n\\r\\nvarying vec2 vUv;\\r\\nvarying vec4 vOffset[3];\\r\\nvarying vec2 vPixCoord;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\r\\n\\tvPixCoord = uv / texelSize;\\r\\n\\r\\n\\t// Offsets for the searches (see @PSEUDO_GATHER4).\\r\\n\\tvOffset[0] = uv.xyxy + texelSize.xyxy * vec4(-0.25, 0.125, 1.25, 0.125); // Changed sign in Y and W components.\\r\\n\\tvOffset[1] = uv.xyxy + texelSize.xyxy * vec4(-0.125, 0.25, -0.125, -1.25); //Changed sign in Y and W components.\\r\\n\\r\\n\\t// This indicates the ends of the loops.\\r\\n\\tvOffset[2] = vec4(vOffset[0].xz, vOffset[1].yw) + vec4(-2.0, 2.0, -2.0, 2.0) * texelSize.xxyy * MAX_SEARCH_STEPS_FLOAT;\\r\\n\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * Subpixel Morphological Antialiasing.\r\n *\r\n * This material computes weights for detected edges.\r\n */\r\n\r\nexport class SMAAWeightsMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new SMAA weights material.\r\n\t *\r\n\t * @param {Vector2} [texelSize] - The absolute screen texel size.\r\n\t */\r\n\r\n\tconstructor(texelSize = new Vector2()) {\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"SMAAWeightsMaterial\",\r\n\r\n\t\t\tdefines: {\r\n\r\n\t\t\t\t// Configurable settings:\r\n\t\t\t\tMAX_SEARCH_STEPS_INT: \"8\",\r\n\t\t\t\tMAX_SEARCH_STEPS_FLOAT: \"8.0\",\r\n\r\n\t\t\t\t// Non-configurable settings:\r\n\t\t\t\tAREATEX_MAX_DISTANCE: \"16.0\",\r\n\t\t\t\tAREATEX_PIXEL_SIZE: \"(1.0 / vec2(160.0, 560.0))\",\r\n\t\t\t\tAREATEX_SUBTEX_SIZE: \"(1.0 / 7.0)\",\r\n\t\t\t\tSEARCHTEX_SIZE: \"vec2(66.0, 33.0)\",\r\n\t\t\t\tSEARCHTEX_PACKED_SIZE: \"vec2(64.0, 16.0)\"\r\n\r\n\t\t\t},\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\t\t\t\ttArea: new Uniform(null),\r\n\t\t\t\ttSearch: new Uniform(null),\r\n\t\t\t\ttexelSize: new Uniform(texelSize)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the maximum amount of steps performed in the horizontal/vertical\r\n\t * pattern searches, at each side of the pixel.\r\n\t *\r\n\t * In number of pixels, it's actually the double. So the maximum line length\r\n\t * perfectly handled by, for example 16, is 64 (perfectly means that longer\r\n\t * lines won't look as good, but are still antialiased).\r\n\t *\r\n\t * @param {Number} steps - The search steps. Range: [0, 112].\r\n\t */\r\n\r\n\tsetOrthogonalSearchSteps(steps) {\r\n\r\n\t\tthis.defines.MAX_SEARCH_STEPS_INT = steps.toFixed(\"0\");\r\n\t\tthis.defines.MAX_SEARCH_STEPS_FLOAT = steps.toFixed(\"1\");\r\n\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n}\r\n","import { ShaderMaterial, Uniform } from \"three\";\r\n\r\nconst fragment = \"#include \\r\\n#include \\r\\n\\r\\nuniform sampler2D tDiffuse;\\r\\nuniform float middleGrey;\\r\\nuniform float maxLuminance;\\r\\n\\r\\n#ifdef ADAPTED_LUMINANCE\\r\\n\\r\\n\\tuniform sampler2D luminanceMap;\\r\\n\\r\\n#else\\r\\n\\r\\n\\tuniform float averageLuminance;\\r\\n\\r\\n#endif\\r\\n\\r\\nvarying vec2 vUv;\\r\\n\\r\\nvec3 toneMap(vec3 c) {\\r\\n\\r\\n\\t#ifdef ADAPTED_LUMINANCE\\r\\n\\r\\n\\t\\t// Get the calculated average luminance by sampling the center.\\r\\n\\t\\tfloat lumAvg = texture2D(luminanceMap, vec2(0.5)).r;\\r\\n\\r\\n\\t#else\\r\\n\\r\\n\\t\\tfloat lumAvg = averageLuminance;\\r\\n\\r\\n\\t#endif\\r\\n\\r\\n\\t// Calculate the luminance of the current pixel.\\r\\n\\tfloat lumPixel = linearToRelativeLuminance(c);\\r\\n\\r\\n\\t// Apply the modified operator (Reinhard Eq. 4).\\r\\n\\tfloat lumScaled = (lumPixel * middleGrey) / lumAvg;\\r\\n\\r\\n\\tfloat lumCompressed = (lumScaled * (1.0 + (lumScaled / (maxLuminance * maxLuminance)))) / (1.0 + lumScaled);\\r\\n\\r\\n\\treturn lumCompressed * c;\\r\\n\\r\\n}\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvec4 texel = texture2D(tDiffuse, vUv);\\r\\n\\tgl_FragColor = vec4(toneMap(texel.rgb), texel.a);\\r\\n\\r\\n\\t#include \\r\\n\\r\\n}\\r\\n\";\r\nconst vertex = \"varying vec2 vUv;\\r\\n\\r\\nvoid main() {\\r\\n\\r\\n\\tvUv = uv;\\r\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\r\\n\\r\\n}\\r\\n\";\r\n\r\n/**\r\n * Full-screen tone-mapping shader material.\r\n *\r\n * This material supports dithering.\r\n *\r\n * Reference:\r\n * http://www.cis.rit.edu/people/faculty/ferwerda/publications/sig02_paper.pdf\r\n */\r\n\r\nexport class ToneMappingMaterial extends ShaderMaterial {\r\n\r\n\t/**\r\n\t * Constructs a new tone mapping material.\r\n\t */\r\n\r\n\tconstructor() {\r\n\r\n\t\tsuper({\r\n\r\n\t\t\ttype: \"ToneMappingMaterial\",\r\n\r\n\t\t\tuniforms: {\r\n\r\n\t\t\t\ttDiffuse: new Uniform(null),\r\n\t\t\t\tluminanceMap: new Uniform(null),\r\n\t\t\t\taverageLuminance: new Uniform(1.0),\r\n\t\t\t\tmaxLuminance: new Uniform(16.0),\r\n\t\t\t\tmiddleGrey: new Uniform(0.6)\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfragmentShader: fragment,\r\n\t\t\tvertexShader: vertex,\r\n\r\n\t\t\tdepthWrite: false,\r\n\t\t\tdepthTest: false\r\n\r\n\t\t});\r\n\r\n\t}\r\n\r\n}\r\n","/**\r\n * A collection of shader materials that are used in the post processing passes.\r\n *\r\n * @module postprocessing/materials\r\n */\r\n\r\nexport { AdaptiveLuminosityMaterial } from \"./AdaptiveLuminosityMaterial.js\";\r\nexport { BokehMaterial } from \"./BokehMaterial.js\";\r\nexport { ColorEdgesMaterial } from \"./ColorEdgesMaterial.js\";\r\nexport { CombineMaterial } from \"./CombineMaterial.js\";\r\nexport { ConvolutionMaterial, KernelSize } from \"./ConvolutionMaterial.js\";\r\nexport { CopyMaterial } from \"./CopyMaterial.js\";\r\nexport { DepthComparisonMaterial } from \"./DepthComparisonMaterial.js\";\r\nexport { DotScreenMaterial } from \"./DotScreenMaterial.js\";\r\nexport { FilmMaterial } from \"./FilmMaterial.js\";\r\nexport { GlitchMaterial } from \"./GlitchMaterial.js\";\r\nexport { GodRaysMaterial } from \"./GodRaysMaterial.js\";\r\nexport { LuminosityMaterial } from \"./LuminosityMaterial.js\";\r\nexport { OutlineBlendMaterial } from \"./OutlineBlendMaterial.js\";\r\nexport { OutlineEdgesMaterial } from \"./OutlineEdgesMaterial.js\";\r\nexport { PixelationMaterial } from \"./PixelationMaterial.js\";\r\nexport { RealisticBokehMaterial } from \"./RealisticBokehMaterial.js\";\r\nexport { ShockWaveMaterial } from \"./ShockWaveMaterial.js\";\r\nexport { SMAABlendMaterial } from \"./SMAABlendMaterial.js\";\r\nexport { SMAAWeightsMaterial } from \"./SMAAWeightsMaterial.js\";\r\nexport { ToneMappingMaterial } from \"./ToneMappingMaterial.js\";\r\n","import { Scene, Mesh, OrthographicCamera, PlaneBufferGeometry } from \"three\";\r\n\r\n/**\r\n * An abstract pass.\r\n *\r\n * Passes that do not rely on the depth buffer should explicitly disable the\r\n * depth test and depth write in their respective shader materials.\r\n *\r\n * @implements {Resizable}\r\n * @implements {Disposable}\r\n */\r\n\r\nexport class Pass {\r\n\r\n\t/**\r\n\t * Constructs a new pass.\r\n\t *\r\n\t * @param {String} [name] - The name of this pass.\r\n\t * @param {Scene} [scene] - The scene to render.\r\n\t * @param {Camera} [camera] - The camera.\r\n\t * @param {Mesh} [quad] - A quad that fills the screen to render 2D filter effects. Set this to null, if you don't need it (see {@link RenderPass}).\r\n\t */\r\n\r\n\tconstructor(\r\n\t\tname = \"Pass\",\r\n\t\tscene = new Scene(),\r\n\t\tcamera = new OrthographicCamera(-1, 1, 1, -1, 0, 1),\r\n\t\tquad = new Mesh(new PlaneBufferGeometry(2, 2), null)\r\n\t) {\r\n\r\n\t\t/**\r\n\t\t * The name of this pass.\r\n\t\t *\r\n\t\t * @type {String}\r\n\t\t */\r\n\r\n\t\tthis.name = name;\r\n\r\n\t\t/**\r\n\t\t * The scene to render.\r\n\t\t *\r\n\t\t * @type {Scene}\r\n\t\t * @protected\r\n\t\t */\r\n\r\n\t\tthis.scene = scene;\r\n\r\n\t\t/**\r\n\t\t * The camera.\r\n\t\t *\r\n\t\t * @type {Camera}\r\n\t\t * @protected\r\n\t\t */\r\n\r\n\t\tthis.camera = camera;\r\n\r\n\t\t/**\r\n\t\t * A quad mesh that fills the screen.\r\n\t\t *\r\n\t\t * @type {Mesh}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.quad = quad;\r\n\r\n\t\tif(this.quad !== null) {\r\n\r\n\t\t\tthis.quad.frustumCulled = false;\r\n\r\n\t\t\tif(this.scene !== null) {\r\n\r\n\t\t\t\tthis.scene.add(this.quad);\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * Indicates whether this pass should render to screen.\r\n\t\t *\r\n\t\t * @type {Boolean}\r\n\t\t */\r\n\r\n\t\tthis.renderToScreen = false;\r\n\r\n\t\t/**\r\n\t\t * Indicates whether this pass should be executed.\r\n\t\t *\r\n\t\t * @type {Boolean}\r\n\t\t */\r\n\r\n\t\tthis.enabled = true;\r\n\r\n\t\t/**\r\n\t\t * Indicates whether the {@link EffectComposer} should swap the frame\r\n\t\t * buffers after this pass has finished rendering.\r\n\t\t *\r\n\t\t * Set this to `false` if this pass doesn't render to the output buffer or\r\n\t\t * the screen. Otherwise, the contents of the input buffer will be lost.\r\n\t\t *\r\n\t\t * @type {Boolean}\r\n\t\t */\r\n\r\n\t\tthis.needsSwap = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The fullscreen material.\r\n\t *\r\n\t * @type {Material}\r\n\t */\r\n\r\n\tget material() {\r\n\r\n\t\treturn (this.quad !== null) ? this.quad.material : null;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the fullscreen material.\r\n\t *\r\n\t * The material will be assigned to the quad mesh that fills the screen.\r\n\t *\r\n\t * @type {Material}\r\n\t */\r\n\r\n\tset material(value) {\r\n\r\n\t\tif(this.quad !== null) {\r\n\r\n\t\t\tthis.quad.material = value;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * This is an abstract method that must be overridden.\r\n\t *\r\n\t * @abstract\r\n\t * @throws {Error} An error is thrown if the method is not overridden.\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tthrow new Error(\"Render method not implemented!\");\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Updates this pass with the renderer's size.\r\n\t *\r\n\t * You may override this method in case you want to be informed about the main\r\n\t * render size.\r\n\t *\r\n\t * The {@link EffectComposer} calls this method before this pass is\r\n\t * initialized and every time its own size is updated.\r\n\t *\r\n\t * @param {Number} width - The renderer's width.\r\n\t * @param {Number} height - The renderer's height.\r\n\t * @example this.myRenderTarget.setSize(width, height);\r\n\t */\r\n\r\n\tsetSize(width, height) {}\r\n\r\n\t/**\r\n\t * Performs initialization tasks.\r\n\t *\r\n\t * By overriding this method you gain access to the renderer. You'll also be\r\n\t * able to configure your custom render targets to use the appropriate format\r\n\t * (RGB or RGBA).\r\n\t *\r\n\t * The provided renderer can be used to warm up special off-screen render\r\n\t * targets by performing a preliminary render operation.\r\n\t *\r\n\t * The {@link EffectComposer} calls this method when this pass is added to its\r\n\t * queue, but not before its size has been set.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\r\n\t * @example if(!alpha) { this.myRenderTarget.texture.format = RGBFormat; }\r\n\t */\r\n\r\n\tinitialize(renderer, alpha) {}\r\n\r\n\t/**\r\n\t * Performs a shallow search for properties that define a dispose method and\r\n\t * deletes them. The pass will be inoperative after this method was called!\r\n\t *\r\n\t * Disposable objects:\r\n\t * - render targets\r\n\t * - materials\r\n\t * - textures\r\n\t *\r\n\t * The {@link EffectComposer} calls this method when it is being destroyed.\r\n\t * You may, however, use it independently to free memory when you are certain\r\n\t * that you don't need this pass anymore.\r\n\t */\r\n\r\n\tdispose() {\r\n\r\n\t\tlet key;\r\n\r\n\t\tfor(key of Object.keys(this)) {\r\n\r\n\t\t\tif(this[key] !== null && typeof this[key].dispose === \"function\") {\r\n\r\n\t\t\t\tthis[key].dispose();\r\n\t\t\t\tthis[key] = null;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif(this.material !== null) {\r\n\r\n\t\t\tthis.material.dispose();\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n","import { LinearFilter, RGBFormat, WebGLRenderTarget } from \"three\";\r\nimport { ConvolutionMaterial, KernelSize } from \"../materials\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * An efficient, incremental blur pass.\r\n *\r\n * Note: This pass allows the input and output buffer to be the same.\r\n */\r\n\r\nexport class BlurPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new blur pass.\r\n\t *\r\n\t * @param {Object} [options] - The options.\r\n\t * @param {Number} [options.resolutionScale=0.5] - The render texture resolution scale, relative to the screen render size.\r\n\t * @param {Number} [options.kernelSize=KernelSize.LARGE] - The blur kernel size.\r\n\t */\r\n\r\n\tconstructor(options = {}) {\r\n\r\n\t\tsuper(\"BlurPass\");\r\n\r\n\t\t/**\r\n\t\t * A render target.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderTargetX = new WebGLRenderTarget(1, 1, {\r\n\t\t\tminFilter: LinearFilter,\r\n\t\t\tmagFilter: LinearFilter,\r\n\t\t\tstencilBuffer: false,\r\n\t\t\tdepthBuffer: false\r\n\t\t});\r\n\r\n\t\tthis.renderTargetX.texture.name = \"Blur.TargetX\";\r\n\t\tthis.renderTargetX.texture.generateMipmaps = false;\r\n\r\n\t\t/**\r\n\t\t * A second render target.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderTargetY = this.renderTargetX.clone();\r\n\r\n\t\tthis.renderTargetY.texture.name = \"Blur.TargetY\";\r\n\r\n\t\t/**\r\n\t\t * The resolution scale.\r\n\t\t *\r\n\t\t * You need to call {@link EffectComposer#setSize} after changing this\r\n\t\t * value.\r\n\t\t *\r\n\t\t * @type {Number}\r\n\t\t */\r\n\r\n\t\tthis.resolutionScale = (options.resolutionScale !== undefined) ? options.resolutionScale : 0.5;\r\n\r\n\t\t/**\r\n\t\t * A convolution shader material.\r\n\t\t *\r\n\t\t * @type {ConvolutionMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.convolutionMaterial = new ConvolutionMaterial();\r\n\r\n\t\t/**\r\n\t\t * A convolution shader material that uses dithering.\r\n\t\t *\r\n\t\t * @type {ConvolutionMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.ditheredConvolutionMaterial = new ConvolutionMaterial();\r\n\t\tthis.ditheredConvolutionMaterial.dithering = true;\r\n\r\n\t\t/**\r\n\t\t * Whether the blurred result should also be dithered using noise.\r\n\t\t *\r\n\t\t * @type {Boolean}\r\n\t\t */\r\n\r\n\t\tthis.dithering = false;\r\n\r\n\t\tthis.kernelSize = options.kernelSize;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The absolute width of the internal render targets.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tget width() {\r\n\r\n\t\treturn this.renderTargetX.width;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The absolute height of the internal render targets.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tget height() {\r\n\r\n\t\treturn this.renderTargetX.height;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The kernel size.\r\n\t *\r\n\t * @type {KernelSize}\r\n\t */\r\n\r\n\tget kernelSize() {\r\n\r\n\t\treturn this.convolutionMaterial.kernelSize;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * @type {KernelSize}\r\n\t */\r\n\r\n\tset kernelSize(value = KernelSize.LARGE) {\r\n\r\n\t\tthis.convolutionMaterial.kernelSize = value;\r\n\t\tthis.ditheredConvolutionMaterial.kernelSize = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Blurs the input buffer and writes the result to the output buffer. The\r\n\t * input buffer remains intact, unless its also the output buffer.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tconst scene = this.scene;\r\n\t\tconst camera = this.camera;\r\n\r\n\t\tconst renderTargetX = this.renderTargetX;\r\n\t\tconst renderTargetY = this.renderTargetY;\r\n\r\n\t\tlet material = this.convolutionMaterial;\r\n\t\tlet uniforms = material.uniforms;\r\n\t\tconst kernel = material.getKernel();\r\n\r\n\t\tlet lastRT = inputBuffer;\r\n\t\tlet destRT;\r\n\t\tlet i, l;\r\n\r\n\t\tthis.material = material;\r\n\r\n\t\t// Apply the multi-pass blur.\r\n\t\tfor(i = 0, l = kernel.length - 1; i < l; ++i) {\r\n\r\n\t\t\t// Alternate between targets.\r\n\t\t\tdestRT = ((i % 2) === 0) ? renderTargetX : renderTargetY;\r\n\r\n\t\t\tuniforms.kernel.value = kernel[i];\r\n\t\t\tuniforms.tDiffuse.value = lastRT.texture;\r\n\t\t\trenderer.render(scene, camera, destRT);\r\n\r\n\t\t\tlastRT = destRT;\r\n\r\n\t\t}\r\n\r\n\t\tif(this.dithering) {\r\n\r\n\t\t\tmaterial = this.ditheredConvolutionMaterial;\r\n\t\t\tuniforms = material.uniforms;\r\n\t\t\tthis.material = material;\r\n\r\n\t\t}\r\n\r\n\t\tuniforms.kernel.value = kernel[i];\r\n\t\tuniforms.tDiffuse.value = lastRT.texture;\r\n\t\trenderer.render(scene, camera, this.renderToScreen ? null : outputBuffer);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the size of this pass.\r\n\t *\r\n\t * @param {Number} width - The width.\r\n\t * @param {Number} height - The height.\r\n\t */\r\n\r\n\tsetSize(width, height) {\r\n\r\n\t\twidth = Math.max(1, Math.floor(width * this.resolutionScale));\r\n\t\theight = Math.max(1, Math.floor(height * this.resolutionScale));\r\n\r\n\t\tthis.renderTargetX.setSize(width, height);\r\n\t\tthis.renderTargetY.setSize(width, height);\r\n\r\n\t\tthis.convolutionMaterial.setTexelSize(1.0 / width, 1.0 / height);\r\n\t\tthis.ditheredConvolutionMaterial.setTexelSize(1.0 / width, 1.0 / height);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Performs initialization tasks.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\r\n\t */\r\n\r\n\tinitialize(renderer, alpha) {\r\n\r\n\t\tif(!alpha) {\r\n\r\n\t\t\tthis.renderTargetX.texture.format = RGBFormat;\r\n\t\t\tthis.renderTargetY.texture.format = RGBFormat;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n","import { LinearFilter, RGBFormat, WebGLRenderTarget } from \"three\";\r\nimport { CombineMaterial, KernelSize, LuminosityMaterial } from \"../materials\";\r\nimport { BlurPass } from \"./BlurPass.js\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * A bloom pass.\r\n *\r\n * This pass renders a scene with superimposed blur by utilizing the fast Kawase\r\n * convolution approach.\r\n */\r\n\r\nexport class BloomPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new bloom pass.\r\n\t *\r\n\t * @param {Object} [options] - The options.\r\n\t * @param {Number} [options.resolutionScale=0.5] - The render texture resolution scale, relative to the screen render size.\r\n\t * @param {Number} [options.kernelSize=KernelSize.LARGE] - The blur kernel size.\r\n\t * @param {Number} [options.intensity=1.0] - The strength of the bloom effect.\r\n\t * @param {Number} [options.distinction=1.0] - The luminance distinction factor. Raise this value to bring out the brighter elements in the scene.\r\n\t * @param {Number} [options.screenMode=true] - Whether the screen blend mode should be used for combining the bloom texture with the scene colors.\r\n\t */\r\n\r\n\tconstructor(options = {}) {\r\n\r\n\t\tsuper(\"BloomPass\");\r\n\r\n\t\t/**\r\n\t\t * A render target.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderTarget = new WebGLRenderTarget(1, 1, {\r\n\t\t\tminFilter: LinearFilter,\r\n\t\t\tmagFilter: LinearFilter,\r\n\t\t\tstencilBuffer: false,\r\n\t\t\tdepthBuffer: false\r\n\t\t});\r\n\r\n\t\tthis.renderTarget.texture.name = \"Bloom.Target\";\r\n\t\tthis.renderTarget.texture.generateMipmaps = false;\r\n\r\n\t\t/**\r\n\t\t * A blur pass.\r\n\t\t *\r\n\t\t * @type {BlurPass}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.blurPass = new BlurPass(options);\r\n\r\n\t\t/**\r\n\t\t * A combine shader material.\r\n\t\t *\r\n\t\t * @type {CombineMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.combineMaterial = new CombineMaterial((options.screenMode !== undefined) ? options.screenMode : true);\r\n\r\n\t\tthis.intensity = options.intensity;\r\n\r\n\t\t/**\r\n\t\t * A luminosity shader material.\r\n\t\t *\r\n\t\t * @type {LuminosityMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.luminosityMaterial = new LuminosityMaterial(true);\r\n\r\n\t\tthis.distinction = options.distinction;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The resolution scale.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tget resolutionScale() {\r\n\r\n\t\treturn this.blurPass.resolutionScale;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * You need to call {@link EffectComposer#setSize} after changing this value.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tset resolutionScale(value = 0.5) {\r\n\r\n\t\tthis.blurPass.resolutionScale = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The blur kernel size.\r\n\t *\r\n\t * @type {KernelSize}\r\n\t */\r\n\r\n\tget kernelSize() {\r\n\r\n\t\treturn this.blurPass.kernelSize;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * @type {KernelSize}\r\n\t */\r\n\r\n\tset kernelSize(value = KernelSize.LARGE) {\r\n\r\n\t\tthis.blurPass.kernelSize = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The overall intensity of the effect.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tget intensity() {\r\n\r\n\t\treturn this.combineMaterial.uniforms.opacity2.value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tset intensity(value = 1.0) {\r\n\r\n\t\tthis.combineMaterial.uniforms.opacity2.value = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The luminance distinction factor.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tget distinction() {\r\n\r\n\t\treturn this.luminosityMaterial.uniforms.distinction.value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tset distinction(value = 1.0) {\r\n\r\n\t\tthis.luminosityMaterial.uniforms.distinction.value = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Indicates whether dithering is enabled.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tget dithering() {\r\n\r\n\t\treturn this.blurPass.dithering;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * If enabled, the result will be dithered to remove banding artifacts.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tset dithering(value) {\r\n\r\n\t\tthis.blurPass.dithering = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Indicates whether the effect should be applied to the input buffer.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tget blend() {\r\n\r\n\t\treturn this.needsSwap;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * If disabled, the input buffer will remain unaffected.\r\n\t *\r\n\t * You may use the {@link BloomPass#overlay} texture to apply the effect to\r\n\t * your scene.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tset blend(value) {\r\n\r\n\t\tthis.needsSwap = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The effect overlay texture.\r\n\t *\r\n\t * @type {Texture}\r\n\t */\r\n\r\n\tget overlay() {\r\n\r\n\t\treturn this.renderTarget.texture;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tconst scene = this.scene;\r\n\t\tconst camera = this.camera;\r\n\t\tconst blurPass = this.blurPass;\r\n\r\n\t\tconst luminosityMaterial = this.luminosityMaterial;\r\n\t\tconst combineMaterial = this.combineMaterial;\r\n\t\tconst renderTarget = this.renderTarget;\r\n\r\n\t\t// Luminance filter.\r\n\t\tthis.material = luminosityMaterial;\r\n\t\tluminosityMaterial.uniforms.tDiffuse.value = inputBuffer.texture;\r\n\t\trenderer.render(scene, camera, renderTarget);\r\n\r\n\t\t// Convolution phase.\r\n\t\tblurPass.render(renderer, renderTarget, renderTarget);\r\n\r\n\t\tif(this.blend) {\r\n\r\n\t\t\t// Render the original scene with superimposed blur.\r\n\t\t\tthis.material = combineMaterial;\r\n\t\t\tcombineMaterial.uniforms.texture1.value = inputBuffer.texture;\r\n\t\t\tcombineMaterial.uniforms.texture2.value = renderTarget.texture;\r\n\r\n\t\t\trenderer.render(scene, camera, this.renderToScreen ? null : outputBuffer);\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the size of this pass.\r\n\t *\r\n\t * @param {Number} width - The width.\r\n\t * @param {Number} height - The height.\r\n\t */\r\n\r\n\tsetSize(width, height) {\r\n\r\n\t\tthis.blurPass.setSize(width, height);\r\n\r\n\t\twidth = this.blurPass.width;\r\n\t\theight = this.blurPass.height;\r\n\r\n\t\tthis.renderTarget.setSize(width, height);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Performs initialization tasks.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\r\n\t */\r\n\r\n\tinitialize(renderer, alpha) {\r\n\r\n\t\tthis.blurPass.initialize(renderer, alpha);\r\n\r\n\t\tif(!alpha) {\r\n\r\n\t\t\tthis.renderTarget.texture.format = RGBFormat;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n","import { BokehMaterial } from \"../materials\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * A Depth of Field (DoF) pass using a bokeh shader.\r\n *\r\n * This pass requires a {@link EffectComposer#depthTexture}.\r\n */\r\n\r\nexport class BokehPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new bokeh pass.\r\n\t *\r\n\t * @param {PerspectiveCamera} camera - The main camera. Used to obtain the aspect ratio and the near and far plane settings.\r\n\t * @param {Object} [options] - Additional parameters. See {@link BokehMaterial} for details.\r\n\t */\r\n\r\n\tconstructor(camera, options = {}) {\r\n\r\n\t\tsuper(\"BokehPass\");\r\n\r\n\t\tthis.material = new BokehMaterial(camera, options);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tthis.material.uniforms.tDiffuse.value = inputBuffer.texture;\r\n\t\tthis.material.uniforms.tDepth.value = inputBuffer.depthTexture;\r\n\r\n\t\trenderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the size of this pass.\r\n\t *\r\n\t * @param {Number} width - The width.\r\n\t * @param {Number} height - The height.\r\n\t */\r\n\r\n\tsetSize(width, height) {\r\n\r\n\t\tthis.material.uniforms.aspect.value = width / height;\r\n\r\n\t}\r\n\r\n}\r\n","import { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * A pass that disables the stencil test.\r\n */\r\n\r\nexport class ClearMaskPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new clear mask pass.\r\n\t */\r\n\r\n\tconstructor() {\r\n\r\n\t\tsuper(\"ClearMaskPass\", null, null, null);\r\n\r\n\t\tthis.needsSwap = false;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Disables the global stencil test.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\trenderer.state.buffers.stencil.setTest(false);\r\n\r\n\t}\r\n\r\n}\r\n","import { Color } from \"three\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * Used for saving the original clear color of the renderer.\r\n *\r\n * @type {Color}\r\n * @private\r\n */\r\n\r\nconst color = new Color();\r\n\r\n/**\r\n * A pass that clears the input buffer or the screen.\r\n *\r\n * You can prevent specific bits from being cleared by setting either the\r\n * autoClearColor, autoClearStencil or autoClearDepth properties of the renderer\r\n * to false.\r\n */\r\n\r\nexport class ClearPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new clear pass.\r\n\t *\r\n\t * @param {Object} [options] - Additional options.\r\n\t * @param {Color} [options.clearColor=null] - An override clear color.\r\n\t * @param {Number} [options.clearAlpha=0.0] - An override clear alpha.\r\n\t */\r\n\r\n\tconstructor(options = {}) {\r\n\r\n\t\tsuper(\"ClearPass\", null, null, null);\r\n\r\n\t\tthis.needsSwap = false;\r\n\r\n\t\t/**\r\n\t\t * The clear color.\r\n\t\t *\r\n\t\t * @type {Color}\r\n\t\t */\r\n\r\n\t\tthis.clearColor = (options.clearColor !== undefined) ? options.clearColor : null;\r\n\r\n\t\t/**\r\n\t\t * The clear alpha.\r\n\t\t *\r\n\t\t * @type {Number}\r\n\t\t */\r\n\r\n\t\tthis.clearAlpha = (options.clearAlpha !== undefined) ? options.clearAlpha : 0.0;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Clears the input buffer or the screen.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tconst clearColor = this.clearColor;\r\n\r\n\t\tlet clearAlpha;\r\n\r\n\t\tif(clearColor !== null) {\r\n\r\n\t\t\tcolor.copy(renderer.getClearColor());\r\n\t\t\tclearAlpha = renderer.getClearAlpha();\r\n\t\t\trenderer.setClearColor(clearColor, this.clearAlpha);\r\n\r\n\t\t}\r\n\r\n\t\trenderer.setRenderTarget(this.renderToScreen ? null : inputBuffer);\r\n\t\trenderer.clear();\r\n\r\n\t\tif(clearColor !== null) {\r\n\r\n\t\t\trenderer.setClearColor(color, clearAlpha);\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n","import { DotScreenMaterial } from \"../materials\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * A dot screen pass.\r\n */\r\n\r\nexport class DotScreenPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new dot screen pass.\r\n\t *\r\n\t * @param {Object} [options] - The options.\r\n\t * @param {Boolean} [options.average=false] - Whether the shader should output a colour average (black and white).\r\n\t * @param {Number} [options.angle=1.57] - The angle of the pattern.\r\n\t * @param {Number} [options.scale=1.0] - The scale of the overall effect.\r\n\t * @param {Number} [options.intensity=1.0] - The intensity of the effect.\r\n\t */\r\n\r\n\tconstructor(options = {}) {\r\n\r\n\t\tsuper(\"DotScreenPass\");\r\n\r\n\t\tthis.material = new DotScreenMaterial(options);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tthis.material.uniforms.tDiffuse.value = inputBuffer.texture;\r\n\r\n\t\trenderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the size of this pass.\r\n\t *\r\n\t * @param {Number} width - The width.\r\n\t * @param {Number} height - The height.\r\n\t */\r\n\r\n\tsetSize(width, height) {\r\n\r\n\t\twidth = Math.max(1, width);\r\n\t\theight = Math.max(1, height);\r\n\r\n\t\tthis.material.uniforms.offsetRepeat.value.z = width;\r\n\t\tthis.material.uniforms.offsetRepeat.value.w = height;\r\n\r\n\t}\r\n\r\n}\r\n","import { FilmMaterial } from \"../materials\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * A film pass.\r\n *\r\n * Provides various cinematic effects.\r\n */\r\n\r\nexport class FilmPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new film pass.\r\n\t *\r\n\t * @param {Object} [options] - The options. See {@link FilmMaterial} for more options.\r\n\t * @param {Number} [options.scanlineDensity=1.25] - The scanline density, relative to the screen height.\r\n\t * @param {Number} [options.gridScale=1.0] - The grid scale, relative to the screen height.\r\n\t * @param {Number} [options.gridLineWidth=0.0] - The grid line width. This value will be added to the base line width.\r\n\t */\r\n\r\n\tconstructor(options = {}) {\r\n\r\n\t\tsuper(\"FilmPass\");\r\n\r\n\t\tthis.material = new FilmMaterial(options);\r\n\r\n\t\t/**\r\n\t\t * The amount of scanlines, relative to the screen height.\r\n\t\t *\r\n\t\t * You need to call {@link EffectComposer#setSize} after changing this\r\n\t\t * value.\r\n\t\t *\r\n\t\t * @type {Number}\r\n\t\t */\r\n\r\n\t\tthis.scanlineDensity = (options.scanlineDensity === undefined) ? 1.25 : options.scanlineDensity;\r\n\r\n\t\t/**\r\n\t\t * The grid scale, relative to the screen height.\r\n\t\t *\r\n\t\t * You need to call {@link EffectComposer#setSize} after changing this\r\n\t\t * value.\r\n\t\t *\r\n\t\t * @type {Number}\r\n\t\t */\r\n\r\n\t\tthis.gridScale = (options.gridScale === undefined) ? 1.0 : Math.max(options.gridScale, 1e-6);\r\n\r\n\t\t/**\r\n\t\t * The grid line width.\r\n\t\t *\r\n\t\t * You need to call {@link EffectComposer#setSize} after changing this\r\n\t\t * value.\r\n\t\t *\r\n\t\t * @type {Number}\r\n\t\t */\r\n\r\n\t\tthis.gridLineWidth = (options.gridLineWidth === undefined) ? 0.0 : Math.max(options.gridLineWidth, 0.0);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tthis.material.uniforms.tDiffuse.value = inputBuffer.texture;\r\n\t\tthis.material.uniforms.time.value += delta;\r\n\r\n\t\trenderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the size of this pass.\r\n\t *\r\n\t * @param {Number} width - The width.\r\n\t * @param {Number} height - The height.\r\n\t */\r\n\r\n\tsetSize(width, height) {\r\n\r\n\t\tconst aspect = width / height;\r\n\t\tconst gridScale = this.gridScale * (height * 0.125);\r\n\r\n\t\tthis.material.uniforms.scanlineCount.value = Math.round(height * this.scanlineDensity);\r\n\t\tthis.material.uniforms.gridScale.value.set(aspect * gridScale, gridScale);\r\n\t\tthis.material.uniforms.gridLineWidth.value = (gridScale / height) + this.gridLineWidth;\r\n\r\n\t}\r\n\r\n}\r\n","import { DataTexture, RGBFormat, FloatType } from \"three\";\r\nimport { GlitchMaterial } from \"../materials\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * Returns a random integer in the specified range.\r\n *\r\n * @private\r\n * @param {Number} low - The lowest possible value.\r\n * @param {Number} high - The highest possible value.\r\n * @return {Number} The random value.\r\n */\r\n\r\nfunction randomInt(low, high) {\r\n\r\n\treturn low + Math.floor(Math.random() * (high - low + 1));\r\n\r\n}\r\n\r\n/**\r\n * Returns a random float in the specified range.\r\n *\r\n * @private\r\n * @param {Number} low - The lowest possible value.\r\n * @param {Number} high - The highest possible value.\r\n * @return {Number} The random value.\r\n */\r\n\r\nfunction randomFloat(low, high) {\r\n\r\n\treturn low + Math.random() * (high - low);\r\n\r\n}\r\n\r\n/**\r\n * A glitch pass.\r\n */\r\n\r\nexport class GlitchPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new glitch pass.\r\n\t *\r\n\t * @param {Object} [options] - The options.\r\n\t * @param {Texture} [options.perturbMap] - A perturbation map. If none is provided, a noise texture will be created.\r\n\t * @param {Number} [options.dtSize=64] - The size of the generated noise map. Will be ignored if a perturbation map is provided.\r\n\t */\r\n\r\n\tconstructor(options = {}) {\r\n\r\n\t\tsuper(\"GlitchPass\");\r\n\r\n\t\tthis.material = new GlitchMaterial();\r\n\r\n\t\t/**\r\n\t\t * A perturbation map.\r\n\t\t *\r\n\t\t * @type {Texture}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.texture = null;\r\n\r\n\t\tthis.perturbMap = (options.perturbMap !== undefined) ? options.perturbMap : this.generatePerturbMap(options.dtSize);\r\n\t\tthis.perturbMap.name = \"Glitch.Perturbation\";\r\n\t\tthis.perturbMap.generateMipmaps = false;\r\n\r\n\t\t/**\r\n\t\t * The effect mode.\r\n\t\t *\r\n\t\t * @type {GlitchMode}\r\n\t\t */\r\n\r\n\t\tthis.mode = GlitchMode.SPORADIC;\r\n\r\n\t\t/**\r\n\t\t * A counter for the glitch activation and deactivation.\r\n\t\t *\r\n\t\t * @type {Number}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.counter = 0;\r\n\r\n\t\t/**\r\n\t\t * A random break point for the sporadic glitch activation.\r\n\t\t *\r\n\t\t * @type {Number}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.breakPoint = randomInt(120, 240);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The current perturbation map.\r\n\t *\r\n\t * @type {Texture}\r\n\t */\r\n\r\n\tget perturbMap() {\r\n\r\n\t\treturn this.texture;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Assigning a new perturbation map does not destroy the current one!\r\n\t *\r\n\t * @type {Texture}\r\n\t */\r\n\r\n\tset perturbMap(value) {\r\n\r\n\t\tthis.texture = value;\r\n\t\tthis.material.uniforms.tPerturb.value = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Destroys the current perturbation map and replaces it with a new one.\r\n\t *\r\n\t * @param {Number} [size=64] - The texture size.\r\n\t * @return {DataTexture} The perturbation texture.\r\n\t */\r\n\r\n\tgeneratePerturbMap(size = 64) {\r\n\r\n\t\tconst pixels = size * size;\r\n\t\tconst data = new Float32Array(pixels * 3);\r\n\r\n\t\tlet dt = this.perturbMap;\r\n\t\tlet i, x;\r\n\r\n\t\tfor(i = 0; i < pixels; ++i) {\r\n\r\n\t\t\tx = Math.random();\r\n\r\n\t\t\tdata[i * 3] = x;\r\n\t\t\tdata[i * 3 + 1] = x;\r\n\t\t\tdata[i * 3 + 2] = x;\r\n\r\n\t\t}\r\n\r\n\t\tif(dt !== null) {\r\n\r\n\t\t\tdt.dispose();\r\n\r\n\t\t}\r\n\r\n\t\tdt = new DataTexture(data, size, size, RGBFormat, FloatType);\r\n\t\tdt.needsUpdate = true;\r\n\r\n\t\tthis.perturbMap = dt;\r\n\r\n\t\treturn dt;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tconst mode = this.mode;\r\n\t\tconst counter = this.counter;\r\n\t\tconst breakPoint = this.breakPoint;\r\n\t\tconst uniforms = this.material.uniforms;\r\n\r\n\t\tuniforms.tDiffuse.value = inputBuffer.texture;\r\n\t\tuniforms.seed.value = Math.random();\r\n\t\tuniforms.active.value = true;\r\n\r\n\t\tif(counter % breakPoint === 0 || mode === GlitchMode.CONSTANT_WILD) {\r\n\r\n\t\t\tuniforms.amount.value = Math.random() / 30.0;\r\n\t\t\tuniforms.angle.value = randomFloat(-Math.PI, Math.PI);\r\n\t\t\tuniforms.seedX.value = randomFloat(-1.0, 1.0);\r\n\t\t\tuniforms.seedY.value = randomFloat(-1.0, 1.0);\r\n\t\t\tuniforms.distortionX.value = randomFloat(0.0, 1.0);\r\n\t\t\tuniforms.distortionY.value = randomFloat(0.0, 1.0);\r\n\r\n\t\t\tthis.breakPoint = randomInt(120, 240);\r\n\t\t\tthis.counter = 0;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tif(counter % breakPoint < breakPoint / 5 || mode === GlitchMode.CONSTANT_MILD) {\r\n\r\n\t\t\t\tuniforms.amount.value = Math.random() / 90.0;\r\n\t\t\t\tuniforms.angle.value = randomFloat(-Math.PI, Math.PI);\r\n\t\t\t\tuniforms.distortionX.value = randomFloat(0.0, 1.0);\r\n\t\t\t\tuniforms.distortionY.value = randomFloat(0.0, 1.0);\r\n\t\t\t\tuniforms.seedX.value = randomFloat(-0.3, 0.3);\r\n\t\t\t\tuniforms.seedY.value = randomFloat(-0.3, 0.3);\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// Sporadic.\r\n\t\t\t\tuniforms.active.value = false;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t++this.counter;\r\n\r\n\t\trenderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);\r\n\r\n\t}\r\n\r\n}\r\n\r\n/**\r\n * A glitch mode enumeration.\r\n *\r\n * @type {Object}\r\n * @property {Number} SPORADIC - Sporadic glitches.\r\n * @property {Number} CONSTANT_MILD - Constant mild glitches.\r\n * @property {Number} CONSTANT_WILD - Constant wild glitches.\r\n */\r\n\r\nexport const GlitchMode = {\r\n\r\n\tSPORADIC: 0,\r\n\tCONSTANT_MILD: 1,\r\n\tCONSTANT_WILD: 2\r\n\r\n};\r\n","import { ClearPass } from \"./ClearPass.js\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * A pass that renders a given scene directly on screen or into the read buffer\r\n * for further processing.\r\n */\r\n\r\nexport class RenderPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new render pass.\r\n\t *\r\n\t * @param {Scene} scene - The scene to render.\r\n\t * @param {Camera} camera - The camera to use to render the scene.\r\n\t * @param {Object} [options] - Additional options.\r\n\t * @param {Material} [options.overrideMaterial=null] - An override material for the scene.\r\n\t * @param {Color} [options.clearColor=null] - An override clear color.\r\n\t * @param {Number} [options.clearAlpha=1.0] - An override clear alpha.\r\n\t * @param {Boolean} [options.clearDepth=false] - Whether depth should be cleared explicitly.\r\n\t * @param {Boolean} [options.clear=true] - Whether all buffers should be cleared.\r\n\t */\r\n\r\n\tconstructor(scene, camera, options = {}) {\r\n\r\n\t\tsuper(\"RenderPass\", scene, camera, null);\r\n\r\n\t\tthis.needsSwap = false;\r\n\r\n\t\t/**\r\n\t\t * A clear pass.\r\n\t\t *\r\n\t\t * @type {ClearPass}\r\n\t\t */\r\n\r\n\t\tthis.clearPass = new ClearPass(options);\r\n\r\n\t\t/**\r\n\t\t * An override material.\r\n\t\t *\r\n\t\t * @type {Material}\r\n\t\t */\r\n\r\n\t\tthis.overrideMaterial = (options.overrideMaterial !== undefined) ? options.overrideMaterial : null;\r\n\r\n\t\t/**\r\n\t\t * Indicates whether the depth buffer should be cleared explicitly.\r\n\t\t *\r\n\t\t * @type {Boolean}\r\n\t\t */\r\n\r\n\t\tthis.clearDepth = (options.clearDepth !== undefined) ? options.clearDepth : false;\r\n\r\n\t\t/**\r\n\t\t * Indicates whether the color, depth and stencil buffers should be cleared.\r\n\t\t *\r\n\t\t * Even with clear set to true you can prevent specific buffers from being\r\n\t\t * cleared by setting either the autoClearColor, autoClearStencil or\r\n\t\t * autoClearDepth properties of the renderer to false.\r\n\t\t *\r\n\t\t * @type {Boolean}\r\n\t\t */\r\n\r\n\t\tthis.clear = (options.clear !== undefined) ? options.clear : true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the scene.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tconst scene = this.scene;\r\n\t\tconst renderTarget = this.renderToScreen ? null : inputBuffer;\r\n\t\tconst overrideMaterial = scene.overrideMaterial;\r\n\r\n\t\tif(this.clear) {\r\n\r\n\t\t\tthis.clearPass.renderToScreen = this.renderToScreen;\r\n\t\t\tthis.clearPass.render(renderer, inputBuffer);\r\n\r\n\t\t} else if(this.clearDepth) {\r\n\r\n\t\t\trenderer.setRenderTarget(renderTarget);\r\n\t\t\trenderer.clearDepth();\r\n\r\n\t\t}\r\n\r\n\t\tscene.overrideMaterial = this.overrideMaterial;\r\n\t\trenderer.render(scene, this.camera, renderTarget);\r\n\t\tscene.overrideMaterial = overrideMaterial;\r\n\r\n\t}\r\n\r\n}\r\n","import {\r\n\tColor,\r\n\tLinearFilter,\r\n\tMeshBasicMaterial,\r\n\tRGBFormat,\r\n\tScene,\r\n\tVector3,\r\n\tWebGLRenderTarget\r\n} from \"three\";\r\n\r\nimport { CombineMaterial, GodRaysMaterial, KernelSize } from \"../materials\";\r\nimport { RenderPass } from \"./RenderPass.js\";\r\nimport { BlurPass } from \"./BlurPass.js\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * Clamps a given value.\r\n *\r\n * @private\r\n * @param {Number} value - The value to clamp.\r\n * @param {Number} min - The lowest possible value.\r\n * @param {Number} max - The highest possible value.\r\n * @return {Number} The clamped value.\r\n */\r\n\r\nfunction clamp(value, min, max) {\r\n\r\n\treturn Math.max(min, Math.min(max, value));\r\n\r\n}\r\n\r\n/**\r\n * A crepuscular rays pass.\r\n */\r\n\r\nexport class GodRaysPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new god rays pass.\r\n\t *\r\n\t * @param {Scene} scene - The main scene.\r\n\t * @param {Camera} camera - The main camera.\r\n\t * @param {Object3D} lightSource - The main light source.\r\n\t * @param {Object} [options] - The options.\r\n\t * @param {Number} [options.density=0.96] - The density of the light rays.\r\n\t * @param {Number} [options.decay=0.93] - An illumination decay factor.\r\n\t * @param {Number} [options.weight=0.4] - A light ray weight factor.\r\n\t * @param {Number} [options.exposure=0.6] - A constant attenuation coefficient.\r\n\t * @param {Number} [options.clampMax=1.0] - An upper bound for the saturation of the overall effect.\r\n\t * @param {Number} [options.intensity=1.0] - A constant factor for additive blending.\r\n\t * @param {Number} [options.resolutionScale=0.5] - The render texture resolution scale, relative to the screen render size.\r\n\t * @param {Number} [options.kernelSize=KernelSize.LARGE] - The blur kernel size.\r\n\t * @param {Number} [options.samples=60] - The number of samples per pixel.\r\n\t * @param {Number} [options.screenMode=true] - Whether the screen blend mode should be used for combining the god rays texture with the scene colors.\r\n\t */\r\n\r\n\tconstructor(scene, camera, lightSource, options = {}) {\r\n\r\n\t\tsuper(\"GodRaysPass\");\r\n\r\n\t\t/**\r\n\t\t * A scene that only contains the light source.\r\n\t\t *\r\n\t\t * @type {Scene}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.lightScene = new Scene();\r\n\r\n\t\t/**\r\n\t\t * The main scene.\r\n\t\t *\r\n\t\t * @type {Scene}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.mainScene = scene;\r\n\r\n\t\t/**\r\n\t\t * The main camera.\r\n\t\t *\r\n\t\t * @type {Camera}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.mainCamera = camera;\r\n\r\n\t\t/**\r\n\t\t * A render target.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderTargetX = new WebGLRenderTarget(1, 1, {\r\n\t\t\tminFilter: LinearFilter,\r\n\t\t\tmagFilter: LinearFilter,\r\n\t\t\tstencilBuffer: false,\r\n\t\t\tdepthBuffer: false\r\n\t\t});\r\n\r\n\t\tthis.renderTargetX.texture.name = \"GodRays.TargetX\";\r\n\t\tthis.renderTargetX.texture.generateMipmaps = false;\r\n\r\n\t\t/**\r\n\t\t * A second render target.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderTargetY = this.renderTargetX.clone();\r\n\r\n\t\tthis.renderTargetY.texture.name = \"GodRays.TargetY\";\r\n\r\n\t\t/**\r\n\t\t * A render target for the masked light scene.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderTargetMask = new WebGLRenderTarget(1, 1, {\r\n\t\t\tminFilter: LinearFilter,\r\n\t\t\tmagFilter: LinearFilter\r\n\t\t});\r\n\r\n\t\tthis.renderTargetMask.texture.name = \"GodRays.Mask\";\r\n\t\tthis.renderTargetMask.texture.generateMipmaps = false;\r\n\r\n\t\t/**\r\n\t\t * A pass that only renders the light source.\r\n\t\t *\r\n\t\t * @type {RenderPass}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderPassLight = new RenderPass(this.lightScene, this.mainCamera, {\r\n\t\t\tclearColor: new Color(0x000000)\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * A pass that renders the masked scene over the light.\r\n\t\t *\r\n\t\t * @type {RenderPass}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderPassMask = new RenderPass(this.mainScene, this.mainCamera, {\r\n\t\t\toverrideMaterial: new MeshBasicMaterial({ color: 0x000000 })\r\n\t\t});\r\n\r\n\t\tthis.renderPassMask.clear = false;\r\n\r\n\t\t/**\r\n\t\t * A blur pass.\r\n\t\t *\r\n\t\t * @type {BlurPass}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.blurPass = new BlurPass(options);\r\n\r\n\t\t/**\r\n\t\t * The light source.\r\n\t\t *\r\n\t\t * @type {Object3D}\r\n\t\t */\r\n\r\n\t\tthis.lightSource = lightSource;\r\n\r\n\t\t/**\r\n\t\t * The light position in screen space.\r\n\t\t *\r\n\t\t * @type {Vector3}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.screenPosition = new Vector3();\r\n\r\n\t\t/**\r\n\t\t * A god rays shader material.\r\n\t\t *\r\n\t\t * @type {GodRaysMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.godRaysMaterial = new GodRaysMaterial(options);\r\n\t\tthis.godRaysMaterial.uniforms.lightPosition.value = this.screenPosition;\r\n\r\n\t\tthis.samples = options.samples;\r\n\r\n\t\t/**\r\n\t\t * A combine shader material.\r\n\t\t *\r\n\t\t * @type {CombineMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.combineMaterial = new CombineMaterial((options.screenMode !== undefined) ? options.screenMode : true);\r\n\r\n\t\tthis.intensity = options.intensity;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The resolution scale.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tget resolutionScale() {\r\n\r\n\t\treturn this.blurPass.resolutionScale;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * You need to call {@link EffectComposer#setSize} after changing this value.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tset resolutionScale(value = 0.5) {\r\n\r\n\t\tthis.blurPass.resolutionScale = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The blur kernel size.\r\n\t *\r\n\t * @type {KernelSize}\r\n\t */\r\n\r\n\tget kernelSize() {\r\n\r\n\t\treturn this.blurPass.kernelSize;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * @type {KernelSize}\r\n\t */\r\n\r\n\tset kernelSize(value = KernelSize.LARGE) {\r\n\r\n\t\tthis.blurPass.kernelSize = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The overall intensity of the effect.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tget intensity() {\r\n\r\n\t\treturn this.combineMaterial.uniforms.opacity2.value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tset intensity(value = 1.0) {\r\n\r\n\t\tthis.combineMaterial.uniforms.opacity2.value = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The number of samples per pixel.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tget samples() {\r\n\r\n\t\treturn Number.parseInt(this.godRaysMaterial.defines.NUM_SAMPLES_INT);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This value must be carefully chosen. A higher value directly increases the\r\n\t * GPU load.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tset samples(value = 60) {\r\n\r\n\t\tvalue = Math.floor(value);\r\n\r\n\t\tthis.godRaysMaterial.defines.NUM_SAMPLES_FLOAT = value.toFixed(1);\r\n\t\tthis.godRaysMaterial.defines.NUM_SAMPLES_INT = value.toFixed(0);\r\n\t\tthis.godRaysMaterial.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Indicates whether dithering is enabled.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tget dithering() {\r\n\r\n\t\treturn this.godRaysMaterial.dithering;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * If enabled, the result will be dithered to remove banding artifacts.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tset dithering(value) {\r\n\r\n\t\tif(this.dithering !== value) {\r\n\r\n\t\t\tthis.godRaysMaterial.dithering = value;\r\n\t\t\tthis.godRaysMaterial.needsUpdate = true;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Indicates whether the effect should be applied to the input buffer.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tget blend() {\r\n\r\n\t\treturn this.needsSwap;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * If disabled, the input buffer will remain unaffected.\r\n\t *\r\n\t * You may use the {@link BloomPass#overlay} texture to apply the effect to\r\n\t * your scene.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tset blend(value) {\r\n\r\n\t\tthis.needsSwap = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The effect overlay texture.\r\n\t *\r\n\t * @type {Texture}\r\n\t */\r\n\r\n\tget overlay() {\r\n\r\n\t\treturn this.renderTargetY.texture;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tconst scene = this.scene;\r\n\t\tconst camera = this.camera;\r\n\t\tconst mainScene = this.mainScene;\r\n\r\n\t\tconst lightSource = this.lightSource;\r\n\t\tconst screenPosition = this.screenPosition;\r\n\r\n\t\tconst godRaysMaterial = this.godRaysMaterial;\r\n\t\tconst combineMaterial = this.combineMaterial;\r\n\r\n\t\tconst renderTargetMask = this.renderTargetMask;\r\n\t\tconst renderTargetX = this.renderTargetX;\r\n\t\tconst renderTargetY = this.renderTargetY;\r\n\r\n\t\tlet background, parent;\r\n\r\n\t\t// Compute the screen light position and translate it to [0.0, 1.0].\r\n\t\tscreenPosition.copy(lightSource.position).project(this.mainCamera);\r\n\t\tscreenPosition.x = clamp((screenPosition.x + 1.0) * 0.5, 0.0, 1.0);\r\n\t\tscreenPosition.y = clamp((screenPosition.y + 1.0) * 0.5, 0.0, 1.0);\r\n\r\n\t\tparent = lightSource.parent;\r\n\t\tbackground = mainScene.background;\r\n\t\tmainScene.background = null;\r\n\t\tthis.lightScene.add(lightSource);\r\n\r\n\t\t/* First, render the light source. Then render the scene into the same\r\n\t\tbuffer using a mask override material with depth test enabled. */\r\n\t\tthis.renderPassLight.render(renderer, renderTargetMask);\r\n\t\tthis.renderPassMask.render(renderer, renderTargetMask);\r\n\r\n\t\tif(parent !== null) {\r\n\r\n\t\t\tparent.add(lightSource);\r\n\r\n\t\t}\r\n\r\n\t\tmainScene.background = background;\r\n\r\n\t\t// Blur the masked scene to reduce artifacts.\r\n\t\tthis.blurPass.render(renderer, this.renderTargetMask, renderTargetX);\r\n\r\n\t\t// Blur the masked scene along radial lines towards the light source.\r\n\t\tthis.material = godRaysMaterial;\r\n\t\tgodRaysMaterial.uniforms.tDiffuse.value = renderTargetX.texture;\r\n\t\trenderer.render(scene, camera, renderTargetY);\r\n\r\n\t\tif(this.blend) {\r\n\r\n\t\t\t// Combine the god rays with the scene colors.\r\n\t\t\tthis.material = combineMaterial;\r\n\t\t\tcombineMaterial.uniforms.texture1.value = inputBuffer.texture;\r\n\t\t\tcombineMaterial.uniforms.texture2.value = renderTargetY.texture;\r\n\r\n\t\t\trenderer.render(scene, camera, this.renderToScreen ? null : outputBuffer);\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the size of this pass.\r\n\t *\r\n\t * @param {Number} width - The width.\r\n\t * @param {Number} height - The height.\r\n\t */\r\n\r\n\tsetSize(width, height) {\r\n\r\n\t\tthis.renderPassLight.setSize(width, height);\r\n\t\tthis.renderPassMask.setSize(width, height);\r\n\t\tthis.blurPass.setSize(width, height);\r\n\r\n\t\twidth = this.blurPass.width;\r\n\t\theight = this.blurPass.height;\r\n\r\n\t\tthis.renderTargetMask.setSize(width, height);\r\n\t\tthis.renderTargetX.setSize(width, height);\r\n\t\tthis.renderTargetY.setSize(width, height);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Performs initialization tasks.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\r\n\t */\r\n\r\n\tinitialize(renderer, alpha) {\r\n\r\n\t\tthis.renderPassLight.initialize(renderer, alpha);\r\n\t\tthis.renderPassMask.initialize(renderer, alpha);\r\n\t\tthis.blurPass.initialize(renderer, alpha);\r\n\r\n\t\tif(!alpha) {\r\n\r\n\t\t\tthis.renderTargetMask.texture.format = RGBFormat;\r\n\t\t\tthis.renderTargetX.texture.format = RGBFormat;\r\n\t\t\tthis.renderTargetY.texture.format = RGBFormat;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n","import { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * A mask pass.\r\n */\r\n\r\nexport class MaskPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new mask pass.\r\n\t *\r\n\t * @param {Scene} scene - The scene to render.\r\n\t * @param {Camera} camera - The camera to use.\r\n\t */\r\n\r\n\tconstructor(scene, camera) {\r\n\r\n\t\tsuper(\"MaskPass\", scene, camera, null);\r\n\r\n\t\tthis.needsSwap = false;\r\n\r\n\t\t/**\r\n\t\t * Inverse flag.\r\n\t\t *\r\n\t\t * @type {Boolean}\r\n\t\t */\r\n\r\n\t\tthis.inverse = false;\r\n\r\n\t\t/**\r\n\t\t * Stencil buffer clear flag.\r\n\t\t *\r\n\t\t * @type {Boolean}\r\n\t\t */\r\n\r\n\t\tthis.clearStencil = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tconst context = renderer.context;\r\n\t\tconst state = renderer.state;\r\n\r\n\t\tconst scene = this.scene;\r\n\t\tconst camera = this.camera;\r\n\r\n\t\tconst writeValue = this.inverse ? 0 : 1;\r\n\t\tconst clearValue = 1 - writeValue;\r\n\r\n\t\t// Don't update color or depth.\r\n\t\tstate.buffers.color.setMask(false);\r\n\t\tstate.buffers.depth.setMask(false);\r\n\r\n\t\t// Lock the buffers.\r\n\t\tstate.buffers.color.setLocked(true);\r\n\t\tstate.buffers.depth.setLocked(true);\r\n\r\n\t\t// Configure the stencil.\r\n\t\tstate.buffers.stencil.setTest(true);\r\n\t\tstate.buffers.stencil.setOp(context.REPLACE, context.REPLACE, context.REPLACE);\r\n\t\tstate.buffers.stencil.setFunc(context.ALWAYS, writeValue, 0xffffffff);\r\n\t\tstate.buffers.stencil.setClear(clearValue);\r\n\r\n\t\t// Clear the stencil.\r\n\t\tif(this.clearStencil) {\r\n\r\n\t\t\tif(this.renderToScreen) {\r\n\r\n\t\t\t\trenderer.setRenderTarget(null);\r\n\t\t\t\trenderer.clearStencil();\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\trenderer.setRenderTarget(inputBuffer);\r\n\t\t\t\trenderer.clearStencil();\r\n\r\n\t\t\t\trenderer.setRenderTarget(outputBuffer);\r\n\t\t\t\trenderer.clearStencil();\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// Draw the mask.\r\n\t\tif(this.renderToScreen) {\r\n\r\n\t\t\trenderer.render(scene, camera, null);\r\n\r\n\t\t} else {\r\n\r\n\t\t\trenderer.render(scene, camera, inputBuffer);\r\n\t\t\trenderer.render(scene, camera, outputBuffer);\r\n\r\n\t\t}\r\n\r\n\t\t// Unlock the buffers.\r\n\t\tstate.buffers.color.setLocked(false);\r\n\t\tstate.buffers.depth.setLocked(false);\r\n\r\n\t\t// Only render where the stencil is set to 1.\r\n\t\tstate.buffers.stencil.setFunc(context.EQUAL, 1, 0xffffffff);\r\n\t\tstate.buffers.stencil.setOp(context.KEEP, context.KEEP, context.KEEP);\r\n\r\n\t}\r\n\r\n}\r\n","import { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * A shader pass.\r\n *\r\n * Used to render any shader material as a 2D filter.\r\n */\r\n\r\nexport class ShaderPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new shader pass.\r\n\t *\r\n\t * @param {ShaderMaterial} material - The shader material to use.\r\n\t * @param {String} [textureID=\"tDiffuse\"] - The texture uniform identifier.\r\n\t */\r\n\r\n\tconstructor(material, textureID = \"tDiffuse\") {\r\n\r\n\t\tsuper(\"ShaderPass\");\r\n\r\n\t\tthis.material = material;\r\n\r\n\t\t/**\r\n\t\t * The name of the color sampler uniform of the given material.\r\n\t\t *\r\n\t\t * @type {String}\r\n\t\t */\r\n\r\n\t\tthis.textureID = textureID;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tif(this.material.uniforms[this.textureID] !== undefined) {\r\n\r\n\t\t\tthis.material.uniforms[this.textureID].value = inputBuffer.texture;\r\n\r\n\t\t}\r\n\r\n\t\trenderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);\r\n\r\n\t}\r\n\r\n}\r\n","import {\r\n\tColor,\r\n\tLinearFilter,\r\n\tMeshDepthMaterial,\r\n\tRGBADepthPacking,\r\n\tRGBFormat,\r\n\tWebGLRenderTarget\r\n} from \"three\";\r\n\r\nimport {\r\n\tCopyMaterial,\r\n\tDepthComparisonMaterial,\r\n\tOutlineBlendMaterial,\r\n\tOutlineEdgesMaterial,\r\n\tKernelSize\r\n} from \"../materials\";\r\n\r\nimport { BlurPass } from \"./BlurPass.js\";\r\nimport { Pass } from \"./Pass.js\";\r\nimport { RenderPass } from \"./RenderPass.js\";\r\nimport { ShaderPass } from \"./ShaderPass.js\";\r\n\r\n/**\r\n * An outline pass.\r\n */\r\n\r\nexport class OutlinePass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new outline pass.\r\n\t *\r\n\t * @param {Scene} scene - The main scene.\r\n\t * @param {Camera} camera - The main camera.\r\n\t * @param {Object} [options] - Additional parameters. See {@link BlurPass}, {@link OutlineBlendMaterial} and {@link OutlineEdgesMaterial} for details.\r\n\t * @param {Number} [options.pulseSpeed=0.0] - The pulse speed. A value of zero disables the pulse effect.\r\n\t * @param {Boolean} [options.blur=true] - Whether the outline should be blurred.\r\n\t */\r\n\r\n\tconstructor(scene, camera, options = {}) {\r\n\r\n\t\tsuper(\"OutlinePass\");\r\n\r\n\t\t/**\r\n\t\t * The main scene.\r\n\t\t *\r\n\t\t * @type {Scene}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.mainScene = scene;\r\n\r\n\t\t/**\r\n\t\t * The main camera.\r\n\t\t *\r\n\t\t * @type {Camera}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.mainCamera = camera;\r\n\r\n\t\t/**\r\n\t\t * A render target for depth information.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderTargetDepth = new WebGLRenderTarget(1, 1, {\r\n\t\t\tminFilter: LinearFilter,\r\n\t\t\tmagFilter: LinearFilter\r\n\t\t});\r\n\r\n\t\tthis.renderTargetDepth.texture.name = \"Outline.Depth\";\r\n\t\tthis.renderTargetDepth.texture.generateMipmaps = false;\r\n\r\n\t\t/**\r\n\t\t * A render target for the outline mask.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderTargetMask = this.renderTargetDepth.clone();\r\n\r\n\t\tthis.renderTargetMask.texture.format = RGBFormat;\r\n\t\tthis.renderTargetMask.texture.name = \"Outline.Mask\";\r\n\r\n\t\t/**\r\n\t\t * A render target for the edge detection.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderTargetEdges = new WebGLRenderTarget(1, 1, {\r\n\t\t\tminFilter: LinearFilter,\r\n\t\t\tmagFilter: LinearFilter,\r\n\t\t\tstencilBuffer: false,\r\n\t\t\tdepthBuffer: false,\r\n\t\t\tformat: RGBFormat\r\n\t\t});\r\n\r\n\t\tthis.renderTargetEdges.texture.name = \"Outline.Edges\";\r\n\t\tthis.renderTargetEdges.texture.generateMipmaps = false;\r\n\r\n\t\t/**\r\n\t\t * A render target for the blurred outline overlay.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderTargetBlurredEdges = this.renderTargetEdges.clone();\r\n\r\n\t\tthis.renderTargetBlurredEdges.texture.name = \"Outline.BlurredEdges\";\r\n\r\n\t\t/**\r\n\t\t * A depth pass.\r\n\t\t *\r\n\t\t * @type {RenderPass}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderPassDepth = new RenderPass(this.mainScene, this.mainCamera, {\r\n\t\t\toverrideMaterial: new MeshDepthMaterial({\r\n\t\t\t\tdepthPacking: RGBADepthPacking,\r\n\t\t\t\tmorphTargets: true,\r\n\t\t\t\tskinning: true\r\n\t\t\t}),\r\n\t\t\tclearColor: new Color(0xffffff),\r\n\t\t\tclearAlpha: 1.0\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * A depth comparison mask pass.\r\n\t\t *\r\n\t\t * @type {RenderPass}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderPassMask = new RenderPass(this.mainScene, this.mainCamera, {\r\n\t\t\toverrideMaterial: new DepthComparisonMaterial(this.renderTargetDepth.texture, this.mainCamera),\r\n\t\t\tclearColor: new Color(0xffffff),\r\n\t\t\tclearAlpha: 1.0\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * A blur pass.\r\n\t\t *\r\n\t\t * @type {BlurPass}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.blurPass = new BlurPass(options);\r\n\r\n\t\tthis.kernelSize = options.kernelSize;\r\n\r\n\t\t/**\r\n\t\t * A copy pass that renders the read buffer to screen if needed.\r\n\t\t *\r\n\t\t * @type {ShaderPass}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.copyPass = new ShaderPass(new CopyMaterial());\r\n\t\tthis.copyPass.renderToScreen = true;\r\n\r\n\t\t/**\r\n\t\t * An outline edge detection material.\r\n\t\t *\r\n\t\t * @type {OutlineEdgesMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.outlineEdgesMaterial = new OutlineEdgesMaterial(options);\r\n\t\tthis.outlineEdgesMaterial.uniforms.tMask.value = this.renderTargetMask.texture;\r\n\r\n\t\t/**\r\n\t\t * An outline blend material.\r\n\t\t *\r\n\t\t * @type {OutlineBlendMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.outlineBlendMaterial = new OutlineBlendMaterial(options);\r\n\t\tthis.outlineBlendMaterial.uniforms.tMask.value = this.renderTargetMask.texture;\r\n\r\n\t\tthis.blur = (options.blur !== undefined) ? options.blur : true;\r\n\r\n\t\t/**\r\n\t\t * A list of objects to outline.\r\n\t\t *\r\n\t\t * @type {Object3D[]}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.selection = [];\r\n\r\n\t\t/**\r\n\t\t * The current animation time.\r\n\t\t *\r\n\t\t * @type {Number}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.time = 0.0;\r\n\r\n\t\t/**\r\n\t\t * The pulse speed. A value of zero disables the pulse effect.\r\n\t\t *\r\n\t\t * @type {Number}\r\n\t\t */\r\n\r\n\t\tthis.pulseSpeed = (options.pulseSpeed !== undefined) ? options.pulseSpeed : 0.0;\r\n\r\n\t\t/**\r\n\t\t * A dedicated render layer for selected objects.\r\n\t\t *\r\n\t\t * This layer is set to 10 by default. If this collides with your own custom\r\n\t\t * layers, please change it to a free layer before rendering!\r\n\t\t *\r\n\t\t * @type {Number}\r\n\t\t */\r\n\r\n\t\tthis.selectionLayer = 10;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The resolution scale.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tget resolutionScale() {\r\n\r\n\t\treturn this.blurPass.resolutionScale;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * You need to call {@link EffectComposer#setSize} after changing this value.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tset resolutionScale(value = 0.5) {\r\n\r\n\t\tthis.blurPass.resolutionScale = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The blur kernel size.\r\n\t *\r\n\t * @type {KernelSize}\r\n\t */\r\n\r\n\tget kernelSize() {\r\n\r\n\t\treturn this.blurPass.kernelSize;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * @type {KernelSize}\r\n\t */\r\n\r\n\tset kernelSize(value = KernelSize.VERY_SMALL) {\r\n\r\n\t\tthis.blurPass.kernelSize = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Indicates whether the outline overlay should be blurred.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tget blur() {\r\n\r\n\t\treturn this.blurPass.enabled;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tset blur(value) {\r\n\r\n\t\tthis.blurPass.enabled = value;\r\n\r\n\t\tthis.outlineBlendMaterial.uniforms.tEdges.value = value ?\r\n\t\t\tthis.renderTargetBlurredEdges.texture :\r\n\t\t\tthis.renderTargetEdges.texture;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Indicates whether dithering is enabled.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tget dithering() {\r\n\r\n\t\treturn this.blurPass.dithering;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * If enabled, the result will be dithered to remove banding artifacts.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tset dithering(value) {\r\n\r\n\t\tthis.blurPass.dithering = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Indicates whether the effect should be applied to the input buffer.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tget blend() {\r\n\r\n\t\treturn this.needsSwap;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * If disabled, the input buffer will remain unaffected.\r\n\t *\r\n\t * You may use the {@link BloomPass#overlay} texture to apply the effect to\r\n\t * your scene.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tset blend(value) {\r\n\r\n\t\tthis.needsSwap = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The effect overlay texture.\r\n\t *\r\n\t * @type {Texture}\r\n\t */\r\n\r\n\tget overlay() {\r\n\r\n\t\treturn this.outlineBlendMaterial.uniforms.tEdges.value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Sets a pattern texture to use as an overlay for selected objects.\r\n\t *\r\n\t * @param {Texture} [texture=null] - A pattern texture. Set to null to disable the pattern.\r\n\t */\r\n\r\n\tsetPatternTexture(texture = null) {\r\n\r\n\t\tthis.outlineBlendMaterial.setPatternTexture(texture);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Clears the current selection and selects a list of objects.\r\n\t *\r\n\t * @param {Object3D[]} objects - The objects that should be outlined. This array will be copied.\r\n\t * @return {OutlinePass} This pass.\r\n\t */\r\n\r\n\tsetSelection(objects) {\r\n\r\n\t\tconst selection = objects.slice(0);\r\n\t\tconst selectionLayer = this.selectionLayer;\r\n\r\n\t\tlet i, l;\r\n\r\n\t\tthis.clearSelection();\r\n\r\n\t\tfor(i = 0, l = selection.length; i < l; ++i) {\r\n\r\n\t\t\tselection[i].layers.enable(selectionLayer);\r\n\r\n\t\t}\r\n\r\n\t\tthis.selection = selection;\r\n\r\n\t\treturn this;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Clears the list of selected objects.\r\n\t *\r\n\t * @return {OutlinePass} This pass.\r\n\t */\r\n\r\n\tclearSelection() {\r\n\r\n\t\tconst selection = this.selection;\r\n\t\tconst selectionLayer = this.selectionLayer;\r\n\r\n\t\tlet i, l;\r\n\r\n\t\tfor(i = 0, l = selection.length; i < l; ++i) {\r\n\r\n\t\t\tselection[i].layers.disable(selectionLayer);\r\n\r\n\t\t}\r\n\r\n\t\tthis.selection = [];\r\n\t\tthis.time = 0.0;\r\n\r\n\t\treturn this;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Selects an object.\r\n\t *\r\n\t * @param {Object3D} object - The object that should be outlined.\r\n\t * @return {OutlinePass} This pass.\r\n\t */\r\n\r\n\tselectObject(object) {\r\n\r\n\t\tobject.layers.enable(this.selectionLayer);\r\n\t\tthis.selection.push(object);\r\n\r\n\t\treturn this;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Deselects an object.\r\n\t *\r\n\t * @param {Object3D} object - The object that should no longer be outlined.\r\n\t * @return {OutlinePass} This pass.\r\n\t */\r\n\r\n\tdeselectObject(object) {\r\n\r\n\t\tconst selection = this.selection;\r\n\t\tconst index = selection.indexOf(object);\r\n\r\n\t\tif(index >= 0) {\r\n\r\n\t\t\tselection[index].layers.disable(this.selectionLayer);\r\n\t\t\tselection.splice(index, 1);\r\n\r\n\t\t\tif(selection.length === 0) {\r\n\r\n\t\t\t\tthis.time = 0.0;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the visibility of all selected objects.\r\n\t *\r\n\t * @private\r\n\t * @param {Boolean} visible - Whether the selected objects should be visible.\r\n\t */\r\n\r\n\tsetSelectionVisible(visible) {\r\n\r\n\t\tconst selection = this.selection;\r\n\r\n\t\tlet i, l;\r\n\r\n\t\tfor(i = 0, l = selection.length; i < l; ++i) {\r\n\r\n\t\t\tif(visible) {\r\n\r\n\t\t\t\tselection[i].layers.enable(0);\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tselection[i].layers.disable(0);\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tconst mainScene = this.mainScene;\r\n\t\tconst mainCamera = this.mainCamera;\r\n\t\tconst pulse = this.outlineBlendMaterial.uniforms.pulse;\r\n\r\n\t\tlet background, mask;\r\n\r\n\t\tif(this.selection.length > 0) {\r\n\r\n\t\t\tbackground = mainScene.background;\r\n\t\t\tmask = mainCamera.layers.mask;\r\n\t\t\tmainScene.background = null;\r\n\r\n\t\t\tpulse.value = 1.0;\r\n\r\n\t\t\tif(this.pulseSpeed > 0.0) {\r\n\r\n\t\t\t\tpulse.value = 0.625 + Math.cos(this.time * this.pulseSpeed * 10.0) * 0.375;\r\n\t\t\t\tthis.time += delta;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// Render a custom depth texture and ignore selected objects.\r\n\t\t\tthis.setSelectionVisible(false);\r\n\t\t\tthis.renderPassDepth.render(renderer, this.renderTargetDepth);\r\n\t\t\tthis.setSelectionVisible(true);\r\n\r\n\t\t\t// Create a mask for the selected objects using the depth information.\r\n\t\t\tmainCamera.layers.mask = 1 << this.selectionLayer;\r\n\t\t\tthis.renderPassMask.render(renderer, this.renderTargetMask);\r\n\r\n\t\t\t// Restore the camera layer mask and the scene background.\r\n\t\t\tmainCamera.layers.mask = mask;\r\n\t\t\tmainScene.background = background;\r\n\r\n\t\t\t// Detect the outline.\r\n\t\t\tthis.material = this.outlineEdgesMaterial;\r\n\t\t\trenderer.render(this.scene, this.camera, this.renderTargetEdges);\r\n\r\n\t\t\tif(this.blurPass.enabled) {\r\n\r\n\t\t\t\t// Blur the edges.\r\n\t\t\t\tthis.blurPass.render(renderer, this.renderTargetEdges, this.renderTargetBlurredEdges);\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif(this.blend) {\r\n\r\n\t\t\t\t// Draw the final overlay onto the scene colours.\r\n\t\t\t\tthis.material = this.outlineBlendMaterial;\r\n\t\t\t\tthis.outlineBlendMaterial.uniforms.tDiffuse.value = inputBuffer.texture;\r\n\t\t\t\trenderer.render(this.scene, this.camera, this.renderToScreen ? null : this.outputBuffer);\r\n\r\n\t\t\t}\r\n\r\n\t\t} else if(this.renderToScreen) {\r\n\r\n\t\t\t// Draw the read buffer to screen.\r\n\t\t\tthis.copyPass.render(renderer, inputBuffer);\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the size of this pass.\r\n\t *\r\n\t * @param {Number} width - The width.\r\n\t * @param {Number} height - The height.\r\n\t */\r\n\r\n\tsetSize(width, height) {\r\n\r\n\t\tthis.renderTargetDepth.setSize(width, height);\r\n\t\tthis.renderTargetMask.setSize(width, height);\r\n\r\n\t\tthis.renderPassDepth.setSize(width, height);\r\n\t\tthis.renderPassMask.setSize(width, height);\r\n\t\tthis.blurPass.setSize(width, height);\r\n\r\n\t\twidth = this.blurPass.width;\r\n\t\theight = this.blurPass.height;\r\n\r\n\t\tthis.renderTargetEdges.setSize(width, height);\r\n\t\tthis.renderTargetBlurredEdges.setSize(width, height);\r\n\r\n\t\tthis.outlineBlendMaterial.uniforms.aspect.value = width / height;\r\n\t\tthis.outlineEdgesMaterial.setTexelSize(1.0 / width, 1.0 / height);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Performs initialization tasks.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\r\n\t */\r\n\r\n\tinitialize(renderer, alpha) {\r\n\r\n\t\tthis.renderPassDepth.initialize(renderer, alpha);\r\n\t\tthis.renderPassMask.initialize(renderer, alpha);\r\n\t\tthis.blurPass.initialize(renderer, alpha);\r\n\r\n\t}\r\n\r\n}\r\n","import { PixelationMaterial } from \"../materials\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * A pixelation pass.\r\n */\r\n\r\nexport class PixelationPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new pixelation pass.\r\n\t *\r\n\t * @param {Number} [granularity=30.0] - The intensity of the effect.\r\n\t */\r\n\r\n\tconstructor(granularity = 30.0) {\r\n\r\n\t\tsuper(\"PixelationPass\");\r\n\r\n\t\tthis.material = new PixelationMaterial();\r\n\r\n\t\tthis.granularity = granularity;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The pixel granularity.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tget granularity() {\r\n\r\n\t\treturn this.material.granularity;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * A higher value yields coarser visuals.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tset granularity(value = 30) {\r\n\r\n\t\tvalue = Math.floor(value);\r\n\r\n\t\tif(value % 2 > 0) {\r\n\r\n\t\t\tvalue += 1;\r\n\r\n\t\t}\r\n\r\n\t\tthis.material.granularity = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tthis.material.uniforms.tDiffuse.value = inputBuffer.texture;\r\n\r\n\t\trenderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the size of this pass.\r\n\t *\r\n\t * @param {Number} width - The width.\r\n\t * @param {Number} height - The height.\r\n\t */\r\n\r\n\tsetSize(width, height) {\r\n\r\n\t\tthis.material.setResolution(width, height);\r\n\r\n\t}\r\n\r\n}\r\n","import { RealisticBokehMaterial } from \"../materials\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * An advanced Depth of Field (DoF) pass.\r\n *\r\n * Yields more realistic results but is also more demanding.\r\n *\r\n * This pass requires a {@link EffectComposer#depthTexture}.\r\n */\r\n\r\nexport class RealisticBokehPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new bokeh pass.\r\n\t *\r\n\t * @param {PerspectiveCamera} camera - The main camera. Used to obtain the focal length and the near and far plane settings.\r\n\t * @param {Object} [options] - Additional parameters. See {@link RealisticBokehMaterial} for details.\r\n\t */\r\n\r\n\tconstructor(camera, options = {}) {\r\n\r\n\t\tsuper(\"RealisticBokehPass\");\r\n\r\n\t\tthis.material = new RealisticBokehMaterial(camera, options);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tthis.material.uniforms.tDiffuse.value = inputBuffer.texture;\r\n\t\tthis.material.uniforms.tDepth.value = inputBuffer.depthTexture;\r\n\r\n\t\trenderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the size of this pass.\r\n\t *\r\n\t * @param {Number} width - The width.\r\n\t * @param {Number} height - The height.\r\n\t */\r\n\r\n\tsetSize(width, height) {\r\n\r\n\t\tthis.material.setTexelSize(1.0 / width, 1.0 / height);\r\n\r\n\t}\r\n\r\n}\r\n","import { LinearFilter, RGBFormat, WebGLRenderTarget } from \"three\";\r\nimport { CopyMaterial } from \"../materials\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * A pass that renders the result from a previous pass to another render target.\r\n */\r\n\r\nexport class SavePass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new save pass.\r\n\t *\r\n\t * @param {WebGLRenderTarget} [renderTarget] - The render target to use for saving the input buffer.\r\n\t * @param {Boolean} [resize=true] - Whether the render target should adjust to the size of the input buffer.\r\n\t */\r\n\r\n\tconstructor(renderTarget, resize = true) {\r\n\r\n\t\tsuper(\"SavePass\");\r\n\r\n\t\tthis.material = new CopyMaterial();\r\n\r\n\t\tthis.needsSwap = false;\r\n\r\n\t\t/**\r\n\t\t * The render target.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t */\r\n\r\n\t\tthis.renderTarget = (renderTarget !== undefined) ? renderTarget : new WebGLRenderTarget(1, 1, {\r\n\t\t\tminFilter: LinearFilter,\r\n\t\t\tmagFilter: LinearFilter,\r\n\t\t\tstencilBuffer: false,\r\n\t\t\tdepthBuffer: false\r\n\t\t});\r\n\r\n\t\tthis.renderTarget.texture.name = \"Save.Target\";\r\n\t\tthis.renderTarget.texture.generateMipmaps = false;\r\n\r\n\t\t/**\r\n\t\t * Indicates whether the render target should be resized when the size of\r\n\t\t * the composer's frame buffer changes.\r\n\t\t *\r\n\t\t * @type {Boolean}\r\n\t\t */\r\n\r\n\t\tthis.resize = resize;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tthis.material.uniforms.tDiffuse.value = inputBuffer.texture;\r\n\r\n\t\trenderer.render(this.scene, this.camera, this.renderTarget);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the size of this pass.\r\n\t *\r\n\t * @param {Number} width - The width.\r\n\t * @param {Number} height - The height.\r\n\t */\r\n\r\n\tsetSize(width, height) {\r\n\r\n\t\tif(this.resize) {\r\n\r\n\t\t\twidth = Math.max(1, width);\r\n\t\t\theight = Math.max(1, height);\r\n\r\n\t\t\tthis.renderTarget.setSize(width, height);\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Performs initialization tasks.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\r\n\t */\r\n\r\n\tinitialize(renderer, alpha) {\r\n\r\n\t\tif(!alpha) {\r\n\r\n\t\t\tthis.renderTarget.texture.format = RGBFormat;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n","import { Vector3 } from \"three\";\r\nimport { CopyMaterial, ShockWaveMaterial } from \"../materials\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * Half PI.\r\n *\r\n * @type {Number}\r\n * @private\r\n */\r\n\r\nconst HALF_PI = Math.PI * 0.5;\r\n\r\n/**\r\n * A vector.\r\n *\r\n * @type {Vector3}\r\n * @private\r\n */\r\n\r\nconst v = new Vector3();\r\n\r\n/**\r\n * A vector.\r\n *\r\n * @type {Vector3}\r\n * @private\r\n */\r\n\r\nconst ab = new Vector3();\r\n\r\n/**\r\n * A shock wave pass.\r\n */\r\n\r\nexport class ShockWavePass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new shock wave pass.\r\n\t *\r\n\t * @param {Camera} camera - The main camera.\r\n\t * @param {Vector3} [epicenter] - The world position of the shock wave epicenter.\r\n\t * @param {Object} [options] - The options.\r\n\t * @param {Number} [options.speed=1.0] - The animation speed.\r\n\t * @param {Number} [options.maxRadius=1.0] - The extent of the shock wave.\r\n\t * @param {Number} [options.waveSize=0.2] - The wave size.\r\n\t * @param {Number} [options.amplitude=0.05] - The distortion amplitude.\r\n\t */\r\n\r\n\tconstructor(camera, epicenter = new Vector3(), options = {}) {\r\n\r\n\t\tsuper(\"ShockWavePass\");\r\n\r\n\t\t/**\r\n\t\t * The main camera.\r\n\t\t *\r\n\t\t * @type {Object3D}\r\n\t\t */\r\n\r\n\t\tthis.mainCamera = camera;\r\n\r\n\t\t/**\r\n\t\t * The epicenter.\r\n\t\t *\r\n\t\t * @type {Vector3}\r\n\t\t * @example shockWavePass.epicenter = myMesh.position;\r\n\t\t */\r\n\r\n\t\tthis.epicenter = epicenter;\r\n\r\n\t\t/**\r\n\t\t * The object position in screen space.\r\n\t\t *\r\n\t\t * @type {Vector3}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.screenPosition = new Vector3();\r\n\r\n\t\t/**\r\n\t\t * The speed of the shock wave animation.\r\n\t\t *\r\n\t\t * @type {Number}\r\n\t\t */\r\n\r\n\t\tthis.speed = (options.speed !== undefined) ? options.speed : 2.0;\r\n\r\n\t\t/**\r\n\t\t * A time accumulator.\r\n\t\t *\r\n\t\t * @type {Number}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.time = 0.0;\r\n\r\n\t\t/**\r\n\t\t * Indicates whether the shock wave animation is active.\r\n\t\t *\r\n\t\t * @type {Boolean}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.active = false;\r\n\r\n\t\t/**\r\n\t\t * A shock wave shader material.\r\n\t\t *\r\n\t\t * @type {ShockWaveMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.shockWaveMaterial = new ShockWaveMaterial(options);\r\n\r\n\t\tthis.shockWaveMaterial.uniforms.center.value = this.screenPosition;\r\n\r\n\t\t/**\r\n\t\t * A copy shader material.\r\n\t\t *\r\n\t\t * @type {CopyMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.copyMaterial = new CopyMaterial();\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Emits the shock wave.\r\n\t */\r\n\r\n\texplode() {\r\n\r\n\t\tthis.time = 0.0;\r\n\t\tthis.active = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tconst epicenter = this.epicenter;\r\n\t\tconst mainCamera = this.mainCamera;\r\n\t\tconst screenPosition = this.screenPosition;\r\n\r\n\t\tconst shockWaveMaterial = this.shockWaveMaterial;\r\n\t\tconst uniforms = shockWaveMaterial.uniforms;\r\n\t\tconst center = uniforms.center;\r\n\t\tconst radius = uniforms.radius;\r\n\t\tconst maxRadius = uniforms.maxRadius;\r\n\t\tconst waveSize = uniforms.waveSize;\r\n\r\n\t\tthis.copyMaterial.uniforms.tDiffuse.value = inputBuffer.texture;\r\n\t\tthis.material = this.copyMaterial;\r\n\r\n\t\tif(this.active) {\r\n\r\n\t\t\t// Calculate direction vectors.\r\n\t\t\tmainCamera.getWorldDirection(v);\r\n\t\t\tab.copy(mainCamera.position).sub(epicenter);\r\n\r\n\t\t\t// Don't render the effect if the object is behind the camera.\r\n\t\t\tif(v.angleTo(ab) > HALF_PI) {\r\n\r\n\t\t\t\t// Scale the effect based on distance to the object.\r\n\t\t\t\tuniforms.cameraDistance.value = mainCamera.position.distanceTo(epicenter);\r\n\r\n\t\t\t\t// Calculate the screen position of the epicenter.\r\n\t\t\t\tscreenPosition.copy(epicenter).project(mainCamera);\r\n\t\t\t\tcenter.value.x = (screenPosition.x + 1.0) * 0.5;\r\n\t\t\t\tcenter.value.y = (screenPosition.y + 1.0) * 0.5;\r\n\r\n\t\t\t\tuniforms.tDiffuse.value = inputBuffer.texture;\r\n\t\t\t\tthis.material = shockWaveMaterial;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// Update the shock wave radius based on time.\r\n\t\t\tthis.time += delta * this.speed;\r\n\t\t\tradius.value = this.time - waveSize.value;\r\n\r\n\t\t\tif(radius.value >= (maxRadius.value + waveSize.value) * 2) {\r\n\r\n\t\t\t\tthis.active = false;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\trenderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the size of this pass.\r\n\t *\r\n\t * @param {Number} width - The width.\r\n\t * @param {Number} height - The height.\r\n\t */\r\n\r\n\tsetSize(width, height) {\r\n\r\n\t\tthis.shockWaveMaterial.uniforms.aspect.value = width / height;\r\n\r\n\t}\r\n\r\n}\r\n","// Generated with SMAASearchImageData.generate().toCanvas().toDataURL(), not cropped, low dynamic range.\r\nexport default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAAAhCAAAAABIXyLAAAAAOElEQVRIx2NgGAWjYBSMglEwEICREYRgFBZBqDCSLA2MGPUIVQETE9iNUAqLR5gIeoQKRgwXjwAAGn4AtaFeYLEAAAAASUVORK5CYII\";\r\n","// Generated with SMAAAreaImageData.generate().toCanvas().toDataURL().\r\nexport default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAIwCAYAAAABNmBHAAAgAElEQVR4Xuy9CbhlV1ktOvbpq09DkiIkUBI6kxASIH0DlAQiIK1wRfSJTx+i4JX7vKIigs8HXpXvqVcvrcC9agQ7IDTSSWgqCQQliDRBJKkkhDSkqVPNqVOnP+8b//rH3P+eZ+199tlznVTlvVrft7+1T7OaueZY42/m37QALKNk2wHg1pITlB17mC+Pp11W3X/LHyT32vhg48/5SOv+PnwpsHA70JoGlueB1iKApeqzvOzn44GatTB76Xzhd7suBR7+WWADgDEAwwCG/L54b/poDLrHuvvm70Z2Avhsc+PVcxscBU8F8C8ADg5+ipIjD/PlGwfgju8B924E5seARUfLsiNmqQW0IjL8+7L2NYD/7COBzfcCm+aB8SVgdAkYIRCXKyDax4EdAanL5PuNPllNvXDlAHwFgP8AcC2AhRIoDXbsYb48dl5WkVFTE3LGDcC9m4CZCWBuFFgeAZaGAYJQQCRqDHT+McJrVb8zwATUXH02MHYfMHEIGFsAxgjApQqACYQORjtd/B7Axt/z79sC0+cMPgjjlwPwVwHcA+DfAHzTxcVgWBroqMN8+cYBeM71wH0TwKExYHYUWCIAHYRLTlkCYgcIBcAgU/n3qy8GRu4HRgnAOWBkERhddPAJhGJDBxkvw7cqimr+zFM/ZLnZF64cgL8BYD+AWwB8x/dlWuWagHiYL984AJ/0RWBy1AE4AizyM1yxYAcTigW55xMbAkxEiwEdkJ/ZCQxPAiOHgBECcKEC4TBZcKkSv+mTieNcNPNC26mLNsj45QD8LQDTAO4GcJt/7iw2bfoG4WG+vAGwm9ExiEg69zpg/wgwPQLMjgALzn4E4aIzoJjQ9g4024uygkj+pyuAoX0VAIfngOH5NgCHMhAm8Sv2y3XDZeBhNIp8OzJE8OsBzAKYBHAXgDt8/4O+MVT0j4f58o0D8Pxrgf3DwMwIMEPQEYRkNwfgsuuDZLskip0No0gWMD/9HGDoADAkAC4Aw/wsAgZAgs2Z0ABI0GU6IVmKv+f28KDnHxkA/G0A8y6G73N9kOCjXnh/Ebb6OvgwX75xAF5wLTA1VIHPADgMLDj4yIA5AAm6aCUnv4oz46eeDwxNAUMzwJAz4BABSNDFTwSfg7DDKHE23MG5PqIY8A1u/dINs9dBdy8AgnGPM2NfUBrsnw7z5RsH4IXXAAcJviFgluAbygBINnSLWOAjGxJ4pgOKDV0v/OSLKp8iGXBovhLBBOCQM2ACoTOhnYrAdItYbCij5JFzRyIAqRccAnDAQUjg6UNQ7hsMXP0cRQAexss3DsCLCECCLwCQzMcPwUi2MwAScAKbfnY/YRLFQ8DHX+IAJAMSfDkAF13kLvleIjhjQQHxUVS3jjgGpKeeNzYVQEjgUS8k+PghONdhIwAP4+XXBYCHKIJbwJyDTgaIAdCBJx3Q2M8tYAHP9m4df/ylQOsQ0JqtRLCx30K1wtLBggScQOgsKBGcWHAJeOwRC0BSM1mQIKRbhh+Bj98JQP6t4U0APEyXXxcAEnxkQAFwoVUxID9kvQg+c1C7vidRbIDkc24B//hTQGumDcCWA5DgMxASdNIFBUI5pCML8v8API5zfEQx4BudgqiczviSnJhQwCP4BMCGl+wO8+U7AJi/W4O4YS6+pmK/2ciADsAOBhTIIiAJnPB7AvNjP+0AnANaYkAHX2JBAc+tYaJXOqBZv24Vc386XW5dtkHGW+4HFAJonpOe+YYQZAShgKjv3PNvPQaxVoI8zJdfFwASfPzMUwS3Kt1v0UFIlos6oDFdAGFcliMAP/ryAEAGNwQRnDOgLbdlIEwrIs6AZ/QgkMMHQF6ZAKQcJAsSYPwIeAIk9wJgoPK1gi7+PwF4GC/fOAAvIQPSs0URTPBJ/Pp3GSEGRHfBCIQ0xowBtUbcAj7ys5X4Jfu1HIAGQrIgQRXEsAFQIORDFhiDY/rMHmrU4QUgR08AkgUjCAW6CD6CkwBsAIQC4GG6fPMA3OXiNzCg2I9gNCMksmAAoemDzoimFwL48M85AKkiuQVMAAp8CYRRDAt8GQiJ67N6GJODAXAHlsGguscA2AJg1IPGYmxOpBxFWkRN9LsATgIwXnNs/v/5z/9XCf8BO3YAtxbc/46/KDt+5+ea1Yku2VUxHz/z0v24FwMGK1gWsK2OUUxHHdCBeRUB6OxHABr4ZICIBd0QWSF+XRdMTAjgCdTrG9cBNwE4F8CpDkICyYLGsuhFt6zs+gISwUen8zEAjgMw4cfx2H6O/90yAFo84Cbg4ID3/9TfLTt+5+ebnRABkODjx0SwPi5ec/FrYpmqSAxM8Dn60CsqAFI6GfhqAMiDE/gokmvEr0C4PgDkBQm40wE8zMFEUDKEVoxIMLl/KS73mE7H9d+vcKHQQcjwW0Yu9nP8m8sAmOIBuWY6wP2/4s0ezjjg8TuvaR6ABJ70vxUApGrm7EbGE+i472BAB+WHfqHS/eoAaEwY2E9+wLSXTqhI7CXgnB6LCoOJ4BiST+hTnG0HcCwAglCx3ARoZEVFXnBPp/O/A/hXACc7CPs9/i1lAOyIB+RDX+P9/+pbQjjjAMfv/PL6AFDs1wFAgs/9fgKfgdE/ZEpuiQlbwAde6QAMBgiRmsSwA9BY0JfjovGRDBMH4TlcXGhcBOc6HkF0gjPhZgchxTLZMAci/04W/B6Ab3t09EPXcPyflgFwRTwgJ2MN9/8bf5qFM67x+B/aW4XQz42FeL0YrRyikztUFw0704mf9kXgxhOAqc3AAsPyRxxQCs/PdXOFY0W1KHy3QIUGtx+6vdnx1vsB+dsTncm2AogglFgVEAlUWrOMB2RyEmMCGQ/Y7/HvKns6tfGAnJQ+r/9b76oJZ1zD8WdyQjYBh8aBhVEHjELouQ8ukQ7VRSCJAALwkr+sALhnGzDD3JAJYJHg9uhoi4bx8ytkWUtvHT/7+Zc4dw1uZ3612fH2dkQf7yxIEEockwkJQn4IQoq8unhAhmPRKKFx0uv4K8ueTs94wD7u//VX9ghn7OP4c+4G7h8HpseB+dF2AKlFLwuAIZ8jD6NPrOhAffmfA9/ZBuzZCkyRWSeqBCWyoYGQ5yQrBpDbum/ME1HoPo0XEkSD2zlfbna8q6+EUJcTCxKEtHL5EQjP6BEPyIgYAZBvYt3xHyx7OqvGA65y/7/9wVXCGVc5/sl7qxD66dEqiYgRzAqhN1A4CBNAAlDyAFI+iZ9/N3DLJuC+jcDUBmCWyUnOrmTYCMIOkNclLg0B8/RsNLg9+UvNjnd1APLmmQpFHyEBROuWACQT8nN+H/GAvY7/VNnT6SsesMf13/CpahGnZzhjj+PPmwX2MYdDIfQexWyBAwEUOQDrRDN/98p3A7dvAO6fAA5sqHJDBEAyoUVGkwEd6HR12XU4kwzfl6fCXTZzjy57vvnR513X7Hj7AyDvggAUi9EyFgiZqNxPQF6345nOWbD1HQ/Y5fpvuLa/2+82/vNHgAPDFQDnhoF5j2C2qBWCI8bw1eRw5CL5l94L3DEOTI4DB8Y9OWmsEu/zBJ3rgsaybqBob/7A4C7jtWcooRrczr+u2fH2D0AOQgAUCxKEP7aGgLy64+m6KdjWFA9Yc/03/Osa4glrjr+AupqHz1sEs0cxG0BC9HIePLoit9eNkVf9L+DuUWByDJgaq4ybGYLPAWgiXmLedUE7dwC7saL7CqfPKXi4NYdaykCD410bAHlDEsNiwZ9wAPYbkJcfz6T2gm3N8YDZ9d/wHxUA+739fPwXPrSKYGb+BuP3jAFDElFH9HIWwbzCIGkBr/or4J4RYO8oMOW6ZVcAuvi1Cgoha04BCwT5gfMKHm7NoRde2+x41w5A3hQZkADk5+cGiAeMx3+/7AENFA8Yrv/G71cAXFM4Yzj+otOAaQLQA0gZxaIIZtMDFTigKJV8H9Iq6aZ59ZXAvSPAvpEKgBTtBODcSCWCZeRYtpzrmLyeGNCAyFl1v+Hei8qeb370Rdc2O97BAMi7EgB/2QG41nhAHU9LuWAbOB7Qr//GPRUA13r7Gv9FZwIMoVcEswEwfDoimEP0shKKtIphaZQAXv1+YM+wA3DEdcvRKkGJADQQEsQuhi1Tjt95vBsh5nx2IO59SsHDrTmUOStNjndwAAqEry0IyCMICkOyiuIBNwBvPFQQT7gBuPjc9oRYAIHyOEL4vIFEYVNaOou5vCGE/tV/A0wOVcnpzI47NOri3QFIBpSeaSDUdYLOSWvYImSGgftpJDa4MWJbAGxivGUA5MAOc0Be6eVLj7/4Mk+hzCOYPYpZDBiNkLh+G/M3yFyv/ltgL3W3YQfgcFUhgRY2PwY+Z7/EhAR1SFyXCOb57r28QfQBsJQBMn5D4y0HYLPje9Cd7RIC0PM3EiMofF4gVCBp1P840ix/gyz56r+vAMjk9Gl375iB4+CzveuZdLkkEPJ8ZEfX/6R73vOjzT5Si9hucLxHAVg4PwJgRwh9CKOXK8YA4ZEqKZXSQWh5P+5AftXfA/uGKvYjCKn72cctbFrZNECka5L5CPwIPtMH3TVz17MLB5gdLgA2Nd6jACycHwLQxFEUSR5ASvARDB0h9AQb9bXIgCGk6lUfAPYTgEPAITKgg1BObk58srTJgG58WMkWMaAbQQT1nc8rHGANAJsc71EAFs4PAagQestgC1lsBJ4BMCSOK6dDUcwqqaFiQr/0QeAAAdjy+jBiQQeeMSBZT3nCPUDIa9z+/MIB1gCwyfEeBWDh/BCAeQSzgkjFfGLBBD5nxQ4DxN0wv3hVxX5TBGDwL5obxvVA5YqYL5BeMLd66YYxJpRB0gK+96LCAdYAsMnxHgVg4fwIgMrhUPKQ2C+Bz0PmBTqBMQehAbDlIjj4F80KJguSVZ0FuXpjoCOgXawLjALhbT9eOMAuAGxqvEcBWDg/l1IE05Ed0ygZnyHdz0VwCqEPIfNyx0QQvvLDFQCp+8nfZk5und8tXwIgWcHSNX0N2CJmnAl3v6RwgNnhl17T7HiPArBwfghAS7mV/hey2JS9FvM3BLpUUi1YwDRMXvkRYJoAlAh2l0dcZ04s6JUTDIjyBcrl4yDc/dLCAdYAsMnxHgVg4fxwKVwJgGEJNmWtxpQMpX9on2eRhVA+O56AjMfnP+e3Xvf3NwG4xIPTleiY55bpGh6UbafNU0l0z0p+5Jh5HqYJ6b51nP6XP8cx12XNHQVgIQB/bFPVg2OC7Q+WgVFWng/FvtWLI06uWh5oguKEcXVS/9sEAF//VGD7t4ETDgJbF4CNi8CGZWBs2fPL/H6Vwp2KEtVk4fJ+v/EIYPN9wKa5qu+IncfPwXHVZe/aOL3EbwS7xv8A1rQvnO0j8PArTgTGZ4BxFv9mIxhOCGsv+0OPYDRghcLfkWkEuq0+G00x4OtfDGz+d2DbHmDLjL8si8AYP/7CGIAiEEMTG92zXqSbH+d9R2aA0XnvO+JjthiIrOVDHHPOkBrzUQAWAPsZp3oPDpa/Xag6EVkLBK+5rAnJC3/nYk/APD704WiEAV8OTHwX2LQH2DgFbJgFNrBhjd8r79deGoEwsllgNBOzy8CdjweG9wBj08AIAci2D6HafmyAk4/Z7SJ72hGYRwFYAMDLTwOGp4FRFgD3HhzqRGQiyeurqOdG6r0Rm8IEZjzRlkiqCWoEgK8Axm4BJu4HJhyAbFhDxmbDGnZO4j0SgLGDkpibgEq66TJw/1nA0F5gdLpq+zDqFfd5LMeWqu5HNST0uJOIllg+qgMWgI+HPv0xwLA3gWHpW2sC441gCECbmKziaGrnUdMO4aHeh6MxAP4SMHI7ML4HGD8AjHvHJGNAgpDgY/ck3stipRemvVhc+uASMPUEYGh/9dIRgGx8Y+MNbR/00uVtH0wEx94j/v0oAxaA8Ed+GBieAYZZg5kADC0QWGOFzGJlcGPzl1BxNLXD8sk4xftwNAbA/wwM3wGMUmxOOQBnHXzetIYvibonmSiuYTNjriVg7glAiwBk0fNZH6+PmX9P6kfNmCXGpftJ7TgKwBIAnln14BAAYxMYm5C6RjCyCoOyr0qkD/c+HI0B8DXA8N3AyCQwesD1VQKH7EcASm1Q+y4CkN9pUKiVF5nLvy+fBbTUd8QBaH1HvNBROiZvfsNnrF4kcvPwpdsBLBeU18Nf7AB23Dp4ecHC8oBgUlJJecLS+7+WOpE3gbE+HKw+yoevCYkMGKqPJrdEKARutaFYRs1fiEZ0wP8CDN8LDO8FRqYq3W10pgKgfYLaYCzootgA6KXaTA90y374TKB1sBozy77xHFZ536utRgAmEaw6g5kUSFZwSXnA330qsOlfgHMPDlZesLA8IOjoLypPWHj/11EnCiVwkz7kAExtsGraYUWdSDX5TmsagL8KDBGA7Bd30JsW0oWivnEOQNP7yGTSBR101AlZSUtGyfgZDkCWY1HnJdcBVe6325hTvelg2CQjZNDygG/2An0j1wKnL6y9vGBheUC8prQ8YeH9X39OVQSc7Mc6fCaKvAeHdCIVf4yMYCynTpX+nb97NJmlSQb8r8DQHm9YOFUZTKOzoXGhs6AxF0HIexcLBvWBuiHN8s2ne98R3qc6L4Vyb2oBVjfm9MIFHbjDCh6kPOBbQoG+oW8CO5bWVl6wsDwgfr20PGHh/X/1iaEIuDcCTIW/1Q4rFv8OnYiW3c+W2iKwUjKbyjQNwL1uuR6sAEgDgq1brXOmV81PxhNB6DUDBSYzQJwFtz623XcktX1Q1VWKaTF/zZhVazBVYA1tX5MazsGvobwe/jQr0Ne6BTh5uf/ygoXlAfG60vKEhff/rSe1i4DnTWDUACY1guFTDqLYdCBvf6DJYSMYATBfOx1kLfj1v1axH10nQ3Sd0GUkBnTfpemtBJgseIKQAHLQcVxa2TnuMW0Aqui5es8xBIegVdVVE8VhzHnLh65WMB9An+X18K6aAn2tO4ETl6vqbKuVFywsDwhevqg8YeH93/Rk70JE90nowxZbIJjvS3WYNSGUwGHJTpPxwwcbBuBrgRYBeKACn7VtpdUu/c0NJxO9BIxcKu4TTODzbkonPLoaL0vyUQRb2y8HsL1ckfWzMeuFi40Qezqi+yiPhyt7FOjr6/gCFwgP7Xb5vssTFt7/nQRg6MGRWmDRoeyTlpgw68GRTwgZgo1gGmXAX6/8dtaylSKY/koyID9BhzML3q1gAos2AcOrZYSoq/pJp1VtODRm9Z3LS/7WjVkvXOzEtOpKyGrlAT+4SoG+VY8vBGCvy/dVnrDw/vee65NBJiAjBIVcAJQjOm+DkCZEeiGAMw6sAwDZsJrAdhFM9rPGhd4904Co5oVuCZPV6kD40Ec6+9W8dBTBsfdc3nkpvnB82fp2RPcs79dHgb51LA9ofsDV6vut5/3PnxcAmLVBiDqgevDaJLkYrpuQxzcNwN8AWgIgRbB8loEBzXDwl4cGiDGft58SCOWGedgjvOJ+bPvgRkiuA+ZjzhnQQOiFNVbloa7l/fos0LdO5QENgEXlCfs8Qbf7HyMA3QVjYihYhLENgjX9y/qwxQmRU/asfd0ZcLU2CHVGyusJQLKfVi98CS12T5f7iECkHpsMkAhCF8+nshWH2I/jXsOYO144GV/9ApAIrS3vt4YCfetQHtAA2G+/4PW4/2PPbzMgmUMi2NoeSCRxIt2/FvuxWURIWCXg357gfTjEDNIHnTRXRCpH5ugKwGl3HpMBXQc0v6WLYVm/5limj04rG762K2uYY9jBkr9+rI03NL5ZbczS/dJ+LQyoga4o77fGAn0NlwdMAOy3vl/T938KAcj121z8Bn+Y9eWQJRz8Y6kNagDh2ey5EvxjxQD8TWdAuneCCO4An1vw5vdzQMmdktwq7pLZQR+dM34+ZumAxvY1Y04uqOAJ6FsExzeto7zfAAX6GiwPaLWR1lrfr8n7f/Rl3QGzmsis+/uO71V9OFgP2gpPhgr7TGRqRUT6dyvr4aIs/pm/2zVUNbBSv6G8e5pEv0Cvec7Po7+bTtjlBRlkvAMBkDeQyvsNWKCvofKACYBrre/X1P0/oWEAnnFD1YdjhtXxR73mX10FfCHHE9pVWcGAI/S0gKsfA2y+twrFZw6Hxf/F0Pk8Ri/kpGSnMuDx5T0iACgQHioo0NdAecBUHW6QdsV2/cL7v/Cyqr5gnc42CCOcfX1VIZ/V8We9IDmTzVXwPDJiXuKXPxtDBma8+lzP4WAgKkPxCUAPE4v5GzEuMX0PYJPLhB6FJsc7MAMmkVxaYC/K9gG+F1++8AQ7Gwbgk78I7GFpXgIwFiRXOwaJZPUbiR0yCUDRk+cHf+YpwMj9HgfI8ClGPyvsSiH0WSKRuYlitLb/zHM/JOSs5C/YIC9cMQDZr/dwxgOW9gtGYUBi0wA8l304vDQvAchilFbpIBQhZ7Ejq6ZQ0/Yhil8y4j89Axie9DAsD6FX9HOK3QtROTFkviN83kG4felIY8DCeLrSeMDSfsEovAECUFsTjHD+tcB+tkFgcXKvBRir7qtFl9owmO4Xy/1G3bAFfPrZHorFNWBFwHjQAFctIghj2kBarw06If/+MM9ZqTN6DgsDojCerjQesLRfMApvoGkAWh8Ob/tgAPSKWCp8ngNQtadjmTdltvNvn3peFYhgQQgh+iUmEaUAUoXM1yRLmWuFLaE9Z+XIAWBhPF1pPGBpv2AU3kDTALzwmqo6qtVh9kJErAudABia38TC5wJgS2xIhAwBn3yhByL4EhzXfRXxYsDTJ4IvrNN2JFMxZcBzVo4cABbG05XGA5b2C0bhDTQNQLZBYH1AVsQSAAU+imI1obHyblnjG/kJk3U8BHz8xVUQAhnQIl5CyNgKAGp5LKSSCoAySh5Jj79vTagcxUaIBeRNe79g9gq+DXig4wGzy+PONfT7RWFA4noAkGXZVAhcBckJQgNgrLiaNb3paIDo1vHHX+oA9LQBi4DxJcOUPJUnTgU2NJUyROs8irGARxQAC+PpCtsFd40H/AEf0gMQkLgeACT41PiGoLOKqyrJq3K/Ya9mNyr5FusN/uPLPIeDa8Bc+w3rtyl4VFHaMZc3i9RWBM9jjzgAFsbTFbYLRmm/YBTeQNMAtD4cBKDXBTQGdAB2MGBo8SCLmEuS1AFVAJ3A/NhPt0PoCcA8bSDG76XI7aySg6JYuGfKwJHFgH0E5B3ueMCe/Y4L+xVHAOZ+9EHcEgQgwbeiEYx6jwTdz4qfu7EhEJqxGqruf/RnHIAEnxgwBM0aC8aUAYWNBRCmoIll4HTqO122QcZbrgMWxtMVtgvuOx6wa7/jwhtoGoDWh4MBJ16WN4lfr8AqI0TVV1O1fa9BbQzovkAy4Ed+NgCQUSxZCFWvCOaOFREXyUwZOPIA2GdA3uGOB6wPaOz+QPv5S+MA3OXiN9aclghW+d3IgupBF2pPqxcxGenDPxfSRh2ASiKKiVP2PaZScvAKoA0VDc6cOlIB2GdA3uGOB1zR77iwX/F6AFB9ONSOQW0frA50sILVcckWJyIDSgwPAVcJgFbYuZ3FJvAlEHbJ3IsgJLGedeBIA+AAAXmHOx6wo99xYb/i9QKg2iAIfDJEJHqj4SExbEty0gkdhB/6P9oZbBZIGiKYVb9GKaN50lRHBLOvhDxh/5EKwDUG5B3ueMB2QGM/grb7/6wHAPNGMAY+GSGUjC52VX2f2CD4+HO0gqkZfegXKgBaHkcWtS0AWii9xG1ImrLlN5XR8L8fmQD05BVrmEENmpYSP9QX+KHiqj2/82+HqqDWwnbBRfGATdzAegGwru2DpRq7Mzq2fpAf0Nq0Rl2wBXzglZ4yUAPAmDSVWDBPHQjLcgTqOZ6zUvdKHh4ruDCerox/Dnu7YqwXAC1NI/QcEQuK6WK/kdgCTGC0PYAP/KIDMBgglq+hIkrOfsaCviLSofcJgJ5AdM7kkSaCj/HqQKVIGvD4swF8bcBjmzjsaQ2H5D/6acBd9wALB4DFWWB5AVherMp4GKIYEOp7+26UF0aSfT/xYuDG7wDjrIpAERytXf2vajj7ueryQXSFl10K/ON3gIWDwCLvjfGB8Z54O+Ee4ve6513uB2R1yzsqC+twbC8HcNVhfAeaBuDP/TvwtS3A/ePAIfYFVlPq2HHTuyulZCTlhbjhETF5yxTQGgPGhoHhIWC4VSXGD3n0tLkMHXHxu+YyB+MlPwDuZs5K6FlsbCzdVO9DuKfkHM8AEkP7B8fOkwDcD+B7np42+JkGOvKdAL4E4K8P0zvQdET0b14D3DgB3D0B7B8HZka9WzrD88N6sFm+YcUjrn7E1ZDvMtF9DBgeAYaHgSGB0PNHCD4BLwLRsByAyX/ij0/dDUxuqlIG5hix7eFhvLcOVUAtyPSydAFmOQNe6EYGV/9ZESiKgIEgtbaD/gHALQC4ovY5r5KwtjOU/XfTAHzzLuCmIeDuMWDvKHBwpMoN0WQzNtAaYSs0K4ZlOSAjGG9kPjCBRwZ0ABKEBJexYAZEAU3A7Oi1BeDym4EDnjQ1TwCGWMW8MXcKks0YOyZNlQOQjcgYIUHllEzYQ0ktm+r6oz8G4F4AXwXwRd8/kO9A0wB8y65KmPxgGJgcqYJTKYpTv2CCzyddQJRDOjKivn+Deh8BF8BnwBtaCUA+YYEyAU8h+c6Az9gNHHRmrgOgmDA3jHQ+iWupCeUAvNSrA9HNwqx+muk9nJVNg/CTfrmbAPwbgK8D+PcHkIibjob5o13A3XypWsAkG1cPA9PDFQDZM1id0i1KxsWfOrKnAFXlifCFFMMRcASigOcs2MGAIfE9iWXplS6On7UbmPaUUTXQrgsVMzcRj5Folg2V5ayUA5BWYKwOxKUafnosWjcJwk+7W5F2EKvlE3xcXaNYfiCYsGkA/smuqug6hcleAnAImPbO6YwRpMgjCAVAm/yQmKTv5hNsAf/i7SyNBSl2a8Qv/4/M1yF+BZSYlNQCnnVrpbC+mToAACAASURBVJcaI7sOSEY2NpaDXLqpR+vE/OVksDgImgGgghHoYJbTWc7oJtFWc65/cg2AYvh2ALsB3AzgVv95nS/f4QdsIkT9T3cBrGtITWZfC5hqtQHInsEGQn3UDDvEDEY/ICf7SxMOrAg8T+c00JGkvHGd2DABUYZIAONzCUDppCFhSukCBsLQrFtZe/IixYQpSyEoJoqnuPWrVRAubQh83HNlZB23z7j1ywmj6CIIqUPxw2Xeu9bx2jx10wz4Z7sqTYZaDD8EIDuoE3hMVEphWg66JIp90k0sBxBcy+iPIIaT1RtEsHS/yIAqw+VSNPWQfe5tlVEk8auXgVa5BUsEJuT5uoliAbE5AGotmIAjCPnR9xDG3TQernYAUupTdBGEFMf83OkApHG+XlvTAPwfuyrgSZOhas3u6cwTsUBVn2gTwyFMi8wjHZAA1M9fYGHDULJD1m8Cpa8fRxDad+l+Ykf/3XNvd11U+qiL39SxXevSsshdDFvgbI1O2AwAtRZMZzTBRuDFjxe1Xg8QEIB8yyj5yYIUxfQIkfkIRnmHCM712JoG4FsdgHHp3ACoMH2G6jM4lWzoQarSvwQ6MSB/vporVaFkh+mCLlpVR8Z+dqDZLoDOpHSiQeAFDkBjPrlgCHgCUaFifg67H/9uYjn4Ai1vpTERTAASBaoQJBAKeNqHlL6mwPDZYAOROag/EYRkPX34MwHIvzW9rQcA+TLpI22G7EcQKlJGsYIJhC6ClUMiXfBTbFUQAej6nPS/OuAl9pOOqIc2BLzg++3VmWgIEUz82cRuCAtLIHQQm0gO52uOAb22sC3JEWgRfPpZf2sQBQIgLydPEIFGwPEj8MlF2bSbsulghLftqsCXq9HGgHysznrGgi5qzTUTFH8FLhAUn3hIJwCN0HLncw37qaF2zoYvuKNivmQIuUNc7GvWt6sHNs26twA6vhyq8NEMAHlyntFrDCcQehyaPTl+FwAbXDcmAKMRThakEk8Q8kPg8SPL0qzLBl+A9QCgR6uZGs3vfHz8TtBZvkgGQrEPBVAUg2Sij50QAOjiVKI3saADJRm7dSLYWfSFDkCem/dhZeMy9pPY5QvSDYQyUJoDIK8qMezh3wY6fSL49PcGgCAA8pScJLIgAUYQEmz8RPA17StvGoBv39W24eREiBoNQSgWNI1HBkdgxJSw1AI+dFIbgOYmkjimQ1r6XXC3rAbCHycAgytohf8vsB/r2KRaRq7zpZ+D37HMX0s3DDcCUGLYaw53MJ4YUODzusqlGCQAOQCejuxA8UULUkxIwAmMAp8Wa3qkN/R9W+sBwOhIEPjk5SLr8HeKFbTQfb77csPIMHGl/4MPbReslPhNe4+MiTpi9AFGV4nI7MfvagNQLh/pfrYnDAS8aJQ42A2w4em2cAyWQUuJVQTGWLs1uL7DG9J1RjhA+jvYk4t3KXeMqijpzrud4At9z3XtP16yGfjKZmCGooYh1tZzvv8xXPFl4PoJYC97k9FlwZWD+Azi/deMZWeP13eQCGEyoERudChIjbb3mJYwH7V0QIKuCwj/gfMj0asn2I0FXRSHXfL/iRkNgLyeVj8ccMY//J1fyxzTAXT2+xoQViKYD/1hDqLxPiYxTgSvQrphphG97tz4Slqafnj7uk1kIQDZrvWTw8B3jwEW+RLxPgSiCERdPwPR7+wCPg/gulFgfruDkOMQkFc5x84e708JAMmCuRNBXi4TIg5CGRzGiBGE/D4E/C2r2vcAYJoify62i0aJSMhB+2IHoNwu0fkcjQ85pu3ack5nIBREqneYFyWLkAXIJHESe00Cyx5QyeL6F/tyEcDcrOW2n7fX8df0mME+/vQ/PQjhoy3gzo3AISYf80MQaQx1peH9wb7v2mrtmCBkIMMejp3jIJD1MsaxaMZ8v5N/67INAsB3BAYU4JL4DSo1J15AFPAEwuQHZJzkKfUAtOHLJSOQRWndBYQvCQA01cfnNopfsaCJaD2baBn79QjSTiOEP1EcawIpkq2kegBTNgHWEpOKF8Uwq2NRFPM4AqCf46/rA2U9/uVDvurB01zvAJpiiwOl3fEeciCGF+Ij11f+QkbSfMPfIzqw57mEFZ9Dl3Ps5HXWAYByHJAJKV7N+s0cCQQhwSlfm4lGZ0KB8C/rABgZUS6ZHITBSEhCowUYAAksF7cStWREyxRwtuPpOlgw+5s9sq6OaIJIIlUgEhA1edoTgHxa9HVw5jibZNF+j/9yGQA/7pbujZ4bwv2+cWB6tFo0NzYnkxFA+cvEAo43VBoEo2e+48EMXEOmD9F6xhCE8RwZEJ80VblKvDlmzwicfqy93/o+8K8TwB2jVSgW138FrJQTXBNlnJgmrjZwanow9CBP/rL9wF0jwAGWDtFyoN9PHutnIHT05mPXz93dMGQAPniJsjiBXiTbxDZFMF9NLUPQxKR5qezz1Y6/YZDH0D6GkdAkYJIvRalAdHAMmPZoYhb6NhDWvEyf/ma737CXN7R1ZC7hUbPgcFgqt/ZZjADnM1xqEVhYBpb4CUk5UsL7jQvj///5buDrLeCOEeD+YQchYwG9VIfyg1NaZszFiCH6DkRGLze5/dgk8IMWcMCjdCiCzR8od1B8OTwvJM8JEShFut1fzMhi+eRJr6LI7hYP2M/xVLwKNoZjUTwRMAQQmYyhWGQxsSADOflZ4kukj7PhZ75bETjBpkAGahMkcrGgwhsXeCyBHBj1wmOBQwvAwqKzoFeRV8ZaerjKYAuirmPY/o9X7q5Cyr7fAvYMAftCPGAEoYlBiVtFwLjtp2U4irj7yOANbi+crHyrfCbTquJV44O0F1FrwQGIMZFqdQDyP/gGSZ8TC0ZRRsOlVzzgasd/u+zpMByLehAfCgMQCDyGZJHFCCgLZ2f8mgI5qauEcVx9e5vACTgCTwEMWr5TdIpWKJb5MvrnoocDswvAPAG4VLGg6UKeqmi4iuDz4er30oX0FP7u5moMvIf7W8B+jwlUNAzFnlZCIhvGFRCeWzrgXSSIBreXTFZSgVLHAp4UHOFuociEEsn2PJwl/XEk0dzfSojeerFg1IOo5BKAveIBex1P67lgUzgWQaJwLAKRH04i14ItgDKEtGsRnWx49b2Vkk9wUefTGrKCF7R0JxZMqxN8cmPAxWcAcxGABKEAKPA5u9lEaAbCmKMI+sDN1X3z+ro24wEZFc0VEE64ABgT180PF9ZdBcDb6JpqcPtPk+1ACbmKjJnllwyuILunEAWjZHkBsrsRUnfD0qEiC5IJfyisgMhzWhcP2O14Ro4WbASgAMQJ48SJwchmBCDFa8qpyBbSP7OvU4PQ0p2W7+LSnSJUFOrI4V7w5IoBTQQTfJ6oTSYk2mQcpGRyH2syGjIF6EM3V/fM++C1CfwUExhCsmzCaQT43lZC3e1hBpEHh36XEqrB7Scmq5dV0XZxmV8WuDFzAF9iwhow9seAGoBcGtKjqAc+1l9rLb/1igesO55ysmCrC8ei6IxRMAKTWNBi6Xw98xNTFUi0jEcmpYgRAPhddpVi9OIEPP5cYD4CcLkCooHPwaW9kV+iwWrQHT8uA1fd3F7DFvgUHUP2k8jTiogAqLoxFpDgbMj9jXSuN7i9dLIdaxzBp5XVBMIMgFEnFAPKT9qPd6A9BIGI7MfPmf4U+40HzI8nWgq2PBxL4FEkjKJixGRRFyQQPzzd1iAUzCAQas1YOmAEoFjwkecDC/PAwhKw6CxIkCXwOdVJLxTobMjBdyIgfvimNvNJ7Evf4jWtdnRYD1YNGVuG93VWuWs4Jf+mlZCCZxwP/cnJ6mXVKk2+tK8lQQVHRTGc64SDAZB3Ey3JcxyACkToJx4wHl+YwqloGDICmYmTFgMQFBET8yyYzyAG/AfWX8mCGQg0BTRoHwt9KVaPE/HQ890AIfgWK+CRAaMRYnVdxHbhdY8Wslw1V93UDsmPIj9GxgiAioRRMIJNvoti+SW/Ikd0gwAU8+XxJcbGITJPDvI6XdCFREFSknTB83xka40H1PGF9dnycCxFwygkK0bASJQSVAbAYeD98xUAe5U3jKIwBosSgNsuABYogl3/IwgFPrOIg1Xc4ZrpAsSrvruykl2ucykapkMMh4CExD5DwJfWAYAxwk4MKPAJgOIjGSEGwuCakRhemw6Yv0UUwRf7L00L9pnsNx6Qx4feY4O8pDEcixOjsoTKKpMYjSFYYjOC8Eq3Wnnr0YYS+0Tmi2HysrPGLqwASNYzBnT2Mz2QD91laxLB0gs12GAh81cf/o/OcHyJ+qj0S/zxnhUZbSyYWaL8+Rq2S29wowiWkJPan4MvgrDDGAlRe7KIywDIgR3meEDWg9HbJgApNTkXo8o0i7oVgxnEgFr8F7jEdnU5GvqfJQKQKyEOPlsNIQvyvupAGHS/Okv4qv9oh+PHxMLk8ggBCRxvAmEN+AiEzz2iQfQBeNmkh4K52hJBKOaNe/FSLobLRXCz43rQnu2yi9oMSMDxs2jo8303ERz1wsCGZECF4kd3DwEYYwJjhoNlQrgIjlYodbBPrwMAZfEmyzcIv27gs6XDzC/IR1DOgA9a6DRz4wZAsZ+LYXvQYsHoD4ziOFklna6YD3+nnU6dZ7bGDAcBUImIAmEUw/zbJ1i/scGNDJiLXmle3RhQ+l/aq57gUQCWzwwBKPeLsZ/LFrGg/ShRXAe64Ajkv30kALAjF8R11Dy3K7KRwJcsUTaqWScARou3w/INVnCH+A36n8RvM3nB5XP4oD6DATBYwGb5ajlOLOh6X8JaBKRG77+7ygGYp1bn+V25/01AzBnwQ1ypanD7KWfA1QDYC3zJIj7KgOUzc9nFbetX/r+O5biwNhyX5uSEDr5o0xsJwLp8/m4A7GaJUv/j3/5+HQFYJ3oFPPkho/hNeqBcMkcB2BAA6XrxmMBkfFAci/m0JpwzXw0TXvXtzrz+PKc/Ml/ugzM9MDqCAbz/keVjjGcQA/YLvjoguo1mRslRI6RwfsiA5nqhL5D6nscF8gfTdfxpS+/hLzvWfzMQCoB1Fq/8b3VWaPIDZqsRV64DALsZHVHs1gEvsqFAeBSApQC8pHK90Oql4UEAyvCwNeGcBXNLOPMLftgZsI75ouUr9ousp2TEyIJ/sU4AzC1e+WIFshyAHPZREVwItrrD3wGAhibTYBhxVpe/xePyrNBuWaoNp3DgFwC81O+RAepK/a5Lfe51jxr7JwA83nPXYgq1asl0yX5N48+f4VEGLATlK1vAo5YB1gBSRmsM+NFE57lcfPD5pPFWCJImtyvGgGfOAacBYO59zFglgHgPefZsXV6/gPXBYeC0RVgyJNOGYuJjPka9eHWgjL9bWzhWk0/n/wPn+k8bgFNmgYcsVflZnBRmIShtJM/m7JGibGBoOIIez9wKPP4AcNpylfbNlGfdI+9NjBjz8JVzppckZuJ+dBw4aQ44drk6j1LIY9JkPD7P4s2lwVEGLHwJnncscNIh4Nh5YMsSsHm5ndOu1BGFThJ8/K6JrZtoslST2+XHA6ftB05ZAE5crgAups5TfaL6EF+UyIif3gAcOwtsXep82eIYY9JkXpMgMp/AeZQBC2b8OduBYw8C2+aALQvARgJwGZhY7swEzbNa88IRvAVO1qkF91J36DNOBE7eD2yfB45fqphLnevzdGeBKBfL8UX5/CZgyyyweRHYsFwxYHzRNK6oetSBMDLjUQAWTPqPngpsnQK2zgKbCMAlYMMSME4ALrcnR6JYQIwsoUnjpDRstOLy7cBJB4CHUGwuAtuW2nUDVH1EFUhycSwWjGD64mZg0xywcaECoI0z5P3X5P6nWlHdgHgUgAUAfOYOYMtBYNMssHEe2LgITBCADkIzSJZXpCOnIg25uPrhgnupO/TyhwLHHwSOmwW2LVSik2pCrDsQskzNIBGIpBdGI+VfNgMb5oENCxX4yPRjPj4xaJ0+WGeEHRXBDUz2Mx4FbDoIbJypADixUAFwzAFI8KUJChMV2SUaAGc1cE/xFJef3FYRti64nkqWDrqqEhbrsm5zvZCdPCd8nHzJOLZuABRz9hTHZwPL7LnLnoNMIY2VyaKcjtZLHOAbNgNPngKe4BacfGF1pnydD+hphQ/8XV5UiEueLGnDN1tWXj/3/4cTwAUzwGPcRcFJiDpPt3FLmf5vjwE2HAQ2zPrEzDv7OQg5OSM+ScYQy5Xbo8465u/ZfLTJ7fKHAdumKxVh8wKwealSE6inEoSy2MWCdbUHIghv3AqMzwHji9VLZuDzD8cXxxWZs5c7apmW0fMBnIHKn5X7d6I5npvRz94O7LgXuGIReJSb+Xl1tzqflybwRwqf9i97BQRWomWJQ7oZVFtJoqDX/b/oGODsvcBTATB9gsfGqmzdjtVz+G+PAyamgYmZCoDjFE2anCVg1CeJwOMnTRB/DmUINVkkgia3y08BtkwDW+YqAFJFMD1VAAw6XG61R31O9/fdrcDYPDDmY0zjc1UjivBuAMx1QdMB+WAYXU8dhEU16dOSkppbcHFSrng8MHwnsGMPcN5ypURHp2xMIa7zDz2z8Gn/kVe0YomO0wEwBYKujL7v/zHA6C3AxfOVh58g5AsZxx4fZM7sf3h6BcDxWWeGBZ+cMEFiwGEHHRnDzun7ONHs/djkRgBunql0VDOSHIDU3cxSD4aEajhFXS4H4S1bgVGN0V8we7E0Fh9jVDG6Obr1LJMRwn+kOCaTEYT0dsfqZHXl/p7PrLi9wIY7gO0H2yAgCAWCWCowKrYE8nMLn/a7PQn9X7zIJPPkCcK+758y7x7guNsB6l98gZjLLYet3Ay5n0sv4R+fCYxPA2MOwLEAQLIDPyP8uBg2cRYmzFweAYilKkn+OC8/Fdh0CNhEA4nGA40kd6FES13WLO8v1qHKAfh9B+DoYjU2Ak/js/8NAIwg7OUb7LCC+WAfB4CpBJoIiTRNRmS1l13kqWh3Adv2A8cdqqp1MB+aIOSxWv6pq5D2kkIAvt8rF7BLJksN/jMqfa7v+7/Ak4B3A6ceqpasKMq5akAmlLWY37t8ZW97PDB2qALg2BxgAFwANEGcnI5JcrDZRPlkaXL4u1KJUAfAjbTQ59x6dSvdLPXAgGYshZWR6JIRaXB/NwFI8C1WwLMXzMeSwLfcXuKrA2G+wrLCDcN/IIg4ERRn0qvyySAQX6mG1XuA4fuAbTOVwktRRr2MLCoQyvEZ/UY/WwjAj3jtFJZkU79g1ghkgEBf98+0Umb/3A2M3lkBl/fOcdMok2EjkZyv8773LAfgHDDKjwNwxEUw9yailpwdxBAEYhBbAuGzG3aKkQEJwAkCkOCjlb7Y6SYyf2UwlAS+vKYnAXjfNmDEX7DEfA5CjUcsnzvbu1nDtUMmCDkRZEEyGdlAk6G6lQTSa6m0MP6HuY73AxNTlcJLZ6WOJYC5/CNxLpHMgdKIKNl69Qvu6/75AjHOiTU87gKOOViJb748BKCWrnK/maTA+58AjM0Ao7PA6Lx/xBAupoYDC9okBRAmPdBZ47lNA/DhwMRsxX7mPgl+SrmK5EaRNRslXFQ9CKB9DkADn79cZtkHFkysJ103eBbqlh97DpmTQTYgk9VNxu+xYbXKU3lhFoJPOgdFGY+lPkgQxokkgF9Xgj4AvfoFs84eX4Ke9x9fIC+tRfDxvvniif358sSir2LCj5wNjBKAc8CIi2AxxLCzIAGY9L7AhGIKgpATw4l8wToB0JjPrfTkp+SLQbHrOqm5jNyajS6VCMIpApDAWwQ4LrGgXqzIfnq5cv0vN0ZXHTInME5GBNLb1DGdOYQsI7AfGKFjlgqve8wJwG4T+fuFAFytXzCLb+VgWnH/fIGYfc46Hs7iHC8ZkPcdXx4VfVXJw8+cA4wIgM6AHSLKWZCTESfLfg7WsIyRF3ckiRQ+HACXkwHptyP4KHrpJvKVGnOhRF9eBF9wE0mUEogz2wC+WGI/vVxiQQIxAs9+rmHA6E1YFYB8DJwQMZl0OrLZ++i7sfT8zroYHLS9df4RACWKxSZvLXzG/fQLZqk2gqn2/vUCUQ9UZaM9wDaPeSPrC4A5C1KV+NITKwCS/SiCR/jRBDlLmP7nHynsxno1IPwJSyRpbiMADXzuPDYfZfBTEoAmcuVQdiaW0zwXwQsCYDYmMaDA1wG8TBSvaoR0G77EcGSET6hjOvVApfRPAUN0zjr45JzVcSqiTxD+VeGzXku/4Nr7JwDJOkxFIwt6j6+RqUrlkO4bXzp1gCAAv04AzgLDDsBhKugLFUvQUhTwCEKbnKCw14HwJ9cDgGQ9WegRgDI8XEcVEDvAl7lVlglAgi+I4CR+Zf1mLGgMmDFhBGFfDCicRJFERviSABjLS7FC0MFKMU+07wOPE0kGvaoQgGvtF9z1/iODkwn3VWoEXxres5ib9xx1wZufBAwLgAQexbAD0JiQwJOuJBA68/H3Zhk6+3CifqqwWNMKN8wjKgbk6gWJgC+FMaBb5vJVmsUbV2vCqo3cRWZcCIACoax53+ulkqNd7iqOcU1WcC9cxEm5kQBUdZ+sTnSL/jEtTWngi21jhJNJBivZBukXvOL+yYBkcOqxKjJ4AGgxzMrBVwdAMmHrZOAYF2l6y/mwV6xD17zmWo6MbRyeWtOHwxJ91IIhr6rqZS70DPPLXDVUrfBwzHKr1EUp6/h0T/6L/GcCqslt4IhoTcwdAqDSs7I60WQH6R329pHuFyuXDJmEjuOSbdB+wSvuP5bGUjmsA5XoUvcvBXKKAQnApUdXwah0b8jXR2YzJTsC0ZHB33FL+2yiX3h/1YeD1fFZGT81g/H6yqkVa9YEpqMhTADle8erHA6t7Mh6j4ZBXdBGjFyO4CSIm9wGBiBvgqxwIAJQlXIyEJLyI/i0SkAG/FbhaEr6BXfcv+5dLKhCg4z1C1HEBJ8+BODQGZXfk/quAZC6ketAZEQCTWAU8PIJt0fgwHzZvVWNaKqi7JLOmtDWFy42g1FxH/XfqGkII0C+a0tnDkfsGxQjn3VPsk7tXmuy+Xp0JhtoJosAaFcUAJUYKiYJxcqHqKAH9rPlG2cMrmCUbMX9guMLpGTcCMKDlZGhMK8IPnPIn1X5PA2AwegwEEYmDGBMjOI5whGQP3NPBT7VJlRNaKvF4t2IWHbDErtDlSk1p4lJ7/zd246tglGZryIfrFhQ7pU8WCAX0ZENG+57U14Z4YrCeLrSxXdev6TfLwrbxT7znMrfKQXfHLQCnyvmRIv0Q3430ezMmL98P393G3wqz6am1NYzzoGn+svqRmTAU2citctqAX/2EI8F9ACEmLHXLZGoFxtSl2xyK2bAYwrj6Xr12+1noL/jUTCD9vvFrn6u0v1/nvGkaoVBAQi0eummMAuXQHMWJAA7gCixG8U0gFfcXdlBKk4Z6zELgAJfZEKrxpC1xOIl/+Sk7jkcdYlSco90y9+gK6vJrRiADD0piad7RuFo3udNCgft94vCdrGXn+tujgV3QAcHLcFnroelivHkchEL8ue0uQ74S3eubAITS3IQhKkMRjBMokgWG3L//2z3VSnP4VDgQWxUEEUxAZFHL0eR3HDfm3IRbDHkBfF0zy4EIKNhSvr9goGEBdvTz/MIYQLQdVsTwRTFDj5jQmdArRDYJQNDSs961R3tPhx5NXoVgoxleHnarjohgLec3D2HI492yQNvIwvqO9fJm9zKGbAwnu6FhaP5pFuMg/b7tTbpBdvTz68cz/zI8azVj8iAHTqgmFHXDUB89R2dtaC7tUGw4kDOgFb0R2wYRDGZ8g9O8aU4XwPOczhiwGlMjqqLWiFYGu570wADFsbTvaxg8nkow7E8nM/atfKzln6/1mS4YHv6BQ4+Z0BbqHcd0NwwYbVD3+1yWhXJxPBrbq8AqE/XApSqAxiBV2MZ/54DMOZwKE00rnDUWcR5KiV/brjtSAMALIyn+/mCyeehjIYp6fdrvVELth8RAClyHXxmhPi6r1m8FM0ucgk8+y4RHC1kAK/5XgW+2hZYofafWcPq1B5AqDqEYsQ3nepR2gqhV2yiol1COkD0C+aOaoGx4aL7DQCwMJ7uVwomn4fm7VrX2u/XAlELth+5sHPtN+l/Ap6sX2dCsZ/phZkIJgv9l++1wbcq+2WFv2NXIjNKAPzuw7MUAV8DTuynFIEsQy83RgTAhiv+NgBABaQOGE/3mwWTLwAqHnaQfr9GnwUbARgDNBUlkpzQboyYCyYDYdILdf0l4NduW9kGoa4geNdazLElKoA3Prx7DofiETtC6XvE7hGEzJlpcis3Qgrj6d5UOJoYDcMglrX2+y0NPtl5UZUjkfx/Hqbecoe0OZzdF1gHQrln9Bhee4s3f3Zxm4MvAk9VSFdUIw0i+Q2PaBtISiBSSFgCYMjMW00MP7pwvvLDmwFgQTzdHxcOSGvBg/b7ZRZByWYAlOERluKM3Ra9CKWc0q73dTBhMFT4ZwIw9l5Lrpes+HjeBiGCUOKXeuBvPcKTiEIOR0f+RhDBMYi0Lhea4GTaa5NbOQAVDzhgPB1La5RssV3rIP1+7yy5OAADoAchEHBkFbKfGRpiweAPtMs5IFNokyOGk/7rAYC9OhBFwNXVY1at5tftCBHaWVS2AJdEcEinrDNC+Lumiyc1B8AB4+muLARAXTDCWvr93lR4/Z0Xt6ODFQkj8WtumEwHTKDLQejAfN3uds/dfjoQdatGLxb8jQBAYz6/boxiFgAVudzNIc2/s3xLk1szAORoB4yn+2DhaATAGJCtbpkCYq9+v4V+aBgAQ4i66XtaC85YkDog/zdZvzUgfN1N7a633Xqv6fe9msDIHfNaB6Ay2JRE1AHAEDIfI5nzZCLeN4Nbm9yaA+CA8XSsul6yqV0rJ2WQfr+splCyCYBR/HJyKX4phs0PKBZ0lqOYTpvniAiUAmAd+HKjo1cvDjHgr+3wPJQsVCymUZrPMuRsRBDG4AQCsunyJtFGHwAAIABJREFUcc0BUJlxQoH62q8ST8cggpKNAFRGwCD9fkuvbwAkyGgJE3C+Nz1P1q9/T3F1EZBxvZh50s6AEYC5yyUHXt5/Q8zI5/KrAmAIkkipkyGPYwXz1aRT8v5ZO6jJrRyAvKOvNXlLazsXs9bo/ztc29Pohgotp5J49Rcj/pzfIwGS//3OM4CNd1dpntQpFUmjEH4LYIgnyn/OLjL8FeDGhwJbNgFjI8DIEDA8BAy1PFK7FSKf43cNKrvHx+8C/vmxwMgmYHgEaA35J0StpvvzL/nP8RbLAfhyT207TChgDRiu/ZL9DsfWNABvYzbhCDBKoBAk/pEobGWTqp819hzQ1/0k0PoaMDEJbJjxVZFgDad0SaUO5LksWVj+XScDmw5UEUDJ6U4d0nVbC91S3ovfVHp5al64cgC+k7mZAP768KCA0WD3A/ieLz090CDceVmlAuhBljLgrfcAw6PAyDAwPFwBkCAbItM4a/FiNtERjBl76W9ffD2AbwJDdwFj+6syImRXrd5Y2FjIYcnzWPLEqnsfC0zsr6qBMQmfIDR/pyJ6xMhKyMrSDiKD2xja6TADTt0/AGAs1KcAUCFrOLF6tbtiRVFavT/wuMCa7MfVTlH098YBeBcwNAIMEYAUlS4uBULOmK3LCnwOPANlEIOSoF9+C4DvVoWXhvdWZVOYqWgi3vOXDUQhgieB0EElViMYJ08HxqeqnG8D4IIDkAzo51DKQQJvBKUmKACzbM4+5hUivwrgiwC4LzvjmgCh6nBcgiMTcv9Abo0D8E6g5eCjfpUA6AxoQIzgi8ALmWwC4z//DxcPPwBak8DQFDB8yJPpPZHeGCyC0KN5DFCByfh9/+OAsekKgEzCTwD047X0SCPM1IYQjCv2E/MJoGVwUUQoPboq0MdqkWVn7RtDDMahB4g+P6qhXFpjVtkDtRGA2nKjos7IyOyHFUbIrXe0FXsTuzIYfNb4O2M3ATGIYQOmPn6hG6gi3eUkQQAeAIYOAUOzALMVh2pAlESqGFBAXAYOMQVjxll03iO/yYKRAT0FQXkwZkjp1pz51LO2XAT3KtD3AIAwj4Wg05kfiuUHYlsXAJLVnP0INLM0OYFx78AzcRySeTsw2AJueI+Dj2Fne4EWKz5MA0MzDkCCkAByUWqsJzarEanzj2zXwjEGFHuGY+pYsMojzZL1G9EBexXou339IRBrC3lJGmNDuSHX+w7WC4Cm6wWxm8DngLTImgC8pBcGBuTXf/1fXnyTugnFwxTQOgi0CECyIFlsvvJfEnh0mhsYI/s5uxFYi1xZof7oOqSAawwYjRGBzYGXbtWXaCIrlvHUagX6SP/ruMVYCEbEqECXAMjfree2HgA0ESur1/0vtnNwGSsG0RsZME20/+/XWH6Mugk/yngPAGy5GDYALjiIHIgRUIrsZjM7Ax+BSx1S4pfffQVIep8dL7dMDsTGjJB+CvQxTHmdtrw4l0CovFruC2NOe975egDQsCXRK/eK634JhBK90q2C7I1i+Gt0jxF40k1cPJAB7UP2m3MGJAAFQrGei9iUTH9yBUDTHfU3B5+BOIKQ43BWtNtPcWIOzEZE8FoK9K0DCGNxLi3FqaKA9gTgeoFwPQAoI0OulWT11oEwiFz7cwbErzNxWtEYBB+VY76Vh4DWrH8IOoGQ7Ocg1CqMRLPltmxvs1/SHaP4dcAJePYyyUCRIzrTB8tE8FoL9DUMwl61kQQ87Rmy2PS2rgB0a1ci18RudEJH57OsY02y/+83/sZdBKr4FXQTApBvprGgQCg9UEAM+h9F6ugJDkC3gJPBEvRGrYoYCBX9IxEcS5K4i6cZAHIw8oXQ4mLBb35YH5d7OekadtTV1UZSjaEIPH4nQzYNwgjAHNwDuWGYpZc7lzPfX1cQur5oBorfzDf+zi0yVTuSkuxBI2Q+PhQDIUEnMLo1TBCZLufGw/ixbQa0KB8CTODjPohdY78IQmfDjmW7Yo/doAX6GqIiAtDHaYswSmeMubV81kp11L6hy2PdAcgblfslOKC1IiKRmyRxZgV/8++DS8BFrxXi5Hd/U6MeSKdqEsEKhpBRsgRMbAtuG4KU/+9ry5brzP/lPVMv1EPOQegharrVcgZUhVHFxNPcp9VFtlOWkL437C0WABWypFRGsV0sb5Hn2zYBwvUGoKl10v1knDgo0y7XA8Pfv0UACnjaK33Co9gJQAOe64FkNvtZAHQdjz9v2Nz2GSa3jYej2W3KGuZ9ixGdIVSoKT13B2s5AHkGheST6qn0erHv5AIgAAU+LVfw/wq3CEAV7clBKDDGZG9/5oVXx/oyYARczcqH5GyH8eFplTawFvAtrtXLGpNrQDGbejupB3omlIHQGc/ErzOcGSRs8zrhAbbuL1Tco/JfbLlNwHOmi2kIcs3owbdwNpYtynDQhsFcgvuG9/YapGFvYX22zZcAU0/GwA2LJ/4AmGF9mwEbBu98Y3cMF+uAGQCj2HVp3BbPuo3IlqxAy5wHAq4OfARmEBXGfNIBa0BIsG0ecwC67merHgRpZLwocrWaovuTxew/V0txJQ2DWeae3WAGbdhb2DB4+wRw7w5g8Qpv88liyGtoWHzMi4C9fAEHbBi8kwUKu2xNAdBxaGBLbJdZux1LwAGECYAEm6wyfpelJrEgFnRDxESwgyUxIUsVMwjVy5AYO0bG89Auu1/5BF38KqjBHlUAYXsteNCGwTeWNuwtk4JMkrlzGNizA1hm69g1Nix+zDOBW0aBeRZZGqBh8M4emfWNADDT+zqMjQyESdQFHfDbZECCLRgdHeCTe8CBaKJY1rDnBRCIAuGW4TYAZeFG8ZuMkGiQ1IEwGCJtHZBmy1obBsvVMnDD3jIAerti3LEBOMjGcOpa3WfD4ic9t6oveDtLfw7QMHjnH6wPAybW6yaG4+8D4HIQfvtDIVtLejpBFsVvUI7NIBHw3DUjRzL3rDVtsYPOkAScuX3coNDynT2VYJCkn+PjqvUD8hVbS8NgjphGxcANe8sAGNoVY/824BCBtIaGxRe8pLKZdpMkTvXiJ2toGHzSNHDPScAyq3er4qPyGaNc7JCRXWLT2TjwGmCOeQashq6+qSpZmp8vojQpheF58ncdZVjLnjWPHr4VWKTKxrHGUqq97qXu3jp0wPy+eEC/DYNZsZAO6IEb9pY9lNCuGPcNV830ZmkM9dmw+OKfbdcXvJMPdY0Ng0/7GnDXKcDMccBS7MwdKz8KCAKQIgY0MWGCtr4TOHAasMwOkTqf6unyuLykfd254nkb7qsw/iVg7jhgmSX31Vpd9yRHeLx+zRhjEGRbB6wDYT8NdymyubzDzCCGfpMJWfSRYfr9HP/aMgBm7YoxNQHMbQHm+ID6aFh8yS93tAvGQb7da2gYfPoXgbtPAqaPA+a3AEubgGU1RM6B060fgkRoCzj+TcD+04CFE4BldZdRc4/YxlxgjJMewSiwN1zWfsOngdljq3EmY08vm5i/7j5yIMqpvupKyGoNg9lngYosl9wY/0dZdrMzYl8Ne8sAWNOu2MA3zw/F2CoNiy99XbvftrcLriz6PhsGn3U9cM9xMODObQYWCMANwPJ49UliuW6SaqqBn/gGYP8pwPyJwNIxwDK76ahDeN6uXYCuYyABkEza4LbpY5WEWdSLxjF26/dQB0SJ6r4ByAN6NQxmkWcqrnQ00x1DEDJFjR8CcNWGvWVPp6ZdMQ6OVOCb3wAscPJ6NCy+7PerkP5Q3tBY1PrT9tEw+JwbgPu2AlNbgVkCcCOwtAFYcgAuiwWlM/XqDjMEbP9t4MB2YO54YJFMo/5gHIcALV1TRZ17FXOhPtvgtvkqf9H4kvHDlyKK4l6VzvVSBF22uwjOb7pbw+CfcwBSkyeFEHAUx/yw9JTyEbo27C17Ol3aFWNuAlgIn9QxO2tYfNlbK6MvaxeMRYquvL9rTcPgJ30TuH8LcHAzMOugX3QALo21WXBZLEHwRF1OgHS2eOgbgIPHA7PHAezNu7QFWFZ7JnXJ5rnqxHEulvlzwyVNN3+wern5Yovl7SXLGwvn4riLWO4fgMRJXcPd/+pmOymELEhRzBxJAo9gVL4kwVnbsLccgHEpWi3epocCAMeBRU5eTcPiy/6qtl0wpvhA+2gYfO7NwOQm4OBGYGaDs+5ExYDGgqP+ccAkINaVpB8GTv4d4OBxwNw2YGFrxYCmV0YxLNYheCXau7EhV3ga3Lb8g4+R45uoGLADgHWqhsBXA8K1AZADyRvuvtkBSArh+i9DsQhCOtf0UUgW/7aiYW/Z0+nRrhizoxXwFhyAi5y4rGHxU66qAFhT3rDSIVdpGHzencDejcDBDcDsBDBP1uX1CMJRwFiQIBzxieL3KIY1YW5MPOxNwLRb8gs0aghAss1GZ1O+SFHsdRPt0i/PLHu++dFb/x4mXfhcbWxhfCtYMFr/uWvKxfDaAcg7ipPCvFOVpuo3HrCjYW/ZA+rRrti6TS6MVQ+L4NPH2nx698GnXF0BsKa8Iab4dFZpGHz+JLBvApieqAA4J8CPOQuOBBAOV0CUYbIskRkAecrvAdNbXc/aDCxSpyT4CEIyTgRgneiLIp3nP6fs+a4A4N8B8/48CUC+ZGJA29fpuLmxJW+5h5kNFg2jiWHSi0r0Uv4pCoZsxw8DUfnhd4Vk0XGdGvaWPaBV2hVjdjgA0BlpkQ/K9bmn/HOVqtClvKEBqlfD4AtmgP3jDsBxB6DA7tdbcvYzJvQJkii2n4NOeMpbgJktbYPGACiF3wFoEx1ZMNe/4jnPLXu+KwD4t/5SO/iMBcXuesHylyACMBPDgzGg7opM8mEHIGdwrfGA1rC37AH10a64Yr4APvvOSdwEPOVbKxu+K2pdKRTmdI3dqkPPVgbSTBGAY8AsATjWniBdx0QxJylOFCcr6HBiw1P/CDgU3EgEIMW52M8YkLolQRddIN1AyKWiBretf9MJQN6HsaCPxe4rvgDdHOcOxDIAcmDFDXvLnk4f7Yqt63gEIB/Yoj+4p9xaAbBHeUPM8qF2aRh84QQwNQYcGgdmx4C50WqCFngNsgSvQ+Dxu4MuiawhwIAXVk1O+e/A7CZgThY1dcno1nHL2oDIyZULpBsAFTBZ9pjT0QQgn2V6ufRicS8QRgbs5ZYpEsENDejBfpoLrwAOjgIzZMBRZ0AHoUC+SOA56xJwNlEyTFw5FxBPeWvlzpnbANCdQ1eSGTRybMuydgMggVBsKmtYoC6Mt8znZxsZMLzAxoAOvsh+ydDqtXx4FIDl8L/omQ7A0QqA82S/ERdTI22mNfaTuBIIxR4BhKe+y61punQC+MytI/Zz/c9EuvyBeetLAfGZ5WOMZ9j2/gqABB1fMLsHAVBqhfTcyH5d9MByEdzs+B50Z7voGZX+NzNSsd8cwUcG5ASRKYbdHRNYwhhDIHRgGmO0gFP+HJh15jOXjnyKblVT5Cbfoq+yJOszF8P8+VnNPlICkMAzds/YLxlYznrJwIpO6egTPMqA5ZNDAB6iCCYAyYBcBqTRQ0e4630SxZyQJQIvMJ8mSeLrYe+p/GzGfnTpEIBy6US/out+K1wg+brs88rHmDOgAVCMnrEfxxMte1Mt6j7u9zzKgIXzczEBOJIB0BnCJoqgIfDEhM58SWzJEPGJe9hfVH42un/Mfxl9bgSiBySIBWnAJBDGEDAB8QWFA8wO3/a+wH4+rg4RLPYLul8tCI8CsJmJMQAOuwFC9qMI9g9Z0CxhZz65K0wfFBPqu7PEyVdWAOTHVlTcpxhXHZLz1w0ZA6EDLhkCskRf0sw4dRYC0PQ/vVSRAYPo7QCdj7GqVOSMeBSAzUzMxZcDMwLgcKX/zbv45SQlHXDIgagJc+bjZBqAWhUoH/Y+B2D0J7rFa6LYDRmzomsAaOeKqxEvbWacHQB08JkRIteSXiSBLYJOLB+X4xrzAzY7vgfd2S4RAKkDDgPzNEAIxMASSWF38WsgkuXLyXTRSRCe/DduSZMBMwe6ObTd8JBj24Aot07uDObPP9XsIzUGFPs5+JJ/M6oT4buxHv9X7BeY8KgOWDg/Z58GTC9Xq5FxTXOw9c3Cm6k5fPcjgbHbgAlvVG2tH1T3Oavoq6BlniZ+12n5u/2sDbOvasqoFg8x2Lnbcd1GdhSAhXN+7qMrAC4sA8sORJ6yHwD28z+Ft4fdv8UyqUDrDmCEBcpZ39kLS6aq9l4D2rLb/KYsFTPWdfbvh86vQu2s1K/K+zIjTsXIVQ9a59Egs4Y6sZfIA/EcSp/jEXv8BWcAhxaA+SVgSQAkGAMICcwVlNLlqTc9Gbv/HAA7MrL4+f1VlXwrUq7SvCoyGcrrWpGhuur2fNGYwM8YT67hT3s1LaZvqn5MLM0bzmHMmIFSgdFNj/mIBct63NhFZwEzDsBFgpDPeanNgATfCtGsX9TIKwNrg9tuVkhlng7TI/YArX1VkXKrEe1l2SynN1RCsFJsqnQv3UIMxhwIRjU5AGN9QUteVz3BUAvahuNgjC3HxLAND7nBp/cgONXF5wCz8xUDGgCjKPbvevlzcKUHH2ag6cnYzepYBB9Zi2FxDJdjoXJv1WDFiLJ6MKqKZUzoQFTfj2HmwTKcTpVWvcxHKm6kKgoORAEvVclPD6NdzLXpMT8IYNPcLV7yJGB2AVhYrAC4SNA5AxKM9ryDPE5fs6eeVKWGZ2M3S3MQfEyJUKV8L1ZpJXpVJ9pLilmlAxWkVJHKwIhjjD9TtVXVm1HdOy/pJiaMFRWM+bo0rWl4yM1N7oPhTJecC8wRgAttBjQWdBBGESwgSiV0Pb9DRgu0TY19N+M1mRKh8niqFx3rRDsLqjgl9yaGXT80vcL1wnE252PAZCzAHQCoiqoW3yYWFIt664fUpKaREr1NPakH6XkuOQ+YDwy4FMSwgU8GSRSz0UJx3Vx/5vFNbrs/EiLRY+v4ACITww6iJEodQKwBIyBRv9vwhKzUW6z66TUGEwhDS3ezqusAyNxnJn8xa1KRPSFts9YfFB/QDZcAm78CnDBT5U8rCqjfc3yh8Gn/hGd/MsKf1+QzYJ4891Jye13iy1cAE9cDJ+6FpYrEkidxDN3OtXR+FwBGMezoMmxJLOumAuD4J4rxJrfdH/XCoLGFVKiUbw+LAPQqWWaMMLrd6/+JycSIm85w9lOpt1j1MwAwFTiqAWEUxeYH5ENn/jInUVHeMXQ/f/jRePvCa4DhTwLHfBc4frGqqaNJzLPw6iZxV+HTplFGvZrXZT45N39+HW3TujlZv8D6fp8HRq8Dts9XIOR5YtakgBgdrrrt5Qsq8Ssd0BhQ4HMwmVitAWHAY/LbLDQNQDaTVJ8Q6W4qVB51OOqDZDPVB3TLOBepW5jmqaLbec3jGgBGMSxvvemDYkQ9GoKF1ShUCSKCqBeQrvmfVZPC1keBjXcCmw911tTJ8q5XgOLaQgA+x/OdWA2EGZ98gbjleTHdQHQN+2iwls3nK3/Zhj3VeQhovYzdxmArSwQgDRA3QiSCJUrTnjfl4KozRCSCCeYmt90EoJJbVCk/1+FiCwFZxLk4dRfLFia6x8LbYkD9v9cXtLG6+O4AYQRfrgPygVIcqyhTXcWFOJH8fh3rz7EKwnUArq8mcGwK2MCC1i7WY7Zenh56feHT/jE3yliE4TZncd636gPFCKWavGhcRx2J+cvs9MlSw0Ty3cCm+c7n0G0MExdW4BMIbTXE9UCynvyCCX+Ovm4gbByA/xisVgJPpXrzLj4EoRJjJIZrWHArS9iprK+KcefgiyB0XVKGjOmCmW9xhRVMUSyRFnNeFGEdI2q+/HFXclkp9WsAbgTG9wGj08CI64WxRk/OTDcUAvBHXSLQxcVCDMQSWbzv+1e7WVbz+k5w2tJtsbcCYV6WJY7hmAsDA7r1Sz3OgOgoM+KTOJbcjSI5yGIaNE1uuwlAAU/MF+tF5/0sIghVLdVdM2S0bSzHx2Mi+FTxXf8X925NC4BycK8QwfmgVX1LlcFiykEMcL2BndJJ7aQfijKfxLGDwAhByM7aC5U4qwPzNwufNnNuOH4VZaCPlPo2AahqFqoPVFc14ga2m+WEEL0cAz9kdPrOmMu8r1o/rTsXz7f9oswFs+jO6LAqkvC3Ggg5Fg6mwW03CUI6X12h8lyfcz3QHqr3DIl64DbqaQKc9mI87QXACD6vpJqY0EVxz2CEyCI5eMSGX2e7VtI5J4yTRyZhscrvt1nQuivOAaNLlYESwcySgiVbr37Bfd0/u31yEgg2FVaiPCeVOguqAfGov0iR0R9JABJ0bnwk9nMxw+fOh55EbgRhzozrBUA1polN9CLwok5HEEUQBjFMQB7D+j656PW+IrJ8O/bBCo4sGFdGejqiyYCx3mKe9/JtTiBvmI5OFiTisg9LtJFF7gZGDrUbHKs79+hyu5hSaUvh1foFr3r/6vZJCiXgCDwVVFJ7MVmRLsrGltuFCc68yFdACMDAflwR4QM3HPoKgIExt4gz42SuaQb8hBOE2oZmlu+KFlKR3QSssMJxDPWbbjpfLoJrxG8CYT8MKGZSVTCxYFTIb84nkCxCIPLDiby30gXFghaF4c2ReR466Uu2fvoFr3r/fKAEFxvpqMcd9yonIrkuK5LLV7MVCM+/uDJCyIC2J8a0z1iwqyESgMl15Sa33QKgmtPEBnp11mwuXgO70Ud4DHWzfgDYC3zBEOk7HlA6XKyHQzb8HgGoCSQLqsxorIy1Bxie7Wx0rFaf+wr9Xv32C+56/7HbJ5VHtRYT+GJrsehHcya57PyKAQk6+vBkBZPpjPEExlwU59awg3C24W6KBsC6tqHR+MidyVG3i3rdAnAsH2T093XT+zLr197MTA80h3SfsZP2UqpCrPQ46oF317VrpeiKXTJ9MhMLkgGdCacKG/mupV9w1/vnwyGgCDCKWzJe3lqsyzLWZWe6/kc/oKzgKH4jC7oolhdC4jiuzM0WPo+cPQ2AsX1obFCTO5Jzn566PwbReiwnfTWjI4KvDoh1juh+aT+WKSYD3i8Aql2rJk+VsVQly5kkddv2FvHT61icqO7Fr71/IkLNXOi0FQjV0046oBy6wZ922Q95ICqDEaL4XWw3COcf9Mw73DFB9AqE6wZAAS8XuzGQIDKf+oVkqxt00ttAc+YT0PJ9qRFSB8xoye5Xu1ZVeCSgCLbYLVNswoncHxoeLwCzBGjBNki/4BX3z9lXgUCyIIGmhova83cRgO5Te9yLgP3MfmsBS8xs8/U67ePQOqy9umBUruDchqo8sHSd3PMfT5ifo+ack8eFHI6QEcnT5GvdOnVdXof+ptJ+BVPWceiaRHA8Us/nkACo8mzqlqmWrbFDppT5A5UIZm7CPA2Vgm3QfsEd909kKIqB1qJAKCBG8ZstZz3xHOAAiwmpDIdng1maZQAkZzsHZ537YfQrwNyxoQ+HakrnS0h1mUA1C96TdJTmORyhC3oeqdwROi+GDhkFI6bYNrcNDEDeAkXwQizPRpmnIs3OdqZPSaRFUcbchHlgie6agq2kX7Dd/+d8lUJVXuUzk8ERmS+2vfd4uvN2VOV5rSwb0y3JhgIh9wJeN3YMQCIgR78Q+nDEVYBYZUrUpbXFnM7COSdf7N4IPvtDnT2BY/h8Chh10MXQeYGS+7GGjaQiABpuNIFiECnzdWJMIUHcazLptC7YivsF8/7FgLFMqpiQL5TuNbKfA/DC46rqqAbAwIKWK+timRUBEiNGsOQsyQm+Gpjd4n046hbT84KPuYjOmHHyp92gcgDS2OoIuVIeh/xyUkaVwyEWdLrewHE3uBUDcKIwnq40HpDXL+n3CzbaKdguel5VnFJl2awaghLQBTzteZ0cjLq2A2n0M6EPh2pC57Wg41poLzZsAZNso0Hw6eVR/J8bF9YjWGmVCpGKwQLBRCcrbiSxNLgVAxCF8XSl8YDHHFPW7xeFBRwv/rGqOKUBkODzqgdWPYAM53vTASMQu4Bx9J+69OHIF+N71F1O1gUB+AsBfFqKC+4Wi4BWX+CYgOTAU36wdMVNVKka3MoBWBhPxyiuko3xkSX9fvGMkqsDlzzHC1N6SQ4DoINOe7KelWWTheziObeKCdARApD1AdVnRH048gKUAmAEYi6Oh4DJV4VoGDWqjq4XLbO5o1jBoimEPhPJmwu9FvnTLgdgYTwd2wyXbMyRKen3i2eXXB245FlVYUpVxUpGiLtmGBlrTEhVUwV8dEkVKAq3MHJ1uzRbRx+OOgDWFX6MsXJU/36lJoEoA2AKvw8+uwTEDIBbStdOs8ddDsDCeDom7ZdszBIs6fcL9ror2C75US9IxJJsEsHdGFBil4yYuUwknofJgF4XcEUfjrz+X7fKo4EJJ//PkMORO6FrVjQMeL5kJhZMMXzLwNZCt1nzDFgYT8cQwpLt4hDON0i/X7ys5OrAJVe0S/ISgFY7j9ZvnQ7I3+lyqpYaL98CWp/N+nDkZdhi6bW8An1kP3fRTLKVWlwF6RZCH2L4zDDR0k1IqeTNb2OQSYNbOQMWxtMxeqtkY6I+ny9VEz6btfb7xc+XXB249AoXv85+tIBVgJJ6n4lf6oV+mfjdDJNMH0wAVFX90GMk1f5TxlS3Fggh92DyN0IORy5665KIfCktsl+K3VsGtpVOWOMiuDCerlSnjQ2rB+n3C+pIBdulz8wqonrNPLKgwKaC5B3s53qhXVq6oDNg6sOhqvqhEr3V2VNLBjmnSSNdrOLJ1zkAu6VPRjFcFz4fXDJ8i45hG94Gt3IGjOFYA8TTlQZ/qGH1oP1+8ZtlT1MAtHK8mQg25zOZUSCLIliWcbw8wfW5Ln04ssqnHX04euiCk6/3de66MPpuAQVZAEFkw2MKFw6a1wEL4+lSBvmAOMhD8vkOkFX77feLNw14YT/ssmc4A6oOdHBEkwXlgjH2k4Nal6wB4fIuX9LzZjAmorNeHMo5Tc0OewHwDTUh9HXxfGJsYkAbAAAgAElEQVS/uvCpoAcew6zBBrdyBlQwwoDxdLZWXLDFkHyF8xGE/fb7xR8XXByAAVC1oB18HQYIT+8uGfP75SCUs1o64he8v4j6cIQ+IqkPhxrBCHjdjBH6AblQkAeY1ondukSiELmsUPpjbyp7XuvDgAXxdNZVvWCLIfmKg6Bbhrjup98v3lVwcQLw8gqA5v9zC9jErutltg8gMxDWWMBaMVkmANWFyEV6R0uH2I1IzW7ypbkQOTP5f2ch9KsFkwp0kQlDAOmxzHpscGuGAQvi6VD4RgmAg/b7xZVlT5MATNXwqQc6KGwf2U2uGV2uzg3D4ua7fDnPwZcKgIdq9GaIBPZb0YdD7hgyIFWMXiH0eQ5vXS5HcMkc++9lz2t9GLAgns7KxxZsCkgdtN8vWD+vYDMAUpcja7lOR9eLVcIP4tcuob/3AOHCdW02VTX62ApB4Mv1v24gnPy9HiH03fJ366KYHYTHsgBBg1s5AxbG0+HLZaOp65i+ln6/YM5EwdYBwGj1cmUkE7+8THLNdAHhwrUOXtcrO/pwhF4cct2oN68BMDCfmsJM/n6PEPoYPp8bH3kCkbtjji2tJJA962YAWBBPZ0WBCrbYsFoOf9pDAiENk179fkuvf9nTXewKcBSjsn7ldonWbgQpx+26otaLIwAlfi2QQSJY3Yjy5i9dmsFM/oEDMM/Z7Uf0RiYUA7J+ToNbOQC3e0WBBm9qLad6HICG1ZK1XB5PoxnuOOIcxSXe/Of8xHV/P+FpwN47gKUpYHmuSve0pKZgCKSq5wqniWE1WZz/xouBm74KTMwBI17lVBXwtWSs+8/vL45Ff3vhpcAnvwos8d48DZX3M2hx9XIAnu0IIO0chu35AOgLL0yuG/jOmwbg028G/mNz1YWdETbm4I5BrFlov+EtD2wIo7l+Atg8D2xY7iw3V5diEqO54mnj6XdMAYcU+6gon7A3NSO2qFjlyZYDkAX6uD5Iam44YaUfVNDNxaJcLIPXcGGpfi6PnZdVD1wPspQBX/wl4OaNwN6Jqg+xwrxslcVFuYJblehkcYYZGPS3L20BxueBcS8nwg5H5kZkx6TQSbXFZcCQKadx5Cz5mPurAFxrRaa17pAR2PFC+ElSHKQ/0QjQcgCyGyM9v3SnsDBRJgL6msWCf6IfWeUJac8UFlpY8500DcCfvgb43hiwZwyYVhd2D/VSrKGAmIDnBkiafEcN9cprHgKMzgNjS1V7rRjRlceyrqif6KAkMgXIM+6tAnDl+zSL36O9+U8p9jGHQo285/2XA/AnXeNnKAorDXH/AILwbSvLEz6Ql2+cAf/3XcCdw8DkKHBwpOpFbE2wadzIdyh3jjNQirYWEwYq+/zJwMh8pf+xKNSwM6DZMmzNRRbM2K+2Ii6TlFrAWfd5V3i/F7IgT2LBF5LbIdkqxLPWvtzlAGQ3RpU3Y7AiixMxLOUB2t7pKQ8M0qCTnp8HkojJgNqaMEJesQv4AR3Iw8DB4QqAs+6SWRiqgJgY0HVDAdBA4Ba4xN7ndlSFAAjAYX4IPO5dBDMAdS2i+Jx7XTf1eEdTDfgAQnR34p/wQkRmjNAoByDT/ugFphXAmjAEn8qaPQAgZCs0lSckCNmVigEbFMsPBBE3DcBX7gLuawH7hoAD7EM8DMw48AhATrjtQwiXoqkTEwWd7LOneXNCbz6Tiq/TInb2M8ZzIFrTQbGiy92oGz7pXl/7jvdAJnb2470IbB3T77Sai+hyAP5voTqW6sKwFAc/TAdc5+3dvcsTrvPVYSK4SQb8xV3+6IaAqSHg0FDVh3iOIFTIFxtit9orL5Z/LD1Q4s+B8OnHVuXwhhdd5DoLGsgCCJ04q66X/Ju/vSaeAxDPvbdtmdtKDV90gVEPIl/xySkviOhmAEjrlzSkwj40SlQZYZ39I+8JBMx8mZryhOsKwqYB+KpdVSDFvhYwPVR9BD7uyX4SwRS59nNI+bRck/DzJ05v12M0nY8fAk8iWL5BB5qASPGRCi8EVjzv3mqpkC9ACrrwhKukB67GhpqRRowQMqCiYbj8oOoHeUWpdYIBAUj8c8WjrjyhNIJ1unzjDPjqXdUjJAAP8TMEzLYq9uOHICQALe/EwWe+QgddAqCzzD8+vgIgg0qp+5nYjaDzCgjmnCYone0klqP4JSgvvK+6LoFPoFMlkPGh+0rPWta4RHTNJJQz4M8EAGoNTPVU8opS64CC9zoAWTFChcq7lCdch6s3L4J/2QFIEBKA1P9mHIBmhPh3Ai354RyAAmWsR/PRs6vOR8Z8FMPS97yxtIlYgVB/I7jC0rIKSfLXF1EEB+BFFjQ3jCLA49OWsRTTEPzvzQEwry7VrZ5KwzAQAPssT9jw1dcHgCrORQCS/bgn+1HsCYQSveaHkzvGv1scgU/6R55Y1YIxhvOm1EZekQWl8wVDxJgwc88QiJc6AKX/meHDawX9z16M/Em7bO8Q08GBP/jEkAEVjMBoAFWXUjRA3KtNwOBXW3EkAZhrALktpC6lKtTV4OU7RHB+3kHWgv/zrnYZl2kCkF4uF8MGQGc+MqEYUCA0n1tkwxbw4ScHAHr71Q7W4++c8czwcBAmHVB/c7Bcek9b3FuwbdD/kjGWgzJjQ3thGmVA3jhfOyU+RxB6FamOFp8NrhsTgLy8Cpzm5QlVptAU+6CiNgXCaIQ0BcDYV8b0P4pi30vfIxD5+w72C9aliegW8MHzqrmh/meuFhYi0pKbs6D9fsh/n1XFMrYMbPgUByCZz6J+uEknDA9AornWFRb01WZEsACoHhOqyC7wdetT0QAK2KqOb5MCUvPyhLE0oQxzqaYNXL5xBvyVXe12vByLADjXAvgxBvSPGFGMIjCmJbEW8HfntxtQmxT0cmxp9UPAdKAZ1upA6EB7qgDo6oCUxXRtPVSpAwJpnUhuxAqWCCYK1MBExZljY5S8SYr+pxAFAuBayhNG26jw8usCQLX0SAAkwwcAEngyQizaXoziIli+Oe7/9kJvNk1LmBMe9ECO3XRB7aPeF0EYHNVPdT8gj016YBcWtBfBVYJuz7mF7VgGY/pO8f5WdQ1/7U67nIKNS7j0wIbDPFZsyNHHY7od/xdlEHj8CcC3TgCWHgGAPSxiSdt4312u/8SPAl8/Dlh4pDeZW2PD4J1c9+uyDaIDkgEJQKnTfG/N8nUAmu5HUnMW5ARbPfEuIHy/ACjRK7FL5pOR4RaxgTHofKl8r/S1ZWBnAGDKefbn3AFIPRPXB7sFiVQimKVgGdl5ooNwLQ1/1U+DQGSXQ9r5Evy1q9rZbP1lGQDZsPpzI8APHgXgod7qUx11YtBbFzC+/C+BL7SAWwhgdoLkONSLqy5oLogYft3ZI1F7EAC+phsAnekokhP4HIzml/PvthQWmPB9LJ7jxkcSr14jWj4/0wFlgJD5eoDw6fe4DzAYPHokWhHJZ3TFSkn4h7YOSOBwEtiMTv1aY0uktFYTmI2/43EMQmCuAJmUE0gmVD8EFdPpdnxhVhqzDr8F4NMtYM9Jfg98EVTeNu9Q2OFZBX7vr9vtgm/lcezczZ61ZNN8DCvilYCdPXqNDQpAlfGTKm0M6AA0PTAyoMSx64cRfPQHXsniOTI+fEWDFGp+Qb9BeySRBV2kpl0QxxGAlHDmkI56X6z+EP7UDYSdRgh/IouwIZ36lHabBE0GJ0r10Rgb/xA/tt/j/6aMAf+7R4CxzuBXWRGULwBfIrY6UNfpvLae7n0I+LO/reoLMqiVMbW38oUhkNkQIzZO7tIweGePcmWlAFTjAYHPVGwXxWoLYblEDkLuTT8MDPhXLJ4jALpaJB+ggU6xfgJknT7IKXIQXh4Y0FZCog+wxiUTwSkXUbSMV1rB/A31OXWuFpPUda/mRHKi1e6U+hA7Zq7l+A+UAfDtHg/LrptkQpZ727cRWOL9542Pa3rOvuOqagUltgtmJM08j4/PILbIDKz6w5PAHsbraTnMGdZWIwIzxIfeK0rn578J3LAVuH8CODRahV/FFQ/1IumIvXP1QudNfyNT8oVqcHviPcBd48A0g2RDuoDqHdb2SalZAdG9dnfDkAE0gXnH5ijWCDbKCq5/MRiV0QD8HgHQ63jG0hdsLGxA3x9Bw1Asli7hO3BwApgng/Gjvq01IHrXJ7q3Cz7E++YziF2rs1ZLZ+8H9jJsSoECWXj6igmR87aLgfbGq4GvbgLu2gjsHwdmCEIPSI1h+SkCRjpfUC3iNWcpoRrcnrYbuGsUOMBo7QBCxSTG/igxVcBIVGPWM1h1JYQPnyKNExGZMDIJ9b66eEBGxPDY1Y5nv+GCjfGAxD+DDpiawphABWZPjwNzNLAEIH4XCH0M7/5c93bBfI8Yk2cgVAdvdT10ifDkBWC/r9lGH51NhIsnsWHOfPmEUKT94WeAG8eAO8aAfWPAwVEHISNQlKQUglJjJExqC+H6Nq93kOpUg9szbwLuHa66QzFWkaFieXxi6hgVHOMCYGRuJ+5V4jYJIDKI9KlsAvFDq8QDrnb8NWVPh9EwdFkQ79TlSMIsN0Mi5s9MoOGno4U6f3YAvefL7Y7rvdoFLxOANSA8f7xSgWmd0kCQbmZ6mTLEnJ0UqWLhUkxlrBn6n3wWuGkYuGukCsufGq2iojnRFpafsU7MDxErJuZhYCsJosHtWTcBe1oeq+hxigJgXBrMmTBPnJKLrr+VED54ibHYvZos8sO+DNcrHrDX8YVVyglAKud0LtMjFPtNMz6QLDY7VomLJd671AEH4Xu+3g7nWq28ISvX58/hguOBg8vtFQvV/hEzxfqOevuTfpjri8vAWz8L3NYCfjBc6ZYHmBcitnFd06pxyb8W4gPlgonBqffTtdTg9pybqiVNBssyUsdUD7eGO9amnf3sXtxQipl7Wg/sD4A8AwHIyZMYky50Tp/xgN2OL8y051qw2hXzwRCEdT2nmck1RxHG+w5jeO9NFQBpR6ldMIMXlFWgVndqF2dVFsJzuOgRwMElB6DcI6rznemD0RnbwQiSRS3g7Z+tVIl7PC9kahiYZm6IizuLigliT/VoUog+p8P9l3wJ7qGEanB77k3VczroUToWLCsABud4ypaLCUoxf9i/9w9ADiICULrQRWuIB6w7nuZrwaZwLBGwClSqSyz3AhHbaRGEFGOmC44D72UVgjW2C2Z4lIF4ArjodODQcqUGqAxfcpG4mJVuVqcL5tbs2z/veV0tYK/nhTAqesYNHdO5PCJZos+WuzxHJIViuXFyJxupNLg976ZK2lizUKodilGUgzyGhokF8yw5Mf+qRkjdjfuDtwkkm7DTkNaBaQ2ox1q3eMD8+B6O3H6em8Kx1Ccx9ptWl9iYIUAAWrI3I3nHgPdOtsO5eOuxXXBdj0V1vOL/so3Cxef60tlSpYwveKf0pAu6ohfdJ8k4CUqgvr5jV6VGTBKALeCAh+VbZLTnh5gu6D44A6H8cVlkNK95O1WkBrfn31R5HSy+JCwPplAxRegE/2T+AloGncNmbQyogUQx/KwB4gHj8YWNTwRAOW0FIIIndoqNkTAxz/bd09XDGLBdMM6/pLKi5whAX60gCK2ujxzEAqGL2pQ1Jis5AJEAFHvTujYAKjRf+SEugm1d2COQLU/DAwQ44caEw8AtZzSIPgAvuKkdrWMM6M7xCMBoiBn4YpCE2NCfxWAA5MEuwvCCEICwlnhAHV+YORfDsWJGgPpMKwg1b9QpFnzHbD2BK2JGul9s8KkYW17vLALQRTCBpzXZpS4gtCXXMAkduuAy8E7PijPWprXJ5CR38ygw1fJDohh2BlRAgq2OeN7uTWc1D0AFNtmL54ESBsCaJcLkDajxj5ZXRiCIGA0waDwgjy8sk5+HY+X9ppUbJSCp6TnFCMXwny1WAFQ8rUAc2wUrRL6mXTAefWnFfnz3FpbagQKLAqAzoZjAKkkpXkNO5GCEvOMLFXOnnC4xIKOjnQGNdWSM+GqHQGd7JSsxUf+JzQLwhTdV4je1nQvr1MkPGtlf9yP2Dy+gAqZ6rQytfvdHSDxgLwBF8AmAYjHWluEDiKGMiqOVvtejXTBOuRSYJwDJAARgZAGWL9Nk+IM3SzgTydE4eec1nZHbtDaNAf1Dpd/SMx2END6kD0oXtFhBXmcY+OY6AFChnKnzl7NfdMR3qCAae2B+VVMYXASvDs3/X/zHJZcB84vuiqABEo0QPnhnwqQLyRURmZBPytnwHde0M1vN2lR6picoKULaxHDIEdHkW2iWg4/7b5zb7DSQAVd0/griV2JYojfpwRGEYsGBrOBmx/OgP5sAKANkcbFzNWTRnX/GSGImMYH/LYlk+gGvdT+bW+SWH+Ig1GqL5QeTtR2EYj5LVHfjw/ZDwL8yJ6TB7UU3VVoTjTYxYDK+Ivv7dzNAZIxpZSiU8jjKgIWTcykZkBawDBBnQdMr5QeTKI5iWCB09AmEb7+ucnOQ/aTPWn6wuzyS4u+R0Ob6CUGqJpIDA97AdqINbgRgBJ69CG4Jp6q/ckjXqB/RKla4WpkO2ODgHoynigA0JiLwaNiEt95YQKJ4FRC+7brKzRH9jZbN6iJYuSHm9I5iOAOhHNJfZkh+gxsBKPbLu3+JgaWDdojhMO5kkDWSlNTg4B6MpyIAjf3IggJgMD4MCARjFMU9QCgAykhSKnUCYHB9JB0wy5aTRUxmup4h+Q1uAmDs+hpXgFLnB6ULONOn5xACNJqxghsc3IPxVBGAiQG9aLeilWUJW1FvVXEN0TKp1C6At19TMSCBpz1dHtT/JH7N9yaxp6QkF73KBxYIr10nAMproB44qQGTj6sjUrtOFPtLeFQHLES9AdDFrq1E6M13MaxVCTNAXNFThIylLcor40zxtgDAPKuVwDMrOKw+SBTbtR2MND7sZwC7Qvm4wqHa4T/uIrhb+7n0EgbQdTijoyg+agWXT8llDsAFWr/B8qP1K7bT0pvtVwHhW6+t2C/m8svvZlawi2CKe37nhFtapkDnILRqBQA+v04AjMyn79EIkXO/DnzyCBwVweX4wxs9B4rRZgyPVFqykgDd+5JSpBU5r0vHyHz+jsc3ub0KABsZMCyQgeExKyFPVIz3lmcM6OfPAGCADYPE67Jfs6h7G0o+xvi7oyK4cLZfOgpsXwC2Lq9MwuuVERonKn4nSJrcXnQKcM7dwMMXgYcsVxkSebJgzOWPqdB1ad2f3gpsnwK2LXWeR9m3danUIV1lBSCPArBwtp+7DThuBti6UDWDmWA/DvXk8LRptfPtNUlihYZTOPCi04GH3wFsnwGOW6iAs5n3GeJJ+KLoE+9VDClQ8R6vOQHYegDYwuY3S6H/iJ8jb11ck0q9Qhoc9QMWgPBZJwFbpoFN88DGRWBiqQIgWyJY3lPozaGJ1KTEPh36zpTkJrcXPRE44S7g+Cng2DlgyyKwaclfFoIwvCwx9Zn3Q1DmIPx/2/sSaMuusszvjfXq1ZRUElJkKsBEGQyYhJCBSkUqAW1tsBdpuxEVaBzowXZqe1g90G2LotjQdmMjKqtBxQERdAWUAkUlZNBGkQRNyIAEMAkxpFKpqjfUG3t9//m/c/+737njPq9uVeqcte66b7jnnn32/s6///3v//++Tz0dmD0KzC4DM6vAFpd/0L3Gh6yTDgnvLwKzAWDGiH/ThcC2OWDrErB1pRgQisIQhAa+AED+HEEY6uNLyrRnZLSl6tSbrgLOeBQ44yiw8ziwfaV4UGbdegmA5QMTLFlqsfn7XecDW+eAmePAltXiXnkuZSBkRcm4UGXtU2uo3xsAZgz6y54JzMwDWzkgBOAqMMVBCSAUObh8QuN/CiTgcWAuyWhL1amvvBbY+VgxbW477paa7gIBqCnUrbUBiQuhAKDUot13IbBlDtiyBEyvtO5VDxvvVfxW/JkWNFrCeK8NAGsY7BsvKQC4hQCkJNaKy2LRIsg6SJ3IQSe1onKKC2CsOYMeN+0Dtj0ObDsGbFsEZmWp5S74g2Ir2uA22BScAJGA+dJFwPQ8ML0ETAUAkgDTPq9zdK/+sMWpPF19NxYwA4g3PtsHxAE4SQC6FdSgmGWRRIJLZJll8EGKjHiX1jwaN10HzD4BbD0GzC4WrsKMW2pNobZoCu6CLCDfCTqzgg6sr+wFphaAKQfgZHKvpRSYg7HN5XCL2AbAZwPrZGaj6ippXhgn0kqmU1woxnHedg5AATuWHig2FE1uVRwoxoX+Wcbg89S3AqCKPONcCi8oPtVP+9++G3j+oSK2xRBFDElUxbTS+3nvc4FpDsjxllXQoJg8FgdCQoGJJTTicLcQ6vPL6wbg9cDM4cJv27oAzFA5ky9/UOSvmg8oP86n0dICBn25JwjARWDSAUgBHN6vfdbv10AbARh8X91vDM2ss+NvAECKPVLCsHoyUgRqrlbnRwB933OBc+4DXrIC0IEmiLnE75di8HsyAcjzWUVGUi6uICMpVwwJVMXdeOk3XAxc+Hng+vV2esAYw+sWoP31r3eLcLwQBeQUrEHh4Jo2h4vDmJPuAyMLGAeEn7uqbgB+I7DlSWBGCwe31Gb9aL20kGDb/EGRxY6WTz8f2wtM8l4pgL1SgM8esHCvsuylME4nn9cfQLtldg6TZ0kUKorAfij23vAPCmqp3fcCl60XFINid1PlZrf41/dnApB6wSQjutUfIDJR8CGIQOwWEH7DywpKrWc8CFzqRLHkVYrB2jS2FQH5vkuBycXCAlIUUAAkCM2iRBA6+ARCe7DjYmQduLYTleiQ/XTTS4DpI+6nLhZW2nzVCEBaMLd+soIGqjD1ampdugiYWCpeBKA9bBJC9ActAk8LES26SqsftInLZ44dQif4Igdhym5WLrPDyuYH/7HTCNwDnPko8LXrBccjQaioe6BiKad3+QY/MGTH6rS3OBvCnQDuAIyqhiDkQ9RX+29yE3on8IwjxQPI8zkTiApGU3oVkD/4fGDieAuAdMw5MFQjEgg1DYsUku+a3uI0TGBfV7PotwHwaOEmbHEATvuDIutni6UAQoFRIFRYhfe/dhEw7tbe9Of0Si1g8HkrwRcevDajz07gIJ7n05rYyWIpb4ya/7vv8PRdFpj/LXDmkQLAnA4jCCOlTBRN/rFMAJKgkkVHpGUjySSBSFeg7/azqk8EgbSEq8UDRACLKDXSyaQ7Br//DcA4LSCtwnKhTEkQcmAIQhtM+Uaajl0uS9NatITXWzpzfcdNB4DpY+6nBgDaCtanYLN6fCj4u1ay0QIqtML/EYC61wSA9tAJeP6eWsAoDysFpg1eB0HIQRCIIkVeCqQf/05P3WCB+UPA+CPAzvmCaFWDKEuYcl1yMN+Y2dckqGTeHPEvvWDSNhOAfbefX0A6rS8CUw8X9066bFIfdqMHJID++DJgLACQumyc3gyAEYRRKFCLD1eu5ODLF6QvXedx0w3A1BwwxdAJLTXjd8seQnGrZ9bPFxLyA7WIKON63tYtCQBN/sv9QPm6BkLp0vl9t/m6ietR6fbyBA4gnXtORwRRpNnTtPpW6gWLH83lKqcOFTEnDiKtoHwy8RNFhrefyeztbnrBfbWfgttsP+kIyO32ELD1cHHvInrlvWs6TsnB7qAUlg/suFtAWkE55zYQ0QpqcALoNCXTEt7A3KoaDwGQfqoAOEUBa7fUbKctltwCajVbxvSiyvoasM0BaBKwwdKb9fN7NfcqBWGiSWykWXER0umeacUEonQgCKRfIgDFjya5yq8Wfsfs8dYgiuMxgpAg/vnMzu6mF0z6Zj5APdvPQec0TEosnvQosGOhaLuIYvnwEYSithE52F1XFAA0p5yigD4otCqygFKnpHUpLYP0OcKURYv6Mj4MNR433QhM0gL6QongawOg+6rl9CswKoSkEIxPyTsuAPigCYBmAXVfYcVf+n0SRYw6dP1YwNgHsgSajiJP429RrpWOM6cxDiJB6NINM4w7LbUGMQUwB/M9mZ3dSy+YVG0EoBiDBST5ddZ+PkCsAiIlQZDa3LVatJ0WXG2PbL98AB+4omB3oP/HgTUhmGgBfRqWf2TTrUSjExDSP/qWzQDgfAFAWyzR8rkFtDAKX75jo6nUguZxZ8NByHbvvqBQ36T1swcsBaBAGGRg40Ir+rt9WUDhQ5ZAU7Es2e9LLzglqHRxNkbeuW+oQRRls5jaMjnK0a9ecNf2R4LAwO829kQB3LTtEYQPUwzQAWgW0AGo8AQH0ljp/V17pm0KRcEifGuNOnocO1rACQbKPXhs8TtNwVr5uh+n6Zf3wDgu29g2FdMtOc8B6PdpFj08ZFrplw+ZA5FTvAQQ0/BT36FPDkRqBT9Jag7xYlQItY0f88j78sZzCcKPZlrAQfSCK9uvB4h577SCotUiEJ8opq8IQFl/PUBPEoBLxbRE62LSqG4dFB8r5bHcOtiOQSqT5T7RKzYDgJx+BUCCTxZQCwhaQc9oKcEnEBKknj5FsJ1LAPo9xoWWPWDy+6IIoqbeaO0VA+zHB0zxIQDKkn1GgtXiRxMIAx0Vn0Db+lkuFjLRCt5WEwD71Qvu2H5OfekD5FaciQay/GIbFgBXriwAyGmJADR1ck3DwTE3TQ4B0LetzBJErTYAr2BBSI3HTS8tLKBZPo/fWQDZp197Z3scjGb5BDp/L3+njMweB6B83Gj9wj3atOsPWin9WgXCFlVO/3ctf4iD8XkBkH5USlAZlNPZAQqARr5vxu1yjmH0givbX0UQKI63o0Wun/xHuR8E4VnPK5JQLd4VNttTBvK2uoiKOUf/f+GjwMNBh0NMV6J0c0NpcRv7mrYv3kh8/uHxYp+bVpwLp3R7sts2YzouSq3KGa+q7+x7Co4nazAerRKsVlV1QitF59dyyFZaYY0HMu9mWL3gtvZXMbymBIFMZ1ov2h0B+LTLisxgW+Eq5uU92iZ72ud9vvR+4JFp4NjkRh2ONi0OB1/UBCkvEYRhfuNs4OmhhiPKnFQlx6aAjMnSXJUAACAASURBVPjmz1w41nnwO4cCIBvBwZgTAOUHRq3gyDExD4zRGVYEnpm5LqmQc0M5esFt7acFl0SlHiBxuTkYxxdaihUC4QVXFu5FCUD5QtJl85sjGA0ziQxqeu/fem+hw0F2fLLQGxFlYMRvo7v1WmIVtpt1DFkXvOR7LwJ2HSkyoZmEypoVVe8p7b6qEMnidGG/Vl/L2aPOIwuA1pAIQE3DAmFa4j9f7CPaFpCHKujr5xzZesGdHqAqKz5X+FLRAl58le+jui+kTBALMcgZ73CDBkpN2/7+bfcWOhwUyCEAjQTcAVhKdjkPc2RajewKyu/n1//qJcA2uhBMRGXQOcn9U6JIOjXHQqSYOsVoQp1HNgAvz8yny80H5PVz9H6RqVd849WtXQ/zA0Ow2ayGLJ474L0G79vvbulwkJi8BGCg4S01SKqofoNvSIC+5zkhFUupV8rUTpJN06KpaBkFQm5M1HlkA3AyM5/u9Zl38zrk6f0iU6/4hmscgK5ISUtCTowyDqb7UxwsqFJW3fo/vbuIBJEZ1YRgyHwQKNi0KEl1OKTCZJdxtPDn//v8ooaDaVgqFyiTD2IKfcjZS4Fo+7g+HXOPv84jG4DIzKfLzQf8KVfI/FNKrQ6h94tfz+vOA9cGAAbrpylY2SDlVTTt+uCnV3/V3a7DQQAysJAwobZJgUXi78Qayhd812WeiOAZzEyUiAkHMeu5BF5FwZQAWLPwknkLQy9CrPMy8+lIHZFzvN3T+YbV+8X7c64OHHix74V6zIxB+RJ0wQ+UU992tYoFy3fcXcTDxQkoPsCUhFIczKVCegSg5B8A/PILN9ZwxBSxtiKiUAOi7JW0dLTustF8AGbm0/1o3vjjnSGdj+lYlGwdRO8XN+c1wABIoHk6k61yuSCJITq3jDY9Vx0BqK++uwAfX6JkI/hME0SC1EGguiQ+isqcQRLrF6/0jO2w+6FMnZhyZYsQ1W50qOHgPX1NXndtODsfgMwHzMin+0+ZN0S9YOllMzWfLwKQSS396P3iY3kNOLDPM1y065H4gOW3p4uTDkB8zWdb7FgbdDhEgJkCUDRvogTmd/vPv3BVAUBuvylNzAAYi4hisVQnEHoIqWblrxqm4Mx8ujfljT+YjsWBYgIOc0oJPsq1slCpH71fKybJOEoAuuVTRSCnYlmU6P/Z4iSJEcbLv+Yu9/1EAh7JKEXDKxq4ChUiKymRbwjgHdcUWTARgLYXHSr2LOU+BV7MVwzxwOfkOWybYAGZD5iRT0edjpxD6VhcOQ6j94tP51wdOHBdMeXa9OqWRcmWXA1XLUIUH6zyCwlAs3z+YBkfs1u+VIejJEF3ckrjI9T0y/aMA2+/tgAg08VURKT8vbKMUgAMIGzzAcOi5HknHQAz8+l+MW/829KxhtH7tTz+jIMAJPCYMULAWd6fvi+EY9ouoZBM/Kx/4LUBgFLgNC5o16FrE8JJVJgkiFhaQQBv3+dVbMrWVsC8UxFRkjjaVsW2DtRdOJ/vAyohVYK7A+bTvTdj8HlqTMcaRu/XxHkzjgNkIOWuDr8jnYYDKDutgpUhra0uAlAyCCUAK8BXcjBXgLCk/h0D/hcByDxFAdAzoFUqUBYRJTUcMWdPP7ONL6i5bLQeALJRQ+bT/W7G4AuAOXq/lsGdcRgAY+glLkYclJVTsa6ptCX3uQjAKINQstFrAZKIwWxQIhIJuovB/Nx+r2LzFCwlj8Y0evl/MYk0kieVtcvrwGUnHQCVjjVkPl3mItQsIPuElx9G79dOzDgMgGkAWlNyBJn8xKprBRC+zgEo4LWRgcdVcOCjjlNvmx84DrzNAahaFZWLygKWxUNibIhTcPD9BMLLa65bzreAMSGVoXvJ/Cgh1WUfO+XTZS5CDYDs9GH1fnOrIDcAkABTTDCCLYK0Cwi/586WcKJUiEpC8CCBYDsiiSplqUIUmOjf+o2tIiKVUJbgU5uSWl4DWwX4+PcXnrQATBNS+8yny1yEopdcay+930y5YhgAg+9n2OoUeI5TdQer+32fdhmGoOBZanBo+g1yEKU4dYgFSvqB//vZBIBt9RshkTbW8ZZZ2hUgvDL3iU3uux4LSBM0ZD7dPRnTH08VAIfV+2XAOucQAMuVcKfFSD/+IAABsEoGwYAoHZIKEEYxRIHwLS8pUuhjFVs6/ZZhIVWyxVKBBIRXnbQATBNS+8ynI4tBzkEACv+chlUVIKE/5cRGsWmlKfIzudc3APLQSlg3E2OCyVRc1kpU3DgBmKoQsWtlBcswjPu+nfTYtBL+GQdgOf16GCZW6pXlBCqWSgqJypoOAFfXXDifbwFJLvi5HAjlnUsiIe6AjOp4iQNQHRlT2PlgJCUbbc2s+v/hFwFb/q7gm6HlYpBbmTV2sscQyy/qFBj2v0/cAdz/HGD7NDA1AUyOOU+1CwWOewNjKj6/O03F1/WuugW4/XJgfBoYmwDGdH7IxB5kLPIB+I8AfNwZgga5ck2fJbEm8V9zNWPfrasbgMuPAcuseJ8Exsb9FdBhA+7gaQNKB6TfcgCYug+YJT+g89aoBDMmIMScP12uTKj13uDv8zsKig/uJ1uQOsnojm3qB5P5ACRBH3OhPuzzRN9DV88HqQLEWPJnvTy5nm/t/1s4BcuSpRZtGAu4fi+wtBVYEyccrYwn6hF8/FkJp9bKxAKVFsn/d8urgbHPA9NPOEOWl4+2cfoFHhfVrJTZPKHSj5daOtup6JyCpPx8rHWRVQ7WOlrYCMx8AHIzlxkALPD9c0VB+x/A3E/+E2fUYHXdF7KTGwdvTd0AHP9r4PgWYG0KWBdfsBdsMPfPrKKsoL9XAVLAvO2fFylCE4cKliyrDVZNcGS1CqEYhWFiAZV+XntaURdTLmpCEbpchTYLqi6NrkMCzLzt5Xc4HwyJmmkJ+Z73jQOh4NWeDUZiK1K08f0EXt7CMHVawIk7gaVpYJUA9LI1Ao8bzKX1cytoFtFfpdCIWz7rgzHgth8u0oPGDwETc8CEMySUzFaikgtlpW1Ta8JqNba7lVljSRgW+Q6ZP/57WQvj6fydBjXfAjKbgEvMLwWCvhNoipgNpnQshlS4IGFWzIk6ylWwAz93ETLxGWB5ClidLABoIOS7pmGfG+33YAG5mND0G8F4678vkiPJczNOAC4UyQm2N8w94kirFlfIAl7i402d6dbPWWAtrsjOFiuCvAJZOQE0pHTFsckHYDeCvhNgipQNxoAz8/8IPr5nbvH2jd+6AThJAE4AqwTdZKEBLDoDgU4+YVkPHIBoPwareOt/BkDexsMFAFnbzNJYm0IDnVwbt4uyur1kwL7Tp+iZM/08WT9Rc7DHUmuYTr/x+6o4ovvu9fjBbgR9JyA+omwwxvZI5ULg6ZW7y9FPf9QNwKm/CgCcKABovh8ByVy/UCtJq2f+X1yYJPGU27lIZLbuEWDsWBHesZeDz4iURLUWa1TE47LqK12fZmd3OXidFctqm92KatVs1jAEsNv6sdymaa2g8+xUL4I+Pn2beCgbLGWHI/h8G3oTr45iK86POlbBU9yKI/AcfLR+ouQwH9BfmmbLlTHboOnZ/T9+5vaf8FUaAThXsFOQ45mUcgZCWTAxe0UQ+urYMO1/37GtxQmoLCBtRSp30LrDp2SFdzYMgk/R+VNwvwR9mwQDsaspGSfJgYDYNTbp8psCQFJxEIBkQjDrxt8dXCUIY+COH5MVFPi8SOn2n/QYLZ9Gp0cxANIP5IvAkzVzxivRydnKNzBa8fddM84b6AFyAriMF2pajk9kYIeoClXmA3AQgr5NQEHMBqMVFMNaIOayNRL/vhlH3RZwmhbQQUcAasrVVGz4EtjCu/3dfb/ID3PbT7uKAZ/MhcIC0vqRTo4W0IBIEAmEtFwCYqjW03bcmdwBYeoWgetUbrR8snrloiR2drpACf+rD4D9EvTVjIJu7HBV+781X752Czj9lwUZkTEgcPoNPp5Nv4oBRhCG6dd+1DkMz1JIhR1BAHJ7zwqO3fIRRM5tmDK5CoQKsSgOeBYBKFZULTqcB9r6Ni5KYmd3WKDUA0BlhNLM8EbT1QBXBU72aI5ZjUcVOxz7WLkQ8d37vsart/uA6RcPsxNSAtAXHDYNC1AEpf9s01kKwuBwGU7HgVt/1jtD1e60fgQigSe/j5bQp+KYpGB+H62jT7P8/ZypBIC8Dhcx8eY9wF015abhmnoAyJ5WSrKeNgKO9SHxnT/LSasJBim5lRjWBEIVeROInKL1qunybRawLgASdEy74qjaNNzJCgqEEYzBGvK0297mAFSHEIB6ebKDgc8J1ksmV8t29f1en6L5v6cxIK5iK6Xne/5jCTiFcTqVn/r/tWDPWwXnEPTVgIKUHU7ljASawKefIwDpMdRxRB+wFgD+RREDJABpwSzz2c0LfxczVjkVKwaYgtBBezu3SvX08d39P5uO3QKahXMQciourZRAGKZWar/YZ1xXRPe8wQr2AUK7TvbOVTZBXx4MBECRnConUBSFEXT6mf/TK+/qmzAF/0UBOPqBZYF52HrTFCw2LH5G8UCzJEko5nZqmRnPh/uCXmpnVpDTsIPPwKApOaSA2QLDLSHf97iPx0tpISLfz7bl4iFfsUsnj+HZWEeOYDCDnDmCvZkEgedcCjxGseIhBYt3vx049HwMLRh8gA9gh2MoH9ABqKJzxf0McO7XlSAU4HzhYYFq+5D7hwBu/98OQLlIBCKnW39SlXNY+nqeiq2dkQg+gnGPb9/ZpT0lq6MV5D96gLCwgDmCwbdnCvZmCgY/dxy47xxg5SWuUjigYPHFbwA+fyGwfr2rXrMvPB+vp3L3GHCgi9JOHQCkRVPppeUBigXLFymyejYTB4YsgfA20ofRAlYB0FfAlvQqP0/TsX5PLOB5DNu471cmIwiBaRww/F01J+mz2pqChxUMZvpJlmBv3iTocsW4dzewfhkGFix+2febXDAeJO/YEILBB7pU1g8LQFo98QASVGYNQ6DZfEG3fnEqrgLhbf/HV15anbkFNCvohWSl9XPQ2XTM/2s3I4DwPIZwBEDfgitH0Ek6N6x+u/iD7T4g/YdBBYPpWHEaHlqwNw+AQa4Yj54JrJO+aQDB4pt+oCAyYvOPEIQDCgYfeF/9U3AbAMX7ItAlVtAspKZdz5SOlvA2pstxjES3wJ+92NgAGK2gwi78QoVfEhBeQACqNNP1RdoA18kKdgDhxkUI/zKIYDCnqyzB3jwAJnLFOEIW7QEEi1/1Y21ywVglCAcQDD5/Efj7M4CVrZ5AKlkhxeQUaxBI4nvFzxf8IfCVC4HV7cC6ZEX5nen3VX1vAGLZq8ysrvHY+QBwbGfI2E6JpLvdX+ksthpUvQrmX/sVDGZVUJZgb17vJHLFeGQcmCdVb5+Cxd/5xjZ6QzzMLOQBBIOfTV2Ps4HFHQ7CLQUQmUrV0rgKJMsCjsxGAqTn/hzw0EXA4tnAyg5gbTYBorKkUyLnkB9YVhTxu+kT13iccwtwdBewPAus+b2ar9xJAafqfgMQO4dh+J9+BHe5gqZZZzYok1JJUcpaR6bp93P+W/N6p0KuGIemgEWKgPQhWPxdP7NBLhiHKYHUp2DwpZ8rLOD8tmJQVplOLxAqmbRKC6EDYC7/CeCRPcCx3cDSrsISrs04CPm9ArZk55UvKAspYLqPaPdR4/H0g8DRHcDyVr/X6VabLHk2PhjpPVZY7d5xwF6CwS9y/4LbbVyQsEKIufGiKe0p2JvXOx3kinF0GjhOQY+oNRtljji9TQPf/fOV9IZY4Gq4D8Hgy/4W+Oo2YG5bUUy04vUcLCqSJVRWszJbNgxSmMau+q/Ao2cBR88EjtOqbgNWWaTkIFz3YiWrF4nAjtN0nBZrJnU+/8PA3CxwfMYB6LUra3oglL0tps6wlVha5rLiqd9AdDfB4Je6U0s/0BXTDYh80Sr2FOzNA2AXuWIszABL1JaKWq1R+nwGeM17OsoFY5XTVw/B4Cv+Djg0C8xvLYqJCECzgsxmZlq9T8e0XGUyaUizavPtxoFr/zvw2BnA0Z3A8e2FVV3x6c4sqwObckeyhiXAowUSADhD1XhceDMwx37lvU4XxVN2n3rJIocygkr/Vbs7fe+EdBLcfaXXQ3IPWIrpBB6XlnwpR76jYG9e7/SQKzarxM7qJFj8mg8UarMV9IZ4gvNDD8HgKx8HDs8A8zMFAFnPYQPDl0Co2g4fpDZLqKCxT0/7fhJ4fCdwbFvhRiwRgJruCOwUgCpeCvUjZmEFxhfk9W969kW/B8xvKQqnVgg+B6CB0MsI7P70AHgmd2n1NQ0rv7FvALIlVYK73MnQCDLThSGZoDpuP7uCeuX5n8zroB5yxThGnQ0CgyBMxY63Aq/5aBHG6EBviDlOLV0Eg1+0AByZLgbl+HRxnZXJoqqttA4ODovlJZVuSjTQFtq+NwNPbHMAzramdVpVs6wEoPtdNg37wJfvsYiJP9NFqvHY+7vAwjSwxAeNxVO8T6aNVRRRlT6hHrJ0Ovaw0WDJCKng7g86APvNB9wg2JvXO33IFWOBgn8EIf2nRLD4tbe1+AU7yAWbZeskGHwVdd2mgAUCcNKnJgLQrZ/V9/Jnn5JUYmnAE3hCmv3+t8AWQfSzyPK/POOgJgDdsgqA5nfJAvLdLV+bz0kK4RqPZ3wQWJxyAPqDVhZQyQr7gyaXI9axWCFVAGLvRUhV46PgLnUWBs0HbBPszeudPuWKsTRZAJDTo8l8ui/42juL5veQC7ZpsEow+OrZQlqVVuH4FLA8WVyDAOTAmHUQCAWQkOlsQAwDt/9/AE8SgPQpNa07+AhAA6HLXbb5Xr4IaAMfv/eGvP5NzyYA7UGjBWTWjh40v9fSyscHLtaxhJWxFVsNNAXH1khw983+DYPmA5aCvXkdNIBccemfceooAfhAAcA+6A2xLuAGucxrzgKOMexDfV9OwbS2BB/BEoqLSrBoYGgJ3E8qLcIEsP/ngCPuUy7S13L3wb6PU56/m/Xj4Ps0TKCXQA6AXuNeZY3HMz5QANAeND1kwcKXlj6wOZQ+b7R+Pi0PD0DeFAfk590CKg8qncfoFzIRVWVqfFfBhgn25vXOAHLFWCDbvPstBsJZ4LUPt+jdesgFg+qVptWq11bg2gtgfuLiRAAgQeg+oEmsOujsXb5SsAoCIN/3vx04OlNM6Yv0tdx1MKvK7/TFjVmeCD4HQQQhf159eV7/pmc/kwCcKABoeYvR0oept7SEoZQ0Tr1lPuPQFlAtO0nyAcWhpzw/FSjFzGjLx+RGvxzoSeC1hwsA9klvaFN5FAy+9mJgnhaQ0qqagglADo4c9AhCDpJPl5ZommQ8738HcGw6AJBW1VecZv0cePwOY0/wl1lAD/WUCx0mMlDLr8bjmb+Dwp3x4nkDYbD0thIO5aNtfmDi/xGEeRawxhs7Vb/q2huABQJwAlhyy2cC0xoggjAAUCWWAkksOiIY978TmOOqeqqwqAx3WGhHK06n7TDwOcAV/iipPAKjwgrZm2o8nkUA0gKmAHTrp+o9MTrEYvq44o9pZIOtgmu8mafCV72YAKT/RwAy5OPOuVlAAk9Oule6xQRTWUKlWtkU/IvAHAHti5oIwDK841ZPFtCmdr0U8PaC9hVultd4CIC8P2Ztt/m5/qC11TJXlJDGGpfGAmYODgFoCxACkLpuWh3KCgqE8gNVZK4KtxgjJAB/2X1Krao1rfN7CWZf3LSBT4uAEIyWBVpipL7GgwA0AW25GbGENBTRx3rm1M2w39mmrFVwjTd1Kn+VAZALEE5LtIDyMWUBvbLNLGHgd5H/V07BDp7r3uU+Jadgn3ptxekA5MBri0/Wp4wzBjDbCnkMWMqVpE8GJwLQqvfc0pqbkVj5aNk7gbCxgJno30cAjntowtXNaZ1suvSKNhsYTcVKmw9F5xGE+94dfEoP+JYhD/8OC8eIPUsUHokVVKB78XszbzAF4Pvd//PCKVGIpOAr78mn4DZOm8YC1jco+w6EFTDDPJqeCEBZBa5GffVbhmQ8DtZW5TYOvPhXip0GTuu22lTMLSw+aAVl9QhEWjurI/aQiLJkTMLsX9R3r/ymZ73fp1+37OU9hunXSkdl7T3QrhKCtlCM59k2i5CMMSIAGdqxEIwrmptzTsCEut5yilKoJLAcxCq3fe8tLCDBFwO+tKjyuxSCMdYEXoeDrHcHvu0tTwLzmwHA4N/Gh6zNCqqeOSxC2lb8tQSiMwbuqXIqAcjFh2JjBKGJyShQG6ygVbfJegULWBYcMR3rvb6oCRaQwFPgl1M5rR7/JtBZOIZWx/0+s4QeY5z/1/X2tFnAxPpFELaVkdLN8MWGVr4pCBsfMHN8bmTKfCjZ0Ncp456/x58zLzfw6Qf3ABd8pUgEYmqk5bGyek06IQl1bkXScnlN/u8L24Gdx1qVq91KQvrpgwaAAw9p+wnXPw1YjyWMGtDo2ASOFGMU7SIEUzdYD34vMPmXwLbHgdkFYAtlGiim6DpxJtvq9LtlVr/aWKEB8pUXAOOPAFPzwBTZ9r04vdQ9Ts4pAZ3cd+yHxgfMAOH+vcA69/9Uxijmz/AerYpdar1lNSMYzV+vWY/34I8DY58Gph8Bpo8A04vAFEFIknIHohGVR62QhFRSYjQE6qFri2z3iaPAhHNNlxKwArI0Q1IAxwfReacbC5gBPp66/5ICgLKCtqnsrKKlrFZUFPKOr7osMTtdsxzqQRZ93Q1MPARMPllohUxRqkEK6gShOP0S+dY2hlRv99y+ovRi7IiTnTvLqmg6xDPYpqAUgRgsoR7MxgJmgHD/c4E1FXu7FRRbvEgd7evXWlbPpp9EgUjiJpwe6zwOMlvpAWCMVusJYPIYMOlSDZRpoGiNxKzbdIQlXONMWJbGtw4svdgz3El47nzTRvPrrKptAJT6ZrzfintvAJgx4vsvdQvIXK5VYF3sUZxmJUvgA1FOvwF8spKyBtM1y6EepI4LqVMedbEaTp0EIKdPKh5FqYYqSxgo2jgFr13j6XXHnOiSZOeBVSvyC8qC2r05FVvVw9cAMAOA178AWPMp2LJaaekiCPXExwHw660n1oB/niGQazwOkkSepbJ/72I1x4CJ+cJ6lYI1riccrVicUuVSmIW82pkwnHHVOKbFsOozQGkFkwewnBES37ABYMaAX39ZAUCCb82nIlo+40p2gNnvsoKunxH1xGwA/LOzdQOQJPIuHzV2GBg7Cow7AI0l33XfjOsv6oVodes6ISbBsAZMX+kJxU56KY7pkmFVhOciuvTzSt05v0+ryuT/9gDrZNe4wPMsI7VJP3GcP7gUOOdvgL1rRYJ0ZI5IV3hV4/wrGYPPU3/AiRhYusy2K7mU999P+z90ObD7LuBZK0Xdkeq9NSX2+o4HLwfWlopFCC0fgciBMtAFC8CGrYXVoVjnU2G7rTXrzh4kfRzLY1kyGwBoeiGcPiXb5eAzdXWnazPCSScb4j3xfmav8Cx2p50lAMW0VXINitCogl2r9H2dcctWwQxQsn6ZTBbMNtcgdKIbiZj51VcBk38CXPxoQcfCUg8pjcYgZScw/momACnXyr4leBhs5QaBTHpf7X8dMPYJYO8XgAv9e8QJlAZZq8D4xSuANYKPJQn0AR2AHKy1MACKe9nfFI6IEqduEWoHIJ9wlsVKLekoMCa9EAegSTYQeM4TXco2SEMkAHEbBZoj4bbYtdyCVrFqGXgTSxgXYTZeHLi9AMjEQRCVUXP/n4KUaaT8vVTi+Rtg7GPAuYcAWlMCgUVkQfJ2Q12yBvPXMwHImhDWwf81imsTiLSEvHZkr+jY/p9CQRD4p8DOBwteItai05qn31FFdfLlFxYWgCDUIkRkj/TxbCEi/89jfPZ3X2VqYSJQbmUNQY3HQT7hbv2sLoerVwKQHNEEoCsm8R4MhPRjXUGzVEIKIoY7yaEYuY4dgGb5RXruoSgtSCLLarkICQ9f6QNykGjFdjsIBaI4kGlt8W+Rg5g0HJ8qAp47nihAzFpuWtPIMBZJlASILvR6fQ0DCVbJCkJOJCqnk4pGpb99tZ8MopyiKDX7WWDiwYKXiEQOehCrgKh+eJQ+EQHo1Lby/zRlyf8TIbf9XS5ftIb8I92YugH4ay2pLusorl7dAoonWtMwQSTdOFuQSLTGHyIC8kxSIQuA4hwU2WUAoO4/grBcDbsfWElSzg+JCoYDoEGM1ixSkHzgF/wG7y8sIa3J7JPAGWuFJSQIaU01iJHUiYP4e33BrPOHmG/JMaOfTZVYRhwGav87vWKPJ9/rSH4IOGO5sITqg/ggxXs4TOaBAECbeoOsgfl+DrQShFqcEIhyyt0MbMusEkx76iAZXKM8BvXiZAGlF+KaIbaadYpem4aDgpJZQz6YJABV5VcHAJZ0v4FxX6KG5UpYs0KnqjhRuagEVgPglYAl9ciHf8mdUrJh0Qx9vkDBzBywfbkYQIGwahA/kglATsHsDzKA0BATiPyZ4NEDwIeoa/uFYKKXL2f24nQoIgd9R3yQCMTFqwIAfdBWI7+yB5ZLECYLETd85YJl+2YAUNosLIel/xYlu4Jsl6bhNhD6it4WJCvA2Zc4Gxo73RcgJeOqFmGR6rcChLYACyGojmEYdj59KnZ+tIQRhH9IvWA2hiREjDeRI9Cly7fMF3EtWRFawhQIf5IJwE56wdTIYdt7tp9ys1K8JnoJvod9Wn682PNkP4hUy1ndWgstAtBDMLYN5/6PAc5DGNoF4SrZfN+4+IhT8jqwg2Cp8ThIJ5vfSWBXAVCrWN9SMxDK+skaOvhoAc8me654pmUB3f0wyt+E8FyRAGmPlOEoiSD2qgvmAKoOm52fAuiTDHSyIRxx+lI0QxxADubfF5vffMmSajrWlP7nmZ3dSy+4r/ZzAUEHnQ8R70HsXlK+PgJsW68G4XYGZj0EY2EYATCAT6tAhmE0DXcC4faapcwMgAIfLb0kuzT9Qmw5uwAAIABJREFUSi+EfeALkSrpBovbrQDnkm8wAo8/E3i+CCsZ98NCpAp8cUekZyBavI4ET/TnaAk/RQCyAXy6uNSPA0i+wMeB6ePA5HFgZq2wpNGK3FUDAHmv3fSCe7afX8CB4UNEEOolVi/3obastNwJ9cO5BOBKEQMsAcifHWzRAigWWAlCn5K2bQYAOe1KMjTIR2kRUhKVS7IrLia0v+3xwHMZMCbYNP0KfG79zAqK5DxOvyEuWu6VD5KSHy2YAEQAfpaRdl5UkuUctIpBnCIIl4psD03FtIIP1ADAlBuJM47EqqUX3LX9kSBQcuuyftK78xUkHyQ+RLqHZ3Fv1KcgLj5kAQ1s0Qo6IA1nHhNLQzA8ZxvBXuNx8DcS5UYpNnoYxsCnUIqvZo0F3wPTMa7Hv53HOJVbS/l+5bumX7d+5WLE44hxIRJB2NMCqj9ixwuE90svWCaIA6bAp959EKeWChAyA0PTOV2unGMQveCO7bfqHbcS4rJR7Ewqnw5AWhLuImg2uFQAXAVs8RGmntW4+g2hB3P79L/EJ9zGvqrxOPibiVihAOgrWQOf/EBfBcsPNBBqW9Hv6zzGqFzmoXz3B9AePgXiq6bgiv4YOB9QHS8AfpkAFMMjrWAcQA0iO9XJiQyAnos2vV7ESHOOQfWCO7Zf7F40mZFQScRKAYBaSU6vAVcTgN7xXHiUFpDTMK2dFh56912BTiDcvpkATIXzCL4g3WXTZ4jpGfjoF/oihL+fx+0yWUABLwIwtYKKIabgCzHQvi2ggBKn0McEQDaKT5cGkIOo6SuyYzEfjQB0EM5nZgAPoxe8of3sgSqCQM3jkdFLvpRvR13+7UVRuhUFSavNO6otwp88ZZ3+t4M6HLtch6OT9AG/q9cmtf//gV1JDYcnQ2zY6/YakfSrU+Pg1M45NqPt3IEtoM7WFHokyrWKkooglCMWLYjiUXMtK3g8Uzd1WL3gDe3vRRCoUEYCwGtYFxxqgA2E/jI20F5hhmQod98BHNnlxOTig1aGiDanO21yV4DygWuB8YeB6fnC9WEtiKVVKeE0ZGiXWczeJoWMIig5a9V5DA1ANoKDeDylZ9NSXxyAsiKawrQqmCv2HVf5e8aRoxfc1n7xs+khItAUvojvyWryxVcWJZksVSyZoQRA3dcAoHzax4Gj2wtu6FVKM7gMgti02jbV476oUJJs1j/AbA1mQ3Pm8eTRsoZDtR+xZKCiEKmMXTIeXHPGdhYArX8FwG4DGMEnAHIK4yvT58nWC2b73cexaZgWWaEKgU1gjNbPP7PvOYGsUSBkv3hBtmRWNzxjTk9RWktvxp6POj0vARjY9sWkFel8RWxegjIF4RjwAOnZWMPBTGjqvHmszxJOBUD3xyznL2bqROvoP3N3q84jG4C7M/PpcvMBef0cvV9k6hXv+2Yno5QfGArRbaCC0mWv2YtF3ecerNDhkNZIIsXQRv5dlTtGADJSz2gEE1EJQM//026HdIEZLC8B6A0tk0g1Ja8DuzJdphS82QBEZj5dbj7gxZN5er/IZI+67pscgE7QaDOUMyC0Wb8+gXjuR4F5J6YsaXnFhBoAGEVvUhb60jISgCQnoh/OLBgvIrL8v7DdFkEYM5dtNg97tvz5zJqzdfIBmJlPl5sP+DJP5xtW7xffnzeh7H+Z+3+RpkyWT1YxuURJYVtx6T0fCTocouQV85VkHRIGegEuEv/YKpkA/JceVmL8kv6t5/9pu62tfiPWcFQVEa0DZ9WcLJEPwMx8uvfnjT9IgZyj94t/ldeA/S9tMaGa9SNdmsIxbvVscVJ1GScoMt4UPwhAsmMZ0aXzQBsvdGRBjQz0FUpEJRAJQOq4KAnBdz+sfiPJ3bOYn8fsykyVWMfiN3BOzckS+QDMzKe7OW/88aqQzsfE5kH1fvGjeQ0wADodmVGwOeiMsUqHrGOnS4UFy9P/wAEojkEnI+IqOIJQNLgpCXhcmLAtD/D+kgQE235L93tj+YBqgTX9BiCeW/NedT4AmQ+YkU/3sbzxBymQuZhm8g1T+QbV+wWFdjKO/Te2mEFNlCb6gPF708VJ1TXHgKd91GnZpDfi1k/gM2vqU3DUnCuBmNQe3P9vw6pe229KOvB0K1k+ZS+rnrfM2AlA3JMZtah/EZKZT3drxuDz1O/yxAwu9JgJxr3lQfR+8aa8Buy/wdWQZAVl+ZzCrG3q9c/YrkmHy3IRYryAAqAkEBIlopJxNNUbER+fA/H+/+AAdP9PmS9dazicJybm7mlB8nR2dI1HvgVkOlZGPt2nM29GCamcGZjAwlQ+vvrV+8X/zGsAAUiLVPp/wd+zaTMFWw+/kAA0GQQnpCw5mDsAMIrcRB5mC/+MAffTwgfwKY2KfmCZ6ZIkUShrxXxBX4yYaV8Hzmcn13jUA8CMfDqWYeQcSkhVOl8U6uxH7xekrsg49h8oiCENgC5TUG5vKxxT8f2aRtOtcAKQ1s8soPuOVUIwpchNlEEIOyNSIrrvv3hwnckWIZPZsnbcDyzTpvg3lU8mpZQqozyfK74aj3wAKh1LgrsD5tMxiz/nkGD1sHq/YNFOxkEAcuW7oqmXlisuQOT7VV2jwi/kTgj1RkoZhBje8Z83SCAEEJZW0C3gff8tADCt4VASaWIBK0HI9q8BF5yUAMzIp8tNx5Jg9bB6v/jdDPSRns0BWIZeUitIo9IhHmhXTvzCPQddccnZ76U1V/IvC4SBCFyg26DFNg7c++Mhhb6qiCikT7WVUmr6lYn2nRKyrdZ51GMBlZIc07GUBdMjny6XCiUmpA6j94vMZbgBMFo552pu27PXAqXTyAUQcitOQjAm9xX0N9pIwIPmSCmH5QuPqER0L4kDYgp9zOUL6fYxkbZcFceyAreAF3GlV+NRDwAz8uksnT3jiILVSmpWNlhMze+k94vMZfgGAPJeHDjpCrgM01Tdry9OzvmYAzAqLVWIwEShwzbRwwSEn+MqP6bQK5tZlWyhjCCCsC19Xv7gOnBRbgp7cu/5AOyVjqVMmA75dJZ9nHF0yohWNlhMxKnS+0XmMtwAmFq4imnYbrEqNJPc+9kfd62RKh0On8qV9hXZ9askEPgAfI56ziocUgVbzGT28lEtRMoKtg7lBHtznfZNA+CQ+XQWM8k4uglWK/NLYKzS+8U9GReXD0g/Tyvh4Ne17Yb4Zbr6g6y7/aNWcoPpjKRTsJIags5IJwkEAv6en05S6GUBfRWsUExZyVZVQCQwrgN7Wfdd41GPBczIp8ODeXfTSbBa6YYxlY8/p3q/udc3C+jTbtvqt2oadnB2m4oNgMn0W0p+hYWHWbwg9yU/0Kb9EIy+5y2hiCit4UgKyTeAkN8Valk4Le/ldlONRz4AWWBRM6fdIPfHstw/G+SE5rMnVQ/kA5AkLHS0ak7V7reXfhgACaBqDtD3e/nmc5k9kA/A80JReq+U38zGVp3ObJo/BvAOD3dtwiWar9zEHsgHIGlFubqSx7+Jja36anLLcDvvgwA+NDpDfILv+qlzuXwAXuSjrkKemlO2e3U1uWUYnL8dwB/5e2apca9LNv+vsQfyAUheX4VguB+mzIsaG9ntqxhF4Xbe3QD+n7/uHLAW9wQ1tblMRQ/UA0CaHC7plXEh+q4T0OWcfhleYTSHBK0EH/mi+fcRuKQn4I6fWpeoB4AevCz3HOOm9yb3F5mBlZBNclYCj1aRfyfrbgPCTR6AzK+vD4CyglX7jpmN7HY66d1E0ctdIrEEE4wEIMlam+Pk7YF6AMj7EwAVbU82vTerCwhAXopJN9zVI+AYrOeULLZgErY2x8nZA/kAJGWr0naUWdFpy2cT+oCWjpdjLFxE5UzYIBBpEUX5nLnlvAktb76SPVAfAOUHpiAMm96bsVtCAMaKALICMyxDq6cXfycA+b/mOLl6oF4AiqBRIEzBp7/X2Af0+fi1XIioMIlAI+AIPIGPmeROWV3j1Zuvyu2B+gHoFfZiDS2lC0LiY52WUADkQoTTMH1BFSYRdHoRfKSu5v9qrizMHYPT+vx6ARhSuDcAzzmDo5ZGHT1PAKYMwQxME2jiSo/gEwBrrq+u41ZOy++oD4BaCcsXTPiSI3ey8s4KGoG8QwCMFM+0ggQhLR0BF19SXuD/ayakz7uR0/TsMcxg3SjfqWNA0hsrga/ojaq/8WPcC+YIk4Ke4CMSuB2XVht1Oj8zIfXlU8BtU8DhmYRXWdfrdF1fgr3+S8At48CD04DVjXQSDO70PTUnaJ5uOCwsIIFHSSFy1pKPWCDsZxCpw8UVgKSPxLXM937OzxxAljzcPAbcswU4Qh4V3UN8mKoeKm/bu78IfKJQa8VD48CylHQiL3O3/qg5Rf30BKACMtJXjXKQcfBSK8Dfqc3KVCwuN2VFGRnm/yKZtq4Re5ifyQQgM2A+BeB3GHaZBo5MAIue0l7Kt3cC4xhw+5eL7TuCkJk1jBtyerbUfYG5ExjZ/pqrxE5fAOrOq5SmowVIrRp1IyT2R6+fg0bgVYG4CsyZe2UsaiOGKXr4Sfp9k8CxCYAFSKyvXeY1o1BxQux91yMtfsHPutgnnyUuUvhc0ZsgUXib+nVkq6+ZKaABIHsgVZnuwD9sVo66rrR4ImdhLGSQ8zPL/JgBQxeU1ouWkO9PTgDzbgmXxrzMkatl3keivfG5x4r4IRcz5BfkO5vEZ0kgpIfBZ8yKjlL17syy0tMNcOn9dl4Fy6dLFabj1Mpvow9Ify+I4Nlo9Xt+ZqU9VdJpqZh4QDDyxUyYOYJwHDg+DhgI/WUVZl7aSEt93+GO9Ia2iuZKOfA7lhp9JpvAVy61w2mOwO5hmCgMHC1H9O24gu6UD9jP+ZmbtLRaSsei9SL4XDPbAEh/kGQ/pSUcc0lbApFWb67lQUhpVnLBsoKqqZclFMmUtrxPcwxl3X7vOCAtYLSCcugFQmqhdssH7HU+RznjiOlYXA8wqkOfkItTAom+oKygca4ES8jY+N3z7fSG4hfUtp3ihUHruVSsFy1iRvNP+1N7A5BdJACmVpAgZPhGOyCigEjlPLudn7kvFtOxuB4g6OjD8UWLRkCZFRwrLCEXJQQhp2K+37lQeBCRX1A7KPQto1prFEmSYn2mB9EAsO+kYfk8KQhZF8yjVz5gp/MztyOUjiW9bCUhEBhKRCCgSis45uQ/PhX/xfFWMgOnWu2gxB0TF/o0kEZ/kCDM1Ts+3RHYnwVUL6XhDFrAswfIB6w6P1MrTulY0sum1VICglKwCEACqvQFCUK3gHcsFQCM/ILayqP1k9JshVqrncMalOYYvgcGAyCvIwuod8YBJQmZpmGJeyRwkGw4n8jJOJQNw3idLFhMRNB0SgASTJyKoy/4ieXCeFfJBUeV2SoAclFyR0bbm1OHTUiN0/DTAwD7zQeM52dqj8VsGEkVE2jKetG7AEhQ0frJAv6RC0trC1skl+IWlNinGLbSaZg7Mc0xfA8MbgF1LQV1z08A2G8+oM7PVF9Ms2GUE0gQyp+Lwu2yagLgR9ZaYpkSypQ6a6Q2DCqzpkvietXIFdoZfuieGmcOD0DeP0HEbBhNwYPmA/L8zJQsATAKnguEqS+XTqkE4YfWWwCUFZTksYAYwZfIBeN9Tw0cjOwu8gDIZqsoSSvhEeQDiiGYFoyWiSDRypWgi69UP5sc5fIcquSCNeXqe2X9ZAHfM7Khe2pcOB+AT41+aO5iRD3QAHBEHd9ctuiBBoANEkbaAw0AR9r9zcUbADYYGGkPNAAcafc3F28A2GBgpD3QAHCk3d9cvAFgg4GR9kADwJF2f3PxBoANBkbaAw0AR9r9zcUbADYYGGkPNAAcafc3F28A2GBgpD3QAHCk3d9cfOxqYJ2au9RdPtdp/khoEOlglDYT39V1PzQFXLsMXAlgt9PCxJKPbufyf8/KHIPfBPAZABf79Xc5XQ0ZQ1Q7360NbxoHrlsDvs5ZRsgo0une06by6X1mZvtP99PNAp4F4LsBXA5gjw8EGTeqaGF4QhzQF80CX7cAvGIdeDYAfhdZ2sTKUcVrpE7nd31N5gj8e2dIo2osk7NZpMdK0Z19tv+bJ4F9K8D1ACj8yfNSikHeg+5Z969m57Y/8/ZP+dPLKZhP/rcA+AYAF7g1oRUhEMUzFMt6eSJfX78b2DkPfM0i8GIAX+uWlAMppreUUErn8p2gzTl+2flg/sDbTkvIOik+CP20//mzwAXzwDcCuNTPJeFXpEpM6QEjIHm/zTF8D7T5gATYNQCe69aAloRTGulfBESBSYNyxR5g/Bhw7hKwZwl4vk9LnM5JmsBzUyDGAX3B8G23Mz/g9BuUa/0IiutfMkj7zwKmngAuXSvOpUvAWYBtF4BTnspIj/O8zPaf7qdvWITw6eZA0JLQEhKEGgxZhUj/dz3NzSKwbR44exnYvVKcy+mM5Km0JhxInUtrGkmzCPicg3W5LMGkQiZZTm9xS9Z3+4m2o8C5c4X15pTKW2Lb+fCx7WLtjYxzqiql29Icw/dA5SqYf6RTTilg+lYCIXmICKQ4IK9wxfSJY8AZK8CuFWDnanEua9ZTAMsaCog3Dt92O/MvnRGBtGwkqKRmMEkqCaa+2k+0LQDTh4rP88UHj74kF1WaATo9QHQ7mmP4HugYhtEKj4PB6ZQ+FS0hQahpldPya1kXTOqNY8DscgG+HavAttUCvBxInitrkgL4lcO33c7spBdM3kAuSnq2nx9gQfAh4JyVwvrxwel2z3p4aMlzH6DM2z/lT+8aB+Q/OT4EEqckWQSBkGD6EQKQnDCLwBSnYgcf32fXioGUFawC4esyu7CXXnDP9tOCsyD4KLB1rmgvX7zfbu2WG/Jtme0/3U/vKxBNAMoi0KcjkATCN3HOEr3UAjDrwOP71rXixYEkeKMFlSX8ocwR6KUXTJ7AaNE2tF8WfA4Ye7Kw1mwvX/yZn+eKnvcrfzC6IK/ObP/pfnpfAGQnySoISBqUXyAASS1AK0JfagWYcRDOrAF66TxZQU7jBOEbM0egH71gcgXSFZAV54NQtj9YcNIpbONCyh8Ygi8CVospApDuB63g92W2/3Q/vW8AsqM4gLIKBBIH8bcJwMCNMX68BTqBb8s6sGWtsIA6jwDk662ZI9CvXjA5A6NVa2t/IAicnC/aGV+8T74IQPm/AmGuBc+8/VP+9IEAyLslAKMV/LgAyIUInfnjwPQqMOOgI/DstQ5Mr7UAqMF8V2YXDqoXXNl+EQQ6N9v29aKdesUpWJZbAPyPme0/3U8fGIDssDid/pUASCvCaXgJmFguAEfgEXT27gDkuwaUg/nbmSMwjF7whvbLhSDL5TwwvdRqo9oqHzACkCB8U2b7T/fThwIgO01T1IMCoAZxGRhbKoAXQUcQTjkI+a4B5e5FzjGsXvCG9gdqrLGFYrpVG/UuHzBOw2/LaXxzbh43DKeoJwlAHqLndSs4udoCoIBHQE45EPk3DuitmYOQoxdctp8+rFwIWsGFYiFFoLGNchcEQC6e+OJC5J2Z7T/dTx/aApYdJ37AyJK/DIwvFxYvWr0IwEn/H1Opco5sveDUhSAAF4HJpQJkWixp6k2n4IYfMGf0amDHev2I8+l4/UbvNw8Eozw72wJePOJ8und7EkKj9ztKGA1/7WwATo44n45pWI3e7/AAGPWZ2QBkYHCU+XTMfGGQmYIxjd7vqOE0+PXzATjifDrKtTZ6v4MP/MlyRj4AR5xPF+VaqZLJF1UzKdPV6P2eLDDr3I58AI44n07ZMARbo/d78gMubWE+AEecT8e9YOn2Uheu0fs9tUCYD8AR59MpG6bR+z21gKfW1gNAz4geRT5dTEZo9H5PPRDmAzBmRM8BJzqfLiYjSKKr0fs9dYBYDwBHmE9XtRfMsIz04aQZ1+j9npygrA+Akqs8wfl0BCCTWRq935MTYL1aVQ8Ao1zlAnAi8+kEQGZTNXq/vYb75Pt/fQAcUT5dBGCj93vyAaxXi+oDoFLyT3A+3Rcavd9eY3xS/z8fgCQX/LPR3SOzkon55jg1eyAfgD8M4NcAPD6aDmBtB1e4NMDNcer1QD4AbwbwxwDe4UvRE9wHZG1gNSXDLlwLNcep1QP5APxzzwj9IIAPnXhT5ORc5EYCA9HNcWr1QD4AmRH6FQBMTSZZH98ZmD5Bh5g1FopiNns1x6nTA/kAvAfAEwDudnI+EvQxPfkEzYfaCXRSBluQMB7YHKdGD+QDsBNBH/9+AkAobqTADGK7Inw1x8nfA/kA7EXQt8kgrGAGMfBxZ5Cv5ji5eyAfgL0I+r68uR0QmUFoBQU8vfNvzXHy9kA9AORoMw7CdGQCjoUZDwL4kv/+8OZ1gJhBIjGDgMh3vTavBc035/RAPgD7JegjODfhiMwgoqeJwNPPTaB6Ezq/hq+sB4AcXeXEP+ZhGVo9vRimIQD5v5oPAZCupgDI9wg8/qz/1Xz55usyeyAfgMMQ9GU2Op4eAchpOIJQQEz/VuPlm6/K7IH6AMjgGzdl6QtyX5jWjpQFevF3lq3xf6yhrOlIAUgQCojR8gmE+l9Nl2++JrMH6gEgR5UA5KYsc+AZmCbQCDi+IvgEQMob1XBEAHIajgBMLV+0kCdws6aGu3zqfkV9AGTwjftg3JRVVRAtHQEXX/wbAcoXP5d5CID8GoJKvqDAloKOoIz/y7x8c3pmD4zhaqwjRzCYyQg5gr2ZgsFTLweWr8XQgsXjbwLWrnNtMlKgNoLBmZAa7PTCAuYIBlMvlWQswwr2UlUw45jdDSx8HbD+Ctd+HVCwePKbgJV9aASDM8Yg59TWFDysYPBtmYK91IbNOHaPA/M7gUXKXA4hWDz79cA8+W0aweCMURj+1HYfcBjBYO54MMY3tGDv8I3nmWSHOzYOLJ0LLPGXAQWLz3oB8MQUsEa16kYwOG8whjh74yJkUMFgbsNlCfYO0epwissVY34bsHw2sEIRkAEEi/dcU0SP5qhF1ggG5w3GEGdXr4L5134Fg4kAjuDQgr1DtDqcUmZETwArZwAru4BVqsv0KVh8/o3F4v0QXZBGMDhvMIY4u3MYhv95Zh+Cu1xBcxuOU/HfeDIq5cv7FuwdotXhlCBXjOXZAnyrO4BV6in0IVh8wStLuWCsUAyvEQzOG5ABz+4eB+R/ewnu/kOP/3G/l4kJTERlljQtIot2e53/IwO2OPl4FLtcnCqAp9cahT56CBZf+LpSLhhz1N5qBIPzBmTAs/sLRHcTDKbiNHdBGGymOC/3hglEvgjAnoK9A7Y4+XgiV4zVWYDAs/etxaubYPFFP1QkLtCIP8neaASD8wZkwLP7AyC/tJNg8L/xLNBu+YBdBXsHbHEFAINcMVamgdWZAoRrfPdXm8KitLdmgYveWAq+2y7iMqfuRjA4b1AGOLt/APJLqwSD3+y5T1yI0AoSbAxMMzGV1o8/My2ro2DvAK2t+GgiV4zj4+3AIwDXtwBrVJeuECze+9aW4Dut4PxkIhYsdetGMDhvoDqcPRgA+SWp4O4veQ5Uv/mAGwR78+6rQq4Yq9PAOi2fA4/vBkKudKVU7VZw77uKvWFuZbtcMNb5v0YwOG9g+jx7cADyi6Pg7gccgIxlcA5TKhaD01yYKBmVFpBZMfx/m2Bvny3t8LGqoqTliZbVI+gMgHwnMAnCIFi897cLAAZ6QyzFzzSCwXkD1OPs4QDIL5XgLmk5JHk/SD5gKdibd38VcsVYGmuBTaAzEHLHgyCcaokB7/1IkUET5IKxwF5pBIPzBqbPs4cHIC/AaeqvPL9pmHxAE+zts6VdLCD/lcgVY3UyWD0Bj1ZwqgCggXA7sPfWAoAJvaEtZBrB4Lyx6efsPADyCtmCvf00s/NnOsgVY3m8BTRZPZuGBUACdArY+5lWDqGmYbIrLHEx0ggG5w1OH2fnA7CPizQfaXqgUw80AGywMdIeaAA40u5vLt4AsMHASHugAeBIu7+5eAPABgMj7YEGgCPt/ubiDQAbDIy0BxoAjrT7m4s3AGwwMNIeaAA40u5vLt4AsMHASHugAeBIu7+5eAPABgMj7YEGgCPt/ubiDQAbDIy0B8ZYNMbkX+ZekpuIiOQrPar+xs889HJg6jZg5jAwvVZ8B+ll9PlO5/Fc/o+ECjnHfi8zYfkvM5ulmp4qJXVqx5deD4zfAkw/CGxdAZgoHfuh131QkaI5hu8Bs4Ds8B0AWLnIRGCBsFfn87JffDMwdjOw5R5g8giwZa34jnQQUwDo99wBfJ4TM7COiNdlaj2rA/jeV/vfDeATAP4UGH8I2Lrc6gc+SHqY4oMZ74VSKM0xfA+UUzB/oBUUCKMl6zSQ/PsXqZD5KQC/A0w/DEwcAcYXgYnVwppwADuBkefnCim90FmBWXwnK87Uen53BI8sbuwqaz9p5UgnQhBS+ZN1zE8Ak0utviCwq8DI8/nx5hi+Bzb4gJzKZE1SEFZZgS9/2pWR/gTAJ4HJQ8DEMWB8ARhfBsaWCwDquwQKvvNgHXvOcYVbPFJPkw+dDxC/W1Y4tWDpw/Rlgo4lo1T4/KxTihDNpJwj3/UiMLXemprjffC7eWpzDN8DlYsQDiKtVxzEqoHkyX9HRizW+nIgaQnvAiaeBCbmC0s4tgSMu2rMePAR9X252jXklaTFU108K0MHav/nvJ6ZxVVk9OI7GR2IZoGQNc/HgbHgIwqILIVujuF7oOMqWFawCoRxkfEIB5CWgkREBCNf9wMTc8A4QciBWyoGz16rwNgaML5eWKpctYZL3N+TWLX0gvtuP0HHk2n16JDyxXmVhfU0qywbJbr5GSuXKxA/sV5Y9UYWdnjwyS3qKKgarWA69Wg6fjQOIK0HadnIjPVFB+AiME4AuiUkCFnESyCSkmAuU7Cjm15wX+2X2ifBRn9A8mKcW2UFjULVQcgVDl80u40SYh763FfvquhLCxitoBYUsoJfjXKttByMq9CKcHn4sPuCbgXNJwyWkECcz5Q376UX3LNncZyQAAADEklEQVT9fFgIJs6lBBwtn3Tt6FpIz4RWnuQxPh2XIGzm4CwQ9hWIFgBTK0gQHiIAJddKq0ELQh+KL1qUR4MvSEsoENIKrgALHNiMox+94K7tl9qnnMio8MSf6SNwGpYVjCDk/Ju7isq496fCqX0BkDeqlWwKwic1gAQSpzGREnFgREz01eALLvvq2Kfi45m6cf3qBXdsfxRbJMho8dimqOhEK8cXQRr9QVpvPoDNMXQP9A3ACELFxPh+jACkP0fLIKFCCRRqKuPUdqjlC9o07JZwKVNHeBC94DQcZO0XAAkmgotAk9QYrR9f/BvByYfMSATDVMzwTXMM3QMDAVAgVHCZ7/MaQK4QZUHiNCbBQlqUw74YCb7gcmYkelC9YFlwvVv7RRAorTuBkECU9asCID9/x9B935zYzyKkqpfiNHxcA0gLQgvBAaPVkCqm3h2AtC5m/RyEqzw/4xhGL3hD++MmslgqCbgUfLKAcRrmTlBzDN0DA1tAXUlWcDm1IOIIJAjlT/Fd05lbFQFwjdtgGcewesFt7Rc/Gx8iWjUCjGCT1YvWT1MwgUqrf3NG45tTbcu0aximWx9xENcEQHGbcYAEwtSXSqY0gnCdgeuMI0cvuGx/FUGgFhwEYrR80QckWN+X0fjm1DwAWv8RgJFilJZBznz0pQg+AZAAlVWh1GvGka0XzB0cCQi30aSGVa9AF62fLOB7MhrfnJoPwPER59Px+o3e76mL5Kwp2G57xPl0kxc3er+nLvyKtLmhfUC78RHn081ONnq/pzcAR5xPR9mRRu/31IVgvgUccT4dNaobvd/TGYAjzqejumqj93s6A3DE+XRUg2VSCjdaGr3fUw+I+VPwiPPpqJjO8J1Nw43e7ymHwHoAKMFd7QErAeEE5NNJMb3R+z3lsGcNzgfgiPPpomJ6o/d76oGwPgCOKJ8uKqY3er+nKwBHmE+noqRG7/fUA199U/AI8+kEwEbv93QHoEhZTnA+nYqSGr3fBoAtaiqBUImdm5hPJwA2er+nKwBHnE+X1gUzSbnR+z11wPj/AeCpPDD3t7rvAAAAAElFTkSuQmCC\";\r\n","import {\r\n\tColor,\r\n\tLinearFilter,\r\n\tNearestFilter,\r\n\tRGBAFormat,\r\n\tRGBFormat,\r\n\tTexture,\r\n\tWebGLRenderTarget\r\n} from \"three\";\r\n\r\nimport { ColorEdgesMaterial, SMAABlendMaterial, SMAAWeightsMaterial } from \"../materials\";\r\nimport { ClearPass } from \"./ClearPass.js\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\nimport searchImageDataURL from \"../materials/images/smaa/searchImageDataURL.js\";\r\nimport areaImageDataURL from \"../materials/images/smaa/areaImageDataURL.js\";\r\n\r\n/**\r\n * Subpixel Morphological Antialiasing (SMAA) v2.8.\r\n *\r\n * Preset: SMAA 1x Medium (with color edge detection).\r\n * https://github.com/iryoku/smaa/releases/tag/v2.8\r\n */\r\n\r\nexport class SMAAPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new SMAA pass.\r\n\t *\r\n\t * @param {Image} searchImage - The SMAA search image. Preload this image using the {@link searchImageDataURL}.\r\n\t * @param {Image} areaImage - The SMAA area image. Preload this image using the {@link areaImageDataURL}.\r\n\t */\r\n\r\n\tconstructor(searchImage, areaImage) {\r\n\r\n\t\tsuper(\"SMAAPass\");\r\n\r\n\t\t/**\r\n\t\t * A clear pass for the color edges buffer.\r\n\t\t *\r\n\t\t * @type {ClearPass}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.clearPass = new ClearPass({\r\n\t\t\tclearColor: new Color(0x000000),\r\n\t\t\tclearAlpha: 1.0\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * A render target for the color edge detection.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderTargetColorEdges = new WebGLRenderTarget(1, 1, {\r\n\t\t\tminFilter: LinearFilter,\r\n\t\t\tformat: RGBFormat,\r\n\t\t\tstencilBuffer: false,\r\n\t\t\tdepthBuffer: false\r\n\t\t});\r\n\r\n\t\tthis.renderTargetColorEdges.texture.name = \"SMAA.ColorEdges\";\r\n\t\tthis.renderTargetColorEdges.texture.generateMipmaps = false;\r\n\r\n\t\t/**\r\n\t\t * A render target for the SMAA weights.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderTargetWeights = this.renderTargetColorEdges.clone();\r\n\r\n\t\tthis.renderTargetWeights.texture.name = \"SMAA.Weights\";\r\n\t\tthis.renderTargetWeights.texture.format = RGBAFormat;\r\n\r\n\t\t/**\r\n\t\t * Color edge detection shader material.\r\n\t\t *\r\n\t\t * @type {ColorEdgesMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.colorEdgesMaterial = new ColorEdgesMaterial();\r\n\r\n\t\t/**\r\n\t\t * SMAA weights shader material.\r\n\t\t *\r\n\t\t * @type {SMAAWeightsMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.weightsMaterial = new SMAAWeightsMaterial();\r\n\r\n\t\tthis.weightsMaterial.uniforms.tDiffuse.value = this.renderTargetColorEdges.texture;\r\n\r\n\t\t/**\r\n\t\t * The SMAA search texture.\r\n\t\t *\r\n\t\t * @type {Texture}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.searchTexture = new Texture(searchImage);\r\n\r\n\t\tthis.searchTexture.name = \"SMAA.Search\";\r\n\t\tthis.searchTexture.magFilter = NearestFilter;\r\n\t\tthis.searchTexture.minFilter = NearestFilter;\r\n\t\tthis.searchTexture.format = RGBAFormat;\r\n\t\tthis.searchTexture.generateMipmaps = false;\r\n\t\tthis.searchTexture.needsUpdate = true;\r\n\t\tthis.searchTexture.flipY = false;\r\n\r\n\t\tthis.weightsMaterial.uniforms.tSearch.value = this.searchTexture;\r\n\r\n\t\t/**\r\n\t\t * The SMAA area texture.\r\n\t\t *\r\n\t\t * @type {Texture}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.areaTexture = new Texture(areaImage);\r\n\r\n\t\tthis.areaTexture.name = \"SMAA.Area\";\r\n\t\tthis.areaTexture.minFilter = LinearFilter;\r\n\t\tthis.areaTexture.format = RGBAFormat;\r\n\t\tthis.areaTexture.generateMipmaps = false;\r\n\t\tthis.areaTexture.needsUpdate = true;\r\n\t\tthis.areaTexture.flipY = false;\r\n\r\n\t\tthis.weightsMaterial.uniforms.tArea.value = this.areaTexture;\r\n\r\n\t\t/**\r\n\t\t * SMAA blend shader material.\r\n\t\t *\r\n\t\t * @type {SMAABlendMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.blendMaterial = new SMAABlendMaterial();\r\n\r\n\t\tthis.blendMaterial.uniforms.tWeights.value = this.renderTargetWeights.texture;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\t// Detect color edges.\r\n\t\tthis.material = this.colorEdgesMaterial;\r\n\t\tthis.colorEdgesMaterial.uniforms.tDiffuse.value = inputBuffer.texture;\r\n\t\tthis.clearPass.render(renderer, this.renderTargetColorEdges);\r\n\t\trenderer.render(this.scene, this.camera, this.renderTargetColorEdges);\r\n\r\n\t\t// Compute edge weights.\r\n\t\tthis.material = this.weightsMaterial;\r\n\t\trenderer.render(this.scene, this.camera, this.renderTargetWeights);\r\n\r\n\t\t// Apply the antialiasing filter to the colors.\r\n\t\tthis.material = this.blendMaterial;\r\n\t\tthis.blendMaterial.uniforms.tDiffuse.value = inputBuffer.texture;\r\n\r\n\t\trenderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the size of this pass.\r\n\t *\r\n\t * @param {Number} width - The width.\r\n\t * @param {Number} height - The height.\r\n\t */\r\n\r\n\tsetSize(width, height) {\r\n\r\n\t\tthis.renderTargetColorEdges.setSize(width, height);\r\n\t\tthis.renderTargetWeights.setSize(width, height);\r\n\r\n\t\tthis.colorEdgesMaterial.uniforms.texelSize.value.copy(\r\n\t\t\tthis.weightsMaterial.uniforms.texelSize.value.copy(\r\n\t\t\t\tthis.blendMaterial.uniforms.texelSize.value.set(\r\n\t\t\t\t\t1.0 / width, 1.0 / height)));\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The SMAA search image, encoded as a base64 data URL.\r\n\t *\r\n\t * Use this image data to create an Image instance and use it together with\r\n\t * the area image to create an SMAAPass.\r\n\t *\r\n\t * @type {String}\r\n\t * @example\r\n\t * const searchImage = new Image();\r\n\t * searchImage.addEventListener(\"load\", progress);\r\n\t * searchImage.src = SMAAPass.searchImageDataURL;\r\n\t */\r\n\r\n\tstatic get searchImageDataURL() {\r\n\r\n\t\treturn searchImageDataURL;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The SMAA area image, encoded as a base64 data URL.\r\n\t *\r\n\t * Use this image data to create an Image instance and use it together with\r\n\t * the search image to create an SMAAPass.\r\n\t *\r\n\t * @type {String}\r\n\t * @example\r\n\t * const areaImage = new Image();\r\n\t * areaImage.addEventListener(\"load\", progress);\r\n\t * areaImage.src = SMAAPass.areaImageDataURL;\r\n\t */\r\n\r\n\tstatic get areaImageDataURL() {\r\n\r\n\t\treturn areaImageDataURL;\r\n\r\n\t}\r\n\r\n}\r\n","import { CombineMaterial } from \"../materials\";\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * A pass that renders a given texture.\r\n */\r\n\r\nexport class TexturePass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new texture pass.\r\n\t *\r\n\t * @param {Texture} texture - The texture.\r\n\t * @param {Number} [opacity=1.0] - The texture opacity.\r\n\t * @param {Boolean} [screenMode=true] - Whether the screen blend mode should be used for combining the texture with the scene colors.\r\n\t */\r\n\r\n\tconstructor(texture, opacity = 1.0, screenMode = true) {\r\n\r\n\t\tsuper(\"TexturePass\");\r\n\r\n\t\tthis.material = new CombineMaterial(screenMode);\r\n\r\n\t\tthis.texture = texture;\r\n\t\tthis.opacitySource = opacity;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The texture.\r\n\t *\r\n\t * @type {Texture}\r\n\t */\r\n\r\n\tget texture() {\r\n\r\n\t\treturn this.material.uniforms.texture2.value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * @type {Texture}\r\n\t */\r\n\r\n\tset texture(value) {\r\n\r\n\t\tthis.material.uniforms.texture2.value = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The opacity of the input buffer.\r\n\t *\r\n\t * The destination color is the color from the image in the input buffer.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tget opacityDestination() {\r\n\r\n\t\treturn this.material.uniforms.opacity1.value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tset opacityDestination(value = 1.0) {\r\n\r\n\t\tthis.material.uniforms.opacity1.value = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The opacity of the texture.\r\n\t *\r\n\t * The source color is the color from the texture.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tget opacitySource() {\r\n\r\n\t\treturn this.material.uniforms.opacity2.value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tset opacitySource(value = 1.0) {\r\n\r\n\t\tthis.material.uniforms.opacity2.value = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tthis.material.uniforms.texture1.value = inputBuffer.texture;\r\n\t\trenderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);\r\n\r\n\t}\r\n\r\n}\r\n","import {\r\n\tLinearFilter,\r\n\tLinearMipMapLinearFilter,\r\n\tMeshBasicMaterial,\r\n\tRGBFormat,\r\n\tWebGLRenderTarget\r\n} from \"three\";\r\n\r\nimport {\r\n\tAdaptiveLuminosityMaterial,\r\n\tCopyMaterial,\r\n\tLuminosityMaterial,\r\n\tToneMappingMaterial\r\n} from \"../materials\";\r\n\r\nimport { Pass } from \"./Pass.js\";\r\n\r\n/**\r\n * A tone mapping pass that supports adaptive luminosity.\r\n *\r\n * If adaptivity is enabled, this pass generates a texture that represents the\r\n * luminosity of the current scene and adjusts it over time to simulate the\r\n * optic nerve responding to the amount of light it is receiving.\r\n *\r\n * Reference:\r\n * GDC2007 - Wolfgang Engel, Post-Processing Pipeline\r\n * http://perso.univ-lyon1.fr/jean-claude.iehl/Public/educ/GAMA/2007/gdc07/Post-Processing_Pipeline.pdf\r\n */\r\n\r\nexport class ToneMappingPass extends Pass {\r\n\r\n\t/**\r\n\t * Constructs a new tone mapping pass.\r\n\t *\r\n\t * @param {Object} [options] - The options.\r\n\t * @param {Boolean} [options.adaptive=true] - Whether the tone mapping should use an adaptive luminance map.\r\n\t * @param {Number} [options.resolution=256] - The render texture resolution.\r\n\t * @param {Number} [options.distinction=1.0] - A luminance distinction factor.\r\n\t */\r\n\r\n\tconstructor(options = {}) {\r\n\r\n\t\tsuper(\"ToneMappingPass\");\r\n\r\n\t\t/**\r\n\t\t * The render target for the current luminosity.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t * @todo Use RED format in WebGL 2.0.\r\n\t\t */\r\n\r\n\t\tthis.renderTargetLuminosity = new WebGLRenderTarget(1, 1, {\r\n\t\t\tminFilter: LinearMipMapLinearFilter,\r\n\t\t\tmagFilter: LinearFilter,\r\n\t\t\tformat: RGBFormat,\r\n\t\t\tstencilBuffer: false,\r\n\t\t\tdepthBuffer: false\r\n\t\t});\r\n\r\n\t\tthis.renderTargetLuminosity.texture.name = \"ToneMapping.Luminosity\";\r\n\r\n\t\t/**\r\n\t\t * The render target for adapted luminosity.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderTargetAdapted = this.renderTargetLuminosity.clone();\r\n\r\n\t\tthis.renderTargetAdapted.texture.name = \"ToneMapping.AdaptedLuminosity\";\r\n\t\tthis.renderTargetAdapted.texture.generateMipmaps = false;\r\n\t\tthis.renderTargetAdapted.texture.minFilter = LinearFilter;\r\n\r\n\t\t/**\r\n\t\t * A render target that holds a copy of the adapted limonosity.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.renderTargetPrevious = this.renderTargetAdapted.clone();\r\n\r\n\t\tthis.renderTargetPrevious.texture.name = \"ToneMapping.PreviousLuminosity\";\r\n\r\n\t\t/**\r\n\t\t * Copy shader material used for saving the luminance map.\r\n\t\t *\r\n\t\t * @type {CopyMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.copyMaterial = new CopyMaterial();\r\n\r\n\t\t/**\r\n\t\t * A luminosity shader material.\r\n\t\t *\r\n\t\t * @type {LuminosityMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.luminosityMaterial = new LuminosityMaterial();\r\n\r\n\t\tthis.luminosityMaterial.uniforms.distinction.value = (options.distinction !== undefined) ? options.distinction : 1.0;\r\n\r\n\t\t/**\r\n\t\t * An adaptive luminance shader material.\r\n\t\t *\r\n\t\t * @type {AdaptiveLuminosityMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.adaptiveLuminosityMaterial = new AdaptiveLuminosityMaterial();\r\n\r\n\t\tthis.resolution = options.resolution;\r\n\r\n\t\t/**\r\n\t\t * A tone mapping shader material.\r\n\t\t *\r\n\t\t * @type {ToneMappingMaterial}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.toneMappingMaterial = new ToneMappingMaterial();\r\n\r\n\t\tthis.adaptive = options.adaptive;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The resolution of the render targets.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tget resolution() {\r\n\r\n\t\treturn this.renderTargetLuminosity.width;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The resolution of the render targets. Must be a power of two for mipmaps.\r\n\t *\r\n\t * @type {Number}\r\n\t */\r\n\r\n\tset resolution(value = 256) {\r\n\r\n\t\t// Round the given value to the next power of two.\r\n\t\tconst exponent = Math.max(0, Math.ceil(Math.log2(value)));\r\n\t\tvalue = Math.pow(2, exponent);\r\n\r\n\t\tthis.renderTargetLuminosity.setSize(value, value);\r\n\t\tthis.renderTargetPrevious.setSize(value, value);\r\n\t\tthis.renderTargetAdapted.setSize(value, value);\r\n\r\n\t\tthis.adaptiveLuminosityMaterial.defines.MIP_LEVEL_1X1 = exponent.toFixed(1);\r\n\t\tthis.adaptiveLuminosityMaterial.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Whether this pass uses adaptive luminosity.\r\n\t *\r\n\t * @type {Boolean}\r\n\t * @default true\r\n\t */\r\n\r\n\tget adaptive() {\r\n\r\n\t\treturn (this.toneMappingMaterial.defines.ADAPTED_LUMINANCE !== undefined);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Whether this pass should use adaptive luminosity.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tset adaptive(value = true) {\r\n\r\n\t\tif(value) {\r\n\r\n\t\t\tthis.toneMappingMaterial.defines.ADAPTED_LUMINANCE = \"1\";\r\n\t\t\tthis.toneMappingMaterial.uniforms.luminanceMap.value = this.renderTargetAdapted.texture;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tdelete this.toneMappingMaterial.defines.ADAPTED_LUMINANCE;\r\n\t\t\tthis.toneMappingMaterial.uniforms.luminanceMap.value = null;\r\n\r\n\t\t}\r\n\r\n\t\tthis.toneMappingMaterial.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Indicates whether dithering is enabled.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tget dithering() {\r\n\r\n\t\treturn this.toneMappingMaterial.dithering;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * If enabled, the result will be dithered to remove banding artifacts.\r\n\t *\r\n\t * @type {Boolean}\r\n\t */\r\n\r\n\tset dithering(value) {\r\n\r\n\t\tif(this.dithering !== value) {\r\n\r\n\t\t\tthis.toneMappingMaterial.dithering = value;\r\n\t\t\tthis.toneMappingMaterial.needsUpdate = true;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders the effect.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\r\n\t * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\r\n\t * @param {Number} [delta] - The time between the last frame and the current one in seconds.\r\n\t * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\r\n\t */\r\n\r\n\trender(renderer, inputBuffer, outputBuffer, delta, stencilTest) {\r\n\r\n\t\tconst scene = this.scene;\r\n\t\tconst camera = this.camera;\r\n\r\n\t\tconst adaptiveLuminosityMaterial = this.adaptiveLuminosityMaterial;\r\n\t\tconst luminosityMaterial = this.luminosityMaterial;\r\n\t\tconst toneMappingMaterial = this.toneMappingMaterial;\r\n\t\tconst copyMaterial = this.copyMaterial;\r\n\r\n\t\tconst renderTargetPrevious = this.renderTargetPrevious;\r\n\t\tconst renderTargetLuminosity = this.renderTargetLuminosity;\r\n\t\tconst renderTargetAdapted = this.renderTargetAdapted;\r\n\r\n\t\tif(this.adaptive) {\r\n\r\n\t\t\t// Render the luminance of the current scene into a render target with mipmapping enabled.\r\n\t\t\tthis.material = luminosityMaterial;\r\n\t\t\tluminosityMaterial.uniforms.tDiffuse.value = inputBuffer.texture;\r\n\t\t\trenderer.render(scene, camera, renderTargetLuminosity);\r\n\r\n\t\t\t// Use the new luminance values, the previous luminance and the frame delta to adapt the luminance over time.\r\n\t\t\tthis.material = adaptiveLuminosityMaterial;\r\n\t\t\tadaptiveLuminosityMaterial.uniforms.delta.value = delta;\r\n\t\t\tadaptiveLuminosityMaterial.uniforms.tPreviousLum.value = renderTargetPrevious.texture;\r\n\t\t\tadaptiveLuminosityMaterial.uniforms.tCurrentLum.value = renderTargetLuminosity.texture;\r\n\t\t\trenderer.render(scene, camera, renderTargetAdapted);\r\n\r\n\t\t\t// Copy the new adapted luminance value so that it can be used by the next frame.\r\n\t\t\tthis.material = copyMaterial;\r\n\t\t\tcopyMaterial.uniforms.tDiffuse.value = renderTargetAdapted.texture;\r\n\t\t\trenderer.render(scene, camera, renderTargetPrevious);\r\n\r\n\t\t}\r\n\r\n\t\t// Apply the tone mapping to the colours.\r\n\t\tthis.material = toneMappingMaterial;\r\n\t\ttoneMappingMaterial.uniforms.tDiffuse.value = inputBuffer.texture;\r\n\r\n\t\trenderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Performs initialization tasks.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The renderer.\r\n\t * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\r\n\t */\r\n\r\n\tinitialize(renderer, alpha) {\r\n\r\n\t\tthis.material = new MeshBasicMaterial({ color: 0x7fffff });\r\n\t\trenderer.render(this.scene, this.camera, this.renderTargetPrevious);\r\n\t\tthis.material.dispose();\r\n\r\n\t}\r\n\r\n}\r\n","/**\r\n * A compilation of the post processing passes.\r\n *\r\n * @module postprocessing/passes\r\n */\r\n\r\nexport { BloomPass } from \"./BloomPass.js\";\r\nexport { BlurPass } from \"./BlurPass.js\";\r\nexport { BokehPass } from \"./BokehPass.js\";\r\nexport { ClearMaskPass } from \"./ClearMaskPass.js\";\r\nexport { ClearPass } from \"./ClearPass.js\";\r\nexport { DotScreenPass } from \"./DotScreenPass.js\";\r\nexport { FilmPass } from \"./FilmPass.js\";\r\nexport { GlitchMode, GlitchPass } from \"./GlitchPass.js\";\r\nexport { GodRaysPass } from \"./GodRaysPass.js\";\r\nexport { MaskPass } from \"./MaskPass.js\";\r\nexport { OutlinePass } from \"./OutlinePass.js\";\r\nexport { Pass } from \"./Pass.js\";\r\nexport { PixelationPass } from \"./PixelationPass.js\";\r\nexport { RealisticBokehPass } from \"./RealisticBokehPass.js\";\r\nexport { RenderPass } from \"./RenderPass.js\";\r\nexport { SavePass } from \"./SavePass.js\";\r\nexport { ShaderPass } from \"./ShaderPass.js\";\r\nexport { ShockWavePass } from \"./ShockWavePass.js\";\r\nexport { SMAAPass } from \"./SMAAPass.js\";\r\nexport { TexturePass } from \"./TexturePass.js\";\r\nexport { ToneMappingPass } from \"./ToneMappingPass.js\";\r\n","import {\r\n\tDepthStencilFormat,\r\n\tDepthTexture,\r\n\tLinearFilter,\r\n\tRGBAFormat,\r\n\tRGBFormat,\r\n\tUnsignedInt248Type,\r\n\tWebGLRenderTarget\r\n} from \"three\";\r\n\r\nimport { ClearMaskPass, MaskPass, ShaderPass } from \"../passes\";\r\nimport { CopyMaterial } from \"../materials\";\r\n\r\n/**\r\n * The EffectComposer may be used in place of a normal WebGLRenderer.\r\n *\r\n * The auto clear behaviour of the provided renderer will be disabled to prevent\r\n * unnecessary clear operations.\r\n *\r\n * It is common practice to use a {@link RenderPass} as the first pass to\r\n * automatically clear the screen and render the scene to a texture for further\r\n * processing.\r\n *\r\n * @implements {Resizable}\r\n * @implements {Disposable}\r\n */\r\n\r\nexport class EffectComposer {\r\n\r\n\t/**\r\n\t * Constructs a new effect composer.\r\n\t *\r\n\t * @param {WebGLRenderer} [renderer] - The renderer that should be used.\r\n\t * @param {Object} [options] - The options.\r\n\t * @param {Boolean} [options.depthBuffer=true] - Whether the main render targets should have a depth buffer.\r\n\t * @param {Boolean} [options.stencilBuffer=false] - Whether the main render targets should have a stencil buffer.\r\n\t * @param {Boolean} [options.depthTexture=false] - Set to true if one of your passes relies on a depth texture.\r\n\t */\r\n\r\n\tconstructor(renderer = null, options = {}) {\r\n\r\n\t\t/**\r\n\t\t * The renderer.\r\n\t\t *\r\n\t\t * You may replace the renderer at any time by using\r\n\t\t * {@link EffectComposer#replaceRenderer}.\r\n\t\t *\r\n\t\t * @type {WebGLRenderer}\r\n\t\t */\r\n\r\n\t\tthis.renderer = renderer;\r\n\r\n\t\t/**\r\n\t\t * The input buffer.\r\n\t\t *\r\n\t\t * Reading from and writing to the same render target should be avoided.\r\n\t\t * Therefore, two seperate yet identical buffers are used.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.inputBuffer = null;\r\n\r\n\t\t/**\r\n\t\t * The output buffer.\r\n\t\t *\r\n\t\t * @type {WebGLRenderTarget}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.outputBuffer = null;\r\n\r\n\t\tif(this.renderer !== null) {\r\n\r\n\t\t\tthis.renderer.autoClear = false;\r\n\r\n\t\t\tthis.inputBuffer = this.createBuffer(\r\n\t\t\t\t(options.depthBuffer !== undefined) ? options.depthBuffer : true,\r\n\t\t\t\t(options.stencilBuffer !== undefined) ? options.stencilBuffer : false,\r\n\t\t\t\t(options.depthTexture !== undefined) ? options.depthTexture : false\r\n\t\t\t);\r\n\r\n\t\t\tthis.outputBuffer = this.inputBuffer.clone();\r\n\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * A copy pass used for copying masked scenes.\r\n\t\t *\r\n\t\t * @type {ShaderPass}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.copyPass = new ShaderPass(new CopyMaterial());\r\n\r\n\t\t/**\r\n\t\t * The passes.\r\n\t\t *\r\n\t\t * @type {Pass[]}\r\n\t\t * @private\r\n\t\t */\r\n\r\n\t\tthis.passes = [];\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The depth texture of the input and output buffers.\r\n\t *\r\n\t * @type {DepthTexture}\r\n\t */\r\n\r\n\tget depthTexture() {\r\n\r\n\t\treturn this.inputBuffer.depthTexture;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * The input and output buffers share a single depth texture. Depth will be\r\n\t * written to this texture when something is rendered into one of the buffers\r\n\t * and the involved materials have depth write enabled.\r\n\t *\r\n\t * You may enable this mechanism during the instantiation of the composer or\r\n\t * by assigning a DepthTexture instance later on. You may also disable it by\r\n\t * assigning null.\r\n\t *\r\n\t * @type {DepthTexture}\r\n\t */\r\n\r\n\tset depthTexture(x) {\r\n\r\n\t\tthis.inputBuffer.depthTexture = x;\r\n\t\tthis.outputBuffer.depthTexture = x;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Replaces the current renderer with the given one. The DOM element of the\r\n\t * current renderer will automatically be removed from its parent node and the\r\n\t * DOM element of the new renderer will take its place.\r\n\t *\r\n\t * The auto clear mechanism of the provided renderer will be disabled.\r\n\t *\r\n\t * Switching between renderers allows you to dynamically enable or disable\r\n\t * antialiasing.\r\n\t *\r\n\t * @param {WebGLRenderer} renderer - The new renderer.\r\n\t * @return {WebGLRenderer} The old renderer.\r\n\t */\r\n\r\n\treplaceRenderer(renderer) {\r\n\r\n\t\tconst oldRenderer = this.renderer;\r\n\r\n\t\tlet parent, oldSize, newSize;\r\n\r\n\t\tif(oldRenderer !== null && oldRenderer !== renderer) {\r\n\r\n\t\t\tthis.renderer = renderer;\r\n\t\t\tthis.renderer.autoClear = false;\r\n\r\n\t\t\tparent = oldRenderer.domElement.parentNode;\r\n\t\t\toldSize = oldRenderer.getSize();\r\n\t\t\tnewSize = renderer.getSize();\r\n\r\n\t\t\tif(parent !== null) {\r\n\r\n\t\t\t\tparent.removeChild(oldRenderer.domElement);\r\n\t\t\t\tparent.appendChild(renderer.domElement);\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif(oldSize.width !== newSize.width || oldSize.height !== newSize.height) {\r\n\r\n\t\t\t\tthis.setSize();\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn oldRenderer;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Creates a new render target by replicating the renderer's canvas.\r\n\t *\r\n\t * The created render target uses a linear filter for texel minification and\r\n\t * magnification. Its render texture format depends on whether the renderer\r\n\t * uses the alpha channel. Mipmaps are disabled.\r\n\t *\r\n\t * @param {Boolean} depthBuffer - Whether the render target should have a depth buffer.\r\n\t * @param {Boolean} stencilBuffer - Whether the render target should have a stencil buffer.\r\n\t * @param {Boolean} depthTexture - Whether the render target should have a depth texture.\r\n\t * @return {WebGLRenderTarget} A new render target that equals the renderer's canvas.\r\n\t */\r\n\r\n\tcreateBuffer(depthBuffer, stencilBuffer, depthTexture) {\r\n\r\n\t\tconst drawingBufferSize = this.renderer.getDrawingBufferSize();\r\n\t\tconst alpha = this.renderer.context.getContextAttributes().alpha;\r\n\r\n\t\tconst renderTarget = new WebGLRenderTarget(drawingBufferSize.width, drawingBufferSize.height, {\r\n\t\t\tminFilter: LinearFilter,\r\n\t\t\tmagFilter: LinearFilter,\r\n\t\t\tformat: alpha ? RGBAFormat : RGBFormat,\r\n\t\t\tdepthBuffer: depthBuffer,\r\n\t\t\tstencilBuffer: stencilBuffer,\r\n\t\t\tdepthTexture: depthTexture ? new DepthTexture() : null\r\n\t\t});\r\n\r\n\t\tif(depthTexture && stencilBuffer) {\r\n\r\n\t\t\trenderTarget.depthTexture.format = DepthStencilFormat;\r\n\t\t\trenderTarget.depthTexture.type = UnsignedInt248Type;\r\n\r\n\t\t}\r\n\r\n\t\trenderTarget.texture.name = \"EffectComposer.Buffer\";\r\n\t\trenderTarget.texture.generateMipmaps = false;\r\n\r\n\t\treturn renderTarget;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Adds a pass, optionally at a specific index.\r\n\t *\r\n\t * @param {Pass} pass - A new pass.\r\n\t * @param {Number} [index] - An index at which the pass should be inserted.\r\n\t */\r\n\r\n\taddPass(pass, index) {\r\n\r\n\t\tconst renderer = this.renderer;\r\n\t\tconst drawingBufferSize = renderer.getDrawingBufferSize();\r\n\r\n\t\tpass.setSize(drawingBufferSize.width, drawingBufferSize.height);\r\n\t\tpass.initialize(renderer, renderer.context.getContextAttributes().alpha);\r\n\r\n\t\tif(index !== undefined) {\r\n\r\n\t\t\tthis.passes.splice(index, 0, pass);\r\n\r\n\t\t} else {\r\n\r\n\t\t\tthis.passes.push(pass);\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Removes a pass.\r\n\t *\r\n\t * @param {Pass} pass - The pass.\r\n\t */\r\n\r\n\tremovePass(pass) {\r\n\r\n\t\tthis.passes.splice(this.passes.indexOf(pass), 1);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Renders all enabled passes in the order in which they were added.\r\n\t *\r\n\t * @param {Number} delta - The time between the last frame and the current one in seconds.\r\n\t */\r\n\r\n\trender(delta) {\r\n\r\n\t\tconst passes = this.passes;\r\n\t\tconst copyPass = this.copyPass;\r\n\t\tconst renderer = this.renderer;\r\n\r\n\t\tlet inputBuffer = this.inputBuffer;\r\n\t\tlet outputBuffer = this.outputBuffer;\r\n\r\n\t\tlet stencilTest = false;\r\n\t\tlet pass, context, state, buffer;\r\n\t\tlet i, l;\r\n\r\n\t\tfor(i = 0, l = passes.length; i < l; ++i) {\r\n\r\n\t\t\tpass = passes[i];\r\n\r\n\t\t\tif(pass.enabled) {\r\n\r\n\t\t\t\tpass.render(renderer, inputBuffer, outputBuffer, delta, stencilTest);\r\n\r\n\t\t\t\tif(pass.needsSwap) {\r\n\r\n\t\t\t\t\tif(stencilTest) {\r\n\r\n\t\t\t\t\t\tcopyPass.renderToScreen = pass.renderToScreen;\r\n\r\n\t\t\t\t\t\tcontext = renderer.context;\r\n\t\t\t\t\t\tstate = renderer.state;\r\n\r\n\t\t\t\t\t\t// Preserve the unaffected pixels.\r\n\t\t\t\t\t\tstate.buffers.stencil.setFunc(context.NOTEQUAL, 1, 0xffffffff);\r\n\t\t\t\t\t\tcopyPass.render(renderer, inputBuffer, outputBuffer, delta, stencilTest);\r\n\t\t\t\t\t\tstate.buffers.stencil.setFunc(context.EQUAL, 1, 0xffffffff);\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tbuffer = inputBuffer;\r\n\t\t\t\t\tinputBuffer = outputBuffer;\r\n\t\t\t\t\toutputBuffer = buffer;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif(pass instanceof MaskPass) {\r\n\r\n\t\t\t\t\tstencilTest = true;\r\n\r\n\t\t\t\t} else if(pass instanceof ClearMaskPass) {\r\n\r\n\t\t\t\t\tstencilTest = false;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the size of the buffers and the renderer's output canvas.\r\n\t *\r\n\t * Every pass will be informed of the new size. It's up to each pass how that\r\n\t * information is used.\r\n\t *\r\n\t * If no width or height is specified, the render targets and passes will be\r\n\t * updated with the current size of the renderer.\r\n\t *\r\n\t * @param {Number} [width] - The width.\r\n\t * @param {Number} [height] - The height.\r\n\t */\r\n\r\n\tsetSize(width, height) {\r\n\r\n\t\tconst passes = this.passes;\r\n\t\tconst renderer = this.renderer;\r\n\r\n\t\tlet size, drawingBufferSize;\r\n\t\tlet i, l;\r\n\r\n\t\tif(width === undefined || height === undefined) {\r\n\r\n\t\t\tsize = renderer.getSize();\r\n\t\t\twidth = size.width;\r\n\t\t\theight = size.height;\r\n\r\n\t\t}\r\n\r\n\t\t// Update the logical render size.\r\n\t\trenderer.setSize(width, height);\r\n\r\n\t\t// The drawing buffer size takes the device pixel ratio into account.\r\n\t\tdrawingBufferSize = renderer.getDrawingBufferSize();\r\n\r\n\t\tthis.inputBuffer.setSize(drawingBufferSize.width, drawingBufferSize.height);\r\n\t\tthis.outputBuffer.setSize(drawingBufferSize.width, drawingBufferSize.height);\r\n\r\n\t\tfor(i = 0, l = passes.length; i < l; ++i) {\r\n\r\n\t\t\tpasses[i].setSize(drawingBufferSize.width, drawingBufferSize.height);\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Resets this composer by deleting all passes and creating new buffers.\r\n\t */\r\n\r\n\treset() {\r\n\r\n\t\tconst renderTarget = this.createBuffer(\r\n\t\t\tthis.inputBuffer.depthBuffer,\r\n\t\t\tthis.inputBuffer.stencilBuffer,\r\n\t\t\t(this.inputBuffer.depthTexture !== null)\r\n\t\t);\r\n\r\n\t\tthis.dispose();\r\n\r\n\t\t// Reanimate.\r\n\t\tthis.inputBuffer = renderTarget;\r\n\t\tthis.outputBuffer = renderTarget.clone();\r\n\t\tthis.copyPass = new ShaderPass(new CopyMaterial());\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Destroys this composer and all passes.\r\n\t *\r\n\t * This method deallocates all disposable objects created by the passes. It\r\n\t * also deletes the main frame buffers of this composer.\r\n\t */\r\n\r\n\tdispose() {\r\n\r\n\t\tconst passes = this.passes;\r\n\r\n\t\tlet i, l;\r\n\r\n\t\tfor(i = 0, l = passes.length; i < l; ++i) {\r\n\r\n\t\t\tpasses[i].dispose();\r\n\r\n\t\t}\r\n\r\n\t\tthis.passes = [];\r\n\r\n\t\tif(this.inputBuffer !== null) {\r\n\r\n\t\t\tthis.inputBuffer.dispose();\r\n\t\t\tthis.inputBuffer = null;\r\n\r\n\t\t}\r\n\r\n\t\tif(this.outputBuffer !== null) {\r\n\r\n\t\t\tthis.outputBuffer.dispose();\r\n\t\t\tthis.outputBuffer = null;\r\n\r\n\t\t}\r\n\r\n\t\tthis.copyPass.dispose();\r\n\r\n\t}\r\n\r\n}\r\n","import {EffectComposer} from 'postprocessing/src/core/EffectComposer';\nimport {RenderPass} from 'postprocessing/src/passes/RenderPass';\nimport {ShaderPass} from 'postprocessing/src/passes/ShaderPass';\n\nimport {Loop} from '../../core/Loop';\n\nconst polyfill = (object, method, showWarn = true) => {\n if (object[method]) return;\n if (showWarn) console.warn(`@PostProcessorModule: pass.${method}() was not found.`, object);\n object[method] = () => {};\n};\n\n/**\n * @class PostProcessorModule\n * @category modules/app\n * @param {Object} [params]\n * @memberof module:modules/app\n * @example Creating a rendering module and passing it to App's modules\n * new App([\n * new ElementModule(),\n * new SceneModule(),\n * new DefineModule('camera', new WHS.PerspectiveCamera({\n * position: new THREE.Vector3(0, 6, 18),\n * far: 10000\n * })),\n * new RenderingModule(),\n * new PostProcessorModule()\n * ]);\n *\n * const processor = app.use('postprocessor');\n *\n * processor\n * .render()\n * .pass(new GlitchPass())\n * .renderToScreen()\n */\nexport class PostProcessorModule {\n currentPass = null;\n\n defer = new Promise(resolve => {\n this.resolve = resolve;\n });\n\n static defaults = {\n debug: true\n };\n\n constructor(params = PostProcessorModule.defaults) {\n this.debug = params.debug;\n this.params = params;\n }\n\n manager(manager) {\n manager.define('postprocessor');\n\n this.effects = manager.use('rendering').effects;\n this.renderer = manager.get('renderer');\n this.scene = manager.get('scene');\n this.camera = manager.get('camera');\n\n this.composer = new EffectComposer(this.renderer, this.params);\n\n manager.use('rendering').stop();\n\n const composer = this.composer;\n this.renderLoop = new Loop(clock => composer.render(clock.getDelta())).start(manager.handler);\n\n manager.update({\n renderer: renderer => {\n this.composer.replaceRenderer(renderer);\n },\n\n scene: scene => {\n this.scene = scene;\n },\n\n camera: camera => {\n this.camera = camera;\n }\n });\n\n this.resolve();\n }\n\n /**\n * @method render\n * @description Adds RenderPass\n * @return {this}\n * @memberof module:modules/app.PostProcessorModule\n */\n render() {\n this.defer.then(() => {\n const pass = new RenderPass(this.scene, this.camera.native);\n\n // TODO: Support for effects.\n\n this.composer.addPass(pass);\n this.currentPass = pass;\n });\n\n return this;\n }\n\n /**\n * @method pass\n * @description Adds your custom pass\n * @param {Pass} pass A custom pass\n * @return {this}\n * @memberof module:modules/app.PostProcessorModule\n */\n pass(pass) {\n this.defer.then(() => {\n polyfill(pass, 'setSize', this.debug);\n polyfill(pass, 'initialise', this.debug);\n\n this.composer.addPass(pass);\n this.currentPass = pass;\n });\n\n return this;\n }\n\n /**\n * @method shader\n * @description Adds a pass made from shader material\n * @param {Material} material A ShaderMaterial\n * @param {String} textureID Name of the readBuffer uniform\n * @return {this}\n * @memberof module:modules/app.PostProcessorModule\n */\n shader(material, textureID = 'readBuffer') {\n this.defer.then(() => {\n if (!material.uniforms[textureID])\n material.uniforms[textureID] = {value: null};\n\n const pass = new ShaderPass(material, textureID);\n\n this.composer.addPass(pass);\n this.currentPass = pass;\n });\n\n return this;\n }\n\n /**\n * @method get\n * @description Returns a pass by the given name\n * @param {String} name The name of the pass\n * @return {this}\n * @memberof module:modules/app.PostProcessorModule\n */\n get(name) {\n return name\n ? this.composer.passes.filter(pass => pass.name === name)[0]\n : this.currentPass;\n }\n\n /**\n * @method renderToScreen\n * @description Sets the renderToScreen property of currentPass\n * @param {String} [name=true] The name of the pass\n * @return {this}\n * @memberof module:modules/app.PostProcessorModule\n */\n renderToScreen(bool = true) {\n this.defer.then(() => {\n this.currentPass.renderToScreen = bool;\n });\n\n return this;\n }\n}\n","/**\n * @class EventsPatchModule\n * @description This one is used in the core to handle events used by modules. If you want to make custom events - please make a similar one.\n * @category modules/app\n * @memberof module:modules/app\n */\nexport class EventsPatchModule {\n manager(manager) {\n manager.define('events');\n this.element = manager.get('renderer').domElement;\n }\n\n /**\n * @function patchEvents\n * @description This methods patches the list of events on specific object.\n * @param {Number} originObject - The object that gives events.\n * @param {Number} [destObject=this] - The object that takes events.\n * @param {Array[Strings]} [events=[]] - The list of events by names.\n * @memberof module:modules/app.EventsPatchModule\n */\n patchEvents(originObject, destObject = this, events = []) {\n events.forEach(event =>\n originObject.addEventListener(event, e => destObject.emit(event, e))\n );\n }\n\n integrate(self) {\n const {element, patchEvents} = self;\n\n patchEvents(element, this, [\n 'mousemove',\n 'mouseup',\n 'contextmenu',\n 'mousedown',\n 'click',\n 'wheel',\n 'touchstart',\n 'touchend',\n 'touchmove',\n 'keydown',\n 'keyup',\n 'keypress'\n ]);\n }\n}\n","import {\n Vector2,\n Raycaster,\n Plane,\n Vector3\n} from 'three';\n\nimport Events from 'minivents';\nimport {EventsPatchModule} from './EventsPatchModule';\n\n/**\n * @class VirtualMouseModule\n * @category modules/app\n * @param {Boolean} [globalMovement=false]\n * @memberof module:modules/app\n * @extends Events\n */\nexport class VirtualMouseModule extends Events {\n mouse = new Vector2();\n raycaster = new Raycaster();\n world = null;\n canvas = null;\n projectionPlane = new Plane(new Vector3(0, 0, 1), 0);\n\n constructor(globalMovement = false) {\n super();\n this.globalMovement = globalMovement;\n }\n\n update(e, customX, customY) {\n const rect = this.canvas.getBoundingClientRect();\n\n const x = customX || e.clientX;\n const y = customY || e.clientY;\n\n this.mouse.x = ((x - rect.left) / (rect.right - rect.left)) * 2 - 1;\n this.mouse.y = -((y - rect.top) / (rect.bottom - rect.top)) * 2 + 1;\n\n this.projectionPlane.normal.copy(this.camera.getWorldDirection());\n\n this.raycaster.setFromCamera(this.mouse, this.camera);\n this.emit('move');\n }\n\n manager(manager) {\n manager.define('mouse');\n manager.require('events', () => new EventsPatchModule());\n\n this.canvas = manager.get('renderer').domElement;\n this.camera = manager.get('camera').native;\n }\n\n integrate(self) {\n [\n 'click',\n 'mousedown',\n 'mouseup',\n 'mousemove'\n ].forEach(ev => this.on(ev, e => self.emit(ev, e)));\n\n self.globalX = 0;\n self.globalY = 0;\n\n this.on('mousemove', e => {\n if (document.pointerLockElement !== null) {\n self.globalX += e.movementX;\n self.globalY += e.movementY;\n\n self.update(e, self.globalX, self.globalY);\n } else self.update(e);\n });\n }\n\n /**\n * @method track\n * @description Starts tracking events on a component\n * @param {Component} component A component, that should be tracked by the mouse\n * @param {Boolean} nested Whether component's children should be tracked or not\n * @memberof module:modules/app.VirtualMouseModule\n */\n track(component, nested = true) {\n let isHovered = false;\n\n this.on('move', () => {\n if (this.hovers(component, nested)) {\n if (isHovered) component.emit('mousemove');\n else {\n component.emit('mouseover');\n isHovered = true;\n }\n } else if (isHovered) {\n component.emit('mouseout');\n isHovered = false;\n }\n });\n\n this.on('click', () => {\n if (isHovered) component.emit('click');\n else component.emit('offClick');\n });\n\n this.on('mousedown', () => {\n if (isHovered) component.emit('mousedown');\n });\n\n this.on('mouseup', () => {\n if (isHovered) component.emit('mouseup');\n });\n }\n\n /**\n * @method intersection\n * @description Returns an intersection data\n * @param {Component} component A component that intersects with mouse ray (or doesn't)\n * @param {Boolean} nested Whether component's children should be tracked or not\n * @return {Array} intersection data.\n * @memberof module:modules/app.VirtualMouseModule\n */\n intersection({native}, nested = true) {\n if (native.children.length > 0 && nested) {\n const objects = [];\n native.traverse(child => objects.push(child));\n\n return this.raycaster.intersectObjects(objects);\n }\n\n return this.raycaster.intersectObject(native);\n }\n\n /**\n * @method project\n * @description Returns a vector based on mouse ray intersection with plane\n * @param {THREE.Plane} [plane=this.projectionPlane] Math plane that is used\n * @param {Vector3} [target] Optional target\n * @return {Vector3} An intersection point.\n * @memberof module:modules/app.VirtualMouseModule\n */\n project(plane = this.projectionPlane, target) {\n return this.raycaster.ray.intersectPlane(plane, target);\n }\n\n /**\n * @method hovers\n * @description Returns a boolean based on intersection data (Whether mouse hovers the component)\n * @param {Component} component A component that intersects with mouse ray (or doesn't)\n * @param {Boolean} nested Whether component's children should be tracked or not\n * @return {Boolean} Whether the component is hovered.\n * @memberof module:modules/app.VirtualMouseModule\n */\n hovers(component, nested = true) {\n return this.intersection(component, nested).length > 0;\n }\n\n /**\n * Mouse ray\n * @member {THREE.Ray} module:modules/app.VirtualMouseModule#ray\n * @public\n */\n get ray() {\n return this.raycaster.ray;\n }\n\n /**\n * Mouse x [-1; 1]\n * @member {Number} module:modules/app.VirtualMouseModule#x\n * @public\n */\n get x() {\n return this.mouse.x;\n }\n\n /**\n * Mouse y [-1; 1]\n * @member {Number} module:modules/app.VirtualMouseModule#y\n * @public\n */\n get y() {\n return this.mouse.y;\n }\n}\n","import {Loop} from '../../core/Loop';\nimport {EventsPatchModule} from './EventsPatchModule';\n\n/**\n * @class ControlsModule\n * @category modules/app\n * @param {Object} [params]\n * @memberof module:modules/app\n * @example Creating a rendering module and passing it to App's modules\n * new App([\n * new ElementModule(),\n * new SceneModule(),\n * new DefineModule('camera', new WHS.PerspectiveCamera({\n * position: new THREE.Vector3(0, 6, 18),\n * far: 10000\n * })),\n * new RenderingModule(),\n * new ControlsModule.from(new THREE.TrackballControls())\n * ]);\n */\nexport class ControlsModule {\n static from(controls) {\n return new ControlsModule({controls});\n }\n\n constructor(params = {}) {\n this.params = Object.assign({\n controls: false,\n fix: controls => controls,\n\n update(c) {\n this.controls.update(c.getDelta());\n }\n }, params);\n\n this.controls = this.params.controls;\n this.update = this.params.update;\n }\n\n manager(manager) {\n manager.define('controls');\n manager.require('events', () => new EventsPatchModule());\n }\n\n /**\n * @method setControls\n * @description Set working controls\n * @param {Object} controls Working three.js controls object.\n * @return {this}\n * @memberof module:modules/app.ControlsModule\n */\n setControls(controls) {\n this.controls = controls;\n return this;\n }\n\n /**\n * @method setUpdate\n * @description Set controls update function\n * @param {Function} update Update function\n * @return {this}\n * @memberof module:modules/app.ControlsModule\n */\n setUpdate(update) {\n this.update = update;\n return this;\n }\n\n integrate(self) {\n self.updateLoop = new Loop(self.update.bind(self));\n self.updateLoop.start(this);\n }\n}\n","import {\n FogExp2,\n Fog\n} from 'three';\n\n/**\n * @class FogModule\n * @category modules/app\n * @param {Object} [params={color: 0xefd1b5, density: 0.020, near: 10, far: 1000}] - The parameters object.\n * @param {String} [type=exp2] - The type of fog - exp2 or linear\n * @memberof module:modules/app\n * @example How to create and apply a FogModule\n * const fogModule = new FogModule({\n * color: 0xffffff,\n * density: 0.03,\n * near: 20,\n * far: 200\n * }, 'exp2');\n *\n * new App([\n * ...,\n * fogModule\n * ]);\n */\nexport class FogModule {\n constructor(params = {}, type) {\n this.params = Object.assign({\n color: 0xefd1b5,\n density: 0.020,\n near: 10,\n far: 1000\n }, params);\n if (!type || type === 'exp2') this.fog = new FogExp2(this.params.color, this.params.density);\n else if (type === 'linear') this.fog = new Fog(this.params.color, this.params.near, this.params.far);\n }\n\n manager(manager) {\n manager.set('fog', this.fog);\n manager.get('scene').fog = this.fog;\n }\n}\n","import {createStore} from 'redux';\n\nconst isEqualDefault = (a, b) => {\n if (a === b) return true;\n else if (a && a.equals && a.equals(b)) return true;\n\n return false;\n};\n\n/**\n * @class StateModule\n * @description `StateModule` is useful for apps, where you need state manipulation.\n * This can be: _transitions between screens, games, development moments_.\n * You can check [basic/state](https://whs-dev.surge.sh/examples/?basic/state) example.\n * @category modules/app\n * @param {Object} [params]\n * @memberof module:modules/app\n * @example Creating a state module\n * new App([\n * // ...\n * new StateModule().default({\n * sphereColor: 0xff0000\n * })\n * ]);\n */\nexport class StateModule {\n static actionGenerate(isEqual) {\n return (state = [{}, ''], {key, data}) => {\n if (isEqual(state[0][key], data)) return state;\n\n state[0][key] = data;\n state[1] = key;\n\n return state;\n };\n }\n\n constructor(equalCheck = isEqualDefault) {\n this.store = createStore(\n StateModule.actionGenerate(equalCheck)\n );\n\n this.configuration = {};\n this.currentConfig = 'default';\n this.prevConfig = 'default';\n }\n\n /**\n * @method default\n * @description Add default configuration.\n * @param {Object} data Configuration setup\n * @memberof module:modules/app.StateModule\n * @example\n * new WHS.StateModule().default({\n * sphereColor: UTILS.$colors.mesh,\n * planeColor: 0x447F8B\n * })\n */\n default(data) {\n this.config({default: data});\n return this;\n }\n\n /**\n * @method setEqualCheck\n * @description Sets an equalCheck function\n * @param {Function} func function to generate equal check\n * @memberof module:modules/app.StateModule\n */\n setEqualCheck(func) {\n this.store.replaceReducer(\n StateModule.actionGenerate(func)\n );\n }\n\n manager(manager) {\n manager.define('state');\n }\n\n /**\n * @method config\n * @description Load configurations from object.\n * @param {Object} configs Configuration data\n * @memberof module:modules/app.StateModule\n * @example Adding `green` configuration\n * state.config({\n * green: {\n * sphereColor: 0x00ff00,\n * planeColor: 0x00ff00\n * }\n * });\n */\n config(configs) {\n for (const key in configs) {\n if (key) {\n this.configuration[key] = key === 'default'\n ? configs[key]\n : Object.assign({}, this.configuration.default, configs[key]);\n }\n }\n }\n\n /**\n * @method update\n * @description Load updates from object.\n * @param {Object} updates Updates data\n * @memberof module:modules/app.StateModule\n * @example Update callback for `sphereColor`\n * state.update({\n * sphereColor: color => sphere.material.color.setHex(color)\n * });\n */\n update(updates = {}) {\n this.store.subscribe(() => {\n const [data, changedKey] = this.store.getState();\n const callback = updates[changedKey];\n\n if (callback) callback(data[changedKey]);\n });\n }\n\n /**\n * @method to\n * @description Switch to configuration.\n * @param {String} configName Configuration name.\n * @memberof module:modules/app.StateModule\n * @example Changes configuration to `green`\n * state.to('green');\n */\n to(configName) {\n this.prevConfig = this.currentConfig;\n this.currentConfig = configName;\n\n const config = this.configuration[configName]\n ? this.configuration[configName]\n : this.configuration.default;\n\n this.set(config);\n }\n\n /**\n * @method set\n * @description Set current parameters.\n * @param {Object} data Configuration parameters.\n * @memberof module:modules/app.StateModule\n * @example\n * state.set({\n * sphereColor: 0x00ff00\n * });\n */\n set(data) {\n for (const key in data)\n if (key) this.store.dispatch({type: 'ADD', key, data: data[key]});\n }\n\n /**\n * @method get\n * @description Return data of parameter.\n * @param {String} key Parameter name.\n * @memberof module:modules/app.StateModule\n * @example\n * state.get('sphereColor'); // 0x00ff00\n */\n get(key) {\n return this.store.getState()[0][key];\n }\n\n /**\n * @method prev\n * @description Return `trueVal` if `config` match previous configuration, in other case - return `falseVal`.\n * @param {String} config Configuration name.\n * @param {Any} trueVal Value returned if condition is truthy.\n * @param {Any} falseVal Value returned if condition is falsy.\n * @memberof module:modules/app.StateModule\n */\n prev(config, trueVal, falseVal) {\n return this.prevConfig === config ? trueVal : falseVal;\n }\n\n /**\n * @method current\n * @description Return `trueVal` if `config` match current configuration, in other case - return `falseVal`.\n * @param {String} config Configuration name.\n * @param {Any} trueVal Value returned if condition is truthy.\n * @param {Any} falseVal Value returned if condition is falsy.\n * @memberof module:modules/app.StateModule\n */\n current(config, trueVal, falseVal) {\n return this.currentConfig === config ? trueVal : falseVal;\n }\n}\n","import {\n MOUSE,\n Quaternion,\n Spherical,\n Vector2,\n PerspectiveCamera,\n OrthographicCamera,\n EventDispatcher,\n Vector3\n} from 'three';\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one finger move\n// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n// Pan - right mouse, or arrow keys / touch: three finter swipe\n\nexport class ThreeOrbitControls extends EventDispatcher {\n constructor(object, domElement, eventHandler) {\n super();\n\n this.object = object;\n\n this.domElement = (domElement === undefined) ? document : domElement;\n this.eventHandler = eventHandler;\n\n // Set to false to disable this control\n this.enabled = true;\n\n // \"target\" sets the location of focus, where the object orbits around\n this.target = new Vector3();\n\n // How far you can dolly in and out ( PerspectiveCamera only )\n this.minDistance = 0;\n this.maxDistance = Infinity;\n\n // How far you can zoom in and out ( OrthographicCamera only )\n this.minZoom = 0;\n this.maxZoom = Infinity;\n\n // How far you can orbit vertically, upper and lower limits.\n // Range is 0 to Math.PI radians.\n this.minPolarAngle = 0; // radians\n this.maxPolarAngle = Math.PI; // radians\n\n // How far you can orbit horizontally, upper and lower limits.\n // If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n this.minAzimuthAngle = -Infinity; // radians\n this.maxAzimuthAngle = Infinity; // radians\n\n // Set to true to enable damping (inertia)\n // If damping is enabled, you must call controls.update() in your animation loop\n this.enableDamping = false;\n this.dampingFactor = 0.25;\n\n // This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n // Set to false to disable zooming\n this.enableZoom = true;\n this.zoomSpeed = 1.0;\n\n // Set to false to disable rotating\n this.enableRotate = true;\n this.rotateSpeed = 1.0;\n\n // Set to false to disable panning\n this.enablePan = true;\n this.keyPanSpeed = 7.0; // pixels moved per arrow key push\n\n // Set to true to automatically rotate around the target\n // If auto-rotate is enabled, you must call controls.update() in your animation loop\n this.autoRotate = false;\n this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n // Set to false to disable use of the keys\n this.enableKeys = true;\n\n // The four arrow keys\n this.keys = {LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40};\n\n // Mouse buttons\n this.mouseButtons = {ORBIT: MOUSE.LEFT, ZOOM: MOUSE.MIDDLE, PAN: MOUSE.RIGHT};\n\n // for reset\n this.target0 = this.target.clone();\n this.position0 = this.object.position.clone();\n this.zoom0 = this.object.zoom;\n\n //\n // public methods\n //\n\n this.getPolarAngle = () => {\n return spherical.phi;\n };\n\n this.getAzimuthalAngle = () => {\n return spherical.theta;\n };\n\n this.reset = () => {\n this.target.copy(this.target0);\n this.object.position.copy(this.position0);\n this.object.zoom = this.zoom0;\n\n this.object.updateProjectionMatrix();\n this.dispatchEvent(changeEvent);\n\n this.update();\n\n state = STATE.NONE;\n };\n\n // this method is exposed, but perhaps it would be better if we can make it private...\n this.update = () => {\n const offset = new Vector3();\n\n // so camera.up is the orbit axis\n const quat = new Quaternion().setFromUnitVectors(object.up, new Vector3(0, 1, 0));\n const quatInverse = quat.clone().inverse();\n\n const lastPosition = new Vector3();\n const lastQuaternion = new Quaternion();\n\n return (() => {\n const position = this.object.position;\n\n offset.copy(position).sub(this.target);\n\n // rotate offset to \"y-axis-is-up\" space\n offset.applyQuaternion(quat);\n\n // angle from z-axis around y-axis\n spherical.setFromVector3(offset);\n\n if (this.autoRotate && state === STATE.NONE)\n rotateLeft(getAutoRotationAngle());\n\n spherical.theta += sphericalDelta.theta;\n spherical.phi += sphericalDelta.phi;\n\n // restrict theta to be between desired limits\n spherical.theta = Math.max(this.minAzimuthAngle, Math.min(this.maxAzimuthAngle, spherical.theta));\n\n // restrict phi to be between desired limits\n spherical.phi = Math.max(this.minPolarAngle, Math.min(this.maxPolarAngle, spherical.phi));\n\n spherical.makeSafe();\n\n spherical.radius *= scale;\n\n // restrict radius to be between desired limits\n spherical.radius = Math.max(this.minDistance, Math.min(this.maxDistance, spherical.radius));\n\n // move target to panned location\n this.target.add(panOffset);\n\n offset.setFromSpherical(spherical);\n\n // rotate offset back to \"camera-up-vector-is-up\" space\n offset.applyQuaternion(quatInverse);\n\n position.copy(this.target).add(offset);\n\n this.object.lookAt(this.target);\n\n if (this.enableDamping === true) {\n sphericalDelta.theta *= (1 - this.dampingFactor);\n sphericalDelta.phi *= (1 - this.dampingFactor);\n } else\n sphericalDelta.set(0, 0, 0);\n\n scale = 1;\n panOffset.set(0, 0, 0);\n\n // update condition is:\n // min(camera displacement, camera rotation in radians)^2 > EPS\n // using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n if (zoomChanged\n || lastPosition.distanceToSquared(this.object.position) > EPS\n || 8 * (1 - lastQuaternion.dot(this.object.quaternion)) > EPS) {\n this.dispatchEvent(changeEvent);\n\n lastPosition.copy(this.object.position);\n lastQuaternion.copy(this.object.quaternion);\n zoomChanged = false;\n\n return true;\n }\n\n return false;\n })();\n };\n\n this.dispose = () => {\n this.domElement.removeEventListener('contextmenu', onContextMenu, false);\n this.domElement.removeEventListener('mousedown', onMouseDown, false);\n this.domElement.removeEventListener('wheel', onMouseWheel, false);\n\n this.domElement.removeEventListener('touchstart', onTouchStart, false);\n this.domElement.removeEventListener('touchend', onTouchEnd, false);\n this.domElement.removeEventListener('touchmove', onTouchMove, false);\n\n document.removeEventListener('mousemove', onMouseMove, false);\n document.removeEventListener('mouseup', onMouseUp, false);\n\n window.removeEventListener('keydown', onKeyDown, false);\n\n // this.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n };\n\n //\n // internals\n //\n\n const changeEvent = {type: 'change'};\n const startEvent = {type: 'start'};\n const endEvent = {type: 'end'};\n\n const STATE = {NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY: 4, TOUCH_PAN: 5};\n\n let state = STATE.NONE;\n\n const EPS = 0.000001;\n\n // current position in spherical coordinates\n const spherical = new Spherical();\n const sphericalDelta = new Spherical();\n\n let scale = 1;\n const panOffset = new Vector3();\n let zoomChanged = false;\n\n const rotateStart = new Vector2();\n const rotateEnd = new Vector2();\n const rotateDelta = new Vector2();\n\n const panStart = new Vector2();\n const panEnd = new Vector2();\n const panDelta = new Vector2();\n\n const dollyStart = new Vector2();\n const dollyEnd = new Vector2();\n const dollyDelta = new Vector2();\n\n const getAutoRotationAngle = () => {\n return 2 * Math.PI / 60 / 60 * this.autoRotateSpeed;\n };\n\n const getZoomScale = () => {\n return Math.pow(0.95, this.zoomSpeed);\n };\n\n const rotateLeft = angle => {\n sphericalDelta.theta -= angle;\n };\n\n const rotateUp = angle => {\n sphericalDelta.phi -= angle;\n };\n\n const panLeft = (() => {\n const v = new Vector3();\n\n return (distance, objectMatrix) => {\n v.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix\n v.multiplyScalar(-distance);\n panOffset.add(v);\n };\n })();\n\n const panUp = (() => {\n const v = new Vector3();\n\n return (distance, objectMatrix) => {\n v.setFromMatrixColumn(objectMatrix, 1); // get Y column of objectMatrix\n v.multiplyScalar(distance);\n panOffset.add(v);\n };\n })();\n\n // deltaX and deltaY are in pixels; right and down are positive\n const pan = (() => {\n const offset = new Vector3();\n\n return (deltaX, deltaY) => {\n const element = this.domElement === document ? this.domElement.body : this.domElement;\n\n if (this.object instanceof PerspectiveCamera) {\n // perspective\n const position = this.object.position;\n offset.copy(position).sub(this.target);\n let targetDistance = offset.length();\n\n // half of the fov is center to top of screen\n targetDistance *= Math.tan((this.object.fov / 2) * Math.PI / 180.0);\n\n // we actually don't use screenWidth, since perspective camera is fixed to screen height\n panLeft(2 * deltaX * targetDistance / element.clientHeight, this.object.matrix);\n panUp(2 * deltaY * targetDistance / element.clientHeight, this.object.matrix);\n } else if (this.object instanceof OrthographicCamera) {\n // orthographic\n panLeft(deltaX * (this.object.right - this.object.left) / this.object.zoom / element.clientWidth, this.object.matrix);\n panUp(deltaY * (this.object.top - this.object.bottom) / this.object.zoom / element.clientHeight, this.object.matrix);\n } else {\n // camera neither orthographic nor perspective\n console.warn('WARNING: OrbitControlsModule.js encountered an unknown camera type - pan disabled.');\n this.enablePan = false;\n }\n };\n })();\n\n const dollyIn = dollyScale => {\n if (this.object instanceof PerspectiveCamera)\n scale /= dollyScale;\n\n else if (this.object instanceof OrthographicCamera) {\n this.object.zoom = Math.max(this.minZoom, Math.min(this.maxZoom, this.object.zoom * dollyScale));\n this.object.updateProjectionMatrix();\n zoomChanged = true;\n } else {\n console.warn('WARNING: OrbitControlsModule.js encountered an unknown camera type - dolly/zoom disabled.');\n this.enableZoom = false;\n }\n };\n\n const dollyOut = dollyScale => {\n if (this.object instanceof PerspectiveCamera)\n scale *= dollyScale;\n\n else if (this.object instanceof OrthographicCamera) {\n this.object.zoom = Math.max(this.minZoom, Math.min(this.maxZoom, this.object.zoom / dollyScale));\n this.object.updateProjectionMatrix();\n zoomChanged = true;\n } else {\n console.warn('WARNING: OrbitControlsModule.js encountered an unknown camera type - dolly/zoom disabled.');\n this.enableZoom = false;\n }\n };\n\n //\n // event callbacks - update the object state\n //\n\n const handleMouseDownRotate = event => {\n // console.log( 'handleMouseDownRotate' );\n\n rotateStart.set(event.clientX, event.clientY);\n };\n\n const handleMouseDownDolly = event => {\n // console.log( 'handleMouseDownDolly' );\n\n dollyStart.set(event.clientX, event.clientY);\n };\n\n const handleMouseDownPan = event => {\n // console.log( 'handleMouseDownPan' );\n\n panStart.set(event.clientX, event.clientY);\n };\n\n const handleMouseMoveRotate = event => {\n // console.log( 'handleMouseMoveRotate' );\n\n rotateEnd.set(event.clientX, event.clientY);\n rotateDelta.subVectors(rotateEnd, rotateStart);\n\n const element = this.domElement === document ? this.domElement.body : this.domElement;\n\n // rotating across whole screen goes 360 degrees around\n rotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * this.rotateSpeed);\n\n // rotating up and down along whole screen attempts to go 360, but limited to 180\n rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * this.rotateSpeed);\n\n rotateStart.copy(rotateEnd);\n\n this.update();\n };\n\n const handleMouseMoveDolly = event => {\n // console.log( 'handleMouseMoveDolly' );\n\n dollyEnd.set(event.clientX, event.clientY);\n\n dollyDelta.subVectors(dollyEnd, dollyStart);\n\n if (dollyDelta.y > 0)\n dollyIn(getZoomScale());\n\n else if (dollyDelta.y < 0)\n dollyOut(getZoomScale());\n\n dollyStart.copy(dollyEnd);\n\n this.update();\n };\n\n const handleMouseMovePan = event => {\n // console.log( 'handleMouseMovePan' );\n\n panEnd.set(event.clientX, event.clientY);\n\n panDelta.subVectors(panEnd, panStart);\n\n pan(panDelta.x, panDelta.y);\n\n panStart.copy(panEnd);\n\n this.update();\n };\n\n const handleMouseUp = event => {\n // console.log( 'handleMouseUp' );\n };\n\n const handleMouseWheel = event => {\n // console.log( 'handleMouseWheel' );\n\n if (event.deltaY < 0)\n dollyOut(getZoomScale());\n\n else if (event.deltaY > 0)\n dollyIn(getZoomScale());\n\n this.update();\n };\n\n const handleKeyDown = event => {\n // console.log( 'handleKeyDown' );\n\n switch (event.keyCode) {\n case this.keys.UP:\n pan(0, this.keyPanSpeed);\n this.update();\n break;\n\n case this.keys.BOTTOM:\n pan(0, -this.keyPanSpeed);\n this.update();\n break;\n\n case this.keys.LEFT:\n pan(this.keyPanSpeed, 0);\n this.update();\n break;\n\n case this.keys.RIGHT:\n pan(-this.keyPanSpeed, 0);\n this.update();\n break;\n\n }\n };\n\n const handleTouchStartRotate = event => {\n // console.log( 'handleTouchStartRotate' );\n\n rotateStart.set(event.touches[0].pageX, event.touches[0].pageY);\n };\n\n const handleTouchStartDolly = event => {\n // console.log( 'handleTouchStartDolly' );\n\n const dx = event.touches[0].pageX - event.touches[1].pageX;\n const dy = event.touches[0].pageY - event.touches[1].pageY;\n\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n dollyStart.set(0, distance);\n };\n\n const handleTouchStartPan = event => {\n // console.log( 'handleTouchStartPan' );\n\n panStart.set(event.touches[0].pageX, event.touches[0].pageY);\n };\n\n const handleTouchMoveRotate = event => {\n // console.log( 'handleTouchMoveRotate' );\n\n rotateEnd.set(event.touches[0].pageX, event.touches[0].pageY);\n rotateDelta.subVectors(rotateEnd, rotateStart);\n\n const element = this.domElement === document ? this.domElement.body : this.domElement;\n\n // rotating across whole screen goes 360 degrees around\n rotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * this.rotateSpeed);\n\n // rotating up and down along whole screen attempts to go 360, but limited to 180\n rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * this.rotateSpeed);\n\n rotateStart.copy(rotateEnd);\n\n this.update();\n };\n\n const handleTouchMoveDolly = event => {\n // console.log( 'handleTouchMoveDolly' );\n\n const dx = event.touches[0].pageX - event.touches[1].pageX;\n const dy = event.touches[0].pageY - event.touches[1].pageY;\n\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n dollyEnd.set(0, distance);\n\n dollyDelta.subVectors(dollyEnd, dollyStart);\n\n if (dollyDelta.y > 0)\n dollyOut(getZoomScale());\n\n else if (dollyDelta.y < 0)\n dollyIn(getZoomScale());\n\n dollyStart.copy(dollyEnd);\n\n this.update();\n };\n\n const handleTouchMovePan = event => {\n // console.log( 'handleTouchMovePan' );\n\n panEnd.set(event.touches[0].pageX, event.touches[0].pageY);\n\n panDelta.subVectors(panEnd, panStart);\n\n pan(panDelta.x, panDelta.y);\n\n panStart.copy(panEnd);\n\n this.update();\n };\n\n const handleTouchEnd = () => {\n // console.log( 'handleTouchEnd' );\n };\n\n //\n // event handlers - FSM: listen for events and reset state\n //\n\n const onMouseDown = event => {\n if (this.enabled === false) return;\n\n event.preventDefault();\n\n if (event.button === this.mouseButtons.ORBIT) {\n if (this.enableRotate === false) return;\n\n handleMouseDownRotate(event);\n\n state = STATE.ROTATE;\n } else if (event.button === this.mouseButtons.ZOOM) {\n if (this.enableZoom === false) return;\n\n handleMouseDownDolly(event);\n\n state = STATE.DOLLY;\n } else if (event.button === this.mouseButtons.PAN) {\n if (this.enablePan === false) return;\n\n handleMouseDownPan(event);\n\n state = STATE.PAN;\n }\n\n if (state !== STATE.NONE) {\n this.eventHandler.on('mousemove', onMouseMove, false);\n this.eventHandler.on('mouseup', onMouseUp, false);\n\n this.dispatchEvent(startEvent);\n }\n };\n\n const onMouseMove = event => {\n if (this.enabled === false) return;\n\n event.preventDefault();\n\n if (state === STATE.ROTATE) {\n if (this.enableRotate === false) return;\n\n handleMouseMoveRotate(event);\n } else if (state === STATE.DOLLY) {\n if (this.enableZoom === false) return;\n\n handleMouseMoveDolly(event);\n } else if (state === STATE.PAN) {\n if (this.enablePan === false) return;\n\n handleMouseMovePan(event);\n }\n };\n\n const onMouseUp = event => {\n if (this.enabled === false) return;\n\n handleMouseUp(event);\n\n document.removeEventListener('mousemove', onMouseMove, false);\n document.removeEventListener('mouseup', onMouseUp, false);\n\n this.dispatchEvent(endEvent);\n\n state = STATE.NONE;\n };\n\n const onMouseWheel = event => {\n if (this.enabled === false || this.enableZoom === false || (state !== STATE.NONE && state !== STATE.ROTATE)) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n handleMouseWheel(event);\n\n this.dispatchEvent(startEvent); // not sure why these are here...\n this.dispatchEvent(endEvent);\n };\n\n const onKeyDown = event => {\n if (this.enabled === false || this.enableKeys === false || this.enablePan === false) return;\n\n handleKeyDown(event);\n };\n\n const onTouchStart = event => {\n if (this.enabled === false) return;\n\n switch (event.touches.length) {\n case 1: // one-fingered touch: rotate\n\n if (this.enableRotate === false) return;\n\n handleTouchStartRotate(event);\n\n state = STATE.TOUCH_ROTATE;\n\n break;\n\n case 2: // two-fingered touch: dolly\n\n if (this.enableZoom === false) return;\n\n handleTouchStartDolly(event);\n\n state = STATE.TOUCH_DOLLY;\n\n break;\n\n case 3: // three-fingered touch: pan\n\n if (this.enablePan === false) return;\n\n handleTouchStartPan(event);\n\n state = STATE.TOUCH_PAN;\n\n break;\n\n default:\n\n state = STATE.NONE;\n\n }\n\n if (state !== STATE.NONE)\n this.dispatchEvent(startEvent);\n };\n\n const onTouchMove = event => {\n if (this.enabled === false) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n switch (event.touches.length) {\n case 1: // one-fingered touch: rotate\n\n if (this.enableRotate === false) return;\n if (state !== STATE.TOUCH_ROTATE) return; // is this needed?...\n\n handleTouchMoveRotate(event);\n\n break;\n\n case 2: // two-fingered touch: dolly\n\n if (this.enableZoom === false) return;\n if (state !== STATE.TOUCH_DOLLY) return; // is this needed?...\n\n handleTouchMoveDolly(event);\n\n break;\n\n case 3: // three-fingered touch: pan\n\n if (this.enablePan === false) return;\n if (state !== STATE.TOUCH_PAN) return; // is this needed?...\n\n handleTouchMovePan(event);\n\n break;\n\n default:\n\n state = STATE.NONE;\n\n }\n };\n\n const onTouchEnd = event => {\n if (this.enabled === false) return;\n\n handleTouchEnd(event);\n\n this.dispatchEvent(endEvent);\n\n state = STATE.NONE;\n };\n\n const onContextMenu = event => {\n event.preventDefault();\n };\n\n //\n\n this.eventHandler.on('contextmenu', onContextMenu, false);\n\n this.eventHandler.on('mousedown', onMouseDown, false);\n this.eventHandler.on('wheel', onMouseWheel, false);\n\n this.eventHandler.on('touchstart', onTouchStart, false);\n this.eventHandler.on('touchend', onTouchEnd, false);\n this.eventHandler.on('touchmove', onTouchMove, false);\n\n this.eventHandler.on('keydown', onKeyDown, false);\n\n // force an update at start\n\n this.update();\n }\n\n get center() {\n console.warn('OrbitControls: .center has been renamed to .target');\n return this.target;\n }\n\n get noZoom() {\n console.warn('OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.');\n return !this.enableZoom;\n }\n\n set noZoom(value) {\n console.warn('OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.');\n this.enableZoom = !value;\n }\n\n get noRotate() {\n console.warn('OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.');\n return !this.enableRotate;\n }\n\n set noRotate(value) {\n console.warn('OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.');\n this.enableRotate = !value;\n }\n\n get noPan() {\n console.warn('OrbitControls: .noPan has been deprecated. Use .enablePan instead.');\n return !this.enablePan;\n }\n\n set noPan(value) {\n console.warn('OrbitControls: .noPan has been deprecated. Use .enablePan instead.');\n this.enablePan = !value;\n }\n\n get noKeys() {\n console.warn('OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.');\n return !this.enableKeys;\n }\n\n set noKeys(value) {\n console.warn('OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.');\n this.enableKeys = !value;\n }\n\n get staticMoving() {\n console.warn('OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.');\n return !this.enableDamping;\n }\n\n set staticMoving(value) {\n console.warn('OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.');\n this.enableDamping = !value;\n }\n\n get dynamicDampingFactor() {\n console.warn('OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.');\n return this.dampingFactor;\n }\n\n set dynamicDampingFactor(value) {\n console.warn('OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.');\n this.dampingFactor = value;\n }\n}\n","import {Vector3} from 'three';\nimport {ControlsModule} from '../ControlsModule';\n\nimport {ThreeOrbitControls} from './lib/ThreeOrbitControls';\n\n/**\n * @class OrbitControlsModule\n * @category modules/app\n * @param {Object} [params]\n * @param {Object} [params.object=camera] Object to which controls are applied.\n * @param {THREE.Vector3} [params.target=new Vector3()] Controls center vector.\n * @param {Boolean} [params.follow=false] Follow the target\n * @memberof module:modules/app\n * @example Creating a rendering module and passing it to App's modules\n * new App([\n * new ElementModule(),\n * new SceneModule(),\n * new DefineModule('camera', new WHS.PerspectiveCamera({\n * position: new THREE.Vector3(0, 6, 18),\n * far: 10000\n * })),\n * new RenderingModule(),\n * new OrbitControlsModule()\n * ]);\n */\nexport class OrbitControlsModule extends ControlsModule {\n constructor(params = {}) {\n super(params);\n\n this.params = Object.assign({\n follow: false,\n object: null,\n target: new Vector3()\n }, params);\n }\n\n manager(manager) {\n super.manager(manager);\n\n const {object: obj, follow, target} = this.params;\n const object = obj ? obj.native : manager.get('camera').native;\n\n const controls = new ThreeOrbitControls(\n object,\n manager.get('element'),\n manager.handler\n );\n\n const updateProcessor = follow ? c => {\n controls.update(c.getDelta());\n controls.target.copy(target);\n } : c => {\n controls.update(c.getDelta());\n };\n\n this.setControls(controls);\n this.setUpdate(updateProcessor);\n\n manager.update({\n camera: camera => {\n if (obj) return;\n controls.object = camera.native;\n },\n element: element => {\n controls.domElement = element;\n }\n });\n\n controls.target.copy(target);\n }\n}\n","/** @module modules/app/controls */\nexport * from './OrbitControlsModule';\n","/** @module modules/app */\nexport * from './ElementModule';\nexport * from './RenderingModule';\nexport * from './SceneModule';\nexport * from './ResizeModule';\nexport * from './PostProcessorModule';\nexport * from './VirtualMouseModule';\nexport * from './EventsPatchModule';\nexport * from './ControlsModule';\nexport * from './FogModule';\nexport * from './StateModule';\n\n// controls\nexport * from './controls/index';\n","/**\n * @class DynamicGeometryModule\n * @category modules/mesh\n * @param {Object} [params={attributes: false}] - params\n * @param {Boolean} [patchEvents=true]\n * @memberof module:modules/mesh\n */\nexport class DynamicGeometryModule {\n constructor(params = {}) {\n this.params = Object.assign({\n attributes: false\n }, params);\n }\n\n integrate(self) {\n const params = self.params;\n\n this.g_ = function (params = {}) {\n if (this.buildGeometry) {\n this.native.geometry = this.buildGeometry(\n this.updateParams({geometry: params})\n );\n }\n };\n\n if (params.attributes) {\n for (const key in this.params.geometry) {\n if (key) {\n Object.defineProperty(this, `g_${key}`, {\n get() {\n return this.native.geometry.parameters[key];\n },\n set(value) {\n this.native.geometry = this.buildGeometry(this.updateParams({geometry: {[key]: value}}));\n },\n configurable: true,\n enumerable: true\n });\n }\n }\n }\n }\n}\n","import {\n RepeatWrapping,\n UVMapping,\n NearestFilter,\n LinearMipMapLinearFilter,\n TextureLoader,\n Vector2\n} from 'three';\n\nconst loader = new TextureLoader();\n\n/**\n * @class TextureModule\n * @category modules/mesh\n * @description A TextureModule can be applied to any Mesh or Model.\n * @param {Array} [textures] - array of texture objects\n * @memberof module:modules/mesh\n * @example Creating an instance. url takes a path, or a data object.\n * var woodTexture = new TextureModule({\n * url: `${process.assetsPath}/textures/wood.jpg`\n * });\n * @example More comprehensive example, wood texture applied to a Box.\n * new Box({\n * geometry: {\n * width: 2,\n * height: 2,\n * depth: 2\n * },\n * modules: [\n * new TextureModule({\n * url: `path/to/texture.jpg`,\n * repeat: new THREE.Vector2(1, 1) // optional\n * })\n * ],\n * material: new THREE.MeshBasicMaterial({\n * color: 0xffffff\n * }),\n * position: [50, 60, 70]\n * }).addTo(app);\n */\nexport class TextureModule {\n static load(url) {\n return new TextureModule({url}).textures[0][1];\n }\n\n textures = [];\n\n constructor(...textures) {\n textures.forEach(({\n url,\n type = 'map',\n offset = new Vector2(0, 0),\n repeat = new Vector2(1, 1),\n wrap = RepeatWrapping,\n mapping = UVMapping,\n fix = tex => tex\n }) => {\n const texture = loader.load(url);\n\n if (wrap.length > 0) {\n texture.wrapS = wrap[0];\n texture.wrapT = wrap[1];\n } else\n texture.wrapS = texture.wrapT = wrap;\n\n texture.mapping = mapping;\n\n texture.offset.copy(offset);\n texture.repeat.copy(repeat);\n\n texture.magFilter = NearestFilter;\n texture.minFilter = LinearMipMapLinearFilter;\n\n this.textures.push([type, fix(texture)]);\n });\n }\n\n bridge = {\n material(material, self) {\n self.textures.forEach(texture => {\n material[texture[0]] = texture[1];\n });\n\n material.needsUpdate = true;\n return material;\n }\n }\n}\n","import {\n AnimationMixer,\n AnimationClip,\n Clock\n} from 'three';\n\nimport {Loop} from '../../core/Loop';\n\n/**\n * @class AnimationModule\n * @category modules/mesh\n * @description Convenience module that wraps the three.js animation system\n * @param {App} app - the app\n * @param {Boolean} [isDeferred=false] - set to true if animation should not start automatically\n * @param {Object} [params={speed: 1}] - the params\n * @memberof module:modules/mesh\n * @example Create animation module and play a given clip of an imported model\n * const animationModule = new AnimationModule(app, false, {\n * speed: 1.2 // speed up animation by 20%\n * });\n *\n * new Importer({\n * parser(geometry, materials) {\n * // Override parse to generate a skinnedMesh, needed for skinned models\n * return new THREE.SkinnedMesh(geometry, materials);\n * },\n *\n * url: `path/to/model.json`,\n * useCustomMaterial: true,\n *\n * material: new THREE.MeshStandardMaterial({\n * skinning: true\n * }),\n *\n * modules: [animationModule]\n * }).addTo(app).then(() => {\n * // adding model to app returns a promise, so pipe the function to kick off the animation clip\n * animationModule.play('clipName');\n * });\n */\nexport class AnimationModule {\n constructor(app, isDeferred, params = {}) {\n this.params = Object.assign({\n speed: 1\n }, params);\n this.clock = new Clock();\n\n this.app = app;\n this.isDeferred = isDeferred;\n }\n\n /**\n * @method play\n * @instance\n * @description Plays the given clip name\n * @param {String} clipName - the clip to play\n * @return {THREE.AnimationAction} Playing action \n * @memberof module:modules/mesh.AnimationModule\n */\n play(clipName) {\n const clip = AnimationClip.findByName(this.clips, clipName);\n return this.mixer.clipAction(clip).play();\n }\n\n /**\n * @method update\n * @instance\n * @description Update the mixer (being called on frame animation loop)\n * @memberof module:modules/mesh.AnimationModule\n */\n update() {\n if (this.mixer) this.mixer.update(this.clock.getDelta() * this.params.speed);\n }\n\n integrate(self) {\n self.loop = new Loop(() => {\n self.update();\n });\n\n if (!self.isDeferred) self.loop.start(self.app);\n }\n\n manager(manager) {\n manager.define('animation');\n }\n\n bridge = {\n mesh(mesh, self) {\n mesh.geometry.skeleton = mesh.skeleton;\n\n self.mixer = new AnimationMixer(mesh.geometry);\n self.clips = mesh.geometry.animations;\n\n return mesh;\n }\n }\n}\n","/** @module modules/mesh */\nexport * from './DynamicGeometryModule';\nexport * from './TextureModule';\nexport * from './AnimationModule';\n","/**\n * @class DefineModule\n * @category modules\n * @param {String} name\n * @param {Object} data\n * @memberof module:modules\n * @example Creating a DefineModule with PerspectiveCamera as camera module and passing it to App's modules\n * new App([\n * // ...\n * new DefineModule('camera', new PerspectiveCamera())\n * ]);\n */\nexport class DefineModule {\n constructor(name, data) {\n this.name = name;\n this.data = data;\n }\n\n manager(manager) {\n manager.set(this.name, this.data);\n }\n}\n","/** @module modules */\n\nexport * from './app/index';\nexport * from './mesh/index';\n\n// modules\nexport * from './DefineModule';\n","import {Importer} from './components/meshes/Importer';\nimport {PerspectiveCamera} from './components/cameras/PerspectiveCamera';\n\nexport class Model extends Importer {\n constructor(params, ...additional) {\n console.warn('Model is deprecated. Use Importer instead.');\n\n if (params.geometry) {\n params.url = params.geometry.path;\n params.loader = params.geometry.loader;\n }\n\n super(params, ...additional);\n }\n}\n\nexport class CameraModule {\n constructor(params = {}) {\n console.warn('CameraModule is deprecated. Use DefineModule instead.');\n this.camera = new PerspectiveCamera(params);\n }\n\n integrate(self) {\n this.add(self.camera);\n }\n\n manager(manager) {\n manager.set('camera', this.camera);\n }\n}\n","/**\n * Namespace containing all classes from all modules. Used as global in UMD pattern.\n * @namespace WHS\n * @example The use of WHS namespace.\n * new WHS.App() // core\n * new WHS.PerspectiveCamera() // components\n * new WHS.ResizeModule() // modules\n * WHS.extend() // utils\n */\n\n\nexport * from './core/index';\nexport * from './components/lights/index';\nexport * from './components/cameras/index';\nexport * from './components/meshes/index';\nexport * from './utils/index';\nexport * from './modules/index';\n\n// DEPRECATION\nexport * from './deprecation';\n"],"names":["require$$0","defined","toInteger","aFunction","isObject","document","require$$1","require$$2","anObject","toPrimitive","IE8_DOM_DEFINE","dP","createDesc","core","global","has","ctx","hide","cof","IObject","min","toIObject","toLength","toAbsoluteIndex","uid","$keys","enumBugKeys","getKeys","IE_PROTO","PROTOTYPE","dPs","create","descriptor","setToStringTag","toObject","$iterCreate","getPrototypeOf","LIBRARY","Iterators","redefine","$export","step","TAG","ITERATOR","classof","getIterFn","isArrayIter","call","invoke","cel","html","process","Promise","newPromiseCapability","SPECIES","DESCRIPTORS","TypeError","isNode","newPromiseCapabilityModule","userAgent","perform","anInstance","require$$3","speciesConstructor","require$$4","require$$5","require$$6","promiseResolve","require$$7","forOf","_Promise","pIE","fails","wksExt","gOPS","toString","gOPD","$GOPD","$DP","gOPN","gOPNExt","wks","shared","ObjectProto","USE_NATIVE","$fails","_create","enumKeys","$getOwnPropertyDescriptor","wksDefine","isArray","$Object","_Object$defineProperty","_Object$keys","_Object$getOwnPropertySymbols","_Object$getOwnPropertyDescriptor","defineProperty","_Object$setPrototypeOf","setPrototypeOf","_Symbol","_Symbol$iterator","_typeof","$getPrototypeOf","_Object$getPrototypeOf","extend","object","extensions","extension","Object","getOwnPropertyNames","prop","undefined","constructor","Array","slice","instruct","array","instArray","tempObject","i","max","length","guide","transformData","instructions","key","toArray","instruction","tempArray","px","redefineAll","validate","$iterDefine","setSpecies","asc","meta","strong","from","bind","_Reflect$construct","_Map","_Object$create","construct","CompositionError","classInstance","message","component","stackArray","stack","split","splice","join","console","error","name","Error","DependencyError","activeModule","dependencyModule","ManagerError","warnDeps","REVISION","err","ModuleSystem","source","modules","applyModule","applyBridge","onCopy","bridgeMap","module","bridge","apply","cb","func","moduleScope","push","manager","active","integrate","disposeModule","indexOf","dispose","Events","get","_getIterator","ponyfill","$$observable","ModuleManager","handler","currentModule","store","createStore","state","action","data","dispatch","type","getState","Boolean","depsMap","subscribe","changedKey","callback","warn","set","moduleExecutor","use","Component","params","defaults","integrateModules","promise","_wait","all","isDeffered","wait","then","copy","customize","native","clone","parent","remove","onAdd","add","children","_manager","_native","mesh","_Reflect$get","attributes","mappers","target","mapper","k","map","attribute","prototype","getter","setter","configurable","enumerable","value","mirror","MeshComponent","geom","Mesh","geometry","material","custom","build","wrap","resolve","applyCommand","position","rotation","scale","shadow","x","y","z","castShadow","cast","receiveShadow","receive","onWrap","quaternion","dest","LightComponent","light","wrapShadow","defer","mapSize","width","height","bias","radius","shadowCamera","camera","near","far","fov","left","right","top","bottom","CameraComponent","system","window","App","log","version","requestAnimFrame","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","setTimeout","loops","enabled","ll","e","execute","clock","loop","index","Loop","useClock","Clock","world","addLoop","start","stop","removeLoop","AmbientLight","AmbientLightNative","color","intensity","DirectionalLight","DirectionalLightNative","HemisphereLight","HemisphereLightNative","skyColor","groundColor","PointLight","PointLightNative","distance","decay","SpotLight","SpotLightNative","angle","exponent","Math","PI","AreaLight","RectAreaLightNative","CubeCamera","CubeCameraNative","cubeResolution","OrthographicCamera","OrthographicCameraNative","innerWidth","innerHeight","PerspectiveCamera","PerspectiveCameraNative","aspect","Box","buildGeometry","buffer","BoxBufferGeometry","BoxGeometry","depth","widthSegments","heightSegments","depthSegments","Circle","CircleBufferGeometry","CircleGeometry","segments","thetaStart","thetaLength","Cone","ConeBufferGeometry","ConeGeometry","radiusSegments","openEnded","Cylinder","CylinderBufferGeometry","CylinderGeometry","radiusTop","radiusBottom","Dodecahedron","DodecahedronBufferGeometry","DodecahedronGeometry","detail","Extrude","ExtrudeGeometry","shapes","options","BufferGeometry","fromGeometry","Icosahedron","IcosahedronBufferGeometry","IcosahedronGeometry","Lathe","LatheBufferGeometry","LatheGeometry","points","Line","LineNative","Geometry","pp","curve","getPoints","verts","Float32Array","i3","addAttribute","BufferAttribute","vertices","Importer","filter","processFilter","forEach","el","texturePath","loader","setTexturePath","load","url","onLoad","parser","onProgress","onError","JSONLoader","useCustomMaterial","mat","bones","SkinnedMesh","Octahedron","OctahedronBufferGeometry","OctahedronGeometry","Parametric","ParametricBufferGeometry","ParametricGeometry","slices","stacks","u","v","Vector3","Plane","PlaneBufferGeometry","PlaneGeometry","wSegments","hSegments","verticesOfCube","indicesOfFaces","Polyhedron","PolyhedronBufferGeometry","PolyhedronGeometry","Ring","RingBufferGeometry","RingGeometry","innerRadius","outerRadius","thetaSegments","phiSegments","Shape","ShapeBufferGeometry","ShapeGeometry","Sphere","SphereBufferGeometry","SphereGeometry","Tetrahedron","TetrahedronBufferGeometry","TetrahedronGeometry","Text","path","font","TextGeometry","text","assign","size","curveSegments","Font","bevelEnabled","bevelThickness","bevelSize","FontLoader","Torus","TorusGeometry","tube","radialSegments","tubularSegments","arc","Torusknot","GConstruct","TorusKnotBufferGeometry","TorusKnotGeometry","p","q","Tube","TubeBufferGeometry","TubeGeometry","closed","LineCurve3","Group","obj","addTo","Object3D","ElementModule","container","body","createElement","element","className","style","self","appendChild","RenderingModule","additional","resolution","Vector2","pixelRatio","devicePixelRatio","bgColor","bgOpacity","renderer","fix","WebGLRenderer","effects","setClearColor","setPixelRatio","setSize","Number","toFixed","applyAdditional","scene","attachToCanvas","render","effect","effectLoop","renderLoop","getSize","app","canvas","domElement","define","integrateRenderer","update","forceContextLoss","shadowMap","SYMBOL_CHILDREN_FOR_SCENE","Symbol","SceneModule","willSceneBeReplaced","Scene","onRemove","_setScene","setScene","getScene","ResizeModule","auto","callbacks","updateProjectionMatrix","rendering","offsetWidth","offsetHeight","getContainer","getResolution","addEventListener","trigger","addAutoresize","fragment","vertex","AdaptiveLuminosityMaterial","defines","MIP_LEVEL_1X1","uniforms","tPreviousLum","Uniform","tCurrentLum","minLuminance","delta","tau","fragmentShader","vertexShader","depthWrite","depthTest","ShaderMaterial","BokehMaterial","settings","focus","dof","aperture","maxBlur","cameraNear","cameraFar","tDiffuse","tDepth","adoptCameraSettings","ColorEdgesMaterial","texelSize","EDGE_THRESHOLD","threshold","needsUpdate","CombineMaterial","screenMode","texture1","texture2","opacity1","opacity2","setScreenModeEnabled","SCREEN_MODE","ConvolutionMaterial","halfTexelSize","kernel","setTexelSize","kernelSize","KernelSize","LARGE","kernelPresets","multiplyScalar","VERY_SMALL","SMALL","MEDIUM","VERY_LARGE","HUGE","CopyMaterial","opacity","DepthComparisonMaterial","depthTexture","morphTargets","skinning","PERSPECTIVE_CAMERA","DotScreenMaterial","average","offsetRepeat","Vector4","setAverageEnabled","AVERAGE","FilmMaterial","noise","scanlines","grid","greyscale","sepia","vignette","eskil","noiseIntensity","scanlineIntensity","gridIntensity","greyscaleIntensity","sepiaIntensity","vignetteOffset","vignetteDarkness","time","scanlineCount","gridScale","gridLineWidth","setNoiseEnabled","setScanlinesEnabled","setGridEnabled","setGreyscaleEnabled","setSepiaEnabled","setVignetteEnabled","setEskilEnabled","NOISE","SCANLINES","GRID","GREYSCALE","SEPIA","VIGNETTE","ESKIL","GlitchMaterial","tPerturb","amount","seed","seedX","seedY","distortionX","distortionY","colS","GodRaysMaterial","exposure","density","weight","clampMax","NUM_SAMPLES_FLOAT","NUM_SAMPLES_INT","lightPosition","LuminosityMaterial","colorOutput","luminanceRange","maskLuminance","distinction","range","setColorOutputEnabled","setLuminanceRangeEnabled","COLOR","RANGE","OutlineBlendMaterial","edgeStrength","patternScale","visibleEdgeColor","hiddenEdgeColor","alphaBlending","xRay","pulse","tMask","tEdges","tPattern","Color","setAlphaBlendingEnabled","setXRayEnabled","ALPHA_BLENDING","X_RAY","texture","USE_PATTERN","OutlineEdgesMaterial","PixelationMaterial","granularity","dx","dy","RealisticBokehMaterial","rings","samples","showFocus","manualDoF","pentagon","shaderFocus","luminanceThreshold","luminanceGain","fringe","ditherStrength","RINGS_INT","RINGS_FLOAT","SAMPLES_INT","SAMPLES_FLOAT","focalLength","focalStop","focusCoords","focalDepth","setShowFocusEnabled","setManualDepthOfFieldEnabled","setPentagonEnabled","setShaderFocusEnabled","SHOW_FOCUS","MANUAL_DOF","PENTAGON","SHADER_FOCUS","getFocalLength","ShockWaveMaterial","maxRadius","waveSize","amplitude","center","cameraDistance","SMAABlendMaterial","tWeights","SMAAWeightsMaterial","MAX_SEARCH_STEPS_INT","MAX_SEARCH_STEPS_FLOAT","AREATEX_MAX_DISTANCE","AREATEX_PIXEL_SIZE","AREATEX_SUBTEX_SIZE","SEARCHTEX_SIZE","SEARCHTEX_PACKED_SIZE","tArea","tSearch","steps","ToneMappingMaterial","luminanceMap","averageLuminance","maxLuminance","middleGrey","Pass","quad","frustumCulled","renderToScreen","needsSwap","inputBuffer","outputBuffer","stencilTest","alpha","keys","BlurPass","renderTargetX","WebGLRenderTarget","minFilter","LinearFilter","magFilter","stencilBuffer","depthBuffer","generateMipmaps","renderTargetY","resolutionScale","convolutionMaterial","ditheredConvolutionMaterial","dithering","getKernel","lastRT","destRT","l","floor","format","RGBFormat","BloomPass","renderTarget","blurPass","combineMaterial","luminosityMaterial","blend","initialize","BokehPass","ClearMaskPass","buffers","stencil","setTest","ClearPass","clearColor","clearAlpha","getClearColor","getClearAlpha","setRenderTarget","clear","DotScreenPass","w","FilmPass","scanlineDensity","round","randomInt","low","high","random","randomFloat","GlitchPass","perturbMap","generatePerturbMap","dtSize","mode","GlitchMode","SPORADIC","counter","breakPoint","pixels","dt","DataTexture","FloatType","CONSTANT_WILD","CONSTANT_MILD","RenderPass","clearPass","overrideMaterial","clearDepth","clamp","GodRaysPass","lightSource","lightScene","mainScene","mainCamera","renderTargetMask","renderPassLight","renderPassMask","MeshBasicMaterial","screenPosition","godRaysMaterial","background","project","parseInt","MaskPass","inverse","clearStencil","context","writeValue","clearValue","setMask","setLocked","setOp","REPLACE","setFunc","ALWAYS","setClear","EQUAL","KEEP","ShaderPass","textureID","OutlinePass","renderTargetDepth","renderTargetEdges","renderTargetBlurredEdges","renderPassDepth","MeshDepthMaterial","depthPacking","RGBADepthPacking","copyPass","outlineEdgesMaterial","outlineBlendMaterial","blur","selection","pulseSpeed","selectionLayer","setPatternTexture","objects","clearSelection","layers","enable","disable","visible","mask","cos","setSelectionVisible","PixelationPass","setResolution","RealisticBokehPass","SavePass","resize","HALF_PI","ab","ShockWavePass","epicenter","speed","shockWaveMaterial","copyMaterial","getWorldDirection","sub","angleTo","distanceTo","SMAAPass","searchImage","areaImage","renderTargetColorEdges","renderTargetWeights","RGBAFormat","colorEdgesMaterial","weightsMaterial","searchTexture","Texture","NearestFilter","flipY","areaTexture","blendMaterial","searchImageDataURL","areaImageDataURL","TexturePass","opacitySource","ToneMappingPass","renderTargetLuminosity","LinearMipMapLinearFilter","renderTargetAdapted","renderTargetPrevious","adaptiveLuminosityMaterial","toneMappingMaterial","adaptive","ceil","log2","pow","ADAPTED_LUMINANCE","EffectComposer","autoClear","createBuffer","passes","oldRenderer","oldSize","newSize","parentNode","removeChild","drawingBufferSize","getDrawingBufferSize","getContextAttributes","DepthTexture","DepthStencilFormat","UnsignedInt248Type","pass","NOTEQUAL","polyfill","method","showWarn","PostProcessorModule","debug","composer","getDelta","replaceRenderer","addPass","currentPass","bool","EventsPatchModule","originObject","destObject","events","event","emit","patchEvents","VirtualMouseModule","globalMovement","Raycaster","customX","customY","rect","getBoundingClientRect","clientX","clientY","mouse","projectionPlane","normal","raycaster","setFromCamera","require","on","ev","globalX","globalY","pointerLockElement","movementX","movementY","nested","isHovered","hovers","traverse","child","intersectObjects","intersectObject","plane","ray","intersectPlane","intersection","ControlsModule","controls","c","updateLoop","FogModule","fog","FogExp2","Fog","isEqualDefault","a","b","equals","StateModule","isEqual","equalCheck","actionGenerate","configuration","currentConfig","prevConfig","config","default","replaceReducer","configs","updates","configName","trueVal","falseVal","ThreeOrbitControls","eventHandler","minDistance","maxDistance","Infinity","minZoom","maxZoom","minPolarAngle","maxPolarAngle","minAzimuthAngle","maxAzimuthAngle","enableDamping","dampingFactor","enableZoom","zoomSpeed","enableRotate","rotateSpeed","enablePan","keyPanSpeed","autoRotate","autoRotateSpeed","enableKeys","LEFT","UP","RIGHT","BOTTOM","mouseButtons","ORBIT","MOUSE","ZOOM","MIDDLE","PAN","target0","position0","zoom0","zoom","getPolarAngle","spherical","phi","getAzimuthalAngle","theta","reset","dispatchEvent","changeEvent","STATE","NONE","offset","quat","Quaternion","setFromUnitVectors","up","quatInverse","lastPosition","lastQuaternion","applyQuaternion","setFromVector3","rotateLeft","getAutoRotationAngle","sphericalDelta","makeSafe","panOffset","setFromSpherical","lookAt","zoomChanged","distanceToSquared","EPS","dot","removeEventListener","onContextMenu","onMouseDown","onMouseWheel","onTouchStart","onTouchEnd","onTouchMove","onMouseMove","onMouseUp","onKeyDown","startEvent","endEvent","ROTATE","DOLLY","TOUCH_ROTATE","TOUCH_DOLLY","TOUCH_PAN","Spherical","rotateStart","rotateEnd","rotateDelta","panStart","panEnd","panDelta","dollyStart","dollyEnd","dollyDelta","getZoomScale","rotateUp","panLeft","objectMatrix","setFromMatrixColumn","panUp","pan","deltaX","deltaY","targetDistance","tan","clientHeight","matrix","clientWidth","dollyIn","dollyScale","dollyOut","handleMouseDownRotate","handleMouseDownDolly","handleMouseDownPan","handleMouseMoveRotate","subVectors","handleMouseMoveDolly","handleMouseMovePan","handleMouseWheel","handleKeyDown","keyCode","handleTouchStartRotate","touches","pageX","pageY","handleTouchStartDolly","sqrt","handleTouchStartPan","handleTouchMoveRotate","handleTouchMoveDolly","handleTouchMovePan","preventDefault","button","handleMouseUp","stopPropagation","handleTouchEnd","EventDispatcher","OrbitControlsModule","follow","updateProcessor","setControls","setUpdate","DynamicGeometryModule","g_","updateParams","parameters","TextureLoader","TextureModule","textures","repeat","RepeatWrapping","mapping","UVMapping","tex","wrapS","wrapT","AnimationModule","isDeferred","skeleton","mixer","AnimationMixer","clips","animations","clipName","clip","AnimationClip","findByName","clipAction","play","DefineModule","Model","CameraModule"],"mappings":"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,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;CAClE,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;CAClE,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;CACnE,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;;CAEnE,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;CAClE,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;CAClE,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;CACnE,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;;CAEnE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC1D,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC1D,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC1D,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;;CAE3D,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC1D,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC1D,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC1D,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;;CAE3D,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC1D,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC1D,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GA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,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM,CAAC;CACnI,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM,CAAC;CACnI,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM,CAAC;;CAEnI,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,MAAM,CAAC;CACzB,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM,CAAC;CACnI,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM,CAAC;CACnI,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,GA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E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACzC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACzC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACzC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAEzC,GAAG,MAAM,KAAK,KAAK,KAAK,KAAK,GAAG;;CAEhC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACzC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACzC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACzC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAEzC,GAAG,MAAM,KAAK,KAAK,KAAK,KAAK,GAAG;;CAEhC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACzC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACzC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACzC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAEzC,GAAG,MAAM,KAAK,KAAK,KAAK,KAAK,GAAG;;CAE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AAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;;CAElD,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;CAClD,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;CAClD,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;;CAElD,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC9C,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC9C,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;;CAE9C,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC9C,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC9C,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;;CAE9C,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC9C,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC9C,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;;CAE9C,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,cAAc,EAAE,WAAW,CAAC,GAAG;;CAEhC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAEzB,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;CAC3C,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;CAC3C,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;;CAE3C,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,WAAW,EAAE,YAAY;;CAE1B,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAEzB,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;CAC3C,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;CACxC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;;CAEzC,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;CAE/E,EAAE;;CAEF,CAAC,UAAU,EAAE,WAAW,MAAM,EAAE,iBAAiB,GAAG;;CAEpD,EAAE,KAAK,MAAM,IAAI,MAAM,CAAC,SAAS,GAAG;;CAEpC,GAAG,OAAO,CAAC,KAAK,EAAE,kEAAkE,EAAE,CAAC;;CAEvF,GAAG;;CAEH,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,QAAQ;CAC1B,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ;;CAErB,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE;CAC9C,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE;CAC9C,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE;;CAE9C,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;CAC9B,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;CAC9B,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;;CAE9B,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;;CAE3C,EAAE,KAAK,GAAG,KAAK,CAAC,GAAG;;CAEnB,GAAG,IAAI,GAAG,GAAG,oEAAoE,CAAC;;CAElF,GAAG,KAAK,iBAAiB,KAAK,IAAI,GAAG;;CAErC,IAAI,MAAM,IAAI,KAAK,EAAE,GAAG,EAAE,CAAC;;CAE3B,IAAI,MAAM;;CAEV,IAAI,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;;CAExB,IAAI;;CAEJ,GAAG,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;;CAE1B,GAAG;;CAEH,EAAE,IAAI,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC;;CAEvB,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,MAAM,CAAC;CACzB,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM,CAAC;CAC/C,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM,CAAC;;CAE/C,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,MAAM,CAAC;CACzB,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM,CAAC;CAC/C,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM,CAAC;;CAE/C,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,MAAM,CAAC;CACzB,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM,CAAC;CAC/C,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM,CAAC;;CAE/C,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,SAAS,EAAE,YAAY;;CAExB,EAAE,IAAI,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAE7B,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC;CAC9C,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC;CAC9C,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC;;CAE9C,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,eAAe,EAAE,WAAW,OAAO,GAAG;;CAEvC,EAAE,OAAO,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;;CAEvE,EAAE;;CAEF,CAAC,kBAAkB,EAAE,WAAW,CAAC,GAAG;;CAEpC,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAExB,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;CAClB,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;CAClB,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;CAClB,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;CAClB,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;CAClB,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;CAClB,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;CAClB,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;CAClB,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;;CAElB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,cAAc,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,GAAG;;CAE/D,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;CAC/B,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;;CAE/B,EAAE,IAAI,CAAC,GAAG;CACV,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE;CACvD,GAAG,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE;CAC3D,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;CACV,GAAG,CAAC;;CAEJ,EAAE;;CAEF,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,GAAG;;CAE5B,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAEzB,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;CAC9C,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;;CAE9C,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,KAAK,GAAG;;CAE5B,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;CAC5B,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;;CAE5B,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAEzB,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;CAClD,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;;CAElD,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;CAC9B,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;CAC9B,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;;CAE9B,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;CAChC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;CAChC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;;CAEhC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,EAAE,GAAG;;CAEhC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAEzB,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;CAC5E,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;;CAE5E,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,MAAM,GAAG;;CAE7B,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;CACzB,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC;;CAE3B,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEjC,GAAG,KAAK,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,GAAG,OAAO,KAAK,CAAC;;CAE3C,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,SAAS,EAAE,WAAW,KAAK,EAAE,MAAM,GAAG;;CAEvC,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG,MAAM,GAAG,CAAC,CAAC;;CAEzC,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEjC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC;;CAE5C,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,OAAO,EAAE,WAAW,KAAK,EAAE,MAAM,GAAG;;CAErC,EAAE,KAAK,KAAK,KAAK,SAAS,GAAG,KAAK,GAAG,EAAE,CAAC;CACxC,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG,MAAM,GAAG,CAAC,CAAC;;CAEzC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAEzB,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;CAC5B,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;CAChC,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;;CAEhC,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;CAChC,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;CAChC,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;;CAEhC,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;CAChC,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;CAChC,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;;CAEhC,EAAE,OAAO,KAAK,CAAC;;CAEf,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;;CAEA,IAAI,SAAS,GAAG,CAAC,CAAC;;CAElB,SAAS,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,GAAG;;CAE3G,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,GAAG,EAAE,EAAE,CAAC;;CAE9D,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;;CAElC,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;;CAEhB,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,KAAK,SAAS,GAAG,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC;CAClE,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;;CAEnB,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,KAAK,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC;;CAE1E,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,KAAK,SAAS,GAAG,KAAK,GAAG,mBAAmB,CAAC;CAChE,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,KAAK,SAAS,GAAG,KAAK,GAAG,mBAAmB,CAAC;;CAEhE,CAAC,IAAI,CAAC,SAAS,GAAG,SAAS,KAAK,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC;CACrE,CAAC,IAAI,CAAC,SAAS,GAAG,SAAS,KAAK,SAAS,GAAG,SAAS,GAAG,wBAAwB,CAAC;;CAEjF,CAAC,IAAI,CAAC,UAAU,GAAG,UAAU,KAAK,SAAS,GAAG,UAAU,GAAG,CAAC,CAAC;;CAE7D,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,KAAK,SAAS,GAAG,MAAM,GAAG,UAAU,CAAC;CAC1D,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,KAAK,SAAS,GAAG,IAAI,GAAG,gBAAgB,CAAC;;CAE1D,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CACnC,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CACnC,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CACnC,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;;CAEnB,CAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;CAC9B,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE7B,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;CAC7B,CAAC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;CAC/B,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;CACnB,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;;CAE1B;CACA;CACA;CACA;CACA,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,KAAK,SAAS,GAAG,QAAQ,GAAG,cAAc,CAAC;;CAEpE,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;CAClB,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;;CAEtB,CAAC;;CAED,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;CAClC,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;;CAEpC,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,SAAS,EAAE,EAAE;;CAE/E,CAAC,WAAW,EAAE,OAAO;;CAErB,CAAC,SAAS,EAAE,IAAI;;CAEhB,CAAC,YAAY,EAAE,YAAY;;CAE3B,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;;CAExI,EAAE;;CAEF,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7C,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,MAAM,GAAG;;CAE3B,EAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;;CAE1B,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;CAC5B,EAAE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;;CAE3C,EAAE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;;CAEhC,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;CAC5B,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;;CAE5B,EAAE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;CACpC,EAAE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;;CAEpC,EAAE,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;;CAEtC,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;CAC9B,EAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;;CAE1B,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;CACpC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;CACpC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;CACpC,EAAE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;;CAElC,EAAE,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;CAClD,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;;CAEpC,EAAE,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;CAChD,EAAE,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;CAClD,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;CAC5B,EAAE,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;CAChD,EAAE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;;CAElC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,IAAI,GAAG;;CAE3B,EAAE,IAAI,YAAY,KAAK,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;;CAExE,EAAE,KAAK,EAAE,YAAY,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,SAAS,GAAG;;CAEpE,GAAG,OAAO,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;;CAErC,GAAG;;CAEH,EAAE,SAAS,UAAU,EAAE,KAAK,GAAG;;CAE/B,GAAG,IAAI,MAAM,CAAC;;CAEd,GAAG,KAAK,KAAK,YAAY,iBAAiB,GAAG;;CAE7C,IAAI,MAAM,GAAG,KAAK,CAAC;;CAEnB,IAAI,MAAM;;CAEV,IAAI,MAAM,GAAG,QAAQ,CAAC,eAAe,EAAE,8BAA8B,EAAE,QAAQ,EAAE,CAAC;CAClF,IAAI,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;CAC/B,IAAI,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;;CAEjC,IAAI,IAAI,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;;CAE5C,IAAI,KAAK,KAAK,YAAY,SAAS,GAAG;;CAEtC,KAAK,OAAO,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEzC,KAAK,MAAM;;CAEX,KAAK,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;;CAEjE,KAAK;;CAEL,IAAI;;CAEJ,GAAG,KAAK,MAAM,CAAC,KAAK,GAAG,IAAI,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,GAAG;;CAEtD,IAAI,OAAO,MAAM,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC;;CAEjD,IAAI,MAAM;;CAEV,IAAI,OAAO,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC;;CAE3C,IAAI;;CAEJ,GAAG;;CAEH,EAAE,IAAI,MAAM,GAAG;;CAEf,GAAG,QAAQ,EAAE;CACb,IAAI,OAAO,EAAE,GAAG;CAChB,IAAI,IAAI,EAAE,SAAS;CACnB,IAAI,SAAS,EAAE,gBAAgB;CAC/B,IAAI;;CAEJ,GAAG,IAAI,EAAE,IAAI,CAAC,IAAI;CAClB,GAAG,IAAI,EAAE,IAAI,CAAC,IAAI;;CAElB,GAAG,OAAO,EAAE,IAAI,CAAC,OAAO;;CAExB,GAAG,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE;CAC3C,GAAG,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE;CAC3C,GAAG,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE;CAC3C,GAAG,QAAQ,EAAE,IAAI,CAAC,QAAQ;;CAE1B,GAAG,IAAI,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;;CAEnC,GAAG,MAAM,EAAE,IAAI,CAAC,MAAM;CACtB,GAAG,SAAS,EAAE,IAAI,CAAC,SAAS;CAC5B,GAAG,SAAS,EAAE,IAAI,CAAC,SAAS;CAC5B,GAAG,UAAU,EAAE,IAAI,CAAC,UAAU;;CAE9B,GAAG,KAAK,EAAE,IAAI,CAAC,KAAK;;CAEpB,GAAG,CAAC;;CAEJ,EAAE,KAAK,IAAI,CAAC,KAAK,KAAK,SAAS,GAAG;;CAElC;;CAEA,GAAG,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;;CAE1B,GAAG,KAAK,KAAK,CAAC,IAAI,KAAK,SAAS,GAAG;;CAEnC,IAAI,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;;CAEtC,IAAI;;CAEJ,GAAG,KAAK,EAAE,YAAY,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,SAAS,GAAG;;CAEpE,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG;CAChC,KAAK,IAAI,EAAE,KAAK,CAAC,IAAI;CACrB,KAAK,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE;CAC7B,KAAK,CAAC;;CAEN,IAAI;;CAEJ,GAAG,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;;CAE7B,GAAG;;CAEH,EAAE,KAAK,EAAE,YAAY,GAAG;;CAExB,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC;;CAEvC,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC;;CAEhB,EAAE;;CAEF,CAAC,OAAO,EAAE,YAAY;;CAEtB,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;;CAE5C,EAAE;;CAEF,CAAC,WAAW,EAAE,WAAW,EAAE,GAAG;;CAE9B,EAAE,KAAK,IAAI,CAAC,OAAO,KAAK,SAAS,GAAG,OAAO;;CAE3C,EAAE,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAEjC,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG;;CAE9B,GAAG,SAAS,IAAI,CAAC,KAAK;;CAEtB,IAAI,KAAK,cAAc;;CAEvB,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;CACtC,KAAK,MAAM;;CAEX,IAAI,KAAK,mBAAmB;;CAE5B,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAC7B,KAAK,MAAM;;CAEX,IAAI,KAAK,sBAAsB;;CAE/B,KAAK,KAAK,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG;;CAErD,MAAM,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;;CAEtC,MAAM,MAAM;;CAEZ,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;;CAEvC,MAAM;CACN,KAAK,MAAM;;CAEX,IAAI;;CAEJ,GAAG;;CAEH,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG;;CAE9B,GAAG,SAAS,IAAI,CAAC,KAAK;;CAEtB,IAAI,KAAK,cAAc;;CAEvB,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;CACtC,KAAK,MAAM;;CAEX,IAAI,KAAK,mBAAmB;;CAE5B,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAC7B,KAAK,MAAM;;CAEX,IAAI,KAAK,sBAAsB;;CAE/B,KAAK,KAAK,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG;;CAErD,MAAM,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;;CAEtC,MAAM,MAAM;;CAEZ,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;;CAEvC,MAAM;CACN,KAAK,MAAM;;CAEX,IAAI;;CAEJ,GAAG;;CAEH,EAAE,KAAK,IAAI,CAAC,KAAK,GAAG;;CAEpB,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;;CAEnB,GAAG;;CAEH,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,SAAS,EAAE,aAAa,EAAE;;CAEzD,CAAC,GAAG,EAAE,WAAW,KAAK,GAAG;;CAEzB,EAAE,KAAK,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC;;CAExC,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;CAE/B,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;CACjB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;CACjB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;CACjB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,SAAS,KAAK,CAAC,GAAG,CAAC,CAAC;;CAEtC,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE;;CAElC,CAAC,SAAS,EAAE,IAAI;;CAEhB,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;CAE9B,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;CACb,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;CACb,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;CACb,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;;CAEb,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,SAAS,EAAE,WAAW,MAAM,GAAG;;CAEhC,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;CAClB,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;CAClB,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;CAClB,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;;CAElB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG;;CAEtB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;;CAEb,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG;;CAEtB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;;CAEb,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG;;CAEtB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;;CAEb,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG;;CAEtB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;;CAEb,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,YAAY,EAAE,WAAW,KAAK,EAAE,KAAK,GAAG;;CAEzC,EAAE,SAAS,KAAK;;CAEhB,GAAG,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM;CACjC,GAAG,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM;CACjC,GAAG,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM;CACjC,GAAG,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM;CACjC,GAAG,SAAS,MAAM,IAAI,KAAK,EAAE,yBAAyB,GAAG,KAAK,EAAE,CAAC;;CAEjE,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,YAAY,EAAE,WAAW,KAAK,GAAG;;CAElC,EAAE,SAAS,KAAK;;CAEhB,GAAG,KAAK,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC;CACzB,GAAG,KAAK,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC;CACzB,GAAG,KAAK,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC;CACzB,GAAG,KAAK,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC;CACzB,GAAG,SAAS,MAAM,IAAI,KAAK,EAAE,yBAAyB,GAAG,KAAK,EAAE,CAAC;;CAEjE,GAAG;;CAEH,EAAE;;CAEF,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;;CAEhE,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG;;CAEtB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACf,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACf,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACf,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;;CAE3C,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,CAAC,GAAG;;CAExB,EAAE,KAAK,CAAC,KAAK,SAAS,GAAG;;CAEzB,GAAG,OAAO,CAAC,IAAI,EAAE,uFAAuF,EAAE,CAAC;CAC3G,GAAG,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAElC,GAAG;;CAEH,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;CAChB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;CAChB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;CAChB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;CAEhB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG;;CAE3B,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;CACd,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;CACd,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;CACd,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;;CAEd,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,CAAC,GAAG;;CAE/B,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACrB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACrB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACrB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;CAErB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,eAAe,EAAE,WAAW,CAAC,EAAE,CAAC,GAAG;;CAEpC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;CACpB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;CACpB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;CACpB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;;CAEpB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,CAAC,GAAG;;CAExB,EAAE,KAAK,CAAC,KAAK,SAAS,GAAG;;CAEzB,GAAG,OAAO,CAAC,IAAI,EAAE,uFAAuF,EAAE,CAAC;CAC3G,GAAG,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAElC,GAAG;;CAEH,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;CAChB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;CAChB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;CAChB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;CAEhB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG;;CAE3B,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;CACd,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;CACd,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;CACd,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;;CAEd,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,CAAC,GAAG;;CAE/B,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACrB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACrB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACrB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;CAErB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,cAAc,EAAE,WAAW,MAAM,GAAG;;CAErC,EAAE,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC;CACnB,EAAE,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC;CACnB,EAAE,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC;CACnB,EAAE,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC;;CAEnB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,YAAY,EAAE,WAAW,CAAC,GAAG;;CAE9B,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;CACrD,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;;CAErB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;CAC9D,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;CAC9D,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;CAC/D,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;;CAE/D,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,YAAY,EAAE,WAAW,MAAM,GAAG;;CAEnC,EAAE,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC;;CAE3C,EAAE;;CAEF,CAAC,0BAA0B,EAAE,WAAW,CAAC,GAAG;;CAE5C;;CAEA;;CAEA,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;;CAEhC,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;;CAErC,EAAE,KAAK,CAAC,GAAG,MAAM,GAAG;;CAEpB,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;CACd,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;CACd,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;;CAEd,GAAG,MAAM;;CAET,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;CACpB,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;CACpB,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;;CAEpB,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,8BAA8B,EAAE,WAAW,CAAC,GAAG;;CAEhD;;CAEA;;CAEA,EAAE,IAAI,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CACpB,GAAG,OAAO,GAAG,IAAI;CACjB,GAAG,QAAQ,GAAG,GAAG;;CAEjB,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ;;CAElB,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE;CAC9C,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE;CAC9C,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;;CAEhD,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,OAAO;CACxC,SAAS,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,OAAO,EAAE;CAC1C,SAAS,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG;;CAE7C;CACA;CACA;;CAEA,GAAG,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,QAAQ;CAC1C,UAAU,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,QAAQ,EAAE;CAC5C,UAAU,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,QAAQ,EAAE;CAC5C,UAAU,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,GAAG,QAAQ,EAAE,GAAG;;CAEzD;;CAEA,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE3B,IAAI,OAAO,IAAI,CAAC;;CAEhB,IAAI;;CAEJ;;CAEA,GAAG,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC;;CAEnB,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;CAC5B,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;CAC5B,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;CAC5B,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC;CAC9B,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC;CAC9B,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC;;CAE9B,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,GAAG;;CAErC;;CAEA,IAAI,KAAK,EAAE,GAAG,OAAO,GAAG;;CAExB,KAAK,CAAC,GAAG,CAAC,CAAC;CACX,KAAK,CAAC,GAAG,WAAW,CAAC;CACrB,KAAK,CAAC,GAAG,WAAW,CAAC;;CAErB,KAAK,MAAM;;CAEX,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;CACzB,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;CAChB,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;;CAEhB,KAAK;;CAEL,IAAI,MAAM,KAAK,EAAE,GAAG,EAAE,GAAG;;CAEzB;;CAEA,IAAI,KAAK,EAAE,GAAG,OAAO,GAAG;;CAExB,KAAK,CAAC,GAAG,WAAW,CAAC;CACrB,KAAK,CAAC,GAAG,CAAC,CAAC;CACX,KAAK,CAAC,GAAG,WAAW,CAAC;;CAErB,KAAK,MAAM;;CAEX,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;CACzB,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;CAChB,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;;CAEhB,KAAK;;CAEL,IAAI,MAAM;;CAEV;;CAEA,IAAI,KAAK,EAAE,GAAG,OAAO,GAAG;;CAExB,KAAK,CAAC,GAAG,WAAW,CAAC;CACrB,KAAK,CAAC,GAAG,WAAW,CAAC;CACrB,KAAK,CAAC,GAAG,CAAC,CAAC;;CAEX,KAAK,MAAM;;CAEX,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;CACzB,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;CAChB,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;;CAEhB,KAAK;;CAEL,IAAI;;CAEJ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;;CAE9B,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG;;CAEH;;CAEA,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,EAAE;CAClD,qBAAqB,EAAE,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,EAAE;CAClD,qBAAqB,EAAE,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC;;CAErD,EAAE,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;;CAErC;CACA;;CAEA,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC;CAC7B,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC;CAC7B,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC;CAC7B,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;;CAEpD,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG;;CAErB,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;CACnC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;CACnC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;CACnC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;;CAEnC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG;;CAErB,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;CACnC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;CACnC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;CACnC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;;CAEnC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,KAAK,EAAE,WAAW,GAAG,EAAE,GAAG,GAAG;;CAE9B;;CAEA,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;CACxD,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;CACxD,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;CACxD,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;;CAExD,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,WAAW,EAAE,YAAY;;CAE1B,EAAE,IAAI,GAAG,EAAE,GAAG,CAAC;;CAEf,EAAE,OAAO,SAAS,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG;;CAEhD,GAAG,KAAK,GAAG,KAAK,SAAS,GAAG;;CAE5B,IAAI,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC;CACxB,IAAI,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC;;CAExB,IAAI;;CAEJ,GAAG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;CAC7C,GAAG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;;CAE7C,GAAG,OAAO,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAEjC,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,WAAW,EAAE,WAAW,GAAG,EAAE,GAAG,GAAG;;CAEpC,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;;CAE7B,EAAE,OAAO,IAAI,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;CAErG,EAAE;;CAEF,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CAChC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CAChC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CAChC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;;CAEhC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,IAAI,EAAE,YAAY;;CAEnB,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CAC/B,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CAC/B,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CAC/B,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;;CAE/B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CAChC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CAChC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CAChC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;;CAEhC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,WAAW,EAAE,YAAY;;CAE1B,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CACvE,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CACvE,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CACvE,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;;CAEvE,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,YAAY;;CAErB,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;CACpB,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;CACpB,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;CACpB,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;;CAEpB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG;;CAErB,EAAE,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;CAEnE,EAAE;;CAEF,CAAC,QAAQ,EAAE,YAAY;;CAEvB,EAAE,OAAO,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;;CAE/E,EAAE;;CAEF,CAAC,MAAM,EAAE,YAAY;;CAErB,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC;;CAE5F,EAAE;;CAEF,CAAC,eAAe,EAAE,YAAY;;CAE9B,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;;CAE3F,EAAE;;CAEF,CAAC,SAAS,EAAE,YAAY;;CAExB,EAAE,OAAO,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;;CAEjD,EAAE;;CAEF,CAAC,SAAS,EAAE,WAAW,MAAM,GAAG;;CAEhC,EAAE,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC;;CAEnD,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,KAAK,GAAG;;CAE7B,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC;CACrC,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC;CACrC,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC;CACrC,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC;;CAErC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG;;CAEzC,EAAE,OAAO,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC;;CAErE,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG;;CAExB,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,GAAG;;CAElG,EAAE;;CAEF,CAAC,SAAS,EAAE,WAAW,KAAK,EAAE,MAAM,GAAG;;CAEvC,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG,MAAM,GAAG,CAAC,CAAC;;CAEzC,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,CAAC;CAC3B,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;CAC/B,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;CAC/B,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;;CAE/B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,OAAO,EAAE,WAAW,KAAK,EAAE,MAAM,GAAG;;CAErC,EAAE,KAAK,KAAK,KAAK,SAAS,GAAG,KAAK,GAAG,EAAE,CAAC;CACxC,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG,MAAM,GAAG,CAAC,CAAC;;CAEzC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;CAC3B,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;CAC/B,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;CAC/B,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;;CAE/B,EAAE,OAAO,KAAK,CAAC;;CAEf,EAAE;;CAEF,CAAC,mBAAmB,EAAE,WAAW,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG;;CAE5D,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,OAAO,CAAC,IAAI,EAAE,qEAAqE,EAAE,CAAC;;CAEzF,GAAG;;CAEH,EAAE,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;CACnC,EAAE,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;CACnC,EAAE,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;CACnC,EAAE,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;;CAEnC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;;CAEA;CACA;CACA;CACA;CACA;CACA,SAAS,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAG;;CAErD,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;CACpB,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;;CAEtB,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;CACnD,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;;CAE1B,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;;CAEpD,CAAC,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;;CAEzB,CAAC,KAAK,OAAO,CAAC,SAAS,KAAK,SAAS,GAAG,OAAO,CAAC,SAAS,GAAG,YAAY,CAAC;;CAEzE,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;;CAE5L,CAAC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,KAAK,SAAS,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;CACnF,CAAC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,KAAK,SAAS,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;CACzF,CAAC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,KAAK,SAAS,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;;CAEtF,CAAC;;CAED,iBAAiB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,SAAS,EAAE,EAAE;;CAEzF,CAAC,WAAW,EAAE,iBAAiB;;CAE/B,CAAC,mBAAmB,EAAE,IAAI;;CAE1B,CAAC,OAAO,EAAE,WAAW,KAAK,EAAE,MAAM,GAAG;;CAErC,EAAE,KAAK,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,GAAG;;CAExD,GAAG,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;CACtB,GAAG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;;CAExB,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;;CAElB,GAAG;;CAEH,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;CAC3C,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;;CAE1C,EAAE;;CAEF,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7C,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,MAAM,GAAG;;CAE3B,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;CAC5B,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;;CAE9B,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;;CAExC,EAAE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;;CAExC,EAAE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;CACxC,EAAE,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;CAC5C,EAAE,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;;CAE1C,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,OAAO,EAAE,YAAY;;CAEtB,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;;CAE5C,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,qBAAqB,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAG;;CAEzD,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;;CAExD,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;CACzB,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;;CAE5B,CAAC;;CAED,qBAAqB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,SAAS,EAAE,CAAC;CAC/E,qBAAqB,CAAC,SAAS,CAAC,WAAW,GAAG,qBAAqB,CAAC;;CAEpE,qBAAqB,CAAC,SAAS,CAAC,uBAAuB,GAAG,IAAI,CAAC;;CAE/D;CACA;CACA;;CAEA,SAAS,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,GAAG;;CAE7H,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;;CAE7G,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;;CAE3D,CAAC,IAAI,CAAC,SAAS,GAAG,SAAS,KAAK,SAAS,GAAG,SAAS,GAAG,aAAa,CAAC;CACtE,CAAC,IAAI,CAAC,SAAS,GAAG,SAAS,KAAK,SAAS,GAAG,SAAS,GAAG,aAAa,CAAC;;CAEtE,CAAC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;CAC9B,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;CACpB,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;;CAE1B,CAAC;;CAED,WAAW,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;CAC3D,WAAW,CAAC,SAAS,CAAC,WAAW,GAAG,WAAW,CAAC;;CAEhD,WAAW,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC;;CAE3C;CACA;CACA;CACA;;CAEA,SAAS,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG;;CAE1B,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,GAAG,KAAK,SAAS,KAAK,GAAG,GAAG,IAAI,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,CAAC;CAC5F,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,GAAG,KAAK,SAAS,KAAK,GAAG,GAAG,IAAI,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,CAAC;;CAE5F,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE;;CAE/B,CAAC,MAAM,EAAE,IAAI;;CAEb,CAAC,GAAG,EAAE,WAAW,GAAG,EAAE,GAAG,GAAG;;CAE5B,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;CACvB,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;;CAEvB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,YAAY,EAAE,WAAW,KAAK,GAAG;;CAElC,EAAE,IAAI,IAAI,GAAG,EAAE,QAAQ,CAAC;CACxB,EAAE,IAAI,IAAI,GAAG,EAAE,QAAQ,CAAC;CACxB,EAAE,IAAI,IAAI,GAAG,EAAE,QAAQ,CAAC;;CAExB,EAAE,IAAI,IAAI,GAAG,EAAE,QAAQ,CAAC;CACxB,EAAE,IAAI,IAAI,GAAG,EAAE,QAAQ,CAAC;CACxB,EAAE,IAAI,IAAI,GAAG,EAAE,QAAQ,CAAC;;CAExB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;;CAErD,GAAG,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;CACtB,GAAG,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;CAC1B,GAAG,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;;CAE1B,GAAG,KAAK,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;CAC5B,GAAG,KAAK,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;CAC5B,GAAG,KAAK,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;;CAE5B,GAAG,KAAK,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;CAC5B,GAAG,KAAK,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;CAC5B,GAAG,KAAK,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;;CAE5B,GAAG;;CAEH,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;CACnC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEnC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,sBAAsB,EAAE,WAAW,SAAS,GAAG;;CAEhD,EAAE,IAAI,IAAI,GAAG,EAAE,QAAQ,CAAC;CACxB,EAAE,IAAI,IAAI,GAAG,EAAE,QAAQ,CAAC;CACxB,EAAE,IAAI,IAAI,GAAG,EAAE,QAAQ,CAAC;;CAExB,EAAE,IAAI,IAAI,GAAG,EAAE,QAAQ,CAAC;CACxB,EAAE,IAAI,IAAI,GAAG,EAAE,QAAQ,CAAC;CACxB,EAAE,IAAI,IAAI,GAAG,EAAE,QAAQ,CAAC;;CAExB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEtD,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;CAC/B,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;CAC/B,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;;CAE/B,GAAG,KAAK,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;CAC5B,GAAG,KAAK,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;CAC5B,GAAG,KAAK,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;;CAE5B,GAAG,KAAK,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;CAC5B,GAAG,KAAK,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;CAC5B,GAAG,KAAK,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;;CAE5B,GAAG;;CAEH,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;CACnC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEnC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,aAAa,EAAE,WAAW,MAAM,GAAG;;CAEpC,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;;CAEnB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEtD,GAAG,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;;CAErC,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,oBAAoB,EAAE,YAAY;;CAEnC,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,OAAO,SAAS,oBAAoB,EAAE,MAAM,EAAE,IAAI,GAAG;;CAEvD,GAAG,IAAI,QAAQ,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC;;CAExD,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;CAC3C,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;;CAE3C,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,aAAa,EAAE,WAAW,MAAM,GAAG;;CAEpC,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;;CAEnB,EAAE,OAAO,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC;;CAEvC,EAAE;;CAEF,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7C,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,GAAG,GAAG;;CAExB,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;CAC3B,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;;CAE3B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,SAAS,EAAE,YAAY;;CAExB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC;CACpD,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC;;CAEpD,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,OAAO,EAAE,YAAY;;CAEtB;;CAEA,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;;CAEnG,EAAE;;CAEF,CAAC,SAAS,EAAE,WAAW,MAAM,GAAG;;CAEhC,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,OAAO,CAAC,IAAI,EAAE,iDAAiD,EAAE,CAAC;CACrE,GAAG,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE1B,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC;;CAEhH,EAAE;;CAEF,CAAC,OAAO,EAAE,WAAW,MAAM,GAAG;;CAE9B,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,OAAO,CAAC,IAAI,EAAE,+CAA+C,EAAE,CAAC;CACnE,GAAG,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE1B,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;;CAE1F,EAAE;;CAEF,CAAC,aAAa,EAAE,WAAW,KAAK,GAAG;;CAEnC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;CACxB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;;CAExB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,cAAc,EAAE,WAAW,MAAM,GAAG;;CAErC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC;CACzB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC;;CAEzB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,cAAc,EAAE,WAAW,MAAM,GAAG;;CAErC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC;CACjC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;;CAE/B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,cAAc,EAAE,YAAY;;CAE7B;CACA;;CAEA,EAAE,IAAI,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;;CAElB,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,SAAS,QAAQ,EAAE,IAAI,GAAG;;CAE5B,GAAG,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAEhC,GAAG,KAAK,QAAQ,KAAK,SAAS,GAAG;;CAEjC,IAAI,KAAK,QAAQ,CAAC,UAAU,GAAG;;CAE/B,KAAK,IAAI,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;;CAEtC,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAErD,MAAM,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;CAC/B,MAAM,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;;CAE1C,MAAM,KAAK,CAAC,aAAa,EAAE,EAAE,EAAE,CAAC;;CAEhC,MAAM;;CAEN,KAAK,MAAM,KAAK,QAAQ,CAAC,gBAAgB,GAAG;;CAE5C,KAAK,IAAI,SAAS,GAAG,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;;CAElD,KAAK,KAAK,SAAS,KAAK,SAAS,GAAG;;CAEpC,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEtD,OAAO,EAAE,CAAC,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;;CAE/E,OAAO,KAAK,CAAC,aAAa,EAAE,EAAE,EAAE,CAAC;;CAEjC,OAAO;;CAEP,MAAM;;CAEN,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH,EAAE,OAAO,SAAS,cAAc,EAAE,MAAM,GAAG;;CAE3C,GAAG,KAAK,GAAG,IAAI,CAAC;;CAEhB,GAAG,MAAM,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;;CAEpC,GAAG,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC;;CAE/B,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,aAAa,EAAE,WAAW,KAAK,GAAG;;CAEnC,EAAE,OAAO,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;CACrD,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;CAC/C,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC;;CAE/D,EAAE;;CAEF,CAAC,WAAW,EAAE,WAAW,GAAG,GAAG;;CAE/B,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;CAC3D,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;CACrD,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;;CAEtD,EAAE;;CAEF,CAAC,YAAY,EAAE,WAAW,KAAK,EAAE,MAAM,GAAG;;CAE1C;CACA;;CAEA,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,OAAO,CAAC,IAAI,EAAE,oDAAoD,EAAE,CAAC;CACxE,GAAG,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE1B,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC,GAAG;CACnB,GAAG,EAAE,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;CACzD,GAAG,EAAE,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;CACzD,GAAG,EAAE,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;CACzD,GAAG,CAAC;;CAEJ,EAAE;;CAEF,CAAC,aAAa,EAAE,WAAW,GAAG,GAAG;;CAEjC;CACA,EAAE,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;CACzD,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;CACnD,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC;;CAEnE,EAAE;;CAEF,CAAC,gBAAgB,EAAE,EAAE,YAAY;;CAEjC,EAAE,IAAI,YAAY,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEnC,EAAE,OAAO,SAAS,gBAAgB,EAAE,MAAM,GAAG;;CAE7C;CACA,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC;;CAElD;CACA,GAAG,OAAO,YAAY,CAAC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;;CAE/F,GAAG,CAAC;;CAEJ,EAAE,IAAI;;CAEN,CAAC,eAAe,EAAE,WAAW,KAAK,GAAG;;CAErC;CACA;;CAEA,EAAE,IAAI,GAAG,EAAE,GAAG,CAAC;;CAEf,EAAE,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG;;CAE5B,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;CACrC,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;;CAErC,GAAG,MAAM;;CAET,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;CACrC,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;;CAErC,GAAG;;CAEH,EAAE,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG;;CAE5B,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;CACtC,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;;CAEtC,GAAG,MAAM;;CAET,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;CACtC,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;;CAEtC,GAAG;;CAEH,EAAE,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG;;CAE5B,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;CACtC,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;;CAEtC,GAAG,MAAM;;CAET,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;CACtC,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;;CAEtC,GAAG;;CAEH,EAAE,SAAS,GAAG,IAAI,KAAK,CAAC,QAAQ,IAAI,GAAG,IAAI,KAAK,CAAC,QAAQ,GAAG;;CAE5D,EAAE;;CAEF,CAAC,kBAAkB,EAAE,EAAE,YAAY;;CAEnC;CACA,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CACzB,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CACzB,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB;CACA,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CACzB,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CACzB,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,IAAI,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE/B,EAAE,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;CAC7B,EAAE,IAAI,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE9B,EAAE,IAAI,cAAc,GAAG,IAAI,OAAO,EAAE,CAAC;;CAErC,EAAE,SAAS,UAAU,EAAE,IAAI,GAAG;;CAE9B,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;;CAEZ,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;;CAEtD,IAAI,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;CAClC;CACA,IAAI,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;CACzH;CACA,IAAI,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;CAChC,IAAI,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;CAChC,IAAI,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;CAChC;CACA,IAAI,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG;;CAE5E;CACA;CACA,KAAK,OAAO,KAAK,CAAC;;CAElB,KAAK;;CAEL,IAAI;;CAEJ,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG;;CAEH,EAAE,OAAO,SAAS,kBAAkB,EAAE,QAAQ,GAAG;;CAEjD,GAAG,KAAK,IAAI,CAAC,OAAO,EAAE,GAAG;;CAEzB,IAAI,OAAO,KAAK,CAAC;;CAEjB,IAAI;;CAEJ;CACA,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;CAC5B,GAAG,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC;;CAE1C;CACA,GAAG,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;CACvC,GAAG,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;CACvC,GAAG,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;;CAEvC;CACA,GAAG,EAAE,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;CAC3B,GAAG,EAAE,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;CAC3B,GAAG,EAAE,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;;CAE3B;CACA;CACA;CACA,GAAG,IAAI,IAAI,GAAG;CACd,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;CACrD,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;CACrD,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;CACrD,IAAI,CAAC;CACL,GAAG,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG;;CAE/B,IAAI,OAAO,KAAK,CAAC;;CAEjB,IAAI;;CAEJ;CACA,GAAG,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CACxC,GAAG,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG;;CAE/B,IAAI,OAAO,KAAK,CAAC;;CAEjB,IAAI;;CAEJ;CACA;CACA,GAAG,cAAc,CAAC,YAAY,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;CACzC,GAAG,IAAI,GAAG,EAAE,cAAc,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;CACnE,GAAG,OAAO,UAAU,EAAE,IAAI,EAAE,CAAC;;CAE7B,GAAG,CAAC;;CAEJ,EAAE,IAAI;;CAEN,CAAC,UAAU,EAAE,WAAW,KAAK,EAAE,MAAM,GAAG;;CAExC,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,OAAO,CAAC,IAAI,EAAE,kDAAkD,EAAE,CAAC;CACtE,GAAG,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE1B,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;;CAE1D,EAAE;;CAEF,CAAC,eAAe,EAAE,YAAY;;CAE9B,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,OAAO,SAAS,eAAe,EAAE,KAAK,GAAG;;CAE3C,GAAG,IAAI,YAAY,GAAG,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;CACnE,GAAG,OAAO,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC;;CAE7C,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,iBAAiB,EAAE,YAAY;;CAEhC,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,OAAO,SAAS,iBAAiB,EAAE,MAAM,GAAG;;CAE9C,GAAG,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE/B,IAAI,OAAO,CAAC,IAAI,EAAE,yDAAyD,EAAE,CAAC;CAC9E,IAAI,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;;CAE1B,IAAI;;CAEJ,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;;CAEnC,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC;;CAErD,GAAG,OAAO,MAAM,CAAC;;CAEjB,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,SAAS,EAAE,WAAW,GAAG,GAAG;;CAE7B,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;CAC1B,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;;CAE1B;CACA,EAAE,KAAK,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;;CAEzC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,KAAK,EAAE,WAAW,GAAG,GAAG;;CAEzB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;CAC1B,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;;CAE1B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,YAAY,EAAE,YAAY;;CAE3B,EAAE,IAAI,MAAM,GAAG;CACf,GAAG,IAAI,OAAO,EAAE;CAChB,GAAG,IAAI,OAAO,EAAE;CAChB,GAAG,IAAI,OAAO,EAAE;CAChB,GAAG,IAAI,OAAO,EAAE;CAChB,GAAG,IAAI,OAAO,EAAE;CAChB,GAAG,IAAI,OAAO,EAAE;CAChB,GAAG,IAAI,OAAO,EAAE;CAChB,GAAG,IAAI,OAAO,EAAE;CAChB,GAAG,CAAC;;CAEJ,EAAE,OAAO,SAAS,YAAY,EAAE,MAAM,GAAG;;CAEzC;CACA,GAAG,KAAK,IAAI,CAAC,OAAO,EAAE,GAAG,OAAO,IAAI,CAAC;;CAErC;CACA,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;CAChF,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;CAChF,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;CAChF,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;CAChF,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;CAChF,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;CAChF,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;CAChF,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;;CAEhF,GAAG,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC;;CAEhC,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,SAAS,EAAE,WAAW,MAAM,GAAG;;CAEhC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC;CACzB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC;;CAEzB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,GAAG,GAAG;;CAE1B,EAAE,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;;CAElE,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;;CAEA,SAAS,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;;CAElC,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,MAAM,KAAK,SAAS,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;CACjE,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,MAAM,KAAK,SAAS,KAAK,MAAM,GAAG,CAAC,CAAC;;CAErD,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE;;CAEjC,CAAC,GAAG,EAAE,WAAW,MAAM,EAAE,MAAM,GAAG;;CAElC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;CAC7B,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;;CAEvB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,aAAa,EAAE,YAAY;;CAE5B,EAAE,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;;CAEvB,EAAE,OAAO,SAAS,aAAa,EAAE,MAAM,EAAE,cAAc,GAAG;;CAE1D,GAAG,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;CAE5B,GAAG,KAAK,cAAc,KAAK,SAAS,GAAG;;CAEvC,IAAI,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC;;CAElC,IAAI,MAAM;;CAEV,IAAI,GAAG,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;;CAEpD,IAAI;;CAEJ,GAAG,IAAI,WAAW,GAAG,CAAC,CAAC;;CAEvB,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEvD,IAAI,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;;CAEnF,IAAI;;CAEJ,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC;;CAE1C,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7C,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,MAAM,GAAG;;CAE3B,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;CACpC,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;;CAE9B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,SAAS,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG;;CAE9B,EAAE;;CAEF,CAAC,aAAa,EAAE,WAAW,KAAK,GAAG;;CAEnC,EAAE,SAAS,KAAK,CAAC,iBAAiB,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG;;CAErF,EAAE;;CAEF,CAAC,eAAe,EAAE,WAAW,KAAK,GAAG;;CAErC,EAAE,SAAS,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG;;CAE3D,EAAE;;CAEF,CAAC,gBAAgB,EAAE,WAAW,MAAM,GAAG;;CAEvC,EAAE,IAAI,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;;CAE9C,EAAE,OAAO,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,SAAS,GAAG,SAAS,EAAE,CAAC;;CAErF,EAAE;;CAEF,CAAC,aAAa,EAAE,WAAW,GAAG,GAAG;;CAEjC,EAAE,OAAO,GAAG,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC;;CAEtC,EAAE;;CAEF,CAAC,eAAe,EAAE,WAAW,KAAK,GAAG;;CAErC,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC;;CAEzE,EAAE;;CAEF,CAAC,UAAU,EAAE,WAAW,KAAK,EAAE,MAAM,GAAG;;CAExC,EAAE,IAAI,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,KAAK,EAAE,CAAC;;CAE7D,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,OAAO,CAAC,IAAI,EAAE,oDAAoD,EAAE,CAAC;CACxE,GAAG,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE1B,GAAG;;CAEH,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;;CAEvB,EAAE,KAAK,aAAa,KAAK,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG;;CAEvD,GAAG,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,CAAC;CACzC,GAAG,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAE3D,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC;;CAEhB,EAAE;;CAEF,CAAC,cAAc,EAAE,WAAW,MAAM,GAAG;;CAErC,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,OAAO,CAAC,IAAI,EAAE,wDAAwD,EAAE,CAAC;CAC5E,GAAG,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;;CAEvB,GAAG;;CAEH,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;CACzC,EAAE,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAEvC,EAAE,OAAO,MAAM,CAAC;;CAEhB,EAAE;;CAEF,CAAC,YAAY,EAAE,WAAW,MAAM,GAAG;;CAEnC,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;CACrC,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,iBAAiB,EAAE,CAAC;;CAEzD,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,SAAS,EAAE,WAAW,MAAM,GAAG;;CAEhC,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC;;CAE5B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,MAAM,GAAG;;CAE7B,EAAE,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;;CAElF,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAG;;CAEnC;;CAEA,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,MAAM,KAAK,SAAS,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC1E,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,QAAQ,KAAK,SAAS,KAAK,QAAQ,GAAG,CAAC,CAAC;;CAE3D,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE;;CAEhC,CAAC,GAAG,EAAE,WAAW,MAAM,EAAE,QAAQ,GAAG;;CAEpC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;CAC7B,EAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;;CAE3B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,aAAa,EAAE,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;CAExC,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC7B,EAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;;CAEpB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,6BAA6B,EAAE,WAAW,MAAM,EAAE,KAAK,GAAG;;CAE3D,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;CAC7B,EAAE,IAAI,CAAC,QAAQ,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAE7C,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,qBAAqB,EAAE,YAAY;;CAEpC,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CACzB,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,OAAO,SAAS,qBAAqB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;CAEnD,GAAG,IAAI,MAAM,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC;;CAEjF;;CAEA,GAAG,IAAI,CAAC,6BAA6B,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;;CAEnD,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7C,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,KAAK,GAAG;;CAE1B,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;CACnC,EAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;;CAEjC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,SAAS,EAAE,YAAY;;CAExB;;CAEA,EAAE,IAAI,mBAAmB,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;CACvD,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,mBAAmB,EAAE,CAAC;CACpD,EAAE,IAAI,CAAC,QAAQ,IAAI,mBAAmB,CAAC;;CAEvC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,YAAY;;CAErB,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;CACvB,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;;CAEvB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,eAAe,EAAE,WAAW,KAAK,GAAG;;CAErC,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAElD,EAAE;;CAEF,CAAC,gBAAgB,EAAE,WAAW,MAAM,GAAG;;CAEvC,EAAE,OAAO,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC;;CAE/D,EAAE;;CAEF,CAAC,YAAY,EAAE,WAAW,KAAK,EAAE,MAAM,GAAG;;CAE1C,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,OAAO,CAAC,IAAI,EAAE,qDAAqD,EAAE,CAAC;CACzE,GAAG,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE1B,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;;CAEnG,EAAE;;CAEF,CAAC,aAAa,EAAE,YAAY;;CAE5B,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,OAAO,SAAS,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG;;CAEhD,GAAG,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE/B,IAAI,OAAO,CAAC,IAAI,EAAE,sDAAsD,EAAE,CAAC;CAC3E,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE3B,IAAI;;CAEJ,GAAG,IAAI,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC;;CAEpC,GAAG,IAAI,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC;;CAElD,GAAG,KAAK,WAAW,KAAK,CAAC,GAAG;;CAE5B;CACA,IAAI,KAAK,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG;;CAEpD,KAAK,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;;CAEtC,KAAK;;CAEL;CACA,IAAI,OAAO,SAAS,CAAC;;CAErB,IAAI;;CAEJ,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,WAAW,CAAC;;CAE7E,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;;CAEzB,IAAI,OAAO,SAAS,CAAC;;CAErB,IAAI;;CAEJ,GAAG,OAAO,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;;CAEzE,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,cAAc,EAAE,WAAW,IAAI,GAAG;;CAEnC;;CAEA,EAAE,IAAI,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;CACrD,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;;CAEjD,EAAE,OAAO,EAAE,SAAS,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,QAAQ,OAAO,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;;CAE9E,EAAE;;CAEF,CAAC,aAAa,EAAE,WAAW,GAAG,GAAG;;CAEjC,EAAE,OAAO,GAAG,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;;CAErC,EAAE;;CAEF,CAAC,gBAAgB,EAAE,WAAW,MAAM,GAAG;;CAEvC,EAAE,OAAO,MAAM,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;;CAExC,EAAE;;CAEF,CAAC,aAAa,EAAE,WAAW,MAAM,GAAG;;CAEpC,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,OAAO,CAAC,IAAI,EAAE,sDAAsD,EAAE,CAAC;CAC1E,GAAG,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE1B,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;;CAEtE,EAAE;;CAEF,CAAC,YAAY,EAAE,YAAY;;CAE3B,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CACzB,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,OAAO,SAAS,YAAY,EAAE,MAAM,EAAE,oBAAoB,GAAG;;CAE/D,GAAG,IAAI,YAAY,GAAG,oBAAoB,IAAI,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;;CAE3E,GAAG,IAAI,cAAc,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;;CAExE,GAAG,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC,SAAS,EAAE,CAAC;;CAErE,GAAG,IAAI,CAAC,QAAQ,GAAG,EAAE,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC;;CAElD,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,SAAS,EAAE,WAAW,MAAM,GAAG;;CAEhC,EAAE,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAE7C,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,KAAK,GAAG;;CAE5B,EAAE,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;;CAEpF,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;;CAEA,SAAS,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG;;CAE3C,CAAC,IAAI,CAAC,MAAM,GAAG;;CAEf,EAAE,EAAE,EAAE,KAAK,SAAS,KAAK,EAAE,GAAG,IAAI,KAAK,EAAE;CACzC,EAAE,EAAE,EAAE,KAAK,SAAS,KAAK,EAAE,GAAG,IAAI,KAAK,EAAE;CACzC,EAAE,EAAE,EAAE,KAAK,SAAS,KAAK,EAAE,GAAG,IAAI,KAAK,EAAE;CACzC,EAAE,EAAE,EAAE,KAAK,SAAS,KAAK,EAAE,GAAG,IAAI,KAAK,EAAE;CACzC,EAAE,EAAE,EAAE,KAAK,SAAS,KAAK,EAAE,GAAG,IAAI,KAAK,EAAE;CACzC,EAAE,EAAE,EAAE,KAAK,SAAS,KAAK,EAAE,GAAG,IAAI,KAAK,EAAE;;CAEzC,EAAE,CAAC;;CAEH,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE;;CAElC,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG;;CAE1C,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;CAE3B,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;CACzB,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;CACzB,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;CACzB,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;CACzB,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;CACzB,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;;CAEzB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7C,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,OAAO,GAAG;;CAE5B,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;CAE3B,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEjC,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE3C,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,aAAa,EAAE,WAAW,CAAC,GAAG;;CAE/B,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;CAC3B,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC;CACtB,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;CACjE,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;CACjE,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;CACrE,EAAE,IAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;;CAEzE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;CACzF,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;CACzF,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;CACzF,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;CACzF,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;CAC1F,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;;CAE1F,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,gBAAgB,EAAE,YAAY;;CAE/B,EAAE,IAAI,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;;CAE5B,EAAE,OAAO,SAAS,gBAAgB,EAAE,MAAM,GAAG;;CAE7C,GAAG,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;;CAElC,GAAG,KAAK,QAAQ,CAAC,cAAc,KAAK,IAAI;CACxC,IAAI,QAAQ,CAAC,qBAAqB,EAAE,CAAC;;CAErC,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,cAAc,EAAE;CACzC,KAAK,YAAY,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;;CAExC,GAAG,OAAO,IAAI,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAC;;CAE1C,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,gBAAgB,EAAE,YAAY;;CAE/B,EAAE,IAAI,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;;CAE5B,EAAE,OAAO,SAAS,gBAAgB,EAAE,MAAM,GAAG;;CAE7C,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAChC,GAAG,MAAM,CAAC,MAAM,GAAG,kBAAkB,CAAC;CACtC,GAAG,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;;CAE7C,GAAG,OAAO,IAAI,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAC;;CAE1C,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,gBAAgB,EAAE,WAAW,MAAM,GAAG;;CAEvC,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;CAC3B,EAAE,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;CAC7B,EAAE,IAAI,SAAS,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC;;CAElC,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEjC,GAAG,IAAI,QAAQ,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;;CAExD,GAAG,KAAK,QAAQ,GAAG,SAAS,GAAG;;CAE/B,IAAI,OAAO,KAAK,CAAC;;CAEjB,IAAI;;CAEJ,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,aAAa,EAAE,YAAY;;CAE5B,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE;CACxB,GAAG,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEtB,EAAE,OAAO,SAAS,aAAa,EAAE,GAAG,GAAG;;CAEvC,GAAG,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;CAE5B,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAElC,IAAI,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC;;CAE5B,IAAI,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;CACtD,IAAI,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;CACtD,IAAI,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;CACtD,IAAI,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;CACtD,IAAI,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;CACtD,IAAI,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;;CAEtD,IAAI,IAAI,EAAE,GAAG,KAAK,CAAC,eAAe,EAAE,EAAE,EAAE,CAAC;CACzC,IAAI,IAAI,EAAE,GAAG,KAAK,CAAC,eAAe,EAAE,EAAE,EAAE,CAAC;;CAEzC;;CAEA,IAAI,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG;;CAE5B,KAAK,OAAO,KAAK,CAAC;;CAElB,KAAK;;CAEL,IAAI;;CAEJ,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,aAAa,EAAE,WAAW,KAAK,GAAG;;CAEnC,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;CAE3B,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEjC,GAAG,KAAK,MAAM,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG;;CAEnD,IAAI,OAAO,KAAK,CAAC;;CAEjB,IAAI;;CAEJ,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,IAAI,iBAAiB,GAAG,kFAAkF,CAAC;;CAE3G,IAAI,sBAAsB,GAAG,8DAA8D,CAAC;;CAE5F,IAAI,kBAAkB,GAAG,0EAA0E,CAAC;;CAEpG,IAAI,cAAc,GAAG,4aAA4a,CAAC;;CAElc,IAAI,mBAAmB,GAAG,uFAAuF,CAAC;;CAElH,IAAI,YAAY,GAAG,0CAA0C,CAAC;;CAE9D,IAAI,kBAAkB,GAAG,yCAAyC,CAAC;;CAEnE,IAAI,KAAK,GAAG,o7LAAo7L,CAAC;;CAEj8L,IAAI,qBAAqB,GAAG,45BAA45B,CAAC;;CAEz7B,IAAI,wBAAwB,GAAG,0jBAA0jB,CAAC;;CAE1lB,IAAI,6BAA6B,GAAG,4LAA4L,CAAC;;CAEjO,IAAI,2BAA2B,GAAG,qHAAqH,CAAC;;CAExJ,IAAI,sBAAsB,GAAG,2HAA2H,CAAC;;CAEzJ,IAAI,cAAc,GAAG,yDAAyD,CAAC;;CAE/E,IAAI,mBAAmB,GAAG,oDAAoD,CAAC;;CAE/E,IAAI,iBAAiB,GAAG,kDAAkD,CAAC;;CAE3E,IAAI,YAAY,GAAG,qDAAqD,CAAC;;CAEzE,IAAI,MAAM,GAAG,2rEAA2rE,CAAC;;CAEzsE,IAAI,2BAA2B,GAAG,olIAAolI,CAAC;;CAEvnI,IAAI,oBAAoB,GAAG,gIAAgI,CAAC;;CAE5J,IAAI,2BAA2B,GAAG,mJAAmJ,CAAC;;CAEtL,IAAI,sBAAsB,GAAG,mKAAmK,CAAC;;CAEjM,IAAI,oBAAoB,GAAG,8MAA8M,CAAC;;CAE1O,IAAI,yBAAyB,GAAG,oEAAoE,CAAC;;CAErG,IAAI,kBAAkB,GAAG,yDAAyD,CAAC;;CAEnF,IAAI,uBAAuB,GAAG,+uFAA+uF,CAAC;;CAE9wF,IAAI,eAAe,GAAG,gqDAAgqD,CAAC;;CAEvrD,IAAI,oBAAoB,GAAG,8oBAA8oB,CAAC;;CAE1qB,IAAI,kBAAkB,GAAG,gOAAgO,CAAC;;CAE1P,IAAI,aAAa,GAAG,sgBAAsgB,CAAC;;CAE3hB,IAAI,UAAU,GAAG,qDAAqD,CAAC;;CAEvE,IAAI,eAAe,GAAG,qDAAqD,CAAC;;CAE5E,IAAI,YAAY,GAAG,8SAA8S,CAAC;;CAElU,IAAI,iBAAiB,GAAG,2MAA2M,CAAC;;CAEpO,IAAI,yBAAyB,GAAG,yYAAyY,CAAC;;CAE1a,IAAI,iBAAiB,GAAG,8HAA8H,CAAC;;CAEvJ,IAAI,sBAAsB,GAAG,gGAAgG,CAAC;;CAE9H,IAAI,qBAAqB,GAAG,wuEAAwuE,CAAC;;CAErwE,IAAI,iBAAiB,GAAG,qpHAAqpH,CAAC;;CAE9qH,IAAI,gBAAgB,GAAG,k5GAAk5G,CAAC;;CAE16G,IAAI,qBAAqB,GAAG,uMAAuM,CAAC;;CAEpO,IAAI,0BAA0B,GAAG,46CAA46C,CAAC;;CAE98C,IAAI,wBAAwB,GAAG,6iBAA6iB,CAAC;;CAE7kB,IAAI,6BAA6B,GAAG,8uJAA8uJ,CAAC;;CAEnxJ,IAAI,qBAAqB,GAAG,6xFAA6xF,CAAC;;CAE1zF,IAAI,oBAAoB,GAAG,0yBAA0yB,CAAC;;CAEt0B,IAAI,mBAAmB,GAAG,6PAA6P,CAAC;;CAExR,IAAI,oBAAoB,GAAG,yIAAyI,CAAC;;CAErK,IAAI,yBAAyB,GAAG,yIAAyI,CAAC;;CAE1K,IAAI,uBAAuB,GAAG,uIAAuI,CAAC;;CAEtK,IAAI,kBAAkB,GAAG,uPAAuP,CAAC;;CAEjR,IAAI,YAAY,GAAG,qJAAqJ,CAAC;;CAEzK,IAAI,iBAAiB,GAAG,oDAAoD,CAAC;;CAE7E,IAAI,qBAAqB,GAAG,yMAAyM,CAAC;;CAEtO,IAAI,0BAA0B,GAAG,iFAAiF,CAAC;;CAEnH,IAAI,qBAAqB,GAAG,wKAAwK,CAAC;;CAErM,IAAI,0BAA0B,GAAG,oEAAoE,CAAC;;CAEtG,IAAI,kBAAkB,GAAG,+UAA+U,CAAC;;CAEzW,IAAI,uBAAuB,GAAG,0KAA0K,CAAC;;CAEzM,IAAI,kBAAkB,GAAG,yqBAAyqB,CAAC;;CAEnsB,IAAI,qBAAqB,GAAG,gaAAga,CAAC;;CAE7b,IAAI,oBAAoB,GAAG,4LAA4L,CAAC;;CAExN,IAAI,uBAAuB,GAAG,2zBAA2zB,CAAC;;CAE11B,IAAI,OAAO,GAAG,oyCAAoyC,CAAC;;CAEnzC,IAAI,4BAA4B,GAAG,6EAA6E,CAAC;;CAEjH,IAAI,cAAc,GAAG,+GAA+G,CAAC;;CAErI,IAAI,kBAAkB,GAAG,yFAAyF,CAAC;;CAEnH,IAAI,uBAAuB,GAAG,oVAAoV,CAAC;;CAEnX,IAAI,qBAAqB,GAAG,wKAAwK,CAAC;;CAErM,IAAI,0BAA0B,GAAG,oEAAoE,CAAC;;CAEtG,IAAI,uBAAuB,GAAG,ipNAAipN,CAAC;;CAEhrN,IAAI,qBAAqB,GAAG,yeAAye,CAAC;;CAEtgB,IAAI,gBAAgB,GAAG,qlBAAqlB,CAAC;;CAE7mB,IAAI,wBAAwB,GAAG,2wCAA2wC,CAAC;;CAE3yC,IAAI,eAAe,GAAG,iOAAiO,CAAC;;CAExP,IAAI,oBAAoB,GAAG,2gCAA2gC,CAAC;;CAEviC,IAAI,eAAe,GAAG,gYAAgY,CAAC;;CAEvZ,IAAI,iBAAiB,GAAG,6WAA6W,CAAC;;CAEtY,IAAI,oBAAoB,GAAG,yLAAyL,CAAC;;CAErN,IAAI,yBAAyB,GAAG,kEAAkE,CAAC;;CAEnG,IAAI,oBAAoB,GAAG,8FAA8F,CAAC;;CAE1H,IAAI,yBAAyB,GAAG,+6BAA+6B,CAAC;;CAEh9B,IAAI,gBAAgB,GAAG,gQAAgQ,CAAC;;CAExR,IAAI,cAAc,GAAG,+RAA+R,CAAC;;CAErT,IAAI,SAAS,GAAG,wRAAwR,CAAC;;CAEzS,IAAI,iBAAiB,GAAG,mFAAmF,CAAC;;CAE5G,IAAI,eAAe,GAAG,0GAA0G,CAAC;;CAEjI,IAAI,UAAU,GAAG,4EAA4E,CAAC;;CAE9F,IAAI,eAAe,GAAG,yJAAyJ,CAAC;;CAEhL,IAAI,SAAS,GAAG,uPAAuP,CAAC;;CAExQ,IAAI,SAAS,GAAG,gOAAgO,CAAC;;CAEjP,IAAI,UAAU,GAAG,svBAAsvB,CAAC;;CAExwB,IAAI,UAAU,GAAG,mqBAAmqB,CAAC;;CAErrB,IAAI,iBAAiB,GAAG,8rBAA8rB,CAAC;;CAEvtB,IAAI,iBAAiB,GAAG,mtBAAmtB,CAAC;;CAE5uB,IAAI,aAAa,GAAG,mXAAmX,CAAC;;CAExY,IAAI,aAAa,GAAG,8LAA8L,CAAC;;CAEnN,IAAI,eAAe,GAAG,oyBAAoyB,CAAC;;CAE3zB,IAAI,eAAe,GAAG,ihBAAihB,CAAC;;CAExiB,IAAI,cAAc,GAAG,u8CAAu8C,CAAC;;CAE79C,IAAI,cAAc,GAAG,s2BAAs2B,CAAC;;CAE53B,IAAI,gBAAgB,GAAG,qnEAAqnE,CAAC;;CAE7oE,IAAI,gBAAgB,GAAG,8lCAA8lC,CAAC;;CAEtnC,IAAI,cAAc,GAAG,shEAAshE,CAAC;;CAE5iE,IAAI,cAAc,GAAG,sqCAAsqC,CAAC;;CAE5rC,IAAI,iBAAiB,GAAG,gwEAAgwE,CAAC;;CAEzxE,IAAI,iBAAiB,GAAG,8mCAA8mC,CAAC;;CAEvoC,IAAI,WAAW,GAAG,gjBAAgjB,CAAC;;CAEnkB,IAAI,WAAW,GAAG,g8BAAg8B,CAAC;;CAEn9B,IAAI,WAAW,GAAG,6yBAA6yB,CAAC;;CAEh0B,IAAI,WAAW,GAAG,2mBAA2mB,CAAC;;CAE9nB,IAAI,WAAW,GAAG,gWAAgW,CAAC;;CAEnX,IAAI,WAAW,GAAG,gOAAgO,CAAC;;CAEnP,IAAI,WAAW,GAAG;CAClB,CAAC,iBAAiB,EAAE,iBAAiB;CACrC,CAAC,sBAAsB,EAAE,sBAAsB;CAC/C,CAAC,kBAAkB,EAAE,kBAAkB;CACvC,CAAC,cAAc,EAAE,cAAc;CAC/B,CAAC,mBAAmB,EAAE,mBAAmB;CACzC,CAAC,YAAY,EAAE,YAAY;CAC3B,CAAC,kBAAkB,EAAE,kBAAkB;CACvC,CAAC,KAAK,EAAE,KAAK;CACb,CAAC,qBAAqB,EAAE,qBAAqB;CAC7C,CAAC,wBAAwB,EAAE,wBAAwB;CACnD,CAAC,6BAA6B,EAAE,6BAA6B;CAC7D,CAAC,2BAA2B,EAAE,2BAA2B;CACzD,CAAC,sBAAsB,EAAE,sBAAsB;CAC/C,CAAC,cAAc,EAAE,cAAc;CAC/B,CAAC,mBAAmB,EAAE,mBAAmB;CACzC,CAAC,iBAAiB,EAAE,iBAAiB;CACrC,CAAC,YAAY,EAAE,YAAY;CAC3B,CAAC,MAAM,EAAE,MAAM;CACf,CAAC,2BAA2B,EAAE,2BAA2B;CACzD,CAAC,oBAAoB,EAAE,oBAAoB;CAC3C,CAAC,2BAA2B,EAAE,2BAA2B;CACzD,CAAC,sBAAsB,EAAE,sBAAsB;CAC/C,CAAC,oBAAoB,EAAE,oBAAoB;CAC3C,CAAC,yBAAyB,EAAE,yBAAyB;CACrD,CAAC,kBAAkB,EAAE,kBAAkB;CACvC,CAAC,uBAAuB,EAAE,uBAAuB;CACjD,CAAC,eAAe,EAAE,eAAe;CACjC,CAAC,oBAAoB,EAAE,oBAAoB;CAC3C,CAAC,kBAAkB,EAAE,kBAAkB;CACvC,CAAC,aAAa,EAAE,aAAa;CAC7B,CAAC,UAAU,EAAE,UAAU;CACvB,CAAC,eAAe,EAAE,eAAe;CACjC,CAAC,YAAY,EAAE,YAAY;CAC3B,CAAC,iBAAiB,EAAE,iBAAiB;CACrC,CAAC,yBAAyB,EAAE,yBAAyB;CACrD,CAAC,iBAAiB,EAAE,iBAAiB;CACrC,CAAC,sBAAsB,EAAE,sBAAsB;CAC/C,CAAC,qBAAqB,EAAE,qBAAqB;CAC7C,CAAC,iBAAiB,EAAE,iBAAiB;CACrC,CAAC,gBAAgB,EAAE,gBAAgB;CACnC,CAAC,qBAAqB,EAAE,qBAAqB;CAC7C,CAAC,0BAA0B,EAAE,0BAA0B;CACvD,CAAC,wBAAwB,EAAE,wBAAwB;CACnD,CAAC,6BAA6B,EAAE,6BAA6B;CAC7D,CAAC,qBAAqB,EAAE,qBAAqB;CAC7C,CAAC,oBAAoB,EAAE,oBAAoB;CAC3C,CAAC,mBAAmB,EAAE,mBAAmB;CACzC,CAAC,oBAAoB,EAAE,oBAAoB;CAC3C,CAAC,yBAAyB,EAAE,yBAAyB;CACrD,CAAC,uBAAuB,EAAE,uBAAuB;CACjD,CAAC,kBAAkB,EAAE,kBAAkB;CACvC,CAAC,YAAY,EAAE,YAAY;CAC3B,CAAC,iBAAiB,EAAE,iBAAiB;CACrC,CAAC,qBAAqB,EAAE,qBAAqB;CAC7C,CAAC,0BAA0B,EAAE,0BAA0B;CACvD,CAAC,qBAAqB,EAAE,qBAAqB;CAC7C,CAAC,0BAA0B,EAAE,0BAA0B;CACvD,CAAC,kBAAkB,EAAE,kBAAkB;CACvC,CAAC,uBAAuB,EAAE,uBAAuB;CACjD,CAAC,kBAAkB,EAAE,kBAAkB;CACvC,CAAC,qBAAqB,EAAE,qBAAqB;CAC7C,CAAC,oBAAoB,EAAE,oBAAoB;CAC3C,CAAC,uBAAuB,EAAE,uBAAuB;CACjD,CAAC,OAAO,EAAE,OAAO;CACjB,CAAC,4BAA4B,EAAE,4BAA4B;CAC3D,CAAC,cAAc,EAAE,cAAc;CAC/B,CAAC,kBAAkB,EAAE,kBAAkB;CACvC,CAAC,uBAAuB,EAAE,uBAAuB;CACjD,CAAC,qBAAqB,EAAE,qBAAqB;CAC7C,CAAC,0BAA0B,EAAE,0BAA0B;CACvD,CAAC,uBAAuB,EAAE,uBAAuB;CACjD,CAAC,qBAAqB,EAAE,qBAAqB;CAC7C,CAAC,gBAAgB,EAAE,gBAAgB;CACnC,CAAC,wBAAwB,EAAE,wBAAwB;CACnD,CAAC,eAAe,EAAE,eAAe;CACjC,CAAC,oBAAoB,EAAE,oBAAoB;CAC3C,CAAC,eAAe,EAAE,eAAe;CACjC,CAAC,iBAAiB,EAAE,iBAAiB;CACrC,CAAC,oBAAoB,EAAE,oBAAoB;CAC3C,CAAC,yBAAyB,EAAE,yBAAyB;CACrD,CAAC,oBAAoB,EAAE,oBAAoB;CAC3C,CAAC,yBAAyB,EAAE,yBAAyB;CACrD,CAAC,gBAAgB,EAAE,gBAAgB;CACnC,CAAC,cAAc,EAAE,cAAc;CAC/B,CAAC,SAAS,EAAE,SAAS;CACrB,CAAC,iBAAiB,EAAE,iBAAiB;CACrC,CAAC,eAAe,EAAE,eAAe;CACjC,CAAC,UAAU,EAAE,UAAU;CACvB,CAAC,eAAe,EAAE,eAAe;;CAEjC,CAAC,SAAS,EAAE,SAAS;CACrB,CAAC,SAAS,EAAE,SAAS;CACrB,CAAC,UAAU,EAAE,UAAU;CACvB,CAAC,UAAU,EAAE,UAAU;CACvB,CAAC,iBAAiB,EAAE,iBAAiB;CACrC,CAAC,iBAAiB,EAAE,iBAAiB;CACrC,CAAC,aAAa,EAAE,aAAa;CAC7B,CAAC,aAAa,EAAE,aAAa;CAC7B,CAAC,eAAe,EAAE,eAAe;CACjC,CAAC,eAAe,EAAE,eAAe;CACjC,CAAC,cAAc,EAAE,cAAc;CAC/B,CAAC,cAAc,EAAE,cAAc;CAC/B,CAAC,gBAAgB,EAAE,gBAAgB;CACnC,CAAC,gBAAgB,EAAE,gBAAgB;CACnC,CAAC,cAAc,EAAE,cAAc;CAC/B,CAAC,cAAc,EAAE,cAAc;CAC/B,CAAC,iBAAiB,EAAE,iBAAiB;CACrC,CAAC,iBAAiB,EAAE,iBAAiB;CACrC,CAAC,WAAW,EAAE,WAAW;CACzB,CAAC,WAAW,EAAE,WAAW;CACzB,CAAC,WAAW,EAAE,WAAW;CACzB,CAAC,WAAW,EAAE,WAAW;CACzB,CAAC,WAAW,EAAE,WAAW;CACzB,CAAC,WAAW,EAAE,WAAW;CACzB,CAAC,CAAC;;CAEF;CACA;CACA;;CAEA,IAAI,aAAa,GAAG;;CAEpB,CAAC,KAAK,EAAE,WAAW,QAAQ,GAAG;;CAE9B,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC;;CAElB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAE/C,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEzC,GAAG,MAAM,IAAI,CAAC,IAAI,GAAG,GAAG;;CAExB,IAAI,MAAM,EAAE,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC;;CAE3B,IAAI;;CAEJ,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC;;CAEhB,EAAE;;CAEF,CAAC,KAAK,EAAE,WAAW,YAAY,GAAG;;CAElC,EAAE,IAAI,YAAY,GAAG,EAAE,CAAC;;CAExB,EAAE,MAAM,IAAI,CAAC,IAAI,YAAY,GAAG;;CAEhC,GAAG,YAAY,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;;CAE1B,GAAG,MAAM,IAAI,CAAC,IAAI,YAAY,EAAE,CAAC,EAAE,GAAG;;CAEtC,IAAI,IAAI,aAAa,GAAG,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;;CAE/C,IAAI,KAAK,aAAa,MAAM,aAAa,CAAC,OAAO;CACjD,KAAK,aAAa,CAAC,SAAS,IAAI,aAAa,CAAC,SAAS;CACvD,KAAK,aAAa,CAAC,SAAS,IAAI,aAAa,CAAC,SAAS,IAAI,aAAa,CAAC,SAAS;CAClF,KAAK,aAAa,CAAC,SAAS,EAAE,GAAG;;CAEjC,KAAK,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,aAAa,CAAC,KAAK,EAAE,CAAC;;CAEpD,KAAK,MAAM,KAAK,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG;;CAEjD,KAAK,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,aAAa,CAAC,KAAK,EAAE,CAAC;;CAEpD,KAAK,MAAM;;CAEX,KAAK,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,aAAa,CAAC;;CAE5C,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH,EAAE,OAAO,YAAY,CAAC;;CAEtB,EAAE;;CAEF,CAAC,CAAC;;CAEF;CACA;CACA;;CAEA,IAAI,aAAa,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ;CAClI,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ;CAC/H,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ;CAClI,CAAC,gBAAgB,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ;CACpI,CAAC,eAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ;CAC7I,CAAC,gBAAgB,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ;CAClJ,CAAC,eAAe,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ;CACnI,CAAC,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ;CACvI,CAAC,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ;CACvI,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ;CACjJ,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ;CACxJ,CAAC,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,sBAAsB,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ;CACxJ,CAAC,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ;CACnJ,CAAC,gBAAgB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ;CACrJ,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,kBAAkB,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ;CAC3I,CAAC,cAAc,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,QAAQ,EAAE,mBAAmB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,QAAQ;CAC9I,CAAC,iBAAiB,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ;CACnJ,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ;CAC/I,CAAC,eAAe,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ;CACtJ,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ;CACpK,CAAC,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ;CACvI,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ;CACnJ,CAAC,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ;CAClJ,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC;;CAEjI,SAAS,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;CAE1B,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,GAAG;;CAE3C;CACA,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;;CAEvB,EAAE;;CAEF,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE/B,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE;;CAEhC,CAAC,OAAO,EAAE,IAAI;;CAEd,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEjB,CAAC,GAAG,EAAE,WAAW,KAAK,GAAG;;CAEzB,EAAE,KAAK,KAAK,IAAI,KAAK,CAAC,OAAO,GAAG;;CAEhC,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;;CAEtB,GAAG,MAAM,KAAK,OAAO,KAAK,KAAK,QAAQ,GAAG;;CAE1C,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;;CAExB,GAAG,MAAM,KAAK,OAAO,KAAK,KAAK,QAAQ,GAAG;;CAE1C,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC;;CAE1B,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,SAAS,EAAE,WAAW,MAAM,GAAG;;CAEhC,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;CAClB,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;CAClB,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;;CAElB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,GAAG,GAAG;;CAE1B,EAAE,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;;CAE1B,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,KAAK,GAAG,CAAC;CACrC,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,KAAK,GAAG,CAAC;CACpC,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,GAAG,CAAC;;CAE/B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;CAE9B,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;CACb,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;CACb,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;;CAEb,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,YAAY;;CAErB,EAAE,SAAS,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;CAE9B,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;CACvB,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;CACvB,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;CACjD,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;CAC7B,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;CAC7D,GAAG,OAAO,CAAC,CAAC;;CAEZ,GAAG;;CAEH,EAAE,OAAO,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;CAEpC;CACA,GAAG,CAAC,GAAG,KAAK,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CACrC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC9B,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE9B,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG;;CAElB,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;;CAEjC,IAAI,MAAM;;CAEV,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;CACzD,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;;CAE1B,IAAI,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;CACxC,IAAI,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAChC,IAAI,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;;CAExC,IAAI;;CAEJ,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,QAAQ,EAAE,WAAW,KAAK,GAAG;;CAE9B,EAAE,SAAS,WAAW,EAAE,MAAM,GAAG;;CAEjC,GAAG,KAAK,MAAM,KAAK,SAAS,GAAG,OAAO;;CAEtC,GAAG,KAAK,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG;;CAEnC,IAAI,OAAO,CAAC,IAAI,EAAE,kCAAkC,GAAG,KAAK,GAAG,mBAAmB,EAAE,CAAC;;CAErF,IAAI;;CAEJ,GAAG;;;CAGH,EAAE,IAAI,CAAC,CAAC;;CAER,EAAE,KAAK,CAAC,GAAG,iCAAiC,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG;;CAE7D;;CAEA,GAAG,IAAI,KAAK,CAAC;CACb,GAAG,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;CACrB,GAAG,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE3B,GAAG,SAAS,IAAI;;CAEhB,IAAI,KAAK,KAAK,CAAC;CACf,IAAI,KAAK,MAAM;;CAEf,KAAK,KAAK,KAAK,GAAG,+DAA+D,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG;;CAEvG;CACA,MAAM,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC;CACjE,MAAM,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC;CACjE,MAAM,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC;;CAEjE,MAAM,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEhC,MAAM,OAAO,IAAI,CAAC;;CAElB,MAAM;;CAEN,KAAK,KAAK,KAAK,GAAG,qEAAqE,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG;;CAE7G;CACA,MAAM,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC;CACjE,MAAM,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC;CACjE,MAAM,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC;;CAEjE,MAAM,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEhC,MAAM,OAAO,IAAI,CAAC;;CAElB,MAAM;;CAEN,KAAK,MAAM;;CAEX,IAAI,KAAK,KAAK,CAAC;CACf,IAAI,KAAK,MAAM;;CAEf,KAAK,KAAK,KAAK,GAAG,+EAA+E,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG;;CAEvH;CACA,MAAM,IAAI,CAAC,GAAG,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,CAAC;CAC7C,MAAM,IAAI,CAAC,GAAG,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC;CAC/C,MAAM,IAAI,CAAC,GAAG,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC;;CAE/C,MAAM,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEhC,MAAM,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEpC,MAAM;;CAEN,KAAK,MAAM;;CAEX,IAAI;;CAEJ,GAAG,MAAM,KAAK,CAAC,GAAG,oBAAoB,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG;;CAEvD;;CAEA,GAAG,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;CACpB,GAAG,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC;;CAEzB,GAAG,KAAK,IAAI,KAAK,CAAC,GAAG;;CAErB;CACA,IAAI,IAAI,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC;CACrE,IAAI,IAAI,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC;CACrE,IAAI,IAAI,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC;;CAErE,IAAI,OAAO,IAAI,CAAC;;CAEhB,IAAI,MAAM,KAAK,IAAI,KAAK,CAAC,GAAG;;CAE5B;CACA,IAAI,IAAI,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC;CACrE,IAAI,IAAI,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC;CACrE,IAAI,IAAI,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC;;CAErE,IAAI,OAAO,IAAI,CAAC;;CAEhB,IAAI;;CAEJ,GAAG;;CAEH,EAAE,KAAK,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG;;CAEnC;CACA,GAAG,IAAI,GAAG,GAAG,aAAa,EAAE,KAAK,EAAE,CAAC;;CAEpC,GAAG,KAAK,GAAG,KAAK,SAAS,GAAG;;CAE5B;CACA,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC;;CAEvB,IAAI,MAAM;;CAEV;CACA,IAAI,OAAO,CAAC,IAAI,EAAE,6BAA6B,GAAG,KAAK,EAAE,CAAC;;CAE1D,IAAI;;CAEJ,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;;CAExD,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,KAAK,GAAG;;CAE1B,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;CACnB,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;CACnB,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;;CAEnB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,iBAAiB,EAAE,WAAW,KAAK,EAAE,WAAW,GAAG;;CAEpD,EAAE,KAAK,WAAW,KAAK,SAAS,GAAG,WAAW,GAAG,GAAG,CAAC;;CAErD,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;CAC5C,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;CAC5C,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;;CAE5C,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,iBAAiB,EAAE,WAAW,KAAK,EAAE,WAAW,GAAG;;CAEpD,EAAE,KAAK,WAAW,KAAK,SAAS,GAAG,WAAW,GAAG,GAAG,CAAC;;CAErD,EAAE,IAAI,WAAW,GAAG,EAAE,WAAW,GAAG,CAAC,OAAO,GAAG,GAAG,WAAW,KAAK,GAAG,CAAC;;CAEtE,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;CAC5C,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;CAC5C,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;;CAE5C,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,oBAAoB,EAAE,YAAY;;CAEnC,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;;CAEzC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CACjB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CACjB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;CAEjB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,oBAAoB,EAAE,YAAY;;CAEnC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CAC/B,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CAC/B,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;;CAE/B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,YAAY;;CAErB,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,GAAG,GAAG,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC;;CAEhF,EAAE;;CAEF,CAAC,YAAY,EAAE,YAAY;;CAE3B,EAAE,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;;CAElE,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,MAAM,GAAG;;CAE7B;;CAEA,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,OAAO,CAAC,IAAI,EAAE,+CAA+C,EAAE,CAAC;CACnE,GAAG,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEjC,GAAG;;CAEH,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;;CAEzC,EAAE,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAChC,EAAE,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEhC,EAAE,IAAI,GAAG,EAAE,UAAU,CAAC;CACtB,EAAE,IAAI,SAAS,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,GAAG,CAAC;;CAEtC,EAAE,KAAK,GAAG,KAAK,GAAG,GAAG;;CAErB,GAAG,GAAG,GAAG,CAAC,CAAC;CACX,GAAG,UAAU,GAAG,CAAC,CAAC;;CAElB,GAAG,MAAM;;CAET,GAAG,IAAI,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC;;CAEzB,GAAG,UAAU,GAAG,SAAS,IAAI,GAAG,GAAG,KAAK,KAAK,GAAG,GAAG,GAAG,EAAE,GAAG,KAAK,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC;;CAErF,GAAG,SAAS,GAAG;;CAEf,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM;CAC/D,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM;CAC/C,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM;;CAE/C,IAAI;;CAEJ,GAAG,GAAG,IAAI,CAAC,CAAC;;CAEZ,GAAG;;CAEH,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC;CACjB,EAAE,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC;CACxB,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC;;CAEvB,EAAE,OAAO,MAAM,CAAC;;CAEhB,EAAE;;CAEF,CAAC,QAAQ,EAAE,YAAY;;CAEvB,EAAE,OAAO,MAAM,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,CAAC;;CAEnH,EAAE;;CAEF,CAAC,SAAS,EAAE,YAAY;;CAExB,EAAE,IAAI,GAAG,GAAG,EAAE,CAAC;;CAEf,EAAE,OAAO,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;CAE9B,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC;;CAEtB,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;;CAEtC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;;CAEtC,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,GAAG,EAAE,WAAW,KAAK,GAAG;;CAEzB,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;CACpB,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;CACpB,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;;CAEpB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,SAAS,EAAE,WAAW,MAAM,EAAE,MAAM,GAAG;;CAExC,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;CAC/B,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;CAC/B,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;;CAE/B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG;;CAE3B,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;CACd,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;CACd,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;;CAEd,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,GAAG,EAAE,WAAW,KAAK,GAAG;;CAEzB,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;CAC3C,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;CAC3C,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;;CAE3C,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,QAAQ,EAAE,WAAW,KAAK,GAAG;;CAE9B,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;CACpB,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;CACpB,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;;CAEpB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,cAAc,EAAE,WAAW,CAAC,GAAG;;CAEhC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;CACd,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;CACd,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;;CAEd,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,KAAK,EAAE,KAAK,GAAG;;CAEjC,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC;CACzC,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC;CACzC,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC;;CAEzC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG;;CAExB,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC;;CAExE,EAAE;;CAEF,CAAC,SAAS,EAAE,WAAW,KAAK,EAAE,MAAM,GAAG;;CAEvC,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG,MAAM,GAAG,CAAC,CAAC;;CAEzC,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,CAAC;CAC3B,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;CAC/B,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;;CAE/B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,OAAO,EAAE,WAAW,KAAK,EAAE,MAAM,GAAG;;CAErC,EAAE,KAAK,KAAK,KAAK,SAAS,GAAG,KAAK,GAAG,EAAE,CAAC;CACxC,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG,MAAM,GAAG,CAAC,CAAC;;CAEzC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;CAC3B,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;CAC/B,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;;CAE/B,EAAE,OAAO,KAAK,CAAC;;CAEf,EAAE;;CAEF,CAAC,MAAM,EAAE,YAAY;;CAErB,EAAE,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;;CAEvB,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,IAAI,WAAW,GAAG;;CAElB,CAAC,MAAM,EAAE;;CAET,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,KAAK,EAAE,QAAQ,EAAE,EAAE;CAC3C,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;;CAEzB,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;CACtB,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,OAAO,EAAE,EAAE;;CAEvC,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;;CAE3B,EAAE;;CAEF,CAAC,WAAW,EAAE;;CAEd,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;;CAE9B,EAAE;;CAEF,CAAC,MAAM,EAAE;;CAET,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;CACzB,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE;CAC5B,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;CAC9B,EAAE,eAAe,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;CAClC,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;;CAE3B,EAAE;;CAEF,CAAC,KAAK,EAAE;;CAER,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;CACxB,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;;CAE9B,EAAE;;CAEF,CAAC,QAAQ,EAAE;;CAEX,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;CAC3B,EAAE,iBAAiB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;;CAEjC,EAAE;;CAEF,CAAC,WAAW,EAAE;;CAEd,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;;CAE9B,EAAE;;CAEF,CAAC,OAAO,EAAE;;CAEV,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;CAC1B,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;;CAEzB,EAAE;;CAEF,CAAC,SAAS,EAAE;;CAEZ,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;CAC5B,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;;CAE7C,EAAE;;CAEF,CAAC,eAAe,EAAE;;CAElB,EAAE,eAAe,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;CAClC,EAAE,iBAAiB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;CACjC,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;;CAEhC,EAAE;;CAEF,CAAC,YAAY,EAAE;;CAEf,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;;CAE/B,EAAE;;CAEF,CAAC,YAAY,EAAE;;CAEf,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;;CAE/B,EAAE;;CAEF,CAAC,WAAW,EAAE;;CAEd,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;;CAE9B,EAAE;;CAEF,CAAC,GAAG,EAAE;;CAEN,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;CAChC,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;CACvB,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;CACzB,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,KAAK,EAAE,QAAQ,EAAE,EAAE;;CAE5C,EAAE;;CAEF,CAAC,MAAM,EAAE;;CAET,EAAE,iBAAiB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;;CAElC,EAAE,iBAAiB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE;CAC9C,GAAG,SAAS,EAAE,EAAE;CAChB,GAAG,KAAK,EAAE,EAAE;;CAEZ,GAAG,MAAM,EAAE,EAAE;CACb,GAAG,UAAU,EAAE,EAAE;CACjB,GAAG,YAAY,EAAE,EAAE;CACnB,GAAG,aAAa,EAAE,EAAE;CACpB,GAAG,EAAE;;CAEL,EAAE,oBAAoB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;CACrC,EAAE,uBAAuB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;;CAExC,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE;CACvC,GAAG,KAAK,EAAE,EAAE;CACZ,GAAG,QAAQ,EAAE,EAAE;CACf,GAAG,SAAS,EAAE,EAAE;CAChB,GAAG,QAAQ,EAAE,EAAE;CACf,GAAG,OAAO,EAAE,EAAE;CACd,GAAG,WAAW,EAAE,EAAE;CAClB,GAAG,KAAK,EAAE,EAAE;;CAEZ,GAAG,MAAM,EAAE,EAAE;CACb,GAAG,UAAU,EAAE,EAAE;CACjB,GAAG,YAAY,EAAE,EAAE;CACnB,GAAG,aAAa,EAAE,EAAE;CACpB,GAAG,EAAE;;CAEL,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;CAC9B,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;;CAEjC,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE;CACxC,GAAG,KAAK,EAAE,EAAE;CACZ,GAAG,QAAQ,EAAE,EAAE;CACf,GAAG,KAAK,EAAE,EAAE;CACZ,GAAG,QAAQ,EAAE,EAAE;;CAEf,GAAG,MAAM,EAAE,EAAE;CACb,GAAG,UAAU,EAAE,EAAE;CACjB,GAAG,YAAY,EAAE,EAAE;CACnB,GAAG,aAAa,EAAE,EAAE;CACpB,GAAG,gBAAgB,EAAE,EAAE;CACvB,GAAG,eAAe,EAAE,EAAE;CACtB,GAAG,EAAE;;CAEL,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;CAC/B,EAAE,iBAAiB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;;CAElC,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE;CAC7C,GAAG,SAAS,EAAE,EAAE;CAChB,GAAG,QAAQ,EAAE,EAAE;CACf,GAAG,WAAW,EAAE,EAAE;CAClB,GAAG,EAAE;;CAEL;CACA,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE;CAC3C,GAAG,KAAK,EAAE,EAAE;CACZ,GAAG,QAAQ,EAAE,EAAE;CACf,GAAG,KAAK,EAAE,EAAE;CACZ,GAAG,MAAM,EAAE,EAAE;CACb,GAAG,EAAE;;CAEL,EAAE;;CAEF,CAAC,MAAM,EAAE;;CAET,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,KAAK,EAAE,QAAQ,EAAE,EAAE;CAC3C,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;CACzB,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;CACtB,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;CACvB,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;CACtB,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,OAAO,EAAE,EAAE;;CAEvC,EAAE;;CAEF,CAAC,CAAC;;CAEF;CACA;CACA;CACA;CACA;;CAEA,IAAI,SAAS,GAAG;;CAEhB,CAAC,KAAK,EAAE;;CAER,EAAE,QAAQ,EAAE,aAAa,CAAC,KAAK,EAAE;CACjC,GAAG,WAAW,CAAC,MAAM;CACrB,GAAG,WAAW,CAAC,WAAW;CAC1B,GAAG,WAAW,CAAC,MAAM;CACrB,GAAG,WAAW,CAAC,KAAK;CACpB,GAAG,WAAW,CAAC,QAAQ;CACvB,GAAG,WAAW,CAAC,GAAG;CAClB,GAAG,EAAE;;CAEL,EAAE,YAAY,EAAE,WAAW,CAAC,cAAc;CAC1C,EAAE,cAAc,EAAE,WAAW,CAAC,cAAc;;CAE5C,EAAE;;CAEF,CAAC,OAAO,EAAE;;CAEV,EAAE,QAAQ,EAAE,aAAa,CAAC,KAAK,EAAE;CACjC,GAAG,WAAW,CAAC,MAAM;CACrB,GAAG,WAAW,CAAC,WAAW;CAC1B,GAAG,WAAW,CAAC,MAAM;CACrB,GAAG,WAAW,CAAC,KAAK;CACpB,GAAG,WAAW,CAAC,QAAQ;CACvB,GAAG,WAAW,CAAC,WAAW;CAC1B,GAAG,WAAW,CAAC,GAAG;CAClB,GAAG,WAAW,CAAC,MAAM;CACrB,GAAG;CACH,IAAI,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,KAAK,EAAE,QAAQ,EAAE,EAAE;CAC9C,IAAI;CACJ,GAAG,EAAE;;CAEL,EAAE,YAAY,EAAE,WAAW,CAAC,gBAAgB;CAC5C,EAAE,cAAc,EAAE,WAAW,CAAC,gBAAgB;;CAE9C,EAAE;;CAEF,CAAC,KAAK,EAAE;;CAER,EAAE,QAAQ,EAAE,aAAa,CAAC,KAAK,EAAE;CACjC,GAAG,WAAW,CAAC,MAAM;CACrB,GAAG,WAAW,CAAC,WAAW;CAC1B,GAAG,WAAW,CAAC,MAAM;CACrB,GAAG,WAAW,CAAC,KAAK;CACpB,GAAG,WAAW,CAAC,QAAQ;CACvB,GAAG,WAAW,CAAC,WAAW;CAC1B,GAAG,WAAW,CAAC,OAAO;CACtB,GAAG,WAAW,CAAC,SAAS;CACxB,GAAG,WAAW,CAAC,eAAe;CAC9B,GAAG,WAAW,CAAC,WAAW;CAC1B,GAAG,WAAW,CAAC,GAAG;CAClB,GAAG,WAAW,CAAC,MAAM;CACrB,GAAG;CACH,IAAI,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,KAAK,EAAE,QAAQ,EAAE,EAAE;CAC9C,IAAI,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,KAAK,EAAE,QAAQ,EAAE,EAAE;CAC9C,IAAI,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;CAC5B,IAAI;CACJ,GAAG,EAAE;;CAEL,EAAE,YAAY,EAAE,WAAW,CAAC,cAAc;CAC1C,EAAE,cAAc,EAAE,WAAW,CAAC,cAAc;;CAE5C,EAAE;;CAEF,CAAC,QAAQ,EAAE;;CAEX,EAAE,QAAQ,EAAE,aAAa,CAAC,KAAK,EAAE;CACjC,GAAG,WAAW,CAAC,MAAM;CACrB,GAAG,WAAW,CAAC,MAAM;CACrB,GAAG,WAAW,CAAC,KAAK;CACpB,GAAG,WAAW,CAAC,QAAQ;CACvB,GAAG,WAAW,CAAC,WAAW;CAC1B,GAAG,WAAW,CAAC,OAAO;CACtB,GAAG,WAAW,CAAC,SAAS;CACxB,GAAG,WAAW,CAAC,eAAe;CAC9B,GAAG,WAAW,CAAC,YAAY;CAC3B,GAAG,WAAW,CAAC,YAAY;CAC3B,GAAG,WAAW,CAAC,GAAG;CAClB,GAAG,WAAW,CAAC,MAAM;CACrB,GAAG;CACH,IAAI,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,KAAK,EAAE,QAAQ,EAAE,EAAE;CAC9C,IAAI,SAAS,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;CAC7B,IAAI,SAAS,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;CAC7B,IAAI,eAAe,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;CACjC,IAAI;CACJ,GAAG,EAAE;;CAEL,EAAE,YAAY,EAAE,WAAW,CAAC,iBAAiB;CAC7C,EAAE,cAAc,EAAE,WAAW,CAAC,iBAAiB;;CAE/C,EAAE;;CAEF,CAAC,MAAM,EAAE;;CAET,EAAE,QAAQ,EAAE,aAAa,CAAC,KAAK,EAAE;CACjC,GAAG,WAAW,CAAC,MAAM;CACrB,GAAG,WAAW,CAAC,GAAG;CAClB,GAAG,EAAE;;CAEL,EAAE,YAAY,EAAE,WAAW,CAAC,WAAW;CACvC,EAAE,cAAc,EAAE,WAAW,CAAC,WAAW;;CAEzC,EAAE;;CAEF,CAAC,MAAM,EAAE;;CAET,EAAE,QAAQ,EAAE,aAAa,CAAC,KAAK,EAAE;CACjC,GAAG,WAAW,CAAC,MAAM;CACrB,GAAG,WAAW,CAAC,GAAG;CAClB,GAAG;CACH,IAAI,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;CACvB,IAAI,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;CAC1B,IAAI,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;CAC3B,IAAI;CACJ,GAAG,EAAE;;CAEL,EAAE,YAAY,EAAE,WAAW,CAAC,eAAe;CAC3C,EAAE,cAAc,EAAE,WAAW,CAAC,eAAe;;CAE7C,EAAE;;CAEF,CAAC,KAAK,EAAE;;CAER,EAAE,QAAQ,EAAE,aAAa,CAAC,KAAK,EAAE;CACjC,GAAG,WAAW,CAAC,MAAM;CACrB,GAAG,WAAW,CAAC,eAAe;CAC9B,GAAG,EAAE;;CAEL,EAAE,YAAY,EAAE,WAAW,CAAC,UAAU;CACtC,EAAE,cAAc,EAAE,WAAW,CAAC,UAAU;;CAExC,EAAE;;CAEF,CAAC,MAAM,EAAE;;CAET,EAAE,QAAQ,EAAE,aAAa,CAAC,KAAK,EAAE;CACjC,GAAG,WAAW,CAAC,MAAM;CACrB,GAAG,WAAW,CAAC,OAAO;CACtB,GAAG,WAAW,CAAC,SAAS;CACxB,GAAG,WAAW,CAAC,eAAe;CAC9B,GAAG;CACH,IAAI,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;CAC3B,IAAI;CACJ,GAAG,EAAE;;CAEL,EAAE,YAAY,EAAE,WAAW,CAAC,WAAW;CACvC,EAAE,cAAc,EAAE,WAAW,CAAC,WAAW;;CAEzC,EAAE;;CAEF;CACA;CACA;;CAEA,CAAC,IAAI,EAAE;;CAEP,EAAE,QAAQ,EAAE;CACZ,GAAG,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;CACzB,GAAG,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE;CACxB,GAAG,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;CAC1B,GAAG;;CAEH,EAAE,YAAY,EAAE,WAAW,CAAC,SAAS;CACrC,EAAE,cAAc,EAAE,WAAW,CAAC,SAAS;;CAEvC,EAAE;;CAEF,CAAC,QAAQ,EAAE;;CAEX,EAAE,QAAQ,EAAE;CACZ,GAAG,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;CAC7B,GAAG;;CAEH,EAAE,YAAY,EAAE,WAAW,CAAC,aAAa;CACzC,EAAE,cAAc,EAAE,WAAW,CAAC,aAAa;;CAE3C,EAAE;;CAEF,CAAC,YAAY,EAAE;;CAEf,EAAE,QAAQ,EAAE,aAAa,CAAC,KAAK,EAAE;CACjC,GAAG,WAAW,CAAC,MAAM;CACrB,GAAG,WAAW,CAAC,eAAe;CAC9B,GAAG;CACH,IAAI,iBAAiB,EAAE,EAAE,KAAK,EAAE,IAAI,OAAO,EAAE,EAAE;CAC/C,IAAI,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;CAC9B,IAAI,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;CAChC,IAAI;CACJ,GAAG,EAAE;;CAEL,EAAE,YAAY,EAAE,WAAW,CAAC,iBAAiB;CAC7C,EAAE,cAAc,EAAE,WAAW,CAAC,iBAAiB;;CAE/C,EAAE;;CAEF,CAAC,MAAM,EAAE;;CAET,EAAE,QAAQ,EAAE,aAAa,CAAC,KAAK,EAAE;CACjC,GAAG,WAAW,CAAC,MAAM;CACrB,GAAG,WAAW,CAAC,GAAG;CAClB,GAAG;CACH,IAAI,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,KAAK,EAAE,OAAO,EAAE,EAAE;CAC1C,IAAI,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;CAC3B,IAAI;CACJ,GAAG,EAAE;;CAEL,EAAE,YAAY,EAAE,WAAW,CAAC,WAAW;CACvC,EAAE,cAAc,EAAE,WAAW,CAAC,WAAW;;CAEzC,EAAE;;CAEF,CAAC,CAAC;;CAEF,SAAS,CAAC,QAAQ,GAAG;;CAErB,CAAC,QAAQ,EAAE,aAAa,CAAC,KAAK,EAAE;CAChC,EAAE,SAAS,CAAC,QAAQ,CAAC,QAAQ;CAC7B,EAAE;CACF,GAAG,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;CAC1B,GAAG,kBAAkB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;CACnC,GAAG;CACH,EAAE,EAAE;;CAEJ,CAAC,YAAY,EAAE,WAAW,CAAC,iBAAiB;CAC5C,CAAC,cAAc,EAAE,WAAW,CAAC,iBAAiB;;CAE9C,CAAC,CAAC;;CAEF;CACA;CACA;;CAEA,SAAS,eAAe,EAAE,EAAE,GAAG;;CAE/B,CAAC,IAAI,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE7B,CAAC,SAAS,YAAY,EAAE,SAAS,EAAE,UAAU,GAAG;;CAEhD,EAAE,IAAI,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;CAC9B,EAAE,IAAI,KAAK,GAAG,SAAS,CAAC,OAAO,GAAG,EAAE,CAAC,YAAY,GAAG,EAAE,CAAC,WAAW,CAAC;;CAEnE,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;;CAEjC,EAAE,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;CACtC,EAAE,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;;CAE5C,EAAE,SAAS,CAAC,gBAAgB,EAAE,CAAC;;CAE/B,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC;;CAEtB,EAAE,KAAK,KAAK,YAAY,YAAY,GAAG;;CAEvC,GAAG,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC;;CAEnB,GAAG,MAAM,KAAK,KAAK,YAAY,YAAY,GAAG;;CAE9C,GAAG,OAAO,CAAC,IAAI,EAAE,sEAAsE,EAAE,CAAC;;CAE1F,GAAG,MAAM,KAAK,KAAK,YAAY,WAAW,GAAG;;CAE7C,GAAG,IAAI,GAAG,EAAE,CAAC,cAAc,CAAC;;CAE5B,GAAG,MAAM,KAAK,KAAK,YAAY,UAAU,GAAG;;CAE5C,GAAG,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC;;CAEnB,GAAG,MAAM,KAAK,KAAK,YAAY,WAAW,GAAG;;CAE7C,GAAG,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC;;CAE1B,GAAG,MAAM,KAAK,KAAK,YAAY,UAAU,GAAG;;CAE5C,GAAG,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC;;CAEjB,GAAG,MAAM,KAAK,KAAK,YAAY,SAAS,GAAG;;CAE3C,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;;CAElB,GAAG,MAAM,KAAK,KAAK,YAAY,UAAU,GAAG;;CAE5C,GAAG,IAAI,GAAG,EAAE,CAAC,aAAa,CAAC;;CAE3B,GAAG;;CAEH,EAAE,OAAO;CACT,GAAG,MAAM,EAAE,MAAM;CACjB,GAAG,IAAI,EAAE,IAAI;CACb,GAAG,eAAe,EAAE,KAAK,CAAC,iBAAiB;CAC3C,GAAG,OAAO,EAAE,SAAS,CAAC,OAAO;CAC7B,GAAG,CAAC;;CAEJ,EAAE;;CAEF,CAAC,SAAS,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,GAAG;;CAExD,EAAE,IAAI,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;CAC9B,EAAE,IAAI,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC;;CAE1C,EAAE,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;;CAEtC,EAAE,KAAK,SAAS,CAAC,OAAO,KAAK,KAAK,GAAG;;CAErC,GAAG,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC;;CAEtD,GAAG,MAAM,KAAK,WAAW,CAAC,KAAK,KAAK,EAAE,CAAC,GAAG;;CAE1C;;CAEA,GAAG,EAAE,CAAC,aAAa,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;;CAE5C,GAAG,MAAM,KAAK,WAAW,CAAC,KAAK,KAAK,CAAC,GAAG;;CAExC,GAAG,OAAO,CAAC,KAAK,EAAE,yKAAyK,EAAE,CAAC;;CAE9L,GAAG,MAAM;;CAET,GAAG,EAAE,CAAC,aAAa,EAAE,UAAU,EAAE,WAAW,CAAC,MAAM,GAAG,KAAK,CAAC,iBAAiB;CAC7E,IAAI,KAAK,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,EAAE,CAAC;;CAEnF,GAAG,WAAW,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;;CAE3B,GAAG;;CAEH,EAAE;;CAEF;;CAEA,CAAC,SAAS,GAAG,EAAE,SAAS,GAAG;;CAE3B,EAAE,KAAK,SAAS,CAAC,4BAA4B,GAAG,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC;;CAE3E,EAAE,OAAO,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC;;CAElC,EAAE;;CAEF,CAAC,SAAS,MAAM,EAAE,SAAS,GAAG;;CAE9B,EAAE,KAAK,SAAS,CAAC,4BAA4B,GAAG,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC;;CAE3E,EAAE,IAAI,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC;;CAEtC,EAAE,KAAK,IAAI,GAAG;;CAEd,GAAG,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAElC,GAAG,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;;CAE/B,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,MAAM,EAAE,SAAS,EAAE,UAAU,GAAG;;CAE1C,EAAE,KAAK,SAAS,CAAC,4BAA4B,GAAG,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC;;CAE3E,EAAE,IAAI,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC;;CAEtC,EAAE,KAAK,IAAI,KAAK,SAAS,GAAG;;CAE5B,GAAG,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,CAAC;;CAEnE,GAAG,MAAM,KAAK,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,GAAG;;CAEjD,GAAG,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;;CAEtD,GAAG,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;;CAEpC,GAAG;;CAEH,EAAE;;CAEF,CAAC,OAAO;;CAER,EAAE,GAAG,EAAE,GAAG;CACV,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,MAAM,EAAE,MAAM;;CAEhB,EAAE,CAAC;;CAEH,CAAC;;CAED;CACA;CACA;CACA;CACA;;CAEA,SAAS,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,GAAG;;CAEjC,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;CAClB,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;CAClB,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;CAClB,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,IAAI,KAAK,CAAC,YAAY,CAAC;;CAE3C,CAAC;;CAED,KAAK,CAAC,cAAc,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;;CAEpE,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC;;CAE3B,MAAM,CAAC,gBAAgB,EAAE,KAAK,CAAC,SAAS,EAAE;;CAE1C,CAAC,CAAC,EAAE;;CAEJ,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,IAAI,CAAC,EAAE,CAAC;;CAElB,GAAG;;CAEH,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC;CACnB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;;CAE3B,GAAG;;CAEH,EAAE;;CAEF,CAAC,CAAC,EAAE;;CAEJ,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,IAAI,CAAC,EAAE,CAAC;;CAElB,GAAG;;CAEH,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC;CACnB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;;CAE3B,GAAG;;CAEH,EAAE;;CAEF,CAAC,CAAC,EAAE;;CAEJ,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,IAAI,CAAC,EAAE,CAAC;;CAElB,GAAG;;CAEH,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC;CACnB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;;CAE3B,GAAG;;CAEH,EAAE;;CAEF,CAAC,KAAK,EAAE;;CAER,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,IAAI,CAAC,MAAM,CAAC;;CAEtB,GAAG;;CAEH,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;CACvB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;;CAE3B,GAAG;;CAEH,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE;;CAEhC,CAAC,OAAO,EAAE,IAAI;;CAEd,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,GAAG;;CAElC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;CACd,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;CACd,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;CACd,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC;;CAErC,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC;;CAE1B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAExE,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,KAAK,GAAG;;CAE1B,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;CACrB,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;CACrB,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;CACrB,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;;CAE7B,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC;;CAE1B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,qBAAqB,EAAE,WAAW,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG;;CAEtD,EAAE,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;;CAE1B;;CAEA,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC;CACtB,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;CAClD,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;CAClD,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;;CAEnD,EAAE,KAAK,GAAG,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC;;CAE/B,EAAE,KAAK,KAAK,KAAK,KAAK,GAAG;;CAEzB,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE/C,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,OAAO,GAAG;;CAEpC,IAAI,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACvC,IAAI,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAEvC,IAAI,MAAM;;CAEV,IAAI,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACrC,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;;CAEhB,IAAI;;CAEJ,GAAG,MAAM,KAAK,KAAK,KAAK,KAAK,GAAG;;CAEhC,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEjD,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,OAAO,GAAG;;CAEpC,IAAI,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACrC,IAAI,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAErC,IAAI,MAAM;;CAEV,IAAI,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACvC,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;;CAEhB,IAAI;;CAEJ,GAAG,MAAM,KAAK,KAAK,KAAK,KAAK,GAAG;;CAEhC,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE/C,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,OAAO,GAAG;;CAEpC,IAAI,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACvC,IAAI,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAEvC,IAAI,MAAM;;CAEV,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;CAChB,IAAI,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAErC,IAAI;;CAEJ,GAAG,MAAM,KAAK,KAAK,KAAK,KAAK,GAAG;;CAEhC,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEjD,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,OAAO,GAAG;;CAEpC,IAAI,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACrC,IAAI,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAErC,IAAI,MAAM;;CAEV,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;CAChB,IAAI,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAEvC,IAAI;;CAEJ,GAAG,MAAM,KAAK,KAAK,KAAK,KAAK,GAAG;;CAEhC,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE/C,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,OAAO,GAAG;;CAEpC,IAAI,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACvC,IAAI,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAEvC,IAAI,MAAM;;CAEV,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;CAChB,IAAI,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAErC,IAAI;;CAEJ,GAAG,MAAM,KAAK,KAAK,KAAK,KAAK,GAAG;;CAEhC,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEjD,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,OAAO,GAAG;;CAEpC,IAAI,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACrC,IAAI,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAErC,IAAI,MAAM;;CAEV,IAAI,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACvC,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;;CAEhB,IAAI;;CAEJ,GAAG,MAAM;;CAET,GAAG,OAAO,CAAC,IAAI,EAAE,iEAAiE,GAAG,KAAK,EAAE,CAAC;;CAE7F,GAAG;;CAEH,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;;CAEtB,EAAE,KAAK,MAAM,KAAK,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;;CAElD,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,iBAAiB,EAAE,YAAY;;CAEhC,EAAE,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE7B,EAAE,OAAO,SAAS,iBAAiB,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG;;CAExD,GAAG,MAAM,CAAC,0BAA0B,EAAE,CAAC,EAAE,CAAC;;CAE1C,GAAG,OAAO,IAAI,CAAC,qBAAqB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;;CAE9D,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,cAAc,EAAE,WAAW,CAAC,EAAE,KAAK,GAAG;;CAEvC,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;;CAEzD,EAAE;;CAEF,CAAC,OAAO,EAAE,YAAY;;CAEtB;;CAEA,EAAE,IAAI,CAAC,GAAG,IAAI,UAAU,EAAE,CAAC;;CAE3B,EAAE,OAAO,SAAS,OAAO,EAAE,QAAQ,GAAG;;CAEtC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;;CAE1B,GAAG,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;;CAEhD,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,MAAM,EAAE,WAAW,KAAK,GAAG;;CAE5B,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,QAAQ,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,EAAE,MAAM,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,EAAE,MAAM,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;;CAE9H,EAAE;;CAEF,CAAC,SAAS,EAAE,WAAW,KAAK,GAAG;;CAE/B,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;CACvB,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;CACvB,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;CACvB,EAAE,KAAK,KAAK,EAAE,CAAC,EAAE,KAAK,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;;CAE3D,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC;;CAE1B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,OAAO,EAAE,WAAW,KAAK,EAAE,MAAM,GAAG;;CAErC,EAAE,KAAK,KAAK,KAAK,SAAS,GAAG,KAAK,GAAG,EAAE,CAAC;CACxC,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG,MAAM,GAAG,CAAC,CAAC;;CAEzC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;CAC5B,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;CAChC,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;CAChC,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;;CAEpC,EAAE,OAAO,KAAK,CAAC;;CAEf,EAAE;;CAEF,CAAC,SAAS,EAAE,WAAW,cAAc,GAAG;;CAExC,EAAE,KAAK,cAAc,GAAG;;CAExB,GAAG,OAAO,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;;CAE1D,GAAG,MAAM;;CAET,GAAG,OAAO,IAAI,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;;CAEnD,GAAG;;CAEH,EAAE;;CAEF,CAAC,QAAQ,EAAE,WAAW,QAAQ,GAAG;;CAEjC,EAAE,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;;CAEnC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,gBAAgB,EAAE,YAAY,EAAE;;CAEjC,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,MAAM,GAAG;;CAElB,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;;CAEnB,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE;;CAEjC,CAAC,GAAG,EAAE,WAAW,OAAO,GAAG;;CAE3B,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC;;CAE/B,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,OAAO,GAAG;;CAE9B,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC;;CAEhC,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,OAAO,GAAG;;CAE9B,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC;;CAEhC,EAAE;;CAEF,CAAC,OAAO,EAAE,WAAW,OAAO,GAAG;;CAE/B,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;;CAEtC,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,MAAM,GAAG;;CAE3B,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC;;CAE3C,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,IAAI,UAAU,GAAG,CAAC,CAAC;;CAEnB,SAAS,QAAQ,GAAG;;CAEpB,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,UAAU,GAAG,EAAE,EAAE,CAAC;;CAE/D,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;;CAElC,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;CAChB,CAAC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;;CAExB,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;CACpB,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;;CAEpB,CAAC,IAAI,CAAC,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;;CAEtC,CAAC,IAAI,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;CAC9B,CAAC,IAAI,QAAQ,GAAG,IAAI,KAAK,EAAE,CAAC;CAC5B,CAAC,IAAI,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;CACnC,CAAC,IAAI,KAAK,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEpC,CAAC,SAAS,gBAAgB,GAAG;;CAE7B,EAAE,UAAU,CAAC,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;;CAE7C,EAAE;;CAEF,CAAC,SAAS,kBAAkB,GAAG;;CAE/B,EAAE,QAAQ,CAAC,iBAAiB,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;;CAE7D,EAAE;;CAEF,CAAC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CACvC,CAAC,UAAU,CAAC,QAAQ,EAAE,kBAAkB,EAAE,CAAC;;CAE3C,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,EAAE;CAChC,EAAE,QAAQ,EAAE;CACZ,GAAG,UAAU,EAAE,IAAI;CACnB,GAAG,KAAK,EAAE,QAAQ;CAClB,GAAG;CACH,EAAE,QAAQ,EAAE;CACZ,GAAG,UAAU,EAAE,IAAI;CACnB,GAAG,KAAK,EAAE,QAAQ;CAClB,GAAG;CACH,EAAE,UAAU,EAAE;CACd,GAAG,UAAU,EAAE,IAAI;CACnB,GAAG,KAAK,EAAE,UAAU;CACpB,GAAG;CACH,EAAE,KAAK,EAAE;CACT,GAAG,UAAU,EAAE,IAAI;CACnB,GAAG,KAAK,EAAE,KAAK;CACf,GAAG;CACH,EAAE,eAAe,EAAE;CACnB,GAAG,KAAK,EAAE,IAAI,OAAO,EAAE;CACvB,GAAG;CACH,EAAE,YAAY,EAAE;CAChB,GAAG,KAAK,EAAE,IAAI,OAAO,EAAE;CACvB,GAAG;CACH,EAAE,EAAE,CAAC;;CAEL,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;CAC7B,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,OAAO,EAAE,CAAC;;CAElC,CAAC,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,uBAAuB,CAAC;CAC1D,CAAC,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;;CAErC,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;CAC5B,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;;CAErB,CAAC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;CACzB,CAAC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;;CAE5B,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;CAC3B,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;;CAEtB,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;;CAEpB,CAAC;;CAED,QAAQ,CAAC,SAAS,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC5C,QAAQ,CAAC,uBAAuB,GAAG,IAAI,CAAC;;CAExC,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,SAAS,EAAE,EAAE;;CAEhF,CAAC,WAAW,EAAE,QAAQ;;CAEtB,CAAC,UAAU,EAAE,IAAI;;CAEjB,CAAC,cAAc,EAAE,YAAY,EAAE;CAC/B,CAAC,aAAa,EAAE,YAAY,EAAE;;CAE9B,CAAC,WAAW,EAAE,WAAW,MAAM,GAAG;;CAElC,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAEtD,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;;CAEtE,EAAE;;CAEF,CAAC,eAAe,EAAE,WAAW,CAAC,GAAG;;CAEjC,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;;CAEnC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,wBAAwB,EAAE,WAAW,IAAI,EAAE,KAAK,GAAG;;CAEpD;;CAEA,EAAE,IAAI,CAAC,UAAU,CAAC,gBAAgB,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;CAElD,EAAE;;CAEF,CAAC,oBAAoB,EAAE,WAAW,KAAK,GAAG;;CAE1C,EAAE,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;;CAE9C,EAAE;;CAEF,CAAC,qBAAqB,EAAE,WAAW,CAAC,GAAG;;CAEvC;;CAEA,EAAE,IAAI,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC,EAAE,CAAC;;CAE7C,EAAE;;CAEF,CAAC,yBAAyB,EAAE,WAAW,CAAC,GAAG;;CAE3C;;CAEA,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;;CAE5B,EAAE;;CAEF,CAAC,YAAY,EAAE,YAAY;;CAE3B;CACA;;CAEA,EAAE,IAAI,EAAE,GAAG,IAAI,UAAU,EAAE,CAAC;;CAE5B,EAAE,OAAO,SAAS,YAAY,EAAE,IAAI,EAAE,KAAK,GAAG;;CAE9C,GAAG,EAAE,CAAC,gBAAgB,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;CAEtC,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC;;CAElC,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,iBAAiB,EAAE,YAAY;;CAEhC;CACA;CACA;;CAEA,EAAE,IAAI,EAAE,GAAG,IAAI,UAAU,EAAE,CAAC;;CAE5B,EAAE,OAAO,SAAS,iBAAiB,EAAE,IAAI,EAAE,KAAK,GAAG;;CAEnD,GAAG,EAAE,CAAC,gBAAgB,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;CAEtC,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC;;CAErC,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,OAAO,EAAE,YAAY;;CAEtB,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAElC,EAAE,OAAO,SAAS,OAAO,EAAE,KAAK,GAAG;;CAEnC,GAAG,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;;CAEzC,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,OAAO,EAAE,YAAY;;CAEtB,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAElC,EAAE,OAAO,SAAS,OAAO,EAAE,KAAK,GAAG;;CAEnC,GAAG,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;;CAEzC,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,OAAO,EAAE,YAAY;;CAEtB,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAElC,EAAE,OAAO,SAAS,OAAO,EAAE,KAAK,GAAG;;CAEnC,GAAG,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;;CAEzC,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,eAAe,EAAE,YAAY;;CAE9B;CACA;;CAEA,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,OAAO,SAAS,eAAe,EAAE,IAAI,EAAE,QAAQ,GAAG;;CAEpD,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;;CAEtD,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,EAAE,QAAQ,EAAE,EAAE,CAAC;;CAEtD,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,UAAU,EAAE,YAAY;;CAEzB,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAElC,EAAE,OAAO,SAAS,UAAU,EAAE,QAAQ,GAAG;;CAEzC,GAAG,OAAO,IAAI,CAAC,eAAe,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC;;CAE/C,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,UAAU,EAAE,YAAY;;CAEzB,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAElC,EAAE,OAAO,SAAS,UAAU,EAAE,QAAQ,GAAG;;CAEzC,GAAG,OAAO,IAAI,CAAC,eAAe,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC;;CAE/C,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,UAAU,EAAE,YAAY;;CAEzB,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAElC,EAAE,OAAO,SAAS,UAAU,EAAE,QAAQ,GAAG;;CAEzC,GAAG,OAAO,IAAI,CAAC,eAAe,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC;;CAE/C,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,YAAY,EAAE,WAAW,MAAM,GAAG;;CAEnC,EAAE,OAAO,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;;CAEjD,EAAE;;CAEF,CAAC,YAAY,EAAE,YAAY;;CAE3B,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,OAAO,SAAS,YAAY,EAAE,MAAM,GAAG;;CAEzC,GAAG,OAAO,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;;CAEnE,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,MAAM,EAAE,YAAY;;CAErB;;CAEA,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CACzB,EAAE,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE7B,EAAE,OAAO,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;CAEpC,GAAG,KAAK,CAAC,CAAC,SAAS,GAAG;;CAEtB,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;;CAErB,IAAI,MAAM;;CAEV,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE1B,IAAI;;CAEJ,GAAG,KAAK,IAAI,CAAC,QAAQ,GAAG;;CAExB,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;;CAEhD,IAAI,MAAM;;CAEV,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;;CAEhD,IAAI;;CAEJ,GAAG,IAAI,CAAC,UAAU,CAAC,qBAAqB,EAAE,EAAE,EAAE,CAAC;;CAE/C,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,GAAG,EAAE,WAAW,MAAM,GAAG;;CAE1B,EAAE,KAAK,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG;;CAE9B,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAEjD,IAAI,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE/B,IAAI;;CAEJ,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG;;CAEH,EAAE,KAAK,MAAM,KAAK,IAAI,GAAG;;CAEzB,GAAG,OAAO,CAAC,KAAK,EAAE,iEAAiE,EAAE,MAAM,EAAE,CAAC;CAC9F,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG;;CAEH,EAAE,OAAO,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK;;CAEzC,GAAG,KAAK,MAAM,CAAC,MAAM,KAAK,IAAI,GAAG;;CAEjC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;;CAEnC,IAAI;;CAEJ,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;CACxB,GAAG,MAAM,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC;;CAE7C,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;;CAEhC,GAAG,MAAM;;CAET,GAAG,OAAO,CAAC,KAAK,EAAE,+DAA+D,EAAE,MAAM,EAAE,CAAC;;CAE5F,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,MAAM,GAAG;;CAE7B,EAAE,KAAK,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG;;CAE9B,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAEjD,IAAI,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;;CAElC,IAAI;;CAEJ,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG;;CAEH,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;;CAE9C,EAAE,KAAK,KAAK,KAAK,EAAE,CAAC,GAAG;;CAEvB,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;;CAExB,GAAG,MAAM,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;;CAE/C,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;;CAEpC,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,aAAa,EAAE,WAAW,EAAE,GAAG;;CAEhC,EAAE,OAAO,IAAI,CAAC,mBAAmB,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;;CAE9C,EAAE;;CAEF,CAAC,eAAe,EAAE,WAAW,IAAI,GAAG;;CAEpC,EAAE,OAAO,IAAI,CAAC,mBAAmB,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;CAElD,EAAE;;CAEF,CAAC,mBAAmB,EAAE,WAAW,IAAI,EAAE,KAAK,GAAG;;CAE/C,EAAE,KAAK,IAAI,EAAE,IAAI,EAAE,KAAK,KAAK,GAAG,OAAO,IAAI,CAAC;;CAE5C,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAE3D,GAAG,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;CAClC,GAAG,IAAI,MAAM,GAAG,KAAK,CAAC,mBAAmB,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;CAEzD,GAAG,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE/B,IAAI,OAAO,MAAM,CAAC;;CAElB,IAAI;;CAEJ,GAAG;;CAEH,EAAE,OAAO,SAAS,CAAC;;CAEnB,EAAE;;CAEF,CAAC,gBAAgB,EAAE,WAAW,MAAM,GAAG;;CAEvC,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,OAAO,CAAC,IAAI,EAAE,4DAA4D,EAAE,CAAC;CAChF,GAAG,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE1B,GAAG;;CAEH,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;;CAEjC,EAAE,OAAO,MAAM,CAAC,qBAAqB,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;;CAE1D,EAAE;;CAEF,CAAC,kBAAkB,EAAE,YAAY;;CAEjC,EAAE,IAAI,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;CAC/B,EAAE,IAAI,KAAK,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE5B,EAAE,OAAO,SAAS,kBAAkB,EAAE,MAAM,GAAG;;CAE/C,GAAG,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE/B,IAAI,OAAO,CAAC,IAAI,EAAE,8DAA8D,EAAE,CAAC;CACnF,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;;CAE9B,IAAI;;CAEJ,GAAG,IAAI,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;;CAElC,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;;CAEzD,GAAG,OAAO,MAAM,CAAC;;CAEjB,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,aAAa,EAAE,YAAY;;CAE5B,EAAE,IAAI,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;CAC/B,EAAE,IAAI,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;;CAEpC,EAAE,OAAO,SAAS,aAAa,EAAE,MAAM,GAAG;;CAE1C,GAAG,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE/B,IAAI,OAAO,CAAC,IAAI,EAAE,yDAAyD,EAAE,CAAC;CAC9E,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE3B,IAAI;;CAEJ,GAAG,IAAI,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;;CAElC,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;;CAE9D,GAAG,OAAO,MAAM,CAAC;;CAEjB,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,iBAAiB,EAAE,YAAY;;CAEhC,EAAE,IAAI,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;;CAEpC,EAAE,OAAO,SAAS,iBAAiB,EAAE,MAAM,GAAG;;CAE9C,GAAG,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE/B,IAAI,OAAO,CAAC,IAAI,EAAE,6DAA6D,EAAE,CAAC;CAClF,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE3B,IAAI;;CAEJ,GAAG,IAAI,CAAC,kBAAkB,EAAE,UAAU,EAAE,CAAC;;CAEzC,GAAG,OAAO,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,UAAU,EAAE,CAAC;;CAE9D,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,OAAO,EAAE,YAAY,EAAE;;CAExB,CAAC,QAAQ,EAAE,WAAW,QAAQ,GAAG;;CAEjC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;CAEnB,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAE/B,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEtD,GAAG,QAAQ,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC;;CAEtC,GAAG;;CAEH,EAAE;;CAEF,CAAC,eAAe,EAAE,WAAW,QAAQ,GAAG;;CAExC,EAAE,KAAK,IAAI,CAAC,OAAO,KAAK,KAAK,GAAG,OAAO;;CAEvC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;CAEnB,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAE/B,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEtD,GAAG,QAAQ,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,QAAQ,EAAE,CAAC;;CAE7C,GAAG;;CAEH,EAAE;;CAEF,CAAC,iBAAiB,EAAE,WAAW,QAAQ,GAAG;;CAE1C,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;CAE3B,EAAE,KAAK,MAAM,KAAK,IAAI,GAAG;;CAEzB,GAAG,QAAQ,EAAE,MAAM,EAAE,CAAC;;CAEtB,GAAG,MAAM,CAAC,iBAAiB,EAAE,QAAQ,EAAE,CAAC;;CAExC,GAAG;;CAEH,EAAE;;CAEF,CAAC,YAAY,EAAE,YAAY;;CAE3B,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;;CAEpE,EAAE,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;;CAErC,EAAE;;CAEF,CAAC,iBAAiB,EAAE,WAAW,KAAK,GAAG;;CAEvC,EAAE,KAAK,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;;CAEnD,EAAE,KAAK,IAAI,CAAC,sBAAsB,IAAI,KAAK,GAAG;;CAE9C,GAAG,KAAK,IAAI,CAAC,MAAM,KAAK,IAAI,GAAG;;CAE/B,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAEzC,IAAI,MAAM;;CAEV,IAAI,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAE9E,IAAI;;CAEJ,GAAG,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;;CAEvC,GAAG,KAAK,GAAG,IAAI,CAAC;;CAEhB,GAAG;;CAEH;;CAEA,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAE/B,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEtD,GAAG,QAAQ,EAAE,CAAC,EAAE,CAAC,iBAAiB,EAAE,KAAK,EAAE,CAAC;;CAE5C,GAAG;;CAEH,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,IAAI,GAAG;;CAE3B;CACA,EAAE,IAAI,YAAY,KAAK,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;;CAExE,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC;;CAElB;CACA;CACA;CACA,EAAE,KAAK,YAAY,GAAG;;CAEtB;CACA,GAAG,IAAI,GAAG;CACV,IAAI,UAAU,EAAE,EAAE;CAClB,IAAI,SAAS,EAAE,EAAE;CACjB,IAAI,QAAQ,EAAE,EAAE;CAChB,IAAI,MAAM,EAAE,EAAE;CACd,IAAI,MAAM,EAAE,EAAE;CACd,IAAI,CAAC;;CAEL,GAAG,MAAM,CAAC,QAAQ,GAAG;CACrB,IAAI,OAAO,EAAE,GAAG;CAChB,IAAI,IAAI,EAAE,QAAQ;CAClB,IAAI,SAAS,EAAE,iBAAiB;CAChC,IAAI,CAAC;;CAEL,GAAG;;CAEH;;CAEA,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC;;CAElB,EAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;CAC1B,EAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;;CAE1B,EAAE,KAAK,IAAI,CAAC,IAAI,KAAK,EAAE,GAAG,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;CAClD,EAAE,KAAK,IAAI,CAAC,UAAU,KAAK,IAAI,GAAG,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC;CAC3D,EAAE,KAAK,IAAI,CAAC,aAAa,KAAK,IAAI,GAAG,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC;CACjE,EAAE,KAAK,IAAI,CAAC,OAAO,KAAK,KAAK,GAAG,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;CACvD,EAAE,KAAK,IAAI,CAAC,aAAa,KAAK,KAAK,GAAG,MAAM,CAAC,aAAa,GAAG,KAAK,CAAC;CACnE,EAAE,KAAK,IAAI,CAAC,WAAW,KAAK,CAAC,GAAG,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;CACtE,EAAE,KAAK,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,GAAG,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAElF,EAAE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;;CAExC,EAAE,KAAK,IAAI,CAAC,gBAAgB,KAAK,KAAK,GAAG,MAAM,CAAC,gBAAgB,GAAG,KAAK,CAAC;;CAEzE;;CAEA,EAAE,SAAS,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG;;CAEzC,GAAG,KAAK,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,SAAS,GAAG;;CAEhD,IAAI,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;;CAErD,IAAI;;CAEJ,GAAG,OAAO,OAAO,CAAC,IAAI,CAAC;;CAEvB,GAAG;;CAEH,EAAE,KAAK,IAAI,CAAC,QAAQ,KAAK,SAAS,GAAG;;CAErC,GAAG,MAAM,CAAC,QAAQ,GAAG,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;;CAEjE,GAAG,IAAI,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;;CAE7C,GAAG,KAAK,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,GAAG;;CAEtE,IAAI,IAAI,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;;CAEnC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG;;CAEnC,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEvD,MAAM,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC;;CAE9B,MAAM,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;;CAEtC,MAAM;;CAEN,KAAK,MAAM;;CAEX,KAAK,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;;CAEtC,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH,EAAE,KAAK,IAAI,CAAC,QAAQ,KAAK,SAAS,GAAG;;CAErC,GAAG,KAAK,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG;;CAEzC,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;;CAEnB,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAE7D,KAAK,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;;CAEnE,KAAK;;CAEL,IAAI,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC;;CAE5B,IAAI,MAAM;;CAEV,IAAI,MAAM,CAAC,QAAQ,GAAG,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;;CAEjE,IAAI;;CAEJ,GAAG;;CAEH;;CAEA,EAAE,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG;;CAElC,GAAG,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC;;CAExB,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAErD,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;;CAErE,IAAI;;CAEJ,GAAG;;CAEH,EAAE,KAAK,YAAY,GAAG;;CAEtB,GAAG,IAAI,UAAU,GAAG,gBAAgB,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;CACxD,GAAG,IAAI,SAAS,GAAG,gBAAgB,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;CACtD,GAAG,IAAI,QAAQ,GAAG,gBAAgB,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;CACpD,GAAG,IAAI,MAAM,GAAG,gBAAgB,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;CAChD,GAAG,IAAI,MAAM,GAAG,gBAAgB,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAEhD,GAAG,KAAK,UAAU,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;CAC/D,GAAG,KAAK,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;CAC5D,GAAG,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;CACzD,GAAG,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;CACnD,GAAG,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;;CAEnD,GAAG;;CAEH,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;;CAEzB,EAAE,OAAO,MAAM,CAAC;;CAEhB;CACA;CACA;CACA,EAAE,SAAS,gBAAgB,EAAE,KAAK,GAAG;;CAErC,GAAG,IAAI,MAAM,GAAG,EAAE,CAAC;CACnB,GAAG,MAAM,IAAI,GAAG,IAAI,KAAK,GAAG;;CAE5B,IAAI,IAAI,IAAI,GAAG,KAAK,EAAE,GAAG,EAAE,CAAC;CAC5B,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC;CACzB,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAExB,IAAI;CACJ,GAAG,OAAO,MAAM,CAAC;;CAEjB,GAAG;;CAEH,EAAE;;CAEF,CAAC,KAAK,EAAE,WAAW,SAAS,GAAG;;CAE/B,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;CAExD,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,MAAM,EAAE,SAAS,GAAG;;CAEtC,EAAE,KAAK,SAAS,KAAK,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC;;CAElD,EAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;;CAE1B,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;;CAE5B,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;CACxC,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;CAC5C,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;;CAElC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;CACpC,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;;CAE9C,EAAE,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;CAClD,EAAE,IAAI,CAAC,sBAAsB,GAAG,MAAM,CAAC,sBAAsB,CAAC;;CAE9D,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;CACxC,EAAE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;;CAEhC,EAAE,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;CACtC,EAAE,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;;CAE5C,EAAE,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;CAC5C,EAAE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;;CAExC,EAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;;CAElE,EAAE,KAAK,SAAS,KAAK,IAAI,GAAG;;CAE5B,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAEvD,IAAI,IAAI,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;CACrC,IAAI,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;;CAE9B,IAAI;;CAEJ,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;;CAEA,SAAS,MAAM,GAAG;;CAElB,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;;CAEtB,CAAC,IAAI,CAAC,kBAAkB,GAAG,IAAI,OAAO,EAAE,CAAC;CACzC,CAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEvC,CAAC;;CAED,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,EAAE;;CAEvE,CAAC,WAAW,EAAE,MAAM;;CAEpB,CAAC,QAAQ,EAAE,IAAI;;CAEf,CAAC,IAAI,EAAE,WAAW,MAAM,EAAE,SAAS,GAAG;;CAEtC,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;;CAE1D,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,kBAAkB,EAAE,CAAC;CAC5D,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,gBAAgB,EAAE,CAAC;;CAExD,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,iBAAiB,EAAE,YAAY;;CAEhC,EAAE,IAAI,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;;CAEpC,EAAE,OAAO,SAAS,iBAAiB,EAAE,MAAM,GAAG;;CAE9C,GAAG,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE/B,IAAI,OAAO,CAAC,IAAI,EAAE,2DAA2D,EAAE,CAAC;CAChF,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE3B,IAAI;;CAEJ,GAAG,IAAI,CAAC,kBAAkB,EAAE,UAAU,EAAE,CAAC;;CAEzC,GAAG,OAAO,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,UAAU,EAAE,CAAC;;CAEhE,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,iBAAiB,EAAE,WAAW,KAAK,GAAG;;CAEvC,EAAE,QAAQ,CAAC,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;CAE3D,EAAE,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;;CAEzD,EAAE;;CAEF,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7C,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;;CAEA,SAAS,kBAAkB,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG;;CAEnE,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAErB,CAAC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;;CAElC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;CACf,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;;CAElB,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;CAClB,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;CACpB,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;CAChB,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;;CAEtB,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,IAAI,KAAK,SAAS,KAAK,IAAI,GAAG,GAAG,CAAC;CACjD,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,GAAG,KAAK,SAAS,KAAK,GAAG,GAAG,IAAI,CAAC;;CAE/C,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC;;CAE/B,CAAC;;CAED,kBAAkB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,EAAE;;CAEjF,CAAC,WAAW,EAAE,kBAAkB;;CAEhC,CAAC,oBAAoB,EAAE,IAAI;;CAE3B,CAAC,IAAI,EAAE,WAAW,MAAM,EAAE,SAAS,GAAG;;CAEtC,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;;CAExD,EAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;CAC1B,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;CAC5B,EAAE,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;CACxB,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;CAC9B,EAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;CAC1B,EAAE,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;;CAExB,EAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;CAC1B,EAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,KAAK,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;;CAE7E,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,aAAa,EAAE,WAAW,SAAS,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG;;CAExE,EAAE,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,GAAG;;CAE5B,GAAG,IAAI,CAAC,IAAI,GAAG;CACf,IAAI,OAAO,EAAE,IAAI;CACjB,IAAI,SAAS,EAAE,CAAC;CAChB,IAAI,UAAU,EAAE,CAAC;CACjB,IAAI,OAAO,EAAE,CAAC;CACd,IAAI,OAAO,EAAE,CAAC;CACd,IAAI,KAAK,EAAE,CAAC;CACZ,IAAI,MAAM,EAAE,CAAC;CACb,IAAI,CAAC;;CAEL,GAAG;;CAEH,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;CAC3B,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;CAClC,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;CACpC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;CACxB,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;CACxB,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;CAC1B,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;;CAE5B,EAAE,IAAI,CAAC,sBAAsB,EAAE,CAAC;;CAEhC,EAAE;;CAEF,CAAC,eAAe,EAAE,YAAY;;CAE9B,EAAE,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,GAAG;;CAE5B,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;;CAE7B,GAAG;;CAEH,EAAE,IAAI,CAAC,sBAAsB,EAAE,CAAC;;CAEhC,EAAE;;CAEF,CAAC,sBAAsB,EAAE,YAAY;;CAErC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;CAC1D,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;CAC1D,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;CAC1C,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;;CAE1C,EAAE,IAAI,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC;CACrB,EAAE,IAAI,KAAK,GAAG,EAAE,GAAG,EAAE,CAAC;CACtB,EAAE,IAAI,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;CACpB,EAAE,IAAI,MAAM,GAAG,EAAE,GAAG,EAAE,CAAC;;CAEvB,EAAE,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG;;CAEjD,GAAG,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;CACrE,GAAG,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;CACvE,GAAG,IAAI,MAAM,GAAG,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;CAC7D,GAAG,IAAI,MAAM,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;;CAE9D,GAAG,IAAI,IAAI,MAAM,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,EAAE,CAAC;CAClD,GAAG,KAAK,GAAG,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC;CACvD,GAAG,GAAG,IAAI,MAAM,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,EAAE,CAAC;CACjD,GAAG,MAAM,GAAG,GAAG,GAAG,MAAM,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;;CAExD,GAAG;;CAEH,EAAE,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;;CAE1F,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,IAAI,GAAG;;CAE3B,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE1D,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;CAC/B,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;CAC/B,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;CACjC,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;CAC7B,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;CACnC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;CAC/B,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;;CAE7B,EAAE,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;;CAE9E,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;;CAEA,SAAS,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG;;CAExD,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;CACZ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;CACZ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;;CAEZ,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,MAAM,IAAI,MAAM,CAAC,SAAS,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;CACvE,CAAC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,EAAE,CAAC;;CAE5D,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;CAC/D,CAAC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,KAAK,GAAG,EAAE,CAAC;;CAEzD,CAAC,IAAI,CAAC,aAAa,GAAG,aAAa,KAAK,SAAS,GAAG,aAAa,GAAG,CAAC,CAAC;;CAEtE,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE;;CAEhC,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7C,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,MAAM,GAAG;;CAE3B,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;CACpB,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;CACpB,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;;CAEpB,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;CACpC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;;CAElC,EAAE,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;;CAE5C,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEpE,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;;CAE/D,GAAG;;CAEH,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEnE,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;;CAE7D,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,IAAI,UAAU,GAAG,CAAC,CAAC;;CAEnB,SAAS,QAAQ,GAAG;;CAEpB,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,UAAU,IAAI,CAAC,EAAE,EAAE,CAAC;;CAEjE,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;;CAElC,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;CAChB,CAAC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;;CAExB,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;CACpB,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;CAClB,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;CACjB,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC,CAAC;;CAE3B,CAAC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;CACxB,CAAC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;;CAExB,CAAC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;CACvB,CAAC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;;CAEzB,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;CACzB,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;;CAE5B;;CAEA,CAAC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;CACjC,CAAC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;CACjC,CAAC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;CAC5B,CAAC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;CAChC,CAAC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;CAC/B,CAAC,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC;CACtC,CAAC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;;CAE/B,CAAC;;CAED,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,SAAS,EAAE,EAAE;;CAEhF,CAAC,WAAW,EAAE,QAAQ;;CAEtB,CAAC,UAAU,EAAE,IAAI;;CAEjB,CAAC,WAAW,EAAE,WAAW,MAAM,GAAG;;CAElC,EAAE,IAAI,YAAY,GAAG,IAAI,OAAO,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;;CAE7D,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAE7D,GAAG,IAAI,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;CACnC,GAAG,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;;CAEjC,GAAG;;CAEH,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAE1D,GAAG,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;CAC9B,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC,SAAS,EAAE,CAAC;;CAExD,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEnE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC,SAAS,EAAE,CAAC;;CAErE,IAAI;;CAEJ,GAAG;;CAEH,EAAE,KAAK,IAAI,CAAC,WAAW,KAAK,IAAI,GAAG;;CAEnC,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;;CAE7B,GAAG;;CAEH,EAAE,KAAK,IAAI,CAAC,cAAc,KAAK,IAAI,GAAG;;CAEtC,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;;CAEhC,GAAG;;CAEH,EAAE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;CACjC,EAAE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;;CAEhC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,OAAO,EAAE,YAAY;;CAEtB;;CAEA,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,OAAO,SAAS,OAAO,EAAE,KAAK,GAAG;;CAEnC,GAAG,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC;;CAE7B,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC;;CAE1B,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,OAAO,EAAE,YAAY;;CAEtB;;CAEA,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,OAAO,SAAS,OAAO,EAAE,KAAK,GAAG;;CAEnC,GAAG,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC;;CAE7B,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC;;CAE1B,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,OAAO,EAAE,YAAY;;CAEtB;;CAEA,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,OAAO,SAAS,OAAO,EAAE,KAAK,GAAG;;CAEnC,GAAG,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC;;CAE7B,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC;;CAE1B,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,SAAS,EAAE,YAAY;;CAExB;;CAEA,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,OAAO,SAAS,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;CAEvC,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEjC,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC;;CAE1B,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,KAAK,EAAE,YAAY;;CAEpB;;CAEA,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,OAAO,SAAS,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;CAEnC,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE3B,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC;;CAE1B,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,MAAM,EAAE,YAAY;;CAErB,EAAE,IAAI,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAC;;CAE3B,EAAE,OAAO,SAAS,MAAM,EAAE,MAAM,GAAG;;CAEnC,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;;CAExB,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;;CAEtB,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;;CAElC,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,kBAAkB,EAAE,WAAW,QAAQ,GAAG;;CAE3C,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC;;CAEnB,EAAE,IAAI,OAAO,GAAG,QAAQ,CAAC,KAAK,KAAK,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC;CAC3E,EAAE,IAAI,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;;CAEvC,EAAE,IAAI,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC;CAC5C,EAAE,IAAI,OAAO,GAAG,UAAU,CAAC,MAAM,KAAK,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC;CACtF,EAAE,IAAI,MAAM,GAAG,UAAU,CAAC,KAAK,KAAK,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC;CACnF,EAAE,IAAI,GAAG,GAAG,UAAU,CAAC,EAAE,KAAK,SAAS,GAAG,UAAU,CAAC,EAAE,CAAC,KAAK,GAAG,SAAS,CAAC;CAC1E,EAAE,IAAI,IAAI,GAAG,UAAU,CAAC,GAAG,KAAK,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,GAAG,SAAS,CAAC;;CAE7E,EAAE,KAAK,IAAI,KAAK,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;;CAEzD,EAAE,IAAI,WAAW,GAAG,EAAE,CAAC;CACvB,EAAE,IAAI,OAAO,GAAG,EAAE,CAAC;CACnB,EAAE,IAAI,QAAQ,GAAG,EAAE,CAAC;;CAEpB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;;CAEjE,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC;;CAEhG,GAAG,KAAK,OAAO,KAAK,SAAS,GAAG;;CAEhC,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC;;CAExF,IAAI;;CAEJ,GAAG,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE/B,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC;;CAEpF,IAAI;;CAEJ,GAAG,KAAK,GAAG,KAAK,SAAS,GAAG;;CAE5B,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC;;CAE1D,IAAI;;CAEJ,GAAG,KAAK,IAAI,KAAK,SAAS,GAAG;;CAE7B,IAAI,QAAQ,CAAC,IAAI,EAAE,IAAI,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC;;CAE7D,IAAI;;CAEJ,GAAG;;CAEH,EAAE,SAAS,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,GAAG;;CAE7C,GAAG,IAAI,aAAa,GAAG,OAAO,KAAK,SAAS,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC;CACrI,GAAG,IAAI,YAAY,GAAG,MAAM,KAAK,SAAS,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC;;CAEtI,GAAG,IAAI,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;;CAE/E,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE5B,GAAG,KAAK,GAAG,KAAK,SAAS,GAAG;;CAE5B,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC;;CAE1G,IAAI;;CAEJ,GAAG,KAAK,IAAI,KAAK,SAAS,GAAG;;CAE7B,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC;;CAE7G,IAAI;;CAEJ,GAAG;;CAEH,EAAE,IAAI,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;;CAE/B,EAAE,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG;;CAE3B,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAE9C,IAAI,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC;;CAE5B,IAAI,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;CAC5B,IAAI,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;;CAE5B,IAAI,MAAM,IAAI,CAAC,GAAG,KAAK,EAAE,EAAE,GAAG,KAAK,GAAG,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG;;CAE9D,KAAK,KAAK,OAAO,KAAK,SAAS,GAAG;;CAElC,MAAM,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC;;CAEvF,MAAM,MAAM;;CAEZ,MAAM,OAAO,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC;;CAEtD,MAAM;;CAEN,KAAK;;CAEL,IAAI;;CAEJ,GAAG,MAAM;;CAET,GAAG,KAAK,OAAO,KAAK,SAAS,GAAG;;CAEhC,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG;;CAElD,KAAK,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;;CAEjE,KAAK;;CAEL,IAAI,MAAM;;CAEV,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;;CAExD,KAAK,OAAO,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;;CAEhC,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC;;CAE5B,EAAE,KAAK,QAAQ,CAAC,WAAW,KAAK,IAAI,GAAG;;CAEvC,GAAG,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;;CAEnD,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,cAAc,KAAK,IAAI,GAAG;;CAE1C,GAAG,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;;CAEzD,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,YAAY;;CAErB,EAAE,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE7B,EAAE,OAAO,SAAS,MAAM,GAAG;;CAE3B,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;;CAE7B,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC;;CAEjD,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAElD,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,SAAS,EAAE,YAAY;;CAExB,EAAE,IAAI,CAAC,qBAAqB,EAAE,CAAC;;CAE/B,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;CAC1C,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;;CAE1C,EAAE,IAAI,CAAC,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC;;CAE1C,EAAE,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;CAC7B,EAAE,MAAM,CAAC,GAAG;CACZ,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;CAC1B,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;CAC1B,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;CAC1B,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CACb,GAAG,CAAC;;CAEJ,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;;CAE7B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,kBAAkB,EAAE,YAAY;;CAEjC,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,EAAE,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE7C,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAE1D,GAAG,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;;CAE9B,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CACpC,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CACpC,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;;CAEpC,GAAG,EAAE,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;CAC3B,GAAG,EAAE,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;CAC3B,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC;;CAElB,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;;CAElB,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;;CAE1B,GAAG;;CAEH,EAAE;;CAEF,CAAC,oBAAoB,EAAE,WAAW,YAAY,GAAG;;CAEjD,EAAE,KAAK,YAAY,KAAK,SAAS,GAAG,YAAY,GAAG,IAAI,CAAC;;CAExD,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC;;CAEnC,EAAE,QAAQ,GAAG,IAAI,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;;CAE/C,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEzD,GAAG,QAAQ,EAAE,CAAC,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEjC,GAAG;;CAEH,EAAE,KAAK,YAAY,GAAG;;CAEtB;CACA;;CAEA,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;CAClB,GAAG,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,EAAE,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE9C,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEvD,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;;CAE3B,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CACjC,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CACjC,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;;CAEjC,IAAI,EAAE,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;CAC5B,IAAI,EAAE,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;CAC5B,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC;;CAEnB,IAAI,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC;CACjC,IAAI,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC;CACjC,IAAI,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC;;CAEjC,IAAI;;CAEJ,GAAG,MAAM;;CAET,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;;CAE7B,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEvD,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;;CAE3B,IAAI,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;CAC1C,IAAI,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;CAC1C,IAAI,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAE1C,IAAI;;CAEJ,GAAG;;CAEH,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEzD,GAAG,QAAQ,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC;;CAE7B,GAAG;;CAEH,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEtD,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;;CAE1B,GAAG,IAAI,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;;CAE1C,GAAG,KAAK,aAAa,CAAC,MAAM,KAAK,CAAC,GAAG;;CAErC,IAAI,aAAa,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;CAClD,IAAI,aAAa,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;CAClD,IAAI,aAAa,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;;CAElD,IAAI,MAAM;;CAEV,IAAI,aAAa,EAAE,CAAC,EAAE,GAAG,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;CACpD,IAAI,aAAa,EAAE,CAAC,EAAE,GAAG,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;CACpD,IAAI,aAAa,EAAE,CAAC,EAAE,GAAG,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;;CAEpD,IAAI;;CAEJ,GAAG;;CAEH,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG;;CAE/B,GAAG,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;;CAEjC,GAAG;;CAEH,EAAE;;CAEF,CAAC,wBAAwB,EAAE,YAAY;;CAEvC,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC;;CAElB,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC;;CAE5B,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEtD,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;;CAE1B,GAAG,IAAI,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;;CAE1C,GAAG,KAAK,aAAa,CAAC,MAAM,KAAK,CAAC,GAAG;;CAErC,IAAI,aAAa,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;CAC3C,IAAI,aAAa,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;CAC3C,IAAI,aAAa,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAE3C,IAAI,MAAM;;CAEV,IAAI,aAAa,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;CAC7C,IAAI,aAAa,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;CAC7C,IAAI,aAAa,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;;CAE7C,IAAI;;CAEJ,GAAG;;CAEH,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG;;CAE/B,GAAG,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;;CAEjC,GAAG;;CAEH,EAAE;;CAEF,CAAC,mBAAmB,EAAE,YAAY;;CAElC,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC;;CAEzB;CACA;CACA;;CAEA,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEtD,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;;CAE1B,GAAG,KAAK,EAAE,IAAI,CAAC,oBAAoB,GAAG;;CAEtC,IAAI,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;;CAEpD,IAAI,MAAM;;CAEV,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAElD,IAAI;;CAEJ,GAAG,KAAK,EAAE,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,GAAG,EAAE,CAAC;;CAE3E,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAE/D,IAAI,KAAK,EAAE,IAAI,CAAC,uBAAuB,EAAE,CAAC,EAAE,GAAG;;CAE/C,KAAK,IAAI,CAAC,uBAAuB,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;;CAEzE,KAAK,MAAM;;CAEX,KAAK,IAAI,CAAC,uBAAuB,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEvE,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH;;CAEA,EAAE,IAAI,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;CAC9B,EAAE,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;;CAE5B,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAE7D;;CAEA,GAAG,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,GAAG;;CAEnC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;CAChC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,WAAW,GAAG,EAAE,CAAC;CAC5C,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,aAAa,GAAG,EAAE,CAAC;;CAE9C,IAAI,IAAI,cAAc,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC;CAC5D,IAAI,IAAI,gBAAgB,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,aAAa,CAAC;;CAEhE,IAAI,IAAI,UAAU,EAAE,aAAa,CAAC;;CAElC,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAExD,KAAK,UAAU,GAAG,IAAI,OAAO,EAAE,CAAC;CAChC,KAAK,aAAa,GAAG,EAAE,CAAC,EAAE,IAAI,OAAO,EAAE,EAAE,CAAC,EAAE,IAAI,OAAO,EAAE,EAAE,CAAC,EAAE,IAAI,OAAO,EAAE,EAAE,CAAC;;CAE9E,KAAK,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC;CACvC,KAAK,gBAAgB,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC;;CAE5C,KAAK;;CAEL,IAAI;;CAEJ,GAAG,IAAI,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC;;CAE7C;;CAEA,GAAG,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC;;CAErD;;CAEA,GAAG,MAAM,CAAC,kBAAkB,EAAE,CAAC;CAC/B,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAC;;CAEjC;;CAEA,GAAG,IAAI,UAAU,EAAE,aAAa,CAAC;;CAEjC,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEvD,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;;CAE3B,IAAI,UAAU,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;CAC/C,IAAI,aAAa,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC;;CAEpD,IAAI,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAEnC,IAAI,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;CACpD,IAAI,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;CACpD,IAAI,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEpD,IAAI;;CAEJ,GAAG;;CAEH;;CAEA,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEtD,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;;CAE1B,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC;CAC3C,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,uBAAuB,CAAC;;CAErD,GAAG;;CAEH,EAAE;;CAEF,CAAC,kBAAkB,EAAE,YAAY;;CAEjC,EAAE,KAAK,IAAI,CAAC,WAAW,KAAK,IAAI,GAAG;;CAEnC,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;;CAEjC,GAAG;;CAEH,EAAE,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;;CAElD,EAAE;;CAEF,CAAC,qBAAqB,EAAE,YAAY;;CAEpC,EAAE,KAAK,IAAI,CAAC,cAAc,KAAK,IAAI,GAAG;;CAEtC,GAAG,IAAI,CAAC,cAAc,GAAG,IAAI,MAAM,EAAE,CAAC;;CAEtC,GAAG;;CAEH,EAAE,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;;CAErD,EAAE;;CAEF,CAAC,KAAK,EAAE,WAAW,QAAQ,EAAE,MAAM,EAAE,mBAAmB,GAAG;;CAE3D,EAAE,KAAK,IAAI,QAAQ,IAAI,QAAQ,CAAC,UAAU,EAAE,GAAG;;CAE/C,GAAG,OAAO,CAAC,KAAK,EAAE,qEAAqE,EAAE,QAAQ,EAAE,CAAC;CACpG,GAAG,OAAO;;CAEV,GAAG;;CAEH,EAAE,IAAI,YAAY;CAClB,GAAG,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM;CACtC,GAAG,SAAS,GAAG,IAAI,CAAC,QAAQ;CAC5B,GAAG,SAAS,GAAG,QAAQ,CAAC,QAAQ;CAChC,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK;CACtB,GAAG,MAAM,GAAG,QAAQ,CAAC,KAAK;CAC1B,GAAG,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE;CACjC,GAAG,IAAI,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,EAAE;CACrC,GAAG,OAAO,GAAG,IAAI,CAAC,MAAM;CACxB,GAAG,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC;;CAE7B,EAAE,KAAK,mBAAmB,KAAK,SAAS,GAAG,mBAAmB,GAAG,CAAC,CAAC;;CAEnE,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,YAAY,GAAG,IAAI,OAAO,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;;CAE1D,GAAG;;CAEH;;CAEA,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEzD,GAAG,IAAI,MAAM,GAAG,SAAS,EAAE,CAAC,EAAE,CAAC;;CAE/B,GAAG,IAAI,UAAU,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;;CAEnC,GAAG,KAAK,MAAM,KAAK,SAAS,GAAG,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;;CAEjE,GAAG,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC;;CAEhC,GAAG;;CAEH;;CAEA,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEvD,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;;CAExC,GAAG;;CAEH;;CAEA,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAElD,GAAG,IAAI,IAAI,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK;CAClD,IAAI,iBAAiB,GAAG,IAAI,CAAC,aAAa;CAC1C,IAAI,gBAAgB,GAAG,IAAI,CAAC,YAAY,CAAC;;CAEzC,GAAG,QAAQ,GAAG,IAAI,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,YAAY,EAAE,IAAI,CAAC,CAAC,GAAG,YAAY,EAAE,IAAI,CAAC,CAAC,GAAG,YAAY,EAAE,CAAC;CAC/F,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAEvC,GAAG,KAAK,YAAY,KAAK,SAAS,GAAG;;CAErC,IAAI,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC,SAAS,EAAE,CAAC;;CAE7D,IAAI;;CAEJ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,iBAAiB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAElE,IAAI,MAAM,GAAG,iBAAiB,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;;CAE5C,IAAI,KAAK,YAAY,KAAK,SAAS,GAAG;;CAEtC,KAAK,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC,SAAS,EAAE,CAAC;;CAErD,KAAK;;CAEL,IAAI,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE1C,IAAI;;CAEJ,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;;CAErC,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEjE,IAAI,KAAK,GAAG,gBAAgB,EAAE,CAAC,EAAE,CAAC;CAClC,IAAI,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;;CAEhD,IAAI;;CAEJ,GAAG,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,GAAG,mBAAmB,CAAC;;CAErE,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;;CAE3B,GAAG;;CAEH;;CAEA,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEhD,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;;CAEnC,GAAG,KAAK,EAAE,KAAK,SAAS,GAAG;;CAE3B,IAAI,SAAS;;CAEb,IAAI;;CAEJ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEnD,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;;CAEnC,IAAI;;CAEJ,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;;CAEvB,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,EAAE,WAAW,IAAI,GAAG;;CAE9B,EAAE,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG;;CAEnC,GAAG,OAAO,CAAC,KAAK,EAAE,iEAAiE,EAAE,IAAI,EAAE,CAAC;CAC5F,GAAG,OAAO;;CAEV,GAAG;;CAEH,EAAE,KAAK,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;;CAEnD,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAE3C,EAAE;;CAEF;CACA;CACA;CACA;CACA;;CAEA,CAAC,aAAa,EAAE,YAAY;;CAE5B,EAAE,IAAI,WAAW,GAAG,EAAE,CAAC;CACvB,EAAE,IAAI,MAAM,GAAG,EAAE,EAAE,OAAO,GAAG,EAAE,CAAC;;CAEhC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC;CACb,EAAE,IAAI,eAAe,GAAG,CAAC,CAAC;CAC1B,EAAE,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,eAAe,EAAE,CAAC;CAClD,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC;CAClB,EAAE,IAAI,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;;CAErB,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEzD,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;CAC1B,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,EAAE,CAAC;;CAEnH,GAAG,KAAK,WAAW,EAAE,GAAG,EAAE,KAAK,SAAS,GAAG;;CAE3C,IAAI,WAAW,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;CAC3B,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;CACtC,IAAI,OAAO,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;;CAErC,IAAI,MAAM;;CAEV;CACA,IAAI,OAAO,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,CAAC;;CAEjD,IAAI;;CAEJ,GAAG;;;CAGH;CACA;CACA,EAAE,IAAI,mBAAmB,GAAG,EAAE,CAAC;;CAE/B,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEtD,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;;CAE1B,GAAG,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CAC9B,GAAG,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CAC9B,GAAG,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;;CAE9B,GAAG,OAAO,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;;CAExC;CACA;CACA,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAElC,IAAI,KAAK,OAAO,EAAE,CAAC,EAAE,KAAK,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG;;CAErD,KAAK,mBAAmB,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;CACnC,KAAK,MAAM;;CAEX,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH,EAAE,MAAM,CAAC,GAAG,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG;;CAE3D,GAAG,IAAI,GAAG,GAAG,mBAAmB,EAAE,CAAC,EAAE,CAAC;;CAEtC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;;CAE/B,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAE/D,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;;CAE7C,IAAI;;CAEJ,GAAG;;CAEH;;CAEA,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;CAClD,EAAE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC;CACzB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,aAAa,EAAE,WAAW,MAAM,GAAG;;CAEpC,EAAE,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;;CAErB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEpD,GAAG,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC;CAC3B,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;;CAEvE,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,wBAAwB,EAAE,YAAY;;CAEvC,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;CACzB,EAAE,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;;CAE5B;;CAEA,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,GAAG;;CAEtC,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;;CAEtB,GAAG;;CAEH;;CAEA,EAAE,SAAS,iBAAiB,EAAE,CAAC,EAAE,CAAC,GAAG;;CAErC,GAAG,OAAO,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,aAAa,CAAC;;CAE5C,GAAG;;CAEH,EAAE,KAAK,CAAC,IAAI,EAAE,iBAAiB,EAAE,CAAC;;CAElC;;CAEA,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC;CACrC,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC;;CAErC,EAAE,IAAI,OAAO,EAAE,OAAO,CAAC;;CAEvB,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,GAAG,OAAO,GAAG,EAAE,CAAC;CACrD,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,GAAG,OAAO,GAAG,EAAE,CAAC;;CAErD,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,GAAG;;CAEtC,GAAG,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC;;CAE3B,GAAG,KAAK,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC;CAC7C,GAAG,KAAK,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC;;CAE7C,GAAG;;CAEH,EAAE,KAAK,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC;CACnD,EAAE,KAAK,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC;;CAEnD,EAAE;;CAEF,CAAC,MAAM,EAAE,YAAY;;CAErB,EAAE,IAAI,IAAI,GAAG;CACb,GAAG,QAAQ,EAAE;CACb,IAAI,OAAO,EAAE,GAAG;CAChB,IAAI,IAAI,EAAE,UAAU;CACpB,IAAI,SAAS,EAAE,iBAAiB;CAChC,IAAI;CACJ,GAAG,CAAC;;CAEJ;;CAEA,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;CACxB,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;CACxB,EAAE,KAAK,IAAI,CAAC,IAAI,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;;CAEhD,EAAE,KAAK,IAAI,CAAC,UAAU,KAAK,SAAS,GAAG;;CAEvC,GAAG,IAAI,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;;CAEpC,GAAG,MAAM,IAAI,GAAG,IAAI,UAAU,GAAG;;CAEjC,IAAI,KAAK,UAAU,EAAE,GAAG,EAAE,KAAK,SAAS,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,UAAU,EAAE,GAAG,EAAE,CAAC;;CAE3E,IAAI;;CAEJ,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG;;CAEH,EAAE,IAAI,QAAQ,GAAG,EAAE,CAAC;;CAEpB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAEpD,GAAG,IAAI,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;CACnC,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAEjD,GAAG;;CAEH,EAAE,IAAI,KAAK,GAAG,EAAE,CAAC;CACjB,EAAE,IAAI,OAAO,GAAG,EAAE,CAAC;CACnB,EAAE,IAAI,WAAW,GAAG,EAAE,CAAC;CACvB,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC;CAClB,EAAE,IAAI,UAAU,GAAG,EAAE,CAAC;CACtB,EAAE,IAAI,GAAG,GAAG,EAAE,CAAC;CACf,EAAE,IAAI,OAAO,GAAG,EAAE,CAAC;;CAEnB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAEjD,GAAG,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;;CAE9B,GAAG,IAAI,WAAW,GAAG,IAAI,CAAC;CAC1B,GAAG,IAAI,SAAS,GAAG,KAAK,CAAC;CACzB,GAAG,IAAI,eAAe,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,SAAS,CAAC;CACpE,GAAG,IAAI,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChD,GAAG,IAAI,mBAAmB,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;CAC3D,GAAG,IAAI,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;CACrF,GAAG,IAAI,kBAAkB,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;;CAEzD,GAAG,IAAI,QAAQ,GAAG,CAAC,CAAC;;CAEpB,GAAG,QAAQ,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CACvC,GAAG,QAAQ,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC;CACjD,GAAG,QAAQ,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC;CAC/C,GAAG,QAAQ,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC;CACrD,GAAG,QAAQ,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC;CACnD,GAAG,QAAQ,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACzD,GAAG,QAAQ,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC;CAClD,GAAG,QAAQ,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,kBAAkB,EAAE,CAAC;;CAExD,GAAG,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;CAC1B,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CACxC,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;;CAEpC,GAAG,KAAK,eAAe,GAAG;;CAE1B,IAAI,IAAI,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;;CAErD,IAAI,KAAK,CAAC,IAAI;CACd,KAAK,UAAU,EAAE,aAAa,EAAE,CAAC,EAAE,EAAE;CACrC,KAAK,UAAU,EAAE,aAAa,EAAE,CAAC,EAAE,EAAE;CACrC,KAAK,UAAU,EAAE,aAAa,EAAE,CAAC,EAAE,EAAE;CACrC,KAAK,CAAC;;CAEN,IAAI;;CAEJ,GAAG,KAAK,aAAa,GAAG;;CAExB,IAAI,KAAK,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;;CAEhD,IAAI;;CAEJ,GAAG,KAAK,mBAAmB,GAAG;;CAE9B,IAAI,IAAI,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;;CAE3C,IAAI,KAAK,CAAC,IAAI;CACd,KAAK,cAAc,EAAE,aAAa,EAAE,CAAC,EAAE,EAAE;CACzC,KAAK,cAAc,EAAE,aAAa,EAAE,CAAC,EAAE,EAAE;CACzC,KAAK,cAAc,EAAE,aAAa,EAAE,CAAC,EAAE,EAAE;CACzC,KAAK,CAAC;;CAEN,IAAI;;CAEJ,GAAG,KAAK,YAAY,GAAG;;CAEvB,IAAI,KAAK,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;;CAE9C,IAAI;;CAEJ,GAAG,KAAK,kBAAkB,GAAG;;CAE7B,IAAI,IAAI,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;;CAEzC,IAAI,KAAK,CAAC,IAAI;CACd,KAAK,aAAa,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE;CACvC,KAAK,aAAa,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE;CACvC,KAAK,aAAa,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE;CACvC,KAAK,CAAC;;CAEN,IAAI;;CAEJ,GAAG;;CAEH,EAAE,SAAS,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,GAAG;;CAE9C,GAAG,OAAO,OAAO,GAAG,KAAK,KAAK,CAAC,IAAI,QAAQ,EAAE,GAAG,KAAK,KAAK,IAAI,CAAC,IAAI,QAAQ,EAAE,EAAE,CAAC;;CAEhF,GAAG;;CAEH,EAAE,SAAS,cAAc,EAAE,MAAM,GAAG;;CAEpC,GAAG,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;;CAE9E,GAAG,KAAK,WAAW,EAAE,IAAI,EAAE,KAAK,SAAS,GAAG;;CAE5C,IAAI,OAAO,WAAW,EAAE,IAAI,EAAE,CAAC;;CAE/B,IAAI;;CAEJ,GAAG,WAAW,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;CAC5C,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAEhD,GAAG,OAAO,WAAW,EAAE,IAAI,EAAE,CAAC;;CAE9B,GAAG;;CAEH,EAAE,SAAS,aAAa,EAAE,KAAK,GAAG;;CAElC,GAAG,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;;CAE3E,GAAG,KAAK,UAAU,EAAE,IAAI,EAAE,KAAK,SAAS,GAAG;;CAE3C,IAAI,OAAO,UAAU,EAAE,IAAI,EAAE,CAAC;;CAE9B,IAAI;;CAEJ,GAAG,UAAU,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC;CACtC,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;;CAEjC,GAAG,OAAO,UAAU,EAAE,IAAI,EAAE,CAAC;;CAE7B,GAAG;;CAEH,EAAE,SAAS,UAAU,EAAE,EAAE,GAAG;;CAE5B,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;;CAEhD,GAAG,KAAK,OAAO,EAAE,IAAI,EAAE,KAAK,SAAS,GAAG;;CAExC,IAAI,OAAO,OAAO,EAAE,IAAI,EAAE,CAAC;;CAE3B,IAAI;;CAEJ,GAAG,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;CACpC,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;;CAE1B,GAAG,OAAO,OAAO,EAAE,IAAI,EAAE,CAAC;;CAE1B,GAAG;;CAEH,EAAE,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;;CAEjB,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;CAChC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;CAC9B,EAAE,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;CACrD,EAAE,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;CAChD,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;;CAE1B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,KAAK,EAAE,YAAY;;CAEpB;CACA;;CAEA;;CAEA;;CAEA;;CAEA;;CAEA;;CAEA;;CAEA;CACA;CACA;;CAEA;;CAEA;CACA;;CAEA,EAAE,OAAO,IAAI,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAErC,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,MAAM,GAAG;;CAE3B,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE1B;;CAEA,EAAE,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;CACrB,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;CACnB,EAAE,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;CAClB,EAAE,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC,CAAC;CAC5B,EAAE,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;CACzB,EAAE,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;CACzB,EAAE,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;CACxB,EAAE,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;CACxB,EAAE,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;CAC1B,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;CAC1B,EAAE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;;CAE7B;;CAEA,EAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;;CAE1B;;CAEA,EAAE,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;;CAEjC,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEpD,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;;CAE/C,GAAG;;CAEH;;CAEA,EAAE,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;;CAE7B,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAElD,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;;CAE3C,GAAG;;CAEH;;CAEA,EAAE,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;;CAE3B,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEjD,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;;CAEzC,GAAG;;CAEH;;CAEA,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEhE,GAAG,IAAI,aAAa,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC;;CAEjD,GAAG,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,KAAK,SAAS,GAAG;;CAEhD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;;CAEjC,IAAI;;CAEJ,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAE1D,IAAI,IAAI,GAAG,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,OAAO,GAAG,EAAE,CAAC;;CAE/C,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEjD,KAAK,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC;;CAEvB,KAAK,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;;CAEhC,KAAK;;CAEL,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;;CAE5C,IAAI;;CAEJ,GAAG;;CAEH;;CAEA,EAAE,IAAI,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;;CAEzC,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAExD,GAAG,IAAI,WAAW,GAAG,EAAE,CAAC;CACxB,GAAG,WAAW,CAAC,IAAI,GAAG,YAAY,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;;CAE7C;;CAEA,GAAG,KAAK,YAAY,EAAE,CAAC,EAAE,CAAC,QAAQ,KAAK,SAAS,GAAG;;CAEnD,IAAI,WAAW,CAAC,QAAQ,GAAG,EAAE,CAAC;;CAE9B,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,YAAY,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAExE,KAAK,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;;CAE1E,KAAK;;CAEL,IAAI;;CAEJ;;CAEA,GAAG,KAAK,YAAY,EAAE,CAAC,EAAE,CAAC,OAAO,KAAK,SAAS,GAAG;;CAElD,IAAI,WAAW,CAAC,OAAO,GAAG,EAAE,CAAC;;CAE7B,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,YAAY,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEvE,KAAK,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;;CAExE,KAAK;;CAEL,IAAI;;CAEJ,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC;;CAEzC,GAAG;;CAEH;;CAEA,EAAE,IAAI,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;;CAEzC,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAExD,GAAG,IAAI,WAAW,GAAG,EAAE,CAAC;;CAExB;;CAEA,GAAG,KAAK,YAAY,EAAE,CAAC,EAAE,CAAC,aAAa,KAAK,SAAS,GAAG;;CAExD,IAAI,WAAW,CAAC,aAAa,GAAG,EAAE,CAAC;;CAEnC,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,YAAY,EAAE,CAAC,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAE7E,KAAK,IAAI,eAAe,GAAG,YAAY,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC;CAChE,KAAK,IAAI,gBAAgB,GAAG,EAAE,CAAC;;CAE/B,KAAK,gBAAgB,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;CACpD,KAAK,gBAAgB,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;CACpD,KAAK,gBAAgB,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;;CAEpD,KAAK,WAAW,CAAC,aAAa,CAAC,IAAI,EAAE,gBAAgB,EAAE,CAAC;;CAExD,KAAK;;CAEL,IAAI;;CAEJ;;CAEA,GAAG,KAAK,YAAY,EAAE,CAAC,EAAE,CAAC,WAAW,KAAK,SAAS,GAAG;;CAEtD,IAAI,WAAW,CAAC,WAAW,GAAG,EAAE,CAAC;;CAEjC,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,YAAY,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAE3E,KAAK,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;;CAEhF,KAAK;;CAEL,IAAI;;CAEJ,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC;;CAEzC,GAAG;;CAEH;;CAEA,EAAE,IAAI,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;;CAEvC,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEvD,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;;CAErD,GAAG;;CAEH;;CAEA,EAAE,IAAI,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;;CAEvC,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEvD,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;;CAErD,GAAG;;CAEH;;CAEA,EAAE,IAAI,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;;CAE3C,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEzD,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEjD,GAAG;;CAEH;;CAEA,EAAE,IAAI,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;;CAEvC,EAAE,KAAK,WAAW,KAAK,IAAI,GAAG;;CAE9B,GAAG,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,KAAK,EAAE,CAAC;;CAE1C,GAAG;;CAEH;;CAEA,EAAE,IAAI,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;;CAE7C,EAAE,KAAK,cAAc,KAAK,IAAI,GAAG;;CAEjC,GAAG,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC;;CAEhD,GAAG;;CAEH;;CAEA,EAAE,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;CACtD,EAAE,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;CACtD,EAAE,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;CAC5C,EAAE,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;CACpD,EAAE,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;CAClD,EAAE,IAAI,CAAC,uBAAuB,GAAG,MAAM,CAAC,uBAAuB,CAAC;CAChE,EAAE,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;;CAElD,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,OAAO,EAAE,YAAY;;CAEtB,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;;CAE5C,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,GAAG;;CAExD,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG;;CAE/B,EAAE,MAAM,IAAI,SAAS,EAAE,uDAAuD,EAAE,CAAC;;CAEjF,EAAE;;CAEF,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;;CAEhB,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;CACpB,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;CAC1B,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,KAAK,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,QAAQ,GAAG,CAAC,CAAC;CAChE,CAAC,IAAI,CAAC,UAAU,GAAG,UAAU,KAAK,IAAI,CAAC;;CAEvC,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;CACtB,CAAC,IAAI,CAAC,WAAW,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;;CAE9C,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;;CAElB,CAAC;;CAED,MAAM,CAAC,cAAc,EAAE,eAAe,CAAC,SAAS,EAAE,aAAa,EAAE;;CAEjE,CAAC,GAAG,EAAE,WAAW,KAAK,GAAG;;CAEzB,EAAE,KAAK,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC;;CAExC,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,SAAS,EAAE;;CAE1C,CAAC,iBAAiB,EAAE,IAAI;;CAExB,CAAC,gBAAgB,EAAE,YAAY,EAAE;;CAEjC,CAAC,QAAQ,EAAE,WAAW,KAAK,GAAG;;CAE9B,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG;;CAEhC,GAAG,MAAM,IAAI,SAAS,EAAE,uDAAuD,EAAE,CAAC;;CAElF,GAAG;;CAEH,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK,KAAK,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;CACtE,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;;CAErB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,UAAU,EAAE,WAAW,KAAK,GAAG;;CAEhC,EAAE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;;CAEvB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,MAAM,GAAG;;CAE3B,EAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;CAC1B,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;CAC5D,EAAE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;CAClC,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;CAC5B,EAAE,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;;CAEtC,EAAE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;;CAEhC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG;;CAEhD,EAAE,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC;CAC1B,EAAE,MAAM,IAAI,SAAS,CAAC,QAAQ,CAAC;;CAE/B,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEpD,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;;CAE5D,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,SAAS,EAAE,WAAW,KAAK,GAAG;;CAE/B,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;;CAE1B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,eAAe,EAAE,WAAW,MAAM,GAAG;;CAEtC,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC;;CAErC,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEpD,GAAG,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC;;CAE3B,GAAG,KAAK,KAAK,KAAK,SAAS,GAAG;;CAE9B,IAAI,OAAO,CAAC,IAAI,EAAE,6DAA6D,EAAE,CAAC,EAAE,CAAC;CACrF,IAAI,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;;CAExB,IAAI;;CAEJ,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;CAChC,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;CAChC,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;;CAEhC,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,iBAAiB,EAAE,WAAW,OAAO,GAAG;;CAEzC,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC;;CAErC,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAErD,GAAG,IAAI,MAAM,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC;;CAE7B,GAAG,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE/B,IAAI,OAAO,CAAC,IAAI,EAAE,gEAAgE,EAAE,CAAC,EAAE,CAAC;CACxF,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE3B,IAAI;;CAEJ,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;CACjC,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;;CAEjC,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,iBAAiB,EAAE,WAAW,OAAO,GAAG;;CAEzC,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC;;CAErC,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAErD,GAAG,IAAI,MAAM,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC;;CAE7B,GAAG,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE/B,IAAI,OAAO,CAAC,IAAI,EAAE,gEAAgE,EAAE,CAAC,EAAE,CAAC;CACxF,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE3B,IAAI;;CAEJ,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;CACjC,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;CACjC,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;;CAEjC,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,iBAAiB,EAAE,WAAW,OAAO,GAAG;;CAEzC,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC;;CAErC,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAErD,GAAG,IAAI,MAAM,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC;;CAE7B,GAAG,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE/B,IAAI,OAAO,CAAC,IAAI,EAAE,gEAAgE,EAAE,CAAC,EAAE,CAAC;CACxF,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE3B,IAAI;;CAEJ,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;CACjC,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;CACjC,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;CACjC,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;;CAEjC,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,GAAG,EAAE,WAAW,KAAK,EAAE,MAAM,GAAG;;CAEjC,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG,MAAM,GAAG,CAAC,CAAC;;CAEzC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;;CAElC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,KAAK,GAAG;;CAE1B,EAAE,OAAO,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;;CAE7C,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,KAAK,EAAE,CAAC,GAAG;;CAE7B,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;;CAE1C,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,KAAK,GAAG;;CAE1B,EAAE,OAAO,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;;CAEjD,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,KAAK,EAAE,CAAC,GAAG;;CAE7B,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;;CAE9C,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,KAAK,GAAG;;CAE1B,EAAE,OAAO,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;;CAEjD,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,KAAK,EAAE,CAAC,GAAG;;CAE7B,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;;CAE9C,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,KAAK,GAAG;;CAE1B,EAAE,OAAO,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;;CAEjD,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,KAAK,EAAE,CAAC,GAAG;;CAE7B,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;;CAE9C,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,KAAK,EAAE,WAAW,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG;;CAEjC,EAAE,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC;;CAEzB,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;CAC9B,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;;CAE9B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;CAErC,EAAE,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC;;CAEzB,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;CAC9B,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;CAC9B,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;;CAE9B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,OAAO,EAAE,WAAW,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;CAEzC,EAAE,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC;;CAEzB,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;CAC9B,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;CAC9B,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;CAC9B,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;;CAE9B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,QAAQ,EAAE,WAAW,QAAQ,GAAG;;CAEjC,EAAE,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;;CAEnC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAExE,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;;CAEA,SAAS,mBAAmB,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,GAAG;;CAE5D,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,SAAS,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;;CAE5E,CAAC;;CAED,mBAAmB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,SAAS,EAAE,CAAC;CAC3E,mBAAmB,CAAC,SAAS,CAAC,WAAW,GAAG,mBAAmB,CAAC;;;CAGhE,SAAS,oBAAoB,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,GAAG;;CAE7D,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,UAAU,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;;CAE7E,CAAC;;CAED,oBAAoB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,SAAS,EAAE,CAAC;CAC5E,oBAAoB,CAAC,SAAS,CAAC,WAAW,GAAG,oBAAoB,CAAC;;;CAGlE,SAAS,2BAA2B,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,GAAG;;CAEpE,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,iBAAiB,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;;CAEpF,CAAC;;CAED,2BAA2B,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,SAAS,EAAE,CAAC;CACnF,2BAA2B,CAAC,SAAS,CAAC,WAAW,GAAG,2BAA2B,CAAC;;;CAGhF,SAAS,oBAAoB,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,GAAG;;CAE7D,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,UAAU,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;;CAE7E,CAAC;;CAED,oBAAoB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,SAAS,EAAE,CAAC;CAC5E,oBAAoB,CAAC,SAAS,CAAC,WAAW,GAAG,oBAAoB,CAAC;;;CAGlE,SAAS,qBAAqB,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,GAAG;;CAE9D,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,WAAW,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;;CAE9E,CAAC;;CAED,qBAAqB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,SAAS,EAAE,CAAC;CAC7E,qBAAqB,CAAC,SAAS,CAAC,WAAW,GAAG,qBAAqB,CAAC;;;CAGpE,SAAS,oBAAoB,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,GAAG;;CAE7D,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,UAAU,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;;CAE7E,CAAC;;CAED,oBAAoB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,SAAS,EAAE,CAAC;CAC5E,oBAAoB,CAAC,SAAS,CAAC,WAAW,GAAG,oBAAoB,CAAC;;;CAGlE,SAAS,qBAAqB,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,GAAG;;CAE9D,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,WAAW,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;;CAE9E,CAAC;;CAED,qBAAqB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,SAAS,EAAE,CAAC;CAC7E,qBAAqB,CAAC,SAAS,CAAC,WAAW,GAAG,qBAAqB,CAAC;;;CAGpE,SAAS,sBAAsB,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,GAAG;;CAE/D,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,YAAY,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;;CAE/E,CAAC;;CAED,sBAAsB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,SAAS,EAAE,CAAC;CAC9E,sBAAsB,CAAC,SAAS,CAAC,WAAW,GAAG,sBAAsB,CAAC;;;CAGtE,SAAS,sBAAsB,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,GAAG;;CAE/D,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,YAAY,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;;CAE/E,CAAC;;CAED,sBAAsB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,SAAS,EAAE,CAAC;CAC9E,sBAAsB,CAAC,SAAS,CAAC,WAAW,GAAG,sBAAsB,CAAC;;CAEtE;CACA;CACA;;CAEA,SAAS,cAAc,GAAG;;CAE1B,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;CACpB,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;CACnB,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;CAClB,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;CACf,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;;CAEhB,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;;CAElB,CAAC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;;CAExB,CAAC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;CACvB,CAAC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;;CAEvB;;CAEA,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;CACzB,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;;CAE5B;;CAEA,CAAC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;CACjC,CAAC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;CAChC,CAAC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;CAC/B,CAAC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;CAC5B,CAAC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;;CAE/B,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,EAAE;;CAEzC,CAAC,aAAa,EAAE,WAAW,QAAQ,GAAG;;CAEtC,EAAE,IAAI,KAAK,CAAC;CACZ,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC;CAClB,EAAE,IAAI,aAAa,GAAG,SAAS,CAAC;;CAEhC,EAAE,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;;CAE7B,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAE5C,GAAG,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;;CAEzB;;CAEA,GAAG,KAAK,IAAI,CAAC,aAAa,KAAK,aAAa,GAAG;;CAE/C,IAAI,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;;CAEvC,IAAI,KAAK,KAAK,KAAK,SAAS,GAAG;;CAE/B,KAAK,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC;CAC3C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;;CAE1B,KAAK;;CAEL,IAAI,KAAK,GAAG;CACZ,KAAK,KAAK,EAAE,CAAC,GAAG,CAAC;CACjB,KAAK,aAAa,EAAE,aAAa;CACjC,KAAK,CAAC;;CAEN,IAAI;;CAEJ,GAAG;;CAEH,EAAE,KAAK,KAAK,KAAK,SAAS,GAAG;;CAE7B,GAAG,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC;CACzC,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;;CAExB,GAAG;;CAEH,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;;CAEvB,EAAE;;CAEF,CAAC,YAAY,EAAE,WAAW,QAAQ,GAAG;;CAErC,EAAE,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;CAC7B,EAAE,IAAI,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;CACnC,EAAE,IAAI,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC;;CAE7C,EAAE,IAAI,eAAe,GAAG,aAAa,EAAE,CAAC,EAAE,IAAI,aAAa,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;CAC5E,EAAE,IAAI,gBAAgB,GAAG,aAAa,EAAE,CAAC,EAAE,IAAI,aAAa,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;;CAE7E;;CAEA,EAAE,IAAI,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;CAC3C,EAAE,IAAI,kBAAkB,GAAG,YAAY,CAAC,MAAM,CAAC;;CAE/C,EAAE,IAAI,oBAAoB,CAAC;;CAE3B,EAAE,KAAK,kBAAkB,GAAG,CAAC,GAAG;;CAEhC,GAAG,oBAAoB,GAAG,EAAE,CAAC;;CAE7B,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,kBAAkB,EAAE,CAAC,GAAG,GAAG;;CAEnD,IAAI,oBAAoB,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;;CAEnC,IAAI;;CAEJ,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,oBAAoB,CAAC;;CAErD,GAAG;;CAEH,EAAE,IAAI,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;CAC3C,EAAE,IAAI,kBAAkB,GAAG,YAAY,CAAC,MAAM,CAAC;;CAE/C,EAAE,IAAI,kBAAkB,CAAC;;CAEzB,EAAE,KAAK,kBAAkB,GAAG,CAAC,GAAG;;CAEhC,GAAG,kBAAkB,GAAG,EAAE,CAAC;;CAE3B,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,kBAAkB,EAAE,CAAC,GAAG,GAAG;;CAEnD,IAAI,kBAAkB,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;;CAEjC,IAAI;;CAEJ,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,kBAAkB,CAAC;;CAEjD,GAAG;;CAEH;;CAEA,EAAE,IAAI,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;CACzC,EAAE,IAAI,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;;CAEzC,EAAE,IAAI,cAAc,GAAG,WAAW,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,CAAC;CAC9D,EAAE,IAAI,cAAc,GAAG,WAAW,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,CAAC;;CAE9D;;CAEA,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAE5C,GAAG,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;;CAEzB,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;;CAEpF,GAAG,IAAI,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;;CAE1C,GAAG,KAAK,aAAa,CAAC,MAAM,KAAK,CAAC,GAAG;;CAErC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEpF,IAAI,MAAM;;CAEV,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;CAE7B,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;;CAEhD,IAAI;;CAEJ,GAAG,IAAI,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;;CAExC,GAAG,KAAK,YAAY,CAAC,MAAM,KAAK,CAAC,GAAG;;CAEpC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEhF,IAAI,MAAM;;CAEV,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;;CAE3B,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;;CAE5C,IAAI;;CAEJ,GAAG,KAAK,eAAe,KAAK,IAAI,GAAG;;CAEnC,IAAI,IAAI,SAAS,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;;CAE5C,IAAI,KAAK,SAAS,KAAK,SAAS,GAAG;;CAEnC,KAAK,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;;CAErE,KAAK,MAAM;;CAEX,KAAK,OAAO,CAAC,IAAI,EAAE,0DAA0D,EAAE,CAAC,EAAE,CAAC;;CAEnF,KAAK,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,OAAO,EAAE,EAAE,IAAI,OAAO,EAAE,EAAE,IAAI,OAAO,EAAE,EAAE,CAAC;;CAElE,KAAK;;CAEL,IAAI;;CAEJ,GAAG,KAAK,gBAAgB,KAAK,IAAI,GAAG;;CAEpC,IAAI,IAAI,SAAS,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;;CAE5C,IAAI,KAAK,SAAS,KAAK,SAAS,GAAG;;CAEnC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEtE,KAAK,MAAM;;CAEX,KAAK,OAAO,CAAC,IAAI,EAAE,2DAA2D,EAAE,CAAC,EAAE,CAAC;;CAEpF,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,OAAO,EAAE,EAAE,IAAI,OAAO,EAAE,EAAE,IAAI,OAAO,EAAE,EAAE,CAAC;;CAEnE,KAAK;;CAEL,IAAI;;CAEJ;;CAEA,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,kBAAkB,EAAE,CAAC,GAAG,GAAG;;CAEnD,IAAI,IAAI,WAAW,GAAG,YAAY,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC;;CAEjD,IAAI,oBAAoB,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;;CAE1G,IAAI;;CAEJ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,kBAAkB,EAAE,CAAC,GAAG,GAAG;;CAEnD,IAAI,IAAI,WAAW,GAAG,YAAY,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC;;CAE3D,IAAI,kBAAkB,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;;CAEhF,IAAI;;CAEJ;;CAEA,GAAG,KAAK,cAAc,GAAG;;CAEzB,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;;CAEjG,IAAI;;CAEJ,GAAG,KAAK,cAAc,GAAG;;CAEzB,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;;CAEjG,IAAI;;CAEJ,GAAG;;CAEH,EAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,CAAC;;CAEjC,EAAE,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC,kBAAkB,CAAC;CACxD,EAAE,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC,iBAAiB,CAAC;CACtD,EAAE,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,gBAAgB,CAAC;CACpD,EAAE,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC;CAC9C,EAAE,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,gBAAgB,CAAC;;CAEpD,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,QAAQ,EAAE,KAAK,GAAG;;CAE3B,CAAC,KAAK,KAAK,CAAC,MAAM,KAAK,CAAC,GAAG,OAAO,EAAE,QAAQ,CAAC;;CAE7C,CAAC,IAAI,GAAG,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;;CAEtB,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG;;CAElD,EAAE,KAAK,KAAK,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;;CAE3C,EAAE;;CAEF,CAAC,OAAO,GAAG,CAAC;;CAEZ,CAAC;;CAED;CACA;CACA;CACA;;CAEA,IAAI,gBAAgB,GAAG,CAAC,CAAC;;CAEzB,SAAS,cAAc,GAAG;;CAE1B,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,gBAAgB,IAAI,CAAC,EAAE,EAAE,CAAC;;CAEvE,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;;CAElC,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;CAChB,CAAC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;;CAE9B,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;CACnB,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;;CAEtB,CAAC,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;;CAE3B,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;;CAElB,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;CACzB,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;;CAE5B,CAAC,IAAI,CAAC,SAAS,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;;CAEhD,CAAC;;CAED,cAAc,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,SAAS,EAAE,EAAE;;CAEtF,CAAC,WAAW,EAAE,cAAc;;CAE5B,CAAC,gBAAgB,EAAE,IAAI;;CAEvB,CAAC,QAAQ,EAAE,YAAY;;CAEvB,EAAE,OAAO,IAAI,CAAC,KAAK,CAAC;;CAEpB,EAAE;;CAEF,CAAC,QAAQ,EAAE,WAAW,KAAK,GAAG;;CAE9B,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG;;CAEhC,GAAG,IAAI,CAAC,KAAK,GAAG,MAAM,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,GAAG,qBAAqB,GAAG,qBAAqB,IAAI,KAAK,EAAE,CAAC,EAAE,CAAC;;CAE9G,GAAG,MAAM;;CAET,GAAG,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;;CAEtB,GAAG;;CAEH,EAAE;;CAEF,CAAC,YAAY,EAAE,WAAW,IAAI,EAAE,SAAS,GAAG;;CAE5C,EAAE,KAAK,IAAI,SAAS,IAAI,SAAS,CAAC,iBAAiB,EAAE,IAAI,IAAI,SAAS,IAAI,SAAS,CAAC,4BAA4B,EAAE,GAAG;;CAErH,GAAG,OAAO,CAAC,IAAI,EAAE,wEAAwE,EAAE,CAAC;;CAE5F,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,eAAe,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;;CAEpF,GAAG,OAAO;;CAEV,GAAG;;CAEH,EAAE,KAAK,IAAI,KAAK,OAAO,GAAG;;CAE1B,GAAG,OAAO,CAAC,IAAI,EAAE,yEAAyE,EAAE,CAAC;CAC7F,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC;;CAE9B,GAAG,OAAO;;CAEV,GAAG;;CAEH,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC;;CAEtC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,YAAY,EAAE,WAAW,IAAI,GAAG;;CAEjC,EAAE,OAAO,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;;CAEjC,EAAE;;CAEF,CAAC,eAAe,EAAE,WAAW,IAAI,GAAG;;CAEpC,EAAE,OAAO,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;;CAEjC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,QAAQ,EAAE,WAAW,KAAK,EAAE,KAAK,EAAE,aAAa,GAAG;;CAEpD,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;;CAEpB,GAAG,KAAK,EAAE,KAAK;CACf,GAAG,KAAK,EAAE,KAAK;CACf,GAAG,aAAa,EAAE,aAAa,KAAK,SAAS,GAAG,aAAa,GAAG,CAAC;;CAEjE,GAAG,EAAE,CAAC;;CAEN,EAAE;;CAEF,CAAC,WAAW,EAAE,YAAY;;CAE1B,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;;CAEnB,EAAE;;CAEF,CAAC,YAAY,EAAE,WAAW,KAAK,EAAE,KAAK,GAAG;;CAEzC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC;CAC/B,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC;;CAE/B,EAAE;;CAEF,CAAC,WAAW,EAAE,WAAW,MAAM,GAAG;;CAElC,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;;CAE1C,EAAE,KAAK,QAAQ,KAAK,SAAS,GAAG;;CAEhC,GAAG,MAAM,CAAC,sBAAsB,EAAE,QAAQ,EAAE,CAAC;CAC7C,GAAG,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;;CAE/B,GAAG;;CAEH,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;;CAEtC,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,IAAI,YAAY,GAAG,IAAI,OAAO,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;;CAE9D,GAAG,YAAY,CAAC,sBAAsB,EAAE,MAAM,EAAE,CAAC;CACjD,GAAG,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;;CAE7B,GAAG;;CAEH,EAAE,KAAK,IAAI,CAAC,WAAW,KAAK,IAAI,GAAG;;CAEnC,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;;CAE7B,GAAG;;CAEH,EAAE,KAAK,IAAI,CAAC,cAAc,KAAK,IAAI,GAAG;;CAEtC,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;;CAEhC,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,OAAO,EAAE,YAAY;;CAEtB;;CAEA,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,OAAO,SAAS,OAAO,EAAE,KAAK,GAAG;;CAEnC,GAAG,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC;;CAE7B,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC;;CAE1B,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,OAAO,EAAE,YAAY;;CAEtB;;CAEA,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,OAAO,SAAS,OAAO,EAAE,KAAK,GAAG;;CAEnC,GAAG,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC;;CAE7B,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC;;CAE1B,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,OAAO,EAAE,YAAY;;CAEtB;;CAEA,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,OAAO,SAAS,OAAO,EAAE,KAAK,GAAG;;CAEnC,GAAG,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC;;CAE7B,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC;;CAE1B,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,SAAS,EAAE,YAAY;;CAExB;;CAEA,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,OAAO,SAAS,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;CAEvC,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEjC,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC;;CAE1B,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,KAAK,EAAE,YAAY;;CAEpB;;CAEA,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,OAAO,SAAS,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;CAEnC,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE3B,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC;;CAE1B,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,MAAM,EAAE,YAAY;;CAErB,EAAE,IAAI,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAC;;CAE3B,EAAE,OAAO,SAAS,MAAM,EAAE,MAAM,GAAG;;CAEnC,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;;CAExB,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;;CAEtB,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;;CAElC,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,MAAM,EAAE,YAAY;;CAErB,EAAE,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE7B,EAAE,OAAO,SAAS,MAAM,GAAG;;CAE3B,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;;CAE7B,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC;;CAEjD,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAElD,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,aAAa,EAAE,WAAW,MAAM,GAAG;;CAEpC;;CAEA,EAAE,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;;CAEjC,EAAE,KAAK,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,GAAG;;CAE1C,GAAG,IAAI,SAAS,GAAG,IAAI,sBAAsB,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;CACjF,GAAG,IAAI,MAAM,GAAG,IAAI,sBAAsB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE5E,GAAG,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,SAAS,CAAC,iBAAiB,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC;CACrF,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,eAAe,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;;CAE3E,GAAG,KAAK,QAAQ,CAAC,aAAa,IAAI,QAAQ,CAAC,aAAa,CAAC,MAAM,KAAK,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG;;CAE/F,IAAI,IAAI,aAAa,GAAG,IAAI,sBAAsB,EAAE,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;;CAEvF,IAAI,IAAI,CAAC,YAAY,EAAE,cAAc,EAAE,aAAa,CAAC,SAAS,EAAE,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC;;CAE3F,IAAI;;CAEJ,GAAG,KAAK,QAAQ,CAAC,cAAc,KAAK,IAAI,GAAG;;CAE3C,IAAI,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;;CAE1D,IAAI;;CAEJ,GAAG,KAAK,QAAQ,CAAC,WAAW,KAAK,IAAI,GAAG;;CAExC,IAAI,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;;CAEpD,IAAI;;CAEJ,GAAG,MAAM,KAAK,MAAM,CAAC,MAAM,GAAG;;CAE9B,GAAG,KAAK,QAAQ,IAAI,QAAQ,CAAC,UAAU,GAAG;;CAE1C,IAAI,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAC;;CAElC,IAAI;;CAEJ,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,aAAa,EAAE,WAAW,MAAM,GAAG;;CAEpC,EAAE,IAAI,QAAQ,GAAG,EAAE,CAAC;;CAEpB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEpD,GAAG,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC;CAC3B,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;;CAEnD,GAAG;;CAEH,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,sBAAsB,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE7E,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,gBAAgB,EAAE,WAAW,MAAM,GAAG;;CAEvC,EAAE,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;;CAEjC,EAAE,KAAK,MAAM,CAAC,MAAM,GAAG;;CAEvB,GAAG,IAAI,MAAM,GAAG,QAAQ,CAAC,gBAAgB,CAAC;;CAE1C,GAAG,KAAK,QAAQ,CAAC,kBAAkB,KAAK,IAAI,GAAG;;CAE/C,IAAI,MAAM,GAAG,SAAS,CAAC;CACvB,IAAI,QAAQ,CAAC,kBAAkB,GAAG,KAAK,CAAC;;CAExC,IAAI;;CAEJ,GAAG,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE/B,IAAI,OAAO,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAC;;CAEzC,IAAI;;CAEJ,GAAG,MAAM,CAAC,kBAAkB,GAAG,QAAQ,CAAC,kBAAkB,CAAC;CAC3D,GAAG,MAAM,CAAC,iBAAiB,GAAG,QAAQ,CAAC,iBAAiB,CAAC;CACzD,GAAG,MAAM,CAAC,gBAAgB,GAAG,QAAQ,CAAC,gBAAgB,CAAC;CACvD,GAAG,MAAM,CAAC,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC;CACjD,GAAG,MAAM,CAAC,gBAAgB,GAAG,QAAQ,CAAC,gBAAgB,CAAC;;CAEvD,GAAG,QAAQ,CAAC,kBAAkB,GAAG,KAAK,CAAC;CACvC,GAAG,QAAQ,CAAC,iBAAiB,GAAG,KAAK,CAAC;CACtC,GAAG,QAAQ,CAAC,gBAAgB,GAAG,KAAK,CAAC;CACrC,GAAG,QAAQ,CAAC,aAAa,GAAG,KAAK,CAAC;CAClC,GAAG,QAAQ,CAAC,gBAAgB,GAAG,KAAK,CAAC;;CAErC,GAAG,QAAQ,GAAG,MAAM,CAAC;;CAErB,GAAG;;CAEH,EAAE,IAAI,SAAS,CAAC;;CAEhB,EAAE,KAAK,QAAQ,CAAC,kBAAkB,KAAK,IAAI,GAAG;;CAE9C,GAAG,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;;CAExC,GAAG,KAAK,SAAS,KAAK,SAAS,GAAG;;CAElC,IAAI,SAAS,CAAC,iBAAiB,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;CACrD,IAAI,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEjC,IAAI;;CAEJ,GAAG,QAAQ,CAAC,kBAAkB,GAAG,KAAK,CAAC;;CAEvC,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,iBAAiB,KAAK,IAAI,GAAG;;CAE7C,GAAG,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;;CAEtC,GAAG,KAAK,SAAS,KAAK,SAAS,GAAG;;CAElC,IAAI,SAAS,CAAC,iBAAiB,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;CACpD,IAAI,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEjC,IAAI;;CAEJ,GAAG,QAAQ,CAAC,iBAAiB,GAAG,KAAK,CAAC;;CAEtC,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,gBAAgB,KAAK,IAAI,GAAG;;CAE5C,GAAG,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;;CAErC,GAAG,KAAK,SAAS,KAAK,SAAS,GAAG;;CAElC,IAAI,SAAS,CAAC,eAAe,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;CACjD,IAAI,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEjC,IAAI;;CAEJ,GAAG,QAAQ,CAAC,gBAAgB,GAAG,KAAK,CAAC;;CAErC,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,aAAa,GAAG;;CAEhC,GAAG,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;;CAElC,GAAG,KAAK,SAAS,KAAK,SAAS,GAAG;;CAElC,IAAI,SAAS,CAAC,iBAAiB,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC;CAChD,IAAI,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEjC,IAAI;;CAEJ,GAAG,QAAQ,CAAC,aAAa,GAAG,KAAK,CAAC;;CAElC,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,uBAAuB,GAAG;;CAE1C,GAAG,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;;CAE5C,GAAG,KAAK,SAAS,KAAK,SAAS,GAAG;;CAElC,IAAI,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,aAAa,EAAE,CAAC;CAClD,IAAI,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEjC,IAAI;;CAEJ,GAAG,QAAQ,CAAC,uBAAuB,GAAG,KAAK,CAAC;;CAE5C,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,gBAAgB,GAAG;;CAEnC,GAAG,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;CAC7C,GAAG,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;;CAEjC,GAAG,QAAQ,CAAC,gBAAgB,GAAG,KAAK,CAAC;;CAErC,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,YAAY,EAAE,WAAW,QAAQ,GAAG;;CAErC,EAAE,QAAQ,CAAC,gBAAgB,GAAG,IAAI,cAAc,EAAE,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAC;;CAE5E,EAAE,OAAO,IAAI,CAAC,kBAAkB,EAAE,QAAQ,CAAC,gBAAgB,EAAE,CAAC;;CAE9D,EAAE;;CAEF,CAAC,kBAAkB,EAAE,WAAW,QAAQ,GAAG;;CAE3C,EAAE,IAAI,SAAS,GAAG,IAAI,YAAY,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;CACnE,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,eAAe,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,iBAAiB,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC;;CAE9G,EAAE,KAAK,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG;;CAErC,GAAG,IAAI,OAAO,GAAG,IAAI,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;CACjE,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,eAAe,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,iBAAiB,EAAE,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;;CAE1G,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG;;CAEpC,GAAG,IAAI,MAAM,GAAG,IAAI,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;CAC/D,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,eAAe,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;;CAErG,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG;;CAEjC,GAAG,IAAI,GAAG,GAAG,IAAI,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;CACzD,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,eAAe,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,iBAAiB,EAAE,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC;;CAE9F,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG;;CAElC,GAAG,IAAI,IAAI,GAAG,IAAI,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;CAC3D,GAAG,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,IAAI,eAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,iBAAiB,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;;CAEjG,GAAG;;CAEH;;CAEA,EAAE,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;;CAEhC;;CAEA,EAAE,MAAM,IAAI,IAAI,IAAI,QAAQ,CAAC,YAAY,GAAG;;CAE5C,GAAG,IAAI,KAAK,GAAG,EAAE,CAAC;CAClB,GAAG,IAAI,YAAY,GAAG,QAAQ,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;;CAEpD,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAE3D,IAAI,IAAI,WAAW,GAAG,YAAY,EAAE,CAAC,EAAE,CAAC;;CAExC,IAAI,IAAI,SAAS,GAAG,IAAI,sBAAsB,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE5E,IAAI,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,iBAAiB,EAAE,WAAW,EAAE,EAAE,CAAC;;CAE7D,IAAI;;CAEJ,GAAG,IAAI,CAAC,eAAe,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;;CAExC,GAAG;;CAEH;;CAEA,EAAE,KAAK,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,GAAG;;CAEzC,GAAG,IAAI,WAAW,GAAG,IAAI,sBAAsB,EAAE,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;CACtF,GAAG,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,WAAW,CAAC,iBAAiB,EAAE,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;;CAE3F,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,GAAG;;CAEzC,GAAG,IAAI,WAAW,GAAG,IAAI,sBAAsB,EAAE,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;CACtF,GAAG,IAAI,CAAC,YAAY,EAAE,YAAY,EAAE,WAAW,CAAC,iBAAiB,EAAE,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;;CAE5F,GAAG;;CAEH;;CAEA,EAAE,KAAK,QAAQ,CAAC,cAAc,KAAK,IAAI,GAAG;;CAE1C,GAAG,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;;CAEzD,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,WAAW,KAAK,IAAI,GAAG;;CAEvC,GAAG,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;;CAEnD,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,kBAAkB,EAAE,YAAY;;CAEjC,EAAE,KAAK,IAAI,CAAC,WAAW,KAAK,IAAI,GAAG;;CAEnC,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;;CAEjC,GAAG;;CAEH,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;;CAE1C,EAAE,KAAK,QAAQ,KAAK,SAAS,GAAG;;CAEhC,GAAG,IAAI,CAAC,WAAW,CAAC,sBAAsB,EAAE,QAAQ,EAAE,CAAC;;CAEvD,GAAG,MAAM;;CAET,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;;CAEhC,GAAG;;CAEH,EAAE,KAAK,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG;;CAE/G,GAAG,OAAO,CAAC,KAAK,EAAE,mIAAmI,EAAE,IAAI,EAAE,CAAC;;CAE9J,GAAG;;CAEH,EAAE;;CAEF,CAAC,qBAAqB,EAAE,YAAY;;CAEpC,EAAE,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;CACvB,EAAE,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE7B,EAAE,OAAO,SAAS,qBAAqB,GAAG;;CAE1C,GAAG,KAAK,IAAI,CAAC,cAAc,KAAK,IAAI,GAAG;;CAEvC,IAAI,IAAI,CAAC,cAAc,GAAG,IAAI,MAAM,EAAE,CAAC;;CAEvC,IAAI;;CAEJ,GAAG,IAAI,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;;CAE3C,GAAG,KAAK,QAAQ,GAAG;;CAEnB,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;;CAE5C,IAAI,GAAG,CAAC,sBAAsB,EAAE,QAAQ,EAAE,CAAC;CAC3C,IAAI,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;;CAE5B;CACA;;CAEA,IAAI,IAAI,WAAW,GAAG,CAAC,CAAC;;CAExB,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEzD,KAAK,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;CACnC,KAAK,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;CACnC,KAAK,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;CACnC,KAAK,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,EAAE,EAAE,CAAC;;CAE/E,KAAK;;CAEL,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC;;CAE1D,IAAI,KAAK,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG;;CAE/C,KAAK,OAAO,CAAC,KAAK,EAAE,8HAA8H,EAAE,IAAI,EAAE,CAAC;;CAE3J,KAAK;;CAEL,IAAI;;CAEJ,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,kBAAkB,EAAE,YAAY;;CAEjC;;CAEA,EAAE;;CAEF,CAAC,oBAAoB,EAAE,YAAY;;CAEnC,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;CACzB,EAAE,IAAI,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;CACnC,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;CAE3B,EAAE,KAAK,UAAU,CAAC,QAAQ,GAAG;;CAE7B,GAAG,IAAI,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC;;CAE7C,GAAG,KAAK,UAAU,CAAC,MAAM,KAAK,SAAS,GAAG;;CAE1C,IAAI,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,eAAe,EAAE,IAAI,YAAY,EAAE,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;;CAElG,IAAI,MAAM;;CAEV;;CAEA,IAAI,IAAI,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC;;CAExC,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEvD,KAAK,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;;CAEpB,KAAK;;CAEL,IAAI;;CAEJ,GAAG,IAAI,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC;;CAEzC,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;CAClB,GAAG,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,EAAE,EAAE,GAAG,IAAI,OAAO,EAAE,EAAE,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CAClE,GAAG,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,EAAE,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE9C;;CAEA,GAAG,KAAK,KAAK,GAAG;;CAEhB,IAAI,IAAI,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC;;CAE9B,IAAI,KAAK,MAAM,CAAC,MAAM,KAAK,CAAC,GAAG;;CAE/B,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;;CAExC,KAAK;;CAEL,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,GAAG;;CAExD,KAAK,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC;;CAE7B,KAAK,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;CAC7B,KAAK,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;;CAE7B,KAAK,MAAM,IAAI,CAAC,GAAG,KAAK,EAAE,EAAE,GAAG,KAAK,GAAG,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG;;CAE/D,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;CAChC,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;CAChC,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;;CAEhC,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;CACpC,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;CACpC,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;;CAEpC,MAAM,EAAE,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;CAC9B,MAAM,EAAE,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;CAC9B,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC;;CAErB,MAAM,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;CAC5B,MAAM,OAAO,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;CAChC,MAAM,OAAO,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;;CAEhC,MAAM,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;CAC5B,MAAM,OAAO,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;CAChC,MAAM,OAAO,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;;CAEhC,MAAM,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;CAC5B,MAAM,OAAO,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;CAChC,MAAM,OAAO,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;;CAEhC,MAAM;;CAEN,KAAK;;CAEL,IAAI,MAAM;;CAEV;;CAEA,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG;;CAE7D,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;CAClC,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;CACtC,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;;CAEtC,KAAK,EAAE,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;CAC7B,KAAK,EAAE,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;CAC7B,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC;;CAEpB,KAAK,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;CACzB,KAAK,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;CAC7B,KAAK,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;;CAE7B,KAAK,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;CAC7B,KAAK,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;CAC7B,KAAK,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;;CAE7B,KAAK,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;CAC7B,KAAK,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;CAC7B,KAAK,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;;CAE7B,KAAK;;CAEL,IAAI;;CAEJ,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;;CAE3B,GAAG,UAAU,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;;CAExC,GAAG;;CAEH,EAAE;;CAEF,CAAC,KAAK,EAAE,WAAW,QAAQ,EAAE,MAAM,GAAG;;CAEtC,EAAE,KAAK,IAAI,QAAQ,IAAI,QAAQ,CAAC,gBAAgB,EAAE,GAAG;;CAErD,GAAG,OAAO,CAAC,KAAK,EAAE,iFAAiF,EAAE,QAAQ,EAAE,CAAC;CAChH,GAAG,OAAO;;CAEV,GAAG;;CAEH,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,MAAM,GAAG,CAAC,CAAC;;CAEd,GAAG,OAAO,CAAC,IAAI;CACf,IAAI,qFAAqF;CACzF,MAAM,qEAAqE;CAC3E,IAAI,CAAC;;CAEL,GAAG;;CAEH,EAAE,IAAI,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;;CAEnC,EAAE,MAAM,IAAI,GAAG,IAAI,UAAU,GAAG;;CAEhC,GAAG,KAAK,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE,KAAK,SAAS,GAAG,SAAS;;CAE5D,GAAG,IAAI,UAAU,GAAG,UAAU,EAAE,GAAG,EAAE,CAAC;CACtC,GAAG,IAAI,eAAe,GAAG,UAAU,CAAC,KAAK,CAAC;;CAE1C,GAAG,IAAI,UAAU,GAAG,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC;CAC/C,GAAG,IAAI,eAAe,GAAG,UAAU,CAAC,KAAK,CAAC;;CAE1C,GAAG,IAAI,aAAa,GAAG,UAAU,CAAC,QAAQ,CAAC;;CAE3C,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,GAAG,MAAM,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG;;CAEzF,IAAI,eAAe,EAAE,CAAC,EAAE,GAAG,eAAe,EAAE,CAAC,EAAE,CAAC;;CAEhD,IAAI;;CAEJ,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,gBAAgB,EAAE,YAAY;;CAE/B,EAAE,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE7B,EAAE,OAAO,SAAS,gBAAgB,GAAG;;CAErC,GAAG,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;;CAExC,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEvD,IAAI,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;CACjC,IAAI,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;CACjC,IAAI,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;;CAEjC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;;CAEvB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAEtD,IAAI;;CAEJ,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,YAAY,EAAE,YAAY;;CAE3B,EAAE,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,GAAG;;CAE7B,GAAG,OAAO,CAAC,IAAI,EAAE,uEAAuE,EAAE,CAAC;CAC3F,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG;;CAEH,EAAE,IAAI,SAAS,GAAG,IAAI,cAAc,EAAE,CAAC;;CAEvC,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;CACjC,EAAE,IAAI,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;;CAEnC,EAAE,MAAM,IAAI,IAAI,IAAI,UAAU,GAAG;;CAEjC,GAAG,IAAI,SAAS,GAAG,UAAU,EAAE,IAAI,EAAE,CAAC;;CAEtC,GAAG,IAAI,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;CAC/B,GAAG,IAAI,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;;CAErC,GAAG,IAAI,MAAM,GAAG,IAAI,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;;CAEnE,GAAG,IAAI,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;;CAE7B,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEtD,IAAI,KAAK,GAAG,OAAO,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC;;CAEpC,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,GAAG,GAAG;;CAE1C,KAAK,MAAM,EAAE,MAAM,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,GAAG,EAAE,CAAC;;CAE7C,KAAK;;CAEL,IAAI;;CAEJ,GAAG,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC;;CAE3E,GAAG;;CAEH,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;CAE3B,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEpD,GAAG,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC;CAC3B,GAAG,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC;;CAEvE,GAAG;;CAEH,EAAE,OAAO,SAAS,CAAC;;CAEnB,EAAE;;CAEF,CAAC,MAAM,EAAE,YAAY;;CAErB,EAAE,IAAI,IAAI,GAAG;CACb,GAAG,QAAQ,EAAE;CACb,IAAI,OAAO,EAAE,GAAG;CAChB,IAAI,IAAI,EAAE,gBAAgB;CAC1B,IAAI,SAAS,EAAE,uBAAuB;CACtC,IAAI;CACJ,GAAG,CAAC;;CAEJ;;CAEA,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;CACxB,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;CACxB,EAAE,KAAK,IAAI,CAAC,IAAI,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;;CAEhD,EAAE,KAAK,IAAI,CAAC,UAAU,KAAK,SAAS,GAAG;;CAEvC,GAAG,IAAI,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;;CAEpC,GAAG,MAAM,IAAI,GAAG,IAAI,UAAU,GAAG;;CAEjC,IAAI,KAAK,UAAU,EAAE,GAAG,EAAE,KAAK,SAAS,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,UAAU,EAAE,GAAG,EAAE,CAAC;;CAE3E,IAAI;;CAEJ,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG;;CAEH,EAAE,IAAI,CAAC,IAAI,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;;CAEjC,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;;CAEzB,EAAE,KAAK,KAAK,KAAK,IAAI,GAAG;;CAExB,GAAG,IAAI,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;;CAEzD,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG;CACrB,IAAI,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI;CACtC,IAAI,KAAK,EAAE,KAAK;CAChB,IAAI,CAAC;;CAEL,GAAG;;CAEH,EAAE,IAAI,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;;CAEnC,EAAE,MAAM,IAAI,GAAG,IAAI,UAAU,GAAG;;CAEhC,GAAG,IAAI,SAAS,GAAG,UAAU,EAAE,GAAG,EAAE,CAAC;;CAErC,GAAG,IAAI,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC;;CAE7D,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG;CACjC,IAAI,QAAQ,EAAE,SAAS,CAAC,QAAQ;CAChC,IAAI,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI;CAC1C,IAAI,KAAK,EAAE,KAAK;CAChB,IAAI,UAAU,EAAE,SAAS,CAAC,UAAU;CACpC,IAAI,CAAC;;CAEL,GAAG;;CAEH,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;CAE3B,EAAE,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG;;CAE3B,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC;;CAE7D,GAAG;;CAEH,EAAE,IAAI,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;;CAE3C,EAAE,KAAK,cAAc,KAAK,IAAI,GAAG;;CAEjC,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,GAAG;CAC9B,IAAI,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE;CAC3C,IAAI,MAAM,EAAE,cAAc,CAAC,MAAM;CACjC,IAAI,CAAC;;CAEL,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,KAAK,EAAE,YAAY;;CAEpB;CACA;;CAEA;;CAEA;;CAEA;;CAEA;;CAEA;;CAEA;;CAEA;CACA;CACA;;CAEA;;CAEA;CACA;;CAEA,EAAE,OAAO,IAAI,cAAc,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE3C,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,MAAM,GAAG;;CAE3B,EAAE,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;;CAEjB;;CAEA,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;CACpB,EAAE,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;CACvB,EAAE,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;CAC5B,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;CACnB,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;CAC1B,EAAE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;;CAE7B;;CAEA,EAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;;CAE1B;;CAEA,EAAE,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;;CAE3B,EAAE,KAAK,KAAK,KAAK,IAAI,GAAG;;CAExB,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;;CAElC,GAAG;;CAEH;;CAEA,EAAE,IAAI,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;;CAErC,EAAE,MAAM,IAAI,IAAI,UAAU,GAAG;;CAE7B,GAAG,IAAI,SAAS,GAAG,UAAU,EAAE,IAAI,EAAE,CAAC;CACtC,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;;CAEhD,GAAG;;CAEH;;CAEA,EAAE,IAAI,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;;CAE/C,EAAE,MAAM,IAAI,IAAI,eAAe,GAAG;;CAElC,GAAG,IAAI,KAAK,GAAG,EAAE,CAAC;CAClB,GAAG,IAAI,cAAc,GAAG,eAAe,EAAE,IAAI,EAAE,CAAC;;CAEhD,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEzD,IAAI,KAAK,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;;CAE9C,IAAI;;CAEJ,GAAG,IAAI,CAAC,eAAe,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;;CAExC,GAAG;;CAEH;;CAEA,EAAE,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;;CAE7B,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEhD,GAAG,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC;CAC3B,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC;;CAElE,GAAG;;CAEH;;CAEA,EAAE,IAAI,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;;CAEvC,EAAE,KAAK,WAAW,KAAK,IAAI,GAAG;;CAE9B,GAAG,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,KAAK,EAAE,CAAC;;CAE1C,GAAG;;CAEH;;CAEA,EAAE,IAAI,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;;CAE7C,EAAE,KAAK,cAAc,KAAK,IAAI,GAAG;;CAEjC,GAAG,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC;;CAEhD,GAAG;;CAEH;;CAEA,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;CAChD,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;;CAEhD,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,OAAO,EAAE,YAAY;;CAEtB,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;;CAE5C,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;;CAEA;;CAEA,SAAS,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,GAAG;;CAE3F,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;;CAE3B,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,KAAK,EAAE,KAAK;CACd,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,KAAK,EAAE,KAAK;CACd,EAAE,aAAa,EAAE,aAAa;CAC9B,EAAE,cAAc,EAAE,cAAc;CAChC,EAAE,aAAa,EAAE,aAAa;CAC9B,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,EAAE,CAAC;CACxH,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;;CAEtB,CAAC;;CAED,WAAW,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CAC5D,WAAW,CAAC,SAAS,CAAC,WAAW,GAAG,WAAW,CAAC;;CAEhD;;CAEA,SAAS,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,GAAG;;CAEjG,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7B,CAAC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;;CAEjC,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,KAAK,EAAE,KAAK;CACd,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,KAAK,EAAE,KAAK;CACd,EAAE,aAAa,EAAE,aAAa;CAC9B,EAAE,cAAc,EAAE,cAAc;CAChC,EAAE,aAAa,EAAE,aAAa;CAC9B,EAAE,CAAC;;CAEH,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC;;CAElB,CAAC,KAAK,GAAG,KAAK,IAAI,CAAC,CAAC;CACpB,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC;CACtB,CAAC,KAAK,GAAG,KAAK,IAAI,CAAC,CAAC;;CAEpB;;CAEA,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;CAClD,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;CACpD,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;;CAElD;;CAEA,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC;CAClB,CAAC,IAAI,QAAQ,GAAG,EAAE,CAAC;CACnB,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC;CAClB,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC;;CAEd;;CAEA,CAAC,IAAI,gBAAgB,GAAG,CAAC,CAAC;CAC1B,CAAC,IAAI,UAAU,GAAG,CAAC,CAAC;;CAEpB;;CAEA,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;CAC/F,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;CAC/F,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC;CAC1F,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC;CAC9F,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;CAC7F,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;;CAEjG;;CAEA,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;CAC1B,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,sBAAsB,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;CAC5E,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,sBAAsB,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;CACzE,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,sBAAsB,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEjE,CAAC,SAAS,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,GAAG;;CAE/F,EAAE,IAAI,YAAY,GAAG,KAAK,GAAG,KAAK,CAAC;CACnC,EAAE,IAAI,aAAa,GAAG,MAAM,GAAG,KAAK,CAAC;;CAErC,EAAE,IAAI,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;CAC5B,EAAE,IAAI,UAAU,GAAG,MAAM,GAAG,CAAC,CAAC;CAC9B,EAAE,IAAI,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;;CAE5B,EAAE,IAAI,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC;CACzB,EAAE,IAAI,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC;;CAEzB,EAAE,IAAI,aAAa,GAAG,CAAC,CAAC;CACxB,EAAE,IAAI,UAAU,GAAG,CAAC,CAAC;;CAErB,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;;CAEb,EAAE,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE7B;;CAEA,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,GAAG,GAAG;;CAErC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,GAAG,UAAU,CAAC;;CAE3C,GAAG,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,GAAG,GAAG;;CAEtC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,GAAG,SAAS,CAAC;;CAE1C;;CAEA,IAAI,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;CAC3B,IAAI,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;CAC3B,IAAI,MAAM,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC;;CAE5B;;CAEA,IAAI,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAElD;;CAEA,IAAI,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;CACpB,IAAI,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;CACpB,IAAI,MAAM,EAAE,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;;CAEtC;;CAEA,IAAI,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAEjD;;CAEA,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC;CAC3B,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC;;CAEnC;;CAEA,IAAI,aAAa,IAAI,CAAC,CAAC;;CAEvB,IAAI;;CAEJ,GAAG;;CAEH;;CAEA;CACA;CACA;;CAEA,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,GAAG;;CAEpC,GAAG,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,GAAG;;CAErC,IAAI,IAAI,CAAC,GAAG,gBAAgB,GAAG,EAAE,GAAG,MAAM,GAAG,EAAE,CAAC;CAChD,IAAI,IAAI,CAAC,GAAG,gBAAgB,GAAG,EAAE,GAAG,MAAM,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;CACxD,IAAI,IAAI,CAAC,GAAG,gBAAgB,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,MAAM,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;CAChE,IAAI,IAAI,CAAC,GAAG,gBAAgB,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,MAAM,GAAG,EAAE,CAAC;;CAExD;;CAEA,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC5B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE5B;;CAEA,IAAI,UAAU,IAAI,CAAC,CAAC;;CAEpB,IAAI;;CAEJ,GAAG;;CAEH;;CAEA,EAAE,KAAK,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC;;CAE1D;;CAEA,EAAE,UAAU,IAAI,UAAU,CAAC;;CAE3B;;CAEA,EAAE,gBAAgB,IAAI,aAAa,CAAC;;CAEpC,EAAE;;CAEF,CAAC;;CAED,iBAAiB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,EAAE,CAAC;CACxE,iBAAiB,CAAC,SAAS,CAAC,WAAW,GAAG,iBAAiB,CAAC;;CAE5D;CACA;CACA;CACA;;CAEA;;CAEA,SAAS,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,GAAG;;CAEvE,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;;CAE7B,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,KAAK,EAAE,KAAK;CACd,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,aAAa,EAAE,aAAa;CAC9B,EAAE,cAAc,EAAE,cAAc;CAChC,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,mBAAmB,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,EAAE,CAAC;CACpG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;;CAEtB,CAAC;;CAED,aAAa,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CAC9D,aAAa,CAAC,SAAS,CAAC,WAAW,GAAG,aAAa,CAAC;;CAEpD;;CAEA,SAAS,mBAAmB,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,GAAG;;CAE7E,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7B,CAAC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;;CAEnC,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,KAAK,EAAE,KAAK;CACd,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,aAAa,EAAE,aAAa;CAC9B,EAAE,cAAc,EAAE,cAAc;CAChC,EAAE,CAAC;;CAEH,CAAC,KAAK,GAAG,KAAK,IAAI,CAAC,CAAC;CACpB,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC;;CAEtB,CAAC,IAAI,UAAU,GAAG,KAAK,GAAG,CAAC,CAAC;CAC5B,CAAC,IAAI,WAAW,GAAG,MAAM,GAAG,CAAC,CAAC;;CAE9B,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;CAC9C,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;;CAE/C,CAAC,IAAI,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC;CACxB,CAAC,IAAI,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC;;CAExB,CAAC,IAAI,aAAa,GAAG,KAAK,GAAG,KAAK,CAAC;CACnC,CAAC,IAAI,cAAc,GAAG,MAAM,GAAG,KAAK,CAAC;;CAErC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;;CAEZ;;CAEA,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC;CAClB,CAAC,IAAI,QAAQ,GAAG,EAAE,CAAC;CACnB,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC;CAClB,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC;;CAEd;;CAEA,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,GAAG,GAAG;;CAEpC,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,GAAG,WAAW,CAAC;;CAE5C,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,GAAG,GAAG;;CAErC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,GAAG,UAAU,CAAC;;CAE3C,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE9B,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE3B,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC;CAC1B,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC;;CAElC,GAAG;;CAEH,EAAE;;CAEF;;CAEA,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,GAAG;;CAEnC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,GAAG;;CAEpC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG,EAAE,CAAC;CAC5B,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;CACpC,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,KAAK,MAAM,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;CAC5C,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,KAAK,MAAM,GAAG,EAAE,CAAC;;CAEpC;;CAEA,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC3B,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE3B,GAAG;;CAEH,EAAE;;CAEF;;CAEA,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;CAC1B,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,sBAAsB,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;CAC5E,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,sBAAsB,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;CACzE,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,sBAAsB,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEjE,CAAC;;CAED,mBAAmB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,EAAE,CAAC;CAC1E,mBAAmB,CAAC,SAAS,CAAC,WAAW,GAAG,mBAAmB,CAAC;;CAEhE;CACA;CACA;CACA;;CAEA,IAAI,UAAU,GAAG,CAAC,CAAC;;CAEnB,SAAS,QAAQ,GAAG;;CAEpB,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,UAAU,GAAG,EAAE,EAAE,CAAC;;CAE/D,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;;CAElC,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;CAChB,CAAC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;;CAExB,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;CACjB,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;;CAEpB,CAAC,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC;CAChC,CAAC,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;CACvB,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;CAC1B,CAAC,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC;;CAE9B,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;CAClB,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;;CAE1B,CAAC,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC;CAChC,CAAC,IAAI,CAAC,QAAQ,GAAG,sBAAsB,CAAC;CACxC,CAAC,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC;CAClC,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;CAC3B,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;CAC3B,CAAC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;;CAEhC,CAAC,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC;CACjC,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;CACvB,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;;CAExB,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;CAC5B,CAAC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;CAC/B,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;;CAE1B,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;;CAExB,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;;CAExB,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;;CAEvB,CAAC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;CAC5B,CAAC,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;CAC9B,CAAC,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;;CAE7B,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;;CAExB,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;CACpB,CAAC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;;CAEjC,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;;CAEnB,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;;CAErB,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;;CAEpB,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEzB,CAAC;;CAED,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,SAAS,EAAE,EAAE;;CAEhF,CAAC,WAAW,EAAE,QAAQ;;CAEtB,CAAC,UAAU,EAAE,IAAI;;CAEjB,CAAC,eAAe,EAAE,YAAY,EAAE;;CAEhC,CAAC,SAAS,EAAE,WAAW,MAAM,GAAG;;CAEhC,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG,OAAO;;CAErC,EAAE,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG;;CAE5B,GAAG,IAAI,QAAQ,GAAG,MAAM,EAAE,GAAG,EAAE,CAAC;;CAEhC,GAAG,KAAK,QAAQ,KAAK,SAAS,GAAG;;CAEjC,IAAI,OAAO,CAAC,IAAI,EAAE,mBAAmB,GAAG,GAAG,GAAG,2BAA2B,EAAE,CAAC;CAC5E,IAAI,SAAS;;CAEb,IAAI;;CAEJ;CACA,GAAG,KAAK,GAAG,KAAK,SAAS,GAAG;;CAE5B,IAAI,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC,IAAI,GAAG,oEAAoE,EAAE,CAAC;CAChH,IAAI,IAAI,CAAC,WAAW,GAAG,EAAE,QAAQ,KAAK,WAAW,KAAK,IAAI,GAAG,KAAK,CAAC;CACnE,IAAI,SAAS;;CAEb,IAAI;;CAEJ,GAAG,IAAI,YAAY,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC;;CAElC,GAAG,KAAK,YAAY,KAAK,SAAS,GAAG;;CAErC,IAAI,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC,IAAI,GAAG,KAAK,GAAG,GAAG,GAAG,uCAAuC,EAAE,CAAC;CACjG,IAAI,SAAS;;CAEb,IAAI;;CAEJ,GAAG,KAAK,YAAY,IAAI,YAAY,CAAC,OAAO,GAAG;;CAE/C,IAAI,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;;CAEjC,IAAI,MAAM,KAAK,EAAE,YAAY,IAAI,YAAY,CAAC,SAAS,QAAQ,QAAQ,IAAI,QAAQ,CAAC,SAAS,EAAE,GAAG;;CAElG,IAAI,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;;CAElC,IAAI,MAAM,KAAK,GAAG,KAAK,UAAU,GAAG;;CAEpC;CACA,IAAI,IAAI,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC;;CAErC,IAAI,MAAM;;CAEV,IAAI,IAAI,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC;;CAE3B,IAAI;;CAEJ,GAAG;;CAEH,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,IAAI,GAAG;;CAE3B,EAAE,IAAI,MAAM,KAAK,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;;CAElE,EAAE,KAAK,MAAM,GAAG;;CAEhB,GAAG,IAAI,GAAG;CACV,IAAI,QAAQ,EAAE,EAAE;CAChB,IAAI,MAAM,EAAE,EAAE;CACd,IAAI,CAAC;;CAEL,GAAG;;CAEH,EAAE,IAAI,IAAI,GAAG;CACb,GAAG,QAAQ,EAAE;CACb,IAAI,OAAO,EAAE,GAAG;CAChB,IAAI,IAAI,EAAE,UAAU;CACpB,IAAI,SAAS,EAAE,iBAAiB;CAChC,IAAI;CACJ,GAAG,CAAC;;CAEJ;CACA,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;CACxB,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;;CAExB,EAAE,KAAK,IAAI,CAAC,IAAI,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;;CAEhD,EAAE,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;;CAE3E,EAAE,KAAK,IAAI,CAAC,SAAS,KAAK,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;CACtE,EAAE,KAAK,IAAI,CAAC,SAAS,KAAK,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;;CAEtE,EAAE,KAAK,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;CACvF,EAAE,KAAK,IAAI,CAAC,iBAAiB,KAAK,CAAC,GAAG,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;;CAEtF,EAAE,KAAK,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;CACvF,EAAE,KAAK,IAAI,CAAC,SAAS,KAAK,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;CACtE,EAAE,KAAK,IAAI,CAAC,SAAS,KAAK,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;CACtE,EAAE,KAAK,IAAI,CAAC,kBAAkB,KAAK,SAAS,GAAG,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;;CAEjG,EAAE,KAAK,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC;CAChF,EAAE,KAAK,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC;CACpG,EAAE,KAAK,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC;CACpG,EAAE,KAAK,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG;;CAEhD,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC;CACnD,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;;CAEnC,GAAG;CACH,EAAE,KAAK,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG;;CAEpD,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC;CACvD,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;;CAEjD,GAAG;CACH,EAAE,KAAK,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,SAAS,GAAG;;CAEhE,GAAG,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC;CACnE,GAAG,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;CACnD,GAAG,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;;CAEjD,GAAG;CACH,EAAE,KAAK,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC;CACpH,EAAE,KAAK,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC;;CAEpH,EAAE,KAAK,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC;CAChH,EAAE,KAAK,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC;;CAEhH,EAAE,KAAK,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG;;CAE9C,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC;CACjD,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;;CAEzC,GAAG;;CAEH,EAAE,KAAK,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,GAAG;;CAExD,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC;;CAE3D,GAAG;;CAEH,EAAE,KAAK,IAAI,CAAC,IAAI,KAAK,SAAS,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;CACvD,EAAE,KAAK,IAAI,CAAC,eAAe,KAAK,SAAS,GAAG,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;;CAExF,EAAE,KAAK,IAAI,CAAC,QAAQ,KAAK,cAAc,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;CACxE,EAAE,KAAK,IAAI,CAAC,WAAW,KAAK,IAAI,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;CACvE,EAAE,KAAK,IAAI,CAAC,IAAI,KAAK,SAAS,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;CACvD,EAAE,KAAK,IAAI,CAAC,YAAY,KAAK,QAAQ,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;;CAE9E,EAAE,KAAK,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;CACtD,EAAE,KAAK,IAAI,CAAC,WAAW,KAAK,IAAI,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;;CAEvE,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;CAClC,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;CAClC,EAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;;CAEpC;CACA,EAAE,KAAK,IAAI,CAAC,QAAQ,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAE3D,EAAE,KAAK,IAAI,CAAC,SAAS,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;CAC9D,EAAE,KAAK,IAAI,CAAC,QAAQ,KAAK,SAAS,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;CACnE,EAAE,KAAK,IAAI,CAAC,OAAO,KAAK,SAAS,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;CAChE,EAAE,KAAK,IAAI,CAAC,KAAK,KAAK,SAAS,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;;CAE1D,EAAE,KAAK,IAAI,CAAC,SAAS,KAAK,IAAI,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;;CAEvD,EAAE,KAAK,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;CAC5D,EAAE,KAAK,IAAI,CAAC,kBAAkB,KAAK,IAAI,GAAG,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;;CAE5F,EAAE,KAAK,IAAI,CAAC,SAAS,KAAK,IAAI,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;CACjE,EAAE,KAAK,IAAI,CAAC,kBAAkB,GAAG,CAAC,GAAG,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;CACvF,EAAE,KAAK,IAAI,CAAC,gBAAgB,KAAK,OAAO,GAAG,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;CACzF,EAAE,KAAK,IAAI,CAAC,iBAAiB,KAAK,OAAO,GAAG,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;;CAE5F,EAAE,KAAK,IAAI,CAAC,YAAY,KAAK,IAAI,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;CAC7D,EAAE,KAAK,IAAI,CAAC,QAAQ,KAAK,IAAI,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;;CAErD,EAAE,KAAK,IAAI,CAAC,OAAO,KAAK,KAAK,GAAG,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;CACrD,EAAE,KAAK,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAEhF;;CAEA,EAAE,SAAS,gBAAgB,EAAE,KAAK,GAAG;;CAErC,GAAG,IAAI,MAAM,GAAG,EAAE,CAAC;;CAEnB,GAAG,MAAM,IAAI,GAAG,IAAI,KAAK,GAAG;;CAE5B,IAAI,IAAI,IAAI,GAAG,KAAK,EAAE,GAAG,EAAE,CAAC;CAC5B,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC;CACzB,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAExB,IAAI;;CAEJ,GAAG,OAAO,MAAM,CAAC;;CAEjB,GAAG;;CAEH,EAAE,KAAK,MAAM,GAAG;;CAEhB,GAAG,IAAI,QAAQ,GAAG,gBAAgB,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;CACpD,GAAG,IAAI,MAAM,GAAG,gBAAgB,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAEhD,GAAG,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;CACvD,GAAG,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;;CAEjD,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7C,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,MAAM,GAAG;;CAE3B,EAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;;CAE1B,EAAE,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;CACxB,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;;CAE9B,EAAE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;CAClC,EAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;CAC1B,EAAE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;CACxC,EAAE,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;;CAE1C,EAAE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;CAChC,EAAE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;;CAExC,EAAE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;CAClC,EAAE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;CAClC,EAAE,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;CAC5C,EAAE,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;CAC5C,EAAE,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;CAC5C,EAAE,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;;CAEtD,EAAE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;CACpC,EAAE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;CACpC,EAAE,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;;CAEtC,EAAE,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;;CAEtC,EAAE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;;CAEpC,EAAE,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;CAC5C,EAAE,IAAI,CAAC,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;CACxD,EAAE,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;;CAEtD,EAAE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;;CAEpC,EAAE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;CACpC,EAAE,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;;CAEtD,EAAE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;;CAElC,EAAE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;CAChC,EAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;;CAElE,EAAE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;CACxC,EAAE,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;;CAElD,EAAE,IAAI,SAAS,GAAG,MAAM,CAAC,cAAc;CACvC,GAAG,SAAS,GAAG,IAAI,CAAC;;CAEpB,EAAE,KAAK,SAAS,KAAK,IAAI,GAAG;;CAE5B,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC;CAC5B,GAAG,SAAS,GAAG,IAAI,KAAK,EAAE,CAAC,EAAE,CAAC;;CAE9B,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC;CACjC,IAAI,SAAS,EAAE,CAAC,EAAE,GAAG,SAAS,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;;CAE5C,GAAG;;CAEH,EAAE,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;;CAElC,EAAE,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;;CAEtC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,OAAO,EAAE,YAAY;;CAEtB,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;;CAE5C,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,iBAAiB,EAAE,UAAU,GAAG;;CAEzC,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;;CAEjC,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,EAAE,QAAQ,EAAE,CAAC;;CAEpC,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;;CAEjB,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;CACtB,CAAC,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC;;CAE9B,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;CACnB,CAAC,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;;CAE3B,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEzB,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;;CAEtB,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;CACpB,CAAC,IAAI,CAAC,OAAO,GAAG,iBAAiB,CAAC;CAClC,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;CACvB,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;;CAE7B,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;CACxB,CAAC,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;CAC7B,CAAC,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC;CACjC,CAAC,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC;;CAElC,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;CACvB,CAAC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;;CAE3B,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;;CAErB,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC;;CAE9B,CAAC;;CAED,iBAAiB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CAClE,iBAAiB,CAAC,SAAS,CAAC,WAAW,GAAG,iBAAiB,CAAC;;CAE5D,iBAAiB,CAAC,SAAS,CAAC,mBAAmB,GAAG,IAAI,CAAC;;CAEvD,iBAAiB,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW,MAAM,GAAG;;CAEvD,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE9C,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;;CAEjC,CAAC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;;CAEvB,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;CACjC,CAAC,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;;CAEnD,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;CAC3B,CAAC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;;CAE7C,CAAC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;;CAEvC,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;;CAEjC,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;CAC7B,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;CAC/B,CAAC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;CACzC,CAAC,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;;CAE/C,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;CACnC,CAAC,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;CACrD,CAAC,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;CACjD,CAAC,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;;CAEnD,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;CACjC,CAAC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;;CAEzC,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,cAAc,EAAE,UAAU,GAAG;;CAEtC,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;;CAE9B,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;CACnB,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;;CAEpB,CAAC,IAAI,CAAC,YAAY,GAAG,+FAA+F,CAAC;CACrH,CAAC,IAAI,CAAC,cAAc,GAAG,gEAAgE,CAAC;;CAExF,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;;CAEpB,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;CACxB,CAAC,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;;CAE7B,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC;CAClB,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;CACrB,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;;CAEvB,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;CACvB,CAAC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;CAC3B,CAAC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;;CAE3B,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,WAAW,EAAE,KAAK;CACpB,EAAE,SAAS,EAAE,KAAK;CAClB,EAAE,WAAW,EAAE,KAAK;CACpB,EAAE,gBAAgB,EAAE,KAAK;CACzB,EAAE,CAAC;;CAEH;CACA;CACA,CAAC,IAAI,CAAC,sBAAsB,GAAG;CAC/B,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;CACtB,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;CAChB,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;CACjB,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;CACtC,CAAC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;;CAEjC,CAAC,KAAK,UAAU,KAAK,SAAS,GAAG;;CAEjC,EAAE,KAAK,UAAU,CAAC,UAAU,KAAK,SAAS,GAAG;;CAE7C,GAAG,OAAO,CAAC,KAAK,EAAE,yFAAyF,EAAE,CAAC;;CAE9G,GAAG;;CAEH,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC;;CAE/B,EAAE;;CAEF,CAAC;;CAED,cAAc,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CAC/D,cAAc,CAAC,SAAS,CAAC,WAAW,GAAG,cAAc,CAAC;;CAEtD,cAAc,CAAC,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC;;CAEjD,cAAc,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW,MAAM,GAAG;;CAEpD,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE9C,CAAC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;CAC7C,CAAC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;;CAEzC,CAAC,IAAI,CAAC,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;;CAExD,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;;CAEpD,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;CACnC,CAAC,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;;CAErD,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;CAC7B,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;;CAEjC,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;;CAEjC,CAAC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;CACzC,CAAC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;;CAEzC,CAAC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;;CAErC,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF,cAAc,CAAC,SAAS,CAAC,MAAM,GAAG,WAAW,IAAI,GAAG;;CAEpD,CAAC,IAAI,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEzD,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;CAC/B,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;CACvC,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;;CAE3C,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF;CACA;CACA;;CAEA,SAAS,GAAG,EAAE,MAAM,EAAE,SAAS,GAAG;;CAElC,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,MAAM,KAAK,SAAS,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;CACjE,CAAC,IAAI,CAAC,SAAS,GAAG,EAAE,SAAS,KAAK,SAAS,KAAK,SAAS,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE1E,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,EAAE;;CAE9B,CAAC,GAAG,EAAE,WAAW,MAAM,EAAE,SAAS,GAAG;;CAErC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;CAC7B,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;;CAEnC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7C,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,GAAG,GAAG;;CAExB,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;CACjC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;;CAEvC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG;;CAE5B,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,OAAO,CAAC,IAAI,EAAE,yCAAyC,EAAE,CAAC;CAC7D,GAAG,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE1B,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAE9E,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG;;CAExB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,CAAC;;CAE1D,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,YAAY;;CAErB,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,OAAO,SAAS,MAAM,EAAE,CAAC,GAAG;;CAE9B,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;;CAExC,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,mBAAmB,EAAE,WAAW,KAAK,EAAE,MAAM,GAAG;;CAEjD,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,OAAO,CAAC,IAAI,EAAE,0DAA0D,EAAE,CAAC;CAC9E,GAAG,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE1B,GAAG;;CAEH,EAAE,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAE1C,EAAE,IAAI,iBAAiB,GAAG,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;;CAEvD,EAAE,KAAK,iBAAiB,GAAG,CAAC,GAAG;;CAE/B,GAAG,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAErC,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,cAAc,EAAE,iBAAiB,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAE9F,EAAE;;CAEF,CAAC,eAAe,EAAE,WAAW,KAAK,GAAG;;CAErC,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE,EAAE,CAAC;;CAEtD,EAAE;;CAEF,CAAC,iBAAiB,EAAE,YAAY;;CAEhC,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,OAAO,SAAS,iBAAiB,EAAE,KAAK,GAAG;;CAE7C,GAAG,IAAI,iBAAiB,GAAG,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;;CAErF;;CAEA,GAAG,KAAK,iBAAiB,GAAG,CAAC,GAAG;;CAEhC,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,KAAK,EAAE,CAAC;;CAElD,IAAI;;CAEJ,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,cAAc,EAAE,iBAAiB,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAEpF,GAAG,OAAO,EAAE,CAAC,iBAAiB,EAAE,KAAK,EAAE,CAAC;;CAExC,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,mBAAmB,EAAE,YAAY;;CAElC,EAAE,IAAI,SAAS,GAAG,IAAI,OAAO,EAAE,CAAC;CAChC,EAAE,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;CAC7B,EAAE,IAAI,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE3B,EAAE,OAAO,SAAS,mBAAmB,EAAE,EAAE,EAAE,EAAE,EAAE,kBAAkB,EAAE,sBAAsB,GAAG;;CAE5F;CACA;CACA;CACA;CACA;CACA;;CAEA,GAAG,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC;CACxD,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC;CAC3C,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC;;CAE7C,GAAG,IAAI,SAAS,GAAG,EAAE,CAAC,UAAU,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC;CAC7C,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC;CAC5C,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;CACvC,GAAG,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC;CACjC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;CAC3B,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC;CACvC,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC;;CAE/B,GAAG,KAAK,GAAG,GAAG,CAAC,GAAG;;CAElB;;CAEA,IAAI,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;CACvB,IAAI,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;CACvB,IAAI,MAAM,GAAG,SAAS,GAAG,GAAG,CAAC;;CAE7B,IAAI,KAAK,EAAE,IAAI,CAAC,GAAG;;CAEnB,KAAK,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG;;CAE3B,MAAM,KAAK,EAAE,IAAI,MAAM,GAAG;;CAE1B;CACA;;CAEA,OAAO,IAAI,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC;CAC5B,OAAO,EAAE,IAAI,MAAM,CAAC;CACpB,OAAO,EAAE,IAAI,MAAM,CAAC;CACpB,OAAO,OAAO,GAAG,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;;CAEvF,OAAO,MAAM;;CAEb;;CAEA,OAAO,EAAE,GAAG,SAAS,CAAC;CACtB,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;CAC/C,OAAO,OAAO,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;;CAEtD,OAAO;;CAEP,MAAM,MAAM;;CAEZ;;CAEA,MAAM,EAAE,GAAG,EAAE,SAAS,CAAC;CACvB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;CAC9C,MAAM,OAAO,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;;CAErD,MAAM;;CAEN,KAAK,MAAM;;CAEX,KAAK,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG;;CAE3B;;CAEA,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,GAAG,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC;CACvD,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;CAC3F,MAAM,OAAO,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;;CAErD,MAAM,MAAM,KAAK,EAAE,IAAI,MAAM,GAAG;;CAEhC;;CAEA,MAAM,EAAE,GAAG,CAAC,CAAC;CACb,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;CAChE,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;;CAEzC,MAAM,MAAM;;CAEZ;;CAEA,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,GAAG,GAAG,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC;CACrD,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,KAAK,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;CACzF,MAAM,OAAO,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;;CAErD,MAAM;;CAEN,KAAK;;CAEL,IAAI,MAAM;;CAEV;;CAEA,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;CAC/C,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;CAC5C,IAAI,OAAO,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;;CAEnD,IAAI;;CAEJ,GAAG,KAAK,kBAAkB,GAAG;;CAE7B,IAAI,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,cAAc,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAEtF,IAAI;;CAEJ,GAAG,KAAK,sBAAsB,GAAG;;CAEjC,IAAI,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,cAAc,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC;;CAEhF,IAAI;;CAEJ,GAAG,OAAO,OAAO,CAAC;;CAElB,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,eAAe,EAAE,YAAY;;CAE9B,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,OAAO,SAAS,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG;;CAEpD,GAAG,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;CAC/C,GAAG,IAAI,GAAG,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;CACtC,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC;CACrC,GAAG,IAAI,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;;CAE/C,GAAG,KAAK,EAAE,GAAG,OAAO,GAAG,OAAO,IAAI,CAAC;;CAEnC,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,EAAE,EAAE,CAAC;;CAEvC;CACA,GAAG,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC;;CAEtB;CACA,GAAG,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC;;CAEtB;CACA,GAAG,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,OAAO,IAAI,CAAC;;CAEvC;CACA;CACA;CACA,GAAG,KAAK,EAAE,GAAG,CAAC,GAAG,OAAO,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;;CAE9C;CACA,GAAG,OAAO,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;;CAEhC,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,gBAAgB,EAAE,WAAW,MAAM,GAAG;;CAEvC,EAAE,OAAO,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC;;CAEhE,EAAE;;CAEF,CAAC,eAAe,EAAE,WAAW,KAAK,GAAG;;CAErC,EAAE,IAAI,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;;CAEvD,EAAE,KAAK,WAAW,KAAK,CAAC,GAAG;;CAE3B;CACA,GAAG,KAAK,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG;;CAErD,IAAI,OAAO,CAAC,CAAC;;CAEb,IAAI;;CAEJ;;CAEA,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG;;CAEH,EAAE,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,GAAG,WAAW,CAAC;;CAE/E;;CAEA,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;;CAE3B,EAAE;;CAEF,CAAC,cAAc,EAAE,WAAW,KAAK,EAAE,MAAM,GAAG;;CAE5C,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC;;CAExC,EAAE,KAAK,CAAC,KAAK,IAAI,GAAG;;CAEpB,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;;CAE9B,EAAE;;CAEF,CAAC,eAAe,EAAE,WAAW,KAAK,GAAG;;CAErC;;CAEA,EAAE,IAAI,WAAW,GAAG,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAEzD,EAAE,KAAK,WAAW,KAAK,CAAC,GAAG;;CAE3B,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG;;CAEH,EAAE,IAAI,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;;CAEvD,EAAE,KAAK,WAAW,GAAG,WAAW,GAAG,CAAC,GAAG;;CAEvC,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG;;CAEH;;CAEA,EAAE,OAAO,KAAK,CAAC;;CAEf,EAAE;;CAEF,CAAC,YAAY,EAAE,WAAW,GAAG,EAAE,MAAM,GAAG;;CAExC,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;;CAE7C,EAAE,IAAI,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;CACpC,GAAG,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;CACjC,GAAG,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;;CAElC,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;CAE3B,EAAE,KAAK,OAAO,IAAI,CAAC,GAAG;;CAEtB,GAAG,IAAI,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,OAAO,CAAC;CAC7C,GAAG,IAAI,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,OAAO,CAAC;;CAE7C,GAAG,MAAM;;CAET,GAAG,IAAI,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,OAAO,CAAC;CAC7C,GAAG,IAAI,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,OAAO,CAAC;;CAE7C,GAAG;;CAEH,EAAE,KAAK,OAAO,IAAI,CAAC,GAAG;;CAEtB,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,OAAO,CAAC;CAC9C,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,OAAO,CAAC;;CAE9C,GAAG,MAAM;;CAET,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,OAAO,CAAC;CAC9C,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,OAAO,CAAC;;CAE9C,GAAG;;CAEH,EAAE,KAAK,EAAE,IAAI,GAAG,KAAK,QAAQ,KAAK,GAAG,IAAI,EAAE,GAAG,OAAO,IAAI,CAAC;;CAE1D;CACA;;CAEA,EAAE,KAAK,KAAK,GAAG,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;;CAEpD,EAAE,KAAK,KAAK,GAAG,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;;CAEpD,EAAE,KAAK,OAAO,IAAI,CAAC,GAAG;;CAEtB,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,OAAO,CAAC;CAC9C,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,OAAO,CAAC;;CAE9C,GAAG,MAAM;;CAET,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,OAAO,CAAC;CAC9C,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,OAAO,CAAC;;CAE9C,GAAG;;CAEH,EAAE,KAAK,EAAE,IAAI,GAAG,KAAK,QAAQ,KAAK,GAAG,IAAI,EAAE,GAAG,OAAO,IAAI,CAAC;;CAE1D,EAAE,KAAK,KAAK,GAAG,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;;CAEpD,EAAE,KAAK,KAAK,GAAG,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;;CAEpD;;CAEA,EAAE,KAAK,IAAI,GAAG,CAAC,GAAG,OAAO,IAAI,CAAC;;CAE9B,EAAE,OAAO,IAAI,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC;;CAEpD,EAAE;;CAEF,CAAC,aAAa,EAAE,EAAE,YAAY;;CAE9B,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;;CAExB,EAAE,OAAO,SAAS,aAAa,EAAE,GAAG,GAAG;;CAEvC,GAAG,OAAO,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;;CAE/C,GAAG,CAAC;;CAEJ,EAAE,IAAI;;CAEN,CAAC,iBAAiB,EAAE,YAAY;;CAEhC;CACA,EAAE,IAAI,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;CAC3B,EAAE,IAAI,KAAK,GAAG,IAAI,OAAO,EAAE,CAAC;CAC5B,EAAE,IAAI,KAAK,GAAG,IAAI,OAAO,EAAE,CAAC;CAC5B,EAAE,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE7B,EAAE,OAAO,SAAS,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,eAAe,EAAE,MAAM,GAAG;;CAExE;;CAEA,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC5B,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC5B,GAAG,MAAM,CAAC,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;;CAEvC;CACA;CACA;CACA;CACA;CACA,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC;CAC1C,GAAG,IAAI,IAAI,CAAC;;CAEZ,GAAG,KAAK,GAAG,GAAG,CAAC,GAAG;;CAElB,IAAI,KAAK,eAAe,GAAG,OAAO,IAAI,CAAC;CACvC,IAAI,IAAI,GAAG,CAAC,CAAC;;CAEb,IAAI,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG;;CAEzB,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;CACf,IAAI,GAAG,GAAG,EAAE,GAAG,CAAC;;CAEhB,IAAI,MAAM;;CAEV,IAAI,OAAO,IAAI,CAAC;;CAEhB,IAAI;;CAEJ,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;CACrC,GAAG,IAAI,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;;CAE/E;CACA,GAAG,KAAK,MAAM,GAAG,CAAC,GAAG;;CAErB,IAAI,OAAO,IAAI,CAAC;;CAEhB,IAAI;;CAEJ,GAAG,IAAI,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;;CAEjE;CACA,GAAG,KAAK,MAAM,GAAG,CAAC,GAAG;;CAErB,IAAI,OAAO,IAAI,CAAC;;CAEhB,IAAI;;CAEJ;CACA,GAAG,KAAK,MAAM,GAAG,MAAM,GAAG,GAAG,GAAG;;CAEhC,IAAI,OAAO,IAAI,CAAC;;CAEhB,IAAI;;CAEJ;CACA,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC;;CAEzC;CACA,GAAG,KAAK,GAAG,GAAG,CAAC,GAAG;;CAElB,IAAI,OAAO,IAAI,CAAC;;CAEhB,IAAI;;CAEJ;CACA,GAAG,OAAO,IAAI,CAAC,EAAE,EAAE,GAAG,GAAG,GAAG,EAAE,MAAM,EAAE,CAAC;;CAEvC,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,YAAY,EAAE,WAAW,OAAO,GAAG;;CAEpC,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC;CACtC,EAAE,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,OAAO,EAAE,CAAC;;CAE/C,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,GAAG,GAAG;;CAE1B,EAAE,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;;CAEpF,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,KAAK,EAAE,KAAK,EAAE,GAAG,GAAG;;CAE7B,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,KAAK,KAAK,SAAS,KAAK,KAAK,GAAG,IAAI,OAAO,EAAE,CAAC;CAC9D,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,GAAG,KAAK,SAAS,KAAK,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC;;CAExD,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE;;CAEhC,CAAC,GAAG,EAAE,WAAW,KAAK,EAAE,GAAG,GAAG;;CAE9B,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;CAC3B,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;;CAEvB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7C,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,IAAI,GAAG;;CAEzB,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;CAChC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;;CAE5B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,SAAS,EAAE,WAAW,MAAM,GAAG;;CAEhC,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,OAAO,CAAC,IAAI,EAAE,kDAAkD,EAAE,CAAC;CACtE,GAAG,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE1B,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC;;CAEzE,EAAE;;CAEF,CAAC,KAAK,EAAE,WAAW,MAAM,GAAG;;CAE5B,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,OAAO,CAAC,IAAI,EAAE,8CAA8C,EAAE,CAAC;CAClE,GAAG,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE1B,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;;CAEnD,EAAE;;CAEF,CAAC,UAAU,EAAE,YAAY;;CAEzB,EAAE,OAAO,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;;CAElD,EAAE;;CAEF,CAAC,QAAQ,EAAE,YAAY;;CAEvB,EAAE,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;;CAE3C,EAAE;;CAEF,CAAC,EAAE,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG;;CAE5B,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,OAAO,CAAC,IAAI,EAAE,2CAA2C,EAAE,CAAC;CAC/D,GAAG,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE1B,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;;CAEpE,EAAE;;CAEF,CAAC,4BAA4B,EAAE,YAAY;;CAE3C,EAAE,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;CAC7B,EAAE,IAAI,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE/B,EAAE,OAAO,SAAS,4BAA4B,EAAE,KAAK,EAAE,WAAW,GAAG;;CAErE,GAAG,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;CAC1C,GAAG,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;;CAE/C,GAAG,IAAI,SAAS,GAAG,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;CAC5C,GAAG,IAAI,eAAe,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC;;CAEhD,GAAG,IAAI,CAAC,GAAG,eAAe,GAAG,SAAS,CAAC;;CAEvC,GAAG,KAAK,WAAW,GAAG;;CAEtB,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE/B,IAAI;;CAEJ,GAAG,OAAO,CAAC,CAAC;;CAEZ,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,mBAAmB,EAAE,WAAW,KAAK,EAAE,WAAW,EAAE,MAAM,GAAG;;CAE9D,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,4BAA4B,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;;CAElE,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,OAAO,CAAC,IAAI,EAAE,4DAA4D,EAAE,CAAC;CAChF,GAAG,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE1B,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;;CAEpE,EAAE;;CAEF,CAAC,YAAY,EAAE,WAAW,MAAM,GAAG;;CAEnC,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;CACpC,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;;CAElC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,IAAI,GAAG;;CAE3B,EAAE,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;;CAExE,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;;CAEA,SAAS,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;CAE7B,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,SAAS,KAAK,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;CAClD,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,SAAS,KAAK,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;CAClD,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,SAAS,KAAK,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;;CAElD,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE;;CAEzB,CAAC,SAAS,EAAE,YAAY;;CAExB,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,OAAO,SAAS,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG;;CAE/C,GAAG,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE/B,IAAI,OAAO,CAAC,IAAI,EAAE,qDAAqD,EAAE,CAAC;CAC1E,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE3B,IAAI;;CAEJ,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC7B,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CACzB,GAAG,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC;;CAEtB,GAAG,IAAI,cAAc,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;CAC1C,GAAG,KAAK,cAAc,GAAG,CAAC,GAAG;;CAE7B,IAAI,OAAO,MAAM,CAAC,cAAc,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,EAAE,CAAC;;CAEpE,IAAI;;CAEJ,GAAG,OAAO,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEhC,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ;CACA;CACA,CAAC,YAAY,EAAE,YAAY;;CAE3B,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CACzB,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CACzB,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,OAAO,SAAS,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG;;CAEzD,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CACzB,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CACzB,GAAG,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;;CAE7B,GAAG,IAAI,KAAK,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC;CAC5B,GAAG,IAAI,KAAK,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC;CAC5B,GAAG,IAAI,KAAK,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC;CAC5B,GAAG,IAAI,KAAK,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC;CAC5B,GAAG,IAAI,KAAK,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC;;CAE5B,GAAG,IAAI,KAAK,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,EAAE,CAAC;;CAEjD,GAAG,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE/B,IAAI,OAAO,CAAC,IAAI,EAAE,wDAAwD,EAAE,CAAC;CAC7E,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE3B,IAAI;;CAEJ;CACA,GAAG,KAAK,KAAK,KAAK,CAAC,GAAG;;CAEtB;CACA;CACA,IAAI,OAAO,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;;CAEvC,IAAI;;CAEJ,GAAG,IAAI,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC;CAC5B,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,KAAK,QAAQ,CAAC;CACxD,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,KAAK,QAAQ,CAAC;;CAExD;CACA,GAAG,OAAO,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAExC,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,aAAa,EAAE,YAAY;;CAE5B,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,OAAO,SAAS,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;CAElD,GAAG,QAAQ,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;;CAE/C,GAAG,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;;CAErE,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,EAAE,CAAC;;CAEJ,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE;;CAEnC,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;CAE3B,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;CACnB,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;CACnB,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;;CAEnB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,uBAAuB,EAAE,WAAW,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG;;CAE1D,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;CAC9B,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;CAC9B,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;;CAE9B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7C,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,QAAQ,GAAG;;CAE7B,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;CAC5B,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;CAC5B,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;;CAE5B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,OAAO,EAAE,YAAY;;CAEtB,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CACzB,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,OAAO,SAAS,OAAO,GAAG;;CAE5B,GAAG,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CACnC,GAAG,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;;CAEnC,GAAG,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC;;CAExC,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,WAAW,EAAE,WAAW,MAAM,GAAG;;CAElC,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,OAAO,CAAC,IAAI,EAAE,uDAAuD,EAAE,CAAC;CAC3E,GAAG,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE1B,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;;CAEnF,EAAE;;CAEF,CAAC,SAAS,EAAE,WAAW,MAAM,GAAG;;CAEhC,EAAE,OAAO,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;;CAE9D,EAAE;;CAEF,CAAC,QAAQ,EAAE,WAAW,MAAM,GAAG;;CAE/B,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,OAAO,CAAC,IAAI,EAAE,oDAAoD,EAAE,CAAC;CACxE,GAAG,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE1B,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;;CAEhE,EAAE;;CAEF,CAAC,YAAY,EAAE,WAAW,KAAK,EAAE,MAAM,GAAG;;CAE1C,EAAE,OAAO,QAAQ,CAAC,YAAY,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;;CAExE,EAAE;;CAEF,CAAC,aAAa,EAAE,WAAW,KAAK,GAAG;;CAEnC,EAAE,OAAO,QAAQ,CAAC,aAAa,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;;CAEjE,EAAE;;CAEF,CAAC,aAAa,EAAE,WAAW,GAAG,GAAG;;CAEjC,EAAE,OAAO,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC;;CAExC,EAAE;;CAEF,CAAC,mBAAmB,EAAE,YAAY;;CAElC,EAAE,IAAI,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;CAC1B,EAAE,IAAI,QAAQ,GAAG,EAAE,IAAI,KAAK,EAAE,EAAE,IAAI,KAAK,EAAE,EAAE,IAAI,KAAK,EAAE,EAAE,CAAC;CAC3D,EAAE,IAAI,cAAc,GAAG,IAAI,OAAO,EAAE,CAAC;CACrC,EAAE,IAAI,YAAY,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEnC,EAAE,OAAO,SAAS,mBAAmB,EAAE,KAAK,EAAE,MAAM,GAAG;;CAEvD,GAAG,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE/B,IAAI,OAAO,CAAC,IAAI,EAAE,+DAA+D,EAAE,CAAC;CACpF,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE3B,IAAI;;CAEJ,GAAG,IAAI,WAAW,GAAG,QAAQ,CAAC;;CAE9B;;CAEA,GAAG,KAAK,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CACzD,GAAG,KAAK,CAAC,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;;CAE/C;;CAEA,GAAG,KAAK,IAAI,CAAC,aAAa,EAAE,cAAc,EAAE,KAAK,IAAI,GAAG;;CAExD;;CAEA,IAAI,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC;;CAElC,IAAI,MAAM;;CAEV;;CAEA,IAAI,QAAQ,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CACxC,IAAI,QAAQ,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CACxC,IAAI,QAAQ,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;;CAExC,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAEjD,KAAK,QAAQ,EAAE,CAAC,EAAE,CAAC,mBAAmB,EAAE,cAAc,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;CAE7E,KAAK,IAAI,QAAQ,GAAG,cAAc,CAAC,iBAAiB,EAAE,YAAY,EAAE,CAAC;;CAErE,KAAK,KAAK,QAAQ,GAAG,WAAW,GAAG;;CAEnC,MAAM,WAAW,GAAG,QAAQ,CAAC;;CAE7B,MAAM,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC;;CAElC,MAAM;;CAEN,KAAK;;CAEL,IAAI;;CAEJ,GAAG,OAAO,MAAM,CAAC;;CAEjB,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,MAAM,EAAE,WAAW,QAAQ,GAAG;;CAE/B,EAAE,OAAO,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;;CAEnG,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,IAAI,EAAE,QAAQ,EAAE,QAAQ,GAAG;;CAEpC,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;;CAEpB,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,KAAK,SAAS,GAAG,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;CAC1E,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,KAAK,SAAS,GAAG,QAAQ,GAAG,IAAI,iBAAiB,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,EAAE,EAAE,CAAC;;CAElH,CAAC,IAAI,CAAC,QAAQ,GAAG,iBAAiB,CAAC;;CAEnC,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;;CAE3B,CAAC;;CAED,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,EAAE;;CAErE,CAAC,WAAW,EAAE,IAAI;;CAElB,CAAC,MAAM,EAAE,IAAI;;CAEb,CAAC,WAAW,EAAE,WAAW,KAAK,GAAG;;CAEjC,EAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;;CAExB,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,MAAM,GAAG;;CAE3B,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE/C,EAAE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;;CAElC,EAAE,KAAK,MAAM,CAAC,qBAAqB,KAAK,SAAS,GAAG;;CAEpD,GAAG,IAAI,CAAC,qBAAqB,GAAG,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;;CAErE,GAAG;;CAEH,EAAE,KAAK,MAAM,CAAC,qBAAqB,KAAK,SAAS,GAAG;;CAEpD,GAAG,IAAI,CAAC,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,qBAAqB,EAAE,CAAC;;CAElF,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,kBAAkB,EAAE,YAAY;;CAEjC,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;CAC/B,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC;;CAElB,EAAE,KAAK,QAAQ,CAAC,gBAAgB,GAAG;;CAEnC,GAAG,IAAI,eAAe,GAAG,QAAQ,CAAC,eAAe,CAAC;CAClD,GAAG,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,eAAe,EAAE,CAAC;;CAE7C,GAAG,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG;;CAE1B,IAAI,IAAI,cAAc,GAAG,eAAe,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEtD,IAAI,KAAK,cAAc,KAAK,SAAS,GAAG;;CAExC,KAAK,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC;CACrC,KAAK,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC;;CAErC,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAE7D,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC,EAAE,CAAC,IAAI,IAAI,MAAM,EAAE,CAAC,EAAE,CAAC;;CAErD,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;CAC3C,MAAM,IAAI,CAAC,qBAAqB,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;;CAE7C,MAAM;;CAEN,KAAK;;CAEL,IAAI;;CAEJ,GAAG,MAAM;;CAET,GAAG,IAAI,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;;CAE5C,GAAG,KAAK,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,GAAG;;CAEhE,IAAI,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC;CACpC,IAAI,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC;;CAEpC,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAE1D,KAAK,IAAI,GAAG,YAAY,EAAE,CAAC,EAAE,CAAC,IAAI,IAAI,MAAM,EAAE,CAAC,EAAE,CAAC;;CAElD,KAAK,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;CAC1C,KAAK,IAAI,CAAC,qBAAqB,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;;CAE5C,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH,EAAE;;CAEF,CAAC,OAAO,IAAI,YAAY;;CAExB,EAAE,IAAI,aAAa,GAAG,IAAI,OAAO,EAAE,CAAC;CACpC,EAAE,IAAI,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;CACtB,EAAE,IAAI,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;;CAE5B,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CACzB,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CACzB,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,IAAI,KAAK,GAAG,IAAI,OAAO,EAAE,CAAC;CAC5B,EAAE,IAAI,KAAK,GAAG,IAAI,OAAO,EAAE,CAAC;CAC5B,EAAE,IAAI,KAAK,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE5B,EAAE,IAAI,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC;CAC1B,EAAE,IAAI,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC;CAC1B,EAAE,IAAI,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE1B,EAAE,IAAI,SAAS,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEhC,EAAE,IAAI,iBAAiB,GAAG,IAAI,OAAO,EAAE,CAAC;CACxC,EAAE,IAAI,sBAAsB,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE7C,EAAE,SAAS,cAAc,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG;;CAE9D,GAAG,QAAQ,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;;CAEzD,GAAG,GAAG,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;CACrC,GAAG,GAAG,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;CACrC,GAAG,GAAG,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;;CAErC,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;;CAE7B,GAAG,OAAO,GAAG,CAAC,KAAK,EAAE,CAAC;;CAEtB,GAAG;;CAEH,EAAE,SAAS,iBAAiB,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG;;CAEpF,GAAG,IAAI,SAAS,CAAC;;CAEjB,GAAG,KAAK,QAAQ,CAAC,IAAI,KAAK,QAAQ,GAAG;;CAErC,IAAI,SAAS,GAAG,GAAG,CAAC,iBAAiB,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;CAEjE,IAAI,MAAM;;CAEV,IAAI,SAAS,GAAG,GAAG,CAAC,iBAAiB,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,IAAI,KAAK,UAAU,EAAE,KAAK,EAAE,CAAC;;CAEzF,IAAI;;CAEJ,GAAG,KAAK,SAAS,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC;;CAEzC,GAAG,sBAAsB,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;CACxC,GAAG,sBAAsB,CAAC,YAAY,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;;CAE7D,GAAG,IAAI,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,sBAAsB,EAAE,CAAC;;CAE5E,GAAG,KAAK,QAAQ,GAAG,SAAS,CAAC,IAAI,IAAI,QAAQ,GAAG,SAAS,CAAC,GAAG,GAAG,OAAO,IAAI,CAAC;;CAE5E,GAAG,OAAO;CACV,IAAI,QAAQ,EAAE,QAAQ;CACtB,IAAI,KAAK,EAAE,sBAAsB,CAAC,KAAK,EAAE;CACzC,IAAI,MAAM,EAAE,MAAM;CAClB,IAAI,CAAC;;CAEL,GAAG;;CAEH,EAAE,SAAS,+BAA+B,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;CAE5F,GAAG,EAAE,CAAC,mBAAmB,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;CACzC,GAAG,EAAE,CAAC,mBAAmB,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;CACzC,GAAG,EAAE,CAAC,mBAAmB,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;;CAEzC,GAAG,IAAI,YAAY,GAAG,iBAAiB,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,iBAAiB,EAAE,CAAC;;CAElH,GAAG,KAAK,YAAY,GAAG;;CAEvB,IAAI,KAAK,EAAE,GAAG;;CAEd,KAAK,GAAG,CAAC,mBAAmB,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;CACtC,KAAK,GAAG,CAAC,mBAAmB,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;CACtC,KAAK,GAAG,CAAC,mBAAmB,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;;CAEtC,KAAK,YAAY,CAAC,EAAE,GAAG,cAAc,EAAE,iBAAiB,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAEtF,KAAK;;CAEL,IAAI,IAAI,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CACpC,IAAI,QAAQ,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAElD,IAAI,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC;CAC7B,IAAI,YAAY,CAAC,SAAS,GAAG,CAAC,CAAC;;CAE/B,IAAI;;CAEJ,GAAG,OAAO,YAAY,CAAC;;CAEvB,GAAG;;CAEH,EAAE,OAAO,SAAS,OAAO,EAAE,SAAS,EAAE,UAAU,GAAG;;CAEnD,GAAG,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;CAChC,GAAG,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;CAChC,GAAG,IAAI,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;;CAEtC,GAAG,KAAK,QAAQ,KAAK,SAAS,GAAG,OAAO;;CAExC;;CAEA,GAAG,KAAK,QAAQ,CAAC,cAAc,KAAK,IAAI,GAAG,QAAQ,CAAC,qBAAqB,EAAE,CAAC;;CAE5E,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,cAAc,EAAE,CAAC;CAC1C,GAAG,MAAM,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC;;CAEtC,GAAG,KAAK,SAAS,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,EAAE,KAAK,KAAK,GAAG,OAAO;;CAEpE;;CAEA,GAAG,aAAa,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC;CAC3C,GAAG,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,CAAC;;CAE3D;;CAEA,GAAG,KAAK,QAAQ,CAAC,WAAW,KAAK,IAAI,GAAG;;CAExC,IAAI,KAAK,GAAG,CAAC,aAAa,EAAE,QAAQ,CAAC,WAAW,EAAE,KAAK,KAAK,GAAG,OAAO;;CAEtE,IAAI;;CAEJ,GAAG,IAAI,YAAY,CAAC;;CAEpB,GAAG,KAAK,QAAQ,CAAC,gBAAgB,GAAG;;CAEpC,IAAI,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;CAChB,IAAI,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;CAC/B,IAAI,IAAI,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;CAChD,IAAI,IAAI,EAAE,GAAG,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;CACpC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;;CAEb,IAAI,KAAK,KAAK,KAAK,IAAI,GAAG;;CAE1B;;CAEA,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;;CAEnD,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;CAC1B,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;CAC9B,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;;CAE9B,MAAM,YAAY,GAAG,+BAA+B,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEpG,MAAM,KAAK,YAAY,GAAG;;CAE1B,OAAO,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;CACpD,OAAO,UAAU,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC;;CAEvC,OAAO;;CAEP,MAAM;;CAEN,KAAK,MAAM,KAAK,QAAQ,KAAK,SAAS,GAAG;;CAEzC;;CAEA,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;;CAEtD,MAAM,CAAC,GAAG,CAAC,CAAC;CACZ,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAChB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;CAEhB,MAAM,YAAY,GAAG,+BAA+B,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEpG,MAAM,KAAK,YAAY,GAAG,UAAU,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC;;CAE1D,MAAM;;CAEN,KAAK;;CAEL,IAAI,MAAM,KAAK,QAAQ,CAAC,UAAU,GAAG;;CAErC,IAAI,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CACtB,IAAI,IAAI,eAAe,GAAG,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;;CAEpD,IAAI,IAAI,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;CACrC,IAAI,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;CAC/B,IAAI,IAAI,GAAG,CAAC;;CAEZ,IAAI,IAAI,aAAa,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC;CACpD,IAAI,KAAK,aAAa,CAAC,MAAM,GAAG,CAAC,GAAG,GAAG,GAAG,aAAa,CAAC;;CAExD,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEvD,KAAK,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;CAC3B,KAAK,IAAI,YAAY,GAAG,eAAe,GAAG,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,GAAG,QAAQ,CAAC;;CAEpF,KAAK,KAAK,YAAY,KAAK,SAAS,GAAG,SAAS;;CAEhD,KAAK,GAAG,GAAG,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CAC9B,KAAK,GAAG,GAAG,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CAC9B,KAAK,GAAG,GAAG,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;;CAE9B,KAAK,KAAK,YAAY,CAAC,YAAY,KAAK,IAAI,GAAG;;CAE/C,MAAM,IAAI,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;CAC/C,MAAM,IAAI,eAAe,GAAG,IAAI,CAAC,qBAAqB,CAAC;;CAEvD,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CACxB,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CACxB,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAExB,MAAM,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEhE,OAAO,IAAI,SAAS,GAAG,eAAe,EAAE,CAAC,EAAE,CAAC;;CAE5C,OAAO,KAAK,SAAS,KAAK,CAAC,GAAG,SAAS;;CAEvC,OAAO,IAAI,OAAO,GAAG,YAAY,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC;;CAEhD,OAAO,EAAE,CAAC,eAAe,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,CAAC;CACnF,OAAO,EAAE,CAAC,eAAe,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,CAAC;CACnF,OAAO,EAAE,CAAC,eAAe,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,CAAC;;CAEnF,OAAO;;CAEP,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;CACpB,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;CACpB,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;;CAEpB,MAAM,GAAG,GAAG,EAAE,CAAC;CACf,MAAM,GAAG,GAAG,EAAE,CAAC;CACf,MAAM,GAAG,GAAG,EAAE,CAAC;;CAEf,MAAM;;CAEN,KAAK,YAAY,GAAG,iBAAiB,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,iBAAiB,EAAE,CAAC;;CAE9G,KAAK,KAAK,YAAY,GAAG;;CAEzB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC,EAAE,GAAG;;CAE7B,OAAO,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC;CAC5B,OAAO,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;CAC9B,OAAO,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;CAC9B,OAAO,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE9B,OAAO,YAAY,CAAC,EAAE,GAAG,cAAc,EAAE,iBAAiB,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAE3F,OAAO;;CAEP,MAAM,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC;CAC/B,MAAM,YAAY,CAAC,SAAS,GAAG,CAAC,CAAC;CACjC,MAAM,UAAU,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC;;CAEtC,MAAM;;CAEN,KAAK;;CAEL,IAAI;;CAEJ,GAAG,CAAC;;CAEJ,EAAE,EAAE,EAAE;;CAEN,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE3E,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,eAAe,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,kBAAkB,GAAG;;CAE5E,CAAC,IAAI,UAAU,GAAG,IAAI,KAAK,EAAE,QAAQ,EAAE,CAAC;CACxC,CAAC,IAAI,UAAU,GAAG,CAAC,CAAC;;CAEpB,CAAC,IAAI,WAAW,EAAE,SAAS,CAAC;CAC5B,CAAC,IAAI,OAAO,CAAC;;CAEb,CAAC,SAAS,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,GAAG;;CAE1D,EAAE,IAAI,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;;CAEpC,EAAE,KAAK,UAAU,KAAK,IAAI,GAAG;;CAE7B,GAAG,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;;CAEtC,GAAG,MAAM,KAAK,UAAU,IAAI,UAAU,CAAC,OAAO,GAAG;;CAEjD,GAAG,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;CAC7B,GAAG,UAAU,GAAG,IAAI,CAAC;;CAErB,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,SAAS,IAAI,UAAU,GAAG;;CAE1C,GAAG,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,gBAAgB,EAAE,CAAC;;CAEjG,GAAG;;CAEH,EAAE,KAAK,UAAU,IAAI,UAAU,CAAC,aAAa,GAAG;;CAEhD,GAAG,KAAK,OAAO,KAAK,SAAS,GAAG;;CAEhC,IAAI,OAAO,GAAG,IAAI,IAAI;CACtB,KAAK,IAAI,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;CACrC,KAAK,IAAI,cAAc,EAAE;CACzB,MAAM,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,QAAQ;CACvC,MAAM,YAAY,EAAE,SAAS,CAAC,IAAI,CAAC,YAAY;CAC/C,MAAM,cAAc,EAAE,SAAS,CAAC,IAAI,CAAC,cAAc;CACnD,MAAM,IAAI,EAAE,QAAQ;CACpB,MAAM,SAAS,EAAE,IAAI;CACrB,MAAM,UAAU,EAAE,KAAK;CACvB,MAAM,GAAG,EAAE,KAAK;CAChB,MAAM,EAAE;CACR,KAAK,CAAC;;CAEN,IAAI,OAAO,CAAC,QAAQ,CAAC,eAAe,EAAE,QAAQ,EAAE,CAAC;CACjD,IAAI,OAAO,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;;CAE7C,IAAI,OAAO,CAAC,cAAc,GAAG,WAAW,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG;;CAElE,KAAK,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;;CAEzD,KAAK,CAAC;;CAEN,IAAI,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;;CAE1C,IAAI;;CAEJ,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC;;CAEtD,GAAG,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;;CAE3E,GAAG,MAAM,KAAK,UAAU,IAAI,UAAU,CAAC,SAAS,GAAG;;CAEnD,GAAG,KAAK,WAAW,KAAK,SAAS,GAAG;;CAEpC,IAAI,WAAW,GAAG,IAAI,kBAAkB,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEjE,IAAI,SAAS,GAAG,IAAI,IAAI;CACxB,KAAK,IAAI,mBAAmB,EAAE,CAAC,EAAE,CAAC,EAAE;CACpC,KAAK,IAAI,iBAAiB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;CACjF,KAAK,CAAC;;CAEN,IAAI,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC;;CAE5C,IAAI;;CAEJ,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,GAAG,UAAU,CAAC;;CAEvC;;CAEA,GAAG,QAAQ,CAAC,kBAAkB,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;;CAE7G,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAG;;CAEnC,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;;CAEvF,EAAE;;CAEF,CAAC,OAAO;;CAER,EAAE,aAAa,EAAE,YAAY;;CAE7B,GAAG,OAAO,UAAU,CAAC;;CAErB,GAAG;CACH,EAAE,aAAa,EAAE,WAAW,KAAK,EAAE,KAAK,GAAG;;CAE3C,GAAG,UAAU,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;CAC3B,GAAG,UAAU,GAAG,KAAK,KAAK,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;CAChD,GAAG,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;;CAEtC,GAAG;CACH,EAAE,aAAa,EAAE,YAAY;;CAE7B,GAAG,OAAO,UAAU,CAAC;;CAErB,GAAG;CACH,EAAE,aAAa,EAAE,WAAW,KAAK,GAAG;;CAEpC,GAAG,UAAU,GAAG,KAAK,CAAC;CACtB,GAAG,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;;CAEtC,GAAG;CACH,EAAE,MAAM,EAAE,MAAM;;CAEhB,EAAE,CAAC;;CAEH,CAAC;;CAED;CACA;CACA;;CAEA,SAAS,mBAAmB,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,GAAG;;CAErD,CAAC,IAAI,IAAI,CAAC;;CAEV,CAAC,SAAS,OAAO,EAAE,KAAK,GAAG;;CAE3B,EAAE,IAAI,GAAG,KAAK,CAAC;;CAEf,EAAE;;CAEF,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG;;CAEjC,EAAE,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;;CAEtC,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;;CAE7B,EAAE;;CAEF,CAAC,SAAS,eAAe,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAG;;CAEpD,EAAE,IAAI,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,wBAAwB,EAAE,CAAC;;CAE7D,EAAE,KAAK,SAAS,KAAK,IAAI,GAAG;;CAE5B,GAAG,OAAO,CAAC,KAAK,EAAE,gIAAgI,EAAE,CAAC;CACrJ,GAAG,OAAO;;CAEV,GAAG;;CAEH,EAAE,IAAI,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;;CAE9C,EAAE,KAAK,QAAQ,CAAC,4BAA4B,GAAG;;CAE/C,GAAG,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;;CAE/B,GAAG,SAAS,CAAC,wBAAwB,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,iBAAiB,EAAE,CAAC;;CAEpF,GAAG,MAAM;;CAET,GAAG,SAAS,CAAC,wBAAwB,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,iBAAiB,EAAE,CAAC;;CAExF,GAAG;;CAEH,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,iBAAiB,EAAE,CAAC;;CAEzD,EAAE;;CAEF;;CAEA,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;CACxB,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;CACtB,CAAC,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;;CAExC,CAAC;;CAED;CACA;CACA;;CAEA,SAAS,iBAAiB,EAAE,EAAE,EAAE,UAAU,EAAE,UAAU,GAAG;;CAEzD,CAAC,IAAI,aAAa,CAAC;;CAEnB,CAAC,SAAS,gBAAgB,GAAG;;CAE7B,EAAE,KAAK,aAAa,KAAK,SAAS,GAAG,OAAO,aAAa,CAAC;;CAE1D,EAAE,IAAI,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,gCAAgC,EAAE,CAAC;;CAErE,EAAE,KAAK,SAAS,KAAK,IAAI,GAAG;;CAE5B,GAAG,aAAa,GAAG,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC,8BAA8B,EAAE,CAAC;;CAE/E,GAAG,MAAM;;CAET,GAAG,aAAa,GAAG,CAAC,CAAC;;CAErB,GAAG;;CAEH,EAAE,OAAO,aAAa,CAAC;;CAEvB,EAAE;;CAEF,CAAC,SAAS,eAAe,EAAE,SAAS,GAAG;;CAEvC,EAAE,KAAK,SAAS,KAAK,OAAO,GAAG;;CAE/B,GAAG,KAAK,EAAE,CAAC,wBAAwB,EAAE,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC,UAAU,EAAE,CAAC,SAAS,GAAG,CAAC;CACpF,QAAQ,EAAE,CAAC,wBAAwB,EAAE,EAAE,CAAC,eAAe,EAAE,EAAE,CAAC,UAAU,EAAE,CAAC,SAAS,GAAG,CAAC,GAAG;;CAEzF,IAAI,OAAO,OAAO,CAAC;;CAEnB,IAAI;;CAEJ,GAAG,SAAS,GAAG,SAAS,CAAC;;CAEzB,GAAG;;CAEH,EAAE,KAAK,SAAS,KAAK,SAAS,GAAG;;CAEjC,GAAG,KAAK,EAAE,CAAC,wBAAwB,EAAE,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,SAAS,GAAG,CAAC;CACtF,QAAQ,EAAE,CAAC,wBAAwB,EAAE,EAAE,CAAC,eAAe,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,SAAS,GAAG,CAAC,GAAG;;CAE3F,IAAI,OAAO,SAAS,CAAC;;CAErB,IAAI;;CAEJ,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC;;CAEhB,EAAE;;CAEF,CAAC,IAAI,SAAS,GAAG,UAAU,CAAC,SAAS,KAAK,SAAS,GAAG,UAAU,CAAC,SAAS,GAAG,OAAO,CAAC;CACrF,CAAC,IAAI,YAAY,GAAG,eAAe,EAAE,SAAS,EAAE,CAAC;;CAEjD,CAAC,KAAK,YAAY,KAAK,SAAS,GAAG;;CAEnC,EAAE,OAAO,CAAC,IAAI,EAAE,sBAAsB,EAAE,SAAS,EAAE,sBAAsB,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;CACtG,EAAE,SAAS,GAAG,YAAY,CAAC;;CAE3B,EAAE;;CAEF,CAAC,IAAI,sBAAsB,GAAG,UAAU,CAAC,sBAAsB,KAAK,IAAI,CAAC;;CAEzE,CAAC,IAAI,WAAW,GAAG,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,uBAAuB,EAAE,CAAC;CACjE,CAAC,IAAI,iBAAiB,GAAG,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,8BAA8B,EAAE,CAAC;CAC9E,CAAC,IAAI,cAAc,GAAG,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,gBAAgB,EAAE,CAAC;CAC7D,CAAC,IAAI,cAAc,GAAG,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,yBAAyB,EAAE,CAAC;;CAEtE,CAAC,IAAI,aAAa,GAAG,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,kBAAkB,EAAE,CAAC;CAC9D,CAAC,IAAI,iBAAiB,GAAG,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,0BAA0B,EAAE,CAAC;CAC1E,CAAC,IAAI,WAAW,GAAG,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,mBAAmB,EAAE,CAAC;CAC7D,CAAC,IAAI,mBAAmB,GAAG,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,4BAA4B,EAAE,CAAC;;CAE9E,CAAC,IAAI,cAAc,GAAG,iBAAiB,GAAG,CAAC,CAAC;CAC5C,CAAC,IAAI,qBAAqB,GAAG,CAAC,EAAE,UAAU,CAAC,GAAG,EAAE,mBAAmB,EAAE,CAAC;CACtE,CAAC,IAAI,mBAAmB,GAAG,cAAc,IAAI,qBAAqB,CAAC;;CAEnE,CAAC,OAAO;;CAER,EAAE,gBAAgB,EAAE,gBAAgB;CACpC,EAAE,eAAe,EAAE,eAAe;;CAElC,EAAE,SAAS,EAAE,SAAS;CACtB,EAAE,sBAAsB,EAAE,sBAAsB;;CAEhD,EAAE,WAAW,EAAE,WAAW;CAC1B,EAAE,iBAAiB,EAAE,iBAAiB;CACtC,EAAE,cAAc,EAAE,cAAc;CAChC,EAAE,cAAc,EAAE,cAAc;;CAEhC,EAAE,aAAa,EAAE,aAAa;CAC9B,EAAE,iBAAiB,EAAE,iBAAiB;CACtC,EAAE,WAAW,EAAE,WAAW;CAC1B,EAAE,mBAAmB,EAAE,mBAAmB;;CAE1C,EAAE,cAAc,EAAE,cAAc;CAChC,EAAE,qBAAqB,EAAE,qBAAqB;CAC9C,EAAE,mBAAmB,EAAE,mBAAmB;;CAE1C,EAAE,CAAC;;CAEH,CAAC;;CAED;CACA;CACA;;CAEA,SAAS,aAAa,GAAG;;CAEzB,CAAC,IAAI,KAAK,GAAG,IAAI;;CAEjB,EAAE,WAAW,GAAG,IAAI;CACpB,EAAE,eAAe,GAAG,CAAC;CACrB,EAAE,oBAAoB,GAAG,KAAK;CAC9B,EAAE,gBAAgB,GAAG,KAAK;;CAE1B,EAAE,KAAK,GAAG,IAAI,KAAK,EAAE;CACrB,EAAE,gBAAgB,GAAG,IAAI,OAAO,EAAE;;CAElC,EAAE,OAAO,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;;CAEhD,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;CACxB,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;CACpB,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;;CAE1B,CAAC,IAAI,CAAC,IAAI,GAAG,WAAW,MAAM,EAAE,mBAAmB,EAAE,MAAM,GAAG;;CAE9D,EAAE,IAAI,OAAO;CACb,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC;CACtB,GAAG,mBAAmB;CACtB;CACA;CACA,GAAG,eAAe,KAAK,CAAC;CACxB,GAAG,oBAAoB,CAAC;;CAExB,EAAE,oBAAoB,GAAG,mBAAmB,CAAC;;CAE7C,EAAE,WAAW,GAAG,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;CACnD,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC;;CAElC,EAAE,OAAO,OAAO,CAAC;;CAEjB,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,YAAY,GAAG,YAAY;;CAEjC,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC1B,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;;CAExB,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,UAAU,GAAG,YAAY;;CAE/B,EAAE,gBAAgB,GAAG,KAAK,CAAC;CAC3B,EAAE,gBAAgB,EAAE,CAAC;;CAErB,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,QAAQ,GAAG,WAAW,MAAM,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG;;CAE9F,EAAE,KAAK,EAAE,oBAAoB,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,gBAAgB,IAAI,EAAE,WAAW,GAAG;;CAE/G;;CAEA,GAAG,KAAK,gBAAgB,GAAG;;CAE3B;;CAEA,IAAI,aAAa,EAAE,IAAI,EAAE,CAAC;;CAE1B,IAAI,MAAM;;CAEV,IAAI,gBAAgB,EAAE,CAAC;;CAEvB,IAAI;;CAEJ,GAAG,MAAM;;CAET,GAAG,IAAI,OAAO,GAAG,gBAAgB,GAAG,CAAC,GAAG,eAAe;CACvD,IAAI,OAAO,GAAG,OAAO,GAAG,CAAC;;CAEzB,IAAI,QAAQ,GAAG,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC;;CAE3C,GAAG,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC;;CAE5B,GAAG,QAAQ,GAAG,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;;CAElE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,OAAO,EAAE,GAAG,CAAC,GAAG;;CAE1C,IAAI,QAAQ,EAAE,CAAC,EAAE,GAAG,WAAW,EAAE,CAAC,EAAE,CAAC;;CAErC,IAAI;;CAEJ,GAAG,KAAK,CAAC,aAAa,GAAG,QAAQ,CAAC;CAClC,GAAG,IAAI,CAAC,eAAe,GAAG,gBAAgB,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;CAChE,GAAG,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC;;CAE7B,GAAG;;;CAGH,EAAE,CAAC;;CAEH,CAAC,SAAS,gBAAgB,GAAG;;CAE7B,EAAE,KAAK,OAAO,CAAC,KAAK,KAAK,WAAW,GAAG;;CAEvC,GAAG,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC;CAC/B,GAAG,OAAO,CAAC,WAAW,GAAG,eAAe,GAAG,CAAC,CAAC;;CAE7C,GAAG;;CAEH,EAAE,KAAK,CAAC,SAAS,GAAG,eAAe,CAAC;CACpC,EAAE,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC;;CAE5B,EAAE;;CAEF,CAAC,SAAS,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,GAAG;;CAEpE,EAAE,IAAI,OAAO,GAAG,MAAM,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC;CACnD,GAAG,QAAQ,GAAG,IAAI,CAAC;;CAEnB,EAAE,KAAK,OAAO,KAAK,CAAC,GAAG;;CAEvB,GAAG,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC;;CAE5B,GAAG,KAAK,aAAa,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,GAAG;;CAEtD,IAAI,IAAI,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,CAAC;CAC1C,KAAK,UAAU,GAAG,MAAM,CAAC,kBAAkB,CAAC;;CAE5C,IAAI,gBAAgB,CAAC,eAAe,EAAE,UAAU,EAAE,CAAC;;CAEnD,IAAI,KAAK,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,MAAM,GAAG,QAAQ,GAAG;;CAE3D,KAAK,QAAQ,GAAG,IAAI,YAAY,EAAE,QAAQ,EAAE,CAAC;;CAE7C,KAAK;;CAEL,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,EAAE,CAAC,KAAK,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG;;CAEpE,KAAK,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC;;CAE5E,KAAK,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;CAC1C,KAAK,QAAQ,EAAE,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC;;CAEzC,KAAK;;CAEL,IAAI;;CAEJ,GAAG,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC;CAC5B,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;;CAE9B,GAAG;;CAEH,EAAE,KAAK,CAAC,SAAS,GAAG,OAAO,CAAC;;CAE5B,EAAE,OAAO,QAAQ,CAAC;;CAElB,EAAE;;CAEF,CAAC;;CAED;CACA;CACA;;CAEA,SAAS,eAAe,EAAE,EAAE,GAAG;;CAE/B,CAAC,IAAI,UAAU,GAAG,EAAE,CAAC;;CAErB,CAAC,OAAO;;CAER,EAAE,GAAG,EAAE,WAAW,IAAI,GAAG;;CAEzB,GAAG,KAAK,UAAU,EAAE,IAAI,EAAE,KAAK,SAAS,GAAG;;CAE3C,IAAI,OAAO,UAAU,EAAE,IAAI,EAAE,CAAC;;CAE9B,IAAI;;CAEJ,GAAG,IAAI,SAAS,CAAC;;CAEjB,GAAG,SAAS,IAAI;;CAEhB,IAAI,KAAK,qBAAqB;CAC9B,KAAK,SAAS,GAAG,EAAE,CAAC,YAAY,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC,YAAY,EAAE,yBAAyB,EAAE,IAAI,EAAE,CAAC,YAAY,EAAE,4BAA4B,EAAE,CAAC;CAC7J,KAAK,MAAM;;CAEX,IAAI,KAAK,gCAAgC;CACzC,KAAK,SAAS,GAAG,EAAE,CAAC,YAAY,EAAE,gCAAgC,EAAE,IAAI,EAAE,CAAC,YAAY,EAAE,oCAAoC,EAAE,IAAI,EAAE,CAAC,YAAY,EAAE,uCAAuC,EAAE,CAAC;CAC9L,KAAK,MAAM;;CAEX,IAAI,KAAK,+BAA+B;CACxC,KAAK,SAAS,GAAG,EAAE,CAAC,YAAY,EAAE,+BAA+B,EAAE,IAAI,EAAE,CAAC,YAAY,EAAE,mCAAmC,EAAE,IAAI,EAAE,CAAC,YAAY,EAAE,sCAAsC,EAAE,CAAC;CAC3L,KAAK,MAAM;;CAEX,IAAI,KAAK,gCAAgC;CACzC,KAAK,SAAS,GAAG,EAAE,CAAC,YAAY,EAAE,gCAAgC,EAAE,IAAI,EAAE,CAAC,YAAY,EAAE,uCAAuC,EAAE,CAAC;CACnI,KAAK,MAAM;;CAEX,IAAI;CACJ,KAAK,SAAS,GAAG,EAAE,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;;CAEzC,IAAI;;CAEJ,GAAG,KAAK,SAAS,KAAK,IAAI,GAAG;;CAE7B,IAAI,OAAO,CAAC,IAAI,EAAE,uBAAuB,GAAG,IAAI,GAAG,2BAA2B,EAAE,CAAC;;CAEjF,IAAI;;CAEJ,GAAG,UAAU,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC;;CAElC,GAAG,OAAO,SAAS,CAAC;;CAEpB,GAAG;;CAEH,EAAE,CAAC;;CAEH,CAAC;;CAED;CACA;CACA;;CAEA,SAAS,eAAe,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,GAAG;;CAEjD,CAAC,IAAI,UAAU,GAAG,EAAE,CAAC;CACrB,CAAC,IAAI,mBAAmB,GAAG,EAAE,CAAC;;CAE9B,CAAC,SAAS,iBAAiB,EAAE,KAAK,GAAG;;CAErC,EAAE,IAAI,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC;CAC9B,EAAE,IAAI,cAAc,GAAG,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC;;CAEjD,EAAE,KAAK,cAAc,CAAC,KAAK,KAAK,IAAI,GAAG;;CAEvC,GAAG,UAAU,CAAC,MAAM,EAAE,cAAc,CAAC,KAAK,EAAE,CAAC;;CAE7C,GAAG;;CAEH,EAAE,MAAM,IAAI,IAAI,IAAI,cAAc,CAAC,UAAU,GAAG;;CAEhD,GAAG,UAAU,CAAC,MAAM,EAAE,cAAc,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC;;CAE1D,GAAG;;CAEH,EAAE,QAAQ,CAAC,mBAAmB,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;;CAE/D,EAAE,OAAO,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC;;CAEnC;;CAEA,EAAE,IAAI,SAAS,GAAG,mBAAmB,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC;;CAErD,EAAE,KAAK,SAAS,GAAG;;CAEnB,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;CAClC,GAAG,OAAO,mBAAmB,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC;;CAE7C,GAAG;;CAEH,EAAE,SAAS,GAAG,mBAAmB,EAAE,cAAc,CAAC,EAAE,EAAE,CAAC;;CAEvD,EAAE,KAAK,SAAS,GAAG;;CAEnB,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;CAClC,GAAG,OAAO,mBAAmB,EAAE,cAAc,CAAC,EAAE,EAAE,CAAC;;CAEnD,GAAG;;CAEH;;CAEA,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC;;CAE5B,EAAE;;CAEF,CAAC,SAAS,GAAG,EAAE,MAAM,EAAE,QAAQ,GAAG;;CAElC,EAAE,IAAI,cAAc,GAAG,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC;;CAEjD,EAAE,KAAK,cAAc,GAAG,OAAO,cAAc,CAAC;;CAE9C,EAAE,QAAQ,CAAC,gBAAgB,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;;CAE5D,EAAE,KAAK,QAAQ,CAAC,gBAAgB,GAAG;;CAEnC,GAAG,cAAc,GAAG,QAAQ,CAAC;;CAE7B,GAAG,MAAM,KAAK,QAAQ,CAAC,UAAU,GAAG;;CAEpC,GAAG,KAAK,QAAQ,CAAC,eAAe,KAAK,SAAS,GAAG;;CAEjD,IAAI,QAAQ,CAAC,eAAe,GAAG,IAAI,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC;;CAE5E,IAAI;;CAEJ,GAAG,cAAc,GAAG,QAAQ,CAAC,eAAe,CAAC;;CAE7C,GAAG;;CAEH,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,GAAG,cAAc,CAAC;;CAE7C,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC;;CAE5B,EAAE,OAAO,cAAc,CAAC;;CAExB,EAAE;;CAEF,CAAC,SAAS,MAAM,EAAE,QAAQ,GAAG;;CAE7B,EAAE,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;CAC7B,EAAE,IAAI,kBAAkB,GAAG,QAAQ,CAAC,UAAU,CAAC;;CAE/C,EAAE,KAAK,KAAK,KAAK,IAAI,GAAG;;CAExB,GAAG,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,oBAAoB,EAAE,CAAC;;CAEvD,GAAG;;CAEH,EAAE,MAAM,IAAI,IAAI,IAAI,kBAAkB,GAAG;;CAEzC,GAAG,UAAU,CAAC,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC;;CAEpE,GAAG;;CAEH;;CAEA,EAAE,IAAI,eAAe,GAAG,QAAQ,CAAC,eAAe,CAAC;;CAEjD,EAAE,MAAM,IAAI,IAAI,IAAI,eAAe,GAAG;;CAEtC,GAAG,IAAI,KAAK,GAAG,eAAe,EAAE,IAAI,EAAE,CAAC;;CAEvC,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEpD,IAAI,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC;;CAErD,IAAI;;CAEJ,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,qBAAqB,EAAE,QAAQ,GAAG;;CAE5C,EAAE,IAAI,SAAS,GAAG,mBAAmB,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC;;CAErD,EAAE,KAAK,SAAS,GAAG,OAAO,SAAS,CAAC;;CAEpC,EAAE,IAAI,OAAO,GAAG,EAAE,CAAC;;CAEnB,EAAE,IAAI,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC;CACrC,EAAE,IAAI,kBAAkB,GAAG,QAAQ,CAAC,UAAU,CAAC;;CAE/C;;CAEA,EAAE,KAAK,aAAa,KAAK,IAAI,GAAG;;CAEhC,GAAG,IAAI,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC;;CAEnC,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;;CAEtD,IAAI,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;CAC3B,IAAI,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;CAC3B,IAAI,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;;CAE3B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAErC,IAAI;;CAEJ,GAAG,MAAM;;CAET,GAAG,IAAI,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC;;CAEjD,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;;CAElE,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAClB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAClB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;CAElB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAErC,IAAI;;CAEJ,GAAG;;CAEH;;CAEA,EAAE,SAAS,GAAG,MAAM,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,GAAG,qBAAqB,GAAG,qBAAqB,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC;;CAEhH,EAAE,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,oBAAoB,EAAE,CAAC;;CAE1D,EAAE,mBAAmB,EAAE,QAAQ,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC;;CAEjD,EAAE,OAAO,SAAS,CAAC;;CAEnB,EAAE;;CAEF,CAAC,OAAO;;CAER,EAAE,GAAG,EAAE,GAAG;CACV,EAAE,MAAM,EAAE,MAAM;;CAEhB,EAAE,qBAAqB,EAAE,qBAAqB;;CAE9C,EAAE,CAAC;;CAEH,CAAC;;CAED;CACA;CACA;;CAEA,SAAS,0BAA0B,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,GAAG;;CAE5D,CAAC,IAAI,IAAI,CAAC;;CAEV,CAAC,SAAS,OAAO,EAAE,KAAK,GAAG;;CAE3B,EAAE,IAAI,GAAG,KAAK,CAAC;;CAEf,EAAE;;CAEF,CAAC,IAAI,IAAI,EAAE,eAAe,CAAC;;CAE3B,CAAC,SAAS,QAAQ,EAAE,KAAK,GAAG;;CAE5B,EAAE,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;CACpB,EAAE,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC;;CAE1C,EAAE;;CAEF,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG;;CAEjC,EAAE,EAAE,CAAC,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,GAAG,eAAe,EAAE,CAAC;;CAEhE,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;;CAE7B,EAAE;;CAEF,CAAC,SAAS,eAAe,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAG;;CAEpD,EAAE,IAAI,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,wBAAwB,EAAE,CAAC;;CAE7D,EAAE,KAAK,SAAS,KAAK,IAAI,GAAG;;CAE5B,GAAG,OAAO,CAAC,KAAK,EAAE,uIAAuI,EAAE,CAAC;CAC5J,GAAG,OAAO;;CAEV,GAAG;;CAEH,EAAE,SAAS,CAAC,0BAA0B,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,GAAG,eAAe,EAAE,QAAQ,CAAC,iBAAiB,EAAE,CAAC;;CAEjH,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,iBAAiB,EAAE,CAAC;;CAEzD,EAAE;;CAEF;;CAEA,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;CACxB,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;CAC1B,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;CACtB,CAAC,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;;CAExC,CAAC;;CAED;CACA;CACA;;CAEA,SAAS,SAAS,EAAE,EAAE,GAAG;;CAEzB,CAAC,IAAI,MAAM,GAAG;CACd,EAAE,UAAU,EAAE,CAAC;CACf,EAAE,QAAQ,EAAE,CAAC;CACb,EAAE,CAAC;;CAEH,CAAC,IAAI,MAAM,GAAG;CACd,EAAE,KAAK,EAAE,CAAC;CACV,EAAE,KAAK,EAAE,CAAC;CACV,EAAE,SAAS,EAAE,CAAC;CACd,EAAE,MAAM,EAAE,CAAC;CACX,EAAE,KAAK,EAAE,CAAC;CACV,EAAE,CAAC;;CAEH,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,GAAG;;CAE/C,EAAE,aAAa,GAAG,aAAa,IAAI,CAAC,CAAC;;CAErC,EAAE,MAAM,CAAC,KAAK,GAAG,CAAC;;CAElB,EAAE,SAAS,IAAI;;CAEf,GAAG,KAAK,EAAE,CAAC,SAAS;CACpB,IAAI,MAAM,CAAC,SAAS,IAAI,aAAa,KAAK,KAAK,GAAG,CAAC,EAAE,CAAC;CACtD,IAAI,MAAM;;CAEV,GAAG,KAAK,EAAE,CAAC,cAAc,CAAC;CAC1B,GAAG,KAAK,EAAE,CAAC,YAAY;CACvB,IAAI,MAAM,CAAC,SAAS,IAAI,aAAa,KAAK,KAAK,GAAG,CAAC,EAAE,CAAC;CACtD,IAAI,MAAM;;CAEV,GAAG,KAAK,EAAE,CAAC,KAAK;CAChB,IAAI,MAAM,CAAC,KAAK,IAAI,aAAa,KAAK,KAAK,GAAG,CAAC,EAAE,CAAC;CAClD,IAAI,MAAM;;CAEV,GAAG,KAAK,EAAE,CAAC,UAAU;CACrB,IAAI,MAAM,CAAC,KAAK,IAAI,aAAa,KAAK,KAAK,GAAG,CAAC,EAAE,CAAC;CAClD,IAAI,MAAM;;CAEV,GAAG,KAAK,EAAE,CAAC,SAAS;CACpB,IAAI,MAAM,CAAC,KAAK,IAAI,aAAa,GAAG,KAAK,CAAC;CAC1C,IAAI,MAAM;;CAEV,GAAG,KAAK,EAAE,CAAC,MAAM;CACjB,IAAI,MAAM,CAAC,MAAM,IAAI,aAAa,GAAG,KAAK,CAAC;CAC3C,IAAI,MAAM;;CAEV,GAAG;CACH,IAAI,OAAO,CAAC,KAAK,EAAE,qCAAqC,EAAE,IAAI,EAAE,CAAC;CACjE,IAAI,MAAM;;CAEV,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,KAAK,GAAG;;CAElB,EAAE,MAAM,CAAC,KAAK,GAAG,CAAC;CAClB,EAAE,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;CACnB,EAAE,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;CACvB,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;CACpB,EAAE,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;;CAEnB,EAAE;;CAEF,CAAC,OAAO;CACR,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,QAAQ,EAAE,IAAI;CAChB,EAAE,SAAS,EAAE,IAAI;CACjB,EAAE,KAAK,EAAE,KAAK;CACd,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,CAAC;;CAEH,CAAC;;CAED;CACA;CACA;;CAEA,SAAS,gBAAgB,EAAE,CAAC,EAAE,CAAC,GAAG;;CAElC,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEhD,CAAC;;CAED,SAAS,iBAAiB,EAAE,EAAE,GAAG;;CAEjC,CAAC,IAAI,cAAc,GAAG,EAAE,CAAC;CACzB,CAAC,IAAI,eAAe,GAAG,IAAI,YAAY,EAAE,CAAC,EAAE,CAAC;;CAE7C,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,GAAG;;CAExD,EAAE,IAAI,gBAAgB,GAAG,MAAM,CAAC,qBAAqB,CAAC;;CAEtD,EAAE,IAAI,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC;;CAEvC,EAAE,IAAI,UAAU,GAAG,cAAc,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC;;CAEjD,EAAE,KAAK,UAAU,KAAK,SAAS,GAAG;;CAElC;;CAEA,GAAG,UAAU,GAAG,EAAE,CAAC;;CAEnB,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,GAAG;;CAEvC,IAAI,UAAU,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE/B,IAAI;;CAEJ,GAAG,cAAc,EAAE,QAAQ,CAAC,EAAE,EAAE,GAAG,UAAU,CAAC;;CAE9C,GAAG;;CAEH,EAAE,IAAI,YAAY,GAAG,QAAQ,CAAC,YAAY,IAAI,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC;CAChF,EAAE,IAAI,YAAY,GAAG,QAAQ,CAAC,YAAY,IAAI,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC;;CAE9E;;CAEA,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,GAAG;;CAEtC,GAAG,IAAI,SAAS,GAAG,UAAU,EAAE,CAAC,EAAE,CAAC;;CAEnC,GAAG,KAAK,SAAS,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG;;CAE/B,IAAI,KAAK,YAAY,GAAG,QAAQ,CAAC,eAAe,EAAE,aAAa,GAAG,CAAC,EAAE,CAAC;CACtE,IAAI,KAAK,YAAY,GAAG,QAAQ,CAAC,eAAe,EAAE,aAAa,GAAG,CAAC,EAAE,CAAC;;CAEtE,IAAI;;CAEJ,GAAG;;CAEH;;CAEA,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,GAAG;;CAEtC,GAAG,IAAI,SAAS,GAAG,UAAU,EAAE,CAAC,EAAE,CAAC;;CAEnC,GAAG,SAAS,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;CACtB,GAAG,SAAS,EAAE,CAAC,EAAE,GAAG,gBAAgB,EAAE,CAAC,EAAE,CAAC;;CAE1C,GAAG;;CAEH,EAAE,UAAU,CAAC,IAAI,EAAE,gBAAgB,EAAE,CAAC;;CAEtC;;CAEA,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEjC,GAAG,IAAI,SAAS,GAAG,UAAU,EAAE,CAAC,EAAE,CAAC;;CAEnC,GAAG,KAAK,SAAS,GAAG;;CAEpB,IAAI,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC,EAAE,CAAC;CAC/B,IAAI,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC,EAAE,CAAC;;CAE/B,IAAI,KAAK,KAAK,GAAG;;CAEjB,KAAK,KAAK,YAAY,GAAG,QAAQ,CAAC,YAAY,EAAE,aAAa,GAAG,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,CAAC;CAC3F,KAAK,KAAK,YAAY,GAAG,QAAQ,CAAC,YAAY,EAAE,aAAa,GAAG,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,CAAC;;CAE3F,KAAK,eAAe,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC;CAClC,KAAK,SAAS;;CAEd,KAAK;;CAEL,IAAI;;CAEJ,GAAG,eAAe,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;;CAE5B,GAAG;;CAEH,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,uBAAuB,EAAE,eAAe,EAAE,CAAC;;CAEjF,EAAE;;CAEF,CAAC,OAAO;;CAER,EAAE,MAAM,EAAE,MAAM;;CAEhB,EAAE,CAAC;;CAEH,CAAC;;CAED;CACA;CACA;;CAEA,SAAS,YAAY,EAAE,UAAU,EAAE,IAAI,GAAG;;CAE1C,CAAC,IAAI,UAAU,GAAG,EAAE,CAAC;;CAErB,CAAC,SAAS,MAAM,EAAE,MAAM,GAAG;;CAE3B,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;;CAEhC,EAAE,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;CACjC,EAAE,IAAI,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;;CAE1D;;CAEA,EAAE,KAAK,UAAU,EAAE,cAAc,CAAC,EAAE,EAAE,KAAK,KAAK,GAAG;;CAEnD,GAAG,KAAK,QAAQ,CAAC,UAAU,GAAG;;CAE9B,IAAI,cAAc,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAC;;CAE9C,IAAI;;CAEJ,GAAG,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;;CAEvC,GAAG,UAAU,EAAE,cAAc,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC;;CAE3C,GAAG;;CAEH,EAAE,OAAO,cAAc,CAAC;;CAExB,EAAE;;CAEF,CAAC,SAAS,OAAO,GAAG;;CAEpB,EAAE,UAAU,GAAG,EAAE,CAAC;;CAElB,EAAE;;CAEF,CAAC,OAAO;;CAER,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,OAAO,EAAE,OAAO;;CAElB,EAAE,CAAC;;CAEH,CAAC;;CAED;CACA;CACA;;CAEA,SAAS,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,GAAG;;CAEhH,CAAC,MAAM,GAAG,MAAM,KAAK,SAAS,GAAG,MAAM,GAAG,EAAE,CAAC;CAC7C,CAAC,OAAO,GAAG,OAAO,KAAK,SAAS,GAAG,OAAO,GAAG,qBAAqB,CAAC;;CAEnE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;;CAE/G,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;;CAEpB,CAAC;;CAED,WAAW,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;CAC3D,WAAW,CAAC,SAAS,CAAC,WAAW,GAAG,WAAW,CAAC;;CAEhD,WAAW,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC;;CAE3C,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,SAAS,EAAE,QAAQ,EAAE;;CAExD,CAAC,GAAG,EAAE,YAAY;;CAElB,EAAE,OAAO,IAAI,CAAC,KAAK,CAAC;;CAEpB,EAAE;;CAEF,CAAC,GAAG,EAAE,WAAW,KAAK,GAAG;;CAEzB,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;;CAErB,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,IAAI,YAAY,GAAG,IAAI,OAAO,EAAE,CAAC;CACjC,IAAI,gBAAgB,GAAG,IAAI,WAAW,EAAE,CAAC;;CAEzC;;CAEA,SAAS,gBAAgB,GAAG;;CAE5B,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;CACf,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;;CAEf,CAAC;;CAED;;CAEA;;CAEA,IAAI,aAAa,GAAG,EAAE,CAAC;CACvB,IAAI,aAAa,GAAG,EAAE,CAAC;;CAEvB;;CAEA,IAAI,SAAS,GAAG,IAAI,YAAY,EAAE,EAAE,EAAE,CAAC;CACvC,IAAI,SAAS,GAAG,IAAI,YAAY,EAAE,CAAC,EAAE,CAAC;;CAEtC;;CAEA,SAAS,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,GAAG;;CAE9C,CAAC,IAAI,SAAS,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;;CAE5B,CAAC,KAAK,SAAS,IAAI,CAAC,IAAI,SAAS,GAAG,CAAC,GAAG,OAAO,KAAK,CAAC;CACrD;CACA;;CAEA,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,SAAS;CAC5B,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,CAAC;;CAEzB,CAAC,KAAK,CAAC,KAAK,SAAS,GAAG;;CAExB,EAAE,CAAC,GAAG,IAAI,YAAY,EAAE,CAAC,EAAE,CAAC;CAC5B,EAAE,aAAa,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;;CAEzB,EAAE;;CAEF,CAAC,KAAK,OAAO,KAAK,CAAC,GAAG;;CAEtB,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE5B,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,OAAO,EAAE,GAAG,CAAC,GAAG;;CAErD,GAAG,MAAM,IAAI,SAAS,CAAC;CACvB,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;;CAEnC,GAAG;;CAEH,EAAE;;CAEF,CAAC,OAAO,CAAC,CAAC;;CAEV,CAAC;;CAED;;CAEA,SAAS,aAAa,EAAE,QAAQ,EAAE,CAAC,GAAG;;CAEtC,CAAC,IAAI,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,CAAC;;CAE5B,CAAC,KAAK,CAAC,KAAK,SAAS,GAAG;;CAExB,EAAE,CAAC,GAAG,IAAI,UAAU,EAAE,CAAC,EAAE,CAAC;CAC1B,EAAE,aAAa,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;;CAEzB,EAAE;;CAEF,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC;CAC/B,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,gBAAgB,EAAE,CAAC;;CAEvC,CAAC,OAAO,CAAC,CAAC;;CAEV,CAAC;;CAED;;CAEA;CACA;;CAEA;;CAEA,SAAS,UAAU,EAAE,EAAE,EAAE,CAAC,GAAG;;CAE7B,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;;CAE9B,CAAC;;CAED,SAAS,UAAU,EAAE,EAAE,EAAE,CAAC,GAAG;;CAE7B,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;;CAE9B,CAAC;;CAED;;CAEA,SAAS,WAAW,EAAE,EAAE,EAAE,CAAC,GAAG;;CAE9B,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,GAAG;;CAE1B,EAAE,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;;CAEhC,EAAE,MAAM;;CAER,EAAE,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;;CAEtC,EAAE;;CAEF,CAAC;;CAED,SAAS,WAAW,EAAE,EAAE,EAAE,CAAC,GAAG;;CAE9B,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,GAAG;;CAE1B,EAAE,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;;CAE3C,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,GAAG;;CAEjC,EAAE,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;;CAE3C,EAAE,MAAM;;CAER,EAAE,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;;CAEhC,EAAE;;CAEF,CAAC;;CAED,SAAS,WAAW,EAAE,EAAE,EAAE,CAAC,GAAG;;CAE9B,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,GAAG;;CAE1B,EAAE,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;;CAEhC,EAAE,MAAM;;CAER,GAAG,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;;CAEjD,EAAE;;CAEF,CAAC;;CAED;;CAEA,SAAS,WAAW,EAAE,EAAE,EAAE,CAAC,GAAG;;CAE9B,CAAC,EAAE,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC;;CAE1D,CAAC;;CAED,SAAS,WAAW,EAAE,EAAE,EAAE,CAAC,GAAG;;CAE9B,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,SAAS,GAAG;;CAEjC,EAAE,EAAE,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;;CAE7C,EAAE,MAAM;;CAER,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;CAC9B,EAAE,EAAE,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;;CAErD,EAAE;;CAEF,CAAC;;CAED,SAAS,WAAW,EAAE,EAAE,EAAE,CAAC,GAAG;;CAE9B,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,SAAS,GAAG;;CAEjC,EAAE,EAAE,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;;CAE7C,EAAE,MAAM;;CAER,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;CAC9B,EAAE,EAAE,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;;CAErD,EAAE;;CAEF,CAAC;;CAED;;CAEA,SAAS,UAAU,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG;;CAEvC,CAAC,IAAI,IAAI,GAAG,QAAQ,CAAC,gBAAgB,EAAE,CAAC;CACxC,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;CACjC,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,YAAY,EAAE,IAAI,EAAE,CAAC;;CAElD,CAAC;;CAED,SAAS,UAAU,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG;;CAEvC,CAAC,IAAI,IAAI,GAAG,QAAQ,CAAC,gBAAgB,EAAE,CAAC;CACxC,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;CACjC,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC,IAAI,gBAAgB,EAAE,IAAI,EAAE,CAAC;;CAExD,CAAC;;CAED;;CAEA,SAAS,WAAW,EAAE,EAAE,EAAE,CAAC,GAAG;;CAE9B,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;;CAE/B,CAAC;;CAED,SAAS,WAAW,EAAE,EAAE,EAAE,CAAC,GAAG;;CAE9B,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;;CAE/B,CAAC;;CAED,SAAS,WAAW,EAAE,EAAE,EAAE,CAAC,GAAG;;CAE9B,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;;CAE/B,CAAC;;CAED;;CAEA,SAAS,iBAAiB,EAAE,IAAI,GAAG;;CAEnC,CAAC,SAAS,IAAI;;CAEd,EAAE,KAAK,MAAM,EAAE,OAAO,UAAU,CAAC;CACjC,EAAE,KAAK,MAAM,EAAE,OAAO,WAAW,CAAC;CAClC,EAAE,KAAK,MAAM,EAAE,OAAO,WAAW,CAAC;CAClC,EAAE,KAAK,MAAM,EAAE,OAAO,WAAW,CAAC;;CAElC,EAAE,KAAK,MAAM,EAAE,OAAO,WAAW,CAAC;CAClC,EAAE,KAAK,MAAM,EAAE,OAAO,WAAW,CAAC;CAClC,EAAE,KAAK,MAAM,EAAE,OAAO,WAAW,CAAC;;CAElC,EAAE,KAAK,MAAM,CAAC,CAAC,KAAK,MAAM,EAAE,OAAO,UAAU,CAAC;CAC9C,EAAE,KAAK,MAAM,EAAE,OAAO,UAAU,CAAC;;CAEjC,EAAE,KAAK,MAAM,CAAC,CAAC,KAAK,MAAM,EAAE,OAAO,UAAU,CAAC;CAC9C,EAAE,KAAK,MAAM,CAAC,CAAC,KAAK,MAAM,EAAE,OAAO,WAAW,CAAC;CAC/C,EAAE,KAAK,MAAM,CAAC,CAAC,KAAK,MAAM,EAAE,OAAO,WAAW,CAAC;CAC/C,EAAE,KAAK,MAAM,CAAC,CAAC,KAAK,MAAM,EAAE,OAAO,WAAW,CAAC;;CAE/C,EAAE;;CAEF,CAAC;;CAED;;CAEA,SAAS,WAAW,EAAE,EAAE,EAAE,CAAC,GAAG;;CAE9B,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;;CAE/B,CAAC;CACD,SAAS,WAAW,EAAE,EAAE,EAAE,CAAC,GAAG;;CAE9B,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;;CAE/B,CAAC;;CAED;;CAEA,SAAS,WAAW,EAAE,EAAE,EAAE,CAAC,GAAG;;CAE9B,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;;CAExD,CAAC;;CAED,SAAS,WAAW,EAAE,EAAE,EAAE,CAAC,GAAG;;CAE9B,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;;CAExD,CAAC;;CAED,SAAS,WAAW,EAAE,EAAE,EAAE,CAAC,GAAG;;CAE9B,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;;CAExD,CAAC;;CAED;;CAEA,SAAS,WAAW,EAAE,EAAE,EAAE,CAAC,GAAG;;CAE9B,CAAC,EAAE,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;;CAErE,CAAC;;CAED,SAAS,WAAW,EAAE,EAAE,EAAE,CAAC,GAAG;;CAE9B,CAAC,EAAE,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;;CAErE,CAAC;;CAED,SAAS,WAAW,EAAE,EAAE,EAAE,CAAC,GAAG;;CAE9B,CAAC,EAAE,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC;;CAEtE,CAAC;;CAED;;CAEA,SAAS,WAAW,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG;;CAExC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM;CACjB,EAAE,KAAK,GAAG,aAAa,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;;CAEvC,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;;CAEnC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAElC,EAAE,QAAQ,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE9D,EAAE;;CAEF,CAAC;;CAED,SAAS,WAAW,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG;;CAExC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM;CACjB,EAAE,KAAK,GAAG,aAAa,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;;CAEvC,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;;CAEnC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAElC,EAAE,QAAQ,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEpE,EAAE;;CAEF,CAAC;;CAED;;CAEA,SAAS,kBAAkB,EAAE,IAAI,GAAG;;CAEpC,CAAC,SAAS,IAAI;;CAEd,EAAE,KAAK,MAAM,EAAE,OAAO,WAAW,CAAC;CAClC,EAAE,KAAK,MAAM,EAAE,OAAO,WAAW,CAAC;CAClC,EAAE,KAAK,MAAM,EAAE,OAAO,WAAW,CAAC;CAClC,EAAE,KAAK,MAAM,EAAE,OAAO,WAAW,CAAC;;CAElC,EAAE,KAAK,MAAM,EAAE,OAAO,WAAW,CAAC;CAClC,EAAE,KAAK,MAAM,EAAE,OAAO,WAAW,CAAC;CAClC,EAAE,KAAK,MAAM,EAAE,OAAO,WAAW,CAAC;;CAElC,EAAE,KAAK,MAAM,EAAE,OAAO,WAAW,CAAC;CAClC,EAAE,KAAK,MAAM,EAAE,OAAO,WAAW,CAAC;;CAElC,EAAE,KAAK,MAAM,CAAC,CAAC,KAAK,MAAM,EAAE,OAAO,WAAW,CAAC;CAC/C,EAAE,KAAK,MAAM,CAAC,CAAC,KAAK,MAAM,EAAE,OAAO,WAAW,CAAC;CAC/C,EAAE,KAAK,MAAM,CAAC,CAAC,KAAK,MAAM,EAAE,OAAO,WAAW,CAAC;CAC/C,EAAE,KAAK,MAAM,CAAC,CAAC,KAAK,MAAM,EAAE,OAAO,WAAW,CAAC;;CAE/C,EAAE;;CAEF,CAAC;;CAED;;CAEA,SAAS,aAAa,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,GAAG;;CAE/C,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;CACd,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;CAClB,CAAC,IAAI,CAAC,QAAQ,GAAG,iBAAiB,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC;;CAEtD;;CAEA,CAAC;;CAED,SAAS,gBAAgB,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,GAAG;;CAElD,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;CACd,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;CAClB,CAAC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;CAC7B,CAAC,IAAI,CAAC,QAAQ,GAAG,kBAAkB,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC;;CAEvD;;CAEA,CAAC;;CAED,SAAS,iBAAiB,EAAE,EAAE,GAAG;;CAEjC,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;;CAEd,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE/B,CAAC;;CAED,iBAAiB,CAAC,SAAS,CAAC,QAAQ,GAAG,WAAW,EAAE,EAAE,KAAK,GAAG;;CAE9D;CACA;;CAEA,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;;CAEpB,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAElD,EAAE,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC;CACnB,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;;CAElC,EAAE;;CAEF,CAAC,CAAC;;CAEF;;CAEA;;CAEA,IAAI,UAAU,GAAG,0BAA0B,CAAC;;CAE5C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,UAAU,EAAE,SAAS,EAAE,aAAa,GAAG;;CAEhD,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC;CACrC,CAAC,SAAS,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,EAAE,GAAG,aAAa,CAAC;;CAEnD,CAAC;;CAED,SAAS,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,GAAG;;CAErD,CAAC,IAAI,IAAI,GAAG,UAAU,CAAC,IAAI;CAC3B,EAAE,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;;CAE3B;CACA,CAAC,UAAU,CAAC,SAAS,GAAG,CAAC,CAAC;;CAE1B,CAAC,YAAY;;CAEb,EAAE,IAAI,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE;CACrC,GAAG,QAAQ,GAAG,UAAU,CAAC,SAAS;;CAElC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,EAAE;CAClB,GAAG,SAAS,GAAG,KAAK,EAAE,CAAC,EAAE,KAAK,GAAG;CACjC,GAAG,SAAS,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;;CAE1B,EAAE,KAAK,SAAS,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;;CAE/B,EAAE,KAAK,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,GAAG,IAAI,QAAQ,GAAG,CAAC,KAAK,UAAU,GAAG;;CAErF;;CAEA,GAAG,UAAU,EAAE,SAAS,EAAE,SAAS,KAAK,SAAS;CACjD,IAAI,IAAI,aAAa,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;CAC7C,IAAI,IAAI,gBAAgB,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC;;CAEnD,GAAG,MAAM;;CAET,GAAG,MAAM;;CAET;;CAEA,GAAG,IAAI,GAAG,GAAG,SAAS,CAAC,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,EAAE,CAAC;;CAE7C,GAAG,KAAK,IAAI,KAAK,SAAS,GAAG;;CAE7B,IAAI,IAAI,GAAG,IAAI,iBAAiB,EAAE,EAAE,EAAE,CAAC;CACvC,IAAI,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;;CAElC,IAAI;;CAEJ,GAAG,SAAS,GAAG,IAAI,CAAC;;CAEpB,GAAG;;CAEH,EAAE;;CAEF,CAAC;;CAED;;CAEA,SAAS,aAAa,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,GAAG;;CAEhD,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE/B,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;;CAE1B,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,mBAAmB,EAAE,OAAO,EAAE,EAAE,CAAC,eAAe,EAAE,CAAC;;CAE/D,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG;;CAEhC,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,CAAC,EAAE;CAC9C,GAAG,IAAI,GAAG,EAAE,CAAC,kBAAkB,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;;CAEtD,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEnC,EAAE;;CAEF,CAAC;;CAED,aAAa,CAAC,SAAS,CAAC,QAAQ,GAAG,WAAW,EAAE,EAAE,IAAI,EAAE,KAAK,GAAG;;CAEhE,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;;CAE1B,CAAC,KAAK,CAAC,KAAK,SAAS,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;;CAE/D,CAAC,CAAC;;CAEF,aAAa,CAAC,SAAS,CAAC,WAAW,GAAG,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,GAAG;;CAEpE,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC;;CAExB,CAAC,KAAK,CAAC,KAAK,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;;CAErD,CAAC,CAAC;;;CAGF;;CAEA,aAAa,CAAC,MAAM,GAAG,WAAW,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,GAAG;;CAE9D,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAElD,EAAE,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE;CAClB,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;;CAEtB,EAAE,KAAK,CAAC,CAAC,WAAW,KAAK,KAAK,GAAG;;CAEjC;CACA,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC;;CAEvC,GAAG;;CAEH,EAAE;;CAEF,CAAC,CAAC;;CAEF,aAAa,CAAC,YAAY,GAAG,WAAW,GAAG,EAAE,MAAM,GAAG;;CAEtD,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;;CAEZ,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAElD,EAAE,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC;CACnB,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;;CAEpC,EAAE;;CAEF,CAAC,OAAO,CAAC,CAAC;;CAEV,CAAC,CAAC;;CAEF;CACA;CACA;;CAEA,SAAS,cAAc,EAAE,MAAM,GAAG;;CAElC,CAAC,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;;CAElC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAE3C,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;;CAE7C,EAAE;;CAEF,CAAC,OAAO,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE3B,CAAC;;CAED,SAAS,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG;;CAEzC,CAAC,IAAI,MAAM,GAAG,EAAE,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;;CAEtC,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;CACnC,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC;;CAE5B,CAAC,KAAK,EAAE,CAAC,kBAAkB,EAAE,MAAM,EAAE,EAAE,CAAC,cAAc,EAAE,KAAK,KAAK,GAAG;;CAErE,EAAE,OAAO,CAAC,KAAK,EAAE,8CAA8C,EAAE,CAAC;;CAElE,EAAE;;CAEF,CAAC,KAAK,EAAE,CAAC,gBAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;;CAE7C,EAAE,OAAO,CAAC,IAAI,EAAE,0CAA0C,EAAE,IAAI,KAAK,EAAE,CAAC,aAAa,GAAG,QAAQ,GAAG,UAAU,EAAE,EAAE,CAAC,gBAAgB,EAAE,MAAM,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,CAAC;;CAEzK,EAAE;;CAEF;CACA;;CAEA,CAAC,OAAO,MAAM,CAAC;;CAEf,CAAC;;CAED;CACA;CACA;;CAEA,IAAI,cAAc,GAAG,CAAC,CAAC;;CAEvB,SAAS,qBAAqB,EAAE,QAAQ,GAAG;;CAE3C,CAAC,SAAS,QAAQ;;CAElB,EAAE,KAAK,cAAc;CACrB,GAAG,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;CACpC,EAAE,KAAK,YAAY;CACnB,GAAG,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;CAClC,EAAE,KAAK,YAAY;CACnB,GAAG,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;CAClC,EAAE,KAAK,aAAa;CACpB,GAAG,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;CACvC,EAAE,KAAK,cAAc;CACrB,GAAG,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;CACxC,EAAE,KAAK,YAAY;CACnB,GAAG,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;CACzC,EAAE,KAAK,aAAa;CACpB,GAAG,OAAO,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC;CAC1D,EAAE;CACF,GAAG,MAAM,IAAI,KAAK,EAAE,wBAAwB,GAAG,QAAQ,EAAE,CAAC;;CAE1D,EAAE;;CAEF,CAAC;;CAED,SAAS,wBAAwB,EAAE,YAAY,EAAE,QAAQ,GAAG;;CAE5D,CAAC,IAAI,UAAU,GAAG,qBAAqB,EAAE,QAAQ,EAAE,CAAC;CACpD,CAAC,OAAO,OAAO,GAAG,YAAY,GAAG,0BAA0B,GAAG,UAAU,EAAE,CAAC,EAAE,GAAG,UAAU,GAAG,UAAU,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC;;CAErH,CAAC;;CAED,SAAS,wBAAwB,EAAE,YAAY,EAAE,QAAQ,GAAG;;CAE5D,CAAC,IAAI,UAAU,GAAG,qBAAqB,EAAE,QAAQ,EAAE,CAAC;CACpD,CAAC,OAAO,OAAO,GAAG,YAAY,GAAG,kCAAkC,GAAG,UAAU,EAAE,CAAC,EAAE,GAAG,UAAU,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC;;CAEhH,CAAC;;CAED,SAAS,sBAAsB,EAAE,YAAY,EAAE,WAAW,GAAG;;CAE7D,CAAC,IAAI,eAAe,CAAC;;CAErB,CAAC,SAAS,WAAW;;CAErB,EAAE,KAAK,iBAAiB;CACxB,GAAG,eAAe,GAAG,QAAQ,CAAC;CAC9B,GAAG,MAAM;;CAET,EAAE,KAAK,mBAAmB;CAC1B,GAAG,eAAe,GAAG,UAAU,CAAC;CAChC,GAAG,MAAM;;CAET,EAAE,KAAK,qBAAqB;CAC5B,GAAG,eAAe,GAAG,YAAY,CAAC;CAClC,GAAG,MAAM;;CAET,EAAE,KAAK,iBAAiB;CACxB,GAAG,eAAe,GAAG,iBAAiB,CAAC;CACvC,GAAG,MAAM;;CAET,EAAE;CACF,GAAG,MAAM,IAAI,KAAK,EAAE,2BAA2B,GAAG,WAAW,EAAE,CAAC;;CAEhE,EAAE;;CAEF,CAAC,OAAO,OAAO,GAAG,YAAY,GAAG,0BAA0B,GAAG,eAAe,GAAG,yBAAyB,CAAC;;CAE1G,CAAC;;CAED,SAAS,kBAAkB,EAAE,UAAU,EAAE,UAAU,EAAE,kBAAkB,GAAG;;CAE1E,CAAC,UAAU,GAAG,UAAU,IAAI,EAAE,CAAC;;CAE/B,CAAC,IAAI,MAAM,GAAG;CACd,EAAE,EAAE,UAAU,CAAC,WAAW,IAAI,UAAU,CAAC,YAAY,IAAI,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,SAAS,IAAI,UAAU,CAAC,WAAW,KAAK,iDAAiD,GAAG,EAAE;CACxL,EAAE,EAAE,UAAU,CAAC,SAAS,IAAI,UAAU,CAAC,sBAAsB,MAAM,kBAAkB,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,uCAAuC,GAAG,EAAE;CAC5J,EAAE,EAAE,UAAU,CAAC,WAAW,MAAM,kBAAkB,CAAC,GAAG,EAAE,oBAAoB,EAAE,GAAG,0CAA0C,GAAG,EAAE;CAChI,EAAE,EAAE,UAAU,CAAC,gBAAgB,IAAI,UAAU,CAAC,MAAM,MAAM,kBAAkB,CAAC,GAAG,EAAE,wBAAwB,EAAE,GAAG,+CAA+C,GAAG,EAAE;CACnK,EAAE,CAAC;;CAEH,CAAC,OAAO,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEtD,CAAC;;CAED,SAAS,eAAe,EAAE,OAAO,GAAG;;CAEpC,CAAC,IAAI,MAAM,GAAG,EAAE,CAAC;;CAEjB,CAAC,MAAM,IAAI,IAAI,IAAI,OAAO,GAAG;;CAE7B,EAAE,IAAI,KAAK,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC;;CAE9B,EAAE,KAAK,KAAK,KAAK,KAAK,GAAG,SAAS;;CAElC,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,GAAG,GAAG,GAAG,KAAK,EAAE,CAAC;;CAEjD,EAAE;;CAEF,CAAC,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE5B,CAAC;;CAED,SAAS,uBAAuB,EAAE,EAAE,EAAE,OAAO,GAAG;;CAEhD,CAAC,IAAI,UAAU,GAAG,EAAE,CAAC;;CAErB,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,mBAAmB,EAAE,OAAO,EAAE,EAAE,CAAC,iBAAiB,EAAE,CAAC;;CAEjE,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEhC,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC,eAAe,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;CAC9C,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;;CAEvB;;CAEA,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;CAE7D,EAAE;;CAEF,CAAC,OAAO,UAAU,CAAC;;CAEnB,CAAC;;CAED,SAAS,eAAe,EAAE,MAAM,GAAG;;CAEnC,CAAC,OAAO,MAAM,KAAK,EAAE,CAAC;;CAEtB,CAAC;;CAED,SAAS,gBAAgB,EAAE,MAAM,EAAE,UAAU,GAAG;;CAEhD,CAAC,OAAO,MAAM;CACd,GAAG,OAAO,EAAE,iBAAiB,EAAE,UAAU,CAAC,YAAY,EAAE;CACxD,GAAG,OAAO,EAAE,kBAAkB,EAAE,UAAU,CAAC,aAAa,EAAE;CAC1D,GAAG,OAAO,EAAE,uBAAuB,EAAE,UAAU,CAAC,iBAAiB,EAAE;CACnE,GAAG,OAAO,EAAE,mBAAmB,EAAE,UAAU,CAAC,cAAc,EAAE;CAC5D,GAAG,OAAO,EAAE,kBAAkB,EAAE,UAAU,CAAC,aAAa,EAAE,CAAC;;CAE3D,CAAC;;CAED,SAAS,wBAAwB,EAAE,MAAM,EAAE,UAAU,GAAG;;CAExD,CAAC,OAAO,MAAM;CACd,GAAG,OAAO,EAAE,sBAAsB,EAAE,UAAU,CAAC,iBAAiB,EAAE;CAClE,GAAG,OAAO,EAAE,wBAAwB,IAAI,UAAU,CAAC,iBAAiB,GAAG,UAAU,CAAC,mBAAmB,IAAI,CAAC;;CAE1G,CAAC;;CAED,SAAS,aAAa,EAAE,MAAM,GAAG;;CAEjC,CAAC,IAAI,OAAO,GAAG,iCAAiC,CAAC;;CAEjD,CAAC,SAAS,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG;;CAEpC,EAAE,IAAI,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,CAAC;;CAEvC,EAAE,KAAK,OAAO,KAAK,SAAS,GAAG;;CAE/B,GAAG,MAAM,IAAI,KAAK,EAAE,4BAA4B,GAAG,OAAO,GAAG,GAAG,EAAE,CAAC;;CAEnE,GAAG;;CAEH,EAAE,OAAO,aAAa,EAAE,OAAO,EAAE,CAAC;;CAElC,EAAE;;CAEF,CAAC,OAAO,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;;CAE3C,CAAC;;CAED,SAAS,WAAW,EAAE,MAAM,GAAG;;CAE/B,CAAC,IAAI,OAAO,GAAG,8FAA8F,CAAC;;CAE9G,CAAC,SAAS,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,GAAG;;CAEhD,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC;;CAElB,EAAE,MAAM,IAAI,CAAC,GAAG,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,QAAQ,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAE/D,GAAG,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;;CAE5D,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC;;CAEhB,EAAE;;CAEF,CAAC,OAAO,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;;CAE3C,CAAC;;CAED,SAAS,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAG;;CAElF,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC;;CAE3B,CAAC,IAAI,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;;CAEhC,CAAC,IAAI,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;CACxC,CAAC,IAAI,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;;CAE5C,CAAC,IAAI,mBAAmB,GAAG,sBAAsB,CAAC;;CAElD,CAAC,KAAK,UAAU,CAAC,aAAa,KAAK,YAAY,GAAG;;CAElD,EAAE,mBAAmB,GAAG,oBAAoB,CAAC;;CAE7C,EAAE,MAAM,KAAK,UAAU,CAAC,aAAa,KAAK,gBAAgB,GAAG;;CAE7D,EAAE,mBAAmB,GAAG,yBAAyB,CAAC;;CAElD,EAAE;;CAEF,CAAC,IAAI,gBAAgB,GAAG,kBAAkB,CAAC;CAC3C,CAAC,IAAI,gBAAgB,GAAG,wBAAwB,CAAC;CACjD,CAAC,IAAI,oBAAoB,GAAG,0BAA0B,CAAC;;CAEvD,CAAC,KAAK,UAAU,CAAC,MAAM,GAAG;;CAE1B,EAAE,SAAS,QAAQ,CAAC,MAAM,CAAC,OAAO;;CAElC,GAAG,KAAK,qBAAqB,CAAC;CAC9B,GAAG,KAAK,qBAAqB;CAC7B,IAAI,gBAAgB,GAAG,kBAAkB,CAAC;CAC1C,IAAI,MAAM;;CAEV,GAAG,KAAK,uBAAuB,CAAC;CAChC,GAAG,KAAK,uBAAuB;CAC/B,IAAI,gBAAgB,GAAG,qBAAqB,CAAC;CAC7C,IAAI,MAAM;;CAEV,GAAG,KAAK,gCAAgC,CAAC;CACzC,GAAG,KAAK,gCAAgC;CACxC,IAAI,gBAAgB,GAAG,qBAAqB,CAAC;CAC7C,IAAI,MAAM;;CAEV,GAAG,KAAK,0BAA0B;CAClC,IAAI,gBAAgB,GAAG,oBAAoB,CAAC;CAC5C,IAAI,MAAM;;CAEV,GAAG;;CAEH,EAAE,SAAS,QAAQ,CAAC,MAAM,CAAC,OAAO;;CAElC,GAAG,KAAK,qBAAqB,CAAC;CAC9B,GAAG,KAAK,gCAAgC;CACxC,IAAI,gBAAgB,GAAG,wBAAwB,CAAC;CAChD,IAAI,MAAM;;CAEV,GAAG;;CAEH,EAAE,SAAS,QAAQ,CAAC,OAAO;;CAE3B,GAAG,KAAK,iBAAiB;CACzB,IAAI,oBAAoB,GAAG,0BAA0B,CAAC;CACtD,IAAI,MAAM;;CAEV,GAAG,KAAK,YAAY;CACpB,IAAI,oBAAoB,GAAG,qBAAqB,CAAC;CACjD,IAAI,MAAM;;CAEV,GAAG,KAAK,YAAY;CACpB,IAAI,oBAAoB,GAAG,qBAAqB,CAAC;CACjD,IAAI,MAAM;;CAEV,GAAG;;CAEH,EAAE;;CAEF,CAAC,IAAI,iBAAiB,GAAG,EAAE,QAAQ,CAAC,WAAW,GAAG,CAAC,KAAK,QAAQ,CAAC,WAAW,GAAG,GAAG,CAAC;;CAEnF;;CAEA;;CAEA,CAAC,IAAI,gBAAgB,GAAG,kBAAkB,EAAE,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;;CAE1F,CAAC,IAAI,aAAa,GAAG,eAAe,EAAE,OAAO,EAAE,CAAC;;CAEhD;;CAEA,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;;CAElC,CAAC,IAAI,YAAY,EAAE,cAAc,CAAC;;CAElC,CAAC,KAAK,QAAQ,CAAC,mBAAmB,GAAG;;CAErC,EAAE,YAAY,GAAG;;CAEjB,GAAG,aAAa;;CAEhB,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE3C,EAAE,KAAK,YAAY,CAAC,MAAM,GAAG,CAAC,GAAG;;CAEjC,GAAG,YAAY,IAAI,IAAI,CAAC;;CAExB,GAAG;;CAEH,EAAE,cAAc,GAAG;;CAEnB,GAAG,gBAAgB;CACnB,GAAG,aAAa;;CAEhB,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE3C,EAAE,KAAK,cAAc,CAAC,MAAM,GAAG,CAAC,GAAG;;CAEnC,GAAG,cAAc,IAAI,IAAI,CAAC;;CAE1B,GAAG;;CAEH,EAAE,MAAM;;CAER,EAAE,YAAY,GAAG;;CAEjB,GAAG,YAAY,GAAG,UAAU,CAAC,SAAS,GAAG,SAAS;CAClD,GAAG,YAAY,GAAG,UAAU,CAAC,SAAS,GAAG,OAAO;;CAEhD,GAAG,sBAAsB,GAAG,MAAM,CAAC,IAAI;;CAEvC,GAAG,aAAa;;CAEhB,GAAG,UAAU,CAAC,sBAAsB,GAAG,yBAAyB,GAAG,EAAE;;CAErE,GAAG,uBAAuB,GAAG,iBAAiB;;CAE9C,GAAG,oBAAoB,GAAG,UAAU,CAAC,QAAQ;CAC7C,GAAG,EAAE,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,iBAAiB,GAAG,EAAE;CACnE,GAAG,EAAE,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,MAAM,KAAK,kBAAkB,GAAG,EAAE;;CAEvE,GAAG,UAAU,CAAC,GAAG,GAAG,iBAAiB,GAAG,EAAE;CAC1C,GAAG,UAAU,CAAC,MAAM,GAAG,oBAAoB,GAAG,EAAE;CAChD,GAAG,UAAU,CAAC,MAAM,GAAG,UAAU,GAAG,gBAAgB,GAAG,EAAE;CACzD,GAAG,UAAU,CAAC,QAAQ,GAAG,sBAAsB,GAAG,EAAE;CACpD,GAAG,UAAU,CAAC,KAAK,GAAG,mBAAmB,GAAG,EAAE;CAC9C,GAAG,UAAU,CAAC,WAAW,GAAG,yBAAyB,GAAG,EAAE;CAC1D,GAAG,UAAU,CAAC,OAAO,GAAG,qBAAqB,GAAG,EAAE;CAClD,GAAG,UAAU,CAAC,SAAS,GAAG,uBAAuB,GAAG,EAAE;CACtD,GAAG,UAAU,CAAC,eAAe,IAAI,UAAU,CAAC,sBAAsB,GAAG,6BAA6B,GAAG,EAAE;CACvG,GAAG,UAAU,CAAC,WAAW,GAAG,yBAAyB,GAAG,EAAE;CAC1D,GAAG,UAAU,CAAC,YAAY,GAAG,0BAA0B,GAAG,EAAE;CAC5D,GAAG,UAAU,CAAC,YAAY,GAAG,0BAA0B,GAAG,EAAE;CAC5D,GAAG,UAAU,CAAC,QAAQ,GAAG,sBAAsB,GAAG,EAAE;CACpD,GAAG,UAAU,CAAC,YAAY,GAAG,mBAAmB,GAAG,EAAE;;CAErD,GAAG,UAAU,CAAC,WAAW,GAAG,qBAAqB,GAAG,EAAE;;CAEtD,GAAG,UAAU,CAAC,QAAQ,GAAG,sBAAsB,GAAG,EAAE;CACpD,GAAG,UAAU,CAAC,gBAAgB,GAAG,sBAAsB,GAAG,EAAE;;CAE5D,GAAG,UAAU,CAAC,YAAY,GAAG,0BAA0B,GAAG,EAAE;CAC5D,GAAG,UAAU,CAAC,YAAY,IAAI,UAAU,CAAC,WAAW,KAAK,KAAK,GAAG,0BAA0B,GAAG,EAAE;CAChG,GAAG,UAAU,CAAC,WAAW,GAAG,sBAAsB,GAAG,EAAE;CACvD,GAAG,UAAU,CAAC,SAAS,GAAG,oBAAoB,GAAG,EAAE;;CAEnD,GAAG,UAAU,CAAC,gBAAgB,GAAG,uBAAuB,GAAG,EAAE;CAC7D,GAAG,UAAU,CAAC,gBAAgB,GAAG,UAAU,GAAG,mBAAmB,GAAG,EAAE;;CAEtE,GAAG,UAAU,CAAC,eAAe,GAAG,6BAA6B,GAAG,EAAE;;CAElE,GAAG,UAAU,CAAC,sBAAsB,GAAG,yBAAyB,GAAG,EAAE;CACrE,GAAG,UAAU,CAAC,sBAAsB,IAAI,UAAU,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,6BAA6B,GAAG,EAAE;;CAE/G,GAAG,2BAA2B;CAC9B,GAAG,+BAA+B;CAClC,GAAG,gCAAgC;CACnC,GAAG,0BAA0B;CAC7B,GAAG,4BAA4B;CAC/B,GAAG,8BAA8B;;CAEjC,GAAG,0BAA0B;CAC7B,GAAG,wBAAwB;CAC3B,GAAG,oBAAoB;;CAEvB,GAAG,kBAAkB;;CAErB,GAAG,wBAAwB;;CAE3B,GAAG,QAAQ;;CAEX,GAAG,yBAAyB;;CAE5B,GAAG,+BAA+B;CAClC,GAAG,+BAA+B;CAClC,GAAG,+BAA+B;CAClC,GAAG,+BAA+B;;CAElC,GAAG,0BAA0B;;CAE7B,GAAG,gCAAgC;CACnC,GAAG,gCAAgC;CACnC,GAAG,gCAAgC;CACnC,GAAG,gCAAgC;;CAEnC,GAAG,QAAQ;;CAEX,GAAG,gCAAgC;CACnC,GAAG,gCAAgC;CACnC,GAAG,gCAAgC;CACnC,GAAG,gCAAgC;;CAEnC,GAAG,SAAS;;CAEZ,GAAG,QAAQ;;CAEX,GAAG,qBAAqB;;CAExB,GAAG,4BAA4B;CAC/B,GAAG,6BAA6B;;CAEhC,GAAG,QAAQ;;CAEX,GAAG,IAAI;;CAEP,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE3C,EAAE,cAAc,GAAG;;CAEnB,GAAG,gBAAgB;;CAEnB,GAAG,YAAY,GAAG,UAAU,CAAC,SAAS,GAAG,SAAS;CAClD,GAAG,YAAY,GAAG,UAAU,CAAC,SAAS,GAAG,OAAO;;CAEhD,GAAG,sBAAsB,GAAG,MAAM,CAAC,IAAI;;CAEvC,GAAG,aAAa;;CAEhB,GAAG,UAAU,CAAC,SAAS,GAAG,oBAAoB,GAAG,UAAU,CAAC,SAAS,GAAG,EAAE;;CAE1E,GAAG,uBAAuB,GAAG,iBAAiB;;CAE9C,GAAG,EAAE,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,iBAAiB,GAAG,EAAE;CACnE,GAAG,EAAE,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,MAAM,KAAK,kBAAkB,GAAG,EAAE;;CAEvE,GAAG,UAAU,CAAC,GAAG,GAAG,iBAAiB,GAAG,EAAE;CAC1C,GAAG,UAAU,CAAC,MAAM,GAAG,oBAAoB,GAAG,EAAE;CAChD,GAAG,UAAU,CAAC,MAAM,GAAG,UAAU,GAAG,gBAAgB,GAAG,EAAE;CACzD,GAAG,UAAU,CAAC,MAAM,GAAG,UAAU,GAAG,gBAAgB,GAAG,EAAE;CACzD,GAAG,UAAU,CAAC,MAAM,GAAG,UAAU,GAAG,oBAAoB,GAAG,EAAE;CAC7D,GAAG,UAAU,CAAC,QAAQ,GAAG,sBAAsB,GAAG,EAAE;CACpD,GAAG,UAAU,CAAC,KAAK,GAAG,mBAAmB,GAAG,EAAE;CAC9C,GAAG,UAAU,CAAC,WAAW,GAAG,yBAAyB,GAAG,EAAE;CAC1D,GAAG,UAAU,CAAC,OAAO,GAAG,qBAAqB,GAAG,EAAE;CAClD,GAAG,UAAU,CAAC,SAAS,GAAG,uBAAuB,GAAG,EAAE;CACtD,GAAG,UAAU,CAAC,WAAW,GAAG,yBAAyB,GAAG,EAAE;CAC1D,GAAG,UAAU,CAAC,YAAY,GAAG,0BAA0B,GAAG,EAAE;CAC5D,GAAG,UAAU,CAAC,YAAY,GAAG,0BAA0B,GAAG,EAAE;CAC5D,GAAG,UAAU,CAAC,QAAQ,GAAG,sBAAsB,GAAG,EAAE;CACpD,GAAG,UAAU,CAAC,YAAY,GAAG,mBAAmB,GAAG,EAAE;;CAErD,GAAG,UAAU,CAAC,WAAW,GAAG,yBAAyB,GAAG,EAAE;;CAE1D,GAAG,UAAU,CAAC,WAAW,GAAG,qBAAqB,GAAG,EAAE;;CAEtD,GAAG,UAAU,CAAC,WAAW,GAAG,sBAAsB,GAAG,EAAE;CACvD,GAAG,UAAU,CAAC,SAAS,GAAG,oBAAoB,GAAG,EAAE;;CAEnD,GAAG,UAAU,CAAC,gBAAgB,GAAG,uBAAuB,GAAG,EAAE;CAC7D,GAAG,UAAU,CAAC,gBAAgB,GAAG,UAAU,GAAG,mBAAmB,GAAG,EAAE;;CAEtE,GAAG,UAAU,CAAC,kBAAkB,GAAG,6BAA6B,GAAG,EAAE;;CAErE,GAAG,UAAU,CAAC,uBAAuB,GAAG,mCAAmC,GAAG,EAAE;;CAEhF,GAAG,UAAU,CAAC,sBAAsB,GAAG,yBAAyB,GAAG,EAAE;CACrE,GAAG,UAAU,CAAC,sBAAsB,IAAI,UAAU,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,6BAA6B,GAAG,EAAE;;CAE/G,GAAG,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,GAAG,EAAE,wBAAwB,EAAE,GAAG,yBAAyB,GAAG,EAAE;;CAEnG,GAAG,0BAA0B;CAC7B,GAAG,8BAA8B;;CAEjC,GAAG,EAAE,UAAU,CAAC,WAAW,KAAK,aAAa,KAAK,sBAAsB,GAAG,EAAE;CAC7E,GAAG,EAAE,UAAU,CAAC,WAAW,KAAK,aAAa,KAAK,WAAW,EAAE,2BAA2B,EAAE,GAAG,EAAE;CACjG,GAAG,EAAE,UAAU,CAAC,WAAW,KAAK,aAAa,KAAK,sBAAsB,EAAE,aAAa,EAAE,UAAU,CAAC,WAAW,EAAE,GAAG,EAAE;;CAEtH,GAAG,UAAU,CAAC,SAAS,GAAG,mBAAmB,GAAG,EAAE;;CAElD,GAAG,EAAE,UAAU,CAAC,cAAc,IAAI,UAAU,CAAC,WAAW,IAAI,UAAU,CAAC,cAAc,IAAI,UAAU,CAAC,mBAAmB,KAAK,WAAW,EAAE,yBAAyB,EAAE,GAAG,EAAE;CACzK,GAAG,UAAU,CAAC,WAAW,GAAG,wBAAwB,EAAE,kBAAkB,EAAE,UAAU,CAAC,WAAW,EAAE,GAAG,EAAE;CACvG,GAAG,UAAU,CAAC,cAAc,GAAG,wBAAwB,EAAE,qBAAqB,EAAE,UAAU,CAAC,cAAc,EAAE,GAAG,EAAE;CAChH,GAAG,UAAU,CAAC,mBAAmB,GAAG,wBAAwB,EAAE,0BAA0B,EAAE,UAAU,CAAC,mBAAmB,EAAE,GAAG,EAAE;CAC/H,GAAG,UAAU,CAAC,cAAc,GAAG,wBAAwB,EAAE,qBAAqB,EAAE,UAAU,CAAC,cAAc,EAAE,GAAG,EAAE;;CAEhH,GAAG,UAAU,CAAC,YAAY,GAAG,wBAAwB,GAAG,QAAQ,CAAC,YAAY,GAAG,EAAE;;CAElF,GAAG,IAAI;;CAEP,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE3C,EAAE;;CAEF,CAAC,YAAY,GAAG,aAAa,EAAE,YAAY,EAAE,CAAC;CAC9C,CAAC,YAAY,GAAG,gBAAgB,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;CAC7D,CAAC,YAAY,GAAG,wBAAwB,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;;CAErE,CAAC,cAAc,GAAG,aAAa,EAAE,cAAc,EAAE,CAAC;CAClD,CAAC,cAAc,GAAG,gBAAgB,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC;CACjE,CAAC,cAAc,GAAG,wBAAwB,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC;;CAEzE,CAAC,YAAY,GAAG,WAAW,EAAE,YAAY,EAAE,CAAC;CAC5C,CAAC,cAAc,GAAG,WAAW,EAAE,cAAc,EAAE,CAAC;;CAEhD,CAAC,IAAI,UAAU,GAAG,YAAY,GAAG,YAAY,CAAC;CAC9C,CAAC,IAAI,YAAY,GAAG,cAAc,GAAG,cAAc,CAAC;;CAEpD;CACA;;CAEA,CAAC,IAAI,cAAc,GAAG,WAAW,EAAE,EAAE,EAAE,EAAE,CAAC,aAAa,EAAE,UAAU,EAAE,CAAC;CACtE,CAAC,IAAI,gBAAgB,GAAG,WAAW,EAAE,EAAE,EAAE,EAAE,CAAC,eAAe,EAAE,YAAY,EAAE,CAAC;;CAE5E,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;CAC5C,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;;CAE9C;;CAEA,CAAC,KAAK,QAAQ,CAAC,mBAAmB,KAAK,SAAS,GAAG;;CAEnD,EAAE,EAAE,CAAC,kBAAkB,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,mBAAmB,EAAE,CAAC;;CAEpE,EAAE,MAAM,KAAK,UAAU,CAAC,YAAY,KAAK,IAAI,GAAG;;CAEhD;CACA,EAAE,EAAE,CAAC,kBAAkB,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC;;CAElD,EAAE;;CAEF,CAAC,EAAE,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC;;CAE3B,CAAC,IAAI,UAAU,GAAG,EAAE,CAAC,iBAAiB,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC;CACzD,CAAC,IAAI,SAAS,GAAG,EAAE,CAAC,gBAAgB,EAAE,cAAc,EAAE,CAAC,IAAI,EAAE,CAAC;CAC9D,CAAC,IAAI,WAAW,GAAG,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,CAAC,IAAI,EAAE,CAAC;;CAElE,CAAC,IAAI,QAAQ,GAAG,IAAI,CAAC;CACrB,CAAC,IAAI,eAAe,GAAG,IAAI,CAAC;;CAE5B;CACA;;CAEA,CAAC,KAAK,EAAE,CAAC,mBAAmB,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,GAAG;;CAEpE,EAAE,QAAQ,GAAG,KAAK,CAAC;;CAEnB,EAAE,OAAO,CAAC,KAAK,EAAE,oCAAoC,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE,oBAAoB,EAAE,EAAE,CAAC,mBAAmB,EAAE,OAAO,EAAE,EAAE,CAAC,eAAe,EAAE,EAAE,sBAAsB,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;;CAEhN,EAAE,MAAM,KAAK,UAAU,KAAK,EAAE,GAAG;;CAEjC,EAAE,OAAO,CAAC,IAAI,EAAE,4CAA4C,EAAE,UAAU,EAAE,CAAC;;CAE3E,EAAE,MAAM,KAAK,SAAS,KAAK,EAAE,IAAI,WAAW,KAAK,EAAE,GAAG;;CAEtD,EAAE,eAAe,GAAG,KAAK,CAAC;;CAE1B,EAAE;;CAEF,CAAC,KAAK,eAAe,GAAG;;CAExB,EAAE,IAAI,CAAC,WAAW,GAAG;;CAErB,GAAG,QAAQ,EAAE,QAAQ;CACrB,GAAG,QAAQ,EAAE,QAAQ;;CAErB,GAAG,UAAU,EAAE,UAAU;;CAEzB,GAAG,YAAY,EAAE;;CAEjB,IAAI,GAAG,EAAE,SAAS;CAClB,IAAI,MAAM,EAAE,YAAY;;CAExB,IAAI;;CAEJ,GAAG,cAAc,EAAE;;CAEnB,IAAI,GAAG,EAAE,WAAW;CACpB,IAAI,MAAM,EAAE,cAAc;;CAE1B,IAAI;;CAEJ,GAAG,CAAC;;CAEJ,EAAE;;CAEF;;CAEA,CAAC,EAAE,CAAC,YAAY,EAAE,cAAc,EAAE,CAAC;CACnC,CAAC,EAAE,CAAC,YAAY,EAAE,gBAAgB,EAAE,CAAC;;CAErC;;CAEA,CAAC,IAAI,cAAc,CAAC;;CAEpB,CAAC,IAAI,CAAC,WAAW,GAAG,YAAY;;CAEhC,EAAE,KAAK,cAAc,KAAK,SAAS,GAAG;;CAEtC,GAAG,cAAc,GAAG,IAAI,aAAa,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;;CAE/D,GAAG;;CAEH,EAAE,OAAO,cAAc,CAAC;;CAExB,EAAE,CAAC;;CAEH;;CAEA,CAAC,IAAI,gBAAgB,CAAC;;CAEtB,CAAC,IAAI,CAAC,aAAa,GAAG,YAAY;;CAElC,EAAE,KAAK,gBAAgB,KAAK,SAAS,GAAG;;CAExC,GAAG,gBAAgB,GAAG,uBAAuB,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;;CAE7D,GAAG;;CAEH,EAAE,OAAO,gBAAgB,CAAC;;CAE1B,EAAE,CAAC;;CAEH;;CAEA,CAAC,IAAI,CAAC,OAAO,GAAG,YAAY;;CAE5B,EAAE,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,CAAC;CAC9B,EAAE,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;;CAE3B,EAAE,CAAC;;CAEH;;CAEA,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,EAAE;;CAEhC,EAAE,QAAQ,EAAE;CACZ,GAAG,GAAG,EAAE,YAAY;;CAEpB,IAAI,OAAO,CAAC,IAAI,EAAE,sDAAsD,EAAE,CAAC;CAC3E,IAAI,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;;CAE9B,IAAI;CACJ,GAAG;;CAEH,EAAE,UAAU,EAAE;CACd,GAAG,GAAG,EAAE,YAAY;;CAEpB,IAAI,OAAO,CAAC,IAAI,EAAE,0DAA0D,EAAE,CAAC;CAC/E,IAAI,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;;CAEhC,IAAI;CACJ,GAAG;;CAEH,EAAE,EAAE,CAAC;;;CAGL;;CAEA,CAAC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;CACzB,CAAC,IAAI,CAAC,EAAE,GAAG,cAAc,GAAG,CAAC;CAC7B,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;CAClB,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;CACpB,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;CACxB,CAAC,IAAI,CAAC,YAAY,GAAG,cAAc,CAAC;CACpC,CAAC,IAAI,CAAC,cAAc,GAAG,gBAAgB,CAAC;;CAExC,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC;;CAED;CACA;CACA;;CAEA,SAAS,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,GAAG;;CAE7D,CAAC,IAAI,QAAQ,GAAG,EAAE,CAAC;;CAEnB,CAAC,IAAI,SAAS,GAAG;CACjB,EAAE,iBAAiB,EAAE,OAAO;CAC5B,EAAE,oBAAoB,EAAE,cAAc;CACtC,EAAE,kBAAkB,EAAE,QAAQ;CAC9B,EAAE,iBAAiB,EAAE,OAAO;CAC5B,EAAE,mBAAmB,EAAE,SAAS;CAChC,EAAE,iBAAiB,EAAE,OAAO;CAC5B,EAAE,gBAAgB,EAAE,OAAO;CAC3B,EAAE,oBAAoB,EAAE,UAAU;CAClC,EAAE,oBAAoB,EAAE,UAAU;CAClC,EAAE,iBAAiB,EAAE,OAAO;CAC5B,EAAE,kBAAkB,EAAE,QAAQ;CAC9B,EAAE,cAAc,EAAE,QAAQ;CAC1B,EAAE,cAAc,EAAE,QAAQ;CAC1B,EAAE,CAAC;;CAEH,CAAC,IAAI,cAAc,GAAG;CACtB,EAAE,WAAW,EAAE,wBAAwB,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,gBAAgB;CACvG,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,aAAa;CACrH,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa;CAC/C,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ;CAClE,EAAE,aAAa,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,UAAU;CACxE,EAAE,UAAU,EAAE,kBAAkB,EAAE,cAAc,EAAE,cAAc;CAChE,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,oBAAoB;CAC5D,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,mBAAmB;CACzF,EAAE,kBAAkB,EAAE,eAAe,EAAE,aAAa,EAAE,yBAAyB;CAC/E,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,cAAc,EAAE,WAAW;CAClH,EAAE,CAAC;;;CAGH,CAAC,SAAS,aAAa,EAAE,MAAM,GAAG;;CAElC,EAAE,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;CACjC,EAAE,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;;CAE7B,EAAE,KAAK,YAAY,CAAC,mBAAmB,GAAG;;CAE1C,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG,MAAM;;CAET;CACA;CACA;CACA;CACA;CACA;;CAEA,GAAG,IAAI,eAAe,GAAG,YAAY,CAAC,iBAAiB,CAAC;CACxD,GAAG,IAAI,eAAe,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,eAAe,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;;CAEpE,GAAG,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,eAAe,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;;CAE5D,GAAG,KAAK,QAAQ,GAAG,KAAK,CAAC,MAAM,GAAG;;CAElC,IAAI,OAAO,CAAC,IAAI,EAAE,oCAAoC,GAAG,KAAK,CAAC,MAAM,GAAG,4BAA4B,GAAG,QAAQ,GAAG,GAAG,EAAE,CAAC;CACxH,IAAI,OAAO,CAAC,CAAC;;CAEb,IAAI;;CAEJ,GAAG,OAAO,QAAQ,CAAC;;CAEnB,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,yBAAyB,EAAE,GAAG,EAAE,mBAAmB,GAAG;;CAEhE,EAAE,IAAI,QAAQ,CAAC;;CAEf,EAAE,KAAK,EAAE,GAAG,GAAG;;CAEf,GAAG,QAAQ,GAAG,cAAc,CAAC;;CAE7B,GAAG,MAAM,KAAK,GAAG,CAAC,SAAS,GAAG;;CAE9B,GAAG,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;;CAE3B,GAAG,MAAM,KAAK,GAAG,CAAC,mBAAmB,GAAG;;CAExC,GAAG,OAAO,CAAC,IAAI,EAAE,2HAA2H,EAAE,CAAC;CAC/I,GAAG,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;;CAEnC,GAAG;;CAEH;CACA,EAAE,KAAK,QAAQ,KAAK,cAAc,IAAI,mBAAmB,GAAG;;CAE5D,GAAG,QAAQ,GAAG,aAAa,CAAC;;CAE5B,GAAG;;CAEH,EAAE,OAAO,QAAQ,CAAC;;CAElB,EAAE;;CAEF,CAAC,IAAI,CAAC,aAAa,GAAG,WAAW,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,GAAG;;CAE1G,EAAE,IAAI,QAAQ,GAAG,SAAS,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;;CAE5C;CACA;;CAEA,EAAE,IAAI,QAAQ,GAAG,MAAM,CAAC,aAAa,GAAG,aAAa,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;CACpE,EAAE,IAAI,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC;;CAEzC,EAAE,KAAK,QAAQ,CAAC,SAAS,KAAK,IAAI,GAAG;;CAErC,GAAG,SAAS,GAAG,YAAY,CAAC,eAAe,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;;CAElE,GAAG,KAAK,SAAS,KAAK,QAAQ,CAAC,SAAS,GAAG;;CAE3C,IAAI,OAAO,CAAC,IAAI,EAAE,mCAAmC,EAAE,QAAQ,CAAC,SAAS,EAAE,sBAAsB,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;;CAE3H,IAAI;;CAEJ,GAAG;;CAEH,EAAE,IAAI,mBAAmB,GAAG,QAAQ,CAAC,eAAe,EAAE,CAAC;;CAEvD,EAAE,IAAI,UAAU,GAAG;;CAEnB,GAAG,QAAQ,EAAE,QAAQ;;CAErB,GAAG,SAAS,EAAE,SAAS;CACvB,GAAG,sBAAsB,EAAE,YAAY,CAAC,cAAc;CACtD,GAAG,cAAc,EAAE,yBAAyB,EAAE,EAAE,EAAE,mBAAmB,KAAK,IAAI,GAAG,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,WAAW,EAAE;CACpI,GAAG,GAAG,EAAE,CAAC,EAAE,QAAQ,CAAC,GAAG;CACvB,GAAG,WAAW,EAAE,yBAAyB,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,UAAU,EAAE;CAC9E,GAAG,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM;CAC7B,GAAG,UAAU,EAAE,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,OAAO;CACzD,GAAG,cAAc,EAAE,yBAAyB,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,EAAE;CACpF,GAAG,YAAY,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,KAAK,uBAAuB,QAAQ,QAAQ,CAAC,MAAM,CAAC,OAAO,KAAK,uBAAuB,EAAE,EAAE;CACjK,GAAG,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,QAAQ;CACjC,GAAG,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,KAAK;CAC3B,GAAG,WAAW,EAAE,CAAC,EAAE,QAAQ,CAAC,WAAW;CACvC,GAAG,mBAAmB,EAAE,yBAAyB,EAAE,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,UAAU,EAAE;CAC9F,GAAG,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,OAAO;CAC/B,GAAG,SAAS,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS;CACnC,GAAG,eAAe,EAAE,CAAC,EAAE,QAAQ,CAAC,eAAe;CAC/C,GAAG,YAAY,EAAE,CAAC,EAAE,QAAQ,CAAC,YAAY;CACzC,GAAG,YAAY,EAAE,CAAC,EAAE,QAAQ,CAAC,YAAY;CACzC,GAAG,WAAW,EAAE,CAAC,EAAE,QAAQ,CAAC,WAAW;CACvC,GAAG,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,QAAQ;;CAEjC,GAAG,WAAW,EAAE,CAAC,EAAE,QAAQ,CAAC,WAAW;;CAEvC,GAAG,OAAO,EAAE,QAAQ,CAAC,OAAO;;CAE5B,GAAG,YAAY,EAAE,QAAQ,CAAC,YAAY;;CAEtC,GAAG,GAAG,EAAE,CAAC,EAAE,GAAG;CACd,GAAG,MAAM,EAAE,QAAQ,CAAC,GAAG;CACvB,GAAG,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,SAAS,EAAE;;CAEnC,GAAG,WAAW,EAAE,QAAQ,CAAC,WAAW;;CAEpC,GAAG,eAAe,EAAE,QAAQ,CAAC,eAAe;CAC5C,GAAG,sBAAsB,EAAE,YAAY,CAAC,sBAAsB;;CAE9D,GAAG,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,QAAQ,GAAG,CAAC;CAC9C,GAAG,QAAQ,EAAE,QAAQ;CACrB,GAAG,gBAAgB,EAAE,YAAY,CAAC,mBAAmB;;CAErD,GAAG,YAAY,EAAE,QAAQ,CAAC,YAAY;CACtC,GAAG,YAAY,EAAE,QAAQ,CAAC,YAAY;CACtC,GAAG,eAAe,EAAE,QAAQ,CAAC,eAAe;CAC5C,GAAG,eAAe,EAAE,QAAQ,CAAC,eAAe;;CAE5C,GAAG,YAAY,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM;CAC1C,GAAG,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;CACtC,GAAG,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM;CACpC,GAAG,iBAAiB,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;CAC5C,GAAG,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM;;CAEpC,GAAG,iBAAiB,EAAE,WAAW;CACjC,GAAG,mBAAmB,EAAE,iBAAiB;;CAEzC,GAAG,SAAS,EAAE,QAAQ,CAAC,SAAS;;CAEhC,GAAG,gBAAgB,EAAE,QAAQ,CAAC,SAAS,CAAC,OAAO,IAAI,MAAM,CAAC,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;CAC7F,GAAG,aAAa,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI;;CAEzC,GAAG,WAAW,EAAE,QAAQ,CAAC,WAAW;CACpC,GAAG,uBAAuB,EAAE,QAAQ,CAAC,uBAAuB;;CAE5D,GAAG,kBAAkB,EAAE,QAAQ,CAAC,kBAAkB;;CAElD,GAAG,SAAS,EAAE,QAAQ,CAAC,SAAS;CAChC,GAAG,WAAW,EAAE,QAAQ,CAAC,IAAI,KAAK,UAAU;CAC5C,GAAG,SAAS,EAAE,QAAQ,CAAC,IAAI,KAAK,QAAQ;;CAExC,GAAG,YAAY,EAAE,EAAE,QAAQ,CAAC,YAAY,KAAK,SAAS,KAAK,QAAQ,CAAC,YAAY,GAAG,KAAK;;CAExF,GAAG,CAAC;;CAEJ,EAAE,OAAO,UAAU,CAAC;;CAEpB,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,cAAc,GAAG,WAAW,QAAQ,EAAE,UAAU,GAAG;;CAEzD,EAAE,IAAI,KAAK,GAAG,EAAE,CAAC;;CAEjB,EAAE,KAAK,UAAU,CAAC,QAAQ,GAAG;;CAE7B,GAAG,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC;;CAErC,GAAG,MAAM;;CAET,GAAG,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,cAAc,EAAE,CAAC;CACzC,GAAG,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,YAAY,EAAE,CAAC;;CAEvC,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,OAAO,KAAK,SAAS,GAAG;;CAExC,GAAG,MAAM,IAAI,IAAI,IAAI,QAAQ,CAAC,OAAO,GAAG;;CAExC,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;CACvB,IAAI,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;;CAE3C,IAAI;;CAEJ,GAAG;;CAEH,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAErD,GAAG,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;;CAEnD,GAAG;;CAEH,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,eAAe,CAAC,QAAQ,EAAE,EAAE,CAAC;;CAEpD,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC;;CAErC,EAAE,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;;CAEtB,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,cAAc,GAAG,WAAW,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,GAAG;;CAEvE,EAAE,IAAI,OAAO,CAAC;;CAEd;CACA,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAExD,GAAG,IAAI,WAAW,GAAG,QAAQ,EAAE,CAAC,EAAE,CAAC;;CAEnC,GAAG,KAAK,WAAW,CAAC,IAAI,KAAK,IAAI,GAAG;;CAEpC,IAAI,OAAO,GAAG,WAAW,CAAC;CAC1B,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC;;CAEzB,IAAI,MAAM;;CAEV,IAAI;;CAEJ,GAAG;;CAEH,EAAE,KAAK,OAAO,KAAK,SAAS,GAAG;;CAE/B,GAAG,OAAO,GAAG,IAAI,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;CAC1F,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;;CAE5B,GAAG;;CAEH,EAAE,OAAO,OAAO,CAAC;;CAEjB,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,cAAc,GAAG,WAAW,OAAO,GAAG;;CAE5C,EAAE,KAAK,GAAG,OAAO,CAAC,SAAS,KAAK,CAAC,GAAG;;CAEpC;CACA,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;CACvC,GAAG,QAAQ,EAAE,CAAC,EAAE,GAAG,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;CACnD,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC;;CAElB;CACA,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;;CAErB,GAAG;;CAEH,EAAE,CAAC;;CAEH;CACA,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;;CAE1B,CAAC;;CAED;CACA;CACA;;CAEA,SAAS,eAAe,GAAG;;CAE3B,CAAC,IAAI,UAAU,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEhC,CAAC,SAAS,GAAG,EAAE,MAAM,GAAG;;CAExB,EAAE,IAAI,GAAG,GAAG,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC;;CAErC,EAAE,KAAK,GAAG,KAAK,SAAS,GAAG;;CAE3B,GAAG,GAAG,GAAG,EAAE,CAAC;CACZ,GAAG,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;CAEjC,GAAG;;CAEH,EAAE,OAAO,GAAG,CAAC;;CAEb,EAAE;;CAEF,CAAC,SAAS,MAAM,EAAE,MAAM,GAAG;;CAE3B,EAAE,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;;CAE9B,EAAE;;CAEF,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,GAAG;;CAEvC,EAAE,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;;CAE1C,EAAE;;CAEF,CAAC,SAAS,OAAO,GAAG;;CAEpB,EAAE,UAAU,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE7B,EAAE;;CAEF,CAAC,OAAO;CACR,EAAE,GAAG,EAAE,GAAG;CACV,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,OAAO,EAAE,OAAO;CAClB,EAAE,CAAC;;CAEH,CAAC;;CAED;CACA;CACA;;CAEA,SAAS,iBAAiB,EAAE,CAAC,EAAE,CAAC,GAAG;;CAEnC,CAAC,KAAK,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW,GAAG;;CAExC,EAAE,OAAO,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC;;CAEvC,EAAE,MAAM,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,GAAG;;CAEjE,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;;CAErC,EAAE,MAAM,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,GAAG;;CAE/C,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;;CAEvC,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG;;CAE3B,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;CAEnB,EAAE,MAAM;;CAER,EAAE,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;;CAErB,EAAE;;CAEF,CAAC;;CAED,SAAS,wBAAwB,EAAE,CAAC,EAAE,CAAC,GAAG;;CAE1C,CAAC,KAAK,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW,GAAG;;CAExC,EAAE,OAAO,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC;;CAEvC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG;;CAEtB,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;CAEnB,EAAE,MAAM;;CAER,EAAE,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;;CAErB,EAAE;;CAEF,CAAC;;CAED,SAAS,eAAe,GAAG;;CAE3B,CAAC,IAAI,WAAW,GAAG,EAAE,CAAC;CACtB,CAAC,IAAI,gBAAgB,GAAG,CAAC,CAAC;;CAE1B,CAAC,IAAI,MAAM,GAAG,EAAE,CAAC;CACjB,CAAC,IAAI,WAAW,GAAG,EAAE,CAAC;;CAEtB,CAAC,SAAS,IAAI,GAAG;;CAEjB,EAAE,gBAAgB,GAAG,CAAC,CAAC;;CAEvB,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;CACpB,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;;CAEzB,EAAE;;CAEF,CAAC,SAAS,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,GAAG;;CAEvD,EAAE,IAAI,UAAU,GAAG,WAAW,EAAE,gBAAgB,EAAE,CAAC;;CAEnD,EAAE,KAAK,UAAU,KAAK,SAAS,GAAG;;CAElC,GAAG,UAAU,GAAG;CAChB,IAAI,EAAE,EAAE,MAAM,CAAC,EAAE;CACjB,IAAI,MAAM,EAAE,MAAM;CAClB,IAAI,QAAQ,EAAE,QAAQ;CACtB,IAAI,QAAQ,EAAE,QAAQ;CACtB,IAAI,OAAO,EAAE,QAAQ,CAAC,OAAO;CAC7B,IAAI,WAAW,EAAE,MAAM,CAAC,WAAW;CACnC,IAAI,CAAC,EAAE,CAAC;CACR,IAAI,KAAK,EAAE,KAAK;CAChB,IAAI,CAAC;;CAEL,GAAG,WAAW,EAAE,gBAAgB,EAAE,GAAG,UAAU,CAAC;;CAEhD,GAAG,MAAM;;CAET,GAAG,UAAU,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;CAC7B,GAAG,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC;CAC9B,GAAG,UAAU,CAAC,QAAQ,GAAG,QAAQ,CAAC;CAClC,GAAG,UAAU,CAAC,QAAQ,GAAG,QAAQ,CAAC;CAClC,GAAG,UAAU,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;CACzC,GAAG,UAAU,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;CAC/C,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;CACpB,GAAG,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC;;CAE5B,GAAG;;CAEH,EAAE,EAAE,QAAQ,CAAC,WAAW,KAAK,IAAI,GAAG,WAAW,GAAG,MAAM,GAAG,IAAI,EAAE,UAAU,EAAE,CAAC;;CAE9E,EAAE,gBAAgB,GAAG,CAAC;;CAEtB,EAAE;;CAEF,CAAC,SAAS,IAAI,GAAG;;CAEjB,EAAE,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,iBAAiB,EAAE,CAAC;CAC5D,EAAE,KAAK,WAAW,CAAC,MAAM,GAAG,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,wBAAwB,EAAE,CAAC;;CAE7E,EAAE;;CAEF,CAAC,OAAO;CACR,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,WAAW,EAAE,WAAW;;CAE1B,EAAE,IAAI,EAAE,IAAI;CACZ,EAAE,IAAI,EAAE,IAAI;;CAEZ,EAAE,IAAI,EAAE,IAAI;CACZ,EAAE,CAAC;;CAEH,CAAC;;CAED,SAAS,gBAAgB,GAAG;;CAE5B,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;;CAEhB,CAAC,SAAS,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG;;CAE/B,EAAE,IAAI,IAAI,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,MAAM,CAAC,EAAE,CAAC;CACxC,EAAE,IAAI,IAAI,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;;CAE3B,EAAE,KAAK,IAAI,KAAK,SAAS,GAAG;;CAE5B;;CAEA,GAAG,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;CAChC,GAAG,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;;CAExB,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,SAAS,OAAO,GAAG;;CAEpB,EAAE,KAAK,GAAG,EAAE,CAAC;;CAEb,EAAE;;CAEF,CAAC,OAAO;CACR,EAAE,GAAG,EAAE,GAAG;CACV,EAAE,OAAO,EAAE,OAAO;CAClB,EAAE,CAAC;;CAEH,CAAC;;CAED;CACA;CACA;;CAEA,SAAS,aAAa,GAAG;;CAEzB,CAAC,IAAI,MAAM,GAAG,EAAE,CAAC;;CAEjB,CAAC,OAAO;;CAER,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,KAAK,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,SAAS,GAAG;;CAE3C,IAAI,OAAO,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;;CAE9B,IAAI;;CAEJ,GAAG,IAAI,QAAQ,CAAC;;CAEhB,GAAG,SAAS,KAAK,CAAC,IAAI;;CAEtB,IAAI,KAAK,kBAAkB;CAC3B,KAAK,QAAQ,GAAG;CAChB,MAAM,SAAS,EAAE,IAAI,OAAO,EAAE;CAC9B,MAAM,KAAK,EAAE,IAAI,KAAK,EAAE;;CAExB,MAAM,MAAM,EAAE,KAAK;CACnB,MAAM,UAAU,EAAE,CAAC;CACnB,MAAM,YAAY,EAAE,CAAC;CACrB,MAAM,aAAa,EAAE,IAAI,OAAO,EAAE;CAClC,MAAM,CAAC;CACP,KAAK,MAAM;;CAEX,IAAI,KAAK,WAAW;CACpB,KAAK,QAAQ,GAAG;CAChB,MAAM,QAAQ,EAAE,IAAI,OAAO,EAAE;CAC7B,MAAM,SAAS,EAAE,IAAI,OAAO,EAAE;CAC9B,MAAM,KAAK,EAAE,IAAI,KAAK,EAAE;CACxB,MAAM,QAAQ,EAAE,CAAC;CACjB,MAAM,OAAO,EAAE,CAAC;CAChB,MAAM,WAAW,EAAE,CAAC;CACpB,MAAM,KAAK,EAAE,CAAC;;CAEd,MAAM,MAAM,EAAE,KAAK;CACnB,MAAM,UAAU,EAAE,CAAC;CACnB,MAAM,YAAY,EAAE,CAAC;CACrB,MAAM,aAAa,EAAE,IAAI,OAAO,EAAE;CAClC,MAAM,CAAC;CACP,KAAK,MAAM;;CAEX,IAAI,KAAK,YAAY;CACrB,KAAK,QAAQ,GAAG;CAChB,MAAM,QAAQ,EAAE,IAAI,OAAO,EAAE;CAC7B,MAAM,KAAK,EAAE,IAAI,KAAK,EAAE;CACxB,MAAM,QAAQ,EAAE,CAAC;CACjB,MAAM,KAAK,EAAE,CAAC;;CAEd,MAAM,MAAM,EAAE,KAAK;CACnB,MAAM,UAAU,EAAE,CAAC;CACnB,MAAM,YAAY,EAAE,CAAC;CACrB,MAAM,aAAa,EAAE,IAAI,OAAO,EAAE;CAClC,MAAM,gBAAgB,EAAE,CAAC;CACzB,MAAM,eAAe,EAAE,IAAI;CAC3B,MAAM,CAAC;CACP,KAAK,MAAM;;CAEX,IAAI,KAAK,iBAAiB;CAC1B,KAAK,QAAQ,GAAG;CAChB,MAAM,SAAS,EAAE,IAAI,OAAO,EAAE;CAC9B,MAAM,QAAQ,EAAE,IAAI,KAAK,EAAE;CAC3B,MAAM,WAAW,EAAE,IAAI,KAAK,EAAE;CAC9B,MAAM,CAAC;CACP,KAAK,MAAM;;CAEX,IAAI,KAAK,eAAe;CACxB,KAAK,QAAQ,GAAG;CAChB,MAAM,KAAK,EAAE,IAAI,KAAK,EAAE;CACxB,MAAM,QAAQ,EAAE,IAAI,OAAO,EAAE;CAC7B,MAAM,SAAS,EAAE,IAAI,OAAO,EAAE;CAC9B,MAAM,UAAU,EAAE,IAAI,OAAO,EAAE;CAC/B;CACA,MAAM,CAAC;CACP,KAAK,MAAM;;CAEX,IAAI;;CAEJ,GAAG,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,QAAQ,CAAC;;CAEjC,GAAG,OAAO,QAAQ,CAAC;;CAEnB,GAAG;;CAEH,EAAE,CAAC;;CAEH,CAAC;;CAED,IAAI,KAAK,GAAG,CAAC,CAAC;;CAEd,SAAS,WAAW,GAAG;;CAEvB,CAAC,IAAI,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC;;CAEjC,CAAC,IAAI,KAAK,GAAG;;CAEb,EAAE,EAAE,EAAE,KAAK,GAAG;;CAEd,EAAE,IAAI,EAAE,EAAE;;CAEV,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;CACtB,EAAE,WAAW,EAAE,EAAE;CACjB,EAAE,oBAAoB,EAAE,EAAE;CAC1B,EAAE,uBAAuB,EAAE,EAAE;CAC7B,EAAE,IAAI,EAAE,EAAE;CACV,EAAE,aAAa,EAAE,EAAE;CACnB,EAAE,gBAAgB,EAAE,EAAE;CACtB,EAAE,QAAQ,EAAE,EAAE;CACd,EAAE,KAAK,EAAE,EAAE;CACX,EAAE,cAAc,EAAE,EAAE;CACpB,EAAE,iBAAiB,EAAE,EAAE;CACvB,EAAE,IAAI,EAAE,EAAE;;CAEV,EAAE,CAAC;;CAEH,CAAC,IAAI,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;CAC7B,CAAC,IAAI,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;CAC7B,CAAC,IAAI,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE9B,CAAC,SAAS,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG;;CAE3C,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;;CAE1B,EAAE,IAAI,iBAAiB,GAAG,CAAC,CAAC;CAC5B,EAAE,IAAI,WAAW,GAAG,CAAC,CAAC;CACtB,EAAE,IAAI,UAAU,GAAG,CAAC,CAAC;CACrB,EAAE,IAAI,cAAc,GAAG,CAAC,CAAC;CACzB,EAAE,IAAI,UAAU,GAAG,CAAC,CAAC;;CAErB,EAAE,IAAI,UAAU,GAAG,MAAM,CAAC,kBAAkB,CAAC;;CAE7C,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEpD,GAAG,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC;;CAE3B,GAAG,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;CAC3B,GAAG,IAAI,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;CACnC,GAAG,IAAI,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;;CAEjC,GAAG,IAAI,SAAS,GAAG,EAAE,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;;CAE1F,GAAG,KAAK,KAAK,CAAC,cAAc,GAAG;;CAE/B,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,SAAS,CAAC;CAC7B,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,SAAS,CAAC;CAC7B,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,SAAS,CAAC;;CAE7B,IAAI,MAAM,KAAK,KAAK,CAAC,kBAAkB,GAAG;;CAE1C,IAAI,IAAI,QAAQ,GAAG,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;;CAEtC,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,cAAc,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;CACzE,IAAI,QAAQ,CAAC,SAAS,CAAC,qBAAqB,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;CAClE,IAAI,OAAO,CAAC,qBAAqB,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;CAC9D,IAAI,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;CACtC,IAAI,QAAQ,CAAC,SAAS,CAAC,kBAAkB,EAAE,UAAU,EAAE,CAAC;;CAExD,IAAI,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC;;CAEvC,IAAI,KAAK,KAAK,CAAC,UAAU,GAAG;;CAE5B,KAAK,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;;CAE/B,KAAK,QAAQ,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;CACvC,KAAK,QAAQ,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;CAC3C,KAAK,QAAQ,CAAC,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC;;CAE7C,KAAK;;CAEL,IAAI,KAAK,CAAC,oBAAoB,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;CAChE,IAAI,KAAK,CAAC,uBAAuB,EAAE,iBAAiB,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;CAC7E,IAAI,KAAK,CAAC,WAAW,EAAE,iBAAiB,EAAE,GAAG,QAAQ,CAAC;;CAEtD,IAAI,iBAAiB,GAAG,CAAC;;CAEzB,IAAI,MAAM,KAAK,KAAK,CAAC,WAAW,GAAG;;CAEnC,IAAI,IAAI,QAAQ,GAAG,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;;CAEtC,IAAI,QAAQ,CAAC,QAAQ,CAAC,qBAAqB,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;CACjE,IAAI,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,UAAU,EAAE,CAAC;;CAEjD,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,cAAc,EAAE,SAAS,EAAE,CAAC;CAC7D,IAAI,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;;CAEjC,IAAI,QAAQ,CAAC,SAAS,CAAC,qBAAqB,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;CAClE,IAAI,OAAO,CAAC,qBAAqB,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;CAC9D,IAAI,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;CACtC,IAAI,QAAQ,CAAC,SAAS,CAAC,kBAAkB,EAAE,UAAU,EAAE,CAAC;;CAExD,IAAI,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;CAC/C,IAAI,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;CAC5E,IAAI,QAAQ,CAAC,KAAK,GAAG,EAAE,KAAK,CAAC,QAAQ,KAAK,CAAC,KAAK,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC;;CAElE,IAAI,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC;;CAEvC,IAAI,KAAK,KAAK,CAAC,UAAU,GAAG;;CAE5B,KAAK,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;;CAE/B,KAAK,QAAQ,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;CACvC,KAAK,QAAQ,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;CAC3C,KAAK,QAAQ,CAAC,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC;;CAE7C,KAAK;;CAEL,IAAI,KAAK,CAAC,aAAa,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC;CAClD,IAAI,KAAK,CAAC,gBAAgB,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;CAC/D,IAAI,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,QAAQ,CAAC;;CAExC,IAAI,UAAU,GAAG,CAAC;;CAElB,IAAI,MAAM,KAAK,KAAK,CAAC,eAAe,GAAG;;CAEvC,IAAI,IAAI,QAAQ,GAAG,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;;CAEtC;CACA;;CAEA;CACA,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,cAAc,EAAE,SAAS,EAAE,CAAC;;CAE7D,IAAI,QAAQ,CAAC,QAAQ,CAAC,qBAAqB,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;CACjE,IAAI,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,UAAU,EAAE,CAAC;;CAEjD;CACA,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;CACxB,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;CACtC,IAAI,OAAO,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC;CACtC,IAAI,QAAQ,CAAC,eAAe,EAAE,OAAO,EAAE,CAAC;;CAExC,IAAI,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CAC1D,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;;CAE5D,IAAI,QAAQ,CAAC,SAAS,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAC;CAChD,IAAI,QAAQ,CAAC,UAAU,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAC;;CAEjD;CACA;;CAEA,IAAI,KAAK,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,QAAQ,CAAC;;CAEhD,IAAI,cAAc,GAAG,CAAC;;CAEtB,IAAI,MAAM,KAAK,KAAK,CAAC,YAAY,GAAG;;CAEpC,IAAI,IAAI,QAAQ,GAAG,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;;CAEtC,IAAI,QAAQ,CAAC,QAAQ,CAAC,qBAAqB,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;CACjE,IAAI,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,UAAU,EAAE,CAAC;;CAEjD,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,cAAc,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;CACzE,IAAI,QAAQ,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;CACvC,IAAI,QAAQ,CAAC,KAAK,GAAG,EAAE,KAAK,CAAC,QAAQ,KAAK,CAAC,KAAK,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC;;CAElE,IAAI,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC;;CAEvC,IAAI,KAAK,KAAK,CAAC,UAAU,GAAG;;CAE5B,KAAK,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;;CAE/B,KAAK,QAAQ,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;CACvC,KAAK,QAAQ,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;CAC3C,KAAK,QAAQ,CAAC,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC;CAC7C,KAAK,QAAQ,CAAC,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;CACpD,KAAK,QAAQ,CAAC,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;;CAElD,KAAK;;CAEL,IAAI,KAAK,CAAC,cAAc,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;CACpD,IAAI,KAAK,CAAC,iBAAiB,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;CACjE,IAAI,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,QAAQ,CAAC;;CAE1C,IAAI,WAAW,GAAG,CAAC;;CAEnB,IAAI,MAAM,KAAK,KAAK,CAAC,iBAAiB,GAAG;;CAEzC,IAAI,IAAI,QAAQ,GAAG,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;;CAEtC,IAAI,QAAQ,CAAC,SAAS,CAAC,qBAAqB,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;CAClE,IAAI,QAAQ,CAAC,SAAS,CAAC,kBAAkB,EAAE,UAAU,EAAE,CAAC;CACxD,IAAI,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;;CAEnC,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,cAAc,EAAE,SAAS,EAAE,CAAC;CACtE,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,cAAc,EAAE,SAAS,EAAE,CAAC;;CAE/E,IAAI,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,QAAQ,CAAC;;CAExC,IAAI,UAAU,GAAG,CAAC;;CAElB,IAAI;;CAEJ,GAAG;;CAEH,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;CACzB,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;CACzB,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;;CAEzB,EAAE,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,iBAAiB,CAAC;CAC/C,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;CACjC,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,cAAc,CAAC;CACzC,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,WAAW,CAAC;CACnC,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;;CAEjC,EAAE,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,iBAAiB,GAAG,GAAG,GAAG,WAAW,GAAG,GAAG,GAAG,UAAU,GAAG,GAAG,GAAG,cAAc,GAAG,GAAG,GAAG,UAAU,GAAG,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;;CAE1J,EAAE;;CAEF,CAAC,OAAO;CACR,EAAE,KAAK,EAAE,KAAK;CACd,EAAE,KAAK,EAAE,KAAK;CACd,EAAE,CAAC;;CAEH,CAAC;;CAED;CACA;CACA;;CAEA,SAAS,gBAAgB,GAAG;;CAE5B,CAAC,IAAI,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;;CAEhC,CAAC,IAAI,WAAW,GAAG,EAAE,CAAC;CACtB,CAAC,IAAI,YAAY,GAAG,EAAE,CAAC;CACvB,CAAC,IAAI,YAAY,GAAG,EAAE,CAAC;;CAEvB,CAAC,SAAS,IAAI,GAAG;;CAEjB,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;CACzB,EAAE,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;CAC1B,EAAE,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;;CAE1B,EAAE;;CAEF,CAAC,SAAS,SAAS,EAAE,KAAK,GAAG;;CAE7B,EAAE,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;;CAE5B,EAAE;;CAEF,CAAC,SAAS,UAAU,EAAE,WAAW,GAAG;;CAEpC,EAAE,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC;;CAEnC,EAAE;;CAEF,CAAC,SAAS,UAAU,EAAE,WAAW,GAAG;;CAEpC,EAAE,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC;;CAEnC,EAAE;;CAEF,CAAC,SAAS,WAAW,EAAE,MAAM,GAAG;;CAEhC,EAAE,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;;CAEpD,EAAE;;CAEF,CAAC,IAAI,KAAK,GAAG;CACb,EAAE,WAAW,EAAE,WAAW;CAC1B,EAAE,YAAY,EAAE,YAAY;CAC5B,EAAE,YAAY,EAAE,YAAY;;CAE5B,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,CAAC;;CAEH,CAAC,OAAO;CACR,EAAE,IAAI,EAAE,IAAI;CACZ,EAAE,KAAK,EAAE,KAAK;CACd,EAAE,WAAW,EAAE,WAAW;;CAE1B,EAAE,SAAS,EAAE,SAAS;CACtB,EAAE,UAAU,EAAE,UAAU;CACxB,EAAE,UAAU,EAAE,UAAU;CACxB,EAAE,CAAC;;CAEH,CAAC;;CAED,SAAS,iBAAiB,GAAG;;CAE7B,CAAC,IAAI,YAAY,GAAG,EAAE,CAAC;;CAEvB,CAAC,SAAS,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG;;CAE/B,EAAE,IAAI,IAAI,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,MAAM,CAAC,EAAE,CAAC;;CAExC,EAAE,IAAI,WAAW,GAAG,YAAY,EAAE,IAAI,EAAE,CAAC;;CAEzC,EAAE,KAAK,WAAW,KAAK,SAAS,GAAG;;CAEnC,GAAG,WAAW,GAAG,IAAI,gBAAgB,EAAE,CAAC;CACxC,GAAG,YAAY,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC;;CAEtC,GAAG;;CAEH,EAAE,OAAO,WAAW,CAAC;;CAErB,EAAE;;CAEF,CAAC,SAAS,OAAO,GAAG;;CAEpB,EAAE,YAAY,GAAG,EAAE,CAAC;;CAEpB,EAAE;;CAEF,CAAC,OAAO;CACR,EAAE,GAAG,EAAE,GAAG;CACV,EAAE,OAAO,EAAE,OAAO;CAClB,EAAE,CAAC;;CAEH,CAAC;;CAED;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,iBAAiB,EAAE,UAAU,GAAG;;CAEzC,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;;CAEjC,CAAC,IAAI,CAAC,YAAY,GAAG,iBAAiB,CAAC;;CAEvC,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;CACvB,CAAC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;;CAE3B,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;;CAEjB,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;;CAEtB,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;CAC7B,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;CAC5B,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;;CAE3B,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;CACxB,CAAC,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;;CAE7B,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC;CAClB,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;;CAErB,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC;;CAE9B,CAAC;;CAED,iBAAiB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CAClE,iBAAiB,CAAC,SAAS,CAAC,WAAW,GAAG,iBAAiB,CAAC;;CAE5D,iBAAiB,CAAC,SAAS,CAAC,mBAAmB,GAAG,IAAI,CAAC;;CAEvD,iBAAiB,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW,MAAM,GAAG;;CAEvD,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE9C,CAAC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;;CAEzC,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;CACjC,CAAC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;;CAEzC,CAAC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;;CAEvB,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;;CAEjC,CAAC,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;CAC/C,CAAC,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;CACnD,CAAC,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;;CAEjD,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;CACnC,CAAC,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;;CAErD,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,oBAAoB,EAAE,UAAU,GAAG;;CAE5C,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;;CAEpC,CAAC,IAAI,CAAC,iBAAiB,GAAG,IAAI,OAAO,EAAE,CAAC;CACxC,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;CACvB,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEzB,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;CACvB,CAAC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;;CAE3B,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;;CAEjB,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;;CAEtB,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;CAC7B,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;CAC5B,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;;CAE3B,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC;CAClB,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;;CAErB,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC;;CAE9B,CAAC;;CAED,oBAAoB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CACrE,oBAAoB,CAAC,SAAS,CAAC,WAAW,GAAG,oBAAoB,CAAC;;CAElE,oBAAoB,CAAC,SAAS,CAAC,sBAAsB,GAAG,IAAI,CAAC;;CAE7D,oBAAoB,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW,MAAM,GAAG;;CAE1D,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE9C,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,iBAAiB,EAAE,CAAC;CACzD,CAAC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;CACzC,CAAC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;;CAEvC,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;CACjC,CAAC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;;CAEzC,CAAC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;;CAEvB,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;;CAEjC,CAAC,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;CAC/C,CAAC,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;CACnD,CAAC,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;;CAEjD,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF;CACA;CACA;CACA;;CAEA,SAAS,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,GAAG;;CAE/D,CAAC,IAAI,QAAQ,GAAG,IAAI,OAAO,EAAE;CAC7B,EAAE,iBAAiB,GAAG,IAAI,OAAO,EAAE;;CAEnC,EAAE,cAAc,GAAG,IAAI,OAAO,EAAE;CAChC,EAAE,iBAAiB,GAAG,IAAI,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE;;CAEnE,EAAE,WAAW,GAAG,IAAI,OAAO,EAAE;CAC7B,EAAE,mBAAmB,GAAG,IAAI,OAAO,EAAE;;CAErC,EAAE,aAAa,GAAG,CAAC;CACnB,EAAE,aAAa,GAAG,CAAC;;CAEnB,EAAE,yBAAyB,GAAG,EAAE,aAAa,GAAG,aAAa,KAAK,CAAC;;CAEnE,EAAE,eAAe,GAAG,IAAI,KAAK,EAAE,yBAAyB,EAAE;CAC1D,EAAE,kBAAkB,GAAG,IAAI,KAAK,EAAE,yBAAyB,EAAE;;CAE7D,EAAE,cAAc,GAAG,EAAE,CAAC;;CAEtB,CAAC,IAAI,UAAU,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC;;CAE/D,CAAC,IAAI,cAAc,GAAG;CACtB,EAAE,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;CAC1E,EAAE,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;CAC5E,EAAE,CAAC;;CAEH,CAAC,IAAI,OAAO,GAAG;CACf,EAAE,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;CACxE,EAAE,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE;CAC1E,EAAE,CAAC;;CAEH,CAAC,IAAI,eAAe,GAAG;CACvB,EAAE,IAAI,OAAO,EAAE,EAAE,IAAI,OAAO,EAAE,EAAE,IAAI,OAAO,EAAE;CAC7C,EAAE,IAAI,OAAO,EAAE,EAAE,IAAI,OAAO,EAAE,EAAE,IAAI,OAAO,EAAE;CAC7C,EAAE,CAAC;;CAEH;;CAEA,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,yBAAyB,EAAE,GAAG,CAAC,GAAG;;CAE1D,EAAE,IAAI,WAAW,GAAG,EAAE,CAAC,GAAG,aAAa,OAAO,CAAC,CAAC;CAChD,EAAE,IAAI,WAAW,GAAG,EAAE,CAAC,GAAG,aAAa,OAAO,CAAC,CAAC;;CAEhD,EAAE,IAAI,aAAa,GAAG,IAAI,iBAAiB,EAAE;;CAE7C,GAAG,YAAY,EAAE,gBAAgB;;CAEjC,GAAG,YAAY,EAAE,WAAW;CAC5B,GAAG,QAAQ,EAAE,WAAW;;CAExB,GAAG,EAAE,CAAC;;CAEN,EAAE,eAAe,EAAE,CAAC,EAAE,GAAG,aAAa,CAAC;;CAEvC;;CAEA,EAAE,IAAI,gBAAgB,GAAG,IAAI,oBAAoB,EAAE;;CAEnD,GAAG,YAAY,EAAE,WAAW;CAC5B,GAAG,QAAQ,EAAE,WAAW;;CAExB,GAAG,EAAE,CAAC;;CAEN,EAAE,kBAAkB,EAAE,CAAC,EAAE,GAAG,gBAAgB,CAAC;;CAE7C,EAAE;;CAEF;;CAEA,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC;;CAElB,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;;CAEtB,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;CACxB,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;;CAE1B,CAAC,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;;CAE1B,CAAC,IAAI,CAAC,MAAM,GAAG,WAAW,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;;CAElD,EAAE,KAAK,KAAK,CAAC,OAAO,KAAK,KAAK,GAAG,OAAO;CACxC,EAAE,KAAK,KAAK,CAAC,UAAU,KAAK,KAAK,IAAI,KAAK,CAAC,WAAW,KAAK,KAAK,GAAG,OAAO;;CAE1E,EAAE,KAAK,MAAM,CAAC,MAAM,KAAK,CAAC,GAAG,OAAO;;CAEpC;CACA,EAAE,IAAI,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC;CAC9B,EAAE,IAAI,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC;;CAE/B;CACA,EAAE,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;CAC9B,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC9C,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;CACvC,EAAE,MAAM,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC;;CAEjC;;CAEA,EAAE,IAAI,SAAS,CAAC;;CAEhB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEtD,GAAG,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC;CAC3B,GAAG,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;CAC7B,GAAG,IAAI,YAAY,GAAG,KAAK,IAAI,KAAK,CAAC,YAAY,CAAC;;CAElD,GAAG,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE/B,IAAI,OAAO,CAAC,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;CACrE,IAAI,SAAS;;CAEb,IAAI;;CAEJ,GAAG,IAAI,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;;CAEpC,GAAG,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;CACzC,GAAG,cAAc,CAAC,GAAG,EAAE,iBAAiB,EAAE,CAAC;;CAE3C,GAAG,KAAK,YAAY,GAAG;;CAEvB,IAAI,IAAI,OAAO,GAAG,cAAc,CAAC,CAAC,CAAC;CACnC,IAAI,IAAI,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC;;CAEpC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA;CACA,IAAI,eAAe,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,GAAG,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;CACzE;CACA,IAAI,eAAe,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;CAC/D;CACA,IAAI,eAAe,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,GAAG,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;CACzE;CACA,IAAI,eAAe,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;CACrE;CACA,IAAI,eAAe,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,GAAG,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;CAClE;CACA,IAAI,eAAe,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;;CAE9D,IAAI,cAAc,CAAC,CAAC,IAAI,GAAG,CAAC;CAC5B,IAAI,cAAc,CAAC,CAAC,IAAI,GAAG,CAAC;;CAE5B,IAAI;;CAEJ,GAAG,KAAK,MAAM,CAAC,GAAG,KAAK,IAAI,GAAG;;CAE9B,IAAI,IAAI,IAAI,GAAG,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;;CAE1F,IAAI,MAAM,CAAC,GAAG,GAAG,IAAI,iBAAiB,EAAE,cAAc,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;CACnF,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,YAAY,CAAC;;CAExD,IAAI,YAAY,CAAC,sBAAsB,EAAE,CAAC;;CAE1C,IAAI;;CAEJ,GAAG,KAAK,MAAM,CAAC,iBAAiB,GAAG;;CAEnC,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;;CAE3B,IAAI;;CAEJ,GAAG,IAAI,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC;CAC9B,GAAG,IAAI,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;;CAEpC,GAAG,mBAAmB,CAAC,qBAAqB,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;CAClE,GAAG,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,mBAAmB,EAAE,CAAC;;CAErD,GAAG,KAAK,YAAY,GAAG;;CAEvB,IAAI,SAAS,GAAG,CAAC,CAAC;;CAElB;CACA;;CAEA,IAAI,YAAY,CAAC,eAAe,EAAE,EAAE,mBAAmB,CAAC,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC;;CAE9G,IAAI,MAAM;;CAEV,IAAI,SAAS,GAAG,CAAC,CAAC;;CAElB,IAAI,WAAW,CAAC,qBAAqB,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;CAClE,IAAI,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;CACvC,IAAI,YAAY,CAAC,iBAAiB,EAAE,CAAC;;CAErC;;CAEA,IAAI,YAAY,CAAC,GAAG;CACpB,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;CACvB,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;CACvB,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;CACvB,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;CACvB,KAAK,CAAC;;CAEN,IAAI,YAAY,CAAC,QAAQ,EAAE,YAAY,CAAC,gBAAgB,EAAE,CAAC;CAC3D,IAAI,YAAY,CAAC,QAAQ,EAAE,YAAY,CAAC,kBAAkB,EAAE,CAAC;;CAE7D,IAAI;;CAEJ,GAAG,SAAS,CAAC,eAAe,EAAE,SAAS,EAAE,CAAC;CAC1C,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;;CAErB;CACA;;CAEA,GAAG,MAAM,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,SAAS,EAAE,IAAI,GAAG,GAAG;;CAEnD,IAAI,KAAK,YAAY,GAAG;;CAExB,KAAK,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,QAAQ,EAAE,CAAC;CAC/C,KAAK,WAAW,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,CAAC;CAC/C,KAAK,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;CAC7C,KAAK,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;CACxC,KAAK,YAAY,CAAC,iBAAiB,EAAE,CAAC;;CAEtC,KAAK,IAAI,YAAY,GAAG,eAAe,EAAE,IAAI,EAAE,CAAC;CAChD,KAAK,MAAM,CAAC,QAAQ,EAAE,YAAY,EAAE,CAAC;;CAErC,KAAK;;CAEL;;CAEA,IAAI,iBAAiB,CAAC,gBAAgB,EAAE,YAAY,CAAC,gBAAgB,EAAE,YAAY,CAAC,kBAAkB,EAAE,CAAC;CACzG,IAAI,QAAQ,CAAC,aAAa,EAAE,iBAAiB,EAAE,CAAC;;CAEhD;;CAEA,IAAI,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;;CAE9D,IAAI;;CAEJ,GAAG;;CAEH,EAAE,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;;CAE5B,EAAE,CAAC;;CAEH,CAAC,SAAS,gBAAgB,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,GAAG;;CAEpH,EAAE,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;;CAEjC,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC;;CAEpB,EAAE,IAAI,gBAAgB,GAAG,eAAe,CAAC;CACzC,EAAE,IAAI,cAAc,GAAG,MAAM,CAAC,mBAAmB,CAAC;;CAElD,EAAE,KAAK,YAAY,GAAG;;CAEtB,GAAG,gBAAgB,GAAG,kBAAkB,CAAC;CACzC,GAAG,cAAc,GAAG,MAAM,CAAC,sBAAsB,CAAC;;CAElD,GAAG;;CAEH,EAAE,KAAK,EAAE,cAAc,GAAG;;CAE1B,GAAG,IAAI,WAAW,GAAG,KAAK,CAAC;;CAE3B,GAAG,KAAK,QAAQ,CAAC,YAAY,GAAG;;CAEhC,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,gBAAgB,GAAG;;CAEjD,KAAK,WAAW,GAAG,QAAQ,CAAC,eAAe,IAAI,QAAQ,CAAC,eAAe,CAAC,QAAQ,IAAI,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;;CAEjI,KAAK,MAAM,KAAK,QAAQ,IAAI,QAAQ,CAAC,UAAU,GAAG;;CAElD,KAAK,WAAW,GAAG,QAAQ,CAAC,YAAY,IAAI,QAAQ,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;;CAE7E,KAAK;;CAEL,IAAI;;CAEJ,GAAG,KAAK,MAAM,CAAC,aAAa,IAAI,QAAQ,CAAC,QAAQ,KAAK,KAAK,GAAG;;CAE9D,IAAI,OAAO,CAAC,IAAI,EAAE,8EAA8E,EAAE,MAAM,EAAE,CAAC;;CAE3G,IAAI;;CAEJ,GAAG,IAAI,WAAW,GAAG,MAAM,CAAC,aAAa,IAAI,QAAQ,CAAC,QAAQ,CAAC;;CAE/D,GAAG,IAAI,YAAY,GAAG,CAAC,CAAC;;CAExB,GAAG,KAAK,WAAW,GAAG,YAAY,IAAI,aAAa,CAAC;CACpD,GAAG,KAAK,WAAW,GAAG,YAAY,IAAI,aAAa,CAAC;;CAEpD,GAAG,MAAM,GAAG,gBAAgB,EAAE,YAAY,EAAE,CAAC;;CAE7C,GAAG,MAAM;;CAET,GAAG,MAAM,GAAG,cAAc,CAAC;;CAE3B,GAAG;;CAEH,EAAE,KAAK,SAAS,CAAC,oBAAoB;CACrC,IAAI,QAAQ,CAAC,WAAW,KAAK,IAAI;CACjC,IAAI,QAAQ,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,GAAG;;CAE3C;CACA;;CAEA,GAAG,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;;CAEhD,GAAG,IAAI,mBAAmB,GAAG,cAAc,EAAE,IAAI,EAAE,CAAC;;CAEpD,GAAG,KAAK,mBAAmB,KAAK,SAAS,GAAG;;CAE5C,IAAI,mBAAmB,GAAG,EAAE,CAAC;CAC7B,IAAI,cAAc,EAAE,IAAI,EAAE,GAAG,mBAAmB,CAAC;;CAEjD,IAAI;;CAEJ,GAAG,IAAI,cAAc,GAAG,mBAAmB,EAAE,IAAI,EAAE,CAAC;;CAEpD,GAAG,KAAK,cAAc,KAAK,SAAS,GAAG;;CAEvC,IAAI,cAAc,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;CACpC,IAAI,mBAAmB,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC;;CAEjD,IAAI;;CAEJ,GAAG,MAAM,GAAG,cAAc,CAAC;;CAE3B,GAAG;;CAEH,EAAE,MAAM,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;CACpC,EAAE,MAAM,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;;CAExC,EAAE,MAAM,CAAC,IAAI,GAAG,EAAE,QAAQ,CAAC,UAAU,IAAI,IAAI,KAAK,QAAQ,CAAC,UAAU,GAAG,UAAU,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;;CAEpG,EAAE,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;CAC5C,EAAE,MAAM,CAAC,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC;CAClD,EAAE,MAAM,CAAC,gBAAgB,GAAG,QAAQ,CAAC,gBAAgB,CAAC;;CAEtD,EAAE,MAAM,CAAC,kBAAkB,GAAG,QAAQ,CAAC,kBAAkB,CAAC;CAC1D,EAAE,MAAM,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;;CAExC,EAAE,KAAK,YAAY,IAAI,MAAM,CAAC,sBAAsB,GAAG;;CAEvD,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,EAAE,CAAC;CACvD,GAAG,MAAM,CAAC,YAAY,GAAG,gBAAgB,CAAC;CAC1C,GAAG,MAAM,CAAC,WAAW,GAAG,eAAe,CAAC;;CAExC,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC;;CAEhB,EAAE;;CAEF,CAAC,SAAS,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG;;CAErE,EAAE,KAAK,MAAM,CAAC,OAAO,KAAK,KAAK,GAAG,OAAO;;CAEzC,EAAE,IAAI,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;;CAEpD,EAAE,KAAK,OAAO,MAAM,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,GAAG;;CAE1E,GAAG,KAAK,MAAM,CAAC,UAAU,MAAM,EAAE,MAAM,CAAC,aAAa,IAAI,QAAQ,CAAC,gBAAgB,EAAE,MAAM,EAAE,EAAE,GAAG;;CAEjG,IAAI,MAAM,CAAC,eAAe,CAAC,gBAAgB,EAAE,YAAY,CAAC,kBAAkB,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;;CAEnG,IAAI,IAAI,QAAQ,GAAG,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;CAC7C,IAAI,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;;CAEnC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG;;CAErC,KAAK,IAAI,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;;CAElC,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEzD,MAAM,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC;CAC9B,MAAM,IAAI,aAAa,GAAG,QAAQ,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC;;CAE1D,MAAM,KAAK,aAAa,IAAI,aAAa,CAAC,OAAO,GAAG;;CAEpD,OAAO,IAAI,aAAa,GAAG,gBAAgB,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,mBAAmB,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,GAAG,EAAE,CAAC;CAC7I,OAAO,SAAS,CAAC,kBAAkB,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;;CAElG,OAAO;;CAEP,MAAM;;CAEN,KAAK,MAAM,KAAK,QAAQ,CAAC,OAAO,GAAG;;CAEnC,KAAK,IAAI,aAAa,GAAG,gBAAgB,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,mBAAmB,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,GAAG,EAAE,CAAC;CACtI,KAAK,SAAS,CAAC,kBAAkB,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;CAE/F,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH,EAAE,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;;CAEjC,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEtD,GAAG,YAAY,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;;CAErE,GAAG;;CAEH,EAAE;;CAEF,CAAC;;CAED;CACA;CACA;;CAEA,SAAS,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG;;CAExG,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;;CAErG,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEzB,CAAC;;CAED,aAAa,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;CAC7D,aAAa,CAAC,SAAS,CAAC,WAAW,GAAG,aAAa,CAAC;;CAEpD;CACA;CACA;CACA;;CAEA,SAAS,mBAAmB,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,GAAG;;CAE5E,CAAC,IAAI,YAAY,EAAE,aAAa,CAAC;CACjC,CAAC,IAAI,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC;;CAEnC,CAAC,IAAI,OAAO,CAAC;;CAEb;;CAEA,CAAC,IAAI,cAAc,GAAG,IAAI,OAAO,EAAE,CAAC;CACpC,CAAC,IAAI,cAAc,GAAG,IAAI,UAAU,EAAE,CAAC;CACvC,CAAC,IAAI,WAAW,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEjC,CAAC,SAAS,IAAI,GAAG;;CAEjB,EAAE,IAAI,QAAQ,GAAG,IAAI,YAAY,EAAE;CACnC,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;CACrB,KAAK,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;CACrB,KAAK,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;CACnB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;CACnB,GAAG,EAAE,CAAC;;CAEN,EAAE,IAAI,KAAK,GAAG,IAAI,WAAW,EAAE;CAC/B,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;CACV,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;CACV,GAAG,EAAE,CAAC;;CAEN,EAAE,YAAY,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;CACnC,EAAE,aAAa,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;;CAEpC,EAAE,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC;CACjD,EAAE,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,YAAY,EAAE,QAAQ,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC;;CAE7D,EAAE,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,oBAAoB,EAAE,aAAa,EAAE,CAAC;CAC1D,EAAE,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,oBAAoB,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC;;CAElE,EAAE,OAAO,GAAG,aAAa,EAAE,CAAC;;CAE5B,EAAE,UAAU,GAAG;CACf,GAAG,QAAQ,EAAE,EAAE,CAAC,iBAAiB,EAAE,OAAO,EAAE,UAAU,EAAE;CACxD,GAAG,EAAE,EAAE,EAAE,CAAC,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE;CAC5C,GAAG,CAAC;;CAEJ,EAAE,QAAQ,GAAG;CACb,GAAG,QAAQ,EAAE,EAAE,CAAC,kBAAkB,EAAE,OAAO,EAAE,UAAU,EAAE;CACzD,GAAG,OAAO,EAAE,EAAE,CAAC,kBAAkB,EAAE,OAAO,EAAE,SAAS,EAAE;;CAEvD,GAAG,QAAQ,EAAE,EAAE,CAAC,kBAAkB,EAAE,OAAO,EAAE,UAAU,EAAE;CACzD,GAAG,MAAM,EAAE,EAAE,CAAC,kBAAkB,EAAE,OAAO,EAAE,QAAQ,EAAE;CACrD,GAAG,KAAK,EAAE,EAAE,CAAC,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE;;CAEnD,GAAG,KAAK,EAAE,EAAE,CAAC,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE;CACnD,GAAG,GAAG,EAAE,EAAE,CAAC,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE;CAC/C,GAAG,OAAO,EAAE,EAAE,CAAC,kBAAkB,EAAE,OAAO,EAAE,SAAS,EAAE;;CAEvD,GAAG,eAAe,EAAE,EAAE,CAAC,kBAAkB,EAAE,OAAO,EAAE,iBAAiB,EAAE;CACvE,GAAG,gBAAgB,EAAE,EAAE,CAAC,kBAAkB,EAAE,OAAO,EAAE,kBAAkB,EAAE;;CAEzE,GAAG,OAAO,EAAE,EAAE,CAAC,kBAAkB,EAAE,OAAO,EAAE,SAAS,EAAE;CACvD,GAAG,UAAU,EAAE,EAAE,CAAC,kBAAkB,EAAE,OAAO,EAAE,YAAY,EAAE;CAC7D,GAAG,OAAO,EAAE,EAAE,CAAC,kBAAkB,EAAE,OAAO,EAAE,SAAS,EAAE;CACvD,GAAG,MAAM,EAAE,EAAE,CAAC,kBAAkB,EAAE,OAAO,EAAE,QAAQ,EAAE;CACrD,GAAG,QAAQ,EAAE,EAAE,CAAC,kBAAkB,EAAE,OAAO,EAAE,UAAU,EAAE;CACzD,GAAG,QAAQ,EAAE,EAAE,CAAC,kBAAkB,EAAE,OAAO,EAAE,UAAU,EAAE;;CAEzD,GAAG,SAAS,EAAE,EAAE,CAAC,kBAAkB,EAAE,OAAO,EAAE,WAAW,EAAE;CAC3D,GAAG,CAAC;;CAEJ,EAAE,IAAI,MAAM,GAAG,QAAQ,CAAC,eAAe,EAAE,8BAA8B,EAAE,QAAQ,EAAE,CAAC;CACpF,EAAE,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;CACnB,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;;CAEpB,EAAE,IAAI,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;CAC1C,EAAE,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC;CAC9B,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEjC,EAAE,OAAO,GAAG,IAAI,aAAa,EAAE,MAAM,EAAE,CAAC;;CAExC,EAAE;;CAEF,CAAC,IAAI,CAAC,MAAM,GAAG,WAAW,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG;;CAEnD,EAAE,KAAK,OAAO,CAAC,MAAM,KAAK,CAAC,GAAG,OAAO;;CAErC;;CAEA,EAAE,KAAK,OAAO,KAAK,SAAS,GAAG;;CAE/B,GAAG,IAAI,EAAE,CAAC;;CAEV,GAAG;;CAEH,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;;CAE9B,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC;CACzB,EAAE,KAAK,CAAC,eAAe,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC;CAC/C,EAAE,KAAK,CAAC,eAAe,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC;CACzC,EAAE,KAAK,CAAC,uBAAuB,EAAE,CAAC;;CAElC,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC;CAChC,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC;;CAE3B,EAAE,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC;CACjD,EAAE,EAAE,CAAC,mBAAmB,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;CAC9E,EAAE,EAAE,CAAC,mBAAmB,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;;CAExE,EAAE,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,oBAAoB,EAAE,aAAa,EAAE,CAAC;;CAE1D,EAAE,EAAE,CAAC,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB,EAAE,KAAK,EAAE,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC;;CAE5F,EAAE,KAAK,CAAC,aAAa,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC;CACrC,EAAE,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;;CAElC,EAAE,IAAI,UAAU,GAAG,CAAC,CAAC;CACrB,EAAE,IAAI,YAAY,GAAG,CAAC,CAAC;CACvB,EAAE,IAAI,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;;CAEtB,EAAE,KAAK,GAAG,GAAG;;CAEb,GAAG,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;;CAE5E,GAAG,KAAK,GAAG,CAAC,KAAK,GAAG;;CAEpB,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;CAC/C,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;;CAE7C,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;CACxC,IAAI,UAAU,GAAG,CAAC,CAAC;CACnB,IAAI,YAAY,GAAG,CAAC,CAAC;;CAErB,IAAI,MAAM,KAAK,GAAG,CAAC,SAAS,GAAG;;CAE/B,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;;CAErD,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;CACxC,IAAI,UAAU,GAAG,CAAC,CAAC;CACnB,IAAI,YAAY,GAAG,CAAC,CAAC;;CAErB,IAAI;;CAEJ,GAAG,MAAM;;CAET,GAAG,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;CACvC,GAAG,UAAU,GAAG,CAAC,CAAC;CAClB,GAAG,YAAY,GAAG,CAAC,CAAC;;CAEpB,GAAG;;;CAGH;;CAEA,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAErD,GAAG,IAAI,MAAM,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC;;CAE7B,GAAG,MAAM,CAAC,eAAe,CAAC,gBAAgB,EAAE,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;CAC5F,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC;;CAEtD,GAAG;;CAEH,EAAE,OAAO,CAAC,IAAI,EAAE,iBAAiB,EAAE,CAAC;;CAEpC;;CAEA,EAAE,IAAI,KAAK,GAAG,EAAE,CAAC;CACjB,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC;;CAElB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAErD,GAAG,IAAI,MAAM,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC;CAC7B,GAAG,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;;CAElC,GAAG,KAAK,QAAQ,CAAC,OAAO,KAAK,KAAK,GAAG,SAAS;;CAE9C,GAAG,MAAM,CAAC,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;;CAEpF,GAAG,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CAC1D,GAAG,EAAE,CAAC,gBAAgB,EAAE,QAAQ,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC;;CAE3F,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;;CAE/E,GAAG,KAAK,EAAE,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC;CAC9B,GAAG,KAAK,EAAE,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC;;CAE9B,GAAG,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC;CACvC,GAAG,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC;;CAEvC,GAAG,IAAI,OAAO,GAAG,CAAC,CAAC;;CAEnB,GAAG,KAAK,KAAK,CAAC,GAAG,IAAI,QAAQ,CAAC,GAAG,GAAG;;CAEpC,IAAI,OAAO,GAAG,YAAY,CAAC;;CAE3B,IAAI;;CAEJ,GAAG,KAAK,UAAU,KAAK,OAAO,GAAG;;CAEjC,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;CAC9C,IAAI,UAAU,GAAG,OAAO,CAAC;;CAEzB,IAAI;;CAEJ,GAAG,KAAK,QAAQ,CAAC,GAAG,KAAK,IAAI,GAAG;;CAEhC,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;CACpF,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;;CAEnF,IAAI,MAAM;;CAEV,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC5C,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE3C,IAAI;;CAEJ,GAAG,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;CACtD,GAAG,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;;CAExF,GAAG,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;CACxD,GAAG,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;CAC5C,GAAG,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;;CAE1C,GAAG,KAAK,CAAC,WAAW,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,kBAAkB,EAAE,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,kBAAkB,EAAE,CAAC;CAClN,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CACrD,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;CACtD,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;;CAEtD,GAAG,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC;;CAEvD,GAAG,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC;;CAE5D,GAAG,MAAM,CAAC,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;;CAEnF,GAAG;;CAEH;;CAEA,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC;;CAE/B,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;;CAEhB,EAAE,CAAC;;CAEH,CAAC,SAAS,aAAa,GAAG;;CAE1B,EAAE,IAAI,OAAO,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;;CAEnC,EAAE,IAAI,YAAY,GAAG,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,aAAa,EAAE,CAAC;CACzD,EAAE,IAAI,cAAc,GAAG,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,eAAe,EAAE,CAAC;;CAE7D,EAAE,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE;;CAEjC,GAAG,YAAY,GAAG,YAAY,CAAC,SAAS,GAAG,SAAS;;CAEpD,GAAG,sBAAsB,GAAG,gBAAgB;;CAE5C,GAAG,+BAA+B;CAClC,GAAG,gCAAgC;CACnC,GAAG,yBAAyB;CAC5B,GAAG,sBAAsB;CACzB,GAAG,qBAAqB;CACxB,GAAG,wBAAwB;CAC3B,GAAG,uBAAuB;;CAE1B,GAAG,0BAA0B;CAC7B,GAAG,oBAAoB;;CAEvB,GAAG,mBAAmB;CACtB,GAAG,yBAAyB;;CAE5B,GAAG,eAAe;;CAElB,GAAG,iCAAiC;;CAEpC,GAAG,wDAAwD;;CAE3D,GAAG,wBAAwB;CAC3B,GAAG,iGAAiG;CACpG,GAAG,iGAAiG;;CAEpG,GAAG,mBAAmB;;CAEtB,GAAG,6DAA6D;CAChE,GAAG,oCAAoC;;CAEvC,GAAG,+CAA+C;;CAElD,GAAG,6BAA6B;;CAEhC,GAAG,GAAG;;CAEN,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;;CAEnB,EAAE,EAAE,CAAC,YAAY,EAAE,cAAc,EAAE;;CAEnC,GAAG,YAAY,GAAG,YAAY,CAAC,SAAS,GAAG,SAAS;;CAEpD,GAAG,sBAAsB,GAAG,gBAAgB;;CAE5C,GAAG,qBAAqB;CACxB,GAAG,wBAAwB;CAC3B,GAAG,wBAAwB;;CAE3B,GAAG,sBAAsB;CACzB,GAAG,wBAAwB;CAC3B,GAAG,2BAA2B;CAC9B,GAAG,wBAAwB;CAC3B,GAAG,uBAAuB;CAC1B,GAAG,0BAA0B;;CAE7B,GAAG,mBAAmB;CACtB,GAAG,yBAAyB;;CAE5B,GAAG,eAAe;;CAElB,GAAG,wCAAwC;;CAE3C,GAAG,mEAAmE;;CAEtE,GAAG,6CAA6C;;CAEhD,GAAG,uBAAuB;;CAE1B,GAAG,0BAA0B;;CAE7B,GAAG,yBAAyB;;CAE5B,GAAG,yDAAyD;;CAE5D,GAAG,YAAY;;CAEf,GAAG,iCAAiC;CACpC,GAAG,gFAAgF;CACnF,GAAG,oDAAoD;;CAEvD,GAAG,KAAK;;CAER,GAAG,oEAAoE;;CAEvE,GAAG,IAAI;;CAEP,GAAG,GAAG;;CAEN,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;;CAEnB,EAAE,EAAE,CAAC,aAAa,EAAE,YAAY,EAAE,CAAC;CACnC,EAAE,EAAE,CAAC,aAAa,EAAE,cAAc,EAAE,CAAC;;CAErC,EAAE,EAAE,CAAC,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;CAC3C,EAAE,EAAE,CAAC,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;;CAE7C,EAAE,EAAE,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC;;CAE5B,EAAE,OAAO,OAAO,CAAC;;CAEjB,EAAE;;CAEF,CAAC,SAAS,iBAAiB,EAAE,CAAC,EAAE,CAAC,GAAG;;CAEpC,EAAE,KAAK,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW,GAAG;;CAEzC,GAAG,OAAO,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC;;CAExC,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG;;CAE5B,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;CAEpB,GAAG,MAAM;;CAET,GAAG,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;;CAEtB,GAAG;;CAEH,EAAE;;CAEF,CAAC;;CAED;CACA;CACA;;CAEA,SAAS,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,GAAG;;CAE7C,CAAC,SAAS,WAAW,GAAG;;CAExB,EAAE,IAAI,MAAM,GAAG,KAAK,CAAC;;CAErB,EAAE,IAAI,KAAK,GAAG,IAAI,OAAO,EAAE,CAAC;CAC5B,EAAE,IAAI,gBAAgB,GAAG,IAAI,CAAC;CAC9B,EAAE,IAAI,iBAAiB,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEpD,EAAE,OAAO;;CAET,GAAG,OAAO,EAAE,WAAW,SAAS,GAAG;;CAEnC,IAAI,KAAK,gBAAgB,KAAK,SAAS,IAAI,EAAE,MAAM,GAAG;;CAEtD,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;CAChE,KAAK,gBAAgB,GAAG,SAAS,CAAC;;CAElC,KAAK;;CAEL,IAAI;;CAEJ,GAAG,SAAS,EAAE,WAAW,IAAI,GAAG;;CAEhC,IAAI,MAAM,GAAG,IAAI,CAAC;;CAElB,IAAI;;CAEJ,GAAG,QAAQ,EAAE,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,kBAAkB,GAAG;;CAEzD,IAAI,KAAK,kBAAkB,KAAK,IAAI,GAAG;;CAEvC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;;CAE5B,KAAK;;CAEL,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE5B,IAAI,KAAK,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,GAAG;;CAEvD,KAAK,EAAE,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CACjC,KAAK,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;;CAErC,KAAK;;CAEL,IAAI;;CAEJ,GAAG,KAAK,EAAE,YAAY;;CAEtB,IAAI,MAAM,GAAG,KAAK,CAAC;;CAEnB,IAAI,gBAAgB,GAAG,IAAI,CAAC;CAC5B,IAAI,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE1C,IAAI;;CAEJ,GAAG,CAAC;;CAEJ,EAAE;;CAEF,CAAC,SAAS,WAAW,GAAG;;CAExB,EAAE,IAAI,MAAM,GAAG,KAAK,CAAC;;CAErB,EAAE,IAAI,gBAAgB,GAAG,IAAI,CAAC;CAC9B,EAAE,IAAI,gBAAgB,GAAG,IAAI,CAAC;CAC9B,EAAE,IAAI,iBAAiB,GAAG,IAAI,CAAC;;CAE/B,EAAE,OAAO;;CAET,GAAG,OAAO,EAAE,WAAW,SAAS,GAAG;;CAEnC,IAAI,KAAK,SAAS,GAAG;;CAErB,KAAK,MAAM,EAAE,EAAE,CAAC,UAAU,EAAE,CAAC;;CAE7B,KAAK,MAAM;;CAEX,KAAK,OAAO,EAAE,EAAE,CAAC,UAAU,EAAE,CAAC;;CAE9B,KAAK;;CAEL,IAAI;;CAEJ,GAAG,OAAO,EAAE,WAAW,SAAS,GAAG;;CAEnC,IAAI,KAAK,gBAAgB,KAAK,SAAS,IAAI,EAAE,MAAM,GAAG;;CAEtD,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC;CAC/B,KAAK,gBAAgB,GAAG,SAAS,CAAC;;CAElC,KAAK;;CAEL,IAAI;;CAEJ,GAAG,OAAO,EAAE,WAAW,SAAS,GAAG;;CAEnC,IAAI,KAAK,gBAAgB,KAAK,SAAS,GAAG;;CAE1C,KAAK,KAAK,SAAS,GAAG;;CAEtB,MAAM,SAAS,SAAS;;CAExB,OAAO,KAAK,UAAU;;CAEtB,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC;CACjC,QAAQ,MAAM;;CAEd,OAAO,KAAK,WAAW;;CAEvB,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC;CAClC,QAAQ,MAAM;;CAEd,OAAO,KAAK,SAAS;;CAErB,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;CAChC,QAAQ,MAAM;;CAEd,OAAO,KAAK,cAAc;;CAE1B,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC;CAClC,QAAQ,MAAM;;CAEd,OAAO,KAAK,UAAU;;CAEtB,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC;CACjC,QAAQ,MAAM;;CAEd,OAAO,KAAK,iBAAiB;;CAE7B,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC;CAClC,QAAQ,MAAM;;CAEd,OAAO,KAAK,YAAY;;CAExB,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC;CACnC,QAAQ,MAAM;;CAEd,OAAO,KAAK,aAAa;;CAEzB,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC;CACpC,QAAQ,MAAM;;CAEd,OAAO;;CAEP,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC;;CAElC,OAAO;;CAEP,MAAM,MAAM;;CAEZ,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC;;CAEhC,MAAM;;CAEN,KAAK,gBAAgB,GAAG,SAAS,CAAC;;CAElC,KAAK;;CAEL,IAAI;;CAEJ,GAAG,SAAS,EAAE,WAAW,IAAI,GAAG;;CAEhC,IAAI,MAAM,GAAG,IAAI,CAAC;;CAElB,IAAI;;CAEJ,GAAG,QAAQ,EAAE,WAAW,KAAK,GAAG;;CAEhC,IAAI,KAAK,iBAAiB,KAAK,KAAK,GAAG;;CAEvC,KAAK,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC;CAC5B,KAAK,iBAAiB,GAAG,KAAK,CAAC;;CAE/B,KAAK;;CAEL,IAAI;;CAEJ,GAAG,KAAK,EAAE,YAAY;;CAEtB,IAAI,MAAM,GAAG,KAAK,CAAC;;CAEnB,IAAI,gBAAgB,GAAG,IAAI,CAAC;CAC5B,IAAI,gBAAgB,GAAG,IAAI,CAAC;CAC5B,IAAI,iBAAiB,GAAG,IAAI,CAAC;;CAE7B,IAAI;;CAEJ,GAAG,CAAC;;CAEJ,EAAE;;CAEF,CAAC,SAAS,aAAa,GAAG;;CAE1B,EAAE,IAAI,MAAM,GAAG,KAAK,CAAC;;CAErB,EAAE,IAAI,kBAAkB,GAAG,IAAI,CAAC;CAChC,EAAE,IAAI,kBAAkB,GAAG,IAAI,CAAC;CAChC,EAAE,IAAI,iBAAiB,GAAG,IAAI,CAAC;CAC/B,EAAE,IAAI,sBAAsB,GAAG,IAAI,CAAC;CACpC,EAAE,IAAI,kBAAkB,GAAG,IAAI,CAAC;CAChC,EAAE,IAAI,mBAAmB,GAAG,IAAI,CAAC;CACjC,EAAE,IAAI,mBAAmB,GAAG,IAAI,CAAC;CACjC,EAAE,IAAI,mBAAmB,GAAG,IAAI,CAAC;;CAEjC,EAAE,OAAO;;CAET,GAAG,OAAO,EAAE,WAAW,WAAW,GAAG;;CAErC,IAAI,KAAK,WAAW,GAAG;;CAEvB,KAAK,MAAM,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC;;CAE/B,KAAK,MAAM;;CAEX,KAAK,OAAO,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC;;CAEhC,KAAK;;CAEL,IAAI;;CAEJ,GAAG,OAAO,EAAE,WAAW,WAAW,GAAG;;CAErC,IAAI,KAAK,kBAAkB,KAAK,WAAW,IAAI,EAAE,MAAM,GAAG;;CAE1D,KAAK,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC;CACnC,KAAK,kBAAkB,GAAG,WAAW,CAAC;;CAEtC,KAAK;;CAEL,IAAI;;CAEJ,GAAG,OAAO,EAAE,WAAW,WAAW,EAAE,UAAU,EAAE,WAAW,GAAG;;CAE9D,IAAI,KAAK,kBAAkB,KAAK,WAAW;CAC3C,SAAS,iBAAiB,MAAM,UAAU;CAC1C,SAAS,sBAAsB,KAAK,WAAW,GAAG;;CAElD,KAAK,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;;CAE5D,KAAK,kBAAkB,GAAG,WAAW,CAAC;CACtC,KAAK,iBAAiB,GAAG,UAAU,CAAC;CACpC,KAAK,sBAAsB,GAAG,WAAW,CAAC;;CAE1C,KAAK;;CAEL,IAAI;;CAEJ,GAAG,KAAK,EAAE,WAAW,WAAW,EAAE,YAAY,EAAE,YAAY,GAAG;;CAE/D,IAAI,KAAK,kBAAkB,MAAM,WAAW;CAC5C,SAAS,mBAAmB,KAAK,YAAY;CAC7C,SAAS,mBAAmB,KAAK,YAAY,GAAG;;CAEhD,KAAK,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;;CAE7D,KAAK,kBAAkB,GAAG,WAAW,CAAC;CACtC,KAAK,mBAAmB,GAAG,YAAY,CAAC;CACxC,KAAK,mBAAmB,GAAG,YAAY,CAAC;;CAExC,KAAK;;CAEL,IAAI;;CAEJ,GAAG,SAAS,EAAE,WAAW,IAAI,GAAG;;CAEhC,IAAI,MAAM,GAAG,IAAI,CAAC;;CAElB,IAAI;;CAEJ,GAAG,QAAQ,EAAE,WAAW,OAAO,GAAG;;CAElC,IAAI,KAAK,mBAAmB,KAAK,OAAO,GAAG;;CAE3C,KAAK,EAAE,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC;CAChC,KAAK,mBAAmB,GAAG,OAAO,CAAC;;CAEnC,KAAK;;CAEL,IAAI;;CAEJ,GAAG,KAAK,EAAE,YAAY;;CAEtB,IAAI,MAAM,GAAG,KAAK,CAAC;;CAEnB,IAAI,kBAAkB,GAAG,IAAI,CAAC;CAC9B,IAAI,kBAAkB,GAAG,IAAI,CAAC;CAC9B,IAAI,iBAAiB,GAAG,IAAI,CAAC;CAC7B,IAAI,sBAAsB,GAAG,IAAI,CAAC;CAClC,IAAI,kBAAkB,GAAG,IAAI,CAAC;CAC9B,IAAI,mBAAmB,GAAG,IAAI,CAAC;CAC/B,IAAI,mBAAmB,GAAG,IAAI,CAAC;CAC/B,IAAI,mBAAmB,GAAG,IAAI,CAAC;;CAE/B,IAAI;;CAEJ,GAAG,CAAC;;CAEJ,EAAE;;CAEF;;CAEA,CAAC,IAAI,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;CACrC,CAAC,IAAI,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;CACrC,CAAC,IAAI,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;;CAEzC,CAAC,IAAI,mBAAmB,GAAG,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,kBAAkB,EAAE,CAAC;CACpE,CAAC,IAAI,aAAa,GAAG,IAAI,UAAU,EAAE,mBAAmB,EAAE,CAAC;CAC3D,CAAC,IAAI,iBAAiB,GAAG,IAAI,UAAU,EAAE,mBAAmB,EAAE,CAAC;CAC/D,CAAC,IAAI,iBAAiB,GAAG,IAAI,UAAU,EAAE,mBAAmB,EAAE,CAAC;;CAE/D,CAAC,IAAI,YAAY,GAAG,EAAE,CAAC;;CAEvB,CAAC,IAAI,wBAAwB,GAAG,IAAI,CAAC;;CAErC,CAAC,IAAI,cAAc,GAAG,IAAI,CAAC;;CAE3B,CAAC,IAAI,eAAe,GAAG,IAAI,CAAC;CAC5B,CAAC,IAAI,oBAAoB,GAAG,IAAI,CAAC;CACjC,CAAC,IAAI,eAAe,GAAG,IAAI,CAAC;CAC5B,CAAC,IAAI,eAAe,GAAG,IAAI,CAAC;CAC5B,CAAC,IAAI,yBAAyB,GAAG,IAAI,CAAC;CACtC,CAAC,IAAI,oBAAoB,GAAG,IAAI,CAAC;CACjC,CAAC,IAAI,oBAAoB,GAAG,IAAI,CAAC;CACjC,CAAC,IAAI,wBAAwB,GAAG,KAAK,CAAC;;CAEtC,CAAC,IAAI,gBAAgB,GAAG,IAAI,CAAC;CAC7B,CAAC,IAAI,eAAe,GAAG,IAAI,CAAC;;CAE5B,CAAC,IAAI,gBAAgB,GAAG,IAAI,CAAC;;CAE7B,CAAC,IAAI,0BAA0B,GAAG,IAAI,CAAC;CACvC,CAAC,IAAI,yBAAyB,GAAG,IAAI,CAAC;;CAEtC,CAAC,IAAI,WAAW,GAAG,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,gCAAgC,EAAE,CAAC;;CAE1E,CAAC,IAAI,kBAAkB,GAAG,KAAK,CAAC;CAChC,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC;CACjB,CAAC,IAAI,SAAS,GAAG,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC;;CAE/C,CAAC,KAAK,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG;;CAE7C,EAAE,OAAO,GAAG,UAAU,EAAE,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;CACnE,EAAE,kBAAkB,KAAK,OAAO,IAAI,GAAG,EAAE,CAAC;;CAE1C,EAAE,MAAM,KAAK,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,GAAG;;CAExD,EAAE,OAAO,GAAG,UAAU,EAAE,sBAAsB,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;CACxE,EAAE,kBAAkB,KAAK,OAAO,IAAI,GAAG,EAAE,CAAC;;CAE1C,EAAE;;CAEF,CAAC,IAAI,kBAAkB,GAAG,IAAI,CAAC;CAC/B,CAAC,IAAI,oBAAoB,GAAG,EAAE,CAAC;;CAE/B,CAAC,IAAI,cAAc,GAAG,IAAI,OAAO,EAAE,CAAC;CACpC,CAAC,IAAI,eAAe,GAAG,IAAI,OAAO,EAAE,CAAC;;CAErC,CAAC,SAAS,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,GAAG;;CAE/C,EAAE,IAAI,IAAI,GAAG,IAAI,UAAU,EAAE,CAAC,EAAE,CAAC;CACjC,EAAE,IAAI,OAAO,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;;CAEnC,EAAE,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;CAClC,EAAE,EAAE,CAAC,aAAa,EAAE,IAAI,EAAE,EAAE,CAAC,kBAAkB,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC;CAC9D,EAAE,EAAE,CAAC,aAAa,EAAE,IAAI,EAAE,EAAE,CAAC,kBAAkB,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC;;CAE9D,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG;;CAErC,GAAG,EAAE,CAAC,UAAU,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC;;CAErF,GAAG;;CAEH,EAAE,OAAO,OAAO,CAAC;;CAEjB,EAAE;;CAEF,CAAC,IAAI,aAAa,GAAG,EAAE,CAAC;CACxB,CAAC,aAAa,EAAE,EAAE,CAAC,UAAU,EAAE,GAAG,aAAa,EAAE,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;CACnF,CAAC,aAAa,EAAE,EAAE,CAAC,gBAAgB,EAAE,GAAG,aAAa,EAAE,EAAE,CAAC,gBAAgB,EAAE,EAAE,CAAC,2BAA2B,EAAE,CAAC,EAAE,CAAC;;CAEhH;;CAEA,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CACpC,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;CAC3B,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;;CAE7B,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,EAAE,CAAC;CACzB,CAAC,WAAW,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC;;CAEvC,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC;CACvB,CAAC,WAAW,EAAE,YAAY,EAAE,CAAC;CAC7B,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC;;CAExB,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC;CACpB,CAAC,WAAW,EAAE,cAAc,EAAE,CAAC;;CAE/B;;CAEA,CAAC,SAAS,cAAc,GAAG;;CAE3B,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAE3D,GAAG,aAAa,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;;CAE1B,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,eAAe,EAAE,SAAS,GAAG;;CAEvC,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;;CAEjC,EAAE,KAAK,iBAAiB,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG;;CAE9C,GAAG,EAAE,CAAC,uBAAuB,EAAE,SAAS,EAAE,CAAC;CAC3C,GAAG,iBAAiB,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;;CAEtC,GAAG;;CAEH,EAAE,KAAK,iBAAiB,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG;;CAE9C,GAAG,IAAI,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,wBAAwB,EAAE,CAAC;;CAE9D,GAAG,SAAS,CAAC,wBAAwB,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;CACtD,GAAG,iBAAiB,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;;CAEtC,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,yBAAyB,EAAE,SAAS,EAAE,gBAAgB,GAAG;;CAEnE,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;;CAEjC,EAAE,KAAK,iBAAiB,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG;;CAE9C,GAAG,EAAE,CAAC,uBAAuB,EAAE,SAAS,EAAE,CAAC;CAC3C,GAAG,iBAAiB,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;;CAEtC,GAAG;;CAEH,EAAE,KAAK,iBAAiB,EAAE,SAAS,EAAE,KAAK,gBAAgB,GAAG;;CAE7D,GAAG,IAAI,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,wBAAwB,EAAE,CAAC;;CAE9D,GAAG,SAAS,CAAC,wBAAwB,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;CACrE,GAAG,iBAAiB,EAAE,SAAS,EAAE,GAAG,gBAAgB,CAAC;;CAErD,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,uBAAuB,GAAG;;CAEpC,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,iBAAiB,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAEjE,GAAG,KAAK,iBAAiB,EAAE,CAAC,EAAE,KAAK,aAAa,EAAE,CAAC,EAAE,GAAG;;CAExD,IAAI,EAAE,CAAC,wBAAwB,EAAE,CAAC,EAAE,CAAC;CACrC,IAAI,iBAAiB,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;;CAE/B,IAAI;;CAEJ,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,MAAM,EAAE,EAAE,GAAG;;CAEvB,EAAE,KAAK,YAAY,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG;;CAErC,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC;CACnB,GAAG,YAAY,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;;CAE7B,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,OAAO,EAAE,EAAE,GAAG;;CAExB,EAAE,KAAK,YAAY,EAAE,EAAE,EAAE,KAAK,KAAK,GAAG;;CAEtC,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC;CACpB,GAAG,YAAY,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC;;CAE9B,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,2BAA2B,GAAG;;CAExC,EAAE,KAAK,wBAAwB,KAAK,IAAI,GAAG;;CAE3C,GAAG,wBAAwB,GAAG,EAAE,CAAC;;CAEjC,GAAG,KAAK,UAAU,CAAC,GAAG,EAAE,gCAAgC,EAAE;CAC1D,QAAQ,UAAU,CAAC,GAAG,EAAE,+BAA+B,EAAE;CACzD,QAAQ,UAAU,CAAC,GAAG,EAAE,+BAA+B,EAAE;CACzD,QAAQ,UAAU,CAAC,GAAG,EAAE,+BAA+B,EAAE,GAAG;;CAE5D,IAAI,IAAI,OAAO,GAAG,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,0BAA0B,EAAE,CAAC;;CAEnE,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAEhD,KAAK,wBAAwB,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEnD,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH,EAAE,OAAO,wBAAwB,CAAC;;CAElC,EAAE;;CAEF,CAAC,SAAS,UAAU,EAAE,OAAO,GAAG;;CAEhC,EAAE,KAAK,cAAc,KAAK,OAAO,GAAG;;CAEpC,GAAG,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;;CAE5B,GAAG,cAAc,GAAG,OAAO,CAAC;;CAE5B,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG;;CAEH,EAAE,OAAO,KAAK,CAAC;;CAEf,EAAE;;CAEF,CAAC,SAAS,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,kBAAkB,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,GAAG;;CAE3I,EAAE,KAAK,QAAQ,KAAK,UAAU,GAAG;;CAEjC,GAAG,MAAM,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC;;CAEtB,GAAG,MAAM;;CAET,GAAG,OAAO,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC;;CAEvB,GAAG;;CAEH,EAAE,KAAK,QAAQ,KAAK,cAAc,GAAG;;CAErC,GAAG,KAAK,QAAQ,KAAK,eAAe,IAAI,kBAAkB,KAAK,wBAAwB,GAAG;;CAE1F,IAAI,SAAS,QAAQ;;CAErB,KAAK,KAAK,gBAAgB;;CAE1B,MAAM,KAAK,kBAAkB,GAAG;;CAEhC,OAAO,EAAE,CAAC,qBAAqB,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC;CAC5D,OAAO,EAAE,CAAC,iBAAiB,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC;;CAE9D,OAAO,MAAM;;CAEb,OAAO,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC;CACvC,OAAO,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC;;CAE5C,OAAO;CACP,MAAM,MAAM;;CAEZ,KAAK,KAAK,mBAAmB;;CAE7B,MAAM,KAAK,kBAAkB,GAAG;;CAEhC,OAAO,EAAE,CAAC,qBAAqB,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC;CAC5D,OAAO,EAAE,CAAC,iBAAiB,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,EAAE,EAAE,CAAC,mBAAmB,EAAE,CAAC;;CAEhG,OAAO,MAAM;;CAEb,OAAO,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC;CACvC,OAAO,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,EAAE,CAAC;;CAEvD,OAAO;CACP,MAAM,MAAM;;CAEZ,KAAK,KAAK,gBAAgB;;CAE1B,MAAM,KAAK,kBAAkB,GAAG;;CAEhC,OAAO,EAAE,CAAC,qBAAqB,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC;CAC5D,OAAO,EAAE,CAAC,iBAAiB,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC;;CAE5E,OAAO,MAAM;;CAEb,OAAO,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC;CACvC,OAAO,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC;;CAE7C,OAAO;CACP,MAAM,MAAM;;CAEZ,KAAK;;CAEL,MAAM,KAAK,kBAAkB,GAAG;;CAEhC,OAAO,EAAE,CAAC,qBAAqB,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC;CAC5D,OAAO,EAAE,CAAC,iBAAiB,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,mBAAmB,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,mBAAmB,EAAE,CAAC;;CAE9F,OAAO,MAAM;;CAEb,OAAO,EAAE,CAAC,qBAAqB,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC;CAC5D,OAAO,EAAE,CAAC,iBAAiB,EAAE,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,mBAAmB,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,mBAAmB,EAAE,CAAC;;CAEpG,OAAO;;CAEP,KAAK;;CAEL,IAAI;;CAEJ,GAAG,oBAAoB,GAAG,IAAI,CAAC;CAC/B,GAAG,eAAe,GAAG,IAAI,CAAC;CAC1B,GAAG,eAAe,GAAG,IAAI,CAAC;CAC1B,GAAG,yBAAyB,GAAG,IAAI,CAAC;CACpC,GAAG,oBAAoB,GAAG,IAAI,CAAC;CAC/B,GAAG,oBAAoB,GAAG,IAAI,CAAC;;CAE/B,GAAG,MAAM;;CAET,GAAG,kBAAkB,GAAG,kBAAkB,IAAI,aAAa,CAAC;CAC5D,GAAG,aAAa,GAAG,aAAa,IAAI,QAAQ,CAAC;CAC7C,GAAG,aAAa,GAAG,aAAa,IAAI,QAAQ,CAAC;;CAE7C,GAAG,KAAK,aAAa,KAAK,oBAAoB,IAAI,kBAAkB,KAAK,yBAAyB,GAAG;;CAErG,IAAI,EAAE,CAAC,qBAAqB,EAAE,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,kBAAkB,EAAE,EAAE,CAAC;;CAEpG,IAAI,oBAAoB,GAAG,aAAa,CAAC;CACzC,IAAI,yBAAyB,GAAG,kBAAkB,CAAC;;CAEnD,IAAI;;CAEJ,GAAG,KAAK,QAAQ,KAAK,eAAe,IAAI,QAAQ,KAAK,eAAe,IAAI,aAAa,KAAK,oBAAoB,IAAI,aAAa,KAAK,oBAAoB,GAAG;;CAE3J,IAAI,EAAE,CAAC,iBAAiB,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,CAAC;;CAEjJ,IAAI,eAAe,GAAG,QAAQ,CAAC;CAC/B,IAAI,eAAe,GAAG,QAAQ,CAAC;CAC/B,IAAI,oBAAoB,GAAG,aAAa,CAAC;CACzC,IAAI,oBAAoB,GAAG,aAAa,CAAC;;CAEzC,IAAI;;CAEJ,GAAG;;CAEH,EAAE,eAAe,GAAG,QAAQ,CAAC;CAC7B,EAAE,wBAAwB,GAAG,kBAAkB,CAAC;;CAEhD,EAAE;;CAEF,CAAC,SAAS,WAAW,EAAE,QAAQ,EAAE,WAAW,GAAG;;CAE/C,EAAE,QAAQ,CAAC,IAAI,KAAK,UAAU;CAC9B,KAAK,OAAO,EAAE,EAAE,CAAC,SAAS,EAAE;CAC5B,KAAK,MAAM,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC;;CAE5B,EAAE,IAAI,SAAS,KAAK,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;CACjD,EAAE,KAAK,WAAW,GAAG,SAAS,GAAG,EAAE,SAAS,CAAC;;CAE7C,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;;CAE5B,EAAE,QAAQ,CAAC,WAAW,KAAK,IAAI;CAC/B,KAAK,WAAW,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,kBAAkB,EAAE,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,kBAAkB,EAAE;CAC7M,KAAK,WAAW,EAAE,UAAU,EAAE,CAAC;;CAE/B,EAAE,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CAC5C,EAAE,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CAC5C,EAAE,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;CAC7C,EAAE,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;;CAE7C,EAAE,gBAAgB,EAAE,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,mBAAmB,EAAE,QAAQ,CAAC,kBAAkB,EAAE,CAAC;;CAExG,EAAE;;CAEF;;CAEA,CAAC,SAAS,YAAY,EAAE,SAAS,GAAG;;CAEpC,EAAE,KAAK,gBAAgB,KAAK,SAAS,GAAG;;CAExC,GAAG,KAAK,SAAS,GAAG;;CAEpB,IAAI,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE1B,IAAI,MAAM;;CAEV,IAAI,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC;;CAE3B,IAAI;;CAEJ,GAAG,gBAAgB,GAAG,SAAS,CAAC;;CAEhC,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,WAAW,EAAE,QAAQ,GAAG;;CAElC,EAAE,KAAK,QAAQ,KAAK,YAAY,GAAG;;CAEnC,GAAG,MAAM,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC;;CAE1B,GAAG,KAAK,QAAQ,KAAK,eAAe,GAAG;;CAEvC,IAAI,KAAK,QAAQ,KAAK,YAAY,GAAG;;CAErC,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;;CAE5B,KAAK,MAAM,KAAK,QAAQ,KAAK,aAAa,GAAG;;CAE7C,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC;;CAE7B,KAAK,MAAM;;CAEX,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,cAAc,EAAE,CAAC;;CAEtC,KAAK;;CAEL,IAAI;;CAEJ,GAAG,MAAM;;CAET,GAAG,OAAO,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC;;CAE3B,GAAG;;CAEH,EAAE,eAAe,GAAG,QAAQ,CAAC;;CAE7B,EAAE;;CAEF,CAAC,SAAS,YAAY,EAAE,KAAK,GAAG;;CAEhC,EAAE,KAAK,KAAK,KAAK,gBAAgB,GAAG;;CAEpC,GAAG,KAAK,kBAAkB,GAAG,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;;CAEnD,GAAG,gBAAgB,GAAG,KAAK,CAAC;;CAE5B,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,gBAAgB,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,GAAG;;CAE3D,EAAE,KAAK,aAAa,GAAG;;CAEvB,GAAG,MAAM,EAAE,EAAE,CAAC,mBAAmB,EAAE,CAAC;;CAEpC,GAAG,KAAK,0BAA0B,KAAK,MAAM,IAAI,yBAAyB,KAAK,KAAK,GAAG;;CAEvF,IAAI,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;;CAEtC,IAAI,0BAA0B,GAAG,MAAM,CAAC;CACxC,IAAI,yBAAyB,GAAG,KAAK,CAAC;;CAEtC,IAAI;;CAEJ,GAAG,MAAM;;CAET,GAAG,OAAO,EAAE,EAAE,CAAC,mBAAmB,EAAE,CAAC;;CAErC,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,cAAc,EAAE,WAAW,GAAG;;CAExC,EAAE,KAAK,WAAW,GAAG;;CAErB,GAAG,MAAM,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC;;CAE7B,GAAG,MAAM;;CAET,GAAG,OAAO,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC;;CAE9B,GAAG;;CAEH,EAAE;;CAEF;;CAEA,CAAC,SAAS,aAAa,EAAE,SAAS,GAAG;;CAErC,EAAE,KAAK,SAAS,KAAK,SAAS,GAAG,SAAS,GAAG,EAAE,CAAC,QAAQ,GAAG,WAAW,GAAG,CAAC,CAAC;;CAE3E,EAAE,KAAK,kBAAkB,KAAK,SAAS,GAAG;;CAE1C,GAAG,EAAE,CAAC,aAAa,EAAE,SAAS,EAAE,CAAC;CACjC,GAAG,kBAAkB,GAAG,SAAS,CAAC;;CAElC,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,WAAW,EAAE,SAAS,EAAE,YAAY,GAAG;;CAEjD,EAAE,KAAK,kBAAkB,KAAK,IAAI,GAAG;;CAErC,GAAG,aAAa,EAAE,CAAC;;CAEnB,GAAG;;CAEH,EAAE,IAAI,YAAY,GAAG,oBAAoB,EAAE,kBAAkB,EAAE,CAAC;;CAEhE,EAAE,KAAK,YAAY,KAAK,SAAS,GAAG;;CAEpC,GAAG,YAAY,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;CAC1D,GAAG,oBAAoB,EAAE,kBAAkB,EAAE,GAAG,YAAY,CAAC;;CAE7D,GAAG;;CAEH,EAAE,KAAK,YAAY,CAAC,IAAI,KAAK,SAAS,IAAI,YAAY,CAAC,OAAO,KAAK,YAAY,GAAG;;CAElF,GAAG,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,YAAY,IAAI,aAAa,EAAE,SAAS,EAAE,EAAE,CAAC;;CAE3E,GAAG,YAAY,CAAC,IAAI,GAAG,SAAS,CAAC;CACjC,GAAG,YAAY,CAAC,OAAO,GAAG,YAAY,CAAC;;CAEvC,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,oBAAoB,GAAG;;CAEjC,EAAE,IAAI;;CAEN,GAAG,EAAE,CAAC,oBAAoB,CAAC,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;;CAElD,GAAG,CAAC,QAAQ,KAAK,GAAG;;CAEpB,GAAG,OAAO,CAAC,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC;;CAE/C,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,UAAU,GAAG;;CAEvB,EAAE,IAAI;;CAEN,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;;CAExC,GAAG,CAAC,QAAQ,KAAK,GAAG;;CAEpB,GAAG,OAAO,CAAC,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC;;CAE/C,GAAG;;CAEH,EAAE;;CAEF;;CAEA,CAAC,SAAS,OAAO,EAAE,OAAO,GAAG;;CAE7B,EAAE,KAAK,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,KAAK,GAAG;;CAEpD,GAAG,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;CAC5D,GAAG,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;;CAElC,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,QAAQ,EAAE,QAAQ,GAAG;;CAE/B,EAAE,KAAK,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,KAAK,GAAG;;CAEtD,GAAG,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;CACjE,GAAG,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;;CAEpC,GAAG;;CAEH,EAAE;;CAEF;;CAEA,CAAC,SAAS,KAAK,GAAG;;CAElB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,iBAAiB,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAExD,GAAG,KAAK,iBAAiB,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG;;CAEvC,IAAI,EAAE,CAAC,wBAAwB,EAAE,CAAC,EAAE,CAAC;CACrC,IAAI,iBAAiB,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;;CAE/B,IAAI;;CAEJ,GAAG;;CAEH,EAAE,YAAY,GAAG,EAAE,CAAC;;CAEpB,EAAE,wBAAwB,GAAG,IAAI,CAAC;;CAElC,EAAE,kBAAkB,GAAG,IAAI,CAAC;CAC5B,EAAE,oBAAoB,GAAG,EAAE,CAAC;;CAE5B,EAAE,cAAc,GAAG,IAAI,CAAC;;CAExB,EAAE,eAAe,GAAG,IAAI,CAAC;;CAEzB,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC1B,EAAE,eAAe,GAAG,IAAI,CAAC;;CAEzB,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC;CACtB,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC;CACtB,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC;;CAExB,EAAE;;CAEF,CAAC,OAAO;;CAER,EAAE,OAAO,EAAE;CACX,GAAG,KAAK,EAAE,WAAW;CACrB,GAAG,KAAK,EAAE,WAAW;CACrB,GAAG,OAAO,EAAE,aAAa;CACzB,GAAG;;CAEH,EAAE,cAAc,EAAE,cAAc;CAChC,EAAE,eAAe,EAAE,eAAe;CAClC,EAAE,yBAAyB,EAAE,yBAAyB;CACtD,EAAE,uBAAuB,EAAE,uBAAuB;CAClD,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,OAAO,EAAE,OAAO;CAClB,EAAE,2BAA2B,EAAE,2BAA2B;;CAE1D,EAAE,UAAU,EAAE,UAAU;;CAExB,EAAE,WAAW,EAAE,WAAW;CAC1B,EAAE,WAAW,EAAE,WAAW;;CAE1B,EAAE,YAAY,EAAE,YAAY;CAC5B,EAAE,WAAW,EAAE,WAAW;;CAE1B,EAAE,YAAY,EAAE,YAAY;CAC5B,EAAE,gBAAgB,EAAE,gBAAgB;;CAEpC,EAAE,cAAc,EAAE,cAAc;;CAEhC,EAAE,aAAa,EAAE,aAAa;CAC9B,EAAE,WAAW,EAAE,WAAW;CAC1B,EAAE,oBAAoB,EAAE,oBAAoB;CAC5C,EAAE,UAAU,EAAE,UAAU;;CAExB,EAAE,OAAO,EAAE,OAAO;CAClB,EAAE,QAAQ,EAAE,QAAQ;;CAEpB,EAAE,KAAK,EAAE,KAAK;;CAEd,EAAE,CAAC;;CAEH,CAAC;;CAED;CACA;CACA;;CAEA,SAAS,aAAa,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,GAAG;;CAExF,CAAC,IAAI,SAAS,KAAK,OAAO,sBAAsB,KAAK,WAAW,IAAI,GAAG,YAAY,sBAAsB,EAAE,CAAC;CAC5G,CAAC,IAAI,cAAc,GAAG,EAAE,CAAC;CACzB,CAAC,IAAI,OAAO,CAAC;;CAEb;;CAEA,CAAC,SAAS,cAAc,EAAE,KAAK,EAAE,OAAO,GAAG;;CAE3C,EAAE,KAAK,KAAK,CAAC,KAAK,GAAG,OAAO,IAAI,KAAK,CAAC,MAAM,GAAG,OAAO,GAAG;;CAEzD,GAAG,KAAK,MAAM,IAAI,KAAK,GAAG;;CAE1B,IAAI,OAAO,CAAC,IAAI,EAAE,wDAAwD,GAAG,KAAK,CAAC,KAAK,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;CACvH,IAAI,OAAO;;CAEX,IAAI;;CAEJ;CACA;;CAEA,GAAG,IAAI,KAAK,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;;CAE/D,GAAG,IAAI,MAAM,GAAG,QAAQ,CAAC,eAAe,EAAE,8BAA8B,EAAE,QAAQ,EAAE,CAAC;CACrF,GAAG,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC;CACpD,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;;CAEtD,GAAG,IAAI,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;CAC3C,GAAG,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;;CAElG,GAAG,OAAO,CAAC,IAAI,EAAE,yCAAyC,GAAG,KAAK,CAAC,KAAK,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,gBAAgB,GAAG,MAAM,CAAC,KAAK,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;;CAE/J,GAAG,OAAO,MAAM,CAAC;;CAEjB,GAAG;;CAEH,EAAE,OAAO,KAAK,CAAC;;CAEf,EAAE;;CAEF,CAAC,SAAS,YAAY,EAAE,KAAK,GAAG;;CAEhC,EAAE,OAAO,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;;CAEjF,EAAE;;CAEF,CAAC,SAAS,cAAc,EAAE,KAAK,GAAG;;CAElC,EAAE,KAAK,KAAK,YAAY,gBAAgB,IAAI,KAAK,YAAY,iBAAiB,IAAI,KAAK,YAAY,WAAW,GAAG;;CAEjH,GAAG,KAAK,OAAO,KAAK,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC,eAAe,EAAE,8BAA8B,EAAE,QAAQ,EAAE,CAAC;;CAE/G,GAAG,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;CACxD,GAAG,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;;CAE1D,GAAG,IAAI,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;CAC5C,GAAG,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;;CAEnE,GAAG,OAAO,CAAC,IAAI,EAAE,kDAAkD,GAAG,KAAK,CAAC,KAAK,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,gBAAgB,GAAG,OAAO,CAAC,KAAK,GAAG,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;;CAE1K,GAAG,OAAO,OAAO,CAAC;;CAElB,GAAG;;CAEH,EAAE,OAAO,KAAK,CAAC;;CAEf,EAAE;;CAEF,CAAC,SAAS,sBAAsB,EAAE,OAAO,GAAG;;CAE5C,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,KAAK,mBAAmB,IAAI,OAAO,CAAC,KAAK,KAAK,mBAAmB;CACzF,KAAK,OAAO,CAAC,SAAS,KAAK,aAAa,IAAI,OAAO,CAAC,SAAS,KAAK,YAAY,EAAE,CAAC;;CAEjF,EAAE;;CAEF,CAAC,SAAS,2BAA2B,EAAE,OAAO,EAAE,YAAY,GAAG;;CAE/D,EAAE,OAAO,OAAO,CAAC,eAAe,IAAI,YAAY;CAChD,GAAG,OAAO,CAAC,SAAS,KAAK,aAAa,IAAI,OAAO,CAAC,SAAS,KAAK,YAAY,CAAC;;CAE7E,EAAE;;CAEF,CAAC,SAAS,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG;;CAE3D,EAAE,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC;;CAE/B,EAAE,IAAI,iBAAiB,GAAG,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;;CAEpD;CACA,EAAE,iBAAiB,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;;CAEvF,EAAE;;CAEF;;CAEA,CAAC,SAAS,cAAc,EAAE,CAAC,GAAG;;CAE9B,EAAE,KAAK,CAAC,KAAK,aAAa,IAAI,CAAC,KAAK,0BAA0B,IAAI,CAAC,KAAK,yBAAyB,GAAG;;CAEpG,GAAG,OAAO,GAAG,CAAC,OAAO,CAAC;;CAEtB,GAAG;;CAEH,EAAE,OAAO,GAAG,CAAC,MAAM,CAAC;;CAEpB,EAAE;;CAEF;;CAEA,CAAC,SAAS,gBAAgB,EAAE,KAAK,GAAG;;CAEpC,EAAE,IAAI,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;;CAE7B,EAAE,OAAO,CAAC,mBAAmB,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;;CAE7D,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC;;CAE/B,EAAE,KAAK,OAAO,CAAC,cAAc,GAAG;;CAEhC,GAAG,OAAO,cAAc,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;;CAEvC,GAAG;;CAEH,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC;;CAE1B,EAAE;;CAEF,CAAC,SAAS,qBAAqB,EAAE,KAAK,GAAG;;CAEzC,EAAE,IAAI,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC;;CAElC,EAAE,YAAY,CAAC,mBAAmB,EAAE,SAAS,EAAE,qBAAqB,EAAE,CAAC;;CAEvE,EAAE,sBAAsB,EAAE,YAAY,EAAE,CAAC;;CAEzC,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC;;CAE1B,EAAE;;CAEF;;CAEA,CAAC,SAAS,iBAAiB,EAAE,OAAO,GAAG;;CAEvC,EAAE,IAAI,iBAAiB,GAAG,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;;CAEpD,EAAE,KAAK,OAAO,CAAC,KAAK,IAAI,iBAAiB,CAAC,yBAAyB,GAAG;;CAEtE;;CAEA,GAAG,GAAG,CAAC,aAAa,EAAE,iBAAiB,CAAC,yBAAyB,EAAE,CAAC;;CAEpE,GAAG,MAAM;;CAET;;CAEA,GAAG,KAAK,iBAAiB,CAAC,WAAW,KAAK,SAAS,GAAG,OAAO;;CAE7D,GAAG,GAAG,CAAC,aAAa,EAAE,iBAAiB,CAAC,cAAc,EAAE,CAAC;;CAEzD,GAAG;;CAEH;CACA,EAAE,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;;CAE/B,EAAE;;CAEF,CAAC,SAAS,sBAAsB,EAAE,YAAY,GAAG;;CAEjD,EAAE,IAAI,sBAAsB,GAAG,UAAU,CAAC,GAAG,EAAE,YAAY,EAAE,CAAC;CAC9D,EAAE,IAAI,iBAAiB,GAAG,UAAU,CAAC,GAAG,EAAE,YAAY,CAAC,OAAO,EAAE,CAAC;;CAEjE,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO;;CAE/B,EAAE,KAAK,iBAAiB,CAAC,cAAc,KAAK,SAAS,GAAG;;CAExD,GAAG,GAAG,CAAC,aAAa,EAAE,iBAAiB,CAAC,cAAc,EAAE,CAAC;;CAEzD,GAAG;;CAEH,EAAE,KAAK,YAAY,CAAC,YAAY,GAAG;;CAEnC,GAAG,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;;CAEvC,GAAG;;CAEH,EAAE,KAAK,YAAY,CAAC,uBAAuB,GAAG;;CAE9C,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAElC,IAAI,GAAG,CAAC,iBAAiB,EAAE,sBAAsB,CAAC,kBAAkB,EAAE,CAAC,EAAE,EAAE,CAAC;CAC5E,IAAI,KAAK,sBAAsB,CAAC,kBAAkB,GAAG,GAAG,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,kBAAkB,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE9H,IAAI;;CAEJ,GAAG,MAAM;;CAET,GAAG,GAAG,CAAC,iBAAiB,EAAE,sBAAsB,CAAC,kBAAkB,EAAE,CAAC;CACtE,GAAG,KAAK,sBAAsB,CAAC,kBAAkB,GAAG,GAAG,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,kBAAkB,EAAE,CAAC;;CAExH,GAAG;;CAEH,EAAE,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC,OAAO,EAAE,CAAC;CAC5C,EAAE,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC;;CAEpC,EAAE;;CAEF;;;;CAIA,CAAC,SAAS,YAAY,EAAE,OAAO,EAAE,IAAI,GAAG;;CAExC,EAAE,IAAI,iBAAiB,GAAG,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;;CAEpD,EAAE,KAAK,OAAO,CAAC,cAAc,GAAG,kBAAkB,EAAE,OAAO,EAAE,CAAC;;CAE9D,EAAE,KAAK,OAAO,CAAC,OAAO,GAAG,CAAC,IAAI,iBAAiB,CAAC,SAAS,KAAK,OAAO,CAAC,OAAO,GAAG;;CAEhF,GAAG,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;;CAE7B,GAAG,KAAK,KAAK,KAAK,SAAS,GAAG;;CAE9B,IAAI,OAAO,CAAC,IAAI,EAAE,uEAAuE,EAAE,OAAO,EAAE,CAAC;;CAErG,IAAI,MAAM,KAAK,KAAK,CAAC,QAAQ,KAAK,KAAK,GAAG;;CAE1C,IAAI,OAAO,CAAC,IAAI,EAAE,wEAAwE,EAAE,OAAO,EAAE,CAAC;;CAEtG,IAAI,MAAM;;CAEV,IAAI,aAAa,EAAE,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;CACtD,IAAI,OAAO;;CAEX,IAAI;;CAEJ,GAAG;;CAEH,EAAE,KAAK,CAAC,aAAa,EAAE,GAAG,CAAC,QAAQ,GAAG,IAAI,EAAE,CAAC;CAC7C,EAAE,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,UAAU,EAAE,iBAAiB,CAAC,cAAc,EAAE,CAAC;;CAExE,EAAE;;CAEF,CAAC,SAAS,cAAc,EAAE,OAAO,EAAE,IAAI,GAAG;;CAE1C,EAAE,IAAI,iBAAiB,GAAG,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;;CAEpD,EAAE,KAAK,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,GAAG;;CAEpC,GAAG,KAAK,OAAO,CAAC,OAAO,GAAG,CAAC,IAAI,iBAAiB,CAAC,SAAS,KAAK,OAAO,CAAC,OAAO,GAAG;;CAEjF,IAAI,KAAK,EAAE,iBAAiB,CAAC,yBAAyB,GAAG;;CAEzD,KAAK,OAAO,CAAC,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;;CAE7D,KAAK,iBAAiB,CAAC,yBAAyB,GAAG,GAAG,CAAC,aAAa,EAAE,CAAC;;CAEvE,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC;;CAE7B,KAAK;;CAEL,IAAI,KAAK,CAAC,aAAa,EAAE,GAAG,CAAC,QAAQ,GAAG,IAAI,EAAE,CAAC;CAC/C,IAAI,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,yBAAyB,EAAE,CAAC;;CAE3F,IAAI,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,mBAAmB,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;;CAE9D,IAAI,IAAI,YAAY,KAAK,OAAO,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;CAClE,IAAI,IAAI,aAAa,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;;CAEnF,IAAI,IAAI,SAAS,GAAG,EAAE,CAAC;;CAEvB,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEnC,KAAK,KAAK,EAAE,YAAY,IAAI,EAAE,aAAa,GAAG;;CAE9C,MAAM,SAAS,EAAE,CAAC,EAAE,GAAG,cAAc,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,YAAY,CAAC,cAAc,EAAE,CAAC;;CAEzF,MAAM,MAAM;;CAEZ,MAAM,SAAS,EAAE,CAAC,EAAE,GAAG,aAAa,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;;CAErF,MAAM;;CAEN,KAAK;;CAEL,IAAI,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC,EAAE;CAC9B,KAAK,iBAAiB,GAAG,YAAY,EAAE,KAAK,EAAE;CAC9C,KAAK,QAAQ,GAAG,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE;CAC/C,KAAK,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;;CAE5C,IAAI,oBAAoB,EAAE,GAAG,CAAC,gBAAgB,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC;;CAE7E,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEnC,KAAK,KAAK,EAAE,YAAY,GAAG;;CAE3B,MAAM,KAAK,aAAa,GAAG;;CAE3B,OAAO,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,2BAA2B,GAAG,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;;CAEnK,OAAO,MAAM;;CAEb,OAAO,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,2BAA2B,GAAG,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE9G,OAAO;;CAEP,MAAM,MAAM;;CAEZ,MAAM,IAAI,MAAM,EAAE,OAAO,GAAG,SAAS,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC;;CAEnD,MAAM,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAE3D,OAAO,MAAM,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC;;CAE7B,OAAO,KAAK,OAAO,CAAC,MAAM,KAAK,UAAU,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,GAAG;;CAE5E,QAAQ,KAAK,KAAK,CAAC,2BAA2B,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,GAAG;;CAE7E,SAAS,KAAK,CAAC,oBAAoB,EAAE,GAAG,CAAC,2BAA2B,GAAG,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;;CAErI,SAAS,MAAM;;CAEf,SAAS,OAAO,CAAC,IAAI,EAAE,iGAAiG,EAAE,CAAC;;CAE3H,SAAS;;CAET,QAAQ,MAAM;;CAEd,QAAQ,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,2BAA2B,GAAG,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;;CAE5I,QAAQ;;CAER,OAAO;;CAEP,MAAM;;CAEN,KAAK;;CAEL,IAAI,KAAK,EAAE,YAAY,GAAG;;CAE1B,KAAK,iBAAiB,CAAC,aAAa,GAAG,CAAC,CAAC;;CAEzC,KAAK,MAAM;;CAEX,KAAK,iBAAiB,CAAC,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;;CAE1D,KAAK;;CAEL,IAAI,KAAK,2BAA2B,EAAE,OAAO,EAAE,iBAAiB,EAAE,GAAG;;CAErE;CACA,KAAK,cAAc,EAAE,GAAG,CAAC,gBAAgB,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;;CAEhF,KAAK;;CAEL,IAAI,iBAAiB,CAAC,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;;CAElD,IAAI,KAAK,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;;CAExD,IAAI,MAAM;;CAEV,IAAI,KAAK,CAAC,aAAa,EAAE,GAAG,CAAC,QAAQ,GAAG,IAAI,EAAE,CAAC;CAC/C,IAAI,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,yBAAyB,EAAE,CAAC;;CAE3F,IAAI;;CAEJ,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,qBAAqB,EAAE,OAAO,EAAE,IAAI,GAAG;;CAEjD,EAAE,KAAK,CAAC,aAAa,EAAE,GAAG,CAAC,QAAQ,GAAG,IAAI,EAAE,CAAC;CAC7C,EAAE,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,gBAAgB,EAAE,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,cAAc,EAAE,CAAC;;CAEtF,EAAE;;CAEF,CAAC,SAAS,oBAAoB,EAAE,WAAW,EAAE,OAAO,EAAE,iBAAiB,GAAG;;CAE1E,EAAE,IAAI,SAAS,CAAC;;CAEhB,EAAE,KAAK,iBAAiB,GAAG;;CAE3B,GAAG,GAAG,CAAC,aAAa,EAAE,WAAW,EAAE,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;CACxF,GAAG,GAAG,CAAC,aAAa,EAAE,WAAW,EAAE,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;;CAExF,GAAG,GAAG,CAAC,aAAa,EAAE,WAAW,EAAE,GAAG,CAAC,kBAAkB,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;CAChG,GAAG,GAAG,CAAC,aAAa,EAAE,WAAW,EAAE,GAAG,CAAC,kBAAkB,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;;CAEhG,GAAG,MAAM;;CAET,GAAG,GAAG,CAAC,aAAa,EAAE,WAAW,EAAE,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC;CAC3E,GAAG,GAAG,CAAC,aAAa,EAAE,WAAW,EAAE,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC;;CAE3E,GAAG,KAAK,OAAO,CAAC,KAAK,KAAK,mBAAmB,IAAI,OAAO,CAAC,KAAK,KAAK,mBAAmB,GAAG;;CAEzF,IAAI,OAAO,CAAC,IAAI,EAAE,+HAA+H,EAAE,OAAO,EAAE,CAAC;;CAE7J,IAAI;;CAEJ,GAAG,GAAG,CAAC,aAAa,EAAE,WAAW,EAAE,GAAG,CAAC,kBAAkB,EAAE,cAAc,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;CACjG,GAAG,GAAG,CAAC,aAAa,EAAE,WAAW,EAAE,GAAG,CAAC,kBAAkB,EAAE,cAAc,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;;CAEjG,GAAG,KAAK,OAAO,CAAC,SAAS,KAAK,aAAa,IAAI,OAAO,CAAC,SAAS,KAAK,YAAY,GAAG;;CAEpF,IAAI,OAAO,CAAC,IAAI,EAAE,iIAAiI,EAAE,OAAO,EAAE,CAAC;;CAE/J,IAAI;;CAEJ,GAAG;;CAEH,EAAE,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,gCAAgC,EAAE,CAAC;;CAEjE,EAAE,KAAK,SAAS,GAAG;;CAEnB,GAAG,KAAK,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,UAAU,CAAC,GAAG,EAAE,0BAA0B,EAAE,KAAK,IAAI,GAAG,OAAO;CACrG,GAAG,KAAK,OAAO,CAAC,IAAI,KAAK,aAAa,IAAI,UAAU,CAAC,GAAG,EAAE,+BAA+B,EAAE,KAAK,IAAI,GAAG,OAAO;;CAE9G,GAAG,KAAK,OAAO,CAAC,UAAU,GAAG,CAAC,IAAI,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,mBAAmB,GAAG;;CAElF,IAAI,GAAG,CAAC,aAAa,EAAE,WAAW,EAAE,SAAS,CAAC,0BAA0B,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,gBAAgB,EAAE,EAAE,EAAE,CAAC;CAC5I,IAAI,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC;;CAEvE,IAAI;;CAEJ,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,aAAa,EAAE,iBAAiB,EAAE,OAAO,EAAE,IAAI,GAAG;;CAE5D,EAAE,KAAK,iBAAiB,CAAC,WAAW,KAAK,SAAS,GAAG;;CAErD,GAAG,iBAAiB,CAAC,WAAW,GAAG,IAAI,CAAC;;CAExC,GAAG,OAAO,CAAC,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;;CAE3D,GAAG,iBAAiB,CAAC,cAAc,GAAG,GAAG,CAAC,aAAa,EAAE,CAAC;;CAE1D,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC;;CAE3B,GAAG;;CAEH,EAAE,KAAK,CAAC,aAAa,EAAE,GAAG,CAAC,QAAQ,GAAG,IAAI,EAAE,CAAC;CAC7C,EAAE,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,UAAU,EAAE,iBAAiB,CAAC,cAAc,EAAE,CAAC;;CAExE,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,mBAAmB,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;CAC5D,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,8BAA8B,EAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC;CAClF,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,gBAAgB,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC;;CAEnE,EAAE,IAAI,KAAK,GAAG,cAAc,EAAE,OAAO,CAAC,KAAK,EAAE,YAAY,CAAC,cAAc,EAAE,CAAC;;CAE3E,EAAE,KAAK,sBAAsB,EAAE,OAAO,EAAE,IAAI,YAAY,EAAE,KAAK,EAAE,KAAK,KAAK,GAAG;;CAE9E,GAAG,KAAK,GAAG,cAAc,EAAE,KAAK,EAAE,CAAC;;CAEnC,GAAG;;CAEH,EAAE,IAAI,iBAAiB,GAAG,YAAY,EAAE,KAAK,EAAE;CAC/C,GAAG,QAAQ,GAAG,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE;CAC7C,GAAG,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;;CAE1C,EAAE,oBAAoB,EAAE,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC;;CAErE,EAAE,IAAI,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;;CAExC,EAAE,KAAK,OAAO,CAAC,cAAc,GAAG;;CAEhC;;CAEA,GAAG,IAAI,cAAc,GAAG,GAAG,CAAC,eAAe,CAAC;;CAE5C,GAAG,KAAK,OAAO,CAAC,IAAI,KAAK,SAAS,GAAG;;CAErC,IAAI,KAAK,EAAE,SAAS,GAAG,MAAM,IAAI,KAAK,EAAE,gDAAgD,EAAE,CAAC;CAC3F,IAAI,cAAc,GAAG,GAAG,CAAC,kBAAkB,CAAC;;CAE5C,IAAI,MAAM,KAAK,SAAS,GAAG;;CAE3B;CACA,IAAI,cAAc,GAAG,GAAG,CAAC,iBAAiB,CAAC;;CAE3C,IAAI;;CAEJ,GAAG,KAAK,OAAO,CAAC,MAAM,KAAK,WAAW,IAAI,cAAc,KAAK,GAAG,CAAC,eAAe,GAAG;;CAEnF;CACA;CACA;CACA,IAAI,KAAK,OAAO,CAAC,IAAI,KAAK,iBAAiB,IAAI,OAAO,CAAC,IAAI,KAAK,eAAe,GAAG;;CAElF,KAAK,OAAO,CAAC,IAAI,EAAE,6FAA6F,EAAE,CAAC;;CAEnH,KAAK,OAAO,CAAC,IAAI,GAAG,iBAAiB,CAAC;CACtC,KAAK,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;;CAE5C,KAAK;;CAEL,IAAI;;CAEJ;CACA;CACA,GAAG,KAAK,OAAO,CAAC,MAAM,KAAK,kBAAkB,GAAG;;CAEhD,IAAI,cAAc,GAAG,GAAG,CAAC,aAAa,CAAC;;CAEvC;CACA;CACA;CACA,IAAI,KAAK,OAAO,CAAC,IAAI,KAAK,kBAAkB,GAAG;;CAE/C,KAAK,OAAO,CAAC,IAAI,EAAE,kFAAkF,EAAE,CAAC;;CAExG,KAAK,OAAO,CAAC,IAAI,GAAG,kBAAkB,CAAC;CACvC,KAAK,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;;CAE5C,KAAK;;CAEL,IAAI;;CAEJ,GAAG,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;CAE/G,GAAG,MAAM,KAAK,OAAO,CAAC,aAAa,GAAG;;CAEtC;CACA;CACA;;CAEA,GAAG,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,iBAAiB,GAAG;;CAElD,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEzD,KAAK,MAAM,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC;CAC3B,KAAK,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;;CAEpH,KAAK;;CAEL,IAAI,OAAO,CAAC,eAAe,GAAG,KAAK,CAAC;CACpC,IAAI,iBAAiB,CAAC,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;;CAEzD,IAAI,MAAM;;CAEV,IAAI,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;CAChH,IAAI,iBAAiB,CAAC,aAAa,GAAG,CAAC,CAAC;;CAExC,IAAI;;CAEJ,GAAG,MAAM,KAAK,OAAO,CAAC,mBAAmB,GAAG;;CAE5C,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAExD,IAAI,MAAM,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC;;CAE1B,IAAI,KAAK,OAAO,CAAC,MAAM,KAAK,UAAU,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,GAAG;;CAEzE,KAAK,KAAK,KAAK,CAAC,2BAA2B,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,GAAG;;CAE1E,MAAM,KAAK,CAAC,oBAAoB,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;;CAE7G,MAAM,MAAM;;CAEZ,MAAM,OAAO,CAAC,IAAI,EAAE,gGAAgG,EAAE,CAAC;;CAEvH,MAAM;;CAEN,KAAK,MAAM;;CAEX,KAAK,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;;CAEpH,KAAK;;CAEL,IAAI;;CAEJ,GAAG,iBAAiB,CAAC,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;;CAExD,GAAG,MAAM;;CAET;;CAEA;CACA;CACA;;CAEA,GAAG,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,iBAAiB,GAAG;;CAElD,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEzD,KAAK,MAAM,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC;CAC3B,KAAK,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;;CAE/E,KAAK;;CAEL,IAAI,OAAO,CAAC,eAAe,GAAG,KAAK,CAAC;CACpC,IAAI,iBAAiB,CAAC,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;;CAEzD,IAAI,MAAM;;CAEV,IAAI,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;CAC7E,IAAI,iBAAiB,CAAC,aAAa,GAAG,CAAC,CAAC;;CAExC,IAAI;;CAEJ,GAAG;;CAEH,EAAE,KAAK,2BAA2B,EAAE,OAAO,EAAE,iBAAiB,EAAE,GAAG;;CAEnE,GAAG,cAAc,EAAE,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;;CAExE,GAAG;;CAEH,EAAE,iBAAiB,CAAC,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;;CAEhD,EAAE,KAAK,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;;CAEtD,EAAE;;CAEF;;CAEA;CACA,CAAC,SAAS,uBAAuB,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,GAAG;;CAE1F,EAAE,IAAI,QAAQ,GAAG,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;CAC9D,EAAE,IAAI,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;CAC1D,EAAE,KAAK,CAAC,UAAU,EAAE,aAAa,EAAE,CAAC,EAAE,QAAQ,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;CACrH,EAAE,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC;CACtD,EAAE,GAAG,CAAC,oBAAoB,EAAE,GAAG,CAAC,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,CAAC,GAAG,EAAE,YAAY,CAAC,OAAO,EAAE,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC;CACnI,EAAE,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;;CAE/C,EAAE;;CAEF;CACA,CAAC,SAAS,wBAAwB,EAAE,YAAY,EAAE,YAAY,GAAG;;CAEjE,EAAE,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC;;CAEzD,EAAE,KAAK,YAAY,CAAC,WAAW,IAAI,EAAE,YAAY,CAAC,aAAa,GAAG;;CAElE,GAAG,GAAG,CAAC,mBAAmB,EAAE,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,iBAAiB,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC;CAC/G,GAAG,GAAG,CAAC,uBAAuB,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC;;CAExG,GAAG,MAAM,KAAK,YAAY,CAAC,WAAW,IAAI,YAAY,CAAC,aAAa,GAAG;;CAEvE,GAAG,GAAG,CAAC,mBAAmB,EAAE,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,aAAa,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC;CAC3G,GAAG,GAAG,CAAC,uBAAuB,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,wBAAwB,EAAE,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC;;CAEhH,GAAG,MAAM;;CAET;CACA,GAAG,GAAG,CAAC,mBAAmB,EAAE,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC;;CAEnG,GAAG;;CAEH,EAAE,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;;CAEjD,EAAE;;CAEF;CACA,CAAC,SAAS,iBAAiB,EAAE,WAAW,EAAE,YAAY,GAAG;;CAEzD,EAAE,IAAI,MAAM,KAAK,YAAY,IAAI,YAAY,CAAC,uBAAuB,EAAE,CAAC;CACxE,EAAE,KAAK,MAAM,GAAG,MAAM,IAAI,KAAK,EAAE,yDAAyD,EAAE,CAAC;;CAE7F,EAAE,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC;;CAEtD,EAAE,KAAK,IAAI,YAAY,CAAC,YAAY,IAAI,YAAY,CAAC,YAAY,CAAC,cAAc,EAAE,GAAG;;CAErF,GAAG,MAAM,IAAI,KAAK,EAAE,qEAAqE,EAAE,CAAC;;CAE5F,GAAG;;CAEH;CACA,EAAE,KAAK,EAAE,UAAU,CAAC,GAAG,EAAE,YAAY,CAAC,YAAY,EAAE,CAAC,cAAc;CACnE,IAAI,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,KAAK,YAAY,CAAC,KAAK;CAChE,IAAI,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,GAAG;;CAErE,GAAG,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC;CAC9D,GAAG,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;CAChE,GAAG,YAAY,CAAC,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEhD,GAAG;;CAEH,EAAE,YAAY,EAAE,YAAY,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC;;CAE/C,EAAE,IAAI,iBAAiB,GAAG,UAAU,CAAC,GAAG,EAAE,YAAY,CAAC,YAAY,EAAE,CAAC,cAAc,CAAC;;CAErF,EAAE,KAAK,YAAY,CAAC,YAAY,CAAC,MAAM,KAAK,WAAW,GAAG;;CAE1D,GAAG,GAAG,CAAC,oBAAoB,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,UAAU,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;;CAE3G,GAAG,MAAM,KAAK,YAAY,CAAC,YAAY,CAAC,MAAM,KAAK,kBAAkB,GAAG;;CAExE,GAAG,GAAG,CAAC,oBAAoB,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,wBAAwB,EAAE,GAAG,CAAC,UAAU,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;;CAEnH,GAAG,MAAM;;CAET,GAAG,MAAM,IAAI,KAAK,EAAE,6BAA6B,EAAE,CAAC;;CAEpD,GAAG;;CAEH,EAAE;;CAEF;CACA,CAAC,SAAS,sBAAsB,EAAE,YAAY,GAAG;;CAEjD,EAAE,IAAI,sBAAsB,GAAG,UAAU,CAAC,GAAG,EAAE,YAAY,EAAE,CAAC;;CAE9D,EAAE,IAAI,MAAM,KAAK,YAAY,CAAC,uBAAuB,KAAK,IAAI,EAAE,CAAC;;CAEjE,EAAE,KAAK,YAAY,CAAC,YAAY,GAAG;;CAEnC,GAAG,KAAK,MAAM,GAAG,MAAM,IAAI,KAAK,EAAE,0DAA0D,EAAE,CAAC;;CAE/F,GAAG,iBAAiB,EAAE,sBAAsB,CAAC,kBAAkB,EAAE,YAAY,EAAE,CAAC;;CAEhF,GAAG,MAAM;;CAET,GAAG,KAAK,MAAM,GAAG;;CAEjB,IAAI,sBAAsB,CAAC,kBAAkB,GAAG,EAAE,CAAC;;CAEnD,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEnC,KAAK,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,WAAW,EAAE,sBAAsB,CAAC,kBAAkB,EAAE,CAAC,EAAE,EAAE,CAAC;CAC5F,KAAK,sBAAsB,CAAC,kBAAkB,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,kBAAkB,EAAE,CAAC;CAC/E,KAAK,wBAAwB,EAAE,sBAAsB,CAAC,kBAAkB,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC;;CAE9F,KAAK;;CAEL,IAAI,MAAM;;CAEV,IAAI,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,WAAW,EAAE,sBAAsB,CAAC,kBAAkB,EAAE,CAAC;CACtF,IAAI,sBAAsB,CAAC,kBAAkB,GAAG,GAAG,CAAC,kBAAkB,EAAE,CAAC;CACzE,IAAI,wBAAwB,EAAE,sBAAsB,CAAC,kBAAkB,EAAE,YAAY,EAAE,CAAC;;CAExF,IAAI;;CAEJ,GAAG;;CAEH,EAAE,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;;CAE/C,EAAE;;CAEF;CACA,CAAC,SAAS,iBAAiB,EAAE,YAAY,GAAG;;CAE5C,EAAE,IAAI,sBAAsB,GAAG,UAAU,CAAC,GAAG,EAAE,YAAY,EAAE,CAAC;CAC9D,EAAE,IAAI,iBAAiB,GAAG,UAAU,CAAC,GAAG,EAAE,YAAY,CAAC,OAAO,EAAE,CAAC;;CAEjE,EAAE,YAAY,CAAC,gBAAgB,EAAE,SAAS,EAAE,qBAAqB,EAAE,CAAC;;CAEpE,EAAE,iBAAiB,CAAC,cAAc,GAAG,GAAG,CAAC,aAAa,EAAE,CAAC;;CAEzD,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC;;CAE1B,EAAE,IAAI,MAAM,KAAK,YAAY,CAAC,uBAAuB,KAAK,IAAI,EAAE,CAAC;CACjE,EAAE,IAAI,kBAAkB,GAAG,YAAY,EAAE,YAAY,EAAE,CAAC;;CAExD;;CAEA,EAAE,KAAK,MAAM,GAAG;;CAEhB,GAAG,sBAAsB,CAAC,kBAAkB,GAAG,EAAE,CAAC;;CAElD,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAElC,IAAI,sBAAsB,CAAC,kBAAkB,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,iBAAiB,EAAE,CAAC;;CAE7E,IAAI;;CAEJ,GAAG,MAAM;;CAET,GAAG,sBAAsB,CAAC,kBAAkB,GAAG,GAAG,CAAC,iBAAiB,EAAE,CAAC;;CAEvE,GAAG;;CAEH;;CAEA,EAAE,KAAK,MAAM,GAAG;;CAEhB,GAAG,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,cAAc,EAAE,CAAC;CAC/E,GAAG,oBAAoB,EAAE,GAAG,CAAC,gBAAgB,EAAE,YAAY,CAAC,OAAO,EAAE,kBAAkB,EAAE,CAAC;;CAE1F,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAElC,IAAI,uBAAuB,EAAE,sBAAsB,CAAC,kBAAkB,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,CAAC,iBAAiB,EAAE,GAAG,CAAC,2BAA2B,GAAG,CAAC,EAAE,CAAC;;CAExJ,IAAI;;CAEJ,GAAG,KAAK,2BAA2B,EAAE,YAAY,CAAC,OAAO,EAAE,kBAAkB,EAAE,GAAG;;CAElF,IAAI,cAAc,EAAE,GAAG,CAAC,gBAAgB,EAAE,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC;;CAE1G,IAAI;;CAEJ,GAAG,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC;;CAEnD,GAAG,MAAM;;CAET,GAAG,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,UAAU,EAAE,iBAAiB,CAAC,cAAc,EAAE,CAAC;CACzE,GAAG,oBAAoB,EAAE,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC,OAAO,EAAE,kBAAkB,EAAE,CAAC;CACpF,GAAG,uBAAuB,EAAE,sBAAsB,CAAC,kBAAkB,EAAE,YAAY,EAAE,GAAG,CAAC,iBAAiB,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC;;CAE7H,GAAG,KAAK,2BAA2B,EAAE,YAAY,CAAC,OAAO,EAAE,kBAAkB,EAAE,GAAG;;CAElF,IAAI,cAAc,EAAE,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC;;CAEpG,IAAI;;CAEJ,GAAG,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;;CAE7C,GAAG;;CAEH;;CAEA,EAAE,KAAK,YAAY,CAAC,WAAW,GAAG;;CAElC,GAAG,sBAAsB,EAAE,YAAY,EAAE,CAAC;;CAE1C,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,wBAAwB,EAAE,YAAY,GAAG;;CAEnD,EAAE,IAAI,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC;CACrC,EAAE,IAAI,kBAAkB,GAAG,YAAY,EAAE,YAAY,EAAE,CAAC;;CAExD,EAAE,KAAK,2BAA2B,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG;;CAEpE,GAAG,IAAI,MAAM,GAAG,YAAY,CAAC,uBAAuB,GAAG,GAAG,CAAC,gBAAgB,GAAG,GAAG,CAAC,UAAU,CAAC;CAC7F,GAAG,IAAI,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,cAAc,CAAC;;CAE/D,GAAG,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;CAC7C,GAAG,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC;CAC9E,GAAG,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;CAErC,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,kBAAkB,EAAE,OAAO,GAAG;;CAExC,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;CACtB,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;;CAEhC;;CAEA,EAAE,KAAK,cAAc,EAAE,EAAE,EAAE,KAAK,KAAK,GAAG;;CAExC,GAAG,cAAc,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC;CAChC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;;CAEpB,GAAG;;CAEH,EAAE;;CAEF,CAAC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;CAClC,CAAC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;CACtC,CAAC,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,CAAC;CACpD,CAAC,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;CAC5C,CAAC,IAAI,CAAC,wBAAwB,GAAG,wBAAwB,CAAC;;CAE1D,CAAC;;CAED;CACA;CACA;;CAEA,SAAS,UAAU,EAAE,EAAE,EAAE,UAAU,GAAG;;CAEtC,CAAC,SAAS,OAAO,EAAE,CAAC,GAAG;;CAEvB,EAAE,IAAI,SAAS,CAAC;;CAEhB,EAAE,KAAK,CAAC,KAAK,cAAc,GAAG,OAAO,EAAE,CAAC,MAAM,CAAC;CAC/C,EAAE,KAAK,CAAC,KAAK,mBAAmB,GAAG,OAAO,EAAE,CAAC,aAAa,CAAC;CAC3D,EAAE,KAAK,CAAC,KAAK,sBAAsB,GAAG,OAAO,EAAE,CAAC,eAAe,CAAC;;CAEhE,EAAE,KAAK,CAAC,KAAK,aAAa,GAAG,OAAO,EAAE,CAAC,OAAO,CAAC;CAC/C,EAAE,KAAK,CAAC,KAAK,0BAA0B,GAAG,OAAO,EAAE,CAAC,sBAAsB,CAAC;CAC3E,EAAE,KAAK,CAAC,KAAK,yBAAyB,GAAG,OAAO,EAAE,CAAC,qBAAqB,CAAC;;CAEzE,EAAE,KAAK,CAAC,KAAK,YAAY,GAAG,OAAO,EAAE,CAAC,MAAM,CAAC;CAC7C,EAAE,KAAK,CAAC,KAAK,yBAAyB,GAAG,OAAO,EAAE,CAAC,qBAAqB,CAAC;CACzE,EAAE,KAAK,CAAC,KAAK,wBAAwB,GAAG,OAAO,EAAE,CAAC,oBAAoB,CAAC;;CAEvE,EAAE,KAAK,CAAC,KAAK,gBAAgB,GAAG,OAAO,EAAE,CAAC,aAAa,CAAC;CACxD,EAAE,KAAK,CAAC,KAAK,qBAAqB,GAAG,OAAO,EAAE,CAAC,sBAAsB,CAAC;CACtE,EAAE,KAAK,CAAC,KAAK,qBAAqB,GAAG,OAAO,EAAE,CAAC,sBAAsB,CAAC;CACtE,EAAE,KAAK,CAAC,KAAK,oBAAoB,GAAG,OAAO,EAAE,CAAC,oBAAoB,CAAC;;CAEnE,EAAE,KAAK,CAAC,KAAK,QAAQ,GAAG,OAAO,EAAE,CAAC,IAAI,CAAC;CACvC,EAAE,KAAK,CAAC,KAAK,SAAS,GAAG,OAAO,EAAE,CAAC,KAAK,CAAC;CACzC,EAAE,KAAK,CAAC,KAAK,iBAAiB,GAAG,OAAO,EAAE,CAAC,cAAc,CAAC;CAC1D,EAAE,KAAK,CAAC,KAAK,OAAO,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC;CACrC,EAAE,KAAK,CAAC,KAAK,eAAe,GAAG,OAAO,EAAE,CAAC,YAAY,CAAC;CACtD,EAAE,KAAK,CAAC,KAAK,SAAS,GAAG,OAAO,EAAE,CAAC,KAAK,CAAC;;CAEzC,EAAE,KAAK,CAAC,KAAK,aAAa,GAAG;;CAE7B,GAAG,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,wBAAwB,EAAE,CAAC;;CAE1D,GAAG,KAAK,SAAS,KAAK,IAAI,GAAG,OAAO,SAAS,CAAC,cAAc,CAAC;;CAE7D,GAAG;;CAEH,EAAE,KAAK,CAAC,KAAK,WAAW,GAAG,OAAO,EAAE,CAAC,KAAK,CAAC;CAC3C,EAAE,KAAK,CAAC,KAAK,SAAS,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC;CACvC,EAAE,KAAK,CAAC,KAAK,UAAU,GAAG,OAAO,EAAE,CAAC,IAAI,CAAC;CACzC,EAAE,KAAK,CAAC,KAAK,eAAe,GAAG,OAAO,EAAE,CAAC,SAAS,CAAC;CACnD,EAAE,KAAK,CAAC,KAAK,oBAAoB,GAAG,OAAO,EAAE,CAAC,eAAe,CAAC;CAC9D,EAAE,KAAK,CAAC,KAAK,WAAW,GAAG,OAAO,EAAE,CAAC,eAAe,CAAC;CACrD,EAAE,KAAK,CAAC,KAAK,kBAAkB,GAAG,OAAO,EAAE,CAAC,aAAa,CAAC;;CAE1D,EAAE,KAAK,CAAC,KAAK,WAAW,GAAG,OAAO,EAAE,CAAC,QAAQ,CAAC;CAC9C,EAAE,KAAK,CAAC,KAAK,gBAAgB,GAAG,OAAO,EAAE,CAAC,aAAa,CAAC;CACxD,EAAE,KAAK,CAAC,KAAK,uBAAuB,GAAG,OAAO,EAAE,CAAC,qBAAqB,CAAC;;CAEvE,EAAE,KAAK,CAAC,KAAK,UAAU,GAAG,OAAO,EAAE,CAAC,IAAI,CAAC;CACzC,EAAE,KAAK,CAAC,KAAK,SAAS,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC;CACvC,EAAE,KAAK,CAAC,KAAK,cAAc,GAAG,OAAO,EAAE,CAAC,SAAS,CAAC;CAClD,EAAE,KAAK,CAAC,KAAK,sBAAsB,GAAG,OAAO,EAAE,CAAC,mBAAmB,CAAC;CACpE,EAAE,KAAK,CAAC,KAAK,cAAc,GAAG,OAAO,EAAE,CAAC,SAAS,CAAC;CAClD,EAAE,KAAK,CAAC,KAAK,sBAAsB,GAAG,OAAO,EAAE,CAAC,mBAAmB,CAAC;CACpE,EAAE,KAAK,CAAC,KAAK,cAAc,GAAG,OAAO,EAAE,CAAC,SAAS,CAAC;CAClD,EAAE,KAAK,CAAC,KAAK,sBAAsB,GAAG,OAAO,EAAE,CAAC,mBAAmB,CAAC;;CAEpE,EAAE,KAAK,CAAC,KAAK,cAAc,GAAG,OAAO,EAAE,CAAC,SAAS,CAAC;CAClD,EAAE,KAAK,CAAC,KAAK,sBAAsB,GAAG,OAAO,EAAE,CAAC,mBAAmB,CAAC;CACpE,EAAE,KAAK,CAAC,KAAK,sBAAsB,GAAG,OAAO,EAAE,CAAC,kBAAkB,CAAC;;CAEnE,EAAE,KAAK,CAAC,KAAK,oBAAoB,IAAI,CAAC,KAAK,qBAAqB;CAChE,GAAG,CAAC,KAAK,qBAAqB,IAAI,CAAC,KAAK,qBAAqB,GAAG;;CAEhE,GAAG,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,+BAA+B,EAAE,CAAC;;CAEjE,GAAG,KAAK,SAAS,KAAK,IAAI,GAAG;;CAE7B,IAAI,KAAK,CAAC,KAAK,oBAAoB,GAAG,OAAO,SAAS,CAAC,4BAA4B,CAAC;CACpF,IAAI,KAAK,CAAC,KAAK,qBAAqB,GAAG,OAAO,SAAS,CAAC,6BAA6B,CAAC;CACtF,IAAI,KAAK,CAAC,KAAK,qBAAqB,GAAG,OAAO,SAAS,CAAC,6BAA6B,CAAC;CACtF,IAAI,KAAK,CAAC,KAAK,qBAAqB,GAAG,OAAO,SAAS,CAAC,6BAA6B,CAAC;;CAEtF,IAAI;;CAEJ,GAAG;;CAEH,EAAE,KAAK,CAAC,KAAK,uBAAuB,IAAI,CAAC,KAAK,uBAAuB;CACrE,GAAG,CAAC,KAAK,wBAAwB,IAAI,CAAC,KAAK,wBAAwB,GAAG;;CAEtE,GAAG,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,gCAAgC,EAAE,CAAC;;CAElE,GAAG,KAAK,SAAS,KAAK,IAAI,GAAG;;CAE7B,IAAI,KAAK,CAAC,KAAK,uBAAuB,GAAG,OAAO,SAAS,CAAC,+BAA+B,CAAC;CAC1F,IAAI,KAAK,CAAC,KAAK,uBAAuB,GAAG,OAAO,SAAS,CAAC,+BAA+B,CAAC;CAC1F,IAAI,KAAK,CAAC,KAAK,wBAAwB,GAAG,OAAO,SAAS,CAAC,gCAAgC,CAAC;CAC5F,IAAI,KAAK,CAAC,KAAK,wBAAwB,GAAG,OAAO,SAAS,CAAC,gCAAgC,CAAC;;CAE5F,IAAI;;CAEJ,GAAG;;CAEH,EAAE,KAAK,CAAC,KAAK,eAAe,GAAG;;CAE/B,GAAG,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,+BAA+B,EAAE,CAAC;;CAEjE,GAAG,KAAK,SAAS,KAAK,IAAI,GAAG,OAAO,SAAS,CAAC,yBAAyB,CAAC;;CAExE,GAAG;;CAEH,EAAE,KAAK,CAAC,KAAK,oBAAoB,IAAI,CAAC,KAAK,oBAAoB,IAAI,CAAC,KAAK,oBAAoB;CAC7F,GAAG,CAAC,KAAK,oBAAoB,IAAI,CAAC,KAAK,oBAAoB,IAAI,CAAC,KAAK,oBAAoB;CACzF,GAAG,CAAC,KAAK,oBAAoB,IAAI,CAAC,KAAK,oBAAoB,IAAI,CAAC,KAAK,qBAAqB;CAC1F,GAAG,CAAC,KAAK,qBAAqB,IAAI,CAAC,KAAK,qBAAqB,IAAI,CAAC,KAAK,sBAAsB;CAC7F,GAAG,CAAC,KAAK,sBAAsB,IAAI,CAAC,KAAK,sBAAsB,GAAG;;CAElE,GAAG,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,+BAA+B,EAAE,CAAC;;CAEjE,GAAG,KAAK,SAAS,KAAK,IAAI,GAAG;;CAE7B,IAAI,OAAO,CAAC,CAAC;;CAEb,IAAI;;CAEJ,GAAG;;CAEH,EAAE,KAAK,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,WAAW,GAAG;;CAEhD,GAAG,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,kBAAkB,EAAE,CAAC;;CAEpD,GAAG,KAAK,SAAS,KAAK,IAAI,GAAG;;CAE7B,IAAI,KAAK,CAAC,KAAK,WAAW,GAAG,OAAO,SAAS,CAAC,OAAO,CAAC;CACtD,IAAI,KAAK,CAAC,KAAK,WAAW,GAAG,OAAO,SAAS,CAAC,OAAO,CAAC;;CAEtD,IAAI;;CAEJ,GAAG;;CAEH,EAAE,KAAK,CAAC,KAAK,kBAAkB,GAAG;;CAElC,GAAG,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,qBAAqB,EAAE,CAAC;;CAEvD,GAAG,KAAK,SAAS,KAAK,IAAI,GAAG,OAAO,SAAS,CAAC,uBAAuB,CAAC;;CAEtE,GAAG;;CAEH,EAAE,OAAO,CAAC,CAAC;;CAEX,EAAE;;CAEF,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;;CAE7B,CAAC;;CAED;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,iBAAiB,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG;;CAErD,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAErB,CAAC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;;CAEjC,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,KAAK,SAAS,GAAG,GAAG,GAAG,EAAE,CAAC;CACzC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;;CAEf,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,KAAK,SAAS,GAAG,IAAI,GAAG,GAAG,CAAC;CAC7C,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,KAAK,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC;CAC3C,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;;CAEjB,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,KAAK,SAAS,GAAG,MAAM,GAAG,CAAC,CAAC;CACjD,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;;CAElB,CAAC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;CACrB,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;;CAErB,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC;;CAE/B,CAAC;;CAED,iBAAiB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,EAAE;;CAEhF,CAAC,WAAW,EAAE,iBAAiB;;CAE/B,CAAC,mBAAmB,EAAE,IAAI;;CAE1B,CAAC,IAAI,EAAE,WAAW,MAAM,EAAE,SAAS,GAAG;;CAEtC,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;;CAExD,EAAE,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;CACxB,EAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;;CAE1B,EAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;CAC1B,EAAE,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;CACxB,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;;CAE5B,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;CAC9B,EAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,KAAK,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;;CAE7E,EAAE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;CACpC,EAAE,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;;CAEtC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,CAAC,cAAc,EAAE,WAAW,WAAW,GAAG;;CAE1C;CACA,EAAE,IAAI,YAAY,GAAG,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,WAAW,CAAC;;CAE9D,EAAE,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC;CAC3D,EAAE,IAAI,CAAC,sBAAsB,EAAE,CAAC;;CAEhC,EAAE;;CAEF;CACA;CACA;CACA,CAAC,cAAc,EAAE,YAAY;;CAE7B,EAAE,IAAI,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;;CAEhE,EAAE,OAAO,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,YAAY,CAAC;;CAEnD,EAAE;;CAEF,CAAC,eAAe,EAAE,YAAY;;CAE9B,EAAE,OAAO,KAAK,CAAC,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI;CACtC,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;;CAE5D,EAAE;;CAEF,CAAC,YAAY,EAAE,YAAY;;CAE3B;CACA,EAAE,OAAO,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;;CAErD,EAAE;;CAEF,CAAC,aAAa,EAAE,YAAY;;CAE5B;CACA,EAAE,OAAO,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;;CAErD,EAAE;;CAEF;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,CAAC,aAAa,EAAE,WAAW,SAAS,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG;;CAExE,EAAE,IAAI,CAAC,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;;CAEvC,EAAE,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,GAAG;;CAE5B,GAAG,IAAI,CAAC,IAAI,GAAG;CACf,IAAI,OAAO,EAAE,IAAI;CACjB,IAAI,SAAS,EAAE,CAAC;CAChB,IAAI,UAAU,EAAE,CAAC;CACjB,IAAI,OAAO,EAAE,CAAC;CACd,IAAI,OAAO,EAAE,CAAC;CACd,IAAI,KAAK,EAAE,CAAC;CACZ,IAAI,MAAM,EAAE,CAAC;CACb,IAAI,CAAC;;CAEL,GAAG;;CAEH,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;CAC3B,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;CAClC,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;CACpC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;CACxB,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;CACxB,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;CAC1B,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;;CAE5B,EAAE,IAAI,CAAC,sBAAsB,EAAE,CAAC;;CAEhC,EAAE;;CAEF,CAAC,eAAe,EAAE,YAAY;;CAE9B,EAAE,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,GAAG;;CAE5B,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;;CAE7B,GAAG;;CAEH,EAAE,IAAI,CAAC,sBAAsB,EAAE,CAAC;;CAEhC,EAAE;;CAEF,CAAC,sBAAsB,EAAE,YAAY;;CAErC,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI;CACtB,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG;CACxB,IAAI,KAAK,CAAC,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI;CAChD,GAAG,MAAM,GAAG,CAAC,GAAG,GAAG;CACnB,GAAG,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,MAAM;CAC/B,GAAG,IAAI,GAAG,EAAE,GAAG,GAAG,KAAK;CACvB,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;;CAEpB,EAAE,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG;;CAEjD,GAAG,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS;CACjC,IAAI,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;;CAEjC,GAAG,IAAI,IAAI,IAAI,CAAC,OAAO,GAAG,KAAK,GAAG,SAAS,CAAC;CAC5C,GAAG,GAAG,IAAI,IAAI,CAAC,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;CAC7C,GAAG,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;CACnC,GAAG,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;;CAEtC,GAAG;;CAEH,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC;CAC7B,EAAE,KAAK,IAAI,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;;CAE9D,EAAE,IAAI,CAAC,gBAAgB,CAAC,eAAe,EAAE,IAAI,EAAE,IAAI,GAAG,KAAK,EAAE,GAAG,EAAE,GAAG,GAAG,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;;CAEjG,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,IAAI,GAAG;;CAE3B,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE1D,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;CAC7B,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;;CAE/B,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;CAC/B,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;CAC7B,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;;CAEjC,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;CAEnC,EAAE,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;;CAE9E,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;CACzC,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;;CAE3C,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,WAAW,EAAE,KAAK,GAAG;;CAE9B,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEhC,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,IAAI,EAAE,CAAC;;CAE5B,CAAC;;CAED,WAAW,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,SAAS,EAAE,EAAE;;CAErF,CAAC,WAAW,EAAE,WAAW;;CAEzB,CAAC,aAAa,EAAE,IAAI;;CAEpB,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,YAAY,EAAE,QAAQ,GAAG;;CAElC,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC;;CAElB,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC;CACnB,CAAC,IAAI,SAAS,GAAG,IAAI,CAAC;;CAEtB,CAAC,IAAI,UAAU,GAAG,IAAI,CAAC;;CAEvB,CAAC,IAAI,cAAc,GAAG,IAAI,OAAO,EAAE,CAAC;CACpC,CAAC,IAAI,qBAAqB,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE3C,CAAC,KAAK,OAAO,MAAM,KAAK,WAAW,IAAI,aAAa,IAAI,MAAM,GAAG;;CAEjE,EAAE,SAAS,GAAG,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;CACvC,EAAE,MAAM,CAAC,gBAAgB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,KAAK,EAAE,CAAC;;CAEvF,EAAE;;CAEF,CAAC,IAAI,kBAAkB,GAAG,IAAI,OAAO,EAAE,CAAC;CACxC,CAAC,IAAI,cAAc,GAAG,IAAI,UAAU,EAAE,CAAC;CACvC,CAAC,IAAI,YAAY,GAAG,IAAI,OAAO,EAAE,CAAC;;CAElC,CAAC,IAAI,OAAO,GAAG,IAAI,iBAAiB,EAAE,CAAC;CACvC,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACpD,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;;CAE5B,CAAC,IAAI,OAAO,GAAG,IAAI,iBAAiB,EAAE,CAAC;CACvC,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACpD,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;;CAE5B,CAAC,IAAI,QAAQ,GAAG,IAAI,WAAW,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;CACxD,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;CAC7B,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;;CAE7B;;CAEA,CAAC,SAAS,YAAY,GAAG;;CAEzB,EAAE,OAAO,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,YAAY,KAAK,IAAI,CAAC;;CAEzD,EAAE;;CAEF,CAAC,IAAI,WAAW,EAAE,iBAAiB,CAAC;;CAEpC,CAAC,SAAS,wBAAwB,GAAG;;CAErC,EAAE,KAAK,YAAY,EAAE,GAAG;;CAExB,GAAG,IAAI,aAAa,GAAG,MAAM,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAC;CACzD,GAAG,IAAI,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC;CAC/C,GAAG,IAAI,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC;;CAEjD,GAAG,iBAAiB,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;CAChD,GAAG,WAAW,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;;CAEpC,GAAG,QAAQ,CAAC,oBAAoB,EAAE,WAAW,GAAG,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;;CAErE,GAAG,MAAM,KAAK,KAAK,CAAC,OAAO,GAAG;;CAE9B,GAAG,QAAQ,CAAC,oBAAoB,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC;;CAE7F,GAAG;;CAEH,EAAE;;CAEF;;CAEA,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;CACtB,CAAC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;;CAEvB,CAAC,IAAI,CAAC,SAAS,GAAG,YAAY;;CAE9B,EAAE,OAAO,MAAM,CAAC;;CAEhB,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,SAAS,GAAG,WAAW,KAAK,GAAG;;CAErC,EAAE,KAAK,KAAK,KAAK,SAAS,GAAG,MAAM,GAAG,KAAK,CAAC;;CAE5C,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,aAAa,GAAG,WAAW,MAAM,GAAG;;CAE1C,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC;;CAElD,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,SAAS,GAAG,WAAW,MAAM,GAAG;;CAEtC,EAAE,KAAK,MAAM,KAAK,IAAI,GAAG,OAAO,MAAM,CAAC;;CAEvC,EAAE,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC;CACjC,EAAE,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC;;CAE/B,EAAE,MAAM,CAAC,YAAY,EAAE,SAAS,EAAE,CAAC;;CAEnC;;CAEA,EAAE,IAAI,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;;CAE/C,EAAE,KAAK,eAAe,GAAG;;CAEzB,GAAG,cAAc,CAAC,SAAS,EAAE,eAAe,CAAC,0BAA0B,EAAE,CAAC;;CAE1E,GAAG,MAAM;;CAET,GAAG,cAAc,CAAC,eAAe,EAAE,CAAC,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;;CAE5D,GAAG;;;CAGH,EAAE,IAAI,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;CAC5B,EAAE,IAAI,UAAU,GAAG,UAAU,KAAK,IAAI,GAAG,UAAU,GAAG,MAAM,CAAC;;CAE7D;CACA,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC;CAC3C,EAAE,UAAU,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC;;CAE9F,EAAE,KAAK,IAAI,CAAC,WAAW,KAAK,IAAI,GAAG;;CAEnC,GAAG,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;CAChD,GAAG,UAAU,CAAC,UAAU,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC;;CAEpD,GAAG;;CAEH,EAAE,KAAK,IAAI,CAAC,QAAQ,KAAK,IAAI,GAAG;;CAEhC,GAAG,cAAc,CAAC,qBAAqB,EAAE,cAAc,EAAE,CAAC;CAC1D,GAAG,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;CAC3C,GAAG,YAAY,CAAC,eAAe,EAAE,cAAc,EAAE,CAAC;CAClD,GAAG,UAAU,CAAC,QAAQ,CAAC,GAAG,EAAE,YAAY,EAAE,CAAC;;CAE3C,GAAG;;CAEH,EAAE,UAAU,CAAC,iBAAiB,EAAE,CAAC;;CAEjC,EAAE,KAAK,MAAM,CAAC,YAAY,KAAK,KAAK,GAAG,OAAO,MAAM,CAAC;;CAErD;;CAEA,EAAE,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;CAC7B,EAAE,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;;CAE7B,EAAE,OAAO,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;CAC3B,EAAE,OAAO,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;;CAE3B,EAAE,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;CAClD,EAAE,QAAQ,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,kBAAkB,EAAE,CAAC;;CAEhE,EAAE,OAAO,CAAC,kBAAkB,CAAC,SAAS,EAAE,SAAS,CAAC,cAAc,EAAE,CAAC;CACnE,EAAE,OAAO,CAAC,kBAAkB,CAAC,SAAS,EAAE,SAAS,CAAC,eAAe,EAAE,CAAC;;CAEpE;;CAEA,EAAE,qBAAqB,CAAC,UAAU,EAAE,cAAc,EAAE,CAAC;;CAErD,EAAE,OAAO,CAAC,kBAAkB,CAAC,QAAQ,EAAE,qBAAqB,EAAE,CAAC;CAC/D,EAAE,OAAO,CAAC,kBAAkB,CAAC,QAAQ,EAAE,qBAAqB,EAAE,CAAC;;CAE/D,EAAE,IAAI,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;;CAEjC,EAAE,KAAK,MAAM,KAAK,IAAI,GAAG;;CAEzB,GAAG,kBAAkB,CAAC,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;;CAEvD,GAAG,OAAO,CAAC,kBAAkB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,CAAC;CAC7D,GAAG,OAAO,CAAC,kBAAkB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,CAAC;;CAE7D,GAAG;;CAEH;;CAEA,EAAE,OAAO,CAAC,WAAW,CAAC,UAAU,EAAE,OAAO,CAAC,kBAAkB,EAAE,CAAC;CAC/D,EAAE,OAAO,CAAC,WAAW,CAAC,UAAU,EAAE,OAAO,CAAC,kBAAkB,EAAE,CAAC;;CAE/D,EAAE,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,oBAAoB,EAAE,CAAC;CACvE,EAAE,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,qBAAqB,EAAE,CAAC;;CAExE;CACA;;CAEA,EAAE,QAAQ,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC;;CAE7D;;CAEA,EAAE,IAAI,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;;CAElC,EAAE,KAAK,MAAM,CAAC,MAAM,GAAG;;CAEvB,GAAG,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC;;CAE3B,GAAG,KAAK,KAAK,CAAC,UAAU,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,GAAG;;CAErE,IAAI,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC;;CAEjD,IAAI;;CAEJ,GAAG,KAAK,KAAK,CAAC,WAAW,KAAK,IAAI,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,GAAG;;CAEvE,IAAI,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;;CAElD,IAAI;;CAEJ,GAAG;;CAEH,EAAE,OAAO,QAAQ,CAAC;;CAElB,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,iBAAiB,GAAG,YAAY;;CAEtC,EAAE,OAAO,cAAc,CAAC;;CAExB,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,WAAW,GAAG,YAAY;;CAEhC,EAAE,KAAK,YAAY,EAAE,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;;CAE7C,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,OAAO,GAAG,YAAY;;CAE5B,EAAE,KAAK,OAAO,MAAM,KAAK,WAAW,GAAG;;CAEvC,GAAG,MAAM,CAAC,mBAAmB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,CAAC;;CAEpF,GAAG;;CAEH,EAAE,CAAC;;CAEH,CAAC;;CAED;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,aAAa,EAAE,UAAU,GAAG;;CAErC,CAAC,OAAO,CAAC,GAAG,EAAE,qBAAqB,EAAE,QAAQ,EAAE,CAAC;;CAEhD,CAAC,UAAU,GAAG,UAAU,IAAI,EAAE,CAAC;;CAE/B,CAAC,IAAI,OAAO,GAAG,UAAU,CAAC,MAAM,KAAK,SAAS,GAAG,UAAU,CAAC,MAAM,GAAG,QAAQ,CAAC,eAAe,EAAE,8BAA8B,EAAE,QAAQ,EAAE;CACzI,EAAE,QAAQ,GAAG,UAAU,CAAC,OAAO,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,GAAG,IAAI;;CAEzE,EAAE,MAAM,GAAG,UAAU,CAAC,KAAK,KAAK,SAAS,GAAG,UAAU,CAAC,KAAK,GAAG,KAAK;CACpE,EAAE,MAAM,GAAG,UAAU,CAAC,KAAK,KAAK,SAAS,GAAG,UAAU,CAAC,KAAK,GAAG,IAAI;CACnE,EAAE,QAAQ,GAAG,UAAU,CAAC,OAAO,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,GAAG,IAAI;CACzE,EAAE,UAAU,GAAG,UAAU,CAAC,SAAS,KAAK,SAAS,GAAG,UAAU,CAAC,SAAS,GAAG,KAAK;CAChF,EAAE,mBAAmB,GAAG,UAAU,CAAC,kBAAkB,KAAK,SAAS,GAAG,UAAU,CAAC,kBAAkB,GAAG,IAAI;CAC1G,EAAE,sBAAsB,GAAG,UAAU,CAAC,qBAAqB,KAAK,SAAS,GAAG,UAAU,CAAC,qBAAqB,GAAG,KAAK;CACpH,EAAE,gBAAgB,GAAG,UAAU,CAAC,eAAe,KAAK,SAAS,GAAG,UAAU,CAAC,eAAe,GAAG,SAAS,CAAC;;CAEvG,CAAC,IAAI,iBAAiB,GAAG,IAAI,CAAC;CAC9B,CAAC,IAAI,kBAAkB,GAAG,IAAI,CAAC;;CAE/B;;CAEA,CAAC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;CAC3B,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;;CAErB;;CAEA,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;CACvB,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;CAC5B,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;CAC5B,CAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;;CAE9B;;CAEA,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEzB;;CAEA,CAAC,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;CAC1B,CAAC,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;;CAEnC;;CAEA,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;CACxB,CAAC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;CACzB,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;;CAE1B;;CAEA,CAAC,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC;;CAEtC;;CAEA,CAAC,IAAI,CAAC,WAAW,GAAG,iBAAiB,CAAC;CACtC,CAAC,IAAI,CAAC,mBAAmB,GAAG,GAAG,CAAC;CAChC,CAAC,IAAI,CAAC,qBAAqB,GAAG,GAAG,CAAC;;CAElC;;CAEA,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;CAC1B,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;;CAE1B;;CAEA,CAAC,IAAI,KAAK,GAAG,IAAI;;CAEjB,EAAE,cAAc,GAAG,KAAK;;CAExB;;CAEA,EAAE,oBAAoB,GAAG,IAAI;CAC7B,EAAE,mBAAmB,GAAG,IAAI;CAC5B,EAAE,kBAAkB,GAAG,EAAE,CAAC;CAC1B,EAAE,uBAAuB,GAAG,EAAE;;CAE9B,EAAE,cAAc,GAAG,IAAI;CACvB,EAAE,mBAAmB,GAAG,IAAI;;CAE5B,EAAE,gBAAgB,GAAG,IAAI,OAAO,EAAE;CAClC,EAAE,eAAe,GAAG,IAAI,OAAO,EAAE;CACjC,EAAE,mBAAmB,GAAG,IAAI;;CAE5B;;CAEA,EAAE,iBAAiB,GAAG,CAAC;;CAEvB;;CAEA,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK;CACxB,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM;;CAE1B,EAAE,WAAW,GAAG,CAAC;;CAEjB,EAAE,SAAS,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE;CAClD,EAAE,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE;CACjD,EAAE,YAAY,GAAG,KAAK;;CAEtB;;CAEA,EAAE,QAAQ,GAAG,IAAI,OAAO,EAAE;;CAE1B;;CAEA,EAAE,SAAS,GAAG,IAAI,aAAa,EAAE;CACjC,EAAE,gBAAgB,GAAG,KAAK;CAC1B,EAAE,qBAAqB,GAAG,KAAK;;CAE/B;;CAEA,EAAE,iBAAiB,GAAG,IAAI,OAAO,EAAE;;CAEnC,EAAE,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE3B,CAAC,SAAS,mBAAmB,GAAG;;CAEhC,EAAE,OAAO,oBAAoB,KAAK,IAAI,GAAG,WAAW,GAAG,CAAC,CAAC;;CAEzD,EAAE;;CAEF;;CAEA,CAAC,IAAI,GAAG,CAAC;;CAET,CAAC,IAAI;;CAEL,EAAE,IAAI,iBAAiB,GAAG;CAC1B,GAAG,KAAK,EAAE,MAAM;CAChB,GAAG,KAAK,EAAE,MAAM;CAChB,GAAG,OAAO,EAAE,QAAQ;CACpB,GAAG,SAAS,EAAE,UAAU;CACxB,GAAG,kBAAkB,EAAE,mBAAmB;CAC1C,GAAG,qBAAqB,EAAE,sBAAsB;CAChD,GAAG,eAAe,EAAE,gBAAgB;CACpC,GAAG,CAAC;;CAEJ;;CAEA,EAAE,OAAO,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;CACvE,EAAE,OAAO,CAAC,gBAAgB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;;CAE9E,EAAE,GAAG,GAAG,QAAQ,IAAI,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,OAAO,CAAC,UAAU,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,CAAC;;CAEtI,EAAE,KAAK,GAAG,KAAK,IAAI,GAAG;;CAEtB,GAAG,KAAK,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG;;CAEjD,IAAI,MAAM,IAAI,KAAK,EAAE,6DAA6D,EAAE,CAAC;;CAErF,IAAI,MAAM;;CAEV,IAAI,MAAM,IAAI,KAAK,EAAE,+BAA+B,EAAE,CAAC;;CAEvD,IAAI;;CAEJ,GAAG;;CAEH;;CAEA,EAAE,KAAK,GAAG,CAAC,wBAAwB,KAAK,SAAS,GAAG;;CAEpD,GAAG,GAAG,CAAC,wBAAwB,GAAG,YAAY;;CAE9C,IAAI,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;;CAE5D,IAAI,CAAC;;CAEL,GAAG;;CAEH,EAAE,CAAC,QAAQ,KAAK,GAAG;;CAEnB,EAAE,OAAO,CAAC,KAAK,EAAE,uBAAuB,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;;CAE3D,EAAE;;CAEF,CAAC,IAAI,UAAU,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,CAAC;CAC3C,CAAC,IAAI,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC;CAC3D,CAAC,IAAI,YAAY,EAAE,WAAW,EAAE,YAAY,CAAC;;CAE7C,CAAC,IAAI,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,qBAAqB,CAAC;CACrE,CAAC,IAAI,cAAc,CAAC;;CAEpB,CAAC,IAAI,KAAK,CAAC;;CAEX,CAAC,SAAS,aAAa,GAAG;;CAE1B,EAAE,UAAU,GAAG,IAAI,eAAe,EAAE,GAAG,EAAE,CAAC;CAC1C,EAAE,UAAU,CAAC,GAAG,EAAE,qBAAqB,EAAE,CAAC;CAC1C,EAAE,UAAU,CAAC,GAAG,EAAE,mBAAmB,EAAE,CAAC;CACxC,EAAE,UAAU,CAAC,GAAG,EAAE,0BAA0B,EAAE,CAAC;CAC/C,EAAE,UAAU,CAAC,GAAG,EAAE,wBAAwB,EAAE,CAAC;CAC7C,EAAE,UAAU,CAAC,GAAG,EAAE,+BAA+B,EAAE,CAAC;CACpD,EAAE,UAAU,CAAC,GAAG,EAAE,0BAA0B,EAAE,CAAC;CAC/C,EAAE,UAAU,CAAC,GAAG,EAAE,wBAAwB,EAAE,CAAC;CAC7C,EAAE,UAAU,CAAC,GAAG,EAAE,wBAAwB,EAAE,CAAC;;CAE7C,EAAE,KAAK,GAAG,IAAI,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;;CAE5C,EAAE,YAAY,GAAG,IAAI,iBAAiB,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;;CAEtE,EAAE,KAAK,GAAG,IAAI,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;CACnD,EAAE,KAAK,CAAC,OAAO,EAAE,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,cAAc,EAAE,WAAW,EAAE,EAAE,CAAC;CAClF,EAAE,KAAK,CAAC,QAAQ,EAAE,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,cAAc,EAAE,WAAW,EAAE,EAAE,CAAC;;CAErF,EAAE,IAAI,GAAG,IAAI,SAAS,EAAE,GAAG,EAAE,CAAC;CAC9B,EAAE,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;CACrC,EAAE,QAAQ,GAAG,IAAI,aAAa,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;CAChG,EAAE,UAAU,GAAG,IAAI,eAAe,EAAE,GAAG,EAAE,CAAC;CAC1C,EAAE,UAAU,GAAG,IAAI,eAAe,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;CAC5D,EAAE,OAAO,GAAG,IAAI,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;CACjD,EAAE,YAAY,GAAG,IAAI,iBAAiB,EAAE,GAAG,EAAE,CAAC;CAC9C,EAAE,YAAY,GAAG,IAAI,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;CACtE,EAAE,WAAW,GAAG,IAAI,gBAAgB,EAAE,CAAC;CACvC,EAAE,YAAY,GAAG,IAAI,iBAAiB,EAAE,CAAC;;CAEzC,EAAE,UAAU,GAAG,IAAI,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,CAAC;;CAEpF,EAAE,cAAc,GAAG,IAAI,mBAAmB,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;CACpE,EAAE,qBAAqB,GAAG,IAAI,0BAA0B,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;;CAElF,EAAE,cAAc,GAAG,IAAI,mBAAmB,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;;CAExF,EAAE,IAAI,CAAC,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC;;CAExC,EAAE,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;CACtB,EAAE,KAAK,CAAC,YAAY,GAAG,YAAY,CAAC;CACpC,EAAE,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;CAChC,EAAE,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;CAChC,EAAE,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;CAClC,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;CACtB,EAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;;CAEpB,EAAE;;CAEF,CAAC,aAAa,EAAE,CAAC;;CAEjB;;CAEA,CAAC,IAAI,EAAE,GAAG,IAAI,YAAY,EAAE,KAAK,EAAE,CAAC;;CAEpC,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;;CAEd;;CAEA,CAAC,IAAI,SAAS,GAAG,IAAI,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC,cAAc,EAAE,CAAC;;CAEnF,CAAC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;;CAE5B;;CAEA,CAAC,IAAI,CAAC,UAAU,GAAG,YAAY;;CAE/B,EAAE,OAAO,GAAG,CAAC;;CAEb,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,oBAAoB,GAAG,YAAY;;CAEzC,EAAE,OAAO,GAAG,CAAC,oBAAoB,EAAE,CAAC;;CAEpC,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,gBAAgB,GAAG,YAAY;;CAErC,EAAE,IAAI,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,oBAAoB,EAAE,CAAC;CACzD,EAAE,KAAK,SAAS,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;;CAE3C,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,mBAAmB,GAAG,YAAY;;CAExC,EAAE,IAAI,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,oBAAoB,EAAE,CAAC;CACzD,EAAE,KAAK,SAAS,GAAG,SAAS,CAAC,cAAc,EAAE,CAAC;;CAE9C,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,aAAa,GAAG,YAAY;;CAElC,EAAE,OAAO,WAAW,CAAC;;CAErB,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,aAAa,GAAG,WAAW,KAAK,GAAG;;CAEzC,EAAE,KAAK,KAAK,KAAK,SAAS,GAAG,OAAO;;CAEpC,EAAE,WAAW,GAAG,KAAK,CAAC;;CAEtB,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;;CAEzC,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,OAAO,GAAG,YAAY;;CAE5B,EAAE,OAAO;CACT,GAAG,KAAK,EAAE,MAAM;CAChB,GAAG,MAAM,EAAE,OAAO;CAClB,GAAG,CAAC;;CAEJ,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,OAAO,GAAG,WAAW,KAAK,EAAE,MAAM,EAAE,WAAW,GAAG;;CAExD,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;;CAE9B,EAAE,KAAK,MAAM,IAAI,MAAM,CAAC,YAAY,GAAG;;CAEvC,GAAG,OAAO,CAAC,IAAI,EAAE,wEAAwE,EAAE,CAAC;CAC5F,GAAG,OAAO;;CAEV,GAAG;;CAEH,EAAE,MAAM,GAAG,KAAK,CAAC;CACjB,EAAE,OAAO,GAAG,MAAM,CAAC;;CAEnB,EAAE,OAAO,CAAC,KAAK,GAAG,KAAK,GAAG,WAAW,CAAC;CACtC,EAAE,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;;CAExC,EAAE,KAAK,WAAW,KAAK,KAAK,GAAG;;CAE/B,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC;CACtC,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;;CAExC,GAAG;;CAEH,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;;CAE1C,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,oBAAoB,GAAG,YAAY;;CAEzC,EAAE,OAAO;CACT,GAAG,KAAK,EAAE,MAAM,GAAG,WAAW;CAC9B,GAAG,MAAM,EAAE,OAAO,GAAG,WAAW;CAChC,GAAG,CAAC;;CAEJ,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,oBAAoB,GAAG,WAAW,KAAK,EAAE,MAAM,EAAE,UAAU,GAAG;;CAEpE,EAAE,MAAM,GAAG,KAAK,CAAC;CACjB,EAAE,OAAO,GAAG,MAAM,CAAC;;CAEnB,EAAE,WAAW,GAAG,UAAU,CAAC;;CAE3B,EAAE,OAAO,CAAC,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;CACrC,EAAE,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;;CAEvC,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;;CAE1C,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,kBAAkB,GAAG,YAAY;;CAEvC,EAAE,OAAO,gBAAgB,CAAC;;CAE1B,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG;;CAErD,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,OAAO,GAAG,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;CAC1D,EAAE,KAAK,CAAC,QAAQ,EAAE,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,cAAc,EAAE,WAAW,EAAE,EAAE,CAAC;;CAErF,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG;;CAEpD,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,OAAO,GAAG,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;CACzD,EAAE,KAAK,CAAC,OAAO,EAAE,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,cAAc,EAAE,WAAW,EAAE,EAAE,CAAC;;CAElF,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,cAAc,GAAG,WAAW,OAAO,GAAG;;CAE5C,EAAE,KAAK,CAAC,cAAc,EAAE,YAAY,GAAG,OAAO,EAAE,CAAC;;CAEjD,EAAE,CAAC;;CAEH;;CAEA,CAAC,IAAI,CAAC,aAAa,GAAG,YAAY;;CAElC,EAAE,OAAO,UAAU,CAAC,aAAa,EAAE,CAAC;;CAEpC,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,aAAa,GAAG,YAAY;;CAElC,EAAE,UAAU,CAAC,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;;CAE1D,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,aAAa,GAAG,YAAY;;CAElC,EAAE,OAAO,UAAU,CAAC,aAAa,EAAE,CAAC;;CAEpC,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,aAAa,GAAG,YAAY;;CAElC,EAAE,UAAU,CAAC,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;;CAE1D,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,KAAK,GAAG,WAAW,KAAK,EAAE,KAAK,EAAE,OAAO,GAAG;;CAEjD,EAAE,IAAI,IAAI,GAAG,CAAC,CAAC;;CAEf,EAAE,KAAK,KAAK,KAAK,SAAS,IAAI,KAAK,GAAG,IAAI,IAAI,GAAG,CAAC,gBAAgB,CAAC;CACnE,EAAE,KAAK,KAAK,KAAK,SAAS,IAAI,KAAK,GAAG,IAAI,IAAI,GAAG,CAAC,gBAAgB,CAAC;CACnE,EAAE,KAAK,OAAO,KAAK,SAAS,IAAI,OAAO,GAAG,IAAI,IAAI,GAAG,CAAC,kBAAkB,CAAC;;CAEzE,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;;CAEpB,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,UAAU,GAAG,YAAY;;CAE/B,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;;CAEnC,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,UAAU,GAAG,YAAY;;CAE/B,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;CAEnC,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,YAAY,GAAG,YAAY;;CAEjC,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;;CAEnC,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,WAAW,GAAG,WAAW,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,GAAG;;CAErE,EAAE,IAAI,CAAC,eAAe,EAAE,YAAY,EAAE,CAAC;CACvC,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;;CAEtC,EAAE,CAAC;;CAEH;;CAEA,CAAC,IAAI,CAAC,OAAO,GAAG,YAAY;;CAE5B,EAAE,OAAO,CAAC,mBAAmB,EAAE,kBAAkB,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;CAC1E,EAAE,OAAO,CAAC,mBAAmB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;;CAEjF,EAAE,WAAW,CAAC,OAAO,EAAE,CAAC;CACxB,EAAE,YAAY,CAAC,OAAO,EAAE,CAAC;CACzB,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC;CACvB,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;;CAEpB,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC;;CAEf,EAAE,aAAa,EAAE,CAAC;;CAElB,EAAE,CAAC;;CAEH;;CAEA,CAAC,SAAS,aAAa,EAAE,KAAK,GAAG;;CAEjC,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC;;CAEzB,EAAE,OAAO,CAAC,GAAG,EAAE,oCAAoC,EAAE,CAAC;;CAEtD,EAAE,cAAc,GAAG,IAAI,CAAC;;CAExB,EAAE;;CAEF,CAAC,SAAS,gBAAgB,gBAAgB;;CAE1C,EAAE,OAAO,CAAC,GAAG,EAAE,wCAAwC,EAAE,CAAC;;CAE1D,EAAE,cAAc,GAAG,KAAK,CAAC;;CAEzB,EAAE,aAAa,EAAE,CAAC;;CAElB,EAAE;;CAEF,CAAC,SAAS,iBAAiB,EAAE,KAAK,GAAG;;CAErC,EAAE,IAAI,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC;;CAE9B,EAAE,QAAQ,CAAC,mBAAmB,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;;CAE/D,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC;;CAEjC,EAAE;;CAEF;;CAEA,CAAC,SAAS,kBAAkB,EAAE,QAAQ,GAAG;;CAEzC,EAAE,+BAA+B,EAAE,QAAQ,EAAE,CAAC;;CAE9C,EAAE,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;;CAEhC,EAAE;;;CAGF,CAAC,SAAS,+BAA+B,EAAE,QAAQ,GAAG;;CAEtD,EAAE,IAAI,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC;;CAEvD,EAAE,QAAQ,CAAC,OAAO,GAAG,SAAS,CAAC;;CAE/B,EAAE,KAAK,WAAW,KAAK,SAAS,GAAG;;CAEnC,GAAG,YAAY,CAAC,cAAc,EAAE,WAAW,EAAE,CAAC;;CAE9C,GAAG;;CAEH,EAAE;;CAEF;;CAEA,CAAC,SAAS,qBAAqB,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG;;CAE7D,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,MAAM,GAAG;;CAErC,GAAG,KAAK,CAAC,qBAAqB,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;;CAE5D,GAAG,EAAE,CAAC;;CAEN,EAAE;;CAEF,CAAC,IAAI,CAAC,qBAAqB,GAAG,WAAW,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG;;CAErE,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC;;CAEzB,EAAE,IAAI,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC;;CAEzC,EAAE,KAAK,MAAM,CAAC,YAAY,IAAI,EAAE,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;CACzF,EAAE,KAAK,MAAM,CAAC,UAAU,IAAI,EAAE,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;CACnF,EAAE,KAAK,MAAM,CAAC,MAAM,IAAI,EAAE,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;CACvE,EAAE,KAAK,MAAM,CAAC,SAAS,IAAI,EAAE,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;;CAEhF,EAAE,IAAI,iBAAiB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;;CAElD,EAAE,KAAK,MAAM,CAAC,YAAY,GAAG;;CAE7B,GAAG,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;CACxD,GAAG,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,aAAa,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC;;CAE9E,GAAG,KAAK,CAAC,eAAe,EAAE,iBAAiB,CAAC,QAAQ,EAAE,CAAC;CACvD,GAAG,GAAG,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEpF,GAAG;;CAEH,EAAE,KAAK,MAAM,CAAC,UAAU,GAAG;;CAE3B,GAAG,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;;CAEtD,GAAG,KAAK,EAAE,QAAQ,CAAC,mBAAmB;CACtC,IAAI,EAAE,QAAQ,CAAC,sBAAsB;CACrC,IAAI,EAAE,QAAQ,CAAC,oBAAoB;CACnC,IAAI,QAAQ,CAAC,WAAW,KAAK,IAAI,GAAG;;CAEpC,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;;CAE3D,KAAK,IAAI,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;;CAEpC,KAAK,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;CACvE,KAAK,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;CACvE,KAAK,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;;CAEvE,KAAK,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;CACzB,KAAK,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;CACzB,KAAK,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;;CAEzB,KAAK,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;CACzB,KAAK,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;CACzB,KAAK,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;;CAEzB,KAAK,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;CACzB,KAAK,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;CACzB,KAAK,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;;CAEzB,KAAK;;CAEL,IAAI;;CAEJ,GAAG,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC;;CAE5E,GAAG,KAAK,CAAC,eAAe,EAAE,iBAAiB,CAAC,MAAM,EAAE,CAAC;;CAErD,GAAG,GAAG,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAElF,GAAG;;CAEH,EAAE,KAAK,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC,GAAG,GAAG;;CAEvC,GAAG,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;CAClD,GAAG,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC;;CAExE,GAAG,KAAK,CAAC,eAAe,EAAE,iBAAiB,CAAC,EAAE,EAAE,CAAC;;CAEjD,GAAG,GAAG,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE9E,GAAG;;CAEH,EAAE,KAAK,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC,YAAY,KAAK,QAAQ,GAAG;;CAEhE,GAAG,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;CACrD,GAAG,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC;;CAE3E,GAAG,KAAK,CAAC,eAAe,EAAE,iBAAiB,CAAC,KAAK,EAAE,CAAC;;CAEpD,GAAG,GAAG,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEjF,GAAG;;CAEH,EAAE,KAAK,CAAC,uBAAuB,EAAE,CAAC;;CAElC,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;;CAEnD,EAAE,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;;CAEnB,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,kBAAkB,GAAG,WAAW,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,GAAG;;CAEvF,EAAE,IAAI,WAAW,KAAK,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,CAAC;;CAE9E,EAAE,KAAK,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;;CAE7C,EAAE,IAAI,OAAO,GAAG,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;CAC5D,EAAE,IAAI,eAAe,GAAG,QAAQ,CAAC,EAAE,GAAG,GAAG,GAAG,OAAO,CAAC,EAAE,GAAG,GAAG,KAAK,QAAQ,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;;CAE/F,EAAE,IAAI,aAAa,GAAG,KAAK,CAAC;;CAE5B,EAAE,KAAK,eAAe,KAAK,uBAAuB,GAAG;;CAErD,GAAG,uBAAuB,GAAG,eAAe,CAAC;CAC7C,GAAG,aAAa,GAAG,IAAI,CAAC;;CAExB,GAAG;;CAEH,EAAE,KAAK,MAAM,CAAC,qBAAqB,GAAG;;CAEtC,GAAG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;;CAE9D,GAAG,aAAa,GAAG,IAAI,CAAC;;CAExB,GAAG;;CAEH;;CAEA,EAAE,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;CAC7B,EAAE,IAAI,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;CAC9C,EAAE,IAAI,WAAW,GAAG,CAAC,CAAC;;CAEtB,EAAE,KAAK,QAAQ,CAAC,SAAS,KAAK,IAAI,GAAG;;CAErC,GAAG,KAAK,GAAG,UAAU,CAAC,qBAAqB,EAAE,QAAQ,EAAE,CAAC;CACxD,GAAG,WAAW,GAAG,CAAC,CAAC;;CAEnB,GAAG;;CAEH,EAAE,IAAI,SAAS,CAAC;CAChB,EAAE,IAAI,QAAQ,GAAG,cAAc,CAAC;;CAEhC,EAAE,KAAK,KAAK,KAAK,IAAI,GAAG;;CAExB,GAAG,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;;CAEvC,GAAG,QAAQ,GAAG,qBAAqB,CAAC;CACpC,GAAG,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC;;CAElC,GAAG;;CAEH,EAAE,KAAK,aAAa,GAAG;;CAEvB,GAAG,qBAAqB,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;;CAExD,GAAG,KAAK,KAAK,KAAK,IAAI,GAAG;;CAEzB,IAAI,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,oBAAoB,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC;;CAEjE,IAAI;;CAEJ,GAAG;;CAEH;;CAEA,EAAE,IAAI,SAAS,GAAG,QAAQ,CAAC;;CAE3B,EAAE,KAAK,KAAK,KAAK,IAAI,GAAG;;CAExB,GAAG,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;;CAE3B,GAAG,MAAM,KAAK,QAAQ,KAAK,SAAS,GAAG;;CAEvC,GAAG,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC;;CAE9B,GAAG;;CAEH,EAAE,IAAI,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC,KAAK,GAAG,WAAW,CAAC;CAC1D,EAAE,IAAI,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC,KAAK,GAAG,WAAW,CAAC;;CAE1D,EAAE,IAAI,UAAU,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,CAAC,KAAK,GAAG,WAAW,GAAG,CAAC,CAAC;CAClE,EAAE,IAAI,UAAU,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,CAAC,KAAK,GAAG,WAAW,GAAG,QAAQ,CAAC;;CAEzE,EAAE,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;CACrD,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,GAAG,UAAU,EAAE,UAAU,GAAG,UAAU,EAAE,GAAG,CAAC,CAAC;;CAE5F,EAAE,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,CAAC,EAAE,CAAC;;CAEzD,EAAE,KAAK,SAAS,KAAK,CAAC,GAAG,OAAO;;CAEhC;;CAEA,EAAE,KAAK,MAAM,CAAC,MAAM,GAAG;;CAEvB,GAAG,KAAK,QAAQ,CAAC,SAAS,KAAK,IAAI,GAAG;;CAEtC,IAAI,KAAK,CAAC,YAAY,EAAE,QAAQ,CAAC,kBAAkB,GAAG,mBAAmB,EAAE,EAAE,CAAC;CAC9E,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;;CAElC,IAAI,MAAM;;CAEV,IAAI,SAAS,MAAM,CAAC,QAAQ;;CAE5B,KAAK,KAAK,iBAAiB;CAC3B,MAAM,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;CACxC,MAAM,MAAM;;CAEZ,KAAK,KAAK,qBAAqB;CAC/B,MAAM,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,cAAc,EAAE,CAAC;CAC7C,MAAM,MAAM;;CAEZ,KAAK,KAAK,mBAAmB;CAC7B,MAAM,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC;CAC3C,MAAM,MAAM;;CAEZ,KAAK;;CAEL,IAAI;;;CAGJ,GAAG,MAAM,KAAK,MAAM,CAAC,MAAM,GAAG;;CAE9B,GAAG,IAAI,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;;CAEtC,GAAG,KAAK,SAAS,KAAK,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC;;CAEhD,GAAG,KAAK,CAAC,YAAY,EAAE,SAAS,GAAG,mBAAmB,EAAE,EAAE,CAAC;;CAE3D,GAAG,KAAK,MAAM,CAAC,cAAc,GAAG;;CAEhC,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;;CAElC,IAAI,MAAM,KAAK,MAAM,CAAC,UAAU,GAAG;;CAEnC,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;;CAEtC,IAAI,MAAM;;CAEV,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC;;CAEvC,IAAI;;CAEJ,GAAG,MAAM,KAAK,MAAM,CAAC,QAAQ,GAAG;;CAEhC,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;;CAElC,GAAG;;CAEH,EAAE,KAAK,QAAQ,IAAI,QAAQ,CAAC,yBAAyB,GAAG;;CAExD,GAAG,KAAK,QAAQ,CAAC,iBAAiB,GAAG,CAAC,GAAG;;CAEzC,IAAI,QAAQ,CAAC,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;;CAE/D,IAAI;;CAEJ,GAAG,MAAM;;CAET,GAAG,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;;CAE3C,GAAG;;CAEH,EAAE,CAAC;;CAEH,CAAC,SAAS,qBAAqB,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,GAAG;;CAE/D,EAAE,KAAK,QAAQ,IAAI,QAAQ,CAAC,yBAAyB,GAAG;;CAExD,GAAG,KAAK,UAAU,CAAC,GAAG,EAAE,wBAAwB,EAAE,KAAK,IAAI,GAAG;;CAE9D,IAAI,OAAO,CAAC,KAAK,EAAE,gJAAgJ,EAAE,CAAC;CACtK,IAAI,OAAO;;CAEX,IAAI;;CAEJ,GAAG;;CAEH,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC;;CAEzB,EAAE,IAAI,kBAAkB,GAAG,QAAQ,CAAC,UAAU,CAAC;;CAE/C,EAAE,IAAI,iBAAiB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;;CAElD,EAAE,IAAI,8BAA8B,GAAG,QAAQ,CAAC,sBAAsB,CAAC;;CAEvE,EAAE,MAAM,IAAI,IAAI,IAAI,iBAAiB,GAAG;;CAExC,GAAG,IAAI,gBAAgB,GAAG,iBAAiB,EAAE,IAAI,EAAE,CAAC;;CAEpD,GAAG,KAAK,gBAAgB,IAAI,CAAC,GAAG;;CAEhC,IAAI,IAAI,iBAAiB,GAAG,kBAAkB,EAAE,IAAI,EAAE,CAAC;;CAEvD,IAAI,KAAK,iBAAiB,KAAK,SAAS,GAAG;;CAE3C,KAAK,IAAI,UAAU,GAAG,iBAAiB,CAAC,UAAU,CAAC;CACnD,KAAK,IAAI,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC;;CAE3C,KAAK,IAAI,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,iBAAiB,EAAE,CAAC;;CAEzD;;CAEA,KAAK,KAAK,SAAS,KAAK,SAAS,GAAG,SAAS;;CAE7C,KAAK,IAAI,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;CACnC,KAAK,IAAI,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;CAC/B,KAAK,IAAI,eAAe,GAAG,SAAS,CAAC,eAAe,CAAC;;CAErD,KAAK,KAAK,iBAAiB,CAAC,4BAA4B,GAAG;;CAE3D,MAAM,IAAI,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC;CACxC,MAAM,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;CAC/B,MAAM,IAAI,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC;;CAE5C,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,4BAA4B,GAAG;;CAEvD,OAAO,KAAK,CAAC,yBAAyB,EAAE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC;;CAElF,OAAO,KAAK,QAAQ,CAAC,iBAAiB,KAAK,SAAS,GAAG;;CAEvD,QAAQ,QAAQ,CAAC,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC;;CAExE,QAAQ;;CAER,OAAO,MAAM;;CAEb,OAAO,KAAK,CAAC,eAAe,EAAE,gBAAgB,EAAE,CAAC;;CAEjD,OAAO;;CAEP,MAAM,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;CACjD,MAAM,GAAG,CAAC,mBAAmB,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,GAAG,eAAe,EAAE,MAAM,GAAG,eAAe,EAAE,CAAC;;CAE9H,MAAM,MAAM;;CAEZ,MAAM,KAAK,iBAAiB,CAAC,0BAA0B,GAAG;;CAE1D,OAAO,KAAK,CAAC,yBAAyB,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,gBAAgB,EAAE,CAAC;;CAE/F,OAAO,KAAK,QAAQ,CAAC,iBAAiB,KAAK,SAAS,GAAG;;CAEvD,QAAQ,QAAQ,CAAC,iBAAiB,GAAG,iBAAiB,CAAC,gBAAgB,GAAG,iBAAiB,CAAC,KAAK,CAAC;;CAElG,QAAQ;;CAER,OAAO,MAAM;;CAEb,OAAO,KAAK,CAAC,eAAe,EAAE,gBAAgB,EAAE,CAAC;;CAEjD,OAAO;;CAEP,MAAM,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;CACjD,MAAM,GAAG,CAAC,mBAAmB,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEhF,MAAM;;CAEN,KAAK,MAAM,KAAK,8BAA8B,KAAK,SAAS,GAAG;;CAE/D,KAAK,IAAI,KAAK,GAAG,8BAA8B,EAAE,IAAI,EAAE,CAAC;;CAExD,KAAK,KAAK,KAAK,KAAK,SAAS,GAAG;;CAEhC,MAAM,SAAS,KAAK,CAAC,MAAM;;CAE3B,OAAO,KAAK,CAAC;CACb,QAAQ,GAAG,CAAC,eAAe,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;CACvD,QAAQ,MAAM;;CAEd,OAAO,KAAK,CAAC;CACb,QAAQ,GAAG,CAAC,eAAe,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;CACvD,QAAQ,MAAM;;CAEd,OAAO,KAAK,CAAC;CACb,QAAQ,GAAG,CAAC,eAAe,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;CACvD,QAAQ,MAAM;;CAEd,OAAO;CACP,QAAQ,GAAG,CAAC,eAAe,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;;CAEvD,OAAO;;CAEP,MAAM;;CAEN,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH,EAAE,KAAK,CAAC,uBAAuB,EAAE,CAAC;;CAElC,EAAE;;CAEF;;CAEA,CAAC,IAAI,CAAC,OAAO,GAAG,WAAW,KAAK,EAAE,MAAM,GAAG;;CAE3C,EAAE,kBAAkB,GAAG,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;CACzD,EAAE,kBAAkB,CAAC,IAAI,EAAE,CAAC;;CAE5B,EAAE,KAAK,CAAC,QAAQ,EAAE,WAAW,MAAM,GAAG;;CAEtC,GAAG,KAAK,MAAM,CAAC,OAAO,GAAG;;CAEzB,IAAI,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;;CAE3C,IAAI,KAAK,MAAM,CAAC,UAAU,GAAG;;CAE7B,KAAK,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;;CAE7C,KAAK;;CAEL,IAAI;;CAEJ,GAAG,EAAE,CAAC;;CAEN,EAAE,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;;CAE3C,EAAE,KAAK,CAAC,QAAQ,EAAE,WAAW,MAAM,GAAG;;CAEtC,GAAG,KAAK,MAAM,CAAC,QAAQ,GAAG;;CAE1B,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,GAAG;;CAE5C,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAEzD,MAAM,YAAY,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC;;CAE9D,MAAM;;CAEN,KAAK,MAAM;;CAEX,KAAK,YAAY,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC;;CAExD,KAAK;;CAEL,IAAI;;CAEJ,GAAG,EAAE,CAAC;;CAEN,EAAE,CAAC;;CAEH;;CAEA,CAAC,IAAI,WAAW,GAAG,KAAK,CAAC;CACzB,CAAC,IAAI,gBAAgB,GAAG,IAAI,CAAC;;CAE7B,CAAC,SAAS,cAAc,GAAG;;CAE3B,EAAE,KAAK,WAAW,GAAG,OAAO;;CAE5B,EAAE,yBAAyB,EAAE,CAAC;;CAE9B,EAAE,WAAW,GAAG,IAAI,CAAC;;CAErB,EAAE;;CAEF,CAAC,SAAS,aAAa,GAAG;;CAE1B,EAAE,WAAW,GAAG,KAAK,CAAC;;CAEtB,EAAE;;CAEF,CAAC,SAAS,yBAAyB,GAAG;;CAEtC,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;;CAE9B,EAAE,KAAK,MAAM,IAAI,MAAM,CAAC,YAAY,GAAG;;CAEvC,GAAG,MAAM,CAAC,qBAAqB,EAAE,aAAa,EAAE,CAAC;;CAEjD,GAAG,MAAM;;CAET,GAAG,MAAM,CAAC,qBAAqB,EAAE,aAAa,EAAE,CAAC;;CAEjD,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,aAAa,EAAE,IAAI,GAAG;;CAEhC,EAAE,KAAK,WAAW,KAAK,KAAK,GAAG,OAAO;;CAEtC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;;CAE3B,EAAE,yBAAyB,EAAE,CAAC;;CAE9B,EAAE;;CAEF,CAAC,IAAI,CAAC,OAAO,GAAG,WAAW,QAAQ,GAAG;;CAEtC,EAAE,gBAAgB,GAAG,QAAQ,CAAC;CAC9B,EAAE,gBAAgB,KAAK,IAAI,GAAG,cAAc,EAAE,GAAG,aAAa,EAAE,CAAC;;CAEjE,EAAE,CAAC;;CAEH;;CAEA,CAAC,IAAI,CAAC,MAAM,GAAG,WAAW,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,GAAG;;CAEpE,EAAE,KAAK,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,GAAG;;CAEzC,GAAG,OAAO,CAAC,KAAK,EAAE,wEAAwE,EAAE,CAAC;CAC7F,GAAG,OAAO;;CAEV,GAAG;;CAEH,EAAE,KAAK,cAAc,GAAG,OAAO;;CAE/B;;CAEA,EAAE,uBAAuB,GAAG,EAAE,CAAC;CAC/B,EAAE,kBAAkB,GAAG,EAAE,CAAC,CAAC;CAC3B,EAAE,cAAc,GAAG,IAAI,CAAC;;CAExB;;CAEA,EAAE,KAAK,KAAK,CAAC,UAAU,KAAK,IAAI,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;;CAE7D;;CAEA,EAAE,KAAK,MAAM,CAAC,MAAM,KAAK,IAAI,GAAG,MAAM,CAAC,iBAAiB,EAAE,CAAC;;CAE3D,EAAE,KAAK,EAAE,CAAC,OAAO,GAAG;;CAEpB,GAAG,MAAM,GAAG,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;;CAEnC,GAAG;;CAEH;;CAEA,EAAE,kBAAkB,GAAG,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;CACzD,EAAE,kBAAkB,CAAC,IAAI,EAAE,CAAC;;CAE5B,EAAE,KAAK,CAAC,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;;CAE7D,EAAE,iBAAiB,CAAC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,kBAAkB,EAAE,CAAC;CAC3F,EAAE,QAAQ,CAAC,aAAa,EAAE,iBAAiB,EAAE,CAAC;;CAE9C,EAAE,qBAAqB,GAAG,IAAI,CAAC,oBAAoB,CAAC;CACpD,EAAE,gBAAgB,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,qBAAqB,EAAE,MAAM,EAAE,CAAC;;CAE1F,EAAE,iBAAiB,GAAG,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;CACvD,EAAE,iBAAiB,CAAC,IAAI,EAAE,CAAC;;CAE3B,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;;CAEpD,EAAE,KAAK,KAAK,CAAC,WAAW,KAAK,IAAI,GAAG;;CAEpC,GAAG,iBAAiB,CAAC,IAAI,EAAE,CAAC;;CAE5B,GAAG;;CAEH;;CAEA,EAAE,KAAK,gBAAgB,GAAG,SAAS,CAAC,YAAY,EAAE,CAAC;;CAEnD,EAAE,IAAI,YAAY,GAAG,kBAAkB,CAAC,KAAK,CAAC,YAAY,CAAC;;CAE3D,EAAE,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;;CAElD,EAAE,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;;CAE3C,EAAE,KAAK,gBAAgB,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC;;CAEjD;;CAEA,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;;CAE/C,EAAE,KAAK,YAAY,KAAK,SAAS,GAAG;;CAEpC,GAAG,YAAY,GAAG,IAAI,CAAC;;CAEvB,GAAG;;CAEH,EAAE,IAAI,CAAC,eAAe,EAAE,YAAY,EAAE,CAAC;;CAEvC;;CAEA,EAAE,UAAU,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;;CAEpE;;CAEA,EAAE,IAAI,aAAa,GAAG,iBAAiB,CAAC,MAAM,CAAC;CAC/C,EAAE,IAAI,kBAAkB,GAAG,iBAAiB,CAAC,WAAW,CAAC;;CAEzD,EAAE,KAAK,KAAK,CAAC,gBAAgB,GAAG;;CAEhC,GAAG,IAAI,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC;;CAEjD,GAAG,KAAK,aAAa,CAAC,MAAM,GAAG,aAAa,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC/F,GAAG,KAAK,kBAAkB,CAAC,MAAM,GAAG,aAAa,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;;CAEzG,GAAG,MAAM;;CAET;;CAEA,GAAG,KAAK,aAAa,CAAC,MAAM,GAAG,aAAa,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;;CAE7E;;CAEA,GAAG,KAAK,kBAAkB,CAAC,MAAM,GAAG,aAAa,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;;CAEvF,GAAG;;CAEH;;CAEA,EAAE,IAAI,YAAY,GAAG,kBAAkB,CAAC,KAAK,CAAC,YAAY,CAAC;;CAE3D,EAAE,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;;CAEvD;;CAEA,EAAE,KAAK,YAAY,GAAG;;CAEtB,GAAG,QAAQ,CAAC,wBAAwB,EAAE,YAAY,EAAE,CAAC;;CAErD,GAAG;;CAEH;;CAEA,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;CACtC,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;CACtC,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;;CAEtC,EAAE,KAAK,CAAC,gBAAgB,EAAE,KAAK,EAAE,CAAC;;CAElC,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;;CAE9C,EAAE,KAAK,EAAE,CAAC,OAAO,GAAG;;CAEpB,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;;CAEpB,GAAG;;CAEH;;CAEA,EAAE,iBAAiB,GAAG,IAAI,CAAC;CAC3B,EAAE,kBAAkB,GAAG,IAAI,CAAC;;CAE5B,EAAE,CAAC;;CAEH;CACA;;CAEA;;CAEA;;CAEA;;CAEA;CACA;;CAEA;CACA;;CAEA;;CAEA;;CAEA;;CAEA;CACA;CACA;;CAEA;;CAEA;;CAEA;;CAEA;;CAEA;;CAEA;;CAEA;;CAEA;CACA;CACA;;CAEA;;CAEA;CACA;;CAEA;;CAEA;;CAEA;CACA;;CAEA,CAAC,SAAS,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG;;CAEvD,EAAE,KAAK,MAAM,CAAC,OAAO,KAAK,KAAK,GAAG,OAAO;;CAEzC,EAAE,IAAI,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;;CAEpD,EAAE,KAAK,OAAO,GAAG;;CAEjB,GAAG,KAAK,MAAM,CAAC,OAAO,GAAG;;CAEzB,IAAI,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;;CAE3C,IAAI,KAAK,MAAM,CAAC,UAAU,GAAG;;CAE7B,KAAK,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;;CAE7C,KAAK;;CAEL,IAAI,MAAM,KAAK,MAAM,CAAC,QAAQ,GAAG;;CAEjC,IAAI,KAAK,EAAE,MAAM,CAAC,aAAa,IAAI,QAAQ,CAAC,gBAAgB,EAAE,MAAM,EAAE,GAAG;;CAEzE,KAAK,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;;CAE7C,KAAK;;CAEL,IAAI,MAAM,KAAK,MAAM,CAAC,uBAAuB,GAAG;;CAEhD,IAAI,KAAK,WAAW,GAAG;;CAEvB,KAAK,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC,WAAW,EAAE;CACzD,OAAO,YAAY,EAAE,iBAAiB,EAAE,CAAC;;CAEzC,KAAK;;CAEL,IAAI,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;;CAE9E,IAAI,MAAM,KAAK,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,GAAG;;CAEnE,IAAI,KAAK,MAAM,CAAC,aAAa,GAAG;;CAEhC,KAAK,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;;CAE9B,KAAK;;CAEL,IAAI,KAAK,EAAE,MAAM,CAAC,aAAa,IAAI,QAAQ,CAAC,gBAAgB,EAAE,MAAM,EAAE,GAAG;;CAEzE,KAAK,KAAK,WAAW,GAAG;;CAExB,MAAM,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC,WAAW,EAAE;CAC1D,QAAQ,YAAY,EAAE,iBAAiB,EAAE,CAAC;;CAE1C,MAAM;;CAEN,KAAK,IAAI,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;CAC7C,KAAK,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;;CAEpC,KAAK,KAAK,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG;;CAEtC,MAAM,IAAI,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;;CAEnC,MAAM,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAExD,OAAO,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC;CAC/B,OAAO,IAAI,aAAa,GAAG,QAAQ,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC;;CAE3D,OAAO,KAAK,aAAa,IAAI,aAAa,CAAC,OAAO,GAAG;;CAErD,QAAQ,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;;CAErF,QAAQ;;CAER,OAAO;;CAEP,MAAM,MAAM,KAAK,QAAQ,CAAC,OAAO,GAAG;;CAEpC,MAAM,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;;CAE7E,MAAM;;CAEN,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH,EAAE,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;;CAEjC,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEtD,GAAG,aAAa,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;;CAEvD,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,aAAa,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,GAAG;;CAEvE,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAExD,GAAG,IAAI,UAAU,GAAG,UAAU,EAAE,CAAC,EAAE,CAAC;;CAEpC,GAAG,IAAI,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;CAClC,GAAG,IAAI,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;CACtC,GAAG,IAAI,QAAQ,GAAG,gBAAgB,KAAK,SAAS,GAAG,UAAU,CAAC,QAAQ,GAAG,gBAAgB,CAAC;CAC1F,GAAG,IAAI,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;;CAEhC,GAAG,KAAK,MAAM,CAAC,aAAa,GAAG;;CAE/B,IAAI,mBAAmB,GAAG,MAAM,CAAC;;CAEjC,IAAI,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;;CAEjC,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEzD,KAAK,IAAI,OAAO,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC;;CAEhC,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG;;CAEjD,MAAM,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;;CAElC,MAAM,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC;CAChC,MAAM,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC;CACjC,MAAM,IAAI,KAAK,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC;CACpC,MAAM,IAAI,MAAM,GAAG,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC;;CAEtC,MAAM,KAAK,CAAC,QAAQ,EAAE,gBAAgB,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,cAAc,EAAE,WAAW,EAAE,EAAE,CAAC;;CAElG,MAAM,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;;CAExE,MAAM;;CAEN,KAAK;;CAEL,IAAI,MAAM;;CAEV,IAAI,mBAAmB,GAAG,IAAI,CAAC;;CAE/B,IAAI,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;;CAErE,IAAI;;CAEJ,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,GAAG;;CAE3E,EAAE,MAAM,CAAC,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;CAC3E,EAAE,kBAAkB,GAAG,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,mBAAmB,IAAI,MAAM,EAAE,CAAC;;CAEhF,EAAE,MAAM,CAAC,eAAe,CAAC,gBAAgB,EAAE,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;CAC3F,EAAE,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE,CAAC;;CAEhE,EAAE,KAAK,MAAM,CAAC,uBAAuB,GAAG;;CAExC,GAAG,IAAI,WAAW,KAAK,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,CAAC;;CAE/E,GAAG,KAAK,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;;CAE9C,GAAG,IAAI,OAAO,GAAG,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;;CAEnE,GAAG,uBAAuB,GAAG,EAAE,CAAC;;CAEhC,GAAG,qBAAqB,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;;CAEtD,GAAG,MAAM;;CAET,GAAG,KAAK,CAAC,kBAAkB,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;;CAEpF,GAAG;;CAEH,EAAE,MAAM,CAAC,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;CAC1E,EAAE,kBAAkB,GAAG,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,mBAAmB,IAAI,MAAM,EAAE,CAAC;;CAEhF,EAAE;;CAEF,CAAC,SAAS,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG;;CAEhD,EAAE,IAAI,kBAAkB,GAAG,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;;CAEtD,EAAE,IAAI,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC;CAC/C,EAAE,IAAI,YAAY,GAAG,kBAAkB,CAAC,KAAK,CAAC,YAAY,CAAC;;CAE3D,EAAE,IAAI,UAAU,GAAG,YAAY,CAAC,aAAa;CAC7C,GAAG,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;;CAEvG,EAAE,IAAI,IAAI,GAAG,YAAY,CAAC,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;;CAEjE,EAAE,IAAI,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC;CAC3C,EAAE,IAAI,aAAa,GAAG,IAAI,CAAC;;CAE3B,EAAE,KAAK,OAAO,KAAK,SAAS,GAAG;;CAE/B;CACA,GAAG,QAAQ,CAAC,gBAAgB,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;;CAE7D,GAAG,MAAM,KAAK,OAAO,CAAC,IAAI,KAAK,IAAI,GAAG;;CAEtC;CACA,GAAG,+BAA+B,EAAE,QAAQ,EAAE,CAAC;;CAE/C,GAAG,MAAM,KAAK,kBAAkB,CAAC,UAAU,KAAK,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG;;CAEpE,GAAG,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;CAClE,GAAG,aAAa,GAAG,KAAK,CAAC;;CAEzB,GAAG,MAAM,KAAK,UAAU,CAAC,QAAQ,KAAK,SAAS,GAAG;;CAElD;CACA,GAAG,OAAO;;CAEV,GAAG,MAAM;;CAET;CACA,GAAG,aAAa,GAAG,KAAK,CAAC;;CAEzB,GAAG;;CAEH,EAAE,KAAK,aAAa,GAAG;;CAEvB,GAAG,KAAK,UAAU,CAAC,QAAQ,GAAG;;CAE9B,IAAI,IAAI,MAAM,GAAG,SAAS,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC;;CAElD,IAAI,kBAAkB,CAAC,MAAM,GAAG;CAChC,KAAK,IAAI,EAAE,QAAQ,CAAC,IAAI;CACxB,KAAK,QAAQ,EAAE,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE;CACrD,KAAK,YAAY,EAAE,MAAM,CAAC,YAAY;CACtC,KAAK,cAAc,EAAE,MAAM,CAAC,cAAc;CAC1C,KAAK,CAAC;;CAEN,IAAI,MAAM;;CAEV,IAAI,kBAAkB,CAAC,MAAM,GAAG;CAChC,KAAK,IAAI,EAAE,QAAQ,CAAC,IAAI;CACxB,KAAK,QAAQ,EAAE,QAAQ,CAAC,QAAQ;CAChC,KAAK,YAAY,EAAE,QAAQ,CAAC,YAAY;CACxC,KAAK,cAAc,EAAE,QAAQ,CAAC,cAAc;CAC5C,KAAK,CAAC;;CAEN,IAAI;;CAEJ,GAAG,QAAQ,CAAC,eAAe,EAAE,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;;CAEhE,GAAG,OAAO,GAAG,YAAY,CAAC,cAAc,EAAE,QAAQ,EAAE,kBAAkB,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;;CAElG,GAAG,kBAAkB,CAAC,OAAO,GAAG,OAAO,CAAC;CACxC,GAAG,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;;CAE9B,GAAG;;CAEH,EAAE,IAAI,iBAAiB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;;CAElD,EAAE,KAAK,QAAQ,CAAC,YAAY,GAAG;;CAE/B,GAAG,QAAQ,CAAC,wBAAwB,GAAG,CAAC,CAAC;;CAEzC,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,eAAe,EAAE,CAAC,GAAG,GAAG;;CAEtD,IAAI,KAAK,iBAAiB,EAAE,aAAa,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG;;CAEvD,KAAK,QAAQ,CAAC,wBAAwB,GAAG,CAAC;;CAE1C,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,YAAY,GAAG;;CAE/B,GAAG,QAAQ,CAAC,wBAAwB,GAAG,CAAC,CAAC;;CAEzC,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,eAAe,EAAE,CAAC,GAAG,GAAG;;CAEtD,IAAI,KAAK,iBAAiB,EAAE,aAAa,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG;;CAEvD,KAAK,QAAQ,CAAC,wBAAwB,GAAG,CAAC;;CAE1C,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH,EAAE,IAAI,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC;;CAEpD,EAAE,KAAK,EAAE,QAAQ,CAAC,gBAAgB;CAClC,GAAG,EAAE,QAAQ,CAAC,mBAAmB;CACjC,GAAG,QAAQ,CAAC,QAAQ,KAAK,IAAI,GAAG;;CAEhC,GAAG,kBAAkB,CAAC,iBAAiB,GAAG,SAAS,CAAC,SAAS,CAAC;CAC9D,GAAG,kBAAkB,CAAC,eAAe,GAAG,SAAS,CAAC,eAAe,CAAC;CAClE,GAAG,QAAQ,CAAC,cAAc,GAAG,SAAS,CAAC,OAAO,CAAC;;CAE/C,GAAG;;CAEH,EAAE,kBAAkB,CAAC,GAAG,GAAG,GAAG,CAAC;;CAE/B;;CAEA,EAAE,kBAAkB,CAAC,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;;CAEpD,EAAE,KAAK,QAAQ,CAAC,MAAM,GAAG;;CAEzB;;CAEA,GAAG,QAAQ,CAAC,iBAAiB,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;CAC3D,GAAG,QAAQ,CAAC,iBAAiB,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC;CAC/D,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;CACjD,GAAG,QAAQ,CAAC,cAAc,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;CACzD,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;CACnD,GAAG,QAAQ,CAAC,gBAAgB,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;;CAEvD,GAAG,QAAQ,CAAC,oBAAoB,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC;CAC3E,GAAG,QAAQ,CAAC,uBAAuB,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC;CACjF,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;CAC7D,GAAG,QAAQ,CAAC,gBAAgB,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC;CACnE,GAAG,QAAQ,CAAC,cAAc,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC;CAC/D,GAAG,QAAQ,CAAC,iBAAiB,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC;CACrE;;CAEA,GAAG;;CAEH,EAAE,IAAI,YAAY,GAAG,kBAAkB,CAAC,OAAO,CAAC,WAAW,EAAE;CAC7D,GAAG,YAAY;CACf,IAAI,aAAa,CAAC,YAAY,EAAE,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;;CAE7D,EAAE,kBAAkB,CAAC,YAAY,GAAG,YAAY,CAAC;;CAEjD,EAAE;;CAEF,CAAC,SAAS,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG;;CAEtD,EAAE,iBAAiB,GAAG,CAAC,CAAC;;CAExB,EAAE,IAAI,kBAAkB,GAAG,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;CACtD,EAAE,IAAI,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC;;CAE/C,EAAE,KAAK,gBAAgB,GAAG;;CAE1B,GAAG,KAAK,qBAAqB,IAAI,MAAM,KAAK,cAAc,GAAG;;CAE7D,IAAI,IAAI,QAAQ;CAChB,KAAK,MAAM,KAAK,cAAc;CAC9B,KAAK,QAAQ,CAAC,EAAE,KAAK,kBAAkB,CAAC;;CAExC;CACA;CACA;CACA,IAAI,SAAS,CAAC,QAAQ;CACtB,KAAK,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,gBAAgB,EAAE,QAAQ,CAAC,WAAW;CAC7E,KAAK,MAAM,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC;;CAE5C,IAAI;;CAEJ,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,WAAW,KAAK,KAAK,GAAG;;CAExC,GAAG,KAAK,kBAAkB,CAAC,OAAO,KAAK,SAAS,GAAG;;CAEnD,IAAI,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEhC,IAAI,MAAM,KAAK,QAAQ,CAAC,GAAG,IAAI,kBAAkB,CAAC,GAAG,KAAK,GAAG,GAAG;;CAEhE,IAAI,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEhC,IAAI,MAAM,KAAK,QAAQ,CAAC,MAAM,IAAI,kBAAkB,CAAC,UAAU,KAAK,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG;;CAExF,IAAI,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEhC,IAAI,MAAM,KAAK,kBAAkB,CAAC,iBAAiB,KAAK,SAAS;CACjE,MAAM,kBAAkB,CAAC,iBAAiB,KAAK,SAAS,CAAC,SAAS;CAClE,IAAI,kBAAkB,CAAC,eAAe,KAAK,SAAS,CAAC,eAAe,EAAE,GAAG;;CAEzE,IAAI,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEhC,IAAI;;CAEJ,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,WAAW,GAAG;;CAE9B,GAAG,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;CACzC,GAAG,QAAQ,CAAC,WAAW,GAAG,KAAK,CAAC;;CAEhC,GAAG;;CAEH,EAAE,IAAI,cAAc,GAAG,KAAK,CAAC;CAC7B,EAAE,IAAI,eAAe,GAAG,KAAK,CAAC;CAC9B,EAAE,IAAI,aAAa,GAAG,KAAK,CAAC;;CAE5B,EAAE,IAAI,OAAO,GAAG,kBAAkB,CAAC,OAAO;CAC1C,GAAG,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE;CACrC,GAAG,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC;;CAEnD,EAAE,KAAK,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG;;CAE7C,GAAG,cAAc,GAAG,IAAI,CAAC;CACzB,GAAG,eAAe,GAAG,IAAI,CAAC;CAC1B,GAAG,aAAa,GAAG,IAAI,CAAC;;CAExB,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,EAAE,KAAK,kBAAkB,GAAG;;CAE5C,GAAG,kBAAkB,GAAG,QAAQ,CAAC,EAAE,CAAC;;CAEpC,GAAG,eAAe,GAAG,IAAI,CAAC;;CAE1B,GAAG;;CAEH,EAAE,KAAK,cAAc,IAAI,MAAM,KAAK,cAAc,GAAG;;CAErD,GAAG,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,kBAAkB,EAAE,MAAM,CAAC,gBAAgB,EAAE,CAAC;;CAE3E,GAAG,KAAK,YAAY,CAAC,sBAAsB,GAAG;;CAE9C,IAAI,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,eAAe;CAC7C,KAAK,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;;CAEzD,IAAI;;CAEJ;;CAEA,GAAG,KAAK,cAAc,OAAO,mBAAmB,IAAI,MAAM,EAAE,GAAG;;CAE/D,IAAI,cAAc,KAAK,mBAAmB,IAAI,MAAM,EAAE,CAAC;;CAEvD;CACA;CACA;;CAEA,IAAI,eAAe,GAAG,IAAI,CAAC;CAC3B,IAAI,aAAa,GAAG,IAAI,CAAC;;CAEzB,IAAI;;CAEJ;CACA;;CAEA,GAAG,KAAK,QAAQ,CAAC,gBAAgB;CACjC,IAAI,QAAQ,CAAC,mBAAmB;CAChC,IAAI,QAAQ,CAAC,sBAAsB;CACnC,IAAI,QAAQ,CAAC,MAAM,GAAG;;CAEtB,IAAI,IAAI,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC;;CAEhD,IAAI,KAAK,OAAO,KAAK,SAAS,GAAG;;CAEjC,KAAK,OAAO,CAAC,QAAQ,EAAE,GAAG;CAC1B,MAAM,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;;CAE7D,KAAK;;CAEL,IAAI;;CAEJ,GAAG,KAAK,QAAQ,CAAC,mBAAmB;CACpC,IAAI,QAAQ,CAAC,qBAAqB;CAClC,IAAI,QAAQ,CAAC,mBAAmB;CAChC,IAAI,QAAQ,CAAC,sBAAsB;CACnC,IAAI,QAAQ,CAAC,gBAAgB;CAC7B,IAAI,QAAQ,CAAC,QAAQ,GAAG;;CAExB,IAAI,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,CAAC,kBAAkB,EAAE,CAAC;;CAExE,IAAI;;CAEJ,GAAG;;CAEH;CACA;CACA;;CAEA,EAAE,KAAK,QAAQ,CAAC,QAAQ,GAAG;;CAE3B,GAAG,UAAU,CAAC,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;CACvD,GAAG,UAAU,CAAC,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;;CAE9D,GAAG,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;;CAElC,GAAG,KAAK,QAAQ,GAAG;;CAEnB,IAAI,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;;CAE/B,IAAI,KAAK,YAAY,CAAC,mBAAmB,GAAG;;CAE5C,KAAK,KAAK,QAAQ,CAAC,WAAW,KAAK,SAAS,GAAG;;CAE/C;CACA;CACA;CACA;CACA;CACA;;;CAGA,MAAM,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;CAC/C,MAAM,IAAI,GAAG,KAAK,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;CAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;;CAEjC,MAAM,IAAI,YAAY,GAAG,IAAI,YAAY,EAAE,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC;CAC7D,MAAM,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,YAAY,EAAE,CAAC;;CAEhD,MAAM,IAAI,WAAW,GAAG,IAAI,WAAW,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;CAC3F,MAAM,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC;;CAErC,MAAM,QAAQ,CAAC,YAAY,GAAG,YAAY,CAAC;CAC3C,MAAM,QAAQ,CAAC,WAAW,GAAG,WAAW,CAAC;CACzC,MAAM,QAAQ,CAAC,eAAe,GAAG,IAAI,CAAC;;CAEtC,MAAM;;CAEN,KAAK,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC;CACrE,KAAK,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,iBAAiB,EAAE,QAAQ,CAAC,eAAe,EAAE,CAAC;;CAE7E,KAAK,MAAM;;CAEX,KAAK,UAAU,CAAC,WAAW,EAAE,GAAG,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;;CAE7D,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH,EAAE,KAAK,eAAe,GAAG;;CAEzB,GAAG,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,qBAAqB,EAAE,KAAK,CAAC,mBAAmB,EAAE,CAAC;CAChF,GAAG,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,uBAAuB,EAAE,KAAK,CAAC,qBAAqB,EAAE,CAAC;;CAEpF,GAAG,KAAK,QAAQ,CAAC,MAAM,GAAG;;CAE1B;;CAEA;CACA;CACA;CACA;CACA;CACA;;CAEA,IAAI,6BAA6B,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC;;CAE/D,IAAI;;CAEJ;;CAEA,GAAG,KAAK,GAAG,IAAI,QAAQ,CAAC,GAAG,GAAG;;CAE9B,IAAI,kBAAkB,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;;CAE1C,IAAI;;CAEJ,GAAG,KAAK,QAAQ,CAAC,mBAAmB,GAAG;;CAEvC,IAAI,qBAAqB,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;;CAElD,IAAI,MAAM,KAAK,QAAQ,CAAC,qBAAqB,GAAG;;CAEhD,IAAI,qBAAqB,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;CAClD,IAAI,sBAAsB,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;;CAEnD,IAAI,MAAM,KAAK,QAAQ,CAAC,mBAAmB,GAAG;;CAE9C,IAAI,qBAAqB,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;;CAElD,IAAI,KAAK,QAAQ,CAAC,kBAAkB,GAAG;;CAEvC,KAAK,mBAAmB,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;;CAEjD,KAAK,MAAM;;CAEX,KAAK,oBAAoB,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;;CAElD,KAAK;;CAEL,IAAI,MAAM,KAAK,QAAQ,CAAC,sBAAsB,GAAG;;CAEjD,IAAI,qBAAqB,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;;CAElD,IAAI,KAAK,QAAQ,CAAC,sBAAsB,GAAG;;CAE3C,KAAK,uBAAuB,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;;CAErD,KAAK,MAAM;;CAEX,KAAK,uBAAuB,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;;CAErD,KAAK;;CAEL,IAAI,MAAM,KAAK,QAAQ,CAAC,mBAAmB,GAAG;;CAE9C,IAAI,qBAAqB,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;CAClD,IAAI,oBAAoB,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;;CAEjD,IAAI,MAAM,KAAK,QAAQ,CAAC,sBAAsB,GAAG;;CAEjD,IAAI,qBAAqB,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;CAClD,IAAI,uBAAuB,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;;CAEpD,IAAI,MAAM,KAAK,QAAQ,CAAC,oBAAoB,GAAG;;CAE/C,IAAI,qBAAqB,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;CAClD,IAAI,qBAAqB,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;;CAElD,IAAI,MAAM,KAAK,QAAQ,CAAC,mBAAmB,GAAG;;CAE9C,IAAI,mBAAmB,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;;CAEhD,IAAI,KAAK,QAAQ,CAAC,oBAAoB,GAAG;;CAEzC,KAAK,mBAAmB,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;;CAEjD,KAAK;;CAEL,IAAI,MAAM,KAAK,QAAQ,CAAC,gBAAgB,GAAG;;CAE3C,IAAI,qBAAqB,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;;CAElD,IAAI,MAAM,KAAK,QAAQ,CAAC,gBAAgB,GAAG;;CAE3C,IAAI,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;CAC5C,IAAI,UAAU,CAAC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;;CAEhD,IAAI;;CAEJ;CACA;;CAEA,GAAG,KAAK,UAAU,CAAC,KAAK,KAAK,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;CACpF,GAAG,KAAK,UAAU,CAAC,KAAK,KAAK,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;;CAEpF,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,kBAAkB,CAAC,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;;CAEnF,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,gBAAgB,IAAI,QAAQ,CAAC,kBAAkB,KAAK,IAAI,GAAG;;CAE3E,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,kBAAkB,CAAC,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;CACnF,GAAG,QAAQ,CAAC,kBAAkB,GAAG,KAAK,CAAC;;CAEvC,GAAG;;CAEH;;CAEA,EAAE,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,iBAAiB,EAAE,MAAM,CAAC,eAAe,EAAE,CAAC;CACxE,EAAE,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC;CAClE,EAAE,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;;CAEhE,EAAE,OAAO,OAAO,CAAC;;CAEjB,EAAE;;CAEF;;CAEA,CAAC,SAAS,qBAAqB,EAAE,QAAQ,EAAE,QAAQ,GAAG;;CAEtD,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;;CAE5C,EAAE,KAAK,QAAQ,CAAC,KAAK,GAAG;;CAExB,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;;CAE3C,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,QAAQ,GAAG;;CAE3B,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,cAAc,EAAE,QAAQ,CAAC,iBAAiB,EAAE,CAAC;;CAElG,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,GAAG,GAAG;;CAEtB,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC;;CAErC,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,QAAQ,GAAG;;CAE3B,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC;;CAE/C,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,WAAW,GAAG;;CAE9B,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC;;CAErD,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,MAAM,GAAG;;CAEzB,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC;;CAE3C;CACA;CACA;CACA;CACA,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;;CAEpG,GAAG,QAAQ,CAAC,YAAY,CAAC,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC;CACvD,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC;;CAE7D,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,aAAa,CAAC;;CAEhF,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,QAAQ,GAAG;;CAE3B,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC;CAC/C,GAAG,QAAQ,CAAC,iBAAiB,CAAC,KAAK,GAAG,QAAQ,CAAC,iBAAiB,CAAC;;CAEjE,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,KAAK,GAAG;;CAExB,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;CACzC,GAAG,QAAQ,CAAC,cAAc,CAAC,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC;;CAE3D,GAAG;;CAEH;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,EAAE,IAAI,UAAU,CAAC;;CAEjB,EAAE,KAAK,QAAQ,CAAC,GAAG,GAAG;;CAEtB,GAAG,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC;;CAE7B,GAAG,MAAM,KAAK,QAAQ,CAAC,WAAW,GAAG;;CAErC,GAAG,UAAU,GAAG,QAAQ,CAAC,WAAW,CAAC;;CAErC,GAAG,MAAM,KAAK,QAAQ,CAAC,eAAe,GAAG;;CAEzC,GAAG,UAAU,GAAG,QAAQ,CAAC,eAAe,CAAC;;CAEzC,GAAG,MAAM,KAAK,QAAQ,CAAC,SAAS,GAAG;;CAEnC,GAAG,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC;;CAEnC,GAAG,MAAM,KAAK,QAAQ,CAAC,OAAO,GAAG;;CAEjC,GAAG,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC;;CAEjC,GAAG,MAAM,KAAK,QAAQ,CAAC,YAAY,GAAG;;CAEtC,GAAG,UAAU,GAAG,QAAQ,CAAC,YAAY,CAAC;;CAEtC,GAAG,MAAM,KAAK,QAAQ,CAAC,YAAY,GAAG;;CAEtC,GAAG,UAAU,GAAG,QAAQ,CAAC,YAAY,CAAC;;CAEtC,GAAG,MAAM,KAAK,QAAQ,CAAC,QAAQ,GAAG;;CAElC,GAAG,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC;;CAElC,GAAG,MAAM,KAAK,QAAQ,CAAC,WAAW,GAAG;;CAErC,GAAG,UAAU,GAAG,QAAQ,CAAC,WAAW,CAAC;;CAErC,GAAG;;CAEH,EAAE,KAAK,UAAU,KAAK,SAAS,GAAG;;CAElC;CACA,GAAG,KAAK,UAAU,CAAC,mBAAmB,GAAG;;CAEzC,IAAI,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC;;CAEpC,IAAI;;CAEJ,GAAG,KAAK,UAAU,CAAC,gBAAgB,KAAK,IAAI,GAAG;;CAE/C,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;;CAE9B,IAAI;;CAEJ,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC;;CAExD,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,mBAAmB,EAAE,QAAQ,EAAE,QAAQ,GAAG;;CAEpD,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;CAC1C,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;;CAE5C,EAAE;;CAEF,CAAC,SAAS,mBAAmB,EAAE,QAAQ,EAAE,QAAQ,GAAG;;CAEpD,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC;CAC9C,EAAE,QAAQ,CAAC,SAAS,CAAC,KAAK,GAAG,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC;CAClE,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;;CAExC,EAAE;;CAEF,CAAC,SAAS,qBAAqB,EAAE,QAAQ,EAAE,QAAQ,GAAG;;CAEtD,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;CAC1C,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;CAC5C,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,GAAG,WAAW,CAAC;CACpD,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,GAAG,GAAG,CAAC;;CAEvC,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC;;CAEpC,EAAE,KAAK,QAAQ,CAAC,GAAG,KAAK,IAAI,GAAG;;CAE/B,GAAG,KAAK,QAAQ,CAAC,GAAG,CAAC,gBAAgB,KAAK,IAAI,GAAG;;CAEjD,IAAI,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;;CAEhC,IAAI;;CAEJ,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;;CAE1D,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,kBAAkB,EAAE,QAAQ,EAAE,GAAG,GAAG;;CAE9C,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;;CAEtC,EAAE,KAAK,GAAG,CAAC,KAAK,GAAG;;CAEnB,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC;CACrC,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC;;CAEnC,GAAG,MAAM,KAAK,GAAG,CAAC,SAAS,GAAG;;CAE9B,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC;;CAE3C,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,sBAAsB,EAAE,QAAQ,EAAE,QAAQ,GAAG;;CAEvD,EAAE,KAAK,QAAQ,CAAC,WAAW,GAAG;;CAE9B,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC;;CAErD,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,oBAAoB,EAAE,QAAQ,EAAE,QAAQ,GAAG;;CAErD,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC;CAC9C,EAAE,QAAQ,CAAC,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC;;CAElE,EAAE,KAAK,QAAQ,CAAC,WAAW,GAAG;;CAE9B,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC;;CAErD,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,OAAO,GAAG;;CAE1B,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;CAC7C,GAAG,QAAQ,CAAC,SAAS,CAAC,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC;;CAEjD,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,SAAS,GAAG;;CAE5B,GAAG,QAAQ,CAAC,SAAS,CAAC,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC;CACjD,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC;;CAE3D,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,eAAe,GAAG;;CAElC,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC;CAC7D,GAAG,QAAQ,CAAC,iBAAiB,CAAC,KAAK,GAAG,QAAQ,CAAC,iBAAiB,CAAC;CACjE,GAAG,QAAQ,CAAC,gBAAgB,CAAC,KAAK,GAAG,QAAQ,CAAC,gBAAgB,CAAC;;CAE/D,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,mBAAmB,EAAE,QAAQ,EAAE,QAAQ,GAAG;;CAEpD,EAAE,oBAAoB,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;;CAE7C,EAAE,KAAK,QAAQ,CAAC,WAAW,GAAG;;CAE9B,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC;;CAErD,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,uBAAuB,EAAE,QAAQ,EAAE,QAAQ,GAAG;;CAExD,EAAE,QAAQ,CAAC,SAAS,CAAC,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC;CAChD,EAAE,QAAQ,CAAC,SAAS,CAAC,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC;;CAEhD,EAAE,KAAK,QAAQ,CAAC,YAAY,GAAG;;CAE/B,GAAG,QAAQ,CAAC,YAAY,CAAC,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC;;CAEvD,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,YAAY,GAAG;;CAE/B,GAAG,QAAQ,CAAC,YAAY,CAAC,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC;;CAEvD,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,WAAW,GAAG;;CAE9B,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC;;CAErD,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,OAAO,GAAG;;CAE1B,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;CAC7C,GAAG,QAAQ,CAAC,SAAS,CAAC,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC;;CAEjD,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,SAAS,GAAG;;CAE5B,GAAG,QAAQ,CAAC,SAAS,CAAC,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC;CACjD,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC;;CAE3D,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,eAAe,GAAG;;CAElC,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC;CAC7D,GAAG,QAAQ,CAAC,iBAAiB,CAAC,KAAK,GAAG,QAAQ,CAAC,iBAAiB,CAAC;CACjE,GAAG,QAAQ,CAAC,gBAAgB,CAAC,KAAK,GAAG,QAAQ,CAAC,gBAAgB,CAAC;;CAE/D,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,MAAM,GAAG;;CAEzB;CACA,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC;;CAE7D,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,uBAAuB,EAAE,QAAQ,EAAE,QAAQ,GAAG;;CAExD,EAAE,QAAQ,CAAC,SAAS,CAAC,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC;CAChD,EAAE,QAAQ,CAAC,kBAAkB,CAAC,KAAK,GAAG,QAAQ,CAAC,kBAAkB,CAAC;;CAElE,EAAE,uBAAuB,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;;CAEhD,EAAE;;CAEF,CAAC,SAAS,oBAAoB,EAAE,QAAQ,EAAE,QAAQ,GAAG;;CAErD,EAAE,KAAK,QAAQ,CAAC,eAAe,GAAG;;CAElC,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC;CAC7D,GAAG,QAAQ,CAAC,iBAAiB,CAAC,KAAK,GAAG,QAAQ,CAAC,iBAAiB,CAAC;CACjE,GAAG,QAAQ,CAAC,gBAAgB,CAAC,KAAK,GAAG,QAAQ,CAAC,gBAAgB,CAAC;;CAE/D,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,uBAAuB,EAAE,QAAQ,EAAE,QAAQ,GAAG;;CAExD,EAAE,KAAK,QAAQ,CAAC,eAAe,GAAG;;CAElC,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC;CAC7D,GAAG,QAAQ,CAAC,iBAAiB,CAAC,KAAK,GAAG,QAAQ,CAAC,iBAAiB,CAAC;CACjE,GAAG,QAAQ,CAAC,gBAAgB,CAAC,KAAK,GAAG,QAAQ,CAAC,gBAAgB,CAAC;;CAE/D,GAAG;;CAEH,EAAE,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,iBAAiB,EAAE,CAAC;CACtE,EAAE,QAAQ,CAAC,YAAY,CAAC,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC;CACtD,EAAE,QAAQ,CAAC,WAAW,CAAC,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC;;CAEpD,EAAE;;CAEF,CAAC,SAAS,qBAAqB,EAAE,QAAQ,EAAE,QAAQ,GAAG;;CAEtD,EAAE,KAAK,QAAQ,CAAC,OAAO,GAAG;;CAE1B,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;CAC7C,GAAG,QAAQ,CAAC,SAAS,CAAC,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC;;CAEjD,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,SAAS,GAAG;;CAE5B,GAAG,QAAQ,CAAC,SAAS,CAAC,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC;CACjD,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC;;CAE3D,GAAG;;CAEH,EAAE,KAAK,QAAQ,CAAC,eAAe,GAAG;;CAElC,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC;CAC7D,GAAG,QAAQ,CAAC,iBAAiB,CAAC,KAAK,GAAG,QAAQ,CAAC,iBAAiB,CAAC;CACjE,GAAG,QAAQ,CAAC,gBAAgB,CAAC,KAAK,GAAG,QAAQ,CAAC,gBAAgB,CAAC;;CAE/D,GAAG;;CAEH,EAAE;;CAEF;;CAEA,CAAC,SAAS,6BAA6B,EAAE,QAAQ,EAAE,KAAK,GAAG;;CAE3D,EAAE,QAAQ,CAAC,iBAAiB,CAAC,WAAW,GAAG,KAAK,CAAC;;CAEjD,EAAE,QAAQ,CAAC,iBAAiB,CAAC,WAAW,GAAG,KAAK,CAAC;CACjD,EAAE,QAAQ,CAAC,WAAW,CAAC,WAAW,GAAG,KAAK,CAAC;CAC3C,EAAE,QAAQ,CAAC,UAAU,CAAC,WAAW,GAAG,KAAK,CAAC;CAC1C,EAAE,QAAQ,CAAC,cAAc,CAAC,WAAW,GAAG,KAAK,CAAC;CAC9C,EAAE,QAAQ,CAAC,gBAAgB,CAAC,WAAW,GAAG,KAAK,CAAC;;CAEhD,EAAE;;CAEF;;CAEA,CAAC,SAAS,gBAAgB,GAAG;;CAE7B,EAAE,IAAI,WAAW,GAAG,iBAAiB,CAAC;;CAEtC,EAAE,KAAK,WAAW,IAAI,YAAY,CAAC,WAAW,GAAG;;CAEjD,GAAG,OAAO,CAAC,IAAI,EAAE,qCAAqC,GAAG,WAAW,GAAG,8CAA8C,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;;CAEnJ,GAAG;;CAEH,EAAE,iBAAiB,IAAI,CAAC,CAAC;;CAEzB,EAAE,OAAO,WAAW,CAAC;;CAErB,EAAE;;CAEF,CAAC,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;;CAE1C;CACA,CAAC,IAAI,CAAC,YAAY,KAAK,YAAY;;CAEnC,EAAE,IAAI,MAAM,GAAG,KAAK,CAAC;;CAErB;CACA,EAAE,OAAO,SAAS,YAAY,EAAE,OAAO,EAAE,IAAI,GAAG;;CAEhD,GAAG,KAAK,OAAO,IAAI,OAAO,CAAC,mBAAmB,GAAG;;CAEjD,IAAI,KAAK,EAAE,MAAM,GAAG;;CAEpB,KAAK,OAAO,CAAC,IAAI,EAAE,8GAA8G,EAAE,CAAC;CACpI,KAAK,MAAM,GAAG,IAAI,CAAC;;CAEnB,KAAK;;CAEL,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;;CAE9B,IAAI;;CAEJ,GAAG,QAAQ,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;CAE1C,GAAG,CAAC;;CAEJ,EAAE,EAAE,EAAE,CAAC;;CAEP,CAAC,IAAI,CAAC,UAAU,KAAK,YAAY;;CAEjC,EAAE,IAAI,MAAM,GAAG,KAAK,CAAC;;CAErB,EAAE,OAAO,SAAS,UAAU,EAAE,OAAO,EAAE,IAAI,GAAG;;CAE9C,GAAG,KAAK,EAAE,MAAM,GAAG;;CAEnB,IAAI,OAAO,CAAC,IAAI,EAAE,2EAA2E,EAAE,CAAC;CAChG,IAAI,MAAM,GAAG,IAAI,CAAC;;CAElB,IAAI;;CAEJ,GAAG,QAAQ,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;CAE1C,GAAG,CAAC;;CAEJ,EAAE,EAAE,EAAE,CAAC;;CAEP,CAAC,IAAI,CAAC,cAAc,KAAK,YAAY;;CAErC,EAAE,IAAI,MAAM,GAAG,KAAK,CAAC;;CAErB,EAAE,OAAO,SAAS,cAAc,EAAE,OAAO,EAAE,IAAI,GAAG;;CAElD;CACA,GAAG,KAAK,OAAO,IAAI,OAAO,CAAC,uBAAuB,GAAG;;CAErD,IAAI,KAAK,EAAE,MAAM,GAAG;;CAEpB,KAAK,OAAO,CAAC,IAAI,EAAE,qHAAqH,EAAE,CAAC;CAC3I,KAAK,MAAM,GAAG,IAAI,CAAC;;CAEnB,KAAK;;CAEL,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;;CAE9B,IAAI;;CAEJ;CACA;CACA,GAAG,KAAK,EAAE,OAAO,IAAI,OAAO,CAAC,aAAa;CAC1C,MAAM,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,GAAG;;CAEvE;;CAEA;CACA,IAAI,QAAQ,CAAC,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;CAE7C,IAAI,MAAM;;CAEV;;CAEA,IAAI,QAAQ,CAAC,qBAAqB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;CAEpD,IAAI;;CAEJ,GAAG,CAAC;;CAEJ,EAAE,EAAE,EAAE,CAAC;;CAEP,CAAC,IAAI,CAAC,eAAe,GAAG,YAAY;;CAEpC,EAAE,OAAO,oBAAoB,CAAC;;CAE9B,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,eAAe,GAAG,WAAW,YAAY,GAAG;;CAElD,EAAE,oBAAoB,GAAG,YAAY,CAAC;;CAEtC,EAAE,KAAK,YAAY,IAAI,UAAU,CAAC,GAAG,EAAE,YAAY,EAAE,CAAC,kBAAkB,KAAK,SAAS,GAAG;;CAEzF,GAAG,QAAQ,CAAC,iBAAiB,EAAE,YAAY,EAAE,CAAC;;CAE9C,GAAG;;CAEH,EAAE,IAAI,WAAW,GAAG,IAAI,CAAC;CACzB,EAAE,IAAI,MAAM,GAAG,KAAK,CAAC;;CAErB,EAAE,KAAK,YAAY,GAAG;;CAEtB,GAAG,IAAI,kBAAkB,GAAG,UAAU,CAAC,GAAG,EAAE,YAAY,EAAE,CAAC,kBAAkB,CAAC;;CAE9E,GAAG,KAAK,YAAY,CAAC,uBAAuB,GAAG;;CAE/C,IAAI,WAAW,GAAG,kBAAkB,EAAE,YAAY,CAAC,cAAc,EAAE,CAAC;CACpE,IAAI,MAAM,GAAG,IAAI,CAAC;;CAElB,IAAI,MAAM;;CAEV,IAAI,WAAW,GAAG,kBAAkB,CAAC;;CAErC,IAAI;;CAEJ,GAAG,gBAAgB,CAAC,IAAI,EAAE,YAAY,CAAC,QAAQ,EAAE,CAAC;CAClD,GAAG,eAAe,CAAC,IAAI,EAAE,YAAY,CAAC,OAAO,EAAE,CAAC;CAChD,GAAG,mBAAmB,GAAG,YAAY,CAAC,WAAW,CAAC;;CAElD,GAAG,MAAM;;CAET,GAAG,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,cAAc,EAAE,WAAW,EAAE,CAAC;CACpE,GAAG,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,cAAc,EAAE,WAAW,EAAE,CAAC;CAClE,GAAG,mBAAmB,GAAG,YAAY,CAAC;;CAEtC,GAAG;;CAEH,EAAE,KAAK,mBAAmB,KAAK,WAAW,GAAG;;CAE7C,GAAG,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC;CACvD,GAAG,mBAAmB,GAAG,WAAW,CAAC;;CAErC,GAAG;;CAEH,EAAE,KAAK,CAAC,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CACrC,EAAE,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC;CACnC,EAAE,KAAK,CAAC,cAAc,EAAE,mBAAmB,EAAE,CAAC;;CAE9C,EAAE,KAAK,MAAM,GAAG;;CAEhB,GAAG,IAAI,iBAAiB,GAAG,UAAU,CAAC,GAAG,EAAE,YAAY,CAAC,OAAO,EAAE,CAAC;CAClE,GAAG,GAAG,CAAC,oBAAoB,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,iBAAiB,EAAE,GAAG,CAAC,2BAA2B,GAAG,YAAY,CAAC,cAAc,EAAE,iBAAiB,CAAC,cAAc,EAAE,YAAY,CAAC,iBAAiB,EAAE,CAAC;;CAEvM,GAAG;;CAEH,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,sBAAsB,GAAG,WAAW,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG;;CAEtF,EAAE,KAAK,IAAI,YAAY,IAAI,YAAY,CAAC,mBAAmB,EAAE,GAAG;;CAEhE,GAAG,OAAO,CAAC,KAAK,EAAE,0FAA0F,EAAE,CAAC;CAC/G,GAAG,OAAO;;CAEV,GAAG;;CAEH,EAAE,IAAI,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE,YAAY,EAAE,CAAC,kBAAkB,CAAC;;CAEtE,EAAE,KAAK,WAAW,GAAG;;CAErB,GAAG,IAAI,OAAO,GAAG,KAAK,CAAC;;CAEvB,GAAG,KAAK,WAAW,KAAK,mBAAmB,GAAG;;CAE9C,IAAI,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC;;CAExD,IAAI,OAAO,GAAG,IAAI,CAAC;;CAEnB,IAAI;;CAEJ,GAAG,IAAI;;CAEP,IAAI,IAAI,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC;CACvC,IAAI,IAAI,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;CACvC,IAAI,IAAI,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;;CAEnC,IAAI,KAAK,aAAa,KAAK,UAAU,IAAI,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,gCAAgC,EAAE,GAAG;;CAEvI,KAAK,OAAO,CAAC,KAAK,EAAE,2GAA2G,EAAE,CAAC;CAClI,KAAK,OAAO;;CAEZ,KAAK;;CAEL,IAAI,KAAK,WAAW,KAAK,gBAAgB,IAAI,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,8BAA8B,EAAE;CACpI,KAAK,IAAI,WAAW,KAAK,SAAS,MAAM,UAAU,CAAC,GAAG,EAAE,mBAAmB,EAAE,IAAI,UAAU,CAAC,GAAG,EAAE,0BAA0B,EAAE,EAAE,EAAE;CACjI,KAAK,IAAI,WAAW,KAAK,aAAa,IAAI,UAAU,CAAC,GAAG,EAAE,6BAA6B,EAAE,EAAE,GAAG;;CAE9F,KAAK,OAAO,CAAC,KAAK,EAAE,qHAAqH,EAAE,CAAC;CAC5I,KAAK,OAAO;;CAEZ,KAAK;;CAEL,IAAI,KAAK,GAAG,CAAC,sBAAsB,EAAE,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,oBAAoB,GAAG;;CAEtF;;CAEA,KAAK,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,YAAY,CAAC,KAAK,GAAG,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,YAAY,CAAC,MAAM,GAAG,MAAM,EAAE,EAAE,GAAG;;CAErH,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,CAAC;;CAElH,MAAM;;CAEN,KAAK,MAAM;;CAEX,KAAK,OAAO,CAAC,KAAK,EAAE,4GAA4G,EAAE,CAAC;;CAEnI,KAAK;;CAEL,IAAI,SAAS;;CAEb,IAAI,KAAK,OAAO,GAAG;;CAEnB,KAAK,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,WAAW,EAAE,mBAAmB,EAAE,CAAC;;CAEjE,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,wBAAwB,GAAG,WAAW,QAAQ,EAAE,OAAO,EAAE,KAAK,GAAG;;CAEvE,EAAE,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;CAClC,EAAE,IAAI,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;CACpC,EAAE,IAAI,QAAQ,GAAG,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;;CAEjD,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;CAElC,EAAE,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,UAAU,EAAE,KAAK,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;;CAEvG,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,oBAAoB,GAAG,WAAW,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,GAAG;;CAElF,EAAE,IAAI,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;CACrC,EAAE,IAAI,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;CACvC,EAAE,IAAI,QAAQ,GAAG,KAAK,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC;CACpD,EAAE,IAAI,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC;CAChD,EAAE,IAAI,MAAM,GAAG,UAAU,CAAC,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC;;CAEnF,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;;CAErC,EAAE,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,UAAU,EAAE,KAAK,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;;CAEnH,EAAE,CAAC;;CAEH,CAAC;;CAED;CACA;CACA;CACA;;CAEA,SAAS,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG;;CAEnC,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;;CAEhB,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,EAAE,KAAK,EAAE,CAAC;CACjC,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,OAAO,KAAK,SAAS,KAAK,OAAO,GAAG,OAAO,CAAC;;CAE9D,CAAC;;CAED,OAAO,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC;;CAEnC,OAAO,CAAC,SAAS,CAAC,KAAK,GAAG,YAAY;;CAEtC,CAAC,OAAO,IAAI,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;;CAEzD,CAAC,CAAC;;CAEF,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,wBAAwB;;CAEnD,CAAC,OAAO;CACR,EAAE,IAAI,EAAE,SAAS;CACjB,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;CAC5B,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO;CACvB,EAAE,CAAC;;CAEH,CAAC,CAAC;;CAEF;CACA;CACA;CACA;;CAEA,SAAS,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,GAAG;;CAEjC,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;;CAEhB,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,EAAE,KAAK,EAAE,CAAC;;CAEjC,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,IAAI,KAAK,SAAS,KAAK,IAAI,GAAG,CAAC,CAAC;CAC/C,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,GAAG,KAAK,SAAS,KAAK,GAAG,GAAG,IAAI,CAAC;;CAE/C,CAAC;;CAED,GAAG,CAAC,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC;;CAE3B,GAAG,CAAC,SAAS,CAAC,KAAK,GAAG,YAAY;;CAElC,CAAC,OAAO,IAAI,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;;CAE5D,CAAC,CAAC;;CAEF,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,wBAAwB;;CAE/C,CAAC,OAAO;CACR,EAAE,IAAI,EAAE,KAAK;CACb,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;CAC5B,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI;CACjB,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG;CACf,EAAE,CAAC;;CAEH,CAAC,CAAC;;CAEF;CACA;CACA;;CAEA,SAAS,KAAK,GAAG;;CAEjB,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;;CAErB,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;CACxB,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;CACjB,CAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;;CAE9B,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;;CAExB,CAAC;;CAED,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,EAAE;;CAEtE,CAAC,WAAW,EAAE,KAAK;;CAEnB,CAAC,IAAI,EAAE,WAAW,MAAM,EAAE,SAAS,GAAG;;CAEtC,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;;CAE1D,EAAE,KAAK,MAAM,CAAC,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;CAChF,EAAE,KAAK,MAAM,CAAC,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;CAC3D,EAAE,KAAK,MAAM,CAAC,gBAAgB,KAAK,IAAI,GAAG,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;;CAElG,EAAE,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;CACtC,EAAE,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;;CAElD,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,IAAI,GAAG;;CAE3B,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE1D,EAAE,KAAK,IAAI,CAAC,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;CAC1F,EAAE,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;;CAE/D,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,cAAc,EAAE,UAAU,GAAG;;CAEtC,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;;CAE9B,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,EAAE,QAAQ,EAAE,CAAC;CACpC,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;;CAEjB,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;;CAEnB,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC;CAClB,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;;CAErB,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC;;CAE9B,CAAC;;CAED,cAAc,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CAC/D,cAAc,CAAC,SAAS,CAAC,WAAW,GAAG,cAAc,CAAC;CACtD,cAAc,CAAC,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC;;CAEjD,cAAc,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW,MAAM,GAAG;;CAEpD,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE9C,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;CACjC,CAAC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;;CAEvB,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;;CAEjC,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF;CACA;CACA;CACA;;CAEA,SAAS,MAAM,EAAE,QAAQ,GAAG;;CAE5B,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;;CAEtB,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,QAAQ,KAAK,SAAS,KAAK,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;;CAE9E,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAEvC,CAAC;;CAED,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,EAAE;;CAEvE,CAAC,WAAW,EAAE,MAAM;;CAEpB,CAAC,QAAQ,EAAE,IAAI;;CAEf,CAAC,OAAO,IAAI,YAAY;;CAExB,EAAE,IAAI,cAAc,GAAG,IAAI,OAAO,EAAE,CAAC;CACrC,EAAE,IAAI,aAAa,GAAG,IAAI,OAAO,EAAE,CAAC;CACpC,EAAE,IAAI,UAAU,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEjC,EAAE,OAAO,SAAS,OAAO,EAAE,SAAS,EAAE,UAAU,GAAG;;CAEnD,GAAG,aAAa,CAAC,qBAAqB,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;CAC3D,GAAG,SAAS,CAAC,GAAG,CAAC,mBAAmB,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC;;CAEtE,GAAG,UAAU,CAAC,kBAAkB,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;CACrD,GAAG,IAAI,WAAW,GAAG,UAAU,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;;CAErD,GAAG,KAAK,aAAa,CAAC,iBAAiB,EAAE,cAAc,EAAE,GAAG,WAAW,GAAG,OAAO;;CAEjF,GAAG,IAAI,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,cAAc,EAAE,CAAC;;CAEpE,GAAG,KAAK,QAAQ,GAAG,SAAS,CAAC,IAAI,IAAI,QAAQ,GAAG,SAAS,CAAC,GAAG,GAAG,OAAO;;CAEvE,GAAG,UAAU,CAAC,IAAI,EAAE;;CAEpB,IAAI,QAAQ,EAAE,QAAQ;CACtB,IAAI,KAAK,EAAE,cAAc,CAAC,KAAK,EAAE;CACjC,IAAI,IAAI,EAAE,IAAI;CACd,IAAI,MAAM,EAAE,IAAI;;CAEhB,IAAI,EAAE,CAAC;;CAEP,GAAG,CAAC;;CAEJ,EAAE,EAAE,EAAE;;CAEN,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE5D,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,MAAM,GAAG;;CAE3B,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE/C,EAAE,KAAK,MAAM,CAAC,MAAM,KAAK,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;;CAEvE,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;;CAGF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;;CAEA,SAAS,GAAG,GAAG;;CAEf,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;;CAEnB,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,EAAE;CAChC,EAAE,MAAM,EAAE;CACV,GAAG,UAAU,EAAE,IAAI;CACnB,GAAG,KAAK,EAAE,EAAE;CACZ,GAAG;CACH,EAAE,EAAE,CAAC;;CAEL,CAAC;;CAED,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,EAAE;;CAEpE,CAAC,WAAW,EAAE,GAAG;;CAEjB,CAAC,IAAI,EAAE,WAAW,MAAM,GAAG;;CAE3B,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;;CAEtD,EAAE,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;;CAE7B,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEpD,GAAG,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC;;CAE3B,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;;CAEzD,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,QAAQ,EAAE,WAAW,MAAM,EAAE,QAAQ,GAAG;;CAEzC,EAAE,KAAK,QAAQ,KAAK,SAAS,GAAG,QAAQ,GAAG,CAAC,CAAC;;CAE7C,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;;CAElC,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;CAE3B,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAE7C,GAAG,KAAK,QAAQ,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,QAAQ,GAAG;;CAE1C,IAAI,MAAM;;CAEV,IAAI;;CAEJ,GAAG;;CAEH,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;;CAEhE,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC;;CAErB,EAAE;;CAEF,CAAC,oBAAoB,EAAE,WAAW,QAAQ,GAAG;;CAE7C,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;CAE3B,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEpD,GAAG,KAAK,QAAQ,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,QAAQ,GAAG;;CAE1C,IAAI,MAAM;;CAEV,IAAI;;CAEJ,GAAG;;CAEH,EAAE,OAAO,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC;;CAEhC,EAAE;;CAEF,CAAC,OAAO,IAAI,YAAY;;CAExB,EAAE,IAAI,cAAc,GAAG,IAAI,OAAO,EAAE,CAAC;;CAErC,EAAE,OAAO,SAAS,OAAO,EAAE,SAAS,EAAE,UAAU,GAAG;;CAEnD,GAAG,cAAc,CAAC,qBAAqB,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;;CAE5D,GAAG,IAAI,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,cAAc,EAAE,CAAC;;CAEpE,GAAG,IAAI,CAAC,oBAAoB,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;;CAE1E,GAAG,CAAC;;CAEJ,EAAE,EAAE,EAAE;;CAEN,CAAC,MAAM,EAAE,YAAY;;CAErB,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CACzB,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,OAAO,SAAS,MAAM,EAAE,MAAM,GAAG;;CAEnC,GAAG,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;CAE5B,GAAG,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG;;CAE5B,IAAI,EAAE,CAAC,qBAAqB,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;CACnD,IAAI,EAAE,CAAC,qBAAqB,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;;CAEjD,IAAI,IAAI,QAAQ,GAAG,EAAE,CAAC,UAAU,EAAE,EAAE,EAAE,CAAC;;CAEvC,IAAI,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;;CAEtC,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEtD,KAAK,KAAK,QAAQ,IAAI,MAAM,EAAE,CAAC,EAAE,CAAC,QAAQ,GAAG;;CAE7C,MAAM,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;CAC7C,MAAM,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;;CAExC,MAAM,MAAM;;CAEZ,MAAM,MAAM;;CAEZ,MAAM;;CAEN,KAAK;;CAEL,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAE1B,KAAK,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;;CAExC,KAAK;;CAEL,IAAI;;CAEJ,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,MAAM,EAAE,WAAW,IAAI,GAAG;;CAE3B,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE1D,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC;;CAE1B,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;CAE3B,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEpD,GAAG,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC;;CAE3B,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;CAC5B,IAAI,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI;CAC7B,IAAI,QAAQ,EAAE,KAAK,CAAC,QAAQ;CAC5B,IAAI,EAAE,CAAC;;CAEP,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,QAAQ,EAAE,KAAK,EAAE,YAAY,GAAG;;CAEzC;;CAEA,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE,CAAC;;CAErB,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;CAC/B,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;;CAEhE;;CAEA,CAAC,KAAK,YAAY,KAAK,SAAS,GAAG;;CAEnC,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC;;CAE3B,EAAE,MAAM;;CAER,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,GAAG;;CAEnD,GAAG,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;;CAE/C,GAAG,MAAM;;CAET,GAAG,OAAO,CAAC,IAAI,EAAE,kDAAkD,EAAE,CAAC;;CAEtE,GAAG,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;;CAE1B,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAE3D,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,OAAO,EAAE,EAAE,CAAC;;CAE5C,IAAI;;CAEJ,GAAG;;CAEH,EAAE;;CAEF,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE;;CAEnC,CAAC,iBAAiB,EAAE,YAAY;;CAEhC,EAAE,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;;CAEzB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAE1D,GAAG,IAAI,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE/B,GAAG,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG;;CAE1B,IAAI,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;;CAEtD,IAAI;;CAEJ,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;;CAErC,GAAG;;CAEH,EAAE;;CAEF,CAAC,IAAI,EAAE,YAAY;;CAEnB,EAAE,IAAI,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;;CAElB;;CAEA,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEtD,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;;CAE1B,GAAG,KAAK,IAAI,GAAG;;CAEf,IAAI,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE1D,IAAI;;CAEJ,GAAG;;CAEH;;CAEA,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEtD,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;;CAE1B,GAAG,KAAK,IAAI,GAAG;;CAEf,IAAI,KAAK,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG;;CAE7C,KAAK,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;CACvD,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;;CAE9C,KAAK,MAAM;;CAEX,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;;CAE1C,KAAK;;CAEL,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;;CAExE,IAAI;;CAEJ,GAAG;;CAEH,EAAE;;CAEF,CAAC,MAAM,EAAE,EAAE,YAAY;;CAEvB,EAAE,IAAI,YAAY,GAAG,IAAI,OAAO,EAAE,CAAC;CACnC,EAAE,IAAI,cAAc,GAAG,IAAI,OAAO,EAAE,CAAC;;CAErC,EAAE,OAAO,SAAS,MAAM,GAAG;;CAE3B,GAAG,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;CAC1B,GAAG,IAAI,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;CACxC,GAAG,IAAI,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;CACxC,GAAG,IAAI,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;;CAEtC;;CAEA,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEtD;;CAEA,IAAI,IAAI,MAAM,GAAG,KAAK,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC,WAAW,GAAG,cAAc,CAAC;;CAEtE,IAAI,YAAY,CAAC,gBAAgB,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;CAC/D,IAAI,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC;;CAEjD,IAAI;;CAEJ,GAAG,KAAK,WAAW,KAAK,SAAS,GAAG;;CAEpC,IAAI,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEnC,IAAI;;CAEJ,GAAG,CAAC;;CAEJ,EAAE,IAAI;;CAEN,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,IAAI,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;;CAEvD,EAAE;;CAEF,CAAC,aAAa,EAAE,WAAW,IAAI,GAAG;;CAElC,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAE1D,GAAG,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;;CAE9B,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,GAAG;;CAE7B,IAAI,OAAO,IAAI,CAAC;;CAEhB,IAAI;;CAEJ,GAAG;;CAEH,EAAE,OAAO,SAAS,CAAC;;CAEnB,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;;CAEA,SAAS,IAAI,GAAG;;CAEhB,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;;CAEpB,CAAC;;CAED,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,EAAE;;CAErE,CAAC,WAAW,EAAE,IAAI;;CAElB,CAAC,MAAM,EAAE,IAAI;;CAEb,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;;CAEA,SAAS,WAAW,EAAE,QAAQ,EAAE,QAAQ,GAAG;;CAE3C,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;;CAEvC,CAAC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;;CAE3B,CAAC,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC;CAC5B,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,OAAO,EAAE,CAAC;CACjC,CAAC,IAAI,CAAC,iBAAiB,GAAG,IAAI,OAAO,EAAE,CAAC;;CAExC,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;CAC9B,CAAC,IAAI,QAAQ,GAAG,IAAI,QAAQ,EAAE,KAAK,EAAE,CAAC;;CAEtC,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;;CAEzC,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;;CAE7B,CAAC;;CAED,WAAW,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE;;CAExE,CAAC,WAAW,EAAE,WAAW;;CAEzB,CAAC,aAAa,EAAE,IAAI;;CAEpB,CAAC,SAAS,EAAE,YAAY;;CAExB,EAAE,IAAI,KAAK,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC;CAC9B,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;;CAEZ,EAAE,KAAK,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,SAAS,GAAG;;CAE5D;;CAEA,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEhE,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;;CAErC;;CAEA,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;CACtB,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB;;CAEA,IAAI,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;CAC3B,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;CACzC,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;CAC5C,IAAI,KAAK,KAAK,CAAC,GAAG,KAAK,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;;CAErE,IAAI;;CAEJ;;CAEA,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEhE,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;;CAErC,IAAI,KAAK,EAAE,KAAK,CAAC,MAAM,KAAK,EAAE,CAAC,QAAQ,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,MAAM,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,SAAS,EAAE,GAAG;;CAE5G;;CAEA,KAAK,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE7C,KAAK,MAAM;;CAEX;;CAEA,KAAK,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE5B,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH;CACA;;CAEA,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;;CAEjC,EAAE,OAAO,KAAK,CAAC;;CAEf,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,QAAQ,EAAE,UAAU,GAAG;;CAEzC,EAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;;CAE3B,EAAE,KAAK,UAAU,KAAK,SAAS,GAAG;;CAElC,GAAG,IAAI,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;;CAElC,GAAG,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC;;CAErC,GAAG,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;;CAEjC,GAAG;;CAEH,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC;CACrC,EAAE,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,UAAU,EAAE,CAAC;;CAElD,EAAE;;CAEF,CAAC,IAAI,EAAE,YAAY;;CAEnB,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;;CAEvB,EAAE;;CAEF,CAAC,oBAAoB,EAAE,YAAY;;CAEnC,EAAE,IAAI,KAAK,EAAE,CAAC,CAAC;;CAEf,EAAE,KAAK,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG;;CAEnD,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAE7D,IAAI,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;;CAE5C,IAAI,KAAK,GAAG,GAAG,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC;;CAEvC,IAAI,KAAK,KAAK,KAAK,QAAQ,GAAG;;CAE9B,KAAK,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC;;CAEhC,KAAK,MAAM;;CAEX,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE1B,KAAK;;CAEL,IAAI;;CAEJ,GAAG,MAAM,KAAK,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,gBAAgB,GAAG;;CAEhE,GAAG,IAAI,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE3B,GAAG,IAAI,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC;;CAExD,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,GAAG,GAAG;;CAE7C,IAAI,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;CACjC,IAAI,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;CACjC,IAAI,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;CACjC,IAAI,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;;CAEjC,IAAI,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;;CAExC,IAAI,KAAK,KAAK,KAAK,QAAQ,GAAG;;CAE9B,KAAK,GAAG,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC;;CAEjC,KAAK,MAAM;;CAEX,KAAK,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE3B,KAAK;;CAEL,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;;CAExD,IAAI;;CAEJ,GAAG;;CAEH,EAAE;;CAEF,CAAC,iBAAiB,EAAE,WAAW,KAAK,GAAG;;CAEvC,EAAE,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;CAEvD,EAAE,KAAK,IAAI,CAAC,QAAQ,KAAK,UAAU,GAAG;;CAEtC,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;;CAEzD,GAAG,MAAM,KAAK,IAAI,CAAC,QAAQ,KAAK,UAAU,GAAG;;CAE7C,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;;CAExD,GAAG,MAAM;;CAET,GAAG,OAAO,CAAC,IAAI,EAAE,4CAA4C,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;;CAEhF,GAAG;;CAEH,EAAE;;CAEF,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE3E,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,iBAAiB,EAAE,UAAU,GAAG;;CAEzC,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;;CAEjC,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,EAAE,QAAQ,EAAE,CAAC;;CAEpC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;CACpB,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;CACxB,CAAC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;;CAEzB,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;;CAErB,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC;;CAE9B,CAAC;;CAED,iBAAiB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CAClE,iBAAiB,CAAC,SAAS,CAAC,WAAW,GAAG,iBAAiB,CAAC;;CAE5D,iBAAiB,CAAC,SAAS,CAAC,mBAAmB,GAAG,IAAI,CAAC;;CAEvD,iBAAiB,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW,MAAM,GAAG;;CAEvD,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE9C,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;;CAEjC,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;CACnC,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;CAC/B,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;;CAEjC,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF;CACA;CACA;;CAEA,SAAS,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,GAAG;;CAE1C,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG;;CAEnB,EAAE,OAAO,CAAC,IAAI,EAAE,iGAAiG,EAAE,CAAC;CACpH,EAAE,OAAO,IAAI,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;;CAEhD,EAAE;;CAEF,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;;CAEpB,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,KAAK,SAAS,GAAG,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;CAC1E,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,KAAK,SAAS,GAAG,QAAQ,GAAG,IAAI,iBAAiB,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,EAAE,EAAE,CAAC;;CAElH,CAAC;;CAED,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,EAAE;;CAErE,CAAC,WAAW,EAAE,IAAI;;CAElB,CAAC,MAAM,EAAE,IAAI;;CAEb,CAAC,oBAAoB,IAAI,YAAY;;CAErC,EAAE,IAAI,KAAK,GAAG,IAAI,OAAO,EAAE,CAAC;CAC5B,EAAE,IAAI,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE1B,EAAE,OAAO,SAAS,oBAAoB,GAAG;;CAEzC,GAAG,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAEhC,GAAG,KAAK,QAAQ,CAAC,gBAAgB,GAAG;;CAEpC;;CAEA,IAAI,KAAK,QAAQ,CAAC,KAAK,KAAK,IAAI,GAAG;;CAEnC,KAAK,IAAI,iBAAiB,GAAG,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;CAC1D,KAAK,IAAI,aAAa,GAAG,EAAE,CAAC,EAAE,CAAC;;CAE/B,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,iBAAiB,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEjE,MAAM,KAAK,CAAC,mBAAmB,EAAE,iBAAiB,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;CAC5D,MAAM,GAAG,CAAC,mBAAmB,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;;CAEtD,MAAM,aAAa,EAAE,CAAC,EAAE,GAAG,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;CAClD,MAAM,aAAa,EAAE,CAAC,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC;;CAEpD,MAAM;;CAEN,KAAK,QAAQ,CAAC,YAAY,EAAE,cAAc,EAAE,IAAI,sBAAsB,EAAE,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE7F,KAAK,MAAM;;CAEX,KAAK,OAAO,CAAC,IAAI,EAAE,+FAA+F,EAAE,CAAC;;CAErH,KAAK;;CAEL,IAAI,MAAM,KAAK,QAAQ,CAAC,UAAU,GAAG;;CAErC,IAAI,IAAI,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;CACrC,IAAI,IAAI,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC;;CAE/C,IAAI,aAAa,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;;CAE3B,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAExD,KAAK,aAAa,EAAE,CAAC,EAAE,GAAG,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;CACjD,KAAK,aAAa,EAAE,CAAC,EAAE,IAAI,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEzE,KAAK;;CAEL,IAAI;;CAEJ,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG,CAAC;;CAEJ,EAAE,EAAE,EAAE;;CAEN,CAAC,OAAO,IAAI,YAAY;;CAExB,EAAE,IAAI,aAAa,GAAG,IAAI,OAAO,EAAE,CAAC;CACpC,EAAE,IAAI,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;CACtB,EAAE,IAAI,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;;CAE5B,EAAE,OAAO,SAAS,OAAO,EAAE,SAAS,EAAE,UAAU,GAAG;;CAEnD,GAAG,IAAI,SAAS,GAAG,SAAS,CAAC,aAAa,CAAC;CAC3C,GAAG,IAAI,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;;CAE3C,GAAG,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;CAChC,GAAG,IAAI,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;;CAEtC;;CAEA,GAAG,KAAK,QAAQ,CAAC,cAAc,KAAK,IAAI,GAAG,QAAQ,CAAC,qBAAqB,EAAE,CAAC;;CAE5E,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,cAAc,EAAE,CAAC;CAC1C,GAAG,MAAM,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC;;CAEtC,GAAG,KAAK,SAAS,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,EAAE,KAAK,KAAK,GAAG,OAAO;;CAEpE;;CAEA,GAAG,aAAa,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC;CAC3C,GAAG,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,CAAC;;CAE3D,GAAG,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;CAC9B,GAAG,IAAI,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;CAC5B,GAAG,IAAI,YAAY,GAAG,IAAI,OAAO,EAAE,CAAC;CACpC,GAAG,IAAI,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;CAChC,GAAG,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,IAAI,CAAC,cAAc,KAAK,CAAC,GAAG,CAAC,CAAC;;CAEtD,GAAG,KAAK,QAAQ,CAAC,gBAAgB,GAAG;;CAEpC,IAAI,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;CAC/B,IAAI,IAAI,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;CACzC,IAAI,IAAI,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC;;CAE9C,IAAI,KAAK,KAAK,KAAK,IAAI,GAAG;;CAE1B,KAAK,IAAI,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC;;CAE/B,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,GAAG;;CAEjE,MAAM,IAAI,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC;CAC3B,MAAM,IAAI,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;;CAE/B,MAAM,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;CAC3C,MAAM,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;;CAEzC,MAAM,IAAI,MAAM,GAAG,GAAG,CAAC,mBAAmB,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;;CAEnF,MAAM,KAAK,MAAM,GAAG,WAAW,GAAG,SAAS;;CAE3C,MAAM,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;;CAEhD,MAAM,IAAI,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC;;CAEjE,MAAM,KAAK,QAAQ,GAAG,SAAS,CAAC,IAAI,IAAI,QAAQ,GAAG,SAAS,CAAC,GAAG,GAAG,SAAS;;CAE5E,MAAM,UAAU,CAAC,IAAI,EAAE;;CAEvB,OAAO,QAAQ,EAAE,QAAQ;CACzB;CACA;CACA,OAAO,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE;CACnE,OAAO,KAAK,EAAE,CAAC;CACf,OAAO,IAAI,EAAE,IAAI;CACjB,OAAO,SAAS,EAAE,IAAI;CACtB,OAAO,MAAM,EAAE,IAAI;;CAEnB,OAAO,EAAE,CAAC;;CAEV,MAAM;;CAEN,KAAK,MAAM;;CAEX,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,GAAG;;CAEvE,MAAM,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;CAC3C,MAAM,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;;CAE7C,MAAM,IAAI,MAAM,GAAG,GAAG,CAAC,mBAAmB,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;;CAEnF,MAAM,KAAK,MAAM,GAAG,WAAW,GAAG,SAAS;;CAE3C,MAAM,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;;CAEhD,MAAM,IAAI,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC;;CAEjE,MAAM,KAAK,QAAQ,GAAG,SAAS,CAAC,IAAI,IAAI,QAAQ,GAAG,SAAS,CAAC,GAAG,GAAG,SAAS;;CAE5E,MAAM,UAAU,CAAC,IAAI,EAAE;;CAEvB,OAAO,QAAQ,EAAE,QAAQ;CACzB;CACA;CACA,OAAO,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE;CACnE,OAAO,KAAK,EAAE,CAAC;CACf,OAAO,IAAI,EAAE,IAAI;CACjB,OAAO,SAAS,EAAE,IAAI;CACtB,OAAO,MAAM,EAAE,IAAI;;CAEnB,OAAO,EAAE,CAAC;;CAEV,MAAM;;CAEN,KAAK;;CAEL,IAAI,MAAM,KAAK,QAAQ,CAAC,UAAU,GAAG;;CAErC,IAAI,IAAI,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;CACrC,IAAI,IAAI,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;;CAErC,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,GAAG;;CAErD,KAAK,IAAI,MAAM,GAAG,GAAG,CAAC,mBAAmB,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;;CAEtG,KAAK,KAAK,MAAM,GAAG,WAAW,GAAG,SAAS;;CAE1C,KAAK,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;;CAE/C,KAAK,IAAI,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC;;CAEhE,KAAK,KAAK,QAAQ,GAAG,SAAS,CAAC,IAAI,IAAI,QAAQ,GAAG,SAAS,CAAC,GAAG,GAAG,SAAS;;CAE3E,KAAK,UAAU,CAAC,IAAI,EAAE;;CAEtB,MAAM,QAAQ,EAAE,QAAQ;CACxB;CACA;CACA,MAAM,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE;CAClE,MAAM,KAAK,EAAE,CAAC;CACd,MAAM,IAAI,EAAE,IAAI;CAChB,MAAM,SAAS,EAAE,IAAI;CACrB,MAAM,MAAM,EAAE,IAAI;;CAElB,MAAM,EAAE,CAAC;;CAET,KAAK;;CAEL,IAAI;;CAEJ,GAAG,CAAC;;CAEJ,EAAE,EAAE,EAAE;;CAEN,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE3E,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,YAAY,EAAE,QAAQ,EAAE,QAAQ,GAAG;;CAE5C,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;;CAEvC,CAAC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;;CAE5B,CAAC;;CAED,YAAY,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE;;CAEzE,CAAC,WAAW,EAAE,YAAY;;CAE1B,CAAC,cAAc,EAAE,IAAI;;CAErB,CAAC,oBAAoB,IAAI,YAAY;;CAErC,EAAE,IAAI,KAAK,GAAG,IAAI,OAAO,EAAE,CAAC;CAC5B,EAAE,IAAI,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE1B,EAAE,OAAO,SAAS,oBAAoB,GAAG;;CAEzC,GAAG,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAEhC,GAAG,KAAK,QAAQ,CAAC,gBAAgB,GAAG;;CAEpC;;CAEA,IAAI,KAAK,QAAQ,CAAC,KAAK,KAAK,IAAI,GAAG;;CAEnC,KAAK,IAAI,iBAAiB,GAAG,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;CAC1D,KAAK,IAAI,aAAa,GAAG,EAAE,CAAC;;CAE5B,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,iBAAiB,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;;CAEnE,MAAM,KAAK,CAAC,mBAAmB,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;CACxD,MAAM,GAAG,CAAC,mBAAmB,EAAE,iBAAiB,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;;CAE1D,MAAM,aAAa,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;CACpE,MAAM,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,aAAa,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC;;CAE5E,MAAM;;CAEN,KAAK,QAAQ,CAAC,YAAY,EAAE,cAAc,EAAE,IAAI,sBAAsB,EAAE,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE7F,KAAK,MAAM;;CAEX,KAAK,OAAO,CAAC,IAAI,EAAE,uGAAuG,EAAE,CAAC;;CAE7H,KAAK;;CAEL,IAAI,MAAM,KAAK,QAAQ,CAAC,UAAU,GAAG;;CAErC,IAAI,IAAI,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;CACrC,IAAI,IAAI,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC;;CAE/C,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;;CAE1D,KAAK,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;CACjC,KAAK,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;;CAEnC,KAAK,aAAa,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;CACnE,KAAK,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,aAAa,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC;;CAE3E,KAAK;;CAEL,IAAI;;CAEJ,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG,CAAC;;CAEJ,EAAE,EAAE,EAAE;;CAEN,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAG;;CAExC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;;CAEvC,CAAC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;;CAExB,CAAC;;CAED,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE;;CAErE,CAAC,WAAW,EAAE,QAAQ;;CAEtB,CAAC,UAAU,EAAE,IAAI;;CAEjB,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,cAAc,EAAE,UAAU,GAAG;;CAEtC,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;;CAE9B,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,EAAE,QAAQ,EAAE,CAAC;;CAEpC,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;;CAEjB,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;CACf,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;;CAE7B,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;;CAErB,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC;;CAE9B,CAAC;;CAED,cAAc,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CAC/D,cAAc,CAAC,SAAS,CAAC,WAAW,GAAG,cAAc,CAAC;;CAEtD,cAAc,CAAC,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC;;CAEjD,cAAc,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW,MAAM,GAAG;;CAEpD,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE9C,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;;CAEjC,CAAC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;CACzB,CAAC,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;;CAE/C,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF;CACA;CACA;;CAEA,SAAS,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG;;CAEtC,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;;CAEtB,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,KAAK,SAAS,GAAG,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;CAC1E,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,KAAK,SAAS,GAAG,QAAQ,GAAG,IAAI,cAAc,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,EAAE,EAAE,CAAC;;CAE/G,CAAC;;CAED,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,EAAE;;CAEvE,CAAC,WAAW,EAAE,MAAM;;CAEpB,CAAC,QAAQ,EAAE,IAAI;;CAEf,CAAC,OAAO,IAAI,YAAY;;CAExB,EAAE,IAAI,aAAa,GAAG,IAAI,OAAO,EAAE,CAAC;CACpC,EAAE,IAAI,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;CACtB,EAAE,IAAI,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;;CAE5B,EAAE,OAAO,SAAS,OAAO,EAAE,SAAS,EAAE,UAAU,GAAG;;CAEnD,GAAG,IAAI,MAAM,GAAG,IAAI,CAAC;CACrB,GAAG,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;CAChC,GAAG,IAAI,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;CACtC,GAAG,IAAI,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;;CAErD;;CAEA,GAAG,KAAK,QAAQ,CAAC,cAAc,KAAK,IAAI,GAAG,QAAQ,CAAC,qBAAqB,EAAE,CAAC;;CAE5E,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,cAAc,EAAE,CAAC;CAC1C,GAAG,MAAM,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC;CACtC,GAAG,MAAM,CAAC,MAAM,IAAI,SAAS,CAAC;;CAE9B,GAAG,KAAK,SAAS,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,EAAE,KAAK,KAAK,GAAG,OAAO;;CAEpE;;CAEA,GAAG,aAAa,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC;CAC3C,GAAG,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,CAAC;;CAE3D,GAAG,IAAI,cAAc,GAAG,SAAS,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;CAC3F,GAAG,IAAI,gBAAgB,GAAG,cAAc,GAAG,cAAc,CAAC;CAC1D,GAAG,IAAI,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;CAChC,GAAG,IAAI,cAAc,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEtC,GAAG,SAAS,SAAS,EAAE,KAAK,EAAE,KAAK,GAAG;;CAEtC,IAAI,IAAI,kBAAkB,GAAG,GAAG,CAAC,iBAAiB,EAAE,KAAK,EAAE,CAAC;;CAE5D,IAAI,KAAK,kBAAkB,GAAG,gBAAgB,GAAG;;CAEjD,KAAK,GAAG,CAAC,mBAAmB,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;CACtD,KAAK,cAAc,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC;;CAEhD,KAAK,IAAI,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,cAAc,EAAE,CAAC;;CAEtE,KAAK,KAAK,QAAQ,GAAG,SAAS,CAAC,IAAI,IAAI,QAAQ,GAAG,SAAS,CAAC,GAAG,GAAG,OAAO;;CAEzE,KAAK,UAAU,CAAC,IAAI,EAAE;;CAEtB,MAAM,QAAQ,EAAE,QAAQ;CACxB,MAAM,aAAa,EAAE,IAAI,CAAC,IAAI,EAAE,kBAAkB,EAAE;CACpD,MAAM,KAAK,EAAE,cAAc,CAAC,KAAK,EAAE;CACnC,MAAM,KAAK,EAAE,KAAK;CAClB,MAAM,IAAI,EAAE,IAAI;CAChB,MAAM,MAAM,EAAE,MAAM;;CAEpB,MAAM,EAAE,CAAC;;CAET,KAAK;;CAEL,IAAI;;CAEJ,GAAG,KAAK,QAAQ,CAAC,gBAAgB,GAAG;;CAEpC,IAAI,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;CAC/B,IAAI,IAAI,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;CACzC,IAAI,IAAI,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC;;CAE9C,IAAI,KAAK,KAAK,KAAK,IAAI,GAAG;;CAE1B,KAAK,IAAI,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC;;CAE/B,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAE1D,MAAM,IAAI,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC;;CAE3B,MAAM,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;;CAE7C,MAAM,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;;CAE/B,MAAM;;CAEN,KAAK,MAAM;;CAEX,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAE9D,MAAM,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;;CAE7C,MAAM,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;;CAE/B,MAAM;;CAEN,KAAK;;CAEL,IAAI,MAAM;;CAEV,IAAI,IAAI,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;;CAErC,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAExD,KAAK,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;;CAEnC,KAAK;;CAEL,IAAI;;CAEJ,GAAG,CAAC;;CAEJ,EAAE,EAAE,EAAE;;CAEN,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE3E,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,KAAK,GAAG;;CAEjB,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;;CAErB,CAAC;;CAED,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,EAAE;;CAEtE,CAAC,WAAW,EAAE,KAAK;;CAEnB,CAAC,OAAO,EAAE,IAAI;;CAEd,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG;;CAEtG,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;;CAEpG,CAAC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;;CAE9B,CAAC;;CAED,YAAY,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE;;CAE5E,CAAC,WAAW,EAAE,YAAY;;CAE1B,CAAC,cAAc,EAAE,IAAI;;CAErB,CAAC,MAAM,EAAE,YAAY;;CAErB,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;;CAEzB,EAAE,KAAK,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,iBAAiB,GAAG;;CAErD,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;;CAE3B,GAAG;;CAEH,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,iBAAiB,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,GAAG;;CAEtI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;;CAE7G,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;CAC/C,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;;CAExB;CACA;;CAEA,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;;CAEpB;CACA;;CAEA,CAAC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;;CAE9B,CAAC;;CAED,iBAAiB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;CACjE,iBAAiB,CAAC,SAAS,CAAC,WAAW,GAAG,iBAAiB,CAAC;;CAE5D,iBAAiB,CAAC,SAAS,CAAC,mBAAmB,GAAG,IAAI,CAAC;;CAEvD;CACA;CACA;CACA;;CAEA,SAAS,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG;;CAE9G,CAAC,MAAM,GAAG,MAAM,KAAK,SAAS,GAAG,MAAM,GAAG,WAAW,CAAC;;CAEtD,CAAC,KAAK,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,kBAAkB,GAAG;;CAEhE,EAAE,MAAM,IAAI,KAAK,EAAE,kFAAkF,EAAE,CAAC;;CAExG,EAAE;;CAEF,CAAC,KAAK,IAAI,KAAK,SAAS,IAAI,MAAM,KAAK,WAAW,GAAG,IAAI,GAAG,iBAAiB,CAAC;CAC9E,CAAC,KAAK,IAAI,KAAK,SAAS,IAAI,MAAM,KAAK,kBAAkB,GAAG,IAAI,GAAG,kBAAkB,CAAC;;CAEtF,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;;CAEnG,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;;CAE/C,CAAC,IAAI,CAAC,SAAS,GAAG,SAAS,KAAK,SAAS,GAAG,SAAS,GAAG,aAAa,CAAC;CACtE,CAAC,IAAI,CAAC,SAAS,GAAG,SAAS,KAAK,SAAS,GAAG,SAAS,GAAG,aAAa,CAAC;;CAEtE,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;CACpB,CAAC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;;CAE9B,CAAC;;CAED,YAAY,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;CAC5D,YAAY,CAAC,SAAS,CAAC,WAAW,GAAG,YAAY,CAAC;CAClD,YAAY,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC;;CAE7C;CACA;CACA;CACA;;CAEA,SAAS,iBAAiB,EAAE,QAAQ,GAAG;;CAEvC,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7B,CAAC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;;CAEjC;;CAEA,CAAC,IAAI,QAAQ,GAAG,EAAE,CAAC;;CAEnB;;CAEA,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;CACpB,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,GAAG,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC;CAClD,CAAC,IAAI,GAAG,EAAE,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACnC,CAAC,IAAI,MAAM,CAAC;;CAEZ;;CAEA,CAAC,KAAK,QAAQ,IAAI,QAAQ,CAAC,UAAU,GAAG;;CAExC;;CAEA,EAAE,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;;CAE7B,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAE/C,GAAG,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;;CAEzB,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAE9B,IAAI,KAAK,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;CAC9B,IAAI,KAAK,GAAG,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;CAC1C,IAAI,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;CACzC,IAAI,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;;CAEzC,IAAI,GAAG,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;;CAEtC,IAAI,KAAK,KAAK,EAAE,GAAG,EAAE,KAAK,SAAS,GAAG;;CAEtC,KAAK,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE7D,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH;;CAEA,EAAE,MAAM,GAAG,IAAI,KAAK,GAAG;;CAEvB,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,EAAE,CAAC;;CAEpB,GAAG,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;CAC1C,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAEjD,GAAG,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;CAC1C,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAEjD,GAAG;;CAEH,EAAE,MAAM,KAAK,QAAQ,IAAI,QAAQ,CAAC,gBAAgB,GAAG;;CAErD,EAAE,IAAI,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC;CAChC,EAAE,IAAI,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;CAC1B,EAAE,IAAI,MAAM,EAAE,MAAM,CAAC;;CAErB,EAAE,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,KAAK,QAAQ,CAAC,KAAK,KAAK,IAAI,GAAG;;CAEjC;;CAEA,GAAG,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;CAC3C,GAAG,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC;CAC5B,GAAG,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;;CAE5B,GAAG,KAAK,MAAM,CAAC,MAAM,KAAK,CAAC,GAAG;;CAE9B,IAAI,MAAM,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEtE,IAAI;;CAEJ;;CAEA,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,GAAG;;CAEnD,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC;;CAExB,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;CACxB,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;;CAExB,IAAI,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC,KAAK,KAAK,GAAG,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;;CAE5D,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEhC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;CACpC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;CAChD,MAAM,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;CAC3C,MAAM,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;;CAE3C,MAAM,GAAG,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;;CAExC,MAAM,KAAK,KAAK,EAAE,GAAG,EAAE,KAAK,SAAS,GAAG;;CAExC,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE/D,OAAO;;CAEP,MAAM;;CAEN,KAAK;;CAEL,IAAI;;CAEJ;;CAEA,GAAG,MAAM,GAAG,IAAI,KAAK,GAAG;;CAExB,IAAI,CAAC,GAAG,KAAK,EAAE,GAAG,EAAE,CAAC;;CAErB,IAAI,MAAM,CAAC,mBAAmB,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;CACrD,IAAI,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAElD,IAAI,MAAM,CAAC,mBAAmB,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;CACrD,IAAI,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAElD,IAAI;;CAEJ,GAAG,MAAM;;CAET;;CAEA,GAAG,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;;CAE3C,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,QAAQ,CAAC,KAAK,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAE1D,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAE/B;CACA;;CAEA,KAAK,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CACxB,KAAK,MAAM,CAAC,mBAAmB,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpD,KAAK,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAEnD,KAAK,MAAM,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;CACxC,KAAK,MAAM,CAAC,mBAAmB,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpD,KAAK,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAEnD,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH,EAAE;;CAEF;;CAEA,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,sBAAsB,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE5E,CAAC;;CAED,iBAAiB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,EAAE,CAAC;CACxE,iBAAiB,CAAC,SAAS,CAAC,WAAW,GAAG,iBAAiB,CAAC;;CAE5D;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA;;CAEA,SAAS,kBAAkB,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG;;CAEpD,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;;CAElC,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,IAAI,EAAE,IAAI;CACZ,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,wBAAwB,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;CACjF,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;;CAEtB,CAAC;;CAED,kBAAkB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CACnE,kBAAkB,CAAC,SAAS,CAAC,WAAW,GAAG,kBAAkB,CAAC;;CAE9D;;CAEA,SAAS,wBAAwB,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG;;CAE1D,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7B,CAAC,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;;CAExC,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,IAAI,EAAE,IAAI;CACZ,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,CAAC;;CAEH;;CAEA,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC;CAClB,CAAC,IAAI,QAAQ,GAAG,EAAE,CAAC;CACnB,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC;CAClB,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC;;CAEd,CAAC,IAAI,GAAG,GAAG,OAAO,CAAC;;CAEnB,CAAC,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE5B,CAAC,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,EAAE,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CAC5C,CAAC,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,EAAE,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE5C,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;;CAEV;;CAEA,CAAC,IAAI,UAAU,GAAG,MAAM,GAAG,CAAC,CAAC;;CAE7B,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,GAAG,GAAG;;CAElC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;;CAErB,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,GAAG,GAAG;;CAEnC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;;CAEtB;;CAEA,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;CACpB,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;;CAErC;;CAEA;;CAEA,GAAG,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG;;CAEvB,IAAI,IAAI,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;CAC3B,IAAI,EAAE,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;;CAE5B,IAAI,MAAM;;CAEV,IAAI,IAAI,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;CAC3B,IAAI,EAAE,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;;CAE5B,IAAI;;CAEJ,GAAG,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG;;CAEvB,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,EAAE,CAAC;CAC3B,IAAI,EAAE,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;;CAE5B,IAAI,MAAM;;CAEV,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,EAAE,CAAC;CAC3B,IAAI,EAAE,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;;CAE5B,IAAI;;CAEJ;;CAEA,GAAG,MAAM,CAAC,YAAY,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC;CAC7C,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAEhD;;CAEA,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEpB,GAAG;;CAEH,EAAE;;CAEF;;CAEA,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,GAAG;;CAEjC,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,GAAG;;CAElC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,GAAG,CAAC,CAAC;CAC9B,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;CAClC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;CAC1C,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,UAAU,GAAG,CAAC,CAAC;;CAEtC;;CAEA,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC3B,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE3B,GAAG;;CAEH,EAAE;;CAEF;;CAEA,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;CAC1B,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,sBAAsB,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;CAC5E,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,sBAAsB,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;CACzE,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,sBAAsB,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEjE,CAAC;;CAED,wBAAwB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,EAAE,CAAC;CAC/E,wBAAwB,CAAC,SAAS,CAAC,WAAW,GAAG,wBAAwB,CAAC;;CAE1E;CACA;CACA;CACA;CACA;CACA;;CAEA;;CAEA,SAAS,kBAAkB,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG;;CAEjE,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;;CAElC,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,QAAQ,EAAE,QAAQ;CACpB,EAAE,OAAO,EAAE,OAAO;CAClB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,wBAAwB,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;CAC9F,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;;CAEtB,CAAC;;CAED,kBAAkB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CACnE,kBAAkB,CAAC,SAAS,CAAC,WAAW,GAAG,kBAAkB,CAAC;;CAE9D;;CAEA,SAAS,wBAAwB,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG;;CAEvE,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7B,CAAC,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;;CAExC,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,QAAQ,EAAE,QAAQ;CACpB,EAAE,OAAO,EAAE,OAAO;CAClB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,CAAC;;CAEH,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC;CACtB,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC;;CAEtB;;CAEA,CAAC,IAAI,YAAY,GAAG,EAAE,CAAC;CACvB,CAAC,IAAI,QAAQ,GAAG,EAAE,CAAC;;CAEnB;;CAEA,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;;CAErB;;CAEA,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;;CAExB;;CAEA,CAAC,WAAW,EAAE,CAAC;;CAEf;;CAEA,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,sBAAsB,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;CAChF,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,sBAAsB,EAAE,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;CACtF,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,sBAAsB,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEtE,CAAC,KAAK,MAAM,KAAK,CAAC,GAAG;;CAErB,EAAE,IAAI,CAAC,oBAAoB,EAAE,CAAC;;CAE9B,EAAE,MAAM;;CAER,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC;;CAE1B,EAAE;;CAEF;;CAEA,CAAC,SAAS,SAAS,EAAE,MAAM,GAAG;;CAE9B,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;CACxB,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;CACxB,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;;CAExB;;CAEA,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG;;CAEhD;;CAEA,GAAG,gBAAgB,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;CAC3C,GAAG,gBAAgB,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;CAC3C,GAAG,gBAAgB,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;;CAE3C;;CAEA,GAAG,aAAa,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;;CAEpC,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,aAAa,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG;;CAE3C,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;;CAEnC;;CAEA,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;;CAEb,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;;CAEX;;CAEA,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,GAAG;;CAEjC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;;CAEf,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC;CAC1C,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC;;CAE1C,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;;CAEvB,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,GAAG;;CAElC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,GAAG;;CAEjC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;;CAEtB,KAAK,MAAM;;CAEX,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC;;CAEnD,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH;;CAEA,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,GAAG;;CAEhC,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEjD,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;;CAEhC,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG;;CAEvB,KAAK,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;CACnC,KAAK,UAAU,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;CACnC,KAAK,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE/B,KAAK,MAAM;;CAEX,KAAK,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;CACnC,KAAK,UAAU,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;CACvC,KAAK,UAAU,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEnC,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,YAAY,EAAE,MAAM,GAAG;;CAEjC,EAAE,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE7B;;CAEA,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG;;CAErD,GAAG,MAAM,CAAC,CAAC,GAAG,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;CACpC,GAAG,MAAM,CAAC,CAAC,GAAG,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;CACpC,GAAG,MAAM,CAAC,CAAC,GAAG,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;;CAEpC,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC;;CAE/C,GAAG,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;CACpC,GAAG,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;CACpC,GAAG,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;;CAEpC,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,WAAW,GAAG;;CAExB,EAAE,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE7B,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG;;CAErD,GAAG,MAAM,CAAC,CAAC,GAAG,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;CACpC,GAAG,MAAM,CAAC,CAAC,GAAG,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;CACpC,GAAG,MAAM,CAAC,CAAC,GAAG,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;;CAEpC,GAAG,IAAI,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC;CACjD,GAAG,IAAI,CAAC,GAAG,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC;CACjD,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;;CAE7B,GAAG;;CAEH,EAAE,UAAU,EAAE,CAAC;;CAEf,EAAE,WAAW,EAAE,CAAC;;CAEhB,EAAE;;CAEF,CAAC,SAAS,WAAW,GAAG;;CAExB;;CAEA,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG;;CAEjD;;CAEA,GAAG,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;CAC9B,GAAG,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;CAC9B,GAAG,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;;CAE9B,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;CACpC,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;;CAEpC;;CAEA,GAAG,KAAK,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG;;CAEjC,IAAI,KAAK,EAAE,GAAG,GAAG,GAAG,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;CAC3C,IAAI,KAAK,EAAE,GAAG,GAAG,GAAG,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;CAC3C,IAAI,KAAK,EAAE,GAAG,GAAG,GAAG,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;;CAE3C,IAAI;;CAEJ,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,UAAU,EAAE,MAAM,GAAG;;CAE/B,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAEpD,EAAE;;CAEF,CAAC,SAAS,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAAG;;CAE5C,EAAE,IAAI,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC;;CAEzB,EAAE,MAAM,CAAC,CAAC,GAAG,QAAQ,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;CACpC,EAAE,MAAM,CAAC,CAAC,GAAG,QAAQ,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;CACpC,EAAE,MAAM,CAAC,CAAC,GAAG,QAAQ,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;;CAEpC,EAAE;;CAEF,CAAC,SAAS,UAAU,GAAG;;CAEvB,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;CACxB,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;CACxB,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;;CAExB,EAAE,IAAI,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE/B,EAAE,IAAI,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC;CAC1B,EAAE,IAAI,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC;CAC1B,EAAE,IAAI,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE1B,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;;CAEpE,GAAG,CAAC,CAAC,GAAG,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;CAChF,GAAG,CAAC,CAAC,GAAG,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;CAChF,GAAG,CAAC,CAAC,GAAG,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;;CAEhF,GAAG,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;CACnD,GAAG,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;CACnD,GAAG,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;;CAEnD,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC;;CAE1D,GAAG,IAAI,GAAG,GAAG,OAAO,EAAE,QAAQ,EAAE,CAAC;;CAEjC,GAAG,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;CACnC,GAAG,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;CACnC,GAAG,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;;CAEnC,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG;;CAEnD,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG;;CAE3C,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;;CAEjC,GAAG;;CAEH,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,QAAQ,MAAM,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG;;CAElD,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC;;CAEpD,GAAG;;CAEH,EAAE;;CAEF;;CAEA,CAAC,SAAS,OAAO,EAAE,MAAM,GAAG;;CAE5B,EAAE,OAAO,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAE5C,EAAE;;;CAGF;;CAEA,CAAC,SAAS,WAAW,EAAE,MAAM,GAAG;;CAEhC,EAAE,OAAO,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;;CAElG,EAAE;;CAEF,CAAC;;CAED,wBAAwB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,EAAE,CAAC;CAC/E,wBAAwB,CAAC,SAAS,CAAC,WAAW,GAAG,wBAAwB,CAAC;;CAE1E;CACA;CACA;CACA;;CAEA;;CAEA,SAAS,mBAAmB,EAAE,MAAM,EAAE,MAAM,GAAG;;CAE/C,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;;CAEnC,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,yBAAyB,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;CAC5E,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;;CAEtB,CAAC;;CAED,mBAAmB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CACpE,mBAAmB,CAAC,SAAS,CAAC,WAAW,GAAG,mBAAmB,CAAC;;CAEhE;;CAEA,SAAS,yBAAyB,EAAE,MAAM,EAAE,MAAM,GAAG;;CAErD,CAAC,IAAI,QAAQ,GAAG;CAChB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;CACnD,EAAE,CAAC;;CAEH,CAAC,IAAI,OAAO,GAAG;CACf,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CACrC,EAAE,CAAC;;CAEH,CAAC,wBAAwB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;;CAE1E,CAAC,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;;CAEzC,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,CAAC;;CAEH,CAAC;;CAED,yBAAyB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,SAAS,EAAE,CAAC;CAC1F,yBAAyB,CAAC,SAAS,CAAC,WAAW,GAAG,yBAAyB,CAAC;;CAE5E;CACA;CACA;CACA;;CAEA;;CAEA,SAAS,kBAAkB,EAAE,MAAM,EAAE,MAAM,GAAG;;CAE9C,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;;CAElC,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,wBAAwB,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;CAC3E,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;;CAEtB,CAAC;;CAED,kBAAkB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CACnE,kBAAkB,CAAC,SAAS,CAAC,WAAW,GAAG,kBAAkB,CAAC;;CAE9D;;CAEA,SAAS,wBAAwB,EAAE,MAAM,EAAE,MAAM,GAAG;;CAEpD,CAAC,IAAI,QAAQ,GAAG;CAChB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC9B,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;CAChC,EAAE,CAAC;;CAEH,CAAC,IAAI,OAAO,GAAG;CACf,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC3B,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC3B,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAClB,EAAE,CAAC;;CAEH,CAAC,wBAAwB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;;CAE1E,CAAC,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;;CAExC,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,CAAC;;CAEH,CAAC;;CAED,wBAAwB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,SAAS,EAAE,CAAC;CACzF,wBAAwB,CAAC,SAAS,CAAC,WAAW,GAAG,wBAAwB,CAAC;;CAE1E;CACA;CACA;CACA;;CAEA;;CAEA,SAAS,mBAAmB,EAAE,MAAM,EAAE,MAAM,GAAG;;CAE/C,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;;CAEnC,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,yBAAyB,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;CAC5E,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;;CAEtB,CAAC;;CAED,mBAAmB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CACpE,mBAAmB,CAAC,SAAS,CAAC,WAAW,GAAG,mBAAmB,CAAC;;CAEhE;;CAEA,SAAS,yBAAyB,EAAE,MAAM,EAAE,MAAM,GAAG;;CAErD,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;;CAEpC,CAAC,IAAI,QAAQ,GAAG;CAChB,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;CAC/C,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;CAC/C,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAChD,EAAE,CAAC;;CAEH,CAAC,IAAI,OAAO,GAAG;CACf,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE;CACtD,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CACnD,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC/C,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CACjD,EAAE,CAAC;;CAEH,CAAC,wBAAwB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;;CAE1E,CAAC,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;;CAEzC,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,CAAC;;CAEH,CAAC;;CAED,yBAAyB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,SAAS,EAAE,CAAC;CAC1F,yBAAyB,CAAC,SAAS,CAAC,WAAW,GAAG,yBAAyB,CAAC;;CAE5E;CACA;CACA;CACA;;CAEA;;CAEA,SAAS,oBAAoB,EAAE,MAAM,EAAE,MAAM,GAAG;;CAEhD,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;;CAEpC,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,0BAA0B,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;CAC7E,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;;CAEtB,CAAC;;CAED,oBAAoB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CACrE,oBAAoB,CAAC,SAAS,CAAC,WAAW,GAAG,oBAAoB,CAAC;;CAElE;;CAEA,SAAS,0BAA0B,EAAE,MAAM,EAAE,MAAM,GAAG;;CAEtD,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;CACpC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;CAEf,CAAC,IAAI,QAAQ,GAAG;;CAEhB;CACA,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;CAC5B,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CACxB,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;CACxB,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEpB;CACA,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;CACzB,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAErB;CACA,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CACxB,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAErB;CACA,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;CACxB,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CACpB,EAAE,CAAC;;CAEH,CAAC,IAAI,OAAO,GAAG;CACf,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE;CACjC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;CACjC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;CAClC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;CAChC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE;CACjC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE;CACjC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;CACjC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;CAClC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;CAChC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;CAClC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;CACnC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;CAChC,EAAE,CAAC;;CAEH,CAAC,wBAAwB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;;CAE1E,CAAC,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;;CAE1C,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,CAAC;;CAEH,CAAC;;CAED,0BAA0B,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,SAAS,EAAE,CAAC;CAC3F,0BAA0B,CAAC,SAAS,CAAC,WAAW,GAAG,0BAA0B,CAAC;;CAE9E;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA;;CAEA,SAAS,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,GAAG;;CAEtF,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;;CAE5B,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,IAAI,EAAE,IAAI;CACZ,EAAE,eAAe,EAAE,eAAe;CAClC,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,cAAc,EAAE,cAAc;CAChC,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,CAAC;;CAEH,CAAC,KAAK,KAAK,KAAK,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,6CAA6C,EAAE,CAAC;;CAE1F,CAAC,IAAI,cAAc,GAAG,IAAI,kBAAkB,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC;;CAEtG;;CAEA,CAAC,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC;CACzC,CAAC,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC;CACvC,CAAC,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC;;CAE3C;;CAEA,CAAC,IAAI,CAAC,kBAAkB,EAAE,cAAc,EAAE,CAAC;CAC3C,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;;CAEtB,CAAC;;CAED,YAAY,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CAC7D,YAAY,CAAC,SAAS,CAAC,WAAW,GAAG,YAAY,CAAC;;CAElD;;CAEA,SAAS,kBAAkB,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG;;CAErF,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7B,CAAC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;;CAElC,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,IAAI,EAAE,IAAI;CACZ,EAAE,eAAe,EAAE,eAAe;CAClC,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,cAAc,EAAE,cAAc;CAChC,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,CAAC;;CAEH,CAAC,eAAe,GAAG,eAAe,IAAI,EAAE,CAAC;CACzC,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC;CACtB,CAAC,cAAc,GAAG,cAAc,IAAI,CAAC,CAAC;CACtC,CAAC,MAAM,GAAG,MAAM,IAAI,KAAK,CAAC;;CAE1B,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC,mBAAmB,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC;;CAElE;;CAEA,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;CACjC,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;CAC/B,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;;CAEnC;;CAEA,CAAC,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;CAC5B,CAAC,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;CAC5B,CAAC,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CACxB,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;;CAEV;;CAEA,CAAC,IAAI,QAAQ,GAAG,EAAE,CAAC;CACnB,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC;CAClB,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC;CACd,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC;;CAElB;;CAEA,CAAC,kBAAkB,EAAE,CAAC;;CAEtB;;CAEA,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;CAC1B,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,sBAAsB,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;CAC5E,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,sBAAsB,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;CACzE,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,sBAAsB,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEjE;;CAEA,CAAC,SAAS,kBAAkB,GAAG;;CAE/B,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC,GAAG,GAAG;;CAE3C,GAAG,eAAe,EAAE,CAAC,EAAE,CAAC;;CAExB,GAAG;;CAEH;CACA;CACA;CACA;;CAEA,EAAE,eAAe,EAAE,EAAE,MAAM,KAAK,KAAK,KAAK,eAAe,GAAG,CAAC,EAAE,CAAC;;CAEhE;CACA;;CAEA,EAAE,WAAW,EAAE,CAAC;;CAEhB;;CAEA,EAAE,eAAe,EAAE,CAAC;;CAEpB,EAAE;;CAEF,CAAC,SAAS,eAAe,EAAE,CAAC,GAAG;;CAE/B;;CAEA,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC,EAAE,CAAC;;CAEhD;;CAEA,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;CAC9B,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC;;CAEhC;;CAEA,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,cAAc,EAAE,CAAC,GAAG,GAAG;;CAE3C,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;;CAE5C,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;CAC3B,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;;CAE7B;;CAEA,GAAG,MAAM,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;CACxC,GAAG,MAAM,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;CACxC,GAAG,MAAM,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;CACxC,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;;CAEtB,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAEhD;;CAEA,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;CACtC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;CACtC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;;CAEtC,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAEjD,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,eAAe,GAAG;;CAE5B,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,eAAe,EAAE,CAAC,GAAG,GAAG;;CAE5C,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,cAAc,EAAE,CAAC,GAAG,GAAG;;CAE5C,IAAI,IAAI,CAAC,GAAG,EAAE,cAAc,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;CAC3D,IAAI,IAAI,CAAC,GAAG,EAAE,cAAc,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;CACnD,IAAI,IAAI,CAAC,GAAG,EAAE,cAAc,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;CAC3C,IAAI,IAAI,CAAC,GAAG,EAAE,cAAc,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;;CAEnD;;CAEA,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC5B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE5B,IAAI;;CAEJ,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,WAAW,GAAG;;CAExB,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,eAAe,EAAE,CAAC,GAAG,GAAG;;CAE5C,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,cAAc,EAAE,CAAC,GAAG,GAAG;;CAE5C,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC;CAC/B,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC;;CAE9B,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;;CAE3B,IAAI;;CAEJ,GAAG;;CAEH,EAAE;;CAEF,CAAC;;CAED,kBAAkB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,EAAE,CAAC;CACzE,kBAAkB,CAAC,SAAS,CAAC,WAAW,GAAG,kBAAkB,CAAC;;CAE9D;CACA;CACA;CACA;CACA;CACA;;CAEA;;CAEA,SAAS,iBAAiB,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,GAAG;;CAE/F,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;;CAEjC,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,IAAI,EAAE,IAAI;CACZ,EAAE,eAAe,EAAE,eAAe;CAClC,EAAE,cAAc,EAAE,cAAc;CAChC,EAAE,CAAC,EAAE,CAAC;CACN,EAAE,CAAC,EAAE,CAAC;CACN,EAAE,CAAC;;CAEH,CAAC,KAAK,WAAW,KAAK,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,0FAA0F,EAAE,CAAC;;CAE7I,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,uBAAuB,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;CAC/G,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;;CAEtB,CAAC;;CAED,iBAAiB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CAClE,iBAAiB,CAAC,SAAS,CAAC,WAAW,GAAG,iBAAiB,CAAC;;CAE5D;;CAEA,SAAS,uBAAuB,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,GAAG;;CAExF,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7B,CAAC,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;;CAEvC,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,IAAI,EAAE,IAAI;CACZ,EAAE,eAAe,EAAE,eAAe;CAClC,EAAE,cAAc,EAAE,cAAc;CAChC,EAAE,CAAC,EAAE,CAAC;CACN,EAAE,CAAC,EAAE,CAAC;CACN,EAAE,CAAC;;CAEH,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC;CACtB,CAAC,IAAI,GAAG,IAAI,IAAI,GAAG,CAAC;CACpB,CAAC,eAAe,GAAG,IAAI,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;CACvD,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;CACpD,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;CACZ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;;CAEZ;;CAEA,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC;CAClB,CAAC,IAAI,QAAQ,GAAG,EAAE,CAAC;CACnB,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC;CAClB,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC;;CAEd;;CAEA,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;;CAEV,CAAC,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;CAC5B,CAAC,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE5B,CAAC,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CACxB,CAAC,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAExB,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;CACvB,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;CACvB,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEvB;;CAEA,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,eAAe,EAAE,GAAG,CAAC,GAAG;;CAE3C;;CAEA,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,eAAe,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;;CAEhD;CACA;;CAEA,EAAE,wBAAwB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;CAClD,EAAE,wBAAwB,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;CAEzD;;CAEA,EAAE,CAAC,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;CACzB,EAAE,CAAC,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;CACzB,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CACzB,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEzB;;CAEA,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;CAChB,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;;CAEhB,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,cAAc,EAAE,GAAG,CAAC,GAAG;;CAE3C;CACA;;CAEA,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;CAC5C,GAAG,IAAI,EAAE,GAAG,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;CACnC,GAAG,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;;CAEjC;CACA;;CAEA,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;CAC7C,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;CAC7C,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;;CAE7C,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAEjD;;CAEA,GAAG,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC;;CAE/C,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAEhD;;CAEA,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC;CACnC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC;;CAElC,GAAG;;CAEH,EAAE;;CAEF;;CAEA,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,eAAe,EAAE,CAAC,GAAG,GAAG;;CAE3C,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,cAAc,EAAE,CAAC,GAAG,GAAG;;CAE3C;;CAEA,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;CAC1D,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;CAClD,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;CAC1C,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;;CAElD;;CAEA,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC3B,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE3B,GAAG;;CAEH,EAAE;;CAEF;;CAEA,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;CAC1B,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,sBAAsB,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;CAC5E,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,sBAAsB,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;CACzE,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,sBAAsB,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEjE;;CAEA,CAAC,SAAS,wBAAwB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,GAAG;;CAEhE,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;CACzB,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;CACzB,EAAE,IAAI,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAC1B,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;;CAE/B,EAAE,QAAQ,CAAC,CAAC,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;CAC9C,EAAE,QAAQ,CAAC,CAAC,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;CAC9C,EAAE,QAAQ,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;;CAElD,EAAE;;CAEF,CAAC;;CAED,uBAAuB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,EAAE,CAAC;CAC9E,uBAAuB,CAAC,SAAS,CAAC,WAAW,GAAG,uBAAuB,CAAC;;CAExE;CACA;CACA;CACA;CACA;;CAEA;;CAEA,SAAS,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,eAAe,EAAE,GAAG,GAAG;;CAE7E,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;;CAE7B,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,IAAI,EAAE,IAAI;CACZ,EAAE,cAAc,EAAE,cAAc;CAChC,EAAE,eAAe,EAAE,eAAe;CAClC,EAAE,GAAG,EAAE,GAAG;CACV,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,mBAAmB,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE,CAAC;CAC1G,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;;CAEtB,CAAC;;CAED,aAAa,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CAC9D,aAAa,CAAC,SAAS,CAAC,WAAW,GAAG,aAAa,CAAC;;CAEpD;;CAEA,SAAS,mBAAmB,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,eAAe,EAAE,GAAG,GAAG;;CAEnF,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7B,CAAC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;;CAEnC,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,IAAI,EAAE,IAAI;CACZ,EAAE,cAAc,EAAE,cAAc;CAChC,EAAE,eAAe,EAAE,eAAe;CAClC,EAAE,GAAG,EAAE,GAAG;CACV,EAAE,CAAC;;CAEH,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC;CACtB,CAAC,IAAI,GAAG,IAAI,IAAI,GAAG,CAAC;CACpB,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;CACpD,CAAC,eAAe,GAAG,IAAI,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;CACtD,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;;CAE1B;;CAEA,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC;CAClB,CAAC,IAAI,QAAQ,GAAG,EAAE,CAAC;CACnB,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC;CAClB,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC;;CAEd;;CAEA,CAAC,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;CAC5B,CAAC,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;CAC5B,CAAC,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE5B,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;;CAEV;;CAEA,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,cAAc,EAAE,CAAC,GAAG,GAAG;;CAE1C,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,eAAe,EAAE,CAAC,GAAG,GAAG;;CAE5C,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,eAAe,GAAG,GAAG,CAAC;CACrC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;;CAE5C;;CAEA,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;CAChE,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;CAChE,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;;CAEnC,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAEjD;;CAEA,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;CACrC,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;CACrC,GAAG,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,SAAS,EAAE,CAAC;;CAEnD,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAEhD;;CAEA,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC;CACnC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC;;CAElC,GAAG;;CAEH,EAAE;;CAEF;;CAEA,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,cAAc,EAAE,CAAC,GAAG,GAAG;;CAE1C,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,eAAe,EAAE,CAAC,GAAG,GAAG;;CAE5C;;CAEA,GAAG,IAAI,CAAC,GAAG,EAAE,eAAe,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAC/C,GAAG,IAAI,CAAC,GAAG,EAAE,eAAe,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;CACvD,GAAG,IAAI,CAAC,GAAG,EAAE,eAAe,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;CACnD,GAAG,IAAI,CAAC,GAAG,EAAE,eAAe,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;;CAE3C;;CAEA,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC3B,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE3B,GAAG;;CAEH,EAAE;;CAEF;;CAEA,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;CAC1B,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,sBAAsB,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;CAC5E,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,sBAAsB,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;CACzE,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,sBAAsB,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEjE,CAAC;;CAED,mBAAmB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,EAAE,CAAC;CAC1E,mBAAmB,CAAC,SAAS,CAAC,WAAW,GAAG,mBAAmB,CAAC;;CAEhE;CACA;CACA;CACA;;CAEA,IAAI,MAAM,GAAG;;CAEb,CAAC,WAAW,EAAE,WAAW,IAAI,EAAE,WAAW,EAAE,GAAG,GAAG;;CAElD,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC;;CAEjB,EAAE,IAAI,QAAQ,GAAG,WAAW,IAAI,WAAW,CAAC,MAAM;CAClD,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM;CAC7D,GAAG,SAAS,GAAG,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE;CACzD,GAAG,SAAS,GAAG,EAAE,CAAC;;CAElB,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,SAAS,CAAC;;CAEtC,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC;;CAE5C,EAAE,KAAK,QAAQ,GAAG,SAAS,GAAG,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;;CAElF;;CAEA,EAAE,KAAK,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,GAAG,GAAG;;CAEhC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;CAC3B,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;;CAE3B,GAAG,MAAM,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,IAAI,GAAG,GAAG;;CAE/C,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;CAClB,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;CACtB,IAAI,KAAK,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;CAC7B,IAAI,KAAK,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;CAC7B,IAAI,KAAK,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;CAC7B,IAAI,KAAK,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;;CAE7B,IAAI;;CAEJ;;CAEA,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,CAAC;CAClD,GAAG,OAAO,GAAG,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;;CAE7C,GAAG;;CAEH,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;;CAEjE,EAAE,OAAO,SAAS,CAAC;;CAEnB,EAAE;;CAEF,CAAC,CAAC;;CAEF;;CAEA,SAAS,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,GAAG;;CAExD,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;;CAEb,CAAC,KAAK,SAAS,OAAO,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG;;CAElE,EAAE,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG,IAAI,GAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC;;CAE9F,EAAE,MAAM;;CAER,EAAE,MAAM,CAAC,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,GAAG,GAAG,IAAI,GAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC;;CAErG,EAAE;;CAEF,CAAC,KAAK,IAAI,IAAI,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG;;CAE1C,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;CACrB,EAAE,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;;CAEnB,EAAE;;CAEF,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC;;CAED;;CAEA,SAAS,YAAY,EAAE,KAAK,EAAE,GAAG,GAAG;;CAEpC,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,KAAK,CAAC;CAC7B,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC;;CAE1B,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC;;CAEtB,CAAC,GAAG;;CAEJ,EAAE,KAAK,GAAG,KAAK,CAAC;;CAEhB,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,MAAM,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,GAAG;;CAEnF,GAAG,UAAU,EAAE,CAAC,EAAE,CAAC;CACnB,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC;CACpB,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,MAAM;CAC7B,GAAG,KAAK,GAAG,IAAI,CAAC;;CAEhB,GAAG,MAAM;;CAET,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;;CAEd,GAAG;;CAEH,EAAE,SAAS,KAAK,IAAI,CAAC,KAAK,GAAG,GAAG;;CAEhC,CAAC,OAAO,GAAG,CAAC;;CAEZ,CAAC;;CAED;;CAEA,SAAS,YAAY,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,GAAG;;CAExE,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO;;CAErB;;CAEA,CAAC,KAAK,EAAE,IAAI,IAAI,OAAO,GAAG,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;;CAEjE,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC;;CAE5B;;CAEA,CAAC,QAAQ,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,GAAG;;CAEjC,EAAE,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;CAClB,EAAE,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;;CAElB,EAAE,KAAK,OAAO,GAAG,WAAW,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,GAAG;;CAE1E;CACA,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;CAClC,GAAG,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;CACjC,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;;CAElC,GAAG,UAAU,EAAE,GAAG,EAAE,CAAC;;CAErB;CACA,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC;CACnB,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;;CAEpB,GAAG,SAAS;;CAEZ,GAAG;;CAEH,EAAE,GAAG,GAAG,IAAI,CAAC;;CAEb;;CAEA,EAAE,KAAK,GAAG,KAAK,IAAI,GAAG;;CAEtB;;CAEA,GAAG,KAAK,EAAE,IAAI,GAAG;;CAEjB,IAAI,YAAY,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;CAEhF;;CAEA,IAAI,MAAM,KAAK,IAAI,KAAK,CAAC,GAAG;;CAE5B,IAAI,GAAG,GAAG,sBAAsB,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;CACxD,IAAI,YAAY,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;CAEhE;;CAEA,IAAI,MAAM,KAAK,IAAI,KAAK,CAAC,GAAG;;CAE5B,IAAI,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;;CAE5D,IAAI;;CAEJ,GAAG,MAAM;;CAET,GAAG;;CAEH,EAAE;;CAEF,CAAC;;CAED;;CAEA,SAAS,KAAK,EAAE,GAAG,GAAG;;CAEtB,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI;CACjB,EAAE,CAAC,GAAG,GAAG;CACT,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;;CAEf,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,OAAO,KAAK,CAAC;;CAE1C;CACA,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;;CAEvB,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG;;CAE1B,EAAE,KAAK,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG;;CAErG,GAAG,OAAO,KAAK,CAAC;;CAEhB,GAAG;;CAEH,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;;CAEb,EAAE;;CAEF,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC;;CAED,SAAS,WAAW,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,GAAG;;CAEjD,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI;CACjB,EAAE,CAAC,GAAG,GAAG;CACT,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;;CAEf,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,OAAO,KAAK,CAAC;;CAE1C;;CAEA,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;CAC9E,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;CAC3E,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;CAC3E,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;;CAE5E;;CAEA,CAAC,IAAI,IAAI,GAAG,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE;CACvD,EAAE,IAAI,GAAG,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;;CAErD;;CAEA,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;;CAEnB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG;;CAE5B,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI;CACvC,IAAI,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;CAC7D,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,OAAO,KAAK,CAAC;CAClD,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;;CAEd,EAAE;;CAEF;;CAEA,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;;CAEf,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG;;CAE5B,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI;CACvC,IAAI,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;CAC7D,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,OAAO,KAAK,CAAC;;CAElD,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;;CAEd,EAAE;;CAEF,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC;;CAED;;CAEA,SAAS,sBAAsB,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,GAAG;;CAEzD,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;;CAEf,CAAC,GAAG;;CAEJ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;CAElC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,aAAa,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,aAAa,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG;;CAE7G,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;CAC/B,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;CAC/B,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;;CAE/B;;CAEA,GAAG,UAAU,EAAE,CAAC,EAAE,CAAC;CACnB,GAAG,UAAU,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;;CAExB,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;;CAEjB,GAAG;;CAEH,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;;CAEb,EAAE,SAAS,CAAC,KAAK,KAAK,GAAG;;CAEzB,CAAC,OAAO,CAAC,CAAC;;CAEV,CAAC;;CAED;;CAEA,SAAS,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,GAAG;;CAEnE;;CAEA,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;;CAEf,CAAC,GAAG;;CAEJ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;CAEtB,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG;;CAEzB,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,eAAe,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG;;CAEjD;;CAEA,IAAI,IAAI,CAAC,GAAG,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEjC;;CAEA,IAAI,CAAC,GAAG,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;CAClC,IAAI,CAAC,GAAG,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;;CAElC;;CAEA,IAAI,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;CAC3D,IAAI,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;CAC3D,IAAI,OAAO;;CAEX,IAAI;;CAEJ,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;;CAEd,GAAG;;CAEH,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;;CAEb,EAAE,SAAS,CAAC,KAAK,KAAK,GAAG;;CAEzB,CAAC;;CAED;;CAEA,SAAS,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,GAAG;;CAE7D,CAAC,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC;;CAE1C,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG;;CAExD,EAAE,KAAK,GAAG,WAAW,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC;CACjC,EAAE,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;CAC/D,EAAE,IAAI,GAAG,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;CACpD,EAAE,KAAK,IAAI,KAAK,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;CAChD,EAAE,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC;;CAEpC,EAAE;;CAEF,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;;CAExB;;CAEA,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAEvC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC;CACzC,EAAE,SAAS,GAAG,YAAY,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;;CAExD,EAAE;;CAEF,CAAC,OAAO,SAAS,CAAC;;CAElB,CAAC;;CAED,SAAS,QAAQ,EAAE,CAAC,EAAE,CAAC,GAAG;;CAE1B,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;CAElB,CAAC;;CAED;;CAEA,SAAS,aAAa,EAAE,IAAI,EAAE,SAAS,GAAG;;CAE1C,CAAC,SAAS,GAAG,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;CAE/C,CAAC,KAAK,SAAS,GAAG;;CAElB,EAAE,IAAI,CAAC,GAAG,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;;CAE1C,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;;CAE5B,EAAE;;CAEF,CAAC;;CAED;;CAEA,SAAS,cAAc,EAAE,IAAI,EAAE,SAAS,GAAG;;CAE3C,CAAC,IAAI,CAAC,GAAG,SAAS;CAClB,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;CACb,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;CACb,EAAE,EAAE,GAAG,EAAE,QAAQ;CACjB,EAAE,CAAC,CAAC;;CAEJ;CACA;;CAEA,CAAC,GAAG;;CAEJ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG;;CAEzD,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;;CAExE,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG;;CAE5B,IAAI,EAAE,GAAG,CAAC,CAAC;;CAEX,IAAI,KAAK,CAAC,KAAK,EAAE,GAAG;;CAEpB,KAAK,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;CAChC,KAAK,KAAK,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC;;CAE1C,KAAK;;CAEL,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;;CAEpC,IAAI;;CAEJ,GAAG;;CAEH,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;;CAEb,EAAE,SAAS,CAAC,KAAK,SAAS,GAAG;;CAE7B,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,IAAI,CAAC;;CAExB,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC;;CAEhC;CACA;CACA;;CAEA,CAAC,IAAI,IAAI,GAAG,CAAC;CACb,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;CACV,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;CACV,EAAE,MAAM,GAAG,QAAQ;CACnB,EAAE,GAAG,CAAC;;CAEN,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;;CAEZ,CAAC,QAAQ,CAAC,KAAK,IAAI,GAAG;;CAEtB,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;CAC3C,MAAM,eAAe,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG;;CAE1F,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;;CAE7C,GAAG,KAAK,EAAE,GAAG,GAAG,MAAM,MAAM,GAAG,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG;;CAE1F,IAAI,CAAC,GAAG,CAAC,CAAC;CACV,IAAI,MAAM,GAAG,GAAG,CAAC;;CAEjB,IAAI;;CAEJ,GAAG;;CAEH,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;;CAEb,EAAE;;CAEF,CAAC,OAAO,CAAC,CAAC;;CAEV,CAAC;;CAED;;CAEA,SAAS,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,GAAG;;CAElD,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;;CAEf,CAAC,GAAG;;CAEJ,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;CACpE,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;CACnB,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;CACnB,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;;CAEb,EAAE,SAAS,CAAC,KAAK,KAAK,GAAG;;CAEzB,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;CACtB,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC;;CAEhB,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;;CAEjB,CAAC;;CAED;CACA;;CAEA,SAAS,UAAU,EAAE,IAAI,GAAG;;CAE5B,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC;;CAE3D,CAAC,GAAG;;CAEJ,EAAE,CAAC,GAAG,IAAI,CAAC;CACX,EAAE,IAAI,GAAG,IAAI,CAAC;CACd,EAAE,IAAI,GAAG,IAAI,CAAC;CACd,EAAE,SAAS,GAAG,CAAC,CAAC;;CAEhB,EAAE,QAAQ,CAAC,GAAG;;CAEd,GAAG,SAAS,GAAG,CAAC;CAChB,GAAG,CAAC,GAAG,CAAC,CAAC;CACT,GAAG,KAAK,GAAG,CAAC,CAAC;;CAEb,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,GAAG;;CAEnC,IAAI,KAAK,GAAG,CAAC;CACb,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;CAChB,IAAI,KAAK,EAAE,CAAC,GAAG,MAAM;;CAErB,IAAI;;CAEJ,GAAG,KAAK,GAAG,MAAM,CAAC;;CAElB,GAAG,QAAQ,KAAK,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG;;CAE7C,IAAI,KAAK,KAAK,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG;;CAE/D,KAAK,CAAC,GAAG,CAAC,CAAC;CACX,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;CACjB,KAAK,KAAK,GAAG,CAAC;;CAEd,KAAK,MAAM;;CAEX,KAAK,CAAC,GAAG,CAAC,CAAC;CACX,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;CACjB,KAAK,KAAK,GAAG,CAAC;;CAEd,KAAK;;CAEL,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;CAC/B,SAAS,IAAI,GAAG,CAAC,CAAC;;CAElB,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC;CACnB,IAAI,IAAI,GAAG,CAAC,CAAC;;CAEb,IAAI;;CAEJ,GAAG,CAAC,GAAG,CAAC,CAAC;;CAET,GAAG;;CAEH,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;CACpB,EAAE,MAAM,IAAI,CAAC,CAAC;;CAEd,EAAE,SAAS,SAAS,GAAG,CAAC,GAAG;;CAE3B,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC;;CAED;;CAEA,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,GAAG;;CAE7C;;CAEA,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;CACpC,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;;CAEpC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,UAAU,CAAC;CACrC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,UAAU,CAAC;CACrC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,UAAU,CAAC;CACrC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,UAAU,CAAC;;CAErC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,UAAU,CAAC;CACrC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,UAAU,CAAC;CACrC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,UAAU,CAAC;CACrC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,UAAU,CAAC;;CAErC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;;CAEvB,CAAC;;CAED;;CAEA,SAAS,WAAW,EAAE,KAAK,GAAG;;CAE9B,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE,QAAQ,GAAG,KAAK,CAAC;;CAEjC,CAAC,GAAG;;CAEJ,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;CACvC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;;CAEb,EAAE,SAAS,CAAC,KAAK,KAAK,GAAG;;CAEzB,CAAC,OAAO,QAAQ,CAAC;;CAEjB,CAAC;;CAED;;CAEA,SAAS,eAAe,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG;;CAE3D,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC;CAClE,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC;CAC5D,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;;CAE7D,CAAC;;CAED;;CAEA,SAAS,eAAe,EAAE,CAAC,EAAE,CAAC,GAAG;;CAEjC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE;CAC3E,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,aAAa,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEzE,CAAC;;CAED;;CAEA,SAAS,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;CAEzB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;;CAEtE,CAAC;;CAED;;CAEA,SAAS,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG;;CAE1B,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;;CAEvC,CAAC;;CAED;;CAEA,SAAS,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG;;CAEtC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE;CAC5C,KAAK,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,IAAI,CAAC;;CAE1D,CAAC,OAAO,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;CACzD,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;;CAEvD,CAAC;;CAED;;CAEA,SAAS,iBAAiB,EAAE,CAAC,EAAE,CAAC,GAAG;;CAEnC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;;CAEX,CAAC,GAAG;;CAEJ,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;CACzE,MAAM,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG;;CAEtC,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG;;CAEH,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;;CAEb,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG;;CAErB,CAAC,OAAO,KAAK,CAAC;;CAEd,CAAC;;CAED;;CAEA,SAAS,aAAa,EAAE,CAAC,EAAE,CAAC,GAAG;;CAE/B,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC;CACrC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC;CACxD,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;;CAEvD,CAAC;;CAED;;CAEA,SAAS,YAAY,EAAE,CAAC,EAAE,CAAC,GAAG;;CAE9B,CAAC,IAAI,CAAC,GAAG,CAAC;CACV,EAAE,MAAM,GAAG,KAAK;CAChB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;CACxB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;;CAEzB,CAAC,GAAG;;CAEJ,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;CACjE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG;;CAE9E,GAAG,MAAM,GAAG,EAAE,MAAM,CAAC;;CAErB,GAAG;;CAEH,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;;CAEb,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG;;CAErB,CAAC,OAAO,MAAM,CAAC;;CAEf,CAAC;;CAED;CACA;;CAEA,SAAS,YAAY,EAAE,CAAC,EAAE,CAAC,GAAG;;CAE9B,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;CACnC,EAAE,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;CAChC,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI;CACb,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC;;CAEd,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;CACZ,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;;CAEZ,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;CACd,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;;CAEd,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;CACd,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;;CAEd,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;CACd,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;;CAEd,CAAC,OAAO,EAAE,CAAC;;CAEX,CAAC;;CAED;;CAEA,SAAS,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,GAAG;;CAErC,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE7B,CAAC,KAAK,EAAE,IAAI,GAAG;;CAEf,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;CACb,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;;CAEb,EAAE,MAAM;;CAER,EAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;CACrB,EAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;CAChB,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;CACrB,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;;CAEhB,EAAE;;CAEF,CAAC,OAAO,CAAC,CAAC;;CAEV,CAAC;;CAED,SAAS,UAAU,EAAE,CAAC,GAAG;;CAEzB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;CACtB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;;CAEtB,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;CACxC,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;;CAExC,CAAC;;CAED,SAAS,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;CAEzB;CACA,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;;CAEZ;CACA,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;CACZ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;;CAEZ;CACA,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;CAClB,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;;CAElB;CACA,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;;CAEf;CACA,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;CACnB,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;;CAEnB;CACA,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;;CAEtB,CAAC;;CAED,SAAS,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,GAAG;;CAE7C,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;;CAEb,CAAC,MAAM,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG;;CAEzD,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;CACvE,EAAE,CAAC,GAAG,CAAC,CAAC;;CAER,EAAE;;CAEF,CAAC,OAAO,GAAG,CAAC;;CAEZ,CAAC;;CAED;CACA;CACA;;CAEA,IAAI,UAAU,GAAG;;CAEjB;;CAEA,CAAC,IAAI,EAAE,WAAW,OAAO,GAAG;;CAE5B,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;CACzB,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC;;CAEd,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,GAAG;;CAEhD,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;;CAE1E,GAAG;;CAEH,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC;;CAEjB,EAAE;;CAEF,CAAC,WAAW,EAAE,WAAW,GAAG,GAAG;;CAE/B,EAAE,OAAO,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;;CAEpC,EAAE;;CAEF,CAAC,gBAAgB,EAAE,WAAW,OAAO,EAAE,KAAK,GAAG;;CAE/C,EAAE,IAAI,QAAQ,GAAG,EAAE,CAAC;CACpB,EAAE,IAAI,WAAW,GAAG,EAAE,CAAC;CACvB,EAAE,IAAI,KAAK,GAAG,EAAE,CAAC;;CAEjB,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC;CAC7B,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;;CAElC;;CAEA,EAAE,IAAI,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;;CAEjC,EAAE,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC;;CAEnC,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAE5C,GAAG,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;CACjC,GAAG,SAAS,IAAI,KAAK,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC;CAClC,GAAG,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEtC,GAAG;;CAEH;;CAEA,EAAE,IAAI,SAAS,GAAG,MAAM,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;;CAE9D;;CAEA,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG;;CAElD,GAAG,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;;CAE7C,GAAG;;CAEH,EAAE,OAAO,KAAK,CAAC;;CAEf,EAAE;;CAEF,CAAC,CAAC;;CAEF,SAAS,eAAe,EAAE,MAAM,GAAG;;CAEnC,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;;CAEvB,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG;;CAEvD,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;;CAEf,EAAE;;CAEF,CAAC;;CAED,SAAS,UAAU,EAAE,QAAQ,EAAE,OAAO,GAAG;;CAEzC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAE7C,EAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;CAClC,EAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;;CAElC,EAAE;;CAEF,CAAC;;CAED;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA;;CAEA,SAAS,eAAe,EAAE,MAAM,EAAE,OAAO,GAAG;;CAE5C,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;;CAE/B,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,OAAO,EAAE,OAAO;CAClB,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,qBAAqB,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;CACzE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;;CAEtB,CAAC;;CAED,eAAe,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CAChE,eAAe,CAAC,SAAS,CAAC,WAAW,GAAG,eAAe,CAAC;;CAExD;;CAEA,SAAS,qBAAqB,EAAE,MAAM,EAAE,OAAO,GAAG;;CAElD,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7B,CAAC,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;;CAErC,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,OAAO,EAAE,OAAO;CAClB,EAAE,CAAC;;CAEH,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,EAAE,MAAM,EAAE,CAAC;;CAExD,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC;;CAElB,CAAC,IAAI,aAAa,GAAG,EAAE,CAAC;CACxB,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC;;CAElB,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEnD,EAAE,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC;CAC1B,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;;CAE7B,EAAE;;CAEF;;CAEA,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,sBAAsB,EAAE,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;CACjF,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,sBAAsB,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;;CAErE,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;;CAE7B;;CAEA,CAAC,SAAS,QAAQ,EAAE,KAAK,GAAG;;CAE5B,EAAE,IAAI,WAAW,GAAG,EAAE,CAAC;;CAEvB;;CAEA,EAAE,IAAI,aAAa,GAAG,OAAO,CAAC,aAAa,KAAK,SAAS,GAAG,OAAO,CAAC,aAAa,GAAG,EAAE,CAAC;CACvF,EAAE,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,KAAK,SAAS,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;CAC9D,EAAE,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC;;CAEnE,EAAE,IAAI,YAAY,GAAG,OAAO,CAAC,YAAY,KAAK,SAAS,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;CACtF,EAAE,IAAI,cAAc,GAAG,OAAO,CAAC,cAAc,KAAK,SAAS,GAAG,OAAO,CAAC,cAAc,GAAG,CAAC,CAAC;CACzF,EAAE,IAAI,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,SAAS,GAAG,OAAO,CAAC,SAAS,GAAG,cAAc,GAAG,CAAC,CAAC;CAC3F,EAAE,IAAI,aAAa,GAAG,OAAO,CAAC,aAAa,KAAK,SAAS,GAAG,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC;;CAEtF,EAAE,IAAI,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;;CAExC,EAAE,IAAI,KAAK,GAAG,OAAO,CAAC,WAAW,KAAK,SAAS,GAAG,OAAO,CAAC,WAAW,GAAG,gBAAgB,CAAC;;CAEzF;;CAEA,EAAE,IAAI,UAAU,EAAE,aAAa,GAAG,KAAK,CAAC;CACxC,EAAE,IAAI,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC;;CAE9C,EAAE,KAAK,WAAW,GAAG;;CAErB,GAAG,UAAU,GAAG,WAAW,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC;;CAErD,GAAG,aAAa,GAAG,IAAI,CAAC;CACxB,GAAG,YAAY,GAAG,KAAK,CAAC;;CAExB;;CAEA;;CAEA,GAAG,UAAU,GAAG,WAAW,CAAC,mBAAmB,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;;CAEhE;;CAEA,GAAG,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;CAC5B,GAAG,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;CAC1B,GAAG,SAAS,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE7B,GAAG;;CAEH;;CAEA,EAAE,KAAK,EAAE,YAAY,GAAG;;CAExB,GAAG,aAAa,GAAG,CAAC,CAAC;CACrB,GAAG,cAAc,GAAG,CAAC,CAAC;CACtB,GAAG,SAAS,GAAG,CAAC,CAAC;;CAEjB,GAAG;;CAEH;;CAEA,EAAE,IAAI,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEnB,EAAE,IAAI,WAAW,GAAG,KAAK,CAAC,aAAa,EAAE,aAAa,EAAE,CAAC;;CAEzD,EAAE,IAAI,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC;CACnC,EAAE,IAAI,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;;CAEhC,EAAE,IAAI,OAAO,GAAG,EAAE,UAAU,CAAC,WAAW,EAAE,QAAQ,EAAE,CAAC;;CAErD,EAAE,KAAK,OAAO,GAAG;;CAEjB,GAAG,QAAQ,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;;CAEjC;;CAEA,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAElD,IAAI,KAAK,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;;CAEvB,IAAI,KAAK,UAAU,CAAC,WAAW,EAAE,KAAK,EAAE,GAAG;;CAE3C,KAAK,KAAK,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;;CAElC,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;;CAGH,EAAE,IAAI,KAAK,GAAG,UAAU,CAAC,gBAAgB,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;;CAE7D;;CAEA,EAAE,IAAI,OAAO,GAAG,QAAQ,CAAC;;CAEzB,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEjD,GAAG,KAAK,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;;CAEtB,GAAG,QAAQ,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;;CAEvC,GAAG;;;CAGH,EAAE,SAAS,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,GAAG;;CAErC,GAAG,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,KAAK,EAAE,2CAA2C,EAAE,CAAC;;CAE7E,GAAG,OAAO,GAAG,CAAC,KAAK,EAAE,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC;;CAEvD,GAAG;;CAEH,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;CACjB,GAAG,IAAI,EAAE,IAAI,GAAG,QAAQ,CAAC,MAAM;CAC/B,GAAG,IAAI,EAAE,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;;;CAG7B;;;CAGA,EAAE,SAAS,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG;;CAE/C;CACA;CACA;CACA;CACA;CACA;;CAEA,GAAG,IAAI,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;;CAEvC;CACA;;CAEA,GAAG,IAAI,QAAQ,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;CACnC,IAAI,QAAQ,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;CACjC,GAAG,IAAI,QAAQ,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;CACnC,IAAI,QAAQ,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;;CAEjC,GAAG,IAAI,YAAY,KAAK,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EAAE,CAAC;;CAEpE;CACA,GAAG,IAAI,UAAU,KAAK,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EAAE,CAAC;;CAElE,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,OAAO,GAAG;;CAElD;;CAEA;;CAEA,IAAI,IAAI,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC;CAC/C,IAAI,IAAI,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EAAE,CAAC;;CAE5E;;CAEA,IAAI,IAAI,aAAa,KAAK,MAAM,CAAC,CAAC,GAAG,QAAQ,GAAG,UAAU,EAAE,CAAC;CAC7D,IAAI,IAAI,aAAa,KAAK,MAAM,CAAC,CAAC,GAAG,QAAQ,GAAG,UAAU,EAAE,CAAC;;CAE7D,IAAI,IAAI,aAAa,KAAK,MAAM,CAAC,CAAC,GAAG,QAAQ,GAAG,UAAU,EAAE,CAAC;CAC7D,IAAI,IAAI,aAAa,KAAK,MAAM,CAAC,CAAC,GAAG,QAAQ,GAAG,UAAU,EAAE,CAAC;;CAE7D;;CAEA,IAAI,IAAI,EAAE,GAAG,EAAE,EAAE,aAAa,GAAG,aAAa,KAAK,QAAQ;CAC3D,MAAM,EAAE,aAAa,GAAG,aAAa,KAAK,QAAQ;CAClD,OAAO,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EAAE,CAAC;;CAEnD;;CAEA,IAAI,SAAS,KAAK,aAAa,GAAG,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC;CAC3D,IAAI,SAAS,KAAK,aAAa,GAAG,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC;;CAE3D;CACA;CACA,IAAI,IAAI,aAAa,KAAK,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,EAAE,CAAC;CAC1E,IAAI,KAAK,aAAa,IAAI,CAAC,GAAG;;CAE9B,KAAK,OAAO,IAAI,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;;CAEhD,KAAK,MAAM;;CAEX,KAAK,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,aAAa,GAAG,CAAC,EAAE,CAAC;;CAEhD,KAAK;;CAEL,IAAI,MAAM;;CAEV;;CAEA,IAAI,IAAI,YAAY,GAAG,KAAK,CAAC;CAC7B,IAAI,KAAK,QAAQ,GAAG,MAAM,CAAC,OAAO,GAAG;;CAErC,KAAK,KAAK,QAAQ,GAAG,MAAM,CAAC,OAAO,GAAG;;CAEtC,MAAM,YAAY,GAAG,IAAI,CAAC;;CAE1B,MAAM;;CAEN,KAAK,MAAM;;CAEX,KAAK,KAAK,QAAQ,GAAG,EAAE,MAAM,CAAC,OAAO,GAAG;;CAExC,MAAM,KAAK,QAAQ,GAAG,EAAE,MAAM,CAAC,OAAO,GAAG;;CAEzC,OAAO,YAAY,GAAG,IAAI,CAAC;;CAE3B,OAAO;;CAEP,MAAM,MAAM;;CAEZ,MAAM,KAAK,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG;;CAE7D,OAAO,YAAY,GAAG,IAAI,CAAC;;CAE3B,OAAO;;CAEP,MAAM;;CAEN,KAAK;;CAEL,IAAI,KAAK,YAAY,GAAG;;CAExB;CACA,KAAK,SAAS,GAAG,EAAE,QAAQ,CAAC;CAC5B,KAAK,SAAS,GAAG,QAAQ,CAAC;CAC1B,KAAK,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC;;CAE3C,KAAK,MAAM;;CAEX;CACA,KAAK,SAAS,GAAG,QAAQ,CAAC;CAC1B,KAAK,SAAS,GAAG,QAAQ,CAAC;CAC1B,KAAK,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,YAAY,GAAG,CAAC,EAAE,CAAC;;CAE/C,KAAK;;CAEL,IAAI;;CAEJ,GAAG,OAAO,IAAI,OAAO,EAAE,SAAS,GAAG,SAAS,EAAE,SAAS,GAAG,SAAS,EAAE,CAAC;;CAEtE,GAAG;;;CAGH,EAAE,IAAI,gBAAgB,GAAG,EAAE,CAAC;;CAE5B,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG;;CAE1F,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;CACzB,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;;CAEzB;CACA;;CAEA,GAAG,gBAAgB,EAAE,CAAC,EAAE,GAAG,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEnF,GAAG;;CAEH,EAAE,IAAI,cAAc,GAAG,EAAE;CACzB,GAAG,gBAAgB,EAAE,iBAAiB,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC;;CAEnE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEjD,GAAG,KAAK,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;;CAEtB,GAAG,gBAAgB,GAAG,EAAE,CAAC;;CAEzB,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG;;CAErF,IAAI,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;CAC1B,IAAI,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;;CAE1B;CACA,IAAI,gBAAgB,EAAE,CAAC,EAAE,GAAG,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE9E,IAAI;;CAEJ,GAAG,cAAc,CAAC,IAAI,EAAE,gBAAgB,EAAE,CAAC;CAC3C,GAAG,iBAAiB,GAAG,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC;;CAEpE,GAAG;;;CAGH;;CAEA,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,GAAG,GAAG;;CAEzC;;CAEA,GAAG,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC;CACzB,GAAG,CAAC,GAAG,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;CACpD,GAAG,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;;CAEhD;;CAEA,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEpD,IAAI,IAAI,GAAG,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,gBAAgB,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;;CAE/D,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;;CAE7B,IAAI;;CAEJ;;CAEA,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAElD,IAAI,KAAK,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;CACvB,IAAI,gBAAgB,GAAG,cAAc,EAAE,CAAC,EAAE,CAAC;;CAE3C,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEnD,KAAK,IAAI,GAAG,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,gBAAgB,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;;CAE9D,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;;CAE9B,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH,EAAE,EAAE,GAAG,SAAS,CAAC;;CAEjB;;CAEA,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,GAAG;;CAEhC,GAAG,IAAI,GAAG,YAAY,GAAG,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,iBAAiB,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,QAAQ,EAAE,CAAC,EAAE,CAAC;;CAE/F,GAAG,KAAK,EAAE,aAAa,GAAG;;CAE1B,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE3B,IAAI,MAAM;;CAEV;;CAEA,IAAI,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CACpE,IAAI,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;;CAExE,IAAI,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;;CAEpE,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;;CAE/C,IAAI;;CAEJ,GAAG;;CAEH;CACA;;CAEA,EAAE,IAAI,CAAC,CAAC;;CAER,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,GAAG,GAAG;;CAElC,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,GAAG;;CAEjC,IAAI,IAAI,GAAG,YAAY,GAAG,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,iBAAiB,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,QAAQ,EAAE,CAAC,EAAE,CAAC;;CAEhG,IAAI,KAAK,EAAE,aAAa,GAAG;;CAE3B,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;;CAE7C,KAAK,MAAM;;CAEX;;CAEA,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CACrE,KAAK,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;;CAEzE,KAAK,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;;CAErE,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;;CAEhD,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;;CAGH;;CAEA;CACA,EAAE,MAAM,CAAC,GAAG,aAAa,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG;;CAE9C,GAAG,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC;CACzB,GAAG,CAAC,GAAG,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;CACpD,GAAG,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;;CAEhD;;CAEA,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEpD,IAAI,IAAI,GAAG,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,gBAAgB,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;CAC/D,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;;CAEpC,IAAI;;CAEJ;;CAEA,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAElD,IAAI,KAAK,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;CACvB,IAAI,gBAAgB,GAAG,cAAc,EAAE,CAAC,EAAE,CAAC;;CAE3C,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEnD,KAAK,IAAI,GAAG,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,gBAAgB,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;;CAE9D,KAAK,KAAK,EAAE,aAAa,GAAG;;CAE5B,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;;CAEtC,MAAM,MAAM;;CAEZ,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,UAAU,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;;CAErF,MAAM;;CAEN,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH;;CAEA;;CAEA,EAAE,aAAa,EAAE,CAAC;;CAElB;;CAEA,EAAE,cAAc,EAAE,CAAC;;;CAGnB;;CAEA,EAAE,SAAS,aAAa,GAAG;;CAE3B,GAAG,IAAI,KAAK,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;;CAExC,GAAG,KAAK,YAAY,GAAG;;CAEvB,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC;CAClB,IAAI,IAAI,MAAM,GAAG,IAAI,GAAG,KAAK,CAAC;;CAE9B;;CAEA,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,GAAG;;CAElC,KAAK,IAAI,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;CACvB,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC;;CAEtE,KAAK;;CAEL,IAAI,KAAK,GAAG,KAAK,GAAG,aAAa,GAAG,CAAC,CAAC;CACtC,IAAI,MAAM,GAAG,IAAI,GAAG,KAAK,CAAC;;CAE1B;;CAEA,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,GAAG;;CAElC,KAAK,IAAI,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;CACvB,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC;;CAEtE,KAAK;;CAEL,IAAI,MAAM;;CAEV;;CAEA,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,GAAG;;CAElC,KAAK,IAAI,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;CACvB,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE3C,KAAK;;CAEL;;CAEA,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,GAAG;;CAElC,KAAK,IAAI,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;CACvB,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC;;CAExF,KAAK;;CAEL,IAAI;;CAEJ,GAAG,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,aAAa,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;;CAEhE,GAAG;;CAEH;;CAEA,EAAE,SAAS,cAAc,GAAG;;CAE5B,GAAG,IAAI,KAAK,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;CACxC,GAAG,IAAI,WAAW,GAAG,CAAC,CAAC;CACvB,GAAG,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;CACrC,GAAG,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;;CAEjC,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAElD,IAAI,KAAK,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;CACvB,IAAI,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;;CAEpC;CACA,IAAI,WAAW,IAAI,KAAK,CAAC,MAAM,CAAC;;CAEhC,IAAI;;;CAGJ,GAAG,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,aAAa,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;;;CAGhE,GAAG;;CAEH,EAAE,SAAS,SAAS,EAAE,OAAO,EAAE,WAAW,GAAG;;CAE7C,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;CACZ,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;;CAEtB,GAAG,QAAQ,GAAG,CAAC,IAAI,CAAC,GAAG;;CAEvB,IAAI,CAAC,GAAG,CAAC,CAAC;CACV,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CACd,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;;CAExC;;CAEA,IAAI,IAAI,CAAC,GAAG,CAAC;CACb,KAAK,EAAE,GAAG,KAAK,GAAG,aAAa,GAAG,CAAC,CAAC;;CAEpC,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEhC,KAAK,IAAI,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC;CAC1B,KAAK,IAAI,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;;CAElC,KAAK,IAAI,CAAC,GAAG,WAAW,GAAG,CAAC,GAAG,KAAK;CACpC,MAAM,CAAC,GAAG,WAAW,GAAG,CAAC,GAAG,KAAK;CACjC,MAAM,CAAC,GAAG,WAAW,GAAG,CAAC,GAAG,KAAK;CACjC,MAAM,CAAC,GAAG,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC;;CAElC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEtB,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;CAExB,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;CACzB,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;CACzB,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;;CAEzB,GAAG;;;CAGH,EAAE,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;CAEzB,GAAG,SAAS,EAAE,CAAC,EAAE,CAAC;CAClB,GAAG,SAAS,EAAE,CAAC,EAAE,CAAC;CAClB,GAAG,SAAS,EAAE,CAAC,EAAE,CAAC;;CAElB,GAAG,IAAI,SAAS,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;CAC5C,GAAG,IAAI,GAAG,GAAG,KAAK,CAAC,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,CAAC,EAAE,CAAC;;CAEtG,GAAG,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;CACrB,GAAG,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;CACrB,GAAG,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;;CAErB,GAAG;;CAEH,EAAE,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;CAE5B,GAAG,SAAS,EAAE,CAAC,EAAE,CAAC;CAClB,GAAG,SAAS,EAAE,CAAC,EAAE,CAAC;CAClB,GAAG,SAAS,EAAE,CAAC,EAAE,CAAC;;CAElB,GAAG,SAAS,EAAE,CAAC,EAAE,CAAC;CAClB,GAAG,SAAS,EAAE,CAAC,EAAE,CAAC;CAClB,GAAG,SAAS,EAAE,CAAC,EAAE,CAAC;;;CAGlB,GAAG,IAAI,SAAS,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;CAC5C,GAAG,IAAI,GAAG,GAAG,KAAK,CAAC,kBAAkB,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,CAAC,EAAE,CAAC;;CAE1H,GAAG,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;CACrB,GAAG,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;CACrB,GAAG,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;;CAErB,GAAG,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;CACrB,GAAG,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;CACrB,GAAG,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;;CAErB,GAAG;;CAEH,EAAE,SAAS,SAAS,EAAE,KAAK,GAAG;;CAE9B,GAAG,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;CACtD,GAAG,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;CACtD,GAAG,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;;CAEtD,GAAG;;;CAGH,EAAE,SAAS,KAAK,EAAE,OAAO,GAAG;;CAE5B,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;CAC7B,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;;CAE7B,GAAG;;CAEH,EAAE;;CAEF,CAAC;;CAED,qBAAqB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,EAAE,CAAC;CAC5E,qBAAqB,CAAC,SAAS,CAAC,WAAW,GAAG,qBAAqB,CAAC;;CAEpE,IAAI,gBAAgB,GAAG;;CAEvB,CAAC,aAAa,EAAE,WAAW,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;;CAExE,EAAE,IAAI,GAAG,GAAG,QAAQ,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;CACnC,EAAE,IAAI,GAAG,GAAG,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;CACvC,EAAE,IAAI,GAAG,GAAG,QAAQ,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;CACnC,EAAE,IAAI,GAAG,GAAG,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;CACvC,EAAE,IAAI,GAAG,GAAG,QAAQ,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;CACnC,EAAE,IAAI,GAAG,GAAG,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;;CAEvC,EAAE,OAAO;CACT,GAAG,IAAI,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE;CAC1B,GAAG,IAAI,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE;CAC1B,GAAG,IAAI,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE;CAC1B,GAAG,CAAC;;CAEJ,EAAE;;CAEF,CAAC,kBAAkB,EAAE,WAAW,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;;CAErF,EAAE,IAAI,GAAG,GAAG,QAAQ,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;CACnC,EAAE,IAAI,GAAG,GAAG,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;CACvC,EAAE,IAAI,GAAG,GAAG,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;CACvC,EAAE,IAAI,GAAG,GAAG,QAAQ,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;CACnC,EAAE,IAAI,GAAG,GAAG,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;CACvC,EAAE,IAAI,GAAG,GAAG,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;CACvC,EAAE,IAAI,GAAG,GAAG,QAAQ,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;CACnC,EAAE,IAAI,GAAG,GAAG,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;CACvC,EAAE,IAAI,GAAG,GAAG,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;CACvC,EAAE,IAAI,GAAG,GAAG,QAAQ,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;CACnC,EAAE,IAAI,GAAG,GAAG,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;CACvC,EAAE,IAAI,GAAG,GAAG,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;;CAEvC,EAAE,KAAK,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,GAAG;;CAEtC,GAAG,OAAO;CACV,IAAI,IAAI,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE;CAC/B,IAAI,IAAI,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE;CAC/B,IAAI,IAAI,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE;CAC/B,IAAI,IAAI,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE;CAC/B,IAAI,CAAC;;CAEL,GAAG,MAAM;;CAET,GAAG,OAAO;CACV,IAAI,IAAI,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE;CAC/B,IAAI,IAAI,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE;CAC/B,IAAI,IAAI,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE;CAC/B,IAAI,IAAI,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE;CAC/B,IAAI,CAAC;;CAEL,GAAG;;CAEH,EAAE;CACF,CAAC,CAAC;;CAEF;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA;;CAEA,SAAS,YAAY,EAAE,IAAI,EAAE,UAAU,GAAG;;CAE1C,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;;CAE5B,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,IAAI,EAAE,IAAI;CACZ,EAAE,UAAU,EAAE,UAAU;CACxB,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,kBAAkB,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC;CACvE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;;CAEtB,CAAC;;CAED,YAAY,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CAC7D,YAAY,CAAC,SAAS,CAAC,WAAW,GAAG,YAAY,CAAC;;CAElD;;CAEA,SAAS,kBAAkB,EAAE,IAAI,EAAE,UAAU,GAAG;;CAEhD,CAAC,UAAU,GAAG,UAAU,IAAI,EAAE,CAAC;;CAE/B,CAAC,IAAI,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;;CAE5B,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG;;CAElC,EAAE,OAAO,CAAC,KAAK,EAAE,sEAAsE,EAAE,CAAC;CAC1F,EAAE,OAAO,IAAI,QAAQ,EAAE,CAAC;;CAExB,EAAE;;CAEF,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,aAAa,EAAE,CAAC;;CAErF;;CAEA,CAAC,UAAU,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,KAAK,SAAS,GAAG,UAAU,CAAC,MAAM,GAAG,EAAE,CAAC;;CAE9E;;CAEA,CAAC,KAAK,UAAU,CAAC,cAAc,KAAK,SAAS,GAAG,UAAU,CAAC,cAAc,GAAG,EAAE,CAAC;CAC/E,CAAC,KAAK,UAAU,CAAC,SAAS,KAAK,SAAS,GAAG,UAAU,CAAC,SAAS,GAAG,CAAC,CAAC;CACpE,CAAC,KAAK,UAAU,CAAC,YAAY,KAAK,SAAS,GAAG,UAAU,CAAC,YAAY,GAAG,KAAK,CAAC;;CAE9E,CAAC,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;;CAExD,CAAC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;;CAElC,CAAC;;CAED,kBAAkB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,SAAS,EAAE,CAAC;CAChF,kBAAkB,CAAC,SAAS,CAAC,WAAW,GAAG,kBAAkB,CAAC;;CAE9D;CACA;CACA;CACA;CACA;;CAEA;;CAEA,SAAS,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,GAAG;;CAE/G,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;;CAE9B,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,aAAa,EAAE,aAAa;CAC9B,EAAE,cAAc,EAAE,cAAc;CAChC,EAAE,QAAQ,EAAE,QAAQ;CACpB,EAAE,SAAS,EAAE,SAAS;CACtB,EAAE,UAAU,EAAE,UAAU;CACxB,EAAE,WAAW,EAAE,WAAW;CAC1B,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,oBAAoB,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,CAAC;CAC5I,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;;CAEtB,CAAC;;CAED,cAAc,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CAC/D,cAAc,CAAC,SAAS,CAAC,WAAW,GAAG,cAAc,CAAC;;CAEtD;;CAEA,SAAS,oBAAoB,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,GAAG;;CAErH,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7B,CAAC,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;;CAEpC,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,aAAa,EAAE,aAAa;CAC9B,EAAE,cAAc,EAAE,cAAc;CAChC,EAAE,QAAQ,EAAE,QAAQ;CACpB,EAAE,SAAS,EAAE,SAAS;CACtB,EAAE,UAAU,EAAE,UAAU;CACxB,EAAE,WAAW,EAAE,WAAW;CAC1B,EAAE,CAAC;;CAEH,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC;;CAEtB,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,CAAC;CACjE,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE,CAAC;;CAEnE,CAAC,QAAQ,GAAG,QAAQ,KAAK,SAAS,GAAG,QAAQ,GAAG,CAAC,CAAC;CAClD,CAAC,SAAS,GAAG,SAAS,KAAK,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;;CAE/D,CAAC,UAAU,GAAG,UAAU,KAAK,SAAS,GAAG,UAAU,GAAG,CAAC,CAAC;CACxD,CAAC,WAAW,GAAG,WAAW,KAAK,SAAS,GAAG,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC;;CAEjE,CAAC,IAAI,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAC;;CAEzC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;;CAEZ,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;CACf,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;;CAEf,CAAC,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;CAC5B,CAAC,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE5B;;CAEA,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC;CAClB,CAAC,IAAI,QAAQ,GAAG,EAAE,CAAC;CACnB,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC;CAClB,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC;;CAEd;;CAEA,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,cAAc,EAAE,EAAE,GAAG,GAAG;;CAE7C,EAAE,IAAI,WAAW,GAAG,EAAE,CAAC;;CAEvB,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC;;CAE9B,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,aAAa,EAAE,EAAE,GAAG,GAAG;;CAE7C,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC;;CAE9B;;CAEA,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,GAAG,CAAC,GAAG,SAAS,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,GAAG,CAAC,GAAG,WAAW,EAAE,CAAC;CACzG,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,GAAG,CAAC,GAAG,WAAW,EAAE,CAAC;CAChE,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,GAAG,CAAC,GAAG,SAAS,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,GAAG,CAAC,GAAG,WAAW,EAAE,CAAC;;CAEvG,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAEjD;;CAEA,GAAG,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC;CAC1D,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAEhD;;CAEA,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;;CAExB,GAAG,WAAW,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;;CAEhC,GAAG;;CAEH,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC;;CAE3B,EAAE;;CAEF;;CAEA,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,cAAc,EAAE,EAAE,GAAG,GAAG;;CAE5C,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,aAAa,EAAE,EAAE,GAAG,GAAG;;CAE5C,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;CAChC,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;CAC5B,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;CAChC,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;;CAEpC,GAAG,KAAK,EAAE,KAAK,CAAC,IAAI,UAAU,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC7D,GAAG,KAAK,EAAE,KAAK,cAAc,GAAG,CAAC,IAAI,QAAQ,GAAG,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAElF,GAAG;;CAEH,EAAE;;CAEF;;CAEA,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;CAC1B,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,sBAAsB,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;CAC5E,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,sBAAsB,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;CACzE,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,sBAAsB,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEjE,CAAC;;CAED,oBAAoB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,EAAE,CAAC;CAC3E,oBAAoB,CAAC,SAAS,CAAC,WAAW,GAAG,oBAAoB,CAAC;;CAElE;CACA;CACA;CACA;;CAEA;;CAEA,SAAS,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,GAAG;;CAEvG,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;;CAE5B,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,WAAW,EAAE,WAAW;CAC1B,EAAE,WAAW,EAAE,WAAW;CAC1B,EAAE,aAAa,EAAE,aAAa;CAC9B,EAAE,WAAW,EAAE,WAAW;CAC1B,EAAE,UAAU,EAAE,UAAU;CACxB,EAAE,WAAW,EAAE,WAAW;CAC1B,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,kBAAkB,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,CAAC;CACpI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;;CAEtB,CAAC;;CAED,YAAY,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CAC7D,YAAY,CAAC,SAAS,CAAC,WAAW,GAAG,YAAY,CAAC;;CAElD;;CAEA,SAAS,kBAAkB,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,GAAG;;CAE7G,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7B,CAAC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;;CAElC,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,WAAW,EAAE,WAAW;CAC1B,EAAE,WAAW,EAAE,WAAW;CAC1B,EAAE,aAAa,EAAE,aAAa;CAC9B,EAAE,WAAW,EAAE,WAAW;CAC1B,EAAE,UAAU,EAAE,UAAU;CACxB,EAAE,WAAW,EAAE,WAAW;CAC1B,EAAE,CAAC;;CAEH,CAAC,WAAW,GAAG,WAAW,IAAI,GAAG,CAAC;CAClC,CAAC,WAAW,GAAG,WAAW,IAAI,CAAC,CAAC;;CAEhC,CAAC,UAAU,GAAG,UAAU,KAAK,SAAS,GAAG,UAAU,GAAG,CAAC,CAAC;CACxD,CAAC,WAAW,GAAG,WAAW,KAAK,SAAS,GAAG,WAAW,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;;CAErE,CAAC,aAAa,GAAG,aAAa,KAAK,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;CAChF,CAAC,WAAW,GAAG,WAAW,KAAK,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;;CAE1E;;CAEA,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC;CAClB,CAAC,IAAI,QAAQ,GAAG,EAAE,CAAC;CACnB,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC;CAClB,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC;;CAEd;;CAEA,CAAC,IAAI,OAAO,CAAC;CACb,CAAC,IAAI,MAAM,GAAG,WAAW,CAAC;CAC1B,CAAC,IAAI,UAAU,KAAK,EAAE,WAAW,GAAG,WAAW,KAAK,WAAW,EAAE,CAAC;CAClE,CAAC,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;CAC5B,CAAC,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CACxB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;;CAEV;;CAEA,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC,GAAG,GAAG;;CAEvC,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,aAAa,EAAE,CAAC,GAAG,GAAG;;CAE1C;;CAEA,GAAG,OAAO,GAAG,UAAU,GAAG,CAAC,GAAG,aAAa,GAAG,WAAW,CAAC;;CAE1D;;CAEA,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;CAC3C,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;;CAE3C,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAEjD;;CAEA,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE3B;;CAEA,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,WAAW,GAAG,CAAC,KAAK,CAAC,CAAC;CAC7C,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,WAAW,GAAG,CAAC,KAAK,CAAC,CAAC;;CAE7C,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;;CAE1B,GAAG;;CAEH;;CAEA,EAAE,MAAM,IAAI,UAAU,CAAC;;CAEvB,EAAE;;CAEF;;CAEA,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,GAAG,GAAG;;CAEtC,EAAE,IAAI,iBAAiB,GAAG,CAAC,KAAK,aAAa,GAAG,CAAC,EAAE,CAAC;;CAEpD,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,GAAG,GAAG;;CAEzC,GAAG,OAAO,GAAG,CAAC,GAAG,iBAAiB,CAAC;;CAEnC,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC;CACnB,GAAG,IAAI,CAAC,GAAG,OAAO,GAAG,aAAa,GAAG,CAAC,CAAC;CACvC,GAAG,IAAI,CAAC,GAAG,OAAO,GAAG,aAAa,GAAG,CAAC,CAAC;CACvC,GAAG,IAAI,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;;CAEvB;;CAEA,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC3B,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE3B,GAAG;;CAEH,EAAE;;CAEF;;CAEA,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;CAC1B,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,sBAAsB,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;CAC5E,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,sBAAsB,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;CACzE,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,sBAAsB,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEjE,CAAC;;CAED,kBAAkB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,EAAE,CAAC;CACzE,kBAAkB,CAAC,SAAS,CAAC,WAAW,GAAG,kBAAkB,CAAC;;CAE9D;CACA;CACA;CACA;CACA;CACA;;CAEA;;CAEA,SAAS,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,GAAG;;CAEhE,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;;CAE7B,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,QAAQ,EAAE,QAAQ;CACpB,EAAE,QAAQ,EAAE,QAAQ;CACpB,EAAE,SAAS,EAAE,SAAS;CACtB,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,mBAAmB,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAC;CAC7F,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;;CAEtB,CAAC;;CAED,aAAa,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CAC9D,aAAa,CAAC,SAAS,CAAC,WAAW,GAAG,aAAa,CAAC;;CAEpD;;CAEA,SAAS,mBAAmB,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,GAAG;;CAEtE,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7B,CAAC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;;CAEnC,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,QAAQ,EAAE,QAAQ;CACpB,EAAE,QAAQ,EAAE,QAAQ;CACpB,EAAE,SAAS,EAAE,SAAS;CACtB,EAAE,CAAC;;CAEH,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;CACzC,CAAC,QAAQ,GAAG,QAAQ,IAAI,CAAC,CAAC;CAC1B,CAAC,SAAS,GAAG,SAAS,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;;CAEtC;;CAEA,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;;;CAGtD;;CAEA,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC;CAClB,CAAC,IAAI,QAAQ,GAAG,EAAE,CAAC;CACnB,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC;;CAEd;;CAEA,CAAC,IAAI,IAAI,CAAC;CACV,CAAC,IAAI,eAAe,GAAG,GAAG,GAAG,QAAQ,CAAC;CACtC,CAAC,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;CAC5B,CAAC,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CACxB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;;CAEV;;CAEA,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,GAAG,GAAG;;CAEpC,EAAE,IAAI,GAAG,GAAG,QAAQ,GAAG,CAAC,GAAG,eAAe,GAAG,SAAS,CAAC;;CAEvD,EAAE,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;CAC5B,EAAE,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;;CAE5B,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG;;CAElD;;CAEA,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;CAClC,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;CAC5B,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;;CAElC,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAEjD;;CAEA,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;CACvB,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;;CAEpC,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;;;CAG1B,GAAG;;CAEH,EAAE;;CAEF;;CAEA,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,GAAG,GAAG;;CAEnC,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEjD,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;;CAEhC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;CAChB,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;CAChC,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;CACpC,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;;CAEpB;;CAEA,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC3B,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE3B,GAAG;;CAEH,EAAE;;CAEF;;CAEA,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;CAC1B,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,sBAAsB,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;CAC5E,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,sBAAsB,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEjE;;CAEA,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;;CAE7B;CACA;;CAEA,CAAC,KAAK,SAAS,KAAK,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG;;CAElC,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC;CAC7C,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CACzB,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CACzB,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;;CAExB;;CAEA,EAAE,IAAI,GAAG,QAAQ,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;;CAEtC,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG;;CAExD;;CAEA,GAAG,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;CAC3B,GAAG,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;CAC3B,GAAG,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;;CAE3B;;CAEA,GAAG,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;CAClC,GAAG,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;CAClC,GAAG,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;;CAElC;;CAEA,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC;;CAEtC;;CAEA,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;CACpD,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;CACpD,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;;CAEpD,GAAG;;CAEH,EAAE;;CAEF,CAAC;;CAED,mBAAmB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,EAAE,CAAC;CAC1E,mBAAmB,CAAC,SAAS,CAAC,WAAW,GAAG,mBAAmB,CAAC;;CAEhE;CACA;CACA;CACA;;CAEA;;CAEA,SAAS,aAAa,EAAE,MAAM,EAAE,aAAa,GAAG;;CAEhD,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;;CAE7B,CAAC,KAAK,OAAO,aAAa,KAAK,QAAQ,GAAG;;CAE1C,EAAE,OAAO,CAAC,IAAI,EAAE,0DAA0D,EAAE,CAAC;;CAE7E,EAAE,aAAa,GAAG,aAAa,CAAC,aAAa,CAAC;;CAE9C,EAAE;;CAEF,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,aAAa,EAAE,aAAa;CAC9B,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,mBAAmB,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,CAAC;CAC7E,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;;CAEtB,CAAC;;CAED,aAAa,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CAC9D,aAAa,CAAC,SAAS,CAAC,WAAW,GAAG,aAAa,CAAC;;CAEpD,aAAa,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY;;CAE7C,CAAC,IAAI,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEnD,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;;CAErC,CAAC,OAAO,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;CAE/B,CAAC,CAAC;;CAEF;;CAEA,SAAS,mBAAmB,EAAE,MAAM,EAAE,aAAa,GAAG;;CAEtD,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7B,CAAC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;;CAEnC,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,aAAa,EAAE,aAAa;CAC9B,EAAE,CAAC;;CAEH,CAAC,aAAa,GAAG,aAAa,IAAI,EAAE,CAAC;;CAErC;;CAEA,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC;CAClB,CAAC,IAAI,QAAQ,GAAG,EAAE,CAAC;CACnB,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC;CAClB,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC;;CAEd;;CAEA,CAAC,IAAI,UAAU,GAAG,CAAC,CAAC;CACpB,CAAC,IAAI,UAAU,GAAG,CAAC,CAAC;;CAEpB;;CAEA,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,KAAK,GAAG;;CAE1C,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;;CAErB,EAAE,MAAM;;CAER,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAE7C,GAAG,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE3B,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;;CAE9C,GAAG,UAAU,IAAI,UAAU,CAAC;CAC5B,GAAG,UAAU,GAAG,CAAC,CAAC;;CAElB,GAAG;;CAEH,EAAE;;CAEF;;CAEA,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;CAC1B,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,sBAAsB,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;CAC5E,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,sBAAsB,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;CACzE,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,sBAAsB,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;;;CAGjE;;CAEA,CAAC,SAAS,QAAQ,EAAE,KAAK,GAAG;;CAE5B,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC;;CAEtB,EAAE,IAAI,WAAW,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;CACxC,EAAE,IAAI,MAAM,GAAG,KAAK,CAAC,aAAa,EAAE,aAAa,EAAE,CAAC;;CAEpD,EAAE,IAAI,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC;CACnC,EAAE,IAAI,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC;;CAEhC;;CAEA,EAAE,KAAK,UAAU,CAAC,WAAW,EAAE,aAAa,EAAE,KAAK,KAAK,GAAG;;CAE3D,GAAG,aAAa,GAAG,aAAa,CAAC,OAAO,EAAE,CAAC;;CAE3C;;CAEA,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAErD,IAAI,SAAS,GAAG,UAAU,EAAE,CAAC,EAAE,CAAC;;CAEhC,IAAI,KAAK,UAAU,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,IAAI,GAAG;;CAExD,KAAK,UAAU,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;;CAE3C,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH,EAAE,IAAI,KAAK,GAAG,UAAU,CAAC,gBAAgB,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;;CAEvE;;CAEA,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEpD,GAAG,SAAS,GAAG,UAAU,EAAE,CAAC,EAAE,CAAC;CAC/B,GAAG,aAAa,GAAG,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;;CAErD,GAAG;;CAEH;;CAEA,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEvD,GAAG,IAAI,MAAM,GAAG,aAAa,EAAE,CAAC,EAAE,CAAC;;CAEnC,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;CAC1C,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC3B,GAAG,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAElC,GAAG;;CAEH;;CAEA,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAE/C,GAAG,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;;CAEzB,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,WAAW,CAAC;CACnC,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,WAAW,CAAC;CACnC,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,WAAW,CAAC;;CAEnC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC3B,GAAG,UAAU,IAAI,CAAC,CAAC;;CAEnB,GAAG;;CAEH,EAAE;;CAEF,CAAC;;CAED,mBAAmB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,EAAE,CAAC;CAC1E,mBAAmB,CAAC,SAAS,CAAC,WAAW,GAAG,mBAAmB,CAAC;;CAEhE,mBAAmB,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY;;CAEnD,CAAC,IAAI,IAAI,GAAG,cAAc,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEzD,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;;CAErC,CAAC,OAAO,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;CAE/B,CAAC,CAAC;;CAEF;;CAEA,SAAS,MAAM,EAAE,MAAM,EAAE,IAAI,GAAG;;CAEhC,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;;CAElB,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG;;CAEhC,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEpD,GAAG,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC;;CAE3B,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;;CAElC,GAAG;;CAEH,EAAE,MAAM;;CAER,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;;CAElC,EAAE;;CAEF,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC;;CAED;CACA;CACA;CACA;;CAEA,SAAS,aAAa,EAAE,QAAQ,EAAE,cAAc,GAAG;;CAEnD,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7B,CAAC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;;CAE7B,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,cAAc,EAAE,cAAc;CAChC,EAAE,CAAC;;CAEH,CAAC,cAAc,GAAG,EAAE,cAAc,KAAK,SAAS,KAAK,cAAc,GAAG,CAAC,CAAC;;CAExE;;CAEA,CAAC,IAAI,QAAQ,GAAG,EAAE,CAAC;;CAEnB;;CAEA,CAAC,IAAI,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,GAAG,cAAc,EAAE,CAAC;CAC/D,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC;CAC/C,CAAC,IAAI,GAAG,EAAE,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAEnC;;CAEA,CAAC,IAAI,SAAS,CAAC;;CAEf,CAAC,KAAK,QAAQ,CAAC,gBAAgB,GAAG;;CAElC,EAAE,SAAS,GAAG,IAAI,QAAQ,EAAE,CAAC;CAC7B,EAAE,SAAS,CAAC,kBAAkB,EAAE,QAAQ,EAAE,CAAC;;CAE3C,EAAE,MAAM;;CAER,EAAE,SAAS,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;;CAE/B,EAAE;;CAEF,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC;CAC3B,CAAC,SAAS,CAAC,kBAAkB,EAAE,CAAC;;CAEhC,CAAC,IAAI,cAAc,GAAG,SAAS,CAAC,QAAQ,CAAC;CACzC,CAAC,IAAI,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;;CAE7B;;CAEA,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAElD,EAAE,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;;CAExB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEjC,GAAG,KAAK,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;CAC7B,GAAG,KAAK,GAAG,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;CACzC,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;CACxC,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;;CAExC,GAAG,GAAG,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;;CAErC,GAAG,KAAK,KAAK,EAAE,GAAG,EAAE,KAAK,SAAS,GAAG;;CAErC,IAAI,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;;CAExF,IAAI,MAAM;;CAEV,IAAI,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC;;CAE3B,IAAI;;CAEJ,GAAG;;CAEH,EAAE;;CAEF;;CAEA,CAAC,MAAM,GAAG,IAAI,KAAK,GAAG;;CAEtB,EAAE,IAAI,CAAC,GAAG,KAAK,EAAE,GAAG,EAAE,CAAC;;CAEvB;;CAEA,EAAE,KAAK,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,YAAY,GAAG;;CAEzG,GAAG,IAAI,MAAM,GAAG,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;CAC3C,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAEjD,GAAG,MAAM,GAAG,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;CACvC,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAEjD,GAAG;;CAEH,EAAE;;CAEF;;CAEA,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,sBAAsB,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE5E,CAAC;;CAED,aAAa,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,EAAE,CAAC;CACpE,aAAa,CAAC,SAAS,CAAC,WAAW,GAAG,aAAa,CAAC;;CAEpD;CACA;CACA;CACA;;CAEA;;CAEA,SAAS,gBAAgB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,GAAG;;CAEjI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;;CAEhC,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,SAAS,EAAE,SAAS;CACtB,EAAE,YAAY,EAAE,YAAY;CAC5B,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,cAAc,EAAE,cAAc;CAChC,EAAE,cAAc,EAAE,cAAc;CAChC,EAAE,SAAS,EAAE,SAAS;CACtB,EAAE,UAAU,EAAE,UAAU;CACxB,EAAE,WAAW,EAAE,WAAW;CAC1B,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,sBAAsB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,CAAC;CAC9J,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;;CAEtB,CAAC;;CAED,gBAAgB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CACjE,gBAAgB,CAAC,SAAS,CAAC,WAAW,GAAG,gBAAgB,CAAC;;CAE1D;;CAEA,SAAS,sBAAsB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,GAAG;;CAEvI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7B,CAAC,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;;CAEtC,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,SAAS,EAAE,SAAS;CACtB,EAAE,YAAY,EAAE,YAAY;CAC5B,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,cAAc,EAAE,cAAc;CAChC,EAAE,cAAc,EAAE,cAAc;CAChC,EAAE,SAAS,EAAE,SAAS;CACtB,EAAE,UAAU,EAAE,UAAU;CACxB,EAAE,WAAW,EAAE,WAAW;CAC1B,EAAE,CAAC;;CAEH,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC;;CAElB,CAAC,SAAS,GAAG,SAAS,KAAK,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC;CACrD,CAAC,YAAY,GAAG,YAAY,KAAK,SAAS,GAAG,YAAY,GAAG,CAAC,CAAC;CAC9D,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC;;CAEtB,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;CACpD,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;;CAEpD,CAAC,SAAS,GAAG,SAAS,KAAK,SAAS,GAAG,SAAS,GAAG,KAAK,CAAC;CACzD,CAAC,UAAU,GAAG,UAAU,KAAK,SAAS,GAAG,UAAU,GAAG,GAAG,CAAC;CAC1D,CAAC,WAAW,GAAG,WAAW,KAAK,SAAS,GAAG,WAAW,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;;CAErE;;CAEA,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC;CAClB,CAAC,IAAI,QAAQ,GAAG,EAAE,CAAC;CACnB,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC;CAClB,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC;;CAEd;;CAEA,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;CACf,CAAC,IAAI,UAAU,GAAG,EAAE,CAAC;CACrB,CAAC,IAAI,UAAU,GAAG,MAAM,GAAG,CAAC,CAAC;CAC7B,CAAC,IAAI,UAAU,GAAG,CAAC,CAAC;;CAEpB;;CAEA,CAAC,aAAa,EAAE,CAAC;;CAEjB,CAAC,KAAK,SAAS,KAAK,KAAK,GAAG;;CAE5B,EAAE,KAAK,SAAS,GAAG,CAAC,GAAG,WAAW,EAAE,IAAI,EAAE,CAAC;CAC3C,EAAE,KAAK,YAAY,GAAG,CAAC,GAAG,WAAW,EAAE,KAAK,EAAE,CAAC;;CAE/C,EAAE;;CAEF;;CAEA,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;CAC1B,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,sBAAsB,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;CAC5E,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,sBAAsB,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;CACzE,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,sBAAsB,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEjE,CAAC,SAAS,aAAa,GAAG;;CAE1B,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;CACX,EAAE,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;CAC7B,EAAE,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE7B,EAAE,IAAI,UAAU,GAAG,CAAC,CAAC;;CAErB;CACA,EAAE,IAAI,KAAK,GAAG,EAAE,YAAY,GAAG,SAAS,KAAK,MAAM,CAAC;;CAEpD;;CAEA,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,cAAc,EAAE,CAAC,GAAG,GAAG;;CAE3C,GAAG,IAAI,QAAQ,GAAG,EAAE,CAAC;;CAErB,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC;;CAE9B;;CAEA,GAAG,IAAI,MAAM,GAAG,CAAC,KAAK,YAAY,GAAG,SAAS,EAAE,GAAG,SAAS,CAAC;;CAE7D,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,cAAc,EAAE,CAAC,GAAG,GAAG;;CAE5C,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC;;CAE/B,IAAI,IAAI,KAAK,GAAG,CAAC,GAAG,WAAW,GAAG,UAAU,CAAC;;CAE7C,IAAI,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;CACrC,IAAI,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;;CAErC;;CAEA,IAAI,MAAM,CAAC,CAAC,GAAG,MAAM,GAAG,QAAQ,CAAC;CACjC,IAAI,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM,GAAG,UAAU,CAAC;CACzC,IAAI,MAAM,CAAC,CAAC,GAAG,MAAM,GAAG,QAAQ,CAAC;CACjC,IAAI,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAElD;;CAEA,IAAI,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,CAAC;CACxD,IAAI,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAEjD;;CAEA,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;;CAEzB;;CAEA,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;;CAE9B,IAAI;;CAEJ;;CAEA,GAAG,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;;CAE/B,GAAG;;CAEH;;CAEA,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,GAAG,GAAG;;CAE1C,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,GAAG,GAAG;;CAE3C;;CAEA,IAAI,IAAI,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;CACjC,IAAI,IAAI,CAAC,GAAG,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;CACrC,IAAI,IAAI,CAAC,GAAG,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;CACzC,IAAI,IAAI,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;;CAErC;;CAEA,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC5B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE5B;;CAEA,IAAI,UAAU,IAAI,CAAC,CAAC;;CAEpB,IAAI;;CAEJ,GAAG;;CAEH;;CAEA,EAAE,KAAK,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;;CAE9C;;CAEA,EAAE,UAAU,IAAI,UAAU,CAAC;;CAE3B,EAAE;;CAEF,CAAC,SAAS,WAAW,EAAE,GAAG,GAAG;;CAE7B,EAAE,IAAI,CAAC,EAAE,gBAAgB,EAAE,cAAc,CAAC;;CAE1C,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CACzB,EAAE,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE7B,EAAE,IAAI,UAAU,GAAG,CAAC,CAAC;;CAErB,EAAE,IAAI,MAAM,GAAG,EAAE,GAAG,KAAK,IAAI,KAAK,SAAS,GAAG,YAAY,CAAC;CAC3D,EAAE,IAAI,IAAI,GAAG,EAAE,GAAG,KAAK,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;;CAExC;CACA,EAAE,gBAAgB,GAAG,KAAK,CAAC;;CAE3B;CACA;CACA;;CAEA,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,cAAc,EAAE,CAAC,GAAG,GAAG;;CAE3C;;CAEA,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,UAAU,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;;CAE5C;;CAEA,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;;CAE9B;;CAEA,GAAG,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAExB;;CAEA,GAAG,KAAK,GAAG,CAAC;;CAEZ,GAAG;;CAEH;;CAEA,EAAE,cAAc,GAAG,KAAK,CAAC;;CAEzB;;CAEA,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,cAAc,EAAE,CAAC,GAAG,GAAG;;CAE3C,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC;CAC9B,GAAG,IAAI,KAAK,GAAG,CAAC,GAAG,WAAW,GAAG,UAAU,CAAC;;CAE5C,GAAG,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;CACpC,GAAG,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;;CAEpC;;CAEA,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,GAAG,QAAQ,CAAC;CAChC,GAAG,MAAM,CAAC,CAAC,GAAG,UAAU,GAAG,IAAI,CAAC;CAChC,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,GAAG,QAAQ,CAAC;CAChC,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAEjD;;CAEA,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;;CAE9B;;CAEA,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,QAAQ,GAAG,GAAG,KAAK,GAAG,CAAC;CACnC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,QAAQ,GAAG,GAAG,GAAG,IAAI,KAAK,GAAG,CAAC;CAC1C,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;;CAE1B;;CAEA,GAAG,KAAK,GAAG,CAAC;;CAEZ,GAAG;;CAEH;;CAEA,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,GAAG,GAAG;;CAE1C,GAAG,IAAI,CAAC,GAAG,gBAAgB,GAAG,CAAC,CAAC;CAChC,GAAG,IAAI,CAAC,GAAG,cAAc,GAAG,CAAC,CAAC;;CAE9B,GAAG,KAAK,GAAG,KAAK,IAAI,GAAG;;CAEvB;;CAEA,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEhC,IAAI,MAAM;;CAEV;;CAEA,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEhC,IAAI;;CAEJ,GAAG,UAAU,IAAI,CAAC,CAAC;;CAEnB,GAAG;;CAEH;;CAEA,EAAE,KAAK,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;;CAEjE;;CAEA,EAAE,UAAU,IAAI,UAAU,CAAC;;CAE3B,EAAE;;CAEF,CAAC;;CAED,sBAAsB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,EAAE,CAAC;CAC7E,sBAAsB,CAAC,SAAS,CAAC,WAAW,GAAG,sBAAsB,CAAC;;CAEtE;CACA;CACA;;CAEA;;CAEA,SAAS,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,GAAG;;CAE5G,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;;CAEtH,CAAC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;;CAE5B,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,cAAc,EAAE,cAAc;CAChC,EAAE,cAAc,EAAE,cAAc;CAChC,EAAE,SAAS,EAAE,SAAS;CACtB,EAAE,UAAU,EAAE,UAAU;CACxB,EAAE,WAAW,EAAE,WAAW;CAC1B,EAAE,CAAC;;CAEH,CAAC;;CAED,YAAY,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,SAAS,EAAE,CAAC;CACrE,YAAY,CAAC,SAAS,CAAC,WAAW,GAAG,YAAY,CAAC;;CAElD;;CAEA,SAAS,kBAAkB,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,GAAG;;CAElH,CAAC,sBAAsB,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;;CAE5H,CAAC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;;CAElC,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,cAAc,EAAE,cAAc;CAChC,EAAE,cAAc,EAAE,cAAc;CAChC,EAAE,SAAS,EAAE,SAAS;CACtB,EAAE,UAAU,EAAE,UAAU;CACxB,EAAE,WAAW,EAAE,WAAW;CAC1B,EAAE,CAAC;;CAEH,CAAC;;CAED,kBAAkB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,SAAS,EAAE,CAAC;CACjF,kBAAkB,CAAC,SAAS,CAAC,WAAW,GAAG,kBAAkB,CAAC;;CAE9D;CACA;CACA;CACA;CACA;;CAEA;;CAEA,SAAS,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,GAAG;;CAErE,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;;CAE9B,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,QAAQ,EAAE,QAAQ;CACpB,EAAE,UAAU,EAAE,UAAU;CACxB,EAAE,WAAW,EAAE,WAAW;CAC1B,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,oBAAoB,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,CAAC;CAClG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;;CAEtB,CAAC;;CAED,cAAc,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CAC/D,cAAc,CAAC,SAAS,CAAC,WAAW,GAAG,cAAc,CAAC;;CAEtD;;CAEA,SAAS,oBAAoB,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,GAAG;;CAE3E,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7B,CAAC,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;;CAEpC,CAAC,IAAI,CAAC,UAAU,GAAG;CACnB,EAAE,MAAM,EAAE,MAAM;CAChB,EAAE,QAAQ,EAAE,QAAQ;CACpB,EAAE,UAAU,EAAE,UAAU;CACxB,EAAE,WAAW,EAAE,WAAW;CAC1B,EAAE,CAAC;;CAEH,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC;CACtB,CAAC,QAAQ,GAAG,QAAQ,KAAK,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;;CAEjE,CAAC,UAAU,GAAG,UAAU,KAAK,SAAS,GAAG,UAAU,GAAG,CAAC,CAAC;CACxD,CAAC,WAAW,GAAG,WAAW,KAAK,SAAS,GAAG,WAAW,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;;CAErE;;CAEA,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC;CAClB,CAAC,IAAI,QAAQ,GAAG,EAAE,CAAC;CACnB,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC;CAClB,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC;;CAEd;;CAEA,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;CACV,CAAC,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;CAC5B,CAAC,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAExB;;CAEA,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC1B,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CACzB,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAEtB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG;;CAEnD,EAAE,IAAI,OAAO,GAAG,UAAU,GAAG,CAAC,GAAG,QAAQ,GAAG,WAAW,CAAC;;CAExD;;CAEA,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;CAC1C,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;;CAE1C,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAEhD;;CAEA,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE1B;;CAEA,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC;CAC5C,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC;;CAEhD,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;;CAEzB,EAAE;;CAEF;;CAEA,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,GAAG,GAAG;;CAEpC,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE9B,EAAE;;CAEF;;CAEA,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;CAC1B,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,sBAAsB,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;CAC5E,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,sBAAsB,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;CACzE,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,sBAAsB,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEjE,CAAC;;CAED,oBAAoB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,EAAE,CAAC;CAC3E,oBAAoB,CAAC,SAAS,CAAC,WAAW,GAAG,oBAAoB,CAAC;;;;CAIlE,IAAI,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;CAC/B,CAAC,iBAAiB,EAAE,iBAAiB;CACrC,CAAC,kBAAkB,EAAE,kBAAkB;CACvC,CAAC,wBAAwB,EAAE,wBAAwB;CACnD,CAAC,mBAAmB,EAAE,mBAAmB;CACzC,CAAC,yBAAyB,EAAE,yBAAyB;CACrD,CAAC,kBAAkB,EAAE,kBAAkB;CACvC,CAAC,wBAAwB,EAAE,wBAAwB;CACnD,CAAC,mBAAmB,EAAE,mBAAmB;CACzC,CAAC,yBAAyB,EAAE,yBAAyB;CACrD,CAAC,oBAAoB,EAAE,oBAAoB;CAC3C,CAAC,0BAA0B,EAAE,0BAA0B;CACvD,CAAC,kBAAkB,EAAE,kBAAkB;CACvC,CAAC,wBAAwB,EAAE,wBAAwB;CACnD,CAAC,YAAY,EAAE,YAAY;CAC3B,CAAC,kBAAkB,EAAE,kBAAkB;CACvC,CAAC,iBAAiB,EAAE,iBAAiB;CACrC,CAAC,uBAAuB,EAAE,uBAAuB;CACjD,CAAC,aAAa,EAAE,aAAa;CAC7B,CAAC,mBAAmB,EAAE,mBAAmB;CACzC,CAAC,YAAY,EAAE,YAAY;CAC3B,CAAC,kBAAkB,EAAE,kBAAkB;CACvC,CAAC,cAAc,EAAE,cAAc;CAC/B,CAAC,oBAAoB,EAAE,oBAAoB;CAC3C,CAAC,YAAY,EAAE,YAAY;CAC3B,CAAC,kBAAkB,EAAE,kBAAkB;CACvC,CAAC,aAAa,EAAE,aAAa;CAC7B,CAAC,mBAAmB,EAAE,mBAAmB;CACzC,CAAC,aAAa,EAAE,aAAa;CAC7B,CAAC,mBAAmB,EAAE,mBAAmB;CACzC,CAAC,aAAa,EAAE,aAAa;CAC7B,CAAC,mBAAmB,EAAE,mBAAmB;CACzC,CAAC,eAAe,EAAE,eAAe;CACjC,CAAC,qBAAqB,EAAE,qBAAqB;CAC7C,CAAC,aAAa,EAAE,aAAa;CAC7B,CAAC,YAAY,EAAE,YAAY;CAC3B,CAAC,kBAAkB,EAAE,kBAAkB;CACvC,CAAC,gBAAgB,EAAE,gBAAgB;CACnC,CAAC,sBAAsB,EAAE,sBAAsB;CAC/C,CAAC,cAAc,EAAE,cAAc;CAC/B,CAAC,oBAAoB,EAAE,oBAAoB;CAC3C,CAAC,WAAW,EAAE,WAAW;CACzB,CAAC,iBAAiB,EAAE,iBAAiB;CACrC,CAAC,CAAC,CAAC;;CAEH;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,cAAc,EAAE,UAAU,GAAG;;CAEtC,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;;CAE9B,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,EAAE,QAAQ,EAAE,CAAC;CACpC,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEzB,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC;;CAE9B,CAAC;;CAED,cAAc,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CAC/D,cAAc,CAAC,SAAS,CAAC,WAAW,GAAG,cAAc,CAAC;;CAEtD,cAAc,CAAC,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC;;CAEjD,cAAc,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW,MAAM,GAAG;;CAEpD,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE9C,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;;CAEjC,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF;CACA;CACA;;CAEA,SAAS,iBAAiB,EAAE,UAAU,GAAG;;CAEzC,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;;CAEzC,CAAC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;;CAEjC,CAAC;;CAED,iBAAiB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,EAAE,CAAC;CACxE,iBAAiB,CAAC,SAAS,CAAC,WAAW,GAAG,iBAAiB,CAAC;;CAE5D,iBAAiB,CAAC,SAAS,CAAC,mBAAmB,GAAG,IAAI,CAAC;;CAEvD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,oBAAoB,EAAE,UAAU,GAAG;;CAE5C,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;;CAEnC,CAAC,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;;CAEpC,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,EAAE,QAAQ,EAAE,CAAC;CACpC,CAAC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;CACtB,CAAC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;;CAEtB,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;;CAEjB,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;CACtB,CAAC,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC;;CAE9B,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;CACnB,CAAC,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;;CAE3B,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,KAAK,EAAE,QAAQ,EAAE,CAAC;CACvC,CAAC,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC;CAC9B,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEzB,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;CACrB,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;;CAEpB,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;CACvB,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAExC,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;CAC7B,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;CAC5B,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;;CAE3B,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;;CAE1B,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;;CAE1B,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;;CAEtB,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;CACpB,CAAC,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC;;CAE5B,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;;CAE7B,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;CACxB,CAAC,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;CAC7B,CAAC,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC;CACjC,CAAC,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC;;CAElC,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;CACvB,CAAC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;CAC3B,CAAC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;;CAE3B,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC;;CAE9B,CAAC;;CAED,oBAAoB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CACrE,oBAAoB,CAAC,SAAS,CAAC,WAAW,GAAG,oBAAoB,CAAC;;CAElE,oBAAoB,CAAC,SAAS,CAAC,sBAAsB,GAAG,IAAI,CAAC;;CAE7D,oBAAoB,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW,MAAM,GAAG;;CAE1D,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE9C,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;;CAEnC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;CACjC,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;CACnC,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;;CAEnC,CAAC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;;CAEvB,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;CACjC,CAAC,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;;CAEnD,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;CAC3B,CAAC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;;CAE7C,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;CACvC,CAAC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;CACvC,CAAC,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;;CAEnD,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;CAC/B,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;;CAEnC,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;CACnC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;;CAE7C,CAAC,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;CAC/C,CAAC,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;CACnD,CAAC,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;;CAEjD,CAAC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;;CAEzC,CAAC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;;CAEzC,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;;CAEjC,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;CAC7B,CAAC,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;;CAE/C,CAAC,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;;CAE/C,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;CACnC,CAAC,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;CACrD,CAAC,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;CACjD,CAAC,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;;CAEnD,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;CACjC,CAAC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;CACzC,CAAC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;;CAEzC,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,oBAAoB,EAAE,UAAU,GAAG;;CAE5C,CAAC,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEnC,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;;CAEnC,CAAC,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;;CAEpC,CAAC,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC;;CAEzB,CAAC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;CACtB,CAAC,IAAI,CAAC,kBAAkB,GAAG,GAAG,CAAC;;CAE/B,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC;;CAE9B,CAAC;;CAED,oBAAoB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,SAAS,EAAE,CAAC;CACjF,oBAAoB,CAAC,SAAS,CAAC,WAAW,GAAG,oBAAoB,CAAC;;CAElE,oBAAoB,CAAC,SAAS,CAAC,sBAAsB,GAAG,IAAI,CAAC;;CAE7D,oBAAoB,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW,MAAM,GAAG;;CAE1D,CAAC,oBAAoB,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE1D,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;;CAEnC,CAAC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;;CAEzC,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;CACnC,CAAC,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;;CAErD,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,iBAAiB,EAAE,UAAU,GAAG;;CAEzC,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;;CAEjC,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,EAAE,QAAQ,EAAE,CAAC;CACpC,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,KAAK,EAAE,QAAQ,EAAE,CAAC;CACvC,CAAC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;;CAErB,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;;CAEjB,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;CACtB,CAAC,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC;;CAE9B,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;CACnB,CAAC,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;;CAE3B,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,KAAK,EAAE,QAAQ,EAAE,CAAC;CACvC,CAAC,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC;CAC9B,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEzB,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;CACrB,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;;CAEpB,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;CACvB,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAExC,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;CAC7B,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;CAC5B,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;;CAE3B,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEzB,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;;CAEtB,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;CACpB,CAAC,IAAI,CAAC,OAAO,GAAG,iBAAiB,CAAC;CAClC,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;CACvB,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;;CAE7B,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;CACxB,CAAC,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;CAC7B,CAAC,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC;CACjC,CAAC,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC;;CAElC,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;CACvB,CAAC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;CAC3B,CAAC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;;CAE3B,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC;;CAE9B,CAAC;;CAED,iBAAiB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CAClE,iBAAiB,CAAC,SAAS,CAAC,WAAW,GAAG,iBAAiB,CAAC;;CAE5D,iBAAiB,CAAC,SAAS,CAAC,mBAAmB,GAAG,IAAI,CAAC;;CAEvD,iBAAiB,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW,MAAM,GAAG;;CAEvD,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE9C,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;CACjC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;CACvC,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;;CAEnC,CAAC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;;CAEvB,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;CACjC,CAAC,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;;CAEnD,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;CAC3B,CAAC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;;CAE7C,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;CACvC,CAAC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;CACvC,CAAC,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;;CAEnD,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;CAC/B,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;;CAEnC,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;CACnC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;;CAE7C,CAAC,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;CAC/C,CAAC,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;CACnD,CAAC,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;;CAEjD,CAAC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;;CAEvC,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;;CAEjC,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;CAC7B,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;CAC/B,CAAC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;CACzC,CAAC,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;;CAE/C,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;CACnC,CAAC,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;CACrD,CAAC,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;CACjD,CAAC,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;;CAEnD,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;CACjC,CAAC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;CACzC,CAAC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;;CAEzC,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,gBAAgB,EAAE,UAAU,GAAG;;CAExC,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEhC,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;CAE/B,CAAC,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;;CAEhC,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEzB,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC;;CAE9B,CAAC;;CAED,gBAAgB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,SAAS,EAAE,CAAC;CAC1E,gBAAgB,CAAC,SAAS,CAAC,WAAW,GAAG,gBAAgB,CAAC;;CAE1D,gBAAgB,CAAC,SAAS,CAAC,kBAAkB,GAAG,IAAI,CAAC;;CAErD,gBAAgB,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW,MAAM,GAAG;;CAEtD,CAAC,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAEvD,CAAC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;;CAEvC,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,kBAAkB,EAAE,UAAU,GAAG;;CAE1C,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;;CAElC,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;CACrB,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;;CAEpB,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;CACvB,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAExC,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;CAC7B,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;CAC5B,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;;CAE3B,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;CACxB,CAAC,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;;CAE7B,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC;CAClB,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;;CAErB,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;CACvB,CAAC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;CAC3B,CAAC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;;CAE3B,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC;;CAE9B,CAAC;;CAED,kBAAkB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CACnE,kBAAkB,CAAC,SAAS,CAAC,WAAW,GAAG,kBAAkB,CAAC;;CAE9D,kBAAkB,CAAC,SAAS,CAAC,oBAAoB,GAAG,IAAI,CAAC;;CAEzD,kBAAkB,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW,MAAM,GAAG;;CAExD,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE9C,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;CAC/B,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;;CAEnC,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;CACnC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;;CAE7C,CAAC,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;CAC/C,CAAC,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;CACnD,CAAC,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;;CAEjD,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;CACnC,CAAC,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;;CAErD,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;CACjC,CAAC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;CACzC,CAAC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;;CAEzC,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,mBAAmB,EAAE,UAAU,GAAG;;CAE3C,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;;CAEnC,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,EAAE,QAAQ,EAAE,CAAC;;CAEpC,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;;CAEjB,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;CACtB,CAAC,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC;;CAE9B,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;CACnB,CAAC,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;;CAE3B,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,KAAK,EAAE,QAAQ,EAAE,CAAC;CACvC,CAAC,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC;CAC9B,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEzB,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEzB,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;;CAEtB,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;CACpB,CAAC,IAAI,CAAC,OAAO,GAAG,iBAAiB,CAAC;CAClC,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;CACvB,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;;CAE7B,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;CACxB,CAAC,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;CAC7B,CAAC,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC;CACjC,CAAC,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC;;CAElC,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;CACvB,CAAC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;CAC3B,CAAC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;;CAE3B,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC;;CAE9B,CAAC;;CAED,mBAAmB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CACpE,mBAAmB,CAAC,SAAS,CAAC,WAAW,GAAG,mBAAmB,CAAC;;CAEhE,mBAAmB,CAAC,SAAS,CAAC,qBAAqB,GAAG,IAAI,CAAC;;CAE3D,mBAAmB,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW,MAAM,GAAG;;CAEzD,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE9C,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;;CAEjC,CAAC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;;CAEvB,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;CACjC,CAAC,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;;CAEnD,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;CAC3B,CAAC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;;CAE7C,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;CACvC,CAAC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;CACvC,CAAC,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;;CAEnD,CAAC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;;CAEvC,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;;CAEjC,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;CAC7B,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;CAC/B,CAAC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;CACzC,CAAC,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;;CAE/C,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;CACnC,CAAC,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;CACrD,CAAC,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;CACjD,CAAC,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;;CAEnD,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;CACjC,CAAC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;CACzC,CAAC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;;CAEzC,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,kBAAkB,EAAE,UAAU,GAAG;;CAE1C,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEhC,CAAC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;;CAElC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;CAChB,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;CACnB,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;;CAElB,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC;;CAE9B,CAAC;;CAED,kBAAkB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,SAAS,EAAE,CAAC;CAC5E,kBAAkB,CAAC,SAAS,CAAC,WAAW,GAAG,kBAAkB,CAAC;;CAE9D,kBAAkB,CAAC,SAAS,CAAC,oBAAoB,GAAG,IAAI,CAAC;;CAEzD,kBAAkB,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW,MAAM,GAAG;;CAExD,CAAC,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAEvD,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;CAC3B,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;CACjC,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;;CAE/B,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;;;CAIF,IAAI,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;CAC9B,CAAC,cAAc,EAAE,cAAc;CAC/B,CAAC,cAAc,EAAE,cAAc;CAC/B,CAAC,iBAAiB,EAAE,iBAAiB;CACrC,CAAC,cAAc,EAAE,cAAc;CAC/B,CAAC,cAAc,EAAE,cAAc;CAC/B,CAAC,oBAAoB,EAAE,oBAAoB;CAC3C,CAAC,oBAAoB,EAAE,oBAAoB;CAC3C,CAAC,iBAAiB,EAAE,iBAAiB;CACrC,CAAC,gBAAgB,EAAE,gBAAgB;CACnC,CAAC,kBAAkB,EAAE,kBAAkB;CACvC,CAAC,mBAAmB,EAAE,mBAAmB;CACzC,CAAC,iBAAiB,EAAE,iBAAiB;CACrC,CAAC,oBAAoB,EAAE,oBAAoB;CAC3C,CAAC,iBAAiB,EAAE,iBAAiB;CACrC,CAAC,kBAAkB,EAAE,kBAAkB;CACvC,CAAC,iBAAiB,EAAE,iBAAiB;CACrC,CAAC,QAAQ,EAAE,QAAQ;CACnB,CAAC,CAAC,CAAC;;CAEH;CACA;CACA;;CAEA,IAAI,KAAK,GAAG;;CAEZ,CAAC,OAAO,EAAE,KAAK;;CAEf,CAAC,KAAK,EAAE,EAAE;;CAEV,CAAC,GAAG,EAAE,WAAW,GAAG,EAAE,IAAI,GAAG;;CAE7B,EAAE,KAAK,IAAI,CAAC,OAAO,KAAK,KAAK,GAAG,OAAO;;CAEvC;;CAEA,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;;CAE3B,EAAE;;CAEF,CAAC,GAAG,EAAE,WAAW,GAAG,GAAG;;CAEvB,EAAE,KAAK,IAAI,CAAC,OAAO,KAAK,KAAK,GAAG,OAAO;;CAEvC;;CAEA,EAAE,OAAO,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;;CAE3B,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,GAAG,GAAG;;CAE1B,EAAE,OAAO,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;;CAE3B,EAAE;;CAEF,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;;CAElB,EAAE;;CAEF,CAAC,CAAC;;CAEF;CACA;CACA;;CAEA,SAAS,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG;;CAEvD,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC;;CAElB,CAAC,IAAI,SAAS,GAAG,KAAK,CAAC;CACvB,CAAC,IAAI,WAAW,GAAG,CAAC,CAAC;CACrB,CAAC,IAAI,UAAU,GAAG,CAAC,CAAC;CACpB,CAAC,IAAI,WAAW,GAAG,SAAS,CAAC;;CAE7B,CAAC,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;CAC1B,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;CACtB,CAAC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;CAC9B,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;;CAExB,CAAC,IAAI,CAAC,SAAS,GAAG,WAAW,GAAG,GAAG;;CAEnC,EAAE,UAAU,GAAG,CAAC;;CAEhB,EAAE,KAAK,SAAS,KAAK,KAAK,GAAG;;CAE7B,GAAG,KAAK,KAAK,CAAC,OAAO,KAAK,SAAS,GAAG;;CAEtC,IAAI,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;;CAElD,IAAI;;CAEJ,GAAG;;CAEH,EAAE,SAAS,GAAG,IAAI,CAAC;;CAEnB,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,OAAO,GAAG,WAAW,GAAG,GAAG;;CAEjC,EAAE,WAAW,GAAG,CAAC;;CAEjB,EAAE,KAAK,KAAK,CAAC,UAAU,KAAK,SAAS,GAAG;;CAExC,GAAG,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;;CAEpD,GAAG;;CAEH,EAAE,KAAK,WAAW,KAAK,UAAU,GAAG;;CAEpC,GAAG,SAAS,GAAG,KAAK,CAAC;;CAErB,GAAG,KAAK,KAAK,CAAC,MAAM,KAAK,SAAS,GAAG;;CAErC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;;CAEnB,IAAI;;CAEJ,GAAG;;CAEH,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,SAAS,GAAG,WAAW,GAAG,GAAG;;CAEnC,EAAE,KAAK,KAAK,CAAC,OAAO,KAAK,SAAS,GAAG;;CAErC,GAAG,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;;CAExB,GAAG;;CAEH,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,UAAU,GAAG,WAAW,GAAG,GAAG;;CAEpC,EAAE,KAAK,WAAW,GAAG;;CAErB,GAAG,OAAO,WAAW,EAAE,GAAG,EAAE,CAAC;;CAE7B,GAAG;;CAEH,EAAE,OAAO,GAAG,CAAC;;CAEb,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,cAAc,GAAG,WAAW,SAAS,GAAG;;CAE9C,EAAE,WAAW,GAAG,SAAS,CAAC;CAC1B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE,CAAC;;CAEH,CAAC;;CAED,IAAI,qBAAqB,GAAG,IAAI,cAAc,EAAE,CAAC;;CAEjD;CACA;CACA;;CAEA,IAAI,OAAO,GAAG,EAAE,CAAC;;CAEjB,SAAS,UAAU,EAAE,OAAO,GAAG;;CAE/B,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,OAAO,KAAK,SAAS,KAAK,OAAO,GAAG,qBAAqB,CAAC;;CAE5E,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,SAAS,EAAE;;CAErC,CAAC,IAAI,EAAE,WAAW,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG;;CAErD,EAAE,KAAK,GAAG,KAAK,SAAS,GAAG,GAAG,GAAG,EAAE,CAAC;;CAEpC,EAAE,KAAK,IAAI,CAAC,IAAI,KAAK,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;;CAEvD,EAAE,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC;;CAEvC,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC;;CAEnB,EAAE,IAAI,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;;CAEhC,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC;;CAElC,GAAG,UAAU,EAAE,YAAY;;CAE3B,IAAI,KAAK,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC;;CAEnC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;;CAEjC,IAAI,EAAE,CAAC,EAAE,CAAC;;CAEV,GAAG,OAAO,MAAM,CAAC;;CAEjB,GAAG;;CAEH;;CAEA,EAAE,KAAK,OAAO,EAAE,GAAG,EAAE,KAAK,SAAS,GAAG;;CAEtC,GAAG,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE;;CAExB,IAAI,MAAM,EAAE,MAAM;CAClB,IAAI,UAAU,EAAE,UAAU;CAC1B,IAAI,OAAO,EAAE,OAAO;;CAEpB,IAAI,EAAE,CAAC;;CAEP,GAAG,OAAO;;CAEV,GAAG;;CAEH;CACA,EAAE,IAAI,YAAY,GAAG,6BAA6B,CAAC;CACnD,EAAE,IAAI,kBAAkB,GAAG,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC;;CAErD;CACA,EAAE,KAAK,kBAAkB,GAAG;;CAE5B,GAAG,IAAI,QAAQ,GAAG,kBAAkB,EAAE,CAAC,EAAE,CAAC;CAC1C,GAAG,IAAI,QAAQ,GAAG,CAAC,EAAE,kBAAkB,EAAE,CAAC,EAAE,CAAC;CAC7C,GAAG,IAAI,IAAI,GAAG,kBAAkB,EAAE,CAAC,EAAE,CAAC;;CAEtC,GAAG,IAAI,GAAG,MAAM,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC;;CAE5C,GAAG,KAAK,QAAQ,GAAG,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE9C,GAAG,IAAI;;CAEP,IAAI,IAAI,QAAQ,CAAC;CACjB,IAAI,IAAI,YAAY,GAAG,EAAE,IAAI,CAAC,YAAY,IAAI,EAAE,GAAG,WAAW,EAAE,CAAC;;CAEjE,IAAI,SAAS,YAAY;;CAEzB,KAAK,KAAK,aAAa,CAAC;CACxB,KAAK,KAAK,MAAM;;CAEhB,MAAM,IAAI,IAAI,GAAG,IAAI,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAE/C,MAAM,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAE/C,OAAO,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;;CAExC,OAAO;;CAEP,MAAM,KAAK,YAAY,KAAK,MAAM,GAAG;;CAErC,OAAO,QAAQ,GAAG,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC;;CAElE,OAAO,MAAM;;CAEb,OAAO,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;;CAE9B,OAAO;;CAEP,MAAM,MAAM;;CAEZ,KAAK,KAAK,UAAU;;CAEpB,MAAM,IAAI,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;CACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;;CAE1D,MAAM,MAAM;;CAEZ,KAAK,KAAK,MAAM;;CAEhB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;;CAEpC,MAAM,MAAM;;CAEZ,KAAK;;CAEL,MAAM,QAAQ,GAAG,IAAI,CAAC;;CAEtB,MAAM,MAAM;;CAEZ,KAAK;;CAEL;CACA,IAAI,MAAM,CAAC,UAAU,EAAE,YAAY;;CAEnC,KAAK,KAAK,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC;;CAEtC,KAAK,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;;CAElC,KAAK,EAAE,CAAC,EAAE,CAAC;;CAEX,IAAI,CAAC,QAAQ,KAAK,GAAG;;CAErB;CACA,IAAI,MAAM,CAAC,UAAU,EAAE,YAAY;;CAEnC,KAAK,KAAK,OAAO,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC;;CAErC,KAAK,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;CAClC,KAAK,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC;;CAEpC,KAAK,EAAE,CAAC,EAAE,CAAC;;CAEX,IAAI;;CAEJ,GAAG,MAAM;;CAET;;CAEA,GAAG,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAEvB,GAAG,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE;;CAExB,IAAI,MAAM,EAAE,MAAM;CAClB,IAAI,UAAU,EAAE,UAAU;CAC1B,IAAI,OAAO,EAAE,OAAO;;CAEpB,IAAI,EAAE,CAAC;;CAEP,GAAG,IAAI,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;;CAEtC,GAAG,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;;CAEpC,GAAG,OAAO,CAAC,gBAAgB,EAAE,MAAM,EAAE,WAAW,KAAK,GAAG;;CAExD,IAAI,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAEjC,IAAI,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;;CAE/B,IAAI,IAAI,SAAS,GAAG,OAAO,EAAE,GAAG,EAAE,CAAC;;CAEnC,IAAI,OAAO,OAAO,EAAE,GAAG,EAAE,CAAC;;CAE1B,IAAI,KAAK,IAAI,CAAC,MAAM,KAAK,GAAG,GAAG;;CAE/B,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAE5D,MAAM,IAAI,QAAQ,GAAG,SAAS,EAAE,CAAC,EAAE,CAAC;CACpC,MAAM,KAAK,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;;CAEzD,MAAM;;CAEN,KAAK,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;;CAElC,KAAK,MAAM,KAAK,IAAI,CAAC,MAAM,KAAK,CAAC,GAAG;;CAEpC;CACA;;CAEA,KAAK,OAAO,CAAC,IAAI,EAAE,2CAA2C,EAAE,CAAC;;CAEjE,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAE5D,MAAM,IAAI,QAAQ,GAAG,SAAS,EAAE,CAAC,EAAE,CAAC;CACpC,MAAM,KAAK,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;;CAEzD,MAAM;;CAEN,KAAK,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;;CAElC,KAAK,MAAM;;CAEX,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAE5D,MAAM,IAAI,QAAQ,GAAG,SAAS,EAAE,CAAC,EAAE,CAAC;CACpC,MAAM,KAAK,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;;CAExD,MAAM;;CAEN,KAAK,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;CAClC,KAAK,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC;;CAEpC,KAAK;;CAEL,IAAI,EAAE,KAAK,EAAE,CAAC;;CAEd,GAAG,OAAO,CAAC,gBAAgB,EAAE,UAAU,EAAE,WAAW,KAAK,GAAG;;CAE5D,IAAI,IAAI,SAAS,GAAG,OAAO,EAAE,GAAG,EAAE,CAAC;;CAEnC,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAE3D,KAAK,IAAI,QAAQ,GAAG,SAAS,EAAE,CAAC,EAAE,CAAC;CACnC,KAAK,KAAK,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC;;CAE7D,KAAK;;CAEL,IAAI,EAAE,KAAK,EAAE,CAAC;;CAEd,GAAG,OAAO,CAAC,gBAAgB,EAAE,OAAO,EAAE,WAAW,KAAK,GAAG;;CAEzD,IAAI,IAAI,SAAS,GAAG,OAAO,EAAE,GAAG,EAAE,CAAC;;CAEnC,IAAI,OAAO,OAAO,EAAE,GAAG,EAAE,CAAC;;CAE1B,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAE3D,KAAK,IAAI,QAAQ,GAAG,SAAS,EAAE,CAAC,EAAE,CAAC;CACnC,KAAK,KAAK,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;;CAEvD,KAAK;;CAEL,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;CACjC,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC;;CAEnC,IAAI,EAAE,KAAK,EAAE,CAAC;;CAEd,GAAG,KAAK,IAAI,CAAC,YAAY,KAAK,SAAS,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;CACnF,GAAG,KAAK,IAAI,CAAC,eAAe,KAAK,SAAS,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;;CAE5F,GAAG,KAAK,OAAO,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,QAAQ,KAAK,SAAS,GAAG,IAAI,CAAC,QAAQ,GAAG,YAAY,EAAE,CAAC;;CAE1H,GAAG,MAAM,IAAI,MAAM,IAAI,IAAI,CAAC,aAAa,GAAG;;CAE5C,IAAI,OAAO,CAAC,gBAAgB,EAAE,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,CAAC;;CAErE,IAAI;;CAEJ,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAExB,GAAG;;CAEH,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC;;CAEjC,EAAE,OAAO,OAAO,CAAC;;CAEjB,EAAE;;CAEF,CAAC,OAAO,EAAE,WAAW,KAAK,GAAG;;CAE7B,EAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;CACpB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,eAAe,EAAE,WAAW,KAAK,GAAG;;CAErC,EAAE,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;CAC5B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,kBAAkB,EAAE,WAAW,KAAK,GAAG;;CAExC,EAAE,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;CAC/B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,WAAW,EAAE,WAAW,KAAK,GAAG;;CAEjC,EAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;CACxB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,gBAAgB,EAAE,WAAW,KAAK,GAAG;;CAEtC,EAAE,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;CAC7B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;;CAEA,SAAS,uBAAuB,EAAE,OAAO,GAAG;;CAE5C,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,OAAO,KAAK,SAAS,KAAK,OAAO,GAAG,qBAAqB,CAAC;;CAE5E;CACA,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;;CAErB,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,SAAS,EAAE;;CAElD,CAAC,IAAI,EAAE,WAAW,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG;;CAErD,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC;;CAEnB,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC;;CAElB,EAAE,IAAI,OAAO,GAAG,IAAI,iBAAiB,EAAE,CAAC;CACxC,EAAE,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC;;CAEzB,EAAE,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;CAC9C,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;CAC9B,EAAE,MAAM,CAAC,eAAe,EAAE,aAAa,EAAE,CAAC;;CAE1C,EAAE,SAAS,WAAW,EAAE,CAAC,GAAG;;CAE5B,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,WAAW,MAAM,GAAG;;CAE9C,IAAI,IAAI,QAAQ,GAAG,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;CAEjD,IAAI,MAAM,EAAE,CAAC,EAAE,GAAG;CAClB,KAAK,KAAK,EAAE,QAAQ,CAAC,KAAK;CAC1B,KAAK,MAAM,EAAE,QAAQ,CAAC,MAAM;CAC5B,KAAK,MAAM,EAAE,QAAQ,CAAC,MAAM;CAC5B,KAAK,OAAO,EAAE,QAAQ,CAAC,OAAO;CAC9B,KAAK,CAAC;;CAEN,IAAI,MAAM,IAAI,CAAC,CAAC;;CAEhB,IAAI,KAAK,MAAM,KAAK,CAAC,GAAG;;CAExB,KAAK,KAAK,QAAQ,CAAC,WAAW,KAAK,CAAC;CACpC,MAAM,OAAO,CAAC,SAAS,GAAG,YAAY,CAAC;;CAEvC,KAAK,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;CACtC,KAAK,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEhC,KAAK,KAAK,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC;;CAErC,KAAK;;CAEL,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;;CAE5B,GAAG;;CAEH,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG;;CAE9B,GAAG,IAAI,MAAM,GAAG,CAAC,CAAC;;CAElB,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,GAAG;;CAEpD,IAAI,WAAW,EAAE,CAAC,EAAE,CAAC;;CAErB,IAAI;;CAEJ,GAAG,MAAM;;CAET;;CAEA,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,MAAM,GAAG;;CAEzC,IAAI,IAAI,QAAQ,GAAG,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;CAEjD,IAAI,KAAK,QAAQ,CAAC,SAAS,GAAG;;CAE9B,KAAK,IAAI,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC;;CAEhE,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG;;CAExC,MAAM,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;;CAEpC,MAAM,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,GAAG;;CAExD,OAAO,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC,WAAW,GAAG,CAAC,EAAE,EAAE,CAAC;CACpF,OAAO,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;CAC5C,OAAO,MAAM,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;CAC1C,OAAO,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;;CAE5C,OAAO;;CAEP,MAAM;;CAEN,KAAK,MAAM;;CAEX,KAAK,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;CAC1C,KAAK,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;CAC5C,KAAK,OAAO,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;;CAExC,KAAK;;CAEL,IAAI,KAAK,QAAQ,CAAC,WAAW,KAAK,CAAC,GAAG;;CAEtC,KAAK,OAAO,CAAC,SAAS,GAAG,YAAY,CAAC;;CAEtC,KAAK;;CAEL,IAAI,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;CACrC,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;;CAE/B,IAAI,KAAK,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC;;CAEpC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;;CAE5B,GAAG;;CAEH,EAAE,OAAO,OAAO,CAAC;;CAEjB,EAAE;;CAEF,CAAC,OAAO,EAAE,WAAW,KAAK,GAAG;;CAE7B,EAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;CACpB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;;CAEA,SAAS,iBAAiB,EAAE,OAAO,GAAG;;CAEtC,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,OAAO,KAAK,SAAS,KAAK,OAAO,GAAG,qBAAqB,CAAC;;CAE5E;CACA,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;;CAErB,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,SAAS,EAAE;;CAE5C,CAAC,IAAI,EAAE,WAAW,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG;;CAErD,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC;;CAEnB,EAAE,IAAI,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;;CAElC,EAAE,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;CAC9C,EAAE,MAAM,CAAC,eAAe,EAAE,aAAa,EAAE,CAAC;;CAE1C,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,MAAM,GAAG;;CAExC,GAAG,IAAI,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;;CAEzC,GAAG,KAAK,EAAE,OAAO,GAAG,OAAO;;CAE3B,GAAG,KAAK,SAAS,KAAK,OAAO,CAAC,KAAK,GAAG;;CAEtC,IAAI,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;;CAElC,IAAI,MAAM,KAAK,SAAS,KAAK,OAAO,CAAC,IAAI,GAAG;;CAE5C,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;CACxC,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAC1C,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;;CAEtC,IAAI;;CAEJ,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,KAAK,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,GAAG,mBAAmB,CAAC;CACrF,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,KAAK,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,GAAG,mBAAmB,CAAC;;CAErF,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,KAAK,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,GAAG,YAAY,CAAC;CAC1F,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,KAAK,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,GAAG,wBAAwB,CAAC;;CAEtG,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,KAAK,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC;;CAElF,GAAG,KAAK,SAAS,KAAK,OAAO,CAAC,MAAM,GAAG;;CAEvC,IAAI,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;;CAEpC,IAAI;CACJ,GAAG,KAAK,SAAS,KAAK,OAAO,CAAC,IAAI,GAAG;;CAErC,IAAI,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;;CAEhC,IAAI;;CAEJ,GAAG,KAAK,SAAS,KAAK,OAAO,CAAC,OAAO,GAAG;;CAExC,IAAI,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;;CAEtC,IAAI;;CAEJ,GAAG,KAAK,CAAC,KAAK,OAAO,CAAC,WAAW,GAAG;;CAEpC,IAAI,OAAO,CAAC,SAAS,GAAG,YAAY,CAAC;;CAErC,IAAI;;CAEJ,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;;CAE9B,GAAG,KAAK,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;;CAE5C,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;;;CAG3B,EAAE,OAAO,OAAO,CAAC;;CAEjB,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,WAAW,EAAE,OAAO,GAAG;;CAEhC,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,OAAO,KAAK,SAAS,KAAK,OAAO,GAAG,qBAAqB,CAAC;;CAE5E,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,SAAS,EAAE;;CAEtC,CAAC,WAAW,EAAE,WAAW;;CAEzB,CAAC,IAAI,EAAE,WAAW,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG;;CAErD,EAAE,KAAK,GAAG,KAAK,SAAS,GAAG,GAAG,GAAG,EAAE,CAAC;;CAEpC,EAAE,KAAK,IAAI,CAAC,IAAI,KAAK,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;;CAEvD,EAAE,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC;;CAEvC,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC;;CAEnB,EAAE,IAAI,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;;CAEhC,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC;;CAElC,GAAG,UAAU,EAAE,YAAY;;CAE3B,IAAI,KAAK,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC;;CAEnC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;;CAEjC,IAAI,EAAE,CAAC,EAAE,CAAC;;CAEV,GAAG,OAAO,MAAM,CAAC;;CAEjB,GAAG;;CAEH,EAAE,IAAI,KAAK,GAAG,QAAQ,CAAC,eAAe,EAAE,8BAA8B,EAAE,KAAK,EAAE,CAAC;;CAEhF,EAAE,KAAK,CAAC,gBAAgB,EAAE,MAAM,EAAE,YAAY;;CAE9C,GAAG,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;;CAE1B,GAAG,KAAK,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC;;CAEhC,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;;CAEhC,GAAG,EAAE,KAAK,EAAE,CAAC;;CAEb;CACA;;CAEA;;CAEA;CACA;;CAEA,EAAE,KAAK,CAAC,gBAAgB,EAAE,OAAO,EAAE,WAAW,KAAK,GAAG;;CAEtD,GAAG,KAAK,OAAO,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC;;CAEnC,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;CAChC,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC;;CAElC,GAAG,EAAE,KAAK,EAAE,CAAC;;CAEb,EAAE,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,OAAO,GAAG;;CAExC,GAAG,KAAK,IAAI,CAAC,WAAW,KAAK,SAAS,GAAG,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;;CAE9E,GAAG;;CAEH,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC;;CAEjC,EAAE,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC;;CAElB,EAAE,OAAO,KAAK,CAAC;;CAEf,EAAE;;CAEF,CAAC,cAAc,EAAE,WAAW,KAAK,GAAG;;CAEpC,EAAE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;CAC3B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,OAAO,EAAE,WAAW,KAAK,GAAG;;CAE7B,EAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;CACpB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,iBAAiB,EAAE,OAAO,GAAG;;CAEtC,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,OAAO,KAAK,SAAS,KAAK,OAAO,GAAG,qBAAqB,CAAC;;CAE5E,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,SAAS,EAAE;;CAE5C,CAAC,WAAW,EAAE,WAAW;;CAEzB,CAAC,IAAI,EAAE,WAAW,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG;;CAEtD,EAAE,IAAI,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;;CAElC,EAAE,IAAI,MAAM,GAAG,IAAI,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;CAC/C,EAAE,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;CAC5C,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;;CAE9B,EAAE,IAAI,MAAM,GAAG,CAAC,CAAC;;CAEjB,EAAE,SAAS,WAAW,EAAE,CAAC,GAAG;;CAE5B,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,GAAG;;CAE9C,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC;;CAEhC,IAAI,MAAM,GAAG,CAAC;;CAEd,IAAI,KAAK,MAAM,KAAK,CAAC,GAAG;;CAExB,KAAK,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEhC,KAAK,KAAK,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC;;CAErC,KAAK;;CAEL,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;;CAE3B,GAAG;;CAEH,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;;CAE3C,GAAG,WAAW,EAAE,CAAC,EAAE,CAAC;;CAEpB,GAAG;;CAEH,EAAE,OAAO,OAAO,CAAC;;CAEjB,EAAE;;CAEF,CAAC,cAAc,EAAE,WAAW,KAAK,GAAG;;CAEpC,EAAE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;CAC3B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,OAAO,EAAE,WAAW,KAAK,GAAG;;CAE7B,EAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;CACpB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,aAAa,EAAE,OAAO,GAAG;;CAElC,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,OAAO,KAAK,SAAS,KAAK,OAAO,GAAG,qBAAqB,CAAC;;CAE5E,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,SAAS,EAAE;;CAExC,CAAC,WAAW,EAAE,WAAW;;CAEzB,CAAC,IAAI,EAAE,WAAW,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG;;CAErD,EAAE,IAAI,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE9B,EAAE,IAAI,MAAM,GAAG,IAAI,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;CAC/C,EAAE,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;CAC5C,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;;CAE9B,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAEvC,GAAG,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;;CAEzB;CACA,GAAG,IAAI,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,oBAAoB,EAAE,KAAK,CAAC,CAAC;;CAE9F,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;CACpD,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;;CAE9B,GAAG,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE/B,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;;CAEtB,IAAI;;CAEJ,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;;CAE3B,EAAE,OAAO,OAAO,CAAC;;CAEjB,EAAE;;CAEF,CAAC,cAAc,EAAE,WAAW,KAAK,GAAG;;CAEpC,EAAE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;CAC3B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,OAAO,EAAE,WAAW,KAAK,GAAG;;CAE7B,EAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;CACpB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA;CACA;CACA;;CAEA,SAAS,KAAK,GAAG;;CAEjB,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;;CAErB,CAAC,IAAI,CAAC,kBAAkB,GAAG,GAAG,CAAC;;CAE/B,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE;;CAEhC;CACA;;CAEA,CAAC,QAAQ,EAAE,qCAAqC;;CAEhD,EAAE,OAAO,CAAC,IAAI,EAAE,2CAA2C,EAAE,CAAC;CAC9D,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF;CACA;;CAEA,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,cAAc,GAAG;;CAE5C,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC;CACnC,EAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC;;CAE5C,EAAE;;CAEF;;CAEA,CAAC,SAAS,EAAE,WAAW,SAAS,GAAG;;CAEnC,EAAE,KAAK,SAAS,KAAK,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC;;CAE/C,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC;;CAElB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC,GAAG,GAAG;;CAE1C,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,SAAS,EAAE,EAAE,CAAC;;CAEjD,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC;;CAEhB,EAAE;;CAEF;;CAEA,CAAC,eAAe,EAAE,WAAW,SAAS,GAAG;;CAEzC,EAAE,KAAK,SAAS,KAAK,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC;;CAE/C,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC;;CAElB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC,GAAG,GAAG;;CAE1C,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,SAAS,EAAE,EAAE,CAAC;;CAEnD,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC;;CAEhB,EAAE;;CAEF;;CAEA,CAAC,SAAS,EAAE,YAAY;;CAExB,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;CAClC,EAAE,OAAO,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;;CAEvC,EAAE;;CAEF;;CAEA,CAAC,UAAU,EAAE,WAAW,SAAS,GAAG;;CAEpC,EAAE,KAAK,SAAS,KAAK,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC;;CAErE,EAAE,KAAK,IAAI,CAAC,eAAe;CAC3B,KAAK,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,SAAS,GAAG,CAAC,EAAE;CACpD,GAAG,EAAE,IAAI,CAAC,WAAW,GAAG;;CAExB,GAAG,OAAO,IAAI,CAAC,eAAe,CAAC;;CAE/B,GAAG;;CAEH,EAAE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;;CAE3B,EAAE,IAAI,KAAK,GAAG,EAAE,CAAC;CACjB,EAAE,IAAI,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;CACzC,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC;;CAEjB,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;;CAElB,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC,GAAG,GAAG;;CAEtC,GAAG,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC;CAC5C,GAAG,GAAG,IAAI,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;CACrC,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;CACrB,GAAG,IAAI,GAAG,OAAO,CAAC;;CAElB,GAAG;;CAEH,EAAE,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;;CAE/B,EAAE,OAAO,KAAK,CAAC;;CAEf,EAAE;;CAEF,CAAC,gBAAgB,EAAE,YAAY;;CAE/B,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;CAC1B,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;;CAEpB,EAAE;;CAEF;;CAEA,CAAC,cAAc,EAAE,WAAW,CAAC,EAAE,QAAQ,GAAG;;CAE1C,EAAE,IAAI,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;;CAErC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC;;CAEpC,EAAE,IAAI,eAAe,CAAC;;CAEtB,EAAE,KAAK,QAAQ,GAAG;;CAElB,GAAG,eAAe,GAAG,QAAQ,CAAC;;CAE9B,GAAG,MAAM;;CAET,GAAG,eAAe,GAAG,CAAC,GAAG,UAAU,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;;CAE9C,GAAG;;CAEH;;CAEA,EAAE,IAAI,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,GAAG,CAAC,EAAE,UAAU,CAAC;;CAEzC,EAAE,QAAQ,GAAG,IAAI,IAAI,GAAG;;CAExB,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,GAAG,EAAE,IAAI,GAAG,GAAG,KAAK,CAAC,EAAE,CAAC;;CAE9C,GAAG,UAAU,GAAG,UAAU,EAAE,CAAC,EAAE,GAAG,eAAe,CAAC;;CAElD,GAAG,KAAK,UAAU,GAAG,CAAC,GAAG;;CAEzB,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;;CAEhB,IAAI,MAAM,KAAK,UAAU,GAAG,CAAC,GAAG;;CAEhC,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;;CAEjB,IAAI,MAAM;;CAEV,IAAI,IAAI,GAAG,CAAC,CAAC;CACb,IAAI,MAAM;;CAEV;;CAEA,IAAI;;CAEJ,GAAG;;CAEH,EAAE,CAAC,GAAG,IAAI,CAAC;;CAEX,EAAE,KAAK,UAAU,EAAE,CAAC,EAAE,KAAK,eAAe,GAAG;;CAE7C,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;;CAEzB,GAAG;;CAEH;;CAEA,EAAE,IAAI,YAAY,GAAG,UAAU,EAAE,CAAC,EAAE,CAAC;CACrC,EAAE,IAAI,WAAW,GAAG,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;;CAExC,EAAE,IAAI,aAAa,GAAG,WAAW,GAAG,YAAY,CAAC;;CAEjD;;CAEA,EAAE,IAAI,eAAe,GAAG,EAAE,eAAe,GAAG,YAAY,KAAK,aAAa,CAAC;;CAE3E;;CAEA,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,eAAe,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;;CAE/C,EAAE,OAAO,CAAC,CAAC;;CAEX,EAAE;;CAEF;CACA;CACA;CACA;;CAEA,CAAC,UAAU,EAAE,WAAW,CAAC,GAAG;;CAE5B,EAAE,IAAI,KAAK,GAAG,MAAM,CAAC;CACrB,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;CACrB,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;;CAErB;;CAEA,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;CACvB,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;;CAEvB,EAAE,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC;CAChC,EAAE,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC;;CAEhC,EAAE,IAAI,GAAG,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;CACnC,EAAE,OAAO,GAAG,CAAC,SAAS,EAAE,CAAC;;CAEzB,EAAE;;CAEF,CAAC,YAAY,EAAE,WAAW,CAAC,GAAG;;CAE9B,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC;CACnC,EAAE,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;;CAE9B,EAAE;;CAEF,CAAC,mBAAmB,EAAE,WAAW,QAAQ,EAAE,MAAM,GAAG;;CAEpD;;CAEA,EAAE,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE7B,EAAE,IAAI,QAAQ,GAAG,EAAE,CAAC;CACpB,EAAE,IAAI,OAAO,GAAG,EAAE,CAAC;CACnB,EAAE,IAAI,SAAS,GAAG,EAAE,CAAC;;CAErB,EAAE,IAAI,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC;CAC1B,EAAE,IAAI,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE1B,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;;CAElB;;CAEA,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,GAAG,GAAG;;CAErC,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;;CAEpB,GAAG,QAAQ,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC;CAC1C,GAAG,QAAQ,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC;;CAE7B,GAAG;;CAEH;CACA;;CAEA,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CAC/B,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CACjC,EAAE,IAAI,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC;CAC7B,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;CACvC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;CACvC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;;CAEvC,EAAE,KAAK,EAAE,IAAI,GAAG,GAAG;;CAEnB,GAAG,GAAG,GAAG,EAAE,CAAC;CACZ,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEzB,GAAG;;CAEH,EAAE,KAAK,EAAE,IAAI,GAAG,GAAG;;CAEnB,GAAG,GAAG,GAAG,EAAE,CAAC;CACZ,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEzB,GAAG;;CAEH,EAAE,KAAK,EAAE,IAAI,GAAG,GAAG;;CAEnB,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEzB,GAAG;;CAEH,EAAE,GAAG,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,SAAS,EAAE,CAAC;;CAExD,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC;CAClD,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;;;CAG7D;;CAEA,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,GAAG,GAAG;;CAErC,GAAG,OAAO,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;;CAE3C,GAAG,SAAS,EAAE,CAAC,EAAE,GAAG,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;;CAE/C,GAAG,GAAG,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;;CAExD,GAAG,KAAK,GAAG,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,GAAG;;CAExC,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;;CAEpB,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEvF,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,GAAG,CAAC,gBAAgB,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC;;CAEpE,IAAI;;CAEJ,GAAG,SAAS,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE9D,GAAG;;CAEH;;CAEA,EAAE,KAAK,MAAM,KAAK,IAAI,GAAG;;CAEzB,GAAG,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;CACvF,GAAG,KAAK,IAAI,QAAQ,CAAC;;CAErB,GAAG,KAAK,QAAQ,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG;;CAEzF,IAAI,KAAK,GAAG,EAAE,KAAK,CAAC;;CAEpB,IAAI;;CAEJ,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,GAAG,GAAG;;CAEtC;CACA,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,GAAG,CAAC,gBAAgB,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,CAAC;CAClF,IAAI,SAAS,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE/D,IAAI;;CAEJ,GAAG;;CAEH,EAAE,OAAO;CACT,GAAG,QAAQ,EAAE,QAAQ;CACrB,GAAG,OAAO,EAAE,OAAO;CACnB,GAAG,SAAS,EAAE,SAAS;CACvB,GAAG,CAAC;;CAEJ,EAAE;;CAEF,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7C,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,MAAM,GAAG;;CAE3B,EAAE,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;;CAEtD,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,YAAY;;CAErB,EAAE,IAAI,IAAI,GAAG;CACb,GAAG,QAAQ,EAAE;CACb,IAAI,OAAO,EAAE,GAAG;CAChB,IAAI,IAAI,EAAE,OAAO;CACjB,IAAI,SAAS,EAAE,cAAc;CAC7B,IAAI;CACJ,GAAG,CAAC;;CAEJ,EAAE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;CACpD,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;;CAExB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,QAAQ,EAAE,WAAW,IAAI,GAAG;;CAE7B,EAAE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;;CAEpD,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,SAAS,YAAY,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,GAAG;;CAEjG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEpB,CAAC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;;CAE5B,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;CACnB,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;;CAEnB,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,CAAC,CAAC;CAC7B,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,CAAC,CAAC;;CAE7B,CAAC,IAAI,CAAC,WAAW,GAAG,WAAW,IAAI,CAAC,CAAC;CACrC,CAAC,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;;CAE3C,CAAC,IAAI,CAAC,UAAU,GAAG,UAAU,IAAI,KAAK,CAAC;;CAEvC,CAAC,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,CAAC,CAAC;;CAEjC,CAAC;;CAED,YAAY,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;CAC1D,YAAY,CAAC,SAAS,CAAC,WAAW,GAAG,YAAY,CAAC;;CAElD,YAAY,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC;;CAE7C,YAAY,CAAC,SAAS,CAAC,QAAQ,GAAG,WAAW,CAAC,EAAE,cAAc,GAAG;;CAEjE,CAAC,IAAI,KAAK,GAAG,cAAc,IAAI,IAAI,OAAO,EAAE,CAAC;;CAE7C,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;CACzB,CAAC,IAAI,UAAU,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC;CACpD,CAAC,IAAI,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC;;CAE1D;CACA,CAAC,QAAQ,UAAU,GAAG,CAAC,GAAG,UAAU,IAAI,KAAK,CAAC;CAC9C,CAAC,QAAQ,UAAU,GAAG,KAAK,GAAG,UAAU,IAAI,KAAK,CAAC;;CAElD,CAAC,KAAK,UAAU,GAAG,MAAM,CAAC,OAAO,GAAG;;CAEpC,EAAE,KAAK,UAAU,GAAG;;CAEpB,GAAG,UAAU,GAAG,CAAC,CAAC;;CAElB,GAAG,MAAM;;CAET,GAAG,UAAU,GAAG,KAAK,CAAC;;CAEtB,GAAG;;CAEH,EAAE;;CAEF,CAAC,KAAK,IAAI,CAAC,UAAU,KAAK,IAAI,IAAI,EAAE,UAAU,GAAG;;CAEjD,EAAE,KAAK,UAAU,KAAK,KAAK,GAAG;;CAE9B,GAAG,UAAU,GAAG,EAAE,KAAK,CAAC;;CAExB,GAAG,MAAM;;CAET,GAAG,UAAU,GAAG,UAAU,GAAG,KAAK,CAAC;;CAEnC,GAAG;;CAEH,EAAE;;CAEF,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC,GAAG,UAAU,CAAC;CAC/C,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;CACpD,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;;CAEpD,CAAC,KAAK,IAAI,CAAC,SAAS,KAAK,CAAC,GAAG;;CAE7B,EAAE,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;CACvC,EAAE,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;;CAEvC,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;CACvB,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;;CAEvB;CACA,EAAE,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC;CACpC,EAAE,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC;;CAEpC,EAAE;;CAEF,CAAC,OAAO,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE1B,CAAC,CAAC;;CAEF,YAAY,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW,MAAM,GAAG;;CAElD,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE3C,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;CACrB,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;;CAErB,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;CAC/B,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;;CAE/B,CAAC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;CACvC,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;;CAEnC,CAAC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;;CAErC,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;;CAEnC,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;;CAGF,YAAY,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY;;CAE5C,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEhD,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;CACnB,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;;CAEnB,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;CAC7B,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;;CAE7B,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;CACrC,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;;CAEjC,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;;CAEnC,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;;CAEjC,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF,YAAY,CAAC,SAAS,CAAC,QAAQ,GAAG,WAAW,IAAI,GAAG;;CAEpD,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7C,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;CACnB,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;;CAEnB,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;CAC7B,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;;CAE7B,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;CACrC,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;;CAEjC,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;;CAEnC,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;;CAEjC,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF,SAAS,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,GAAG;;CAEzE,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;;CAEzF,CAAC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;;CAExB,CAAC;;CAED,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC;CAC7D,QAAQ,CAAC,SAAS,CAAC,WAAW,GAAG,QAAQ,CAAC;;CAE1C,QAAQ,CAAC,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC;;CAErC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;;CAGA;CACA;CACA;CACA;;CAEA;CACA;CACA;CACA;;CAEA,SAAS,SAAS,GAAG;;CAErB,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;;CAEpC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,CAAC,SAAS,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG;;CAEjC,EAAE,EAAE,GAAG,EAAE,CAAC;CACV,EAAE,EAAE,GAAG,EAAE,CAAC;CACV,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;CACvC,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAEjC,EAAE;;CAEF,CAAC,OAAO;;CAER,EAAE,cAAc,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,GAAG;;CAEvD,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;;CAEhE,GAAG;;CAEH,EAAE,wBAAwB,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG;;CAEvE;CACA,GAAG,IAAI,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,OAAO,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;CAChF,GAAG,IAAI,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,OAAO,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;;CAEhF;CACA,GAAG,EAAE,IAAI,GAAG,CAAC;CACb,GAAG,EAAE,IAAI,GAAG,CAAC;;CAEb,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;;CAE1B,GAAG;;CAEH,EAAE,IAAI,EAAE,WAAW,CAAC,GAAG;;CAEvB,GAAG,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;CAClB,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;CACnB,GAAG,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAE1C,GAAG;;CAEH,EAAE,CAAC;;CAEH,CAAC;;CAED;;CAEA,IAAI,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC;CACxB,IAAIC,IAAE,GAAG,IAAI,SAAS,EAAE,CAAC;CACzB,IAAI,EAAE,GAAG,IAAI,SAAS,EAAE,CAAC;CACzB,IAAI,EAAE,GAAG,IAAI,SAAS,EAAE,CAAC;;CAEzB,SAAS,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG;;CAEhE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEpB,CAAC,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;;CAEhC,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;CAC5B,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,KAAK,CAAC;CAC/B,CAAC,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,aAAa,CAAC;CAC7C,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,GAAG,CAAC;;CAE/B,CAAC;;CAED,gBAAgB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;CAC9D,gBAAgB,CAAC,SAAS,CAAC,WAAW,GAAG,gBAAgB,CAAC;;CAE1D,gBAAgB,CAAC,SAAS,CAAC,kBAAkB,GAAG,IAAI,CAAC;;CAErD,gBAAgB,CAAC,SAAS,CAAC,QAAQ,GAAG,WAAW,CAAC,EAAE,cAAc,GAAG;;CAErE,CAAC,IAAI,KAAK,GAAG,cAAc,IAAI,IAAI,OAAO,EAAE,CAAC;;CAE7C,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;CAC1B,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;;CAEvB,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;CAC7C,CAAC,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;CAChC,CAAC,IAAI,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC;;CAE3B,CAAC,KAAK,IAAI,CAAC,MAAM,GAAG;;CAEpB,EAAE,QAAQ,IAAI,QAAQ,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;;CAEpF,EAAE,MAAM,KAAK,MAAM,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,GAAG,CAAC,GAAG;;CAElD,EAAE,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;CACnB,EAAE,MAAM,GAAG,CAAC,CAAC;;CAEb,EAAE;;CAEF,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;;CAEpB,CAAC,KAAK,IAAI,CAAC,MAAM,IAAI,QAAQ,GAAG,CAAC,GAAG;;CAEpC,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,QAAQ,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;;CAEtC,EAAE,MAAM;;CAER;CACA,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;CAChE,EAAE,EAAE,GAAG,GAAG,CAAC;;CAEX,EAAE;;CAEF,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,GAAG,CAAC,EAAE,CAAC;CAC7B,CAAC,EAAE,GAAG,MAAM,EAAE,EAAE,QAAQ,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;;CAErC,CAAC,KAAK,IAAI,CAAC,MAAM,IAAI,QAAQ,GAAG,CAAC,GAAG,CAAC,GAAG;;CAExC,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,QAAQ,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;;CAEtC,EAAE,MAAM;;CAER;CACA,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;CAC5E,EAAE,EAAE,GAAG,GAAG,CAAC;;CAEX,EAAE;;CAEF,CAAC,KAAK,IAAI,CAAC,SAAS,KAAK,aAAa,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,GAAG;;CAEzE;CACA,EAAE,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,KAAK,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC;CACtD,EAAE,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,iBAAiB,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC;CACxD,EAAE,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,iBAAiB,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC;CACxD,EAAE,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,iBAAiB,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC;;CAExD;CACA,EAAE,KAAK,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;CAC9B,EAAE,KAAK,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;CAC9B,EAAE,KAAK,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;;CAE9B,EAAEA,IAAE,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACvE,EAAE,EAAE,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;CACvE,EAAE,EAAE,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAEvE,EAAE,MAAM,KAAK,IAAI,CAAC,SAAS,KAAK,YAAY,GAAG;;CAE/C,EAAEA,IAAE,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;CAC5D,EAAE,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;CAC5D,EAAE,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;;CAE5D,EAAE;;CAEF,CAAC,KAAK,CAAC,GAAG;CACV,EAAEA,IAAE,CAAC,IAAI,EAAE,MAAM,EAAE;CACnB,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE;CACnB,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE;CACnB,EAAE,CAAC;;CAEH,CAAC,OAAO,KAAK,CAAC;;CAEd,CAAC,CAAC;;CAEF,gBAAgB,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW,MAAM,GAAG;;CAEtD,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE3C,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;;CAElB,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAE1D,EAAE,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;;CAEjC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;;CAEpC,EAAE;;CAEF,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;CAC7B,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;CACnC,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;;CAE/B,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF,gBAAgB,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY;;CAEhD,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEhD,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;;CAElB,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAExD,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;CAC/B,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;;CAEtC,EAAE;;CAEF,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;CAC3B,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;CACjC,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;;CAE7B,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF,gBAAgB,CAAC,SAAS,CAAC,QAAQ,GAAG,WAAW,IAAI,GAAG;;CAExD,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7C,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;;CAElB,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAExD,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;CAC/B,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC;;CAEvD,EAAE;;CAEF,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;CAC3B,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;CACjC,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;;CAE7B,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG;;CAEzC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;CAC5B,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;CAC5B,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;CAChB,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;CACjB,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;;CAEpG,CAAC;;CAED;;CAEA,SAAS,iBAAiB,EAAE,CAAC,EAAE,CAAC,GAAG;;CAEnC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CACf,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;CAElB,CAAC;;CAED,SAAS,iBAAiB,EAAE,CAAC,EAAE,CAAC,GAAG;;CAEnC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;;CAE9B,CAAC;;CAED,SAAS,iBAAiB,EAAE,CAAC,EAAE,CAAC,GAAG;;CAEnC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;CAElB,CAAC;;CAED,SAAS,eAAe,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG;;CAE1C,CAAC,OAAO,iBAAiB,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,iBAAiB,EAAE,CAAC,EAAE,EAAE,EAAE;CAC/D,EAAE,iBAAiB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;;CAE7B,CAAC;;CAED;;CAEA,SAAS,aAAa,EAAE,CAAC,EAAE,CAAC,GAAG;;CAE/B,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CACf,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;CAEtB,CAAC;;CAED,SAAS,aAAa,EAAE,CAAC,EAAE,CAAC,GAAG;;CAE/B,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CACf,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;CAE1B,CAAC;;CAED,SAAS,aAAa,EAAE,CAAC,EAAE,CAAC,GAAG;;CAE/B,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;CAElC,CAAC;;CAED,SAAS,aAAa,EAAE,CAAC,EAAE,CAAC,GAAG;;CAE/B,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;CAEtB,CAAC;;CAED,SAAS,WAAW,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG;;CAE1C,CAAC,OAAO,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE;CAChF,EAAE,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;;CAEzB,CAAC;;CAED,SAAS,gBAAgB,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG;;CAE5C,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEpB,CAAC,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;;CAEhC,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,IAAI,OAAO,EAAE,CAAC;CAC/B,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,IAAI,OAAO,EAAE,CAAC;CAC/B,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,IAAI,OAAO,EAAE,CAAC;CAC/B,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,IAAI,OAAO,EAAE,CAAC;;CAE/B,CAAC;;CAED,gBAAgB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;CAC9D,gBAAgB,CAAC,SAAS,CAAC,WAAW,GAAG,gBAAgB,CAAC;;CAE1D,gBAAgB,CAAC,SAAS,CAAC,kBAAkB,GAAG,IAAI,CAAC;;CAErD,gBAAgB,CAAC,SAAS,CAAC,QAAQ,GAAG,WAAW,CAAC,EAAE,cAAc,GAAG;;CAErE,CAAC,IAAI,KAAK,GAAG,cAAc,IAAI,IAAI,OAAO,EAAE,CAAC;;CAE7C,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;;CAE5D,CAAC,KAAK,CAAC,GAAG;CACV,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;CAC1C,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;CAC1C,EAAE,CAAC;;CAEH,CAAC,OAAO,KAAK,CAAC;;CAEd,CAAC,CAAC;;CAEF,gBAAgB,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW,MAAM,GAAG;;CAEtD,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE3C,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;CAC3B,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;CAC3B,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;CAC3B,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;;CAE3B,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF,gBAAgB,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY;;CAEhD,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEhD,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;CAC7B,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;CAC7B,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;CAC7B,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;;CAE7B,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF,gBAAgB,CAAC,SAAS,CAAC,QAAQ,GAAG,WAAW,IAAI,GAAG;;CAExD,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7C,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;CAC9B,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;CAC9B,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;CAC9B,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;;CAE9B,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF,SAAS,iBAAiB,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG;;CAE7C,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEpB,CAAC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;;CAEjC,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,IAAI,OAAO,EAAE,CAAC;CAC/B,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,IAAI,OAAO,EAAE,CAAC;CAC/B,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,IAAI,OAAO,EAAE,CAAC;CAC/B,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,IAAI,OAAO,EAAE,CAAC;;CAE/B,CAAC;;CAED,iBAAiB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;CAC/D,iBAAiB,CAAC,SAAS,CAAC,WAAW,GAAG,iBAAiB,CAAC;;CAE5D,iBAAiB,CAAC,SAAS,CAAC,mBAAmB,GAAG,IAAI,CAAC;;CAEvD,iBAAiB,CAAC,SAAS,CAAC,QAAQ,GAAG,WAAW,CAAC,EAAE,cAAc,GAAG;;CAEtE,CAAC,IAAI,KAAK,GAAG,cAAc,IAAI,IAAI,OAAO,EAAE,CAAC;;CAE7C,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;;CAE5D,CAAC,KAAK,CAAC,GAAG;CACV,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;CAC1C,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;CAC1C,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;CAC1C,EAAE,CAAC;;CAEH,CAAC,OAAO,KAAK,CAAC;;CAEd,CAAC,CAAC;;CAEF,iBAAiB,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW,MAAM,GAAG;;CAEvD,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE3C,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;CAC3B,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;CAC3B,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;CAC3B,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;;CAE3B,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF,iBAAiB,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY;;CAEjD,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEhD,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;CAC7B,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;CAC7B,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;CAC7B,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;;CAE7B,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF,iBAAiB,CAAC,SAAS,CAAC,QAAQ,GAAG,WAAW,IAAI,GAAG;;CAEzD,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7C,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;CAC9B,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;CAC9B,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;CAC9B,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;;CAE9B,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF,SAAS,SAAS,EAAE,EAAE,EAAE,EAAE,GAAG;;CAE7B,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEpB,CAAC,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;;CAEzB,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,IAAI,OAAO,EAAE,CAAC;CAC/B,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,IAAI,OAAO,EAAE,CAAC;;CAE/B,CAAC;;CAED,SAAS,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;CACvD,SAAS,CAAC,SAAS,CAAC,WAAW,GAAG,SAAS,CAAC;;CAE5C,SAAS,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEvC,SAAS,CAAC,SAAS,CAAC,QAAQ,GAAG,WAAW,CAAC,EAAE,cAAc,GAAG;;CAE9D,CAAC,IAAI,KAAK,GAAG,cAAc,IAAI,IAAI,OAAO,EAAE,CAAC;;CAE7C,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG;;CAEhB,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;;CAExB,EAAE,MAAM;;CAER,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;CACvC,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;;CAE3C,EAAE;;CAEF,CAAC,OAAO,KAAK,CAAC;;CAEd,CAAC,CAAC;;CAEF;;CAEA,SAAS,CAAC,SAAS,CAAC,UAAU,GAAG,WAAW,CAAC,EAAE,cAAc,GAAG;;CAEhE,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC;;CAE3C,CAAC,CAAC;;CAEF,SAAS,CAAC,SAAS,CAAC,UAAU,GAAG,qBAAqB;;CAEtD,CAAC,IAAI,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;;CAE9C,CAAC,OAAO,OAAO,CAAC,SAAS,EAAE,CAAC;;CAE5B,CAAC,CAAC;;CAEF,SAAS,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW,MAAM,GAAG;;CAE/C,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE3C,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;CAC3B,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;;CAE3B,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY;;CAEzC,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEhD,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;CAC7B,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;;CAE7B,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF,SAAS,CAAC,SAAS,CAAC,QAAQ,GAAG,WAAW,IAAI,GAAG;;CAEjD,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7C,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;CAC9B,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;;CAE9B,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF,SAAS,UAAU,EAAE,EAAE,EAAE,EAAE,GAAG;;CAE9B,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEpB,CAAC,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;;CAE1B,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,IAAI,OAAO,EAAE,CAAC;CAC/B,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,IAAI,OAAO,EAAE,CAAC;;CAE/B,CAAC;;CAED,UAAU,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;CACxD,UAAU,CAAC,SAAS,CAAC,WAAW,GAAG,UAAU,CAAC;;CAE9C,UAAU,CAAC,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC;;CAEzC,UAAU,CAAC,SAAS,CAAC,QAAQ,GAAG,WAAW,CAAC,EAAE,cAAc,GAAG;;CAE/D,CAAC,IAAI,KAAK,GAAG,cAAc,IAAI,IAAI,OAAO,EAAE,CAAC;;CAE7C,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG;;CAEhB,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;;CAExB,EAAE,MAAM;;CAER,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;CACvC,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;;CAE3C,EAAE;;CAEF,CAAC,OAAO,KAAK,CAAC;;CAEd,CAAC,CAAC;;CAEF;;CAEA,UAAU,CAAC,SAAS,CAAC,UAAU,GAAG,WAAW,CAAC,EAAE,cAAc,GAAG;;CAEjE,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC;;CAE3C,CAAC,CAAC;;CAEF,UAAU,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW,MAAM,GAAG;;CAEhD,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE3C,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;CAC3B,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;;CAE3B,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY;;CAE1C,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEhD,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;CAC7B,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;;CAE7B,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF,UAAU,CAAC,SAAS,CAAC,QAAQ,GAAG,WAAW,IAAI,GAAG;;CAElD,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7C,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;CAC9B,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;;CAE9B,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF,SAAS,oBAAoB,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG;;CAE5C,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEpB,CAAC,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;;CAEpC,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,IAAI,OAAO,EAAE,CAAC;CAC/B,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,IAAI,OAAO,EAAE,CAAC;CAC/B,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,IAAI,OAAO,EAAE,CAAC;;CAE/B,CAAC;;CAED,oBAAoB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;CAClE,oBAAoB,CAAC,SAAS,CAAC,WAAW,GAAG,oBAAoB,CAAC;;CAElE,oBAAoB,CAAC,SAAS,CAAC,sBAAsB,GAAG,IAAI,CAAC;;CAE7D,oBAAoB,CAAC,SAAS,CAAC,QAAQ,GAAG,WAAW,CAAC,EAAE,cAAc,GAAG;;CAEzE,CAAC,IAAI,KAAK,GAAG,cAAc,IAAI,IAAI,OAAO,EAAE,CAAC;;CAE7C,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;;CAE9C,CAAC,KAAK,CAAC,GAAG;CACV,EAAE,eAAe,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;CACxC,EAAE,eAAe,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;CACxC,EAAE,CAAC;;CAEH,CAAC,OAAO,KAAK,CAAC;;CAEd,CAAC,CAAC;;CAEF,oBAAoB,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW,MAAM,GAAG;;CAE1D,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE3C,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;CAC3B,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;CAC3B,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;;CAE3B,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF,oBAAoB,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY;;CAEpD,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEhD,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;CAC7B,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;CAC7B,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;;CAE7B,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF,oBAAoB,CAAC,SAAS,CAAC,QAAQ,GAAG,WAAW,IAAI,GAAG;;CAE5D,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7C,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;CAC9B,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;CAC9B,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;;CAE9B,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF,SAAS,qBAAqB,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG;;CAE7C,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEpB,CAAC,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;;CAErC,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,IAAI,OAAO,EAAE,CAAC;CAC/B,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,IAAI,OAAO,EAAE,CAAC;CAC/B,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,IAAI,OAAO,EAAE,CAAC;;CAE/B,CAAC;;CAED,qBAAqB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;CACnE,qBAAqB,CAAC,SAAS,CAAC,WAAW,GAAG,qBAAqB,CAAC;;CAEpE,qBAAqB,CAAC,SAAS,CAAC,uBAAuB,GAAG,IAAI,CAAC;;CAE/D,qBAAqB,CAAC,SAAS,CAAC,QAAQ,GAAG,WAAW,CAAC,EAAE,cAAc,GAAG;;CAE1E,CAAC,IAAI,KAAK,GAAG,cAAc,IAAI,IAAI,OAAO,EAAE,CAAC;;CAE7C,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;;CAE9C,CAAC,KAAK,CAAC,GAAG;CACV,EAAE,eAAe,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;CACxC,EAAE,eAAe,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;CACxC,EAAE,eAAe,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;CACxC,EAAE,CAAC;;CAEH,CAAC,OAAO,KAAK,CAAC;;CAEd,CAAC,CAAC;;CAEF,qBAAqB,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW,MAAM,GAAG;;CAE3D,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE3C,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;CAC3B,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;CAC3B,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;;CAE3B,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF,qBAAqB,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY;;CAErD,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEhD,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;CAC7B,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;CAC7B,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;;CAE7B,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF,qBAAqB,CAAC,SAAS,CAAC,QAAQ,GAAG,WAAW,IAAI,GAAG;;CAE7D,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7C,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;CAC9B,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;CAC9B,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;;CAE9B,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF,SAAS,WAAW,EAAE,MAAM,0BAA0B;;CAEtD,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEpB,CAAC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;;CAE3B,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;;CAE5B,CAAC;;CAED,WAAW,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;CACzD,WAAW,CAAC,SAAS,CAAC,WAAW,GAAG,WAAW,CAAC;;CAEhD,WAAW,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC;;CAE3C,WAAW,CAAC,SAAS,CAAC,QAAQ,GAAG,WAAW,CAAC,EAAE,cAAc,GAAG;;CAEhE,CAAC,IAAI,KAAK,GAAG,cAAc,IAAI,IAAI,OAAO,EAAE,CAAC;;CAE7C,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;CAC1B,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC;;CAEnC,CAAC,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;CAChC,CAAC,IAAI,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC;;CAE3B,CAAC,IAAI,EAAE,GAAG,MAAM,EAAE,QAAQ,KAAK,CAAC,GAAG,QAAQ,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;CAC7D,CAAC,IAAI,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC;CAC7B,CAAC,IAAI,EAAE,GAAG,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;CACpF,CAAC,IAAI,EAAE,GAAG,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;;CAEpF,CAAC,KAAK,CAAC,GAAG;CACV,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;CAC9C,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;CAC9C,EAAE,CAAC;;CAEH,CAAC,OAAO,KAAK,CAAC;;CAEd,CAAC,CAAC;;CAEF,WAAW,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW,MAAM,GAAG;;CAEjD,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE3C,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;;CAElB,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAE1D,EAAE,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;;CAEjC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;;CAEpC,EAAE;;CAEF,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY;;CAE3C,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEhD,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;;CAElB,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAExD,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;CAC/B,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;;CAEtC,EAAE;;CAEF,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF,WAAW,CAAC,SAAS,CAAC,QAAQ,GAAG,WAAW,IAAI,GAAG;;CAEnD,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7C,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;;CAElB,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAExD,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;CAC/B,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC;;CAEvD,EAAE;;CAEF,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;;;CAIF,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;CAC3B,CAAC,QAAQ,EAAE,QAAQ;CACnB,CAAC,gBAAgB,EAAE,gBAAgB;CACnC,CAAC,gBAAgB,EAAE,gBAAgB;CACnC,CAAC,iBAAiB,EAAE,iBAAiB;CACrC,CAAC,YAAY,EAAE,YAAY;CAC3B,CAAC,SAAS,EAAE,SAAS;CACrB,CAAC,UAAU,EAAE,UAAU;CACvB,CAAC,oBAAoB,EAAE,oBAAoB;CAC3C,CAAC,qBAAqB,EAAE,qBAAqB;CAC7C,CAAC,WAAW,EAAE,WAAW;CACzB,CAAC,CAAC,CAAC;;CAEH;CACA;CACA;CACA;;CAEA;CACA;CACA;CACA;;CAEA,SAAS,SAAS,GAAG;;CAErB,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEpB,CAAC,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;;CAEzB,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;CAClB,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;;CAExB,CAAC;;CAED,SAAS,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE;;CAEvE,CAAC,WAAW,EAAE,SAAS;;CAEvB,CAAC,GAAG,EAAE,WAAW,KAAK,GAAG;;CAEzB,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;;CAE5B,EAAE;;CAEF,CAAC,SAAS,EAAE,YAAY;;CAExB;CACA,EAAE,IAAI,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;CAClD,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;;CAErE,EAAE,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG;;CAEzC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,CAAC;;CAE7D,GAAG;;CAEH,EAAE;;CAEF;CACA;CACA;;CAEA;CACA;CACA;CACA;;CAEA,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG;;CAE1B,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;CAC/B,EAAE,IAAI,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;CAC5C,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;;CAEZ;;CAEA,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAC,MAAM,GAAG;;CAEpC,GAAG,KAAK,YAAY,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG;;CAEjC,IAAI,IAAI,IAAI,GAAG,YAAY,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;CACrC,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;;CAEjC,IAAI,IAAI,aAAa,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;CAC1C,IAAI,IAAI,CAAC,GAAG,aAAa,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,aAAa,CAAC;;CAE/D,IAAI,OAAO,KAAK,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;;CAEjC,IAAI;;CAEJ,GAAG,CAAC,GAAG,CAAC;;CAER,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd;;CAEA,EAAE;;CAEF;CACA;CACA;;CAEA,CAAC,SAAS,EAAE,YAAY;;CAExB,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;CACpC,EAAE,OAAO,IAAI,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;;CAEjC,EAAE;;CAEF;CACA,CAAC,gBAAgB,EAAE,YAAY;;CAE/B,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;CAC1B,EAAE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;CAC3B,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC;;CAEzB,EAAE;;CAEF;CACA;;CAEA,CAAC,eAAe,EAAE,YAAY;;CAE9B;;CAEA,EAAE,KAAK,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG;;CAE9E,GAAG,OAAO,IAAI,CAAC,YAAY,CAAC;;CAE5B,GAAG;;CAEH;CACA;;CAEA,EAAE,IAAI,OAAO,GAAG,EAAE,EAAE,IAAI,GAAG,CAAC,CAAC;;CAE7B,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEzD,GAAG,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC;CACxC,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAExB,GAAG;;CAEH,EAAE,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;;CAE9B,EAAE,OAAO,OAAO,CAAC;;CAEjB,EAAE;;CAEF,CAAC,eAAe,EAAE,WAAW,SAAS,GAAG;;CAEzC,EAAE,KAAK,SAAS,KAAK,SAAS,GAAG,SAAS,GAAG,EAAE,CAAC;;CAEhD,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC;;CAElB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC,GAAG,GAAG;;CAE1C,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,SAAS,EAAE,EAAE,CAAC;;CAEjD,GAAG;;CAEH,EAAE,KAAK,IAAI,CAAC,SAAS,GAAG;;CAExB,GAAG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE9B,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC;;CAEhB,EAAE;;CAEF,CAAC,SAAS,EAAE,WAAW,SAAS,GAAG;;CAEnC,EAAE,SAAS,GAAG,SAAS,IAAI,EAAE,CAAC;;CAE9B,EAAE,IAAI,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;;CAExB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAEnE,GAAG,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC;CAC3B,GAAG,IAAI,UAAU,GAAG,EAAE,KAAK,IAAI,KAAK,CAAC,cAAc,KAAK,SAAS,GAAG,CAAC;CACrE,MAAM,EAAE,KAAK,IAAI,KAAK,CAAC,WAAW,KAAK,CAAC;CACxC,OAAO,EAAE,KAAK,IAAI,KAAK,CAAC,aAAa,KAAK,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM;CACzE,QAAQ,SAAS,CAAC;;CAElB,GAAG,IAAI,GAAG,GAAG,KAAK,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC;;CAE3C,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAE3C,IAAI,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC;;CAEzB,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS;;CAEjD,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;CACzB,IAAI,IAAI,GAAG,KAAK,CAAC;;CAEjB,IAAI;;CAEJ,GAAG;;CAEH,EAAE,KAAK,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG;;CAEpG,GAAG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE9B,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC;;CAEhB,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,MAAM,GAAG;;CAE3B,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE5C,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;;CAEnB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAE3D,GAAG,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;;CAElC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;;CAErC,GAAG;;CAEH,EAAE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;;CAEpC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,YAAY;;CAErB,EAAE,IAAI,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEjD,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;CAClC,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;;CAEnB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEzD,GAAG,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;CAChC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;;CAEtC,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,QAAQ,EAAE,WAAW,IAAI,GAAG;;CAE7B,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE9C,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;CAClC,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;;CAEnB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEzD,GAAG,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;CAChC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;;CAEpE,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;;CAEA,SAAS,IAAI,EAAE,MAAM,GAAG;;CAExB,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAExB,CAAC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;;CAEpB,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEnC,CAAC,KAAK,MAAM,GAAG;;CAEf,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC;;CAE/B,EAAE;;CAEF,CAAC;;CAED,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,EAAE;;CAEtE,CAAC,WAAW,EAAE,IAAI;;CAElB,CAAC,aAAa,EAAE,WAAW,MAAM,GAAG;;CAEpC,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;;CAE9C,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEpD,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;;CAE/C,GAAG;;CAEH,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC,GAAG;;CAE3B,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEhC,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC,GAAG;;CAE3B,EAAE,IAAI,KAAK,GAAG,IAAI,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;CAC9E,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;;CAE5B,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEhC,EAAE;;CAEF,CAAC,gBAAgB,EAAE,WAAW,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG;;CAEnD,EAAE,IAAI,KAAK,GAAG,IAAI,oBAAoB;CACtC,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;CAC5B,GAAG,IAAI,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE;CAC5B,GAAG,IAAI,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE;CACxB,GAAG,CAAC;;CAEJ,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;;CAE5B,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;;CAElC,EAAE;;CAEF,CAAC,aAAa,EAAE,WAAW,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG;;CAEhE,EAAE,IAAI,KAAK,GAAG,IAAI,gBAAgB;CAClC,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;CAC5B,GAAG,IAAI,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;CAC9B,GAAG,IAAI,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;CAC9B,GAAG,IAAI,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE;CACxB,GAAG,CAAC;;CAEJ,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;;CAE5B,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;;CAElC,EAAE;;CAEF,CAAC,UAAU,EAAE,WAAW,GAAG,uBAAuB;;CAElD,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC;;CAEzD,EAAE,IAAI,KAAK,GAAG,IAAI,WAAW,EAAE,IAAI,EAAE,CAAC;CACtC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;;CAE5B,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC;;CAElD,EAAE;;CAEF,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,GAAG;;CAEvE,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;CAC/B,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;;CAE/B,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO;CACxC,GAAG,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;;CAExC,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,GAAG;;CAE1E,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;;CAElF,EAAE;;CAEF,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,GAAG;;CAE/F,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;CAC/B,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;;CAE/B,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;;CAEvG,EAAE;;CAEF,CAAC,UAAU,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,GAAG;;CAElG,EAAE,IAAI,KAAK,GAAG,IAAI,YAAY,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;;CAE1G,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG;;CAEhC;CACA,GAAG,IAAI,UAAU,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;;CAExC,GAAG,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,GAAG;;CAEnD,IAAI,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;;CAE9C,IAAI;;CAEJ,GAAG;;CAEH,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;;CAE5B,EAAE,IAAI,SAAS,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;CACtC,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;;CAEtC,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,MAAM,GAAG;;CAE3B,EAAE,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAEhD,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC;;CAEhD,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,YAAY;;CAErB,EAAE,IAAI,IAAI,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAErD,EAAE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;;CAElD,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,QAAQ,EAAE,WAAW,IAAI,GAAG;;CAE7B,EAAE,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;CAElD,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;;CAEnD,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;;CAEA;CACA;CACA;CACA;CACA;;CAEA,SAAS,KAAK,EAAE,MAAM,GAAG;;CAEzB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE3B,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;;CAElC,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;;CAErB,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;;CAEjB,CAAC;;CAED,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE;;CAElE,CAAC,WAAW,EAAE,KAAK;;CAEnB,CAAC,cAAc,EAAE,WAAW,SAAS,GAAG;;CAExC,EAAE,IAAI,QAAQ,GAAG,EAAE,CAAC;;CAEpB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAExD,GAAG,QAAQ,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC;;CAE1D,GAAG;;CAEH,EAAE,OAAO,QAAQ,CAAC;;CAElB,EAAE;;CAEF;;CAEA,CAAC,aAAa,EAAE,WAAW,SAAS,GAAG;;CAEvC,EAAE,OAAO;;CAET,GAAG,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE;CACrC,GAAG,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,EAAE;;CAE1C,GAAG,CAAC;;CAEJ,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,MAAM,GAAG;;CAE3B,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE3C,EAAE,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;;CAElB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAE1D,GAAG,IAAI,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;;CAEhC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;;CAEnC,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,YAAY;;CAErB,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEhD,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;CACxB,EAAE,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;;CAElB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAExD,GAAG,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;CAC9B,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;;CAEpC,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,QAAQ,EAAE,WAAW,IAAI,GAAG;;CAE7B,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7C,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;CACxB,EAAE,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;;CAElB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAExD,GAAG,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;CAC9B,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;;CAElD,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;;CAEA,SAAS,KAAK,EAAE,KAAK,EAAE,SAAS,GAAG;;CAEnC,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;;CAErB,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,EAAE,KAAK,EAAE,CAAC;CACjC,CAAC,IAAI,CAAC,SAAS,GAAG,SAAS,KAAK,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC;;CAE1D,CAAC,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;;CAEhC,CAAC;;CAED,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,EAAE;;CAEtE,CAAC,WAAW,EAAE,KAAK;;CAEnB,CAAC,OAAO,EAAE,IAAI;;CAEd,CAAC,IAAI,EAAE,WAAW,MAAM,GAAG;;CAE3B,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE/C,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;CAClC,EAAE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;;CAEpC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,IAAI,GAAG;;CAE3B,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE1D,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;CAC1C,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;;CAEzC,EAAE,KAAK,IAAI,CAAC,WAAW,KAAK,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;;CAE5F,EAAE,KAAK,IAAI,CAAC,QAAQ,KAAK,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;CAC1E,EAAE,KAAK,IAAI,CAAC,KAAK,KAAK,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;CACjE,EAAE,KAAK,IAAI,CAAC,KAAK,KAAK,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;CACjE,EAAE,KAAK,IAAI,CAAC,QAAQ,KAAK,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAE1E,EAAE,KAAK,IAAI,CAAC,MAAM,KAAK,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;;CAE7E,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,eAAe,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,GAAG;;CAE7D,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;;CAEzC,CAAC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;;CAE/B,CAAC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;;CAE7B,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CAC1C,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;;CAErB,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,KAAK,EAAE,WAAW,EAAE,CAAC;;CAE7C,CAAC;;CAED,eAAe,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE;;CAE7E,CAAC,WAAW,EAAE,eAAe;;CAE7B,CAAC,iBAAiB,EAAE,IAAI;;CAExB,CAAC,IAAI,EAAE,WAAW,MAAM,GAAG;;CAE3B,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE5C,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;;CAE9C,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,WAAW,EAAE,MAAM,GAAG;;CAE/B,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;;CAEtB,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;CACf,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;;CAEjB,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAExC,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;CACjB,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE7B,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,SAAS,EAAE;;CAEtC,CAAC,IAAI,EAAE,WAAW,MAAM,GAAG;;CAE3B,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;;CAEtC,EAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;CAC1B,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;;CAE9B,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;;CAEtC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7C,EAAE;;CAEF,CAAC,MAAM,EAAE,YAAY;;CAErB,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC;;CAElB,EAAE,KAAK,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;CACjD,EAAE,KAAK,IAAI,CAAC,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;CACvD,EAAE,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,GAAG,GAAG,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;;CAElG,EAAE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC;CACrD,EAAE,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;;CAE9B,EAAE,OAAO,MAAM,CAAC;;CAEhB,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,eAAe,GAAG;;CAE3B,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,iBAAiB,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;;CAEpE,CAAC;;CAED,eAAe,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,SAAS,EAAE,EAAE;;CAEnF,CAAC,WAAW,EAAE,eAAe;;CAE7B,CAAC,iBAAiB,EAAE,IAAI;;CAExB,CAAC,MAAM,EAAE,WAAW,KAAK,GAAG;;CAE5B,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;CAE3B,EAAE,IAAI,GAAG,GAAG,KAAK,CAAC,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;CAC5C,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;CACxD,EAAE,IAAI,GAAG,GAAG,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC;;CAEzC,EAAE,KAAK,GAAG,KAAK,MAAM,CAAC,GAAG,IAAI,MAAM,KAAK,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,MAAM,CAAC,GAAG,GAAG;;CAE9E,GAAG,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;CACpB,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;CAC1B,GAAG,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;CACpB,GAAG,MAAM,CAAC,sBAAsB,EAAE,CAAC;;CAEnC,GAAG;;CAEH,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,GAAG;;CAEzE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;;CAEtC,CAAC,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;;CAEzB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CAC1C,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;;CAErB,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;;CAE9B,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE;CACvC,EAAE,GAAG,EAAE,YAAY;;CAEnB;CACA;CACA,GAAG,OAAO,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC;;CAEnC,GAAG;CACH,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B;CACA;CACA,GAAG,IAAI,CAAC,SAAS,GAAG,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC;;CAEpC,GAAG;CACH,EAAE,EAAE,CAAC;;CAEL,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,QAAQ,KAAK,SAAS,KAAK,QAAQ,GAAG,CAAC,CAAC;CAC3D,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,KAAK,KAAK,SAAS,KAAK,KAAK,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;CAC5D,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,QAAQ,KAAK,SAAS,KAAK,QAAQ,GAAG,CAAC,CAAC;CAC3D,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,KAAK,KAAK,SAAS,KAAK,KAAK,GAAG,CAAC,CAAC;;CAElD,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;;CAErC,CAAC;;CAED,SAAS,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE;;CAEvE,CAAC,WAAW,EAAE,SAAS;;CAEvB,CAAC,WAAW,EAAE,IAAI;;CAElB,CAAC,IAAI,EAAE,WAAW,MAAM,GAAG;;CAE3B,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE5C,EAAE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;CAClC,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;CAC5B,EAAE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;CAClC,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;;CAE5B,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;;CAEtC,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;;CAEtC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;;CAGA,SAAS,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,GAAG;;CAEzD,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;;CAEtC,CAAC,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;;CAE1B,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE;CACvC,EAAE,GAAG,EAAE,YAAY;;CAEnB;CACA;CACA,GAAG,OAAO,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;;CAEvC,GAAG;CACH,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B;CACA;CACA,GAAG,IAAI,CAAC,SAAS,GAAG,KAAK,KAAK,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;;CAE5C,GAAG;CACH,EAAE,EAAE,CAAC;;CAEL,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,QAAQ,KAAK,SAAS,KAAK,QAAQ,GAAG,CAAC,CAAC;CAC3D,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,KAAK,KAAK,SAAS,KAAK,KAAK,GAAG,CAAC,CAAC;;CAElD,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,WAAW,EAAE,IAAI,iBAAiB,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;;CAE3E,CAAC;;CAED,UAAU,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE;;CAExE,CAAC,WAAW,EAAE,UAAU;;CAExB,CAAC,YAAY,EAAE,IAAI;;CAEnB,CAAC,IAAI,EAAE,WAAW,MAAM,GAAG;;CAE3B,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE5C,EAAE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;CAClC,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;;CAE5B,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;;CAEtC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,sBAAsB,IAAI;;CAEnC,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,kBAAkB,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;;CAE9E,CAAC;;CAED,sBAAsB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,SAAS,EAAE,EAAE;;CAE1F,CAAC,WAAW,EAAE,sBAAsB;;CAEpC,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;;CAEA,SAAS,gBAAgB,EAAE,KAAK,EAAE,SAAS,GAAG;;CAE9C,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;;CAEtC,CAAC,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;;CAEhC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CAC1C,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;;CAErB,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;;CAE9B,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,sBAAsB,EAAE,CAAC;;CAE5C,CAAC;;CAED,gBAAgB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE;;CAE9E,CAAC,WAAW,EAAE,gBAAgB;;CAE9B,CAAC,kBAAkB,EAAE,IAAI;;CAEzB,CAAC,IAAI,EAAE,WAAW,MAAM,GAAG;;CAE3B,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE5C,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;;CAEtC,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;;CAEtC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,YAAY,EAAE,KAAK,EAAE,SAAS,GAAG;;CAE1C,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;;CAEtC,CAAC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;;CAE5B,CAAC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;;CAE7B,CAAC;;CAED,YAAY,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE;;CAE1E,CAAC,WAAW,EAAE,YAAY;;CAE1B,CAAC,cAAc,EAAE,IAAI;;CAErB,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG;;CAE1D,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;;CAEtC,CAAC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;;CAE7B,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,KAAK,KAAK,SAAS,KAAK,KAAK,GAAG,EAAE,CAAC;CACnD,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,MAAM,KAAK,SAAS,KAAK,MAAM,GAAG,EAAE,CAAC;;CAEtD,CAAC;;CAED,aAAa,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE;;CAE3E,CAAC,WAAW,EAAE,aAAa;;CAE3B,CAAC,eAAe,EAAE,IAAI;;CAEtB,CAAC,IAAI,EAAE,WAAW,MAAM,GAAG;;CAE3B,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE5C,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;CAC5B,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;;CAE9B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,IAAI,GAAG;;CAE3B,EAAE,IAAI,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvD,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;CACjC,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;CAEnC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,mBAAmB,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,GAAG;;CAEnE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;;CAEhE,CAAC;;CAED,mBAAmB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,SAAS,EAAE,EAAE;;CAEzF,CAAC,WAAW,EAAE,mBAAmB;;CAEjC,CAAC,aAAa,EAAE,QAAQ;CACxB,CAAC,eAAe,EAAE,KAAK;;CAEvB,CAAC,oBAAoB,EAAE,mBAAmB;;CAE1C,CAAC,8BAA8B,EAAE,SAAS;;CAE1C,CAAC,8BAA8B,EAAE,SAAS;;CAE1C,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,oBAAoB,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG;;CAErD,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;;CAEjD,CAAC;;CAED,oBAAoB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,SAAS,EAAE,EAAE;;CAE1F,CAAC,WAAW,EAAE,oBAAoB;;CAElC,CAAC,aAAa,EAAE,MAAM;CACtB,CAAC,eAAe,EAAE,KAAK;;CAEvB,CAAC,oBAAoB,EAAE,mBAAmB;;CAE1C,CAAC,8BAA8B,EAAE,SAAS;CAC1C,CAAC,8BAA8B,EAAE,SAAS;;CAE1C;CACA;CACA;;CAEA,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,WAAW,EAAE,kBAAkB,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,GAAG;;CAEnF,CAAC,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;CAC9C,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;;CAEvB,CAAC,IAAI,CAAC,YAAY,GAAG,YAAY,KAAK,SAAS;CAC/C,EAAE,YAAY,GAAG,IAAI,YAAY,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC;CAC5D,CAAC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;CAClC,CAAC,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;;CAE7B,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,SAAS,EAAE;;CAEtC,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG;;CAE1B,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,kBAAkB;CAClC,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY;;CAEzB,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE;CAChB,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;;CAErB,EAAE,iBAAiB,EAAE;;CAErB,GAAG,IAAI,EAAE;;CAET,IAAI,IAAI,KAAK,CAAC;;CAEd,IAAI,WAAW,EAAE;;CAEjB;CACA;CACA;CACA;CACA,KAAK,YAAY,EAAE,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG;;CAEvC,MAAM,MAAM,IAAI,QAAQ,GAAG,EAAE,GAAG,CAAC,MAAM;;CAEvC,OAAO,KAAK,EAAE,KAAK,SAAS,GAAG;;CAE/B,QAAQ,KAAK,CAAC,GAAG,EAAE,GAAG,MAAM,YAAY,CAAC;;CAEzC;;CAEA,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC;CACvB,QAAQ,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;CAC/B,QAAQ,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;;CAE/C,QAAQ;;CAER,OAAO,KAAK,EAAE,KAAK,QAAQ,GAAG,MAAM;;CAEpC,OAAO,EAAE,GAAG,EAAE,CAAC;CACf,OAAO,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC;;CAExB,OAAO,KAAK,CAAC,GAAG,EAAE,GAAG;;CAErB;CACA,QAAQ,MAAM,IAAI,CAAC;;CAEnB,QAAQ;;CAER,OAAO;;CAEP;CACA,MAAM,KAAK,GAAG,EAAE,CAAC,MAAM,CAAC;CACxB,MAAM,MAAM,WAAW,CAAC;;CAExB,MAAM;;CAEN;CACA;CACA,KAAK,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG;;CAE1B;;CAEA,MAAM,IAAI,QAAQ,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;;CAE7B,MAAM,KAAK,CAAC,GAAG,QAAQ,GAAG;;CAE1B,OAAO,EAAE,GAAG,CAAC,CAAC;CACd,OAAO,EAAE,GAAG,QAAQ,CAAC;;CAErB,OAAO;;CAEP;;CAEA,MAAM,MAAM,IAAI,QAAQ,GAAG,EAAE,GAAG,CAAC,MAAM;;CAEvC,OAAO,KAAK,EAAE,KAAK,SAAS,GAAG;;CAE/B;;CAEA,QAAQ,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;CAC9B,QAAQ,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;;CAE7C,QAAQ;;CAER,OAAO,KAAK,EAAE,KAAK,QAAQ,GAAG,MAAM;;CAEpC,OAAO,EAAE,GAAG,EAAE,CAAC;CACf,OAAO,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;;CAE5B,OAAO,KAAK,CAAC,IAAI,EAAE,GAAG;;CAEtB;CACA,QAAQ,MAAM,IAAI,CAAC;;CAEnB,QAAQ;;CAER,OAAO;;CAEP;CACA,MAAM,KAAK,GAAG,EAAE,CAAC;CACjB,MAAM,EAAE,GAAG,CAAC,CAAC;CACb,MAAM,MAAM,WAAW,CAAC;;CAExB,MAAM;;CAEN;;CAEA,KAAK,MAAM,iBAAiB,CAAC;;CAE7B,KAAK;;CAEL;;CAEA,IAAI,QAAQ,EAAE,GAAG,KAAK,GAAG;;CAEzB,KAAK,IAAI,GAAG,GAAG,EAAE,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC;;CAEpC,KAAK,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG;;CAE1B,MAAM,KAAK,GAAG,GAAG,CAAC;;CAElB,MAAM,MAAM;;CAEZ,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;;CAEnB,MAAM;;CAEN,KAAK;;CAEL,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;CAClB,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;;CAEtB;;CAEA,IAAI,KAAK,EAAE,KAAK,SAAS,GAAG;;CAE5B,KAAK,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;CAC3B,KAAK,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;;CAE1C,KAAK;;CAEL,IAAI,KAAK,EAAE,KAAK,SAAS,GAAG;;CAE5B,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC;CACpB,KAAK,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;CAC5B,KAAK,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;;CAE5C,KAAK;;CAEL,IAAI;;CAEJ,GAAG,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;;CAE1B,GAAG,IAAI,CAAC,gBAAgB,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;;CAEvC,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;;CAE5C,EAAE;;CAEF,CAAC,QAAQ,EAAE,IAAI;CACf;;CAEA;;CAEA,CAAC,gBAAgB,EAAE,EAAE;;CAErB,CAAC,YAAY,EAAE,YAAY;;CAE3B,EAAE,OAAO,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,gBAAgB,CAAC;;CAEhD,EAAE;;CAEF,CAAC,gBAAgB,EAAE,WAAW,KAAK,GAAG;;CAEtC;;CAEA,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,YAAY;CAChC,GAAG,MAAM,GAAG,IAAI,CAAC,YAAY;CAC7B,GAAG,MAAM,GAAG,IAAI,CAAC,SAAS;CAC1B,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;;CAE3B,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,MAAM,EAAE,GAAG,CAAC,GAAG;;CAExC,GAAG,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;;CAEtC,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC;;CAEhB,EAAE;;CAEF;;CAEA,CAAC,YAAY,EAAE,iCAAiC;;CAEhD,EAAE,MAAM,IAAI,KAAK,EAAE,yBAAyB,EAAE,CAAC;CAC/C;;CAEA,EAAE;;CAEF,CAAC,gBAAgB,EAAE,8BAA8B;;CAEjD;;CAEA,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,SAAS,EAAE;;CAEtC;CACA,CAAC,YAAY,EAAE,WAAW,CAAC,SAAS,CAAC,gBAAgB;;CAErD;CACA,CAAC,SAAS,EAAE,WAAW,CAAC,SAAS,CAAC,gBAAgB;;CAElD,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;;CAEA,SAAS,2BAA2B,EAAE,kBAAkB,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,GAAG;;CAEnG,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;;CAEtF,CAAC;;CAED,2BAA2B,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,SAAS,EAAE,EAAE;;CAE/F,CAAC,WAAW,EAAE,2BAA2B;;CAEzC,CAAC,YAAY,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG;;CAE1C,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,YAAY;CAChC,GAAG,MAAM,GAAG,IAAI,CAAC,YAAY;CAC7B,GAAG,MAAM,GAAG,IAAI,CAAC,SAAS;;CAE1B,GAAG,MAAM,GAAG,EAAE,GAAG,MAAM;;CAEvB,GAAG,KAAK,GAAG,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC;;CAEpC,EAAE,MAAM,IAAI,GAAG,GAAG,MAAM,GAAG,MAAM,EAAE,MAAM,KAAK,GAAG,EAAE,MAAM,IAAI,CAAC,GAAG;;CAEjE,GAAG,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;;CAErF,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC;;CAEhB,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,uBAAuB,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,GAAG;;CAEvE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;;CAEhE,CAAC;;CAED,uBAAuB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,SAAS,EAAE,EAAE;;CAE7F,CAAC,WAAW,EAAE,uBAAuB;;CAErC,CAAC,aAAa,EAAE,YAAY;;CAE5B;;CAEA,CAAC,oBAAoB,EAAE,iBAAiB;;CAExC,CAAC,8BAA8B,EAAE,WAAW,MAAM,GAAG;;CAErD,EAAE,OAAO,IAAI,2BAA2B,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,CAAC;;CAEjG,EAAE;;CAEF,CAAC,8BAA8B,EAAE,SAAS;;CAE1C,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,kBAAkB,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,GAAG;;CAElE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;;CAEhE,CAAC;;CAED,kBAAkB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,SAAS,EAAE,EAAE;;CAExF,CAAC,WAAW,EAAE,kBAAkB;;CAEhC,CAAC,aAAa,EAAE,OAAO;;CAEvB;;CAEA;;CAEA;CACA;;CAEA,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,mBAAmB,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,GAAG;;CAEnE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;;CAEhE,CAAC;;CAED,mBAAmB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,SAAS,EAAE,EAAE;;CAEzF,CAAC,WAAW,EAAE,mBAAmB;;CAEjC,CAAC,aAAa,EAAE,QAAQ;;CAExB;;CAEA;;CAEA,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,gBAAgB,EAAE,kBAAkB,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,GAAG;;CAExF,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;;CAEtF,CAAC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;CACxB,CAAC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;CACxB,CAAC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;CACxB,CAAC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;;CAExB,CAAC;;CAED,gBAAgB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,SAAS,EAAE,EAAE;;CAEpF,CAAC,WAAW,EAAE,gBAAgB;;CAE9B,CAAC,gBAAgB,EAAE;;CAEnB,EAAE,WAAW,EAAE,mBAAmB;CAClC,EAAE,SAAS,EAAE,mBAAmB;;CAEhC,EAAE;;CAEF,CAAC,gBAAgB,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG;;CAE3C,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,kBAAkB;CAClC,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC;CACjB,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC;;CAEjB,GAAG,KAAK,GAAG,EAAE,EAAE,KAAK,EAAE;CACtB,GAAG,KAAK,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC;;CAEvB,EAAE,KAAK,KAAK,KAAK,SAAS,GAAG;;CAE7B,GAAG,SAAS,IAAI,CAAC,YAAY,EAAE,CAAC,WAAW;;CAE3C,IAAI,KAAK,eAAe;;CAExB;CACA,KAAK,KAAK,GAAG,EAAE,CAAC;CAChB,KAAK,KAAK,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;;CAEzB,KAAK,MAAM;;CAEX,IAAI,KAAK,gBAAgB;;CAEzB;CACA,KAAK,KAAK,GAAG,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;CAC3B,KAAK,KAAK,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;;CAEhD,KAAK,MAAM;;CAEX,IAAI;;CAEJ;CACA,KAAK,KAAK,GAAG,EAAE,CAAC;CAChB,KAAK,KAAK,GAAG,EAAE,CAAC;;CAEhB,IAAI;;CAEJ,GAAG;;CAEH,EAAE,KAAK,KAAK,KAAK,SAAS,GAAG;;CAE7B,GAAG,SAAS,IAAI,CAAC,YAAY,EAAE,CAAC,SAAS;;CAEzC,IAAI,KAAK,eAAe;;CAExB;CACA,KAAK,KAAK,GAAG,EAAE,CAAC;CAChB,KAAK,KAAK,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;;CAEzB,KAAK,MAAM;;CAEX,IAAI,KAAK,gBAAgB;;CAEzB;CACA,KAAK,KAAK,GAAG,CAAC,CAAC;CACf,KAAK,KAAK,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;;CAEpC,KAAK,MAAM;;CAEX,IAAI;;CAEJ;CACA,KAAK,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC;CACpB,KAAK,KAAK,GAAG,EAAE,CAAC;;CAEhB,IAAI;;CAEJ,GAAG;;CAEH,EAAE,IAAI,MAAM,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,GAAG;CAChC,GAAG,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC;;CAE3B,EAAE,IAAI,CAAC,WAAW,GAAG,MAAM,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC;CAC7C,EAAE,IAAI,CAAC,WAAW,GAAG,MAAM,KAAK,KAAK,GAAG,EAAE,EAAE,CAAC;CAC7C,EAAE,IAAI,CAAC,WAAW,GAAG,KAAK,GAAG,MAAM,CAAC;CACpC,EAAE,IAAI,CAAC,WAAW,GAAG,KAAK,GAAG,MAAM,CAAC;;CAEpC,EAAE;;CAEF,CAAC,YAAY,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG;;CAE1C,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,YAAY;CAChC,GAAG,MAAM,GAAG,IAAI,CAAC,YAAY;CAC7B,GAAG,MAAM,GAAG,IAAI,CAAC,SAAS;;CAE1B,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM;CACtC,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW;CAChD,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,GAAG,IAAI,CAAC,WAAW;;CAE/C,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE;CAC/B,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC;CACb,GAAG,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;;CAEhB;;CAEA,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;CAC7C,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;CAC/E,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,KAAK,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;CAC5D,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;;CAE9B;;CAEA,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,MAAM,EAAE,GAAG,CAAC,GAAG;;CAExC,GAAG,MAAM,EAAE,CAAC,EAAE;CACd,KAAK,EAAE,GAAG,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE;CAC1B,KAAK,EAAE,GAAG,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE;CAC1B,KAAK,EAAE,GAAG,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE;CAC1B,KAAK,EAAE,GAAG,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;;CAE3B,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC;;CAEhB,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,iBAAiB,EAAE,kBAAkB,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,GAAG;;CAEzF,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;;CAEtF,CAAC;;CAED,iBAAiB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,SAAS,EAAE,EAAE;;CAErF,CAAC,WAAW,EAAE,iBAAiB;;CAE/B,CAAC,YAAY,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG;;CAE1C,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,YAAY;CAChC,GAAG,MAAM,GAAG,IAAI,CAAC,YAAY;CAC7B,GAAG,MAAM,GAAG,IAAI,CAAC,SAAS;;CAE1B,GAAG,OAAO,GAAG,EAAE,GAAG,MAAM;CACxB,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM;;CAE7B,GAAG,OAAO,GAAG,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE;CACrC,GAAG,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC;;CAEzB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,MAAM,EAAE,GAAG,CAAC,GAAG;;CAExC,GAAG,MAAM,EAAE,CAAC,EAAE;CACd,KAAK,MAAM,EAAE,OAAO,GAAG,CAAC,EAAE,GAAG,OAAO;CACpC,KAAK,MAAM,EAAE,OAAO,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;;CAErC,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC;;CAEhB,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,mBAAmB,EAAE,kBAAkB,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,GAAG;;CAE3F,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;;CAEtF,CAAC;;CAED,mBAAmB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,SAAS,EAAE,EAAE;;CAEvF,CAAC,WAAW,EAAE,mBAAmB;;CAEjC,CAAC,YAAY,EAAE,WAAW,EAAE,oBAAoB;;CAEhD,EAAE,OAAO,IAAI,CAAC,gBAAgB,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;;CAEzC,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;;CAEA,IAAI,cAAc,GAAG;;CAErB;CACA,CAAC,UAAU,EAAE,WAAW,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG;;CAE1C,EAAE,KAAK,cAAc,CAAC,YAAY,EAAE,KAAK,EAAE,GAAG;;CAE9C;CACA;CACA,GAAG,OAAO,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,KAAK,SAAS,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;;CAEhG,GAAG;;CAEH,EAAE,OAAO,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;;CAEjC,EAAE;;CAEF;CACA,CAAC,YAAY,EAAE,WAAW,KAAK,EAAE,IAAI,EAAE,UAAU,GAAG;;CAEpD,EAAE,KAAK,EAAE,KAAK;CACd,IAAI,EAAE,UAAU,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI,GAAG,OAAO,KAAK,CAAC;;CAE9D,EAAE,KAAK,OAAO,IAAI,CAAC,iBAAiB,KAAK,QAAQ,GAAG;;CAEpD,GAAG,OAAO,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC;;CAE5B,GAAG;;CAEH,EAAE,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;;CAE7C,EAAE;;CAEF,CAAC,YAAY,EAAE,WAAW,MAAM,GAAG;;CAEnC,EAAE,OAAO,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE;CACrC,IAAI,IAAI,MAAM,YAAY,QAAQ,EAAE,CAAC;;CAErC,EAAE;;CAEF;CACA,CAAC,gBAAgB,EAAE,WAAW,KAAK,GAAG;;CAEtC,EAAE,SAAS,WAAW,EAAE,CAAC,EAAE,CAAC,GAAG;;CAE/B,GAAG,OAAO,KAAK,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;;CAElC,GAAG;;CAEH,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;CACvB,EAAE,IAAI,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC,EAAE,CAAC;CAC9B,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;;CAEnD,EAAE,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC;;CAE7B,EAAE,OAAO,MAAM,CAAC;;CAEhB,EAAE;;CAEF;CACA,CAAC,WAAW,EAAE,WAAW,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG;;CAEjD,EAAE,IAAI,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;CAC9B,EAAE,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC;;CAEjD,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,SAAS,GAAG,CAAC,EAAE,SAAS,KAAK,OAAO,EAAE,GAAG,CAAC,GAAG;;CAEhE,GAAG,IAAI,SAAS,GAAG,KAAK,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC;;CAEvC,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,MAAM,EAAE,GAAG,CAAC,GAAG;;CAEzC,IAAI,MAAM,EAAE,SAAS,GAAG,EAAE,GAAG,MAAM,EAAE,SAAS,GAAG,CAAC,EAAE,CAAC;;CAErD,IAAI;;CAEJ,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC;;CAEhB,EAAE;;CAEF;CACA,CAAC,WAAW,EAAE,WAAW,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,GAAG;;CAEtE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,QAAQ,EAAE,CAAC,EAAE,CAAC;;CAEjC,EAAE,QAAQ,GAAG,KAAK,SAAS,IAAI,GAAG,EAAE,iBAAiB,EAAE,KAAK,SAAS,GAAG;;CAExE,GAAG,GAAG,GAAG,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC;;CAE1B,GAAG;;CAEH,EAAE,KAAK,GAAG,KAAK,SAAS,GAAG,OAAO;;CAElC,EAAE,IAAI,KAAK,GAAG,GAAG,EAAE,iBAAiB,EAAE,CAAC;CACvC,EAAE,KAAK,KAAK,KAAK,SAAS,GAAG,OAAO;;CAEpC,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG;;CAEhC,GAAG,GAAG;;CAEN,IAAI,KAAK,GAAG,GAAG,EAAE,iBAAiB,EAAE,CAAC;;CAErC,IAAI,KAAK,KAAK,KAAK,SAAS,GAAG;;CAE/B,KAAK,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;CAC5B,KAAK,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;;CAExC,KAAK;;CAEL,IAAI,GAAG,GAAG,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC;;CAE3B,IAAI,SAAS,GAAG,KAAK,SAAS,GAAG;;CAEjC,GAAG,MAAM,KAAK,KAAK,CAAC,OAAO,KAAK,SAAS,GAAG;;CAE5C;;CAEA,GAAG,GAAG;;CAEN,IAAI,KAAK,GAAG,GAAG,EAAE,iBAAiB,EAAE,CAAC;;CAErC,IAAI,KAAK,KAAK,KAAK,SAAS,GAAG;;CAE/B,KAAK,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;CAC5B,KAAK,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;;CAE5C,KAAK;;CAEL,IAAI,GAAG,GAAG,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC;;CAE3B,IAAI,SAAS,GAAG,KAAK,SAAS,GAAG;;CAEjC,GAAG,MAAM;;CAET;;CAEA,GAAG,GAAG;;CAEN,IAAI,KAAK,GAAG,GAAG,EAAE,iBAAiB,EAAE,CAAC;;CAErC,IAAI,KAAK,KAAK,KAAK,SAAS,GAAG;;CAE/B,KAAK,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;CAC5B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;;CAE1B,KAAK;;CAEL,IAAI,GAAG,GAAG,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC;;CAE3B,IAAI,SAAS,GAAG,KAAK,SAAS,GAAG;;CAEjC,GAAG;;CAEH,EAAE;;CAEF,CAAC,CAAC;;CAEF;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,aAAa,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,GAAG;;CAE7D,CAAC,KAAK,IAAI,KAAK,SAAS,GAAG,MAAM,IAAI,KAAK,EAAE,8CAA8C,EAAE,CAAC;CAC7F,CAAC,KAAK,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,mDAAmD,GAAG,IAAI,EAAE,CAAC;;CAEhI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;;CAElB,CAAC,IAAI,CAAC,KAAK,GAAG,cAAc,CAAC,YAAY,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;CACxE,CAAC,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC;;CAE3E,CAAC,IAAI,CAAC,gBAAgB,EAAE,aAAa,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;;CAErE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;CACjB,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;;CAEjB,CAAC;;CAED;;CAEA,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE;;CAE9B;CACA;;CAEA,CAAC,KAAK,EAAE,WAAW,IAAI,GAAG;;CAE1B,EAAE,KAAK,IAAI,CAAC,IAAI,KAAK,SAAS,GAAG;;CAEjC,GAAG,MAAM,IAAI,KAAK,EAAE,0DAA0D,EAAE,CAAC;;CAEjF,GAAG;;CAEH,EAAE,IAAI,SAAS,GAAG,aAAa,CAAC,6BAA6B,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;;CAE3E,EAAE,KAAK,IAAI,CAAC,KAAK,KAAK,SAAS,GAAG;;CAElC,GAAG,IAAI,KAAK,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;;CAE/B,GAAG,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;;CAEnE,GAAG,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;CACtB,GAAG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;;CAExB,GAAG;;CAEH;CACA,EAAE,KAAK,SAAS,CAAC,KAAK,KAAK,SAAS,GAAG;;CAEvC,GAAG,OAAO,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;;CAElC,GAAG,MAAM;;CAET;CACA,GAAG,OAAO,IAAI,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;;CAElF,GAAG;;CAEH,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,KAAK,GAAG;;CAE5B,EAAE,IAAI,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC;;CAEpC,EAAE,IAAI,IAAI,CAAC;;CAEX;CACA,EAAE,KAAK,SAAS,CAAC,MAAM,KAAK,SAAS,GAAG;;CAExC,GAAG,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;;CAEpC,GAAG,MAAM;;CAET;CACA,GAAG,IAAI,GAAG;;CAEV,IAAI,MAAM,EAAE,KAAK,CAAC,IAAI;CACtB,IAAI,OAAO,EAAE,cAAc,CAAC,YAAY,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE;CAC9D,IAAI,QAAQ,EAAE,cAAc,CAAC,YAAY,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE;;CAEhE,IAAI,CAAC;;CAEL,GAAG,IAAI,aAAa,GAAG,KAAK,CAAC,gBAAgB,EAAE,CAAC;;CAEhD,GAAG,KAAK,aAAa,KAAK,KAAK,CAAC,oBAAoB,GAAG;;CAEvD,IAAI,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;;CAEvC,IAAI;;CAEJ,GAAG;;CAEH,EAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC;;CAElC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,6BAA6B,EAAE,WAAW,QAAQ,GAAG;;CAEtD,EAAE,SAAS,QAAQ,CAAC,WAAW,EAAE;;CAEjC,GAAG,KAAK,QAAQ,CAAC;CACjB,GAAG,KAAK,QAAQ,CAAC;CACjB,GAAG,KAAK,OAAO,CAAC;CAChB,GAAG,KAAK,QAAQ,CAAC;CACjB,GAAG,KAAK,SAAS;;CAEjB,IAAI,OAAO,mBAAmB,CAAC;;CAE/B,GAAG,KAAK,QAAQ,CAAC;CACjB,GAAG,KAAK,SAAS,CAAC;CAClB,GAAG,KAAK,SAAS,CAAC;CAClB,GAAG,KAAK,SAAS;;CAEjB,IAAI,OAAO,mBAAmB,CAAC;;CAE/B,GAAG,KAAK,OAAO;;CAEf,IAAI,OAAO,kBAAkB,CAAC;;CAE9B,GAAG,KAAK,YAAY;;CAEpB,IAAI,OAAO,uBAAuB,CAAC;;CAEnC,GAAG,KAAK,MAAM,CAAC;CACf,GAAG,KAAK,SAAS;;CAEjB,IAAI,OAAO,oBAAoB,CAAC;;CAEhC,GAAG,KAAK,QAAQ;;CAEhB,IAAI,OAAO,mBAAmB,CAAC;;CAE/B,GAAG;;CAEH,EAAE,MAAM,IAAI,KAAK,EAAE,6CAA6C,GAAG,QAAQ,EAAE,CAAC;;CAE9E,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,SAAS,EAAE;;CAExC,CAAC,WAAW,EAAE,aAAa;;CAE3B,CAAC,cAAc,EAAE,YAAY;;CAE7B,CAAC,eAAe,EAAE,YAAY;;CAE9B,CAAC,oBAAoB,EAAE,iBAAiB;;CAExC,CAAC,gCAAgC,EAAE,WAAW,MAAM,GAAG;;CAEvD,EAAE,OAAO,IAAI,mBAAmB,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,CAAC;;CAEzF,EAAE;;CAEF,CAAC,8BAA8B,EAAE,WAAW,MAAM,GAAG;;CAErD,EAAE,OAAO,IAAI,iBAAiB,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,CAAC;;CAEvF,EAAE;;CAEF,CAAC,8BAA8B,EAAE,WAAW,MAAM,GAAG;;CAErD,EAAE,OAAO,IAAI,gBAAgB,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,CAAC;;CAEtF,EAAE;;CAEF,CAAC,gBAAgB,EAAE,WAAW,aAAa,GAAG;;CAE9C,EAAE,IAAI,aAAa,CAAC;;CAEpB,EAAE,SAAS,aAAa;;CAExB,GAAG,KAAK,mBAAmB;;CAE3B,IAAI,aAAa,GAAG,IAAI,CAAC,gCAAgC,CAAC;;CAE1D,IAAI,MAAM;;CAEV,GAAG,KAAK,iBAAiB;;CAEzB,IAAI,aAAa,GAAG,IAAI,CAAC,8BAA8B,CAAC;;CAExD,IAAI,MAAM;;CAEV,GAAG,KAAK,iBAAiB;;CAEzB,IAAI,aAAa,GAAG,IAAI,CAAC,8BAA8B,CAAC;;CAExD,IAAI,MAAM;;CAEV,GAAG;;CAEH,EAAE,KAAK,aAAa,KAAK,SAAS,GAAG;;CAErC,GAAG,IAAI,OAAO,GAAG,gCAAgC;CACjD,IAAI,IAAI,CAAC,aAAa,GAAG,wBAAwB,GAAG,IAAI,CAAC,IAAI,CAAC;;CAE9D,GAAG,KAAK,IAAI,CAAC,iBAAiB,KAAK,SAAS,GAAG;;CAE/C;CACA,IAAI,KAAK,aAAa,KAAK,IAAI,CAAC,oBAAoB,GAAG;;CAEvD,KAAK,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,oBAAoB,EAAE,CAAC;;CAExD,KAAK,MAAM;;CAEX,KAAK,MAAM,IAAI,KAAK,EAAE,OAAO,EAAE,CAAC;;CAEhC,KAAK;;CAEL,IAAI;;CAEJ,GAAG,OAAO,CAAC,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,CAAC;CACnD,GAAG,OAAO;;CAEV,GAAG;;CAEH,EAAE,IAAI,CAAC,iBAAiB,GAAG,aAAa,CAAC;;CAEzC,EAAE;;CAEF,CAAC,gBAAgB,EAAE,YAAY;;CAE/B,EAAE,SAAS,IAAI,CAAC,iBAAiB;;CAEjC,GAAG,KAAK,IAAI,CAAC,gCAAgC;;CAE7C,IAAI,OAAO,mBAAmB,CAAC;;CAE/B,GAAG,KAAK,IAAI,CAAC,8BAA8B;;CAE3C,IAAI,OAAO,iBAAiB,CAAC;;CAE7B,GAAG,KAAK,IAAI,CAAC,8BAA8B;;CAE3C,IAAI,OAAO,iBAAiB,CAAC;;CAE7B,GAAG;;CAEH,EAAE;;CAEF,CAAC,YAAY,EAAE,YAAY;;CAE3B,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;;CAEhD,EAAE;;CAEF;CACA,CAAC,KAAK,EAAE,WAAW,UAAU,GAAG;;CAEhC,EAAE,KAAK,UAAU,KAAK,GAAG,GAAG;;CAE5B,GAAG,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;;CAE1B,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAEtD,IAAI,KAAK,EAAE,CAAC,EAAE,IAAI,UAAU,CAAC;;CAE7B,IAAI;;CAEJ,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF;CACA,CAAC,KAAK,EAAE,WAAW,SAAS,GAAG;;CAE/B,EAAE,KAAK,SAAS,KAAK,GAAG,GAAG;;CAE3B,GAAG,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;;CAE1B,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAEtD,IAAI,KAAK,EAAE,CAAC,EAAE,IAAI,SAAS,CAAC;;CAE5B,IAAI;;CAEJ,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF;CACA;CACA,CAAC,IAAI,EAAE,WAAW,SAAS,EAAE,OAAO,GAAG;;CAEvC,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK;CACxB,GAAG,KAAK,GAAG,KAAK,CAAC,MAAM;CACvB,GAAG,IAAI,GAAG,CAAC;CACX,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC;;CAElB,EAAE,QAAQ,IAAI,KAAK,KAAK,IAAI,KAAK,EAAE,IAAI,EAAE,GAAG,SAAS,GAAG;;CAExD,GAAG,GAAG,IAAI,CAAC;;CAEX,GAAG;;CAEH,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,IAAI,KAAK,EAAE,EAAE,EAAE,GAAG,OAAO,GAAG;;CAEhD,GAAG,GAAG,EAAE,CAAC;;CAET,GAAG;;CAEH,EAAE,GAAG,EAAE,CAAC;;CAER,EAAE,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,KAAK,GAAG;;CAEpC;CACA,GAAG,KAAK,IAAI,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;;CAE3D,GAAG,IAAI,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;CACpC,GAAG,IAAI,CAAC,KAAK,GAAG,cAAc,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;CAC7D,GAAG,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC;;CAEtF,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF;CACA,CAAC,QAAQ,EAAE,YAAY;;CAEvB,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC;;CAEnB,EAAE,IAAI,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;CACtC,EAAE,KAAK,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG;;CAEnD,GAAG,OAAO,CAAC,KAAK,EAAE,mDAAmD,EAAE,IAAI,EAAE,CAAC;CAC9E,GAAG,KAAK,GAAG,KAAK,CAAC;;CAEjB,GAAG;;CAEH,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK;CACxB,GAAG,MAAM,GAAG,IAAI,CAAC,MAAM;;CAEvB,GAAG,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;;CAExB,EAAE,KAAK,KAAK,KAAK,CAAC,GAAG;;CAErB,GAAG,OAAO,CAAC,KAAK,EAAE,sCAAsC,EAAE,IAAI,EAAE,CAAC;CACjE,GAAG,KAAK,GAAG,KAAK,CAAC;;CAEjB,GAAG;;CAEH,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC;;CAEtB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,GAAG,GAAG;;CAEvC,GAAG,IAAI,QAAQ,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;;CAE7B,GAAG,KAAK,OAAO,QAAQ,KAAK,QAAQ,IAAI,KAAK,EAAE,QAAQ,EAAE,GAAG;;CAE5D,IAAI,OAAO,CAAC,KAAK,EAAE,kDAAkD,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;CAC3F,IAAI,KAAK,GAAG,KAAK,CAAC;CAClB,IAAI,MAAM;;CAEV,IAAI;;CAEJ,GAAG,KAAK,QAAQ,KAAK,IAAI,IAAI,QAAQ,GAAG,QAAQ,GAAG;;CAEnD,IAAI,OAAO,CAAC,KAAK,EAAE,yCAAyC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;CAC5F,IAAI,KAAK,GAAG,KAAK,CAAC;CAClB,IAAI,MAAM;;CAEV,IAAI;;CAEJ,GAAG,QAAQ,GAAG,QAAQ,CAAC;;CAEvB,GAAG;;CAEH,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,KAAK,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG;;CAEhD,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAExD,KAAK,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC;;CAE7B,KAAK,KAAK,KAAK,EAAE,KAAK,EAAE,GAAG;;CAE3B,MAAM,OAAO,CAAC,KAAK,EAAE,mDAAmD,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;CAC3F,MAAM,KAAK,GAAG,KAAK,CAAC;CACpB,MAAM,MAAM;;CAEZ,MAAM;;CAEN,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH,EAAE,OAAO,KAAK,CAAC;;CAEf,EAAE;;CAEF;CACA;CACA,CAAC,QAAQ,EAAE,YAAY;;CAEvB,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK;CACxB,GAAG,MAAM,GAAG,IAAI,CAAC,MAAM;CACvB,GAAG,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE;;CAE/B,GAAG,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,EAAE,KAAK,iBAAiB;;CAEtE,GAAG,UAAU,GAAG,CAAC;CACjB,GAAG,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;;CAEhC,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,GAAG,CAAC,GAAG;;CAEzC,GAAG,IAAI,IAAI,GAAG,KAAK,CAAC;;CAEpB,GAAG,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;CACzB,GAAG,IAAI,QAAQ,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;;CAEjC;;CAEA,GAAG,KAAK,IAAI,KAAK,QAAQ,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG;;CAEjE,IAAI,KAAK,EAAE,mBAAmB,GAAG;;CAEjC;;CAEA,KAAK,IAAI,MAAM,GAAG,CAAC,GAAG,MAAM;CAC5B,MAAM,OAAO,GAAG,MAAM,GAAG,MAAM;CAC/B,MAAM,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;;CAEhC,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,MAAM,EAAE,GAAG,CAAC,GAAG;;CAE3C,MAAM,IAAI,KAAK,GAAG,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;;CAEvC,MAAM,KAAK,KAAK,KAAK,MAAM,EAAE,OAAO,GAAG,CAAC,EAAE;CAC1C,OAAO,KAAK,KAAK,MAAM,EAAE,OAAO,GAAG,CAAC,EAAE,GAAG;;CAEzC,OAAO,IAAI,GAAG,IAAI,CAAC;CACnB,OAAO,MAAM;;CAEb,OAAO;;CAEP,MAAM;;CAEN,KAAK,MAAM;;CAEX,KAAK,IAAI,GAAG,IAAI,CAAC;;CAEjB,KAAK;;CAEL,IAAI;;CAEJ;;CAEA,GAAG,KAAK,IAAI,GAAG;;CAEf,IAAI,KAAK,CAAC,KAAK,UAAU,GAAG;;CAE5B,KAAK,KAAK,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;;CAEtC,KAAK,IAAI,UAAU,GAAG,CAAC,GAAG,MAAM;CAChC,MAAM,WAAW,GAAG,UAAU,GAAG,MAAM,CAAC;;CAExC,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,MAAM,EAAE,GAAG,CAAC,GAAG;;CAE3C,MAAM,MAAM,EAAE,WAAW,GAAG,CAAC,EAAE,GAAG,MAAM,EAAE,UAAU,GAAG,CAAC,EAAE,CAAC;;CAE3D,MAAM;;CAEN,KAAK;;CAEL,IAAI,GAAG,UAAU,CAAC;;CAElB,IAAI;;CAEJ,GAAG;;CAEH;;CAEA,EAAE,KAAK,SAAS,GAAG,CAAC,GAAG;;CAEvB,GAAG,KAAK,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,CAAC;;CAE5C,GAAG,MAAM,IAAI,UAAU,GAAG,SAAS,GAAG,MAAM,EAAE,WAAW,GAAG,UAAU,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,MAAM,EAAE,GAAG,CAAC,GAAG;;CAE7G,IAAI,MAAM,EAAE,WAAW,GAAG,CAAC,EAAE,GAAG,MAAM,EAAE,UAAU,GAAG,CAAC,EAAE,CAAC;;CAEzD,IAAI;;CAEJ,GAAG,GAAG,UAAU,CAAC;;CAEjB,GAAG;;CAEH,EAAE,KAAK,UAAU,KAAK,KAAK,CAAC,MAAM,GAAG;;CAErC,GAAG,IAAI,CAAC,KAAK,GAAG,cAAc,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC;CAClE,GAAG,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,GAAG,MAAM,EAAE,CAAC;;CAE7E,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,mBAAmB,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,GAAG;;CAEnE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;;CAEhE,CAAC;;CAED,mBAAmB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,SAAS,EAAE,EAAE;;CAEzF,CAAC,WAAW,EAAE,mBAAmB;;CAEjC,CAAC,aAAa,EAAE,QAAQ;;CAExB;;CAEA;;CAEA,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG;;CAEjD,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;CAClB,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;CACtB,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,QAAQ,KAAK,SAAS,KAAK,QAAQ,GAAG,EAAE,CAAC,CAAC;;CAE7D,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;;CAElC;CACA,CAAC,KAAK,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG;;CAE1B,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;;CAEvB,EAAE;;CAEF,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;;CAEjB,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE;;CAE9B,CAAC,KAAK,EAAE,WAAW,IAAI,GAAG;;CAE1B,EAAE,IAAI,MAAM,GAAG,EAAE;CACjB,GAAG,UAAU,GAAG,IAAI,CAAC,MAAM;CAC3B,GAAG,SAAS,GAAG,GAAG,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;;CAEzC,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAE1D,GAAG,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC;;CAE5E,GAAG;;CAEH,EAAE,OAAO,IAAI,aAAa,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;;CAE/D,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,IAAI,GAAG;;CAE3B,EAAE,IAAI,MAAM,GAAG,EAAE;CACjB,GAAG,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;;CAE5B,EAAE,IAAI,IAAI,GAAG;;CAEb,GAAG,MAAM,EAAE,IAAI,CAAC,IAAI;CACpB,GAAG,UAAU,EAAE,IAAI,CAAC,QAAQ;CAC5B,GAAG,QAAQ,EAAE,MAAM;;CAEnB,GAAG,CAAC;;CAEJ,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAE1D,GAAG,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;;CAE1D,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,6BAA6B,EAAE,WAAW,IAAI,EAAE,mBAAmB,EAAE,GAAG,EAAE,MAAM,GAAG;;CAEpF,EAAE,IAAI,eAAe,GAAG,mBAAmB,CAAC,MAAM,CAAC;CACnD,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC;;CAElB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC,GAAG,GAAG;;CAE/C,GAAG,IAAI,KAAK,GAAG,EAAE,CAAC;CAClB,GAAG,IAAI,MAAM,GAAG,EAAE,CAAC;;CAEnB,GAAG,KAAK,CAAC,IAAI;CACb,IAAI,EAAE,CAAC,GAAG,eAAe,GAAG,CAAC,KAAK,eAAe;CACjD,IAAI,CAAC;CACL,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,eAAe,EAAE,CAAC;;CAElC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE1B,GAAG,IAAI,KAAK,GAAG,cAAc,CAAC,gBAAgB,EAAE,KAAK,EAAE,CAAC;CACxD,GAAG,KAAK,GAAG,cAAc,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;CACzD,GAAG,MAAM,GAAG,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;;CAE3D;CACA;CACA,GAAG,KAAK,EAAE,MAAM,IAAI,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG;;CAEvC,IAAI,KAAK,CAAC,IAAI,EAAE,eAAe,EAAE,CAAC;CAClC,IAAI,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE/B,IAAI;;CAEJ,GAAG,MAAM,CAAC,IAAI;CACd,IAAI,IAAI,mBAAmB;CAC3B,KAAK,yBAAyB,GAAG,mBAAmB,EAAE,CAAC,EAAE,CAAC,IAAI,GAAG,GAAG;CACpE,KAAK,KAAK,EAAE,MAAM;CAClB,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC;;CAE3B,GAAG;;CAEH,EAAE,OAAO,IAAI,aAAa,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;;CAEhD,EAAE;;CAEF,CAAC,UAAU,EAAE,WAAW,iBAAiB,EAAE,IAAI,GAAG;;CAElD,EAAE,IAAI,SAAS,GAAG,iBAAiB,CAAC;;CAEpC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG;;CAE9C,GAAG,IAAI,CAAC,GAAG,iBAAiB,CAAC;CAC7B,GAAG,SAAS,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,CAAC;;CAEnE,GAAG;;CAEH,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAEhD,GAAG,KAAK,SAAS,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,IAAI,GAAG;;CAEvC,IAAI,OAAO,SAAS,EAAE,CAAC,EAAE,CAAC;;CAE1B,IAAI;;CAEJ,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,mCAAmC,EAAE,WAAW,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG;;CAE7E,EAAE,IAAI,uBAAuB,GAAG,EAAE,CAAC;;CAEnC;CACA;CACA,EAAE,IAAI,OAAO,GAAG,oBAAoB,CAAC;;CAErC;CACA;CACA,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAE5D,GAAG,IAAI,WAAW,GAAG,YAAY,EAAE,CAAC,EAAE,CAAC;CACvC,GAAG,IAAI,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;;CAEjD,GAAG,KAAK,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG;;CAEpC,IAAI,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;;CAE1B,IAAI,IAAI,qBAAqB,GAAG,uBAAuB,EAAE,IAAI,EAAE,CAAC;CAChE,IAAI,KAAK,EAAE,qBAAqB,GAAG;;CAEnC,KAAK,uBAAuB,EAAE,IAAI,EAAE,GAAG,qBAAqB,GAAG,EAAE,CAAC;;CAElE,KAAK;;CAEL,IAAI,qBAAqB,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC;;CAE9C,IAAI;;CAEJ,GAAG;;CAEH,EAAE,IAAI,KAAK,GAAG,EAAE,CAAC;;CAEjB,EAAE,MAAM,IAAI,IAAI,IAAI,uBAAuB,GAAG;;CAE9C,GAAG,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC,6BAA6B,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC;;CAEnH,GAAG;;CAEH,EAAE,OAAO,KAAK,CAAC;;CAEf,EAAE;;CAEF;CACA,CAAC,cAAc,EAAE,WAAW,SAAS,EAAE,KAAK,GAAG;;CAE/C,EAAE,KAAK,EAAE,SAAS,GAAG;;CAErB,GAAG,OAAO,CAAC,KAAK,EAAE,uDAAuD,EAAE,CAAC;CAC5E,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG;;CAEH,EAAE,IAAI,gBAAgB,GAAG,WAAW,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,GAAG;;CAEpG;CACA,GAAG,KAAK,aAAa,CAAC,MAAM,KAAK,CAAC,GAAG;;CAErC,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;CACnB,IAAI,IAAI,MAAM,GAAG,EAAE,CAAC;;CAEpB,IAAI,cAAc,CAAC,WAAW,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;;CAE7E;CACA,IAAI,KAAK,KAAK,CAAC,MAAM,KAAK,CAAC,GAAG;;CAE9B,KAAK,UAAU,CAAC,IAAI,EAAE,IAAI,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC;;CAElE,KAAK;;CAEL,IAAI;;CAEJ,GAAG,CAAC;;CAEJ,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC;;CAElB,EAAE,IAAI,QAAQ,GAAG,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC;CAC7C;CACA,EAAE,IAAI,QAAQ,GAAG,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;CACzC,EAAE,IAAI,GAAG,GAAG,SAAS,CAAC,GAAG,IAAI,EAAE,CAAC;;CAEhC,EAAE,IAAI,eAAe,GAAG,SAAS,CAAC,SAAS,IAAI,EAAE,CAAC;;CAElD,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAEtD,GAAG,IAAI,aAAa,GAAG,eAAe,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;;CAEjD;CACA,GAAG,KAAK,EAAE,aAAa,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,GAAG,SAAS;;CAEjE;CACA,GAAG,KAAK,aAAa,EAAE,CAAC,EAAE,CAAC,YAAY,GAAG;;CAE1C;CACA,IAAI,IAAI,gBAAgB,GAAG,EAAE,CAAC;;CAE9B,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAEtD,KAAK,KAAK,aAAa,EAAE,CAAC,EAAE,CAAC,YAAY,GAAG;;CAE5C,MAAM,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAE1E,OAAO,gBAAgB,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;;CAEtE,OAAO;;CAEP,MAAM;;CAEN,KAAK;;CAEL;CACA;CACA;CACA,IAAI,MAAM,IAAI,eAAe,IAAI,gBAAgB,GAAG;;CAEpD,KAAK,IAAI,KAAK,GAAG,EAAE,CAAC;CACpB,KAAK,IAAI,MAAM,GAAG,EAAE,CAAC;;CAErB,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,aAAa,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;;CAE3E,MAAM,IAAI,YAAY,GAAG,aAAa,EAAE,CAAC,EAAE,CAAC;;CAE5C,MAAM,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,CAAC;CACtC,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,YAAY,CAAC,WAAW,KAAK,eAAe,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;;CAE9E,MAAM;;CAEN,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,mBAAmB,EAAE,wBAAwB,GAAG,eAAe,GAAG,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC;;CAE/G,KAAK;;CAEL,IAAI,QAAQ,GAAG,gBAAgB,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;;CAExD,IAAI,MAAM;;CAEV;;CAEA,IAAI,IAAI,QAAQ,GAAG,SAAS,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC;;CAErD,IAAI,gBAAgB;CACpB,KAAK,mBAAmB,EAAE,QAAQ,GAAG,WAAW;CAChD,KAAK,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;;CAEpC,IAAI,gBAAgB;CACpB,KAAK,uBAAuB,EAAE,QAAQ,GAAG,aAAa;CACtD,KAAK,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;;CAEpC,IAAI,gBAAgB;CACpB,KAAK,mBAAmB,EAAE,QAAQ,GAAG,QAAQ;CAC7C,KAAK,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;;CAEpC,IAAI;;CAEJ,GAAG;;CAEH,EAAE,KAAK,MAAM,CAAC,MAAM,KAAK,CAAC,GAAG;;CAE7B,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG;;CAEH,EAAE,IAAI,IAAI,GAAG,IAAI,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;;CAE7D,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,SAAS,EAAE;;CAExC,CAAC,aAAa,EAAE,YAAY;;CAE5B,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,GAAG,CAAC,CAAC;;CAEzC,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAEtD,GAAG,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;;CAEhC,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC;;CAE1E,GAAG;;CAEH,EAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;;CAE3B,EAAE;;CAEF,CAAC,IAAI,EAAE,YAAY;;CAEnB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAElD,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;;CAE7C,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,QAAQ,EAAE,YAAY;;CAEvB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAElD,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC;;CAE/B,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,cAAc,EAAE,OAAO,GAAG;;CAEnC,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,OAAO,KAAK,SAAS,KAAK,OAAO,GAAG,qBAAqB,CAAC;CAC5E,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;;CAEpB,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,EAAE;;CAEzC,CAAC,IAAI,EAAE,WAAW,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG;;CAErD,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC;;CAEnB,EAAE,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;CAC/C,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,IAAI,GAAG;;CAEtC,GAAG,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;;CAE/C,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;;CAE3B,EAAE;;CAEF,CAAC,WAAW,EAAE,WAAW,KAAK,GAAG;;CAEjC,EAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;;CAExB,EAAE;;CAEF,CAAC,KAAK,EAAE,WAAW,IAAI,GAAG;;CAE1B,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAE/B,EAAE,SAAS,UAAU,EAAE,IAAI,GAAG;;CAE9B,GAAG,KAAK,QAAQ,EAAE,IAAI,EAAE,KAAK,SAAS,GAAG;;CAEzC,IAAI,OAAO,CAAC,IAAI,EAAE,yCAAyC,EAAE,IAAI,EAAE,CAAC;;CAEpE,IAAI;;CAEJ,GAAG,OAAO,QAAQ,EAAE,IAAI,EAAE,CAAC;;CAE3B,GAAG;;CAEH,EAAE,IAAI,QAAQ,GAAG,IAAI,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;;CAE9C,EAAE,KAAK,IAAI,CAAC,IAAI,KAAK,SAAS,GAAG,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;CAC3D,EAAE,KAAK,IAAI,CAAC,IAAI,KAAK,SAAS,GAAG,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;CAC3D,EAAE,KAAK,IAAI,CAAC,KAAK,KAAK,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;CACtE,EAAE,KAAK,IAAI,CAAC,SAAS,KAAK,SAAS,GAAG,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;CAC1E,EAAE,KAAK,IAAI,CAAC,SAAS,KAAK,SAAS,GAAG,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;CAC1E,EAAE,KAAK,IAAI,CAAC,QAAQ,KAAK,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;CAC/E,EAAE,KAAK,IAAI,CAAC,QAAQ,KAAK,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;CAC/E,EAAE,KAAK,IAAI,CAAC,SAAS,KAAK,SAAS,GAAG,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;CAC1E,EAAE,KAAK,IAAI,CAAC,SAAS,KAAK,SAAS,GAAG,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;CAC1E,EAAE,KAAK,IAAI,CAAC,kBAAkB,KAAK,SAAS,GAAG,QAAQ,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;CACrG,EAAE,KAAK,IAAI,CAAC,QAAQ,KAAK,SAAS,GAAG,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;CACvE,EAAE,KAAK,IAAI,CAAC,YAAY,KAAK,SAAS,GAAG,QAAQ,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;CACnF,EAAE,KAAK,IAAI,CAAC,cAAc,KAAK,SAAS,GAAG,QAAQ,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;CACzF,EAAE,KAAK,IAAI,CAAC,YAAY,KAAK,SAAS,GAAG,QAAQ,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;CACnF,EAAE,KAAK,IAAI,CAAC,GAAG,KAAK,SAAS,GAAG,QAAQ,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;CACxD,EAAE,KAAK,IAAI,CAAC,WAAW,KAAK,SAAS,GAAG,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;CAChF,EAAE,KAAK,IAAI,CAAC,QAAQ,KAAK,SAAS,GAAG,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;CACvE,EAAE,KAAK,IAAI,CAAC,IAAI,KAAK,SAAS,GAAG,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;CAC3D,EAAE,KAAK,IAAI,CAAC,OAAO,KAAK,SAAS,GAAG,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;CACpE,EAAE,KAAK,IAAI,CAAC,WAAW,KAAK,SAAS,GAAG,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;CAChF,EAAE,KAAK,IAAI,CAAC,SAAS,KAAK,SAAS,GAAG,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;CAC1E,EAAE,KAAK,IAAI,CAAC,SAAS,KAAK,SAAS,GAAG,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;CAC1E,EAAE,KAAK,IAAI,CAAC,UAAU,KAAK,SAAS,GAAG,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;CAC7E,EAAE,KAAK,IAAI,CAAC,UAAU,KAAK,SAAS,GAAG,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;CAC7E,EAAE,KAAK,IAAI,CAAC,SAAS,KAAK,SAAS,GAAG,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;CAC1E,EAAE,KAAK,IAAI,CAAC,kBAAkB,KAAK,SAAS,GAAG,QAAQ,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;CACrG,EAAE,KAAK,IAAI,CAAC,gBAAgB,KAAK,SAAS,GAAG,QAAQ,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;CAC/F,EAAE,KAAK,IAAI,CAAC,iBAAiB,KAAK,SAAS,GAAG,QAAQ,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;;CAElG,EAAE,KAAK,IAAI,CAAC,QAAQ,KAAK,SAAS,GAAG,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAEvE,EAAE,KAAK,IAAI,CAAC,SAAS,KAAK,CAAC,GAAG,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;CAClE,EAAE,KAAK,IAAI,CAAC,QAAQ,KAAK,SAAS,GAAG,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;CACvE,EAAE,KAAK,IAAI,CAAC,OAAO,KAAK,SAAS,GAAG,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;CACpE,EAAE,KAAK,IAAI,CAAC,KAAK,KAAK,SAAS,GAAG,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;;CAE9D,EAAE,KAAK,IAAI,CAAC,aAAa,KAAK,SAAS,GAAG,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;CACtF,EAAE,KAAK,IAAI,CAAC,mBAAmB,KAAK,SAAS,GAAG,QAAQ,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC;CACxG,EAAE,KAAK,IAAI,CAAC,kBAAkB,KAAK,SAAS,GAAG,QAAQ,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;;CAErG,EAAE,KAAK,IAAI,CAAC,QAAQ,KAAK,SAAS,GAAG,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;CACvE,EAAE,KAAK,IAAI,CAAC,YAAY,KAAK,SAAS,GAAG,QAAQ,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;CACnF,EAAE,KAAK,IAAI,CAAC,SAAS,KAAK,SAAS,GAAG,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;;CAE1E,EAAE,KAAK,IAAI,CAAC,OAAO,KAAK,SAAS,GAAG,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;CACpE,EAAE,KAAK,IAAI,CAAC,QAAQ,KAAK,SAAS,GAAG,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAEvE;;CAEA,EAAE,KAAK,IAAI,CAAC,OAAO,KAAK,SAAS,GAAG,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,KAAK,CAAC,CAAC;;CAE9E;;CAEA,EAAE,KAAK,IAAI,CAAC,IAAI,KAAK,SAAS,GAAG,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;CAC3D,EAAE,KAAK,IAAI,CAAC,eAAe,KAAK,SAAS,GAAG,QAAQ,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;;CAE5F;;CAEA,EAAE,KAAK,IAAI,CAAC,GAAG,KAAK,SAAS,GAAG,QAAQ,CAAC,GAAG,GAAG,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;;CAEtE,EAAE,KAAK,IAAI,CAAC,QAAQ,KAAK,SAAS,GAAG;;CAErC,GAAG,QAAQ,CAAC,QAAQ,GAAG,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;CACnD,GAAG,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;;CAE/B,GAAG;;CAEH,EAAE,KAAK,IAAI,CAAC,OAAO,KAAK,SAAS,GAAG,QAAQ,CAAC,OAAO,GAAG,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;CAClF,EAAE,KAAK,IAAI,CAAC,SAAS,KAAK,SAAS,GAAG,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;;CAE1E,EAAE,KAAK,IAAI,CAAC,SAAS,KAAK,SAAS,GAAG,QAAQ,CAAC,SAAS,GAAG,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;CACxF,EAAE,KAAK,IAAI,CAAC,WAAW,KAAK,SAAS,GAAG;;CAExC,GAAG,IAAI,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;;CAEtC,GAAG,KAAK,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,KAAK,GAAG;;CAEjD;;CAEA,IAAI,WAAW,GAAG,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;;CAE/C,IAAI;;CAEJ,GAAG,QAAQ,CAAC,WAAW,GAAG,IAAI,OAAO,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC;;CAEjE,GAAG;;CAEH,EAAE,KAAK,IAAI,CAAC,eAAe,KAAK,SAAS,GAAG,QAAQ,CAAC,eAAe,GAAG,UAAU,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC;CAC1G,EAAE,KAAK,IAAI,CAAC,iBAAiB,KAAK,SAAS,GAAG,QAAQ,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;CAClG,EAAE,KAAK,IAAI,CAAC,gBAAgB,KAAK,SAAS,GAAG,QAAQ,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;;CAE/F,EAAE,KAAK,IAAI,CAAC,YAAY,KAAK,SAAS,GAAG,QAAQ,CAAC,YAAY,GAAG,UAAU,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;CACjG,EAAE,KAAK,IAAI,CAAC,YAAY,KAAK,SAAS,GAAG,QAAQ,CAAC,YAAY,GAAG,UAAU,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;;CAEjG,EAAE,KAAK,IAAI,CAAC,WAAW,KAAK,SAAS,GAAG,QAAQ,CAAC,WAAW,GAAG,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;CAC9F,EAAE,KAAK,IAAI,CAAC,iBAAiB,KAAK,SAAS,GAAG,QAAQ,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;;CAElG,EAAE,KAAK,IAAI,CAAC,WAAW,KAAK,SAAS,GAAG,QAAQ,CAAC,WAAW,GAAG,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;;CAE9F,EAAE,KAAK,IAAI,CAAC,MAAM,KAAK,SAAS,GAAG,QAAQ,CAAC,MAAM,GAAG,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAE/E,EAAE,KAAK,IAAI,CAAC,YAAY,KAAK,SAAS,GAAG,QAAQ,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;;CAEnF,EAAE,KAAK,IAAI,CAAC,QAAQ,KAAK,SAAS,GAAG,QAAQ,CAAC,QAAQ,GAAG,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;CACrF,EAAE,KAAK,IAAI,CAAC,iBAAiB,KAAK,SAAS,GAAG,QAAQ,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;;CAElG,EAAE,KAAK,IAAI,CAAC,KAAK,KAAK,SAAS,GAAG,QAAQ,CAAC,KAAK,GAAG,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;CAC5E,EAAE,KAAK,IAAI,CAAC,cAAc,KAAK,SAAS,GAAG,QAAQ,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;;CAEzF,EAAE,KAAK,IAAI,CAAC,WAAW,KAAK,SAAS,GAAG,QAAQ,CAAC,WAAW,GAAG,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;;CAE9F,EAAE,OAAO,QAAQ,CAAC;;CAElB,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,oBAAoB,EAAE,OAAO,GAAG;;CAEzC,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,OAAO,KAAK,SAAS,KAAK,OAAO,GAAG,qBAAqB,CAAC;;CAE5E,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,SAAS,EAAE;;CAE/C,CAAC,IAAI,EAAE,WAAW,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG;;CAErD,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC;;CAEnB,EAAE,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;CAC/C,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,IAAI,GAAG;;CAEtC,GAAG,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;;CAE/C,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;;CAE3B,EAAE;;CAEF,CAAC,KAAK,EAAE,WAAW,IAAI,GAAG;;CAE1B,EAAE,IAAI,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;;CAEtC,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;;CAE9B,EAAE,KAAK,KAAK,KAAK,SAAS,GAAG;;CAE7B,GAAG,IAAI,UAAU,GAAG,IAAI,YAAY,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;CAClE,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,eAAe,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE7D,GAAG;;CAEH,EAAE,IAAI,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;;CAExC,EAAE,MAAM,IAAI,GAAG,IAAI,UAAU,GAAG;;CAEhC,GAAG,IAAI,SAAS,GAAG,UAAU,EAAE,GAAG,EAAE,CAAC;CACrC,GAAG,IAAI,UAAU,GAAG,IAAI,YAAY,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC;;CAE1E,GAAG,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE,IAAI,eAAe,EAAE,UAAU,EAAE,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,UAAU,EAAE,EAAE,CAAC;;CAE7G,GAAG;;CAEH,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;;CAE5E,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAEvD,IAAI,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC;;CAE5B,IAAI,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC;;CAEvE,IAAI;;CAEJ,GAAG;;CAEH,EAAE,IAAI,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;;CAEhD,EAAE,KAAK,cAAc,KAAK,SAAS,GAAG;;CAEtC,GAAG,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE9B,GAAG,KAAK,cAAc,CAAC,MAAM,KAAK,SAAS,GAAG;;CAE9C,IAAI,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,MAAM,EAAE,CAAC;;CAE9C,IAAI;;CAEJ,GAAG,QAAQ,CAAC,cAAc,GAAG,IAAI,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,EAAE,CAAC;;CAEzE,GAAG;;CAEH,EAAE,OAAO,QAAQ,CAAC;;CAElB,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,IAAI,YAAY,GAAG;CACnB,CAAC,SAAS,EAAE,SAAS;CACrB,CAAC,UAAU,EAAE,UAAU;CACvB;CACA,CAAC,iBAAiB,EAAE,OAAO,iBAAiB,KAAK,WAAW,GAAG,iBAAiB,GAAG,UAAU;CAC7F,CAAC,UAAU,EAAE,UAAU;CACvB,CAAC,WAAW,EAAE,WAAW;CACzB,CAAC,UAAU,EAAE,UAAU;CACvB,CAAC,WAAW,EAAE,WAAW;CACzB,CAAC,YAAY,EAAE,YAAY;CAC3B,CAAC,YAAY,EAAE,YAAY;CAC3B,CAAC,CAAC;;CAEF;CACA;CACA;;CAEA,SAAS,MAAM,GAAG,EAAE;;CAEpB,MAAM,CAAC,QAAQ,GAAG;;CAElB,CAAC,QAAQ,EAAE,EAAE;;CAEb,CAAC,GAAG,EAAE,WAAW,KAAK,EAAE,MAAM,GAAG;;CAEjC,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;;CAEtC,EAAE;;CAEF,CAAC,GAAG,EAAE,WAAW,IAAI,GAAG;;CAExB,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAE/B,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;;CAExD,GAAG,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC,EAAE,CAAC;CAC7B,GAAG,IAAI,MAAM,GAAG,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;;CAElC,GAAG,KAAK,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG;;CAE7B,IAAI,OAAO,MAAM,CAAC;;CAElB,IAAI;;CAEJ,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,CAAC;;CAEF,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE;;CAEjC,CAAC,WAAW,EAAE,SAAS;;CAEvB,CAAC,WAAW,EAAE,YAAY,EAAE;;CAE5B,CAAC,cAAc,EAAE,YAAY,EAAE;;CAE/B,CAAC,cAAc,EAAE,YAAY,EAAE;;CAE/B,CAAC,aAAa,EAAE,WAAW,SAAS,EAAE,WAAW,EAAE,WAAW,GAAG;;CAEjE,EAAE,IAAI,KAAK,GAAG,EAAE,CAAC;;CAEjB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;;CAEhD,GAAG,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;;CAEhF,GAAG;;CAEH,EAAE,OAAO,KAAK,CAAC;;CAEf,EAAE;;CAEF,CAAC,cAAc,EAAE,EAAE,YAAY;;CAE/B,EAAE,IAAI,YAAY,GAAG;CACrB,GAAG,UAAU,EAAE,UAAU;CACzB,GAAG,cAAc,EAAE,cAAc;CACjC,GAAG,gBAAgB,EAAE,gBAAgB;CACrC,GAAG,mBAAmB,EAAE,mBAAmB;CAC3C,GAAG,gBAAgB,EAAE,gBAAgB;CACrC,GAAG,cAAc,EAAE,cAAc;CACjC,GAAG,CAAC;;CAEJ,EAAE,IAAI,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;CAC1B,EAAE,IAAI,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;CAC1C,EAAE,IAAI,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;;CAE5C,EAAE,OAAO,SAAS,cAAc,EAAE,CAAC,EAAE,WAAW,EAAE,WAAW,GAAG;;CAEhE;;CAEA,GAAG,IAAI,QAAQ,GAAG,EAAE,CAAC;;CAErB,GAAG,SAAS,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG;;CAElE,IAAI,IAAI,QAAQ,GAAG,WAAW,GAAG,IAAI,CAAC;CACtC,IAAI,IAAI,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;;CAEjD,IAAI,IAAI,OAAO,CAAC;;CAEhB,IAAI,KAAK,MAAM,KAAK,IAAI,GAAG;;CAE3B,KAAK,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;;CAEvC,KAAK,MAAM;;CAEX,KAAK,aAAa,CAAC,cAAc,EAAE,WAAW,EAAE,CAAC;CACjD,KAAK,OAAO,GAAG,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;;CAE9C,KAAK;;CAEL,IAAI,KAAK,MAAM,KAAK,SAAS,GAAG;;CAEhC,KAAK,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;;CAExC,KAAK,KAAK,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC;CAC7D,KAAK,KAAK,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC;;CAE7D,KAAK;;CAEL,IAAI,KAAK,MAAM,KAAK,SAAS,GAAG;;CAEhC,KAAK,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;;CAExC,KAAK;;CAEL,IAAI,KAAK,IAAI,KAAK,SAAS,GAAG;;CAE9B,KAAK,KAAK,IAAI,EAAE,CAAC,EAAE,KAAK,QAAQ,GAAG,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC;CAClE,KAAK,KAAK,IAAI,EAAE,CAAC,EAAE,KAAK,QAAQ,GAAG,OAAO,CAAC,KAAK,GAAG,sBAAsB,CAAC;;CAE1E,KAAK,KAAK,IAAI,EAAE,CAAC,EAAE,KAAK,QAAQ,GAAG,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC;CAClE,KAAK,KAAK,IAAI,EAAE,CAAC,EAAE,KAAK,QAAQ,GAAG,OAAO,CAAC,KAAK,GAAG,sBAAsB,CAAC;;CAE1E,KAAK;;CAEL,IAAI,KAAK,UAAU,KAAK,SAAS,GAAG;;CAEpC,KAAK,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;;CAErC,KAAK;;CAEL,IAAI,IAAI,IAAI,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;;CAEpC,IAAI,QAAQ,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;;CAE/B,IAAI,OAAO,IAAI,CAAC;;CAEhB,IAAI;;CAEJ;;CAEA,GAAG,IAAI,IAAI,GAAG;CACd,IAAI,IAAI,EAAE,KAAK,CAAC,YAAY,EAAE;CAC9B,IAAI,IAAI,EAAE,qBAAqB;CAC/B,IAAI,CAAC;;CAEL,GAAG,MAAM,IAAI,IAAI,IAAI,CAAC,GAAG;;CAEzB,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;;CAE1B,IAAI,SAAS,IAAI;;CAEjB,KAAK,KAAK,UAAU,CAAC;CACrB,KAAK,KAAK,UAAU,CAAC;CACrB,KAAK,KAAK,gBAAgB,CAAC;CAC3B,KAAK,KAAK,cAAc;CACxB,MAAM,MAAM;CACZ,KAAK,KAAK,SAAS;CACnB,MAAM,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;CACxB,MAAM,MAAM;CACZ,KAAK,KAAK,UAAU;CACpB,MAAM,IAAI,CAAC,QAAQ,GAAG,YAAY,EAAE,KAAK,EAAE,CAAC;CAC5C,MAAM,MAAM;CACZ,KAAK,KAAK,cAAc,CAAC;CACzB,KAAK,KAAK,YAAY;CACtB,MAAM,OAAO,CAAC,IAAI,EAAE,8BAA8B,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAC;CACtF,MAAM,MAAM;CACZ,KAAK,KAAK,cAAc;CACxB,MAAM,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC;CACrD,MAAM,MAAM;CACZ,KAAK,KAAK,eAAe;CACzB,MAAM,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC;CACxD,MAAM,MAAM;CACZ,KAAK,KAAK,eAAe;CACzB,MAAM,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC;CACxD,MAAM,MAAM;CACZ,KAAK,KAAK,cAAc;CACxB,MAAM,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;CAC7B,MAAM,MAAM;CACZ,KAAK,KAAK,SAAS;CACnB,MAAM,KAAK,KAAK,CAAC,WAAW,EAAE,KAAK,OAAO,GAAG,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;CAC7E,MAAM,KAAK,KAAK,CAAC,WAAW,EAAE,KAAK,OAAO,GAAG,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;CAC7E,MAAM,KAAK,KAAK,CAAC,WAAW,EAAE,KAAK,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;CACnF,MAAM,MAAM;CACZ,KAAK,KAAK,YAAY;CACtB,MAAM,IAAI,CAAC,GAAG,GAAG,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,oBAAoB,EAAE,CAAC;CACxH,MAAM,MAAM;CACZ,KAAK,KAAK,kBAAkB,CAAC;CAC7B,KAAK,KAAK,kBAAkB,CAAC;CAC7B,KAAK,KAAK,gBAAgB,CAAC;CAC3B,KAAK,KAAK,sBAAsB;CAChC,MAAM,MAAM;CACZ,KAAK,KAAK,aAAa;CACvB,MAAM,IAAI,CAAC,WAAW,GAAG,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,qBAAqB,EAAE,CAAC;CACpI,MAAM,MAAM;CACZ,KAAK,KAAK,mBAAmB,CAAC;CAC9B,KAAK,KAAK,mBAAmB,CAAC;CAC9B,KAAK,KAAK,iBAAiB,CAAC;CAC5B,KAAK,KAAK,uBAAuB;CACjC,MAAM,MAAM;CACZ,KAAK,KAAK,UAAU;CACpB,MAAM,IAAI,CAAC,QAAQ,GAAG,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,kBAAkB,EAAE,CAAC;CACrH,MAAM,MAAM;CACZ,KAAK,KAAK,gBAAgB,CAAC;CAC3B,KAAK,KAAK,gBAAgB,CAAC;CAC3B,KAAK,KAAK,cAAc,CAAC;CACzB,KAAK,KAAK,oBAAoB;CAC9B,MAAM,MAAM;CACZ,KAAK,KAAK,OAAO;CACjB,MAAM,IAAI,CAAC,KAAK,GAAG,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC;CACtG,MAAM,MAAM;CACZ,KAAK,KAAK,aAAa,CAAC;CACxB,KAAK,KAAK,aAAa,CAAC;CACxB,KAAK,KAAK,WAAW,CAAC;CACtB,KAAK,KAAK,iBAAiB;CAC3B,MAAM,MAAM;CACZ,KAAK,KAAK,SAAS;CACnB,MAAM,IAAI,CAAC,OAAO,GAAG,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,iBAAiB,EAAE,CAAC;CAChH,MAAM,MAAM;CACZ,KAAK,KAAK,cAAc;CACxB,MAAM,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;CAC7B,MAAM,MAAM;CACZ,KAAK,KAAK,eAAe,CAAC;CAC1B,KAAK,KAAK,eAAe,CAAC;CAC1B,KAAK,KAAK,aAAa,CAAC;CACxB,KAAK,KAAK,mBAAmB;CAC7B,MAAM,MAAM;CACZ,KAAK,KAAK,WAAW;CACrB,MAAM,IAAI,CAAC,SAAS,GAAG,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,mBAAmB,EAAE,CAAC;CAC1H,MAAM,MAAM;CACZ,KAAK,KAAK,iBAAiB;CAC3B,MAAM,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;CAC/B,MAAM,MAAM;CACZ,KAAK,KAAK,iBAAiB,CAAC;CAC5B,KAAK,KAAK,iBAAiB,CAAC;CAC5B,KAAK,KAAK,eAAe,CAAC;CAC1B,KAAK,KAAK,qBAAqB;CAC/B,MAAM,MAAM;CACZ,KAAK,KAAK,aAAa;CACvB,MAAM,IAAI,CAAC,WAAW,GAAG,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,qBAAqB,EAAE,CAAC;CACpI,MAAM,MAAM;CACZ,KAAK,KAAK,mBAAmB,CAAC;CAC9B,KAAK,KAAK,mBAAmB,CAAC;CAC9B,KAAK,KAAK,iBAAiB,CAAC;CAC5B,KAAK,KAAK,uBAAuB;CACjC,MAAM,MAAM;CACZ,KAAK,KAAK,cAAc;CACxB,MAAM,IAAI,CAAC,YAAY,GAAG,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,sBAAsB,EAAE,CAAC;CACzI,MAAM,MAAM;CACZ,KAAK,KAAK,oBAAoB,CAAC;CAC/B,KAAK,KAAK,oBAAoB,CAAC;CAC/B,KAAK,KAAK,kBAAkB,CAAC;CAC7B,KAAK,KAAK,wBAAwB;CAClC,MAAM,MAAM;CACZ,KAAK,KAAK,cAAc;CACxB,MAAM,IAAI,CAAC,YAAY,GAAG,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,sBAAsB,EAAE,CAAC;CACzI,MAAM,MAAM;CACZ,KAAK,KAAK,oBAAoB,CAAC;CAC/B,KAAK,KAAK,oBAAoB,CAAC;CAC/B,KAAK,KAAK,kBAAkB,CAAC;CAC7B,KAAK,KAAK,wBAAwB;CAClC,MAAM,MAAM;CACZ,KAAK,KAAK,UAAU;CACpB,MAAM,IAAI,CAAC,QAAQ,GAAG,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,kBAAkB,EAAE,CAAC;CACrH,MAAM,MAAM;CACZ,KAAK,KAAK,gBAAgB,CAAC;CAC3B,KAAK,KAAK,gBAAgB,CAAC;CAC3B,KAAK,KAAK,cAAc,CAAC;CACzB,KAAK,KAAK,oBAAoB;CAC9B,MAAM,MAAM;CACZ,KAAK,KAAK,WAAW;CACrB,MAAM,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;CAC3B,MAAM,MAAM;CACZ,KAAK,KAAK,aAAa;CACvB,MAAM,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;CAC7B,MAAM,MAAM;CACZ,KAAK,KAAK,cAAc;CACxB,MAAM,OAAO,CAAC,IAAI,EAAE,uEAAuE,EAAE,CAAC;CAC9F,MAAM,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;CAC3B,MAAM,MAAM;CACZ,KAAK,KAAK,WAAW,CAAC;CACtB,KAAK,KAAK,YAAY,CAAC;CACvB,KAAK,KAAK,YAAY,CAAC;CACvB,KAAK,KAAK,SAAS,CAAC;CACpB,KAAK,KAAK,cAAc,CAAC;CACzB,KAAK,KAAK,aAAa,CAAC;CACxB,KAAK,KAAK,SAAS,CAAC;CACpB,KAAK,KAAK,WAAW;CACrB,MAAM,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;CAC3B,MAAM,MAAM;CACZ,KAAK,KAAK,cAAc;CACxB,MAAM,KAAK,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;CAC7D,MAAM,KAAK,KAAK,KAAK,MAAM,GAAG,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC;CAC7D,MAAM,MAAM;CACZ,KAAK;CACL,MAAM,OAAO,CAAC,KAAK,EAAE,0CAA0C,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;CAC/E,MAAM,MAAM;;CAEZ,KAAK;;CAEL,IAAI;;CAEJ,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,mBAAmB,GAAG,OAAO,IAAI,CAAC,QAAQ,CAAC;CACjE,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,mBAAmB,GAAG,OAAO,IAAI,CAAC,QAAQ,CAAC;;CAEjE,GAAG,KAAK,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEnD,GAAG,cAAc,CAAC,WAAW,EAAE,QAAQ,EAAE,CAAC;;CAE1C,GAAG,OAAO,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;;CAEvC,GAAG,CAAC;;CAEJ,EAAE,IAAI;;CAEN,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,IAAI,WAAW,GAAG;;CAElB,CAAC,UAAU,EAAE,WAAW,KAAK,GAAG;;CAEhC,EAAE,KAAK,OAAO,WAAW,KAAK,WAAW,GAAG;;CAE5C,GAAG,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;;CAE5C,GAAG;;CAEH;CACA;;CAEA,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;;CAEb,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAErD;CACA,GAAG,CAAC,IAAI,MAAM,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE1C,GAAG;;CAEH;CACA,EAAE,OAAO,kBAAkB,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE3C,EAAE;;CAEF,CAAC,cAAc,EAAE,WAAW,GAAG,GAAG;;CAElC,EAAE,IAAI,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC;;CAErC,EAAE,KAAK,KAAK,KAAK,EAAE,CAAC,GAAG,OAAO,IAAI,CAAC;;CAEnC,EAAE,OAAO,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;;CAEpC,EAAE;;CAEF,CAAC,CAAC;;CAEF;CACA;CACA;CACA;;CAEA,SAAS,UAAU,EAAE,OAAO,GAAG;;CAE/B,CAAC,KAAK,OAAO,OAAO,KAAK,SAAS,GAAG;;CAErC,EAAE,OAAO,CAAC,IAAI,EAAE,2EAA2E,EAAE,CAAC;CAC9F,EAAE,OAAO,GAAG,SAAS,CAAC;;CAEtB,EAAE;;CAEF,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,OAAO,KAAK,SAAS,KAAK,OAAO,GAAG,qBAAqB,CAAC;;CAE5E,CAAC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;;CAE9B,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,SAAS,EAAE;;CAErC,CAAC,IAAI,EAAE,WAAW,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG;;CAErD,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC;;CAEnB,EAAE,IAAI,WAAW,GAAG,IAAI,CAAC,WAAW,MAAM,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,GAAG,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC;;CAExI,EAAE,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;CAC9C,EAAE,MAAM,CAAC,kBAAkB,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC;CACpD,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,IAAI,GAAG;;CAEtC,GAAG,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;CACjC,GAAG,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAEhC,GAAG,KAAK,QAAQ,KAAK,SAAS,GAAG;;CAEjC,IAAI,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;;CAE7B,IAAI,KAAK,IAAI,KAAK,SAAS,GAAG;;CAE9B,KAAK,KAAK,IAAI,CAAC,WAAW,EAAE,KAAK,QAAQ,GAAG;;CAE5C,MAAM,OAAO,CAAC,KAAK,EAAE,oBAAoB,GAAG,GAAG,GAAG,oDAAoD,EAAE,CAAC;CACzG,MAAM,OAAO;;CAEb,MAAM;;CAEN,KAAK;;CAEL,IAAI;;CAEJ,GAAG,IAAI,MAAM,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;CACjD,GAAG,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;;CAE/C,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;;CAE3B,EAAE;;CAEF,CAAC,cAAc,EAAE,WAAW,KAAK,GAAG;;CAEpC,EAAE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;;CAE3B,EAAE;;CAEF,CAAC,KAAK,EAAE,EAAE,YAAY;;CAEtB,EAAE,SAAS,UAAU,EAAE,IAAI,EAAE,QAAQ,GAAG;;CAExC,GAAG,SAAS,QAAQ,EAAE,KAAK,EAAE,QAAQ,GAAG;;CAExC,IAAI,OAAO,KAAK,KAAK,CAAC,IAAI,QAAQ,EAAE,CAAC;;CAErC,IAAI;;CAEJ,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;;CAEf,IAAI,MAAM,EAAE,OAAO;;CAEnB,IAAI,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa;;CAEnD,IAAI,IAAI;CACR,IAAI,MAAM;CACV,IAAI,WAAW;CACf,IAAI,eAAe;CACnB,IAAI,aAAa,EAAE,mBAAmB;CACtC,IAAI,YAAY,EAAE,kBAAkB;;CAEpC,IAAI,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM;;CAE3C,IAAI,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;;CAErB,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK;CACtB,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ;CAC5B,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO;CAC1B,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM;;CAExB,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK;;CAEtB,IAAI,SAAS,GAAG,CAAC,CAAC;;;CAGlB,GAAG,KAAK,IAAI,CAAC,GAAG,KAAK,SAAS,GAAG;;CAEjC;;CAEA,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAE7C,KAAK,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,SAAS,GAAG,CAAC;;CAE9C,KAAK;;CAEL,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,GAAG;;CAEvC,KAAK,QAAQ,CAAC,aAAa,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;;CAEtC,KAAK;;CAEL,IAAI;;CAEJ,GAAG,MAAM,GAAG,CAAC,CAAC;CACd,GAAG,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC;;CAE7B,GAAG,QAAQ,MAAM,GAAG,OAAO,GAAG;;CAE9B,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE3B,IAAI,MAAM,CAAC,CAAC,GAAG,QAAQ,EAAE,MAAM,GAAG,EAAE,GAAG,KAAK,CAAC;CAC7C,IAAI,MAAM,CAAC,CAAC,GAAG,QAAQ,EAAE,MAAM,GAAG,EAAE,GAAG,KAAK,CAAC;CAC7C,IAAI,MAAM,CAAC,CAAC,GAAG,QAAQ,EAAE,MAAM,GAAG,EAAE,GAAG,KAAK,CAAC;;CAE7C,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;;CAErC,IAAI;;CAEJ,GAAG,MAAM,GAAG,CAAC,CAAC;CACd,GAAG,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;;CAE1B,GAAG,QAAQ,MAAM,GAAG,OAAO,GAAG;;CAE9B,IAAI,IAAI,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC;;CAE9B,IAAI,MAAM,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;CACjC,IAAI,WAAW,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;CACtC,IAAI,eAAe,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;CAC1C,IAAI,aAAa,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;CACxC,IAAI,mBAAmB,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;CAC9C,IAAI,YAAY,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;CACvC,IAAI,kBAAkB,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;;CAE7C;;CAEA,IAAI,KAAK,MAAM,GAAG;;CAElB,KAAK,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;CACzB,KAAK,KAAK,CAAC,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,CAAC;CAC/B,KAAK,KAAK,CAAC,CAAC,GAAG,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;CACnC,KAAK,KAAK,CAAC,CAAC,GAAG,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;;CAEnC,KAAK,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;CACzB,KAAK,KAAK,CAAC,CAAC,GAAG,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;CACnC,KAAK,KAAK,CAAC,CAAC,GAAG,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;CACnC,KAAK,KAAK,CAAC,CAAC,GAAG,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;;CAEnC,KAAK,MAAM,IAAI,CAAC,CAAC;;CAEjB,KAAK,KAAK,WAAW,GAAG;;CAExB,MAAM,aAAa,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC;CACzC,MAAM,KAAK,CAAC,aAAa,GAAG,aAAa,CAAC;CAC1C,MAAM,KAAK,CAAC,aAAa,GAAG,aAAa,CAAC;;CAE1C,MAAM;;CAEN;;CAEA,KAAK,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;;CAEhC,KAAK,KAAK,eAAe,GAAG;;CAE5B,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,GAAG;;CAEzC,OAAO,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;;CAE/B,OAAO,QAAQ,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC;CAC9C,OAAO,QAAQ,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;;CAElD,OAAO,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAElC,QAAQ,OAAO,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC;;CAErC,QAAQ,CAAC,GAAG,OAAO,EAAE,OAAO,GAAG,CAAC,EAAE,CAAC;CACnC,QAAQ,CAAC,GAAG,OAAO,EAAE,OAAO,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;;CAEvC,QAAQ,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEjC,QAAQ,KAAK,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;CACpE,QAAQ,KAAK,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;;CAExE,QAAQ;;CAER,OAAO;;CAEP,MAAM;;CAEN,KAAK,KAAK,aAAa,GAAG;;CAE1B,MAAM,WAAW,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,GAAG,CAAC,CAAC;;CAE3C,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG;CACtB,OAAO,OAAO,EAAE,WAAW,GAAG,EAAE;CAChC,OAAO,OAAO,EAAE,WAAW,GAAG,EAAE;CAChC,OAAO,OAAO,EAAE,WAAW,EAAE;CAC7B,OAAO,CAAC;;CAER,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;;CAExC,MAAM;;CAEN,KAAK,KAAK,mBAAmB,GAAG;;CAEhC,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEjC,OAAO,WAAW,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,GAAG,CAAC,CAAC;;CAE5C,OAAO,MAAM,GAAG,IAAI,OAAO;CAC3B,QAAQ,OAAO,EAAE,WAAW,GAAG,EAAE;CACjC,QAAQ,OAAO,EAAE,WAAW,GAAG,EAAE;CACjC,QAAQ,OAAO,EAAE,WAAW,EAAE;CAC9B,QAAQ,CAAC;;;CAGT,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;CACzD,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;;CAEzD,OAAO;;CAEP,MAAM;;;CAGN,KAAK,KAAK,YAAY,GAAG;;CAEzB,MAAM,UAAU,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC;CACtC,MAAM,GAAG,GAAG,MAAM,EAAE,UAAU,EAAE,CAAC;;CAEjC,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC;CAChC,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC;;CAEhC,MAAM;;;CAGN,KAAK,KAAK,kBAAkB,GAAG;;CAE/B,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEjC,OAAO,UAAU,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC;CACvC,OAAO,GAAG,GAAG,MAAM,EAAE,UAAU,EAAE,CAAC;;CAElC,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;CAClE,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;;CAElE,OAAO;;CAEP,MAAM;;CAEN,KAAK,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;CAClC,KAAK,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;;CAElC,KAAK,MAAM;;CAEX,KAAK,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;CACxB,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC;CACjC,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC;CACjC,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC;;CAEjC,KAAK,KAAK,WAAW,GAAG;;CAExB,MAAM,aAAa,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC;CACzC,MAAM,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;;CAEzC,MAAM;;CAEN;;CAEA,KAAK,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;;CAEhC,KAAK,KAAK,eAAe,GAAG;;CAE5B,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,GAAG;;CAEzC,OAAO,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;;CAE/B,OAAO,QAAQ,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC;;CAE9C,OAAO,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAElC,QAAQ,OAAO,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC;;CAErC,QAAQ,CAAC,GAAG,OAAO,EAAE,OAAO,GAAG,CAAC,EAAE,CAAC;CACnC,QAAQ,CAAC,GAAG,OAAO,EAAE,OAAO,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;;CAEvC,QAAQ,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEjC,QAAQ,QAAQ,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;;CAErD,QAAQ;;CAER,OAAO;;CAEP,MAAM;;CAEN,KAAK,KAAK,aAAa,GAAG;;CAE1B,MAAM,WAAW,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,GAAG,CAAC,CAAC;;CAE3C,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG;CACrB,OAAO,OAAO,EAAE,WAAW,GAAG,EAAE;CAChC,OAAO,OAAO,EAAE,WAAW,GAAG,EAAE;CAChC,OAAO,OAAO,EAAE,WAAW,EAAE;CAC7B,OAAO,CAAC;;CAER,MAAM;;CAEN,KAAK,KAAK,mBAAmB,GAAG;;CAEhC,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEjC,OAAO,WAAW,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,GAAG,CAAC,CAAC;;CAE5C,OAAO,MAAM,GAAG,IAAI,OAAO;CAC3B,QAAQ,OAAO,EAAE,WAAW,GAAG,EAAE;CACjC,QAAQ,OAAO,EAAE,WAAW,GAAG,EAAE;CACjC,QAAQ,OAAO,EAAE,WAAW,EAAE;CAC9B,QAAQ,CAAC;;CAET,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;;CAEzC,OAAO;;CAEP,MAAM;;;CAGN,KAAK,KAAK,YAAY,GAAG;;CAEzB,MAAM,UAAU,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC;CACtC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC;;CAEhD,MAAM;;;CAGN,KAAK,KAAK,kBAAkB,GAAG;;CAE/B,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEjC,OAAO,UAAU,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC;CACvC,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;;CAEnE,OAAO;;CAEP,MAAM;;CAEN,KAAK,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEjC,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH,EAAE,SAAS,SAAS,EAAE,IAAI,EAAE,QAAQ,GAAG;;CAEvC,GAAG,IAAI,mBAAmB,GAAG,EAAE,IAAI,CAAC,mBAAmB,KAAK,SAAS,KAAK,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;;CAEvG,GAAG,KAAK,IAAI,CAAC,WAAW,GAAG;;CAE3B,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,mBAAmB,GAAG;;CAEpF,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;CACnC,KAAK,IAAI,CAAC,GAAG,EAAE,mBAAmB,GAAG,CAAC,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;CACzE,KAAK,IAAI,CAAC,GAAG,EAAE,mBAAmB,GAAG,CAAC,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;CACzE,KAAK,IAAI,CAAC,GAAG,EAAE,mBAAmB,GAAG,CAAC,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;;CAEzE,KAAK,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE5D,KAAK;;CAEL,IAAI;;CAEJ,GAAG,KAAK,IAAI,CAAC,WAAW,GAAG;;CAE3B,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,mBAAmB,GAAG;;CAEpF,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;CACnC,KAAK,IAAI,CAAC,GAAG,EAAE,mBAAmB,GAAG,CAAC,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;CACzE,KAAK,IAAI,CAAC,GAAG,EAAE,mBAAmB,GAAG,CAAC,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;CACzE,KAAK,IAAI,CAAC,GAAG,EAAE,mBAAmB,GAAG,CAAC,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;;CAEzE,KAAK,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE5D,KAAK;;CAEL,IAAI;;CAEJ,GAAG,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;;CAE/B,GAAG,KAAK,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,WAAW,CAAC,MAAM,KAAK,QAAQ,CAAC,WAAW,CAAC,MAAM,IAAI,QAAQ,CAAC,WAAW,CAAC,MAAM,KAAK,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG;;CAErL,IAAI,OAAO,CAAC,IAAI,EAAE,qCAAqC,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,kBAAkB;CACvG,KAAK,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,sBAAsB,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;;CAE9G,IAAI;;CAEJ,GAAG;;CAEH,EAAE,SAAS,aAAa,EAAE,IAAI,EAAE,QAAQ,GAAG;;CAE3C,GAAG,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;;CAE1B,GAAG,KAAK,IAAI,CAAC,YAAY,KAAK,SAAS,GAAG;;CAE1C,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEjE,KAAK,QAAQ,CAAC,YAAY,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;CACrC,KAAK,QAAQ,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;CACnE,KAAK,QAAQ,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,QAAQ,GAAG,EAAE,CAAC;;CAE9C,KAAK,IAAI,WAAW,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC;CAC3D,KAAK,IAAI,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC;;CAEvD,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG;;CAEhE,MAAM,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;CACjC,MAAM,MAAM,CAAC,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC;CAC1C,MAAM,MAAM,CAAC,CAAC,GAAG,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC;CAC9C,MAAM,MAAM,CAAC,CAAC,GAAG,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC;;CAE9C,MAAM,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;;CAEjC,MAAM;;CAEN,KAAK;;CAEL,IAAI;;CAEJ,GAAG,KAAK,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,GAAG;;CAExE,IAAI,OAAO,CAAC,IAAI,EAAE,iFAAiF,EAAE,CAAC;;CAEtG,IAAI,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;CAC/B,IAAI,IAAI,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC;;CAEnD,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAErD,KAAK,KAAK,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;;CAEtD,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH,EAAE,SAAS,eAAe,EAAE,IAAI,EAAE,QAAQ,GAAG;;CAE7C,GAAG,IAAI,gBAAgB,GAAG,EAAE,CAAC;;CAE7B;CACA,GAAG,IAAI,UAAU,GAAG,EAAE,CAAC;;CAEvB,GAAG,KAAK,IAAI,CAAC,SAAS,KAAK,SAAS,GAAG;;CAEvC,IAAI,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;;CAEtC,IAAI;;CAEJ,GAAG,KAAK,IAAI,CAAC,UAAU,KAAK,SAAS,GAAG;;CAExC,IAAI,KAAK,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG;;CAElC,KAAK,UAAU,GAAG,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;;CAEvD,KAAK,MAAM;;CAEX,KAAK,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;;CAExC,KAAK;;CAEL,IAAI;;CAEJ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAElD,IAAI,IAAI,IAAI,GAAG,aAAa,CAAC,cAAc,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;CAC/E,IAAI,KAAK,IAAI,GAAG,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE9C,IAAI;;CAEJ;CACA,GAAG,KAAK,QAAQ,CAAC,YAAY,GAAG;;CAEhC;CACA,IAAI,IAAI,mBAAmB,GAAG,aAAa,CAAC,mCAAmC,EAAE,QAAQ,CAAC,YAAY,EAAE,EAAE,EAAE,CAAC;CAC7G,IAAI,gBAAgB,GAAG,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC;;CAEtE,IAAI;;CAEJ,GAAG,KAAK,gBAAgB,CAAC,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,UAAU,GAAG,gBAAgB,CAAC;;CAE7E,GAAG;;CAEH,EAAE,OAAO,SAAS,KAAK,EAAE,IAAI,EAAE,WAAW,GAAG;;CAE7C,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,SAAS,GAAG;;CAElC;CACA,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;;CAErB,IAAI;;CAEJ,GAAG,KAAK,IAAI,CAAC,KAAK,KAAK,SAAS,GAAG;;CAEnC,IAAI,IAAI,CAAC,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC;;CAElC,IAAI,MAAM;;CAEV,IAAI,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;;CAErB,IAAI;;CAEJ,GAAG,IAAI,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;;CAEjC,GAAG,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;CAChC,GAAG,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;CAC/B,GAAG,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;CACnC,GAAG,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;;CAErC,GAAG,QAAQ,CAAC,kBAAkB,EAAE,CAAC;CACjC,GAAG,QAAQ,CAAC,qBAAqB,EAAE,CAAC;;CAEpC,GAAG,KAAK,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,GAAG;;CAEtE,IAAI,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;;CAElC,IAAI,MAAM;;CAEV,IAAI,IAAI,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;;CAEpG,IAAI,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;;CAExD,IAAI;;CAEJ,GAAG,CAAC;;CAEJ,EAAE,IAAI;;CAEN,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,YAAY,EAAE,OAAO,GAAG;;CAEjC,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,OAAO,KAAK,SAAS,KAAK,OAAO,GAAG,qBAAqB,CAAC;CAC5E,CAAC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;;CAEvB,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,SAAS,EAAE;;CAEvC,CAAC,IAAI,EAAE,WAAW,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG;;CAErD,EAAE,KAAK,IAAI,CAAC,WAAW,KAAK,EAAE,GAAG;;CAEjC,GAAG,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;;CAErE,GAAG;;CAEH,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC;;CAEnB,EAAE,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;CAC/C,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,IAAI,GAAG;;CAEtC,GAAG,IAAI,IAAI,GAAG,IAAI,CAAC;;CAEnB,GAAG,IAAI;;CAEP,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;;CAE9B,IAAI,CAAC,QAAQ,KAAK,GAAG;;CAErB,IAAI,KAAK,OAAO,KAAK,SAAS,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC;;CAElD,IAAI,OAAO,CAAC,KAAK,EAAE,mCAAmC,GAAG,GAAG,GAAG,GAAG,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;;CAEpF,IAAI,OAAO;;CAEX,IAAI;;CAEJ,GAAG,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAEhC,GAAG,KAAK,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,UAAU,GAAG;;CAE9G,IAAI,OAAO,CAAC,KAAK,EAAE,kCAAkC,GAAG,GAAG,GAAG,iCAAiC,EAAE,CAAC;CAClG,IAAI,OAAO;;CAEX,IAAI;;CAEJ,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE/B,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;;CAE3B,EAAE;;CAEF,CAAC,cAAc,EAAE,WAAW,KAAK,GAAG;;CAEpC,EAAE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;;CAE3B,EAAE;;CAEF,CAAC,cAAc,EAAE,WAAW,KAAK,GAAG;;CAEpC,EAAE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;;CAE3B,EAAE;;CAEF,CAAC,KAAK,EAAE,WAAW,IAAI,EAAE,MAAM,GAAG;;CAElC,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;CAC9C,EAAE,IAAI,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;;CAEnE,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,YAAY;;CAE1D,GAAG,KAAK,MAAM,KAAK,SAAS,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC;;CAEhD,GAAG,EAAE,CAAC;;CAEN,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;CAC7D,EAAE,IAAI,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC;;CAElE,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;;CAEtE,EAAE,KAAK,IAAI,CAAC,UAAU,GAAG;;CAEzB,GAAG,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;;CAE/D,GAAG;;CAEH,EAAE,KAAK,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,GAAG;;CAE/D,GAAG,KAAK,MAAM,KAAK,SAAS,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC;;CAEhD,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC;;CAEhB,EAAE;;CAEF,CAAC,UAAU,EAAE,WAAW,IAAI,GAAG;;CAE/B,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC;;CAElB,EAAE,KAAK,IAAI,KAAK,SAAS,GAAG;;CAE5B,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEnD,IAAI,IAAI,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;;CAElD,IAAI,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC;;CAEjC,IAAI;;CAEJ,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC;;CAEhB,EAAE;;CAEF,CAAC,eAAe,EAAE,WAAW,IAAI,EAAE,MAAM,GAAG;;CAE5C,EAAE,IAAI,UAAU,GAAG,EAAE,CAAC;;CAEtB,EAAE,KAAK,IAAI,KAAK,SAAS,GAAG;;CAE5B,GAAG,IAAI,cAAc,GAAG,IAAI,UAAU,EAAE,CAAC;CACzC,GAAG,IAAI,oBAAoB,GAAG,IAAI,oBAAoB,EAAE,CAAC;;CAEzD,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEnD,IAAI,IAAI,QAAQ,CAAC;CACjB,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;;CAEzB,IAAI,SAAS,IAAI,CAAC,IAAI;;CAEtB,KAAK,KAAK,eAAe,CAAC;CAC1B,KAAK,KAAK,qBAAqB;;CAE/B,MAAM,QAAQ,GAAG,IAAI,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE;CAC5C,OAAO,IAAI,CAAC,KAAK;CACjB,OAAO,IAAI,CAAC,MAAM;CAClB,OAAO,IAAI,CAAC,aAAa;CACzB,OAAO,IAAI,CAAC,cAAc;CAC1B,OAAO,CAAC;;CAER,MAAM,MAAM;;CAEZ,KAAK,KAAK,aAAa,CAAC;CACxB,KAAK,KAAK,mBAAmB,CAAC;CAC9B,KAAK,KAAK,cAAc;;CAExB,MAAM,QAAQ,GAAG,IAAI,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE;CAC5C,OAAO,IAAI,CAAC,KAAK;CACjB,OAAO,IAAI,CAAC,MAAM;CAClB,OAAO,IAAI,CAAC,KAAK;CACjB,OAAO,IAAI,CAAC,aAAa;CACzB,OAAO,IAAI,CAAC,cAAc;CAC1B,OAAO,IAAI,CAAC,aAAa;CACzB,OAAO,CAAC;;CAER,MAAM,MAAM;;CAEZ,KAAK,KAAK,gBAAgB,CAAC;CAC3B,KAAK,KAAK,sBAAsB;;CAEhC,MAAM,QAAQ,GAAG,IAAI,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE;CAC5C,OAAO,IAAI,CAAC,MAAM;CAClB,OAAO,IAAI,CAAC,QAAQ;CACpB,OAAO,IAAI,CAAC,UAAU;CACtB,OAAO,IAAI,CAAC,WAAW;CACvB,OAAO,CAAC;;CAER,MAAM,MAAM;;CAEZ,KAAK,KAAK,kBAAkB,CAAC;CAC7B,KAAK,KAAK,wBAAwB;;CAElC,MAAM,QAAQ,GAAG,IAAI,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE;CAC5C,OAAO,IAAI,CAAC,SAAS;CACrB,OAAO,IAAI,CAAC,YAAY;CACxB,OAAO,IAAI,CAAC,MAAM;CAClB,OAAO,IAAI,CAAC,cAAc;CAC1B,OAAO,IAAI,CAAC,cAAc;CAC1B,OAAO,IAAI,CAAC,SAAS;CACrB,OAAO,IAAI,CAAC,UAAU;CACtB,OAAO,IAAI,CAAC,WAAW;CACvB,OAAO,CAAC;;CAER,MAAM,MAAM;;CAEZ,KAAK,KAAK,cAAc,CAAC;CACzB,KAAK,KAAK,oBAAoB;;CAE9B,MAAM,QAAQ,GAAG,IAAI,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE;CAC5C,OAAO,IAAI,CAAC,MAAM;CAClB,OAAO,IAAI,CAAC,MAAM;CAClB,OAAO,IAAI,CAAC,cAAc;CAC1B,OAAO,IAAI,CAAC,cAAc;CAC1B,OAAO,IAAI,CAAC,SAAS;CACrB,OAAO,IAAI,CAAC,UAAU;CACtB,OAAO,IAAI,CAAC,WAAW;CACvB,OAAO,CAAC;;CAER,MAAM,MAAM;;CAEZ,KAAK,KAAK,gBAAgB,CAAC;CAC3B,KAAK,KAAK,sBAAsB;;CAEhC,MAAM,QAAQ,GAAG,IAAI,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE;CAC5C,OAAO,IAAI,CAAC,MAAM;CAClB,OAAO,IAAI,CAAC,aAAa;CACzB,OAAO,IAAI,CAAC,cAAc;CAC1B,OAAO,IAAI,CAAC,QAAQ;CACpB,OAAO,IAAI,CAAC,SAAS;CACrB,OAAO,IAAI,CAAC,UAAU;CACtB,OAAO,IAAI,CAAC,WAAW;CACvB,OAAO,CAAC;;CAER,MAAM,MAAM;;CAEZ,KAAK,KAAK,sBAAsB,CAAC;CACjC,KAAK,KAAK,4BAA4B,CAAC;CACvC,KAAK,KAAK,qBAAqB,CAAC;CAChC,KAAK,KAAK,2BAA2B,CAAC;CACtC,KAAK,KAAK,oBAAoB,CAAC;CAC/B,KAAK,KAAK,0BAA0B,CAAC;CACrC,KAAK,KAAK,qBAAqB,CAAC;CAChC,KAAK,KAAK,2BAA2B;;CAErC,MAAM,QAAQ,GAAG,IAAI,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE;CAC5C,OAAO,IAAI,CAAC,MAAM;CAClB,OAAO,IAAI,CAAC,MAAM;CAClB,OAAO,CAAC;;CAER,MAAM,MAAM;;CAEZ,KAAK,KAAK,cAAc,CAAC;CACzB,KAAK,KAAK,oBAAoB;;CAE9B,MAAM,QAAQ,GAAG,IAAI,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE;CAC5C,OAAO,IAAI,CAAC,WAAW;CACvB,OAAO,IAAI,CAAC,WAAW;CACvB,OAAO,IAAI,CAAC,aAAa;CACzB,OAAO,IAAI,CAAC,WAAW;CACvB,OAAO,IAAI,CAAC,UAAU;CACtB,OAAO,IAAI,CAAC,WAAW;CACvB,OAAO,CAAC;;CAER,MAAM,MAAM;;CAEZ,KAAK,KAAK,eAAe,CAAC;CAC1B,KAAK,KAAK,qBAAqB;;CAE/B,MAAM,QAAQ,GAAG,IAAI,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE;CAC5C,OAAO,IAAI,CAAC,MAAM;CAClB,OAAO,IAAI,CAAC,IAAI;CAChB,OAAO,IAAI,CAAC,cAAc;CAC1B,OAAO,IAAI,CAAC,eAAe;CAC3B,OAAO,IAAI,CAAC,GAAG;CACf,OAAO,CAAC;;CAER,MAAM,MAAM;;CAEZ,KAAK,KAAK,mBAAmB,CAAC;CAC9B,KAAK,KAAK,yBAAyB;;CAEnC,MAAM,QAAQ,GAAG,IAAI,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE;CAC5C,OAAO,IAAI,CAAC,MAAM;CAClB,OAAO,IAAI,CAAC,IAAI;CAChB,OAAO,IAAI,CAAC,eAAe;CAC3B,OAAO,IAAI,CAAC,cAAc;CAC1B,OAAO,IAAI,CAAC,CAAC;CACb,OAAO,IAAI,CAAC,CAAC;CACb,OAAO,CAAC;;CAER,MAAM,MAAM;;CAEZ,KAAK,KAAK,eAAe,CAAC;CAC1B,KAAK,KAAK,qBAAqB;;CAE/B,MAAM,QAAQ,GAAG,IAAI,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE;CAC5C,OAAO,IAAI,CAAC,MAAM;CAClB,OAAO,IAAI,CAAC,QAAQ;CACpB,OAAO,IAAI,CAAC,QAAQ;CACpB,OAAO,IAAI,CAAC,SAAS;CACrB,OAAO,CAAC;;CAER,MAAM,MAAM;;CAEZ,KAAK,KAAK,oBAAoB,CAAC;CAC/B,KAAK,KAAK,0BAA0B;;CAEpC,MAAM,QAAQ,GAAG,IAAI,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE;CAC5C,OAAO,IAAI,CAAC,QAAQ;CACpB,OAAO,IAAI,CAAC,OAAO;CACnB,OAAO,IAAI,CAAC,MAAM;CAClB,OAAO,IAAI,CAAC,OAAO;CACnB,OAAO,CAAC;;CAER,MAAM,MAAM;;CAEZ,KAAK,KAAK,eAAe,CAAC;CAC1B,KAAK,KAAK,qBAAqB;;CAE/B,MAAM,IAAI,cAAc,GAAG,EAAE,CAAC;;CAE9B,MAAM,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAE/D,OAAO,IAAI,KAAK,GAAG,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE9C,OAAO,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;;CAEpC,OAAO;;CAEP,MAAM,QAAQ,GAAG,IAAI,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE;CAC5C,OAAO,cAAc;CACrB,OAAO,IAAI,CAAC,aAAa;CACzB,OAAO,CAAC;;CAER,MAAM,MAAM;;CAEZ,KAAK,KAAK,gBAAgB;;CAE1B,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;;CAEpD,MAAM,MAAM;;CAEZ,KAAK,KAAK,UAAU;;CAEpB,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC;;CAEzE,MAAM,MAAM;;CAEZ,KAAK;;CAEL,MAAM,OAAO,CAAC,IAAI,EAAE,iDAAiD,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC;;CAE1F,MAAM,SAAS;;CAEf,KAAK;;CAEL,IAAI,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;;CAE9B,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,SAAS,GAAG,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;;CAE7D,IAAI,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC;;CAEvC,IAAI;;CAEJ,GAAG;;CAEH,EAAE,OAAO,UAAU,CAAC;;CAEpB,EAAE;;CAEF,CAAC,cAAc,EAAE,WAAW,IAAI,EAAE,QAAQ,GAAG;;CAE7C,EAAE,IAAI,SAAS,GAAG,EAAE,CAAC;;CAErB,EAAE,KAAK,IAAI,KAAK,SAAS,GAAG;;CAE5B,GAAG,IAAI,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;CACrC,GAAG,MAAM,CAAC,WAAW,EAAE,QAAQ,EAAE,CAAC;;CAElC,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEnD,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;;CAEzB,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,eAAe,GAAG;;CAEzC;;CAEA,KAAK,IAAI,KAAK,GAAG,EAAE,CAAC;;CAEpB,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAExD,MAAM,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;;CAExD,MAAM;;CAEN,KAAK,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC;;CAEpC,KAAK,MAAM;;CAEX,KAAK,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;;CAEnD,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH,EAAE,OAAO,SAAS,CAAC;;CAEnB,EAAE;;CAEF,CAAC,eAAe,EAAE,WAAW,IAAI,GAAG;;CAEpC,EAAE,IAAI,UAAU,GAAG,EAAE,CAAC;;CAEtB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAE3C,GAAG,IAAI,IAAI,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE/C,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE3B,GAAG;;CAEH,EAAE,OAAO,UAAU,CAAC;;CAEpB,EAAE;;CAEF,CAAC,WAAW,EAAE,WAAW,IAAI,EAAE,MAAM,GAAG;;CAExC,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC;CACnB,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC;;CAElB,EAAE,SAAS,SAAS,EAAE,GAAG,GAAG;;CAE5B,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC;;CAElC,GAAG,OAAO,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,YAAY;;CAExC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;;CAEjC,IAAI,EAAE,SAAS,EAAE,YAAY;;CAE7B,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;CACjC,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC;;CAEnC,IAAI,EAAE,CAAC;;CAEP,GAAG;;CAEH,EAAE,KAAK,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG;;CAE/C,GAAG,IAAI,OAAO,GAAG,IAAI,cAAc,EAAE,MAAM,EAAE,CAAC;;CAE9C,GAAG,IAAI,MAAM,GAAG,IAAI,WAAW,EAAE,OAAO,EAAE,CAAC;CAC3C,GAAG,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;;CAE7C,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEnD,IAAI,IAAI,KAAK,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;CAC1B,IAAI,IAAI,IAAI,GAAG,2BAA2B,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC;;CAEzG,IAAI,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,SAAS,EAAE,IAAI,EAAE,CAAC;;CAE7C,IAAI;;CAEJ,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC;;CAEhB,EAAE;;CAEF,CAAC,aAAa,EAAE,WAAW,IAAI,EAAE,MAAM,GAAG;;CAE1C,EAAE,SAAS,aAAa,EAAE,KAAK,EAAE,IAAI,GAAG;;CAExC,GAAG,KAAK,OAAO,KAAK,KAAK,QAAQ,GAAG,OAAO,KAAK,CAAC;;CAEjD,GAAG,OAAO,CAAC,IAAI,EAAE,sEAAsE,EAAE,KAAK,EAAE,CAAC;;CAEjG,GAAG,OAAO,IAAI,EAAE,KAAK,EAAE,CAAC;;CAExB,GAAG;;CAEH,EAAE,IAAI,QAAQ,GAAG,EAAE,CAAC;;CAEpB,EAAE,KAAK,IAAI,KAAK,SAAS,GAAG;;CAE5B,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEnD,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;;CAEzB,IAAI,KAAK,IAAI,CAAC,KAAK,KAAK,SAAS,GAAG;;CAEpC,KAAK,OAAO,CAAC,IAAI,EAAE,8CAA8C,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;;CAE/E,KAAK;;CAEL,IAAI,KAAK,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,SAAS,GAAG;;CAE9C,KAAK,OAAO,CAAC,IAAI,EAAE,qCAAqC,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;;CAEvE,KAAK;;CAEL,IAAI,IAAI,OAAO,GAAG,IAAI,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;CACtD,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;;CAE/B,IAAI,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;;CAE7B,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,SAAS,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;;CAE5D,IAAI,KAAK,IAAI,CAAC,OAAO,KAAK,SAAS,GAAG,OAAO,CAAC,OAAO,GAAG,aAAa,EAAE,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC;;CAEvG,IAAI,KAAK,IAAI,CAAC,MAAM,KAAK,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;CAC7E,IAAI,KAAK,IAAI,CAAC,MAAM,KAAK,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;CAC7E,IAAI,KAAK,IAAI,CAAC,MAAM,KAAK,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;CAC7E,IAAI,KAAK,IAAI,CAAC,QAAQ,KAAK,SAAS,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAExE,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,SAAS,GAAG;;CAEnC,KAAK,OAAO,CAAC,KAAK,GAAG,aAAa,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,gBAAgB,EAAE,CAAC;CACvE,KAAK,OAAO,CAAC,KAAK,GAAG,aAAa,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,gBAAgB,EAAE,CAAC;;CAEvE,KAAK;;CAEL,IAAI,KAAK,IAAI,CAAC,MAAM,KAAK,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;CAElE,IAAI,KAAK,IAAI,CAAC,SAAS,KAAK,SAAS,GAAG,OAAO,CAAC,SAAS,GAAG,aAAa,EAAE,IAAI,CAAC,SAAS,EAAE,cAAc,EAAE,CAAC;CAC5G,IAAI,KAAK,IAAI,CAAC,SAAS,KAAK,SAAS,GAAG,OAAO,CAAC,SAAS,GAAG,aAAa,EAAE,IAAI,CAAC,SAAS,EAAE,cAAc,EAAE,CAAC;CAC5G,IAAI,KAAK,IAAI,CAAC,UAAU,KAAK,SAAS,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;;CAE9E,IAAI,KAAK,IAAI,CAAC,KAAK,KAAK,SAAS,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;;CAE/D,IAAI,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC;;CAEpC,IAAI;;CAEJ,GAAG;;CAEH,EAAE,OAAO,QAAQ,CAAC;;CAElB,EAAE;;CAEF,CAAC,WAAW,EAAE,WAAW,IAAI,EAAE,UAAU,EAAE,SAAS,GAAG;;CAEvD,EAAE,IAAI,MAAM,CAAC;;CAEb,EAAE,SAAS,WAAW,EAAE,IAAI,GAAG;;CAE/B,GAAG,KAAK,UAAU,EAAE,IAAI,EAAE,KAAK,SAAS,GAAG;;CAE3C,IAAI,OAAO,CAAC,IAAI,EAAE,wCAAwC,EAAE,IAAI,EAAE,CAAC;;CAEnE,IAAI;;CAEJ,GAAG,OAAO,UAAU,EAAE,IAAI,EAAE,CAAC;;CAE7B,GAAG;;CAEH,EAAE,SAAS,WAAW,EAAE,IAAI,GAAG;;CAE/B,GAAG,KAAK,IAAI,KAAK,SAAS,GAAG,OAAO,SAAS,CAAC;;CAE9C,GAAG,KAAK,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG;;CAEhC,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;;CAEnB,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEpD,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;;CAE1B,KAAK,KAAK,SAAS,EAAE,IAAI,EAAE,KAAK,SAAS,GAAG;;CAE5C,MAAM,OAAO,CAAC,IAAI,EAAE,wCAAwC,EAAE,IAAI,EAAE,CAAC;;CAErE,MAAM;;CAEN,KAAK,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC;;CAErC,KAAK;;CAEL,IAAI,OAAO,KAAK,CAAC;;CAEjB,IAAI;;CAEJ,GAAG,KAAK,SAAS,EAAE,IAAI,EAAE,KAAK,SAAS,GAAG;;CAE1C,IAAI,OAAO,CAAC,IAAI,EAAE,wCAAwC,EAAE,IAAI,EAAE,CAAC;;CAEnE,IAAI;;CAEJ,GAAG,OAAO,SAAS,EAAE,IAAI,EAAE,CAAC;;CAE5B,GAAG;;CAEH,EAAE,SAAS,IAAI,CAAC,IAAI;;CAEpB,GAAG,KAAK,OAAO;;CAEf,IAAI,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;;CAEzB,IAAI,KAAK,IAAI,CAAC,UAAU,KAAK,SAAS,GAAG;;CAEzC,KAAK,KAAK,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,GAAG;;CAEhD,MAAM,MAAM,CAAC,UAAU,GAAG,IAAI,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;;CAEvD,MAAM;;CAEN,KAAK;;CAEL,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,SAAS,GAAG;;CAElC,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,GAAG;;CAEpC,MAAM,MAAM,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;;CAE1E,MAAM,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,GAAG;;CAE/C,MAAM,MAAM,CAAC,GAAG,GAAG,IAAI,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;;CAEnE,MAAM;;CAEN,KAAK;;CAEL,IAAI,MAAM;;CAEV,GAAG,KAAK,mBAAmB;;CAE3B,IAAI,MAAM,GAAG,IAAI,iBAAiB,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;;CAEjF,IAAI,KAAK,IAAI,CAAC,KAAK,KAAK,SAAS,GAAG,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;CAC9D,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,SAAS,GAAG,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;CAC3D,IAAI,KAAK,IAAI,CAAC,SAAS,KAAK,SAAS,GAAG,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;CAC1E,IAAI,KAAK,IAAI,CAAC,UAAU,KAAK,SAAS,GAAG,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;CAC7E,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,SAAS,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;;CAEhF,IAAI,MAAM;;CAEV,GAAG,KAAK,oBAAoB;;CAE5B,IAAI,MAAM,GAAG,IAAI,kBAAkB,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;;CAEzG,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,SAAS,GAAG,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;CAC3D,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,SAAS,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;;CAEhF,IAAI,MAAM;;CAEV,GAAG,KAAK,cAAc;;CAEtB,IAAI,MAAM,GAAG,IAAI,YAAY,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;;CAE5D,IAAI,MAAM;;CAEV,GAAG,KAAK,kBAAkB;;CAE1B,IAAI,MAAM,GAAG,IAAI,gBAAgB,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;;CAEhE,IAAI,MAAM;;CAEV,GAAG,KAAK,YAAY;;CAEpB,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;;CAErF,IAAI,MAAM;;CAEV,GAAG,KAAK,eAAe;;CAEvB,IAAI,MAAM,GAAG,IAAI,aAAa,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAEtF,IAAI,MAAM;;CAEV,GAAG,KAAK,WAAW;;CAEnB,IAAI,MAAM,GAAG,IAAI,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;;CAE/G,IAAI,MAAM;;CAEV,GAAG,KAAK,iBAAiB;;CAEzB,IAAI,MAAM,GAAG,IAAI,eAAe,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;;CAEjF,IAAI,MAAM;;CAEV,GAAG,KAAK,aAAa;;CAErB,IAAI,OAAO,CAAC,IAAI,EAAE,oEAAoE,EAAE,CAAC;;CAEzF,GAAG,KAAK,MAAM;;CAEd,IAAI,IAAI,QAAQ,GAAG,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;CAChD,IAAI,IAAI,QAAQ,GAAG,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;;CAEhD,IAAI,KAAK,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG;;CAEvD,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;;CAEpD,KAAK,MAAM;;CAEX,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;;CAE7C,KAAK;;CAEL,IAAI,MAAM;;CAEV,GAAG,KAAK,KAAK;;CAEb,IAAI,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;;CAEvB,IAAI,MAAM;;CAEV,GAAG,KAAK,MAAM;;CAEd,IAAI,MAAM,GAAG,IAAI,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;;CAE/F,IAAI,MAAM;;CAEV,GAAG,KAAK,UAAU;;CAElB,IAAI,MAAM,GAAG,IAAI,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;;CAExF,IAAI,MAAM;;CAEV,GAAG,KAAK,cAAc;;CAEtB,IAAI,MAAM,GAAG,IAAI,YAAY,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;;CAE5F,IAAI,MAAM;;CAEV,GAAG,KAAK,YAAY,CAAC;CACrB,GAAG,KAAK,QAAQ;;CAEhB,IAAI,MAAM,GAAG,IAAI,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;;CAEtF,IAAI,MAAM;;CAEV,GAAG,KAAK,QAAQ;;CAEhB,IAAI,MAAM,GAAG,IAAI,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;;CAExD,IAAI,MAAM;;CAEV,GAAG,KAAK,OAAO;;CAEf,IAAI,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;;CAEzB,IAAI,MAAM;;CAEV,GAAG;;CAEH,IAAI,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;;CAE5B,GAAG;;CAEH,EAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;;CAE1B,EAAE,KAAK,IAAI,CAAC,IAAI,KAAK,SAAS,GAAG,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;;CAEzD,EAAE,KAAK,IAAI,CAAC,MAAM,KAAK,SAAS,GAAG;;CAEnC,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAE1C,GAAG,KAAK,IAAI,CAAC,gBAAgB,KAAK,SAAS,GAAG,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;CAC9F,GAAG,KAAK,MAAM,CAAC,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;;CAE9G,GAAG,MAAM;;CAET,GAAG,KAAK,IAAI,CAAC,QAAQ,KAAK,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;CACjF,GAAG,KAAK,IAAI,CAAC,QAAQ,KAAK,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;CACjF,GAAG,KAAK,IAAI,CAAC,UAAU,KAAK,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;CACvF,GAAG,KAAK,IAAI,CAAC,KAAK,KAAK,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;;CAExE,GAAG;;CAEH,EAAE,KAAK,IAAI,CAAC,UAAU,KAAK,SAAS,GAAG,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;CAC3E,EAAE,KAAK,IAAI,CAAC,aAAa,KAAK,SAAS,GAAG,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;;CAEpF,EAAE,KAAK,IAAI,CAAC,MAAM,GAAG;;CAErB,GAAG,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;CAC/E,GAAG,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;CACrF,GAAG,KAAK,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;CACnG,GAAG,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;;CAEzG,GAAG;;CAEH,EAAE,KAAK,IAAI,CAAC,OAAO,KAAK,SAAS,GAAG,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;CAClE,EAAE,KAAK,IAAI,CAAC,aAAa,KAAK,SAAS,GAAG,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;CACpF,EAAE,KAAK,IAAI,CAAC,WAAW,KAAK,SAAS,GAAG,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;CAC9E,EAAE,KAAK,IAAI,CAAC,QAAQ,KAAK,SAAS,GAAG,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAErE,EAAE,KAAK,IAAI,CAAC,QAAQ,KAAK,SAAS,GAAG;;CAErC,GAAG,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAEhC,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAEhD,IAAI,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,CAAC;;CAE3E,IAAI;;CAEJ,GAAG;;CAEH,EAAE,KAAK,IAAI,CAAC,IAAI,KAAK,KAAK,GAAG;;CAE7B,GAAG,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;CAE5B,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAE9C,IAAI,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC;CAC5B,IAAI,IAAI,KAAK,GAAG,MAAM,CAAC,mBAAmB,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;;CAEnE,IAAI,KAAK,KAAK,KAAK,SAAS,GAAG;;CAE/B,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;;CAE9C,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC;;CAEhB,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,IAAI,eAAe,GAAG;CACtB,CAAC,SAAS,EAAE,SAAS;CACrB,CAAC,qBAAqB,EAAE,qBAAqB;CAC7C,CAAC,qBAAqB,EAAE,qBAAqB;CAC7C,CAAC,gCAAgC,EAAE,gCAAgC;CACnE,CAAC,gCAAgC,EAAE,gCAAgC;CACnE,CAAC,0BAA0B,EAAE,0BAA0B;CACvD,CAAC,uBAAuB,EAAE,uBAAuB;CACjD,CAAC,uBAAuB,EAAE,uBAAuB;CACjD,CAAC,CAAC;;CAEF,IAAI,gBAAgB,GAAG;CACvB,CAAC,cAAc,EAAE,cAAc;CAC/B,CAAC,mBAAmB,EAAE,mBAAmB;CACzC,CAAC,sBAAsB,EAAE,sBAAsB;CAC/C,CAAC,CAAC;;CAEF,IAAI,cAAc,GAAG;CACrB,CAAC,aAAa,EAAE,aAAa;CAC7B,CAAC,0BAA0B,EAAE,0BAA0B;CACvD,CAAC,yBAAyB,EAAE,yBAAyB;CACrD,CAAC,YAAY,EAAE,YAAY;CAC3B,CAAC,yBAAyB,EAAE,yBAAyB;CACrD,CAAC,wBAAwB,EAAE,wBAAwB;CACnD,CAAC,CAAC;AACF,AAuGA;CACA;CACA;CACA;CACA;;CAEA,SAAS,SAAS,GAAG;;CAErB,CAAC,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;;CAEzB,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;;CAE1B,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;CACpB,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEzB,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE;;CAEpC,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC,GAAG;;CAE3B,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;CAChC,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;CACzC,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAElC,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC,GAAG;;CAE3B,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAElC,EAAE;;CAEF,CAAC,gBAAgB,EAAE,WAAW,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG;;CAEnD,EAAE,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;;CAE1D,EAAE;;CAEF,CAAC,aAAa,EAAE,WAAW,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG;;CAEhE,EAAE,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;;CAEvE,EAAE;;CAEF,CAAC,UAAU,EAAE,WAAW,GAAG,GAAG;;CAE9B,EAAE,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC;;CAErC,EAAE;;CAEF,CAAC,QAAQ,EAAE,WAAW,KAAK,EAAE,OAAO,GAAG;;CAEvC,EAAE,SAAS,eAAe,EAAE,UAAU,GAAG;;CAEzC,GAAG,IAAI,MAAM,GAAG,EAAE,CAAC;;CAEnB,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEzD,IAAI,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC,EAAE,CAAC;;CAElC,IAAI,IAAI,QAAQ,GAAG,IAAI,KAAK,EAAE,CAAC;CAC/B,IAAI,QAAQ,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;;CAErC,IAAI,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;;CAE5B,IAAI;;CAEJ,GAAG,OAAO,MAAM,CAAC;;CAEjB,GAAG;;CAEH,EAAE,SAAS,oBAAoB,EAAE,IAAI,EAAE,SAAS,GAAG;;CAEnD,GAAG,IAAI,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC;;CAElC;CACA;CACA;CACA;CACA,GAAG,IAAI,MAAM,GAAG,KAAK,CAAC;CACtB,GAAG,MAAM,IAAI,CAAC,GAAG,OAAO,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,GAAG;;CAE7D,IAAI,IAAI,SAAS,GAAG,SAAS,EAAE,CAAC,EAAE,CAAC;CACnC,IAAI,IAAI,UAAU,GAAG,SAAS,EAAE,CAAC,EAAE,CAAC;;CAEpC,IAAI,IAAI,MAAM,GAAG,UAAU,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;CAC5C,IAAI,IAAI,MAAM,GAAG,UAAU,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;;CAE5C,IAAI,KAAK,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,GAAG;;CAE/C;CACA,KAAK,KAAK,MAAM,GAAG,CAAC,GAAG;;CAEvB,MAAM,SAAS,GAAG,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,EAAE,MAAM,CAAC;CACpD,MAAM,UAAU,GAAG,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,EAAE,MAAM,CAAC;;CAErD,MAAM;CACN,KAAK,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,KAAK,SAAS;;CAE7E,KAAK,KAAK,IAAI,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,GAAG;;CAEnC,MAAM,KAAK,IAAI,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,IAAI,OAAO,IAAI,CAAC;CACjD;;CAEA,MAAM,MAAM;;CAEZ,MAAM,IAAI,QAAQ,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC;CAC3F,MAAM,KAAK,QAAQ,KAAK,CAAC,MAAM,OAAO,IAAI,CAAC;CAC3C,MAAM,KAAK,QAAQ,GAAG,CAAC,OAAO,SAAS;CACvC,MAAM,MAAM,GAAG,EAAE,MAAM,CAAC;;CAExB,MAAM;;CAEN,KAAK,MAAM;;CAEX;CACA,KAAK,KAAK,IAAI,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,KAAK,SAAS;CAC9C;CACA,KAAK,KAAK,EAAE,EAAE,UAAU,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,EAAE;CACnE,SAAS,EAAE,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,EAAE,EAAE,IAAI,OAAO,IAAI,CAAC;CAClF;;CAEA,KAAK;;CAEL,IAAI;;CAEJ,GAAG,OAAO,MAAM,CAAC;;CAEjB,GAAG;;CAEH,EAAE,IAAI,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC;;CAE3C,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;CAC/B,EAAE,KAAK,QAAQ,CAAC,MAAM,KAAK,CAAC,GAAG,OAAO,EAAE,CAAC;;CAEzC,EAAE,KAAK,OAAO,KAAK,IAAI,GAAG,OAAO,eAAe,EAAE,QAAQ,EAAE,CAAC;;;CAG7D,EAAE,IAAI,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,EAAE,CAAC;;CAE5C,EAAE,KAAK,QAAQ,CAAC,MAAM,KAAK,CAAC,GAAG;;CAE/B,GAAG,OAAO,GAAG,QAAQ,EAAE,CAAC,EAAE,CAAC;CAC3B,GAAG,QAAQ,GAAG,IAAI,KAAK,EAAE,CAAC;CAC1B,GAAG,QAAQ,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CACpC,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;CAC3B,GAAG,OAAO,MAAM,CAAC;;CAEjB,GAAG;;CAEH,EAAE,IAAI,UAAU,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC;CAC9D,EAAE,UAAU,GAAG,KAAK,GAAG,EAAE,UAAU,GAAG,UAAU,CAAC;;CAEjD;;CAEA,EAAE,IAAI,gBAAgB,GAAG,EAAE,CAAC;CAC5B,EAAE,IAAI,SAAS,GAAG,EAAE,CAAC;CACrB,EAAE,IAAI,aAAa,GAAG,EAAE,CAAC;CACzB,EAAE,IAAI,OAAO,GAAG,CAAC,CAAC;CAClB,EAAE,IAAI,SAAS,CAAC;;CAEhB,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;CACnC,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;;CAEhC,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEtD,GAAG,OAAO,GAAG,QAAQ,EAAE,CAAC,EAAE,CAAC;CAC3B,GAAG,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;CACnC,GAAG,KAAK,GAAG,WAAW,EAAE,SAAS,EAAE,CAAC;CACpC,GAAG,KAAK,GAAG,KAAK,GAAG,EAAE,KAAK,GAAG,KAAK,CAAC;;CAEnC,GAAG,KAAK,KAAK,GAAG;;CAEhB,IAAI,KAAK,EAAE,EAAE,UAAU,QAAQ,SAAS,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,GAAG,CAAC;;CAEnE,IAAI,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,KAAK,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC;CAC5D,IAAI,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;;CAEnD,IAAI,KAAK,UAAU,GAAG,OAAO,GAAG,CAAC;CACjC,IAAI,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;;CAElC;;CAEA,IAAI,MAAM;;CAEV,IAAI,aAAa,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;;CAEvE;;CAEA,IAAI;;CAEJ,GAAG;;CAEH;CACA,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,OAAO,eAAe,EAAE,QAAQ,EAAE,CAAC;;;CAG7D,EAAE,KAAK,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG;;CAE9B,GAAG,IAAI,SAAS,GAAG,KAAK,CAAC;CACzB,GAAG,IAAI,QAAQ,GAAG,EAAE,CAAC;;CAErB,GAAG,MAAM,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,GAAG;;CAEvE,IAAI,gBAAgB,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;;CAElC,IAAI;;CAEJ,GAAG,MAAM,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,GAAG;;CAEvE,IAAI,IAAI,GAAG,GAAG,aAAa,EAAE,IAAI,EAAE,CAAC;;CAEpC,IAAI,MAAM,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,GAAG;;CAErD,KAAK,IAAI,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC;CAC1B,KAAK,IAAI,eAAe,GAAG,IAAI,CAAC;;CAEhC,KAAK,MAAM,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,GAAG,GAAG;;CAE/D,MAAM,KAAK,oBAAoB,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG;;CAEhE,OAAO,KAAK,IAAI,KAAK,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;CACtF,OAAO,KAAK,eAAe,GAAG;;CAE9B,QAAQ,eAAe,GAAG,KAAK,CAAC;CAChC,QAAQ,gBAAgB,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;;CAE7C,QAAQ,MAAM;;CAEd,QAAQ,SAAS,GAAG,IAAI,CAAC;;CAEzB,QAAQ;;CAER,OAAO;;CAEP,MAAM;CACN,KAAK,KAAK,eAAe,GAAG;;CAE5B,MAAM,gBAAgB,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;;CAE1C,MAAM;;CAEN,KAAK;;CAEL,IAAI;CACJ;CACA,GAAG,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG;;CAE9B;CACA,IAAI,KAAK,EAAE,SAAS,GAAG,aAAa,GAAG,gBAAgB,CAAC;;CAExD,IAAI;;CAEJ,GAAG;;CAEH,EAAE,IAAI,QAAQ,CAAC;;CAEf,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEzD,GAAG,QAAQ,GAAG,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;CAC/B,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;CAC3B,GAAG,QAAQ,GAAG,aAAa,EAAE,CAAC,EAAE,CAAC;;CAEjC,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEzD,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;;CAE3C,IAAI;;CAEJ,GAAG;;CAEH;;CAEA,EAAE,OAAO,MAAM,CAAC;;CAEhB,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;;CAEA,SAAS,IAAI,EAAE,IAAI,GAAG;;CAEtB,CAAC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;;CAEpB,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;;CAElB,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE;;CAE/B,CAAC,MAAM,EAAE,IAAI;;CAEb,CAAC,cAAc,EAAE,WAAW,IAAI,EAAE,IAAI,EAAE,SAAS,GAAG;;CAEpD,EAAE,KAAK,IAAI,KAAK,SAAS,GAAG,IAAI,GAAG,GAAG,CAAC;CACvC,EAAE,KAAK,SAAS,KAAK,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC;;CAE/C,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC;CAClB,EAAE,IAAI,KAAK,GAAG,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;;CAE9D,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAErD,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;;CAE/D,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC;;CAEhB,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,SAAS,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,GAAG;;CAEpD,CAAC,IAAI,KAAK,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC;CACxC,CAAC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC;CACpC,CAAC,IAAI,WAAW,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,kBAAkB,KAAK,KAAK,CAAC;;CAEvG,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;;CAEhB,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC;;CAE9B,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAE3C,EAAE,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;;CAExB,EAAE,KAAK,IAAI,KAAK,IAAI,GAAG;;CAEvB,GAAG,OAAO,GAAG,CAAC,CAAC;CACf,GAAG,OAAO,IAAI,WAAW,CAAC;;CAE1B,GAAG,MAAM;;CAET,GAAG,IAAI,GAAG,GAAG,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;CAC1E,GAAG,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC;CAC1B,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;;CAE1B,GAAG;;CAEH,EAAE;;CAEF,CAAC,OAAO,KAAK,CAAC;;CAEd,CAAC;;CAED,SAAS,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,GAAG;;CAEtE,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC;;CAEvD,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;;CAEvB,CAAC,IAAI,IAAI,GAAG,IAAI,SAAS,EAAE,CAAC;;CAE5B,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;;CAE5C,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG;;CAEhB,EAAE,IAAI,OAAO,GAAG,KAAK,CAAC,cAAc,MAAM,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;;CAExF,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI;;CAEhD,GAAG,IAAI,MAAM,GAAG,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC;;CAEhC,GAAG,SAAS,MAAM;;CAElB,IAAI,KAAK,GAAG;;CAEZ,KAAK,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,OAAO,CAAC;CAC3C,KAAK,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,OAAO,CAAC;;CAE3C,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEzB,KAAK,MAAM;;CAEX,IAAI,KAAK,GAAG;;CAEZ,KAAK,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,OAAO,CAAC;CAC3C,KAAK,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,OAAO,CAAC;;CAE3C,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEzB,KAAK,MAAM;;CAEX,IAAI,KAAK,GAAG;;CAEZ,KAAK,GAAG,GAAG,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,OAAO,CAAC;CAC7C,KAAK,GAAG,GAAG,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,OAAO,CAAC;CAC7C,KAAK,IAAI,GAAG,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,OAAO,CAAC;CAC9C,KAAK,IAAI,GAAG,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,OAAO,CAAC;;CAE9C,KAAK,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAEnD,KAAK,MAAM;;CAEX,IAAI,KAAK,GAAG;;CAEZ,KAAK,GAAG,GAAG,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,OAAO,CAAC;CAC7C,KAAK,GAAG,GAAG,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,OAAO,CAAC;CAC7C,KAAK,IAAI,GAAG,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,OAAO,CAAC;CAC9C,KAAK,IAAI,GAAG,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,OAAO,CAAC;CAC9C,KAAK,IAAI,GAAG,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,OAAO,CAAC;CAC9C,KAAK,IAAI,GAAG,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,OAAO,CAAC;;CAE9C,KAAK,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAE5D,KAAK,MAAM;;CAEX,IAAI;;CAEJ,GAAG;;CAEH,EAAE;;CAEF,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;CAElD,CAAC;;CAED;CACA;CACA;;CAEA,SAAS,UAAU,EAAE,OAAO,GAAG;;CAE/B,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,OAAO,KAAK,SAAS,KAAK,OAAO,GAAG,qBAAqB,CAAC;;CAE5E,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,SAAS,EAAE;;CAErC,CAAC,IAAI,EAAE,WAAW,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG;;CAErD,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC;;CAEnB,EAAE,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;CAC9C,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;CAC9B,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,IAAI,GAAG;;CAEtC,GAAG,IAAI,IAAI,CAAC;;CAEZ,GAAG,IAAI;;CAEP,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;;CAE9B,IAAI,CAAC,QAAQ,CAAC,GAAG;;CAEjB,IAAI,OAAO,CAAC,IAAI,EAAE,uFAAuF,EAAE,CAAC;CAC5G,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC;;CAE/D,IAAI;;CAEJ,GAAG,IAAI,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;;CAElC,GAAG,KAAK,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC;;CAEhC,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;;CAE3B,EAAE;;CAEF,CAAC,KAAK,EAAE,WAAW,IAAI,GAAG;;CAE1B,EAAE,OAAO,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE1B,EAAE;;CAEF,CAAC,OAAO,EAAE,WAAW,KAAK,GAAG;;CAE7B,EAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;CACpB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,IAAI,OAAO,CAAC;;CAEZ,IAAI,YAAY,GAAG;;CAEnB,CAAC,UAAU,EAAE,YAAY;;CAEzB,EAAE,KAAK,OAAO,KAAK,SAAS,GAAG;;CAE/B,GAAG,OAAO,GAAG,MAAM,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,kBAAkB,IAAI,CAAC;;CAExE,GAAG;;CAEH,EAAE,OAAO,OAAO,CAAC;;CAEjB,EAAE;;CAEF,CAAC,UAAU,EAAE,WAAW,KAAK,GAAG;;CAEhC,EAAE,OAAO,GAAG,KAAK,CAAC;;CAElB,EAAE;;CAEF,CAAC,CAAC;;CAEF;CACA;CACA;;CAEA,SAAS,WAAW,EAAE,OAAO,GAAG;;CAEhC,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,OAAO,KAAK,SAAS,KAAK,OAAO,GAAG,qBAAqB,CAAC;;CAE5E,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,SAAS,EAAE;;CAEtC,CAAC,IAAI,EAAE,WAAW,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG;;CAErD,EAAE,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;CAC9C,EAAE,MAAM,CAAC,eAAe,EAAE,aAAa,EAAE,CAAC;CAC1C,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,MAAM,GAAG;;CAExC,GAAG,IAAI,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,CAAC;;CAE3C,GAAG,OAAO,CAAC,eAAe,EAAE,MAAM,EAAE,WAAW,WAAW,GAAG;;CAE7D,IAAI,MAAM,EAAE,WAAW,EAAE,CAAC;;CAE1B,IAAI,EAAE,CAAC;;CAEP,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;;CAE3B,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,YAAY,GAAG;;CAExB,CAAC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;;CAE5B,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;;CAEjB,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;;CAErB,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAiB,EAAE,CAAC;CACxC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;CACjC,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,GAAG,KAAK,CAAC;;CAEvC,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAiB,EAAE,CAAC;CACxC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;CACjC,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,GAAG,KAAK,CAAC;;CAEvC,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,SAAS,EAAE;;CAEvC,CAAC,MAAM,EAAE,EAAE,YAAY;;CAEvB,EAAE,IAAI,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC;;CAE5D,EAAE,IAAI,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;CAC/B,EAAE,IAAI,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE9B,EAAE,OAAO,SAAS,MAAM,EAAE,MAAM,GAAG;;CAEnC,GAAG,IAAI,WAAW,GAAG,QAAQ,KAAK,IAAI,IAAI,KAAK,KAAK,MAAM,CAAC,KAAK,IAAI,GAAG,KAAK,MAAM,CAAC,GAAG;CACtF,YAAY,MAAM,KAAK,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,KAAK,MAAM,CAAC,IAAI;CAC1E,YAAY,GAAG,KAAK,MAAM,CAAC,GAAG,IAAI,IAAI,KAAK,MAAM,CAAC,IAAI,IAAI,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC;;CAEjF,GAAG,KAAK,WAAW,GAAG;;CAEtB,IAAI,QAAQ,GAAG,IAAI,CAAC;CACpB,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;CACzB,IAAI,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;CACrB,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;CACzC,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;CACvB,IAAI,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;CACrB,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;;CAEvB;CACA;;CAEA,IAAI,IAAI,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;CAC3D,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;CAC7B,IAAI,IAAI,kBAAkB,GAAG,MAAM,GAAG,IAAI,GAAG,KAAK,CAAC;CACnD,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,GAAG,GAAG,GAAG,GAAG,EAAE,KAAK,IAAI,CAAC;CACvE,IAAI,IAAI,IAAI,EAAE,IAAI,CAAC;;CAEnB;;CAEA,IAAI,OAAO,CAAC,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC;CACtC,IAAI,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC;;CAErC;;CAEA,IAAI,IAAI,GAAG,EAAE,IAAI,GAAG,MAAM,GAAG,kBAAkB,CAAC;CAChD,IAAI,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,kBAAkB,CAAC;;CAE9C,IAAI,gBAAgB,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,EAAE,CAAC;CAChE,IAAI,gBAAgB,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,GAAG,IAAI,OAAO,IAAI,GAAG,IAAI,EAAE,CAAC;;CAEvE,IAAI,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,EAAE,CAAC;;CAE3D;;CAEA,IAAI,IAAI,GAAG,EAAE,IAAI,GAAG,MAAM,GAAG,kBAAkB,CAAC;CAChD,IAAI,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,kBAAkB,CAAC;;CAE9C,IAAI,gBAAgB,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,EAAE,CAAC;CAChE,IAAI,gBAAgB,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,GAAG,IAAI,OAAO,IAAI,GAAG,IAAI,EAAE,CAAC;;CAEvE,IAAI,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,EAAE,CAAC;;CAE3D,IAAI;;CAEJ,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;CAC3E,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC;;CAE5E,GAAG,CAAC;;CAEJ,EAAE,IAAI;;CAEN,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,GAAG;;CAEjD,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;;CAE1B,CAAC,IAAI,GAAG,GAAG,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;;CAE1B,CAAC,IAAI,QAAQ,GAAG,IAAI,iBAAiB,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;CAChE,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC9B,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;CAC3C,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;;CAEtB,CAAC,IAAI,QAAQ,GAAG,IAAI,iBAAiB,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;CAChE,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC9B,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;CAC7C,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;;CAEtB,CAAC,IAAI,QAAQ,GAAG,IAAI,iBAAiB,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;CAChE,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC5B,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;CAC3C,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;;CAEtB,CAAC,IAAI,QAAQ,GAAG,IAAI,iBAAiB,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;CAChE,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;CAC9B,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;CAC7C,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;;CAEtB,CAAC,IAAI,QAAQ,GAAG,IAAI,iBAAiB,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;CAChE,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC9B,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;CAC3C,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;;CAEtB,CAAC,IAAI,QAAQ,GAAG,IAAI,iBAAiB,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;CAChE,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC9B,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;CAC7C,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;;CAEtB,CAAC,IAAI,OAAO,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;;CAEvF,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,qBAAqB,EAAE,cAAc,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC;CAC1F,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,GAAG,YAAY,CAAC;;CAE/C,CAAC,IAAI,CAAC,MAAM,GAAG,WAAW,QAAQ,EAAE,KAAK,GAAG;;CAE5C,EAAE,KAAK,IAAI,CAAC,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;;CAEvD,EAAE,IAAI,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;CACvC,EAAE,IAAI,eAAe,GAAG,YAAY,CAAC,OAAO,CAAC,eAAe,CAAC;;CAE7D,EAAE,YAAY,CAAC,OAAO,CAAC,eAAe,GAAG,KAAK,CAAC;;CAE/C,EAAE,YAAY,CAAC,cAAc,GAAG,CAAC,CAAC;CAClC,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;;CAEnD,EAAE,YAAY,CAAC,cAAc,GAAG,CAAC,CAAC;CAClC,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;;CAEnD,EAAE,YAAY,CAAC,cAAc,GAAG,CAAC,CAAC;CAClC,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;;CAEnD,EAAE,YAAY,CAAC,cAAc,GAAG,CAAC,CAAC;CAClC,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;;CAEnD,EAAE,YAAY,CAAC,cAAc,GAAG,CAAC,CAAC;CAClC,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;;CAEnD,EAAE,YAAY,CAAC,OAAO,CAAC,eAAe,GAAG,eAAe,CAAC;;CAEzD,EAAE,YAAY,CAAC,cAAc,GAAG,CAAC,CAAC;CAClC,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;;CAEnD,EAAE,QAAQ,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;;CAEnC,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC,KAAK,GAAG,WAAW,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,GAAG;;CAE3D,EAAE,IAAI,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;;CAEvC,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEjC,GAAG,YAAY,CAAC,cAAc,GAAG,CAAC,CAAC;CACnC,GAAG,QAAQ,CAAC,eAAe,EAAE,YAAY,EAAE,CAAC;;CAE5C,GAAG,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;;CAE3C,GAAG;;CAEH,EAAE,QAAQ,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;;CAEnC,EAAE,CAAC;;CAEH,CAAC;;CAED,UAAU,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CAC3D,UAAU,CAAC,SAAS,CAAC,WAAW,GAAG,UAAU,CAAC;;CAE9C;CACA;CACA;;CAEA,SAAS,aAAa,GAAG;;CAEzB,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;;CAE7B,CAAC,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,CAAC;;CAE1C,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;CACvC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;;CAE/C,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;;CAEpB,CAAC;;CAED,aAAa,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,EAAE;;CAE9E,CAAC,WAAW,EAAE,aAAa;;CAE3B,CAAC,QAAQ,EAAE,YAAY;;CAEvB,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC;;CAEnB,EAAE;;CAEF,CAAC,YAAY,EAAE,aAAa;;CAE5B,EAAE,KAAK,IAAI,CAAC,MAAM,KAAK,IAAI,GAAG;;CAE9B,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;CACvC,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;CACtD,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;CACjD,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;;CAEtB,GAAG;;CAEH,EAAE;;CAEF,CAAC,SAAS,EAAE,YAAY;;CAExB,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC;;CAErB,EAAE;;CAEF,CAAC,SAAS,EAAE,WAAW,KAAK,GAAG;;CAE/B,EAAE,KAAK,IAAI,CAAC,MAAM,KAAK,IAAI,GAAG;;CAE9B,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;CACvC,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;;CAEtD,GAAG,MAAM;;CAET,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;;CAEpD,GAAG;;CAEH,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;CACtB,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;CACnC,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;;CAElD,EAAE;;CAEF,CAAC,eAAe,EAAE,YAAY;;CAE9B,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;;CAE9B,EAAE;;CAEF,CAAC,eAAe,EAAE,WAAW,KAAK,GAAG;;CAErC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;;CAE1E,EAAE;;CAEF,CAAC,iBAAiB,EAAE,EAAE,YAAY;;CAElC,EAAE,IAAI,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;CAC/B,EAAE,IAAI,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;CACpC,EAAE,IAAI,KAAK,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE5B,EAAE,IAAI,WAAW,GAAG,IAAI,OAAO,EAAE,CAAC;;CAElC,EAAE,OAAO,SAAS,iBAAiB,EAAE,KAAK,GAAG;;CAE7C,GAAG,QAAQ,CAAC,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;CAE5D,GAAG,IAAI,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;CACxC,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;;CAEpB,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;;CAE7D,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,UAAU,EAAE,CAAC;;CAE9D,GAAG,KAAK,QAAQ,CAAC,SAAS,GAAG;;CAE7B,IAAI,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;CAC9E,IAAI,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;CAC9E,IAAI,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;CAC9E,IAAI,QAAQ,CAAC,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;CAChF,IAAI,QAAQ,CAAC,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;CAChF,IAAI,QAAQ,CAAC,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;CAChF,IAAI,QAAQ,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;CAClE,IAAI,QAAQ,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;CAClE,IAAI,QAAQ,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;;CAElE,IAAI,MAAM;;CAEV,IAAI,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;CAC/D,IAAI,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;;CAE7F,IAAI;;CAEJ,GAAG,CAAC;;CAEJ,EAAE,IAAI;;CAEN,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;;CAEA,SAAS,KAAK,EAAE,QAAQ,GAAG;;CAE3B,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;;CAErB,CAAC,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;;CAEjC,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;CACvC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC;;CAE1C,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;;CAEvB,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;CACpB,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;CACnB,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;CACpB,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;CACjB,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;CACvB,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;CACxB,CAAC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;CAChC,CAAC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;;CAE3B,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;;CAEnB,CAAC;;CAED,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,EAAE;;CAEtE,CAAC,WAAW,EAAE,KAAK;;CAEnB,CAAC,SAAS,EAAE,YAAY;;CAExB,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC;;CAEnB,EAAE;;CAEF,CAAC,aAAa,EAAE,WAAW,SAAS,GAAG;;CAEvC,EAAE,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;CAClC,EAAE,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC;CAChC,EAAE,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;CAC1B,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;;CAEjB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,SAAS,EAAE,WAAW,WAAW,GAAG;;CAErC,EAAE,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC;CAC5B,EAAE,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC;;CAE7B,EAAE,KAAK,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;;CAEnC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,IAAI,EAAE,YAAY;;CAEnB,EAAE,KAAK,IAAI,CAAC,SAAS,KAAK,IAAI,GAAG;;CAEjC,GAAG,OAAO,CAAC,IAAI,EAAE,wCAAwC,EAAE,CAAC;CAC5D,GAAG,OAAO;;CAEV,GAAG;;CAEH,EAAE,KAAK,IAAI,CAAC,kBAAkB,KAAK,KAAK,GAAG;;CAE3C,GAAG,OAAO,CAAC,IAAI,EAAE,kDAAkD,EAAE,CAAC;CACtE,GAAG,OAAO;;CAEV,GAAG;;CAEH,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;;CAEjD,EAAE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;CAC9B,EAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;CAC1B,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;CAC7C,EAAE,MAAM,CAAC,YAAY,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;CAC1E,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;CAC5C,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAE9C,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;;CAExB,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;;CAEvB,EAAE,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;;CAExB,EAAE;;CAEF,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,KAAK,IAAI,CAAC,kBAAkB,KAAK,KAAK,GAAG;;CAE3C,GAAG,OAAO,CAAC,IAAI,EAAE,kDAAkD,EAAE,CAAC;CACtE,GAAG,OAAO;;CAEV,GAAG;;CAEH,EAAE,KAAK,IAAI,CAAC,SAAS,KAAK,IAAI,GAAG;;CAEjC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;CACtB,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,YAAY,CAAC;CACpF,GAAG,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;;CAE1B,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,IAAI,EAAE,YAAY;;CAEnB,EAAE,KAAK,IAAI,CAAC,kBAAkB,KAAK,KAAK,GAAG;;CAE3C,GAAG,OAAO,CAAC,IAAI,EAAE,kDAAkD,EAAE,CAAC;CACtE,GAAG,OAAO;;CAEV,GAAG;;CAEH,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;CACrB,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;CAClB,EAAE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;;CAEzB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,OAAO,EAAE,YAAY;;CAEtB,EAAE,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG;;CAEjC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE5C,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAE3D,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEvD,IAAI;;CAEJ,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;;CAEvE,GAAG,MAAM;;CAET,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;;CAE3C,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,UAAU,EAAE,YAAY;;CAEzB,EAAE,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG;;CAEjC,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE/C,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAE3D,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE1D,IAAI;;CAEJ,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;;CAE1E,GAAG,MAAM;;CAET,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;;CAE9C,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,UAAU,EAAE,YAAY;;CAEzB,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC;;CAEtB,EAAE;;CAEF,CAAC,UAAU,EAAE,WAAW,KAAK,GAAG;;CAEhC,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,EAAE,CAAC;;CAE5B,EAAE,KAAK,IAAI,CAAC,SAAS,KAAK,IAAI,GAAG;;CAEjC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;CACrB,GAAG,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;CACxB,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;;CAElB,GAAG,MAAM;;CAET,GAAG,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;;CAExB,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,SAAS,EAAE,YAAY;;CAExB,EAAE,OAAO,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC;;CAEhC,EAAE;;CAEF,CAAC,SAAS,EAAE,WAAW,MAAM,GAAG;;CAEhC,EAAE,OAAO,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;;CAErD,EAAE;;CAEF,CAAC,eAAe,EAAE,WAAW,KAAK,GAAG;;CAErC,EAAE,KAAK,IAAI,CAAC,kBAAkB,KAAK,KAAK,GAAG;;CAE3C,GAAG,OAAO,CAAC,IAAI,EAAE,kDAAkD,EAAE,CAAC;CACtE,GAAG,OAAO;;CAEV,GAAG;;CAEH,EAAE,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;;CAE5B,EAAE,KAAK,IAAI,CAAC,SAAS,KAAK,IAAI,GAAG;;CAEjC,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;;CAE1F,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,eAAe,EAAE,YAAY;;CAE9B,EAAE,OAAO,IAAI,CAAC,YAAY,CAAC;;CAE3B,EAAE;;CAEF,CAAC,OAAO,EAAE,YAAY;;CAEtB,EAAE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;;CAEzB,EAAE;;CAEF,CAAC,OAAO,EAAE,YAAY;;CAEtB,EAAE,KAAK,IAAI,CAAC,kBAAkB,KAAK,KAAK,GAAG;;CAE3C,GAAG,OAAO,CAAC,IAAI,EAAE,kDAAkD,EAAE,CAAC;CACtE,GAAG,OAAO,KAAK,CAAC;;CAEhB,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC;;CAEnB,EAAE;;CAEF,CAAC,OAAO,EAAE,WAAW,KAAK,GAAG;;CAE7B,EAAE,KAAK,IAAI,CAAC,kBAAkB,KAAK,KAAK,GAAG;;CAE3C,GAAG,OAAO,CAAC,IAAI,EAAE,kDAAkD,EAAE,CAAC;CACtE,GAAG,OAAO;;CAEV,GAAG;;CAEH,EAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;;CAEpB,EAAE,KAAK,IAAI,CAAC,SAAS,KAAK,IAAI,GAAG;;CAEjC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;;CAEhC,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,SAAS,EAAE,YAAY;;CAExB,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;;CAE9B,EAAE;;CAEF,CAAC,SAAS,EAAE,WAAW,KAAK,GAAG;;CAE/B,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;;CAE1E,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,eAAe,EAAE,QAAQ,GAAG;;CAErC,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;;CAE9B,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;CAC3C,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;;CAElC,CAAC;;CAED,eAAe,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE;;CAE7E,CAAC,WAAW,EAAE,eAAe;;CAE7B,CAAC,SAAS,EAAE,YAAY;;CAExB,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC;;CAErB,EAAE;;CAEF,CAAC,cAAc,EAAE,YAAY;;CAE7B,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;;CAEjC,EAAE;;CAEF,CAAC,cAAc,EAAE,WAAW,KAAK,GAAG;;CAEpC,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;;CAElC,EAAE;;CAEF,CAAC,gBAAgB,EAAE,YAAY;;CAE/B,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;;CAEnC,EAAE;;CAEF,CAAC,gBAAgB,EAAE,WAAW,KAAK,GAAG;;CAEtC,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,KAAK,CAAC;;CAEpC,EAAE;;CAEF,CAAC,gBAAgB,EAAE,YAAY;;CAE/B,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;;CAEnC,EAAE;;CAEF,CAAC,gBAAgB,EAAE,WAAW,KAAK,GAAG;;CAEtC,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,KAAK,CAAC;;CAEpC,EAAE;;CAEF,CAAC,cAAc,EAAE,YAAY;;CAE7B,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;;CAEjC,EAAE;;CAEF,CAAC,cAAc,EAAE,WAAW,KAAK,GAAG;;CAEpC,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;;CAElC,EAAE;;CAEF,CAAC,iBAAiB,EAAE,EAAE,YAAY;;CAElC,EAAE,IAAI,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE/B,EAAE,OAAO,SAAS,iBAAiB,EAAE,KAAK,GAAG;;CAE7C,GAAG,QAAQ,CAAC,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;CAE5D,GAAG,QAAQ,CAAC,qBAAqB,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;;CAEtD,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;;CAEjE,GAAG,CAAC;;CAEJ,EAAE,IAAI;;;CAGN,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,aAAa,EAAE,KAAK,EAAE,OAAO,GAAG;;CAEzC,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;CAChD,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,GAAG,OAAO,KAAK,SAAS,GAAG,OAAO,GAAG,IAAI,CAAC;;CAEhE,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC;;CAE/D,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;;CAE5C,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,SAAS,EAAE;;CAExC,CAAC,gBAAgB,EAAE,YAAY;;CAE/B,EAAE,IAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;;CAElD,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC;;CAEnB,EAAE;;CAEF,CAAC,mBAAmB,EAAE,YAAY;;CAElC,EAAE,IAAI,KAAK,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;;CAEhD,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAE3C,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;;CAEtB,GAAG;;CAEH,EAAE,OAAO,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;;CAE7B,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,GAAG;;CAEvD,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;CACxB,CAAC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;;CAE5B,CAAC,IAAI,UAAU,GAAG,YAAY;CAC9B,EAAE,WAAW,CAAC;;CAEd,CAAC,SAAS,QAAQ;;CAElB,EAAE,KAAK,YAAY;CACnB,GAAG,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC;CAC7B,GAAG,MAAM;;CAET,EAAE,KAAK,QAAQ,CAAC;CAChB,EAAE,KAAK,MAAM;CACb,GAAG,UAAU,GAAG,KAAK,CAAC;CACtB,GAAG,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC;CAC9B,GAAG,MAAM;;CAET,EAAE;CACF,GAAG,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC;;CAE5B,EAAE;;CAEF,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,UAAU,EAAE,SAAS,GAAG,CAAC,EAAE,CAAC;CAC/C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,CAAC,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAC;;CAErC,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;;CAE3B,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;CACnB,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;;CAEzB,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,SAAS,EAAE;;CAExC;CACA,CAAC,UAAU,EAAE,WAAW,SAAS,EAAE,MAAM,GAAG;;CAE5C;CACA;;CAEA,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM;CAC1B,GAAG,MAAM,GAAG,IAAI,CAAC,SAAS;CAC1B,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM;;CAEvC,GAAG,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC;;CAEzC,EAAE,KAAK,aAAa,KAAK,CAAC,GAAG;;CAE7B;;CAEA,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,MAAM,EAAE,GAAG,CAAC,GAAG;;CAEzC,IAAI,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC;;CAEvC,IAAI;;CAEJ,GAAG,aAAa,GAAG,MAAM,CAAC;;CAE1B,GAAG,MAAM;;CAET;;CAEA,GAAG,aAAa,IAAI,MAAM,CAAC;CAC3B,GAAG,IAAI,GAAG,GAAG,MAAM,GAAG,aAAa,CAAC;CACpC,GAAG,IAAI,CAAC,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;;CAE3D,GAAG;;CAEH,EAAE,IAAI,CAAC,gBAAgB,GAAG,aAAa,CAAC;;CAExC,EAAE;;CAEF;CACA,CAAC,KAAK,EAAE,WAAW,SAAS,GAAG;;CAE/B,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,SAAS;CAC7B,GAAG,MAAM,GAAG,IAAI,CAAC,MAAM;CACvB,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM;;CAEvC,GAAG,MAAM,GAAG,IAAI,CAAC,gBAAgB;;CAEjC,GAAG,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;;CAE1B,EAAE,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;;CAE5B,EAAE,KAAK,MAAM,GAAG,CAAC,GAAG;;CAEpB;;CAEA,GAAG,IAAI,mBAAmB,GAAG,MAAM,GAAG,CAAC,CAAC;;CAExC,GAAG,IAAI,CAAC,gBAAgB;CACxB,IAAI,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC;;CAE9D,GAAG;;CAEH,EAAE,MAAM,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAE7D,GAAG,KAAK,MAAM,EAAE,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,GAAG;;CAE/C;;CAEA,IAAI,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;CACvC,IAAI,MAAM;;CAEV,IAAI;;CAEJ,GAAG;;CAEH,EAAE;;CAEF;CACA,CAAC,iBAAiB,EAAE,YAAY;;CAEhC,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;;CAE7B,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM;CAC1B,GAAG,MAAM,GAAG,IAAI,CAAC,SAAS;;CAE1B,GAAG,mBAAmB,GAAG,MAAM,GAAG,CAAC,CAAC;;CAEpC,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;;CAElD;CACA,EAAE,MAAM,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,mBAAmB,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAEjE,GAAG,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,EAAE,mBAAmB,KAAK,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC;;CAEhE,GAAG;;CAEH,EAAE,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;;CAE5B,EAAE;;CAEF;CACA,CAAC,oBAAoB,EAAE,YAAY;;CAEnC,EAAE,IAAI,mBAAmB,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;CAC/C,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC;;CAE5D,EAAE;;;CAGF;;CAEA,CAAC,OAAO,EAAE,WAAW,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,GAAG;;CAE/D,EAAE,KAAK,CAAC,IAAI,GAAG,GAAG;;CAElB,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,MAAM,EAAE,GAAG,CAAC,GAAG;;CAEzC,IAAI,MAAM,EAAE,SAAS,GAAG,CAAC,EAAE,GAAG,MAAM,EAAE,SAAS,GAAG,CAAC,EAAE,CAAC;;CAEtD,IAAI;;CAEJ,GAAG;;CAEH,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,GAAG;;CAEtD,EAAE,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;;CAErF,EAAE;;CAEF,CAAC,KAAK,EAAE,WAAW,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,GAAG;;CAE7D,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;CAEhB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,MAAM,EAAE,GAAG,CAAC,GAAG;;CAExC,GAAG,IAAI,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC;;CAEzB,GAAG,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,MAAM,EAAE,SAAS,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;;CAE/D,GAAG;;CAEH,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA;CACA,IAAI,iBAAiB,GAAG,eAAe,CAAC;;CAExC,SAAS,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,kBAAkB,GAAG;;CAE5D,CAAC,IAAI,UAAU,GAAG,kBAAkB,IAAI,eAAe,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;;CAE/E,CAAC,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;CACjC,CAAC,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;;CAE7D,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE;;CAEpC,CAAC,QAAQ,EAAE,WAAW,KAAK,EAAE,MAAM,GAAG;;CAEtC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;;CAEd,EAAE,IAAI,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,eAAe;CACzD,GAAG,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,EAAE,CAAC;;CAE/C;CACA,EAAE,KAAK,OAAO,KAAK,SAAS,GAAG,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;;CAEjE,EAAE;;CAEF,CAAC,QAAQ,EAAE,WAAW,KAAK,EAAE,MAAM,GAAG;;CAEtC,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;;CAEhC,EAAE,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,eAAe;CACjD,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAE3C,GAAG,QAAQ,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;;CAE3C,GAAG;;CAEH,EAAE;;CAEF,CAAC,IAAI,EAAE,YAAY;;CAEnB,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;;CAEhC,EAAE,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,eAAe;CACjD,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAE3C,GAAG,QAAQ,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;;CAExB,GAAG;;CAEH,EAAE;;CAEF,CAAC,MAAM,EAAE,YAAY;;CAErB,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;;CAEhC,EAAE,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,eAAe;CACjD,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAE3C,GAAG,QAAQ,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;;CAE1B,GAAG;;CAEH,EAAE;;CAEF,CAAC,EAAE,CAAC;;;CAGJ,SAAS,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,GAAG;;CAEvD,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;CAClB,CAAC,IAAI,CAAC,UAAU,GAAG,UAAU,IAAI,eAAe,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;;CAExE,CAAC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,QAAQ,CAAC;;CAExF,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;;CAE1B,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE;;CAEhC,CAAC,SAAS,EAAE,SAAS;;CAErB,CAAC,MAAM,EAAE,WAAW,IAAI,EAAE,IAAI,EAAE,UAAU,GAAG;;CAE7C,EAAE,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,sBAAsB,EAAE,GAAG;;CAEnD,GAAG,OAAO,IAAI,eAAe,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;;CAExD,GAAG,MAAM;;CAET,GAAG,OAAO,IAAI,eAAe,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;;CAElE,GAAG;;CAEH,EAAE;;CAEF;CACA;CACA;CACA;CACA;CACA;CACA;CACA,CAAC,gBAAgB,IAAI,YAAY;;CAEjC,EAAE,IAAI,UAAU,GAAG,IAAI,MAAM,EAAE,GAAG,GAAG,iBAAiB,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;;CAEpE,EAAE,OAAO,SAAS,gBAAgB,EAAE,IAAI,GAAG;;CAE3C,GAAG,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;;CAE/D,GAAG,CAAC;;CAEJ,EAAE,EAAE,EAAE;;CAEN,CAAC,cAAc,EAAE,YAAY;;CAE7B;CACA;CACA;CACA,EAAE,IAAI,QAAQ,GAAG,IAAI,GAAG,iBAAiB,GAAG,GAAG,CAAC;CAChD,EAAE,IAAI,aAAa,GAAG,IAAI,GAAG,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC;;CAE1E;CACA;CACA,EAAE,IAAI,WAAW,GAAG,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;;CAEvE;CACA,EAAE,IAAI,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;;CAElE;CACA;CACA,EAAE,IAAI,QAAQ,GAAG,2BAA2B,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;;CAE9E;CACA;CACA,EAAE,IAAI,UAAU,GAAG,sBAAsB,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;;CAE3E,EAAE,IAAI,OAAO,GAAG,IAAI,MAAM,EAAE,EAAE;CAC9B,KAAK,GAAG;CACR,KAAK,WAAW;CAChB,KAAK,MAAM;CACX,KAAK,QAAQ;CACb,KAAK,UAAU;CACf,KAAK,GAAG;CACR,GAAG,CAAC;;CAEJ,EAAE,IAAI,oBAAoB,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;;CAElE,EAAE,OAAO,SAAS,cAAc,EAAE,SAAS,GAAG;;CAE9C,GAAG,IAAI,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;;CAE3C,GAAG,KAAK,EAAE,OAAO,GAAG;;CAEpB,IAAI,MAAM,IAAI,KAAK,EAAE,2CAA2C,GAAG,SAAS,EAAE,CAAC;;CAE/E,IAAI;;CAEJ,GAAG,IAAI,OAAO,GAAG;CACjB;CACA,IAAI,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;CAC1B,IAAI,UAAU,EAAE,OAAO,EAAE,CAAC,EAAE;CAC5B,IAAI,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE;CAC7B,IAAI,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE;CAC9B,IAAI,aAAa,EAAE,OAAO,EAAE,CAAC,EAAE;CAC/B,IAAI,CAAC;;CAEL,GAAG,IAAI,OAAO,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC;;CAEzE,GAAG,KAAK,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,EAAE,CAAC,GAAG;;CAEnD,IAAI,IAAI,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,CAAC,EAAE,CAAC;;CAE/D;CACA;CACA;CACA;CACA,IAAI,KAAK,oBAAoB,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,GAAG;;CAE9D,KAAK,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;CACjE,KAAK,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;;CAErC,KAAK;;CAEL,IAAI;;CAEJ,GAAG,KAAK,OAAO,CAAC,YAAY,KAAK,IAAI,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,GAAG;;CAE7E,IAAI,MAAM,IAAI,KAAK,EAAE,8DAA8D,GAAG,SAAS,EAAE,CAAC;;CAElG,IAAI;;CAEJ,GAAG,OAAO,OAAO,CAAC;;CAElB,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,QAAQ,EAAE,WAAW,IAAI,EAAE,QAAQ,GAAG;;CAEvC,EAAE,KAAK,EAAE,QAAQ,IAAI,QAAQ,KAAK,EAAE,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ,KAAK,EAAE,CAAC,IAAI,QAAQ,KAAK,IAAI,CAAC,IAAI,IAAI,QAAQ,KAAK,IAAI,CAAC,IAAI,GAAG;;CAE1J,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG;;CAEH;CACA,EAAE,KAAK,IAAI,CAAC,QAAQ,GAAG;;CAEvB,GAAG,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,QAAQ,EAAE,CAAC;;CAEtD,GAAG,KAAK,IAAI,KAAK,SAAS,GAAG;;CAE7B,IAAI,OAAO,IAAI,CAAC;;CAEhB,IAAI;;CAEJ,GAAG;;CAEH;CACA,EAAE,KAAK,IAAI,CAAC,QAAQ,GAAG;;CAEvB,GAAG,IAAI,iBAAiB,GAAG,WAAW,QAAQ,GAAG;;CAEjD,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAEjD,KAAK,IAAI,SAAS,GAAG,QAAQ,EAAE,CAAC,EAAE,CAAC;;CAEnC,KAAK,KAAK,SAAS,CAAC,IAAI,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,GAAG;;CAEvE,MAAM,OAAO,SAAS,CAAC;;CAEvB,MAAM;;CAEN,KAAK,IAAI,MAAM,GAAG,iBAAiB,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC;;CAE1D,KAAK,KAAK,MAAM,GAAG,OAAO,MAAM,CAAC;;CAEjC,KAAK;;CAEL,IAAI,OAAO,IAAI,CAAC;;CAEhB,IAAI,CAAC;;CAEL,GAAG,IAAI,WAAW,GAAG,iBAAiB,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;;CAExD,GAAG,KAAK,WAAW,GAAG;;CAEtB,IAAI,OAAO,WAAW,CAAC;;CAEvB,IAAI;;CAEJ,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,SAAS,EAAE;;CAE1C;CACA,CAAC,qBAAqB,EAAE,YAAY,EAAE;CACtC,CAAC,qBAAqB,EAAE,YAAY,EAAE;;CAEtC,CAAC,WAAW,EAAE;CACd,EAAE,MAAM,EAAE,CAAC;CACX,EAAE,WAAW,EAAE,CAAC;CAChB,EAAE,YAAY,EAAE,CAAC;CACjB,EAAE,cAAc,EAAE,CAAC;CACnB,EAAE;;CAEF,CAAC,UAAU,EAAE;CACb,EAAE,IAAI,EAAE,CAAC;CACT,EAAE,WAAW,EAAE,CAAC;CAChB,EAAE,sBAAsB,EAAE,CAAC;CAC3B,EAAE;;CAEF,CAAC,mBAAmB,EAAE;;CAEtB,EAAE,SAAS,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG;;CAE7C,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;;CAErD,GAAG;;CAEH,EAAE,SAAS,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG;;CAE5C,GAAG,IAAI,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC;;CAEtC,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAEvD,IAAI,MAAM,EAAE,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC;;CAEtC,IAAI;;CAEJ,GAAG;;CAEH,EAAE,SAAS,qBAAqB,EAAE,MAAM,EAAE,MAAM,GAAG;;CAEnD,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;;CAElE,GAAG;;CAEH,EAAE,SAAS,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG;;CAE9C,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;;CAEnD,GAAG;;CAEH,EAAE;;CAEF,CAAC,gCAAgC,EAAE;;CAEnC,EAAE;CACF;;CAEA,GAAG,SAAS,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG;;CAE9C,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC;;CAE9D,IAAI;;CAEJ,GAAG,SAAS,8BAA8B,EAAE,MAAM,EAAE,MAAM,GAAG;;CAE7D,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC;CAC9D,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEzC,IAAI;;CAEJ,GAAG,SAAS,yCAAyC,EAAE,MAAM,EAAE,MAAM,GAAG;;CAExE,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC;CAC9D,IAAI,IAAI,CAAC,YAAY,CAAC,sBAAsB,GAAG,IAAI,CAAC;;CAEpD,IAAI;;CAEJ,GAAG,EAAE;;CAEL;;CAEA,GAAG,SAAS,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG;;CAE7C,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC;;CAErC,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAEtD,KAAK,IAAI,EAAE,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC;;CAErC,KAAK;;CAEL,IAAI;;CAEJ,GAAG,SAAS,6BAA6B,EAAE,MAAM,EAAE,MAAM,GAAG;;CAE5D,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC;;CAErC,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAEtD,KAAK,IAAI,EAAE,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC;;CAErC,KAAK;;CAEL,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEzC,IAAI;;CAEJ,GAAG,SAAS,wCAAwC,EAAE,MAAM,EAAE,MAAM,GAAG;;CAEvE,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC;;CAErC,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAEtD,KAAK,IAAI,EAAE,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC;;CAErC,KAAK;;CAEL,IAAI,IAAI,CAAC,YAAY,CAAC,sBAAsB,GAAG,IAAI,CAAC;;CAEpD,IAAI;;CAEJ,GAAG,EAAE;;CAEL;;CAEA,GAAG,SAAS,qBAAqB,EAAE,MAAM,EAAE,MAAM,GAAG;;CAEpD,IAAI,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,aAAa,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC;;CAEnE,IAAI;;CAEJ,GAAG,SAAS,oCAAoC,EAAE,MAAM,EAAE,MAAM,GAAG;;CAEnE,IAAI,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,aAAa,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC;CACnE,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEzC,IAAI;;CAEJ,GAAG,SAAS,+CAA+C,EAAE,MAAM,EAAE,MAAM,GAAG;;CAE9E,IAAI,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,aAAa,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC;CACnE,IAAI,IAAI,CAAC,YAAY,CAAC,sBAAsB,GAAG,IAAI,CAAC;;CAEpD,IAAI;;CAEJ,GAAG,EAAE;;CAEL;;CAEA,GAAG,SAAS,kBAAkB,EAAE,MAAM,EAAE,MAAM,GAAG;;CAEjD,IAAI,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;;CAEtD,IAAI;;CAEJ,GAAG,SAAS,iCAAiC,EAAE,MAAM,EAAE,MAAM,GAAG;;CAEhE,IAAI,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;CACtD,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEzC,IAAI;;CAEJ,GAAG,SAAS,4CAA4C,EAAE,MAAM,EAAE,MAAM,GAAG;;CAE3E,IAAI,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;CACtD,IAAI,IAAI,CAAC,YAAY,CAAC,sBAAsB,GAAG,IAAI,CAAC;;CAEpD,IAAI;;CAEJ,GAAG;;CAEH,EAAE;;CAEF,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,WAAW,EAAE,MAAM,GAAG;;CAE5D,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;CACd,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;;CAEvC;CACA;CACA;CACA;CACA;;CAEA,EAAE;;CAEF,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,WAAW,EAAE,MAAM,GAAG;;CAE5D,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;CACd,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;;CAEvC,EAAE;;CAEF;CACA,CAAC,IAAI,EAAE,YAAY;;CAEnB,EAAE,IAAI,YAAY,GAAG,IAAI,CAAC,IAAI;CAC9B,GAAG,UAAU,GAAG,IAAI,CAAC,UAAU;;CAE/B,GAAG,UAAU,GAAG,UAAU,CAAC,UAAU;CACrC,GAAG,YAAY,GAAG,UAAU,CAAC,YAAY;CACzC,GAAG,aAAa,GAAG,UAAU,CAAC,aAAa,CAAC;;CAE5C,EAAE,KAAK,EAAE,YAAY,GAAG;;CAExB,GAAG,YAAY,GAAG,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC;;CAElG,GAAG,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;;CAE5B,GAAG;;CAEH;CACA,EAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,qBAAqB,CAAC;CAC7C,EAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,qBAAqB,CAAC;;CAE7C;CACA,EAAE,KAAK,EAAE,YAAY,GAAG;;CAExB,GAAG,OAAO,CAAC,KAAK,EAAE,0DAA0D,GAAG,IAAI,CAAC,IAAI,GAAG,wBAAwB,EAAE,CAAC;CACtH,GAAG,OAAO;;CAEV,GAAG;;CAEH,EAAE,KAAK,UAAU,GAAG;;CAEpB,GAAG,IAAI,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC;;CAE5C;CACA,GAAG,SAAS,UAAU;;CAEtB,IAAI,KAAK,WAAW;;CAEpB,KAAK,KAAK,EAAE,YAAY,CAAC,QAAQ,GAAG;;CAEpC,MAAM,OAAO,CAAC,KAAK,EAAE,mFAAmF,EAAE,IAAI,EAAE,CAAC;CACjH,MAAM,OAAO;;CAEb,MAAM;;CAEN,KAAK,KAAK,EAAE,YAAY,CAAC,QAAQ,CAAC,SAAS,GAAG;;CAE9C,MAAM,OAAO,CAAC,KAAK,EAAE,6GAA6G,EAAE,IAAI,EAAE,CAAC;CAC3I,MAAM,OAAO;;CAEb,MAAM;;CAEN,KAAK,YAAY,GAAG,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC;;CAEpD,KAAK,MAAM;;CAEX,IAAI,KAAK,OAAO;;CAEhB,KAAK,KAAK,EAAE,YAAY,CAAC,QAAQ,GAAG;;CAEpC,MAAM,OAAO,CAAC,KAAK,EAAE,gFAAgF,EAAE,IAAI,EAAE,CAAC;CAC9G,MAAM,OAAO;;CAEb,MAAM;;CAEN;CACA;;CAEA,KAAK,YAAY,GAAG,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC;;CAEhD;CACA,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAEtD,MAAM,KAAK,YAAY,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,WAAW,GAAG;;CAEpD,OAAO,WAAW,GAAG,CAAC,CAAC;CACvB,OAAO,MAAM;;CAEb,OAAO;;CAEP,MAAM;;CAEN,KAAK,MAAM;;CAEX,IAAI;;CAEJ,KAAK,KAAK,YAAY,EAAE,UAAU,EAAE,KAAK,SAAS,GAAG;;CAErD,MAAM,OAAO,CAAC,KAAK,EAAE,sEAAsE,EAAE,IAAI,EAAE,CAAC;CACpG,MAAM,OAAO;;CAEb,MAAM;;CAEN,KAAK,YAAY,GAAG,YAAY,EAAE,UAAU,EAAE,CAAC;;CAE/C,IAAI;;;CAGJ,GAAG,KAAK,WAAW,KAAK,SAAS,GAAG;;CAEpC,IAAI,KAAK,YAAY,EAAE,WAAW,EAAE,KAAK,SAAS,GAAG;;CAErD,KAAK,OAAO,CAAC,KAAK,EAAE,uFAAuF,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;CAClI,KAAK,OAAO;;CAEZ,KAAK;;CAEL,IAAI,YAAY,GAAG,YAAY,EAAE,WAAW,EAAE,CAAC;;CAE/C,IAAI;;CAEJ,GAAG;;CAEH;CACA,EAAE,IAAI,YAAY,GAAG,YAAY,EAAE,YAAY,EAAE,CAAC;;CAElD,EAAE,KAAK,YAAY,KAAK,SAAS,GAAG;;CAEpC,GAAG,IAAI,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;;CAEtC,GAAG,OAAO,CAAC,KAAK,EAAE,8DAA8D,GAAG,QAAQ;CAC3F,IAAI,GAAG,GAAG,YAAY,GAAG,wBAAwB,EAAE,YAAY,EAAE,CAAC;CAClE,GAAG,OAAO;;CAEV,GAAG;;CAEH;CACA,EAAE,IAAI,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;;CAExC,EAAE,KAAK,YAAY,CAAC,WAAW,KAAK,SAAS,GAAG;;CAEhD,GAAG,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;CAC5C,GAAG,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;;CAEpC,GAAG,MAAM,KAAK,YAAY,CAAC,sBAAsB,KAAK,SAAS,GAAG;;CAElE,GAAG,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC;CACvD,GAAG,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;;CAEpC,GAAG;;CAEH;CACA,EAAE,IAAI,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;;CAE5C,EAAE,KAAK,aAAa,KAAK,SAAS,GAAG;;CAErC;;CAEA,GAAG,KAAK,YAAY,KAAK,uBAAuB,GAAG;;CAEnD;;CAEA;CACA,IAAI,KAAK,EAAE,YAAY,CAAC,QAAQ,GAAG;;CAEnC,KAAK,OAAO,CAAC,KAAK,EAAE,qGAAqG,EAAE,IAAI,EAAE,CAAC;CAClI,KAAK,OAAO;;CAEZ,KAAK;;CAEL,IAAI,KAAK,YAAY,CAAC,QAAQ,CAAC,gBAAgB,GAAG;;CAElD,KAAK,KAAK,EAAE,YAAY,CAAC,QAAQ,CAAC,eAAe,GAAG;;CAEpD,MAAM,OAAO,CAAC,KAAK,EAAE,qHAAqH,EAAE,IAAI,EAAE,CAAC;CACnJ,MAAM,OAAO;;CAEb,MAAM;;CAEN,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAErF,MAAM,KAAK,YAAY,CAAC,QAAQ,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,aAAa,GAAG;;CAExF,OAAO,aAAa,GAAG,CAAC,CAAC;CACzB,OAAO,MAAM;;CAEb,OAAO;;CAEP,MAAM;;;CAGN,KAAK,MAAM;;CAEX,KAAK,KAAK,EAAE,YAAY,CAAC,QAAQ,CAAC,YAAY,GAAG;;CAEjD,MAAM,OAAO,CAAC,KAAK,EAAE,kHAAkH,EAAE,IAAI,EAAE,CAAC;CAChJ,MAAM,OAAO;;CAEb,MAAM;;CAEN,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAEzE,MAAM,KAAK,YAAY,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,aAAa,GAAG;;CAE5E,OAAO,aAAa,GAAG,CAAC,CAAC;CACzB,OAAO,MAAM;;CAEb,OAAO;;CAEP,MAAM;;CAEN,KAAK;;CAEL,IAAI;;CAEJ,GAAG,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC;;CAE/C,GAAG,IAAI,CAAC,gBAAgB,GAAG,YAAY,CAAC;CACxC,GAAG,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;;CAEtC,GAAG,MAAM,KAAK,YAAY,CAAC,SAAS,KAAK,SAAS,IAAI,YAAY,CAAC,OAAO,KAAK,SAAS,GAAG;;CAE3F;;CAEA,GAAG,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC;;CAEjD,GAAG,IAAI,CAAC,gBAAgB,GAAG,YAAY,CAAC;;CAExC,GAAG,MAAM,KAAK,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG;;CAE9C,GAAG,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC;;CAE9C,GAAG,IAAI,CAAC,gBAAgB,GAAG,YAAY,CAAC;;CAExC,GAAG,MAAM;;CAET,GAAG,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;;CAEpC,GAAG;;CAEH;CACA,EAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,mBAAmB,EAAE,WAAW,EAAE,CAAC;CAC1D,EAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,gCAAgC,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,CAAC;;CAErF,EAAE;;CAEF,CAAC,MAAM,EAAE,YAAY;;CAErB,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;;CAEnB;CACA;CACA,EAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC;CACzC,EAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC;;CAEzC,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,SAAS,EAAE;;CAE1C;CACA,CAAC,iBAAiB,EAAE,eAAe,CAAC,SAAS,CAAC,QAAQ;CACtD,CAAC,iBAAiB,EAAE,eAAe,CAAC,SAAS,CAAC,QAAQ;;CAEtD,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,oBAAoB,GAAG;;CAEhC,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;;CAElC;CACA,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;;CAEzD,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;CAC1B;;CAEA,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC;CAClB,CAAC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;;CAE/B,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAExD,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;;CAErC,EAAE;;CAEF,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;CAClB,CAAC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;CACxB,CAAC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;CACrB,CAAC,IAAI,CAAC,sBAAsB,GAAG,EAAE,CAAC;;CAElC,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC;;CAElB,CAAC,IAAI,CAAC,KAAK,GAAG;;CAEd,EAAE,OAAO,EAAE;CACX,GAAG,IAAI,KAAK,GAAG;;CAEf,IAAI,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;;CAEjC,IAAI;CACJ,GAAG,IAAI,KAAK,GAAG;;CAEf,IAAI,OAAO,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,eAAe,CAAC;;CAE9C,IAAI;CACJ,GAAG;CACH,EAAE,IAAI,iBAAiB,GAAG;;CAE1B,GAAG,OAAO,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC;;CAEjC,GAAG;;CAEH,EAAE,CAAC;;CAEH,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,SAAS,EAAE;;CAE/C,CAAC,sBAAsB,EAAE,IAAI;;CAE7B,CAAC,GAAG,EAAE,YAAY;;CAElB,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ;CAC7B,GAAG,QAAQ,GAAG,OAAO,CAAC,MAAM;CAC5B,GAAG,cAAc,GAAG,IAAI,CAAC,eAAe;CACxC,GAAG,aAAa,GAAG,IAAI,CAAC,cAAc;CACtC,GAAG,KAAK,GAAG,IAAI,CAAC,MAAM;CACtB,GAAG,WAAW,GAAG,IAAI,CAAC,YAAY;CAClC,GAAG,QAAQ,GAAG,IAAI,CAAC,SAAS;CAC5B,GAAG,SAAS,GAAG,QAAQ,CAAC,MAAM;CAC9B,GAAG,WAAW,GAAG,SAAS,CAAC;;CAE3B,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAEzD,GAAG,IAAI,MAAM,GAAG,SAAS,EAAE,CAAC,EAAE;CAC9B,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI;CACtB,IAAI,KAAK,GAAG,aAAa,EAAE,IAAI,EAAE,CAAC;;CAElC,GAAG,KAAK,KAAK,KAAK,SAAS,GAAG;;CAE9B;;CAEA,IAAI,KAAK,GAAG,QAAQ,GAAG,CAAC;CACxB,IAAI,aAAa,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;CAClC,IAAI,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE3B;;CAEA,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAEpD,KAAK,QAAQ,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,eAAe,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;;CAEvF,KAAK;;CAEL,IAAI,MAAM,KAAK,KAAK,GAAG,cAAc,GAAG;;CAExC,IAAI,WAAW,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC;;CAEnC;;CAEA,IAAI,IAAI,gBAAgB,GAAG,GAAG,cAAc;CAC5C,KAAK,gBAAgB,GAAG,OAAO,EAAE,gBAAgB,EAAE,CAAC;;CAEpD,IAAI,aAAa,EAAE,gBAAgB,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC;CACnD,IAAI,OAAO,EAAE,KAAK,EAAE,GAAG,gBAAgB,CAAC;;CAExC,IAAI,aAAa,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC;CAC7C,IAAI,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC;;CAEzC;;CAEA,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAEpD,KAAK,IAAI,eAAe,GAAG,QAAQ,EAAE,CAAC,EAAE;CACxC,MAAM,UAAU,GAAG,eAAe,EAAE,gBAAgB,EAAE;CACtD,MAAM,OAAO,GAAG,eAAe,EAAE,KAAK,EAAE,CAAC;;CAEzC,KAAK,eAAe,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC;;CAE3C,KAAK,KAAK,OAAO,KAAK,SAAS,GAAG;;CAElC;CACA;CACA;;CAEA,MAAM,OAAO,GAAG,IAAI,eAAe,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE5E,MAAM;;CAEN,KAAK,eAAe,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC;;CAEnD,KAAK;;CAEL,IAAI,MAAM,KAAK,OAAO,EAAE,KAAK,EAAE,KAAK,WAAW,GAAG;;CAElD,IAAI,OAAO,CAAC,KAAK,EAAE,mEAAmE;CACtF,MAAM,mFAAmF,EAAE,CAAC;;CAE5F,IAAI;;CAEJ,GAAG;;CAEH,EAAE,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;;CAExC,EAAE;;CAEF,CAAC,MAAM,EAAE,YAAY;;CAErB,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ;CAC7B,GAAG,cAAc,GAAG,IAAI,CAAC,eAAe;CACxC,GAAG,aAAa,GAAG,IAAI,CAAC,cAAc;CACtC,GAAG,QAAQ,GAAG,IAAI,CAAC,SAAS;CAC5B,GAAG,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC;;CAE/B,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAEzD,GAAG,IAAI,MAAM,GAAG,SAAS,EAAE,CAAC,EAAE;CAC9B,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI;CACtB,IAAI,KAAK,GAAG,aAAa,EAAE,IAAI,EAAE,CAAC;;CAElC,GAAG,KAAK,KAAK,KAAK,SAAS,IAAI,KAAK,IAAI,cAAc,GAAG;;CAEzD;;CAEA,IAAI,IAAI,eAAe,GAAG,cAAc,GAAG;CAC3C,KAAK,iBAAiB,GAAG,OAAO,EAAE,eAAe,EAAE,CAAC;;CAEpD,IAAI,aAAa,EAAE,iBAAiB,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC;CACpD,IAAI,OAAO,EAAE,KAAK,EAAE,GAAG,iBAAiB,CAAC;;CAEzC,IAAI,aAAa,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC;CAC5C,IAAI,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC;;CAExC;;CAEA,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAEpD,KAAK,IAAI,eAAe,GAAG,QAAQ,EAAE,CAAC,EAAE;CACxC,MAAM,WAAW,GAAG,eAAe,EAAE,eAAe,EAAE;CACtD,MAAM,OAAO,GAAG,eAAe,EAAE,KAAK,EAAE,CAAC;;CAEzC,KAAK,eAAe,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC;CAC5C,KAAK,eAAe,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;;CAElD,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH,EAAE,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;;CAExC,EAAE;;CAEF;CACA,CAAC,OAAO,EAAE,YAAY;;CAEtB,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ;CAC7B,GAAG,QAAQ,GAAG,OAAO,CAAC,MAAM;CAC5B,GAAG,cAAc,GAAG,IAAI,CAAC,eAAe;CACxC,GAAG,aAAa,GAAG,IAAI,CAAC,cAAc;CACtC,GAAG,QAAQ,GAAG,IAAI,CAAC,SAAS;CAC5B,GAAG,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC;;CAE/B,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAEzD,GAAG,IAAI,MAAM,GAAG,SAAS,EAAE,CAAC,EAAE;CAC9B,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI;CACtB,IAAI,KAAK,GAAG,aAAa,EAAE,IAAI,EAAE,CAAC;;CAElC,GAAG,KAAK,KAAK,KAAK,SAAS,GAAG;;CAE9B,IAAI,OAAO,aAAa,EAAE,IAAI,EAAE,CAAC;;CAEjC,IAAI,KAAK,KAAK,GAAG,cAAc,GAAG;;CAElC;;CAEA,KAAK,IAAI,gBAAgB,GAAG,GAAG,cAAc;CAC7C,MAAM,gBAAgB,GAAG,OAAO,EAAE,gBAAgB,EAAE;CACpD,MAAM,SAAS,GAAG,GAAG,QAAQ;CAC7B,MAAM,UAAU,GAAG,OAAO,EAAE,SAAS,EAAE,CAAC;;CAExC;CACA,KAAK,aAAa,EAAE,gBAAgB,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC;CACpD,KAAK,OAAO,EAAE,KAAK,EAAE,GAAG,gBAAgB,CAAC;;CAEzC;CACA,KAAK,aAAa,EAAE,UAAU,CAAC,IAAI,EAAE,GAAG,gBAAgB,CAAC;CACzD,KAAK,OAAO,EAAE,gBAAgB,EAAE,GAAG,UAAU,CAAC;CAC9C,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC;;CAEnB;;CAEA,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAErD,MAAM,IAAI,eAAe,GAAG,QAAQ,EAAE,CAAC,EAAE;CACzC,OAAO,UAAU,GAAG,eAAe,EAAE,gBAAgB,EAAE;CACvD,OAAO,IAAI,GAAG,eAAe,EAAE,SAAS,EAAE,CAAC;;CAE3C,MAAM,eAAe,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC;CAC5C,MAAM,eAAe,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC;CACjD,MAAM,eAAe,CAAC,GAAG,EAAE,CAAC;;CAE5B,MAAM;;CAEN,KAAK,MAAM;;CAEX;;CAEA,KAAK,IAAI,SAAS,GAAG,GAAG,QAAQ;CAChC,MAAM,UAAU,GAAG,OAAO,EAAE,SAAS,EAAE,CAAC;;CAExC,KAAK,aAAa,EAAE,UAAU,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC;CAC9C,KAAK,OAAO,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC;CACnC,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC;;CAEnB;;CAEA,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAErD,MAAM,IAAI,eAAe,GAAG,QAAQ,EAAE,CAAC,EAAE,CAAC;;CAE1C,MAAM,eAAe,EAAE,KAAK,EAAE,GAAG,eAAe,EAAE,SAAS,EAAE,CAAC;CAC9D,MAAM,eAAe,CAAC,GAAG,EAAE,CAAC;;CAE5B,MAAM;;CAEN,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH,EAAE,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;;CAExC,EAAE;;CAEF;;CAEA,CAAC,UAAU,EAAE,WAAW,IAAI,EAAE,UAAU,GAAG;;CAE3C;CACA;;CAEA,EAAE,IAAI,aAAa,GAAG,IAAI,CAAC,sBAAsB;CACjD,GAAG,KAAK,GAAG,aAAa,EAAE,IAAI,EAAE;CAChC,GAAG,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;;CAE7B,EAAE,KAAK,KAAK,KAAK,SAAS,GAAG,OAAO,QAAQ,EAAE,KAAK,EAAE,CAAC;;CAEtD,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM;CACzB,GAAG,WAAW,GAAG,IAAI,CAAC,YAAY;CAClC,GAAG,OAAO,GAAG,IAAI,CAAC,QAAQ;CAC1B,GAAG,QAAQ,GAAG,OAAO,CAAC,MAAM;CAC5B,GAAG,cAAc,GAAG,IAAI,CAAC,eAAe;CACxC,GAAG,eAAe,GAAG,IAAI,KAAK,EAAE,QAAQ,EAAE,CAAC;;CAE3C,EAAE,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC;;CAE1B,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;;CAEhC,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;CACrB,EAAE,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC;CACjC,EAAE,QAAQ,CAAC,IAAI,EAAE,eAAe,EAAE,CAAC;;CAEnC,EAAE,MAAM,IAAI,CAAC,GAAG,cAAc,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAEpE,GAAG,IAAI,MAAM,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC;CAC7B,GAAG,eAAe,EAAE,CAAC,EAAE,GAAG,IAAI,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;;CAE1E,GAAG;;CAEH,EAAE,OAAO,eAAe,CAAC;;CAEzB,EAAE;;CAEF,CAAC,YAAY,EAAE,WAAW,IAAI,GAAG;;CAEjC;CACA;;CAEA,EAAE,IAAI,aAAa,GAAG,IAAI,CAAC,sBAAsB;CACjD,GAAG,KAAK,GAAG,aAAa,EAAE,IAAI,EAAE,CAAC;;CAEjC,EAAE,KAAK,KAAK,KAAK,SAAS,GAAG;;CAE7B,GAAG,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM;CAC1B,IAAI,WAAW,GAAG,IAAI,CAAC,YAAY;CACnC,IAAI,QAAQ,GAAG,IAAI,CAAC,SAAS;CAC7B,IAAI,iBAAiB,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC;CAC3C,IAAI,YAAY,GAAG,QAAQ,EAAE,iBAAiB,EAAE;CAChD,IAAI,gBAAgB,GAAG,IAAI,EAAE,iBAAiB,EAAE,CAAC;;CAEjD,GAAG,aAAa,EAAE,gBAAgB,EAAE,GAAG,KAAK,CAAC;;CAE7C,GAAG,QAAQ,EAAE,KAAK,EAAE,GAAG,YAAY,CAAC;CACpC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC;;CAElB,GAAG,WAAW,EAAE,KAAK,EAAE,GAAG,WAAW,EAAE,iBAAiB,EAAE,CAAC;CAC3D,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;;CAErB,GAAG,KAAK,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,iBAAiB,EAAE,CAAC;CAC/C,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;;CAEf,GAAG;;CAEH,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,GAAG;;CAEnD,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;CACrB,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;CACnB,CAAC,IAAI,CAAC,UAAU,GAAG,SAAS,IAAI,IAAI,CAAC;;CAErC,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM;CACzB,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM;CACzB,EAAE,YAAY,GAAG,IAAI,KAAK,EAAE,OAAO,EAAE,CAAC;;CAEtC,CAAC,IAAI,mBAAmB,GAAG;CAC3B,EAAE,WAAW,EAAE,mBAAmB;CAClC,EAAE,SAAS,EAAE,mBAAmB;CAChC,EAAE,CAAC;;CAEH,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,OAAO,EAAE,GAAG,CAAC,GAAG;;CAExC,EAAE,IAAI,WAAW,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;CAC1D,EAAE,YAAY,EAAE,CAAC,EAAE,GAAG,WAAW,CAAC;CAClC,EAAE,WAAW,CAAC,QAAQ,GAAG,mBAAmB,CAAC;;CAE7C,EAAE;;CAEF,CAAC,IAAI,CAAC,oBAAoB,GAAG,mBAAmB,CAAC;;CAEjD,CAAC,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;;CAEnC;CACA,CAAC,IAAI,CAAC,iBAAiB,GAAG,IAAI,KAAK,EAAE,OAAO,EAAE,CAAC;;CAE/C,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;CACzB,CAAC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;;CAE/B,CAAC,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;CACnC,CAAC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;;CAEhC,CAAC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;CACxB,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;;CAEvB;CACA;CACA,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;;CAExB;CACA;CACA,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;;CAEf,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;CACpB,CAAC,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;;CAE9B,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;CACjB,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;;CAE3B,CAAC,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;;CAE7B,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;CACrB,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;;CAErB,CAAC,IAAI,CAAC,iBAAiB,IAAI,KAAK,CAAC;;CAEjC,CAAC,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC;CAC/B,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC;;CAE7B,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,SAAS,EAAE;;CAE1C;;CAEA,CAAC,IAAI,EAAE,YAAY;;CAEnB,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;;CAEtC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,IAAI,EAAE,YAAY;;CAEnB,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;;CAExC,EAAE,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;;CAEtB,EAAE;;CAEF,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;CACtB,EAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;;CAEtB,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;CAChB,EAAE,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;CACxB,EAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;;CAEzB,EAAE,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,WAAW,EAAE,CAAC;;CAEzC,EAAE;;CAEF,CAAC,SAAS,EAAE,YAAY;;CAExB,EAAE,OAAO,IAAI,CAAC,OAAO,IAAI,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,KAAK,CAAC;CAC9D,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;;CAEpE,EAAE;;CAEF;CACA,CAAC,WAAW,EAAE,YAAY;;CAE1B,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;;CAE7C,EAAE;;CAEF,CAAC,OAAO,EAAE,WAAW,IAAI,GAAG;;CAE5B,EAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;;CAEzB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,OAAO,EAAE,WAAW,IAAI,EAAE,WAAW,GAAG;;CAEzC,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;CACnB,EAAE,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;;CAEjC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF;;CAEA;CACA;CACA;CACA,CAAC,kBAAkB,EAAE,WAAW,MAAM,GAAG;;CAEzC,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;;CAEvB;CACA,EAAE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,OAAO,GAAG,MAAM,GAAG,CAAC,CAAC;;CAEpD,EAAE,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;;CAE3B,EAAE;;CAEF;CACA,CAAC,kBAAkB,EAAE,YAAY;;CAEjC,EAAE,OAAO,IAAI,CAAC,gBAAgB,CAAC;;CAE/B,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,QAAQ,GAAG;;CAE/B,EAAE,OAAO,IAAI,CAAC,eAAe,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEhD,EAAE;;CAEF,CAAC,OAAO,EAAE,WAAW,QAAQ,GAAG;;CAEhC,EAAE,OAAO,IAAI,CAAC,eAAe,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEhD,EAAE;;CAEF,CAAC,aAAa,EAAE,WAAW,aAAa,EAAE,QAAQ,EAAE,IAAI,GAAG;;CAE3D,EAAE,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;CACpC,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;;CAE1B,EAAE,KAAK,IAAI,GAAG;;CAEd,GAAG,IAAI,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ;CAC3C,IAAI,eAAe,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ;;CAElD,IAAI,aAAa,GAAG,eAAe,GAAG,cAAc;CACpD,IAAI,aAAa,GAAG,cAAc,GAAG,eAAe,CAAC;;CAErD,GAAG,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC;CACtD,GAAG,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;;CAE7C,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,WAAW,EAAE,WAAW,YAAY,EAAE,QAAQ,EAAE,IAAI,GAAG;;CAExD,EAAE,OAAO,YAAY,CAAC,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;CAE5D,EAAE;;CAEF,CAAC,UAAU,EAAE,YAAY;;CAEzB,EAAE,IAAI,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC;;CAElD,EAAE,KAAK,iBAAiB,KAAK,IAAI,GAAG;;CAEpC,GAAG,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;CAClC,GAAG,IAAI,CAAC,MAAM,CAAC,2BAA2B,EAAE,iBAAiB,EAAE,CAAC;;CAEhE,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF;;CAEA;CACA;CACA;CACA,CAAC,qBAAqB,EAAE,WAAW,SAAS,GAAG;;CAE/C,EAAE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;CAC7B,EAAE,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;;CAEzD,EAAE,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;;CAE5B,EAAE;;CAEF;CACA,CAAC,qBAAqB,EAAE,YAAY;;CAEpC,EAAE,OAAO,IAAI,CAAC,mBAAmB,CAAC;;CAElC,EAAE;;CAEF,CAAC,WAAW,EAAE,WAAW,QAAQ,GAAG;;CAEpC,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;;CAElD,EAAE,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;;CAE5B,EAAE;;CAEF,CAAC,QAAQ,EAAE,WAAW,MAAM,GAAG;;CAE/B,EAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;CAC1B,EAAE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;;CAEpC,EAAE,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;;CAE5B,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,QAAQ,GAAG;;CAE7B,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;;CAE5D,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,cAAc,EAAE,YAAY,EAAE,QAAQ,GAAG;;CAE3D,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,KAAK,CAAC,IAAI;CAC3C,GAAG,WAAW,GAAG,IAAI,CAAC,qBAAqB;;CAE3C,GAAG,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;;CAE9B,EAAE,KAAK,WAAW,KAAK,IAAI,GAAG;;CAE9B,GAAG,WAAW,GAAG,KAAK,CAAC,uBAAuB,EAAE,CAAC;CACjD,GAAG,IAAI,CAAC,qBAAqB,GAAG,WAAW,CAAC;;CAE5C,GAAG;;CAEH,EAAE,IAAI,KAAK,GAAG,WAAW,CAAC,kBAAkB;CAC5C,GAAG,MAAM,GAAG,WAAW,CAAC,YAAY,CAAC;;CAErC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC;CACnB,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,QAAQ,CAAC;;CAE9B,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,cAAc,GAAG,SAAS,CAAC;CAC3C,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,YAAY,GAAG,SAAS,CAAC;;CAEzC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,WAAW,EAAE,YAAY;;CAE1B,EAAE,IAAI,oBAAoB,GAAG,IAAI,CAAC,qBAAqB,CAAC;;CAExD,EAAE,KAAK,oBAAoB,KAAK,IAAI,GAAG;;CAEvC,GAAG,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;CACrC,GAAG,IAAI,CAAC,MAAM,CAAC,2BAA2B,EAAE,oBAAoB,EAAE,CAAC;;CAEnE,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF;;CAEA,CAAC,QAAQ,EAAE,YAAY;;CAEvB,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC;;CAErB,EAAE;;CAEF,CAAC,OAAO,EAAE,YAAY;;CAEtB,EAAE,OAAO,IAAI,CAAC,KAAK,CAAC;;CAEpB,EAAE;;CAEF,CAAC,OAAO,EAAE,YAAY;;CAEtB,EAAE,OAAO,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;;CAE9C,EAAE;;CAEF;;CAEA,CAAC,OAAO,EAAE,WAAW,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,GAAG;;CAEjE;;CAEA,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,GAAG;;CAExB;;CAEA,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC;CAC9B,GAAG,OAAO;;CAEV,GAAG;;CAEH,EAAE,IAAI,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;;CAElC,EAAE,KAAK,SAAS,KAAK,IAAI,GAAG;;CAE5B;;CAEA,GAAG,IAAI,WAAW,GAAG,EAAE,IAAI,GAAG,SAAS,KAAK,aAAa,CAAC;CAC1D,GAAG,KAAK,WAAW,GAAG,CAAC,IAAI,aAAa,KAAK,CAAC,GAAG;;CAEjD,IAAI,OAAO;;CAEX,IAAI;;CAEJ;;CAEA,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;CAC1B,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,CAAC;;CAE3C,GAAG;;CAEH;;CAEA,EAAE,SAAS,IAAI,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC;CAC7C,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC;;CAE/C;CACA;;CAEA,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC;;CAE1C,EAAE,KAAK,MAAM,GAAG,CAAC,GAAG;;CAEpB,GAAG,IAAI,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC;CACzC,GAAG,IAAI,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC;;CAE/C,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAE7D,IAAI,YAAY,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC;CAC3C,IAAI,cAAc,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;;CAExD,IAAI;;CAEJ,GAAG;;CAEH,EAAE;;CAEF,CAAC,aAAa,EAAE,WAAW,IAAI,GAAG;;CAElC,EAAE,IAAI,MAAM,GAAG,CAAC,CAAC;;CAEjB,EAAE,KAAK,IAAI,CAAC,OAAO,GAAG;;CAEtB,GAAG,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;CACxB,GAAG,IAAI,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC;;CAE7C,GAAG,KAAK,WAAW,KAAK,IAAI,GAAG;;CAE/B,IAAI,IAAI,gBAAgB,GAAG,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;;CAE7D,IAAI,MAAM,IAAI,gBAAgB,CAAC;;CAE/B,IAAI,KAAK,IAAI,GAAG,WAAW,CAAC,kBAAkB,EAAE,CAAC,EAAE,GAAG;;CAEtD,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;;CAEvB,KAAK,KAAK,gBAAgB,KAAK,CAAC,GAAG;;CAEnC;CACA,MAAM,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;;CAE3B,MAAM;;CAEN,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH,EAAE,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC;CACjC,EAAE,OAAO,MAAM,CAAC;;CAEhB,EAAE;;CAEF,CAAC,gBAAgB,EAAE,WAAW,IAAI,GAAG;;CAErC,EAAE,IAAI,SAAS,GAAG,CAAC,CAAC;;CAEpB,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,GAAG;;CAEvB,GAAG,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;;CAE9B,GAAG,IAAI,WAAW,GAAG,IAAI,CAAC,qBAAqB,CAAC;;CAEhD,GAAG,KAAK,WAAW,KAAK,IAAI,GAAG;;CAE/B,IAAI,IAAI,gBAAgB,GAAG,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;;CAE7D,IAAI,SAAS,IAAI,gBAAgB,CAAC;;CAElC,IAAI,KAAK,IAAI,GAAG,WAAW,CAAC,kBAAkB,EAAE,CAAC,EAAE,GAAG;;CAEtD,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;;CAExB,KAAK,KAAK,SAAS,KAAK,CAAC,GAAG;;CAE5B;CACA,MAAM,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;;CAEzB,MAAM,MAAM;;CAEZ;CACA,MAAM,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;;CAEjC,MAAM;;CAEN,KAAK;;CAEL,IAAI;;CAEJ,GAAG;;CAEH,EAAE,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;CACvC,EAAE,OAAO,SAAS,CAAC;;CAEnB,EAAE;;CAEF,CAAC,WAAW,EAAE,WAAW,SAAS,GAAG;;CAErC,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;;CAEnC,EAAE,KAAK,SAAS,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC;;CAErC,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ;;CAEpC,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI;CACnB,GAAG,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;;CAE/B,EAAE,KAAK,IAAI,KAAK,QAAQ,GAAG;;CAE3B,GAAG,KAAK,SAAS,KAAK,EAAE,CAAC,GAAG;;CAE5B;;CAEA,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;CACxB,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;CAE1C,IAAI;;CAEJ,GAAG,WAAW,EAAE;;CAEhB,IAAI,KAAK,IAAI,IAAI,QAAQ,GAAG;;CAE5B,KAAK,IAAI,GAAG,QAAQ,CAAC;;CAErB,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,GAAG;;CAE3B,KAAK,IAAI,GAAG,CAAC,CAAC;;CAEd,KAAK,MAAM,MAAM,WAAW,CAAC;;CAE7B,IAAI,KAAK,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;CACrD,SAAS,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;;CAE9B,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;CAC/B,KAAK,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI;CACnC,KAAK,SAAS,EAAE,SAAS,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC;CACvC,KAAK,EAAE,CAAC;;CAER,IAAI;;CAEJ,GAAG,MAAM;;CAET,GAAG,IAAI,QAAQ,KAAK,IAAI,KAAK,YAAY,EAAE,CAAC;;CAE5C,GAAG,KAAK,SAAS,KAAK,EAAE,CAAC,GAAG;;CAE5B;;CAEA,IAAI,KAAK,SAAS,IAAI,CAAC,GAAG;;CAE1B,KAAK,SAAS,GAAG,CAAC,CAAC;;CAEnB,KAAK,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;;CAEhE,KAAK,MAAM;;CAEX;CACA;CACA;;CAEA,KAAK,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,KAAK,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;;CAEhE,KAAK;;CAEL,IAAI;;CAEJ,GAAG,KAAK,IAAI,IAAI,QAAQ,IAAI,IAAI,GAAG,CAAC,GAAG;;CAEvC;;CAEA,IAAI,IAAI,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,QAAQ,EAAE,CAAC;CAClD,IAAI,IAAI,IAAI,QAAQ,GAAG,SAAS,CAAC;;CAEjC,IAAI,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC;;CAEvC,IAAI,IAAI,OAAO,GAAG,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;;CAE/C,IAAI,KAAK,OAAO,IAAI,CAAC,GAAG;;CAExB;;CAEA,KAAK,KAAK,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;CACtD,UAAU,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;;CAE/B,KAAK,IAAI,GAAG,SAAS,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;;CAEzC,KAAK,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;CAChC,MAAM,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI;CACpC,MAAM,SAAS,EAAE,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;CACxC,MAAM,EAAE,CAAC;;CAET,KAAK,MAAM;;CAEX;;CAEA,KAAK,KAAK,OAAO,KAAK,CAAC,GAAG;;CAE1B;;CAEA,MAAM,IAAI,OAAO,GAAG,SAAS,GAAG,CAAC,CAAC;CAClC,MAAM,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;;CAEvD,MAAM,MAAM;;CAEZ,MAAM,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;;CAEjD,MAAM;;CAEN,KAAK,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;;CAEjC,KAAK,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;CAChC,MAAM,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;CACtD,MAAM,EAAE,CAAC;;CAET,KAAK;;CAEL,IAAI;;CAEJ,GAAG,KAAK,QAAQ,IAAI,EAAE,SAAS,GAAG,CAAC,OAAO,CAAC,GAAG;;CAE9C;;CAEA,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;CACrB,IAAI,OAAO,QAAQ,GAAG,IAAI,CAAC;;CAE3B,IAAI;;CAEJ,GAAG;;CAEH,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;CACnB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,WAAW,EAAE,WAAW,OAAO,EAAE,KAAK,EAAE,QAAQ,GAAG;;CAEpD,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC;;CAE3C,EAAE,KAAK,QAAQ,GAAG;;CAElB,GAAG,QAAQ,CAAC,WAAW,IAAI,eAAe,CAAC;CAC3C,GAAG,QAAQ,CAAC,SAAS,IAAI,eAAe,CAAC;;CAEzC,GAAG,MAAM;;CAET;;CAEA,GAAG,KAAK,OAAO,GAAG;;CAElB,IAAI,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC,gBAAgB,GAAG,eAAe,GAAG,mBAAmB,CAAC;;CAEzF,IAAI,MAAM;;CAEV,IAAI,QAAQ,CAAC,WAAW,GAAG,gBAAgB,CAAC;;CAE5C,IAAI;;CAEJ,GAAG,KAAK,KAAK,GAAG;;CAEhB,IAAI,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,GAAG,eAAe,GAAG,mBAAmB,CAAC;;CAErF,IAAI,MAAM;;CAEV,IAAI,QAAQ,CAAC,SAAS,KAAK,gBAAgB,CAAC;;CAE5C,IAAI;;CAEJ,GAAG;;CAEH,EAAE;;CAEF,CAAC,eAAe,EAAE,WAAW,QAAQ,EAAE,SAAS,EAAE,UAAU,GAAG;;CAE/D,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,KAAK,CAAC,IAAI;CAC3C,GAAG,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC;;CAEzC,EAAE,KAAK,WAAW,KAAK,IAAI,GAAG;;CAE9B,GAAG,WAAW,GAAG,KAAK,CAAC,uBAAuB,EAAE,CAAC;CACjD,GAAG,IAAI,CAAC,kBAAkB,GAAG,WAAW,CAAC;;CAEzC,GAAG;;CAEH,EAAE,IAAI,KAAK,GAAG,WAAW,CAAC,kBAAkB;CAC5C,GAAG,MAAM,GAAG,WAAW,CAAC,YAAY,CAAC;;CAErC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,KAAK,MAAM,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC;CAChD,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,UAAU,CAAC;;CAExD,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,cAAc,EAAE,IAAI,GAAG;;CAEhC,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;CACnB,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;CAC3B,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;;CAErB,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;;CAEf,CAAC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;;CAEtB,CAAC;;CAED,cAAc,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,SAAS,EAAE,EAAE;;CAEtF,CAAC,WAAW,EAAE,cAAc;;CAE5B,CAAC,WAAW,EAAE,WAAW,MAAM,EAAE,eAAe,GAAG;;CAEnD,EAAE,IAAI,IAAI,GAAG,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK;CAC5C,GAAG,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM;CAC/B,GAAG,OAAO,GAAG,MAAM,CAAC,MAAM;CAC1B,GAAG,QAAQ,GAAG,MAAM,CAAC,iBAAiB;CACtC,GAAG,YAAY,GAAG,MAAM,CAAC,aAAa;CACtC,GAAG,QAAQ,GAAG,IAAI,CAAC,IAAI;CACvB,GAAG,cAAc,GAAG,IAAI,CAAC,sBAAsB;CAC/C,GAAG,cAAc,GAAG,cAAc,EAAE,QAAQ,EAAE,CAAC;;CAE/C,EAAE,KAAK,cAAc,KAAK,SAAS,GAAG;;CAEtC,GAAG,cAAc,GAAG,EAAE,CAAC;CACvB,GAAG,cAAc,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC;;CAE/C,GAAG;;CAEH,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,OAAO,EAAE,GAAG,CAAC,GAAG;;CAEzC,GAAG,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE;CAC1B,IAAI,SAAS,GAAG,KAAK,CAAC,IAAI;CAC1B,IAAI,OAAO,GAAG,cAAc,EAAE,SAAS,EAAE,CAAC;;CAE1C,GAAG,KAAK,OAAO,KAAK,SAAS,GAAG;;CAEhC,IAAI,QAAQ,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC;;CAE5B,IAAI,MAAM;;CAEV,IAAI,OAAO,GAAG,QAAQ,EAAE,CAAC,EAAE,CAAC;;CAE5B,IAAI,KAAK,OAAO,KAAK,SAAS,GAAG;;CAEjC;;CAEA,KAAK,KAAK,OAAO,CAAC,WAAW,KAAK,IAAI,GAAG;;CAEzC,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;CAChC,MAAM,IAAI,CAAC,mBAAmB,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;;CAE/D,MAAM;;CAEN,KAAK,SAAS;;CAEd,KAAK;;CAEL,IAAI,IAAI,IAAI,GAAG,eAAe,IAAI,eAAe;CACjD,KAAK,iBAAiB,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;;CAE/C,IAAI,OAAO,GAAG,IAAI,aAAa;CAC/B,KAAK,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;CACpD,KAAK,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,EAAE,EAAE,CAAC;;CAEjD,IAAI,GAAG,OAAO,CAAC,cAAc,CAAC;CAC9B,IAAI,IAAI,CAAC,mBAAmB,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;;CAE7D,IAAI,QAAQ,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC;;CAE5B,IAAI;;CAEJ,GAAG,YAAY,EAAE,CAAC,EAAE,CAAC,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;;CAEnD,GAAG;;CAEH,EAAE;;CAEF,CAAC,eAAe,EAAE,WAAW,MAAM,GAAG;;CAEtC,EAAE,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG;;CAE1C,GAAG,KAAK,MAAM,CAAC,WAAW,KAAK,IAAI,GAAG;;CAEtC;CACA;;CAEA,IAAI,IAAI,QAAQ,GAAG,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI;CAC3D,KAAK,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI;CACjC,KAAK,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,CAAC;;CAEtD,IAAI,IAAI,CAAC,WAAW,EAAE,MAAM;CAC5B,KAAK,cAAc,IAAI,cAAc,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE1D,IAAI,IAAI,CAAC,kBAAkB,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;;CAE1D,IAAI;;CAEJ,GAAG,IAAI,QAAQ,GAAG,MAAM,CAAC,iBAAiB,CAAC;;CAE3C;CACA,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAEzD,IAAI,IAAI,OAAO,GAAG,QAAQ,EAAE,CAAC,EAAE,CAAC;;CAEhC,IAAI,KAAK,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,GAAG;;CAErC,KAAK,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC;CAClC,KAAK,OAAO,CAAC,iBAAiB,EAAE,CAAC;;CAEjC,KAAK;;CAEL,IAAI;;CAEJ,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;;CAE9B,GAAG;;CAEH,EAAE;;CAEF,CAAC,iBAAiB,EAAE,WAAW,MAAM,GAAG;;CAExC,EAAE,KAAK,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG;;CAExC,GAAG,IAAI,QAAQ,GAAG,MAAM,CAAC,iBAAiB,CAAC;;CAE3C;CACA,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAEzD,IAAI,IAAI,OAAO,GAAG,QAAQ,EAAE,CAAC,EAAE,CAAC;;CAEhC,IAAI,KAAK,GAAG,OAAO,CAAC,QAAQ,KAAK,CAAC,GAAG;;CAErC,KAAK,OAAO,CAAC,oBAAoB,EAAE,CAAC;CACpC,KAAK,IAAI,CAAC,gBAAgB,EAAE,OAAO,EAAE,CAAC;;CAEtC,KAAK;;CAEL,IAAI;;CAEJ,GAAG,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;;CAElC,GAAG;;CAEH,EAAE;;CAEF;;CAEA,CAAC,kBAAkB,EAAE,YAAY;;CAEjC,EAAE,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;CACrB,EAAE,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;;CAE3B,EAAE,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;CAC3B;CACA;CACA;CACA;CACA;;;CAGA,EAAE,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;CACtB,EAAE,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;;CAE5B,EAAE,IAAI,CAAC,sBAAsB,GAAG,EAAE,CAAC;;;CAGnC,EAAE,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;CACjC,EAAE,IAAI,CAAC,2BAA2B,GAAG,CAAC,CAAC;;CAEvC,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC;;CAEnB,EAAE,IAAI,CAAC,KAAK,GAAG;;CAEf,GAAG,OAAO,EAAE;CACZ,IAAI,IAAI,KAAK,GAAG;;CAEhB,KAAK,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;;CAElC,KAAK;CACL,IAAI,IAAI,KAAK,GAAG;;CAEhB,KAAK,OAAO,KAAK,CAAC,eAAe,CAAC;;CAElC,KAAK;CACL,IAAI;CACJ,GAAG,QAAQ,EAAE;CACb,IAAI,IAAI,KAAK,GAAG;;CAEhB,KAAK,OAAO,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC;;CAEnC,KAAK;CACL,IAAI,IAAI,KAAK,GAAG;;CAEhB,KAAK,OAAO,KAAK,CAAC,gBAAgB,CAAC;;CAEnC,KAAK;CACL,IAAI;CACJ,GAAG,mBAAmB,EAAE;CACxB,IAAI,IAAI,KAAK,GAAG;;CAEhB,KAAK,OAAO,KAAK,CAAC,oBAAoB,CAAC,MAAM,CAAC;;CAE9C,KAAK;CACL,IAAI,IAAI,KAAK,GAAG;;CAEhB,KAAK,OAAO,KAAK,CAAC,2BAA2B,CAAC;;CAE9C,KAAK;CACL,IAAI;;CAEJ,GAAG,CAAC;;CAEJ,EAAE;;CAEF;;CAEA,CAAC,eAAe,EAAE,WAAW,MAAM,GAAG;;CAEtC,EAAE,IAAI,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;CACjC,EAAE,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC;;CAExD,EAAE;;CAEF,CAAC,kBAAkB,EAAE,WAAW,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG;;CAE7D,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ;CAC7B,GAAG,aAAa,GAAG,IAAI,CAAC,cAAc;CACtC,GAAG,cAAc,GAAG,aAAa,EAAE,QAAQ,EAAE,CAAC;;CAE9C,EAAE,KAAK,cAAc,KAAK,SAAS,GAAG;;CAEtC,GAAG,cAAc,GAAG;;CAEpB,IAAI,YAAY,EAAE,EAAE,MAAM,EAAE;CAC5B,IAAI,YAAY,EAAE,EAAE;;CAEpB,IAAI,CAAC;;CAEL,GAAG,MAAM,CAAC,iBAAiB,GAAG,CAAC,CAAC;;CAEhC,GAAG,aAAa,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC;;CAE9C,GAAG,MAAM;;CAET,GAAG,IAAI,YAAY,GAAG,cAAc,CAAC,YAAY,CAAC;;CAElD,GAAG,MAAM,CAAC,iBAAiB,GAAG,YAAY,CAAC,MAAM,CAAC;CAClD,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE/B,GAAG;;CAEH,EAAE,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;CACtC,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;;CAEzB,EAAE,cAAc,CAAC,YAAY,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;;CAEnD,EAAE;;CAEF,CAAC,qBAAqB,EAAE,WAAW,MAAM,GAAG;;CAE5C,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ;CAC7B,GAAG,kBAAkB,GAAG,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;CACrD,GAAG,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;;CAEnC,EAAE,kBAAkB,CAAC,WAAW,GAAG,UAAU,CAAC;CAC9C,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,kBAAkB,CAAC;CAC7C,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;;CAEhB,EAAE,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;;;CAG5B,EAAE,IAAI,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI;CAClC,GAAG,aAAa,GAAG,IAAI,CAAC,cAAc;CACtC,GAAG,cAAc,GAAG,aAAa,EAAE,QAAQ,EAAE;CAC7C,GAAG,mBAAmB,GAAG,cAAc,CAAC,YAAY;;CAEpD,GAAG,eAAe;CAClB,IAAI,mBAAmB,EAAE,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE;;CAEzD,GAAG,gBAAgB,GAAG,MAAM,CAAC,iBAAiB,CAAC;;CAE/C,EAAE,eAAe,CAAC,iBAAiB,GAAG,gBAAgB,CAAC;CACvD,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,GAAG,eAAe,CAAC;CAC5D,EAAE,mBAAmB,CAAC,GAAG,EAAE,CAAC;;CAE5B,EAAE,MAAM,CAAC,iBAAiB,GAAG,IAAI,CAAC;;;CAGlC,EAAE,IAAI,YAAY,GAAG,cAAc,CAAC,YAAY;CAChD,GAAG,QAAQ,GAAG,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;;CAEvD,EAAE,OAAO,YAAY,EAAE,QAAQ,EAAE,CAAC;;CAElC,EAAE,KAAK,mBAAmB,CAAC,MAAM,KAAK,CAAC,GAAG;;CAE1C,GAAG,OAAO,aAAa,EAAE,QAAQ,EAAE,CAAC;;CAEpC,GAAG;;CAEH,EAAE,IAAI,CAAC,gCAAgC,EAAE,MAAM,EAAE,CAAC;;CAElD,EAAE;;CAEF,CAAC,gCAAgC,EAAE,WAAW,MAAM,GAAG;;CAEvD,EAAE,IAAI,QAAQ,GAAG,MAAM,CAAC,iBAAiB,CAAC;CAC1C,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAExD,GAAG,IAAI,OAAO,GAAG,QAAQ,EAAE,CAAC,EAAE,CAAC;;CAE/B,GAAG,KAAK,GAAG,OAAO,CAAC,cAAc,KAAK,CAAC,GAAG;;CAE1C,IAAI,IAAI,CAAC,sBAAsB,EAAE,OAAO,EAAE,CAAC;;CAE3C,IAAI;;CAEJ,GAAG;;CAEH,EAAE;;CAEF,CAAC,WAAW,EAAE,WAAW,MAAM,GAAG;;CAElC;CACA;CACA;CACA;CACA;;CAEA,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ;CAC7B,GAAG,SAAS,GAAG,MAAM,CAAC,WAAW;;CAEjC,GAAG,eAAe,GAAG,IAAI,CAAC,eAAe,GAAG;;CAE5C,GAAG,mBAAmB,GAAG,OAAO,EAAE,eAAe,EAAE,CAAC;;CAEpD,EAAE,MAAM,CAAC,WAAW,GAAG,eAAe,CAAC;CACvC,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC;;CAEtC,EAAE,mBAAmB,CAAC,WAAW,GAAG,SAAS,CAAC;CAC9C,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,mBAAmB,CAAC;;CAE7C,EAAE;;CAEF,CAAC,eAAe,EAAE,WAAW,MAAM,GAAG;;CAEtC;CACA;CACA;CACA;CACA;;CAEA,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ;CAC7B,GAAG,SAAS,GAAG,MAAM,CAAC,WAAW;;CAEjC,GAAG,kBAAkB,GAAG,GAAG,IAAI,CAAC,eAAe;;CAE/C,GAAG,gBAAgB,GAAG,OAAO,EAAE,kBAAkB,EAAE,CAAC;;CAEpD,EAAE,MAAM,CAAC,WAAW,GAAG,kBAAkB,CAAC;CAC1C,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAAC;;CAEzC,EAAE,gBAAgB,CAAC,WAAW,GAAG,SAAS,CAAC;CAC3C,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,gBAAgB,CAAC;;CAE1C,EAAE;;CAEF;;CAEA,CAAC,mBAAmB,EAAE,WAAW,OAAO,EAAE,QAAQ,EAAE,SAAS,GAAG;;CAEhE,EAAE,IAAI,cAAc,GAAG,IAAI,CAAC,sBAAsB;CAClD,GAAG,aAAa,GAAG,cAAc,EAAE,QAAQ,EAAE;;CAE7C,GAAG,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;;CAE7B,EAAE,KAAK,aAAa,KAAK,SAAS,GAAG;;CAErC,GAAG,aAAa,GAAG,EAAE,CAAC;CACtB,GAAG,cAAc,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC;;CAE9C,GAAG;;CAEH,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;;CAEvC,EAAE,OAAO,CAAC,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC;CACxC,EAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;;CAE3B,EAAE;;CAEF,CAAC,sBAAsB,EAAE,WAAW,OAAO,GAAG;;CAE9C,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,SAAS;CAC/B,GAAG,WAAW,GAAG,OAAO,CAAC,OAAO;CAChC,GAAG,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI;CACvC,GAAG,SAAS,GAAG,WAAW,CAAC,IAAI;CAC/B,GAAG,cAAc,GAAG,IAAI,CAAC,sBAAsB;CAC/C,GAAG,aAAa,GAAG,cAAc,EAAE,QAAQ,EAAE;;CAE7C,GAAG,mBAAmB,GAAG,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;CACxD,GAAG,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;;CAEpC,EAAE,mBAAmB,CAAC,WAAW,GAAG,UAAU,CAAC;CAC/C,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,mBAAmB,CAAC;CAC/C,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC;;CAEjB,EAAE,OAAO,aAAa,EAAE,SAAS,EAAE,CAAC;;CAEpC,EAAE,gBAAgB,EAAE;;CAEpB,GAAG,MAAM,IAAI,CAAC,IAAI,aAAa,GAAG,MAAM,gBAAgB,CAAC;;CAEzD,GAAG,OAAO,cAAc,EAAE,QAAQ,EAAE,CAAC;;CAErC,GAAG;;CAEH,EAAE;;CAEF,CAAC,YAAY,EAAE,WAAW,OAAO,GAAG;;CAEpC,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,SAAS;CAC/B,GAAG,SAAS,GAAG,OAAO,CAAC,WAAW;;CAElC,GAAG,eAAe,GAAG,IAAI,CAAC,gBAAgB,GAAG;;CAE7C,GAAG,oBAAoB,GAAG,QAAQ,EAAE,eAAe,EAAE,CAAC;;CAEtD,EAAE,OAAO,CAAC,WAAW,GAAG,eAAe,CAAC;CACxC,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;;CAExC,EAAE,oBAAoB,CAAC,WAAW,GAAG,SAAS,CAAC;CAC/C,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,oBAAoB,CAAC;;CAE/C,EAAE;;CAEF,CAAC,gBAAgB,EAAE,WAAW,OAAO,GAAG;;CAExC,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,SAAS;CAC/B,GAAG,SAAS,GAAG,OAAO,CAAC,WAAW;;CAElC,GAAG,kBAAkB,GAAG,GAAG,IAAI,CAAC,gBAAgB;;CAEhD,GAAG,iBAAiB,GAAG,QAAQ,EAAE,kBAAkB,EAAE,CAAC;;CAEtD,EAAE,OAAO,CAAC,WAAW,GAAG,kBAAkB,CAAC;CAC3C,EAAE,QAAQ,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC;;CAE3C,EAAE,iBAAiB,CAAC,WAAW,GAAG,SAAS,CAAC;CAC5C,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,iBAAiB,CAAC;;CAE5C,EAAE;;;CAGF;;CAEA,CAAC,uBAAuB,EAAE,YAAY;;CAEtC,EAAE,IAAI,YAAY,GAAG,IAAI,CAAC,oBAAoB;CAC9C,GAAG,eAAe,GAAG,IAAI,CAAC,2BAA2B,GAAG;CACxD,GAAG,WAAW,GAAG,YAAY,EAAE,eAAe,EAAE,CAAC;;CAEjD,EAAE,KAAK,WAAW,KAAK,SAAS,GAAG;;CAEnC,GAAG,WAAW,GAAG,IAAI,iBAAiB;CACtC,IAAI,IAAI,YAAY,EAAE,CAAC,EAAE,EAAE,IAAI,YAAY,EAAE,CAAC,EAAE;CAChD,IAAI,CAAC,EAAE,IAAI,CAAC,gCAAgC,EAAE,CAAC;;CAE/C,GAAG,WAAW,CAAC,YAAY,GAAG,eAAe,CAAC;CAC9C,GAAG,YAAY,EAAE,eAAe,EAAE,GAAG,WAAW,CAAC;;CAEjD,GAAG;;CAEH,EAAE,OAAO,WAAW,CAAC;;CAErB,EAAE;;CAEF,CAAC,2BAA2B,EAAE,WAAW,WAAW,GAAG;;CAEvD,EAAE,IAAI,YAAY,GAAG,IAAI,CAAC,oBAAoB;CAC9C,GAAG,SAAS,GAAG,WAAW,CAAC,YAAY;;CAEvC,GAAG,kBAAkB,GAAG,GAAG,IAAI,CAAC,2BAA2B;;CAE3D,GAAG,qBAAqB,GAAG,YAAY,EAAE,kBAAkB,EAAE,CAAC;;CAE9D,EAAE,WAAW,CAAC,YAAY,GAAG,kBAAkB,CAAC;CAChD,EAAE,YAAY,EAAE,kBAAkB,EAAE,GAAG,WAAW,CAAC;;CAEnD,EAAE,qBAAqB,CAAC,YAAY,GAAG,SAAS,CAAC;CACjD,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,qBAAqB,CAAC;;CAEpD,EAAE;;CAEF,CAAC,gCAAgC,EAAE,IAAI,YAAY,EAAE,CAAC,EAAE;;CAExD;CACA;CACA;CACA,CAAC,UAAU,EAAE,WAAW,IAAI,EAAE,YAAY,GAAG;;CAE7C,EAAE,IAAI,IAAI,GAAG,YAAY,IAAI,IAAI,CAAC,KAAK;CACvC,GAAG,QAAQ,GAAG,IAAI,CAAC,IAAI;;CAEvB,GAAG,UAAU,GAAG,OAAO,IAAI,KAAK,QAAQ;CACxC,IAAI,aAAa,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI;;CAEjD,GAAG,QAAQ,GAAG,UAAU,KAAK,IAAI,GAAG,UAAU,CAAC,IAAI,GAAG,IAAI;;CAE1D,GAAG,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE;CACnD,GAAG,eAAe,GAAG,IAAI,CAAC;;CAE1B,EAAE,KAAK,cAAc,KAAK,SAAS,GAAG;;CAEtC,GAAG,IAAI,cAAc;CACrB,KAAK,cAAc,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAC;;CAE7C,GAAG,KAAK,cAAc,KAAK,SAAS,GAAG;;CAEvC,IAAI,OAAO,cAAc,CAAC;;CAE1B,IAAI;;CAEJ;CACA;CACA,GAAG,eAAe,GAAG,cAAc,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC;;CAEtD;CACA,GAAG,KAAK,UAAU,KAAK,IAAI;CAC3B,IAAI,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC;;CAEvC,GAAG;;CAEH;CACA,EAAE,KAAK,UAAU,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC;;CAEzC;CACA,EAAE,IAAI,SAAS,GAAG,IAAI,eAAe,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;;CAExE,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;;CAEjD;CACA,EAAE,IAAI,CAAC,kBAAkB,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;;CAE3D,EAAE,OAAO,SAAS,CAAC;;CAEnB,EAAE;;CAEF;CACA,CAAC,cAAc,EAAE,WAAW,IAAI,EAAE,YAAY,GAAG;;CAEjD,EAAE,IAAI,IAAI,GAAG,YAAY,IAAI,IAAI,CAAC,KAAK;CACvC,GAAG,QAAQ,GAAG,IAAI,CAAC,IAAI;;CAEvB,GAAG,UAAU,GAAG,OAAO,IAAI,KAAK,QAAQ;CACxC,IAAI,aAAa,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI;;CAEjD,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC,IAAI,GAAG,IAAI;;CAEjD,GAAG,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,CAAC;;CAEpD,EAAE,KAAK,cAAc,KAAK,SAAS,GAAG;;CAEtC,GAAG,OAAO,cAAc,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC;;CAE1D,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF;CACA,CAAC,aAAa,EAAE,YAAY;;CAE5B,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ;CAC7B,GAAG,QAAQ,GAAG,IAAI,CAAC,eAAe;CAClC,GAAG,QAAQ,GAAG,IAAI,CAAC,SAAS;CAC5B,GAAG,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC;;CAErC,EAAE,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;CAC3B,EAAE,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;;CAE5B,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,QAAQ,EAAE,GAAG,CAAC,GAAG;;CAE1C,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;;CAExB,GAAG;;CAEH,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,SAAS,EAAE,GAAG,CAAC,GAAG;;CAE3C,GAAG,QAAQ,EAAE,CAAC,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAC;;CAE9B,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF;CACA,CAAC,MAAM,EAAE,WAAW,SAAS,GAAG;;CAEhC,EAAE,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC;;CAE9B,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ;CAC7B,GAAG,QAAQ,GAAG,IAAI,CAAC,eAAe;;CAElC,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,SAAS;CAChC,GAAG,aAAa,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE;;CAEzC,GAAG,SAAS,GAAG,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC;;CAEpC;;CAEA,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,QAAQ,EAAE,GAAG,CAAC,GAAG;;CAE1C,GAAG,IAAI,MAAM,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC;;CAE7B,GAAG,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC;;CAE/D,GAAG;;CAEH;;CAEA,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,SAAS;CAC/B,GAAG,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC;;CAErC,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,SAAS,EAAE,GAAG,CAAC,GAAG;;CAE3C,GAAG,QAAQ,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC;;CAEpC,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF;CACA,CAAC,OAAO,EAAE,YAAY;;CAEtB,EAAE,OAAO,IAAI,CAAC,KAAK,CAAC;;CAEpB,EAAE;;CAEF;CACA,CAAC,WAAW,EAAE,WAAW,IAAI,GAAG;;CAEhC,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ;CAC7B,GAAG,QAAQ,GAAG,IAAI,CAAC,IAAI;CACvB,GAAG,aAAa,GAAG,IAAI,CAAC,cAAc;CACtC,GAAG,cAAc,GAAG,aAAa,EAAE,QAAQ,EAAE,CAAC;;CAE9C,EAAE,KAAK,cAAc,KAAK,SAAS,GAAG;;CAEtC;CACA;CACA;;CAEA,GAAG,IAAI,eAAe,GAAG,cAAc,CAAC,YAAY,CAAC;;CAErD,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG;;CAEhE,IAAI,IAAI,MAAM,GAAG,eAAe,EAAE,CAAC,EAAE,CAAC;;CAEtC,IAAI,IAAI,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAC;;CAErC,IAAI,IAAI,UAAU,GAAG,MAAM,CAAC,WAAW;CACvC,KAAK,kBAAkB,GAAG,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;;CAExD,IAAI,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;CAC9B,IAAI,MAAM,CAAC,iBAAiB,GAAG,IAAI,CAAC;;CAEpC,IAAI,kBAAkB,CAAC,WAAW,GAAG,UAAU,CAAC;CAChD,IAAI,OAAO,EAAE,UAAU,EAAE,GAAG,kBAAkB,CAAC;CAC/C,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;;CAElB,IAAI,IAAI,CAAC,gCAAgC,EAAE,MAAM,EAAE,CAAC;;CAEpD,IAAI;;CAEJ,GAAG,OAAO,aAAa,EAAE,QAAQ,EAAE,CAAC;;CAEpC,GAAG;;CAEH,EAAE;;CAEF;CACA,CAAC,WAAW,EAAE,WAAW,IAAI,GAAG;;CAEhC,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI;CAC1B,GAAG,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC;;CAEvC,EAAE,MAAM,IAAI,QAAQ,IAAI,aAAa,GAAG;;CAExC,GAAG,IAAI,YAAY,GAAG,aAAa,EAAE,QAAQ,EAAE,CAAC,YAAY;CAC5D,IAAI,MAAM,GAAG,YAAY,EAAE,QAAQ,EAAE,CAAC;;CAEtC,GAAG,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE/B,IAAI,IAAI,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAC;CACrC,IAAI,IAAI,CAAC,qBAAqB,EAAE,MAAM,EAAE,CAAC;;CAEzC,IAAI;;CAEJ,GAAG;;CAEH,EAAE,IAAI,cAAc,GAAG,IAAI,CAAC,sBAAsB;CAClD,GAAG,aAAa,GAAG,cAAc,EAAE,QAAQ,EAAE,CAAC;;CAE9C,EAAE,KAAK,aAAa,KAAK,SAAS,GAAG;;CAErC,GAAG,MAAM,IAAI,SAAS,IAAI,aAAa,GAAG;;CAE1C,IAAI,IAAI,OAAO,GAAG,aAAa,EAAE,SAAS,EAAE,CAAC;CAC7C,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;CACnC,IAAI,IAAI,CAAC,sBAAsB,EAAE,OAAO,EAAE,CAAC;;CAE3C,IAAI;;CAEJ,GAAG;;CAEH,EAAE;;CAEF;CACA,CAAC,aAAa,EAAE,WAAW,IAAI,EAAE,YAAY,GAAG;;CAEhD,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;CAEzD,EAAE,KAAK,MAAM,KAAK,IAAI,GAAG;;CAEzB,GAAG,IAAI,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAC;CACpC,GAAG,IAAI,CAAC,qBAAqB,EAAE,MAAM,EAAE,CAAC;;CAExC,GAAG;;CAEH,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,OAAO,EAAE,KAAK,GAAG;;CAE1B,CAAC,KAAK,OAAO,KAAK,KAAK,QAAQ,GAAG;;CAElC,EAAE,OAAO,CAAC,IAAI,EAAE,oDAAoD,EAAE,CAAC;CACvE,EAAE,KAAK,GAAG,SAAS,EAAE,CAAC,EAAE,CAAC;;CAEzB,EAAE;;CAEF,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;;CAEpB,CAAC;;CAED,OAAO,CAAC,SAAS,CAAC,KAAK,GAAG,YAAY;;CAEtC,CAAC,OAAO,IAAI,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;;CAExF,CAAC,CAAC;;CAEF;CACA;CACA;;CAEA,SAAS,uBAAuB,GAAG;;CAEnC,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7B,CAAC,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;CACvC,CAAC,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;;CAEpC,CAAC;;CAED,uBAAuB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,EAAE,EAAE;;CAE9F,CAAC,WAAW,EAAE,uBAAuB;;CAErC,CAAC,yBAAyB,EAAE,IAAI;;CAEhC,CAAC,IAAI,EAAE,WAAW,MAAM,GAAG;;CAE3B,EAAE,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAErD,EAAE,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;;CAEpD,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7C,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,0BAA0B,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAG;;CAEvF,CAAC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;CAC/B,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;CAC1B,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;;CAEtB,CAAC,IAAI,CAAC,UAAU,GAAG,UAAU,KAAK,IAAI,CAAC;;CAEvC,CAAC;;CAED,MAAM,CAAC,gBAAgB,EAAE,0BAA0B,CAAC,SAAS,EAAE;;CAE/D,CAAC,KAAK,EAAE;;CAER,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;;CAE1B,GAAG;;CAEH,EAAE;;CAEF,CAAC,KAAK,EAAE;;CAER,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;;CAE1B,GAAG;;CAEH,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,SAAS,EAAE;;CAErD,CAAC,4BAA4B,EAAE,IAAI;;CAEnC,CAAC,IAAI,EAAE,WAAW,KAAK,EAAE,CAAC,GAAG;;CAE7B,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;;CAEhE,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,KAAK,EAAE,CAAC,GAAG;;CAE7B,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;;CAEpE,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,KAAK,EAAE,CAAC,GAAG;;CAE7B,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;;CAEpE,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,KAAK,EAAE,CAAC,GAAG;;CAE7B,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;;CAEpE,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,KAAK,GAAG;;CAE1B,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;;CAEnE,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,KAAK,GAAG;;CAE1B,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;;CAEvE,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,KAAK,GAAG;;CAE1B,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;;CAEvE,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,KAAK,GAAG;;CAE1B,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;;CAEvE,EAAE;;CAEF,CAAC,KAAK,EAAE,WAAW,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG;;CAEjC,EAAE,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;CAEjD,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;CACnC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;;CAEnC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;CAErC,EAAE,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;CAEjD,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;CACnC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;CACnC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;;CAEnC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,OAAO,EAAE,WAAW,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;CAEzC,EAAE,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;CAEjD,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;CACnC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;CACnC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;CACnC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;;CAEnC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,iBAAiB,EAAE,KAAK,EAAE,MAAM,GAAG;;CAE5C,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;CACpB,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;CACtB,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,KAAK,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC;;CAE9D,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;CACtB,CAAC,IAAI,CAAC,WAAW,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;;CAE9C,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;;CAElB,CAAC;;CAED,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,SAAS,EAAE,aAAa,EAAE;;CAEnE,CAAC,GAAG,EAAE,WAAW,KAAK,GAAG;;CAEzB,EAAE,KAAK,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC;;CAExC,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,SAAS,EAAE;;CAE5C,CAAC,mBAAmB,EAAE,IAAI;;CAE1B,CAAC,gBAAgB,EAAE,YAAY,EAAE;;CAEjC,CAAC,QAAQ,EAAE,WAAW,KAAK,GAAG;;CAE9B,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG;;CAEhC,GAAG,MAAM,IAAI,SAAS,EAAE,uDAAuD,EAAE,CAAC;;CAElF,GAAG;;CAEH,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK,KAAK,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;CACpE,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;;CAErB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,UAAU,EAAE,WAAW,KAAK,GAAG;;CAEhC,EAAE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;;CAEvB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,MAAM,GAAG;;CAE3B,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;CAC5D,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;CAC5B,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;CAC9B,EAAE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;;CAEhC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG;;CAEhD,EAAE,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;CACxB,EAAE,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC;;CAE7B,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAElD,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;;CAE5D,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,GAAG,EAAE,WAAW,KAAK,EAAE,MAAM,GAAG;;CAEjC,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG,MAAM,GAAG,CAAC,CAAC;;CAEzC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;;CAElC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7C,EAAE;;CAEF,CAAC,QAAQ,EAAE,WAAW,QAAQ,GAAG;;CAEjC,EAAE,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;;CAEnC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,0BAA0B,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,GAAG;;CAEvE,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;;CAE/C,CAAC,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,IAAI,CAAC,CAAC;;CAE/C,CAAC;;CAED,0BAA0B,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,SAAS,EAAE,EAAE;;CAEpG,CAAC,WAAW,EAAE,0BAA0B;;CAExC,CAAC,4BAA4B,EAAE,IAAI;;CAEnC,CAAC,IAAI,EAAE,WAAW,MAAM,GAAG;;CAE3B,EAAE,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAExD,EAAE,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;;CAElD,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,wBAAwB,EAAE,KAAK,EAAE,QAAQ,EAAE,gBAAgB,GAAG;;CAEvE,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;;CAE/C,CAAC,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,IAAI,CAAC,CAAC;;CAE/C,CAAC;;CAED,wBAAwB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,SAAS,EAAE,EAAE;;CAEhG,CAAC,WAAW,EAAE,wBAAwB;;CAEtC,CAAC,0BAA0B,EAAE,IAAI;;CAEjC,CAAC,IAAI,EAAE,WAAW,MAAM,GAAG;;CAE3B,EAAE,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;CAEtD,EAAE,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;;CAElD,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;;CAEA,SAAS,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,GAAG;;CAEnD,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;CACzC;;CAEA,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC;CACvB,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI,QAAQ,CAAC;;CAE5B,CAAC,IAAI,CAAC,MAAM,GAAG;CACf,EAAE,IAAI,EAAE,EAAE;CACV,EAAE,IAAI,EAAE,EAAE;CACV,EAAE,GAAG,EAAE,EAAE;CACT,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE;CAC1B,EAAE,MAAM,EAAE,EAAE;CACZ,EAAE,CAAC;;CAEH,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,MAAM,EAAE;CACvC,EAAE,UAAU,EAAE;CACd,GAAG,GAAG,EAAE,YAAY;;CAEpB,IAAI,OAAO,CAAC,IAAI,EAAE,uEAAuE,EAAE,CAAC;CAC5F,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC;;CAEvB,IAAI;CACJ,GAAG;CACH,EAAE,EAAE,CAAC;;CAEL,CAAC;;CAED,SAAS,OAAO,EAAE,CAAC,EAAE,CAAC,GAAG;;CAEzB,CAAC,OAAO,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;;CAEhC,CAAC;;CAED,SAAS,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,GAAG;;CAErE,CAAC,KAAK,MAAM,CAAC,OAAO,KAAK,KAAK,GAAG,OAAO;;CAExC,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;;CAEzC,CAAC,KAAK,SAAS,KAAK,IAAI,GAAG;;CAE3B,EAAE,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;;CAEjC,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEtD,GAAG,eAAe,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;;CAEjE,GAAG;;CAEH,EAAE;;CAEF,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE;;CAEpC,CAAC,aAAa,EAAE,CAAC;;CAEjB,CAAC,GAAG,EAAE,WAAW,MAAM,EAAE,SAAS,GAAG;;CAErC;;CAEA,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;;CAEpC,EAAE;;CAEF,CAAC,aAAa,EAAE,WAAW,MAAM,EAAE,MAAM,GAAG;;CAE5C,EAAE,OAAO,MAAM,IAAI,MAAM,CAAC,mBAAmB,KAAK;;CAElD,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;CAC/D,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,CAAC;;CAE5G,GAAG,MAAM,OAAO,MAAM,IAAI,MAAM,CAAC,oBAAoB,KAAK;;CAE1D,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,OAAO,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;CAC9H,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,kBAAkB,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;;CAEhF,GAAG,MAAM;;CAET,GAAG,OAAO,CAAC,KAAK,EAAE,2CAA2C,EAAE,CAAC;;CAEhE,GAAG;;CAEH,EAAE;;CAEF,CAAC,eAAe,EAAE,WAAW,MAAM,EAAE,SAAS,EAAE,cAAc,GAAG;;CAEjE,EAAE,IAAI,UAAU,GAAG,cAAc,IAAI,EAAE,CAAC;;CAExC,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;;CAEzD,EAAE,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;;CAE7B,EAAE,OAAO,UAAU,CAAC;;CAEpB,EAAE;;CAEF,CAAC,gBAAgB,EAAE,WAAW,OAAO,EAAE,SAAS,EAAE,cAAc,GAAG;;CAEnE,EAAE,IAAI,UAAU,GAAG,cAAc,IAAI,EAAE,CAAC;;CAExC,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,KAAK,GAAG;;CAE5C,GAAG,OAAO,CAAC,IAAI,EAAE,4DAA4D,EAAE,CAAC;CAChF,GAAG,OAAO,UAAU,CAAC;;CAErB,GAAG;;CAEH,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAErD,GAAG,eAAe,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;;CAEhE,GAAG;;CAEH,EAAE,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;;CAE7B,EAAE,OAAO,UAAU,CAAC;;CAEpB,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,KAAK,EAAE,SAAS,GAAG;;CAE5B,CAAC,IAAI,CAAC,SAAS,GAAG,EAAE,SAAS,KAAK,SAAS,KAAK,SAAS,GAAG,IAAI,CAAC;;CAEjE,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;CACpB,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;CAClB,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;;CAEtB,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;;CAEtB,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE;;CAEhC,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,IAAI,CAAC,SAAS,GAAG,EAAE,OAAO,WAAW,KAAK,WAAW,GAAG,IAAI,GAAG,WAAW,GAAG,GAAG,EAAE,CAAC;;CAErF,EAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;CAChC,EAAE,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;CACvB,EAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;;CAEtB,EAAE;;CAEF,CAAC,IAAI,EAAE,YAAY;;CAEnB,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;CACxB,EAAE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;CACvB,EAAE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;;CAEzB,EAAE;;CAEF,CAAC,cAAc,EAAE,YAAY;;CAE7B,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;CAClB,EAAE,OAAO,IAAI,CAAC,WAAW,CAAC;;CAE1B,EAAE;;CAEF,CAAC,QAAQ,EAAE,YAAY;;CAEvB,EAAE,IAAI,IAAI,GAAG,CAAC,CAAC;;CAEf,EAAE,KAAK,IAAI,CAAC,SAAS,IAAI,EAAE,IAAI,CAAC,OAAO,GAAG;;CAE1C,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;CAChB,GAAG,OAAO,CAAC,CAAC;;CAEZ,GAAG;;CAEH,EAAE,KAAK,IAAI,CAAC,OAAO,GAAG;;CAEtB,GAAG,IAAI,OAAO,GAAG,EAAE,OAAO,WAAW,KAAK,WAAW,GAAG,IAAI,GAAG,WAAW,GAAG,GAAG,EAAE,CAAC;;CAEnF,GAAG,IAAI,GAAG,EAAE,OAAO,GAAG,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC;CAC5C,GAAG,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;;CAE1B,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC;;CAE5B,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,GAAG;;CAEzC,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,MAAM,KAAK,SAAS,KAAK,MAAM,GAAG,GAAG,CAAC;CACvD,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,GAAG,KAAK,SAAS,KAAK,GAAG,GAAG,CAAC,CAAC;CAC5C,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,KAAK,KAAK,SAAS,KAAK,KAAK,GAAG,CAAC,CAAC;;CAElD,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE;;CAEpC,CAAC,GAAG,EAAE,WAAW,MAAM,EAAE,GAAG,EAAE,KAAK,GAAG;;CAEtC,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;CACvB,EAAE,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;CACjB,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;;CAErB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7C,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,KAAK,GAAG;;CAE1B,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;CAC7B,EAAE,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;CACvB,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;;CAE3B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF;CACA,CAAC,QAAQ,EAAE,YAAY;;CAEvB,EAAE,IAAI,GAAG,GAAG,QAAQ,CAAC;CACrB,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;;CAElE,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,cAAc,EAAE,WAAW,IAAI,GAAG;;CAEnC,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;;CAE9B,EAAE,KAAK,IAAI,CAAC,MAAM,KAAK,CAAC,GAAG;;CAE3B,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;CAClB,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;;CAEhB,GAAG,MAAM;;CAET,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CAC7C,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEvE,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG;;CAEzC,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,MAAM,KAAK,SAAS,KAAK,MAAM,GAAG,GAAG,CAAC;CACvD,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,KAAK,KAAK,SAAS,KAAK,KAAK,GAAG,CAAC,CAAC;CAClD,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,SAAS,KAAK,CAAC,GAAG,CAAC,CAAC;;CAEtC,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,SAAS,EAAE;;CAEtC,CAAC,GAAG,EAAE,WAAW,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG;;CAEpC,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;CACvB,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;CACrB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;;CAEb,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7C,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,KAAK,GAAG;;CAE1B,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;CAC7B,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;CAC3B,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;;CAEnB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,cAAc,EAAE,WAAW,IAAI,GAAG;;CAEnC,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC;CAC/D,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;CAC5C,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;;CAElB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG;;CAE1B,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,GAAG,KAAK,SAAS,KAAK,GAAG,GAAG,IAAI,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,CAAC;CAChF,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,GAAG,KAAK,SAAS,KAAK,GAAG,GAAG,IAAI,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,CAAC;;CAEhF,CAAC;;CAED,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE;;CAE/B,CAAC,GAAG,EAAE,WAAW,GAAG,EAAE,GAAG,GAAG;;CAE5B,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;CACvB,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;;CAEvB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,aAAa,EAAE,WAAW,MAAM,GAAG;;CAEpC,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;;CAEnB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEtD,GAAG,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;;CAErC,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,oBAAoB,EAAE,YAAY;;CAEnC,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,OAAO,SAAS,oBAAoB,EAAE,MAAM,EAAE,IAAI,GAAG;;CAEvD,GAAG,IAAI,QAAQ,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC;CACxD,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;CAC3C,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;;CAE3C,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAE7C,EAAE;;CAEF,CAAC,IAAI,EAAE,WAAW,GAAG,GAAG;;CAExB,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;CAC3B,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;;CAE3B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,SAAS,EAAE,YAAY;;CAExB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC;CACvC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC;;CAEvC,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,OAAO,EAAE,YAAY;;CAEtB;;CAEA,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;;CAEpE,EAAE;;CAEF,CAAC,SAAS,EAAE,WAAW,MAAM,GAAG;;CAEhC,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,OAAO,CAAC,IAAI,EAAE,iDAAiD,EAAE,CAAC;CACrE,GAAG,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE1B,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC;;CAE7G,EAAE;;CAEF,CAAC,OAAO,EAAE,WAAW,MAAM,GAAG;;CAE9B,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,OAAO,CAAC,IAAI,EAAE,+CAA+C,EAAE,CAAC;CACnE,GAAG,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE1B,GAAG;;CAEH,EAAE,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;;CAEvF,EAAE;;CAEF,CAAC,aAAa,EAAE,WAAW,KAAK,GAAG;;CAEnC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;CACxB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;;CAExB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,cAAc,EAAE,WAAW,MAAM,GAAG;;CAErC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC;CACzB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC;;CAEzB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,cAAc,EAAE,WAAW,MAAM,GAAG;;CAErC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC;CACjC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;;CAE/B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,aAAa,EAAE,WAAW,KAAK,GAAG;;CAEnC,EAAE,OAAO,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;CACrD,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC;;CAE/D,EAAE;;CAEF,CAAC,WAAW,EAAE,WAAW,GAAG,GAAG;;CAE/B,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;CAC3D,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;;CAEtD,EAAE;;CAEF,CAAC,YAAY,EAAE,WAAW,KAAK,EAAE,MAAM,GAAG;;CAE1C;CACA;;CAEA,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,OAAO,CAAC,IAAI,EAAE,oDAAoD,EAAE,CAAC;CACxE,GAAG,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE1B,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC,GAAG;CACnB,GAAG,EAAE,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;CACzD,GAAG,EAAE,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;CACzD,GAAG,CAAC;;CAEJ,EAAE;;CAEF,CAAC,aAAa,EAAE,WAAW,GAAG,GAAG;;CAEjC;;CAEA,EAAE,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;CACzD,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC;;CAEnE,EAAE;;CAEF,CAAC,UAAU,EAAE,WAAW,KAAK,EAAE,MAAM,GAAG;;CAExC,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,OAAO,CAAC,IAAI,EAAE,kDAAkD,EAAE,CAAC;CACtE,GAAG,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE1B,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;;CAE1D,EAAE;;CAEF,CAAC,eAAe,EAAE,YAAY;;CAE9B,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEzB,EAAE,OAAO,SAAS,eAAe,EAAE,KAAK,GAAG;;CAE3C,GAAG,IAAI,YAAY,GAAG,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;CACnE,GAAG,OAAO,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC;;CAE7C,GAAG,CAAC;;CAEJ,EAAE,EAAE;;CAEJ,CAAC,SAAS,EAAE,WAAW,GAAG,GAAG;;CAE7B,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;CAC1B,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;;CAE1B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,KAAK,EAAE,WAAW,GAAG,GAAG;;CAEzB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;CAC1B,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;;CAE1B,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,SAAS,EAAE,WAAW,MAAM,GAAG;;CAEhC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC;CACzB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC;;CAEzB,EAAE,OAAO,IAAI,CAAC;;CAEd,EAAE;;CAEF,CAAC,MAAM,EAAE,WAAW,GAAG,GAAG;;CAE1B,EAAE,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;;CAElE,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,qBAAqB,EAAE,QAAQ,GAAG;;CAE3C,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;CAC1B,CAAC,IAAI,CAAC,MAAM,GAAG,kCAAkC,EAAE,CAAC;;CAEpD,CAAC;;CAED,qBAAqB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CACtE,qBAAqB,CAAC,SAAS,CAAC,WAAW,GAAG,qBAAqB,CAAC;;CAEpE,qBAAqB,CAAC,SAAS,CAAC,uBAAuB,GAAG,IAAI,CAAC;;CAE/D;CACA;CACA;CACA;;CAEA,SAAS,mBAAmB,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,GAAG;;CAE7D,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;;CAEtB,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,IAAI,KAAK,SAAS,KAAK,IAAI,GAAG,CAAC,CAAC;;CAE/C,CAAC,IAAI,KAAK,GAAG,EAAE,GAAG,KAAK,SAAS,KAAK,GAAG,GAAG,QAAQ,CAAC;;CAEpD,CAAC,IAAI,KAAK,GAAG,EAAE,SAAS,KAAK,SAAS,KAAK,SAAS,GAAG,CAAC,CAAC;;CAEzD;;CAEA,CAAC,IAAI,QAAQ,GAAG,CAAC,CAAC;;CAElB,CAAC,IAAI,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;;CAExC,CAAC,KAAK,WAAW,IAAI,WAAW,CAAC,UAAU,GAAG;;CAE9C,EAAE,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;;CAE1C,EAAE,MAAM,KAAK,WAAW,IAAI,WAAW,CAAC,gBAAgB,GAAG;;CAE3D,EAAE,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC;;CAEjD,EAAE;;CAEF;;CAEA,CAAC,IAAI,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;;CAErC,CAAC,IAAI,SAAS,GAAG,IAAI,sBAAsB,EAAE,QAAQ,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEnE,CAAC,QAAQ,CAAC,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;;CAEhD,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,iBAAiB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;;CAElG;;CAEA,CAAC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;;CAE/B,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;;CAEf,CAAC;;CAED,mBAAmB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC;CACxE,mBAAmB,CAAC,SAAS,CAAC,WAAW,GAAG,mBAAmB,CAAC;;CAEhE,mBAAmB,CAAC,SAAS,CAAC,MAAM,KAAK,YAAY;;CAErD,CAAC,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CACxB,CAAC,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CACxB,CAAC,IAAI,YAAY,GAAG,IAAI,OAAO,EAAE,CAAC;;CAElC,CAAC,OAAO,SAAS,MAAM,GAAG;;CAE1B,EAAE,IAAI,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;;CAE/B,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;;CAExC,EAAE,YAAY,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;;CAE1D,EAAE,IAAI,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;;CAE5C,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;;CAEnD;;CAEA,EAAE,IAAI,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;;CAEzC,EAAE,KAAK,WAAW,IAAI,WAAW,CAAC,UAAU,GAAG;;CAE/C,GAAG,IAAI,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;;CAEvC,GAAG,IAAI,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;;CAEjC,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC;;CAEf,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEpD,IAAI,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;;CAE1B,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEpE,KAAK,IAAI,MAAM,GAAG,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;;CAEhD,KAAK,IAAI,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC;;CAE1C,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC;;CAEnD,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC,SAAS,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC;;CAEtG,KAAK,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;;CAE9C,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;;CAEnB,KAAK,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;;CAE9C,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;;CAEnB,KAAK;;CAEL,IAAI;;CAEJ,GAAG,MAAM,KAAK,WAAW,IAAI,WAAW,CAAC,gBAAgB,GAAG;;CAE5D,GAAG,IAAI,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC;;CAEhD,GAAG,IAAI,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC;;CAE/C,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC;;CAEf;;CAEA,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;CAEtD,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC;;CAE/F,IAAI,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEtE,IAAI,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC,SAAS,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC;;CAEtF,IAAI,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;;CAE7C,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;;CAElB,IAAI,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;;CAE7C,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;;CAElB,IAAI;;CAEJ,GAAG;;CAEH,EAAE,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;;CAE9B,EAAE,CAAC;;CAEH,CAAC,EAAE,EAAE,CAAC;;CAEN;CACA;CACA;CACA;CACA;;CAEA,SAAS,eAAe,EAAE,KAAK,EAAE,KAAK,GAAG;;CAEzC,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;CACpB,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;;CAEhC,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC;CACjC,CAAC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;;CAE/B,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;;CAEpB,CAAC,IAAI,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;;CAErC,CAAC,IAAI,SAAS,GAAG;CACjB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;CACnB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;CACnB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CACpB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;CACnB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;CACrB,EAAE,CAAC;;CAEH,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG;;CAErD,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;CACnC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;;CAEnC,EAAE,SAAS,CAAC,IAAI;CAChB,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;CACpC,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;CACpC,GAAG,CAAC;;CAEJ,EAAE;;CAEF,CAAC,QAAQ,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,sBAAsB,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEjF,CAAC,IAAI,QAAQ,GAAG,IAAI,iBAAiB,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC;;CAExD,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;CACpD,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;;CAEf,CAAC;;CAED,eAAe,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CAChE,eAAe,CAAC,SAAS,CAAC,WAAW,GAAG,eAAe,CAAC;;CAExD,eAAe,CAAC,SAAS,CAAC,OAAO,GAAG,YAAY;;CAEhD,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;CAC9B,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;;CAE9B,CAAC,CAAC;;CAEF,eAAe,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY;;CAE/C,CAAC,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;CAC5B,CAAC,IAAI,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE7B,CAAC,OAAO,SAAS,MAAM,GAAG;;CAE1B,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;;CAEjC,EAAE,IAAI,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;CACpE,EAAE,IAAI,SAAS,GAAG,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;;CAE5D,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;;CAE1D,EAAE,MAAM,CAAC,qBAAqB,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;CACzD,EAAE,OAAO,CAAC,qBAAqB,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;;CAEjE,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC;;CAE5C,EAAE,KAAK,IAAI,CAAC,KAAK,KAAK,SAAS,GAAG;;CAElC,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;;CAE9C,GAAG,MAAM;;CAET,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;;CAErD,GAAG;;CAEH,EAAE,CAAC;;CAEH,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,WAAW,EAAE,MAAM,GAAG;;CAE/B,CAAC,IAAI,QAAQ,GAAG,EAAE,CAAC;;CAEnB,CAAC,KAAK,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG;;CAEhC,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE1B,EAAE;;CAEF,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAErD,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;;CAEvE,EAAE;;CAEF,CAAC,OAAO,QAAQ,CAAC;;CAEjB,CAAC;;CAED,SAAS,cAAc,EAAE,MAAM,GAAG;;CAElC,CAAC,IAAI,KAAK,GAAG,WAAW,EAAE,MAAM,EAAE,CAAC;;CAEnC,CAAC,IAAI,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;;CAErC,CAAC,IAAI,QAAQ,GAAG,EAAE,CAAC;CACnB,CAAC,IAAI,MAAM,GAAG,EAAE,CAAC;;CAEjB,CAAC,IAAI,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CACnC,CAAC,IAAI,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEnC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAE3C,EAAE,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;;CAExB,EAAE,KAAK,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG;;CAE3C,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC5B,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC5B,GAAG,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;CAC/C,GAAG,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAE/C,GAAG;;CAEH,EAAE;;CAEF,CAAC,QAAQ,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,sBAAsB,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;CAChF,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,sBAAsB,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE3E,CAAC,IAAI,QAAQ,GAAG,IAAI,iBAAiB,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC;;CAEhI,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;;CAE/C,CAAC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;CACpB,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;;CAEpB,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC;CAClC,CAAC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;;CAE/B,CAAC;;CAED,cAAc,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC;CACnE,cAAc,CAAC,SAAS,CAAC,WAAW,GAAG,cAAc,CAAC;;CAEtD,cAAc,CAAC,SAAS,CAAC,iBAAiB,GAAG,YAAY;;CAEzD,CAAC,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE5B,CAAC,IAAI,UAAU,GAAG,IAAI,OAAO,EAAE,CAAC;CAChC,CAAC,IAAI,cAAc,GAAG,IAAI,OAAO,EAAE,CAAC;;CAEpC,CAAC,OAAO,SAAS,iBAAiB,EAAE,KAAK,GAAG;;CAE5C,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;;CAEzB,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;CAC/B,EAAE,IAAI,QAAQ,GAAG,QAAQ,CAAC,YAAY,EAAE,UAAU,EAAE,CAAC;;CAErD,EAAE,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;;CAErD,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG;;CAEnD,GAAG,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;;CAEzB,GAAG,KAAK,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG;;CAE5C,IAAI,UAAU,CAAC,gBAAgB,EAAE,cAAc,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;CACpE,IAAI,MAAM,CAAC,qBAAqB,EAAE,UAAU,EAAE,CAAC;CAC/C,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAEvD,IAAI,UAAU,CAAC,gBAAgB,EAAE,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;CAC3E,IAAI,MAAM,CAAC,qBAAqB,EAAE,UAAU,EAAE,CAAC;CAC/C,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAE3D,IAAI,CAAC,IAAI,CAAC,CAAC;;CAEX,IAAI;;CAEJ,GAAG;;CAEH,EAAE,QAAQ,CAAC,YAAY,EAAE,UAAU,EAAE,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEzD,EAAE,QAAQ,CAAC,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;CAE3D,EAAE,CAAC;;CAEH,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;;CAEA,SAAS,gBAAgB,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,GAAG;;CAEtD,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;CACpB,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;;CAEhC,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;;CAEpB,CAAC,IAAI,QAAQ,GAAG,IAAI,oBAAoB,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC7D,CAAC,IAAI,QAAQ,GAAG,IAAI,iBAAiB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC;;CAEzE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;;CAEvC,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;CACtC,CAAC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;;CAE/B,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;;;CAGf;CACA;CACA;;CAEA;CACA;;CAEA;;CAEA;;CAEA;;CAEA;;CAEA;;CAEA;;CAEA;CACA;;CAEA,CAAC;;CAED,gBAAgB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;CAC7D,gBAAgB,CAAC,SAAS,CAAC,WAAW,GAAG,gBAAgB,CAAC;;CAE1D,gBAAgB,CAAC,SAAS,CAAC,OAAO,GAAG,YAAY;;CAEjD,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;CACzB,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;;CAEzB,CAAC,CAAC;;CAEF,gBAAgB,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY;;CAEhD,CAAC,KAAK,IAAI,CAAC,KAAK,KAAK,SAAS,GAAG;;CAEjC,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;;CAExC,EAAE,MAAM;;CAER,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;;CAE/C,EAAE;;CAEF;CACA;;CAEA;;CAEA;;CAEA;;CAEA;CACA;;CAEA;CACA;;CAEA,CAAC,CAAC;;CAEF;CACA;CACA;CACA;CACA;;CAEA,SAAS,mBAAmB,EAAE,KAAK,EAAE,KAAK,GAAG;;CAE7C,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;CACpB,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;;CAEhC,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC;CACjC,CAAC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;;CAE/B,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;;CAEpB,CAAC,IAAI,QAAQ,GAAG,IAAI,iBAAiB,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC;;CAExD,CAAC,IAAI,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;;CAErC,CAAC,QAAQ,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,eAAe,EAAE,IAAI,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE1F,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;CAC5C,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;;;CAGvB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;;CAEf,CAAC;;CAED,mBAAmB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CACpE,mBAAmB,CAAC,SAAS,CAAC,WAAW,GAAG,mBAAmB,CAAC;;CAEhE,mBAAmB,CAAC,SAAS,CAAC,OAAO,GAAG,YAAY;;CAEpD,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;CACvC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;;CAEvC,CAAC,CAAC;;CAEF,mBAAmB,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY;;CAEnD;;CAEA,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC;CACjC,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;;CAElC,CAAC,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;CACvD,CAAC,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;;CAE5B;;CAEA,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;CACpD,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;CAClD,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;CACpD,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;CACxD,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;;CAEvD,CAAC,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;;CAE7B,CAAC,KAAK,IAAI,CAAC,KAAK,KAAK,SAAS,GAAG;;CAEjC,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;;CAE7C,EAAE,MAAM;;CAER,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;;CAEpD,EAAE;;CAEF,CAAC,CAAC;;CAEF;CACA;CACA;CACA;CACA;;CAEA,SAAS,qBAAqB,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,GAAG;;CAErD,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;CACpB,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;;CAEhC,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC;CACjC,CAAC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;;CAE/B,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;;CAEpB,CAAC,IAAI,QAAQ,GAAG,IAAI,wBAAwB,EAAE,IAAI,EAAE,CAAC;CACrD,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC;;CAEnC,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,iBAAiB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC;CAC1E,CAAC,KAAK,IAAI,CAAC,KAAK,KAAK,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,GAAG,YAAY,CAAC;;CAE3E,CAAC,IAAI,QAAQ,GAAG,QAAQ,CAAC,YAAY,EAAE,UAAU,EAAE,CAAC;CACpD,CAAC,IAAI,MAAM,GAAG,IAAI,YAAY,EAAE,QAAQ,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;;CAErD,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,eAAe,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEpE,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;;CAEjD,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;;CAEf,CAAC;;CAED,qBAAqB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CACtE,qBAAqB,CAAC,SAAS,CAAC,WAAW,GAAG,qBAAqB,CAAC;;CAEpE,qBAAqB,CAAC,SAAS,CAAC,OAAO,GAAG,YAAY;;CAEtD,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;CACvC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;;CAEvC,CAAC,CAAC;;CAEF,qBAAqB,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY;;CAErD,CAAC,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;;CAE5B,CAAC,IAAI,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;CAC1B,CAAC,IAAI,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;;CAE1B,CAAC,OAAO,SAAS,MAAM,GAAG;;CAE1B,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;;CAEhC,EAAE,KAAK,IAAI,CAAC,KAAK,KAAK,SAAS,GAAG;;CAElC,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;;CAEzC,GAAG,MAAM;;CAET,GAAG,IAAI,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC;;CAEtD,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;CACnC,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;;CAEzC,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEpD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,MAAM,GAAG,MAAM,CAAC;;CAEpD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;;CAElD,IAAI;;CAEJ,GAAG,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;;CAE7B,GAAG;;CAEH,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,qBAAqB,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC;;CAEjF,EAAE,CAAC;;CAEH,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;;CAEA,SAAS,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG;;CAEvD,CAAC,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;CACnB,CAAC,SAAS,GAAG,SAAS,IAAI,EAAE,CAAC;CAC7B,CAAC,MAAM,GAAG,IAAI,KAAK,EAAE,MAAM,KAAK,SAAS,GAAG,MAAM,GAAG,QAAQ,EAAE,CAAC;CAChE,CAAC,MAAM,GAAG,IAAI,KAAK,EAAE,MAAM,KAAK,SAAS,GAAG,MAAM,GAAG,QAAQ,EAAE,CAAC;;CAEhE,CAAC,IAAI,MAAM,GAAG,SAAS,GAAG,CAAC,CAAC;CAC5B,CAAC,IAAI,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;CAC7B,CAAC,IAAI,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC;;CAEzB,CAAC,IAAI,QAAQ,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;;CAEhC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG;;CAE3E,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CACpD,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;;CAEpD,EAAE,IAAI,KAAK,GAAG,CAAC,KAAK,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;;CAE7C,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;CACrC,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;CACrC,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;CACrC,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;;CAErC,EAAE;;CAEF,CAAC,IAAI,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;CACrC,CAAC,QAAQ,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,sBAAsB,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;CAChF,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,sBAAsB,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE3E,CAAC,IAAI,QAAQ,GAAG,IAAI,iBAAiB,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,CAAC;;CAExE,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;;CAE/C,CAAC;;CAED,UAAU,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC;CAC/D,UAAU,CAAC,SAAS,CAAC,WAAW,GAAG,UAAU,CAAC;;CAE9C;CACA;CACA;CACA;CACA;;CAEA,SAAS,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG;;CAEhF,CAAC,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;CACvB,CAAC,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;CACzB,CAAC,OAAO,GAAG,OAAO,IAAI,CAAC,CAAC;CACxB,CAAC,SAAS,GAAG,SAAS,IAAI,EAAE,CAAC;CAC7B,CAAC,MAAM,GAAG,IAAI,KAAK,EAAE,MAAM,KAAK,SAAS,GAAG,MAAM,GAAG,QAAQ,EAAE,CAAC;CAChE,CAAC,MAAM,GAAG,IAAI,KAAK,EAAE,MAAM,KAAK,SAAS,GAAG,MAAM,GAAG,QAAQ,EAAE,CAAC;;CAEhE,CAAC,IAAI,QAAQ,GAAG,EAAE,CAAC;CACnB,CAAC,IAAI,MAAM,GAAG,EAAE,CAAC;;CAEjB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;CACV,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;;CAEvB;;CAEA,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC,GAAG,GAAG;;CAEnC,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,OAAO,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;;CAExC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC;CAC7B,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC;;CAE7B,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC3B,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE3B,EAAE,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,MAAM,GAAG,MAAM,CAAC;;CAEtC,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;CAC3C,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;;CAE3C,EAAE;;CAEF;;CAEA,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC,GAAG,GAAG;;CAEnC,EAAE,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,MAAM,GAAG,MAAM,CAAC;;CAEtC,EAAE,CAAC,GAAG,MAAM,KAAK,MAAM,GAAG,OAAO,GAAG,CAAC,EAAE,CAAC;;CAExC,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,GAAG;;CAErC;;CAEA,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,SAAS,OAAO,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;;CAE3C,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;CACzB,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;;CAEzB,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC5B,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;;CAE5C;;CAEA,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,SAAS,OAAO,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;;CAEnD,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;CACzB,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;;CAEzB,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC5B,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;;CAE5C,GAAG;;CAEH,EAAE;;CAEF,CAAC,IAAI,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;CACrC,CAAC,QAAQ,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,sBAAsB,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;CAChF,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,sBAAsB,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE3E,CAAC,IAAI,QAAQ,GAAG,IAAI,iBAAiB,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,CAAC;;CAExE,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;;CAE/C,CAAC;;CAED,eAAe,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC;CACpE,eAAe,CAAC,SAAS,CAAC,WAAW,GAAG,eAAe,CAAC;;CAExD;CACA;CACA;CACA;;CAEA,SAAS,iBAAiB,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,GAAG;;CAE3D;;CAEA,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;;CAEtB,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,IAAI,KAAK,SAAS,KAAK,IAAI,GAAG,CAAC,CAAC;;CAE/C,CAAC,IAAI,KAAK,GAAG,EAAE,GAAG,KAAK,SAAS,KAAK,GAAG,GAAG,QAAQ,CAAC;;CAEpD,CAAC,IAAI,KAAK,GAAG,EAAE,SAAS,KAAK,SAAS,KAAK,SAAS,GAAG,CAAC,CAAC;;CAEzD;;CAEA,CAAC,IAAI,QAAQ,GAAG,CAAC,CAAC;;CAElB,CAAC,IAAI,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;;CAExC,CAAC,KAAK,WAAW,IAAI,WAAW,CAAC,UAAU,GAAG;;CAE9C,EAAE,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC;;CAEtC,EAAE,MAAM;;CAER,EAAE,OAAO,CAAC,IAAI,EAAE,oGAAoG,EAAE,CAAC;;CAEvH,EAAE;;CAEF;;CAEA,CAAC,IAAI,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;;CAErC,CAAC,IAAI,SAAS,GAAG,IAAI,sBAAsB,EAAE,QAAQ,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEnE,CAAC,QAAQ,CAAC,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;;CAEhD,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,iBAAiB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;;CAElG;;CAEA,CAAC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;CAC/B,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;;CAEf,CAAC;;CAED,iBAAiB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC;CACtE,iBAAiB,CAAC,SAAS,CAAC,WAAW,GAAG,iBAAiB,CAAC;;CAE5D,iBAAiB,CAAC,SAAS,CAAC,MAAM,KAAK,YAAY;;CAEnD,CAAC,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CACxB,CAAC,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CACxB,CAAC,IAAI,YAAY,GAAG,IAAI,OAAO,EAAE,CAAC;;CAElC,CAAC,OAAO,SAAS,MAAM,GAAG;;CAE1B,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;;CAExC,EAAE,YAAY,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;;CAE1D,EAAE,IAAI,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;;CAE5C,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;;CAEnD;;CAEA,EAAE,IAAI,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;;CAEzC,EAAE,IAAI,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;;CAEtC,EAAE,IAAI,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;;CAEhC,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;;CAEd,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEnD,GAAG,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;;CAEzB,GAAG,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;CAE5B,GAAG,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE;CAChC,KAAK,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE;CAC9B,KAAK,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE;CAC9B,KAAK,YAAY,EAAE,CAAC,EAAE;CACtB,KAAK,YAAY,EAAE,WAAW,EAAE,CAAC;;CAEjC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC,SAAS,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC;;CAEpG,GAAG,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;;CAE5C,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;;CAEjB,GAAG,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;;CAE5C,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;;CAEjB,GAAG;;CAEH,EAAE,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;;CAE9B,EAAE,CAAC;;CAEH,CAAC,EAAE,EAAE,CAAC;;CAEN;CACA;CACA;CACA;CACA;;CAEA,SAAS,sBAAsB,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,GAAG;;CAEtD,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;CACpB,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;;CAEhC,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC;CACjC,CAAC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;;CAE/B,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;;CAEpB,CAAC,KAAK,IAAI,KAAK,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC;;CAEpC,CAAC,IAAI,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;CACrC,CAAC,QAAQ,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,sBAAsB,EAAE;CAChE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;CACjB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;CACf,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC;CACjB,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC;CACnB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;CACjB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEV,CAAC,IAAI,QAAQ,GAAG,IAAI,iBAAiB,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC;;CAExD,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;CAClD,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;;CAE7B,CAAC,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;CACjC,CAAC,QAAQ,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,sBAAsB,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE5F,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;CAClD,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;;CAE7B,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;;CAEf,CAAC;;CAED,sBAAsB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CACvE,sBAAsB,CAAC,SAAS,CAAC,WAAW,GAAG,sBAAsB,CAAC;;CAEtE,sBAAsB,CAAC,SAAS,CAAC,OAAO,GAAG,YAAY;;CAEvD,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;CACpC,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;CACpC,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;CACpC,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;;CAEpC,CAAC,CAAC;;CAEF,sBAAsB,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY;;CAEtD,CAAC,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CACxB,CAAC,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CACxB,CAAC,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;;CAExB,CAAC,OAAO,SAAS,MAAM,GAAG;;CAE1B,EAAE,EAAE,CAAC,qBAAqB,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;CACrD,EAAE,EAAE,CAAC,qBAAqB,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;CAC5D,EAAE,EAAE,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;;CAE1B,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC;;CAE/B,EAAE,KAAK,IAAI,CAAC,KAAK,KAAK,SAAS,GAAG;;CAElC,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;CACpD,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;;CAEpD,GAAG,MAAM;;CAET,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;CAC3D,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;;CAE3D,GAAG;;CAEH,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC;CAC/B,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC;;CAExC,EAAE,CAAC;;CAEH,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,SAAS,YAAY,EAAE,MAAM,GAAG;;CAEhC,CAAC,IAAI,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;CACrC,CAAC,IAAI,QAAQ,GAAG,IAAI,iBAAiB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,CAAC;;CAEvF,CAAC,IAAI,QAAQ,GAAG,EAAE,CAAC;CACnB,CAAC,IAAI,MAAM,GAAG,EAAE,CAAC;;CAEjB,CAAC,IAAI,QAAQ,GAAG,EAAE,CAAC;;CAEnB;;CAEA,CAAC,IAAI,YAAY,GAAG,IAAI,KAAK,EAAE,QAAQ,EAAE,CAAC;CAC1C,CAAC,IAAI,SAAS,GAAG,IAAI,KAAK,EAAE,QAAQ,EAAE,CAAC;CACvC,CAAC,IAAI,OAAO,GAAG,IAAI,KAAK,EAAE,QAAQ,EAAE,CAAC;CACrC,CAAC,IAAI,WAAW,GAAG,IAAI,KAAK,EAAE,QAAQ,EAAE,CAAC;CACzC,CAAC,IAAI,UAAU,GAAG,IAAI,KAAK,EAAE,QAAQ,EAAE,CAAC;;CAExC;;CAEA,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;CACrC,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;CACrC,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;CACrC,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;CAErC;;CAEA,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;CACrC,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;CACrC,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;CACrC,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;CAErC;;CAEA,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;CACrC,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;CACrC,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;CACrC,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;CAErC;;CAEA,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;CACjC,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;CACjC,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;CACjC,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;CAEjC;;CAEA,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;CAChC,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;CAChC,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;;CAEhC;;CAEA,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC;CAClC,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;;CAEjC;;CAEA,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;CACrC,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;;CAErC,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;CACrC,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;;CAErC,CAAC,SAAS,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,GAAG;;CAEjC,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;CACvB,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;;CAEvB,EAAE;;CAEF,CAAC,SAAS,QAAQ,EAAE,EAAE,EAAE,KAAK,GAAG;;CAEhC,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC3B,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;;CAE3C,EAAE,KAAK,QAAQ,EAAE,EAAE,EAAE,KAAK,SAAS,GAAG;;CAEtC,GAAG,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC;;CAEvB,GAAG;;CAEH,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;;CAErD,EAAE;;CAEF,CAAC,QAAQ,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,sBAAsB,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;CAChF,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,sBAAsB,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE3E,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;;CAE/C,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;CACtB,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,sBAAsB,GAAG,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE,CAAC;;CAEhF,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC;CAClC,CAAC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;;CAE/B,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;;CAE1B,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;;CAEf,CAAC;;CAED,YAAY,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC;CACjE,YAAY,CAAC,SAAS,CAAC,WAAW,GAAG,YAAY,CAAC;;CAElD,YAAY,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY;;CAE5C,CAAC,IAAI,QAAQ,EAAE,QAAQ,CAAC;;CAExB,CAAC,IAAI,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;CAC5B,CAAC,IAAI,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;;CAE3B,CAAC,SAAS,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;CAErC,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;;CAE5C,EAAE,IAAI,MAAM,GAAG,QAAQ,EAAE,KAAK,EAAE,CAAC;;CAEjC,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,IAAI,QAAQ,GAAG,QAAQ,CAAC,YAAY,EAAE,UAAU,EAAE,CAAC;;CAEtD,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAErD,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;;CAEjE,IAAI;;CAEJ,GAAG;;CAEH,EAAE;;CAEF,CAAC,OAAO,SAAS,MAAM,GAAG;;CAE1B,EAAE,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;CAC3B,EAAE,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;;CAE3B,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;;CAEnB;CACA;;CAEA,EAAE,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;;CAE/D;;CAEA,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;CAC7B,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE3B;;CAEA,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;CAClC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;CAChC,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;CAChC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;;CAE9B;;CAEA,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAChC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC9B,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC9B,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE5B;;CAEA,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;CAC1C,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;CAC5C,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;;CAElC;;CAEA,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC/B,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC7B,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC/B,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE7B,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;CACjC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;CAC/B,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;CACjC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;;CAE/B,EAAE,QAAQ,CAAC,YAAY,EAAE,UAAU,EAAE,CAAC,WAAW,GAAG,IAAI,CAAC;;CAEzD,EAAE,CAAC;;CAEH,CAAC,EAAE,CAAC;;CAEJ;CACA;CACA;CACA;;CAEA,SAAS,SAAS,EAAE,MAAM,EAAE,KAAK,GAAG;;CAEpC,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;;CAEtB,CAAC,KAAK,KAAK,KAAK,SAAS,GAAG,KAAK,GAAG,QAAQ,CAAC;;CAE7C,CAAC,IAAI,OAAO,GAAG,IAAI,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;CAC7G,CAAC,IAAI,SAAS,GAAG,IAAI,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;;CAE3C,CAAC,IAAI,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;CACrC,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,eAAe,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;CACxD,CAAC,QAAQ,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,eAAe,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE1E,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,iBAAiB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;;CAEhF,CAAC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;;CAE/B,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;;CAEf,CAAC;;CAED,SAAS,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC;CAC9D,SAAS,CAAC,SAAS,CAAC,WAAW,GAAG,SAAS,CAAC;;CAE5C,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,YAAY;;CAE3C,CAAC,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;;CAEtB,CAAC,OAAO,SAAS,MAAM,EAAE,MAAM,GAAG;;CAElC,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG;;CAE9B,GAAG,OAAO,CAAC,IAAI,EAAE,qDAAqD,EAAE,CAAC;;CAEzE,GAAG;;CAEH,EAAE,KAAK,IAAI,CAAC,MAAM,KAAK,SAAS,GAAG;;CAEnC,GAAG,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;CAEpC,GAAG;;CAEH,EAAE,KAAK,GAAG,CAAC,OAAO,EAAE,GAAG,OAAO;;CAE9B,EAAE,IAAI,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;CACpB,EAAE,IAAI,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;;CAEpB;CACA;CACA;CACA;CACA;;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;CACnD,EAAE,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;;CAE7B,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;CAC7D,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;CAC7D,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;CAC7D,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;CAC/D,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;CAChE,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;CAChE,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;CAChE,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;;CAEhE,EAAE,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;;CAE9B,EAAE,IAAI,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC;;CAExC,EAAE,CAAC;;CAEH,CAAC,IAAI,CAAC;;CAEN,SAAS,CAAC,SAAS,CAAC,aAAa,GAAG,WAAW,MAAM,GAAG;;CAExD,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;CACtB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;;CAEf,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF;CACA;CACA;;CAEA,SAAS,UAAU,EAAE,GAAG,EAAE,GAAG,GAAG;;CAEhC,CAAC,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;;CAE1B,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;;CAEhB,CAAC,IAAI,KAAK,GAAG,EAAE,GAAG,KAAK,SAAS,KAAK,GAAG,GAAG,QAAQ,CAAC;;CAEpD,CAAC,IAAI,OAAO,GAAG,IAAI,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE7G,CAAC,IAAI,SAAS,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;;CAEpH,CAAC,IAAI,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;;CAErC,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,eAAe,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;;CAExD,CAAC,QAAQ,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,sBAAsB,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEjF,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,iBAAiB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;;CAEhF,CAAC,IAAI,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC;;CAEvC,CAAC;;CAED,UAAU,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC;CAC/D,UAAU,CAAC,SAAS,CAAC,WAAW,GAAG,UAAU,CAAC;;CAE9C,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG,WAAW,KAAK,GAAG;;CAE5D,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;;CAEpB,CAAC,KAAK,GAAG,CAAC,OAAO,EAAE,GAAG,OAAO;;CAE7B,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;;CAEhC,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;;CAE3B,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC;;CAElC,CAAC,QAAQ,CAAC,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;CAE1D,CAAC,CAAC;;CAEF;CACA;CACA;;CAEA,SAAS,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,GAAG;;CAEzC,CAAC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;;CAE3B,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;;CAEpB,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,IAAI,KAAK,SAAS,KAAK,CAAC,GAAG,IAAI,CAAC;;CAE/C,CAAC,IAAI,KAAK,GAAG,EAAE,GAAG,KAAK,SAAS,KAAK,GAAG,GAAG,QAAQ,CAAC;;CAEpD,CAAC,IAAI,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE9H,CAAC,IAAI,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;CACrC,CAAC,QAAQ,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,sBAAsB,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;CACjF,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC;;CAElC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,iBAAiB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;;CAExE;;CAEA,CAAC,IAAI,UAAU,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAEvF,CAAC,IAAI,SAAS,GAAG,IAAI,cAAc,EAAE,CAAC;CACtC,CAAC,SAAS,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,sBAAsB,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;CACnF,CAAC,SAAS,CAAC,qBAAqB,EAAE,CAAC;;CAEnC,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,EAAE,SAAS,EAAE,IAAI,iBAAiB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC;;CAElI,CAAC;;CAED,WAAW,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;CACxD,WAAW,CAAC,SAAS,CAAC,WAAW,GAAG,WAAW,CAAC;;CAEhD,WAAW,CAAC,SAAS,CAAC,iBAAiB,GAAG,WAAW,KAAK,GAAG;;CAE7D,CAAC,IAAI,KAAK,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;;CAEnC,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC;;CAE9C,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;;CAE3D,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;;CAElC,CAAC,QAAQ,CAAC,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;CAE1D,CAAC,CAAC;;CAEF;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CAEA,IAAI,YAAY,CAAC;CACjB,IAAI,YAAY,CAAC;;CAEjB,SAAS,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,GAAG;;CAE1E;;CAEA,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;;CAEvB,CAAC,KAAK,KAAK,KAAK,SAAS,GAAG,KAAK,GAAG,QAAQ,CAAC;CAC7C,CAAC,KAAK,MAAM,KAAK,SAAS,GAAG,MAAM,GAAG,CAAC,CAAC;CACxC,CAAC,KAAK,UAAU,KAAK,SAAS,GAAG,UAAU,GAAG,GAAG,GAAG,MAAM,CAAC;CAC3D,CAAC,KAAK,SAAS,KAAK,SAAS,GAAG,SAAS,GAAG,GAAG,GAAG,UAAU,CAAC;;CAE7D,CAAC,KAAK,YAAY,KAAK,SAAS,GAAG;;CAEnC,EAAE,YAAY,GAAG,IAAI,cAAc,EAAE,CAAC;CACtC,EAAE,YAAY,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,sBAAsB,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;;CAEjG,EAAE,YAAY,GAAG,IAAI,sBAAsB,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC/D,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;;CAExC,EAAE;;CAEF,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;;CAE9B,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,EAAE,YAAY,EAAE,IAAI,iBAAiB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;CACjF,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;CACpC,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,EAAE,YAAY,EAAE,IAAI,iBAAiB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;CACjF,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;CACpC,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;;CAEvB,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC;CAC1B,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;;CAEjD,CAAC;;CAED,WAAW,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;CAC5D,WAAW,CAAC,SAAS,CAAC,WAAW,GAAG,WAAW,CAAC;;CAEhD,WAAW,CAAC,SAAS,CAAC,YAAY,KAAK,YAAY;;CAEnD,CAAC,IAAI,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;CAC1B,CAAC,IAAI,OAAO,CAAC;;CAEb,CAAC,OAAO,SAAS,YAAY,EAAE,GAAG,GAAG;;CAErC;;CAEA,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,OAAO,GAAG;;CAEzB,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAErC,GAAG,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,OAAO,GAAG;;CAElC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;CAErC,GAAG,MAAM;;CAET,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC;;CAE7C,GAAG,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;;CAEhC,GAAG,IAAI,CAAC,UAAU,CAAC,gBAAgB,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;;CAErD,GAAG;;CAEH,EAAE,CAAC;;CAEH,CAAC,EAAE,EAAE,CAAC;;CAEN,WAAW,CAAC,SAAS,CAAC,SAAS,GAAG,WAAW,MAAM,EAAE,UAAU,EAAE,SAAS,GAAG;;CAE7E,CAAC,KAAK,UAAU,KAAK,SAAS,GAAG,UAAU,GAAG,GAAG,GAAG,MAAM,CAAC;CAC3D,CAAC,KAAK,SAAS,KAAK,SAAS,GAAG,SAAS,GAAG,GAAG,GAAG,UAAU,CAAC;;CAE7D,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC;CACjE,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;;CAE1B,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;CACzD,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,CAAC;CAC/B,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;;CAE1B,CAAC,CAAC;;CAEF,WAAW,CAAC,SAAS,CAAC,QAAQ,GAAG,WAAW,KAAK,GAAG;;CAEpD,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;CACxC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;;CAExC,CAAC,CAAC;;CAEF;CACA;CACA;CACA;;CAEA,SAAS,UAAU,EAAE,IAAI,GAAG;;CAE5B,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC;;CAElB,CAAC,IAAI,QAAQ,GAAG;CAChB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;CACrB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;CACrB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI;CACrB,EAAE,CAAC;;CAEH,CAAC,IAAI,MAAM,GAAG;CACd,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;CACpB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;CACpB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;CACpB,EAAE,CAAC;;CAEH,CAAC,IAAI,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;CACrC,CAAC,QAAQ,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,sBAAsB,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;CAChF,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,sBAAsB,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;;CAE3E,CAAC,IAAI,QAAQ,GAAG,IAAI,iBAAiB,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,CAAC;;CAExE,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;;CAE/C,CAAC;;CAED,UAAU,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC;CAC/D,UAAU,CAAC,SAAS,CAAC,WAAW,GAAG,UAAU,CAAC;AAC9C,AA+JA;CACA;;CAEA,KAAK,CAAC,MAAM,GAAG,WAAW,SAAS,EAAE,QAAQ,GAAG;;CAEhD,CAAC,OAAO,CAAC,GAAG,EAAE,0CAA0C,EAAE,CAAC;;CAE3D,CAAC,SAAS,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;CACxD,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,GAAG,SAAS,CAAC;CAC7C,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,GAAG,QAAQ,CAAC;;CAEzC,CAAC,OAAO,SAAS,CAAC;;CAElB,CAAC,CAAC;;CAEF;;CAEA,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE;;CAEpC,CAAC,oBAAoB,EAAE,WAAW,SAAS,GAAG;;CAE9C,EAAE,OAAO,CAAC,IAAI,EAAE,sHAAsH,EAAE,CAAC;;CAEzI;;CAEA,EAAE,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC;CACxC,EAAE,OAAO,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC;;CAEpC,EAAE;;CAEF,CAAC,0BAA0B,EAAE,WAAW,SAAS,GAAG;;CAEpD,EAAE,OAAO,CAAC,IAAI,EAAE,4HAA4H,EAAE,CAAC;;CAE/I;;CAEA,EAAE,IAAI,GAAG,GAAG,IAAI,CAAC,eAAe,EAAE,SAAS,EAAE,CAAC;CAC9C,EAAE,OAAO,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC;;CAEpC,EAAE;;CAEF,CAAC,cAAc,EAAE,WAAW,MAAM,GAAG;;CAErC,EAAE,OAAO,CAAC,IAAI,EAAE,gHAAgH,EAAE,CAAC;;CAEnI,EAAE,IAAI,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;;CAEhC,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;CAEpD,GAAG,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC;CAC3B,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;;CAE3E,GAAG;;CAEH,EAAE,OAAO,QAAQ,CAAC;;CAElB,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;;CAEA,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE;;CAE/B,CAAC,UAAU,EAAE,WAAW,MAAM,GAAG;;CAEjC,EAAE,OAAO,CAAC,IAAI,EAAE,iEAAiE,EAAE,CAAC;CACpF,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC;;CAE/B,EAAE;;CAEF,CAAC,EAAE,CAAC;AACJ,AA2BA;CACA;;CAEA,SAAS,MAAM,EAAE,MAAM,GAAG;;CAE1B,CAAC,OAAO,CAAC,IAAI,EAAE,oEAAoE,EAAE,CAAC;;CAEtF,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;CACvC,CAAC,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;;CAE1B,CAAC;;CAED,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,SAAS,EAAE,CAAC;;CAE/D,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE;;CAEjC,CAAC,aAAa,EAAE,qBAAqB;;CAErC,EAAE,OAAO,CAAC,KAAK,EAAE,kDAAkD,EAAE,CAAC;;CAEtE,EAAE;CACF,CAAC,qBAAqB,EAAE,kCAAkC;;CAE1D,EAAE,OAAO,CAAC,KAAK,EAAE,0DAA0D,EAAE,CAAC;;CAE9E,EAAE;CACF,CAAC,wBAAwB,EAAE,gCAAgC;;CAE3D,EAAE,OAAO,CAAC,KAAK,EAAE,6DAA6D,EAAE,CAAC;;CAEjF,EAAE;;CAEF,CAAC,EAAE,CAAC;AACJ,AAuBA;CACA,UAAU,CAAC,SAAS,CAAC,SAAS,GAAG,YAAY;;CAE7C,CAAC,OAAO,CAAC,KAAK,EAAE,0FAA0F,EAAE,CAAC;;CAE7G,CAAC,CAAC;;CAEF,cAAc,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY;;CAE9C,CAAC,OAAO,CAAC,KAAK,EAAE,8DAA8D,EAAE,CAAC;;CAEjF,CAAC,CAAC;AACF,AAOA;CACA;;CAEA,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE;;CAEjC,CAAC,cAAc,EAAE,WAAW,GAAG,GAAG;;CAElC,EAAE,OAAO,CAAC,IAAI,EAAE,sGAAsG,EAAE,CAAC;CACzH,EAAE,OAAO,WAAW,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC;;CAE3C,EAAE;;CAEF,CAAC,EAAE,CAAC;AACJ,AAcA;CACA;;CAEA,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE;;CAE/B,CAAC,MAAM,EAAE,WAAW,cAAc,GAAG;;CAErC,EAAE,OAAO,CAAC,IAAI,EAAE,yDAAyD,EAAE,CAAC;CAC5E,EAAE,OAAO,IAAI,CAAC,SAAS,EAAE,cAAc,EAAE,CAAC;;CAE1C,EAAE;CACF,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,CAAC,IAAI,EAAE,sDAAsD,EAAE,CAAC;CACzE,EAAE,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;;CAExB,EAAE;CACF,CAAC,iBAAiB,EAAE,WAAW,GAAG,GAAG;;CAErC,EAAE,OAAO,CAAC,IAAI,EAAE,wEAAwE,EAAE,CAAC;CAC3F,EAAE,OAAO,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC;;CAEnC,EAAE;CACF,CAAC,IAAI,EAAE,WAAW,cAAc,GAAG;;CAEnC,EAAE,OAAO,CAAC,IAAI,EAAE,qDAAqD,EAAE,CAAC;CACxE,EAAE,OAAO,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC;;CAExC,EAAE;CACF,CAAC,EAAE,CAAC;;CAEJ,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE;;CAE/B,CAAC,MAAM,EAAE,WAAW,cAAc,GAAG;;CAErC,EAAE,OAAO,CAAC,IAAI,EAAE,yDAAyD,EAAE,CAAC;CAC5E,EAAE,OAAO,IAAI,CAAC,SAAS,EAAE,cAAc,EAAE,CAAC;;CAE1C,EAAE;CACF,CAAC,KAAK,EAAE,YAAY;;CAEpB,EAAE,OAAO,CAAC,IAAI,EAAE,sDAAsD,EAAE,CAAC;CACzE,EAAE,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;;CAExB,EAAE;CACF,CAAC,iBAAiB,EAAE,WAAW,GAAG,GAAG;;CAErC,EAAE,OAAO,CAAC,IAAI,EAAE,wEAAwE,EAAE,CAAC;CAC3F,EAAE,OAAO,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC;;CAEnC,EAAE;CACF,CAAC,oBAAoB,EAAE,WAAW,MAAM,GAAG;;CAE3C,EAAE,OAAO,CAAC,IAAI,EAAE,8EAA8E,EAAE,CAAC;CACjG,EAAE,OAAO,IAAI,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAC;;CAEzC,EAAE;CACF,CAAC,IAAI,EAAE,WAAW,cAAc,GAAG;;CAEnC,EAAE,OAAO,CAAC,IAAI,EAAE,qDAAqD,EAAE,CAAC;CACxE,EAAE,OAAO,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC;;CAExC,EAAE;CACF,CAAC,EAAE,CAAC;;CAEJ,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,WAAW,cAAc,GAAG;;CAErD,CAAC,OAAO,CAAC,IAAI,EAAE,0DAA0D,EAAE,CAAC;CAC5E,CAAC,OAAO,IAAI,CAAC,SAAS,EAAE,cAAc,EAAE,CAAC;;CAEzC,CAAC,CAAC;;CAEF,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE;;CAEtB,CAAC,QAAQ,EAAE,YAAY;;CAEvB,EAAE,OAAO,CAAC,IAAI,EAAE,yEAAyE,EAAE,CAAC;CAC5F,EAAE,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;;CAEvB,EAAE;;CAEF,CAAC,iBAAiB,EAAE,WAAW,KAAK,GAAG;;CAEvC,EAAE,OAAO,CAAC,IAAI,EAAE,0EAA0E,EAAE,CAAC;CAC7F,EAAE,OAAO,KAAK,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC;;CAExC,EAAE;;CAEF,CAAC,cAAc,EAAE,WAAW,KAAK,GAAG;;CAEpC,EAAE,OAAO,CAAC,IAAI,EAAE,sEAAsE,EAAE,CAAC;CACzF,EAAE,OAAO,KAAK,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC;;CAEvC,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE;;CAElC,CAAC,oBAAoB,EAAE,WAAW,KAAK,EAAE,MAAM,GAAG;;CAElD,EAAE,OAAO,CAAC,IAAI,EAAE,qFAAqF,EAAE,CAAC;CACxG,EAAE,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;;CAEvC,EAAE;CACF,CAAC,eAAe,EAAE,WAAW,MAAM,GAAG;;CAEtC,EAAE,OAAO,CAAC,IAAI,EAAE,gGAAgG,EAAE,CAAC;CACnH,EAAE,OAAO,MAAM,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;;CAErC,EAAE;CACF,CAAC,oBAAoB,EAAE,qBAAqB;;CAE5C,EAAE,OAAO,CAAC,KAAK,EAAE,0DAA0D,EAAE,CAAC;;CAE9E,EAAE;CACF,CAAC,aAAa,EAAE,WAAW,MAAM,yBAAyB;;CAE1D,EAAE,OAAO,CAAC,IAAI,EAAE,2GAA2G,EAAE,CAAC;CAC9H,EAAE,OAAO,IAAI,CAAC,sBAAsB,EAAE,MAAM,EAAE,CAAC;;CAE/C,EAAE;CACF,CAAC,mBAAmB,EAAE,yCAAyC;;CAE/D,EAAE,OAAO,CAAC,KAAK,EAAE,yDAAyD,EAAE,CAAC;;CAE7E,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE;;CAElC,CAAC,eAAe,EAAE,WAAW,CAAC,GAAG;;CAEjC,EAAE,OAAO,CAAC,IAAI,EAAE,wEAAwE,EAAE,CAAC;CAC3F,EAAE,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC;;CAEhC,EAAE;CACF,CAAC,oBAAoB,EAAE,WAAW,KAAK,EAAE,MAAM,GAAG;;CAElD,EAAE,OAAO,CAAC,IAAI,EAAE,qFAAqF,EAAE,CAAC;CACxG,EAAE,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;;CAEvC,EAAE;CACF,CAAC,WAAW,EAAE,YAAY;;CAE1B,EAAE,IAAI,EAAE,CAAC;;CAET,EAAE,OAAO,SAAS,WAAW,GAAG;;CAEhC,GAAG,KAAK,EAAE,KAAK,SAAS,GAAG,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;CAC9C,GAAG,OAAO,CAAC,IAAI,EAAE,sGAAsG,EAAE,CAAC;CAC1H,GAAG,OAAO,EAAE,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;;CAE5C,GAAG,CAAC;;CAEJ,EAAE,EAAE;CACJ,CAAC,yBAAyB,EAAE,WAAW,CAAC,GAAG;;CAE3C,EAAE,OAAO,CAAC,IAAI,EAAE,gGAAgG,EAAE,CAAC;CACnH,EAAE,OAAO,IAAI,CAAC,0BAA0B,EAAE,CAAC,EAAE,CAAC;;CAE9C,EAAE;CACF,CAAC,eAAe,EAAE,YAAY;;CAE9B,EAAE,OAAO,CAAC,IAAI,EAAE,qDAAqD,EAAE,CAAC;;CAExE,EAAE;CACF,CAAC,eAAe,EAAE,WAAW,MAAM,GAAG;;CAEtC,EAAE,OAAO,CAAC,IAAI,EAAE,gGAAgG,EAAE,CAAC;CACnH,EAAE,OAAO,MAAM,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;;CAErC,EAAE;CACF,CAAC,eAAe,EAAE,WAAW,MAAM,GAAG;;CAEtC,EAAE,OAAO,CAAC,IAAI,EAAE,gGAAgG,EAAE,CAAC;CACnH,EAAE,OAAO,MAAM,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;;CAErC,EAAE;CACF,CAAC,oBAAoB,EAAE,qBAAqB;;CAE5C,EAAE,OAAO,CAAC,KAAK,EAAE,0DAA0D,EAAE,CAAC;;CAE9E,EAAE;CACF,CAAC,UAAU,EAAE,WAAW,CAAC,GAAG;;CAE5B,EAAE,OAAO,CAAC,IAAI,EAAE,kGAAkG,EAAE,CAAC;CACrH,EAAE,CAAC,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC;;CAE/B,EAAE;CACF,CAAC,WAAW,EAAE,WAAW,MAAM,GAAG;;CAElC,EAAE,OAAO,CAAC,IAAI,EAAE,4FAA4F,EAAE,CAAC;CAC/G,EAAE,OAAO,MAAM,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;;CAErC,EAAE;CACF,CAAC,SAAS,EAAE,YAAY;;CAExB,EAAE,OAAO,CAAC,KAAK,EAAE,+CAA+C,EAAE,CAAC;;CAEnE,EAAE;CACF,CAAC,OAAO,EAAE,YAAY;;CAEtB,EAAE,OAAO,CAAC,KAAK,EAAE,6CAA6C,EAAE,CAAC;;CAEjE,EAAE;CACF,CAAC,OAAO,EAAE,YAAY;;CAEtB,EAAE,OAAO,CAAC,KAAK,EAAE,6CAA6C,EAAE,CAAC;;CAEjE,EAAE;CACF,CAAC,OAAO,EAAE,YAAY;;CAEtB,EAAE,OAAO,CAAC,KAAK,EAAE,6CAA6C,EAAE,CAAC;;CAEjE,EAAE;CACF,CAAC,YAAY,EAAE,YAAY;;CAE3B,EAAE,OAAO,CAAC,KAAK,EAAE,kDAAkD,EAAE,CAAC;;CAEtE,EAAE;CACF,CAAC,aAAa,EAAE,WAAW,MAAM,yBAAyB;;CAE1D,EAAE,OAAO,CAAC,IAAI,EAAE,2GAA2G,EAAE,CAAC;CAC9H,EAAE,OAAO,IAAI,CAAC,sBAAsB,EAAE,MAAM,EAAE,CAAC;;CAE/C,EAAE;CACF,CAAC,mBAAmB,EAAE,yCAAyC;;CAE/D,EAAE,OAAO,CAAC,KAAK,EAAE,yDAAyD,EAAE,CAAC;;CAE7E,EAAE;CACF,CAAC,WAAW,EAAE,WAAW,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG;;CAE/D,EAAE,OAAO,CAAC,IAAI,EAAE,sHAAsH,EAAE,CAAC;CACzI,EAAE,OAAO,IAAI,CAAC,eAAe,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;;CAErE,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,KAAK,CAAC,SAAS,CAAC,kBAAkB,GAAG,WAAW,IAAI,GAAG;;CAEvD,CAAC,OAAO,CAAC,IAAI,EAAE,2EAA2E,EAAE,CAAC;CAC7F,CAAC,OAAO,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;;CAEpC,CAAC,CAAC;;CAEF,UAAU,CAAC,SAAS,CAAC,eAAe,GAAG,WAAW,MAAM,GAAG;;CAE3D,CAAC,OAAO,CAAC,IAAI,EAAE,iHAAiH,EAAE,CAAC;CACnI,CAAC,OAAO,MAAM,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;;CAEvC,CAAC,CAAC;;CAEF,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,EAAE;;CAE9B,CAAC,iBAAiB,EAAE,WAAW,GAAG,GAAG;;CAErC,EAAE,OAAO,CAAC,IAAI,EAAE,uEAAuE,EAAE,CAAC;CAC1F,EAAE,OAAO,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC;;CAEnC,EAAE;CACF,CAAC,mBAAmB,EAAE,WAAW,KAAK,GAAG;;CAEzC,EAAE,OAAO,CAAC,IAAI,EAAE,2EAA2E,EAAE,CAAC;CAC9F,EAAE,OAAO,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC;;CAEvC,EAAE;CACF,CAAC,oBAAoB,EAAE,WAAW,MAAM,GAAG;;CAE3C,EAAE,OAAO,CAAC,IAAI,EAAE,6EAA6E,EAAE,CAAC;CAChG,EAAE,OAAO,IAAI,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAC;;CAEzC,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE;;CAEnC,CAAC,IAAI,EAAE,YAAY;;CAEnB,EAAE,OAAO,CAAC,IAAI,EAAE,yDAAyD,EAAE,CAAC;CAC5E,EAAE,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;;CAExB,EAAE;CACF,CAAC,kBAAkB,EAAE,WAAW,KAAK,EAAE,MAAM,GAAG;;CAEhD,EAAE,OAAO,CAAC,IAAI,EAAE,4EAA4E,EAAE,CAAC;CAC/F,EAAE,OAAO,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;;CAE5C,EAAE;CACF,CAAC,QAAQ,EAAE,WAAW,MAAM,GAAG;;CAE/B,EAAE,OAAO,CAAC,IAAI,EAAE,iEAAiE,EAAE,CAAC;CACpF,EAAE,OAAO,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;;CAEpC,EAAE;CACF,CAAC,MAAM,EAAE,WAAW,MAAM,GAAG;;CAE7B,EAAE,OAAO,CAAC,IAAI,EAAE,6DAA6D,EAAE,CAAC;CAChF,EAAE,OAAO,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;;CAElC,EAAE;CACF,CAAC,KAAK,EAAE,WAAW,MAAM,GAAG;;CAE5B,EAAE,OAAO,CAAC,IAAI,EAAE,2DAA2D,EAAE,CAAC;CAC9E,EAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;;CAEjC,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE;;CAEzB,CAAC,kBAAkB,EAAE,WAAW,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG;;CAEzD,EAAE,OAAO,CAAC,IAAI,EAAE,4EAA4E,EAAE,CAAC;CAC/F,EAAE,OAAO,QAAQ,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;;CAEzD,EAAE;CACF,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG;;CAEtC,EAAE,OAAO,CAAC,IAAI,EAAE,6DAA6D,EAAE,CAAC;CAChF,EAAE,OAAO,QAAQ,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;;CAE/C,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE;;CAEhC,CAAC,gBAAgB,EAAE,WAAW,SAAS,GAAG;;CAE1C,EAAE,OAAO,CAAC,IAAI,EAAE,kFAAkF,EAAE,CAAC;CACrG,EAAE,OAAO,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,CAAC;;CAEzC,EAAE;CACF,CAAC,OAAO,EAAE,WAAW,OAAO,GAAG;;CAE/B,EAAE,OAAO,CAAC,IAAI,EAAE,0EAA0E,EAAE,CAAC;CAC7F,EAAE,OAAO,IAAI,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;;CAE9C,EAAE;CACF,CAAC,YAAY,EAAE,WAAW,OAAO,GAAG;;CAEpC,EAAE,OAAO,CAAC,IAAI,EAAE,6EAA6E,EAAE,CAAC;CAChG,EAAE,OAAO,IAAI,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;;CAE5C,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE;;CAElC,CAAC,aAAa,EAAE,WAAW,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG;;CAEtD,EAAE,OAAO,CAAC,IAAI,EAAE,6EAA6E,EAAE,CAAC;CAChG,EAAE,OAAO,IAAI,CAAC,mBAAmB,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;;CAE9D,EAAE;CACF,CAAC,mBAAmB,EAAE,WAAW,CAAC,GAAG;;CAErC,EAAE,OAAO,CAAC,IAAI,EAAE,mFAAmF,EAAE,CAAC;CACtG,EAAE,OAAO,IAAI,CAAC,mBAAmB,EAAE,CAAC,EAAE,CAAC;;CAEvC,EAAE;CACF,CAAC,eAAe,EAAE,YAAY;;CAE9B,EAAE,OAAO,CAAC,IAAI,EAAE,2EAA2E,EAAE,CAAC;CAC9F,EAAE,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC;;CAEhC,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE;;CAElC,CAAC,0BAA0B,EAAE,YAAY;;CAEzC,EAAE,OAAO,CAAC,KAAK,EAAE,2GAA2G,EAAE,CAAC;;CAE/H,EAAE;CACF,CAAC,sBAAsB,EAAE,YAAY;;CAErC,EAAE,OAAO,CAAC,KAAK,EAAE,mGAAmG,EAAE,CAAC;;CAEvH,EAAE;CACF,CAAC,qBAAqB,EAAE,WAAW,CAAC,GAAG;;CAEvC,EAAE,OAAO,CAAC,IAAI,EAAE,uFAAuF,EAAE,CAAC;CAC1G,EAAE,OAAO,IAAI,CAAC,qBAAqB,EAAE,CAAC,EAAE,CAAC;;CAEzC,EAAE;CACF,CAAC,kBAAkB,EAAE,WAAW,CAAC,GAAG;;CAEpC,EAAE,OAAO,CAAC,IAAI,EAAE,iFAAiF,EAAE,CAAC;CACpG,EAAE,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC;;CAEtC,EAAE;CACF,CAAC,mBAAmB,EAAE,WAAW,KAAK,EAAE,MAAM,GAAG;;CAEjD,EAAE,OAAO,CAAC,IAAI,EAAE,mFAAmF,EAAE,CAAC;CACtG,EAAE,OAAO,IAAI,CAAC,mBAAmB,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;;CAEnD,EAAE;CACF,CAAC,eAAe,EAAE,WAAW,CAAC,GAAG;;CAEjC,EAAE,OAAO,CAAC,IAAI,EAAE,qFAAqF,EAAE,CAAC;CACxG,EAAE,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC;;CAEhC,EAAE;CACF,CAAC,aAAa,EAAE,WAAW,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG;;CAEtD,EAAE,OAAO,CAAC,IAAI,EAAE,6EAA6E,EAAE,CAAC;CAChG,EAAE,OAAO,IAAI,CAAC,mBAAmB,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;;CAE9D,EAAE;CACF,CAAC,mBAAmB,EAAE,WAAW,CAAC,GAAG;;CAErC,EAAE,OAAO,CAAC,IAAI,EAAE,mFAAmF,EAAE,CAAC;CACtG,EAAE,OAAO,IAAI,CAAC,mBAAmB,EAAE,CAAC,EAAE,CAAC;;CAEvC,EAAE;CACF,CAAC,eAAe,EAAE,YAAY;;CAE9B,EAAE,OAAO,CAAC,IAAI,EAAE,2EAA2E,EAAE,CAAC;CAC9F,EAAE,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC;;CAEhC,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE;;CAElC,CAAC,aAAa,EAAE,WAAW,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG;;CAEtD,EAAE,OAAO,CAAC,IAAI,EAAE,6EAA6E,EAAE,CAAC;CAChG,EAAE,OAAO,IAAI,CAAC,mBAAmB,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;;CAE9D,EAAE;CACF,CAAC,eAAe,EAAE,YAAY;;CAE9B,EAAE,OAAO,CAAC,IAAI,EAAE,2EAA2E,EAAE,CAAC;CAC9F,EAAE,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC;;CAEhC,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;;CAEA,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE;;CAEnC,CAAC,eAAe,EAAE,YAAY;;CAE9B,EAAE,OAAO,CAAC,KAAK,EAAE,sDAAsD,EAAE,CAAC;;CAE1E,EAAE;CACF,CAAC,oBAAoB,EAAE,YAAY;;CAEnC,EAAE,OAAO,CAAC,KAAK,EAAE,0GAA0G,EAAE,CAAC;;CAE9H,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE;;CAEnC,CAAC,cAAc,EAAE,WAAW,IAAI,GAAG;;CAEnC,EAAE,OAAO,CAAC,IAAI,EAAE,2EAA2E,EAAE,CAAC;CAC9F,EAAE,OAAO,IAAI,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;;CAEtC,EAAE;CACF,CAAC,WAAW,EAAE,YAAY;;CAE1B,EAAE,OAAO,CAAC,IAAI,EAAE,2EAA2E,EAAE,CAAC;;CAE9F,EAAE;CACF,CAAC,SAAS,EAAE,WAAW,QAAQ,EAAE,IAAI,GAAG;;CAExC,EAAE,OAAO,CAAC,IAAI,EAAE,gGAAgG,EAAE,CAAC;CACnH,EAAE,OAAO,IAAI,CAAC,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;;CAEhD,EAAE;CACF,CAAC,gBAAgB,EAAE,YAAY;;CAE/B,EAAE,OAAO,CAAC,KAAK,EAAE,gHAAgH,EAAE,CAAC;;CAEpI,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,MAAM,CAAC,gBAAgB,EAAE,QAAQ,CAAC,SAAS,EAAE;;CAE7C,CAAC,UAAU,EAAE;CACb,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,qDAAqD,EAAE,CAAC;CACzE,GAAG,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;;CAE9B,GAAG;CACH,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,OAAO,CAAC,IAAI,EAAE,qDAAqD,EAAE,CAAC;CACzE,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;;CAE/B,GAAG;CACH,EAAE;CACF,CAAC,aAAa,EAAE;CAChB,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,+FAA+F,EAAE,CAAC;;CAEnH,GAAG;CACH,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,+FAA+F,EAAE,CAAC;;CAEnH,GAAG;CACH,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,MAAM,CAAC,gBAAgB,EAAE,GAAG,CAAC,SAAS,EAAE;;CAExC,CAAC,OAAO,EAAE;CACV,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,kDAAkD,EAAE,CAAC;CACtE,GAAG,OAAO,IAAI,CAAC,MAAM,CAAC;;CAEtB,GAAG;CACH,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,MAAM,CAAC,cAAc,EAAE,QAAQ,CAAC,SAAS,EAAE,kBAAkB,EAAE;;CAE/D,CAAC,GAAG,EAAE,YAAY;;CAElB,EAAE,OAAO,CAAC,IAAI,EAAE,oDAAoD,EAAE,CAAC;;CAEvE,EAAE;CACF,CAAC,GAAG,EAAE,YAAY;;CAElB,EAAE,OAAO,CAAC,IAAI,EAAE,oDAAoD,EAAE,CAAC;;CAEvE,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,MAAM,CAAC,cAAc,EAAE,KAAK,CAAC,SAAS,EAAE,sBAAsB,EAAE;;CAEhE,CAAC,GAAG,EAAE,YAAY;;CAElB,EAAE,OAAO,CAAC,IAAI,EAAE,gEAAgE,EAAE,CAAC;CACnF,EAAE,OAAO,IAAI,CAAC,kBAAkB,CAAC;;CAEjC,EAAE;CACF,CAAC,GAAG,EAAE,WAAW,KAAK,GAAG;;CAEzB,EAAE,OAAO,CAAC,IAAI,EAAE,gEAAgE,EAAE,CAAC;CACnF,EAAE,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;;CAElC,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;;CAEA,iBAAiB,CAAC,SAAS,CAAC,OAAO,GAAG,WAAW,WAAW,EAAE,SAAS,GAAG;;CAE1E,CAAC,OAAO,CAAC,IAAI,EAAE,iDAAiD;CAChE,GAAG,8DAA8D,EAAE,CAAC;;CAEpE,CAAC,KAAK,SAAS,KAAK,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;CAC3D,CAAC,IAAI,CAAC,cAAc,EAAE,WAAW,EAAE,CAAC;;CAEpC,CAAC,CAAC;;CAEF;;CAEA,MAAM,CAAC,gBAAgB,EAAE,KAAK,CAAC,SAAS,EAAE;CAC1C,CAAC,UAAU,EAAE;CACb,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,4CAA4C,EAAE,CAAC;;CAEhE,GAAG;CACH,EAAE;CACF,CAAC,eAAe,EAAE;CAClB,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,OAAO,CAAC,IAAI,EAAE,0DAA0D,EAAE,CAAC;CAC9E,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC;;CAElC,GAAG;CACH,EAAE;CACF,CAAC,gBAAgB,EAAE;CACnB,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,OAAO,CAAC,IAAI,EAAE,4DAA4D,EAAE,CAAC;CAChF,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC;;CAEnC,GAAG;CACH,EAAE;CACF,CAAC,iBAAiB,EAAE;CACpB,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,OAAO,CAAC,IAAI,EAAE,8DAA8D,EAAE,CAAC;CAClF,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;;CAEpC,GAAG;CACH,EAAE;CACF,CAAC,eAAe,EAAE;CAClB,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,OAAO,CAAC,IAAI,EAAE,0DAA0D,EAAE,CAAC;CAC9E,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC;;CAElC,GAAG;CACH,EAAE;CACF,CAAC,kBAAkB,EAAE;CACrB,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,OAAO,CAAC,IAAI,EAAE,gEAAgE,EAAE,CAAC;CACpF,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;;CAErC,GAAG;CACH,EAAE;CACF,CAAC,gBAAgB,EAAE;CACnB,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,OAAO,CAAC,IAAI,EAAE,4DAA4D,EAAE,CAAC;CAChF,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC;;CAEnC,GAAG;CACH,EAAE;CACF,CAAC,eAAe,EAAE;CAClB,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,OAAO,CAAC,IAAI,EAAE,0DAA0D,EAAE,CAAC;CAC9E,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC;;CAElC,GAAG;CACH,EAAE;CACF,CAAC,mBAAmB,EAAE;CACtB,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,gHAAgH,EAAE,CAAC;;CAEpI,GAAG;CACH,EAAE;CACF,CAAC,UAAU,EAAE;CACb,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,OAAO,CAAC,IAAI,EAAE,+CAA+C,EAAE,CAAC;CACnE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC;;CAE5B,GAAG;CACH,EAAE;CACF,CAAC,cAAc,EAAE;CACjB,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,gDAAgD,EAAE,CAAC;;CAEpE,GAAG;CACH,EAAE;CACF,CAAC,cAAc,EAAE;CACjB,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,OAAO,CAAC,IAAI,EAAE,4DAA4D,EAAE,CAAC;CAChF,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;;CAErC,GAAG;CACH,EAAE;CACF,CAAC,eAAe,EAAE;CAClB,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,OAAO,CAAC,IAAI,EAAE,8DAA8D,EAAE,CAAC;CAClF,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;;CAEtC,GAAG;CACH,EAAE;CACF,CAAC,EAAE,CAAC;;CAEJ;;CAEA,MAAM,CAAC,gBAAgB,EAAE,eAAe,CAAC,SAAS,EAAE;;CAEpD,CAAC,MAAM,EAAE;CACT,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,yEAAyE,EAAE,CAAC;CAC7F,GAAG,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;;CAE5B,GAAG;CACH,EAAE;CACF,CAAC,gBAAgB,EAAE,2BAA2B;;CAE9C,EAAE,OAAO,CAAC,KAAK,EAAE,8DAA8D,EAAE,CAAC;;CAElF,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,EAAE;;CAEzC,CAAC,QAAQ,EAAE,WAAW,KAAK,GAAG;;CAE9B,EAAE,OAAO,CAAC,IAAI,EAAE,oEAAoE,EAAE,CAAC;CACvF,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC;;CAEzB,EAAE;CACF,CAAC,WAAW,EAAE,WAAW,KAAK,EAAE,KAAK,EAAE,WAAW,GAAG;;CAErD,EAAE,KAAK,WAAW,KAAK,SAAS,GAAG;;CAEnC,GAAG,OAAO,CAAC,IAAI,EAAE,sEAAsE,EAAE,CAAC;;CAE1F,GAAG;CACH,EAAE,OAAO,CAAC,IAAI,EAAE,0DAA0D,EAAE,CAAC;CAC7E,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;;CAEhC,EAAE;CACF,CAAC,cAAc,EAAE,YAAY;;CAE7B,EAAE,OAAO,CAAC,IAAI,EAAE,gEAAgE,EAAE,CAAC;CACnF,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;;CAErB,EAAE;CACF,CAAC,eAAe,EAAE,YAAY;;CAE9B,EAAE,OAAO,CAAC,IAAI,EAAE,4DAA4D,EAAE,CAAC;;CAE/E,EAAE;CACF,CAAC,cAAc,EAAE,YAAY;;CAE7B,EAAE,OAAO,CAAC,IAAI,EAAE,2DAA2D,EAAE,CAAC;;CAE9E,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,MAAM,CAAC,gBAAgB,EAAE,cAAc,CAAC,SAAS,EAAE;;CAEnD,CAAC,SAAS,EAAE;CACZ,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,KAAK,EAAE,+DAA+D,EAAE,CAAC;CACpF,GAAG,OAAO,IAAI,CAAC,MAAM,CAAC;;CAEtB,GAAG;CACH,EAAE;CACF,CAAC,OAAO,EAAE;CACV,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,6DAA6D,EAAE,CAAC;CACjF,GAAG,OAAO,IAAI,CAAC,MAAM,CAAC;;CAEtB,GAAG;CACH,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;;CAEA,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,SAAS,EAAE;;CAEhD,CAAC,SAAS,EAAE,YAAY;;CAExB,EAAE,OAAO,CAAC,KAAK,EAAE,6DAA6D,EAAE,CAAC;;CAEjF,EAAE;;CAEF,CAAC,YAAY,EAAE,YAAY;;CAE3B,EAAE,OAAO,CAAC,KAAK,EAAE,gEAAgE,EAAE,CAAC;;CAEpF,EAAE;;CAEF,CAAC,QAAQ,EAAE,YAAY;;CAEvB,EAAE,OAAO,CAAC,KAAK,EAAE,4DAA4D,EAAE,CAAC;;CAEhF,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;;CAEA,MAAM,CAAC,gBAAgB,EAAE,OAAO,CAAC,SAAS,EAAE;;CAE5C,CAAC,OAAO,EAAE;CACV,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,gFAAgF,EAAE,CAAC;;CAEpG,GAAG;CACH,EAAE;CACF,CAAC,QAAQ,EAAE;CACX,EAAE,KAAK,EAAE,YAAY;;CAErB,GAAG,OAAO,CAAC,IAAI,EAAE,mFAAmF,EAAE,CAAC;CACvG,GAAG,OAAO,IAAI,CAAC;;CAEf,GAAG;CACH,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;;CAEA,MAAM,CAAC,gBAAgB,EAAE,QAAQ,CAAC,SAAS,EAAE;;CAE7C,CAAC,UAAU,EAAE;CACb,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,+CAA+C,EAAE,CAAC;;CAEnE,GAAG;CACH,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,+CAA+C,EAAE,CAAC;;CAEnE,GAAG;CACH,EAAE;CACF,CAAC,OAAO,EAAE;CACV,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,4CAA4C,EAAE,CAAC;CAChE,GAAG,OAAO,IAAI,KAAK,EAAE,CAAC;;CAEtB,GAAG;CACH,EAAE;;CAEF,CAAC,OAAO,EAAE;CACV,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC,IAAI,GAAG,oEAAoE,EAAE,CAAC;;CAEhH,GAAG;CACH,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC,IAAI,GAAG,oEAAoE,EAAE,CAAC;CAC/G,GAAG,IAAI,CAAC,WAAW,KAAK,KAAK,KAAK,WAAW,EAAE,CAAC;;CAEhD,GAAG;CACH,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,MAAM,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,SAAS,EAAE;;CAEtD,CAAC,KAAK,EAAE;CACR,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,2FAA2F,EAAE,CAAC;CAC/G,GAAG,OAAO,KAAK,CAAC;;CAEhB,GAAG;CACH,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,0FAA0F,EAAE,CAAC;;CAE9G,GAAG;CACH,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,MAAM,CAAC,gBAAgB,EAAE,cAAc,CAAC,SAAS,EAAE;;CAEnD,CAAC,WAAW,EAAE;CACd,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,+EAA+E,EAAE,CAAC;CACnG,GAAG,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;;CAEtC,GAAG;CACH,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,OAAO,CAAC,IAAI,EAAE,gFAAgF,EAAE,CAAC;CACpG,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,GAAG,KAAK,CAAC;;CAEvC,GAAG;CACH,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;;CAEA,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,SAAS,EAAE;;CAExC,CAAC,sBAAsB,EAAE,YAAY;;CAErC,EAAE,OAAO,CAAC,IAAI,EAAE,2EAA2E,EAAE,CAAC;CAC9F,EAAE,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC;;CAEhC,EAAE;;CAEF,CAAC,gBAAgB,EAAE,YAAY;;CAE/B,EAAE,OAAO,CAAC,IAAI,EAAE,mFAAmF,EAAE,CAAC;CACtG,EAAE,OAAO,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC;;CAE9C,EAAE;;CAEF,CAAC,YAAY,EAAE,YAAY;;CAE3B,EAAE,OAAO,CAAC,IAAI,EAAE,sEAAsE,EAAE,CAAC;CACzF,EAAE,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;;CAErC,EAAE;;CAEF,CAAC,YAAY,EAAE,YAAY;;CAE3B,EAAE,OAAO,CAAC,IAAI,EAAE,6DAA6D,EAAE,CAAC;CAChF,EAAE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;;CAE5B,EAAE;;CAEF,CAAC,qBAAqB,EAAE,YAAY;;CAEpC,EAAE,OAAO,CAAC,IAAI,EAAE,gGAAgG,EAAE,CAAC;CACnH,EAAE,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,mBAAmB,EAAE,CAAC;;CAEpD,EAAE;CACF,CAAC,yBAAyB,EAAE,YAAY;;CAExC,EAAE,OAAO,CAAC,IAAI,EAAE,yGAAyG,EAAE,CAAC;CAC5H,EAAE,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,wBAAwB,EAAE,CAAC;;CAEzD,EAAE;CACF,CAAC,2BAA2B,EAAE,YAAY;;CAE1C,EAAE,OAAO,CAAC,IAAI,EAAE,6GAA6G,EAAE,CAAC;CAChI,EAAE,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,0BAA0B,EAAE,CAAC;;CAE3D,EAAE;CACF,CAAC,6BAA6B,EAAE,YAAY;;CAE5C,EAAE,OAAO,CAAC,IAAI,EAAE,oHAAoH,EAAE,CAAC;CACvI,EAAE,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,+BAA+B,EAAE,CAAC;;CAEhE,EAAE;CACF,CAAC,8BAA8B,EAAE,YAAY;;CAE7C,EAAE,OAAO,CAAC,IAAI,EAAE,sHAAsH,EAAE,CAAC;CACzI,EAAE,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,gCAAgC,EAAE,CAAC;;CAEjE,EAAE;CACF,CAAC,mBAAmB,EAAE,YAAY;;CAElC,EAAE,OAAO,CAAC,IAAI,EAAE,6FAA6F,EAAE,CAAC;CAChH,EAAE,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,kBAAkB,EAAE,CAAC;;CAEnD,EAAE;CACF,CAAC,sBAAsB,EAAE,YAAY;;CAErC,EAAE,OAAO,CAAC,IAAI,EAAE,qFAAqF,EAAE,CAAC;CACxG,EAAE,OAAO,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC;;CAE1C,EAAE;CACF,CAAC,uBAAuB,EAAE,YAAY;;CAEtC,EAAE,OAAO,CAAC,IAAI,EAAE,uGAAuG,EAAE,CAAC;CAC1H,EAAE,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,wBAAwB,EAAE,CAAC;;CAEzD,EAAE;CACF,CAAC,iBAAiB,EAAE,WAAW,OAAO,GAAG;;CAEzC,EAAE,OAAO,CAAC,IAAI,EAAE,qEAAqE,EAAE,CAAC;CACxF,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE,CAAC;;CAEjC,EAAE;CACF,CAAC,YAAY,EAAE,YAAY;;CAE3B,EAAE,OAAO,CAAC,IAAI,EAAE,wDAAwD,EAAE,CAAC;;CAE3E,EAAE;CACF,CAAC,YAAY,EAAE,YAAY;;CAE3B,EAAE,OAAO,CAAC,IAAI,EAAE,wDAAwD,EAAE,CAAC;;CAE3E,EAAE;CACF,CAAC,aAAa,EAAE,YAAY;;CAE5B,EAAE,OAAO,CAAC,IAAI,EAAE,yDAAyD,EAAE,CAAC;;CAE5E,EAAE;CACF,CAAC,eAAe,EAAE,YAAY;;CAE9B,EAAE,OAAO,CAAC,IAAI,EAAE,2DAA2D,EAAE,CAAC;;CAE9E,EAAE;CACF,CAAC,cAAc,EAAE,YAAY;;CAE7B,EAAE,OAAO,CAAC,IAAI,EAAE,0DAA0D,EAAE,CAAC;;CAE7E,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ,MAAM,CAAC,gBAAgB,EAAE,aAAa,CAAC,SAAS,EAAE;;CAElD,CAAC,gBAAgB,EAAE;CACnB,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;;CAEjC,GAAG;CACH,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,OAAO,CAAC,IAAI,EAAE,mEAAmE,EAAE,CAAC;CACvF,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;;CAElC,GAAG;CACH,EAAE;CACF,CAAC,aAAa,EAAE;CAChB,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;;CAE9B,GAAG;CACH,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,OAAO,CAAC,IAAI,EAAE,6DAA6D,EAAE,CAAC;CACjF,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,KAAK,CAAC;;CAE/B,GAAG;CACH,EAAE;CACF,CAAC,iBAAiB,EAAE;CACpB,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,4FAA4F,EAAE,CAAC;CAChH,GAAG,OAAO,SAAS,CAAC;;CAEpB,GAAG;CACH,EAAE,GAAG,EAAE,yBAAyB;;CAEhC,GAAG,OAAO,CAAC,IAAI,EAAE,4FAA4F,EAAE,CAAC;;CAEhH,GAAG;CACH,EAAE;CACF,CAAC,EAAE,CAAC;;CAEJ,MAAM,CAAC,gBAAgB,EAAE,cAAc,CAAC,SAAS,EAAE;;CAEnD,CAAC,QAAQ,EAAE;CACX,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,6FAA6F,EAAE,CAAC;CACjH,GAAG,OAAO,SAAS,CAAC;;CAEpB,GAAG;CACH,EAAE,GAAG,EAAE,4BAA4B;;CAEnC,GAAG,OAAO,CAAC,IAAI,EAAE,6FAA6F,EAAE,CAAC;;CAEjH,GAAG;CACH,EAAE;CACF,CAAC,kBAAkB,EAAE;CACrB,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,uGAAuG,EAAE,CAAC;CAC3H,GAAG,OAAO,SAAS,CAAC;;CAEpB,GAAG;CACH,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,uGAAuG,EAAE,CAAC;;CAE3H,GAAG;CACH,EAAE;CACF,CAAC,iBAAiB,EAAE;CACpB,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,sGAAsG,EAAE,CAAC;CAC1H,GAAG,OAAO,SAAS,CAAC;;CAEpB,GAAG;CACH,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,sGAAsG,EAAE,CAAC;;CAE1H,GAAG;CACH,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;;CAEA,MAAM,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,SAAS,EAAE;;CAEtD,CAAC,KAAK,EAAE;CACR,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,wDAAwD,EAAE,CAAC;CAC5E,GAAG,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;;CAE7B,GAAG;CACH,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,OAAO,CAAC,IAAI,EAAE,wDAAwD,EAAE,CAAC;CAC5E,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;;CAE9B,GAAG;CACH,EAAE;CACF,CAAC,KAAK,EAAE;CACR,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,wDAAwD,EAAE,CAAC;CAC5E,GAAG,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;;CAE7B,GAAG;CACH,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,OAAO,CAAC,IAAI,EAAE,wDAAwD,EAAE,CAAC;CAC5E,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;;CAE9B,GAAG;CACH,EAAE;CACF,CAAC,SAAS,EAAE;CACZ,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,gEAAgE,EAAE,CAAC;CACpF,GAAG,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;;CAEjC,GAAG;CACH,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,OAAO,CAAC,IAAI,EAAE,gEAAgE,EAAE,CAAC;CACpF,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC;;CAElC,GAAG;CACH,EAAE;CACF,CAAC,SAAS,EAAE;CACZ,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,gEAAgE,EAAE,CAAC;CACpF,GAAG,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;;CAEjC,GAAG;CACH,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,OAAO,CAAC,IAAI,EAAE,gEAAgE,EAAE,CAAC;CACpF,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC;;CAElC,GAAG;CACH,EAAE;CACF,CAAC,UAAU,EAAE;CACb,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,kEAAkE,EAAE,CAAC;CACtF,GAAG,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;;CAElC,GAAG;CACH,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,OAAO,CAAC,IAAI,EAAE,kEAAkE,EAAE,CAAC;CACtF,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,KAAK,CAAC;;CAEnC,GAAG;CACH,EAAE;CACF,CAAC,MAAM,EAAE;CACT,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,0DAA0D,EAAE,CAAC;CAC9E,GAAG,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;;CAE9B,GAAG;CACH,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,OAAO,CAAC,IAAI,EAAE,0DAA0D,EAAE,CAAC;CAC9E,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;;CAE/B,GAAG;CACH,EAAE;CACF,CAAC,MAAM,EAAE;CACT,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,0DAA0D,EAAE,CAAC;CAC9E,GAAG,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;;CAE9B,GAAG;CACH,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,OAAO,CAAC,IAAI,EAAE,0DAA0D,EAAE,CAAC;CAC9E,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;;CAE/B,GAAG;CACH,EAAE;CACF,CAAC,MAAM,EAAE;CACT,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,0DAA0D,EAAE,CAAC;CAC9E,GAAG,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;;CAE9B,GAAG;CACH,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,OAAO,CAAC,IAAI,EAAE,0DAA0D,EAAE,CAAC;CAC9E,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;;CAE/B,GAAG;CACH,EAAE;CACF,CAAC,IAAI,EAAE;CACP,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,sDAAsD,EAAE,CAAC;CAC1E,GAAG,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;;CAE5B,GAAG;CACH,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,OAAO,CAAC,IAAI,EAAE,sDAAsD,EAAE,CAAC;CAC1E,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC;;CAE7B,GAAG;CACH,EAAE;CACF,CAAC,eAAe,EAAE;CAClB,EAAE,GAAG,EAAE,YAAY;;CAEnB,GAAG,OAAO,CAAC,IAAI,EAAE,4EAA4E,EAAE,CAAC;CAChG,GAAG,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;;CAEvC,GAAG;CACH,EAAE,GAAG,EAAE,WAAW,KAAK,GAAG;;CAE1B,GAAG,OAAO,CAAC,IAAI,EAAE,4EAA4E,EAAE,CAAC;CAChG,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,GAAG,KAAK,CAAC;;CAExC,GAAG;CACH,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;;CAEA,MAAM,CAAC,gBAAgB,EAAE,YAAY,CAAC,SAAS,EAAE;;CAEjD,CAAC,QAAQ,EAAE;CACX,EAAE,GAAG,EAAE,yBAAyB;;CAEhC,GAAG,OAAO,CAAC,IAAI,EAAE,iDAAiD,EAAE,CAAC;;CAErE,GAAG;CACH,EAAE;;CAEF,CAAC,EAAE,CAAC;;CAEJ;;CAEA,KAAK,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW,IAAI,GAAG;;CAEzC,CAAC,OAAO,CAAC,IAAI,EAAE,wEAAwE,EAAE,CAAC;CAC1F,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC;CAClB,CAAC,IAAI,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;CACrC,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,MAAM,GAAG;;CAE7C,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;;CAE5B,EAAE,EAAE,CAAC;CACL,CAAC,OAAO,IAAI,CAAC;;CAEb,CAAC,CAAC;;CAEF,aAAa,CAAC,SAAS,CAAC,OAAO,GAAG,YAAY;;CAE9C,CAAC,OAAO,CAAC,IAAI,EAAE,6DAA6D,EAAE,CAAC;CAC/E,CAAC,OAAO,IAAI,CAAC,gBAAgB,EAAE,CAAC;;CAEhC,CAAC,CAAC;;CAEF;;CAEA,UAAU,CAAC,SAAS,CAAC,aAAa,GAAG,WAAW,QAAQ,EAAE,KAAK,GAAG;;CAElE,CAAC,OAAO,CAAC,IAAI,EAAE,sDAAsD,EAAE,CAAC;CACxE,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;;CAEvC,CAAC,CAAC;;CCro5CF,sBAAc,GAAG,SAAS,MAAM,CAAC,MAAM,CAAC;GACtC,IAAI,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,EAAE,CAAC;GAC5B,MAAM,GAAG,MAAM,IAAI,KAAI;;;;GAIvB,MAAM,CAAC,EAAE,GAAG,SAAS,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC;KACnC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAC;KACrD,OAAO,MAAM;KACd;;;;GAID,MAAM,CAAC,GAAG,GAAG,SAAS,IAAI,EAAE,IAAI,CAAC;KAC/B,IAAI,KAAK,MAAM,GAAG,EAAE,EAAC;KACrB,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK;SAC5B,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;KAC7C,MAAM,CAAC,EAAE,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAC;KACjD,OAAO,MAAM;KACd;;;;GAID,MAAM,CAAC,IAAI,GAAG,SAAS,IAAI,CAAC;KAC1B,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;KACtF,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,EAAC;KACnE,OAAO,MAAM;IACd,CAAC;EACH;;CC3BD;AACAzF,QAAO,CAACA,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAExC,aAA2B,EAAE,CAAC,CAAC;;CCDtE,IAAI2F,SAAO,GAAGrF,KAA8B,CAAC,MAAM,CAAC;CACpD,UAAc,GAAG,SAAS,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE;GACrC,OAAOqF,SAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;EAC7B,CAAC;;CCJF,YAAc,GAAG3F,MAA2C;;CCC5D,uBAAc,GAAG,UAAU,EAAE,EAAE,IAAI,EAAE;GACnC,IAAI,CAACI,SAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,IAAI,EAAE,MAAM,SAAS,CAAC,yBAAyB,GAAG,IAAI,GAAG,YAAY,CAAC,CAAC;GACtG,OAAO,EAAE,CAAC;EACX,CAAC;;CCHF,IAAIO,IAAE,GAAGX,SAAuB,CAAC,CAAC,CAAC;;;;;;;;;;CAUnC,IAAI,OAAO,GAAGM,KAAkB,CAAC,OAAO,CAAC;;CAEzC,IAAI,IAAI,GAAGiD,YAAW,GAAG,IAAI,GAAG,MAAM,CAAC;;CAEvC,IAAI,QAAQ,GAAG,UAAU,IAAI,EAAE,GAAG,EAAE;;GAElC,IAAI,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;GACzB,IAAI,KAAK,CAAC;GACV,IAAI,KAAK,KAAK,GAAG,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;;GAEzC,KAAK,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,CAAC,EAAE;KAC5C,IAAI,KAAK,CAAC,CAAC,IAAI,GAAG,EAAE,OAAO,KAAK,CAAC;IAClC;EACF,CAAC;;CAEF,qBAAc,GAAG;GACf,cAAc,EAAE,UAAU,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE;KACtD,IAAI,CAAC,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,QAAQ,EAAE;OACxCM,WAAU,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;OAChC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;OACf,IAAI,CAAC,EAAE,GAAG9B,aAAM,CAAC,IAAI,CAAC,CAAC;OACvB,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC;OACpB,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC;OACpB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;OACf,IAAI,QAAQ,IAAI,SAAS,EAAEsC,MAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;MACvE,CAAC,CAAC;KACH6D,YAAW,CAAC,CAAC,CAAC,SAAS,EAAE;;;OAGvB,KAAK,EAAE,SAAS,KAAK,GAAG;SACtB,KAAK,IAAI,IAAI,GAAGC,mBAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,CAAC,EAAE;WAC7F,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC;WACf,IAAI,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;WAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;UACtB;SACD,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC;SAC9B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB;;;OAGD,QAAQ,EAAE,UAAU,GAAG,EAAE;SACvB,IAAI,IAAI,GAAGA,mBAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;SAChC,IAAI,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;SAChC,IAAI,KAAK,EAAE;WACT,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;WACnB,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;WACnB,OAAO,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;WACxB,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC;WACf,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;WACxB,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;WACxB,IAAI,IAAI,CAAC,EAAE,IAAI,KAAK,EAAE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;WACrC,IAAI,IAAI,CAAC,EAAE,IAAI,KAAK,EAAE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;WACrC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;UACd,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC;QAClB;;;OAGD,OAAO,EAAE,SAAS,OAAO,CAAC,UAAU,2BAA2B;SAC7DA,mBAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;SACrB,IAAI,CAAC,GAAGnH,IAAG,CAAC,UAAU,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC;SAC5E,IAAI,KAAK,CAAC;SACV,OAAO,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE;WACxC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;;WAE1B,OAAO,KAAK,IAAI,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;UAC1C;QACF;;;OAGD,GAAG,EAAE,SAAS,GAAG,CAAC,GAAG,EAAE;SACrB,OAAO,CAAC,CAAC,QAAQ,CAACmH,mBAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QAC9C;MACF,CAAC,CAAC;KACH,IAAI5E,YAAW,EAAE5C,IAAE,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE;OACvC,GAAG,EAAE,YAAY;SACf,OAAOwH,mBAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QACnC;MACF,CAAC,CAAC;KACH,OAAO,CAAC,CAAC;IACV;GACD,GAAG,EAAE,UAAU,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE;KAC/B,IAAI,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;KAChC,IAAI,IAAI,EAAE,KAAK,CAAC;;KAEhB,IAAI,KAAK,EAAE;OACT,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC;;MAEjB,MAAM;OACL,IAAI,CAAC,EAAE,GAAG,KAAK,GAAG;SAChB,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC;SAC7B,CAAC,EAAE,GAAG;SACN,CAAC,EAAE,KAAK;SACR,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,EAAE;SACjB,CAAC,EAAE,SAAS;SACZ,CAAC,EAAE,KAAK;QACT,CAAC;OACF,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC;OAC9B,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;OACzB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;;OAEb,IAAI,KAAK,KAAK,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;MAC3C,CAAC,OAAO,IAAI,CAAC;IACf;GACD,QAAQ,EAAE,QAAQ;GAClB,SAAS,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;;;KAGpCC,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,QAAQ,EAAE,IAAI,EAAE;OAC7C,IAAI,CAAC,EAAE,GAAGD,mBAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;OACnC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;OACf,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC;MACrB,EAAE,YAAY;OACb,IAAI,IAAI,GAAG,IAAI,CAAC;OAChB,IAAI,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;OACnB,IAAI,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC;;OAEpB,OAAO,KAAK,IAAI,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;;OAEzC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;;SAEjE,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC;SACpB,OAAO1F,SAAI,CAAC,CAAC,CAAC,CAAC;QAChB;;OAED,IAAI,IAAI,IAAI,MAAM,EAAE,OAAOA,SAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;OAC5C,IAAI,IAAI,IAAI,QAAQ,EAAE,OAAOA,SAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;OAC9C,OAAOA,SAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;MACpC,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;;;KAGjD4F,WAAU,CAAC,IAAI,CAAC,CAAC;IAClB;EACF,CAAC;;CC7IF,IAAI/E,SAAO,GAAGtD,IAAiB,CAAC,SAAS,CAAC,CAAC;;CAE3C,4BAAc,GAAG,UAAU,QAAQ,EAAE;GACnC,IAAI,CAAC,CAAC;GACN,IAAI0F,QAAO,CAAC,QAAQ,CAAC,EAAE;KACrB,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC;;KAEzB,IAAI,OAAO,CAAC,IAAI,UAAU,KAAK,CAAC,KAAK,KAAK,IAAIA,QAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC;KACnF,IAAItF,SAAQ,CAAC,CAAC,CAAC,EAAE;OACf,CAAC,GAAG,CAAC,CAACkD,SAAO,CAAC,CAAC;OACf,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC;MAC/B;IACF,CAAC,OAAO,CAAC,KAAK,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;EACtC,CAAC;;CCfF;;;CAGA,uBAAc,GAAG,UAAU,QAAQ,EAAE,MAAM,EAAE;GAC3C,OAAO,KAAKS,wBAAkB,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;EACnD,CAAC;;CCLF;;;;;;;;;;;;CAYA,iBAAc,GAAG,UAAU,IAAI,EAAE,OAAO,EAAE;GACxC,IAAI,MAAM,GAAG,IAAI,IAAI,CAAC,CAAC;GACvB,IAAI,SAAS,GAAG,IAAI,IAAI,CAAC,CAAC;GAC1B,IAAI,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC;GACxB,IAAI,QAAQ,GAAG,IAAI,IAAI,CAAC,CAAC;GACzB,IAAI,aAAa,GAAG,IAAI,IAAI,CAAC,CAAC;GAC9B,IAAI,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,aAAa,CAAC;GAC1C,IAAI,MAAM,GAAG,OAAO,IAAIuE,mBAAG,CAAC;GAC5B,OAAO,UAAU,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE;KACxC,IAAI,CAAC,GAAGpG,SAAQ,CAAC,KAAK,CAAC,CAAC;KACxB,IAAI,IAAI,GAAGf,QAAO,CAAC,CAAC,CAAC,CAAC;KACtB,IAAI,CAAC,GAAGH,IAAG,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;KACjC,IAAI,MAAM,GAAGM,SAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;KACnC,IAAI,KAAK,GAAG,CAAC,CAAC;KACd,IAAI,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,SAAS,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC;KACvF,IAAI,GAAG,EAAE,GAAG,CAAC;KACb,MAAM,MAAM,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,QAAQ,IAAI,KAAK,IAAI,IAAI,EAAE;OAC5D,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;OAClB,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;OACvB,IAAI,IAAI,EAAE;SACR,IAAI,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;cAC3B,IAAI,GAAG,EAAE,QAAQ,IAAI;WACxB,KAAK,CAAC,EAAE,OAAO,IAAI,CAAC;WACpB,KAAK,CAAC,EAAE,OAAO,GAAG,CAAC;WACnB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;WACrB,KAAK,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;UAC1B,MAAM,IAAI,QAAQ,EAAE,OAAO,KAAK,CAAC;QACnC;MACF;KACD,OAAO,aAAa,GAAG,CAAC,CAAC,GAAG,OAAO,IAAI,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrE,CAAC;EACH,CAAC;;CChCF,IAAIX,IAAE,GAAGX,SAAuB,CAAC,CAAC,CAAC;CACnC,IAAI,IAAI,GAAGM,aAA2B,CAAC,CAAC,CAAC,CAAC;;;CAG1C,eAAc,GAAG,UAAU,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;GAC1E,IAAI,IAAI,GAAGQ,OAAM,CAAC,IAAI,CAAC,CAAC;GACxB,IAAI,CAAC,GAAG,IAAI,CAAC;GACb,IAAI,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;GACnC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC;GAC7B,IAAI,CAAC,GAAG,EAAE,CAAC;GACX,IAAI,CAACyC,YAAW,IAAI,OAAO,CAAC,IAAI,UAAU,IAAI,EAAE,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,CAACiB,MAAK,CAAC,YAAY;KAC7F,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC,CAAC,EAAE;;KAEH,CAAC,GAAG,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;KACxD0D,YAAW,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;KAClCK,KAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,MAAM;KACL,CAAC,GAAG,OAAO,CAAC,UAAU,MAAM,EAAE,QAAQ,EAAE;OACtC1E,WAAU,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;OAClC,MAAM,CAAC,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;OACvB,IAAI,QAAQ,IAAI,SAAS,EAAEQ,MAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;MAC3E,CAAC,CAAC;KACH,IAAI,CAAC,iEAAiE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,UAAU,GAAG,EAAE;OAChG,IAAI,QAAQ,GAAG,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,CAAC;OAC5C,IAAI,GAAG,IAAI,KAAK,IAAI,EAAE,OAAO,IAAI,GAAG,IAAI,OAAO,CAAC,EAAEpD,KAAI,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,EAAE,UAAU,CAAC,EAAE,CAAC,EAAE;SACvF4C,WAAU,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;SACzB,IAAI,CAAC,QAAQ,IAAI,OAAO,IAAI,CAACzD,SAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,KAAK,GAAG,SAAS,GAAG,KAAK,CAAC;SAClF,IAAI,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;SAC9C,OAAO,QAAQ,GAAG,IAAI,GAAG,MAAM,CAAC;QACjC,CAAC,CAAC;MACJ,CAAC,CAAC;KACH,OAAO,IAAIO,IAAE,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE;OACjC,GAAG,EAAE,YAAY;SACf,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;QACrB;MACF,CAAC,CAAC;IACJ;;GAEDsB,eAAc,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;;GAExB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;GACZO,OAAO,CAACA,OAAO,CAAC,CAAC,GAAGA,OAAO,CAAC,CAAC,GAAGA,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;GAE9C,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;;GAEhD,OAAO,CAAC,CAAC;EACV,CAAC;;CCvDF,IAAI,GAAG,GAAG,KAAK,CAAC;;;CAGhB,WAAc,GAAGxC,WAAwB,CAAC,GAAG,EAAE,UAAU,GAAG,EAAE;GAC5D,OAAO,SAAS,GAAG,GAAG,EAAE,OAAO,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC;EAC9F,EAAE;;GAED,GAAG,EAAE,SAAS,GAAG,CAAC,GAAG,EAAE;KACrB,IAAI,KAAK,GAAGwI,iBAAM,CAAC,QAAQ,CAACL,mBAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;KACtD,OAAO,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC;IACzB;;GAED,GAAG,EAAE,SAAS,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE;KAC5B,OAAOK,iBAAM,CAAC,GAAG,CAACL,mBAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;IACpE;EACF,EAAEK,iBAAM,EAAE,IAAI,CAAC,CAAC;;CChBjB,sBAAc,GAAG,UAAU,IAAI,EAAE,QAAQ,EAAE;GACzC,IAAI,MAAM,GAAG,EAAE,CAAC;GAChBnE,MAAK,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;GAClD,OAAO,MAAM,CAAC;EACf,CAAC;;CCNF;;;CAGA,qBAAc,GAAG,UAAU,IAAI,EAAE;GAC/B,OAAO,SAAS,MAAM,GAAG;KACvB,IAAIzB,QAAO,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,MAAM,SAAS,CAAC,IAAI,GAAG,uBAAuB,CAAC,CAAC;KAC3E,OAAO6F,kBAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;EACH,CAAC;;CCRF;;;AAGAjG,QAAO,CAACA,OAAO,CAAC,CAAC,GAAGA,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAExC,iBAAgC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;;;;;CCC3F,oBAAc,GAAG,UAAU,UAAU,EAAE;GACrCwC,OAAO,CAACA,OAAO,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG;KACjD,IAAI,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;KAC9B,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;KAC1B,OAAO,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;KAC/C,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,EAAE,CAAC,CAAC;EACN,CAAC;;CCXF;AACAxC,iBAA+B,CAAC,KAAK,CAAC,CAAC;;;;;;;;CCMvC,sBAAc,GAAG,UAAU,UAAU,EAAE;GACrCwC,OAAO,CAACA,OAAO,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,IAAI,CAAC,MAAM,yBAAyB;KAClF,IAAI,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;KACzB,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;KACtBrC,UAAS,CAAC,IAAI,CAAC,CAAC;KAChB,OAAO,GAAG,KAAK,KAAK,SAAS,CAAC;KAC9B,IAAI,OAAO,EAAEA,UAAS,CAAC,KAAK,CAAC,CAAC;KAC9B,IAAI,MAAM,IAAI,SAAS,EAAE,OAAO,IAAI,IAAI,EAAE,CAAC;KAC3C,CAAC,GAAG,EAAE,CAAC;KACP,IAAI,OAAO,EAAE;OACX,CAAC,GAAG,CAAC,CAAC;OACN,EAAE,GAAGa,IAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;OACjCqD,MAAK,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,QAAQ,EAAE;SACvC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3B,CAAC,CAAC;MACJ,MAAM;OACLA,MAAK,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;MACjC;KACD,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,EAAE,CAAC,CAAC;EACN,CAAC;;CC3BF;AACArE,mBAAiC,CAAC,KAAK,CAAC,CAAC;;CCMzC,OAAc,GAAGoE,KAA2B,CAAC,GAAG,CAAC;;CCPjD,SAAc,GAAGpE,GAAiC;;CCIlD,IAAI,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC;CAC1B,IAAI,SAAS,GAAG,EAAE,CAAC;;CAEnB,IAAI,SAAS,GAAG,UAAU,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE;GACtC,IAAI,EAAE,GAAG,IAAI,SAAS,CAAC,EAAE;KACvB,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC;;KAE5D,SAAS,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;IACvE,CAAC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;EAClC,CAAC;;CAEF,SAAc,GAAG,QAAQ,CAAC,IAAI,IAAI,SAAS,IAAI,CAAC,IAAI,kBAAkB;GACpE,IAAI,EAAE,GAAGG,UAAS,CAAC,IAAI,CAAC,CAAC;GACzB,IAAI,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;GAC7C,IAAI,KAAK,GAAG,yBAAyB;KACnC,IAAI,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;KACvD,OAAO,IAAI,YAAY,KAAK,GAAG,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG6C,OAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1F,CAAC;GACF,IAAI5C,SAAQ,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC,SAAS,CAAC;GAC3D,OAAO,KAAK,CAAC;EACd,CAAC;;CCxBF;;;;;;;;CAQA,IAAI,UAAU,GAAG,CAACJ,OAAoB,CAAC,OAAO,IAAI,EAAE,EAAE,SAAS,CAAC;;;;CAIhE,IAAI,cAAc,GAAGwE,MAAK,CAAC,YAAY;GACrC,SAAS,CAAC,GAAG,eAAe;GAC5B,OAAO,EAAE,UAAU,CAAC,YAAY,eAAe,EAAE,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;EACvE,CAAC,CAAC;CACH,IAAI,QAAQ,GAAG,CAACA,MAAK,CAAC,YAAY;GAChC,UAAU,CAAC,YAAY,eAAe,CAAC,CAAC;EACzC,CAAC,CAAC;;AAEHhC,QAAO,CAACA,OAAO,CAAC,CAAC,GAAGA,OAAO,CAAC,CAAC,IAAI,cAAc,IAAI,QAAQ,CAAC,EAAE,SAAS,EAAE;GACvE,SAAS,EAAE,SAAS,SAAS,CAAC,MAAM,EAAE,IAAI,oBAAoB;KAC5DrC,UAAS,CAAC,MAAM,CAAC,CAAC;KAClBK,SAAQ,CAAC,IAAI,CAAC,CAAC;KACf,IAAI,SAAS,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,GAAGL,UAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;KACxE,IAAI,QAAQ,IAAI,CAAC,cAAc,EAAE,OAAO,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;KAC5E,IAAI,MAAM,IAAI,SAAS,EAAE;;OAEvB,QAAQ,IAAI,CAAC,MAAM;SACjB,KAAK,CAAC,EAAE,OAAO,IAAI,MAAM,EAAE,CAAC;SAC5B,KAAK,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;SACnC,KAAK,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;SAC5C,KAAK,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;SACrD,KAAK,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D;;OAED,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;OACnB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;OAC9B,OAAO,KAAKuI,KAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC;MAC1C;;KAED,IAAI,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC;KAChC,IAAI,QAAQ,GAAG3G,aAAM,CAAC3B,SAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;KAClE,IAAI,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;KACzD,OAAOA,SAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC7C;EACF,CAAC,CAAC;;CC7CH,eAAc,GAAGE,KAA8B,CAAC,OAAO,CAAC,SAAS,CAAC;;CCDlE,eAAc,GAAGN,WAA+C;;;CCIhE,SAAS,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE;GACvC,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI2I,WAAkB,EAAE;KACxD,cAAc,GAAG,UAAU,GAAGA,WAAkB,CAAC;IAClD,MAAM;KACL,cAAc,GAAG,UAAU,GAAG,SAAS,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE;OACrE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;OACf,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;OACtB,IAAI,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;OAC/C,IAAI,QAAQ,GAAG,IAAI,WAAW,EAAE,CAAC;OACjC,IAAI,KAAK,EAAEzC,gBAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;OACrD,OAAO,QAAQ,CAAC;MACjB,CAAC;IACH;;GAED,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;EAC1C;;CAED,cAAc,GAAG,UAAU;;;;CCX3B,SAAS,gBAAgB,CAAC,KAAK,EAAE;GAC/B,IAAI,MAAM,GAAG,OAAO0C,KAAI,KAAK,UAAU,GAAG,IAAIA,KAAI,EAAE,GAAG,SAAS,CAAC;;GAEjE,cAAc,GAAG,gBAAgB,GAAG,SAAS,gBAAgB,CAAC,KAAK,EAAE;KACnE,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;OAC/B,MAAM,IAAI,SAAS,CAAC,oDAAoD,CAAC,CAAC;MAC3E;;KAED,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;OACjC,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;;OAEhD,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;MAC5B;;KAED,SAAS,OAAO,GAAG,EAAE;;KAErB,OAAO,CAAC,SAAS,GAAGC,QAAc,CAAC,KAAK,CAAC,SAAS,EAAE;OAClD,WAAW,EAAE;SACX,KAAK,EAAE,OAAO;SACd,UAAU,EAAE,KAAK;SACjB,QAAQ,EAAE,IAAI;SACd,YAAY,EAAE,IAAI;QACnB;MACF,CAAC,CAAC;KACH,OAAO3C,gBAAc,CAAC,OAAO,EAAEA,gBAAc,CAAC,SAAS,KAAK,GAAG;OAC7D,OAAO4C,WAAS,CAAC,KAAK,EAAE,SAAS,EAAE1G,gBAAc,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC;MACtE,EAAE,KAAK,CAAC,CAAC,CAAC;IACZ,CAAC;;GAEF,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC;EAChC;;CAED,cAAc,GAAG,gBAAgB;;;KC1CpB2G,kBAAb;CAAA;CAAA;CACE,4BAAYC,aAAZ,EAA2BC,OAA3B,EAAoCC,SAApC,EAA+C;CAAA;;CAAA;;CAC7C,qGAAUF,aAAV,eAA4BC,OAA5B;;CAEA,QAAME,aAAa,MAAKC,KAAL,CAAWC,KAAX,CAAiB,IAAjB,CAAnB;;CACAF,eAAWG,MAAX,CAAkB,CAAlB,EAAqB,CAArB;CAEA,UAAKF,KAAL,GAAaD,WAAWI,IAAX,CAAgB,IAAhB,CAAb;CAEA,QAAIC,OAAJ,EAAaA,QAAQC,KAAR,CAAc,YAAd,EAA4BP,SAA5B;CAEb,UAAKQ,IAAL,GAAY,kBAAZ;CAV6C;CAW9C;;CAZH;;CAAA;CAAA,kBAAsCC,KAAtC;AAeA,KAAaC,eAAb;CAAA;CAAA;CACE,2BAAYZ,aAAZ,EAA2BC,OAA3B,EAAoCY,YAApC,EAA4E;CAAA;;CAAA,QAA1BC,gBAA0B,uEAAP,KAAO;;CAAA;;CAC1E,qGAAUd,aAAV,eAA4BC,OAA5B;;CAEA,QAAME,aAAa,OAAKC,KAAL,CAAWC,KAAX,CAAiB,IAAjB,CAAnB;;CACAF,eAAWG,MAAX,CAAkB,CAAlB,EAAqB,CAArB;CAEA,WAAKF,KAAL,GAAaD,WAAWI,IAAX,CAAgB,IAAhB,CAAb;CAEA,QAAIC,OAAJ,EAAaA,QAAQC,KAAR,CAAc,gBAAd,EAAgCI,YAAhC;CACb,QAAIL,WAAWM,gBAAf,EAAiCN,QAAQC,KAAR,CAAc,iCAAd,EAAiDK,gBAAjD;CAEjC,WAAKJ,IAAL,GAAY,iBAAZ;CAX0E;CAY3E;;CAbH;;CAAA;CAAA,kBAAqCC,KAArC;AAgBA,KAAaI,YAAb;CAAA;CAAA;CACE,wBAAYf,aAAZ,EAA2BC,OAA3B,EAAoCC,SAApC,EAAqE;CAAA;;CAAA,QAAtBW,YAAsB,uEAAP,KAAO;;CAAA;;CACnE,kGAAUb,aAAV,eAA4BC,OAA5B;;CAEA,QAAME,aAAa,OAAKC,KAAL,CAAWC,KAAX,CAAiB,IAAjB,CAAnB;;CACAF,eAAWG,MAAX,CAAkB,CAAlB,EAAqB,CAArB;CAEA,WAAKF,KAAL,GAAaD,WAAWI,IAAX,CAAgB,IAAhB,CAAb;CAEA,QAAIC,OAAJ,EAAaA,QAAQC,KAAR,CAAc,YAAd,EAA4BP,SAA5B;CACb,QAAIM,WAAWK,YAAf,EAA6BL,QAAQC,KAAR,CAAc,gBAAd,EAAgCI,YAAhC;CAE7B,WAAKH,IAAL,GAAY,cAAZ;CAXmE;CAYpE;;CAbH;;CAAA;CAAA,kBAAkCC,KAAlC;;CC1BA,IAAMK,WAAW,SAAXA,QAAW,GAAM;CACrB,QAAM,IAAIL,KAAJ,CAAU,qEAAV,CAAN;CACD,CAFD;;CAIA,IAAI;CACF,MAAI,CAACM,QAAL,EAAeD;CAChB,CAFD,CAEE,OAAOE,GAAP,EAAY;CACZF;CACD;CAED;;;;;;;;;;;AASA,KAAaG,YAAb;CAAA;CAAA;CAAA;CAAA;;CAAA;CAAA;;CAAA;CAAA;CACE;;CAEA;;;;;;;CAHF,qCAUmBC,MAVnB,EAU2B;CACvB,UAAI,CAAC,KAAKC,OAAN,IAAiB,CAACD,MAAtB,EAA8B;CAC9B,UAAIA,UAAUA,OAAOC,OAArB,EAA8B,KAAKA,OAAL,GAAeD,OAAOC,OAAP,CAAenD,KAAf,CAAqB,CAArB,CAAf;;CAE9B,UAAI,KAAKmD,OAAT,EAAkB;CAChB,aAAK,IAAI9C,IAAI,CAAR,EAAWC,MAAM,KAAK6C,OAAL,CAAa5C,MAAnC,EAA2CF,IAAIC,GAA/C,EAAoDD,GAApD;CACE,eAAK+C,WAAL,CAAiB,KAAKD,OAAL,CAAa9C,CAAb,CAAjB,EAAkC,KAAlC;CADF;CAED;;CAED,UAAI6C,MAAJ,EAAY,KAAKG,WAAL,CAAiB;CAACC,gBAAQJ;CAAT,OAAjB;CACb,KApBH;;CAwBE;;;;;;;;;CAxBF;CAAA;CAAA,kCAgC8B;CAAA,UAAhBK,SAAgB,uEAAJ,EAAI;CAAA,UACnBJ,OADmB,GACR,IADQ,CACnBA,OADmB;CAE1B,UAAI,CAACA,OAAL,EAAc,OAAOI,SAAP;;CAEd,WAAK,IAAIlD,IAAI,CAAR,EAAWC,MAAM6C,QAAQ5C,MAA9B,EAAsCF,IAAIC,GAA1C,EAA+CD,GAA/C,EAAoD;CAClD,aAAK,IAAMM,GAAX,IAAkB4C,SAAlB,EAA6B;CAC3B,cAAIA,UAAU5C,GAAV,CAAJ,EAAoB;CAClB,gBAAM6C,SAASL,QAAQ9C,CAAR,CAAf;CAEA,gBAAImD,UAAUA,OAAOC,MAAjB,IAA2BD,OAAOC,MAAP,CAAc9C,GAAd,CAA/B,EACE4C,UAAU5C,GAAV,IAAiB6C,OAAOC,MAAP,CAAc9C,GAAd,EAAmB+C,KAAnB,CAAyB,IAAzB,EAA+B,CAACH,UAAU5C,GAAV,CAAD,EAAiB6C,MAAjB,CAA/B,CAAjB;CACH;CACF;CACF;;CAED,aAAOD,SAAP;CACD;CAED;;;;;;;;;CAlDF;CAAA;CAAA,iCA0Def,IA1Df,EA0DkF;CAAA;;CAAA,UAA7DmB,EAA6D,uEAAxD,UAACC,IAAD,EAAOC,WAAP;CAAA,eAAuBD,KAAKF,KAAL,CAAW,KAAX,EAAiB,CAACG,WAAD,CAAjB,CAAvB;CAAA,OAAwD;CAAA,UACvEV,OADuE,GAC5D,IAD4D,CACvEA,OADuE;CAE9E,UAAI,CAACA,OAAL,EAAc;;CAEd,WAAK,IAAI9C,IAAI,CAAR,EAAWC,MAAM6C,QAAQ5C,MAA9B,EAAsCF,IAAIC,GAA1C,EAA+CD,GAA/C,EAAoD;CAClD,YAAMmD,SAASL,QAAQ9C,CAAR,CAAf;CACA,YAAImC,QAAQgB,MAAZ,EAAoBG,GAAGH,OAAOhB,IAAP,CAAH,EAAiBgB,MAAjB;CACrB;CACF;CAED;;;;;;;;;;;;CApEF;CAAA;CAAA,gCA+EcA,MA/Ed,EA+EmC;CAAA,UAAbM,IAAa,uEAAN,IAAM;CAC/B,UAAI,CAACN,MAAL,EAAa;CACb,UAAIM,QAAQ,KAAKX,OAAjB,EAA0B,KAAKA,OAAL,CAAaW,IAAb,CAAkBN,MAAlB,EAA1B,KACK,IAAIM,IAAJ,EAAU,KAAKX,OAAL,GAAe,CAACK,MAAD,CAAf;CAEf,UAAI,KAAKO,OAAT,EAAkB,KAAKA,OAAL,CAAaC,MAAb,CAAoBR,MAApB;CAElB,UAAIA,OAAOO,OAAP,IAAkB,KAAKA,OAA3B,EAAoCP,OAAOO,OAAP,CAAe,KAAKA,OAApB,EAApC,KACK,IAAIP,OAAOO,OAAX,EAAoB;CACvB,cAAM,IAAIlB,YAAJ,CACJ,WADI,yEAGJ,IAHI,EAGEW,MAHF,CAAN;CAKD;CAED,UAAIA,OAAOS,SAAX,EAAsBT,OAAOS,SAAP,CAAiBzC,IAAjB,CAAsB,IAAtB,EAA4BgC,MAA5B;CAEtB,aAAOA,MAAP;CACD;CAED;;;;;;;CApGF;CAAA;CAAA,qCA0GmB;CACf,aAAO,KAAKL,OAAL,CAAa5C,MAApB;CACE,aAAK2D,aAAL,CAAmB,KAAKf,OAAL,CAAa,CAAb,CAAnB;CADF;CAED;CAED;;;;;;;;;CA/GF;CAAA;CAAA,kCAuHgBK,MAvHhB,EAuHwB;CACpB,UAAI,CAACA,MAAL,EAAa;CAEb,WAAKL,OAAL,CAAaf,MAAb,CAAoB,KAAKe,OAAL,CAAagB,OAAb,CAAqBX,MAArB,CAApB,EAAkD,CAAlD;CAEA,UAAIA,OAAOY,OAAX,EAAoBZ,OAAOY,OAAP,CAAe5C,IAAf,CAAoB,IAApB,EAA0BgC,MAA1B;CAEpB,aAAOA,MAAP;CACD,KA/HH;;CAmIE;;;;;;;;;;;;;;;CAnIF;CAAA;CAAA,2BAiJSA,OAjJT,EAiJiB;CACb,WAAKJ,WAAL,CAAiBI,OAAjB;CACA,aAAO,IAAP;CACD;CApJH;;CAAA;;CAAA;CAAA,EAAkCa,kBAAlC;;CCxBA,SAAS,eAAe,CAAC,GAAG,EAAE;GAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC;EACpC;;CAED,kBAAc,GAAG,eAAe;;CCFhC,oBAAc,GAAGvL,KAAkB,CAAC,WAAW,GAAG,UAAU,EAAE,EAAE;GAC9D,IAAI,MAAM,GAAGwL,sBAAG,CAAC,EAAE,CAAC,CAAC;GACrB,IAAI,OAAO,MAAM,IAAI,UAAU,EAAE,MAAM,SAAS,CAAC,EAAE,GAAG,mBAAmB,CAAC,CAAC;GAC3E,OAAOhL,SAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;EAClC,CAAC;;CCJF,eAAc,GAAGD,gBAAuC,CAAC;;CCFzD,iBAAc,GAAGP,WAA0C;;CCE3D,SAAS,qBAAqB,CAAC,GAAG,EAAE,CAAC,EAAE;GACrC,IAAI,IAAI,GAAG,EAAE,CAAC;GACd,IAAI,EAAE,GAAG,IAAI,CAAC;GACd,IAAI,EAAE,GAAG,KAAK,CAAC;GACf,IAAI,EAAE,GAAG,SAAS,CAAC;;GAEnB,IAAI;KACF,KAAK,IAAI,EAAE,GAAGyL,aAAY,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE;OAC7E,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;;OAEpB,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM;MACnC;IACF,CAAC,OAAO,GAAG,EAAE;KACZ,EAAE,GAAG,IAAI,CAAC;KACV,EAAE,GAAG,GAAG,CAAC;IACV,SAAS;KACR,IAAI;OACF,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;MACjD,SAAS;OACR,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC;MAClB;IACF;;GAED,OAAO,IAAI,CAAC;EACb;;CAED,wBAAc,GAAG,qBAAqB;;CC5BtC,SAAS,gBAAgB,GAAG;GAC1B,MAAM,IAAI,SAAS,CAAC,sDAAsD,CAAC,CAAC;EAC7E;;CAED,mBAAc,GAAG,gBAAgB;;CCEjC,SAAS,cAAc,CAAC,GAAG,EAAE,CAAC,EAAE;GAC9B,OAAO,cAAc,CAAC,GAAG,CAAC,IAAI,oBAAoB,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,eAAe,EAAE,CAAC;EACjF;;CAED,iBAAc,GAAG,cAAc;;CCVhB,SAAS,wBAAwB,CAAC,IAAI,EAAE;CACvD,CAAC,IAAI,MAAM,CAAC;CACZ,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;CAE1B,CAAC,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;CACnC,EAAE,IAAI,MAAM,CAAC,UAAU,EAAE;CACzB,GAAG,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC;CAC9B,GAAG,MAAM;CACT,GAAG,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;CACjC,GAAG,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC;CAC9B,GAAG;CACH,EAAE,MAAM;CACR,EAAE,MAAM,GAAG,cAAc,CAAC;CAC1B,EAAE;;CAEF,CAAC,OAAO,MAAM,CAAC;CACf,CAAC;;CChBD;AACA,AACA;CACA,IAAI,IAAI,CAAC;;CAET,IAAI,OAAO,IAAI,KAAK,WAAW,EAAE;CACjC,EAAE,IAAI,GAAG,IAAI,CAAC;CACd,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;CAC1C,EAAE,IAAI,GAAG,MAAM,CAAC;CAChB,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;CAC1C,EAAE,IAAI,GAAG,MAAM,CAAC;CAChB,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;CAC1C,EAAE,IAAI,GAAG,MAAM,CAAC;CAChB,CAAC,MAAM;CACP,EAAE,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;CACnC,CAAC;;CAED,IAAI,MAAM,GAAGC,wBAAQ,CAAC,IAAI,CAAC,CAAC;;CCf5B;CACA;CACA;CACA;CACA;CACA;CACA,IAAI,WAAW,GAAG;CAClB,EAAE,IAAI,EAAE,cAAc,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;CACpF,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;CAC1F,CAAC,CAAC;;CAEF,IAAI,OAAO,GAAG,OAAO,MAAM,KAAK,UAAU,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,GAAG,UAAU,GAAG,EAAE;CACnG,EAAE,OAAO,OAAO,GAAG,CAAC;CACpB,CAAC,GAAG,UAAU,GAAG,EAAE;CACnB,EAAE,OAAO,GAAG,IAAI,OAAO,MAAM,KAAK,UAAU,IAAI,GAAG,CAAC,WAAW,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM,CAAC,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,CAAC;CAC/H,CAAC,CAAC;AACF,AAcA;CACA;CACA;CACA;CACA;CACA,SAAS,aAAa,CAAC,GAAG,EAAE;CAC5B,EAAE,IAAI,CAAC,OAAO,GAAG,KAAK,WAAW,GAAG,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,OAAO,KAAK,CAAC;;CAE3G,EAAE,IAAI,KAAK,GAAG,GAAG,CAAC;CAClB,EAAE,OAAO,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;CAChD,IAAI,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;CACzC,GAAG;;CAEH,EAAE,OAAO,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC;CAC9C,CAAC;;CAED;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,SAAS,WAAW,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE;CACxD,EAAE,IAAI,KAAK,CAAC;;CAEZ,EAAE,IAAI,OAAO,cAAc,KAAK,UAAU,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;CAC/E,IAAI,QAAQ,GAAG,cAAc,CAAC;CAC9B,IAAI,cAAc,GAAG,SAAS,CAAC;CAC/B,GAAG;;CAEH,EAAE,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;CACvC,IAAI,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;CACxC,MAAM,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;CACjE,KAAK;;CAEL,IAAI,OAAO,QAAQ,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;CAC1D,GAAG;;CAEH,EAAE,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE;CACrC,IAAI,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;CAC9D,GAAG;;CAEH,EAAE,IAAI,cAAc,GAAG,OAAO,CAAC;CAC/B,EAAE,IAAI,YAAY,GAAG,cAAc,CAAC;CACpC,EAAE,IAAI,gBAAgB,GAAG,EAAE,CAAC;CAC5B,EAAE,IAAI,aAAa,GAAG,gBAAgB,CAAC;CACvC,EAAE,IAAI,aAAa,GAAG,KAAK,CAAC;;CAE5B,EAAE,SAAS,4BAA4B,GAAG;CAC1C,IAAI,IAAI,aAAa,KAAK,gBAAgB,EAAE;CAC5C,MAAM,aAAa,GAAG,gBAAgB,CAAC,KAAK,EAAE,CAAC;CAC/C,KAAK;CACL,GAAG;;CAEH;CACA;CACA;CACA;CACA;CACA,EAAE,SAAS,QAAQ,GAAG;CACtB,IAAI,IAAI,aAAa,EAAE;CACvB,MAAM,MAAM,IAAI,KAAK,CAAC,oEAAoE,GAAG,6DAA6D,GAAG,yEAAyE,CAAC,CAAC;CACxO,KAAK;;CAEL,IAAI,OAAO,YAAY,CAAC;CACxB,GAAG;;CAEH;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,EAAE,SAAS,SAAS,CAAC,QAAQ,EAAE;CAC/B,IAAI,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;CACxC,MAAM,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;CACjE,KAAK;;CAEL,IAAI,IAAI,aAAa,EAAE;CACvB,MAAM,MAAM,IAAI,KAAK,CAAC,qEAAqE,GAAG,sFAAsF,GAAG,oFAAoF,GAAG,oFAAoF,CAAC,CAAC;CACpW,KAAK;;CAEL,IAAI,IAAI,YAAY,GAAG,IAAI,CAAC;;CAE5B,IAAI,4BAA4B,EAAE,CAAC;CACnC,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;;CAEjC,IAAI,OAAO,SAAS,WAAW,GAAG;CAClC,MAAM,IAAI,CAAC,YAAY,EAAE;CACzB,QAAQ,OAAO;CACf,OAAO;;CAEP,MAAM,IAAI,aAAa,EAAE;CACzB,QAAQ,MAAM,IAAI,KAAK,CAAC,gFAAgF,GAAG,oFAAoF,CAAC,CAAC;CACjM,OAAO;;CAEP,MAAM,YAAY,GAAG,KAAK,CAAC;;CAE3B,MAAM,4BAA4B,EAAE,CAAC;CACrC,MAAM,IAAI,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;CAClD,MAAM,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;CACrC,KAAK,CAAC;CACN,GAAG;;CAEH;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,EAAE,SAAS,QAAQ,CAAC,MAAM,EAAE;CAC5B,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE;CAChC,MAAM,MAAM,IAAI,KAAK,CAAC,iCAAiC,GAAG,0CAA0C,CAAC,CAAC;CACtG,KAAK;;CAEL,IAAI,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE;CAC5C,MAAM,MAAM,IAAI,KAAK,CAAC,qDAAqD,GAAG,iCAAiC,CAAC,CAAC;CACjH,KAAK;;CAEL,IAAI,IAAI,aAAa,EAAE;CACvB,MAAM,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;CAC5D,KAAK;;CAEL,IAAI,IAAI;CACR,MAAM,aAAa,GAAG,IAAI,CAAC;CAC3B,MAAM,YAAY,GAAG,cAAc,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;CAC1D,KAAK,SAAS;CACd,MAAM,aAAa,GAAG,KAAK,CAAC;CAC5B,KAAK;;CAEL,IAAI,IAAI,SAAS,GAAG,gBAAgB,GAAG,aAAa,CAAC;CACrD,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;CAC/C,MAAM,IAAI,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;CAClC,MAAM,QAAQ,EAAE,CAAC;CACjB,KAAK;;CAEL,IAAI,OAAO,MAAM,CAAC;CAClB,GAAG;;CAEH;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,EAAE,SAAS,cAAc,CAAC,WAAW,EAAE;CACvC,IAAI,IAAI,OAAO,WAAW,KAAK,UAAU,EAAE;CAC3C,MAAM,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;CACpE,KAAK;;CAEL,IAAI,cAAc,GAAG,WAAW,CAAC;CACjC,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;CAC5C,GAAG;;CAEH;CACA;CACA;CACA;CACA;CACA;CACA,EAAE,SAAS,UAAU,GAAG;CACxB,IAAI,IAAI,IAAI,CAAC;;CAEb,IAAI,IAAI,cAAc,GAAG,SAAS,CAAC;CACnC,IAAI,OAAO,IAAI,GAAG;CAClB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,MAAM,SAAS,EAAE,SAAS,SAAS,CAAC,QAAQ,EAAE;CAC9C,QAAQ,IAAI,CAAC,OAAO,QAAQ,KAAK,WAAW,GAAG,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,QAAQ,IAAI,QAAQ,KAAK,IAAI,EAAE;CACnH,UAAU,MAAM,IAAI,SAAS,CAAC,wCAAwC,CAAC,CAAC;CACxE,SAAS;;CAET,QAAQ,SAAS,YAAY,GAAG;CAChC,UAAU,IAAI,QAAQ,CAAC,IAAI,EAAE;CAC7B,YAAY,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;CACtC,WAAW;CACX,SAAS;;CAET,QAAQ,YAAY,EAAE,CAAC;CACvB,QAAQ,IAAI,WAAW,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;CACvD,QAAQ,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;CAC5C,OAAO;CACP,KAAK,EAAE,IAAI,CAACC,MAAY,CAAC,GAAG,YAAY;CACxC,MAAM,OAAO,IAAI,CAAC;CAClB,KAAK,EAAE,IAAI,CAAC;CACZ,GAAG;;CAEH;CACA;CACA;CACA,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;;CAEvC,EAAE,OAAO,KAAK,GAAG;CACjB,IAAI,QAAQ,EAAE,QAAQ;CACtB,IAAI,SAAS,EAAE,SAAS;CACxB,IAAI,QAAQ,EAAE,QAAQ;CACtB,IAAI,cAAc,EAAE,cAAc;CAClC,GAAG,EAAE,KAAK,CAACA,MAAY,CAAC,GAAG,UAAU,EAAE,KAAK,CAAC;CAC7C,CAAC;;CCpSD;;;;;;;;AAOA,KAAaC,aAAb;CAAA;CAAA;CACE,yBAAYnF,MAAZ,EAAoB;CAAA;;CAClB,SAAKoF,OAAL,GAAepF,MAAf;CACA,SAAKqF,aAAL,GAAqB,IAArB;CAEA,SAAKC,KAAL,GAAaC,YAAY,YAA8B;CAAA,UAA7BC,KAA6B,uEAArB,CAAC,EAAD,EAAK,EAAL,CAAqB;CAAA,UAAXC,MAAW;CACrDD,YAAM,CAAN,EAASC,OAAOrE,GAAhB,IAAuBqE,OAAOC,IAA9B;CACAF,YAAM,CAAN,IAAWC,OAAOrE,GAAlB;CAEA,aAAOoE,KAAP;CACD,KALY,CAAb;CAOA,SAAK5B,OAAL,GAAe,EAAf;CACD;CAED;;;;;;;;;CAfF;CAAA;CAAA,2BAsBSK,MAtBT,EAsBiB;CACb,WAAKoB,aAAL,GAAqBpB,MAArB;CACD;CAED;;;;;;;CA1BF;CAAA;CAAA,4BAgCU;CACN,WAAKoB,aAAL,GAAqB,IAArB;CACD;CAED;;;;;;;;CApCF;CAAA;CAAA,2BA2CSpC,IA3CT,EA2Ce;CACX,WAAKW,OAAL,CAAaX,IAAb,IAAqB,KAAKoC,aAA1B;CACD;CAED;;;;;;;;CA/CF;CAAA;CAAA,wBAsDMpC,IAtDN,EAsDY;CACR,aAAO,KAAKW,OAAL,CAAaX,IAAb,CAAP;CACD;CAED;;;;;;;;;;;CA1DF;CAAA;CAAA,wBAoEM7B,GApEN,EAoEWsE,IApEX,EAoEiB;CACb,WAAKJ,KAAL,CAAWK,QAAX,CAAoB;CAClBC,cAAM,KADY;CAElBxE,gBAFkB;CAGlBsE;CAHkB,OAApB;CAKD;CAED;;;;;;;;;;;;CA5EF;CAAA;CAAA,wBAuFMtE,GAvFN,EAuFW;CACP,UAAI,CAAC,KAAKkE,KAAL,CAAWO,QAAX,GAAsB,CAAtB,EAAyBzE,GAAzB,CAAL,EAAoC;CAClC,cAAM,IAAI+B,eAAJ,CACJ,eADI,6BAEgB/B,GAFhB,mBAGJ,KAAKiE,aAHD,CAAN;CAKD;;CAED,aAAO,KAAKC,KAAL,CAAWO,QAAX,GAAsB,CAAtB,EAAyBzE,GAAzB,CAAP;CACD;CAED;;;;;;;;;;;CAnGF;CAAA;CAAA,wBA6GMA,GA7GN,EA6GW;CACP,aAAO0E,QAAQ,KAAKR,KAAL,CAAWO,QAAX,GAAsB,CAAtB,EAAyBzE,GAAzB,CAAR,CAAP;CACD;CAED;;;;;;;;CAjHF;CAAA;CAAA,6BAwHuB;CAAA;;CAAA,UAAd2E,OAAc,uEAAJ,EAAI;CACnB,WAAKT,KAAL,CAAWU,SAAX,CAAqB,YAAM;CAAA,mCACE,MAAKV,KAAL,CAAWO,QAAX,EADF;CAAA;CAAA,YAClBH,IADkB;CAAA,YACZO,UADY;;CAEzB,YAAMC,WAAWH,QAAQE,UAAR,CAAjB;CAEA,YAAIC,QAAJ,EAAcA,SAASR,KAAKO,UAAL,CAAT;CACf,OALD;CAMD;CAED;;;;;;CAjIF;CAAA;CAAA,0BAsIe;CACXlD,cAAQoD,IAAR,CAAa,iDAAb;CACA,aAAO,KAAKC,GAAL,uBAAP;CACD;CAED;;;;;;;;;CA3IF;CAAA;CAAA,4BAmJUnD,IAnJV,EAmJgBoD,cAnJhB,EAmJgC;CAC5B,UAAI,KAAKC,GAAL,CAASrD,IAAT,MAAmB3C,SAAvB,EAAkC,KAAK8E,OAAL,CAAavB,WAAb,CAAyBwC,gBAAzB;CACnC;CArJH;;CAAA;CAAA;;CCLA;;;;;;;;;KAQME;;;CACJ;;;;;;;;;;CAcA;;;;;;;CAQA;;;;;CAKY;;CAEZ;;;;;CAKc;;CAEd;;;;;CAKe;CAEf,uBAA+F;CAAA;;CAAA,QAAnFC,MAAmF,uEAA1E,EAA0E;CAAA,QAAtEC,QAAsE,uEAA3DF,UAAUE,QAAiD;CAAA,QAAvCtF,YAAuC,uEAAxBoF,UAAUpF,YAAc;;CAAA;;CAC7F,oFAD6F;;CAAA,qHAhBvF,EAgBuF,cATrF,EASqF,eAFpF,EAEoF;;CAI7F,UAAKqF,MAAL,GAAczG,OAAOmB,cAAcsF,MAAd,EAAsBrF,YAAtB,CAAP,EAA4CsF,QAA5C,CAAd;CACA,QAAI,MAAKD,MAAL,CAAYhC,OAAhB,EAAyB,MAAKA,OAAL,GAAe,IAAIW,aAAJ,qDAAf;CAEzB,UAAKvB,OAAL,GAAe,MAAK4C,MAAL,CAAY5C,OAA3B;;CAEA,UAAK8C,gBAAL;;CAT6F;CAU9F;CAED;;;;;;;;;;;;0BAQKC,SAAS;CACZ,UAAIA,OAAJ,EAAa,KAAKC,KAAL,CAAWrC,IAAX,CAAgBoC,OAAhB;CACb,aAAOhK,QAAQkK,GAAR,CAAY,KAAKD,KAAjB,CAAP;CACD;CAED;;;;;;;;;;2BAOMvC,MAAM;CAAA;;CACV,UAAI,KAAKyC,UAAT,EAAqB,KAAKC,IAAL,GAAYC,IAAZ,CAAiB;CAAA,eAAM3C,KAAK,MAAL,CAAN;CAAA,OAAjB,EAArB,KACKA,KAAK,IAAL;CACN;;CAID;;;;;;;;;;oCAO0B;CAAA,UAAbmC,MAAa,uEAAJ,EAAI;CACxB,WAAKA,MAAL,GAAczG,OAAOyG,MAAP,EAAe,KAAKA,MAApB,CAAd;CACA,aAAO,KAAKA,MAAZ;CACD;;CAID;;;;;;;;;;6BAOQ;CACN,aAAO,IAAI,KAAKjG,WAAT,CAAqB,KAAKiG,MAA1B,EAAkCS,IAAlC,CAAuC,IAAvC,CAAP;CACD;CAED;;;;;;;;;;;;0BASKtD,QAAQuD,WAAW;CACtB,WAAKV,MAAL,oBAAkB7C,OAAO6C,MAAzB;CAEA,UAAI7C,OAAOwD,MAAX,EAAmB,KAAKA,MAAL,GAAcxD,OAAOwD,MAAP,CAAcC,KAAd,CAAoBzD,OAAO6C,MAA3B,CAAd;CACnB,UAAIU,SAAJ,EAAeA;CACf,WAAKR,gBAAL,CAAsB/C,MAAtB;CAEA,aAAO,IAAP;CACD;CAED;;;;;;;;;;;;;;yCAQU3D;;;;;sBACJA,OAAOqH;;;;;;wBAAcrH,OAAOqH,MAAP,CAAcC,MAAd,CAAqBtH,MAArB;;;;wBAEnB,KAAK+G,IAAL;;;;wBACA/G,OAAO+G,IAAP;;;qBAED/G,OAAOmH;;;;;uBACJ,IAAI7E,kBAAJ,CACJ,WADI,EAEJ,2BAFI,EAGJ,IAHI;;;CAORtC,uBAAOqH,MAAP,GAAgB,IAAhB;;wBACM,KAAKvD,WAAL,CAAiB;CAACyD,yBAAOvH;CAAR,iBAAjB,EAAkCuH;;;CACxC,qBAAKJ,MAAL,CAAYK,GAAZ,CAAgBxH,OAAOmH,MAAvB;CACA,qBAAKM,QAAL,CAAclD,IAAd,CAAmBvE,MAAnB;kDAEOA;;;;;;;;;;;;;;CAGT;;;;;;;;;;;;;;0CAQaA;;;;;uBACPA,OAAOqH,MAAP,KAAkB;;;;;;;;;wBAEhB,KAAKN,IAAL;;;;wBACA/G,OAAO+G,IAAP;;;CAEN/G,uBAAOqH,MAAP,GAAgB,IAAhB;CACA,qBAAKF,MAAL,CAAYG,MAAZ,CAAmBtH,OAAOmH,MAA1B;CACA,qBAAKM,QAAL,CAAc5E,MAAd,CAAqB,KAAK4E,QAAL,CAAc7C,OAAd,CAAsB5E,MAAtB,CAArB,EAAoD,CAApD;;;;;;;;;;;;;;CAGF;;;;;;;;;;2BAOMA,QAAQ;CACZ,aAAOA,OAAOwH,GAAP,CAAW,IAAX,CAAP;CACD;;;yBAEGpG,KAAK;CACP,aAAO,KAAKoD,OAAL,CAAaO,GAAb,CAAiB3D,GAAjB,CAAP;CACD;;;yBAEGA,KAAK;CACP,aAAO,KAAKoD,OAAL,CAAa8B,GAAb,CAAiBlF,GAAjB,CAAP;CACD;CAED;;;;;;;yBAIiB;CACf,aAAO,KAAKwF,KAAL,CAAW5F,MAAX,GAAoB,CAA3B;CACD;CAED;;;;;;;;yBAKc;CACZ,UAAI,KAAK0G,QAAT,EAAmB,OAAO,KAAKA,QAAZ;CAEnB,YAAM,IAAIpE,YAAJ,CACJ,WADI,8FAGJ,IAHI,CAAN;CAKD;uBAEWkB,SAAS;CACnB,WAAKkD,QAAL,GAAgBlD,OAAhB;CACD;CAED;;;;;;;yBAIa;CACX,aAAO,KAAKmD,OAAZ;CACD;uBAEUC,MAAM;CACf,WAAKD,OAAL,GAAeC,IAAf;CACA,WAAKD,OAAL,CAAalF,SAAb,GAAyB,IAAzB;CACA,aAAO,KAAKkF,OAAZ;CACD;;;;;;GA1OqBjE;;mCAAlB6C,uBAUc;CAChB3C,WAAS,IADO;CAEhBY,WAAS;CAFO,oBAWI;;CClCxB;;;;;;;;CAQA,SAAS,GAAG,CAAC,MAAM,EAAE,WAAW,mBAAmB;GACjD,IAAI,QAAQ,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;GAC5D,IAAI,IAAI,EAAE,KAAK,CAAC;GAChB,IAAIzK,SAAQ,CAAC,MAAM,CAAC,KAAK,QAAQ,EAAE,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC;GAC9D,IAAI,IAAI,GAAGoE,WAAI,CAAC,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO7D,IAAG,CAAC,IAAI,EAAE,OAAO,CAAC;OAC7D,IAAI,CAAC,KAAK;OACV,IAAI,CAAC,GAAG,KAAK,SAAS;SACpB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;SACvB,SAAS,CAAC;GAChB,IAAIX,SAAQ,CAAC,KAAK,GAAGgC,UAAc,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;EACxF;;AAEDI,QAAO,CAACA,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;;CCnB5C,SAAc,GAAGlC,KAA8B,CAAC,OAAO,CAAC,GAAG,CAAC;;CCD5D,SAAc,GAAGN,KAAyC;;CCE1D,SAAS,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE;GACxC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE;KAC9D,MAAM,GAAGoC,gBAAc,CAAC,MAAM,CAAC,CAAC;KAChC,IAAI,MAAM,KAAK,IAAI,EAAE,MAAM;IAC5B;;GAED,OAAO,MAAM,CAAC;EACf;;CAED,iBAAc,GAAG,cAAc;;;CCH/B,SAAS,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE;GACxC,IAAI,OAAO,OAAO,KAAK,WAAW,IAAIkM,KAAY,EAAE;KAClD,cAAc,GAAG,IAAI,GAAGA,KAAY,CAAC;IACtC,MAAM;KACL,cAAc,GAAG,IAAI,GAAG,SAAS,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE;OAChE,IAAI,IAAI,GAAG,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;OAC3C,IAAI,CAAC,IAAI,EAAE,OAAO;;OAElB,IAAI,IAAI,GAAGvI,0BAAgC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;;OAE5D,IAAI,IAAI,CAAC,GAAG,EAAE;SACZ,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC;;OAED,OAAO,IAAI,CAAC,KAAK,CAAC;MACnB,CAAC;IACH;;GAED,OAAO,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,IAAI,MAAM,CAAC,CAAC;EACnD;;CAED,cAAc,GAAG,IAAI;;;CC7Bd,SAASwI,UAAT,GAAgC;CAAA,oCAATC,OAAS;CAATA,WAAS;CAAA;;CACrC,SAAO,UAAUC,MAAV,EAAkB;CACvB,SAAK,IAAIlH,IAAI,CAAb,EAAgBA,IAAIiH,QAAQ/G,MAA5B,EAAoCF,GAApC,EAAyC;CACvC,UAAMmH,SAASF,QAAQjH,CAAR,CAAf;;CAEA,WAAK,IAAIoH,IAAI,CAAb,EAAgBA,IAAID,OAAOE,GAAP,CAAWnH,MAA/B,EAAuCkH,GAAvC,EAA4C;CAC1C,YAAME,YAAYH,OAAOE,GAAP,CAAWD,CAAX,CAAlB;CAEA/H,eAAOZ,cAAP,CAAsByI,OAAOK,SAA7B,EAAwCD,SAAxC,EAAmD;CACjDrD,eAAKkD,OAAOK,MAAP,CAAcF,SAAd,CAD4C;CAEjDhC,eAAK6B,OAAOM,MAAP,CAAcH,SAAd,CAF4C;CAGjDI,wBAAcP,OAAOO,YAH4B;CAIjDC,sBAAYR,OAAOQ;CAJ8B,SAAnD;CAMD;CACF;CACF,GAfD;CAgBD;AAED,CAAO,SAASxB,IAAT,GAAsB;CAAA,qCAALkB,GAAK;CAALA,OAAK;CAAA;;CAC3B,SAAO;CACLA,YADK;CAELG,UAFK,kBAEErF,IAFF,EAEQ;CACX,aAAO,YAAY;CACjB,eAAO,KAAKkE,MAAL,CAAYlE,IAAZ,CAAP;CACD,OAFD;CAGD,KANI;CAOLsF,UAPK,kBAOEtF,IAPF,EAOQ;CACX,aAAO,UAAUyF,KAAV,EAAiB;CACtB,aAAKvB,MAAL,CAAYlE,IAAZ,EAAkBgE,IAAlB,CAAuByB,KAAvB;CACD,OAFD;CAGD,KAXI;CAYLF,kBAAc,IAZT;CAaLC,gBAAY;CAbP,GAAP;CAeD;AAED,CAAO,SAASE,MAAT,GAAwB;CAAA,qCAALR,GAAK;CAALA,OAAK;CAAA;;CAC7B,SAAO;CACLA,YADK;CAELG,UAFK,kBAEErF,IAFF,EAEQ;CACX,aAAO,YAAY;CACjB,eAAO,KAAKkE,MAAL,CAAYlE,IAAZ,CAAP;CACD,OAFD;CAGD,KANI;CAOLsF,UAPK,kBAOEtF,IAPF,EAOQ;CACX,aAAO,UAAUyF,KAAV,EAAiB;CACtB,aAAKvB,MAAL,CAAYlE,IAAZ,IAAoByF,KAApB;CACD,OAFD;CAGD,KAXI;CAYLF,kBAAc,IAZT;CAaLC,gBAAY;CAbP,GAAP;CAeD;;;;CC3CD;;;;;;;;CAQMG,wBAZLd,WACCb,KAAK,UAAL,EAAiB,UAAjB,EAA6B,YAA7B,EAA2C,OAA3C,CADD,EAEC0B,OAAO,UAAP,EAAmB,UAAnB,CAFD;;;;;;CAaC;;;;;;;;;;;;;;;;;;;;;CAqCA;;;;;;;;;;;CAiBA;4BAEcE,MAA0B;CAAA,UAApBtI,WAAoB,uEAANuI,IAAM;CACtC;CAAA;CAAA;CAAA;CAAA;;CAAA;CAAA;;CAAA;CAAA;CAAA,oCAC8B;CAAA,kBAAtBtC,MAAsB,uEAAb,KAAKA,MAAQ;;CAAA,sCACG,KAAK1C,WAAL,CAAiB;CAC5CiF,0BAAUF,IADkC;CAE5CG,0BAAUxC,OAAOwC;CAF2B,eAAjB,CADH;CAAA,kBACnBD,QADmB,qBACnBA,QADmB;CAAA,kBACTC,QADS,qBACTA,QADS;;CAM1B,qBAAO,KAAKlF,WAAL,CAAiB;CAAC8D,sBAAM,IAAIrH,WAAJ,CAAgBwI,QAAhB,EAA0BC,QAA1B;CAAP,eAAjB,EAA8DpB,IAArE;CACD;CARH;;CAAA;;CAAA;CAAA,UAAqBgB,aAArB;CAAA;CAUD;;;4BAEaC,MAAMrC,QAAQjG,aAAa;CACvC,aAAO,KAAKqI,cAAcK,MAAd,CAAqBJ,IAArB,EAA2BtI,WAA3B,CAAL,EAA8CiG,MAA9C,CAAP;CACD;;;0BAEWoB,MAAmB;CAAA,UAAbpB,MAAa,uEAAJ,EAAI;CAC7BA,aAAO0C,KAAP,GAAe,KAAf;CAEA,UAAMzG,YAAY,IAAImG,aAAJ,CAAkBpC,MAAlB,CAAlB;CAEA/D,gBAAU0E,MAAV,GAAmBS,IAAnB;CACAnF,gBAAU0G,IAAV;CAEA,aAAO1G,SAAP;CACD;;;CAED,yBAAY+D,MAAZ,EAAkG;CAAA;;CAAA,QAA9EC,QAA8E,uEAAnEmC,cAAcnC,QAAqD;CAAA,QAA3CtF,YAA2C,uEAA5ByH,cAAczH,YAAc;;CAAA;;CAChG,uFAAMqF,MAAN,EAAcC,QAAd,EAAwBtF,YAAxB;;CAEA,QAAI,MAAKqF,MAAL,CAAY0C,KAAhB,EAAuB;CACrB,UAAMA,QAAQ,MAAKA,KAAL,CAAW,MAAK1C,MAAhB,CAAd;;CAEA,UAAI,CAAC0C,KAAL,EAAY;CACV,cAAM,IAAI5G,kBAAJ,CACJ,eADI,EAEJ,2FAFI,sDAAN;CAKD;;CAED,UAAI4G,iBAAiBvM,OAArB,EAA8B;CAC5B,cAAKoK,IAAL,CAAUmC,KAAV;;CAEA,cAAKnC,IAAL,CAAU,IAAIpK,OAAJ,CAAY,mBAAW;CAC/BuM,gBAAMlC,IAAN,CAAW,kBAAU;CACnB,kBAAKG,MAAL,GAAcA,MAAd;;CACA,kBAAKgC,IAAL,GAAYnC,IAAZ,CAAiBoC,OAAjB;CACD,WAHD;CAID,SALS,CAAV;CAMD,OATD,MASO;CACL,cAAKjC,MAAL,GAAc+B,KAAd;;CACA,cAAKnC,IAAL,CAAU,MAAKoC,IAAL,EAAV;CACD;CACF;;CAED,UAAKE,YAAL,CAAkB,eAAlB;;CA7BgG;CA8BjG;;CAID;;;;;;;;;;6BAMQ;CACN,YAAM,IAAI/G,kBAAJ,CACJ,eADI,EAEJ,0CAFI,EAGJ,IAHI,CAAN;CAKD;CAED;;;;;;;;;;4BAOO;CAAA;;CACL,aAAO,IAAI3F,OAAJ,CAAY,mBAAW;CAC5B;CACA;CAF4B,4BAGgB,OAAK6J,MAHrB;CAAA,YAGrB8C,QAHqB,iBAGrBA,QAHqB;CAAA,YAGXC,QAHW,iBAGXA,QAHW;CAAA,YAGDC,KAHC,iBAGDA,KAHC;CAAA,YAGMC,MAHN,iBAGMA,MAHN;;CAK5B,eAAKH,QAAL,CAAclD,GAAd,CAAkBkD,SAASI,CAA3B,EAA8BJ,SAASK,CAAvC,EAA0CL,SAASM,CAAnD;;CACA,eAAKL,QAAL,CAAcnD,GAAd,CAAkBmD,SAASG,CAA3B,EAA8BH,SAASI,CAAvC,EAA0CJ,SAASK,CAAnD;;CACA,eAAKJ,KAAL,CAAWpD,GAAX,CAAeoD,MAAME,CAArB,EAAwBF,MAAMG,CAA9B,EAAiCH,MAAMI,CAAvC;;CAEA,eAAKzC,MAAL,CAAY0C,UAAZ,GAAyBJ,OAAOK,IAAhC;CACA,eAAK3C,MAAL,CAAY4C,aAAZ,GAA4BN,OAAOO,OAAnC;;CAEA,eAAKlG,WAAL,CAAiB;CAACmG,kBAAQ;CAAT,SAAjB;;CAEAb,gBAAQ,MAAR,EAd4B;CAgB7B,OAhBM,CAAP;CAiBD;;CAID;;;;;;;;;;6BAOKzF,QAAQ;CAAA;;CACX,uFAAkBA,MAAlB,EAA0B,YAAM;CAC9B,eAAK2F,QAAL,CAAcrC,IAAd,CAAmBtD,OAAO2F,QAA1B;;CACA,eAAKC,QAAL,CAActC,IAAd,CAAmBtD,OAAO4F,QAA1B;;CACA,eAAKW,UAAL,CAAgBjD,IAAhB,CAAqBtD,OAAOuG,UAA5B;CACD,OAJD;CAKD;CAED;;;;;;;;;;2BAOMnB,UAAUC,UAAU;CACxB,UAAMmB,OAAO,IAAI,KAAK5J,WAAT,CAAqB;CAAC2I,eAAO;CAAR,OAArB,EAAqCjC,IAArC,CAA0C,IAA1C,CAAb;CAEA,UAAI8B,QAAJ,EAAcoB,KAAKpB,QAAL,GAAgBoB,KAAKpB,QAAL,CAAc3B,KAAd,EAAhB;CACd,UAAI4B,QAAJ,EAAcmB,KAAKnB,QAAL,GAAgBmB,KAAKnB,QAAL,CAAc5B,KAAd,EAAhB;CAEd,aAAO+C,IAAP;CACD;;;;;;GA/LyB5D;;mCAAtBqC,4CAsBCrC,UAAUE;CAEbyC,SAAO;CACPH,YAAU;CACVC,YAAU;CAEVS,UAAQ;CACNK,UAAM,IADA;CAENE,aAAS;CAFH;CAKRV,YAAU;CAACI,OAAG,CAAJ;CAAOC,OAAG,CAAV;CAAaC,OAAG;CAAhB;CACVL,YAAU;CAACG,OAAG,CAAJ;CAAOC,OAAG,CAAV;CAAaC,OAAG;CAAhB;CACVJ,SAAO;CAACE,OAAG,CAAJ;CAAOC,OAAG,CAAV;CAAaC,OAAG;CAAhB;sBAca;CACpBN,YAAU,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,CADU;CAEpBC,YAAU,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,CAFU;CAGpBC,SAAO,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX;CAHa;;;;CC3DxB;;;;;;;;CAQMY,2BAXLtC,WACCb,KAAK,UAAL,EAAiB,UAAjB,EAA6B,YAA7B,EAA2C,QAA3C,CADD;;;;;;CAYC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmEA;;;;;;;;;;0BAeYoD,OAAuC;CAAA,UAAhC7D,MAAgC,uEAAvB,EAAuB;CAAA,UAAnB8D,UAAmB,uEAAN,IAAM;CACjD9D,aAAO0C,KAAP,GAAe,KAAf;CAEA,UAAMzG,YAAY,IAAI2H,cAAJ,CAAmB5D,MAAnB,CAAlB;CAEA/D,gBAAU0E,MAAV,GAAmBkD,KAAnB;CACA5H,gBAAU0G,IAAV;CACA,UAAImB,UAAJ,EAAgB7H,UAAU6H,UAAV;CAEhB,aAAO7H,SAAP;CACD;;;CAED,0BAAY+D,MAAZ,EAAoG;CAAA;;CAAA,QAAhFC,QAAgF,uEAArE2D,eAAe3D,QAAsD;CAAA,QAA5CtF,YAA4C,uEAA7BiJ,eAAejJ,YAAc;;CAAA;;CAClG,wFAAMqF,MAAN,EAAcC,QAAd,EAAwBtF,YAAxB;;CAEA,QAAI,MAAKqF,MAAL,CAAY0C,KAAhB,EAAuB;CACrB,UAAMA,QAAQ,MAAKA,KAAL,CAAW,MAAK1C,MAAhB,CAAd;;CAEA,UAAI,CAAC0C,KAAL,EAAY;CACV,cAAM,IAAI5G,kBAAJ,CACJ,gBADI,EAEJ,2FAFI,sDAAN;CAKD;;CAED,UAAI4G,iBAAiBvM,OAArB,EAA8B;CAC5BuM,cAAMlC,IAAN,CAAW,kBAAU;CACnB,gBAAKG,MAAL,GAAcA,MAAd;CACD,SAFD;CAGD,OAJD,MAIO,MAAKA,MAAL,GAAc+B,KAAd;;CAEP,YAAKnC,IAAL,CAAU,MAAKoC,IAAL,EAAV;CACD;;CAED,UAAKE,YAAL,CAAkB,eAAlB;;CAvBkG;CAwBnG;;CAID;;;;;;;;;;;6BAOQ;CACN,YAAM,IAAI/G,kBAAJ,CACJ,eADI,EAEJ,0CAFI,EAGJ,IAHI,CAAN;CAKD;CAED;;;;;;;;;;4BAOO;CAAA;;CACL,aAAO,IAAI3F,OAAJ,CAAY,mBAAW;CAC5B,eAAK4N,KAAL,CAAW,YAAM;CAAA,8BACc,OAAK/D,MADnB;CAAA,cACR8C,QADQ,iBACRA,QADQ;CAAA,cACEC,QADF,iBACEA,QADF;;CAGf,iBAAKD,QAAL,CAAclD,GAAd,CAAkBkD,SAASI,CAA3B,EAA8BJ,SAASK,CAAvC,EAA0CL,SAASM,CAAnD;;CACA,iBAAKL,QAAL,CAAcnD,GAAd,CAAkBmD,SAASG,CAA3B,EAA8BH,SAASI,CAAvC,EAA0CJ,SAASK,CAAnD;;CAEA,iBAAK9F,WAAL,CAAiB;CAACmG,oBAAQ;CAAT,WAAjB;;CAEAb,kBAAQ,MAAR;CACD,SATD;CAUD,OAXM,CAAP;CAYD;CAED;;;;;;;;;kCAMa;CAAA,UACJjC,MADI,GACwB,IADxB,CACJA,MADI;CAAA,UACasC,MADb,GACwB,IADxB,CACIjD,MADJ,CACaiD,MADb;CAGXtC,aAAO0C,UAAP,GAAoBJ,OAAOK,IAA3B;CACA3C,aAAOsC,MAAP,CAAce,OAAd,CAAsBC,KAAtB,GAA8BhB,OAAOe,OAAP,CAAeC,KAA7C;CACAtD,aAAOsC,MAAP,CAAce,OAAd,CAAsBE,MAAtB,GAA+BjB,OAAOe,OAAP,CAAeE,MAA9C;CACAvD,aAAOsC,MAAP,CAAckB,IAAd,GAAqBlB,OAAOkB,IAA5B;CACAxD,aAAOsC,MAAP,CAAcmB,MAAd,GAAuBnB,OAAOmB,MAA9B;CAEA,UAAMC,eAAe1D,OAAOsC,MAAP,CAAcqB,MAAnC;CATW,UAUJA,MAVI,GAUMrB,MAVN,CAUJqB,MAVI;CAYXD,mBAAaE,IAAb,GAAoBD,OAAOC,IAA3B;CACAF,mBAAaG,GAAb,GAAmBF,OAAOE,GAA1B;CACAH,mBAAaI,GAAb,GAAmBH,OAAOG,GAA1B;CAEAJ,mBAAaK,IAAb,GAAoBJ,OAAOI,IAA3B;CACAL,mBAAaM,KAAb,GAAqBL,OAAOK,KAA5B;CACAN,mBAAaO,GAAb,GAAmBN,OAAOM,GAA1B;CACAP,mBAAaQ,MAAb,GAAsBP,OAAOO,MAA7B;CACD;;CAID;;;;;;;;;;6BAOK1H,QAAQ;CAAA;;CACX,wFAAkBA,MAAlB,EAA0B,YAAM;CAC9B,YAAI,OAAKqE,MAAT,EAAiB,OAAKA,MAAL,CAAYf,IAAZ,CAAiBtD,OAAOqE,MAAP,EAAjB;;CAEjB,eAAKsB,QAAL,CAAcrC,IAAd,CAAmBtD,OAAO2F,QAA1B;;CACA,eAAKC,QAAL,CAActC,IAAd,CAAmBtD,OAAO4F,QAA1B;;CACA,eAAKW,UAAL,CAAgBjD,IAAhB,CAAqBtD,OAAOuG,UAA5B;CACD,OAND;CAOD;CAED;;;;;;;;;;6BAOQ;CACN,aAAO,IAAI,KAAK3J,WAAT,CAAqB;CAAC2I,eAAO;CAAR,OAArB,EAAqCjC,IAArC,CAA0C,IAA1C,CAAP;CACD;;;;;;GAxN0BV;;mCAAvB6D,6CAqCC7D,UAAUE;CAEbyC,SAAO;CAEPO,UAAQ;CACNK,UAAM,IADA;CAGNa,UAAM,CAHA;CAINC,YAAQ,CAJF;CAMNJ,aAAS;CACPC,aAAO,IADA;CAEPC,cAAQ;CAFD,KANH;CAWNI,YAAQ;CACNC,YAAM,IADA;CAENC,WAAK,GAFC;CAGNC,WAAK,EAHC;CAKNG,WAAK,GALC;CAMNC,cAAQ,CAAC,GANH;CAONH,YAAM,CAAC,GAPD;CAQNC,aAAO;CARD;CAXF;CAuBR7B,YAAU;CAACI,OAAG,CAAJ;CAAOC,OAAG,CAAV;CAAaC,OAAG;CAAhB;CACVL,YAAU;CAACG,OAAG,CAAJ;CAAOC,OAAG,CAAV;CAAaC,OAAG;CAAhB;sBAaU;CACpBN,YAAU,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,CADU;CAEpBC,YAAU,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX;CAFU;;;;CCtFxB;;;;;;;;CAQM+B,4BAXLxD,WACCb,KAAK,UAAL,EAAiB,UAAjB,EAA6B,YAA7B,EAA2C,QAA3C,CADD;;;;;;CAYC;;;;;;;;;;;;;CAqBA;;;;;;;;;;;0BAiBY6D,QAAqB;CAAA,UAAbtE,MAAa,uEAAJ,EAAI;CAC/BA,aAAO0C,KAAP,GAAe,KAAf;CAEA,UAAMzG,YAAY,IAAI6I,eAAJ,CAAoB9E,MAApB,CAAlB;CAEA/D,gBAAU0E,MAAV,GAAmB2D,MAAnB;CACArI,gBAAU0G,IAAV;CAEA,aAAO1G,SAAP;CACD;;;CAED,2BAAY+D,MAAZ,EAAsG;CAAA;;CAAA,QAAlFC,QAAkF,uEAAvE6E,gBAAgB7E,QAAuD;CAAA,QAA7CtF,YAA6C,uEAA9BmK,gBAAgBnK,YAAc;;CAAA;;CACpG,yFAAMqF,MAAN,EAAcC,QAAd,EAAwBtF,YAAxB;;CAEA,QAAI,MAAKqF,MAAL,CAAY0C,KAAhB,EAAuB;CACrB,UAAMA,QAAQ,MAAKA,KAAL,CAAW,MAAK1C,MAAhB,CAAd;;CAEA,UAAI,CAAC0C,KAAL,EAAY;CACV,cAAM,IAAI5G,kBAAJ,CACJ,iBADI,EAEJ,2FAFI,sDAAN;CAKD;;CAED,UAAI4G,iBAAiBvM,OAArB,EAA8B;CAC5BuM,cAAMlC,IAAN,CAAW,kBAAU;CACnB,gBAAKG,MAAL,GAAcA,MAAd;CACD,SAFD;CAGD,OAJD,MAIO,MAAKA,MAAL,GAAc+B,KAAd;;CAEP,YAAKnC,IAAL,CAAU,MAAKoC,IAAL,EAAV;CACD;;CAED,UAAKE,YAAL,CAAkB,eAAlB;;CAvBoG;CAwBrG;;CAID;;;;;;;;;;;6BAOQ;CACN,YAAM,IAAI/G,kBAAJ,CACJ,iBADI,EAEJ,0CAFI,EAGJ,IAHI,CAAN;CAKD;CAED;;;;;;;;;;4BAOO;CAAA;;CACL,aAAO,IAAI3F,OAAJ,CAAY,mBAAW;CAC5B,eAAK4N,KAAL,CAAW,YAAM;CACf,iBAAKjB,QAAL,CAAclD,GAAd,CAAkB,OAAKI,MAAL,CAAY8C,QAAZ,CAAqBI,CAAvC,EAA0C,OAAKlD,MAAL,CAAY8C,QAAZ,CAAqBK,CAA/D,EAAkE,OAAKnD,MAAL,CAAY8C,QAAZ,CAAqBM,CAAvF;;CACA,iBAAKL,QAAL,CAAcnD,GAAd,CAAkB,OAAKI,MAAL,CAAY+C,QAAZ,CAAqBG,CAAvC,EAA0C,OAAKlD,MAAL,CAAY+C,QAAZ,CAAqBI,CAA/D,EAAkE,OAAKnD,MAAL,CAAY+C,QAAZ,CAAqBK,CAAvF;;CAEA,iBAAK9F,WAAL,CAAiB;CAACmG,oBAAQ;CAAT,WAAjB;;CAEAb,kBAAQ,MAAR;CACD,SAPD;CAQD,OATM,CAAP;CAUD;CAED;;;;;;;;;;6BAOKzF,QAAQ;CAAA;;CACX,yFAAkBA,MAAlB,EAA0B,YAAM;CAC9B,YAAI,OAAKqE,MAAT,EAAiB,OAAKA,MAAL,CAAYf,IAAZ,CAAiBtD,OAAOqE,MAAP,EAAjB;;CAEjB,eAAKsB,QAAL,CAAcrC,IAAd,CAAmBtD,OAAO2F,QAA1B;;CACA,eAAKC,QAAL,CAActC,IAAd,CAAmBtD,OAAO4F,QAA1B;;CACA,eAAKW,UAAL,CAAgBjD,IAAhB,CAAqBtD,OAAOuG,UAA5B;CACD,OAND;CAOD;CAED;;;;;;;;;;6BAOQ;CACN,aAAO,IAAI,KAAK3J,WAAT,CAAqB;CAAC2I,eAAO;CAAR,OAArB,EAAqCjC,IAArC,CAA0C,IAA1C,CAAP;CACD;;;;;;GA3I2BV;;mCAAxB+E,8CAcC/E,UAAUE;CAEbyC,SAAO;CAEPI,YAAU;CAACI,OAAG,CAAJ;CAAOC,OAAG,CAAV;CAAaC,OAAG;CAAhB;CACVL,YAAU;CAACG,OAAG,CAAJ;CAAOC,OAAG,CAAV;CAAaC,OAAG;CAAhB;sBAcU;CACpBN,YAAU,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,CADU;CAEpBC,YAAU,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,CAFU;CAGpBC,SAAO,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX;CAHa;;;;CCjDjB,IAAM+B,SAAS;CACpBC,UAAQ,OAAOA,MAAP,KAAkB,WAAlB,GAAgCnR,MAAhC,GAAyCmR;CAD7B,CAAf;;CCKP;;;;;;;;;KAQMC;;;CACJ;;;;;;CAOA;;;;;;CAQA,iBAA0B;CAAA;;CAAA,QAAd7H,OAAc,uEAAJ,EAAI;;CAAA;;CACxBb,YAAQ2I,GAAR,mBAAuBC,OAAvB;CAEA;;CAHwB,sGAVhB,IAUgB,YAFlB,EAEkB;;CAIxB,UAAKnH,OAAL,GAAe,IAAIW,aAAJ,qDAAf;CACA,UAAKvB,OAAL,GAAeA,OAAf;;CAEA,UAAK8C,gBAAL;;CAPwB;CAQzB;;CAID;;;;;;;;;6BAKQ;CACN,UAAMkF,mBAAoB,YAAM;CAC9B,eAAOL,OAAOC,MAAP,CAAcK,qBAAd,IACFN,OAAOC,MAAP,CAAcM,2BADZ,IAEFP,OAAOC,MAAP,CAAcO,wBAFZ,IAGF,UAAU7F,QAAV,EAAoB;CACrBqF,iBAAOC,MAAP,CAAcQ,UAAd,CAAyB9F,QAAzB,EAAmC,OAAO,EAA1C;CACD,SALH;CAMD,OAPwB,EAAzB;;CADM,UAUC+F,KAVD,GAUmB,IAVnB,CAUCA,KAVD;CAAA,UAUQC,OAVR,GAUmB,IAVnB,CAUQA,OAVR;;CAYN,eAASxP,OAAT,GAAmB;CACjBkP,yBAAiBlP,OAAjB;CACA,YAAI,CAACwP,OAAL,EAAc;;CAEd,aAAK,IAAIpL,IAAI,CAAR,EAAWqL,KAAKF,MAAMjL,MAA3B,EAAmCF,IAAIqL,EAAvC,EAA2CrL,GAA3C,EAAgD;CAC9C,cAAMsL,IAAIH,MAAMnL,CAAN,CAAV;CACA,cAAIsL,EAAEF,OAAN,EAAeE,EAAEC,OAAF,CAAUD,EAAEE,KAAZ;CAChB;CACF;;CAED,WAAKJ,OAAL,GAAe,IAAf;CACAxP;CACD;CAED;;;;;;;;4BAKO;CACL,WAAKwP,OAAL,GAAe,KAAf;CACD;CAED;;;;;;;;;;;;;;;;;;;6BAgBQK,MAAM;CAAA;;CACZ,aAAO,IAAI5P,OAAJ,CAAY,mBAAW;CAC5B,eAAKsP,KAAL,CAAW1H,IAAX,CAAgBgI,IAAhB;;CACAnD,gBAAQmD,IAAR;CACD,OAHM,CAAP;CAID;CAED;;;;;;;;;;gCAOWA,MAAM;CAAA;;CACf,aAAO,IAAI5P,OAAJ,CAAY,mBAAW;CAC5B,YAAM6P,QAAQ,OAAKP,KAAL,CAAWrH,OAAX,CAAmB2H,IAAnB,CAAd;;CACA,YAAIC,UAAU,CAAC,CAAf,EAAkB,OAAKP,KAAL,CAAWpJ,MAAX,CAAkB2J,KAAlB,EAAyB,CAAzB;CAElBpD,gBAAQmD,IAAR;CACD,OALM,CAAP;CAMD;;;yBAEGnL,KAAK;CACP,aAAO,KAAKoD,OAAL,CAAaO,GAAb,CAAiB3D,GAAjB,CAAP;CACD;;;yBAEGA,KAAK;CACP,aAAO,KAAKoD,OAAL,CAAa8B,GAAb,CAAiBlF,GAAjB,CAAP;CACD;;;;;;GAjHesC;;CCXlB;;;;;;;;KAOM+I;;;CACJ,gBAAYpI,IAAZ,EAAmC;CAAA,QAAjBqI,QAAiB,uEAAN,IAAM;;CAAA;;CACjC,SAAKrI,IAAL,GAAYA,IAAZ;CACA,SAAKiI,KAAL,GAAaI,WAAW,IAAIC,KAAJ,EAAX,GAAyB,IAAtC;CACA,SAAKT,OAAL,GAAe,KAAf;CACD;;CAID;;;;;;;;;;;2BAOMU,OAAO;CACX,UAAI,KAAKV,OAAT,EAAkB;CAElB,UAAIU,KAAJ,EAAWA,MAAMC,OAAN,CAAc,IAAd;CAEX,UAAI,KAAKP,KAAT,EAAgB,KAAKA,KAAL,CAAWQ,KAAX;CAChB,WAAKZ,OAAL,GAAe,IAAf;CACD;CAED;;;;;;;;;;0BAOKU,OAAO;CACV,UAAI,CAAC,KAAKV,OAAV,EAAmB;CAEnB,UAAI,KAAKI,KAAT,EAAgB,KAAKA,KAAL,CAAWS,IAAX;CAChB,WAAKb,OAAL,GAAe,KAAf;CAEA,UAAIU,KAAJ,EAAWA,MAAMI,UAAN,CAAiB,IAAjB;CACZ;;CAID;;;;;;;;;;+BAOU;CACR,aAAO,KAAK3I,IAAL,CAAU,KAAKiI,KAAf,CAAP;CACD;;;;;;CC7DH;;CCGA;;;;;;;;;;;;;;;;KAeMW;;;CAQJ,6BAAyB;CAAA,QAAbzG,MAAa,uEAAJ,EAAI;;CAAA;;CAAA,wFACjBA,MADiB,EACTyG,gBAAaxG,QADJ;CAExB;;;;6BAEkB;CAAA,UAAbD,MAAa,uEAAJ,EAAI;CACjB,aAAO,KAAK1C,WAAL,CAAiB;CAACuG,eAAO,IAAI6C,YAAJ,CAC9B1G,OAAO2G,KADuB,EAE9B3G,OAAO4G,SAFuB;CAAR,OAAjB,EAGH/C,KAHJ;CAID;;;;;;GAjBwBD;;kBAArB6C,6CAEC7C,eAAe3D;CAElB0G,SAAO;CACPC,aAAW;;;CCpBf;;;;;;;;;;;;;;;;;;;KAkBMC;;;CAQJ,iCAAyB;CAAA;;CAAA,QAAb7G,MAAa,uEAAJ,EAAI;;CAAA;;CACvB,6FAAMA,MAAN,EAAc6G,oBAAiB5G,QAA/B;;CACA,UAAK6D,UAAL;;CAFuB;CAGxB;;;;6BAEkB;CAAA,UAAb9D,MAAa,uEAAJ,EAAI;CACjB,aAAO,KAAK1C,WAAL,CAAiB;CAACuG,eAAO,IAAIiD,gBAAJ,CAC9B9G,OAAO2G,KADuB,EAE9B3G,OAAO4G,SAFuB;CAAR,OAAjB,EAGH/C,KAHJ;CAID;;;;;;GAlB4BD;;kBAAzBiD,iDAECjD,eAAe3D;CAElB0G,SAAO;CACPC,aAAW;;;CCvBf;;;;;;;;;;;;;;;;;;KAiBMG;;;CASJ,gCAAyB;CAAA,QAAb/G,MAAa,uEAAJ,EAAI;;CAAA;;CAAA,2FACjBA,MADiB,EACT+G,mBAAgB9G,QADP;CAExB;;;;6BAEkB;CAAA,UAAbD,MAAa,uEAAJ,EAAI;CACjB,aAAO,KAAK1C,WAAL,CAAiB;CAACuG,eAAO,IAAImD,eAAJ,CAC9BhH,OAAOiH,QADuB,EAE9BjH,OAAOkH,WAFuB,EAG9BlH,OAAO4G,SAHuB;CAAR,OAAjB,EAIH/C,KAJJ;CAKD;;;;;;GAnB2BD;;kBAAxBmD,gDAECnD,eAAe3D;CAElBgH,YAAU;CACVC,eAAa;CACbN,aAAW;;;CCvBf;;;;;;;;;;;;;;;;;;KAiBMO;;;CAUJ,2BAAyB;CAAA;;CAAA,QAAbnH,MAAa,uEAAJ,EAAI;;CAAA;;CACvB,uFAAMA,MAAN,EAAcmH,cAAWlH,QAAzB;;CACA,UAAK6D,UAAL;;CAFuB;CAGxB;;;;6BAEkB;CAAA,UAAb9D,MAAa,uEAAJ,EAAI;CACjB,aAAO,KAAK1C,WAAL,CAAiB;CAACuG,eAAO,IAAIuD,UAAJ,CAC9BpH,OAAO2G,KADuB,EAE9B3G,OAAO4G,SAFuB,EAG9B5G,OAAOqH,QAHuB,EAI9BrH,OAAOsH,KAJuB;CAAR,OAAjB,EAKHzD,KALJ;CAMD;;;;;;GAtBsBD;;kBAAnBuD,2CAECvD,eAAe3D;CAElB0G,SAAO;CACPC,aAAW;CACXS,YAAU;CACVC,SAAO;;;CCxBX;;;;;;;;;;;;;;;;;;;;;KAoBMC;;;CAYJ,0BAAyB;CAAA;;CAAA,QAAbvH,MAAa,uEAAJ,EAAI;;CAAA;;CACvB,sFAAMA,MAAN,EAAcuH,aAAUtH,QAAxB;;CACA,UAAK6D,UAAL;;CAFuB;CAGxB;;;;6BAEkB;CAAA,UAAb9D,MAAa,uEAAJ,EAAI;CACjB,aAAO,KAAK1C,WAAL,CAAiB;CAACuG,eAAO,IAAI2D,SAAJ,CAC9BxH,OAAO2G,KADuB,EAE9B3G,OAAO4G,SAFuB,EAG9B5G,OAAOqH,QAHuB,EAI9BrH,OAAOyH,KAJuB,EAK9BzH,OAAO0H,QALuB,EAM9B1H,OAAOsH,KANuB;CAAR,OAAjB,EAOHzD,KAPJ;CAQD;;;;;;GA1BqBD;;kBAAlB2D,0CAEC3D,eAAe3D;CAElB0G,SAAO;CACPC,aAAW;CACXS,YAAU;CACVI,SAAOE,KAAKC,EAAL,GAAU;CACjBF,YAAU;CACVJ,SAAO;;;KC7BLO;;;CAUJ,uBAAyB;CAAA,QAAb7H,MAAa,uEAAJ,EAAI;;CAAA;;CAAA,kFACjBA,MADiB,EACT6H,UAAU5H,QADD;CAExB;;;;6BAEkB;CAAA,UAAbD,MAAa,uEAAJ,EAAI;CACjB,aAAO,KAAK1C,WAAL,CAAiB;CAACuG,eAAO,IAAIiE,aAAJ,CAC9B9H,OAAO2G,KADuB,EAE9B3G,OAAO4G,SAFuB,EAG9B5G,OAAOiE,KAHuB,EAI9BjE,OAAOkE,MAJuB;CAAR,OAAjB,EAKHL,KALJ;CAMD;;;;;;GArBqBD;;kBAAlBiE,wCAECjE,eAAe3D;CAElB0G,SAAO;CACPC,aAAW;CACX3C,SAAO;CACPC,UAAQ;;;CCVZ;;CCGA;;;;;;;;;;;;;;;;;;;;;;;KAsBM6D;;;CAEJ;;;;;;;;;;;;;CAqBA,2BAAyB;CAAA,QAAb/H,MAAa,uEAAJ,EAAI;;CAAA;;CAAA,sFACjBA,MADiB,EACT+H,cAAW9H,QADF;CAExB;;;;6BAEkB;CAAA,UAAbD,MAAa,uEAAJ,EAAI;CACjB,aAAO,KAAK1C,WAAL,CAAiB;CAACgH,gBAAQ,IAAI0D,UAAJ,CAC/BhI,OAAOuE,IADwB,EAE/BvE,OAAOwE,GAFwB,EAG/BxE,OAAOiI,cAHwB;CAAT,OAAjB,EAIH3D,MAJJ;CAKD;;;;;;GAjCsBQ;;kBAAnBiD,2CAgBCjD,gBAAgB7E;CAEnBsE,QAAM;CACNC,OAAK;CACLyD,kBAAgB;;;CCzCpB;;;;;;;;;;;;;;;;;;;;;KAoBMC;;;CACJ;;;;;;;;;;;;;;CAyBA,mCAAyB;CAAA,QAAblI,MAAa,uEAAJ,EAAI;;CAAA;;CAAA,8FACjBA,MADiB,EACTkI,sBAAmBjI,QADV;CAExB;;;;6BAEkB;CAAA,UAAbD,MAAa,uEAAJ,EAAI;CACjB,aAAO,KAAK1C,WAAL,CAAiB;CAACgH,gBAAQ,IAAI6D,kBAAJ,CAC/BnI,OAAO0E,IADwB,EAE/B1E,OAAO2E,KAFwB,EAG/B3E,OAAO4E,GAHwB,EAI/B5E,OAAO6E,MAJwB,EAK/B7E,OAAOuE,IALwB,EAM/BvE,OAAOwE,GANwB;CAAT,OAAjB,EAOHF,MAPJ;CAQD;;;;;;GAvC8BQ;;kBAA3BoD,mDAgBCpD,gBAAgB7E;CAEnBsE,QAAM;CACNC,OAAK;CACLE,QAAMK,OAAOC,MAAP,CAAcoD,UAAd,GAA2B,CAAC;CAClCzD,SAAOI,OAAOC,MAAP,CAAcoD,UAAd,GAA2B;CAClCxD,OAAKG,OAAOC,MAAP,CAAcqD,WAAd,GAA4B;CACjCxD,UAAQE,OAAOC,MAAP,CAAcqD,WAAd,GAA4B,CAAC;;;CC3CzC;;;;;;;;;;;;;;;;;;;;;;KAqBMC;;;CACJ;;;;;;;;;;;;CAqBA,kCAAyB;CAAA,QAAbtI,MAAa,uEAAJ,EAAI;;CAAA;;CAAA,6FACjBA,MADiB,EACTsI,qBAAkBrI,QADT;CAExB;;;;6BAEkB;CAAA,UAAbD,MAAa,uEAAJ,EAAI;CACjB,aAAO,KAAK1C,WAAL,CAAiB;CAACgH,gBAAQ,IAAIiE,iBAAJ,CAC/BvI,OAAOyE,GADwB,EAE/BzE,OAAOwI,MAFwB,EAG/BxI,OAAOuE,IAHwB,EAI/BvE,OAAOwE,GAJwB;CAAT,OAAjB,EAKHF,MALJ;CAMD;;;;;;GAjC6BQ;;kBAA1BwD,kDAcCxD,gBAAgB7E;CAEnBsE,QAAM;CACNC,OAAK;CACLC,OAAK;CACL+D,UAAQzD,OAAOC,MAAP,CAAcoD,UAAd,GAA2BrD,OAAOC,MAAP,CAAcqD;;;CC5CrD;;CCQA;;;;;;;;;;;;;;;;;;;;;;;;;;KAyBMI;;;CAEJ;;;;;;;;;;;;;;;;;CA4BA;;;;;;CAWA,iBAAyB;CAAA,QAAbzI,MAAa,uEAAJ,EAAI;;CAAA;;CAAA,4EACjBA,MADiB,EACTyI,IAAIxI,QADK,EACKwI,IAAI9N,YADT;CAExB;CAED;;;;;;;;;;;6BAO4B;CAAA,UAAtBqF,MAAsB,uEAAb,KAAKA,MAAQ;;CAAA,8BACG,KAAK1C,WAAL,CAAiB;CAC5CiF,kBAAU,KAAKmG,aAAL,CAAmB1I,MAAnB,CADkC;CAE5CwC,kBAAUxC,OAAOwC;CAF2B,OAAjB,CADH;CAAA,UACnBD,QADmB,qBACnBA,QADmB;CAAA,UACTC,QADS,qBACTA,QADS;;CAM1B,aAAO,KAAKlF,WAAL,CAAiB;CAAC8D,cAAM,IAAIkB,IAAJ,CAASC,QAAT,EAAmBC,QAAnB;CAAP,OAAjB,EAAuDpB,IAA9D;CACD;;;qCAE0B;CAAA,UAAbpB,MAAa,uEAAJ,EAAI;CACzB,UAAMuC,WAAW,KAAKvC,OAAO2I,MAAP,GAAgBC,iBAAhB,GAAoCC,WAAzC,EACf7I,OAAOuC,QAAP,CAAgB0B,KADD,EAEfjE,OAAOuC,QAAP,CAAgB2B,MAFD,EAGflE,OAAOuC,QAAP,CAAgBuG,KAHD,EAIf9I,OAAOuC,QAAP,CAAgBwG,aAJD,EAKf/I,OAAOuC,QAAP,CAAgByG,cALD,EAMfhJ,OAAOuC,QAAP,CAAgB0G,aAND,CAAjB;CASA,aAAO1G,QAAP;CACD;;;;;;GAxEeH;;mCAAZqG,kCAmBCrG,cAAcnC;CACjBsC,YAAU;CACR0B,WAAO,CADC;CAERC,YAAQ,CAFA;CAGR4E,WAAO,CAHC;CAIRC,mBAAe,CAJP;CAKRC,oBAAgB,CALR;CAMRC,mBAAe;CANP;uCAiBP7G,cAAczH;CACjB4H,YAAU,CAAC,OAAD,EAAU,QAAV,EAAoB,OAApB,EAA6B,eAA7B,EAA8C,gBAA9C,EAAgE,gBAAhE;;;CC/Dd;;;;;;;;;;;;;;;;;;;;;;;;;KAwBM2G;;;CAEJ;;;;;;;;;;;;;;;CAyBA;;;;;;CAWA,oBAAyB;CAAA,QAAblJ,MAAa,uEAAJ,EAAI;;CAAA;;CAAA,+EACjBA,MADiB,EACTkJ,OAAOjJ,QADE,EACQiJ,OAAOvO,YADf;CAExB;CAED;;;;;;;;;;;6BAO4B;CAAA,UAAtBqF,MAAsB,uEAAb,KAAKA,MAAQ;;CAAA,8BACG,KAAK1C,WAAL,CAAiB;CAC5CiF,kBAAU,KAAKmG,aAAL,CAAmB1I,MAAnB,CADkC;CAE5CwC,kBAAUxC,OAAOwC;CAF2B,OAAjB,CADH;CAAA,UACnBD,QADmB,qBACnBA,QADmB;CAAA,UACTC,QADS,qBACTA,QADS;;CAM1B,aAAO,KAAKlF,WAAL,CAAiB;CAAC8D,cAAM,IAAIkB,IAAJ,CAASC,QAAT,EAAmBC,QAAnB;CAAP,OAAjB,EAAuDpB,IAA9D;CACD;;;qCAE0B;CAAA,UAAbpB,MAAa,uEAAJ,EAAI;CACzB,UAAMuC,WAAW,KAAKvC,OAAO2I,MAAP,GAAgBQ,oBAAhB,GAAuCC,cAA5C,EACfpJ,OAAOuC,QAAP,CAAgB6B,MADD,EAEfpE,OAAOuC,QAAP,CAAgB8G,QAFD,EAGfrJ,OAAOuC,QAAP,CAAgB+G,UAHD,EAIftJ,OAAOuC,QAAP,CAAgBgH,WAJD,CAAjB;CAOA,aAAOhH,QAAP;CACD;;;;;;GAnEkBH;;mCAAf8G,qCAiBC9G,cAAcnC;CAEjBsC,YAAU;CACR6B,YAAQ,EADA;CAERiF,cAAU,CAFF;CAGRC,gBAAY,CAHJ;CAIRC,iBAAa5B,KAAKC,EAAL,GAAU;CAJf;uCAePxF,cAAczH;CACjB4H,YAAU,CAAC,QAAD,EAAW,UAAX,EAAuB,YAAvB,EAAqC,aAArC;;;CC3Dd;;;;;;;;;;;;;;;;;;;;;;;;;;;KA0BMiH;;;CAEJ;;;;;;;;;;;;;;;;;;CA+BA;;;;;;;;;;;;;;;;CA6BA,kBAAyB;CAAA;;CAAA,QAAbxJ,MAAa,uEAAJ,EAAI;;CAAA;;CACvB,8EAAMA,MAAN,EAAcwJ,KAAKvJ,QAAnB,EAA6BuJ,KAAK7O,YAAlC;;CAEA,QAAIqF,OAAO0C,KAAX,EAAkB;CAChB,YAAKA,KAAL,CAAW1C,MAAX;;CACA;CACD;;CANsB;CAOxB;CAED;;;;;;;;;;;6BAO4B;CAAA,UAAtBA,MAAsB,uEAAb,KAAKA,MAAQ;;CAAA,8BACG,KAAK1C,WAAL,CAAiB;CAC5CiF,kBAAU,KAAKmG,aAAL,CAAmB1I,MAAnB,CADkC;CAE5CwC,kBAAUxC,OAAOwC;CAF2B,OAAjB,CADH;CAAA,UACnBD,QADmB,qBACnBA,QADmB;CAAA,UACTC,QADS,qBACTA,QADS;;CAM1B,aAAO,KAAKlF,WAAL,CAAiB;CAAC8D,cAAM,IAAIkB,IAAJ,CAASC,QAAT,EAAmBC,QAAnB;CAAP,OAAjB,EAAuDpB,IAA9D;CACD;;;qCAE0B;CAAA,UAAbpB,MAAa,uEAAJ,EAAI;CACzB,UAAMuC,WAAW,KAAKvC,OAAO2I,MAAP,GAAgBc,kBAAhB,GAAqCC,YAA1C,EACf1J,OAAOuC,QAAP,CAAgB6B,MADD,EAEfpE,OAAOuC,QAAP,CAAgB2B,MAFD,EAGflE,OAAOuC,QAAP,CAAgBoH,cAHD,EAIf3J,OAAOuC,QAAP,CAAgByG,cAJD,EAKfhJ,OAAOuC,QAAP,CAAgBqH,SALD,EAMf5J,OAAOuC,QAAP,CAAgB+G,UAND,EAOftJ,OAAOuC,QAAP,CAAgBgH,WAPD,CAAjB;CAUA,aAAOhH,QAAP;CACD;;;;;;GAnGgBH;;mCAAboH,mCAoBCpH,cAAcnC;CAEjBsC,YAAU;CACR6B,YAAQ,EADA;CAERF,YAAQ,GAFA;CAGRyF,oBAAgB,EAHR;CAIRX,oBAAgB,CAJR;CAKRY,eAAW,KALH;CAMRN,gBAAY,CANJ;CAORC,iBAAa5B,KAAKC,EAAL,GAAU;CAPf;uCA4BPxF,cAAczH;CACjB4H,YAAU,CACR,QADQ,EAER,QAFQ,EAGR,gBAHQ,EAIR,gBAJQ,EAKR,WALQ,EAMR,YANQ,EAOR,aAPQ;;;CC7Ed;;;;;;;;;;;;;;;;;;;;;;;;;;;KA0BMsH;;;CAEJ;;;;;;;;;;;;;;;;;;;CAgCA;;;;;;;;;;;;;;;;;CA+BA,sBAAyB;CAAA;;CAAA,QAAb7J,MAAa,uEAAJ,EAAI;;CAAA;;CACvB,kFAAMA,MAAN,EAAc6J,SAAS5J,QAAvB,EAAiC4J,SAASlP,YAA1C;;CAEA,QAAIqF,OAAO0C,KAAX,EAAkB;CAChB,YAAKA,KAAL,CAAW1C,MAAX;;CACA;CACD;;CANsB;CAOxB;CAED;;;;;;;;;;;6BAO4B;CAAA,UAAtBA,MAAsB,uEAAb,KAAKA,MAAQ;;CAAA,8BACG,KAAK1C,WAAL,CAAiB;CAC5CiF,kBAAU,KAAKmG,aAAL,CAAmB1I,MAAnB,CADkC;CAE5CwC,kBAAUxC,OAAOwC;CAF2B,OAAjB,CADH;CAAA,UACnBD,QADmB,qBACnBA,QADmB;CAAA,UACTC,QADS,qBACTA,QADS;;CAM1B,aAAO,KAAKlF,WAAL,CAAiB;CAAC8D,cAAM,IAAIkB,IAAJ,CAASC,QAAT,EAAmBC,QAAnB;CAAP,OAAjB,EAAuDpB,IAA9D;CACD;;;qCAE0B;CAAA,UAAbpB,MAAa,uEAAJ,EAAI;CACzB,UAAMuC,WAAW,KAAKvC,OAAO2I,MAAP,GAAgBmB,sBAAhB,GAAyCC,gBAA9C,EACf/J,OAAOuC,QAAP,CAAgByH,SADD,EAEfhK,OAAOuC,QAAP,CAAgB0H,YAFD,EAGfjK,OAAOuC,QAAP,CAAgB2B,MAHD,EAIflE,OAAOuC,QAAP,CAAgBoH,cAJD,EAKf3J,OAAOuC,QAAP,CAAgByG,cALD,EAMfhJ,OAAOuC,QAAP,CAAgBqH,SAND,EAOf5J,OAAOuC,QAAP,CAAgB+G,UAPD,EAQftJ,OAAOuC,QAAP,CAAgBgH,WARD,CAAjB;CAWA,aAAOhH,QAAP;CACD;;;;;;GAvGoBH;;mCAAjByH,uCAqBCzH,cAAcnC;CACjBsC,YAAU;CACRyH,eAAW,CADH;CAERC,kBAAc,CAFN;CAGR/F,YAAQ,CAHA;CAIRyF,oBAAgB,EAJR;CAKRX,oBAAgB,CALR;CAMRY,eAAW,KANH;CAORN,gBAAY,CAPJ;CAQRC,iBAAa5B,KAAKC,EAAL,GAAU;CARf;uCA8BPxF,cAAczH;CACjB4H,YAAU,CACR,WADQ,EAER,cAFQ,EAGR,QAHQ,EAIR,gBAJQ,EAKR,gBALQ,EAMR,WANQ,EAOR,YAPQ,EAQR,aARQ;;;CC/Ed;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA4BM2H;;;CACJ;;;;;;;;;;;;CAmBA;;;;;;;;CAaA,0BAAyB;CAAA;;CAAA,QAAblK,MAAa,uEAAJ,EAAI;;CAAA;;CACvB,sFAAMA,MAAN,EAAckK,aAAajK,QAA3B,EAAqCiK,aAAavP,YAAlD;;CAEA,QAAIqF,OAAO0C,KAAX,EAAkB;CAChB,YAAKA,KAAL,CAAW1C,MAAX;;CACA;CACD;;CANsB;CAOxB;CAED;;;;;;;;;;;6BAO4B;CAAA,UAAtBA,MAAsB,uEAAb,KAAKA,MAAQ;;CAAA,8BACG,KAAK1C,WAAL,CAAiB;CAC5CiF,kBAAU,KAAKmG,aAAL,CAAmB1I,MAAnB,CADkC;CAE5CwC,kBAAUxC,OAAOwC;CAF2B,OAAjB,CADH;CAAA,UACnBD,QADmB,qBACnBA,QADmB;CAAA,UACTC,QADS,qBACTA,QADS;;CAM1B,aAAO,KAAKlF,WAAL,CAAiB;CAAC8D,cAAM,IAAIkB,IAAJ,CAASC,QAAT,EAAmBC,QAAnB;CAAP,OAAjB,EAAuDpB,IAA9D;CACD;;;qCAE0B;CAAA,UAAbpB,MAAa,uEAAJ,EAAI;CACzB,aAAO,KAAKA,OAAO2I,MAAP,GAAgBwB,0BAAhB,GAA6CC,oBAAlD,EACLpK,OAAOuC,QAAP,CAAgB6B,MADX,EAELpE,OAAOuC,QAAP,CAAgB8H,MAFX,CAAP;CAID;;;;;;GA/DwBjI;;mCAArB8H,2CAaC9H,cAAcnC;CACjBsC,YAAU;CACR6B,YAAQ,CADA;CAERiG,YAAQ;CAFA;uCAePjI,cAAczH;CACjB4H,YAAU,CAAC,QAAD,EAAW,QAAX;;;CC1Dd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAiDM+H;;;CACJ;;;;;;;;;;;;;;CAqBA;;;;;;;;;;CAeA,qBAAyB;CAAA;;CAAA,QAAbtK,MAAa,uEAAJ,EAAI;;CAAA;;CACvB,iFAAMA,MAAN,EAAcsK,QAAQrK,QAAtB,EAAgCqK,QAAQ3P,YAAxC;;CAEA,QAAIqF,OAAO0C,KAAX,EAAkB;CAChB,YAAKA,KAAL,CAAW1C,MAAX;;CACA;CACD;;CANsB;CAOxB;CAED;;;;;;;;;;;6BAO4B;CAAA,UAAtBA,MAAsB,uEAAb,KAAKA,MAAQ;;CAAA,8BACG,KAAK1C,WAAL,CAAiB;CAC5CiF,kBAAU,KAAKmG,aAAL,CAAmB1I,MAAnB,CADkC;CAE5CwC,kBAAUxC,OAAOwC;CAF2B,OAAjB,CADH;CAAA,UACnBD,QADmB,qBACnBA,QADmB;CAAA,UACTC,QADS,qBACTA,QADS;;CAM1B,aAAO,KAAKlF,WAAL,CAAiB;CAAC8D,cAAM,IAAIkB,IAAJ,CAASC,QAAT,EAAmBC,QAAnB;CAAP,OAAjB,EAAuDpB,IAA9D;CACD;;;qCAE0B;CAAA,UAAbpB,MAAa,uEAAJ,EAAI;CACzB,UAAMuC,WAAW,IAAIgI,eAAJ,CACfvK,OAAOuC,QAAP,CAAgBiI,MADD,EAEfxK,OAAOuC,QAAP,CAAgBkI,OAFD,CAAjB;CAKA,aAAOzK,OAAO2I,MAAP,GAAgB,IAAI+B,cAAJ,GAAqBC,YAArB,CAAkCpI,QAAlC,CAAhB,GAA8DA,QAArE;CACD;;;;;;GArEmBH;;mCAAhBkI,sCAeClI,cAAcnC;CACjBsC,YAAU;CACRiI,YAAQ,EADA;CAERC,aAAS;CAFD;uCAiBPrI,cAAczH;CACjB4H,YAAU,CAAC,QAAD,EAAW,SAAX;;;CCnFd;;;;;;;;;;;;;;;;;;;;;;;;;;KAyBMqI;;;CACJ;;;;;;;;;;;;;CAoBA;;;;;;CAWA,yBAAyB;CAAA;;CAAA,QAAb5K,MAAa,uEAAJ,EAAI;;CAAA;;CACvB,qFAAMA,MAAN,EAAc4K,YAAY3K,QAA1B,EAAoC2K,YAAYjQ,YAAhD;;CAEA,QAAIqF,OAAO0C,KAAX,EAAkB;CAChB,YAAKA,KAAL,CAAW1C,MAAX;;CACA;CACD;;CANsB;CAOxB;CAED;;;;;;;;;;;6BAO4B;CAAA,UAAtBA,MAAsB,uEAAb,KAAKA,MAAQ;;CAAA,8BACG,KAAK1C,WAAL,CAAiB;CAC5CiF,kBAAU,KAAKmG,aAAL,CAAmB1I,MAAnB,CADkC;CAE5CwC,kBAAUxC,OAAOwC;CAF2B,OAAjB,CADH;CAAA,UACnBD,QADmB,qBACnBA,QADmB;CAAA,UACTC,QADS,qBACTA,QADS;;CAM1B,aAAO,KAAKlF,WAAL,CAAiB;CAAC8D,cAAM,IAAIkB,IAAJ,CAASC,QAAT,EAAmBC,QAAnB;CAAP,OAAjB,EAAuDpB,IAA9D;CACD;;;qCAE0B;CAAA,UAAbpB,MAAa,uEAAJ,EAAI;CACzB,aAAO,KAAKA,OAAO2I,MAAP,GAAgBkC,yBAAhB,GAA4CC,mBAAjD,EACL9K,OAAOuC,QAAP,CAAgB6B,MADX,EAELpE,OAAOuC,QAAP,CAAgB8H,MAFX,CAAP;CAID;;;;;;GA9DuBjI;;mCAApBwI,0CAcCxI,cAAcnC;CACjBsC,YAAU;CACR6B,YAAQ,CADA;CAERiG,YAAQ;CAFA;uCAaPjI,cAAczH;CACjB4H,YAAU,CAAC,QAAD,EAAW,QAAX;;;CCtDd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAsCMwI;;;CACJ;;;;;;;;;;;;;CAmBA;;;;;;;;;CAcA,mBAAyB;CAAA;;CAAA,QAAb/K,MAAa,uEAAJ,EAAI;;CAAA;;CACvB,+EAAMA,MAAN,EAAc+K,MAAM9K,QAApB,EAA8B8K,MAAMpQ,YAApC;;CAEA,QAAIqF,OAAO0C,KAAX,EAAkB;CAChB,YAAKA,KAAL,CAAW1C,MAAX;;CACA;CACD;;CANsB;CAOxB;CAED;;;;;;;;;;;6BAO4B;CAAA,UAAtBA,MAAsB,uEAAb,KAAKA,MAAQ;;CAAA,8BACG,KAAK1C,WAAL,CAAiB;CAC5CiF,kBAAU,KAAKmG,aAAL,CAAmB1I,MAAnB,CADkC;CAE5CwC,kBAAUxC,OAAOwC;CAF2B,OAAjB,CADH;CAAA,UACnBD,QADmB,qBACnBA,QADmB;CAAA,UACTC,QADS,qBACTA,QADS;;CAM1B,aAAO,KAAKlF,WAAL,CAAiB;CAAC8D,cAAM,IAAIkB,IAAJ,CAASC,QAAT,EAAmBC,QAAnB;CAAP,OAAjB,EAAuDpB,IAA9D;CACD;;;qCAE0B;CAAA,UAAbpB,MAAa,uEAAJ,EAAI;CACzB,aAAO,KAAKA,OAAO2I,MAAP,GAAgBqC,mBAAhB,GAAsCC,aAA3C,EACLjL,OAAOuC,QAAP,CAAgB2I,MADX,CAAP;CAGD;;;;;;GA/DiB9I;;mCAAd2I,oCAcC3I,cAAcnC;CACjBsC,YAAU;CACR2I,YAAQ;CADA;uCAeP9I,cAAczH;CACjB4H,YAAU,CAAC,QAAD;;;CClEd;;;;;;;;;;;;;;;;;;;KAkBM4I;;;CACJ;;;;;;;;;;;;CAkBA;;;;;;;;;CAcA,mBAAYnL,MAAZ,EAAoB;CAAA;;CAAA,gFACZA,MADY,EACJmL,QAAKlL,QADD,EACWkL,QAAKxQ,YADhB;CAEnB;CAED;;;;;;;;;;;6BAO4B;CAAA,UAAtBqF,MAAsB,uEAAb,KAAKA,MAAQ;;CAAA,8BACG,KAAK1C,WAAL,CAAiB;CAC5CiF,kBAAU,KAAKmG,aAAL,CAAmB1I,MAAnB,CADkC;CAE5CwC,kBAAUxC,OAAOwC;CAF2B,OAAjB,CADH;CAAA,UACnBD,QADmB,qBACnBA,QADmB;CAAA,UACTC,QADS,qBACTA,QADS;;CAM1B,aAAO,KAAKlF,WAAL,CAAiB;CAAC8D,cAAM,IAAIgK,IAAJ,CAAe7I,QAAf,EAAyBC,QAAzB;CAAP,OAAjB,EAA6DpB,IAApE;CACD;;;qCAE0B;CAAA,UAAbpB,MAAa,uEAAJ,EAAI;CACzB,UAAMuC,WAAWvC,OAAO2I,MAAP,GAAgB,IAAI+B,cAAJ,EAAhB,GAAuC,IAAIW,QAAJ,EAAxD;;CAEA,UAAIrL,OAAO2I,MAAX,EAAmB;CACjB,YAAM2C,KAAKtL,OAAOuL,KAAP,CAAaC,SAAb,CAAuBxL,OAAOkL,MAA9B,CAAX;CACA,YAAMO,QAAQ,IAAIC,YAAJ,CAAiBJ,GAAG9Q,MAAH,GAAY,CAA7B,CAAd;;CAEA,aAAK,IAAIF,IAAI,CAAR,EAAWC,MAAM+Q,GAAG9Q,MAAzB,EAAiCF,IAAIC,GAArC,EAA0CD,GAA1C,EAA+C;CAC7C,cAAMqR,KAAKrR,IAAI,CAAf;CAEAmR,gBAAME,EAAN,IAAYL,GAAGhR,CAAH,EAAM4I,CAAlB;CACAuI,gBAAME,KAAK,CAAX,IAAgBL,GAAGhR,CAAH,EAAM6I,CAAtB;CACAsI,gBAAME,KAAK,CAAX,IAAgBL,GAAGhR,CAAH,EAAM8I,CAAtB;CACD;;CAEDb,iBAASqJ,YAAT,CAAsB,UAAtB,EAAkC,IAAIC,eAAJ,CAAoBJ,KAApB,EAA2B,CAA3B,CAAlC;CACD,OAbD,MAaOlJ,SAASuJ,QAAT,GAAoB9L,OAAOuL,KAAP,CAAaC,SAAb,CAAuBxL,OAAOkL,MAA9B,CAApB;;CAEP,aAAO3I,QAAP;CACD;;;;;;GAxEgBH;;mCAAb+I,qCAaC/I,cAAcnC;CAEjBsL,SAAO;CACPL,UAAQ;uCAaL9I,cAAczH;CACjB4H,YAAU,CAAC,OAAD,EAAU,QAAV;;;CCnDd;;;;;;;;;;;;;;;;;;;KAkBMwJ;;;;;;CAEJ;;;;;;;;;;;;;;;;;;;;;;CAgDA;;;;;;;;;;;;;;;;;;;4BAmBcvS,QAAQwS,SAAQ;CAC5B,UAAMC,gBAAgB,SAAhBA,aAAgB,SAAU;CAC9BzS,eAAOyH,QAAP,CAAgBiL,OAAhB,CAAwB,UAACC,EAAD,EAAKnG,KAAL,EAAe;CACrC,cAAImG,GAAGlL,QAAP,EAAiBgL,cAAcE,EAAd;CACjB,cAAI,CAACH,QAAOG,EAAP,CAAL,EAAiB3S,OAAOyH,QAAP,CAAgB5E,MAAhB,CAAuB2J,KAAvB,EAA8B,CAA9B;CAClB,SAHD;CAKA,eAAOxM,MAAP;CACD,OAPD;;CASA,aAAOyS,cAAczS,MAAd,CAAP;CACD;;;CAED,sBAAyB;CAAA,QAAbwG,MAAa,uEAAJ,EAAI;;CAAA;;CAAA,iFACjBA,MADiB,EACT+L,SAAS9L,QADA,EACU8L,SAASpR,YADnB,EACiC,KADjC;CAExB;CAED;;;;;;;;;;;6BAOmB;CAAA;;CAAA,UAAbqF,MAAa,uEAAJ,EAAI;CACjB,aAAO,IAAI7J,OAAJ,CAAY,mBAAW;CAC5B,YAAI6J,OAAOoM,WAAX,EAAwBpM,OAAOqM,MAAP,CAAcC,cAAd,CAA6BtM,OAAOoM,WAApC;CAExBpM,eAAOqM,MAAP,CAAcE,IAAd,CAAmBvM,OAAOwM,GAA1B,EAA+B,YAAa;CAAA,4CAATtN,IAAS;CAATA,gBAAS;CAAA;;CAAE;CAC5Cc,iBAAOyM,MAAP,eAAiBvN,IAAjB;CAEA,cAAM1F,SAASwG,OAAO0M,MAAP,CAAc/O,KAAd,CAAoB,KAApB,EAA0BuB,IAA1B,CAAf;CACA,cAAIc,OAAOwC,QAAX,EAAqBhJ,OAAOgJ,QAAP,GAAkB,MAAKlF,WAAL,CAAiB;CAACkF,sBAAUxC,OAAOwC;CAAlB,WAAjB,EAA8CA,QAAhE;CAErBI,kBAAQpJ,MAAR;CACD,SAPD,EAOGwG,OAAO2M,UAPV,EAOsB3M,OAAO4M,OAP7B;CAQD,OAXM,CAAP;CAYD;;;;;;GA1GoBxK;;mCAAjB2J,uCAwBC3J,cAAcnC;CAEjBuM,OAAK;CACLH,UAAQ,IAAIQ,UAAJ;CAERJ,4BAAS;CACTE,oCAAa;CACb;CACAC,8BAAU;CAEVR,eAAa;CACbU,qBAAmB;CAEnBJ,0BAAOnK,UAAUC,UAAU;CAAA,4BACe,KAAKlF,WAAL,CAAiB;CAACiF,wBAAD;CAAWC;CAAX,KAAjB,CADf;CAAA,QACRH,IADQ,qBAClBE,QADkB;CAAA,QACQwK,GADR,qBACFvK,QADE;;CAGzB,WAAO,KAAKlF,WAAL,CAAiB;CACtB8D,YAAMiB,KAAK2K,KAAL,GAAa,IAAIC,WAAJ,CAAgB5K,IAAhB,EAAsB0K,GAAtB,CAAb,GAA0C,IAAIzK,IAAJ,CAASD,IAAT,EAAe0K,GAAf;CAD1B,KAAjB,EAEJ3L,IAFH;CAGD;uCAIEgB,cAAczH;;CCjErB;;;;;;;;;;;;;;;;;;;;;;;;;;;KA0BMuS;;;CACJ;;;;;;;;;;;;;CAqBA,wBAAyB;CAAA;;CAAA,QAAblN,MAAa,uEAAJ,EAAI;;CAAA;;CACvB,oFAAMA,MAAN,EAAckN,WAAWjN,QAAzB,EAAmCiN,WAAWvS,YAA9C;;CAEA,QAAIqF,OAAO0C,KAAX,EAAkB;CAChB,YAAKA,KAAL,CAAW1C,MAAX;;CACA;CACD;;CANsB;CAOxB;CAED;;;;;;;;;;;6BAO4B;CAAA,UAAtBA,MAAsB,uEAAb,KAAKA,MAAQ;;CAAA,8BACG,KAAK1C,WAAL,CAAiB;CAC5CiF,kBAAU,KAAKmG,aAAL,CAAmB1I,MAAnB,CADkC;CAE5CwC,kBAAUxC,OAAOwC;CAF2B,OAAjB,CADH;CAAA,UACnBD,QADmB,qBACnBA,QADmB;CAAA,UACTC,QADS,qBACTA,QADS;;CAM1B,aAAO,KAAKlF,WAAL,CAAiB;CAAC8D,cAAM,IAAIkB,IAAJ,CAASC,QAAT,EAAmBC,QAAnB;CAAP,OAAjB,EAAuDpB,IAA9D;CACD;;;qCAE0B;CAAA,UAAbpB,MAAa,uEAAJ,EAAI;CACzB,aAAO,KAAKA,OAAO2I,MAAP,GAAgBwE,wBAAhB,GAA2CC,kBAAhD,EACLpN,OAAOuC,QAAP,CAAgB6B,MADX,EAELpE,OAAOuC,QAAP,CAAgB8H,MAFX,CAAP;CAID;;;;;;GApDsBjI;;kBAAnB8K,yCAeC9K,cAAcnC;CACjBsC,YAAU;CACR6B,YAAQ,CADA;CAERiG,YAAQ;CAFA;;;CCzCd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAkCMgD;;;CACJ;;;;;;;;;;;;;;CAuBA,wBAAyB;CAAA,QAAbrN,MAAa,uEAAJ,EAAI;;CAAA;;CAAA,mFACjBA,MADiB,EACTqN,WAAWpN,QADF,EACYoN,WAAW1S,YADvB;CAExB;CAED;;;;;;;;;;;6BAO4B;CAAA,UAAtBqF,MAAsB,uEAAb,KAAKA,MAAQ;;CAAA,8BACG,KAAK1C,WAAL,CAAiB;CAC5CiF,kBAAU,KAAKmG,aAAL,CAAmB1I,MAAnB,CADkC;CAE5CwC,kBAAUxC,OAAOwC;CAF2B,OAAjB,CADH;CAAA,UACnBD,QADmB,qBACnBA,QADmB;CAAA,UACTC,QADS,qBACTA,QADS;;CAM1B,aAAO,KAAKlF,WAAL,CAAiB;CAAC8D,cAAM,IAAIkB,IAAJ,CAASC,QAAT,EAAmBC,QAAnB;CAAP,OAAjB,EAAuDpB,IAA9D;CACD;;;qCAE0B;CAAA,UAAbpB,MAAa,uEAAJ,EAAI;CACzB,aAAO,KAAKA,OAAO2I,MAAP,GAAgB2E,wBAAhB,GAA2CC,kBAAhD,EACLvN,OAAOuC,QAAP,CAAgB1E,IADX,EAELmC,OAAOuC,QAAP,CAAgBiL,MAFX,EAGLxN,OAAOuC,QAAP,CAAgBkL,MAHX,CAAP;CAKD;;;;;;GAlDsBrL;;kBAAnBiL,yCAgBCjL,cAAcnC;CACjBsC,YAAU;CACR1E,UAAM,cAAC6P,CAAD,EAAIC,CAAJ;CAAA,aAAU,IAAIC,OAAJ,CAAYF,CAAZ,EAAeC,CAAf,EAAkB,CAAlB,CAAV;CAAA,KADE;CAERH,YAAQ,EAFA;CAGRC,YAAQ;CAHA;;;CCpDd;;;;;;;;;;;;;;;;;;;;;;KAqBMI;;;CACJ;;;;;;;;;;;;;;;;CAyBA;;;;;;;;;;CAeA,sBAAyB;CAAA;;CAAA,QAAb7N,MAAa,uEAAJ,EAAI;;CAAA;;CACvB,kFAAMA,MAAN,EAAc6N,SAAM5N,QAApB,EAA8B4N,SAAMlT,YAApC;;CAEA,QAAIqF,OAAO0C,KAAX,EAAkB;CAChB,YAAKA,KAAL,CAAW1C,MAAX;;CACA;CACD;;CANsB;CAOxB;CAED;;;;;;;;;;;6BAO4B;CAAA,UAAtBA,MAAsB,uEAAb,KAAKA,MAAQ;;CAAA,8BACG,KAAK1C,WAAL,CAAiB;CAC5CiF,kBAAU,KAAKmG,aAAL,CAAmB1I,MAAnB,CADkC;CAE5CwC,kBAAUxC,OAAOwC;CAF2B,OAAjB,CADH;CAAA,UACnBD,QADmB,qBACnBA,QADmB;CAAA,UACTC,QADS,qBACTA,QADS;;CAM1B,aAAO,KAAKlF,WAAL,CAAiB;CAAC8D,cAAM,IAAIkB,IAAJ,CAASC,QAAT,EAAmBC,QAAnB;CAAP,OAAjB,EAAuDpB,IAA9D;CACD;;;qCAE0B;CAAA,UAAbpB,MAAa,uEAAJ,EAAI;CACzB,UAAMuC,WAAW,KAAKvC,OAAO2I,MAAP,GAAgBmF,mBAAhB,GAAsCC,aAA3C,EACf/N,OAAOuC,QAAP,CAAgB0B,KADD,EAEfjE,OAAOuC,QAAP,CAAgB2B,MAFD,EAGflE,OAAOuC,QAAP,CAAgByL,SAHD,EAIfhO,OAAOuC,QAAP,CAAgB0L,SAJD,CAAjB;CAOA,aAAO1L,QAAP;CACD;;;;;;GA3EiBH;;mCAAdyL,sCAiBCzL,cAAcnC;CACjBsC,YAAU;CACR0B,WAAO,EADC;CAERC,YAAQ,EAFA;CAGR8J,eAAW,CAHH;CAIRC,eAAW;CAJH;uCAmBP7L,cAAczH;CACjB4H,YAAU,CAAC,OAAD,EAAU,QAAV,EAAoB,WAApB,EAAiC,WAAjC;;;KC3DP2L,iBACL,CACE,CAAC,CADH,EACM,CAAC,CADP,EACU,CAAC,CADX,EACc,CADd,EACiB,CAAC,CADlB,EACqB,CAAC,CADtB,EACyB,CADzB,EAC4B,CAD5B,EAC+B,CAAC,CADhC,EACmC,CAAC,CADpC,EACuC,CADvC,EAC0C,CAAC,CAD3C,EAEE,CAAC,CAFH,EAEM,CAAC,CAFP,EAEU,CAFV,EAEa,CAFb,EAEgB,CAAC,CAFjB,EAEoB,CAFpB,EAEuB,CAFvB,EAE0B,CAF1B,EAE6B,CAF7B,EAEgC,CAAC,CAFjC,EAEoC,CAFpC,EAEuC,CAFvC;KADqBC,iBAKrB,CACE,CADF,EACK,CADL,EACQ,CADR,EACW,CADX,EACc,CADd,EACiB,CADjB,EAEE,CAFF,EAEK,CAFL,EAEQ,CAFR,EAEW,CAFX,EAEc,CAFd,EAEiB,CAFjB,EAGE,CAHF,EAGK,CAHL,EAGQ,CAHR,EAGW,CAHX,EAGc,CAHd,EAGiB,CAHjB,EAIE,CAJF,EAIK,CAJL,EAIQ,CAJR,EAIW,CAJX,EAIc,CAJd,EAIiB,CAJjB,EAKE,CALF,EAKK,CALL,EAKQ,CALR,EAKW,CALX,EAKc,CALd,EAKiB,CALjB,EAME,CANF,EAMK,CANL,EAMQ,CANR,EAMW,CANX,EAMc,CANd,EAMiB,CANjB;CAUF;;;;;;;;;;;;;;;;;;;;;;;;;KAwBMC;;;CAIJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCA;;;;;;;;;;CAeA,wBAAyB;CAAA;;CAAA,QAAbpO,MAAa,uEAAJ,EAAI;;CAAA;;CACvB,oFAAMA,MAAN,EAAcoO,WAAWnO,QAAzB,EAAmCmO,WAAWzT,YAA9C;;CAEA,QAAIqF,OAAO0C,KAAX,EAAkB;CAChB,YAAKA,KAAL,CAAW1C,MAAX;;CACA;CACD;;CANsB;CAOxB;CAED;;;;;;;;;;;6BAO4B;CAAA,UAAtBA,MAAsB,uEAAb,KAAKA,MAAQ;;CAAA,8BACG,KAAK1C,WAAL,CAAiB;CAC5CiF,kBAAU,KAAKmG,aAAL,CAAmB1I,MAAnB,CADkC;CAE5CwC,kBAAUxC,OAAOwC;CAF2B,OAAjB,CADH;CAAA,UACnBD,QADmB,qBACnBA,QADmB;CAAA,UACTC,QADS,qBACTA,QADS;;CAM1B,aAAO,KAAKlF,WAAL,CAAiB;CAAC8D,cAAM,IAAIkB,IAAJ,CAASC,QAAT,EAAmBC,QAAnB;CAAP,OAAjB,EAAuDpB,IAA9D;CACD;;;qCAE0B;CAAA,UAAbpB,MAAa,uEAAJ,EAAI;CACzB,aAAO,KAAKA,OAAO2I,MAAP,GAAgB0F,wBAAhB,GAA2CC,kBAAhD,EACLtO,OAAOuC,QAAP,CAAgB2L,cADX,EAELlO,OAAOuC,QAAP,CAAgB4L,cAFX,EAGLnO,OAAOuC,QAAP,CAAgB6B,MAHX,EAILpE,OAAOuC,QAAP,CAAgB8H,MAJX,CAAP;CAMD;;;;;;GAxFsBjI;;qEAAnBgM,8BACoBF,mCACAC,8CA8BnB/L,cAAcnC;CACjBsC,YAAU;CACR2L,kCADQ;CAERC,kCAFQ;CAGR/J,YAAQ,CAHA;CAIRiG,YAAQ;CAJA;uCAmBPjI,cAAczH;CACjB4H,YAAU,CAAC,gBAAD,EAAmB,gBAAnB,EAAqC,QAArC,EAA+C,QAA/C;;;CC5Fd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA4BMgM;;;CACJ;;;;;;;;;;;;;;;;;;CA6BA;;;;;;;;;;;;;;;;;CA6BA,kBAAyB;CAAA;;CAAA,QAAbvO,MAAa,uEAAJ,EAAI;;CAAA;;CACvB,8EAAMA,MAAN,EAAcuO,KAAKtO,QAAnB,EAA6BsO,KAAK5T,YAAlC;;CAEA,QAAIqF,OAAO0C,KAAX,EAAkB;CAChB,YAAKA,KAAL,CAAW1C,MAAX;;CACA;CACD;;CANsB;CAOxB;CAED;;;;;;;;;;;6BAO4B;CAAA,UAAtBA,MAAsB,uEAAb,KAAKA,MAAQ;;CAAA,8BACG,KAAK1C,WAAL,CAAiB;CAC5CiF,kBAAU,KAAKmG,aAAL,CAAmB1I,MAAnB,CADkC;CAE5CwC,kBAAUxC,OAAOwC;CAF2B,OAAjB,CADH;CAAA,UACnBD,QADmB,qBACnBA,QADmB;CAAA,UACTC,QADS,qBACTA,QADS;;CAM1B,aAAO,KAAKlF,WAAL,CAAiB;CAAC8D,cAAM,IAAIkB,IAAJ,CAASC,QAAT,EAAmBC,QAAnB;CAAP,OAAjB,EAAuDpB,IAA9D;CACD;;;qCAE0B;CAAA,UAAbpB,MAAa,uEAAJ,EAAI;CACzB,aAAO,KAAKA,OAAO2I,MAAP,GAAgB6F,kBAAhB,GAAqCC,YAA1C,EACLzO,OAAOuC,QAAP,CAAgBmM,WADX,EAEL1O,OAAOuC,QAAP,CAAgBoM,WAFX,EAGL3O,OAAOuC,QAAP,CAAgBqM,aAHX,EAIL5O,OAAOuC,QAAP,CAAgBsM,WAJX,EAKL7O,OAAOuC,QAAP,CAAgB+G,UALX,EAMLtJ,OAAOuC,QAAP,CAAgBgH,WANX,CAAP;CAQD;;;;;;GA7FgBnH;;mCAAbmM,mCAmBCnM,cAAcnC;CACjBsC,YAAU;CACRmM,iBAAa,CADL;CAERC,iBAAa,EAFL;CAGRC,mBAAe,CAHP;CAIRC,iBAAa,CAJL;CAKRvF,gBAAY,CALJ;CAMRC,iBAAa5B,KAAKC,EAAL,GAAU;CANf;uCA4BPxF,cAAcnC;CACjBsC,YAAU,CACR,aADQ,EAER,aAFQ,EAGR,eAHQ,EAIR,aAJQ,EAKR,YALQ,EAMR,aANQ;;;CC7Ed;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAiCMuM;;;CACJ;;;;;;;;;;;;CAkBA;;;;;;;;;;CAeA,sBAAyB;CAAA;;CAAA,QAAb9O,MAAa,uEAAJ,EAAI;;CAAA;;CACvB,kFAAMA,MAAN,EAAc8O,SAAM7O,QAApB,EAA8B6O,SAAMnU,YAApC;;CAEA,QAAIqF,OAAO0C,KAAX,EAAkB;CAChB,YAAKA,KAAL,CAAW1C,MAAX;;CACA;CACD;;CANsB;CAOxB;CAED;;;;;;;;;;;6BAO4B;CAAA,UAAtBA,MAAsB,uEAAb,KAAKA,MAAQ;;CAAA,8BACG,KAAK1C,WAAL,CAAiB;CAC5CiF,kBAAU,KAAKmG,aAAL,CAAmB1I,MAAnB,CADkC;CAE5CwC,kBAAUxC,OAAOwC;CAF2B,OAAjB,CADH;CAAA,UACnBD,QADmB,qBACnBA,QADmB;CAAA,UACTC,QADS,qBACTA,QADS;;CAM1B,aAAO,KAAKlF,WAAL,CAAiB;CAAC8D,cAAM,IAAIkB,IAAJ,CAASC,QAAT,EAAmBC,QAAnB;CAAP,OAAjB,EAAuDpB,IAA9D;CACD;;;qCAE0B;CAAA,UAAbpB,MAAa,uEAAJ,EAAI;CACzB,aAAO,KAAKA,OAAO2I,MAAP,GAAgBoG,mBAAhB,GAAsCC,aAA3C,EACLhP,OAAOuC,QAAP,CAAgBiI,MADX,CAAP;CAGD;;;;;;GA/DiBpI;;mCAAd0M,sCAaC1M,cAAcnC;CACjBsC,YAAU;CACRiI,YAAQ;CADA;uCAgBPpI,cAAczH;CACjB4H,YAAU,CAAC,QAAD;;;CChEd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA6BM0M;;;CACJ;;;;;;;;;;;;;;CAsBA;;;;;;;;;;CAeA,uBAAyB;CAAA,QAAbjP,MAAa,uEAAJ,EAAI;;CAAA;;CAAA,kFACjBA,MADiB,EACTiP,UAAOhP,QADE,EACQgP,UAAOtU,YADf;CAExB;CAED;;;;;;;;;;;6BAO4B;CAAA,UAAtBqF,MAAsB,uEAAb,KAAKA,MAAQ;;CAAA,8BACG,KAAK1C,WAAL,CAAiB;CAC5CiF,kBAAU,KAAKmG,aAAL,CAAmB1I,MAAnB,CADkC;CAE5CwC,kBAAUxC,OAAOwC;CAF2B,OAAjB,CADH;CAAA,UACnBD,QADmB,qBACnBA,QADmB;CAAA,UACTC,QADS,qBACTA,QADS;;CAM1B,aAAO,KAAKlF,WAAL,CAAiB;CAAC8D,cAAM,IAAIkB,IAAJ,CAASC,QAAT,EAAmBC,QAAnB;CAAP,OAAjB,EAAuDpB,IAA9D;CACD;;;qCAE0B;CAAA,UAAbpB,MAAa,uEAAJ,EAAI;CACzB,UAAMuC,WAAW,KAAKvC,OAAO2I,MAAP,GAAgBuG,oBAAhB,GAAuCC,cAA5C,EACfnP,OAAOuC,QAAP,CAAgB6B,MADD,EAEfpE,OAAOuC,QAAP,CAAgBwG,aAFD,EAGf/I,OAAOuC,QAAP,CAAgByG,cAHD,CAAjB;CAMA,aAAOzG,QAAP;CACD;;;;;;GAlEkBH;;mCAAf6M,uCAeC7M,cAAcnC;CACjBsC,YAAU;CACR6B,YAAQ,CADA;CAER2E,mBAAe,CAFP;CAGRC,oBAAgB;CAHR;uCAkBP5G,cAAczH;CACjB4H,YAAU,CAAC,QAAD,EAAW,eAAX,EAA4B,gBAA5B;;;CChEd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA8BM6M;;;CACJ;;;;;;;;;;;;;CAoBA;;;;;;;;;;CAeA,yBAAyB;CAAA;;CAAA,QAAbpP,MAAa,uEAAJ,EAAI;;CAAA;;CACvB,qFAAMA,MAAN,EAAcoP,YAAYnP,QAA1B,EAAoCmP,YAAYzU,YAAhD;;CAEA,QAAIqF,OAAO0C,KAAX,EAAkB;CAChB,YAAKA,KAAL,CAAW1C,MAAX;;CACA;CACD;;CANsB;CAOxB;CAED;;;;;;;;;;;6BAO4B;CAAA,UAAtBA,MAAsB,uEAAb,KAAKA,MAAQ;;CAAA,8BACG,KAAK1C,WAAL,CAAiB;CAC5CiF,kBAAU,KAAKmG,aAAL,CAAmB1I,MAAnB,CADkC;CAE5CwC,kBAAUxC,OAAOwC;CAF2B,OAAjB,CADH;CAAA,UACnBD,QADmB,qBACnBA,QADmB;CAAA,UACTC,QADS,qBACTA,QADS;;CAM1B,aAAO,KAAKlF,WAAL,CAAiB;CAAC8D,cAAM,IAAIkB,IAAJ,CAASC,QAAT,EAAmBC,QAAnB;CAAP,OAAjB,EAAuDpB,IAA9D;CACD;;;qCAE0B;CAAA,UAAbpB,MAAa,uEAAJ,EAAI;CACzB,aAAO,KAAKA,OAAO2I,MAAP,GAAgB0G,yBAAhB,GAA4CC,mBAAjD,EACLtP,OAAOuC,QAAP,CAAgB6B,MADX,EAELpE,OAAOuC,QAAP,CAAgB8H,MAFX,CAAP;CAID;;;;;;GAlEuBjI;;mCAApBgN,0CAcChN,cAAcnC;CACjBsC,YAAU;CACR6B,YAAQ,CADA;CAERiG,YAAQ;CAFA;uCAiBPjI,cAAczH;CACjB4H,YAAU,CAAC,QAAD,EAAW,QAAX;;;CC9Dd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAiCMgN;;;;;;CACJ;;;;;;;;;;;;;;;;;;;;;;CAyCA;;;;;;;CAQA;;;;;;;;0BAQYC,MAA4B;CAAA,UAAtBnD,MAAsB,uEAAbkD,KAAKlD,MAAQ;CACtC,aAAO,IAAIlW,OAAJ,CAAY,mBAAW;CAC5BkW,eAAOE,IAAP,CAAYiD,IAAZ,EAAkB5M,OAAlB;CACD,OAFM,CAAP;CAGD;;;CAED,kBAAyB;CAAA,QAAb5C,MAAa,uEAAJ,EAAI;;CAAA;;CAAA,6EACjBA,MADiB,EACTuP,KAAKtP,QADI,EACMsP,KAAK5U,YADX;CAExB;CAED;;;;;;;;;;;6BAO4B;CAAA;;CAAA,UAAtBqF,MAAsB,uEAAb,KAAKA,MAAQ;CAC1B,UAAMG,UAAU,IAAIhK,OAAJ,CAAY,mBAAW;CACrC,SAAC6J,OAAOyP,IAAP,YAAuBtZ,OAAvB,GAAiC6J,OAAOyP,IAAxC,GAA+CtZ,QAAQyM,OAAR,CAAgB5C,OAAOyP,IAAvB,CAAhD,EACCjP,IADD,CACM,gBAAQ;CAAA,kCACiB,MAAKlD,WAAL,CAAiB;CAC5CiF,sBAAU,IAAImN,YAAJ,CACR1P,OAAO2P,IADC,EAERhW,OAAOiW,MAAP,CACE5P,OAAOuC,QADT,EAEE;CAACkN;CAAD,aAFF,CAFQ,CADkC;CAS5CjN,sBAAUxC,OAAOwC;CAT2B,WAAjB,CADjB;CAAA,cACLD,QADK,qBACLA,QADK;CAAA,cACKC,QADL,qBACKA,QADL;;CAaZI,kBACE,MAAKtF,WAAL,CAAiB;CACf8D,kBAAM,IAAIkB,IAAJ,CAASC,QAAT,EAAmBC,QAAnB;CADS,WAAjB,EAEGpB,IAHL;CAKD,SAnBD;CAoBD,OArBe,CAAhB;;CAuBA,uEAAWjB,OAAX;;CAEA,aAAOA,OAAP;CACD;;;;;;GAtGgBiC;;oDAAbmN,mCAuBCnN,cAAcnC;CACjB0P,QAAM;CACNF,QAAM;CAENlN,YAAU;CACRsN,UAAM,EADE;CAER3L,YAAQ,EAFA;CAGR4L,mBAAe,EAHP;CAIRL,UAAM,IAAIM,IAAJ,EAJE;CAKRC,kBAAc,KALN;CAMRC,oBAAgB,EANR;CAORC,eAAW;CAPH;uCAYP9N,cAAczH,0BASH,IAAIwV,UAAJ;;CCnFlB;;;;;;;;;;;;;;;;;;;;;;;;;;KAyBMC;;;CACJ;;;;;;;;;;;;;;;;;CA2BA;;;;;;;;;;;;;;;;CA2BA,mBAAyB;CAAA;;CAAA,QAAbpQ,MAAa,uEAAJ,EAAI;;CAAA;;CACvB,+EAAMA,MAAN,EAAcoQ,MAAMnQ,QAApB,EAA8BmQ,MAAMzV,YAApC;;CAEA,QAAIqF,OAAO0C,KAAX,EAAkB;CAChB,YAAKA,KAAL,CAAW1C,MAAX;;CACA;CACD;;CANsB;CAOxB;CAED;;;;;;;;;;;6BAO4B;CAAA,UAAtBA,MAAsB,uEAAb,KAAKA,MAAQ;;CAAA,8BACG,KAAK1C,WAAL,CAAiB;CAC5CiF,kBAAU,KAAKmG,aAAL,CAAmB1I,MAAnB,CADkC;CAE5CwC,kBAAUxC,OAAOwC;CAF2B,OAAjB,CADH;CAAA,UACnBD,QADmB,qBACnBA,QADmB;CAAA,UACTC,QADS,qBACTA,QADS;;CAM1B,aAAO,KAAKlF,WAAL,CAAiB;CAAC8D,cAAM,IAAIkB,IAAJ,CAASC,QAAT,EAAmBC,QAAnB;CAAP,OAAjB,EAAuDpB,IAA9D;CACD;;;qCAE0B;CAAA,UAAbpB,MAAa,uEAAJ,EAAI;CACzB,aAAO,IAAIqQ,aAAJ,CACLrQ,OAAOuC,QAAP,CAAgB6B,MADX,EAELpE,OAAOuC,QAAP,CAAgB+N,IAFX,EAGLtQ,OAAOuC,QAAP,CAAgBgO,cAHX,EAILvQ,OAAOuC,QAAP,CAAgBiO,eAJX,EAKLxQ,OAAOuC,QAAP,CAAgBkO,GALX,CAAP;CAOD;;;;;;GAxFiBrO;;mCAAdgO,oCAkBChO,cAAcnC;CACjBsC,YAAU;CACR6B,YAAQ,GADA;CAERkM,UAAM,EAFE;CAGRC,oBAAgB,CAHR;CAIRC,qBAAiB,CAJT;CAKRC,SAAK9I,KAAKC,EAAL,GAAU;CALP;uCA0BPxF,cAAczH;CACjB4H,YAAU,CACR,QADQ,EAER,MAFQ,EAGR,gBAHQ,EAIR,iBAJQ,EAKR,KALQ;;;CCtEd;;;;;;;;;;;;;;;;;;;;;;;;;;KAyBMmO;;;CACJ;;;;;;;;;;;;;;;;;;CA6BA;;;;;;;;;;;;;;;;;CA6BA,uBAAyB;CAAA;;CAAA,QAAb1Q,MAAa,uEAAJ,EAAI;;CAAA;;CACvB,mFAAMA,MAAN,EAAc0Q,UAAUzQ,QAAxB,EAAkCyQ,UAAU/V,YAA5C;;CAEA,QAAIqF,OAAO0C,KAAX,EAAkB;CAChB,YAAKA,KAAL,CAAW1C,MAAX;;CACA;CACD;;CANsB;CAOxB;CAED;;;;;;;;;;;6BAO4B;CAAA,UAAtBA,MAAsB,uEAAb,KAAKA,MAAQ;;CAAA,8BACG,KAAK1C,WAAL,CAAiB;CAC5CiF,kBAAU,KAAKmG,aAAL,CAAmB1I,MAAnB,CADkC;CAE5CwC,kBAAUxC,OAAOwC;CAF2B,OAAjB,CADH;CAAA,UACnBD,QADmB,qBACnBA,QADmB;CAAA,UACTC,QADS,qBACTA,QADS;;CAM1B,aAAO,KAAKlF,WAAL,CAAiB;CAAC8D,cAAM,IAAIkB,IAAJ,CAASC,QAAT,EAAmBC,QAAnB;CAAP,OAAjB,EAAuDpB,IAA9D;CACD;;;qCAE0B;CAAA,UAAbpB,MAAa,uEAAJ,EAAI;CACzB,UAAM2Q,aAAa3Q,OAAO2I,MAAP,GAAgBiI,uBAAhB,GAA0CC,iBAA7D;CAEA,aAAO,IAAIF,UAAJ,CACL3Q,OAAOuC,QAAP,CAAgB6B,MADX,EAELpE,OAAOuC,QAAP,CAAgB+N,IAFX,EAGLtQ,OAAOuC,QAAP,CAAgBgO,cAHX,EAILvQ,OAAOuC,QAAP,CAAgBiO,eAJX,EAKLxQ,OAAOuC,QAAP,CAAgBuO,CALX,EAML9Q,OAAOuC,QAAP,CAAgBwO,CANX,CAAP;CAQD;;;;;;GA/FqB3O;;mCAAlBsO,wCAmBCtO,cAAcnC;CACjBsC,YAAU;CACR6B,YAAQ,GADA;CAERkM,UAAM,EAFE;CAGRC,oBAAgB,EAHR;CAIRC,qBAAiB,CAJT;CAKRM,OAAG,CALK;CAMRC,OAAG;CANK;uCA4BP3O,cAAczH;CACjB4H,YAAU,CACR,QADQ,EAER,MAFQ,EAGR,gBAHQ,EAIR,iBAJQ,EAKR,GALQ,EAMR,GANQ;;;CCxEd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAoCMyO;;;CACJ;;;;;;;;;;;;;;;;;CA2BA;;;;;;;;;;;;;;;;CA2BA,kBAAyB;CAAA;;CAAA,QAAbhR,MAAa,uEAAJ,EAAI;;CAAA;;CACvB,8EAAMA,MAAN,EAAcgR,KAAK/Q,QAAnB,EAA6B+Q,KAAKrW,YAAlC;;CAEA,QAAIqF,OAAO0C,KAAX,EAAkB;CAChB,YAAKA,KAAL,CAAW1C,MAAX;;CACA;CACD;;CANsB;CAOxB;CAED;;;;;;;;;;;6BAO4B;CAAA,UAAtBA,MAAsB,uEAAb,KAAKA,MAAQ;;CAAA,8BACG,KAAK1C,WAAL,CAAiB;CAC5CiF,kBAAU,KAAKmG,aAAL,CAAmB1I,MAAnB,CADkC;CAE5CwC,kBAAUxC,OAAOwC;CAF2B,OAAjB,CADH;CAAA,UACnBD,QADmB,qBACnBA,QADmB;CAAA,UACTC,QADS,qBACTA,QADS;;CAM1B,aAAO,KAAKlF,WAAL,CAAiB;CAAC8D,cAAM,IAAIkB,IAAJ,CAASC,QAAT,EAAmBC,QAAnB;CAAP,OAAjB,EAAuDpB,IAA9D;CACD;;;qCAE0B;CAAA,UAAbpB,MAAa,uEAAJ,EAAI;CACzB,UAAMuC,WAAW,KAAKvC,OAAO2I,MAAP,GAAgBsI,kBAAhB,GAAqCC,YAA1C,EACflR,OAAOuC,QAAP,CAAgBiN,IADD,EAEfxP,OAAOuC,QAAP,CAAgB8G,QAFD,EAGfrJ,OAAOuC,QAAP,CAAgB6B,MAHD,EAIfpE,OAAOuC,QAAP,CAAgBoH,cAJD,EAKf3J,OAAOuC,QAAP,CAAgB4O,MALD,CAAjB;CAQA,aAAO5O,QAAP;CACD;;;;;;GA1FgBH;;mCAAb4O,mCAkBC5O,cAAcnC;CACjBsC,YAAU;CACRiN,UAAM,IAAI4B,UAAJ,CAAe,IAAIxD,OAAJ,CAAY,CAAZ,EAAe,CAAf,EAAkB,CAAlB,CAAf,EAAqC,IAAIA,OAAJ,CAAY,CAAZ,EAAe,CAAf,EAAkB,CAAlB,CAArC,CADE;CAERvE,cAAU,EAFF;CAGRjF,YAAQ,CAHA;CAIRuF,oBAAgB,CAJR;CAKRwH,YAAQ;CALA;uCA0BP/O,cAAczH;CACjB4H,YAAU,CACR,MADQ,EAER,UAFQ,EAGR,QAHQ,EAIR,gBAJQ,EAKR,QALQ;;;CCxFd;;;;;;;;;;;;;;;;;;;;;;KAqBM8O;;;CACJ,sBAAwB;CAAA;;CAAA;;CACtB,kFAAM,EAAN;;CAEA,SAAK,IAAI/W,IAAI,CAAb,EAAgBA,IAAI,UAAQE,MAA5B,EAAoCF,GAApC,EAAyC;CACvC,UAAMgX,MAAchX,CAAd,4BAAcA,CAAd,yBAAcA,CAAd,CAAN;CAEA,UAAIgX,eAAevR,SAAnB,EAA8BuR,IAAIC,KAAJ,sDAA9B,KACK,IAAID,eAAeE,QAAnB,EAA6B,MAAK7Q,MAAL,CAAYK,GAAZ,CAAgBsQ,GAAhB;CACnC;;CARqB;CASvB;;;;6BAEO;CACN,aAAO,IAAIE,QAAJ,EAAP;CACD;;;;;;GAdiBpP;;CCzBpB;;CCAA;;;;;;;;;;AAUA,KAAaqP,aAAb;CAAA;CAAA;CACE,2BAAuC;CAAA,QAA3BC,SAA2B,uEAAfte,SAASue,IAAM;;CAAA;;CACrC,QAAID,UAAUA,SAAd,EAAyB;CACvBnV,cAAQoD,IAAR,CAAa,qFAAb;CACA,WAAK+R,SAAL,GAAiBA,UAAUA,SAA3B;CACD,KAHD,MAGO,KAAKA,SAAL,GAAiBA,SAAjB;;CAEP,SAAKE,aAAL;CACD;CAED;;;;;;;;CAVF;CAAA;CAAA,oCAgBkB;CACd,WAAKC,OAAL,GAAe7M,OAAO5R,QAAP,CAAgBwe,aAAhB,CAA8B,KAA9B,CAAf;CAEA,WAAKC,OAAL,CAAaC,SAAb,GAAyB,SAAzB;CACA,WAAKD,OAAL,CAAaE,KAAb,CAAmB9N,KAAnB,GAA2B,SAA3B;CACA,WAAK4N,OAAL,CAAaE,KAAb,CAAmB7N,MAAnB,GAA4B,SAA5B;CACA,WAAK2N,OAAL,CAAaE,KAAb,CAAmBjP,QAAnB,GAA8B,UAA9B;CACD;CAvBH;CAAA;CAAA,4BAyBU9E,QAzBV,EAyBmB;CACfA,eAAQ4B,GAAR,CAAY,SAAZ,EAAuB,KAAKiS,OAA5B;;CACA7T,eAAQ4B,GAAR,CAAY,WAAZ,EAAyB,KAAK8R,SAA9B;CACD;CA5BH;CAAA;CAAA,8BA8BYM,IA9BZ,EA8BkB;CACdA,WAAKN,SAAL,CAAeO,WAAf,CAA2BD,KAAKH,OAAhC;CACD;CAhCH;;CAAA;CAAA;;CCHA;;;;;;;;;;;;;;;;;;;;;;;AAsBA,KAAaK,eAAb;CAAA;CAAA;CACE;;;;;;;;CAaA;;;;;;CAQA,6BAAqC;CAAA,QAAzBlS,MAAyB,uEAAhB,EAAgB;CAAA,QAAZmS,UAAY;;CAAA;;CAAA,sCAF3B,IAE2B;;CACnC,SAAKnS,MAAL,GAAcrG,OAAOiW,MAAP,CAAc;CAC1B3L,aAAOe,OAAOoD,UADY;CAE1BlE,cAAQc,OAAOqD,WAFW;CAI1B+J,kBAAY,IAAIC,OAAJ,CAAY,CAAZ,EAAe,CAAf,CAJc;CAK1BC,kBAAYtN,OAAOuN,gBALO;CAO1BC,eAAS,QAPiB;CAQ1BC,iBAAW,CARe;CAU1BC,gBAAU,EAVgB;CAW1BC,SAX0B,iBAWpB;CAXoB,KAAd,EAYX3S,MAZW,CAAd;CADmC,uBAwB/B,KAAKA,MAxB0B;CAAA,QAgBjCwS,OAhBiC,gBAgBjCA,OAhBiC;CAAA,QAiBjCC,SAjBiC,gBAiBjCA,SAjBiC;CAAA,QAkBjCC,SAlBiC,gBAkBjCA,QAlBiC;CAAA,QAmBjCJ,UAnBiC,gBAmBjCA,UAnBiC;CAAA,QAoBjCrO,KApBiC,gBAoBjCA,KApBiC;CAAA,QAqBjCC,MArBiC,gBAqBjCA,MArBiC;CAAA,QAsBjCkO,UAtBiC,gBAsBjCA,UAtBiC;CAAA,QAuBjCO,GAvBiC,gBAuBjCA,GAvBiC;CA0BnC,SAAKD,QAAL,GAAgB,IAAIE,aAAJ,CAAkBF,SAAlB,CAAhB;CACA,SAAKG,OAAL,GAAe,EAAf;CAEA,SAAKH,QAAL,CAAcI,aAAd,CACEN,OADF,EAEEC,SAFF;CAKA,QAAIH,UAAJ,EAAgB,KAAKI,QAAL,CAAcK,aAAd,CAA4BT,UAA5B;CAEhB,SAAKU,OAAL,CACEC,OAAOhP,QAAQmO,WAAWlP,CAA1B,EAA6BgQ,OAA7B,EADF,EAEED,OAAO/O,SAASkO,WAAWjP,CAA3B,EAA8B+P,OAA9B,EAFF;;CAKA,SAAK,IAAMtY,GAAX,IAAkBuX,UAAlB;CACE,UAAIA,WAAWvX,GAAX,CAAJ,EAAqB,KAAKuY,eAAL,CAAqBvY,GAArB;CADvB;;CAGA+X,QAAI,KAAKD,QAAT;CACD;CAED;;;;;;;;;CArEF;CAAA;CAAA,oCA4EkBjW,IA5ElB,EA4EwB;CACpByV,sBAAgBC,UAAhB,CAA2B1V,IAA3B,EAAiCkB,KAAjC,CAAuC,IAAvC,EAA6C,CAAC,KAAK+U,QAAN,CAA7C;CACD;CAED;;;;;;;;;;CAhFF;CAAA;CAAA,sCAyFoBb,OAzFpB,EAyF6BuB,KAzF7B,EAyFoC9O,MAzFpC,EAyF4C;CAAA;;CACxC,WAAK8O,KAAL,GAAaA,KAAb;CACA,WAAK9O,MAAL,GAAcA,MAAd;CACA,WAAK+O,cAAL,CAAoBxB,OAApB;CAEA,aAAO,IAAI5L,IAAJ,CAAS;CAAA,eAAM,MAAKyM,QAAL,CAAcY,MAAd,CAAqB,MAAKF,KAA1B,EAAiC,MAAK9O,MAAtC,CAAN;CAAA,OAAT,CAAP;CACD;CAED;;;;;;;;;CAjGF;CAAA;CAAA,2BAyGSiP,OAzGT,EA2GK;CAAA;;CAAA,UAFYC,UAEZ,uEAFyB,YAAM;CAChCD,gBAAOD,MAAP,CAAc,OAAKF,KAAnB,EAA0B,OAAK9O,MAA/B;CACD,OAAE;CACD,WAAKmP,UAAL,CAAgBlN,IAAhB;CAEA,UAAMsJ,OAAO,KAAK6C,QAAL,CAAcgB,OAAd,EAAb;;CACAH,cAAOP,OAAP,CAAenD,KAAK5L,KAApB,EAA2B4L,KAAK3L,MAAhC;;CAEA,UAAM6B,OAAO,IAAIE,IAAJ,CAASuN,UAAT,CAAb;CAEA,WAAKX,OAAL,CAAa9U,IAAb,CAAkBgI,IAAlB;CACA,UAAI,KAAKL,OAAT,EAAkBK,KAAKO,KAAL,CAAW,KAAKqN,GAAhB;CAElB,aAAO,IAAP;CACD;CAED;;;;;;;;CAzHF;CAAA;CAAA,4BAgIU1P,KAhIV,EAgIiBC,MAhIjB,EAgIyB;CACrB,UAAI,KAAKwO,QAAT,EAAmB,KAAKA,QAAL,CAAcM,OAAd,CAAsB/O,KAAtB,EAA6BC,MAA7B;CACpB;CAED;;;;;;;CApIF;CAAA;CAAA,mCA0IiB2N,OA1IjB,EA0I0B;CACtB,UAAM+B,SAAS,KAAKlB,QAAL,CAAcmB,UAA7B,CADsB;;CAItBhC,cAAQI,WAAR,CAAoB2B,MAApB;CACAA,aAAO7B,KAAP,CAAa9N,KAAb,GAAqB,MAArB;CACA2P,aAAO7B,KAAP,CAAa7N,MAAb,GAAsB,MAAtB;CACD;CAED;;;;;;CAnJF;CAAA;CAAA,2BAwJS;CACL,WAAKwB,OAAL,GAAe,KAAf;CACA,WAAK+N,UAAL,CAAgBlN,IAAhB;CACA,WAAKsM,OAAL,CAAa3G,OAAb,CAAqB;CAAA,eAAQnG,KAAKQ,IAAL,EAAR;CAAA,OAArB;CACD;CAED;;;;;;CA9JF;CAAA;CAAA,2BAmKS;CACL,WAAKb,OAAL,GAAe,IAAf;CACA,WAAK+N,UAAL,CAAgBnN,KAAhB;CACA,WAAKuM,OAAL,CAAa3G,OAAb,CAAqB;CAAA,eAAQnG,KAAKO,KAAL,EAAR;CAAA,OAArB;CACD;CAvKH;CAAA;CAAA,4BAyKUtI,QAzKV,EAyKmB;CAAA;;CACfA,eAAQ8V,MAAR,CAAe,WAAf;;CACA9V,eAAQ4B,GAAR,CAAY,UAAZ,EAAwB,KAAK8S,QAA7B;;CAEA,WAAKiB,GAAL,GAAW3V,SAAQY,OAAnB;CAEA,WAAK6U,UAAL,GAAkB,KAAKM,iBAAL,CAChB/V,SAAQO,GAAR,CAAY,SAAZ,CADgB,EAEhBP,SAAQO,GAAR,CAAY,OAAZ,CAFgB,EAGhBP,SAAQO,GAAR,CAAY,QAAZ,EAAsBoC,MAHN,CAAlB;;CAMA3C,eAAQgW,MAAR,CAAe;CACbnC,iBAAS,2BAAW;CAClB,iBAAKwB,cAAL,CAAoBxB,QAApB;CACD,SAHY;CAIbuB,eAAO,uBAAS;CACd,iBAAKA,KAAL,GAAaA,MAAb;CACD,SANY;CAOb9O,gBAAQ,yBAAU;CAChB,iBAAKA,MAAL,GAAcA,QAAO3D,MAArB;CACD;CATY,OAAf;CAWD;CAhMH;CAAA;CAAA,8BAkMYqR,IAlMZ,EAkMkB;CAAA;;CACdA,WAAKyB,UAAL,CAAgBnN,KAAhB,CAAsB,IAAtB;CACA0L,WAAKa,OAAL,CAAa3G,OAAb,CAAqB;CAAA,eAAQnG,KAAKO,KAAL,CAAW,MAAX,CAAR;CAAA,OAArB;CACD;CAED;;;;;;CAvMF;CAAA;CAAA,8BA4MY;CACR,WAAKC,IAAL;CACA,WAAKmM,QAAL,CAAcuB,gBAAd;CACD;CA/MH;;CAAA;CAAA;;kBAAa/B,+BAQS;CAClBjP,QADkB,kBACXyP,QADW,EACD;CACfA,aAASwB,SAAT,CAAmBxO,OAAnB,GAA6B,IAA7B;CACD;CAHiB;;CCjCtB,IAAMyO,4BAA4BC,OAAO,2BAAP,CAAlC;CAEA;;;;;;;AAMA,KAAaC,WAAb;CAAA;CAAA;CACE,yBAAyC;CAAA,QAA7BC,mBAA6B,uEAAP,KAAO;;CAAA;;CACvC,SAAKlB,KAAL,GAAakB,sBAAsB,IAAtB,GAA6B,IAAIC,KAAJ,EAA1C;CACD;;CAHH;CAAA;CAAA,4BAKUvW,QALV,EAKmB;CACfA,eAAQ4B,GAAR,CAAY,OAAZ,EAAqB,KAAKwT,KAA1B;CACD;CAPH;CAAA;CAAA,8BASYpB,IATZ,EASkB;CACdrY,aAAOiW,MAAP,CACE,IADF,EAEE;CACQ5O,WADR;CAAA;CAAA;CAAA,4CACYxH,MADZ;CAAA;CAAA;CAAA;CAAA;CAAA,yBAEQA,OAAOqH,MAFf;CAAA;CAAA;CAAA;;CAAA;CAAA,2BAE6BrH,OAAOqH,MAAP,CAAcC,MAAd,CAAqBtH,MAArB,CAF7B;;CAAA;CAAA;CAAA,2BAIUA,OAAO+G,IAAP,EAJV;;CAAA;CAAA,wBAMS/G,OAAOmH,MANhB;CAAA;CAAA;CAAA;;CAAA,0BAOY,IAAI7E,gBAAJ,CACJ,aADI,EAEJ,2BAFI,EAGJ,IAHI,CAPZ;;CAAA;CAcItC,2BAAOqH,MAAP,GAAgB,IAAhB;CAdJ;CAAA,2BAeU,KAAKvD,WAAL,CAAiB;CAACyD,6BAAOvH;CAAR,qBAAjB,EAAkCuH,KAf5C;;CAAA;CAgBIiR,yBAAKoB,KAAL,CAAWpS,GAAX,CAAexH,OAAOmH,MAAtB;CACA,yBAAKM,QAAL,CAAclD,IAAd,CAAmBvE,MAAnB;CAjBJ,qDAmBWA,MAnBX;;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;CAAA;CAAA;CAAA;CAAA;CAqBQsH,cArBR;CAAA;CAAA;CAAA,6CAqBetH,MArBf;CAAA;CAAA;CAAA;CAAA;CAAA,0BAsBQA,OAAOqH,MAAP,KAAkB,IAtB1B;CAAA;CAAA;CAAA;;CAAA;;CAAA;CAAA;CAAA,2BAwBUrH,OAAO+G,IAAP,EAxBV;;CAAA;CAyBI,yBAAKjD,WAAL,CAAiB;CAACkX,gCAAUhb;CAAX,qBAAjB;CAEAA,2BAAOqH,MAAP,GAAgB,IAAhB;CACAmR,yBAAKoB,KAAL,CAAWtS,MAAX,CAAkBtH,OAAOmH,MAAzB;CACA,yBAAKM,QAAL,CAAc5E,MAAd,CAAqB,KAAK4E,QAAL,CAAc7C,OAAd,CAAsB5E,MAAtB,CAArB,EAAoD,CAApD;;CA7BJ;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;CAAA;CAAA;CAAA;CAAA;CA+BEib,iBA/BF,qBA+BYrB,KA/BZ,EA+BmB;CACf,eAAKnS,QAAL,GAAgBmS,MAAMe,yBAAN,IAAmCf,MAAMe,yBAAN,KAAoC,EAAvF;CACAnC,eAAKoB,KAAL,GAAaA,KAAb;CACD,SAlCH;CAmCEsB,gBAnCF,oBAmCWtB,KAnCX,EAmCkB;CACd,eAAKqB,SAAL,CAAerB,KAAf;;CACA,eAAKpV,OAAL,CAAa4B,GAAb,CAAiB,OAAjB,EAA0BwT,KAA1B;CACD,SAtCH;CAuCEuB,gBAvCF,sBAuCa;CACT,iBAAO3C,KAAKoB,KAAZ;CACD;CAzCH,OAFF;CA8CA,UAAIpB,KAAKoB,KAAT,EAAgB,KAAKqB,SAAL,CAAezC,KAAKoB,KAApB;CACjB;CAzDH;;CAAA;CAAA;;CCZA;;CAEA;;;;;;AAMA,KAAawB,YAAb;CAAA;CAAA;CACE,0BAAyB;CAAA,QAAb5U,MAAa,uEAAJ,EAAI;;CAAA;;CACvB,SAAKA,MAAL,GAAcrG,OAAOiW,MAAP,CAAc;CAC1BiF,YAAM;CADoB,KAAd,EAEX7U,MAFW,CAAd;CAIA,SAAK8U,SAAL,GAAiB,CAAC,KAAK9B,OAAL,CAAavX,IAAb,CAAkB,IAAlB,CAAD,CAAjB;CACD;CAED;;;;;;;;;;CATF;CAAA;CAAA,8BAiBiC;CAAA,UAAvBwI,KAAuB,uEAAf,CAAe;CAAA,UAAZC,MAAY,uEAAH,CAAG;CAC7B,WAAKI,MAAL,CAAY3D,MAAZ,CAAmB6H,MAAnB,GAA4BvE,QAAQC,MAApC;CACA,WAAKI,MAAL,CAAY3D,MAAZ,CAAmBoU,sBAAnB;CAEA,UAAI,KAAKC,SAAT,EAAoB,KAAKA,SAAL,CAAehC,OAAf,CAAuB/O,KAAvB,EAA8BC,MAA9B;CACrB;CAED;;;;;;;;CAxBF;CAAA;CAAA,8BA+BY;CAAA,4BAOJ,IAPI,CAENwN,SAFM;CAAA,UAGJuD,WAHI,mBAGJA,WAHI;CAAA,UAIJC,YAJI,mBAIJA,YAJI;CAAA,UAMN9C,UANM,GAOJ,IAPI,CAMNA,UANM;CASR,UAAMnO,QAAQgP,OAAOgC,cAAc7C,WAAWlP,CAAhC,EAAmCgQ,OAAnC,EAAd;CACA,UAAMhP,SAAS+O,OAAOiC,eAAe9C,WAAWjP,CAAjC,EAAoC+P,OAApC,EAAf;CAEA,WAAK4B,SAAL,CAAe5I,OAAf,CAAuB,cAAM;CAC3BtO,WAAGqG,KAAH,EAAUC,MAAV;CACD,OAFD;CAGD;CAED;;;;;;;CAhDF;CAAA;CAAA,oCAsDkB;CACd,WAAKwN,SAAL,GAAiB,KAAKyD,YAAL,EAAjB;CACA,WAAK/C,UAAL,GAAkB,KAAKgD,aAAL,EAAlB;CAEA,UAAI,KAAKpV,MAAL,CAAY6U,IAAhB,EAAsB7P,OAAOqQ,gBAAP,CAAwB,QAAxB,EAAkC,KAAKC,OAAL,CAAa7Z,IAAb,CAAkB,IAAlB,CAAlC;CACvB;CAED;;;;;;;;CA7DF;CAAA;CAAA,gCAoEcoC,IApEd,EAoEoB;CAChB,WAAKiX,SAAL,CAAe/W,IAAf,CAAoBF,IAApB;CACD;CAtEH;CAAA;CAAA,4BAwEUG,QAxEV,EAwEmB;CAAA;;CACfA,eAAQ8V,MAAR,CAAe,QAAf;;CAEA,WAAKkB,SAAL,GAAiBhX,SAAQO,GAAR,CAAY,UAAZ,CAAjB;CACA,WAAK+F,MAAL,GAActG,SAAQO,GAAR,CAAY,QAAZ,CAAd;;CAEA,WAAK6W,aAAL,GAAqB;CAAA,eAAMpX,SAAQ8B,GAAR,CAAY,WAAZ,EAAyBE,MAAzB,CAAgCoS,UAAtC;CAAA,OAArB;;CACA,WAAK+C,YAAL,GAAoB;CAAA,eAAMnX,SAAQO,GAAR,CAAY,WAAZ,CAAN;CAAA,OAApB;;CAEAP,eAAQgW,MAAR,CAAe;CACbtC,mBAAW,+BAAa;CACtB,gBAAKA,SAAL,GAAiBA,UAAjB;CACD;CAHY,OAAf;;CAMA,WAAK6D,aAAL;CACD;CAxFH;;CAAA;CAAA;;CCNA,IAAMC,WAAW,soBAAjB;CACA,IAAMC,SAAS,qJAAf;CAEA;;;;AAIA,KAAaC,0BAAb;CAAA;CAAA;CAEC;;;CAIA,wCAAc;CAAA;;CAAA,mGAEP;CAELtW,YAAM,4BAFD;CAILuW,eAAS;CAERC,uBAAe;CAFP,OAJJ;CAULC,gBAAU;CAETC,sBAAc,IAAIC,OAAJ,CAAY,IAAZ,CAFL;CAGTC,qBAAa,IAAID,OAAJ,CAAY,IAAZ,CAHJ;CAITE,sBAAc,IAAIF,OAAJ,CAAY,IAAZ,CAJL;CAKTG,eAAO,IAAIH,OAAJ,CAAY,GAAZ,CALE;CAMTI,aAAK,IAAIJ,OAAJ,CAAY,GAAZ;CANI,OAVL;CAoBLK,sBAAgBZ,QApBX;CAqBLa,oBAAcZ,MArBT;CAuBLa,kBAAY,KAvBP;CAwBLC,iBAAW;CAxBN,KAFO;CA8Bb;;CApCF;;CAAA;CAAA,EAAgDC,cAAhD;;CCPA,IAAMhB,aAAW,6lKAAjB;CACA,IAAMC,WAAS,qJAAf;CAEA;;;;;;;AAOA,KAAagB,aAAb;CAAA;CAAA;CAEC;;;;;;;;;;CAWA,yBAAYnS,MAAZ,EAAkC;CAAA;;CAAA,QAAdmG,OAAc,uEAAJ,EAAI;;CAAA;;CAEjC,QAAMiM,WAAW/c,OAAOiW,MAAP,CAAc;CAC9B+G,aAAO,GADuB;CAE9BC,WAAK,IAFyB;CAG9BC,gBAAU,KAHoB;CAI9BC,eAAS;CAJqB,KAAd,EAKdrM,OALc,CAAjB;CAOA,uFAAM;CAELrL,YAAM,eAFD;CAILyW,gBAAU;CAETkB,oBAAY,IAAIhB,OAAJ,CAAY,GAAZ,CAFH;CAGTiB,mBAAW,IAAIjB,OAAJ,CAAY,IAAZ,CAHF;CAITvN,gBAAQ,IAAIuN,OAAJ,CAAY,GAAZ,CAJC;CAMTkB,kBAAU,IAAIlB,OAAJ,CAAY,IAAZ,CAND;CAOTmB,gBAAQ,IAAInB,OAAJ,CAAY,IAAZ,CAPC;CASTY,eAAO,IAAIZ,OAAJ,CAAYW,SAASC,KAArB,CATE;CAUTC,aAAK,IAAIb,OAAJ,CAAYW,SAASE,GAArB,CAVI;CAWTC,kBAAU,IAAId,OAAJ,CAAYW,SAASG,QAArB,CAXD;CAYTC,iBAAS,IAAIf,OAAJ,CAAYW,SAASI,OAArB;CAZA,OAJL;CAoBLV,sBAAgBZ,UApBX;CAqBLa,oBAAcZ,QArBT;CAuBLa,kBAAY,KAvBP;CAwBLC,iBAAW;CAxBN,KAAN;;CA4BA,UAAKY,mBAAL,CAAyB7S,MAAzB;;CArCiC;CAuCjC;CAED;;;;;;;CAtDD;CAAA;CAAA,0CA4DoC;CAAA,UAAfA,MAAe,uEAAN,IAAM;;CAElC,UAAGA,WAAW,IAAd,EAAoB;CAEnB,aAAKuR,QAAL,CAAckB,UAAd,CAAyB7U,KAAzB,GAAiCoC,OAAOC,IAAxC;CACA,aAAKsR,QAAL,CAAcmB,SAAd,CAAwB9U,KAAxB,GAAgCoC,OAAOE,GAAvC;CACA,aAAKqR,QAAL,CAAcrN,MAAd,CAAqBtG,KAArB,GAA6BoC,OAAOkE,MAApC;CAEA;CAED;CAtEF;;CAAA;;CAAA;CAAA,EAAmCgO,cAAnC;;CCVA,IAAMhB,aAAW,isDAAjB;CACA,IAAMC,WAAS,ghBAAf;CAEA;;;;;;AAMA,KAAa2B,kBAAb;CAAA;CAAA;CAEC;;;;;CAMA,gCAAuC;CAAA,QAA3BC,SAA2B,uEAAf,IAAIhF,OAAJ,EAAe;;CAAA;;CAAA,2FAEhC;CAELjT,YAAM,oBAFD;CAILuW,eAAS;CAER2B,wBAAgB;CAFR,OAJJ;CAULzB,gBAAU;CAEToB,kBAAU,IAAIlB,OAAJ,CAAY,IAAZ,CAFD;CAGTsB,mBAAW,IAAItB,OAAJ,CAAYsB,SAAZ;CAHF,OAVL;CAiBLjB,sBAAgBZ,UAjBX;CAkBLa,oBAAcZ,QAlBT;CAoBLa,kBAAY,KApBP;CAqBLC,iBAAW;CArBN,KAFgC;CA2BtC;CAED;;;;;;;;;;;;;;;;CArCD;CAAA;CAAA,8CAoD2BgB,SApD3B,EAoDsC;CAEpC,WAAK5B,OAAL,CAAa2B,cAAb,GAA8BC,UAAUrE,OAAV,CAAkB,GAAlB,CAA9B;CAEA,WAAKsE,WAAL,GAAmB,IAAnB;CAEA;CA1DF;;CAAA;;CAAA;CAAA,EAAwChB,cAAxC;;CCTA,IAAMhB,aAAW,6nBAAjB;CACA,IAAMC,WAAS,qJAAf;CAEA;;;;;;;;;;AAUA,KAAagC,eAAb;CAAA;CAAA;CAEC;;;;;CAMA,6BAAgC;CAAA;;CAAA,QAApBC,UAAoB,uEAAP,KAAO;;CAAA;;CAE/B,yFAAM;CAELtY,YAAM,iBAFD;CAILyW,gBAAU;CAET8B,kBAAU,IAAI5B,OAAJ,CAAY,IAAZ,CAFD;CAGT6B,kBAAU,IAAI7B,OAAJ,CAAY,IAAZ,CAHD;CAKT8B,kBAAU,IAAI9B,OAAJ,CAAY,GAAZ,CALD;CAMT+B,kBAAU,IAAI/B,OAAJ,CAAY,GAAZ;CAND,OAJL;CAcLK,sBAAgBZ,UAdX;CAeLa,oBAAcZ,QAfT;CAiBLa,kBAAY,KAjBP;CAkBLC,iBAAW;CAlBN,KAAN;;CAsBA,UAAKwB,oBAAL,CAA0BL,UAA1B;;CAxB+B;CA0B/B;CAED;;;;;;;CApCD;CAAA;CAAA,yCA0CsBhS,OA1CtB,EA0C+B;CAE7B,UAAGA,OAAH,EAAY;CAEX,aAAKiQ,OAAL,CAAaqC,WAAb,GAA2B,GAA3B;CAEA,OAJD,MAIO;CAEN,eAAO,KAAKrC,OAAL,CAAaqC,WAApB;CAEA;;CAED,WAAKR,WAAL,GAAmB,IAAnB;CAEA;CAxDF;;CAAA;;CAAA;CAAA,EAAqChB,cAArC;;CCbA,IAAMhB,aAAW,snBAAjB;CACA,IAAMC,WAAS,4hBAAf;CAEA;;;;;;;;;;;;;;AAcA,KAAawC,mBAAb;CAAA;CAAA;CAEC;;;;;CAMA,iCAAuC;CAAA;;CAAA,QAA3BZ,SAA2B,uEAAf,IAAIhF,OAAJ,EAAe;;CAAA;;CAEtC,6FAAM;CAELjT,YAAM,qBAFD;CAILyW,gBAAU;CAEToB,kBAAU,IAAIlB,OAAJ,CAAY,IAAZ,CAFD;CAGTsB,mBAAW,IAAItB,OAAJ,CAAY,IAAI1D,OAAJ,EAAZ,CAHF;CAIT6F,uBAAe,IAAInC,OAAJ,CAAY,IAAI1D,OAAJ,EAAZ,CAJN;CAKT8F,gBAAQ,IAAIpC,OAAJ,CAAY,GAAZ;CALC,OAJL;CAaLK,sBAAgBZ,UAbX;CAcLa,oBAAcZ,QAdT;CAgBLa,kBAAY,KAhBP;CAiBLC,iBAAW;CAjBN,KAAN;;CAqBA,UAAK6B,YAAL,CAAkBf,UAAUnU,CAA5B,EAA+BmU,UAAUlU,CAAzC;CAEA;;;;;;;;CAOA,UAAKkV,UAAL,GAAkBC,WAAWC,KAA7B;CAhCsC;CAkCtC;CAED;;;;;;;CA5CD;CAAA;CAAA,gCAkDa;CAEX,aAAOC,cAAc,KAAKH,UAAnB,CAAP;CAEA;CAED;;;;;;;CAxDD;CAAA;CAAA,iCA+DcnV,CA/Dd,EA+DiBC,CA/DjB,EA+DoB;CAElB,WAAK0S,QAAL,CAAcwB,SAAd,CAAwBnV,KAAxB,CAA8BtC,GAA9B,CAAkCsD,CAAlC,EAAqCC,CAArC;CACA,WAAK0S,QAAL,CAAcqC,aAAd,CAA4BhW,KAA5B,CAAkCtC,GAAlC,CAAsCsD,CAAtC,EAAyCC,CAAzC,EAA4CsV,cAA5C,CAA2D,GAA3D;CAEA;CApEF;;CAAA;;CAAA;CAAA,EAAyCjC,cAAzC;CAwEA;;;;;;;CAOA,IAAMgC,gBAAgB,CACrB,IAAI9M,YAAJ,CAAiB,CAAC,GAAD,EAAM,GAAN,CAAjB,CADqB,EAErB,IAAIA,YAAJ,CAAiB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,CAAjB,CAFqB,EAGrB,IAAIA,YAAJ,CAAiB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAAjB,CAHqB,EAIrB,IAAIA,YAAJ,CAAiB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,EAAqB,GAArB,CAAjB,CAJqB,EAKrB,IAAIA,YAAJ,CAAiB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,EAAqB,GAArB,EAA0B,GAA1B,EAA+B,GAA/B,CAAjB,CALqB,EAMrB,IAAIA,YAAJ,CAAiB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,EAAqB,GAArB,EAA0B,GAA1B,EAA+B,GAA/B,EAAoC,GAApC,EAAyC,GAAzC,EAA8C,IAA9C,CAAjB,CANqB,CAAtB;CASA;;;;;;;;;;;;AAYA,CAAO,IAAM4M,aAAa;CAEzBI,cAAY,CAFa;CAGzBC,SAAO,CAHkB;CAIzBC,UAAQ,CAJiB;CAKzBL,SAAO,CALkB;CAMzBM,cAAY,CANa;CAOzBC,QAAM;CAPmB,CAAnB;;CCrHP,IAAMtD,aAAW,uMAAjB;CACA,IAAMC,WAAS,qJAAf;CAEA;;;;AAIA,KAAasD,YAAb;CAAA;CAAA;CAEC;;;CAIA,0BAAc;CAAA;;CAAA,qFAEP;CAEL3Z,YAAM,cAFD;CAILyW,gBAAU;CAEToB,kBAAU,IAAIlB,OAAJ,CAAY,IAAZ,CAFD;CAGTiD,iBAAS,IAAIjD,OAAJ,CAAY,GAAZ;CAHA,OAJL;CAWLK,sBAAgBZ,UAXX;CAYLa,oBAAcZ,QAZT;CAcLa,kBAAY,KAdP;CAeLC,iBAAW;CAfN,KAFO;CAqBb;;CA3BF;;CAAA;CAAA,EAAkCC,cAAlC;;CCPA,IAAMhB,aAAW,s5BAAjB;CACA,IAAMC,WAAS,wfAAf;CAEA;;;;AAIA,KAAawD,uBAAb;CAAA;CAAA;CAEC;;;;;;CAOA,qCAAyC;CAAA;;CAAA,QAA7BC,YAA6B,uEAAd,IAAc;CAAA,QAAR5U,MAAQ;;CAAA;;CAExC,iGAAM;CAELlF,YAAM,yBAFD;CAILyW,gBAAU;CAETqB,gBAAQ,IAAInB,OAAJ,CAAYmD,YAAZ,CAFC;CAGTnC,oBAAY,IAAIhB,OAAJ,CAAY,GAAZ,CAHH;CAITiB,mBAAW,IAAIjB,OAAJ,CAAY,IAAZ;CAJF,OAJL;CAYLK,sBAAgBZ,UAZX;CAaLa,oBAAcZ,QAbT;CAeLa,kBAAY,KAfP;CAgBLC,iBAAW,KAhBN;CAkBL4C,oBAAc,IAlBT;CAmBLC,gBAAU;CAnBL,KAAN;;CAuBA,UAAKjC,mBAAL,CAAyB7S,MAAzB;;CAzBwC;CA2BxC;CAED;;;;;;;CAtCD;CAAA;CAAA,0CA4CoC;CAAA,UAAfA,MAAe,uEAAN,IAAM;;CAElC,UAAGA,WAAW,IAAd,EAAoB;CAEnB,aAAKuR,QAAL,CAAckB,UAAd,CAAyB7U,KAAzB,GAAiCoC,OAAOC,IAAxC;CACA,aAAKsR,QAAL,CAAcmB,SAAd,CAAwB9U,KAAxB,GAAgCoC,OAAOE,GAAvC;;CAEA,YAAGF,kBAAkBgE,iBAArB,EAAwC;CAEvC,eAAKqN,OAAL,CAAa0D,kBAAb,GAAkC,GAAlC;CAEA,SAJD,MAIO;CAEN,iBAAO,KAAK1D,OAAL,CAAa0D,kBAApB;CAEA;CAED;CAED;CA/DF;;CAAA;;CAAA;CAAA,EAA6C7C,cAA7C;;CCPA,IAAMhB,aAAW,qxBAAjB;CACA,IAAMC,WAAS,6QAAf;CAEA;;;;AAIA,KAAa6D,iBAAb;CAAA;CAAA;CAEC;;;;;;;;;CAUA,+BAA0B;CAAA;;CAAA,QAAd7O,OAAc,uEAAJ,EAAI;;CAAA;;CAEzB,QAAMiM,WAAW/c,OAAOiW,MAAP,CAAc;CAC9B2J,eAAS,KADqB;CAE9B9R,aAAO,IAFuB;CAG9BzE,aAAO,GAHuB;CAI9B4D,iBAAW;CAJmB,KAAd,EAKd6D,OALc,CAAjB;CAOA,2FAAM;CAELrL,YAAM,mBAFD;CAILyW,gBAAU;CAEToB,kBAAU,IAAIlB,OAAJ,CAAY,IAAZ,CAFD;CAITtO,eAAO,IAAIsO,OAAJ,CAAYW,SAASjP,KAArB,CAJE;CAKTzE,eAAO,IAAI+S,OAAJ,CAAYW,SAAS1T,KAArB,CALE;CAMT4D,mBAAW,IAAImP,OAAJ,CAAYW,SAAS9P,SAArB,CANF;CAQT4S,sBAAc,IAAIzD,OAAJ,CAAY,IAAI0D,OAAJ,CAAY,GAAZ,EAAiB,GAAjB,EAAsB,GAAtB,EAA2B,GAA3B,CAAZ;CARL,OAJL;CAgBLrD,sBAAgBZ,UAhBX;CAiBLa,oBAAcZ,QAjBT;CAmBLa,kBAAY,KAnBP;CAoBLC,iBAAW;CApBN,KAAN;;CAwBA,UAAKmD,iBAAL,CAAuBhD,SAAS6C,OAAhC;;CAjCyB;CAmCzB;CAED;;;;;;;CAjDD;CAAA;CAAA,sCAuDmB7T,OAvDnB,EAuD4B;CAE1B,UAAGA,OAAH,EAAY;CAEX,aAAKiQ,OAAL,CAAagE,OAAb,GAAuB,GAAvB;CAEA,OAJD,MAIO;CAEN,eAAO,KAAKhE,OAAL,CAAagE,OAApB;CAEA;;CAED,WAAKnC,WAAL,GAAmB,IAAnB;CAEA;CArEF;;CAAA;;CAAA;CAAA,EAAuChB,cAAvC;;CCPA,IAAMhB,aAAW,ygGAAjB;CACA,IAAMC,WAAS,qJAAf;CAEA;;;;;;;;;;;;;;;;;;;;;;AAsBA,KAAamE,YAAb;CAAA;CAAA;CAEC;;;;;;;;;;;;;;;;;;;;CAqBA,0BAA0B;CAAA;;CAAA,QAAdnP,OAAc,uEAAJ,EAAI;;CAAA;;CAEzB,QAAMiM,WAAW/c,OAAOiW,MAAP,CAAc;CAE9B8H,kBAAY,IAFkB;CAG9BmC,aAAO,IAHuB;CAI9BC,iBAAW,IAJmB;CAK9BC,YAAM,KALwB;CAO9BC,iBAAW,KAPmB;CAQ9BC,aAAO,KARuB;CAS9BC,gBAAU,KAToB;CAU9BC,aAAO,KAVuB;CAY9BC,sBAAgB,GAZc;CAa9BC,yBAAmB,IAbW;CAc9BC,qBAAe,GAde;CAe9BC,0BAAoB,GAfU;CAgB9BC,sBAAgB,GAhBc;CAkB9BC,sBAAgB,GAlBc;CAmB9BC,wBAAkB;CAnBY,KAAd,EAqBdjQ,OArBc,CAAjB;CAuBA,sFAAM;CAELrL,YAAM,cAFD;CAILyW,gBAAU;CAEToB,kBAAU,IAAIlB,OAAJ,CAAY,IAAZ,CAFD;CAGT4E,cAAM,IAAI5E,OAAJ,CAAY,GAAZ,CAHG;CAKTqE,wBAAgB,IAAIrE,OAAJ,CAAYW,SAAS0D,cAArB,CALP;CAMTC,2BAAmB,IAAItE,OAAJ,CAAYW,SAAS2D,iBAArB,CANV;CAOTC,uBAAe,IAAIvE,OAAJ,CAAYW,SAAS4D,aAArB,CAPN;CASTM,uBAAe,IAAI7E,OAAJ,CAAY,GAAZ,CATN;CAUT8E,mBAAW,IAAI9E,OAAJ,CAAY,IAAI1D,OAAJ,EAAZ,CAVF;CAWTyI,uBAAe,IAAI/E,OAAJ,CAAY,GAAZ,CAXN;CAaTwE,4BAAoB,IAAIxE,OAAJ,CAAYW,SAAS6D,kBAArB,CAbX;CAcTC,wBAAgB,IAAIzE,OAAJ,CAAYW,SAAS8D,cAArB,CAdP;CAgBTC,wBAAgB,IAAI1E,OAAJ,CAAYW,SAAS+D,cAArB,CAhBP;CAiBTC,0BAAkB,IAAI3E,OAAJ,CAAYW,SAASgE,gBAArB;CAjBT,OAJL;CAyBLtE,sBAAgBZ,UAzBX;CA0BLa,oBAAcZ,QA1BT;CA4BLa,kBAAY,KA5BP;CA6BLC,iBAAW;CA7BN,KAAN;;CAiCA,UAAKwB,oBAAL,CAA0BrB,SAASgB,UAAnC;;CACA,UAAKqD,eAAL,CAAqBrE,SAASmD,KAA9B;;CACA,UAAKmB,mBAAL,CAAyBtE,SAASoD,SAAlC;;CACA,UAAKmB,cAAL,CAAoBvE,SAASqD,IAA7B;;CACA,UAAKmB,mBAAL,CAAyBxE,SAASsD,SAAlC;;CACA,UAAKmB,eAAL,CAAqBzE,SAASuD,KAA9B;;CACA,UAAKmB,kBAAL,CAAwB1E,SAASwD,QAAjC;;CACA,UAAKmB,eAAL,CAAqB3E,SAASyD,KAA9B;;CAjEyB;CAmEzB;CAED;;;;;;;CA5FD;CAAA;CAAA,yCAkGsBzU,OAlGtB,EAkG+B;CAE7B,UAAGA,OAAH,EAAY;CAEX,aAAKiQ,OAAL,CAAaqC,WAAb,GAA2B,GAA3B;CAEA,OAJD,MAIO;CAEN,eAAO,KAAKrC,OAAL,CAAaqC,WAApB;CAEA;;CAED,WAAKR,WAAL,GAAmB,IAAnB;CAEA;CAED;;;;;;CAlHD;CAAA;CAAA,oCAwHiB9R,OAxHjB,EAwH0B;CAExB,UAAGA,OAAH,EAAY;CAEX,aAAKiQ,OAAL,CAAa2F,KAAb,GAAqB,GAArB;CAEA,OAJD,MAIO;CAEN,eAAO,KAAK3F,OAAL,CAAa2F,KAApB;CAEA;;CAED,WAAK9D,WAAL,GAAmB,IAAnB;CAEA;CAED;;;;;;CAxID;CAAA;CAAA,wCA8IqB9R,OA9IrB,EA8I8B;CAE5B,UAAGA,OAAH,EAAY;CAEX,aAAKiQ,OAAL,CAAa4F,SAAb,GAAyB,GAAzB;CAEA,OAJD,MAIO;CAEN,eAAO,KAAK5F,OAAL,CAAa4F,SAApB;CAEA;;CAED,WAAK/D,WAAL,GAAmB,IAAnB;CAEA;CAED;;;;;;CA9JD;CAAA;CAAA,mCAoKgB9R,OApKhB,EAoKyB;CAEvB,UAAGA,OAAH,EAAY;CAEX,aAAKiQ,OAAL,CAAa6F,IAAb,GAAoB,GAApB;CAEA,OAJD,MAIO;CAEN,eAAO,KAAK7F,OAAL,CAAa6F,IAApB;CAEA;;CAED,WAAKhE,WAAL,GAAmB,IAAnB;CAEA;CAED;;;;;;CApLD;CAAA;CAAA,wCA0LqB9R,OA1LrB,EA0L8B;CAE5B,UAAGA,OAAH,EAAY;CAEX,aAAKiQ,OAAL,CAAa8F,SAAb,GAAyB,GAAzB;CAEA,OAJD,MAIO;CAEN,eAAO,KAAK9F,OAAL,CAAa8F,SAApB;CAEA;;CAED,WAAKjE,WAAL,GAAmB,IAAnB;CAEA;CAED;;;;;;CA1MD;CAAA;CAAA,oCAgNiB9R,OAhNjB,EAgN0B;CAExB,UAAGA,OAAH,EAAY;CAEX,aAAKiQ,OAAL,CAAa+F,KAAb,GAAqB,GAArB;CAEA,OAJD,MAIO;CAEN,eAAO,KAAK/F,OAAL,CAAa+F,KAApB;CAEA;;CAED,WAAKlE,WAAL,GAAmB,IAAnB;CAEA;CAED;;;;;;CAhOD;CAAA;CAAA,uCAsOoB9R,OAtOpB,EAsO6B;CAE3B,UAAGA,OAAH,EAAY;CAEX,aAAKiQ,OAAL,CAAagG,QAAb,GAAwB,GAAxB;CAEA,OAJD,MAIO;CAEN,eAAO,KAAKhG,OAAL,CAAagG,QAApB;CAEA;;CAED,WAAKnE,WAAL,GAAmB,IAAnB;CAEA;CAED;;;;;;;;CAtPD;CAAA;CAAA,oCA8PiB9R,OA9PjB,EA8P0B;CAExB,UAAGA,OAAH,EAAY;CAEX,aAAKiQ,OAAL,CAAaiG,KAAb,GAAqB,GAArB;CAEA,OAJD,MAIO;CAEN,eAAO,KAAKjG,OAAL,CAAaiG,KAApB;CAEA;;CAED,WAAKpE,WAAL,GAAmB,IAAnB;CAEA;CA5QF;;CAAA;;CAAA;CAAA,EAAkChB,cAAlC;;CCzBA,IAAMhB,aAAW,m6DAAjB;CACA,IAAMC,WAAS,qJAAf;CAEA;;;;;;;AAOA,KAAaoG,cAAb;CAAA;CAAA;CAEC;;;CAIA,4BAAc;CAAA;;CAAA,uFAEP;CAELzc,YAAM,gBAFD;CAILyW,gBAAU;CAEToB,kBAAU,IAAIlB,OAAJ,CAAY,IAAZ,CAFD;CAGT+F,kBAAU,IAAI/F,OAAJ,CAAY,IAAZ,CAHD;CAKT9X,gBAAQ,IAAI8X,OAAJ,CAAY,CAAZ,CALC;CAOTgG,gBAAQ,IAAIhG,OAAJ,CAAY,GAAZ,CAPC;CAQTtO,eAAO,IAAIsO,OAAJ,CAAY,IAAZ,CARE;CASTiG,cAAM,IAAIjG,OAAJ,CAAY,IAAZ,CATG;CAUTkG,eAAO,IAAIlG,OAAJ,CAAY,IAAZ,CAVE;CAWTmG,eAAO,IAAInG,OAAJ,CAAY,IAAZ,CAXE;CAYToG,qBAAa,IAAIpG,OAAJ,CAAY,GAAZ,CAZJ;CAaTqG,qBAAa,IAAIrG,OAAJ,CAAY,GAAZ,CAbJ;CAcTsG,cAAM,IAAItG,OAAJ,CAAY,IAAZ;CAdG,OAJL;CAsBLK,sBAAgBZ,UAtBX;CAuBLa,oBAAcZ,QAvBT;CAyBLa,kBAAY,KAzBP;CA0BLC,iBAAW;CA1BN,KAFO;CAgCb;;CAtCF;;CAAA;CAAA,EAAoCC,cAApC;;CCVA,IAAMhB,cAAW,ytCAAjB;CACA,IAAMC,YAAS,qJAAf;CAEA;;;;;;;;;;;;;;;;AAgBA,KAAa6G,eAAb;CAAA;CAAA;CAEC;;;;;;;;;;CAWA,6BAA0B;CAAA,QAAd7R,OAAc,uEAAJ,EAAI;;CAAA;;CAEzB,QAAMiM,WAAW/c,OAAOiW,MAAP,CAAc;CAC9B2M,gBAAU,GADoB;CAE9BC,eAAS,IAFqB;CAG9BlV,aAAO,IAHuB;CAI9BmV,cAAQ,GAJsB;CAK9BC,gBAAU;CALoB,KAAd,EAMdjS,OANc,CAAjB;CAFyB,wFAUnB;CAELrL,YAAM,iBAFD;CAILuW,eAAS;CAERgH,2BAAmB,MAFX;CAGRC,yBAAiB;CAHT,OAJJ;CAWL/G,gBAAU;CAEToB,kBAAU,IAAIlB,OAAJ,CAAY,IAAZ,CAFD;CAGT8G,uBAAe,IAAI9G,OAAJ,CAAY,IAAZ,CAHN;CAKTwG,kBAAU,IAAIxG,OAAJ,CAAYW,SAAS6F,QAArB,CALD;CAMTjV,eAAO,IAAIyO,OAAJ,CAAYW,SAASpP,KAArB,CANE;CAOTkV,iBAAS,IAAIzG,OAAJ,CAAYW,SAAS8F,OAArB,CAPA;CAQTC,gBAAQ,IAAI1G,OAAJ,CAAYW,SAAS+F,MAArB,CARC;CASTC,kBAAU,IAAI3G,OAAJ,CAAYW,SAASgG,QAArB;CATD,OAXL;CAwBLtG,sBAAgBZ,WAxBX;CAyBLa,oBAAcZ,SAzBT;CA2BLa,kBAAY,KA3BP;CA4BLC,iBAAW;CA5BN,KAVmB;CA0CzB;;CAvDF;;CAAA;CAAA,EAAqCC,cAArC;;CCnBA,IAAMhB,cAAW,4nBAAjB;CACA,IAAMC,YAAS,qJAAf;CAEA;;;;;;;;;;;;;;;;;;;;AAoBA,KAAaqH,kBAAb;CAAA;CAAA;CAEC;;;;;;CAOA,gCAAwD;CAAA;;CAAA,QAA5CC,WAA4C,uEAA9B,KAA8B;CAAA,QAAvBC,cAAuB,uEAAN,IAAM;;CAAA;;CAEvD,QAAMC,gBAAiBD,mBAAmB,IAA1C;CAEA,4FAAM;CAEL5d,YAAM,oBAFD;CAILyW,gBAAU;CAEToB,kBAAU,IAAIlB,OAAJ,CAAY,IAAZ,CAFD;CAGTmH,qBAAa,IAAInH,OAAJ,CAAY,GAAZ,CAHJ;CAIToH,eAAO,IAAIpH,OAAJ,CAAYkH,gBAAgBD,cAAhB,GAAiC,IAAI3K,OAAJ,EAA7C;CAJE,OAJL;CAYL+D,sBAAgBZ,WAZX;CAaLa,oBAAcZ;CAbT,KAAN;;CAiBA,UAAK2H,qBAAL,CAA2BL,WAA3B;;CACA,UAAKM,wBAAL,CAA8BJ,aAA9B;;CAtBuD;CAwBvD;CAED;;;;;;;CAnCD;CAAA;CAAA,0CAyCuBvX,OAzCvB,EAyCgC;CAE9B,UAAGA,OAAH,EAAY;CAEX,aAAKiQ,OAAL,CAAa2H,KAAb,GAAqB,GAArB;CAEA,OAJD,MAIO;CAEN,eAAO,KAAK3H,OAAL,CAAa2H,KAApB;CAEA;;CAED,WAAK9F,WAAL,GAAmB,IAAnB;CAEA;CAED;;;;;;CAzDD;CAAA;CAAA,6CA+D0B9R,OA/D1B,EA+DmC;CAEjC,UAAGA,OAAH,EAAY;CAEX,aAAKiQ,OAAL,CAAa4H,KAAb,GAAqB,GAArB;CAEA,OAJD,MAIO;CAEN,eAAO,KAAK5H,OAAL,CAAa4H,KAApB;CAEA;;CAED,WAAK/F,WAAL,GAAmB,IAAnB;CAEA;CA7EF;;CAAA;;CAAA;CAAA,EAAwChB,cAAxC;;CCvBA,IAAMhB,cAAW,+yCAAjB;CACA,IAAMC,YAAS,icAAf;CAEA;;;;AAIA,KAAa+H,oBAAb;CAAA;CAAA;CAEC;;;;;;;;;;;CAYA,kCAA0B;CAAA;;CAAA,QAAd/S,OAAc,uEAAJ,EAAI;;CAAA;;CAEzB,QAAMiM,WAAW/c,OAAOiW,MAAP,CAAc;CAC9B6N,oBAAc,GADgB;CAE9BC,oBAAc,GAFgB;CAG9BC,wBAAkB,QAHY;CAI9BC,uBAAiB,QAJa;CAK9BC,qBAAe,KALe;CAM9BC,YAAM;CANwB,KAAd,EAOdrT,OAPc,CAAjB;CASA,8FAAM;CAELrL,YAAM,sBAFD;CAILyW,gBAAU;CAETkI,eAAO,IAAIhI,OAAJ,CAAY,GAAZ,CAFE;CAGTvN,gBAAQ,IAAIuN,OAAJ,CAAY,GAAZ,CAHC;CAKTkB,kBAAU,IAAIlB,OAAJ,CAAY,IAAZ,CALD;CAMTiI,eAAO,IAAIjI,OAAJ,CAAY,IAAZ,CANE;CAOTkI,gBAAQ,IAAIlI,OAAJ,CAAY,IAAZ,CAPC;CAQTmI,kBAAU,IAAInI,OAAJ,CAAY,IAAZ,CARD;CAUT0H,sBAAc,IAAI1H,OAAJ,CAAYW,SAAS+G,YAArB,CAVL;CAWTC,sBAAc,IAAI3H,OAAJ,CAAYW,SAASgH,YAArB,CAXL;CAaTC,0BAAkB,IAAI5H,OAAJ,CAAY,IAAIoI,KAAJ,CAAUzH,SAASiH,gBAAnB,CAAZ,CAbT;CAcTC,yBAAiB,IAAI7H,OAAJ,CAAY,IAAIoI,KAAJ,CAAUzH,SAASkH,eAAnB,CAAZ;CAdR,OAJL;CAsBLxH,sBAAgBZ,WAtBX;CAuBLa,oBAAcZ,SAvBT;CAyBLa,kBAAY,KAzBP;CA0BLC,iBAAW;CA1BN,KAAN;;CA8BA,UAAK6H,uBAAL,CAA6B1H,SAASmH,aAAtC;;CACA,UAAKQ,cAAL,CAAoB3H,SAASoH,IAA7B;;CA1CyB;CA4CzB;CAED;;;;;;;CA5DD;CAAA;CAAA,4CAkEyBpY,OAlEzB,EAkEkC;CAEhC,UAAGA,OAAH,EAAY;CAEX,aAAKiQ,OAAL,CAAa2I,cAAb,GAA8B,GAA9B;CAEA,OAJD,MAIO;CAEN,eAAO,KAAK3I,OAAL,CAAa2I,cAApB;CAEA;;CAED,WAAK9G,WAAL,GAAmB,IAAnB;CAEA;CAED;;;;;;CAlFD;CAAA;CAAA,mCAwFgB9R,OAxFhB,EAwFyB;CAEvB,UAAGA,OAAH,EAAY;CAEX,aAAKiQ,OAAL,CAAa4I,KAAb,GAAqB,GAArB;CAEA,OAJD,MAIO;CAEN,eAAO,KAAK5I,OAAL,CAAa4I,KAApB;CAEA;;CAED,WAAK/G,WAAL,GAAmB,IAAnB;CAEA;CAED;;;;;;CAxGD;CAAA;CAAA,wCA8GmC;CAAA,UAAhBgH,OAAgB,uEAAN,IAAM;;CAEjC,UAAGA,YAAY,IAAf,EAAqB;CAEpB,aAAK7I,OAAL,CAAa8I,WAAb,GAA2B,GAA3B;CAEA,OAJD,MAIO;CAEN,eAAO,KAAK9I,OAAL,CAAa8I,WAApB;CAEA;;CAED,WAAK5I,QAAL,CAAcqI,QAAd,CAAuBhc,KAAvB,GAA+Bsc,OAA/B;CACA,WAAKhH,WAAL,GAAmB,IAAnB;CAEA;CA7HF;;CAAA;;CAAA;CAAA,EAA0ChB,cAA1C;;CCPA,IAAMhB,cAAW,moBAAjB;CACA,IAAMC,YAAS,4ZAAf;CAEA;;;;AAIA,KAAaiJ,oBAAb;CAAA;CAAA;CAEC;;;;;CAMA,kCAAuC;CAAA;;CAAA,QAA3BrH,SAA2B,uEAAf,IAAIhF,OAAJ,EAAe;;CAAA;;CAEtC,8FAAM;CAELjT,YAAM,sBAFD;CAILyW,gBAAU;CAETmI,eAAO,IAAIjI,OAAJ,CAAY,IAAZ,CAFE;CAGTsB,mBAAW,IAAItB,OAAJ,CAAY,IAAI1D,OAAJ,EAAZ;CAHF,OAJL;CAWL+D,sBAAgBZ,WAXX;CAYLa,oBAAcZ,SAZT;CAcLa,kBAAY,KAdP;CAeLC,iBAAW;CAfN,KAAN;;CAmBA,UAAK6B,YAAL,CAAkBf,UAAUnU,CAA5B,EAA+BmU,UAAUlU,CAAzC;;CArBsC;CAuBtC;CAED;;;;;;;;CAjCD;CAAA;CAAA,iCAwCcD,CAxCd,EAwCiBC,CAxCjB,EAwCoB;CAElB,WAAK0S,QAAL,CAAcwB,SAAd,CAAwBnV,KAAxB,CAA8BtC,GAA9B,CAAkCsD,CAAlC,EAAqCC,CAArC;CAEA;CA5CF;;CAAA;;CAAA;CAAA,EAA0CqT,cAA1C;;CCPA,IAAMhB,cAAW,ueAAjB;CACA,IAAMC,YAAS,qJAAf;CAEA;;;;;;;AAOA,KAAakJ,kBAAb;CAAA;CAAA;CAEC;;;CAIA,gCAAc;CAAA;;CAAA,2FAEP;CAELvf,YAAM,oBAFD;CAILyW,gBAAU;CAEToB,kBAAU,IAAIlB,OAAJ,CAAY,IAAZ,CAFD;CAGT6I,qBAAa,IAAI7I,OAAJ,CAAY,GAAZ,CAHJ;CAIT3D,oBAAY,IAAI2D,OAAJ,CAAY,IAAI1D,OAAJ,CAAY,GAAZ,EAAiB,GAAjB,CAAZ,CAJH;CAKTwM,YAAI,IAAI9I,OAAJ,CAAY,GAAZ,CALK;CAMT+I,YAAI,IAAI/I,OAAJ,CAAY,GAAZ;CANK,OAJL;CAcLK,sBAAgBZ,WAdX;CAeLa,oBAAcZ,SAfT;CAiBLa,kBAAY,KAjBP;CAkBLC,iBAAW;CAlBN,KAFO;CAwBb;CAED;;;;;;;CAhCD;CAAA;;CA6DC;;;;;;CA7DD,kCAoEetS,KApEf,EAoEsBC,MApEtB,EAoE8B;CAE5B,WAAK2R,QAAL,CAAczD,UAAd,CAAyBlQ,KAAzB,CAA+BtC,GAA/B,CAAmCqE,KAAnC,EAA0CC,MAA1C;CACA,WAAK0a,WAAL,GAAmB,KAAKA,WAAxB;CAEA;CAzEF;CAAA;CAAA,wBAsCmB;CAEjB,aAAO,KAAK/I,QAAL,CAAc+I,WAAd,CAA0B1c,KAAjC;CAEA;CAED;;;;;CA5CD;CAAA,sBAkDiBgB,CAlDjB,EAkDoB;CAElB,UAAM2S,WAAW,KAAKA,QAAtB;CACA,UAAMzD,aAAayD,SAASzD,UAAT,CAAoBlQ,KAAvC;CAEA2T,eAAS+I,WAAT,CAAqB1c,KAArB,GAA6BgB,CAA7B;CACA2S,eAASgJ,EAAT,CAAY3c,KAAZ,GAAoBgB,IAAIkP,WAAWlP,CAAnC;CACA2S,eAASiJ,EAAT,CAAY5c,KAAZ,GAAoBgB,IAAIkP,WAAWjP,CAAnC;CAEA;CA3DF;;CAAA;;CAAA;CAAA,EAAwCqT,cAAxC;;CCVA,IAAMhB,cAAW,48OAAjB;CACA,IAAMC,YAAS,qJAAf;CAEA;;;;;;;AAOA,KAAasJ,sBAAb;CAAA;CAAA;CAEC;;;;;;;;;;;;;;;;;;;;;CAsBA,oCAAyC;CAAA;;CAAA,QAA7Bza,MAA6B,uEAApB,IAAoB;CAAA,QAAdmG,OAAc,uEAAJ,EAAI;;CAAA;;CAExC,QAAMiM,WAAW/c,OAAOiW,MAAP,CAAc;CAC9ByH,iBAAW,IADmB;CAE9B2H,aAAO,CAFuB;CAG9BC,eAAS,CAHqB;CAI9BC,iBAAW,KAJmB;CAK9BC,iBAAW,KALmB;CAM9BjF,gBAAU,KANoB;CAO9BkF,gBAAU,KAPoB;CAQ9BC,mBAAa,IARiB;CAS9BxF,aAAO,IATuB;CAU9B/C,eAAS,GAVqB;CAW9BwI,0BAAoB,GAXU;CAY9BC,qBAAe,GAZe;CAa9Bpb,YAAM,GAbwB;CAc9Bqb,cAAQ,GAdsB;CAe9BC,sBAAgB;CAfc,KAAd,EAgBdhV,OAhBc,CAAjB;CAkBA,gGAAM;CAELrL,YAAM,wBAFD;CAILuW,eAAS;CAER+J,mBAAWhJ,SAASsI,KAAT,CAAe9L,OAAf,CAAuB,CAAvB,CAFH;CAGRyM,qBAAajJ,SAASsI,KAAT,CAAe9L,OAAf,CAAuB,CAAvB,CAHL;CAIR0M,qBAAalJ,SAASuI,OAAT,CAAiB/L,OAAjB,CAAyB,CAAzB,CAJL;CAKR2M,uBAAenJ,SAASuI,OAAT,CAAiB/L,OAAjB,CAAyB,CAAzB;CALP,OAJJ;CAaL2C,gBAAU;CAEToB,kBAAU,IAAIlB,OAAJ,CAAY,IAAZ,CAFD;CAGTmB,gBAAQ,IAAInB,OAAJ,CAAY,IAAZ,CAHC;CAKTsB,mBAAW,IAAItB,OAAJ,CAAY,IAAI1D,OAAJ,EAAZ,CALF;CAMT6F,uBAAe,IAAInC,OAAJ,CAAY,IAAI1D,OAAJ,EAAZ,CANN;CAQT0E,oBAAY,IAAIhB,OAAJ,CAAY,GAAZ,CARH;CASTiB,mBAAW,IAAIjB,OAAJ,CAAY,IAAZ,CATF;CAWT+J,qBAAa,IAAI/J,OAAJ,CAAY,IAAZ,CAXJ;CAYTgK,mBAAW,IAAIhK,OAAJ,CAAY,GAAZ,CAZF;CAcTe,iBAAS,IAAIf,OAAJ,CAAYW,SAASI,OAArB,CAdA;CAeTwI,4BAAoB,IAAIvJ,OAAJ,CAAYW,SAAS4I,kBAArB,CAfX;CAgBTC,uBAAe,IAAIxJ,OAAJ,CAAYW,SAAS6I,aAArB,CAhBN;CAiBTpb,cAAM,IAAI4R,OAAJ,CAAYW,SAASvS,IAArB,CAjBG;CAkBTqb,gBAAQ,IAAIzJ,OAAJ,CAAYW,SAAS8I,MAArB,CAlBC;CAmBTC,wBAAgB,IAAI1J,OAAJ,CAAYW,SAAS+I,cAArB,CAnBP;CAqBTO,qBAAa,IAAIjK,OAAJ,CAAY,IAAI1D,OAAJ,CAAY,GAAZ,EAAiB,GAAjB,CAAZ,CArBJ;CAsBT4N,oBAAY,IAAIlK,OAAJ,CAAY,GAAZ;CAtBH,OAbL;CAuCLK,sBAAgBZ,WAvCX;CAwCLa,oBAAcZ,SAxCT;CA0CLa,kBAAY,KA1CP;CA2CLC,iBAAW;CA3CN,KAAN;;CA+CA,UAAK2J,mBAAL,CAAyBxJ,SAASwI,SAAlC;;CACA,UAAKiB,4BAAL,CAAkCzJ,SAASyI,SAA3C;;CACA,UAAK/D,kBAAL,CAAwB1E,SAASwD,QAAjC;;CACA,UAAKkG,kBAAL,CAAwB1J,SAAS0I,QAAjC;;CACA,UAAKiB,qBAAL,CAA2B3J,SAAS2I,WAApC;;CACA,UAAKtE,eAAL,CAAqBrE,SAASmD,KAA9B;;CAEA,QAAGnD,SAASW,SAAT,KAAuB,IAA1B,EAAgC;CAE/B,YAAKe,YAAL,CAAkB1B,SAASW,SAAT,CAAmBnU,CAArC,EAAwCwT,SAASW,SAAT,CAAmBlU,CAA3D;CAEA;;CAED,UAAKgU,mBAAL,CAAyB7S,MAAzB;;CAhFwC;CAkFxC;CAED;;;;;;;CA5GD;CAAA;CAAA,wCAkHqBoB,OAlHrB,EAkH8B;CAE5B,UAAGA,OAAH,EAAY;CAEX,aAAKiQ,OAAL,CAAa2K,UAAb,GAA0B,GAA1B;CAEA,OAJD,MAIO;CAEN,eAAO,KAAK3K,OAAL,CAAa2K,UAApB;CAEA;;CAED,WAAK9I,WAAL,GAAmB,IAAnB;CAEA;CAED;;;;;;CAlID;CAAA;CAAA,iDAwI8B9R,OAxI9B,EAwIuC;CAErC,UAAGA,OAAH,EAAY;CAEX,aAAKiQ,OAAL,CAAa4K,UAAb,GAA0B,GAA1B;CAEA,OAJD,MAIO;CAEN,eAAO,KAAK5K,OAAL,CAAa4K,UAApB;CAEA;;CAED,WAAK/I,WAAL,GAAmB,IAAnB;CAEA;CAED;;;;;;CAxJD;CAAA;CAAA,uCA8JoB9R,OA9JpB,EA8J6B;CAE3B,UAAGA,OAAH,EAAY;CAEX,aAAKiQ,OAAL,CAAagG,QAAb,GAAwB,GAAxB;CAEA,OAJD,MAIO;CAEN,eAAO,KAAKhG,OAAL,CAAagG,QAApB;CAEA;;CAED,WAAKnE,WAAL,GAAmB,IAAnB;CAEA;CAED;;;;;;CA9KD;CAAA;CAAA,uCAoLoB9R,OApLpB,EAoL6B;CAE3B,UAAGA,OAAH,EAAY;CAEX,aAAKiQ,OAAL,CAAa6K,QAAb,GAAwB,GAAxB;CAEA,OAJD,MAIO;CAEN,eAAO,KAAK7K,OAAL,CAAa6K,QAApB;CAEA;;CAED,WAAKhJ,WAAL,GAAmB,IAAnB;CAEA;CAED;;;;;;CApMD;CAAA;CAAA,0CA0MuB9R,OA1MvB,EA0MgC;CAE9B,UAAGA,OAAH,EAAY;CAEX,aAAKiQ,OAAL,CAAa8K,YAAb,GAA4B,GAA5B;CAEA,OAJD,MAIO;CAEN,eAAO,KAAK9K,OAAL,CAAa8K,YAApB;CAEA;;CAED,WAAKjJ,WAAL,GAAmB,IAAnB;CAEA;CAED;;;;;;CA1ND;CAAA;CAAA,oCAgOiB9R,OAhOjB,EAgO0B;CAExB,UAAGA,OAAH,EAAY;CAEX,aAAKiQ,OAAL,CAAa2F,KAAb,GAAqB,GAArB;CAEA,OAJD,MAIO;CAEN,eAAO,KAAK3F,OAAL,CAAa2F,KAApB;CAEA;;CAED,WAAK9D,WAAL,GAAmB,IAAnB;CAEA;CAED;;;;;;;CAhPD;CAAA;CAAA,iCAuPctU,CAvPd,EAuPiBC,CAvPjB,EAuPoB;CAElB,WAAK0S,QAAL,CAAcwB,SAAd,CAAwBnV,KAAxB,CAA8BtC,GAA9B,CAAkCsD,CAAlC,EAAqCC,CAArC;CACA,WAAK0S,QAAL,CAAcqC,aAAd,CAA4BhW,KAA5B,CAAkCtC,GAAlC,CAAsCsD,CAAtC,EAAyCC,CAAzC,EAA4CsV,cAA5C,CAA2D,GAA3D;CAEA;CAED;;;;;;CA9PD;CAAA;CAAA,wCAoQqBnU,MApQrB,EAoQ6B;CAE3B,UAAGA,WAAW,IAAd,EAAoB;CAEnB,aAAKuR,QAAL,CAAckB,UAAd,CAAyB7U,KAAzB,GAAiCoC,OAAOC,IAAxC;CACA,aAAKsR,QAAL,CAAcmB,SAAd,CAAwB9U,KAAxB,GAAgCoC,OAAOE,GAAvC;CACA,aAAKqR,QAAL,CAAciK,WAAd,CAA0B5d,KAA1B,GAAkCoC,OAAOoc,cAAP,EAAlC,CAJmB;CAMnB;CAED;CA9QF;;CAAA;;CAAA;CAAA,EAA4ClK,cAA5C;;CCVA,IAAMhB,cAAW,2/BAAjB;CACA,IAAMC,YAAS,6SAAf;CAEA;;;;;;;AAOA,KAAakL,iBAAb;CAAA;CAAA;CAEC;;;;;;;CAQA,+BAA0B;CAAA,QAAdlW,OAAc,uEAAJ,EAAI;;CAAA;;CAEzB,QAAMiM,WAAW/c,OAAOiW,MAAP,CAAc;CAC9BgR,iBAAW,GADmB;CAE9BC,gBAAU,GAFoB;CAG9BC,iBAAW;CAHmB,KAAd,EAIdrW,OAJc,CAAjB;CAFyB,0FAQnB;CAELrL,YAAM,mBAFD;CAILyW,gBAAU;CAEToB,kBAAU,IAAIlB,OAAJ,CAAY,IAAZ,CAFD;CAITgL,gBAAQ,IAAIhL,OAAJ,CAAY,IAAI1D,OAAJ,CAAY,GAAZ,EAAiB,GAAjB,CAAZ,CAJC;CAKT7J,gBAAQ,IAAIuN,OAAJ,CAAY,GAAZ,CALC;CAMTiL,wBAAgB,IAAIjL,OAAJ,CAAY,GAAZ,CANP;CAQTlG,cAAM,IAAIkG,OAAJ,CAAY,GAAZ,CARG;CAST3R,gBAAQ,IAAI2R,OAAJ,CAAY,CAACW,SAASmK,QAAtB,CATC;CAUTD,mBAAW,IAAI7K,OAAJ,CAAYW,SAASkK,SAArB,CAVF;CAWTC,kBAAU,IAAI9K,OAAJ,CAAYW,SAASmK,QAArB,CAXD;CAYTC,mBAAW,IAAI/K,OAAJ,CAAYW,SAASoK,SAArB;CAZF,OAJL;CAoBL1K,sBAAgBZ,WApBX;CAqBLa,oBAAcZ,SArBT;CAuBLa,kBAAY,KAvBP;CAwBLC,iBAAW;CAxBN,KARmB;CAoCzB;;CA9CF;;CAAA;CAAA,EAAuCC,cAAvC;;CCVA,IAAMhB,cAAW,0rDAAjB;CACA,IAAMC,YAAS,0TAAf;CAEA;;;;;;AAMA,KAAawL,iBAAb;CAAA;CAAA;CAEC;;;;;CAMA,+BAAuC;CAAA,QAA3B5J,SAA2B,uEAAf,IAAIhF,OAAJ,EAAe;;CAAA;;CAAA,0FAEhC;CAELjT,YAAM,mBAFD;CAILyW,gBAAU;CAEToB,kBAAU,IAAIlB,OAAJ,CAAY,IAAZ,CAFD;CAGTmL,kBAAU,IAAInL,OAAJ,CAAY,IAAZ,CAHD;CAITsB,mBAAW,IAAItB,OAAJ,CAAYsB,SAAZ;CAJF,OAJL;CAYLjB,sBAAgBZ,WAZX;CAaLa,oBAAcZ,SAbT;CAeLa,kBAAY,KAfP;CAgBLC,iBAAW;CAhBN,KAFgC;CAsBtC;;CA9BF;;CAAA;CAAA,EAAuCC,cAAvC;;CCTA,IAAMhB,cAAW,6+MAAjB;CACA,IAAMC,YAAS,0uBAAf;CAEA;;;;;;AAMA,KAAa0L,mBAAb;CAAA;CAAA;CAEC;;;;;CAMA,iCAAuC;CAAA,QAA3B9J,SAA2B,uEAAf,IAAIhF,OAAJ,EAAe;;CAAA;;CAAA,4FAEhC;CAELjT,YAAM,qBAFD;CAILuW,eAAS;CAER;CACAyL,8BAAsB,GAHd;CAIRC,gCAAwB,KAJhB;CAMR;CACAC,8BAAsB,MAPd;CAQRC,4BAAoB,4BARZ;CASRC,6BAAqB,aATb;CAURC,wBAAgB,kBAVR;CAWRC,+BAAuB;CAXf,OAJJ;CAmBL7L,gBAAU;CAEToB,kBAAU,IAAIlB,OAAJ,CAAY,IAAZ,CAFD;CAGT4L,eAAO,IAAI5L,OAAJ,CAAY,IAAZ,CAHE;CAIT6L,iBAAS,IAAI7L,OAAJ,CAAY,IAAZ,CAJA;CAKTsB,mBAAW,IAAItB,OAAJ,CAAYsB,SAAZ;CALF,OAnBL;CA4BLjB,sBAAgBZ,WA5BX;CA6BLa,oBAAcZ,SA7BT;CA+BLa,kBAAY,KA/BP;CAgCLC,iBAAW;CAhCN,KAFgC;CAsCtC;CAED;;;;;;;;;;;;CAhDD;CAAA;CAAA,6CA2D0BsL,KA3D1B,EA2DiC;CAE/B,WAAKlM,OAAL,CAAayL,oBAAb,GAAoCS,MAAM3O,OAAN,CAAc,GAAd,CAApC;CACA,WAAKyC,OAAL,CAAa0L,sBAAb,GAAsCQ,MAAM3O,OAAN,CAAc,GAAd,CAAtC;CAEA,WAAKsE,WAAL,GAAmB,IAAnB;CAEA;CAlEF;;CAAA;;CAAA;CAAA,EAAyChB,cAAzC;;CCTA,IAAMhB,cAAW,moCAAjB;CACA,IAAMC,YAAS,qJAAf;CAEA;;;;;;;;;AASA,KAAaqM,mBAAb;CAAA;CAAA;CAEC;;;CAIA,iCAAc;CAAA;;CAAA,4FAEP;CAEL1iB,YAAM,qBAFD;CAILyW,gBAAU;CAEToB,kBAAU,IAAIlB,OAAJ,CAAY,IAAZ,CAFD;CAGTgM,sBAAc,IAAIhM,OAAJ,CAAY,IAAZ,CAHL;CAITiM,0BAAkB,IAAIjM,OAAJ,CAAY,GAAZ,CAJT;CAKTkM,sBAAc,IAAIlM,OAAJ,CAAY,IAAZ,CALL;CAMTmM,oBAAY,IAAInM,OAAJ,CAAY,GAAZ;CANH,OAJL;CAcLK,sBAAgBZ,WAdX;CAeLa,oBAAcZ,SAfT;CAiBLa,kBAAY,KAjBP;CAkBLC,iBAAW;CAlBN,KAFO;CAwBb;;CA9BF;;CAAA;CAAA,EAAyCC,cAAzC;;CCdA;;;;;;CCEA;;;;;;;;;;AAUA,KAAa2L,IAAb;CAAA;CAAA;CAEC;;;;;;;;CASA,kBAKE;CAAA,QAJD1lB,IAIC,uEAJM,MAIN;CAAA,QAHD2W,KAGC,uEAHO,IAAImB,KAAJ,EAGP;CAAA,QAFDjQ,MAEC,uEAFQ,IAAI4D,kBAAJ,CAAuB,CAAC,CAAxB,EAA2B,CAA3B,EAA8B,CAA9B,EAAiC,CAAC,CAAlC,EAAqC,CAArC,EAAwC,CAAxC,CAER;CAAA,QADDka,IACC,uEADM,IAAI9f,IAAJ,CAAS,IAAIwL,mBAAJ,CAAwB,CAAxB,EAA2B,CAA3B,CAAT,EAAwC,IAAxC,CACN;;CAAA;;CAED;;;;;CAMA,SAAKrR,IAAL,GAAYA,IAAZ;CAEA;;;;;;;CAOA,SAAK2W,KAAL,GAAaA,KAAb;CAEA;;;;;;;CAOA,SAAK9O,MAAL,GAAcA,MAAd;CAEA;;;;;;;CAOA,SAAK8d,IAAL,GAAYA,IAAZ;;CAEA,QAAG,KAAKA,IAAL,KAAc,IAAjB,EAAuB;CAEtB,WAAKA,IAAL,CAAUC,aAAV,GAA0B,KAA1B;;CAEA,UAAG,KAAKjP,KAAL,KAAe,IAAlB,EAAwB;CAEvB,aAAKA,KAAL,CAAWpS,GAAX,CAAe,KAAKohB,IAApB;CAEA;CAED;CAED;;;;;;;CAMA,SAAKE,cAAL,GAAsB,KAAtB;CAEA;;;;;;CAMA,SAAK5c,OAAL,GAAe,IAAf;CAEA;;;;;;;;;;CAUA,SAAK6c,SAAL,GAAiB,IAAjB;CAEA;CAED;;;;;;;CA/FD;CAAA;;CA6HC;;;;;;;;;;;;;CA7HD,2BA2IQ7P,QA3IR,EA2IkB8P,WA3IlB,EA2I+BC,YA3I/B,EA2I6CvM,KA3I7C,EA2IoDwM,WA3IpD,EA2IiE;CAE/D,YAAM,IAAIhmB,KAAJ,CAAU,gCAAV,CAAN;CAEA;CAED;;;;;;;;;;;;;;CAjJD;CAAA;CAAA,4BA+JSuH,KA/JT,EA+JgBC,MA/JhB,EA+JwB;CAEvB;;;;;;;;;;;;;;;;;;CAjKD;CAAA;CAAA,+BAmLYwO,QAnLZ,EAmLsBiQ,KAnLtB,EAmL6B;CAE5B;;;;;;;;;;;;;;CArLD;CAAA;CAAA,8BAmMW;CAET,UAAI/nB,GAAJ;;CAFS,iBAIEjB,OAAOipB,IAAP,CAAY,IAAZ,CAJF;;CAIT,+CAA8B;CAA1BhoB,WAA0B;;CAE7B,YAAG,KAAKA,GAAL,MAAc,IAAd,IAAsB,OAAO,KAAKA,GAAL,EAAUyD,OAAjB,KAA6B,UAAtD,EAAkE;CAEjE,eAAKzD,GAAL,EAAUyD,OAAV;CACA,eAAKzD,GAAL,IAAY,IAAZ;CAEA;CAED;;CAED,UAAG,KAAK4H,QAAL,KAAkB,IAArB,EAA2B;CAE1B,aAAKA,QAAL,CAAcnE,OAAd;CAEA;CAED;CAxNF;CAAA;CAAA,wBAqGgB;CAEd,aAAQ,KAAK+jB,IAAL,KAAc,IAAf,GAAuB,KAAKA,IAAL,CAAU5f,QAAjC,GAA4C,IAAnD;CAEA;CAED;;;;;;;CA3GD;CAAA,sBAmHcN,KAnHd,EAmHqB;CAEnB,UAAG,KAAKkgB,IAAL,KAAc,IAAjB,EAAuB;CAEtB,aAAKA,IAAL,CAAU5f,QAAV,GAAqBN,KAArB;CAEA;CAED;CA3HF;;CAAA;CAAA;;CCRA;;;;;;AAMA,KAAa2gB,QAAb;CAAA;CAAA;CAEC;;;;;;;CAQA,sBAA0B;CAAA;;CAAA,QAAdpY,OAAc,uEAAJ,EAAI;;CAAA;;CAEzB,kFAAM,UAAN;CAEA;;;;;;;CAOA,UAAKqY,aAAL,GAAqB,IAAIC,iBAAJ,CAAsB,CAAtB,EAAyB,CAAzB,EAA4B;CAChDC,iBAAWC,YADqC;CAEhDC,iBAAWD,YAFqC;CAGhDE,qBAAe,KAHiC;CAIhDC,mBAAa;CAJmC,KAA5B,CAArB;CAOA,UAAKN,aAAL,CAAmBtE,OAAnB,CAA2B/hB,IAA3B,GAAkC,cAAlC;CACA,UAAKqmB,aAAL,CAAmBtE,OAAnB,CAA2B6E,eAA3B,GAA6C,KAA7C;CAEA;;;;;;;CAOA,UAAKC,aAAL,GAAqB,MAAKR,aAAL,CAAmBliB,KAAnB,EAArB;CAEA,UAAK0iB,aAAL,CAAmB9E,OAAnB,CAA2B/hB,IAA3B,GAAkC,cAAlC;CAEA;;;;;;;;;CASA,UAAK8mB,eAAL,GAAwB9Y,QAAQ8Y,eAAR,KAA4BzpB,SAA7B,GAA0C2Q,QAAQ8Y,eAAlD,GAAoE,GAA3F;CAEA;;;;;;;CAOA,UAAKC,mBAAL,GAA2B,IAAIvL,mBAAJ,EAA3B;CAEA;;;;;;;CAOA,UAAKwL,2BAAL,GAAmC,IAAIxL,mBAAJ,EAAnC;CACA,UAAKwL,2BAAL,CAAiCC,SAAjC,GAA6C,IAA7C;CAEA;;;;;;CAMA,UAAKA,SAAL,GAAiB,KAAjB;CAEA,UAAKrL,UAAL,GAAkB5N,QAAQ4N,UAA1B;CAtEyB;CAwEzB;CAED;;;;;;;CApFD;CAAA;;CAmIC;;;;;;;;;;CAnID,2BA8IQ3F,QA9IR,EA8IkB8P,WA9IlB,EA8I+BC,YA9I/B,EA8I6CvM,KA9I7C,EA8IoDwM,WA9IpD,EA8IiE;CAE/D,UAAMtP,QAAQ,KAAKA,KAAnB;CACA,UAAM9O,SAAS,KAAKA,MAApB;CAEA,UAAMwe,gBAAgB,KAAKA,aAA3B;CACA,UAAMQ,gBAAgB,KAAKA,aAA3B;CAEA,UAAI9gB,WAAW,KAAKghB,mBAApB;CACA,UAAI3N,WAAWrT,SAASqT,QAAxB;CACA,UAAMsC,SAAS3V,SAASmhB,SAAT,EAAf;CAEA,UAAIC,SAASpB,WAAb;CACA,UAAIqB,MAAJ;CACA,UAAIvpB,CAAJ,EAAOwpB,CAAP;CAEA,WAAKthB,QAAL,GAAgBA,QAAhB,CAhB+D;;CAmB/D,WAAIlI,IAAI,CAAJ,EAAOwpB,IAAI3L,OAAO3d,MAAP,GAAgB,CAA/B,EAAkCF,IAAIwpB,CAAtC,EAAyC,EAAExpB,CAA3C,EAA8C;CAE7C;CACAupB,iBAAWvpB,IAAI,CAAL,KAAY,CAAb,GAAkBwoB,aAAlB,GAAkCQ,aAA3C;CAEAzN,iBAASsC,MAAT,CAAgBjW,KAAhB,GAAwBiW,OAAO7d,CAAP,CAAxB;CACAub,iBAASoB,QAAT,CAAkB/U,KAAlB,GAA0B0hB,OAAOpF,OAAjC;CACA9L,iBAASY,MAAT,CAAgBF,KAAhB,EAAuB9O,MAAvB,EAA+Buf,MAA/B;CAEAD,iBAASC,MAAT;CAEA;;CAED,UAAG,KAAKH,SAAR,EAAmB;CAElBlhB,mBAAW,KAAKihB,2BAAhB;CACA5N,mBAAWrT,SAASqT,QAApB;CACA,aAAKrT,QAAL,GAAgBA,QAAhB;CAEA;;CAEDqT,eAASsC,MAAT,CAAgBjW,KAAhB,GAAwBiW,OAAO7d,CAAP,CAAxB;CACAub,eAASoB,QAAT,CAAkB/U,KAAlB,GAA0B0hB,OAAOpF,OAAjC;CACA9L,eAASY,MAAT,CAAgBF,KAAhB,EAAuB9O,MAAvB,EAA+B,KAAKge,cAAL,GAAsB,IAAtB,GAA6BG,YAA5D;CAEA;CAED;;;;;;;CA5LD;CAAA;CAAA,4BAmMSxe,KAnMT,EAmMgBC,MAnMhB,EAmMwB;CAEtBD,cAAQ0D,KAAKpN,GAAL,CAAS,CAAT,EAAYoN,KAAKoc,KAAL,CAAW9f,QAAQ,KAAKsf,eAAxB,CAAZ,CAAR;CACArf,eAASyD,KAAKpN,GAAL,CAAS,CAAT,EAAYoN,KAAKoc,KAAL,CAAW7f,SAAS,KAAKqf,eAAzB,CAAZ,CAAT;CAEA,WAAKT,aAAL,CAAmB9P,OAAnB,CAA2B/O,KAA3B,EAAkCC,MAAlC;CACA,WAAKof,aAAL,CAAmBtQ,OAAnB,CAA2B/O,KAA3B,EAAkCC,MAAlC;CAEA,WAAKsf,mBAAL,CAAyBpL,YAAzB,CAAsC,MAAMnU,KAA5C,EAAmD,MAAMC,MAAzD;CACA,WAAKuf,2BAAL,CAAiCrL,YAAjC,CAA8C,MAAMnU,KAApD,EAA2D,MAAMC,MAAjE;CAEA;CAED;;;;;;;CAhND;CAAA;CAAA,+BAuNYwO,QAvNZ,EAuNsBiQ,KAvNtB,EAuN6B;CAE3B,UAAG,CAACA,KAAJ,EAAW;CAEV,aAAKG,aAAL,CAAmBtE,OAAnB,CAA2BwF,MAA3B,GAAoCC,SAApC;CACA,aAAKX,aAAL,CAAmB9E,OAAnB,CAA2BwF,MAA3B,GAAoCC,SAApC;CAEA;CAED;CAhOF;CAAA;CAAA,wBA0Fa;CAEX,aAAO,KAAKnB,aAAL,CAAmB7e,KAA1B;CAEA;CAED;;;;;;CAhGD;CAAA;CAAA,wBAsGc;CAEZ,aAAO,KAAK6e,aAAL,CAAmB5e,MAA1B;CAEA;CAED;;;;;;CA5GD;CAAA;CAAA,wBAkHkB;CAEhB,aAAO,KAAKsf,mBAAL,CAAyBnL,UAAhC;CAEA;CAED;;;CAxHD;CAAA,wBA4H0C;CAAA,UAA1BnW,KAA0B,uEAAlBoW,WAAWC,KAAO;CAExC,WAAKiL,mBAAL,CAAyBnL,UAAzB,GAAsCnW,KAAtC;CACA,WAAKuhB,2BAAL,CAAiCpL,UAAjC,GAA8CnW,KAA9C;CAEA;CAjIF;;CAAA;;CAAA;CAAA,EAA8BigB,IAA9B;;CCLA;;;;;;;AAOA,KAAa+B,SAAb;CAAA;CAAA;CAEC;;;;;;;;;;CAWA,uBAA0B;CAAA;;CAAA,QAAdzZ,OAAc,uEAAJ,EAAI;;CAAA;;CAEzB,mFAAM,WAAN;CAEA;;;;;;;CAOA,UAAK0Z,YAAL,GAAoB,IAAIpB,iBAAJ,CAAsB,CAAtB,EAAyB,CAAzB,EAA4B;CAC/CC,iBAAWC,YADoC;CAE/CC,iBAAWD,YAFoC;CAG/CE,qBAAe,KAHgC;CAI/CC,mBAAa;CAJkC,KAA5B,CAApB;CAOA,UAAKe,YAAL,CAAkB3F,OAAlB,CAA0B/hB,IAA1B,GAAiC,cAAjC;CACA,UAAK0nB,YAAL,CAAkB3F,OAAlB,CAA0B6E,eAA1B,GAA4C,KAA5C;CAEA;;;;;;;CAOA,UAAKe,QAAL,GAAgB,IAAIvB,QAAJ,CAAapY,OAAb,CAAhB;CAEA;;;;;;;CAOA,UAAK4Z,eAAL,GAAuB,IAAI5M,eAAJ,CAAqBhN,QAAQiN,UAAR,KAAuB5d,SAAxB,GAAqC2Q,QAAQiN,UAA7C,GAA0D,IAA9E,CAAvB;CAEA,UAAK9Q,SAAL,GAAiB6D,QAAQ7D,SAAzB;CAEA;;;;;;;CAOA,UAAK0d,kBAAL,GAA0B,IAAIxH,kBAAJ,CAAuB,IAAvB,CAA1B;CAEA,UAAKI,WAAL,GAAmBzS,QAAQyS,WAA3B;CAlDyB;CAoDzB;CAED;;;;;;;CAnED;CAAA;;CA4NC;;;;;;;;;CA5ND,2BAsOQxK,QAtOR,EAsOkB8P,WAtOlB,EAsO+BC,YAtO/B,EAsO6CvM,KAtO7C,EAsOoDwM,WAtOpD,EAsOiE;CAE/D,UAAMtP,QAAQ,KAAKA,KAAnB;CACA,UAAM9O,SAAS,KAAKA,MAApB;CACA,UAAM8f,WAAW,KAAKA,QAAtB;CAEA,UAAME,qBAAqB,KAAKA,kBAAhC;CACA,UAAMD,kBAAkB,KAAKA,eAA7B;CACA,UAAMF,eAAe,KAAKA,YAA1B,CAR+D;;CAW/D,WAAK3hB,QAAL,GAAgB8hB,kBAAhB;CACAA,yBAAmBzO,QAAnB,CAA4BoB,QAA5B,CAAqC/U,KAArC,GAA6CsgB,YAAYhE,OAAzD;CACA9L,eAASY,MAAT,CAAgBF,KAAhB,EAAuB9O,MAAvB,EAA+B6f,YAA/B,EAb+D;;CAgB/DC,eAAS9Q,MAAT,CAAgBZ,QAAhB,EAA0ByR,YAA1B,EAAwCA,YAAxC;;CAEA,UAAG,KAAKI,KAAR,EAAe;CAEd;CACA,aAAK/hB,QAAL,GAAgB6hB,eAAhB;CACAA,wBAAgBxO,QAAhB,CAAyB8B,QAAzB,CAAkCzV,KAAlC,GAA0CsgB,YAAYhE,OAAtD;CACA6F,wBAAgBxO,QAAhB,CAAyB+B,QAAzB,CAAkC1V,KAAlC,GAA0CiiB,aAAa3F,OAAvD;CAEA9L,iBAASY,MAAT,CAAgBF,KAAhB,EAAuB9O,MAAvB,EAA+B,KAAKge,cAAL,GAAsB,IAAtB,GAA6BG,YAA5D;CAEA;CAED;CAED;;;;;;;CArQD;CAAA;CAAA,4BA4QSxe,KA5QT,EA4QgBC,MA5QhB,EA4QwB;CAEtB,WAAKkgB,QAAL,CAAcpR,OAAd,CAAsB/O,KAAtB,EAA6BC,MAA7B;CAEAD,cAAQ,KAAKmgB,QAAL,CAAcngB,KAAtB;CACAC,eAAS,KAAKkgB,QAAL,CAAclgB,MAAvB;CAEA,WAAKigB,YAAL,CAAkBnR,OAAlB,CAA0B/O,KAA1B,EAAiCC,MAAjC;CAEA;CAED;;;;;;;CAvRD;CAAA;CAAA,+BA8RYwO,QA9RZ,EA8RsBiQ,KA9RtB,EA8R6B;CAE3B,WAAKyB,QAAL,CAAcI,UAAd,CAAyB9R,QAAzB,EAAmCiQ,KAAnC;;CAEA,UAAG,CAACA,KAAJ,EAAW;CAEV,aAAKwB,YAAL,CAAkB3F,OAAlB,CAA0BwF,MAA1B,GAAmCC,SAAnC;CAEA;CAED;CAxSF;CAAA;CAAA,wBAyEuB;CAErB,aAAO,KAAKG,QAAL,CAAcb,eAArB;CAEA;CAED;;;;;CA/ED;CAAA,wBAqFkC;CAAA,UAAbrhB,KAAa,uEAAL,GAAK;CAEhC,WAAKkiB,QAAL,CAAcb,eAAd,GAAgCrhB,KAAhC;CAEA;CAED;;;;;;CA3FD;CAAA;CAAA,wBAiGkB;CAEhB,aAAO,KAAKkiB,QAAL,CAAc/L,UAArB;CAEA;CAED;;;CAvGD;CAAA,wBA2G0C;CAAA,UAA1BnW,KAA0B,uEAAlBoW,WAAWC,KAAO;CAExC,WAAK6L,QAAL,CAAc/L,UAAd,GAA2BnW,KAA3B;CAEA;CAED;;;;;;CAjHD;CAAA;CAAA,wBAuHiB;CAEf,aAAO,KAAKmiB,eAAL,CAAqBxO,QAArB,CAA8BiC,QAA9B,CAAuC5V,KAA9C;CAEA;CAED;;;CA7HD;CAAA,wBAiI4B;CAAA,UAAbA,KAAa,uEAAL,GAAK;CAE1B,WAAKmiB,eAAL,CAAqBxO,QAArB,CAA8BiC,QAA9B,CAAuC5V,KAAvC,GAA+CA,KAA/C;CAEA;CAED;;;;;;CAvID;CAAA;CAAA,wBA6ImB;CAEjB,aAAO,KAAKoiB,kBAAL,CAAwBzO,QAAxB,CAAiCqH,WAAjC,CAA6Chb,KAApD;CAEA;CAED;;;CAnJD;CAAA,wBAuJ8B;CAAA,UAAbA,KAAa,uEAAL,GAAK;CAE5B,WAAKoiB,kBAAL,CAAwBzO,QAAxB,CAAiCqH,WAAjC,CAA6Chb,KAA7C,GAAqDA,KAArD;CAEA;CAED;;;;;;CA7JD;CAAA;CAAA,wBAmKiB;CAEf,aAAO,KAAKkiB,QAAL,CAAcV,SAArB;CAEA;CAED;;;;;CAzKD;CAAA,sBA+KexhB,KA/Kf,EA+KsB;CAEpB,WAAKkiB,QAAL,CAAcV,SAAd,GAA0BxhB,KAA1B;CAEA;CAED;;;;;;CArLD;CAAA;CAAA,wBA2La;CAEX,aAAO,KAAKqgB,SAAZ;CAEA;CAED;;;;;;;;CAjMD;CAAA,sBA0MWrgB,KA1MX,EA0MkB;CAEhB,WAAKqgB,SAAL,GAAiBrgB,KAAjB;CAEA;CAED;;;;;;CAhND;CAAA;CAAA,wBAsNe;CAEb,aAAO,KAAKiiB,YAAL,CAAkB3F,OAAzB;CAEA;CA1NF;;CAAA;;CAAA;CAAA,EAA+B2D,IAA/B;;CCTA;;;;;;AAMA,KAAasC,SAAb;CAAA;CAAA;CAEC;;;;;;CAOA,qBAAYngB,MAAZ,EAAkC;CAAA;;CAAA,QAAdmG,OAAc,uEAAJ,EAAI;;CAAA;;CAEjC,mFAAM,WAAN;CAEA,UAAKjI,QAAL,GAAgB,IAAIiU,aAAJ,CAAkBnS,MAAlB,EAA0BmG,OAA1B,CAAhB;CAJiC;CAMjC;CAED;;;;;;;;;;;CAjBD;CAAA;CAAA,2BA2BQiI,QA3BR,EA2BkB8P,WA3BlB,EA2B+BC,YA3B/B,EA2B6CvM,KA3B7C,EA2BoDwM,WA3BpD,EA2BiE;CAE/D,WAAKlgB,QAAL,CAAcqT,QAAd,CAAuBoB,QAAvB,CAAgC/U,KAAhC,GAAwCsgB,YAAYhE,OAApD;CACA,WAAKhc,QAAL,CAAcqT,QAAd,CAAuBqB,MAAvB,CAA8BhV,KAA9B,GAAsCsgB,YAAYtJ,YAAlD;CAEAxG,eAASY,MAAT,CAAgB,KAAKF,KAArB,EAA4B,KAAK9O,MAAjC,EAAyC,KAAKge,cAAL,GAAsB,IAAtB,GAA6BG,YAAtE;CAEA;CAED;;;;;;;CApCD;CAAA;CAAA,4BA2CSxe,KA3CT,EA2CgBC,MA3ChB,EA2CwB;CAEtB,WAAK1B,QAAL,CAAcqT,QAAd,CAAuBrN,MAAvB,CAA8BtG,KAA9B,GAAsC+B,QAAQC,MAA9C;CAEA;CA/CF;;CAAA;;CAAA;CAAA,EAA+Bie,IAA/B;;CCPA;;;;AAIA,KAAauC,aAAb;CAAA;CAAA;CAEC;;;CAIA,2BAAc;CAAA;;CAAA;;CAEb,uFAAM,eAAN,EAAuB,IAAvB,EAA6B,IAA7B,EAAmC,IAAnC;CAEA,UAAKnC,SAAL,GAAiB,KAAjB;CAJa;CAMb;CAED;;;;;;;;;;;CAdD;CAAA;CAAA,2BAwBQ7P,QAxBR,EAwBkB8P,WAxBlB,EAwB+BC,YAxB/B,EAwB6CvM,KAxB7C,EAwBoDwM,WAxBpD,EAwBiE;CAE/DhQ,eAAS1T,KAAT,CAAe2lB,OAAf,CAAuBC,OAAvB,CAA+BC,OAA/B,CAAuC,KAAvC;CAEA;CA5BF;;CAAA;;CAAA;CAAA,EAAmC1C,IAAnC;;CCHA;;;;;;;CAOA,IAAMxb,QAAQ,IAAIwX,KAAJ,EAAd;CAEA;;;;;;;;AAQA,KAAa2G,SAAb;CAAA;CAAA;CAEC;;;;;;;CAQA,uBAA0B;CAAA;;CAAA,QAAdra,OAAc,uEAAJ,EAAI;;CAAA;;CAEzB,mFAAM,WAAN,EAAmB,IAAnB,EAAyB,IAAzB,EAA+B,IAA/B;CAEA,UAAK8X,SAAL,GAAiB,KAAjB;CAEA;;;;;;CAMA,UAAKwC,UAAL,GAAmBta,QAAQsa,UAAR,KAAuBjrB,SAAxB,GAAqC2Q,QAAQsa,UAA7C,GAA0D,IAA5E;CAEA;;;;;;CAMA,UAAKC,UAAL,GAAmBva,QAAQua,UAAR,KAAuBlrB,SAAxB,GAAqC2Q,QAAQua,UAA7C,GAA0D,GAA5E;CApByB;CAsBzB;CAED;;;;;;;;;;;CAlCD;CAAA;CAAA,2BA4CQtS,QA5CR,EA4CkB8P,WA5ClB,EA4C+BC,YA5C/B,EA4C6CvM,KA5C7C,EA4CoDwM,WA5CpD,EA4CiE;CAE/D,UAAMqC,aAAa,KAAKA,UAAxB;CAEA,UAAIC,UAAJ;;CAEA,UAAGD,eAAe,IAAlB,EAAwB;CAEvBpe,cAAMlG,IAAN,CAAWiS,SAASuS,aAAT,EAAX;CACAD,qBAAatS,SAASwS,aAAT,EAAb;CACAxS,iBAASI,aAAT,CAAuBiS,UAAvB,EAAmC,KAAKC,UAAxC;CAEA;;CAEDtS,eAASyS,eAAT,CAAyB,KAAK7C,cAAL,GAAsB,IAAtB,GAA6BE,WAAtD;CACA9P,eAAS0S,KAAT;;CAEA,UAAGL,eAAe,IAAlB,EAAwB;CAEvBrS,iBAASI,aAAT,CAAuBnM,KAAvB,EAA8Bqe,UAA9B;CAEA;CAED;CAnEF;;CAAA;;CAAA;CAAA,EAA+B7C,IAA/B;;CCjBA;;;;AAIA,KAAakD,aAAb;CAAA;CAAA;CAEC;;;;;;;;;CAUA,2BAA0B;CAAA;;CAAA,QAAd5a,OAAc,uEAAJ,EAAI;;CAAA;;CAEzB,uFAAM,eAAN;CAEA,UAAKjI,QAAL,GAAgB,IAAI8W,iBAAJ,CAAsB7O,OAAtB,CAAhB;CAJyB;CAMzB;CAED;;;;;;;;;;;CApBD;CAAA;CAAA,2BA8BQiI,QA9BR,EA8BkB8P,WA9BlB,EA8B+BC,YA9B/B,EA8B6CvM,KA9B7C,EA8BoDwM,WA9BpD,EA8BiE;CAE/D,WAAKlgB,QAAL,CAAcqT,QAAd,CAAuBoB,QAAvB,CAAgC/U,KAAhC,GAAwCsgB,YAAYhE,OAApD;CAEA9L,eAASY,MAAT,CAAgB,KAAKF,KAArB,EAA4B,KAAK9O,MAAjC,EAAyC,KAAKge,cAAL,GAAsB,IAAtB,GAA6BG,YAAtE;CAEA;CAED;;;;;;;CAtCD;CAAA;CAAA,4BA6CSxe,KA7CT,EA6CgBC,MA7ChB,EA6CwB;CAEtBD,cAAQ0D,KAAKpN,GAAL,CAAS,CAAT,EAAY0J,KAAZ,CAAR;CACAC,eAASyD,KAAKpN,GAAL,CAAS,CAAT,EAAY2J,MAAZ,CAAT;CAEA,WAAK1B,QAAL,CAAcqT,QAAd,CAAuB2D,YAAvB,CAAoCtX,KAApC,CAA0CkB,CAA1C,GAA8Ca,KAA9C;CACA,WAAKzB,QAAL,CAAcqT,QAAd,CAAuB2D,YAAvB,CAAoCtX,KAApC,CAA0CojB,CAA1C,GAA8CphB,MAA9C;CAEA;CArDF;;CAAA;;CAAA;CAAA,EAAmCie,IAAnC;;CCJA;;;;;;AAMA,KAAaoD,QAAb;CAAA;CAAA;CAEC;;;;;;;;CASA,sBAA0B;CAAA;;CAAA,QAAd9a,OAAc,uEAAJ,EAAI;;CAAA;;CAEzB,kFAAM,UAAN;CAEA,UAAKjI,QAAL,GAAgB,IAAIoX,YAAJ,CAAiBnP,OAAjB,CAAhB;CAEA;;;;;;;;;CASA,UAAK+a,eAAL,GAAwB/a,QAAQ+a,eAAR,KAA4B1rB,SAA7B,GAA0C,IAA1C,GAAiD2Q,QAAQ+a,eAAhF;CAEA;;;;;;;;;CASA,UAAK3K,SAAL,GAAkBpQ,QAAQoQ,SAAR,KAAsB/gB,SAAvB,GAAoC,GAApC,GAA0C6N,KAAKpN,GAAL,CAASkQ,QAAQoQ,SAAjB,EAA4B,IAA5B,CAA3D;CAEA;;;;;;;;;CASA,UAAKC,aAAL,GAAsBrQ,QAAQqQ,aAAR,KAA0BhhB,SAA3B,GAAwC,GAAxC,GAA8C6N,KAAKpN,GAAL,CAASkQ,QAAQqQ,aAAjB,EAAgC,GAAhC,CAAnE;CArCyB;CAuCzB;CAED;;;;;;;;;;;CApDD;CAAA;CAAA,2BA8DQpI,QA9DR,EA8DkB8P,WA9DlB,EA8D+BC,YA9D/B,EA8D6CvM,KA9D7C,EA8DoDwM,WA9DpD,EA8DiE;CAE/D,WAAKlgB,QAAL,CAAcqT,QAAd,CAAuBoB,QAAvB,CAAgC/U,KAAhC,GAAwCsgB,YAAYhE,OAApD;CACA,WAAKhc,QAAL,CAAcqT,QAAd,CAAuB8E,IAAvB,CAA4BzY,KAA5B,IAAqCgU,KAArC;CAEAxD,eAASY,MAAT,CAAgB,KAAKF,KAArB,EAA4B,KAAK9O,MAAjC,EAAyC,KAAKge,cAAL,GAAsB,IAAtB,GAA6BG,YAAtE;CAEA;CAED;;;;;;;CAvED;CAAA;CAAA,4BA8ESxe,KA9ET,EA8EgBC,MA9EhB,EA8EwB;CAEtB,UAAMsE,SAASvE,QAAQC,MAAvB;CACA,UAAM2W,YAAY,KAAKA,SAAL,IAAkB3W,SAAS,KAA3B,CAAlB;CAEA,WAAK1B,QAAL,CAAcqT,QAAd,CAAuB+E,aAAvB,CAAqC1Y,KAArC,GAA6CyF,KAAK8d,KAAL,CAAWvhB,SAAS,KAAKshB,eAAzB,CAA7C;CACA,WAAKhjB,QAAL,CAAcqT,QAAd,CAAuBgF,SAAvB,CAAiC3Y,KAAjC,CAAuCtC,GAAvC,CAA2C4I,SAASqS,SAApD,EAA+DA,SAA/D;CACA,WAAKrY,QAAL,CAAcqT,QAAd,CAAuBiF,aAAvB,CAAqC5Y,KAArC,GAA8C2Y,YAAY3W,MAAb,GAAuB,KAAK4W,aAAzE;CAEA;CAvFF;;CAAA;;CAAA;CAAA,EAA8BqH,IAA9B;;CCLA;;;;;;;;;CASA,SAASuD,SAAT,CAAmBC,GAAnB,EAAwBC,IAAxB,EAA8B;CAE7B,SAAOD,MAAMhe,KAAKoc,KAAL,CAAWpc,KAAKke,MAAL,MAAiBD,OAAOD,GAAP,GAAa,CAA9B,CAAX,CAAb;CAEA;CAED;;;;;;;;;;CASA,SAASG,WAAT,CAAqBH,GAArB,EAA0BC,IAA1B,EAAgC;CAE/B,SAAOD,MAAMhe,KAAKke,MAAL,MAAiBD,OAAOD,GAAxB,CAAb;CAEA;CAED;;;;;AAIA,KAAaI,UAAb;CAAA;CAAA;CAEC;;;;;;;CAQA,wBAA0B;CAAA;;CAAA,QAAdtb,OAAc,uEAAJ,EAAI;;CAAA;;CAEzB,oFAAM,YAAN;CAEA,UAAKjI,QAAL,GAAgB,IAAIqZ,cAAJ,EAAhB;CAEA;;;;;;;CAOA,UAAK2C,OAAL,GAAe,IAAf;CAEA,UAAKwH,UAAL,GAAmBvb,QAAQub,UAAR,KAAuBlsB,SAAxB,GAAqC2Q,QAAQub,UAA7C,GAA0D,MAAKC,kBAAL,CAAwBxb,QAAQyb,MAAhC,CAA5E;CACA,UAAKF,UAAL,CAAgBvpB,IAAhB,GAAuB,qBAAvB;CACA,UAAKupB,UAAL,CAAgB3C,eAAhB,GAAkC,KAAlC;CAEA;;;;;;CAMA,UAAK8C,IAAL,GAAYC,WAAWC,QAAvB;CAEA;;;;;;;CAOA,UAAKC,OAAL,GAAe,CAAf;CAEA;;;;;;;CAOA,UAAKC,UAAL,GAAkBb,UAAU,GAAV,EAAe,GAAf,CAAlB;CA3CyB;CA6CzB;CAED;;;;;;;CAzDD;CAAA;;CAkFC;;;;;;CAlFD,yCAyF+B;CAAA,UAAX7V,IAAW,uEAAJ,EAAI;CAE7B,UAAM2W,SAAS3W,OAAOA,IAAtB;CACA,UAAM3Q,OAAO,IAAIwM,YAAJ,CAAiB8a,SAAS,CAA1B,CAAb;CAEA,UAAIC,KAAK,KAAKT,UAAd;CACA,UAAI1rB,CAAJ,EAAO4I,CAAP;;CAEA,WAAI5I,IAAI,CAAR,EAAWA,IAAIksB,MAAf,EAAuB,EAAElsB,CAAzB,EAA4B;CAE3B4I,YAAIyE,KAAKke,MAAL,EAAJ;CAEA3mB,aAAK5E,IAAI,CAAT,IAAc4I,CAAd;CACAhE,aAAK5E,IAAI,CAAJ,GAAQ,CAAb,IAAkB4I,CAAlB;CACAhE,aAAK5E,IAAI,CAAJ,GAAQ,CAAb,IAAkB4I,CAAlB;CAEA;;CAED,UAAGujB,OAAO,IAAV,EAAgB;CAEfA,WAAGpoB,OAAH;CAEA;;CAEDooB,WAAK,IAAIC,WAAJ,CAAgBxnB,IAAhB,EAAsB2Q,IAAtB,EAA4BA,IAA5B,EAAkCoU,SAAlC,EAA6C0C,SAA7C,CAAL;CACAF,SAAGjP,WAAH,GAAiB,IAAjB;CAEA,WAAKwO,UAAL,GAAkBS,EAAlB;CAEA,aAAOA,EAAP;CAEA;CAED;;;;;;;;;;CA1HD;CAAA;CAAA,2BAoIQ/T,QApIR,EAoIkB8P,WApIlB,EAoI+BC,YApI/B,EAoI6CvM,KApI7C,EAoIoDwM,WApIpD,EAoIiE;CAE/D,UAAMyD,OAAO,KAAKA,IAAlB;CACA,UAAMG,UAAU,KAAKA,OAArB;CACA,UAAMC,aAAa,KAAKA,UAAxB;CACA,UAAM1Q,WAAW,KAAKrT,QAAL,CAAcqT,QAA/B;CAEAA,eAASoB,QAAT,CAAkB/U,KAAlB,GAA0BsgB,YAAYhE,OAAtC;CACA3I,eAASmG,IAAT,CAAc9Z,KAAd,GAAsByF,KAAKke,MAAL,EAAtB;CACAhQ,eAAS5X,MAAT,CAAgBiE,KAAhB,GAAwB,IAAxB;;CAEA,UAAGokB,UAAUC,UAAV,KAAyB,CAAzB,IAA8BJ,SAASC,WAAWQ,aAArD,EAAoE;CAEnE/Q,iBAASkG,MAAT,CAAgB7Z,KAAhB,GAAwByF,KAAKke,MAAL,KAAgB,IAAxC;CACAhQ,iBAASpO,KAAT,CAAevF,KAAf,GAAuB4jB,YAAY,CAACne,KAAKC,EAAlB,EAAsBD,KAAKC,EAA3B,CAAvB;CACAiO,iBAASoG,KAAT,CAAe/Z,KAAf,GAAuB4jB,YAAY,CAAC,GAAb,EAAkB,GAAlB,CAAvB;CACAjQ,iBAASqG,KAAT,CAAeha,KAAf,GAAuB4jB,YAAY,CAAC,GAAb,EAAkB,GAAlB,CAAvB;CACAjQ,iBAASsG,WAAT,CAAqBja,KAArB,GAA6B4jB,YAAY,GAAZ,EAAiB,GAAjB,CAA7B;CACAjQ,iBAASuG,WAAT,CAAqBla,KAArB,GAA6B4jB,YAAY,GAAZ,EAAiB,GAAjB,CAA7B;CAEA,aAAKS,UAAL,GAAkBb,UAAU,GAAV,EAAe,GAAf,CAAlB;CACA,aAAKY,OAAL,GAAe,CAAf;CAEA,OAZD,MAYO;CAEN,YAAGA,UAAUC,UAAV,GAAuBA,aAAa,CAApC,IAAyCJ,SAASC,WAAWS,aAAhE,EAA+E;CAE9EhR,mBAASkG,MAAT,CAAgB7Z,KAAhB,GAAwByF,KAAKke,MAAL,KAAgB,IAAxC;CACAhQ,mBAASpO,KAAT,CAAevF,KAAf,GAAuB4jB,YAAY,CAACne,KAAKC,EAAlB,EAAsBD,KAAKC,EAA3B,CAAvB;CACAiO,mBAASsG,WAAT,CAAqBja,KAArB,GAA6B4jB,YAAY,GAAZ,EAAiB,GAAjB,CAA7B;CACAjQ,mBAASuG,WAAT,CAAqBla,KAArB,GAA6B4jB,YAAY,GAAZ,EAAiB,GAAjB,CAA7B;CACAjQ,mBAASoG,KAAT,CAAe/Z,KAAf,GAAuB4jB,YAAY,CAAC,GAAb,EAAkB,GAAlB,CAAvB;CACAjQ,mBAASqG,KAAT,CAAeha,KAAf,GAAuB4jB,YAAY,CAAC,GAAb,EAAkB,GAAlB,CAAvB;CAEA,SATD,MASO;CAEN;CACAjQ,mBAAS5X,MAAT,CAAgBiE,KAAhB,GAAwB,KAAxB;CAEA;CAED;;CAED,QAAE,KAAKokB,OAAP;CAEA5T,eAASY,MAAT,CAAgB,KAAKF,KAArB,EAA4B,KAAK9O,MAAjC,EAAyC,KAAKge,cAAL,GAAsB,IAAtB,GAA6BG,YAAtE;CAEA;CAnLF;CAAA;CAAA,wBA+DkB;CAEhB,aAAO,KAAKjE,OAAZ;CAEA;CAED;;;;;CArED;CAAA,sBA2EgBtc,KA3EhB,EA2EuB;CAErB,WAAKsc,OAAL,GAAetc,KAAf;CACA,WAAKM,QAAL,CAAcqT,QAAd,CAAuBiG,QAAvB,CAAgC5Z,KAAhC,GAAwCA,KAAxC;CAEA;CAhFF;;CAAA;;CAAA;CAAA,EAAgCigB,IAAhC;CAuLA;;;;;;;;;AASA,CAAO,IAAMiE,aAAa;CAEzBC,YAAU,CAFe;CAGzBQ,iBAAe,CAHU;CAIzBD,iBAAe;CAJU,CAAnB;;CCnOP;;;;;AAKA,KAAaE,UAAb;CAAA;CAAA;CAEC;;;;;;;;;;;;CAaA,sBAAY1T,KAAZ,EAAmB9O,MAAnB,EAAyC;CAAA;;CAAA,QAAdmG,OAAc,uEAAJ,EAAI;;CAAA;;CAExC,oFAAM,YAAN,EAAoB2I,KAApB,EAA2B9O,MAA3B,EAAmC,IAAnC;CAEA,UAAKie,SAAL,GAAiB,KAAjB;CAEA;;;;;;CAMA,UAAKwE,SAAL,GAAiB,IAAIjC,SAAJ,CAAcra,OAAd,CAAjB;CAEA;;;;;;CAMA,UAAKuc,gBAAL,GAAyBvc,QAAQuc,gBAAR,KAA6BltB,SAA9B,GAA2C2Q,QAAQuc,gBAAnD,GAAsE,IAA9F;CAEA;;;;;;CAMA,UAAKC,UAAL,GAAmBxc,QAAQwc,UAAR,KAAuBntB,SAAxB,GAAqC2Q,QAAQwc,UAA7C,GAA0D,KAA5E;CAEA;;;;;;;;;;CAUA,UAAK7B,KAAL,GAAc3a,QAAQ2a,KAAR,KAAkBtrB,SAAnB,GAAgC2Q,QAAQ2a,KAAxC,GAAgD,IAA7D;CAxCwC;CA0CxC;CAED;;;;;;;;;;;CA3DD;CAAA;CAAA,2BAqEQ1S,QArER,EAqEkB8P,WArElB,EAqE+BC,YArE/B,EAqE6CvM,KArE7C,EAqEoDwM,WArEpD,EAqEiE;CAE/D,UAAMtP,QAAQ,KAAKA,KAAnB;CACA,UAAM+Q,eAAe,KAAK7B,cAAL,GAAsB,IAAtB,GAA6BE,WAAlD;CACA,UAAMwE,mBAAmB5T,MAAM4T,gBAA/B;;CAEA,UAAG,KAAK5B,KAAR,EAAe;CAEd,aAAK2B,SAAL,CAAezE,cAAf,GAAgC,KAAKA,cAArC;CACA,aAAKyE,SAAL,CAAezT,MAAf,CAAsBZ,QAAtB,EAAgC8P,WAAhC;CAEA,OALD,MAKO,IAAG,KAAKyE,UAAR,EAAoB;CAE1BvU,iBAASyS,eAAT,CAAyBhB,YAAzB;CACAzR,iBAASuU,UAAT;CAEA;;CAED7T,YAAM4T,gBAAN,GAAyB,KAAKA,gBAA9B;CACAtU,eAASY,MAAT,CAAgBF,KAAhB,EAAuB,KAAK9O,MAA5B,EAAoC6f,YAApC;CACA/Q,YAAM4T,gBAAN,GAAyBA,gBAAzB;CAEA;CA3FF;;CAAA;;CAAA;CAAA,EAAgC7E,IAAhC;;CCOA;;;;;;;;;;CAUA,SAAS+E,KAAT,CAAehlB,KAAf,EAAsB/N,GAAtB,EAA2BoG,GAA3B,EAAgC;CAE/B,SAAOoN,KAAKpN,GAAL,CAASpG,GAAT,EAAcwT,KAAKxT,GAAL,CAASoG,GAAT,EAAc2H,KAAd,CAAd,CAAP;CAEA;CAED;;;;;AAIA,KAAailB,WAAb;CAAA;CAAA;CAEC;;;;;;;;;;;;;;;;;;CAmBA,uBAAY/T,KAAZ,EAAmB9O,MAAnB,EAA2B8iB,WAA3B,EAAsD;CAAA;;CAAA,QAAd3c,OAAc,uEAAJ,EAAI;;CAAA;;CAErD,qFAAM,aAAN;CAEA;;;;;;;CAOA,UAAK4c,UAAL,GAAkB,IAAI9S,KAAJ,EAAlB;CAEA;;;;;;;CAOA,UAAK+S,SAAL,GAAiBlU,KAAjB;CAEA;;;;;;;CAOA,UAAKmU,UAAL,GAAkBjjB,MAAlB;CAEA;;;;;;;CAOA,UAAKwe,aAAL,GAAqB,IAAIC,iBAAJ,CAAsB,CAAtB,EAAyB,CAAzB,EAA4B;CAChDC,iBAAWC,YADqC;CAEhDC,iBAAWD,YAFqC;CAGhDE,qBAAe,KAHiC;CAIhDC,mBAAa;CAJmC,KAA5B,CAArB;CAOA,UAAKN,aAAL,CAAmBtE,OAAnB,CAA2B/hB,IAA3B,GAAkC,iBAAlC;CACA,UAAKqmB,aAAL,CAAmBtE,OAAnB,CAA2B6E,eAA3B,GAA6C,KAA7C;CAEA;;;;;;;CAOA,UAAKC,aAAL,GAAqB,MAAKR,aAAL,CAAmBliB,KAAnB,EAArB;CAEA,UAAK0iB,aAAL,CAAmB9E,OAAnB,CAA2B/hB,IAA3B,GAAkC,iBAAlC;CAEA;;;;;;;CAOA,UAAK+qB,gBAAL,GAAwB,IAAIzE,iBAAJ,CAAsB,CAAtB,EAAyB,CAAzB,EAA4B;CACnDC,iBAAWC,YADwC;CAEnDC,iBAAWD;CAFwC,KAA5B,CAAxB;CAKA,UAAKuE,gBAAL,CAAsBhJ,OAAtB,CAA8B/hB,IAA9B,GAAqC,cAArC;CACA,UAAK+qB,gBAAL,CAAsBhJ,OAAtB,CAA8B6E,eAA9B,GAAgD,KAAhD;CAEA;;;;;;;CAOA,UAAKoE,eAAL,GAAuB,IAAIX,UAAJ,CAAe,MAAKO,UAApB,EAAgC,MAAKE,UAArC,EAAiD;CACvExC,kBAAY,IAAI5G,KAAJ,CAAU,QAAV;CAD2D,KAAjD,CAAvB;CAIA;;;;;;;CAOA,UAAKuJ,cAAL,GAAsB,IAAIZ,UAAJ,CAAe,MAAKQ,SAApB,EAA+B,MAAKC,UAApC,EAAgD;CACrEP,wBAAkB,IAAIW,iBAAJ,CAAsB;CAAEhhB,eAAO;CAAT,OAAtB;CADmD,KAAhD,CAAtB;CAIA,UAAK+gB,cAAL,CAAoBtC,KAApB,GAA4B,KAA5B;CAEA;;;;;;;CAOA,UAAKhB,QAAL,GAAgB,IAAIvB,QAAJ,CAAapY,OAAb,CAAhB;CAEA;;;;;;CAMA,UAAK2c,WAAL,GAAmBA,WAAnB;CAEA;;;;;;;CAOA,UAAKQ,cAAL,GAAsB,IAAIha,OAAJ,EAAtB;CAEA;;;;;;;CAOA,UAAKia,eAAL,GAAuB,IAAIvL,eAAJ,CAAoB7R,OAApB,CAAvB;CACA,UAAKod,eAAL,CAAqBhS,QAArB,CAA8BgH,aAA9B,CAA4C3a,KAA5C,GAAoD,MAAK0lB,cAAzD;CAEA,UAAK3I,OAAL,GAAexU,QAAQwU,OAAvB;CAEA;;;;;;;CAOA,UAAKoF,eAAL,GAAuB,IAAI5M,eAAJ,CAAqBhN,QAAQiN,UAAR,KAAuB5d,SAAxB,GAAqC2Q,QAAQiN,UAA7C,GAA0D,IAA9E,CAAvB;CAEA,UAAK9Q,SAAL,GAAiB6D,QAAQ7D,SAAzB;CAjJqD;CAmJrD;CAED;;;;;;;CA1KD;CAAA;;CA+UC;;;;;;;;;CA/UD,2BAyVQ8L,QAzVR,EAyVkB8P,WAzVlB,EAyV+BC,YAzV/B,EAyV6CvM,KAzV7C,EAyVoDwM,WAzVpD,EAyViE;CAE/D,UAAMtP,QAAQ,KAAKA,KAAnB;CACA,UAAM9O,SAAS,KAAKA,MAApB;CACA,UAAMgjB,YAAY,KAAKA,SAAvB;CAEA,UAAMF,cAAc,KAAKA,WAAzB;CACA,UAAMQ,iBAAiB,KAAKA,cAA5B;CAEA,UAAMC,kBAAkB,KAAKA,eAA7B;CACA,UAAMxD,kBAAkB,KAAKA,eAA7B;CAEA,UAAMmD,mBAAmB,KAAKA,gBAA9B;CACA,UAAM1E,gBAAgB,KAAKA,aAA3B;CACA,UAAMQ,gBAAgB,KAAKA,aAA3B;CAEA,UAAIwE,UAAJ,EAAgBjnB,MAAhB,CAhB+D;;CAmB/D+mB,qBAAennB,IAAf,CAAoB2mB,YAAYtkB,QAAhC,EAA0CilB,OAA1C,CAAkD,KAAKR,UAAvD;CACAK,qBAAe1kB,CAAf,GAAmBgkB,MAAM,CAACU,eAAe1kB,CAAf,GAAmB,GAApB,IAA2B,GAAjC,EAAsC,GAAtC,EAA2C,GAA3C,CAAnB;CACA0kB,qBAAezkB,CAAf,GAAmB+jB,MAAM,CAACU,eAAezkB,CAAf,GAAmB,GAApB,IAA2B,GAAjC,EAAsC,GAAtC,EAA2C,GAA3C,CAAnB;CAEAtC,eAASumB,YAAYvmB,MAArB;CACAinB,mBAAaR,UAAUQ,UAAvB;CACAR,gBAAUQ,UAAV,GAAuB,IAAvB;CACA,WAAKT,UAAL,CAAgBrmB,GAAhB,CAAoBomB,WAApB;CAEA;;;CAEA,WAAKK,eAAL,CAAqBnU,MAArB,CAA4BZ,QAA5B,EAAsC8U,gBAAtC;CACA,WAAKE,cAAL,CAAoBpU,MAApB,CAA2BZ,QAA3B,EAAqC8U,gBAArC;;CAEA,UAAG3mB,WAAW,IAAd,EAAoB;CAEnBA,eAAOG,GAAP,CAAWomB,WAAX;CAEA;;CAEDE,gBAAUQ,UAAV,GAAuBA,UAAvB,CAvC+D;;CA0C/D,WAAK1D,QAAL,CAAc9Q,MAAd,CAAqBZ,QAArB,EAA+B,KAAK8U,gBAApC,EAAsD1E,aAAtD,EA1C+D;;CA6C/D,WAAKtgB,QAAL,GAAgBqlB,eAAhB;CACAA,sBAAgBhS,QAAhB,CAAyBoB,QAAzB,CAAkC/U,KAAlC,GAA0C4gB,cAActE,OAAxD;CACA9L,eAASY,MAAT,CAAgBF,KAAhB,EAAuB9O,MAAvB,EAA+Bgf,aAA/B;;CAEA,UAAG,KAAKiB,KAAR,EAAe;CAEd;CACA,aAAK/hB,QAAL,GAAgB6hB,eAAhB;CACAA,wBAAgBxO,QAAhB,CAAyB8B,QAAzB,CAAkCzV,KAAlC,GAA0CsgB,YAAYhE,OAAtD;CACA6F,wBAAgBxO,QAAhB,CAAyB+B,QAAzB,CAAkC1V,KAAlC,GAA0CohB,cAAc9E,OAAxD;CAEA9L,iBAASY,MAAT,CAAgBF,KAAhB,EAAuB9O,MAAvB,EAA+B,KAAKge,cAAL,GAAsB,IAAtB,GAA6BG,YAA5D;CAEA;CAED;CAED;;;;;;;CAvZD;CAAA;CAAA,4BA8ZSxe,KA9ZT,EA8ZgBC,MA9ZhB,EA8ZwB;CAEtB,WAAKujB,eAAL,CAAqBzU,OAArB,CAA6B/O,KAA7B,EAAoCC,MAApC;CACA,WAAKwjB,cAAL,CAAoB1U,OAApB,CAA4B/O,KAA5B,EAAmCC,MAAnC;CACA,WAAKkgB,QAAL,CAAcpR,OAAd,CAAsB/O,KAAtB,EAA6BC,MAA7B;CAEAD,cAAQ,KAAKmgB,QAAL,CAAcngB,KAAtB;CACAC,eAAS,KAAKkgB,QAAL,CAAclgB,MAAvB;CAEA,WAAKsjB,gBAAL,CAAsBxU,OAAtB,CAA8B/O,KAA9B,EAAqCC,MAArC;CACA,WAAK4e,aAAL,CAAmB9P,OAAnB,CAA2B/O,KAA3B,EAAkCC,MAAlC;CACA,WAAKof,aAAL,CAAmBtQ,OAAnB,CAA2B/O,KAA3B,EAAkCC,MAAlC;CAEA;CAED;;;;;;;CA7aD;CAAA;CAAA,+BAobYwO,QApbZ,EAobsBiQ,KApbtB,EAob6B;CAE3B,WAAK8E,eAAL,CAAqBjD,UAArB,CAAgC9R,QAAhC,EAA0CiQ,KAA1C;CACA,WAAK+E,cAAL,CAAoBlD,UAApB,CAA+B9R,QAA/B,EAAyCiQ,KAAzC;CACA,WAAKyB,QAAL,CAAcI,UAAd,CAAyB9R,QAAzB,EAAmCiQ,KAAnC;;CAEA,UAAG,CAACA,KAAJ,EAAW;CAEV,aAAK6E,gBAAL,CAAsBhJ,OAAtB,CAA8BwF,MAA9B,GAAuCC,SAAvC;CACA,aAAKnB,aAAL,CAAmBtE,OAAnB,CAA2BwF,MAA3B,GAAoCC,SAApC;CACA,aAAKX,aAAL,CAAmB9E,OAAnB,CAA2BwF,MAA3B,GAAoCC,SAApC;CAEA;CAED;CAlcF;CAAA;CAAA,wBAgLuB;CAErB,aAAO,KAAKG,QAAL,CAAcb,eAArB;CAEA;CAED;;;;;CAtLD;CAAA,wBA4LkC;CAAA,UAAbrhB,KAAa,uEAAL,GAAK;CAEhC,WAAKkiB,QAAL,CAAcb,eAAd,GAAgCrhB,KAAhC;CAEA;CAED;;;;;;CAlMD;CAAA;CAAA,wBAwMkB;CAEhB,aAAO,KAAKkiB,QAAL,CAAc/L,UAArB;CAEA;CAED;;;CA9MD;CAAA,wBAkN0C;CAAA,UAA1BnW,KAA0B,uEAAlBoW,WAAWC,KAAO;CAExC,WAAK6L,QAAL,CAAc/L,UAAd,GAA2BnW,KAA3B;CAEA;CAED;;;;;;CAxND;CAAA;CAAA,wBA8NiB;CAEf,aAAO,KAAKmiB,eAAL,CAAqBxO,QAArB,CAA8BiC,QAA9B,CAAuC5V,KAA9C;CAEA;CAED;;;CApOD;CAAA,wBAwO4B;CAAA,UAAbA,KAAa,uEAAL,GAAK;CAE1B,WAAKmiB,eAAL,CAAqBxO,QAArB,CAA8BiC,QAA9B,CAAuC5V,KAAvC,GAA+CA,KAA/C;CAEA;CAED;;;;;;CA9OD;CAAA;CAAA,wBAoPe;CAEb,aAAO+Q,OAAO+U,QAAP,CAAgB,KAAKH,eAAL,CAAqBlS,OAArB,CAA6BiH,eAA7C,CAAP;CAEA;CAED;;;;;;CA1PD;CAAA,wBAiQyB;CAAA,UAAZ1a,KAAY,uEAAJ,EAAI;CAEvBA,cAAQyF,KAAKoc,KAAL,CAAW7hB,KAAX,CAAR;CAEA,WAAK2lB,eAAL,CAAqBlS,OAArB,CAA6BgH,iBAA7B,GAAiDza,MAAMgR,OAAN,CAAc,CAAd,CAAjD;CACA,WAAK2U,eAAL,CAAqBlS,OAArB,CAA6BiH,eAA7B,GAA+C1a,MAAMgR,OAAN,CAAc,CAAd,CAA/C;CACA,WAAK2U,eAAL,CAAqBrQ,WAArB,GAAmC,IAAnC;CAEA;CAED;;;;;;CA3QD;CAAA;CAAA,wBAiRiB;CAEf,aAAO,KAAKqQ,eAAL,CAAqBnE,SAA5B;CAEA;CAED;;;;;CAvRD;CAAA,sBA6RexhB,KA7Rf,EA6RsB;CAEpB,UAAG,KAAKwhB,SAAL,KAAmBxhB,KAAtB,EAA6B;CAE5B,aAAK2lB,eAAL,CAAqBnE,SAArB,GAAiCxhB,KAAjC;CACA,aAAK2lB,eAAL,CAAqBrQ,WAArB,GAAmC,IAAnC;CAEA;CAED;CAED;;;;;;CAxSD;CAAA;CAAA,wBA8Sa;CAEX,aAAO,KAAK+K,SAAZ;CAEA;CAED;;;;;;;;CApTD;CAAA,sBA6TWrgB,KA7TX,EA6TkB;CAEhB,WAAKqgB,SAAL,GAAiBrgB,KAAjB;CAEA;CAED;;;;;;CAnUD;CAAA;CAAA,wBAyUe;CAEb,aAAO,KAAKohB,aAAL,CAAmB9E,OAA1B;CAEA;CA7UF;;CAAA;;CAAA;CAAA,EAAiC2D,IAAjC;;CCjCA;;;;AAIA,KAAa8F,QAAb;CAAA;CAAA;CAEC;;;;;;CAOA,oBAAY7U,KAAZ,EAAmB9O,MAAnB,EAA2B;CAAA;;CAAA;;CAE1B,kFAAM,UAAN,EAAkB8O,KAAlB,EAAyB9O,MAAzB,EAAiC,IAAjC;CAEA,UAAKie,SAAL,GAAiB,KAAjB;CAEA;;;;;;CAMA,UAAK2F,OAAL,GAAe,KAAf;CAEA;;;;;;CAMA,UAAKC,YAAL,GAAoB,IAApB;CApB0B;CAsB1B;CAED;;;;;;;;;;;CAjCD;CAAA;CAAA,2BA2CQzV,QA3CR,EA2CkB8P,WA3ClB,EA2C+BC,YA3C/B,EA2C6CvM,KA3C7C,EA2CoDwM,WA3CpD,EA2CiE;CAE/D,UAAM0F,UAAU1V,SAAS0V,OAAzB;CACA,UAAMppB,QAAQ0T,SAAS1T,KAAvB;CAEA,UAAMoU,QAAQ,KAAKA,KAAnB;CACA,UAAM9O,SAAS,KAAKA,MAApB;CAEA,UAAM+jB,aAAa,KAAKH,OAAL,GAAe,CAAf,GAAmB,CAAtC;CACA,UAAMI,aAAa,IAAID,UAAvB,CAT+D;;CAY/DrpB,YAAM2lB,OAAN,CAAche,KAAd,CAAoB4hB,OAApB,CAA4B,KAA5B;CACAvpB,YAAM2lB,OAAN,CAAc7b,KAAd,CAAoByf,OAApB,CAA4B,KAA5B,EAb+D;;CAgB/DvpB,YAAM2lB,OAAN,CAAche,KAAd,CAAoB6hB,SAApB,CAA8B,IAA9B;CACAxpB,YAAM2lB,OAAN,CAAc7b,KAAd,CAAoB0f,SAApB,CAA8B,IAA9B,EAjB+D;;CAoB/DxpB,YAAM2lB,OAAN,CAAcC,OAAd,CAAsBC,OAAtB,CAA8B,IAA9B;CACA7lB,YAAM2lB,OAAN,CAAcC,OAAd,CAAsB6D,KAAtB,CAA4BL,QAAQM,OAApC,EAA6CN,QAAQM,OAArD,EAA8DN,QAAQM,OAAtE;CACA1pB,YAAM2lB,OAAN,CAAcC,OAAd,CAAsB+D,OAAtB,CAA8BP,QAAQQ,MAAtC,EAA8CP,UAA9C,EAA0D,UAA1D;CACArpB,YAAM2lB,OAAN,CAAcC,OAAd,CAAsBiE,QAAtB,CAA+BP,UAA/B,EAvB+D;;CA0B/D,UAAG,KAAKH,YAAR,EAAsB;CAErB,YAAG,KAAK7F,cAAR,EAAwB;CAEvB5P,mBAASyS,eAAT,CAAyB,IAAzB;CACAzS,mBAASyV,YAAT;CAEA,SALD,MAKO;CAENzV,mBAASyS,eAAT,CAAyB3C,WAAzB;CACA9P,mBAASyV,YAAT;CAEAzV,mBAASyS,eAAT,CAAyB1C,YAAzB;CACA/P,mBAASyV,YAAT;CAEA;CAED,OA3C8D;;;CA8C/D,UAAG,KAAK7F,cAAR,EAAwB;CAEvB5P,iBAASY,MAAT,CAAgBF,KAAhB,EAAuB9O,MAAvB,EAA+B,IAA/B;CAEA,OAJD,MAIO;CAENoO,iBAASY,MAAT,CAAgBF,KAAhB,EAAuB9O,MAAvB,EAA+Bke,WAA/B;CACA9P,iBAASY,MAAT,CAAgBF,KAAhB,EAAuB9O,MAAvB,EAA+Bme,YAA/B;CAEA,OAvD8D;;;CA0D/DzjB,YAAM2lB,OAAN,CAAche,KAAd,CAAoB6hB,SAApB,CAA8B,KAA9B;CACAxpB,YAAM2lB,OAAN,CAAc7b,KAAd,CAAoB0f,SAApB,CAA8B,KAA9B,EA3D+D;;CA8D/DxpB,YAAM2lB,OAAN,CAAcC,OAAd,CAAsB+D,OAAtB,CAA8BP,QAAQU,KAAtC,EAA6C,CAA7C,EAAgD,UAAhD;CACA9pB,YAAM2lB,OAAN,CAAcC,OAAd,CAAsB6D,KAAtB,CAA4BL,QAAQW,IAApC,EAA0CX,QAAQW,IAAlD,EAAwDX,QAAQW,IAAhE;CAEA;CA5GF;;CAAA;;CAAA;CAAA,EAA8B5G,IAA9B;;CCJA;;;;;;AAMA,KAAa6G,UAAb;CAAA;CAAA;CAEC;;;;;;CAOA,sBAAYxmB,QAAZ,EAA8C;CAAA;;CAAA,QAAxBymB,SAAwB,uEAAZ,UAAY;;CAAA;;CAE7C,oFAAM,YAAN;CAEA,UAAKzmB,QAAL,GAAgBA,QAAhB;CAEA;;;;;;CAMA,UAAKymB,SAAL,GAAiBA,SAAjB;CAZ6C;CAc7C;CAED;;;;;;;;;;;CAzBD;CAAA;CAAA,2BAmCQvW,QAnCR,EAmCkB8P,WAnClB,EAmC+BC,YAnC/B,EAmC6CvM,KAnC7C,EAmCoDwM,WAnCpD,EAmCiE;CAE/D,UAAG,KAAKlgB,QAAL,CAAcqT,QAAd,CAAuB,KAAKoT,SAA5B,MAA2CnvB,SAA9C,EAAyD;CAExD,aAAK0I,QAAL,CAAcqT,QAAd,CAAuB,KAAKoT,SAA5B,EAAuC/mB,KAAvC,GAA+CsgB,YAAYhE,OAA3D;CAEA;;CAED9L,eAASY,MAAT,CAAgB,KAAKF,KAArB,EAA4B,KAAK9O,MAAjC,EAAyC,KAAKge,cAAL,GAAsB,IAAtB,GAA6BG,YAAtE;CAEA;CA7CF;;CAAA;;CAAA;CAAA,EAAgCN,IAAhC;;CCcA;;;;AAIA,KAAa+G,WAAb;CAAA;CAAA;CAEC;;;;;;;;;CAUA,uBAAY9V,KAAZ,EAAmB9O,MAAnB,EAAyC;CAAA;;CAAA,QAAdmG,OAAc,uEAAJ,EAAI;;CAAA;;CAExC,qFAAM,aAAN;CAEA;;;;;;;CAOA,UAAK6c,SAAL,GAAiBlU,KAAjB;CAEA;;;;;;;CAOA,UAAKmU,UAAL,GAAkBjjB,MAAlB;CAEA;;;;;;;CAOA,UAAK6kB,iBAAL,GAAyB,IAAIpG,iBAAJ,CAAsB,CAAtB,EAAyB,CAAzB,EAA4B;CACpDC,iBAAWC,YADyC;CAEpDC,iBAAWD;CAFyC,KAA5B,CAAzB;CAKA,UAAKkG,iBAAL,CAAuB3K,OAAvB,CAA+B/hB,IAA/B,GAAsC,eAAtC;CACA,UAAK0sB,iBAAL,CAAuB3K,OAAvB,CAA+B6E,eAA/B,GAAiD,KAAjD;CAEA;;;;;;;CAOA,UAAKmE,gBAAL,GAAwB,MAAK2B,iBAAL,CAAuBvoB,KAAvB,EAAxB;CAEA,UAAK4mB,gBAAL,CAAsBhJ,OAAtB,CAA8BwF,MAA9B,GAAuCC,SAAvC;CACA,UAAKuD,gBAAL,CAAsBhJ,OAAtB,CAA8B/hB,IAA9B,GAAqC,cAArC;CAEA;;;;;;;CAOA,UAAK2sB,iBAAL,GAAyB,IAAIrG,iBAAJ,CAAsB,CAAtB,EAAyB,CAAzB,EAA4B;CACpDC,iBAAWC,YADyC;CAEpDC,iBAAWD,YAFyC;CAGpDE,qBAAe,KAHqC;CAIpDC,mBAAa,KAJuC;CAKpDY,cAAQC;CAL4C,KAA5B,CAAzB;CAQA,UAAKmF,iBAAL,CAAuB5K,OAAvB,CAA+B/hB,IAA/B,GAAsC,eAAtC;CACA,UAAK2sB,iBAAL,CAAuB5K,OAAvB,CAA+B6E,eAA/B,GAAiD,KAAjD;CAEA;;;;;;;CAOA,UAAKgG,wBAAL,GAAgC,MAAKD,iBAAL,CAAuBxoB,KAAvB,EAAhC;CAEA,UAAKyoB,wBAAL,CAA8B7K,OAA9B,CAAsC/hB,IAAtC,GAA6C,sBAA7C;CAEA;;;;;;;CAOA,UAAK6sB,eAAL,GAAuB,IAAIxC,UAAJ,CAAe,MAAKQ,SAApB,EAA+B,MAAKC,UAApC,EAAgD;CACtEP,wBAAkB,IAAIuC,iBAAJ,CAAsB;CACvCC,sBAAcC,gBADyB;CAEvCtQ,sBAAc,IAFyB;CAGvCC,kBAAU;CAH6B,OAAtB,CADoD;CAMtE2L,kBAAY,IAAI5G,KAAJ,CAAU,QAAV,CAN0D;CAOtE6G,kBAAY;CAP0D,KAAhD,CAAvB;CAUA;;;;;;;CAOA,UAAK0C,cAAL,GAAsB,IAAIZ,UAAJ,CAAe,MAAKQ,SAApB,EAA+B,MAAKC,UAApC,EAAgD;CACrEP,wBAAkB,IAAI/N,uBAAJ,CAA4B,MAAKkQ,iBAAL,CAAuB3K,OAAnD,EAA4D,MAAK+I,UAAjE,CADmD;CAErExC,kBAAY,IAAI5G,KAAJ,CAAU,QAAV,CAFyD;CAGrE6G,kBAAY;CAHyD,KAAhD,CAAtB;CAMA;;;;;;;CAOA,UAAKZ,QAAL,GAAgB,IAAIvB,QAAJ,CAAapY,OAAb,CAAhB;CAEA,UAAK4N,UAAL,GAAkB5N,QAAQ4N,UAA1B;CAEA;;;;;;;CAOA,UAAKqR,QAAL,GAAgB,IAAIV,UAAJ,CAAe,IAAIjQ,YAAJ,EAAf,CAAhB;CACA,UAAK2Q,QAAL,CAAcpH,cAAd,GAA+B,IAA/B;CAEA;;;;;;;CAOA,UAAKqH,oBAAL,GAA4B,IAAIjL,oBAAJ,CAAyBjU,OAAzB,CAA5B;CACA,UAAKkf,oBAAL,CAA0B9T,QAA1B,CAAmCmI,KAAnC,CAAyC9b,KAAzC,GAAiD,MAAKslB,gBAAL,CAAsBhJ,OAAvE;CAEA;;;;;;;CAOA,UAAKoL,oBAAL,GAA4B,IAAIpM,oBAAJ,CAAyB/S,OAAzB,CAA5B;CACA,UAAKmf,oBAAL,CAA0B/T,QAA1B,CAAmCmI,KAAnC,CAAyC9b,KAAzC,GAAiD,MAAKslB,gBAAL,CAAsBhJ,OAAvE;CAEA,UAAKqL,IAAL,GAAapf,QAAQof,IAAR,KAAiB/vB,SAAlB,GAA+B2Q,QAAQof,IAAvC,GAA8C,IAA1D;CAEA;;;;;;;CAOA,UAAKC,SAAL,GAAiB,EAAjB;CAEA;;;;;;;CAOA,UAAKnP,IAAL,GAAY,GAAZ;CAEA;;;;;;CAMA,UAAKoP,UAAL,GAAmBtf,QAAQsf,UAAR,KAAuBjwB,SAAxB,GAAqC2Q,QAAQsf,UAA7C,GAA0D,GAA5E;CAEA;;;;;;;;;CASA,UAAKC,cAAL,GAAsB,EAAtB;CA1LwC;CA4LxC;CAED;;;;;;;CA1MD;CAAA;;CAiVC;;;;;CAjVD,wCAuVmC;CAAA,UAAhBxL,OAAgB,uEAAN,IAAM;CAEjC,WAAKoL,oBAAL,CAA0BK,iBAA1B,CAA4CzL,OAA5C;CAEA;CAED;;;;;;;CA7VD;CAAA;CAAA,iCAoWc0L,OApWd,EAoWuB;CAErB,UAAMJ,YAAYI,QAAQjwB,KAAR,CAAc,CAAd,CAAlB;CACA,UAAM+vB,iBAAiB,KAAKA,cAA5B;CAEA,UAAI1vB,CAAJ,EAAOwpB,CAAP;CAEA,WAAKqG,cAAL;;CAEA,WAAI7vB,IAAI,CAAJ,EAAOwpB,IAAIgG,UAAUtvB,MAAzB,EAAiCF,IAAIwpB,CAArC,EAAwC,EAAExpB,CAA1C,EAA6C;CAE5CwvB,kBAAUxvB,CAAV,EAAa8vB,MAAb,CAAoBC,MAApB,CAA2BL,cAA3B;CAEA;;CAED,WAAKF,SAAL,GAAiBA,SAAjB;CAEA,aAAO,IAAP;CAEA;CAED;;;;;;CAzXD;CAAA;CAAA,qCA+XkB;CAEhB,UAAMA,YAAY,KAAKA,SAAvB;CACA,UAAME,iBAAiB,KAAKA,cAA5B;CAEA,UAAI1vB,CAAJ,EAAOwpB,CAAP;;CAEA,WAAIxpB,IAAI,CAAJ,EAAOwpB,IAAIgG,UAAUtvB,MAAzB,EAAiCF,IAAIwpB,CAArC,EAAwC,EAAExpB,CAA1C,EAA6C;CAE5CwvB,kBAAUxvB,CAAV,EAAa8vB,MAAb,CAAoBE,OAApB,CAA4BN,cAA5B;CAEA;;CAED,WAAKF,SAAL,GAAiB,EAAjB;CACA,WAAKnP,IAAL,GAAY,GAAZ;CAEA,aAAO,IAAP;CAEA;CAED;;;;;;;CAnZD;CAAA;CAAA,iCA0ZcnhB,MA1Zd,EA0ZsB;CAEpBA,aAAO4wB,MAAP,CAAcC,MAAd,CAAqB,KAAKL,cAA1B;CACA,WAAKF,SAAL,CAAe/rB,IAAf,CAAoBvE,MAApB;CAEA,aAAO,IAAP;CAEA;CAED;;;;;;;CAnaD;CAAA;CAAA,mCA0agBA,MA1ahB,EA0awB;CAEtB,UAAMswB,YAAY,KAAKA,SAAvB;CACA,UAAM9jB,QAAQ8jB,UAAU1rB,OAAV,CAAkB5E,MAAlB,CAAd;;CAEA,UAAGwM,SAAS,CAAZ,EAAe;CAEd8jB,kBAAU9jB,KAAV,EAAiBokB,MAAjB,CAAwBE,OAAxB,CAAgC,KAAKN,cAArC;CACAF,kBAAUztB,MAAV,CAAiB2J,KAAjB,EAAwB,CAAxB;;CAEA,YAAG8jB,UAAUtvB,MAAV,KAAqB,CAAxB,EAA2B;CAE1B,eAAKmgB,IAAL,GAAY,GAAZ;CAEA;CAED;;CAED,aAAO,IAAP;CAEA;CAED;;;;;;;CAhcD;CAAA;CAAA,wCAucqB4P,OAvcrB,EAuc8B;CAE5B,UAAMT,YAAY,KAAKA,SAAvB;CAEA,UAAIxvB,CAAJ,EAAOwpB,CAAP;;CAEA,WAAIxpB,IAAI,CAAJ,EAAOwpB,IAAIgG,UAAUtvB,MAAzB,EAAiCF,IAAIwpB,CAArC,EAAwC,EAAExpB,CAA1C,EAA6C;CAE5C,YAAGiwB,OAAH,EAAY;CAEXT,oBAAUxvB,CAAV,EAAa8vB,MAAb,CAAoBC,MAApB,CAA2B,CAA3B;CAEA,SAJD,MAIO;CAENP,oBAAUxvB,CAAV,EAAa8vB,MAAb,CAAoBE,OAApB,CAA4B,CAA5B;CAEA;CAED;CAED;CAED;;;;;;;;;;CA7dD;CAAA;CAAA,2BAueQ5X,QAveR,EAuekB8P,WAvelB,EAue+BC,YAve/B,EAue6CvM,KAve7C,EAueoDwM,WAvepD,EAueiE;CAE/D,UAAM4E,YAAY,KAAKA,SAAvB;CACA,UAAMC,aAAa,KAAKA,UAAxB;CACA,UAAMxJ,QAAQ,KAAK6L,oBAAL,CAA0B/T,QAA1B,CAAmCkI,KAAjD;CAEA,UAAI+J,UAAJ,EAAgB0C,IAAhB;;CAEA,UAAG,KAAKV,SAAL,CAAetvB,MAAf,GAAwB,CAA3B,EAA8B;CAE7BstB,qBAAaR,UAAUQ,UAAvB;CACA0C,eAAOjD,WAAW6C,MAAX,CAAkBI,IAAzB;CACAlD,kBAAUQ,UAAV,GAAuB,IAAvB;CAEA/J,cAAM7b,KAAN,GAAc,GAAd;;CAEA,YAAG,KAAK6nB,UAAL,GAAkB,GAArB,EAA0B;CAEzBhM,gBAAM7b,KAAN,GAAc,QAAQyF,KAAK8iB,GAAL,CAAS,KAAK9P,IAAL,GAAY,KAAKoP,UAAjB,GAA8B,IAAvC,IAA+C,KAArE;CACA,eAAKpP,IAAL,IAAazE,KAAb;CAEA,SAb4B;;;CAgB7B,aAAKwU,mBAAL,CAAyB,KAAzB;CACA,aAAKpB,eAAL,CAAqBhW,MAArB,CAA4BZ,QAA5B,EAAsC,KAAKyW,iBAA3C;CACA,aAAKuB,mBAAL,CAAyB,IAAzB,EAlB6B;;CAqB7BnD,mBAAW6C,MAAX,CAAkBI,IAAlB,GAAyB,KAAK,KAAKR,cAAnC;CACA,aAAKtC,cAAL,CAAoBpU,MAApB,CAA2BZ,QAA3B,EAAqC,KAAK8U,gBAA1C,EAtB6B;;CAyB7BD,mBAAW6C,MAAX,CAAkBI,IAAlB,GAAyBA,IAAzB;CACAlD,kBAAUQ,UAAV,GAAuBA,UAAvB,CA1B6B;;CA6B7B,aAAKtlB,QAAL,GAAgB,KAAKmnB,oBAArB;CACAjX,iBAASY,MAAT,CAAgB,KAAKF,KAArB,EAA4B,KAAK9O,MAAjC,EAAyC,KAAK8kB,iBAA9C;;CAEA,YAAG,KAAKhF,QAAL,CAAc1e,OAAjB,EAA0B;CAEzB;CACA,eAAK0e,QAAL,CAAc9Q,MAAd,CAAqBZ,QAArB,EAA+B,KAAK0W,iBAApC,EAAuD,KAAKC,wBAA5D;CAEA;;CAED,YAAG,KAAK9E,KAAR,EAAe;CAEd;CACA,eAAK/hB,QAAL,GAAgB,KAAKonB,oBAArB;CACA,eAAKA,oBAAL,CAA0B/T,QAA1B,CAAmCoB,QAAnC,CAA4C/U,KAA5C,GAAoDsgB,YAAYhE,OAAhE;CACA9L,mBAASY,MAAT,CAAgB,KAAKF,KAArB,EAA4B,KAAK9O,MAAjC,EAAyC,KAAKge,cAAL,GAAsB,IAAtB,GAA6B,KAAKG,YAA3E;CAEA;CAED,OAhDD,MAgDO,IAAG,KAAKH,cAAR,EAAwB;CAE9B;CACA,aAAKoH,QAAL,CAAcpW,MAAd,CAAqBZ,QAArB,EAA+B8P,WAA/B;CAEA;CAED;CAED;;;;;;;CAxiBD;CAAA;CAAA,4BA+iBSve,KA/iBT,EA+iBgBC,MA/iBhB,EA+iBwB;CAEtB,WAAKilB,iBAAL,CAAuBnW,OAAvB,CAA+B/O,KAA/B,EAAsCC,MAAtC;CACA,WAAKsjB,gBAAL,CAAsBxU,OAAtB,CAA8B/O,KAA9B,EAAqCC,MAArC;CAEA,WAAKolB,eAAL,CAAqBtW,OAArB,CAA6B/O,KAA7B,EAAoCC,MAApC;CACA,WAAKwjB,cAAL,CAAoB1U,OAApB,CAA4B/O,KAA5B,EAAmCC,MAAnC;CACA,WAAKkgB,QAAL,CAAcpR,OAAd,CAAsB/O,KAAtB,EAA6BC,MAA7B;CAEAD,cAAQ,KAAKmgB,QAAL,CAAcngB,KAAtB;CACAC,eAAS,KAAKkgB,QAAL,CAAclgB,MAAvB;CAEA,WAAKklB,iBAAL,CAAuBpW,OAAvB,CAA+B/O,KAA/B,EAAsCC,MAAtC;CACA,WAAKmlB,wBAAL,CAA8BrW,OAA9B,CAAsC/O,KAAtC,EAA6CC,MAA7C;CAEA,WAAK0lB,oBAAL,CAA0B/T,QAA1B,CAAmCrN,MAAnC,CAA0CtG,KAA1C,GAAkD+B,QAAQC,MAA1D;CACA,WAAKylB,oBAAL,CAA0BvR,YAA1B,CAAuC,MAAMnU,KAA7C,EAAoD,MAAMC,MAA1D;CAEA;CAED;;;;;;;CAnkBD;CAAA;CAAA,+BA0kBYwO,QA1kBZ,EA0kBsBiQ,KA1kBtB,EA0kB6B;CAE3B,WAAK2G,eAAL,CAAqB9E,UAArB,CAAgC9R,QAAhC,EAA0CiQ,KAA1C;CACA,WAAK+E,cAAL,CAAoBlD,UAApB,CAA+B9R,QAA/B,EAAyCiQ,KAAzC;CACA,WAAKyB,QAAL,CAAcI,UAAd,CAAyB9R,QAAzB,EAAmCiQ,KAAnC;CAEA;CAhlBF;CAAA;CAAA,wBAgNuB;CAErB,aAAO,KAAKyB,QAAL,CAAcb,eAArB;CAEA;CAED;;;;;CAtND;CAAA,wBA4NkC;CAAA,UAAbrhB,KAAa,uEAAL,GAAK;CAEhC,WAAKkiB,QAAL,CAAcb,eAAd,GAAgCrhB,KAAhC;CAEA;CAED;;;;;;CAlOD;CAAA;CAAA,wBAwOkB;CAEhB,aAAO,KAAKkiB,QAAL,CAAc/L,UAArB;CAEA;CAED;;;CA9OD;CAAA,wBAkP+C;CAAA,UAA/BnW,KAA+B,uEAAvBoW,WAAWI,UAAY;CAE7C,WAAK0L,QAAL,CAAc/L,UAAd,GAA2BnW,KAA3B;CAEA;CAED;;;;;;CAxPD;CAAA;CAAA,wBA8PY;CAEV,aAAO,KAAKkiB,QAAL,CAAc1e,OAArB;CAEA;CAED;;;CApQD;CAAA,sBAwQUxD,KAxQV,EAwQiB;CAEf,WAAKkiB,QAAL,CAAc1e,OAAd,GAAwBxD,KAAxB;CAEA,WAAK0nB,oBAAL,CAA0B/T,QAA1B,CAAmCoI,MAAnC,CAA0C/b,KAA1C,GAAkDA,QACjD,KAAKmnB,wBAAL,CAA8B7K,OADmB,GAEjD,KAAK4K,iBAAL,CAAuB5K,OAFxB;CAIA;CAED;;;;;;CAlRD;CAAA;CAAA,wBAwRiB;CAEf,aAAO,KAAK4F,QAAL,CAAcV,SAArB;CAEA;CAED;;;;;CA9RD;CAAA,sBAoSexhB,KApSf,EAoSsB;CAEpB,WAAKkiB,QAAL,CAAcV,SAAd,GAA0BxhB,KAA1B;CAEA;CAED;;;;;;CA1SD;CAAA;CAAA,wBAgTa;CAEX,aAAO,KAAKqgB,SAAZ;CAEA;CAED;;;;;;;;CAtTD;CAAA,sBA+TWrgB,KA/TX,EA+TkB;CAEhB,WAAKqgB,SAAL,GAAiBrgB,KAAjB;CAEA;CAED;;;;;;CArUD;CAAA;CAAA,wBA2Ue;CAEb,aAAO,KAAK0nB,oBAAL,CAA0B/T,QAA1B,CAAmCoI,MAAnC,CAA0C/b,KAAjD;CAEA;CA/UF;;CAAA;;CAAA;CAAA,EAAiCigB,IAAjC;;CCvBA;;;;AAIA,KAAawI,cAAb;CAAA;CAAA;CAEC;;;;;CAMA,4BAAgC;CAAA;;CAAA,QAApB/L,WAAoB,uEAAN,IAAM;;CAAA;;CAE/B,wFAAM,gBAAN;CAEA,UAAKpc,QAAL,GAAgB,IAAImc,kBAAJ,EAAhB;CAEA,UAAKC,WAAL,GAAmBA,WAAnB;CAN+B;CAQ/B;CAED;;;;;;;CAlBD;CAAA;;CAkDC;;;;;;;;;CAlDD,2BA4DQlM,QA5DR,EA4DkB8P,WA5DlB,EA4D+BC,YA5D/B,EA4D6CvM,KA5D7C,EA4DoDwM,WA5DpD,EA4DiE;CAE/D,WAAKlgB,QAAL,CAAcqT,QAAd,CAAuBoB,QAAvB,CAAgC/U,KAAhC,GAAwCsgB,YAAYhE,OAApD;CAEA9L,eAASY,MAAT,CAAgB,KAAKF,KAArB,EAA4B,KAAK9O,MAAjC,EAAyC,KAAKge,cAAL,GAAsB,IAAtB,GAA6BG,YAAtE;CAEA;CAED;;;;;;;CApED;CAAA;CAAA,4BA2ESxe,KA3ET,EA2EgBC,MA3EhB,EA2EwB;CAEtB,WAAK1B,QAAL,CAAcooB,aAAd,CAA4B3mB,KAA5B,EAAmCC,MAAnC;CAEA;CA/EF;CAAA;CAAA,wBAwBmB;CAEjB,aAAO,KAAK1B,QAAL,CAAcoc,WAArB;CAEA;CAED;;;;;CA9BD;CAAA,wBAoC6B;CAAA,UAAZ1c,KAAY,uEAAJ,EAAI;CAE3BA,cAAQyF,KAAKoc,KAAL,CAAW7hB,KAAX,CAAR;;CAEA,UAAGA,QAAQ,CAAR,GAAY,CAAf,EAAkB;CAEjBA,iBAAS,CAAT;CAEA;;CAED,WAAKM,QAAL,CAAcoc,WAAd,GAA4B1c,KAA5B;CAEA;CAhDF;;CAAA;;CAAA;CAAA,EAAoCigB,IAApC;;CCJA;;;;;;;;AAQA,KAAa0I,kBAAb;CAAA;CAAA;CAEC;;;;;;CAOA,8BAAYvmB,MAAZ,EAAkC;CAAA;;CAAA,QAAdmG,OAAc,uEAAJ,EAAI;;CAAA;;CAEjC,4FAAM,oBAAN;CAEA,UAAKjI,QAAL,GAAgB,IAAIuc,sBAAJ,CAA2Bza,MAA3B,EAAmCmG,OAAnC,CAAhB;CAJiC;CAMjC;CAED;;;;;;;;;;;CAjBD;CAAA;CAAA,2BA2BQiI,QA3BR,EA2BkB8P,WA3BlB,EA2B+BC,YA3B/B,EA2B6CvM,KA3B7C,EA2BoDwM,WA3BpD,EA2BiE;CAE/D,WAAKlgB,QAAL,CAAcqT,QAAd,CAAuBoB,QAAvB,CAAgC/U,KAAhC,GAAwCsgB,YAAYhE,OAApD;CACA,WAAKhc,QAAL,CAAcqT,QAAd,CAAuBqB,MAAvB,CAA8BhV,KAA9B,GAAsCsgB,YAAYtJ,YAAlD;CAEAxG,eAASY,MAAT,CAAgB,KAAKF,KAArB,EAA4B,KAAK9O,MAAjC,EAAyC,KAAKge,cAAL,GAAsB,IAAtB,GAA6BG,YAAtE;CAEA;CAED;;;;;;;CApCD;CAAA;CAAA,4BA2CSxe,KA3CT,EA2CgBC,MA3ChB,EA2CwB;CAEtB,WAAK1B,QAAL,CAAc4V,YAAd,CAA2B,MAAMnU,KAAjC,EAAwC,MAAMC,MAA9C;CAEA;CA/CF;;CAAA;;CAAA;CAAA,EAAwCie,IAAxC;;CCPA;;;;AAIA,KAAa2I,QAAb;CAAA;CAAA;CAEC;;;;;;CAOA,oBAAY3G,YAAZ,EAAyC;CAAA;;CAAA,QAAf4G,MAAe,uEAAN,IAAM;;CAAA;;CAExC,kFAAM,UAAN;CAEA,UAAKvoB,QAAL,GAAgB,IAAIuW,YAAJ,EAAhB;CAEA,UAAKwJ,SAAL,GAAiB,KAAjB;CAEA;;;;;;CAMA,UAAK4B,YAAL,GAAqBA,iBAAiBrqB,SAAlB,GAA+BqqB,YAA/B,GAA8C,IAAIpB,iBAAJ,CAAsB,CAAtB,EAAyB,CAAzB,EAA4B;CAC7FC,iBAAWC,YADkF;CAE7FC,iBAAWD,YAFkF;CAG7FE,qBAAe,KAH8E;CAI7FC,mBAAa;CAJgF,KAA5B,CAAlE;CAOA,UAAKe,YAAL,CAAkB3F,OAAlB,CAA0B/hB,IAA1B,GAAiC,aAAjC;CACA,UAAK0nB,YAAL,CAAkB3F,OAAlB,CAA0B6E,eAA1B,GAA4C,KAA5C;CAEA;;;;;;;CAOA,UAAK0H,MAAL,GAAcA,MAAd;CA/BwC;CAiCxC;CAED;;;;;;;;;;;CA5CD;CAAA;CAAA,2BAsDQrY,QAtDR,EAsDkB8P,WAtDlB,EAsD+BC,YAtD/B,EAsD6CvM,KAtD7C,EAsDoDwM,WAtDpD,EAsDiE;CAE/D,WAAKlgB,QAAL,CAAcqT,QAAd,CAAuBoB,QAAvB,CAAgC/U,KAAhC,GAAwCsgB,YAAYhE,OAApD;CAEA9L,eAASY,MAAT,CAAgB,KAAKF,KAArB,EAA4B,KAAK9O,MAAjC,EAAyC,KAAK6f,YAA9C;CAEA;CAED;;;;;;;CA9DD;CAAA;CAAA,4BAqESlgB,KArET,EAqEgBC,MArEhB,EAqEwB;CAEtB,UAAG,KAAK6mB,MAAR,EAAgB;CAEf9mB,gBAAQ0D,KAAKpN,GAAL,CAAS,CAAT,EAAY0J,KAAZ,CAAR;CACAC,iBAASyD,KAAKpN,GAAL,CAAS,CAAT,EAAY2J,MAAZ,CAAT;CAEA,aAAKigB,YAAL,CAAkBnR,OAAlB,CAA0B/O,KAA1B,EAAiCC,MAAjC;CAEA;CAED;CAED;;;;;;;CAlFD;CAAA;CAAA,+BAyFYwO,QAzFZ,EAyFsBiQ,KAzFtB,EAyF6B;CAE3B,UAAG,CAACA,KAAJ,EAAW;CAEV,aAAKwB,YAAL,CAAkB3F,OAAlB,CAA0BwF,MAA1B,GAAmCC,SAAnC;CAEA;CAED;CAjGF;;CAAA;;CAAA;CAAA,EAA8B9B,IAA9B;;CCJA;;;;;;;CAOA,IAAM6I,UAAUrjB,KAAKC,EAAL,GAAU,GAA1B;CAEA;;;;;;;CAOA,IAAM+F,IAAI,IAAIC,OAAJ,EAAV;CAEA;;;;;;;CAOA,IAAMqd,KAAK,IAAIrd,OAAJ,EAAX;CAEA;;;;AAIA,KAAasd,aAAb;CAAA;CAAA;CAEC;;;;;;;;;;;CAYA,yBAAY5mB,MAAZ,EAA6D;CAAA;;CAAA,QAAzC6mB,SAAyC,uEAA7B,IAAIvd,OAAJ,EAA6B;CAAA,QAAdnD,OAAc,uEAAJ,EAAI;;CAAA;;CAE5D,uFAAM,eAAN;CAEA;;;;;;CAMA,UAAK8c,UAAL,GAAkBjjB,MAAlB;CAEA;;;;;;;CAOA,UAAK6mB,SAAL,GAAiBA,SAAjB;CAEA;;;;;;;CAOA,UAAKvD,cAAL,GAAsB,IAAIha,OAAJ,EAAtB;CAEA;;;;;;CAMA,UAAKwd,KAAL,GAAc3gB,QAAQ2gB,KAAR,KAAkBtxB,SAAnB,GAAgC2Q,QAAQ2gB,KAAxC,GAAgD,GAA7D;CAEA;;;;;;;CAOA,UAAKzQ,IAAL,GAAY,GAAZ;CAEA;;;;;;;CAOA,UAAK1c,MAAL,GAAc,KAAd;CAEA;;;;;;;CAOA,UAAKotB,iBAAL,GAAyB,IAAI1K,iBAAJ,CAAsBlW,OAAtB,CAAzB;CAEA,UAAK4gB,iBAAL,CAAuBxV,QAAvB,CAAgCkL,MAAhC,CAAuC7e,KAAvC,GAA+C,MAAK0lB,cAApD;CAEA;;;;;;;CAOA,UAAK0D,YAAL,GAAoB,IAAIvS,YAAJ,EAApB;CA1E4D;CA4E5D;CAED;;;;;CA5FD;CAAA;CAAA,8BAgGW;CAET,WAAK4B,IAAL,GAAY,GAAZ;CACA,WAAK1c,MAAL,GAAc,IAAd;CAEA;CAED;;;;;;;;;;CAvGD;CAAA;CAAA,2BAiHQyU,QAjHR,EAiHkB8P,WAjHlB,EAiH+BC,YAjH/B,EAiH6CvM,KAjH7C,EAiHoDwM,WAjHpD,EAiHiE;CAE/D,UAAMyI,YAAY,KAAKA,SAAvB;CACA,UAAM5D,aAAa,KAAKA,UAAxB;CACA,UAAMK,iBAAiB,KAAKA,cAA5B;CAEA,UAAMyD,oBAAoB,KAAKA,iBAA/B;CACA,UAAMxV,WAAWwV,kBAAkBxV,QAAnC;CACA,UAAMkL,SAASlL,SAASkL,MAAxB;CACA,UAAM3c,SAASyR,SAASzR,MAAxB;CACA,UAAMwc,YAAY/K,SAAS+K,SAA3B;CACA,UAAMC,WAAWhL,SAASgL,QAA1B;CAEA,WAAKyK,YAAL,CAAkBzV,QAAlB,CAA2BoB,QAA3B,CAAoC/U,KAApC,GAA4CsgB,YAAYhE,OAAxD;CACA,WAAKhc,QAAL,GAAgB,KAAK8oB,YAArB;;CAEA,UAAG,KAAKrtB,MAAR,EAAgB;CAEf;CACAspB,mBAAWgE,iBAAX,CAA6B5d,CAA7B;CACAsd,WAAGxqB,IAAH,CAAQ8mB,WAAWzkB,QAAnB,EAA6B0oB,GAA7B,CAAiCL,SAAjC,EAJe;;CAOf,YAAGxd,EAAE8d,OAAF,CAAUR,EAAV,IAAgBD,OAAnB,EAA4B;CAE3B;CACAnV,mBAASmL,cAAT,CAAwB9e,KAAxB,GAAgCqlB,WAAWzkB,QAAX,CAAoB4oB,UAApB,CAA+BP,SAA/B,CAAhC,CAH2B;;CAM3BvD,yBAAennB,IAAf,CAAoB0qB,SAApB,EAA+BpD,OAA/B,CAAuCR,UAAvC;CACAxG,iBAAO7e,KAAP,CAAagB,CAAb,GAAiB,CAAC0kB,eAAe1kB,CAAf,GAAmB,GAApB,IAA2B,GAA5C;CACA6d,iBAAO7e,KAAP,CAAaiB,CAAb,GAAiB,CAACykB,eAAezkB,CAAf,GAAmB,GAApB,IAA2B,GAA5C;CAEA0S,mBAASoB,QAAT,CAAkB/U,KAAlB,GAA0BsgB,YAAYhE,OAAtC;CACA,eAAKhc,QAAL,GAAgB6oB,iBAAhB;CAEA,SApBc;;;CAuBf,aAAK1Q,IAAL,IAAazE,QAAQ,KAAKkV,KAA1B;CACAhnB,eAAOlC,KAAP,GAAe,KAAKyY,IAAL,GAAYkG,SAAS3e,KAApC;;CAEA,YAAGkC,OAAOlC,KAAP,IAAgB,CAAC0e,UAAU1e,KAAV,GAAkB2e,SAAS3e,KAA5B,IAAqC,CAAxD,EAA2D;CAE1D,eAAKjE,MAAL,GAAc,KAAd;CAEA;CAED;;CAEDyU,eAASY,MAAT,CAAgB,KAAKF,KAArB,EAA4B,KAAK9O,MAAjC,EAAyC,KAAKge,cAAL,GAAsB,IAAtB,GAA6BG,YAAtE;CAEA;CAED;;;;;;;CAvKD;CAAA;CAAA,4BA8KSxe,KA9KT,EA8KgBC,MA9KhB,EA8KwB;CAEtB,WAAKmnB,iBAAL,CAAuBxV,QAAvB,CAAgCrN,MAAhC,CAAuCtG,KAAvC,GAA+C+B,QAAQC,MAAvD;CAEA;CAlLF;;CAAA;;CAAA;CAAA,EAAmCie,IAAnC;;CCnCA;AACA,0BAAe,+KAAf;;CCDA;AACA,wBAAe,4tiEAAf;;CCgBA;;;;;;;AAOA,KAAawJ,QAAb;CAAA;CAAA;CAEC;;;;;;CAOA,oBAAYC,WAAZ,EAAyBC,SAAzB,EAAoC;CAAA;;CAAA;;CAEnC,kFAAM,UAAN;CAEA;;;;;;;CAOA,UAAK9E,SAAL,GAAiB,IAAIjC,SAAJ,CAAc;CAC9BC,kBAAY,IAAI5G,KAAJ,CAAU,QAAV,CADkB;CAE9B6G,kBAAY;CAFkB,KAAd,CAAjB;CAKA;;;;;;;CAOA,UAAK8G,sBAAL,GAA8B,IAAI/I,iBAAJ,CAAsB,CAAtB,EAAyB,CAAzB,EAA4B;CACzDC,iBAAWC,YAD8C;CAEzDe,cAAQC,SAFiD;CAGzDd,qBAAe,KAH0C;CAIzDC,mBAAa;CAJ4C,KAA5B,CAA9B;CAOA,UAAK0I,sBAAL,CAA4BtN,OAA5B,CAAoC/hB,IAApC,GAA2C,iBAA3C;CACA,UAAKqvB,sBAAL,CAA4BtN,OAA5B,CAAoC6E,eAApC,GAAsD,KAAtD;CAEA;;;;;;;CAOA,UAAK0I,mBAAL,GAA2B,MAAKD,sBAAL,CAA4BlrB,KAA5B,EAA3B;CAEA,UAAKmrB,mBAAL,CAAyBvN,OAAzB,CAAiC/hB,IAAjC,GAAwC,cAAxC;CACA,UAAKsvB,mBAAL,CAAyBvN,OAAzB,CAAiCwF,MAAjC,GAA0CgI,UAA1C;CAEA;;;;;;;CAOA,UAAKC,kBAAL,GAA0B,IAAI7U,kBAAJ,EAA1B;CAEA;;;;;;;CAOA,UAAK8U,eAAL,GAAuB,IAAI/K,mBAAJ,EAAvB;CAEA,UAAK+K,eAAL,CAAqBrW,QAArB,CAA8BoB,QAA9B,CAAuC/U,KAAvC,GAA+C,MAAK4pB,sBAAL,CAA4BtN,OAA3E;CAEA;;;;;;;CAOA,UAAK2N,aAAL,GAAqB,IAAIC,OAAJ,CAAYR,WAAZ,CAArB;CAEA,UAAKO,aAAL,CAAmB1vB,IAAnB,GAA0B,aAA1B;CACA,UAAK0vB,aAAL,CAAmBjJ,SAAnB,GAA+BmJ,aAA/B;CACA,UAAKF,aAAL,CAAmBnJ,SAAnB,GAA+BqJ,aAA/B;CACA,UAAKF,aAAL,CAAmBnI,MAAnB,GAA4BgI,UAA5B;CACA,UAAKG,aAAL,CAAmB9I,eAAnB,GAAqC,KAArC;CACA,UAAK8I,aAAL,CAAmB3U,WAAnB,GAAiC,IAAjC;CACA,UAAK2U,aAAL,CAAmBG,KAAnB,GAA2B,KAA3B;CAEA,UAAKJ,eAAL,CAAqBrW,QAArB,CAA8B+L,OAA9B,CAAsC1f,KAAtC,GAA8C,MAAKiqB,aAAnD;CAEA;;;;;;;CAOA,UAAKI,WAAL,GAAmB,IAAIH,OAAJ,CAAYP,SAAZ,CAAnB;CAEA,UAAKU,WAAL,CAAiB9vB,IAAjB,GAAwB,WAAxB;CACA,UAAK8vB,WAAL,CAAiBvJ,SAAjB,GAA6BC,YAA7B;CACA,UAAKsJ,WAAL,CAAiBvI,MAAjB,GAA0BgI,UAA1B;CACA,UAAKO,WAAL,CAAiBlJ,eAAjB,GAAmC,KAAnC;CACA,UAAKkJ,WAAL,CAAiB/U,WAAjB,GAA+B,IAA/B;CACA,UAAK+U,WAAL,CAAiBD,KAAjB,GAAyB,KAAzB;CAEA,UAAKJ,eAAL,CAAqBrW,QAArB,CAA8B8L,KAA9B,CAAoCzf,KAApC,GAA4C,MAAKqqB,WAAjD;CAEA;;;;;;;CAOA,UAAKC,aAAL,GAAqB,IAAIvL,iBAAJ,EAArB;CAEA,UAAKuL,aAAL,CAAmB3W,QAAnB,CAA4BqL,QAA5B,CAAqChf,KAArC,GAA6C,MAAK6pB,mBAAL,CAAyBvN,OAAtE;CA/GmC;CAiHnC;CAED;;;;;;;;;;;CA5HD;CAAA;CAAA,2BAsIQ9L,QAtIR,EAsIkB8P,WAtIlB,EAsI+BC,YAtI/B,EAsI6CvM,KAtI7C,EAsIoDwM,WAtIpD,EAsIiE;CAE/D;CACA,WAAKlgB,QAAL,GAAgB,KAAKypB,kBAArB;CACA,WAAKA,kBAAL,CAAwBpW,QAAxB,CAAiCoB,QAAjC,CAA0C/U,KAA1C,GAAkDsgB,YAAYhE,OAA9D;CACA,WAAKuI,SAAL,CAAezT,MAAf,CAAsBZ,QAAtB,EAAgC,KAAKoZ,sBAArC;CACApZ,eAASY,MAAT,CAAgB,KAAKF,KAArB,EAA4B,KAAK9O,MAAjC,EAAyC,KAAKwnB,sBAA9C,EAN+D;;CAS/D,WAAKtpB,QAAL,GAAgB,KAAK0pB,eAArB;CACAxZ,eAASY,MAAT,CAAgB,KAAKF,KAArB,EAA4B,KAAK9O,MAAjC,EAAyC,KAAKynB,mBAA9C,EAV+D;;CAa/D,WAAKvpB,QAAL,GAAgB,KAAKgqB,aAArB;CACA,WAAKA,aAAL,CAAmB3W,QAAnB,CAA4BoB,QAA5B,CAAqC/U,KAArC,GAA6CsgB,YAAYhE,OAAzD;CAEA9L,eAASY,MAAT,CAAgB,KAAKF,KAArB,EAA4B,KAAK9O,MAAjC,EAAyC,KAAKge,cAAL,GAAsB,IAAtB,GAA6BG,YAAtE;CAEA;CAED;;;;;;;CA1JD;CAAA;CAAA,4BAiKSxe,KAjKT,EAiKgBC,MAjKhB,EAiKwB;CAEtB,WAAK4nB,sBAAL,CAA4B9Y,OAA5B,CAAoC/O,KAApC,EAA2CC,MAA3C;CACA,WAAK6nB,mBAAL,CAAyB/Y,OAAzB,CAAiC/O,KAAjC,EAAwCC,MAAxC;CAEA,WAAK+nB,kBAAL,CAAwBpW,QAAxB,CAAiCwB,SAAjC,CAA2CnV,KAA3C,CAAiDzB,IAAjD,CACC,KAAKyrB,eAAL,CAAqBrW,QAArB,CAA8BwB,SAA9B,CAAwCnV,KAAxC,CAA8CzB,IAA9C,CACC,KAAK+rB,aAAL,CAAmB3W,QAAnB,CAA4BwB,SAA5B,CAAsCnV,KAAtC,CAA4CtC,GAA5C,CACC,MAAMqE,KADP,EACc,MAAMC,MADpB,CADD,CADD;CAKA;CAED;;;;;;;;;;;;;CA7KD;CAAA;CAAA,wBA0LiC;CAE/B,aAAOuoB,kBAAP;CAEA;CAED;;;;;;;;;;;;;CAhMD;CAAA;CAAA,wBA6M+B;CAE7B,aAAOC,gBAAP;CAEA;CAjNF;;CAAA;;CAAA;CAAA,EAA8BvK,IAA9B;;CCrBA;;;;AAIA,KAAawK,WAAb;CAAA;CAAA;CAEC;;;;;;;CAQA,uBAAYnO,OAAZ,EAAuD;CAAA;;CAAA,QAAlCxF,OAAkC,uEAAxB,GAAwB;CAAA,QAAnBtB,UAAmB,uEAAN,IAAM;;CAAA;;CAEtD,qFAAM,aAAN;CAEA,UAAKlV,QAAL,GAAgB,IAAIiV,eAAJ,CAAoBC,UAApB,CAAhB;CAEA,UAAK8G,OAAL,GAAeA,OAAf;CACA,UAAKoO,aAAL,GAAqB5T,OAArB;CAPsD;CAStD;CAED;;;;;;;CArBD;CAAA;;CA2FC;;;;;;;;;CA3FD,2BAqGQtG,QArGR,EAqGkB8P,WArGlB,EAqG+BC,YArG/B,EAqG6CvM,KArG7C,EAqGoDwM,WArGpD,EAqGiE;CAE/D,WAAKlgB,QAAL,CAAcqT,QAAd,CAAuB8B,QAAvB,CAAgCzV,KAAhC,GAAwCsgB,YAAYhE,OAApD;CACA9L,eAASY,MAAT,CAAgB,KAAKF,KAArB,EAA4B,KAAK9O,MAAjC,EAAyC,KAAKge,cAAL,GAAsB,IAAtB,GAA6BG,YAAtE;CAEA;CA1GF;CAAA;CAAA,wBA2Be;CAEb,aAAO,KAAKjgB,QAAL,CAAcqT,QAAd,CAAuB+B,QAAvB,CAAgC1V,KAAvC;CAEA;CAED;;;CAjCD;CAAA,sBAqCaA,KArCb,EAqCoB;CAElB,WAAKM,QAAL,CAAcqT,QAAd,CAAuB+B,QAAvB,CAAgC1V,KAAhC,GAAwCA,KAAxC;CAEA;CAED;;;;;;;;CA3CD;CAAA;CAAA,wBAmD0B;CAExB,aAAO,KAAKM,QAAL,CAAcqT,QAAd,CAAuBgC,QAAvB,CAAgC3V,KAAvC;CAEA;CAED;;;CAzDD;CAAA,wBA6DqC;CAAA,UAAbA,KAAa,uEAAL,GAAK;CAEnC,WAAKM,QAAL,CAAcqT,QAAd,CAAuBgC,QAAvB,CAAgC3V,KAAhC,GAAwCA,KAAxC;CAEA;CAED;;;;;;;;CAnED;CAAA;CAAA,wBA2EqB;CAEnB,aAAO,KAAKM,QAAL,CAAcqT,QAAd,CAAuBiC,QAAvB,CAAgC5V,KAAvC;CAEA;CAED;;;CAjFD;CAAA,wBAqFgC;CAAA,UAAbA,KAAa,uEAAL,GAAK;CAE9B,WAAKM,QAAL,CAAcqT,QAAd,CAAuBiC,QAAvB,CAAgC5V,KAAhC,GAAwCA,KAAxC;CAEA;CAzFF;;CAAA;;CAAA;CAAA,EAAiCigB,IAAjC;;CCUA;;;;;;;;;;;;AAYA,KAAa0K,eAAb;CAAA;CAAA;CAEC;;;;;;;;CASA,6BAA0B;CAAA;;CAAA,QAAdpiB,OAAc,uEAAJ,EAAI;;CAAA;;CAEzB,yFAAM,iBAAN;CAEA;;;;;;;;CAQA,UAAKqiB,sBAAL,GAA8B,IAAI/J,iBAAJ,CAAsB,CAAtB,EAAyB,CAAzB,EAA4B;CACzDC,iBAAW+J,wBAD8C;CAEzD7J,iBAAWD,YAF8C;CAGzDe,cAAQC,SAHiD;CAIzDd,qBAAe,KAJ0C;CAKzDC,mBAAa;CAL4C,KAA5B,CAA9B;CAQA,UAAK0J,sBAAL,CAA4BtO,OAA5B,CAAoC/hB,IAApC,GAA2C,wBAA3C;CAEA;;;;;;;CAOA,UAAKuwB,mBAAL,GAA2B,MAAKF,sBAAL,CAA4BlsB,KAA5B,EAA3B;CAEA,UAAKosB,mBAAL,CAAyBxO,OAAzB,CAAiC/hB,IAAjC,GAAwC,+BAAxC;CACA,UAAKuwB,mBAAL,CAAyBxO,OAAzB,CAAiC6E,eAAjC,GAAmD,KAAnD;CACA,UAAK2J,mBAAL,CAAyBxO,OAAzB,CAAiCwE,SAAjC,GAA6CC,YAA7C;CAEA;;;;;;;CAOA,UAAKgK,oBAAL,GAA4B,MAAKD,mBAAL,CAAyBpsB,KAAzB,EAA5B;CAEA,UAAKqsB,oBAAL,CAA0BzO,OAA1B,CAAkC/hB,IAAlC,GAAyC,gCAAzC;CAEA;;;;;;;CAOA,UAAK6uB,YAAL,GAAoB,IAAIvS,YAAJ,EAApB;CAEA;;;;;;;CAOA,UAAKuL,kBAAL,GAA0B,IAAIxH,kBAAJ,EAA1B;CAEA,UAAKwH,kBAAL,CAAwBzO,QAAxB,CAAiCqH,WAAjC,CAA6Chb,KAA7C,GAAsDuI,QAAQyS,WAAR,KAAwBpjB,SAAzB,GAAsC2Q,QAAQyS,WAA9C,GAA4D,GAAjH;CAEA;;;;;;;CAOA,UAAKgQ,0BAAL,GAAkC,IAAIxX,0BAAJ,EAAlC;CAEA,UAAKtD,UAAL,GAAkB3H,QAAQ2H,UAA1B;CAEA;;;;;;;CAOA,UAAK+a,mBAAL,GAA2B,IAAIrL,mBAAJ,EAA3B;CAEA,UAAKsL,QAAL,GAAgB3iB,QAAQ2iB,QAAxB;CAtFyB;CAwFzB;CAED;;;;;;;CArGD;CAAA;;CAwMC;;;;;;;;;CAxMD,2BAkNQ1a,QAlNR,EAkNkB8P,WAlNlB,EAkN+BC,YAlN/B,EAkN6CvM,KAlN7C,EAkNoDwM,WAlNpD,EAkNiE;CAE/D,UAAMtP,QAAQ,KAAKA,KAAnB;CACA,UAAM9O,SAAS,KAAKA,MAApB;CAEA,UAAM4oB,6BAA6B,KAAKA,0BAAxC;CACA,UAAM5I,qBAAqB,KAAKA,kBAAhC;CACA,UAAM6I,sBAAsB,KAAKA,mBAAjC;CACA,UAAM7B,eAAe,KAAKA,YAA1B;CAEA,UAAM2B,uBAAuB,KAAKA,oBAAlC;CACA,UAAMH,yBAAyB,KAAKA,sBAApC;CACA,UAAME,sBAAsB,KAAKA,mBAAjC;;CAEA,UAAG,KAAKI,QAAR,EAAkB;CAEjB;CACA,aAAK5qB,QAAL,GAAgB8hB,kBAAhB;CACAA,2BAAmBzO,QAAnB,CAA4BoB,QAA5B,CAAqC/U,KAArC,GAA6CsgB,YAAYhE,OAAzD;CACA9L,iBAASY,MAAT,CAAgBF,KAAhB,EAAuB9O,MAAvB,EAA+BwoB,sBAA/B,EALiB;;CAQjB,aAAKtqB,QAAL,GAAgB0qB,0BAAhB;CACAA,mCAA2BrX,QAA3B,CAAoCK,KAApC,CAA0ChU,KAA1C,GAAkDgU,KAAlD;CACAgX,mCAA2BrX,QAA3B,CAAoCC,YAApC,CAAiD5T,KAAjD,GAAyD+qB,qBAAqBzO,OAA9E;CACA0O,mCAA2BrX,QAA3B,CAAoCG,WAApC,CAAgD9T,KAAhD,GAAwD4qB,uBAAuBtO,OAA/E;CACA9L,iBAASY,MAAT,CAAgBF,KAAhB,EAAuB9O,MAAvB,EAA+B0oB,mBAA/B,EAZiB;;CAejB,aAAKxqB,QAAL,GAAgB8oB,YAAhB;CACAA,qBAAazV,QAAb,CAAsBoB,QAAtB,CAA+B/U,KAA/B,GAAuC8qB,oBAAoBxO,OAA3D;CACA9L,iBAASY,MAAT,CAAgBF,KAAhB,EAAuB9O,MAAvB,EAA+B2oB,oBAA/B;CAEA,OAjC8D;;;CAoC/D,WAAKzqB,QAAL,GAAgB2qB,mBAAhB;CACAA,0BAAoBtX,QAApB,CAA6BoB,QAA7B,CAAsC/U,KAAtC,GAA8CsgB,YAAYhE,OAA1D;CAEA9L,eAASY,MAAT,CAAgB,KAAKF,KAArB,EAA4B,KAAK9O,MAAjC,EAAyC,KAAKge,cAAL,GAAsB,IAAtB,GAA6BG,YAAtE;CAEA;CAED;;;;;;;CA7PD;CAAA;CAAA,+BAoQY/P,QApQZ,EAoQsBiQ,KApQtB,EAoQ6B;CAE3B,WAAKngB,QAAL,GAAgB,IAAImlB,iBAAJ,CAAsB;CAAEhhB,eAAO;CAAT,OAAtB,CAAhB;CACA+L,eAASY,MAAT,CAAgB,KAAKF,KAArB,EAA4B,KAAK9O,MAAjC,EAAyC,KAAK2oB,oBAA9C;CACA,WAAKzqB,QAAL,CAAcnE,OAAd;CAEA;CA1QF;CAAA;CAAA,wBA2GkB;CAEhB,aAAO,KAAKyuB,sBAAL,CAA4B7oB,KAAnC;CAEA;CAED;;;;;CAjHD;CAAA,wBAuH6B;CAAA,UAAb/B,KAAa,uEAAL,GAAK;CAE3B;CACA,UAAMwF,WAAWC,KAAKpN,GAAL,CAAS,CAAT,EAAYoN,KAAK0lB,IAAL,CAAU1lB,KAAK2lB,IAAL,CAAUprB,KAAV,CAAV,CAAZ,CAAjB;CACAA,cAAQyF,KAAK4lB,GAAL,CAAS,CAAT,EAAY7lB,QAAZ,CAAR;CAEA,WAAKolB,sBAAL,CAA4B9Z,OAA5B,CAAoC9Q,KAApC,EAA2CA,KAA3C;CACA,WAAK+qB,oBAAL,CAA0Bja,OAA1B,CAAkC9Q,KAAlC,EAAyCA,KAAzC;CACA,WAAK8qB,mBAAL,CAAyBha,OAAzB,CAAiC9Q,KAAjC,EAAwCA,KAAxC;CAEA,WAAKgrB,0BAAL,CAAgCvX,OAAhC,CAAwCC,aAAxC,GAAwDlO,SAASwL,OAAT,CAAiB,CAAjB,CAAxD;CACA,WAAKga,0BAAL,CAAgC1V,WAAhC,GAA8C,IAA9C;CAEA;CAED;;;;;;;CAtID;CAAA;CAAA,wBA6IgB;CAEd,aAAQ,KAAK2V,mBAAL,CAAyBxX,OAAzB,CAAiC6X,iBAAjC,KAAuD1zB,SAA/D;CAEA;CAED;;;;;CAnJD;CAAA,wBAyJ4B;CAAA,UAAdoI,KAAc,uEAAN,IAAM;;CAE1B,UAAGA,KAAH,EAAU;CAET,aAAKirB,mBAAL,CAAyBxX,OAAzB,CAAiC6X,iBAAjC,GAAqD,GAArD;CACA,aAAKL,mBAAL,CAAyBtX,QAAzB,CAAkCkM,YAAlC,CAA+C7f,KAA/C,GAAuD,KAAK8qB,mBAAL,CAAyBxO,OAAhF;CAEA,OALD,MAKO;CAEN,eAAO,KAAK2O,mBAAL,CAAyBxX,OAAzB,CAAiC6X,iBAAxC;CACA,aAAKL,mBAAL,CAAyBtX,QAAzB,CAAkCkM,YAAlC,CAA+C7f,KAA/C,GAAuD,IAAvD;CAEA;;CAED,WAAKirB,mBAAL,CAAyB3V,WAAzB,GAAuC,IAAvC;CAEA;CAED;;;;;;CA3KD;CAAA;CAAA,wBAiLiB;CAEf,aAAO,KAAK2V,mBAAL,CAAyBzJ,SAAhC;CAEA;CAED;;;;;CAvLD;CAAA,sBA6LexhB,KA7Lf,EA6LsB;CAEpB,UAAG,KAAKwhB,SAAL,KAAmBxhB,KAAtB,EAA6B;CAE5B,aAAKirB,mBAAL,CAAyBzJ,SAAzB,GAAqCxhB,KAArC;CACA,aAAKirB,mBAAL,CAAyB3V,WAAzB,GAAuC,IAAvC;CAEA;CAED;CAtMF;;CAAA;;CAAA;CAAA,EAAqC2K,IAArC;;CC7BA;;;;;;CCaA;;;;;;;;;;;;;;AAcA,KAAasL,cAAb;CAAA;CAAA;CAEC;;;;;;;;;CAUA,4BAA2C;CAAA,QAA/B/a,QAA+B,uEAApB,IAAoB;CAAA,QAAdjI,OAAc,uEAAJ,EAAI;;CAAA;;CAE1C;;;;;;;;CASA,SAAKiI,QAAL,GAAgBA,QAAhB;CAEA;;;;;;;;;;CAUA,SAAK8P,WAAL,GAAmB,IAAnB;CAEA;;;;;;;CAOA,SAAKC,YAAL,GAAoB,IAApB;;CAEA,QAAG,KAAK/P,QAAL,KAAkB,IAArB,EAA2B;CAE1B,WAAKA,QAAL,CAAcgb,SAAd,GAA0B,KAA1B;CAEA,WAAKlL,WAAL,GAAmB,KAAKmL,YAAL,CACjBljB,QAAQ2Y,WAAR,KAAwBtpB,SAAzB,GAAsC2Q,QAAQ2Y,WAA9C,GAA4D,IAD1C,EAEjB3Y,QAAQ0Y,aAAR,KAA0BrpB,SAA3B,GAAwC2Q,QAAQ0Y,aAAhD,GAAgE,KAF9C,EAGjB1Y,QAAQyO,YAAR,KAAyBpf,SAA1B,GAAuC2Q,QAAQyO,YAA/C,GAA8D,KAH5C,CAAnB;CAMA,WAAKuJ,YAAL,GAAoB,KAAKD,WAAL,CAAiB5hB,KAAjB,EAApB;CAEA;CAED;;;;;;;;CAOA,SAAK8oB,QAAL,GAAgB,IAAIV,UAAJ,CAAe,IAAIjQ,YAAJ,EAAf,CAAhB;CAEA;;;;;;;CAOA,SAAK6U,MAAL,GAAc,EAAd;CAEA;CAED;;;;;;;CAhFD;CAAA;;CA+GC;;;;;;;;;;;;;CA/GD,oCA6HiBlb,QA7HjB,EA6H2B;CAEzB,UAAMmb,cAAc,KAAKnb,QAAzB;CAEA,UAAI7R,MAAJ,EAAYitB,OAAZ,EAAqBC,OAArB;;CAEA,UAAGF,gBAAgB,IAAhB,IAAwBA,gBAAgBnb,QAA3C,EAAqD;CAEpD,aAAKA,QAAL,GAAgBA,QAAhB;CACA,aAAKA,QAAL,CAAcgb,SAAd,GAA0B,KAA1B;CAEA7sB,iBAASgtB,YAAYha,UAAZ,CAAuBma,UAAhC;CACAF,kBAAUD,YAAYna,OAAZ,EAAV;CACAqa,kBAAUrb,SAASgB,OAAT,EAAV;;CAEA,YAAG7S,WAAW,IAAd,EAAoB;CAEnBA,iBAAOotB,WAAP,CAAmBJ,YAAYha,UAA/B;CACAhT,iBAAOoR,WAAP,CAAmBS,SAASmB,UAA5B;CAEA;;CAED,YAAGia,QAAQ7pB,KAAR,KAAkB8pB,QAAQ9pB,KAA1B,IAAmC6pB,QAAQ5pB,MAAR,KAAmB6pB,QAAQ7pB,MAAjE,EAAyE;CAExE,eAAK8O,OAAL;CAEA;CAED;;CAED,aAAO6a,WAAP;CAEA;CAED;;;;;;;;;;;;;CA/JD;CAAA;CAAA,iCA4KczK,WA5Kd,EA4K2BD,aA5K3B,EA4K0CjK,YA5K1C,EA4KwD;CAEtD,UAAMgV,oBAAoB,KAAKxb,QAAL,CAAcyb,oBAAd,EAA1B;CACA,UAAMxL,QAAQ,KAAKjQ,QAAL,CAAc0V,OAAd,CAAsBgG,oBAAtB,GAA6CzL,KAA3D;CAEA,UAAMwB,eAAe,IAAIpB,iBAAJ,CAAsBmL,kBAAkBjqB,KAAxC,EAA+CiqB,kBAAkBhqB,MAAjE,EAAyE;CAC7F8e,mBAAWC,YADkF;CAE7FC,mBAAWD,YAFkF;CAG7Fe,gBAAQrB,QAAQqJ,UAAR,GAAqB/H,SAHgE;CAI7Fb,qBAAaA,WAJgF;CAK7FD,uBAAeA,aAL8E;CAM7FjK,sBAAcA,eAAe,IAAImV,YAAJ,EAAf,GAAoC;CAN2C,OAAzE,CAArB;;CASA,UAAGnV,gBAAgBiK,aAAnB,EAAkC;CAEjCgB,qBAAajL,YAAb,CAA0B8K,MAA1B,GAAmCsK,kBAAnC;CACAnK,qBAAajL,YAAb,CAA0B9Z,IAA1B,GAAiCmvB,kBAAjC;CAEA;;CAEDpK,mBAAa3F,OAAb,CAAqB/hB,IAArB,GAA4B,uBAA5B;CACA0nB,mBAAa3F,OAAb,CAAqB6E,eAArB,GAAuC,KAAvC;CAEA,aAAOc,YAAP;CAEA;CAED;;;;;;;CAxMD;CAAA;CAAA,4BA+MSqK,IA/MT,EA+MexoB,KA/Mf,EA+MsB;CAEpB,UAAM0M,WAAW,KAAKA,QAAtB;CACA,UAAMwb,oBAAoBxb,SAASyb,oBAAT,EAA1B;CAEAK,WAAKxb,OAAL,CAAakb,kBAAkBjqB,KAA/B,EAAsCiqB,kBAAkBhqB,MAAxD;CACAsqB,WAAKhK,UAAL,CAAgB9R,QAAhB,EAA0BA,SAAS0V,OAAT,CAAiBgG,oBAAjB,GAAwCzL,KAAlE;;CAEA,UAAG3c,UAAUlM,SAAb,EAAwB;CAEvB,aAAK8zB,MAAL,CAAYvxB,MAAZ,CAAmB2J,KAAnB,EAA0B,CAA1B,EAA6BwoB,IAA7B;CAEA,OAJD,MAIO;CAEN,aAAKZ,MAAL,CAAY7vB,IAAZ,CAAiBywB,IAAjB;CAEA;CAED;CAED;;;;;;CAnOD;CAAA;CAAA,+BAyOYA,IAzOZ,EAyOkB;CAEhB,WAAKZ,MAAL,CAAYvxB,MAAZ,CAAmB,KAAKuxB,MAAL,CAAYxvB,OAAZ,CAAoBowB,IAApB,CAAnB,EAA8C,CAA9C;CAEA;CAED;;;;;;CA/OD;CAAA;CAAA,2BAqPQtY,KArPR,EAqPe;CAEb,UAAM0X,SAAS,KAAKA,MAApB;CACA,UAAMlE,WAAW,KAAKA,QAAtB;CACA,UAAMhX,WAAW,KAAKA,QAAtB;CAEA,UAAI8P,cAAc,KAAKA,WAAvB;CACA,UAAIC,eAAe,KAAKA,YAAxB;CAEA,UAAIC,cAAc,KAAlB;CACA,UAAI8L,IAAJ,EAAUpG,OAAV,EAAmBppB,KAAnB,EAA0B2J,MAA1B;CACA,UAAIrO,CAAJ,EAAOwpB,CAAP;;CAEA,WAAIxpB,IAAI,CAAJ,EAAOwpB,IAAI8J,OAAOpzB,MAAtB,EAA8BF,IAAIwpB,CAAlC,EAAqC,EAAExpB,CAAvC,EAA0C;CAEzCk0B,eAAOZ,OAAOtzB,CAAP,CAAP;;CAEA,YAAGk0B,KAAK9oB,OAAR,EAAiB;CAEhB8oB,eAAKlb,MAAL,CAAYZ,QAAZ,EAAsB8P,WAAtB,EAAmCC,YAAnC,EAAiDvM,KAAjD,EAAwDwM,WAAxD;;CAEA,cAAG8L,KAAKjM,SAAR,EAAmB;CAElB,gBAAGG,WAAH,EAAgB;CAEfgH,uBAASpH,cAAT,GAA0BkM,KAAKlM,cAA/B;CAEA8F,wBAAU1V,SAAS0V,OAAnB;CACAppB,sBAAQ0T,SAAS1T,KAAjB,CALe;;CAQfA,oBAAM2lB,OAAN,CAAcC,OAAd,CAAsB+D,OAAtB,CAA8BP,QAAQqG,QAAtC,EAAgD,CAAhD,EAAmD,UAAnD;CACA/E,uBAASpW,MAAT,CAAgBZ,QAAhB,EAA0B8P,WAA1B,EAAuCC,YAAvC,EAAqDvM,KAArD,EAA4DwM,WAA5D;CACA1jB,oBAAM2lB,OAAN,CAAcC,OAAd,CAAsB+D,OAAtB,CAA8BP,QAAQU,KAAtC,EAA6C,CAA7C,EAAgD,UAAhD;CAEA;;CAEDngB,qBAAS6Z,WAAT;CACAA,0BAAcC,YAAd;CACAA,2BAAe9Z,MAAf;CAEA;;CAED,cAAG6lB,gBAAgBvG,QAAnB,EAA6B;CAE5BvF,0BAAc,IAAd;CAEA,WAJD,MAIO,IAAG8L,gBAAgB9J,aAAnB,EAAkC;CAExChC,0BAAc,KAAd;CAEA;CAED;CAED;CAED;CAED;;;;;;;;;;;;;CAhTD;CAAA;CAAA,4BA6TSze,KA7TT,EA6TgBC,MA7ThB,EA6TwB;CAEtB,UAAM0pB,SAAS,KAAKA,MAApB;CACA,UAAMlb,WAAW,KAAKA,QAAtB;CAEA,UAAI7C,IAAJ,EAAUqe,iBAAV;CACA,UAAI5zB,CAAJ,EAAOwpB,CAAP;;CAEA,UAAG7f,UAAUnK,SAAV,IAAuBoK,WAAWpK,SAArC,EAAgD;CAE/C+V,eAAO6C,SAASgB,OAAT,EAAP;CACAzP,gBAAQ4L,KAAK5L,KAAb;CACAC,iBAAS2L,KAAK3L,MAAd;CAEA,OAdqB;;;CAiBtBwO,eAASM,OAAT,CAAiB/O,KAAjB,EAAwBC,MAAxB,EAjBsB;;CAoBtBgqB,0BAAoBxb,SAASyb,oBAAT,EAApB;CAEA,WAAK3L,WAAL,CAAiBxP,OAAjB,CAAyBkb,kBAAkBjqB,KAA3C,EAAkDiqB,kBAAkBhqB,MAApE;CACA,WAAKue,YAAL,CAAkBzP,OAAlB,CAA0Bkb,kBAAkBjqB,KAA5C,EAAmDiqB,kBAAkBhqB,MAArE;;CAEA,WAAI5J,IAAI,CAAJ,EAAOwpB,IAAI8J,OAAOpzB,MAAtB,EAA8BF,IAAIwpB,CAAlC,EAAqC,EAAExpB,CAAvC,EAA0C;CAEzCszB,eAAOtzB,CAAP,EAAU0Y,OAAV,CAAkBkb,kBAAkBjqB,KAApC,EAA2CiqB,kBAAkBhqB,MAA7D;CAEA;CAED;CAED;;;;CA9VD;CAAA;CAAA,4BAkWS;CAEP,UAAMigB,eAAe,KAAKwJ,YAAL,CACpB,KAAKnL,WAAL,CAAiBY,WADG,EAEpB,KAAKZ,WAAL,CAAiBW,aAFG,EAGnB,KAAKX,WAAL,CAAiBtJ,YAAjB,KAAkC,IAHf,CAArB;CAMA,WAAK7a,OAAL,GARO;;CAWP,WAAKmkB,WAAL,GAAmB2B,YAAnB;CACA,WAAK1B,YAAL,GAAoB0B,aAAavjB,KAAb,EAApB;CACA,WAAK8oB,QAAL,GAAgB,IAAIV,UAAJ,CAAe,IAAIjQ,YAAJ,EAAf,CAAhB;CAEA;CAED;;;;;;;CAnXD;CAAA;CAAA,8BA0XW;CAET,UAAM6U,SAAS,KAAKA,MAApB;CAEA,UAAItzB,CAAJ,EAAOwpB,CAAP;;CAEA,WAAIxpB,IAAI,CAAJ,EAAOwpB,IAAI8J,OAAOpzB,MAAtB,EAA8BF,IAAIwpB,CAAlC,EAAqC,EAAExpB,CAAvC,EAA0C;CAEzCszB,eAAOtzB,CAAP,EAAU+D,OAAV;CAEA;;CAED,WAAKuvB,MAAL,GAAc,EAAd;;CAEA,UAAG,KAAKpL,WAAL,KAAqB,IAAxB,EAA8B;CAE7B,aAAKA,WAAL,CAAiBnkB,OAAjB;CACA,aAAKmkB,WAAL,GAAmB,IAAnB;CAEA;;CAED,UAAG,KAAKC,YAAL,KAAsB,IAAzB,EAA+B;CAE9B,aAAKA,YAAL,CAAkBpkB,OAAlB;CACA,aAAKokB,YAAL,GAAoB,IAApB;CAEA;;CAED,WAAKiH,QAAL,CAAcrrB,OAAd;CAEA;CAxZF;CAAA;CAAA,wBAsFoB;CAElB,aAAO,KAAKmkB,WAAL,CAAiBtJ,YAAxB;CAEA;CAED;;;;;;;;;;;CA5FD;CAAA,sBAwGkBhW,CAxGlB,EAwGqB;CAEnB,WAAKsf,WAAL,CAAiBtJ,YAAjB,GAAgChW,CAAhC;CACA,WAAKuf,YAAL,CAAkBvJ,YAAlB,GAAiChW,CAAjC;CAEA;CA7GF;;CAAA;CAAA;;CCrBA,IAAMwrB,WAAW,SAAXA,QAAW,CAACl1B,MAAD,EAASm1B,MAAT,EAAqC;CAAA,MAApBC,QAAoB,uEAAT,IAAS;CACpD,MAAIp1B,OAAOm1B,MAAP,CAAJ,EAAoB;CACpB,MAAIC,QAAJ,EAAcryB,QAAQoD,IAAR,sCAA2CgvB,MAA3C,wBAAsEn1B,MAAtE;;CACdA,SAAOm1B,MAAP,IAAiB,YAAM,EAAvB;CACD,CAJD;CAMA;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,KAAaE,mBAAb;CAAA;CAAA;CAWE,iCAAmD;CAAA;;CAAA,QAAvC7uB,MAAuC,uEAA9B6uB,oBAAoB5uB,QAAU;;CAAA;;CAAA,2DAVrC,IAUqC,YAR3C,IAAI9J,OAAJ,CAAY,mBAAW;CAC7B,YAAKyM,OAAL,GAAeA,OAAf;CACD,KAFO,CAQ2C;;CACjD,SAAKksB,KAAL,GAAa9uB,OAAO8uB,KAApB;CACA,SAAK9uB,MAAL,GAAcA,MAAd;CACD;;CAdH;CAAA;CAAA,4BAgBUhC,QAhBV,EAgBmB;CAAA;;CACfA,eAAQ8V,MAAR,CAAe,eAAf;;CAEA,WAAKjB,OAAL,GAAe7U,SAAQ8B,GAAR,CAAY,WAAZ,EAAyB+S,OAAxC;CACA,WAAKH,QAAL,GAAgB1U,SAAQO,GAAR,CAAY,UAAZ,CAAhB;CACA,WAAK6U,KAAL,GAAapV,SAAQO,GAAR,CAAY,OAAZ,CAAb;CACA,WAAK+F,MAAL,GAActG,SAAQO,GAAR,CAAY,QAAZ,CAAd;CAEA,WAAKwwB,QAAL,GAAgB,IAAItB,cAAJ,CAAmB,KAAK/a,QAAxB,EAAkC,KAAK1S,MAAvC,CAAhB;;CAEAhC,eAAQ8B,GAAR,CAAY,WAAZ,EAAyByG,IAAzB;;CAEA,UAAMwoB,WAAW,KAAKA,QAAtB;CACA,WAAKtb,UAAL,GAAkB,IAAIxN,IAAJ,CAAS;CAAA,eAAS8oB,SAASzb,MAAT,CAAgBxN,MAAMkpB,QAAN,EAAhB,CAAT;CAAA,OAAT,EAAqD1oB,KAArD,CAA2DtI,SAAQY,OAAnE,CAAlB;;CAEAZ,eAAQgW,MAAR,CAAe;CACbtB,kBAAU,6BAAY;CACpB,iBAAKqc,QAAL,CAAcE,eAAd,CAA8Bvc,SAA9B;CACD,SAHY;CAKbU,eAAO,uBAAS;CACd,iBAAKA,KAAL,GAAaA,MAAb;CACD,SAPY;CASb9O,gBAAQ,yBAAU;CAChB,iBAAKA,MAAL,GAAcA,OAAd;CACD;CAXY,OAAf;;CAcA,WAAK1B,OAAL;CACD;CAED;;;;;;;CAhDF;CAAA;CAAA,6BAsDW;CAAA;;CACP,WAAKmB,KAAL,CAAWvD,IAAX,CAAgB,YAAM;CACpB,YAAMguB,OAAO,IAAI1H,UAAJ,CAAe,OAAK1T,KAApB,EAA2B,OAAK9O,MAAL,CAAY3D,MAAvC,CAAb,CADoB;;CAKpB,eAAKouB,QAAL,CAAcG,OAAd,CAAsBV,IAAtB;;CACA,eAAKW,WAAL,GAAmBX,IAAnB;CACD,OAPD;CASA,aAAO,IAAP;CACD;CAED;;;;;;;;CAnEF;CAAA;CAAA,yBA0EOA,KA1EP,EA0Ea;CAAA;;CACT,WAAKzqB,KAAL,CAAWvD,IAAX,CAAgB,YAAM;CACpBkuB,iBAASF,KAAT,EAAe,SAAf,EAA0B,OAAKM,KAA/B;CACAJ,iBAASF,KAAT,EAAe,YAAf,EAA6B,OAAKM,KAAlC;;CAEA,eAAKC,QAAL,CAAcG,OAAd,CAAsBV,KAAtB;;CACA,eAAKW,WAAL,GAAmBX,KAAnB;CACD,OAND;CAQA,aAAO,IAAP;CACD;CAED;;;;;;;;;CAtFF;CAAA;CAAA,2BA8FShsB,QA9FT,EA8F6C;CAAA;;CAAA,UAA1BymB,SAA0B,uEAAd,YAAc;CACzC,WAAKllB,KAAL,CAAWvD,IAAX,CAAgB,YAAM;CACpB,YAAI,CAACgC,SAASqT,QAAT,CAAkBoT,SAAlB,CAAL,EACEzmB,SAASqT,QAAT,CAAkBoT,SAAlB,IAA+B;CAAC/mB,iBAAO;CAAR,SAA/B;CAEF,YAAMssB,OAAO,IAAIxF,UAAJ,CAAexmB,QAAf,EAAyBymB,SAAzB,CAAb;;CAEA,eAAK8F,QAAL,CAAcG,OAAd,CAAsBV,IAAtB;;CACA,eAAKW,WAAL,GAAmBX,IAAnB;CACD,OARD;CAUA,aAAO,IAAP;CACD;CAED;;;;;;;;CA5GF;CAAA;CAAA,wBAmHM/xB,IAnHN,EAmHY;CACR,aAAOA,OACH,KAAKsyB,QAAL,CAAcnB,MAAd,CAAqB5hB,MAArB,CAA4B;CAAA,eAAQwiB,KAAK/xB,IAAL,KAAcA,IAAtB;CAAA,OAA5B,EAAwD,CAAxD,CADG,GAEH,KAAK0yB,WAFT;CAGD;CAED;;;;;;;;CAzHF;CAAA;CAAA,qCAgI8B;CAAA;;CAAA,UAAbC,IAAa,uEAAN,IAAM;CAC1B,WAAKrrB,KAAL,CAAWvD,IAAX,CAAgB,YAAM;CACpB,eAAK2uB,WAAL,CAAiB7M,cAAjB,GAAkC8M,IAAlC;CACD,OAFD;CAIA,aAAO,IAAP;CACD;CAtIH;;CAAA;CAAA;;kBAAaP,iCAOO;CAChBC,SAAO;CADS;;CC3CpB;;;;;;AAMA,KAAaO,iBAAb;CAAA;CAAA;CAAA;CAAA;CAAA;;CAAA;CAAA;CAAA,4BACUrxB,QADV,EACmB;CACfA,eAAQ8V,MAAR,CAAe,QAAf;;CACA,WAAKjC,OAAL,GAAe7T,SAAQO,GAAR,CAAY,UAAZ,EAAwBsV,UAAvC;CACD;CAED;;;;;;;;;CANF;CAAA;CAAA,gCAccyb,YAdd,EAc4D;CAAA,UAAhCC,UAAgC,uEAAnB,IAAmB;CAAA,UAAbC,MAAa,uEAAJ,EAAI;CACxDA,aAAOtjB,OAAP,CAAe;CAAA,eACbojB,aAAaja,gBAAb,CAA8Boa,KAA9B,EAAqC;CAAA,iBAAKF,WAAWG,IAAX,CAAgBD,KAAhB,EAAuB7pB,CAAvB,CAAL;CAAA,SAArC,CADa;CAAA,OAAf;CAGD;CAlBH;CAAA;CAAA,8BAoBYoM,IApBZ,EAoBkB;CAAA,UACPH,OADO,GACiBG,IADjB,CACPH,OADO;CAAA,UACE8d,WADF,GACiB3d,IADjB,CACE2d,WADF;CAGdA,kBAAY9d,OAAZ,EAAqB,IAArB,EAA2B,CACzB,WADyB,EAEzB,SAFyB,EAGzB,aAHyB,EAIzB,WAJyB,EAKzB,OALyB,EAMzB,OANyB,EAOzB,YAPyB,EAQzB,UARyB,EASzB,WATyB,EAUzB,SAVyB,EAWzB,OAXyB,EAYzB,UAZyB,CAA3B;CAcD;CArCH;;CAAA;CAAA;;CCIA;;;;;;;;AAOA,KAAa+d,kBAAb;CAAA;CAAA;CAOE,gCAAoC;CAAA;;CAAA,QAAxBC,cAAwB,uEAAP,KAAO;;CAAA;;CAClC;;CADkC,uJAN5B,IAAIxd,OAAJ,EAM4B,gBALxB,IAAIyd,SAAJ,EAKwB,YAJ5B,IAI4B,aAH3B,IAG2B,sBAFlB,IAAIjiB,KAAJ,CAAU,IAAID,OAAJ,CAAY,CAAZ,EAAe,CAAf,EAAkB,CAAlB,CAAV,EAAgC,CAAhC,CAEkB;;CAElC,UAAKiiB,cAAL,GAAsBA,cAAtB;CAFkC;CAGnC;;CAVH;CAAA;CAAA,2BAYSjqB,CAZT,EAYYmqB,OAZZ,EAYqBC,OAZrB,EAY8B;CAC1B,UAAMC,OAAO,KAAKrc,MAAL,CAAYsc,qBAAZ,EAAb;CAEA,UAAMhtB,IAAI6sB,WAAWnqB,EAAEuqB,OAAvB;CACA,UAAMhtB,IAAI6sB,WAAWpqB,EAAEwqB,OAAvB;CAEA,WAAKC,KAAL,CAAWntB,CAAX,GAAgB,CAACA,IAAI+sB,KAAKvrB,IAAV,KAAmBurB,KAAKtrB,KAAL,GAAasrB,KAAKvrB,IAArC,CAAD,GAA+C,CAA/C,GAAmD,CAAlE;CACA,WAAK2rB,KAAL,CAAWltB,CAAX,GAAe,EAAE,CAACA,IAAI8sB,KAAKrrB,GAAV,KAAkBqrB,KAAKprB,MAAL,GAAcorB,KAAKrrB,GAArC,CAAF,IAA+C,CAA/C,GAAmD,CAAlE;CAEA,WAAK0rB,eAAL,CAAqBC,MAArB,CAA4B9vB,IAA5B,CAAiC,KAAK6D,MAAL,CAAYinB,iBAAZ,EAAjC;CAEA,WAAKiF,SAAL,CAAeC,aAAf,CAA6B,KAAKJ,KAAlC,EAAyC,KAAK/rB,MAA9C;CACA,WAAKorB,IAAL,CAAU,MAAV;CACD;CAzBH;CAAA;CAAA,4BA2BU1xB,QA3BV,EA2BmB;CACfA,eAAQ8V,MAAR,CAAe,OAAf;;CACA9V,eAAQ0yB,OAAR,CAAgB,QAAhB,EAA0B;CAAA,eAAM,IAAIrB,iBAAJ,EAAN;CAAA,OAA1B;;CAEA,WAAKzb,MAAL,GAAc5V,SAAQO,GAAR,CAAY,UAAZ,EAAwBsV,UAAtC;CACA,WAAKvP,MAAL,GAActG,SAAQO,GAAR,CAAY,QAAZ,EAAsBoC,MAApC;CACD;CAjCH;CAAA;CAAA,8BAmCYqR,IAnCZ,EAmCkB;CAAA;;CACd,OACE,OADF,EAEE,WAFF,EAGE,SAHF,EAIE,WAJF,EAKE9F,OALF,CAKU;CAAA,eAAM,OAAKykB,EAAL,CAAQC,EAAR,EAAY;CAAA,iBAAK5e,KAAK0d,IAAL,CAAUkB,EAAV,EAAchrB,CAAd,CAAL;CAAA,SAAZ,CAAN;CAAA,OALV;CAOAoM,WAAK6e,OAAL,GAAe,CAAf;CACA7e,WAAK8e,OAAL,GAAe,CAAf;CAEA,WAAKH,EAAL,CAAQ,WAAR,EAAqB,aAAK;CACxB,YAAIv9B,SAAS29B,kBAAT,KAAgC,IAApC,EAA0C;CACxC/e,eAAK6e,OAAL,IAAgBjrB,EAAEorB,SAAlB;CACAhf,eAAK8e,OAAL,IAAgBlrB,EAAEqrB,SAAlB;CAEAjf,eAAKgC,MAAL,CAAYpO,CAAZ,EAAeoM,KAAK6e,OAApB,EAA6B7e,KAAK8e,OAAlC;CACD,SALD,MAKO9e,KAAKgC,MAAL,CAAYpO,CAAZ;CACR,OAPD;CAQD;CAED;;;;;;;;CAxDF;CAAA;CAAA,0BA+DQ3J,SA/DR,EA+DkC;CAAA;;CAAA,UAAfi1B,MAAe,uEAAN,IAAM;CAC9B,UAAIC,YAAY,KAAhB;CAEA,WAAKR,EAAL,CAAQ,MAAR,EAAgB,YAAM;CACpB,YAAI,OAAKS,MAAL,CAAYn1B,SAAZ,EAAuBi1B,MAAvB,CAAJ,EAAoC;CAClC,cAAIC,SAAJ,EAAel1B,UAAUyzB,IAAV,CAAe,WAAf,EAAf,KACK;CACHzzB,sBAAUyzB,IAAV,CAAe,WAAf;CACAyB,wBAAY,IAAZ;CACD;CACF,SAND,MAMO,IAAIA,SAAJ,EAAe;CACpBl1B,oBAAUyzB,IAAV,CAAe,UAAf;CACAyB,sBAAY,KAAZ;CACD;CACF,OAXD;CAaA,WAAKR,EAAL,CAAQ,OAAR,EAAiB,YAAM;CACrB,YAAIQ,SAAJ,EAAel1B,UAAUyzB,IAAV,CAAe,OAAf,EAAf,KACKzzB,UAAUyzB,IAAV,CAAe,UAAf;CACN,OAHD;CAKA,WAAKiB,EAAL,CAAQ,WAAR,EAAqB,YAAM;CACzB,YAAIQ,SAAJ,EAAel1B,UAAUyzB,IAAV,CAAe,WAAf;CAChB,OAFD;CAIA,WAAKiB,EAAL,CAAQ,SAAR,EAAmB,YAAM;CACvB,YAAIQ,SAAJ,EAAel1B,UAAUyzB,IAAV,CAAe,SAAf;CAChB,OAFD;CAGD;CAED;;;;;;;;;CA7FF;CAAA;CAAA,uCAqGwC;CAAA,UAAxB/uB,MAAwB,QAAxBA,MAAwB;CAAA,UAAfuwB,MAAe,uEAAN,IAAM;;CACpC,UAAIvwB,OAAOM,QAAP,CAAgBzG,MAAhB,GAAyB,CAAzB,IAA8B02B,MAAlC,EAA0C;CACxC,YAAMhH,UAAU,EAAhB;CACAvpB,eAAO0wB,QAAP,CAAgB;CAAA,iBAASnH,QAAQnsB,IAAR,CAAauzB,KAAb,CAAT;CAAA,SAAhB;CAEA,eAAO,KAAKd,SAAL,CAAee,gBAAf,CAAgCrH,OAAhC,CAAP;CACD;;CAED,aAAO,KAAKsG,SAAL,CAAegB,eAAf,CAA+B7wB,MAA/B,CAAP;CACD;CAED;;;;;;;;;CAhHF;CAAA;CAAA,8BAwHgD;CAAA,UAAtC8wB,KAAsC,uEAA9B,KAAKnB,eAAyB;CAAA,UAAR9uB,MAAQ;CAC5C,aAAO,KAAKgvB,SAAL,CAAekB,GAAf,CAAmBC,cAAnB,CAAkCF,KAAlC,EAAyCjwB,MAAzC,CAAP;CACD;CAED;;;;;;;;;CA5HF;CAAA;CAAA,2BAoISvF,SApIT,EAoImC;CAAA,UAAfi1B,MAAe,uEAAN,IAAM;CAC/B,aAAO,KAAKU,YAAL,CAAkB31B,SAAlB,EAA6Bi1B,MAA7B,EAAqC12B,MAArC,GAA8C,CAArD;CACD;CAED;;;;;;CAxIF;CAAA;CAAA,wBA6IY;CACR,aAAO,KAAKg2B,SAAL,CAAekB,GAAtB;CACD;CAED;;;;;;CAjJF;CAAA;CAAA,wBAsJU;CACN,aAAO,KAAKrB,KAAL,CAAWntB,CAAlB;CACD;CAED;;;;;;CA1JF;CAAA;CAAA,wBA+JU;CACN,aAAO,KAAKmtB,KAAL,CAAWltB,CAAlB;CACD;CAjKH;;CAAA;;CAAA;CAAA,EAAwC7E,kBAAxC;;CCdA;;;;;;;;;;;;;;;;;;AAiBA,KAAauzB,cAAb;CAAA;CAAA;CAAA;CAAA;CAAA,yBACcC,QADd,EACwB;CACpB,aAAO,IAAID,cAAJ,CAAmB;CAACC;CAAD,OAAnB,CAAP;CACD;CAHH;;CAKE,4BAAyB;CAAA,QAAb9xB,MAAa,uEAAJ,EAAI;;CAAA;;CACvB,SAAKA,MAAL,GAAcrG,OAAOiW,MAAP,CAAc;CAC1BkiB,gBAAU,KADgB;CAE1Bnf,WAAK;CAAA,eAAYmf,QAAZ;CAAA,OAFqB;CAI1B9d,YAJ0B,kBAInB+d,CAJmB,EAIhB;CACR,aAAKD,QAAL,CAAc9d,MAAd,CAAqB+d,EAAE/C,QAAF,EAArB;CACD;CANyB,KAAd,EAOXhvB,MAPW,CAAd;CASA,SAAK8xB,QAAL,GAAgB,KAAK9xB,MAAL,CAAY8xB,QAA5B;CACA,SAAK9d,MAAL,GAAc,KAAKhU,MAAL,CAAYgU,MAA1B;CACD;;CAjBH;CAAA;CAAA,4BAmBUhW,QAnBV,EAmBmB;CACfA,eAAQ8V,MAAR,CAAe,UAAf;;CACA9V,eAAQ0yB,OAAR,CAAgB,QAAhB,EAA0B;CAAA,eAAM,IAAIrB,iBAAJ,EAAN;CAAA,OAA1B;CACD;CAED;;;;;;;;CAxBF;CAAA;CAAA,gCA+BcyC,QA/Bd,EA+BwB;CACpB,WAAKA,QAAL,GAAgBA,QAAhB;CACA,aAAO,IAAP;CACD;CAED;;;;;;;;CApCF;CAAA;CAAA,8BA2CY9d,MA3CZ,EA2CoB;CAChB,WAAKA,MAAL,GAAcA,MAAd;CACA,aAAO,IAAP;CACD;CA9CH;CAAA;CAAA,8BAgDYhC,IAhDZ,EAgDkB;CACdA,WAAKggB,UAAL,GAAkB,IAAI/rB,IAAJ,CAAS+L,KAAKgC,MAAL,CAAYvY,IAAZ,CAAiBuW,IAAjB,CAAT,CAAlB;CACAA,WAAKggB,UAAL,CAAgB1rB,KAAhB,CAAsB,IAAtB;CACD;CAnDH;;CAAA;CAAA;;CCfA;;;;;;;;;;;;;;;;;;;;AAmBA,KAAa2rB,SAAb;CAAA;CAAA;CACE,uBAA+B;CAAA,QAAnBjyB,MAAmB,uEAAV,EAAU;CAAA,QAANZ,IAAM;;CAAA;;CAC7B,SAAKY,MAAL,GAAcrG,OAAOiW,MAAP,CAAc;CAC1BjJ,aAAO,QADmB;CAE1B6V,eAAS,KAFiB;CAG1BjY,YAAM,EAHoB;CAI1BC,WAAK;CAJqB,KAAd,EAKXxE,MALW,CAAd;CAMA,QAAI,CAACZ,IAAD,IAASA,SAAS,MAAtB,EAA8B,KAAK8yB,GAAL,GAAW,IAAIC,OAAJ,CAAY,KAAKnyB,MAAL,CAAY2G,KAAxB,EAA+B,KAAK3G,MAAL,CAAYwc,OAA3C,CAAX,CAA9B,KACK,IAAIpd,SAAS,QAAb,EAAuB,KAAK8yB,GAAL,GAAW,IAAIE,GAAJ,CAAQ,KAAKpyB,MAAL,CAAY2G,KAApB,EAA2B,KAAK3G,MAAL,CAAYuE,IAAvC,EAA6C,KAAKvE,MAAL,CAAYwE,GAAzD,CAAX;CAC7B;;CAVH;CAAA;CAAA,4BAYUxG,QAZV,EAYmB;CACfA,eAAQ4B,GAAR,CAAY,KAAZ,EAAmB,KAAKsyB,GAAxB;;CACAl0B,eAAQO,GAAR,CAAY,OAAZ,EAAqB2zB,GAArB,GAA2B,KAAKA,GAAhC;CACD;CAfH;;CAAA;CAAA;;CCtBA,IAAMG,iBAAiB,SAAjBA,cAAiB,CAACC,CAAD,EAAIC,CAAJ,EAAU;CAC/B,MAAID,MAAMC,CAAV,EAAa,OAAO,IAAP,CAAb,KACK,IAAID,KAAKA,EAAEE,MAAP,IAAiBF,EAAEE,MAAF,CAASD,CAAT,CAArB,EAAkC,OAAO,IAAP;CAEvC,SAAO,KAAP;CACD,CALD;CAOA;;;;;;;;;;;;;;;;;;AAgBA,KAAaE,WAAb;CAAA;CAAA;CAAA;CAAA;CAAA,mCACwBC,OADxB,EACiC;CAC7B,aAAO,YAAmC;CAAA,YAAlC1zB,KAAkC,uEAA1B,CAAC,EAAD,EAAK,EAAL,CAA0B;;CAAA;CAAA,YAAfpE,GAAe,QAAfA,GAAe;CAAA,YAAVsE,IAAU,QAAVA,IAAU;;CACxC,YAAIwzB,QAAQ1zB,MAAM,CAAN,EAASpE,GAAT,CAAR,EAAuBsE,IAAvB,CAAJ,EAAkC,OAAOF,KAAP;CAElCA,cAAM,CAAN,EAASpE,GAAT,IAAgBsE,IAAhB;CACAF,cAAM,CAAN,IAAWpE,GAAX;CAEA,eAAOoE,KAAP;CACD,OAPD;CAQD;CAVH;;CAYE,yBAAyC;CAAA,QAA7B2zB,UAA6B,uEAAhBN,cAAgB;;CAAA;;CACvC,SAAKvzB,KAAL,GAAaC,YACX0zB,YAAYG,cAAZ,CAA2BD,UAA3B,CADW,CAAb;CAIA,SAAKE,aAAL,GAAqB,EAArB;CACA,SAAKC,aAAL,GAAqB,SAArB;CACA,SAAKC,UAAL,GAAkB,SAAlB;CACD;CAED;;;;;;;;;;;;;CAtBF;CAAA;CAAA,6BAiCU7zB,IAjCV,EAiCgB;CACZ,WAAK8zB,MAAL,CAAY;CAACC,iBAAS/zB;CAAV,OAAZ;CACA,aAAO,IAAP;CACD;CAED;;;;;;;CAtCF;CAAA;CAAA,kCA4CgBrB,IA5ChB,EA4CsB;CAClB,WAAKiB,KAAL,CAAWo0B,cAAX,CACET,YAAYG,cAAZ,CAA2B/0B,IAA3B,CADF;CAGD;CAhDH;CAAA;CAAA,4BAkDUG,QAlDV,EAkDmB;CACfA,eAAQ8V,MAAR,CAAe,OAAf;CACD;CAED;;;;;;;;;;;;;;CAtDF;CAAA;CAAA,2BAmESqf,OAnET,EAmEkB;CACd,WAAK,IAAMv4B,GAAX,IAAkBu4B,OAAlB,EAA2B;CACzB,YAAIv4B,GAAJ,EAAS;CACP,eAAKi4B,aAAL,CAAmBj4B,GAAnB,IAA0BA,QAAQ,SAAR,GACtBu4B,QAAQv4B,GAAR,CADsB,GAEtBjB,OAAOiW,MAAP,CAAc,EAAd,EAAkB,KAAKijB,aAAL,CAAmBI,OAArC,EAA8CE,QAAQv4B,GAAR,CAA9C,CAFJ;CAGD;CACF;CACF;CAED;;;;;;;;;;;CA7EF;CAAA;CAAA,6BAuFuB;CAAA;;CAAA,UAAdw4B,OAAc,uEAAJ,EAAI;CACnB,WAAKt0B,KAAL,CAAWU,SAAX,CAAqB,YAAM;CAAA,mCACE,MAAKV,KAAL,CAAWO,QAAX,EADF;CAAA;CAAA,YAClBH,IADkB;CAAA,YACZO,UADY;;CAEzB,YAAMC,WAAW0zB,QAAQ3zB,UAAR,CAAjB;CAEA,YAAIC,QAAJ,EAAcA,SAASR,KAAKO,UAAL,CAAT;CACf,OALD;CAMD;CAED;;;;;;;;;CAhGF;CAAA;CAAA,uBAwGK4zB,UAxGL,EAwGiB;CACb,WAAKN,UAAL,GAAkB,KAAKD,aAAvB;CACA,WAAKA,aAAL,GAAqBO,UAArB;CAEA,UAAML,SAAS,KAAKH,aAAL,CAAmBQ,UAAnB,IACX,KAAKR,aAAL,CAAmBQ,UAAnB,CADW,GAEX,KAAKR,aAAL,CAAmBI,OAFvB;CAIA,WAAKrzB,GAAL,CAASozB,MAAT;CACD;CAED;;;;;;;;;;;CAnHF;CAAA;CAAA,wBA6HM9zB,IA7HN,EA6HY;CACR,WAAK,IAAMtE,GAAX,IAAkBsE,IAAlB;CACE,YAAItE,GAAJ,EAAS,KAAKkE,KAAL,CAAWK,QAAX,CAAoB;CAACC,gBAAM,KAAP;CAAcxE,kBAAd;CAAmBsE,gBAAMA,KAAKtE,GAAL;CAAzB,SAApB;CADX;CAED;CAED;;;;;;;;;CAlIF;CAAA;CAAA,wBA0IMA,GA1IN,EA0IW;CACP,aAAO,KAAKkE,KAAL,CAAWO,QAAX,GAAsB,CAAtB,EAAyBzE,GAAzB,CAAP;CACD;CAED;;;;;;;;;CA9IF;CAAA;CAAA,yBAsJOo4B,MAtJP,EAsJeM,OAtJf,EAsJwBC,QAtJxB,EAsJkC;CAC9B,aAAO,KAAKR,UAAL,KAAoBC,MAApB,GAA6BM,OAA7B,GAAuCC,QAA9C;CACD;CAED;;;;;;;;;CA1JF;CAAA;CAAA,4BAkKUP,MAlKV,EAkKkBM,OAlKlB,EAkK2BC,QAlK3B,EAkKqC;CACjC,aAAO,KAAKT,aAAL,KAAuBE,MAAvB,GAAgCM,OAAhC,GAA0CC,QAAjD;CACD;CApKH;;CAAA;CAAA;;CCbA;CACA;CACA;CACA;CACA;;AAEA,KAAaC,kBAAb;CAAA;CAAA;CACE,8BAAYh6B,MAAZ,EAAoBqa,UAApB,EAAgC4f,YAAhC,EAA8C;CAAA;;CAAA;;CAC5C;CAEA,UAAKj6B,MAAL,GAAcA,MAAd;CAEA,UAAKqa,UAAL,GAAmBA,eAAe/Z,SAAhB,GAA6B1G,QAA7B,GAAwCygB,UAA1D;CACA,UAAK4f,YAAL,GAAoBA,YAApB,CAN4C;;CAS5C,UAAK/tB,OAAL,GAAe,IAAf,CAT4C;;CAY5C,UAAKlE,MAAL,GAAc,IAAIoM,OAAJ,EAAd,CAZ4C;;CAe5C,UAAK8lB,WAAL,GAAmB,CAAnB;CACA,UAAKC,WAAL,GAAmBC,QAAnB,CAhB4C;;CAmB5C,UAAKC,OAAL,GAAe,CAAf;CACA,UAAKC,OAAL,GAAeF,QAAf,CApB4C;CAuB5C;;CACA,UAAKG,aAAL,GAAqB,CAArB,CAxB4C;;CAyB5C,UAAKC,aAAL,GAAqBrsB,KAAKC,EAA1B,CAzB4C;CA2B5C;CACA;;CACA,UAAKqsB,eAAL,GAAuB,CAACL,QAAxB,CA7B4C;;CA8B5C,UAAKM,eAAL,GAAuBN,QAAvB,CA9B4C;CAgC5C;CACA;;CACA,UAAKO,aAAL,GAAqB,KAArB;CACA,UAAKC,aAAL,GAAqB,IAArB,CAnC4C;CAsC5C;;CACA,UAAKC,UAAL,GAAkB,IAAlB;CACA,UAAKC,SAAL,GAAiB,GAAjB,CAxC4C;;CA2C5C,UAAKC,YAAL,GAAoB,IAApB;CACA,UAAKC,WAAL,GAAmB,GAAnB,CA5C4C;;CA+C5C,UAAKC,SAAL,GAAiB,IAAjB;CACA,UAAKC,WAAL,GAAmB,GAAnB,CAhD4C;CAkD5C;CACA;;CACA,UAAKC,UAAL,GAAkB,KAAlB;CACA,UAAKC,eAAL,GAAuB,GAAvB,CArD4C;CAuD5C;;CACA,UAAKC,UAAL,GAAkB,IAAlB,CAxD4C;;CA2D5C,UAAKjS,IAAL,GAAY;CAACkS,YAAM,EAAP;CAAWC,UAAI,EAAf;CAAmBC,aAAO,EAA1B;CAA8BC,cAAQ;CAAtC,KAAZ,CA3D4C;;CA8D5C,UAAKC,YAAL,GAAoB;CAACC,aAAOC,MAAMN,IAAd;CAAoBO,YAAMD,MAAME,MAAhC;CAAwCC,WAAKH,MAAMJ;CAAnD,KAApB,CA9D4C;;CAiE5C,UAAKQ,OAAL,GAAe,MAAKh0B,MAAL,CAAYZ,KAAZ,EAAf;CACA,UAAK60B,SAAL,GAAiB,MAAKj8B,MAAL,CAAYsJ,QAAZ,CAAqBlC,KAArB,EAAjB;CACA,UAAK80B,KAAL,GAAa,MAAKl8B,MAAL,CAAYm8B,IAAzB,CAnE4C;CAsE5C;CACA;;CAEA,UAAKC,aAAL,GAAqB,YAAM;CACzB,aAAOC,UAAUC,GAAjB;CACD,KAFD;;CAIA,UAAKC,iBAAL,GAAyB,YAAM;CAC7B,aAAOF,UAAUG,KAAjB;CACD,KAFD;;CAIA,UAAKC,KAAL,GAAa,YAAM;CACjB,YAAKz0B,MAAL,CAAYf,IAAZ,CAAiB,MAAK+0B,OAAtB;;CACA,YAAKh8B,MAAL,CAAYsJ,QAAZ,CAAqBrC,IAArB,CAA0B,MAAKg1B,SAA/B;;CACA,YAAKj8B,MAAL,CAAYm8B,IAAZ,GAAmB,MAAKD,KAAxB;;CAEA,YAAKl8B,MAAL,CAAYub,sBAAZ;;CACA,YAAKmhB,aAAL,CAAmBC,WAAnB;;CAEA,YAAKniB,MAAL;;CAEAhV,cAAQo3B,MAAMC,IAAd;CACD,KAXD,CAjF4C;;;CA+F5C,UAAKriB,MAAL,GAAc,YAAM;CAClB,UAAMsiB,SAAS,IAAI1oB,OAAJ,EAAf,CADkB;;CAIlB,UAAM2oB,OAAO,IAAIC,UAAJ,GAAiBC,kBAAjB,CAAoCj9B,OAAOk9B,EAA3C,EAA+C,IAAI9oB,OAAJ,CAAY,CAAZ,EAAe,CAAf,EAAkB,CAAlB,CAA/C,CAAb;CACA,UAAM+oB,cAAcJ,KAAK31B,KAAL,GAAasnB,OAAb,EAApB;CAEA,UAAM0O,eAAe,IAAIhpB,OAAJ,EAArB;CACA,UAAMipB,iBAAiB,IAAIL,UAAJ,EAAvB;CAEA,aAAQ,YAAM;CACZ,YAAM1zB,WAAW,MAAKtJ,MAAL,CAAYsJ,QAA7B;CAEAwzB,eAAO71B,IAAP,CAAYqC,QAAZ,EAAsB0oB,GAAtB,CAA0B,MAAKhqB,MAA/B,EAHY;;CAMZ80B,eAAOQ,eAAP,CAAuBP,IAAvB,EANY;;CASZV,kBAAUkB,cAAV,CAAyBT,MAAzB;CAEA,YAAI,MAAK3B,UAAL,IAAmB31B,UAAUo3B,MAAMC,IAAvC,EACEW,WAAWC,sBAAX;CAEFpB,kBAAUG,KAAV,IAAmBkB,eAAelB,KAAlC;CACAH,kBAAUC,GAAV,IAAiBoB,eAAepB,GAAhC,CAfY;;CAkBZD,kBAAUG,KAAV,GAAkBruB,KAAKpN,GAAL,CAAS,MAAK05B,eAAd,EAA+BtsB,KAAKxT,GAAL,CAAS,MAAK+/B,eAAd,EAA+B2B,UAAUG,KAAzC,CAA/B,CAAlB,CAlBY;;CAqBZH,kBAAUC,GAAV,GAAgBnuB,KAAKpN,GAAL,CAAS,MAAKw5B,aAAd,EAA6BpsB,KAAKxT,GAAL,CAAS,MAAK6/B,aAAd,EAA6B6B,UAAUC,GAAvC,CAA7B,CAAhB;CAEAD,kBAAUsB,QAAV;CAEAtB,kBAAUzxB,MAAV,IAAoBpB,KAApB,CAzBY;;CA4BZ6yB,kBAAUzxB,MAAV,GAAmBuD,KAAKpN,GAAL,CAAS,MAAKm5B,WAAd,EAA2B/rB,KAAKxT,GAAL,CAAS,MAAKw/B,WAAd,EAA2BkC,UAAUzxB,MAArC,CAA3B,CAAnB,CA5BY;;CA+BZ,cAAK5C,MAAL,CAAYR,GAAZ,CAAgBo2B,SAAhB;;CAEAd,eAAOe,gBAAP,CAAwBxB,SAAxB,EAjCY;;CAoCZS,eAAOQ,eAAP,CAAuBH,WAAvB;CAEA7zB,iBAASrC,IAAT,CAAc,MAAKe,MAAnB,EAA2BR,GAA3B,CAA+Bs1B,MAA/B;;CAEA,cAAK98B,MAAL,CAAY89B,MAAZ,CAAmB,MAAK91B,MAAxB;;CAEA,YAAI,MAAK2yB,aAAL,KAAuB,IAA3B,EAAiC;CAC/B+C,yBAAelB,KAAf,IAAyB,IAAI,MAAK5B,aAAlC;CACA8C,yBAAepB,GAAf,IAAuB,IAAI,MAAK1B,aAAhC;CACD,SAHD,MAIE8C,eAAet3B,GAAf,CAAmB,CAAnB,EAAsB,CAAtB,EAAyB,CAAzB;;CAEFoD,gBAAQ,CAAR;CACAo0B,kBAAUx3B,GAAV,CAAc,CAAd,EAAiB,CAAjB,EAAoB,CAApB,EAjDY;CAoDZ;CACA;;CAEA,YAAI23B,eACCX,aAAaY,iBAAb,CAA+B,MAAKh+B,MAAL,CAAYsJ,QAA3C,IAAuD20B,GADxD,IAEC,KAAK,IAAIZ,eAAea,GAAf,CAAmB,MAAKl+B,MAAL,CAAYkK,UAA/B,CAAT,IAAuD+zB,GAF5D,EAEiE;CAC/D,gBAAKvB,aAAL,CAAmBC,WAAnB;;CAEAS,uBAAan2B,IAAb,CAAkB,MAAKjH,MAAL,CAAYsJ,QAA9B;CACA+zB,yBAAep2B,IAAf,CAAoB,MAAKjH,MAAL,CAAYkK,UAAhC;CACA6zB,wBAAc,KAAd;CAEA,iBAAO,IAAP;CACD;;CAED,eAAO,KAAP;CACD,OApEM,EAAP;CAqED,KA/ED;;CAiFA,UAAKl5B,OAAL,GAAe,YAAM;CACnB,YAAKwV,UAAL,CAAgB8jB,mBAAhB,CAAoC,aAApC,EAAmDC,aAAnD,EAAkE,KAAlE;;CACA,YAAK/jB,UAAL,CAAgB8jB,mBAAhB,CAAoC,WAApC,EAAiDE,WAAjD,EAA8D,KAA9D;;CACA,YAAKhkB,UAAL,CAAgB8jB,mBAAhB,CAAoC,OAApC,EAA6CG,YAA7C,EAA2D,KAA3D;;CAEA,YAAKjkB,UAAL,CAAgB8jB,mBAAhB,CAAoC,YAApC,EAAkDI,YAAlD,EAAgE,KAAhE;;CACA,YAAKlkB,UAAL,CAAgB8jB,mBAAhB,CAAoC,UAApC,EAAgDK,UAAhD,EAA4D,KAA5D;;CACA,YAAKnkB,UAAL,CAAgB8jB,mBAAhB,CAAoC,WAApC,EAAiDM,WAAjD,EAA8D,KAA9D;;CAEA7kC,eAASukC,mBAAT,CAA6B,WAA7B,EAA0CO,WAA1C,EAAuD,KAAvD;CACA9kC,eAASukC,mBAAT,CAA6B,SAA7B,EAAwCQ,SAAxC,EAAmD,KAAnD;CAEAnzB,aAAO2yB,mBAAP,CAA2B,SAA3B,EAAsCS,SAAtC,EAAiD,KAAjD,EAZmB;CAepB,KAfD,CAhL4C;CAkM5C;CACA;;;CAEA,QAAMjC,cAAc;CAAC/2B,YAAM;CAAP,KAApB;CACA,QAAMi5B,aAAa;CAACj5B,YAAM;CAAP,KAAnB;CACA,QAAMk5B,WAAW;CAACl5B,YAAM;CAAP,KAAjB;CAEA,QAAMg3B,QAAQ;CAACC,YAAM,CAAC,CAAR;CAAWkC,cAAQ,CAAnB;CAAsBC,aAAO,CAA7B;CAAgCjD,WAAK,CAArC;CAAwCkD,oBAAc,CAAtD;CAAyDC,mBAAa,CAAtE;CAAyEC,iBAAW;CAApF,KAAd;CAEA,QAAI35B,QAAQo3B,MAAMC,IAAlB;CAEA,QAAMoB,MAAM,QAAZ,CA7M4C;;CAgN5C,QAAM5B,YAAY,IAAI+C,SAAJ,EAAlB;CACA,QAAM1B,iBAAiB,IAAI0B,SAAJ,EAAvB;CAEA,QAAI51B,QAAQ,CAAZ;CACA,QAAMo0B,YAAY,IAAIxpB,OAAJ,EAAlB;CACA,QAAI2pB,cAAc,KAAlB;CAEA,QAAMsB,cAAc,IAAIxmB,OAAJ,EAApB;CACA,QAAMymB,YAAY,IAAIzmB,OAAJ,EAAlB;CACA,QAAM0mB,cAAc,IAAI1mB,OAAJ,EAApB;CAEA,QAAM2mB,WAAW,IAAI3mB,OAAJ,EAAjB;CACA,QAAM4mB,SAAS,IAAI5mB,OAAJ,EAAf;CACA,QAAM6mB,WAAW,IAAI7mB,OAAJ,EAAjB;CAEA,QAAM8mB,aAAa,IAAI9mB,OAAJ,EAAnB;CACA,QAAM+mB,WAAW,IAAI/mB,OAAJ,EAAjB;CACA,QAAMgnB,aAAa,IAAIhnB,OAAJ,EAAnB;;CAEA,QAAM4kB,uBAAuB,SAAvBA,oBAAuB,GAAM;CACjC,aAAO,IAAItvB,KAAKC,EAAT,GAAc,EAAd,GAAmB,EAAnB,GAAwB,MAAKgtB,eAApC;CACD,KAFD;;CAIA,QAAM0E,eAAe,SAAfA,YAAe,GAAM;CACzB,aAAO3xB,KAAK4lB,GAAL,CAAS,IAAT,EAAe,MAAK+G,SAApB,CAAP;CACD,KAFD;;CAIA,QAAM0C,aAAa,SAAbA,UAAa,QAAS;CAC1BE,qBAAelB,KAAf,IAAwBvuB,KAAxB;CACD,KAFD;;CAIA,QAAM8xB,WAAW,SAAXA,QAAW,QAAS;CACxBrC,qBAAepB,GAAf,IAAsBruB,KAAtB;CACD,KAFD;;CAIA,QAAM+xB,UAAW,YAAM;CACrB,UAAM7rB,IAAI,IAAIC,OAAJ,EAAV;CAEA,aAAO,UAACvG,QAAD,EAAWoyB,YAAX,EAA4B;CACjC9rB,UAAE+rB,mBAAF,CAAsBD,YAAtB,EAAoC,CAApC,EADiC;;CAEjC9rB,UAAE8K,cAAF,CAAiB,CAACpR,QAAlB;CACA+vB,kBAAUp2B,GAAV,CAAc2M,CAAd;CACD,OAJD;CAKD,KARe,EAAhB;;CAUA,QAAMgsB,QAAS,YAAM;CACnB,UAAMhsB,IAAI,IAAIC,OAAJ,EAAV;CAEA,aAAO,UAACvG,QAAD,EAAWoyB,YAAX,EAA4B;CACjC9rB,UAAE+rB,mBAAF,CAAsBD,YAAtB,EAAoC,CAApC,EADiC;;CAEjC9rB,UAAE8K,cAAF,CAAiBpR,QAAjB;CACA+vB,kBAAUp2B,GAAV,CAAc2M,CAAd;CACD,OAJD;CAKD,KARa,EAAd,CA7P4C;;;CAwQ5C,QAAMisB,MAAO,YAAM;CACjB,UAAMtD,SAAS,IAAI1oB,OAAJ,EAAf;CAEA,aAAO,UAACisB,MAAD,EAASC,MAAT,EAAoB;CACzB,YAAMjoB,UAAU,MAAKgC,UAAL,KAAoBzgB,QAApB,GAA+B,MAAKygB,UAAL,CAAgBlC,IAA/C,GAAsD,MAAKkC,UAA3E;;CAEA,YAAI,MAAKra,MAAL,YAAuB8O,iBAA3B,EAA8C;CAC5C;CACA,cAAMxF,WAAW,MAAKtJ,MAAL,CAAYsJ,QAA7B;CACAwzB,iBAAO71B,IAAP,CAAYqC,QAAZ,EAAsB0oB,GAAtB,CAA0B,MAAKhqB,MAA/B;CACA,cAAIu4B,iBAAiBzD,OAAO97B,MAAP,EAArB,CAJ4C;;CAO5Cu/B,4BAAkBpyB,KAAKqyB,GAAL,CAAU,MAAKxgC,MAAL,CAAYiL,GAAZ,GAAkB,CAAnB,GAAwBkD,KAAKC,EAA7B,GAAkC,KAA3C,CAAlB,CAP4C;;CAU5C4xB,kBAAQ,IAAIK,MAAJ,GAAaE,cAAb,GAA8BloB,QAAQooB,YAA9C,EAA4D,MAAKzgC,MAAL,CAAY0gC,MAAxE;CACAP,gBAAM,IAAIG,MAAJ,GAAaC,cAAb,GAA8BloB,QAAQooB,YAA5C,EAA0D,MAAKzgC,MAAL,CAAY0gC,MAAtE;CACD,SAZD,MAYO,IAAI,MAAK1gC,MAAL,YAAuB0O,kBAA3B,EAA+C;CACpD;CACAsxB,kBAAQK,UAAU,MAAKrgC,MAAL,CAAYmL,KAAZ,GAAoB,MAAKnL,MAAL,CAAYkL,IAA1C,IAAkD,MAAKlL,MAAL,CAAYm8B,IAA9D,GAAqE9jB,QAAQsoB,WAArF,EAAkG,MAAK3gC,MAAL,CAAY0gC,MAA9G;CACAP,gBAAMG,UAAU,MAAKtgC,MAAL,CAAYoL,GAAZ,GAAkB,MAAKpL,MAAL,CAAYqL,MAAxC,IAAkD,MAAKrL,MAAL,CAAYm8B,IAA9D,GAAqE9jB,QAAQooB,YAAnF,EAAiG,MAAKzgC,MAAL,CAAY0gC,MAA7G;CACD,SAJM,MAIA;CACL;CACA39B,kBAAQoD,IAAR,CAAa,oFAAb;CACA,gBAAK80B,SAAL,GAAiB,KAAjB;CACD;CACF,OAxBD;CAyBD,KA5BW,EAAZ;;CA8BA,QAAM2F,UAAU,SAAVA,OAAU,aAAc;CAC5B,UAAI,MAAK5gC,MAAL,YAAuB8O,iBAA3B,EACEtF,SAASq3B,UAAT,CADF,KAGK,IAAI,MAAK7gC,MAAL,YAAuB0O,kBAA3B,EAA+C;CAClD,cAAK1O,MAAL,CAAYm8B,IAAZ,GAAmBhuB,KAAKpN,GAAL,CAAS,MAAKs5B,OAAd,EAAuBlsB,KAAKxT,GAAL,CAAS,MAAK2/B,OAAd,EAAuB,MAAKt6B,MAAL,CAAYm8B,IAAZ,GAAmB0E,UAA1C,CAAvB,CAAnB;;CACA,cAAK7gC,MAAL,CAAYub,sBAAZ;;CACAwiB,sBAAc,IAAd;CACD,OAJI,MAIE;CACLh7B,gBAAQoD,IAAR,CAAa,2FAAb;CACA,cAAK00B,UAAL,GAAkB,KAAlB;CACD;CACF,KAZD;;CAcA,QAAMiG,WAAW,SAAXA,QAAW,aAAc;CAC7B,UAAI,MAAK9gC,MAAL,YAAuB8O,iBAA3B,EACEtF,SAASq3B,UAAT,CADF,KAGK,IAAI,MAAK7gC,MAAL,YAAuB0O,kBAA3B,EAA+C;CAClD,cAAK1O,MAAL,CAAYm8B,IAAZ,GAAmBhuB,KAAKpN,GAAL,CAAS,MAAKs5B,OAAd,EAAuBlsB,KAAKxT,GAAL,CAAS,MAAK2/B,OAAd,EAAuB,MAAKt6B,MAAL,CAAYm8B,IAAZ,GAAmB0E,UAA1C,CAAvB,CAAnB;;CACA,cAAK7gC,MAAL,CAAYub,sBAAZ;;CACAwiB,sBAAc,IAAd;CACD,OAJI,MAIE;CACLh7B,gBAAQoD,IAAR,CAAa,2FAAb;CACA,cAAK00B,UAAL,GAAkB,KAAlB;CACD;CACF,KAZD,CApT4C;CAmU5C;CACA;;;CAEA,QAAMkG,wBAAwB,SAAxBA,qBAAwB,QAAS;CACrC;CAEA1B,kBAAYj5B,GAAZ,CAAgB6vB,MAAMU,OAAtB,EAA+BV,MAAMW,OAArC;CACD,KAJD;;CAMA,QAAMoK,uBAAuB,SAAvBA,oBAAuB,QAAS;CACpC;CAEArB,iBAAWv5B,GAAX,CAAe6vB,MAAMU,OAArB,EAA8BV,MAAMW,OAApC;CACD,KAJD;;CAMA,QAAMqK,qBAAqB,SAArBA,kBAAqB,QAAS;CAClC;CAEAzB,eAASp5B,GAAT,CAAa6vB,MAAMU,OAAnB,EAA4BV,MAAMW,OAAlC;CACD,KAJD;;CAMA,QAAMsK,wBAAwB,SAAxBA,qBAAwB,QAAS;CACrC;CAEA5B,gBAAUl5B,GAAV,CAAc6vB,MAAMU,OAApB,EAA6BV,MAAMW,OAAnC;CACA2I,kBAAY4B,UAAZ,CAAuB7B,SAAvB,EAAkCD,WAAlC;CAEA,UAAMhnB,UAAU,MAAKgC,UAAL,KAAoBzgB,QAApB,GAA+B,MAAKygB,UAAL,CAAgBlC,IAA/C,GAAsD,MAAKkC,UAA3E,CANqC;;CASrCmjB,iBAAW,IAAIrvB,KAAKC,EAAT,GAAcmxB,YAAY71B,CAA1B,GAA8B2O,QAAQsoB,WAAtC,GAAoD,MAAK3F,WAApE,EATqC;;CAYrC+E,eAAS,IAAI5xB,KAAKC,EAAT,GAAcmxB,YAAY51B,CAA1B,GAA8B0O,QAAQooB,YAAtC,GAAqD,MAAKzF,WAAnE;CAEAqE,kBAAYp4B,IAAZ,CAAiBq4B,SAAjB;;CAEA,YAAK9kB,MAAL;CACD,KAjBD;;CAmBA,QAAM4mB,uBAAuB,SAAvBA,oBAAuB,QAAS;CACpC;CAEAxB,eAASx5B,GAAT,CAAa6vB,MAAMU,OAAnB,EAA4BV,MAAMW,OAAlC;CAEAiJ,iBAAWsB,UAAX,CAAsBvB,QAAtB,EAAgCD,UAAhC;CAEA,UAAIE,WAAWl2B,CAAX,GAAe,CAAnB,EACEi3B,QAAQd,cAAR,EADF,KAGK,IAAID,WAAWl2B,CAAX,GAAe,CAAnB,EACHm3B,SAAShB,cAAT;CAEFH,iBAAW14B,IAAX,CAAgB24B,QAAhB;;CAEA,YAAKplB,MAAL;CACD,KAhBD;;CAkBA,QAAM6mB,qBAAqB,SAArBA,kBAAqB,QAAS;CAClC;CAEA5B,aAAOr5B,GAAP,CAAW6vB,MAAMU,OAAjB,EAA0BV,MAAMW,OAAhC;CAEA8I,eAASyB,UAAT,CAAoB1B,MAApB,EAA4BD,QAA5B;CAEAY,UAAIV,SAASh2B,CAAb,EAAgBg2B,SAAS/1B,CAAzB;CAEA61B,eAASv4B,IAAT,CAAcw4B,MAAd;;CAEA,YAAKjlB,MAAL;CACD,KAZD;;CAkBA,QAAM8mB,mBAAmB,SAAnBA,gBAAmB,QAAS;CAChC;CAEA,UAAIrL,MAAMqK,MAAN,GAAe,CAAnB,EACEQ,SAAShB,cAAT,EADF,KAGK,IAAI7J,MAAMqK,MAAN,GAAe,CAAnB,EACHM,QAAQd,cAAR;;CAEF,YAAKtlB,MAAL;CACD,KAVD;;CAYA,QAAM+mB,gBAAgB,SAAhBA,aAAgB,QAAS;CAC7B;CAEA,cAAQtL,MAAMuL,OAAd;CACE,aAAK,MAAKpY,IAAL,CAAUmS,EAAf;CACE6E,cAAI,CAAJ,EAAO,MAAKlF,WAAZ;;CACA,gBAAK1gB,MAAL;;CACA;;CAEF,aAAK,MAAK4O,IAAL,CAAUqS,MAAf;CACE2E,cAAI,CAAJ,EAAO,CAAC,MAAKlF,WAAb;;CACA,gBAAK1gB,MAAL;;CACA;;CAEF,aAAK,MAAK4O,IAAL,CAAUkS,IAAf;CACE8E,cAAI,MAAKlF,WAAT,EAAsB,CAAtB;;CACA,gBAAK1gB,MAAL;;CACA;;CAEF,aAAK,MAAK4O,IAAL,CAAUoS,KAAf;CACE4E,cAAI,CAAC,MAAKlF,WAAV,EAAuB,CAAvB;;CACA,gBAAK1gB,MAAL;;CACA;CAnBJ;CAsBD,KAzBD;;CA2BA,QAAMinB,yBAAyB,SAAzBA,sBAAyB,QAAS;CACtC;CAEApC,kBAAYj5B,GAAZ,CAAgB6vB,MAAMyL,OAAN,CAAc,CAAd,EAAiBC,KAAjC,EAAwC1L,MAAMyL,OAAN,CAAc,CAAd,EAAiBE,KAAzD;CACD,KAJD;;CAMA,QAAMC,wBAAwB,SAAxBA,qBAAwB,QAAS;CACrC;CAEA,UAAMxc,KAAK4Q,MAAMyL,OAAN,CAAc,CAAd,EAAiBC,KAAjB,GAAyB1L,MAAMyL,OAAN,CAAc,CAAd,EAAiBC,KAArD;CACA,UAAMrc,KAAK2Q,MAAMyL,OAAN,CAAc,CAAd,EAAiBE,KAAjB,GAAyB3L,MAAMyL,OAAN,CAAc,CAAd,EAAiBE,KAArD;CAEA,UAAM/zB,WAAWM,KAAK2zB,IAAL,CAAUzc,KAAKA,EAAL,GAAUC,KAAKA,EAAzB,CAAjB;CAEAqa,iBAAWv5B,GAAX,CAAe,CAAf,EAAkByH,QAAlB;CACD,KATD;;CAWA,QAAMk0B,sBAAsB,SAAtBA,mBAAsB,QAAS;CACnC;CAEAvC,eAASp5B,GAAT,CAAa6vB,MAAMyL,OAAN,CAAc,CAAd,EAAiBC,KAA9B,EAAqC1L,MAAMyL,OAAN,CAAc,CAAd,EAAiBE,KAAtD;CACD,KAJD;;CAMA,QAAMI,wBAAwB,SAAxBA,qBAAwB,QAAS;CACrC;CAEA1C,gBAAUl5B,GAAV,CAAc6vB,MAAMyL,OAAN,CAAc,CAAd,EAAiBC,KAA/B,EAAsC1L,MAAMyL,OAAN,CAAc,CAAd,EAAiBE,KAAvD;CACArC,kBAAY4B,UAAZ,CAAuB7B,SAAvB,EAAkCD,WAAlC;CAEA,UAAMhnB,UAAU,MAAKgC,UAAL,KAAoBzgB,QAApB,GAA+B,MAAKygB,UAAL,CAAgBlC,IAA/C,GAAsD,MAAKkC,UAA3E,CANqC;;CASrCmjB,iBAAW,IAAIrvB,KAAKC,EAAT,GAAcmxB,YAAY71B,CAA1B,GAA8B2O,QAAQsoB,WAAtC,GAAoD,MAAK3F,WAApE,EATqC;;CAYrC+E,eAAS,IAAI5xB,KAAKC,EAAT,GAAcmxB,YAAY51B,CAA1B,GAA8B0O,QAAQooB,YAAtC,GAAqD,MAAKzF,WAAnE;CAEAqE,kBAAYp4B,IAAZ,CAAiBq4B,SAAjB;;CAEA,YAAK9kB,MAAL;CACD,KAjBD;;CAmBA,QAAMynB,uBAAuB,SAAvBA,oBAAuB,QAAS;CACpC;CAEA,UAAM5c,KAAK4Q,MAAMyL,OAAN,CAAc,CAAd,EAAiBC,KAAjB,GAAyB1L,MAAMyL,OAAN,CAAc,CAAd,EAAiBC,KAArD;CACA,UAAMrc,KAAK2Q,MAAMyL,OAAN,CAAc,CAAd,EAAiBE,KAAjB,GAAyB3L,MAAMyL,OAAN,CAAc,CAAd,EAAiBE,KAArD;CAEA,UAAM/zB,WAAWM,KAAK2zB,IAAL,CAAUzc,KAAKA,EAAL,GAAUC,KAAKA,EAAzB,CAAjB;CAEAsa,eAASx5B,GAAT,CAAa,CAAb,EAAgByH,QAAhB;CAEAgyB,iBAAWsB,UAAX,CAAsBvB,QAAtB,EAAgCD,UAAhC;CAEA,UAAIE,WAAWl2B,CAAX,GAAe,CAAnB,EACEm3B,SAAShB,cAAT,EADF,KAGK,IAAID,WAAWl2B,CAAX,GAAe,CAAnB,EACHi3B,QAAQd,cAAR;CAEFH,iBAAW14B,IAAX,CAAgB24B,QAAhB;;CAEA,YAAKplB,MAAL;CACD,KArBD;;CAuBA,QAAM0nB,qBAAqB,SAArBA,kBAAqB,QAAS;CAClC;CAEAzC,aAAOr5B,GAAP,CAAW6vB,MAAMyL,OAAN,CAAc,CAAd,EAAiBC,KAA5B,EAAmC1L,MAAMyL,OAAN,CAAc,CAAd,EAAiBE,KAApD;CAEAlC,eAASyB,UAAT,CAAoB1B,MAApB,EAA4BD,QAA5B;CAEAY,UAAIV,SAASh2B,CAAb,EAAgBg2B,SAAS/1B,CAAzB;CAEA61B,eAASv4B,IAAT,CAAcw4B,MAAd;;CAEA,YAAKjlB,MAAL;CACD,KAZD;CAmBA;CACA;;;CAEA,QAAM6jB,cAAc,SAAdA,WAAc,QAAS;CAC3B,UAAI,MAAKnyB,OAAL,KAAiB,KAArB,EAA4B;CAE5B+pB,YAAMkM,cAAN;;CAEA,UAAIlM,MAAMmM,MAAN,KAAiB,MAAK1G,YAAL,CAAkBC,KAAvC,EAA8C;CAC5C,YAAI,MAAKZ,YAAL,KAAsB,KAA1B,EAAiC;CAEjCgG,8BAAsB9K,KAAtB;CAEAzwB,gBAAQo3B,MAAMmC,MAAd;CACD,OAND,MAMO,IAAI9I,MAAMmM,MAAN,KAAiB,MAAK1G,YAAL,CAAkBG,IAAvC,EAA6C;CAClD,YAAI,MAAKhB,UAAL,KAAoB,KAAxB,EAA+B;CAE/BmG,6BAAqB/K,KAArB;CAEAzwB,gBAAQo3B,MAAMoC,KAAd;CACD,OANM,MAMA,IAAI/I,MAAMmM,MAAN,KAAiB,MAAK1G,YAAL,CAAkBK,GAAvC,EAA4C;CACjD,YAAI,MAAKd,SAAL,KAAmB,KAAvB,EAA8B;CAE9BgG,2BAAmBhL,KAAnB;CAEAzwB,gBAAQo3B,MAAMb,GAAd;CACD;;CAED,UAAIv2B,UAAUo3B,MAAMC,IAApB,EAA0B;CACxB,cAAK5C,YAAL,CAAkB9C,EAAlB,CAAqB,WAArB,EAAkCuH,WAAlC,EAA+C,KAA/C;;CACA,cAAKzE,YAAL,CAAkB9C,EAAlB,CAAqB,SAArB,EAAgCwH,SAAhC,EAA2C,KAA3C;;CAEA,cAAKjC,aAAL,CAAmBmC,UAAnB;CACD;CACF,KA/BD;;CAiCA,QAAMH,cAAc,SAAdA,WAAc,QAAS;CAC3B,UAAI,MAAKxyB,OAAL,KAAiB,KAArB,EAA4B;CAE5B+pB,YAAMkM,cAAN;;CAEA,UAAI38B,UAAUo3B,MAAMmC,MAApB,EAA4B;CAC1B,YAAI,MAAKhE,YAAL,KAAsB,KAA1B,EAAiC;CAEjCmG,8BAAsBjL,KAAtB;CACD,OAJD,MAIO,IAAIzwB,UAAUo3B,MAAMoC,KAApB,EAA2B;CAChC,YAAI,MAAKnE,UAAL,KAAoB,KAAxB,EAA+B;CAE/BuG,6BAAqBnL,KAArB;CACD,OAJM,MAIA,IAAIzwB,UAAUo3B,MAAMb,GAApB,EAAyB;CAC9B,YAAI,MAAKd,SAAL,KAAmB,KAAvB,EAA8B;CAE9BoG,2BAAmBpL,KAAnB;CACD;CACF,KAlBD;;CAoBA,QAAM0I,YAAY,SAAZA,SAAY,QAAS;CACzB,UAAI,MAAKzyB,OAAL,KAAiB,KAArB,EAA4B;AAE5Bm2B,CAEAzoC,eAASukC,mBAAT,CAA6B,WAA7B,EAA0CO,WAA1C,EAAuD,KAAvD;CACA9kC,eAASukC,mBAAT,CAA6B,SAA7B,EAAwCQ,SAAxC,EAAmD,KAAnD;;CAEA,YAAKjC,aAAL,CAAmBoC,QAAnB;;CAEAt5B,cAAQo3B,MAAMC,IAAd;CACD,KAXD;;CAaA,QAAMyB,eAAe,SAAfA,YAAe,QAAS;CAC5B,UAAI,MAAKpyB,OAAL,KAAiB,KAAjB,IAA0B,MAAK2uB,UAAL,KAAoB,KAA9C,IAAwDr1B,UAAUo3B,MAAMC,IAAhB,IAAwBr3B,UAAUo3B,MAAMmC,MAApG,EAA6G;CAE7G9I,YAAMkM,cAAN;CACAlM,YAAMqM,eAAN;CAEAhB,uBAAiBrL,KAAjB;;CAEA,YAAKyG,aAAL,CAAmBmC,UAAnB,EAR4B;;;CAS5B,YAAKnC,aAAL,CAAmBoC,QAAnB;CACD,KAVD;;CAYA,QAAMF,YAAY,SAAZA,SAAY,QAAS;CACzB,UAAI,MAAK1yB,OAAL,KAAiB,KAAjB,IAA0B,MAAKmvB,UAAL,KAAoB,KAA9C,IAAuD,MAAKJ,SAAL,KAAmB,KAA9E,EAAqF;CAErFsG,oBAActL,KAAd;CACD,KAJD;;CAMA,QAAMsI,eAAe,SAAfA,YAAe,QAAS;CAC5B,UAAI,MAAKryB,OAAL,KAAiB,KAArB,EAA4B;;CAE5B,cAAQ+pB,MAAMyL,OAAN,CAAc1gC,MAAtB;CACE,aAAK,CAAL;CAAQ;CAEN,cAAI,MAAK+5B,YAAL,KAAsB,KAA1B,EAAiC;CAEjC0G,iCAAuBxL,KAAvB;CAEAzwB,kBAAQo3B,MAAMqC,YAAd;CAEA;;CAEF,aAAK,CAAL;CAAQ;CAEN,cAAI,MAAKpE,UAAL,KAAoB,KAAxB,EAA+B;CAE/BgH,gCAAsB5L,KAAtB;CAEAzwB,kBAAQo3B,MAAMsC,WAAd;CAEA;;CAEF,aAAK,CAAL;CAAQ;CAEN,cAAI,MAAKjE,SAAL,KAAmB,KAAvB,EAA8B;CAE9B8G,8BAAoB9L,KAApB;CAEAzwB,kBAAQo3B,MAAMuC,SAAd;CAEA;;CAEF;CAEE35B,kBAAQo3B,MAAMC,IAAd;CAjCJ;;CAqCA,UAAIr3B,UAAUo3B,MAAMC,IAApB,EACE,MAAKH,aAAL,CAAmBmC,UAAnB;CACH,KA1CD;;CA4CA,QAAMJ,cAAc,SAAdA,WAAc,QAAS;CAC3B,UAAI,MAAKvyB,OAAL,KAAiB,KAArB,EAA4B;CAE5B+pB,YAAMkM,cAAN;CACAlM,YAAMqM,eAAN;;CAEA,cAAQrM,MAAMyL,OAAN,CAAc1gC,MAAtB;CACE,aAAK,CAAL;CAAQ;CAEN,cAAI,MAAK+5B,YAAL,KAAsB,KAA1B,EAAiC;CACjC,cAAIv1B,UAAUo3B,MAAMqC,YAApB,EAAkC,OAHpC;;CAKE+C,gCAAsB/L,KAAtB;CAEA;;CAEF,aAAK,CAAL;CAAQ;CAEN,cAAI,MAAK4E,UAAL,KAAoB,KAAxB,EAA+B;CAC/B,cAAIr1B,UAAUo3B,MAAMsC,WAApB,EAAiC,OAHnC;;CAKE+C,+BAAqBhM,KAArB;CAEA;;CAEF,aAAK,CAAL;CAAQ;CAEN,cAAI,MAAKgF,SAAL,KAAmB,KAAvB,EAA8B;CAC9B,cAAIz1B,UAAUo3B,MAAMuC,SAApB,EAA+B,OAHjC;;CAKE+C,6BAAmBjM,KAAnB;CAEA;;CAEF;CAEEzwB,kBAAQo3B,MAAMC,IAAd;CA9BJ;CAiCD,KAvCD;;CAyCA,QAAM2B,aAAa,SAAbA,UAAa,QAAS;CAC1B,UAAI,MAAKtyB,OAAL,KAAiB,KAArB,EAA4B;AAE5Bq2B;CAEA,YAAK7F,aAAL,CAAmBoC,QAAnB;;CAEAt5B,cAAQo3B,MAAMC,IAAd;CACD,KARD;;CAUA,QAAMuB,gBAAgB,SAAhBA,aAAgB,QAAS;CAC7BnI,YAAMkM,cAAN;CACD,KAFD,CAhsB4C;;;CAssB5C,UAAKlI,YAAL,CAAkB9C,EAAlB,CAAqB,aAArB,EAAoCiH,aAApC,EAAmD,KAAnD;;CAEA,UAAKnE,YAAL,CAAkB9C,EAAlB,CAAqB,WAArB,EAAkCkH,WAAlC,EAA+C,KAA/C;;CACA,UAAKpE,YAAL,CAAkB9C,EAAlB,CAAqB,OAArB,EAA8BmH,YAA9B,EAA4C,KAA5C;;CAEA,UAAKrE,YAAL,CAAkB9C,EAAlB,CAAqB,YAArB,EAAmCoH,YAAnC,EAAiD,KAAjD;;CACA,UAAKtE,YAAL,CAAkB9C,EAAlB,CAAqB,UAArB,EAAiCqH,UAAjC,EAA6C,KAA7C;;CACA,UAAKvE,YAAL,CAAkB9C,EAAlB,CAAqB,WAArB,EAAkCsH,WAAlC,EAA+C,KAA/C;;CAEA,UAAKxE,YAAL,CAAkB9C,EAAlB,CAAqB,SAArB,EAAgCyH,SAAhC,EAA2C,KAA3C,EA/sB4C;;;CAmtB5C,UAAKpkB,MAAL;;CAntB4C;CAotB7C;;CArtBH;CAAA;CAAA,wBAutBe;CACXzX,cAAQoD,IAAR,CAAa,oDAAb;CACA,aAAO,KAAK6B,MAAZ;CACD;CA1tBH;CAAA;CAAA,wBA4tBe;CACXjF,cAAQoD,IAAR,CAAa,sEAAb;CACA,aAAO,CAAC,KAAK00B,UAAb;CACD,KA/tBH;CAAA,sBAiuBanyB,KAjuBb,EAiuBoB;CAChB3F,cAAQoD,IAAR,CAAa,sEAAb;CACA,WAAK00B,UAAL,GAAkB,CAACnyB,KAAnB;CACD;CApuBH;CAAA;CAAA,wBAsuBiB;CACb3F,cAAQoD,IAAR,CAAa,0EAAb;CACA,aAAO,CAAC,KAAK40B,YAAb;CACD,KAzuBH;CAAA,sBA2uBeryB,KA3uBf,EA2uBsB;CAClB3F,cAAQoD,IAAR,CAAa,0EAAb;CACA,WAAK40B,YAAL,GAAoB,CAACryB,KAArB;CACD;CA9uBH;CAAA;CAAA,wBAgvBc;CACV3F,cAAQoD,IAAR,CAAa,oEAAb;CACA,aAAO,CAAC,KAAK80B,SAAb;CACD,KAnvBH;CAAA,sBAqvBYvyB,KArvBZ,EAqvBmB;CACf3F,cAAQoD,IAAR,CAAa,oEAAb;CACA,WAAK80B,SAAL,GAAiB,CAACvyB,KAAlB;CACD;CAxvBH;CAAA;CAAA,wBA0vBe;CACX3F,cAAQoD,IAAR,CAAa,sEAAb;CACA,aAAO,CAAC,KAAKk1B,UAAb;CACD,KA7vBH;CAAA,sBA+vBa3yB,KA/vBb,EA+vBoB;CAChB3F,cAAQoD,IAAR,CAAa,sEAAb;CACA,WAAKk1B,UAAL,GAAkB,CAAC3yB,KAAnB;CACD;CAlwBH;CAAA;CAAA,wBAowBqB;CACjB3F,cAAQoD,IAAR,CAAa,+EAAb;CACA,aAAO,CAAC,KAAKw0B,aAAb;CACD,KAvwBH;CAAA,sBAywBmBjyB,KAzwBnB,EAywB0B;CACtB3F,cAAQoD,IAAR,CAAa,+EAAb;CACA,WAAKw0B,aAAL,GAAqB,CAACjyB,KAAtB;CACD;CA5wBH;CAAA;CAAA,wBA8wB6B;CACzB3F,cAAQoD,IAAR,CAAa,oFAAb;CACA,aAAO,KAAKy0B,aAAZ;CACD,KAjxBH;CAAA,sBAmxB2BlyB,KAnxB3B,EAmxBkC;CAC9B3F,cAAQoD,IAAR,CAAa,oFAAb;CACA,WAAKy0B,aAAL,GAAqBlyB,KAArB;CACD;CAtxBH;;CAAA;;CAAA;CAAA,EAAwC85B,eAAxC;;CCbA;;;;;;;;;;;;;;;;;;;;;AAoBA,KAAaC,mBAAb;CAAA;CAAA;CACE,iCAAyB;CAAA;;CAAA,QAAbj8B,MAAa,uEAAJ,EAAI;;CAAA;;CACvB,6FAAMA,MAAN;CAEA,UAAKA,MAAL,GAAcrG,OAAOiW,MAAP,CAAc;CAC1BssB,cAAQ,KADkB;CAE1B1iC,cAAQ,IAFkB;CAG1BgI,cAAQ,IAAIoM,OAAJ;CAHkB,KAAd,EAIX5N,MAJW,CAAd;CAHuB;CAQxB;;CATH;CAAA;CAAA,4BAWUhC,QAXV,EAWmB;CACf,yFAAcA,QAAd;;CADe,yBAGuB,KAAKgC,MAH5B;CAAA,UAGAsR,GAHA,gBAGR9X,MAHQ;CAAA,UAGK0iC,MAHL,gBAGKA,MAHL;CAAA,UAGa16B,MAHb,gBAGaA,MAHb;CAIf,UAAMhI,SAAS8X,MAAMA,IAAI3Q,MAAV,GAAmB3C,SAAQO,GAAR,CAAY,QAAZ,EAAsBoC,MAAxD;CAEA,UAAMmxB,WAAW,IAAI0B,kBAAJ,CACfh6B,MADe,EAEfwE,SAAQO,GAAR,CAAY,SAAZ,CAFe,EAGfP,SAAQY,OAHO,CAAjB;CAMA,UAAMu9B,kBAAkBD,SAAS,aAAK;CACpCpK,iBAAS9d,MAAT,CAAgB+d,EAAE/C,QAAF,EAAhB;CACA8C,iBAAStwB,MAAT,CAAgBf,IAAhB,CAAqBe,MAArB;CACD,OAHuB,GAGpB,aAAK;CACPswB,iBAAS9d,MAAT,CAAgB+d,EAAE/C,QAAF,EAAhB;CACD,OALD;CAOA,WAAKoN,WAAL,CAAiBtK,QAAjB;CACA,WAAKuK,SAAL,CAAeF,eAAf;;CAEAn+B,eAAQgW,MAAR,CAAe;CACb1P,gBAAQ,yBAAU;CAChB,cAAIgN,GAAJ,EAAS;CACTwgB,mBAASt4B,MAAT,GAAkB8K,QAAO3D,MAAzB;CACD,SAJY;CAKbkR,iBAAS,2BAAW;CAClBigB,mBAASje,UAAT,GAAsBhC,QAAtB;CACD;CAPY,OAAf;;CAUAigB,eAAStwB,MAAT,CAAgBf,IAAhB,CAAqBe,MAArB;CACD;CA5CH;;CAAA;;CAAA;CAAA,EAAyCqwB,cAAzC;;CCzBA;;CCAA;;CCAA;;;;;;;AAOA,KAAayK,qBAAb;CAAA;CAAA;CACE,mCAAyB;CAAA,QAAbt8B,MAAa,uEAAJ,EAAI;;CAAA;;CACvB,SAAKA,MAAL,GAAcrG,OAAOiW,MAAP,CAAc;CAC1BtO,kBAAY;CADc,KAAd,EAEXtB,MAFW,CAAd;CAGD;;CALH;CAAA;CAAA,8BAOYgS,IAPZ,EAOkB;CAAA;;CACd,UAAMhS,SAASgS,KAAKhS,MAApB;;CAEA,WAAKu8B,EAAL,GAAU,YAAuB;CAAA,YAAbv8B,MAAa,uEAAJ,EAAI;;CAC/B,YAAI,KAAK0I,aAAT,EAAwB;CACtB,eAAK/H,MAAL,CAAY4B,QAAZ,GAAuB,KAAKmG,aAAL,CACrB,KAAK8zB,YAAL,CAAkB;CAACj6B,sBAAUvC;CAAX,WAAlB,CADqB,CAAvB;CAGD;CACF,OAND;;CAQA,UAAIA,OAAOsB,UAAX,EAAuB;CAAA,mCACV1G,GADU;CAEnB,cAAIA,GAAJ,EAAS;CACPjB,mBAAOZ,cAAP,CAAsB,KAAtB,cAAiC6B,GAAjC,GAAwC;CACtC2D,iBADsC,iBAChC;CACJ,uBAAO,KAAKoC,MAAL,CAAY4B,QAAZ,CAAqBk6B,UAArB,CAAgC7hC,GAAhC,CAAP;CACD,eAHqC;CAItCgF,iBAJsC,eAIlCsC,KAJkC,EAI3B;CACT,qBAAKvB,MAAL,CAAY4B,QAAZ,GAAuB,KAAKmG,aAAL,CAAmB,KAAK8zB,YAAL,CAAkB;CAACj6B,iDAAY3H,GAAZ,EAAkBsH,KAAlB;CAAD,iBAAlB,CAAnB,CAAvB;CACD,eANqC;CAOtCF,4BAAc,IAPwB;CAQtCC,0BAAY;CAR0B,aAAxC;CAUD;CAbkB;;CACrB,aAAK,IAAMrH,GAAX,IAAkB,KAAKoF,MAAL,CAAYuC,QAA9B,EAAwC;CAAA,gBAA7B3H,GAA6B;CAavC;CACF;CACF;CAlCH;;CAAA;CAAA;;CCEA,IAAMyR,SAAS,IAAIqwB,aAAJ,EAAf;CAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,KAAaC,aAAb;CAAA;CAAA;CAAA;CAAA;CAAA,yBACcnwB,GADd,EACmB;CACf,aAAO,IAAImwB,aAAJ,CAAkB;CAACnwB;CAAD,OAAlB,EAAyBowB,QAAzB,CAAkC,CAAlC,EAAqC,CAArC,CAAP;CACD;CAHH;;CAOE,2BAAyB;CAAA;;CAAA;;CAAA,wDAFd,EAEc,aA8BhB;CACPp6B,cADO,oBACEA,SADF,EACYwP,IADZ,EACkB;CACvBA,aAAK4qB,QAAL,CAAc1wB,OAAd,CAAsB,mBAAW;CAC/B1J,oBAASgc,QAAQ,CAAR,CAAT,IAAuBA,QAAQ,CAAR,CAAvB;CACD,SAFD;CAIAhc,kBAASgV,WAAT,GAAuB,IAAvB;CACA,eAAOhV,SAAP;CACD;CARM,KA9BgB;;CAAA,sCAAVo6B,QAAU;CAAVA,cAAU;CAAA;;CACvBA,aAAS1wB,OAAT,CAAiB,gBAQX;CAAA,UAPJM,GAOI,QAPJA,GAOI;CAAA,2BANJpN,IAMI;CAAA,UANJA,IAMI,0BANG,KAMH;CAAA,6BALJk3B,MAKI;CAAA,UALJA,MAKI,4BALK,IAAIjkB,OAAJ,CAAY,CAAZ,EAAe,CAAf,CAKL;CAAA,6BAJJwqB,MAII;CAAA,UAJJA,MAII,4BAJK,IAAIxqB,OAAJ,CAAY,CAAZ,EAAe,CAAf,CAIL;CAAA,2BAHJ1P,IAGI;CAAA,UAHJA,IAGI,0BAHGm6B,cAGH;CAAA,8BAFJC,OAEI;CAAA,UAFJA,OAEI,6BAFMC,SAEN;CAAA,0BADJrqB,GACI;CAAA,UADJA,GACI,yBADE;CAAA,eAAOsqB,GAAP;CAAA,OACF;CACJ,UAAMze,UAAUnS,OAAOE,IAAP,CAAYC,GAAZ,CAAhB;;CAEA,UAAI7J,KAAKnI,MAAL,GAAc,CAAlB,EAAqB;CACnBgkB,gBAAQ0e,KAAR,GAAgBv6B,KAAK,CAAL,CAAhB;CACA6b,gBAAQ2e,KAAR,GAAgBx6B,KAAK,CAAL,CAAhB;CACD,OAHD,MAIE6b,QAAQ0e,KAAR,GAAgB1e,QAAQ2e,KAAR,GAAgBx6B,IAAhC;;CAEF6b,cAAQue,OAAR,GAAkBA,OAAlB;CAEAve,cAAQ8X,MAAR,CAAe71B,IAAf,CAAoB61B,MAApB;CACA9X,cAAQqe,MAAR,CAAep8B,IAAf,CAAoBo8B,MAApB;CAEAre,cAAQ0E,SAAR,GAAoBmJ,aAApB;CACA7N,cAAQwE,SAAR,GAAoB+J,wBAApB;;CAEA,YAAK6P,QAAL,CAAc7+B,IAAd,CAAmB,CAACqB,IAAD,EAAOuT,IAAI6L,OAAJ,CAAP,CAAnB;CACD,KA1BD;CA2BD;;CAnCH;CAAA;;CChCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,KAAa4e,eAAb;CAAA;CAAA;CACE,2BAAYzpB,GAAZ,EAAiB0pB,UAAjB,EAA0C;CAAA,QAAbr9B,MAAa,uEAAJ,EAAI;;CAAA;;CAAA,qCA6CjC;CACPoB,UADO,gBACFA,KADE,EACI4Q,IADJ,EACU;CACf5Q,cAAKmB,QAAL,CAAc+6B,QAAd,GAAyBl8B,MAAKk8B,QAA9B;CAEAtrB,aAAKurB,KAAL,GAAa,IAAIC,cAAJ,CAAmBp8B,MAAKmB,QAAxB,CAAb;CACAyP,aAAKyrB,KAAL,GAAar8B,MAAKmB,QAAL,CAAcm7B,UAA3B;CAEA,eAAOt8B,KAAP;CACD;CARM,KA7CiC;;CACxC,SAAKpB,MAAL,GAAcrG,OAAOiW,MAAP,CAAc;CAC1Bwb,aAAO;CADmB,KAAd,EAEXprB,MAFW,CAAd;CAGA,SAAK8F,KAAL,GAAa,IAAIK,KAAJ,EAAb;CAEA,SAAKwN,GAAL,GAAWA,GAAX;CACA,SAAK0pB,UAAL,GAAkBA,UAAlB;CACD;CAED;;;;;;;;;;CAXF;CAAA;CAAA,yBAmBOM,QAnBP,EAmBiB;CACb,UAAMC,OAAOC,cAAcC,UAAd,CAAyB,KAAKL,KAA9B,EAAqCE,QAArC,CAAb;CACA,aAAO,KAAKJ,KAAL,CAAWQ,UAAX,CAAsBH,IAAtB,EAA4BI,IAA5B,EAAP;CACD;CAED;;;;;;;CAxBF;CAAA;CAAA,6BA8BW;CACP,UAAI,KAAKT,KAAT,EAAgB,KAAKA,KAAL,CAAWvpB,MAAX,CAAkB,KAAKlO,KAAL,CAAWkpB,QAAX,KAAwB,KAAKhvB,MAAL,CAAYorB,KAAtD;CACjB;CAhCH;CAAA;CAAA,8BAkCYpZ,IAlCZ,EAkCkB;CACdA,WAAKjM,IAAL,GAAY,IAAIE,IAAJ,CAAS,YAAM;CACzB+L,aAAKgC,MAAL;CACD,OAFW,CAAZ;CAIA,UAAI,CAAChC,KAAKqrB,UAAV,EAAsBrrB,KAAKjM,IAAL,CAAUO,KAAV,CAAgB0L,KAAK2B,GAArB;CACvB;CAxCH;CAAA;CAAA,4BA0CU3V,QA1CV,EA0CmB;CACfA,eAAQ8V,MAAR,CAAe,WAAf;CACD;CA5CH;;CAAA;CAAA;;CCxCA;;CCAA;;;;;;;;;;;;AAYA,KAAamqB,YAAb;CAAA;CAAA;CACE,wBAAYxhC,IAAZ,EAAkByC,IAAlB,EAAwB;CAAA;;CACtB,SAAKzC,IAAL,GAAYA,IAAZ;CACA,SAAKyC,IAAL,GAAYA,IAAZ;CACD;;CAJH;CAAA;CAAA,4BAMUlB,QANV,EAMmB;CACfA,eAAQ4B,GAAR,CAAY,KAAKnD,IAAjB,EAAuB,KAAKyC,IAA5B;CACD;CARH;;CAAA;CAAA;;CCZA;;KCGag/B,KAAb;CAAA;CAAA;CACE,iBAAYl+B,MAAZ,EAAmC;CAAA;;CAAA;;CACjCzD,YAAQoD,IAAR,CAAa,4CAAb;;CAEA,QAAIK,OAAOuC,QAAX,EAAqB;CACnBvC,aAAOwM,GAAP,GAAaxM,OAAOuC,QAAP,CAAgBiN,IAA7B;CACAxP,aAAOqM,MAAP,GAAgBrM,OAAOuC,QAAP,CAAgB8J,MAAhC;CACD;;CANgC,sCAAZ8F,UAAY;CAAZA,gBAAY;CAAA;;CAAA,4HAQ3BnS,MAR2B,SAQhBmS,UARgB;CASlC;;CAVH;;CAAA;CAAA,EAA2BpG,QAA3B;AAaA,KAAaoyB,YAAb;CAAA;CAAA;CACE,0BAAyB;CAAA,QAAbn+B,MAAa,uEAAJ,EAAI;;CAAA;;CACvBzD,YAAQoD,IAAR,CAAa,uDAAb;CACA,SAAK2E,MAAL,GAAc,IAAIgE,mBAAJ,CAAsBtI,MAAtB,CAAd;CACD;;CAJH;CAAA;CAAA,8BAMYgS,IANZ,EAMkB;CACd,WAAKhR,GAAL,CAASgR,KAAK1N,MAAd;CACD;CARH;CAAA;CAAA,4BAUUtG,QAVV,EAUmB;CACfA,eAAQ4B,GAAR,CAAY,QAAZ,EAAsB,KAAK0E,MAA3B;CACD;CAZH;;CAAA;CAAA;;CChBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/lib/whs.min.js b/lib/whs.min.js new file mode 100644 index 0000000..72353f4 --- /dev/null +++ b/lib/whs.min.js @@ -0,0 +1,1240 @@ +var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(q,G,ba){q!=Array.prototype&&q!=Object.prototype&&(q[G]=ba.value)};$jscomp.getGlobal=function(q){return"undefined"!=typeof window&&window===q?q:"undefined"!=typeof global&&null!=global?global:q};$jscomp.global=$jscomp.getGlobal(this);$jscomp.SYMBOL_PREFIX="jscomp_symbol_"; +$jscomp.initSymbol=function(){$jscomp.initSymbol=function(){};$jscomp.global.Symbol||($jscomp.global.Symbol=$jscomp.Symbol)};$jscomp.Symbol=function(){var q=0;return function(G){return $jscomp.SYMBOL_PREFIX+(G||"")+q++}}(); +$jscomp.initSymbolIterator=function(){$jscomp.initSymbol();var q=$jscomp.global.Symbol.iterator;q||(q=$jscomp.global.Symbol.iterator=$jscomp.global.Symbol("iterator"));"function"!=typeof Array.prototype[q]&&$jscomp.defineProperty(Array.prototype,q,{configurable:!0,writable:!0,value:function(){return $jscomp.arrayIterator(this)}});$jscomp.initSymbolIterator=function(){}};$jscomp.arrayIterator=function(q){var G=0;return $jscomp.iteratorPrototype(function(){return Gq||1342177279>>=1)G+=G;return ka}},"es6","es3");$jscomp.checkEs6ConformanceViaProxy=function(){try{var q={},G=Object.create(new $jscomp.global.Proxy(q,{get:function(ba,ka,K){return ba==q&&"q"==ka&&K==G}}));return!0===G.q}catch(ba){return!1}}; +$jscomp.USE_PROXY_FOR_ES6_CONFORMANCE_CHECKS=!1;$jscomp.ES6_CONFORMANCE=$jscomp.USE_PROXY_FOR_ES6_CONFORMANCE_CHECKS&&$jscomp.checkEs6ConformanceViaProxy(); +$jscomp.polyfill("WeakMap",function(q){function G(){if(!q||!Object.seal)return!1;try{var x=Object.seal({}),p=Object.seal({}),G=new q([[x,2],[p,3]]);if(2!=G.get(x)||3!=G.get(p))return!1;G.delete(x);G.set(p,4);return!G.has(x)&&4==G.get(p)}catch(ra){return!1}}function ba(q){$jscomp.owns(q,K)||$jscomp.defineProperty(q,K,{value:{}})}function ka(q){var p=Object[q];p&&(Object[q]=function(q){ba(q);return p(q)})}if($jscomp.USE_PROXY_FOR_ES6_CONFORMANCE_CHECKS){if(q&&$jscomp.ES6_CONFORMANCE)return q}else if(G())return q; +var K="$jscomp_hidden_"+Math.random();ka("freeze");ka("preventExtensions");ka("seal");var x=0,V=function(q){this.id_=(x+=Math.random()+1).toString();if(q){$jscomp.initSymbol();$jscomp.initSymbolIterator();q=$jscomp.makeIterator(q);for(var p;!(p=q.next()).done;)p=p.value,this.set(p[0],p[1])}};V.prototype.set=function(q,p){ba(q);if(!$jscomp.owns(q,K))throw Error("WeakMap key fail: "+q);q[K][this.id_]=p;return this};V.prototype.get=function(q){return $jscomp.owns(q,K)?q[K][this.id_]:void 0};V.prototype.has= +function(q){return $jscomp.owns(q,K)&&$jscomp.owns(q[K],this.id_)};V.prototype.delete=function(q){return $jscomp.owns(q,K)&&$jscomp.owns(q[K],this.id_)?delete q[K][this.id_]:!1};return V},"es6","es3");$jscomp.polyfill("Math.sign",function(q){return q?q:function(q){q=Number(q);return 0===q||isNaN(q)?q:0h&&(h=f[a]);return h}function R(){Object.defineProperty(this,"id",{value:hk+=2});this.uuid=ja.generateUUID();this.name="";this.type="BufferGeometry";this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingSphere=this.boundingBox=null;this.drawRange={start:0,count:Infinity}}function ad(f,h,a,b,c,d){ca.call(this);this.type="BoxGeometry";this.parameters={width:f,height:h,depth:a,widthSegments:b,heightSegments:c, +depthSegments:d};this.fromBufferGeometry(new $b(f,h,a,b,c,d));this.mergeVertices()}function $b(f,h,a,b,c,d){function e(a,b,c,d,e,f,h,wa,q,I,x){var t=f/q,u=h/I,v=f/2,y=h/2,A=wa/2;h=q+1;var Q=I+1,C=f=0,E,Ka,U=new p;for(Ka=0;Kal;l++){if(m=b[l])if(g=m[0],k=m[1]){n&&c.addAttribute("morphTarget"+l,n[g]);d&&c.addAttribute("morphNormal"+ +l,d[g]);a[l]=k;continue}a[l]=0}e.getUniforms().setValue(f,"morphTargetInfluences",a)}}}function tk(f,h){var a={};return{update:function(b){var c=h.render.frame,d=b.geometry,e=f.get(b,d);a[e.id]!==c&&(d.isGeometry&&e.updateFromObject(b),f.update(e),a[e.id]=c);return e},dispose:function(){a={}}}}function ac(f,h,a,b,c,d,e,g,k,l){f=void 0!==f?f:[];ra.call(this,f,void 0!==h?h:301,a,b,c,d,e,g,k,l);this.flipY=!1}function uc(f,h,a){var b=f[0];if(0>=b||0/gm,function(f,a){f=pa[a];if(void 0===f)throw Error("Can not resolve #include <"+a+">");return hf(f)})}function eh(f){return f.replace(/#pragma unroll_loop[\s]+?for \( int i = (\d+); i < (\d+); i \+\+ \) \{([\s\S]+?)(?=\})\}/g,function(f,a,b,c){f="";for(a=parseInt(a);a 0 ) {\n\t\tfloat fogFactor = 0.0;\n\t\tif ( fogType == 1 ) {\n\t\t\tfogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t\t} else {\n\t\t\tconst float LOG2 = 1.442695;\n\t\t\tfogFactor = exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 );\n\t\t\tfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n\t\t}\n\t\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n\t}\n}"].join("\n")); +h.compileShader(va);h.compileShader(ia);h.attachShader(U,va);h.attachShader(U,ia);h.linkProgram(U);Aa=U;wa=h.getAttribLocation(Aa,"position");Q=h.getAttribLocation(Aa,"uv");d=h.getUniformLocation(Aa,"uvOffset");e=h.getUniformLocation(Aa,"uvScale");g=h.getUniformLocation(Aa,"rotation");k=h.getUniformLocation(Aa,"center");l=h.getUniformLocation(Aa,"scale");n=h.getUniformLocation(Aa,"color");m=h.getUniformLocation(Aa,"map");r=h.getUniformLocation(Aa,"opacity");w=h.getUniformLocation(Aa,"modelViewMatrix"); +t=h.getUniformLocation(Aa,"projectionMatrix");u=h.getUniformLocation(Aa,"fogType");v=h.getUniformLocation(Aa,"fogDensity");q=h.getUniformLocation(Aa,"fogNear");A=h.getUniformLocation(Aa,"fogFar");C=h.getUniformLocation(Aa,"fogColor");h.getUniformLocation(Aa,"fogDepth");E=h.getUniformLocation(Aa,"alphaTest");U=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");U.width=8;U.height=8;va=U.getContext("2d");va.fillStyle="white";va.fillRect(0,0,8,8);D=new he(U)}a.useProgram(Aa);a.initAttributes(); +a.enableAttribute(wa);a.enableAttribute(Q);a.disableUnusedAttributes();a.disable(h.CULL_FACE);a.enable(h.BLEND);h.bindBuffer(h.ARRAY_BUFFER,x);h.vertexAttribPointer(wa,2,h.FLOAT,!1,16,0);h.vertexAttribPointer(Q,2,h.FLOAT,!1,16,8);h.bindBuffer(h.ELEMENT_ARRAY_BUFFER,B);h.uniformMatrix4fv(t,!1,Ka.projectionMatrix.elements);a.activeTexture(h.TEXTURE0);h.uniform1i(m,0);va=U=0;(ia=y.fog)?(h.uniform3f(C,ia.color.r,ia.color.g,ia.color.b),ia.isFog?(h.uniform1f(q,ia.near),h.uniform1f(A,ia.far),h.uniform1i(u, +1),va=U=1):ia.isFogExp2&&(h.uniform1f(v,ia.density),h.uniform1i(u,2),va=U=2)):(h.uniform1i(u,0),va=U=0);ia=0;for(var ef=p.length;iab||a.height>b){if("data"in a){console.warn("THREE.WebGLRenderer: image in DataTexture is too big ("+a.width+"x"+a.height+").");return}b/=Math.max(a.width,a.height);var c=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");c.width=Math.floor(a.width* +b);c.height=Math.floor(a.height*b);c.getContext("2d").drawImage(a,0,0,a.width,a.height,0,0,c.width,c.height);console.warn("THREE.WebGLRenderer: image is too big ("+a.width+"x"+a.height+"). Resized to "+c.width+"x"+c.height,a);return c}return a}function k(a){return ja.isPowerOfTwo(a.width)&&ja.isPowerOfTwo(a.height)}function l(a,b){return a.generateMipmaps&&b&&1003!==a.minFilter&&1006!==a.minFilter}function n(a,c,d,e){f.generateMipmap(a);b.get(c).__maxMipLevel=Math.log(Math.max(d,e))*Math.LOG2E}function m(a){return 1003=== +a||1004===a||1005===a?f.NEAREST:f.LINEAR}function r(a){a=a.target;a.removeEventListener("dispose",r);a:{var c=b.get(a);if(a.image&&c.__image__webglTextureCube)f.deleteTexture(c.__image__webglTextureCube);else{if(void 0===c.__webglInit)break a;f.deleteTexture(c.__webglTexture)}b.remove(a)}a.isVideoTexture&&delete C[a.id];e.memory.textures--}function w(a){a=a.target;a.removeEventListener("dispose",w);var c=b.get(a),d=b.get(a.texture);if(a){void 0!==d.__webglTexture&&f.deleteTexture(d.__webglTexture); +a.depthTexture&&a.depthTexture.dispose();if(a.isWebGLRenderTargetCube)for(d=0;6>d;d++)f.deleteFramebuffer(c.__webglFramebuffer[d]),c.__webglDepthbuffer&&f.deleteRenderbuffer(c.__webglDepthbuffer[d]);else f.deleteFramebuffer(c.__webglFramebuffer),c.__webglDepthbuffer&&f.deleteRenderbuffer(c.__webglDepthbuffer);b.remove(a.texture);b.remove(a)}e.memory.textures--}function t(h,m){var w=b.get(h);if(h.isVideoTexture){var t=h.id,v=e.render.frame;C[t]!==v&&(C[t]=v,h.update())}if(0p;p++)v[p]=m||t?t?h.image[p].image:h.image[p]:g(h.image[p],c.maxCubemapSize);var q=v[0],y=k(q),A=d.convert(h.format),C=d.convert(h.type);u(f.TEXTURE_CUBE_MAP, +h,y);for(p=0;6>p;p++)if(m)for(var E,Q=v[p].mipmaps,wa=0,x=Q.length;war;r++)d.__webglFramebuffer[r]=f.createFramebuffer()}else d.__webglFramebuffer=f.createFramebuffer();if(h){a.bindTexture(f.TEXTURE_CUBE_MAP,g.__webglTexture);u(f.TEXTURE_CUBE_MAP,c.texture,m);for(r=0;6>r;r++)v(d.__webglFramebuffer[r],c,f.COLOR_ATTACHMENT0,f.TEXTURE_CUBE_MAP_POSITIVE_X+r);l(c.texture,m)&&n(f.TEXTURE_CUBE_MAP,c.texture, +c.width,c.height);a.bindTexture(f.TEXTURE_CUBE_MAP,null)}else a.bindTexture(f.TEXTURE_2D,g.__webglTexture),u(f.TEXTURE_2D,c.texture,m),v(d.__webglFramebuffer,c,f.COLOR_ATTACHMENT0,f.TEXTURE_2D),l(c.texture,m)&&n(f.TEXTURE_2D,c.texture,c.width,c.height),a.bindTexture(f.TEXTURE_2D,null);if(c.depthBuffer){d=b.get(c);g=!0===c.isWebGLRenderTargetCube;if(c.depthTexture){if(g)throw Error("target.depthTexture not supported in Cube render targets");if(c&&c.isWebGLRenderTargetCube)throw Error("Depth Texture with cube render targets is not supported"); +f.bindFramebuffer(f.FRAMEBUFFER,d.__webglFramebuffer);if(!c.depthTexture||!c.depthTexture.isDepthTexture)throw Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");b.get(c.depthTexture).__webglTexture&&c.depthTexture.image.width===c.width&&c.depthTexture.image.height===c.height||(c.depthTexture.image.width=c.width,c.depthTexture.image.height=c.height,c.depthTexture.needsUpdate=!0);t(c.depthTexture,0);d=b.get(c.depthTexture).__webglTexture;if(1026===c.depthTexture.format)f.framebufferTexture2D(f.FRAMEBUFFER, +f.DEPTH_ATTACHMENT,f.TEXTURE_2D,d,0);else if(1027===c.depthTexture.format)f.framebufferTexture2D(f.FRAMEBUFFER,f.DEPTH_STENCIL_ATTACHMENT,f.TEXTURE_2D,d,0);else throw Error("Unknown depthTexture format");}else if(g)for(d.__webglDepthbuffer=[],g=0;6>g;g++)f.bindFramebuffer(f.FRAMEBUFFER,d.__webglFramebuffer[g]),d.__webglDepthbuffer[g]=f.createRenderbuffer(),p(d.__webglDepthbuffer[g],c);else f.bindFramebuffer(f.FRAMEBUFFER,d.__webglFramebuffer),d.__webglDepthbuffer=f.createRenderbuffer(),p(d.__webglDepthbuffer, +c);f.bindFramebuffer(f.FRAMEBUFFER,null)}};this.updateRenderTargetMipmap=function(c){var d=c.texture,e=k(c);if(l(d,e)){e=c.isWebGLRenderTargetCube?f.TEXTURE_CUBE_MAP:f.TEXTURE_2D;var g=b.get(d).__webglTexture;a.bindTexture(e,g);n(e,d,c.width,c.height);a.bindTexture(e,null)}}}function nl(f,h){return{convert:function(a){if(1E3===a)return f.REPEAT;if(1001===a)return f.CLAMP_TO_EDGE;if(1002===a)return f.MIRRORED_REPEAT;if(1003===a)return f.NEAREST;if(1004===a)return f.NEAREST_MIPMAP_NEAREST;if(1005=== +a)return f.NEAREST_MIPMAP_LINEAR;if(1006===a)return f.LINEAR;if(1007===a)return f.LINEAR_MIPMAP_NEAREST;if(1008===a)return f.LINEAR_MIPMAP_LINEAR;if(1009===a)return f.UNSIGNED_BYTE;if(1017===a)return f.UNSIGNED_SHORT_4_4_4_4;if(1018===a)return f.UNSIGNED_SHORT_5_5_5_1;if(1019===a)return f.UNSIGNED_SHORT_5_6_5;if(1010===a)return f.BYTE;if(1011===a)return f.SHORT;if(1012===a)return f.UNSIGNED_SHORT;if(1013===a)return f.INT;if(1014===a)return f.UNSIGNED_INT;if(1015===a)return f.FLOAT;if(1016===a){var b= +h.get("OES_texture_half_float");if(null!==b)return b.HALF_FLOAT_OES}if(1021===a)return f.ALPHA;if(1022===a)return f.RGB;if(1023===a)return f.RGBA;if(1024===a)return f.LUMINANCE;if(1025===a)return f.LUMINANCE_ALPHA;if(1026===a)return f.DEPTH_COMPONENT;if(1027===a)return f.DEPTH_STENCIL;if(100===a)return f.FUNC_ADD;if(101===a)return f.FUNC_SUBTRACT;if(102===a)return f.FUNC_REVERSE_SUBTRACT;if(200===a)return f.ZERO;if(201===a)return f.ONE;if(202===a)return f.SRC_COLOR;if(203===a)return f.ONE_MINUS_SRC_COLOR; +if(204===a)return f.SRC_ALPHA;if(205===a)return f.ONE_MINUS_SRC_ALPHA;if(206===a)return f.DST_ALPHA;if(207===a)return f.ONE_MINUS_DST_ALPHA;if(208===a)return f.DST_COLOR;if(209===a)return f.ONE_MINUS_DST_COLOR;if(210===a)return f.SRC_ALPHA_SATURATE;if(33776===a||33777===a||33778===a||33779===a)if(b=h.get("WEBGL_compressed_texture_s3tc"),null!==b){if(33776===a)return b.COMPRESSED_RGB_S3TC_DXT1_EXT;if(33777===a)return b.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(33778===a)return b.COMPRESSED_RGBA_S3TC_DXT3_EXT; +if(33779===a)return b.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(35840===a||35841===a||35842===a||35843===a)if(b=h.get("WEBGL_compressed_texture_pvrtc"),null!==b){if(35840===a)return b.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(35841===a)return b.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(35842===a)return b.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(35843===a)return b.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(36196===a&&(b=h.get("WEBGL_compressed_texture_etc1"),null!==b))return b.COMPRESSED_RGB_ETC1_WEBGL;if(37808===a||37809===a||37810=== +a||37811===a||37812===a||37813===a||37814===a||37815===a||37816===a||37817===a||37818===a||37819===a||37820===a||37821===a)if(b=h.get("WEBGL_compressed_texture_astc"),null!==b)return a;if(103===a||104===a)if(b=h.get("EXT_blend_minmax"),null!==b){if(103===a)return b.MIN_EXT;if(104===a)return b.MAX_EXT}return 1020===a&&(b=h.get("WEBGL_depth_texture"),null!==b)?b.UNSIGNED_INT_24_8_WEBGL:0}}}function Ba(f,h,a,b){Ab.call(this);this.type="PerspectiveCamera";this.fov=void 0!==f?f:50;this.zoom=1;this.near= +void 0!==a?a:.1;this.far=void 0!==b?b:2E3;this.focus=10;this.aspect=void 0!==h?h:1;this.view=null;this.filmGauge=35;this.filmOffset=0;this.updateProjectionMatrix()}function jf(f){Ba.call(this);this.cameras=f||[]}function gh(f){function h(){if(null!==b&&!0===b.isPresenting){var c=b.getEyeParameters("left"),d=c.renderWidth;c=c.renderHeight;u=f.getPixelRatio();t=f.getSize();f.setDrawingBufferSize(2*d,c,1)}else a.enabled&&f.setDrawingBufferSize(t.width,t.height,u)}var a=this,b=null,c=null,d=null,e=new V, +g=new V;"undefined"!==typeof window&&"VRFrameData"in window&&(c=new window.VRFrameData,window.addEventListener("vrdisplaypresentchange",h,!1));var k=new V,l=new sa,n=new p,m=new Ba;m.bounds=new ya(0,0,.5,1);m.layers.enable(1);var r=new Ba;r.bounds=new ya(.5,0,.5,1);r.layers.enable(2);var w=new jf([m,r]);w.layers.enable(1);w.layers.enable(2);var t,u;this.enabled=!1;this.userHeight=1.6;this.getDevice=function(){return b};this.setDevice=function(a){void 0!==a&&(b=a)};this.setPoseTarget=function(a){void 0!== +a&&(d=a)};this.getCamera=function(f){if(null===b)return f;b.depthNear=f.near;b.depthFar=f.far;b.getFrameData(c);var h=b.stageParameters;h?e.fromArray(h.sittingToStandingTransform):e.makeTranslation(0,a.userHeight,0);h=c.pose;var t=null!==d?d:f;t.matrix.copy(e);t.matrix.decompose(t.position,t.quaternion,t.scale);null!==h.orientation&&(l.fromArray(h.orientation),t.quaternion.multiply(l));null!==h.position&&(l.setFromRotationMatrix(e),n.fromArray(h.position),n.applyQuaternion(l),t.position.add(n));t.updateMatrixWorld(); +if(!1===b.isPresenting)return f;m.near=f.near;r.near=f.near;m.far=f.far;r.far=f.far;w.matrixWorld.copy(f.matrixWorld);w.matrixWorldInverse.copy(f.matrixWorldInverse);m.matrixWorldInverse.fromArray(c.leftViewMatrix);r.matrixWorldInverse.fromArray(c.rightViewMatrix);g.getInverse(e);m.matrixWorldInverse.multiply(g);r.matrixWorldInverse.multiply(g);f=t.parent;null!==f&&(k.getInverse(f.matrixWorld),m.matrixWorldInverse.multiply(k),r.matrixWorldInverse.multiply(k));m.matrixWorld.getInverse(m.matrixWorldInverse); +r.matrixWorld.getInverse(r.matrixWorldInverse);m.projectionMatrix.fromArray(c.leftProjectionMatrix);r.projectionMatrix.fromArray(c.rightProjectionMatrix);w.projectionMatrix.copy(m.projectionMatrix);f=b.getLayers();f.length&&(f=f[0],null!==f.leftBounds&&4===f.leftBounds.length&&m.bounds.fromArray(f.leftBounds),null!==f.rightBounds&&4===f.rightBounds.length&&r.bounds.fromArray(f.rightBounds));return w};this.getStandingMatrix=function(){return e};this.submitFrame=function(){null!==b&&!0===b.isPresenting&& +b.submitFrame()};this.dispose=function(){"undefined"!==typeof window&&window.removeEventListener("vrdisplaypresentchange",h)}}function kf(f){function h(){Fa=new nk(M);Fa.get("WEBGL_depth_texture");Fa.get("OES_texture_float");Fa.get("OES_texture_float_linear");Fa.get("OES_texture_half_float");Fa.get("OES_texture_half_float_linear");Fa.get("OES_standard_derivatives");Fa.get("OES_element_index_uint");Fa.get("ANGLE_instanced_arrays");ua=new nl(M,Fa);da=new lk(M,Fa,f);na=new kl(M,Fa,ua);na.scissor(J.copy(ma).multiplyScalar(S)); +na.viewport(G.copy(W).multiplyScalar(S));fa=new qk(M);ba=new $k;ha=new ml(M,Fa,na,ba,da,ua,fa);ka=new ek(M);la=new ok(M,ka,fa);pa=new tk(la,fa);za=new sk(M);oa=new Zk(z,Fa,da);sa=new dl;ra=new il;qa=new jk(z,na,la,Q);Ba=new kk(M,Fa,fa);Ca=new pk(M,Fa,fa);Da=new jl(z,M,na,ha,da);fa.programs=oa.programs;z.context=M;z.capabilities=da;z.extensions=Fa;z.properties=ba;z.renderLists=sa;z.state=na;z.info=fa}function a(a){a.preventDefault();console.log("THREE.WebGLRenderer: Context Lost.");H=!0}function b(){console.log("THREE.WebGLRenderer: Context Restored."); +H=!1;h()}function c(a){a=a.target;a.removeEventListener("dispose",c);d(a);ba.remove(a)}function d(a){var b=ba.get(a).program;a.program=void 0;void 0!==b&&oa.releaseProgram(b)}function e(a,b,c){a.render(function(a){z.renderBufferImmediate(a,b,c)})}function g(){var a=xa.getDevice();a&&a.isPresenting?a.requestAnimationFrame(k):window.requestAnimationFrame(k)}function k(a){!1!==Ea&&(Ha(a),g())}function l(a,b,c){if(!1!==a.visible){if(a.layers.test(b.layers))if(a.isLight)F.pushLight(a),a.castShadow&&F.pushShadow(a); +else if(a.isSprite)a.frustumCulled&&!X.intersectsSprite(a)||F.pushSprite(a);else if(a.isImmediateRenderObject)c&&ea.setFromMatrixPosition(a.matrixWorld).applyMatrix4(aa),D.push(a,null,a.material,ea.z,null);else if(a.isMesh||a.isLine||a.isPoints)if(a.isSkinnedMesh&&a.skeleton.update(),!a.frustumCulled||X.intersectsObject(a)){c&&ea.setFromMatrixPosition(a.matrixWorld).applyMatrix4(aa);var d=pa.update(a),e=a.material;if(Array.isArray(e))for(var g=d.groups,f=0,h=g.length;fa.matrixWorld.determinant();na.setMaterial(g,h);h=w(c,b.fog,g,a);ia="";e(a,h,g)}else z.renderBufferDirect(c,b.fog,d,g,a,f);a.onAfterRender(z,b,c,d,g,f);F=ra.get(b,U||c)}function r(a,b,e){var g=ba.get(a),f=F.state.lights;e=oa.getParameters(a,f.state,F.state.shadowsArray,b,Y.numPlanes, +Y.numIntersection,e);var h=oa.getProgramCode(a,e),k=g.program,l=!0;if(void 0===k)a.addEventListener("dispose",c);else if(k.code!==h)d(a);else{if(g.lightsHash!==f.state.hash)ba.update(a,"lightsHash",f.state.hash);else if(void 0!==e.shaderID)return;l=!1}l&&(e.shaderID?(k=tc[e.shaderID],g.shader={name:a.type,uniforms:$a.clone(k.uniforms),vertexShader:k.vertexShader,fragmentShader:k.fragmentShader}):g.shader={name:a.type,uniforms:a.uniforms,vertexShader:a.vertexShader,fragmentShader:a.fragmentShader}, +a.onBeforeCompile(g.shader,z),k=oa.acquireProgram(a,g.shader,e,h),g.program=k,a.program=k);e=k.getAttributes();if(a.morphTargets)for(h=a.numSupportedMorphTargets=0;he.matrixWorld.determinant();na.setMaterial(d,g);var h=w(a,b,d,e);a=c.id+"_"+h.id+"_"+(!0===d.wireframe);var k=!1;a!==ia&&(ia=a,k=!0);e.morphTargetInfluences&&(za.update(e,c,d,h),k=!0);g=c.index;var l=c.attributes.position;b=1;!0===d.wireframe&&(g=la.getWireframeAttribute(c),b=2);a=Ba;if(null!==g){var m=ka.get(g);a=Ca;a.setIndex(m)}if(k){if(c&&c.isInstancedBufferGeometry&&null===Fa.get("ANGLE_instanced_arrays"))console.error("THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays."); +else{na.initAttributes();k=c.attributes;h=h.getAttributes();var n=d.defaultAttributeValues;for(E in h){var r=h[E];if(0<=r){var t=k[E];if(void 0!==t){var u=t.normalized,p=t.itemSize,v=ka.get(t);if(void 0!==v){var q=v.buffer,A=v.type;v=v.bytesPerElement;if(t.isInterleavedBufferAttribute){var y=t.data,C=y.stride;t=t.offset;y&&y.isInstancedInterleavedBuffer?(na.enableAttributeAndDivisor(r,y.meshPerAttribute),void 0===c.maxInstancedCount&&(c.maxInstancedCount=y.meshPerAttribute*y.count)):na.enableAttribute(r); +M.bindBuffer(M.ARRAY_BUFFER,q);M.vertexAttribPointer(r,p,A,u,C*v,t*v)}else t.isInstancedBufferAttribute?(na.enableAttributeAndDivisor(r,t.meshPerAttribute),void 0===c.maxInstancedCount&&(c.maxInstancedCount=t.meshPerAttribute*t.count)):na.enableAttribute(r),M.bindBuffer(M.ARRAY_BUFFER,q),M.vertexAttribPointer(r,p,A,u,0,0)}}else if(void 0!==n&&(u=n[E],void 0!==u))switch(u.length){case 2:M.vertexAttrib2fv(r,u);break;case 3:M.vertexAttrib3fv(r,u);break;case 4:M.vertexAttrib4fv(r,u);break;default:M.vertexAttrib1fv(r, +u)}}}na.disableUnusedAttributes()}null!==g&&M.bindBuffer(M.ELEMENT_ARRAY_BUFFER,m.buffer)}m=Infinity;null!==g?m=g.count:void 0!==l&&(m=l.count);g=c.drawRange.start*b;l=null!==f?f.start*b:0;var E=Math.max(g,l);f=Math.max(0,Math.min(m,g+c.drawRange.count*b,l+(null!==f?f.count*b:Infinity))-1-E+1);if(0!==f){if(e.isMesh)if(!0===d.wireframe)na.setLineWidth(d.wireframeLinewidth*(null===N?S:1)),a.setMode(M.LINES);else switch(e.drawMode){case 0:a.setMode(M.TRIANGLES);break;case 1:a.setMode(M.TRIANGLE_STRIP); +break;case 2:a.setMode(M.TRIANGLE_FAN)}else e.isLine?(d=d.linewidth,void 0===d&&(d=1),na.setLineWidth(d*(null===N?S:1)),e.isLineSegments?a.setMode(M.LINES):e.isLineLoop?a.setMode(M.LINE_LOOP):a.setMode(M.LINE_STRIP)):e.isPoints&&a.setMode(M.POINTS);c&&c.isInstancedBufferGeometry?0=da.maxTextures&&console.warn("THREE.WebGLRenderer: Trying to use "+a+" texture units while this GPU supports only "+da.maxTextures);P+=1;return a};this.setTexture2D=function(){var a=!1; +return function(b,c){b&&b.isWebGLRenderTarget&&(a||(console.warn("THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead."),a=!0),b=b.texture);ha.setTexture2D(b,c)}}();this.setTexture=function(){var a=!1;return function(b,c){a||(console.warn("THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead."),a=!0);ha.setTexture2D(b,c)}}();this.setTextureCube=function(){var a=!1;return function(b,c){b&&b.isWebGLRenderTargetCube&&(a||(console.warn("THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead."), +a=!0),b=b.texture);b&&b.isCubeTexture||Array.isArray(b.image)&&6===b.image.length?ha.setTextureCube(b,c):ha.setTextureCubeDynamic(b,c)}}();this.getRenderTarget=function(){return N};this.setRenderTarget=function(a){(N=a)&&void 0===ba.get(a).__webglFramebuffer&&ha.setupRenderTarget(a);var b=null,c=!1;a?(b=ba.get(a).__webglFramebuffer,a.isWebGLRenderTargetCube&&(b=b[a.activeCubeFace],c=!0),G.copy(a.viewport),J.copy(a.scissor),O=a.scissorTest):(G.copy(W).multiplyScalar(S),J.copy(ma).multiplyScalar(S), +O=Ia);La!==b&&(M.bindFramebuffer(M.FRAMEBUFFER,b),La=b);na.viewport(G);na.scissor(J);na.setScissorTest(O);c&&(c=ba.get(a.texture),M.framebufferTexture2D(M.FRAMEBUFFER,M.COLOR_ATTACHMENT0,M.TEXTURE_CUBE_MAP_POSITIVE_X+a.activeCubeFace,c.__webglTexture,a.activeMipMapLevel))};this.readRenderTargetPixels=function(a,b,c,d,e,f){if(a&&a.isWebGLRenderTarget){var g=ba.get(a).__webglFramebuffer;if(g){var h=!1;g!==La&&(M.bindFramebuffer(M.FRAMEBUFFER,g),h=!0);try{var k=a.texture,l=k.format,m=k.type;1023!==l&& +ua.convert(l)!==M.getParameter(M.IMPLEMENTATION_COLOR_READ_FORMAT)?console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."):1009===m||ua.convert(m)===M.getParameter(M.IMPLEMENTATION_COLOR_READ_TYPE)||1015===m&&(Fa.get("OES_texture_float")||Fa.get("WEBGL_color_buffer_float"))||1016===m&&Fa.get("EXT_color_buffer_half_float")?M.checkFramebufferStatus(M.FRAMEBUFFER)===M.FRAMEBUFFER_COMPLETE?0<=b&&b<=a.width-d&&0<=c&&c<=a.height-e&&M.readPixels(b, +c,d,e,ua.convert(l),ua.convert(m),f):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete."):console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.")}finally{h&&M.bindFramebuffer(M.FRAMEBUFFER,La)}}}else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")};this.copyFramebufferToTexture=function(a,b,c){var d= +b.image.width,e=b.image.height,f=ua.convert(b.format);this.setTexture2D(b,0);M.copyTexImage2D(M.TEXTURE_2D,c||0,f,a.x,a.y,d,e,0)};this.copyTextureToTexture=function(a,b,c,d){var e=b.image.width,f=b.image.height,g=ua.convert(c.format),h=ua.convert(c.type);b=b.isDataTexture?b.image.data:b.image;this.setTexture2D(c,0);M.texSubImage2D(M.TEXTURE_2D,d||0,a.x,a.y,e,f,g,h,b)}}function vc(f,h){this.name="";this.color=new S(f);this.density=void 0!==h?h:2.5E-4}function wc(f,h,a){this.name="";this.color=new S(f); +this.near=void 0!==h?h:1;this.far=void 0!==a?a:1E3}function xc(){O.call(this);this.type="Scene";this.overrideMaterial=this.fog=this.background=null;this.autoUpdate=!0}function cc(f){da.call(this);this.type="SpriteMaterial";this.color=new S(16777215);this.map=null;this.rotation=0;this.lights=this.fog=!1;this.setValues(f)}function lf(f){O.call(this);this.type="Sprite";this.material=void 0!==f?f:new cc;this.center=new x(.5,.5)}function ie(){O.call(this);this.type="LOD";Object.defineProperties(this,{levels:{enumerable:!0, +value:[]}})}function je(f,h){f=f||[];this.bones=f.slice(0);this.boneMatrices=new Float32Array(16*this.bones.length);if(void 0===h)this.calculateInverses();else if(this.bones.length===h.length)this.boneInverses=h.slice(0);else for(console.warn("THREE.Skeleton boneInverses is the wrong length."),this.boneInverses=[],f=0,h=this.bones.length;fa;a++){var m=n[g[a]];var r=n[g[(a+1)%3]];d[0]=Math.min(m,r);d[1]=Math.max(m,r);m=d[0]+","+d[1];void 0===e[m]&&(e[m]={index1:d[0],index2:d[1]})}}for(m in e)l= +e[m],g=f.vertices[l.index1],h.push(g.x,g.y,g.z),g=f.vertices[l.index2],h.push(g.x,g.y,g.z)}else if(f&&f.isBufferGeometry)if(g=new p,null!==f.index){k=f.attributes.position;n=f.index;var w=f.groups;0===w.length&&(w=[{start:0,count:n.count,materialIndex:0}]);f=0;for(c=w.length;fa;a++)m=n.getX(l+a),r=n.getX(l+(a+1)%3),d[0]=Math.min(m,r),d[1]=Math.max(m,r),m=d[0]+","+d[1],void 0===e[m]&&(e[m]={index1:d[0],index2:d[1]});for(m in e)l=e[m], +g.fromBufferAttribute(k,l.index1),h.push(g.x,g.y,g.z),g.fromBufferAttribute(k,l.index2),h.push(g.x,g.y,g.z)}else for(k=f.attributes.position,l=0,b=k.count/3;la;a++)e=3*l+a,g.fromBufferAttribute(k,e),h.push(g.x,g.y,g.z),e=3*l+(a+1)%3,g.fromBufferAttribute(k,e),h.push(g.x,g.y,g.z);this.addAttribute("position",new J(h,3))}function hd(f,h,a){ca.call(this);this.type="ParametricGeometry";this.parameters={func:f,slices:h,stacks:a};this.fromBufferGeometry(new yc(f,h,a));this.mergeVertices()} +function yc(f,h,a){R.call(this);this.type="ParametricBufferGeometry";this.parameters={func:f,slices:h,stacks:a};var b=[],c=[],d=[],e=[],g=new p,k=new p,l=new p,n=new p,m=new p,r,w,t=h+1;for(r=0;r<=a;r++){var u=r/a;for(w=0;w<=h;w++){var v=w/h;f(v,u,k);c.push(k.x,k.y,k.z);0<=v-1E-5?(f(v-1E-5,u,l),n.subVectors(k,l)):(f(v+1E-5,u,l),n.subVectors(l,k));0<=u-1E-5?(f(v,u-1E-5,l),m.subVectors(k,l)):(f(v,u+1E-5,l),m.subVectors(l,k));g.crossVectors(n,m).normalize();d.push(g.x,g.y,g.z);e.push(v,u)}}for(r=0;r< +a;r++)for(w=0;wd&&1===a.x&&(k[b]=a.x-1);0===c.x&&0===c.z&&(k[b]=d/2/Math.PI+.5)}R.call(this);this.type="PolyhedronBufferGeometry";this.parameters={vertices:f,indices:h,radius:a,detail:b};a=a||1;b=b||0;var g=[],k=[];(function(a){for(var b=new p,e=new p,f=new p,g=0;gf&&(.2>b&&(k[a+0]+=1),.2>c&&(k[a+2]+=1),.2>d&&(k[a+4]+=1))})(); +this.addAttribute("position",new J(g,3));this.addAttribute("normal",new J(g.slice(),3));this.addAttribute("uv",new J(k,2));0===b?this.computeVertexNormals():this.normalizeNormals()}function jd(f,h){ca.call(this);this.type="TetrahedronGeometry";this.parameters={radius:f,detail:h};this.fromBufferGeometry(new zc(f,h));this.mergeVertices()}function zc(f,h){Wa.call(this,[1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],[2,1,0,0,3,2,1,3,0,2,3,1],f,h);this.type="TetrahedronBufferGeometry";this.parameters={radius:f,detail:h}} +function kd(f,h){ca.call(this);this.type="OctahedronGeometry";this.parameters={radius:f,detail:h};this.fromBufferGeometry(new ec(f,h));this.mergeVertices()}function ec(f,h){Wa.call(this,[1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2],f,h);this.type="OctahedronBufferGeometry";this.parameters={radius:f,detail:h}}function ld(f,h){ca.call(this);this.type="IcosahedronGeometry";this.parameters={radius:f,detail:h};this.fromBufferGeometry(new Ac(f,h));this.mergeVertices()} +function Ac(f,h){var a=(1+Math.sqrt(5))/2;Wa.call(this,[-1,a,0,1,a,0,-1,-a,0,1,-a,0,0,-1,a,0,1,a,0,-1,-a,0,1,-a,a,0,-1,a,0,1,-a,0,-1,-a,0,1],[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],f,h);this.type="IcosahedronBufferGeometry";this.parameters={radius:f,detail:h}}function md(f,h){ca.call(this);this.type="DodecahedronGeometry";this.parameters={radius:f,detail:h};this.fromBufferGeometry(new Bc(f,h));this.mergeVertices()} +function Bc(f,h){var a=(1+Math.sqrt(5))/2,b=1/a;Wa.call(this,[-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,-b,-a,0,-b,a,0,b,-a,0,b,a,-b,-a,0,-b,a,0,b,-a,0,b,a,0,-a,0,-b,a,0,-b,-a,0,b,a,0,b],[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],f,h);this.type="DodecahedronBufferGeometry"; +this.parameters={radius:f,detail:h}}function nd(f,h,a,b,c,d){ca.call(this);this.type="TubeGeometry";this.parameters={path:f,tubularSegments:h,radius:a,radialSegments:b,closed:c};void 0!==d&&console.warn("THREE.TubeGeometry: taper has been removed.");f=new Cc(f,h,a,b,c);this.tangents=f.tangents;this.normals=f.normals;this.binormals=f.binormals;this.fromBufferGeometry(f);this.mergeVertices()}function Cc(f,h,a,b,c){function d(c){n=f.getPointAt(c/h,n);var d=e.normals[c];c=e.binormals[c];for(r=0;r<=b;r++){var l= +r/b*Math.PI*2,m=Math.sin(l);l=-Math.cos(l);k.x=l*d.x+m*c.x;k.y=l*d.y+m*c.y;k.z=l*d.z+m*c.z;k.normalize();t.push(k.x,k.y,k.z);g.x=n.x+a*k.x;g.y=n.y+a*k.y;g.z=n.z+a*k.z;w.push(g.x,g.y,g.z)}}R.call(this);this.type="TubeBufferGeometry";this.parameters={path:f,tubularSegments:h,radius:a,radialSegments:b,closed:c};h=h||64;a=a||1;b=b||8;c=c||!1;var e=f.computeFrenetFrames(h,c);this.tangents=e.tangents;this.normals=e.normals;this.binormals=e.binormals;var g=new p,k=new p,l=new x,n=new p,m,r,w=[],t=[],u=[], +v=[];for(m=0;m=h;c-=b)d=jh(c,f[c],f[c+1],d);d&&fc(d,d.next)&&(rd(d),d=d.next);return d} +function sd(f,h){if(!f)return f;h||(h=f);do{var a=!1;if(f.steiner||!fc(f,f.next)&&0!==Ra(f.prev,f,f.next))f=f.next;else{rd(f);f=h=f.prev;if(f===f.next)break;a=!0}}while(a||f!==h);return h}function td(f,h,a,b,c,d,e){if(f){if(!e&&d){var g=f,k=g;do null===k.z&&(k.z=qf(k.x,k.y,b,c,d)),k.prevZ=k.prev,k=k.nextZ=k.next;while(k!==g);k.prevZ.nextZ=null;k.prevZ=null;g=k;var l,n,m,r,w=1;do{k=g;var t=g=null;for(n=0;k;){n++;var u=k;for(l=m=0;lm.x?n.x>w.x?n.x:w.x:m.x>w.x?m.x:w.x,C=n.y>m.y?n.y>w.y?n.y:w.y:m.y>w.y?m.y:w.y;l=qf(n.x=l;){if(p!==t.prev&&p!==t.next&&me(n.x,n.y,m.x,m.y,w.x,w.y,p.x,p.y)&&0<=Ra(p.prev,p,p.next)){t=!1;break a}p=p.prevZ}t=!0}}else a:if(t=f,n=t.prev,m=t,w=t.next,0<=Ra(n,m,w))t=!1;else{for(l=t.next.next;l!==t.prev;){if(me(n.x,n.y,m.x,m.y,w.x,w.y,l.x,l.y)&&0<=Ra(l.prev,l,l.next)){t=!1;break a}l=l.next}t=!0}if(t)h.push(k.i/a),h.push(f.i/a),h.push(u.i/a),rd(f),g=f=u.next;else if(f=u,f===g){if(!e)td(sd(f),h,a,b,c,d,1);else if(1=== +e){e=h;g=a;k=f;do u=k.prev,t=k.next.next,!fc(u,t)&&kh(u,k,k.next,t)&&ud(u,t)&&ud(t,u)&&(e.push(u.i/g),e.push(k.i/g),e.push(t.i/g),rd(k),rd(k.next),k=f=t),k=k.next;while(k!==f);f=k;td(f,h,a,b,c,d,2)}else if(2===e)a:{e=f;do{for(g=e.next.next;g!==e.prev;){if(k=e.i!==g.i){k=e;u=g;if(t=k.next.i!==u.i&&k.prev.i!==u.i){b:{t=k;do{if(t.i!==k.i&&t.next.i!==k.i&&t.i!==u.i&&t.next.i!==u.i&&kh(t,t.next,k,u)){t=!0;break b}t=t.next}while(t!==k);t=!1}t=!t}if(t=t&&ud(k,u)&&ud(u,k)){t=k;n=!1;m=(k.x+u.x)/2;u=(k.y+u.y)/ +2;do t.y>u!==t.next.y>u&&t.next.y!==t.y&&m<(t.next.x-t.x)*(u-t.y)/(t.next.y-t.y)+t.x&&(n=!n),t=t.next;while(t!==k);t=n}k=t}if(k){f=lh(e,g);e=sd(e,e.next);f=sd(f,f.next);td(e,h,a,b,c,d);td(f,h,a,b,c,d);break a}g=g.next}e=e.next}while(e!==f)}break}}}}function pl(f,h){return f.x-h.x}function ql(f,h){var a=h,b=f.x,c=f.y,d=-Infinity;do{if(c<=a.y&&c>=a.next.y&&a.next.y!==a.y){var e=a.x+(c-a.y)*(a.next.x-a.x)/(a.next.y-a.y);if(e<=b&&e>d){d=e;if(e===b){if(c===a.y)return a;if(c===a.next.y)return a.next}var g= +a.x=a.x&&a.x>=e&&b!==a.x&&me(cg.x)&&ud(a,f)&&(g=a,l=n)}a=a.next}return g}function qf(f,h,a,b,c){f=32767*(f-a)*c;h=32767*(h-b)*c;f=(f|f<<8)&16711935;f=(f|f<<4)&252645135;f=(f|f<<2)&858993459;h=(h|h<<8)&16711935;h=(h|h<<4)&252645135;h=(h|h<<2)&858993459;return(f|f<<1)&1431655765|((h| +h<<1)&1431655765)<<1}function rl(f){var h=f,a=f;do h.xRa(f.prev,f,f.next)?0<=Ra(f,h, +f.next)&&0<=Ra(f,f.prev,h):0>Ra(f,h,f.prev)||0>Ra(f,f.next,h)}function lh(f,h){var a=new rf(f.i,f.x,f.y),b=new rf(h.i,h.x,h.y),c=f.next,d=h.prev;f.next=h;h.prev=f;a.next=c;c.prev=a;b.next=a;a.prev=b;d.next=b;b.prev=d;return b}function jh(f,h,a,b){f=new rf(f,h,a);b?(f.next=b.next,f.prev=b,b.next.prev=f,b.next=f):(f.prev=f,f.next=f);return f}function rd(f){f.next.prev=f.prev;f.prev.next=f.next;f.prevZ&&(f.prevZ.nextZ=f.nextZ);f.nextZ&&(f.nextZ.prevZ=f.prevZ)}function rf(f,h,a){this.i=f;this.x=h;this.y= +a;this.nextZ=this.prevZ=this.z=this.next=this.prev=null;this.steiner=!1}function mh(f){var h=f.length;2Number.EPSILON){var k=Math.sqrt(h),l=Math.sqrt(f*f+g*g);h=b.x-e/k;b=b.y+d/k;g=((c.x-g/l-h)*g-(c.y+f/l-b)*f)/(d*g-e*f);f=h+d*g-a.x;d=b+e*g-a.y;e=f*f+d*d;if(2>=e)return new x(f,d);e=Math.sqrt(e/2)}else a=!1,d>Number.EPSILON?f>Number.EPSILON&&(a=!0):d<-Number.EPSILON?f<-Number.EPSILON&&(a=!0):Math.sign(e)===Math.sign(g)&&(a=!0),a?(f=-e,e=Math.sqrt(h)):(f=d,d=e,e=Math.sqrt(h/2));return new x(f/e,d/ +e)}function g(a,d){for(W=a.length;0<=--W;){var e=W;var f=W-1;0>f&&(f=a.length-1);var g,h=A+2*I;for(g=0;gn;n++){var m=l[d[n]];var r=l[d[(n+1)%3]];b[0]=Math.min(m,r);b[1]=Math.max(m,r);m=b[0]+","+b[1];void 0===c[m]?c[m]={index1:b[0],index2:b[1],face1:g,face2:void 0}:c[m].face2=g}for(m in c)if(b=c[m],void 0===b.face2||e[b.face1].normal.dot(e[b.face2].normal)<=h)d=f[b.index1],a.push(d.x,d.y,d.z),d=f[b.index2],a.push(d.x,d.y,d.z);this.addAttribute("position",new J(a,3))}function jc(f,h,a,b,c,d,e,g){ca.call(this);this.type="CylinderGeometry"; +this.parameters={radiusTop:f,radiusBottom:h,height:a,radialSegments:b,heightSegments:c,openEnded:d,thetaStart:e,thetaLength:g};this.fromBufferGeometry(new Bb(f,h,a,b,c,d,e,g));this.mergeVertices()}function Bb(f,h,a,b,c,d,e,g){function k(a){var c,d=new x,k=new p,u=0,v=!0===a?f:h,A=!0===a?1:-1;var B=t;for(c=1;c<=b;c++)m.push(0,q*A,0),r.push(0,A,0),w.push(.5,.5),t++;var z=t;for(c=0;c<=b;c++){var F=c/b*g+e,D=Math.cos(F);F=Math.sin(F);k.x=v*F;k.y=q*A;k.z=v*D;m.push(k.x,k.y,k.z);r.push(0,A,0);d.x=.5*D+ +.5;d.y=.5*F*A+.5;w.push(d.x,d.y);t++}for(c=0;cthis.duration&&this.resetDuration();this.optimize()}function Cf(f){this.manager= +void 0!==f?f:db;this.textures={}}function rh(f){this.manager=void 0!==f?f:db}function Jd(){}function Df(f){"boolean"===typeof f&&(console.warn("THREE.JSONLoader: showStatus parameter has been removed from constructor."),f=void 0);this.manager=void 0!==f?f:db;this.withCredentials=!1}function sh(){this.type="ShapePath";this.color=new S;this.subPaths=[];this.currentPath=null}function Ef(f){this.type="Font";this.data=f}function th(f){this.manager=void 0!==f?f:db}function uh(f){this.manager=void 0!==f? +f:db}function Kd(f,h,a){O.call(this);this.type="CubeCamera";var b=new Ba(90,1,f,h);b.up.set(0,-1,0);b.lookAt(new p(1,0,0));this.add(b);var c=new Ba(90,1,f,h);c.up.set(0,-1,0);c.lookAt(new p(-1,0,0));this.add(c);var d=new Ba(90,1,f,h);d.up.set(0,0,1);d.lookAt(new p(0,1,0));this.add(d);var e=new Ba(90,1,f,h);e.up.set(0,0,-1);e.lookAt(new p(0,-1,0));this.add(e);var g=new Ba(90,1,f,h);g.up.set(0,-1,0);g.lookAt(new p(0,0,1));this.add(g);var k=new Ba(90,1,f,h);k.up.set(0,-1,0);k.lookAt(new p(0,0,-1));this.add(k); +this.renderTarget=new Yc(a,a,{format:1022,magFilter:1006,minFilter:1006});this.renderTarget.texture.name="CubeCamera";this.update=function(a,f){null===this.parent&&this.updateMatrixWorld();var h=this.renderTarget,l=h.texture.generateMipmaps;h.texture.generateMipmaps=!1;h.activeCubeFace=0;a.render(f,b,h);h.activeCubeFace=1;a.render(f,c,h);h.activeCubeFace=2;a.render(f,d,h);h.activeCubeFace=3;a.render(f,e,h);h.activeCubeFace=4;a.render(f,g,h);h.texture.generateMipmaps=l;h.activeCubeFace=5;a.render(f, +k,h);a.setRenderTarget(null)};this.clear=function(a,b,c,d){for(var e=this.renderTarget,f=0;6>f;f++)e.activeCubeFace=f,a.setRenderTarget(e),a.clear(b,c,d);a.setRenderTarget(null)}}function vh(){O.call(this);this.type="AudioListener";this.context=wh.getContext();this.gain=this.context.createGain();this.gain.connect(this.context.destination);this.filter=null}function Ld(f){O.call(this);this.type="Audio";this.context=f.context;this.gain=this.context.createGain();this.gain.connect(f.getInput());this.autoplay= +!1;this.buffer=null;this.loop=!1;this.offset=this.startTime=0;this.playbackRate=1;this.isPlaying=!1;this.hasPlaybackControl=!0;this.sourceType="empty";this.filters=[]}function xh(f){Ld.call(this,f);this.panner=this.context.createPanner();this.panner.connect(this.gain)}function yh(f,h){this.analyser=f.context.createAnalyser();this.analyser.fftSize=void 0!==h?h:2048;this.data=new Uint8Array(this.analyser.frequencyBinCount);f.getOutput().connect(this.analyser)}function zh(f,h,a){this.binding=f;this.valueSize= +a;f=Float64Array;switch(h){case "quaternion":h=this._slerp;break;case "string":case "bool":f=Array;h=this._select;break;default:h=this._lerp}this.buffer=new f(4*a);this._mixBufferRegion=h;this.referenceCount=this.useCount=this.cumulativeWeight=0}function Ah(f,h,a){a=a||Ta.parseTrackName(h);this._targetGroup=f;this._bindings=f.subscribe_(h,a)}function Ta(f,h,a){this.path=h;this.parsedPath=a||Ta.parseTrackName(h);this.node=Ta.findNode(f,this.parsedPath.nodeName)||f;this.rootNode=f}function Bh(f,h,a){this._mixer= +f;this._clip=h;this._localRoot=a||null;f=h.tracks;h=f.length;a=Array(h);for(var b={endingStart:2400,endingEnd:2400},c=0;c!==h;++c){var d=f[c].createInterpolant(null);a[c]=d;d.settings=b}this._interpolantSettings=b;this._interpolants=a;this._propertyBindings=Array(h);this._weightInterpolant=this._timeScaleInterpolant=this._byClipCacheIndex=this._cacheIndex=null;this.loop=2201;this._loopCount=-1;this._startTime=null;this.time=0;this._effectiveWeight=this.weight=this._effectiveTimeScale=this.timeScale= +1;this.repetitions=Infinity;this.paused=!1;this.enabled=!0;this.clampWhenFinished=!1;this.zeroSlopeAtEnd=this.zeroSlopeAtStart=!0}function Ff(f){this._root=f;this._initMemoryManager();this.time=this._accuIndex=0;this.timeScale=1}function B(f,h){"string"===typeof f&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),f=h);this.value=f}function Ch(){R.call(this);this.type="InstancedBufferGeometry";this.maxInstancedCount=void 0}function Dh(f,h,a,b){this.data=f;this.itemSize=h;this.offset= +a;this.normalized=!0===b}function Md(f,h){this.array=f;this.stride=h;this.count=void 0!==f?f.length/h:0;this.dynamic=!1;this.updateRange={offset:0,count:-1};this.version=0}function Eh(f,h,a){Md.call(this,f,h);this.meshPerAttribute=a||1}function Fh(f,h,a){fa.call(this,f,h);this.meshPerAttribute=a||1}function Gh(f,h,a,b){this.ray=new sc(f,h);this.near=a||0;this.far=b||Infinity;this.params={Mesh:{},Line:{},LOD:{},Points:{threshold:1},Sprite:{}};Object.defineProperties(this.params,{PointCloud:{get:function(){console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points."); +return this.Points}}})}function Hh(f,h){return f.distance-h.distance}function Gf(f,h,a,b){if(!1!==f.visible&&(f.raycast(h,a),!0===b)){f=f.children;b=0;for(var c=f.length;ba;a++,b++){var c=a/32*Math.PI*2,d=b/32*Math.PI*2;h.push(Math.cos(c),Math.sin(c),1,Math.cos(d),Math.sin(d),1)}f.addAttribute("position",new J(h,3));h=new za({fog:!1});this.cone=new Ca(f,h);this.add(this.cone);this.update()}function Jh(f){var h=[];f&&f.isBone&&h.push(f);for(var a=0;aarguments.length?f:arguments[2],b;if(Ma(f)===a)return f[h];if(b=Ud.f(f,h))return oa(b,"value")?b.value:void 0!==b.get?b.get.call(a):void 0;if(Ga(b=Nf(f)))return Oh(b,h,a)}function Of(){for(var f=arguments.length,h=Array(f),a=0;ab?Al(b+c,0):Bl(b,c);if(f&&a!=a)for(;c>b;){if(a=h[b++],a!=a)return!0}else for(;c>b;b++)if((f||b in h)&&h[b]===a)return f||b||0;return!f&&-1}}(!1),Fl=Sf("IE_PROTO"),Th=function(f,h){f=xb(f);var a=0,b=[],c;for(c in f)c!=Fl&&oa(f,c)&&b.push(c);for(;h.length>a;)oa(f,c=h[a++])&&(~El(b,c)||b.push(c));return b},He="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" "), +Ie=Object.keys||function(f){return Th(f,He)},Gl=hb?Object.defineProperties:function(f,h){Ma(f);for(var a=Ie(h),b=a.length,c=0,d;b>c;)lb.f(f,d=a[c++],h[d]);return f},Uh=ea.document,Tf=Uh&&Uh.documentElement,Hl=Sf("IE_PROTO"),Uf=function(){},Je=function(){var f=Fe?Rc.createElement("iframe"):{},h=He.length;f.style.display="none";Tf.appendChild(f);f.src="javascript:";f=f.contentWindow.document;f.open();f.write("

    >>0|(o|0)==(p|0)&j>>>0<0)&1|0,0)|0;q=A;t=c[h>>2]|0;G=c[h+4>>2]|0;s=ct(t|0,0,n|0,0)|0;r=A;E=ct(G|0,0,n|0,0)|0;H=A;t=ct(t|0,0,m|0,0)|0;u=A;G=ct(G|0,0,m|0,0)|0;F=A;t=Ow(E|0,0,t|0,0)|0;E=A;F=Ow(H|0,0,G|0,F|0)|0;u=Ow(F|0,A|0,u|0,0)|0;E=Ow(u|0,A|0,E|0,0)|0;u=A;r=Ow(0,t|0,s|0,r|0)|0;s=A;t=Ow(E|0,u|0,(s>>>0>>0|(s|0)==(t|0)&r>>>0<0)&1|0,0)|0;u=A;if(!(q>>>0>>0|(q|0)==(u|0)&p>>>0>>0))if(q>>>0>u>>>0|(q|0)==(u|0)&p>>>0>t>>>0)j=1;else j=o>>>0>>0|(o|0)==(s|0)&j>>>0>>0?-1:(o>>>0>s>>>0|(o|0)==(s|0)&j>>>0>r>>>0)&1;else j=-1;j=P(j,l)|0;p=17}}else{j=l-j|0;p=17}do if((p|0)==17){p=0;if((j|0)>=0)if(!j)break;else break a;else{c[h>>2]=v;c[h+4>>2]=k;c[h+8>>2]=n;c[h+8+4>>2]=m;c[h+16>>2]=l;i=D;break a}}while(0);j=(c[i+4>>2]|0)==(D|0);if((c[i>>2]|0)==(D|0))if(j){H=c[e+8>>2]|0;E=P(H,z)|0;u=c[e+4>>2]|0;E=E-(P(u,C)|0)|0;G=c[e>>2]|0;H=(P(G,C)|0)-(P(H,x)|0)|0;G=(P(u,x)|0)-(P(G,z)|0)|0;u=c[i+12>>2]|0;j=c[(c[D+8>>2]|0)+12>>2]|0;z=c[j+88>>2]|0;x=(c[u+88>>2]|0)-z|0;v=c[j+92>>2]|0;C=(c[u+92>>2]|0)-v|0;j=c[j+96>>2]|0;u=(c[u+96>>2]|0)-j|0;F=(P(B-j|0,C)|0)-(P(y-v|0,u)|0)|0;j=(P(w-z|0,u)|0)-(P(B-j|0,x)|0)|0;C=(P(y-v|0,x)|0)-(P(w-z|0,C)|0)|0;E=ct(F|0,((F|0)<0)<<31>>31|0,E|0,((E|0)<0)<<31>>31|0)|0;F=A;H=ct(j|0,((j|0)<0)<<31>>31|0,H|0,((H|0)<0)<<31>>31|0)|0;j=A;G=ct(C|0,((C|0)<0)<<31>>31|0,G|0,((G|0)<0)<<31>>31|0)|0;G=Ow(E|0,F|0,G|0,A|0)|0;j=Ow(G|0,A|0,H|0,j|0)|0;H=A;j=(H|0)>0|(H|0)==0&j>>>0>0?2:1}else j=2;else j=j&1;i=(j|0)==2^b?i:D}while(0);j=c[d+8>>2]|0}D=c[D>>2]|0}while((D|0)!=(j|0));return i|0}function Gd(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0;v=l;l=l+544|0;j=h;k=j+36|0;do{c[j>>2]=0;j=j+4|0}while((j|0)<(k|0));c[v+384>>2]=a;c[v+384+4>>2]=d;o=+g[e>>2];F=+g[b>>2];n=+g[e+16>>2];i=+g[b+16>>2];m=+g[e+32>>2];G=+g[b+32>>2];w=+g[b+4>>2];H=+g[b+20>>2];x=+g[b+36>>2];t=+g[b+8>>2];r=+g[b+24>>2];p=+g[b+40>>2];E=+g[e+4>>2];C=+g[e+20>>2];B=+g[e+36>>2];A=+g[e+8>>2];z=+g[e+24>>2];y=+g[e+40>>2];g[v+384+8>>2]=o*F+n*i+m*G;g[v+384+12>>2]=o*w+n*H+m*x;g[v+384+16>>2]=o*t+n*r+m*p;g[v+384+20>>2]=0.0;g[v+384+24>>2]=F*E+i*C+G*B;g[v+384+28>>2]=w*E+H*C+x*B;g[v+384+32>>2]=t*E+r*C+p*B;g[v+384+36>>2]=0.0;g[v+384+40>>2]=F*A+i*z+G*y;g[v+384+44>>2]=w*A+H*z+x*y;g[v+384+48>>2]=t*A+r*z+p*y;g[v+384+52>>2]=0.0;p=+g[e+48>>2]-+g[b+48>>2];r=+g[e+52>>2]-+g[b+52>>2];t=+g[e+56>>2]-+g[b+56>>2];x=+g[b>>2];H=+g[e>>2];w=+g[b+16>>2];G=+g[e+16>>2];i=+g[b+32>>2];F=+g[e+32>>2];m=+g[b+4>>2];n=+g[b+20>>2];o=+g[b+36>>2];q=+g[b+8>>2];s=+g[b+24>>2];u=+g[b+40>>2];g[v+384+56>>2]=x*H+w*G+i*F;g[v+384+60>>2]=x*E+w*C+i*B;g[v+384+64>>2]=x*A+w*z+i*y;g[v+384+68>>2]=0.0;g[v+384+72>>2]=H*m+G*n+F*o;g[v+384+76>>2]=E*m+C*n+B*o;g[v+384+80>>2]=A*m+z*n+y*o;g[v+384+84>>2]=0.0;g[v+384+88>>2]=H*q+G*s+F*u;g[v+384+92>>2]=E*q+C*s+B*u;g[v+384+96>>2]=A*q+z*s+y*u;g[v+384+100>>2]=0.0;g[v+384+104>>2]=p*x+r*w+t*i;g[v+384+108>>2]=p*m+r*n+t*o;g[v+384+112>>2]=p*q+r*s+t*u;g[v+384+116>>2]=0.0;c[v+384+120>>2]=80;c[v+384+124>>2]=0;c[v+364>>2]=0;c[v+128>>2]=0;c[v+128+4>>2]=0;c[v+128+8>>2]=0;c[v+128+12>>2]=0;c[v+376>>2]=2;c[v+368>>2]=0;g[v+144>>2]=0.0;a=Jc(v,v+384|0,f)|0;if(a|0){c[h>>2]=(a|0)==1?1:2;h=0;l=v;return h|0}a=c[v+372>>2]|0;if(!(c[a+32>>2]|0)){q=0.0;p=0.0;o=0.0;n=0.0;m=0.0;i=0.0}else{f=0;o=0.0;p=0.0;q=0.0;i=0.0;m=0.0;n=0.0;do{u=+g[a+16+(f<<2)>>2];d=c[v+384+120>>2]|0;k=c[v+384+124>>2]|0;e=(c[v+384>>2]|0)+(k>>1)|0;if(k&1)d=c[(c[e>>2]|0)+d>>2]|0;Sb[d&127](v+528|0,e,c[a+(f<<2)>>2]|0);o=o+u*+g[v+528>>2];p=p+u*+g[v+528+4>>2];q=q+u*+g[v+528+8>>2];a=c[(c[v+372>>2]|0)+(f<<2)>>2]|0;r=-+g[a>>2];s=-+g[a+4>>2];t=-+g[a+8>>2];a=c[v+384+120>>2]|0;k=c[v+384+124>>2]|0;d=(c[v+384+4>>2]|0)+(k>>1)|0;if(k&1)a=c[(c[d>>2]|0)+a>>2]|0;G=+g[v+384+24>>2]*r+ +g[v+384+28>>2]*s+ +g[v+384+32>>2]*t;F=+g[v+384+40>>2]*r+ +g[v+384+44>>2]*s+ +g[v+384+48>>2]*t;g[v+512>>2]=+g[v+384+8>>2]*r+ +g[v+384+12>>2]*s+ +g[v+384+16>>2]*t;g[v+512+4>>2]=G;g[v+512+8>>2]=F;g[v+512+12>>2]=0.0;Sb[a&127](v+528|0,d,v+512|0);F=+g[v+528>>2];G=+g[v+528+4>>2];H=+g[v+528+8>>2];i=i+u*(F*+g[v+384+56>>2]+G*+g[v+384+60>>2]+H*+g[v+384+64>>2]+ +g[v+384+104>>2]);m=m+u*(F*+g[v+384+72>>2]+G*+g[v+384+76>>2]+H*+g[v+384+80>>2]+ +g[v+384+108>>2]);n=n+u*(F*+g[v+384+88>>2]+G*+g[v+384+92>>2]+H*+g[v+384+96>>2]+ +g[v+384+112>>2]);f=f+1|0;a=c[v+372>>2]|0}while(f>>>0<(c[a+32>>2]|0)>>>0)}E=o*+g[b+16>>2]+p*+g[b+20>>2]+q*+g[b+24>>2]+ +g[b+52>>2];F=o*+g[b+32>>2]+p*+g[b+36>>2]+q*+g[b+40>>2]+ +g[b+56>>2];g[h+4>>2]=o*+g[b>>2]+p*+g[b+4>>2]+q*+g[b+8>>2]+ +g[b+48>>2];g[h+8>>2]=E;g[h+12>>2]=F;g[h+16>>2]=0.0;F=i*+g[b+16>>2]+m*+g[b+20>>2]+n*+g[b+24>>2]+ +g[b+52>>2];E=i*+g[b+32>>2]+m*+g[b+36>>2]+n*+g[b+40>>2]+ +g[b+56>>2];g[h+20>>2]=i*+g[b>>2]+m*+g[b+4>>2]+n*+g[b+8>>2]+ +g[b+48>>2];g[h+24>>2]=F;g[h+28>>2]=E;g[h+32>>2]=0.0;E=o-i;F=p-m;H=q-n;g[h+48>>2]=0.0;G=+D(+(E*E+F*F+H*H));g[h+52>>2]=G;G=G>9.999999747378752e-05?1.0/G:1.0;g[h+36>>2]=G*E;g[h+40>>2]=G*F;g[h+44>>2]=G*H;h=1;l=v;return h|0}function Hd(b,d,e,f,h,i,j,k,l,m,n,o,p){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;var q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0;B=P(c[l+24>>2]|0,m)|0;y=(a[d+44>>0]|0)!=0;A=c[d+56>>2]|0;if(!(y|(A|0)!=0)){d=0;return d|0}C=c[(o|0?l+12|0:l+8|0)>>2]|0;m=c[(o|0?l+20|0:l+16|0)>>2]|0;c[C+(B<<2)>>2]=c[n>>2];c[C+(B+1<<2)>>2]=c[n+4>>2];c[C+(B+2<<2)>>2]=c[n+8>>2];g[m+(B<<2)>>2]=-+g[n>>2];g[m+(B+1<<2)>>2]=-+g[n+4>>2];g[m+(B+2<<2)>>2]=-+g[n+8>>2];if(!o){q=+g[b+1176>>2];if(!(a[b+1301>>0]|0)){q=q-+g[e+48>>2];r=+g[b+1180>>2]-+g[e+52>>2];w=+g[b+1184>>2]-+g[e+56>>2];u=+g[n+8>>2];v=+g[n+4>>2];x=+g[n>>2];m=c[l+12>>2]|0;g[m+(B<<2)>>2]=r*u-w*v;g[m+(B+1<<2)>>2]=w*x-q*u;g[m+(B+2<<2)>>2]=q*v-r*x;x=+g[b+1176>>2]-+g[f+48>>2];r=+g[b+1180>>2]-+g[f+52>>2];v=+g[b+1184>>2]-+g[f+56>>2];q=+g[n+8>>2];u=+g[n+4>>2];w=+g[n>>2];m=c[l+20>>2]|0;g[m+(B<<2)>>2]=-(r*q-v*u);r=x*u-r*w;e=m;q=-(v*w-x*q)}else{I=q-+g[f+48>>2];H=+g[b+1180>>2]-+g[f+52>>2];F=+g[b+1184>>2]-+g[f+56>>2];r=+g[n>>2];G=+g[n+4>>2];E=+g[n+8>>2];K=+g[b+1112>>2]-+g[e+48>>2];q=+g[b+1116>>2]-+g[e+52>>2];s=+g[b+1120>>2]-+g[e+56>>2];u=+g[d+52>>2]-+g[d+48>>2];J=r*(r*K+G*q+E*s)+r*u-r*(I*r+H*G+F*E);D=G*(r*K+G*q+E*s)+G*u-G*(I*r+H*G+F*E);u=E*(r*K+G*q+E*s)+E*u-E*(I*r+H*G+F*E);w=+g[b+1272>>2];x=+g[b+1276>>2];t=E*(q-G*(r*K+G*q+E*s)+w*D)-G*(s-E*(r*K+G*q+E*s)+w*u);v=r*(s-E*(r*K+G*q+E*s)+w*u)-E*(K-r*(r*K+G*q+E*s)+w*J);s=G*(K-r*(r*K+G*q+E*s)+w*J)-r*(q-G*(r*K+G*q+E*s)+w*D);q=(H-G*(I*r+H*G+F*E)-x*D)*E-(F-E*(I*r+H*G+F*E)-x*u)*G;u=(F-E*(I*r+H*G+F*E)-x*u)*r-(I-r*(I*r+H*G+F*E)-x*J)*E;r=(I-r*(I*r+H*G+F*E)-x*J)*G-(H-G*(I*r+H*G+F*E)-x*D)*r;if(!((p|0)!=0|(a[b+1280>>0]|0)==0)){t=w*t;v=w*v;s=w*s;q=x*q;u=x*u;r=x*r}m=(c[l+12>>2]|0)+(B<<2)|0;g[m>>2]=t;g[m+4>>2]=v;g[m+8>>2]=s;m=c[l+20>>2]|0;g[m+(B<<2)>>2]=-q;e=m;q=-u}g[m+(B+1<<2)>>2]=q;g[e+(B+2<<2)>>2]=-r}if(A|0?+g[d>>2]==+g[d+4>>2]:0){m=c[l+28>>2]|0;g[m+(B<<2)>>2]=0.0;q=0.0}else z=12;do if((z|0)==12){e=c[l+28>>2]|0;g[e+(B<<2)>>2]=0.0;if(!y){if(A|0){m=e;q=0.0;break}else m=1;return m|0}c[(c[l+32>>2]|0)+(B<<2)>>2]=c[d+28>>2];if(A|0){m=e;q=+g[e+(B<<2)>>2];break}v=+g[d+8>>2];q=o|0?v:-v;r=+g[d+52>>2];s=+g[d>>2];t=+g[d+4>>2];u=+g[l>>2]*+g[d+32>>2];do if(!(s>t))if(!(s==t)){if(q/u<0.0)if(r>=s?s-q/u>r:0){q=(s-r)/(q/u);break}else{q=r0.0)if(r<=t?t-q/ut?0.0:1.0;break}else q=0.0}else q=0.0;else q=1.0;while(0);g[e+(B<<2)>>2]=q*v+ +g[e+(B<<2)>>2];g[(c[l+36>>2]|0)+(B<<2)>>2]=-+g[d+12>>2];c[(c[l+40>>2]|0)+(B<<2)>>2]=c[d+12>>2];C=1;return C|0}while(0);K=+g[l>>2]*+g[d+32>>2];f=m+(B<<2)|0;g[f>>2]=q+ +g[d+48>>2]*(o|0?-K:K);c[(c[l+32>>2]|0)+(B<<2)>>2]=c[d+36>>2];e=c[l+36>>2]|0;m=c[l+40>>2]|0;if(+g[d>>2]==+g[d+4>>2]){g[e+(B<<2)>>2]=-3402823466385288598117041.0e14;g[m+(B<<2)>>2]=3402823466385288598117041.0e14;C=1;return C|0}g[e+(B<<2)>>2]=(A|0)==1?0.0:-3402823466385288598117041.0e14;g[m+(B<<2)>>2]=(A|0)==1?3402823466385288598117041.0e14:0.0;r=+g[d+40>>2];if(!(r>0.0)){C=1;return C|0}d=o|0?j:h;C=o|0?k:i;J=+g[n>>2];K=+g[n+4>>2];q=+g[n+8>>2];q=+g[d>>2]*J+ +g[d+4>>2]*K+ +g[d+8>>2]*q-(J*+g[C>>2]+K*+g[C+4>>2]+q*+g[C+8>>2]);if((A|0)==1){if(!(q<0.0)){C=1;return C|0}if(!(+g[f>>2]<-(r*q))){C=1;return C|0}g[f>>2]=-(r*q);C=1;return C|0}else{if(!(q>0.0)){C=1;return C|0}if(!(+g[f>>2]>-(r*q))){C=1;return C|0}g[f>>2]=-(r*q);C=1;return C|0}return 0}function Id(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0,i=0,k=0,m=0.0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0;n=l;l=l+16|0;c[b+252>>2]=2;c[b+372>>2]=0;c[b+372+4>>2]=0;c[b+372+8>>2]=0;c[b+372+12>>2]=0;c[b+372+16>>2]=0;c[b+372+20>>2]=0;c[b+372+24>>2]=0;c[b+372+28>>2]=0;c[b+604>>2]=1065353216;c[b+608>>2]=1065353216;c[b+612>>2]=1065353216;g[b+616>>2]=0.0;c[b+408>>2]=1065353216;c[b+412>>2]=1065353216;c[b+416>>2]=1065353216;e=b+420|0;h=e+36|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(h|0));c[b+472>>2]=0;c[b+472+4>>2]=0;c[b+472+8>>2]=0;c[b+472+12>>2]=0;c[b+472+16>>2]=0;c[b+472+20>>2]=0;c[b+472+24>>2]=0;c[b+472+28>>2]=0;f=+g[d+92>>2];m=+g[d+96>>2];g[n+12>>2]=f;g[n+8>>2]=m;g[n+4>>2]=0.0;g[n>>2]=1.0;c[b+504>>2]=c[(f<0.0?n+4|0:f>1.0?n:n+12|0)>>2];g[n+4>>2]=0.0;g[n>>2]=1.0;c[b+508>>2]=c[(m<0.0?n+4|0:m>1.0?n:n+8|0)>>2];c[b+532>>2]=c[d+116>>2];c[b+536>>2]=c[d+120>>2];e=c[d+4>>2]|0;c[b+540>>2]=e;c[b+668>>2]=0;c[b+672>>2]=0;a[b+512>>0]=a[d+124>>0]|0;c[b+516>>2]=c[d+128>>2];c[b+520>>2]=c[d+132>>2];c[b+524>>2]=c[d+136>>2];c[b+528>>2]=c[d+140>>2];if(!e){c[b+4>>2]=c[d+8>>2];c[b+4+4>>2]=c[d+8+4>>2];c[b+4+8>>2]=c[d+8+8>>2];c[b+4+12>>2]=c[d+8+12>>2];c[b+20>>2]=c[d+24>>2];c[b+20+4>>2]=c[d+24+4>>2];c[b+20+8>>2]=c[d+24+8>>2];c[b+20+12>>2]=c[d+24+12>>2];c[b+36>>2]=c[d+40>>2];c[b+36+4>>2]=c[d+40+4>>2];c[b+36+8>>2]=c[d+40+8>>2];c[b+36+12>>2]=c[d+40+12>>2];c[b+52>>2]=c[d+56>>2];c[b+52+4>>2]=c[d+56+4>>2];c[b+52+8>>2]=c[d+56+8>>2];c[b+52+12>>2]=c[d+56+12>>2];e=b+20|0;h=b+36|0;i=b+52|0;k=b+4|0}else{Ob[c[(c[e>>2]|0)+8>>2]&127](e,b+4|0);e=b+20|0;h=b+36|0;i=b+52|0;k=b+4|0}c[b+68>>2]=c[k>>2];c[b+68+4>>2]=c[k+4>>2];c[b+68+8>>2]=c[k+8>>2];c[b+68+12>>2]=c[k+12>>2];c[b+84>>2]=c[e>>2];c[b+84+4>>2]=c[e+4>>2];c[b+84+8>>2]=c[e+8>>2];c[b+84+12>>2]=c[e+12>>2];c[b+100>>2]=c[h>>2];c[b+100+4>>2]=c[h+4>>2];c[b+100+8>>2]=c[h+8>>2];c[b+100+12>>2]=c[h+12>>2];c[b+116>>2]=c[i>>2];c[b+116+4>>2]=c[i+4>>2];c[b+116+8>>2]=c[i+8>>2];c[b+116+12>>2]=c[i+12>>2];c[b+132>>2]=0;c[b+132+4>>2]=0;c[b+132+8>>2]=0;c[b+132+12>>2]=0;c[b+132+16>>2]=0;c[b+132+20>>2]=0;c[b+132+24>>2]=0;c[b+132+28>>2]=0;c[b+228>>2]=c[d+100>>2];c[b+236>>2]=c[d+104>>2];c[b+240>>2]=c[d+108>>2];c[b+232>>2]=c[d+112>>2];Ob[c[(c[b>>2]|0)+8>>2]&127](b,c[d+72>>2]|0);e=c[5786]|0;c[5786]=e+1;c[b+568>>2]=e;f=+g[d>>2];e=c[b+204>>2]|0;if(f==0.0){c[b+204>>2]=e|1;m=0.0}else{c[b+204>>2]=e&-2;m=1.0/f}g[b+404>>2]=m;p=f*+g[b+444>>2];o=f*+g[b+448>>2];g[b+424>>2]=f*+g[b+440>>2];g[b+428>>2]=p;g[b+432>>2]=o;g[b+436>>2]=0.0;f=+g[d+76>>2];h=f!=0.0?(g[j>>2]=1.0/f,c[j>>2]|0):0;f=+g[d+80>>2];e=f!=0.0?(g[j>>2]=1.0/f,c[j>>2]|0):0;f=+g[d+84>>2];d=f!=0.0?(g[j>>2]=1.0/f,c[j>>2]|0):0;c[b+456>>2]=h;c[b+460>>2]=e;c[b+464>>2]=d;g[b+468>>2]=0.0;r=m*+g[b+412>>2];x=m*+g[b+416>>2];g[b+620>>2]=m*+g[b+408>>2];g[b+624>>2]=r;g[b+628>>2]=x;g[b+632>>2]=0.0;x=+g[b+4>>2];r=(c[j>>2]=h,+g[j>>2]);w=+g[b+8>>2];f=(c[j>>2]=e,+g[j>>2]);v=+g[b+12>>2];o=(c[j>>2]=d,+g[j>>2]);u=+g[b+20>>2];t=+g[b+24>>2];s=+g[b+28>>2];q=+g[b+36>>2];p=+g[b+40>>2];m=+g[b+44>>2];g[b+324>>2]=x*x*r+w*w*f+v*v*o;g[b+328>>2]=x*r*u+w*f*t+v*o*s;g[b+332>>2]=x*r*q+w*f*p+v*o*m;g[b+336>>2]=0.0;g[b+340>>2]=x*r*u+w*f*t+v*o*s;g[b+344>>2]=u*r*u+t*f*t+s*o*s;g[b+348>>2]=r*u*q+f*t*p+o*s*m;g[b+352>>2]=0.0;g[b+356>>2]=x*r*q+w*f*p+v*o*m;g[b+360>>2]=u*r*q+t*f*p+s*o*m;g[b+364>>2]=q*r*q+p*f*p+m*o*m;g[b+368>>2]=0.0;c[b+564>>2]=8;c[b+572>>2]=0;c[b+572+4>>2]=0;c[b+572+8>>2]=0;c[b+572+12>>2]=0;c[b+572+16>>2]=0;c[b+572+20>>2]=0;c[b+572+24>>2]=0;c[b+572+28>>2]=0;m=+g[b+404>>2];o=m*+g[b+412>>2];p=m*+g[b+416>>2];g[b+620>>2]=+g[b+408>>2]*m;g[b+624>>2]=o;g[b+628>>2]=p;e=b+632|0;h=e+36|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(h|0));l=n;return}function Jd(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0,L=0,M=0,N=0,O=0;h=l;l=l+240|0;if(!(c[b+16>>2]|0)){K=c[b+12>>2]|0;b=c[b+20>>2]|0;x=+g[d>>2];q=+g[d+4>>2];u=+g[d+8>>2];j=+g[d+16>>2];r=+g[d+20>>2];i=+g[d+24>>2];m=+g[d+32>>2];s=+g[d+36>>2];n=+g[d+40>>2];F=+g[d+48>>2];E=+g[d+52>>2];D=+g[d+56>>2];J=+g[e>>2];I=+g[e+16>>2];z=+g[e+32>>2];H=+g[e+4>>2];G=+g[e+20>>2];y=+g[e+36>>2];v=+g[e+8>>2];k=+g[e+24>>2];p=+g[e+40>>2];C=-+g[e+48>>2];B=-+g[e+52>>2];w=-+g[e+56>>2];d=c[(c[K>>2]|0)+64>>2]|0;A=-+g[b+52>>2];t=-+g[b+56>>2];o=-+g[b+60>>2];g[h+16>>2]=(x*J+j*I+m*z)*A+(x*H+j*G+m*y)*t+(x*v+j*k+m*p)*o;g[h+16+4>>2]=(q*J+r*I+s*z)*A+(q*H+r*G+s*y)*t+(q*v+r*k+s*p)*o;g[h+16+8>>2]=(u*J+i*I+n*z)*A+(u*H+i*G+n*y)*t+(u*v+i*k+n*p)*o;g[h+16+12>>2]=0.0;Sb[d&127](h+152|0,K,h+16|0);o=+g[h+152>>2];t=+g[h+152+4>>2];A=+g[h+152+8>>2];z=F*J+E*I+D*z+(J*C+I*B+z*w)+((x*J+j*I+m*z)*o+(q*J+r*I+s*z)*t+(u*J+i*I+n*z)*A);y=F*H+E*G+D*y+(H*C+G*B+y*w)+((x*H+j*G+m*y)*o+(q*H+r*G+s*y)*t+(u*H+i*G+n*y)*A);A=F*v+E*k+D*p+(v*C+k*B+p*w)+((x*v+j*k+m*p)*o+(q*v+r*k+s*p)*t+(u*v+i*k+n*p)*A);p=+g[b+52>>2];n=+g[b+56>>2];k=+g[b+60>>2];i=k*A+(p*z+n*y)-+g[b+68>>2];v=+g[e>>2];u=+g[e+4>>2];t=+g[e+8>>2];s=+g[e+16>>2];r=+g[e+20>>2];q=+g[e+24>>2];o=+g[e+32>>2];m=+g[e+36>>2];j=+g[e+40>>2];x=(z-p*i)*s+(y-n*i)*r+(A-k*i)*q+ +g[e+52>>2];w=(z-p*i)*o+(y-n*i)*m+(A-k*i)*j+ +g[e+56>>2];g[h+16>>2]=t*(A-k*i)+(v*(z-p*i)+u*(y-n*i))+ +g[e+48>>2];g[h+16+4>>2]=x;g[h+16+8>>2]=w;g[h+16+12>>2]=0.0;g[h>>2]=v*p+u*n+t*k;g[h+4>>2]=p*s+n*r+k*q;g[h+8>>2]=p*o+n*m+k*j;g[h+12>>2]=0.0;Tb[c[(c[f>>2]|0)+16>>2]&15](f,h,h+16|0,i);l=h;return}else{N=c[b+4>>2]|0;a[N+312>>0]=0;c[N>>2]=0;a[N+356>>0]=1;c[N+292>>2]=1566444395;c[N+296>>2]=1566444395;c[N+300>>2]=1566444395;g[N+304>>2]=0.0;c[N+336>>2]=0;c[N+336+4>>2]=0;c[N+336+8>>2]=0;c[N+336+12>>2]=0;a[N+336+16>>0]=0;a[N+332>>0]=a[N+332>>0]&-16;N=c[b+12>>2]|0;M=c[b+16>>2]|0;L=c[N+4>>2]|0;K=c[M+4>>2]|0;I=+nb[c[(c[N>>2]|0)+48>>2]&15](N);O=c[b+16>>2]|0;J=+nb[c[(c[O>>2]|0)+48>>2]&15](O);O=c[b+4>>2]|0;b=c[b+8>>2]|0;c[h+152>>2]=9552;c[h+152+4>>2]=0;c[h+152+8>>2]=1065353216;c[h+152+12>>2]=0;g[h+152+16>>2]=0.0;c[h+152+20>>2]=b;c[h+152+24>>2]=O;c[h+152+28>>2]=N;c[h+152+32>>2]=M;c[h+152+36>>2]=L;c[h+152+40>>2]=K;g[h+152+44>>2]=I;g[h+152+48>>2]=J;a[h+152+52>>0]=0;c[h+152+60>>2]=-1;c[h+152+72>>2]=1;c[h+152+76>>2]=1;g[h+16+128>>2]=999999984306749440.0;c[h+16>>2]=c[d>>2];c[h+16+4>>2]=c[d+4>>2];c[h+16+8>>2]=c[d+8>>2];c[h+16+12>>2]=c[d+12>>2];c[h+16+16>>2]=c[d+16>>2];c[h+16+16+4>>2]=c[d+16+4>>2];c[h+16+16+8>>2]=c[d+16+8>>2];c[h+16+16+12>>2]=c[d+16+12>>2];c[h+16+32>>2]=c[d+32>>2];c[h+16+32+4>>2]=c[d+32+4>>2];c[h+16+32+8>>2]=c[d+32+8>>2];c[h+16+32+12>>2]=c[d+32+12>>2];c[h+16+48>>2]=c[d+48>>2];c[h+16+48+4>>2]=c[d+48+4>>2];c[h+16+48+8>>2]=c[d+48+8>>2];c[h+16+48+12>>2]=c[d+48+12>>2];c[h+16+64>>2]=c[e>>2];c[h+16+64+4>>2]=c[e+4>>2];c[h+16+64+8>>2]=c[e+8>>2];c[h+16+64+12>>2]=c[e+12>>2];c[h+16+80>>2]=c[e+16>>2];c[h+16+80+4>>2]=c[e+16+4>>2];c[h+16+80+8>>2]=c[e+16+8>>2];c[h+16+80+12>>2]=c[e+16+12>>2];c[h+16+96>>2]=c[e+32>>2];c[h+16+96+4>>2]=c[e+32+4>>2];c[h+16+96+8>>2]=c[e+32+8>>2];c[h+16+96+12>>2]=c[e+32+12>>2];c[h+16+112>>2]=c[e+48>>2];c[h+16+112+4>>2]=c[e+48+4>>2];c[h+16+112+8>>2]=c[e+48+8>>2];c[h+16+112+12>>2]=c[e+48+12>>2];Dc(h+152|0,h+16|0,f,0,0);l=h;return}}function Kd(b,d,e){b=b|0;d=+d;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0,x=0.0,y=0.0;w=l;l=l+96|0;f=c[b+8>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}f=c[b+12>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}f=c[b+20>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}f=c[b+24>>2]|0;if(f|0?(c[f+204>>2]&3|0)==0:0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}m=ui(b+4|0)|0;j=+g[b+28>>2];i=+g[b+32>>2];h=+g[b+36>>2];u=j*+g[m+16>>2]+i*+g[m+20>>2]+h*+g[m+24>>2]+ +g[m+52>>2];t=j*+g[m+32>>2]+i*+g[m+36>>2]+h*+g[m+40>>2]+ +g[m+56>>2];g[b+156>>2]=j*+g[m>>2]+i*+g[m+4>>2]+h*+g[m+8>>2]+ +g[m+48>>2];g[b+160>>2]=u;g[b+164>>2]=t;g[b+168>>2]=0.0;m=ui(b+16|0)|0;t=+g[b+44>>2];u=+g[b+48>>2];h=+g[b+52>>2];i=t*+g[m>>2]+u*+g[m+4>>2]+h*+g[m+8>>2]+ +g[m+48>>2];j=t*+g[m+16>>2]+u*+g[m+20>>2]+h*+g[m+24>>2]+ +g[m+52>>2];h=t*+g[m+32>>2]+u*+g[m+36>>2]+h*+g[m+40>>2]+ +g[m+56>>2];g[b+172>>2]=i;g[b+176>>2]=j;g[b+180>>2]=h;g[b+184>>2]=0.0;i=+g[b+156>>2]-i;j=+g[b+160>>2]-j;h=+g[b+164>>2]-h;if(i*i+j*j+h*h>16.0){u=1.0/+D(+(i*i+j*j+h*h));i=i*4.0*u;j=j*4.0*u;h=h*4.0*u}u=+g[b+64>>2];g[b+72>>2]=1.0/d*i*u;g[b+76>>2]=1.0/d*j*u;g[b+80>>2]=1.0/d*h*u;g[b+84>>2]=0.0;f=ui(b+4|0)|0;g[b+156>>2]=+g[b+156>>2]-+g[f+48>>2];g[b+160>>2]=+g[b+160>>2]-+g[f+52>>2];g[b+164>>2]=+g[b+164>>2]-+g[f+56>>2];f=ui(b+16|0)|0;g[b+172>>2]=+g[b+172>>2]-+g[f+48>>2];g[b+176>>2]=+g[b+176>>2]-+g[f+52>>2];g[b+180>>2]=+g[b+180>>2]-+g[f+56>>2];f=c[b+8>>2]|0;if(!f){f=c[b+4>>2]|0;if(!f)i=0.0;else{f=f+128|0;v=27}}else{f=f+404|0;v=27}if((v|0)==27)i=+g[f>>2];if((a[22432]|0)==0?Uz(22432)|0:0){f=22904;k=f+48|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(k|0))}f=c[b+8>>2]|0;if(!f){m=c[b+4>>2]|0;m=(m|0)==0?22904:m+180|0}else m=f+324|0;f=c[b+20>>2]|0;if(!f){f=c[b+16>>2]|0;if(!f)h=0.0;else{f=f+128|0;v=38}}else{f=f+404|0;v=38}if((v|0)==38)h=+g[f>>2];if((a[22432]|0)==0?Uz(22432)|0:0){f=22904;k=f+48|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(k|0))}f=c[b+20>>2]|0;if(!f){f=c[b+16>>2]|0;f=(f|0)==0?22904:f+180|0}else f=f+324|0;Uh(w+48|0,i,m,+g[b+156>>2],+g[b+160>>2],+g[b+164>>2]);Uh(w,h,f,+g[b+172>>2],+g[b+176>>2],+g[b+180>>2]);h=+g[w+48>>2]+ +g[w>>2];i=+g[w+48+4>>2]+ +g[w+4>>2];j=+g[w+48+8>>2]+ +g[w+8>>2];d=+g[w+48+16>>2]+ +g[w+16>>2];n=+g[w+48+20>>2]+ +g[w+20>>2];o=+g[w+48+24>>2]+ +g[w+24>>2];p=+g[w+48+32>>2]+ +g[w+32>>2];q=+g[w+48+36>>2]+ +g[w+36>>2];r=+g[w+48+40>>2]+ +g[w+40>>2];s=1.0/(j*(d*q-n*p)+(h*(n*r-o*q)+i*(o*p-d*r)));g[b+104>>2]=(n*r-o*q)*s;g[b+108>>2]=(j*q-i*r)*s;g[b+112>>2]=(i*o-j*n)*s;g[b+116>>2]=0.0;g[b+120>>2]=(o*p-d*r)*s;g[b+124>>2]=(h*r-j*p)*s;g[b+128>>2]=(j*d-h*o)*s;g[b+132>>2]=0.0;g[b+136>>2]=(d*q-n*p)*s;g[b+140>>2]=(i*p-h*q)*s;g[b+144>>2]=(h*n-i*d)*s;g[b+148>>2]=0.0;t=+g[b+68>>2];u=+g[b+72>>2];if(t>0.0){y=+g[b+76>>2];x=+g[b+80>>2];g[b+88>>2]=t*u*(n*r-o*q)*s+t*y*(j*q-i*r)*s+t*x*(i*o-j*n)*s;g[b+92>>2]=t*u*(o*p-d*r)*s+t*y*(h*r-j*p)*s+t*x*(j*d-h*o)*s;g[b+96>>2]=t*u*(d*q-n*p)*s+t*y*(i*p-h*q)*s+t*x*(h*n-i*d)*s;g[b+100>>2]=0.0;g[b+72>>2]=(1.0-t)*u;g[b+76>>2]=(1.0-t)*y;g[b+80>>2]=(1.0-t)*x;r=(1.0-t)*u;s=(1.0-t)*y;u=(1.0-t)*x;t=+(e|0);t=1.0/t;r=t*r;g[b+72>>2]=r;s=t*s;g[b+76>>2]=s;u=t*u;g[b+80>>2]=u;l=w;return}else{t=u;u=+g[b+76>>2];y=+g[b+80>>2];x=+(e|0);x=1.0/x;t=x*t;g[b+72>>2]=t;u=x*u;g[b+76>>2]=u;y=x*y;g[b+80>>2]=y;l=w;return}}function Ld(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0.0,k=0.0,l=0.0,m=0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0;o=c[a+192>>2]|0;n=+nb[c[(c[o>>2]|0)+48>>2]&15](o);o=c[a+772>>2]|0;if((o|0)>0){i=0;do{m=c[a+780>>2]|0;f=m+(i*104|0)+8|0;q=+g[f>>2];h=m+(i*104|0)+12|0;p=+g[h>>2];d=m+(i*104|0)+16|0;l=+g[d>>2];j=q*+g[b>>2]+p*+g[b+4>>2]+l*+g[b+8>>2]+ +g[b+48>>2];k=q*+g[b+16>>2]+p*+g[b+20>>2]+l*+g[b+24>>2]+ +g[b+52>>2];l=q*+g[b+32>>2]+p*+g[b+36>>2]+l*+g[b+40>>2]+ +g[b+56>>2];g[f>>2]=j;g[h>>2]=k;g[d>>2]=l;g[m+(i*104|0)+20>>2]=0.0;d=m+(i*104|0)+24|0;p=+g[d>>2];h=m+(i*104|0)+28|0;q=+g[h>>2];f=m+(i*104|0)+32|0;r=+g[f>>2];s=p*+g[b+16>>2]+q*+g[b+20>>2]+r*+g[b+24>>2]+ +g[b+52>>2];t=p*+g[b+32>>2]+q*+g[b+36>>2]+r*+g[b+40>>2]+ +g[b+56>>2];g[d>>2]=p*+g[b>>2]+q*+g[b+4>>2]+r*+g[b+8>>2]+ +g[b+48>>2];g[h>>2]=s;g[f>>2]=t;g[m+(i*104|0)+36>>2]=0.0;f=m+(i*104|0)+72|0;t=+g[f>>2];h=m+(i*104|0)+76|0;s=+g[h>>2];d=m+(i*104|0)+80|0;r=+g[d>>2];q=t*+g[b+16>>2]+s*+g[b+20>>2]+r*+g[b+24>>2];p=t*+g[b+32>>2]+s*+g[b+36>>2]+r*+g[b+40>>2];g[f>>2]=+g[b>>2]*t+ +g[b+4>>2]*s+ +g[b+8>>2]*r;g[h>>2]=q;g[d>>2]=p;g[m+(i*104|0)+84>>2]=0.0;m=c[m+(i*104|0)+96>>2]|0;d=Ag(a+988|0,m)|0;a:do if(d){h=c[a+996>>2]|0;if((h|0)<=-1){d=c[a+988>>2]|0;break}if(h){e=0;while(1){f=c[d+32>>2]|0;e=e+1|0;if(!f)break a;if((e|0)>=(h|0)){d=f;break}else d=f}}}else d=0;while(0);g[m>>2]=j-n;g[m+4>>2]=k-n;g[m+8>>2]=l-n;g[m+12>>2]=0.0;g[m+16>>2]=n+j;g[m+20>>2]=n+k;g[m+24>>2]=n+l;g[m+28>>2]=0.0;Pe(a+988|0,d,m);i=i+1|0}while((i|0)!=(o|0))}Eg(a);d=c[a+988>>2]|0;if(d){o=c[a+192>>2]|0;r=+nb[c[(c[o>>2]|0)+48>>2]&15](o);t=+g[d+4>>2]-r;s=+g[d+8>>2]-r;g[a+952>>2]=+g[d>>2]-r;g[a+956>>2]=t;g[a+960>>2]=s;g[a+964>>2]=0.0;s=r+ +g[d+20>>2];t=r+ +g[d+24>>2];g[a+968>>2]=r+ +g[d+16>>2];g[a+972>>2]=s;g[a+976>>2]=t;g[a+980>>2]=0.0;d=c[a+188>>2]|0;if(d|0){o=c[a+744>>2]|0;m=c[o+32>>2]|0;Zb[c[(c[m>>2]|0)+16>>2]&31](m,d,a+952|0,a+968|0,c[o+36>>2]|0)}}else{c[a+952>>2]=0;c[a+952+4>>2]=0;c[a+952+8>>2]=0;c[a+952+12>>2]=0;c[a+952+16>>2]=0;c[a+952+20>>2]=0;c[a+952+24>>2]=0;c[a+952+28>>2]=0}e=c[a+792>>2]|0;if((e|0)<=0){Vf(a);o=a+1148|0;c[o>>2]=c[b>>2];c[o+4>>2]=c[b+4>>2];c[o+8>>2]=c[b+8>>2];c[o+12>>2]=c[b+12>>2];o=b+16|0;m=a+1164|0;c[m>>2]=c[o>>2];c[m+4>>2]=c[o+4>>2];c[m+8>>2]=c[o+8>>2];c[m+12>>2]=c[o+12>>2];m=b+32|0;o=a+1180|0;c[o>>2]=c[m>>2];c[o+4>>2]=c[m+4>>2];c[o+8>>2]=c[m+8>>2];c[o+12>>2]=c[m+12>>2];o=b+48|0;b=a+1196|0;c[b>>2]=c[o>>2];c[b+4>>2]=c[o+4>>2];c[b+8>>2]=c[o+8>>2];c[b+12>>2]=c[o+12>>2];return}f=c[a+800>>2]|0;d=0;do{m=c[f+(d*52|0)+24>>2]|0;o=c[f+(d*52|0)+28>>2]|0;r=+g[m+8>>2]-+g[o+8>>2];s=+g[m+12>>2]-+g[o+12>>2];t=+g[m+16>>2]-+g[o+16>>2];t=+D(+(r*r+s*s+t*t));g[f+(d*52|0)+32>>2]=t;g[f+(d*52|0)+44>>2]=t*t;d=d+1|0}while((d|0)!=(e|0));d=0;do{g[f+(d*52|0)+40>>2]=(+g[(c[f+(d*52|0)+24>>2]|0)+88>>2]+ +g[(c[f+(d*52|0)+28>>2]|0)+88>>2])/+g[(c[f+(d*52|0)+4>>2]|0)+4>>2];d=d+1|0}while((d|0)!=(e|0));Vf(a);o=a+1148|0;c[o>>2]=c[b>>2];c[o+4>>2]=c[b+4>>2];c[o+8>>2]=c[b+8>>2];c[o+12>>2]=c[b+12>>2];o=b+16|0;m=a+1164|0;c[m>>2]=c[o>>2];c[m+4>>2]=c[o+4>>2];c[m+8>>2]=c[o+8>>2];c[m+12>>2]=c[o+12>>2];m=b+32|0;o=a+1180|0;c[o>>2]=c[m>>2];c[o+4>>2]=c[m+4>>2];c[o+8>>2]=c[m+8>>2];c[o+12>>2]=c[m+12>>2];o=b+48|0;b=a+1196|0;c[b>>2]=c[o>>2];c[b+4>>2]=c[o+4>>2];c[b+8>>2]=c[o+8>>2];c[b+12>>2]=c[o+12>>2];return}function Md(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=+i;var k=0,l=0,m=0.0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0;B=c[b+88>>2]|0;if((B|0)==(c[b+92>>2]|0)?(o=B|0?B<<1:1,(B|0)<(o|0)):0){if(!o){k=0;n=B}else{c[6995]=(c[6995]|0)+1;k=sc((o*152|3)+16|0)|0;if(!k)k=0;else{c[(k+4+15&-16)+-4>>2]=k;k=k+4+15&-16}n=c[b+88>>2]|0}if((n|0)>0){l=0;do{gi(k+(l*152|0)|0,(c[b+96>>2]|0)+(l*152|0)|0,152)|0;l=l+1|0}while((l|0)!=(n|0))}l=c[b+96>>2]|0;if(l|0){if(a[b+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[l+-4>>2]|0)}c[b+96>>2]=0}a[b+100>>0]=1;c[b+96>>2]=k;c[b+92>>2]=o;k=c[b+88>>2]|0}else k=B;c[b+88>>2]=k+1;A=c[b+96>>2]|0;c[A+(B*152|0)+140>>2]=h;c[A+(B*152|0)+16>>2]=0;c[A+(B*152|0)+16+4>>2]=0;c[A+(B*152|0)+16+8>>2]=0;c[A+(B*152|0)+16+12>>2]=0;g[A+(B*152|0)+48>>2]=-0.0;g[A+(B*152|0)+52>>2]=-0.0;g[A+(B*152|0)+56>>2]=-0.0;g[A+(B*152|0)+60>>2]=0.0;b=c[b+16>>2]|0;o=c[b+(e*244|0)+240>>2]|0;h=c[b+(f*244|0)+240>>2]|0;c[A+(B*152|0)+144>>2]=e;c[A+(B*152|0)+148>>2]=f;g[A+(B*152|0)+104>>2]=i;c[A+(B*152|0)+132>>2]=0;g[A+(B*152|0)+100>>2]=0.0;g[A+(B*152|0)+96>>2]=0.0;x=-+g[d>>2];y=-+g[d+4>>2];z=-+g[d+8>>2];g[A+(B*152|0)>>2]=x;g[A+(B*152|0)+4>>2]=y;g[A+(B*152|0)+8>>2]=z;g[A+(B*152|0)+12>>2]=0.0;if(o|0){k=(g[j>>2]=(+g[o+324>>2]*x+ +g[o+328>>2]*y+ +g[o+332>>2]*z)*+g[o+604>>2],c[j>>2]|0);l=(g[j>>2]=(+g[o+340>>2]*x+ +g[o+344>>2]*y+ +g[o+348>>2]*z)*+g[o+608>>2],c[j>>2]|0);n=(g[j>>2]=(+g[o+356>>2]*x+ +g[o+360>>2]*y+ +g[o+364>>2]*z)*+g[o+612>>2],c[j>>2]|0)}else{k=0;l=0;n=0}c[A+(B*152|0)+64>>2]=k;c[A+(B*152|0)+68>>2]=l;c[A+(B*152|0)+72>>2]=n;g[A+(B*152|0)+76>>2]=0.0;u=+g[d>>2];v=+g[d+4>>2];w=+g[d+8>>2];d=c[d+12>>2]|0;g[A+(B*152|0)+32>>2]=u;g[A+(B*152|0)+36>>2]=v;g[A+(B*152|0)+40>>2]=w;c[A+(B*152|0)+44>>2]=d;if(h|0){k=(g[j>>2]=(u*+g[h+324>>2]+v*+g[h+328>>2]+w*+g[h+332>>2])*+g[h+604>>2],c[j>>2]|0);l=(g[j>>2]=(u*+g[h+340>>2]+v*+g[h+344>>2]+w*+g[h+348>>2])*+g[h+608>>2],c[j>>2]|0);n=(g[j>>2]=(u*+g[h+356>>2]+v*+g[h+360>>2]+w*+g[h+364>>2])*+g[h+612>>2],c[j>>2]|0)}else{k=0;l=0;n=0}c[A+(B*152|0)+80>>2]=k;c[A+(B*152|0)+84>>2]=l;c[A+(B*152|0)+88>>2]=n;g[A+(B*152|0)+92>>2]=0.0;if(o|0){m=+g[o+324>>2]*x+ +g[o+328>>2]*y+ +g[o+332>>2]*z;p=+g[o+340>>2]*x+ +g[o+344>>2]*y+ +g[o+348>>2]*z;q=+g[o+356>>2]*x+ +g[o+360>>2]*y+ +g[o+364>>2]*z}else{m=0.0;p=0.0;q=0.0}if(h|0){r=+g[h+324>>2]*u+ +g[h+328>>2]*v+ +g[h+332>>2]*w;s=u*+g[h+340>>2]+v*+g[h+344>>2]+w*+g[h+348>>2];t=u*+g[h+356>>2]+v*+g[h+360>>2]+w*+g[h+364>>2]}else{r=0.0;s=0.0;t=0.0}s=1.0/(m*x+p*y+q*z+0.0+(r*u+s*v+t*w));g[A+(B*152|0)+108>>2]=s;if(o|0){p=+g[b+(e*244|0)+192>>2];q=+g[b+(e*244|0)+196>>2];r=+g[b+(e*244|0)+200>>2];m=(+g[b+(e*244|0)+176>>2]+ +g[b+(e*244|0)+208>>2])*0.0+(+g[b+(e*244|0)+180>>2]+ +g[b+(e*244|0)+212>>2])*0.0+(+g[b+(e*244|0)+184>>2]+ +g[b+(e*244|0)+216>>2])*0.0}else{p=0.0;q=0.0;r=0.0;m=0.0}m=m+(p*x+q*y+r*z);if(!h){t=0.0;x=0.0;z=0.0;y=-0.0;u=t*u;x=x*v;x=u+x;z=z*w;z=x+z;z=y+z;z=m+z;z=0.0-z;z=s*z;f=A+(B*152|0)+112|0;g[f>>2]=z;f=A+(B*152|0)+116|0;g[f>>2]=0.0;z=-i;f=A+(B*152|0)+120|0;g[f>>2]=z;B=A+(B*152|0)+124|0;g[B>>2]=i;return}t=+g[b+(f*244|0)+192>>2];x=+g[b+(f*244|0)+196>>2];z=+g[b+(f*244|0)+200>>2];y=(+g[b+(f*244|0)+176>>2]+ +g[b+(f*244|0)+208>>2])*-0.0+(+g[b+(f*244|0)+180>>2]+ +g[b+(f*244|0)+212>>2])*-0.0+(+g[b+(f*244|0)+184>>2]+ +g[b+(f*244|0)+216>>2])*-0.0;u=t*u;x=x*v;x=u+x;z=z*w;z=x+z;z=y+z;z=m+z;z=0.0-z;z=s*z;f=A+(B*152|0)+112|0;g[f>>2]=z;f=A+(B*152|0)+116|0;g[f>>2]=0.0;z=-i;f=A+(B*152|0)+120|0;g[f>>2]=z;B=A+(B*152|0)+124|0;g[B>>2]=i;return}function Nd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0.0,s=0.0,t=0;t=l;l=l+48|0;switch(c[b+4>>2]|0){case 8:{c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;l=t;return}case 0:{n=+g[b+32>>2];r=+g[b+36>>2];r=+g[d+4>>2]>=0.0?r:-r;s=+g[b+40>>2];s=+g[d+8>>2]>=0.0?s:-s;g[a>>2]=+g[d>>2]>=0.0?n:-n;g[a+4>>2]=r;g[a+8>>2]=s;g[a+12>>2]=0.0;l=t;return}case 1:{k=+g[d>>2];m=+g[d+4>>2];n=+g[d+8>>2];r=k*+g[b+60>>2]+m*+g[b+60+4>>2]+n*+g[b+60+8>>2];s=k*+g[b+60+16>>2]+m*+g[b+60+20>>2]+n*+g[b+60+24>>2];n=k*+g[b+60+32>>2]+m*+g[b+60+36>>2]+n*+g[b+60+40>>2];g[t+32>>2]=r;g[t+32+4>>2]=s;g[t+32+8>>2]=n;g[t+32+12>>2]=0.0;o=+g[t+32+((r>2]>2]|0;q=c[b+60+(o<<4)+8>>2]|0;c[a>>2]=c[b+60+(o<<4)>>2];c[a+4>>2]=p;c[a+8>>2]=q;g[a+12>>2]=0.0;l=t;return}case 13:{c[t+32>>2]=c[b+32>>2];c[t+32+4>>2]=c[b+32+4>>2];c[t+32+8>>2]=c[b+32+8>>2];c[t+32+12>>2]=c[b+32+12>>2];c[t+16>>2]=c[d>>2];e=c[d+4>>2]|0;c[t+16+4>>2]=e;q=c[d+8>>2]|0;c[t+16+8>>2]=q;g[t+16+12>>2]=0.0;b=c[b+56>>2]|0;f=(c[j>>2]=q,+g[j>>2]);switch(b|0){case 2:{d=0;o=2;p=1;f=(c[j>>2]=e,+g[j>>2]);break}case 1:{d=0;o=1;p=2;break}default:{d=1;o=0;p=2}}r=+g[t+32+(d<<2)>>2];i=+g[t+32+(b<<2)>>2];n=+g[t+16+(d<<2)>>2];m=+D(+(n*n+f*f));h=+g[t+16+(o<<2)>>2];if(m!=0.0){k=r/m*f;e=t;h=h<0.0?-i:i;f=n*(r/m)}else{k=0.0;e=t;h=h<0.0?-i:i;f=r}g[t+(d<<2)>>2]=f;g[t+(o<<2)>>2]=h;g[t+(p<<2)>>2]=k;c[a>>2]=c[e>>2];c[a+4>>2]=c[t+4>>2];c[a+8>>2]=c[t+8>>2];g[a+12>>2]=0.0;l=t;return}case 10:{f=+g[d>>2];h=+g[d+4>>2];i=+g[d+8>>2];e=c[b+56>>2]|0;r=+g[b+32+(e<<2)>>2];if(f*f+h*h+i*i<1.4210854715202004e-14){s=1.0;n=0.0;m=0.0}else{m=1.0/+D(+(f*f+h*h+i*i));s=f*m;n=h*m;m=i*m}c[t+32>>2]=0;c[t+32+4>>2]=0;c[t+32+8>>2]=0;c[t+32+12>>2]=0;g[t+32+(e<<2)>>2]=r;k=+g[t+32>>2];h=+g[t+32+4>>2];f=+g[t+32+8>>2];i=s*k+n*h+m*f;if(i>-999999984306749440.0){p=(g[j>>2]=f,c[j>>2]|0);q=(g[j>>2]=h,c[j>>2]|0);o=(g[j>>2]=k,c[j>>2]|0)}else{i=-999999984306749440.0;o=0;p=0;q=0}c[t+32>>2]=0;c[t+32+4>>2]=0;c[t+32+8>>2]=0;c[t+32+12>>2]=0;g[t+32+(e<<2)>>2]=-r;k=+g[t+32>>2];r=+g[t+32+4>>2];f=+g[t+32+8>>2];e=s*k+n*r+m*f>i;b=(g[j>>2]=k,c[j>>2]|0);d=(g[j>>2]=r,c[j>>2]|0);p=e?(g[j>>2]=f,c[j>>2]|0):p;c[a>>2]=e?b:o;c[a+4>>2]=e?d:q;c[a+8>>2]=p;g[a+12>>2]=0.0;l=t;return}case 5:{p=c[b+96>>2]|0;o=c[b+100>>2]|0;r=+g[b+16>>2];s=+g[b+20>>2];n=+g[b+24>>2];k=+g[d>>2]*r;m=+g[d+4>>2]*s;h=+g[d+8>>2]*n;if((o|0)>0){e=-1;b=0;f=-3402823466385288598117041.0e14;while(1){i=k*+g[p+(b<<4)>>2]+m*+g[p+(b<<4)+4>>2]+h*+g[p+(b<<4)+8>>2];d=i>f;e=d?b:e;b=b+1|0;if((b|0)==(o|0))break;else f=d?i:f}}else e=-1;m=s*+g[p+(e<<4)+4>>2];s=n*+g[p+(e<<4)+8>>2];g[a>>2]=r*+g[p+(e<<4)>>2];g[a+4>>2]=m;g[a+8>>2]=s;g[a+12>>2]=0.0;l=t;return}case 4:{p=c[b+108>>2]|0;o=c[b+100>>2]|0;r=+g[b+16>>2];s=+g[b+20>>2];n=+g[b+24>>2];k=+g[d>>2]*r;m=+g[d+4>>2]*s;h=+g[d+8>>2]*n;if((o|0)>0){e=-1;b=0;f=-3402823466385288598117041.0e14;while(1){i=k*+g[p+(b<<4)>>2]+m*+g[p+(b<<4)+4>>2]+h*+g[p+(b<<4)+8>>2];d=i>f;e=d?b:e;b=b+1|0;if((b|0)==(o|0))break;else f=d?i:f}}else e=-1;m=s*+g[p+(e<<4)+4>>2];s=n*+g[p+(e<<4)+8>>2];g[a>>2]=r*+g[p+(e<<4)>>2];g[a+4>>2]=m;g[a+8>>2]=s;g[a+12>>2]=0.0;l=t;return}default:{Sb[c[(c[b>>2]|0)+68>>2]&127](a,b,d);l=t;return}}}function Od(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0,k=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,z=0.0,A=0.0,B=0;x=l;l=l+64|0;if((h|0)>0){b=0;j=0;do{w=c[f+(j<<2)>>2]|0;b=(w|0)>(b|0)?w:b;j=j+1|0}while((j|0)<(h*3|0))}else b=0;t=b+1|0;k=P(t,t)|0;if(!k)j=0;else{c[6995]=(c[6995]|0)+1;j=sc(k+19|0)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}Yk(j|0,0,k|0)|0}if((b|0)>-1){c[6995]=(c[6995]|0)+1;b=sc((t<<4|3)+16|0)|0;if(!b)m=0;else{c[(b+4+15&-16)+-4>>2]=b;m=b+4+15&-16}b=0;do{w=m+(b<<4)|0;c[w>>2]=c[x>>2];c[w+4>>2]=c[x+4>>2];c[w+8>>2]=c[x+8>>2];c[w+12>>2]=c[x+12>>2];b=b+1|0}while((b|0)!=(t|0));b=0;k=0;while(1){v=c[e+(k+1<<2)>>2]|0;w=c[e+(k+2<<2)>>2]|0;c[m+(b<<4)>>2]=c[e+(k<<2)>>2];c[m+(b<<4)+4>>2]=v;c[m+(b<<4)+8>>2]=w;g[m+(b<<4)+12>>2]=0.0;k=k+3|0;if((k|0)>=(t*3|0)){w=m;v=m;break}else b=b+1|0}}else{w=0;v=0}c[6995]=(c[6995]|0)+1;b=sc(1271)|0;if(!b)u=0;else{c[(b+4+15&-16)+-4>>2]=b;u=b+4+15&-16}Bc(u,d,t,w,0);if((h|0)>0){d=u+780|0;n=u+792|0;o=u+800|0;p=u+984|0;e=0;do{q=c[f+(e<<2)>>2]|0;r=c[f+(e+1<<2)>>2]|0;s=c[f+(e+2<<2)>>2]|0;m=P(q,t)|0;b=j+(m+s)|0;if(!(a[b>>0]|0)){a[b>>0]=1;a[j+((P(s,t)|0)+q)>>0]=1;B=c[d>>2]|0;Xh(u,0);k=(c[n>>2]|0)+-1|0;b=c[o>>2]|0;c[b+(k*52|0)+24>>2]=B+(s*104|0);c[b+(k*52|0)+28>>2]=B+(q*104|0);A=+g[B+(s*104|0)+8>>2]-+g[B+(q*104|0)+8>>2];z=+g[B+(s*104|0)+12>>2]-+g[B+(q*104|0)+12>>2];y=+g[B+(s*104|0)+16>>2]-+g[B+(q*104|0)+16>>2];g[b+(k*52|0)+32>>2]=+D(+(A*A+z*z+y*y));a[p>>0]=1}k=P(r,t)|0;b=j+(k+q)|0;if(!(a[b>>0]|0)){a[b>>0]=1;a[j+(m+r)>>0]=1;b=c[d>>2]|0;Xh(u,0);B=(c[n>>2]|0)+-1|0;m=c[o>>2]|0;c[m+(B*52|0)+24>>2]=b+(q*104|0);c[m+(B*52|0)+28>>2]=b+(r*104|0);y=+g[b+(q*104|0)+8>>2]-+g[b+(r*104|0)+8>>2];z=+g[b+(q*104|0)+12>>2]-+g[b+(r*104|0)+12>>2];A=+g[b+(q*104|0)+16>>2]-+g[b+(r*104|0)+16>>2];g[m+(B*52|0)+32>>2]=+D(+(y*y+z*z+A*A));a[p>>0]=1}b=j+((P(s,t)|0)+r)|0;if(!(a[b>>0]|0)){a[b>>0]=1;a[j+(k+s)>>0]=1;k=c[d>>2]|0;Xh(u,0);B=(c[n>>2]|0)+-1|0;m=c[o>>2]|0;c[m+(B*52|0)+24>>2]=k+(r*104|0);c[m+(B*52|0)+28>>2]=k+(s*104|0);y=+g[k+(r*104|0)+8>>2]-+g[k+(s*104|0)+8>>2];z=+g[k+(r*104|0)+12>>2]-+g[k+(s*104|0)+12>>2];A=+g[k+(r*104|0)+16>>2]-+g[k+(s*104|0)+16>>2];g[m+(B*52|0)+32>>2]=+D(+(y*y+z*z+A*A));a[p>>0]=1}bg(u,q,r,s,0);e=e+3|0}while((e|0)<(h*3|0))}if(i){m=c[u+792>>2]|0;if((m|0)>0){e=u+800|0;b=243703;k=0;do{d=c[e>>2]|0;n=d+(k*52|0)|0;b=(P(b,1664525)|0)+1013904223|0;o=x;p=n;q=o+52|0;do{c[o>>2]=c[p>>2];o=o+4|0;p=p+4|0}while((o|0)<(q|0));o=n;p=d+(((b>>>0)%(m>>>0)|0)*52|0)|0;q=o+52|0;do{c[o>>2]=c[p>>2];o=o+4|0;p=p+4|0}while((o|0)<(q|0));o=d+(((b>>>0)%(m>>>0)|0)*52|0)|0;p=x;q=o+52|0;do{c[o>>2]=c[p>>2];o=o+4|0;p=p+4|0}while((o|0)<(q|0));k=k+1|0}while((k|0)!=(m|0))}else b=243703;d=c[u+812>>2]|0;if((d|0)>0){n=u+820|0;k=0;do{e=c[n>>2]|0;m=e+(k*44|0)|0;b=(P(b,1664525)|0)+1013904223|0;e=e+(((b>>>0)%(d>>>0)|0)*44|0)|0;o=x;p=m;q=o+44|0;do{c[o>>2]=c[p>>2];o=o+4|0;p=p+4|0}while((o|0)<(q|0));o=m;p=e;q=o+44|0;do{c[o>>2]=c[p>>2];o=o+4|0;p=p+4|0}while((o|0)<(q|0));o=e;p=x;q=o+44|0;do{c[o>>2]=c[p>>2];o=o+4|0;p=p+4|0}while((o|0)<(q|0));k=k+1|0}while((k|0)!=(d|0))}}if(!((w|0)==0|(v|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[v+-4>>2]|0)}if(!j){l=x;return u|0}c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);l=x;return u|0}function Pd(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,h=0.0,i=0,k=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0,G=0,H=0,I=0,J=0,K=0;H=l;l=l+96|0;d=c[a+216>>2]|0;if(+g[d+4>>2]==0.0){G=0;l=H;return G|0}G=c[b>>2]|0;if(!(zb[c[(c[d>>2]|0)+8>>2]&31](d,c[G+188>>2]|0)|0)){G=1;l=H;return G|0}b=c[G+192>>2]|0;F=c[a+216>>2]|0;if((c[b+4>>2]|0)!=32){c[H+32>>2]=0;c[H+32+4>>2]=b;c[H+32+8>>2]=G;c[H+32+12>>2]=G+4;c[H+32+16>>2]=-1;c[H+32+20>>2]=-1;ad(a+68|0,a+132|0,H+32|0,F);G=1;l=H;return G|0}if((G|0)==0?1:(c[G+252>>2]|0)!=8){G=1;l=H;return G|0}if(c[G+812>>2]|0?(c[G+1028>>2]|0)==0:0)$g(G);B=+g[a+180>>2]-+g[a+116>>2];C=+g[a+184>>2]-+g[a+120>>2];E=+g[a+188>>2]-+g[a+124>>2];b=c[G+1028>>2]|0;if(!b){s=c[G+812>>2]|0;if((s|0)>0){r=c[G+820>>2]|0;q=0;d=0;b=-1;i=1065353216;m=0;e=1.0;f=1.0;do{K=c[r+(q*44|0)+8>>2]|0;J=c[r+(q*44|0)+12>>2]|0;I=c[r+(q*44|0)+16>>2]|0;h=+Gh(a+116|0,B,C,E,+g[K+8>>2],+g[K+12>>2],+g[K+16>>2],+g[J+8>>2],+g[J+12>>2],+g[J+16>>2],+g[I+8>>2],+g[I+12>>2],+g[I+16>>2],f);if(h>0.0){d=d+1|0;b=q;i=(g[j>>2]=h,c[j>>2]|0);m=3;e=h;f=h}q=q+1|0}while((q|0)!=(s|0))}else{d=0;b=-1;i=1065353216;m=0;e=1.0}}else{c[H+32>>2]=3396;c[H+32+4>>2]=c[a+116>>2];c[H+32+4+4>>2]=c[a+116+4>>2];c[H+32+4+8>>2]=c[a+116+8>>2];c[H+32+4+12>>2]=c[a+116+12>>2];g[H+32+36>>2]=B;g[H+32+40>>2]=C;g[H+32+44>>2]=E;g[H+32+48>>2]=0.0;c[H+32+20>>2]=c[a+180>>2];c[H+32+20+4>>2]=c[a+180+4>>2];c[H+32+20+8>>2]=c[a+180+8>>2];c[H+32+20+12>>2]=c[a+180+12>>2];c[H+32+52>>2]=1065353216;c[H+32+56>>2]=0;c[H+32+60>>2]=0;Ue(b,a+116|0,a+180|0,H+32|0);b=c[H+32+56>>2]|0;if(!b){d=0;b=-1;i=1065353216;m=0;e=1.0}else{K=c[H+32+52>>2]|0;d=1;b=(b-(c[G+820>>2]|0)|0)/44|0;i=K;m=3;e=(c[j>>2]=K,+g[j>>2])}}s=c[G+832>>2]|0;if((s|0)>0){r=c[G+840>>2]|0;q=0;f=(c[j>>2]=i,+g[j>>2]);while(1){K=c[r+(q*104|0)+8>>2]|0;v=+g[K+8>>2];y=+g[K+12>>2];A=+g[K+16>>2];K=c[r+(q*104|0)+12>>2]|0;k=+g[K+8>>2];p=+g[K+12>>2];u=+g[K+16>>2];K=c[r+(q*104|0)+16>>2]|0;w=+g[K+8>>2];x=+g[K+12>>2];z=+g[K+16>>2];h=+Gh(a+116|0,B,C,E,v,y,A,k,p,u,w,x,z,f);if(h>0.0){d=d+1|0;b=q;i=4;e=h;f=h}else i=m;K=c[r+(q*104|0)+20>>2]|0;n=+g[K+8>>2];o=+g[K+12>>2];t=+g[K+16>>2];h=+Gh(a+116|0,B,C,E,v,y,A,k,p,u,n,o,t,f);if(h>0.0){d=d+1|0;b=q;i=4;e=h;f=h}h=+Gh(a+116|0,B,C,E,k,p,u,w,x,z,n,o,t,f);if(h>0.0){d=d+1|0;b=q;i=4;f=h;e=h}h=+Gh(a+116|0,B,C,E,v,y,A,w,x,z,n,o,t,f);if(h>0.0){d=d+1|0;b=q;i=4;e=h;f=h}q=q+1|0;if((q|0)==(s|0)){p=e;break}else m=i}}else{i=m;p=e}if(!d){K=1;l=H;return K|0}if(!(p<=+g[F+4>>2])){K=1;l=H;return K|0}c[H+32>>2]=0;c[H+32+4>>2]=b;k=+g[a+180>>2]-+g[a+116>>2];n=+g[a+184>>2]-+g[a+120>>2];o=+g[a+188>>2]-+g[a+124>>2];e=1.0/+D(+(k*k+n*n+o*o));if((i|0)==3){d=c[G+820>>2]|0;e=+g[d+(b*44|0)+20>>2];h=+g[d+(b*44|0)+24>>2];f=+g[d+(b*44|0)+28>>2];if(k*e+n*h+o*f>0.0){k=-e;h=-h;f=-f;e=0.0}else{k=e;e=+g[d+(b*44|0)+32>>2]}}else{k=-(k*e);h=-(n*e);f=-(o*e);e=0.0}c[H>>2]=G;c[H+4>>2]=H+32;g[H+8>>2]=k;g[H+12>>2]=h;g[H+16>>2]=f;g[H+20>>2]=e;g[H+24>>2]=p;+qb[c[(c[F>>2]|0)+12>>2]&31](F,H,1);K=1;l=H;return K|0}function Qd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0;if(a[b+165>>0]|0){h=c[b+88>>2]|0;a:do if((h|0)>0&e){f=c[b+96>>2]|0;j=+g[d>>2];k=+g[d+4>>2];l=+g[d+8>>2];m=+g[b+168>>2];e=0;while(1){s=+g[f+(e<<4)>>2]-j;r=+g[f+(e<<4)+4>>2]-k;q=+g[f+(e<<4)+8>>2]-l;if(s*s+r*r+q*q<=m)break;e=e+1|0;if((e|0)>=(h|0))break a}return e|0}while(0);p=(c[b+32>>2]|0)+12|0;c[p>>2]=(c[p>>2]|0)+1;if((h|0)==(c[b+92>>2]|0)?(i=h|0?h<<1:1,(h|0)<(i|0)):0){if(!i)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((i<<4|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}h=c[b+88>>2]|0}if((h|0)>0){f=0;do{p=e+(f<<4)|0;o=(c[b+96>>2]|0)+(f<<4)|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];f=f+1|0}while((f|0)!=(h|0))}f=c[b+96>>2]|0;if(f|0){if(a[b+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+96>>2]=0}a[b+100>>0]=1;c[b+96>>2]=e;c[b+92>>2]=i;e=c[b+88>>2]|0}else e=h;p=(c[b+96>>2]|0)+(e<<4)|0;c[p>>2]=c[d>>2];c[p+4>>2]=c[d+4>>2];c[p+8>>2]=c[d+8>>2];c[p+12>>2]=c[d+12>>2];d=c[b+88>>2]|0;c[b+88>>2]=d+1;c[(c[b+32>>2]|0)+16>>2]=c[b+96>>2];return d|0}h=c[b+108>>2]|0;b:do if((h|0)>0&e){f=c[b+116>>2]|0;j=+g[d>>2];k=+g[d+4>>2];l=+g[d+8>>2];m=+g[b+168>>2];e=0;while(1){q=+g[f+(e<<2)>>2]-j;r=+g[f+(e+1<<2)>>2]-k;s=+g[f+(e+2<<2)>>2]-l;i=e+3|0;if(q*q+r*r+s*s<=m)break;if((i|0)<(h|0))e=i;else break b}d=(e|0)/3|0;return d|0}while(0);e=c[b+112>>2]|0;if((h|0)==(e|0)){n=h|0?h<<1:1;if((h|0)<(n|0)){if(!n)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((n<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}h=c[b+108>>2]|0}i=c[b+116>>2]|0;if((h|0)<=0)if(!i)f=b+120|0;else p=34;else{f=0;do{c[e+(f<<2)>>2]=c[i+(f<<2)>>2];f=f+1|0}while((f|0)!=(h|0));p=34}if((p|0)==34){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[b+116>>2]=0;f=b+120|0}a[f>>0]=1;c[b+116>>2]=e;c[b+112>>2]=n;f=c[b+108>>2]|0;i=n}else{f=h;i=h}}else{f=h;i=e}h=c[b+116>>2]|0;c[h+(f<<2)>>2]=c[d>>2];e=f+1|0;c[b+108>>2]=e;if((e|0)==(i|0)){n=i|0?i<<1:1;if((i|0)<(n|0)){if(!n)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((n<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}i=c[b+108>>2]|0;h=c[b+116>>2]|0}if((i|0)<=0)if(!h)f=b+120|0;else p=48;else{f=0;do{c[e+(f<<2)>>2]=c[h+(f<<2)>>2];f=f+1|0}while((f|0)!=(i|0));p=48}if((p|0)==48){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+116>>2]=0;f=b+120|0}a[f>>0]=1;c[b+116>>2]=e;c[b+112>>2]=n;o=e;f=c[b+108>>2]|0;i=n}else{o=h;f=i;e=h}}else{o=h;f=e;e=h}c[o+(f<<2)>>2]=c[d+4>>2];f=f+1|0;c[b+108>>2]=f;if((f|0)==(i|0)){n=i|0?i<<1:1;if((i|0)<(n|0)){if(!n){e=0;h=o}else{c[6995]=(c[6995]|0)+1;e=sc((n<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}i=c[b+108>>2]|0;h=c[b+116>>2]|0}if((i|0)<=0)if(!h)f=b+120|0;else p=62;else{f=0;do{c[e+(f<<2)>>2]=c[h+(f<<2)>>2];f=f+1|0}while((f|0)!=(i|0));p=62}if((p|0)==62){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+116>>2]=0;f=b+120|0}a[f>>0]=1;c[b+116>>2]=e;c[b+112>>2]=n;h=e;f=c[b+108>>2]|0}else{h=o;f=i}}else h=o;c[h+(f<<2)>>2]=c[d+8>>2];d=f+1|0;c[b+108>>2]=d;b=c[b+32>>2]|0;c[b+12>>2]=(c[b+12>>2]|0)+1;c[b+16>>2]=e;d=((d|0)/3|0)+-1|0;return d|0}function Rd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,m=0,n=0.0,o=0.0;m=l;l=l+400|0;f=c[d+36>>2]|0;d=c[e+36>>2]|0;e=c[b+24>>2]|0;if(((e|0)==(c[b+28>>2]|0)?c[e+1132>>2]|0:0)?(j=(P(c[d+380>>2]|0,c[e+1112>>2]|0)|0)+(c[f+380>>2]|0)|0,a[(c[e+1140>>2]|0)+j>>0]|0):0){c[5773]=(c[5773]|0)+1;l=m;return}c[m+332+4>>2]=35;c[m+332+8>>2]=0;c[m+332+12>>2]=-1;c[m+332+16>>2]=1065353216;c[m+332+20>>2]=1065353216;c[m+332+24>>2]=1065353216;g[m+332+28>>2]=0.0;c[m+332>>2]=3644;c[m+332+56>>2]=f;g[m+332+48>>2]=0.0;c[m+272+4>>2]=35;c[m+272+8>>2]=0;c[m+272+12>>2]=-1;c[m+272+16>>2]=1065353216;c[m+272+20>>2]=1065353216;c[m+272+24>>2]=1065353216;g[m+272+28>>2]=0.0;c[m+272>>2]=3644;c[m+272+56>>2]=d;g[m+272+48>>2]=0.0;if((a[22384]|0)==0?Uz(22384)|0:0){if((a[22392]|0)==0?Uz(22392)|0:0){c[5698]=1065353216;c[5699]=0;c[5700]=0;c[5701]=0;c[5702]=0;c[5703]=1065353216;c[5704]=0;c[5705]=0;c[5706]=0;c[5707]=0;c[5708]=1065353216;g[5709]=0.0}c[5682]=c[5698];c[5683]=c[5699];c[5684]=c[5700];c[5685]=c[5701];c[5686]=c[5702];c[5687]=c[5703];c[5688]=c[5704];c[5689]=c[5705];c[5690]=c[5706];c[5691]=c[5707];c[5692]=c[5708];c[5693]=c[5709];c[5694]=0;c[5695]=0;c[5696]=0;c[5697]=0}if((a[22384]|0)==0?Uz(22384)|0:0){if((a[22392]|0)==0?Uz(22392)|0:0){c[5698]=1065353216;c[5699]=0;c[5700]=0;c[5701]=0;c[5702]=0;c[5703]=1065353216;c[5704]=0;c[5705]=0;c[5706]=0;c[5707]=0;c[5708]=1065353216;g[5709]=0.0}c[5682]=c[5698];c[5683]=c[5699];c[5684]=c[5700];c[5685]=c[5701];c[5686]=c[5702];c[5687]=c[5703];c[5688]=c[5704];c[5689]=c[5705];c[5690]=c[5706];c[5691]=c[5707];c[5692]=c[5708];c[5693]=c[5709];c[5694]=0;c[5695]=0;c[5696]=0;c[5697]=0}o=+g[f+232>>2]-+g[d+232>>2];n=+g[f+236>>2]-+g[d+236>>2];g[m>>2]=+g[f+228>>2]-+g[d+228>>2];g[m+4>>2]=o;g[m+8>>2]=n;g[m+12>>2]=0.0;if(!(!(Gd(m+332|0,22728,m+272|0,22728,m,m+216|0)|0)?!(Hc(m+332|0,22728,m+272|0,22728,m,m+216|0,0)|0):0))h=19;if((h|0)==19?(c[m+4>>2]=0,c[m+4+4>>2]=0,c[m+4+8>>2]=0,c[m+4+12>>2]=0,c[m+4+16>>2]=0,c[m+4+20>>2]=0,a[m+152>>0]=0,c[m>>2]=3432,zd(b,m+216|0,f,0,0,d,0,0,m)|0):0){c[6995]=(c[6995]|0)+1;d=sc(235)|0;if(!d)j=0;else{c[(d+4+15&-16)+-4>>2]=d;j=d+4+15&-16}e=j+4|0;d=j+152|0;Yk(e|0,0,212)|0;c[j>>2]=3432;f=m+4|0;h=e+100|0;do{c[e>>2]=c[f>>2];e=e+4|0;f=f+4|0}while((e|0)<(h|0));e=j+104|0;c[e>>2]=c[m+104>>2];c[e+4>>2]=c[m+104+4>>2];c[e+8>>2]=c[m+104+8>>2];c[e+12>>2]=c[m+104+12>>2];e=j+120|0;c[e>>2]=c[m+120>>2];c[e+4>>2]=c[m+120+4>>2];c[e+8>>2]=c[m+120+8>>2];c[e+12>>2]=c[m+120+12>>2];e=j+136|0;c[e>>2]=c[m+136>>2];c[e+4>>2]=c[m+136+4>>2];c[e+8>>2]=c[m+136+8>>2];c[e+12>>2]=c[m+136+12>>2];a[d>>0]=a[m+152>>0]|0;e=j+156|0;f=m+156|0;h=e+60|0;do{c[e>>2]=c[f>>2];e=e+4|0;f=f+4|0}while((e|0)<(h|0));h=c[b+24>>2]|0;i=j;d=c[h+912>>2]|0;if((d|0)==(c[h+916>>2]|0)?(k=d|0?d<<1:1,(d|0)<(k|0)):0){if(!k)f=0;else{c[6995]=(c[6995]|0)+1;d=sc((k<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=d;d=c[h+912>>2]|0}if((d|0)>0){e=0;do{c[f+(e<<2)>>2]=c[(c[h+920>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(d|0))}e=c[h+920>>2]|0;if(e){if(a[h+924>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[h+912>>2]|0}c[h+920>>2]=0}a[h+924>>0]=1;c[h+920>>2]=f;c[h+916>>2]=k}c[(c[h+920>>2]|0)+(d<<2)>>2]=i;c[h+912>>2]=d+1;i=c[b+24>>2]|0;k=c[b+28>>2]|0;n=+g[i+408>>2];o=+g[k+408>>2];b=j+64|0;g[b>>2]=+g[b>>2]*(n>o?n:o);b=j+68|0;g[b>>2]=+g[b>>2]*(+g[i+420>>2]+ +g[k+420>>2])*.5}l=m;return}function Sd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,h=0,i=0,j=0,k=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0;p=l;l=l+128|0;c[b+72>>2]=(c[b+72>>2]|0)+1;c[p>>2]=c[d>>2];c[p+4>>2]=c[d+4>>2];c[p+8>>2]=c[d+8>>2];c[p+12>>2]=c[d+12>>2];c[p+16>>2]=c[d+16>>2];c[p+16+4>>2]=c[d+16+4>>2];c[p+16+8>>2]=c[d+16+8>>2];c[p+16+12>>2]=c[d+16+12>>2];c[p+32>>2]=c[d+32>>2];c[p+32+4>>2]=c[d+32+4>>2];c[p+32+8>>2]=c[d+32+8>>2];c[p+32+12>>2]=c[d+32+12>>2];c[p+48>>2]=c[d+48>>2];c[p+48+4>>2]=c[d+48+4>>2];c[p+48+8>>2]=c[d+48+8>>2];c[p+48+12>>2]=c[d+48+12>>2];n=c[e+4>>2]|0;o=+nb[c[(c[e>>2]|0)+48>>2]&15](e);Vb[c[(c[e>>2]|0)+8>>2]&127](e,d,p+112|0,p+96|0);f=+g[p+112>>2];if(+g[b+36>>2]>f)g[b+36>>2]=f;f=+g[p+96>>2];if(+g[b+52>>2]>2]=f;f=+g[p+112+4>>2];if(+g[b+40>>2]>f)g[b+40>>2]=f;f=+g[p+96+4>>2];if(+g[b+56>>2]>2]=f;f=+g[p+112+8>>2];if(+g[b+44>>2]>f)g[b+44>>2]=f;f=+g[p+96+8>>2];if(+g[b+60>>2]>2]=f;k=c[b+68>>2]|0;if(!k){k=b+20|0;j=0}else{c[p+64>>2]=c[p+112>>2];c[p+64+4>>2]=c[p+112+4>>2];c[p+64+8>>2]=c[p+112+8>>2];c[p+64+12>>2]=c[p+112+12>>2];c[p+64+16>>2]=c[p+96>>2];c[p+64+16+4>>2]=c[p+96+4>>2];c[p+64+16+8>>2]=c[p+96+8>>2];c[p+64+16+12>>2]=c[p+96+12>>2];j=c[b+20>>2]|0;d=c[k+4>>2]|0;if(!d){c[6995]=(c[6995]|0)+1;d=sc(63)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}h=d;i=h+44|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(i|0))}else c[k+4>>2]=0;c[d+32>>2]=0;c[d+36>>2]=j;c[d+40>>2]=0;c[d>>2]=c[p+64>>2];c[d+4>>2]=c[p+64+4>>2];c[d+8>>2]=c[p+64+8>>2];c[d+12>>2]=c[p+64+12>>2];c[d+16>>2]=c[p+64+16>>2];c[d+20>>2]=c[p+64+20>>2];c[d+24>>2]=c[p+64+24>>2];c[d+28>>2]=c[p+64+28>>2];Pe(k,c[k>>2]|0,d);c[k+12>>2]=(c[k+12>>2]|0)+1;k=b+20|0;j=d}d=c[k>>2]|0;if((d|0)==(c[b+24>>2]|0)?(m=d|0?d<<1:1,(d|0)<(m|0)):0){if(!m)i=0;else{c[6995]=(c[6995]|0)+1;d=sc((m*80|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}i=d;d=c[k>>2]|0}if((d|0)>0){h=0;do{q=i+(h*80|0)|0;r=c[b+28>>2]|0;s=r+(h*80|0)|0;c[q>>2]=c[s>>2];c[q+4>>2]=c[s+4>>2];c[q+8>>2]=c[s+8>>2];c[q+12>>2]=c[s+12>>2];q=r+(h*80|0)+16|0;s=i+(h*80|0)+16|0;c[s>>2]=c[q>>2];c[s+4>>2]=c[q+4>>2];c[s+8>>2]=c[q+8>>2];c[s+12>>2]=c[q+12>>2];s=r+(h*80|0)+32|0;q=i+(h*80|0)+32|0;c[q>>2]=c[s>>2];c[q+4>>2]=c[s+4>>2];c[q+8>>2]=c[s+8>>2];c[q+12>>2]=c[s+12>>2];q=i+(h*80|0)+48|0;s=r+(h*80|0)+48|0;c[q>>2]=c[s>>2];c[q+4>>2]=c[s+4>>2];c[q+8>>2]=c[s+8>>2];c[q+12>>2]=c[s+12>>2];q=i+(h*80|0)+64|0;r=r+(h*80|0)+64|0;c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];h=h+1|0}while((h|0)!=(d|0))}d=c[b+28>>2]|0;if(d|0){if(a[b+32>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+28>>2]=0}a[b+32>>0]=1;c[b+28>>2]=i;c[b+24>>2]=m;d=c[k>>2]|0}s=c[b+28>>2]|0;r=s+(d*80|0)|0;c[r>>2]=c[p>>2];c[r+4>>2]=c[p+4>>2];c[r+8>>2]=c[p+8>>2];c[r+12>>2]=c[p+12>>2];r=s+(d*80|0)+16|0;c[r>>2]=c[p+16>>2];c[r+4>>2]=c[p+16+4>>2];c[r+8>>2]=c[p+16+8>>2];c[r+12>>2]=c[p+16+12>>2];r=s+(d*80|0)+32|0;c[r>>2]=c[p+32>>2];c[r+4>>2]=c[p+32+4>>2];c[r+8>>2]=c[p+32+8>>2];c[r+12>>2]=c[p+32+12>>2];r=s+(d*80|0)+48|0;c[r>>2]=c[p+48>>2];c[r+4>>2]=c[p+48+4>>2];c[r+8>>2]=c[p+48+8>>2];c[r+12>>2]=c[p+48+12>>2];s=s+(d*80|0)+64|0;c[s>>2]=e;c[s+4>>2]=n;g[s+8>>2]=o;c[s+12>>2]=j;c[k>>2]=(c[k>>2]|0)+1;l=p;return}function Td(b){b=b|0;var d=0,e=0.0,f=0.0,h=0.0,i=0,j=0.0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0;m=l;l=l+16|0;if(!(a[b+1308>>0]|0)){l=m;return}g[b+928>>2]=0.0;g[b+992>>2]=0.0;g[b+1056>>2]=0.0;c[b+712>>2]=0;c[b+712+4>>2]=0;c[b+712+8>>2]=0;c[b+712+12>>2]=0;jd(b,(c[b+28>>2]|0)+4|0,(c[b+32>>2]|0)+4|0);Ib[c[(c[b>>2]|0)+44>>2]&511](b);e=+g[b+1284>>2];f=+g[b+1288>>2];h=+g[b+1292>>2];if(+g[b+696>>2]>=+g[b+680>>2]){d=(a[b+1300>>0]|0)==0?b+1128|0:b+1064|0;i=c[d+16>>2]|0;k=c[d+32>>2]|0;c[m>>2]=c[d>>2];c[m+4>>2]=i;c[m+8>>2]=k;g[m+12>>2]=0.0;Ch(c[b+28>>2]|0,c[b+32>>2]|0,b+176|0,m,e,f,h,e,f,h)}if(+g[b+700>>2]>=+g[b+684>>2]){d=(a[b+1300>>0]|0)==0?b+1128|0:b+1064|0;i=c[d+20>>2]|0;k=c[d+36>>2]|0;c[m>>2]=c[d+4>>2];c[m+4>>2]=i;c[m+8>>2]=k;g[m+12>>2]=0.0;Ch(c[b+28>>2]|0,c[b+32>>2]|0,b+260|0,m,e,f,h,e,f,h)}if(+g[b+704>>2]>=+g[b+688>>2]){d=(a[b+1300>>0]|0)==0?b+1128|0:b+1064|0;i=c[d+24>>2]|0;k=c[d+40>>2]|0;c[m>>2]=c[d+8>>2];c[m+4>>2]=i;c[m+8>>2]=k;g[m+12>>2]=0.0;Ch(c[b+28>>2]|0,c[b+32>>2]|0,b+344|0,m,e,f,h,e,f,h)}k=0;do{f=+g[b+868+(k<<6)>>2];h=+g[b+868+(k<<6)+4>>2];j=+Xj(+g[b+1192+(k<<2)>>2],f,h);g[b+868+(k<<6)+52>>2]=j;do if(!(f>h)){if(f>j){c[b+868+(k<<6)+56>>2]=1;d=b+868+(k<<6)+48|0;g[d>>2]=j-f;if(!(j-f>3.1415927410125732))if(j-f<-3.1415927410125732)e=6.2831854820251465;else{i=16;break}else e=-6.2831854820251465;g[d>>2]=j-f+e;i=16;break}d=b+868+(k<<6)+56|0;if(h>2]=2;d=b+868+(k<<6)+48|0;g[d>>2]=j-h;if(!(j-h>3.1415927410125732))if(j-h<-3.1415927410125732)e=6.2831854820251465;else{i=16;break}else e=-6.2831854820251465;g[d>>2]=j-h+e;i=16}else i=15}else{d=b+868+(k<<6)+56|0;i=15}while(0);if((i|0)==15?(i=0,c[d>>2]=0,a[b+868+(k<<6)+44>>0]|0):0)i=16;if((i|0)==16){K=b+1208+(k<<4)|0;c[m>>2]=c[K>>2];c[m+4>>2]=c[K+4>>2];c[m+8>>2]=c[K+8>>2];c[m+12>>2]=c[K+12>>2];K=b+428+(k*84|0)|0;d=c[b+28>>2]|0;J=+g[d+4>>2];I=+g[d+20>>2];H=+g[d+36>>2];F=+g[d+8>>2];E=+g[d+24>>2];D=+g[d+40>>2];B=+g[d+12>>2];A=+g[d+28>>2];z=+g[d+44>>2];i=c[b+32>>2]|0;x=+g[i+4>>2];w=+g[i+20>>2];v=+g[i+36>>2];t=+g[i+8>>2];s=+g[i+24>>2];r=+g[i+40>>2];p=+g[i+12>>2];n=+g[i+28>>2];f=+g[i+44>>2];c[K>>2]=0;c[K+4>>2]=0;c[K+8>>2]=0;c[K+12>>2]=0;o=+g[m>>2];e=+g[m+4>>2];h=+g[m+8>>2];g[b+428+(k*84|0)+16>>2]=J*o+I*e+H*h;g[b+428+(k*84|0)+20>>2]=F*o+E*e+D*h;g[b+428+(k*84|0)+24>>2]=B*o+A*e+z*h;g[b+428+(k*84|0)+28>>2]=0.0;g[b+428+(k*84|0)+32>>2]=x*-o+w*-e+v*-h;g[b+428+(k*84|0)+36>>2]=t*-o+s*-e+r*-h;g[b+428+(k*84|0)+40>>2]=p*-o+n*-e+f*-h;g[b+428+(k*84|0)+44>>2]=0.0;G=(J*o+I*e+H*h)*+g[d+456>>2];C=(F*o+E*e+D*h)*+g[d+460>>2];y=(B*o+A*e+z*h)*+g[d+464>>2];g[b+428+(k*84|0)+48>>2]=G;g[b+428+(k*84|0)+52>>2]=C;g[b+428+(k*84|0)+56>>2]=y;g[b+428+(k*84|0)+60>>2]=0.0;u=(x*-o+w*-e+v*-h)*+g[i+456>>2];q=(t*-o+s*-e+r*-h)*+g[i+460>>2];j=(p*-o+n*-e+f*-h)*+g[i+464>>2];g[b+428+(k*84|0)+64>>2]=u;g[b+428+(k*84|0)+68>>2]=q;g[b+428+(k*84|0)+72>>2]=j;g[b+428+(k*84|0)+76>>2]=0.0;g[b+428+(k*84|0)+80>>2]=(J*o+I*e+H*h)*G+(F*o+E*e+D*h)*C+(B*o+A*e+z*h)*y+((x*-o+w*-e+v*-h)*u+(t*-o+s*-e+r*-h)*q+(p*-o+n*-e+f*-h)*j)}k=k+1|0}while((k|0)!=3);l=m;return}function Ud(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=+h;var i=0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0.0;i=l;l=l+464|0;c[i+128>>2]=c[d>>2];c[i+128+4>>2]=c[d+4>>2];c[i+128+8>>2]=c[d+8>>2];c[i+128+12>>2]=c[d+12>>2];c[i+128+16>>2]=c[d+16>>2];c[i+128+16+4>>2]=c[d+16+4>>2];c[i+128+16+8>>2]=c[d+16+8>>2];c[i+128+16+12>>2]=c[d+16+12>>2];c[i+128+32>>2]=c[d+32>>2];c[i+128+32+4>>2]=c[d+32+4>>2];c[i+128+32+8>>2]=c[d+32+8>>2];c[i+128+32+12>>2]=c[d+32+12>>2];k=i+128+48|0;c[k>>2]=c[d+48>>2];c[k+4>>2]=c[d+48+4>>2];c[k+8>>2]=c[d+48+8>>2];c[k+12>>2]=c[d+48+12>>2];c[i+64>>2]=c[e>>2];c[i+64+4>>2]=c[e+4>>2];c[i+64+8>>2]=c[e+8>>2];c[i+64+12>>2]=c[e+12>>2];c[i+64+16>>2]=c[e+16>>2];c[i+64+16+4>>2]=c[e+16+4>>2];c[i+64+16+8>>2]=c[e+16+8>>2];c[i+64+16+12>>2]=c[e+16+12>>2];c[i+64+32>>2]=c[e+32>>2];c[i+64+32+4>>2]=c[e+32+4>>2];c[i+64+32+8>>2]=c[e+32+8>>2];c[i+64+32+12>>2]=c[e+32+12>>2];j=i+64+48|0;c[j>>2]=c[e+48>>2];c[j+4>>2]=c[e+48+4>>2];c[j+8>>2]=c[e+48+8>>2];c[j+12>>2]=c[e+48+12>>2];If(i+128|0,i+64|0,i+256|0,i+192|0);t=+g[i+192>>2];m=t*+g[i+256+4>>2];r=t*+g[i+256+8>>2];g[i+16>>2]=+g[i+256>>2]*t;g[i+16+4>>2]=m;g[i+16+8>>2]=r;g[i+16+12>>2]=0.0;c[i+256>>2]=0;c[i+256+4>>2]=0;c[i+256+8>>2]=0;c[i+256+12>>2]=0;c[i+192+48>>2]=0;c[i+192+48+4>>2]=0;c[i+192+48+8>>2]=0;c[i+192+48+12>>2]=0;yh(i+128|0,i);r=+g[i>>2];m=+g[i+4>>2];t=+g[i+8>>2];q=+g[i+12>>2];o=r*(2.0/(r*r+m*m+t*t+q*q));n=m*(2.0/(r*r+m*m+t*t+q*q));p=t*(2.0/(r*r+m*m+t*t+q*q));g[i+192>>2]=1.0-(m*n+t*p);g[i+192+4>>2]=r*n-q*p;g[i+192+8>>2]=r*p+q*n;g[i+192+12>>2]=0.0;g[i+192+16>>2]=r*n+q*p;g[i+192+20>>2]=1.0-(r*o+t*p);g[i+192+24>>2]=m*p-q*o;g[i+192+28>>2]=0.0;g[i+192+32>>2]=r*p-q*n;g[i+192+36>>2]=m*p+q*o;g[i+192+40>>2]=1.0-(r*o+m*n);g[i+192+44>>2]=0.0;kh(b,i+192|0,i+256|0,i+16|0,i+48|0,i+32|0);c[i+256>>2]=6284;c[i+256+36>>2]=c[d>>2];c[i+256+36+4>>2]=c[d+4>>2];c[i+256+36+8>>2]=c[d+8>>2];c[i+256+36+12>>2]=c[d+12>>2];c[i+256+52>>2]=c[d+16>>2];c[i+256+52+4>>2]=c[d+16+4>>2];c[i+256+52+8>>2]=c[d+16+8>>2];c[i+256+52+12>>2]=c[d+16+12>>2];c[i+256+68>>2]=c[d+32>>2];c[i+256+68+4>>2]=c[d+32+4>>2];c[i+256+68+8>>2]=c[d+32+8>>2];c[i+256+68+12>>2]=c[d+32+12>>2];s=i+256+84|0;c[s>>2]=c[d+48>>2];c[s+4>>2]=c[d+48+4>>2];c[s+8>>2]=c[d+48+8>>2];c[s+12>>2]=c[d+48+12>>2];c[i+256+100>>2]=c[e>>2];c[i+256+100+4>>2]=c[e+4>>2];c[i+256+100+8>>2]=c[e+8>>2];c[i+256+100+12>>2]=c[e+12>>2];c[i+256+116>>2]=c[e+16>>2];c[i+256+116+4>>2]=c[e+16+4>>2];c[i+256+116+8>>2]=c[e+16+8>>2];c[i+256+116+12>>2]=c[e+16+12>>2];c[i+256+132>>2]=c[e+32>>2];c[i+256+132+4>>2]=c[e+32+4>>2];c[i+256+132+8>>2]=c[e+32+8>>2];c[i+256+132+12>>2]=c[e+32+12>>2];d=i+256+148|0;c[d>>2]=c[e+48>>2];c[d+4>>2]=c[e+48+4>>2];c[d+8>>2]=c[e+48+8>>2];c[d+12>>2]=c[e+48+12>>2];c[i+256+180>>2]=a;c[i+256+184>>2]=f;g[i+256+188>>2]=h;c[i+256+192>>2]=b;n=+g[d>>2]-+g[s>>2];m=+g[i+256+152>>2]-+g[i+256+88>>2];o=+g[i+256+156>>2]-+g[i+256+92>>2];h=1.0/+D(+(n*n+m*m+o*o));r=n*h==0.0?999999984306749440.0:1.0/(n*h);g[i+256+4>>2]=r;q=m*h==0.0?999999984306749440.0:1.0/(m*h);g[i+256+8>>2]=q;p=o*h==0.0?999999984306749440.0:1.0/(o*h);g[i+256+12>>2]=p;c[i+256+20>>2]=r<0.0&1;c[i+256+24>>2]=q<0.0&1;c[i+256+28>>2]=p<0.0&1;g[i+256+32>>2]=o*o*h+(n*n*h+m*m*h);f=c[a+68>>2]|0;$b[c[(c[f>>2]|0)+24>>2]&7](f,k,j,i+256|0,i+48|0,i+32|0);l=i;return}function Vd(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[b+24>>2]=d;g[b+28>>2]=0.0;c[b+32>>2]=0;c[b+36>>2]=1;g[b+40>>2]=1.0;a[b+44>>0]=1;c[b+48>>2]=0;a[b+52>>0]=0;a[b+53>>0]=1;a[b+54>>0]=1;g[b+56>>2]=.03999999910593033;a[b+60>>0]=0;g[b+64>>2]=0.0;c[b+68>>2]=e;c[b+72>>2]=0;a[b+76>>0]=1;c[b+80>>2]=0;c[b+84>>2]=0;c[b+88>>2]=0;g[b+92>>2]=.6000000238418579;g[b+96>>2]=1.0;g[b+100>>2]=.30000001192092896;g[b+104>>2]=.01666666753590107;g[b+108>>2]=0.0;g[b+116>>2]=20.0;c[b+112>>2]=10;g[b+124>>2]=.20000000298023224;g[b+128>>2]=.20000000298023224;g[b+132>>2]=0.0;g[b+136>>2]=.20000000298023224;g[b+140>>2]=0.0;g[b+120>>2]=1.0;c[b+144>>2]=1;g[b+148>>2]=-.03999999910593033;g[b+152>>2]=.10000000149011612;g[b+156>>2]=0.0;g[b+160>>2]=.8500000238418579;c[b+164>>2]=260;c[b+168>>2]=2;c[b+172>>2]=128;g[b+176>>2]=100.0;g[b+180>>2]=1000000015047466219876688.0e6;g[b+184>>2]=0.0;g[b+188>>2]=.20000000298023224;c[b>>2]=4360;a[b+208>>0]=1;c[b+204>>2]=0;c[b+196>>2]=0;c[b+200>>2]=0;c[b+212>>2]=0;c[b+216>>2]=f;a[b+240>>0]=1;c[b+236>>2]=0;c[b+228>>2]=0;c[b+232>>2]=0;a[b+260>>0]=1;c[b+256>>2]=0;c[b+248>>2]=0;c[b+252>>2]=0;c[b+264>>2]=0;c[b+268>>2]=-1054867456;a[b+290>>0]=0;a[b+291>>0]=0;c[b+272>>2]=0;c[b+272+4>>2]=0;c[b+272+8>>2]=0;c[b+272+12>>2]=0;a[b+308>>0]=1;c[b+304>>2]=0;c[b+296>>2]=0;c[b+300>>2]=0;c[b+312>>2]=0;a[b+316>>0]=1;a[b+336>>0]=1;c[b+332>>2]=0;c[b+324>>2]=0;c[b+328>>2]=0;c[b+340>>2]=0;if(!f){c[6995]=(c[6995]|0)+1;e=sc(255)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[e>>2]=5052;a[e+20>>0]=1;c[e+16>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;a[e+40>>0]=1;c[e+36>>2]=0;c[e+28>>2]=0;c[e+32>>2]=0;a[e+60>>0]=1;c[e+56>>2]=0;c[e+48>>2]=0;c[e+52>>2]=0;a[e+80>>0]=1;c[e+76>>2]=0;c[e+68>>2]=0;c[e+72>>2]=0;a[e+100>>0]=1;c[e+96>>2]=0;c[e+88>>2]=0;c[e+92>>2]=0;a[e+120>>0]=1;c[e+116>>2]=0;c[e+108>>2]=0;c[e+112>>2]=0;a[e+140>>0]=1;c[e+136>>2]=0;c[e+128>>2]=0;c[e+132>>2]=0;a[e+160>>0]=1;c[e+156>>2]=0;c[e+148>>2]=0;c[e+152>>2]=0;a[e+180>>0]=1;c[e+176>>2]=0;c[e+168>>2]=0;c[e+172>>2]=0;a[e+208>>0]=1;c[e+204>>2]=0;c[e+196>>2]=0;c[e+200>>2]=0;c[e+232>>2]=0;c[e+224>>2]=0;c[e+212>>2]=14;c[e+216>>2]=15;c[e+220>>2]=16;c[b+216>>2]=e;e=1}else e=0;a[b+289>>0]=e;c[6995]=(c[6995]|0)+1;e=sc(87)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[e>>2]=5768;a[e+20>>0]=1;c[e+16>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;a[e+40>>0]=1;c[e+36>>2]=0;c[e+28>>2]=0;c[e+32>>2]=0;a[e+60>>0]=1;c[e+56>>2]=0;c[e+48>>2]=0;c[e+52>>2]=0;a[e+64>>0]=1;c[b+220>>2]=e;a[b+288>>0]=1;c[6995]=(c[6995]|0)+1;e=sc(107)|0;if(!e){f=0;h=c[b+216>>2]|0;c[f>>2]=4580;e=f+4|0;c[e>>2]=0;e=f+8|0;c[e>>2]=h;e=f+12|0;c[e>>2]=0;e=f+16|0;c[e>>2]=0;e=f+20|0;c[e>>2]=0;e=f+24|0;c[e>>2]=d;d=f+44|0;a[d>>0]=1;d=f+40|0;c[d>>2]=0;d=f+32|0;c[d>>2]=0;d=f+36|0;c[d>>2]=0;d=f+64|0;a[d>>0]=1;d=f+60|0;c[d>>2]=0;d=f+52|0;c[d>>2]=0;d=f+56|0;c[d>>2]=0;d=f+84|0;a[d>>0]=1;d=f+80|0;c[d>>2]=0;d=f+72|0;c[d>>2]=0;d=f+76|0;c[d>>2]=0;c[b+212>>2]=f;return}c[(e+4+15&-16)+-4>>2]=e;h=e+4+15&-16;e=c[b+216>>2]|0;c[h>>2]=4580;f=h+4|0;c[f>>2]=0;f=h+8|0;c[f>>2]=e;f=h+12|0;c[f>>2]=0;f=h+16|0;c[f>>2]=0;f=h+20|0;c[f>>2]=0;f=h+24|0;c[f>>2]=d;d=h+44|0;a[d>>0]=1;d=h+40|0;c[d>>2]=0;d=h+32|0;c[d>>2]=0;d=h+36|0;c[d>>2]=0;d=h+64|0;a[d>>0]=1;d=h+60|0;c[d>>2]=0;d=h+52|0;c[d>>2]=0;d=h+56|0;c[d>>2]=0;d=h+84|0;a[d>>0]=1;d=h+80|0;c[d>>2]=0;d=h+72|0;c[d>>2]=0;d=h+76|0;c[d>>2]=0;c[b+212>>2]=h;return}function Wd(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var k=0,m=0.0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0,E=0;C=l;l=l+272|0;z=+g[e+48>>2]-+g[d+48>>2];A=+g[e+52>>2]-+g[d+52>>2];B=+g[e+56>>2]-+g[d+56>>2];If(d,e,C+256|0,C+208|0);v=+g[C+208>>2];t=+g[C+256>>2]*v;u=v*+g[C+256+4>>2];v=v*+g[C+256+8>>2];g[C+192>>2]=t;g[C+192+4>>2]=u;g[C+192+8>>2]=v;g[C+192+12>>2]=0.0;w=+g[h+48>>2]-+g[f+48>>2];x=+g[h+52>>2]-+g[f+52>>2];y=+g[h+56>>2]-+g[f+56>>2];If(f,h,C+256|0,C+208|0);r=+g[C+208>>2];p=+g[C+256>>2]*r;q=r*+g[C+256+4>>2];r=r*+g[C+256+8>>2];g[C+176>>2]=p;g[C+176+4>>2]=q;g[C+176+8>>2]=r;g[C+176+12>>2]=0.0;e=c[b+12>>2]|0;s=+nb[c[(c[e>>2]|0)+16>>2]&15](e);e=c[b+16>>2]|0;if(!e)m=0.0;else m=+nb[c[(c[e>>2]|0)+16>>2]&15](e);s=s*+D(+(t*t+u*u+v*v))+m*+D(+(p*p+q*q+r*r));if(s+ +D(+((w-z)*(w-z)+(x-A)*(x-A)+(y-B)*(y-B)))==0.0){i=0;l=C;return i|0}c[C+208>>2]=9504;g[C+208+36>>2]=999999984306749440.0;a[C+208+40>>0]=0;Jd(b,d,f,C+208|0);h=(a[C+208+40>>0]|0)==0;c[C+256>>2]=c[C+208+20>>2];c[C+256+4>>2]=c[C+208+20+4>>2];c[C+256+8>>2]=c[C+208+20+8>>2];c[C+256+12>>2]=c[C+208+20+12>>2];a:do if(!h?(o=c[C+208+4>>2]|0,k=c[C+208+8>>2]|0,n=c[C+208+12>>2]|0,v=(w-z)*(c[j>>2]=o,+g[j>>2]),v=v+(x-A)*(c[j>>2]=k,+g[j>>2]),!(s+(v+(y-B)*(c[j>>2]=n,+g[j>>2]))<=1.1920928955078125e-07)):0){m=+g[C+208+16>>2];p=+g[C+208+36>>2]+ +g[i+172>>2];b:do if(p>1.0000000474974513e-03){h=0;q=0.0;r=p;while(1){e=c[i+168>>2]|0;if(e|0){E=c[(c[e>>2]|0)+28>>2]|0;c[C+112>>2]=1065353216;c[C+112+4>>2]=1065353216;c[C+112+8>>2]=1065353216;g[C+112+12>>2]=0.0;Qb[E&7](e,C+256|0,.20000000298023224,C+112|0)}m=(w-z)*(c[j>>2]=o,+g[j>>2]);m=m+(x-A)*(c[j>>2]=k,+g[j>>2]);m=s+(m+(y-B)*(c[j>>2]=n,+g[j>>2]));if(m<=1.1920928955078125e-07){k=0;break a}p=q+r/m;if(!(!(p<=q)&(!(p<0.0)&!(p>1.0)))){k=0;break a}Af(d,z,A,B,C+192|0,p,C+112|0);Af(f,w,x,y,C+176|0,p,C+48|0);k=c[i+168>>2]|0;if(k|0){E=c[(c[k>>2]|0)+28>>2]|0;c[C>>2]=1065353216;c[C+4>>2]=0;c[C+8>>2]=0;g[C+12>>2]=0.0;Qb[E&7](k,C+112+48|0,.20000000298023224,C)}Jb[c[c[i>>2]>>2]&31](i,p);c[C>>2]=9504;g[C+36>>2]=999999984306749440.0;a[C+40>>0]=0;Jd(b,C+112|0,C+48|0,C);if(!(a[C+40>>0]|0)){k=15;break}m=+g[C+36>>2];q=+g[i+172>>2];c[C+256>>2]=c[C+20>>2];c[C+256+4>>2]=c[C+20+4>>2];c[C+256+8>>2]=c[C+20+8>>2];c[C+256+12>>2]=c[C+20+12>>2];e=h+1|0;if((h|0)>63){k=16;break}n=c[C+12>>2]|0;k=c[C+8>>2]|0;o=c[C+4>>2]|0;r=m+q;if(!(r>1.0000000474974513e-03)){m=+g[C+16>>2];break b}else{h=e;q=p}}if((k|0)==15)Sb[c[(c[i>>2]|0)+8>>2]&127](i,-1,h);else if((k|0)==16)Sb[c[(c[i>>2]|0)+8>>2]&127](i,-2,e);k=0;break a}else p=0.0;while(0);g[i+164>>2]=p;c[i+132>>2]=o;c[i+136>>2]=k;c[i+140>>2]=n;g[i+144>>2]=m;c[i+148>>2]=c[C+256>>2];c[i+148+4>>2]=c[C+256+4>>2];c[i+148+8>>2]=c[C+256+8>>2];c[i+148+12>>2]=c[C+256+12>>2];k=1}else k=0;while(0);E=k;l=C;return E|0}function Xd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0.0,B=0.0,C=0.0,E=0.0,F=0,G=0;F=l;l=l+32|0;A=+g[b+48>>2]-+g[b+112>>2];h=+g[b+52>>2]-+g[b+116>>2];E=+g[b+56>>2]-+g[b+120>>2];B=A*+g[b+64>>2]+h*+g[b+80>>2]+E*+g[b+96>>2];C=A*+g[b+68>>2]+h*+g[b+84>>2]+E*+g[b+100>>2];E=A*+g[b+72>>2]+h*+g[b+88>>2]+E*+g[b+104>>2];e=c[a+8>>2]|0;z=c[a+4>>2]|0;h=+g[z+32>>2]*+g[z+16>>2];A=h+ +g[a+12>>2];p=+g[e+76>>2];q=+g[e+60>>2];r=+g[e+80>>2];s=+g[e+64>>2];t=+g[e+84>>2];u=+g[e+68>>2];v=+g[e+92>>2];w=+g[e+96>>2];x=+g[e+100>>2];j=(r-s)*(x-u)-(t-u)*(w-s);k=(t-u)*(v-q)-(p-q)*(x-u);o=(p-q)*(w-s)-(r-s)*(v-q);if(!(o*o+(j*j+k*k)>=1.4210854715202004e-14)){l=F;return}n=1.0/+D(+(o*o+(j*j+k*k)));i=(B-q)*j*n+k*n*(C-s)+o*n*(E-u);if(i<0.0){i=-i;m=-(j*n);j=-(k*n);k=-(o*n)}else{m=j*n;j=k*n;k=o*n}if(!(i0.0&(o>0.0&y>0.0)|x<=0.0&(o<=0.0&y<=0.0))){if((xb[c[(c[e>>2]|0)+100>>2]&127](e)|0)<=0){l=F;return}e=0;z=0;o=0.0;n=0.0;i=0.0;do{G=c[a+8>>2]|0;Vb[c[(c[G>>2]|0)+104>>2]&127](G,z,F+16|0,F);s=+g[F+16>>2];x=+g[F+16+4>>2];u=+g[F+16+8>>2];t=+g[F>>2]-s;y=+g[F+4>>2]-x;v=+g[F+8>>2]-u;do if((B-s)*t+(C-x)*y+(E-u)*v>0.0)if((B-s)*t+(C-x)*y+(E-u)*v>2]|0}while((z|0)<(xb[c[(c[G>>2]|0)+100>>2]&127](G)|0));if(!(e&1)){l=F;return}else{p=A*A;s=o;r=n;q=i}}else{p=A*A;s=B-i*m;r=E-i*k;q=C-i*j}n=B-s;o=C-q;i=E-r;if(!(n*n+o*o+i*i1.1920928955078125e-07){j=+D(+(n*n+o*o+i*i));h=h-j;m=n*(1.0/j);k=i*(1.0/j);j=o*(1.0/j)}i=-h;h=+g[b+64>>2];if(f){y=+g[b+68>>2];A=+g[b+72>>2];B=h*m+y*j+A*k;p=+g[b+80>>2];t=+g[b+84>>2];u=+g[b+88>>2];C=m*p+j*t+k*u;v=+g[b+96>>2];w=+g[b+100>>2];x=+g[b+104>>2];E=m*v+j*w+k*x;g[F+16>>2]=-B;g[F+16+4>>2]=-C;g[F+16+8>>2]=-E;g[F+16+12>>2]=0.0;C=s*p+q*t+r*u+ +g[b+116>>2]+C*i;E=s*v+q*w+r*x+ +g[b+120>>2]+E*i;g[F>>2]=s*h+q*y+r*A+ +g[b+112>>2]+B*i;g[F+4>>2]=C;g[F+8>>2]=E;g[F+12>>2]=0.0;Tb[c[(c[d>>2]|0)+16>>2]&15](d,F+16|0,F,i);l=F;return}else{G=c[(c[d>>2]|0)+16>>2]|0;A=+g[b+68>>2];B=+g[b+72>>2];v=+g[b+80>>2];w=+g[b+84>>2];C=+g[b+88>>2];x=+g[b+96>>2];y=+g[b+100>>2];E=+g[b+104>>2];g[F+16>>2]=h*m+A*j+B*k;g[F+16+4>>2]=m*v+j*w+k*C;g[F+16+8>>2]=m*x+j*y+k*E;g[F+16+12>>2]=0.0;C=s*v+q*w+r*C+ +g[b+116>>2];E=s*x+q*y+r*E+ +g[b+120>>2];g[F>>2]=s*h+q*A+r*B+ +g[b+112>>2];g[F+4>>2]=C;g[F+8>>2]=E;g[F+12>>2]=0.0;Tb[G&15](d,F+16|0,F,i);l=F;return}}function Yd(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0;i=l;l=l+16|0;if((a[22480]|0)==0?Uz(22480)|0:0){c[i>>2]=0;c[i+4>>2]=0;c[i+8>>2]=0;c[i+12>>2]=0;ef(23152,0.0,0,0,i)}c[5839]=c[5839]|1;g[5889]=0.0;j=+g[5899]*0.0;k=+g[5900]*0.0;g[5894]=+g[5898]*0.0;g[5895]=j;g[5896]=k;g[5897]=0.0;c[5902]=0;c[5903]=0;c[5904]=0;c[5905]=0;k=+g[5891]*0.0;j=+g[5892]*0.0;g[5943]=+g[5890]*0.0;g[5944]=k;g[5945]=j;g[5946]=0.0;c[b+4>>2]=6;c[b+8>>2]=-1;c[b+12>>2]=-1;g[b+16>>2]=3402823466385288598117041.0e14;a[b+20>>0]=1;a[b+21>>0]=0;c[b+24>>2]=-1;c[b+28>>2]=23152;c[b+32>>2]=d;g[b+36>>2]=0.0;g[b+40>>2]=.05000000074505806;c[b+44>>2]=0;c[b>>2]=4704;c[b+112>>2]=c[e>>2];c[b+112+4>>2]=c[e+4>>2];c[b+112+8>>2]=c[e+8>>2];c[b+112+12>>2]=c[e+12>>2];c[b+128>>2]=c[e+16>>2];c[b+128+4>>2]=c[e+16+4>>2];c[b+128+8>>2]=c[e+16+8>>2];c[b+128+12>>2]=c[e+16+12>>2];c[b+144>>2]=c[e+32>>2];c[b+144+4>>2]=c[e+32+4>>2];c[b+144+8>>2]=c[e+32+8>>2];c[b+144+12>>2]=c[e+32+12>>2];c[b+160>>2]=c[e+48>>2];c[b+160+4>>2]=c[e+48+4>>2];c[b+160+8>>2]=c[e+48+8>>2];c[b+160+12>>2]=c[e+48+12>>2];e=b+680|0;h=e+48|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(h|0));c[b+740>>2]=0;c[b+740+4>>2]=0;c[b+740+8>>2]=0;c[b+740+12>>2]=0;c[b+756>>2]=1045220557;c[b+760>>2]=1045220557;c[b+764>>2]=1045220557;c[b+768>>2]=0;c[b+768+4>>2]=0;c[b+768+8>>2]=0;c[b+768+12>>2]=0;c[b+768+16>>2]=0;g[b+728>>2]=.699999988079071;g[b+732>>2]=1.0;g[b+736>>2]=.5;a[b+788>>0]=0;g[b+792>>2]=0.0;g[b+808>>2]=0.0;a[b+789>>0]=0;g[b+796>>2]=0.0;g[b+812>>2]=0.0;a[b+790>>0]=0;g[b+800>>2]=0.0;g[b+816>>2]=0.0;g[b+928>>2]=0.0;g[b+876>>2]=0.0;g[b+880>>2]=.10000000149011612;g[b+884>>2]=300.0;g[b+868>>2]=1.0;g[b+872>>2]=-1.0;g[b+896>>2]=0.0;g[b+900>>2]=.20000000298023224;g[b+904>>2]=0.0;g[b+908>>2]=0.0;g[b+888>>2]=1.0;g[b+892>>2]=.5;c[b+924>>2]=0;g[b+916>>2]=0.0;a[b+912>>0]=0;g[b+992>>2]=0.0;g[b+940>>2]=0.0;g[b+944>>2]=.10000000149011612;g[b+948>>2]=300.0;g[b+932>>2]=1.0;g[b+936>>2]=-1.0;g[b+960>>2]=0.0;g[b+964>>2]=.20000000298023224;g[b+968>>2]=0.0;g[b+972>>2]=0.0;g[b+952>>2]=1.0;g[b+956>>2]=.5;c[b+988>>2]=0;g[b+980>>2]=0.0;a[b+976>>0]=0;g[b+1056>>2]=0.0;g[b+1004>>2]=0.0;g[b+1008>>2]=.10000000149011612;g[b+1012>>2]=300.0;g[b+996>>2]=1.0;g[b+1e3>>2]=-1.0;g[b+1024>>2]=0.0;g[b+1028>>2]=.20000000298023224;g[b+1032>>2]=0.0;g[b+1036>>2]=0.0;g[b+1016>>2]=1.0;g[b+1020>>2]=.5;c[b+1052>>2]=0;g[b+1044>>2]=0.0;a[b+1040>>0]=0;a[b+1300>>0]=f&1;a[b+1301>>0]=1;c[b+1304>>2]=0;a[b+1308>>0]=0;y=+g[b+112>>2];E=+g[d+4>>2];x=+g[b+128>>2];D=+g[d+8>>2];w=+g[b+144>>2];C=+g[d+12>>2];v=+g[b+116>>2];u=+g[b+132>>2];t=+g[b+148>>2];s=+g[b+120>>2];q=+g[b+136>>2];o=+g[b+152>>2];B=+g[d+20>>2];A=+g[d+24>>2];z=+g[d+28>>2];r=+g[d+36>>2];p=+g[d+40>>2];n=+g[d+44>>2];G=+g[b+160>>2];F=+g[b+164>>2];k=+g[b+168>>2];m=+g[d+52>>2]+(E*G+D*F+C*k);j=B*G+A*F+z*k+ +g[d+56>>2];k=r*G+p*F+n*k+ +g[d+60>>2];g[b+48>>2]=y*E+x*D+w*C;g[b+52>>2]=E*v+D*u+C*t;g[b+56>>2]=E*s+D*q+C*o;g[b+60>>2]=0.0;g[b+64>>2]=y*B+x*A+w*z;g[b+68>>2]=v*B+u*A+t*z;g[b+72>>2]=s*B+q*A+o*z;g[b+76>>2]=0.0;g[b+80>>2]=y*r+x*p+w*n;g[b+84>>2]=v*r+u*p+t*n;g[b+88>>2]=s*r+q*p+o*n;g[b+92>>2]=0.0;g[b+96>>2]=m;g[b+100>>2]=j;g[b+104>>2]=k;g[b+108>>2]=0.0;jd(b,(c[b+28>>2]|0)+4|0,(c[b+32>>2]|0)+4|0);l=i;return}function Zd(b,d,e,f,h,i,j,k){b=b|0;d=d|0;e=e|0;f=f|0;h=+h;i=+i;j=j|0;k=k|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=l;l=l+288|0;c[w+208>>2]=c[d>>2];c[w+208+4>>2]=c[d+4>>2];c[w+208+8>>2]=c[d+8>>2];c[w+208+12>>2]=c[d+12>>2];o=w+208+16|0;c[o>>2]=c[e>>2];c[o+4>>2]=c[e+4>>2];c[o+8>>2]=c[e+8>>2];c[o+12>>2]=c[e+12>>2];e=w+208+32|0;c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];v=c[j>>2]|0;q=c[j+4>>2]|0;r=c[j+8>>2]|0;s=c[j+16>>2]|0;t=c[j+12>>2]|0;p=c[j+20>>2]|0;c[w+156>>2]=c[w+208>>2];c[w+156+4>>2]=c[w+208+4>>2];c[w+156+8>>2]=c[w+208+8>>2];c[w+156+12>>2]=c[w+208+12>>2];c[w+172>>2]=c[o>>2];c[w+172+4>>2]=c[o+4>>2];c[w+172+8>>2]=c[o+8>>2];c[w+172+12>>2]=c[o+12>>2];c[w+188>>2]=c[e>>2];c[w+188+4>>2]=c[e+4>>2];c[w+188+8>>2]=c[e+8>>2];c[w+188+12>>2]=c[e+12>>2];e=c[b+128>>2]|0;if((e|0)==(c[b+132>>2]|0)?(u=e|0?e<<1:1,(e|0)<(u|0)):0){if(!u)d=0;else{c[6995]=(c[6995]|0)+1;d=sc((u*284|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}e=c[b+128>>2]|0}if((e|0)>0){f=0;do{j=c[b+136>>2]|0;m=d+(f*284|0)|0;n=j+(f*284|0)|0;o=m+92|0;do{c[m>>2]=c[n>>2];m=m+4|0;n=n+4|0}while((m|0)<(o|0));m=d+(f*284|0)+92|0;n=j+(f*284|0)+92|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];m=j+(f*284|0)+108|0;n=d+(f*284|0)+108|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];c[n+8>>2]=c[m+8>>2];c[n+12>>2]=c[m+12>>2];n=j+(f*284|0)+124|0;m=d+(f*284|0)+124|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];m=d+(f*284|0)+140|0;n=j+(f*284|0)+140|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];m=d+(f*284|0)+156|0;n=j+(f*284|0)+156|0;o=m+128|0;do{c[m>>2]=c[n>>2];m=m+4|0;n=n+4|0}while((m|0)<(o|0));f=f+1|0}while((f|0)!=(e|0))}e=c[b+136>>2]|0;if(e|0){if(a[b+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+136>>2]=0}a[b+140>>0]=1;c[b+136>>2]=d;c[b+132>>2]=u;e=c[b+128>>2]|0}d=c[b+136>>2]|0;m=d+(e*284|0)|0;n=w;o=m+92|0;do{c[m>>2]=c[n>>2];m=m+4|0;n=n+4|0}while((m|0)<(o|0));m=d+(e*284|0)+92|0;c[m>>2]=c[w+92>>2];c[m+4>>2]=c[w+92+4>>2];c[m+8>>2]=c[w+92+8>>2];c[m+12>>2]=c[w+92+12>>2];m=d+(e*284|0)+108|0;c[m>>2]=c[w+108>>2];c[m+4>>2]=c[w+108+4>>2];c[m+8>>2]=c[w+108+8>>2];c[m+12>>2]=c[w+108+12>>2];m=d+(e*284|0)+124|0;c[m>>2]=c[w+124>>2];c[m+4>>2]=c[w+124+4>>2];c[m+8>>2]=c[w+124+8>>2];c[m+12>>2]=c[w+124+12>>2];m=d+(e*284|0)+140|0;c[m>>2]=c[w+140>>2];c[m+4>>2]=c[w+140+4>>2];c[m+8>>2]=c[w+140+8>>2];c[m+12>>2]=c[w+140+12>>2];d=d+(e*284|0)+156|0;m=d;n=w+156|0;o=m+48|0;do{c[m>>2]=c[n>>2];m=m+4|0;n=n+4|0}while((m|0)<(o|0));g[d+48>>2]=h;c[d+52>>2]=t;g[d+56>>2]=i;c[d+60>>2]=v;c[d+64>>2]=q;c[d+68>>2]=r;c[d+72>>2]=s;g[d+76>>2]=0.0;g[d+80>>2]=0.0;g[d+84>>2]=0.0;g[d+88>>2]=.10000000149011612;c[d+92>>2]=p;g[d+96>>2]=0.0;g[d+100>>2]=0.0;a[d+104>>0]=k&1;m=d+105|0;n=w+256|0;o=m+23|0;do{a[m>>0]=a[n>>0]|0;m=m+1|0;n=n+1|0}while((m|0)<(o|0));k=c[b+128>>2]|0;c[b+128>>2]=k+1;k=(c[b+136>>2]|0)+(k*284|0)|0;Tg(c[b+108>>2]|0,k,0);xe(c[b+108>>2]|0,c[b+136>>2]|0,(c[b+128>>2]|0)+-1|0,0);l=w;return k|0}function _d(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0;if((h|0)<0){o=c[b+8>>2]|0;+wb[c[(c[o>>2]|0)+12>>2]&3](o,d,e,f,g,c[b+12>>2]|0,c[b+16>>2]|0,c[b+4>>2]|0,c[b+20>>2]|0,c[b+24>>2]|0);return}l=c[b+16>>2]|0;a:do if((l|0)>0){j=c[b+12>>2]|0;i=0;while(1){k=j+(i<<2)|0;o=c[k>>2]|0;n=c[o+28>>2]|0;if((c[((c[n+208>>2]|0)>-1?n:c[o+32>>2]|0)+208>>2]|0)==(h|0)){o=k;break a}i=i+1|0;if((i|0)>=(l|0)){o=0;break}}}else{i=0;o=0}while(0);if((i|0)<(l|0)){k=c[b+12>>2]|0;j=0;do{n=c[k+(i<<2)>>2]|0;m=c[n+28>>2]|0;j=((c[((c[m+208>>2]|0)>-1?m:c[n+32>>2]|0)+208>>2]|0)==(h|0)&1)+j|0;i=i+1|0}while((i|0)!=(l|0));n=j}else n=0;i=c[b+4>>2]|0;if((c[i+80>>2]|0)<2){m=c[b+8>>2]|0;+wb[c[(c[m>>2]|0)+12>>2]&3](m,d,e,f,g,o,n,i,c[b+20>>2]|0,c[b+24>>2]|0);return}if((e|0)>0){l=0;i=c[b+32>>2]|0;j=c[b+36>>2]|0;do{m=d+(l<<2)|0;if((i|0)==(j|0)){h=j|0?j<<1:1;if((j|0)<(h|0)){if(!h)i=0;else{c[6995]=(c[6995]|0)+1;i=sc((h<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}j=c[b+32>>2]|0}if((j|0)>0){k=0;do{c[i+(k<<2)>>2]=c[(c[b+40>>2]|0)+(k<<2)>>2];k=k+1|0}while((k|0)!=(j|0))}k=c[b+40>>2]|0;if(k){if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);j=c[b+32>>2]|0}c[b+40>>2]=0}a[b+44>>0]=1;c[b+40>>2]=i;c[b+36>>2]=h;i=j;j=h}else i=j}c[(c[b+40>>2]|0)+(i<<2)>>2]=c[m>>2];i=i+1|0;c[b+32>>2]=i;l=l+1|0}while((l|0)!=(e|0))}if((g|0)>0){l=0;i=c[b+52>>2]|0;j=c[b+56>>2]|0;do{m=f+(l<<2)|0;if((i|0)==(j|0)){h=j|0?j<<1:1;if((j|0)<(h|0)){if(!h)i=0;else{c[6995]=(c[6995]|0)+1;i=sc((h<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}j=c[b+52>>2]|0}if((j|0)>0){k=0;do{c[i+(k<<2)>>2]=c[(c[b+60>>2]|0)+(k<<2)>>2];k=k+1|0}while((k|0)!=(j|0))}k=c[b+60>>2]|0;if(k){if(a[b+64>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);j=c[b+52>>2]|0}c[b+60>>2]=0}a[b+64>>0]=1;c[b+60>>2]=i;c[b+56>>2]=h;i=j;j=h}else i=j}c[(c[b+60>>2]|0)+(i<<2)>>2]=c[m>>2];i=i+1|0;c[b+52>>2]=i;l=l+1|0}while((l|0)!=(g|0))}if((n|0)>0){m=0;i=c[b+72>>2]|0;j=c[b+76>>2]|0;do{l=o+(m<<2)|0;if((i|0)==(j|0)){h=j|0?j<<1:1;if((j|0)<(h|0)){if(!h){k=0;i=j}else{c[6995]=(c[6995]|0)+1;i=sc((h<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}k=i;i=c[b+72>>2]|0}if((i|0)>0){j=0;do{c[k+(j<<2)>>2]=c[(c[b+80>>2]|0)+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0))}j=c[b+80>>2]|0;if(j){if(a[b+84>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);i=c[b+72>>2]|0}c[b+80>>2]=0}a[b+84>>0]=1;c[b+80>>2]=k;c[b+76>>2]=h;j=h}else i=j}c[(c[b+80>>2]|0)+(i<<2)>>2]=c[l>>2];i=i+1|0;c[b+72>>2]=i;m=m+1|0}while((m|0)!=(n|0))}else i=c[b+72>>2]|0;if(((c[b+52>>2]|0)+i|0)<=(c[(c[b+4>>2]|0)+80>>2]|0))return;gh(b);return}function $d(d,f,h,i){d=d|0;f=f|0;h=h|0;i=i|0;var j=0,k=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.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0;w=l;l=l+80|0;v=c[d+52>>2]|0;c[w>>2]=7212;c[w+4>>2]=v;c[w+8>>2]=f;c[w+60>>2]=0;v=c[d+56>>2]|0;if(!(a[v+60>>0]|0)){f=c[v+56>>2]|0;if((f|0)>0){p=0;d=0;m=c[v+96>>2]|0;while(1){d=d+1|0;if(!(+g[h>>2]>+g[m+16>>2])?!(+g[i>>2]<+g[m>>2]):0)j=1;else j=0;if(!(!(+g[h+8>>2]>+g[m+24>>2])?!(+g[i+8>>2]<+g[m+8>>2]):0))j=0;if(!(+g[h+4>>2]>+g[m+20>>2])?!(+g[i+4>>2]<+g[m+4>>2]):0){k=c[m+32>>2]|0;if(j&(k|0)==-1){Sb[c[(c[w>>2]|0)+8>>2]&127](w,c[m+36>>2]|0,c[m+40>>2]|0);f=c[v+56>>2]|0;o=43}else{n=(k|0)==-1;o=42}}else{k=c[m+32>>2]|0;n=(k|0)==-1;j=0;o=42}if((o|0)==42){o=0;if(n|j)o=43;else{m=m+(k<<6)|0;j=k+p|0}}if((o|0)==43){m=m+64|0;j=p+1|0}if((j|0)<(f|0))p=j;else break}}else d=0;if((c[6160]|0)>=(d|0)){l=w;return}c[6160]=d;l=w;return}z=+g[h>>2];D=+g[h+4>>2];H=+g[h+8>>2];G=+g[v+4>>2];z=z>2];D=D>2];H=H>2];E=+g[v+24>>2];A=+g[v+28>>2];F=+g[v+36>>2];B=+g[v+40>>2];x=+g[v+44>>2];s=~~(((I>1]=s;t=~~(((E>1]=t;b[w+70+4>>1]=u;H=+g[i>>2];D=+g[i+4>>2];z=+g[i+8>>2];H=H>1]=i;q=~~(((E>1]=q;b[w+64+4>>1]=r;switch(c[v+144>>2]|0){case 0:{o=c[v+56>>2]|0;if((o|0)>0){d=0;f=c[v+136>>2]|0;j=0;do{d=d+1|0;k=((i&65535)>=(e[f>>1]|0)?(s&65535)<=(e[f+6>>1]|0):0)&(u&65535)<=(e[f+10>>1]|0)&(r&65535)>=(e[f+4>>1]|0)&(t&65535)<=(e[f+8>>1]|0)&(q&65535)>=(e[f+2>>1]|0);m=f+12|0;n=c[m>>2]|0;if((n|0)>-1&k)Sb[c[(c[w>>2]|0)+8>>2]&127](w,n>>>21,n&2097151);if(k|(n|0)>-1){j=j+1|0;f=f+16|0}else{v=c[m>>2]|0;j=j-v|0;f=f+(0-v<<4)|0}}while((j|0)<(o|0))}else d=0;if((c[6160]|0)<(d|0))c[6160]=d;break}case 1:{if((c[v+152>>2]|0)>0){h=0;do{d=c[v+160>>2]|0;if(((i&65535)>=(e[d+(h<<5)>>1]|0)?(s&65535)<=(e[d+(h<<5)+6>>1]|0):0)&(u&65535)<=(e[d+(h<<5)+10>>1]|0)&(r&65535)>=(e[d+(h<<5)+4>>1]|0)&(t&65535)<=(e[d+(h<<5)+8>>1]|0)&(q&65535)>=(e[d+(h<<5)+2>>1]|0)){p=c[d+(h<<5)+12>>2]|0;o=c[d+(h<<5)+16>>2]|0;if((o|0)>0){d=0;f=(c[v+136>>2]|0)+(p<<4)|0;j=p;do{d=d+1|0;k=((i&65535)>=(e[f>>1]|0)?(s&65535)<=(e[f+6>>1]|0):0)&(u&65535)<=(e[f+10>>1]|0)&(r&65535)>=(e[f+4>>1]|0)&(t&65535)<=(e[f+8>>1]|0)&(q&65535)>=(e[f+2>>1]|0);m=f+12|0;n=c[m>>2]|0;if((n|0)>-1&k)Sb[c[(c[w>>2]|0)+8>>2]&127](w,n>>>21,n&2097151);if(k|(n|0)>-1){j=j+1|0;f=f+16|0}else{n=c[m>>2]|0;j=j-n|0;f=f+(0-n<<4)|0}}while((j|0)<(o+p|0))}else d=0;if((c[6160]|0)<(d|0))c[6160]=d}h=h+1|0}while((h|0)<(c[v+152>>2]|0))}break}case 2:{Ek(c[v+136>>2]|0,w,w+70|0,w+64|0);break}default:{}}l=w;return}function ae(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;var f=0,h=0,i=0,j=0.0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0;x=l;l=l+192|0;w=c[a+4>>2]|0;o=+g[w+784>>2];if(o>2]|0;i=(c[a+8>>2]|0)+8|0;v=c[i>>2]|0;E=+g[d>>2];j=+g[b>>2]*e+E;B=+g[d+4>>2];m=+g[b+4>>2]*e+B;y=+g[d+8>>2];n=+g[b+8>>2]*e+y;k=(c[a+12>>2]|0)+8|0;f=c[k>>2]|0;t=(u|0)!=(v|0)?f:u;f=(u|0)!=(v|0)?v:f;z=j-+g[t+52>>2];A=m-+g[t+56>>2];r=n-+g[t+60>>2];p=z*+g[t+4>>2]+A*+g[t+20>>2]+r*+g[t+36>>2];q=z*+g[t+8>>2]+A*+g[t+24>>2]+r*+g[t+40>>2];r=z*+g[t+12>>2]+A*+g[t+28>>2]+r*+g[t+44>>2];E=E-+g[f+52>>2];B=B-+g[f+56>>2];y=y-+g[f+60>>2];A=E*+g[f+4>>2]+B*+g[f+20>>2]+y*+g[f+36>>2];z=E*+g[f+8>>2]+B*+g[f+24>>2]+y*+g[f+40>>2];y=E*+g[f+12>>2]+B*+g[f+28>>2]+y*+g[f+44>>2];g[x>>2]=p;g[x+4>>2]=q;g[x+8>>2]=r;g[x+12>>2]=0.0;g[x+16>>2]=A;g[x+20>>2]=z;g[x+24>>2]=y;g[x+28>>2]=0.0;c[x+64>>2]=c[b>>2];c[x+64+4>>2]=c[b+4>>2];c[x+64+8>>2]=c[b+8>>2];c[x+64+12>>2]=c[b+12>>2];g[x+80>>2]=e;c[x+84>>2]=0;c[x+84+4>>2]=0;c[x+84+8>>2]=0;c[x+84+12>>2]=0;b=x+116|0;f=b+44|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(f|0));g[x+48>>2]=j;g[x+52>>2]=m;g[x+56>>2]=n;g[x+60>>2]=0.0;c[x+32>>2]=c[d>>2];c[x+32+4>>2]=c[d+4>>2];c[x+32+8>>2]=c[d+8>>2];c[x+32+12>>2]=c[d+12>>2];h=c[w+780>>2]|0;if((h|0)>0){b=-1;d=0;e=o*o;while(1){j=+g[w+4+(d*192|0)>>2]-p;m=+g[w+4+(d*192|0)+4>>2]-q;n=+g[w+4+(d*192|0)+8>>2]-r;f=j*j+m*m+n*n>2]|0;f=c[k>>2]|0;E=+g[b+228>>2];B=+g[f+228>>2];A=E*B<-10.0?-10.0:E*B;g[x+84>>2]=A>10.0?10.0:A;g[x+96>>2]=+g[b+232>>2]*+g[f+232>>2];A=+g[b+236>>2]*B+ +g[f+236>>2]*E;A=A<-10.0?-10.0:A;g[x+88>>2]=A>10.0?10.0:A;E=+g[b+240>>2]*B+ +g[f+240>>2]*E;E=E<-10.0?-10.0:E;g[x+92>>2]=E>10.0?10.0:E;d=c[b+204>>2]|0;if((d&128|0)==0?(c[f+204>>2]&128|0)==0:0)b=0;else{g[x+148>>2]=+g[b+244>>2]+ +g[f+244>>2];g[x+144>>2]=1.0/(1.0/+g[b+248>>2]+1.0/+g[f+248>>2]);c[x+120>>2]=8;b=8}if((d&512|0)==0?(c[f+204>>2]&512|0)==0:0)s=b;else{s=b|16;c[x+120>>2]=s}e=+g[x+72>>2];k=+C(+e)>.7071067690849304;n=+g[x+68>>2];if(k){m=1.0/+D(+(e*e+n*n));q=+g[x+64>>2];o=-(m*e);p=q*-(m*e);q=-(m*n*q);j=(e*e+n*n)*m;m=m*n;e=0.0}else{j=+g[x+64>>2];E=1.0/+D(+(j*j+n*n));o=E*j;p=(j*j+n*n)*E;q=e*-(n*E);j=-(E*j*e);m=0.0;e=-(n*E)}g[x+160>>2]=e;g[x+164>>2]=o;g[x+168>>2]=m;g[x+176>>2]=j;g[x+180>>2]=q;g[x+184>>2]=p;f=c[a+16>>2]|0;b=c[a+20>>2]|0;if((u|0)!=(v|0)){c[x+100>>2]=b;d=a+28|0;b=a+24|0}else{c[x+100>>2]=f;d=a+24|0;f=b;b=a+28|0}a=c[d>>2]|0;c[x+104>>2]=f;c[x+108>>2]=a;c[x+112>>2]=c[b>>2];if((t|0)>-1){b=w+4+(t*192|0)|0;f=w+4+(t*192|0)+156|0;d=c[f>>2]|0;h=w+4+(t*192|0)+124|0;e=+g[h>>2];i=w+4+(t*192|0)+128|0;j=+g[i>>2];k=w+4+(t*192|0)+132|0;m=+g[k>>2];if(!((s&16|0)!=0?(E=e*+g[w+4+(t*192|0)+84>>2]+0.0,!(j*j+m*m>E*E)):0)){w=w+4+(t*192|0)+116|0;a=c[w>>2]|0;gi(b|0,x|0,192)|0;c[w>>2]=a;g[h>>2]=e;g[i>>2]=j;g[k>>2]=m}c[f>>2]=d}else kf(w,x)|0;l=x;return}function be(b,d,e){b=b|0;d=+d;e=+e;var f=0,h=0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0;s=l;l=l+80|0;f=c[b+8>>2]|0;if(!f){f=c[b+4>>2]|0;if(!f){k=0.0;o=0.0;m=0.0;d=0.0;j=0.0;n=0.0}else{r=+g[f+336>>2];j=+g[b+172>>2];t=+g[f+340>>2];p=+g[b+168>>2];n=+g[b+164>>2];q=+g[f+332>>2];k=+g[f+316>>2];o=+g[f+320>>2];m=+g[f+324>>2];d=r*j-t*p;j=t*n-j*q;n=p*q-r*n}}else{t=+g[f+392>>2];j=+g[b+172>>2];p=+g[f+396>>2];q=+g[b+168>>2];n=+g[b+164>>2];r=+g[f+388>>2];k=+g[f+372>>2];o=+g[f+376>>2];m=+g[f+380>>2];d=t*j-p*q;j=p*n-j*r;n=q*r-t*n}p=k+d;r=o+j;q=m+n;f=c[b+20>>2]|0;if(!f){f=c[b+16>>2]|0;if(!f){k=0.0;n=0.0;m=0.0;d=0.0;j=0.0;o=0.0}else{t=+g[f+336>>2];j=+g[b+188>>2];w=+g[f+340>>2];v=+g[b+184>>2];o=+g[b+180>>2];u=+g[f+332>>2];k=+g[f+316>>2];n=+g[f+320>>2];m=+g[f+324>>2];d=t*j-w*v;j=w*o-j*u;o=v*u-t*o}}else{w=+g[f+392>>2];j=+g[b+188>>2];t=+g[f+396>>2];u=+g[b+184>>2];o=+g[b+180>>2];v=+g[f+388>>2];k=+g[f+372>>2];n=+g[f+376>>2];m=+g[f+380>>2];d=w*j-t*u;j=t*o-j*v;o=u*v-w*o}p=p-(k+d);n=r-(n+j);d=q-(m+o);j=+g[b+196>>2];k=+g[b+200>>2];m=+g[b+204>>2];a[s+36+32>>0]=1;c[s+36+16>>2]=0;c[s+36+16+4>>2]=0;c[s+36+16+8>>2]=0;c[s+36+16+12>>2]=0;c[s+36>>2]=c[b+72>>2];c[s+36+4>>2]=c[b+72+4>>2];c[s+36+8>>2]=c[b+72+8>>2];c[s+36+12>>2]=c[b+72+12>>2];if(j*p+n*k+d*m<0.0){u=+g[b+212>>2];v=+g[s+36>>2]+((j*p+n*k+d*m)*j+(p-(j*p+n*k+d*m)*j)*u);g[s+36>>2]=v;w=(j*p+n*k+d*m)*k+u*(n-(j*p+n*k+d*m)*k)+ +g[s+36+4>>2];g[s+36+4>>2]=w;k=(j*p+n*k+d*m)*m+u*(d-(j*p+n*k+d*m)*m)+ +g[s+36+8>>2];g[s+36+8>>2]=k;f=s+36+4|0;h=s+36+8|0;i=s+36|0;d=v;j=w}else{f=s+36+4|0;h=s+36+8|0;i=s+36|0;d=+g[s+36>>2];j=+g[s+36+4>>2];k=+g[s+36+8>>2]}m=(+g[b+104>>2]*d+ +g[b+108>>2]*j+ +g[b+112>>2]*k)*e;n=(d*+g[b+120>>2]+j*+g[b+124>>2]+k*+g[b+128>>2])*e;d=(d*+g[b+136>>2]+j*+g[b+140>>2]+k*+g[b+144>>2])*e;g[i>>2]=m;g[f>>2]=n;g[h>>2]=d;g[s+36+12>>2]=0.0;f=c[b+4>>2]|0;if((f|0)!=(c[b+16>>2]|0)){f=s;h=s+36|0;i=f+36|0;do{c[f>>2]=c[h>>2];f=f+4|0;h=h+4|0}while((f|0)<(i|0));w=-+g[s+4>>2];v=-+g[s+8>>2];g[s>>2]=-+g[s>>2];g[s+4>>2]=w;g[s+8>>2]=v;g[s+12>>2]=0.0;v=-+g[s+20>>2];w=-+g[s+24>>2];g[s+16>>2]=-+g[s+16>>2];g[s+20>>2]=v;g[s+24>>2]=w;g[s+28>>2]=0.0;Nh(b+4|0,s,b+164|0);Nh(b+16|0,s+36|0,b+180|0);l=s;return}if(!(m==m&n==n&(d==d&0.0==0.0))){l=s;return}w=+D(+(m*m+n*n+d*d));if(w<+g[f+368>>2]){l=s;return}h=c[s+36+32>>2]|0;w=+g[f+372>>2];g[s+12>>2]=0.0;g[s+28>>2]=0.0;c[s+32>>2]=h;g[s>>2]=-(m*w);g[s+4>>2]=-(n*w);g[s+8>>2]=-(d*w);g[s+16>>2]=w*-0.0;g[s+20>>2]=w*-0.0;g[s+24>>2]=w*-0.0;Nh(b+4|0,s,b+164|0);d=+g[(c[b+4>>2]|0)+372>>2];f=s;h=s+36|0;i=f+36|0;do{c[f>>2]=c[h>>2];f=f+4|0;h=h+4|0}while((f|0)<(i|0));g[s>>2]=d*+g[s>>2];g[s+4>>2]=d*+g[s+4>>2];g[s+8>>2]=d*+g[s+8>>2];g[s+16>>2]=d*+g[s+16>>2];g[s+20>>2]=d*+g[s+20>>2];g[s+24>>2]=d*+g[s+24>>2];Nh(b+16|0,s,b+180|0);l=s;return}function ce(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;c[b>>2]=5536;k=(c[d+20>>2]|0)==0;c[6995]=(c[6995]|0)+1;e=sc(23)|0;c[(e+4+15&-16)+-4>>2]=e;c[(e+4+15&-16)>>2]=k?9416:9464;c[b+24>>2]=e+4+15&-16;c[6995]=(c[6995]|0)+1;e=sc(39)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}k=c[b+24>>2]|0;a[e+4>>0]=0;c[e>>2]=6380;c[e+12>>2]=0;c[e+16>>2]=3;c[e+8>>2]=k;c[b+28>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5568;c[b+32>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5588;c[b+36>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5608;c[b+40>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5628;c[b+44>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5648;c[b+48>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5668;c[b+52>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5688;c[b+56>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5708;c[b+72>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[e>>2]=5708;c[b+76>>2]=e;a[e+4>>0]=1;c[6995]=(c[6995]|0)+1;e=sc(27)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5728;c[b+68>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(35)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}a[e+4>>0]=0;c[e>>2]=5748;c[e+8>>2]=1;c[e+12>>2]=0;c[b+84>>2]=e;c[6995]=(c[6995]|0)+1;e=sc(35)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[e>>2]=5748;c[e+8>>2]=1;c[e+12>>2]=0;c[b+80>>2]=e;a[e+4>>0]=1;k=c[d+16>>2]|0;k=(k|0)>80?k:80;e=c[d>>2]|0;if(!e){a[b+12>>0]=1;c[6995]=(c[6995]|0)+1;e=sc(43)|0;if(!e)j=0;else{c[(e+4+15&-16)+-4>>2]=e;j=e+4+15&-16}e=c[d+8>>2]|0;c[j>>2]=804;f=j+4|0;c[f>>2]=e;c[j+20>>2]=0;c[6995]=(c[6995]|0)+1;e=sc((e*804|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[j+16>>2]=e;c[j+12>>2]=e;f=c[f>>2]|0;c[j+8>>2]=f;if(f+-1|0){g=c[j>>2]|0;h=e;i=f+-1|0;do{l=h;h=h+g|0;c[l>>2]=h;i=i+-1|0}while((i|0)!=0);e=e+(P(g,f+-1|0)|0)|0}c[e>>2]=0;c[b+8>>2]=j}else{a[b+12>>0]=0;c[b+8>>2]=e}g=(k|0)>116?k+16&-16:128;e=c[d+4>>2]|0;if(e|0){a[b+20>>0]=0;c[b+16>>2]=e;return}a[b+20>>0]=1;c[6995]=(c[6995]|0)+1;e=sc(43)|0;if(!e)j=0;else{c[(e+4+15&-16)+-4>>2]=e;j=e+4+15&-16}e=c[d+12>>2]|0;c[j>>2]=g;f=j+4|0;c[f>>2]=e;c[j+20>>2]=0;e=P(e,g)|0;c[6995]=(c[6995]|0)+1;e=sc((e|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}c[j+16>>2]=e;c[j+12>>2]=e;f=c[f>>2]|0;c[j+8>>2]=f;if(f+-1|0){g=c[j>>2]|0;h=e;i=f+-1|0;do{l=h;h=h+g|0;c[l>>2]=h;i=i+-1|0}while((i|0)!=0);e=e+(P(g,f+-1|0)|0)|0}c[e>>2]=0;c[b+16>>2]=j;return}function de(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0,s=0,t=0.0,u=0.0;s=l;l=l+48|0;c[s+16>>2]=c[e>>2];c[s+16+4>>2]=c[e+4>>2];c[s+16+8>>2]=c[e+8>>2];c[s+16+12>>2]=c[e+12>>2];c[s+16+16>>2]=c[f>>2];c[s+16+16+4>>2]=c[f+4>>2];c[s+16+16+8>>2]=c[f+8>>2];c[s+16+16+12>>2]=c[f+12>>2];do if((c[d+60>>2]|0)==2){h=c[d+48>>2]|0;Ag(b+44|0,h)|0;i=c[b+48>>2]|0;if(i|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[b+48>>2]=h;c[b+56>>2]=(c[b+56>>2]|0)+-1;h=c[b+8>>2]|0;if(!h){c[6995]=(c[6995]|0)+1;h=sc(63)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}i=h;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0))}else c[b+8>>2]=0;c[h+32>>2]=0;c[h+36>>2]=d;c[h+40>>2]=0;c[h>>2]=c[s+16>>2];c[h+4>>2]=c[s+16+4>>2];c[h+8>>2]=c[s+16+8>>2];c[h+12>>2]=c[s+16+12>>2];c[h+16>>2]=c[s+16+16>>2];c[h+20>>2]=c[s+16+20>>2];c[h+24>>2]=c[s+16+24>>2];c[h+28>>2]=c[s+16+28>>2];Pe(b+4|0,c[b+4>>2]|0,h);c[b+16>>2]=(c[b+16>>2]|0)+1;c[d+48>>2]=h;h=1}else{c[b+128>>2]=(c[b+128>>2]|0)+1;r=c[d+48>>2]|0;if(((((+g[r>>2]<=+g[s+16+16>>2]?+g[r+16>>2]>=+g[s+16>>2]:0)?+g[r+4>>2]<=+g[s+16+20>>2]:0)?+g[r+20>>2]>=+g[s+16+4>>2]:0)?+g[r+8>>2]<=+g[s+16+24>>2]:0)?+g[r+24>>2]>=+g[s+16+8>>2]:0){k=+g[d+16>>2];t=+g[e>>2]-k;m=+g[d+20>>2];p=+g[e+4>>2]-m;n=+g[d+24>>2];q=+g[e+8>>2]-n;u=+g[b+100>>2];k=(+g[d+32>>2]-k)*.5*u;m=(+g[d+36>>2]-m)*.5*u;n=u*(+g[d+40>>2]-n)*.5;g[s>>2]=k;g[s+4>>2]=m;g[s+8>>2]=n;g[s+12>>2]=0.0;if(t<0.0)g[s>>2]=-k;if(p<0.0)g[s+4>>2]=-m;if(q<0.0)g[s+8>>2]=-n;if(uh(b+4|0,r,s+16|0,s,.05000000074505806)|0){c[b+132>>2]=(c[b+132>>2]|0)+1;h=1}else h=0;break}h=Ag(b+4|0,r)|0;a:do if(h){o=c[b+12>>2]|0;if((o|0)<=-1){h=c[b+4>>2]|0;break}if(o){i=0;while(1){j=c[h+32>>2]|0;i=i+1|0;if(!j)break a;if((i|0)>=(o|0)){h=j;break}else h=j}}}else h=0;while(0);c[r>>2]=c[s+16>>2];c[r+4>>2]=c[s+16+4>>2];c[r+8>>2]=c[s+16+8>>2];c[r+12>>2]=c[s+16+12>>2];c[r+16>>2]=c[s+16+16>>2];c[r+20>>2]=c[s+16+20>>2];c[r+24>>2]=c[s+16+24>>2];c[r+28>>2]=c[s+16+28>>2];Pe(b+4|0,h,r);c[b+132>>2]=(c[b+132>>2]|0)+1;h=1}while(0);i=c[d+52>>2]|0;c[((i|0)==0?b+84+(c[d+60>>2]<<2)|0:i+56|0)>>2]=c[d+56>>2];i=c[d+56>>2]|0;if(i|0)c[i+52>>2]=c[d+52>>2];c[d+16>>2]=c[e>>2];c[d+16+4>>2]=c[e+4>>2];c[d+16+8>>2]=c[e+8>>2];c[d+16+12>>2]=c[e+12>>2];c[d+32>>2]=c[f>>2];c[d+32+4>>2]=c[f+4>>2];c[d+32+8>>2]=c[f+8>>2];c[d+32+12>>2]=c[f+12>>2];i=c[b+104>>2]|0;c[d+60>>2]=i;c[d+52>>2]=0;c[d+56>>2]=c[b+84+(i<<2)>>2];j=c[b+84+(i<<2)>>2]|0;if(j|0)c[j+52>>2]=d;c[b+84+(i<<2)>>2]=d;if(!h){l=s;return}a[b+154>>0]=1;if(a[b+153>>0]|0){l=s;return}c[s>>2]=9248;c[s+4>>2]=b;ne(b+44|0,c[b+44>>2]|0,c[d+48>>2]|0,s);ne(b+4|0,c[b+4>>2]|0,c[d+48>>2]|0,s);l=s;return}function ee(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0,h=0,i=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;D=c[a+772>>2]|0;if((D|0)>0){c[6995]=(c[6995]|0)+1;d=sc((D<<4|3)+16|0)|0;if(!d)h=0;else{c[(d+4+15&-16)+-4>>2]=d;h=d+4+15&-16}Yk(h|0,0,D<<4|0)|0;f=c[a+772>>2]|0;if((f|0)>0){c[6995]=(c[6995]|0)+1;d=sc((f<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}Yk(d|0,0,f<<2|0)|0;B=d;C=h;A=d;z=h}else{B=0;C=h;A=0;z=h}}else{B=0;C=0;A=0;z=0}y=c[a+1112>>2]|0;if(b){if((y|0)>0){i=c[a+1120>>2]|0;d=0;do{f=c[i+(d<<2)>>2]|0;h=c[f+312>>2]|0;if(h|0){g[f+276>>2]=1.0/+(h|0)*+g[f+276>>2];g[f+280>>2]=1.0/+(h|0)*+g[f+280>>2];g[f+284>>2]=1.0/+(h|0)*+g[f+284>>2];g[f+292>>2]=+g[f+292>>2]*(1.0/+(h|0));g[f+296>>2]=1.0/+(h|0)*+g[f+296>>2];g[f+300>>2]=1.0/+(h|0)*+g[f+300>>2]}d=d+1|0}while((d|0)!=(y|0));i=11}}else i=11;if((i|0)==11?(y|0)>0:0){k=c[a+1120>>2]|0;if(b){f=0;do{h=c[k+(f<<2)>>2]|0;if((c[h+312>>2]|0)>0?(w=+g[a+512>>2],r=+g[h+276>>2]*w,s=w*+g[h+280>>2],t=w*+g[h+284>>2],u=w*+g[h+292>>2],v=w*+g[h+296>>2],w=w*+g[h+300>>2],x=c[h+24>>2]|0,(x|0)>0):0){i=c[h+32>>2]|0;b=c[a+780>>2]|0;j=c[h+12>>2]|0;d=0;do{q=c[i+(d<<2)>>2]|0;p=+g[j+(d<<2)>>2];o=+g[q+8>>2]-+g[h+228>>2];n=+g[q+12>>2]-+g[h+232>>2];m=+g[q+16>>2]-+g[h+236>>2];E=C+(((q-b|0)/104|0)<<4)|0;g[E>>2]=+g[E>>2]+p*(r+(v*m-w*n));E=C+(((q-b|0)/104|0)<<4)+4|0;g[E>>2]=+g[E>>2]+p*(s+(w*o-u*m));E=C+(((q-b|0)/104|0)<<4)+8|0;g[E>>2]=p*(t+(u*n-v*o))+ +g[E>>2];q=B+(((q-b|0)/104|0)<<2)|0;g[q>>2]=p+ +g[q>>2];d=d+1|0}while((d|0)!=(x|0))}f=f+1|0}while((f|0)!=(y|0))}else{f=0;do{h=c[k+(f<<2)>>2]|0;if((c[h+308>>2]|0)>0?(p=+g[a+512>>2],e=+g[h+244>>2]*p,l=p*+g[h+248>>2],m=p*+g[h+252>>2],n=p*+g[h+260>>2],o=p*+g[h+264>>2],p=p*+g[h+268>>2],q=c[h+24>>2]|0,(q|0)>0):0){i=c[h+32>>2]|0;b=c[a+780>>2]|0;j=c[h+12>>2]|0;d=0;do{E=c[i+(d<<2)>>2]|0;w=+g[j+(d<<2)>>2];v=+g[E+8>>2]-+g[h+228>>2];u=+g[E+12>>2]-+g[h+232>>2];t=+g[E+16>>2]-+g[h+236>>2];x=C+(((E-b|0)/104|0)<<4)|0;g[x>>2]=+g[x>>2]+w*(e+(o*t-p*u));x=C+(((E-b|0)/104|0)<<4)+4|0;g[x>>2]=+g[x>>2]+w*(l+(p*v-n*t));x=C+(((E-b|0)/104|0)<<4)+8|0;g[x>>2]=w*(m+(n*u-o*v))+ +g[x>>2];E=B+(((E-b|0)/104|0)<<2)|0;g[E>>2]=w+ +g[E>>2];d=d+1|0}while((d|0)!=(q|0))}f=f+1|0}while((f|0)!=(y|0))}}if((D|0)>0){d=0;do{e=+g[B+(d<<2)>>2];if(e>0.0){v=1.0/e*+g[C+(d<<4)+4>>2];w=1.0/e*+g[C+(d<<4)+8>>2];E=c[a+780>>2]|0;y=E+(d*104|0)+8|0;g[y>>2]=1.0/e*+g[C+(d<<4)>>2]+ +g[y>>2];y=E+(d*104|0)+12|0;g[y>>2]=v+ +g[y>>2];E=E+(d*104|0)+16|0;g[E>>2]=w+ +g[E>>2]}d=d+1|0}while((d|0)!=(D|0))}if(!((B|0)==0|(A|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[A+-4>>2]|0)}if((C|0)==0|(z|0)==0)return;c[6996]=(c[6996]|0)+1;Cd(c[z+-4>>2]|0);return}function fe(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0;p=l;l=l+144|0;if((c[a+20>>2]|0)<=0){o=a+80|0;c[o>>2]=c[b>>2];c[o+4>>2]=c[b+4>>2];c[o+8>>2]=c[b+8>>2];c[o+12>>2]=c[b+12>>2];o=c[a>>2]|0;o=o+68|0;o=c[o>>2]|0;Ib[o&511](a);l=p;return}j=p+16+16|0;k=p+16+32|0;m=p+16+48|0;i=0;do{o=c[a+28>>2]|0;n=o+(i*80|0)|0;c[p+16>>2]=c[n>>2];c[p+16+4>>2]=c[n+4>>2];c[p+16+8>>2]=c[n+8>>2];c[p+16+12>>2]=c[n+12>>2];n=o+(i*80|0)+16|0;c[j>>2]=c[n>>2];c[j+4>>2]=c[n+4>>2];c[j+8>>2]=c[n+8>>2];c[j+12>>2]=c[n+12>>2];n=o+(i*80|0)+32|0;c[k>>2]=c[n>>2];c[k+4>>2]=c[n+4>>2];c[k+8>>2]=c[n+8>>2];c[k+12>>2]=c[n+12>>2];n=o+(i*80|0)+48|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];o=c[o+(i*80|0)+64>>2]|0;o=xb[c[(c[o>>2]|0)+28>>2]&127](o)|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];q=+g[p+4>>2]*+g[b+4>>2]/+g[a+84>>2];r=+g[p+8>>2]*+g[b+8>>2]/+g[a+88>>2];g[p>>2]=+g[p>>2]*+g[b>>2]/+g[a+80>>2];g[p+4>>2]=q;g[p+8>>2]=r;g[p+12>>2]=0.0;o=c[(c[a+28>>2]|0)+(i*80|0)+64>>2]|0;Ob[c[(c[o>>2]|0)+24>>2]&127](o,p);r=+g[p+16+52>>2]*+g[b+4>>2]/+g[a+84>>2];q=+g[p+16+56>>2]*+g[b+8>>2]/+g[a+88>>2];g[p+16+48>>2]=+g[m>>2]*+g[b>>2]/+g[a+80>>2];g[p+16+52>>2]=r;g[p+16+56>>2]=q;g[p+16+60>>2]=0.0;o=c[a+28>>2]|0;n=o+(i*80|0)|0;c[n>>2]=c[p+16>>2];c[n+4>>2]=c[p+16+4>>2];c[n+8>>2]=c[p+16+8>>2];c[n+12>>2]=c[p+16+12>>2];n=o+(i*80|0)+16|0;c[n>>2]=c[j>>2];c[n+4>>2]=c[j+4>>2];c[n+8>>2]=c[j+8>>2];c[n+12>>2]=c[j+12>>2];n=o+(i*80|0)+32|0;c[n>>2]=c[k>>2];c[n+4>>2]=c[k+4>>2];c[n+8>>2]=c[k+8>>2];c[n+12>>2]=c[k+12>>2];o=o+(i*80|0)+48|0;c[o>>2]=c[m>>2];c[o+4>>2]=c[m+4>>2];c[o+8>>2]=c[m+8>>2];c[o+12>>2]=c[m+12>>2];if(c[a+68>>2]|0){n=c[(c[a+28>>2]|0)+(i*80|0)+64>>2]|0;Vb[c[(c[n>>2]|0)+8>>2]&127](n,p+16|0,p+128|0,p+112|0);c[p+80>>2]=c[p+128>>2];c[p+80+4>>2]=c[p+128+4>>2];c[p+80+8>>2]=c[p+128+8>>2];c[p+80+12>>2]=c[p+128+12>>2];c[p+80+16>>2]=c[p+112>>2];c[p+80+16+4>>2]=c[p+112+4>>2];c[p+80+16+8>>2]=c[p+112+8>>2];c[p+80+16+12>>2]=c[p+112+12>>2];n=c[a+68>>2]|0;o=c[(c[a+28>>2]|0)+(i*80|0)+76>>2]|0;d=Ag(n,o)|0;a:do if(d){h=c[n+8>>2]|0;if((h|0)<=-1){d=c[n>>2]|0;break}if(h){e=0;while(1){f=c[d+32>>2]|0;e=e+1|0;if(!f)break a;if((e|0)>=(h|0)){d=f;break}else d=f}}}else d=0;while(0);c[o>>2]=c[p+80>>2];c[o+4>>2]=c[p+80+4>>2];c[o+8>>2]=c[p+80+8>>2];c[o+12>>2]=c[p+80+12>>2];c[o+16>>2]=c[p+80+16>>2];c[o+20>>2]=c[p+80+20>>2];c[o+24>>2]=c[p+80+24>>2];c[o+28>>2]=c[p+80+28>>2];Pe(n,d,o)}i=i+1|0}while((i|0)<(c[a+20>>2]|0));o=a+80|0;c[o>>2]=c[b>>2];c[o+4>>2]=c[b+4>>2];c[o+8>>2]=c[b+8>>2];c[o+12>>2]=c[b+12>>2];o=c[a>>2]|0;o=o+68|0;o=c[o>>2]|0;Ib[o&511](a);l=p;return}function ge(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,i=0.0,j=0.0,k=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0;s=l;l=l+96|0;q=c[b+12>>2]|0;Vb[c[(c[q>>2]|0)+8>>2]&127](q,(c[b+8>>2]|0)+4|0,s+80|0,s+64|0);q=c[d+68>>2]|0;Zb[c[(c[q>>2]|0)+16>>2]&31](q,c[(c[b+8>>2]|0)+188>>2]|0,s+80|0,s+64|0,c[d+24>>2]|0);q=c[d+24>>2]|0;Vb[c[(c[q>>2]|0)+32>>2]&127](q,c[(c[b+8>>2]|0)+344>>2]|0,d+28|0,q);q=c[b+8>>2]|0;c[b+132>>2]=c[q+52>>2];c[b+132+4>>2]=c[q+52+4>>2];c[b+132+8>>2]=c[q+52+8>>2];c[b+132+12>>2]=c[q+52+12>>2];q=c[q+344>>2]|0;if((xb[c[(c[q>>2]|0)+36>>2]&127](q)|0)>0){d=0;q=0;do{e=c[b+204>>2]|0;if((e|0)<0){if((c[b+208>>2]|0)<0){f=c[b+212>>2]|0;if(f|0){if(a[b+216>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+212>>2]=0}a[b+216>>0]=1;c[b+212>>2]=0;c[b+208>>2]=0}do{c[(c[b+212>>2]|0)+(e<<2)>>2]=0;e=e+1|0}while((e|0)!=0)}c[b+204>>2]=0;e=c[(c[b+8>>2]|0)+344>>2]|0;e=c[(xb[c[(c[e>>2]|0)+28>>2]&127](e)|0)+12>>2]|0;f=c[c[e+(q<<4)>>2]>>2]|0;h=c[c[e+(q<<4)+4>>2]>>2]|0;if(!((f|0)!=0?(c[f+204>>2]&4|0)!=0:0))r=14;do if((r|0)==14){r=0;if(h|0?c[h+204>>2]&4|0:0)break;if(Bb[c[(c[b>>2]|0)+56>>2]&63](b,f,h)|0){e=c[e+(q<<4)+8>>2]|0;if(e|0)Ob[c[(c[e>>2]|0)+16>>2]&127](e,b+200|0);p=c[b+204>>2]|0;if((p|0)>0){n=c[b+212>>2]|0;o=c[b+8>>2]|0;m=0;do{f=c[n+(m<<2)>>2]|0;j=(c[f+772>>2]|0)==(o|0)?-1.0:1.0;h=c[f+780>>2]|0;if((h|0)>0){k=-+g[b+16>>2];e=0;do{i=+g[f+4+(e*192|0)+80>>2];if(i>2]*.20000000298023224;t=i*j*+g[f+4+(e*192|0)+72>>2]*.20000000298023224;g[b+132>>2]=i*j*+g[f+4+(e*192|0)+64>>2]*.20000000298023224+ +g[b+132>>2];g[b+136>>2]=u+ +g[b+136>>2];g[b+140>>2]=t+ +g[b+140>>2];d=1}e=e+1|0}while((e|0)!=(h|0))}m=m+1|0}while((m|0)!=(p|0))}}}while(0);q=q+1|0;p=c[(c[b+8>>2]|0)+344>>2]|0}while((q|0)<(xb[c[(c[p>>2]|0)+36>>2]&127](p)|0))}else d=0;r=c[b+8>>2]|0;c[s>>2]=c[r+4>>2];c[s+4>>2]=c[r+4+4>>2];c[s+8>>2]=c[r+4+8>>2];c[s+12>>2]=c[r+4+12>>2];c[s+16>>2]=c[r+20>>2];c[s+16+4>>2]=c[r+20+4>>2];c[s+16+8>>2]=c[r+20+8>>2];c[s+16+12>>2]=c[r+20+12>>2];c[s+32>>2]=c[r+36>>2];c[s+32+4>>2]=c[r+36+4>>2];c[s+32+8>>2]=c[r+36+8>>2];c[s+32+12>>2]=c[r+36+12>>2];c[s+48>>2]=c[b+132>>2];c[s+48+4>>2]=c[b+132+4>>2];c[s+48+8>>2]=c[b+132+8>>2];c[s+48+12>>2]=c[b+132+12>>2];c[r+304>>2]=(c[r+304>>2]|0)+1;c[r+4>>2]=c[s>>2];c[r+4+4>>2]=c[s+4>>2];c[r+4+8>>2]=c[s+8>>2];c[r+4+12>>2]=c[s+12>>2];c[r+20>>2]=c[s+16>>2];c[r+20+4>>2]=c[s+16+4>>2];c[r+20+8>>2]=c[s+16+8>>2];c[r+20+12>>2]=c[s+16+12>>2];c[r+36>>2]=c[s+32>>2];c[r+36+4>>2]=c[s+32+4>>2];c[r+36+8>>2]=c[s+32+8>>2];c[r+36+12>>2]=c[s+32+12>>2];c[r+52>>2]=c[s+48>>2];c[r+52+4>>2]=c[s+48+4>>2];c[r+52+8>>2]=c[s+48+8>>2];c[r+52+12>>2]=c[s+48+12>>2];l=s;return d|0}function he(d,f,h,i,j,k){d=d|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0.0,m=0.0,n=0.0;c[d>>2]=8928;b[d+4>>1]=-2;b[d+6>>1]=-1;c[d+92>>2]=j;c[d+96>>2]=0;a[d+100>>0]=0;c[d+104>>2]=0;c[d+108>>2]=0;if(!j){c[6995]=(c[6995]|0)+1;j=sc(91)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}Li(j);c[d+92>>2]=j;a[d+100>>0]=1}if(!k){c[6995]=(c[6995]|0)+1;j=sc(43)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}k=j+4|0;c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0;c[j>>2]=8992;a[j+20>>0]=1;c[j+16>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[d+112>>2]=j;c[6995]=(c[6995]|0)+1;j=sc(195)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}Ne(j,c[d+112>>2]|0);c[d+108>>2]=j;a[j+153>>0]=1}c[d+8>>2]=c[f>>2];c[d+8+4>>2]=c[f+4>>2];c[d+8+8>>2]=c[f+8>>2];c[d+8+12>>2]=c[f+12>>2];c[d+24>>2]=c[h>>2];c[d+24+4>>2]=c[h+4>>2];c[d+24+8>>2]=c[h+8>>2];c[d+24+12>>2]=c[h+12>>2];n=+(e[d+6>>1]|0);m=n/(+g[d+28>>2]-+g[d+12>>2]);l=n/(+g[d+32>>2]-+g[d+16>>2]);g[d+40>>2]=n/(+g[d+24>>2]-+g[d+8>>2]);g[d+44>>2]=m;g[d+48>>2]=l;g[d+52>>2]=0.0;h=(i&65535)+1&65535;c[6995]=(c[6995]|0)+1;j=sc(h<<6|19)|0;if(!j)f=0;else{c[(j+4+15&-16)+-4>>2]=j;f=j+4+15&-16}if(h|0){j=f+(h<<6)|0;k=f;do{c[k>>2]=0;k=k+64|0}while((k|0)!=(j|0))}c[d+60>>2]=f;b[d+58>>1]=(i&65535)+1;b[d+56>>1]=0;b[d+64>>1]=1;if(h>>>0>1){j=1;k=1;do{b[f+(k<<6)+48>>1]=k+1;j=j+1<<16>>16;k=j&65535}while(k>>>0>>0)}b[f+(h+-1<<6)+48>>1]=0;c[6995]=(c[6995]|0)+1;j=sc((h<<3|3)+16|0)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}c[d+80>>2]=j;c[d+68>>2]=j;c[6995]=(c[6995]|0)+1;j=sc((h<<3|3)+16|0)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}c[d+84>>2]=j;c[d+72>>2]=j;c[6995]=(c[6995]|0)+1;j=sc((h<<3|3)+16|0)|0;if(!j){f=0;i=d+88|0;c[i>>2]=f;i=d+76|0;c[i>>2]=f;f=c[d+60>>2]|0;c[f>>2]=0;h=f+48|0;b[h>>1]=0;h=f+54|0;b[h>>1]=1;h=c[d+68>>2]|0;b[h>>1]=0;k=h+2|0;b[k>>1]=0;k=b[d+6>>1]|0;j=h+4|0;b[j>>1]=k;h=h+6|0;b[h>>1]=0;h=f+50|0;b[h>>1]=0;h=f+56|0;b[h>>1]=1;h=c[d+72>>2]|0;b[h>>1]=0;j=h+2|0;b[j>>1]=0;j=b[d+6>>1]|0;k=h+4|0;b[k>>1]=j;h=h+6|0;b[h>>1]=0;h=f+52|0;b[h>>1]=0;f=f+58|0;b[f>>1]=1;i=c[i>>2]|0;b[i>>1]=0;f=i+2|0;b[f>>1]=0;f=b[d+6>>1]|0;h=i+4|0;b[h>>1]=f;i=i+6|0;b[i>>1]=0;c[d>>2]=8864;return}c[(j+4+15&-16)+-4>>2]=j;f=j+4+15&-16;i=d+88|0;c[i>>2]=f;i=d+76|0;c[i>>2]=f;f=c[d+60>>2]|0;c[f>>2]=0;h=f+48|0;b[h>>1]=0;h=f+54|0;b[h>>1]=1;h=c[d+68>>2]|0;b[h>>1]=0;k=h+2|0;b[k>>1]=0;k=b[d+6>>1]|0;j=h+4|0;b[j>>1]=k;h=h+6|0;b[h>>1]=0;h=f+50|0;b[h>>1]=0;h=f+56|0;b[h>>1]=1;h=c[d+72>>2]|0;b[h>>1]=0;j=h+2|0;b[j>>1]=0;j=b[d+6>>1]|0;k=h+4|0;b[k>>1]=j;h=h+6|0;b[h>>1]=0;h=f+52|0;b[h>>1]=0;f=f+58|0;b[f>>1]=1;i=c[i>>2]|0;b[i>>1]=0;f=i+2|0;b[f>>1]=0;f=b[d+6>>1]|0;h=i+4|0;b[h>>1]=f;i=i+6|0;b[i>>1]=0;c[d>>2]=8864;return}function ie(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0,X=0.0,Y=0.0;W=l;l=l+240|0;f=(a[b+8>>0]|0)!=0;h=f?e:d;f=f?d:e;S=+g[h+116>>2]-+g[h+52>>2];T=+g[h+120>>2]-+g[h+56>>2];U=+g[h+124>>2]-+g[h+60>>2];V=+g[h+276>>2];if(S*S+T*T+U*U>2];I=+g[f+20>>2];J=+g[f+36>>2];K=+g[f+8>>2];L=+g[f+24>>2];M=+g[f+40>>2];N=+g[f+12>>2];O=+g[f+28>>2];P=+g[f+44>>2];j=-+g[f+52>>2];k=-+g[f+56>>2];m=-+g[f+60>>2];Q=+g[h+4>>2];R=+g[h+20>>2];S=+g[h+36>>2];T=+g[h+8>>2];U=+g[h+24>>2];V=+g[h+40>>2];p=+g[h+12>>2];q=+g[h+28>>2];r=+g[h+44>>2];w=+g[h+52>>2];v=+g[h+56>>2];u=+g[h+60>>2];s=H*j+I*k+J*m+(H*w+I*v+J*u);t=K*j+L*k+M*m+(K*w+L*v+M*u);u=N*j+O*k+P*m+(N*w+O*v+P*u);v=+g[h+68>>2];w=+g[h+84>>2];x=+g[h+100>>2];y=+g[h+72>>2];z=+g[h+88>>2];A=+g[h+104>>2];B=+g[h+76>>2];C=+g[h+92>>2];D=+g[h+108>>2];n=+g[h+116>>2];o=+g[h+120>>2];G=+g[h+124>>2];E=H*j+I*k+J*m+(H*n+I*o+J*G);F=K*j+L*k+M*m+(K*n+L*o+M*G);G=N*j+O*k+P*m+(N*n+O*o+P*G);f=c[f+192>>2]|0;if(((c[f+4>>2]|0)+-21|0)>>>0>=9){X=1.0;l=W;return +X}g[W+224>>2]=s;g[W+224+4>>2]=t;g[W+224+8>>2]=u;g[W+224+12>>2]=0.0;if(E>2]=E;i=E}else i=s;if(F>2]=F;j=F}else j=t;if(G>2]=G;k=G}else k=u;g[W+208>>2]=s;g[W+208+4>>2]=t;g[W+208+8>>2]=u;g[W+208+12>>2]=0.0;if(s>2]=E;m=E}else m=s;if(t>2]=F;n=F}else n=t;if(u>2]=G;o=G}else o=u;Y=+g[h+272>>2];g[W+224>>2]=i-Y;g[W+224+4>>2]=j-Y;g[W+224+8>>2]=k-Y;g[W+208>>2]=Y+m;g[W+208+4>>2]=Y+n;g[W+208+8>>2]=Y+o;c[W>>2]=3876;g[W+4>>2]=H*Q+I*R+J*S;g[W+8>>2]=H*T+I*U+J*V;g[W+12>>2]=H*p+I*q+J*r;g[W+16>>2]=0.0;g[W+20>>2]=K*Q+L*R+M*S;g[W+24>>2]=K*T+L*U+M*V;g[W+28>>2]=K*p+L*q+M*r;g[W+32>>2]=0.0;g[W+36>>2]=N*Q+O*R+P*S;g[W+40>>2]=N*T+O*U+P*V;g[W+44>>2]=N*p+O*q+P*r;g[W+48>>2]=0.0;g[W+52>>2]=s;g[W+56>>2]=t;g[W+60>>2]=u;g[W+64>>2]=0.0;g[W+68>>2]=H*v+I*w+J*x;g[W+72>>2]=H*y+I*z+J*A;g[W+76>>2]=H*B+I*C+J*D;g[W+80>>2]=0.0;g[W+84>>2]=K*v+L*w+M*x;g[W+88>>2]=K*y+L*z+M*A;g[W+92>>2]=K*B+L*C+M*D;g[W+96>>2]=0.0;g[W+100>>2]=N*v+O*w+P*x;g[W+104>>2]=N*y+O*z+P*A;g[W+108>>2]=N*B+O*C+P*D;g[W+112>>2]=0.0;g[W+116>>2]=E;g[W+120>>2]=F;g[W+124>>2]=G;g[W+128>>2]=0.0;g[W+196>>2]=Y;c[W+200>>2]=c[h+268>>2];if(f|0?(Vb[c[(c[f>>2]|0)+64>>2]&127](f,W,W+224|0,W+208|0),X=+g[W+200>>2],X<+g[h+268>>2]):0){g[h+268>>2]=X;Y=X;l=W;return +Y}Y=1.0;l=W;return +Y}function je(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0,X=0.0,Y=0.0;W=l;l=l+240|0;f=(a[b+76>>0]|0)!=0;h=f?e:d;f=f?d:e;S=+g[h+116>>2]-+g[h+52>>2];T=+g[h+120>>2]-+g[h+56>>2];U=+g[h+124>>2]-+g[h+60>>2];V=+g[h+276>>2];if(S*S+T*T+U*U>2];I=+g[f+20>>2];J=+g[f+36>>2];K=+g[f+8>>2];L=+g[f+24>>2];M=+g[f+40>>2];N=+g[f+12>>2];O=+g[f+28>>2];P=+g[f+44>>2];j=-+g[f+52>>2];k=-+g[f+56>>2];m=-+g[f+60>>2];Q=+g[h+4>>2];R=+g[h+20>>2];S=+g[h+36>>2];T=+g[h+8>>2];U=+g[h+24>>2];V=+g[h+40>>2];p=+g[h+12>>2];q=+g[h+28>>2];r=+g[h+44>>2];w=+g[h+52>>2];v=+g[h+56>>2];u=+g[h+60>>2];s=H*j+I*k+J*m+(H*w+I*v+J*u);t=K*j+L*k+M*m+(K*w+L*v+M*u);u=N*j+O*k+P*m+(N*w+O*v+P*u);v=+g[h+68>>2];w=+g[h+84>>2];x=+g[h+100>>2];y=+g[h+72>>2];z=+g[h+88>>2];A=+g[h+104>>2];B=+g[h+76>>2];C=+g[h+92>>2];D=+g[h+108>>2];n=+g[h+116>>2];o=+g[h+120>>2];G=+g[h+124>>2];E=H*j+I*k+J*m+(H*n+I*o+J*G);F=K*j+L*k+M*m+(K*n+L*o+M*G);G=N*j+O*k+P*m+(N*n+O*o+P*G);f=c[f+192>>2]|0;if(((c[f+4>>2]|0)+-21|0)>>>0>=9){X=1.0;l=W;return +X}g[W+224>>2]=s;g[W+224+4>>2]=t;g[W+224+8>>2]=u;g[W+224+12>>2]=0.0;if(E>2]=E;i=E}else i=s;if(F>2]=F;j=F}else j=t;if(G>2]=G;k=G}else k=u;g[W+208>>2]=s;g[W+208+4>>2]=t;g[W+208+8>>2]=u;g[W+208+12>>2]=0.0;if(s>2]=E;m=E}else m=s;if(t>2]=F;n=F}else n=t;if(u>2]=G;o=G}else o=u;Y=+g[h+272>>2];g[W+224>>2]=i-Y;g[W+224+4>>2]=j-Y;g[W+224+8>>2]=k-Y;g[W+208>>2]=Y+m;g[W+208+4>>2]=Y+n;g[W+208+8>>2]=Y+o;c[W>>2]=5848;g[W+4>>2]=H*Q+I*R+J*S;g[W+8>>2]=H*T+I*U+J*V;g[W+12>>2]=H*p+I*q+J*r;g[W+16>>2]=0.0;g[W+20>>2]=K*Q+L*R+M*S;g[W+24>>2]=K*T+L*U+M*V;g[W+28>>2]=K*p+L*q+M*r;g[W+32>>2]=0.0;g[W+36>>2]=N*Q+O*R+P*S;g[W+40>>2]=N*T+O*U+P*V;g[W+44>>2]=N*p+O*q+P*r;g[W+48>>2]=0.0;g[W+52>>2]=s;g[W+56>>2]=t;g[W+60>>2]=u;g[W+64>>2]=0.0;g[W+68>>2]=H*v+I*w+J*x;g[W+72>>2]=H*y+I*z+J*A;g[W+76>>2]=H*B+I*C+J*D;g[W+80>>2]=0.0;g[W+84>>2]=K*v+L*w+M*x;g[W+88>>2]=K*y+L*z+M*A;g[W+92>>2]=K*B+L*C+M*D;g[W+96>>2]=0.0;g[W+100>>2]=N*v+O*w+P*x;g[W+104>>2]=N*y+O*z+P*A;g[W+108>>2]=N*B+O*C+P*D;g[W+112>>2]=0.0;g[W+116>>2]=E;g[W+120>>2]=F;g[W+124>>2]=G;g[W+128>>2]=0.0;g[W+196>>2]=Y;c[W+200>>2]=c[h+268>>2];if(f|0?(Vb[c[(c[f>>2]|0)+64>>2]&127](f,W,W+224|0,W+208|0),X=+g[W+200>>2],X<+g[h+268>>2]):0){g[h+268>>2]=X;Y=X;l=W;return +Y}Y=1.0;l=W;return +Y}function ke(d,e,f,h){d=d|0;e=e|0;f=f|0;h=h|0;var i=0,k=0,l=0,m=0.0,n=0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0;p=+g[e>>2];i=(g[j>>2]=p,c[j>>2]|0);u=p<999999984306749440.0?i:1566444395;m=+g[e+4>>2];l=(g[j>>2]=m,c[j>>2]|0);v=m<999999984306749440.0?l:1566444395;y=+g[e+8>>2];o=(g[j>>2]=y,c[j>>2]|0);w=y<999999984306749440.0?o:1566444395;i=p>-999999984306749440.0?i:-581039253;l=m>-999999984306749440.0?l:-581039253;o=y>-999999984306749440.0?o:-581039253;y=+g[e+16>>2];t=y<(c[j>>2]=u,+g[j>>2]);k=(g[j>>2]=y,c[j>>2]|0);u=t?k:u;m=+g[e+20>>2];t=m<(c[j>>2]=v,+g[j>>2]);n=(g[j>>2]=m,c[j>>2]|0);v=t?n:v;p=+g[e+24>>2];t=p<(c[j>>2]=w,+g[j>>2]);q=(g[j>>2]=p,c[j>>2]|0);w=t?q:w;k=(c[j>>2]=i,+g[j>>2])>2]=l,+g[j>>2])>2]=o,+g[j>>2])>2];q=y<(c[j>>2]=u,+g[j>>2]);r=(g[j>>2]=y,c[j>>2]|0);m=+g[e+36>>2];s=m<(c[j>>2]=v,+g[j>>2]);t=(g[j>>2]=m,c[j>>2]|0);p=+g[e+40>>2];l=p<(c[j>>2]=w,+g[j>>2]);n=(g[j>>2]=p,c[j>>2]|0);k=(c[j>>2]=k,+g[j>>2])>2]=i,+g[j>>2])>2]=o,+g[j>>2])>2]=k,+g[j>>2]);H=(c[j>>2]=q?r:u,+g[j>>2]);C=(c[j>>2]=i,+g[j>>2]);D=(c[j>>2]=s?t:v,+g[j>>2]);m=(c[j>>2]=o,+g[j>>2]);z=(c[j>>2]=l?n:w,+g[j>>2]);o=c[d+8>>2]|0;F=+g[o+4>>2];B=+g[o+8>>2];p=+g[o+12>>2];E=+g[o+36>>2];A=+g[o+40>>2];y=+g[o+44>>2];o=~~(((G-H<2.0000000949949026e-03?H+-1.0000000474974513e-03:H)-F)*E)&65535&-2;q=~~(((C-D<2.0000000949949026e-03?D+-1.0000000474974513e-03:D)-B)*A)&65535&-2;r=~~(((m-z<2.0000000949949026e-03?z+-1.0000000474974513e-03:z)-p)*y)&65535&-2;s=~~(((G-H<2.0000000949949026e-03?G+1.0000000474974513e-03:G)-F)*E+1.0)&65535|1;t=~~(((C-D<2.0000000949949026e-03?C+1.0000000474974513e-03:C)-B)*A+1.0)&65535|1;e=~~(((m-z<2.0000000949949026e-03?m+1.0000000474974513e-03:m)-p)*y+1.0)&65535|1;n=c[d+4>>2]|0;i=c[n+4>>2]|0;if((i|0)==(c[n+8>>2]|0)?(x=i|0?i<<1:1,(i|0)<(x|0)):0){if(!x)l=0;else{c[6995]=(c[6995]|0)+1;i=sc((x<<4|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}l=i;i=c[n+4>>2]|0}if((i|0)>0){k=0;do{d=l+(k<<4)|0;w=(c[n+12>>2]|0)+(k<<4)|0;c[d>>2]=c[w>>2];c[d+4>>2]=c[w+4>>2];c[d+8>>2]=c[w+8>>2];c[d+12>>2]=c[w+12>>2];k=k+1|0}while((k|0)!=(i|0))}i=c[n+12>>2]|0;if(i|0){if(a[n+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[n+12>>2]=0}a[n+16>>0]=1;c[n+12>>2]=l;c[n+8>>2]=x;i=c[n+4>>2]|0}x=c[n+12>>2]|0;b[x+(i<<4)>>1]=o;b[x+(i<<4)+2>>1]=q;b[x+(i<<4)+4>>1]=r;b[x+(i<<4)+6>>1]=s;b[x+(i<<4)+8>>1]=t;b[x+(i<<4)+10>>1]=e;c[x+(i<<4)+12>>2]=f<<21|h;c[n+4>>2]=(c[n+4>>2]|0)+1;return}function le(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+336|0;h=c[d+36>>2]|0;c[n+272+4>>2]=35;c[n+272+8>>2]=0;c[n+272+12>>2]=-1;c[n+272+16>>2]=1065353216;c[n+272+20>>2]=1065353216;c[n+272+24>>2]=1065353216;g[n+272+28>>2]=0.0;c[n+272>>2]=3644;c[n+272+56>>2]=h;g[n+272+48>>2]=0.0;k=c[b+28>>2]|0;d=c[k+4>>2]|0;if(c[(c[k+8>>2]|0)+204>>2]&3|0?a[h+376>>0]|0:0){l=n;return}if((a[22384]|0)==0?Uz(22384)|0:0){if((a[22392]|0)==0?Uz(22392)|0:0){c[5698]=1065353216;c[5699]=0;c[5700]=0;c[5701]=0;c[5702]=0;c[5703]=1065353216;c[5704]=0;c[5705]=0;c[5706]=0;c[5707]=0;c[5708]=1065353216;g[5709]=0.0}c[5682]=c[5698];c[5683]=c[5699];c[5684]=c[5700];c[5685]=c[5701];c[5686]=c[5702];c[5687]=c[5703];c[5688]=c[5704];c[5689]=c[5705];c[5690]=c[5706];c[5691]=c[5707];c[5692]=c[5708];c[5693]=c[5709];c[5694]=0;c[5695]=0;c[5696]=0;c[5697]=0}e=c[(c[b+28>>2]|0)+12>>2]|0;c[n>>2]=1065353216;c[n+4>>2]=0;c[n+8>>2]=0;g[n+12>>2]=0.0;if(!(!(Gd(n+272|0,22728,d,e,n,n+216|0)|0)?!(Hc(n+272|0,22728,d,e,n,n+216|0,0)|0):0))i=12;if((i|0)==12?(c[n+4>>2]=0,c[n+4+4>>2]=0,c[n+4+8>>2]=0,c[n+4+12>>2]=0,c[n+4+16>>2]=0,c[n+4+20>>2]=0,a[n+152>>0]=0,c[n>>2]=3432,k=c[(c[b+28>>2]|0)+8>>2]|0,zd(b,n+216|0,h,0,0,0,(c[k+252>>2]&2|0)==0?0:k,k,n)|0):0){c[6995]=(c[6995]|0)+1;d=sc(235)|0;if(!d)k=0;else{c[(d+4+15&-16)+-4>>2]=d;k=d+4+15&-16}e=k+4|0;d=k+152|0;Yk(e|0,0,212)|0;c[k>>2]=3432;h=n+4|0;i=e+100|0;do{c[e>>2]=c[h>>2];e=e+4|0;h=h+4|0}while((e|0)<(i|0));e=k+104|0;c[e>>2]=c[n+104>>2];c[e+4>>2]=c[n+104+4>>2];c[e+8>>2]=c[n+104+8>>2];c[e+12>>2]=c[n+104+12>>2];e=k+120|0;c[e>>2]=c[n+120>>2];c[e+4>>2]=c[n+120+4>>2];c[e+8>>2]=c[n+120+8>>2];c[e+12>>2]=c[n+120+12>>2];e=k+136|0;c[e>>2]=c[n+136>>2];c[e+4>>2]=c[n+136+4>>2];c[e+8>>2]=c[n+136+8>>2];c[e+12>>2]=c[n+136+12>>2];a[d>>0]=a[n+152>>0]|0;e=k+156|0;h=n+156|0;i=e+60|0;do{c[e>>2]=c[h>>2];e=e+4|0;h=h+4|0}while((e|0)<(i|0));i=c[b+24>>2]|0;j=k;d=c[i+912>>2]|0;if((d|0)==(c[i+916>>2]|0)?(m=d|0?d<<1:1,(d|0)<(m|0)):0){if(!m)h=0;else{c[6995]=(c[6995]|0)+1;d=sc((m<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}h=d;d=c[i+912>>2]|0}if((d|0)>0){e=0;do{c[h+(e<<2)>>2]=c[(c[i+920>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(d|0))}e=c[i+920>>2]|0;if(e){if(a[i+924>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[i+912>>2]|0}c[i+920>>2]=0}a[i+924>>0]=1;c[i+920>>2]=h;c[i+916>>2]=m}c[(c[i+920>>2]|0)+(d<<2)>>2]=j;c[i+912>>2]=d+1;d=c[b+24>>2]|0;e=k+64|0;f=+g[e>>2];if(!(c[(c[(c[b+28>>2]|0)+8>>2]|0)+204>>2]&3)){g[e>>2]=f*+g[d+400>>2];d=d+412|0}else{g[e>>2]=f*+g[d+404>>2];d=d+416|0}b=k+68|0;g[b>>2]=+g[d>>2]*+g[b>>2]}l=n;return}function me(a,b,d){a=a|0;b=b|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;l=c[b>>2]|0;m=c[b+4>>2]|0;i=c[b+8>>2]|0;n=c[a+4>>2]|0;p=Lh(a,d,m,i)|0;c[p+12>>2]=c[b+12>>2];c[p+16>>2]=n+1;c[p+20>>2]=n+2;h=c[(c[a+12>>2]|0)+(c[b+12>>2]<<2)>>2]|0;e=c[h>>2]|0;f=c[h+4>>2]|0;do if(!((e|0)==(m|0)&(f|0)==(i|0))){if((e|0)==(i|0)?(f|0)==(m|0):0){e=h+12+8|0;break}g=c[h+8>>2]|0;if(!((f|0)==(m|0)&(g|0)==(i|0)))if(!((f|0)==(i|0)&(g|0)==(m|0)))if((g|0)!=(m|0)|(e|0)==(i|0)^1){if((g|0)==(i|0)?(e|0)==(m|0):0){e=h+12+4|0;break}e=9772}else{e=1;o=2}else e=h+12|0;else{e=0;o=2}}else{e=2;o=2}while(0);if((o|0)==2)e=h+12+(e<<2)|0;c[e>>2]=n;k=Lh(a,d,i,l)|0;c[k+12>>2]=c[b+12+4>>2];c[k+16>>2]=n+2;c[k+20>>2]=n;h=c[(c[a+12>>2]|0)+(c[b+12+4>>2]<<2)>>2]|0;e=c[h>>2]|0;f=c[h+4>>2]|0;do if(!((e|0)==(i|0)&(f|0)==(l|0))){if((e|0)==(l|0)?(f|0)==(i|0):0){e=h+12+8|0;break}g=c[h+8>>2]|0;if(!((f|0)==(i|0)&(g|0)==(l|0)))if(!((f|0)==(l|0)&(g|0)==(i|0)))if((g|0)!=(i|0)|(e|0)==(l|0)^1){if((g|0)==(l|0)?(e|0)==(i|0):0){e=h+12+4|0;break}e=9772}else{e=1;o=12}else e=h+12|0;else{e=0;o=12}}else{e=2;o=12}while(0);if((o|0)==12)e=h+12+(e<<2)|0;c[e>>2]=n+1;j=Lh(a,d,l,m)|0;c[j+12>>2]=c[b+12+8>>2];c[j+16>>2]=n;c[j+20>>2]=n+1;e=c[a+12>>2]|0;i=c[e+(c[b+12+8>>2]<<2)>>2]|0;f=c[i>>2]|0;g=c[i+4>>2]|0;do if(!((f|0)==(l|0)&(g|0)==(m|0))){if((f|0)==(m|0)?(g|0)==(l|0):0){f=i+12+8|0;break}h=c[i+8>>2]|0;if(!((g|0)==(l|0)&(h|0)==(m|0)))if(!((g|0)==(m|0)&(h|0)==(l|0)))if((h|0)!=(l|0)|(f|0)==(m|0)^1){if((h|0)==(m|0)?(f|0)==(l|0):0){f=i+12+4|0;break}f=9772}else{f=1;o=22}else f=i+12|0;else{f=0;o=22}}else{f=2;o=22}while(0);if((o|0)==22)f=i+12+(f<<2)|0;c[f>>2]=n+2;f=c[e+(c[p+12>>2]<<2)>>2]|0;if(!(((c[f>>2]|0)!=(d|0)?(c[f+4>>2]|0)!=(d|0):0)?(c[f+8>>2]|0)!=(d|0):0)){pe(e,p,f);c[(c[a+12>>2]|0)+(c[p+24>>2]<<2)>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0);c[(c[a+12>>2]|0)+(c[f+24>>2]<<2)>>2]=0;if(f|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}e=c[a+12>>2]|0}f=c[e+(c[k+12>>2]<<2)>>2]|0;if(!(((c[f>>2]|0)!=(d|0)?(c[f+4>>2]|0)!=(d|0):0)?(c[f+8>>2]|0)!=(d|0):0)){pe(e,k,f);c[(c[a+12>>2]|0)+(c[k+24>>2]<<2)>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);c[(c[a+12>>2]|0)+(c[f+24>>2]<<2)>>2]=0;if(f|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}e=c[a+12>>2]|0}f=c[e+(c[j+12>>2]<<2)>>2]|0;if(!(((c[f>>2]|0)!=(d|0)?(c[f+4>>2]|0)!=(d|0):0)?(c[f+8>>2]|0)!=(d|0):0)){pe(e,j,f);c[(c[a+12>>2]|0)+(c[j+24>>2]<<2)>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);c[(c[a+12>>2]|0)+(c[f+24>>2]<<2)>>2]=0;if(f|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}e=c[a+12>>2]|0}c[e+(c[b+24>>2]<<2)>>2]=0;if(!b)return;c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function ne(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if(!((d|0)!=0&(e|0)!=0))return;if((c[b+24>>2]|0)<128?(c[b+28>>2]|0)<128:0){c[6995]=(c[6995]|0)+1;h=sc(1043)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}i=c[b+24>>2]|0;if((i|0)>0){h=0;do{k=(c[b+32>>2]|0)+(h<<3)|0;l=c[k+4>>2]|0;m=j+(h<<3)|0;c[m>>2]=c[k>>2];c[m+4>>2]=l;h=h+1|0}while((h|0)!=(i|0))}h=c[b+32>>2]|0;if(h|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=j;c[b+28>>2]=128}c[b+24>>2]=128;h=c[b+32>>2]|0;c[h>>2]=d;c[h+4>>2]=e;h=1;i=124;do{m=h+-1|0;j=c[b+32>>2]|0;k=c[j+(m<<3)>>2]|0;l=c[j+(m<<3)+4>>2]|0;if((m|0)>(i|0)){e=c[b+24>>2]|0;if((e|0)<(e<<1|0)?(c[b+28>>2]|0)<(e<<1|0):0){if(e){c[6995]=(c[6995]|0)+1;i=sc((e<<4|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}d=c[b+24>>2]|0;if((d|0)>0){j=0;do{p=(c[b+32>>2]|0)+(j<<3)|0;o=c[p+4>>2]|0;n=i+(j<<3)|0;c[n>>2]=c[p>>2];c[n+4>>2]=o;j=j+1|0}while((j|0)!=(d|0))}}else i=0;j=c[b+32>>2]|0;if(j|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=i;c[b+28>>2]=e<<1;j=i}c[b+24>>2]=e<<1;i=(e<<1)+-4|0}do if((k|0)==(l|0))if(!(c[k+40>>2]|0))h=m;else{o=c[k+36>>2]|0;c[j+(m<<3)>>2]=o;c[j+(m<<3)+4>>2]=o;o=c[k+40>>2]|0;p=h+1|0;n=c[b+32>>2]|0;c[n+(h<<3)>>2]=o;c[n+(h<<3)+4>>2]=o;n=c[k+40>>2]|0;o=c[b+32>>2]|0;c[o+(p<<3)>>2]=c[k+36>>2];c[o+(p<<3)+4>>2]=n;h=h+2|0}else if(((((+g[k>>2]<=+g[l+16>>2]?+g[k+16>>2]>=+g[l>>2]:0)?+g[k+4>>2]<=+g[l+20>>2]:0)?+g[k+20>>2]>=+g[l+4>>2]:0)?+g[k+8>>2]<=+g[l+24>>2]:0)?+g[k+24>>2]>=+g[l+8>>2]:0){d=(c[l+40>>2]|0)!=0;if(!(c[k+40>>2]|0))if(d){o=c[l+36>>2]|0;c[j+(m<<3)>>2]=k;c[j+(m<<3)+4>>2]=o;o=c[l+40>>2]|0;p=c[b+32>>2]|0;c[p+(h<<3)>>2]=k;c[p+(h<<3)+4>>2]=o;h=h+1|0;break}else{Sb[c[(c[f>>2]|0)+8>>2]&127](f,k,l);h=m;break}else{e=c[k+36>>2]|0;if(d){p=c[l+36>>2]|0;c[j+(m<<3)>>2]=e;c[j+(m<<3)+4>>2]=p;p=c[l+36>>2]|0;n=h+1|0;m=c[b+32>>2]|0;c[m+(h<<3)>>2]=c[k+40>>2];c[m+(h<<3)+4>>2]=p;m=c[l+40>>2]|0;p=h+2|0;o=c[b+32>>2]|0;c[o+(n<<3)>>2]=c[k+36>>2];c[o+(n<<3)+4>>2]=m;n=c[l+40>>2]|0;o=c[b+32>>2]|0;c[o+(p<<3)>>2]=c[k+40>>2];c[o+(p<<3)+4>>2]=n;h=h+3|0;break}else{c[j+(m<<3)>>2]=e;c[j+(m<<3)+4>>2]=l;p=c[b+32>>2]|0;c[p+(h<<3)>>2]=c[k+40>>2];c[p+(h<<3)+4>>2]=l;h=h+1|0;break}}}else h=m;while(0)}while((h|0)!=0);return}function oe(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0;h=l;l=l+16|0;f=lt()|0;if((a[22480]|0)==0?Uz(22480)|0:0){c[h>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;ef(23152,0.0,0,0,h)}c[5839]=c[5839]|1;g[5889]=0.0;x=+g[5899]*0.0;D=+g[5900]*0.0;g[5894]=+g[5898]*0.0;g[5895]=x;g[5896]=D;g[5897]=0.0;c[5902]=0;c[5903]=0;c[5904]=0;c[5905]=0;D=+g[5891]*0.0;x=+g[5892]*0.0;g[5943]=+g[5890]*0.0;g[5944]=D;g[5945]=x;g[5946]=0.0;c[f+4>>2]=7;c[f+8>>2]=-1;c[f+12>>2]=-1;g[f+16>>2]=3402823466385288598117041.0e14;a[f+20>>0]=1;a[f+21>>0]=0;c[f+24>>2]=-1;c[f+28>>2]=23152;c[f+32>>2]=b;g[f+36>>2]=0.0;g[f+40>>2]=.05000000074505806;c[f+44>>2]=0;c[f>>2]=4884;a[f+48>>0]=0;c[f+116>>2]=c[d>>2];c[f+116+4>>2]=c[d+4>>2];c[f+116+8>>2]=c[d+8>>2];c[f+116+12>>2]=c[d+12>>2];c[f+132>>2]=c[d+16>>2];c[f+132+4>>2]=c[d+16+4>>2];c[f+132+8>>2]=c[d+16+8>>2];c[f+132+12>>2]=c[d+16+12>>2];c[f+148>>2]=c[d+32>>2];c[f+148+4>>2]=c[d+32+4>>2];c[f+148+8>>2]=c[d+32+8>>2];c[f+148+12>>2]=c[d+32+12>>2];c[f+164>>2]=c[d+48>>2];c[f+164+4>>2]=c[d+48+4>>2];c[f+164+8>>2]=c[d+48+8>>2];c[f+164+12>>2]=c[d+48+12>>2];a[f+180>>0]=e&1;x=+g[f+116>>2];D=+g[b+4>>2];w=+g[f+132>>2];C=+g[b+8>>2];v=+g[f+148>>2];B=+g[b+12>>2];u=+g[f+120>>2];t=+g[f+136>>2];s=+g[f+152>>2];r=+g[f+124>>2];p=+g[f+140>>2];n=+g[f+156>>2];A=+g[b+20>>2];z=+g[b+24>>2];y=+g[b+28>>2];q=+g[b+36>>2];o=+g[b+40>>2];m=+g[b+44>>2];F=+g[f+164>>2];E=+g[f+168>>2];i=+g[f+172>>2];k=+g[b+52>>2]+(D*F+C*E+B*i);j=A*F+z*E+y*i+ +g[b+56>>2];i=q*F+o*E+m*i+ +g[b+60>>2];g[f+52>>2]=x*D+w*C+v*B;g[f+56>>2]=D*u+C*t+B*s;g[f+60>>2]=D*r+C*p+B*n;g[f+64>>2]=0.0;g[f+68>>2]=x*A+w*z+v*y;g[f+72>>2]=u*A+t*z+s*y;g[f+76>>2]=r*A+p*z+n*y;g[f+80>>2]=0.0;g[f+84>>2]=x*q+w*o+v*m;g[f+88>>2]=u*q+t*o+s*m;g[f+92>>2]=r*q+p*o+n*m;g[f+96>>2]=0.0;g[f+100>>2]=k;g[f+104>>2]=j;g[f+108>>2]=i;g[f+112>>2]=0.0;g[f+184>>2]=1.0;g[f+188>>2]=-1.0;g[f+192>>2]=0.0;g[f+196>>2]=0.0;g[f+200>>2]=1.0;g[f+204>>2]=.699999988079071;g[f+208>>2]=0.0;g[f+212>>2]=0.0;g[f+216>>2]=1.0;g[f+220>>2]=.699999988079071;g[f+224>>2]=0.0;g[f+228>>2]=0.0;g[f+264>>2]=1.0;g[f+268>>2]=.699999988079071;g[f+272>>2]=1.0;g[f+276>>2]=0.0;g[f+280>>2]=1.0;g[f+284>>2]=.699999988079071;g[f+288>>2]=1.0;g[f+292>>2]=0.0;g[f+232>>2]=1.0;g[f+236>>2]=.699999988079071;g[f+240>>2]=1.0;g[f+244>>2]=0.0;g[f+248>>2]=1.0;g[f+252>>2]=.699999988079071;g[f+256>>2]=1.0;g[f+260>>2]=0.0;a[f+1096>>0]=0;g[f+1116>>2]=0.0;g[f+1120>>2]=0.0;g[f+1124>>2]=0.0;c[f+300>>2]=0;c[f+1100>>2]=0;c[f+1100+4>>2]=0;c[f+1100+8>>2]=0;a[f+1100+12>>0]=0;a[f+49>>0]=1;Zc(f,(c[f+28>>2]|0)+4|0,(c[f+32>>2]|0)+4|0);l=h;return f|0}function pe(a,b,d){a=a|0;b=b|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;l=0;do{k=l;l=l+1|0;m=(l|0)==3;j=c[b+((m?0:l)<<2)>>2]|0;k=c[b+(((k+2|0)%3|0)<<2)>>2]|0;e=c[d>>2]|0;f=c[d+4>>2]|0;if(!((e|0)==(k|0)&(f|0)==(j|0)))if(!((e|0)==(j|0)&(f|0)==(k|0))){g=c[d+8>>2]|0;if(!((f|0)==(k|0)&(g|0)==(j|0)))if(!((f|0)==(j|0)&(g|0)==(k|0)))if((g|0)!=(k|0)|(e|0)==(j|0)^1)e=(g|0)!=(j|0)|(e|0)==(k|0)^1?9772:d+12+4|0;else{e=1;n=3}else e=d+12|0;else{e=0;n=3}}else e=d+12+8|0;else{e=2;n=3}if((n|0)==3){n=0;e=d+12+(e<<2)|0}i=c[e>>2]|0;e=c[b>>2]|0;f=c[b+4>>2]|0;if(!((e|0)==(j|0)&(f|0)==(k|0)))if(!((e|0)==(k|0)&(f|0)==(j|0))){g=c[b+8>>2]|0;if(!((f|0)==(j|0)&(g|0)==(k|0)))if(!((f|0)==(k|0)&(g|0)==(j|0)))if((g|0)!=(j|0)|(e|0)==(k|0)^1)e=(g|0)!=(k|0)|(e|0)==(j|0)^1?9772:b+12+4|0;else{e=1;n=10}else e=b+12|0;else{e=0;n=10}}else e=b+12+8|0;else{e=2;n=10}if((n|0)==10){n=0;e=b+12+(e<<2)|0}h=c[a+(c[e>>2]<<2)>>2]|0;e=c[h>>2]|0;f=c[h+4>>2]|0;do if(!((e|0)==(k|0)&(f|0)==(j|0))){if((e|0)==(j|0)?(f|0)==(k|0):0){e=h+12+8|0;break}g=c[h+8>>2]|0;if(!((f|0)==(k|0)&(g|0)==(j|0)))if(!((f|0)==(j|0)&(g|0)==(k|0)))if((g|0)!=(k|0)|(e|0)==(j|0)^1){if((g|0)==(j|0)?(e|0)==(k|0):0){e=h+12+4|0;break}e=9772}else{e=1;n=17}else e=h+12|0;else{e=0;n=17}}else{e=2;n=17}while(0);if((n|0)==17){n=0;e=h+12+(e<<2)|0}c[e>>2]=i;e=c[b>>2]|0;f=c[b+4>>2]|0;if(!((e|0)==(j|0)&(f|0)==(k|0)))if(!((e|0)==(k|0)&(f|0)==(j|0))){g=c[b+8>>2]|0;if(!((f|0)==(j|0)&(g|0)==(k|0)))if(!((f|0)==(k|0)&(g|0)==(j|0)))if((g|0)!=(j|0)|(e|0)==(k|0)^1)e=(g|0)!=(k|0)|(e|0)==(j|0)^1?9772:b+12+4|0;else{e=1;n=27}else e=b+12|0;else{e=0;n=27}}else e=b+12+8|0;else{e=2;n=27}if((n|0)==27){n=0;e=b+12+(e<<2)|0}i=c[e>>2]|0;e=c[d>>2]|0;f=c[d+4>>2]|0;if(!((e|0)==(k|0)&(f|0)==(j|0)))if(!((e|0)==(j|0)&(f|0)==(k|0))){g=c[d+8>>2]|0;if(!((f|0)==(k|0)&(g|0)==(j|0)))if(!((f|0)==(j|0)&(g|0)==(k|0)))if((g|0)!=(k|0)|(e|0)==(j|0)^1)e=(g|0)!=(j|0)|(e|0)==(k|0)^1?9772:d+12+4|0;else{e=1;n=34}else e=d+12|0;else{e=0;n=34}}else e=d+12+8|0;else{e=2;n=34}if((n|0)==34){n=0;e=d+12+(e<<2)|0}h=c[a+(c[e>>2]<<2)>>2]|0;e=c[h>>2]|0;f=c[h+4>>2]|0;do if(!((e|0)==(j|0)&(f|0)==(k|0))){if((e|0)==(k|0)?(f|0)==(j|0):0){e=h+12+8|0;break}g=c[h+8>>2]|0;if(!((f|0)==(j|0)&(g|0)==(k|0)))if(!((f|0)==(k|0)&(g|0)==(j|0)))if((g|0)!=(j|0)|(e|0)==(k|0)^1){if((g|0)==(k|0)?(e|0)==(j|0):0){e=h+12+4|0;break}e=9772}else{e=1;n=41}else e=h+12|0;else{e=0;n=41}}else{e=2;n=41}while(0);if((n|0)==41){n=0;e=h+12+(e<<2)|0}c[e>>2]=i}while(!m);return}function qe(b){b=b|0;var d=0,e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0.0,w=0.0,x=0;u=l;l=l+176|0;if(!(a[b+527>>0]|0)){l=u;return}g[b+36>>2]=0.0;g[b+520>>2]=0.0;g[b+516>>2]=0.0;c[b+576>>2]=0;c[b+576+4>>2]=0;c[b+576+8>>2]=0;c[b+576+12>>2]=0;if(!(a[b+524>>0]|0)){d=c[b+28>>2]|0;j=+g[b+348>>2];k=+g[b+352>>2];q=+g[b+356>>2];s=j*+g[d+20>>2]+k*+g[d+24>>2]+q*+g[d+28>>2]+ +g[d+56>>2];e=c[b+32>>2]|0;m=+g[b+412>>2];n=+g[b+416>>2];r=+g[b+420>>2];t=m*+g[e+20>>2]+n*+g[e+24>>2]+r*+g[e+28>>2]+ +g[e+56>>2];o=m*+g[e+36>>2]+n*+g[e+40>>2]+r*+g[e+44>>2]+ +g[e+60>>2];p=j*+g[d+4>>2]+k*+g[d+8>>2]+q*+g[d+12>>2]+ +g[d+52>>2];q=j*+g[d+36>>2]+k*+g[d+40>>2]+q*+g[d+44>>2]+ +g[d+60>>2];r=m*+g[e+4>>2]+n*+g[e+8>>2]+r*+g[e+12>>2]+ +g[e+52>>2];if((r-p)*(r-p)+(t-s)*(t-s)+(o-q)*(o-q)>1.1920928955078125e-07){h=1.0/+D(+((r-p)*(r-p)+(t-s)*(t-s)+(o-q)*(o-q)));g[u+128>>2]=(r-p)*h;g[u+128+4>>2]=(t-s)*h;g[u+128+8>>2]=(o-q)*h;c[u+128+12>>2]=0;m=(o-q)*h;f=(t-s)*h;h=(r-p)*h}else{c[u+128>>2]=1065353216;c[u+128+4>>2]=0;c[u+128+8>>2]=0;g[u+128+12>>2]=0.0;m=0.0;f=0.0;h=1.0}if(+C(+m)>.7071067690849304){w=m*m+f*f;v=1.0/+D(+w);j=-(v*m);m=v*f;n=-(m*h);i=h*j;k=0.0;f=w*v;h=m}else{j=h*h+f*f;i=1.0/+D(+j);k=-(f*i);f=i*h;n=m*k;i=j*i;j=f;f=-(f*m);h=0.0}g[u+128+16>>2]=k;g[u+128+20>>2]=j;g[u+128+24>>2]=h;g[u+128+32>>2]=f;g[u+128+36>>2]=n;g[u+128+40>>2]=i;d=0;while(1){x=c[b+28>>2]|0;c[u+80>>2]=c[x+4>>2];c[u+80+4>>2]=c[x+20>>2];c[u+80+8>>2]=c[x+36>>2];g[u+80+12>>2]=0.0;c[u+80+16>>2]=c[x+8>>2];c[u+80+20>>2]=c[x+24>>2];c[u+80+24>>2]=c[x+40>>2];g[u+80+28>>2]=0.0;c[u+80+32>>2]=c[x+12>>2];c[u+80+36>>2]=c[x+28>>2];c[u+80+40>>2]=c[x+44>>2];g[u+80+44>>2]=0.0;c[u+32>>2]=c[e+4>>2];c[u+32+4>>2]=c[e+20>>2];c[u+32+8>>2]=c[e+36>>2];g[u+32+12>>2]=0.0;c[u+32+16>>2]=c[e+8>>2];c[u+32+20>>2]=c[e+24>>2];c[u+32+24>>2]=c[e+40>>2];g[u+32+28>>2]=0.0;c[u+32+32>>2]=c[e+12>>2];c[u+32+36>>2]=c[e+28>>2];c[u+32+40>>2]=c[e+44>>2];g[u+32+44>>2]=0.0;w=s-+g[x+56>>2];v=q-+g[x+60>>2];g[u+16>>2]=p-+g[x+52>>2];g[u+16+4>>2]=w;g[u+16+8>>2]=v;g[u+16+12>>2]=0.0;v=t-+g[e+56>>2];w=o-+g[e+60>>2];g[u>>2]=r-+g[e+52>>2];g[u+4>>2]=v;g[u+8>>2]=w;g[u+12>>2]=0.0;x=c[b+28>>2]|0;e=c[b+32>>2]|0;Rg(b+48+(d*84|0)|0,u+80|0,u+32|0,u+16|0,u,u+128+(d<<4)|0,x+456|0,+g[x+404>>2],e+456|0,+g[e+404>>2]);d=d+1|0;if((d|0)==3)break;e=c[b+32>>2]|0}d=b+32|0}else d=b+32|0;e=c[b+28>>2]|0;x=c[d>>2]|0;xc(b,e+4|0,x+4|0,e+324|0,x+324|0);l=u;return}function re(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=l;l=l+80|0;c[a+72>>2]=(c[a+72>>2]|0)+1;f=c[a+68>>2]|0;if(f|0){d=c[(c[a+28>>2]|0)+(b*80|0)+76>>2]|0;Ag(f,d)|0;e=c[f+4>>2]|0;if(e|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[f+4>>2]=d;c[f+12>>2]=(c[f+12>>2]|0)+-1}f=(c[a+20>>2]|0)+-1|0;e=c[a+28>>2]|0;c[g>>2]=c[e+(b*80|0)>>2];c[g+4>>2]=c[e+(b*80|0)+4>>2];c[g+8>>2]=c[e+(b*80|0)+8>>2];c[g+12>>2]=c[e+(b*80|0)+12>>2];c[g+16>>2]=c[e+(b*80|0)+16>>2];c[g+16+4>>2]=c[e+(b*80|0)+16+4>>2];c[g+16+8>>2]=c[e+(b*80|0)+16+8>>2];c[g+16+12>>2]=c[e+(b*80|0)+16+12>>2];c[g+32>>2]=c[e+(b*80|0)+32>>2];c[g+32+4>>2]=c[e+(b*80|0)+32+4>>2];c[g+32+8>>2]=c[e+(b*80|0)+32+8>>2];c[g+32+12>>2]=c[e+(b*80|0)+32+12>>2];c[g+48>>2]=c[e+(b*80|0)+48>>2];c[g+48+4>>2]=c[e+(b*80|0)+48+4>>2];c[g+48+8>>2]=c[e+(b*80|0)+48+8>>2];c[g+48+12>>2]=c[e+(b*80|0)+48+12>>2];c[g+64>>2]=c[e+(b*80|0)+64>>2];c[g+64+4>>2]=c[e+(b*80|0)+64+4>>2];c[g+64+8>>2]=c[e+(b*80|0)+64+8>>2];c[g+64+12>>2]=c[e+(b*80|0)+64+12>>2];c[e+(b*80|0)>>2]=c[e+(f*80|0)>>2];c[e+(b*80|0)+4>>2]=c[e+(f*80|0)+4>>2];c[e+(b*80|0)+8>>2]=c[e+(f*80|0)+8>>2];c[e+(b*80|0)+12>>2]=c[e+(f*80|0)+12>>2];c[e+(b*80|0)+16>>2]=c[e+(f*80|0)+16>>2];c[e+(b*80|0)+16+4>>2]=c[e+(f*80|0)+16+4>>2];c[e+(b*80|0)+16+8>>2]=c[e+(f*80|0)+16+8>>2];c[e+(b*80|0)+16+12>>2]=c[e+(f*80|0)+16+12>>2];c[e+(b*80|0)+32>>2]=c[e+(f*80|0)+32>>2];c[e+(b*80|0)+32+4>>2]=c[e+(f*80|0)+32+4>>2];c[e+(b*80|0)+32+8>>2]=c[e+(f*80|0)+32+8>>2];c[e+(b*80|0)+32+12>>2]=c[e+(f*80|0)+32+12>>2];c[e+(b*80|0)+48>>2]=c[e+(f*80|0)+48>>2];c[e+(b*80|0)+48+4>>2]=c[e+(f*80|0)+48+4>>2];c[e+(b*80|0)+48+8>>2]=c[e+(f*80|0)+48+8>>2];c[e+(b*80|0)+48+12>>2]=c[e+(f*80|0)+48+12>>2];c[e+(b*80|0)+64>>2]=c[e+(f*80|0)+64>>2];c[e+(b*80|0)+64+4>>2]=c[e+(f*80|0)+64+4>>2];c[e+(b*80|0)+64+8>>2]=c[e+(f*80|0)+64+8>>2];c[e+(b*80|0)+64+12>>2]=c[e+(f*80|0)+64+12>>2];e=c[a+28>>2]|0;c[e+(f*80|0)>>2]=c[g>>2];c[e+(f*80|0)+4>>2]=c[g+4>>2];c[e+(f*80|0)+8>>2]=c[g+8>>2];c[e+(f*80|0)+12>>2]=c[g+12>>2];c[e+(f*80|0)+16>>2]=c[g+16>>2];c[e+(f*80|0)+16+4>>2]=c[g+16+4>>2];c[e+(f*80|0)+16+8>>2]=c[g+16+8>>2];c[e+(f*80|0)+16+12>>2]=c[g+16+12>>2];c[e+(f*80|0)+32>>2]=c[g+32>>2];c[e+(f*80|0)+32+4>>2]=c[g+32+4>>2];c[e+(f*80|0)+32+8>>2]=c[g+32+8>>2];c[e+(f*80|0)+32+12>>2]=c[g+32+12>>2];c[e+(f*80|0)+48>>2]=c[g+48>>2];c[e+(f*80|0)+48+4>>2]=c[g+48+4>>2];c[e+(f*80|0)+48+8>>2]=c[g+48+8>>2];c[e+(f*80|0)+48+12>>2]=c[g+48+12>>2];c[e+(f*80|0)+64>>2]=c[g+64>>2];c[e+(f*80|0)+64+4>>2]=c[g+64+4>>2];c[e+(f*80|0)+64+8>>2]=c[g+64+8>>2];c[e+(f*80|0)+64+12>>2]=c[g+64+12>>2];if(!(c[a+68>>2]|0)){f=c[a+20>>2]|0;f=f+-1|0;c[a+20>>2]=f;l=g;return}c[(c[(c[a+28>>2]|0)+(b*80|0)+76>>2]|0)+36>>2]=b;f=c[a+20>>2]|0;f=f+-1|0;c[a+20>>2]=f;l=g;return}function se(b,d){b=b|0;d=d|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;o=c[b+92>>2]|0;if(!(xb[c[(c[o>>2]|0)+56>>2]&127](o)|0))return;o=c[b+92>>2]|0;o=xb[c[(c[o>>2]|0)+28>>2]&127](o)|0;f=c[o+4>>2]|0;if((f|0)>1){te(o,0,f+-1|0);j=c[o+4>>2]|0}else j=f;m=c[b+104>>2]|0;f=j-m|0;if((m|0)<0){if((c[o+8>>2]|0)<(f|0)){if(!f){g=0;i=j}else{c[6995]=(c[6995]|0)+1;g=sc((f<<4|3)+16|0)|0;if(!g)g=0;else{c[(g+4+15&-16)+-4>>2]=g;g=g+4+15&-16}i=c[o+4>>2]|0}if((i|0)>0){h=0;do{m=c[o+12>>2]|0;c[g+(h<<4)>>2]=c[m+(h<<4)>>2];c[g+(h<<4)+4>>2]=c[m+(h<<4)+4>>2];c[g+(h<<4)+8>>2]=c[m+(h<<4)+8>>2];c[g+(h<<4)+12>>2]=c[m+(h<<4)+12>>2];h=h+1|0}while((h|0)!=(i|0))}h=c[o+12>>2]|0;if(h|0){if(a[o+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[o+12>>2]=0}a[o+16>>0]=1;c[o+12>>2]=g;c[o+8>>2]=f;h=o+12|0}else h=o+12|0;g=j;do{m=(c[h>>2]|0)+(g<<4)|0;g=g+1|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0}while((g|0)!=(f|0))}c[o+4>>2]=f;c[b+104>>2]=0;if((f|0)>0){l=0;m=0;g=0;h=0;do{k=c[o+12>>2]|0;j=k+(l<<4)|0;p=m;m=c[j>>2]|0;k=k+(l<<4)+4|0;i=c[k>>2]|0;if(!((m|0)==(p|0)&(i|0)==(g|0))){p=m+48|0;if((((((e[m+54>>1]|0)>=(e[i+48>>1]|0)?(e[i+54>>1]|0)>=(e[p>>1]|0):0)?(e[m+56>>1]|0)>=(e[i+48+2>>1]|0):0)?(e[i+56>>1]|0)>=(e[p+2>>1]|0):0)?(e[m+58>>1]|0)>=(e[i+52>>1]|0):0)?(e[i+58>>1]|0)>=(e[m+52>>1]|0):0)g=i;else{f=i;n=29}}else{f=g;n=29}if((n|0)==29){n=0;h=c[b+92>>2]|0;Sb[c[(c[h>>2]|0)+32>>2]&127](h,j,d);c[j>>2]=0;c[k>>2]=0;h=(c[b+104>>2]|0)+1|0;c[b+104>>2]=h;c[6156]=(c[6156]|0)+-1;g=f;f=c[o+4>>2]|0}l=l+1|0}while((l|0)<(f|0));if((f|0)>1){te(o,0,f+-1|0);g=c[o+4>>2]|0;h=c[b+104>>2]|0}else g=f;f=g-h|0;if((h|0)<0){if((c[o+8>>2]|0)<(f|0)){if(!f){h=0;j=g}else{c[6995]=(c[6995]|0)+1;h=sc((f<<4|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}j=c[o+4>>2]|0}if((j|0)>0){i=0;do{p=c[o+12>>2]|0;c[h+(i<<4)>>2]=c[p+(i<<4)>>2];c[h+(i<<4)+4>>2]=c[p+(i<<4)+4>>2];c[h+(i<<4)+8>>2]=c[p+(i<<4)+8>>2];c[h+(i<<4)+12>>2]=c[p+(i<<4)+12>>2];i=i+1|0}while((i|0)!=(j|0))}i=c[o+12>>2]|0;if(i|0){if(a[o+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[o+12>>2]=0}a[o+16>>0]=1;c[o+12>>2]=h;c[o+8>>2]=f}do{p=(c[o+12>>2]|0)+(g<<4)|0;g=g+1|0;c[p>>2]=0;c[p+4>>2]=0;c[p+8>>2]=0;c[p+12>>2]=0}while((g|0)!=(f|0))}}c[o+4>>2]=f;c[b+104>>2]=0;return}function te(a,b,d){a=a|0;b=b|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;while(1){m=c[a+12>>2]|0;o=(b+d|0)/2|0;p=c[m+(o<<4)>>2]|0;n=c[m+(o<<4)+4>>2]|0;o=c[m+(o<<4)+8>>2]|0;e=d;f=b;while(1){a:do if(!p)while(1){j=c[m+(f<<4)>>2]|0;if(!j)g=-1;else g=c[j+12>>2]|0;k=c[m+(f<<4)+4>>2]|0;if(!k)h=-1;else h=c[k+12>>2]|0;if(!n)i=-1;else i=c[n+12>>2]|0;do if((g|0)<=-1){g=(h|0)>(i|0);if(g|(j|0)==0^1)if((j|0)==0&g)break;else break a;if((k|0)!=(n|0))break a;if((c[m+(f<<4)+8>>2]|0)>>>0<=o>>>0)break a}while(0);f=f+1|0}else{l=c[p+12>>2]|0;while(1){j=c[m+(f<<4)>>2]|0;if(!j)g=-1;else g=c[j+12>>2]|0;k=c[m+(f<<4)+4>>2]|0;if(!k)h=-1;else h=c[k+12>>2]|0;if(!n)i=-1;else i=c[n+12>>2]|0;do if((g|0)<=(l|0)){g=(h|0)>(i|0);if(g|(j|0)==(p|0)^1)if((j|0)==(p|0)&g)break;else break a;if((k|0)!=(n|0))break a;if((c[m+(f<<4)+8>>2]|0)>>>0<=o>>>0)break a}while(0);f=f+1|0}}while(0);b:do if(!p)while(1){j=c[m+(e<<4)>>2]|0;if(!j)g=-1;else g=c[j+12>>2]|0;if(!n)h=-1;else h=c[n+12>>2]|0;k=c[m+(e<<4)+4>>2]|0;if(!k)i=-1;else i=c[k+12>>2]|0;do if((g|0)>=-1){g=(h|0)>(i|0);if(g|(j|0)==0^1)if((j|0)==0&g)break;else break b;if((n|0)!=(k|0))break b;if(o>>>0<=(c[m+(e<<4)+8>>2]|0)>>>0)break b}while(0);e=e+-1|0}else{l=c[p+12>>2]|0;while(1){j=c[m+(e<<4)>>2]|0;if(!j)i=-1;else i=c[j+12>>2]|0;if(!n)g=-1;else g=c[n+12>>2]|0;k=c[m+(e<<4)+4>>2]|0;if(!k)h=-1;else h=c[k+12>>2]|0;do if((l|0)<=(i|0)){g=(g|0)>(h|0);if(g|(p|0)==(j|0)^1)if((p|0)==(j|0)&g)break;else break b;if((n|0)!=(k|0))break b;if(o>>>0<=(c[m+(e<<4)+8>>2]|0)>>>0)break b}while(0);e=e+-1|0}}while(0);if((f|0)<=(e|0)){h=m+(f<<4)|0;i=c[h>>2]|0;j=c[m+(f<<4)+4>>2]|0;k=c[m+(f<<4)+8>>2]|0;l=c[m+(f<<4)+12>>2]|0;m=m+(e<<4)|0;c[h>>2]=c[m>>2];c[h+4>>2]=c[m+4>>2];c[h+8>>2]=c[m+8>>2];c[h+12>>2]=c[m+12>>2];m=c[a+12>>2]|0;c[m+(e<<4)>>2]=i;c[m+(e<<4)+4>>2]=j;c[m+(e<<4)+8>>2]=k;c[m+(e<<4)+12>>2]=l;e=e+-1|0;f=f+1|0}if((f|0)>(e|0))break;m=c[a+12>>2]|0}if((e|0)>(b|0))te(a,b,e);if((f|0)<(d|0))b=f;else break}return}function ue(a,d,f,h,i,j,k,m,n){a=a|0;d=d|0;f=f|0;h=+h;i=+i;j=+j;k=k|0;m=m|0;n=n|0;var o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,E=0,F=0.0,G=0,H=0,I=0,J=0,K=0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0,V=0,W=0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0.0;W=l;l=l+32|0;T=+g[f>>2];F=+g[f+4>>2];L=+g[f+8>>2];M=1.0/+D(+((h-T)*(h-T)+(i-F)*(i-F)+(j-L)*(j-L)));Q=(h-T)*M==0.0?999999984306749440.0:1.0/((h-T)*M);R=(i-F)*M==0.0?999999984306749440.0:1.0/((i-F)*M);S=(j-L)*M==0.0?999999984306749440.0:1.0/((j-L)*M);fa=(T>h?h:T)+ +g[k>>2];ea=(F>i?i:F)+ +g[k+4>>2];da=(L>j?j:L)+ +g[k+8>>2];ba=(T>2];Z=(F>2];r=(L>2];aa=+g[a+4>>2];fa=fa>2];ea=ea>2];da=da>2];_=+g[a+24>>2];q=+g[a+28>>2];$=+g[a+36>>2];X=+g[a+40>>2];t=+g[a+44>>2];U=~~(((ca0){B=0;o=0;E=c[a+136>>2]|0;while(1){o=o+1|0;p=E+6|0;u=b[E>>1]|0;v=E+10|0;w=b[E+4>>1]|0;x=E+8|0;y=b[E+2>>1]|0;z=E+12|0;A=(c[z>>2]|0)>-1;do if(((I&65535)>=(u&65535)?(U&65535)<=(e[p>>1]|0):0)&(H&65535)<=(e[v>>1]|0)&(K&65535)>=(w&65535)&(G&65535)<=(e[x>>1]|0)&(J&65535)>=(y&65535)){ba=+g[a+36>>2];da=+g[a+40>>2];fa=+g[a+44>>2];ca=+g[a+4>>2];ea=+g[a+8>>2];s=+g[a+12>>2];g[W+12>>2]=0.0;t=+(e[p>>1]|0)/ba+ca;q=+(e[x>>1]|0)/da+ea;r=+(e[v>>1]|0)/fa+s;g[W+28>>2]=0.0;g[W>>2]=+(u&65535)/ba+ca-+g[m>>2];g[W+4>>2]=+(y&65535)/da+ea-+g[m+4>>2];g[W+8>>2]=+(w&65535)/fa+s-+g[m+8>>2];g[W+16>>2]=t-+g[k>>2];g[W+20>>2]=q-+g[k+4>>2];g[W+24>>2]=r-+g[k+8>>2];r=+g[f>>2];q=Q*(+g[W+((Q<0.0&1)<<4)>>2]-r);r=Q*(+g[W+((Q<0.0^1)<<4)>>2]-r);t=+g[f+4>>2];s=R*(+g[W+((R<0.0&1)<<4)+4>>2]-t);t=R*(+g[W+((R<0.0^1)<<4)+4>>2]-t);if(!(s>r|q>t)?(N=s>q?s:q,C=t>2],O=S*(+g[W+((S<0.0&1)<<4)+8>>2]-P),P=S*(+g[W+((S<0.0^1)<<4)+8>>2]-P),!(O>C|N>P)):0){p=(P0.0?(O>N?O:N)<(j-L)*(j-L)*M+((h-T)*(h-T)*M+(i-F)*(i-F)*M):0;if(!(A&p)){V=9;break}p=c[z>>2]|0;Sb[c[(c[d>>2]|0)+8>>2]&127](d,p>>21,p&2097151);p=1;break}p=0;V=9}else{p=0;V=9}while(0);if((V|0)==9){V=0;if(A|p)p=1;else p=0-(c[z>>2]|0)|0}B=p+B|0;if((B|0)>=(n|0))break;else E=E+(p<<4)|0}}else o=0;if((c[6160]|0)>=(o|0)){l=W;return}c[6160]=o;l=W;return}function ve(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0,s=0,t=0.0;o=l;l=l+80|0;h=+g[b+12>>2];k=+g[a+264>>2];f=+g[b+8>>2];n=+g[a+260>>2];e=+g[b+4>>2];if((k==f?+g[a+268>>2]==h:0)&n==e?+g[a+256>>2]==+g[b>>2]:0){l=o;return}m=+g[a+256>>2];d=+g[b>>2];if(d*d+e*e+f*f>0.0){j=1.0/+D(+(d*d+e*e+f*f));g[a+256>>2]=d*j;g[a+260>>2]=e*j;g[a+264>>2]=f*j;i=d*j;e=e*j;f=f*j;d=h}else{c[a+256>>2]=0;c[a+260>>2]=0;c[a+264>>2]=0;i=0.0;e=0.0;f=0.0;d=0.0}g[a+268>>2]=d;b=c[a+8>>2]|0;if(!b){l=o;return}d=i*i+e*e+f*f;do if(!(d==0.0)?!(m*m+n*n+k*k==0.0):0){d=1.0/+D(+d);j=i*d;g[a+256>>2]=j;h=e*d;g[a+260>>2]=h;d=f*d;g[a+264>>2]=d;e=1.0/+D(+(m*m+n*n+k*k));if(!(d*k*e+(h*n*e+m*e*j)<-.9999998807907104)){p=+D(+((d*k*e+(h*n*e+m*e*j)+1.0)*2.0));i=(d*m*e-k*e*j)*(1.0/p);f=(h*k*e-d*n*e)*(1.0/p);d=(n*e*j-h*m*e)*(1.0/p);e=p*.5;break}if(+C(+d)>.7071067690849304){e=1.0/+D(+(d*d+h*h));i=-(d*e);f=0.0;d=h*e;e=0.0;break}else{f=1.0/+D(+(h*h+j*j));i=j*f;f=-(h*f);d=0.0;e=0.0;break}}else{i=0.0;f=0.0;d=0.0;e=0.0}while(0);c[o+16>>2]=c[b+4>>2];c[o+16+4>>2]=c[b+4+4>>2];c[o+16+8>>2]=c[b+4+8>>2];c[o+16+12>>2]=c[b+4+12>>2];s=o+16+16|0;c[s>>2]=c[b+20>>2];c[s+4>>2]=c[b+20+4>>2];c[s+8>>2]=c[b+20+8>>2];c[s+12>>2]=c[b+20+12>>2];r=o+16+32|0;c[r>>2]=c[b+36>>2];c[r+4>>2]=c[b+36+4>>2];c[r+8>>2]=c[b+36+8>>2];c[r+12>>2]=c[b+36+12>>2];q=o+16+48|0;c[q>>2]=c[b+52>>2];c[q+4>>2]=c[b+52+4>>2];c[q+8>>2]=c[b+52+8>>2];c[q+12>>2]=c[b+52+12>>2];f=-f;p=-i;j=-d;yh(o+16|0,o);d=+g[o>>2];t=+g[o+12>>2];m=+g[o+8>>2];i=+g[o+4>>2];k=e*d+t*f+m*p-i*j;n=d*j+(t*p+e*i)-m*f;h=t*j+e*m+i*f-d*p;j=e*t-d*f-i*p-m*j;m=k*(2.0/(j*j+(h*h+(k*k+n*n))));p=n*(2.0/(j*j+(h*h+(k*k+n*n))));i=h*(2.0/(j*j+(h*h+(k*k+n*n))));g[o+16>>2]=1.0-(n*p+h*i);g[o+16+4>>2]=k*p-j*i;g[o+16+8>>2]=k*i+j*p;g[o+16+12>>2]=0.0;g[o+16+16>>2]=k*p+j*i;g[o+16+20>>2]=1.0-(k*m+h*i);g[o+16+24>>2]=n*i-j*m;g[o+16+28>>2]=0.0;g[o+16+32>>2]=k*i-j*p;g[o+16+36>>2]=n*i+j*m;g[o+16+40>>2]=1.0-(k*m+n*p);g[o+16+44>>2]=0.0;a=c[a+8>>2]|0;c[a+304>>2]=(c[a+304>>2]|0)+1;c[a+4>>2]=c[o+16>>2];c[a+4+4>>2]=c[o+16+4>>2];c[a+4+8>>2]=c[o+16+8>>2];c[a+4+12>>2]=c[o+16+12>>2];c[a+20>>2]=c[s>>2];c[a+20+4>>2]=c[s+4>>2];c[a+20+8>>2]=c[s+8>>2];c[a+20+12>>2]=c[s+12>>2];c[a+36>>2]=c[r>>2];c[a+36+4>>2]=c[r+4>>2];c[a+36+8>>2]=c[r+8>>2];c[a+36+12>>2]=c[r+12>>2];c[a+52>>2]=c[q>>2];c[a+52+4>>2]=c[q+4>>2];c[a+52+8>>2]=c[q+8>>2];c[a+52+12>>2]=c[q+12>>2];l=o;return}function we(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0;h=l;l=l+160|0;e=c[a+4>>2]|0;f=c[e+12>>2]|0;D=+g[f>>2];C=+g[f+4>>2];B=+g[f+8>>2];A=+g[f+16>>2];z=+g[f+20>>2];y=+g[f+24>>2];r=+g[f+32>>2];p=+g[f+36>>2];n=+g[f+40>>2];e=c[(c[e+4>>2]|0)+28>>2]|0;x=+g[e+(d*80|0)>>2];w=+g[e+(d*80|0)+16>>2];v=+g[e+(d*80|0)+32>>2];u=+g[e+(d*80|0)+4>>2];t=+g[e+(d*80|0)+20>>2];s=+g[e+(d*80|0)+36>>2];q=+g[e+(d*80|0)+8>>2];o=+g[e+(d*80|0)+24>>2];m=+g[e+(d*80|0)+40>>2];F=+g[e+(d*80|0)+48>>2];E=+g[e+(d*80|0)+52>>2];i=+g[e+(d*80|0)+56>>2];k=+g[f+48>>2]+(D*F+C*E+B*i);j=+g[f+52>>2]+(A*F+z*E+y*i);i=+g[f+56>>2]+(r*F+p*E+n*i);g[h+88>>2]=D*x+C*w+B*v;g[h+88+4>>2]=D*u+C*t+B*s;g[h+88+8>>2]=D*q+C*o+B*m;g[h+88+12>>2]=0.0;g[h+88+16>>2]=A*x+z*w+y*v;g[h+88+20>>2]=A*u+z*t+y*s;g[h+88+24>>2]=A*q+z*o+y*m;g[h+88+28>>2]=0.0;g[h+88+32>>2]=r*x+p*w+n*v;g[h+88+36>>2]=r*u+p*t+n*s;g[h+88+40>>2]=r*q+p*o+n*m;g[h+88+44>>2]=0.0;g[h+88+48>>2]=k;g[h+88+52>>2]=j;g[h+88+56>>2]=i;g[h+88+60>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,h+88|0,h+72|0,h+56|0);i=+g[(c[a+20>>2]|0)+32>>2];g[h+72>>2]=+g[h+72>>2]-i;g[h+72+4>>2]=+g[h+72+4>>2]-i;g[h+72+8>>2]=+g[h+72+8>>2]-i;g[h+56>>2]=i+ +g[h+56>>2];g[h+56+4>>2]=i+ +g[h+56+4>>2];g[h+56+8>>2]=i+ +g[h+56+8>>2];f=c[a+8>>2]|0;e=c[f+4>>2]|0;Vb[c[(c[e>>2]|0)+8>>2]&127](e,c[f+12>>2]|0,h+40|0,h+24|0);if(!(+g[h+72>>2]>+g[h+24>>2])?!(+g[h+56>>2]<+g[h+40>>2]):0)e=1;else e=0;if(!(!(+g[h+72+8>>2]>+g[h+24+8>>2])?!(+g[h+56+8>>2]<+g[h+40+8>>2]):0))e=0;if(+g[h+72+4>>2]>+g[h+24+4>>2]){l=h;return}if(+g[h+56+4>>2]<+g[h+40+4>>2]|e^1){l=h;return}e=c[a+4>>2]|0;f=c[e+8>>2]|0;c[h>>2]=e;c[h+4>>2]=b;c[h+8>>2]=f;c[h+12>>2]=h+88;c[h+16>>2]=-1;c[h+20>>2]=d;if(!(+g[(c[a+20>>2]|0)+32>>2]>0.0)){e=c[(c[a+24>>2]|0)+(d<<2)>>2]|0;if(!e){f=c[a+12>>2]|0;f=Db[c[(c[f>>2]|0)+8>>2]&1](f,h,c[a+8>>2]|0,c[a+28>>2]|0,1)|0;c[(c[a+24>>2]|0)+(d<<2)>>2]=f;f=c[(c[a+24>>2]|0)+(d<<2)>>2]|0}else f=e}else{f=c[a+12>>2]|0;f=Db[c[(c[f>>2]|0)+8>>2]&1](f,h,c[a+8>>2]|0,0,2)|0}b=c[a+20>>2]|0;e=c[b+8>>2]|0;if((c[e+8>>2]|0)==(c[(c[a+4>>2]|0)+8>>2]|0)){c[b+8>>2]=h;Sb[c[(c[b>>2]|0)+8>>2]&127](b,-1,d)}else{e=c[b+12>>2]|0;c[b+12>>2]=h;Sb[c[(c[b>>2]|0)+12>>2]&127](b,-1,d)}Zb[c[(c[f>>2]|0)+8>>2]&31](f,h,c[a+8>>2]|0,c[a+16>>2]|0,c[a+20>>2]|0);d=c[a+20>>2]|0;c[((c[(c[d+8>>2]|0)+8>>2]|0)==(c[(c[a+4>>2]|0)+8>>2]|0)?d+8|0:d+12|0)>>2]=e;l=h;return}function xe(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,H=0.0,I=0.0,J=0.0;Tg(a,b+(c*284|0)|0,d);m=+g[b+(c*284|0)+52>>2];h=+g[b+(c*284|0)+56>>2];q=+g[b+(c*284|0)+60>>2];J=+g[b+(c*284|0)+76>>2];x=+g[b+(c*284|0)+72>>2];z=+g[b+(c*284|0)+68>>2];w=1.0/+D(+((x*-m-z*-h)*(x*-m-z*-h)+((J*-h-x*-q)*(J*-h-x*-q)+(z*-q-J*-m)*(z*-q-J*-m))));v=(J*-h-x*-q)*w;u=w*(z*-q-J*-m);w=w*(x*-m-z*-h);e=+g[b+(c*284|0)+232>>2]*.5;k=+G(+e)/+D(+(m*m+h*h+q*q));e=+F(+e);l=2.0/(e*e+(k*-q*k*-q+(k*-m*k*-m+k*-h*k*-h)));H=1.0-(k*-h*k*-h*l+k*-q*k*-q*l);E=k*-m*k*-h*l-e*k*-q*l;I=k*-m*k*-q*l+e*k*-h*l;B=k*-m*k*-h*l+e*k*-q*l;A=1.0-(k*-m*k*-m*l+k*-q*k*-q*l);C=k*-h*k*-q*l-e*k*-m*l;j=k*-m*k*-q*l-e*k*-h*l;e=k*-h*k*-q*l+e*k*-m*l;l=1.0-(k*-m*k*-m*l+k*-h*k*-h*l);k=+g[b+(c*284|0)+236>>2]*-.5;y=+G(+k)/+D(+(J*J+(x*x+z*z)));k=+F(+k);r=2.0/(k*k+(J*y*J*y+(z*y*z*y+x*y*x*y)));n=1.0-(x*y*x*y*r+J*y*J*y*r);i=z*y*x*y*r-k*J*y*r;t=z*y*J*y*r+k*x*y*r;o=z*y*x*y*r+k*J*y*r;f=1.0-(z*y*z*y*r+J*y*J*y*r);s=x*y*J*y*r-k*z*y*r;p=z*y*J*y*r-k*x*y*r;k=x*y*J*y*r+k*z*y*r;r=1.0-(z*y*z*y*r+x*y*x*y*r);y=+g[b+(c*284|0)+68>>2];x=+g[b+(c*284|0)+72>>2];z=+g[b+(c*284|0)+76>>2];g[b+(c*284|0)+92>>2]=z*(H*t+E*s+I*r)+(y*(I*p+(E*o+H*n))+x*(I*k+(H*i+E*f)));g[b+(c*284|0)+96>>2]=w*(H*t+E*s+I*r)+(v*(I*p+(E*o+H*n))+u*(I*k+(H*i+E*f)));g[b+(c*284|0)+100>>2]=(H*t+E*s+I*r)*-q+((I*p+(E*o+H*n))*-m+(I*k+(H*i+E*f))*-h);g[b+(c*284|0)+104>>2]=0.0;g[b+(c*284|0)+108>>2]=z*(B*t+A*s+C*r)+(y*(C*p+(A*o+B*n))+x*(C*k+(B*i+A*f)));g[b+(c*284|0)+112>>2]=w*(B*t+A*s+C*r)+(v*(C*p+(A*o+B*n))+u*(C*k+(B*i+A*f)));g[b+(c*284|0)+116>>2]=(B*t+A*s+C*r)*-q+((C*p+(A*o+B*n))*-m+(C*k+(B*i+A*f))*-h);g[b+(c*284|0)+120>>2]=0.0;g[b+(c*284|0)+124>>2]=z*(j*t+e*s+l*r)+(y*(l*p+(e*o+j*n))+x*(l*k+(j*i+e*f)));g[b+(c*284|0)+128>>2]=w*(j*t+e*s+l*r)+(v*(l*p+(e*o+j*n))+u*(l*k+(j*i+e*f)));g[b+(c*284|0)+132>>2]=(j*t+e*s+l*r)*-q+((l*p+(e*o+j*n))*-m+(l*k+(j*i+e*f))*-h);g[b+(c*284|0)+136>>2]=0.0;h=+g[b+(c*284|0)+32>>2];f=h*+g[b+(c*284|0)+56>>2]+ +g[b+(c*284|0)+40>>2];e=h*+g[b+(c*284|0)+60>>2]+ +g[b+(c*284|0)+44>>2];g[b+(c*284|0)+140>>2]=+g[b+(c*284|0)+52>>2]*h+ +g[b+(c*284|0)+36>>2];g[b+(c*284|0)+144>>2]=f;g[b+(c*284|0)+148>>2]=e;g[b+(c*284|0)+152>>2]=0.0;return}function ye(b,d,e,f,h,i,k,l){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;k=k|0;l=l|0;var m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0;c[b+4>>2]=4;c[b+8>>2]=-1;c[b+12>>2]=-1;g[b+16>>2]=3402823466385288598117041.0e14;a[b+20>>0]=1;a[b+21>>0]=0;c[b+24>>2]=-1;c[b+28>>2]=d;c[b+32>>2]=e;g[b+36>>2]=0.0;g[b+40>>2]=.05000000074505806;c[b+44>>2]=0;c[b>>2]=4996;g[b+688>>2]=0.0;g[b+692>>2]=-1.0;g[b+696>>2]=.8999999761581421;g[b+700>>2]=.30000001192092896;g[b+704>>2]=1.0;g[b+708>>2]=0.0;g[b+712>>2]=0.0;a[b+716>>0]=0;a[b+736>>0]=0;a[b+737>>0]=0;a[b+738>>0]=0;a[b+739>>0]=1;a[b+740>>0]=l&1;c[b+748>>2]=0;c[b+748+4>>2]=0;c[b+748+8>>2]=0;c[b+748+12>>2]=0;c[b+748+16>>2]=0;c[b+600>>2]=c[f>>2];c[b+600+4>>2]=c[f+4>>2];c[b+600+8>>2]=c[f+8>>2];c[b+600+12>>2]=c[f+12>>2];m=+g[d+4>>2];n=+g[d+20>>2];o=+g[d+36>>2];p=+g[i>>2];q=+g[i+4>>2];r=+g[i+8>>2];do if(!(m*p+n*q+o*r>=.9999998807907104))if(!(m*p+n*q+o*r<=-.9999998807907104)){e=(g[j>>2]=o*q-n*r,c[j>>2]|0);s=(g[j>>2]=m*r-o*p,c[j>>2]|0);f=(g[j>>2]=n*p-m*q,c[j>>2]|0);x=r*(m*r-o*p)-q*(n*p-m*q);y=p*(n*p-m*q)-r*(o*q-n*r);w=q*(o*q-n*r)-p*(m*r-o*p);break}else{e=c[d+8>>2]|0;f=c[d+40>>2]|0;s=c[d+24>>2]|0;x=+g[d+12>>2];y=+g[d+28>>2];w=+g[d+44>>2];break}else{e=c[d+8>>2]|0;f=c[d+40>>2]|0;s=c[d+24>>2]|0;x=-+g[d+12>>2];y=-+g[d+28>>2];w=-+g[d+44>>2]}while(0);g[b+552>>2]=x;c[b+556>>2]=e;c[b+560>>2]=c[i>>2];g[b+564>>2]=0.0;g[b+568>>2]=y;c[b+572>>2]=s;c[b+576>>2]=c[i+4>>2];g[b+580>>2]=0.0;g[b+584>>2]=w;c[b+588>>2]=f;c[b+592>>2]=c[i+8>>2];g[b+596>>2]=0.0;p=+g[i+4>>2];t=+g[k+8>>2];q=+g[i+8>>2];u=+g[k+4>>2];v=+g[k>>2];m=+g[i>>2];do if(t*q+(p*u+v*m)<-.9999998807907104)if(+C(+q)>.7071067690849304){n=1.0/+D(+(p*p+q*q));o=-(q*n);r=0.0;n=p*n;m=0.0;break}else{q=1.0/+D(+(p*p+m*m));o=m*q;r=0.0;n=0.0;m=-(p*q);break}else{z=+D(+((t*q+(p*u+v*m)+1.0)*2.0));o=(q*v-t*m)*(1.0/z);r=z*.5;n=(u*m-p*v)*(1.0/z);m=(p*t-q*u)*(1.0/z)}while(0);B=w*o+x*r-y*n;q=x*n+y*r-w*m;p=y*m+w*r-x*o;A=-(x*m)-y*o-w*n;x=-m;o=-o;w=-n;z=q*w+(A*x+r*B)-p*o;y=p*x+(A*o+r*q)-B*w;x=B*o+(A*w+r*p)-q*x;c[b+664>>2]=c[h>>2];c[b+664+4>>2]=c[h+4>>2];c[b+664+8>>2]=c[h+8>>2];c[b+664+12>>2]=c[h+12>>2];g[b+616>>2]=z;g[b+620>>2]=u*x-t*y;c[b+624>>2]=c[k>>2];g[b+628>>2]=0.0;g[b+632>>2]=y;g[b+636>>2]=t*z-v*x;c[b+640>>2]=c[k+4>>2];g[b+644>>2]=0.0;g[b+648>>2]=x;g[b+652>>2]=v*y-u*z;c[b+656>>2]=c[k+8>>2];g[b+660>>2]=0.0;g[b+732>>2]=l?-1.0:1.0;return}function ze(b,d,e,f,h,i,j,k,m){b=b|0;d=d|0;e=e|0;f=f|0;h=+h;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0,x=0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,D=0,E=0.0;D=l;l=l+32|0;if(!b){l=D;return}n=c[k+4>>2]|0;if((n|0)<128){if((c[k+8>>2]|0)<128){c[6995]=(c[6995]|0)+1;o=sc(531)|0;if(!o)q=0;else{c[(o+4+15&-16)+-4>>2]=o;q=o+4+15&-16}p=c[k+4>>2]|0;if((p|0)>0){o=0;do{c[q+(o<<2)>>2]=c[(c[k+12>>2]|0)+(o<<2)>>2];o=o+1|0}while((o|0)!=(p|0))}o=c[k+12>>2]|0;if(o|0){if(a[k+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0)}c[k+12>>2]=0}a[k+16>>0]=1;c[k+12>>2]=q;c[k+8>>2]=128;o=k+12|0}else o=k+12|0;do{c[(c[o>>2]|0)+(n<<2)>>2]=0;n=n+1|0}while((n|0)!=128);y=k+8|0}else{o=k+12|0;y=k+8|0}c[k+4>>2]=128;c[c[o>>2]>>2]=b;p=1;n=126;do{w=p+-1|0;q=c[o>>2]|0;x=c[q+(w<<2)>>2]|0;u=+g[x+4>>2]-+g[j+4>>2];s=+g[x+8>>2]-+g[j+8>>2];g[D>>2]=+g[x>>2]-+g[j>>2];g[D+4>>2]=u;g[D+8>>2]=s;g[D+12>>2]=0.0;s=+g[x+20>>2]-+g[i+4>>2];u=+g[x+24>>2]-+g[i+8>>2];g[D+16>>2]=+g[x+16>>2]-+g[i>>2];g[D+20>>2]=s;g[D+24>>2]=u;g[D+28>>2]=0.0;v=c[f>>2]|0;u=+g[d>>2];s=+g[e>>2];t=(+g[D+(v<<4)>>2]-u)*s;u=s*(+g[D+(1-v<<4)>>2]-u);v=c[f+4>>2]|0;s=+g[d+4>>2];E=+g[e+4>>2];r=(+g[D+(v<<4)+4>>2]-s)*E;s=E*(+g[D+(1-v<<4)+4>>2]-s);do if((!(r>u|t>s)?(A=r>t?r:t,z=s>2]|0,C=+g[d+8>>2],E=+g[e+8>>2],B=(+g[D+(v<<4)+8>>2]-C)*E,C=E*(+g[D+(1-v<<4)+8>>2]-C),!(B>z|A>C)):0)?((C0.0?(B>A?B:A)>2]|0)){Ob[c[(c[m>>2]|0)+12>>2]&127](m,x);p=w;break}if((w|0)>(n|0)){v=c[k+4>>2]|0;if((v|0)<(v<<1|0)){if((c[y>>2]|0)<(v<<1|0)){if(v){c[6995]=(c[6995]|0)+1;n=sc((v<<3|3)+16|0)|0;if(!n)q=0;else{c[(n+4+15&-16)+-4>>2]=n;q=n+4+15&-16}b=c[k+4>>2]|0;if((b|0)>0){n=0;do{c[q+(n<<2)>>2]=c[(c[o>>2]|0)+(n<<2)>>2];n=n+1|0}while((n|0)!=(b|0))}}else q=0;n=c[o>>2]|0;if(n|0){if(a[k+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}c[o>>2]=0}a[k+16>>0]=1;c[o>>2]=q;c[y>>2]=v<<1;n=v}else n=v;do{c[q+(n<<2)>>2]=0;n=n+1|0;q=c[o>>2]|0}while((n|0)!=(v<<1|0))}c[k+4>>2]=v<<1;n=(v<<1)+-2|0}c[q+(w<<2)>>2]=c[x+36>>2];c[(c[o>>2]|0)+(p<<2)>>2]=c[x+40>>2];p=p+1|0}else p=w;while(0)}while((p|0)!=0);l=D;return}function Ae(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,k=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0,D=0,E=0.0;D=l;l=l+32|0;q=+g[d>>2];h=(g[j>>2]=q,c[j>>2]|0);t=q<999999984306749440.0?h:1566444395;p=+g[d+4>>2];k=(g[j>>2]=p,c[j>>2]|0);u=p<999999984306749440.0?k:1566444395;E=+g[d+8>>2];n=(g[j>>2]=E,c[j>>2]|0);w=E<999999984306749440.0?n:1566444395;r=+g[d+12>>2];y=r<0.0?r:0.0;h=q>-999999984306749440.0?h:-581039253;k=p>-999999984306749440.0?k:-581039253;n=E>-999999984306749440.0?n:-581039253;r=r>0.0?r:0.0;E=+g[d+16>>2];B=E<(c[j>>2]=t,+g[j>>2]);i=(g[j>>2]=E,c[j>>2]|0);t=B?i:t;p=+g[d+20>>2];B=p<(c[j>>2]=u,+g[j>>2]);m=(g[j>>2]=p,c[j>>2]|0);u=B?m:u;q=+g[d+24>>2];B=q<(c[j>>2]=w,+g[j>>2]);o=(g[j>>2]=q,c[j>>2]|0);w=B?o:w;s=+g[d+28>>2];y=s>2]=h,+g[j>>2])>2]=k,+g[j>>2])>2]=n,+g[j>>2])>2];B=E<(c[j>>2]=t,+g[j>>2]);h=(g[j>>2]=E,c[j>>2]|0);B=B?h:t;q=+g[d+36>>2];A=q<(c[j>>2]=u,+g[j>>2]);i=(g[j>>2]=q,c[j>>2]|0);A=A?i:u;r=+g[d+40>>2];z=r<(c[j>>2]=w,+g[j>>2]);k=(g[j>>2]=r,c[j>>2]|0);z=z?k:w;p=+g[d+44>>2];y=p>2]=x,+g[j>>2])>2]=v,+g[j>>2])>2]=m,+g[j>>2])>2]|0;h=c[t+4>>2]|0;if((h|0)==(c[t+8>>2]|0)?(C=h|0?h<<1:1,(h|0)<(C|0)):0){if(!C)o=0;else{c[6995]=(c[6995]|0)+1;h=sc(C<<6|19)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}o=h;h=c[t+4>>2]|0}if((h|0)>0){i=0;do{k=o+(i<<6)|0;m=(c[t+12>>2]|0)+(i<<6)|0;n=k+64|0;do{c[k>>2]=c[m>>2];k=k+4|0;m=m+4|0}while((k|0)<(n|0));i=i+1|0}while((i|0)!=(h|0))}h=c[t+12>>2]|0;if(h|0){if(a[t+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[t+12>>2]=0}a[t+16>>0]=1;c[t+12>>2]=o;c[t+8>>2]=C;h=c[t+4>>2]|0}C=c[t+12>>2]|0;c[C+(h<<6)>>2]=B;c[C+(h<<6)+4>>2]=A;c[C+(h<<6)+8>>2]=z;g[C+(h<<6)+12>>2]=y;c[C+(h<<6)+16>>2]=w;c[C+(h<<6)+20>>2]=v;c[C+(h<<6)+24>>2]=u;g[C+(h<<6)+28>>2]=p;c[C+(h<<6)+32>>2]=-1;c[C+(h<<6)+36>>2]=e;c[C+(h<<6)+40>>2]=f;f=C+(h<<6)+44|0;c[f>>2]=c[D>>2];c[f+4>>2]=c[D+4>>2];c[f+8>>2]=c[D+8>>2];c[f+12>>2]=c[D+12>>2];c[f+16>>2]=c[D+16>>2];c[t+4>>2]=(c[t+4>>2]|0)+1;l=D;return}function Be(b,d,e,f){b=b|0;d=d|0;e=e|0;f=+f;var h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0;o=l;l=l+16|0;n=+g[d>>2];i=+g[d+4>>2];j=+g[d+8>>2];k=+g[e>>2];m=+g[e+4>>2];h=+g[e+8>>2];if(!(a[b+232>>0]|0)){z=+g[b+104>>2];w=+g[b+120>>2];C=+g[b+136>>2];y=+g[b+108>>2];u=+g[b+124>>2];B=+g[b+140>>2];x=+g[b+112>>2];s=+g[b+128>>2];A=+g[b+144>>2];F=-+g[b+152>>2];E=-+g[b+156>>2];D=-+g[b+160>>2];J=+g[b+168>>2];I=+g[b+172>>2];r=+g[b+176>>2];H=+g[b+184>>2];G=+g[b+188>>2];q=+g[b+192>>2];v=+g[b+200>>2];t=+g[b+204>>2];p=+g[b+208>>2];r=h*(C*J+B*I+A*r)+(k*(z*J+y*I+x*r)+m*(w*J+u*I+s*r))+(J*(z*F+w*E+C*D)+(y*F+u*E+B*D)*I+(x*F+s*E+A*D)*r+ +g[b+216>>2]);q=h*(C*H+B*G+A*q)+(k*(z*H+y*G+x*q)+m*(w*H+u*G+s*q))+((z*F+w*E+C*D)*H+(y*F+u*E+B*D)*G+(x*F+s*E+A*D)*q+ +g[b+220>>2]);p=(z*F+w*E+C*D)*v+(y*F+u*E+B*D)*t+(x*F+s*E+A*D)*p+ +g[b+224>>2]+(h*(C*v+B*t+A*p)+(k*(z*v+y*t+x*p)+m*(w*v+u*t+s*p)));g[o>>2]=r;g[o+4>>2]=q;g[o+8>>2]=p;n=(n*f+k-r)*+g[d>>2]+(i*f+m-q)*+g[d+4>>2]+(j*f+h-p)*+g[d+8>>2];e=o+12|0;g[e>>2]=0.0;b=b+36|0;b=c[b>>2]|0;e=c[b>>2]|0;e=e+16|0;e=c[e>>2]|0;Tb[e&15](b,d,o,n);l=o;return}else{z=+g[b+40>>2];C=+g[b+56>>2];w=+g[b+72>>2];A=+g[b+44>>2];E=+g[b+60>>2];x=+g[b+76>>2];B=+g[b+48>>2];G=+g[b+64>>2];y=+g[b+80>>2];t=-+g[b+88>>2];u=-+g[b+92>>2];v=-+g[b+96>>2];p=+g[b+168>>2];q=+g[b+172>>2];H=+g[b+176>>2];r=+g[b+184>>2];s=+g[b+188>>2];I=+g[b+192>>2];D=+g[b+200>>2];F=+g[b+204>>2];J=+g[b+208>>2];H=(j*f+h)*(w*p+x*q+y*H)+((n*f+k)*(z*p+A*q+B*H)+(i*f+m)*(C*p+E*q+G*H))+(p*(z*t+C*u+w*v)+(A*t+E*u+x*v)*q+(B*t+G*u+y*v)*H+ +g[b+216>>2]);I=(j*f+h)*(w*r+x*s+y*I)+((n*f+k)*(z*r+A*s+B*I)+(i*f+m)*(C*r+E*s+G*I))+((z*t+C*u+w*v)*r+(A*t+E*u+x*v)*s+(B*t+G*u+y*v)*I+ +g[b+220>>2]);J=(z*t+C*u+w*v)*D+(A*t+E*u+x*v)*F+(B*t+G*u+y*v)*J+ +g[b+224>>2]+((j*f+h)*(w*D+x*F+y*J)+((n*f+k)*(z*D+A*F+B*J)+(i*f+m)*(C*D+E*F+G*J)));g[o>>2]=H+n*(n*(H-k)+i*(I-m)+j*(J-h));g[o+4>>2]=I+i*(n*(H-k)+i*(I-m)+j*(J-h));g[o+8>>2]=J+j*(n*(H-k)+i*(I-m)+j*(J-h));J=n*(H-k)+i*(I-m)+j*(J-h);e=o+12|0;g[e>>2]=0.0;b=b+36|0;b=c[b>>2]|0;e=c[b>>2]|0;e=e+16|0;e=c[e>>2]|0;Tb[e&15](b,d,o,J);l=o;return}}function Ce(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0;c[a+556>>2]=c[b>>2];c[a+556+4>>2]=c[b+4>>2];c[a+556+8>>2]=c[b+8>>2];c[a+556+12>>2]=c[b+12>>2];q=+g[a+568>>2];j=+g[5957];r=+g[a+560>>2];e=+g[5959];o=+g[a+564>>2];h=+g[5958];p=+g[a+556>>2];i=(j*o+q*h-e*p)*-o+(q*(q*j+r*e-o*h)+(-(j*p)-r*h-e*o)*-p)-(q*e+h*p-j*r)*-r;k=(q*e+h*p-j*r)*-p+(q*(j*o+q*h-e*p)+(-(j*p)-r*h-e*o)*-r)-(q*j+r*e-o*h)*-o;d=(q*j+r*e-o*h)*-r+((-(j*p)-r*h-e*o)*-o+q*(q*e+h*p-j*r))-(j*o+q*h-e*p)*-p;do if(e*d+(h*k+j*i)<-.9999998807907104)if(+C(+e)>.7071067690849304){d=1.0/+D(+(e*e+h*h));l=-(e*d);f=0.0;d=h*d;e=0.0;break}else{f=1.0/+D(+(j*j+h*h));l=j*f;f=-(h*f);d=0.0;e=0.0;break}else{v=+D(+((e*d+(h*k+j*i)+1.0)*2.0));l=(e*i-j*d)*(1.0/v);f=(h*d-e*k)*(1.0/v);d=(j*k-h*i)*(1.0/v);e=v*.5}while(0);m=1.0/+D(+(f*f+l*l+d*d+e*e));t=f*m;n=l*m;s=d*m;m=e*m;e=1.0/+D(+((m*q-p*-t-r*-n-o*-s)*(m*q-p*-t-r*-n-o*-s)+((q*-s+m*o+r*-t-p*-n)*(q*-s+m*o+r*-t-p*-n)+((p*m+q*-t+o*-n-r*-s)*(p*m+q*-t+o*-n-r*-s)+(p*-s+(q*-n+m*r)-o*-t)*(p*-s+(q*-n+m*r)-o*-t)))));h=(p*m+q*-t+o*-n-r*-s)*e;v=e*(p*-s+(q*-n+m*r)-o*-t);f=e*(q*-s+m*o+r*-t-p*-n);p=e*(m*q-p*-t-r*-n-o*-s);e=+g[a+444>>2];if(e>=.05000000074505806?(u=+g[a+448>>2],u>=.05000000074505806):0){d=m<-1.0?-1.0:m;d=+I(+(d>1.0?1.0:d))*2.0;if(d>1.1920928955078125e-07){i=1.0/+D(+(s*s+(t*t+n*n)));if(+C(+(n*i))>1.1920928955078125e-07){k=t*i;j=n*i;l=s*i;e=+D(+((s*i*s*i/(n*i*n*i)+1.0)/(1.0/(u*u)+s*i*s*i/(n*i*n*i)/(e*e))))}else{k=t*i;j=n*i;l=s*i}}else{k=0.0;j=0.0;l=0.0;e=0.0}if(+C(+d)>1.1920928955078125e-07){if(!(d>e)){e=-e;if(d>2];if(k>=.05000000074505806){d=p<-1.0?-1.0:p;d=+I(+(d>1.0?1.0:d))*2.0;if(d>3.1415927410125732){d=-p<-1.0?-1.0:-p;d=+I(+(d>1.0?1.0:d))*2.0;e=-h;i=-v;j=-f}else{e=h;i=v;j=f}if(d>1.1920928955078125e-07){u=1.0/+D(+(e*e+i*i+j*j));e=e*u;i=i*u;j=j*u}if(+C(+d)>1.1920928955078125e-07){if(!(d>k)){if(d<-k)d=-k}else d=k;v=d*.5;d=+G(+v)/+D(+(j*j+(i*i+e*e)));h=e*d;f=j*d;e=+F(+v);d=i*d}else{e=p;d=v}}else{e=p;d=v}g[a+556>>2]=n*f+(m*h+o*e)-l*d;g[a+560>>2]=l*h+(m*d+n*e)-o*f;g[a+564>>2]=o*d+(m*f+l*e)-n*h;g[a+568>>2]=m*e-o*h-n*d-l*f;return}function De(b,d){b=b|0;d=+d;var e=0,f=0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0;r=l;l=l+32|0;e=c[b+128>>2]|0;if((e|0)>0){f=0;do{xe(c[b+108>>2]|0,c[b+136>>2]|0,f,0);f=f+1|0;e=c[b+128>>2]|0}while((f|0)<(e|0))}q=c[b+108>>2]|0;m=+g[q+372>>2];n=+g[q+376>>2];h=+g[q+380>>2];h=+D(+(m*m+n*n+h*h))*3.5999999046325684;g[b+104>>2]=h;p=c[b+120>>2]|0;if(+g[q+4+(p<<2)>>2]*+g[q+372>>2]+ +g[q+20+(p<<2)>>2]*+g[q+376>>2]+ +g[q+36+(p<<2)>>2]*+g[q+380>>2]<0.0)g[b+104>>2]=-h;if((e|0)>0){e=0;do{+wf(b,(c[b+136>>2]|0)+(e*284|0)|0);e=e+1|0;f=c[b+128>>2]|0}while((e|0)<(f|0));i=1.0/+g[(c[b+108>>2]|0)+404>>2];if((f|0)>0){f=0;do{e=c[b+136>>2]|0;if(!(a[e+(f*284|0)+84>>0]|0))h=0.0;else{h=+g[e+(f*284|0)+272>>2];h=i*(+g[e+(f*284|0)+216>>2]*(+g[e+(f*284|0)+204>>2]-+g[e+(f*284|0)+32>>2])*+g[e+(f*284|0)+268>>2]-h*+g[(h<0.0?e+(f*284|0)+220|0:e+(f*284|0)+224|0)>>2]);h=h<0.0?0.0:h}g[e+(f*284|0)+276>>2]=h;f=f+1|0;e=c[b+128>>2]|0}while((f|0)<(e|0));if((e|0)>0){e=0;do{p=c[b+136>>2]|0;k=+g[p+(e*284|0)+276>>2];n=+g[p+(e*284|0)+248>>2];k=k>n?n:k;n=k*+g[p+(e*284|0)+4>>2]*d;m=k*+g[p+(e*284|0)+8>>2]*d;g[r+16>>2]=+g[p+(e*284|0)>>2]*k*d;g[r+16+4>>2]=n;g[r+16+8>>2]=m;g[r+16+12>>2]=0.0;q=c[b+108>>2]|0;m=+g[p+(e*284|0)+20>>2]-+g[q+56>>2];n=+g[p+(e*284|0)+24>>2]-+g[q+60>>2];g[r>>2]=+g[p+(e*284|0)+16>>2]-+g[q+52>>2];g[r+4>>2]=m;g[r+8>>2]=n;g[r+12>>2]=0.0;ll(q,r+16|0,r);e=e+1|0}while((e|0)<(c[b+128>>2]|0))}}}Jb[c[(c[b>>2]|0)+20>>2]&31](b,d);o=c[b+128>>2]|0;if((o|0)<=0){l=r;return}p=c[b+136>>2]|0;q=c[b+108>>2]|0;f=0;do{h=+g[p+(f*284|0)+36>>2]-+g[q+52>>2];i=+g[p+(f*284|0)+40>>2]-+g[q+56>>2];j=+g[p+(f*284|0)+44>>2]-+g[q+60>>2];k=+g[q+392>>2];m=+g[q+396>>2];n=+g[q+388>>2];if(!(a[p+(f*284|0)+84>>0]|0)){s=p+(f*284|0)+240|0;e=s;h=+g[s>>2]}else{e=c[b+120>>2]|0;y=+g[q+4+(e<<2)>>2];w=+g[q+20+(e<<2)>>2];u=+g[q+36+(e<<2)>>2];x=+g[p+(f*284|0)>>2];v=+g[p+(f*284|0)+4>>2];t=+g[p+(f*284|0)+8>>2];h=((i*n-h*k+ +g[q+380>>2])*(u-t*(y*x+w*v+u*t))+((k*j-i*m+ +g[q+372>>2])*(y-x*(y*x+w*v+u*t))+(h*m-j*n+ +g[q+376>>2])*(w-v*(y*x+w*v+u*t))))*d/+g[p+(f*284|0)+212>>2];e=p+(f*284|0)+240|0;g[e>>2]=h}s=p+(f*284|0)+236|0;g[s>>2]=h+ +g[s>>2];g[e>>2]=h*.9900000095367432;f=f+1|0}while((f|0)!=(o|0));l=r;return}function Ee(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,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(!((a|0)!=0&(b|0)!=0))return;c[6995]=(c[6995]|0)+1;e=sc(1043)|0;if(!e)f=0;else{c[(e+4+15&-16)+-4>>2]=e;f=e+4+15&-16}c[f>>2]=a;c[f+4>>2]=b;e=1;b=124;h=128;a=f;l=128;k=f;i=f;o=f;while(1){r=e+-1|0;p=c[a+(r<<3)>>2]|0;q=c[a+(r<<3)+4>>2]|0;if((r|0)>(b|0)){n=l<<1;do if((l|0)<(n|0)&(h|0)<(n|0)){if(l){c[6995]=(c[6995]|0)+1;b=sc((l<<4|3)+16|0)|0;if(!b)f=0;else{c[(b+4+15&-16)+-4>>2]=b;f=b+4+15&-16}if((l|0)>0){b=0;do{j=a+(b<<3)|0;k=c[j+4>>2]|0;m=f+(b<<3)|0;c[m>>2]=c[j>>2];c[m+4>>2]=k;b=b+1|0}while((b|0)!=(l|0));h=f;a=f}else{h=f;b=f;s=12}}else{h=0;b=0;s=12}if((s|0)==12){s=0;if(!a){j=n;a=b;f=h;i=h;b=h;break}else a=b}if(!o){j=n;f=h;i=h;b=h}else{c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0);j=n;f=h;i=h;b=h}}else{j=h;f=k;b=o}while(0);m=n+-4|0;h=j;l=n;k=f;j=b}else{m=b;j=o}do if((p|0)==(q|0))if(!(c[p+40>>2]|0))e=r;else{q=c[p+36>>2]|0;c[a+(r<<3)>>2]=q;c[a+(r<<3)+4>>2]=q;q=c[p+40>>2]|0;r=e+1|0;c[a+(e<<3)>>2]=q;c[a+(e<<3)+4>>2]=q;q=c[p+40>>2]|0;c[a+(r<<3)>>2]=c[p+36>>2];c[a+(r<<3)+4>>2]=q;e=e+2|0}else if(((((+g[p>>2]<=+g[q+16>>2]?+g[p+16>>2]>=+g[q>>2]:0)?+g[p+4>>2]<=+g[q+20>>2]:0)?+g[p+20>>2]>=+g[q+4>>2]:0)?+g[p+8>>2]<=+g[q+24>>2]:0)?+g[p+24>>2]>=+g[q+8>>2]:0){b=(c[q+40>>2]|0)!=0;if(!(c[p+40>>2]|0))if(b){o=c[q+36>>2]|0;c[a+(r<<3)>>2]=p;c[a+(r<<3)+4>>2]=o;r=c[q+40>>2]|0;c[a+(e<<3)>>2]=p;c[a+(e<<3)+4>>2]=r;e=e+1|0;break}else{Sb[c[(c[d>>2]|0)+8>>2]&127](d,p,q);e=r;break}else{f=c[p+36>>2]|0;if(b){n=c[q+36>>2]|0;c[a+(r<<3)>>2]=f;c[a+(r<<3)+4>>2]=n;n=c[q+36>>2]|0;o=e+1|0;c[a+(e<<3)>>2]=c[p+40>>2];c[a+(e<<3)+4>>2]=n;n=c[q+40>>2]|0;r=e+2|0;c[a+(o<<3)>>2]=c[p+36>>2];c[a+(o<<3)+4>>2]=n;q=c[q+40>>2]|0;c[a+(r<<3)>>2]=c[p+40>>2];c[a+(r<<3)+4>>2]=q;e=e+3|0;break}else{c[a+(r<<3)>>2]=f;c[a+(r<<3)+4>>2]=q;c[a+(e<<3)>>2]=c[p+40>>2];c[a+(e<<3)+4>>2]=q;e=e+1|0;break}}}else e=r;while(0);if(!e)break;else{b=m;o=j}}if((a|0)==0|(k|0)==0)return;c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);return}function Fe(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0,H=0.0,I=0.0,J=0.0;d=l;l=l+96|0;k=+g[b>>2];m=+g[a+28>>2];n=+g[b+4>>2];o=+g[a+32>>2];p=+g[b+8>>2];q=+g[a+36>>2];r=+g[a+44>>2];s=+g[a+48>>2];t=+g[a+52>>2];u=+g[a+60>>2];v=+g[a+64>>2];w=+g[a+68>>2];x=+g[a+76>>2];y=+g[a+80>>2];z=+g[a+84>>2];g[d+80>>2]=k*m+n*o+p*q+x;g[d+80+4>>2]=k*r+n*s+p*t+y;g[d+80+8>>2]=k*u+n*v+p*w+z;g[d+80+12>>2]=0.0;A=+g[b+16>>2];B=+g[b+20>>2];C=+g[b+24>>2];g[d+64>>2]=A*m+B*o+C*q+x;g[d+64+4>>2]=A*r+B*s+C*t+y;g[d+64+8>>2]=A*u+B*v+C*w+z;g[d+64+12>>2]=0.0;E=+g[b+32>>2];F=+g[b+36>>2];j=+g[b+40>>2];g[d+48>>2]=E*m+F*o+j*q+x;g[d+48+4>>2]=E*r+F*s+j*t+y;g[d+48+8>>2]=E*u+F*v+j*w+z;g[d+48+12>>2]=0.0;f=(k*m+n*o+p*q+x+(A*m+B*o+C*q+x)+(E*m+F*o+j*q+x))*.3333333432674408;h=(k*r+n*s+p*t+y+(A*r+B*s+C*t+y)+(E*r+F*s+j*t+y))*.3333333432674408;i=(k*u+n*v+p*w+z+(A*u+B*v+C*w+z)+(E*u+F*v+j*w+z))*.3333333432674408;g[d+32>>2]=f;g[d+32+4>>2]=h;g[d+32+8>>2]=i;g[d+32+12>>2]=0.0;b=c[a+8>>2]|0;if(!((xb[c[(c[b>>2]|0)+56>>2]&127](b)|0)&16384)){e=c[a+8>>2]|0;G=c[e>>2]|0;G=G+16|0;G=c[G>>2]|0;b=a+12|0;Vb[G&127](e,d+80|0,d+64|0,b);e=c[a+8>>2]|0;G=c[e>>2]|0;G=G+16|0;G=c[G>>2]|0;Vb[G&127](e,d+64|0,d+48|0,b);a=c[a+8>>2]|0;e=c[a>>2]|0;e=e+16|0;e=c[e>>2]|0;Vb[e&127](a,d+48|0,d+80|0,b);l=d;return}J=+g[d+80>>2];I=A*r+B*s+C*t+y-(k*r+n*s+p*t+y);H=A*u+B*v+C*w+z-(k*u+n*v+p*w+z);y=E*r+F*s+j*t+y-(k*r+n*s+p*t+y);w=E*u+F*v+j*w+z-(k*u+n*v+p*w+z);z=H*(E*m+F*o+j*q+x-J)-(A*m+B*o+C*q+x-J)*w;F=(A*m+B*o+C*q+x-J)*y-I*(E*m+F*o+j*q+x-J);E=1.0/+D(+(F*F+((I*w-H*y)*(I*w-H*y)+z*z)));c[d+16>>2]=1065353216;c[d+16+4>>2]=1065353216;c[d+16+8>>2]=0;g[d+16+12>>2]=0.0;b=c[a+8>>2]|0;e=c[(c[b>>2]|0)+16>>2]|0;g[d>>2]=E*(I*w-H*y)+f;g[d+4>>2]=E*z+h;g[d+8>>2]=E*F+i;g[d+12>>2]=0.0;Vb[e&127](b,d+32|0,d,d+16|0);b=c[a+8>>2]|0;e=c[b>>2]|0;e=e+16|0;e=c[e>>2]|0;G=a+12|0;Vb[e&127](b,d+80|0,d+64|0,G);b=c[a+8>>2]|0;e=c[b>>2]|0;e=e+16|0;e=c[e>>2]|0;Vb[e&127](b,d+64|0,d+48|0,G);a=c[a+8>>2]|0;b=c[a>>2]|0;b=b+16|0;b=c[b>>2]|0;Vb[b&127](a,d+48|0,d+80|0,G);l=d;return}function Ge(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0,i=0,j=0.0;a=l;l=l+144|0;switch(c[b+448>>2]&15){case 1:{c[a+112>>2]=3572;h=c[d+8>>2]|0;h=(c[h+252>>2]&2|0)==0?0:h;i=c[d+12>>2]|0;j=+g[i+48>>2];e=+g[i+52>>2];f=+g[i+56>>2];f=+D(+((j-j)*(j-j)+(e-e)*(e-e)+(f-f)*(f-f)));i=c[b+192>>2]|0;e=+nb[c[(c[i>>2]|0)+48>>2]&15](i);i=c[d+4>>2]|0;Vb[c[(c[i>>2]|0)+8>>2]&127](i,c[d+12>>2]|0,a+96|0,a+64|0);c[a>>2]=c[a+96>>2];c[a+4>>2]=c[a+96+4>>2];c[a+8>>2]=c[a+96+8>>2];c[a+12>>2]=c[a+96+12>>2];c[a+16>>2]=c[a+64>>2];c[a+16+4>>2]=c[a+64+4>>2];c[a+16+8>>2]=c[a+64+8>>2];c[a+16+12>>2]=c[a+64+12>>2];c[a+32>>2]=c[a>>2];c[a+32+4>>2]=c[a+4>>2];c[a+32+8>>2]=c[a+8>>2];c[a+32+12>>2]=c[a+12>>2];c[a+32+16>>2]=c[a+16>>2];c[a+32+20>>2]=c[a+20>>2];c[a+32+24>>2]=c[a+24>>2];c[a+32+28>>2]=c[a+28>>2];g[a+32>>2]=+g[a+32>>2]-e;g[a+32+4>>2]=+g[a+32+4>>2]-e;g[a+32+8>>2]=+g[a+32+8>>2]-e;g[a+32+16>>2]=e+ +g[a+32+16>>2];g[a+32+20>>2]=e+ +g[a+32+20>>2];g[a+32+24>>2]=e+ +g[a+32+24>>2];c[a+112+4>>2]=b;c[a+112+8>>2]=d;c[a+112+12>>2]=h;g[a+112+16>>2]=f+e;g[a+112+20>>2]=e;Bf(c[b+988>>2]|0,a+32|0,a+112|0);l=a;return}case 2:{g[a+4>>2]=1.0;c[a+8+4>>2]=0;c[a+8+4+4>>2]=0;c[a+8+4+8>>2]=0;c[a>>2]=3608;c[a+24>>2]=b;c[a+28>>2]=d;c[a+8>>2]=c[b+516>>2];i=c[d+4>>2]|0;j=+nb[c[(c[i>>2]|0)+48>>2]&15](i);i=c[b+192>>2]|0;j=j+ +nb[c[(c[i>>2]|0)+48>>2]&15](i);g[a+12>>2]=j;f=+g[(c[d+8>>2]|0)+228>>2];g[a+112>>2]=f;c[a+16>>2]=c[(+g[b+376>>2]>2];i=c[d+4>>2]|0;Vb[c[(c[i>>2]|0)+8>>2]&127](i,c[d+12>>2]|0,a+112|0,a+96|0);c[a+32>>2]=c[a+112>>2];c[a+32+4>>2]=c[a+112+4>>2];c[a+32+8>>2]=c[a+112+8>>2];c[a+32+12>>2]=c[a+112+12>>2];c[a+32+16>>2]=c[a+96>>2];c[a+32+16+4>>2]=c[a+96+4>>2];c[a+32+16+8>>2]=c[a+96+8>>2];c[a+32+16+12>>2]=c[a+96+12>>2];c[a+64>>2]=c[a+32>>2];c[a+64+4>>2]=c[a+32+4>>2];c[a+64+8>>2]=c[a+32+8>>2];c[a+64+12>>2]=c[a+32+12>>2];c[a+64+16>>2]=c[a+32+16>>2];c[a+64+20>>2]=c[a+32+20>>2];c[a+64+24>>2]=c[a+32+24>>2];c[a+64+28>>2]=c[a+32+28>>2];g[a+64>>2]=+g[a+64>>2]-j;g[a+64+4>>2]=+g[a+64+4>>2]-j;g[a+64+8>>2]=+g[a+64+8>>2]-j;g[a+64+16>>2]=j+ +g[a+64+16>>2];g[a+64+20>>2]=j+ +g[a+64+20>>2];g[a+64+24>>2]=j+ +g[a+64+24>>2];Bf(c[b+1068>>2]|0,a+64|0,a);l=a;return}default:{l=a;return}}}function He(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;c[b+4>>2]=6;c[b+8>>2]=-1;c[b+12>>2]=-1;g[b+16>>2]=3402823466385288598117041.0e14;a[b+20>>0]=1;a[b+21>>0]=0;c[b+24>>2]=-1;c[b+28>>2]=d;c[b+32>>2]=e;g[b+36>>2]=0.0;g[b+40>>2]=.05000000074505806;c[b+44>>2]=0;c[b>>2]=4704;c[b+48>>2]=c[f>>2];c[b+48+4>>2]=c[f+4>>2];c[b+48+8>>2]=c[f+8>>2];c[b+48+12>>2]=c[f+12>>2];c[b+64>>2]=c[f+16>>2];c[b+64+4>>2]=c[f+16+4>>2];c[b+64+8>>2]=c[f+16+8>>2];c[b+64+12>>2]=c[f+16+12>>2];c[b+80>>2]=c[f+32>>2];c[b+80+4>>2]=c[f+32+4>>2];c[b+80+8>>2]=c[f+32+8>>2];c[b+80+12>>2]=c[f+32+12>>2];c[b+96>>2]=c[f+48>>2];c[b+96+4>>2]=c[f+48+4>>2];c[b+96+8>>2]=c[f+48+8>>2];c[b+96+12>>2]=c[f+48+12>>2];c[b+112>>2]=c[h>>2];c[b+112+4>>2]=c[h+4>>2];c[b+112+8>>2]=c[h+8>>2];c[b+112+12>>2]=c[h+12>>2];c[b+128>>2]=c[h+16>>2];c[b+128+4>>2]=c[h+16+4>>2];c[b+128+8>>2]=c[h+16+8>>2];c[b+128+12>>2]=c[h+16+12>>2];c[b+144>>2]=c[h+32>>2];c[b+144+4>>2]=c[h+32+4>>2];c[b+144+8>>2]=c[h+32+8>>2];c[b+144+12>>2]=c[h+32+12>>2];c[b+160>>2]=c[h+48>>2];c[b+160+4>>2]=c[h+48+4>>2];c[b+160+8>>2]=c[h+48+8>>2];c[b+160+12>>2]=c[h+48+12>>2];d=b+680|0;e=d+48|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(e|0));c[b+740>>2]=0;c[b+740+4>>2]=0;c[b+740+8>>2]=0;c[b+740+12>>2]=0;c[b+756>>2]=1045220557;c[b+760>>2]=1045220557;c[b+764>>2]=1045220557;c[b+768>>2]=0;c[b+768+4>>2]=0;c[b+768+8>>2]=0;c[b+768+12>>2]=0;c[b+768+16>>2]=0;g[b+728>>2]=.699999988079071;g[b+732>>2]=1.0;g[b+736>>2]=.5;a[b+788>>0]=0;g[b+792>>2]=0.0;g[b+808>>2]=0.0;a[b+789>>0]=0;g[b+796>>2]=0.0;g[b+812>>2]=0.0;a[b+790>>0]=0;g[b+800>>2]=0.0;g[b+816>>2]=0.0;g[b+928>>2]=0.0;g[b+876>>2]=0.0;g[b+880>>2]=.10000000149011612;g[b+884>>2]=300.0;g[b+868>>2]=1.0;g[b+872>>2]=-1.0;g[b+896>>2]=0.0;g[b+900>>2]=.20000000298023224;g[b+904>>2]=0.0;g[b+908>>2]=0.0;g[b+888>>2]=1.0;g[b+892>>2]=.5;c[b+924>>2]=0;g[b+916>>2]=0.0;a[b+912>>0]=0;g[b+992>>2]=0.0;g[b+940>>2]=0.0;g[b+944>>2]=.10000000149011612;g[b+948>>2]=300.0;g[b+932>>2]=1.0;g[b+936>>2]=-1.0;g[b+960>>2]=0.0;g[b+964>>2]=.20000000298023224;g[b+968>>2]=0.0;g[b+972>>2]=0.0;g[b+952>>2]=1.0;g[b+956>>2]=.5;c[b+988>>2]=0;g[b+980>>2]=0.0;a[b+976>>0]=0;g[b+1056>>2]=0.0;g[b+1004>>2]=0.0;g[b+1008>>2]=.10000000149011612;g[b+1012>>2]=300.0;g[b+996>>2]=1.0;g[b+1e3>>2]=-1.0;g[b+1024>>2]=0.0;g[b+1028>>2]=.20000000298023224;g[b+1032>>2]=0.0;g[b+1036>>2]=0.0;g[b+1016>>2]=1.0;g[b+1020>>2]=.5;c[b+1052>>2]=0;g[b+1044>>2]=0.0;a[b+1040>>0]=0;a[b+1300>>0]=i&1;a[b+1301>>0]=1;c[b+1304>>2]=0;a[b+1308>>0]=0;jd(b,(c[b+28>>2]|0)+4|0,(c[b+32>>2]|0)+4|0);return}function Ie(a,e,f){a=a|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;c[e+16>>2]=c[a+20>>2];c[e+20>>2]=c[a+24>>2];c[e+24>>2]=c[a+28>>2];c[e+28>>2]=c[a+32>>2];c[e>>2]=c[a+4>>2];c[e+4>>2]=c[a+8>>2];c[e+8>>2]=c[a+12>>2];c[e+12>>2]=c[a+16>>2];c[e+32>>2]=c[a+36>>2];c[e+36>>2]=c[a+40>>2];c[e+40>>2]=c[a+44>>2];c[e+44>>2]=c[a+48>>2];c[e+48>>2]=c[a+56>>2];c[e+52>>2]=d[a+60>>0];k=c[a+88>>2]|0;c[e+56>>2]=k;if(k){k=zb[c[(c[f>>2]|0)+28>>2]&31](f,c[a+96>>2]|0)|0;c[e+64>>2]=k;if(k|0){i=c[a+88>>2]|0;j=Bb[c[(c[f>>2]|0)+16>>2]&63](f,48,i)|0;if((i|0)>0){g=c[j+8>>2]|0;h=0;while(1){k=c[a+96>>2]|0;c[g+16>>2]=c[k+(h<<6)+16>>2];c[g+20>>2]=c[k+(h<<6)+20>>2];c[g+24>>2]=c[k+(h<<6)+24>>2];c[g+28>>2]=c[k+(h<<6)+28>>2];c[g>>2]=c[k+(h<<6)>>2];c[g+4>>2]=c[k+(h<<6)+4>>2];c[g+8>>2]=c[k+(h<<6)+8>>2];c[g+12>>2]=c[k+(h<<6)+12>>2];c[g+32>>2]=c[k+(h<<6)+32>>2];c[g+36>>2]=c[k+(h<<6)+36>>2];c[g+40>>2]=c[k+(h<<6)+40>>2];c[g+44>>2]=0;h=h+1|0;if((h|0)==(i|0))break;else g=g+48|0}}Zb[c[(c[f>>2]|0)+20>>2]&31](f,j,18364,1497453121,c[a+96>>2]|0)}}else c[e+64>>2]=0;k=c[a+128>>2]|0;c[e+60>>2]=k;if(k){k=zb[c[(c[f>>2]|0)+28>>2]&31](f,c[a+136>>2]|0)|0;c[e+68>>2]=k;if(k|0){j=c[a+128>>2]|0;k=Bb[c[(c[f>>2]|0)+16>>2]&63](f,16,j)|0;if((j|0)>0){g=c[a+136>>2]|0;h=c[k+8>>2]|0;i=0;while(1){c[h+12>>2]=c[g+(i<<4)+12>>2];b[h+6>>1]=b[g+(i<<4)+6>>1]|0;b[h+8>>1]=b[g+(i<<4)+8>>1]|0;b[h+10>>1]=b[g+(i<<4)+10>>1]|0;b[h>>1]=b[g+(i<<4)>>1]|0;b[h+2>>1]=b[g+(i<<4)+2>>1]|0;b[h+4>>1]=b[g+(i<<4)+4>>1]|0;i=i+1|0;if((i|0)==(j|0))break;else h=h+16|0}}else g=c[a+136>>2]|0;Zb[c[(c[f>>2]|0)+20>>2]&31](f,k,18387,1497453121,g)}}else c[e+68>>2]=0;c[e+76>>2]=c[a+144>>2];k=c[a+152>>2]|0;c[e+80>>2]=k;if(!k){c[e+72>>2]=0;return 18431}k=zb[c[(c[f>>2]|0)+28>>2]&31](f,c[a+160>>2]|0)|0;c[e+72>>2]=k;if(!k)return 18431;j=c[a+152>>2]|0;k=Bb[c[(c[f>>2]|0)+16>>2]&63](f,20,j)|0;if((j|0)>0){g=c[a+160>>2]|0;h=c[k+8>>2]|0;i=0;while(1){b[h+14>>1]=b[g+(i<<5)+6>>1]|0;b[h+16>>1]=b[g+(i<<5)+8>>1]|0;b[h+18>>1]=b[g+(i<<5)+10>>1]|0;b[h+8>>1]=b[g+(i<<5)>>1]|0;b[h+10>>1]=b[g+(i<<5)+2>>1]|0;b[h+12>>1]=b[g+(i<<5)+4>>1]|0;c[h>>2]=c[g+(i<<5)+12>>2];c[h+4>>2]=c[g+(i<<5)+16>>2];i=i+1|0;if((i|0)==(j|0))break;else h=h+20|0}}else g=c[a+160>>2]|0;Zb[c[(c[f>>2]|0)+20>>2]&31](f,k,18410,1497453121,g);return 18431}function Je(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0,m=0;if(!b)b=0;else b=(c[b+252>>2]&2|0)==0?0:b;c[a+64>>2]=0;c[a+64+4>>2]=0;c[a+64+8>>2]=0;c[a+64+12>>2]=0;c[a+64+16>>2]=0;c[a+64+20>>2]=0;c[a+64+24>>2]=0;c[a+64+28>>2]=0;c[a+144>>2]=0;c[a+144+4>>2]=0;c[a+144+8>>2]=0;c[a+144+12>>2]=0;c[a+144+16>>2]=0;c[a+144+20>>2]=0;c[a+144+24>>2]=0;c[a+144+28>>2]=0;if(!b){c[a>>2]=1065353216;c[a+4>>2]=0;c[a+4+4>>2]=0;c[a+4+8>>2]=0;c[a+4+12>>2]=0;c[a+20>>2]=1065353216;c[a+24>>2]=0;c[a+24+4>>2]=0;c[a+24+8>>2]=0;c[a+24+12>>2]=0;c[a+40>>2]=1065353216;c[a+44>>2]=0;c[a+44+4>>2]=0;c[a+44+8>>2]=0;c[a+44+12>>2]=0;c[a+44+16>>2]=0;c[a+240>>2]=0;c[a+128>>2]=0;c[a+128+4>>2]=0;c[a+128+8>>2]=0;c[a+128+12>>2]=0;c[a+96>>2]=1065353216;c[a+100>>2]=1065353216;c[a+104>>2]=1065353216;g[a+108>>2]=0.0;c[a+112>>2]=1065353216;c[a+116>>2]=1065353216;c[a+120>>2]=1065353216;g[a+124>>2]=0.0;b=a+176|0;e=b+60|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(e|0));a=a+236|0;g[a>>2]=0.0;return}else{e=b+4|0;c[a>>2]=c[e>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];e=b+20|0;c[a+16>>2]=c[e>>2];c[a+16+4>>2]=c[e+4>>2];c[a+16+8>>2]=c[e+8>>2];c[a+16+12>>2]=c[e+12>>2];e=b+36|0;c[a+32>>2]=c[e>>2];c[a+32+4>>2]=c[e+4>>2];c[a+32+8>>2]=c[e+8>>2];c[a+32+12>>2]=c[e+12>>2];e=b+52|0;c[a+48>>2]=c[e>>2];c[a+48+4>>2]=c[e+4>>2];c[a+48+8>>2]=c[e+8>>2];c[a+48+12>>2]=c[e+12>>2];e=b+404|0;k=+g[e>>2];l=b+408|0;j=k*+g[b+412>>2];i=k*+g[b+416>>2];g[a+128>>2]=k*+g[l>>2];g[a+132>>2]=j;g[a+136>>2]=i;g[a+140>>2]=0.0;c[a+240>>2]=b;m=b+604|0;c[a+96>>2]=c[m>>2];c[a+96+4>>2]=c[m+4>>2];c[a+96+8>>2]=c[m+8>>2];c[a+96+12>>2]=c[m+12>>2];c[a+112>>2]=c[l>>2];c[a+112+4>>2]=c[l+4>>2];c[a+112+8>>2]=c[l+8>>2];c[a+112+12>>2]=c[l+12>>2];l=b+372|0;c[a+176>>2]=c[l>>2];c[a+176+4>>2]=c[l+4>>2];c[a+176+8>>2]=c[l+8>>2];c[a+176+12>>2]=c[l+12>>2];l=b+388|0;c[a+192>>2]=c[l>>2];c[a+192+4>>2]=c[l+4>>2];c[a+192+8>>2]=c[l+8>>2];c[a+192+12>>2]=c[l+12>>2];i=+g[e>>2];j=i*+g[b+476>>2]*d;k=i*+g[b+480>>2]*d;g[a+208>>2]=i*+g[b+472>>2]*d;g[a+212>>2]=j;g[a+216>>2]=k;g[a+220>>2]=0.0;k=+g[b+488>>2];j=+g[b+492>>2];i=+g[b+496>>2];h=(k*+g[b+328>>2]+j*+g[b+344>>2]+i*+g[b+360>>2])*d;f=(k*+g[b+332>>2]+j*+g[b+348>>2]+i*+g[b+364>>2])*d;g[a+224>>2]=(+g[b+324>>2]*k+ +g[b+340>>2]*j+ +g[b+356>>2]*i)*d;g[a+228>>2]=h;g[a+232>>2]=f;a=a+236|0;g[a>>2]=0.0;return}}function Ke(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0.0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0,N=0;M=l;l=l+64|0;c[M+48>>2]=a;c[M+48+4>>2]=b;c[M+48+8>>2]=d;L=+g[a>>2];z=+g[b>>2];A=+g[a+4>>2];B=+g[b+4>>2];C=+g[a+8>>2];E=+g[b+8>>2];g[M>>2]=L-z;g[M+4>>2]=A-B;g[M+8>>2]=C-E;g[M+12>>2]=0.0;F=+g[d>>2];G=+g[d+4>>2];H=+g[d+8>>2];g[M+16>>2]=z-F;g[M+20>>2]=B-G;g[M+24>>2]=E-H;g[M+28>>2]=0.0;g[M+32>>2]=F-L;g[M+36>>2]=G-A;g[M+40>>2]=H-C;g[M+44>>2]=0.0;I=(A-B)*(E-H)-(C-E)*(B-G);J=(C-E)*(z-F)-(E-H)*(L-z);K=(B-G)*(L-z)-(A-B)*(z-F);if(K*K+(I*I+J*J)>0.0){k=0;x=-1.0;y=0;m=0;h=0;o=A-B;p=C-E;i=L-z;u=L;v=A;w=C}else{L=-1.0;l=M;return +L}while(1){if(u*(K*o-J*p)+v*(I*p-K*i)+(J*i-I*o)*w>0.0){n=c[5288+(y<<2)>>2]|0;N=c[M+48+(n<<2)>>2]|0;r=+g[N>>2];i=r-u;s=+g[N+4>>2];p=s-v;t=+g[N+8>>2];q=t-w;do if(i*i+p*p+q*q>0.0){o=-(u*i+v*p+w*q)/(i*i+p*p+q*q);if(o>=1.0){k=2;i=r*r+s*s+t*t;m=0;h=1065353216;break}if(!(o<=0.0)){h=(g[j>>2]=o,c[j>>2]|0);u=u+i*o;i=v+p*o;w=w+q*o;k=3;i=w*w+(u*u+i*i);m=(g[j>>2]=1.0-o,c[j>>2]|0);break}else{k=1;i=u*u+v*v+w*w;m=1065353216;h=0;break}}else i=-1.0;while(0);if(x<0.0|i>2]=(k&1|0?1<>2]=m;c[e+(n<<2)>>2]=h;g[e+(c[5288+(n<<2)>>2]<<2)>>2]=0.0}else i=x}else i=x;n=y+1|0;if((n|0)==3)break;N=c[M+48+(n<<2)>>2]|0;x=i;y=n;o=+g[M+(n<<4)+4>>2];p=+g[M+(n<<4)+8>>2];i=+g[M+(n<<4)>>2];u=+g[N>>2];v=+g[N+4>>2];w=+g[N+8>>2]}if(!(i<0.0)){L=i;l=M;return +L}w=+D(+(K*K+(I*I+J*J)));x=(I*+g[a>>2]+J*+g[a+4>>2]+K*+g[a+8>>2])/(K*K+(I*I+J*J));c[f>>2]=7;u=+g[b>>2]-I*x;t=+g[b+4>>2]-J*x;v=+g[b+8>>2]-K*x;E=+D(+((t*(z-F)-u*(B-G))*(t*(z-F)-u*(B-G))+(((B-G)*v-t*(E-H))*((B-G)*v-t*(E-H))+(u*(E-H)-v*(z-F))*(u*(E-H)-v*(z-F)))))/w;g[e>>2]=E;z=+g[d>>2]-I*x;v=+g[d+4>>2]-J*x;B=+g[d+8>>2]-K*x;L=+D(+((v*(F-L)-z*(G-A))*(v*(F-L)-z*(G-A))+(((G-A)*B-v*(H-C))*((G-A)*B-v*(H-C))+(z*(H-C)-B*(F-L))*(z*(H-C)-B*(F-L)))))/w;g[e+4>>2]=L;g[e+8>>2]=1.0-(L+E);L=K*x*K*x+(I*x*I*x+J*x*J*x);l=M;return +L}function Le(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,i=0.0,k=0.0,m=0.0,n=0.0,o=0.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,G=0,H=0,I=0;d=l;l=l+144|0;g[a+36>>2]=0.0;c[d+128>>2]=0;c[d+128+4>>2]=0;c[d+128+8>>2]=0;c[d+128+12>>2]=0;b=0;do{e=d+128+(b<<2)|0;g[e>>2]=1.0;A=c[a+28>>2]|0;I=c[A+4>>2]|0;c[d+80>>2]=I;F=c[A+20>>2]|0;c[d+80+4>>2]=F;C=c[A+36>>2]|0;c[d+80+8>>2]=C;g[d+80+12>>2]=0.0;H=c[A+8>>2]|0;c[d+80+16>>2]=H;E=c[A+24>>2]|0;c[d+80+20>>2]=E;B=c[A+40>>2]|0;c[d+80+24>>2]=B;g[d+80+28>>2]=0.0;G=c[A+12>>2]|0;c[d+80+32>>2]=G;D=c[A+28>>2]|0;c[d+80+36>>2]=D;z=c[A+44>>2]|0;c[d+80+40>>2]=z;g[d+80+44>>2]=0.0;f=c[a+32>>2]|0;y=c[f+4>>2]|0;c[d+32>>2]=y;v=c[f+20>>2]|0;c[d+32+4>>2]=v;s=c[f+36>>2]|0;c[d+32+8>>2]=s;g[d+32+12>>2]=0.0;x=c[f+8>>2]|0;c[d+32+16>>2]=x;u=c[f+24>>2]|0;c[d+32+20>>2]=u;r=c[f+40>>2]|0;c[d+32+24>>2]=r;g[d+32+28>>2]=0.0;w=c[f+12>>2]|0;c[d+32+32>>2]=w;t=c[f+28>>2]|0;c[d+32+36>>2]=t;h=c[f+44>>2]|0;c[d+32+40>>2]=h;g[d+32+44>>2]=0.0;p=+g[a+300>>2];m=p*(c[j>>2]=I,+g[j>>2]);i=+g[a+304>>2];m=m+i*(c[j>>2]=H,+g[j>>2]);k=+g[a+308>>2];m=m+k*(c[j>>2]=G,+g[j>>2]);q=p*(c[j>>2]=F,+g[j>>2]);q=q+i*(c[j>>2]=E,+g[j>>2]);q=q+k*(c[j>>2]=D,+g[j>>2]);p=p*(c[j>>2]=C,+g[j>>2]);i=p+i*(c[j>>2]=B,+g[j>>2]);p=+g[A+52>>2];o=+g[A+56>>2];n=+g[A+60>>2];n=i+k*(c[j>>2]=z,+g[j>>2])+n-n;g[d+16>>2]=m+p-p;g[d+16+4>>2]=q+o-o;g[d+16+8>>2]=n;g[d+16+12>>2]=0.0;n=+g[a+316>>2];o=n*(c[j>>2]=y,+g[j>>2]);q=+g[a+320>>2];o=o+q*(c[j>>2]=x,+g[j>>2]);p=+g[a+324>>2];o=o+p*(c[j>>2]=w,+g[j>>2]);m=n*(c[j>>2]=v,+g[j>>2]);m=m+q*(c[j>>2]=u,+g[j>>2]);m=m+p*(c[j>>2]=t,+g[j>>2]);n=n*(c[j>>2]=s,+g[j>>2]);q=n+q*(c[j>>2]=r,+g[j>>2]);n=+g[f+52>>2];k=+g[f+56>>2];i=+g[f+60>>2];i=q+p*(c[j>>2]=h,+g[j>>2])+i-i;g[d>>2]=o+n-n;g[d+4>>2]=m+k-k;g[d+8>>2]=i;g[d+12>>2]=0.0;h=c[a+28>>2]|0;f=c[a+32>>2]|0;Rg(a+48+(b*84|0)|0,d+80|0,d+32|0,d+16|0,d,d+128|0,h+456|0,+g[h+404>>2],f+456|0,+g[f+404>>2]);g[e>>2]=0.0;b=b+1|0}while((b|0)!=3);l=d;return}function Me(a,b,d){a=a|0;b=b|0;d=d|0;var f=0.0,i=0.0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+80|0;n=c[a+4>>2]|0;cc[c[(c[n>>2]|0)+16>>2]&3](n,r+28|0,r+24|0,r+20|0,r+16|0,r+12|0,r+8|0,r+4|0,r,b);n=(c[r+12>>2]|0)+(P(c[r+8>>2]|0,d)|0)|0;q=c[a+4>>2]|0;p=(c[r+20>>2]|0)==0;o=c[r+28>>2]|0;do if((c[r>>2]|0)==3){m=c[r+16>>2]|0;k=o+(P(m,e[n+4>>1]|0)|0)|0;if(p){i=+g[k+4>>2]*+g[q+8>>2];j=+g[k>>2]*+g[q+4>>2];f=+g[k+8>>2]}else{i=+h[k+8>>3]*+g[q+8>>2];j=+h[k>>3]*+g[q+4>>2];f=+h[k+16>>3]}f=f*+g[q+12>>2];g[r+32+32>>2]=j;g[r+32+36>>2]=i;g[r+32+40>>2]=f;g[r+32+44>>2]=0.0;k=o+(P(m,e[n+2>>1]|0)|0)|0;if(p){i=+g[k+4>>2]*+g[q+8>>2];j=+g[k>>2]*+g[q+4>>2];f=+g[k+8>>2]}else{i=+h[k+8>>3]*+g[q+8>>2];j=+h[k>>3]*+g[q+4>>2];f=+h[k+16>>3]}f=f*+g[q+12>>2];g[r+32+16>>2]=j;g[r+32+20>>2]=i;g[r+32+24>>2]=f;g[r+32+28>>2]=0.0;k=o+(P(m,e[n>>1]|0)|0)|0;if(p){i=+g[k+4>>2]*+g[q+8>>2];j=+g[k>>2]*+g[q+4>>2];f=+g[k+8>>2];break}else{i=+h[k+8>>3]*+g[q+8>>2];j=+h[k>>3]*+g[q+4>>2];f=+h[k+16>>3];break}}else{k=c[r+16>>2]|0;m=o+(P(k,c[n+8>>2]|0)|0)|0;if(p){i=+g[m+4>>2]*+g[q+8>>2];j=+g[m+8>>2]*+g[q+12>>2];g[r+32+32>>2]=+g[m>>2]*+g[q+4>>2];g[r+32+36>>2]=i;g[r+32+40>>2]=j;g[r+32+44>>2]=0.0;p=o+(P(k,c[n+4>>2]|0)|0)|0;j=+g[p+4>>2]*+g[q+8>>2];i=+g[p+8>>2]*+g[q+12>>2];g[r+32+16>>2]=+g[p>>2]*+g[q+4>>2];g[r+32+20>>2]=j;g[r+32+24>>2]=i;g[r+32+28>>2]=0.0;p=o+(P(k,c[n>>2]|0)|0)|0;i=+g[p+4>>2]*+g[q+8>>2];j=+g[p>>2]*+g[q+4>>2];f=+g[p+8>>2];break}else{i=+h[m+8>>3]*+g[q+8>>2];j=+h[m+16>>3]*+g[q+12>>2];g[r+32+32>>2]=+h[m>>3]*+g[q+4>>2];g[r+32+36>>2]=i;g[r+32+40>>2]=j;g[r+32+44>>2]=0.0;p=o+(P(k,c[n+4>>2]|0)|0)|0;j=+h[p+8>>3]*+g[q+8>>2];i=+h[p+16>>3]*+g[q+12>>2];g[r+32+16>>2]=+h[p>>3]*+g[q+4>>2];g[r+32+20>>2]=j;g[r+32+24>>2]=i;g[r+32+28>>2]=0.0;p=o+(P(k,c[n>>2]|0)|0)|0;i=+h[p+8>>3]*+g[q+8>>2];j=+h[p>>3]*+g[q+4>>2];f=+h[p+16>>3];break}}while(0);f=f*+g[q+12>>2];g[r+32>>2]=j;g[r+32+4>>2]=i;g[r+32+8>>2]=f;g[r+32+12>>2]=0.0;q=c[a+8>>2]|0;Vb[c[(c[q>>2]|0)+8>>2]&127](q,r+32|0,b,d);q=c[a+4>>2]|0;Ob[c[(c[q>>2]|0)+24>>2]&127](q,b);l=r;return}function Ne(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+32|0;c[b>>2]=9184;a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;c[b+12>>2]=-1;c[b+16>>2]=0;c[b+20>>2]=0;a[b+80>>0]=1;c[b+76>>2]=0;c[b+68>>2]=0;c[b+72>>2]=0;c[b+44>>2]=0;c[b+48>>2]=0;c[b+52>>2]=-1;c[b+56>>2]=0;c[b+60>>2]=0;a[b+172>>0]=1;c[b+168>>2]=0;c[b+160>>2]=0;c[b+164>>2]=0;a[b+153>>0]=0;a[b+154>>0]=1;a[b+152>>0]=((d|0)!=0^1)&1;g[b+100>>2]=0.0;c[b+104>>2]=0;c[b+124>>2]=0;c[b+108>>2]=1;c[b+112>>2]=0;c[b+116>>2]=10;c[b+120>>2]=1;c[b+128>>2]=0;c[b+132>>2]=0;g[b+136>>2]=0.0;if(d|0)n=0;else{c[6995]=(c[6995]|0)+1;d=sc(91)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}Li(d);n=c[b+160>>2]|0}c[b+96>>2]=d;c[b+148>>2]=0;c[b+140>>2]=0;c[b+144>>2]=0;c[b+84>>2]=0;c[b+84+4>>2]=0;c[b+84+8>>2]=0;a[o+16>>0]=1;c[o+12>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;if((n|0)<=1){if((n|0)!=1){if((c[b+164>>2]|0)<1){c[6995]=(c[6995]|0)+1;d=sc(39)|0;if(!d)m=0;else{c[(d+4+15&-16)+-4>>2]=d;m=d+4+15&-16}e=c[b+160>>2]|0;if((e|0)>0){d=0;do{pj(m+(d*20|0)|0,(c[b+168>>2]|0)+(d*20|0)|0);d=d+1|0}while((d|0)!=(e|0));e=c[b+160>>2]|0;if((e|0)>0){d=0;do{h=c[b+168>>2]|0;i=h+(d*20|0)+4|0;j=h+(d*20|0)+12|0;k=c[j>>2]|0;f=h+(d*20|0)+16|0;if(k|0){if(a[f>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[j>>2]=0}a[f>>0]=1;c[j>>2]=0;c[i>>2]=0;c[h+(d*20|0)+8>>2]=0;d=d+1|0}while((d|0)!=(e|0))}}d=c[b+168>>2]|0;if(d|0){if(a[b+172>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+168>>2]=0}a[b+172>>0]=1;c[b+168>>2]=m;c[b+164>>2]=1;d=n}else d=n;while(1){pj((c[b+168>>2]|0)+(d*20|0)|0,o);if(!d)break;else d=d+1|0}d=c[o+12>>2]|0;c[b+160>>2]=1;if(!d){l=o;return}if(a[o+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[o+12>>2]=0;l=o;return}}else{d=1;do{f=c[b+168>>2]|0;h=f+(d*20|0)+4|0;i=f+(d*20|0)+12|0;j=c[i>>2]|0;e=f+(d*20|0)+16|0;if(j|0){if(a[e>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[i>>2]=0}a[e>>0]=1;c[i>>2]=0;c[h>>2]=0;c[f+(d*20|0)+8>>2]=0;d=d+1|0}while((d|0)!=(n|0))}c[b+160>>2]=1;l=o;return}function Oe(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0;if(!(c[a+204>>2]&2)){c[a+68>>2]=c[b>>2];c[a+68+4>>2]=c[b+4>>2];c[a+68+8>>2]=c[b+8>>2];c[a+68+12>>2]=c[b+12>>2];c[a+84>>2]=c[b+16>>2];c[a+84+4>>2]=c[b+16+4>>2];c[a+84+8>>2]=c[b+16+8>>2];c[a+84+12>>2]=c[b+16+12>>2];c[a+100>>2]=c[b+32>>2];c[a+100+4>>2]=c[b+32+4>>2];c[a+100+8>>2]=c[b+32+8>>2];c[a+100+12>>2]=c[b+32+12>>2];c[a+116>>2]=c[b+48>>2];c[a+116+4>>2]=c[b+48+4>>2];c[a+116+8>>2]=c[b+48+8>>2];c[a+116+12>>2]=c[b+48+12>>2];d=a+20|0;e=b+16|0;f=a+36|0;h=b+32|0;i=a+52|0;j=b+48|0;k=a+4|0}else{c[a+68>>2]=c[a+4>>2];c[a+68+4>>2]=c[a+4+4>>2];c[a+68+8>>2]=c[a+4+8>>2];c[a+68+12>>2]=c[a+4+12>>2];c[a+84>>2]=c[a+20>>2];c[a+84+4>>2]=c[a+20+4>>2];c[a+84+8>>2]=c[a+20+8>>2];c[a+84+12>>2]=c[a+20+12>>2];c[a+100>>2]=c[a+36>>2];c[a+100+4>>2]=c[a+36+4>>2];c[a+100+8>>2]=c[a+36+8>>2];c[a+100+12>>2]=c[a+36+12>>2];c[a+116>>2]=c[a+52>>2];c[a+116+4>>2]=c[a+52+4>>2];c[a+116+8>>2]=c[a+52+8>>2];c[a+116+12>>2]=c[a+52+12>>2];d=a+20|0;e=b+16|0;f=a+36|0;h=b+32|0;i=a+52|0;j=b+48|0;k=a+4|0}c[a+132>>2]=c[a+372>>2];c[a+132+4>>2]=c[a+372+4>>2];c[a+132+8>>2]=c[a+372+8>>2];c[a+132+12>>2]=c[a+372+12>>2];c[a+148>>2]=c[a+388>>2];c[a+148+4>>2]=c[a+388+4>>2];c[a+148+8>>2]=c[a+388+8>>2];c[a+148+12>>2]=c[a+388+12>>2];c[k>>2]=c[b>>2];c[k+4>>2]=c[b+4>>2];c[k+8>>2]=c[b+8>>2];c[k+12>>2]=c[b+12>>2];c[d>>2]=c[e>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];c[d+12>>2]=c[e+12>>2];c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];w=+g[a+4>>2];q=+g[a+456>>2];v=+g[a+8>>2];o=+g[a+460>>2];u=+g[a+12>>2];m=+g[a+464>>2];t=+g[a+20>>2];s=+g[a+24>>2];r=+g[a+28>>2];p=+g[a+36>>2];n=+g[a+40>>2];l=+g[a+44>>2];g[a+324>>2]=w*w*q+v*v*o+u*u*m;g[a+328>>2]=w*q*t+v*o*s+u*m*r;g[a+332>>2]=w*q*p+v*o*n+u*m*l;g[a+336>>2]=0.0;g[a+340>>2]=w*q*t+v*o*s+u*m*r;g[a+344>>2]=t*q*t+s*o*s+r*m*r;g[a+348>>2]=q*t*p+o*s*n+m*r*l;g[a+352>>2]=0.0;g[a+356>>2]=w*q*p+v*o*n+u*m*l;g[a+360>>2]=t*q*p+s*o*n+r*m*l;g[a+364>>2]=p*q*p+n*o*n+l*m*l;g[a+368>>2]=0.0;return}function Pe(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,h=0.0,i=0,k=0.0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0;if(!(c[a>>2]|0)){c[a>>2]=d;c[d+32>>2]=0;return}f=c[b+40>>2]|0;if(!f)q=b;else{e=+g[d>>2]+ +g[d+16>>2];h=+g[d+4>>2]+ +g[d+20>>2];k=+g[d+8>>2]+ +g[d+24>>2];do{t=c[b+36>>2]|0;l=+C(+(e-(+g[t>>2]+ +g[t+16>>2])))+ +C(+(h-(+g[t+4>>2]+ +g[t+20>>2])))+ +C(+(k-(+g[t+8>>2]+ +g[t+24>>2])));b=c[b+36+((!(l<+C(+(e-(+g[f>>2]+ +g[f+16>>2])))+ +C(+(h-(+g[f+4>>2]+ +g[f+20>>2])))+ +C(+(k-(+g[f+8>>2]+ +g[f+24>>2]))))&1)<<2)>>2]|0;f=c[b+40>>2]|0}while((f|0)!=0);q=b}s=q+32|0;t=c[s>>2]|0;b=c[a+4>>2]|0;if(!b){c[6995]=(c[6995]|0)+1;b=sc(63)|0;if(!b)b=0;else{c[(b+4+15&-16)+-4>>2]=b;b=b+4+15&-16}f=b;i=f+44|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(i|0))}else c[a+4>>2]=0;c[b+32>>2]=t;c[b+36>>2]=0;n=b+40|0;c[n>>2]=0;o=q+16|0;f=c[(+g[d>>2]<+g[q>>2]?d:q)>>2]|0;c[b>>2]=f;i=c[(+g[d+16>>2]>+g[q+16>>2]?d+16|0:o)>>2]|0;c[b+16>>2]=i;r=c[(+g[d+4>>2]<+g[q+4>>2]?d:q)+4>>2]|0;c[b+4>>2]=r;m=c[(+g[d+20>>2]>+g[q+20>>2]?d+16|0:o)+4>>2]|0;c[b+20>>2]=m;p=c[(+g[d+8>>2]<+g[q+8>>2]?d:q)+8>>2]|0;c[b+8>>2]=p;o=c[(+g[d+24>>2]>+g[q+24>>2]?d+16|0:o)+8>>2]|0;c[b+24>>2]=o;if(!t){c[b+36>>2]=q;c[s>>2]=b;c[n>>2]=d;c[d+32>>2]=b;c[a>>2]=b;return}c[t+36+(((c[(c[s>>2]|0)+40>>2]|0)==(q|0)&1)<<2)>>2]=b;c[b+36>>2]=q;c[s>>2]=b;c[n>>2]=d;c[d+32>>2]=b;b=p;n=r;while(1){u=(c[j>>2]=f,+g[j>>2]);l=(c[j>>2]=b,+g[j>>2]);k=(c[j>>2]=i,+g[j>>2]);h=(c[j>>2]=m,+g[j>>2]);e=(c[j>>2]=o,+g[j>>2]);if(+g[t>>2]<=u){b=t+4|0;if((((+g[b>>2]<=(c[j>>2]=n,+g[j>>2])?+g[t+8>>2]<=l:0)?+g[t+16>>2]>=k:0)?+g[t+20>>2]>=h:0)?+g[t+24>>2]>=e:0){b=22;break}}else b=t+4|0;d=c[t+36>>2]|0;o=c[t+40>>2]|0;f=c[(+g[d>>2]<+g[o>>2]?d:o)>>2]|0;c[t>>2]=f;i=c[(+g[d+16>>2]>+g[o+16>>2]?d+16|0:o+16|0)>>2]|0;c[t+16>>2]=i;n=c[(+g[d+4>>2]<+g[o+4>>2]?d:o)+4>>2]|0;c[b>>2]=n;m=c[(+g[d+20>>2]>+g[o+20>>2]?d+16|0:o+16|0)+4>>2]|0;c[t+20>>2]=m;b=c[(+g[d+8>>2]<+g[o+8>>2]?d:o)+8>>2]|0;c[t+8>>2]=b;o=c[(+g[d+24>>2]>+g[o+24>>2]?d+16|0:o+16|0)+8>>2]|0;c[t+24>>2]=o;t=c[t+32>>2]|0;if(!t){b=22;break}}if((b|0)==22)return}function Qe(){if(a[22504]|0)return;if(!(Uz(22504)|0))return;c[6161]=0;c[6162]=-2147483648;c[6163]=-1082130432;g[6164]=0.0;c[6165]=1060716128;c[6166]=-1090087446;c[6167]=-1092290076;g[6168]=0.0;c[6169]=-1098022214;c[6170]=-1084636126;c[6171]=-1092290076;g[6172]=0.0;c[6173]=-1083901670;c[6174]=-2147483648;c[6175]=-1092290177;g[6176]=0.0;c[6177]=-1098022214;c[6178]=1062847522;c[6179]=-1092290043;g[6180]=0.0;c[6181]=1060716128;c[6182]=1057396202;c[6183]=-1092290076;g[6184]=0.0;c[6185]=1049461434;c[6186]=-1084636126;c[6187]=1055193605;g[6188]=0.0;c[6189]=-1086767520;c[6190]=-1090087446;c[6191]=1055193572;g[6192]=0.0;c[6193]=-1086767520;c[6194]=1057396202;c[6195]=1055193572;g[6196]=0.0;c[6197]=1049461434;c[6198]=1062847522;c[6199]=1055193572;g[6200]=0.0;c[6201]=1063581978;c[6202]=0;c[6203]=1055193471;g[6204]=0.0;c[6205]=-2147483648;c[6206]=0;c[6207]=1065353216;g[6208]=0.0;c[6209]=1054458864;c[6210]=-1096927567;c[6211]=-1084636042;g[6212]=0.0;c[6213]=-1104782626;c[6214]=-1090519208;c[6215]=-1084636042;g[6216]=0.0;c[6217]=1049007812;c[6218]=-1085334679;c[6219]=-1090087228;g[6220]=0.0;c[6221]=1054458864;c[6222]=1050556081;c[6223]=-1084636042;g[6224]=0.0;c[6225]=1062847505;c[6226]=-2147483648;c[6227]=-1090087262;g[6228]=0.0;c[6229]=-1090087362;c[6230]=-2147483648;c[6231]=-1084636076;g[6232]=0.0;c[6233]=-1087361736;c[6234]=-1090519141;c[6235]=-1090087262;g[6236]=0.0;c[6237]=-1104782626;c[6238]=1056964440;c[6239]=-1084636042;g[6240]=0.0;c[6241]=-1087361736;c[6242]=1056964507;c[6243]=-1090087262;g[6244]=0.0;c[6245]=1049007812;c[6246]=1062148969;c[6247]=-1090087228;g[6248]=0.0;c[6249]=1064532105;c[6250]=1050556148;c[6251]=0;g[6252]=0.0;c[6253]=1064532105;c[6254]=-1096927500;c[6255]=0;g[6256]=0.0;c[6257]=1058437413;c[6258]=-1085334595;c[6259]=0;g[6260]=0.0;c[6261]=0;c[6262]=-1082130432;c[6263]=0;g[6264]=0.0;c[6265]=-1089046235;c[6266]=-1085334595;c[6267]=0;g[6268]=0.0;c[6269]=-1082951543;c[6270]=-1096927500;c[6271]=-2147483648;g[6272]=0.0;c[6273]=-1082951543;c[6274]=1050556148;c[6275]=-2147483648;g[6276]=0.0;c[6277]=-1089046235;c[6278]=1062149053;c[6279]=-2147483648;g[6280]=0.0;c[6281]=-2147483648;c[6282]=1065353216;c[6283]=-2147483648;g[6284]=0.0;c[6285]=1058437413;c[6286]=1062149053;c[6287]=-2147483648;g[6288]=0.0;c[6289]=1060121912;c[6290]=-1090519141;c[6291]=1057396386;g[6292]=0.0;c[6293]=-1098475836;c[6294]=-1085334679;c[6295]=1057396420;g[6296]=0.0;c[6297]=-1084636143;c[6298]=0;c[6299]=1057396386;g[6300]=0.0;c[6301]=-1098475836;c[6302]=1062148969;c[6303]=1057396420;g[6304]=0.0;c[6305]=1060121912;c[6306]=1056964507;c[6307]=1057396386;g[6308]=0.0;c[6309]=1057396286;c[6310]=0;c[6311]=1062847572;g[6312]=0.0;c[6313]=1042701022;c[6314]=-1090519208;c[6315]=1062847606;g[6316]=0.0;c[6317]=-1093024784;c[6318]=-1096927567;c[6319]=1062847606;g[6320]=0.0;c[6321]=-1093024784;c[6322]=1050556081;c[6323]=1062847606;g[6324]=0.0;c[6325]=1042701022;c[6326]=1056964440;c[6327]=1062847606;g[6328]=0.0;return}function Re(a,b,d,e,f,h,i,j){a=a|0;b=b|0;d=d|0;e=+e;f=+f;h=+h;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0,V=0;V=l;l=l+32|0;z=+g[d>>2];B=+g[d+4>>2];A=+g[d+8>>2];v=+g[i>>2];t=+g[i+4>>2];r=+g[i+8>>2];q=+g[j>>2];s=+g[j+4>>2];u=+g[j+8>>2];K=1.0/+D(+((e-z)*(e-z)+(f-B)*(f-B)+(h-A)*(h-A)));L=(e-z)*K==0.0?999999984306749440.0:1.0/((e-z)*K);M=(f-B)*K==0.0?999999984306749440.0:1.0/((f-B)*K);N=(h-A)*K==0.0?999999984306749440.0:1.0/((h-A)*K);O=(z>e?e:z)+v;P=(B>f?f:B)+t;Q=(A>h?h:A)+r;R=(z>2]|0;a:do if((o|0)>0){x=c[a+96>>2]|0;k=0;w=0;while(1){k=k+1|0;c[V>>2]=c[x>>2];c[V+4>>2]=c[x+4>>2];c[V+8>>2]=c[x+8>>2];c[V+12>>2]=c[x+12>>2];p=x+16|0;c[V+16>>2]=c[p>>2];c[V+16+4>>2]=c[p+4>>2];c[V+16+8>>2]=c[p+8>>2];c[V+16+12>>2]=c[p+12>>2];g[V>>2]=+g[V>>2]-q;g[V+4>>2]=+g[V+4>>2]-s;g[V+8>>2]=+g[V+8>>2]-u;g[V+16>>2]=+g[V+16>>2]-v;g[V+20>>2]=+g[V+20>>2]-t;g[V+24>>2]=+g[V+24>>2]-r;if(!(O>+g[p>>2])?!(R<+g[x>>2]):0)m=1;else m=0;if(!(!(Q>+g[x+24>>2])?!(T<+g[x+8>>2]):0))m=0;if(((!(P>+g[x+20>>2])?!(S<+g[x+4>>2]|m^1):0)?(E=+g[d>>2],C=L*(+g[V+((L<0.0&1)<<4)>>2]-E),E=L*(+g[V+((L<0.0^1)<<4)>>2]-E),G=+g[d+4>>2],F=M*(+g[V+((M<0.0&1)<<4)+4>>2]-G),G=M*(+g[V+((M<0.0^1)<<4)+4>>2]-G),!(F>E|C>G)):0)?(H=F>C?F:C,y=G>2],I=N*(+g[V+((N<0.0&1)<<4)+8>>2]-J),J=N*(+g[V+((N<0.0^1)<<4)+8>>2]-J),!(I>y|H>J)):0){m=(J0.0?(I>H?I:H)<(h-A)*(h-A)*K+((e-z)*(e-z)*K+(f-B)*(f-B)*K):0;n=c[x+32>>2]|0;if(m&(n|0)==-1){Sb[c[(c[b>>2]|0)+8>>2]&127](b,c[x+36>>2]|0,c[x+40>>2]|0);n=1;o=c[a+56>>2]|0}else{p=(n|0)==-1;U=16}}else{n=c[x+32>>2]|0;p=(n|0)==-1;m=0;U=16}if((U|0)==16){U=0;n=p|m?1:n}m=n+w|0;if((m|0)>=(o|0))break a;x=x+(n<<6)|0;w=m;q=+g[j>>2];s=+g[j+4>>2];u=+g[j+8>>2];v=+g[i>>2];t=+g[i+4>>2];r=+g[i+8>>2]}}else k=0;while(0);if((c[6160]|0)>=(k|0)){l=V;return}c[6160]=k;l=V;return}function Se(a,b,d,e,f,h){a=a|0;b=b|0;d=+d;e=+e;f=+f;h=h|0;var i=0,j=0,k=0.0,l=0.0,m=0,n=0,o=0.0,p=0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0.0,y=0.0,z=0.0,A=0,B=0,C=0.0;a:while(1){if((b|0)>0){i=-1;j=0;do{do if(c[h+(j<<2)>>2]|0){if((i|0)!=-1?!(+g[a+(j<<4)>>2]*d+ +g[a+(j<<4)+4>>2]*e+ +g[a+(j<<4)+8>>2]*f>+g[a+(i<<4)>>2]*d+ +g[a+(i<<4)+4>>2]*e+ +g[a+(i<<4)+8>>2]*f):0)break;i=j}while(0);j=j+1|0}while((j|0)!=(b|0))}else i=-1;A=h+(i<<2)|0;if((c[A>>2]|0)==3){B=36;break}k=+D(+((e-f*0.0)*(e-f*0.0)+(f*0.0-d)*(f*0.0-d)+(d*0.0-e*0.0)*(d*0.0-e*0.0)));l=+D(+((d-e*0.0)*(d-e*0.0)+((e*0.0-f)*(e*0.0-f)+(f*0.0-d*0.0)*(f*0.0-d*0.0))));if(k>l){y=(d*0.0-e*0.0)*(1.0/k);z=(f*0.0-d)*(1.0/k);s=(e-f*0.0)*(1.0/k)}else{y=(d-e*0.0)*(1.0/l);z=(f*0.0-d*0.0)*(1.0/l);s=(e*0.0-f)*(1.0/l)}t=z*f-y*e;u=y*d-s*f;v=s*e-z*d;w=(i|0)==-1;r=0;j=-1;while(1){x=+(r|0);q=+G(+(x*.01745329238474369));o=+F(+(x*.01745329238474369));k=(s*q+t*o)*.02500000037252903+d;l=(z*q+u*o)*.02500000037252903+e;o=(y*q+v*o)*.02500000037252903+f;if((b|0)>0){m=-1;n=0;do{do if(c[h+(n<<2)>>2]|0){if((m|0)!=-1?!(k*+g[a+(n<<4)>>2]+l*+g[a+(n<<4)+4>>2]+o*+g[a+(n<<4)+8>>2]>k*+g[a+(m<<4)>>2]+l*+g[a+(m<<4)+4>>2]+o*+g[a+(m<<4)+8>>2]):0)break;m=n}while(0);n=n+1|0}while((n|0)!=(b|0))}else m=-1;if((j|0)==(i|0)&(m|0)==(i|0))break a;b:do if(!((j|0)==-1|(j|0)==(m|0))?x+-40.0<=x:0){if((b|0)>0)q=x+-40.0;else{k=x+-40.0;while(1){if((j|0)==(i|0)&w){i=-1;break a}k=k+5.0;if(!(k<=x))break b;else j=-1}}while(1){o=q*.01745329238474369;C=+G(+o);o=+F(+o);k=(s*C+t*o)*.02500000037252903+d;l=(z*C+u*o)*.02500000037252903+e;o=(y*C+v*o)*.02500000037252903+f;n=-1;p=0;do{do if(c[h+(p<<2)>>2]|0){if((n|0)!=-1?!(k*+g[a+(p<<4)>>2]+l*+g[a+(p<<4)+4>>2]+o*+g[a+(p<<4)+8>>2]>k*+g[a+(n<<4)>>2]+l*+g[a+(n<<4)+4>>2]+o*+g[a+(n<<4)+8>>2]):0)break;n=p}while(0);p=p+1|0}while((p|0)!=(b|0));if((j|0)==(i|0)&(n|0)==(i|0))break a;q=q+5.0;if(!(q<=x))break;else j=n}}while(0);r=r+45|0;if((r|0)>360)break;else j=m}c[A>>2]=0}if((B|0)==36)return i|0;c[h+(i<<2)>>2]=3;B=i;return B|0}function Te(b,d){b=b|0;d=+d;var e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0;m=c[b+472>>2]|0;Sb[c[(c[m>>2]|0)+16>>2]&127](m,b+344|0,0);m=c[b+472>>2]|0;xb[c[(c[m>>2]|0)+12>>2]&127](m)|0;Hj(b,d);m=c[b+348>>2]|0;if((m|0)>0){f=c[b+356>>2]|0;e=0;k=0;do{l=c[(c[f+(e<<2)>>2]|0)+444>>2]|0;k=(k|0)>(l|0)?k:l;e=e+1|0}while((e|0)!=(m|0));e=0;while(1){h=c[f+(e<<2)>>2]|0;if((c[h+912>>2]|0)>0){f=0;do{l=c[(c[h+920>>2]|0)+(f<<2)>>2]|0;Mb[c[(c[l>>2]|0)+8>>2]&15](l,+g[h+512>>2],k);f=f+1|0}while((f|0)<(c[h+912>>2]|0))}e=e+1|0;if((e|0)==(m|0))break;f=c[b+356>>2]|0}if((k|0)>0){h=0;do{e=0;do{i=c[(c[b+356>>2]|0)+(e<<2)>>2]|0;j=c[i+912>>2]|0;if((j|0)>0){f=0;do{l=c[(c[i+920>>2]|0)+(f<<2)>>2]|0;Kb[c[(c[l>>2]|0)+12>>2]&7](l,+g[i+512>>2],1.0);f=f+1|0}while((f|0)!=(j|0))}e=e+1|0}while((e|0)!=(m|0));h=h+1|0}while((h|0)!=(k|0));k=0}else k=0;do{l=c[(c[b+356>>2]|0)+(k<<2)>>2]|0;if((c[l+912>>2]|0)>0){e=0;do{f=c[(c[l+920>>2]|0)+(e<<2)>>2]|0;Jb[c[(c[f>>2]|0)+16>>2]&31](f,+g[l+512>>2]);f=c[l+920>>2]|0;h=c[f+(e<<2)>>2]|0;if(a[h+152>>0]|0){if(!h)j=f;else{c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);j=c[l+920>>2]|0}i=e+-1|0;f=c[l+912>>2]|0;a:do if((f|0)>0){h=c[j+(e<<2)>>2]|0;e=0;while(1){if((c[j+(e<<2)>>2]|0)==(h|0))break a;e=e+1|0;if((e|0)>=(f|0)){e=f;break}}}else e=f;while(0);if((f|0)>(e|0)){h=j+(e<<2)|0;e=c[h>>2]|0;c[h>>2]=c[j+(f+-1<<2)>>2];c[(c[l+920>>2]|0)+(f+-1<<2)>>2]=e;c[l+912>>2]=f+-1;e=i;f=f+-1|0}else e=i}else f=c[l+912>>2]|0;e=e+1|0}while((e|0)<(f|0))}k=k+1|0}while((k|0)!=(m|0))}m=c[b+472>>2]|0;Jb[c[(c[m>>2]|0)+28>>2]&31](m,+g[m+12>>2]*d);if((c[b+348>>2]|0)<=0){b=c[b+472>>2]|0;m=c[b>>2]|0;m=m+32|0;m=c[m>>2]|0;Ib[m&511](b);return}e=0;do{m=c[(c[b+356>>2]|0)+(e<<2)>>2]|0;Wh(m,m);e=e+1|0}while((e|0)<(c[b+348>>2]|0));b=c[b+472>>2]|0;m=c[b>>2]|0;m=m+32|0;m=c[m>>2]|0;Ib[m&511](b);return}function Ue(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0;I=l;l=l+544|0;if(!a){l=I;return}f=+g[b>>2];G=+g[d>>2]-f;k=+g[b+4>>2];B=+g[d+4>>2]-k;v=+g[d+8>>2]-+g[b+8>>2];w=1.0/+D(+(G*G+B*B+v*v));x=G*w==0.0?999999984306749440.0:1.0/(G*w);y=B*w==0.0?999999984306749440.0:1.0/(B*w);z=v*w==0.0?999999984306749440.0:1.0/(v*w);c[I+32>>2]=a;p=1;o=126;h=128;r=I+32|0;i=128;u=0;while(1){s=p+-1|0;t=c[r+(s<<2)>>2]|0;c[I>>2]=c[t>>2];c[I+4>>2]=c[t+4>>2];c[I+8>>2]=c[t+8>>2];c[I+12>>2]=c[t+12>>2];c[I+16>>2]=c[t+16>>2];c[I+16+4>>2]=c[t+16+4>>2];c[I+16+8>>2]=c[t+16+8>>2];c[I+16+12>>2]=c[t+16+12>>2];n=x*(+g[I+((x<0.0&1)<<4)>>2]-f);j=x*(+g[I+((x<0.0^1)<<4)>>2]-f);m=y*(+g[I+((y<0.0&1)<<4)+4>>2]-k);f=y*(+g[I+((y<0.0^1)<<4)+4>>2]-k);do if((!(m>j|n>f)?(C=m>n?m:n,A=f>2],E=z*(+g[I+((z<0.0&1)<<4)+8>>2]-F),F=z*(+g[I+((z<0.0^1)<<4)+8>>2]-F),!(E>A|C>F)):0)?((F0.0?(E>C?E:C)>2]|0)){Ob[c[(c[e>>2]|0)+12>>2]&127](e,t);p=s;d=r;a=u;break}if((s|0)>(o|0)){q=i<<1;if((i|0)<(q|0)){do if((h|0)<(q|0)){if(i){c[6995]=(c[6995]|0)+1;d=sc((i<<3|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}if((i|0)>0){a=0;do{c[d+(a<<2)>>2]=c[r+(a<<2)>>2];a=a+1|0}while((a|0)!=(i|0));if(!(u<<24>>24)){h=q;a=1;break}}else H=15}else{d=0;H=15}if((H|0)==15){H=0;if(u<<24>>24==0|(r|0)==0){h=q;a=1;break}}c[6996]=(c[6996]|0)+1;Cd(c[r+-4>>2]|0);h=q;a=1}else{d=r;a=u}while(0);Yk(d+(i<<2)|0,0,i<<2|0)|0}else{d=r;a=u}o=q+-2|0;i=q}else{d=r;a=u}c[d+(s<<2)>>2]=c[t+36>>2];c[d+(p<<2)>>2]=c[t+40>>2];p=p+1|0}else{p=s;d=r;a=u}while(0);if(!p)break;r=d;u=a;f=+g[b>>2];k=+g[b+4>>2]}if(a<<24>>24==0|(d|0)==0){l=I;return}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);l=I;return}function Ve(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0.0,k=0.0,l=0.0,m=0,n=0.0,o=0;o=c[a+192>>2]|0;n=+nb[c[(c[o>>2]|0)+48>>2]&15](o);o=c[a+772>>2]|0;if((o|0)>0){i=0;do{m=c[a+780>>2]|0;d=m+(i*104|0)+8|0;j=+g[b>>2]*+g[d>>2];g[d>>2]=j;d=m+(i*104|0)+12|0;k=+g[b+4>>2]*+g[d>>2];g[d>>2]=k;d=m+(i*104|0)+16|0;l=+g[b+8>>2]*+g[d>>2];g[d>>2]=l;d=m+(i*104|0)+24|0;g[d>>2]=+g[b>>2]*+g[d>>2];d=m+(i*104|0)+28|0;g[d>>2]=+g[b+4>>2]*+g[d>>2];d=m+(i*104|0)+32|0;g[d>>2]=+g[b+8>>2]*+g[d>>2];m=c[m+(i*104|0)+96>>2]|0;d=Ag(a+988|0,m)|0;a:do if(d){h=c[a+996>>2]|0;if((h|0)<=-1){d=c[a+988>>2]|0;break}if(h){e=0;while(1){f=c[d+32>>2]|0;e=e+1|0;if(!f)break a;if((e|0)>=(h|0)){d=f;break}else d=f}}}else d=0;while(0);g[m>>2]=j-n;g[m+4>>2]=k-n;g[m+8>>2]=l-n;g[m+12>>2]=0.0;g[m+16>>2]=n+j;g[m+20>>2]=n+k;g[m+24>>2]=n+l;g[m+28>>2]=0.0;Pe(a+988|0,d,m);i=i+1|0}while((i|0)!=(o|0))}Eg(a);d=c[a+988>>2]|0;if(d){o=c[a+192>>2]|0;k=+nb[c[(c[o>>2]|0)+48>>2]&15](o);n=+g[d+4>>2]-k;l=+g[d+8>>2]-k;g[a+952>>2]=+g[d>>2]-k;g[a+956>>2]=n;g[a+960>>2]=l;g[a+964>>2]=0.0;l=k+ +g[d+20>>2];n=k+ +g[d+24>>2];g[a+968>>2]=k+ +g[d+16>>2];g[a+972>>2]=l;g[a+976>>2]=n;g[a+980>>2]=0.0;d=c[a+188>>2]|0;if(d|0){o=c[a+744>>2]|0;m=c[o+32>>2]|0;Zb[c[(c[m>>2]|0)+16>>2]&31](m,d,a+952|0,a+968|0,c[o+36>>2]|0)}}else{c[a+952>>2]=0;c[a+952+4>>2]=0;c[a+952+8>>2]=0;c[a+952+12>>2]=0;c[a+952+16>>2]=0;c[a+952+20>>2]=0;c[a+952+24>>2]=0;c[a+952+28>>2]=0}e=c[a+792>>2]|0;if((e|0)<=0){Vf(a);return}f=c[a+800>>2]|0;d=0;do{m=c[f+(d*52|0)+24>>2]|0;o=c[f+(d*52|0)+28>>2]|0;k=+g[m+8>>2]-+g[o+8>>2];l=+g[m+12>>2]-+g[o+12>>2];n=+g[m+16>>2]-+g[o+16>>2];n=+D(+(k*k+l*l+n*n));g[f+(d*52|0)+32>>2]=n;g[f+(d*52|0)+44>>2]=n*n;d=d+1|0}while((d|0)!=(e|0));d=0;do{g[f+(d*52|0)+40>>2]=(+g[(c[f+(d*52|0)+24>>2]|0)+88>>2]+ +g[(c[f+(d*52|0)+28>>2]|0)+88>>2])/+g[(c[f+(d*52|0)+4>>2]|0)+4>>2];d=d+1|0}while((d|0)!=(e|0));Vf(a);return}function We(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0,m=0,n=0,o=0,p=0.0,q=0;o=l;l=l+144|0;i=+g[b>>2];j=+g[b+16>>2];p=i>2];if((p+g[a+20>>2]){l=o;return}m=i>j?b:b+16|0;if(+g[(+g[m>>2]>h?m:b+32|0)>>2]<+g[a+4>>2]){l=o;return}h=+g[b+8>>2];i=+g[b+24>>2];p=h>2];if((p+g[a+28>>2]){l=o;return}m=h>i?b+8|0:b+24|0;if(+g[(+g[m>>2]>j?m:b+40|0)>>2]<+g[a+12>>2]){l=o;return}h=+g[b+4>>2];i=+g[b+20>>2];p=h>2];if((p+g[a+24>>2]){l=o;return}m=h>i?b+4|0:b+20|0;if(+g[(+g[m>>2]>j?m:b+36|0)>>2]<+g[a+8>>2]){l=o;return}m=c[a+48>>2]|0;f=c[a+36>>2]|0;if((c[(c[f+4>>2]|0)+4>>2]|0)>=20){l=o;return}c[o+24+8>>2]=0;c[o+24+12>>2]=-1;c[o+24+16>>2]=1065353216;c[o+24+20>>2]=1065353216;c[o+24+24>>2]=1065353216;g[o+24+28>>2]=0.0;c[o+24+56>>2]=0;c[o+24>>2]=3924;c[o+24+4>>2]=1;c[o+24+60>>2]=c[b>>2];c[o+24+60+4>>2]=c[b+4>>2];c[o+24+60+8>>2]=c[b+8>>2];c[o+24+60+12>>2]=c[b+12>>2];c[o+24+76>>2]=c[b+16>>2];c[o+24+76+4>>2]=c[b+16+4>>2];c[o+24+76+8>>2]=c[b+16+8>>2];c[o+24+76+12>>2]=c[b+16+12>>2];c[o+24+92>>2]=c[b+32>>2];c[o+24+92+4>>2]=c[b+32+4>>2];c[o+24+92+8>>2]=c[b+32+8>>2];c[o+24+92+12>>2]=c[b+32+12>>2];c[o+24+48>>2]=c[a+56>>2];q=c[a+40>>2]|0;k=c[q+8>>2]|0;b=c[q+12>>2]|0;c[o>>2]=q;c[o+4>>2]=o+24;c[o+8>>2]=k;c[o+12>>2]=b;c[o+16>>2]=d;c[o+20>>2]=e;b=c[(c[m>>2]|0)+8>>2]|0;if(+g[(c[a+44>>2]|0)+32>>2]>0.0)k=Db[b&1](m,f,o,0,2)|0;else k=Db[b&1](m,f,o,c[a+64>>2]|0,1)|0;f=c[a+44>>2]|0;b=c[f+8>>2]|0;if((c[b+8>>2]|0)==(c[(c[a+40>>2]|0)+8>>2]|0)){c[f+8>>2]=o;Sb[c[(c[f>>2]|0)+8>>2]&127](f,d,e)}else{b=c[f+12>>2]|0;c[f+12>>2]=o;Sb[c[(c[f>>2]|0)+12>>2]&127](f,d,e)}Zb[c[(c[k>>2]|0)+8>>2]&31](k,c[a+36>>2]|0,o,c[a+52>>2]|0,c[a+44>>2]|0);q=c[a+44>>2]|0;c[((c[(c[q+8>>2]|0)+8>>2]|0)==(c[(c[a+40>>2]|0)+8>>2]|0)?q+8|0:q+12|0)>>2]=b;Ib[c[c[k>>2]>>2]&511](k);Ob[c[(c[m>>2]|0)+60>>2]&127](m,k);c[o+24>>2]=7472;b=c[o+24+56>>2]|0;if(b|0?(Ib[c[c[b>>2]>>2]&511](b),n=c[o+24+56>>2]|0,n|0):0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}l=o;return}function Xe(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0;h=l;l=l+48|0;c[b+8>>2]=0;c[b+12>>2]=-1;g[b+16>>2]=0.0;c[b>>2]=7272;c[b+52>>2]=d;c[b+4>>2]=21;if(xb[c[(c[d>>2]|0)+40>>2]&127](d)|0)Sb[c[(c[d>>2]|0)+48>>2]&127](d,b+20|0,b+36|0);else{d=h+32+4|0;c[d>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;g[h+32>>2]=1.0;Sb[c[(c[b>>2]|0)+68>>2]&127](h+16|0,b,h+32|0);g[b+36>>2]=+g[h+16>>2]+ +g[b+16>>2];g[h+32>>2]=-1.0;Sb[c[(c[b>>2]|0)+68>>2]&127](h,b,h+32|0);c[h+16>>2]=c[h>>2];c[h+16+4>>2]=c[h+4>>2];c[h+16+8>>2]=c[h+8>>2];c[h+16+12>>2]=c[h+12>>2];g[b+20>>2]=+g[h+16>>2]-+g[b+16>>2];c[h+32>>2]=0;c[h+32+4>>2]=0;c[h+32+8>>2]=0;c[h+32+12>>2]=0;g[d>>2]=1.0;Sb[c[(c[b>>2]|0)+68>>2]&127](h+16|0,b,h+32|0);g[b+40>>2]=+g[h+16+4>>2]+ +g[b+16>>2];g[d>>2]=-1.0;Sb[c[(c[b>>2]|0)+68>>2]&127](h,b,h+32|0);c[h+16>>2]=c[h>>2];c[h+16+4>>2]=c[h+4>>2];c[h+16+8>>2]=c[h+8>>2];c[h+16+12>>2]=c[h+12>>2];g[b+24>>2]=+g[h+16+4>>2]-+g[b+16>>2];c[h+32>>2]=0;c[h+32+4>>2]=0;c[h+32+8>>2]=0;c[h+32+12>>2]=0;g[h+32+8>>2]=1.0;Sb[c[(c[b>>2]|0)+68>>2]&127](h+16|0,b,h+32|0);g[b+44>>2]=+g[h+16+8>>2]+ +g[b+16>>2];g[h+32+8>>2]=-1.0;Sb[c[(c[b>>2]|0)+68>>2]&127](h,b,h+32|0);c[h+16>>2]=c[h>>2];c[h+16+4>>2]=c[h+4>>2];c[h+16+8>>2]=c[h+8>>2];c[h+16+12>>2]=c[h+12>>2];g[b+28>>2]=+g[h+16+8>>2]-+g[b+16>>2]}c[b>>2]=7120;c[b+56>>2]=0;c[b+60>>2]=0;a[b+64>>0]=e&1;a[b+65>>0]=0;c[b+4>>2]=21;if(!f){l=h;return}c[6995]=(c[6995]|0)+1;d=sc(191)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}c[d+52>>2]=287;a[d+60>>0]=0;a[d+80>>0]=1;c[d+76>>2]=0;c[d+68>>2]=0;c[d+72>>2]=0;a[d+100>>0]=1;c[d+96>>2]=0;c[d+88>>2]=0;c[d+92>>2]=0;a[d+120>>0]=1;c[d+116>>2]=0;c[d+108>>2]=0;c[d+112>>2]=0;a[d+140>>0]=1;c[d+136>>2]=0;c[d+128>>2]=0;c[d+132>>2]=0;c[d+144>>2]=0;a[d+164>>0]=1;c[d+160>>2]=0;c[d+152>>2]=0;c[d+156>>2]=0;c[d+168>>2]=0;c[d+4>>2]=-8388609;c[d+8>>2]=-8388609;c[d+12>>2]=-8388609;g[d+16>>2]=0.0;c[d+20>>2]=2139095039;c[d+24>>2]=2139095039;c[d+28>>2]=2139095039;g[d+32>>2]=0.0;c[d>>2]=8324;c[b+56>>2]=d;dd(d,c[b+52>>2]|0,(a[b+64>>0]|0)!=0,b+20|0,b+36|0);a[b+65>>0]=1;l=h;return}function Ye(a,b,d,e,f){a=a|0;b=b|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;if(!b)if(!e){if(f|0){c[f>>2]=(a>>>0)%(d>>>0);c[f+4>>2]=0}e=0;f=(a>>>0)/(d>>>0)>>>0;return (A=e,f)|0}else{if(!f){e=0;f=0;return (A=e,f)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;e=0;f=0;return (A=e,f)|0}do if(d){if(e|0){h=(S(e|0)|0)-(S(b|0)|0)|0;if(h>>>0<=31){n=h+1|0;i=a>>>((h+1|0)>>>0)&h-31>>31|b<<31-h;m=b>>>((h+1|0)>>>0)&h-31>>31;g=0;h=a<<31-h;break}if(!f){e=0;f=0;return (A=e,f)|0}c[f>>2]=a|0;c[f+4>>2]=b|b&0;e=0;f=0;return (A=e,f)|0}if(d-1&d|0){h=(S(d|0)|0)+33-(S(b|0)|0)|0;n=h;i=32-h-1>>31&b>>>((h-32|0)>>>0)|(b<<32-h|a>>>(h>>>0))&h-32>>31;m=h-32>>31&b>>>(h>>>0);g=a<<64-h&32-h>>31;h=(b<<64-h|a>>>((h-32|0)>>>0))&32-h>>31|a<<32-h&h-33>>31;break}if(f|0){c[f>>2]=d-1&a;c[f+4>>2]=0}if((d|0)==1){e=b|b&0;f=a|0|0;return (A=e,f)|0}else{f=tq(d|0)|0;e=b>>>(f>>>0)|0;f=b<<32-f|a>>>(f>>>0)|0;return (A=e,f)|0}}else{if(!e){if(f|0){c[f>>2]=(b>>>0)%(d>>>0);c[f+4>>2]=0}e=0;f=(b>>>0)/(d>>>0)>>>0;return (A=e,f)|0}if(!a){if(f|0){c[f>>2]=0;c[f+4>>2]=(b>>>0)%(e>>>0)}d=0;f=(b>>>0)/(e>>>0)>>>0;return (A=d,f)|0}if(!(e-1&e)){if(f|0){c[f>>2]=a|0;c[f+4>>2]=e-1&b|b&0}d=0;f=b>>>((tq(e|0)|0)>>>0);return (A=d,f)|0}h=(S(e|0)|0)-(S(b|0)|0)|0;if(h>>>0<=30){n=h+1|0;i=b<<31-h|a>>>((h+1|0)>>>0);m=b>>>((h+1|0)>>>0);g=0;h=a<<31-h;break}if(!f){e=0;f=0;return (A=e,f)|0}c[f>>2]=a|0;c[f+4>>2]=b|b&0;e=0;f=0;return (A=e,f)|0}while(0);if(!n){j=h;b=m;a=0;h=0}else{k=Ow(d|0|0,e|e&0|0,-1,-1)|0;l=A;j=h;b=m;a=n;h=0;do{p=j;j=g>>>31|j<<1;g=h|g<<1;p=i<<1|p>>>31|0;o=i>>>31|b<<1|0;sw(k|0,l|0,p|0,o|0)|0;n=A;m=n>>31|((n|0)<0?-1:0)<<1;h=m&1;i=sw(p|0,o|0,m&(d|0)|0,(((n|0)<0?-1:0)>>31|((n|0)<0?-1:0)<<1)&(e|e&0)|0)|0;b=A;a=a-1|0}while((a|0)!=0);a=0}if(f|0){c[f>>2]=i;c[f+4>>2]=b}o=(g|0)>>>31|j<<1|(0<<1|g>>>31)&0|a;p=(g<<1|0>>>31)&-2|h;return (A=o,p)|0}function Ze(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0;j=l;l=l+64|0;k=(a[b+76>>0]|0)!=0;i=k?e:d;d=k?d:e;e=c[d+4>>2]|0;if(((c[e+4>>2]|0)+-21|0)>>>0>=9){l=j;return}if((c[(c[i+4>>2]|0)+4>>2]|0)>=20){l=j;return}m=+nb[c[(c[e>>2]|0)+48>>2]&15](e);c[h+4>>2]=c[b+72>>2];c[b+44>>2]=i;c[b+48>>2]=d;c[b+60>>2]=f;g[b+64>>2]=m;c[b+52>>2]=h;k=c[d+12>>2]|0;B=+g[k>>2];A=+g[k+16>>2];z=+g[k+32>>2];y=+g[k+4>>2];x=+g[k+20>>2];w=+g[k+36>>2];s=+g[k+8>>2];q=+g[k+24>>2];o=+g[k+40>>2];v=-+g[k+48>>2];u=-+g[k+52>>2];t=-+g[k+56>>2];k=c[i+12>>2]|0;K=+g[k>>2];J=+g[k+16>>2];I=+g[k+32>>2];H=+g[k+4>>2];G=+g[k+20>>2];F=+g[k+36>>2];E=+g[k+8>>2];D=+g[k+24>>2];C=+g[k+40>>2];r=+g[k+48>>2];p=+g[k+52>>2];n=+g[k+56>>2];g[j>>2]=B*K+A*J+z*I;g[j+4>>2]=B*H+A*G+z*F;g[j+8>>2]=B*E+A*D+z*C;g[j+12>>2]=0.0;g[j+16>>2]=y*K+x*J+w*I;g[j+20>>2]=y*H+x*G+w*F;g[j+24>>2]=y*E+x*D+w*C;g[j+28>>2]=0.0;g[j+32>>2]=s*K+q*J+o*I;g[j+36>>2]=s*H+q*G+o*F;g[j+40>>2]=s*E+q*D+o*C;g[j+44>>2]=0.0;g[j+48>>2]=B*v+A*u+z*t+(B*r+A*p+z*n);g[j+52>>2]=y*v+x*u+w*t+(y*r+x*p+w*n);g[j+56>>2]=s*v+q*u+o*t+(s*r+q*p+o*n);g[j+60>>2]=0.0;k=c[(c[b+44>>2]|0)+4>>2]|0;Vb[c[(c[k>>2]|0)+8>>2]&127](k,j,b+12|0,b+28|0);m=+g[h+32>>2]+m;g[b+28>>2]=m+ +g[b+28>>2];g[b+32>>2]=m+ +g[b+32>>2];g[b+36>>2]=m+ +g[b+36>>2];g[b+12>>2]=+g[b+12>>2]-m;g[b+16>>2]=+g[b+16>>2]-m;g[b+20>>2]=+g[b+20>>2]-m;k=c[b+72>>2]|0;f=c[d+8>>2]|0;c[k+772>>2]=c[i+8>>2];c[k+776>>2]=f;Vb[c[(c[e>>2]|0)+64>>2]&127](e,b+8|0,b+12|0,b+28|0);e=c[h+4>>2]|0;do if(c[e+780>>2]|0){f=c[e+772>>2]|0;i=c[(c[h+8>>2]|0)+8>>2]|0;d=c[(c[h+12>>2]|0)+8>>2]|0;if((f|0)==(i|0)){af(e,f+4|0,d+4|0);break}else{af(e,d+4|0,i+4|0);break}}while(0);c[b+44>>2]=0;c[b+48>>2]=0;l=j;return}function _e(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0;k=l;l=l+128|0;a=c[a+20>>2]|0;n=+g[a+952>>2];x=+g[a+956>>2];v=+g[a+960>>2];w=+g[a+968>>2];f=+g[a+972>>2];i=+g[a+976>>2];z=+g[b>>2];m=+g[b+4>>2];p=v*+g[b+8>>2];q=+g[b+16>>2];r=+g[b+20>>2];t=v*+g[b+24>>2];u=+g[b+32>>2];o=+g[b+36>>2];s=+g[b+40>>2];y=+g[b+48>>2];j=+g[b+52>>2];h=+g[b+56>>2];g[k>>2]=n*z+x*m+p+y;g[k+4>>2]=n*q+x*r+t+j;g[k+8>>2]=n*u+x*o+v*s+h;g[k+12>>2]=0.0;g[k+16>>2]=w*z+x*m+p+y;g[k+20>>2]=w*q+x*r+t+j;g[k+24>>2]=w*u+x*o+v*s+h;g[k+28>>2]=0.0;g[k+32>>2]=w*z+f*m+p+y;g[k+36>>2]=w*q+f*r+t+j;g[k+40>>2]=w*u+f*o+v*s+h;g[k+44>>2]=0.0;g[k+48>>2]=n*z+f*m+p+y;g[k+52>>2]=n*q+f*r+t+j;g[k+56>>2]=n*u+f*o+v*s+h;g[k+60>>2]=0.0;v=+g[b>>2];u=+g[b+4>>2];t=i*+g[b+8>>2];r=+g[b+16>>2];q=+g[b+20>>2];p=i*+g[b+24>>2];m=+g[b+32>>2];g[k+64>>2]=n*v+x*u+t+y;g[k+68>>2]=n*r+x*q+p+j;g[k+72>>2]=n*m+x*o+i*s+h;g[k+76>>2]=0.0;h=+g[b+36>>2];i=i*+g[b+40>>2];s=+g[b+48>>2];o=+g[b+52>>2];j=+g[b+56>>2];g[k+80>>2]=w*v+x*u+t+s;g[k+84>>2]=w*r+x*q+p+o;g[k+88>>2]=w*m+x*h+i+j;g[k+92>>2]=0.0;g[k+96>>2]=w*v+f*u+t+s;g[k+100>>2]=w*r+f*q+p+o;g[k+104>>2]=w*m+f*h+i+j;g[k+108>>2]=0.0;g[k+112>>2]=n*v+f*u+t+s;g[k+116>>2]=n*r+f*q+p+o;g[k+120>>2]=n*m+f*h+i+j;g[k+124>>2]=0.0;c[e>>2]=c[k>>2];c[e+4>>2]=c[k+4>>2];c[e+8>>2]=c[k+8>>2];c[e+12>>2]=c[k+12>>2];c[d>>2]=c[k>>2];c[d+4>>2]=c[k+4>>2];c[d+8>>2]=c[k+8>>2];c[d+12>>2]=c[k+12>>2];a=1;do{f=+g[k+(a<<4)>>2];if(f<+g[d>>2])g[d>>2]=f;h=+g[k+(a<<4)+4>>2];if(h<+g[d+4>>2])g[d+4>>2]=h;i=+g[k+(a<<4)+8>>2];if(i<+g[d+8>>2])g[d+8>>2]=i;j=+g[k+(a<<4)+12>>2];if(j<+g[d+12>>2])g[d+12>>2]=j;if(+g[e>>2]>2]=f;if(+g[e+4>>2]>2]=h;if(+g[e+8>>2]>2]=i;if(+g[e+12>>2]>2]=j;a=a+1|0}while((a|0)!=8);l=k;return}function $e(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;var f=0,h=0.0,i=0.0,j=0.0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0.0,y=0.0,z=0;n=l;l=l+192|0;m=c[(c[a+4>>2]|0)+772>>2]|0;k=c[(c[a+8>>2]|0)+8>>2]|0;y=+g[d>>2];h=+g[b>>2]*e+y;x=+g[d+4>>2];i=+g[b+4>>2]*e+x;o=+g[d+8>>2];j=+g[b+8>>2]*e+o;w=c[(c[a+12>>2]|0)+8>>2]|0;f=(m|0)!=(k|0)?w:m;w=(m|0)!=(k|0)?k:w;v=h-+g[f+52>>2];u=i-+g[f+56>>2];t=j-+g[f+60>>2];s=v*+g[f+8>>2]+u*+g[f+24>>2]+t*+g[f+40>>2];r=v*+g[f+12>>2]+u*+g[f+28>>2]+t*+g[f+44>>2];y=y-+g[w+52>>2];x=x-+g[w+56>>2];o=o-+g[w+60>>2];q=y*+g[w+4>>2]+x*+g[w+20>>2]+o*+g[w+36>>2];p=y*+g[w+8>>2]+x*+g[w+24>>2]+o*+g[w+40>>2];o=y*+g[w+12>>2]+x*+g[w+28>>2]+o*+g[w+44>>2];g[n>>2]=v*+g[f+4>>2]+u*+g[f+20>>2]+t*+g[f+36>>2];g[n+4>>2]=s;g[n+8>>2]=r;g[n+12>>2]=0.0;g[n+16>>2]=q;g[n+20>>2]=p;g[n+24>>2]=o;g[n+28>>2]=0.0;c[n+64>>2]=c[b>>2];c[n+64+4>>2]=c[b+4>>2];c[n+64+8>>2]=c[b+8>>2];c[n+64+12>>2]=c[b+12>>2];g[n+80>>2]=e;c[n+84>>2]=0;c[n+84+4>>2]=0;c[n+84+8>>2]=0;c[n+84+12>>2]=0;b=n+116|0;f=b+44|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(f|0));g[n+48>>2]=h;g[n+52>>2]=i;g[n+56>>2]=j;g[n+60>>2]=0.0;c[n+32>>2]=c[d>>2];c[n+32+4>>2]=c[d+4>>2];c[n+32+8>>2]=c[d+8>>2];c[n+32+12>>2]=c[d+12>>2];b=c[a+16>>2]|0;f=c[a+20>>2]|0;if((m|0)!=(k|0)){c[n+100>>2]=f;z=a+28|0;d=b;w=a+24|0;b=f;f=c[z>>2]|0;z=n+104|0;c[z>>2]=d;z=n+108|0;c[z>>2]=f;w=c[w>>2]|0;z=n+112|0;c[z>>2]=w;z=(m|0)!=(k|0)?a+12|0:a+8|0;z=c[z>>2]|0;m=(m|0)!=(k|0)?a+8|0:a+12|0;m=c[m>>2]|0;k=a+36|0;k=c[k>>2]|0;a=c[k>>2]|0;a=a+12|0;a=c[a>>2]|0;+ub[a&1](k,n,z,b,f,m,d,w);l=n;return}else{c[n+100>>2]=b;d=a+24|0;w=f;z=a+28|0;f=b;d=c[d>>2]|0;b=n+104|0;c[b>>2]=w;b=n+108|0;c[b>>2]=d;z=c[z>>2]|0;b=n+112|0;c[b>>2]=z;b=(m|0)!=(k|0)?a+12|0:a+8|0;b=c[b>>2]|0;m=(m|0)!=(k|0)?a+8|0:a+12|0;m=c[m>>2]|0;k=a+36|0;k=c[k>>2]|0;a=c[k>>2]|0;a=a+12|0;a=c[a>>2]|0;+ub[a&1](k,n,b,f,d,m,w,z);l=n;return}}function af(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0;e=c[a+780>>2]|0;if((e|0)<=0)return;do{j=e;e=e+-1|0;p=+g[a+4+(e*192|0)>>2];q=+g[a+4+(e*192|0)+4>>2];f=+g[a+4+(e*192|0)+8>>2];o=p*+g[b>>2]+q*+g[b+4>>2]+f*+g[b+8>>2]+ +g[b+48>>2];m=p*+g[b+16>>2]+q*+g[b+20>>2]+f*+g[b+24>>2]+ +g[b+52>>2];f=p*+g[b+32>>2]+q*+g[b+36>>2]+f*+g[b+40>>2]+ +g[b+56>>2];g[a+4+(e*192|0)+48>>2]=o;g[a+4+(e*192|0)+52>>2]=m;g[a+4+(e*192|0)+56>>2]=f;g[a+4+(e*192|0)+60>>2]=0.0;q=+g[a+4+(e*192|0)+16>>2];p=+g[a+4+(e*192|0)+20>>2];h=+g[a+4+(e*192|0)+24>>2];n=q*+g[d>>2]+p*+g[d+4>>2]+h*+g[d+8>>2]+ +g[d+48>>2];l=q*+g[d+16>>2]+p*+g[d+20>>2]+h*+g[d+24>>2]+ +g[d+52>>2];h=q*+g[d+32>>2]+p*+g[d+36>>2]+h*+g[d+40>>2]+ +g[d+56>>2];g[a+4+(e*192|0)+32>>2]=n;g[a+4+(e*192|0)+36>>2]=l;g[a+4+(e*192|0)+40>>2]=h;g[a+4+(e*192|0)+44>>2]=0.0;g[a+4+(e*192|0)+80>>2]=(o-n)*+g[a+4+(e*192|0)+64>>2]+(m-l)*+g[a+4+(e*192|0)+68>>2]+(f-h)*+g[a+4+(e*192|0)+72>>2];i=a+4+(e*192|0)+156|0;c[i>>2]=(c[i>>2]|0)+1}while((j|0)>1);e=c[a+780>>2]|0;if((e|0)<=0)return;j=e;do{i=j;j=j+-1|0;d=a+4+(j*192|0)|0;f=+g[a+4+(j*192|0)+80>>2];h=+g[a+784>>2];if(!(f<=h)){b=e+-1|0;if((b|0)==(j|0))k=12;else{gi(d|0,a+4+(b*192|0)|0,192)|0;c[a+4+(b*192|0)+156>>2]=0;c[a+4+(b*192|0)+116>>2]=0;c[a+4+(b*192|0)+116+4>>2]=0;c[a+4+(b*192|0)+116+8>>2]=0;c[a+4+(b*192|0)+116+12>>2]=0;c[a+4+(b*192|0)+116+16>>2]=0;e=c[a+780>>2]|0;k=12}}else{o=+g[a+4+(j*192|0)+32>>2]-(+g[a+4+(j*192|0)+48>>2]-+g[a+4+(j*192|0)+64>>2]*f);p=+g[a+4+(j*192|0)+36>>2]-(+g[a+4+(j*192|0)+52>>2]-f*+g[a+4+(j*192|0)+68>>2]);q=+g[a+4+(j*192|0)+40>>2]-(+g[a+4+(j*192|0)+56>>2]-f*+g[a+4+(j*192|0)+72>>2]);if(o*o+p*p+q*q>h*h){b=e+-1|0;if((b|0)==(j|0))k=12;else{gi(d|0,a+4+(b*192|0)|0,192)|0;c[a+4+(b*192|0)+156>>2]=0;c[a+4+(b*192|0)+116>>2]=0;c[a+4+(b*192|0)+116+4>>2]=0;c[a+4+(b*192|0)+116+8>>2]=0;c[a+4+(b*192|0)+116+12>>2]=0;c[a+4+(b*192|0)+116+16>>2]=0;e=c[a+780>>2]|0;k=12}}}if((k|0)==12){k=0;e=e+-1|0;c[a+780>>2]=e}}while((i|0)>1);return} +function Gc(b,d){b=b|0;d=+d;var e=0,f=0.0,h=0,i=0,j=0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0;s=l;l=l+96|0;p=c[b+128>>2]|0;if(!p){l=s;return}e=c[b+8>>2]|0;if((e|0)<(p|0)){if((c[b+12>>2]|0)<(p|0)){c[6995]=(c[6995]|0)+1;h=sc((p<<4|3)+16|0)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}i=c[b+8>>2]|0;if((i|0)>0){h=0;do{n=j+(h<<4)|0;t=(c[b+16>>2]|0)+(h<<4)|0;c[n>>2]=c[t>>2];c[n+4>>2]=c[t+4>>2];c[n+8>>2]=c[t+8>>2];c[n+12>>2]=c[t+12>>2];h=h+1|0}while((h|0)!=(i|0))}h=c[b+16>>2]|0;if(h|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=j;c[b+12>>2]=p;h=b+16|0}else h=b+16|0;do{t=(c[h>>2]|0)+(e<<4)|0;c[t>>2]=c[s+48>>2];c[t+4>>2]=c[s+48+4>>2];c[t+8>>2]=c[s+48+8>>2];c[t+12>>2]=c[s+48+12>>2];e=e+1|0}while((e|0)!=(p|0))}c[b+8>>2]=p;e=c[b+28>>2]|0;if((e|0)<(p|0)){if((c[b+32>>2]|0)<(p|0)){c[6995]=(c[6995]|0)+1;h=sc((p<<4|3)+16|0)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}i=c[b+28>>2]|0;if((i|0)>0){h=0;do{t=j+(h<<4)|0;n=(c[b+36>>2]|0)+(h<<4)|0;c[t>>2]=c[n>>2];c[t+4>>2]=c[n+4>>2];c[t+8>>2]=c[n+8>>2];c[t+12>>2]=c[n+12>>2];h=h+1|0}while((h|0)!=(i|0))}h=c[b+36>>2]|0;if(h|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=j;c[b+32>>2]=p;h=b+36|0}else h=b+36|0;do{t=(c[h>>2]|0)+(e<<4)|0;c[t>>2]=c[s+48>>2];c[t+4>>2]=c[s+48+4>>2];c[t+8>>2]=c[s+48+8>>2];c[t+12>>2]=c[s+48+12>>2];e=e+1|0}while((e|0)!=(p|0))}c[b+28>>2]=p;n=c[b+48>>2]|0;if((n|0)<(p|0)){if((c[b+52>>2]|0)<(p|0)){c[6995]=(c[6995]|0)+1;e=sc((p<<2|3)+16|0)|0;if(!e)j=0;else{c[(e+4+15&-16)+-4>>2]=e;j=e+4+15&-16}h=c[b+48>>2]|0;i=c[b+56>>2]|0;if((h|0)<=0)if(!i)e=b+60|0;else o=39;else{e=0;do{c[j+(e<<2)>>2]=c[i+(e<<2)>>2];e=e+1|0}while((e|0)!=(h|0));o=39}if((o|0)==39)if(!(a[b+60>>0]|0))e=b+60|0;else{c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);e=b+60|0}a[e>>0]=1;c[b+56>>2]=j;c[b+52>>2]=p;h=p<<2;e=j}else{h=p<<2;e=c[b+56>>2]|0}Yk(e+(n<<2)|0,0,h-(n<<2)|0)|0}c[b+48>>2]=p;n=c[b+68>>2]|0;if((n|0)<(p|0)){if((c[b+72>>2]|0)<(p|0)){c[6995]=(c[6995]|0)+1;e=sc((p<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}i=c[b+68>>2]|0;j=c[b+76>>2]|0;if((i|0)<=0)if(!j)h=b+80|0;else o=52;else{h=0;do{c[e+(h<<2)>>2]=c[j+(h<<2)>>2];h=h+1|0}while((h|0)!=(i|0));o=52}if((o|0)==52)if(!(a[b+80>>0]|0))h=b+80|0;else{c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);h=b+80|0}a[h>>0]=1;c[b+76>>2]=e;c[b+72>>2]=p;h=p<<2}else{h=p<<2;e=c[b+76>>2]|0}Yk(e+(n<<2)|0,0,h-(n<<2)|0)|0}c[b+68>>2]=p;e=c[b+128>>2]|0;if((e|0)<=0){l=s;return}i=c[b+76>>2]|0;j=c[b+56>>2]|0;h=0;do{g[i+(h<<2)>>2]=0.0;g[j+(h<<2)>>2]=0.0;h=h+1|0}while((h|0)!=(e|0));j=0;do{h=c[b+136>>2]|0;i=c[h+(j*284|0)+88>>2]|0;if(i){n=h+(j*284|0)+92|0;c[s+48>>2]=c[n>>2];c[s+48+4>>2]=c[n+4>>2];c[s+48+8>>2]=c[n+8>>2];c[s+48+12>>2]=c[n+12>>2];n=h+(j*284|0)+108|0;c[s+48+16>>2]=c[n>>2];c[s+48+16+4>>2]=c[n+4>>2];c[s+48+16+8>>2]=c[n+8>>2];c[s+48+16+12>>2]=c[n+12>>2];n=h+(j*284|0)+124|0;c[s+48+32>>2]=c[n>>2];c[s+48+32+4>>2]=c[n+4>>2];c[s+48+32+8>>2]=c[n+8>>2];c[s+48+32+12>>2]=c[n+12>>2];n=c[b+112>>2]|0;e=c[s+48+16+(n<<2)>>2]|0;y=c[s+48+32+(n<<2)>>2]|0;o=c[b+36>>2]|0;c[o+(j<<4)>>2]=c[s+48+(n<<2)>>2];c[o+(j<<4)+4>>2]=e;c[o+(j<<4)+8>>2]=y;g[o+(j<<4)+12>>2]=0.0;o=c[b+36>>2]|0;y=o+(j<<4)|0;z=+g[y>>2];e=h+(j*284|0)|0;f=+g[e>>2];n=o+(j<<4)+4|0;x=+g[n>>2];t=h+(j*284|0)+4|0;k=+g[t>>2];o=o+(j<<4)+8|0;u=+g[o>>2];p=h+(j*284|0)+8|0;w=+g[p>>2];m=z-f*(z*f+x*k+u*w);v=x-k*(z*f+x*k+u*w);w=u-w*(z*f+x*k+u*w);u=1.0/+D(+(m*m+v*v+w*w));g[y>>2]=m*u;g[n>>2]=v*u;g[o>>2]=w*u;k=+g[t>>2];x=+g[p>>2];f=+g[e>>2];e=c[b+16>>2]|0;g[e+(j<<4)>>2]=k*w*u-x*v*u;g[e+(j<<4)+4>>2]=x*m*u-w*u*f;g[e+(j<<4)+8>>2]=v*u*f-k*m*u;g[e+(j<<4)+12>>2]=0.0;e=c[b+16>>2]|0;p=e+(j<<4)|0;u=+g[p>>2];t=e+(j<<4)+4|0;m=+g[t>>2];e=e+(j<<4)+8|0;k=+g[e>>2];f=1.0/+D(+(u*u+m*m+k*k));g[p>>2]=u*f;g[t>>2]=m*f;g[e>>2]=k*f;e=c[b+108>>2]|0;t=c[b+36>>2]|0;f=+g[t+(j<<4)>>2];k=+g[t+(j<<4)+4>>2];m=+g[t+(j<<4)+8>>2];if(f*f+k*k+m*m>1.100000023841858)f=0.0;else{C=+g[h+(j*284|0)+16>>2];H=C-+g[e+52>>2];F=+g[h+(j*284|0)+20>>2];J=F-+g[e+56>>2];K=+g[h+(j*284|0)+24>>2];M=K-+g[e+60>>2];C=C-+g[i+52>>2];F=F-+g[i+56>>2];K=K-+g[i+60>>2];G=+g[e+392>>2];N=+g[e+396>>2];I=+g[e+388>>2];B=+g[i+392>>2];L=+g[i+396>>2];E=+g[i+388>>2];A=(m*J-k*M)*+g[e+4>>2]+(f*M-m*H)*+g[e+20>>2]+(k*H-f*J)*+g[e+36>>2];u=(m*J-k*M)*+g[e+8>>2]+(f*M-m*H)*+g[e+24>>2]+(k*H-f*J)*+g[e+40>>2];v=(m*J-k*M)*+g[e+12>>2]+(f*M-m*H)*+g[e+28>>2]+(k*H-f*J)*+g[e+44>>2];w=(F*-m-K*-k)*+g[i+4>>2]+(K*-f-C*-m)*+g[i+20>>2]+(C*-k-F*-f)*+g[i+36>>2];x=(F*-m-K*-k)*+g[i+8>>2]+(K*-f-C*-m)*+g[i+24>>2]+(C*-k-F*-f)*+g[i+40>>2];z=(F*-m-K*-k)*+g[i+12>>2]+(K*-f-C*-m)*+g[i+28>>2]+(C*-k-F*-f)*+g[i+44>>2];f=(f*(M*G-J*N+ +g[e+372>>2]-(K*B-F*L+ +g[i+372>>2]))+k*(+g[e+376>>2]+(H*N-M*I)-(+g[i+376>>2]+(C*L-K*E)))+m*(J*I-H*G+ +g[e+380>>2]-(F*E-C*B+ +g[i+380>>2])))*-.20000000298023224*(1.0/(+g[i+404>>2]+(+g[e+404>>2]+(A*A*+g[e+456>>2]+u*u*+g[e+460>>2]+v*v*+g[e+464>>2]))+(w*w*+g[i+456>>2]+x*x*+g[i+460>>2]+z*z*+g[i+464>>2])))}g[(c[b+76>>2]|0)+(j<<2)>>2]=f;e=c[b+128>>2]|0}j=j+1|0}while((j|0)<(e|0));if((e|0)<=0){l=s;return}i=0;o=0;h=c[b+136>>2]|0;while(1){e=c[h+(o*284|0)+88>>2]|0;if(e){f=+g[h+(o*284|0)+252>>2];if(f!=0.0){f=f*d;p=h}else{N=+g[h+(o*284|0)+256>>2];N=N==0.0?0.0:N;p=c[b+108>>2]|0;y=c[b+16>>2]|0;H=+g[h+(o*284|0)+16>>2];F=+g[h+(o*284|0)+20>>2];A=+g[h+(o*284|0)+24>>2];x=+g[y+(o<<4)>>2];E=+g[y+(o<<4)+4>>2];f=+g[y+(o<<4)+8>>2];P=H-+g[p+52>>2];Q=F-+g[p+56>>2];k=A-+g[p+60>>2];m=+g[p+324>>2]*(Q*f-k*E)+ +g[p+340>>2]*(k*x-P*f)+(P*E-Q*x)*+g[p+356>>2];R=(Q*f-k*E)*+g[p+328>>2]+(k*x-P*f)*+g[p+344>>2]+(P*E-Q*x)*+g[p+360>>2];O=(Q*f-k*E)*+g[p+332>>2]+(k*x-P*f)*+g[p+348>>2]+(P*E-Q*x)*+g[p+364>>2];L=H-+g[e+52>>2];J=F-+g[e+56>>2];C=A-+g[e+60>>2];w=(E*L-x*J)*+g[e+356>>2]+(+g[e+324>>2]*(f*J-E*C)+ +g[e+340>>2]*(x*C-f*L));u=(f*J-E*C)*+g[e+328>>2]+(x*C-f*L)*+g[e+344>>2]+(E*L-x*J)*+g[e+360>>2];v=(f*J-E*C)*+g[e+332>>2]+(x*C-f*L)*+g[e+348>>2]+(E*L-x*J)*+g[e+364>>2];H=H-+g[p+52>>2];F=F-+g[p+56>>2];A=A-+g[p+60>>2];I=+g[p+392>>2];z=+g[p+396>>2];G=+g[p+388>>2];M=+g[e+392>>2];B=+g[e+396>>2];K=+g[e+388>>2];f=-(1.0/(+g[p+404>>2]+(f*(Q*m-P*R)+(x*(k*R-Q*O)+E*(P*O-k*m)))+(+g[e+404>>2]+(f*(J*w-L*u)+(x*(C*u-J*v)+E*(L*v-C*w)))))*((A*I-F*z+ +g[p+372>>2]-(C*M-J*B+ +g[e+372>>2]))*x+(+g[p+376>>2]+(H*z-A*G)-(+g[e+376>>2]+(L*B-C*K)))*E+(F*G-H*I+ +g[p+380>>2]-(J*K-L*M+ +g[e+380>>2]))*f));f=N>2]|0}n=c[b+56>>2]|0;y=n+(o<<2)|0;g[y>>2]=0.0;e=p+(o*284|0)+280|0;g[e>>2]=1.0;m=+g[h+(o*284|0)+276>>2]*d*+g[h+(o*284|0)+228>>2];g[y>>2]=f;f=f*.5;k=+g[(c[b+76>>2]|0)+(o<<2)>>2];if(f*f+k*k>m*m){R=m/+D(+(f*f+k*k));g[e>>2]=R*+g[e>>2];e=1}else e=i}else{n=c[b+56>>2]|0;g[n+(o<<2)>>2]=0.0;g[h+(o*284|0)+280>>2]=1.0;e=i;p=h}o=o+1|0;j=c[b+128>>2]|0;if((o|0)>=(j|0))break;else{i=e;h=p}}if(e){if((j|0)<=0){l=s;return}h=c[b+76>>2]|0;e=0;do{i=h+(e<<2)|0;if(+g[i>>2]!=0.0?(q=p+(e*284|0)+280|0,r=+g[q>>2],r<1.0):0){y=n+(e<<2)|0;g[y>>2]=r*+g[y>>2];g[i>>2]=+g[q>>2]*+g[i>>2]}e=e+1|0}while((e|0)!=(j|0))}if((j|0)<=0){l=s;return}e=0;h=n;while(1){i=c[b+108>>2]|0;j=p+(e*284|0)+16|0;k=+g[j>>2]-+g[i+52>>2];n=p+(e*284|0)+20|0;m=+g[n>>2]-+g[i+56>>2];o=p+(e*284|0)+24|0;d=+g[o>>2]-+g[i+60>>2];g[s+48>>2]=k;g[s+48+4>>2]=m;g[s+48+8>>2]=d;g[s+48+12>>2]=0.0;f=+g[h+(e<<2)>>2];if(f!=0.0){y=c[b+16>>2]|0;Q=f*+g[y+(e<<4)+4>>2];R=f*+g[y+(e<<4)+8>>2];g[s+32>>2]=+g[y+(e<<4)>>2]*f;g[s+32+4>>2]=Q;g[s+32+8>>2]=R;g[s+32+12>>2]=0.0;ll(i,s+32|0,s+48|0)}f=+g[(c[b+76>>2]|0)+(e<<2)>>2];if(f!=0.0){y=c[(c[b+136>>2]|0)+(e*284|0)+88>>2]|0;Q=+g[n>>2]-+g[y+56>>2];P=+g[o>>2]-+g[y+60>>2];g[s+32>>2]=+g[j>>2]-+g[y+52>>2];g[s+32+4>>2]=Q;g[s+32+8>>2]=P;g[s+32+12>>2]=0.0;t=c[b+36>>2]|0;P=+g[t+(e<<4)>>2]*f;Q=f*+g[t+(e<<4)+4>>2];R=f*+g[t+(e<<4)+8>>2];g[s+16>>2]=P;g[s+16+4>>2]=Q;g[s+16+8>>2]=R;g[s+16+12>>2]=0.0;t=c[b+108>>2]|0;q=c[b+116>>2]|0;L=+g[t+4+(q<<2)>>2];M=+g[t+20+(q<<2)>>2];N=+g[t+36+(q<<2)>>2];O=(L*k+M*m+N*d)*(1.0-+g[p+(e*284|0)+244>>2]);g[s+48>>2]=k-L*O;g[s+48+4>>2]=m-M*O;g[s+48+8>>2]=d-N*O;ll(t,s+16|0,s+48|0);g[s>>2]=-P;g[s+4>>2]=-Q;g[s+8>>2]=-R;g[s+12>>2]=0.0;ll(y,s,s+32|0)}e=e+1|0;if((e|0)>=(c[b+128>>2]|0))break;p=c[b+136>>2]|0;h=c[b+56>>2]|0}l=s;return}function Hc(b,e,f,h,i,j,k){b=b|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;var m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0.0,t=0,u=0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0;v=l;l=l+19040|0;p=j;q=p+36|0;do{c[p>>2]=0;p=p+4|0}while((p|0)<(q|0));c[v+18896>>2]=b;c[v+18896+4>>2]=f;x=+g[h>>2];K=+g[e>>2];y=+g[h+16>>2];A=+g[e+16>>2];z=+g[h+32>>2];L=+g[e+32>>2];B=+g[e+4>>2];M=+g[e+20>>2];C=+g[e+36>>2];s=+g[e+8>>2];n=+g[e+24>>2];w=+g[e+40>>2];J=+g[h+4>>2];I=+g[h+20>>2];H=+g[h+36>>2];G=+g[h+8>>2];F=+g[h+24>>2];E=+g[h+40>>2];g[v+18896+8>>2]=x*K+y*A+z*L;g[v+18896+12>>2]=x*B+y*M+z*C;g[v+18896+16>>2]=x*s+y*n+z*w;g[v+18896+20>>2]=0.0;g[v+18896+24>>2]=K*J+A*I+L*H;g[v+18896+28>>2]=B*J+M*I+C*H;g[v+18896+32>>2]=s*J+n*I+w*H;g[v+18896+36>>2]=0.0;g[v+18896+40>>2]=K*G+A*F+L*E;g[v+18896+44>>2]=B*G+M*F+C*E;g[v+18896+48>>2]=s*G+n*F+w*E;g[v+18896+52>>2]=0.0;w=+g[h+48>>2]-+g[e+48>>2];n=+g[h+52>>2]-+g[e+52>>2];s=+g[h+56>>2]-+g[e+56>>2];C=+g[e>>2];M=+g[h>>2];B=+g[e+16>>2];L=+g[h+16>>2];A=+g[e+32>>2];K=+g[h+32>>2];z=+g[e+4>>2];y=+g[e+20>>2];x=+g[e+36>>2];m=+g[e+8>>2];o=+g[e+24>>2];r=+g[e+40>>2];g[v+18896+56>>2]=C*M+B*L+A*K;g[v+18896+60>>2]=C*J+B*I+A*H;g[v+18896+64>>2]=C*G+B*F+A*E;g[v+18896+68>>2]=0.0;g[v+18896+72>>2]=M*z+L*y+K*x;g[v+18896+76>>2]=J*z+I*y+H*x;g[v+18896+80>>2]=G*z+F*y+E*x;g[v+18896+84>>2]=0.0;g[v+18896+88>>2]=M*m+L*o+K*r;g[v+18896+92>>2]=J*m+I*o+H*r;g[v+18896+96>>2]=G*m+F*o+E*r;g[v+18896+100>>2]=0.0;g[v+18896+104>>2]=w*C+n*B+s*A;g[v+18896+108>>2]=w*z+n*y+s*x;g[v+18896+112>>2]=w*m+n*o+s*r;g[v+18896+116>>2]=0.0;c[v+18896+120>>2]=k?81:80;c[v+18896+124>>2]=k?0:0;c[v+18512+364>>2]=0;c[v+18512+128>>2]=0;c[v+18512+128+4>>2]=0;c[v+18512+128+8>>2]=0;c[v+18512+128+12>>2]=0;c[v+18512+376>>2]=2;c[v+18512+368>>2]=0;g[v+18512+144>>2]=0.0;r=-+g[i+4>>2];s=-+g[i+8>>2];g[v+19024>>2]=-+g[i>>2];g[v+19024+4>>2]=r;g[v+19024+8>>2]=s;g[v+19024+12>>2]=0.0;switch(Jc(v+18512|0,v+18896|0,v+19024|0)|0){case 1:{c[v+18496>>2]=0;c[v+18496+4>>2]=0;c[v+18496+8>>2]=0;c[v+18496+12>>2]=0;c[v>>2]=9;c[v+18492>>2]=0;c[v+40>>2]=0;c[v+40+4>>2]=0;c[v+40+8>>2]=0;c[v+40+12>>2]=0;c[v+40+16>>2]=0;b=0;do{f=256-b+-1|0;c[v+4156+(f*56|0)+44>>2]=0;h=c[v+18504>>2]|0;c[v+4156+(f*56|0)+48>>2]=h;if(h|0)c[h+44>>2]=v+4156+(f*56|0);c[v+18504>>2]=v+4156+(f*56|0);c[v+18508>>2]=(c[v+18508>>2]|0)+1;b=b+1|0}while((b|0)!=256);o=+g[i>>2];r=+g[i+4>>2];n=+g[i+8>>2];t=c[v+18512+372>>2]|0;do if((c[t+32>>2]|0)>>>0>1?sd(v+18512|0)|0:0){b=c[v+18496>>2]|0;if(b|0){p=c[v+18500>>2]|0;q=c[v+18508>>2]|0;do{f=b+44|0;k=b+48|0;h=c[k>>2]|0;if(h|0)c[h+44>>2]=c[f>>2];f=c[f>>2]|0;if(f|0)c[f+48>>2]=c[k>>2];if((c[v+18496>>2]|0)==(b|0))c[v+18496>>2]=c[k>>2];p=p+-1|0;c[b+44>>2]=0;c[k>>2]=c[v+18504>>2];f=c[v+18504>>2]|0;if(f|0)c[f+44>>2]=b;c[v+18504>>2]=b;q=q+1|0;b=c[v+18496>>2]|0}while((b|0)!=0);c[v+18500>>2]=p;c[v+18508>>2]=q}c[v>>2]=0;c[v+18492>>2]=0;b=c[t>>2]|0;f=c[t+12>>2]|0;M=+g[f+16>>2];E=+g[b+16>>2]-M;G=+g[f+20>>2];H=+g[b+20>>2]-G;J=+g[f+24>>2];K=+g[b+24>>2]-J;f=c[t+4>>2]|0;I=+g[f+16>>2]-M;L=+g[f+20>>2]-G;F=+g[f+24>>2]-J;h=c[t+8>>2]|0;M=+g[h+16>>2]-M;G=+g[h+20>>2]-G;J=+g[h+24>>2]-J;if(E*L*J+(H*F*M+K*I*G-E*F*G-H*I*J)-K*L*M<0.0){c[t>>2]=f;c[t+4>>2]=b;k=c[t+16>>2]|0;c[t+16>>2]=c[t+20>>2];c[t+20>>2]=k;k=f}else{k=b;b=f}k=lf(v,k,b,h,1)|0;p=lf(v,c[t+4>>2]|0,c[t>>2]|0,c[t+12>>2]|0,1)|0;q=lf(v,c[t+8>>2]|0,c[t+4>>2]|0,c[t+12>>2]|0,1)|0;i=lf(v,c[t>>2]|0,c[t+8>>2]|0,c[t+12>>2]|0,1)|0;if((c[v+18500>>2]|0)==4){f=c[v+18496>>2]|0;m=+g[f+16>>2];b=c[f+48>>2]|0;if(!b)b=f;else{n=m*m;while(1){m=+g[b+16>>2];h=m*m>2]|0;if(!b)break;else n=h?m*m:n}b=f;m=+g[f+16>>2]}o=+g[b>>2];s=+g[b+4>>2];r=+g[b+8>>2];n=+g[b+12>>2];N=c[b+20>>2]|0;f=c[b+24>>2]|0;h=c[b+28>>2]|0;a[k+52>>0]=0;c[k+32>>2]=p;a[p+52>>0]=0;c[p+32>>2]=k;a[k+53>>0]=0;c[k+36>>2]=q;a[q+52>>0]=1;c[q+32>>2]=k;a[k+54>>0]=0;c[k+40>>2]=i;a[i+52>>0]=2;c[i+32>>2]=k;a[p+53>>0]=2;c[p+36>>2]=i;a[i+54>>0]=1;c[i+40>>2]=p;a[p+54>>0]=1;c[p+40>>2]=q;a[q+53>>0]=2;c[q+36>>2]=p;a[q+54>>0]=1;c[q+40>>2]=i;a[i+53>>0]=2;c[i+36>>2]=q;c[v>>2]=0;i=b;t=0;p=N;q=f;k=h;while(1){f=c[v+18492>>2]|0;if(f>>>0>=128){u=44;break}c[v+19024>>2]=0;c[v+19024+4>>2]=0;c[v+19024+8>>2]=0;c[v+18492>>2]=f+1;t=t+1|0;a[i+55>>0]=t;h=i+4|0;N=i+8|0;Fh(v+18512|0,+g[i>>2],+g[h>>2],+g[N>>2],v+60+(f<<5)|0);if(+g[i>>2]*+g[v+60+(f<<5)+16>>2]+ +g[h>>2]*+g[v+60+(f<<5)+20>>2]+ +g[N>>2]*+g[v+60+(f<<5)+24>>2]-+g[i+16>>2]>9.999999747378752e-05)b=0;else{b=7;u=43;break}do{h=nh(v,t,v+60+(f<<5)|0,c[i+32+(b<<2)>>2]|0,d[i+52+b>>0]|0,v+19024|0)|0;b=b+1|0}while(h&b>>>0<3);if(!(h&(c[v+19024+8>>2]|0)>>>0>2)){b=4;u=43;break}h=c[v+19024>>2]|0;b=c[v+19024+4>>2]|0;a[h+53>>0]=2;c[h+36>>2]=b;a[b+54>>0]=1;c[b+40>>2]=h;b=i+44|0;h=i+48|0;f=c[h>>2]|0;if(f|0)c[f+44>>2]=c[b>>2];b=c[b>>2]|0;if(b|0)c[b+48>>2]=c[h>>2];if((c[v+18496>>2]|0)==(i|0))c[v+18496>>2]=c[h>>2];c[v+18500>>2]=(c[v+18500>>2]|0)+-1;c[i+44>>2]=0;c[h>>2]=c[v+18504>>2];b=c[v+18504>>2]|0;if(b|0)c[b+44>>2]=i;c[v+18504>>2]=i;c[v+18508>>2]=(c[v+18508>>2]|0)+1;f=c[v+18496>>2]|0;m=+g[f+16>>2];b=c[f+48>>2]|0;if(b){n=m*m;h=f;while(1){m=+g[b+16>>2];f=m*m>2]|0;if(!b)break;else n=f?m*m:n}f=h;m=+g[h+16>>2]}o=+g[f>>2];s=+g[f+4>>2];r=+g[f+8>>2];n=+g[f+12>>2];b=c[f+20>>2]|0;h=c[f+24>>2]|0;k=c[f+28>>2]|0;if(t>>>0>=255){f=k;break}else{i=f;p=b;q=h}}if((u|0)==43){c[v>>2]=b;b=p;h=q;f=k}else if((u|0)==44){c[v>>2]=6;b=p;h=q;f=k}I=o*m;G=s*m;K=r*m;g[v+40>>2]=o;g[v+44>>2]=s;g[v+48>>2]=r;g[v+52>>2]=n;g[v+56>>2]=m;c[v+36>>2]=3;c[v+4>>2]=b;c[v+8>>2]=h;c[v+12>>2]=f;N=h;L=+g[N+16>>2]-I;E=+g[N+20>>2]-G;C=+g[N+24>>2]-K;t=f;J=+g[t+16>>2]-I;F=+g[t+20>>2]-G;H=+g[t+24>>2]-K;L=+D(+((L*F-E*J)*(L*F-E*J)+((E*H-C*F)*(E*H-C*F)+(C*J-L*H)*(C*J-L*H))));g[v+20>>2]=L;J=+g[t+16>>2]-I;C=+g[t+20>>2]-G;t=b;F=+g[t+16>>2]-I;E=+g[t+20>>2]-G;M=+g[t+24>>2]-K;M=+D(+((J*E-C*F)*(J*E-C*F)+((C*M-H*E)*(C*M-H*E)+(H*F-J*M)*(H*F-J*M))));g[v+24>>2]=M;J=+g[t+16>>2]-I;F=+g[t+20>>2]-G;H=+g[t+24>>2]-K;I=+g[N+16>>2]-I;G=+g[N+20>>2]-G;K=+g[N+24>>2]-K;K=+D(+((J*G-F*I)*(J*G-F*I)+((F*K-H*G)*(F*K-H*G)+(H*I-J*K)*(H*I-J*K))));g[v+20>>2]=L/(K+(L+M));g[v+24>>2]=M/(K+(L+M));g[v+28>>2]=K/(K+(L+M));if((c[v>>2]|0)!=9)if(!(c[v+36>>2]|0)){o=0.0;n=0.0;m=0.0;break}else{k=v+36|0;u=53;break}c[j>>2]=3;N=0;l=v;return N|0}else u=47}else u=47;while(0);if((u|0)==47){c[v>>2]=8;g[v+40>>2]=o;g[v+44>>2]=r;g[v+48>>2]=n;g[v+52>>2]=0.0;m=+D(+(o*o+r*r+n*n));if(m>0.0){g[v+40>>2]=1.0/m*o;g[v+44>>2]=1.0/m*r;g[v+48>>2]=1.0/m*n}else{c[v+40>>2]=1065353216;c[v+44>>2]=0;c[v+48>>2]=0}g[v+52>>2]=0.0;g[v+56>>2]=0.0;c[v+36>>2]=1;c[v+4>>2]=c[t>>2];g[v+20>>2]=1.0;k=v+36|0;u=53}if((u|0)==53){h=0;m=0.0;n=0.0;o=0.0;do{b=c[v+18896+120>>2]|0;N=c[v+18896+124>>2]|0;f=(c[v+18896>>2]|0)+(N>>1)|0;if(N&1)b=c[(c[f>>2]|0)+b>>2]|0;Sb[b&127](v+19024|0,f,c[v+4+(h<<2)>>2]|0);M=+g[v+20+(h<<2)>>2];m=m+ +g[v+19024>>2]*M;n=n+M*+g[v+19024+4>>2];o=o+M*+g[v+19024+8>>2];h=h+1|0}while(h>>>0<(c[k>>2]|0)>>>0)}c[j>>2]=1;M=m*+g[e+16>>2]+n*+g[e+20>>2]+o*+g[e+24>>2]+ +g[e+52>>2];J=m*+g[e+32>>2]+n*+g[e+36>>2]+o*+g[e+40>>2]+ +g[e+56>>2];g[j+4>>2]=m*+g[e>>2]+n*+g[e+4>>2]+o*+g[e+8>>2]+ +g[e+48>>2];g[j+8>>2]=M;g[j+12>>2]=J;g[j+16>>2]=0.0;J=+g[v+40>>2];M=+g[v+56>>2];K=+g[v+44>>2];L=+g[v+48>>2];E=m-J*M;F=n-M*K;G=o-M*L;H=E*+g[e+16>>2]+F*+g[e+20>>2]+G*+g[e+24>>2]+ +g[e+52>>2];I=E*+g[e+32>>2]+F*+g[e+36>>2]+G*+g[e+40>>2]+ +g[e+56>>2];g[j+20>>2]=E*+g[e>>2]+F*+g[e+4>>2]+G*+g[e+8>>2]+ +g[e+48>>2];g[j+24>>2]=H;g[j+28>>2]=I;g[j+32>>2]=0.0;g[j+36>>2]=-J;g[j+40>>2]=-K;g[j+44>>2]=-L;g[j+48>>2]=0.0;g[j+52>>2]=-M;N=1;l=v;return N|0}case 2:{c[j>>2]=2;N=0;l=v;return N|0}default:{N=0;l=v;return N|0}}return 0}function Ic(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0;w=l;l=l+208|0;u=(a[b+68>>0]|0)!=0;t=u?e:d;u=u?d:e;v=c[t+4>>2]|0;if((c[v+72>>2]|0)!=(c[b+80>>2]|0)){j=c[b+52>>2]|0;if((j|0)>0){i=0;do{k=c[(c[b+60>>2]|0)+(i<<2)>>2]|0;if(k|0){Ib[c[c[k>>2]>>2]&511](k);m=c[b+4>>2]|0;Ob[c[(c[m>>2]|0)+60>>2]&127](m,c[(c[b+60>>2]|0)+(i<<2)>>2]|0)}i=i+1|0}while((i|0)!=(j|0))}eh(b,d,e);c[b+80>>2]=c[v+72>>2]}d=c[b+52>>2]|0;if(!d){l=w;return}m=c[v+68>>2]|0;j=c[b+4>>2]|0;k=c[b+60>>2]|0;i=c[b+72>>2]|0;c[w+176>>2]=6540;c[w+176+4>>2]=t;c[w+176+8>>2]=u;c[w+176+12>>2]=j;c[w+176+16>>2]=f;c[w+176+20>>2]=h;c[w+176+24>>2]=k;c[w+176+28>>2]=i;i=c[b+32>>2]|0;if((i|0)<0){if((c[b+36>>2]|0)<0){d=c[b+40>>2]|0;if(d|0){if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+40>>2]=0}a[b+44>>0]=1;c[b+40>>2]=0;c[b+36>>2]=0}do{c[(c[b+40>>2]|0)+(i<<2)>>2]=0;i=i+1|0}while((i|0)!=0);d=c[b+52>>2]|0}c[b+32>>2]=0;if((d|0)>0){f=0;do{i=c[(c[b+60>>2]|0)+(f<<2)>>2]|0;if(i){Ob[c[(c[i>>2]|0)+16>>2]&127](i,b+28|0);i=c[b+32>>2]|0;if((i|0)>0){k=0;do{j=c[(c[b+40>>2]|0)+(k<<2)>>2]|0;if(c[j+780>>2]|0){c[h+4>>2]=j;i=c[j+772>>2]|0;d=c[(c[h+8>>2]|0)+8>>2]|0;e=c[(c[h+12>>2]|0)+8>>2]|0;if((i|0)==(d|0))af(j,i+4|0,e+4|0);else af(j,e+4|0,d+4|0);c[h+4>>2]=0;i=c[b+32>>2]|0}k=k+1|0}while((k|0)<(i|0))}if((i|0)<0){if((c[b+36>>2]|0)<0){d=c[b+40>>2]|0;if(d|0){if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+40>>2]=0}a[b+44>>0]=1;c[b+40>>2]=0;c[b+36>>2]=0}do{c[(c[b+40>>2]|0)+(i<<2)>>2]=0;i=i+1|0}while((i|0)!=0)}c[b+32>>2]=0;d=c[b+52>>2]|0}f=f+1|0}while((f|0)<(d|0))}if(!m){if((d|0)>0){i=0;do{we(w+176|0,c[(c[v+28>>2]|0)+(i*80|0)+64>>2]|0,i);i=i+1|0}while((i|0)<(d|0))}}else{k=c[t+12>>2]|0;F=+g[k>>2];E=+g[k+16>>2];D=+g[k+32>>2];C=+g[k+4>>2];B=+g[k+20>>2];A=+g[k+36>>2];r=+g[k+8>>2];p=+g[k+24>>2];n=+g[k+40>>2];z=-+g[k+48>>2];y=-+g[k+52>>2];x=-+g[k+56>>2];k=c[u+12>>2]|0;O=+g[k>>2];N=+g[k+16>>2];M=+g[k+32>>2];L=+g[k+4>>2];K=+g[k+20>>2];J=+g[k+36>>2];I=+g[k+8>>2];H=+g[k+24>>2];G=+g[k+40>>2];q=+g[k+48>>2];o=+g[k+52>>2];s=+g[k+56>>2];g[w+32>>2]=F*O+E*N+D*M;g[w+32+4>>2]=F*L+E*K+D*J;g[w+32+8>>2]=F*I+E*H+D*G;g[w+32+12>>2]=0.0;g[w+32+16>>2]=C*O+B*N+A*M;g[w+32+20>>2]=C*L+B*K+A*J;g[w+32+24>>2]=C*I+B*H+A*G;g[w+32+28>>2]=0.0;g[w+32+32>>2]=r*O+p*N+n*M;g[w+32+36>>2]=r*L+p*K+n*J;g[w+32+40>>2]=r*I+p*H+n*G;g[w+32+44>>2]=0.0;g[w+32+48>>2]=F*z+E*y+D*x+(F*q+E*o+D*s);g[w+32+52>>2]=C*z+B*y+A*x+(C*q+B*o+A*s);g[w+32+56>>2]=r*z+p*y+n*x+(r*q+p*o+n*s);g[w+32+60>>2]=0.0;k=c[u+4>>2]|0;Vb[c[(c[k>>2]|0)+8>>2]&127](k,w+32|0,w+112|0,w+96|0);s=+g[h+32>>2];n=+g[w+112>>2]-s;g[w+112>>2]=n;o=+g[w+112+4>>2]-s;g[w+112+4>>2]=o;p=+g[w+112+8>>2]-s;g[w+112+8>>2]=p;q=s+ +g[w+96>>2];g[w+96>>2]=q;r=s+ +g[w+96+4>>2];g[w+96+4>>2]=r;s=s+ +g[w+96+8>>2];g[w+96+8>>2]=s;k=c[m>>2]|0;if(k|0){i=c[b+12>>2]|0;d=c[b+16>>2]|0;if((i|0)<0){if((d|0)<0){d=c[b+20>>2]|0;if(d|0){if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+20>>2]=0}a[b+24>>0]=1;c[b+20>>2]=0;c[b+16>>2]=0;d=0}do{c[(c[b+20>>2]|0)+(i<<2)>>2]=0;i=i+1|0}while((i|0)!=0)}c[b+12>>2]=0;if((d|0)<64){c[6995]=(c[6995]|0)+1;i=sc(275)|0;if(!i)e=0;else{c[(i+4+15&-16)+-4>>2]=i;e=i+4+15&-16}i=c[b+12>>2]|0;if((i|0)>0){d=0;do{c[e+(d<<2)>>2]=c[(c[b+20>>2]|0)+(d<<2)>>2];d=d+1|0}while((d|0)!=(i|0))}d=c[b+20>>2]|0;if(d){if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);i=c[b+12>>2]|0}c[b+20>>2]=0}a[b+24>>0]=1;c[b+20>>2]=e;c[b+16>>2]=64;d=64}else i=0;if((i|0)==(d|0)){j=d<<1;if((d|0)<(j|0)){c[6995]=(c[6995]|0)+1;i=sc((d<<3|3)+16|0)|0;if(!i)e=0;else{c[(i+4+15&-16)+-4>>2]=i;e=i+4+15&-16}i=c[b+12>>2]|0;if((i|0)>0){d=0;do{c[e+(d<<2)>>2]=c[(c[b+20>>2]|0)+(d<<2)>>2];d=d+1|0}while((d|0)!=(i|0))}d=c[b+20>>2]|0;if(d){if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);i=c[b+12>>2]|0}c[b+20>>2]=0}a[b+24>>0]=1;c[b+20>>2]=e;c[b+16>>2]=j}else i=d}c[(c[b+20>>2]|0)+(i<<2)>>2]=k;d=i+1|0;c[b+12>>2]=d;while(1){i=d+-1|0;e=c[b+20>>2]|0;f=c[e+(i<<2)>>2]|0;c[b+12>>2]=i;do if(((((+g[f>>2]<=q?+g[f+16>>2]>=n:0)?+g[f+4>>2]<=r:0)?+g[f+20>>2]>=o:0)?+g[f+8>>2]<=s:0)?+g[f+24>>2]>=p:0){if(!(c[f+40>>2]|0)){Ob[c[(c[w+176>>2]|0)+12>>2]&127](w+176|0,f);i=c[b+12>>2]|0;break}k=c[f+36>>2]|0;j=c[b+16>>2]|0;do if((i|0)==(j|0)){j=i|0?i<<1:1;if((d|0)>(j|0)){d=i;break}if(!j)e=0;else{c[6995]=(c[6995]|0)+1;i=sc((j<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}e=i;i=c[b+12>>2]|0}if((i|0)>0){d=0;do{c[e+(d<<2)>>2]=c[(c[b+20>>2]|0)+(d<<2)>>2];d=d+1|0}while((d|0)!=(i|0))}d=c[b+20>>2]|0;if(d){if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);i=c[b+12>>2]|0}c[b+20>>2]=0}a[b+24>>0]=1;c[b+20>>2]=e;c[b+16>>2]=j;d=i;i=j}else{d=i;i=j}while(0);c[e+(d<<2)>>2]=k;d=d+1|0;c[b+12>>2]=d;k=c[f+40>>2]|0;do if((d|0)==(i|0)){j=i|0?i<<1:1;if((i|0)>=(j|0))break;if(!j)e=0;else{c[6995]=(c[6995]|0)+1;i=sc((j<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}e=i;i=c[b+12>>2]|0}if((i|0)>0){d=0;do{c[e+(d<<2)>>2]=c[(c[b+20>>2]|0)+(d<<2)>>2];d=d+1|0}while((d|0)!=(i|0))}d=c[b+20>>2]|0;if(d){if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);i=c[b+12>>2]|0}c[b+20>>2]=0}a[b+24>>0]=1;c[b+20>>2]=e;c[b+16>>2]=j}else i=d;while(0);c[(c[b+20>>2]|0)+(i<<2)>>2]=k;i=i+1|0;c[b+12>>2]=i}while(0);if((i|0)>0)d=i;else break}}}e=c[b+52>>2]|0;i=c[b+32>>2]|0;if((i|0)<0){if((c[b+36>>2]|0)<0){d=c[b+40>>2]|0;if(d|0){if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+40>>2]=0}a[b+44>>0]=1;c[b+40>>2]=0;c[b+36>>2]=0}do{c[(c[b+40>>2]|0)+(i<<2)>>2]=0;i=i+1|0}while((i|0)!=0)}c[b+32>>2]=0;if((e|0)>0){d=0;do{do if(c[(c[b+60>>2]|0)+(d<<2)>>2]|0){f=c[v+28>>2]|0;m=c[f+(d*80|0)+64>>2]|0;h=c[t+12>>2]|0;q=+g[h>>2];r=+g[h+4>>2];s=+g[h+8>>2];x=+g[h+16>>2];y=+g[h+20>>2];z=+g[h+24>>2];G=+g[h+32>>2];I=+g[h+36>>2];K=+g[h+40>>2];A=+g[f+(d*80|0)>>2];B=+g[f+(d*80|0)+16>>2];C=+g[f+(d*80|0)+32>>2];D=+g[f+(d*80|0)+4>>2];E=+g[f+(d*80|0)+20>>2];F=+g[f+(d*80|0)+36>>2];H=+g[f+(d*80|0)+8>>2];J=+g[f+(d*80|0)+24>>2];L=+g[f+(d*80|0)+40>>2];o=+g[f+(d*80|0)+48>>2];p=+g[f+(d*80|0)+52>>2];O=+g[f+(d*80|0)+56>>2];M=+g[h+48>>2]+(q*o+r*p+s*O);N=+g[h+52>>2]+(x*o+y*p+z*O);O=+g[h+56>>2]+(G*o+I*p+K*O);g[w+112>>2]=q*A+r*B+s*C;g[w+112+4>>2]=q*D+r*E+s*F;g[w+112+8>>2]=q*H+r*J+s*L;g[w+112+12>>2]=0.0;g[w+112+16>>2]=x*A+y*B+z*C;g[w+112+20>>2]=x*D+y*E+z*F;g[w+112+24>>2]=x*H+y*J+z*L;g[w+112+28>>2]=0.0;g[w+112+32>>2]=G*A+I*B+K*C;g[w+112+36>>2]=G*D+I*E+K*F;g[w+112+40>>2]=G*H+I*J+K*L;g[w+112+44>>2]=0.0;g[w+112+48>>2]=M;g[w+112+52>>2]=N;g[w+112+56>>2]=O;g[w+112+60>>2]=0.0;Vb[c[(c[m>>2]|0)+8>>2]&127](m,w+112|0,w+96|0,w+32|0);m=c[u+4>>2]|0;Vb[c[(c[m>>2]|0)+8>>2]&127](m,c[u+12>>2]|0,w+16|0,w);if(!(+g[w+96>>2]>+g[w>>2])?!(+g[w+32>>2]<+g[w+16>>2]):0)i=1;else i=0;if(!(!(+g[w+96+8>>2]>+g[w+8>>2])?!(+g[w+32+8>>2]<+g[w+16+8>>2]):0))i=0;if(!(+g[w+96+4>>2]>+g[w+4>>2])?!(+g[w+32+4>>2]<+g[w+16+4>>2]|i^1):0)break;m=c[(c[b+60>>2]|0)+(d<<2)>>2]|0;Ib[c[c[m>>2]>>2]&511](m);m=c[b+4>>2]|0;Ob[c[(c[m>>2]|0)+60>>2]&127](m,c[(c[b+60>>2]|0)+(d<<2)>>2]|0);c[(c[b+60>>2]|0)+(d<<2)>>2]=0}while(0);d=d+1|0}while((d|0)<(e|0))}l=w;return}function Jc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0.0,w=0,x=0,y=0,z=0.0,A=0.0,B=0,C=0,E=0.0,F=0.0,G=0.0;C=l;l=l+176|0;c[a+348>>2]=a+220;c[a+352>>2]=a+252;c[a+356>>2]=a+284;c[a+360>>2]=a+316;c[a+364>>2]=4;c[a+368>>2]=0;c[a+376>>2]=0;y=c[b+4>>2]|0;c[a>>2]=c[b>>2];c[a+4>>2]=y;c[a+8>>2]=c[b+8>>2];c[a+8+4>>2]=c[b+8+4>>2];c[a+8+8>>2]=c[b+8+8>>2];c[a+8+12>>2]=c[b+8+12>>2];c[a+24>>2]=c[b+24>>2];c[a+24+4>>2]=c[b+24+4>>2];c[a+24+8>>2]=c[b+24+8>>2];c[a+24+12>>2]=c[b+24+12>>2];c[a+40>>2]=c[b+40>>2];c[a+40+4>>2]=c[b+40+4>>2];c[a+40+8>>2]=c[b+40+8>>2];c[a+40+12>>2]=c[b+40+12>>2];c[a+56>>2]=c[b+56>>2];c[a+56+4>>2]=c[b+56+4>>2];c[a+56+8>>2]=c[b+56+8>>2];c[a+56+12>>2]=c[b+56+12>>2];c[a+72>>2]=c[b+72>>2];c[a+72+4>>2]=c[b+72+4>>2];c[a+72+8>>2]=c[b+72+8>>2];c[a+72+12>>2]=c[b+72+12>>2];c[a+88>>2]=c[b+88>>2];c[a+88+4>>2]=c[b+88+4>>2];c[a+88+8>>2]=c[b+88+8>>2];c[a+88+12>>2]=c[b+88+12>>2];c[a+104>>2]=c[b+104>>2];c[a+104+4>>2]=c[b+104+4>>2];c[a+104+8>>2]=c[b+104+8>>2];c[a+104+12>>2]=c[b+104+12>>2];y=c[b+124>>2]|0;c[a+120>>2]=c[b+120>>2];c[a+124>>2]=y;g[a+144>>2]=0.0;c[a+180>>2]=0;c[a+128>>2]=c[d>>2];c[a+128+4>>2]=c[d+4>>2];c[a+128+8>>2]=c[d+8>>2];c[a+128+12>>2]=c[d+12>>2];e=+g[a+128>>2];f=+g[a+132>>2];h=+g[a+136>>2];if(e*e+f*f+h*h>0.0){g[a+164>>2]=0.0;c[a+364>>2]=3;c[a+148>>2]=a+316;c[a+180>>2]=1;Fh(a,-e,-f,-h,a+316|0);b=a+148|0;d=a+164|0}else{g[a+164>>2]=0.0;c[a+364>>2]=3;c[a+148>>2]=a+316;c[a+180>>2]=1;Fh(a,1.0,0.0,0.0,a+316|0);b=a+148|0;d=a+164|0}g[d>>2]=1.0;y=(c[b>>2]|0)+16|0;c[a+128>>2]=c[y>>2];c[a+128+4>>2]=c[y+4>>2];c[a+128+8>>2]=c[y+8>>2];c[a+128+12>>2]=c[y+12>>2];c[C+24+48>>2]=c[y>>2];c[C+24+48+4>>2]=c[y+4>>2];c[C+24+48+8>>2]=c[y+8>>2];c[C+24+48+12>>2]=c[y+12>>2];c[C+24+32>>2]=c[y>>2];c[C+24+32+4>>2]=c[y+4>>2];c[C+24+32+8>>2]=c[y+8>>2];c[C+24+32+12>>2]=c[y+12>>2];c[C+24+16>>2]=c[y>>2];c[C+24+16+4>>2]=c[y+4>>2];c[C+24+16+8>>2]=c[y+8>>2];c[C+24+16+12>>2]=c[y+12>>2];c[C+24>>2]=c[y>>2];c[C+24+4>>2]=c[y+4>>2];c[C+24+8>>2]=c[y+8>>2];c[C+24+12>>2]=c[y+12>>2];y=0;z=0.0;e=e*e+f*f+h*h;x=0;a:do{w=c[a+368>>2]|0;f=+g[a+128>>2];h=+g[a+132>>2];i=+g[a+136>>2];o=+D(+(f*f+h*h+i*i));if(o<9.999999747378752e-05){B=6;break}g[a+148+(w*36|0)+16+(c[a+148+(w*36|0)+32>>2]<<2)>>2]=0.0;b=(c[a+364>>2]|0)+-1|0;c[a+364>>2]=b;c[a+148+(w*36|0)+(c[a+148+(w*36|0)+32>>2]<<2)>>2]=c[a+348+(b<<2)>>2];b=c[a+148+(w*36|0)+32>>2]|0;c[a+148+(w*36|0)+32>>2]=b+1;Fh(a,-f,-h,-i,c[a+148+(w*36|0)+(b<<2)>>2]|0);b=c[a+148+(w*36|0)+32>>2]|0;d=c[a+148+(w*36|0)+(b+-1<<2)>>2]|0;f=+g[d+16>>2];h=+g[d+20>>2];i=+g[d+24>>2];r=f-+g[C+24>>2];s=h-+g[C+24+4>>2];v=i-+g[C+24+8>>2];if(r*r+s*s+v*v<9.999999747378752e-05){B=9;break}r=f-+g[C+24+16>>2];s=h-+g[C+24+20>>2];v=i-+g[C+24+24>>2];if(r*r+s*s+v*v<9.999999747378752e-05){B=9;break}r=f-+g[C+24+32>>2];s=h-+g[C+24+36>>2];v=i-+g[C+24+40>>2];if(r*r+s*s+v*v<9.999999747378752e-05){B=9;break}r=f-+g[C+24+48>>2];s=h-+g[C+24+52>>2];v=i-+g[C+24+56>>2];if(r*r+s*s+v*v<9.999999747378752e-05){B=9;break}x=x+1&3;u=C+24+(x<<4)|0;c[u>>2]=c[d+16>>2];c[u+4>>2]=c[d+16+4>>2];c[u+8>>2]=c[d+16+8>>2];c[u+12>>2]=c[d+16+12>>2];v=(+g[a+128>>2]*f+ +g[a+132>>2]*h+ +g[a+136>>2]*i)/o;z=v>z?v:z;if(o-z-o*9.999999747378752e-05<=0.0){B=10;break}c[C>>2]=0;b:do switch(b|0){case 2:{u=c[a+148+(w*36|0)>>2]|0;t=c[a+148+(w*36|0)+4>>2]|0;e=+g[t+16>>2];f=+g[u+16>>2];h=+g[t+20>>2];i=+g[u+20>>2];o=+g[t+24>>2];p=+g[u+24>>2];if(!((e-f)*(e-f)+(h-i)*(h-i)+(o-p)*(o-p)>0.0)){B=38;break a}q=-(f*(e-f)+i*(h-i)+p*(o-p))/((e-f)*(e-f)+(h-i)*(h-i)+(o-p)*(o-p));if(q>=1.0){g[C+8>>2]=0.0;g[C+8+4>>2]=1.0;c[C>>2]=2;e=e*e+h*h+o*o;break b}if(!(q<=0.0)){g[C+8+4>>2]=q;g[C+8>>2]=1.0-q;c[C>>2]=3;e=((e-f)*q+f)*((e-f)*q+f)+((h-i)*q+i)*((h-i)*q+i)+((o-p)*q+p)*((o-p)*q+p);break b}else{g[C+8>>2]=1.0;g[C+8+4>>2]=0.0;c[C>>2]=1;e=f*f+i*i+p*p;break b}}case 3:{e=+Ke((c[a+148+(w*36|0)>>2]|0)+16|0,(c[a+148+(w*36|0)+4>>2]|0)+16|0,(c[a+148+(w*36|0)+8>>2]|0)+16|0,C+8|0,C);break}case 4:{m=c[a+148+(w*36|0)>>2]|0;n=c[a+148+(w*36|0)+4>>2]|0;t=c[a+148+(w*36|0)+8>>2]|0;u=c[a+148+(w*36|0)+12>>2]|0;c[C+152>>2]=m+16;c[C+152+4>>2]=n+16;c[C+152+8>>2]=t+16;c[C+152+12>>2]=u+16;i=+g[m+16>>2];o=+g[u+16>>2];f=+g[m+20>>2];p=+g[u+20>>2];h=+g[m+24>>2];q=+g[u+24>>2];g[C+104>>2]=i-o;g[C+104+4>>2]=f-p;g[C+104+8>>2]=h-q;g[C+104+12>>2]=0.0;e=+g[n+16>>2];F=+g[n+20>>2];s=+g[n+24>>2];g[C+104+16>>2]=e-o;g[C+104+20>>2]=F-p;g[C+104+24>>2]=s-q;g[C+104+28>>2]=0.0;r=+g[t+16>>2];G=+g[t+20>>2];E=+g[t+24>>2];g[C+104+32>>2]=r-o;g[C+104+36>>2]=G-p;g[C+104+40>>2]=E-q;g[C+104+44>>2]=0.0;v=(f-p)*(s-q)*(r-o)+(h-q)*(e-o)*(G-p)-(G-p)*(s-q)*(i-o)-(f-p)*(e-o)*(E-q)+(E-q)*(i-o)*(F-p)-(r-o)*(h-q)*(F-p);if(v!=v|0.0!=0.0|v==0.0|!(v*(h*((e-r)*(f-F)-(F-G)*(i-e))+(i*((F-G)*(h-s)-(s-E)*(f-F))+f*((s-E)*(i-e)-(e-r)*(h-s))))<=0.0))e=-1.0;else{c[C+92>>2]=0;c[C+92+4>>2]=0;c[C+92+8>>2]=0;c[C+88>>2]=0;e=-1.0;k=0;s=f-p;r=h-q;h=i-o;f=q;d=c[C>>2]|0;while(1){b=c[5288+(k<<2)>>2]|0;E=+g[C+104+(b<<4)+8>>2];F=+g[C+104+(b<<4)+4>>2];G=+g[C+104+(b<<4)>>2];if(v*((s*E-r*F)*o+p*(r*G-E*h)+(F*h-s*G)*f)>0.0?(A=+Ke(c[C+152+(k<<2)>>2]|0,c[C+152+(b<<2)>>2]|0,u+16|0,C+92|0,C+88|0),e<0.0|A>2]|0;c[C+8+(k<<2)>>2]=c[C+92>>2];c[C+8+(b<<2)>>2]=c[C+92+4>>2];g[C+8+(c[5288+(b<<2)>>2]<<2)>>2]=0.0;c[C+8+12>>2]=c[C+92+8>>2];e=A;d=(d&2|0?1<>2];r=+g[C+104+(b<<4)+8>>2];h=+g[C+104+(b<<4)>>2];o=+g[u+16>>2];p=+g[u+20>>2];f=+g[u+24>>2]}c[C>>2]=d;if(e<0.0){c[C>>2]=15;i=+g[t+20>>2];G=+g[n+24>>2];F=+g[u+16>>2];f=+g[t+24>>2];E=+g[n+16>>2];o=+g[u+20>>2];h=+g[t+16>>2];s=+g[u+24>>2];q=+g[n+20>>2];g[C+8>>2]=(i*G*F+f*E*o-o*G*h-i*E*s+s*h*q-F*f*q)/v;e=+g[m+20>>2];p=+g[m+24>>2];r=+g[m+16>>2];g[C+8+4>>2]=(e*f*F+p*h*o-o*f*r-e*h*s+s*r*i-F*p*i)/v;g[C+8+8>>2]=(q*p*F+G*r*o-o*p*E-q*r*s+s*E*e-F*G*e)/v;g[C+8+12>>2]=1.0-((i*G*F+f*E*o-o*G*h-i*E*s+s*h*q-F*f*q)/v+(e*f*F+p*h*o-o*f*r-e*h*s+s*r*i-F*p*i)/v+(q*p*F+G*r*o-o*p*E-q*r*s+s*E*e-F*G*e)/v);e=0.0}}break}default:{}}while(0);if(!(e>=0.0)){B=38;break}c[a+148+((1-w|0)*36|0)+32>>2]=0;c[a+128>>2]=0;c[a+128+4>>2]=0;c[a+128+8>>2]=0;c[a+128+12>>2]=0;c[a+368>>2]=1-w;d=c[a+148+(w*36|0)+32>>2]|0;k=c[C>>2]|0;if(d|0){b=0;do{m=a+148+(w*36|0)+(b<<2)|0;n=c[m>>2]|0;if(!(k&1<>2]|0;c[a+364>>2]=u+1;c[a+348+(u<<2)>>2]=n}else{c[a+148+((1-w|0)*36|0)+(c[a+148+((1-w|0)*36|0)+32>>2]<<2)>>2]=n;t=c[C+8+(b<<2)>>2]|0;u=c[a+148+((1-w|0)*36|0)+32>>2]|0;c[a+148+((1-w|0)*36|0)+32>>2]=u+1;c[a+148+((1-w|0)*36|0)+16+(u<<2)>>2]=t;u=c[m>>2]|0;E=(c[j>>2]=t,+g[j>>2]);F=E*+g[u+20>>2];G=E*+g[u+24>>2];g[a+128>>2]=+g[u+16>>2]*E+ +g[a+128>>2];g[a+132>>2]=F+ +g[a+132>>2];g[a+136>>2]=G+ +g[a+136>>2]}b=b+1|0}while((b|0)!=(d|0))}if((k|0)==15)c[a+376>>2]=1;y=y+1|0;if(y>>>0>=128){B=40;break}b=c[a+376>>2]|0}while(!(b|0));if((B|0)==6){c[a+376>>2]=1;B=41}else if((B|0)==9){y=c[a+368>>2]|0;x=(c[a+148+(y*36|0)+32>>2]|0)+-1|0;c[a+148+(y*36|0)+32>>2]=x;x=c[a+148+(y*36|0)+(x<<2)>>2]|0;y=c[a+364>>2]|0;c[a+364>>2]=y+1;c[a+348+(y<<2)>>2]=x;B=41}else if((B|0)==10){y=c[a+368>>2]|0;x=(c[a+148+(y*36|0)+32>>2]|0)+-1|0;c[a+148+(y*36|0)+32>>2]=x;x=c[a+148+(y*36|0)+(x<<2)>>2]|0;y=c[a+364>>2]|0;c[a+364>>2]=y+1;c[a+348+(y<<2)>>2]=x;B=41}else if((B|0)==38){b=c[a+368>>2]|0;y=(c[a+148+(b*36|0)+32>>2]|0)+-1|0;c[a+148+(b*36|0)+32>>2]=y;y=c[a+148+(b*36|0)+(y<<2)>>2]|0;b=c[a+364>>2]|0;c[a+364>>2]=b+1;c[a+348+(b<<2)>>2]=y;b=c[a+376>>2]|0}else if((B|0)==40){c[a+376>>2]=2;c[a+372>>2]=a+148+((c[a+368>>2]|0)*36|0);a=2;l=C;return a|0}if((B|0)==41)b=c[a+376>>2]|0;c[a+372>>2]=a+148+((c[a+368>>2]|0)*36|0);switch(b|0){case 0:{F=+g[a+128>>2];G=+g[a+132>>2];e=+g[a+136>>2];e=+D(+(F*F+G*G+e*e));break}case 1:{e=0.0;break}default:{a=b;l=C;return a|0}}g[a+144>>2]=e;a=b;l=C;return a|0}function Kc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0,H=0,I=0;r=l;l=l+144|0;m=c[b+48>>2]|0;j=c[b+52>>2]|0;if((j|0?(k=c[j+20>>2]|0,k|0):0)?(xb[c[(c[k>>2]|0)+56>>2]&127](k)|0)&1|0:0){c[r+48>>2]=1065353216;c[r+48+4>>2]=1065353216;c[r+48+8>>2]=0;g[r+48+12>>2]=0.0;k=c[b+8>>2]|0;p=c[(c[b+52>>2]|0)+20>>2]|0;o=c[(c[p>>2]|0)+16>>2]|0;x=+g[d>>2];E=+g[d+4>>2];A=+g[d+8>>2];v=+g[k+20>>2];s=+g[k+24>>2];w=+g[k+28>>2];t=+g[k+36>>2];z=+g[k+40>>2];B=+g[k+44>>2];u=+g[k+52>>2];C=+g[k+56>>2];y=+g[k+60>>2];g[r+24>>2]=x*+g[k+4>>2]+E*+g[k+8>>2]+A*+g[k+12>>2]+u;g[r+24+4>>2]=x*v+E*s+A*w+C;g[r+24+8>>2]=x*t+E*z+A*B+y;g[r+24+12>>2]=0.0;A=+g[d+16>>2];E=+g[d+20>>2];x=+g[d+24>>2];g[r>>2]=A*+g[k+4>>2]+E*+g[k+8>>2]+x*+g[k+12>>2]+u;g[r+4>>2]=A*v+E*s+x*w+C;g[r+8>>2]=A*t+E*z+x*B+y;g[r+12>>2]=0.0;Vb[o&127](p,r+24|0,r,r+48|0);p=c[(c[b+52>>2]|0)+20>>2]|0;o=c[(c[p>>2]|0)+16>>2]|0;y=+g[d+16>>2];B=+g[d+20>>2];x=+g[d+24>>2];z=+g[k+20>>2];E=+g[k+24>>2];t=+g[k+28>>2];A=+g[k+36>>2];C=+g[k+40>>2];w=+g[k+44>>2];s=+g[k+52>>2];v=+g[k+56>>2];u=+g[k+60>>2];g[r+24>>2]=y*+g[k+4>>2]+B*+g[k+8>>2]+x*+g[k+12>>2]+s;g[r+24+4>>2]=y*z+B*E+x*t+v;g[r+24+8>>2]=y*A+B*C+x*w+u;g[r+24+12>>2]=0.0;x=+g[d+32>>2];B=+g[d+36>>2];y=+g[d+40>>2];g[r>>2]=x*+g[k+4>>2]+B*+g[k+8>>2]+y*+g[k+12>>2]+s;g[r+4>>2]=x*z+B*E+y*t+v;g[r+8>>2]=x*A+B*C+y*w+u;g[r+12>>2]=0.0;Vb[o&127](p,r+24|0,r,r+48|0);p=c[(c[b+52>>2]|0)+20>>2]|0;o=c[(c[p>>2]|0)+16>>2]|0;u=+g[d+32>>2];w=+g[d+36>>2];y=+g[d+40>>2];C=+g[k+20>>2];B=+g[k+24>>2];A=+g[k+28>>2];x=+g[k+36>>2];v=+g[k+40>>2];t=+g[k+44>>2];E=+g[k+52>>2];z=+g[k+56>>2];s=+g[k+60>>2];g[r+24>>2]=u*+g[k+4>>2]+w*+g[k+8>>2]+y*+g[k+12>>2]+E;g[r+24+4>>2]=u*C+w*B+y*A+z;g[r+24+8>>2]=u*x+w*v+y*t+s;g[r+24+12>>2]=0.0;y=+g[d>>2];w=+g[d+4>>2];u=+g[d+8>>2];g[r>>2]=y*+g[k+4>>2]+w*+g[k+8>>2]+u*+g[k+12>>2]+E;g[r+4>>2]=y*C+w*B+u*A+z;g[r+8>>2]=y*x+w*v+u*t+s;g[r+12>>2]=0.0;Vb[o&127](p,r+24|0,r,r+48|0)}j=(((e<<21|f)+~(f<<15)|0)>>>10^(e<<21|f)+~(f<<15))*9|0;j=(c[b+108>>2]|0)+-1&(((j>>>6^j)+~((j>>>6^j)<<11)|0)>>>16^(j>>>6^j)+~((j>>>6^j)<<11));a:do if(j>>>0<(c[b+64>>2]|0)>>>0?(h=c[(c[b+72>>2]|0)+(j<<2)>>2]|0,(h|0)!=-1):0){j=c[b+132>>2]|0;while(1){if((e<<21|f|0)==(c[j+(h<<2)>>2]|0))break;h=c[(c[b+92>>2]|0)+(h<<2)>>2]|0;if((h|0)==-1)break a}j=c[b+112>>2]|0;if(j+(h<<3)|0){p=c[j+(h<<3)+4>>2]|0;q=c[b+8>>2]|0;c[p+8>>2]=c[(c[q+192>>2]|0)+8>>2];o=c[b+4>>2]|0;n=c[o+192>>2]|0;c[r+48>>2]=0;c[r+48+4>>2]=n;c[r+48+8>>2]=o;c[r+48+12>>2]=o+4;c[r+48+16>>2]=-1;c[r+48+20>>2]=-1;c[r+24>>2]=0;c[r+24+4>>2]=p;c[r+24+8>>2]=q;c[r+24+12>>2]=q+4;c[r+24+16>>2]=e;c[r+24+20>>2]=f;q=Db[c[(c[m>>2]|0)+8>>2]&1](m,r+48|0,r+24|0,0,+g[(c[b+44>>2]|0)+32>>2]>0.0?2:1)|0;Zb[c[(c[q>>2]|0)+8>>2]&31](q,r+48|0,r+24|0,c[b+52>>2]|0,c[b+44>>2]|0);Ib[c[c[q>>2]>>2]&511](q);Ob[c[(c[m>>2]|0)+60>>2]&127](m,q);l=r;return}}while(0);u=+g[d+16>>2];F=+g[d>>2];v=+g[d+20>>2];s=+g[d+4>>2];w=+g[d+24>>2];t=+g[d+8>>2];x=+g[d+32>>2];z=+g[d+36>>2];B=+g[d+40>>2];y=(v-s)*(B-t)-(w-t)*(z-s);A=(w-t)*(x-F)-(u-F)*(B-t);E=(u-F)*(z-s)-(v-s)*(x-F);C=1.0/+D(+(E*E+(y*y+A*A)));g[r+48>>2]=F+C*y*.05999999865889549;g[r+48+4>>2]=s+C*A*.05999999865889549;g[r+48+8>>2]=C*E*.05999999865889549+t;g[r+48+12>>2]=0.0;g[r+48+16>>2]=C*y*.05999999865889549+u;g[r+48+20>>2]=C*A*.05999999865889549+v;g[r+48+24>>2]=C*E*.05999999865889549+w;g[r+48+28>>2]=0.0;g[r+48+32>>2]=C*y*.05999999865889549+x;g[r+48+36>>2]=C*A*.05999999865889549+z;g[r+48+40>>2]=C*E*.05999999865889549+B;g[r+48+44>>2]=0.0;g[r+48+48>>2]=F-C*y*.05999999865889549;g[r+48+52>>2]=s-C*A*.05999999865889549;g[r+48+56>>2]=t-C*E*.05999999865889549;g[r+48+60>>2]=0.0;g[r+48+64>>2]=u-C*y*.05999999865889549;g[r+48+68>>2]=v-C*A*.05999999865889549;g[r+48+72>>2]=w-C*E*.05999999865889549;g[r+48+76>>2]=0.0;g[r+48+80>>2]=x-C*y*.05999999865889549;g[r+48+84>>2]=z-C*A*.05999999865889549;g[r+48+88>>2]=B-C*E*.05999999865889549;g[r+48+92>>2]=0.0;c[6995]=(c[6995]|0)+1;h=sc(135)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}lg(h,r+48|0,6,16);p=c[b+8>>2]|0;c[h+8>>2]=c[(c[p+192>>2]|0)+8>>2];o=c[b+4>>2]|0;d=c[o+192>>2]|0;c[r+24>>2]=0;c[r+24+4>>2]=d;c[r+24+8>>2]=o;c[r+24+12>>2]=o+4;c[r+24+16>>2]=-1;c[r+24+20>>2]=-1;c[r>>2]=0;c[r+4>>2]=h;c[r+8>>2]=p;c[r+12>>2]=p+4;c[r+16>>2]=e;c[r+20>>2]=f;p=Db[c[(c[m>>2]|0)+8>>2]&1](m,r+24|0,r,0,+g[(c[b+44>>2]|0)+32>>2]>0.0?2:1)|0;Zb[c[(c[p>>2]|0)+8>>2]&31](p,r+24|0,r,c[b+52>>2]|0,c[b+44>>2]|0);Ib[c[c[p>>2]>>2]&511](p);Ob[c[(c[m>>2]|0)+60>>2]&127](m,p);p=(((e<<21|f)+~(f<<15)|0)>>>10^(e<<21|f)+~(f<<15))*9|0;p=((p>>>6^p)+~((p>>>6^p)<<11)|0)>>>16^(p>>>6^p)+~((p>>>6^p)<<11);m=c[b+108>>2]|0;b:do if((p&m+-1)>>>0<(c[b+64>>2]|0)>>>0?(i=c[(c[b+72>>2]|0)+((p&m+-1)<<2)>>2]|0,(i|0)!=-1):0){j=c[b+132>>2]|0;while(1){if((e<<21|f|0)==(c[j+(i<<2)>>2]|0))break;i=c[(c[b+92>>2]|0)+(i<<2)>>2]|0;if((i|0)==-1){q=20;break b}}b=c[b+112>>2]|0;c[b+(i<<3)>>2]=e<<21|f;c[b+(i<<3)+4>>2]=h}else q=20;while(0);if((q|0)==20){o=c[b+104>>2]|0;if((o|0)==(m|0)){d=m|0?m<<1:1;if((m|0)<(d|0)){if(!d){i=0;k=m}else{c[6995]=(c[6995]|0)+1;i=sc((d<<3|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}k=c[b+104>>2]|0}if((k|0)>0){j=0;do{I=(c[b+112>>2]|0)+(j<<3)|0;H=c[I+4>>2]|0;G=i+(j<<3)|0;c[G>>2]=c[I>>2];c[G+4>>2]=H;j=j+1|0}while((j|0)!=(k|0))}j=c[b+112>>2]|0;if(j|0){if(a[b+116>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[b+112>>2]=0}a[b+116>>0]=1;c[b+112>>2]=i;c[b+108>>2]=d;i=c[b+104>>2]|0}else i=m}else i=o;I=c[b+112>>2]|0;c[I+(i<<3)>>2]=e<<21|f;c[I+(i<<3)+4>>2]=h;c[b+104>>2]=(c[b+104>>2]|0)+1;h=c[b+124>>2]|0;if((h|0)==(c[b+128>>2]|0)?(n=h|0?h<<1:1,(h|0)<(n|0)):0){if(!n)k=0;else{c[6995]=(c[6995]|0)+1;h=sc((n<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}k=h;h=c[b+124>>2]|0}j=c[b+132>>2]|0;if((h|0)<=0)if(!j)h=b+136|0;else q=43;else{i=0;do{c[k+(i<<2)>>2]=c[j+(i<<2)>>2];i=i+1|0}while((i|0)!=(h|0));q=43}if((q|0)==43){if(a[b+136>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[b+132>>2]=0;h=b+136|0}a[h>>0]=1;c[b+132>>2]=k;c[b+128>>2]=n;h=c[b+124>>2]|0}c[(c[b+132>>2]|0)+(h<<2)>>2]=e<<21|f;c[b+124>>2]=(c[b+124>>2]|0)+1;n=c[b+108>>2]|0;if((m|0)<(n|0)){e=c[b+64>>2]|0;if((e|0)<(n|0)){if((c[b+68>>2]|0)<(n|0)){if(!n){h=0;j=e}else{c[6995]=(c[6995]|0)+1;h=sc((n<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}j=c[b+64>>2]|0}k=c[b+72>>2]|0;if((j|0)<=0)if(!k)i=b+76|0;else q=59;else{i=0;do{c[h+(i<<2)>>2]=c[k+(i<<2)>>2];i=i+1|0}while((i|0)!=(j|0));q=59}if((q|0)==59)if(!(a[b+76>>0]|0))i=b+76|0;else{c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);i=b+76|0}a[i>>0]=1;c[b+72>>2]=h;c[b+68>>2]=n;m=b+72|0}else{m=b+72|0;h=c[b+72>>2]|0}Yk(h+(e<<2)|0,0,(n<<2)-(e<<2)|0)|0;c[b+64>>2]=n;d=c[b+84>>2]|0;if((d|0)<(n|0)){if((c[b+88>>2]|0)<(n|0)){if(!n){h=0;j=d}else{c[6995]=(c[6995]|0)+1;h=sc((n<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}j=c[b+84>>2]|0}k=c[b+92>>2]|0;if((j|0)<=0)if(!k)i=b+96|0;else q=73;else{i=0;do{c[h+(i<<2)>>2]=c[k+(i<<2)>>2];i=i+1|0}while((i|0)!=(j|0));q=73}if((q|0)==73)if(!(a[b+96>>0]|0))i=b+96|0;else{c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);i=b+96|0}a[i>>0]=1;c[b+92>>2]=h;c[b+88>>2]=n}else h=c[b+92>>2]|0;Yk(h+(d<<2)|0,0,(n<<2)-(d<<2)|0)|0}c[b+84>>2]=n;if((n|0)>0){Yk(c[m>>2]|0,-1,n<<2|0)|0;Yk(c[b+92>>2]|0,-1,n<<2|0)|0}if((e|0)>0){k=c[b+132>>2]|0;i=c[m>>2]|0;j=c[b+92>>2]|0;h=0;do{I=c[k+(h<<2)>>2]|0;I=((I+~(I<<15)|0)>>>10^I+~(I<<15))*9|0;I=i+(((((I>>>6^I)+~((I>>>6^I)<<11)|0)>>>16^(I>>>6^I)+~((I>>>6^I)<<11))&(c[b+108>>2]|0)+-1)<<2)|0;c[j+(h<<2)>>2]=c[I>>2];c[I>>2]=h;h=h+1|0}while((h|0)!=(e|0))}}h=p&(c[b+108>>2]|0)+-1}else h=p&m+-1;I=(c[b+72>>2]|0)+(h<<2)|0;c[(c[b+92>>2]|0)+(o<<2)>>2]=c[I>>2];c[I>>2]=o}l=r;return}function Lc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0;u=l;l=l+48|0;A=1.0/+g[b+112>>2];B=1.0/+g[b+116>>2];C=1.0/+g[b+120>>2];v=+g[b+52>>2];w=A*+g[e>>2]+v;p=+g[b+56>>2];o=B*+g[e+4>>2]+p;r=+g[b+60>>2];q=C*+g[e+8>>2]+r;v=A*+g[f>>2]+v;p=B*+g[f+4>>2]+p;r=C*+g[f+8>>2]+r;C=+g[b+20>>2];w=w>2];o=o>2];q=q>2];w=z>2];o=y>2];q=x>2]|0)+-1|0;f=(c[b+72>>2]|0)+-1|0;switch(c[b+108>>2]|0){case 0:{f=(e|0)<(f|0)?e:f;e=(h|0)>0?h:0;k=(j|0)<(k|0)?j:k;n=(n|0)>0?n:0;break}case 1:{f=(e|0)<(f|0)?e:f;e=(h|0)>0?h:0;k=(i|0)<(k|0)?i:k;n=(m|0)>0?m:0;break}case 2:{f=(j|0)<(f|0)?j:f;e=(n|0)>0?n:0;k=(i|0)<(k|0)?i:k;n=(m|0)>0?m:0;break}default:{e=0;n=0}}if((e|0)>=(f|0)){l=u;return}s=(n|0)<(k|0);do if(s){j=(e&1|0)==0;m=e+1|0;r=+(e|0);h=n;while(1){do if(!(a[b+104>>0]|0)){if(a[b+105>>0]|0?(h+e&1|0)==0:0){t=16;break}if(!(j&(a[b+106>>0]|0)!=0)){o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,h,e);switch(c[b+108>>2]|0){case 0:{q=+(h|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=r-+g[b+88>>2]*.5;t=52;break}case 1:{q=o-+g[b+56>>2];p=+(h|0)-+g[b+84>>2]*.5;o=r-+g[b+88>>2]*.5;t=52;break}case 2:{q=r-+g[b+88>>2]*.5;p=+(h|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=52;break}default:{p=+g[u>>2];q=+g[u+4>>2];o=+g[u+8>>2]}}if((t|0)==52){t=0;g[u>>2]=p;g[u+4>>2]=q;g[u+8>>2]=o;g[u+12>>2]=0.0}g[u>>2]=p*+g[b+112>>2];g[u+4>>2]=q*+g[b+116>>2];g[u+8>>2]=o*+g[b+120>>2];o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,h,m);switch(c[b+108>>2]|0){case 0:{q=+(h|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=+(m|0)-+g[b+88>>2]*.5;t=58;break}case 1:{q=o-+g[b+56>>2];p=+(h|0)-+g[b+84>>2]*.5;o=+(m|0)-+g[b+88>>2]*.5;t=58;break}case 2:{q=+(m|0)-+g[b+88>>2]*.5;p=+(h|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=58;break}default:{p=+g[u+16>>2];q=+g[u+20>>2];o=+g[u+24>>2]}}if((t|0)==58){t=0;g[u+16>>2]=p;g[u+20>>2]=q;g[u+24>>2]=o;g[u+28>>2]=0.0}g[u+16>>2]=p*+g[b+112>>2];g[u+20>>2]=q*+g[b+116>>2];g[u+24>>2]=o*+g[b+120>>2];i=h+1|0;o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,i,e);switch(c[b+108>>2]|0){case 0:{q=+(i|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=r-+g[b+88>>2]*.5;t=64;break}case 1:{q=o-+g[b+56>>2];p=+(i|0)-+g[b+84>>2]*.5;o=r-+g[b+88>>2]*.5;t=64;break}case 2:{q=r-+g[b+88>>2]*.5;p=+(i|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=64;break}default:{p=+g[u+32>>2];q=+g[u+36>>2];o=+g[u+40>>2]}}if((t|0)==64){t=0;g[u+32>>2]=p;g[u+36>>2]=q;g[u+40>>2]=o;g[u+44>>2]=0.0}g[u+32>>2]=p*+g[b+112>>2];g[u+36>>2]=q*+g[b+116>>2];g[u+40>>2]=o*+g[b+120>>2];Vb[c[(c[d>>2]|0)+8>>2]&127](d,u,h,e);o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,i,e);switch(c[b+108>>2]|0){case 0:{q=+(i|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=r-+g[b+88>>2]*.5;t=70;break}case 1:{q=o-+g[b+56>>2];p=+(i|0)-+g[b+84>>2]*.5;o=r-+g[b+88>>2]*.5;t=70;break}case 2:{q=r-+g[b+88>>2]*.5;p=+(i|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=70;break}default:{p=+g[u>>2];q=+g[u+4>>2];o=+g[u+8>>2]}}if((t|0)==70){t=0;g[u>>2]=p;g[u+4>>2]=q;g[u+8>>2]=o;g[u+12>>2]=0.0}g[u>>2]=p*+g[b+112>>2];g[u+4>>2]=q*+g[b+116>>2];g[u+8>>2]=o*+g[b+120>>2];o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,i,m);switch(c[b+108>>2]|0){case 0:{q=+(i|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=+(m|0)-+g[b+88>>2]*.5;t=76;break}case 1:{q=o-+g[b+56>>2];p=+(i|0)-+g[b+84>>2]*.5;o=+(m|0)-+g[b+88>>2]*.5;t=76;break}case 2:{q=+(m|0)-+g[b+88>>2]*.5;p=+(i|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=76;break}default:{p=+g[u+32>>2];q=+g[u+36>>2];o=+g[u+40>>2]}}if((t|0)==76){t=0;g[u+32>>2]=p;g[u+36>>2]=q;g[u+40>>2]=o;g[u+44>>2]=0.0}g[u+32>>2]=p*+g[b+112>>2];g[u+36>>2]=q*+g[b+116>>2];g[u+40>>2]=o*+g[b+120>>2];Vb[c[(c[d>>2]|0)+8>>2]&127](d,u,h,e);h=i}else t=16}else t=16;while(0);if((t|0)==16){t=0;o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,h,e);switch(c[b+108>>2]|0){case 0:{q=+(h|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=r-+g[b+88>>2]*.5;t=21;break}case 1:{q=o-+g[b+56>>2];p=+(h|0)-+g[b+84>>2]*.5;o=r-+g[b+88>>2]*.5;t=21;break}case 2:{q=r-+g[b+88>>2]*.5;p=+(h|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=21;break}default:{p=+g[u>>2];q=+g[u+4>>2];o=+g[u+8>>2]}}if((t|0)==21){t=0;g[u>>2]=p;g[u+4>>2]=q;g[u+8>>2]=o;g[u+12>>2]=0.0}g[u>>2]=p*+g[b+112>>2];g[u+4>>2]=q*+g[b+116>>2];g[u+8>>2]=o*+g[b+120>>2];o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,h,m);switch(c[b+108>>2]|0){case 0:{q=+(h|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=+(m|0)-+g[b+88>>2]*.5;t=27;break}case 1:{q=o-+g[b+56>>2];p=+(h|0)-+g[b+84>>2]*.5;o=+(m|0)-+g[b+88>>2]*.5;t=27;break}case 2:{q=+(m|0)-+g[b+88>>2]*.5;p=+(h|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=27;break}default:{p=+g[u+16>>2];q=+g[u+20>>2];o=+g[u+24>>2]}}if((t|0)==27){t=0;g[u+16>>2]=p;g[u+20>>2]=q;g[u+24>>2]=o;g[u+28>>2]=0.0}g[u+16>>2]=p*+g[b+112>>2];g[u+20>>2]=q*+g[b+116>>2];g[u+24>>2]=o*+g[b+120>>2];i=h+1|0;o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,i,m);switch(c[b+108>>2]|0){case 0:{q=+(i|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=+(m|0)-+g[b+88>>2]*.5;t=33;break}case 1:{q=o-+g[b+56>>2];p=+(i|0)-+g[b+84>>2]*.5;o=+(m|0)-+g[b+88>>2]*.5;t=33;break}case 2:{q=+(m|0)-+g[b+88>>2]*.5;p=+(i|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=33;break}default:{p=+g[u+32>>2];q=+g[u+36>>2];o=+g[u+40>>2]}}if((t|0)==33){t=0;g[u+32>>2]=p;g[u+36>>2]=q;g[u+40>>2]=o;g[u+44>>2]=0.0}g[u+32>>2]=p*+g[b+112>>2];g[u+36>>2]=q*+g[b+116>>2];g[u+40>>2]=o*+g[b+120>>2];Vb[c[(c[d>>2]|0)+8>>2]&127](d,u,h,e);o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,i,m);switch(c[b+108>>2]|0){case 0:{q=+(i|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=+(m|0)-+g[b+88>>2]*.5;t=39;break}case 1:{q=o-+g[b+56>>2];p=+(i|0)-+g[b+84>>2]*.5;o=+(m|0)-+g[b+88>>2]*.5;t=39;break}case 2:{q=+(m|0)-+g[b+88>>2]*.5;p=+(i|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=39;break}default:{p=+g[u+16>>2];q=+g[u+20>>2];o=+g[u+24>>2]}}if((t|0)==39){t=0;g[u+16>>2]=p;g[u+20>>2]=q;g[u+24>>2]=o;g[u+28>>2]=0.0}g[u+16>>2]=p*+g[b+112>>2];g[u+20>>2]=q*+g[b+116>>2];g[u+24>>2]=o*+g[b+120>>2];o=+qb[c[(c[b>>2]|0)+68>>2]&31](b,i,e);switch(c[b+108>>2]|0){case 0:{q=+(i|0)-+g[b+84>>2]*.5;p=o-+g[b+52>>2];o=r-+g[b+88>>2]*.5;t=45;break}case 1:{q=o-+g[b+56>>2];p=+(i|0)-+g[b+84>>2]*.5;o=r-+g[b+88>>2]*.5;t=45;break}case 2:{q=r-+g[b+88>>2]*.5;p=+(i|0)-+g[b+84>>2]*.5;o=o-+g[b+60>>2];t=45;break}default:{p=+g[u+32>>2];q=+g[u+36>>2];o=+g[u+40>>2]}}if((t|0)==45){t=0;g[u+32>>2]=p;g[u+36>>2]=q;g[u+40>>2]=o;g[u+44>>2]=0.0}g[u+32>>2]=p*+g[b+112>>2];g[u+36>>2]=q*+g[b+116>>2];g[u+40>>2]=o*+g[b+120>>2];Vb[c[(c[d>>2]|0)+8>>2]&127](d,u,h,e);h=i}if((h|0)==(k|0)){e=m;break}}}else e=e+1|0;while((e|0)!=(f|0));l=u;return}function Mc(b,d,e,f,h,i,j,k){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=+i;j=+j;k=k|0;var m=0,n=0.0,o=0,p=0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0,K=0.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.0,Y=0.0,Z=0.0,_=0,$=0;W=l;l=l+16|0;m=c[h+4>>2]|0;if((m|0)<0){if((c[h+8>>2]|0)<0){o=c[h+12>>2]|0;if(o|0){if(a[h+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0)}c[h+12>>2]=0}a[h+16>>0]=1;c[h+12>>2]=0;c[h+8>>2]=0}do{V=(c[h+12>>2]|0)+(m<<4)|0;c[V>>2]=c[W>>2];c[V+4>>2]=c[W+4>>2];c[V+8>>2]=c[W+8>>2];c[V+12>>2]=c[W+12>>2];m=m+1|0}while((m|0)!=0)}c[h+4>>2]=0;r=c[f+4>>2]|0;if((c[h+8>>2]|0)<(r|0)){if(r){c[6995]=(c[6995]|0)+1;m=sc((r<<4|3)+16|0)|0;if(!m)m=0;else{c[(m+4+15&-16)+-4>>2]=m;m=m+4+15&-16}p=c[h+4>>2]|0;if((p|0)>0){o=0;do{V=m+(o<<4)|0;U=(c[h+12>>2]|0)+(o<<4)|0;c[V>>2]=c[U>>2];c[V+4>>2]=c[U+4>>2];c[V+8>>2]=c[U+8>>2];c[V+12>>2]=c[U+12>>2];o=o+1|0}while((o|0)!=(p|0));p=h+12|0}else p=h+12|0}else{m=0;p=h+12|0}o=c[p>>2]|0;if(o|0){if(a[h+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0)}c[p>>2]=0}a[h+16>>0]=1;c[p>>2]=m;c[h+8>>2]=r}p=c[d+28>>2]|0;if((p|0)<=0){l=W;return}V=c[d+36>>2]|0;E=+g[e>>2];F=+g[e+4>>2];G=+g[e+8>>2];H=+g[e+16>>2];v=+g[e+20>>2];t=+g[e+24>>2];s=+g[e+32>>2];q=+g[e+36>>2];n=+g[e+40>>2];w=+g[b>>2];x=+g[b+4>>2];y=+g[b+8>>2];U=-1;u=3402823466385288598117041.0e14;m=0;while(1){z=+g[V+(m*36|0)+20>>2];A=+g[V+(m*36|0)+24>>2];B=+g[V+(m*36|0)+28>>2];o=(z*E+A*F+B*G)*w+(z*H+A*v+B*t)*x+(z*s+A*q+B*n)*y>2]|0;if((N|0)>0){O=V+(U*36|0)+12|0;P=V+(U*36|0)+20|0;Q=V+(U*36|0)+24|0;R=V+(U*36|0)+28|0;M=0;x=E;y=F;u=G;w=H;while(1){J=c[O>>2]|0;m=c[J+(M<<2)>>2]|0;I=c[d+16>>2]|0;M=M+1|0;L=(M|0)==(N|0);J=c[J+((L?0:M)<<2)>>2]|0;X=+g[I+(m<<4)>>2];Y=X-+g[I+(J<<4)>>2];z=+g[I+(m<<4)+4>>2];Z=z-+g[I+(J<<4)+4>>2];A=+g[I+(m<<4)+8>>2];F=A-+g[I+(J<<4)+8>>2];B=Y*x+Z*y+F*u;E=Y*w+Z*v+F*t;F=Y*s+Z*q+F*n;Z=+g[P>>2];Y=+g[Q>>2];K=+g[R>>2];G=x*Z+y*Y+u*K;H=w*Z+v*Y+t*K;K=s*Z+q*Y+n*K;A=(X*x+z*y+A*u+ +g[e+48>>2])*-(E*K-F*H)+(X*w+z*v+A*t+ +g[e+52>>2])*-(F*G-B*K)+(X*s+z*q+A*n+ +g[e+56>>2])*-(B*H-E*G);J=f;I=h;m=c[J+4>>2]|0;if((m|0)>=2){p=c[J+12>>2]|0;s=+g[p+(m+-1<<4)>>2];u=+g[p+(m+-1<<4)+4>>2];v=+g[p+(m+-1<<4)+8>>2];o=0;q=s*-(E*K-F*H)+u*-(F*G-B*K)+v*-(B*H-E*G)-A;while(1){x=+g[p+(o<<4)>>2];y=+g[p+(o<<4)+4>>2];z=+g[p+(o<<4)+8>>2];n=+g[p+(o<<4)+12>>2];w=x*-(E*K-F*H)+y*-(F*G-B*K)+z*-(B*H-E*G)-A;do if(q<0.0)if(w<0.0){r=c[I+4>>2]|0;if((r|0)!=(c[I+8>>2]|0)){t=x;s=y;q=z;C=87;break}D=r|0?r<<1:1;if((r|0)>=(D|0)){t=x;s=y;q=z;C=87;break}if(!D)p=0;else{c[6995]=(c[6995]|0)+1;p=sc((D<<4|3)+16|0)|0;if(!p)p=0;else{c[(p+4+15&-16)+-4>>2]=p;p=p+4+15&-16}r=c[I+4>>2]|0}if((r|0)>0){C=0;do{_=p+(C<<4)|0;$=(c[I+12>>2]|0)+(C<<4)|0;c[_>>2]=c[$>>2];c[_+4>>2]=c[$+4>>2];c[_+8>>2]=c[$+8>>2];c[_+12>>2]=c[$+12>>2];C=C+1|0}while((C|0)!=(r|0))}r=c[I+12>>2]|0;if(r|0){if(a[I+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[r+-4>>2]|0)}c[I+12>>2]=0}a[I+16>>0]=1;c[I+12>>2]=p;c[I+8>>2]=D;r=c[I+4>>2]|0;t=x;s=y;q=z;C=87;break}else{q=q/(q-w);t=s+(x-s)*q;s=u+(y-u)*q;q=v+(z-v)*q;r=c[I+4>>2]|0;if((r|0)!=(c[I+8>>2]|0)){n=0.0;C=87;break}D=r|0?r<<1:1;if((r|0)>=(D|0)){n=0.0;C=87;break}if(!D)p=0;else{c[6995]=(c[6995]|0)+1;p=sc((D<<4|3)+16|0)|0;if(!p)p=0;else{c[(p+4+15&-16)+-4>>2]=p;p=p+4+15&-16}r=c[I+4>>2]|0}if((r|0)>0){C=0;do{$=p+(C<<4)|0;_=(c[I+12>>2]|0)+(C<<4)|0;c[$>>2]=c[_>>2];c[$+4>>2]=c[_+4>>2];c[$+8>>2]=c[_+8>>2];c[$+12>>2]=c[_+12>>2];C=C+1|0}while((C|0)!=(r|0))}r=c[I+12>>2]|0;if(r|0){if(a[I+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[r+-4>>2]|0)}c[I+12>>2]=0}a[I+16>>0]=1;c[I+12>>2]=p;c[I+8>>2]=D;r=c[I+4>>2]|0;n=0.0;C=87;break}else if(w<0.0){q=q/(q-w);t=s+(x-s)*q;s=u+(y-u)*q;q=v+(z-v)*q;r=c[I+4>>2]|0;if((r|0)==(c[I+8>>2]|0)?(S=r|0?r<<1:1,(r|0)<(S|0)):0){if(!S)p=0;else{c[6995]=(c[6995]|0)+1;p=sc((S<<4|3)+16|0)|0;if(!p)p=0;else{c[(p+4+15&-16)+-4>>2]=p;p=p+4+15&-16}r=c[I+4>>2]|0}if((r|0)>0){C=0;do{$=p+(C<<4)|0;_=(c[I+12>>2]|0)+(C<<4)|0;c[$>>2]=c[_>>2];c[$+4>>2]=c[_+4>>2];c[$+8>>2]=c[_+8>>2];c[$+12>>2]=c[_+12>>2];C=C+1|0}while((C|0)!=(r|0))}r=c[I+12>>2]|0;if(r|0){if(a[I+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[r+-4>>2]|0)}c[I+12>>2]=0}a[I+16>>0]=1;c[I+12>>2]=p;c[I+8>>2]=S;p=c[I+4>>2]|0}else p=r;r=c[I+12>>2]|0;g[r+(p<<4)>>2]=t;g[r+(p<<4)+4>>2]=s;g[r+(p<<4)+8>>2]=q;g[r+(p<<4)+12>>2]=0.0;r=(c[I+4>>2]|0)+1|0;c[I+4>>2]=r;if((r|0)==(c[I+8>>2]|0)?(T=r|0?r<<1:1,(r|0)<(T|0)):0){if(!T)p=0;else{c[6995]=(c[6995]|0)+1;p=sc((T<<4|3)+16|0)|0;if(!p)p=0;else{c[(p+4+15&-16)+-4>>2]=p;p=p+4+15&-16}r=c[I+4>>2]|0}if((r|0)>0){C=0;do{$=p+(C<<4)|0;_=(c[I+12>>2]|0)+(C<<4)|0;c[$>>2]=c[_>>2];c[$+4>>2]=c[_+4>>2];c[$+8>>2]=c[_+8>>2];c[$+12>>2]=c[_+12>>2];C=C+1|0}while((C|0)!=(r|0))}r=c[I+12>>2]|0;if(r|0){if(a[I+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[r+-4>>2]|0)}c[I+12>>2]=0}a[I+16>>0]=1;c[I+12>>2]=p;c[I+8>>2]=T;r=c[I+4>>2]|0;t=x;s=y;q=z;C=87}else{t=x;s=y;q=z;C=87}}while(0);if((C|0)==87){C=0;$=c[I+12>>2]|0;g[$+(r<<4)>>2]=t;g[$+(r<<4)+4>>2]=s;g[$+(r<<4)+8>>2]=q;g[$+(r<<4)+12>>2]=n;c[I+4>>2]=(c[I+4>>2]|0)+1}o=o+1|0;if((o|0)==(m|0))break;q=w;s=x;v=z;u=y;p=c[J+12>>2]|0}m=c[J+4>>2]|0}if((m|0)<0){if((c[J+8>>2]|0)<0){o=c[J+12>>2]|0;if(o|0){if(a[J+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0)}c[J+12>>2]=0}a[J+16>>0]=1;c[J+12>>2]=0;c[J+8>>2]=0}do{$=(c[J+12>>2]|0)+(m<<4)|0;c[$>>2]=c[W>>2];c[$+4>>2]=c[W+4>>2];c[$+8>>2]=c[W+8>>2];c[$+12>>2]=c[W+12>>2];m=m+1|0}while((m|0)!=0)}c[J+4>>2]=0;x=+g[e>>2];y=+g[e+4>>2];u=+g[e+8>>2];w=+g[e+16>>2];v=+g[e+20>>2];t=+g[e+24>>2];s=+g[e+32>>2];q=+g[e+36>>2];n=+g[e+40>>2];if(L){p=P;o=Q;m=R;C=e+48|0;D=e+52|0;r=e+56|0;break}else{$=f;f=h;h=$}}}else{p=V+(U*36|0)+20|0;o=V+(U*36|0)+24|0;m=V+(U*36|0)+28|0;C=e+48|0;D=e+52|0;r=e+56|0;h=f;x=E;y=F;u=G;w=H}X=+g[p>>2];Y=+g[o>>2];Z=+g[m>>2];u=X*x+Y*y+Z*u;t=X*w+Y*v+Z*t;s=X*s+Y*q+Z*n;q=+g[V+(U*36|0)+32>>2]-(u*+g[C>>2]+t*+g[D>>2]+s*+g[r>>2]);m=c[h+4>>2]|0;if((m|0)<=0){l=W;return}p=0;do{o=c[h+12>>2]|0;n=q+(u*+g[o+(p<<4)>>2]+t*+g[o+(p<<4)+4>>2]+s*+g[o+(p<<4)+8>>2]);n=n<=i?i:n;if(n<=j){m=o+(p<<4)|0;c[W>>2]=c[m>>2];c[W+4>>2]=c[m+4>>2];c[W+8>>2]=c[m+8>>2];c[W+12>>2]=c[m+12>>2];Tb[c[(c[k>>2]|0)+16>>2]&15](k,b,W,n);m=c[h+4>>2]|0}p=p+1|0}while((p|0)<(m|0));l=W;return}function Nc(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=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;x=l;l=l+16|0;j=c[b+228>>2]|0;i=c[b+196>>2]|0;if((i|0)<(j|0)){if((c[b+200>>2]|0)<(j|0)){if(!j){e=0;h=i}else{c[6995]=(c[6995]|0)+1;e=sc((j<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}h=c[b+196>>2]|0}if((h|0)>0){f=0;do{c[e+(f<<2)>>2]=c[(c[b+204>>2]|0)+(f<<2)>>2];f=f+1|0}while((f|0)!=(h|0))}f=c[b+204>>2]|0;if(f|0){if(a[b+208>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+204>>2]=0}a[b+208>>0]=1;c[b+204>>2]=e;c[b+200>>2]=j;f=b+204|0}else f=b+204|0;e=i;do{c[(c[f>>2]|0)+(e<<2)>>2]=0;e=e+1|0}while((e|0)!=(j|0))}else f=b+204|0;c[b+196>>2]=j;e=0;while(1){if((e|0)>=(xb[c[(c[b>>2]|0)+104>>2]&127](b)|0))break;c[(c[f>>2]|0)+(e<<2)>>2]=c[(c[b+236>>2]|0)+(e<<2)>>2];e=e+1|0}e=c[b+196>>2]|0;if((e|0)>1)Ni(b+192|0,0,e+-1|0);if(!(xb[c[(c[b>>2]|0)+104>>2]&127](b)|0))e=0;else e=c[f>>2]|0;h=c[b+212>>2]|0;t=c[b+196>>2]|0;u=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;c[h+4>>2]=d;c[h+12>>2]=e;c[h+16>>2]=t;c[h+20>>2]=u;e=c[h+32>>2]|0;if((e|0)<0){if((c[h+36>>2]|0)<0){f=c[h+40>>2]|0;if(f|0){if(a[h+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[h+40>>2]=0}a[h+44>>0]=1;c[h+40>>2]=0;c[h+36>>2]=0}do{c[(c[h+40>>2]|0)+(e<<2)>>2]=0;e=e+1|0}while((e|0)!=0)}c[h+32>>2]=0;e=c[h+52>>2]|0;if((e|0)<0){if((c[h+56>>2]|0)<0){f=c[h+60>>2]|0;if(f|0){if(a[h+64>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[h+60>>2]=0}a[h+64>>0]=1;c[h+60>>2]=0;c[h+56>>2]=0}do{c[(c[h+60>>2]|0)+(e<<2)>>2]=0;e=e+1|0}while((e|0)!=0)}c[h+52>>2]=0;e=c[h+72>>2]|0;if((e|0)<0){if((c[h+76>>2]|0)<0){f=c[h+80>>2]|0;if(f|0){if(a[h+84>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[h+80>>2]=0}a[h+84>>0]=1;c[h+80>>2]=0;c[h+76>>2]=0}do{c[(c[h+80>>2]|0)+(e<<2)>>2]=0;e=e+1|0}while((e|0)!=0)}c[h+72>>2]=0;u=c[b+216>>2]|0;e=c[(c[u>>2]|0)+8>>2]|0;s=c[b+8>>2]|0;t=c[b+24>>2]|0;t=xb[c[(c[t>>2]|0)+36>>2]&127](t)|0;Sb[e&127](u,s,t);t=c[b+220>>2]|0;s=c[b+24>>2]|0;u=c[b+212>>2]|0;e=c[t+28>>2]|0;if((e|0)<0){if((c[t+32>>2]|0)<0){f=c[t+36>>2]|0;if(f|0){if(a[t+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[t+36>>2]=0}a[t+40>>0]=1;c[t+36>>2]=0;c[t+32>>2]=0}do{c[(c[t+36>>2]|0)+(e<<2)>>2]=0;e=e+1|0}while((e|0)!=0)}c[t+28>>2]=0;j=c[t+8>>2]|0;if((j|0)>0){k=c[t+16>>2]|0;i=0;do{m=k+(i<<3)|0;e=c[m>>2]|0;if((e|0)==(i|0))e=i;else{f=e;h=m;do{e=k+(f<<3)|0;c[h>>2]=c[e>>2];e=c[e>>2]|0;h=k+(e<<3)|0;f=c[h>>2]|0}while((e|0)!=(f|0))}c[m>>2]=e;i=i+1|0}while((i|0)!=(j|0));if((j|0)>1){vj(t+4|0,0,j+-1|0);j=c[t+8>>2]|0}if((j|0)>0){o=c[t+16>>2]|0;e=0;while(1){p=c[o+(e<<3)>>2]|0;m=e;while(1){k=m+1|0;if((k|0)>=(j|0)){n=0;break}if((c[o+(k<<3)>>2]|0)==(p|0))m=k;else{n=1;break}}a:do if((e|0)<=(m|0)){q=c[b+16>>2]|0;f=1;i=e;while(1){h=c[q+(c[o+(i<<3)+4>>2]<<2)>>2]|0;if((c[h+208>>2]|0)==(p|0)){h=c[h+220>>2]|0;f=(h|0)!=4&(f&(h|0)!=1)}if((i|0)<(m|0))i=i+1|0;else break}if(f)while(1){f=c[q+(c[o+(e<<3)+4>>2]<<2)>>2]|0;if((c[f+208>>2]|0)==(p|0)?(c[f+220>>2]&-2|0)!=4:0)c[f+220>>2]=2;if((e|0)>=(m|0))break a;e=e+1|0}else while(1){f=c[q+(c[o+(e<<3)+4>>2]<<2)>>2]|0;if((c[f+208>>2]|0)==(p|0)?(c[f+220>>2]|0)==2:0){c[f+220>>2]=3;g[f+224>>2]=0.0}if((e|0)>=(m|0))break a;e=e+1|0}}while(0);if(n)e=k;else break}}}j=xb[c[(c[s>>2]|0)+36>>2]&127](s)|0;if((j|0)>0){i=0;do{k=zb[c[(c[s>>2]|0)+40>>2]&31](s,i)|0;f=c[k+772>>2]|0;h=c[k+776>>2]|0;if((f|0)!=0?(c[f+220>>2]|0)!=2:0)e=94;else e=92;if(((e|0)==92?(e=0,h|0):0)?(c[h+220>>2]|0)!=2:0)e=94;if((e|0)==94){e=c[f+204>>2]|0;if((e&2|0?((e&4|0)==0?(c[f+220>>2]|0)!=2:0):0)?(c[h+204>>2]&3|0)==0:0){if((c[h+220>>2]&-2|0)!=4)c[h+220>>2]=1;g[h+224>>2]=0.0}q=c[h+204>>2]|0;if(q&2|0?((q&4|e&3|0)==0?(c[h+220>>2]|0)!=2:0):0){if((c[f+220>>2]&-2|0)!=4)c[f+220>>2]=1;g[f+224>>2]=0.0}if(a[t+64>>0]|0?Bb[c[(c[s>>2]|0)+28>>2]&63](s,f,h)|0:0){f=c[t+28>>2]|0;if((f|0)==(c[t+32>>2]|0)?(r=f|0?f<<1:1,(f|0)<(r|0)):0){if(!r)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((r<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[t+28>>2]|0}if((f|0)>0){h=0;do{c[e+(h<<2)>>2]=c[(c[t+36>>2]|0)+(h<<2)>>2];h=h+1|0}while((h|0)!=(f|0))}h=c[t+36>>2]|0;if(h){if(a[t+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);f=c[t+28>>2]|0}c[t+36>>2]=0}a[t+40>>0]=1;c[t+36>>2]=e;c[t+32>>2]=r;e=f}else e=f;c[(c[t+36>>2]|0)+(e<<2)>>2]=k;c[t+28>>2]=e+1}}i=i+1|0}while((i|0)<(j|0));e=t+64|0}else e=t+64|0;r=c[t+8>>2]|0;if(!(a[e>>0]|0)){w=xb[c[(c[s>>2]|0)+44>>2]&127](s)|0;v=xb[c[(c[s>>2]|0)+36>>2]&127](s)|0;$b[c[(c[u>>2]|0)+8>>2]&7](u,c[b+16>>2]|0,c[b+8>>2]|0,w,v,-1);v=c[b+212>>2]|0;gh(v);v=c[b+216>>2]|0;u=c[v>>2]|0;u=u+16|0;u=c[u>>2]|0;w=b+72|0;w=c[w>>2]|0;Sb[u&127](v,d,w);l=x;return}q=c[t+28>>2]|0;if((q|0)>1)Ji(t+24|0,0,q+-1|0);if((r|0)<=0){v=c[b+212>>2]|0;gh(v);v=c[b+216>>2]|0;u=c[v>>2]|0;u=u+16|0;u=c[u>>2]|0;w=b+72|0;w=c[w>>2]|0;Sb[u&127](v,d,w);l=x;return}e=0;n=1;p=0;while(1){f=c[t+16>>2]|0;o=c[f+(e<<3)>>2]|0;b:do if((e|0)<(r|0)){i=1;j=c[t+48>>2]|0;h=c[t+52>>2]|0;while(1){m=c[(c[b+16>>2]|0)+(c[f+(e<<3)+4>>2]<<2)>>2]|0;if((j|0)==(h|0)){k=h|0?h<<1:1;if((h|0)<(k|0)){if(!k)f=0;else{c[6995]=(c[6995]|0)+1;f=sc((k<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[t+48>>2]|0}if((h|0)>0){j=0;do{c[f+(j<<2)>>2]=c[(c[t+56>>2]|0)+(j<<2)>>2];j=j+1|0}while((j|0)!=(h|0))}j=c[t+56>>2]|0;if(j){if(a[t+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);h=c[t+48>>2]|0}c[t+56>>2]=0}a[t+60>>0]=1;c[t+56>>2]=f;c[t+52>>2]=k;f=h;h=k}else f=h}else f=j;c[(c[t+56>>2]|0)+(f<<2)>>2]=m;j=f+1|0;c[t+48>>2]=j;s=c[m+220>>2]|0;i=i&((s|0)==2|(s|0)==5);e=e+1|0;if((e|0)>=(r|0)){k=e;f=i;break b}f=c[t+16>>2]|0;if((c[f+(e<<3)>>2]|0)!=(o|0)){k=e;f=i;break}}}else{k=e;f=1}while(0);if((p|0)<(q|0)?(v=c[t+36>>2]|0,w=v+(p<<2)|0,s=c[w>>2]|0,m=c[s+772>>2]|0,(c[((c[m+208>>2]|0)>-1?m:c[s+776>>2]|0)+208>>2]|0)==(o|0)):0){e=p;do{e=e+1|0;if((e|0)>=(q|0))break;s=c[v+(e<<2)>>2]|0;n=c[s+772>>2]|0}while((o|0)==(c[((c[n+208>>2]|0)>-1?n:c[s+776>>2]|0)+208>>2]|0));h=w;i=e-p|0;j=e}else{h=0;i=0;j=n}if(!f)$b[c[(c[u>>2]|0)+8>>2]&7](u,c[t+56>>2]|0,c[t+48>>2]|0,h,i,o);p=(i|0)==0?p:j;e=c[t+48>>2]|0;if((e|0)<0){if((c[t+52>>2]|0)<0){f=c[t+56>>2]|0;if(f|0){if(a[t+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[t+56>>2]=0}a[t+60>>0]=1;c[t+56>>2]=0;c[t+52>>2]=0}do{c[(c[t+56>>2]|0)+(e<<2)>>2]=0;e=e+1|0}while((e|0)!=0)}c[t+48>>2]=0;if((k|0)>=(r|0))break;else{e=k;n=j}}v=c[b+212>>2]|0;gh(v);v=c[b+216>>2]|0;u=c[v>>2]|0;u=u+16|0;u=c[u>>2]|0;w=b+72|0;w=c[w>>2]|0;Sb[u&127](v,d,w);l=x;return}function Oc(b){b=b|0;var d=0.0,e=0.0,f=0,h=0.0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0.0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0;u=l;l=l+176|0;if(!(a[b+738>>0]|0)){l=u;return}g[b+36>>2]=0.0;g[b+744>>2]=0.0;if(!(a[b+736>>0]|0)){f=c[b+28>>2]|0;j=+g[b+600>>2];k=+g[b+604>>2];q=+g[b+608>>2];s=j*+g[f+20>>2]+k*+g[f+24>>2]+q*+g[f+28>>2]+ +g[f+56>>2];i=c[b+32>>2]|0;m=+g[b+664>>2];n=+g[b+668>>2];r=+g[b+672>>2];t=m*+g[i+20>>2]+n*+g[i+24>>2]+r*+g[i+28>>2]+ +g[i+56>>2];o=m*+g[i+36>>2]+n*+g[i+40>>2]+r*+g[i+44>>2]+ +g[i+60>>2];p=j*+g[f+4>>2]+k*+g[f+8>>2]+q*+g[f+12>>2]+ +g[f+52>>2];q=j*+g[f+36>>2]+k*+g[f+40>>2]+q*+g[f+44>>2]+ +g[f+60>>2];r=m*+g[i+4>>2]+n*+g[i+8>>2]+r*+g[i+12>>2]+ +g[i+52>>2];if((r-p)*(r-p)+(t-s)*(t-s)+(o-q)*(o-q)>1.1920928955078125e-07){e=1.0/+D(+((r-p)*(r-p)+(t-s)*(t-s)+(o-q)*(o-q)));g[u+128>>2]=(r-p)*e;g[u+128+4>>2]=(t-s)*e;g[u+128+8>>2]=(o-q)*e;c[u+128+12>>2]=0;m=(o-q)*e;d=(t-s)*e;e=(r-p)*e}else{c[u+128>>2]=1065353216;c[u+128+4>>2]=0;c[u+128+8>>2]=0;g[u+128+12>>2]=0.0;m=0.0;d=0.0;e=1.0}if(+C(+m)>.7071067690849304){w=m*m+d*d;v=1.0/+D(+w);j=-(v*m);m=v*d;n=-(m*e);h=e*j;k=0.0;d=w*v;e=m}else{j=e*e+d*d;h=1.0/+D(+j);k=-(d*h);d=h*e;n=m*k;h=j*h;j=d;d=-(d*m);e=0.0}g[u+128+16>>2]=k;g[u+128+20>>2]=j;g[u+128+24>>2]=e;g[u+128+32>>2]=d;g[u+128+36>>2]=n;g[u+128+40>>2]=h;f=0;while(1){x=c[b+28>>2]|0;c[u+80>>2]=c[x+4>>2];c[u+80+4>>2]=c[x+20>>2];c[u+80+8>>2]=c[x+36>>2];g[u+80+12>>2]=0.0;c[u+80+16>>2]=c[x+8>>2];c[u+80+20>>2]=c[x+24>>2];c[u+80+24>>2]=c[x+40>>2];g[u+80+28>>2]=0.0;c[u+80+32>>2]=c[x+12>>2];c[u+80+36>>2]=c[x+28>>2];c[u+80+40>>2]=c[x+44>>2];g[u+80+44>>2]=0.0;c[u+32>>2]=c[i+4>>2];c[u+32+4>>2]=c[i+20>>2];c[u+32+8>>2]=c[i+36>>2];g[u+32+12>>2]=0.0;c[u+32+16>>2]=c[i+8>>2];c[u+32+20>>2]=c[i+24>>2];c[u+32+24>>2]=c[i+40>>2];g[u+32+28>>2]=0.0;c[u+32+32>>2]=c[i+12>>2];c[u+32+36>>2]=c[i+28>>2];c[u+32+40>>2]=c[i+44>>2];g[u+32+44>>2]=0.0;w=s-+g[x+56>>2];v=q-+g[x+60>>2];g[u+16>>2]=p-+g[x+52>>2];g[u+16+4>>2]=w;g[u+16+8>>2]=v;g[u+16+12>>2]=0.0;v=t-+g[i+56>>2];w=o-+g[i+60>>2];g[u>>2]=r-+g[i+52>>2];g[u+4>>2]=v;g[u+8>>2]=w;g[u+12>>2]=0.0;x=c[b+28>>2]|0;i=c[b+32>>2]|0;Rg(b+48+(f*84|0)|0,u+80|0,u+32|0,u+16|0,u,u+128+(f<<4)|0,x+456|0,+g[x+404>>2],i+456|0,+g[i+404>>2]);f=f+1|0;if((f|0)==3)break;i=c[b+32>>2]|0}}n=+g[b+560>>2];o=+g[b+576>>2];p=+g[b+592>>2];if(+C(+p)>.7071067690849304){m=1.0/+D(+(p*p+o*o));d=n*-(p*m);e=(p*p+o*o)*m;h=0.0;j=o*m;k=-(n*o*m);m=-(p*m)}else{m=1.0/+D(+(n*n+o*o));d=(n*n+o*o)*m;e=-(p*n*m);h=-(o*m);j=0.0;k=p*-(o*m);m=n*m}i=c[b+28>>2]|0;K=+g[i+4>>2];J=+g[i+8>>2];s=+g[i+12>>2];R=h*K+m*J+j*s;I=+g[i+20>>2];H=+g[i+24>>2];v=+g[i+28>>2];T=h*I+m*H+j*v;G=+g[i+36>>2];q=+g[i+40>>2];E=+g[i+44>>2];W=h*G+m*q+j*E;B=e*K+k*J+d*s;M=e*I+k*H+d*v;N=e*G+k*q+d*E;f=c[b+32>>2]|0;A=+g[f+4>>2];z=+g[f+20>>2];y=+g[f+36>>2];k=+g[f+8>>2];m=+g[f+24>>2];t=+g[f+40>>2];P=+g[f+12>>2];S=+g[f+28>>2];V=+g[f+44>>2];c[b+300>>2]=0;c[b+300+4>>2]=0;c[b+300+8>>2]=0;c[b+300+12>>2]=0;g[b+316>>2]=R*K+T*I+W*G;g[b+320>>2]=R*J+T*H+W*q;g[b+324>>2]=R*s+T*v+W*E;g[b+328>>2]=0.0;g[b+332>>2]=A*-R+z*-T+y*-W;g[b+336>>2]=k*-R+m*-T+t*-W;g[b+340>>2]=P*-R+S*-T+V*-W;g[b+344>>2]=0.0;F=(R*K+T*I+W*G)*+g[i+456>>2];L=(R*J+T*H+W*q)*+g[i+460>>2];d=(R*s+T*v+W*E)*+g[i+464>>2];g[b+348>>2]=F;g[b+352>>2]=L;g[b+356>>2]=d;g[b+360>>2]=0.0;j=(A*-R+z*-T+y*-W)*+g[f+456>>2];w=(k*-R+m*-T+t*-W)*+g[f+460>>2];X=(P*-R+S*-T+V*-W)*+g[f+464>>2];g[b+364>>2]=j;g[b+368>>2]=w;g[b+372>>2]=X;g[b+376>>2]=0.0;g[b+380>>2]=(R*K+T*I+W*G)*F+(R*J+T*H+W*q)*L+(R*s+T*v+W*E)*d+((A*-R+z*-T+y*-W)*j+(k*-R+m*-T+t*-W)*w+(P*-R+S*-T+V*-W)*X);f=c[b+28>>2]|0;X=+g[f+4>>2];W=+g[f+20>>2];V=+g[f+36>>2];T=+g[f+8>>2];S=+g[f+24>>2];R=+g[f+40>>2];P=+g[f+12>>2];w=+g[f+28>>2];t=+g[f+44>>2];i=c[b+32>>2]|0;m=+g[i+4>>2];k=+g[i+20>>2];j=+g[i+36>>2];y=+g[i+8>>2];z=+g[i+24>>2];A=+g[i+40>>2];d=+g[i+12>>2];L=+g[i+28>>2];F=+g[i+44>>2];c[b+384>>2]=0;c[b+384+4>>2]=0;c[b+384+8>>2]=0;c[b+384+12>>2]=0;g[b+400>>2]=B*X+M*W+N*V;g[b+404>>2]=B*T+M*S+N*R;g[b+408>>2]=B*P+M*w+N*t;g[b+412>>2]=0.0;g[b+416>>2]=m*-B+k*-M+j*-N;g[b+420>>2]=y*-B+z*-M+A*-N;g[b+424>>2]=d*-B+L*-M+F*-N;g[b+428>>2]=0.0;U=(B*X+M*W+N*V)*+g[f+456>>2];Q=(B*T+M*S+N*R)*+g[f+460>>2];r=(B*P+M*w+N*t)*+g[f+464>>2];g[b+432>>2]=U;g[b+436>>2]=Q;g[b+440>>2]=r;g[b+444>>2]=0.0;e=(m*-B+k*-M+j*-N)*+g[i+456>>2];h=(y*-B+z*-M+A*-N)*+g[i+460>>2];O=(d*-B+L*-M+F*-N)*+g[i+464>>2];g[b+448>>2]=e;g[b+452>>2]=h;g[b+456>>2]=O;g[b+460>>2]=0.0;g[b+464>>2]=(B*X+M*W+N*V)*U+(B*T+M*S+N*R)*Q+(B*P+M*w+N*t)*r+((m*-B+k*-M+j*-N)*e+(y*-B+z*-M+A*-N)*h+(d*-B+L*-M+F*-N)*O);i=c[b+28>>2]|0;O=+g[i+4>>2];N=+g[i+20>>2];F=+g[i+36>>2];M=+g[i+8>>2];L=+g[i+24>>2];B=+g[i+40>>2];d=+g[i+12>>2];h=+g[i+28>>2];A=+g[i+44>>2];f=c[b+32>>2]|0;z=+g[f+4>>2];y=+g[f+20>>2];e=+g[f+36>>2];j=+g[f+8>>2];k=+g[f+24>>2];m=+g[f+40>>2];r=+g[f+12>>2];t=+g[f+28>>2];w=+g[f+44>>2];c[b+468>>2]=0;c[b+468+4>>2]=0;c[b+468+8>>2]=0;c[b+468+12>>2]=0;F=(K*n+J*o+s*p)*O+(I*n+H*o+v*p)*N+(G*n+q*o+E*p)*F;B=(K*n+J*o+s*p)*M+(I*n+H*o+v*p)*L+(G*n+q*o+E*p)*B;A=(K*n+J*o+s*p)*d+(I*n+H*o+v*p)*h+(G*n+q*o+E*p)*A;g[b+484>>2]=F;g[b+488>>2]=B;g[b+492>>2]=A;g[b+496>>2]=0.0;s=-(K*n+J*o+s*p);v=-(I*n+H*o+v*p);h=-(G*n+q*o+E*p);g[b+500>>2]=z*s+y*v+e*h;g[b+504>>2]=j*s+k*v+m*h;g[b+508>>2]=r*s+t*v+w*h;g[b+512>>2]=0.0;E=F*+g[i+456>>2];n=B*+g[i+460>>2];o=A*+g[i+464>>2];g[b+516>>2]=E;g[b+520>>2]=n;g[b+524>>2]=o;g[b+528>>2]=0.0;p=(z*s+y*v+e*h)*+g[f+456>>2];q=(j*s+k*v+m*h)*+g[f+460>>2];d=(r*s+t*v+w*h)*+g[f+464>>2];g[b+532>>2]=p;g[b+536>>2]=q;g[b+540>>2]=d;g[b+544>>2]=0.0;g[b+548>>2]=F*E+B*n+A*o+((z*s+y*v+e*h)*p+(j*s+k*v+m*h)*q+(r*s+t*v+w*h)*d);g[b+724>>2]=0.0;f=c[b+28>>2]|0;i=c[b+32>>2]|0;d=+bj(b,f+4|0,i+4|0);g[b+728>>2]=d;g[b+708>>2]=0.0;g[b+712>>2]=0.0;a[b+716>>0]=0;h=+g[b+692>>2];do if(h>=0.0){d=+mh(d-+g[b+688>>2],6.2831854820251465);if(!(d<-3.1415927410125732)){if(d>3.1415927410125732)d=d+-6.2831854820251465}else d=d+6.2831854820251465;if(d<-h){a[b+716>>0]=1;e=1.0;d=-(d+h)}else{if(!(d>h))break;a[b+716>>0]=1;e=-1.0;d=h-d}g[b+708>>2]=d;g[b+712>>2]=e}while(0);T=+g[b+560>>2];U=+g[b+576>>2];X=+g[b+592>>2];V=T*+g[f+4>>2]+U*+g[f+8>>2]+X*+g[f+12>>2];W=T*+g[f+20>>2]+U*+g[f+24>>2]+X*+g[f+28>>2];X=T*+g[f+36>>2]+U*+g[f+40>>2]+X*+g[f+44>>2];g[b+720>>2]=1.0/(V*(V*+g[f+324>>2]+W*+g[f+340>>2]+X*+g[f+356>>2])+W*(V*+g[f+328>>2]+W*+g[f+344>>2]+X*+g[f+360>>2])+X*(V*+g[f+332>>2]+W*+g[f+348>>2]+X*+g[f+364>>2])+(V*(V*+g[i+324>>2]+W*+g[i+340>>2]+X*+g[i+356>>2])+W*(V*+g[i+328>>2]+W*+g[i+344>>2]+X*+g[i+360>>2])+X*(V*+g[i+332>>2]+W*+g[i+348>>2]+X*+g[i+364>>2])));l=u;return}function Pc(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0,N=0,O=0,P=0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0,ca=0.0,da=0.0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0.0,oa=0.0;M=l;l=l+64|0;if(!(c[b+12>>2]|0)){l=M;return}f=(a[b+16>>0]|0)!=0;P=f?e:d;f=f?d:e;i=c[P+4>>2]|0;j=c[f+4>>2]|0;P=c[P+12>>2]|0;aa=+g[P>>2];$=+g[P+16>>2];_=+g[P+32>>2];Z=+g[P+4>>2];Y=+g[P+20>>2];o=+g[P+36>>2];k=+g[P+8>>2];r=+g[P+24>>2];y=+g[P+40>>2];T=+g[P+48>>2];S=+g[P+52>>2];R=+g[P+56>>2];O=c[f+12>>2]|0;X=+g[O>>2];W=+g[O+16>>2];p=+g[O+32>>2];V=+g[O+4>>2];U=+g[O+20>>2];q=+g[O+36>>2];x=+g[O+8>>2];v=+g[O+24>>2];t=+g[O+40>>2];Q=-+g[O+48>>2];I=-+g[O+52>>2];J=-+g[O+56>>2];K=+g[P>>2];L=+g[P+16>>2];H=+g[P+32>>2];B=+g[P+4>>2];A=+g[P+20>>2];z=+g[P+36>>2];w=+g[P+8>>2];u=+g[P+24>>2];s=+g[P+40>>2];P=c[(c[i>>2]|0)+64>>2]|0;n=-+g[j+52>>2];m=-+g[j+56>>2];E=-+g[j+60>>2];g[M+48>>2]=(aa*X+$*W+_*p)*n+(aa*V+$*U+_*q)*m+(aa*x+$*v+_*t)*E;g[M+48+4>>2]=(Z*X+Y*W+o*p)*n+(Z*V+Y*U+o*q)*m+(Z*x+Y*v+o*t)*E;g[M+48+8>>2]=(k*X+r*W+y*p)*n+(k*V+r*U+y*q)*m+(k*x+r*v+y*t)*E;g[M+48+12>>2]=0.0;Sb[P&127](M,i,M+48|0);E=+g[M>>2];y=+g[M+4>>2];r=+g[M+8>>2];k=+g[j+52>>2];m=+g[j+56>>2];n=+g[j+60>>2];o=n*(T*x+S*v+R*t+(x*Q+v*I+t*J)+((x*K+v*L+t*H)*E+(x*B+v*A+t*z)*y+(x*w+v*u+t*s)*r))+(k*(T*X+S*W+R*p+(X*Q+W*I+p*J)+((X*K+W*L+p*H)*E+(X*B+W*A+p*z)*y+(X*w+W*u+p*s)*r))+m*(T*V+S*U+R*q+(V*Q+U*I+q*J)+((V*K+U*L+q*H)*E+(V*B+U*A+q*z)*y+(V*w+U*u+q*s)*r)))-+g[j+68>>2];p=T*X+S*W+R*p+(X*Q+W*I+p*J)+((X*K+W*L+p*H)*E+(X*B+W*A+p*z)*y+(X*w+W*u+p*s)*r)-k*o;q=T*V+S*U+R*q+(V*Q+U*I+q*J)+((V*K+U*L+q*H)*E+(V*B+U*A+q*z)*y+(V*w+U*u+q*s)*r)-m*o;r=T*x+S*v+R*t+(x*Q+v*I+t*J)+((x*K+v*L+t*H)*E+(x*B+v*A+t*z)*y+(x*w+v*u+t*s)*r)-n*o;P=c[f+12>>2]|0;s=+g[P>>2];t=+g[P+4>>2];u=+g[P+8>>2];v=+g[P+16>>2];w=+g[P+20>>2];x=+g[P+24>>2];y=+g[P+32>>2];z=+g[P+36>>2];A=+g[P+40>>2];B=+g[P+48>>2];E=+g[P+52>>2];H=+g[P+56>>2];P=c[b+12>>2]|0;O=o<+g[P+784>>2];c[h+4>>2]=P;if(O){P=c[f+12>>2]|0;$=k*+g[P+16>>2]+m*+g[P+20>>2]+n*+g[P+24>>2];aa=k*+g[P+32>>2]+m*+g[P+36>>2]+n*+g[P+40>>2];g[M+48>>2]=+g[P>>2]*k+ +g[P+4>>2]*m+ +g[P+8>>2]*n;g[M+48+4>>2]=$;g[M+48+8>>2]=aa;g[M+48+12>>2]=0.0;g[M+32>>2]=u*r+(s*p+t*q)+B;g[M+32+4>>2]=p*v+q*w+r*x+E;g[M+32+8>>2]=p*y+q*z+r*A+H;g[M+32+12>>2]=0.0;Tb[c[(c[h>>2]|0)+16>>2]&15](h,M+48|0,M+32|0,o)}if((c[i+4>>2]|0)<7?(c[(c[h+4>>2]|0)+780>>2]|0)<(c[b+24>>2]|0):0){k=+g[j+60>>2];if(+C(+k)>.7071067690849304){n=+g[j+56>>2];aa=1.0/+D(+(k*k+n*n));m=0.0;n=n*aa;k=-(k*aa)}else{aa=+g[j+52>>2];m=+g[j+56>>2];k=1.0/+D(+(aa*aa+m*m));m=-(m*k);n=0.0;k=aa*k}J=.019999999552965164/+nb[c[(c[i>>2]|0)+16>>2]&15](i);J=(J>.39269909262657166?.39269909262657166:J)*.5;I=+G(+J)/+D(+(m*m+k*k+n*n));L=m*I;K=k*I;I=n*I;J=+F(+J);f=c[b+20>>2]|0;if((f|0)>0){i=0;do{v=+g[j+52>>2];aa=+g[j+56>>2];B=+g[j+60>>2];z=+(i|0)*(6.2831854820251465/+(f|0))*.5;$=+G(+z)/+D(+(v*v+aa*aa+B*B));z=+F(+z);A=I*-(aa*$)+(L*z+J*-(v*$))-K*-(B*$);x=L*-(B*$)+(K*z+J*-(aa*$))-I*-(v*$);da=K*-(v*$)+(I*z+J*-(B*$))-L*-(aa*$);H=J*z-L*-(v*$)-K*-(aa*$)-I*-(B*$);ia=B*$*x+(v*$*H+z*A)-aa*$*da;ha=v*$*da+(z*x+aa*$*H)-B*$*A;la=aa*$*A+(B*$*H+z*da)-v*$*x;da=z*H-v*$*A-aa*$*x-B*$*da;f=(a[b+16>>0]|0)!=0;ba=f?e:d;f=f?d:e;P=c[ba+4>>2]|0;O=c[f+4>>2]|0;ba=c[ba+12>>2]|0;$=+g[ba>>2];B=+g[ba+4>>2];x=+g[ba+8>>2];aa=+g[ba+16>>2];A=+g[ba+20>>2];v=+g[ba+24>>2];H=+g[ba+32>>2];z=+g[ba+36>>2];t=+g[ba+40>>2];V=+g[ba+48>>2];W=+g[ba+52>>2];X=+g[ba+56>>2];ba=c[f+12>>2]|0;R=+g[ba>>2];S=+g[ba+16>>2];p=+g[ba+32>>2];T=+g[ba+4>>2];U=+g[ba+20>>2];q=+g[ba+36>>2];w=+g[ba+8>>2];u=+g[ba+24>>2];s=+g[ba+40>>2];Y=-+g[ba+48>>2];Z=-+g[ba+52>>2];_=-+g[ba+56>>2];ga=ia*(2.0/(ia*ia+ha*ha+la*la+da*da));n=ha*(2.0/(ia*ia+ha*ha+la*la+da*da));ca=la*(2.0/(ia*ia+ha*ha+la*la+da*da));na=x*(ia*ca-da*n)+(B*(ia*n+da*ca)+$*(1.0-(ha*n+la*ca)));ka=x*(ha*ca+da*ga)+($*(ia*n-da*ca)+B*(1.0-(ia*ga+la*ca)));k=$*(ia*ca+da*n)+B*(ha*ca-da*ga)+x*(1.0-(ia*ga+ha*n));ma=v*(ia*ca-da*n)+(A*(ia*n+da*ca)+aa*(1.0-(ha*n+la*ca)));ja=v*(ha*ca+da*ga)+(aa*(ia*n-da*ca)+A*(1.0-(ia*ga+la*ca)));y=aa*(ia*ca+da*n)+A*(ha*ca-da*ga)+v*(1.0-(ia*ga+ha*n));oa=t*(ia*ca-da*n)+(z*(ia*n+da*ca)+H*(1.0-(ha*n+la*ca)));la=t*(ha*ca+da*ga)+(H*(ia*n-da*ca)+z*(1.0-(ia*ga+la*ca)));n=H*(ia*ca+da*n)+z*(ha*ca-da*ga)+t*(1.0-(ia*ga+ha*n));ha=+g[ba>>2];ga=+g[ba+16>>2];ia=+g[ba+32>>2];da=+g[ba+4>>2];ca=+g[ba+20>>2];ea=+g[ba+36>>2];m=+g[ba+8>>2];r=+g[ba+24>>2];o=+g[ba+40>>2];ba=c[(c[P>>2]|0)+64>>2]|0;fa=-+g[O+52>>2];Q=-+g[O+56>>2];E=-+g[O+60>>2];g[M+32>>2]=(ia*oa+(ha*na+ga*ma))*fa+(ea*oa+(da*na+ca*ma))*Q+(o*oa+(m*na+r*ma))*E;g[M+32+4>>2]=(ia*la+(ha*ka+ga*ja))*fa+(ea*la+(da*ka+ca*ja))*Q+(o*la+(m*ka+r*ja))*E;g[M+32+8>>2]=(ia*n+(ha*k+ga*y))*fa+(ea*n+(da*k+ca*y))*Q+(o*n+(m*k+r*y))*E;g[M+32+12>>2]=0.0;Sb[ba&127](M+48|0,P,M+32|0);E=+g[M+48>>2];y=+g[M+48+4>>2];r=+g[M+48+8>>2];k=+g[O+52>>2];m=+g[O+56>>2];n=+g[O+60>>2];o=n*(V*w+W*u+X*s+(w*Y+u*Z+s*_)+(($*w+aa*u+H*s)*E+(B*w+A*u+z*s)*y+(x*w+v*u+t*s)*r))+(k*(V*R+W*S+X*p+(R*Y+S*Z+p*_)+(($*R+aa*S+H*p)*E+(B*R+A*S+z*p)*y+(x*R+v*S+t*p)*r))+m*(V*T+W*U+X*q+(T*Y+U*Z+q*_)+(($*T+aa*U+H*q)*E+(B*T+A*U+z*q)*y+(x*T+v*U+t*q)*r)))-+g[O+68>>2];p=V*R+W*S+X*p+(R*Y+S*Z+p*_)+(($*R+aa*S+H*p)*E+(B*R+A*S+z*p)*y+(x*R+v*S+t*p)*r)-k*o;q=V*T+W*U+X*q+(T*Y+U*Z+q*_)+(($*T+aa*U+H*q)*E+(B*T+A*U+z*q)*y+(x*T+v*U+t*q)*r)-m*o;r=V*w+W*u+X*s+(w*Y+u*Z+s*_)+(($*w+aa*u+H*s)*E+(B*w+A*u+z*s)*y+(x*w+v*u+t*s)*r)-n*o;O=c[f+12>>2]|0;s=+g[O>>2];t=+g[O+4>>2];u=+g[O+8>>2];v=+g[O+16>>2];w=+g[O+20>>2];x=+g[O+24>>2];y=+g[O+32>>2];z=+g[O+36>>2];A=+g[O+40>>2];B=+g[O+48>>2];E=+g[O+52>>2];H=+g[O+56>>2];O=c[b+12>>2]|0;P=o<+g[O+784>>2];c[h+4>>2]=O;if(P){ba=c[f+12>>2]|0;na=k*+g[ba+16>>2]+m*+g[ba+20>>2]+n*+g[ba+24>>2];oa=k*+g[ba+32>>2]+m*+g[ba+36>>2]+n*+g[ba+40>>2];g[M+32>>2]=+g[ba>>2]*k+ +g[ba+4>>2]*m+ +g[ba+8>>2]*n;g[M+32+4>>2]=na;g[M+32+8>>2]=oa;g[M+32+12>>2]=0.0;g[M+16>>2]=u*r+(s*p+t*q)+B;g[M+16+4>>2]=p*v+q*w+r*x+E;g[M+16+8>>2]=p*y+q*z+r*A+H;g[M+16+12>>2]=0.0;Tb[c[(c[h>>2]|0)+16>>2]&15](h,M+32|0,M+16|0,o)}i=i+1|0;f=c[b+20>>2]|0}while((i|0)<(f|0))}}do if((a[b+8>>0]|0?c[(c[b+12>>2]|0)+780>>2]|0:0)?(N=c[h+4>>2]|0,c[N+780>>2]|0):0){i=c[N+772>>2]|0;j=c[(c[h+8>>2]|0)+8>>2]|0;f=c[(c[h+12>>2]|0)+8>>2]|0;if((i|0)==(j|0)){af(N,i+4|0,f+4|0);break}else{af(N,f+4|0,j+4|0);break}}while(0);l=M;return}function Qc(d,e,f,h){d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0;c[d+168>>2]=c[d+152>>2];c[e>>2]=9356;c[e+52>>2]=287;a[e+60>>0]=0;a[e+80>>0]=1;c[e+76>>2]=0;c[e+68>>2]=0;c[e+72>>2]=0;a[e+100>>0]=1;c[e+96>>2]=0;c[e+88>>2]=0;c[e+92>>2]=0;a[e+120>>0]=1;c[e+116>>2]=0;c[e+108>>2]=0;c[e+112>>2]=0;a[e+140>>0]=1;c[e+136>>2]=0;c[e+128>>2]=0;c[e+132>>2]=0;c[e+144>>2]=0;a[e+164>>0]=1;c[e+160>>2]=0;c[e+152>>2]=0;c[e+156>>2]=0;c[e+168>>2]=0;c[e+4>>2]=-8388609;c[e+8>>2]=-8388609;c[e+12>>2]=-8388609;g[e+16>>2]=0.0;c[e+20>>2]=2139095039;c[e+24>>2]=2139095039;c[e+28>>2]=2139095039;g[e+32>>2]=0.0;f=c[d+56>>2]|0;if(h){c[e+56>>2]=KB(f|0)|0;a[e+4>>0]=a[d+4+3>>0]|0;a[e+5>>0]=a[d+4+2>>0]|0;a[e+6>>0]=a[d+4+1>>0]|0;a[e+7>>0]=a[d+4>>0]|0;a[e+8>>0]=a[d+8+3>>0]|0;a[e+9>>0]=a[d+8+2>>0]|0;a[e+10>>0]=a[d+8+1>>0]|0;a[e+11>>0]=a[d+8>>0]|0;a[e+12>>0]=a[d+12+3>>0]|0;a[e+13>>0]=a[d+12+2>>0]|0;a[e+14>>0]=a[d+12+1>>0]|0;a[e+15>>0]=a[d+12>>0]|0;a[e+16>>0]=a[d+16+3>>0]|0;a[e+17>>0]=a[d+16+2>>0]|0;a[e+18>>0]=a[d+16+1>>0]|0;a[e+19>>0]=a[d+16>>0]|0;a[e+20>>0]=a[d+20+3>>0]|0;a[e+21>>0]=a[d+20+2>>0]|0;a[e+22>>0]=a[d+20+1>>0]|0;a[e+23>>0]=a[d+20>>0]|0;a[e+24>>0]=a[d+24+3>>0]|0;a[e+25>>0]=a[d+24+2>>0]|0;a[e+26>>0]=a[d+24+1>>0]|0;a[e+27>>0]=a[d+24>>0]|0;a[e+28>>0]=a[d+28+3>>0]|0;a[e+29>>0]=a[d+28+2>>0]|0;a[e+30>>0]=a[d+28+1>>0]|0;a[e+31>>0]=a[d+28>>0]|0;a[e+32>>0]=a[d+32+3>>0]|0;a[e+33>>0]=a[d+32+2>>0]|0;a[e+34>>0]=a[d+32+1>>0]|0;a[e+35>>0]=a[d+32>>0]|0;a[e+36>>0]=a[d+36+3>>0]|0;a[e+37>>0]=a[d+36+2>>0]|0;a[e+38>>0]=a[d+36+1>>0]|0;a[e+39>>0]=a[d+36>>0]|0;a[e+40>>0]=a[d+40+3>>0]|0;a[e+41>>0]=a[d+40+2>>0]|0;a[e+42>>0]=a[d+40+1>>0]|0;a[e+43>>0]=a[d+40>>0]|0;a[e+44>>0]=a[d+44+3>>0]|0;a[e+45>>0]=a[d+44+2>>0]|0;a[e+46>>0]=a[d+44+1>>0]|0;a[e+47>>0]=a[d+44>>0]|0;a[e+48>>0]=a[d+48+3>>0]|0;a[e+49>>0]=a[d+48+2>>0]|0;a[e+50>>0]=a[d+48+1>>0]|0;a[e+51>>0]=a[d+48>>0]|0;c[e+144>>2]=KB(c[d+144>>2]|0)|0;f=KB(c[d+168>>2]|0)|0}else{c[e+56>>2]=f;c[e+4>>2]=c[d+4>>2];c[e+4+4>>2]=c[d+4+4>>2];c[e+4+8>>2]=c[d+4+8>>2];c[e+4+12>>2]=c[d+4+12>>2];c[e+20>>2]=c[d+20>>2];c[e+20+4>>2]=c[d+20+4>>2];c[e+20+8>>2]=c[d+20+8>>2];c[e+20+12>>2]=c[d+20+12>>2];c[e+36>>2]=c[d+36>>2];c[e+36+4>>2]=c[d+36+4>>2];c[e+36+8>>2]=c[d+36+8>>2];c[e+36+12>>2]=c[d+36+12>>2];c[e+144>>2]=c[d+144>>2];f=c[d+168>>2]|0}c[e+168>>2]=f;a[e+60>>0]=a[d+60>>0]|0;k=c[d+56>>2]|0;if(!(a[d+60>>0]|0)){f=c[e+96>>2]|0;if(f|0){if(a[e+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[e+96>>2]=0}a[e+100>>0]=0;c[e+96>>2]=e+172;c[e+88>>2]=k;c[e+92>>2]=k;if(h)if((k|0)>0){i=0;j=c[d+96>>2]|0;f=e+172|0;do{l=j+(i<<6)|0;n=f+(i<<6)|0;a[n>>0]=a[l+3>>0]|0;a[n+1>>0]=a[l+2>>0]|0;a[n+2>>0]=a[l+1>>0]|0;a[n+3>>0]=a[l>>0]|0;n=j+(i<<6)+4|0;l=f+(i<<6)+4|0;a[l>>0]=a[n+3>>0]|0;a[l+1>>0]=a[n+2>>0]|0;a[l+2>>0]=a[n+1>>0]|0;a[l+3>>0]=a[n>>0]|0;l=j+(i<<6)+8|0;n=f+(i<<6)+8|0;a[n>>0]=a[l+3>>0]|0;a[n+1>>0]=a[l+2>>0]|0;a[n+2>>0]=a[l+1>>0]|0;a[n+3>>0]=a[l>>0]|0;n=j+(i<<6)+12|0;f=f+(i<<6)+12|0;a[f>>0]=a[n+3>>0]|0;a[f+1>>0]=a[n+2>>0]|0;a[f+2>>0]=a[n+1>>0]|0;a[f+3>>0]=a[n>>0]|0;f=c[d+96>>2]|0;n=f+(i<<6)+16|0;l=c[e+96>>2]|0;m=l+(i<<6)+16|0;a[m>>0]=a[n+3>>0]|0;a[m+1>>0]=a[n+2>>0]|0;a[m+2>>0]=a[n+1>>0]|0;a[m+3>>0]=a[n>>0]|0;m=f+(i<<6)+20|0;n=l+(i<<6)+20|0;a[n>>0]=a[m+3>>0]|0;a[n+1>>0]=a[m+2>>0]|0;a[n+2>>0]=a[m+1>>0]|0;a[n+3>>0]=a[m>>0]|0;n=f+(i<<6)+24|0;m=l+(i<<6)+24|0;a[m>>0]=a[n+3>>0]|0;a[m+1>>0]=a[n+2>>0]|0;a[m+2>>0]=a[n+1>>0]|0;a[m+3>>0]=a[n>>0]|0;f=f+(i<<6)+28|0;l=l+(i<<6)+28|0;a[l>>0]=a[f+3>>0]|0;a[l+1>>0]=a[f+2>>0]|0;a[l+2>>0]=a[f+1>>0]|0;a[l+3>>0]=a[f>>0]|0;j=c[d+96>>2]|0;l=KB(c[j+(i<<6)+32>>2]|0)|0;f=c[e+96>>2]|0;c[f+(i<<6)+32>>2]=l;c[f+(i<<6)+36>>2]=KB(c[j+(i<<6)+36>>2]|0)|0;c[f+(i<<6)+40>>2]=KB(c[j+(i<<6)+40>>2]|0)|0;i=i+1|0}while((i|0)!=(k|0))}else f=e+172|0;else if((k|0)>0){i=0;j=c[d+96>>2]|0;f=e+172|0;do{m=j+(i<<6)|0;n=f+(i<<6)|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];c[n+8>>2]=c[m+8>>2];c[n+12>>2]=c[m+12>>2];n=(c[d+96>>2]|0)+(i<<6)+16|0;f=(c[e+96>>2]|0)+(i<<6)+16|0;c[f>>2]=c[n>>2];c[f+4>>2]=c[n+4>>2];c[f+8>>2]=c[n+8>>2];c[f+12>>2]=c[n+12>>2];j=c[d+96>>2]|0;f=c[e+96>>2]|0;c[f+(i<<6)+32>>2]=c[j+(i<<6)+32>>2];c[f+(i<<6)+36>>2]=c[j+(i<<6)+36>>2];c[f+(i<<6)+40>>2]=c[j+(i<<6)+40>>2];i=i+1|0}while((i|0)!=(k|0))}else f=e+172|0;if(!f){f=k<<6;i=e+92|0;j=e+88|0;k=e+96|0;l=e+100|0}else{if(a[e+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[e+96>>2]=0;f=k<<6;i=e+92|0;j=e+88|0;k=e+96|0;l=e+100|0}}else{f=c[e+136>>2]|0;if(f|0){if(a[e+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[e+136>>2]=0}a[e+140>>0]=0;c[e+136>>2]=e+172;c[e+128>>2]=k;c[e+132>>2]=k;if(h){if((k|0)>0){i=c[d+136>>2]|0;f=0;do{b[e+172+(f<<4)>>1]=JH(b[i+(f<<4)>>1]|0)|0;b[e+172+(f<<4)+2>>1]=JH(b[i+(f<<4)+2>>1]|0)|0;b[e+172+(f<<4)+4>>1]=JH(b[i+(f<<4)+4>>1]|0)|0;b[e+172+(f<<4)+6>>1]=JH(b[i+(f<<4)+6>>1]|0)|0;b[e+172+(f<<4)+8>>1]=JH(b[i+(f<<4)+8>>1]|0)|0;b[e+172+(f<<4)+10>>1]=JH(b[i+(f<<4)+10>>1]|0)|0;c[e+172+(f<<4)+12>>2]=KB(c[i+(f<<4)+12>>2]|0)|0;f=f+1|0}while((f|0)!=(k|0))}}else if((k|0)>0){i=c[d+136>>2]|0;f=0;do{b[e+172+(f<<4)>>1]=b[i+(f<<4)>>1]|0;b[e+172+(f<<4)+2>>1]=b[i+(f<<4)+2>>1]|0;b[e+172+(f<<4)+4>>1]=b[i+(f<<4)+4>>1]|0;b[e+172+(f<<4)+6>>1]=b[i+(f<<4)+6>>1]|0;b[e+172+(f<<4)+8>>1]=b[i+(f<<4)+8>>1]|0;b[e+172+(f<<4)+10>>1]=b[i+(f<<4)+10>>1]|0;c[e+172+(f<<4)+12>>2]=c[i+(f<<4)+12>>2];f=f+1|0}while((f|0)!=(k|0))}c[e+136>>2]=0;f=k<<4;i=e+132|0;j=e+128|0;k=e+136|0;l=e+140|0}a[l>>0]=0;c[k>>2]=0;c[j>>2]=0;c[i>>2]=0;k=e+172+f|0;f=c[d+168>>2]|0;i=c[e+160>>2]|0;if(i|0){if(a[e+164>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[e+160>>2]=0}a[e+164>>0]=0;c[e+160>>2]=k;c[e+152>>2]=f;c[e+156>>2]=f;j=c[d+168>>2]|0;if(h){if((j|0)<=0){c[e>>2]=0;c[e+152>>2]=0;c[e+152+4>>2]=0;c[e+152+8>>2]=0;a[e+152+12>>0]=0;return 1}i=c[d+160>>2]|0;f=0;do{b[k+(f<<5)>>1]=JH(b[i+(f<<5)>>1]|0)|0;b[k+(f<<5)+2>>1]=JH(b[i+(f<<5)+2>>1]|0)|0;b[k+(f<<5)+4>>1]=JH(b[i+(f<<5)+4>>1]|0)|0;b[k+(f<<5)+6>>1]=JH(b[i+(f<<5)+6>>1]|0)|0;b[k+(f<<5)+8>>1]=JH(b[i+(f<<5)+8>>1]|0)|0;b[k+(f<<5)+10>>1]=JH(b[i+(f<<5)+10>>1]|0)|0;c[k+(f<<5)+12>>2]=KB(c[i+(f<<5)+12>>2]|0)|0;c[k+(f<<5)+16>>2]=KB(c[i+(f<<5)+16>>2]|0)|0;f=f+1|0}while((f|0)!=(j|0));c[e>>2]=0;c[e+152>>2]=0;c[e+152+4>>2]=0;c[e+152+8>>2]=0;a[e+152+12>>0]=0;return 1}else{if((j|0)<=0){c[e>>2]=0;c[e+152>>2]=0;c[e+152+4>>2]=0;c[e+152+8>>2]=0;a[e+152+12>>0]=0;return 1}i=c[d+160>>2]|0;f=0;do{b[k+(f<<5)>>1]=b[i+(f<<5)>>1]|0;b[k+(f<<5)+2>>1]=b[i+(f<<5)+2>>1]|0;b[k+(f<<5)+4>>1]=b[i+(f<<5)+4>>1]|0;b[k+(f<<5)+6>>1]=b[i+(f<<5)+6>>1]|0;b[k+(f<<5)+8>>1]=b[i+(f<<5)+8>>1]|0;b[k+(f<<5)+10>>1]=b[i+(f<<5)+10>>1]|0;c[k+(f<<5)+12>>2]=c[i+(f<<5)+12>>2];c[k+(f<<5)+16>>2]=c[i+(f<<5)+16>>2];c[k+(f<<5)+20>>2]=0;c[k+(f<<5)+24>>2]=0;c[k+(f<<5)+28>>2]=0;f=f+1|0}while((f|0)<(c[d+168>>2]|0));c[e>>2]=0;c[e+152>>2]=0;c[e+152+4>>2]=0;c[e+152+8>>2]=0;a[e+152+12>>0]=0;return 1}return 0}function Rc(b,d,e,f,h,i,j,k,m,n){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;var o=0.0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0.0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0;C=l;l=l+4224|0;if(((c[e+4>>2]|0)+-17|0)>>>0<2)A=((c[f+4>>2]|0)+-17|0)>>>0<2;else A=0;b=0;do{Qe();v=+g[24644+(b<<4)>>2];w=+g[24644+(b<<4)+4>>2];x=+g[24644+(b<<4)+8>>2];z=+g[h+4>>2]*-v+ +g[h+20>>2]*-w+ +g[h+36>>2]*-x;y=+g[h+8>>2]*-v+ +g[h+24>>2]*-w+ +g[h+40>>2]*-x;g[C+1248+(b<<4)>>2]=+g[h>>2]*-v+ +g[h+16>>2]*-w+ +g[h+32>>2]*-x;g[C+1248+(b<<4)+4>>2]=z;g[C+1248+(b<<4)+8>>2]=y;g[C+1248+(b<<4)+12>>2]=0.0;y=v*+g[i+4>>2]+w*+g[i+20>>2]+x*+g[i+36>>2];z=v*+g[i+8>>2]+w*+g[i+24>>2]+x*+g[i+40>>2];g[C+256+(b<<4)>>2]=v*+g[i>>2]+w*+g[i+16>>2]+x*+g[i+32>>2];g[C+256+(b<<4)+4>>2]=y;g[C+256+(b<<4)+8>>2]=z;g[C+256+(b<<4)+12>>2]=0.0;b=b+1|0}while((b|0)!=42);q=xb[c[(c[e>>2]|0)+84>>2]&127](e)|0;if((q|0)>0){b=0;p=42;while(1){Sb[c[(c[e>>2]|0)+88>>2]&127](e,b,C+176|0);y=+g[C+176>>2];z=+g[C+176+4>>2];x=+g[C+176+8>>2];w=y*+g[h+16>>2]+z*+g[h+20>>2]+x*+g[h+24>>2];v=y*+g[h+32>>2]+z*+g[h+36>>2]+x*+g[h+40>>2];g[C+176>>2]=+g[h>>2]*y+ +g[h+4>>2]*z+ +g[h+8>>2]*x;g[C+176+4>>2]=w;g[C+176+8>>2]=v;g[C+176+12>>2]=0.0;Qe();r=24644+(p<<4)|0;c[r>>2]=c[C+176>>2];c[r+4>>2]=c[C+176+4>>2];c[r+8>>2]=c[C+176+8>>2];c[r+12>>2]=c[C+176+12>>2];v=+g[C+176>>2];w=+g[C+176+4>>2];x=+g[C+176+8>>2];z=+g[h+4>>2]*-v+ +g[h+20>>2]*-w+ +g[h+36>>2]*-x;y=+g[h+8>>2]*-v+ +g[h+24>>2]*-w+ +g[h+40>>2]*-x;g[C+1248+(p<<4)>>2]=+g[h>>2]*-v+ +g[h+16>>2]*-w+ +g[h+32>>2]*-x;g[C+1248+(p<<4)+4>>2]=z;g[C+1248+(p<<4)+8>>2]=y;g[C+1248+(p<<4)+12>>2]=0.0;y=v*+g[i+4>>2]+w*+g[i+20>>2]+x*+g[i+36>>2];z=v*+g[i+8>>2]+w*+g[i+24>>2]+x*+g[i+40>>2];g[C+256+(p<<4)>>2]=+g[i>>2]*v+ +g[i+16>>2]*w+ +g[i+32>>2]*x;g[C+256+(p<<4)+4>>2]=y;g[C+256+(p<<4)+8>>2]=z;g[C+256+(p<<4)+12>>2]=0.0;b=b+1|0;if((b|0)==(q|0))break;else p=p+1|0}p=q+42|0}else p=42;r=xb[c[(c[f>>2]|0)+84>>2]&127](f)|0;if((r|0)>0){b=0;q=p;while(1){Sb[c[(c[f>>2]|0)+88>>2]&127](f,b,C+176|0);y=+g[C+176>>2];z=+g[C+176+4>>2];x=+g[C+176+8>>2];w=y*+g[i+16>>2]+z*+g[i+20>>2]+x*+g[i+24>>2];v=y*+g[i+32>>2]+z*+g[i+36>>2]+x*+g[i+40>>2];g[C+176>>2]=+g[i>>2]*y+ +g[i+4>>2]*z+ +g[i+8>>2]*x;g[C+176+4>>2]=w;g[C+176+8>>2]=v;g[C+176+12>>2]=0.0;Qe();D=24644+(q<<4)|0;c[D>>2]=c[C+176>>2];c[D+4>>2]=c[C+176+4>>2];c[D+8>>2]=c[C+176+8>>2];c[D+12>>2]=c[C+176+12>>2];v=+g[C+176>>2];w=+g[C+176+4>>2];x=+g[C+176+8>>2];z=+g[h+4>>2]*-v+ +g[h+20>>2]*-w+ +g[h+36>>2]*-x;y=+g[h+8>>2]*-v+ +g[h+24>>2]*-w+ +g[h+40>>2]*-x;g[C+1248+(q<<4)>>2]=+g[h>>2]*-v+ +g[h+16>>2]*-w+ +g[h+32>>2]*-x;g[C+1248+(q<<4)+4>>2]=z;g[C+1248+(q<<4)+8>>2]=y;g[C+1248+(q<<4)+12>>2]=0.0;y=v*+g[i+4>>2]+w*+g[i+20>>2]+x*+g[i+36>>2];z=v*+g[i+8>>2]+w*+g[i+24>>2]+x*+g[i+40>>2];g[C+256+(q<<4)>>2]=+g[i>>2]*v+ +g[i+16>>2]*w+ +g[i+32>>2]*x;g[C+256+(q<<4)+4>>2]=y;g[C+256+(q<<4)+8>>2]=z;g[C+256+(q<<4)+12>>2]=0.0;b=b+1|0;if((b|0)==(r|0))break;else q=q+1|0}p=r+p|0}Vb[c[(c[e>>2]|0)+76>>2]&127](e,C+1248|0,C+3232|0,p);Vb[c[(c[f>>2]|0)+76>>2]&127](f,C+256|0,C+2240|0,p);if((p|0)>0){v=999999984306749440.0;b=0;y=0.0;z=0.0;x=0.0;s=0.0;while(1){Qe();u=+g[24644+(b<<4)>>2];w=+g[24644+(b<<4)+4>>2];t=+g[24644+(b<<4)+12>>2];o=A?0.0:+g[24644+(b<<4)+8>>2];if(u*u+w*w+o*o>.01?(F=+g[C+3232+(b<<4)>>2],E=+g[C+3232+(b<<4)+4>>2],B=+g[C+3232+(b<<4)+8>>2],I=+g[C+2240+(b<<4)>>2],H=+g[C+2240+(b<<4)+4>>2],G=+g[C+2240+(b<<4)+8>>2],B=u*(I*+g[i>>2]+H*+g[i+4>>2]+G*+g[i+8>>2]+ +g[i+48>>2]-(F*+g[h>>2]+E*+g[h+4>>2]+B*+g[h+8>>2]+ +g[h+48>>2]))+w*(I*+g[i+16>>2]+H*+g[i+20>>2]+G*+g[i+24>>2]+ +g[i+52>>2]-(F*+g[h+16>>2]+E*+g[h+20>>2]+B*+g[h+24>>2]+ +g[h+52>>2]))+o*((A?0.0:I*+g[i+32>>2]+H*+g[i+36>>2]+G*+g[i+40>>2]+ +g[i+56>>2])-(A?0.0:F*+g[h+32>>2]+E*+g[h+36>>2]+B*+g[h+40>>2]+ +g[h+56>>2])),B>2]|0){case 4:case 5:case 10:case 11:case 13:case 1:case 0:case 8:break;default:+nb[c[(c[e>>2]|0)+48>>2]&15](e)}switch(c[f+4>>2]|0){case 4:case 5:case 10:case 11:case 13:case 1:case 0:case 8:break;default:+nb[c[(c[f>>2]|0)+48>>2]&15](f)}if(v<0.0){D=0;l=C;return D|0}switch(c[e+4>>2]|0){case 8:{o=+g[e+32>>2]*+g[e+16>>2];break}case 0:{o=+g[e+48>>2];break}case 1:{o=+g[e+48>>2];break}case 13:{o=+g[e+48>>2];break}case 11:{o=+g[e+48>>2];break}case 10:{o=+g[e+48>>2];break}case 4:case 5:{o=+g[e+48>>2];break}default:o=+nb[c[(c[e>>2]|0)+48>>2]&15](e)}b=c[f+4>>2]|0;switch(b|0){case 8:{s=+g[f+32>>2]*+g[f+16>>2];b=8;break}case 0:{s=+g[f+48>>2];b=0;break}case 1:{s=+g[f+48>>2];b=1;break}case 13:{s=+g[f+48>>2];b=13;break}case 11:{s=+g[f+48>>2];b=11;break}case 10:{s=+g[f+48>>2];b=10;break}case 4:case 5:{s=+g[f+48>>2];break}default:{s=+nb[c[(c[f>>2]|0)+48>>2]&15](f);b=c[f+4>>2]|0}}o=v+(o+s+.5);c[C+176>>2]=9552;c[C+176+4>>2]=0;c[C+176+8>>2]=1065353216;c[C+176+12>>2]=0;g[C+176+16>>2]=0.0;c[C+176+20>>2]=0;c[C+176+24>>2]=d;c[C+176+28>>2]=e;c[C+176+32>>2]=f;c[C+176+36>>2]=c[e+4>>2];c[C+176+40>>2]=b;g[C+176+44>>2]=+nb[c[(c[e>>2]|0)+48>>2]&15](e);g[C+176+48>>2]=+nb[c[(c[f>>2]|0)+48>>2]&15](f);a[C+176+52>>0]=0;c[C+176+60>>2]=-1;c[C+176+72>>2]=1;c[C+176+76>>2]=1;G=u*o+ +g[h+48>>2];H=w*o+ +g[h+52>>2];I=x*o+ +g[h+56>>2];c[C+44>>2]=c[h>>2];c[C+44+4>>2]=c[h+4>>2];c[C+44+8>>2]=c[h+8>>2];c[C+44+12>>2]=c[h+12>>2];c[C+44+16>>2]=c[h+16>>2];c[C+44+16+4>>2]=c[h+16+4>>2];c[C+44+16+8>>2]=c[h+16+8>>2];c[C+44+16+12>>2]=c[h+16+12>>2];c[C+44+32>>2]=c[h+32>>2];c[C+44+32+4>>2]=c[h+32+4>>2];c[C+44+32+8>>2]=c[h+32+8>>2];c[C+44+32+12>>2]=c[h+32+12>>2];g[C+44+48>>2]=G;g[C+44+52>>2]=H;g[C+44+56>>2]=I;g[C+44+60>>2]=0.0;c[C+44+64>>2]=c[i>>2];c[C+44+64+4>>2]=c[i+4>>2];c[C+44+64+8>>2]=c[i+8>>2];c[C+44+64+12>>2]=c[i+12>>2];c[C+44+80>>2]=c[i+16>>2];c[C+44+80+4>>2]=c[i+16+4>>2];c[C+44+80+8>>2]=c[i+16+8>>2];c[C+44+80+12>>2]=c[i+16+12>>2];c[C+44+96>>2]=c[i+32>>2];c[C+44+96+4>>2]=c[i+32+4>>2];c[C+44+96+8>>2]=c[i+32+8>>2];c[C+44+96+12>>2]=c[i+32+12>>2];c[C+44+112>>2]=c[i+48>>2];c[C+44+112+4>>2]=c[i+48+4>>2];c[C+44+112+8>>2]=c[i+48+8>>2];c[C+44+112+12>>2]=c[i+48+12>>2];g[C+44+128>>2]=999999984306749440.0;c[C>>2]=9436;a[C+40>>0]=0;g[C+176+4>>2]=-u;g[C+176+8>>2]=-w;g[C+176+12>>2]=-x;g[C+176+16>>2]=0.0;Dc(C+176|0,C+44|0,C,n,0);o=o-+g[C+36>>2];b=a[C+40>>0]|0;if(b<<24>>24){H=+g[C+24>>2]-w*o;I=+g[C+28>>2]-x*o;g[k>>2]=+g[C+20>>2]-u*o;g[k+4>>2]=H;g[k+8>>2]=I;g[k+12>>2]=0.0;c[m>>2]=c[C+20>>2];c[m+4>>2]=c[C+20+4>>2];c[m+8>>2]=c[C+20+8>>2];c[m+12>>2]=c[C+20+12>>2];g[j>>2]=u;g[j+4>>2]=w;g[j+8>>2]=x;g[j+12>>2]=t}D=b<<24>>24!=0;l=C;return D|0}function Sc(){var a=0;a=Ds(8)|0;c[6994]=a;eb(a|0,0)|0;c[6417]=19310;c[6418]=0;c[6419]=0;c[6420]=0;c[6421]=0;c[6422]=0;c[6423]=0;c[6424]=0;c[6425]=0;Pr(25668);c[6426]=19310;c[6427]=0;c[6428]=0;c[6429]=0;c[6430]=0;c[6431]=0;c[6432]=0;c[6433]=0;c[6434]=0;Pr(25704);c[6435]=19310;c[6436]=0;c[6437]=0;c[6438]=0;c[6439]=0;c[6440]=0;c[6441]=0;c[6442]=0;c[6443]=0;Pr(25740);c[6444]=19310;c[6445]=0;c[6446]=0;c[6447]=0;c[6448]=0;c[6449]=0;c[6450]=0;c[6451]=0;c[6452]=0;Pr(25776);c[6453]=19310;c[6454]=0;c[6455]=0;c[6456]=0;c[6457]=0;c[6458]=0;c[6459]=0;c[6460]=0;c[6461]=0;Pr(25812);c[6462]=19310;c[6463]=0;c[6464]=0;c[6465]=0;c[6466]=0;c[6467]=0;c[6468]=0;c[6469]=0;c[6470]=0;Pr(25848);c[6471]=19310;c[6472]=0;c[6473]=0;c[6474]=0;c[6475]=0;c[6476]=0;c[6477]=0;c[6478]=0;c[6479]=0;Pr(25884);c[6480]=19310;c[6481]=0;c[6482]=0;c[6483]=0;c[6484]=0;c[6485]=0;c[6486]=0;c[6487]=0;c[6488]=0;Pr(25920);c[6489]=19310;c[6490]=0;c[6491]=0;c[6492]=0;c[6493]=0;c[6494]=0;c[6495]=0;c[6496]=0;c[6497]=0;Pr(25956);c[6498]=19310;c[6499]=0;c[6500]=0;c[6501]=0;c[6502]=0;c[6503]=0;c[6504]=0;c[6505]=0;c[6506]=0;Pr(25992);c[6507]=19310;c[6508]=0;c[6509]=0;c[6510]=0;c[6511]=0;c[6512]=0;c[6513]=0;c[6514]=0;c[6515]=0;Pr(26028);c[6516]=19310;c[6517]=0;c[6518]=0;c[6519]=0;c[6520]=0;c[6521]=0;c[6522]=0;c[6523]=0;c[6524]=0;Pr(26064);c[6525]=19310;c[6526]=0;c[6527]=0;c[6528]=0;c[6529]=0;c[6530]=0;c[6531]=0;c[6532]=0;c[6533]=0;Pr(26100);c[6534]=19310;c[6535]=0;c[6536]=0;c[6537]=0;c[6538]=0;c[6539]=0;c[6540]=0;c[6541]=0;c[6542]=0;Pr(26136);c[6543]=19310;c[6544]=0;c[6545]=0;c[6546]=0;c[6547]=0;c[6548]=0;c[6549]=0;c[6550]=0;c[6551]=0;Pr(26172);c[6552]=19310;c[6553]=0;c[6554]=0;c[6555]=0;c[6556]=0;c[6557]=0;c[6558]=0;c[6559]=0;c[6560]=0;Pr(26208);c[6561]=19310;c[6562]=0;c[6563]=0;c[6564]=0;c[6565]=0;c[6566]=0;c[6567]=0;c[6568]=0;c[6569]=0;Pr(26244);c[6570]=19310;c[6571]=0;c[6572]=0;c[6573]=0;c[6574]=0;c[6575]=0;c[6576]=0;c[6577]=0;c[6578]=0;Pr(26280);c[6579]=19310;c[6580]=0;c[6581]=0;c[6582]=0;c[6583]=0;c[6584]=0;c[6585]=0;c[6586]=0;c[6587]=0;Pr(26316);c[6588]=19310;c[6589]=0;c[6590]=0;c[6591]=0;c[6592]=0;c[6593]=0;c[6594]=0;c[6595]=0;c[6596]=0;Pr(26352);c[6597]=19310;c[6598]=0;c[6599]=0;c[6600]=0;c[6601]=0;c[6602]=0;c[6603]=0;c[6604]=0;c[6605]=0;Pr(26388);c[6606]=19310;c[6607]=0;c[6608]=0;c[6609]=0;c[6610]=0;c[6611]=0;c[6612]=0;c[6613]=0;c[6614]=0;Pr(26424);c[6615]=19310;c[6616]=0;c[6617]=0;c[6618]=0;c[6619]=0;c[6620]=0;c[6621]=0;c[6622]=0;c[6623]=0;Pr(26460);c[6624]=19310;c[6625]=0;c[6626]=0;c[6627]=0;c[6628]=0;c[6629]=0;c[6630]=0;c[6631]=0;c[6632]=0;Pr(26496);c[6633]=19310;c[6634]=0;c[6635]=0;c[6636]=0;c[6637]=0;c[6638]=0;c[6639]=0;c[6640]=0;c[6641]=0;Pr(26532);c[6642]=19310;c[6643]=0;c[6644]=0;c[6645]=0;c[6646]=0;c[6647]=0;c[6648]=0;c[6649]=0;c[6650]=0;Pr(26568);c[6651]=19310;c[6652]=0;c[6653]=0;c[6654]=0;c[6655]=0;c[6656]=0;c[6657]=0;c[6658]=0;c[6659]=0;Pr(26604);c[6660]=19310;c[6661]=0;c[6662]=0;c[6663]=0;c[6664]=0;c[6665]=0;c[6666]=0;c[6667]=0;c[6668]=0;Pr(26640);c[6669]=19310;c[6670]=0;c[6671]=0;c[6672]=0;c[6673]=0;c[6674]=0;c[6675]=0;c[6676]=0;c[6677]=0;Pr(26676);c[6678]=19310;c[6679]=0;c[6680]=0;c[6681]=0;c[6682]=0;c[6683]=0;c[6684]=0;c[6685]=0;c[6686]=0;Pr(26712);c[6687]=19310;c[6688]=0;c[6689]=0;c[6690]=0;c[6691]=0;c[6692]=0;c[6693]=0;c[6694]=0;c[6695]=0;Pr(26748);c[6696]=19310;c[6697]=0;c[6698]=0;c[6699]=0;c[6700]=0;c[6701]=0;c[6702]=0;c[6703]=0;c[6704]=0;Pr(26784);c[6705]=19310;c[6706]=0;c[6707]=0;c[6708]=0;c[6709]=0;c[6710]=0;c[6711]=0;c[6712]=0;c[6713]=0;Pr(26820);c[6714]=19310;c[6715]=0;c[6716]=0;c[6717]=0;c[6718]=0;c[6719]=0;c[6720]=0;c[6721]=0;c[6722]=0;Pr(26856);c[6723]=19310;c[6724]=0;c[6725]=0;c[6726]=0;c[6727]=0;c[6728]=0;c[6729]=0;c[6730]=0;c[6731]=0;Pr(26892);c[6732]=19310;c[6733]=0;c[6734]=0;c[6735]=0;c[6736]=0;c[6737]=0;c[6738]=0;c[6739]=0;c[6740]=0;Pr(26928);c[6741]=19310;c[6742]=0;c[6743]=0;c[6744]=0;c[6745]=0;c[6746]=0;c[6747]=0;c[6748]=0;c[6749]=0;Pr(26964);c[6750]=19310;c[6751]=0;c[6752]=0;c[6753]=0;c[6754]=0;c[6755]=0;c[6756]=0;c[6757]=0;c[6758]=0;Pr(27e3);c[6759]=19310;c[6760]=0;c[6761]=0;c[6762]=0;c[6763]=0;c[6764]=0;c[6765]=0;c[6766]=0;c[6767]=0;Pr(27036);c[6768]=19310;c[6769]=0;c[6770]=0;c[6771]=0;c[6772]=0;c[6773]=0;c[6774]=0;c[6775]=0;c[6776]=0;Pr(27072);c[6777]=19310;c[6778]=0;c[6779]=0;c[6780]=0;c[6781]=0;c[6782]=0;c[6783]=0;c[6784]=0;c[6785]=0;Pr(27108);c[6786]=19310;c[6787]=0;c[6788]=0;c[6789]=0;c[6790]=0;c[6791]=0;c[6792]=0;c[6793]=0;c[6794]=0;Pr(27144);c[6795]=19310;c[6796]=0;c[6797]=0;c[6798]=0;c[6799]=0;c[6800]=0;c[6801]=0;c[6802]=0;c[6803]=0;Pr(27180);c[6804]=19310;c[6805]=0;c[6806]=0;c[6807]=0;c[6808]=0;c[6809]=0;c[6810]=0;c[6811]=0;c[6812]=0;Pr(27216);c[6813]=19310;c[6814]=0;c[6815]=0;c[6816]=0;c[6817]=0;c[6818]=0;c[6819]=0;c[6820]=0;c[6821]=0;Pr(27252);c[6822]=19310;c[6823]=0;c[6824]=0;c[6825]=0;c[6826]=0;c[6827]=0;c[6828]=0;c[6829]=0;c[6830]=0;Pr(27288);c[6831]=19310;c[6832]=0;c[6833]=0;c[6834]=0;c[6835]=0;c[6836]=0;c[6837]=0;c[6838]=0;c[6839]=0;Pr(27324);c[6840]=19310;c[6841]=0;c[6842]=0;c[6843]=0;c[6844]=0;c[6845]=0;c[6846]=0;c[6847]=0;c[6848]=0;Pr(27360);c[6849]=19310;c[6850]=0;c[6851]=0;c[6852]=0;c[6853]=0;c[6854]=0;c[6855]=0;c[6856]=0;c[6857]=0;Pr(27396);c[6858]=19310;c[6859]=0;c[6860]=0;c[6861]=0;c[6862]=0;c[6863]=0;c[6864]=0;c[6865]=0;c[6866]=0;Pr(27432);c[6867]=19310;c[6868]=0;c[6869]=0;c[6870]=0;c[6871]=0;c[6872]=0;c[6873]=0;c[6874]=0;c[6875]=0;Pr(27468);c[6876]=19310;c[6877]=0;c[6878]=0;c[6879]=0;c[6880]=0;c[6881]=0;c[6882]=0;c[6883]=0;c[6884]=0;Pr(27504);c[6885]=19310;c[6886]=0;c[6887]=0;c[6888]=0;c[6889]=0;c[6890]=0;c[6891]=0;c[6892]=0;c[6893]=0;Pr(27540);c[6894]=19310;c[6895]=0;c[6896]=0;c[6897]=0;c[6898]=0;c[6899]=0;c[6900]=0;c[6901]=0;c[6902]=0;Pr(27576);c[6903]=19310;c[6904]=0;c[6905]=0;c[6906]=0;c[6907]=0;c[6908]=0;c[6909]=0;c[6910]=0;c[6911]=0;Pr(27612);c[6912]=19310;c[6913]=0;c[6914]=0;c[6915]=0;c[6916]=0;c[6917]=0;c[6918]=0;c[6919]=0;c[6920]=0;Pr(27648);c[6921]=19310;c[6922]=0;c[6923]=0;c[6924]=0;c[6925]=0;c[6926]=0;c[6927]=0;c[6928]=0;c[6929]=0;Pr(27684);c[6930]=19310;c[6931]=0;c[6932]=0;c[6933]=0;c[6934]=0;c[6935]=0;c[6936]=0;c[6937]=0;c[6938]=0;Pr(27720);c[6939]=19310;c[6940]=0;c[6941]=0;c[6942]=0;c[6943]=0;c[6944]=0;c[6945]=0;c[6946]=0;c[6947]=0;Pr(27756);c[6948]=19310;c[6949]=0;c[6950]=0;c[6951]=0;c[6952]=0;c[6953]=0;c[6954]=0;c[6955]=0;c[6956]=0;Pr(27792);c[6957]=19310;c[6958]=0;c[6959]=0;c[6960]=0;c[6961]=0;c[6962]=0;c[6963]=0;c[6964]=0;c[6965]=0;Pr(27828);c[6966]=19310;c[6967]=0;c[6968]=0;c[6969]=0;c[6970]=0;c[6971]=0;c[6972]=0;c[6973]=0;c[6974]=0;Pr(27864);c[6975]=19310;c[6976]=0;c[6977]=0;c[6978]=0;c[6979]=0;c[6980]=0;c[6981]=0;c[6982]=0;c[6983]=0;Pr(27900);c[6984]=19310;c[6985]=0;c[6986]=0;c[6987]=0;c[6988]=0;c[6989]=0;c[6990]=0;c[6991]=0;c[6992]=0;Pr(27936);return}function Tc(b){b=b|0;var d=0,e=0.0,f=0.0,h=0.0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0,E=0,F=0,G=0,H=0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0;H=l;l=l+192|0;d=c[b+1112>>2]|0;if((d|0)<=0){l=H;return}G=0;do{F=c[(c[b+1120>>2]|0)+(G<<2)>>2]|0;E=c[F+24>>2]|0;if(E){i=H+144+4|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));g[H+144>>2]=9.999999747378752e-05;g[H+144+20>>2]=1.9999999494757503e-04;g[H+144+40>>2]=2.9999998514540493e-04;if((E|0)>0){i=c[F+32>>2]|0;j=c[F+12>>2]|0;d=0;e=0.0;f=0.0;h=0.0;do{D=c[i+(d<<2)>>2]|0;C=+g[j+(d<<2)>>2];e=e+ +g[D+8>>2]*C;f=f+C*+g[D+12>>2];h=h+C*+g[D+16>>2];d=d+1|0}while((d|0)!=(E|0))}else{h=0.0;f=0.0;e=0.0}r=+g[F+128>>2];t=e*r;s=f*r;r=h*r;g[F+228>>2]=t;g[F+232>>2]=s;g[F+236>>2]=r;g[F+240>>2]=0.0;if((E|0)>0){i=c[F+32>>2]|0;j=c[F+52>>2]|0;d=0;e=9.999999747378752e-05;f=0.0;h=0.0;k=0.0;m=1.9999999494757503e-04;n=0.0;o=0.0;p=0.0;q=2.9999998514540493e-04;do{D=c[i+(d<<2)>>2]|0;x=+g[D+8>>2]-t;y=+g[D+12>>2]-s;B=+g[D+16>>2]-r;z=+g[j+(d<<4)>>2];A=+g[j+(d<<4)+4>>2];C=+g[j+(d<<4)+8>>2];e=x*z+e;f=x*A+f;h=x*C+h;k=y*z+k;m=y*A+m;n=y*C+n;o=B*z+o;p=B*A+p;q=B*C+q;d=d+1|0}while((d|0)!=(E|0));g[H+144>>2]=e;g[H+144+4>>2]=f;g[H+144+8>>2]=h;g[H+144+16>>2]=k;g[H+144+20>>2]=m;g[H+144+24>>2]=n;g[H+144+32>>2]=o;g[H+144+36>>2]=p;g[H+144+40>>2]=q}if((a[22456]|0)==0?Uz(22456)|0:0){g[5758]=9.999999747378752e-05;c[5759]=16}bd(H+144|0,H+96|0,H+48|0);c[F+108>>2]=c[F+228>>2];c[F+108+4>>2]=c[F+228+4>>2];c[F+108+8>>2]=c[F+228+8>>2];c[F+108+12>>2]=c[F+228+12>>2];c[F+60>>2]=c[H+96>>2];c[F+60+4>>2]=c[H+96+4>>2];c[F+60+8>>2]=c[H+96+8>>2];c[F+60+12>>2]=c[H+96+12>>2];c[F+76>>2]=c[H+96+16>>2];c[F+76+4>>2]=c[H+96+16+4>>2];c[F+76+8>>2]=c[H+96+16+8>>2];c[F+76+12>>2]=c[H+96+16+12>>2];c[F+92>>2]=c[H+96+32>>2];c[F+92+4>>2]=c[H+96+32+4>>2];c[F+92+8>>2]=c[H+96+32+8>>2];c[F+92+12>>2]=c[H+96+32+12>>2];m=+g[F+132>>2];K=+g[F+60>>2];n=+g[F+148>>2];J=+g[F+64>>2];o=+g[F+164>>2];A=+g[F+68>>2];p=+g[F+136>>2];q=+g[F+152>>2];r=+g[F+168>>2];s=+g[F+140>>2];t=+g[F+156>>2];C=+g[F+172>>2];I=+g[F+76>>2];e=+g[F+80>>2];B=+g[F+84>>2];k=+g[F+92>>2];h=+g[F+96>>2];f=+g[F+100>>2];u=(m*K+n*J+o*A)*K+(K*p+J*q+A*r)*J+(K*s+J*t+A*C)*A;v=(m*K+n*J+o*A)*I+(K*p+J*q+A*r)*e+(K*s+J*t+A*C)*B;w=(m*K+n*J+o*A)*k+(K*p+J*q+A*r)*h+(K*s+J*t+A*C)*f;x=(m*I+n*e+o*B)*K+(p*I+q*e+r*B)*J+(s*I+t*e+C*B)*A;y=(m*I+n*e+o*B)*I+(p*I+q*e+r*B)*e+(s*I+t*e+C*B)*B;z=(m*I+n*e+o*B)*k+(p*I+q*e+r*B)*h+(s*I+t*e+C*B)*f;A=K*(m*k+n*h+o*f)+(p*k+q*h+r*f)*J+(s*k+t*h+C*f)*A;B=I*(m*k+n*h+o*f)+(p*k+q*h+r*f)*e+(s*k+t*h+C*f)*B;C=(m*k+n*h+o*f)*k+(p*k+q*h+r*f)*h+(s*k+t*h+C*f)*f;g[F+180>>2]=u;g[F+184>>2]=v;g[F+188>>2]=w;g[F+192>>2]=0.0;g[F+196>>2]=x;g[F+200>>2]=y;g[F+204>>2]=z;g[F+208>>2]=0.0;g[F+212>>2]=A;g[F+216>>2]=B;g[F+220>>2]=C;g[F+224>>2]=0.0;c[F+316>>2]=0;c[F+316+4>>2]=0;c[F+316+8>>2]=0;c[F+316+12>>2]=0;c[F+316+16>>2]=0;c[F+316+20>>2]=0;c[F+316+24>>2]=0;c[F+316+28>>2]=0;if((E|0)>0){i=c[F+32>>2]|0;j=c[F+12>>2]|0;r=+g[F+228>>2];s=+g[F+232>>2];t=+g[F+236>>2];d=0;q=0.0;p=0.0;o=0.0;n=0.0;m=0.0;e=0.0;do{D=c[i+(d<<2)>>2]|0;M=+g[j+(d<<2)>>2];J=+g[D+40>>2]*M;L=M*+g[D+44>>2];M=M*+g[D+48>>2];q=J+q;g[F+316>>2]=q;p=L+p;g[F+320>>2]=p;o=M+o;g[F+324>>2]=o;I=+g[D+8>>2]-r;K=+g[D+12>>2]-s;N=+g[D+16>>2]-t;n=n+(M*K-L*N);g[F+332>>2]=n;m=J*N-M*I+m;g[F+336>>2]=m;e=L*I-J*K+e;g[F+340>>2]=e;d=d+1|0}while((d|0)!=(E|0));D=F+316|0;d=F+332|0}else{D=F+316|0;d=F+332|0;q=0.0;p=0.0;o=0.0;n=0.0;m=0.0;e=0.0}M=+g[F+128>>2];N=1.0-+g[F+356>>2];g[F+316>>2]=q*M*N;g[F+320>>2]=M*p*N;g[F+324>>2]=M*o*N;g[F+328>>2]=0.0;N=1.0-+g[F+360>>2];g[d>>2]=(u*n+v*m+w*e)*N;g[F+336>>2]=(n*x+m*y+e*z)*N;g[F+340>>2]=N*(n*A+m*B+e*C);g[F+344>>2]=0.0;i=F+244|0;j=i+72|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));e=+g[F+364>>2];a:do if(e>0.0?(c[F+24>>2]|0)>0:0){d=0;while(1){j=c[(c[F+32>>2]|0)+(d<<2)>>2]|0;i=c[F+52>>2]|0;I=+g[i+(d<<4)>>2];J=+g[i+(d<<4)+4>>2];K=+g[i+(d<<4)+8>>2];L=+g[j+8>>2];M=+g[j+12>>2];N=+g[j+16>>2];M=M+e*(I*+g[F+76>>2]+J*+g[F+80>>2]+K*+g[F+84>>2]+ +g[F+112>>2]-M);N=N+e*(I*k+J*h+K*f+ +g[F+116>>2]-N);g[j+8>>2]=L+e*(I*+g[F+60>>2]+J*+g[F+64>>2]+K*+g[F+68>>2]+ +g[F+108>>2]-L);g[j+12>>2]=M;g[j+16>>2]=N;g[j+20>>2]=0.0;d=d+1|0;if((d|0)>=(c[F+24>>2]|0))break a;k=+g[F+92>>2];h=+g[F+96>>2];f=+g[F+100>>2];e=+g[F+364>>2]}}while(0);if(a[F+377>>0]|0){i=c[F+32>>2]|0;j=c[i>>2]|0;e=+g[j+8>>2];q=+g[j+12>>2];r=+g[j+16>>2];f=+g[j+20>>2];if((E|0)>1){d=1;m=e;p=e;n=f;o=r;k=f;h=q;f=q;e=r;do{j=c[i+(d<<2)>>2]|0;K=+g[j+8>>2];p=K>2];f=L>2];o=M>2];k=N>2]=p;g[H+16+4>>2]=f;g[H+16+8>>2]=o;g[H+16+12>>2]=k;g[H+16+16>>2]=m;g[H+16+20>>2]=h;g[H+16+24>>2]=e;g[H+16+28>>2]=n;d=c[F+348>>2]|0;if(!d){d=c[b+1072>>2]|0;if(!d){c[6995]=(c[6995]|0)+1;d=sc(63)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}i=d;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0))}else c[b+1072>>2]=0;c[d+32>>2]=0;c[d+36>>2]=F;c[d+40>>2]=0;c[d>>2]=c[H+16>>2];c[d+4>>2]=c[H+16+4>>2];c[d+8>>2]=c[H+16+8>>2];c[d+12>>2]=c[H+16+12>>2];c[d+16>>2]=c[H+16+16>>2];c[d+20>>2]=c[H+16+20>>2];c[d+24>>2]=c[H+16+24>>2];c[d+28>>2]=c[H+16+28>>2];Pe(b+1068|0,c[b+1068>>2]|0,d);c[b+1080>>2]=(c[b+1080>>2]|0)+1;c[F+348>>2]=d}else{L=+g[b+512>>2];M=L*+g[F+320>>2]*3.0;N=L*+g[F+324>>2]*3.0;g[H>>2]=+g[D>>2]*L*3.0;g[H+4>>2]=M;g[H+8>>2]=N;g[H+12>>2]=0.0;uh(b+1068|0,d,H+16|0,H,+g[b+524>>2])|0}}d=c[b+1112>>2]|0}G=G+1|0}while((G|0)<(d|0));l=H;return}function Uc(a,b){a=a|0;b=+b;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0;o=l;l=l+48|0;d=c[a+24>>2]|0;if((d|0)<=0){l=o;return}n=0;a:while(1){m=c[(c[a+32>>2]|0)+(n<<2)>>2]|0;switch(c[m+220>>2]|0){case 2:case 5:break;default:{ee(m,0);e=c[m+792>>2]|0;if((e|0)>0){d=0;do{k=c[m+800>>2]|0;i=c[k+(d*52|0)+28>>2]|0;j=c[k+(d*52|0)+24>>2]|0;y=+g[i+24>>2]-+g[j+24>>2];x=+g[i+28>>2]-+g[j+28>>2];b=+g[i+32>>2]-+g[j+32>>2];g[k+(d*52|0)+8>>2]=y;g[k+(d*52|0)+12>>2]=x;g[k+(d*52|0)+16>>2]=b;g[k+(d*52|0)+20>>2]=0.0;g[k+(d*52|0)+48>>2]=1.0/(+g[k+(d*52|0)+40>>2]*(y*y+x*x+b*b));d=d+1|0}while((d|0)!=(e|0))}f=c[m+852>>2]|0;if((f|0)>0){d=0;b=+g[m+512>>2];do{k=c[m+860>>2]|0;e=k+(d*96|0)+20|0;i=c[e>>2]|0;H=+g[k+(d*96|0)+4>>2];J=+g[k+(d*96|0)+8>>2];y=+g[k+(d*96|0)+12>>2];z=+g[i+4>>2]*H+ +g[i+8>>2]*J+ +g[i+12>>2]*y;x=H*+g[i+20>>2]+J*+g[i+24>>2]+y*+g[i+28>>2];y=H*+g[i+36>>2]+J*+g[i+40>>2]+y*+g[i+44>>2];j=k+(d*96|0)|0;J=+g[(c[j>>2]|0)+88>>2];H=1.0/b;Uh(o,+g[i+404>>2],i+324|0,z,x,y);C=J+ +g[o>>2];G=+g[o+4>>2]+0.0;E=+g[o+8>>2]+0.0;D=+g[o+16>>2]+0.0;F=J+ +g[o+20>>2];B=+g[o+24>>2]+0.0;I=+g[o+32>>2]+0.0;K=+g[o+36>>2]+0.0;J=J+ +g[o+40>>2];A=1.0/(E*(D*K-F*I)+(C*(F*J-B*K)+G*(B*I-D*J)));g[k+(d*96|0)+28>>2]=(D*K-F*I)*A*0.0+(H*(F*J-B*K)*A+(B*I-D*J)*A*0.0);g[k+(d*96|0)+32>>2]=(G*I-C*K)*A*0.0+(H*(E*K-G*J)*A+(C*J-E*I)*A*0.0);g[k+(d*96|0)+36>>2]=(C*F-G*D)*A*0.0+(H*(G*B-E*F)*A+(E*D-C*B)*A*0.0);g[k+(d*96|0)+40>>2]=0.0;g[k+(d*96|0)+44>>2]=(D*K-F*I)*A*0.0+((F*J-B*K)*A*0.0+H*(B*I-D*J)*A);g[k+(d*96|0)+48>>2]=(G*I-C*K)*A*0.0+((E*K-G*J)*A*0.0+H*(C*J-E*I)*A);g[k+(d*96|0)+52>>2]=(C*F-G*D)*A*0.0+((G*B-E*F)*A*0.0+H*(E*D-C*B)*A);g[k+(d*96|0)+56>>2]=0.0;g[k+(d*96|0)+60>>2]=H*(D*K-F*I)*A+((F*J-B*K)*A*0.0+(B*I-D*J)*A*0.0);g[k+(d*96|0)+64>>2]=H*(G*I-C*K)*A+((E*K-G*J)*A*0.0+(C*J-E*I)*A*0.0);g[k+(d*96|0)+68>>2]=H*(C*F-G*D)*A+((G*B-E*F)*A*0.0+(E*D-C*B)*A*0.0);g[k+(d*96|0)+72>>2]=0.0;g[k+(d*96|0)+76>>2]=z;g[k+(d*96|0)+80>>2]=x;g[k+(d*96|0)+84>>2]=y;g[k+(d*96|0)+88>>2]=0.0;b=+g[m+512>>2];g[k+(d*96|0)+92>>2]=b*+g[(c[j>>2]|0)+88>>2];e=c[e>>2]|0;if(!(c[e+204>>2]&3)){if((c[e+220>>2]&-2|0)!=4)c[e+220>>2]=1;g[e+224>>2]=0.0}d=d+1|0}while((d|0)!=(f|0))}d=c[m+432>>2]|0;if((d|0)>0){f=0;e=c[m+456>>2]|0;do{if((e|0)>0){d=0;do{Jb[((c[(c[m+464>>2]|0)+(d<<2)>>2]|0)==0?25:0)&31](m,1.0);d=d+1|0;e=c[m+456>>2]|0}while((d|0)<(e|0));d=c[m+432>>2]|0}f=f+1|0}while((f|0)<(d|0));e=c[m+772>>2]|0;if((e|0)>0){d=0;do{k=c[m+780>>2]|0;I=+g[m+512>>2];J=I*+g[k+(d*104|0)+44>>2]+ +g[k+(d*104|0)+28>>2];K=I*+g[k+(d*104|0)+48>>2]+ +g[k+(d*104|0)+32>>2];g[k+(d*104|0)+8>>2]=+g[k+(d*104|0)+40>>2]*I+ +g[k+(d*104|0)+24>>2];g[k+(d*104|0)+12>>2]=J;g[k+(d*104|0)+16>>2]=K;g[k+(d*104|0)+20>>2]=0.0;d=d+1|0}while((d|0)!=(e|0))}}d=c[m+436>>2]|0;if((d|0)>0){h=0;e=c[m+476>>2]|0;do{b=+(h|0)/+(d|0);if((e|0)>0){f=0;do{switch(c[(c[m+484>>2]|0)+(f<<2)>>2]|0){case 1:{d=3;break}case 0:{d=4;break}case 2:{d=5;break}case 3:{d=6;break}default:{w=35;break a}}Kb[d&7](m,1.0,b);f=f+1|0;e=c[m+476>>2]|0}while((f|0)<(e|0));d=c[m+436>>2]|0}h=h+1|0}while((h|0)<(d|0));b=+g[m+516>>2]*(1.0-+g[m+356>>2]);e=c[m+772>>2]|0;if((e|0)>0){d=0;do{k=c[m+780>>2]|0;J=b*(+g[k+(d*104|0)+12>>2]-+g[k+(d*104|0)+28>>2]);K=b*(+g[k+(d*104|0)+16>>2]-+g[k+(d*104|0)+32>>2]);g[k+(d*104|0)+40>>2]=b*(+g[k+(d*104|0)+8>>2]-+g[k+(d*104|0)+24>>2]);g[k+(d*104|0)+44>>2]=J;g[k+(d*104|0)+48>>2]=K;k=k+(d*104|0)+52|0;d=d+1|0;c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0}while((d|0)!=(e|0))}}d=c[m+440>>2]|0;if((d|0)>0){b=+g[m+352>>2]*+g[m+516>>2];e=c[m+772>>2]|0;if((e|0)>0){d=0;do{k=c[m+780>>2]|0;j=k+(d*104|0)+8|0;k=k+(d*104|0)+24|0;c[k>>2]=c[j>>2];c[k+4>>2]=c[j+4>>2];c[k+8>>2]=c[j+8>>2];c[k+12>>2]=c[j+12>>2];d=d+1|0}while((d|0)!=(e|0));d=c[m+440>>2]|0;if((d|0)>0)w=42}else w=42;if((w|0)==42){w=0;h=0;e=c[m+496>>2]|0;do{if((e|0)>0){f=0;do{switch(c[(c[m+504>>2]|0)+(f<<2)>>2]|0){case 1:{d=3;break}case 0:{d=4;break}case 2:{d=5;break}case 3:{d=6;break}default:{w=53;break a}}Kb[d&7](m,1.0,0.0);f=f+1|0;e=c[m+496>>2]|0}while((f|0)<(e|0));d=c[m+440>>2]|0}h=h+1|0}while((h|0)<(d|0))}e=c[m+772>>2]|0;if((e|0)>0){f=c[m+780>>2]|0;d=0;do{J=b*(+g[f+(d*104|0)+12>>2]-+g[f+(d*104|0)+28>>2]);K=b*(+g[f+(d*104|0)+16>>2]-+g[f+(d*104|0)+32>>2]);k=f+(d*104|0)+40|0;g[k>>2]=b*(+g[f+(d*104|0)+8>>2]-+g[f+(d*104|0)+24>>2])+ +g[k>>2];k=f+(d*104|0)+44|0;g[k>>2]=J+ +g[k>>2];k=f+(d*104|0)+48|0;g[k>>2]=K+ +g[k>>2];d=d+1|0}while((d|0)!=(e|0))}}f=c[m+1112>>2]|0;if((f|0)>0){h=c[m+1120>>2]|0;e=0;do{i=c[h+(e<<2)>>2]|0;if(+g[i+352>>2]>0.0?(p=c[i+24>>2]|0,(p|0)>0):0){j=c[i+32>>2]|0;d=0;do{k=c[j+(d<<2)>>2]|0;if(+g[k+88>>2]>0.0?(t=+g[k+24>>2]-+g[i+228>>2],v=+g[k+28>>2]-+g[i+232>>2],r=+g[k+32>>2]-+g[i+236>>2],s=+g[i+336>>2],K=+g[i+340>>2],u=+g[i+332>>2],q=+g[i+316>>2]+(s*r-v*K),r=+g[i+320>>2]+(t*K-r*u),s=v*u-t*s+ +g[i+324>>2],t=+g[k+40>>2],u=+g[k+44>>2],v=+g[k+48>>2],q*q+r*r+s*s<=t*t+u*u+v*v):0){K=+g[i+352>>2];g[k+40>>2]=t+(q-t)*K;g[k+44>>2]=(r-u)*K+u;g[k+48>>2]=(s-v)*K+v}d=d+1|0}while((d|0)!=(p|0))}e=e+1|0}while((e|0)!=(f|0))}ee(m,1);d=c[a+24>>2]|0}}n=n+1|0;if((n|0)>=(d|0)){w=3;break}}if((w|0)==3){l=o;return}}function Vc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0,t=0.0;q=l;l=l+80|0;i=c[b+28>>2]|0;d=c[f+72>>2]|0;if((d&4|0)!=0&(i|0)>0){e=c[b+36>>2]|0;h=c[b+76>>2]|0;if(!(d&16)){d=0;do{m=c[e+(d*152|0)+132>>2]|0;c[m+124>>2]=c[e+(d*152|0)+100>>2];c[m+128>>2]=c[h+((c[e+(d*152|0)+140>>2]|0)*152|0)+100>>2];d=d+1|0}while((d|0)!=(i|0))}else{d=0;do{m=c[e+(d*152|0)+132>>2]|0;c[m+124>>2]=c[e+(d*152|0)+100>>2];k=c[e+(d*152|0)+140>>2]|0;c[m+128>>2]=c[h+(k*152|0)+100>>2];c[m+132>>2]=c[h+((k+1|0)*152|0)+100>>2];d=d+1|0}while((d|0)!=(i|0))}}h=c[b+48>>2]|0;if((h|0)>0){d=0;do{i=c[b+56>>2]|0;k=c[i+(d*152|0)+132>>2]|0;m=c[k+44>>2]|0;e=i+(d*152|0)+100|0;if(m|0){p=+g[e>>2];s=c[k+28>>2]|0;o=1.0/+g[f+12>>2];n=p*+g[i+(d*152|0)+20>>2]*+g[s+412>>2]*o;r=p*+g[i+(d*152|0)+24>>2]*+g[s+416>>2]*o;g[m>>2]=+g[m>>2]+ +g[i+(d*152|0)+16>>2]*p*+g[s+408>>2]*o;g[m+4>>2]=n+ +g[m+4>>2];g[m+8>>2]=r+ +g[m+8>>2];r=+g[e>>2];s=c[k+32>>2]|0;n=1.0/+g[f+12>>2];o=r*+g[i+(d*152|0)+52>>2]*+g[s+412>>2]*n;p=r*+g[i+(d*152|0)+56>>2]*+g[s+416>>2]*n;g[m+32>>2]=+g[m+32>>2]+ +g[i+(d*152|0)+48>>2]*r*+g[s+408>>2]*n;g[m+36>>2]=o+ +g[m+36>>2];g[m+40>>2]=p+ +g[m+40>>2];s=c[k+28>>2]|0;p=+g[e>>2];o=1.0/+g[f+12>>2];n=+g[i+(d*152|0)+4>>2]*+g[s+608>>2]*p*o;r=p*+g[i+(d*152|0)+8>>2]*+g[s+612>>2]*o;g[m+16>>2]=+g[m+16>>2]+ +g[i+(d*152|0)>>2]*+g[s+604>>2]*p*o;g[m+20>>2]=n+ +g[m+20>>2];g[m+24>>2]=r+ +g[m+24>>2];s=c[k+32>>2]|0;r=+g[e>>2];n=1.0/+g[f+12>>2];o=+g[i+(d*152|0)+36>>2]*+g[s+608>>2]*r*n;p=r*+g[i+(d*152|0)+40>>2]*+g[s+612>>2]*n;g[m+48>>2]=+g[m+48>>2]+ +g[i+(d*152|0)+32>>2]*+g[s+604>>2]*r*n;g[m+52>>2]=o+ +g[m+52>>2];g[m+56>>2]=p+ +g[m+56>>2]}s=c[e>>2]|0;c[k+36>>2]=s;r=+C(+(c[j>>2]=s,+g[j>>2]));if(r>=+g[k+16>>2])a[k+20>>0]=0;d=d+1|0}while((d|0)!=(h|0))}e=c[b+8>>2]|0;if((e|0)>0){k=0;d=c[b+16>>2]|0;do{h=d+(k*244|0)|0;i=c[d+(k*244|0)+240>>2]|0;if(i){if(!(c[f+52>>2]|0)){h=d+(k*244|0)+176|0;o=+g[d+(k*244|0)+64>>2]+ +g[h>>2];g[h>>2]=o;h=d+(k*244|0)+180|0;p=+g[d+(k*244|0)+68>>2]+ +g[h>>2];g[h>>2]=p;h=d+(k*244|0)+184|0;n=+g[d+(k*244|0)+72>>2]+ +g[h>>2];g[h>>2]=n;h=d+(k*244|0)+192|0;g[h>>2]=+g[d+(k*244|0)+80>>2]+ +g[h>>2];h=d+(k*244|0)+196|0;g[h>>2]=+g[d+(k*244|0)+84>>2]+ +g[h>>2];h=d+(k*244|0)+200|0;g[h>>2]=+g[d+(k*244|0)+88>>2]+ +g[h>>2];h=d;d=i}else{n=+g[f+12>>2];o=+g[f+60>>2];e=d+(k*244|0)+176|0;g[e>>2]=+g[d+(k*244|0)+64>>2]+ +g[e>>2];e=d+(k*244|0)+180|0;g[e>>2]=+g[d+(k*244|0)+68>>2]+ +g[e>>2];e=d+(k*244|0)+184|0;g[e>>2]=+g[d+(k*244|0)+72>>2]+ +g[e>>2];e=d+(k*244|0)+192|0;g[e>>2]=+g[d+(k*244|0)+80>>2]+ +g[e>>2];e=d+(k*244|0)+196|0;g[e>>2]=+g[d+(k*244|0)+84>>2]+ +g[e>>2];e=d+(k*244|0)+200|0;g[e>>2]=+g[d+(k*244|0)+88>>2]+ +g[e>>2];p=+g[d+(k*244|0)+144>>2];e=d+(k*244|0)+148|0;if(((((!(p!=0.0)?!(+g[e>>2]!=0.0):0)?!(+g[d+(k*244|0)+152>>2]!=0.0):0)?!(+g[d+(k*244|0)+160>>2]!=0.0):0)?!(+g[d+(k*244|0)+164>>2]!=0.0):0)?!(+g[d+(k*244|0)+168>>2]!=0.0):0)e=i;else{t=+g[d+(k*244|0)+164>>2]*o;r=+g[d+(k*244|0)+168>>2]*o;g[q>>2]=+g[d+(k*244|0)+160>>2]*o;g[q+4>>2]=t;g[q+8>>2]=r;g[q+12>>2]=0.0;Af(h,p,+g[e>>2],+g[d+(k*244|0)+152>>2],q,n,q+16|0);c[h>>2]=c[q+16>>2];c[h+4>>2]=c[q+16+4>>2];c[h+8>>2]=c[q+16+8>>2];c[h+12>>2]=c[q+16+12>>2];e=d+(k*244|0)+16|0;c[e>>2]=c[q+16+16>>2];c[e+4>>2]=c[q+16+16+4>>2];c[e+8>>2]=c[q+16+16+8>>2];c[e+12>>2]=c[q+16+16+12>>2];e=d+(k*244|0)+32|0;c[e>>2]=c[q+16+32>>2];c[e+4>>2]=c[q+16+32+4>>2];c[e+8>>2]=c[q+16+32+8>>2];c[e+12>>2]=c[q+16+32+12>>2];e=d+(k*244|0)+48|0;c[e>>2]=c[q+16+48>>2];c[e+4>>2]=c[q+16+48+4>>2];c[e+8>>2]=c[q+16+48+8>>2];c[e+12>>2]=c[q+16+48+12>>2];e=c[b+16>>2]|0;d=e;e=c[e+(k*244|0)+240>>2]|0}h=d;o=+g[d+(k*244|0)+176>>2];p=+g[d+(k*244|0)+180>>2];n=+g[d+(k*244|0)+184>>2];d=e}t=o+ +g[h+(k*244|0)+208>>2];r=p+ +g[h+(k*244|0)+212>>2];p=n+ +g[h+(k*244|0)+216>>2];m=d+304|0;c[m>>2]=(c[m>>2]|0)+1;g[d+372>>2]=t;g[d+376>>2]=r;g[d+380>>2]=p;g[d+384>>2]=0.0;m=c[b+16>>2]|0;s=c[m+(k*244|0)+240>>2]|0;p=+g[m+(k*244|0)+192>>2]+ +g[m+(k*244|0)+224>>2];r=+g[m+(k*244|0)+196>>2]+ +g[m+(k*244|0)+228>>2];t=+g[m+(k*244|0)+200>>2]+ +g[m+(k*244|0)+232>>2];c[s+304>>2]=(c[s+304>>2]|0)+1;g[s+388>>2]=p;g[s+392>>2]=r;g[s+396>>2]=t;g[s+400>>2]=0.0;if(c[f+52>>2]|0){m=c[b+16>>2]|0;s=c[m+(k*244|0)+240>>2]|0;i=m+(k*244|0)|0;c[s+304>>2]=(c[s+304>>2]|0)+1;c[s+4>>2]=c[i>>2];c[s+4+4>>2]=c[i+4>>2];c[s+4+8>>2]=c[i+8>>2];c[s+4+12>>2]=c[i+12>>2];i=m+(k*244|0)+16|0;c[s+20>>2]=c[i>>2];c[s+20+4>>2]=c[i+4>>2];c[s+20+8>>2]=c[i+8>>2];c[s+20+12>>2]=c[i+12>>2];i=m+(k*244|0)+32|0;c[s+36>>2]=c[i>>2];c[s+36+4>>2]=c[i+4>>2];c[s+36+8>>2]=c[i+8>>2];c[s+36+12>>2]=c[i+12>>2];m=m+(k*244|0)+48|0;c[s+52>>2]=c[m>>2];c[s+52+4>>2]=c[m+4>>2];c[s+52+8>>2]=c[m+8>>2];c[s+52+12>>2]=c[m+12>>2]}d=c[b+16>>2]|0;c[(c[d+(k*244|0)+240>>2]|0)+212>>2]=-1;e=c[b+8>>2]|0}k=k+1|0}while((k|0)<(e|0))}if((c[b+28>>2]|0)<0?(c[b+32>>2]|0)<0:0){d=c[b+36>>2]|0;if(d|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=0;c[b+32>>2]=0}c[b+28>>2]=0;if((c[b+48>>2]|0)<0?(c[b+52>>2]|0)<0:0){d=c[b+56>>2]|0;if(d|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=0;c[b+52>>2]=0}c[b+48>>2]=0;if((c[b+68>>2]|0)<0?(c[b+72>>2]|0)<0:0){d=c[b+76>>2]|0;if(d|0){if(a[b+80>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+76>>2]=0}a[b+80>>0]=1;c[b+76>>2]=0;c[b+72>>2]=0}c[b+68>>2]=0;if((c[b+88>>2]|0)<0?(c[b+92>>2]|0)<0:0){d=c[b+96>>2]|0;if(d|0){if(a[b+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+96>>2]=0}a[b+100>>0]=1;c[b+96>>2]=0;c[b+92>>2]=0}c[b+88>>2]=0;if((c[b+8>>2]|0)>=0){c[b+8>>2]=0;l=q;return 0.0}if((c[b+12>>2]|0)>=0){c[b+8>>2]=0;l=q;return 0.0}d=c[b+16>>2]|0;if(d|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=0;c[b+12>>2]=0;c[b+8>>2]=0;l=q;return 0.0}function Wc(b,e,f,g,h,i){b=b|0;e=+e;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,B=0,C=0,D=0;D=l;l=l+560|0;C=D+524|0;c[D>>2]=0;B=D+512+12|0;lw(e)|0;if((A|0)<0){e=-e;y=1;x=19796}else{y=(h&2049|0)!=0&1;x=(h&2048|0)==0?((h&1|0)==0?19797:19802):19799}lw(e)|0;z=A&2146435072;do if(z>>>0<2146435072|(z|0)==2146435072&0<0){p=+dI(e,D)*2.0;if(p!=0.0)c[D>>2]=(c[D>>2]|0)+-1;if((i|32|0)==97){o=(i&32|0)==0?x:x+9|0;n=y|2;do if(!(g>>>0>11|(12-g|0)==0)){e=8.0;j=12-g|0;do{j=j+-1|0;e=e*16.0}while((j|0)!=0);if((a[o>>0]|0)==45){e=-(e+(-p-e));break}else{e=p+e-e;break}}else e=p;while(0);k=c[D>>2]|0;j=(k|0)<0?0-k|0:k;j=Om(j,((j|0)<0)<<31>>31,B)|0;if((j|0)==(B|0)){a[D+512+11>>0]=48;j=D+512+11|0}a[j+-1>>0]=(k>>31&2)+43;m=j+-2|0;a[m>>0]=i+15;j=D+524|0;do{z=~~e;k=j+1|0;a[j>>0]=d[19831+z>>0]|i&32;e=(e-+(z|0))*16.0;if((k-C|0)==1?!((h&8|0)==0&((g|0)<1&e==0.0)):0){a[k>>0]=46;j=j+2|0}else j=k}while(e!=0.0);C=j-C|0;j=(g|0)!=0&(C+-2|0)<(g|0)?g+2|0:C;un(b,32,f,B-m+n+j|0,h);fA(b,o,n);un(b,48,f,B-m+n+j|0,h^65536);fA(b,D+524|0,C);un(b,48,j-C|0,0,0);fA(b,m,B-m|0);un(b,32,f,B-m+n+j|0,h^8192);j=B-m+n+j|0;break}k=(g|0)<0?6:g;if(p!=0.0){n=(c[D>>2]|0)+-28|0;c[D>>2]=n;e=p*268435456.0}else{e=p;n=c[D>>2]|0}z=(n|0)<0?D+8|0:D+8+288|0;j=z;do{v=~~e>>>0;c[j>>2]=v;j=j+4|0;e=(e-+(v>>>0))*1.0e9}while(e!=0.0);if((n|0)>0){m=z;do{g=(n|0)<29?n:29;n=j+-4|0;if(n>>>0>=m>>>0){o=0;do{u=wu(c[n>>2]|0,0,g|0)|0;u=Ow(u|0,A|0,o|0,0)|0;v=A;t=xs(u|0,v|0,1e9,0)|0;c[n>>2]=t;o=rB(u|0,v|0,1e9,0)|0;n=n+-4|0}while(n>>>0>=m>>>0);if(o){m=m+-4|0;c[m>>2]=o}}while(1){if(j>>>0<=m>>>0)break;n=j+-4|0;if(!(c[n>>2]|0))j=n;else break}n=(c[D>>2]|0)-g|0;c[D>>2]=n}while((n|0)>0)}else m=z;if((n|0)<0)do{g=0-n|0;g=(g|0)<9?g:9;if(m>>>0>>0){o=0;n=m;do{v=c[n>>2]|0;c[n>>2]=(v>>>g)+o;o=P(v&(1<>>g)|0;n=n+4|0}while(n>>>0>>0);m=(c[m>>2]|0)==0?m+4|0:m;if(o){c[j>>2]=o;j=j+4|0}}else m=(c[m>>2]|0)==0?m+4|0:m;n=(i|32|0)==102?z:m;j=(j-n>>2|0)>(((k+25|0)/9|0)+1|0)?n+(((k+25|0)/9|0)+1<<2)|0:j;n=(c[D>>2]|0)+g|0;c[D>>2]=n}while((n|0)<0);if(m>>>0>>0){n=(z-m>>2)*9|0;g=c[m>>2]|0;if(g>>>0<10)s=n;else{o=10;do{o=o*10|0;n=n+1|0}while(g>>>0>=o>>>0);s=n}}else s=0;o=k-((i|32|0)!=102?s:0)+(((k|0)!=0&(i|32|0)==103)<<31>>31)|0;if((o|0)<(((j-z>>2)*9|0)+-9|0)){n=z+4+(((o+9216|0)/9|0)+-1024<<2)|0;if((((o+9216|0)%9|0)+1|0)<9){g=((o+9216|0)%9|0)+1|0;o=10;do{o=o*10|0;g=g+1|0}while((g|0)!=9)}else o=10;q=c[n>>2]|0;r=(q>>>0)%(o>>>0)|0;g=(n+4|0)==(j|0);if(!(g&(r|0)==0)){p=(((q>>>0)/(o>>>0)|0)&1|0)==0?9007199254740992.0:9007199254740994.0;v=(o|0)/2|0;e=r>>>0>>0?.5:g&(r|0)==(v|0)?1.0:1.5;if(y){v=(a[x>>0]|0)==45;e=v?-e:e;p=v?-p:p}c[n>>2]=q-r;if(p+e!=p){v=q-r+o|0;c[n>>2]=v;if(v>>>0>999999999)while(1){o=n+-4|0;c[n>>2]=0;if(o>>>0>>0){m=m+-4|0;c[m>>2]=0}v=(c[o>>2]|0)+1|0;c[o>>2]=v;if(v>>>0>999999999)n=o;else{n=o;break}}o=(z-m>>2)*9|0;q=c[m>>2]|0;if(q>>>0>=10){g=10;do{g=g*10|0;o=o+1|0}while(q>>>0>=g>>>0)}}else o=s}else o=s;u=n+4|0;j=j>>>0>u>>>0?u:j;u=m}else{o=s;u=m}v=j;while(1){if(v>>>0<=u>>>0){t=0;break}j=v+-4|0;if(!(c[j>>2]|0))v=j;else{t=1;break}}q=0-o|0;do if((i|32|0)==103){if((o|0)>-5?((((k|0)!=0^1)&1)+k|0)>(o|0):0){n=i+-1|0;k=(((k|0)!=0^1)&1)+k+-1-o|0}else{n=i+-2|0;k=(((k|0)!=0^1)&1)+k+-1|0}if(!(h&8)){if(t?(w=c[v+-4>>2]|0,(w|0)!=0):0)if(!((w>>>0)%10|0)){j=0;m=10;do{m=m*10|0;j=j+1|0}while(!((w>>>0)%(m>>>0)|0|0))}else j=0;else j=9;m=((v-z>>2)*9|0)+-9|0;if((n|32|0)==102){g=m-j|0;g=(g|0)>0?g:0;k=(k|0)<(g|0)?k:g;g=0;break}else{g=m+o-j|0;g=(g|0)>0?g:0;k=(k|0)<(g|0)?k:g;g=0;break}}else g=h&8}else{n=i;g=h&8}while(0);s=k|g;m=(n|32|0)==102;if(m){r=0;j=(o|0)>0?o:0}else{j=(o|0)<0?q:o;j=Om(j,((j|0)<0)<<31>>31,B)|0;if((B-j|0)<2)do{j=j+-1|0;a[j>>0]=48}while((B-j|0)<2);a[j+-1>>0]=(o>>31&2)+43;j=j+-2|0;a[j>>0]=n;r=j;j=B-j|0}j=y+1+k+((s|0)!=0&1)+j|0;un(b,32,f,j,h);fA(b,x,y);un(b,48,f,j,h^65536);if(m){o=u>>>0>z>>>0?z:u;n=o;do{m=Om(c[n>>2]|0,0,D+524+9|0)|0;if((n|0)==(o|0)){if((m|0)==(D+524+9|0)){a[D+524+8>>0]=48;m=D+524+8|0}}else if(m>>>0>(D+524|0)>>>0){Yk(D+524|0,48,m-C|0)|0;do m=m+-1|0;while(m>>>0>(D+524|0)>>>0)}fA(b,m,D+524+9-m|0);n=n+4|0}while(n>>>0<=z>>>0);if(s|0)fA(b,19847,1);if(n>>>0>>0&(k|0)>0)while(1){m=Om(c[n>>2]|0,0,D+524+9|0)|0;if(m>>>0>(D+524|0)>>>0){Yk(D+524|0,48,m-C|0)|0;do m=m+-1|0;while(m>>>0>(D+524|0)>>>0)}fA(b,m,(k|0)<9?k:9);n=n+4|0;m=k+-9|0;if(!(n>>>0>>0&(k|0)>9)){k=m;break}else k=m}un(b,48,k+9|0,9,0)}else{q=t?v:u+4|0;if((k|0)>-1){g=(g|0)==0;o=u;do{m=Om(c[o>>2]|0,0,D+524+9|0)|0;if((m|0)==(D+524+9|0)){a[D+524+8>>0]=48;m=D+524+8|0}do if((o|0)==(u|0)){n=m+1|0;fA(b,m,1);if(g&(k|0)<1){m=n;break}fA(b,19847,1);m=n}else{if(m>>>0<=(D+524|0)>>>0)break;Yk(D+524|0,48,m+(0-C)|0)|0;do m=m+-1|0;while(m>>>0>(D+524|0)>>>0)}while(0);z=D+524+9-m|0;fA(b,m,(k|0)>(z|0)?z:k);k=k-z|0;o=o+4|0}while(o>>>0>>0&(k|0)>-1)}un(b,48,k+18|0,18,0);fA(b,r,B-r|0)}un(b,32,f,j,h^8192)}else{j=y+3|0;un(b,32,f,j,h&-65537);fA(b,x,y);fA(b,e!=e|0.0!=0.0?(i&32|0?19823:19827):i&32|0?19815:19819,3);un(b,32,f,j,h^8192)}while(0);l=D;return ((j|0)<(f|0)?f:j)|0}function Xc(d,e,f,g,i){d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=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;x=l;l=l+64|0;c[x+16>>2]=e;w=x+24+40|0;k=0;j=0;p=0;a:while(1){do if((j|0)>-1)if((k|0)>(2147483647-j|0)){c[7137]=75;j=-1;break}else{j=k+j|0;break}while(0);k=a[e>>0]|0;if(!(k<<24>>24)){v=87;break}else m=e;b:while(1){switch(k<<24>>24){case 37:{k=m;v=9;break b}case 0:{k=m;break b}default:{}}u=m+1|0;c[x+16>>2]=u;k=a[u>>0]|0;m=u}c:do if((v|0)==9)while(1){v=0;if((a[m+1>>0]|0)!=37)break c;k=k+1|0;m=m+2|0;c[x+16>>2]=m;if((a[m>>0]|0)==37)v=9;else break}while(0);k=k-e|0;if(d|0)fA(d,e,k);if(k|0){e=m;continue}n=m+1|0;k=(a[n>>0]|0)+-48|0;if(k>>>0<10){u=(a[m+2>>0]|0)==36;s=u?k:-1;p=u?1:p;n=u?m+3|0:n}else s=-1;c[x+16>>2]=n;k=a[n>>0]|0;d:do if(((k<<24>>24)+-32|0)>>>0<32){m=0;q=k;o=(k<<24>>24)+-32|0;while(1){k=1<>2]=n;k=a[n>>0]|0;o=(k<<24>>24)+-32|0;if(o>>>0>=32)break;else q=k}}else m=0;while(0);if(k<<24>>24==42){o=n+1|0;k=(a[o>>0]|0)+-48|0;if(k>>>0<10?(a[n+2>>0]|0)==36:0){c[i+(k<<2)>>2]=10;k=c[g+((a[o>>0]|0)+-48<<3)>>2]|0;p=1;n=n+3|0}else{if(p|0){j=-1;break}if(d|0){p=(c[f>>2]|0)+(4-1)&~(4-1);k=c[p>>2]|0;c[f>>2]=p+4;p=0;n=o}else{k=0;p=0;n=o}}c[x+16>>2]=n;t=(k|0)<0;k=t?0-k|0:k;t=t?m|8192:m}else{k=gq(x+16|0)|0;if((k|0)<0){j=-1;break}t=m;n=c[x+16>>2]|0}do if((a[n>>0]|0)==46){m=n+1|0;if((a[m>>0]|0)!=42){c[x+16>>2]=m;m=gq(x+16|0)|0;n=c[x+16>>2]|0;break}o=n+2|0;m=(a[o>>0]|0)+-48|0;if(m>>>0<10?(a[n+3>>0]|0)==36:0){c[i+(m<<2)>>2]=10;m=c[g+((a[o>>0]|0)+-48<<3)>>2]|0;n=n+4|0;c[x+16>>2]=n;break}if(p|0){j=-1;break a}if(d|0){u=(c[f>>2]|0)+(4-1)&~(4-1);m=c[u>>2]|0;c[f>>2]=u+4}else m=0;c[x+16>>2]=o;n=o}else m=-1;while(0);r=0;while(1){if(((a[n>>0]|0)+-65|0)>>>0>57){j=-1;break a}u=n+1|0;c[x+16>>2]=u;o=a[(a[n>>0]|0)+-65+(19315+(r*58|0))>>0]|0;if(((o&255)+-1|0)>>>0<8){r=o&255;n=u}else break}if(!(o<<24>>24)){j=-1;break}q=(s|0)>-1;do if(o<<24>>24==19)if(q){j=-1;break a}else v=49;else{if(q){c[i+(s<<2)>>2]=o&255;s=g+(s<<3)|0;v=c[s+4>>2]|0;c[x>>2]=c[s>>2];c[x+4>>2]=v;v=49;break}if(!d){j=0;break a}Ug(x,o&255,f)}while(0);if((v|0)==49?(v=0,(d|0)==0):0){k=0;e=u;continue}n=a[n>>0]|0;n=(r|0)!=0&(n&15|0)==3?n&-33:n;s=t&-65537;t=(t&8192|0)==0?t:s;e:do switch(n|0){case 110:switch((r&255)<<24>>24){case 0:{c[c[x>>2]>>2]=j;k=0;e=u;continue a}case 1:{c[c[x>>2]>>2]=j;k=0;e=u;continue a}case 2:{k=c[x>>2]|0;c[k>>2]=j;c[k+4>>2]=((j|0)<0)<<31>>31;k=0;e=u;continue a}case 3:{b[c[x>>2]>>1]=j;k=0;e=u;continue a}case 4:{a[c[x>>2]>>0]=j;k=0;e=u;continue a}case 6:{c[c[x>>2]>>2]=j;k=0;e=u;continue a}case 7:{k=c[x>>2]|0;c[k>>2]=j;c[k+4>>2]=((j|0)<0)<<31>>31;k=0;e=u;continue a}default:{k=0;e=u;continue a}}case 112:{n=120;m=m>>>0>8?m:8;e=t|8;v=61;break}case 88:case 120:{e=t;v=61;break}case 111:{e=c[x>>2]|0;n=c[x+4>>2]|0;s=sr(e,n,w)|0;r=s;o=0;q=19779;m=(t&8|0)==0|(m|0)>(w-s|0)?m:w-s+1|0;s=t;v=67;break}case 105:case 100:{e=c[x>>2]|0;n=c[x+4>>2]|0;if((n|0)<0){e=sw(0,0,e|0,n|0)|0;n=A;c[x>>2]=e;c[x+4>>2]=n;o=1;q=19779;v=66;break e}else{o=(t&2049|0)!=0&1;q=(t&2048|0)==0?((t&1|0)==0?19779:19781):19780;v=66;break e}}case 117:{o=0;q=19779;e=c[x>>2]|0;n=c[x+4>>2]|0;v=66;break}case 99:{a[x+24+39>>0]=c[x>>2];e=x+24+39|0;o=0;q=19779;r=w;n=1;m=s;break}case 109:{n=pI(c[7137]|0)|0;v=71;break}case 115:{n=c[x>>2]|0;n=n|0?n:19789;v=71;break}case 67:{c[x+8>>2]=c[x>>2];c[x+8+4>>2]=0;c[x>>2]=x+8;r=-1;n=x+8|0;v=75;break}case 83:{e=c[x>>2]|0;if(!m){un(d,32,k,0,t);e=0;v=84}else{r=m;n=e;v=75}break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{k=Wc(d,+h[x>>3],k,m,t,n)|0;e=u;continue a}default:{o=0;q=19779;r=w;n=m;m=t}}while(0);f:do if((v|0)==61){y=c[x>>2]|0;t=c[x+4>>2]|0;r=qq(y,t,w,n&32)|0;q=(e&8|0)==0|(y|0)==0&(t|0)==0;o=q?0:2;q=q?19779:19779+(n>>4)|0;s=e;e=y;n=t;v=67}else if((v|0)==66){r=Om(e,n,w)|0;s=t;v=67}else if((v|0)==71){v=0;y=Kj(n,m)|0;e=n;o=0;q=19779;r=(y|0)==0?n+m|0:y;n=(y|0)==0?m:y-n|0;m=s}else if((v|0)==75){v=0;q=n;e=0;m=0;while(1){o=c[q>>2]|0;if(!o)break;m=OA(x+20|0,o)|0;if((m|0)<0|m>>>0>(r-e|0)>>>0)break;e=m+e|0;if(r>>>0>e>>>0)q=q+4|0;else break}if((m|0)<0){j=-1;break a}un(d,32,k,e,t);if(!e){e=0;v=84}else{o=0;while(1){m=c[n>>2]|0;if(!m){v=84;break f}m=OA(x+20|0,m)|0;o=m+o|0;if((o|0)>(e|0)){v=84;break f}fA(d,x+20|0,m);if(o>>>0>=e>>>0){v=84;break}else n=n+4|0}}}while(0);if((v|0)==67){v=0;n=(e|0)!=0|(n|0)!=0;y=(m|0)!=0|n;n=((n^1)&1)+(w-r)|0;e=y?r:w;r=w;n=y?((m|0)>(n|0)?m:n):m;m=(m|0)>-1?s&-65537:s}else if((v|0)==84){v=0;un(d,32,k,e,t^8192);k=(k|0)>(e|0)?k:e;e=u;continue}t=r-e|0;s=(n|0)<(t|0)?t:n;y=s+o|0;k=(k|0)<(y|0)?y:k;un(d,32,k,y,m);fA(d,q,o);un(d,48,k,y,m^65536);un(d,48,s,t,0);fA(d,e,t);un(d,32,k,y,m^8192);e=u}g:do if((v|0)==87)if(!d)if(!p)j=0;else{j=1;while(1){e=c[i+(j<<2)>>2]|0;if(!e){k=0;break}Ug(g+(j<<3)|0,e,f);j=j+1|0;if((j|0)>=10){j=1;break g}}while(1){e=j+1|0;if(k|0){j=-1;break g}if((e|0)>=10){j=1;break g}j=e;k=c[i+(e<<2)>>2]|0}}while(0);l=x;return j|0}function Yc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0;u=l;l=l+672|0;c[u+448+8>>2]=0;c[u+448+12>>2]=-1;m=u+448+28|0;c[u+448>>2]=7020;c[u+448+4>>2]=8;c[u+448+16>>2]=1065353216;c[u+448+20>>2]=1065353216;c[u+448+24>>2]=1065353216;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;c[m+20>>2]=0;c[m+24>>2]=0;g[u+384>>2]=1.0;m=u+384+4|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;g[u+384+20>>2]=1.0;n=u+384+24|0;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;g[u+384+40>>2]=1.0;g[u+384+44>>2]=0.0;c[u+384+48>>2]=c[a>>2];c[u+384+48+4>>2]=c[a+4>>2];c[u+384+48+8>>2]=c[a+8>>2];c[u+384+48+12>>2]=c[a+12>>2];a=e;k=a+36|0;do{c[a>>2]=0;a=a+4|0}while((a|0)<(k|0));c[u+504>>2]=b;c[u+504+4>>2]=u+448;w=+g[d>>2];v=+g[d+16>>2];f=+g[d+32>>2];h=+g[d+4>>2];i=+g[d+20>>2];j=+g[d+36>>2];s=+g[d+8>>2];q=+g[d+24>>2];o=+g[d+40>>2];g[u+504+8>>2]=w+v*0.0+f*0.0;g[u+504+12>>2]=h+i*0.0+j*0.0;g[u+504+16>>2]=s+q*0.0+o*0.0;g[u+504+20>>2]=0.0;g[u+504+24>>2]=w*0.0+v+f*0.0;g[u+504+28>>2]=h*0.0+i+j*0.0;g[u+504+32>>2]=s*0.0+q+o*0.0;g[u+504+36>>2]=0.0;g[u+504+40>>2]=w*0.0+v*0.0+f;g[u+504+44>>2]=h*0.0+i*0.0+j;g[u+504+48>>2]=s*0.0+q*0.0+o;g[u+504+52>>2]=0.0;o=+g[u+384+48>>2]-+g[d+48>>2];q=+g[u+384+52>>2]-+g[d+52>>2];s=+g[u+384+56>>2]-+g[d+56>>2];G=+g[u+384>>2];F=+g[u+384+16>>2];E=+g[u+384+32>>2];C=+g[m>>2];B=+g[u+384+20>>2];A=+g[u+384+36>>2];z=+g[u+384+8>>2];y=+g[n>>2];x=+g[u+384+40>>2];p=+g[d+8>>2];r=+g[d+24>>2];t=+g[d+40>>2];g[u+504+56>>2]=w*G+v*F+f*E;g[u+504+60>>2]=w*C+v*B+f*A;g[u+504+64>>2]=w*z+v*y+f*x;g[u+504+68>>2]=0.0;g[u+504+72>>2]=G*h+F*i+E*j;g[u+504+76>>2]=C*h+B*i+A*j;g[u+504+80>>2]=z*h+y*i+x*j;g[u+504+84>>2]=0.0;g[u+504+88>>2]=G*p+F*r+E*t;g[u+504+92>>2]=C*p+B*r+A*t;g[u+504+96>>2]=z*p+y*r+x*t;g[u+504+100>>2]=0.0;g[u+504+104>>2]=o*w+q*v+s*f;g[u+504+108>>2]=o*h+q*i+s*j;g[u+504+112>>2]=o*p+q*r+s*t;g[u+504+116>>2]=0.0;c[u+504+120>>2]=80;c[u+504+124>>2]=0;c[u+364>>2]=0;c[u+128>>2]=0;c[u+128+4>>2]=0;c[u+128+8>>2]=0;c[u+128+12>>2]=0;c[u+376>>2]=2;c[u+368>>2]=0;g[u+144>>2]=0.0;c[u+648>>2]=1065353216;c[u+648+4>>2]=1065353216;c[u+648+8>>2]=1065353216;g[u+648+12>>2]=0.0;switch(Jc(u,u+504|0,u+648|0)|0){case 0:{a=c[u+372>>2]|0;if(!(c[a+32>>2]|0)){j=0.0;i=0.0;f=0.0;r=0.0;q=0.0;h=0.0}else{n=0;f=0.0;i=0.0;j=0.0;h=0.0;q=0.0;r=0.0;do{t=+g[a+16+(n<<2)>>2];k=c[u+504+120>>2]|0;H=c[u+504+124>>2]|0;m=(c[u+504>>2]|0)+(H>>1)|0;if(H&1)k=c[(c[m>>2]|0)+k>>2]|0;Sb[k&127](u+648|0,m,c[a+(n<<2)>>2]|0);f=f+t*+g[u+648>>2];i=i+t*+g[u+648+4>>2];j=j+t*+g[u+648+8>>2];a=c[(c[u+372>>2]|0)+(n<<2)>>2]|0;o=-+g[a>>2];p=-+g[a+4>>2];s=-+g[a+8>>2];a=c[u+504+120>>2]|0;H=c[u+504+124>>2]|0;k=(c[u+504+4>>2]|0)+(H>>1)|0;if(H&1)a=c[(c[k>>2]|0)+a>>2]|0;F=+g[u+504+24>>2]*o+ +g[u+504+28>>2]*p+ +g[u+504+32>>2]*s;E=+g[u+504+40>>2]*o+ +g[u+504+44>>2]*p+ +g[u+504+48>>2]*s;g[u+632>>2]=+g[u+504+8>>2]*o+ +g[u+504+12>>2]*p+ +g[u+504+16>>2]*s;g[u+632+4>>2]=F;g[u+632+8>>2]=E;g[u+632+12>>2]=0.0;Sb[a&127](u+648|0,k,u+632|0);E=+g[u+648>>2];F=+g[u+648+4>>2];G=+g[u+648+8>>2];h=h+t*(E*+g[u+504+56>>2]+F*+g[u+504+60>>2]+G*+g[u+504+64>>2]+ +g[u+504+104>>2]);q=q+t*(E*+g[u+504+72>>2]+F*+g[u+504+76>>2]+G*+g[u+504+80>>2]+ +g[u+504+108>>2]);r=r+t*(E*+g[u+504+88>>2]+F*+g[u+504+92>>2]+G*+g[u+504+96>>2]+ +g[u+504+112>>2]);n=n+1|0;a=c[u+372>>2]|0}while(n>>>0<(c[a+32>>2]|0)>>>0)}s=f*+g[d>>2]+i*+g[d+4>>2]+j*+g[d+8>>2]+ +g[d+48>>2];t=f*+g[d+16>>2]+i*+g[d+20>>2]+j*+g[d+24>>2]+ +g[d+52>>2];j=f*+g[d+32>>2]+i*+g[d+36>>2]+j*+g[d+40>>2]+ +g[d+56>>2];g[e+4>>2]=s;g[e+8>>2]=t;g[e+12>>2]=j;g[e+16>>2]=0.0;o=h*+g[d>>2]+q*+g[d+4>>2]+r*+g[d+8>>2]+ +g[d+48>>2];p=h*+g[d+16>>2]+q*+g[d+20>>2]+r*+g[d+24>>2]+ +g[d+52>>2];i=h*+g[d+32>>2]+q*+g[d+36>>2]+r*+g[d+40>>2]+ +g[d+56>>2];g[e+20>>2]=o;g[e+24>>2]=p;g[e+28>>2]=i;g[e+32>>2]=0.0;switch(c[b+4>>2]|0){case 8:{f=+g[b+32>>2]*+g[b+16>>2];break}case 0:{f=+g[b+48>>2];break}case 1:{f=+g[b+48>>2];break}case 13:{f=+g[b+48>>2];break}case 11:{f=+g[b+48>>2];break}case 10:{f=+g[b+48>>2];break}case 4:case 5:{f=+g[b+48>>2];break}default:f=+nb[c[(c[b>>2]|0)+48>>2]&15](b)}switch(c[u+448+4>>2]|0){case 8:{h=+g[u+448+32>>2]*+g[u+448+16>>2];break}case 0:{h=+g[u+448+48>>2];break}case 1:{h=+g[u+448+48>>2];break}case 13:{h=+g[u+448+48>>2];break}case 11:{h=+g[u+448+48>>2];break}case 10:{h=+g[u+448+48>>2];break}case 4:case 5:{h=+g[u+448+48>>2];break}default:h=+nb[c[(c[u+448>>2]|0)+48>>2]&15](u+448|0)}G=f+h;F=+D(+((o-s)*(o-s)+(p-t)*(p-t)+(i-j)*(i-j)));g[e+36>>2]=(o-s)*(1.0/F);g[e+40>>2]=(p-t)*(1.0/F);g[e+44>>2]=(i-j)*(1.0/F);g[e+48>>2]=0.0;g[e+4>>2]=G*(o-s)*(1.0/F)+ +g[e+4>>2];g[e+8>>2]=G*(p-t)*(1.0/F)+ +g[e+8>>2];g[e+12>>2]=G*(i-j)*(1.0/F)+ +g[e+12>>2];G=F-G;l=u;return +G}case 1:{if(!(Hc(b,d,u+448|0,u+384|0,u+128|0,e,1)|0)){G=3402823466385288598117041.0e14;l=u;return +G}f=+g[e+4>>2]-+g[e+20>>2];h=+g[e+8>>2]-+g[e+24>>2];i=+g[e+12>>2]-+g[e+28>>2];j=+D(+(f*f+h*h+i*i));if(j>=1.1920928955078125e-07){g[e+36>>2]=f*(1.0/j);g[e+40>>2]=h*(1.0/j);g[e+44>>2]=i*(1.0/j);g[e+48>>2]=0.0}G=-j;l=u;return +G}default:{G=3402823466385288598117041.0e14;l=u;return +G}}return 0.0}function Zc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0;if((a[b+180>>0]|0)==0?(a[b+48>>0]|0)!=0:0){r=+g[b+116>>2];h=+g[e>>2];I=+g[b+132>>2];f=+g[e+4>>2];J=+g[b+148>>2];y=+g[e+8>>2];s=+g[b+120>>2];G=+g[b+136>>2];H=+g[b+152>>2];t=+g[b+124>>2];F=+g[b+140>>2];u=+g[b+156>>2];w=+g[e+16>>2];x=+g[e+20>>2];z=+g[e+24>>2];E=+g[e+32>>2];v=+g[e+36>>2];A=+g[e+40>>2];m=+g[b+164>>2];i=+g[b+168>>2];D=+g[b+172>>2];C=+g[e+48>>2]+(h*m+f*i+y*D);B=w*m+x*i+z*D+ +g[e+52>>2];D=E*m+v*i+A*D+ +g[e+56>>2];g[b+824>>2]=r*h+I*f+J*y;g[b+828>>2]=h*s+f*G+y*H;g[b+832>>2]=h*t+f*F+y*u;g[b+836>>2]=0.0;g[b+840>>2]=r*w+I*x+J*z;g[b+844>>2]=s*w+G*x+H*z;g[b+848>>2]=t*w+F*x+u*z;g[b+852>>2]=0.0;g[b+856>>2]=r*E+I*v+J*A;g[b+860>>2]=s*E+G*v+H*A;g[b+864>>2]=t*E+F*v+u*A;g[b+868>>2]=0.0;g[b+872>>2]=C;g[b+876>>2]=B;g[b+880>>2]=D;g[b+884>>2]=0.0;D=+g[b+52>>2];B=+g[d>>2];C=+g[b+68>>2];A=+g[d+4>>2];u=+g[b+84>>2];v=+g[d+8>>2];F=+g[b+56>>2];E=+g[b+72>>2];t=+g[b+88>>2];H=+g[b+60>>2];G=+g[b+76>>2];s=+g[b+92>>2];J=+g[d+16>>2];I=+g[d+20>>2];r=+g[d+24>>2];z=+g[d+32>>2];x=+g[d+36>>2];w=+g[d+40>>2];y=+g[b+100>>2];f=+g[b+104>>2];h=+g[b+108>>2];k=b+856|0;l=b+840|0;i=J*y+I*f+r*h;m=H*z+G*x+s*w;n=F*z+E*x+t*w;o=D*z+C*x+u*w;p=H*J+G*I+s*r;q=F*J+E*I+t*r;r=D*J+C*I+u*r;s=B*H+A*G+v*s;t=B*F+A*E+v*t;u=D*B+C*A+u*v;v=B*y+A*f+v*h;f=z*y+x*f;h=w*h}else{r=+g[b+52>>2];h=+g[d>>2];x=+g[b+68>>2];f=+g[d+4>>2];w=+g[b+84>>2];H=+g[d+8>>2];s=+g[b+56>>2];z=+g[b+72>>2];y=+g[b+88>>2];t=+g[b+60>>2];A=+g[b+76>>2];u=+g[b+92>>2];J=+g[d+16>>2];I=+g[d+20>>2];G=+g[d+24>>2];B=+g[d+32>>2];v=+g[d+36>>2];F=+g[d+40>>2];m=+g[b+100>>2];i=+g[b+104>>2];C=+g[b+108>>2];D=+g[d+48>>2]+(h*m+f*i+H*C);E=J*m+I*i+G*C+ +g[d+52>>2];C=B*m+v*i+F*C+ +g[d+56>>2];g[b+824>>2]=r*h+x*f+w*H;g[b+828>>2]=h*s+f*z+H*y;g[b+832>>2]=h*t+f*A+H*u;g[b+836>>2]=0.0;g[b+840>>2]=r*J+x*I+w*G;g[b+844>>2]=s*J+z*I+y*G;g[b+848>>2]=t*J+A*I+u*G;g[b+852>>2]=0.0;g[b+856>>2]=r*B+x*v+w*F;g[b+860>>2]=s*B+z*v+y*F;g[b+864>>2]=t*B+A*v+u*F;g[b+868>>2]=0.0;g[b+872>>2]=D;g[b+876>>2]=E;g[b+880>>2]=C;g[b+884>>2]=0.0;C=+g[b+116>>2];E=+g[e>>2];D=+g[b+132>>2];F=+g[e+4>>2];u=+g[b+148>>2];v=+g[e+8>>2];A=+g[b+120>>2];B=+g[b+136>>2];t=+g[b+152>>2];y=+g[b+124>>2];z=+g[b+140>>2];s=+g[b+156>>2];w=+g[e+16>>2];x=+g[e+20>>2];r=+g[e+24>>2];G=+g[e+32>>2];I=+g[e+36>>2];J=+g[e+40>>2];H=+g[b+164>>2];f=+g[b+168>>2];h=+g[b+172>>2];k=b+856|0;l=b+840|0;i=w*H+x*f+r*h;m=y*G+z*I+s*J;n=A*G+B*I+t*J;o=C*G+D*I+u*J;p=y*w+z*x+s*r;q=A*w+B*x+t*r;r=C*w+D*x+u*r;s=E*y+F*z+v*s;t=E*A+F*B+v*t;u=C*E+D*F+u*v;v=E*H+F*f+v*h;d=e;f=G*H+I*f;h=J*h}J=v+ +g[d+48>>2];i=i+ +g[d+52>>2];f=h+f+ +g[d+56>>2];g[b+888>>2]=u;g[b+892>>2]=t;g[b+896>>2]=s;g[b+900>>2]=0.0;g[b+904>>2]=r;g[b+908>>2]=q;g[b+912>>2]=p;g[b+916>>2]=0.0;g[b+920>>2]=o;g[b+924>>2]=n;g[b+928>>2]=m;g[b+932>>2]=0.0;g[b+936>>2]=J;g[b+940>>2]=i;g[b+944>>2]=f;g[b+948>>2]=0.0;c[b+968>>2]=c[b+872>>2];c[b+968+4>>2]=c[b+872+4>>2];c[b+968+8>>2]=c[b+872+8>>2];c[b+968+12>>2]=c[b+872+12>>2];c[b+984>>2]=c[b+936>>2];c[b+984+4>>2]=c[b+936+4>>2];c[b+984+8>>2]=c[b+936+8>>2];c[b+984+12>>2]=c[b+936+12>>2];d=c[b+824>>2]|0;e=c[l>>2]|0;l=c[k>>2]|0;c[b+952>>2]=d;c[b+956>>2]=e;c[b+960>>2]=l;g[b+964>>2]=0.0;f=(c[j>>2]=d,+g[j>>2]);h=(c[j>>2]=e,+g[j>>2]);i=(c[j>>2]=l,+g[j>>2]);if((a[b+180>>0]|0)==0?(a[b+48>>0]|0)==0:0){l=b+984|0;k=b+968|0;H=+g[k>>2];G=+g[l>>2];G=H-G;e=k+4|0;H=+g[e>>2];e=l+4|0;I=+g[e>>2];I=H-I;k=k+8|0;H=+g[k>>2];l=l+8|0;J=+g[l>>2];J=H-J;l=b+1016|0;g[l>>2]=G;l=b+1020|0;g[l>>2]=I;l=b+1024|0;g[l>>2]=J;l=b+1028|0;g[l>>2]=0.0;H=f*G;D=h*I;D=H+D;H=i*J;H=D+H;D=f*H;E=h*H;F=i*H;C=+g[b+968>>2];D=C+D;l=b+972|0;C=+g[l>>2];E=C+E;l=b+976|0;C=+g[l>>2];F=C+F;l=b+1e3|0;g[l>>2]=D;l=b+1004|0;g[l>>2]=E;l=b+1008|0;g[l>>2]=F;l=b+1012|0;g[l>>2]=0.0;l=b+1032|0;g[l>>2]=H;l=b+828|0;k=b+844|0;e=b+860|0;H=+g[l>>2];F=+g[k>>2];E=+g[e>>2];H=H*G;F=F*I;F=H+F;E=E*J;E=F+E;e=b+1036|0;g[e>>2]=E;e=b+832|0;k=b+848|0;l=b+864|0;E=+g[e>>2];F=+g[k>>2];H=+g[l>>2];G=E*G;I=F*I;I=G+I;J=H*J;J=I+J;b=b+1040|0;g[b>>2]=J;return}l=b+968|0;k=b+984|0;H=+g[k>>2];G=+g[l>>2];G=H-G;e=k+4|0;H=+g[e>>2];e=l+4|0;I=+g[e>>2];I=H-I;k=k+8|0;H=+g[k>>2];l=l+8|0;J=+g[l>>2];J=H-J;l=b+1016|0;g[l>>2]=G;l=b+1020|0;g[l>>2]=I;l=b+1024|0;g[l>>2]=J;l=b+1028|0;g[l>>2]=0.0;H=f*G;D=h*I;D=H+D;H=i*J;H=D+H;D=f*H;E=h*H;F=i*H;C=+g[b+968>>2];D=C+D;l=b+972|0;C=+g[l>>2];E=C+E;l=b+976|0;C=+g[l>>2];F=C+F;l=b+1e3|0;g[l>>2]=D;l=b+1004|0;g[l>>2]=E;l=b+1008|0;g[l>>2]=F;l=b+1012|0;g[l>>2]=0.0;l=b+1032|0;g[l>>2]=H;l=b+828|0;k=b+844|0;e=b+860|0;H=+g[l>>2];F=+g[k>>2];E=+g[e>>2];H=H*G;F=F*I;F=H+F;E=E*J;E=F+E;e=b+1036|0;g[e>>2]=E;e=b+832|0;k=b+848|0;l=b+864|0;E=+g[e>>2];F=+g[k>>2];H=+g[l>>2];G=E*G;I=F*I;I=G+I;J=H*J;J=I+J;b=b+1040|0;g[b>>2]=J;return}function _c(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,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,z=0.0,A=0.0;if((d|0)<=1){x=0;return x|0}w=c[b+772>>2]|0;x=P(w,w)|0;x=$I(x>>>0>1073741823?-1:x<<2)|0;if((w|0)>0){h=0;do{i=P(h,w)|0;f=0;do{p=x+((P(f,w)|0)+h<<2)|0;t=(f|0)==(h|0)?0:2147483647;c[p>>2]=t;c[x+(f+i<<2)>>2]=t;f=f+1|0}while((f|0)!=(w|0));h=h+1|0}while((h|0)!=(w|0))}h=c[b+792>>2]|0;if((h|0)>0){i=c[b+800>>2]|0;j=c[b+780>>2]|0;f=0;do{p=((c[i+(f*52|0)+24>>2]|0)-j|0)/104|0;t=((c[i+(f*52|0)+28>>2]|0)-j|0)/104|0;c[x+((P(t,w)|0)+p<<2)>>2]=1;c[x+((P(p,w)|0)+t<<2)>>2]=1;f=f+1|0}while((f|0)!=(h|0))}do if((d|0)!=2)if((w|0)>0){f=0;do{k=P(f,w)|0;h=0;do{i=h;h=h+1|0;if((h|0)<(w|0)){n=P(i,w)|0;l=x+(n+f<<2)|0;j=h;do{m=(c[l>>2]|0)+(c[x+(j+k<<2)>>2]|0)|0;o=x+(j+n<<2)|0;if((c[o>>2]|0)>>>0>m>>>0){c[x+((P(j,w)|0)+i<<2)>>2]=m;c[o>>2]=m}j=j+1|0}while((j|0)!=(w|0))}}while((h|0)!=(w|0));f=f+1|0}while((f|0)!=(w|0));q=79}else f=0;else{if((w|0)<0)gb();if(!w)t=0;else{c[6995]=(c[6995]|0)+1;f=sc((w*20|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=0;do{a[f+(h*20|0)+16>>0]=1;t=f+(h*20|0)+4|0;h=h+1|0;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0}while((h|0)!=(w|0));t=f}if((c[b+792>>2]|0)>0){n=0;do{m=c[b+800>>2]|0;p=c[b+780>>2]|0;o=((c[m+(n*52|0)+24>>2]|0)-p|0)/104|0;p=((c[m+(n*52|0)+28>>2]|0)-p|0)/104|0;m=t+(o*20|0)+4|0;f=c[m>>2]|0;a:do if((f|0)>0){i=c[t+(o*20|0)+12>>2]|0;h=0;while(1){if((c[i+(h<<2)>>2]|0)==(p|0))break;h=h+1|0;if((h|0)>=(f|0)){q=34;break a}}if((h|0)==(f|0))q=34}else q=34;while(0);if((q|0)==34){q=0;l=t+(o*20|0)+8|0;if((f|0)==(c[l>>2]|0)?(r=f|0?f<<1:1,(f|0)<(r|0)):0){if(!r)k=0;else{c[6995]=(c[6995]|0)+1;f=sc((r<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}k=f;f=c[m>>2]|0}j=t+(o*20|0)+12|0;i=c[j>>2]|0;if((f|0)<=0)if(!i)h=t+(o*20|0)+16|0;else q=44;else{h=0;do{c[k+(h<<2)>>2]=c[i+(h<<2)>>2];h=h+1|0}while((h|0)!=(f|0));q=44}if((q|0)==44){q=0;f=t+(o*20|0)+16|0;if(a[f>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[j>>2]=0;h=f;f=c[m>>2]|0}a[h>>0]=1;c[j>>2]=k;c[l>>2]=r}c[(c[t+(o*20|0)+12>>2]|0)+(f<<2)>>2]=p;c[m>>2]=(c[m>>2]|0)+1}m=t+(p*20|0)+4|0;f=c[m>>2]|0;b:do if((f|0)>0){i=c[t+(p*20|0)+12>>2]|0;h=0;while(1){if((c[i+(h<<2)>>2]|0)==(o|0))break;h=h+1|0;if((h|0)>=(f|0)){q=54;break b}}if((h|0)==(f|0))q=54}else q=54;while(0);if((q|0)==54){q=0;l=t+(p*20|0)+8|0;if((f|0)==(c[l>>2]|0)?(s=f|0?f<<1:1,(f|0)<(s|0)):0){if(!s)k=0;else{c[6995]=(c[6995]|0)+1;f=sc((s<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}k=f;f=c[m>>2]|0}j=t+(p*20|0)+12|0;i=c[j>>2]|0;if((f|0)<=0)if(!i)h=t+(p*20|0)+16|0;else q=64;else{h=0;do{c[k+(h<<2)>>2]=c[i+(h<<2)>>2];h=h+1|0}while((h|0)!=(f|0));q=64}if((q|0)==64){q=0;f=t+(p*20|0)+16|0;if(a[f>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[j>>2]=0;h=f;f=c[m>>2]|0}a[h>>0]=1;c[j>>2]=k;c[l>>2]=s}c[(c[t+(p*20|0)+12>>2]|0)+(f<<2)>>2]=o;c[m>>2]=(c[m>>2]|0)+1}n=n+1|0}while((n|0)<(c[b+792>>2]|0))}if((w|0)<=0){if(!t){f=0;break}}else{o=0;do{q=t+(o*20|0)+4|0;f=c[q>>2]|0;if((f|0)>0){r=P(o,w)|0;p=c[t+(o*20|0)+12>>2]|0;n=0;do{l=c[p+(n<<2)>>2]|0;m=t+(l*20|0)+4|0;h=c[m>>2]|0;if((h|0)>0){k=x+((P(l,w)|0)+o<<2)|0;j=c[t+(l*20|0)+12>>2]|0;i=0;f=h;do{h=c[j+(i<<2)>>2]|0;if((o|0)!=(h|0)?(v=P(h,w)|0,u=(c[x+(v+l<<2)>>2]|0)+(c[k>>2]|0)|0,v=x+(v+o<<2)|0,(c[v>>2]|0)>>>0>u>>>0):0){c[x+(h+r<<2)>>2]=u;c[v>>2]=u;f=c[m>>2]|0}i=i+1|0}while((i|0)<(f|0));f=c[q>>2]|0}n=n+1|0}while((n|0)<(f|0))}o=o+1|0}while((o|0)!=(w|0));f=0;do{i=t+(f*20|0)+4|0;j=t+(f*20|0)+12|0;k=c[j>>2]|0;h=t+(f*20|0)+16|0;if(k|0){if(a[h>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[j>>2]=0}a[h>>0]=1;c[j>>2]=0;c[i>>2]=0;c[t+(f*20|0)+8>>2]=0;f=f+1|0}while((f|0)!=(w|0))}c[6996]=(c[6996]|0)+1;Cd(c[t+-4>>2]|0);q=79}while(0);if((q|0)==79)if((w|0)>0){f=0;k=0;do{i=k;k=k+1|0;if((k|0)<(w|0)){j=P(i,w)|0;h=k;do{if((c[x+(h+j<<2)>>2]|0)==(d|0)){t=c[b+780>>2]|0;Xh(b,e);v=(c[b+792>>2]|0)+-1|0;u=c[b+800>>2]|0;c[u+(v*52|0)+24>>2]=t+(h*104|0);c[u+(v*52|0)+28>>2]=t+(i*104|0);A=+g[t+(h*104|0)+8>>2]-+g[t+(i*104|0)+8>>2];z=+g[t+(h*104|0)+12>>2]-+g[t+(i*104|0)+12>>2];y=+g[t+(h*104|0)+16>>2]-+g[t+(i*104|0)+16>>2];g[u+(v*52|0)+32>>2]=+D(+(A*A+z*z+y*y));a[b+984>>0]=1;v=(c[b+800>>2]|0)+(v*52|0)+36|0;a[v>>0]=a[v>>0]|1;f=f+1|0}h=h+1|0}while((h|0)!=(w|0))}}while((k|0)!=(w|0))}else f=0;aJ(x);x=f;return x|0}function $c(b,d,e){b=b|0;d=d|0;e=+e;var f=0,h=0,i=0,j=0,k=0,m=0.0,n=0.0,o=0,p=0,q=0.0,r=0,s=0;s=l;l=l+112|0;j=c[b+776>>2]|0;if((j|0)==(c[b+772>>2]|0)){a:do if(j){i=c[b+780>>2]|0;if((j|0)>0){f=0;h=i;while(1){h=c[h+(f*104|0)+96>>2]|0;if(h|0)c[h+36>>2]=f;f=f+1|0;if((f|0)==(j|0)){o=i;break a}h=c[b+780>>2]|0}}else o=i}else o=0;while(0);h=c[b+792>>2]|0;if((h|0)>0){f=0;do{p=(c[b+800>>2]|0)+(f*52|0)+24|0;c[p>>2]=((c[p>>2]|0)-o|0)/104|0;p=(c[b+800>>2]|0)+(f*52|0)+28|0;c[p>>2]=((c[p>>2]|0)-o|0)/104|0;f=f+1|0}while((f|0)!=(h|0))}h=c[b+812>>2]|0;if((h|0)>0){f=0;do{i=(c[b+820>>2]|0)+(f*44|0)+8|0;c[i>>2]=((c[i>>2]|0)-o|0)/104|0;i=(c[b+820>>2]|0)+(f*44|0)+12|0;c[i>>2]=((c[i>>2]|0)-o|0)/104|0;i=(c[b+820>>2]|0)+(f*44|0)+16|0;c[i>>2]=((c[i>>2]|0)-o|0)/104|0;i=c[(c[b+820>>2]|0)+(f*44|0)+40>>2]|0;if(i|0)c[i+36>>2]=f;f=f+1|0}while((f|0)!=(h|0))}h=c[b+852>>2]|0;if((h|0)>0){i=c[b+860>>2]|0;f=0;do{p=i+(f*96|0)|0;c[p>>2]=((c[p>>2]|0)-o|0)/104|0;f=f+1|0}while((f|0)!=(h|0))}k=c[b+752>>2]|0;if((k|0)>0){i=0;f=c[b+760>>2]|0;do{if((c[f+(i*60|0)+24>>2]|0)>0){h=0;do{f=f+(i*60|0)+28+(h<<2)|0;c[f>>2]=((c[f>>2]|0)-o|0)/104|0;h=h+1|0;f=c[b+760>>2]|0}while((h|0)<(c[f+(i*60|0)+24>>2]|0))}i=i+1|0}while((i|0)!=(k|0))}if((j|0)<(j<<1|1|0)){c[6995]=(c[6995]|0)+1;f=sc(((j<<1|1)*104|3)+16|0)|0;if(!f)i=0;else{c[(f+4+15&-16)+-4>>2]=f;i=f+4+15&-16}h=c[b+772>>2]|0;if((h|0)>0){f=0;do{o=i+(f*104|0)|0;k=(c[b+780>>2]|0)+(f*104|0)|0;p=o+104|0;do{c[o>>2]=c[k>>2];o=o+4|0;k=k+4|0}while((o|0)<(p|0));f=f+1|0}while((f|0)!=(h|0))}f=c[b+780>>2]|0;if(f|0){if(a[b+784>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+780>>2]=0}a[b+784>>0]=1;c[b+780>>2]=i;c[b+776>>2]=j<<1|1;j=c[b+772>>2]|0}b:do if(j){k=c[b+780>>2]|0;if((j|0)>0){f=0;h=k;while(1){i=c[h+(f*104|0)+96>>2]|0;if(i|0)c[i+36>>2]=h+(f*104|0);f=f+1|0;if((f|0)==(j|0))break b;h=c[b+780>>2]|0}}}else k=0;while(0);h=c[b+792>>2]|0;if((h|0)>0){f=0;do{p=(c[b+800>>2]|0)+(f*52|0)+24|0;c[p>>2]=k+((c[p>>2]|0)*104|0);p=(c[b+800>>2]|0)+(f*52|0)+28|0;c[p>>2]=k+((c[p>>2]|0)*104|0);f=f+1|0}while((f|0)!=(h|0))}h=c[b+812>>2]|0;if((h|0)>0){f=0;do{i=(c[b+820>>2]|0)+(f*44|0)+8|0;c[i>>2]=k+((c[i>>2]|0)*104|0);i=(c[b+820>>2]|0)+(f*44|0)+12|0;c[i>>2]=k+((c[i>>2]|0)*104|0);i=(c[b+820>>2]|0)+(f*44|0)+16|0;c[i>>2]=k+((c[i>>2]|0)*104|0);i=c[b+820>>2]|0;j=c[i+(f*44|0)+40>>2]|0;if(j|0)c[j+36>>2]=i+(f*44|0);f=f+1|0}while((f|0)!=(h|0))}i=c[b+852>>2]|0;if((i|0)>0){h=c[b+860>>2]|0;f=0;do{p=h+(f*96|0)|0;c[p>>2]=k+((c[p>>2]|0)*104|0);f=f+1|0}while((f|0)!=(i|0))}j=c[b+752>>2]|0;if((j|0)>0){i=0;f=c[b+760>>2]|0;do{if((c[f+(i*60|0)+24>>2]|0)>0){h=0;do{f=f+(i*60|0)+28+(h<<2)|0;c[f>>2]=k+((c[f>>2]|0)*104|0);h=h+1|0;f=c[b+760>>2]|0}while((h|0)<(c[f+(i*60|0)+24>>2]|0))}i=i+1|0}while((i|0)!=(j|0))}}o=c[b+192>>2]|0;q=+nb[c[(c[o>>2]|0)+48>>2]&15](o);o=s;p=o+100|0;do{c[o>>2]=0;o=o+4|0}while((o|0)<(p|0));f=c[b+772>>2]|0;if((f|0)==(c[b+776>>2]|0)?(r=f|0?f<<1:1,(f|0)<(r|0)):0){if(!r)i=0;else{c[6995]=(c[6995]|0)+1;f=sc((r*104|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=f;f=c[b+772>>2]|0}if((f|0)>0){h=0;do{o=i+(h*104|0)|0;k=(c[b+780>>2]|0)+(h*104|0)|0;p=o+104|0;do{c[o>>2]=c[k>>2];o=o+4|0;k=k+4|0}while((o|0)<(p|0));h=h+1|0}while((h|0)!=(f|0))}f=c[b+780>>2]|0;if(f|0){if(a[b+784>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+780>>2]=0}a[b+784>>0]=1;c[b+780>>2]=i;c[b+776>>2]=r;f=c[b+772>>2]|0}o=c[b+780>>2]|0;c[o+(f*104|0)>>2]=0;o=o+(f*104|0)+4|0;k=s;p=o+100|0;do{c[o>>2]=c[k>>2];o=o+4|0;k=k+4|0}while((o|0)<(p|0));h=c[b+772>>2]|0;c[b+772>>2]=h+1;i=c[b+780>>2]|0;o=i+(h*104|0)|0;p=o+104|0;do{c[o>>2]=0;o=o+4|0}while((o|0)<(p|0));c[i+(h*104|0)+8>>2]=c[d>>2];c[i+(h*104|0)+8+4>>2]=c[d+4>>2];c[i+(h*104|0)+8+8>>2]=c[d+8>>2];c[i+(h*104|0)+8+12>>2]=c[d+12>>2];$p(i+(h*104|0)+24|0,d|0,16)|0;g[i+(h*104|0)+88>>2]=e>0.0?1.0/e:0.0;c[i+(h*104|0)+4>>2]=c[c[b+940>>2]>>2];e=+g[i+(h*104|0)+8>>2];m=+g[i+(h*104|0)+12>>2];n=+g[i+(h*104|0)+16>>2];f=c[b+992>>2]|0;if(f|0){c[b+992>>2]=0;d=f;r=d+32|0;c[r>>2]=0;r=d+36|0;c[r>>2]=i+(h*104|0);r=d+40|0;c[r>>2]=0;g[d>>2]=e-q;r=d+4|0;g[r>>2]=m-q;r=d+8|0;g[r>>2]=n-q;r=d+12|0;g[r>>2]=0.0;r=d+16|0;g[r>>2]=q+e;r=d+20|0;g[r>>2]=q+m;r=d+24|0;g[r>>2]=q+n;r=d+28|0;g[r>>2]=0.0;r=c[b+988>>2]|0;Pe(b+988|0,r,d);b=b+1e3|0;r=c[b>>2]|0;r=r+1|0;c[b>>2]=r;b=i+(h*104|0)+96|0;c[b>>2]=d;l=s;return}c[6995]=(c[6995]|0)+1;f=sc(63)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}o=f;p=o+44|0;do{c[o>>2]=0;o=o+4|0}while((o|0)<(p|0));d=f;r=d+32|0;c[r>>2]=0;r=d+36|0;c[r>>2]=i+(h*104|0);r=d+40|0;c[r>>2]=0;g[d>>2]=e-q;r=d+4|0;g[r>>2]=m-q;r=d+8|0;g[r>>2]=n-q;r=d+12|0;g[r>>2]=0.0;r=d+16|0;g[r>>2]=q+e;r=d+20|0;g[r>>2]=q+m;r=d+24|0;g[r>>2]=q+n;r=d+28|0;g[r>>2]=0.0;r=c[b+988>>2]|0;Pe(b+988|0,r,d);b=b+1e3|0;r=c[b>>2]|0;r=r+1|0;c[b>>2]=r;b=i+(h*104|0)+96|0;c[b>>2]=d;l=s;return}function ad(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0;s=l;l=l+752|0;c[s+136+8>>2]=0;c[s+136+12>>2]=-1;q=s+136+28|0;c[s+136>>2]=7020;c[s+136+4>>2]=8;c[s+136+16>>2]=1065353216;c[s+136+20>>2]=1065353216;c[s+136+24>>2]=1065353216;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[q+16>>2]=0;c[q+20>>2]=0;c[q+24>>2]=0;q=c[e+4>>2]|0;r=c[e+12>>2]|0;h=c[q+4>>2]|0;if((h|0)<20){c[s+568>>2]=3896;c[s+568+168>>2]=0;g[s+568+172>>2]=0.0;c[s+568+164>>2]=c[f+4>>2];g[s+208+308>>2]=9.999999747378752e-05;a[s+208+332>>0]=0;c[s+192>>2]=5276;c[s+192+4>>2]=s+208;c[s+192+8>>2]=s+136;c[s+192+12>>2]=q;c[s+120>>2]=9484;c[s+120+4>>2]=s+208;c[s+120+8>>2]=s+136;c[s+120+12>>2]=q;q=(c[f+20>>2]&8|0)==0?s+192|0:s+120|0;if((Eb[c[(c[q>>2]|0)+8>>2]&3](q,b,d,r,r,s+568|0)|0?(i=s+568+132|0,j=+g[i>>2],k=+g[s+568+136>>2],m=+g[s+568+140>>2],j*j+k*k+m*m>9.999999747378752e-05):0)?(n=+g[s+568+164>>2],n<+g[f+4>>2]):0){p=1.0/+D(+(j*j+k*k+m*m));g[i>>2]=j*p;g[s+568+136>>2]=k*p;g[s+568+140>>2]=m*p;c[s>>2]=c[e+8>>2];c[s+4>>2]=0;c[s+8>>2]=c[i>>2];c[s+8+4>>2]=c[i+4>>2];c[s+8+8>>2]=c[i+8>>2];c[s+8+12>>2]=c[i+12>>2];g[s+24>>2]=n;+qb[c[(c[f>>2]|0)+12>>2]&31](f,s,1)}l=s;return}if((h+-21|0)>>>0>=9){if((h|0)!=31){l=s;return}h=c[q+68>>2]|0;e=c[e+8>>2]|0;c[s+568>>2]=6072;c[s+568+4>>2]=e;c[s+568+8>>2]=q;c[s+568+12>>2]=r;c[s+568+16>>2]=b;c[s+568+20>>2]=d;c[s+568+24>>2]=f;if(!h){i=c[q+20>>2]|0;if((i|0)>0){h=0;do{Wf(s+568|0,h);h=h+1|0}while((h|0)<(i|0))}}else{j=+g[r+48>>2];B=+g[b+48>>2]-j;m=+g[r+52>>2];A=+g[b+52>>2]-m;o=+g[r+56>>2];z=+g[b+56>>2]-o;y=+g[r>>2];x=+g[r+16>>2];w=+g[r+32>>2];v=+g[r+4>>2];u=+g[r+20>>2];t=+g[r+36>>2];k=+g[r+8>>2];n=+g[r+24>>2];p=+g[r+40>>2];g[s+208>>2]=B*y+A*x+z*w;g[s+208+4>>2]=B*v+A*u+z*t;g[s+208+8>>2]=B*k+A*n+z*p;g[s+208+12>>2]=0.0;j=+g[d+48>>2]-j;m=+g[d+52>>2]-m;o=+g[d+56>>2]-o;g[s+192>>2]=j*y+m*x+o*w;g[s+192+4>>2]=j*v+m*u+o*t;g[s+192+8>>2]=j*k+m*n+o*p;g[s+192+12>>2]=0.0;Ue(c[h>>2]|0,s+208|0,s+192|0,s+568|0)}l=s;return}F=+g[r>>2];E=+g[r+16>>2];n=+g[r+32>>2];C=+g[r+4>>2];t=+g[r+20>>2];o=+g[r+36>>2];x=+g[r+8>>2];z=+g[r+24>>2];B=+g[r+40>>2];u=-+g[r+48>>2];v=-+g[r+52>>2];w=-+g[r+56>>2];A=+g[b+48>>2];y=+g[b+52>>2];m=+g[b+56>>2];j=F*u+E*v+n*w+(F*A+E*y+n*m);k=C*u+t*v+o*w+(C*A+t*y+o*m);m=x*u+z*v+B*w+(x*A+z*y+B*m);g[s+120>>2]=j;g[s+120+4>>2]=k;g[s+120+8>>2]=m;g[s+120+12>>2]=0.0;y=+g[d+48>>2];A=+g[d+52>>2];p=+g[d+56>>2];n=F*u+E*v+n*w+(F*y+E*A+n*p);o=C*u+t*v+o*w+(C*y+t*A+o*p);p=x*u+z*v+B*w+(x*y+z*A+B*p);if((c[q+4>>2]|0)==21){h=c[e+8>>2]|0;e=c[f+20>>2]|0;c[s+4>>2]=c[s+120>>2];c[s+4+4>>2]=c[s+120+4>>2];c[s+4+8>>2]=c[s+120+8>>2];c[s+4+12>>2]=c[s+120+12>>2];g[s+20>>2]=n;g[s+24>>2]=o;g[s+28>>2]=p;g[s+32>>2]=0.0;c[s+36>>2]=e;g[s+40>>2]=1.0;c[s>>2]=6024;c[s+44>>2]=f;c[s+48>>2]=h;c[s+52>>2]=q;c[s+56>>2]=c[r>>2];c[s+56+4>>2]=c[r+4>>2];c[s+56+8>>2]=c[r+8>>2];c[s+56+12>>2]=c[r+12>>2];c[s+72>>2]=c[r+16>>2];c[s+72+4>>2]=c[r+16+4>>2];c[s+72+8>>2]=c[r+16+8>>2];c[s+72+12>>2]=c[r+16+12>>2];c[s+88>>2]=c[r+32>>2];c[s+88+4>>2]=c[r+32+4>>2];c[s+88+8>>2]=c[r+32+8>>2];c[s+88+12>>2]=c[r+32+12>>2];c[s+104>>2]=c[r+48>>2];c[s+104+4>>2]=c[r+48+4>>2];c[s+104+8>>2]=c[r+48+8>>2];c[s+104+12>>2]=c[r+48+12>>2];c[s+40>>2]=c[f+4>>2];h=c[q+52>>2]|0;c[s+192>>2]=7232;c[s+192+4>>2]=h;c[s+192+8>>2]=s;h=c[q+56>>2]|0;c[s+568>>2]=0;c[s+568+4>>2]=0;c[s+568+8>>2]=0;c[s+568+12>>2]=0;c[s+208>>2]=0;c[s+208+4>>2]=0;c[s+208+8>>2]=0;c[s+208+12>>2]=0;if(!(a[h+60>>0]|0))Re(h,s+192|0,s+120|0,n,o,p,s+568|0,s+208|0);else ue(h,s+192|0,s+120|0,n,o,p,s+568|0,s+208|0,c[h+56>>2]|0)}else{e=c[e+8>>2]|0;d=c[f+20>>2]|0;g[s+568+4>>2]=j;g[s+568+8>>2]=k;g[s+568+12>>2]=m;g[s+568+16>>2]=0.0;g[s+568+20>>2]=n;g[s+568+24>>2]=o;g[s+568+28>>2]=p;g[s+568+32>>2]=0.0;c[s+568+36>>2]=d;g[s+568+40>>2]=1.0;c[s+568>>2]=6048;c[s+568+44>>2]=f;c[s+568+48>>2]=e;c[s+568+52>>2]=q;c[s+568+56>>2]=c[r>>2];c[s+568+56+4>>2]=c[r+4>>2];c[s+568+56+8>>2]=c[r+8>>2];c[s+568+56+12>>2]=c[r+12>>2];c[s+568+72>>2]=c[r+16>>2];c[s+568+72+4>>2]=c[r+16+4>>2];c[s+568+72+8>>2]=c[r+16+8>>2];c[s+568+72+12>>2]=c[r+16+12>>2];c[s+568+88>>2]=c[r+32>>2];c[s+568+88+4>>2]=c[r+32+4>>2];c[s+568+88+8>>2]=c[r+32+8>>2];c[s+568+88+12>>2]=c[r+32+12>>2];c[s+568+104>>2]=c[r+48>>2];c[s+568+104+4>>2]=c[r+48+4>>2];c[s+568+104+8>>2]=c[r+48+8>>2];c[s+568+104+12>>2]=c[r+48+12>>2];c[s+568+40>>2]=c[f+4>>2];g[s+208>>2]=j;g[s+208+4>>2]=k;g[s+208+8>>2]=m;g[s+208+12>>2]=0.0;if(n>2]=n;if(o>2]=o;if(p>2]=p;g[s+192>>2]=j;g[s+192+4>>2]=k;g[s+192+8>>2]=m;g[s+192+12>>2]=0.0;if(j>2]=n;if(k>2]=o;if(m>2]=p;Vb[c[(c[q>>2]|0)+64>>2]&127](q,s+568|0,s+208|0,s+192|0)}l=s;return}function bd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,D=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0;c[b>>2]=c[a>>2];c[b+4>>2]=c[a+4>>2];c[b+8>>2]=c[a+8>>2];c[b+12>>2]=c[a+12>>2];c[b+16>>2]=c[a+16>>2];c[b+16+4>>2]=c[a+16+4>>2];c[b+16+8>>2]=c[a+16+8>>2];c[b+16+12>>2]=c[a+16+12>>2];c[b+32>>2]=c[a+32>>2];c[b+32+4>>2]=c[a+32+4>>2];c[b+32+8>>2]=c[a+32+8>>2];c[b+32+12>>2]=c[a+32+12>>2];q=+g[a+20>>2];m=+g[a+40>>2];r=+g[a+24>>2];n=+g[a+36>>2];o=+g[a+32>>2];s=+g[a+16>>2];t=+g[a>>2];p=+g[a+4>>2];u=+g[a+8>>2];v=1.0/((q*m-r*n)*t+p*(r*o-m*s)+(n*s-q*o)*u);g[d>>2]=(q*m-r*n)*v;g[d+4>>2]=(n*u-m*p)*v;g[d+8>>2]=(r*p-q*u)*v;g[d+12>>2]=0.0;g[d+16>>2]=(r*o-m*s)*v;g[d+20>>2]=(m*t-o*u)*v;g[d+24>>2]=(s*u-r*t)*v;g[d+28>>2]=0.0;g[d+32>>2]=(n*s-q*o)*v;g[d+36>>2]=(o*p-n*t)*v;g[d+40>>2]=(q*t-s*p)*v;g[d+44>>2]=0.0;a:do if(!(c[5759]|0)){e=b+20|0;f=b+36|0;h=b+8|0;i=b+24|0;j=b+40|0;k=b;l=b+4|0}else{e=0;D=(q*t-s*p)*v;F=(q*m-r*n)*v;G=(r*o-m*s)*v;H=(n*s-q*o)*v;I=(n*u-m*p)*v;B=(m*t-o*u)*v;A=(o*p-n*t)*v;z=(r*p-q*u)*v;y=(s*u-r*t)*v;while(1){o=+C(+F);n=+C(+G);N=+C(+H);W=+C(+I);O=+C(+B);M=+C(+A);Q=+C(+z);P=+C(+y);w=+C(+D);R=o+n+N>W+O+M?o+n+N:W+O+M;O=o+W+Q>n+O+P?o+W+Q:n+O+P;n=+g[b>>2];W=+C(+n);o=+g[b+16>>2];T=+C(+o);p=+g[b+32>>2];K=+C(+p);q=+g[b+4>>2];V=+C(+q);r=+g[b+20>>2];S=+C(+r);s=+g[b+36>>2];J=+C(+s);t=+g[b+8>>2];U=+C(+t);u=+g[b+24>>2];L=+C(+u);v=+g[b+40>>2];x=+C(+v);m=W+T+K>V+S+J?W+T+K:V+S+J;m=m>U+L+x?m:U+L+x;L=W+V+U>T+S+L?W+V+U:T+S+L;w=(R>Q+P+w?R:Q+P+w)*(O>N+M+w?O:N+M+w);x=m*(L>K+J+x?L:K+J+x);if(+C(+w)<1.1920928955078125e-07){e=b+20|0;f=b+36|0;h=b+8|0;i=b+24|0;j=b+40|0;k=b;l=b+4|0;break a}if(+C(+x)<1.1920928955078125e-07){e=b+20|0;f=b+36|0;h=b+8|0;i=b+24|0;j=b+40|0;k=b;l=b+4|0;break a}W=+E(+(w/x),.25);O=(n*(W+-2.0)+F*(1.0/W))*.5;Q=(q*(W+-2.0)+1.0/W*G)*.5;S=(t*(W+-2.0)+1.0/W*H)*.5;P=(o*(W+-2.0)+1.0/W*I)*.5;R=(r*(W+-2.0)+1.0/W*B)*.5;T=(u*(W+-2.0)+1.0/W*A)*.5;U=(p*(W+-2.0)+1.0/W*z)*.5;V=(s*(W+-2.0)+1.0/W*y)*.5;W=(v*(W+-2.0)+1.0/W*D)*.5;g[b>>2]=n+O;g[b+4>>2]=q+Q;g[b+8>>2]=t+S;g[b+12>>2]=0.0;g[b+16>>2]=o+P;g[b+20>>2]=r+R;g[b+24>>2]=u+T;g[b+28>>2]=0.0;g[b+32>>2]=p+U;g[b+36>>2]=s+V;g[b+40>>2]=v+W;g[b+44>>2]=0.0;N=1.0/(((v+W)*(r+R)-(u+T)*(s+V))*(n+O)+(q+Q)*((u+T)*(p+U)-(v+W)*(o+P))+((s+V)*(o+P)-(r+R)*(p+U))*(t+S));F=((v+W)*(r+R)-(u+T)*(s+V))*N;I=((s+V)*(t+S)-(v+W)*(q+Q))*N;z=((u+T)*(q+Q)-(r+R)*(t+S))*N;G=((u+T)*(p+U)-(v+W)*(o+P))*N;B=((v+W)*(n+O)-(p+U)*(t+S))*N;y=((o+P)*(t+S)-(u+T)*(n+O))*N;H=((s+V)*(o+P)-(r+R)*(p+U))*N;A=((p+U)*(q+Q)-(s+V)*(n+O))*N;D=((r+R)*(n+O)-(o+P)*(q+Q))*N;g[d>>2]=F;g[d+4>>2]=I;g[d+8>>2]=z;g[d+12>>2]=0.0;g[d+16>>2]=G;g[d+20>>2]=B;g[d+24>>2]=y;g[d+28>>2]=0.0;g[d+32>>2]=H;g[d+36>>2]=A;g[d+40>>2]=D;g[d+44>>2]=0.0;U=+C(+O)+ +C(+P)+ +C(+U);V=+C(+Q)+ +C(+R)+ +C(+V);W=+C(+S)+ +C(+T)+ +C(+W);V=U>V?U:V;if((V>W?V:W)<=m*+g[5758])break;e=e+1|0;if(e>>>0>=(c[5759]|0)>>>0){e=b+20|0;f=b+36|0;h=b+8|0;i=b+24|0;j=b+40|0;k=b;l=b+4|0;break a}}M=+g[b>>2];O=+g[b+16>>2];Q=+g[b+32>>2];H=+g[b+4>>2];J=+g[b+20>>2];L=+g[b+36>>2];A=+g[b+8>>2];D=+g[b+24>>2];G=+g[b+40>>2];N=+g[a>>2];P=+g[a+16>>2];R=+g[a+32>>2];I=+g[a+4>>2];K=+g[a+20>>2];T=+g[a+36>>2];B=+g[a+8>>2];F=+g[a+24>>2];W=+g[a+40>>2];V=A*I+D*K+G*T+(H*B+J*F+L*W);S=H*N+J*P+L*R+(M*I+O*K+Q*T);U=A*N+D*P+G*R+(M*B+O*F+Q*W);W=A*B+D*F+G*W+(A*B+D*F+G*W);T=H*I+J*K+L*T+(H*I+J*K+L*T);R=M*N+O*P+Q*R+(M*N+O*P+Q*R);S=S*.5;U=U*.5;V=V*.5;R=R*.5;g[d>>2]=R;g[d+4>>2]=S;g[d+8>>2]=U;g[d+12>>2]=0.0;g[d+16>>2]=S;T=T*.5;g[d+20>>2]=T;g[d+24>>2]=V;g[d+28>>2]=0.0;g[d+32>>2]=U;g[d+36>>2]=V;W=W*.5;g[d+40>>2]=W;g[d+44>>2]=0.0;return}while(0);M=+g[k>>2];O=+g[b+16>>2];Q=+g[b+32>>2];H=+g[l>>2];J=+g[e>>2];L=+g[f>>2];A=+g[h>>2];D=+g[i>>2];G=+g[j>>2];N=+g[a>>2];P=+g[a+16>>2];R=+g[a+32>>2];I=+g[a+4>>2];K=+g[a+20>>2];T=+g[a+36>>2];B=+g[a+8>>2];F=+g[a+24>>2];W=+g[a+40>>2];V=A*I+D*K+G*T+(H*B+J*F+L*W);S=H*N+J*P+L*R+(M*I+O*K+Q*T);U=A*N+D*P+G*R+(M*B+O*F+Q*W);W=A*B+D*F+G*W+(A*B+D*F+G*W);T=H*I+J*K+L*T+(H*I+J*K+L*T);R=M*N+O*P+Q*R+(M*N+O*P+Q*R);S=S*.5;U=U*.5;V=V*.5;R=R*.5;g[d>>2]=R;g[d+4>>2]=S;g[d+8>>2]=U;g[d+12>>2]=0.0;g[d+16>>2]=S;T=T*.5;g[d+20>>2]=T;g[d+24>>2]=V;g[d+28>>2]=0.0;g[d+32>>2]=U;g[d+36>>2]=V;W=W*.5;g[d+40>>2]=W;g[d+44>>2]=0.0;return}function cd(a,b,f,i){a=a|0;b=b|0;f=f|0;i=i|0;var j=0.0,k=0.0,m=0.0,n=0,o=0,p=0.0,q=0.0,r=0,s=0,t=0,u=0;o=l;l=l+80|0;n=xb[c[(c[a>>2]|0)+28>>2]&127](a)|0;j=+g[a+4>>2];k=+g[a+8>>2];m=+g[a+12>>2];if((n|0)<=0){l=o;return}i=0;do{cc[c[(c[a>>2]|0)+16>>2]&3](a,o+76|0,o+52|0,o+64|0,o+56|0,o+72|0,o+68|0,o+48|0,o+60|0,i);a:do switch(c[o+64>>2]|0){case 0:{switch(c[o+60>>2]|0){case 2:{if((c[o+48>>2]|0)>0)f=0;else break a;do{r=(c[o+72>>2]|0)+(P(c[o+68>>2]|0,f)|0)|0;t=c[o+76>>2]|0;s=c[o+56>>2]|0;u=t+(P(s,c[r>>2]|0)|0)|0;q=k*+g[u+4>>2];p=m*+g[u+8>>2];g[o>>2]=j*+g[u>>2];g[o+4>>2]=q;g[o+8>>2]=p;g[o+12>>2]=0.0;u=t+(P(s,c[r+4>>2]|0)|0)|0;p=k*+g[u+4>>2];q=m*+g[u+8>>2];g[o+16>>2]=j*+g[u>>2];g[o+20>>2]=p;g[o+24>>2]=q;g[o+28>>2]=0.0;r=t+(P(s,c[r+8>>2]|0)|0)|0;q=k*+g[r+4>>2];p=m*+g[r+8>>2];g[o+32>>2]=j*+g[r>>2];g[o+36>>2]=q;g[o+40>>2]=p;g[o+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,o,i,f);f=f+1|0}while((f|0)<(c[o+48>>2]|0));break}case 3:{if((c[o+48>>2]|0)>0)f=0;else break a;do{t=(c[o+72>>2]|0)+(P(c[o+68>>2]|0,f)|0)|0;s=c[o+76>>2]|0;u=c[o+56>>2]|0;r=s+(P(e[t>>1]|0,u)|0)|0;p=k*+g[r+4>>2];q=m*+g[r+8>>2];g[o>>2]=j*+g[r>>2];g[o+4>>2]=p;g[o+8>>2]=q;g[o+12>>2]=0.0;r=s+(P(e[t+2>>1]|0,u)|0)|0;q=k*+g[r+4>>2];p=m*+g[r+8>>2];g[o+16>>2]=j*+g[r>>2];g[o+20>>2]=q;g[o+24>>2]=p;g[o+28>>2]=0.0;u=s+(P(e[t+4>>1]|0,u)|0)|0;p=k*+g[u+4>>2];q=m*+g[u+8>>2];g[o+32>>2]=j*+g[u>>2];g[o+36>>2]=p;g[o+40>>2]=q;g[o+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,o,i,f);f=f+1|0}while((f|0)<(c[o+48>>2]|0));break}case 5:{if((c[o+48>>2]|0)>0)f=0;else break a;do{t=(c[o+72>>2]|0)+(P(c[o+68>>2]|0,f)|0)|0;s=c[o+76>>2]|0;u=c[o+56>>2]|0;r=s+(P(d[t>>0]|0,u)|0)|0;p=k*+g[r+4>>2];q=m*+g[r+8>>2];g[o>>2]=j*+g[r>>2];g[o+4>>2]=p;g[o+8>>2]=q;g[o+12>>2]=0.0;r=s+(P(d[t+1>>0]|0,u)|0)|0;q=k*+g[r+4>>2];p=m*+g[r+8>>2];g[o+16>>2]=j*+g[r>>2];g[o+20>>2]=q;g[o+24>>2]=p;g[o+28>>2]=0.0;u=s+(P(d[t+2>>0]|0,u)|0)|0;p=k*+g[u+4>>2];q=m*+g[u+8>>2];g[o+32>>2]=j*+g[u>>2];g[o+36>>2]=p;g[o+40>>2]=q;g[o+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,o,i,f);f=f+1|0}while((f|0)<(c[o+48>>2]|0));break}default:break a}break}case 1:{switch(c[o+60>>2]|0){case 2:{if((c[o+48>>2]|0)>0)f=0;else break a;do{u=(c[o+72>>2]|0)+(P(c[o+68>>2]|0,f)|0)|0;s=c[o+76>>2]|0;t=c[o+56>>2]|0;r=s+(P(t,c[u>>2]|0)|0)|0;p=k*+h[r+8>>3];q=m*+h[r+16>>3];g[o>>2]=j*+h[r>>3];g[o+4>>2]=p;g[o+8>>2]=q;g[o+12>>2]=0.0;r=s+(P(t,c[u+4>>2]|0)|0)|0;q=k*+h[r+8>>3];p=m*+h[r+16>>3];g[o+16>>2]=j*+h[r>>3];g[o+20>>2]=q;g[o+24>>2]=p;g[o+28>>2]=0.0;u=s+(P(t,c[u+8>>2]|0)|0)|0;p=k*+h[u+8>>3];q=m*+h[u+16>>3];g[o+32>>2]=j*+h[u>>3];g[o+36>>2]=p;g[o+40>>2]=q;g[o+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,o,i,f);f=f+1|0}while((f|0)<(c[o+48>>2]|0));break}case 3:{if((c[o+48>>2]|0)>0)f=0;else break a;do{t=(c[o+72>>2]|0)+(P(c[o+68>>2]|0,f)|0)|0;s=c[o+76>>2]|0;u=c[o+56>>2]|0;r=s+(P(e[t>>1]|0,u)|0)|0;p=k*+h[r+8>>3];q=m*+h[r+16>>3];g[o>>2]=j*+h[r>>3];g[o+4>>2]=p;g[o+8>>2]=q;g[o+12>>2]=0.0;r=s+(P(e[t+2>>1]|0,u)|0)|0;q=k*+h[r+8>>3];p=m*+h[r+16>>3];g[o+16>>2]=j*+h[r>>3];g[o+20>>2]=q;g[o+24>>2]=p;g[o+28>>2]=0.0;u=s+(P(e[t+4>>1]|0,u)|0)|0;p=k*+h[u+8>>3];q=m*+h[u+16>>3];g[o+32>>2]=j*+h[u>>3];g[o+36>>2]=p;g[o+40>>2]=q;g[o+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,o,i,f);f=f+1|0}while((f|0)<(c[o+48>>2]|0));break}case 5:{if((c[o+48>>2]|0)>0)f=0;else break a;do{t=(c[o+72>>2]|0)+(P(c[o+68>>2]|0,f)|0)|0;s=c[o+76>>2]|0;u=c[o+56>>2]|0;r=s+(P(d[t>>0]|0,u)|0)|0;p=k*+h[r+8>>3];q=m*+h[r+16>>3];g[o>>2]=j*+h[r>>3];g[o+4>>2]=p;g[o+8>>2]=q;g[o+12>>2]=0.0;r=s+(P(d[t+1>>0]|0,u)|0)|0;q=k*+h[r+8>>3];p=m*+h[r+16>>3];g[o+16>>2]=j*+h[r>>3];g[o+20>>2]=q;g[o+24>>2]=p;g[o+28>>2]=0.0;u=s+(P(d[t+2>>0]|0,u)|0)|0;p=k*+h[u+8>>3];q=m*+h[u+16>>3];g[o+32>>2]=j*+h[u>>3];g[o+36>>2]=p;g[o+40>>2]=q;g[o+44>>2]=0.0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,o,i,f);f=f+1|0}while((f|0)<(c[o+48>>2]|0));break}default:break a}break}default:{}}while(0);Ob[c[(c[a>>2]|0)+24>>2]&127](a,i);i=i+1|0}while((i|0)!=(n|0));l=o;return}function dd(d,e,f,h,i){d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0.0,k=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0;y=l;l=l+128|0;a[d+60>>0]=f&1;if(f){r=+g[h>>2]+-1.0;u=+g[h+4>>2]+-1.0;v=+g[h+8>>2]+-1.0;g[d+4>>2]=r;g[d+8>>2]=u;g[d+12>>2]=v;g[d+16>>2]=0.0;x=+g[i>>2]+1.0;m=+g[i+4>>2]+1.0;j=+g[i+8>>2]+1.0;g[d+20>>2]=x;g[d+24>>2]=m;g[d+28>>2]=j;g[d+32>>2]=0.0;g[d+36>>2]=65533.0/(x-r);g[d+40>>2]=65533.0/(m-u);g[d+44>>2]=65533.0/(j-v);g[d+48>>2]=0.0;a[d+60>>0]=1;n=r+ +(~~((r-r)*(65533.0/(x-r)))&65535&-2&65535)/(65533.0/(x-r))+-1.0;o=u+ +(~~((u-u)*(65533.0/(m-u)))&65535&-2&65535)/(65533.0/(m-u))+-1.0;t=v+ +(~~((v-v)*(65533.0/(j-v)))&65535&-2&65535)/(65533.0/(j-v))+-1.0;if(n>2]=n;else n=r;if(o>2]=o;w=o}else w=u;if(t>2]=t;else t=v;o=x-n;r=m-w;u=j-t;g[d+36>>2]=65533.0/o;g[d+40>>2]=65533.0/r;g[d+44>>2]=65533.0/u;g[d+48>>2]=0.0;o=n+ +((~~(o*(65533.0/o)+1.0)&65535|1)&65535)/(65533.0/o)+1.0;r=w+ +((~~(r*(65533.0/r)+1.0)&65535|1)&65535)/(65533.0/r)+1.0;u=t+ +((~~(u*(65533.0/u)+1.0)&65535|1)&65535)/(65533.0/u)+1.0;if(x>2]=o;else o=x;if(m>2]=r;m=r}if(j>2]=u;j=u}g[d+36>>2]=65533.0/(o-n);g[d+40>>2]=65533.0/(m-w);g[d+44>>2]=65533.0/(j-t);g[d+48>>2]=0.0;c[y+96>>2]=8364;c[y+96+4>>2]=d+104;c[y+96+8>>2]=d;Vb[c[(c[e>>2]|0)+8>>2]&127](e,y+96|0,d+4|0,d+20|0);f=c[d+108>>2]|0;c[y+80>>2]=0;c[y+80+4>>2]=0;c[y+80+8>>2]=0;c[y+80+12>>2]=0;k=c[d+128>>2]|0;if((k|0)<(f<<1|0)){if((c[d+132>>2]|0)<(f<<1|0)){if(!f){h=0;e=k}else{c[6995]=(c[6995]|0)+1;h=sc(f<<5|19)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}e=c[d+128>>2]|0}if((e|0)>0){i=0;do{s=h+(i<<4)|0;q=(c[d+136>>2]|0)+(i<<4)|0;c[s>>2]=c[q>>2];c[s+4>>2]=c[q+4>>2];c[s+8>>2]=c[q+8>>2];c[s+12>>2]=c[q+12>>2];i=i+1|0}while((i|0)!=(e|0))}i=c[d+136>>2]|0;if(i|0){if(a[d+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[d+136>>2]=0}a[d+140>>0]=1;c[d+136>>2]=h;c[d+132>>2]=f<<1;i=d+136|0}else i=d+136|0;h=k;do{s=(c[i>>2]|0)+(h<<4)|0;c[s>>2]=c[y+80>>2];c[s+4>>2]=c[y+80+4>>2];c[s+8>>2]=c[y+80+8>>2];c[s+12>>2]=c[y+80+12>>2];h=h+1|0}while((h|0)!=(f<<1|0))}c[d+128>>2]=f<<1}else{c[y+96>>2]=8384;c[y+96+4>>2]=d+64;c[y+80>>2]=-581039253;c[y+80+4>>2]=-581039253;c[y+80+8>>2]=-581039253;g[y+80+12>>2]=0.0;c[y+64>>2]=1566444395;c[y+64+4>>2]=1566444395;c[y+64+8>>2]=1566444395;g[y+64+12>>2]=0.0;Vb[c[(c[e>>2]|0)+8>>2]&127](e,y+96|0,y+80|0,y+64|0);f=c[d+68>>2]|0;k=y;q=k+64|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(q|0));s=c[d+88>>2]|0;if((s|0)<(f<<1|0)){if((c[d+92>>2]|0)<(f<<1|0)){if(!f){h=0;e=s}else{c[6995]=(c[6995]|0)+1;h=sc(f<<7|19)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}e=c[d+88>>2]|0}if((e|0)>0){i=0;do{k=h+(i<<6)|0;p=(c[d+96>>2]|0)+(i<<6)|0;q=k+64|0;do{c[k>>2]=c[p>>2];k=k+4|0;p=p+4|0}while((k|0)<(q|0));i=i+1|0}while((i|0)!=(e|0))}i=c[d+96>>2]|0;if(i|0){if(a[d+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[d+96>>2]=0}a[d+100>>0]=1;c[d+96>>2]=h;c[d+92>>2]=f<<1;i=d+96|0}else i=d+96|0;h=s;do{k=(c[i>>2]|0)+(h<<6)|0;p=y;q=k+64|0;do{c[k>>2]=c[p>>2];k=k+4|0;p=p+4|0}while((k|0)<(q|0));h=h+1|0}while((h|0)!=(f<<1|0))}c[d+88>>2]=f<<1}c[d+56>>2]=0;Cc(d,0,f);if(a[d+60>>0]|0?(c[d+152>>2]|0)==0:0){if(!(c[d+156>>2]|0)){c[6995]=(c[6995]|0)+1;f=sc(51)|0;if(!f)e=0;else{c[(f+4+15&-16)+-4>>2]=f;e=f+4+15&-16}h=c[d+152>>2]|0;if((h|0)>0){f=0;do{s=e+(f<<5)|0;q=(c[d+160>>2]|0)+(f<<5)|0;c[s>>2]=c[q>>2];c[s+4>>2]=c[q+4>>2];c[s+8>>2]=c[q+8>>2];c[s+12>>2]=c[q+12>>2];c[s+16>>2]=c[q+16>>2];c[s+20>>2]=c[q+20>>2];c[s+24>>2]=c[q+24>>2];c[s+28>>2]=c[q+28>>2];f=f+1|0}while((f|0)!=(h|0))}f=c[d+160>>2]|0;if(f|0){if(a[d+164>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[d+160>>2]=0}a[d+164>>0]=1;c[d+160>>2]=e;c[d+156>>2]=1;h=d+160|0;i=(c[d+152>>2]|0)+1|0;f=e}else{h=d+160|0;i=1;f=c[d+160>>2]|0}c[d+152>>2]=i;c[f>>2]=c[y+96>>2];c[f+4>>2]=c[y+96+4>>2];c[f+8>>2]=c[y+96+8>>2];c[f+12>>2]=c[y+96+12>>2];c[f+16>>2]=c[y+96+16>>2];c[f+20>>2]=c[y+96+20>>2];c[f+24>>2]=c[y+96+24>>2];c[f+28>>2]=c[y+96+28>>2];s=c[h>>2]|0;q=c[d+136>>2]|0;b[s>>1]=b[q>>1]|0;b[s+2>>1]=b[q+2>>1]|0;b[s+4>>1]=b[q+4>>1]|0;b[s+6>>1]=b[q+6>>1]|0;b[s+8>>1]=b[q+8>>1]|0;b[s+10>>1]=b[q+10>>1]|0;c[s+12>>2]=0;q=c[q+12>>2]|0;c[s+16>>2]=(q|0)>-1?1:0-q|0}c[d+168>>2]=c[d+152>>2];f=c[d+116>>2]|0;if(f|0){if(a[d+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[d+116>>2]=0}a[d+120>>0]=1;c[d+116>>2]=0;c[d+108>>2]=0;c[d+112>>2]=0;f=c[d+76>>2]|0;if(!f){a[d+80>>0]=1;c[d+76>>2]=0;c[d+68>>2]=0;d=d+72|0;c[d>>2]=0;l=y;return}if(a[d+80>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[d+76>>2]=0;a[d+80>>0]=1;c[d+76>>2]=0;c[d+68>>2]=0;d=d+72|0;c[d>>2]=0;l=y;return}function ed(b,d,e,f,h,i,k,l,m,n,o,p){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;k=k|0;l=l|0;m=+m;n=n|0;o=+o;p=+p;var q=0.0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0,Q=0,R=0.0,S=0.0;Q=c[b+68>>2]|0;if((Q|0)==(c[b+72>>2]|0)?(u=Q|0?Q<<1:1,(Q|0)<(u|0)):0){if(!u){r=0;t=Q}else{c[6995]=(c[6995]|0)+1;r=sc((u*152|3)+16|0)|0;if(!r)r=0;else{c[(r+4+15&-16)+-4>>2]=r;r=r+4+15&-16}t=c[b+68>>2]|0}if((t|0)>0){s=0;do{gi(r+(s*152|0)|0,(c[b+76>>2]|0)+(s*152|0)|0,152)|0;s=s+1|0}while((s|0)!=(t|0))}s=c[b+76>>2]|0;if(s|0){if(a[b+80>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[s+-4>>2]|0)}c[b+76>>2]=0}a[b+80>>0]=1;c[b+76>>2]=r;c[b+72>>2]=u;r=c[b+68>>2]|0}else r=Q;c[b+68>>2]=r+1;P=c[b+76>>2]|0;c[P+(Q*152|0)+140>>2]=h;t=c[b+16>>2]|0;r=c[t+(e*244|0)+240>>2]|0;s=c[t+(f*244|0)+240>>2]|0;c[P+(Q*152|0)+144>>2]=e;c[P+(Q*152|0)+148>>2]=f;u=c[i+84>>2]|0;c[P+(Q*152|0)+104>>2]=u;c[P+(Q*152|0)+132>>2]=0;g[P+(Q*152|0)+100>>2]=0.0;g[P+(Q*152|0)+96>>2]=0.0;O=(c[j>>2]=u,+g[j>>2]);if(r|0){c[P+(Q*152|0)+16>>2]=c[d>>2];c[P+(Q*152|0)+16+4>>2]=c[d+4>>2];c[P+(Q*152|0)+16+8>>2]=c[d+8>>2];c[P+(Q*152|0)+16+12>>2]=c[d+12>>2];N=+g[k+4>>2];J=+g[P+(Q*152|0)+24>>2];H=+g[k+8>>2];L=+g[P+(Q*152|0)+20>>2];K=+g[P+(Q*152|0)+16>>2];M=+g[k>>2];g[P+(Q*152|0)>>2]=N*J-H*L;g[P+(Q*152|0)+4>>2]=H*K-J*M;g[P+(Q*152|0)+8>>2]=L*M-N*K;g[P+(Q*152|0)+12>>2]=0.0;w=((N*J-H*L)*+g[r+324>>2]+(H*K-J*M)*+g[r+328>>2]+(L*M-N*K)*+g[r+332>>2])*+g[r+604>>2];q=((N*J-H*L)*+g[r+340>>2]+(H*K-J*M)*+g[r+344>>2]+(L*M-N*K)*+g[r+348>>2])*+g[r+608>>2];v=((N*J-H*L)*+g[r+356>>2]+(H*K-J*M)*+g[r+360>>2]+(L*M-N*K)*+g[r+364>>2])*+g[r+612>>2];g[P+(Q*152|0)+64>>2]=w;g[P+(Q*152|0)+68>>2]=q;g[P+(Q*152|0)+72>>2]=v;g[P+(Q*152|0)+76>>2]=0.0;C=K;D=L;E=J;I=N*J-H*L;J=H*K-J*M;K=L*M-N*K}else{c[P+(Q*152|0)+64>>2]=0;c[P+(Q*152|0)+64+4>>2]=0;c[P+(Q*152|0)+64+8>>2]=0;c[P+(Q*152|0)+64+12>>2]=0;c[P+(Q*152|0)>>2]=0;c[P+(Q*152|0)+4>>2]=0;c[P+(Q*152|0)+8>>2]=0;c[P+(Q*152|0)+12>>2]=0;c[P+(Q*152|0)+16>>2]=0;c[P+(Q*152|0)+20>>2]=0;c[P+(Q*152|0)+24>>2]=0;c[P+(Q*152|0)+28>>2]=0;q=0.0;v=0.0;w=0.0;C=0.0;D=0.0;E=0.0;I=0.0;J=0.0;K=0.0}if(s|0){N=-+g[d>>2];A=-+g[d+4>>2];M=-+g[d+8>>2];g[P+(Q*152|0)+48>>2]=N;g[P+(Q*152|0)+52>>2]=A;g[P+(Q*152|0)+56>>2]=M;g[P+(Q*152|0)+60>>2]=0.0;B=+g[l+4>>2];S=+g[l+8>>2];R=+g[l>>2];g[P+(Q*152|0)+32>>2]=B*M-S*A;g[P+(Q*152|0)+36>>2]=S*N-R*M;g[P+(Q*152|0)+40>>2]=R*A-B*N;g[P+(Q*152|0)+44>>2]=0.0;x=((B*M-S*A)*+g[s+324>>2]+(S*N-R*M)*+g[s+328>>2]+(R*A-B*N)*+g[s+332>>2])*+g[s+604>>2];y=((B*M-S*A)*+g[s+340>>2]+(S*N-R*M)*+g[s+344>>2]+(R*A-B*N)*+g[s+348>>2])*+g[s+608>>2];z=((B*M-S*A)*+g[s+356>>2]+(S*N-R*M)*+g[s+360>>2]+(R*A-B*N)*+g[s+364>>2])*+g[s+612>>2];g[P+(Q*152|0)+80>>2]=x;g[P+(Q*152|0)+84>>2]=y;g[P+(Q*152|0)+88>>2]=z;g[P+(Q*152|0)+92>>2]=0.0;F=N;G=A;H=M;L=B*M-S*A;M=S*N-R*M;N=R*A-B*N}else{c[P+(Q*152|0)+80>>2]=0;c[P+(Q*152|0)+80+4>>2]=0;c[P+(Q*152|0)+80+8>>2]=0;c[P+(Q*152|0)+80+12>>2]=0;c[P+(Q*152|0)+32>>2]=0;c[P+(Q*152|0)+32+4>>2]=0;c[P+(Q*152|0)+32+8>>2]=0;c[P+(Q*152|0)+32+12>>2]=0;c[P+(Q*152|0)+32+16>>2]=0;c[P+(Q*152|0)+32+20>>2]=0;c[P+(Q*152|0)+32+24>>2]=0;c[P+(Q*152|0)+32+28>>2]=0;x=0.0;y=0.0;z=0.0;F=0.0;G=0.0;H=0.0;L=0.0;M=0.0;N=0.0}if(r|0){B=+g[k+8>>2];R=+g[k+4>>2];S=+g[k>>2];v=+g[r+404>>2]+((q*B-v*R)*+g[d>>2]+(v*S-B*w)*+g[d+4>>2]+(R*w-q*S)*+g[d+8>>2])}else v=0.0;if(s|0){R=-x;q=-y;z=-z;A=+g[l+8>>2];B=+g[l+4>>2];S=+g[l>>2];q=+g[s+404>>2]+((A*q-B*z)*+g[d>>2]+(S*z-A*R)*+g[d+4>>2]+(B*R-S*q)*+g[d+8>>2])}else q=0.0;B=m/(v+q);g[P+(Q*152|0)+108>>2]=B;if(r|0){z=+g[t+(e*244|0)+192>>2];m=+g[t+(e*244|0)+196>>2];A=+g[t+(e*244|0)+200>>2];y=(+g[t+(e*244|0)+176>>2]+ +g[t+(e*244|0)+208>>2])*C+(+g[t+(e*244|0)+180>>2]+ +g[t+(e*244|0)+212>>2])*D+(+g[t+(e*244|0)+184>>2]+ +g[t+(e*244|0)+216>>2])*E}else{z=0.0;m=0.0;A=0.0;y=C*0.0+D*0.0+E*0.0}if(s|0){v=+g[t+(f*244|0)+192>>2];w=+g[t+(f*244|0)+196>>2];x=+g[t+(f*244|0)+200>>2];q=(+g[t+(f*244|0)+176>>2]+ +g[t+(f*244|0)+208>>2])*F+(+g[t+(f*244|0)+180>>2]+ +g[t+(f*244|0)+212>>2])*G+(+g[t+(f*244|0)+184>>2]+ +g[t+(f*244|0)+216>>2])*H}else{v=0.0;w=0.0;x=0.0;q=F*0.0+G*0.0+H*0.0}q=B*(o-(y+(z*I+m*J+A*K)+(q+(v*L+w*M+x*N))));if(!(c[i+120>>2]&16)){S=0.0;S=q+S;n=P+(Q*152|0)+112|0;g[n>>2]=S;n=P+(Q*152|0)+128|0;g[n>>2]=0.0;n=P+(Q*152|0)+116|0;g[n>>2]=p;S=-O;n=P+(Q*152|0)+120|0;g[n>>2]=S;n=P+(Q*152|0)+124|0;c[n>>2]=u;return}S=B*(-(+g[n+44>>2]*((+g[i+48>>2]-+g[i+32>>2])*+g[d>>2]+(+g[i+52>>2]-+g[i+36>>2])*+g[d+4>>2]+(+g[i+56>>2]-+g[i+40>>2])*+g[d+8>>2]))/+g[n+12>>2]);S=q+S;n=P+(Q*152|0)+112|0;g[n>>2]=S;n=P+(Q*152|0)+128|0;g[n>>2]=0.0;n=P+(Q*152|0)+116|0;g[n>>2]=p;S=-O;n=P+(Q*152|0)+120|0;g[n>>2]=S;n=P+(Q*152|0)+124|0;c[n>>2]=u;return}function fd(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;var j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0.0,u=0.0,v=0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0,ba=0.0,ca=0.0,da=0.0,ea=0,fa=0.0;ea=l;l=l+32|0;J=c[b+4>>2]|0;a[J+312>>0]=0;c[J>>2]=0;a[J+356>>0]=1;c[J+292>>2]=1566444395;c[J+296>>2]=1566444395;c[J+300>>2]=1566444395;g[J+304>>2]=0.0;c[J+336>>2]=0;c[J+336+4>>2]=0;c[J+336+8>>2]=0;c[J+336+12>>2]=0;a[J+336+16>>0]=0;a[J+332>>0]=a[J+332>>0]&-16;p=+g[d+48>>2];r=+g[d+52>>2];u=+g[d+56>>2];o=+g[f+48>>2];q=+g[f+52>>2];t=+g[f+56>>2];L=+g[d>>2];X=+g[d+4>>2];Z=+g[d+8>>2];$=+g[d+16>>2];N=+g[d+20>>2];P=+g[d+24>>2];R=+g[d+32>>2];T=+g[d+36>>2];V=+g[d+40>>2];K=+g[f>>2];W=+g[f+4>>2];Y=+g[f+8>>2];_=+g[f+16>>2];M=+g[f+20>>2];O=+g[f+24>>2];Q=+g[f+32>>2];S=+g[f+36>>2];U=+g[f+40>>2];ba=+g[e+48>>2]-p-(+g[h+48>>2]-o);ca=+g[e+52>>2]-r-(+g[h+52>>2]-q);da=+g[e+56>>2]-u-(+g[h+56>>2]-t);J=c[b+8>>2]|0;x=c[(c[J>>2]|0)+64>>2]|0;g[ea>>2]=L*-ba+$*-ca+R*-da;g[ea+4>>2]=X*-ba+N*-ca+T*-da;g[ea+8>>2]=Z*-ba+P*-ca+V*-da;g[ea+12>>2]=0.0;Sb[x&127](ea+16|0,J,ea);H=+g[ea+16>>2];I=+g[ea+16+4>>2];G=+g[ea+16+8>>2];m=H*+g[d>>2]+I*+g[d+4>>2]+G*+g[d+8>>2]+ +g[d+48>>2];w=H*+g[d+16>>2]+I*+g[d+20>>2]+G*+g[d+24>>2]+ +g[d+52>>2];G=H*+g[d+32>>2]+I*+g[d+36>>2]+G*+g[d+40>>2]+ +g[d+56>>2];J=c[b+12>>2]|0;x=c[(c[J>>2]|0)+64>>2]|0;I=ba*+g[f+4>>2]+ca*+g[f+20>>2]+da*+g[f+36>>2];H=ba*+g[f+8>>2]+ca*+g[f+24>>2]+da*+g[f+40>>2];g[ea>>2]=ba*+g[f>>2]+ca*+g[f+16>>2]+da*+g[f+32>>2];g[ea+4>>2]=I;g[ea+8>>2]=H;g[ea+12>>2]=0.0;Sb[x&127](ea+16|0,J,ea);H=+g[ea+16>>2];I=+g[ea+16+4>>2];n=+g[ea+16+8>>2];m=m-(H*+g[f>>2]+I*+g[f+4>>2]+n*+g[f+8>>2]+ +g[f+48>>2]);w=w-(H*+g[f+16>>2]+I*+g[f+20>>2]+n*+g[f+24>>2]+ +g[f+52>>2]);n=G-(H*+g[f+32>>2]+I*+g[f+36>>2]+n*+g[f+40>>2]+ +g[f+56>>2]);a:do if(m*m+w*w+n*n>9.999999747378752e-05){k=0.0;J=32;I=m;j=0;H=n;s=0;z=o;o=0.0;n=0.0;m=0.0;while(1){if(!J)break a;J=J+-1|0;x=c[b+8>>2]|0;v=c[(c[x>>2]|0)+64>>2]|0;C=-I;fa=-w;y=-H;g[ea>>2]=L*C+$*fa+R*y;g[ea+4>>2]=X*C+N*fa+T*y;g[ea+8>>2]=Z*C+P*fa+V*y;g[ea+12>>2]=0.0;Sb[v&127](ea+16|0,x,ea);y=+g[ea+16>>2];fa=+g[ea+16+4>>2];C=+g[ea+16+8>>2];A=p+(L*y+X*fa+Z*C);B=r+($*y+N*fa+P*C);C=u+(R*y+T*fa+V*C);x=c[b+12>>2]|0;v=c[(c[x>>2]|0)+64>>2]|0;g[ea>>2]=K*I+_*w+Q*H;g[ea+4>>2]=W*I+M*w+S*H;g[ea+8>>2]=Y*I+O*w+U*H;g[ea+12>>2]=0.0;Sb[v&127](ea+16|0,x,ea);fa=+g[ea+16>>2];y=+g[ea+16+4>>2];G=+g[ea+16+8>>2];E=z+(K*fa+W*y+Y*G);F=q+(_*fa+M*y+O*G);G=t+(Q*fa+S*y+U*G);y=I*(A-E)+w*(B-F)+H*(C-G);if(k>1.0){j=0;aa=25;break}if(y>0.0){m=ba*I+ca*w+da*H;if(m>=-1.4210854715202004e-14){j=0;aa=25;break}u=k-y/m;k=u;j=s;y=(1.0-u)*+g[f+48>>2]+u*+g[h+48>>2];p=(1.0-u)*+g[d+48>>2]+u*+g[e+48>>2];q=(1.0-u)*+g[f+52>>2]+u*+g[h+52>>2];r=(1.0-u)*+g[d+52>>2]+u*+g[e+52>>2];t=(1.0-u)*+g[f+56>>2]+u*+g[h+56>>2];u=(1.0-u)*+g[d+56>>2]+u*+g[e+56>>2];m=I;n=w;o=H}else y=z;s=c[b+4>>2]|0;x=c[s>>2]|0;b:do if((x|0)>0){w=+g[s+308>>2];v=0;while(1){H=A-E-+g[s+4+(v<<4)>>2];I=B-F-+g[s+4+(v<<4)+4>>2];fa=C-G-+g[s+4+(v<<4)+8>>2];v=v+1|0;if(H*H+I*I+fa*fa<=w){v=1;break b}if((v|0)>=(x|0)){v=0;break}}}else v=0;while(0);if((+g[s+304>>2]==0.0?C-G==+g[s+300>>2]:0)?B-F==+g[s+296>>2]:0){if(!(A-E==+g[s+292>>2]|v))aa=17}else if(!v)aa=17;if((aa|0)==17){aa=0;g[s+292>>2]=A-E;g[s+296>>2]=B-F;g[s+300>>2]=C-G;g[s+304>>2]=0.0;a[s+356>>0]=1;g[s+4+(x<<4)>>2]=A-E;g[s+4+(x<<4)+4>>2]=B-F;g[s+4+(x<<4)+8>>2]=C-G;g[s+4+(x<<4)+12>>2]=0.0;x=c[s>>2]|0;g[s+84+(x<<4)>>2]=A;g[s+84+(x<<4)+4>>2]=B;g[s+84+(x<<4)+8>>2]=C;g[s+84+(x<<4)+12>>2]=0.0;x=c[s>>2]|0;g[s+164+(x<<4)>>2]=E;g[s+164+(x<<4)+4>>2]=F;g[s+164+(x<<4)+8>>2]=G;g[s+164+(x<<4)+12>>2]=0.0;c[s>>2]=(c[s>>2]|0)+1;s=c[b+4>>2]|0}x=wc(s)|0;I=+g[s+276>>2];w=+g[s+280>>2];H=+g[s+284>>2];if(!x)break a;if(!(I*I+w*w+H*H>9.999999747378752e-05))break a;else{s=c[s+288>>2]|0;z=y}}if((aa|0)==25){l=ea;return j|0}}else{k=0.0;o=0.0;n=0.0;m=0.0;j=0}while(0);g[i+164>>2]=k;k=m*m+n*n+o*o;if(!(k>=1.4210854715202004e-14)){c[i+132>>2]=0;c[i+132+4>>2]=0;c[i+132+8>>2]=0;c[i+132+12>>2]=0;k=0.0;m=0.0;n=0.0}else{fa=1.0/+D(+k);k=m*fa;m=n*fa;n=o*fa;g[i+132>>2]=k;g[i+136>>2]=m;g[i+140>>2]=n;c[i+144>>2]=j}if(ba*k+ca*m+da*n>=-+g[i+172>>2]){i=0;l=ea;return i|0}b=c[b+4>>2]|0;wc(b)|0;$p(i+148|0,b+260|0,16)|0;i=1;l=ea;return i|0}function gd(b,d,e,f,h,i,j,k,l,m,n){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0,A=0,B=0,C=0,E=0.0,F=0,G=0,H=0;if((j|0)<2|(k|0)<2){m=0;return m|0}y=P(k,j)|0;c[6995]=(c[6995]|0)+1;b=sc(y>>>0>268435455?18:(y<<4|3)+16|0)|0;if(!b)q=0;else{c[(b+4+15&-16)+-4>>2]=b;q=b+4+15&-16}s=$I(y>>>0>1073741823?-1:y<<2)|0;if((k|0)>0?(j|0)>0:0){b=0;do{E=+(b|0)/+(k+-1|0);r=+g[e>>2];r=r+E*(+g[h>>2]-r);t=+g[e+4>>2];t=t+E*(+g[h+4>>2]-t);u=+g[e+8>>2];u=u+E*(+g[h+8>>2]-u);v=+g[f>>2];w=+g[f+4>>2];x=+g[f+8>>2];v=v+E*(+g[i>>2]-v)-r;w=w+E*(+g[i+4>>2]-w)-t;x=x+E*(+g[i+8>>2]-x)-u;p=P(b,j)|0;o=0;do{E=+(o|0)/+(j+-1|0);C=o+p|0;g[q+(C<<4)>>2]=r+v*E;g[q+(C<<4)+4>>2]=t+w*E;g[q+(C<<4)+8>>2]=u+x*E;g[q+(C<<4)+12>>2]=0.0;g[s+(C<<2)>>2]=1.0;o=o+1|0}while((o|0)!=(j|0));b=b+1|0}while((b|0)!=(k|0))}c[6995]=(c[6995]|0)+1;b=sc(1271)|0;if(!b)b=0;else{c[(b+4+15&-16)+-4>>2]=b;b=b+4+15&-16}Bc(b,d,y,q,s);if(l&1|0){g[(c[b+780>>2]|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&2|0){g[(c[b+780>>2]|0)+((j+-1|0)*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&4|0){C=P(k+-1|0,j)|0;g[(c[b+780>>2]|0)+(C*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&8|0){C=j+-1+(P(k+-1|0,j)|0)|0;g[(c[b+780>>2]|0)+(C*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&16|0){g[(c[b+780>>2]|0)+(((j+-1|0)/2|0)*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&32|0){C=P((k+-1|0)/2|0,j)|0;g[(c[b+780>>2]|0)+(C*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&64|0){C=j+-1+(P((k+-1|0)/2|0,j)|0)|0;g[(c[b+780>>2]|0)+(C*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&128|0){C=(P(k+-1|0,j)|0)+((j+-1|0)/2|0)|0;g[(c[b+780>>2]|0)+(C*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&256|0){C=(P((k+-1|0)/2|0,j)|0)+((j+-1|0)/2|0)|0;g[(c[b+780>>2]|0)+(C*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(q|0){c[6996]=(c[6996]|0)+1;Cd(c[q+-4>>2]|0)}aJ(s);if((k|0)<=0){m=b;return m|0}d=b+780|0;l=b+792|0;z=b+800|0;A=b+984|0;o=0;y=0;B=j+-1|0;C=(j<<1)+-1|0;while(1){p=y;y=y+1|0;a:do if((j|0)>0){i=P(p,j)|0;h=P(y,j)|0;t=1.0/+(k+-1|0)*+(k+-1-p|0);r=1.0/+(k+-1|0)*+(k+-2-p|0);if((y|0)<(k|0)){p=0;q=o}else{p=0;while(1){q=p;p=p+1|0;if((p|0)<(j|0)){s=p+i|0;e=c[d>>2]|0;Xh(b,0);h=(c[l>>2]|0)+-1|0;f=c[z>>2]|0;c[f+(h*52|0)+24>>2]=e+((q+i|0)*104|0);c[f+(h*52|0)+28>>2]=e+(s*104|0);w=+g[e+((q+i|0)*104|0)+8>>2]-+g[e+(s*104|0)+8>>2];x=+g[e+((q+i|0)*104|0)+12>>2]-+g[e+(s*104|0)+12>>2];E=+g[e+((q+i|0)*104|0)+16>>2]-+g[e+(s*104|0)+16>>2];g[f+(h*52|0)+32>>2]=+D(+(w*w+x*x+E*E));a[A>>0]=1}if((p|0)==(j|0))break a}}while(1){e=p+1|0;s=p+i|0;f=p+h|0;if((p|0)==(j+-1|0))break;G=c[d>>2]|0;Xh(b,0);H=(c[l>>2]|0)+-1|0;F=c[z>>2]|0;c[F+(H*52|0)+24>>2]=G+(s*104|0);c[F+(H*52|0)+28>>2]=G+((e+i|0)*104|0);E=+g[G+(s*104|0)+8>>2]-+g[G+((e+i|0)*104|0)+8>>2];x=+g[G+(s*104|0)+12>>2]-+g[G+((e+i|0)*104|0)+12>>2];w=+g[G+(s*104|0)+16>>2]-+g[G+((e+i|0)*104|0)+16>>2];g[F+(H*52|0)+32>>2]=+D(+(E*E+x*x+w*w));a[A>>0]=1;H=c[d>>2]|0;Xh(b,0);F=(c[l>>2]|0)+-1|0;G=c[z>>2]|0;c[G+(F*52|0)+24>>2]=H+(s*104|0);c[G+(F*52|0)+28>>2]=H+(f*104|0);w=+g[H+(s*104|0)+8>>2]-+g[H+(f*104|0)+8>>2];x=+g[H+(s*104|0)+12>>2]-+g[H+(f*104|0)+12>>2];E=+g[H+(s*104|0)+16>>2]-+g[H+(f*104|0)+16>>2];g[G+(F*52|0)+32>>2]=+D(+(w*w+x*x+E*E));a[A>>0]=1;bg(b,s,f,e+h|0,0);if(!n)bg(b,e+h|0,e+i|0,s,0);else{E=1.0/+(j+-1|0)*+(p|0);g[n+(q<<2)>>2]=E;g[n+(q+1<<2)>>2]=t;g[n+(q+2<<2)>>2]=E;g[n+(q+3<<2)>>2]=r;x=1.0/+(j+-1|0)*+(e|0);g[n+(q+4<<2)>>2]=x;g[n+(q+5<<2)>>2]=r;bg(b,e+h|0,e+i|0,s,0);g[n+(q+6<<2)>>2]=x;g[n+(q+7<<2)>>2]=r;g[n+(q+8<<2)>>2]=x;g[n+(q+9<<2)>>2]=t;g[n+(q+10<<2)>>2]=E;g[n+(q+11<<2)>>2]=t}if(m){F=c[d>>2]|0;Xh(b,0);H=(c[l>>2]|0)+-1|0;G=c[z>>2]|0;c[G+(H*52|0)+24>>2]=F+(s*104|0);c[G+(H*52|0)+28>>2]=F+((e+h|0)*104|0);w=+g[F+(s*104|0)+8>>2]-+g[F+((e+h|0)*104|0)+8>>2];x=+g[F+(s*104|0)+12>>2]-+g[F+((e+h|0)*104|0)+12>>2];E=+g[F+(s*104|0)+16>>2]-+g[F+((e+h|0)*104|0)+16>>2];g[G+(H*52|0)+32>>2]=+D(+(w*w+x*x+E*E));a[A>>0]=1}p=e;q=q+12|0}F=c[d>>2]|0;Xh(b,0);H=(c[l>>2]|0)+-1|0;G=c[z>>2]|0;c[G+(H*52|0)+24>>2]=F+(B*104|0);c[G+(H*52|0)+28>>2]=F+(C*104|0);w=+g[F+(B*104|0)+8>>2]-+g[F+(C*104|0)+8>>2];x=+g[F+(B*104|0)+12>>2]-+g[F+(C*104|0)+12>>2];E=+g[F+(B*104|0)+16>>2]-+g[F+(C*104|0)+16>>2];g[G+(H*52|0)+32>>2]=+D(+(w*w+x*x+E*E));a[A>>0]=1;o=(j*12|0)+-12+o|0}while(0);if((y|0)==(k|0))break;else{B=B+j|0;C=C+j|0}}return b|0}function hd(b,d,e,f,h){b=b|0;d=d|0;e=+e;f=+f;h=+h;var i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.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=0.0,B=0.0,C=0.0,E=0.0,F=0.0;y=l;l=l+240|0;n=+g[b+136>>2]+f;o=+g[b+140>>2]+h;g[b+152>>2]=+g[b+132>>2]+e;g[b+156>>2]=n;g[b+160>>2]=o;g[b+164>>2]=0.0;c[y+176>>2]=1065353216;q=y+176+4|0;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[y+176+20>>2]=1065353216;r=y+176+24|0;c[r>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;c[y+176+40>>2]=1065353216;s=y+176+44|0;c[s>>2]=0;c[s+4>>2]=0;c[s+8>>2]=0;c[s+12>>2]=0;c[s+16>>2]=0;c[y+112>>2]=1065353216;t=y+112+4|0;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[y+112+20>>2]=1065353216;u=y+112+24|0;c[u>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;c[u+12>>2]=0;c[y+112+40>>2]=1065353216;v=y+112+44|0;c[v>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;c[v+16>>2]=0;o=1.0;p=10;while(1){if((p|0)<=0){x=29;break}p=p+-1|0;c[y+176+48>>2]=c[b+132>>2];c[y+176+48+4>>2]=c[b+132+4>>2];c[y+176+48+8>>2]=c[b+132+8>>2];c[y+176+48+12>>2]=c[b+132+12>>2];c[y+112+48>>2]=c[b+152>>2];c[y+112+48+4>>2]=c[b+152+4>>2];c[y+112+48+8>>2]=c[b+152+8>>2];c[y+112+48+12>>2]=c[b+152+12>>2];m=+g[b+132>>2]-+g[b+152>>2];n=+g[b+136>>2]-+g[b+156>>2];e=+g[b+140>>2]-+g[b+160>>2];z=+g[b+168>>2];j=+g[b+172>>2];A=+g[b+176>>2];h=+g[b+180>>2];B=z*(2.0/(z*z+j*j+A*A+h*h));f=j*(2.0/(z*z+j*j+A*A+h*h));k=A*(2.0/(z*z+j*j+A*A+h*h));g[y+176>>2]=1.0-(j*f+A*k);g[q>>2]=z*f-h*k;g[y+176+8>>2]=z*k+h*f;g[y+176+12>>2]=0.0;g[y+176+16>>2]=z*f+h*k;g[y+176+20>>2]=1.0-(z*B+A*k);g[r>>2]=j*k-h*B;g[y+176+28>>2]=0.0;g[y+176+32>>2]=z*k-h*f;g[y+176+36>>2]=j*k+h*B;g[y+176+40>>2]=1.0-(z*B+j*f);g[s>>2]=0.0;f=+g[b+184>>2];j=+g[b+188>>2];B=+g[b+192>>2];z=+g[b+196>>2];h=f*(2.0/(f*f+j*j+B*B+z*z));k=j*(2.0/(f*f+j*j+B*B+z*z));A=B*(2.0/(f*f+j*j+B*B+z*z));g[y+112>>2]=1.0-(j*k+B*A);g[t>>2]=f*k-z*A;g[y+112+8>>2]=f*A+z*k;g[y+112+12>>2]=0.0;g[y+112+16>>2]=f*k+z*A;g[y+112+20>>2]=1.0-(f*h+B*A);g[u>>2]=j*A-z*h;g[y+112+28>>2]=0.0;g[y+112+32>>2]=f*A-z*k;g[y+112+36>>2]=j*A+z*h;g[y+112+40>>2]=1.0-(f*h+j*k);g[v>>2]=0.0;i=c[b+8>>2]|0;g[y+4>>2]=1.0;c[y+80>>2]=0;c[y+16>>2]=0;c[y+16+4>>2]=0;c[y+16+8>>2]=0;c[y+16+12>>2]=0;c[y+16+16>>2]=0;c[y+16+20>>2]=0;c[y+16+24>>2]=0;c[y+16+28>>2]=0;c[y>>2]=5252;c[y+84>>2]=i;g[y+88>>2]=m;g[y+92>>2]=n;g[y+96>>2]=e;g[y+100>>2]=0.0;g[y+104>>2]=0.0;i=c[i+188>>2]|0;c[y+8>>2]=c[i+4>>2];c[y+12>>2]=c[i+8>>2];i=c[b+12>>2]|0;e=+nb[c[(c[i>>2]|0)+48>>2]&15](i);i=c[b+12>>2]|0;Jb[c[(c[i>>2]|0)+44>>2]&31](i,e+ +g[b+64>>2]);if(!((((((((((((+g[y+176>>2]==+g[y+112>>2]?+g[y+176+16>>2]==+g[y+112+16>>2]:0)?+g[y+176+32>>2]==+g[y+112+32>>2]:0)?+g[q>>2]==+g[t>>2]:0)?+g[y+176+20>>2]==+g[y+112+20>>2]:0)?+g[y+176+36>>2]==+g[y+112+36>>2]:0)?+g[y+176+8>>2]==+g[y+112+8>>2]:0)?+g[r>>2]==+g[u>>2]:0)?+g[y+176+40>>2]==+g[y+112+40>>2]:0)?+g[y+176+60>>2]==+g[y+112+60>>2]:0)?+g[y+176+56>>2]==+g[y+112+56>>2]:0)?+g[y+176+52>>2]==+g[y+112+52>>2]:0)?+g[y+176+48>>2]==+g[y+112+48>>2]:0))x=16;do if((x|0)==16){x=0;i=c[b+12>>2]|0;if(!(a[b+250>>0]|0)){Ud(d,i,y+176|0,y+112|0,y,+g[d+56>>2]);break}else{pd(c[b+8>>2]|0,i,y+176|0,y+112|0,y,+g[d+56>>2]);break}}while(0);i=c[b+12>>2]|0;Jb[c[(c[i>>2]|0)+44>>2]&31](i,e);B=+g[y+4>>2];o=o-B;if((B<1.0?(w=c[b+8>>2]|0,(c[w+204>>2]&4|0)==0):0)?Bb[c[(c[b>>2]|0)+56>>2]&63](b,w,c[y+80>>2]|0)|0:0){e=+g[b+152>>2];k=+g[b+132>>2];h=+g[b+156>>2];m=+g[b+136>>2];j=+g[b+160>>2];n=+g[b+140>>2];f=+D(+((e-k)*(e-k)+(h-m)*(h-m)+(j-n)*(j-n)));if(f>1.1920928955078125e-07){E=+g[y+48>>2];z=+g[y+52>>2];F=+g[y+56>>2];B=((e-k)*(1.0/f)*E+(h-m)*(1.0/f)*z+(j-n)*(1.0/f)*F)*2.0;C=(e-k)*(1.0/f)-E*B;A=(h-m)*(1.0/f)-z*B;h=(j-n)*(1.0/f)-F*B;j=1.0/+D(+(h*h+(C*C+A*A)));c[b+152>>2]=c[b+132>>2];c[b+152+4>>2]=c[b+132+4>>2];c[b+152+8>>2]=c[b+132+8>>2];c[b+152+12>>2]=c[b+132+12>>2];e=f*(j*C-E*(F*j*h+(E*j*C+z*j*A)))+ +g[b+152>>2];g[b+152>>2]=e;B=f*(j*A-z*(F*j*h+(E*j*C+z*j*A)))+ +g[b+156>>2];g[b+156>>2]=B;j=f*(j*h-F*(F*j*h+(E*j*C+z*j*A)))+ +g[b+160>>2];g[b+160>>2]=j;f=B}else f=h;h=e-k;f=f-m;e=j-n;if(!(h*h+f*f+e*e>1.1920928955078125e-07)){x=26;break}F=1.0/+D(+(h*h+f*f+e*e));if(+g[b+84>>2]*h*F+f*F*+g[b+88>>2]+e*F*+g[b+92>>2]<=0.0){x=26;break}}else{c[b+132>>2]=c[b+152>>2];c[b+132+4>>2]=c[b+152+4>>2];c[b+132+8>>2]=c[b+152+8>>2];c[b+132+12>>2]=c[b+152+12>>2]}if(!(o>.009999999776482582)){x=29;break}}if((x|0)==26){l=y;return}else if((x|0)==29){l=y;return}}function id(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=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;x=l;l=l+80|0;a[x+16>>0]=1;c[x+12>>2]=0;c[x+4>>2]=0;c[x+8>>2]=0;a[x+36>>0]=1;c[x+32>>2]=0;c[x+24>>2]=0;c[x+28>>2]=0;a[x+56>>0]=1;c[x+52>>2]=0;c[x+44>>2]=0;c[x+48>>2]=0;a[x+76>>0]=1;c[x+72>>2]=0;c[x+64>>2]=0;c[x+68>>2]=0;e=c[b+8>>2]|0;if((e|0)<=0){kj(x);l=x;return}f=0;o=0;i=0;h=0;n=0;while(1){r=c[(c[(c[b+16>>2]|0)+(f<<2)>>2]|0)+192>>2]|0;q=((r+~(r<<15)|0)>>>10^r+~(r<<15))*9|0;q=((q>>>6^q)+~((q>>>6^q)<<11)|0)>>>16^(q>>>6^q)+~((q>>>6^q)<<11);g=q&o+-1;k=g>>>0>>0;a:do if(k){i=c[h+(g<<2)>>2]|0;if((i|0)!=-1){m=c[x+72>>2]|0;while(1){if((r|0)==(c[m+(i<<3)>>2]|0)){p=9;break}j=c[n+(i<<2)>>2]|0;if((j|0)==-1)break;else i=j}if((p|0)==9?(p=0,(c[x+52>>2]|0)+(i<<2)|0):0){i=o;g=n;break}if(!k){p=16;break}}e=c[h+(g<<2)>>2]|0;if((e|0)!=-1){i=c[x+72>>2]|0;while(1){if((r|0)==(c[i+(e<<3)>>2]|0))break;e=c[n+(e<<2)>>2]|0;if((e|0)==-1){p=16;break a}}c[(c[x+52>>2]|0)+(e<<2)>>2]=r;e=o;g=n;p=74}else p=16}else p=16;while(0);if((p|0)==16){p=0;n=c[x+44>>2]|0;if((n|0)==(o|0)){e=o|0?o<<1:1;if((o|0)<(e|0)){if((e|0)!=0?(c[6995]=(c[6995]|0)+1,w=sc((e<<2|3)+16|0)|0,(w|0)!=0):0){c[(w+4+15&-16)+-4>>2]=w;i=w+4+15&-16}else i=0;if((o|0)>0){h=0;do{c[i+(h<<2)>>2]=c[(c[x+52>>2]|0)+(h<<2)>>2];h=h+1|0}while((h|0)!=(o|0))}h=c[x+52>>2]|0;if(h|0){if(a[x+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[x+52>>2]=0}a[x+56>>0]=1;c[x+52>>2]=i;c[x+48>>2]=e;h=o}else{h=o;e=o}}else{h=n;e=o}c[(c[x+52>>2]|0)+(h<<2)>>2]=r;c[x+44>>2]=h+1;h=c[x+64>>2]|0;if((h|0)==(c[x+68>>2]|0)?(s=h|0?h<<1:1,(h|0)<(s|0)):0){if((s|0)!=0?(c[6995]=(c[6995]|0)+1,t=sc((s<<3|3)+16|0)|0,(t|0)!=0):0){c[(t+4+15&-16)+-4>>2]=t;i=t+4+15&-16}else i=0;if((h|0)>0){e=0;do{j=(c[x+72>>2]|0)+(e<<3)|0;k=c[j+4>>2]|0;m=i+(e<<3)|0;c[m>>2]=c[j>>2];c[m+4>>2]=k;e=e+1|0}while((e|0)!=(h|0))}e=c[x+72>>2]|0;if(e|0){if(a[x+76>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[x+72>>2]=0}a[x+76>>0]=1;c[x+72>>2]=i;c[x+68>>2]=s;h=c[x+64>>2]|0;e=c[x+48>>2]|0}m=(c[x+72>>2]|0)+(h<<3)|0;c[m>>2]=r;c[m+4>>2]=0;c[x+64>>2]=h+1;if((o|0)<(e|0)){m=c[x+4>>2]|0;do if((m|0)<(e|0)){if((c[x+8>>2]|0)<(e|0)){if((e|0)!=0?(c[6995]=(c[6995]|0)+1,u=sc((e<<2|3)+16|0)|0,(u|0)!=0):0){c[(u+4+15&-16)+-4>>2]=u;g=u+4+15&-16}else g=0;i=c[x+12>>2]|0;if((m|0)>0){h=0;do{c[g+(h<<2)>>2]=c[i+(h<<2)>>2];h=h+1|0}while((h|0)!=(m|0));if(a[x+16>>0]|0)p=51}else if(!((i|0)==0|(a[x+16>>0]|0)==0))p=51;if((p|0)==51){p=0;c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}a[x+16>>0]=1;c[x+12>>2]=g;c[x+8>>2]=e}else g=c[x+12>>2]|0;k=e<<2;Yk(g+(m<<2)|0,0,k-(m<<2)|0)|0;c[x+4>>2]=e;j=c[x+24>>2]|0;if((j|0)<(e|0)){if((c[x+28>>2]|0)<(e|0)){if((e|0)!=0?(c[6995]=(c[6995]|0)+1,v=sc((k|3)+16|0)|0,(v|0)!=0):0){c[(v+4+15&-16)+-4>>2]=v;g=v+4+15&-16}else g=0;i=c[x+32>>2]|0;if((j|0)>0){h=0;do{c[g+(h<<2)>>2]=c[i+(h<<2)>>2];h=h+1|0}while((h|0)!=(j|0));if(a[x+36>>0]|0)p=63}else if(!((i|0)==0|(a[x+36>>0]|0)==0))p=63;if((p|0)==63){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}a[x+36>>0]=1;c[x+32>>2]=g;c[x+28>>2]=e}else g=c[x+32>>2]|0;Yk(g+(j<<2)|0,0,k-(j<<2)|0)|0}c[x+24>>2]=e;if((e|0)>0){Yk(c[x+12>>2]|0,-1,k|0)|0;Yk(c[x+32>>2]|0,-1,k|0)|0}if((m|0)<=0){e=c[x+48>>2]|0;break}h=c[x+72>>2]|0;i=c[x+12>>2]|0;j=c[x+32>>2]|0;e=c[x+48>>2]|0;g=0;do{p=c[h+(g<<3)>>2]|0;p=((p+~(p<<15)|0)>>>10^p+~(p<<15))*9|0;p=i+(((((p>>>6^p)+~((p>>>6^p)<<11)|0)>>>16^(p>>>6^p)+~((p>>>6^p)<<11))&e+-1)<<2)|0;c[j+(g<<2)>>2]=c[p>>2];c[p>>2]=g;g=g+1|0}while((g|0)!=(m|0))}while(0);g=q&e+-1}h=c[x+12>>2]|0;p=h+(g<<2)|0;g=c[x+32>>2]|0;c[g+(n<<2)>>2]=c[p>>2];c[p>>2]=n;p=74}if((p|0)==74){p=0;Ob[c[(c[r>>2]|0)+60>>2]&127](r,d);i=e;e=c[b+8>>2]|0}f=f+1|0;if((f|0)>=(e|0))break;o=i;i=c[x+4>>2]|0;n=g}if((e|0)>0)g=0;else{kj(x);l=x;return}do{f=c[(c[b+16>>2]|0)+(g<<2)>>2]|0;switch(c[f+252>>2]|0){case 64:case 1:{Ob[c[(c[f>>2]|0)+24>>2]&127](f,d);e=c[b+8>>2]|0;break}default:{}}g=g+1|0}while((g|0)<(e|0));kj(x);l=x;return}function jd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0;A=+g[b+48>>2];i=+g[d>>2];B=+g[b+64>>2];j=+g[d+4>>2];H=+g[b+80>>2];p=+g[d+8>>2];s=+g[b+52>>2];r=+g[b+68>>2];q=+g[b+84>>2];w=+g[b+56>>2];G=+g[b+72>>2];x=+g[b+88>>2];v=+g[d+16>>2];u=+g[d+20>>2];t=+g[d+24>>2];F=+g[d+32>>2];C=+g[d+36>>2];E=+g[d+40>>2];k=+g[b+96>>2];h=+g[b+100>>2];z=+g[b+104>>2];y=+g[d+48>>2]+(i*k+j*h+p*z);f=v*k+u*h+t*z+ +g[d+52>>2];z=F*k+C*h+E*z+ +g[d+56>>2];g[b+1064>>2]=A*i+B*j+H*p;g[b+1068>>2]=i*s+j*r+p*q;g[b+1072>>2]=i*w+j*G+p*x;g[b+1076>>2]=0.0;g[b+1080>>2]=A*v+B*u+H*t;g[b+1084>>2]=s*v+r*u+q*t;g[b+1088>>2]=w*v+G*u+x*t;g[b+1092>>2]=0.0;g[b+1096>>2]=A*F+B*C+H*E;g[b+1100>>2]=s*F+r*C+q*E;g[b+1104>>2]=w*F+G*C+x*E;g[b+1108>>2]=0.0;g[b+1112>>2]=y;g[b+1116>>2]=f;g[b+1120>>2]=z;g[b+1124>>2]=0.0;z=+g[b+112>>2];f=+g[e>>2];y=+g[b+128>>2];E=+g[e+4>>2];x=+g[b+144>>2];C=+g[e+8>>2];G=+g[b+116>>2];F=+g[b+132>>2];w=+g[b+148>>2];q=+g[b+120>>2];r=+g[b+136>>2];s=+g[b+152>>2];H=+g[e+16>>2];B=+g[e+20>>2];A=+g[e+24>>2];t=+g[e+32>>2];u=+g[e+36>>2];v=+g[e+40>>2];p=+g[b+160>>2];j=+g[b+164>>2];i=+g[b+168>>2];h=+g[e+48>>2]+(f*p+E*j+C*i);k=H*p+B*j+A*i+ +g[e+52>>2];i=t*p+u*j+v*i+ +g[e+56>>2];g[b+1128>>2]=z*f+y*E+x*C;g[b+1132>>2]=f*G+E*F+C*w;g[b+1136>>2]=f*q+E*r+C*s;g[b+1140>>2]=0.0;g[b+1144>>2]=z*H+y*B+x*A;g[b+1148>>2]=G*H+F*B+w*A;g[b+1152>>2]=q*H+r*B+s*A;g[b+1156>>2]=0.0;g[b+1160>>2]=z*t+y*u+x*v;g[b+1164>>2]=G*t+F*u+w*v;g[b+1168>>2]=q*t+r*u+s*v;g[b+1172>>2]=0.0;g[b+1176>>2]=h;g[b+1180>>2]=k;g[b+1184>>2]=i;g[b+1188>>2]=0.0;h=h-+g[b+1112>>2];k=k-+g[b+1116>>2];i=i-+g[b+1120>>2];w=+g[b+1084>>2];F=+g[b+1104>>2];G=+g[b+1088>>2];x=+g[b+1100>>2];y=+g[b+1096>>2];z=+g[b+1080>>2];A=+g[b+1064>>2];B=+g[b+1068>>2];H=+g[b+1072>>2];C=1.0/((w*F-G*x)*A+B*(G*y-F*z)+(x*z-w*y)*H);E=(x*z-w*y)*C;f=i*(G*B-w*H)*C+(h*(w*F-G*x)*C+k*(x*H-F*B)*C);j=i*(z*H-G*A)*C+(h*(G*y-F*z)*C+k*(F*A-y*H)*C);k=i*(w*A-z*B)*C+(h*E+k*(y*B-x*A)*C);g[b+1256>>2]=f;g[b+1260>>2]=j;g[b+1264>>2]=k;g[b+1268>>2]=0.0;g[b+840>>2]=f;h=+g[b+680>>2];i=+g[b+696>>2];do if(!(h>i)){if(h>f){c[b+856>>2]=2;f=f-h;break}if(i>2]=1;f=f-i;break}else{c[b+856>>2]=0;f=0.0;break}}else{c[b+856>>2]=0;f=0.0}while(0);g[b+824>>2]=f;g[b+844>>2]=j;f=+g[b+684>>2];h=+g[b+700>>2];do if(!(f>h)){if(f>j){c[b+860>>2]=2;f=j-f;break}if(h>2]=1;f=j-h;break}else{c[b+860>>2]=0;f=0.0;break}}else{c[b+860>>2]=0;f=0.0}while(0);g[b+828>>2]=f;g[b+848>>2]=k;f=+g[b+688>>2];h=+g[b+704>>2];do if(!(f>h)){if(f>k){c[b+864>>2]=2;f=k-f;break}if(h>2]=1;f=k-h;break}else{c[b+864>>2]=0;f=0.0;break}}else{c[b+864>>2]=0;f=0.0}while(0);g[b+832>>2]=f;n=+g[b+1128>>2];o=+g[b+1144>>2];p=+g[b+1160>>2];h=+g[b+1132>>2];i=+g[b+1148>>2];j=+g[b+1164>>2];k=(w*F-G*x)*C*h+(x*H-F*B)*C*i+(G*B-w*H)*C*j;l=h*(G*y-F*z)*C+(F*A-y*H)*C*i+(z*H-G*A)*C*j;m=p*(w*A-z*B)*C+(n*E+o*(y*B-x*A)*C);f=E*+g[b+1136>>2]+(y*B-x*A)*C*+g[b+1152>>2]+(w*A-z*B)*C*(q*t+r*u+s*v);do if(m<1.0)if(m>-1.0){g[b+1192>>2]=+L(+-(h*E+(y*B-x*A)*C*i+(w*A-z*B)*C*j),+f);f=m<-1.0?-1.0:m;g[b+1196>>2]=+J(+(f>1.0?1.0:f));f=+L(+-(p*(z*H-G*A)*C+(n*(G*y-F*z)*C+o*(F*A-y*H)*C)),+(p*(G*B-w*H)*C+(n*(w*F-G*x)*C+o*(x*H-F*B)*C)));break}else{g[b+1192>>2]=-+L(+k,+l);g[b+1196>>2]=-1.5707963705062866;f=0.0;break}else{g[b+1192>>2]=+L(+k,+l);g[b+1196>>2]=1.5707963705062866;f=0.0}while(0);g[b+1200>>2]=f;g[b+1236>>2]=0.0;x=F*(n*F-p*H)-G*(o*H-n*G);y=H*(o*H-n*G)-F*(p*G-o*F);z=G*(p*G-o*F)-H*(n*F-p*H);g[b+1220>>2]=0.0;B=o*(o*H-n*G)-p*(n*F-p*H);C=p*(p*G-o*F)-n*(o*H-n*G);E=n*(n*F-p*H)-o*(p*G-o*F);g[b+1252>>2]=0.0;A=1.0/+D(+(x*x+y*y+z*z));g[b+1208>>2]=x*A;g[b+1212>>2]=y*A;g[b+1216>>2]=z*A;A=1.0/+D(+((p*G-o*F)*(p*G-o*F)+(n*F-p*H)*(n*F-p*H)+(o*H-n*G)*(o*H-n*G)));g[b+1224>>2]=(p*G-o*F)*A;g[b+1228>>2]=(n*F-p*H)*A;g[b+1232>>2]=(o*H-n*G)*A;H=1.0/+D(+(B*B+C*C+E*E));g[b+1240>>2]=B*H;g[b+1244>>2]=C*H;g[b+1248>>2]=E*H;if(!(a[b+1301>>0]|0))return;G=+g[(c[b+28>>2]|0)+404>>2];H=+g[(c[b+32>>2]|0)+404>>2];a[b+1280>>0]=(G<1.1920928955078125e-07|H<1.1920928955078125e-07)&1;H=G+H>0.0?H/(G+H):.5;g[b+1272>>2]=H;g[b+1276>>2]=1.0-H;return}function kd(b,d){b=b|0;d=+d;var e=0,f=0,h=0.0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0;E=l;l=l+480|0;e=c[b+332>>2]|0;if((c[b+324>>2]|0)>0){f=0;do{v=c[b+24>>2]|0;Ob[c[(c[v>>2]|0)+16>>2]&127](v,c[e+(f<<2)>>2]|0);f=f+1|0;e=c[b+332>>2]|0}while((f|0)<(c[b+324>>2]|0))}if(e|0){if(a[b+336>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+332>>2]=0}a[b+336>>0]=1;c[b+332>>2]=0;c[b+324>>2]=0;c[b+328>>2]=0;q=c[b+248>>2]|0;if((q|0)<=0){l=E;return}r=c[b+256>>2]|0;s=E+416+48|0;t=E+256+28|0;u=E+312+48|0;o=0;do{v=c[r+(o<<2)>>2]|0;g[v+268>>2]=1.0;switch(c[v+220>>2]|0){case 2:case 5:break;default:if(((((c[v+204>>2]&3|0)==0?(Af(v+4|0,+g[v+372>>2],+g[v+376>>2],+g[v+380>>2],v+388|0,d,E+416|0),y=+g[s>>2],z=y-+g[v+52>>2],A=+g[E+416+52>>2],B=A-+g[v+56>>2],C=+g[E+416+56>>2],D=C-+g[v+60>>2],a[b+44>>0]|0):0)?(n=+g[v+276>>2],n*n!=0.0?n*n>2]|0)+4>>2]|0)<20:0)?(c[5787]=(c[5787]|0)+1,i=c[b+68>>2]|0,i=xb[c[(c[i>>2]|0)+36>>2]&127](i)|0,p=c[b+24>>2]|0,g[E+312+4>>2]=1.0,c[E+312+16>>2]=c[v+52>>2],c[E+312+16+4>>2]=c[v+52+4>>2],c[E+312+16+8>>2]=c[v+52+8>>2],c[E+312+16+12>>2]=c[v+52+12>>2],c[E+312+32>>2]=c[s>>2],c[E+312+32+4>>2]=c[s+4>>2],c[E+312+32+8>>2]=c[s+8>>2],c[E+312+32+12>>2]=c[s+12>>2],c[E+312+80>>2]=0,c[E+312>>2]=4556,c[E+312+84>>2]=v,c[E+312+92>>2]=i,c[E+312+96>>2]=p,p=c[v+272>>2]|0,c[E+256+8>>2]=0,c[E+256+12>>2]=-1,c[E+256>>2]=7020,c[E+256+4>>2]=8,c[E+256+16>>2]=1065353216,c[E+256+20>>2]=1065353216,c[E+256+24>>2]=1065353216,c[t>>2]=0,c[t+4>>2]=0,c[t+8>>2]=0,c[t+12>>2]=0,c[t+16>>2]=0,c[E+256+32>>2]=p,c[E+256+48>>2]=p,g[E+256+52>>2]=0.0,c[E+312+88>>2]=c[b+56>>2],p=c[v+188>>2]|0,c[E+312+8>>2]=c[p+4>>2],c[E+312+12>>2]=c[p+8>>2],c[E+192+48>>2]=c[s>>2],c[E+192+48+4>>2]=c[s+4>>2],c[E+192+48+8>>2]=c[s+8>>2],c[E+192+48+12>>2]=c[s+12>>2],c[E+192>>2]=c[v+4>>2],c[E+192+4>>2]=c[v+4+4>>2],c[E+192+8>>2]=c[v+4+8>>2],c[E+192+12>>2]=c[v+4+12>>2],c[E+192+16>>2]=c[v+20>>2],c[E+192+16+4>>2]=c[v+20+4>>2],c[E+192+16+8>>2]=c[v+20+8>>2],c[E+192+16+12>>2]=c[v+20+12>>2],c[E+192+32>>2]=c[v+36>>2],c[E+192+32+4>>2]=c[v+36+4>>2],c[E+192+32+8>>2]=c[v+36+8>>2],c[E+192+32+12>>2]=c[v+36+12>>2],Ud(b,E+256|0,v+4|0,E+192|0,E+312|0,0.0),w=+g[E+312+4>>2],w<1.0):0){h=w*(y-+g[v+52>>2]);j=w*(A-+g[v+56>>2]);m=w*(C-+g[v+60>>2]);n=-(j*+g[E+312+52>>2])-h*+g[u>>2]-m*+g[E+312+56>>2];p=c[b+24>>2]|0;p=Bb[c[(c[p>>2]|0)+12>>2]&63](p,v,c[E+312+80>>2]|0)|0;f=c[b+324>>2]|0;if((f|0)==(c[b+328>>2]|0)?(x=f|0?f<<1:1,(f|0)<(x|0)):0){if(!x)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((x<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[b+324>>2]|0}if((f|0)>0){i=0;do{c[e+(i<<2)>>2]=c[(c[b+332>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(f|0))}i=c[b+332>>2]|0;if(i){if(a[b+336>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);f=c[b+324>>2]|0}c[b+332>>2]=0}a[b+336>>0]=1;c[b+332>>2]=e;c[b+328>>2]=x;e=f}else e=f;c[(c[b+332>>2]|0)+(e<<2)>>2]=p;c[b+324>>2]=e+1;k=h+ +g[v+52>>2];j=j+ +g[v+56>>2];h=m+ +g[v+60>>2];e=c[E+312+80>>2]|0;P=+g[e+4>>2];O=+g[e+20>>2];N=+g[e+36>>2];M=+g[e+8>>2];L=+g[e+24>>2];K=+g[e+40>>2];J=+g[e+12>>2];H=+g[e+28>>2];F=+g[e+44>>2];I=-+g[e+52>>2];G=-+g[e+56>>2];m=-+g[e+60>>2];c[E>>2]=0;c[E+4>>2]=0;c[E+8>>2]=0;c[E+12>>2]=0;g[E+16>>2]=k*P+j*O+h*N+(P*I+O*G+N*m);g[E+20>>2]=k*M+j*L+h*K+(M*I+L*G+K*m);g[E+24>>2]=k*J+j*H+h*F+(J*I+H*G+F*m);g[E+28>>2]=0.0;c[E+64>>2]=c[u>>2];c[E+64+4>>2]=c[u+4>>2];c[E+64+8>>2]=c[u+8>>2];c[E+64+12>>2]=c[u+12>>2];g[E+80>>2]=n;c[E+84>>2]=0;c[E+84+4>>2]=0;c[E+84+8>>2]=0;c[E+84+12>>2]=0;e=E+116|0;f=e+44|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));i=kf(p,E)|0;g[p+4+(i*192|0)+96>>2]=0.0;P=+g[v+228>>2]*+g[(c[E+312+80>>2]|0)+228>>2];P=P<-10.0?-10.0:P;g[p+4+(i*192|0)+84>>2]=P>10.0?10.0:P;c[p+4+(i*192|0)+48>>2]=c[v+52>>2];c[p+4+(i*192|0)+48+4>>2]=c[v+52+4>>2];c[p+4+(i*192|0)+48+8>>2]=c[v+52+8>>2];c[p+4+(i*192|0)+48+12>>2]=c[v+52+12>>2];g[p+4+(i*192|0)+32>>2]=k;g[p+4+(i*192|0)+36>>2]=j;g[p+4+(i*192|0)+40>>2]=h;g[p+4+(i*192|0)+44>>2]=0.0}}o=o+1|0}while((o|0)<(q|0));l=E;return}function ld(a,d,f,h,i,j,k,l){a=a|0;d=d|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0.0,q=0,r=0,s=0.0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0.0,B=0.0,C=0,D=0,E=0,F=0,G=0;v=+g[a+8>>2];x=+g[a+12>>2];A=+g[a+16>>2];w=+g[a+40>>2];p=(+g[d>>2]-v)*w;y=+g[a+44>>2];s=(+g[d+4>>2]-x)*y;B=+g[a+48>>2];u=(+g[d+8>>2]-A)*B;if(!(p<=0.0)){t=b[a+6>>1]|0;t=(!(p>=+(t&65535))?~~p&65535:t)&b[a+4>>1]}else t=0;if(!(s<=0.0)){r=b[a+6>>1]|0;r=(!(s>=+(r&65535))?~~s&65535:r)&b[a+4>>1]}else r=0;if(!(u<=0.0)){q=b[a+6>>1]|0;q=(!(u>=+(q&65535))?~~u&65535:q)&b[a+4>>1]}else q=0;u=(+g[f>>2]-v)*w;s=(+g[f+4>>2]-x)*y;p=(+g[f+8>>2]-A)*B;if(!(u<=0.0)){o=b[a+6>>1]|0;o=(!(u>=+(o&65535))?~~u&65535:o)&b[a+4>>1]|1}else o=1;if(!(s<=0.0)){n=b[a+6>>1]|0;n=(!(s>=+(n&65535))?~~s&65535:n)&b[a+4>>1]|1}else n=1;if(!(p<=0.0)){m=b[a+6>>1]|0;m=(!(p>=+(m&65535))?~~p&65535:m)&b[a+4>>1]|1}else m=1;D=b[a+64>>1]|0;C=c[a+60>>2]|0;b[a+64>>1]=b[C+((D&65535)<<6)+48>>1]|0;z=(b[a+56>>1]|0)+1<<16>>16;b[a+56>>1]=z;c[C+((D&65535)<<6)+12>>2]=D&65535;c[C+((D&65535)<<6)>>2]=i;c[C+((D&65535)<<6)+4>>2]=j;c[C+((D&65535)<<6)+8>>2]=k;E=(z&65535)<<1&65534;b[C+54>>1]=(e[C+54>>1]|0)+2;F=c[a+68>>2]|0;G=e[F+(E+-1<<2)>>1]|e[F+(E+-1<<2)+2>>1]<<16;b[F+((E|1)<<2)>>1]=G;b[F+((E|1)<<2)+2>>1]=G>>>16;F=c[a+68>>2]|0;b[F+(E+-1<<2)>>1]=t;b[F+(E+-1<<2)+2>>1]=D;b[F+(E<<2)>>1]=o;b[F+(E<<2)+2>>1]=D;b[C+((D&65535)<<6)+48>>1]=E+-1;b[C+((D&65535)<<6)+54>>1]=(z&65535)<<1;o=(c[a+60>>2]|0)+56|0;b[o>>1]=(e[o>>1]|0)+2;o=c[a+72>>2]|0;t=e[o+(E+-1<<2)>>1]|e[o+(E+-1<<2)+2>>1]<<16;b[o+((E|1)<<2)>>1]=t;b[o+((E|1)<<2)+2>>1]=t>>>16;o=c[a+72>>2]|0;b[o+(E+-1<<2)>>1]=r;b[o+(E+-1<<2)+2>>1]=D;b[o+(E<<2)>>1]=n;b[o+(E<<2)+2>>1]=D;b[C+((D&65535)<<6)+50>>1]=E+-1;b[C+((D&65535)<<6)+56>>1]=(z&65535)<<1;n=(c[a+60>>2]|0)+58|0;b[n>>1]=(e[n>>1]|0)+2;n=c[a+76>>2]|0;o=e[n+(E+-1<<2)>>1]|e[n+(E+-1<<2)+2>>1]<<16;b[n+((E|1)<<2)>>1]=o;b[n+((E|1)<<2)+2>>1]=o>>>16;n=c[a+76>>2]|0;b[n+(E+-1<<2)>>1]=q;b[n+(E+-1<<2)+2>>1]=D;b[n+(E<<2)>>1]=m;b[n+(E<<2)+2>>1]=D;b[C+((D&65535)<<6)+52>>1]=E+-1;b[C+((D&65535)<<6)+58>>1]=(z&65535)<<1;n=c[a+68>>2]|0;o=e[C+((D&65535)<<6)+48>>1]|0;t=c[a+60>>2]|0;q=b[n+(o<<2)+-4>>1]|0;if((e[n+(o<<2)>>1]|0)<(q&65535)){z=t+((e[n+(o<<2)+2>>1]|0)<<6)+48|0;m=n+(o<<2)+-4|0;r=n+(o<<2)|0;o=q;n=t;while(1){G=e[r+-2>>1]|0;n=(o&1)==0?n+(G<<6)+48|0:n+(G<<6)+54|0;b[n>>1]=(b[n>>1]|0)+1<<16>>16;b[z>>1]=(b[z>>1]|0)+-1<<16>>16;n=e[r>>1]|e[r+2>>1]<<16;o=e[m>>1]|e[m+2>>1]<<16;b[r>>1]=o;b[r+2>>1]=o>>>16;b[m>>1]=n;b[m+2>>1]=n>>>16;n=r+-4|0;m=m+-4|0;o=b[m>>1]|0;if((e[n>>1]|0)>=(o&65535))break;r=n;n=c[a+60>>2]|0}n=c[a+68>>2]|0}m=e[C+((D&65535)<<6)+54>>1]|0;o=n+(m<<2)|0;r=b[o+-4>>1]|0;a:do if((e[o>>1]|0)<(r&65535)){G=c[a+60>>2]|0;t=G+((e[n+(m<<2)+2>>1]|0)<<6)+54|0;m=o+-4|0;q=o;n=r;o=G;while(1){G=e[q+-2>>1]|0;o=(n&1)==0?o+(G<<6)+48|0:o+(G<<6)+54|0;b[o>>1]=(b[o>>1]|0)+1<<16>>16;b[t>>1]=(b[t>>1]|0)+-1<<16>>16;o=e[q>>1]|e[q+2>>1]<<16;n=e[m>>1]|e[m+2>>1]<<16;b[q>>1]=n;b[q+2>>1]=n>>>16;b[m>>1]=o;b[m+2>>1]=o>>>16;o=q+-4|0;m=m+-4|0;n=b[m>>1]|0;if((e[o>>1]|0)>=(n&65535))break a;q=o;o=c[a+60>>2]|0}}while(0);n=c[a+72>>2]|0;o=e[C+((D&65535)<<6)+50>>1]|0;t=c[a+60>>2]|0;q=b[n+(o<<2)+-4>>1]|0;if((e[n+(o<<2)>>1]|0)<(q&65535)){z=t+((e[n+(o<<2)+2>>1]|0)<<6)+50|0;m=n+(o<<2)+-4|0;r=n+(o<<2)|0;o=q;n=t;while(1){G=e[r+-2>>1]|0;n=(o&1)==0?n+(G<<6)+50|0:n+(G<<6)+56|0;b[n>>1]=(b[n>>1]|0)+1<<16>>16;b[z>>1]=(b[z>>1]|0)+-1<<16>>16;n=e[r>>1]|e[r+2>>1]<<16;o=e[m>>1]|e[m+2>>1]<<16;b[r>>1]=o;b[r+2>>1]=o>>>16;b[m>>1]=n;b[m+2>>1]=n>>>16;n=r+-4|0;m=m+-4|0;o=b[m>>1]|0;if((e[n>>1]|0)>=(o&65535))break;r=n;n=c[a+60>>2]|0}n=c[a+72>>2]|0}m=e[C+((D&65535)<<6)+56>>1]|0;o=n+(m<<2)|0;r=b[o+-4>>1]|0;b:do if((e[o>>1]|0)<(r&65535)){G=c[a+60>>2]|0;t=G+((e[n+(m<<2)+2>>1]|0)<<6)+56|0;m=o+-4|0;q=o;n=r;o=G;while(1){G=e[q+-2>>1]|0;o=(n&1)==0?o+(G<<6)+50|0:o+(G<<6)+56|0;b[o>>1]=(b[o>>1]|0)+1<<16>>16;b[t>>1]=(b[t>>1]|0)+-1<<16>>16;o=e[q>>1]|e[q+2>>1]<<16;n=e[m>>1]|e[m+2>>1]<<16;b[q>>1]=n;b[q+2>>1]=n>>>16;b[m>>1]=o;b[m+2>>1]=o>>>16;o=q+-4|0;m=m+-4|0;n=b[m>>1]|0;if((e[o>>1]|0)>=(n&65535))break b;q=o;o=c[a+60>>2]|0}}while(0);xh(a,2,b[C+((D&65535)<<6)+52>>1]|0);sh(a,2,b[C+((D&65535)<<6)+58>>1]|0,l);n=c[a+60>>2]|0;m=c[a+108>>2]|0;if(!m){G=n+((D&65535)<<6)|0;return G|0}c[n+((D&65535)<<6)+60>>2]=Fb[c[(c[m>>2]|0)+8>>2]&3](m,d,f,h,i,j,k,l)|0;G=n+((D&65535)<<6)|0;return G|0}function md(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;q=l;l=l+32|0;ng(b+4|0,((P(c[b+112>>2]|0,c[b+16>>2]|0)|0)/100|0)+1|0);if(c[b+124>>2]|0){o=((P(c[b+108>>2]|0,c[b+56>>2]|0)|0)/100|0)+1|0;ng(b+44|0,o);o=(c[b+124>>2]|0)-o|0;c[b+124>>2]=(o|0)>0?o:0}f=((c[b+104>>2]|0)+1|0)%2|0;c[b+104>>2]=f;f=c[b+84+(f<<2)>>2]|0;if(f|0){do{h=f+56|0;k=f;f=c[h>>2]|0;i=c[k+52>>2]|0;c[((i|0)==0?b+84+(c[k+60>>2]<<2)|0:i+56|0)>>2]=f;i=c[h>>2]|0;if(i|0)c[i+52>>2]=c[k+52>>2];c[k+52>>2]=0;c[h>>2]=c[b+92>>2];h=c[b+92>>2]|0;if(h|0)c[h+52>>2]=k;c[b+92>>2]=k;h=c[k+48>>2]|0;Ag(b+4|0,h)|0;i=c[b+8>>2]|0;if(i|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[b+8>>2]=h;c[b+16>>2]=(c[b+16>>2]|0)+-1;c[q>>2]=c[k+16>>2];c[q+4>>2]=c[k+16+4>>2];c[q+8>>2]=c[k+16+8>>2];c[q+12>>2]=c[k+16+12>>2];c[q+16>>2]=c[k+32>>2];c[q+16+4>>2]=c[k+32+4>>2];c[q+16+8>>2]=c[k+32+8>>2];c[q+16+12>>2]=c[k+32+12>>2];h=c[b+48>>2]|0;if(!h){c[6995]=(c[6995]|0)+1;h=sc(63)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}i=h;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0))}else c[b+48>>2]=0;c[h+32>>2]=0;c[h+36>>2]=k;c[h+40>>2]=0;c[h>>2]=c[q>>2];c[h+4>>2]=c[q+4>>2];c[h+8>>2]=c[q+8>>2];c[h+12>>2]=c[q+12>>2];c[h+16>>2]=c[q+16>>2];c[h+20>>2]=c[q+20>>2];c[h+24>>2]=c[q+24>>2];c[h+28>>2]=c[q+28>>2];Pe(b+44|0,c[b+44>>2]|0,h);i=(c[b+56>>2]|0)+1|0;c[b+56>>2]=i;c[k+48>>2]=h;c[k+60>>2]=2}while((f|0)!=0);c[b+124>>2]=i;a[b+154>>0]=1}c[q>>2]=9248;c[q+4>>2]=b;if(a[b+153>>0]|0?(ne(b+4|0,c[b+4>>2]|0,c[b+44>>2]|0,q),a[b+153>>0]|0):0){o=c[b+4>>2]|0;ne(b+4|0,o,o,q)}if(a[b+154>>0]|0?(m=c[b+96>>2]|0,m=xb[c[(c[m>>2]|0)+28>>2]&127](m)|0,e=c[m+4>>2]|0,(e|0)>0):0){f=(P(c[b+116>>2]|0,e)|0)/100|0;o=c[b+120>>2]|0;f=(o|0)>(f|0)?o:f;f=(e|0)<(f|0)?e:f;if((f|0)>0){h=0;do{j=((c[b+144>>2]|0)+h|0)%(e|0)|0;n=c[m+12>>2]|0;i=c[n+(j<<4)>>2]|0;j=c[n+(j<<4)+4>>2]|0;n=c[i+48>>2]|0;o=c[j+48>>2]|0;if(!(((((+g[n>>2]<=+g[o+16>>2]?+g[n+16>>2]>=+g[o>>2]:0)?+g[n+4>>2]<=+g[o+20>>2]:0)?+g[n+20>>2]>=+g[o+4>>2]:0)?+g[n+8>>2]<=+g[o+24>>2]:0)?+g[n+24>>2]>=+g[o+8>>2]:0)){e=c[b+96>>2]|0;Cb[c[(c[e>>2]|0)+12>>2]&31](e,i,j,d)|0;f=f+-1|0;h=h+-1|0;e=c[m+4>>2]|0}h=h+1|0}while((h|0)<(f|0));if((e|0)>0)p=34;else e=0}else p=34;if((p|0)==34)e=((c[b+144>>2]|0)+f|0)%(e|0)|0;c[b+144>>2]=e}c[b+140>>2]=(c[b+140>>2]|0)+1;c[b+120>>2]=1;a[b+154>>0]=0;o=c[b+128>>2]|0;n=c[b+132>>2]|0;g[b+136>>2]=(o|0)==0?0.0:+(n>>>0)/+(o>>>0);c[b+132>>2]=n>>>1;c[b+128>>2]=o>>>1;o=c[b+96>>2]|0;if(!(xb[c[(c[o>>2]|0)+56>>2]&127](o)|0)){l=q;return}o=c[b+96>>2]|0;o=xb[c[(c[o>>2]|0)+28>>2]&127](o)|0;e=c[o+4>>2]|0;if((e|0)>1){te(o,0,e+-1|0);e=c[o+4>>2]|0}if((e|0)>0){m=0;k=0;n=0;f=0;while(1){i=c[o+12>>2]|0;h=i+(m<<4)|0;r=n;n=c[h>>2]|0;i=i+(m<<4)+4|0;j=c[i>>2]|0;if(!((n|0)==(r|0)&(j|0)==(f|0))){f=c[n+48>>2]|0;r=c[j+48>>2]|0;if(((((+g[f>>2]<=+g[r+16>>2]?+g[f+16>>2]>=+g[r>>2]:0)?+g[f+4>>2]<=+g[r+20>>2]:0)?+g[f+20>>2]>=+g[r+4>>2]:0)?+g[f+8>>2]<=+g[r+24>>2]:0)?+g[f+24>>2]>=+g[r+8>>2]:0){h=k;f=j}else{f=j;p=48}}else p=48;if((p|0)==48){p=0;e=c[b+96>>2]|0;Sb[c[(c[e>>2]|0)+32>>2]&127](e,h,d);c[h>>2]=0;c[i>>2]=0;h=k+1|0;e=c[o+4>>2]|0}m=m+1|0;if((m|0)>=(e|0))break;else k=h}if((e|0)>1){te(o,0,e+-1|0);e=c[o+4>>2]|0}j=e-h|0;if((h|0)<0){if((c[o+8>>2]|0)<(j|0)){if(!j){f=0;i=e}else{c[6995]=(c[6995]|0)+1;f=sc((j<<4|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=c[o+4>>2]|0}if((i|0)>0){h=0;do{r=c[o+12>>2]|0;c[f+(h<<4)>>2]=c[r+(h<<4)>>2];c[f+(h<<4)+4>>2]=c[r+(h<<4)+4>>2];c[f+(h<<4)+8>>2]=c[r+(h<<4)+8>>2];c[f+(h<<4)+12>>2]=c[r+(h<<4)+12>>2];h=h+1|0}while((h|0)!=(i|0))}h=c[o+12>>2]|0;if(h|0){if(a[o+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[o+12>>2]=0}a[o+16>>0]=1;c[o+12>>2]=f;c[o+8>>2]=j}do{r=(c[o+12>>2]|0)+(e<<4)|0;e=e+1|0;c[r>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0}while((e|0)!=(j|0));e=j}else e=j}c[o+4>>2]=e;l=q;return}function nd(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,h=0,i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0;r=c[b+28>>2]|0;k=c[b+32>>2]|0;xc(b,r+4|0,k+4|0,r+324|0,k+324|0);j=c[d+8>>2]|0;g[j>>2]=1.0;l=c[d+24>>2]|0;g[j+(l+1<<2)>>2]=1.0;g[j+((l<<1)+2<<2)>>2]=1.0;n=+g[b+348>>2];v=+g[b+352>>2];p=+g[b+356>>2];t=+g[r+4>>2]*n+ +g[r+8>>2]*v+ +g[r+12>>2]*p;o=n*+g[r+20>>2]+v*+g[r+24>>2]+p*+g[r+28>>2];p=n*+g[r+36>>2]+v*+g[r+40>>2]+p*+g[r+44>>2];j=c[d+12>>2]|0;c[j>>2]=0;g[j+4>>2]=p;g[j+8>>2]=-o;g[j+12>>2]=0.0;g[j+(l<<2)>>2]=-p;c[j+(l<<2)+4>>2]=0;g[j+(l<<2)+8>>2]=t;g[j+(l<<2)+12>>2]=0.0;g[j+(l<<1<<2)>>2]=o;g[j+(l<<1<<2)+4>>2]=-t;c[j+(l<<1<<2)+8>>2]=0;g[j+(l<<1<<2)+12>>2]=0.0;j=c[d+16>>2]|0;g[j>>2]=-1.0;g[j+(l+1<<2)>>2]=-1.0;g[j+((l<<1)+2<<2)>>2]=-1.0;v=+g[b+412>>2];n=+g[b+416>>2];m=+g[b+420>>2];u=+g[k+4>>2]*v+ +g[k+8>>2]*n+ +g[k+12>>2]*m;f=v*+g[k+20>>2]+n*+g[k+24>>2]+m*+g[k+28>>2];m=v*+g[k+36>>2]+n*+g[k+40>>2]+m*+g[k+44>>2];l=c[d+20>>2]|0;j=c[d+24>>2]|0;c[l>>2]=0;g[l+4>>2]=-m;g[l+8>>2]=f;g[l+12>>2]=0.0;g[l+(j<<2)>>2]=m;c[l+(j<<2)+4>>2]=0;g[l+(j<<2)+8>>2]=-u;g[l+(j<<2)+12>>2]=0.0;g[l+(j<<1<<2)>>2]=-f;g[l+(j<<1<<2)+4>>2]=u;c[l+(j<<1<<2)+8>>2]=0;g[l+(j<<1<<2)+12>>2]=0.0;q=c[b+592>>2]|0;n=+g[(q&2|0?b+600|0:d+4|0)>>2]*+g[d>>2];i=c[d+28>>2]|0;s=c[d+36>>2]|0;h=c[d+40>>2]|0;g[i>>2]=n*(u+ +g[k+52>>2]-t-+g[r+52>>2]);g[s>>2]=-3402823466385288598117041.0e14;g[h>>2]=3402823466385288598117041.0e14;if(!(q&1)){g[i+(j<<2)>>2]=n*(f+ +g[k+56>>2]-o-+g[r+56>>2]);g[s+(j<<2)>>2]=-3402823466385288598117041.0e14;g[h+(j<<2)>>2]=3402823466385288598117041.0e14;g[i+(j<<1<<2)>>2]=n*(m+ +g[k+60>>2]-p-+g[r+60>>2]);g[s+(j<<1<<2)>>2]=-3402823466385288598117041.0e14;g[h+(j<<1<<2)>>2]=3402823466385288598117041.0e14}else{w=c[d+32>>2]|0;c[w>>2]=c[b+596>>2];g[i+(j<<2)>>2]=n*(f+ +g[k+56>>2]-o-+g[r+56>>2]);g[s+(j<<2)>>2]=-3402823466385288598117041.0e14;g[h+(j<<2)>>2]=3402823466385288598117041.0e14;c[w+(j<<2)>>2]=c[b+596>>2];g[i+(j<<1<<2)>>2]=n*(m+ +g[k+60>>2]-p-+g[r+60>>2]);g[s+(j<<1<<2)>>2]=-3402823466385288598117041.0e14;g[h+(j<<1<<2)>>2]=3402823466385288598117041.0e14;c[w+(j<<1<<2)>>2]=c[b+596>>2]}if(!(a[b+526>>0]|0)){l=j*3|0;j=s}else{k=c[d+12>>2]|0;v=+g[b+456>>2];if(+g[b+444>>2]>2]>2];y=+g[r+8>>2];x=+g[r+12>>2];D=+g[b+304>>2];C=+g[b+320>>2];B=+g[b+336>>2];o=+g[b+308>>2];t=+g[b+324>>2];v=+g[b+340>>2];f=+g[r+20>>2];m=+g[r+24>>2];n=+g[r+28>>2];p=+g[r+36>>2];u=+g[r+40>>2];e=+g[r+44>>2];g[k+(j*3<<2)>>2]=z*D+y*C+x*B;g[k+((j*3|0)+1<<2)>>2]=D*f+C*m+B*n;g[k+((j*3|0)+2<<2)>>2]=D*p+C*u+B*e;g[k+(j<<2<<2)>>2]=z*o+y*t+x*v;g[k+((j<<2|1)<<2)>>2]=o*f+t*m+v*n;g[k+((j<<2|2)<<2)>>2]=o*p+t*u+v*e;g[l+(j*3<<2)>>2]=-(z*D+y*C+x*B);g[l+((j*3|0)+1<<2)>>2]=-(D*f+C*m+B*n);g[l+((j*3|0)+2<<2)>>2]=-(D*p+C*u+B*e);g[l+(j<<2<<2)>>2]=-(z*o+y*t+x*v);g[l+((j<<2|1)<<2)>>2]=-(o*f+t*m+v*n);g[l+((j<<2|2)<<2)>>2]=-(o*p+t*u+v*e);A=+g[d>>2]*+g[b+436>>2];i=c[d+28>>2]|0;g[i+(j*3<<2)>>2]=A*((z*D+y*C+x*B)*+g[b+460>>2]+(D*f+C*m+B*n)*+g[b+464>>2]+(D*p+C*u+B*e)*+g[b+468>>2]);g[i+(j<<2<<2)>>2]=A*((z*o+y*t+x*v)*+g[b+460>>2]+(o*f+t*m+v*n)*+g[b+464>>2]+(o*p+t*u+v*e)*+g[b+468>>2]);k=c[d+36>>2]|0;g[k+(j*3<<2)>>2]=-3402823466385288598117041.0e14;h=c[d+40>>2]|0;g[h+(j*3<<2)>>2]=3402823466385288598117041.0e14;g[k+(j<<2<<2)>>2]=-3402823466385288598117041.0e14;e=3402823466385288598117041.0e14;l=j<<2;j=c[d+24>>2]|0}else{D=+g[b+436>>2];B=D*+g[b+460>>2]*D;C=D*D*+g[b+464>>2];D=D*D*+g[b+468>>2];g[k+(j*3<<2)>>2]=B;g[k+((j*3|0)+1<<2)>>2]=C;g[k+((j*3|0)+2<<2)>>2]=D;g[l+(j*3<<2)>>2]=-B;g[l+((j*3|0)+1<<2)>>2]=-C;g[l+((j*3|0)+2<<2)>>2]=-D;g[i+(j*3<<2)>>2]=+g[d>>2]*+g[b+432>>2]*+g[b+504>>2];if(q&4|0)c[(c[d+32>>2]|0)+(j*3<<2)>>2]=c[b+604>>2];g[s+(j*3<<2)>>2]=0.0;if((a[b+552>>0]|0)!=0?(e=+g[b+572>>2],e>=0.0):0){l=j*3|0;k=s}else{e=3402823466385288598117041.0e14;l=j*3|0;k=s}}g[h+(l<<2)>>2]=e;l=j+l|0;j=k}if(!(a[b+525>>0]|0))return;D=+g[b+436>>2];B=D*+g[b+476>>2]*D;C=D*D*+g[b+480>>2];D=D*D*+g[b+484>>2];q=c[d+12>>2]|0;s=c[d+20>>2]|0;g[q+(l<<2)>>2]=B;r=l+1|0;g[q+(r<<2)>>2]=C;w=l+2|0;g[q+(w<<2)>>2]=D;g[s+(l<<2)>>2]=-B;g[s+(r<<2)>>2]=-C;g[s+(w<<2)>>2]=-D;g[i+(l<<2)>>2]=+g[d>>2]*+g[b+432>>2]*+g[b+508>>2];if(c[b+592>>2]&4|0)c[(c[d+32>>2]|0)+(l<<2)>>2]=c[b+604>>2];if(+g[b+452>>2]>0.0){w=+g[b+508>>2]>0.0;e=w?0.0:-3402823466385288598117041.0e14;f=w?3402823466385288598117041.0e14:0.0}else{e=-3402823466385288598117041.0e14;f=3402823466385288598117041.0e14}g[j+(l<<2)>>2]=e;g[h+(l<<2)>>2]=f;return}function od(b,d,e,f,h,i,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0;if((j|0)<2|(k|0)<2){m=0;return m|0}r=P(k,j)|0;c[6995]=(c[6995]|0)+1;b=sc(r>>>0>268435455?18:(r<<4|3)+16|0)|0;if(!b)p=0;else{c[(b+4+15&-16)+-4>>2]=b;p=b+4+15&-16}q=$I(r>>>0>1073741823?-1:r<<2)|0;if((k|0)>0?(j|0)>0:0){b=0;do{A=+(b|0)/+(k+-1|0);u=+g[e>>2];u=u+A*(+g[h>>2]-u);v=+g[e+4>>2];v=v+A*(+g[h+4>>2]-v);w=+g[e+8>>2];w=w+A*(+g[h+8>>2]-w);x=+g[f>>2];y=+g[f+4>>2];z=+g[f+8>>2];x=x+A*(+g[i>>2]-x)-u;y=y+A*(+g[i+4>>2]-y)-v;z=z+A*(+g[i+8>>2]-z)-w;o=P(b,j)|0;n=0;do{A=+(n|0)/+(j+-1|0);t=n+o|0;g[p+(t<<4)>>2]=u+x*A;g[p+(t<<4)+4>>2]=v+y*A;g[p+(t<<4)+8>>2]=w+z*A;g[p+(t<<4)+12>>2]=0.0;g[q+(t<<2)>>2]=1.0;n=n+1|0}while((n|0)!=(j|0));b=b+1|0}while((b|0)!=(k|0))}c[6995]=(c[6995]|0)+1;b=sc(1271)|0;if(!b)b=0;else{c[(b+4+15&-16)+-4>>2]=b;b=b+4+15&-16}Bc(b,d,r,p,q);if(l&1|0){g[(c[b+780>>2]|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&2|0){g[(c[b+780>>2]|0)+((j+-1|0)*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&4|0){t=P(k+-1|0,j)|0;g[(c[b+780>>2]|0)+(t*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(l&8|0){t=j+-1+(P(k+-1|0,j)|0)|0;g[(c[b+780>>2]|0)+(t*104|0)+88>>2]=0.0;a[b+984>>0]=1}if(p|0){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}aJ(q);if((k|0)<=0){m=b;return m|0}r=b+780|0;d=b+792|0;l=b+800|0;s=b+984|0;i=0;do{p=i;i=i+1|0;a:do if((j|0)>0){t=P(p,j)|0;e=P(i,j)|0;if((i|0)<(k|0))n=0;else{n=0;while(1){o=n;n=n+1|0;if((n|0)<(j|0)){q=n+t|0;e=c[r>>2]|0;Xh(b,0);h=(c[d>>2]|0)+-1|0;f=c[l>>2]|0;c[f+(h*52|0)+24>>2]=e+((o+t|0)*104|0);c[f+(h*52|0)+28>>2]=e+(q*104|0);y=+g[e+((o+t|0)*104|0)+8>>2]-+g[e+(q*104|0)+8>>2];z=+g[e+((o+t|0)*104|0)+12>>2]-+g[e+(q*104|0)+12>>2];A=+g[e+((o+t|0)*104|0)+16>>2]-+g[e+(q*104|0)+16>>2];g[f+(h*52|0)+32>>2]=+D(+(y*y+z*z+A*A));a[s>>0]=1}if((n|0)==(j|0))break a}}do{q=n+t|0;o=n;n=n+1|0;do if((n|0)<(j|0)){f=n+t|0;B=c[r>>2]|0;Xh(b,0);C=(c[d>>2]|0)+-1|0;h=c[l>>2]|0;c[h+(C*52|0)+24>>2]=B+(q*104|0);c[h+(C*52|0)+28>>2]=B+(f*104|0);A=+g[B+(q*104|0)+8>>2]-+g[B+(f*104|0)+8>>2];z=+g[B+(q*104|0)+12>>2]-+g[B+(f*104|0)+12>>2];y=+g[B+(q*104|0)+16>>2]-+g[B+(f*104|0)+16>>2];g[h+(C*52|0)+32>>2]=+D(+(A*A+z*z+y*y));a[s>>0]=1;C=c[r>>2]|0;Xh(b,0);h=(c[d>>2]|0)+-1|0;B=c[l>>2]|0;c[B+(h*52|0)+24>>2]=C+(q*104|0);c[B+(h*52|0)+28>>2]=C+((o+e|0)*104|0);y=+g[C+(q*104|0)+8>>2]-+g[C+((o+e|0)*104|0)+8>>2];z=+g[C+(q*104|0)+12>>2]-+g[C+((o+e|0)*104|0)+12>>2];A=+g[C+(q*104|0)+16>>2]-+g[C+((o+e|0)*104|0)+16>>2];g[B+(h*52|0)+32>>2]=+D(+(y*y+z*z+A*A));a[s>>0]=1;if(!(o+p&1)){bg(b,o+e|0,q,f,0);bg(b,o+e|0,f,n+e|0,0);if(!m)break;h=c[r>>2]|0;Xh(b,0);C=(c[d>>2]|0)+-1|0;B=c[l>>2]|0;c[B+(C*52|0)+24>>2]=h+(f*104|0);c[B+(C*52|0)+28>>2]=h+((o+e|0)*104|0);y=+g[h+(f*104|0)+8>>2]-+g[h+((o+e|0)*104|0)+8>>2];z=+g[h+(f*104|0)+12>>2]-+g[h+((o+e|0)*104|0)+12>>2];A=+g[h+(f*104|0)+16>>2]-+g[h+((o+e|0)*104|0)+16>>2];g[B+(C*52|0)+32>>2]=+D(+(y*y+z*z+A*A));a[s>>0]=1;break}else{h=n+e|0;bg(b,q,f,h,0);bg(b,q,h,o+e|0,0);if(!m)break;f=c[r>>2]|0;Xh(b,0);C=(c[d>>2]|0)+-1|0;B=c[l>>2]|0;c[B+(C*52|0)+24>>2]=f+(q*104|0);c[B+(C*52|0)+28>>2]=f+(h*104|0);y=+g[f+(q*104|0)+8>>2]-+g[f+(h*104|0)+8>>2];z=+g[f+(q*104|0)+12>>2]-+g[f+(h*104|0)+12>>2];A=+g[f+(q*104|0)+16>>2]-+g[f+(h*104|0)+16>>2];g[B+(C*52|0)+32>>2]=+D(+(y*y+z*z+A*A));a[s>>0]=1;break}}else{h=c[r>>2]|0;Xh(b,0);C=(c[d>>2]|0)+-1|0;B=c[l>>2]|0;c[B+(C*52|0)+24>>2]=h+(q*104|0);c[B+(C*52|0)+28>>2]=h+((o+e|0)*104|0);y=+g[h+(q*104|0)+8>>2]-+g[h+((o+e|0)*104|0)+8>>2];z=+g[h+(q*104|0)+12>>2]-+g[h+((o+e|0)*104|0)+12>>2];A=+g[h+(q*104|0)+16>>2]-+g[h+((o+e|0)*104|0)+16>>2];g[B+(C*52|0)+32>>2]=+D(+(y*y+z*z+A*A));a[s>>0]=1}while(0)}while((n|0)!=(j|0))}while(0)}while((i|0)!=(k|0));return b|0}function pd(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=+h;var i=0.0,j=0.0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0,B=0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0;B=l;l=l+272|0;c[B+128>>2]=c[d>>2];c[B+128+4>>2]=c[d+4>>2];c[B+128+8>>2]=c[d+8>>2];c[B+128+12>>2]=c[d+12>>2];c[B+128+16>>2]=c[d+16>>2];c[B+128+16+4>>2]=c[d+16+4>>2];c[B+128+16+8>>2]=c[d+16+8>>2];c[B+128+16+12>>2]=c[d+16+12>>2];c[B+128+32>>2]=c[d+32>>2];c[B+128+32+4>>2]=c[d+32+4>>2];c[B+128+32+8>>2]=c[d+32+8>>2];c[B+128+32+12>>2]=c[d+32+12>>2];c[B+128+48>>2]=c[d+48>>2];c[B+128+48+4>>2]=c[d+48+4>>2];c[B+128+48+8>>2]=c[d+48+8>>2];c[B+128+48+12>>2]=c[d+48+12>>2];c[B+64>>2]=c[e>>2];c[B+64+4>>2]=c[e+4>>2];c[B+64+8>>2]=c[e+8>>2];c[B+64+12>>2]=c[e+12>>2];c[B+64+16>>2]=c[e+16>>2];c[B+64+16+4>>2]=c[e+16+4>>2];c[B+64+16+8>>2]=c[e+16+8>>2];c[B+64+16+12>>2]=c[e+16+12>>2];c[B+64+32>>2]=c[e+32>>2];c[B+64+32+4>>2]=c[e+32+4>>2];c[B+64+32+8>>2]=c[e+32+8>>2];c[B+64+32+12>>2]=c[e+32+12>>2];c[B+64+48>>2]=c[e+48>>2];c[B+64+48+4>>2]=c[e+48+4>>2];c[B+64+48+8>>2]=c[e+48+8>>2];c[B+64+48+12>>2]=c[e+48+12>>2];i=+g[B+64+52>>2]-+g[B+128+52>>2];G=+g[B+64+56>>2]-+g[B+128+56>>2];g[B+16>>2]=+g[B+64+48>>2]-+g[B+128+48>>2];g[B+16+4>>2]=i;g[B+16+8>>2]=G;g[B+16+12>>2]=0.0;If(B+128|0,B+64|0,B+208|0,B+192|0);G=+g[B+192>>2];i=G*+g[B+208+4>>2];D=G*+g[B+208+8>>2];g[B>>2]=+g[B+208>>2]*G;g[B+4>>2]=i;g[B+8>>2]=D;g[B+12>>2]=0.0;c[B+208+48>>2]=0;c[B+208+48+4>>2]=0;c[B+208+48+8>>2]=0;c[B+208+48+12>>2]=0;yh(B+128|0,B+192|0);D=+g[B+192>>2];i=+g[B+192+4>>2];G=+g[B+192+8>>2];E=+g[B+192+12>>2];C=D*(2.0/(D*D+i*i+G*G+E*E));j=i*(2.0/(D*D+i*i+G*G+E*E));F=G*(2.0/(D*D+i*i+G*G+E*E));g[B+208>>2]=1.0-(i*j+G*F);g[B+208+4>>2]=D*j-E*F;g[B+208+8>>2]=D*F+E*j;g[B+208+12>>2]=0.0;g[B+208+16>>2]=D*j+E*F;g[B+208+20>>2]=1.0-(D*C+G*F);g[B+208+24>>2]=i*F-E*C;g[B+208+28>>2]=0.0;g[B+208+32>>2]=D*F-E*j;g[B+208+36>>2]=i*F+E*C;g[B+208+40>>2]=1.0-(D*C+i*j);g[B+208+44>>2]=0.0;kh(b,B+208|0,B+16|0,B,B+48|0,B+32|0);if((c[a+328>>2]|0)<=0){l=B;return}k=0;do{m=c[(c[a+336>>2]|0)+(k<<2)>>2]|0;if(zb[c[(c[f>>2]|0)+8>>2]&31](f,c[m+188>>2]|0)|0?(z=c[m+192>>2]|0,Vb[c[(c[z>>2]|0)+8>>2]&127](z,m+4|0,B+192|0,B+16|0),n=+g[B+192>>2]+ +g[B+48>>2],o=+g[B+192+4>>2]+ +g[B+48+4>>2],p=+g[B+192+8>>2]+ +g[B+48+8>>2],g[B+192>>2]=n,g[B+192+4>>2]=o,g[B+192+8>>2]=p,g[B+192+12>>2]=0.0,q=+g[B+16>>2]+ +g[B+32>>2],r=+g[B+16+4>>2]+ +g[B+32+4>>2],s=+g[B+16+8>>2]+ +g[B+32+8>>2],g[B+16>>2]=q,g[B+16+4>>2]=r,g[B+16+8>>2]=s,g[B+16+12>>2]=0.0,t=+g[d+48>>2]-(q+n)*.5,u=+g[d+52>>2]-(r+o)*.5,v=+g[d+56>>2]-(s+p)*.5,w=+g[e+48>>2]-(q+n)*.5,x=+g[e+52>>2]-(r+o)*.5,y=+g[e+56>>2]-(s+p)*.5,z=t<-((q-n)*.5)|(t>(q-n)*.5?8:0)|(u<-((r-o)*.5)?2:0)|(u>(r-o)*.5?16:0)|(v<-((s-p)*.5)?4:0)|(v>(s-p)*.5?32:0),A=w<-((q-n)*.5)|(w>(q-n)*.5?8:0)|(x<-((r-o)*.5)?2:0)|(x>(r-o)*.5?16:0)|(y<-((s-p)*.5)?4:0)|(y>(s-p)*.5?32:0),(z&A|0)==0):0){if(t<-((q-n)*.5))if(!((-t-(q-n)*.5)/(w-t)>=0.0)){i=0.0;j=1.0}else{i=(-t-(q-n)*.5)/(w-t);j=1.0}else if(w<-((q-n)*.5)?(-t-(q-n)*.5)/(w-t)<1.0:0){i=0.0;j=(-t-(q-n)*.5)/(w-t)}else{i=0.0;j=1.0}if(u<-((r-o)*.5)){if(i<=(-u-(r-o)*.5)/(x-u))i=(-u-(r-o)*.5)/(x-u)}else if(x<-((r-o)*.5)?(-u-(r-o)*.5)/(x-u)(q-n)*.5){if(i<=((q-n)*.5-t)/(w-t))i=((q-n)*.5-t)/(w-t)}else if(w>(q-n)*.5?((q-n)*.5-t)/(w-t)(r-o)*.5){if(i<=((r-o)*.5-u)/(x-u))i=((r-o)*.5-u)/(x-u)}else if(x>(r-o)*.5?((r-o)*.5-u)/(x-u)>2]|0;c[B+208>>2]=0;c[B+208+4>>2]=H;c[B+208+8>>2]=m;c[B+208+12>>2]=m+4;c[B+208+16>>2]=-1;c[B+208+20>>2]=-1;vc(b,B+128|0,B+64|0,B+208|0,f,h)}}k=k+1|0}while((k|0)<(c[a+328>>2]|0));l=B;return}function qd(b,d,e,f,h,i,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0;h=c[b+48>>2]|0;r=c[b+28>>2]|0;s=c[b+68>>2]|0;if(c[l+72>>2]&1|0){if((h|0)>0){i=c[b+136>>2]|0;f=0;q=c[b+232>>2]|0;do{m=i+(f<<2)|0;p=c[m>>2]|0;f=f+1|0;q=(P(q,1664525)|0)+1013904223|0;if(f>>>0<65537){e=q>>>16^q;if(f>>>0<257)if(f>>>0<17){e=(e>>>8^e)>>>4^(e>>>8^e);e=f>>>0<5?(f>>>0<3?(e>>>2^e)>>>1:0)^(e>>>2^e):e}else e=e>>>8^e}else e=q;e=i+(((e>>>0)%(f>>>0)|0)<<2)|0;c[m>>2]=c[e>>2];c[e>>2]=p}while((f|0)!=(h|0));c[b+232>>2]=q}if((c[l+20>>2]|0)>(d|0)){if((r|0)>0){h=c[b+116>>2]|0;f=0;p=c[b+232>>2]|0;do{i=h+(f<<2)|0;m=c[i>>2]|0;f=f+1|0;p=(P(p,1664525)|0)+1013904223|0;if(f>>>0<65537){e=p>>>16^p;if(f>>>0<257)if(f>>>0<17){e=(e>>>8^e)>>>4^(e>>>8^e);e=f>>>0<5?(f>>>0<3?(e>>>2^e)>>>1:0)^(e>>>2^e):e}else e=e>>>8^e}else e=p;q=h+(((e>>>0)%(f>>>0)|0)<<2)|0;c[i>>2]=c[q>>2];c[q>>2]=m}while((f|0)!=(r|0));c[b+232>>2]=p}if((s|0)>0){h=c[b+156>>2]|0;f=0;p=c[b+232>>2]|0;do{i=h+(f<<2)|0;m=c[i>>2]|0;f=f+1|0;p=(P(p,1664525)|0)+1013904223|0;if(f>>>0<65537){e=p>>>16^p;if(f>>>0<257)if(f>>>0<17){e=(e>>>8^e)>>>4^(e>>>8^e);e=f>>>0<5?(f>>>0<3?(e>>>2^e)>>>1:0)^(e>>>2^e):e}else e=e>>>8^e}else e=p;r=h+(((e>>>0)%(f>>>0)|0)<<2)|0;c[i>>2]=c[r>>2];c[r>>2]=m}while((f|0)!=(s|0));c[b+232>>2]=p}}}e=c[b+48>>2]|0;if((e|0)>0){i=0;n=0.0;do{f=c[(c[b+136>>2]|0)+(i<<2)>>2]|0;h=c[b+56>>2]|0;if((c[h+(f*152|0)+136>>2]|0)>(d|0)){e=c[b+16>>2]|0;o=+qb[c[b+212>>2]&31](e+((c[h+(f*152|0)+144>>2]|0)*244|0)|0,e+((c[h+(f*152|0)+148>>2]|0)*244|0)|0,h+(f*152|0)|0);n=n+o*o;e=c[b+48>>2]|0}i=i+1|0}while((i|0)<(e|0))}else n=0.0;if((c[l+20>>2]|0)<=(d|0)){o=n;return +o}if((k|0)>0){e=0;do{f=j+(e<<2)|0;h=c[f>>2]|0;if(a[h+20>>0]|0){r=Rj(b,c[h+28>>2]|0,+g[l+12>>2])|0;d=Rj(b,c[(c[f>>2]|0)+32>>2]|0,+g[l+12>>2])|0;s=c[b+16>>2]|0;q=c[f>>2]|0;Tb[c[(c[q>>2]|0)+24>>2]&15](q,s+(r*244|0)|0,s+(d*244|0)|0,+g[l+12>>2])}e=e+1|0}while((e|0)!=(k|0))}m=c[l+72>>2]|0;p=c[b+28>>2]|0;if(!(m&512)){if((p|0)>0){e=0;do{l=c[(c[b+116>>2]|0)+(e<<2)>>2]|0;u=c[b+36>>2]|0;t=c[b+16>>2]|0;o=+qb[c[b+216>>2]&31](t+((c[u+(l*152|0)+144>>2]|0)*244|0)|0,t+((c[u+(l*152|0)+148>>2]|0)*244|0)|0,u+(l*152|0)|0);n=n+o*o;e=e+1|0}while((e|0)!=(p|0))}i=c[b+68>>2]|0;if((i|0)>0){h=0;do{e=c[(c[b+156>>2]|0)+(h<<2)>>2]|0;f=c[b+76>>2]|0;o=+g[(c[b+36>>2]|0)+((c[f+(e*152|0)+140>>2]|0)*152|0)+100>>2];if(o>0.0){o=o*+g[f+(e*152|0)+104>>2];g[f+(e*152|0)+120>>2]=-o;g[f+(e*152|0)+124>>2]=o;l=c[b+16>>2]|0;o=+qb[c[b+212>>2]&31](l+((c[f+(e*152|0)+144>>2]|0)*244|0)|0,l+((c[f+(e*152|0)+148>>2]|0)*244|0)|0,f+(e*152|0)|0);n=n+o*o}h=h+1|0}while((h|0)!=(i|0))}}else if((p|0)>0){i=0;do{h=c[(c[b+116>>2]|0)+(i<<2)>>2]|0;e=c[b+36>>2]|0;f=c[b+16>>2]|0;o=+qb[c[b+216>>2]&31](f+((c[e+(h*152|0)+144>>2]|0)*244|0)|0,f+((c[e+(h*152|0)+148>>2]|0)*244|0)|0,e+(h*152|0)|0);n=n+o*o;o=+g[e+(h*152|0)+100>>2];h=P(i,(m>>>4&1)+1|0)|0;e=c[(c[b+156>>2]|0)+(h<<2)>>2]|0;f=c[b+76>>2]|0;if(o>0.0){v=o*+g[f+(e*152|0)+104>>2];g[f+(e*152|0)+120>>2]=-v;g[f+(e*152|0)+124>>2]=v;k=c[b+16>>2]|0;v=+qb[c[b+212>>2]&31](k+((c[f+(e*152|0)+144>>2]|0)*244|0)|0,k+((c[f+(e*152|0)+148>>2]|0)*244|0)|0,f+(e*152|0)|0);n=n+v*v}if((c[l+72>>2]&16|0)!=0?(t=c[(c[b+156>>2]|0)+(h+1<<2)>>2]|0,u=c[b+76>>2]|0,o>0.0):0){v=o*+g[u+(t*152|0)+104>>2];g[u+(t*152|0)+120>>2]=-v;g[u+(t*152|0)+124>>2]=v;k=c[b+16>>2]|0;v=+qb[c[b+212>>2]&31](k+((c[u+(t*152|0)+144>>2]|0)*244|0)|0,k+((c[u+(t*152|0)+148>>2]|0)*244|0)|0,u+(t*152|0)|0);n=n+v*v}i=i+1|0}while((i|0)!=(p|0))}h=c[b+88>>2]|0;if((h|0)<=0){v=n;return +v}f=0;do{e=c[b+96>>2]|0;o=+g[(c[b+36>>2]|0)+((c[e+(f*152|0)+140>>2]|0)*152|0)+100>>2];if(o>0.0){v=+g[e+(f*152|0)+104>>2];v=o*v>v?v:o*v;g[e+(f*152|0)+120>>2]=-v;g[e+(f*152|0)+124>>2]=v;l=c[b+16>>2]|0;v=+qb[c[b+212>>2]&31](l+((c[e+(f*152|0)+144>>2]|0)*244|0)|0,l+((c[e+(f*152|0)+148>>2]|0)*244|0)|0,e+(f*152|0)|0);n=n+v*v}f=f+1|0}while((f|0)!=(h|0));return +n}function rd(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;c[b>>2]=3356;d=c[b+192>>2]|0;if(d|0)Ib[c[(c[d>>2]|0)+4>>2]&511](d);if((c[b+1112>>2]|0)>0)do{g=c[c[b+1120>>2]>>2]|0;d=c[g+348>>2]|0;if(d|0){Ag(b+1068|0,d)|0;e=c[b+1072>>2]|0;if(e|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+1072>>2]=d;c[b+1080>>2]=(c[b+1080>>2]|0)+-1}d=c[g+52>>2]|0;if(d|0){if(a[g+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[g+52>>2]=0}a[g+56>>0]=1;c[g+52>>2]=0;c[g+44>>2]=0;c[g+48>>2]=0;d=c[g+32>>2]|0;if(d|0){if(a[g+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[g+32>>2]=0}a[g+36>>0]=1;c[g+32>>2]=0;c[g+24>>2]=0;c[g+28>>2]=0;d=c[g+12>>2]|0;if(d|0){if(a[g+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[g+12>>2]=0}a[g+16>>0]=1;c[g+12>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);d=c[b+1112>>2]|0;a:do if((d|0)>0){f=c[b+1120>>2]|0;e=0;while(1){if((c[f+(e<<2)>>2]|0)==(g|0))break a;e=e+1|0;if((e|0)>=(d|0)){e=d;break}}}else e=d;while(0);if((d|0)>(e|0)){h=c[b+1120>>2]|0;f=h+(e<<2)|0;g=c[f>>2]|0;c[f>>2]=c[h+(d+-1<<2)>>2];c[(c[b+1120>>2]|0)+(d+-1<<2)>>2]=g;c[b+1112>>2]=d+-1;d=d+-1|0}}while((d|0)>0);d=c[b+932>>2]|0;if((d|0)>0){f=0;do{e=c[(c[b+940>>2]|0)+(f<<2)>>2]|0;if(e){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[b+932>>2]|0}f=f+1|0}while((f|0)<(d|0))}d=c[b+912>>2]|0;if((d|0)>0){f=0;do{e=c[(c[b+920>>2]|0)+(f<<2)>>2]|0;if(e){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[b+912>>2]|0}f=f+1|0}while((f|0)<(d|0))}d=c[b+1244>>2]|0;if(d|0){if(a[b+1248>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+1244>>2]=0}a[b+1248>>0]=1;c[b+1244>>2]=0;c[b+1236>>2]=0;c[b+1240>>2]=0;d=c[b+1140>>2]|0;if(d|0){if(a[b+1144>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+1140>>2]=0}a[b+1144>>0]=1;c[b+1140>>2]=0;c[b+1132>>2]=0;c[b+1136>>2]=0;d=c[b+1120>>2]|0;if(d|0){if(a[b+1124>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+1120>>2]=0}a[b+1124>>0]=1;c[b+1120>>2]=0;c[b+1112>>2]=0;c[b+1116>>2]=0;Bl(b+1068|0);Bl(b+1028|0);Bl(b+988|0);d=c[b+940>>2]|0;if(d|0){if(a[b+944>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+940>>2]=0}a[b+944>>0]=1;c[b+940>>2]=0;c[b+932>>2]=0;c[b+936>>2]=0;d=c[b+920>>2]|0;if(d|0){if(a[b+924>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+920>>2]=0}a[b+924>>0]=1;c[b+920>>2]=0;c[b+912>>2]=0;c[b+916>>2]=0;d=c[b+900>>2]|0;if(d|0){if(a[b+904>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+900>>2]=0}a[b+904>>0]=1;c[b+900>>2]=0;c[b+892>>2]=0;c[b+896>>2]=0;d=c[b+880>>2]|0;if(d|0){if(a[b+884>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+880>>2]=0}a[b+884>>0]=1;c[b+880>>2]=0;c[b+872>>2]=0;c[b+876>>2]=0;d=c[b+860>>2]|0;if(d|0){if(a[b+864>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+860>>2]=0}a[b+864>>0]=1;c[b+860>>2]=0;c[b+852>>2]=0;c[b+856>>2]=0;d=c[b+840>>2]|0;if(d|0){if(a[b+844>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+840>>2]=0}a[b+844>>0]=1;c[b+840>>2]=0;c[b+832>>2]=0;c[b+836>>2]=0;d=c[b+820>>2]|0;if(d|0){if(a[b+824>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+820>>2]=0}a[b+824>>0]=1;c[b+820>>2]=0;c[b+812>>2]=0;c[b+816>>2]=0;d=c[b+800>>2]|0;if(d|0){if(a[b+804>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+800>>2]=0}a[b+804>>0]=1;c[b+800>>2]=0;c[b+792>>2]=0;c[b+796>>2]=0;d=c[b+780>>2]|0;if(d|0){if(a[b+784>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+780>>2]=0}a[b+784>>0]=1;c[b+780>>2]=0;c[b+772>>2]=0;c[b+776>>2]=0;d=c[b+760>>2]|0;if(d|0){if(a[b+764>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+760>>2]=0}a[b+764>>0]=1;c[b+760>>2]=0;c[b+752>>2]=0;c[b+756>>2]=0;d=c[b+572>>2]|0;if(d|0){if(a[b+576>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+572>>2]=0}a[b+576>>0]=1;c[b+572>>2]=0;c[b+564>>2]=0;c[b+568>>2]=0;d=c[b+552>>2]|0;if(d|0){if(a[b+556>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+552>>2]=0}a[b+556>>0]=1;c[b+552>>2]=0;c[b+544>>2]=0;c[b+548>>2]=0;Ju(b+348|0);d=c[b+336>>2]|0;if(d|0){if(a[b+340>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+336>>2]=0}a[b+340>>0]=1;c[b+336>>2]=0;c[b+328>>2]=0;c[b+332>>2]=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(!d){a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;h=b+292|0;c[h>>2]=0;return}if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;h=b+292|0;c[h>>2]=0;return}function sd(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,h=0.0,i=0,j=0.0,k=0.0,m=0.0,n=0,o=0,p=0.0,q=0.0,r=0.0;n=l;l=l+16|0;i=c[a+372>>2]|0;a:do switch(c[i+32>>2]|0){case 1:{b=0;d=1;while(1){c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;g[n+(b<<2)>>2]=1.0;o=i+32|0;g[i+16+(d<<2)>>2]=0.0;d=(c[a+364>>2]|0)+-1|0;c[a+364>>2]=d;c[i+(c[o>>2]<<2)>>2]=c[a+348+(d<<2)>>2];d=c[o>>2]|0;c[o>>2]=d+1;e=+g[n>>2];f=+g[n+4>>2];h=+g[n+8>>2];Fh(a,e,f,h,c[i+(d<<2)>>2]|0);if(sd(a)|0)break;i=c[a+372>>2]|0;o=(c[i+32>>2]|0)+-1|0;c[i+32>>2]=o;o=c[i+(o<<2)>>2]|0;i=c[a+364>>2]|0;c[a+364>>2]=i+1;c[a+348+(i<<2)>>2]=o;i=c[a+372>>2]|0;g[i+16+(c[i+32>>2]<<2)>>2]=0.0;o=(c[a+364>>2]|0)+-1|0;c[a+364>>2]=o;c[i+(c[i+32>>2]<<2)>>2]=c[a+348+(o<<2)>>2];o=c[i+32>>2]|0;c[i+32>>2]=o+1;Fh(a,-e,-f,-h,c[i+(o<<2)>>2]|0);if(sd(a)|0)break;o=c[a+372>>2]|0;i=(c[o+32>>2]|0)+-1|0;c[o+32>>2]=i;i=c[o+(i<<2)>>2]|0;o=c[a+364>>2]|0;c[a+364>>2]=o+1;c[a+348+(o<<2)>>2]=i;b=b+1|0;if(b>>>0>=3)break a;d=c[a+372>>2]|0;i=d;d=c[d+32>>2]|0}o=1;l=n;return o|0}case 2:{o=c[i+4>>2]|0;b=c[i>>2]|0;e=+g[o+16>>2]-+g[b+16>>2];f=+g[o+20>>2]-+g[b+20>>2];h=+g[o+24>>2]-+g[b+24>>2];b=0;while(1){c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;g[n+(b<<2)>>2]=1.0;j=+g[n+8>>2];k=+g[n+4>>2];m=+g[n>>2];if((f*j-h*k)*(f*j-h*k)+(h*m-e*j)*(h*m-e*j)+(e*k-f*m)*(e*k-f*m)>0.0){i=c[a+372>>2]|0;g[i+16+(c[i+32>>2]<<2)>>2]=0.0;o=(c[a+364>>2]|0)+-1|0;c[a+364>>2]=o;c[i+(c[i+32>>2]<<2)>>2]=c[a+348+(o<<2)>>2];o=c[i+32>>2]|0;c[i+32>>2]=o+1;Fh(a,f*j-h*k,h*m-e*j,e*k-f*m,c[i+(o<<2)>>2]|0);if(sd(a)|0)break;i=c[a+372>>2]|0;o=(c[i+32>>2]|0)+-1|0;c[i+32>>2]=o;o=c[i+(o<<2)>>2]|0;i=c[a+364>>2]|0;c[a+364>>2]=i+1;c[a+348+(i<<2)>>2]=o;i=c[a+372>>2]|0;g[i+16+(c[i+32>>2]<<2)>>2]=0.0;o=(c[a+364>>2]|0)+-1|0;c[a+364>>2]=o;c[i+(c[i+32>>2]<<2)>>2]=c[a+348+(o<<2)>>2];o=c[i+32>>2]|0;c[i+32>>2]=o+1;Fh(a,-(f*j-h*k),-(h*m-e*j),-(e*k-f*m),c[i+(o<<2)>>2]|0);if(sd(a)|0)break;o=c[a+372>>2]|0;i=(c[o+32>>2]|0)+-1|0;c[o+32>>2]=i;i=c[o+(i<<2)>>2]|0;o=c[a+364>>2]|0;c[a+364>>2]=o+1;c[a+348+(o<<2)>>2]=i}b=b+1|0;if(b>>>0>=3)break a}o=1;l=n;return o|0}case 3:{o=c[i+4>>2]|0;d=c[i>>2]|0;j=+g[d+16>>2];e=+g[o+16>>2]-j;k=+g[d+20>>2];f=+g[o+20>>2]-k;m=+g[d+24>>2];h=+g[o+24>>2]-m;o=c[i+8>>2]|0;j=+g[o+16>>2]-j;k=+g[o+20>>2]-k;m=+g[o+24>>2]-m;if((f*m-h*k)*(f*m-h*k)+(h*j-e*m)*(h*j-e*m)+(e*k-f*j)*(e*k-f*j)>0.0){g[i+28>>2]=0.0;o=(c[a+364>>2]|0)+-1|0;c[a+364>>2]=o;c[i+12>>2]=c[a+348+(o<<2)>>2];o=c[i+32>>2]|0;c[i+32>>2]=o+1;Fh(a,f*m-h*k,h*j-e*m,e*k-f*j,c[i+(o<<2)>>2]|0);if(sd(a)|0){o=1;l=n;return o|0}i=c[a+372>>2]|0;o=(c[i+32>>2]|0)+-1|0;c[i+32>>2]=o;o=c[i+(o<<2)>>2]|0;i=c[a+364>>2]|0;c[a+364>>2]=i+1;c[a+348+(i<<2)>>2]=o;i=c[a+372>>2]|0;g[i+16+(c[i+32>>2]<<2)>>2]=0.0;o=(c[a+364>>2]|0)+-1|0;c[a+364>>2]=o;c[i+(c[i+32>>2]<<2)>>2]=c[a+348+(o<<2)>>2];o=c[i+32>>2]|0;c[i+32>>2]=o+1;Fh(a,-(f*m-h*k),-(h*j-e*m),-(e*k-f*j),c[i+(o<<2)>>2]|0);if(sd(a)|0){o=1;l=n;return o|0}else{o=c[a+372>>2]|0;i=(c[o+32>>2]|0)+-1|0;c[o+32>>2]=i;i=c[o+(i<<2)>>2]|0;o=c[a+364>>2]|0;c[a+364>>2]=o+1;c[a+348+(o<<2)>>2]=i;break a}}break}case 4:{o=c[i>>2]|0;a=c[i+12>>2]|0;m=+g[a+16>>2];r=+g[o+16>>2]-m;p=+g[a+20>>2];e=+g[o+20>>2]-p;h=+g[a+24>>2];j=+g[o+24>>2]-h;o=c[i+4>>2]|0;f=+g[o+16>>2]-m;k=+g[o+20>>2]-p;q=+g[o+24>>2]-h;o=c[i+8>>2]|0;m=+g[o+16>>2]-m;p=+g[o+20>>2]-p;h=+g[o+24>>2]-h;if(!((0.0!=0.0?1:r*k*h+(e*q*m+j*f*p-r*q*p-e*f*h)-j*k*m!=r*k*h+(e*q*m+j*f*p-r*q*p-e*f*h)-j*k*m)|r*k*h+(e*q*m+j*f*p-r*q*p-e*f*h)-j*k*m==0.0)){o=1;l=n;return o|0}break}default:{}}while(0);o=0;l=n;return o|0}function td(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,h=0,i=0,j=0,k=0.0,l=0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0,Y=0,Z=0;Z=c[d+36>>2]|0;X=c[e+36>>2]|0;L=+g[Z+8>>2];N=+g[Z+12>>2];M=+g[Z+16>>2];h=c[X+8>>2]|0;R=+g[h+8>>2];S=+g[h+12>>2];T=+g[h+16>>2];d=c[X+12>>2]|0;O=+g[d+8>>2];P=+g[d+12>>2];Q=+g[d+16>>2];e=c[X+16>>2]|0;U=+g[e+8>>2];V=+g[e+12>>2];W=+g[e+16>>2];t=O-L-(R-L);A=P-N-(S-N);v=Q-M-(T-M);u=A*(W-M-(T-M))-v*(V-N-(S-N));B=v*(U-L-(R-L))-t*(W-M-(T-M));w=t*(V-N-(S-N))-A*(U-L-(R-L));do if(w*w+(u*u+B*B)>1.1920928955078125e-07?(E=1.0/+D(+(w*w+(u*u+B*B))),F=(T-M)*w*E+((R-L)*u*E+(S-N)*B*E),F*F<3402823466385288598117041.0e14):0){f=R-L-u*E*F;k=S-N-B*E*F;n=T-M-w*E*F;p=O-L-u*E*F;r=P-N-B*E*F;s=Q-M-w*E*F;if((w*(r*f-k*p)+(u*(k*s-n*r)+B*(n*p-s*f))>0.0?(x=U-L-u*E*F,y=V-N-B*E*F,z=W-M-w*E*F,w*(y*p-r*x)+(u*(r*z-s*y)+B*(s*x-z*p))>0.0):0)?w*(k*x-y*f)+(u*(y*n-z*k)+B*(z*f-n*x))>0.0:0){q=F*F;p=u*E*F;n=w*E*F;m=B*E*F;break}if(t*t+A*A+v*v>1.1920928955078125e-07?(C=-((R-L)*t+(S-N)*A+(T-M)*v)/(t*t+A*A+v*v),C=C<0.0?0.0:C>1.0?1.0:C,q=(T-M+v*C)*(T-M+v*C)+((R-L+t*C)*(R-L+t*C)+(S-N+A*C)*(S-N+A*C)),q<3402823466385288598117041.0e14):0){p=R-L+t*C;n=T-M+v*C;k=S-N+A*C}else{q=3402823466385288598117041.0e14;p=0.0;n=0.0;k=0.0}f=(U-L-(O-L))*(U-L-(O-L))+(V-N-(P-N))*(V-N-(P-N))+(W-M-(Q-M))*(W-M-(Q-M));if(f>1.1920928955078125e-07?(H=-((O-L)*(U-L-(O-L))+(P-N)*(V-N-(P-N))+(Q-M)*(W-M-(Q-M)))/f,H=H<0.0?0.0:H>1.0?1.0:H,G=O-L+(U-L-(O-L))*H,I=P-N+(V-N-(P-N))*H,H=Q-M+(W-M-(Q-M))*H,H*H+(G*G+I*I)1.1920928955078125e-07?(K=-((U-L)*(R-L-(U-L))+(V-N)*(S-N-(V-N))+(W-M)*(T-M-(W-M)))/f,K=K<0.0?0.0:K>1.0?1.0:K,J=U-L+(R-L-(U-L))*K,m=V-N+(S-N-(V-N))*K,K=W-M+(T-M-(W-M))*K,K*K+(J*J+m*m)>2];K=N-+g[Z+28>>2];u=M-+g[Z+32>>2];u=+g[b+12>>2]+ +D(+(J*J+K*K+u*u))*2.0;if(!(q>2];V=+g[h+88>>2];W=+g[d+88>>2];f=+g[e+88>>2];f=!(V<=0.0)&!(W<=0.0)&!(f<=0.0)?V*s*(1.0/(t+s+r))+W*r*(1.0/(t+s+r))+t*(1.0/(t+s+r))*f:0.0;if(!(k+f>0.0))return;W=1.0/-+D(+q);q=p*W;p=m*W;n=n*W;o=c[b+4>>2]|0;d=c[b+8>>2]|0;l=c[(+g[o+376>>2]>+g[d+376>>2]?o+376|0:d+376|0)>>2]|0;m=k/(k+f)*+g[o+392>>2];f=f/(k+f)*+g[d+392>>2];d=c[o+892>>2]|0;if((d|0)==(c[o+896>>2]|0)?(Y=d|0?d<<1:1,(d|0)<(Y|0)):0){if(!Y)j=0;else{c[6995]=(c[6995]|0)+1;d=sc((Y*56|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}j=d;d=c[o+892>>2]|0}if((d|0)>0){e=0;do{h=j+(e*56|0)|0;b=(c[o+900>>2]|0)+(e*56|0)|0;i=h+56|0;do{c[h>>2]=c[b>>2];h=h+4|0;b=b+4|0}while((h|0)<(i|0));e=e+1|0}while((e|0)!=(d|0))}d=c[o+900>>2]|0;if(d|0){if(a[o+904>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[o+900>>2]=0}a[o+904>>0]=1;c[o+900>>2]=j;c[o+896>>2]=Y;d=c[o+892>>2]|0}Y=c[o+900>>2]|0;c[Y+(d*56|0)>>2]=Z;c[Y+(d*56|0)+4>>2]=X;g[Y+(d*56|0)+8>>2]=s*(1.0/(t+s+r));g[Y+(d*56|0)+12>>2]=r*(1.0/(t+s+r));g[Y+(d*56|0)+16>>2]=t*(1.0/(t+s+r));g[Y+(d*56|0)+20>>2]=0.0;g[Y+(d*56|0)+24>>2]=q;g[Y+(d*56|0)+28>>2]=p;g[Y+(d*56|0)+32>>2]=n;g[Y+(d*56|0)+36>>2]=0.0;g[Y+(d*56|0)+40>>2]=u;c[Y+(d*56|0)+44>>2]=l;g[Y+(d*56|0)+48>>2]=m;g[Y+(d*56|0)+52>>2]=f;c[o+892>>2]=(c[o+892>>2]|0)+1;return}function ud(d,e){d=d|0;e=e|0;var f=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+64|0;g[d+20>>2]=+h[e+32>>3];g[d+24>>2]=+h[e+40>>3];g[d+28>>2]=+h[e+48>>3];g[d+32>>2]=+h[e+56>>3];g[d+4>>2]=+h[e>>3];g[d+8>>2]=+h[e+8>>3];g[d+12>>2]=+h[e+16>>3];g[d+16>>2]=+h[e+24>>3];g[d+36>>2]=+h[e+64>>3];g[d+40>>2]=+h[e+72>>3];g[d+44>>2]=+h[e+80>>3];g[d+48>>2]=+h[e+88>>3];c[d+56>>2]=c[e+96>>2];a[d+60>>0]=(c[e+100>>2]|0)!=0&1;p=c[e+104>>2]|0;k=q;n=k+64|0;do{c[k>>2]=0;k=k+4|0}while((k|0)<(n|0));o=c[d+88>>2]|0;if((o|0)<(p|0)){if((c[d+92>>2]|0)<(p|0)){if(!p){f=0;j=o}else{c[6995]=(c[6995]|0)+1;f=sc(p<<6|19)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=c[d+88>>2]|0}if((j|0)>0){i=0;do{k=f+(i<<6)|0;m=(c[d+96>>2]|0)+(i<<6)|0;n=k+64|0;do{c[k>>2]=c[m>>2];k=k+4|0;m=m+4|0}while((k|0)<(n|0));i=i+1|0}while((i|0)!=(j|0))}i=c[d+96>>2]|0;if(i|0){if(a[d+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[d+96>>2]=0}a[d+100>>0]=1;c[d+96>>2]=f;c[d+92>>2]=p;i=d+96|0}else i=d+96|0;f=o;do{k=(c[i>>2]|0)+(f<<6)|0;m=q;n=k+64|0;do{c[k>>2]=c[m>>2];k=k+4|0;m=m+4|0}while((k|0)<(n|0));f=f+1|0}while((f|0)!=(p|0))}c[d+88>>2]=p;if((p|0)>0){j=c[d+96>>2]|0;f=c[e+112>>2]|0;i=0;while(1){g[j+(i<<6)+16>>2]=+h[f+32>>3];g[j+(i<<6)+20>>2]=+h[f+40>>3];g[j+(i<<6)+24>>2]=+h[f+48>>3];g[j+(i<<6)+28>>2]=+h[f+56>>3];g[j+(i<<6)>>2]=+h[f>>3];g[j+(i<<6)+4>>2]=+h[f+8>>3];g[j+(i<<6)+8>>2]=+h[f+16>>3];g[j+(i<<6)+12>>2]=+h[f+24>>3];c[j+(i<<6)+32>>2]=c[f+64>>2];c[j+(i<<6)+36>>2]=c[f+68>>2];c[j+(i<<6)+40>>2]=c[f+72>>2];i=i+1|0;if((i|0)==(p|0))break;else f=f+80|0}}m=c[e+108>>2]|0;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;k=c[d+128>>2]|0;if((k|0)<(m|0)){if((c[d+132>>2]|0)<(m|0)){if(!m){f=0;j=k}else{c[6995]=(c[6995]|0)+1;f=sc((m<<4|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=c[d+128>>2]|0}if((j|0)>0){i=0;do{p=f+(i<<4)|0;o=(c[d+136>>2]|0)+(i<<4)|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];i=i+1|0}while((i|0)!=(j|0))}i=c[d+136>>2]|0;if(i|0){if(a[d+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[d+136>>2]=0}a[d+140>>0]=1;c[d+136>>2]=f;c[d+132>>2]=m;i=d+136|0}else i=d+136|0;f=k;do{p=(c[i>>2]|0)+(f<<4)|0;c[p>>2]=c[q>>2];c[p+4>>2]=c[q+4>>2];c[p+8>>2]=c[q+8>>2];c[p+12>>2]=c[q+12>>2];f=f+1|0}while((f|0)!=(m|0))}c[d+128>>2]=m;if((m|0)>0){j=c[d+136>>2]|0;f=0;i=c[e+116>>2]|0;while(1){c[j+(f<<4)+12>>2]=c[i+12>>2];b[j+(f<<4)+6>>1]=b[i+6>>1]|0;b[j+(f<<4)+8>>1]=b[i+8>>1]|0;b[j+(f<<4)+10>>1]=b[i+10>>1]|0;b[j+(f<<4)>>1]=b[i>>1]|0;b[j+(f<<4)+2>>1]=b[i+2>>1]|0;b[j+(f<<4)+4>>1]=b[i+4>>1]|0;f=f+1|0;if((f|0)==(m|0))break;else i=i+16|0}}c[d+144>>2]=c[e+120>>2];m=c[e+124>>2]|0;k=c[d+152>>2]|0;if((k|0)<(m|0)){if((c[d+156>>2]|0)<(m|0)){if(!m){f=0;j=k}else{c[6995]=(c[6995]|0)+1;f=sc(m<<5|19)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=c[d+152>>2]|0}if((j|0)>0){i=0;do{p=f+(i<<5)|0;o=(c[d+160>>2]|0)+(i<<5)|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];c[p+16>>2]=c[o+16>>2];c[p+20>>2]=c[o+20>>2];c[p+24>>2]=c[o+24>>2];c[p+28>>2]=c[o+28>>2];i=i+1|0}while((i|0)!=(j|0))}i=c[d+160>>2]|0;if(i|0){if(a[d+164>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[d+160>>2]=0}a[d+164>>0]=1;c[d+160>>2]=f;c[d+156>>2]=m;i=d+160|0}else i=d+160|0;f=k;do{p=(c[i>>2]|0)+(f<<5)|0;c[p>>2]=c[q>>2];c[p+4>>2]=c[q+4>>2];c[p+8>>2]=c[q+8>>2];c[p+12>>2]=c[q+12>>2];c[p+16>>2]=c[q+16>>2];c[p+20>>2]=c[q+20>>2];c[p+24>>2]=c[q+24>>2];c[p+28>>2]=c[q+28>>2];f=f+1|0}while((f|0)!=(m|0))}c[d+152>>2]=m;if((m|0)<=0){l=q;return}j=c[d+160>>2]|0;i=0;f=c[e+128>>2]|0;while(1){b[j+(i<<5)+6>>1]=b[f+14>>1]|0;b[j+(i<<5)+8>>1]=b[f+16>>1]|0;b[j+(i<<5)+10>>1]=b[f+18>>1]|0;b[j+(i<<5)>>1]=b[f+8>>1]|0;b[j+(i<<5)+2>>1]=b[f+10>>1]|0;b[j+(i<<5)+4>>1]=b[f+12>>1]|0;c[j+(i<<5)+12>>2]=c[f>>2];c[j+(i<<5)+16>>2]=c[f+4>>2];i=i+1|0;if((i|0)==(m|0))break;else f=f+20|0}l=q;return}function vd(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+64|0;c[d+20>>2]=c[e+16>>2];c[d+24>>2]=c[e+20>>2];c[d+28>>2]=c[e+24>>2];c[d+32>>2]=c[e+28>>2];c[d+4>>2]=c[e>>2];c[d+8>>2]=c[e+4>>2];c[d+12>>2]=c[e+8>>2];c[d+16>>2]=c[e+12>>2];c[d+36>>2]=c[e+32>>2];c[d+40>>2]=c[e+36>>2];c[d+44>>2]=c[e+40>>2];c[d+48>>2]=c[e+44>>2];c[d+56>>2]=c[e+48>>2];a[d+60>>0]=(c[e+52>>2]|0)!=0&1;n=c[e+56>>2]|0;i=o;k=i+64|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(k|0));m=c[d+88>>2]|0;if((m|0)<(n|0)){if((c[d+92>>2]|0)<(n|0)){if(!n){f=0;h=m}else{c[6995]=(c[6995]|0)+1;f=sc(n<<6|19)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[d+88>>2]|0}if((h|0)>0){g=0;do{i=f+(g<<6)|0;j=(c[d+96>>2]|0)+(g<<6)|0;k=i+64|0;do{c[i>>2]=c[j>>2];i=i+4|0;j=j+4|0}while((i|0)<(k|0));g=g+1|0}while((g|0)!=(h|0))}g=c[d+96>>2]|0;if(g|0){if(a[d+100>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0)}c[d+96>>2]=0}a[d+100>>0]=1;c[d+96>>2]=f;c[d+92>>2]=n;g=d+96|0}else g=d+96|0;f=m;do{i=(c[g>>2]|0)+(f<<6)|0;j=o;k=i+64|0;do{c[i>>2]=c[j>>2];i=i+4|0;j=j+4|0}while((i|0)<(k|0));f=f+1|0}while((f|0)!=(n|0))}c[d+88>>2]=n;if((n|0)>0){h=c[d+96>>2]|0;f=c[e+64>>2]|0;g=0;while(1){c[h+(g<<6)+16>>2]=c[f+16>>2];c[h+(g<<6)+20>>2]=c[f+20>>2];c[h+(g<<6)+24>>2]=c[f+24>>2];c[h+(g<<6)+28>>2]=c[f+28>>2];c[h+(g<<6)>>2]=c[f>>2];c[h+(g<<6)+4>>2]=c[f+4>>2];c[h+(g<<6)+8>>2]=c[f+8>>2];c[h+(g<<6)+12>>2]=c[f+12>>2];c[h+(g<<6)+32>>2]=c[f+32>>2];c[h+(g<<6)+36>>2]=c[f+36>>2];c[h+(g<<6)+40>>2]=c[f+40>>2];g=g+1|0;if((g|0)==(n|0))break;else f=f+48|0}}j=c[e+60>>2]|0;c[o>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;i=c[d+128>>2]|0;if((i|0)<(j|0)){if((c[d+132>>2]|0)<(j|0)){if(!j){f=0;h=i}else{c[6995]=(c[6995]|0)+1;f=sc((j<<4|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[d+128>>2]|0}if((h|0)>0){g=0;do{n=f+(g<<4)|0;m=(c[d+136>>2]|0)+(g<<4)|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];c[n+8>>2]=c[m+8>>2];c[n+12>>2]=c[m+12>>2];g=g+1|0}while((g|0)!=(h|0))}g=c[d+136>>2]|0;if(g|0){if(a[d+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0)}c[d+136>>2]=0}a[d+140>>0]=1;c[d+136>>2]=f;c[d+132>>2]=j;g=d+136|0}else g=d+136|0;f=i;do{n=(c[g>>2]|0)+(f<<4)|0;c[n>>2]=c[o>>2];c[n+4>>2]=c[o+4>>2];c[n+8>>2]=c[o+8>>2];c[n+12>>2]=c[o+12>>2];f=f+1|0}while((f|0)!=(j|0))}c[d+128>>2]=j;if((j|0)>0){h=c[d+136>>2]|0;f=0;g=c[e+68>>2]|0;while(1){c[h+(f<<4)+12>>2]=c[g+12>>2];b[h+(f<<4)+6>>1]=b[g+6>>1]|0;b[h+(f<<4)+8>>1]=b[g+8>>1]|0;b[h+(f<<4)+10>>1]=b[g+10>>1]|0;b[h+(f<<4)>>1]=b[g>>1]|0;b[h+(f<<4)+2>>1]=b[g+2>>1]|0;b[h+(f<<4)+4>>1]=b[g+4>>1]|0;f=f+1|0;if((f|0)==(j|0))break;else g=g+16|0}}c[d+144>>2]=c[e+76>>2];j=c[e+80>>2]|0;i=c[d+152>>2]|0;if((i|0)<(j|0)){if((c[d+156>>2]|0)<(j|0)){if(!j){f=0;h=i}else{c[6995]=(c[6995]|0)+1;f=sc(j<<5|19)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[d+152>>2]|0}if((h|0)>0){g=0;do{n=f+(g<<5)|0;m=(c[d+160>>2]|0)+(g<<5)|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];c[n+8>>2]=c[m+8>>2];c[n+12>>2]=c[m+12>>2];c[n+16>>2]=c[m+16>>2];c[n+20>>2]=c[m+20>>2];c[n+24>>2]=c[m+24>>2];c[n+28>>2]=c[m+28>>2];g=g+1|0}while((g|0)!=(h|0))}g=c[d+160>>2]|0;if(g|0){if(a[d+164>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0)}c[d+160>>2]=0}a[d+164>>0]=1;c[d+160>>2]=f;c[d+156>>2]=j;g=d+160|0}else g=d+160|0;f=i;do{n=(c[g>>2]|0)+(f<<5)|0;c[n>>2]=c[o>>2];c[n+4>>2]=c[o+4>>2];c[n+8>>2]=c[o+8>>2];c[n+12>>2]=c[o+12>>2];c[n+16>>2]=c[o+16>>2];c[n+20>>2]=c[o+20>>2];c[n+24>>2]=c[o+24>>2];c[n+28>>2]=c[o+28>>2];f=f+1|0}while((f|0)!=(j|0))}c[d+152>>2]=j;if((j|0)<=0){l=o;return}h=c[d+160>>2]|0;g=0;f=c[e+72>>2]|0;while(1){b[h+(g<<5)+6>>1]=b[f+14>>1]|0;b[h+(g<<5)+8>>1]=b[f+16>>1]|0;b[h+(g<<5)+10>>1]=b[f+18>>1]|0;b[h+(g<<5)>>1]=b[f+8>>1]|0;b[h+(g<<5)+2>>1]=b[f+10>>1]|0;b[h+(g<<5)+4>>1]=b[f+12>>1]|0;c[h+(g<<5)+12>>2]=c[f>>2];c[h+(g<<5)+16>>2]=c[f+4>>2];g=g+1|0;if((g|0)==(j|0))break;else f=f+20|0}l=o;return} +function nc(b,d){b=b|0;d=+d;var e=0,f=0,h=0,i=0.0,k=0.0,m=0.0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0.0,P=0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0,W=0,X=0,Y=0.0,Z=0.0,_=0.0,$=0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0,fa=0,ga=0,ha=0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0.0,oa=0.0,pa=0.0,qa=0.0,ra=0.0;ea=l;l=l+240|0;e=c[b+24>>2]|0;if((e|0)<=0){l=ea;return}K=ea+128+76|0;L=ea+80+16|0;P=ea+80+32|0;J=0;do{I=c[(c[b+32>>2]|0)+(J<<2)>>2]|0;switch(c[I+220>>2]|0){case 2:case 5:break;default:{if(a[I+984>>0]|0){a[I+984>>0]=0;f=c[I+792>>2]|0;if((f|0)>0){h=c[I+800>>2]|0;e=0;do{x=c[h+(e*52|0)+24>>2]|0;H=c[h+(e*52|0)+28>>2]|0;E=+g[x+8>>2]-+g[H+8>>2];F=+g[x+12>>2]-+g[H+12>>2];G=+g[x+16>>2]-+g[H+16>>2];G=+D(+(E*E+F*F+G*G));g[h+(e*52|0)+32>>2]=G;g[h+(e*52|0)+44>>2]=G*G;e=e+1|0}while((e|0)!=(f|0));e=0;do{g[h+(e*52|0)+40>>2]=(+g[(c[h+(e*52|0)+24>>2]|0)+88>>2]+ +g[(c[h+(e*52|0)+28>>2]|0)+88>>2])/+g[(c[h+(e*52|0)+4>>2]|0)+4>>2];e=e+1|0}while((e|0)!=(f|0))}Vf(I);Dl(I+1028|0);if(c[I+448>>2]&16|0)$g(I)}m=+g[I+428>>2]*d;g[I+512>>2]=m;g[I+516>>2]=1.0/m;g[I+520>>2]=m*3.0;x=c[I+192>>2]|0;m=+nb[c[(c[x>>2]|0)+48>>2]&15](x);g[I+524>>2]=m;g[I+528>>2]=m*.25;x=c[I+744>>2]|0;m=+g[I+512>>2];i=+g[x+40>>2]*m;k=m*+g[x+44>>2];m=m*+g[x+48>>2];H=c[I+772>>2]|0;if((H|0)>0){f=c[I+780>>2]|0;e=0;do{if(+g[f+(e*104|0)+88>>2]>0.0){n=f+(e*104|0)+40|0;g[n>>2]=i+ +g[n>>2];n=f+(e*104|0)+44|0;g[n>>2]=k+ +g[n>>2];n=f+(e*104|0)+48|0;g[n>>2]=m+ +g[n>>2]}e=e+1|0}while((e|0)!=(H|0))}F=+g[I+368>>2];G=+g[I+372>>2];n=+g[I+364>>2]>0.0?1:+g[I+360>>2]>0.0;if(F!=0.0|G>0.0){if((H|0)>0){f=c[I+780>>2]|0;k=+g[f+8>>2];m=+g[f+12>>2];o=+g[f+16>>2];f=c[I+812>>2]|0;if((f|0)>0){h=c[I+820>>2]|0;e=0;i=0.0;do{fa=c[h+(e*44|0)+8>>2]|0;ga=c[h+(e*44|0)+12>>2]|0;B=+g[ga+8>>2]-k;w=+g[ga+12>>2]-m;z=+g[ga+16>>2]-o;ga=c[h+(e*44|0)+16>>2]|0;A=+g[ga+8>>2]-k;y=+g[ga+12>>2]-m;E=+g[ga+16>>2]-o;i=i+((+g[fa+16>>2]-o)*(B*y-w*A)+((+g[fa+8>>2]-k)*(w*E-z*y)+(+g[fa+12>>2]-m)*(z*A-B*E)));e=e+1|0}while((e|0)!=(f|0))}else i=0.0;i=i/6.0}else i=0.0;E=F*(1.0/+C(+i));B=G*(+g[I+536>>2]-i)}else{B=0.0;E=0.0}a:do if((H|0)>0){if(!n){f=c[I+780>>2]|0;e=0;while(1){if(+g[f+(e*104|0)+88>>2]>0.0){if(F!=0.0){y=E*+g[f+(e*104|0)+92>>2];z=y*+g[f+(e*104|0)+76>>2];A=y*+g[f+(e*104|0)+80>>2];ga=f+(e*104|0)+56|0;g[ga>>2]=+g[f+(e*104|0)+72>>2]*y+ +g[ga>>2];ga=f+(e*104|0)+60|0;g[ga>>2]=z+ +g[ga>>2];ga=f+(e*104|0)+64|0;g[ga>>2]=A+ +g[ga>>2]}if(G>0.0){y=B*+g[f+(e*104|0)+92>>2];z=y*+g[f+(e*104|0)+76>>2];A=y*+g[f+(e*104|0)+80>>2];ga=f+(e*104|0)+56|0;g[ga>>2]=+g[f+(e*104|0)+72>>2]*y+ +g[ga>>2];ga=f+(e*104|0)+60|0;g[ga>>2]=z+ +g[ga>>2];ga=f+(e*104|0)+64|0;g[ga>>2]=A+ +g[ga>>2]}}e=e+1|0;if((e|0)==(H|0))break a}}f=c[I+780>>2]|0;e=0;do{w=+g[f+(e*104|0)+88>>2];if(w>0.0){y=+g[I+512>>2];u=+g[I+364>>2];s=+g[I+360>>2];b:do if((u>0.0|s>0.0?(M=c[x>>2]|0,(c[I+348>>2]|0)<4):0)?(N=+g[f+(e*104|0)+40>>2],O=N-+g[I+1212>>2],Q=+g[f+(e*104|0)+44>>2],R=Q-+g[I+1216>>2],S=+g[f+(e*104|0)+48>>2],T=S-+g[I+1220>>2],U=+D(+(O*O+R*R+T*T)),O*O+R*R+T*T>1.1920928955078125e-07):0){v=O*(1.0/U);z=R*(1.0/U);A=T*(1.0/U);k=+g[f+(e*104|0)+72>>2];o=+g[f+(e*104|0)+76>>2];p=+g[f+(e*104|0)+80>>2];switch(c[I+348>>2]|0){case 2:{r=O*k+R*o+T*p<0.0?-1.0:1.0;i=A*p*r+(v*k*r+z*o*r);m=+g[f+(e*104|0)+92>>2]*.5;q=(c[j>>2]=M,+g[j>>2]);t=i*s*.5*q*(O*O+R*R+T*T)*m;if(i>0.0&i<.9847999811172485){u=u*.5*q*U*m*+D(+(1.0-i*i));q=(A*(v*p*r-A*k*r)-z*(z*k*r-v*o*r))*u;s=(v*(z*k*r-v*o*r)-A*(A*o*r-z*p*r))*u;o=(z*(A*o*r-z*p*r)-v*(v*p*r-A*k*r))*u}else{q=0.0;s=0.0;o=0.0}i=y*w*-(A*t)*y*w*-(A*t)+(w*-(v*t)*y*w*-(v*t)*y+y*w*-(z*t)*y*w*-(z*t));if(i>0.0?i>=N*N+Q*Q+S*S:0){i=+D(+(N*N+Q*Q+S*S))/+D(+i)*.800000011920929;m=i*-(v*t);k=i*-(A*t);i=i*-(z*t)}else{m=-(v*t);k=-(A*t);i=-(z*t)}n=f+(e*104|0)+56|0;fa=f+(e*104|0)+60|0;z=i+ +g[fa>>2];ga=f+(e*104|0)+64|0;A=k+ +g[ga>>2];g[n>>2]=q+(m+ +g[n>>2]);g[fa>>2]=s+z;g[ga>>2]=o+A;break b}case 1:{t=O*k+R*o+T*p<0.0?-1.0:1.0;k=k*t;o=o*t;p=p*t;break}case 3:case 0:break;default:break b}i=O*k+R*o+T*p;if(i>0.0){i=-((c[j>>2]=M,+g[j>>2])*(O*O+R*R+T*T)*i*+g[f+(e*104|0)+92>>2]*.5);m=v*s*i+(k*u*i+0.0);k=z*s*i+(o*u*i+0.0);i=A*s*i+(p*u*i+0.0);if(y*w*i*y*w*i+(y*w*m*y*w*m+y*w*k*y*w*k)>N*N+Q*Q+S*S){A=1.0/+D(+(i*i+(m*m+k*k)));ga=f+(e*104|0)+56|0;g[ga>>2]=+g[ga>>2]-1.0/(y*w)*m*A*(S*i*A+(N*m*A+Q*k*A));ga=f+(e*104|0)+60|0;g[ga>>2]=+g[ga>>2]-1.0/(y*w)*k*A*(S*i*A+(N*m*A+Q*k*A));ga=f+(e*104|0)+64|0;g[ga>>2]=+g[ga>>2]-1.0/(y*w)*i*A*(S*i*A+(N*m*A+Q*k*A));break}else{ga=f+(e*104|0)+56|0;g[ga>>2]=m+ +g[ga>>2];ga=f+(e*104|0)+60|0;g[ga>>2]=k+ +g[ga>>2];ga=f+(e*104|0)+64|0;g[ga>>2]=i+ +g[ga>>2];break}}}while(0);if(F!=0.0){y=E*+g[f+(e*104|0)+92>>2];z=y*+g[f+(e*104|0)+76>>2];A=y*+g[f+(e*104|0)+80>>2];ga=f+(e*104|0)+56|0;g[ga>>2]=+g[f+(e*104|0)+72>>2]*y+ +g[ga>>2];ga=f+(e*104|0)+60|0;g[ga>>2]=z+ +g[ga>>2];ga=f+(e*104|0)+64|0;g[ga>>2]=A+ +g[ga>>2]}if(G>0.0){y=B*+g[f+(e*104|0)+92>>2];z=y*+g[f+(e*104|0)+76>>2];A=y*+g[f+(e*104|0)+80>>2];ga=f+(e*104|0)+56|0;g[ga>>2]=+g[f+(e*104|0)+72>>2]*y+ +g[ga>>2];ga=f+(e*104|0)+60|0;g[ga>>2]=z+ +g[ga>>2];ga=f+(e*104|0)+64|0;g[ga>>2]=A+ +g[ga>>2]}}e=e+1|0}while((e|0)!=(H|0))}while(0);n=c[I+812>>2]|0;if((n|0)>0){h=0;do{u=+g[I+512>>2];t=+g[I+364>>2];s=+g[I+360>>2];c:do if((t>0.0|s>0.0?(V=c[I+348>>2]|0,(V|0)>3):0)?(W=c[I+820>>2]|0,X=c[W+(h*44|0)+8>>2]|0,fa=c[W+(h*44|0)+12>>2]|0,Y=+g[X+40>>2],Z=+g[X+44>>2],_=+g[X+48>>2],ga=c[W+(h*44|0)+16>>2]|0,$=c[x>>2]|0,aa=(Y+ +g[fa+40>>2]+ +g[ga+40>>2])*.3333333432674408-+g[I+1212>>2],ba=(Z+ +g[fa+44>>2]+ +g[ga+44>>2])*.3333333432674408-+g[I+1216>>2],ca=(_+ +g[fa+48>>2]+ +g[ga+48>>2])*.3333333432674408-+g[I+1220>>2],da=+D(+(aa*aa+ba*ba+ca*ca)),aa*aa+ba*ba+ca*ca>1.1920928955078125e-07):0){v=aa*(1.0/da);w=ba*(1.0/da);z=ca*(1.0/da);k=+g[W+(h*44|0)+20>>2];m=+g[W+(h*44|0)+24>>2];o=+g[W+(h*44|0)+28>>2];switch(V|0){case 5:{r=aa*k+ba*m+ca*o<0.0?-1.0:1.0;i=z*o*r+(v*k*r+w*m*r);p=+g[W+(h*44|0)+36>>2]*.5;q=(c[j>>2]=$,+g[j>>2]);s=i*(aa*aa+ba*ba+ca*ca)*s*.5*q*p;if(i>0.0&i<.9847999811172485){A=da*t*.5*q*p*+D(+(1.0-i*i));B=(z*(v*o*r-z*k*r)-w*(w*k*r-v*m*r))*A*.3333333432674408;E=(v*(w*k*r-v*m*r)-z*(z*m*r-w*o*r))*A*.3333333432674408;A=(w*(z*m*r-w*o*r)-v*(v*o*r-z*k*r))*A*.3333333432674408}else{B=0.0;E=0.0;A=0.0}f=0;i=z*s*-.3333333432674408;m=w*s*-.3333333432674408;y=v*s*-.3333333432674408;e=X;o=v*s*-.3333333432674408;p=w*s*-.3333333432674408;v=z*s*-.3333333432674408;while(1){k=+g[e+88>>2];if(k>0.0){q=+g[I+512>>2];t=o*k*q;u=p*k*q;k=v*k*q;q=+g[e+40>>2];r=+g[e+44>>2];s=+g[e+48>>2];if(k*k+(t*t+u*u)>0.0?k*k+(t*t+u*u)>=q*q+r*r+s*s:0){i=+D(+(q*q+r*r+s*s))/+D(+(k*k+(t*t+u*u)))*.800000011920929;k=o*i;m=p*i;i=v*i;o=k;p=m;q=i}else{q=v;k=y}ha=e+56|0;fa=e+60|0;F=m+ +g[fa>>2];ga=e+64|0;G=i+ +g[ga>>2];g[ha>>2]=B+(k+ +g[ha>>2]);g[fa>>2]=E+F;g[ga>>2]=A+G}else{k=y;q=v}e=f+1|0;if((e|0)==3)break c;f=e;y=k;e=c[W+(h*44|0)+8+(e<<2)>>2]|0;v=q}}case 4:{G=aa*k+ba*m+ca*o<0.0?-1.0:1.0;k=k*G;m=m*G;o=o*G;break}case 6:break;default:break c}i=aa*k+ba*m+ca*o;if(i>0.0){p=-((c[j>>2]=$,+g[j>>2])*(aa*aa+ba*ba+ca*ca)*i*+g[W+(h*44|0)+36>>2]);r=(v*s*p+(k*t*p+0.0))*.3333333432674408;q=(w*s*p+(m*t*p+0.0))*.3333333432674408;p=(z*s*p+(o*t*p+0.0))*.3333333432674408;e=0;f=X;k=Y;m=Z;o=_;while(1){i=u*+g[f+88>>2];if(p*i*p*i+(r*i*r*i+q*i*q*i)>k*k+m*m+o*o){F=1.0/+D(+(p*p+(r*r+q*q)));G=o*p*F+(k*r*F+m*q*F);ha=f+56|0;g[ha>>2]=+g[ha>>2]-1.0/i*r*F*G;ha=f+60|0;g[ha>>2]=+g[ha>>2]-1.0/i*q*F*G;ha=f+64|0;g[ha>>2]=+g[ha>>2]-1.0/i*p*F*G}else{ha=f+56|0;g[ha>>2]=r+ +g[ha>>2];ha=f+60|0;g[ha>>2]=q+ +g[ha>>2];ha=f+64|0;g[ha>>2]=p+ +g[ha>>2]}e=e+1|0;if((e|0)==3)break c;ha=c[W+(h*44|0)+8+(e<<2)>>2]|0;f=ha;k=+g[ha+40>>2];m=+g[ha+44>>2];o=+g[ha+48>>2]}}}while(0);h=h+1|0}while((h|0)!=(n|0))}if((H|0)>0){e=0;do{ga=c[I+780>>2]|0;fa=ga+(e*104|0)+8|0;ha=ga+(e*104|0)+24|0;c[ha>>2]=c[fa>>2];c[ha+4>>2]=c[fa+4>>2];c[ha+8>>2]=c[fa+8>>2];c[ha+12>>2]=c[fa+12>>2];ha=ga+(e*104|0)+56|0;F=+g[ga+(e*104|0)+88>>2];G=+g[I+512>>2];B=+g[ha>>2]*F*G;E=F*+g[ga+(e*104|0)+60>>2]*G;F=G*F*+g[ga+(e*104|0)+64>>2];G=+g[(c[I+744>>2]|0)+12>>2]/G;B=B>G?G:B;E=E>G?G:E;F=F>G?G:F;x=ga+(e*104|0)+40|0;B=(B<-G?-G:B)+ +g[x>>2];g[x>>2]=B;x=ga+(e*104|0)+44|0;E=(E<-G?-G:E)+ +g[x>>2];g[x>>2]=E;x=ga+(e*104|0)+48|0;F=(F<-G?-G:F)+ +g[x>>2];g[x>>2]=F;G=+g[I+512>>2];g[fa>>2]=B*G+ +g[fa>>2];fa=ga+(e*104|0)+12|0;g[fa>>2]=G*E+ +g[fa>>2];ga=ga+(e*104|0)+16|0;g[ga>>2]=F*G+ +g[ga>>2];c[ha>>2]=0;c[ha+4>>2]=0;c[ha+8>>2]=0;c[ha+12>>2]=0;e=e+1|0}while((e|0)!=(H|0))}Tc(I);e=c[I+988>>2]|0;if(e){ha=c[I+192>>2]|0;E=+nb[c[(c[ha>>2]|0)+48>>2]&15](ha);G=+g[e+4>>2]-E;F=+g[e+8>>2]-E;g[I+952>>2]=+g[e>>2]-E;g[I+956>>2]=G;g[I+960>>2]=F;g[I+964>>2]=0.0;F=E+ +g[e+20>>2];G=E+ +g[e+24>>2];g[I+968>>2]=E+ +g[e+16>>2];g[I+972>>2]=F;g[I+976>>2]=G;g[I+980>>2]=0.0;e=c[I+188>>2]|0;if(e|0){ha=c[I+744>>2]|0;ga=c[ha+32>>2]|0;Zb[c[(c[ga>>2]|0)+16>>2]&31](ga,e,I+952|0,I+968|0,c[ha+36>>2]|0)}}else{c[I+952>>2]=0;c[I+952+4>>2]=0;c[I+952+8>>2]=0;c[I+952+12>>2]=0;c[I+952+16>>2]=0;c[I+952+20>>2]=0;c[I+952+24>>2]=0;c[I+952+28>>2]=0}f=c[I+772>>2]|0;if((f|0)>0){e=0;do{ga=c[I+780>>2]|0;F=+g[I+524>>2];B=+g[ga+(e*104|0)+8>>2];G=+g[ga+(e*104|0)+12>>2];E=+g[ga+(e*104|0)+16>>2];g[ea>>2]=B-F;g[ea+4>>2]=G-F;g[ea+8>>2]=E-F;g[ea+12>>2]=0.0;g[ea+16>>2]=F+B;g[ea+20>>2]=F+G;g[ea+24>>2]=F+E;g[ea+28>>2]=0.0;ha=c[ga+(e*104|0)+96>>2]|0;E=+g[I+520>>2];F=E*+g[ga+(e*104|0)+44>>2];G=E*+g[ga+(e*104|0)+48>>2];g[ea+128>>2]=+g[ga+(e*104|0)+40>>2]*E;g[ea+128+4>>2]=F;g[ea+128+8>>2]=G;g[ea+128+12>>2]=0.0;uh(I+988|0,ha,ea,ea+128|0,+g[I+528>>2])|0;e=e+1|0}while((e|0)!=(f|0))}if(c[I+1028>>2]|0?(c[I+812>>2]|0)>0:0){e=0;do{ha=c[I+820>>2]|0;H=c[ha+(e*44|0)+8>>2]|0;fa=c[ha+(e*44|0)+12>>2]|0;ga=c[ha+(e*44|0)+16>>2]|0;B=(+g[H+40>>2]+ +g[fa+40>>2]+ +g[ga+40>>2])*.3333333432674408;E=(+g[H+44>>2]+ +g[fa+44>>2]+ +g[ga+44>>2])*.3333333432674408;F=(+g[H+48>>2]+ +g[fa+48>>2]+ +g[ga+48>>2])*.3333333432674408;w=+g[I+524>>2];t=+g[H+8>>2];v=+g[H+12>>2];z=+g[H+16>>2];G=+g[H+20>>2];A=+g[fa+8>>2];o=A>2];p=y>2];q=u>2];r=s>2];u=+g[ga+12>>2];y=+g[ga+16>>2];A=+g[ga+20>>2];g[ea>>2]=(s>2]=(u>2]=(y>2]=A>2]=w+(t>2]=w+(v>2]=w+(z>2]=G>2]|0;G=+g[I+520>>2];g[ea+128>>2]=B*G;g[ea+128+4>>2]=E*G;g[ea+128+8>>2]=F*G;g[ea+128+12>>2]=0.0;uh(I+1028|0,ha,ea,ea+128|0,+g[I+528>>2])|0;e=e+1|0}while((e|0)<(c[I+812>>2]|0))}do if(a[I+533>>0]|0){x=c[I+772>>2]|0;if((x|0)>0){f=c[I+780>>2]|0;h=c[I+572>>2]|0;e=0;i=0.0;k=0.0;m=0.0;do{G=+g[h+(e<<2)>>2];i=i+ +g[f+(e*104|0)+8>>2]*G;k=k+G*+g[f+(e*104|0)+12>>2];m=m+G*+g[f+(e*104|0)+16>>2];e=e+1|0}while((e|0)!=(x|0))}else{i=0.0;k=0.0;m=0.0}g[I+580>>2]=i;g[I+584>>2]=k;g[I+588>>2]=m;g[I+592>>2]=0.0;h=ea+128+4|0;n=h+44|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(n|0));g[ea+128>>2]=1.1920928955078125e-07;g[ea+128+20>>2]=2.384185791015625e-07;g[ea+128+40>>2]=3.5762786865234375e-07;if((x|0)>0){f=c[I+572>>2]|0;h=c[I+780>>2]|0;n=c[I+552>>2]|0;e=0;o=1.1920928955078125e-07;p=0.0;q=0.0;r=0.0;s=2.384185791015625e-07;t=0.0;u=0.0;v=0.0;w=3.5762786865234375e-07;do{F=+g[f+(e<<2)>>2];z=(+g[h+(e*104|0)+8>>2]-i)*F;A=(+g[h+(e*104|0)+12>>2]-k)*F;F=F*(+g[h+(e*104|0)+16>>2]-m);B=+g[n+(e<<4)>>2];E=+g[n+(e<<4)+4>>2];G=+g[n+(e<<4)+8>>2];o=z*B+o;p=z*E+p;q=z*G+q;r=A*B+r;s=A*E+s;t=A*G+t;u=F*B+u;v=F*E+v;w=F*G+w;e=e+1|0}while((e|0)!=(x|0));g[ea+128>>2]=o;g[ea+128+4>>2]=p;g[ea+128+8>>2]=q;g[ea+128+16>>2]=r;g[ea+128+20>>2]=s;g[ea+128+24>>2]=t;g[ea+128+32>>2]=u;g[ea+128+36>>2]=v;g[ea+128+40>>2]=w}if((a[22456]|0)==0?Uz(22456)|0:0){g[5758]=9.999999747378752e-05;c[5759]=16}bd(ea+128|0,ea+80|0,ea+32|0);c[I+596>>2]=c[ea+80>>2];c[I+596+4>>2]=c[ea+80+4>>2];c[I+596+8>>2]=c[ea+80+8>>2];c[I+596+12>>2]=c[ea+80+12>>2];c[I+612>>2]=c[L>>2];c[I+612+4>>2]=c[L+4>>2];c[I+612+8>>2]=c[L+8>>2];c[I+612+12>>2]=c[L+12>>2];c[I+628>>2]=c[P>>2];c[I+628+4>>2]=c[P+4>>2];c[I+628+8>>2]=c[P+8>>2];c[I+628+12>>2]=c[P+12>>2];la=+g[ea+80>>2];v=+g[L>>2];A=+g[P>>2];ka=+g[ea+80+4>>2];w=+g[ea+80+20>>2];E=+g[ea+80+36>>2];ja=+g[ea+80+8>>2];y=+g[ea+80+24>>2];G=+g[ea+80+40>>2];p=+g[I+692>>2];o=+g[I+696>>2];m=+g[I+700>>2];ra=+g[I+708>>2];qa=+g[I+712>>2];q=+g[I+716>>2];B=+g[I+724>>2];F=+g[I+728>>2];u=+g[I+732>>2];pa=+g[ea+128>>2];oa=+g[ea+128+16>>2];r=+g[ea+128+32>>2];i=(la*p+ka*o+ja*m)*pa+(v*p+w*o+y*m)*oa+(A*p+E*o+G*m)*r;na=+g[ea+128+4>>2];ma=+g[ea+128+20>>2];s=+g[ea+128+36>>2];k=(la*p+ka*o+ja*m)*na+(v*p+w*o+y*m)*ma+(A*p+E*o+G*m)*s;ia=+g[ea+128+8>>2];z=+g[ea+128+24>>2];t=+g[ea+128+40>>2];m=(la*p+ka*o+ja*m)*ia+(v*p+w*o+y*m)*z+(A*p+E*o+G*m)*t;o=(la*ra+ka*qa+ja*q)*pa+(v*ra+w*qa+y*q)*oa+(A*ra+E*qa+G*q)*r;p=(la*ra+ka*qa+ja*q)*na+(v*ra+w*qa+y*q)*ma+(A*ra+E*qa+G*q)*s;q=(la*ra+ka*qa+ja*q)*ia+(v*ra+w*qa+y*q)*z+(A*ra+E*qa+G*q)*t;r=pa*(la*B+ka*F+ja*u)+oa*(v*B+w*F+y*u)+(A*B+E*F+G*u)*r;s=(la*B+ka*F+ja*u)*na+(v*B+w*F+y*u)*ma+(A*B+E*F+G*u)*s;t=(la*B+ka*F+ja*u)*ia+(v*B+w*F+y*u)*z+(A*B+E*F+G*u)*t;g[I+644>>2]=i;g[I+648>>2]=k;g[I+652>>2]=m;g[I+656>>2]=0.0;g[I+660>>2]=o;g[I+664>>2]=p;g[I+668>>2]=q;g[I+672>>2]=0.0;g[I+676>>2]=r;g[I+680>>2]=s;g[I+684>>2]=t;g[I+688>>2]=0.0;u=+g[I+424>>2];if(u>1.0){ra=1.0/(m*(s*o-p*r)+(i*(p*t-q*s)+k*(q*r-t*o)))<1.0?1.0:1.0/(m*(s*o-p*r)+(i*(p*t-q*s)+k*(q*r-t*o)))>u?u:1.0/(m*(s*o-p*r)+(i*(p*t-q*s)+k*(q*r-t*o)));g[I+644>>2]=i*ra;g[I+648>>2]=k*ra;g[I+652>>2]=m*ra;g[I+656>>2]=0.0;g[I+660>>2]=o*ra;g[I+664>>2]=p*ra;g[I+668>>2]=q*ra;g[I+672>>2]=0.0;g[I+676>>2]=r*ra;g[I+680>>2]=s*ra;g[I+684>>2]=ra*t;g[I+688>>2]=0.0}if(a[I+533>>0]|0?+g[I+380>>2]>0.0:0){i=+g[I+596>>2];p=+g[I+600>>2];q=+g[I+604>>2];r=+g[I+612>>2];s=+g[I+616>>2];t=+g[I+620>>2];k=+g[I+628>>2];m=+g[I+632>>2];o=+g[I+636>>2];f=c[I+772>>2]|0;if((f|0)<=0)break;e=0;do{h=c[I+780>>2]|0;if(+g[h+(e*104|0)+88>>2]>0.0){fa=c[I+552>>2]|0;ma=+g[fa+(e<<4)>>2];na=+g[fa+(e<<4)+4>>2];oa=+g[fa+(e<<4)+8>>2];la=+g[I+380>>2];fa=h+(e*104|0)+8|0;pa=+g[fa>>2];ga=h+(e*104|0)+12|0;qa=+g[ga>>2];ha=h+(e*104|0)+16|0;ra=+g[ha>>2];qa=qa+la*(r*ma+s*na+t*oa+ +g[I+584>>2]-qa);ra=ra+la*(k*ma+m*na+o*oa+ +g[I+588>>2]-ra);g[fa>>2]=pa+la*(+g[I+580>>2]+(i*ma+p*na+q*oa)-pa);g[ga>>2]=qa;g[ha>>2]=ra;g[h+(e*104|0)+20>>2]=0.0}e=e+1|0}while((e|0)!=(f|0))}}while(0);h=ea+128|0;n=h+104|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(n|0));e=c[I+872>>2]|0;if((e|0)<0){if((c[I+876>>2]|0)<0){f=c[I+880>>2]|0;if(f|0){if(a[I+884>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[I+880>>2]=0}a[I+884>>0]=1;c[I+880>>2]=0;c[I+876>>2]=0}do{ha=c[I+880>>2]|0;ga=ha+(e*104|0)|0;c[ga>>2]=c[ea+128>>2];c[ga+4>>2]=c[ea+128+4>>2];c[ga+8>>2]=c[ea+128+8>>2];c[ga+12>>2]=c[ea+128+12>>2];c[ga+16>>2]=c[ea+128+16>>2];c[ga+20>>2]=c[ea+128+20>>2];c[ga+24>>2]=c[ea+128+24>>2];ga=ha+(e*104|0)+28|0;c[ga>>2]=c[ea+128+28>>2];c[ga+4>>2]=c[ea+128+28+4>>2];c[ga+8>>2]=c[ea+128+28+8>>2];c[ga+12>>2]=c[ea+128+28+12>>2];ga=ha+(e*104|0)+44|0;c[ga>>2]=c[ea+128+44>>2];c[ga+4>>2]=c[ea+128+44+4>>2];c[ga+8>>2]=c[ea+128+44+8>>2];c[ga+12>>2]=c[ea+128+44+12>>2];ga=ha+(e*104|0)+60|0;c[ga>>2]=c[ea+128+60>>2];c[ga+4>>2]=c[ea+128+60+4>>2];c[ga+8>>2]=c[ea+128+60+8>>2];c[ga+12>>2]=c[ea+128+60+12>>2];ha=ha+(e*104|0)+76|0;c[ha>>2]=c[K>>2];c[ha+4>>2]=c[K+4>>2];c[ha+8>>2]=c[K+8>>2];c[ha+12>>2]=c[K+12>>2];c[ha+16>>2]=c[K+16>>2];c[ha+20>>2]=c[K+20>>2];c[ha+24>>2]=c[K+24>>2];e=e+1|0}while((e|0)!=0)}c[I+872>>2]=0;h=ea+128|0;n=h+56|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(n|0));e=c[I+892>>2]|0;if((e|0)<0){if((c[I+896>>2]|0)<0){f=c[I+900>>2]|0;if(f|0){if(a[I+904>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[I+900>>2]=0}a[I+904>>0]=1;c[I+900>>2]=0;c[I+896>>2]=0}do{h=(c[I+900>>2]|0)+(e*56|0)|0;f=ea+128|0;n=h+56|0;do{c[h>>2]=c[f>>2];h=h+4|0;f=f+4|0}while((h|0)<(n|0));e=e+1|0}while((e|0)!=0)}c[I+892>>2]=0;ng(I+988|0,1);ng(I+1028|0,1);ng(I+1068|0,1);e=c[b+24>>2]|0}}J=J+1|0}while((J|0)<(e|0));l=ea;return}function oc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=+f;var h=0,i=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0;Q=l;l=l+448|0;if(!(a[b+527>>0]|0)){l=Q;return}P=c[b+28>>2]|0;C=+g[b+348>>2];B=+g[b+352>>2];J=+g[b+356>>2];E=+g[P+52>>2];F=C*+g[P+4>>2]+B*+g[P+8>>2]+J*+g[P+12>>2]+E;G=+g[P+56>>2];H=C*+g[P+20>>2]+B*+g[P+24>>2]+J*+g[P+28>>2]+G;I=+g[P+60>>2];J=C*+g[P+36>>2]+B*+g[P+40>>2]+J*+g[P+44>>2]+I;P=c[b+32>>2]|0;B=+g[b+412>>2];C=+g[b+416>>2];r=+g[b+420>>2];k=+g[P+52>>2];m=B*+g[P+4>>2]+C*+g[P+8>>2]+r*+g[P+12>>2]+k;n=+g[P+56>>2];o=B*+g[P+20>>2]+C*+g[P+24>>2]+r*+g[P+28>>2]+n;q=+g[P+60>>2];r=B*+g[P+36>>2]+C*+g[P+40>>2]+r*+g[P+44>>2]+q;if(!(a[b+524>>0]|0)){A=+g[d+192>>2]+ +g[d+80>>2];B=+g[d+196>>2]+ +g[d+84>>2];z=+g[d+200>>2]+ +g[d+88>>2];C=+g[e+192>>2]+ +g[e+80>>2];y=+g[e+196>>2]+ +g[e+84>>2];w=+g[e+200>>2]+ +g[e+88>>2];s=+g[d+176>>2]+ +g[d+64>>2]+((J-I)*B-(H-G)*z)-(+g[e+176>>2]+ +g[e+64>>2]+((r-q)*y-(o-n)*w));w=+g[d+180>>2]+ +g[d+68>>2]+((F-E)*z-(J-I)*A)-(+g[e+180>>2]+ +g[e+68>>2]+((m-k)*w-(r-q)*C));y=+g[d+184>>2]+ +g[d+72>>2]+((H-G)*A-(F-E)*B)-(+g[e+184>>2]+ +g[e+72>>2]+((o-n)*C-(m-k)*y));t=(c[d+240>>2]|0)==0;p=0;do{C=1.0/+g[b+48+(p*84|0)+80>>2];u=b+48+(p*84|0)|0;B=+g[u>>2];v=b+48+(p*84|0)+4|0;A=+g[v>>2];x=b+48+(p*84|0)+8|0;z=+g[x>>2];z=C*(((F-m)*B+(H-o)*A+(J-r)*z)*-.30000001192092896/f)-C*(s*B+w*A+y*z);g[b+36>>2]=+g[b+36>>2]+z;A=+g[x>>2];B=+g[v>>2];C=+g[u>>2];h=c[b+28>>2]|0;i=+g[h+404>>2];if(!t){T=((H-G)*A-(J-I)*B)*+g[h+356>>2]+((J-I)*C-(F-E)*A)*+g[h+360>>2]+((F-E)*B-(H-G)*C)*+g[h+364>>2];R=((H-G)*A-(J-I)*B)*+g[h+340>>2]+((J-I)*C-(F-E)*A)*+g[h+344>>2]+((F-E)*B-(H-G)*C)*+g[h+348>>2];S=((H-G)*A-(J-I)*B)*+g[h+324>>2]+((J-I)*C-(F-E)*A)*+g[h+328>>2]+((F-E)*B-(H-G)*C)*+g[h+332>>2];V=z*B*i*+g[d+116>>2];U=z*A*i*+g[d+120>>2];g[d+64>>2]=z*C*i*+g[d+112>>2]+ +g[d+64>>2];g[d+68>>2]=V+ +g[d+68>>2];g[d+72>>2]=U+ +g[d+72>>2];R=R*z*+g[d+100>>2];i=T*z*+g[d+104>>2];g[d+80>>2]=S*z*+g[d+96>>2]+ +g[d+80>>2];g[d+84>>2]=R+ +g[d+84>>2];g[d+88>>2]=i+ +g[d+88>>2]}h=c[b+32>>2]|0;i=+g[h+404>>2];if(c[e+240>>2]|0){V=((o-n)*A-(r-q)*B)*+g[h+356>>2]+((r-q)*C-(m-k)*A)*+g[h+360>>2]+((m-k)*B-(o-n)*C)*+g[h+364>>2];U=((o-n)*A-(r-q)*B)*+g[h+340>>2]+((r-q)*C-(m-k)*A)*+g[h+344>>2]+((m-k)*B-(o-n)*C)*+g[h+348>>2];T=((o-n)*A-(r-q)*B)*+g[h+324>>2]+((r-q)*C-(m-k)*A)*+g[h+328>>2]+((m-k)*B-(o-n)*C)*+g[h+332>>2];R=i*+g[v>>2]*-z*+g[e+116>>2];S=i*+g[x>>2]*-z*+g[e+120>>2];g[e+64>>2]=+g[e+112>>2]*i*+g[u>>2]*-z+ +g[e+64>>2];g[e+68>>2]=R+ +g[e+68>>2];g[e+72>>2]=S+ +g[e+72>>2];U=U*+g[e+100>>2]*-z;V=V*+g[e+104>>2]*-z;g[e+80>>2]=T*+g[e+96>>2]*-z+ +g[e+80>>2];g[e+84>>2]=U+ +g[e+84>>2];g[e+88>>2]=V+ +g[e+88>>2]}p=p+1|0}while((p|0)!=3)}do if(!(a[b+552>>0]|0)){i=+g[b+440>>2];if(!(i>1.1920928955078125e-07)){K=d+80|0;p=d+196|0;L=d+84|0;t=d+200|0;M=d+88|0;u=e+192|0;N=e+80|0;v=e+196|0;O=e+84|0;x=e+200|0;P=e+88|0;h=d+192|0;break}k=+g[e+192>>2]+ +g[e+80>>2]-(+g[d+192>>2]+ +g[d+80>>2]);m=+g[e+196>>2]+ +g[e+84>>2]-(+g[d+196>>2]+ +g[d+84>>2]);n=+g[e+200>>2]+ +g[e+88>>2]-(+g[d+200>>2]+ +g[d+88>>2]);if(k*k+m*m+n*n>1.1920928955078125e-07){E=1.0/+D(+(k*k+m*m+n*n));h=c[b+28>>2]|0;q=+g[h+324>>2];r=+g[h+340>>2];s=+g[h+356>>2];w=+g[h+328>>2];y=+g[h+344>>2];z=+g[h+360>>2];A=+g[h+332>>2];B=+g[h+348>>2];C=+g[h+364>>2];h=c[b+32>>2]|0;i=i*(1.0/(k*E*(q*k*E+m*E*r+n*E*s)+m*E*(k*E*w+m*E*y+n*E*z)+n*E*(k*E*A+m*E*B+n*E*C)+(k*E*(k*E*+g[h+324>>2]+m*E*+g[h+340>>2]+n*E*+g[h+356>>2])+m*E*(k*E*+g[h+328>>2]+m*E*+g[h+344>>2]+n*E*+g[h+360>>2])+n*E*(k*E*+g[h+332>>2]+m*E*+g[h+348>>2]+n*E*+g[h+364>>2]))));E=+D(+(n*i*n*i+(k*i*k*i+m*i*m*i)));o=1.0/E*k*i;k=1.0/E*m*i;i=1.0/E*n*i;if(c[d+240>>2]|0){V=E*0.0*+g[d+116>>2];U=E*0.0*+g[d+120>>2];g[d+64>>2]=E*0.0*+g[d+112>>2]+ +g[d+64>>2];g[d+68>>2]=V+ +g[d+68>>2];g[d+72>>2]=U+ +g[d+72>>2];U=(o*r+k*y+i*B)*E*+g[d+100>>2];V=(o*s+k*z+i*C)*E*+g[d+104>>2];g[d+80>>2]=(o*q+k*w+i*A)*E*+g[d+96>>2]+ +g[d+80>>2];g[d+84>>2]=U+ +g[d+84>>2];g[d+88>>2]=V+ +g[d+88>>2];h=c[b+32>>2]|0}if(c[e+240>>2]|0){V=o*+g[h+356>>2]+k*+g[h+360>>2]+i*+g[h+364>>2];U=o*+g[h+340>>2]+k*+g[h+344>>2]+i*+g[h+348>>2];T=o*+g[h+324>>2]+k*+g[h+328>>2]+i*+g[h+332>>2];R=E*-0.0*+g[e+116>>2];S=E*-0.0*+g[e+120>>2];g[e+64>>2]=E*-0.0*+g[e+112>>2]+ +g[e+64>>2];g[e+68>>2]=R+ +g[e+68>>2];g[e+72>>2]=S+ +g[e+72>>2];U=U*+g[e+100>>2]*-E;V=V*+g[e+104>>2]*-E;g[e+80>>2]=T*+g[e+96>>2]*-E+ +g[e+80>>2];g[e+84>>2]=U+ +g[e+84>>2];g[e+88>>2]=V+ +g[e+88>>2];K=d+80|0;p=d+196|0;L=d+84|0;t=d+200|0;M=d+88|0;u=e+192|0;N=e+80|0;v=e+196|0;O=e+84|0;x=e+200|0;P=e+88|0;h=d+192|0}else{K=d+80|0;p=d+196|0;L=d+84|0;t=d+200|0;M=d+88|0;u=e+192|0;N=e+80|0;v=e+196|0;O=e+84|0;x=e+200|0;P=e+88|0;h=d+192|0}}else{K=d+80|0;p=d+196|0;L=d+84|0;t=d+200|0;M=d+88|0;u=e+192|0;N=e+80|0;v=e+196|0;O=e+84|0;x=e+200|0;P=e+88|0;h=d+192|0}}else{O=c[b+28>>2]|0;c[Q+352>>2]=c[O+4>>2];c[Q+352+4>>2]=c[O+4+4>>2];c[Q+352+8>>2]=c[O+4+8>>2];c[Q+352+12>>2]=c[O+4+12>>2];c[Q+352+16>>2]=c[O+20>>2];c[Q+352+16+4>>2]=c[O+20+4>>2];c[Q+352+16+8>>2]=c[O+20+8>>2];c[Q+352+16+12>>2]=c[O+20+12>>2];c[Q+352+32>>2]=c[O+36>>2];c[Q+352+32+4>>2]=c[O+36+4>>2];c[Q+352+32+8>>2]=c[O+36+8>>2];c[Q+352+32+12>>2]=c[O+36+12>>2];c[Q+352+48>>2]=c[O+52>>2];c[Q+352+48+4>>2]=c[O+52+4>>2];c[Q+352+48+8>>2]=c[O+52+8>>2];c[Q+352+48+12>>2]=c[O+52+12>>2];O=c[b+32>>2]|0;c[Q+288>>2]=c[O+4>>2];c[Q+288+4>>2]=c[O+4+4>>2];c[Q+288+8>>2]=c[O+4+8>>2];c[Q+288+12>>2]=c[O+4+12>>2];c[Q+288+16>>2]=c[O+20>>2];c[Q+288+16+4>>2]=c[O+20+4>>2];c[Q+288+16+8>>2]=c[O+20+8>>2];c[Q+288+16+12>>2]=c[O+20+12>>2];c[Q+288+32>>2]=c[O+36>>2];c[Q+288+32+4>>2]=c[O+36+4>>2];c[Q+288+32+8>>2]=c[O+36+8>>2];c[Q+288+32+12>>2]=c[O+36+12>>2];c[Q+288+48>>2]=c[O+52>>2];c[Q+288+48+4>>2]=c[O+52+4>>2];c[Q+288+48+8>>2]=c[O+52+8>>2];c[Q+288+48+12>>2]=c[O+52+12>>2];T=+g[d+196>>2]+ +g[d+84>>2];s=+g[d+200>>2]+ +g[d+88>>2];g[Q+272>>2]=+g[d+192>>2]+ +g[d+80>>2];g[Q+272+4>>2]=T;g[Q+272+8>>2]=s;g[Q+272+12>>2]=0.0;s=+g[e+196>>2]+ +g[e+84>>2];T=+g[e+200>>2]+ +g[e+88>>2];g[Q+256>>2]=+g[e+192>>2]+ +g[e+80>>2];g[Q+256+4>>2]=s;g[Q+256+8>>2]=T;g[Q+256+12>>2]=0.0;c[Q+192>>2]=1065353216;O=Q+192+4|0;c[O>>2]=0;c[O+4>>2]=0;c[O+8>>2]=0;c[O+12>>2]=0;c[Q+192+20>>2]=1065353216;P=Q+192+24|0;c[P>>2]=0;c[P+4>>2]=0;c[P+8>>2]=0;c[P+12>>2]=0;c[Q+192+40>>2]=1065353216;M=Q+192+44|0;c[M>>2]=0;c[M+4>>2]=0;c[M+8>>2]=0;c[M+12>>2]=0;c[M+16>>2]=0;Af(Q+352|0,0.0,0.0,0.0,Q+272|0,f,Q+192|0);c[Q+128>>2]=1065353216;M=Q+128+4|0;c[M>>2]=0;c[M+4>>2]=0;c[M+8>>2]=0;c[M+12>>2]=0;c[Q+128+20>>2]=1065353216;N=Q+128+24|0;c[N>>2]=0;c[N+4>>2]=0;c[N+8>>2]=0;c[N+12>>2]=0;c[Q+128+40>>2]=1065353216;L=Q+128+44|0;c[L>>2]=0;c[L+4>>2]=0;c[L+8>>2]=0;c[L+12>>2]=0;c[L+16>>2]=0;Af(Q+288|0,0.0,0.0,0.0,Q+256|0,f,Q+128|0);T=+g[b+556>>2];s=+g[b+560>>2];U=+g[b+564>>2];w=+g[b+568>>2];H=T*(2.0/(T*T+s*s+U*U+w*w));B=s*(2.0/(T*T+s*s+U*U+w*w));I=U*(2.0/(T*T+s*s+U*U+w*w));X=+g[b+364>>2];W=+g[b+368>>2];_=+g[b+372>>2];k=_*(T*I-w*B)+(W*(T*B+w*I)+X*(1.0-(s*B+U*I)));m=_*(s*I+w*H)+(X*(T*B-w*I)+W*(1.0-(T*H+U*I)));n=X*(T*I+w*B)+W*(s*I-w*H)+_*(1.0-(T*H+s*B));i=+g[b+380>>2];G=+g[b+384>>2];C=+g[b+388>>2];o=(T*I-w*B)*C+(G*(T*B+w*I)+i*(1.0-(s*B+U*I)));q=(s*I+w*H)*C+(i*(T*B-w*I)+G*(1.0-(T*H+U*I)));r=i*(T*I+w*B)+G*(s*I-w*H)+C*(1.0-(T*H+s*B));R=+g[b+396>>2];E=+g[b+400>>2];A=+g[b+404>>2];S=(1.0-(s*B+U*I))*R+(T*B+w*I)*E+(T*I-w*B)*A;U=(T*B-w*I)*R+(1.0-(T*H+U*I))*E+(s*I+w*H)*A;B=(T*I+w*B)*R+(s*I-w*H)*E+(1.0-(T*H+s*B))*A;s=+g[b+300>>2];H=+g[b+316>>2];T=+g[b+332>>2];w=+g[b+304>>2];I=+g[b+320>>2];V=+g[b+336>>2];F=+g[b+308>>2];J=+g[b+324>>2];z=+g[b+340>>2];y=-+g[b+348>>2];ba=-+g[b+352>>2];Z=-+g[b+356>>2];_=X*0.0+W*0.0+_*0.0+ +g[b+412>>2]+(n*(F*y+J*ba+z*Z)+(k*(s*y+H*ba+T*Z)+m*(w*y+I*ba+V*Z)));C=i*0.0+G*0.0+C*0.0+ +g[b+416>>2]+(r*(F*y+J*ba+z*Z)+(o*(s*y+H*ba+T*Z)+q*(w*y+I*ba+V*Z)));Z=R*0.0+E*0.0+A*0.0+ +g[b+420>>2]+(B*(F*y+J*ba+z*Z)+(S*(s*y+H*ba+T*Z)+U*(w*y+I*ba+V*Z)));ba=+g[Q+128>>2];y=+g[M>>2];A=+g[Q+128+8>>2];E=+g[Q+128+16>>2];R=+g[Q+128+20>>2];G=+g[N>>2];i=+g[Q+128+32>>2];W=+g[Q+128+36>>2];X=+g[Q+128+40>>2];Y=A*Z+(ba*_+y*C)+ +g[Q+128+48>>2];$=E*_+C*R+Z*G+ +g[Q+128+52>>2];aa=_*i+C*W+Z*X+ +g[Q+128+56>>2];g[Q+64>>2]=(k*s+m*w+n*F)*ba+(o*s+q*w+r*F)*y+(S*s+U*w+B*F)*A;g[Q+64+4>>2]=(k*H+m*I+n*J)*ba+(o*H+q*I+r*J)*y+(S*H+U*I+B*J)*A;g[Q+64+8>>2]=(k*T+m*V+n*z)*ba+(o*T+q*V+r*z)*y+(S*T+U*V+B*z)*A;g[Q+64+12>>2]=0.0;g[Q+64+16>>2]=(k*s+m*w+n*F)*E+(o*s+q*w+r*F)*R+(S*s+U*w+B*F)*G;g[Q+64+20>>2]=(k*H+m*I+n*J)*E+(o*H+q*I+r*J)*R+(S*H+U*I+B*J)*G;g[Q+64+24>>2]=(k*T+m*V+n*z)*E+(o*T+q*V+r*z)*R+(S*T+U*V+B*z)*G;g[Q+64+28>>2]=0.0;g[Q+64+32>>2]=(k*s+m*w+n*F)*i+(o*s+q*w+r*F)*W+(S*s+U*w+B*F)*X;g[Q+64+36>>2]=(k*H+m*I+n*J)*i+(o*H+q*I+r*J)*W+(S*H+U*I+B*J)*X;g[Q+64+40>>2]=(k*T+m*V+n*z)*i+(o*T+q*V+r*z)*W+(S*T+U*V+B*z)*X;g[Q+64+44>>2]=0.0;g[Q+64+48>>2]=Y;g[Q+64+52>>2]=$;g[Q+64+56>>2]=aa;g[Q+64+60>>2]=0.0;aa=(S*s+U*w+B*F)*-Z+((k*s+m*w+n*F)*-_+(o*s+q*w+r*F)*-C);$=(S*H+U*I+B*J)*-Z+((k*H+m*I+n*J)*-_+(o*H+q*I+r*J)*-C);C=(S*T+U*V+B*z)*-Z+((k*T+m*V+n*z)*-_+(o*T+q*V+r*z)*-C);_=+g[Q+192>>2];Z=+g[O>>2];Y=+g[Q+192+8>>2];X=+g[Q+192+16>>2];W=+g[Q+192+20>>2];i=+g[P>>2];G=+g[Q+192+32>>2];R=+g[Q+192+36>>2];E=+g[Q+192+40>>2];A=aa*_+$*Z+C*Y+ +g[Q+192+48>>2];y=aa*X+$*W+C*i+ +g[Q+192+52>>2];C=aa*G+$*R+C*E+ +g[Q+192+56>>2];g[Q>>2]=(k*s+m*w+n*F)*_+(k*H+m*I+n*J)*Z+(k*T+m*V+n*z)*Y;g[Q+4>>2]=(o*s+q*w+r*F)*_+(o*H+q*I+r*J)*Z+(o*T+q*V+r*z)*Y;g[Q+8>>2]=(S*s+U*w+B*F)*_+(S*H+U*I+B*J)*Z+(S*T+U*V+B*z)*Y;g[Q+12>>2]=0.0;g[Q+16>>2]=(k*s+m*w+n*F)*X+(k*H+m*I+n*J)*W+(k*T+m*V+n*z)*i;g[Q+20>>2]=(o*s+q*w+r*F)*X+(o*H+q*I+r*J)*W+(o*T+q*V+r*z)*i;g[Q+24>>2]=(S*s+U*w+B*F)*X+(S*H+U*I+B*J)*W+(S*T+U*V+B*z)*i;g[Q+28>>2]=0.0;g[Q+32>>2]=(k*s+m*w+n*F)*G+(k*H+m*I+n*J)*R+(k*T+m*V+n*z)*E;g[Q+36>>2]=(o*s+q*w+r*F)*G+(o*H+q*I+r*J)*R+(o*T+q*V+r*z)*E;g[Q+40>>2]=(S*s+U*w+B*F)*G+(S*H+U*I+B*J)*R+(S*T+U*V+B*z)*E;g[Q+44>>2]=0.0;g[Q+48>>2]=A;g[Q+52>>2]=y;g[Q+56>>2]=C;g[Q+60>>2]=0.0;If(Q+352|0,Q+64|0,Q+424|0,Q+416|0);C=+g[Q+416>>2];y=1.0/f*+g[Q+424>>2]*C;A=1.0/f*C*+g[Q+424+4>>2];C=1.0/f*C*+g[Q+424+8>>2];If(Q+288|0,Q,Q+424|0,Q+416|0);E=+g[Q+416>>2];y=y-+g[Q+272>>2];A=A-+g[Q+272+4>>2];C=C-+g[Q+272+8>>2];z=1.0/f*+g[Q+424>>2]*E-+g[Q+256>>2];B=1.0/f*E*+g[Q+424+4>>2]-+g[Q+256+4>>2];E=1.0/f*E*+g[Q+424+8>>2]-+g[Q+256+8>>2];if(y*y+A*A+C*C>1.1920928955078125e-07){s=1.0/+D(+(y*y+A*A+C*C));P=c[b+28>>2]|0;o=y*s*(+g[P+324>>2]*y*s+A*s*+g[P+340>>2]+C*s*+g[P+356>>2])+A*s*(y*s*+g[P+328>>2]+A*s*+g[P+344>>2]+C*s*+g[P+360>>2])+C*s*(y*s*+g[P+332>>2]+A*s*+g[P+348>>2]+C*s*+g[P+364>>2]);k=y*s;n=A*s;s=C*s}else{o=0.0;k=0.0;n=0.0;s=0.0}if(z*z+B*B+E*E>1.1920928955078125e-07){r=1.0/+D(+(z*z+B*B+E*E));P=c[b+32>>2]|0;q=z*r*(+g[P+324>>2]*z*r+B*r*+g[P+340>>2]+E*r*+g[P+356>>2])+B*r*(z*r*+g[P+328>>2]+B*r*+g[P+344>>2]+E*r*+g[P+360>>2])+E*r*(z*r*+g[P+332>>2]+B*r*+g[P+348>>2]+E*r*+g[P+364>>2]);i=z*r;m=B*r;r=E*r}else{q=0.0;i=0.0;m=0.0;r=0.0}w=o*k+q*i;k=o*n+q*m;i=o*s+q*r;if(w*w+k*k+i*i>1.1920928955078125e-07){n=1.0/+D(+(w*w+k*k+i*i));p=c[b+28>>2]|0;m=w*n*(+g[p+324>>2]*w*n+k*n*+g[p+340>>2]+i*n*+g[p+356>>2])+k*n*(w*n*+g[p+328>>2]+k*n*+g[p+344>>2]+i*n*+g[p+360>>2])+i*n*(w*n*+g[p+332>>2]+k*n*+g[p+348>>2]+i*n*+g[p+364>>2]);h=c[b+32>>2]|0;n=w*n*(w*n*+g[h+324>>2]+k*n*+g[h+340>>2]+i*n*+g[h+356>>2])+k*n*(w*n*+g[h+328>>2]+k*n*+g[h+344>>2]+i*n*+g[h+360>>2])+i*n*(w*n*+g[h+332>>2]+k*n*+g[h+348>>2]+i*n*+g[h+364>>2]);w=(y*m-z*n)*(1.0/((m+n)*(m+n)));i=(A*m-B*n)*(1.0/((m+n)*(m+n)));n=(C*m-E*n)*(1.0/((m+n)*(m+n)));k=+g[b+572>>2];if(!(k>=0.0))k=w;else{m=(a[b+553>>0]|0)==0?k:k/m;q=+g[b+576>>2];r=+g[b+580>>2];s=+g[b+584>>2];o=+D(+((w+q)*(w+q)+(i+r)*(i+r)+(n+s)*(n+s)));if(o>m){k=m*(w+q)*(1.0/o)-q;n=m*(n+s)*(1.0/o)-s;i=m*(i+r)*(1.0/o)-r}else k=w;g[b+576>>2]=k+q;g[b+580>>2]=i+r;g[b+584>>2]=n+s}o=+D(+(k*k+i*i+n*n));m=k*(1.0/o);k=i*(1.0/o);i=n*(1.0/o);if(c[d+240>>2]|0){ba=m*+g[p+356>>2]+k*+g[p+360>>2]+i*+g[p+364>>2];aa=m*+g[p+340>>2]+k*+g[p+344>>2]+i*+g[p+348>>2];$=m*+g[p+324>>2]+k*+g[p+328>>2]+i*+g[p+332>>2];Z=o*0.0*+g[d+116>>2];_=o*0.0*+g[d+120>>2];g[d+64>>2]=o*0.0*+g[d+112>>2]+ +g[d+64>>2];g[d+68>>2]=Z+ +g[d+68>>2];g[d+72>>2]=_+ +g[d+72>>2];aa=aa*o*+g[d+100>>2];ba=ba*o*+g[d+104>>2];g[d+80>>2]=$*o*+g[d+96>>2]+ +g[d+80>>2];g[d+84>>2]=aa+ +g[d+84>>2];g[d+88>>2]=ba+ +g[d+88>>2];h=c[b+32>>2]|0}if(c[e+240>>2]|0){ba=m*+g[h+356>>2]+k*+g[h+360>>2]+i*+g[h+364>>2];aa=m*+g[h+340>>2]+k*+g[h+344>>2]+i*+g[h+348>>2];$=m*+g[h+324>>2]+k*+g[h+328>>2]+i*+g[h+332>>2];Z=o*-0.0*+g[e+116>>2];_=o*-0.0*+g[e+120>>2];g[e+64>>2]=o*-0.0*+g[e+112>>2]+ +g[e+64>>2];g[e+68>>2]=Z+ +g[e+68>>2];g[e+72>>2]=_+ +g[e+72>>2];aa=aa*+g[e+100>>2]*-o;ba=ba*+g[e+104>>2]*-o;g[e+80>>2]=$*+g[e+96>>2]*-o+ +g[e+80>>2];g[e+84>>2]=aa+ +g[e+84>>2];g[e+88>>2]=ba+ +g[e+88>>2]}}K=d+80|0;p=d+196|0;L=d+84|0;t=d+200|0;M=d+88|0;u=e+192|0;N=e+80|0;v=e+196|0;O=e+84|0;x=e+200|0;P=e+88|0;h=d+192|0}while(0);z=+g[h>>2]+ +g[K>>2];y=+g[p>>2]+ +g[L>>2];w=+g[t>>2]+ +g[M>>2];s=+g[u>>2]+ +g[N>>2];r=+g[v>>2]+ +g[O>>2];q=+g[x>>2]+ +g[P>>2];if(a[b+526>>0]|0){k=+g[b+528>>2];i=k*+g[b+504>>2]*+g[b+432>>2]/f;m=+g[b+460>>2];n=+g[b+464>>2];o=+g[b+468>>2];if((s-z)*m+(r-y)*n+(q-w)*o>0.0)i=i+k*((s-z)*m+(r-y)*n+(q-w)*o)*+g[b+436>>2];aa=+g[b+516>>2];_=aa+i*+g[b+492>>2];g[Q+424>>2]=_;g[Q+416>>2]=0.0;h=c[(_>0.0?Q+424|0:Q+416|0)>>2]|0;c[b+516>>2]=h;aa=(c[j>>2]=h,+g[j>>2])-aa;_=+g[b+536>>2];$=+g[b+540>>2];i=+g[b+544>>2];k=aa*m-_*(aa*m*_+aa*n*$+aa*o*i);ba=aa*n-$*(aa*m*_+aa*n*$+aa*o*i);n=aa*o-i*(aa*m*_+aa*n*$+aa*o*i);i=+D(+(n*n+(k*k+ba*ba)));k=1.0/i*k;m=1.0/i*ba;n=1.0/i*n;h=c[b+28>>2]|0;if(c[d+240>>2]|0){ba=k*+g[h+356>>2]+m*+g[h+360>>2]+n*+g[h+364>>2];aa=k*+g[h+340>>2]+m*+g[h+344>>2]+n*+g[h+348>>2];$=k*+g[h+324>>2]+m*+g[h+328>>2]+n*+g[h+332>>2];Z=i*0.0*+g[d+116>>2];_=i*0.0*+g[d+120>>2];g[d+64>>2]=i*0.0*+g[d+112>>2]+ +g[d+64>>2];g[d+68>>2]=Z+ +g[d+68>>2];g[d+72>>2]=_+ +g[d+72>>2];aa=aa*i*+g[d+100>>2];ba=ba*i*+g[d+104>>2];g[K>>2]=$*i*+g[d+96>>2]+ +g[K>>2];g[L>>2]=aa+ +g[L>>2];g[M>>2]=ba+ +g[M>>2]}h=c[b+32>>2]|0;if(c[e+240>>2]|0){ba=k*+g[h+356>>2]+m*+g[h+360>>2]+n*+g[h+364>>2];aa=k*+g[h+340>>2]+m*+g[h+344>>2]+n*+g[h+348>>2];$=k*+g[h+324>>2]+m*+g[h+328>>2]+n*+g[h+332>>2];Z=i*-0.0*+g[e+116>>2];_=i*-0.0*+g[e+120>>2];g[e+64>>2]=i*-0.0*+g[e+112>>2]+ +g[e+64>>2];g[e+68>>2]=Z+ +g[e+68>>2];g[e+72>>2]=_+ +g[e+72>>2];aa=aa*+g[e+100>>2]*-i;ba=ba*+g[e+104>>2]*-i;g[N>>2]=$*+g[e+96>>2]*-i+ +g[N>>2];g[O>>2]=aa+ +g[O>>2];g[P>>2]=ba+ +g[P>>2]}}if(!(a[b+525>>0]|0)){l=Q;return}o=+g[b+532>>2];n=o*+g[b+508>>2]*+g[b+432>>2]/f;m=+g[b+476>>2];k=+g[b+480>>2];i=+g[b+484>>2];if((s-z)*m+(r-y)*k+(q-w)*i>0.0)n=n+o*((s-z)*m+(r-y)*k+(q-w)*i)*+g[b+436>>2];ba=+g[b+520>>2];n=ba+n*+g[b+496>>2];g[Q+424>>2]=n;g[Q+416>>2]=0.0;h=c[(n>0.0?Q+424|0:Q+416|0)>>2]|0;c[b+520>>2]=h;n=(c[j>>2]=h,+g[j>>2])-ba;h=c[b+28>>2]|0;if(c[d+240>>2]|0){ba=m*+g[h+356>>2]+k*+g[h+360>>2]+i*+g[h+364>>2];aa=m*+g[h+340>>2]+k*+g[h+344>>2]+i*+g[h+348>>2];i=m*+g[h+324>>2]+k*+g[h+328>>2]+i*+g[h+332>>2];m=n*0.0*+g[d+116>>2];k=n*0.0*+g[d+120>>2];g[d+64>>2]=n*0.0*+g[d+112>>2]+ +g[d+64>>2];g[d+68>>2]=m+ +g[d+68>>2];g[d+72>>2]=k+ +g[d+72>>2];k=aa*n*+g[d+100>>2];m=ba*n*+g[d+104>>2];g[K>>2]=i*n*+g[d+96>>2]+ +g[K>>2];g[L>>2]=k+ +g[L>>2];g[M>>2]=m+ +g[M>>2];m=+g[b+476>>2];k=+g[b+480>>2];i=+g[b+484>>2]}h=c[b+32>>2]|0;if(!(c[e+240>>2]|0)){l=Q;return}ba=m*+g[h+356>>2]+k*+g[h+360>>2]+i*+g[h+364>>2];aa=m*+g[h+340>>2]+k*+g[h+344>>2]+i*+g[h+348>>2];$=m*+g[h+324>>2]+k*+g[h+328>>2]+i*+g[h+332>>2];Z=n*-0.0*+g[e+116>>2];_=n*-0.0*+g[e+120>>2];g[e+64>>2]=n*-0.0*+g[e+112>>2]+ +g[e+64>>2];g[e+68>>2]=Z+ +g[e+68>>2];g[e+72>>2]=_+ +g[e+72>>2];aa=aa*+g[e+100>>2]*-n;ba=ba*+g[e+104>>2]*-n;g[N>>2]=$*+g[e+96>>2]*-n+ +g[N>>2];g[O>>2]=aa+ +g[O>>2];g[P>>2]=ba+ +g[P>>2];l=Q;return}function pc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0.0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0.0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,M=0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0,Z=0.0,_=0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0,fa=0.0,ga=0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0.0,oa=0.0,pa=0.0,qa=0.0,ra=0.0,sa=0.0,ta=0.0,ua=0.0,va=0.0,wa=0.0,xa=0.0,ya=0.0,za=0.0,Aa=0,Ba=0.0,Ca=0.0,Da=0.0,Ea=0;Ea=l;l=l+528|0;c[Ea+56>>2]=c[b>>2];c[Ea+8>>2]=c[b+64>>2];k=Ea+56+4|0;c[k>>2]=c[b+4>>2];c[Ea+8+4>>2]=c[b+68>>2];c[Ea+56+8>>2]=c[b+8>>2];c[Ea+8+8>>2]=c[b+72>>2];c[Ea+56+16>>2]=c[b+16>>2];c[Ea+8+16>>2]=c[b+80>>2];c[Ea+56+20>>2]=c[b+20>>2];c[Ea+8+20>>2]=c[b+84>>2];c[Ea+56+24>>2]=c[b+24>>2];c[Ea+8+24>>2]=c[b+88>>2];c[Ea+56+32>>2]=c[b+32>>2];c[Ea+8+32>>2]=c[b+96>>2];c[Ea+56+36>>2]=c[b+36>>2];c[Ea+8+36>>2]=c[b+100>>2];c[Ea+56+40>>2]=c[b+40>>2];c[Ea+8+40>>2]=c[b+104>>2];Aa=c[a+4>>2]|0;ia=+g[Aa+32>>2];ja=+g[Aa+36>>2];ma=+g[Aa+40>>2];ka=+nb[c[(c[Aa>>2]|0)+48>>2]&15](Aa);la=+nb[c[(c[Aa>>2]|0)+48>>2]&15](Aa);ma=(ma+ +nb[c[(c[Aa>>2]|0)+48>>2]&15](Aa))*2.0;Aa=c[a+8>>2]|0;qa=+g[Aa+32>>2];ra=+g[Aa+36>>2];wa=+g[Aa+40>>2];ta=+nb[c[(c[Aa>>2]|0)+48>>2]&15](Aa);sa=+nb[c[(c[Aa>>2]|0)+48>>2]&15](Aa);wa=(wa+ +nb[c[(c[Aa>>2]|0)+48>>2]&15](Aa))*2.0;R=+g[b+112>>2]-+g[b+48>>2];S=+g[b+116>>2]-+g[b+52>>2];T=+g[b+120>>2]-+g[b+56>>2];da=+g[Ea+56>>2];ba=+g[Ea+56+16>>2];ca=+g[Ea+56+32>>2];aa=+g[k>>2];Z=+g[Ea+56+20>>2];$=+g[Ea+56+36>>2];fa=+g[Ea+56+8>>2];ha=+g[Ea+56+24>>2];na=+g[Ea+56+40>>2];g[Ea+412>>2]=(ia+ka)*2.0*.5;g[Ea+412+4>>2]=(ja+la)*2.0*.5;g[Ea+412+8>>2]=ma*.5;g[Ea+400>>2]=(qa+ta)*2.0*.5;g[Ea+400+4>>2]=(ra+sa)*2.0*.5;g[Ea+400+8>>2]=wa*.5;za=+g[Ea+8>>2];pa=+g[Ea+8+16>>2];va=+g[Ea+8+32>>2];ya=+g[Ea+8+4>>2];oa=+g[Ea+8+20>>2];ua=+g[Ea+8+36>>2];xa=+g[Ea+8+8>>2];Ba=+g[Ea+8+24>>2];Ca=+g[Ea+8+40>>2];B=+C(+(da*za+ba*pa+ca*va));O=+C(+(da*ya+ba*oa+ca*ua));U=+C(+(da*xa+ba*Ba+ca*Ca));N=+C(+(za*aa+pa*Z+va*$));P=+C(+(ya*aa+oa*Z+ua*$));V=+C(+(xa*aa+Ba*Z+Ca*$));W=+C(+(za*fa+pa*ha+va*na));X=+C(+(ya*fa+oa*ha+ua*na));Q=+C(+(xa*fa+Ba*ha+Ca*na));i=+C(+(R*da+S*ba+T*ca))-(wa*.5*U+((ia+ka)*2.0*.5+B*(qa+ta)*2.0*.5+O*(ra+sa)*2.0*.5));if(i>0.0){l=Ea;return}if(i>-3402823466385288598117041.0e14){a=Ea+56|0;e=1;f=R*da+S*ba+T*ca<0.0&1}else{a=0;e=0;f=0;i=-3402823466385288598117041.0e14}h=+C(+(R*aa+S*Z+T*$))-((ja+la)*2.0*.5+N*(qa+ta)*2.0*.5+P*(ra+sa)*2.0*.5+V*wa*.5);if(h>0.0){l=Ea;return}if(h>i){a=k;e=2;f=R*aa+S*Z+T*$<0.0&1;i=h}h=+C(+(R*fa+S*ha+T*na))-(ma*.5+W*(qa+ta)*2.0*.5+X*(ra+sa)*2.0*.5+Q*wa*.5);if(h>0.0){l=Ea;return}if(h>i){a=Ea+56+8|0;e=3;f=R*fa+S*ha+T*na<0.0&1;i=h}h=+C(+(R*za+S*pa+T*va))-((qa+ta)*2.0*.5+(B*(ia+ka)*2.0*.5+N*(ja+la)*2.0*.5+W*ma*.5));if(h>0.0){l=Ea;return}if(h>i){a=Ea+8|0;e=4;f=R*za+S*pa+T*va<0.0&1;i=h}h=+C(+(R*ya+S*oa+T*ua))-((ra+sa)*2.0*.5+(O*(ia+ka)*2.0*.5+P*(ja+la)*2.0*.5+X*ma*.5));if(h>0.0){l=Ea;return}if(h>i){a=Ea+8+4|0;e=5;f=R*ya+S*oa+T*ua<0.0&1;i=h}h=+C(+(R*xa+S*Ba+T*Ca))-(wa*.5+(U*(ia+ka)*2.0*.5+V*(ja+la)*2.0*.5+Q*ma*.5));if(h>0.0){l=Ea;return}if(h>i){a=Ea+8+8|0;e=6;f=R*xa+S*Ba+T*Ca<0.0&1;i=h}h=(R*fa+S*ha+T*na)*(za*aa+pa*Z+va*$)-(R*aa+S*Z+T*$)*(za*fa+pa*ha+va*na);n=+C(+h)-((W+9.999999747378752e-06)*(ja+la)*2.0*.5+(N+9.999999747378752e-06)*ma*.5+(U+9.999999747378752e-06)*(ra+sa)*2.0*.5+(O+9.999999747378752e-06)*wa*.5);if(n>1.1920928955078125e-07){l=Ea;return}s=(za*fa+pa*ha+va*na)*(za*fa+pa*ha+va*na)+0.0;x=(za*aa+pa*Z+va*$)*(za*aa+pa*Z+va*$);q=+D(+(x+s));if(q>1.1920928955078125e-07?n/q*1.0499999523162842>i:0){a=0;e=7;f=h<0.0&1;i=n/q;p=0.0/q;o=-(za*fa+pa*ha+va*na)/q;h=(za*aa+pa*Z+va*$)/q}else{p=0.0;o=0.0;h=0.0}n=(R*fa+S*ha+T*na)*(ya*aa+oa*Z+ua*$)-(R*aa+S*Z+T*$)*(ya*fa+oa*ha+ua*na);q=+C(+n)-((X+9.999999747378752e-06)*(ja+la)*2.0*.5+(P+9.999999747378752e-06)*ma*.5+(U+9.999999747378752e-06)*(qa+ta)*2.0*.5+(B+9.999999747378752e-06)*wa*.5);if(q>1.1920928955078125e-07){l=Ea;return}t=(ya*fa+oa*ha+ua*na)*(ya*fa+oa*ha+ua*na)+0.0;y=(ya*aa+oa*Z+ua*$)*(ya*aa+oa*Z+ua*$);r=+D(+(y+t));if(r>1.1920928955078125e-07?q/r*1.0499999523162842>i:0){a=0;e=8;f=n<0.0&1;i=q/r;p=0.0/r;o=-(ya*fa+oa*ha+ua*na)/r;h=(ya*aa+oa*Z+ua*$)/r}n=(R*fa+S*ha+T*na)*(xa*aa+Ba*Z+Ca*$)-(R*aa+S*Z+T*$)*(xa*fa+Ba*ha+Ca*na);q=+C(+n)-((Q+9.999999747378752e-06)*(ja+la)*2.0*.5+(V+9.999999747378752e-06)*ma*.5+(O+9.999999747378752e-06)*(qa+ta)*2.0*.5+(B+9.999999747378752e-06)*(ra+sa)*2.0*.5);if(q>1.1920928955078125e-07){l=Ea;return}v=(xa*fa+Ba*ha+Ca*na)*(xa*fa+Ba*ha+Ca*na)+0.0;z=(xa*aa+Ba*Z+Ca*$)*(xa*aa+Ba*Z+Ca*$);r=+D(+(z+v));if(r>1.1920928955078125e-07?q/r*1.0499999523162842>i:0){a=0;e=9;f=n<0.0&1;i=q/r;p=0.0/r;o=-(xa*fa+Ba*ha+Ca*na)/r;h=(xa*aa+Ba*Z+Ca*$)/r}n=(R*da+S*ba+T*ca)*(za*fa+pa*ha+va*na)-(R*fa+S*ha+T*na)*(da*za+ba*pa+ca*va);q=+C(+n)-((W+9.999999747378752e-06)*(ia+ka)*2.0*.5+(B+9.999999747378752e-06)*ma*.5+(V+9.999999747378752e-06)*(ra+sa)*2.0*.5+(P+9.999999747378752e-06)*wa*.5);if(q>1.1920928955078125e-07){l=Ea;return}w=(da*za+ba*pa+ca*va)*(da*za+ba*pa+ca*va);r=+D(+(w+s));do if(r>1.1920928955078125e-07){if(!(q/r*1.0499999523162842>i))break;a=0;e=10;f=n<0.0&1;i=q/r;p=(za*fa+pa*ha+va*na)/r;o=0.0/r;h=-(da*za+ba*pa+ca*va)/r}while(0);n=(R*da+S*ba+T*ca)*(ya*fa+oa*ha+ua*na)-(R*fa+S*ha+T*na)*(da*ya+ba*oa+ca*ua);q=+C(+n)-((X+9.999999747378752e-06)*(ia+ka)*2.0*.5+(O+9.999999747378752e-06)*ma*.5+(V+9.999999747378752e-06)*(qa+ta)*2.0*.5+(N+9.999999747378752e-06)*wa*.5);if(q>1.1920928955078125e-07){l=Ea;return}u=(da*ya+ba*oa+ca*ua)*(da*ya+ba*oa+ca*ua);r=+D(+(u+t));do if(r>1.1920928955078125e-07){if(!(q/r*1.0499999523162842>i))break;a=0;e=11;f=n<0.0&1;i=q/r;p=(ya*fa+oa*ha+ua*na)/r;o=0.0/r;h=-(da*ya+ba*oa+ca*ua)/r}while(0);n=(R*da+S*ba+T*ca)*(xa*fa+Ba*ha+Ca*na)-(R*fa+S*ha+T*na)*(da*xa+ba*Ba+ca*Ca);q=+C(+n)-((Q+9.999999747378752e-06)*(ia+ka)*2.0*.5+(U+9.999999747378752e-06)*ma*.5+(P+9.999999747378752e-06)*(qa+ta)*2.0*.5+(N+9.999999747378752e-06)*(ra+sa)*2.0*.5);if(q>1.1920928955078125e-07){l=Ea;return}s=(da*xa+ba*Ba+ca*Ca)*(da*xa+ba*Ba+ca*Ca);r=+D(+(s+v));do if(r>1.1920928955078125e-07){if(!(q/r*1.0499999523162842>i))break;a=0;e=12;f=n<0.0&1;i=q/r;p=(xa*fa+Ba*ha+Ca*na)/r;o=0.0/r;h=-(da*xa+ba*Ba+ca*Ca)/r}while(0);q=(R*aa+S*Z+T*$)*(da*za+ba*pa+ca*va)-(R*da+S*ba+T*ca)*(za*aa+pa*Z+va*$);n=+C(+q)-((N+9.999999747378752e-06)*(ia+ka)*2.0*.5+(B+9.999999747378752e-06)*(ja+la)*2.0*.5+(Q+9.999999747378752e-06)*(ra+sa)*2.0*.5+(X+9.999999747378752e-06)*wa*.5);if(n>1.1920928955078125e-07){l=Ea;return}r=+D(+(w+x+0.0));do if(r>1.1920928955078125e-07){if(!(n/r*1.0499999523162842>i))break;a=0;e=13;f=q<0.0&1;i=n/r;p=-(za*aa+pa*Z+va*$)/r;o=(da*za+ba*pa+ca*va)/r;h=0.0/r}while(0);r=(R*aa+S*Z+T*$)*(da*ya+ba*oa+ca*ua)-(R*da+S*ba+T*ca)*(ya*aa+oa*Z+ua*$);n=+C(+r)-((P+9.999999747378752e-06)*(ia+ka)*2.0*.5+(O+9.999999747378752e-06)*(ja+la)*2.0*.5+(Q+9.999999747378752e-06)*(qa+ta)*2.0*.5+(W+9.999999747378752e-06)*wa*.5);if(n>1.1920928955078125e-07){l=Ea;return}q=+D(+(u+y+0.0));do if(q>1.1920928955078125e-07){if(!(n/q*1.0499999523162842>i))break;a=0;e=14;f=r<0.0&1;i=n/q;p=-(ya*aa+oa*Z+ua*$)/q;o=(da*ya+ba*oa+ca*ua)/q;h=0.0/q}while(0);r=(R*aa+S*Z+T*$)*(da*xa+ba*Ba+ca*Ca)-(R*da+S*ba+T*ca)*(xa*aa+Ba*Z+Ca*$);n=+C(+r)-((V+9.999999747378752e-06)*(ia+ka)*2.0*.5+(U+9.999999747378752e-06)*(ja+la)*2.0*.5+(X+9.999999747378752e-06)*(qa+ta)*2.0*.5+(W+9.999999747378752e-06)*(ra+sa)*2.0*.5);if(n>1.1920928955078125e-07){l=Ea;return}q=+D(+(s+z+0.0));do if(q>1.1920928955078125e-07){if(!(n/q*1.0499999523162842>i)){Aa=55;break}e=15;f=r<0.0&1;i=n/q;p=-(xa*aa+Ba*Z+Ca*$)/q;o=(da*xa+ba*Ba+ca*Ca)/q;h=0.0/q;Aa=58}else Aa=55;while(0);do if((Aa|0)==55){if(!e){l=Ea;return}if(!a){Aa=58;break}m=c[a>>2]|0;c[Ea>>2]=m;ga=c[a+16>>2]|0;n=(c[j>>2]=m,+g[j>>2]);m=e;B=i;e=ga;i=(c[j>>2]=ga,+g[j>>2]);h=+g[a+32>>2]}while(0);if((Aa|0)==58){n=p*+g[Ea+56>>2]+o*+g[k>>2]+h*fa;g[Ea>>2]=n;Da=p*+g[Ea+56+16>>2]+o*+g[Ea+56+20>>2]+h*ha;m=e;B=i;e=(g[j>>2]=Da,c[j>>2]|0);i=Da;h=p*+g[Ea+56+32>>2]+o*+g[Ea+56+36>>2]+h*na}if(!f)Da=h;else{n=-n;g[Ea>>2]=n;Da=-h;e=(g[j>>2]=-i,c[j>>2]|0)}if((m|0)>6){z=(c[j>>2]=e,+g[j>>2]);i=+g[Ea+56>>2];t=+g[Ea+56+16>>2];v=+g[Ea+56+32>>2];u=(n*i+z*t+Da*v>0.0?1.0:-1.0)*(ia+ka)*2.0*.5;y=+g[k>>2];x=+g[Ea+56+20>>2];h=+g[Ea+56+36>>2];s=(n*y+z*x+Da*h>0.0?1.0:-1.0)*(ja+la)*2.0*.5;w=(n*fa+z*ha+Da*na>0.0?1.0:-1.0)*ma*.5;y=+g[b+48>>2]+u*i+s*y+w*fa;x=+g[b+52>>2]+u*t+s*x+w*ha;w=+g[b+56>>2]+u*v+s*h+w*na;c[Ea+456>>2]=c[b+112>>2];c[Ea+456+4>>2]=c[b+112+4>>2];c[Ea+456+8>>2]=c[b+112+8>>2];h=(n*za+z*pa+Da*va>0.0?-1.0:1.0)*(qa+ta)*2.0*.5;s=(n*ya+z*oa+Da*ua>0.0?-1.0:1.0)*(ra+sa)*2.0*.5;v=+g[Ea+456+4>>2]+h*pa+s*oa;u=+g[Ea+456+8>>2]+h*va+s*ua;t=(n*xa+z*Ba+Da*Ca>0.0?-1.0:1.0)*wa*.5;s=+g[Ea+456>>2]+h*za+s*ya+t*xa;g[Ea+456>>2]=s;g[Ea+456+4>>2]=v+t*Ba;g[Ea+456+8>>2]=u+t*Ca;Aa=m+-7|0;h=+g[Ea+56+(((Aa|0)/3|0)<<2)>>2];i=+g[Ea+56+(((Aa|0)/3|0)+4<<2)>>2];n=+g[Ea+56+(((Aa|0)/3|0)+8<<2)>>2];p=+g[Ea+8+(((Aa|0)%3|0)<<2)>>2];q=+g[Ea+8+(((Aa|0)%3|0)+4<<2)>>2];r=+g[Ea+8+(((Aa|0)%3|0)+8<<2)>>2];o=1.0-(h*p+i*q+n*r)*(h*p+i*q+n*r);if(!(o<=9.999999747378752e-05))h=(((s-y)*h+(v+t*Ba-x)*i+(u+t*Ca-w)*n)*(h*p+i*q+n*r)-((s-y)*p+(v+t*Ba-x)*q+(u+t*Ca-w)*r))*(1.0/o);else h=0.0;g[Ea+456>>2]=s+h*p;g[Ea+456+4>>2]=v+t*Ba+h*q;g[Ea+456+8>>2]=u+t*Ca+h*r;Aa=c[(c[d>>2]|0)+16>>2]|0;g[Ea+424>>2]=-+g[Ea>>2];g[Ea+424+4>>2]=-z;g[Ea+424+8>>2]=-Da;g[Ea+424+12>>2]=0.0;Tb[Aa&15](d,Ea+424|0,Ea+456|0,B);l=Ea;return}ea=(m|0)<4;ga=ea?b+48|0:b+112|0;f=ea?b+112|0:b+48|0;a=ea?Ea+56|0:Ea+8|0;_=ea?Ea+8|0:Ea+56|0;M=ea?Ea+412|0:Ea+400|0;k=ea?Ea+400|0:Ea+412|0;fa=(c[j>>2]=e,+g[j>>2]);if(ea){da=Da;ba=n;ca=fa}else{da=-Da;ba=-n;ca=-fa}U=ba*+g[_>>2]+ca*+g[_+16>>2]+da*+g[_+32>>2];g[Ea+384>>2]=U;V=ba*+g[_+4>>2]+ca*+g[_+20>>2]+da*+g[_+36>>2];g[Ea+384+4>>2]=V;W=ba*+g[_+8>>2]+ca*+g[_+24>>2]+da*+g[_+40>>2];g[Ea+384+8>>2]=W;U=+C(+U);V=+C(+V);W=+C(+W);e=V>U?(V>W?1:2):U>W?0:2;Y=(V>U?V>W:U>W)?2:1;n=+g[k+(e<<2)>>2];h=+g[f>>2]-+g[ga>>2];i=n*+g[_+(e<<2)>>2];o=+g[f+4>>2];p=+g[ga+4>>2];if(+g[Ea+384+(e<<2)>>2]<0.0){aa=+g[f+8>>2]-+g[ga+8>>2]+n*+g[_+((e|8)<<2)>>2];$=h+i;Z=o-p+n*+g[_+((e|4)<<2)>>2]}else{aa=+g[f+8>>2]-+g[ga+8>>2]-n*+g[_+((e|8)<<2)>>2];$=h-i;Z=o-p-n*+g[_+((e|4)<<2)>>2]}J=(ea?-1:-4)+m|0;switch(J|0){case 0:{e=2;f=1;break}case 1:{e=2;f=0;break}default:{e=1;f=0}}K=a+(f<<2)|0;T=+g[K>>2];R=+g[K+16>>2];S=+g[K+32>>2];X=$*T+Z*R+aa*S;K=a+(e<<2)|0;N=+g[K>>2];v=+g[K+16>>2];w=+g[K+32>>2];Q=$*N+Z*v+aa*w;K=_+((U>W&(V>U^1)&1)<<2)|0;P=+g[K>>2];z=+g[K+16>>2];B=+g[K+32>>2];O=+g[_+(Y<<2)>>2];x=+g[_+(Y<<2)+16>>2];y=+g[_+(Y<<2)+32>>2];Ba=+g[k+((U>W&(V>U^1)&1)<<2)>>2];Ca=+g[k+(Y<<2)>>2];za=(T*O+R*x+S*y)*Ca;Ca=(N*O+v*x+w*y)*Ca;g[Ea+352>>2]=X-(T*P+R*z+S*B)*Ba-za;g[Ea+352+4>>2]=Q-(N*P+v*z+w*B)*Ba-Ca;g[Ea+352+8>>2]=X-(T*P+R*z+S*B)*Ba+za;g[Ea+352+12>>2]=Q-(N*P+v*z+w*B)*Ba+Ca;g[Ea+352+16>>2]=X+(T*P+R*z+S*B)*Ba+za;g[Ea+352+20>>2]=Q+(N*P+v*z+w*B)*Ba+Ca;g[Ea+352+24>>2]=X+(T*P+R*z+S*B)*Ba-za;g[Ea+352+28>>2]=Q+(N*P+v*z+w*B)*Ba-Ca;c[Ea+344>>2]=c[M+(f<<2)>>2];c[Ea+344+4>>2]=c[M+(e<<2)>>2];H=0;I=Ea+280|0;e=Ea+352|0;f=4;a:while(1){F=Ea+344+(H<<2)|0;G=1-H|0;do if((f|0)>0){a=I;E=e;k=0;while(1){m=E+(H<<2)|0;h=+g[m>>2];i=+g[F>>2];if(i>-h){c[a>>2]=c[E>>2];c[a+4>>2]=c[E+4>>2];k=k+1|0;if(k&8|0){e=I;f=k;break a}a=a+8|0;h=+g[m>>2];i=+g[F>>2]}A=(f|0)>1;m=E;E=E+8|0;b=A?E:e;n=+g[b+(H<<2)>>2];if(i>-h^i>-n){Ca=+g[m+(G<<2)>>2];g[a+(G<<2)>>2]=Ca+(-i-h)*((+g[b+(G<<2)>>2]-Ca)/(n-h));g[a+(H<<2)>>2]=-+g[F>>2];k=k+1|0;if(!(k&8))a=a+8|0;else{e=I;f=k;break a}}if(!A)break;else f=f+-1|0}e=(I|0)==(Ea+280|0)?Ea+456|0:Ea+280|0;if((k|0)<=0){f=0;break}a=e;E=I;f=0;while(1){m=E+(H<<2)|0;h=+g[m>>2];i=+g[F>>2];if(h>2]=c[E>>2];c[a+4>>2]=c[E+4>>2];f=f+1|0;if(f&8|0)break a;a=a+8|0;h=+g[m>>2];i=+g[F>>2]}A=(k|0)>1;m=E;E=E+8|0;b=A?E:I;n=+g[b+(H<<2)>>2];if(h>2];g[a+(G<<2)>>2]=Ca+(i-h)*((+g[b+(G<<2)>>2]-Ca)/(n-h));c[a+(H<<2)>>2]=c[F>>2];f=f+1|0;if(!(f&8))a=a+8|0;else break a}if(!A)break;else k=k+-1|0}}else{f=0;e=(I|0)==(Ea+280|0)?Ea+456|0:Ea+280|0}while(0);H=H+1|0;if((H|0)>=2)break;else I=(e|0)==(Ea+280|0)?Ea+456|0:Ea+280|0}if((e|0)!=(Ea+280|0))gi(Ea+280|0,e|0,f<<3|0)|0;if((f|0)>=1){u=1.0/((T*P+R*z+S*B)*(N*O+v*x+w*y)-(N*P+v*z+w*B)*(T*O+R*x+S*y));t=+g[M+(J<<2)>>2];p=+g[K>>2];q=+g[_+(Y<<2)>>2];r=+g[_+((U>W&(V>U^1)&1|4)<<2)>>2];s=+g[_+((Y|4)<<2)>>2];o=+g[_+((U>W&(V>U^1)&1|8)<<2)>>2];n=+g[_+((Y|8)<<2)>>2];b=0;a=0;do{e=a<<1;i=+g[Ea+280+(e<<2)>>2];h=+g[Ea+280+((e|1)<<2)>>2];ya=(N*O+v*x+w*y)*u*(i-X)-(T*O+R*x+S*y)*u*(h-Q);Ca=(T*P+R*z+S*B)*u*(h-Q)-(N*P+v*z+w*B)*u*(i-X);e=b*3|0;za=$+ya*p+Ca*q;g[Ea+184+(e<<2)>>2]=za;Ba=Z+ya*r+Ca*s;g[Ea+184+(e+1<<2)>>2]=Ba;Ca=aa+ya*o+Ca*n;g[Ea+184+(e+2<<2)>>2]=Ca;Ca=t-(ba*za+ca*Ba+da*Ca);g[Ea+152+(b<<2)>>2]=Ca;e=b<<1;if(Ca>=0.0){g[Ea+280+(e<<2)>>2]=i;g[Ea+280+((e|1)<<2)>>2]=h;b=b+1|0}a=a+1|0}while((a|0)!=(f|0));b:do if((b|0)>=1){A=(b|0)<4?b:4;E=(A|0)>1?A:1;if((b|0)<=(E|0))if(ea){h=-Da;e=0;while(1){Aa=e*3|0;g[Ea+456>>2]=+g[Ea+184+(Aa<<2)>>2]+ +g[ga>>2];g[Ea+456+4>>2]=+g[Ea+184+(Aa+1<<2)>>2]+ +g[ga+4>>2];g[Ea+456+8>>2]=+g[Ea+184+(Aa+2<<2)>>2]+ +g[ga+8>>2];Aa=c[(c[d>>2]|0)+16>>2]|0;g[Ea+424>>2]=-+g[Ea>>2];g[Ea+424+4>>2]=-fa;g[Ea+424+8>>2]=h;g[Ea+424+12>>2]=0.0;Tb[Aa&15](d,Ea+424|0,Ea+456|0,-+g[Ea+152+(e<<2)>>2]);e=e+1|0;if((e|0)==(b|0))break b}}else{h=-Da;e=0;while(1){Aa=e*3|0;Ca=+g[Ea+152+(e<<2)>>2];Ba=+g[Ea>>2];g[Ea+456>>2]=+g[Ea+184+(Aa<<2)>>2]+ +g[ga>>2]-Ba*Ca;g[Ea+456+4>>2]=+g[Ea+184+(Aa+1<<2)>>2]+ +g[ga+4>>2]-fa*Ca;g[Ea+456+8>>2]=+g[Ea+184+(Aa+2<<2)>>2]+ +g[ga+8>>2]-Da*Ca;Aa=c[(c[d>>2]|0)+16>>2]|0;g[Ea+424>>2]=-Ba;g[Ea+424+4>>2]=-fa;g[Ea+424+8>>2]=h;g[Ea+424+12>>2]=0.0;Tb[Aa&15](d,Ea+424|0,Ea+456|0,-Ca);e=e+1|0;if((e|0)==(b|0))break b}}c:do if((b|0)>1){h=+g[Ea+152>>2];e=0;f=1;while(1){i=+g[Ea+152+(f<<2)>>2];a=i>h;e=a?f:e;f=f+1|0;if((f|0)==(b|0))break;else h=a?i:h}switch(b|0){case 1:{f=1;a=Ea+120|0;k=Ea+120|0;Aa=111;break c}case 2:{h=(+g[Ea+280+4>>2]+ +g[Ea+280+12>>2])*.5;i=(+g[Ea+280>>2]+ +g[Ea+280+8>>2])*.5;f=2;a=Ea+120|0;k=Ea+120|0;Aa=114;break c}default:{}}a=b+-1|0;r=0.0;s=0.0;h=0.0;f=0;do{_=f<<1;ya=+g[Ea+280+(_<<2)>>2];za=+g[Ea+280+(_+3<<2)>>2];Ba=+g[Ea+280+(_+2<<2)>>2];Ca=+g[Ea+280+((_|1)<<2)>>2];h=h+(ya*za-Ba*Ca);s=s+(ya+Ba)*(ya*za-Ba*Ca);r=r+(za+Ca)*(ya*za-Ba*Ca);f=f+1|0}while((f|0)!=(a|0));_=b<<1;n=+g[Ea+280+(_+-2<<2)>>2];o=+g[Ea+280+4>>2];p=+g[Ea+280>>2];q=+g[Ea+280+(_+-1<<2)>>2];i=h+(n*o-p*q);_=+C(+i)>1.1920928955078125e-07;i=_?1.0/(i*3.0):999999984306749440.0;if((b|0)>0){h=i*(r+(n*o-p*q)*(q+o));i=i*(s+(n*o-p*q)*(n+p));a=Ea+120|0;k=Ea+120|0;m=Ea+456|0;Aa=117;break}m=e;e=Ea+120|0;f=0}else{e=0;f=b;a=Ea+120|0;k=Ea+120|0;Aa=111}while(0);if((Aa|0)==111){h=+g[Ea+280+4>>2];i=+g[Ea+280>>2];Aa=114}if((Aa|0)==114){b=f;m=Ea+456|0;Aa=117}if((Aa|0)==117){f=0;do{Aa=f<<1;g[Ea+456+(f<<2)>>2]=+L(+(+g[Ea+280+((Aa|1)<<2)>>2]-h),+(+g[Ea+280+(Aa<<2)>>2]-i));f=f+1|0}while((f|0)!=(b|0));f=0;do{c[Ea+424+(f<<2)>>2]=1;f=f+1|0}while((f|0)!=(b|0));m=e;e=a;f=1}a=Ea+424+(m<<2)|0;c[a>>2]=0;c[e>>2]=m;d:do if((A|0)>1){o=+g[Ea+456+(m<<2)>>2];if(f){f=1;a=Ea+120+4|0}else{e=1;f=Ea+120+4|0;while(1){c[f>>2]=m;c[a>>2]=0;e=e+1|0;if((e|0)==(E|0))break d;else f=f+4|0}}while(1){n=6.2831854820251465/+(E|0)*+(f|0)+o;n=n>3.1415927410125732?n+-6.2831854820251465:n;c[a>>2]=m;i=1.0e9;k=0;e=m;while(1){do if(!(c[Ea+424+(k<<2)>>2]|0))h=i;else{h=+C(+(+g[Ea+456+(k<<2)>>2]-n));h=h>3.1415927410125732?6.2831854820251465-h:h;if(!(h>2]=k;e=k}while(0);k=k+1|0;if((k|0)==(b|0))break;else i=h}c[Ea+424+(e<<2)>>2]=0;f=f+1|0;if((f|0)==(E|0))break;else a=a+4|0}}while(0);if((E|0)>0){h=-Da;if(ea){e=0;do{Aa=c[Ea+120+(e<<2)>>2]|0;g[Ea+456>>2]=+g[Ea+184+(Aa*3<<2)>>2]+ +g[ga>>2];g[Ea+456+4>>2]=+g[Ea+184+((Aa*3|0)+1<<2)>>2]+ +g[ga+4>>2];g[Ea+456+8>>2]=+g[Ea+184+((Aa*3|0)+2<<2)>>2]+ +g[ga+8>>2];ea=c[(c[d>>2]|0)+16>>2]|0;g[Ea+424>>2]=-+g[Ea>>2];g[Ea+424+4>>2]=-fa;g[Ea+424+8>>2]=h;g[Ea+424+12>>2]=0.0;Tb[ea&15](d,Ea+424|0,Ea+456|0,-+g[Ea+152+(Aa<<2)>>2]);e=e+1|0}while((e|0)<(E|0))}else{e=0;do{ea=c[Ea+120+(e<<2)>>2]|0;xa=+g[Ea+184+(ea*3<<2)>>2]+ +g[ga>>2];g[Ea+456>>2]=xa;za=+g[Ea+184+((ea*3|0)+1<<2)>>2]+ +g[ga+4>>2];g[Ea+456+4>>2]=za;Ba=+g[Ea+184+((ea*3|0)+2<<2)>>2]+ +g[ga+8>>2];g[Ea+456+8>>2]=Ba;Aa=c[(c[d>>2]|0)+16>>2]|0;ya=+g[Ea>>2];g[Ea+424>>2]=-ya;g[Ea+424+4>>2]=-fa;g[Ea+424+8>>2]=h;g[Ea+424+12>>2]=0.0;Ca=+g[Ea+152+(ea<<2)>>2];g[Ea+104>>2]=xa-ya*Ca;g[Ea+104+4>>2]=za-Ca*fa;g[Ea+104+8>>2]=Ba-Ca*Da;g[Ea+104+12>>2]=0.0;Tb[Aa&15](d,Ea+424|0,Ea+104|0,-Ca);e=e+1|0}while((e|0)<(E|0))}}}while(0)}l=Ea;return}function qc(b,d,e,f,h,i,j,k,m){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0.0,_=0.0,$=0.0,aa=0,ba=0;Y=l;l=l+256|0;c[b+188>>2]=-1;m=c[k+72>>2]|0;if((m|0)!=(c[b+224>>2]|0)){c[b+212>>2]=14;c[b+216>>2]=15;c[b+220>>2]=16;c[b+224>>2]=m}c[b+184>>2]=0;if((e|0)>0){m=0;do{c[(c[d+(m<<2)>>2]|0)+212>>2]=-1;m=m+1|0}while((m|0)!=(e|0))}m=c[b+12>>2]|0;if((m|0)>(e|0)){o=b+8|0;n=m}else{if((e+1|0)!=0?(c[6995]=(c[6995]|0)+1,n=sc(((e+1|0)*244|3)+16|0)|0,(n|0)!=0):0){c[(n+4+15&-16)+-4>>2]=n;o=n+4+15&-16}else o=0;n=c[b+8>>2]|0;if((n|0)>0){m=0;do{V=o+(m*244|0)|0;W=c[b+16>>2]|0;U=W+(m*244|0)|0;c[V>>2]=c[U>>2];c[V+4>>2]=c[U+4>>2];c[V+8>>2]=c[U+8>>2];c[V+12>>2]=c[U+12>>2];V=W+(m*244|0)+16|0;U=o+(m*244|0)+16|0;c[U>>2]=c[V>>2];c[U+4>>2]=c[V+4>>2];c[U+8>>2]=c[V+8>>2];c[U+12>>2]=c[V+12>>2];U=W+(m*244|0)+32|0;V=o+(m*244|0)+32|0;c[V>>2]=c[U>>2];c[V+4>>2]=c[U+4>>2];c[V+8>>2]=c[U+8>>2];c[V+12>>2]=c[U+12>>2];V=o+(m*244|0)+48|0;U=W+(m*244|0)+48|0;c[V>>2]=c[U>>2];c[V+4>>2]=c[U+4>>2];c[V+8>>2]=c[U+8>>2];c[V+12>>2]=c[U+12>>2];gi(o+(m*244|0)+64|0,W+(m*244|0)+64|0,180)|0;m=m+1|0}while((m|0)!=(n|0))}m=c[b+16>>2]|0;if(m|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[m+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=o;c[b+12>>2]=e+1;o=b+8|0;n=e+1|0}Yk(Y|0,0,244)|0;m=c[o>>2]|0;if((m|0)<0){if((n|0)<0){n=c[b+16>>2]|0;if(n|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=0;c[b+12>>2]=0}do{W=c[b+16>>2]|0;V=W+(m*244|0)|0;c[V>>2]=c[Y>>2];c[V+4>>2]=c[Y+4>>2];c[V+8>>2]=c[Y+8>>2];c[V+12>>2]=c[Y+12>>2];V=W+(m*244|0)+16|0;c[V>>2]=c[Y+16>>2];c[V+4>>2]=c[Y+16+4>>2];c[V+8>>2]=c[Y+16+8>>2];c[V+12>>2]=c[Y+16+12>>2];V=W+(m*244|0)+32|0;c[V>>2]=c[Y+32>>2];c[V+4>>2]=c[Y+32+4>>2];c[V+8>>2]=c[Y+32+8>>2];c[V+12>>2]=c[Y+32+12>>2];V=W+(m*244|0)+48|0;c[V>>2]=c[Y+48>>2];c[V+4>>2]=c[Y+48+4>>2];c[V+8>>2]=c[Y+48+8>>2];c[V+12>>2]=c[Y+48+12>>2];gi(W+(m*244|0)+64|0,Y+64|0,180)|0;m=m+1|0}while((m|0)!=0)}c[o>>2]=0;if((e|0)>0){n=0;do{p=d+(n<<2)|0;o=Rj(b,c[p>>2]|0,+g[k+12>>2])|0;p=c[p>>2]|0;if(!((p|0)==0?1:(c[p+252>>2]&2|0)==0)?+g[p+404>>2]!=0.0:0){r=c[b+16>>2]|0;m=c[p+564>>2]|0;if(m&2){q=+g[k+84>>2];M=+g[p+456>>2];O=+g[p+460>>2];s=+g[p+464>>2];G=+g[p+4>>2];M=M!=0.0?1.0/M:0.0;H=+g[p+8>>2];O=O!=0.0?1.0/O:0.0;I=+g[p+12>>2];s=s!=0.0?1.0/s:0.0;J=+g[p+20>>2];K=+g[p+24>>2];L=+g[p+28>>2];N=+g[p+36>>2];P=+g[p+40>>2];v=+g[p+44>>2];w=+g[p+388>>2];x=+g[p+392>>2];u=+g[p+396>>2];y=(M*G*G+O*H*H+s*I*I)*w+(M*G*J+O*H*K+s*I*L)*x+(M*G*N+O*H*P+s*I*v)*u;z=(M*J*G+O*K*H+s*L*I)*w+(M*J*J+O*K*K+s*L*L)*x+(M*J*N+O*K*P+s*L*v)*u;v=(M*N*G+O*P*H+s*v*I)*w+(M*N*J+O*P*K+s*v*L)*x+(M*N*N+O*P*P+s*v*v)*u;s=(x*v-u*z)*(x*v-u*z)+(u*y-w*v)*(u*y-w*v)+(w*z-x*y)*(w*z-x*y);if(s>q*q){q=1.0/+D(+s)*q;t=(x*v-u*z)*q;s=q*(u*y-w*v);q=q*(w*z-x*y)}else{t=x*v-u*z;s=u*y-w*v;q=w*z-x*y}N=+g[k+12>>2];O=(t*+g[p+328>>2]+s*+g[p+344>>2]+q*+g[p+360>>2])*N;P=N*(t*+g[p+332>>2]+s*+g[p+348>>2]+q*+g[p+364>>2]);g[r+(o*244|0)+224>>2]=+g[r+(o*244|0)+224>>2]-(t*+g[p+324>>2]+s*+g[p+340>>2]+q*+g[p+356>>2])*N;g[r+(o*244|0)+228>>2]=+g[r+(o*244|0)+228>>2]-O;g[r+(o*244|0)+232>>2]=+g[r+(o*244|0)+232>>2]-P;m=c[p+564>>2]|0}if(m&4){H=+g[k+12>>2];s=+g[p+456>>2];N=+g[p+460>>2];L=+g[p+464>>2];E=+g[p+388>>2];x=+g[p+392>>2];P=+g[p+396>>2];K=+g[p+4>>2];s=s!=0.0?1.0/s:0.0;w=+g[p+8>>2];N=N!=0.0?1.0/N:0.0;y=+g[p+12>>2];L=L!=0.0?1.0/L:0.0;q=+g[p+20>>2];J=+g[p+24>>2];B=+g[p+28>>2];M=+g[p+36>>2];I=+g[p+40>>2];t=+g[p+44>>2];z=s*K*K+N*w*w+L*y*y;G=s*K*q+N*w*J+L*y*B;u=s*K*M+N*w*I+L*y*t;A=s*q*K+N*J*w+L*B*y;F=s*q*q+N*J*J+L*B*B;v=s*q*M+N*J*I+L*B*t;y=s*M*K+N*I*w+L*t*y;B=s*M*q+N*I*J+L*t*B;t=s*M*M+N*I*I+L*t*t;L=E*z+x*G+P*u+(x*(E*y+x*B+P*t)-P*(E*A+x*F+P*v))*H-(H*0.0+(E*z+x*G+P*u));I=E*A+x*F+P*v+(P*(E*z+x*G+P*u)-E*(E*y+x*B+P*t))*H-(H*0.0+(E*A+x*F+P*v));N=E*y+x*B+P*t+(E*(E*A+x*F+P*v)-x*(E*z+x*G+P*u))*H-(H*0.0+(E*y+x*B+P*t));M=G+(E*y+x*B+P*t+(x*B+(G*0.0+F*-P)))*H;s=u+(x*t+(u*0.0+v*-P)-(E*A+x*F+P*v))*H;J=A+(y*-E+(A*0.0+P*z)-(E*y+x*B+P*t))*H;q=v+(E*z+x*G+P*u+(t*-E+(v*0.0+P*u)))*H;w=y+(y*0.0+(z*-x+E*A)+(E*A+x*F+P*v))*H;K=B+(B*0.0+(G*-x+E*F)-(E*z+x*G+P*u))*H;_=(F+(B*-E+(F*0.0+P*G))*H)*(t+(t*0.0+(u*-x+E*v))*H)-K*q;Z=K*s-M*(t+(t*0.0+(u*-x+E*v))*H);$=M*q-(F+(B*-E+(F*0.0+P*G))*H)*s;O=w*$+((z+(x*y+(z*0.0+A*-P))*H)*_+J*Z);m=+C(+O)>1.1920928955078125e-07;O=m?1.0/O:O;g[r+(o*244|0)+224>>2]=E-(N*$+(L*_+I*Z))*O-E+ +g[r+(o*244|0)+224>>2];g[r+(o*244|0)+228>>2]=x-(w*(q*L-s*I)+((z+(x*y+(z*0.0+A*-P))*H)*((t+(t*0.0+(u*-x+E*v))*H)*I-q*N)+J*(s*N-(t+(t*0.0+(u*-x+E*v))*H)*L)))*O-x+ +g[r+(o*244|0)+228>>2];g[r+(o*244|0)+232>>2]=P-(w*(M*I-(F+(B*-E+(F*0.0+P*G))*H)*L)+((z+(x*y+(z*0.0+A*-P))*H)*((F+(B*-E+(F*0.0+P*G))*H)*N-K*I)+J*(K*L-M*N)))*O-P+ +g[r+(o*244|0)+232>>2];m=c[p+564>>2]|0}if(m&8|0){O=+g[k+12>>2];z=+g[p+456>>2];A=+g[p+460>>2];w=+g[p+464>>2];J=+g[p+388>>2];K=+g[p+392>>2];$=+g[p+396>>2];yh(p+4|0,Y);_=+g[Y>>2];L=+g[Y+4>>2];M=+g[Y+8>>2];B=+g[Y+12>>2];F=M*(J*-M+K*B-$*-_)+(_*(-(J*-_)-K*-L-$*-M)+B*($*-L+J*B-K*-M))-L*(K*-_+$*B-J*-L);H=_*(K*-_+$*B-J*-L)+(L*(-(J*-_)-K*-L-$*-M)+B*(J*-M+K*B-$*-_))-M*($*-L+J*B-K*-M);B=L*($*-L+J*B-K*-M)+(M*(-(J*-_)-K*-L-$*-M)+B*(K*-_+$*B-J*-L))-_*(J*-M+K*B-$*-_);z=z!=0.0?1.0/z:0.0;I=B*0.0+(z*F+H*0.0);A=A!=0.0?1.0/A:0.0;G=B*0.0+(F*0.0+A*H);w=w!=0.0?1.0/w:0.0;E=w*B+(F*0.0+H*0.0);x=z+(H*0.0+(z*0.0+B*-0.0))*O;y=A+(F*-0.0+(A*0.0+B*0.0))*O;P=w+(w*0.0+(H*-0.0+F*0.0))*O;v=y*P-((H*-0.0+A*F+0.0-I)*O+0.0)*((B*0.0+0.0-w*F+I)*O+0.0);N=((H*-0.0+A*F+0.0-I)*O+0.0)*((w*H+(B*-0.0+0.0)-G)*O+0.0)-P*((H*0.0+(0.0-A*B)+E)*O+0.0);u=((H*0.0+(0.0-A*B)+E)*O+0.0)*((B*0.0+0.0-w*F+I)*O+0.0)-y*((w*H+(B*-0.0+0.0)-G)*O+0.0);Z=((F*0.0-z*H+0.0+G)*O+0.0)*u+(x*v+((F*-0.0+(z*B+0.0)-E)*O+0.0)*N);W=+C(+Z)>1.1920928955078125e-07;Z=W?1.0/Z:Z;N=F-((F*G-H*I)*O*u+((H*E-B*G)*O*v+(B*I-F*E)*O*N))*Z;P=H-(((F*0.0-z*H+0.0+G)*O+0.0)*(((B*0.0+0.0-w*F+I)*O+0.0)*(H*E-B*G)*O-((w*H+(B*-0.0+0.0)-G)*O+0.0)*(B*I-F*E)*O)+(x*(P*(B*I-F*E)*O-((B*0.0+0.0-w*F+I)*O+0.0)*(F*G-H*I)*O)+((F*-0.0+(z*B+0.0)-E)*O+0.0)*(((w*H+(B*-0.0+0.0)-G)*O+0.0)*(F*G-H*I)*O-P*(H*E-B*G)*O)))*Z;Z=B-(((F*0.0-z*H+0.0+G)*O+0.0)*(((H*0.0+(0.0-A*B)+E)*O+0.0)*(B*I-F*E)*O-y*(H*E-B*G)*O)+(x*(y*(F*G-H*I)*O-((H*-0.0+A*F+0.0-I)*O+0.0)*(B*I-F*E)*O)+((F*-0.0+(z*B+0.0)-E)*O+0.0)*(((H*-0.0+A*F+0.0-I)*O+0.0)*(H*E-B*G)*O-((H*0.0+(0.0-A*B)+E)*O+0.0)*(F*G-H*I)*O)))*Z;O=+g[Y+12>>2];g[r+(o*244|0)+224>>2]=(M*N+O*P-_*Z)*-M+(O*(O*N+L*Z-M*P)+(-(_*N)-L*P-M*Z)*-_)-(O*Z+_*P-L*N)*-L-J+ +g[r+(o*244|0)+224>>2];g[r+(o*244|0)+228>>2]=(O*Z+_*P-L*N)*-_+(O*(M*N+O*P-_*Z)+(-(_*N)-L*P-M*Z)*-L)-(O*N+L*Z-M*P)*-M-K+ +g[r+(o*244|0)+228>>2];g[r+(o*244|0)+232>>2]=(O*N+L*Z-M*P)*-L+((-(_*N)-L*P-M*Z)*-M+O*(O*Z+_*P-L*N))-(M*N+O*P-_*Z)*-_-$+ +g[r+(o*244|0)+232>>2]}}n=n+1|0}while((n|0)!=(e|0))}if((j|0)>0){m=0;do{W=c[i+(m<<2)>>2]|0;Ib[c[(c[W>>2]|0)+8>>2]&511](W);g[W+36>>2]=0.0;m=m+1|0}while((m|0)<(j|0))}n=c[b+168>>2]|0;if((n|0)<(j|0)?(c[b+172>>2]|0)<(j|0):0){if(!j)m=0;else{c[6995]=(c[6995]|0)+1;m=sc((j<<3|3)+16|0)|0;if(!m)m=0;else{c[(m+4+15&-16)+-4>>2]=m;m=m+4+15&-16}n=c[b+168>>2]|0}if((n|0)>0){o=0;do{U=(c[b+176>>2]|0)+(o<<3)|0;V=c[U+4>>2]|0;W=m+(o<<3)|0;c[W>>2]=c[U>>2];c[W+4>>2]=V;o=o+1|0}while((o|0)!=(n|0))}n=c[b+176>>2]|0;if(n|0){if(a[b+180>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}c[b+176>>2]=0}a[b+180>>0]=1;c[b+176>>2]=m;c[b+172>>2]=j}c[b+168>>2]=j;if((j|0)>0){m=0;e=0;do{r=c[b+176>>2]|0;d=r+(e<<3)|0;p=i+(e<<2)|0;n=c[p>>2]|0;o=c[n+44>>2]|0;if(o){n=o+64|0;do{c[o>>2]=0;o=o+4|0}while((o|0)<(n|0));n=c[p>>2]|0}if(!(a[n+20>>0]|0)){c[d>>2]=0;c[r+(e<<3)+4>>2]=0;n=0}else{Ob[c[(c[n>>2]|0)+16>>2]&127](n,d);n=c[d>>2]|0}m=n+m|0;e=e+1|0}while((e|0)<(j|0));p=m}else p=0;n=c[b+48>>2]|0;if((n|0)<(p|0)?(c[b+52>>2]|0)<(p|0):0){if(!p)m=0;else{c[6995]=(c[6995]|0)+1;m=sc((p*152|3)+16|0)|0;if(!m)m=0;else{c[(m+4+15&-16)+-4>>2]=m;m=m+4+15&-16}n=c[b+48>>2]|0}if((n|0)>0){o=0;do{gi(m+(o*152|0)|0,(c[b+56>>2]|0)+(o*152|0)|0,152)|0;o=o+1|0}while((o|0)!=(n|0))}n=c[b+56>>2]|0;if(n|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=m;c[b+52>>2]=p}c[b+48>>2]=p;if((j|0)>0){V=0;W=0;m=c[b+176>>2]|0;while(1){U=m+(W<<3)|0;if(!(c[U>>2]|0))n=0;else{n=c[b+56>>2]|0;p=n+(V*152|0)|0;r=i+(W<<2)|0;d=c[r>>2]|0;e=c[d+28>>2]|0;Q=c[d+32>>2]|0;R=Rj(b,e,+g[k+12>>2])|0;S=Rj(b,Q,+g[k+12>>2])|0;T=c[b+16>>2]|0;o=c[d+24>>2]|0;o=(o|0)>0?o:c[k+20>>2]|0;if((o|0)>(c[b+184>>2]|0))c[b+184>>2]=o;if((c[U>>2]|0)>0){m=0;do{Yk(p+(m*152|0)|0,0,152)|0;g[p+(m*152|0)+120>>2]=-3402823466385288598117041.0e14;g[p+(m*152|0)+124>>2]=3402823466385288598117041.0e14;g[p+(m*152|0)+100>>2]=0.0;g[p+(m*152|0)+96>>2]=0.0;c[p+(m*152|0)+144>>2]=R;c[p+(m*152|0)+148>>2]=S;c[p+(m*152|0)+136>>2]=o;m=m+1|0}while((m|0)<(c[U>>2]|0))}c[T+(R*244|0)+64>>2]=0;c[T+(R*244|0)+64+4>>2]=0;c[T+(R*244|0)+64+8>>2]=0;c[T+(R*244|0)+64+12>>2]=0;c[T+(R*244|0)+64+16>>2]=0;c[T+(R*244|0)+64+20>>2]=0;c[T+(R*244|0)+64+24>>2]=0;c[T+(R*244|0)+64+28>>2]=0;c[T+(R*244|0)+144>>2]=0;c[T+(R*244|0)+144+4>>2]=0;c[T+(R*244|0)+144+8>>2]=0;c[T+(R*244|0)+144+12>>2]=0;c[T+(R*244|0)+144+16>>2]=0;c[T+(R*244|0)+144+20>>2]=0;c[T+(R*244|0)+144+24>>2]=0;c[T+(R*244|0)+144+28>>2]=0;c[T+(S*244|0)+64>>2]=0;c[T+(S*244|0)+64+4>>2]=0;c[T+(S*244|0)+64+8>>2]=0;c[T+(S*244|0)+64+12>>2]=0;c[T+(S*244|0)+64+16>>2]=0;c[T+(S*244|0)+64+20>>2]=0;c[T+(S*244|0)+64+24>>2]=0;c[T+(S*244|0)+64+28>>2]=0;c[T+(S*244|0)+144>>2]=0;c[T+(S*244|0)+144+4>>2]=0;c[T+(S*244|0)+144+8>>2]=0;c[T+(S*244|0)+144+12>>2]=0;c[T+(S*244|0)+144+16>>2]=0;c[T+(S*244|0)+144+20>>2]=0;c[T+(S*244|0)+144+24>>2]=0;c[T+(S*244|0)+144+28>>2]=0;g[Y>>2]=1.0/+g[k+12>>2];c[Y+4>>2]=c[k+32>>2];c[Y+8>>2]=n+(V*152|0)+16;c[Y+12>>2]=p;c[Y+16>>2]=n+(V*152|0)+48;c[Y+20>>2]=n+(V*152|0)+32;c[Y+24>>2]=38;c[Y+28>>2]=n+(V*152|0)+112;o=n+(V*152|0)+116|0;c[o>>2]=c[k+40>>2];c[Y+48>>2]=c[k+4>>2];c[Y+32>>2]=o;c[Y+36>>2]=n+(V*152|0)+120;c[Y+40>>2]=n+(V*152|0)+124;c[Y+44>>2]=c[k+20>>2];o=c[r>>2]|0;Ob[c[(c[o>>2]|0)+20>>2]&127](o,Y);if((c[U>>2]|0)>0){n=0;do{m=p+(n*152|0)+124|0;q=+g[(c[r>>2]|0)+16>>2];if(+g[m>>2]>=q)g[m>>2]=q;m=p+(n*152|0)+120|0;if(+g[m>>2]<=-q)g[m>>2]=-q;c[p+(n*152|0)+132>>2]=d;aa=p+(n*152|0)|0;ba=c[d+28>>2]|0;$=+g[aa>>2];Z=+g[aa+4>>2];_=+g[aa+8>>2];q=($*+g[ba+340>>2]+Z*+g[ba+344>>2]+_*+g[ba+348>>2])*+g[ba+608>>2];s=($*+g[ba+356>>2]+Z*+g[ba+360>>2]+_*+g[ba+364>>2])*+g[ba+612>>2];o=p+(n*152|0)+64|0;g[o>>2]=(+g[ba+324>>2]*$+ +g[ba+328>>2]*Z+ +g[ba+332>>2]*_)*+g[ba+604>>2];g[o+4>>2]=q;g[o+8>>2]=s;g[o+12>>2]=0.0;o=p+(n*152|0)+32|0;ba=c[d+32>>2]|0;s=+g[o>>2];q=+g[o+4>>2];_=+g[o+8>>2];Z=(s*+g[ba+340>>2]+q*+g[ba+344>>2]+_*+g[ba+348>>2])*+g[ba+608>>2];$=(s*+g[ba+356>>2]+q*+g[ba+360>>2]+_*+g[ba+364>>2])*+g[ba+612>>2];m=p+(n*152|0)+80|0;g[m>>2]=(+g[ba+324>>2]*s+ +g[ba+328>>2]*q+ +g[ba+332>>2]*_)*+g[ba+604>>2];g[m+4>>2]=Z;g[m+8>>2]=$;g[m+12>>2]=0.0;m=p+(n*152|0)+16|0;$=+g[e+404>>2];Z=+g[m>>2];_=+g[m+4>>2];q=+g[m+8>>2];s=+g[aa>>2];t=+g[aa+4>>2];u=+g[aa+8>>2];aa=p+(n*152|0)+48|0;B=+g[Q+404>>2];v=+g[aa>>2];w=+g[aa+4>>2];x=+g[aa+8>>2];y=+g[o>>2];z=+g[o+4>>2];A=+g[o+8>>2];B=Z*$*Z+_*$*_+q*$*q+(s*(+g[e+324>>2]*s+ +g[e+328>>2]*t+ +g[e+332>>2]*u)+t*(s*+g[e+340>>2]+t*+g[e+344>>2]+u*+g[e+348>>2])+u*(s*+g[e+356>>2]+t*+g[e+360>>2]+u*+g[e+364>>2]))+(v*B*v+w*B*w+x*B*x)+(y*(+g[Q+324>>2]*y+ +g[Q+328>>2]*z+ +g[Q+332>>2]*A)+z*(y*+g[Q+340>>2]+z*+g[Q+344>>2]+A*+g[Q+348>>2])+A*(y*+g[Q+356>>2]+z*+g[Q+360>>2]+A*+g[Q+364>>2]));o=+C(+B)>1.1920928955078125e-07;B=o?1.0/B:0.0;g[p+(n*152|0)+108>>2]=B;if(!(c[T+(R*244|0)+240>>2]|0)){E=0.0;F=0.0;G=0.0;H=0.0;I=0.0;J=0.0}else{E=+g[T+(R*244|0)+208>>2];F=+g[T+(R*244|0)+212>>2];G=+g[T+(R*244|0)+216>>2];H=+g[T+(R*244|0)+224>>2];I=+g[T+(R*244|0)+228>>2];J=+g[T+(R*244|0)+232>>2]}if(!(c[T+(S*244|0)+240>>2]|0)){K=0.0;L=0.0;M=0.0;N=0.0;O=0.0;P=0.0}else{K=+g[T+(S*244|0)+208>>2];L=+g[T+(S*244|0)+212>>2];M=+g[T+(S*244|0)+216>>2];N=+g[T+(S*244|0)+224>>2];O=+g[T+(S*244|0)+228>>2];P=+g[T+(S*244|0)+232>>2]}ba=p+(n*152|0)+112|0;g[ba>>2]=+g[ba>>2]*B+B*(0.0-+g[Y+48>>2]*((E+ +g[e+372>>2])*+g[m>>2]+(F+ +g[e+376>>2])*+g[m+4>>2]+(G+ +g[e+380>>2])*q+((H+ +g[e+388>>2])*s+(I+ +g[e+392>>2])*t+(J+ +g[e+396>>2])*u)+((K+ +g[Q+372>>2])*v+(L+ +g[Q+376>>2])*w+(M+ +g[Q+380>>2])*x+((N+ +g[Q+388>>2])*y+(O+ +g[Q+392>>2])*z+(P+ +g[Q+396>>2])*A))));g[p+(n*152|0)+100>>2]=0.0;n=n+1|0}while((n|0)<(c[U>>2]|0))}m=c[b+176>>2]|0;n=c[m+(W<<3)>>2]|0}W=W+1|0;if((W|0)>=(j|0))break;else V=n+V|0}}Vb[c[(c[b>>2]|0)+28>>2]&127](b,f,h,k);r=c[b+48>>2]|0;d=c[b+28>>2]|0;e=c[b+68>>2]|0;n=c[b+128>>2]|0;if((n|0)<(r|0)?(c[b+132>>2]|0)<(r|0):0){if(!r)m=0;else{c[6995]=(c[6995]|0)+1;m=sc((r<<2|3)+16|0)|0;if(!m)m=0;else{c[(m+4+15&-16)+-4>>2]=m;m=m+4+15&-16}n=c[b+128>>2]|0}p=c[b+136>>2]|0;if((n|0)<=0)if(!p)n=b+140|0;else X=105;else{o=0;do{c[m+(o<<2)>>2]=c[p+(o<<2)>>2];o=o+1|0}while((o|0)!=(n|0));X=105}if((X|0)==105){if(a[b+140>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}c[b+136>>2]=0;n=b+140|0}a[n>>0]=1;c[b+136>>2]=m;c[b+132>>2]=r}c[b+128>>2]=r;if(!(c[k+72>>2]&16)){n=c[b+108>>2]|0;if((n|0)<(d|0)?(c[b+112>>2]|0)<(d|0):0){if(!d)m=0;else{c[6995]=(c[6995]|0)+1;m=sc((d<<2|3)+16|0)|0;if(!m)m=0;else{c[(m+4+15&-16)+-4>>2]=m;m=m+4+15&-16}n=c[b+108>>2]|0}p=c[b+116>>2]|0;if((n|0)<=0)if(!p)n=b+120|0;else X=135;else{o=0;do{c[m+(o<<2)>>2]=c[p+(o<<2)>>2];o=o+1|0}while((o|0)!=(n|0));X=135}if((X|0)==135){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}c[b+116>>2]=0;n=b+120|0}a[n>>0]=1;c[b+116>>2]=m;c[b+112>>2]=d}c[b+108>>2]=d}else{n=c[b+108>>2]|0;if((n|0)<(d<<1|0)?(c[b+112>>2]|0)<(d<<1|0):0){if(!d)m=0;else{c[6995]=(c[6995]|0)+1;m=sc((d<<3|3)+16|0)|0;if(!m)m=0;else{c[(m+4+15&-16)+-4>>2]=m;m=m+4+15&-16}n=c[b+108>>2]|0}p=c[b+116>>2]|0;if((n|0)<=0)if(!p)n=b+120|0;else X=120;else{o=0;do{c[m+(o<<2)>>2]=c[p+(o<<2)>>2];o=o+1|0}while((o|0)!=(n|0));X=120}if((X|0)==120){if(a[b+120>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}c[b+116>>2]=0;n=b+120|0}a[n>>0]=1;c[b+116>>2]=m;c[b+112>>2]=d<<1}c[b+108>>2]=d<<1}n=c[b+148>>2]|0;if((n|0)<(e|0)?(c[b+152>>2]|0)<(e|0):0){if(!e)m=0;else{c[6995]=(c[6995]|0)+1;m=sc((e<<2|3)+16|0)|0;if(!m)m=0;else{c[(m+4+15&-16)+-4>>2]=m;m=m+4+15&-16}n=c[b+148>>2]|0}p=c[b+156>>2]|0;if((n|0)<=0)if(!p)n=b+160|0;else X=150;else{o=0;do{c[m+(o<<2)>>2]=c[p+(o<<2)>>2];o=o+1|0}while((o|0)!=(n|0));X=150}if((X|0)==150){if(a[b+160>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}c[b+156>>2]=0;n=b+160|0}a[n>>0]=1;c[b+156>>2]=m;c[b+152>>2]=e}c[b+148>>2]=e;if((r|0)>0){n=c[b+136>>2]|0;m=0;do{c[n+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(r|0))}if((d|0)>0){n=c[b+116>>2]|0;m=0;do{c[n+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(d|0))}if((e|0)<=0){l=Y;return 0.0}n=c[b+156>>2]|0;m=0;do{c[n+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(e|0));l=Y;return 0.0}function rc(a,b,d,e,f){a=a|0;b=b|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,v=0,w=0,x=0,y=0,z=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,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;V=c[e>>2]|0;fa=c[f>>2]|0;if(V|0)g=c[V+12>>2]|0;else g=b;h=c[g+88>>2]|0;i=c[g+92>>2]|0;j=c[g+96>>2]|0;if(!fa)g=d;else g=c[fa+12>>2]|0;r=c[g+88>>2]|0;p=c[g+92>>2]|0;q=c[g+96>>2]|0;Z=c[b+88>>2]|0;da=(c[d+88>>2]|0)-Z|0;u=c[b+92>>2]|0;ea=(c[d+92>>2]|0)-u|0;l=c[b+96>>2]|0;W=(c[d+96>>2]|0)-l|0;Y=c[(V|0?V:fa)+12>>2]|0;_=(c[Y+88>>2]|0)-Z|0;U=(c[Y+92>>2]|0)-u|0;Y=(c[Y+96>>2]|0)-l|0;X=(P(U,W)|0)-(P(Y,ea)|0)|0;Y=(P(Y,da)|0)-(P(_,W)|0)|0;U=(P(_,ea)|0)-(P(U,da)|0)|0;Z=ct(X|0,((X|0)<0)<<31>>31|0,Z|0,((Z|0)<0)<<31>>31|0)|0;_=A;u=ct(Y|0,((Y|0)<0)<<31>>31|0,u|0,((u|0)<0)<<31>>31|0)|0;t=A;l=ct(U|0,((U|0)<0)<<31>>31|0,l|0,((l|0)<0)<<31>>31|0)|0;l=Ow(Z|0,_|0,l|0,A|0)|0;t=Ow(l|0,A|0,u|0,t|0)|0;u=A;l=ct(U|0,((U|0)<0)<<31>>31|0,ea|0,((ea|0)<0)<<31>>31|0)|0;_=A;Z=ct(Y|0,((Y|0)<0)<<31>>31|0,W|0,((W|0)<0)<<31>>31|0)|0;Z=sw(l|0,_|0,Z|0,A|0)|0;_=A;l=ct(X|0,((X|0)<0)<<31>>31|0,W|0,((W|0)<0)<<31>>31|0)|0;aa=A;$=ct(U|0,((U|0)<0)<<31>>31|0,da|0,((da|0)<0)<<31>>31|0)|0;$=sw(l|0,aa|0,$|0,A|0)|0;aa=A;l=ct(Y|0,((Y|0)<0)<<31>>31|0,da|0,((da|0)<0)<<31>>31|0)|0;ca=A;ba=ct(X|0,((X|0)<0)<<31>>31|0,ea|0,((ea|0)<0)<<31>>31|0)|0;ba=sw(l|0,ca|0,ba|0,A|0)|0;ca=A;l=ct(Z|0,_|0,h|0,((h|0)<0)<<31>>31|0)|0;T=A;k=ct($|0,aa|0,i|0,((i|0)<0)<<31>>31|0)|0;T=Ow(k|0,A|0,l|0,T|0)|0;l=A;k=ct(ba|0,ca|0,j|0,((j|0)<0)<<31>>31|0)|0;k=Ow(T|0,l|0,k|0,A|0)|0;l=A;if((V|0)!=0?(c[V+12>>2]|0)!=0:0){g=h;b=i;d=j;n=V;o=l;m=k;while(1){n=c[(c[n+8>>2]|0)+4>>2]|0;l=n+12|0;j=c[l>>2]|0;h=c[j+88>>2]|0;S=ct(h|0,((h|0)<0)<<31>>31|0,X|0,((X|0)<0)<<31>>31|0)|0;R=A;i=c[j+92>>2]|0;T=ct(i|0,((i|0)<0)<<31>>31|0,Y|0,((Y|0)<0)<<31>>31|0)|0;R=Ow(T|0,A|0,S|0,R|0)|0;S=A;j=c[j+96>>2]|0;T=ct(j|0,((j|0)<0)<<31>>31|0,U|0,((U|0)<0)<<31>>31|0)|0;T=Ow(R|0,S|0,T|0,A|0)|0;S=A;if((S|0)<(u|0)|(S|0)==(u|0)&T>>>0>>0){k=m;j=o;break}if((c[n+20>>2]|0)==(c[a+100>>2]|0)){k=m;j=o;break}T=ct(h|0,((h|0)<0)<<31>>31|0,Z|0,_|0)|0;S=A;k=ct(i|0,((i|0)<0)<<31>>31|0,$|0,aa|0)|0;S=Ow(k|0,A|0,T|0,S|0)|0;T=A;k=ct(j|0,((j|0)<0)<<31>>31|0,ba|0,ca|0)|0;k=Ow(S|0,T|0,k|0,A|0)|0;j=A;if(!((j|0)>(o|0)|(j|0)==(o|0)&k>>>0>m>>>0)){k=m;j=o;break}c[e>>2]=n;T=c[l>>2]|0;g=c[T+88>>2]|0;b=c[T+92>>2]|0;d=c[T+96>>2]|0;if(!T)break;else{o=j;m=k}}h=g;i=c[f>>2]|0;s=j}else{b=i;d=j;i=fa;s=l}g=ct(Z|0,_|0,r|0,((r|0)<0)<<31>>31|0)|0;T=A;j=ct($|0,aa|0,p|0,((p|0)<0)<<31>>31|0)|0;T=Ow(j|0,A|0,g|0,T|0)|0;g=A;j=ct(ba|0,ca|0,q|0,((q|0)<0)<<31>>31|0)|0;j=Ow(T|0,g|0,j|0,A|0)|0;g=A;a:do if(i)if(!(c[i+12>>2]|0))o=q;else{o=q;while(1){q=c[c[i+8>>2]>>2]|0;n=c[q+12>>2]|0;l=c[n+88>>2]|0;S=ct(l|0,((l|0)<0)<<31>>31|0,X|0,((X|0)<0)<<31>>31|0)|0;R=A;m=c[n+92>>2]|0;T=ct(m|0,((m|0)<0)<<31>>31|0,Y|0,((Y|0)<0)<<31>>31|0)|0;R=Ow(T|0,A|0,S|0,R|0)|0;S=A;n=c[n+96>>2]|0;T=ct(n|0,((n|0)<0)<<31>>31|0,U|0,((U|0)<0)<<31>>31|0)|0;T=Ow(R|0,S|0,T|0,A|0)|0;S=A;if((S|0)<(u|0)|(S|0)==(u|0)&T>>>0>>0)break a;if((c[q+20>>2]|0)==(c[a+100>>2]|0))break a;l=ct(l|0,((l|0)<0)<<31>>31|0,Z|0,_|0)|0;T=A;m=ct(m|0,((m|0)<0)<<31>>31|0,$|0,aa|0)|0;T=Ow(m|0,A|0,l|0,T|0)|0;m=A;l=ct(n|0,((n|0)<0)<<31>>31|0,ba|0,ca|0)|0;l=Ow(T|0,m|0,l|0,A|0)|0;m=A;if(!((m|0)>(g|0)|(m|0)==(g|0)&l>>>0>j>>>0))break a;c[f>>2]=q;T=c[q+12>>2]|0;g=c[T+88>>2]|0;i=c[T+92>>2]|0;j=c[T+96>>2]|0;if(!T){r=g;p=i;o=j;i=q;j=l;g=m;break}else{r=g;p=i;o=j;i=q;g=m;j=l}}}else{o=q;i=0}while(0);j=sw(j|0,g|0,k|0,s|0)|0;T=A;if((T|0)>0|(T|0)==0&j>>>0>0){R=sw(0,0,U|0,((U|0)<0)<<31>>31|0)|0;S=A;N=r;k=h;O=p;m=b;Q=o;n=d;l=i;u=j;q=T;while(1){s=(P(O-m|0,ea)|0)+(P(N-k|0,da)|0)+(P(Q-n|0,W)|0)|0;g=c[e>>2]|0;if(!g){E=s;I=k;H=m;B=s;g=((s|0)<0)<<31>>31;C=q;z=u}else{K=k;t=s;M=s;L=((s|0)<0)<<31>>31;b:while(1){if(!(c[g+12>>2]|0)){s=K;k=M;g=L;break}G=c[(c[g>>2]|0)+8>>2]|0;if((c[G+20>>2]|0)<=(c[a+100>>2]|0)){s=K;k=M;g=L;break}J=c[G+12>>2]|0;H=c[J+88>>2]|0;F=H-K|0;I=c[J+92>>2]|0;E=I-m|0;J=c[J+96>>2]|0;k=J-n|0;s=ct(F|0,((F|0)<0)<<31>>31|0,Z|0,_|0)|0;D=A;l=ct(E|0,((E|0)<0)<<31>>31|0,$|0,aa|0)|0;D=Ow(l|0,A|0,s|0,D|0)|0;s=A;l=ct(k|0,((k|0)<0)<<31>>31|0,ba|0,ca|0)|0;l=Ow(D|0,s|0,l|0,A|0)|0;s=A;k=(P(E,ea)|0)+(P(F,da)|0)+(P(k,W)|0)|0;do if((l|0)==0&(s|0)==0){if((k|0)>=0){s=K;k=M;g=L;break b}}else{if((s|0)>=0){s=K;k=M;g=L;break b}if((k|0)>0){w=1;x=k;v=((k|0)<0)<<31>>31}else{x=sw(0,0,k|0,((k|0)<0)<<31>>31|0)|0;w=((k|0)!=0)<<31>>31;x=k|0?x:0;v=k|0?A:0}B=sw(0,0,l|0,s|0)|0;C=A;F=0-w|0;if((t|0)>0){k=1;D=M;E=L}else{E=(t|0)!=0;D=sw(0,0,M|0,L|0)|0;k=E<<31>>31;D=E?D:0;E=E?A:0}if((q|0)>0|(q|0)==0&u>>>0>0){l=u;s=q}else{s=(u|0)!=0|(q|0)!=0;l=sw(0,0,u|0,q|0)|0;k=s?0-k|0:k;l=s?l:0;s=s?A:0}if((k|0)==(F|0)){if(!w)break;k=ct(l|0,0,x|0,0)|0;w=A;ja=ct(s|0,0,x|0,0)|0;ia=A;y=ct(l|0,0,v|0,0)|0;z=A;ha=ct(s|0,0,v|0,0)|0;x=A;y=Ow(ja|0,0,y|0,0)|0;l=A;x=Ow(ia|0,0,ha|0,x|0)|0;z=Ow(x|0,A|0,z|0,0)|0;l=Ow(z|0,A|0,l|0,0)|0;z=A;w=Ow(0,y|0,k|0,w|0)|0;x=A;y=Ow(l|0,z|0,(x>>>0>>0|(x|0)==(y|0)&w>>>0<0)&1|0,0)|0;z=A;l=ct(D|0,0,B|0,0)|0;k=A;ha=ct(E|0,0,B|0,0)|0;B=A;s=ct(D|0,0,C|0,0)|0;v=A;C=ct(E|0,0,C|0,0)|0;D=A;s=Ow(ha|0,0,s|0,0)|0;E=A;D=Ow(B|0,0,C|0,D|0)|0;v=Ow(D|0,A|0,v|0,0)|0;E=Ow(v|0,A|0,E|0,0)|0;v=A;k=Ow(0,s|0,l|0,k|0)|0;l=A;s=Ow(E|0,v|0,(l>>>0>>0|(l|0)==(s|0)&k>>>0<0)&1|0,0)|0;v=A;if(z>>>0>>0|(z|0)==(v|0)&y>>>0>>0)k=-1;else k=z>>>0>v>>>0|(z|0)==(v|0)&y>>>0>s>>>0?1:x>>>0>>0|(x|0)==(l|0)&w>>>0>>0?-1:(x>>>0>l>>>0|(x|0)==(l|0)&w>>>0>k>>>0)&1;k=P(k,F)|0}else k=F-k|0;if((k|0)<=-1){s=K;k=M;g=L;break b}}while(0);ja=N-H|0;ia=O-I|0;l=Q-J|0;q=ct(ja|0,((ja|0)<0)<<31>>31|0,Z|0,_|0)|0;ha=A;k=ct(ia|0,((ia|0)<0)<<31>>31|0,$|0,aa|0)|0;ha=Ow(k|0,A|0,q|0,ha|0)|0;q=A;k=ct(l|0,((l|0)<0)<<31>>31|0,ba|0,ca|0)|0;k=Ow(ha|0,q|0,k|0,A|0)|0;q=A;g=(g|0)==(V|0)?0:G;c[e>>2]=g;l=(P(ia,ea)|0)+(P(ja,da)|0)+(P(l,W)|0)|0;if(!g){t=l;s=H;m=I;n=J;u=k;k=l;g=((l|0)<0)<<31>>31;break}else{K=H;m=I;n=J;t=l;M=l;L=((l|0)<0)<<31>>31;u=k}}E=t;I=s;H=m;l=c[f>>2]|0;B=k;C=q;z=u}if(!l){g=110;break}if(!(c[l+12>>2]|0)){g=110;break}G=c[c[l+8>>2]>>2]|0;if((c[G+20>>2]|0)<=(c[a+100>>2]|0)){g=110;break}q=c[G+12>>2]|0;t=c[q+88>>2]|0;m=t-N|0;s=c[q+92>>2]|0;l=s-O|0;q=c[q+96>>2]|0;k=q-Q|0;ja=ct(m|0,((m|0)<0)<<31>>31|0,X|0,((X|0)<0)<<31>>31|0)|0;ha=A;ia=ct(l|0,((l|0)<0)<<31>>31|0,Y|0,((Y|0)<0)<<31>>31|0)|0;ha=Ow(ia|0,A|0,ja|0,ha|0)|0;ja=A;ia=ct(k|0,((k|0)<0)<<31>>31|0,R|0,S|0)|0;if(!((ha|0)==(ia|0)&(ja|0)==(A|0))){g=110;break}v=ct(m|0,((m|0)<0)<<31>>31|0,Z|0,_|0)|0;F=A;u=ct(l|0,((l|0)<0)<<31>>31|0,$|0,aa|0)|0;F=Ow(u|0,A|0,v|0,F|0)|0;v=A;u=ct(k|0,((k|0)<0)<<31>>31|0,ba|0,ca|0)|0;u=Ow(F|0,v|0,u|0,A|0)|0;v=A;k=(P(l,ea)|0)+(P(m,da)|0)+(P(k,W)|0)|0;F=t-I|0;ia=s-H|0;D=q-n|0;F=ct(F|0,((F|0)<0)<<31>>31|0,Z|0,_|0)|0;ja=A;ia=ct(ia|0,((ia|0)<0)<<31>>31|0,$|0,aa|0)|0;ja=Ow(ia|0,A|0,F|0,ja|0)|0;F=A;D=ct(D|0,((D|0)<0)<<31>>31|0,ba|0,ca|0)|0;D=Ow(ja|0,F|0,D|0,A|0)|0;F=A;if(!((F|0)>0|(F|0)==0&D>>>0>0)){g=110;break}if((u|0)==0&(v|0)==0){if((k|0)>=0){g=110;break}}else{if((v|0)>=0){g=110;break}if((k|0)>0){s=1;t=k;q=((k|0)<0)<<31>>31}else{t=sw(0,0,k|0,((k|0)<0)<<31>>31|0)|0;s=((k|0)!=0)<<31>>31;t=k|0?t:0;q=k|0?A:0}w=sw(0,0,u|0,v|0)|0;x=A;y=0-s|0;if((E|0)>0){k=1;v=B}else{ja=(E|0)!=0;v=sw(0,0,B|0,g|0)|0;k=ja<<31>>31;v=ja?v:0;g=ja?A:0}if((C|0)>0|(C|0)==0&z>>>0>0){m=k;l=z;k=C}else{ja=(z|0)!=0|(C|0)!=0;l=sw(0,0,z|0,C|0)|0;m=ja?0-k|0:k;l=ja?l:0;k=ja?A:0}if((m|0)==(y|0)){if(!s){g=110;break}ja=ct(l|0,0,t|0,0)|0;s=A;ia=ct(k|0,0,t|0,0)|0;Q=A;t=ct(l|0,0,q|0,0)|0;u=A;k=ct(k|0,0,q|0,0)|0;q=A;t=Ow(ia|0,0,t|0,0)|0;ia=A;q=Ow(Q|0,0,k|0,q|0)|0;u=Ow(q|0,A|0,u|0,0)|0;ia=Ow(u|0,A|0,ia|0,0)|0;u=A;q=Ow(0,t|0,ja|0,s|0)|0;s=A;t=Ow(ia|0,u|0,(s>>>0>>0|(s|0)==(t|0)&q>>>0<0)&1|0,0)|0;u=A;ia=ct(v|0,0,w|0,0)|0;k=A;ja=ct(g|0,0,w|0,0)|0;Q=A;l=ct(v|0,0,x|0,0)|0;m=A;ha=ct(g|0,0,x|0,0)|0;g=A;l=Ow(ja|0,0,l|0,0)|0;ja=A;g=Ow(Q|0,0,ha|0,g|0)|0;m=Ow(g|0,A|0,m|0,0)|0;ja=Ow(m|0,A|0,ja|0,0)|0;m=A;g=Ow(0,l|0,ia|0,k|0)|0;k=A;l=Ow(ja|0,m|0,(k>>>0>>0|(k|0)==(l|0)&g>>>0<0)&1|0,0)|0;m=A;if(u>>>0>>0|(u|0)==(m|0)&t>>>0>>0)g=-1;else g=u>>>0>m>>>0|(u|0)==(m|0)&t>>>0>l>>>0?1:s>>>0>>0|(s|0)==(k|0)&q>>>0>>0?-1:(s>>>0>k>>>0|(s|0)==(k|0)&q>>>0>g>>>0)&1;g=P(g,y)|0}else g=y-m|0;if((g|0)<=0){g=110;break}}c[f>>2]=G;Q=c[G+12>>2]|0;N=c[Q+88>>2]|0;k=I;O=c[Q+92>>2]|0;m=H;Q=c[Q+96>>2]|0;l=G;u=D;q=F}if((g|0)==110)return}if((T|0)>=0)return;F=sw(0,0,U|0,((U|0)<0)<<31>>31|0)|0;G=A;E=r;g=T;c:while(1){D=g;d:while(1){C=(P(p-b|0,ea)|0)+(P(E-h|0,da)|0)+(P(o-d|0,W)|0)|0;do if((i|0?c[i+12>>2]|0:0)?(ga=c[(c[i+4>>2]|0)+8>>2]|0,(c[ga+20>>2]|0)>(c[a+100>>2]|0)):0){B=c[ga+12>>2]|0;y=c[B+88>>2]|0;ja=y-E|0;z=c[B+92>>2]|0;ia=z-p|0;B=c[B+96>>2]|0;g=B-o|0;l=ct(ja|0,((ja|0)<0)<<31>>31|0,Z|0,_|0)|0;ha=A;k=ct(ia|0,((ia|0)<0)<<31>>31|0,$|0,aa|0)|0;ha=Ow(k|0,A|0,l|0,ha|0)|0;l=A;k=ct(g|0,((g|0)<0)<<31>>31|0,ba|0,ca|0)|0;k=Ow(ha|0,l|0,k|0,A|0)|0;l=A;g=(P(ia,ea)|0)+(P(ja,da)|0)+(P(g,W)|0)|0;if((k|0)==0&(l|0)==0)if((g|0)>0)break d;else break;if((l|0)<0){if((g|0)>0){n=1;q=g;m=((g|0)<0)<<31>>31}else{q=sw(0,0,g|0,((g|0)<0)<<31>>31|0)|0;n=((g|0)!=0)<<31>>31;q=g|0?q:0;m=g|0?A:0}t=sw(0,0,k|0,l|0)|0;u=A;x=0-n|0;if((C|0)>0){g=1;v=C;w=((C|0)<0)<<31>>31}else{v=sw(0,0,C|0,((C|0)<0)<<31>>31|0)|0;g=((C|0)!=0)<<31>>31;v=C|0?v:0;w=C|0?A:0}if((D|0)>0|(D|0)==0&j>>>0>0){k=j;l=D}else{l=(j|0)!=0|(D|0)!=0;k=sw(0,0,j|0,D|0)|0;g=l?0-g|0:g;k=l?k:0;l=l?A:0}if((g|0)==(x|0)){if(!n)break d;g=ct(k|0,0,q|0,0)|0;n=A;ha=ct(l|0,0,q|0,0)|0;V=A;r=ct(k|0,0,m|0,0)|0;s=A;ja=ct(l|0,0,m|0,0)|0;q=A;r=Ow(ha|0,0,r|0,0)|0;k=A;q=Ow(V|0,0,ja|0,q|0)|0;s=Ow(q|0,A|0,s|0,0)|0;k=Ow(s|0,A|0,k|0,0)|0;s=A;n=Ow(0,r|0,g|0,n|0)|0;q=A;r=Ow(k|0,s|0,(q>>>0>>0|(q|0)==(r|0)&n>>>0<0)&1|0,0)|0;s=A;k=ct(v|0,0,t|0,0)|0;g=A;ja=ct(w|0,0,t|0,0)|0;V=A;l=ct(v|0,0,u|0,0)|0;m=A;ha=ct(w|0,0,u|0,0)|0;ia=A;l=Ow(ja|0,0,l|0,0)|0;ja=A;ia=Ow(V|0,0,ha|0,ia|0)|0;m=Ow(ia|0,A|0,m|0,0)|0;ja=Ow(m|0,A|0,ja|0,0)|0;m=A;g=Ow(0,l|0,k|0,g|0)|0;k=A;l=Ow(ja|0,m|0,(k>>>0>>0|(k|0)==(l|0)&g>>>0<0)&1|0,0)|0;m=A;if(s>>>0>>0|(s|0)==(m|0)&r>>>0>>0)g=-1;else g=s>>>0>m>>>0|(s|0)==(m|0)&r>>>0>l>>>0?1:q>>>0>>0|(q|0)==(k|0)&n>>>0>>0?-1:(q>>>0>k>>>0|(q|0)==(k|0)&n>>>0>g>>>0)&1;g=P(g,x)|0}else g=x-g|0;if((g|0)<1)break d}}while(0);g=c[e>>2]|0;if(!g){g=110;break c}if(!(c[g+12>>2]|0)){g=110;break c}v=c[(c[g+8>>2]|0)+4>>2]|0;if((c[v+20>>2]|0)<=(c[a+100>>2]|0)){g=110;break c}i=c[v+12>>2]|0;l=c[i+88>>2]|0;h=l-h|0;k=c[i+92>>2]|0;b=k-b|0;i=c[i+96>>2]|0;g=i-d|0;ja=ct(h|0,((h|0)<0)<<31>>31|0,X|0,((X|0)<0)<<31>>31|0)|0;ha=A;ia=ct(b|0,((b|0)<0)<<31>>31|0,Y|0,((Y|0)<0)<<31>>31|0)|0;ha=Ow(ia|0,A|0,ja|0,ha|0)|0;ja=A;ia=ct(g|0,((g|0)<0)<<31>>31|0,F|0,G|0)|0;if(!((ha|0)==(ia|0)&(ja|0)==(A|0))){g=110;break c}m=ct(h|0,((h|0)<0)<<31>>31|0,Z|0,_|0)|0;u=A;d=ct(b|0,((b|0)<0)<<31>>31|0,$|0,aa|0)|0;u=Ow(d|0,A|0,m|0,u|0)|0;m=A;d=ct(g|0,((g|0)<0)<<31>>31|0,ba|0,ca|0)|0;d=Ow(u|0,m|0,d|0,A|0)|0;m=A;g=(P(b,ea)|0)+(P(h,da)|0)+(P(g,W)|0)|0;u=E-l|0;ia=p-k|0;t=o-i|0;u=ct(u|0,((u|0)<0)<<31>>31|0,Z|0,_|0)|0;ja=A;ia=ct(ia|0,((ia|0)<0)<<31>>31|0,$|0,aa|0)|0;ja=Ow(ia|0,A|0,u|0,ja|0)|0;u=A;t=ct(t|0,((t|0)<0)<<31>>31|0,ba|0,ca|0)|0;t=Ow(ja|0,u|0,t|0,A|0)|0;u=A;if((u|0)>=0){g=110;break c}if((d|0)==0&(m|0)==0){if((g|0)<=0){g=110;break c}}else{if((m|0)>=0){g=110;break c}if((g|0)>0){h=((g|0)<0)<<31>>31;i=1}else{ja=sw(0,0,g|0,((g|0)<0)<<31>>31|0)|0;h=g|0?A:0;i=((g|0)!=0)<<31>>31;g=g|0?ja:0}q=sw(0,0,d|0,m|0)|0;r=A;s=0-i|0;if((C|0)>0){b=1;n=C;m=((C|0)<0)<<31>>31}else{n=sw(0,0,C|0,((C|0)<0)<<31>>31|0)|0;b=((C|0)!=0)<<31>>31;n=C|0?n:0;m=C|0?A:0}if((D|0)>0|(D|0)==0&j>>>0>0){d=b;b=D}else{ja=(j|0)!=0|(D|0)!=0;j=sw(0,0,j|0,D|0)|0;d=ja?0-b|0:b;j=ja?j:0;b=ja?A:0}if((d|0)==(s|0)){if(!i){g=110;break c}ja=ct(j|0,0,g|0,0)|0;i=A;d=ct(b|0,0,g|0,0)|0;V=A;k=ct(j|0,0,h|0,0)|0;l=A;g=ct(b|0,0,h|0,0)|0;j=A;k=Ow(d|0,0,k|0,0)|0;b=A;j=Ow(V|0,0,g|0,j|0)|0;l=Ow(j|0,A|0,l|0,0)|0;b=Ow(l|0,A|0,b|0,0)|0;l=A;i=Ow(0,k|0,ja|0,i|0)|0;j=A;k=Ow(b|0,l|0,(j>>>0>>0|(j|0)==(k|0)&i>>>0<0)&1|0,0)|0;l=A;b=ct(n|0,0,q|0,0)|0;g=A;ja=ct(m|0,0,q|0,0)|0;V=A;d=ct(n|0,0,r|0,0)|0;h=A;ha=ct(m|0,0,r|0,0)|0;ia=A;d=Ow(ja|0,0,d|0,0)|0;ja=A;ia=Ow(V|0,0,ha|0,ia|0)|0;h=Ow(ia|0,A|0,h|0,0)|0;ja=Ow(h|0,A|0,ja|0,0)|0;h=A;g=Ow(0,d|0,b|0,g|0)|0;b=A;d=Ow(ja|0,h|0,(b>>>0>>0|(b|0)==(d|0)&g>>>0<0)&1|0,0)|0;h=A;if(l>>>0>>0|(l|0)==(h|0)&k>>>0>>0)g=-1;else g=l>>>0>h>>>0|(l|0)==(h|0)&k>>>0>d>>>0?1:j>>>0>>0|(j|0)==(b|0)&i>>>0>>0?-1:(j>>>0>b>>>0|(j|0)==(b|0)&i>>>0>g>>>0)&1;g=P(g,s)|0}else g=s-d|0;if((g|0)>=0){g=110;break c}}c[e>>2]=v;d=c[v+12>>2]|0;h=c[d+88>>2]|0;b=c[d+92>>2]|0;d=c[d+96>>2]|0;i=c[f>>2]|0;D=u;j=t}E=y-h|0;o=z-b|0;j=B-d|0;E=ct(E|0,((E|0)<0)<<31>>31|0,Z|0,_|0)|0;p=A;o=ct(o|0,((o|0)<0)<<31>>31|0,$|0,aa|0)|0;p=Ow(o|0,A|0,E|0,p|0)|0;E=A;j=ct(j|0,((j|0)<0)<<31>>31|0,ba|0,ca|0)|0;j=Ow(p|0,E|0,j|0,A|0)|0;i=(i|0)==(fa|0)?0:ga;c[f>>2]=i;E=y;p=z;o=B;g=A}if((g|0)==110)return}function sc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=l;l=l+16|0;do if(a>>>0<245){o=a>>>0<11?16:a+11&-8;m=c[6997]|0;if(m>>>(o>>>3)&3|0){a=28028+((m>>>(o>>>3)&1^1)+(o>>>3)<<1<<2)|0;b=c[a+8>>2]|0;d=c[b+8>>2]|0;if((a|0)==(d|0))c[6997]=m&~(1<<(m>>>(o>>>3)&1^1)+(o>>>3));else{c[d+12>>2]=a;c[a+8>>2]=d}v=(m>>>(o>>>3)&1^1)+(o>>>3)<<3;c[b+4>>2]=v|3;c[b+v+4>>2]=c[b+v+4>>2]|1;v=b+8|0;l=w;return v|0}n=c[6999]|0;if(o>>>0>n>>>0){if(m>>>(o>>>3)|0){a=m>>>(o>>>3)<<(o>>>3)&(2<<(o>>>3)|0-(2<<(o>>>3)));f=((a&0-a)+-1|0)>>>(((a&0-a)+-1|0)>>>12&16);e=f>>>(f>>>5&8)>>>(f>>>(f>>>5&8)>>>2&4);e=(f>>>5&8|((a&0-a)+-1|0)>>>12&16|f>>>(f>>>5&8)>>>2&4|e>>>1&2|e>>>(e>>>1&2)>>>1&1)+(e>>>(e>>>1&2)>>>(e>>>(e>>>1&2)>>>1&1))|0;f=c[28028+(e<<1<<2)+8>>2]|0;a=c[f+8>>2]|0;if((28028+(e<<1<<2)|0)==(a|0)){c[6997]=m&~(1<>2]=28028+(e<<1<<2);c[28028+(e<<1<<2)+8>>2]=a;a=m}c[f+4>>2]=o|3;c[f+o+4>>2]=(e<<3)-o|1;c[f+o+((e<<3)-o)>>2]=(e<<3)-o;if(n|0){d=c[7002]|0;if(!(a&1<<(n>>>3))){c[6997]=a|1<<(n>>>3);a=28028+(n>>>3<<1<<2)|0;b=28028+(n>>>3<<1<<2)+8|0}else{a=c[28028+(n>>>3<<1<<2)+8>>2]|0;b=28028+(n>>>3<<1<<2)+8|0}c[b>>2]=d;c[a+12>>2]=d;c[d+8>>2]=a;c[d+12>>2]=28028+(n>>>3<<1<<2)}c[6999]=(e<<3)-o;c[7002]=f+o;v=f+8|0;l=w;return v|0}k=c[6998]|0;if(k){b=((k&0-k)+-1|0)>>>(((k&0-k)+-1|0)>>>12&16);a=b>>>(b>>>5&8)>>>(b>>>(b>>>5&8)>>>2&4);a=c[28292+((b>>>5&8|((k&0-k)+-1|0)>>>12&16|b>>>(b>>>5&8)>>>2&4|a>>>1&2|a>>>(a>>>1&2)>>>1&1)+(a>>>(a>>>1&2)>>>(a>>>(a>>>1&2)>>>1&1))<<2)>>2]|0;b=(c[a+4>>2]&-8)-o|0;d=c[a+16+(((c[a+16>>2]|0)==0&1)<<2)>>2]|0;if(!d){j=a;h=b}else{do{i=(c[d+4>>2]&-8)-o|0;j=i>>>0>>0;b=j?i:b;a=j?d:a;d=c[d+16+(((c[d+16>>2]|0)==0&1)<<2)>>2]|0}while((d|0)!=0);j=a;h=b}i=j+o|0;if(j>>>0>>0){f=c[j+24>>2]|0;a=c[j+12>>2]|0;do if((a|0)==(j|0)){b=j+20|0;a=c[b>>2]|0;if(!a){b=j+16|0;a=c[b>>2]|0;if(!a){b=0;break}}while(1){d=a+20|0;e=c[d>>2]|0;if(e|0){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}c[b>>2]=0;b=a}else{b=c[j+8>>2]|0;c[b+12>>2]=a;c[a+8>>2]=b;b=a}while(0);do if(f|0){a=c[j+28>>2]|0;if((j|0)==(c[28292+(a<<2)>>2]|0)){c[28292+(a<<2)>>2]=b;if(!b){c[6998]=k&~(1<>2]|0)!=(j|0)&1)<<2)>>2]=b;if(!b)break}c[b+24>>2]=f;a=c[j+16>>2]|0;if(a|0){c[b+16>>2]=a;c[a+24>>2]=b}a=c[j+20>>2]|0;if(a|0){c[b+20>>2]=a;c[a+24>>2]=b}}while(0);if(h>>>0<16){v=h+o|0;c[j+4>>2]=v|3;v=j+v+4|0;c[v>>2]=c[v>>2]|1}else{c[j+4>>2]=o|3;c[i+4>>2]=h|1;c[i+h>>2]=h;if(n|0){d=c[7002]|0;if(!(m&1<<(n>>>3))){c[6997]=m|1<<(n>>>3);a=28028+(n>>>3<<1<<2)|0;b=28028+(n>>>3<<1<<2)+8|0}else{a=c[28028+(n>>>3<<1<<2)+8>>2]|0;b=28028+(n>>>3<<1<<2)+8|0}c[b>>2]=d;c[a+12>>2]=d;c[d+8>>2]=a;c[d+12>>2]=28028+(n>>>3<<1<<2)}c[6999]=h;c[7002]=i}v=j+8|0;l=w;return v|0}}}}else if(a>>>0<=4294967231){o=a+11&-8;j=c[6998]|0;if(j){if((a+11|0)>>>8)if(o>>>0>16777215)i=31;else{i=(a+11|0)>>>8<<((((a+11|0)>>>8)+1048320|0)>>>16&8);i=14-((i+520192|0)>>>16&4|(((a+11|0)>>>8)+1048320|0)>>>16&8|((i<<((i+520192|0)>>>16&4))+245760|0)>>>16&2)+(i<<((i+520192|0)>>>16&4)<<(((i<<((i+520192|0)>>>16&4))+245760|0)>>>16&2)>>>15)|0;i=o>>>(i+7|0)&1|i<<1}else i=0;b=c[28292+(i<<2)>>2]|0;a:do if(!b){b=0;a=0;d=0-o|0;u=57}else{a=0;d=0-o|0;h=o<<((i|0)==31?0:25-(i>>>1)|0);f=0;while(1){e=(c[b+4>>2]&-8)-o|0;if(e>>>0>>0)if(!e){a=b;d=0;e=b;u=61;break a}else{a=b;d=e}e=c[b+20>>2]|0;b=c[b+16+(h>>>31<<2)>>2]|0;f=(e|0)==0|(e|0)==(b|0)?f:e;e=(b|0)==0;if(e){b=f;u=57;break}else h=h<<((e^1)&1)}}while(0);if((u|0)==57){if((b|0)==0&(a|0)==0){a=2<>>(m>>>12&16)>>>(m>>>(m>>>12&16)>>>5&8);b=n>>>(n>>>2&4)>>>(n>>>(n>>>2&4)>>>1&2);a=0;b=c[28292+((m>>>(m>>>12&16)>>>5&8|m>>>12&16|n>>>2&4|n>>>(n>>>2&4)>>>1&2|b>>>1&1)+(b>>>(b>>>1&1))<<2)>>2]|0}if(!b){i=a;h=d}else{e=b;u=61}}if((u|0)==61)while(1){u=0;b=(c[e+4>>2]&-8)-o|0;n=b>>>0>>0;b=n?b:d;a=n?e:a;e=c[e+16+(((c[e+16>>2]|0)==0&1)<<2)>>2]|0;if(!e){i=a;h=b;break}else{d=b;u=61}}if((i|0)!=0?h>>>0<((c[6999]|0)-o|0)>>>0:0){g=i+o|0;if(i>>>0>=g>>>0){v=0;l=w;return v|0}f=c[i+24>>2]|0;a=c[i+12>>2]|0;do if((a|0)==(i|0)){b=i+20|0;a=c[b>>2]|0;if(!a){b=i+16|0;a=c[b>>2]|0;if(!a){a=0;break}}while(1){d=a+20|0;e=c[d>>2]|0;if(e|0){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}c[b>>2]=0}else{v=c[i+8>>2]|0;c[v+12>>2]=a;c[a+8>>2]=v}while(0);do if(f){b=c[i+28>>2]|0;if((i|0)==(c[28292+(b<<2)>>2]|0)){c[28292+(b<<2)>>2]=a;if(!a){c[6998]=j&~(1<>2]|0)!=(i|0)&1)<<2)>>2]=a;if(!a){e=j;break}}c[a+24>>2]=f;b=c[i+16>>2]|0;if(b|0){c[a+16>>2]=b;c[b+24>>2]=a}b=c[i+20>>2]|0;if(b){c[a+20>>2]=b;c[b+24>>2]=a;e=j}else e=j}else e=j;while(0);do if(h>>>0>=16){c[i+4>>2]=o|3;c[g+4>>2]=h|1;c[g+h>>2]=h;d=h>>>3;if(h>>>0<256){a=c[6997]|0;if(!(a&1<>2]|0;b=28028+(d<<1<<2)+8|0}c[b>>2]=g;c[a+12>>2]=g;c[g+8>>2]=a;c[g+12>>2]=28028+(d<<1<<2);break}a=h>>>8;if(a)if(h>>>0>16777215)a=31;else{v=a<<((a+1048320|0)>>>16&8)<<(((a<<((a+1048320|0)>>>16&8))+520192|0)>>>16&4);a=14-(((a<<((a+1048320|0)>>>16&8))+520192|0)>>>16&4|(a+1048320|0)>>>16&8|(v+245760|0)>>>16&2)+(v<<((v+245760|0)>>>16&2)>>>15)|0;a=h>>>(a+7|0)&1|a<<1}else a=0;d=28292+(a<<2)|0;c[g+28>>2]=a;c[g+16+4>>2]=0;c[g+16>>2]=0;b=1<>2]=g;c[g+24>>2]=d;c[g+12>>2]=g;c[g+8>>2]=g;break}b=h<<((a|0)==31?0:25-(a>>>1)|0);d=c[d>>2]|0;while(1){if((c[d+4>>2]&-8|0)==(h|0)){u=97;break}e=d+16+(b>>>31<<2)|0;a=c[e>>2]|0;if(!a){u=96;break}else{b=b<<1;d=a}}if((u|0)==96){c[e>>2]=g;c[g+24>>2]=d;c[g+12>>2]=g;c[g+8>>2]=g;break}else if((u|0)==97){u=d+8|0;v=c[u>>2]|0;c[v+12>>2]=g;c[u>>2]=g;c[g+8>>2]=v;c[g+12>>2]=d;c[g+24>>2]=0;break}}else{v=h+o|0;c[i+4>>2]=v|3;v=i+v+4|0;c[v>>2]=c[v>>2]|1}while(0);v=i+8|0;l=w;return v|0}}}else o=-1;while(0);d=c[6999]|0;if(d>>>0>=o>>>0){a=d-o|0;b=c[7002]|0;if(a>>>0>15){v=b+o|0;c[7002]=v;c[6999]=a;c[v+4>>2]=a|1;c[v+a>>2]=a;c[b+4>>2]=o|3}else{c[6999]=0;c[7002]=0;c[b+4>>2]=d|3;c[b+d+4>>2]=c[b+d+4>>2]|1}v=b+8|0;l=w;return v|0}f=c[7e3]|0;if(f>>>0>o>>>0){t=f-o|0;c[7e3]=t;v=c[7003]|0;u=v+o|0;c[7003]=u;c[u+4>>2]=t|1;c[v+4>>2]=o|3;v=v+8|0;l=w;return v|0}if(!(c[7115]|0)){c[7117]=4096;c[7116]=4096;c[7118]=-1;c[7119]=-1;c[7120]=0;c[7108]=0;c[w>>2]=w&-16^1431655768;c[7115]=w&-16^1431655768;a=4096}else a=c[7117]|0;h=o+48|0;i=o+47|0;k=a+i|0;j=0-a|0;if((k&j)>>>0<=o>>>0){v=0;l=w;return v|0}a=c[7107]|0;if(a|0?(n=c[7105]|0,(n+(k&j)|0)>>>0<=n>>>0?1:(n+(k&j)|0)>>>0>a>>>0):0){v=0;l=w;return v|0}b:do if(!(c[7108]&4)){d=c[7003]|0;c:do if(d){b=28436;while(1){a=c[b>>2]|0;if(a>>>0<=d>>>0?(p=b+4|0,(a+(c[p>>2]|0)|0)>>>0>d>>>0):0)break;a=c[b+8>>2]|0;if(!a){u=118;break c}else b=a}if((k-f&j)>>>0<2147483647){a=_o(k-f&j|0)|0;if((a|0)==((c[b>>2]|0)+(c[p>>2]|0)|0))if((a|0)==(-1|0))a=k-f&j;else{h=k-f&j;g=a;u=135;break b}else{e=a;d=k-f&j;u=126}}else a=0}else u=118;while(0);do if((u|0)==118){b=_o(0)|0;if((b|0)!=(-1|0)?(r=c[7116]|0,r=((r+-1&b|0)==0?0:(r+-1+b&0-r)-b|0)+(k&j)|0,q=c[7105]|0,r>>>0>o>>>0&r>>>0<2147483647):0){p=c[7107]|0;if(p|0?(r+q|0)>>>0<=q>>>0|(r+q|0)>>>0>p>>>0:0){a=0;break}a=_o(r|0)|0;if((a|0)==(b|0)){h=r;g=b;u=135;break b}else{e=a;d=r;u=126}}else a=0}while(0);do if((u|0)==126){b=0-d|0;if(!(h>>>0>d>>>0&(d>>>0<2147483647&(e|0)!=(-1|0))))if((e|0)==(-1|0)){a=0;break}else{h=d;g=e;u=135;break b}a=c[7117]|0;a=i-d+a&0-a;if(a>>>0>=2147483647){h=d;g=e;u=135;break b}if((_o(a|0)|0)==(-1|0)){_o(b|0)|0;a=0;break}else{h=a+d|0;g=e;u=135;break b}}while(0);c[7108]=c[7108]|4;u=133}else{a=0;u=133}while(0);if(((u|0)==133?(k&j)>>>0<2147483647:0)?(g=_o(k&j|0)|0,s=_o(0)|0,t=(s-g|0)>>>0>(o+40|0)>>>0,!((g|0)==(-1|0)|t^1|g>>>0>>0&((g|0)!=(-1|0)&(s|0)!=(-1|0))^1)):0){h=t?s-g|0:a;u=135}if((u|0)==135){a=(c[7105]|0)+h|0;c[7105]=a;if(a>>>0>(c[7106]|0)>>>0)c[7106]=a;j=c[7003]|0;do if(j){a=28436;while(1){b=c[a>>2]|0;d=a+4|0;e=c[d>>2]|0;if((g|0)==(b+e|0)){u=145;break}f=c[a+8>>2]|0;if(!f)break;else a=f}if(((u|0)==145?(c[a+12>>2]&8|0)==0:0)?j>>>0>>0&j>>>0>=b>>>0:0){c[d>>2]=e+h;u=(j+8&7|0)==0?0:0-(j+8)&7;v=(c[7e3]|0)+(h-u)|0;c[7003]=j+u;c[7e3]=v;c[j+u+4>>2]=v|1;c[j+u+v+4>>2]=40;c[7004]=c[7119];break}if(g>>>0<(c[7001]|0)>>>0)c[7001]=g;d=g+h|0;a=28436;while(1){if((c[a>>2]|0)==(d|0)){u=153;break}b=c[a+8>>2]|0;if(!b)break;else a=b}if((u|0)==153?(c[a+12>>2]&8|0)==0:0){c[a>>2]=g;m=a+4|0;c[m>>2]=(c[m>>2]|0)+h;m=g+8|0;m=g+((m&7|0)==0?0:0-m&7)|0;a=d+((d+8&7|0)==0?0:0-(d+8)&7)|0;k=m+o|0;i=a-m-o|0;c[m+4>>2]=o|3;do if((a|0)!=(j|0)){if((a|0)==(c[7002]|0)){v=(c[6999]|0)+i|0;c[6999]=v;c[7002]=k;c[k+4>>2]=v|1;c[k+v>>2]=v;break}h=c[a+4>>2]|0;if((h&3|0)==1){d:do if(h>>>0<256){b=c[a+8>>2]|0;d=c[a+12>>2]|0;if((d|0)==(b|0)){c[6997]=c[6997]&~(1<<(h>>>3));break}else{c[b+12>>2]=d;c[d+8>>2]=b;break}}else{g=c[a+24>>2]|0;b=c[a+12>>2]|0;do if((b|0)==(a|0)){b=c[a+16+4>>2]|0;if(!b){b=c[a+16>>2]|0;if(!b){b=0;break}else f=a+16|0}else f=a+16+4|0;while(1){d=b+20|0;e=c[d>>2]|0;if(e|0){b=e;f=d;continue}d=b+16|0;e=c[d>>2]|0;if(!e)break;else{b=e;f=d}}c[f>>2]=0}else{v=c[a+8>>2]|0;c[v+12>>2]=b;c[b+8>>2]=v}while(0);if(!g)break;d=c[a+28>>2]|0;do if((a|0)!=(c[28292+(d<<2)>>2]|0)){c[g+16+(((c[g+16>>2]|0)!=(a|0)&1)<<2)>>2]=b;if(!b)break d}else{c[28292+(d<<2)>>2]=b;if(b|0)break;c[6998]=c[6998]&~(1<>2]=g;d=c[a+16>>2]|0;if(d|0){c[b+16>>2]=d;c[d+24>>2]=b}d=c[a+16+4>>2]|0;if(!d)break;c[b+20>>2]=d;c[d+24>>2]=b}while(0);a=a+(h&-8)|0;f=(h&-8)+i|0}else f=i;d=a+4|0;c[d>>2]=c[d>>2]&-2;c[k+4>>2]=f|1;c[k+f>>2]=f;d=f>>>3;if(f>>>0<256){a=c[6997]|0;if(!(a&1<>2]|0;b=28028+(d<<1<<2)+8|0}c[b>>2]=k;c[a+12>>2]=k;c[k+8>>2]=a;c[k+12>>2]=28028+(d<<1<<2);break}a=f>>>8;do if(!a)a=0;else{if(f>>>0>16777215){a=31;break}v=a<<((a+1048320|0)>>>16&8)<<(((a<<((a+1048320|0)>>>16&8))+520192|0)>>>16&4);a=14-(((a<<((a+1048320|0)>>>16&8))+520192|0)>>>16&4|(a+1048320|0)>>>16&8|(v+245760|0)>>>16&2)+(v<<((v+245760|0)>>>16&2)>>>15)|0;a=f>>>(a+7|0)&1|a<<1}while(0);e=28292+(a<<2)|0;c[k+28>>2]=a;c[k+16+4>>2]=0;c[k+16>>2]=0;b=c[6998]|0;d=1<>2]=k;c[k+24>>2]=e;c[k+12>>2]=k;c[k+8>>2]=k;break}b=f<<((a|0)==31?0:25-(a>>>1)|0);d=c[e>>2]|0;while(1){if((c[d+4>>2]&-8|0)==(f|0)){u=194;break}e=d+16+(b>>>31<<2)|0;a=c[e>>2]|0;if(!a){u=193;break}else{b=b<<1;d=a}}if((u|0)==193){c[e>>2]=k;c[k+24>>2]=d;c[k+12>>2]=k;c[k+8>>2]=k;break}else if((u|0)==194){u=d+8|0;v=c[u>>2]|0;c[v+12>>2]=k;c[u>>2]=k;c[k+8>>2]=v;c[k+12>>2]=d;c[k+24>>2]=0;break}}else{v=(c[7e3]|0)+i|0;c[7e3]=v;c[7003]=k;c[k+4>>2]=v|1}while(0);v=m+8|0;l=w;return v|0}a=28436;while(1){b=c[a>>2]|0;if(b>>>0<=j>>>0?(v=b+(c[a+4>>2]|0)|0,v>>>0>j>>>0):0)break;a=c[a+8>>2]|0}f=v+-47+((v+-47+8&7|0)==0?0:0-(v+-47+8)&7)|0;f=f>>>0<(j+16|0)>>>0?j:f;a=g+8|0;a=(a&7|0)==0?0:0-a&7;u=g+a|0;a=h+-40-a|0;c[7003]=u;c[7e3]=a;c[u+4>>2]=a|1;c[u+a+4>>2]=40;c[7004]=c[7119];c[f+4>>2]=27;c[f+8>>2]=c[7109];c[f+8+4>>2]=c[7110];c[f+8+8>>2]=c[7111];c[f+8+12>>2]=c[7112];c[7109]=g;c[7110]=h;c[7112]=0;c[7111]=f+8;a=f+24|0;do{u=a;a=a+4|0;c[a>>2]=7}while((u+8|0)>>>0>>0);if((f|0)!=(j|0)){c[f+4>>2]=c[f+4>>2]&-2;c[j+4>>2]=f-j|1;c[f>>2]=f-j;if((f-j|0)>>>0<256){d=28028+((f-j|0)>>>3<<1<<2)|0;a=c[6997]|0;if(!(a&1<<((f-j|0)>>>3))){c[6997]=a|1<<((f-j|0)>>>3);a=d;b=d+8|0}else{a=c[d+8>>2]|0;b=d+8|0}c[b>>2]=j;c[a+12>>2]=j;c[j+8>>2]=a;c[j+12>>2]=d;break}if((f-j|0)>>>8)if((f-j|0)>>>0>16777215)a=31;else{a=(f-j|0)>>>8<<((((f-j|0)>>>8)+1048320|0)>>>16&8);a=14-((a+520192|0)>>>16&4|(((f-j|0)>>>8)+1048320|0)>>>16&8|((a<<((a+520192|0)>>>16&4))+245760|0)>>>16&2)+(a<<((a+520192|0)>>>16&4)<<(((a<<((a+520192|0)>>>16&4))+245760|0)>>>16&2)>>>15)|0;a=(f-j|0)>>>(a+7|0)&1|a<<1}else a=0;e=28292+(a<<2)|0;c[j+28>>2]=a;c[j+20>>2]=0;c[j+16>>2]=0;b=c[6998]|0;d=1<>2]=j;c[j+24>>2]=e;c[j+12>>2]=j;c[j+8>>2]=j;break}b=f-j<<((a|0)==31?0:25-(a>>>1)|0);d=c[e>>2]|0;while(1){if((c[d+4>>2]&-8|0)==(f-j|0)){u=216;break}e=d+16+(b>>>31<<2)|0;a=c[e>>2]|0;if(!a){u=215;break}else{b=b<<1;d=a}}if((u|0)==215){c[e>>2]=j;c[j+24>>2]=d;c[j+12>>2]=j;c[j+8>>2]=j;break}else if((u|0)==216){u=d+8|0;v=c[u>>2]|0;c[v+12>>2]=j;c[u>>2]=j;c[j+8>>2]=v;c[j+12>>2]=d;c[j+24>>2]=0;break}}}else{v=c[7001]|0;if((v|0)==0|g>>>0>>0)c[7001]=g;c[7109]=g;c[7110]=h;c[7112]=0;c[7006]=c[7115];c[7005]=-1;a=0;do{v=28028+(a<<1<<2)|0;c[v+12>>2]=v;c[v+8>>2]=v;a=a+1|0}while((a|0)!=32);v=g+8|0;v=(v&7|0)==0?0:0-v&7;u=g+v|0;v=h+-40-v|0;c[7003]=u;c[7e3]=v;c[u+4>>2]=v|1;c[u+v+4>>2]=40;c[7004]=c[7119]}while(0);a=c[7e3]|0;if(a>>>0>o>>>0){t=a-o|0;c[7e3]=t;v=c[7003]|0;u=v+o|0;c[7003]=u;c[u+4>>2]=t|1;c[v+4>>2]=o|3;v=v+8|0;l=w;return v|0}}c[7137]=12;v=0;l=w;return v|0}function tc(b,d,e){b=b|0;d=d|0;e=+e;var f=0.0,h=0.0,i=0,j=0,k=0.0,m=0.0,n=0,o=0,p=0.0,q=0,r=0.0,s=0.0,t=0,u=0,v=0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,H=0.0,I=0.0,J=0.0,K=0.0;x=l;l=l+544|0;f=+g[b+100>>2];k=+g[b+104>>2];h=+g[b+108>>2];if(f*f+k*k+h*h>0.0){m=+E(+(1.0-+g[b+244>>2]),+e);g[b+100>>2]=f*m;g[b+104>>2]=m*k;g[b+108>>2]=m*h;f=f*m;k=m*k;h=m*h}m=f*f+k*k+h*h;if(m>0.0){q=c[b+8>>2]|0;c[x+472>>2]=c[q+4>>2];c[x+472+4>>2]=c[q+4+4>>2];c[x+472+8>>2]=c[q+4+8>>2];c[x+472+12>>2]=c[q+4+12>>2];i=x+472+16|0;c[i>>2]=c[q+20>>2];c[i+4>>2]=c[q+20+4>>2];c[i+8>>2]=c[q+20+8>>2];c[i+12>>2]=c[q+20+12>>2];j=x+472+32|0;c[j>>2]=c[q+36>>2];c[j+4>>2]=c[q+36+4>>2];c[j+8>>2]=c[q+36+8>>2];c[j+12>>2]=c[q+36+12>>2];o=x+472+48|0;c[o>>2]=c[q+52>>2];c[o+4>>2]=c[q+52+4>>2];c[o+8>>2]=c[q+52+8>>2];c[o+12>>2]=c[q+52+12>>2];K=+D(+m);I=f*(1.0/K);B=k*(1.0/K);m=h*(1.0/K);h=+G(+(K*e*.5))/+D(+(m*m+(I*I+B*B)));K=+F(+(K*e*.5));yh(x+472|0,x+408|0);H=+g[x+408>>2];J=+g[x+408+12>>2];y=+g[x+408+8>>2];z=+g[x+408+4>>2];f=K*H+I*h*J+B*h*y-m*h*z;k=m*h*H+(B*h*J+K*z)-I*h*y;A=m*h*J+K*y+I*h*z-B*h*H;y=K*J-I*h*H-B*h*z-m*h*y;h=f*(2.0/(y*y+(A*A+(f*f+k*k))));m=k*(2.0/(y*y+(A*A+(f*f+k*k))));z=A*(2.0/(y*y+(A*A+(f*f+k*k))));g[x+472>>2]=1.0-(k*m+A*z);g[x+472+4>>2]=f*m-y*z;g[x+472+8>>2]=f*z+y*m;g[x+472+12>>2]=0.0;g[x+472+16>>2]=f*m+y*z;g[x+472+20>>2]=1.0-(f*h+A*z);g[x+472+24>>2]=k*z-y*h;g[x+472+28>>2]=0.0;g[x+472+32>>2]=f*z-y*m;g[x+472+36>>2]=k*z+y*h;g[x+472+40>>2]=1.0-(f*h+k*m);g[x+472+44>>2]=0.0;q=c[b+8>>2]|0;c[q+304>>2]=(c[q+304>>2]|0)+1;c[q+4>>2]=c[x+472>>2];c[q+4+4>>2]=c[x+472+4>>2];c[q+4+8>>2]=c[x+472+8>>2];c[q+4+12>>2]=c[x+472+12>>2];c[q+20>>2]=c[i>>2];c[q+20+4>>2]=c[i+4>>2];c[q+20+8>>2]=c[i+8>>2];c[q+20+12>>2]=c[i+12>>2];c[q+36>>2]=c[j>>2];c[q+36+4>>2]=c[j+4>>2];c[q+36+8>>2]=c[j+8>>2];c[q+36+12>>2]=c[j+12>>2];c[q+52>>2]=c[o>>2];c[q+52+4>>2]=c[o+4>>2];c[q+52+8>>2]=c[o+8>>2];c[q+52+12>>2]=c[o+12>>2];q=c[b+8>>2]|0;c[b+132>>2]=c[q+52>>2];c[b+132+4>>2]=c[q+52+4>>2];c[b+132+8>>2]=c[q+52+8>>2];c[b+132+12>>2]=c[q+52+12>>2];$p(b+152|0,q+52|0,16)|0;yh(q+4|0,x+408|0);c[b+168>>2]=c[x+408>>2];c[b+168+4>>2]=c[x+408+4>>2];c[b+168+8>>2]=c[x+408+8>>2];c[b+168+12>>2]=c[x+408+12>>2];c[b+184>>2]=c[b+168>>2];c[b+184+4>>2]=c[b+168+4>>2];c[b+184+8>>2]=c[b+168+8>>2];c[b+184+12>>2]=c[b+168+12>>2]}if((a[b+251>>0]|0)==0?+g[b+252>>2]<=0.0:0){l=x;return}a[b+248>>0]=(xb[c[(c[b>>2]|0)+48>>2]&127](b)|0)&1;f=+g[b+68>>2];h=+g[b+72>>2];k=+g[b+76>>2];m=+E(+(1.0-+g[b+240>>2]),+e);if(f*f+h*h+k*k>0.0){g[b+68>>2]=f*m;g[b+72>>2]=m*h;g[b+76>>2]=m*k}f=m*+g[b+20>>2]-+g[b+52>>2]*e;g[b+20>>2]=f;if(f>0.0?(p=+g[b+32>>2],f>p):0){g[b+20>>2]=p;f=p}if(f<0.0?(K=+C(+f),r=+C(+(+g[b+28>>2])),K>r):0){g[b+20>>2]=-r;f=-r}h=f*e;g[b+24>>2]=h;q=c[b+8>>2]|0;c[x>>2]=c[q+4>>2];c[x+4>>2]=c[q+4+4>>2];c[x+8>>2]=c[q+4+8>>2];c[x+12>>2]=c[q+4+12>>2];c[x+16>>2]=c[q+20>>2];c[x+16+4>>2]=c[q+20+4>>2];c[x+16+8>>2]=c[q+20+8>>2];c[x+16+12>>2]=c[q+20+12>>2];c[x+32>>2]=c[q+36>>2];c[x+32+4>>2]=c[q+36+4>>2];c[x+32+8>>2]=c[q+36+8>>2];c[x+32+12>>2]=c[q+36+12>>2];c[x+48>>2]=c[q+52>>2];c[x+48+4>>2]=c[q+52+4>>2];c[x+48+8>>2]=c[q+52+8>>2];c[x+48+12>>2]=c[q+52+12>>2];if(f<0.0)k=+g[b+60>>2];else k=0.0;c[x+472>>2]=1065353216;o=x+472+4|0;c[o>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;c[x+472+20>>2]=1065353216;q=x+472+24|0;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[x+472+40>>2]=1065353216;c[x+472+44>>2]=0;c[x+408>>2]=1065353216;j=x+408+4|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[x+408+20>>2]=1065353216;i=x+408+24|0;c[i>>2]=0;c[i+4>>2]=0;c[i+8>>2]=0;c[i+12>>2]=0;c[x+408+40>>2]=1065353216;c[x+408+44>>2]=0;c[x+472+48>>2]=c[b+132>>2];c[x+472+48+4>>2]=c[b+132+4>>2];c[x+472+48+8>>2]=c[b+132+8>>2];c[x+472+48+12>>2]=c[b+132+12>>2];A=h>0.0?h:0.0;J=k*+g[b+260>>2]+ +g[b+136>>2]+A*+g[b+276>>2];B=k*+g[b+264>>2]+ +g[b+140>>2]+A*+g[b+280>>2];g[b+152>>2]=k*+g[b+256>>2]+ +g[b+132>>2]+ +g[b+272>>2]*A;g[b+156>>2]=J;g[b+160>>2]=B;g[b+164>>2]=0.0;c[b+132>>2]=c[b+152>>2];c[b+132+4>>2]=c[b+152+4>>2];c[b+132+8>>2]=c[b+152+8>>2];c[b+132+12>>2]=c[b+152+12>>2];c[x+408+48>>2]=c[b+152>>2];c[x+408+48+4>>2]=c[b+152+4>>2];c[x+408+48+8>>2]=c[b+152+8>>2];c[x+408+48+12>>2]=c[b+152+12>>2];B=+g[b+168>>2];J=+g[b+172>>2];A=+g[b+176>>2];K=+g[b+180>>2];z=B*(2.0/(B*B+J*J+A*A+K*K));H=J*(2.0/(B*B+J*J+A*A+K*K));I=A*(2.0/(B*B+J*J+A*A+K*K));g[x+472>>2]=1.0-(J*H+A*I);g[o>>2]=B*H-K*I;g[x+472+8>>2]=B*I+K*H;g[x+472+12>>2]=0.0;g[x+472+16>>2]=B*H+K*I;g[x+472+20>>2]=1.0-(B*z+A*I);g[q>>2]=J*I-K*z;g[x+472+28>>2]=0.0;g[x+472+32>>2]=B*I-K*H;g[x+472+36>>2]=J*I+K*z;g[x+472+40>>2]=1.0-(B*z+J*H);g[x+472+44>>2]=0.0;H=+g[b+184>>2];J=+g[b+188>>2];z=+g[b+192>>2];B=+g[b+196>>2];K=H*(2.0/(H*H+J*J+z*z+B*B));I=J*(2.0/(H*H+J*J+z*z+B*B));A=z*(2.0/(H*H+J*J+z*z+B*B));g[x+408>>2]=1.0-(J*I+z*A);g[j>>2]=H*I-B*A;g[x+408+8>>2]=H*A+B*I;g[x+408+12>>2]=0.0;g[x+408+16>>2]=H*I+B*A;g[x+408+20>>2]=1.0-(H*K+z*A);g[i>>2]=J*A-B*K;g[x+408+28>>2]=0.0;g[x+408+32>>2]=H*A-B*I;g[x+408+36>>2]=J*A+B*K;g[x+408+40>>2]=1.0-(H*K+J*I);g[x+408+44>>2]=0.0;i=c[b+8>>2]|0;I=-+g[b+256>>2];J=-+g[b+260>>2];K=-+g[b+264>>2];j=c[b+48>>2]|0;g[x+296+4>>2]=1.0;q=x+296+16|0;c[x+296+80>>2]=0;c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;c[q+16>>2]=0;c[q+20>>2]=0;c[q+24>>2]=0;c[q+28>>2]=0;c[x+296>>2]=5252;c[x+296+84>>2]=i;g[x+296+88>>2]=I;g[x+296+92>>2]=J;g[x+296+96>>2]=K;g[x+296+100>>2]=0.0;c[x+296+104>>2]=j;j=c[i+188>>2]|0;c[x+296+8>>2]=c[j+4>>2];c[x+296+12>>2]=c[j+8>>2];j=c[b+12>>2]|0;if(!(a[b+250>>0]|0))Ud(d,j,x+472|0,x+408|0,x+296|0,+g[d+56>>2]);else pd(i,j,x+472|0,x+408|0,x+296|0,+g[d+56>>2]);if((+g[x+296+4>>2]<1.0?(n=c[b+8>>2]|0,(c[n+204>>2]&4|0)==0):0)?Bb[c[(c[b>>2]|0)+56>>2]&63](b,n,c[x+296+80>>2]|0)|0:0){do if(+g[x+296+48>>2]*+g[b+256>>2]+ +g[x+296+52>>2]*+g[b+260>>2]+ +g[x+296+56>>2]*+g[b+264>>2]>0.0){f=+g[x+296+4>>2];g[b+148>>2]=k*f;if(!(a[b+288>>0]|0)){c[b+132>>2]=c[b+152>>2];c[b+132+4>>2]=c[b+152+4>>2];c[b+132+8>>2]=c[b+152+8>>2];c[b+132+12>>2]=c[b+152+12>>2];break}else{g[b+132>>2]=(1.0-f)*+g[b+132>>2]+f*+g[b+152>>2];g[b+136>>2]=(1.0-f)*+g[b+136>>2]+f*+g[b+156>>2];g[b+140>>2]=(1.0-f)*+g[b+140>>2]+f*+g[b+160>>2];break}}while(0);o=c[b+8>>2]|0;c[o+52>>2]=c[b+132>>2];c[o+52+4>>2]=c[b+132+4>>2];c[o+52+8>>2]=c[b+132+8>>2];c[o+52+12>>2]=c[b+132+12>>2];q=c[b+8>>2]|0;c[q+304>>2]=(c[q+304>>2]|0)+1;c[q+4>>2]=c[o+4>>2];c[q+4+4>>2]=c[o+4+4>>2];c[q+4+8>>2]=c[o+4+8>>2];c[q+4+12>>2]=c[o+4+12>>2];c[q+20>>2]=c[o+20>>2];c[q+20+4>>2]=c[o+20+4>>2];c[q+20+8>>2]=c[o+20+8>>2];c[q+20+12>>2]=c[o+20+12>>2];c[q+36>>2]=c[o+36>>2];c[q+36+4>>2]=c[o+36+4>>2];c[q+36+8>>2]=c[o+36+8>>2];c[q+36+12>>2]=c[o+36+12>>2];c[q+52>>2]=c[o+52>>2];c[q+52+4>>2]=c[o+52+4>>2];c[q+52+8>>2]=c[o+52+8>>2];c[q+52+12>>2]=c[o+52+12>>2];a[b+220>>0]=0;if((((ge(b,d)|0?(a[b+220>>0]=1,ge(b,d)|0):0)?(a[b+220>>0]=1,ge(b,d)|0):0)?(a[b+220>>0]=1,ge(b,d)|0):0)?(a[b+220>>0]=1,ge(b,d)|0):0)a[b+220>>0]=1;q=(c[b+8>>2]|0)+52|0;c[b+152>>2]=c[q>>2];c[b+152+4>>2]=c[q+4>>2];c[b+152+8>>2]=c[q+8>>2];c[b+152+12>>2]=c[q+12>>2];$p(b+132|0,q|0,16)|0;if(+g[b+24>>2]>0.0){g[b+24>>2]=0.0;g[b+20>>2]=0.0;c[b+148>>2]=c[b+60>>2]}}else{g[b+148>>2]=k;c[b+132>>2]=c[b+152>>2];c[b+132+4>>2]=c[b+152+4>>2];c[b+132+8>>2]=c[b+152+8>>2];c[b+132+12>>2]=c[b+152+12>>2]}if(!(a[b+251>>0]|0)){J=+g[b+252>>2];K=J>e?e:J;g[b+252>>2]=J-e;hd(b,d,K*+g[b+68>>2],K*+g[b+72>>2],K*+g[b+76>>2])}else hd(b,d,+g[b+68>>2],+g[b+72>>2],+g[b+76>>2]);c[x+280>>2]=c[b+152>>2];c[x+280+4>>2]=c[b+152+4>>2];c[x+280+8>>2]=c[b+152+8>>2];c[x+280+12>>2]=c[b+152+12>>2];K=+g[b+20>>2];f=(K<0.0?-K:0.0)*e;if(!(K>0.0)){do if(f>0.0?(s=+g[b+28>>2],f>s):0){if((a[b+248>>0]|0)==0?a[b+249>>0]|0:0)break;f=s}while(0);p=f+ +g[b+148>>2];k=+g[b+256>>2]*p;m=p*+g[b+260>>2];p=p*+g[b+264>>2];g[b+152>>2]=+g[b+152>>2]-k;g[b+156>>2]=+g[b+156>>2]-m;g[b+160>>2]=+g[b+160>>2]-p;i=c[b+8>>2]|0;o=c[b+48>>2]|0;q=x+172+4|0;g[q>>2]=1.0;n=x+172+16|0;c[x+172+80>>2]=0;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;c[n+16>>2]=0;c[n+20>>2]=0;c[n+24>>2]=0;c[n+28>>2]=0;c[x+172>>2]=5252;c[x+172+84>>2]=i;c[x+172+88>>2]=c[b+256>>2];c[x+172+88+4>>2]=c[b+256+4>>2];c[x+172+88+8>>2]=c[b+256+8>>2];c[x+172+88+12>>2]=c[b+256+12>>2];c[x+172+104>>2]=o;n=c[i+188>>2]|0;c[x+172+8>>2]=c[n+4>>2];c[x+172+12>>2]=c[n+8>>2];g[x+64+4>>2]=1.0;j=x+64+16|0;c[x+64+80>>2]=0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;c[j+20>>2]=0;c[j+24>>2]=0;c[j+28>>2]=0;c[x+64>>2]=5252;c[x+64+84>>2]=i;c[x+64+88>>2]=c[b+256>>2];c[x+64+88+4>>2]=c[b+256+4>>2];c[x+64+88+8>>2]=c[b+256+8>>2];c[x+64+88+12>>2]=c[b+256+12>>2];c[x+64+104>>2]=o;c[x+64+8>>2]=c[n+4>>2];c[x+64+12>>2]=c[n+8>>2];n=x+408+24|0;o=x+296+44|0;i=0;while(1){c[x+408+12>>2]=0;c[x+408+12+4>>2]=0;c[x+408+20>>2]=1065353216;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;c[x+408+40>>2]=1065353216;c[x+408+44>>2]=0;c[x+296>>2]=1065353216;c[x+296+4>>2]=0;c[x+296+4+4>>2]=0;c[x+296+4+8>>2]=0;c[x+296+4+12>>2]=0;c[x+296+20>>2]=1065353216;c[x+296+24>>2]=0;c[x+296+24+4>>2]=0;c[x+296+24+8>>2]=0;c[x+296+24+12>>2]=0;c[x+296+40>>2]=1065353216;c[o>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;c[o+16>>2]=0;c[x+472+48>>2]=c[b+132>>2];c[x+472+48+4>>2]=c[b+132+4>>2];c[x+472+48+8>>2]=c[b+132+8>>2];c[x+472+48+12>>2]=c[b+132+12>>2];c[x+408+48>>2]=c[b+152>>2];c[x+408+48+4>>2]=c[b+152+4>>2];c[x+408+48+8>>2]=c[b+152+8>>2];c[x+408+48+12>>2]=c[b+152+12>>2];B=+g[b+168>>2];K=+g[b+172>>2];A=+g[b+176>>2];I=+g[b+180>>2];z=B*(2.0/(B*B+K*K+A*A+I*I));H=K*(2.0/(B*B+K*K+A*A+I*I));J=A*(2.0/(B*B+K*K+A*A+I*I));g[x+472>>2]=1.0-(K*H+A*J);g[x+472+4>>2]=B*H-I*J;g[x+472+8>>2]=B*J+I*H;g[x+472+12>>2]=0.0;g[x+472+16>>2]=B*H+I*J;g[x+472+20>>2]=1.0-(B*z+A*J);g[x+472+24>>2]=K*J-I*z;g[x+472+28>>2]=0.0;g[x+472+32>>2]=B*J-I*H;g[x+472+36>>2]=K*J+I*z;g[x+472+40>>2]=1.0-(B*z+K*H);g[x+472+44>>2]=0.0;H=+g[b+184>>2];K=+g[b+188>>2];z=+g[b+192>>2];B=+g[b+196>>2];I=H*(2.0/(H*H+K*K+z*z+B*B));J=K*(2.0/(H*H+K*K+z*z+B*B));A=z*(2.0/(H*H+K*K+z*z+B*B));g[x+408>>2]=1.0-(K*J+z*A);g[x+408+4>>2]=H*J-B*A;g[x+408+8>>2]=H*A+B*J;g[x+408+12>>2]=0.0;g[x+408+16>>2]=H*J+B*A;g[x+408+20>>2]=1.0-(H*I+z*A);g[n>>2]=K*A-B*I;g[x+408+28>>2]=0.0;g[x+408+32>>2]=H*A-B*J;g[x+408+36>>2]=K*A+B*I;g[x+408+40>>2]=1.0-(H*I+K*J);g[x+408+44>>2]=0.0;J=+g[b+156>>2]-m;K=+g[b+160>>2]-p;g[x+296+48>>2]=+g[b+152>>2]-k;g[x+296+52>>2]=J;g[x+296+56>>2]=K;g[x+296+60>>2]=0.0;if(!(a[b+250>>0]|0)){Ud(d,c[b+12>>2]|0,x+472|0,x+408|0,x+172|0,+g[d+56>>2]);if(!(+g[q>>2]<1.0)?(c[(c[b+8>>2]|0)+204>>2]&4|0)==0:0)Ud(d,c[b+12>>2]|0,x+472|0,x+296|0,x+64|0,+g[d+56>>2])}else{pd(c[b+8>>2]|0,c[b+12>>2]|0,x+472|0,x+408|0,x+172|0,+g[d+56>>2]);if(!(+g[q>>2]<1.0)?(t=c[b+8>>2]|0,(c[t+204>>2]&4|0)==0):0)pd(t,c[b+12>>2]|0,x+472|0,x+296|0,x+64|0,+g[d+56>>2])}h=+g[b+20>>2];h=(h<0.0?-h:0.0)*e;if(!(a[b+290>>0]|0))if(+g[x+64+4>>2]<1.0?(v=c[b+8>>2]|0,(c[v+204>>2]&4|0)==0):0)j=Bb[c[(c[b>>2]|0)+56>>2]&63](b,v,c[x+64+80>>2]|0)|0;else j=0;else if((+g[q>>2]<1.0?1:+g[x+64+4>>2]<1.0)?(u=c[b+8>>2]|0,(c[u+204>>2]&4|0)==0):0)j=Bb[c[(c[b>>2]|0)+56>>2]&63](b,u,c[x+172+80>>2]|0)|0;else j=0;if(+g[b+20>>2]<0.0)f=+g[b+60>>2];else f=0.0;if(i|(!(h>0.0)|!(h>0]|0)==0?a[b+249>>0]|0:0){i=0;break}c[b+152>>2]=c[x+280>>2];c[b+152+4>>2]=c[x+280+4>>2];c[b+152+8>>2]=c[x+280+8>>2];c[b+152+12>>2]=c[x+280+12>>2];p=f+ +g[b+148>>2];k=+g[b+256>>2]*p;m=p*+g[b+260>>2];p=p*+g[b+264>>2];g[b+152>>2]=+g[b+152>>2]-k;g[b+156>>2]=+g[b+156>>2]-m;g[b+160>>2]=+g[b+160>>2]-p;i=1}j=c[b+8>>2]|0;if(+g[q>>2]<1.0?(c[j+204>>2]&4|0)==0:0)if(i|(Bb[c[(c[b>>2]|0)+56>>2]&63](b,j,c[x+172+80>>2]|0)|0))i=69;else i=73;else if(i)i=69;else i=73;if((i|0)==69){if(!(a[b+290>>0]|0)){i=b+289|0;f=+g[q>>2];h=+g[b+136>>2]}else{h=+g[b+136>>2];i=b+289|0;f=(a[b+289>>0]|0)==0?(h-+g[x+172+68>>2])*.5:+g[q>>2]}K=1.0-f;g[b+132>>2]=K*+g[b+132>>2]+f*+g[b+152>>2];g[b+136>>2]=K*h+f*+g[b+156>>2];g[b+140>>2]=K*+g[b+140>>2]+f*+g[b+160>>2];a[i>>0]=0;g[b+20>>2]=0.0;g[b+24>>2]=0.0;a[b+249>>0]=0}else if((i|0)==73){a[b+289>>0]=1;do if(a[b+290>>0]|0?(K=+g[b+20>>2],w=+g[b+28>>2],(K<0.0?-K:0.0)*e>w):0){if((a[b+248>>0]|0)==0?a[b+249>>0]|0:0)break;H=m+ +g[b+156>>2];J=p+ +g[b+160>>2];B=w+ +g[b+148>>2];I=B*+g[b+260>>2];K=B*+g[b+264>>2];g[b+152>>2]=k+ +g[b+152>>2]-+g[b+256>>2]*B;g[b+156>>2]=H-I;g[b+160>>2]=J-K}while(0);c[b+132>>2]=c[b+152>>2];c[b+132+4>>2]=c[b+152+4>>2];c[b+132+8>>2]=c[b+152+8>>2];c[b+132+12>>2]=c[b+152+12>>2]}}c[x+48>>2]=c[b+132>>2];c[x+48+4>>2]=c[b+132+4>>2];c[x+48+8>>2]=c[b+132+8>>2];c[x+48+12>>2]=c[b+132+12>>2];v=c[b+8>>2]|0;c[v+304>>2]=(c[v+304>>2]|0)+1;c[v+4>>2]=c[x>>2];c[v+4+4>>2]=c[x+4>>2];c[v+4+8>>2]=c[x+8>>2];c[v+4+12>>2]=c[x+12>>2];c[v+20>>2]=c[x+16>>2];c[v+20+4>>2]=c[x+16+4>>2];c[v+20+8>>2]=c[x+16+8>>2];c[v+20+12>>2]=c[x+16+12>>2];c[v+36>>2]=c[x+32>>2];c[v+36+4>>2]=c[x+32+4>>2];c[v+36+8>>2]=c[x+32+8>>2];c[v+36+12>>2]=c[x+32+12>>2];c[v+52>>2]=c[x+48>>2];c[v+52+4>>2]=c[x+48+4>>2];c[v+52+8>>2]=c[x+48+8>>2];c[v+52+12>>2]=c[x+48+12>>2];a[b+220>>0]=0;if((((ge(b,d)|0?(a[b+220>>0]=1,ge(b,d)|0):0)?(a[b+220>>0]=1,ge(b,d)|0):0)?(a[b+220>>0]=1,ge(b,d)|0):0)?(a[b+220>>0]=1,ge(b,d)|0):0)a[b+220>>0]=1;l=x;return}function uc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,k=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0,t=0.0,u=0.0,v=0,w=0,x=0.0,y=0,z=0.0,A=0,B=0.0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;I=l;l=l+192|0;if((e|0)<1){f=c[b+12>>2]|0;if(f|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;f=c[b+32>>2]|0;if(f|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;f=c[b+52>>2]|0;if(f|0){if(a[b+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+52>>2]=0}a[b+56>>0]=1;c[b+52>>2]=0;c[b+44>>2]=0;c[b+48>>2]=0;l=I;return}c[I+32>>2]=0;c[I+36>>2]=0;c[I+40>>2]=0;c[I+44>>2]=256;c[I+48>>2]=0;c[I+52>>2]=0;c[I+56>>2]=0;c[I+60>>2]=256;c[I+64>>2]=0;c[I+68>>2]=0;c[I+72>>2]=0;c[I+76>>2]=256;a[I+96>>0]=1;c[I+92>>2]=0;c[I+84>>2]=0;c[I+88>>2]=0;f=0;h=d;i=-246811958;s=1900671690;v=-246811958;w=1900671690;y=-246811958;A=1900671690;while(1){k=c[h>>2]|0;p=c[h+4>>2]|0;q=c[h+8>>2]|0;m=(c[j>>2]=k,+g[j>>2]);s=m<(c[j>>2]=s,+g[j>>2])?k:s;n=(c[j>>2]=p,+g[j>>2]);w=n<(c[j>>2]=w,+g[j>>2])?p:w;o=(c[j>>2]=q,+g[j>>2]);A=o<(c[j>>2]=A,+g[j>>2])?q:A;i=(c[j>>2]=i,+g[j>>2])>2]=v,+g[j>>2])>2]=y,+g[j>>2])>2]=i,+g[j>>2]);z=(c[j>>2]=s,+g[j>>2]);x=(c[j>>2]=v,+g[j>>2]);u=(c[j>>2]=w,+g[j>>2]);t=(c[j>>2]=y,+g[j>>2]);r=(c[j>>2]=A,+g[j>>2]);g[I+168>>2]=B-z;s=I+168+4|0;g[s>>2]=x-u;v=I+168+8|0;g[v>>2]=t-r;g[I+168+12>>2]=0.0;h=+g[I+168+((B-z>2]>2]=h;f=+g[I+168+((!(B-z>2]>>0)%3|0;c[I+104>>2]=f;G=(h^3)-f|0;c[I+108>>2]=G;g[I+168>>2]=(B-z)*9.788566967472434e-05;g[s>>2]=(x-u)*9.788566967472434e-05;g[v>>2]=(t-r)*9.788566967472434e-05;if(((G+1|0)%3|0|0)==(h|0)){m=(B-z)*9.788566967472434e-05;n=(x-u)*9.788566967472434e-05;o=(t-r)*9.788566967472434e-05}else{g[I+168>>2]=-((B-z)*9.788566967472434e-05);g[s>>2]=-((x-u)*9.788566967472434e-05);g[v>>2]=-((t-r)*9.788566967472434e-05);m=-((B-z)*9.788566967472434e-05);n=-((x-u)*9.788566967472434e-05);o=-((t-r)*9.788566967472434e-05)}c[I>>2]=c[I+168>>2];c[I+4>>2]=c[I+168+4>>2];c[I+8>>2]=c[I+168+8>>2];c[I+12>>2]=c[I+168+12>>2];if(m!=0.0)g[I+168>>2]=1.0/m;if(n!=0.0)g[s>>2]=1.0/n;if(o!=0.0)g[v>>2]=1.0/o;g[I+16>>2]=(B+z)*.5;g[I+20>>2]=(x+u)*.5;g[I+24>>2]=(t+r)*.5;g[I+28>>2]=0.0;w=I+144+16|0;a[w>>0]=1;y=I+144+12|0;c[y>>2]=0;c[I+144+4>>2]=0;c[I+144+8>>2]=0;c[6995]=(c[6995]|0)+1;f=sc((e<<4|3)+16|0)|0;if(!f)h=0;else{c[(f+4+15&-16)+-4>>2]=f;h=f+4+15&-16}i=c[I+144+4>>2]|0;k=c[y>>2]|0;if((i|0)<=0){if(k|0)H=32}else{f=0;do{H=h+(f<<4)|0;G=k+(f<<4)|0;c[H>>2]=c[G>>2];c[H+4>>2]=c[G+4>>2];c[H+8>>2]=c[G+8>>2];c[H+12>>2]=c[G+12>>2];f=f+1|0}while((f|0)!=(i|0));H=32}if((H|0)==32){if(a[w>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[y>>2]=0}a[w>>0]=1;c[y>>2]=h;c[I+144+8>>2]=e;c[h>>2]=c[I+128>>2];c[h+4>>2]=c[I+128+4>>2];c[h+8>>2]=c[I+128+8>>2];c[h+12>>2]=c[I+128+12>>2];if((e|0)!=1){f=1;do{G=(c[y>>2]|0)+(f<<4)|0;c[G>>2]=c[I+128>>2];c[G+4>>2]=c[I+128+4>>2];c[G+8>>2]=c[I+128+8>>2];c[G+12>>2]=c[I+128+12>>2];f=f+1|0}while((f|0)!=(e|0))}c[I+144+4>>2]=e;i=I+128+(c[I+108>>2]<<2)|0;k=c[y>>2]|0;p=I+128+(c[I+112>>2]<<2)|0;q=I+128+(c[I+104>>2]<<2)|0;o=+g[I+16>>2];r=+g[I+20>>2];t=+g[I+24>>2];u=+g[I+168>>2];n=+g[s>>2];m=+g[v>>2];h=0;f=d;while(1){z=(+g[f+4>>2]-r)*n;B=(+g[f+8>>2]-t)*m;g[I+128>>2]=(+g[f>>2]-o)*u;g[I+128+4>>2]=z;g[I+128+8>>2]=B;g[I+128+12>>2]=0.0;c[k+(h<<4)>>2]=~~+g[i>>2];c[k+(h<<4)+4>>2]=~~+g[p>>2];c[k+(h<<4)+8>>2]=~~+g[q>>2];c[k+(h<<4)+12>>2]=h;h=h+1|0;if((h|0)==(e|0))break;else f=f+16|0}if((e|0)>1)ah(I+144|0,0,e+-1|0);c[I+36>>2]=c[I+32>>2];c[I+40>>2]=0;c[I+44>>2]=e;f=c[I+84>>2]|0;if((f|0)<(e|0)){if((c[I+88>>2]|0)<(e|0)){if(!e){h=0;k=f}else{c[6995]=(c[6995]|0)+1;h=sc((e<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}k=c[I+84>>2]|0}if((k|0)>0){i=0;do{c[h+(i<<2)>>2]=c[(c[I+92>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(k|0))}i=c[I+92>>2]|0;if(i|0){if(a[I+96>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[I+92>>2]=0}a[I+96>>0]=1;c[I+92>>2]=h;c[I+88>>2]=e}do{c[(c[I+92>>2]|0)+(f<<2)>>2]=0;f=f+1|0}while((f|0)!=(e|0))}c[I+84>>2]=e;p=0;do{f=c[I+40>>2]|0;if(!f){f=c[I+36>>2]|0;if(!f){c[6995]=(c[6995]|0)+1;f=sc(31)|0;if(!f)h=0;else{c[(f+4+15&-16)+-4>>2]=f;h=f+4+15&-16}f=c[I+44>>2]|0;c[h+4>>2]=f;i=h+8|0;c[i>>2]=0;c[6995]=(c[6995]|0)+1;f=sc((f*112|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}c[h>>2]=f;c[i>>2]=c[I+32>>2];c[I+32>>2]=h}else{c[I+36>>2]=c[f+8>>2];h=f}f=c[h>>2]|0;k=c[h+4>>2]|0;if((k|0)>0){h=0;i=f;do{h=h+1|0;G=i;i=i+112|0;c[G>>2]=(h|0)<(k|0)?i:0}while((h|0)!=(k|0))}}c[I+40>>2]=c[f>>2];G=f+104|0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[G>>2]=-1;c[f+8>>2]=0;E=(c[y>>2]|0)+(p<<4)|0;F=f+88|0;c[F>>2]=c[E>>2];c[F+4>>2]=c[E+4>>2];c[F+8>>2]=c[E+8>>2];c[F+12>>2]=c[E+12>>2];c[G>>2]=-1;c[(c[I+92>>2]|0)+(p<<2)>>2]=f;p=p+1|0}while((p|0)<(e|0));f=c[y>>2]|0;if(f|0){if(a[w>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[y>>2]=0}a[w>>0]=1;c[y>>2]=0;c[I+144+4>>2]=0;c[I+144+8>>2]=0;c[I+52>>2]=c[I+48>>2];c[I+56>>2]=0;c[I+60>>2]=e*6;c[I+116>>2]=0;c[I+120>>2]=0;c[I+100>>2]=-3;c[I+128>>2]=0;c[I+128+4>>2]=0;c[I+128+8>>2]=0;c[I+128+12>>2]=0;mc(I,0,e,I+128|0);c[I+124>>2]=c[I+128>>2];f=c[y>>2]|0;if(f|0){if(a[w>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[y>>2]=0}f=c[b+4>>2]|0;if((f|0)<0){if((c[b+8>>2]|0)<0){h=c[b+12>>2]|0;if(h|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=0;c[b+8>>2]=0}do{G=(c[b+12>>2]|0)+(f<<4)|0;c[G>>2]=c[I+168>>2];c[G+4>>2]=c[I+168+4>>2];c[G+8>>2]=c[I+168+8>>2];c[G+12>>2]=c[I+168+12>>2];f=f+1|0}while((f|0)!=0)}c[b+4>>2]=0;c[I+168>>2]=0;c[I+168+4>>2]=0;c[I+168+8>>2]=0;f=c[b+24>>2]|0;if((f|0)<0){if((c[b+28>>2]|0)<0){h=c[b+32>>2]|0;if(h|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+28>>2]=0}do{G=(c[b+32>>2]|0)+(f*12|0)|0;c[G>>2]=c[I+168>>2];c[G+4>>2]=c[I+168+4>>2];c[G+8>>2]=c[I+168+8>>2];f=f+1|0}while((f|0)!=0)}c[b+24>>2]=0;h=c[b+44>>2]|0;if((h|0)<0){f=c[b+52>>2]|0;if((c[b+48>>2]|0)<0){do if(f|0){if(!(a[b+56>>0]|0))break;c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}while(0);a[b+56>>0]=1;c[b+52>>2]=0;c[b+48>>2]=0;f=0}Yk(f+(h<<2)|0,0,P(h,-4)|0)|0}c[b+44>>2]=0;h=c[I+124>>2]|0;do if((c[h+104>>2]|0)<0){c[h+104>>2]=0;c[6995]=(c[6995]|0)+1;f=sc(23)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}c[f>>2]=h;G=0;s=1;v=f;w=1;i=f;y=f;while(1){if((c[h+100>>2]|0)>-1){g[I+168+(c[I+108>>2]<<2)>>2]=+(c[h+88>>2]|0);g[I+168+(c[I+112>>2]<<2)>>2]=+(c[h+92>>2]|0);m=+(c[h+96>>2]|0)}else{F=h+24|0;E=h+32|0;B=+ln(c[F>>2]|0,c[F+4>>2]|0,c[E>>2]|0,c[E+4>>2]|0);E=h+72|0;F=h+80|0;m=+ln(c[E>>2]|0,c[E+4>>2]|0,c[F>>2]|0,c[F+4>>2]|0);g[I+168+(c[I+108>>2]<<2)>>2]=B/m;F=h+40|0;E=h+48|0;B=+ln(c[F>>2]|0,c[F+4>>2]|0,c[E>>2]|0,c[E+4>>2]|0)/m;g[I+168+(c[I+112>>2]<<2)>>2]=B;E=h+56|0;F=h+64|0;m=+ln(c[E>>2]|0,c[E+4>>2]|0,c[F>>2]|0,c[F+4>>2]|0)/m}g[I+168+(c[I+104>>2]<<2)>>2]=m;m=+g[I+168>>2]*+g[I>>2]+ +g[I+16>>2];n=+g[I+168+4>>2]*+g[I+4>>2]+ +g[I+20>>2];o=+g[I+168+8>>2]*+g[I+8>>2]+ +g[I+24>>2];f=c[b+4>>2]|0;do if((f|0)==(c[b+8>>2]|0)){q=f|0?f<<1:1;if((f|0)>=(q|0))break;if(!q)p=0;else{c[6995]=(c[6995]|0)+1;f=sc((q<<4|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}p=f;f=c[b+4>>2]|0}if((f|0)>0){k=0;do{F=p+(k<<4)|0;E=(c[b+12>>2]|0)+(k<<4)|0;c[F>>2]=c[E>>2];c[F+4>>2]=c[E+4>>2];c[F+8>>2]=c[E+8>>2];c[F+12>>2]=c[E+12>>2];k=k+1|0}while((k|0)!=(f|0))}f=c[b+12>>2]|0;if(f|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=p;c[b+8>>2]=q;f=c[b+4>>2]|0}while(0);F=c[b+12>>2]|0;g[F+(f<<4)>>2]=m;g[F+(f<<4)+4>>2]=n;g[F+(f<<4)+8>>2]=o;g[F+(f<<4)+12>>2]=0.0;c[b+4>>2]=(c[b+4>>2]|0)+1;F=c[h+8>>2]|0;if(!F){k=s;A=v;h=w}else{D=F;E=-1;f=-1;A=s;e=v;h=w;while(1){C=D+20|0;p=c[C>>2]|0;if((p|0)<0){d=c[b+24>>2]|0;c[I+168>>2]=0;c[I+168+4>>2]=0;c[I+168+8>>2]=0;do if((d|0)==(c[b+28>>2]|0)){s=d|0?d<<1:1;if((d|0)>=(s|0)){k=d;break}if(!s){k=0;q=d}else{c[6995]=(c[6995]|0)+1;k=sc((s*12|3)+16|0)|0;if(!k)k=0;else{c[(k+4+15&-16)+-4>>2]=k;k=k+4+15&-16}q=c[b+24>>2]|0}if((q|0)>0){p=0;do{w=k+(p*12|0)|0;v=(c[b+32>>2]|0)+(p*12|0)|0;c[w>>2]=c[v>>2];c[w+4>>2]=c[v+4>>2];c[w+8>>2]=c[v+8>>2];p=p+1|0}while((p|0)!=(q|0))}p=c[b+32>>2]|0;if(p|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=k;c[b+28>>2]=s;k=c[b+24>>2]|0}else k=d;while(0);k=(c[b+32>>2]|0)+(k*12|0)|0;c[k>>2]=c[I+168>>2];c[k+4>>2]=c[I+168+4>>2];c[k+8>>2]=c[I+168+8>>2];k=(c[b+24>>2]|0)+1|0;c[b+24>>2]=k;c[I+168>>2]=0;c[I+168+4>>2]=0;c[I+168+8>>2]=0;do if((k|0)==(c[b+28>>2]|0)){s=k|0?k<<1:1;if((k|0)>=(s|0))break;if(!s)q=0;else{c[6995]=(c[6995]|0)+1;k=sc((s*12|3)+16|0)|0;if(!k)k=0;else{c[(k+4+15&-16)+-4>>2]=k;k=k+4+15&-16}q=k;k=c[b+24>>2]|0}if((k|0)>0){p=0;do{w=q+(p*12|0)|0;v=(c[b+32>>2]|0)+(p*12|0)|0;c[w>>2]=c[v>>2];c[w+4>>2]=c[v+4>>2];c[w+8>>2]=c[v+8>>2];p=p+1|0}while((p|0)!=(k|0))}k=c[b+32>>2]|0;if(k|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=q;c[b+28>>2]=s;k=c[b+24>>2]|0}while(0);w=(c[b+32>>2]|0)+(k*12|0)|0;c[w>>2]=c[I+168>>2];c[w+4>>2]=c[I+168+4>>2];c[w+8>>2]=c[I+168+8>>2];c[b+24>>2]=(c[b+24>>2]|0)+1;w=c[b+32>>2]|0;c[C>>2]=d;c[(c[D+8>>2]|0)+20>>2]=d+1;c[w+(d*12|0)+4>>2]=1;c[w+((d+1|0)*12|0)+4>>2]=-1;v=c[D+12>>2]|0;k=c[v+104>>2]|0;if((k|0)<0){c[v+104>>2]=h;do if((h|0)==(A|0)){k=A|0?A<<1:1;if((A|0)>=(k|0)){k=A;p=e;s=y;break}do if(!k)q=0;else{c[6995]=(c[6995]|0)+1;p=sc((k<<2|3)+16|0)|0;if(!p){q=0;break}c[(p+4+15&-16)+-4>>2]=p;q=p+4+15&-16}while(0);if((A|0)>0){p=0;do{c[q+(p<<2)>>2]=c[e+(p<<2)>>2];p=p+1|0}while((p|0)!=(A|0));if(!i){p=q;s=q;i=q;break}}else if((e|0)==0|(i|0)==0){p=q;s=q;i=q;break}c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);p=q;s=q;i=q}else{k=A;p=e;s=y}while(0);c[p+(h<<2)>>2]=v;v=h;h=h+1|0;q=s}else{v=k;k=A;p=e;q=y}c[w+(d*12|0)+8>>2]=v;c[w+((d+1|0)*12|0)+8>>2]=G;s=p;p=c[C>>2]|0}else{k=A;s=e;q=y}if((E|0)>-1)c[(c[b+32>>2]|0)+(p*12|0)>>2]=E-p;else f=p;D=c[D>>2]|0;if((D|0)==(F|0))break;else{E=p;A=k;e=s;y=q}}c[(c[b+32>>2]|0)+(f*12|0)>>2]=p-f;A=s;y=q}f=G+1|0;if((f|0)>=(h|0))break;G=f;s=k;v=A;w=h;h=c[A+(f<<2)>>2]|0}if((G|0)>-1){v=0;while(1){w=c[(c[A+(v<<2)>>2]|0)+8>>2]|0;if(w|0){s=w;do{q=s+20|0;f=c[q>>2]|0;if((f|0)>-1){h=c[b+44>>2]|0;do if((h|0)==(c[b+48>>2]|0)){p=h|0?h<<1:1;if((h|0)>=(p|0))break;if(!p)f=0;else{c[6995]=(c[6995]|0)+1;f=sc((p<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[b+44>>2]|0}k=c[b+52>>2]|0;if((h|0)<=0){if(k)H=180}else{i=0;do{c[f+(i<<2)>>2]=c[k+(i<<2)>>2];i=i+1|0}while((i|0)!=(h|0));H=180}if((H|0)==180){H=0;if(a[b+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[b+52>>2]=0;h=c[b+44>>2]|0}a[b+56>>0]=1;c[b+52>>2]=f;c[b+48>>2]=p;f=c[q>>2]|0}while(0);c[(c[b+52>>2]|0)+(h<<2)>>2]=f;c[b+44>>2]=(c[b+44>>2]|0)+1;f=s;do{c[f+20>>2]=-1;f=c[(c[f+8>>2]|0)+4>>2]|0}while((f|0)!=(s|0))}s=c[s>>2]|0}while((s|0)!=(w|0))}if((v|0)==(G|0))break;else v=v+1|0}}if((A|0)==0|(y|0)==0)break;c[6996]=(c[6996]|0)+1;Cd(c[y+-4>>2]|0)}while(0);Ri(I);l=I;return}function vc(b,d,e,f,h,i){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=+i;var j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0,E=0,F=0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0;F=l;l=l+960|0;E=c[f+4>>2]|0;C=c[f+12>>2]|0;j=c[E+4>>2]|0;if((j|0)<20){c[F+776>>2]=3896;c[F+776+168>>2]=0;g[F+776+172>>2]=i;c[F+776+164>>2]=c[h+4>>2];g[F+416+308>>2]=9.999999747378752e-05;a[F+416+332>>0]=0;c[F+352>>2]=9464;c[F+128>>2]=9532;c[F+128+4>>2]=F+416;c[F+128+8>>2]=F+352;c[F+128+12>>2]=b;c[F+128+16>>2]=E;c[F+128+20>>2]=0;if((Wd(F+128|0,d,e,C,C,F+776|0)|0?(u=F+776+132|0,p=+g[u>>2],q=+g[F+776+136>>2],r=+g[F+776+140>>2],p*p+q*q+r*r>9.999999747378752e-05):0)?(s=+g[F+776+164>>2],s<+g[h+4>>2]):0){i=1.0/+D(+(p*p+q*q+r*r));g[u>>2]=p*i;g[F+776+136>>2]=q*i;g[F+776+140>>2]=r*i;c[F+64>>2]=c[f+8>>2];c[F+64+4>>2]=0;c[F+64+8>>2]=c[u>>2];c[F+64+8+4>>2]=c[u+4>>2];c[F+64+8+8>>2]=c[u+8>>2];c[F+64+8+12>>2]=c[u+12>>2];c[F+64+24>>2]=c[F+776+148>>2];c[F+64+24+4>>2]=c[F+776+148+4>>2];c[F+64+24+8>>2]=c[F+776+148+8>>2];c[F+64+24+12>>2]=c[F+776+148+12>>2];g[F+64+40>>2]=s;+qb[c[(c[h>>2]|0)+12>>2]&31](h,F+64|0,1)}l=F;return}if((j+-21|0)>>>0>=9){if((j|0)!=31){l=F;return}u=c[(c[b>>2]|0)+8>>2]|0;M=+g[C>>2];N=+g[C+16>>2];O=+g[C+32>>2];w=+g[C+4>>2];v=+g[C+20>>2];s=+g[C+36>>2];r=+g[C+8>>2];p=+g[C+24>>2];n=+g[C+40>>2];B=-+g[C+48>>2];z=-+g[C+52>>2];x=-+g[C+56>>2];k=+g[d>>2];A=+g[d+16>>2];y=+g[d+32>>2];G=+g[d+4>>2];H=+g[d+20>>2];I=+g[d+36>>2];J=+g[d+8>>2];K=+g[d+24>>2];L=+g[d+40>>2];q=+g[d+48>>2];o=+g[d+52>>2];m=+g[d+56>>2];g[F+64>>2]=M*k+N*A+O*y;g[F+64+4>>2]=M*G+N*H+O*I;g[F+64+8>>2]=M*J+N*K+O*L;g[F+64+12>>2]=0.0;g[F+64+16>>2]=w*k+v*A+s*y;g[F+64+20>>2]=w*G+v*H+s*I;g[F+64+24>>2]=w*J+v*K+s*L;g[F+64+28>>2]=0.0;g[F+64+32>>2]=r*k+p*A+n*y;g[F+64+36>>2]=r*G+p*H+n*I;g[F+64+40>>2]=r*J+p*K+n*L;g[F+64+44>>2]=0.0;g[F+64+48>>2]=M*B+N*z+O*x+(M*q+N*o+O*m);g[F+64+52>>2]=w*B+v*z+s*x+(w*q+v*o+s*m);g[F+64+56>>2]=r*B+p*z+n*x+(r*q+p*o+n*m);g[F+64+60>>2]=0.0;Vb[u&127](b,F+64|0,F+776|0,F+416|0);u=c[(c[b>>2]|0)+8>>2]|0;m=+g[C>>2];n=+g[C+16>>2];o=+g[C+32>>2];p=+g[C+4>>2];q=+g[C+20>>2];r=+g[C+36>>2];x=+g[C+8>>2];z=+g[C+24>>2];B=+g[C+40>>2];s=-+g[C+48>>2];v=-+g[C+52>>2];w=-+g[C+56>>2];O=+g[e>>2];N=+g[e+16>>2];M=+g[e+32>>2];L=+g[e+4>>2];K=+g[e+20>>2];J=+g[e+36>>2];I=+g[e+8>>2];H=+g[e+24>>2];G=+g[e+40>>2];y=+g[e+48>>2];A=+g[e+52>>2];k=+g[e+56>>2];g[F+64>>2]=m*O+n*N+o*M;g[F+64+4>>2]=m*L+n*K+o*J;g[F+64+8>>2]=m*I+n*H+o*G;g[F+64+12>>2]=0.0;g[F+64+16>>2]=p*O+q*N+r*M;g[F+64+20>>2]=p*L+q*K+r*J;g[F+64+24>>2]=p*I+q*H+r*G;g[F+64+28>>2]=0.0;g[F+64+32>>2]=x*O+z*N+B*M;g[F+64+36>>2]=x*L+z*K+B*J;g[F+64+40>>2]=x*I+z*H+B*G;g[F+64+44>>2]=0.0;g[F+64+48>>2]=m*s+n*v+o*w+(m*y+n*A+o*k);g[F+64+52>>2]=p*s+q*v+r*w+(p*y+q*A+r*k);g[F+64+56>>2]=x*s+z*v+B*w+(x*y+z*A+B*k);g[F+64+60>>2]=0.0;Vb[u&127](b,F+64|0,F+352|0,F+128|0);k=+g[F+352>>2];if(k<+g[F+776>>2])g[F+776>>2]=k;k=+g[F+352+4>>2];if(k<+g[F+776+4>>2])g[F+776+4>>2]=k;k=+g[F+352+8>>2];if(k<+g[F+776+8>>2])g[F+776+8>>2]=k;k=+g[F+352+12>>2];if(k<+g[F+776+12>>2])g[F+776+12>>2]=k;k=+g[F+128>>2];if(+g[F+416>>2]>2]=k;k=+g[F+128+4>>2];if(+g[F+416+4>>2]>2]=k;k=+g[F+128+8>>2];if(+g[F+416+8>>2]>2]=k;k=+g[F+128+12>>2];if(+g[F+416+12>>2]>2]=k;c[F+64>>2]=6224;c[F+64+4>>2]=f;c[F+64+8>>2]=b;c[F+64+12>>2]=d;c[F+64+16>>2]=e;g[F+64+20>>2]=i;c[F+64+24>>2]=E;c[F+64+28>>2]=C;c[F+64+32>>2]=h;j=c[E+68>>2]|0;if(!j){if((c[E+20>>2]|0)>0){j=0;do{f=c[E+28>>2]|0;h=c[f+(j*80|0)+64>>2]|0;e=f+(j*80|0)|0;c[F>>2]=c[e>>2];c[F+4>>2]=c[e+4>>2];c[F+8>>2]=c[e+8>>2];c[F+12>>2]=c[e+12>>2];e=f+(j*80|0)+16|0;c[F+16>>2]=c[e>>2];c[F+16+4>>2]=c[e+4>>2];c[F+16+8>>2]=c[e+8>>2];c[F+16+12>>2]=c[e+12>>2];e=f+(j*80|0)+32|0;c[F+32>>2]=c[e>>2];c[F+32+4>>2]=c[e+4>>2];c[F+32+8>>2]=c[e+8>>2];c[F+32+12>>2]=c[e+12>>2];f=f+(j*80|0)+48|0;c[F+48>>2]=c[f>>2];c[F+48+4>>2]=c[f+4>>2];c[F+48+8>>2]=c[f+8>>2];c[F+48+12>>2]=c[f+12>>2];jg(F+64|0,j,F,h);j=j+1|0}while((j|0)<(c[E+20>>2]|0))}}else{c[F>>2]=c[F+776>>2];c[F+4>>2]=c[F+776+4>>2];c[F+8>>2]=c[F+776+8>>2];c[F+12>>2]=c[F+776+12>>2];c[F+16>>2]=c[F+416>>2];c[F+16+4>>2]=c[F+416+4>>2];c[F+16+8>>2]=c[F+416+8>>2];c[F+16+12>>2]=c[F+416+12>>2];Bf(c[j>>2]|0,F,F+64|0)}l=F;return}switch(j|0){case 21:{o=+g[C>>2];p=+g[C+16>>2];q=+g[C+32>>2];r=+g[C+4>>2];s=+g[C+20>>2];v=+g[C+36>>2];w=+g[C+8>>2];x=+g[C+24>>2];y=+g[C+40>>2];z=-+g[C+48>>2];A=-+g[C+52>>2];B=-+g[C+56>>2];n=+g[d+48>>2];m=+g[d+52>>2];k=+g[d+56>>2];g[F+416>>2]=o*z+p*A+q*B+(o*n+p*m+q*k);g[F+416+4>>2]=r*z+s*A+v*B+(r*n+s*m+v*k);g[F+416+8>>2]=w*z+x*A+y*B+(w*n+x*m+y*k);g[F+416+12>>2]=0.0;k=+g[e+48>>2];m=+g[e+52>>2];n=+g[e+56>>2];G=+g[e>>2];H=+g[e+16>>2];I=+g[e+32>>2];J=+g[e+4>>2];K=+g[e+20>>2];L=+g[e+36>>2];M=+g[e+8>>2];N=+g[e+24>>2];O=+g[e+40>>2];g[F+352>>2]=o*G+p*H+q*I;g[F+352+4>>2]=o*J+p*K+q*L;g[F+352+8>>2]=o*M+p*N+q*O;g[F+352+12>>2]=0.0;g[F+352+16>>2]=r*G+s*H+v*I;g[F+352+20>>2]=r*J+s*K+v*L;g[F+352+24>>2]=r*M+s*N+v*O;g[F+352+28>>2]=0.0;g[F+352+32>>2]=w*G+x*H+y*I;g[F+352+36>>2]=w*J+x*K+y*L;g[F+352+40>>2]=w*M+x*N+y*O;j=F+352+44|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;j=c[f+8>>2]|0;O=+nb[c[(c[E>>2]|0)+48>>2]&15](E);c[F+128>>2]=9392;c[F+128+4>>2]=b;c[F+128+8>>2]=c[d>>2];c[F+128+8+4>>2]=c[d+4>>2];c[F+128+8+8>>2]=c[d+8>>2];c[F+128+8+12>>2]=c[d+12>>2];c[F+128+24>>2]=c[d+16>>2];c[F+128+24+4>>2]=c[d+16+4>>2];c[F+128+24+8>>2]=c[d+16+8>>2];c[F+128+24+12>>2]=c[d+16+12>>2];c[F+128+40>>2]=c[d+32>>2];c[F+128+40+4>>2]=c[d+32+4>>2];c[F+128+40+8>>2]=c[d+32+8>>2];c[F+128+40+12>>2]=c[d+32+12>>2];c[F+128+56>>2]=c[d+48>>2];c[F+128+56+4>>2]=c[d+48+4>>2];c[F+128+56+8>>2]=c[d+48+8>>2];c[F+128+56+12>>2]=c[d+48+12>>2];c[F+128+72>>2]=c[e>>2];c[F+128+72+4>>2]=c[e+4>>2];c[F+128+72+8>>2]=c[e+8>>2];c[F+128+72+12>>2]=c[e+12>>2];c[F+128+88>>2]=c[e+16>>2];c[F+128+88+4>>2]=c[e+16+4>>2];c[F+128+88+8>>2]=c[e+16+8>>2];c[F+128+88+12>>2]=c[e+16+12>>2];c[F+128+104>>2]=c[e+32>>2];c[F+128+104+4>>2]=c[e+32+4>>2];c[F+128+104+8>>2]=c[e+32+8>>2];c[F+128+104+12>>2]=c[e+32+12>>2];c[F+128+120>>2]=c[e+48>>2];c[F+128+120+4>>2]=c[e+48+4>>2];c[F+128+120+8>>2]=c[e+48+8>>2];c[F+128+120+12>>2]=c[e+48+12>>2];c[F+128+136>>2]=c[C>>2];c[F+128+136+4>>2]=c[C+4>>2];c[F+128+136+8>>2]=c[C+8>>2];c[F+128+136+12>>2]=c[C+12>>2];c[F+128+152>>2]=c[C+16>>2];c[F+128+152+4>>2]=c[C+16+4>>2];c[F+128+152+8>>2]=c[C+16+8>>2];c[F+128+152+12>>2]=c[C+16+12>>2];c[F+128+168>>2]=c[C+32>>2];c[F+128+168+4>>2]=c[C+32+4>>2];c[F+128+168+8>>2]=c[C+32+8>>2];c[F+128+168+12>>2]=c[C+32+12>>2];c[F+128+184>>2]=c[C+48>>2];c[F+128+184+4>>2]=c[C+48+4>>2];c[F+128+184+8>>2]=c[C+48+8>>2];c[F+128+184+12>>2]=c[C+48+12>>2];g[F+128+204>>2]=O;c[F+128>>2]=6176;c[F+128+212>>2]=h;c[F+128+216>>2]=j;c[F+128+220>>2]=E;c[F+128+200>>2]=c[h+4>>2];g[F+128+208>>2]=i;Vb[c[(c[b>>2]|0)+8>>2]&127](b,F+352|0,F+64|0,F);j=c[E+52>>2]|0;c[F+776>>2]=7252;c[F+776+4>>2]=j;c[F+776+8>>2]=F+128;j=c[E+56>>2]|0;if(!(a[j+60>>0]|0))Re(j,F+776|0,F+416|0,o*z+p*A+q*B+(o*k+p*m+q*n),r*z+s*A+v*B+(r*k+s*m+v*n),w*z+x*A+y*B+(w*k+x*m+y*n),F+64|0,F);else ue(j,F+776|0,F+416|0,o*z+p*A+q*B+(o*k+p*m+q*n),r*z+s*A+v*B+(r*k+s*m+v*n),w*z+x*A+y*B+(w*k+x*m+y*n),F+64|0,F,c[j+56>>2]|0);l=F;return}case 28:{c[F+776>>2]=3896;c[F+776+168>>2]=0;g[F+776+172>>2]=i;c[F+776+164>>2]=c[h+4>>2];c[F+416>>2]=9532;c[F+416+4>>2]=0;c[F+416+8>>2]=0;c[F+416+12>>2]=b;c[F+416+16>>2]=0;c[F+416+20>>2]=E;if((Wd(F+416|0,d,e,C,C,F+776|0)|0?(t=F+776+132|0,k=+g[t>>2],m=+g[F+776+136>>2],n=+g[F+776+140>>2],k*k+m*m+n*n>9.999999747378752e-05):0)?(o=+g[F+776+164>>2],o<+g[h+4>>2]):0){O=1.0/+D(+(k*k+m*m+n*n));g[t>>2]=k*O;g[F+776+136>>2]=m*O;g[F+776+140>>2]=n*O;c[F+352>>2]=c[f+8>>2];c[F+352+4>>2]=0;c[F+352+8>>2]=c[t>>2];c[F+352+8+4>>2]=c[t+4>>2];c[F+352+8+8>>2]=c[t+8>>2];c[F+352+8+12>>2]=c[t+12>>2];c[F+352+24>>2]=c[F+776+148>>2];c[F+352+24+4>>2]=c[F+776+148+4>>2];c[F+352+24+8>>2]=c[F+776+148+8>>2];c[F+352+24+12>>2]=c[F+776+148+12>>2];g[F+352+40>>2]=o;+qb[c[(c[h>>2]|0)+12>>2]&31](h,F+352|0,1)}l=F;return}default:{o=+g[C>>2];p=+g[C+16>>2];q=+g[C+32>>2];w=+g[C+4>>2];x=+g[C+20>>2];y=+g[C+36>>2];J=+g[C+8>>2];L=+g[C+24>>2];N=+g[C+40>>2];H=-+g[C+48>>2];G=-+g[C+52>>2];B=-+g[C+56>>2];z=+g[d+48>>2];A=+g[d+52>>2];k=+g[d+56>>2];n=o*H+p*G+q*B+(o*z+p*A+q*k);m=w*H+x*G+y*B+(w*z+x*A+y*k);k=J*H+L*G+N*B+(J*z+L*A+N*k);A=+g[e+48>>2];z=+g[e+52>>2];v=+g[e+56>>2];r=o*H+p*G+q*B+(o*A+p*z+q*v);s=w*H+x*G+y*B+(w*A+x*z+y*v);v=J*H+L*G+N*B+(J*A+L*z+N*v);z=+g[e>>2];A=+g[e+16>>2];B=+g[e+32>>2];G=+g[e+4>>2];H=+g[e+20>>2];I=+g[e+36>>2];K=+g[e+8>>2];M=+g[e+24>>2];O=+g[e+40>>2];g[F+776>>2]=o*z+p*A+q*B;g[F+776+4>>2]=o*G+p*H+q*I;g[F+776+8>>2]=o*K+p*M+q*O;g[F+776+12>>2]=0.0;g[F+776+16>>2]=w*z+x*A+y*B;g[F+776+20>>2]=w*G+x*H+y*I;g[F+776+24>>2]=w*K+x*M+y*O;g[F+776+28>>2]=0.0;g[F+776+32>>2]=J*z+L*A+N*B;g[F+776+36>>2]=J*G+L*H+N*I;g[F+776+40>>2]=J*K+L*M+N*O;u=F+776+44|0;c[u>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;c[u+12>>2]=0;c[u+16>>2]=0;f=c[f+8>>2]|0;O=+nb[c[(c[E>>2]|0)+48>>2]&15](E);c[F+416>>2]=9392;c[F+416+4>>2]=b;c[F+416+8>>2]=c[d>>2];c[F+416+8+4>>2]=c[d+4>>2];c[F+416+8+8>>2]=c[d+8>>2];c[F+416+8+12>>2]=c[d+12>>2];c[F+416+24>>2]=c[d+16>>2];c[F+416+24+4>>2]=c[d+16+4>>2];c[F+416+24+8>>2]=c[d+16+8>>2];c[F+416+24+12>>2]=c[d+16+12>>2];c[F+416+40>>2]=c[d+32>>2];c[F+416+40+4>>2]=c[d+32+4>>2];c[F+416+40+8>>2]=c[d+32+8>>2];c[F+416+40+12>>2]=c[d+32+12>>2];c[F+416+56>>2]=c[d+48>>2];c[F+416+56+4>>2]=c[d+48+4>>2];c[F+416+56+8>>2]=c[d+48+8>>2];c[F+416+56+12>>2]=c[d+48+12>>2];c[F+416+72>>2]=c[e>>2];c[F+416+72+4>>2]=c[e+4>>2];c[F+416+72+8>>2]=c[e+8>>2];c[F+416+72+12>>2]=c[e+12>>2];c[F+416+88>>2]=c[e+16>>2];c[F+416+88+4>>2]=c[e+16+4>>2];c[F+416+88+8>>2]=c[e+16+8>>2];c[F+416+88+12>>2]=c[e+16+12>>2];c[F+416+104>>2]=c[e+32>>2];c[F+416+104+4>>2]=c[e+32+4>>2];c[F+416+104+8>>2]=c[e+32+8>>2];c[F+416+104+12>>2]=c[e+32+12>>2];c[F+416+120>>2]=c[e+48>>2];c[F+416+120+4>>2]=c[e+48+4>>2];c[F+416+120+8>>2]=c[e+48+8>>2];c[F+416+120+12>>2]=c[e+48+12>>2];c[F+416+136>>2]=c[C>>2];c[F+416+136+4>>2]=c[C+4>>2];c[F+416+136+8>>2]=c[C+8>>2];c[F+416+136+12>>2]=c[C+12>>2];c[F+416+152>>2]=c[C+16>>2];c[F+416+152+4>>2]=c[C+16+4>>2];c[F+416+152+8>>2]=c[C+16+8>>2];c[F+416+152+12>>2]=c[C+16+12>>2];c[F+416+168>>2]=c[C+32>>2];c[F+416+168+4>>2]=c[C+32+4>>2];c[F+416+168+8>>2]=c[C+32+8>>2];c[F+416+168+12>>2]=c[C+32+12>>2];c[F+416+184>>2]=c[C+48>>2];c[F+416+184+4>>2]=c[C+48+4>>2];c[F+416+184+8>>2]=c[C+48+8>>2];c[F+416+184+12>>2]=c[C+48+12>>2];g[F+416+204>>2]=O;c[F+416>>2]=6200;c[F+416+212>>2]=h;c[F+416+216>>2]=f;c[F+416+220>>2]=E;c[F+416+200>>2]=c[h+4>>2];g[F+416+208>>2]=i;Vb[c[(c[b>>2]|0)+8>>2]&127](b,F+776|0,F+352|0,F+128|0);g[F+64>>2]=n;g[F+64+4>>2]=m;g[F+64+8>>2]=k;g[F+64+12>>2]=0.0;if(r>2]=r;o=r}else o=n;if(s>2]=s;p=s}else p=m;if(v>2]=v;q=v}else q=k;g[F>>2]=n;g[F+4>>2]=m;g[F+8>>2]=k;g[F+12>>2]=0.0;if(n>2]=r;n=r}if(m>2]=s;m=s}if(k>2]=v;k=v}g[F+64>>2]=+g[F+352>>2]+o;g[F+64+4>>2]=+g[F+352+4>>2]+p;g[F+64+8>>2]=+g[F+352+8>>2]+q;g[F>>2]=+g[F+128>>2]+n;g[F+4>>2]=+g[F+128+4>>2]+m;g[F+8>>2]=+g[F+128+8>>2]+k;Vb[c[(c[E>>2]|0)+64>>2]&127](E,F+416|0,F+64|0,F);l=F;return}}}function wc(b){b=b|0;var d=0,e=0,f=0.0,h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0,J=0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0;J=l;l=l+64|0;if(!(a[b+356>>0]|0)){b=a[b+312>>0]|0;b=b<<24>>24!=0;l=J;return b|0}c[b+336>>2]=0;c[b+336+4>>2]=0;c[b+336+8>>2]=0;c[b+336+12>>2]=0;a[b+336+16>>0]=0;p=a[b+332>>0]|0;a[b+332>>0]=p&-16;a[b+356>>0]=0;switch(c[b>>2]|0){case 0:{a[b+312>>0]=0;b=0;b=b<<24>>24!=0;l=J;return b|0}case 1:{c[b+244>>2]=c[b+84>>2];c[b+244+4>>2]=c[b+84+4>>2];c[b+244+8>>2]=c[b+84+8>>2];c[b+244+12>>2]=c[b+84+12>>2];c[b+260>>2]=c[b+164>>2];c[b+260+4>>2]=c[b+164+4>>2];c[b+260+8>>2]=c[b+164+8>>2];c[b+260+12>>2]=c[b+164+12>>2];F=+g[b+248>>2]-+g[b+264>>2];G=+g[b+252>>2]-+g[b+268>>2];g[b+276>>2]=+g[b+244>>2]-+g[b+260>>2];g[b+280>>2]=F;g[b+284>>2]=G;g[b+288>>2]=0.0;a[b+352>>0]=0;a[b+332>>0]=p&-16;g[b+336>>2]=1.0;g[b+340>>2]=0.0;g[b+344>>2]=0.0;g[b+348>>2]=0.0;a[b+312>>0]=1;b=1;b=b<<24>>24!=0;l=J;return b|0}case 2:{f=+g[b+4>>2];i=+g[b+8>>2];j=+g[b+12>>2];k=+g[b+20>>2]-f;m=+g[b+24>>2]-i;n=+g[b+28>>2]-j;if((0.0-f)*k+(0.0-i)*m+(0.0-j)*n>0.0)if((0.0-f)*k+(0.0-i)*m+(0.0-j)*n>0]=p&-16|1;e=2;d=p&-16|1;i=((0.0-f)*k+(0.0-i)*m+(0.0-j)*n)/(k*k+m*m+n*n)}else{e=2;d=p&-16;i=1.0}else{e=1;d=p&-16;i=0.0}e=d|e;a[b+332>>0]=e;f=1.0-i;g[b+336>>2]=f;g[b+340>>2]=i;g[b+344>>2]=0.0;g[b+348>>2]=0.0;B=+g[b+84>>2];D=+g[b+88>>2];F=+g[b+92>>2];B=B+i*(+g[b+100>>2]-B);D=D+i*(+g[b+104>>2]-D);F=F+i*(+g[b+108>>2]-F);g[b+244>>2]=B;g[b+248>>2]=D;g[b+252>>2]=F;g[b+256>>2]=0.0;C=+g[b+164>>2];E=+g[b+168>>2];G=+g[b+172>>2];C=C+i*(+g[b+180>>2]-C);E=E+i*(+g[b+184>>2]-E);G=G+i*(+g[b+188>>2]-G);g[b+260>>2]=C;g[b+264>>2]=E;g[b+268>>2]=G;g[b+272>>2]=0.0;g[b+276>>2]=B-C;g[b+280>>2]=D-E;g[b+284>>2]=F-G;g[b+288>>2]=0.0;if(!(e&2)){c[b>>2]=1;d=0}else d=1;if(!(e&1)){I=b+164+(d<<4)|0;H=b+84+(d<<4)|0;r=b+4+(d<<4)|0;c[b>>2]=d;c[b+4>>2]=c[r>>2];c[b+4+4>>2]=c[r+4>>2];c[b+4+8>>2]=c[r+8>>2];c[b+4+12>>2]=c[r+12>>2];c[b+84>>2]=c[H>>2];c[b+84+4>>2]=c[H+4>>2];c[b+84+8>>2]=c[H+8>>2];c[b+84+12>>2]=c[H+12>>2];c[b+164>>2]=c[I>>2];c[b+164+4>>2]=c[I+4>>2];c[b+164+8>>2]=c[I+8>>2];c[b+164+12>>2]=c[I+12>>2]}I=i>=0.0&f>=0.0&1;a[b+312>>0]=I;b=I;b=b<<24>>24!=0;l=J;return b|0}case 3:{c[J+16>>2]=0;c[J+16+4>>2]=0;c[J+16+8>>2]=0;c[J+16+12>>2]=0;cf(J+16|0,b+4|0,b+20|0,b+36|0,b+316|0);G=+g[b+336>>2];f=+g[b+340>>2];i=+g[b+344>>2];B=+g[b+84>>2]*G+ +g[b+100>>2]*f+ +g[b+116>>2]*i;D=G*+g[b+88>>2]+f*+g[b+104>>2]+i*+g[b+120>>2];F=G*+g[b+92>>2]+f*+g[b+108>>2]+i*+g[b+124>>2];g[b+244>>2]=B;g[b+248>>2]=D;g[b+252>>2]=F;g[b+256>>2]=0.0;C=+g[b+164>>2]*G+ +g[b+180>>2]*f+ +g[b+196>>2]*i;E=G*+g[b+168>>2]+f*+g[b+184>>2]+i*+g[b+200>>2];G=G*+g[b+172>>2]+f*+g[b+188>>2]+i*+g[b+204>>2];g[b+260>>2]=C;g[b+264>>2]=E;g[b+268>>2]=G;g[b+272>>2]=0.0;g[b+276>>2]=B-C;g[b+280>>2]=D-E;g[b+284>>2]=F-G;g[b+288>>2]=0.0;e=c[b>>2]|0;do if((e|0)>3){d=a[b+332>>0]|0;if(!(d&8)){h=b+164+(e+-1<<4)|0;I=b+84+(e+-1<<4)|0;H=b+4+(e+-1<<4)|0;c[b>>2]=e+-1;c[b+52>>2]=c[H>>2];c[b+52+4>>2]=c[H+4>>2];c[b+52+8>>2]=c[H+8>>2];c[b+52+12>>2]=c[H+12>>2];c[b+132>>2]=c[I>>2];c[b+132+4>>2]=c[I+4>>2];c[b+132+8>>2]=c[I+8>>2];c[b+132+12>>2]=c[I+12>>2];c[b+212>>2]=c[h>>2];c[b+212+4>>2]=c[h+4>>2];c[b+212+8>>2]=c[h+8>>2];c[b+212+12>>2]=c[h+12>>2];h=e+-1|0;I=19}else{h=e;I=19}}else{if((e|0)==3){d=a[b+332>>0]|0;h=3;I=19;break}if((e|0)>1){d=a[b+332>>0]|0;e=2;I=23;break}if((e|0)==1){o=a[b+332>>0]|0;h=1;I=27}}while(0);if((I|0)==19){e=h+-1|0;if(!(d&4)){c[b>>2]=e;c[b+36>>2]=c[b+4+(e<<4)>>2];c[b+36+4>>2]=c[b+4+(e<<4)+4>>2];c[b+36+8>>2]=c[b+4+(e<<4)+8>>2];c[b+36+12>>2]=c[b+4+(e<<4)+12>>2];c[b+116>>2]=c[b+84+(e<<4)>>2];c[b+116+4>>2]=c[b+84+(e<<4)+4>>2];c[b+116+8>>2]=c[b+84+(e<<4)+8>>2];c[b+116+12>>2]=c[b+84+(e<<4)+12>>2];c[b+196>>2]=c[b+164+(e<<4)>>2];c[b+196+4>>2]=c[b+164+(e<<4)+4>>2];c[b+196+8>>2]=c[b+164+(e<<4)+8>>2];c[b+196+12>>2]=c[b+164+(e<<4)+12>>2];I=23}else{e=h;I=23}}if((I|0)==23){h=e+-1|0;if(!(d&2)){c[b>>2]=h;c[b+20>>2]=c[b+4+(h<<4)>>2];c[b+20+4>>2]=c[b+4+(h<<4)+4>>2];c[b+20+8>>2]=c[b+4+(h<<4)+8>>2];c[b+20+12>>2]=c[b+4+(h<<4)+12>>2];c[b+100>>2]=c[b+84+(h<<4)>>2];c[b+100+4>>2]=c[b+84+(h<<4)+4>>2];c[b+100+8>>2]=c[b+84+(h<<4)+8>>2];c[b+100+12>>2]=c[b+84+(h<<4)+12>>2];c[b+180>>2]=c[b+164+(h<<4)>>2];c[b+180+4>>2]=c[b+164+(h<<4)+4>>2];c[b+180+8>>2]=c[b+164+(h<<4)+8>>2];c[b+180+12>>2]=c[b+164+(h<<4)+12>>2];o=d;I=27}else{o=d;h=e;I=27}}if((I|0)==27?(q=h+-1|0,(o&1)==0):0){c[b>>2]=q;c[b+4>>2]=c[b+4+(q<<4)>>2];c[b+4+4>>2]=c[b+4+(q<<4)+4>>2];c[b+4+8>>2]=c[b+4+(q<<4)+8>>2];c[b+4+12>>2]=c[b+4+(q<<4)+12>>2];c[b+84>>2]=c[b+84+(q<<4)>>2];c[b+84+4>>2]=c[b+84+(q<<4)+4>>2];c[b+84+8>>2]=c[b+84+(q<<4)+8>>2];c[b+84+12>>2]=c[b+84+(q<<4)+12>>2];c[b+164>>2]=c[b+164+(q<<4)>>2];c[b+164+4>>2]=c[b+164+(q<<4)+4>>2];c[b+164+8>>2]=c[b+164+(q<<4)+8>>2];c[b+164+12>>2]=c[b+164+(q<<4)+12>>2]}if((f>=0.0?!(+g[b+336>>2]>=0.0):1)|!(i>=0.0))d=0;else d=+g[b+348>>2]>=0.0&1;a[b+312>>0]=d;b=d;b=b<<24>>24!=0;l=J;return b|0}case 4:{c[J>>2]=0;c[J+4>>2]=0;c[J+8>>2]=0;c[J+12>>2]=0;r=J+16+16|0;a[r>>0]=0;c[b+316>>2]=0;c[b+316+4>>2]=0;c[b+316+8>>2]=0;c[b+316+12>>2]=0;a[b+332>>0]=p|15;L=+g[b+20>>2];U=+g[b+4>>2];R=+g[b+24>>2];K=+g[b+8>>2];N=+g[b+28>>2];V=+g[b+12>>2];Q=+g[b+36>>2];S=+g[b+40>>2];O=+g[b+44>>2];M=+g[b+52>>2];T=+g[b+56>>2];P=+g[b+60>>2];W=((R-K)*(O-V)-(N-V)*(S-K))*(M-U)+((N-V)*(Q-U)-(L-U)*(O-V))*(T-K)+((L-U)*(S-K)-(R-K)*(Q-U))*(P-V);h=W*W<9.99999905104687e-09?-1:((0.0-U)*((R-K)*(O-V)-(N-V)*(S-K))+(0.0-K)*((N-V)*(Q-U)-(L-U)*(O-V))+((L-U)*(S-K)-(R-K)*(Q-U))*(0.0-V))*W<0.0&1;W=(N-V)*((Q-U)*(T-K)-(S-K)*(M-U))+((L-U)*((S-K)*(P-V)-(O-V)*(T-K))+(R-K)*((O-V)*(M-U)-(Q-U)*(P-V)));o=W*W<9.99999905104687e-09?-1:((0.0-V)*((Q-U)*(T-K)-(S-K)*(M-U))+((0.0-U)*((S-K)*(P-V)-(O-V)*(T-K))+(0.0-K)*((O-V)*(M-U)-(Q-U)*(P-V))))*W<0.0&1;W=(O-V)*((R-K)*(M-U)-(L-U)*(T-K))+((Q-U)*((N-V)*(T-K)-(R-K)*(P-V))+(S-K)*((L-U)*(P-V)-(N-V)*(M-U)));p=W*W<9.99999905104687e-09?-1:((0.0-V)*((R-K)*(M-U)-(L-U)*(T-K))+((0.0-U)*((N-V)*(T-K)-(R-K)*(P-V))+(0.0-K)*((L-U)*(P-V)-(N-V)*(M-U))))*W<0.0&1;K=(V-N)*((S-R)*(M-L)-(Q-L)*(T-R))+((U-L)*((O-N)*(T-R)-(S-R)*(P-N))+(K-R)*((Q-L)*(P-N)-(O-N)*(M-L)));q=K*K<9.99999905104687e-09?-1:((0.0-N)*((S-R)*(M-L)-(Q-L)*(T-R))+((0.0-L)*((O-N)*(T-R)-(S-R)*(P-N))+(0.0-R)*((Q-L)*(P-N)-(O-N)*(M-L))))*K<0.0&1;do if((o|h|p|q|0)<0){a[b+352>>0]=1;d=b+312|0;I=68}else{if(!(o|h|p|q)){if(a[b+352>>0]|0){d=b+312|0;I=68;break}a[b+312>>0]=1;c[b+276>>2]=0;c[b+276+4>>2]=0;c[b+276+8>>2]=0;c[b+276+12>>2]=0;d=1;break}if((h|0)!=0?(cf(J,b+4|0,b+20|0,b+36|0,J+16|0),f=+g[J+16>>2],i=+g[J+16+4>>2],j=+g[J+16+8>>2],k=f-+g[J>>2],m=i-+g[J+4>>2],n=j-+g[J+8>>2],k*k+m*m+n*n<3402823466385288598117041.0e14):0){X=c[J+16+12>>2]|0;g[b+316>>2]=f;g[b+320>>2]=i;g[b+324>>2]=j;c[b+328>>2]=X;X=a[r>>0]|0;a[b+332>>0]=X&1|a[b+332>>0]&-16|X&2|X&4;X=c[J+16+24>>2]|0;h=c[J+16+28>>2]|0;c[b+336>>2]=c[J+16+20>>2];c[b+340>>2]=X;c[b+344>>2]=h;g[b+348>>2]=0.0;f=k*k+m*m+n*n}else f=3402823466385288598117041.0e14;if((o|0)!=0?(cf(J,b+4|0,b+36|0,b+52|0,J+16|0),s=+g[J+16>>2],t=+g[J+16+4>>2],u=+g[J+16+8>>2],v=s-+g[J>>2],w=t-+g[J+4>>2],x=u-+g[J+8>>2],v*v+w*w+x*x>2]|0;g[b+316>>2]=s;g[b+320>>2]=t;g[b+324>>2]=u;c[b+328>>2]=o;o=a[r>>0]|0;a[b+332>>0]=o<<1&8|(o&1|a[b+332>>0]&-16|o<<1&4);o=c[J+16+24>>2]|0;X=c[J+16+28>>2]|0;c[b+336>>2]=c[J+16+20>>2];g[b+340>>2]=0.0;c[b+344>>2]=o;c[b+348>>2]=X;f=v*v+w*w+x*x}if((p|0)!=0?(cf(J,b+4|0,b+52|0,b+20|0,J+16|0),y=+g[J+16>>2],z=+g[J+16+4>>2],A=+g[J+16+8>>2],B=y-+g[J>>2],C=z-+g[J+4>>2],D=A-+g[J+8>>2],B*B+C*C+D*D>2]|0;g[b+316>>2]=y;g[b+320>>2]=z;g[b+324>>2]=A;c[b+328>>2]=p;p=a[r>>0]|0;a[b+332>>0]=p<<2&8|(p&1|a[b+332>>0]&-16|(p&255)>>>1&2);p=c[J+16+28>>2]|0;X=c[J+16+24>>2]|0;c[b+336>>2]=c[J+16+20>>2];c[b+340>>2]=p;g[b+344>>2]=0.0;c[b+348>>2]=X;f=B*B+C*C+D*D}if(q|0?(cf(J,b+20|0,b+52|0,b+36|0,J+16|0),E=+g[J+16>>2],F=+g[J+16+4>>2],G=+g[J+16+8>>2],U=E-+g[J>>2],V=F-+g[J+4>>2],W=G-+g[J+8>>2],U*U+V*V+W*W>2]|0;g[b+316>>2]=E;g[b+320>>2]=F;g[b+324>>2]=G;c[b+328>>2]=q;q=a[r>>0]|0;a[b+332>>0]=q&4|a[b+332>>0]&-16|q<<1&2|q<<2&8;q=c[J+16+20>>2]|0;r=c[J+16+28>>2]|0;X=c[J+16+24>>2]|0;g[b+336>>2]=0.0;c[b+340>>2]=q;c[b+344>>2]=r;c[b+348>>2]=X}P=+g[b+336>>2];Q=+g[b+340>>2];W=+g[b+344>>2];f=+g[b+348>>2];R=+g[b+84>>2]*P+ +g[b+100>>2]*Q+ +g[b+116>>2]*W+ +g[b+132>>2]*f;T=P*+g[b+88>>2]+Q*+g[b+104>>2]+W*+g[b+120>>2]+f*+g[b+136>>2];V=P*+g[b+92>>2]+Q*+g[b+108>>2]+W*+g[b+124>>2]+f*+g[b+140>>2];g[b+244>>2]=R;g[b+248>>2]=T;g[b+252>>2]=V;g[b+256>>2]=0.0;S=+g[b+164>>2]*P+ +g[b+180>>2]*Q+ +g[b+196>>2]*W+ +g[b+212>>2]*f;U=P*+g[b+168>>2]+Q*+g[b+184>>2]+W*+g[b+200>>2]+f*+g[b+216>>2];W=P*+g[b+172>>2]+Q*+g[b+188>>2]+W*+g[b+204>>2]+f*+g[b+220>>2];g[b+260>>2]=S;g[b+264>>2]=U;g[b+268>>2]=W;g[b+272>>2]=0.0;g[b+276>>2]=R-S;g[b+280>>2]=T-U;g[b+284>>2]=V-W;g[b+288>>2]=0.0;h=c[b>>2]|0;do if((h|0)>3){d=a[b+332>>0]|0;if(!(d&8)){I=b+164+(h+-1<<4)|0;X=b+84+(h+-1<<4)|0;r=b+4+(h+-1<<4)|0;c[b>>2]=h+-1;c[b+52>>2]=c[r>>2];c[b+52+4>>2]=c[r+4>>2];c[b+52+8>>2]=c[r+8>>2];c[b+52+12>>2]=c[r+12>>2];c[b+132>>2]=c[X>>2];c[b+132+4>>2]=c[X+4>>2];c[b+132+8>>2]=c[X+8>>2];c[b+132+12>>2]=c[X+12>>2];c[b+212>>2]=c[I>>2];c[b+212+4>>2]=c[I+4>>2];c[b+212+8>>2]=c[I+8>>2];c[b+212+12>>2]=c[I+12>>2];h=h+-1|0;I=52}else I=52}else{if((h|0)==3){d=a[b+332>>0]|0;h=3;I=52;break}if((h|0)>1){d=a[b+332>>0]|0;e=2;I=56;break}if((h|0)==1){d=a[b+332>>0]|0;e=1;I=60}}while(0);if((I|0)==52){e=h+-1|0;if(!(d&4)){c[b>>2]=e;c[b+36>>2]=c[b+4+(e<<4)>>2];c[b+36+4>>2]=c[b+4+(e<<4)+4>>2];c[b+36+8>>2]=c[b+4+(e<<4)+8>>2];c[b+36+12>>2]=c[b+4+(e<<4)+12>>2];c[b+116>>2]=c[b+84+(e<<4)>>2];c[b+116+4>>2]=c[b+84+(e<<4)+4>>2];c[b+116+8>>2]=c[b+84+(e<<4)+8>>2];c[b+116+12>>2]=c[b+84+(e<<4)+12>>2];c[b+196>>2]=c[b+164+(e<<4)>>2];c[b+196+4>>2]=c[b+164+(e<<4)+4>>2];c[b+196+8>>2]=c[b+164+(e<<4)+8>>2];c[b+196+12>>2]=c[b+164+(e<<4)+12>>2];I=56}else{e=h;I=56}}if((I|0)==56){h=e+-1|0;if(!(d&2)){c[b>>2]=h;c[b+20>>2]=c[b+4+(h<<4)>>2];c[b+20+4>>2]=c[b+4+(h<<4)+4>>2];c[b+20+8>>2]=c[b+4+(h<<4)+8>>2];c[b+20+12>>2]=c[b+4+(h<<4)+12>>2];c[b+100>>2]=c[b+84+(h<<4)>>2];c[b+100+4>>2]=c[b+84+(h<<4)+4>>2];c[b+100+8>>2]=c[b+84+(h<<4)+8>>2];c[b+100+12>>2]=c[b+84+(h<<4)+12>>2];c[b+180>>2]=c[b+164+(h<<4)>>2];c[b+180+4>>2]=c[b+164+(h<<4)+4>>2];c[b+180+8>>2]=c[b+164+(h<<4)+8>>2];c[b+180+12>>2]=c[b+164+(h<<4)+12>>2];e=h;I=60}else I=60}if((I|0)==60?(H=e+-1|0,(d&1)==0):0){c[b>>2]=H;c[b+4>>2]=c[b+4+(H<<4)>>2];c[b+4+4>>2]=c[b+4+(H<<4)+4>>2];c[b+4+8>>2]=c[b+4+(H<<4)+8>>2];c[b+4+12>>2]=c[b+4+(H<<4)+12>>2];c[b+84>>2]=c[b+84+(H<<4)>>2];c[b+84+4>>2]=c[b+84+(H<<4)+4>>2];c[b+84+8>>2]=c[b+84+(H<<4)+8>>2];c[b+84+12>>2]=c[b+84+(H<<4)+12>>2];c[b+164>>2]=c[b+164+(H<<4)>>2];c[b+164+4>>2]=c[b+164+(H<<4)+4>>2];c[b+164+8>>2]=c[b+164+(H<<4)+8>>2];c[b+164+12>>2]=c[b+164+(H<<4)+12>>2]}if((+g[b+336>>2]>=0.0?+g[b+340>>2]>=0.0:0)?+g[b+344>>2]>=0.0:0)d=f>=0.0&1;else d=0;a[b+312>>0]=d}while(0);if((I|0)==68){a[d>>0]=0;d=0}X=d;X=X<<24>>24!=0;l=J;return X|0}default:{a[b+312>>0]=0;X=0;X=X<<24>>24!=0;l=J;return X|0}}return 0}function xc(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0,H=0.0,J=0.0,K=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0,ma=0.0,na=0.0,oa=0.0,pa=0.0,qa=0.0,ra=0.0,sa=0.0;la=l;l=l+80|0;g[b+504>>2]=0.0;g[b+500>>2]=0.0;a[b+525>>0]=0;a[b+526>>0]=0;if(a[b+552>>0]|0?(a[b+527>>0]|0)==0:0){sa=+g[b+556>>2];qa=+g[b+560>>2];ka=+g[b+564>>2];pa=+g[b+568>>2];$=sa*(2.0/(sa*sa+qa*qa+ka*ka+pa*pa));ra=qa*(2.0/(sa*sa+qa*qa+ka*ka+pa*pa));oa=ka*(2.0/(sa*sa+qa*qa+ka*ka+pa*pa));aa=+g[b+300>>2];S=+g[d>>2];ba=+g[b+316>>2];T=+g[d+4>>2];ca=+g[b+332>>2];U=+g[d+8>>2];ea=+g[b+304>>2];ga=+g[b+320>>2];ia=+g[b+336>>2];Y=+g[b+308>>2];Z=+g[b+324>>2];_=+g[b+340>>2];V=+g[d+16>>2];W=+g[d+20>>2];X=+g[d+24>>2];fa=+g[d+32>>2];ha=+g[d+36>>2];ja=+g[d+40>>2];q=+g[b+348>>2];p=+g[b+352>>2];o=+g[b+356>>2];u=+g[b+364>>2];na=+g[e>>2];v=+g[b+380>>2];ma=+g[e+4>>2];w=+g[b+396>>2];k=+g[e+8>>2];x=+g[b+368>>2];y=+g[b+384>>2];z=+g[b+400>>2];r=+g[b+372>>2];s=+g[b+388>>2];t=+g[b+404>>2];m=+g[e+16>>2];n=+g[e+20>>2];j=+g[e+24>>2];A=+g[e+32>>2];E=+g[e+36>>2];J=+g[e+40>>2];B=+g[b+412>>2];H=+g[b+416>>2];i=+g[b+420>>2];M=(1.0-(qa*ra+ka*oa))*(u*na+v*ma+w*k)+(sa*ra+pa*oa)*(na*x+ma*y+k*z)+(sa*oa-pa*ra)*(na*r+ma*s+k*t);N=(sa*ra-pa*oa)*(u*na+v*ma+w*k)+(1.0-(sa*$+ka*oa))*(na*x+ma*y+k*z)+(qa*oa+pa*$)*(na*r+ma*s+k*t);K=(sa*oa+pa*ra)*(u*na+v*ma+w*k)+(qa*oa-pa*$)*(na*x+ma*y+k*z)+(1.0-(sa*$+qa*ra))*(na*r+ma*s+k*t);P=(sa*oa-pa*ra)*(r*m+s*n+t*j)+((1.0-(qa*ra+ka*oa))*(u*m+v*n+w*j)+(sa*ra+pa*oa)*(x*m+y*n+z*j));R=(qa*oa+pa*$)*(r*m+s*n+t*j)+((sa*ra-pa*oa)*(u*m+v*n+w*j)+(1.0-(sa*$+ka*oa))*(x*m+y*n+z*j));O=(1.0-(sa*$+qa*ra))*(r*m+s*n+t*j)+((sa*oa+pa*ra)*(u*m+v*n+w*j)+(qa*oa-pa*$)*(x*m+y*n+z*j));da=(sa*oa-pa*ra)*(r*A+s*E+t*J)+((1.0-(qa*ra+ka*oa))*(u*A+v*E+w*J)+(sa*ra+pa*oa)*(x*A+y*E+z*J));ka=(qa*oa+pa*$)*(r*A+s*E+t*J)+((sa*ra-pa*oa)*(u*A+v*E+w*J)+(1.0-(sa*$+ka*oa))*(x*A+y*E+z*J));$=(1.0-(sa*$+qa*ra))*(r*A+s*E+t*J)+((sa*oa+pa*ra)*(u*A+v*E+w*J)+(qa*oa-pa*$)*(x*A+y*E+z*J));pa=-(+g[d+48>>2]+(S*q+T*p+U*o));oa=-(V*q+W*p+X*o+ +g[d+52>>2]);o=-(fa*q+ha*p+ja*o+ +g[d+56>>2]);p=(aa*S+ba*T+ca*U)*pa+(aa*V+ba*W+ca*X)*oa+(aa*fa+ba*ha+ca*ja)*o;q=(S*ea+T*ga+U*ia)*pa+(ea*V+ga*W+ia*X)*oa+(ea*fa+ga*ha+ia*ja)*o;o=(S*Y+T*Z+U*_)*pa+(Y*V+Z*W+_*X)*oa+(Y*fa+Z*ha+_*ja)*o;k=o*K+(p*M+q*N)+((u*na+v*ma+w*k)*0.0+(na*x+ma*y+k*z)*0.0+(na*r+ma*s+k*t)*0.0+(+g[e+48>>2]+(na*B+ma*H+k*i)));j=o*O+(p*P+q*R)+((r*m+s*n+t*j)*0.0+((u*m+v*n+w*j)*0.0+(x*m+y*n+z*j)*0.0)+(m*B+n*H+j*i+ +g[e+52>>2]));i=o*$+(p*da+q*ka)+((r*A+s*E+t*J)*0.0+((u*A+v*E+w*J)*0.0+(x*A+y*E+z*J)*0.0)+(A*B+E*H+J*i+ +g[e+56>>2]));g[la+16>>2]=(S*Y+T*Z+U*_)*K+((aa*S+ba*T+ca*U)*M+(S*ea+T*ga+U*ia)*N);g[la+16+4>>2]=(Y*V+Z*W+_*X)*K+((aa*V+ba*W+ca*X)*M+(ea*V+ga*W+ia*X)*N);g[la+16+8>>2]=(Y*fa+Z*ha+_*ja)*K+((aa*fa+ba*ha+ca*ja)*M+(ea*fa+ga*ha+ia*ja)*N);g[la+16+12>>2]=0.0;g[la+16+16>>2]=(S*Y+T*Z+U*_)*O+((aa*S+ba*T+ca*U)*P+(S*ea+T*ga+U*ia)*R);g[la+16+20>>2]=(Y*V+Z*W+_*X)*O+((aa*V+ba*W+ca*X)*P+(ea*V+ga*W+ia*X)*R);g[la+16+24>>2]=(Y*fa+Z*ha+_*ja)*O+((aa*fa+ba*ha+ca*ja)*P+(ea*fa+ga*ha+ia*ja)*R);g[la+16+28>>2]=0.0;g[la+16+32>>2]=(S*Y+T*Z+U*_)*$+((aa*S+ba*T+ca*U)*da+(S*ea+T*ga+U*ia)*ka);g[la+16+36>>2]=(Y*V+Z*W+_*X)*$+((aa*V+ba*W+ca*X)*da+(ea*V+ga*W+ia*X)*ka);g[la+16+40>>2]=(Y*fa+Z*ha+_*ja)*$+((aa*fa+ba*ha+ca*ja)*da+(ea*fa+ga*ha+ia*ja)*ka);g[la+16+44>>2]=0.0;g[la+16+48>>2]=k;g[la+16+52>>2]=j;g[la+16+56>>2]=i;g[la+16+60>>2]=0.0;yh(la+16|0,la);i=+g[la>>2];j=+g[la+4>>2];k=+g[la+8>>2];if(!(+C(+(i*i+j*j+k*k))<1.1920928955078125e-07)?(g[b+472>>2]=0.0,sa=1.0/+D(+(i*i+j*j+k*k)),g[b+460>>2]=i*sa,g[b+464>>2]=j*sa,g[b+468>>2]=k*sa,sa=+g[la+12>>2],sa=sa<-1.0?-1.0:sa,sa=+I(+(sa>1.0?1.0:sa))*2.0,g[b+504>>2]=sa,!(+C(+sa)<1.1920928955078125e-07)):0)a[b+526>>0]=1;l=la;return}yh(d,la+16|0);yh(b+300|0,la);U=+g[la+16+12>>2];V=+g[la>>2];W=+g[la+16>>2];X=+g[la+12>>2];Y=+g[la+16+4>>2];Z=+g[la+8>>2];_=+g[la+16+8>>2];$=+g[la+4>>2];yh(e,la+16|0);yh(b+364|0,la);aa=+g[la+16+12>>2];ba=+g[la>>2];ca=+g[la+16>>2];da=+g[la+12>>2];ea=+g[la+16+4>>2];fa=+g[la+8>>2];ga=+g[la+16+8>>2];ha=+g[la+4>>2];ia=-(aa*ba+ca*da+ea*fa-ga*ha);ja=-(ba*ga+(da*ea+aa*ha)-ca*fa);ka=-(aa*fa+da*ga+ca*ha-ba*ea);s=(U*X-V*W-Y*$-Z*_)*ia+(U*V+W*X+Y*Z-_*$)*(aa*da-ba*ca-ea*ha-fa*ga)+(U*Z+X*_+W*$-V*Y)*ja-(V*_+(X*Y+U*$)-W*Z)*ka;t=(U*V+W*X+Y*Z-_*$)*ka+((V*_+(X*Y+U*$)-W*Z)*(aa*da-ba*ca-ea*ha-fa*ga)+(U*X-V*W-Y*$-Z*_)*ja)-(U*Z+X*_+W*$-V*Y)*ia;u=(V*_+(X*Y+U*$)-W*Z)*ia+((U*Z+X*_+W*$-V*Y)*(aa*da-ba*ca-ea*ha-fa*ga)+(U*X-V*W-Y*$-Z*_)*ka)-(U*V+W*X+Y*Z-_*$)*ja;v=(U*X-V*W-Y*$-Z*_)*(aa*da-ba*ca-ea*ha-fa*ga)-(U*V+W*X+Y*Z-_*$)*ia-(V*_+(X*Y+U*$)-W*Z)*ja-(U*Z+X*_+W*$-V*Y)*ka;k=+g[5957];i=+g[5959];m=+g[5958];n=(k*u+m*v-i*s)*-u+(v*(k*v+i*t-m*u)+(-(k*s)-m*t-i*u)*-s)-(i*v+m*s-k*t)*-t;o=(i*v+m*s-k*t)*-s+(v*(k*u+m*v-i*s)+(-(k*s)-m*t-i*u)*-t)-(k*v+i*t-m*u)*-u;j=(k*v+i*t-m*u)*-t+(v*(i*v+m*s-k*t)+(-(k*s)-m*t-i*u)*-u)-(k*u+m*v-i*s)*-s;p=1.0/+D(+(j*j+(n*n+o*o)));do if(i*p*j+(m*p*o+k*p*n)<-.9999998807907104)if(+C(+i)>.7071067690849304){j=1.0/+D(+(i*i+m*m));r=-(i*j);q=0.0;i=m*j;j=0.0;break}else{q=1.0/+D(+(k*k+m*m));r=k*q;q=-(m*q);i=0.0;j=0.0;break}else{sa=+D(+((i*p*j+(m*p*o+k*p*n)+1.0)*2.0));r=(i*p*n-k*p*j)*(1.0/sa);q=(m*p*j-i*p*o)*(1.0/sa);i=(k*p*o-m*p*n)*(1.0/sa);j=sa*.5}while(0);m=1.0/+D(+(q*q+r*r+i*i+j*j));o=q*m;r=r*m;q=i*m;m=j*m;T=1.0/+D(+((v*m-s*-o-t*-r-u*-q)*(v*m-s*-o-t*-r-u*-q)+((t*-o+(u*m+v*-q)-s*-r)*(t*-o+(u*m+v*-q)-s*-r)+((u*-r+(s*m+v*-o)-t*-q)*(u*-r+(s*m+v*-o)-t*-q)+(s*-q+(v*-r+t*m)-u*-o)*(s*-q+(v*-r+t*m)-u*-o)))));k=T*(u*-r+(s*m+v*-o)-t*-q);n=T*(s*-q+(v*-r+t*m)-u*-o);j=T*(t*-o+(u*m+v*-q)-s*-r);T=T*(v*m-s*-o-t*-r-u*-q);t=+g[b+444>>2];i=+g[b+456>>2];if(t>=i?(w=+g[b+448>>2],w>=i):0){s=m<-1.0?-1.0:m;s=+I(+(s>1.0?1.0:s))*2.0;if(s>1.1920928955078125e-07){p=1.0/+D(+(q*q+(o*o+r*r)));if(+C(+(r*p))>1.1920928955078125e-07){o=o*p;m=q*p;i=r*p;q=+D(+((q*p*q*p/(r*p*r*p)+1.0)/(1.0/(w*w)+q*p*q*p/(r*p*r*p)/(t*t))))}else{o=o*p;m=q*p;i=r*p;q=t}}else{o=0.0;m=0.0;i=0.0;q=0.0}p=+g[b+428>>2];r=q*p;if(s>r){a[b+526>>0]=1;if(s>2]=p;g[b+504>>2]=s-r;if(+C(+i)>1.1920928955078125e-07){sa=+C(+(i*-m/i*(w/t)));m=m<-0.0?sa:-sa;sa=1.0/+D(+(o*o+i*i+m*m));o=o*sa;m=-(m*sa);i=i*sa}ra=-o;qa=-i;oa=-m;na=(aa*da-ba*ca-ea*ha-fa*ga)*ra+(ba*ga+(da*ea+aa*ha)-ca*fa)*oa-(aa*fa+da*ga+ca*ha-ba*ea)*qa;sa=(aa*fa+da*ga+ca*ha-ba*ea)*ra+(aa*da-ba*ca-ea*ha-fa*ga)*qa-(aa*ba+ca*da+ea*fa-ga*ha)*oa;pa=(aa*ba+ca*da+ea*fa-ga*ha)*qa+(aa*da-ba*ca-ea*ha-fa*ga)*oa-(ba*ga+(da*ea+aa*ha)-ca*fa)*ra;oa=-((aa*ba+ca*da+ea*fa-ga*ha)*ra)-(ba*ga+(da*ea+aa*ha)-ca*fa)*qa-(aa*fa+da*ga+ca*ha-ba*ea)*oa;qa=sa*ka+(oa*ia+(aa*da-ba*ca-ea*ha-fa*ga)*na)-pa*ja;ra=pa*ia+((aa*da-ba*ca-ea*ha-fa*ga)*sa+oa*ja)-na*ka;sa=na*ja+(oa*ka+(aa*da-ba*ca-ea*ha-fa*ga)*pa)-sa*ia;g[b+460>>2]=qa;g[b+464>>2]=ra;g[b+468>>2]=sa;g[b+472>>2]=0.0;c[b+536>>2]=0;c[b+536+4>>2]=0;c[b+536+8>>2]=0;c[b+536+12>>2]=0;g[b+492>>2]=1.0/(qa*(+g[f>>2]*qa+ +g[f+16>>2]*ra+ +g[f+32>>2]*sa)+ra*(qa*+g[f+4>>2]+ra*+g[f+20>>2]+sa*+g[f+36>>2])+sa*(qa*+g[f+8>>2]+ra*+g[f+24>>2]+sa*+g[f+40>>2])+(qa*(qa*+g[h>>2]+ra*+g[h+16>>2]+sa*+g[h+32>>2])+ra*(qa*+g[h+4>>2]+ra*+g[h+20>>2]+sa*+g[h+36>>2])+sa*(qa*+g[h+8>>2]+ra*+g[h+24>>2]+sa*+g[h+40>>2])))}}else Q=23;a:do if((Q|0)==23){J=+g[b+300>>2];K=+g[b+316>>2];M=+g[b+332>>2];r=+g[d>>2];s=+g[d+4>>2];t=+g[d+8>>2];u=+g[d+16>>2];v=+g[d+20>>2];w=+g[d+24>>2];N=+g[d+32>>2];O=+g[d+36>>2];x=+g[d+40>>2];y=+g[b+304>>2];z=+g[b+320>>2];A=+g[b+336>>2];B=+g[b+308>>2];E=+g[b+324>>2];H=+g[b+340>>2];o=+g[b+364>>2];q=+g[b+380>>2];P=+g[b+396>>2];R=o*+g[e>>2]+q*+g[e+4>>2]+P*+g[e+8>>2];S=o*+g[e+16>>2]+q*+g[e+20>>2]+P*+g[e+24>>2];P=o*+g[e+32>>2]+q*+g[e+36>>2]+P*+g[e+40>>2];q=(J*r+K*s+M*t)*R+(J*u+K*v+M*w)*S+(J*N+K*O+M*x)*P;o=(r*y+s*z+t*A)*R+(u*y+v*z+w*A)*S+(N*y+O*z+x*A)*P;m=(r*B+s*E+t*H)*R+(u*B+v*E+w*H)*S+(N*B+O*E+x*H)*P;p=+g[b+444>>2];i=+g[b+456>>2];do if(p>2];if(p>0]=1;g[b+460>>2]=-((J*N+K*O+M*x)*S-(J*u+K*v+M*w)*P);g[b+464>>2]=-((J*r+K*s+M*t)*P-(J*N+K*O+M*x)*R);g[b+468>>2]=-((J*u+K*v+M*w)*R-(J*r+K*s+M*t)*S);g[b+472>>2]=0.0;break a}if(+C(+q)<1.1920928955078125e-07?+C(+m)<1.1920928955078125e-07:0){i=q;break}a[b+526>>0]=1;if(p>=i){i=+L(+m,+q);if(i>p){m=+G(+p);o=0.0;i=+F(+p);break}if(i<-p){m=-+G(+p);o=0.0;i=+F(+p)}else{o=0.0;i=q}}else i=q}else{if(+C(+q)<1.1920928955078125e-07?+C(+o)<1.1920928955078125e-07:0){i=q;break}a[b+526>>0]=1;if(p>=i){i=+L(+o,+q);if(i>p){m=0.0;o=+G(+p);i=+F(+p);break}if(i<-p){m=0.0;o=-+G(+p);i=+F(+p)}else{m=0.0;i=q}}else i=q}while(0);q=(r*B+s*E+t*H)*m+((r*y+s*z+t*A)*o+(J*r+K*s+M*t)*i);p=(u*B+v*E+w*H)*m+((u*y+v*z+w*A)*o+(J*u+K*v+M*w)*i);i=(N*B+O*E+x*H)*m+((N*y+O*z+x*A)*o+(J*N+K*O+M*x)*i);m=1.0/+D(+(i*i+(q*q+p*p)));g[b+460>>2]=-(S*m*i-P*m*p);g[b+464>>2]=-(P*m*q-R*m*i);g[b+468>>2]=-(R*m*p-S*m*q);g[b+472>>2]=0.0;o=+D(+((S*m*i-P*m*p)*(S*m*i-P*m*p)+(P*m*q-R*m*i)*(P*m*q-R*m*i)+(R*m*p-S*m*q)*(R*m*p-S*m*q)));g[b+504>>2]=o;if(!(+C(+o)<1.1920928955078125e-07)){g[b+460>>2]=1.0/o*-(S*m*i-P*m*p);g[b+464>>2]=1.0/o*-(P*m*q-R*m*i);g[b+468>>2]=1.0/o*-(R*m*p-S*m*q)}}while(0);p=+g[b+452>>2];if(!(p>=0.0)){g[b+512>>2]=0.0;l=la;return}i=T<-1.0?-1.0:T;i=+I(+(i>1.0?1.0:i))*2.0;if(i>3.1415927410125732){i=-T<-1.0?-1.0:-T;i=+I(+(i>1.0?1.0:i))*2.0;k=-k;n=-n;j=-j}g[b+512>>2]=i;if(i>1.1920928955078125e-07){sa=1.0/+D(+(k*k+n*n+j*j));k=k*sa;j=j*sa;n=n*sa}m=+g[b+428>>2];if(i>p*m){a[b+525>>0]=1;o=i-p*m;if(i>2]=i;g[b+508>>2]=o;ra=-k;qa=-n;oa=-j;na=(aa*da-ba*ca-ea*ha-fa*ga)*ra+(ba*ga+(da*ea+aa*ha)-ca*fa)*oa-(aa*fa+da*ga+ca*ha-ba*ea)*qa;sa=(aa*fa+da*ga+ca*ha-ba*ea)*ra+(aa*da-ba*ca-ea*ha-fa*ga)*qa-(aa*ba+ca*da+ea*fa-ga*ha)*oa;pa=(aa*ba+ca*da+ea*fa-ga*ha)*qa+(aa*da-ba*ca-ea*ha-fa*ga)*oa-(ba*ga+(da*ea+aa*ha)-ca*fa)*ra;oa=-((aa*ba+ca*da+ea*fa-ga*ha)*ra)-(ba*ga+(da*ea+aa*ha)-ca*fa)*qa-(aa*fa+da*ga+ca*ha-ba*ea)*oa;qa=sa*ka+(oa*ia+(aa*da-ba*ca-ea*ha-fa*ga)*na)-pa*ja;ra=pa*ia+((aa*da-ba*ca-ea*ha-fa*ga)*sa+oa*ja)-na*ka;sa=na*ja+(oa*ka+(aa*da-ba*ca-ea*ha-fa*ga)*pa)-sa*ia;g[b+476>>2]=qa;g[b+480>>2]=ra;g[b+484>>2]=sa;g[b+488>>2]=0.0;g[b+496>>2]=1.0/(qa*(+g[f>>2]*qa+ +g[f+16>>2]*ra+ +g[f+32>>2]*sa)+ra*(qa*+g[f+4>>2]+ra*+g[f+20>>2]+sa*+g[f+36>>2])+sa*(qa*+g[f+8>>2]+ra*+g[f+24>>2]+sa*+g[f+40>>2])+(qa*(qa*+g[h>>2]+ra*+g[h+16>>2]+sa*+g[h+32>>2])+ra*(qa*+g[h+4>>2]+ra*+g[h+20>>2]+sa*+g[h+36>>2])+sa*(qa*+g[h+8>>2]+ra*+g[h+24>>2]+sa*+g[h+40>>2])))}if(!(a[b+526>>0]|0)){l=la;return}na=-k;sa=-n;oa=-j;ma=(U*X-V*W-Y*$-Z*_)*na+(V*_+(X*Y+U*$)-W*Z)*oa-(U*Z+X*_+W*$-V*Y)*sa;ra=(U*Z+X*_+W*$-V*Y)*na+(U*X-V*W-Y*$-Z*_)*sa-(U*V+W*X+Y*Z-_*$)*oa;qa=(U*V+W*X+Y*Z-_*$)*sa+(U*X-V*W-Y*$-Z*_)*oa-(V*_+(X*Y+U*$)-W*Z)*na;oa=-((U*V+W*X+Y*Z-_*$)*na)-(V*_+(X*Y+U*$)-W*Z)*sa-(U*Z+X*_+W*$-V*Y)*oa;sa=-(U*V+W*X+Y*Z-_*$);na=-(V*_+(X*Y+U*$)-W*Z);pa=-(U*Z+X*_+W*$-V*Y);g[b+536>>2]=ra*pa+(oa*sa+(U*X-V*W-Y*$-Z*_)*ma)-qa*na;g[b+540>>2]=qa*sa+((U*X-V*W-Y*$-Z*_)*ra+oa*na)-ma*pa;g[b+544>>2]=ma*na+(oa*pa+(U*X-V*W-Y*$-Z*_)*qa)-ra*sa;g[b+548>>2]=0.0;l=la;return}function yc(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0.0,oa=0.0,pa=0.0,qa=0.0,ra=0.0;ga=l;l=l+4352|0;da=c[d+4>>2]|0;ea=c[e+4>>2]|0;s=c[da+68>>2]|0;t=c[ea+68>>2]|0;if(!((s|0)!=0&(t|0)!=0)){Ic(b,d,e,f,h);l=ga;return}if(!((c[da+72>>2]|0)==(c[b+108>>2]|0)?(c[ea+72>>2]|0)==(c[b+112>>2]|0):0)){i=c[b+84>>2]|0;k=c[i+8>>2]|0;if((k|0)>0){j=0;do{m=c[(c[i+16>>2]|0)+(j*12|0)+8>>2]|0;if(m|0){Ib[c[c[m>>2]>>2]&511](m);u=c[b+4>>2]|0;Ob[c[(c[u>>2]|0)+60>>2]&127](u,m)}j=j+1|0}while((j|0)!=(k|0));i=c[b+84>>2]|0}Rh(i);c[b+108>>2]=c[da+72>>2];c[b+112>>2]=c[ea+72>>2]}a[ga+3328+16>>0]=1;r=ga+3328+12|0;c[r>>2]=0;q=ga+3328+4|0;c[q>>2]=0;c[ga+3328+8>>2]=0;c[ga+112>>2]=1025;i=ga+112+120|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+312|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+504|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+696|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));c[ga+112+772>>2]=0;c[ga+112+776>>2]=0;c[ga+112+780>>2]=0;c[ga+112+800>>2]=0;c[ga+112+804>>2]=1025;i=ga+112+924|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+1116|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+1308|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+1500|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));c[ga+112+1576>>2]=0;c[ga+112+1580>>2]=0;c[ga+112+1584>>2]=0;c[ga+112+1604>>2]=0;c[ga+112+1608>>2]=1025;i=ga+112+1728|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+1920|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+2112|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+2304|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));c[ga+112+2380>>2]=0;c[ga+112+2384>>2]=0;c[ga+112+2388>>2]=0;c[ga+112+2408>>2]=0;c[ga+112+2412>>2]=1025;i=ga+112+2532|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+2724|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+2916|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=ga+112+3108|0;j=i+44|0;do{c[i>>2]=0;i=i+4|0}while((i|0)<(j|0));c[ga+112+3184>>2]=0;c[ga+112+3188>>2]=0;c[ga+112+3192>>2]=0;c[ga+112+3212>>2]=0;a[q+12>>0]=0;c[r>>2]=ga+112;c[q>>2]=0;c[ga+3328+8>>2]=4;p=c[b+84>>2]|0;i=c[p+8>>2]|0;if((i|0)>0){o=0;do{j=c[(c[p+16>>2]|0)+(o*12|0)+8>>2]|0;if(j){Ob[c[(c[j>>2]|0)+16>>2]&127](j,ga+3328|0);i=c[q>>2]|0;if((i|0)>0){n=0;do{m=c[(c[r>>2]|0)+(n<<2)>>2]|0;if(c[m+780>>2]|0){c[h+4>>2]=m;j=c[m+772>>2]|0;k=c[(c[h+8>>2]|0)+8>>2]|0;i=c[(c[h+12>>2]|0)+8>>2]|0;if((j|0)==(k|0))af(m,j+4|0,i+4|0);else af(m,i+4|0,k+4|0);c[h+4>>2]=0;i=c[q>>2]|0}n=n+1|0}while((n|0)<(i|0))}if((i|0)<0){if((c[ga+3328+8>>2]|0)<0){j=c[r>>2]|0;if(j|0){if(a[ga+3328+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[r>>2]=0}a[ga+3328+16>>0]=1;c[r>>2]=0;c[ga+3328+8>>2]=0}do{c[(c[r>>2]|0)+(i<<2)>>2]=0;i=i+1|0}while((i|0)!=0)}c[q>>2]=0;i=c[p+8>>2]|0}o=o+1|0}while((o|0)<(i|0));i=c[r>>2]|0;if(i|0)if((a[ga+3328+16>>0]|0)==0|(i|0)==0)ca=35;else{c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);ca=35}}else ca=35;if((ca|0)==35)c[r>>2]=0;u=c[b+4>>2]|0;i=c[b+84>>2]|0;j=c[b+72>>2]|0;c[ga+112>>2]=6604;c[ga+112+4>>2]=0;c[ga+112+8>>2]=d;c[ga+112+12>>2]=e;c[ga+112+16>>2]=u;c[ga+112+20>>2]=f;c[ga+112+24>>2]=h;c[ga+112+28>>2]=i;c[ga+112+32>>2]=j;j=c[d+12>>2]|0;G=+g[j>>2];H=+g[j+16>>2];I=+g[j+32>>2];J=+g[j+4>>2];K=+g[j+20>>2];L=+g[j+36>>2];M=+g[j+8>>2];N=+g[j+24>>2];O=+g[j+40>>2];P=-+g[j+48>>2];Q=-+g[j+52>>2];R=-+g[j+56>>2];j=c[e+12>>2]|0;S=+g[j>>2];T=+g[j+16>>2];U=+g[j+32>>2];V=+g[j+4>>2];W=+g[j+20>>2];X=+g[j+36>>2];Y=+g[j+8>>2];Z=+g[j+24>>2];_=+g[j+40>>2];$=+g[j+48>>2];aa=+g[j+52>>2];ba=+g[j+56>>2];j=c[s>>2]|0;i=c[t>>2]|0;F=+g[h+32>>2];if((j|0)!=0&(i|0)!=0){c[ga+3328>>2]=j;c[ga+3328+4>>2]=i;v=+C(+(G*S+H*T+I*U));w=+C(+(G*V+H*W+I*X));x=+C(+(G*Y+H*Z+I*_));y=+C(+(J*S+K*T+L*U));z=+C(+(J*V+K*W+L*X));A=+C(+(J*Y+K*Z+L*_));B=+C(+(M*S+N*T+O*U));D=+C(+(M*V+N*W+O*X));E=+C(+(M*Y+N*Z+O*_));o=1;m=124;n=128;r=ga+3328|0;k=128;t=0;while(1){u=o+-1|0;f=c[r+(u<<3)>>2]|0;s=c[r+(u<<3)+4>>2]|0;ra=+g[s+16>>2];qa=+g[s>>2];pa=+g[s+20>>2];oa=+g[s+4>>2];na=+g[s+24>>2];ha=+g[s+8>>2];ma=G*P+H*Q+I*R+(G*$+H*aa+I*ba)+((G*S+H*T+I*U)*(ra+qa)*.5+(G*V+H*W+I*X)*(pa+oa)*.5+(G*Y+H*Z+I*_)*(na+ha)*.5);ka=J*P+K*Q+L*R+(J*$+K*aa+L*ba)+((J*S+K*T+L*U)*(ra+qa)*.5+(J*V+K*W+L*X)*(pa+oa)*.5+(J*Y+K*Z+L*_)*(na+ha)*.5);ia=M*P+N*Q+O*R+(M*$+N*aa+O*ba)+((M*S+N*T+O*U)*(ra+qa)*.5+(M*V+N*W+O*X)*(pa+oa)*.5+(M*Y+N*Z+O*_)*(na+ha)*.5);la=((ra-qa)*.5+0.0)*v+((pa-oa)*.5+0.0)*w+((na-ha)*.5+0.0)*x;ja=((ra-qa)*.5+0.0)*y+((pa-oa)*.5+0.0)*z+((na-ha)*.5+0.0)*A;ha=((ra-qa)*.5+0.0)*B+((pa-oa)*.5+0.0)*D+((na-ha)*.5+0.0)*E;do if(((((+g[f>>2]<=F+(la+ma)?+g[f+16>>2]>=ma-la-F:0)?+g[f+4>>2]<=F+(ka+ja):0)?+g[f+20>>2]>=ka-ja-F:0)?+g[f+8>>2]<=F+(ia+ha):0)?+g[f+24>>2]>=ia-ha-F:0){if((u|0)>(m|0)){p=k<<1;a:do if((k|0)<(p|0)&(n|0)<(p|0)){do if(k){c[6995]=(c[6995]|0)+1;i=sc((k<<4|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}if((k|0)>0)j=0;else{ca=51;break}do{m=r+(j<<3)|0;n=c[m+4>>2]|0;q=i+(j<<3)|0;c[q>>2]=c[m>>2];c[q+4>>2]=n;j=j+1|0}while((j|0)!=(k|0));if(!(t<<24>>24)){k=p;j=1;break a}}else{i=0;ca=51}while(0);if((ca|0)==51){ca=0;if((r|0)==0|t<<24>>24==0){k=p;j=1;break}}c[6996]=(c[6996]|0)+1;Cd(c[r+-4>>2]|0);k=p;j=1}else{k=n;i=r;j=t}while(0);q=p+-4|0;n=k}else{q=m;i=r;p=k;j=t}k=(c[s+40>>2]|0)!=0;if(!(c[f+40>>2]|0))if(k){m=c[s+36>>2]|0;c[i+(u<<3)>>2]=f;c[i+(u<<3)+4>>2]=m;m=c[s+40>>2]|0;c[i+(o<<3)>>2]=f;c[i+(o<<3)+4>>2]=m;o=o+1|0;m=q;k=p;break}else{Sb[c[(c[ga+112>>2]|0)+8>>2]&127](ga+112|0,f,s);o=u;m=q;k=p;break}else{m=c[f+36>>2]|0;if(k){k=c[s+36>>2]|0;c[i+(u<<3)>>2]=m;c[i+(u<<3)+4>>2]=k;u=c[s+36>>2]|0;k=o+1|0;c[i+(o<<3)>>2]=c[f+40>>2];c[i+(o<<3)+4>>2]=u;u=c[s+40>>2]|0;m=o+2|0;c[i+(k<<3)>>2]=c[f+36>>2];c[i+(k<<3)+4>>2]=u;k=c[s+40>>2]|0;c[i+(m<<3)>>2]=c[f+40>>2];c[i+(m<<3)+4>>2]=k;o=o+3|0;m=q;k=p;break}else{c[i+(u<<3)>>2]=m;c[i+(u<<3)+4>>2]=s;c[i+(o<<3)>>2]=c[f+40>>2];c[i+(o<<3)+4>>2]=s;o=o+1|0;m=q;k=p;break}}}else{o=u;i=r;j=t}while(0);if(!o)break;else{r=i;t=j}}if(!((i|0)==0|j<<24>>24==0)){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}}p=c[b+84>>2]|0;if((c[p+8>>2]|0)>0){o=0;do{i=c[p+16>>2]|0;j=c[i+(o*12|0)+8>>2]|0;do if(j|0){ca=c[i+(o*12|0)>>2]|0;u=c[da+28>>2]|0;t=c[u+(ca*80|0)+64>>2]|0;s=c[d+12>>2]|0;S=+g[s>>2];R=+g[s+4>>2];qa=+g[s+8>>2];la=+g[s+16>>2];ja=+g[s+20>>2];ha=+g[s+24>>2];ka=+g[s+32>>2];Y=+g[s+36>>2];W=+g[s+40>>2];ba=+g[u+(ca*80|0)>>2];aa=+g[u+(ca*80|0)+16>>2];$=+g[u+(ca*80|0)+32>>2];_=+g[u+(ca*80|0)+4>>2];Z=+g[u+(ca*80|0)+20>>2];ma=+g[u+(ca*80|0)+36>>2];ia=+g[u+(ca*80|0)+8>>2];X=+g[u+(ca*80|0)+24>>2];V=+g[u+(ca*80|0)+40>>2];pa=+g[u+(ca*80|0)+48>>2];ra=+g[u+(ca*80|0)+52>>2];oa=+g[u+(ca*80|0)+56>>2];U=+g[s+48>>2]+(S*pa+R*ra+qa*oa);T=+g[s+52>>2]+(la*pa+ja*ra+ha*oa);oa=+g[s+56>>2]+(ka*pa+Y*ra+W*oa);g[ga>>2]=S*ba+R*aa+qa*$;g[ga+4>>2]=S*_+R*Z+qa*ma;g[ga+8>>2]=S*ia+R*X+qa*V;g[ga+12>>2]=0.0;g[ga+16>>2]=la*ba+ja*aa+ha*$;g[ga+20>>2]=la*_+ja*Z+ha*ma;g[ga+24>>2]=la*ia+ja*X+ha*V;g[ga+28>>2]=0.0;g[ga+32>>2]=ka*ba+Y*aa+W*$;g[ga+36>>2]=ka*_+Y*Z+W*ma;g[ga+40>>2]=ka*ia+Y*X+W*V;g[ga+44>>2]=0.0;g[ga+48>>2]=U;g[ga+52>>2]=T;g[ga+56>>2]=oa;g[ga+60>>2]=0.0;Vb[c[(c[t>>2]|0)+8>>2]&127](t,ga,ga+3328|0,ga+96|0);oa=+g[h+32>>2];g[ga+3328>>2]=+g[ga+3328>>2]-oa;g[ga+3328+4>>2]=+g[ga+3328+4>>2]-oa;g[ga+3328+8>>2]=+g[ga+3328+8>>2]-oa;g[ga+96>>2]=oa+ +g[ga+96>>2];g[ga+96+4>>2]=oa+ +g[ga+96+4>>2];g[ga+96+8>>2]=oa+ +g[ga+96+8>>2];t=c[(c[p+16>>2]|0)+(o*12|0)+4>>2]|0;s=c[ea+28>>2]|0;ca=c[s+(t*80|0)+64>>2]|0;u=c[e+12>>2]|0;T=+g[u>>2];U=+g[u+4>>2];V=+g[u+8>>2];W=+g[u+16>>2];X=+g[u+20>>2];Y=+g[u+24>>2];ia=+g[u+32>>2];ka=+g[u+36>>2];ma=+g[u+40>>2];Z=+g[s+(t*80|0)>>2];_=+g[s+(t*80|0)+16>>2];$=+g[s+(t*80|0)+32>>2];aa=+g[s+(t*80|0)+4>>2];ba=+g[s+(t*80|0)+20>>2];ha=+g[s+(t*80|0)+36>>2];ja=+g[s+(t*80|0)+8>>2];la=+g[s+(t*80|0)+24>>2];qa=+g[s+(t*80|0)+40>>2];R=+g[s+(t*80|0)+48>>2];S=+g[s+(t*80|0)+52>>2];ra=+g[s+(t*80|0)+56>>2];pa=+g[u+48>>2]+(T*R+U*S+V*ra);na=+g[u+52>>2]+(W*R+X*S+Y*ra);ra=+g[u+56>>2]+(ia*R+ka*S+ma*ra);g[ga>>2]=T*Z+U*_+V*$;g[ga+4>>2]=T*aa+U*ba+V*ha;g[ga+8>>2]=T*ja+U*la+V*qa;g[ga+12>>2]=0.0;g[ga+16>>2]=W*Z+X*_+Y*$;g[ga+20>>2]=W*aa+X*ba+Y*ha;g[ga+24>>2]=W*ja+X*la+Y*qa;g[ga+28>>2]=0.0;g[ga+32>>2]=ia*Z+ka*_+ma*$;g[ga+36>>2]=ia*aa+ka*ba+ma*ha;g[ga+40>>2]=ia*ja+ka*la+ma*qa;g[ga+44>>2]=0.0;g[ga+48>>2]=pa;g[ga+52>>2]=na;g[ga+56>>2]=ra;g[ga+60>>2]=0.0;Vb[c[(c[ca>>2]|0)+8>>2]&127](ca,ga,ga+80|0,ga+64|0);ra=+g[ga+80>>2]-oa;g[ga+80>>2]=ra;na=+g[ga+80+4>>2]-oa;g[ga+80+4>>2]=na;pa=+g[ga+80+8>>2]-oa;g[ga+80+8>>2]=pa;qa=oa+ +g[ga+64>>2];g[ga+64>>2]=qa;ma=oa+ +g[ga+64+4>>2];g[ga+64+4>>2]=ma;oa=oa+ +g[ga+64+8>>2];g[ga+64+8>>2]=oa;if(!(+g[ga+3328+4>>2]>ma)?!(+g[ga+96+4>>2]>2]>oa?1:+g[ga+96+8>>2]>2]>qa?1:+g[ga+96>>2]>2]>>2]&511](j);n=c[b+4>>2]|0;Ob[c[(c[n>>2]|0)+60>>2]&127](n,j);n=c[p+16>>2]|0;m=c[n+(o*12|0)>>2]|0;n=c[n+(o*12|0)+4>>2]|0;j=c[b+92>>2]|0;if((j|0)==(c[b+96>>2]|0)?(fa=j|0?j<<1:1,(j|0)<(fa|0)):0){if(!fa)i=0;else{c[6995]=(c[6995]|0)+1;i=sc((fa*12|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}j=c[b+92>>2]|0}if((j|0)>0){k=0;do{ca=i+(k*12|0)|0;u=(c[b+100>>2]|0)+(k*12|0)|0;c[ca>>2]=c[u>>2];c[ca+4>>2]=c[u+4>>2];c[ca+8>>2]=c[u+8>>2];k=k+1|0}while((k|0)!=(j|0))}j=c[b+100>>2]|0;if(j|0){if(a[b+104>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[b+100>>2]=0}a[b+104>>0]=1;c[b+100>>2]=i;c[b+96>>2]=fa;i=c[b+92>>2]|0}else i=j;ca=c[b+100>>2]|0;c[ca+(i*12|0)>>2]=m;c[ca+(i*12|0)+4>>2]=n;c[ca+(i*12|0)+8>>2]=0;c[b+92>>2]=(c[b+92>>2]|0)+1}while(0);o=o+1|0}while((o|0)<(c[p+8>>2]|0));j=b+100|0;k=b+92|0}else{j=b+100|0;k=b+92|0}if((c[k>>2]|0)>0){i=0;do{h=c[b+84>>2]|0;fa=c[j>>2]|0;Bb[c[(c[h>>2]|0)+8>>2]&63](h,c[fa+(i*12|0)>>2]|0,c[fa+(i*12|0)+4>>2]|0)|0;i=i+1|0}while((i|0)<(c[k>>2]|0))}i=c[j>>2]|0;if(i|0){if(a[b+104>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[j>>2]=0}a[b+104>>0]=1;c[j>>2]=0;c[k>>2]=0;c[b+96>>2]=0;l=ga;return}function zc(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0,m=0,n=0,o=0.0,p=0.0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0,T=0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0.0,oa=0.0,pa=0.0,qa=0,ra=0;qa=c[b+28>>2]|0;ra=c[b+32>>2]|0;n=c[d+24>>2]|0;if(!(a[b+739>>0]|0)){z=+g[b+552>>2];U=+g[qa+4>>2];A=+g[b+568>>2];V=+g[qa+8>>2];B=+g[b+584>>2];W=+g[qa+12>>2];C=+g[b+556>>2];E=+g[b+572>>2];F=+g[b+588>>2];X=+g[b+560>>2];Y=+g[b+576>>2];Z=+g[b+592>>2];_=+g[qa+20>>2];$=+g[qa+24>>2];aa=+g[qa+28>>2];ba=+g[qa+36>>2];ca=+g[qa+40>>2];da=+g[qa+44>>2];k=+g[b+600>>2];o=+g[b+604>>2];p=+g[b+608>>2];t=+g[qa+52>>2];u=+g[qa+56>>2];v=+g[qa+60>>2];G=+g[ra+4>>2];H=+g[ra+8>>2];I=+g[ra+12>>2];J=+g[b+624>>2];K=+g[b+640>>2];L=+g[b+656>>2];M=+g[ra+20>>2];N=+g[ra+24>>2];O=+g[ra+28>>2];P=+g[ra+36>>2];Q=+g[ra+40>>2];R=+g[ra+44>>2];oa=+g[b+664>>2];pa=+g[b+668>>2];y=+g[b+672>>2];w=+g[ra+52>>2]+(G*oa+H*pa+I*y);x=M*oa+N*pa+O*y+ +g[ra+56>>2];y=P*oa+Q*pa+R*y+ +g[ra+60>>2];l=(a[b+736>>0]|0)==0;if(l){e=c[d+8>>2]|0;g[e>>2]=1.0;g[e+(n+1<<2)>>2]=1.0;g[e+((n<<1)+2<<2)>>2]=1.0;e=c[d+16>>2]|0;g[e>>2]=-1.0;g[e+(n+1<<2)>>2]=-1.0;g[e+((n<<1)+2<<2)>>2]=-1.0;e=n<<1;f=+g[qa+52>>2];h=+g[qa+56>>2];i=+g[qa+60>>2]}else{e=n<<1;f=t;h=u;i=v}j=t+(U*k+V*o+W*p)-f;f=_*k+$*o+aa*p+u-h;pa=ba*k+ca*o+da*p+v-i;m=c[d+12>>2]|0;r=m+(e<<2)|0;c[m>>2]=0;g[m+4>>2]=pa;g[m+8>>2]=-f;g[m+12>>2]=0.0;g[m+(n<<2)>>2]=-pa;c[m+(n<<2)+4>>2]=0;g[m+(n<<2)+8>>2]=j;g[m+(n<<2)+12>>2]=0.0;g[r>>2]=f;g[r+4>>2]=-j;c[r+8>>2]=0;g[r+12>>2]=0.0;j=w-+g[ra+52>>2];f=x-+g[ra+56>>2];pa=y-+g[ra+60>>2];r=c[d+20>>2]|0;S=r+(e<<2)|0;c[r>>2]=0;g[r+4>>2]=-pa;g[r+8>>2]=f;g[r+12>>2]=0.0;g[r+(n<<2)>>2]=pa;c[r+(n<<2)+4>>2]=0;g[r+(n<<2)+8>>2]=-j;g[r+(n<<2)+12>>2]=0.0;g[S>>2]=-f;g[S+4>>2]=j;c[S+8>>2]=0;g[S+12>>2]=0.0;S=c[b+748>>2]|0;j=+g[(S&8|0?b+756|0:d+4|0)>>2];f=j*+g[d>>2];e=c[d+28>>2]|0;if(l){g[e>>2]=f*(w-(t+(U*k+V*o+W*p)));g[e+(n<<2)>>2]=f*(x-(_*k+$*o+aa*p+u));g[e+(n<<1<<2)>>2]=f*(y-(ba*k+ca*o+da*p+v))}s=c[d+24>>2]|0;g[m+(s*3<<2)>>2]=z*U+A*V+B*W;g[m+((s*3|0)+1<<2)>>2]=z*_+A*$+B*aa;g[m+((s*3|0)+2<<2)>>2]=z*ba+A*ca+B*da;g[m+(s<<2<<2)>>2]=U*C+V*E+W*F;g[m+((s<<2|1)<<2)>>2]=C*_+E*$+F*aa;g[m+((s<<2|2)<<2)>>2]=C*ba+E*ca+F*da;g[r+(s*3<<2)>>2]=-(z*U+A*V+B*W);g[r+((s*3|0)+1<<2)>>2]=-(z*_+A*$+B*aa);g[r+((s*3|0)+2<<2)>>2]=-(z*ba+A*ca+B*da);g[r+(s<<2<<2)>>2]=-(U*C+V*E+W*F);g[r+((s<<2|1)<<2)>>2]=-(C*_+E*$+F*aa);g[r+((s<<2|2)<<2)>>2]=-(C*ba+E*ca+F*da);oa=(X*_+Y*$+Z*aa)*(J*P+K*Q+L*R)-(X*ba+Y*ca+Z*da)*(J*M+K*N+L*O);pa=(X*ba+Y*ca+Z*da)*(G*J+H*K+I*L)-(U*X+V*Y+W*Z)*(J*P+K*Q+L*R);na=(U*X+V*Y+W*Z)*(J*M+K*N+L*O)-(X*_+Y*$+Z*aa)*(G*J+H*K+I*L);g[e+(s*3<<2)>>2]=((z*ba+A*ca+B*da)*na+((z*U+A*V+B*W)*oa+(z*_+A*$+B*aa)*pa))*f;g[e+(s<<2<<2)>>2]=((C*ba+E*ca+F*da)*na+((U*C+V*E+W*F)*oa+(C*_+E*$+F*aa)*pa))*f;if(!(a[b+716>>0]|0))if(!(a[b+737>>0]|0))return;else{p=0.0;q=0;n=0;l=1}else{pa=+g[b+708>>2]*+g[b+732>>2];p=pa;q=pa>0.0?1:2;n=1;l=(a[b+737>>0]|0)!=0}g[m+(s*5<<2)>>2]=U*X+V*Y+W*Z;g[m+((s*5|0)+1<<2)>>2]=X*_+Y*$+Z*aa;g[m+((s*5|0)+2<<2)>>2]=X*ba+Y*ca+Z*da;g[r+(s*5<<2)>>2]=-(U*X+V*Y+W*Z);g[r+((s*5|0)+1<<2)>>2]=-(X*_+Y*$+Z*aa);g[r+((s*5|0)+2<<2)>>2]=-(X*ba+Y*ca+Z*da);h=+g[b+688>>2];i=+g[b+692>>2];f=+mh(h-i,6.2831854820251465);if(!(f<-3.1415927410125732))if(f>3.1415927410125732)o=f+-6.2831854820251465;else o=f;else o=f+6.2831854820251465;f=+mh(h+i,6.2831854820251465);if(!(f<-3.1415927410125732))if(f>3.1415927410125732)k=f+-6.2831854820251465;else k=f;else k=f+6.2831854820251465;m=o==k;e=e+(s*5<<2)|0;g[e>>2]=0.0;if(S&2)j=+g[b+764>>2];if(l&(n&m^1)){if(S&4|0)c[(c[d+32>>2]|0)+(s*5<<2)>>2]=c[b+752>>2];h=+g[b+728>>2];i=+g[b+680>>2];f=o>k?1.0:0.0;do if(!(o>=k)){f=i/(j*+g[d>>2]);if(f<0.0)if(h>=o&o-f>h){f=(o-h)/f;break}else{f=h0.0)if(h<=k&k-fk?0.0:1.0;break}else f=0.0}while(0);g[e>>2]=f*i*+g[b+732>>2]+ +g[e>>2];g[(c[d+36>>2]|0)+(s*5<<2)>>2]=-+g[b+684>>2];c[(c[d+40>>2]|0)+(s*5<<2)>>2]=c[b+684>>2]}if(!n)return;g[e>>2]=+g[e>>2]+p*j*+g[d>>2];if(S&1|0)c[(c[d+32>>2]|0)+(s*5<<2)>>2]=c[b+760>>2];e=c[d+40>>2]|0;if(m){f=3402823466385288598117041.0e14;h=-3402823466385288598117041.0e14}else{T=(q|0)==1;f=T?3402823466385288598117041.0e14:0.0;h=T?0.0:-3402823466385288598117041.0e14}g[(c[d+36>>2]|0)+(s*5<<2)>>2]=h;g[e+(s*5<<2)>>2]=f;h=+g[b+704>>2];do if(h>0.0){f=(U*X+V*Y+W*Z)*+g[qa+388>>2]+(X*_+Y*$+Z*aa)*+g[qa+392>>2]+(X*ba+Y*ca+Z*da)*+g[qa+396>>2]-((U*X+V*Y+W*Z)*+g[ra+388>>2]+(X*_+Y*$+Z*aa)*+g[ra+392>>2]+(X*ba+Y*ca+Z*da)*+g[ra+396>>2]);if((q|0)==1){if(!(f<0.0))break;e=(c[d+28>>2]|0)+(s*5<<2)|0;if(!(+g[e>>2]<-(h*f)))break;g[e>>2]=-(h*f);break}else{if(!(f>0.0))break;e=(c[d+28>>2]|0)+(s*5<<2)|0;if(!(+g[e>>2]>-(h*f)))break;g[e>>2]=-(h*f);break}}while(0);d=(c[d+28>>2]|0)+(s*5<<2)|0;g[d>>2]=+g[b+700>>2]*+g[d>>2];return}X=+g[qa+4>>2];Y=+g[qa+8>>2];Z=+g[qa+12>>2];v=+g[b+556>>2];x=+g[b+572>>2];y=+g[b+588>>2];_=+g[b+560>>2];$=+g[b+576>>2];aa=+g[b+592>>2];ba=+g[qa+20>>2];ca=+g[qa+24>>2];da=+g[qa+28>>2];ea=+g[qa+36>>2];fa=+g[qa+40>>2];ga=+g[qa+44>>2];ia=+g[b+600>>2];ha=+g[b+604>>2];o=+g[b+608>>2];h=+g[qa+52>>2]+(X*ia+Y*ha+Z*o);u=ba*ia+ca*ha+da*o+ +g[qa+56>>2];o=ea*ia+fa*ha+ga*o+ +g[qa+60>>2];ha=+g[ra+4>>2];ia=+g[ra+8>>2];ja=+g[ra+12>>2];ka=+g[b+624>>2];la=+g[b+640>>2];O=+g[b+656>>2];P=+g[ra+20>>2];Q=+g[ra+24>>2];R=+g[ra+28>>2];U=+g[ra+36>>2];V=+g[ra+40>>2];W=+g[ra+44>>2];p=+g[b+664>>2];w=+g[b+668>>2];i=+g[b+672>>2];f=+g[ra+52>>2];t=+g[ra+56>>2];k=+g[ra+60>>2];J=f+(ha*p+ia*w+ja*i)-h;K=P*p+Q*w+R*i+t-u;L=U*p+V*w+W*i+k-o;z=+g[(c[b+28>>2]|0)+404>>2];A=+g[(c[b+32>>2]|0)+404>>2];I=z+A>0.0?A/(z+A):.5;ma=(X*_+Y*$+Z*aa)*I+(ha*ka+ia*la+ja*O)*(1.0-I);na=(_*ba+$*ca+aa*da)*I+(ka*P+la*Q+O*R)*(1.0-I);oa=(_*ea+$*fa+aa*ga)*I+(ka*U+la*V+O*W)*(1.0-I);pa=1.0/+D(+(ma*ma+na*na+oa*oa));F=(f+(ha*p+ia*w+ja*i)-f)*ma*pa+(P*p+Q*w+R*i+t-t)*na*pa+(U*p+V*w+W*i+k-k)*oa*pa;f=f+(ha*p+ia*w+ja*i)-f-ma*pa*F;t=P*p+Q*w+R*i+t-t-na*pa*F;k=U*p+V*w+W*i+k-k-oa*pa*F;h=h-+g[qa+52>>2];u=u-+g[qa+56>>2];o=o-+g[qa+60>>2];i=ma*pa*(h*ma*pa+u*na*pa+o*oa*pa);w=na*pa*(h*ma*pa+u*na*pa+o*oa*pa);p=oa*pa*(h*ma*pa+u*na*pa+o*oa*pa);C=h-i+I*(i-ma*pa*F);E=u-w+I*(w-na*pa*F);B=o-p+I*(p-oa*pa*F);G=f-(1.0-I)*(i-ma*pa*F);H=t-(1.0-I)*(w-na*pa*F);F=k-(1.0-I)*(p-oa*pa*F);j=(I*f+(1.0-I)*(h-i))*(I*f+(1.0-I)*(h-i))+(I*t+(1.0-I)*(u-w))*(I*t+(1.0-I)*(u-w))+(I*k+(1.0-I)*(o-p))*(I*k+(1.0-I)*(o-p));if(j>1.1920928955078125e-07){y=1.0/+D(+j);N=(I*f+(1.0-I)*(h-i))*y;M=y*(I*k+(1.0-I)*(o-p));p=y*(I*t+(1.0-I)*(u-w))}else{N=X*v+Y*x+Z*y;M=v*ea+x*fa+y*ga;p=v*ba+x*ca+y*da}t=na*pa*M-oa*pa*p;u=oa*pa*N-M*ma*pa;v=p*ma*pa-na*pa*N;T=c[d+12>>2]|0;g[T>>2]=E*M-B*p;g[T+4>>2]=B*N-C*M;g[T+8>>2]=C*p-E*N;T=c[d+20>>2]|0;g[T>>2]=-(H*M-F*p);g[T+4>>2]=-(F*N-G*M);g[T+8>>2]=-(G*p-H*N);if(z<1.1920928955078125e-07|A<1.1920928955078125e-07?(a[b+716>>0]|0)!=0:0){f=I*(E*v-B*u);h=I*(B*t-C*v);i=I*(C*u-E*t);j=(1.0-I)*(H*v-F*u);k=(1.0-I)*(F*t-G*v);o=(1.0-I)*(G*u-H*t)}else{f=E*v-B*u;h=B*t-C*v;i=C*u-E*t;j=H*v-F*u;k=F*t-G*v;o=G*u-H*t}T=(c[d+12>>2]|0)+(n<<2)|0;g[T>>2]=f;g[T+4>>2]=h;g[T+8>>2]=i;T=c[d+20>>2]|0;g[T+(n<<2)>>2]=-j;g[T+(n+1<<2)>>2]=-k;g[T+(n+2<<2)>>2]=-o;if(z<1.1920928955078125e-07|A<1.1920928955078125e-07){o=I*(E*oa*pa-B*na*pa);k=I*(B*ma*pa-C*oa*pa);h=I*(C*na*pa-E*ma*pa);j=(1.0-I)*(H*oa*pa-F*na*pa);i=(1.0-I)*(F*ma*pa-G*oa*pa);f=(1.0-I)*(G*na*pa-H*ma*pa)}else{o=E*oa*pa-B*na*pa;k=B*ma*pa-C*oa*pa;h=C*na*pa-E*ma*pa;j=H*oa*pa-F*na*pa;i=F*ma*pa-G*oa*pa;f=G*na*pa-H*ma*pa}e=(c[d+12>>2]|0)+(n<<1<<2)|0;g[e>>2]=o;g[e+4>>2]=k;g[e+8>>2]=h;e=c[d+20>>2]|0;g[e+(n<<1<<2)>>2]=-j;g[e+((n<<1|1)<<2)>>2]=-i;g[e+((n<<1)+2<<2)>>2]=-f;k=+g[(c[b+748>>2]&8|0?b+756|0:d+4|0)>>2];f=k*+g[d>>2];if(!(a[b+736>>0]|0)){S=c[d+8>>2]|0;g[S>>2]=N;g[S+4>>2]=p;g[S+8>>2]=M;S=(c[d+8>>2]|0)+(n<<2)|0;g[S>>2]=t;g[S+4>>2]=u;g[S+8>>2]=v;S=(c[d+8>>2]|0)+(n<<1<<2)|0;g[S>>2]=ma*pa;g[S+4>>2]=na*pa;g[S+8>>2]=oa*pa;S=c[d+16>>2]|0;h=-N;g[S>>2]=h;g[S+4>>2]=-p;g[S+8>>2]=-M;g[S+(n<<2)>>2]=-t;g[S+(n+1<<2)>>2]=-u;g[S+(n+2<<2)>>2]=-v;g[S+(n<<1<<2)>>2]=-(ma*pa);g[S+((n<<1|1)<<2)>>2]=-(na*pa);g[S+((n<<1)+2<<2)>>2]=-(oa*pa);S=c[d+28>>2]|0;g[S>>2]=f*(J*N+K*p+L*M);g[S+(n<<2)>>2]=f*(J*t+K*u+L*v);g[S+(n<<1<<2)>>2]=f*(J*ma*pa+K*na*pa+L*oa*pa);f=h;h=-t;i=-u;j=-v;T=d+28|0;e=c[d+20>>2]|0}else{f=-N;h=-t;i=-u;j=-v;T=d+28|0;S=c[d+28>>2]|0}l=c[d+12>>2]|0;g[l+(n*3<<2)>>2]=N;g[l+((n*3|0)+1<<2)>>2]=p;g[l+((n*3|0)+2<<2)>>2]=M;g[l+(n<<2<<2)>>2]=t;g[l+((n<<2|1)<<2)>>2]=u;g[l+((n<<2|2)<<2)>>2]=v;g[e+(n*3<<2)>>2]=f;g[e+((n*3|0)+1<<2)>>2]=-p;g[e+((n*3|0)+2<<2)>>2]=-M;g[e+(n<<2<<2)>>2]=h;g[e+((n<<2|1)<<2)>>2]=i;g[e+((n<<2|2)<<2)>>2]=j;K=k*+g[d>>2];L=(_*ba+$*ca+aa*da)*(ka*U+la*V+O*W)-(_*ea+$*fa+aa*ga)*(ka*P+la*Q+O*R);ga=(_*ea+$*fa+aa*ga)*(ha*ka+ia*la+ja*O)-(X*_+Y*$+Z*aa)*(ka*U+la*V+O*W);la=(X*_+Y*$+Z*aa)*(ka*P+la*Q+O*R)-(_*ba+$*ca+aa*da)*(ha*ka+ia*la+ja*O);g[S+(n*3<<2)>>2]=K*(L*N+ga*p+la*M);g[S+(n<<2<<2)>>2]=K*(L*t+ga*u+la*v);if(!(a[b+716>>0]|0))if(!(a[b+737>>0]|0))return;else{p=0.0;r=0;q=0;n=1}else{la=+g[b+708>>2]*+g[b+732>>2];p=la;r=la>0.0?1:2;q=1;n=(a[b+737>>0]|0)!=0}s=(c[d+24>>2]|0)*5|0;g[l+(s<<2)>>2]=ma*pa;g[l+(s+1<<2)>>2]=na*pa;g[l+(s+2<<2)>>2]=oa*pa;g[e+(s<<2)>>2]=-(ma*pa);g[e+(s+1<<2)>>2]=-(na*pa);g[e+(s+2<<2)>>2]=-(oa*pa);h=+g[b+688>>2];i=+g[b+692>>2];f=+mh(h-i,6.2831854820251465);if(!(f<-3.1415927410125732))if(f>3.1415927410125732)o=f+-6.2831854820251465;else o=f;else o=f+6.2831854820251465;f=+mh(h+i,6.2831854820251465);if(!(f<-3.1415927410125732)){if(f>3.1415927410125732)f=f+-6.2831854820251465}else f=f+6.2831854820251465;m=o==f;e=S+(s<<2)|0;g[e>>2]=0.0;l=c[b+748>>2]|0;if(l&2)k=+g[b+764>>2];if(n&(q&m^1)){if(l&4|0)c[(c[d+32>>2]|0)+(s<<2)>>2]=c[b+752>>2];i=+g[b+728>>2];j=+g[b+680>>2];h=o>f?1.0:0.0;do if(!(o>=f)){h=j/(k*+g[d>>2]);if(h<0.0)if(i>=o&o-h>i){f=(o-i)/h;break}else{f=i0.0)if(i<=f&f-hf?0.0:1.0;break}else f=0.0}else f=h;while(0);g[e>>2]=f*j*+g[b+732>>2]+ +g[e>>2];g[(c[d+36>>2]|0)+(s<<2)>>2]=-+g[b+684>>2];c[(c[d+40>>2]|0)+(s<<2)>>2]=c[b+684>>2]}if(!q)return;g[e>>2]=+g[e>>2]+p*k*+g[d>>2];if(l&1|0)c[(c[d+32>>2]|0)+(s<<2)>>2]=c[b+760>>2];if(m){f=3402823466385288598117041.0e14;h=-3402823466385288598117041.0e14}else{S=(r|0)==1;f=S?3402823466385288598117041.0e14:0.0;h=S?0.0:-3402823466385288598117041.0e14}g[(c[d+36>>2]|0)+(s<<2)>>2]=h;g[(c[d+40>>2]|0)+(s<<2)>>2]=f;h=+g[b+704>>2];do if(h>0.0){f=+g[qa+388>>2]*ma*pa+ +g[qa+392>>2]*na*pa+ +g[qa+396>>2]*oa*pa-(ma*pa*+g[ra+388>>2]+na*pa*+g[ra+392>>2]+oa*pa*+g[ra+396>>2]);if((r|0)==1){if(!(f<0.0))break;e=(c[T>>2]|0)+(s<<2)|0;if(!(+g[e>>2]<-(h*f)))break;g[e>>2]=-(h*f);break}else{if(!(f>0.0))break;e=(c[T>>2]|0)+(s<<2)|0;if(!(+g[e>>2]>-(h*f)))break;g[e>>2]=-(h*f);break}}while(0);d=(c[T>>2]|0)+(s<<2)|0;g[d>>2]=+g[b+700>>2]*+g[d>>2];return}function Ac(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,k=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0.0,x=0,y=0,z=0,A=0,B=0,E=0,F=0,G=0,H=0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,Q=0.0,R=0.0,S=0,T=0,U=0,V=0,W=0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0,ca=0.0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0;ia=l;l=l+32|0;da=c[b+28>>2]|0;ea=c[b+32>>2]|0;$=+g[da+404>>2];_=+g[ea+404>>2];W=c[d+24>>2]|0;ca=a[b+180>>0]|0?1.0:-1.0;X=+g[b+936>>2]-+g[b+872>>2];Y=+g[b+940>>2]-+g[b+876>>2];Z=+g[b+944>>2]-+g[b+880>>2];aa=$+_>0.0?_/($+_):.5;A=c[b+824>>2]|0;B=c[b+840>>2]|0;E=c[b+856>>2]|0;F=c[b+888>>2]|0;G=c[b+904>>2]|0;H=c[b+920>>2]|0;S=(a[b+49>>0]|0)==0;do if(!S){f=aa*(c[j>>2]=A,+g[j>>2]);k=aa*(c[j>>2]=B,+g[j>>2]);i=aa*(c[j>>2]=E,+g[j>>2]);h=(1.0-aa)*(c[j>>2]=F,+g[j>>2]);n=(1.0-aa)*(c[j>>2]=G,+g[j>>2]);i=i+(1.0-aa)*(c[j>>2]=H,+g[j>>2]);o=1.0/+D(+((f+h)*(f+h)+(k+n)*(k+n)+i*i));e=(g[j>>2]=(f+h)*o,c[j>>2]|0);m=(g[j>>2]=(k+n)*o,c[j>>2]|0);v=(g[j>>2]=i*o,c[j>>2]|0);if(+C(+(i*o))>.7071067690849304){R=1.0/+D(+(i*o*i*o+(k+n)*o*(k+n)*o));c[ia+24>>2]=0;g[ia+20>>2]=-(i*o*R);g[ia+16>>2]=(k+n)*o*R;g[ia>>2]=(i*o*i*o+(k+n)*o*(k+n)*o)*R;g[ia+4>>2]=-((f+h)*o*(k+n)*o*R);U=ia;V=ia+4|0;f=(f+h)*o*-(i*o*R);q=2;fa=e;ga=m;ha=v;e=0;h=0.0;break}else{Q=(f+h)*o*(f+h)*o+(k+n)*o*(k+n)*o;R=1.0/+D(+Q);T=(g[j>>2]=-((k+n)*o*R),c[j>>2]|0);g[ia+24>>2]=-((k+n)*o*R);g[ia+20>>2]=(f+h)*o*R;c[ia+16>>2]=0;g[ia>>2]=-(i*o*(f+h)*o*R);g[ia+4>>2]=i*o*-((k+n)*o*R);U=ia;V=ia+4|0;f=Q*R;q=2;fa=e;ga=m;ha=v;e=T;h=-((k+n)*o*R);break}}else{T=c[b+828>>2]|0;U=c[b+844>>2]|0;V=c[b+860>>2]|0;c[ia+24>>2]=T;c[ia+20>>2]=U;c[ia+16>>2]=V;V=c[b+848>>2]|0;U=c[b+864>>2]|0;c[ia>>2]=c[b+832>>2];c[ia+4>>2]=V;c[ia+8>>2]=U;U=ia;V=ia+4|0;f=0.0;q=3;fa=A;ga=B;ha=E;e=T;h=(c[j>>2]=T,+g[j>>2])}while(0);g[ia+(q<<2)>>2]=f;T=c[d+12>>2]|0;c[T>>2]=e;m=c[ia+20>>2]|0;c[T+4>>2]=m;q=c[ia+16>>2]|0;c[T+8>>2]=q;v=c[ia>>2]|0;c[T+(W<<2)>>2]=v;x=c[V>>2]|0;c[T+(W+1<<2)>>2]=x;y=c[ia+8>>2]|0;c[T+(W+2<<2)>>2]=y;z=c[d+20>>2]|0;g[z>>2]=-h;s=(c[j>>2]=m,+g[j>>2]);g[z+4>>2]=-s;w=(c[j>>2]=q,+g[j>>2]);g[z+8>>2]=-w;t=(c[j>>2]=v,+g[j>>2]);g[z+(W<<2)>>2]=-t;p=(c[j>>2]=x,+g[j>>2]);g[z+(W+1<<2)>>2]=-p;u=(c[j>>2]=y,+g[j>>2]);g[z+(W+2<<2)>>2]=-u;e=c[b+300>>2]|0;f=+g[b+280>>2];if(!(e&128))f=f*+g[d+4>>2];K=f*+g[d>>2];Q=(c[j>>2]=B,+g[j>>2]);M=(c[j>>2]=H,+g[j>>2]);L=(c[j>>2]=E,+g[j>>2]);O=(c[j>>2]=G,+g[j>>2]);R=(c[j>>2]=F,+g[j>>2]);N=(c[j>>2]=A,+g[j>>2]);H=c[d+28>>2]|0;g[H>>2]=K*((Q*M-L*O)*h+(L*R-N*M)*s+(N*O-Q*R)*w);g[H+(W<<2)>>2]=K*((Q*M-L*O)*t+(L*R-N*M)*p+(N*O-Q*R)*u);if(e&64|0){H=c[d+32>>2]|0;c[H>>2]=c[b+292>>2];c[H+(W<<2)>>2]=c[b+292>>2]}R=+g[da+52>>2];L=+g[da+56>>2];O=+g[da+60>>2];J=+g[ea+52>>2];f=+g[ea+56>>2];i=+g[ea+60>>2];if(S){N=(i-O)*h-(J-R)*w;r=(J-R)*s-(f-L)*h;g[T+(W<<1<<2)>>2]=aa*((f-L)*w-(i-O)*s);g[T+((W<<1|1)<<2)>>2]=aa*N;g[T+((W<<1)+2<<2)>>2]=aa*r;g[z+(W<<1<<2)>>2]=(1.0-aa)*((f-L)*w-(i-O)*s);g[z+((W<<1|1)<<2)>>2]=(1.0-aa)*N;g[z+((W<<1)+2<<2)>>2]=(1.0-aa)*r;g[T+(W*3<<2)>>2]=aa*((f-L)*u-(i-O)*p);g[T+((W*3|0)+1<<2)>>2]=aa*((i-O)*t-(J-R)*u);g[T+((W*3|0)+2<<2)>>2]=aa*((J-R)*p-(f-L)*t);g[z+(W*3<<2)>>2]=(1.0-aa)*((f-L)*u-(i-O)*p);g[z+((W*3|0)+1<<2)>>2]=(1.0-aa)*((i-O)*t-(J-R)*u);g[z+((W*3|0)+2<<2)>>2]=(1.0-aa)*((J-R)*p-(f-L)*t);e=c[d+8>>2]|0;V=c[ia+24>>2]|0;c[e+(W<<1<<2)>>2]=V;c[e+((W<<1|1)<<2)>>2]=m;c[e+((W<<1)+2<<2)>>2]=q;c[e+(W*3<<2)>>2]=v;c[e+((W*3|0)+1<<2)>>2]=x;c[e+((W*3|0)+2<<2)>>2]=y;q=c[d+16>>2]|0;r=(c[j>>2]=V,+g[j>>2]);g[q+(W<<1<<2)>>2]=-r;g[q+((W<<1|1)<<2)>>2]=-s;g[q+((W<<1)+2<<2)>>2]=-w;g[q+(W*3<<2)>>2]=-t;g[q+((W*3|0)+1<<2)>>2]=-p;N=-u;m=q+((W*3|0)+2<<2)|0;Q=0.0;M=0.0;K=0.0;I=0.0;o=0.0;n=0.0;k=f-L;i=i-O;h=J-R}else{u=+g[b+936>>2]-J;w=+g[b+940>>2]-f;M=+g[b+944>>2]-i;n=(c[j>>2]=fa,+g[j>>2]);k=(c[j>>2]=ga,+g[j>>2]);o=(c[j>>2]=ha,+g[j>>2]);N=+g[b+872>>2]-R;Q=+g[b+876>>2]-L;i=+g[b+880>>2]-O;O=+g[b+1080>>2]-+g[b+1032>>2];R=n*(n*N+k*Q+o*i)+n*O-n*(n*u+k*w+o*M);I=k*(n*N+k*Q+o*i)+k*O-k*(n*u+k*w+o*M);O=o*(n*N+k*Q+o*i)+o*O-o*(n*u+k*w+o*M);K=N-n*(n*N+k*Q+o*i)+aa*R;J=Q-k*(n*N+k*Q+o*i)+aa*I;L=i-o*(n*N+k*Q+o*i)+aa*O;R=u-n*(n*u+k*w+o*M)-(1.0-aa)*R;I=w-k*(n*u+k*w+o*M)-(1.0-aa)*I;O=M-o*(n*u+k*w+o*M)-(1.0-aa)*O;h=aa*(u-n*(n*u+k*w+o*M))+(1.0-aa)*(N-n*(n*N+k*Q+o*i));f=aa*(w-k*(n*u+k*w+o*M))+(1.0-aa)*(Q-k*(n*N+k*Q+o*i));i=aa*(M-o*(n*u+k*w+o*M))+(1.0-aa)*(i-o*(n*N+k*Q+o*i));g[ia+24>>2]=h;g[ia+20>>2]=f;g[ia+16>>2]=i;if(i*i+(h*h+f*f)>1.1920928955078125e-07){Q=1.0/+D(+(i*i+(h*h+f*f)));g[ia+24>>2]=h*Q;g[ia+20>>2]=Q*f;g[ia+16>>2]=Q*i;m=(g[j>>2]=h*Q,c[j>>2]|0);q=(g[j>>2]=Q*f,c[j>>2]|0);w=Q*i;s=Q*f;r=h*Q;e=(g[j>>2]=Q*i,c[j>>2]|0)}else{m=c[b+828>>2]|0;q=c[b+844>>2]|0;e=c[b+860>>2]|0;c[ia+24>>2]=m;c[ia+20>>2]=q;c[ia+16>>2]=e;w=(c[j>>2]=e,+g[j>>2]);s=(c[j>>2]=q,+g[j>>2]);r=(c[j>>2]=m,+g[j>>2])}t=k*w-o*s;u=n*s-k*r;g[U>>2]=t;g[V>>2]=o*r-n*w;g[ia+8>>2]=u;g[ia+12>>2]=0.0;g[T+(W<<1<<2)>>2]=J*w-L*s;g[T+(W<<1<<2)+4>>2]=L*r-K*w;g[T+(W<<1<<2)+8>>2]=K*s-J*r;U=c[d+20>>2]|0;g[U+(W<<1<<2)>>2]=-(I*w-O*s);g[U+((W<<1|1)<<2)>>2]=-(O*r-R*w);g[U+((W<<1)+2<<2)>>2]=-(R*s-I*r);p=+g[V>>2];if($<1.1920928955078125e-07|_<1.1920928955078125e-07?(a[b+297>>0]|0)!=0:0){f=aa*(J*u-L*p);h=aa*(K*p-J*t);i=aa*(L*t-K*u);k=(1.0-aa)*(I*u-O*p);n=(1.0-aa)*(O*t-R*u);o=(1.0-aa)*(R*p-I*t)}else{f=J*u-L*p;h=K*p-J*t;i=L*t-K*u;k=I*u-O*p;n=O*t-R*u;o=R*p-I*t}V=(c[d+12>>2]|0)+(W*3<<2)|0;g[V>>2]=f;g[V+4>>2]=i;g[V+8>>2]=h;V=c[d+20>>2]|0;g[V+(W*3<<2)>>2]=-k;g[V+((W*3|0)+1<<2)>>2]=-n;g[V+((W*3|0)+2<<2)>>2]=-o;V=c[d+8>>2]|0;c[V+(W<<1<<2)>>2]=m;c[V+((W<<1|1)<<2)>>2]=q;c[V+((W<<1)+2<<2)>>2]=e;g[V+(W*3<<2)>>2]=t;g[V+((W*3|0)+1<<2)>>2]=p;g[V+((W*3|0)+2<<2)>>2]=u;q=c[d+16>>2]|0;g[q+(W<<1<<2)>>2]=-r;g[q+((W<<1|1)<<2)>>2]=-s;g[q+((W<<1)+2<<2)>>2]=-w;g[q+(W*3<<2)>>2]=-t;g[q+((W*3|0)+1<<2)>>2]=-p;N=-u;m=q+((W*3|0)+2<<2)|0;e=V;Q=J;M=L;o=O;n=R;k=0.0;i=0.0;h=0.0}g[m>>2]=N;A=c[b+300>>2]|0;f=+g[b+264>>2];if(!(A&32))f=f*+g[d+4>>2];R=f*+g[d>>2];B=c[d+28>>2]|0;g[B+(W<<1<<2)>>2]=R*(X*r+Y*s+Z*w);g[B+(W*3<<2)>>2]=R*(X*t+Y*p+Z*u);if(A&16|0){V=c[d+32>>2]|0;c[V+(W<<1<<2)>>2]=c[b+276>>2];c[V+(W*3<<2)>>2]=c[b+276>>2]}if(!(a[b+296>>0]|0))if(!(a[b+1096>>0]|0))e=4;else{p=0.0;y=0;x=0;v=1;ba=26}else{Z=ca*+g[b+1032>>2];p=Z;y=Z>0.0?2:1;x=1;v=(a[b+1096>>0]|0)!=0;ba=26}if((ba|0)==26){z=c[d+24>>2]<<2;c[e+(z<<2)>>2]=fa;c[e+((z|1)<<2)>>2]=ga;c[e+((z|2)<<2)>>2]=ha;r=(c[j>>2]=fa,+g[j>>2]);g[q+(z<<2)>>2]=-r;s=(c[j>>2]=ga,+g[j>>2]);g[q+((z|1)<<2)>>2]=-s;t=(c[j>>2]=ha,+g[j>>2]);g[q+((z|2)<<2)>>2]=-t;if(a[b+49>>0]|0){if(!($<1.1920928955078125e-07|_<1.1920928955078125e-07)){e=c[d+12>>2]|0;g[e+(z<<2)>>2]=t*Q-s*M;g[e+((z|1)<<2)>>2]=r*M-t*K;g[e+((z|2)<<2)>>2]=s*K-r*Q;e=c[d+20>>2]|0;g[e+(z<<2)>>2]=-(t*I-s*o);g[e+((z|1)<<2)>>2]=-(r*o-t*n);f=-(s*n-r*I);ba=30}}else{_=t*k-s*i;$=r*i-t*h;f=s*h-r*k;e=c[d+12>>2]|0;g[e+(z<<2)>>2]=aa*_;g[e+((z|1)<<2)>>2]=aa*$;g[e+((z|2)<<2)>>2]=aa*f;e=c[d+20>>2]|0;g[e+(z<<2)>>2]=(1.0-aa)*_;g[e+((z|1)<<2)>>2]=(1.0-aa)*$;f=(1.0-aa)*f;ba=30}if((ba|0)==30)g[e+((z|2)<<2)>>2]=f;e=+g[b+184>>2]==+g[b+188>>2];g[B+(z<<2)>>2]=0.0;m=(c[d+36>>2]|0)+(z<<2)|0;g[m>>2]=0.0;q=(c[d+40>>2]|0)+(z<<2)|0;g[q>>2]=0.0;o=+g[(A&512|0?b+232|0:d+4|0)>>2];if(v&(x&e^1)){if(A&1|0)c[(c[d+32>>2]|0)+(z<<2)>>2]=c[b+212>>2];n=+g[b+1100>>2];f=+g[b+1080>>2];h=+g[b+184>>2];i=+g[b+188>>2];k=o*+g[d>>2];do if(!(h>i))if(!(h==i)){if(n/k<0.0)if(f>=h?h-n/k>f:0){f=(h-f)/(n/k);break}else{f=f0.0)if(f<=i?i-n/ki?0.0:1.0;break}else f=0.0}else f=0.0;else f=1.0;while(0);g[B+(z<<2)>>2]=+g[B+(z<<2)>>2]-ca*f*n;g[m>>2]=-+g[b+1104>>2]/+g[d>>2]+ +g[m>>2];g[q>>2]=+g[b+1104>>2]/+g[d>>2]+ +g[q>>2]}if(x){g[B+(z<<2)>>2]=+g[B+(z<<2)>>2]+p*o*+g[d>>2];if(A&256|0)c[(c[d+32>>2]|0)+(z<<2)>>2]=c[b+244>>2];if(e){f=-3402823466385288598117041.0e14;h=3402823466385288598117041.0e14}else{ba=(y|0)==1;f=ba?-3402823466385288598117041.0e14:0.0;h=ba?0.0:3402823466385288598117041.0e14}g[m>>2]=f;g[q>>2]=h;aa=1.0-+g[b+240>>2];h=+C(+aa);do if(!(aa!=aa|0.0!=0.0|aa==0.0)){f=ca*(r*+g[da+372>>2]+s*+g[da+376>>2]+t*+g[da+380>>2]-(r*+g[ea+372>>2]+s*+g[ea+376>>2]+t*+g[ea+380>>2]));if((y|0)==1){if(!(f<0.0))break;if(!(+g[B+(z<<2)>>2]<-(h*f)))break;g[B+(z<<2)>>2]=-(h*f);break}else{if(!(f>0.0))break;if(!(+g[B+(z<<2)>>2]>-(h*f)))break;g[B+(z<<2)>>2]=-(h*f);break}}while(0);g[B+(z<<2)>>2]=+g[b+232>>2]*+g[B+(z<<2)>>2];e=5}else e=5}if(!(a[b+297>>0]|0))if(!(a[b+1112>>0]|0)){l=ia;return}else{t=0.0;x=0;v=0;m=1}else{ca=+g[b+1088>>2];t=ca;x=ca>0.0?1:2;v=1;m=(a[b+1112>>0]|0)!=0}y=P(c[d+24>>2]|0,e)|0;q=c[d+12>>2]|0;c[q+(y<<2)>>2]=fa;c[q+(y+1<<2)>>2]=ga;c[q+(y+2<<2)>>2]=ha;w=(c[j>>2]=fa,+g[j>>2]);q=c[d+20>>2]|0;g[q+(y<<2)>>2]=-w;u=(c[j>>2]=ga,+g[j>>2]);g[q+(y+1<<2)>>2]=-u;s=(c[j>>2]=ha,+g[j>>2]);g[q+(y+2<<2)>>2]=-s;o=+g[b+192>>2];p=+g[b+196>>2];q=c[b+300>>2]|0;r=+g[(q&2048|0?b+248|0:d+4|0)>>2];if(m&(v&o==p^1)){if(!(q&4)){i=o;k=p}else{c[(c[d+32>>2]|0)+(y<<2)>>2]=c[b+228>>2];i=+g[b+192>>2];k=+g[b+196>>2]}f=+g[b+1084>>2];n=+g[b+1116>>2];h=r*+g[d>>2];do if(!(i>k))if(!(i==k)){if(n/h<0.0)if(f>=i?i-n/h>f:0){f=(i-f)/(n/h);break}else{f=f0.0)if(f<=k?k-n/hk?0.0:1.0;break}else f=0.0}else f=0.0;else f=1.0;while(0);e=c[d+28>>2]|0;g[e+(y<<2)>>2]=f*n;g[(c[d+36>>2]|0)+(y<<2)>>2]=-+g[b+1120>>2]/+g[d>>2];g[(c[d+40>>2]|0)+(y<<2)>>2]=+g[b+1120>>2]/+g[d>>2]}else e=B;if(!v){l=ia;return}ha=e+(y<<2)|0;g[ha>>2]=+g[ha>>2]+t*r*+g[d>>2];if(q&1024|0)c[(c[d+32>>2]|0)+(y<<2)>>2]=c[b+260>>2];if(o==p){f=-3402823466385288598117041.0e14;h=3402823466385288598117041.0e14}else{ha=(x|0)==1;f=ha?0.0:-3402823466385288598117041.0e14;h=ha?3402823466385288598117041.0e14:0.0}g[(c[d+36>>2]|0)+(y<<2)>>2]=f;g[(c[d+40>>2]|0)+(y<<2)>>2]=h;ca=1.0-+g[b+256>>2];h=+C(+ca);do if(!(ca!=ca|0.0!=0.0|ca==0.0)){ga=c[b+28>>2]|0;ha=c[b+32>>2]|0;f=w*+g[ga+388>>2]+u*+g[ga+392>>2]+s*+g[ga+396>>2]-(w*+g[ha+388>>2]+u*+g[ha+392>>2]+s*+g[ha+396>>2]);if((x|0)==1){if(!(f<0.0))break;e=(c[d+28>>2]|0)+(y<<2)|0;if(!(+g[e>>2]<-(h*f)))break;g[e>>2]=-(h*f);break}else{if(!(f>0.0))break;e=(c[d+28>>2]|0)+(y<<2)|0;if(!(+g[e>>2]>-(h*f)))break;g[e>>2]=-(h*f);break}}while(0);d=(c[d+28>>2]|0)+(y<<2)|0;g[d>>2]=+g[b+248>>2]*+g[d>>2];l=ia;return}function Bc(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,m=0.0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0,z=0,A=0.0,B=0;B=l;l=l+112|0;c[b>>2]=5320;c[b+132>>2]=0;c[b+132+4>>2]=0;c[b+132+8>>2]=0;c[b+132+12>>2]=0;c[b+132+16>>2]=0;c[b+132+20>>2]=0;c[b+132+24>>2]=0;c[b+132+28>>2]=0;c[b+164>>2]=1065353216;c[b+168>>2]=1065353216;c[b+172>>2]=1065353216;g[b+176>>2]=0.0;c[b+180>>2]=0;g[b+184>>2]=999999984306749440.0;c[b+188>>2]=0;c[b+188+4>>2]=0;c[b+188+8>>2]=0;c[b+188+12>>2]=0;c[b+204>>2]=1;c[b+208>>2]=-1;c[b+212>>2]=-1;c[b+216>>2]=-1;c[b+220>>2]=1;g[b+224>>2]=0.0;g[b+228>>2]=.5;g[b+232>>2]=0.0;g[b+236>>2]=0.0;g[b+240>>2]=0.0;g[b+244>>2]=.10000000149011612;g[b+248>>2]=1.0e4;c[b+252>>2]=1;c[b+256>>2]=0;c[b+260>>2]=-1;c[b+264>>2]=-1;g[b+268>>2]=1.0;g[b+272>>2]=0.0;g[b+276>>2]=0.0;c[b+280>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;c[b+304>>2]=0;c[b+4>>2]=1065353216;c[b+8>>2]=0;c[b+8+4>>2]=0;c[b+8+8>>2]=0;c[b+8+12>>2]=0;c[b+24>>2]=1065353216;c[b+28>>2]=0;c[b+28+4>>2]=0;c[b+28+8>>2]=0;c[b+28+12>>2]=0;c[b+44>>2]=1065353216;c[b+48>>2]=0;c[b+48+4>>2]=0;c[b+48+8>>2]=0;c[b+48+12>>2]=0;c[b+48+16>>2]=0;c[b+68>>2]=1065353216;c[b+72>>2]=0;c[b+72+4>>2]=0;c[b+72+8>>2]=0;c[b+72+12>>2]=0;c[b+88>>2]=1065353216;c[b+92>>2]=0;c[b+92+4>>2]=0;c[b+92+8>>2]=0;c[b+92+12>>2]=0;c[b+108>>2]=1065353216;c[b+112>>2]=0;c[b+112+4>>2]=0;c[b+112+8>>2]=0;c[b+112+12>>2]=0;c[b+112+16>>2]=0;c[b>>2]=3356;a[b+340>>0]=1;c[b+336>>2]=0;c[b+328>>2]=0;c[b+332>>2]=0;c[b+344>>2]=0;a[b+468>>0]=1;c[b+464>>2]=0;c[b+456>>2]=0;c[b+460>>2]=0;a[b+488>>0]=1;c[b+484>>2]=0;c[b+476>>2]=0;c[b+480>>2]=0;a[b+508>>0]=1;c[b+504>>2]=0;c[b+496>>2]=0;c[b+500>>2]=0;a[b+556>>0]=1;c[b+552>>2]=0;c[b+544>>2]=0;c[b+548>>2]=0;a[b+576>>0]=1;c[b+572>>2]=0;c[b+564>>2]=0;c[b+568>>2]=0;c[b+744>>2]=d;a[b+764>>0]=1;c[b+760>>2]=0;c[b+752>>2]=0;c[b+756>>2]=0;a[b+784>>0]=1;c[b+780>>2]=0;c[b+772>>2]=0;c[b+776>>2]=0;a[b+804>>0]=1;c[b+800>>2]=0;c[b+792>>2]=0;c[b+796>>2]=0;a[b+824>>0]=1;c[b+820>>2]=0;c[b+812>>2]=0;c[b+816>>2]=0;a[b+844>>0]=1;c[b+840>>2]=0;c[b+832>>2]=0;c[b+836>>2]=0;a[b+864>>0]=1;c[b+860>>2]=0;c[b+852>>2]=0;c[b+856>>2]=0;a[b+884>>0]=1;c[b+880>>2]=0;c[b+872>>2]=0;c[b+876>>2]=0;a[b+904>>0]=1;c[b+900>>2]=0;c[b+892>>2]=0;c[b+896>>2]=0;a[b+924>>0]=1;c[b+920>>2]=0;c[b+912>>2]=0;c[b+916>>2]=0;a[b+944>>0]=1;c[b+940>>2]=0;c[b+932>>2]=0;c[b+936>>2]=0;a[b+1024>>0]=1;c[b+1020>>2]=0;c[b+1012>>2]=0;c[b+1016>>2]=0;c[b+988>>2]=0;c[b+992>>2]=0;c[b+996>>2]=-1;c[b+1e3>>2]=0;c[b+1004>>2]=0;a[b+1064>>0]=1;c[b+1060>>2]=0;c[b+1052>>2]=0;c[b+1056>>2]=0;c[b+1028>>2]=0;c[b+1032>>2]=0;c[b+1036>>2]=-1;c[b+1040>>2]=0;c[b+1044>>2]=0;a[b+1104>>0]=1;c[b+1100>>2]=0;c[b+1092>>2]=0;c[b+1096>>2]=0;c[b+1068>>2]=0;c[b+1072>>2]=0;c[b+1076>>2]=-1;c[b+1080>>2]=0;c[b+1084>>2]=0;a[b+1124>>0]=1;c[b+1120>>2]=0;c[b+1112>>2]=0;c[b+1116>>2]=0;a[b+1144>>0]=1;c[b+1140>>2]=0;c[b+1132>>2]=0;c[b+1136>>2]=0;a[b+1248>>0]=1;c[b+1244>>2]=0;c[b+1236>>2]=0;c[b+1240>>2]=0;c[b+252>>2]=8;c[b+348>>2]=0;g[b+352>>2]=1.0;c[b+356>>2]=0;c[b+356+4>>2]=0;c[b+356+8>>2]=0;c[b+356+12>>2]=0;c[b+356+16>>2]=0;g[b+376>>2]=.20000000298023224;g[b+380>>2]=0.0;g[b+384>>2]=1.0;g[b+388>>2]=.10000000149011612;g[b+392>>2]=1.0;g[b+396>>2]=.699999988079071;g[b+400>>2]=.10000000149011612;g[b+404>>2]=1.0;g[b+408>>2]=.5;g[b+412>>2]=.5;g[b+416>>2]=.5;g[b+420>>2]=.5;g[b+424>>2]=1.0;g[b+428>>2]=1.0;c[b+432>>2]=0;c[b+436>>2]=1;c[b+440>>2]=0;c[b+444>>2]=4;c[b+448>>2]=1;a[b+532>>0]=0;a[b+533>>0]=0;g[b+536>>2]=0.0;c[b+580>>2]=0;c[b+580+4>>2]=0;c[b+580+8>>2]=0;c[b+580+12>>2]=0;c[b+596>>2]=1065353216;c[b+600>>2]=0;c[b+600+4>>2]=0;c[b+600+8>>2]=0;c[b+600+12>>2]=0;c[b+616>>2]=1065353216;c[b+620>>2]=0;c[b+620+4>>2]=0;c[b+620+8>>2]=0;c[b+620+12>>2]=0;c[b+636>>2]=1065353216;g[b+640>>2]=0.0;c[b+644>>2]=1065353216;c[b+648>>2]=0;c[b+648+4>>2]=0;c[b+648+8>>2]=0;c[b+648+12>>2]=0;c[b+664>>2]=1065353216;c[b+668>>2]=0;c[b+668+4>>2]=0;c[b+668+8>>2]=0;c[b+668+12>>2]=0;c[b+684>>2]=1065353216;g[b+688>>2]=0.0;c[b+740>>2]=0;g[b+948>>2]=0.0;a[b+984>>0]=1;c[b+952>>2]=0;c[b+952+4>>2]=0;c[b+952+8>>2]=0;c[b+952+12>>2]=0;c[b+952+16>>2]=0;c[b+952+20>>2]=0;c[b+952+24>>2]=0;c[b+952+28>>2]=0;c[b+4>>2]=1065353216;c[b+8>>2]=0;c[b+8+4>>2]=0;c[b+8+8>>2]=0;c[b+8+12>>2]=0;c[b+24>>2]=1065353216;c[b+28>>2]=0;c[b+28+4>>2]=0;c[b+28+8>>2]=0;c[b+28+12>>2]=0;c[b+44>>2]=1065353216;c[b+48>>2]=0;c[b+48+4>>2]=0;c[b+48+8>>2]=0;c[b+48+12>>2]=0;c[b+48+16>>2]=0;d=c[b+464>>2]|0;if(d|0){if(a[b+468>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+464>>2]=0}a[b+468>>0]=1;c[b+464>>2]=0;c[b+456>>2]=0;c[b+460>>2]=0;d=c[b+484>>2]|0;if(d|0){if(a[b+488>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+484>>2]=0}a[b+488>>0]=1;c[b+484>>2]=0;c[b+476>>2]=0;c[b+480>>2]=0;d=c[b+504>>2]|0;do if(d)if(a[b+508>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);d=c[b+476>>2]|0;i=c[b+480>>2]|0;c[b+504>>2]=0;a[b+508>>0]=1;c[b+504>>2]=0;c[b+496>>2]=0;c[b+500>>2]=0;if((d|0)==(i|0)){w=14;break}else break}else{c[b+504>>2]=0;w=13;break}else w=13;while(0);if((w|0)==13){a[b+508>>0]=1;c[b+504>>2]=0;c[b+496>>2]=0;c[b+500>>2]=0;i=0;w=14}if((w|0)==14){n=i|0?i<<1:1;if((i|0)<(n|0)){if(!n)d=0;else{c[6995]=(c[6995]|0)+1;d=sc((n<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}i=c[b+476>>2]|0}k=c[b+484>>2]|0;if((i|0)<=0){if(k)w=22}else{j=0;do{c[d+(j<<2)>>2]=c[k+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0));w=22}if((w|0)==22){if(a[b+488>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);i=c[b+476>>2]|0}c[b+484>>2]=0}a[b+488>>0]=1;c[b+484>>2]=d;c[b+480>>2]=n;d=i;i=n}else d=i}k=c[b+484>>2]|0;c[k+(d<<2)>>2]=1;d=d+1|0;c[b+476>>2]=d;if((d|0)==(i|0)){n=i|0?i<<1:1;if((i|0)<(n|0)){if(!n)d=0;else{c[6995]=(c[6995]|0)+1;d=sc((n<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}i=c[b+476>>2]|0;k=c[b+484>>2]|0}if((i|0)<=0){if(k)w=35}else{j=0;do{c[d+(j<<2)>>2]=c[k+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0));w=35}if((w|0)==35){if(a[b+488>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);i=c[b+476>>2]|0}c[b+484>>2]=0}a[b+488>>0]=1;c[b+484>>2]=d;c[b+480>>2]=n;o=d;j=i;i=n}else{o=k;j=i;d=k}}else{o=k;j=d;d=k}c[o+(j<<2)>>2]=2;j=j+1|0;c[b+476>>2]=j;if((j|0)==(i|0)){n=i|0?i<<1:1;if((i|0)<(n|0)){if(!n){d=0;k=o}else{c[6995]=(c[6995]|0)+1;d=sc((n<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}i=c[b+476>>2]|0;k=c[b+484>>2]|0}if((i|0)<=0){if(k)w=48}else{j=0;do{c[d+(j<<2)>>2]=c[k+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0));w=48}if((w|0)==48){if(a[b+488>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);i=c[b+476>>2]|0}c[b+484>>2]=0}a[b+488>>0]=1;c[b+484>>2]=d;c[b+480>>2]=n;k=d;j=i;i=n}else{k=o;j=i}}else k=o;c[k+(j<<2)>>2]=3;j=j+1|0;c[b+476>>2]=j;if((j|0)==(i|0)){n=i|0?i<<1:1;if((i|0)<(n|0)){if(!n)d=0;else{c[6995]=(c[6995]|0)+1;d=sc((n<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}i=c[b+476>>2]|0;k=c[b+484>>2]|0}if((i|0)<=0){if(k)w=61}else{j=0;do{c[d+(j<<2)>>2]=c[k+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0));w=61}if((w|0)==61){if(a[b+488>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);i=c[b+476>>2]|0}c[b+484>>2]=0}a[b+488>>0]=1;c[b+484>>2]=d;c[b+480>>2]=n}}else i=j;c[d+(i<<2)>>2]=0;c[b+476>>2]=i+1;c[6995]=(c[6995]|0)+1;d=sc(43)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}c[d+8>>2]=0;c[d+12>>2]=-1;c[d>>2]=3496;c[d+4>>2]=32;c[d+20>>2]=b;c[b+192>>2]=d;g[d+16>>2]=.25;c[b+1148>>2]=1065353216;c[b+1152>>2]=0;c[b+1152+4>>2]=0;c[b+1152+8>>2]=0;c[b+1152+12>>2]=0;c[b+1168>>2]=1065353216;c[b+1172>>2]=0;c[b+1172+4>>2]=0;c[b+1172+8>>2]=0;c[b+1172+12>>2]=0;c[b+1188>>2]=1065353216;x=b+1192|0;y=x+36|0;do{c[x>>2]=0;x=x+4|0}while((x|0)<(y|0));g[b+1228>>2]=1.0;z=hh(b)|0;g[z+4>>2]=1.0;g[z+8>>2]=1.0;g[z+12>>2]=1.0;c[z+16>>2]=1;x=c[b+192>>2]|0;A=+nb[c[(c[x>>2]|0)+48>>2]&15](x);x=B;y=x+100|0;do{c[x>>2]=0;x=x+4|0}while((x|0)<(y|0));n=c[b+772>>2]|0;if((n|0)<(e|0)){if((c[b+776>>2]|0)<(e|0)){if(!e){d=0;j=n}else{c[6995]=(c[6995]|0)+1;d=sc((e*104|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}j=c[b+772>>2]|0}if((j|0)>0){i=0;do{x=d+(i*104|0)|0;k=(c[b+780>>2]|0)+(i*104|0)|0;y=x+104|0;do{c[x>>2]=c[k>>2];x=x+4|0;k=k+4|0}while((x|0)<(y|0));i=i+1|0}while((i|0)!=(j|0))}i=c[b+780>>2]|0;if(i|0){if(a[b+784>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[b+780>>2]=0}a[b+784>>0]=1;c[b+780>>2]=d;c[b+776>>2]=e;d=n}else d=n;do{x=c[b+780>>2]|0;c[x+(d*104|0)>>2]=0;x=x+(d*104|0)+4|0;k=B;y=x+100|0;do{c[x>>2]=c[k>>2];x=x+4|0;k=k+4|0}while((x|0)<(y|0));d=d+1|0}while((d|0)!=(e|0))}c[b+772>>2]=e;if((e|0)>0){d=f;i=h;k=0;while(1){o=c[b+780>>2]|0;w=o+(k*104|0)|0;x=w;y=x+104|0;do{c[x>>2]=0;x=x+4|0}while((x|0)<(y|0));if(!d){n=0;m=0.0;p=0.0;q=0.0;r=0.0}else{n=d+16|0;m=+g[d+12>>2];p=+g[d>>2];q=+g[d+4>>2];r=+g[d+8>>2]}f=o+(k*104|0)+8|0;g[f>>2]=p;g[o+(k*104|0)+12>>2]=q;g[o+(k*104|0)+16>>2]=r;g[o+(k*104|0)+20>>2]=m;h=o+(k*104|0)+24|0;c[h>>2]=c[f>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];c[h+12>>2]=c[f+12>>2];if(!i){j=0;m=1.0}else{j=i+4|0;m=+g[i>>2]}g[o+(k*104|0)+88>>2]=m>0.0?1.0/m:0.0;t=p-A;u=q-A;v=r-A;s=A+p;p=A+q;m=A+r;d=c[b+992>>2]|0;if(!d){c[6995]=(c[6995]|0)+1;d=sc(63)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}x=d;y=x+44|0;do{c[x>>2]=0;x=x+4|0}while((x|0)<(y|0))}else c[b+992>>2]=0;c[d+32>>2]=0;c[d+36>>2]=w;c[d+40>>2]=0;g[d>>2]=t;g[d+4>>2]=u;g[d+8>>2]=v;g[d+12>>2]=0.0;g[d+16>>2]=s;g[d+20>>2]=p;g[d+24>>2]=m;g[d+28>>2]=0.0;Pe(b+988|0,c[b+988>>2]|0,d);c[b+1e3>>2]=(c[b+1e3>>2]|0)+1;c[o+(k*104|0)+96>>2]=d;c[o+(k*104|0)+4>>2]=z;k=k+1|0;if((k|0)==(e|0))break;else{d=n;i=j}}}d=c[b+988>>2]|0;if(!d){c[b+952>>2]=0;c[b+952+4>>2]=0;c[b+952+8>>2]=0;c[b+952+12>>2]=0;c[b+952+16>>2]=0;c[b+952+20>>2]=0;c[b+952+24>>2]=0;c[b+952+28>>2]=0;l=B;return}e=c[b+192>>2]|0;u=+nb[c[(c[e>>2]|0)+48>>2]&15](e);A=+g[d+4>>2]-u;v=+g[d+8>>2]-u;g[b+952>>2]=+g[d>>2]-u;g[b+956>>2]=A;g[b+960>>2]=v;g[b+964>>2]=0.0;v=u+ +g[d+20>>2];A=u+ +g[d+24>>2];g[b+968>>2]=u+ +g[d+16>>2];g[b+972>>2]=v;g[b+976>>2]=A;g[b+980>>2]=0.0;d=c[b+188>>2]|0;if(!d){l=B;return}e=c[b+744>>2]|0;h=c[e+32>>2]|0;Zb[c[(c[h>>2]|0)+16>>2]&31](h,d,b+952|0,b+968|0,c[e+36>>2]|0);l=B;return}function Cc(d,f,h){d=d|0;f=f|0;h=h|0;var i=0,j=0,k=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0.0,u=0.0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0,B=0,C=0.0,D=0.0,E=0.0,F=0,G=0,H=0,I=0,J=0,K=0,L=0.0,M=0.0,N=0.0;K=l;l=l+96|0;H=c[d+56>>2]|0;if((h-f|0)==1){if(!(a[d+60>>0]|0)){q=(c[d+96>>2]|0)+(H<<6)|0;r=(c[d+76>>2]|0)+(f<<6)|0;s=q+64|0;do{c[q>>2]=c[r>>2];q=q+4|0;r=r+4|0}while((q|0)<(s|0))}else{I=(c[d+116>>2]|0)+(f<<4)|0;J=(c[d+136>>2]|0)+(H<<4)|0;c[J>>2]=c[I>>2];c[J+4>>2]=c[I+4>>2];c[J+8>>2]=c[I+8>>2];c[J+12>>2]=c[I+12>>2]}c[d+56>>2]=(c[d+56>>2]|0)+1;l=K;return}c[K+32>>2]=0;c[K+32+4>>2]=0;c[K+32+8>>2]=0;c[K+32+12>>2]=0;if((h|0)>(f|0)){m=(a[d+60>>0]|0)==0;if(m){j=c[d+76>>2]|0;i=f;k=0.0;n=0.0;o=0.0;do{k=k+(+g[j+(i<<6)+16>>2]+ +g[j+(i<<6)>>2])*.5;n=n+(+g[j+(i<<6)+20>>2]+ +g[j+(i<<6)+4>>2])*.5;o=o+(+g[j+(i<<6)+24>>2]+ +g[j+(i<<6)+8>>2])*.5;i=i+1|0}while((i|0)!=(h|0))}else{j=c[d+116>>2]|0;p=+g[d+36>>2];t=+g[d+40>>2];u=+g[d+44>>2];x=+g[d+4>>2];y=+g[d+8>>2];z=+g[d+12>>2];i=f;k=0.0;n=0.0;o=0.0;do{k=k+(+(e[j+(i<<4)+6>>1]|0)/p+x+(+(e[j+(i<<4)>>1]|0)/p+x))*.5;n=n+(+(e[j+(i<<4)+8>>1]|0)/t+y+(+(e[j+(i<<4)+2>>1]|0)/t+y))*.5;o=o+(+(e[j+(i<<4)+10>>1]|0)/u+z+(+(e[j+(i<<4)+4>>1]|0)/u+z))*.5;i=i+1|0}while((i|0)!=(h|0))}C=1.0/+(h-f|0);E=C*k;D=C*n;C=C*o;if(m){j=c[d+76>>2]|0;i=f;o=0.0;n=0.0;k=0.0;do{x=(+g[j+(i<<6)+16>>2]+ +g[j+(i<<6)>>2])*.5-E;y=(+g[j+(i<<6)+20>>2]+ +g[j+(i<<6)+4>>2])*.5-D;z=(+g[j+(i<<6)+24>>2]+ +g[j+(i<<6)+8>>2])*.5-C;o=o+x*x;n=y*y+n;k=z*z+k;i=i+1|0}while((i|0)!=(h|0))}else{j=c[d+116>>2]|0;p=+g[d+36>>2];t=+g[d+40>>2];u=+g[d+44>>2];x=+g[d+4>>2];y=+g[d+8>>2];z=+g[d+12>>2];i=f;o=0.0;n=0.0;k=0.0;do{N=(+(e[j+(i<<4)+6>>1]|0)/p+x+(+(e[j+(i<<4)>>1]|0)/p+x))*.5-E;M=(+(e[j+(i<<4)+8>>1]|0)/t+y+(+(e[j+(i<<4)+2>>1]|0)/t+y))*.5-D;L=(+(e[j+(i<<4)+10>>1]|0)/u+z+(+(e[j+(i<<4)+4>>1]|0)/u+z))*.5-C;o=o+N*N;n=M*M+n;k=L*L+k;i=i+1|0}while((i|0)!=(h|0))}g[K+32>>2]=o;g[K+32+4>>2]=n;g[K+32+8>>2]=k;i=K+32|0;p=+(h-f|0)}else{i=K+32|0;p=+(h-f|0);o=0.0;n=0.0;k=0.0}L=1.0/(p+-1.0);M=L*o;g[i>>2]=M;N=L*n;g[K+32+4>>2]=N;L=L*k;g[K+32+8>>2]=L;w=+g[K+32+((M>2]>2]=0;c[K+16+4>>2]=0;c[K+16+8>>2]=0;c[K+16+12>>2]=0;if((h|0)>(f|0)){if(!(a[d+60>>0]|0)){j=c[d+76>>2]|0;i=f;o=0.0;n=0.0;k=0.0;do{o=(+g[j+(i<<6)+16>>2]+ +g[j+(i<<6)>>2])*.5+o;n=(+g[j+(i<<6)+20>>2]+ +g[j+(i<<6)+4>>2])*.5+n;k=(+g[j+(i<<6)+24>>2]+ +g[j+(i<<6)+8>>2])*.5+k;i=i+1|0}while((i|0)!=(h|0))}else{j=c[d+116>>2]|0;p=+g[d+36>>2];t=+g[d+40>>2];u=+g[d+44>>2];x=+g[d+4>>2];y=+g[d+8>>2];z=+g[d+12>>2];i=f;o=0.0;n=0.0;k=0.0;do{o=(+(e[j+(i<<4)+6>>1]|0)/p+x+(+(e[j+(i<<4)>>1]|0)/p+x))*.5+o;n=(+(e[j+(i<<4)+8>>1]|0)/t+y+(+(e[j+(i<<4)+2>>1]|0)/t+y))*.5+n;k=(+(e[j+(i<<4)+10>>1]|0)/u+z+(+(e[j+(i<<4)+4>>1]|0)/u+z))*.5+k;i=i+1|0}while((i|0)!=(h|0))}g[K+16>>2]=o;g[K+16+4>>2]=n;g[K+16+8>>2]=k;i=K+16|0}else{i=K+16|0;o=0.0;n=0.0;k=0.0}g[i>>2]=1.0/+(h-f|0)*o;g[K+16+4>>2]=1.0/+(h-f|0)*n;g[K+16+8>>2]=1.0/+(h-f|0)*k;x=+g[K+16+(w<<2)>>2];if((h|0)>(f|0)){i=f;v=f;do{j=(a[d+60>>0]|0)==0;if(j){G=c[d+76>>2]|0;k=+g[G+(v<<6)>>2];n=+g[G+(v<<6)+16>>2];o=+g[G+(v<<6)+4>>2];p=+g[G+(v<<6)+20>>2];t=+g[G+(v<<6)+8>>2];u=+g[G+(v<<6)+24>>2]}else{G=c[d+116>>2]|0;o=+g[d+36>>2];t=+g[d+40>>2];N=+g[d+44>>2];n=+g[d+4>>2];p=+g[d+8>>2];u=+g[d+12>>2];k=+(e[G+(v<<4)>>1]|0)/o+n;n=+(e[G+(v<<4)+6>>1]|0)/o+n;o=+(e[G+(v<<4)+2>>1]|0)/t+p;p=+(e[G+(v<<4)+8>>1]|0)/t+p;t=+(e[G+(v<<4)+4>>1]|0)/N+u;u=+(e[G+(v<<4)+10>>1]|0)/N+u}g[K>>2]=(n+k)*.5;g[K+4>>2]=(p+o)*.5;g[K+8>>2]=(u+t)*.5;g[K+12>>2]=0.0;if(+g[K+(w<<2)>>2]>x){if(j){j=c[d+76>>2]|0;m=j+(v<<6)|0;q=K+32|0;r=m;s=q+64|0;do{c[q>>2]=c[r>>2];q=q+4|0;r=r+4|0}while((q|0)<(s|0));q=m;r=j+(i<<6)|0;s=q+64|0;do{c[q>>2]=c[r>>2];q=q+4|0;r=r+4|0}while((q|0)<(s|0));q=(c[d+76>>2]|0)+(i<<6)|0;r=K+32|0;s=q+64|0;do{c[q>>2]=c[r>>2];q=q+4|0;r=r+4|0}while((q|0)<(s|0))}else{F=c[d+116>>2]|0;G=F+(v<<4)|0;c[K+32>>2]=c[G>>2];c[K+32+4>>2]=c[G+4>>2];c[K+32+8>>2]=c[G+8>>2];c[K+32+12>>2]=c[G+12>>2];F=F+(i<<4)|0;c[G>>2]=c[F>>2];c[G+4>>2]=c[F+4>>2];c[G+8>>2]=c[F+8>>2];c[G+12>>2]=c[F+12>>2];G=(c[d+116>>2]|0)+(i<<4)|0;c[G>>2]=c[K+32>>2];c[G+4>>2]=c[K+32+4>>2];c[G+8>>2]=c[K+32+8>>2];c[G+12>>2]=c[K+32+12>>2]}i=i+1|0}v=v+1|0}while((v|0)!=(h|0))}else i=f;if(!((i|0)>(((h-f|0)/3|0)+f|0)?(i|0)<(h+-1-((h-f|0)/3|0)|0):0))i=(h-f>>1)+f|0;G=c[d+56>>2]|0;if(!(a[d+60>>0]|0)){F=(c[d+96>>2]|0)+(G<<6)|0;c[F>>2]=c[d+20>>2];c[F+4>>2]=c[d+20+4>>2];c[F+8>>2]=c[d+20+8>>2];c[F+12>>2]=c[d+20+12>>2]}else{F=c[d+136>>2]|0;M=(+g[d+24>>2]-+g[d+8>>2])*+g[d+40>>2];N=(+g[d+28>>2]-+g[d+12>>2])*+g[d+44>>2];b[F+(G<<4)>>1]=~~((+g[d+20>>2]-+g[d+4>>2])*+g[d+36>>2])&65535&-2;b[F+(G<<4)+2>>1]=~~M&65535&-2;b[F+(G<<4)+4>>1]=~~N&65535&-2}j=c[d+56>>2]|0;if(!(a[d+60>>0]|0)){F=(c[d+96>>2]|0)+(j<<6)+16|0;c[F>>2]=c[d+4>>2];c[F+4>>2]=c[d+4+4>>2];c[F+8>>2]=c[d+4+8>>2];c[F+12>>2]=c[d+4+12>>2]}else{F=c[d+136>>2]|0;L=+g[d+4>>2];M=+g[d+8>>2];N=+g[d+12>>2];M=(M-M)*+g[d+40>>2];N=(N-N)*+g[d+44>>2];b[F+(j<<4)+6>>1]=~~((L-L)*+g[d+36>>2]+1.0)&65535|1;b[F+(j<<4)+8>>1]=~~(M+1.0)&65535|1;b[F+(j<<4)+10>>1]=~~(N+1.0)&65535|1}F=c[d+56>>2]|0;if((h|0)>(f|0)){B=a[d+60>>0]|0;A=f;do{if(!(B<<24>>24)){j=c[d+76>>2]|0;n=+g[j+(A<<6)>>2];u=+g[j+(A<<6)+4>>2];y=+g[j+(A<<6)+8>>2];p=+g[j+(A<<6)+12>>2];k=+g[j+(A<<6)+16>>2];x=+g[j+(A<<6)+20>>2];o=+g[j+(A<<6)+24>>2];t=+g[j+(A<<6)+28>>2];j=c[d+96>>2]|0;if(n<+g[j+(F<<6)>>2])g[j+(F<<6)>>2]=n;if(u<+g[j+(F<<6)+4>>2])g[j+(F<<6)+4>>2]=u;if(y<+g[j+(F<<6)+8>>2])g[j+(F<<6)+8>>2]=y;if(p<+g[j+(F<<6)+12>>2])g[j+(F<<6)+12>>2]=p;if(+g[j+(F<<6)+16>>2]>2]=k;if(+g[j+(F<<6)+20>>2]>2]=x;if(+g[j+(F<<6)+24>>2]>2]=o;if(+g[j+(F<<6)+28>>2]>2]=t}else{v=c[d+116>>2]|0;p=+g[d+36>>2];y=+g[d+40>>2];E=+g[d+44>>2];t=+g[d+4>>2];z=+g[d+8>>2];L=+g[d+12>>2];u=+g[d+4>>2];C=+g[d+8>>2];M=+g[d+12>>2];x=+g[d+36>>2];D=+g[d+40>>2];N=+g[d+44>>2];j=~~((+(e[v+(A<<4)>>1]|0)/p+t-u)*x)&65535&-2;m=~~((+(e[v+(A<<4)+2>>1]|0)/y+z-C)*D)&65535&-2;q=~~((+(e[v+(A<<4)+4>>1]|0)/E+L-M)*N)&65535&-2;r=~~((+(e[v+(A<<4)+6>>1]|0)/p+t-u)*x+1.0)&65535|1;s=~~((+(e[v+(A<<4)+8>>1]|0)/y+z-C)*D+1.0)&65535|1;v=~~((+(e[v+(A<<4)+10>>1]|0)/E+L-M)*N+1.0)&65535|1;w=c[d+136>>2]|0;if((e[w+(F<<4)>>1]|0)>(j&65535))b[w+(F<<4)>>1]=j;if((e[w+(F<<4)+6>>1]|0)<(r&65535))b[w+(F<<4)+6>>1]=r;if((e[w+(F<<4)+2>>1]|0)>(m&65535))b[w+(F<<4)+2>>1]=m;if((e[w+(F<<4)+8>>1]|0)<(s&65535))b[w+(F<<4)+8>>1]=s;if((e[w+(F<<4)+4>>1]|0)>(q&65535))b[w+(F<<4)+4>>1]=q;if((e[w+(F<<4)+10>>1]|0)<(v&65535))b[w+(F<<4)+10>>1]=v}A=A+1|0}while((A|0)!=(h|0))}c[d+56>>2]=F+1;Cc(d,f,i);A=c[d+56>>2]|0;Cc(d,i,h);w=(c[d+56>>2]|0)-H|0;i=a[d+60>>0]|0;if(i<<24>>24!=0&(w<<4|0)>2048){s=c[d+136>>2]|0;q=c[s+(F+1<<4)+12>>2]|0;q=(q|0)>-1?1:0-q|0;v=c[s+(A<<4)+12>>2]|0;v=(v|0)>-1?1:0-v|0;if((q<<4|0)<2049){r=c[d+152>>2]|0;if((r|0)==(c[d+156>>2]|0)?(I=r|0?r<<1:1,(r|0)<(I|0)):0){if(!I){i=0;m=r}else{c[6995]=(c[6995]|0)+1;i=sc(I<<5|19)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}m=c[d+152>>2]|0}if((m|0)>0){j=0;do{H=i+(j<<5)|0;h=(c[d+160>>2]|0)+(j<<5)|0;c[H>>2]=c[h>>2];c[H+4>>2]=c[h+4>>2];c[H+8>>2]=c[h+8>>2];c[H+12>>2]=c[h+12>>2];c[H+16>>2]=c[h+16>>2];c[H+20>>2]=c[h+20>>2];c[H+24>>2]=c[h+24>>2];c[H+28>>2]=c[h+28>>2];j=j+1|0}while((j|0)!=(m|0))}j=c[d+160>>2]|0;if(j|0){if(a[d+164>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[d+160>>2]=0}a[d+164>>0]=1;c[d+160>>2]=i;c[d+156>>2]=I;i=c[d+152>>2]|0}else i=r;c[d+152>>2]=i+1;I=(c[d+160>>2]|0)+(r<<5)|0;c[I>>2]=c[K+32>>2];c[I+4>>2]=c[K+32+4>>2];c[I+8>>2]=c[K+32+8>>2];c[I+12>>2]=c[K+32+12>>2];c[I+16>>2]=c[K+32+16>>2];c[I+20>>2]=c[K+32+20>>2];c[I+24>>2]=c[K+32+24>>2];c[I+28>>2]=c[K+32+28>>2];I=c[d+160>>2]|0;b[I+(r<<5)>>1]=b[s+(F+1<<4)>>1]|0;b[I+(r<<5)+2>>1]=b[s+(F+1<<4)+2>>1]|0;b[I+(r<<5)+4>>1]=b[s+(F+1<<4)+4>>1]|0;b[I+(r<<5)+6>>1]=b[s+(F+1<<4)+6>>1]|0;b[I+(r<<5)+8>>1]=b[s+(F+1<<4)+8>>1]|0;b[I+(r<<5)+10>>1]=b[s+(F+1<<4)+10>>1]|0;c[I+(r<<5)+12>>2]=F+1;c[I+(r<<5)+16>>2]=q}if((v<<4|0)<2049){q=c[d+152>>2]|0;if((q|0)==(c[d+156>>2]|0)?(J=q|0?q<<1:1,(q|0)<(J|0)):0){if(!J){i=0;m=q}else{c[6995]=(c[6995]|0)+1;i=sc(J<<5|19)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}m=c[d+152>>2]|0}if((m|0)>0){j=0;do{I=i+(j<<5)|0;H=(c[d+160>>2]|0)+(j<<5)|0;c[I>>2]=c[H>>2];c[I+4>>2]=c[H+4>>2];c[I+8>>2]=c[H+8>>2];c[I+12>>2]=c[H+12>>2];c[I+16>>2]=c[H+16>>2];c[I+20>>2]=c[H+20>>2];c[I+24>>2]=c[H+24>>2];c[I+28>>2]=c[H+28>>2];j=j+1|0}while((j|0)!=(m|0))}j=c[d+160>>2]|0;if(j|0){if(a[d+164>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[d+160>>2]=0}a[d+164>>0]=1;c[d+160>>2]=i;c[d+156>>2]=J;i=c[d+152>>2]|0}else i=q;c[d+152>>2]=i+1;i=(c[d+160>>2]|0)+(q<<5)|0;c[i>>2]=c[K+32>>2];c[i+4>>2]=c[K+32+4>>2];c[i+8>>2]=c[K+32+8>>2];c[i+12>>2]=c[K+32+12>>2];c[i+16>>2]=c[K+32+16>>2];c[i+20>>2]=c[K+32+20>>2];c[i+24>>2]=c[K+32+24>>2];c[i+28>>2]=c[K+32+28>>2];i=c[d+160>>2]|0;b[i+(q<<5)>>1]=b[s+(A<<4)>>1]|0;b[i+(q<<5)+2>>1]=b[s+(A<<4)+2>>1]|0;b[i+(q<<5)+4>>1]=b[s+(A<<4)+4>>1]|0;b[i+(q<<5)+6>>1]=b[s+(A<<4)+6>>1]|0;b[i+(q<<5)+8>>1]=b[s+(A<<4)+8>>1]|0;b[i+(q<<5)+10>>1]=b[s+(A<<4)+10>>1]|0;c[i+(q<<5)+12>>2]=A;c[i+(q<<5)+16>>2]=v;i=d+152|0}else i=d+152|0;c[d+168>>2]=c[i>>2];i=a[d+60>>0]|0}if(!(i<<24>>24)){c[(c[d+96>>2]|0)+(G<<6)+32>>2]=w;l=K;return}else{c[(c[d+136>>2]|0)+(G<<4)+12>>2]=0-w;l=K;return}}function Dc(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0,B=0.0,C=0,E=0,F=0,G=0,H=0,I=0,J=0.0,K=0.0,L=0,M=0.0,N=0,O=0.0,P=0,Q=0.0,R=0,S=0.0,T=0;T=l;l=l+208|0;g[b+56>>2]=0.0;H=T+192+4|0;I=T+192+8|0;c[T+192>>2]=0;c[T+192+4>>2]=0;c[T+192+8>>2]=0;c[T+192+12>>2]=0;c[T+128>>2]=c[d>>2];c[T+128+4>>2]=c[d+4>>2];c[T+128+8>>2]=c[d+8>>2];c[T+128+12>>2]=c[d+12>>2];c[T+128+16>>2]=c[d+16>>2];c[T+128+16+4>>2]=c[d+16+4>>2];c[T+128+16+8>>2]=c[d+16+8>>2];c[T+128+16+12>>2]=c[d+16+12>>2];c[T+128+32>>2]=c[d+32>>2];c[T+128+32+4>>2]=c[d+32+4>>2];c[T+128+32+8>>2]=c[d+32+8>>2];c[T+128+32+12>>2]=c[d+32+12>>2];C=T+128+48|0;c[C>>2]=c[d+48>>2];c[C+4>>2]=c[d+48+4>>2];c[C+8>>2]=c[d+48+8>>2];c[C+12>>2]=c[d+48+12>>2];c[T+64>>2]=c[d+64>>2];c[T+64+4>>2]=c[d+64+4>>2];c[T+64+8>>2]=c[d+64+8>>2];c[T+64+12>>2]=c[d+64+12>>2];c[T+64+16>>2]=c[d+80>>2];c[T+64+16+4>>2]=c[d+80+4>>2];c[T+64+16+8>>2]=c[d+80+8>>2];c[T+64+16+12>>2]=c[d+80+12>>2];c[T+64+32>>2]=c[d+96>>2];c[T+64+32+4>>2]=c[d+96+4>>2];c[T+64+32+8>>2]=c[d+96+8>>2];c[T+64+32+12>>2]=c[d+96+12>>2];E=T+64+48|0;c[E>>2]=c[d+112>>2];c[E+4>>2]=c[d+112+4>>2];c[E+8>>2]=c[d+112+8>>2];c[E+12>>2]=c[d+112+12>>2];J=+g[C>>2];K=+g[E>>2];L=T+128+52|0;M=+g[L>>2];N=T+64+52|0;O=+g[N>>2];P=T+128+56|0;Q=+g[P>>2];R=T+64+56|0;S=+g[R>>2];g[C>>2]=J-(J+K)*.5;g[L>>2]=M-(M+O)*.5;g[P>>2]=Q-(Q+S)*.5;g[E>>2]=K-(J+K)*.5;g[N>>2]=O-(M+O)*.5;g[R>>2]=S-(Q+S)*.5;if(((c[(c[b+28>>2]|0)+4>>2]|0)+-17|0)>>>0<2)C=((c[(c[b+32>>2]|0)+4>>2]|0)+-17|0)>>>0<2;else C=0;v=+g[b+44>>2];u=+g[b+48>>2];c[6413]=(c[6413]|0)+1;E=a[b+52>>0]|0;c[b+64>>2]=0;c[b+4>>2]=0;c[b+8>>2]=1065353216;c[b+12>>2]=0;g[b+16>>2]=0.0;c[b+68>>2]=0;c[b+60>>2]=-1;n=c[b+24>>2]|0;a[n+312>>0]=0;c[n>>2]=0;a[n+356>>0]=1;c[n+292>>2]=1566444395;c[n+296>>2]=1566444395;c[n+300>>2]=1566444395;g[n+304>>2]=0.0;c[n+336>>2]=0;c[n+336+4>>2]=0;c[n+336+8>>2]=0;c[n+336+12>>2]=0;a[n+336+16>>0]=0;a[n+332>>0]=a[n+332>>0]&-16;n=0;p=999999984306749440.0;do{q=+g[b+4>>2];o=+g[b+8>>2];j=+g[b+12>>2];k=+g[d+4>>2]*-q+ +g[d+20>>2]*-o+ +g[d+36>>2]*-j;m=+g[d+8>>2]*-q+ +g[d+24>>2]*-o+ +g[d+40>>2]*-j;g[T+48>>2]=+g[d>>2]*-q+ +g[d+16>>2]*-o+ +g[d+32>>2]*-j;g[T+48+4>>2]=k;g[T+48+8>>2]=m;g[T+48+12>>2]=0.0;m=q*+g[d+68>>2]+o*+g[d+84>>2]+j*+g[d+100>>2];k=q*+g[d+72>>2]+o*+g[d+88>>2]+j*+g[d+104>>2];g[T+32>>2]=+g[d+64>>2]*q+ +g[d+80>>2]*o+ +g[d+96>>2]*j;g[T+32+4>>2]=m;g[T+32+8>>2]=k;g[T+32+12>>2]=0.0;Nd(T+16|0,c[b+28>>2]|0,T+48|0);Nd(T,c[b+32>>2]|0,T+32|0);k=+g[T+16>>2];m=+g[T+16+4>>2];j=+g[T+16+8>>2];o=k*+g[T+128>>2]+m*+g[T+128+4>>2]+j*+g[T+128+8>>2]+ +g[T+128+48>>2];q=k*+g[T+128+16>>2]+m*+g[T+128+20>>2]+j*+g[T+128+24>>2]+ +g[L>>2];j=k*+g[T+128+32>>2]+m*+g[T+128+36>>2]+j*+g[T+128+40>>2]+ +g[P>>2];m=+g[T>>2];k=+g[T+4>>2];t=+g[T+8>>2];r=m*+g[T+64>>2]+k*+g[T+64+4>>2]+t*+g[T+64+8>>2]+ +g[T+64+48>>2];s=m*+g[T+64+16>>2]+k*+g[T+64+20>>2]+t*+g[T+64+24>>2]+ +g[N>>2];t=m*+g[T+64+32>>2]+k*+g[T+64+36>>2]+t*+g[T+64+40>>2]+ +g[R>>2];k=C?0.0:t;m=C?0.0:j;t=(C?0.0:j)-(C?0.0:t);j=+g[b+4>>2]*(o-r)+ +g[b+8>>2]*(q-s)+ +g[b+12>>2]*t;if(j>0.0?j*j>p*+g[d+128>>2]:0){c[b+68>>2]=10;n=1;h=0}else G=7;do if((G|0)==7){G=0;z=c[b+24>>2]|0;A=c[z>>2]|0;a:do if((A|0)>0){i=+g[z+308>>2];h=0;while(1){x=o-r-+g[z+4+(h<<4)>>2];y=q-s-+g[z+4+(h<<4)+4>>2];B=t-+g[z+4+(h<<4)+8>>2];h=h+1|0;if(x*x+y*y+B*B<=i){h=1;break a}if((h|0)>=(A|0)){h=0;break}}}else h=0;while(0);if((+g[z+304>>2]==0.0?t==+g[z+300>>2]:0)?q-s==+g[z+296>>2]:0){if(o-r==+g[z+292>>2]|h)G=16}else G=15;if((G|0)==15?(G=0,h):0)G=16;if((G|0)==16){G=0;c[b+68>>2]=1;n=1;h=0;break}i=p-j;if(i<=p*9.999999974752427e-07){c[b+68>>2]=i<=0.0?2:11;n=1;h=0;break}g[z+292>>2]=o-r;g[z+296>>2]=q-s;g[z+300>>2]=t;g[z+304>>2]=0.0;a[z+356>>0]=1;g[z+4+(A<<4)>>2]=o-r;g[z+4+(A<<4)+4>>2]=q-s;g[z+4+(A<<4)+8>>2]=t;g[z+4+(A<<4)+12>>2]=0.0;h=c[z>>2]|0;g[z+84+(h<<4)>>2]=o;g[z+84+(h<<4)+4>>2]=q;g[z+84+(h<<4)+8>>2]=m;g[z+84+(h<<4)+12>>2]=0.0;h=c[z>>2]|0;g[z+164+(h<<4)>>2]=r;g[z+164+(h<<4)+4>>2]=s;g[z+164+(h<<4)+8>>2]=k;g[z+164+(h<<4)+12>>2]=0.0;c[z>>2]=(c[z>>2]|0)+1;h=c[b+24>>2]|0;A=wc(h)|0;i=+g[h+276>>2];j=+g[h+280>>2];k=+g[h+284>>2];h=c[h+288>>2]|0;if(!A){c[b+68>>2]=3;n=1;h=0;break}if(i*i+j*j+k*k<9.999999974752427e-07){g[b+4>>2]=i;g[b+8>>2]=j;g[b+12>>2]=k;c[b+16>>2]=h;c[b+68>>2]=6;n=1;h=0;break}if(p-(i*i+j*j+k*k)<=p*1.1920928955078125e-07){c[b+68>>2]=12;p=i*i+j*j+k*k;n=1;h=0;break}g[b+4>>2]=i;g[b+8>>2]=j;g[b+12>>2]=k;c[b+16>>2]=h;A=c[b+64>>2]|0;c[b+64>>2]=A+1;if((A|0)<=1e3)if((c[c[b+24>>2]>>2]|0)==4){c[b+68>>2]=13;p=i*i+j*j+k*k;h=0}else{p=i*i+j*j+k*k;h=1}else{p=i*i+j*j+k*k;h=0}}while(0)}while(h);w=E<<24>>24==0?u:0.0;v=(E<<24>>24==0?v:0.0)+w;if(n){E=c[b+24>>2]|0;wc(E)|0;i=+g[E+260>>2];o=+g[E+264>>2];m=+g[E+268>>2];c[T+192>>2]=c[b+4>>2];c[T+192+4>>2]=c[b+4+4>>2];c[T+192+8>>2]=c[b+4+8>>2];c[T+192+12>>2]=c[b+4+12>>2];j=+g[b+4>>2];k=+g[b+8>>2];q=+g[b+12>>2];if(j*j+k*k+q*q<9.999999974752427e-07)c[b+68>>2]=5;if(j*j+k*k+q*q>1.4210854715202004e-14){y=1.0/+D(+(j*j+k*k+q*q));g[T+192>>2]=y*+g[T+192>>2];g[H>>2]=y*+g[H>>2];g[I>>2]=y*+g[I>>2];B=w/+D(+p);p=1.0/y-v;n=1;h=1;i=B*j+i;o=B*k+o;m=B*q+m}else{p=0.0;n=0;h=2}c[b+60>>2]=h}else{p=0.0;n=0;i=0.0;o=0.0;m=0.0}if(((c[b+72>>2]|0)!=0?(c[b+20>>2]|0)!=0:0)?(c[b+68>>2]|0)!=0:0)h=v+p<1.0000000474974513e-03;else h=0;z=n^1;do if(h|z?(F=c[b+20>>2]|0,(F|0)!=0):0){c[6412]=(c[6412]|0)+1;c[b+4>>2]=0;c[b+4+4>>2]=0;c[b+4+8>>2]=0;c[b+4+12>>2]=0;if(!(Gb[c[(c[F>>2]|0)+8>>2]&3](F,c[b+24>>2]|0,c[b+28>>2]|0,c[b+32>>2]|0,T+128|0,T+64|0,b+4|0,T+48|0,T+32|0,f)|0)){k=+g[b+4>>2];r=+g[b+8>>2];t=+g[b+12>>2];if(!(k*k+r*r+t*t>0.0)){if(n){q=i;break}l=T;return}q=+g[T+32>>2];y=+g[T+48>>2]-q;s=+g[T+32+4>>2];B=+g[T+48+4>>2]-s;u=+g[T+32+8>>2];j=+g[T+48+8>>2]-u;j=+D(+(y*y+B*B+j*j))-v;if(j>2]=c[b+4>>2];c[T+192+4>>2]=c[b+4+4>>2];c[T+192+8>>2]=c[b+4+8>>2];c[T+192+12>>2]=c[b+4+12>>2];B=+g[T+192>>2];m=+g[H>>2];o=+g[I>>2];p=1.0/+D(+(B*B+m*m+o*o));g[T+192>>2]=B*p;g[H>>2]=m*p;g[I>>2]=o*p;c[b+60>>2]=6;p=j;q=w*k+q;o=w*r+s;m=w*t+u;break}c[b+60>>2]=5;if(n){q=i;break}l=T;return}q=+g[T+32>>2];k=+g[T+48>>2];y=+g[T+32+4>>2];r=+g[T+48+4>>2];B=+g[T+32+8>>2];s=+g[T+48+8>>2];if(!((q-k)*(q-k)+(y-r)*(y-r)+(B-s)*(B-s)<=1.4210854715202004e-14)){j=(q-k)*(q-k)+(y-r)*(y-r)+(B-s)*(B-s);u=q-k;v=B-s;w=0.0;x=y-r}else{u=+g[b+4>>2];x=+g[b+8>>2];v=+g[b+12>>2];j=u*u+x*x+v*v;w=+g[b+16>>2]}if(!(j>1.4210854715202004e-14)){c[b+60>>2]=9;if(n){q=i;break}l=T;return}t=1.0/+D(+j);j=-+D(+((k-q)*(k-q)+(r-y)*(r-y)+(s-B)*(s-B)));c[b+60>>2]=3;if(p>j|z){g[T+192>>2]=u*t;g[H>>2]=x*t;g[I>>2]=v*t;g[T+192+12>>2]=w;p=j;o=y;m=B;break}c[b+60>>2]=8;if(n)q=i;else{l=T;return}}else G=54;while(0);if((G|0)==54)if(n)q=i;else{l=T;return}if(!(p<0.0)?!(p*p<+g[d+128>>2]):0){l=T;return}c[b+4>>2]=c[T+192>>2];c[b+4+4>>2]=c[T+192+4>>2];c[b+4+8>>2]=c[T+192+8>>2];c[b+4+12>>2]=c[T+192+12>>2];g[b+56>>2]=p;u=+g[T+192>>2];v=+g[H>>2];B=+g[I>>2];j=u*+g[d+4>>2]+v*+g[d+20>>2]+B*+g[d+36>>2];i=u*+g[d+8>>2]+v*+g[d+24>>2]+B*+g[d+40>>2];g[T+48>>2]=+g[d>>2]*u+ +g[d+16>>2]*v+ +g[d+32>>2]*B;g[T+48+4>>2]=j;g[T+48+8>>2]=i;g[T+48+12>>2]=0.0;i=+g[d+68>>2]*-u+ +g[d+84>>2]*-v+ +g[d+100>>2]*-B;j=+g[d+72>>2]*-u+ +g[d+88>>2]*-v+ +g[d+104>>2]*-B;g[T+32>>2]=+g[d+64>>2]*-u+ +g[d+80>>2]*-v+ +g[d+96>>2]*-B;g[T+32+4>>2]=i;g[T+32+8>>2]=j;g[T+32+12>>2]=0.0;Nd(T+16|0,c[b+28>>2]|0,T+48|0);Nd(T,c[b+32>>2]|0,T+32|0);j=+g[T+16>>2];i=+g[T+16+4>>2];B=+g[T+16+8>>2];v=+g[T>>2];u=+g[T+4>>2];t=+g[T+8>>2];y=+g[T+192>>2];x=+g[H>>2];w=+g[I>>2];t=-((j*+g[T+128+16>>2]+i*+g[T+128+20>>2]+B*+g[T+128+24>>2]+ +g[L>>2]-(v*+g[T+64+16>>2]+u*+g[T+64+20>>2]+t*+g[T+64+24>>2]+ +g[N>>2]))*x)-(j*+g[T+128>>2]+i*+g[T+128+4>>2]+B*+g[T+128+8>>2]+ +g[T+128+48>>2]-(v*+g[T+64>>2]+u*+g[T+64+4>>2]+t*+g[T+64+8>>2]+ +g[T+64+48>>2]))*y-(j*+g[T+128+32>>2]+i*+g[T+128+36>>2]+B*+g[T+128+40>>2]+ +g[P>>2]-(v*+g[T+64+32>>2]+u*+g[T+64+36>>2]+t*+g[T+64+40>>2]+ +g[R>>2]))*w;u=+g[d+4>>2]*-y+ +g[d+20>>2]*-x+ +g[d+36>>2]*-w;v=+g[d+8>>2]*-y+ +g[d+24>>2]*-x+ +g[d+40>>2]*-w;g[T+48>>2]=+g[d>>2]*-y+ +g[d+16>>2]*-x+ +g[d+32>>2]*-w;g[T+48+4>>2]=u;g[T+48+8>>2]=v;g[T+48+12>>2]=0.0;v=y*+g[d+68>>2]+x*+g[d+84>>2]+w*+g[d+100>>2];u=y*+g[d+72>>2]+x*+g[d+88>>2]+w*+g[d+104>>2];g[T+32>>2]=+g[d+64>>2]*y+ +g[d+80>>2]*x+ +g[d+96>>2]*w;g[T+32+4>>2]=v;g[T+32+8>>2]=u;g[T+32+12>>2]=0.0;Nd(T+16|0,c[b+28>>2]|0,T+48|0);Nd(T,c[b+32>>2]|0,T+32|0);u=+g[T+16>>2];v=+g[T+16+4>>2];w=+g[T+16+8>>2];x=+g[T>>2];y=+g[T+4>>2];B=+g[T+8>>2];i=+g[T+192>>2];j=+g[H>>2];k=+g[I>>2];if(t>(u*+g[T+128>>2]+v*+g[T+128+4>>2]+w*+g[T+128+8>>2]+ +g[T+128+48>>2]-(x*+g[T+64>>2]+y*+g[T+64+4>>2]+B*+g[T+64+8>>2]+ +g[T+64+48>>2]))*i+(u*+g[T+128+16>>2]+v*+g[T+128+20>>2]+w*+g[T+128+24>>2]+ +g[L>>2]-(x*+g[T+64+16>>2]+y*+g[T+64+20>>2]+B*+g[T+64+24>>2]+ +g[N>>2]))*j+(u*+g[T+128+32>>2]+v*+g[T+128+36>>2]+w*+g[T+128+40>>2]+ +g[P>>2]-(x*+g[T+64+32>>2]+y*+g[T+64+36>>2]+B*+g[T+64+40>>2]+ +g[R>>2]))*k){c[b+60>>2]=10;g[T+192>>2]=-i;g[H>>2]=-j;g[I>>2]=-k}b=c[(c[e>>2]|0)+16>>2]|0;g[T+48>>2]=(J+K)*.5+q;g[T+48+4>>2]=(M+O)*.5+o;g[T+48+8>>2]=(Q+S)*.5+m;g[T+48+12>>2]=0.0;Tb[b&15](e,T+192|0,T+48|0,p);l=T;return}function Ec(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,j=0.0,k=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0,O=0;t=l;l=l+208|0;if(xb[c[(c[a>>2]|0)+20>>2]&127](a)|0?(r=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0,(xb[c[(c[r>>2]|0)+56>>2]&127](r)|0)&32768|0):0){r=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Pb[c[(c[r>>2]|0)+64>>2]&7](r,b,.10000000149011612)}f=c[d+4>>2]|0;switch(f|0){case 31:{f=c[d+20>>2]|0;if((f|0)<=0){l=t;return}do{s=f;f=f+-1|0;r=c[d+28>>2]|0;E=+g[r+(f*80|0)>>2];B=+g[r+(f*80|0)+4>>2];y=+g[r+(f*80|0)+8>>2];D=+g[r+(f*80|0)+16>>2];A=+g[r+(f*80|0)+20>>2];w=+g[r+(f*80|0)+24>>2];C=+g[r+(f*80|0)+32>>2];z=+g[r+(f*80|0)+36>>2];u=+g[r+(f*80|0)+40>>2];M=+g[r+(f*80|0)+48>>2];L=+g[r+(f*80|0)+52>>2];k=+g[r+(f*80|0)+56>>2];r=c[r+(f*80|0)+64>>2]|0;q=c[(c[a>>2]|0)+28>>2]|0;K=+g[b>>2];J=+g[b+4>>2];I=+g[b+8>>2];H=+g[b+16>>2];G=+g[b+20>>2];F=+g[b+24>>2];x=+g[b+32>>2];v=+g[b+36>>2];h=+g[b+40>>2];i=M*K+L*J+k*I+ +g[b+48>>2];j=M*H+L*G+k*F+ +g[b+52>>2];k=M*x+L*v+k*h+ +g[b+56>>2];g[t+144>>2]=E*K+D*J+C*I;g[t+144+4>>2]=B*K+A*J+z*I;g[t+144+8>>2]=y*K+w*J+u*I;g[t+144+12>>2]=0.0;g[t+144+16>>2]=E*H+D*G+C*F;g[t+144+20>>2]=B*H+A*G+z*F;g[t+144+24>>2]=y*H+w*G+u*F;g[t+144+28>>2]=0.0;g[t+144+32>>2]=E*x+D*v+C*h;g[t+144+36>>2]=B*x+A*v+z*h;g[t+144+40>>2]=y*x+w*v+u*h;g[t+144+44>>2]=0.0;g[t+144+48>>2]=i;g[t+144+52>>2]=j;g[t+144+56>>2]=k;g[t+144+60>>2]=0.0;Vb[q&127](a,t+144|0,r,e)}while((s|0)>1);l=t;return}case 0:{c[t+144>>2]=c[d+32>>2];c[t+144+4>>2]=c[d+32+4>>2];c[t+144+8>>2]=c[d+32+8>>2];c[t+144+12>>2]=c[d+32+12>>2];K=+nb[c[(c[d>>2]|0)+48>>2]&15](d);L=+nb[c[(c[d>>2]|0)+48>>2]&15](d);M=+nb[c[(c[d>>2]|0)+48>>2]&15](d);K=K+ +g[t+144>>2];g[t+144>>2]=K;L=L+ +g[t+144+4>>2];g[t+144+4>>2]=L;M=M+ +g[t+144+8>>2];g[t+144+8>>2]=M;d=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;a=c[(c[d>>2]|0)+80>>2]|0;g[t+112>>2]=-K;g[t+112+4>>2]=-L;g[t+112+8>>2]=-M;g[t+112+12>>2]=0.0;Zb[a&31](d,t+112|0,t+144|0,b,e);l=t;return}case 8:{M=+nb[c[(c[d>>2]|0)+48>>2]&15](d);d=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Nb[c[(c[d>>2]|0)+24>>2]&0](d,M,b,e);l=t;return}case 9:{f=c[d+96>>2]|0;if((f|0)<=0){l=t;return}do{s=f;f=f+-1|0;r=c[d+104>>2]|0;y=+g[r+(f<<4)>>2];z=+g[r+(f<<4)+4>>2];L=+g[r+(f<<4)+8>>2];r=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;q=c[(c[r>>2]|0)+24>>2]|0;M=+g[(c[d+124>>2]|0)+(f<<2)>>2];B=+g[b>>2];C=+g[b+4>>2];A=+g[b+8>>2];E=+g[b+16>>2];F=+g[b+20>>2];D=+g[b+24>>2];H=+g[b+32>>2];I=+g[b+36>>2];G=+g[b+40>>2];J=y*B+z*C+L*A+ +g[b+48>>2];K=y*E+z*F+L*D+ +g[b+52>>2];L=y*H+z*I+L*G+ +g[b+56>>2];g[t+144>>2]=B+C*0.0+A*0.0;g[t+144+4>>2]=B*0.0+C+A*0.0;g[t+144+8>>2]=A+(B*0.0+C*0.0);g[t+144+12>>2]=0.0;g[t+144+16>>2]=E+F*0.0+D*0.0;g[t+144+20>>2]=E*0.0+F+D*0.0;g[t+144+24>>2]=D+(E*0.0+F*0.0);g[t+144+28>>2]=0.0;g[t+144+32>>2]=H+I*0.0+G*0.0;g[t+144+36>>2]=H*0.0+I+G*0.0;g[t+144+40>>2]=G+(H*0.0+I*0.0);g[t+144+44>>2]=0.0;g[t+144+48>>2]=J;g[t+144+52>>2]=K;g[t+144+56>>2]=L;g[t+144+60>>2]=0.0;Nb[q&0](r,M,t+144|0,e)}while((s|0)>1);l=t;return}case 10:{s=c[d+56>>2]|0;L=+g[d+32+(((s+2|0)%3|0)<<2)>>2];M=+g[d+32+(s<<2)>>2];d=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Lb[c[(c[d>>2]|0)+84>>2]&0](d,L,M,s,b,e);l=t;return}case 11:{L=+g[d+60>>2];M=+g[d+64>>2];d=c[d+72>>2]|0;a=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Lb[c[(c[a>>2]|0)+92>>2]&0](a,L,M,d,b,e);l=t;return}case 13:{s=c[d+56>>2]|0;L=+nb[c[(c[d>>2]|0)+92>>2]&15](d);c[t+128>>2]=c[d+32>>2];c[t+128+4>>2]=c[d+32+4>>2];c[t+128+8>>2]=c[d+32+8>>2];c[t+128+12>>2]=c[d+32+12>>2];J=+nb[c[(c[d>>2]|0)+48>>2]&15](d);K=+nb[c[(c[d>>2]|0)+48>>2]&15](d);M=+nb[c[(c[d>>2]|0)+48>>2]&15](d);g[t+128>>2]=J+ +g[t+128>>2];g[t+128+4>>2]=K+ +g[t+128+4>>2];g[t+128+8>>2]=M+ +g[t+128+8>>2];M=+g[t+128+(s<<2)>>2];d=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Lb[c[(c[d>>2]|0)+88>>2]&0](d,L,M,s,b,e);l=t;return}case 28:{M=+g[d+68>>2];a=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Rb[c[(c[a>>2]|0)+96>>2]&0](a,d+52|0,M,b,e);l=t;return}default:{a:do if((f|0)<7){r=c[d+56>>2]|0;if(!r){if((xb[c[(c[d>>2]|0)+100>>2]&127](d)|0)<=0)break;f=0;while(1){Vb[c[(c[d>>2]|0)+104>>2]&127](d,f,t+144|0,t+112|0);K=+g[t+144>>2];y=+g[b>>2];I=+g[t+144+4>>2];z=+g[b+4>>2];G=+g[t+144+8>>2];A=+g[b+8>>2];C=+g[b+16>>2];D=+g[b+20>>2];E=+g[b+24>>2];H=+g[b+32>>2];J=+g[b+36>>2];L=+g[b+40>>2];B=+g[b+48>>2];F=+g[b+52>>2];M=+g[b+56>>2];g[t+16>>2]=K*y+I*z+G*A+B;g[t+16+4>>2]=K*C+I*D+G*E+F;g[t+16+8>>2]=K*H+I*J+G*L+M;g[t+16+12>>2]=0.0;G=+g[t+112>>2];I=+g[t+112+4>>2];K=+g[t+112+8>>2];g[t>>2]=G*y+I*z+K*A+B;g[t+4>>2]=G*C+I*D+K*E+F;g[t+8>>2]=G*H+I*J+K*L+M;g[t+12>>2]=0.0;s=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Vb[c[(c[s>>2]|0)+16>>2]&127](s,t+16|0,t,e);f=f+1|0;if((f|0)>=(xb[c[(c[d>>2]|0)+100>>2]&127](d)|0))break a}}if((c[r+28>>2]|0)>0){q=0;do{f=c[r+36>>2]|0;p=c[f+(q*36|0)+4>>2]|0;b:do if((p|0)!=0?(s=c[f+(q*36|0)+12>>2]|0,(p|0)>0):0){f=0;n=c[s+(p+-1<<2)>>2]|0;m=s;h=0.0;i=0.0;k=0.0;while(1){o=c[m+(f<<2)>>2]|0;m=c[r+16>>2]|0;h=h+ +g[m+(o<<4)>>2];i=i+ +g[m+(o<<4)+4>>2];k=k+ +g[m+(o<<4)+8>>2];m=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;N=c[(c[m>>2]|0)+16>>2]|0;O=c[r+16>>2]|0;K=+g[O+(n<<4)>>2];y=+g[b>>2];I=+g[O+(n<<4)+4>>2];z=+g[b+4>>2];G=+g[O+(n<<4)+8>>2];A=+g[b+8>>2];C=+g[b+16>>2];D=+g[b+20>>2];E=+g[b+24>>2];H=+g[b+32>>2];J=+g[b+36>>2];L=+g[b+40>>2];B=+g[b+48>>2];F=+g[b+52>>2];M=+g[b+56>>2];g[t+144>>2]=K*y+I*z+G*A+B;g[t+144+4>>2]=K*C+I*D+G*E+F;g[t+144+8>>2]=K*H+I*J+G*L+M;g[t+144+12>>2]=0.0;G=+g[O+(o<<4)>>2];I=+g[O+(o<<4)+4>>2];K=+g[O+(o<<4)+8>>2];g[t+112>>2]=G*y+I*z+K*A+B;g[t+112+4>>2]=G*C+I*D+K*E+F;g[t+112+8>>2]=G*H+I*J+K*L+M;g[t+112+12>>2]=0.0;Vb[N&127](m,t+144|0,t+112|0,e);f=f+1|0;m=c[r+36>>2]|0;if((f|0)>=(c[m+(q*36|0)+4>>2]|0))break b;n=o;m=c[m+(q*36|0)+12>>2]|0}}else{h=0.0;i=0.0;k=0.0}while(0);j=1.0/+(p|0)*h;i=1.0/+(p|0)*i;h=1.0/+(p|0)*k;O=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;if((xb[c[(c[O>>2]|0)+56>>2]&127](O)|0)&16384|0){c[t+144>>2]=1065353216;c[t+144+4>>2]=1065353216;c[t+144+8>>2]=0;g[t+144+12>>2]=0.0;O=c[r+36>>2]|0;G=+g[O+(q*36|0)+20>>2];I=+g[O+(q*36|0)+24>>2];K=+g[O+(q*36|0)+28>>2];O=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;N=c[(c[O>>2]|0)+16>>2]|0;y=+g[b>>2];z=+g[b+4>>2];A=+g[b+8>>2];C=+g[b+16>>2];D=+g[b+20>>2];E=+g[b+24>>2];H=+g[b+32>>2];J=+g[b+36>>2];L=+g[b+40>>2];B=+g[b+48>>2];F=+g[b+52>>2];M=+g[b+56>>2];g[t+112>>2]=j*y+i*z+h*A+B;g[t+112+4>>2]=j*C+i*D+h*E+F;g[t+112+8>>2]=j*H+i*J+h*L+M;g[t+112+12>>2]=0.0;g[t+16>>2]=(j+G)*y+(i+I)*z+(h+K)*A+B;g[t+16+4>>2]=(j+G)*C+(i+I)*D+(h+K)*E+F;g[t+16+8>>2]=(j+G)*H+(i+I)*J+(h+K)*L+M;g[t+16+12>>2]=0.0;Vb[N&127](O,t+112|0,t+16|0,t+144|0)}q=q+1|0}while((q|0)<(c[r+28>>2]|0))}}while(0);f=c[d+4>>2]|0;if((f+-21|0)>>>0<9){c[t+144>>2]=1566444395;c[t+144+4>>2]=1566444395;c[t+144+8>>2]=1566444395;g[t+144+12>>2]=0.0;c[t+112>>2]=-581039253;c[t+112+4>>2]=-581039253;c[t+112+8>>2]=-581039253;g[t+112+12>>2]=0.0;f=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;c[t+16>>2]=6132;c[t+16+4>>2]=6156;c[t+16+8>>2]=f;c[t+16+12>>2]=c[e>>2];c[t+16+12+4>>2]=c[e+4>>2];c[t+16+12+8>>2]=c[e+8>>2];c[t+16+12+12>>2]=c[e+12>>2];c[t+16+28>>2]=c[b>>2];c[t+16+28+4>>2]=c[b+4>>2];c[t+16+28+8>>2]=c[b+8>>2];c[t+16+28+12>>2]=c[b+12>>2];c[t+16+44>>2]=c[b+16>>2];c[t+16+44+4>>2]=c[b+16+4>>2];c[t+16+44+8>>2]=c[b+16+8>>2];c[t+16+44+12>>2]=c[b+16+12>>2];c[t+16+60>>2]=c[b+32>>2];c[t+16+60+4>>2]=c[b+32+4>>2];c[t+16+60+8>>2]=c[b+32+8>>2];c[t+16+60+12>>2]=c[b+32+12>>2];c[t+16+76>>2]=c[b+48>>2];c[t+16+76+4>>2]=c[b+48+4>>2];c[t+16+76+8>>2]=c[b+48+8>>2];c[t+16+76+12>>2]=c[b+48+12>>2];Vb[c[(c[d>>2]|0)+64>>2]&127](d,t+16|0,t+112|0,t+144|0);f=c[d+4>>2]|0}if((f|0)!=3){l=t;return}c[t+144>>2]=1566444395;c[t+144+4>>2]=1566444395;c[t+144+8>>2]=1566444395;g[t+144+12>>2]=0.0;c[t+112>>2]=-581039253;c[t+112+4>>2]=-581039253;c[t+112+8>>2]=-581039253;g[t+112+12>>2]=0.0;O=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;c[t+16>>2]=6132;c[t+16+4>>2]=6156;c[t+16+8>>2]=O;c[t+16+12>>2]=c[e>>2];c[t+16+12+4>>2]=c[e+4>>2];c[t+16+12+8>>2]=c[e+8>>2];c[t+16+12+12>>2]=c[e+12>>2];c[t+16+28>>2]=c[b>>2];c[t+16+28+4>>2]=c[b+4>>2];c[t+16+28+8>>2]=c[b+8>>2];c[t+16+28+12>>2]=c[b+12>>2];c[t+16+44>>2]=c[b+16>>2];c[t+16+44+4>>2]=c[b+16+4>>2];c[t+16+44+8>>2]=c[b+16+8>>2];c[t+16+44+12>>2]=c[b+16+12>>2];c[t+16+60>>2]=c[b+32>>2];c[t+16+60+4>>2]=c[b+32+4>>2];c[t+16+60+8>>2]=c[b+32+8>>2];c[t+16+60+12>>2]=c[b+32+12>>2];c[t+16+76>>2]=c[b+48>>2];c[t+16+76+4>>2]=c[b+48+4>>2];c[t+16+76+8>>2]=c[b+48+8>>2];c[t+16+76+12>>2]=c[b+48+12>>2];O=c[d+96>>2]|0;Vb[c[(c[O>>2]|0)+8>>2]&127](O,t+16+4|0,t+112|0,t+144|0);l=t;return}}}function Fc(b,d){b=b|0;d=d|0;var e=0,f=0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0.0,P=0,Q=0,R=0,S=0,T=0,U=0.0,V=0.0,W=0.0;T=l;l=l+144|0;R=c[d+36>>2]|0;o=+g[(+g[R+88>>2]>0.0?b+16|0:b+20|0)>>2];if(a[R+100>>0]&1){l=T;return}P=c[b+8>>2]|0;t=c[P+4>>2]|0;Q=c[P+12>>2]|0;L=c[(c[b+4>>2]|0)+744>>2]|0;N=+g[R+8>>2]-+g[Q+48>>2];q=+g[R+12>>2]-+g[Q+52>>2];O=+g[R+16>>2]-+g[Q+56>>2];F=1.0/+g[L+76>>2];E=(N*+g[Q>>2]+q*+g[Q+16>>2]+O*+g[Q+32>>2])*F/3.0;I=E<0.0?~~(1.0-E):0;M=~~((E+ +(I|0)-+(~~(E+ +(I|0))|0))*3.0);u=(E+ +(I|0)-+(~~(E+ +(I|0))|0))*3.0-+(M|0);I=~~(E+ +(I|0))-I|0;E=F*(N*+g[Q+4>>2]+q*+g[Q+20>>2]+O*+g[Q+36>>2])/3.0;G=E<0.0?~~(1.0-E):0;J=~~((E+ +(G|0)-+(~~(E+ +(G|0))|0))*3.0);n=(E+ +(G|0)-+(~~(E+ +(G|0))|0))*3.0-+(J|0);G=~~(E+ +(G|0))-G|0;O=F*(N*+g[Q+8>>2]+q*+g[Q+24>>2]+O*+g[Q+40>>2])/3.0;H=O<0.0?~~(1.0-O):0;K=~~((O+ +(H|0)-+(~~(O+ +(H|0))|0))*3.0);q=(O+ +(H|0)-+(~~(O+ +(H|0))|0))*3.0-+(K|0);H=~~(O+ +(H|0))-H|0;p=(I>>>16<<11^(I&65535)+16^(I&65535)+16<<16)+(G&65535)+((I>>>16<<11^(I&65535)+16^(I&65535)+16<<16)>>>11)|0;p=(p^G>>>16<<11^p<<16)+(H&65535)+((p^G>>>16<<11^p<<16)>>>11)|0;p=(p^H>>>16<<11^p<<16)+(t&65535)+((p^H>>>16<<11^p<<16)>>>11)|0;p=((p^t>>>16<<11^p<<16)>>>11)+(p^t>>>16<<11^p<<16)|0;p=((p<<3^p)>>>5)+(p<<3^p)<<4^((p<<3^p)>>>5)+(p<<3^p);p=(((p>>>17)+p<<25^(p>>>17)+p)>>>6)+((p>>>17)+p<<25^(p>>>17)+p)|0;r=c[L+60>>2]|0;s=c[L+68>>2]|0;d=c[s+(((p>>>0)%(r>>>0)|0)<<2)>>2]|0;c[L+96>>2]=(c[L+96>>2]|0)+1;e=(c[L+92>>2]|0)+1|0;c[L+92>>2]=e;a:do if(!d)f=9;else while(1){if(((((c[d+272>>2]|0)==(p|0)?(c[d+256>>2]|0)==(I|0):0)?(c[d+260>>2]|0)==(G|0):0)?(c[d+264>>2]|0)==(H|0):0)?(c[d+276>>2]|0)==(t|0):0)break a;d=c[d+280>>2]|0;e=e+1|0;c[L+92>>2]=e;if(!d){f=9;break}}while(0);b:do if((f|0)==9){f=c[L+84>>2]|0;c[L+84>>2]=f+1;if((f|0)>=(c[L+88>>2]|0)){c[5760]=(c[5760]|0)+1;c:do if((r|0)>0){d=0;e=s;while(1){f=e+(d<<2)|0;e=c[f>>2]|0;c[f>>2]=0;if(e|0)do{f=e;e=c[e+280>>2]|0;cJ(f)}while((e|0)!=0);d=d+1|0;if((d|0)==(r|0))break c;e=c[L+68>>2]|0}}while(0);g[L+76>>2]=.25;c[L+80>>2]=0;c[L+84>>2]=0;c[L+92>>2]=1;c[L+96>>2]=1}d=Ds(284)|0;Yk(d|0,0,284)|0;c[d+280>>2]=c[s+(((p>>>0)%(r>>>0)|0)<<2)>>2];c[s+(((p>>>0)%(r>>>0)|0)<<2)>>2]=d;c[d+276>>2]=t;c[d+272>>2]=p;c[d+256>>2]=I;c[d+260>>2]=G;c[d+264>>2]=H;k=+g[L+76>>2];r=T+72+4|0;s=T+72+24|0;t=T+72+44|0;e=0;h=k;while(1){j=k*+(H|0)*3.0+ +(e|0)*h;f=0;while(1){i=k*+(G|0)*3.0+ +(f|0)*h;g[T>>2]=+(I|0)*3.0*k+h*0.0;g[T+4>>2]=i;g[T+8>>2]=j;g[T+12>>2]=0.0;p=c[d+276>>2]|0;c[T+72>>2]=1065353216;c[r>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;c[T+72+20>>2]=1065353216;c[s>>2]=0;c[s+4>>2]=0;c[s+8>>2]=0;c[s+12>>2]=0;c[T+72+40>>2]=1065353216;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;if((c[p+4>>2]|0)<20)h=+Yc(T,p,T+72|0,T+16|0);else h=0.0;g[d+(f<<4)+(e<<2)>>2]=h;g[T>>2]=+(I|0)*3.0*k+ +g[L+76>>2];g[T+4>>2]=i;g[T+8>>2]=j;g[T+12>>2]=0.0;p=c[d+276>>2]|0;c[T+72>>2]=1065353216;c[r>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;c[T+72+20>>2]=1065353216;c[s>>2]=0;c[s+4>>2]=0;c[s+8>>2]=0;c[s+12>>2]=0;c[T+72+40>>2]=1065353216;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;if((c[p+4>>2]|0)<20)h=+Yc(T,p,T+72|0,T+16|0);else h=0.0;g[d+64+(f<<4)+(e<<2)>>2]=h;g[T>>2]=+(I|0)*3.0*k+ +g[L+76>>2]*2.0;g[T+4>>2]=i;g[T+8>>2]=j;g[T+12>>2]=0.0;p=c[d+276>>2]|0;c[T+72>>2]=1065353216;c[r>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;c[T+72+20>>2]=1065353216;c[s>>2]=0;c[s+4>>2]=0;c[s+8>>2]=0;c[s+12>>2]=0;c[T+72+40>>2]=1065353216;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;if((c[p+4>>2]|0)<20)h=+Yc(T,p,T+72|0,T+16|0);else h=0.0;g[d+128+(f<<4)+(e<<2)>>2]=h;g[T>>2]=+(I|0)*3.0*k+ +g[L+76>>2]*3.0;g[T+4>>2]=i;g[T+8>>2]=j;g[T+12>>2]=0.0;p=c[d+276>>2]|0;c[T+72>>2]=1065353216;c[r>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;c[T+72+20>>2]=1065353216;c[s>>2]=0;c[s+4>>2]=0;c[s+8>>2]=0;c[s+12>>2]=0;c[T+72+40>>2]=1065353216;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;if((c[p+4>>2]|0)<20)h=+Yc(T,p,T+72|0,T+16|0);else h=0.0;g[d+192+(f<<4)+(e<<2)>>2]=h;f=f+1|0;if((f|0)==4)break;h=+g[L+76>>2]}e=e+1|0;if((e|0)==4)break b;h=+g[L+76>>2]}}while(0);c[d+268>>2]=c[L+80>>2];h=+g[d+(M<<6)+(J<<4)+(K<<2)>>2];C=+g[d+(M+1<<6)+(J<<4)+(K<<2)>>2];A=+g[d+(M+1<<6)+(J+1<<4)+(K<<2)>>2];B=+g[d+(M<<6)+(J+1<<4)+(K<<2)>>2];O=+g[d+(M<<6)+(J<<4)+(K+1<<2)>>2];N=+g[d+(M+1<<6)+(J<<4)+(K+1<<2)>>2];E=+g[d+(M+1<<6)+(J+1<<4)+(K+1<<2)>>2];F=+g[d+(M<<6)+(J+1<<4)+(K+1<<2)>>2];i=C-h+n*(A-B-(C-h))+q*(N-O+n*(E-F-(N-O))-(C-h+n*(A-B-(C-h))));j=B-h+u*(A-C-(B-h))+q*(F-O+u*(E-N-(F-O))-(B-h+u*(A-C-(B-h))));k=O-h+u*(N-C-(O-h))+n*(F-B+u*(E-A-(F-B))-(O-h+u*(N-C-(O-h))));m=1.0/+D(+(i*i+j*j+k*k));h=h+u*(C-h)+n*(B+u*(A-B)-(h+u*(C-h)));h=h+q*(O+u*(N-O)+n*(F+u*(E-F)-(O+u*(N-O)))-h)-o;if(!(h<0.0)){l=T;return}s=c[P+8>>2]|0;N=+g[Q>>2]*i*m+ +g[Q+4>>2]*j*m+ +g[Q+8>>2]*k*m;O=i*m*+g[Q+16>>2]+j*m*+g[Q+20>>2]+k*m*+g[Q+24>>2];F=i*m*+g[Q+32>>2]+j*m*+g[Q+36>>2]+k*m*+g[Q+40>>2];E=-(N*(+g[R+8>>2]-h*N)+O*(+g[R+12>>2]-h*O)+F*(+g[R+16>>2]-h*F));z=+g[R+88>>2];d=c[b+12>>2]|0;if(!d)q=0.0;else q=+g[d+404>>2];if(!(z+q>0.0)){l=T;return}if(!d)d=c[(c[b+8>>2]|0)+8>>2]|0;if((a[22464]|0)==0?Uz(22464)|0:0){e=23044;f=e+48|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0))}e=c[b+12>>2]|0;m=+g[R+8>>2];B=m-+g[d+52>>2];n=+g[R+12>>2];C=n-+g[d+56>>2];o=+g[R+16>>2];A=o-+g[d+60>>2];if(!e){Q=c[b+4>>2]|0;h=0.0;i=0.0;j=0.0;d=Q;k=+g[Q+512>>2]}else{j=+g[e+392>>2];i=+g[e+396>>2];y=+g[e+388>>2];d=c[b+4>>2]|0;k=+g[d+512>>2];h=(j*A-i*C+ +g[e+372>>2])*k;i=(+g[e+376>>2]+(i*B-A*y))*k;j=(C*y-j*B+ +g[e+380>>2])*k}W=m-+g[R+24>>2]-h;V=n-+g[R+28>>2]-i;U=o-+g[R+32>>2]-j;i=+g[d+376>>2]*+g[(c[(c[b+8>>2]|0)+8>>2]|0)+228>>2];y=1.0/k;Uh(T+72|0,q,(e|0)==0?23044:e+324|0,B,C,A);j=z+ +g[T+72>>2];k=+g[T+72+4>>2]+0.0;m=+g[T+72+8>>2]+0.0;n=+g[T+72+16>>2]+0.0;o=z+ +g[T+72+20>>2];q=+g[T+72+24>>2]+0.0;u=+g[T+72+32>>2]+0.0;v=+g[T+72+36>>2]+0.0;w=z+ +g[T+72+40>>2];x=1.0/(m*(n*v-o*u)+(j*(o*w-q*v)+k*(q*u-n*w)));r=c[b+4>>2]|0;h=z*+g[r+512>>2];i=(U-F*(W*N+V*O+U*F))*(U-F*(W*N+V*O+U*F))+((W-N*(W*N+V*O+U*F))*(W-N*(W*N+V*O+U*F))+(V-O*(W*N+V*O+U*F))*(V-O*(W*N+V*O+U*F)))>2]|0)+8>>2]|0)+204>>2]&3|0?r+388|0:r+384|0)>>2]|0;d=c[r+872>>2]|0;if((d|0)==(c[r+876>>2]|0)?(S=d|0?d<<1:1,(d|0)<(S|0)):0){if(!S)f=0;else{c[6995]=(c[6995]|0)+1;d=sc((S*104|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=d;d=c[r+872>>2]|0}if((d|0)>0){e=0;do{Q=f+(e*104|0)|0;P=c[r+880>>2]|0;M=P+(e*104|0)|0;c[Q>>2]=c[M>>2];c[Q+4>>2]=c[M+4>>2];c[Q+8>>2]=c[M+8>>2];c[Q+12>>2]=c[M+12>>2];c[Q+16>>2]=c[M+16>>2];c[Q+20>>2]=c[M+20>>2];c[Q+24>>2]=c[M+24>>2];Q=f+(e*104|0)+28|0;M=P+(e*104|0)+28|0;c[Q>>2]=c[M>>2];c[Q+4>>2]=c[M+4>>2];c[Q+8>>2]=c[M+8>>2];c[Q+12>>2]=c[M+12>>2];Q=P+(e*104|0)+44|0;M=f+(e*104|0)+44|0;c[M>>2]=c[Q>>2];c[M+4>>2]=c[Q+4>>2];c[M+8>>2]=c[Q+8>>2];c[M+12>>2]=c[Q+12>>2];M=P+(e*104|0)+60|0;Q=f+(e*104|0)+60|0;c[Q>>2]=c[M>>2];c[Q+4>>2]=c[M+4>>2];c[Q+8>>2]=c[M+8>>2];c[Q+12>>2]=c[M+12>>2];Q=f+(e*104|0)+76|0;P=P+(e*104|0)+76|0;c[Q>>2]=c[P>>2];c[Q+4>>2]=c[P+4>>2];c[Q+8>>2]=c[P+8>>2];c[Q+12>>2]=c[P+12>>2];c[Q+16>>2]=c[P+16>>2];c[Q+20>>2]=c[P+20>>2];c[Q+24>>2]=c[P+24>>2];e=e+1|0}while((e|0)!=(d|0))}d=c[r+880>>2]|0;if(d|0){if(a[r+884>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[r+880>>2]=0}a[r+884>>0]=1;c[r+880>>2]=f;c[r+876>>2]=S;d=c[r+872>>2]|0}Q=c[r+880>>2]|0;c[Q+(d*104|0)>>2]=s;g[Q+(d*104|0)+4>>2]=N;g[Q+(d*104|0)+8>>2]=O;g[Q+(d*104|0)+12>>2]=F;g[Q+(d*104|0)+16>>2]=0.0;g[Q+(d*104|0)+20>>2]=E;c[Q+(d*104|0)+24>>2]=R;g[Q+(d*104|0)+28>>2]=(n*v-o*u)*x*0.0+(y*(o*w-q*v)*x+(q*u-n*w)*x*0.0);g[Q+(d*104|0)+32>>2]=(k*u-j*v)*x*0.0+(y*(m*v-k*w)*x+(j*w-m*u)*x*0.0);g[Q+(d*104|0)+36>>2]=(j*o-k*n)*x*0.0+(y*(k*q-m*o)*x+(m*n-j*q)*x*0.0);g[Q+(d*104|0)+40>>2]=0.0;g[Q+(d*104|0)+44>>2]=(n*v-o*u)*x*0.0+((o*w-q*v)*x*0.0+y*(q*u-n*w)*x);g[Q+(d*104|0)+48>>2]=(k*u-j*v)*x*0.0+((m*v-k*w)*x*0.0+y*(j*w-m*u)*x);g[Q+(d*104|0)+52>>2]=(j*o-k*n)*x*0.0+((k*q-m*o)*x*0.0+y*(m*n-j*q)*x);g[Q+(d*104|0)+56>>2]=0.0;g[Q+(d*104|0)+60>>2]=y*(n*v-o*u)*x+((o*w-q*v)*x*0.0+(q*u-n*w)*x*0.0);g[Q+(d*104|0)+64>>2]=y*(k*u-j*v)*x+((m*v-k*w)*x*0.0+(j*w-m*u)*x*0.0);g[Q+(d*104|0)+68>>2]=y*(j*o-k*n)*x+((k*q-m*o)*x*0.0+(m*n-j*q)*x*0.0);g[Q+(d*104|0)+72>>2]=0.0;S=Q+(d*104|0)+76|0;g[S>>2]=B;g[Q+(d*104|0)+80>>2]=C;g[Q+(d*104|0)+84>>2]=A;g[Q+(d*104|0)+88>>2]=0.0;g[S+16>>2]=h;g[S+20>>2]=i;c[S+24>>2]=p;c[r+872>>2]=(c[r+872>>2]|0)+1;d=c[b+12>>2]|0;if(!d){l=T;return}if(c[d+204>>2]&3|0){l=T;return}if((c[d+220>>2]&-2|0)!=4)c[d+220>>2]=1;g[d+224>>2]=0.0;l=T;return} +function Ki(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;c[b>>2]=9184;if(a[b+152>>0]|0?(d=c[b+96>>2]|0,Ib[c[c[d>>2]>>2]&511](d),d=c[b+96>>2]|0,d|0):0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}f=c[b+160>>2]|0;if((f|0)>0){d=0;do{g=c[b+168>>2]|0;h=g+(d*20|0)+4|0;i=g+(d*20|0)+12|0;j=c[i>>2]|0;e=g+(d*20|0)+16|0;if(j|0){if(a[e>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[i>>2]=0}a[e>>0]=1;c[i>>2]=0;c[h>>2]=0;c[g+(d*20|0)+8>>2]=0;d=d+1|0}while((d|0)!=(f|0))}d=c[b+168>>2]|0;if(!d){a[b+172>>0]=1;c[b+168>>2]=0;c[b+160>>2]=0;j=b+164|0;c[j>>2]=0;j=b+4|0;b=b+44|0;Bl(b);Bl(j);return}if(a[b+172>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+168>>2]=0;a[b+172>>0]=1;c[b+168>>2]=0;c[b+160>>2]=0;j=b+164|0;c[j>>2]=0;j=b+4|0;b=b+44|0;Bl(b);Bl(j);return}function Li(b){b=b|0;var d=0,e=0,f=0,g=0;c[b>>2]=9068;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[b+24>>2]=0;a[b+44>>0]=1;c[b+40>>2]=0;c[b+32>>2]=0;c[b+36>>2]=0;a[b+64>>0]=1;c[b+60>>2]=0;c[b+52>>2]=0;c[b+56>>2]=0;c[b+68>>2]=0;c[6995]=(c[6995]|0)+1;d=sc(51)|0;if(!d)f=0;else{c[(d+4+15&-16)+-4>>2]=d;f=d+4+15&-16}e=c[b+8>>2]|0;if((e|0)>0){d=0;do{g=c[b+16>>2]|0;c[f+(d<<4)>>2]=c[g+(d<<4)>>2];c[f+(d<<4)+4>>2]=c[g+(d<<4)+4>>2];c[f+(d<<4)+8>>2]=c[g+(d<<4)+8>>2];c[f+(d<<4)+12>>2]=c[g+(d<<4)+12>>2];d=d+1|0}while((d|0)!=(e|0))}d=c[b+16>>2]|0;if(!d){a[b+20>>0]=1;c[b+16>>2]=f;c[b+12>>2]=2;Kf(b);return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;a[b+20>>0]=1;c[b+16>>2]=f;c[b+12>>2]=2;Kf(b);return}function Mi(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=c[d>>2]|0;d=c[b+328>>2]|0;a:do if((d|0)>0){f=c[b+336>>2]|0;e=0;while(1){if((c[f+(e<<2)>>2]|0)==(g|0))break;e=e+1|0;if((e|0)>=(d|0))break a}if((e|0)!=(d|0))return}while(0);if((d|0)==(c[b+332>>2]|0)?(h=d|0?d<<1:1,(d|0)<(h|0)):0){if(!h)f=0;else{c[6995]=(c[6995]|0)+1;d=sc((h<<2|3)+16|0)|0;if(!d)d=0;else{c[(d+4+15&-16)+-4>>2]=d;d=d+4+15&-16}f=d;d=c[b+328>>2]|0}if((d|0)>0){e=0;do{c[f+(e<<2)>>2]=c[(c[b+336>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(d|0))}e=c[b+336>>2]|0;if(e){if(a[b+340>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0);d=c[b+328>>2]|0}c[b+336>>2]=0}a[b+340>>0]=1;c[b+336>>2]=f;c[b+332>>2]=h}c[(c[b+336>>2]|0)+(d<<2)>>2]=g;c[b+328>>2]=d+1;return}function Ni(a,b,d){a=a|0;b=b|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;while(1){m=c[a+12>>2]|0;n=c[m+(((b+d|0)/2|0)<<2)>>2]|0;f=b;e=d;while(1){l=c[n+28>>2]|0;l=c[((c[l+208>>2]|0)>-1?l:c[n+32>>2]|0)+208>>2]|0;while(1){h=m+(f<<2)|0;i=c[h>>2]|0;k=c[i+28>>2]|0;j=f+1|0;if((c[((c[k+208>>2]|0)>-1?k:c[i+32>>2]|0)+208>>2]|0)<(l|0))f=j;else break}while(1){g=c[m+(e<<2)>>2]|0;o=c[g+28>>2]|0;k=e+-1|0;if((l|0)<(c[((c[o+208>>2]|0)>-1?o:c[g+32>>2]|0)+208>>2]|0))e=k;else break}if((f|0)<=(e|0)){c[h>>2]=g;c[(c[a+12>>2]|0)+(e<<2)>>2]=i;f=j;e=k}if((f|0)>(e|0))break;m=c[a+12>>2]|0}if((e|0)>(b|0))Ni(a,b,e);if((f|0)<(d|0))b=f;else break}return}function Oi(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;do if(!(qD(b,c[d+8>>2]|0)|0)){if(!(qD(b,c[d>>2]|0)|0)){h=c[b+8>>2]|0;Zb[c[(c[h>>2]|0)+24>>2]&31](h,d,e,f,g);break}if((c[d+16>>2]|0)!=(e|0)?(c[d+20>>2]|0)!=(e|0):0){c[d+32>>2]=f;if((c[d+44>>2]|0)==4)break;a[d+52>>0]=0;a[d+53>>0]=0;f=c[b+8>>2]|0;$b[c[(c[f>>2]|0)+20>>2]&7](f,d,e,e,1,g);if(a[d+53>>0]|0)if(!(a[d+52>>0]|0)){b=3;h=11}else b=3;else{b=4;h=11}if((h|0)==11){c[d+20>>2]=e;c[d+40>>2]=(c[d+40>>2]|0)+1;if((c[d+36>>2]|0)==1?(c[d+24>>2]|0)==2:0)a[d+54>>0]=1}c[d+44>>2]=b;break}if((f|0)==1)c[d+32>>2]=1}else qs(d,e,f);while(0);return}function Pi(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0,h=0,i=0,k=0.0,m=0.0,n=0.0;i=l;l=l+16|0;c[i>>2]=c[a+32>>2];c[i+4>>2]=c[a+32+4>>2];c[i+8>>2]=c[a+32+8>>2];c[i+12>>2]=c[a+32+12>>2];n=+nb[c[(c[a>>2]|0)+48>>2]&15](a);m=+nb[c[(c[a>>2]|0)+48>>2]&15](a);k=+nb[c[(c[a>>2]|0)+48>>2]&15](a);g[i>>2]=n+ +g[i>>2];g[i+4>>2]=m+ +g[i+4>>2];g[i+8>>2]=k+ +g[i+8>>2];f=c[a+56>>2]|0;switch(f|0){case 0:{a=0;e=1;break}case 2:{a=2;e=0;break}default:{a=1;e=0}}n=+g[i+(e<<2)>>2];m=+g[i+(a<<2)>>2];h=(g[j>>2]=b*.25*n*n+b/12.0*m*m*4.0,c[j>>2]|0);a=(g[j>>2]=b*.5*n*n,c[j>>2]|0);switch(f|0){case 0:{e=h;f=h;break}case 2:{e=a;f=h;a=h;break}default:{e=h;f=a;a=h}}c[d>>2]=a;c[d+4>>2]=f;c[d+8>>2]=e;g[d+12>>2]=0.0;l=i;return}function Qi(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;c[a>>2]=4060;if((c[a+104>>2]|0)<=0){a=a+60|0;gj(a);kj(a);return}k=0;do{j=c[(c[a+4>>2]|0)+744>>2]|0;h=(c[a+112>>2]|0)+(k<<3)+4|0;b=c[h>>2]|0;if((c[j+60>>2]|0)>0){g=0;do{i=(c[j+68>>2]|0)+(g<<2)|0;d=c[i>>2]|0;a:do if(d|0){e=0;do{f=e|0?e+280|0:i;e=d;while(1){d=c[e+280>>2]|0;if((c[e+276>>2]|0)!=(b|0))break;c[f>>2]=d;cJ(e);if(!d)break a;else e=d}}while((d|0)!=0)}while(0);g=g+1|0}while((g|0)<(c[j+60>>2]|0));b=c[h>>2]|0}if(b|0)Ib[c[(c[b>>2]|0)+4>>2]&511](b);k=k+1|0}while((k|0)<(c[a+104>>2]|0));a=a+60|0;gj(a);kj(a);return}function Ri(b){b=b|0;var d=0,e=0;d=c[b+92>>2]|0;if(d|0){if(a[b+96>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+92>>2]=0}a[b+96>>0]=1;c[b+92>>2]=0;c[b+84>>2]=0;c[b+88>>2]=0;d=c[b+64>>2]|0;if(d|0)do{c[b+64>>2]=c[d+8>>2];e=c[d>>2]|0;if(e|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);d=c[b+64>>2]|0}while((d|0)!=0);d=c[b+48>>2]|0;if(d|0)do{c[b+48>>2]=c[d+8>>2];e=c[d>>2]|0;if(e|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);d=c[b+48>>2]|0}while((d|0)!=0);d=c[b+32>>2]|0;if(!d)return;do{c[b+32>>2]=c[d+8>>2];e=c[d>>2]|0;if(e|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);d=c[b+32>>2]|0}while((d|0)!=0);return}function Si(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;i=c[d>>2]|0;i=zb[c[(c[i>>2]|0)+56>>2]&31](i,28)|0;j=(a[b+4>>0]|0)==0;h=c[b+8>>2]|0;g=c[b+12>>2]|0;b=c[d>>2]|0;c[i+4>>2]=b;c[i>>2]=5792;a[i+8>>0]=0;c[i+12>>2]=0;if(j){a[i+16>>0]=0;c[i+20>>2]=h;c[i+24>>2]=g;if(!(Bb[c[(c[b>>2]|0)+24>>2]&63](b,c[e+8>>2]|0,c[f+8>>2]|0)|0))return i|0;j=c[i+4>>2]|0;c[i+12>>2]=Bb[c[(c[j>>2]|0)+12>>2]&63](j,c[e+8>>2]|0,c[f+8>>2]|0)|0;a[i+8>>0]=1;return i|0}else{a[i+16>>0]=1;c[i+20>>2]=h;c[i+24>>2]=g;if(!(Bb[c[(c[b>>2]|0)+24>>2]&63](b,c[f+8>>2]|0,c[e+8>>2]|0)|0))return i|0;j=c[i+4>>2]|0;c[i+12>>2]=Bb[c[(c[j>>2]|0)+12>>2]&63](j,c[f+8>>2]|0,c[e+8>>2]|0)|0;a[i+8>>0]=1;return i|0}return 0}function Ti(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0;if(qD(b,c[d+8>>2]|0)|0)ml(d,e,f,g);else{j=a[d+52>>0]|0;k=a[d+53>>0]|0;l=c[b+12>>2]|0;a[d+52>>0]=0;a[d+53>>0]=0;ao(b+16|0,d,e,f,g,h);a:do if((l|0)>1){i=b+24|0;do{if(a[d+54>>0]|0)break a;if(!(a[d+52>>0]|0)){if(a[d+53>>0]|0?(c[b+8>>2]&1|0)==0:0)break a}else{if((c[d+24>>2]|0)==1)break a;if(!(c[b+8>>2]&2))break a}a[d+52>>0]=0;a[d+53>>0]=0;ao(i,d,e,f,g,h);i=i+8|0}while(i>>>0<(b+16+(l<<3)|0)>>>0)}while(0);a[d+52>>0]=j;a[d+53>>0]=k}return}function Ui(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;n=(c[b>>2]|0)+1794895138|0;f=mB(c[b+8>>2]|0,n)|0;k=mB(c[b+12>>2]|0,n)|0;m=mB(c[b+16>>2]|0,n)|0;a:do if((f>>>0>>2>>>0?k>>>0<(d-(f<<2)|0)>>>0&m>>>0<(d-(f<<2)|0)>>>0:0)?((m|k)&3|0)==0:0){j=0;while(1){i=f>>>1;l=j+i|0;g=mB(c[b+((l<<1)+(k>>>2)<<2)>>2]|0,n)|0;h=mB(c[b+((l<<1)+(k>>>2)+1<<2)>>2]|0,n)|0;if(!(h>>>0>>0&g>>>0<(d-h|0)>>>0)){f=0;break a}if(a[b+(h+g)>>0]|0){f=0;break a}g=Vo(e,b+h|0)|0;if(!g)break;if((f|0)==1){f=0;break a}else{j=(g|0)<0?j:l;f=(g|0)<0?i:f-i|0}}g=mB(c[b+((l<<1)+(m>>>2)<<2)>>2]|0,n)|0;f=mB(c[b+((l<<1)+(m>>>2)+1<<2)>>2]|0,n)|0;if(f>>>0>>0&g>>>0<(d-f|0)>>>0)f=(a[b+(f+g)>>0]|0)==0?b+f|0:0;else f=0}else f=0;while(0);return f|0}function Vi(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,i=0.0,j=0.0,k=0,m=0;f=l;l=l+48|0;if((c[b+128>>2]|0)<=0){l=f;return}e=0;do{m=c[b+136>>2]|0;c[f+32>>2]=(a[m+(e*284|0)+84>>0]|0)==0?1065353216:0;c[f+32+4>>2]=0;c[f+32+8>>2]=1065353216;g[f+32+12>>2]=0.0;k=m+(e*284|0)+140|0;c[f+16>>2]=c[k>>2];c[f+16+4>>2]=c[k+4>>2];c[f+16+8>>2]=c[k+8>>2];c[f+16+12>>2]=c[k+12>>2];k=c[b+112>>2]|0;h=c[(c[d>>2]|0)+16>>2]|0;j=+g[m+(e*284|0)+108+(k<<2)>>2]+ +g[f+16+4>>2];i=+g[m+(e*284|0)+124+(k<<2)>>2]+ +g[f+16+8>>2];g[f>>2]=+g[m+(e*284|0)+92+(k<<2)>>2]+ +g[f+16>>2];g[f+4>>2]=j;g[f+8>>2]=i;g[f+12>>2]=0.0;Vb[h&127](d,f+16|0,f,f+32|0);Vb[c[(c[d>>2]|0)+16>>2]&127](d,f+16|0,(c[b+136>>2]|0)+(e*284|0)+16|0,f+32|0);e=e+1|0}while((e|0)<(c[b+128>>2]|0));l=f;return}function Wi(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;switch(b|0){case 2:{if((e|0)<1){g[a+232>>2]=d;c[a+300>>2]=c[a+300>>2]|512;return}if((e|0)<3){g[a+264>>2]=d;c[a+300>>2]=c[a+300>>2]|32;return}if((e|0)==3){g[a+248>>2]=d;c[a+300>>2]=c[a+300>>2]|2048;return}if((e|0)>=6)return;g[a+280>>2]=d;c[a+300>>2]=c[a+300>>2]|128;return}case 3:{if((e|0)<1){g[a+212>>2]=d;c[a+300>>2]=c[a+300>>2]|1;return}if((e|0)!=3)return;g[a+228>>2]=d;c[a+300>>2]=c[a+300>>2]|4;return}case 4:{if((e|0)<1){g[a+244>>2]=d;c[a+300>>2]=c[a+300>>2]|256;return}if((e|0)<3){g[a+276>>2]=d;c[a+300>>2]=c[a+300>>2]|16;return}if((e|0)==3){g[a+260>>2]=d;c[a+300>>2]=c[a+300>>2]|1024;return}if((e|0)>=6)return;g[a+292>>2]=d;c[a+300>>2]=c[a+300>>2]|64;return}default:return}}function Xi(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0;e=l;l=l+96|0;c[e+32>>2]=1065353216;c[e+32+4>>2]=0;c[e+32+4+4>>2]=0;c[e+32+4+8>>2]=0;c[e+32+4+12>>2]=0;c[e+32+20>>2]=1065353216;c[e+32+24>>2]=0;c[e+32+24+4>>2]=0;c[e+32+24+8>>2]=0;c[e+32+24+12>>2]=0;c[e+32+40>>2]=1065353216;k=e+32+44|0;c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0;Vb[c[(c[a>>2]|0)+8>>2]&127](a,e+32|0,e+16|0,e);i=(+g[e>>2]-+g[e+16>>2])*.5;h=(+g[e+4>>2]-+g[e+16+4>>2])*.5;j=(+g[e+8>>2]-+g[e+16+8>>2])*.5;f=+nb[c[(c[a>>2]|0)+48>>2]&15](a);g[d>>2]=b*.0833333283662796*((h+f)*2.0*(h+f)*2.0+(j+f)*2.0*(j+f)*2.0);g[d+4>>2]=b*.0833333283662796*((i+f)*2.0*(i+f)*2.0+(j+f)*2.0*(j+f)*2.0);g[d+8>>2]=b*.0833333283662796*((i+f)*2.0*(i+f)*2.0+(h+f)*2.0*(h+f)*2.0);g[d+12>>2]=0.0;l=e;return}function Yi(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0;l=c[b+780>>2]|0;a:do if(h?(k=c[b+792>>2]|0,(k|0)>0):0){i=c[b+800>>2]|0;h=0;while(1){j=c[i+(h*52|0)+24>>2]|0;if((j|0)==(l+(d*104|0)|0)?(c[i+(h*52|0)+28>>2]|0)==(l+(e*104|0)|0):0){h=10;break}if((j|0)==(l+(e*104|0)|0)?(c[i+(h*52|0)+28>>2]|0)==(l+(d*104|0)|0):0){h=10;break}h=h+1|0;if((h|0)>=(k|0))break a}if((h|0)==10)return}while(0);Xh(b,f);f=(c[b+792>>2]|0)+-1|0;k=c[b+800>>2]|0;c[k+(f*52|0)+24>>2]=l+(d*104|0);c[k+(f*52|0)+28>>2]=l+(e*104|0);o=+g[l+(d*104|0)+8>>2]-+g[l+(e*104|0)+8>>2];n=+g[l+(d*104|0)+12>>2]-+g[l+(e*104|0)+12>>2];m=+g[l+(d*104|0)+16>>2]-+g[l+(e*104|0)+16>>2];g[k+(f*52|0)+32>>2]=+D(+(o*o+n*n+m*m));a[b+984>>0]=1;return}function Zi(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;h=+g[b+52>>2];i=+g[b+56>>2];f=+g[b+60>>2];if(!(a[b+84>>0]|0)){c[b+32>>2]=c[b+204>>2];g[b>>2]=-h;g[b+4>>2]=-i;g[b+8>>2]=-f;g[b+12>>2]=0.0;h=0.0;i=1.0;d=b+272|0;g[d>>2]=h;d=b+268|0;g[d>>2]=i;return}else{m=+g[b>>2];l=+g[b+4>>2];k=+g[b+8>>2];n=+g[b+16>>2]-+g[d+52>>2];p=+g[b+20>>2]-+g[d+56>>2];q=+g[b+24>>2]-+g[d+60>>2];j=+g[d+392>>2];r=+g[d+396>>2];o=+g[d+388>>2];j=!(m*h+l*i+k*f>=-.10000000149011612)?-1.0/(m*h+l*i+k*f)*(m*(j*q-p*r+ +g[d+372>>2])+l*(+g[d+376>>2]+(n*r-q*o))+k*(p*o-n*j+ +g[d+380>>2])):0.0;i=!(m*h+l*i+k*f>=-.10000000149011612)?-1.0/(m*h+l*i+k*f):10.0;d=b+272|0;g[d>>2]=j;d=b+268|0;g[d>>2]=i;return}}function _i(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0;e=l;l=l+96|0;j=+g[c>>2];k=+g[c+4>>2];m=+g[c+8>>2];Qq(e+80|0,j,k,m,+Iy(j,k,m,+g[b>>2],+g[b+4>>2],+g[b+8>>2]));m=+g[e+80>>2];k=+g[e+80+4>>2];j=+g[e+80+8>>2];kq(e+64|0,+g[b>>2],+g[b+4>>2],+g[b+8>>2],m,k,j);Ap(e+48|0,+g[c>>2],+g[c+4>>2],+g[c+8>>2],+g[b>>2],+g[b+4>>2],+g[b+8>>2]);i=+g[e+48>>2];h=+g[e+48+4>>2];f=+g[e+48+8>>2];n=+XI(d);Qq(e+16|0,+g[e+64>>2],+g[e+64+4>>2],+g[e+64+8>>2],n);iq(e+32|0,m,k,j,+g[e+16>>2],+g[e+16+4>>2],+g[e+16+8>>2]);Qq(e,i,h,f,+WI(d));iq(a,+g[e+32>>2],+g[e+32+4>>2],+g[e+32+8>>2],+g[e>>2],+g[e+4>>2],+g[e+8>>2]);l=e;return}function $i(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=c[b+228>>2]|0;if((f|0)==(c[b+232>>2]|0)?(i=f|0?f<<1:1,(f|0)<(i|0)):0){if(!i)h=0;else{c[6995]=(c[6995]|0)+1;f=sc((i<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=f;f=c[b+228>>2]|0}if((f|0)>0){g=0;do{c[h+(g<<2)>>2]=c[(c[b+236>>2]|0)+(g<<2)>>2];g=g+1|0}while((g|0)!=(f|0))}g=c[b+236>>2]|0;if(g){if(a[b+240>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);f=c[b+228>>2]|0}c[b+236>>2]=0}a[b+240>>0]=1;c[b+236>>2]=h;c[b+232>>2]=i}c[(c[b+236>>2]|0)+(f<<2)>>2]=d;c[b+228>>2]=f+1;if(!e)return;ff(c[d+28>>2]|0,d);ff(c[d+32>>2]|0,d);return}function aj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0;e=c[a+4>>2]|0;if(e|0)ll(e,b,d);a=c[a>>2]|0;if(!a)return;m=+g[b>>2];k=+g[a+128>>2];l=+g[b+4>>2];j=+g[b+8>>2];f=+g[d+4>>2];o=+g[d+8>>2];n=+g[d>>2];i=+g[a+180>>2]*(j*f-l*o)+ +g[a+184>>2]*(m*o-j*n)+(l*n-m*f)*+g[a+188>>2];h=(j*f-l*o)*+g[a+196>>2]+(m*o-j*n)*+g[a+200>>2]+(l*n-m*f)*+g[a+204>>2];f=(j*f-l*o)*+g[a+212>>2]+(m*o-j*n)*+g[a+216>>2]+(l*n-m*f)*+g[a+220>>2];g[a+276>>2]=m*k+ +g[a+276>>2];g[a+280>>2]=k*l+ +g[a+280>>2];g[a+284>>2]=k*j+ +g[a+284>>2];g[a+292>>2]=i+ +g[a+292>>2];g[a+296>>2]=h+ +g[a+296>>2];g[a+300>>2]=f+ +g[a+300>>2];c[a+312>>2]=(c[a+312>>2]|0)+1;return}function bj(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0;v=+g[a+552>>2];u=+g[a+568>>2];t=+g[a+584>>2];s=+g[b>>2];r=+g[b+4>>2];q=+g[b+8>>2];o=+g[b+16>>2];n=+g[b+20>>2];m=+g[b+24>>2];k=+g[b+32>>2];i=+g[b+36>>2];f=+g[b+40>>2];j=+g[a+556>>2];h=+g[a+572>>2];e=+g[a+588>>2];x=+g[a+620>>2];w=+g[a+636>>2];d=+g[a+652>>2];p=x*+g[c>>2]+w*+g[c+4>>2]+d*+g[c+8>>2];l=x*+g[c+16>>2]+w*+g[c+20>>2]+d*+g[c+24>>2];d=x*+g[c+32>>2]+w*+g[c+36>>2]+d*+g[c+40>>2];d=+L(+((v*s+u*r+t*q)*p+(v*o+u*n+t*m)*l+(v*k+u*i+t*f)*d),+((s*j+r*h+q*e)*p+(o*j+n*h+m*e)*l+(k*j+i*h+f*e)*d));return +(d*+g[a+732>>2])}function cj(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;c[b>>2]=6576;d=c[b+84>>2]|0;g=c[d+8>>2]|0;if((g|0)>0){e=0;do{f=c[(c[d+16>>2]|0)+(e*12|0)+8>>2]|0;if(f|0){Ib[c[c[f>>2]>>2]&511](f);h=c[b+4>>2]|0;Ob[c[(c[h>>2]|0)+60>>2]&127](h,f)}e=e+1|0}while((e|0)!=(g|0));d=c[b+84>>2]|0}Rh(d);d=c[b+84>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+84>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+100>>2]|0;if(!d){a[b+104>>0]=1;c[b+100>>2]=0;c[b+92>>2]=0;h=b+96|0;c[h>>2]=0;Gi(b);return}if(a[b+104>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+100>>2]=0;a[b+104>>0]=1;c[b+100>>2]=0;c[b+92>>2]=0;h=b+96|0;c[h>>2]=0;Gi(b);return}function dj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=c[a+8>>2]|0;if((d|0)>0){f=0;do{e=c[(c[a+16>>2]|0)+(f<<2)>>2]|0;if(c[e+252>>2]&2){g=xb[c[(c[e>>2]|0)+16>>2]&127](e)|0;g=Bb[c[(c[b>>2]|0)+16>>2]&63](b,g,1)|0;d=Bb[c[(c[e>>2]|0)+20>>2]&63](e,c[g+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,g,d,1497645650,e);d=c[a+8>>2]|0}f=f+1|0}while((f|0)<(d|0))}if((c[a+228>>2]|0)<=0)return;d=0;do{g=c[(c[a+236>>2]|0)+(d<<2)>>2]|0;e=xb[c[(c[g>>2]|0)+36>>2]&127](g)|0;e=Bb[c[(c[b>>2]|0)+16>>2]&63](b,e,1)|0;f=Bb[c[(c[g>>2]|0)+40>>2]&63](g,c[e+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,f,1397641027,g);d=d+1|0}while((d|0)<(c[a+228>>2]|0));return}function ej(a){a=a|0;var b=0.0,d=0,e=0,f=0,h=0;e=l;l=l+32|0;c[a+36>>2]=1566444395;c[a+40>>2]=1566444395;c[a+44>>2]=1566444395;g[a+48>>2]=0.0;c[a+52>>2]=-581039253;c[a+56>>2]=-581039253;c[a+60>>2]=-581039253;g[a+64>>2]=0.0;if((c[a+20>>2]|0)<=0){l=e;return}d=0;do{f=c[a+28>>2]|0;h=c[f+(d*80|0)+64>>2]|0;Vb[c[(c[h>>2]|0)+8>>2]&127](h,f+(d*80|0)|0,e+16|0,e);b=+g[e+16>>2];if(+g[a+36>>2]>b)g[a+36>>2]=b;b=+g[e>>2];if(+g[a+52>>2]>2]=b;b=+g[e+16+4>>2];if(+g[a+40>>2]>b)g[a+40>>2]=b;b=+g[e+4>>2];if(+g[a+56>>2]>2]=b;b=+g[e+16+8>>2];if(+g[a+44>>2]>b)g[a+44>>2]=b;b=+g[e+8>>2];if(+g[a+60>>2]>2]=b;d=d+1|0}while((d|0)<(c[a+20>>2]|0));l=e;return}function fj(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+64|0;h=c[d>>2]|0;g=d+(c[h+-8>>2]|0)|0;h=c[h+-4>>2]|0;c[i>>2]=e;c[i+4>>2]=d;c[i+8>>2]=2808;d=qD(h,e)|0;e=i+12|0;f=e+40|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));b[i+12+40>>1]=0;a[i+12+42>>0]=0;a:do if(d){c[i+48>>2]=1;$b[c[(c[h>>2]|0)+20>>2]&7](h,i,g,g,1,0);d=(c[i+24>>2]|0)==1?g:0}else{Zb[c[(c[h>>2]|0)+24>>2]&31](h,i,g,1,0);switch(c[i+36>>2]|0){case 0:{d=((c[i+40>>2]|0)==1?(c[i+28>>2]|0)==1:0)&(c[i+32>>2]|0)==1?c[i+20>>2]|0:0;break a}case 1:break;default:{d=0;break a}}if((c[i+24>>2]|0)!=1?!(((c[i+40>>2]|0)==0?(c[i+28>>2]|0)==1:0)&(c[i+32>>2]|0)==1):0){d=0;break}d=c[i+16>>2]|0}while(0);l=i;return d|0}function gj(b){b=b|0;var d=0;d=c[b+12>>2]|0;if(d|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;d=c[b+32>>2]|0;if(d|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;d=c[b+52>>2]|0;if(d|0){if(a[b+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+52>>2]=0}a[b+56>>0]=1;c[b+52>>2]=0;c[b+44>>2]=0;c[b+48>>2]=0;d=c[b+72>>2]|0;if(!d){a[b+76>>0]=1;c[b+72>>2]=0;c[b+64>>2]=0;b=b+68|0;c[b>>2]=0;return}if(a[b+76>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+72>>2]=0;a[b+76>>0]=1;c[b+72>>2]=0;c[b+64>>2]=0;b=b+68|0;c[b>>2]=0;return}function hj(){var b=0;b=Os()|0;c[b>>2]=5052;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;a[b+80>>0]=1;c[b+76>>2]=0;c[b+68>>2]=0;c[b+72>>2]=0;a[b+100>>0]=1;c[b+96>>2]=0;c[b+88>>2]=0;c[b+92>>2]=0;a[b+120>>0]=1;c[b+116>>2]=0;c[b+108>>2]=0;c[b+112>>2]=0;a[b+140>>0]=1;c[b+136>>2]=0;c[b+128>>2]=0;c[b+132>>2]=0;a[b+160>>0]=1;c[b+156>>2]=0;c[b+148>>2]=0;c[b+152>>2]=0;a[b+180>>0]=1;c[b+176>>2]=0;c[b+168>>2]=0;c[b+172>>2]=0;a[b+208>>0]=1;c[b+204>>2]=0;c[b+196>>2]=0;c[b+200>>2]=0;c[b+232>>2]=0;c[b+224>>2]=0;c[b+212>>2]=14;c[b+216>>2]=15;c[b+220>>2]=16;return b|0}function ij(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=c[b+348>>2]|0;if((g|0)==(c[b+352>>2]|0)?(j=g|0?g<<1:1,(g|0)<(j|0)):0){if(!j)i=0;else{c[6995]=(c[6995]|0)+1;g=sc((j<<2|3)+16|0)|0;if(!g)g=0;else{c[(g+4+15&-16)+-4>>2]=g;g=g+4+15&-16}i=g;g=c[b+348>>2]|0}if((g|0)>0){h=0;do{c[i+(h<<2)>>2]=c[(c[b+356>>2]|0)+(h<<2)>>2];h=h+1|0}while((h|0)!=(g|0))}h=c[b+356>>2]|0;if(h){if(a[b+360>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);g=c[b+348>>2]|0}c[b+356>>2]=0}a[b+360>>0]=1;c[b+356>>2]=i;c[b+352>>2]=j}c[(c[b+356>>2]|0)+(g<<2)>>2]=d;c[b+348>>2]=g+1;c[d+344>>2]=c[b+472>>2];Og(b,d,e<<16>>16,f<<16>>16);return}function jj(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0;e=l;l=l+96|0;i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);c[e+32>>2]=1065353216;c[e+32+4>>2]=0;c[e+32+4+4>>2]=0;c[e+32+4+8>>2]=0;c[e+32+4+12>>2]=0;c[e+32+20>>2]=1065353216;c[e+32+24>>2]=0;c[e+32+24+4>>2]=0;c[e+32+24+8>>2]=0;c[e+32+24+12>>2]=0;c[e+32+40>>2]=1065353216;j=e+32+44|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;Vb[c[(c[a>>2]|0)+8>>2]&127](a,e+32|0,e+16|0,e);h=(i+(+g[e>>2]-+g[e+16>>2])*.5)*2.0;f=(i+(+g[e+4>>2]-+g[e+16+4>>2])*.5)*2.0;i=(i+(+g[e+8>>2]-+g[e+16+8>>2])*.5)*2.0;g[d>>2]=b*.0833333283662796*(f*f+i*i);g[d+4>>2]=b*.0833333283662796*(h*h+i*i);g[d+8>>2]=b*.0833333283662796*(h*h+f*f);g[d+12>>2]=0.0;l=e;return}function kj(b){b=b|0;var d=0;d=c[b+72>>2]|0;if(d|0){if(a[b+76>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+72>>2]=0}a[b+76>>0]=1;c[b+72>>2]=0;c[b+64>>2]=0;c[b+68>>2]=0;d=c[b+52>>2]|0;if(d|0){if(a[b+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+52>>2]=0}a[b+56>>0]=1;c[b+52>>2]=0;c[b+44>>2]=0;c[b+48>>2]=0;d=c[b+32>>2]|0;if(d|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;d=c[b+12>>2]|0;if(!d){a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;b=b+8|0;c[b>>2]=0;return}if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+12>>2]=0;a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;b=b+8|0;c[b>>2]=0;return}function lj(a,b){a=a|0;b=+b;var d=0,e=0,f=0,h=0.0,i=0.0,j=0.0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0;e=c[a+792>>2]|0;if((e|0)<=0)return;d=c[a+800>>2]|0;a=0;do{n=c[d+(a*52|0)+24>>2]|0;f=c[d+(a*52|0)+28>>2]|0;s=+g[n+40>>2];q=+g[n+44>>2];i=+g[n+48>>2];k=d+(a*52|0)+8|0;r=+g[k>>2];m=d+(a*52|0)+12|0;p=+g[m>>2];l=d+(a*52|0)+16|0;o=+g[l>>2];j=-(+g[d+(a*52|0)+48>>2]*((s-+g[f+40>>2])*r+(q-+g[f+44>>2])*p+(i-+g[f+48>>2])*o)*b);h=+g[n+88>>2]*j;g[n+40>>2]=s+r*h;g[n+44>>2]=q+p*h;g[n+48>>2]=o*h+i;j=+g[f+88>>2]*j;i=j*+g[m>>2];h=j*+g[l>>2];g[f+40>>2]=+g[f+40>>2]-+g[k>>2]*j;g[f+44>>2]=+g[f+44>>2]-i;g[f+48>>2]=+g[f+48>>2]-h;a=a+1|0}while((a|0)!=(e|0));return}function mj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=c[b+12>>2]|0;if(!e)return;if(!(a[b+8>>0]|0))return;f=c[d+4>>2]|0;if((f|0)==(c[d+8>>2]|0)?(h=f|0?f<<1:1,(f|0)<(h|0)):0){if(!h)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((h<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[d+4>>2]|0}if((f|0)>0){g=0;do{c[e+(g<<2)>>2]=c[(c[d+12>>2]|0)+(g<<2)>>2];g=g+1|0}while((g|0)!=(f|0))}g=c[d+12>>2]|0;if(g){if(a[d+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);f=c[d+4>>2]|0}c[d+12>>2]=0}a[d+16>>0]=1;c[d+12>>2]=e;c[d+8>>2]=h;e=c[b+12>>2]|0}c[(c[d+12>>2]|0)+(f<<2)>>2]=e;c[d+4>>2]=f+1;return}function nj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=c[b+56>>2]|0;if(!e)return;if(!(a[b+52>>0]|0))return;f=c[d+4>>2]|0;if((f|0)==(c[d+8>>2]|0)?(h=f|0?f<<1:1,(f|0)<(h|0)):0){if(!h)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((h<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[d+4>>2]|0}if((f|0)>0){g=0;do{c[e+(g<<2)>>2]=c[(c[d+12>>2]|0)+(g<<2)>>2];g=g+1|0}while((g|0)!=(f|0))}g=c[d+12>>2]|0;if(g){if(a[d+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);f=c[d+4>>2]|0}c[d+12>>2]=0}a[d+16>>0]=1;c[d+12>>2]=e;c[d+8>>2]=h;e=c[b+56>>2]|0}c[(c[d+12>>2]|0)+(f<<2)>>2]=e;c[d+4>>2]=f+1;return}function oj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;k=+g[a+24>>2];i=+g[a+28>>2];j=+g[a+32>>2];f=k*+g[b>>2]+i*+g[b+4>>2]+j*+g[b+8>>2];h=+g[a+20>>2];if(f>h){g[a+20>>2]=f;c[a+4>>2]=c[b>>2];c[a+4+4>>2]=c[b+4>>2];c[a+4+8>>2]=c[b+8>>2];c[a+4+12>>2]=c[b+12>>2]}else f=h;h=k*+g[b+16>>2]+i*+g[b+20>>2]+j*+g[b+24>>2];if(h>f){g[a+20>>2]=h;c[a+4>>2]=c[b+16>>2];c[a+4+4>>2]=c[b+16+4>>2];c[a+4+8>>2]=c[b+16+8>>2];c[a+4+12>>2]=c[b+16+12>>2]}else h=f;f=k*+g[b+32>>2]+i*+g[b+36>>2]+j*+g[b+40>>2];if(!(f>h))return;g[a+20>>2]=f;c[a+4>>2]=c[b+32>>2];c[a+4+4>>2]=c[b+32+4>>2];c[a+4+8>>2]=c[b+32+8>>2];c[a+4+12>>2]=c[b+32+12>>2];return}function pj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;h=c[d+4>>2]|0;if((h|0)<=0){c[b+4>>2]=h;return}c[6995]=(c[6995]|0)+1;e=sc((h<<2|3)+16|0)|0;if(!e)g=0;else{c[(e+4+15&-16)+-4>>2]=e;g=e+4+15&-16}f=c[b+4>>2]|0;if((f|0)>0){e=0;do{c[g+(e<<2)>>2]=c[(c[b+12>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(f|0))}e=c[b+12>>2]|0;if(e|0){if(a[b+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[b+12>>2]=0}a[b+16>>0]=1;c[b+12>>2]=g;c[b+8>>2]=h;e=0;f=g;do{c[f+(e<<2)>>2]=0;e=e+1|0;f=c[b+12>>2]|0}while((e|0)!=(h|0));c[b+4>>2]=h;e=0;do{c[f+(e<<2)>>2]=c[(c[d+12>>2]|0)+(e<<2)>>2];e=e+1|0}while((e|0)!=(h|0));return}function qj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;k=+g[a+88>>2];i=+g[a+92>>2];j=+g[a+96>>2];f=k*+g[b>>2]+i*+g[b+4>>2]+j*+g[b+8>>2];h=+g[a+84>>2];if(f>h){g[a+84>>2]=f;c[a+4>>2]=c[b>>2];c[a+4+4>>2]=c[b+4>>2];c[a+4+8>>2]=c[b+8>>2];c[a+4+12>>2]=c[b+12>>2]}else f=h;h=k*+g[b+16>>2]+i*+g[b+20>>2]+j*+g[b+24>>2];if(h>f){g[a+84>>2]=h;c[a+4>>2]=c[b+16>>2];c[a+4+4>>2]=c[b+16+4>>2];c[a+4+8>>2]=c[b+16+8>>2];c[a+4+12>>2]=c[b+16+12>>2]}else h=f;f=k*+g[b+32>>2]+i*+g[b+36>>2]+j*+g[b+40>>2];if(!(f>h))return;g[a+84>>2]=f;c[a+4>>2]=c[b+32>>2];c[a+4+4>>2]=c[b+32+4>>2];c[a+4+8>>2]=c[b+32+8>>2];c[a+4+12>>2]=c[b+32+12>>2];return}function rj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0;i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);m=i+ +g[a+32>>2];k=i+ +g[a+36>>2];i=i+ +g[a+40>>2];u=+C(+(+g[b>>2]));t=+C(+(+g[b+4>>2]));s=+C(+(+g[b+8>>2]));q=+C(+(+g[b+16>>2]));p=+C(+(+g[b+20>>2]));o=+C(+(+g[b+24>>2]));l=+C(+(+g[b+32>>2]));j=+C(+(+g[b+36>>2]));h=+C(+(+g[b+40>>2]));r=+g[b+48>>2];n=+g[b+52>>2];f=+g[b+56>>2];g[d>>2]=r-(m*u+k*t+i*s);g[d+4>>2]=n-(m*q+k*p+i*o);g[d+8>>2]=f-(m*l+k*j+i*h);g[d+12>>2]=0.0;g[e>>2]=m*u+k*t+i*s+r;g[e+4>>2]=m*q+k*p+i*o+n;g[e+8>>2]=m*l+k*j+i*h+f;g[e+12>>2]=0.0;return}function sj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=l;l=l+96|0;g=c[b+192>>2]|0;c[f+64>>2]=0;c[f+64+4>>2]=g;c[f+64+8>>2]=b;c[f+64+12>>2]=b+4;c[f+64+16>>2]=-1;c[f+64+20>>2]=-1;b=c[d+192>>2]|0;c[f+40>>2]=0;c[f+40+4>>2]=b;c[f+40+8>>2]=d;c[f+40+12>>2]=d+4;c[f+40+16>>2]=-1;c[f+40+20>>2]=-1;b=c[a+24>>2]|0;b=Db[c[(c[b>>2]|0)+8>>2]&1](b,f+64|0,f+40|0,0,2)|0;if(!b){l=f;return}c[f+4>>2]=0;c[f+8>>2]=f+64;c[f+12>>2]=f+40;c[f>>2]=6324;c[f+36>>2]=e;c[f+32>>2]=c[e+12>>2];Zb[c[(c[b>>2]|0)+8>>2]&31](b,f+64|0,f+40|0,a+28|0,f);Ib[c[c[b>>2]>>2]&511](b);g=c[a+24>>2]|0;Ob[c[(c[g>>2]|0)+60>>2]&127](g,b);l=f;return}function tj(b){b=b|0;var d=0;c[b>>2]=8928;if(c[b+108>>2]|0){d=c[b+112>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+112>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+108>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+108>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}}d=c[b+88>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+84>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+80>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+60>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}if(!(a[b+100>>0]|0))return;d=c[b+92>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+92>>2]|0;if(!d)return;c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);return}function uj(b){b=b|0;var d=0,e=0,f=0,h=0.0;e=l;l=l+96|0;a[b+92>>0]=1;if((a[22496]|0)==0?Uz(22496)|0:0){c[6132]=1065353216;c[6133]=0;c[6134]=0;c[6135]=0;c[6136]=0;c[6137]=1065353216;c[6138]=0;c[6139]=0;c[6140]=0;c[6141]=0;c[6142]=1065353216;g[6143]=0.0;c[6144]=-1082130432;c[6145]=0;c[6146]=0;c[6147]=0;c[6148]=0;c[6149]=-1082130432;c[6150]=0;c[6151]=0;c[6152]=0;c[6153]=0;c[6154]=-1082130432;g[6155]=0.0}d=e;f=d+96|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(f|0));Vb[c[(c[b>>2]|0)+76>>2]&127](b,24528,e,6);h=+g[b+48>>2];g[b+76>>2]=+g[e>>2]+h;g[b+60>>2]=+g[e+48>>2]-h;g[b+80>>2]=+g[e+20>>2]+h;g[b+64>>2]=+g[e+68>>2]-h;g[b+84>>2]=+g[e+40>>2]+h;g[b+68>>2]=+g[e+88>>2]-h;l=e;return}function vj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;while(1){i=c[a+12>>2]|0;k=c[i+(((b+d|0)/2|0)<<3)>>2]|0;f=d;e=b;while(1){while(1){j=e+1|0;if((c[i+(e<<3)>>2]|0)<(k|0))e=j;else break}while(1){g=i+(f<<3)|0;h=f+-1|0;if((k|0)<(c[g>>2]|0))f=h;else break}if((e|0)<=(f|0)){l=i+(e<<3)|0;i=c[l>>2]|0;e=c[l+4>>2]|0;m=c[g+4>>2]|0;c[l>>2]=c[g>>2];c[l+4>>2]=m;f=(c[a+12>>2]|0)+(f<<3)|0;c[f>>2]=i;c[f+4>>2]=e;f=h;e=j}if((e|0)>(f|0))break;i=c[a+12>>2]|0}if((f|0)>(b|0))vj(a,b,f);if((e|0)<(d|0))b=e;else break}return}function wj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=c[b+72>>2]|0;if(!e)return;f=c[d+4>>2]|0;if((f|0)==(c[d+8>>2]|0)?(h=f|0?f<<1:1,(f|0)<(h|0)):0){if(!h)e=0;else{c[6995]=(c[6995]|0)+1;e=sc((h<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}f=c[d+4>>2]|0}if((f|0)>0){g=0;do{c[e+(g<<2)>>2]=c[(c[d+12>>2]|0)+(g<<2)>>2];g=g+1|0}while((g|0)!=(f|0))}g=c[d+12>>2]|0;if(g){if(a[d+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0);f=c[d+4>>2]|0}c[d+12>>2]=0}a[d+16>>0]=1;c[d+12>>2]=e;c[d+8>>2]=h;e=c[b+72>>2]|0}c[(c[d+12>>2]|0)+(f<<2)>>2]=e;c[d+4>>2]=f+1;return}function xj(a,b,d){a=a|0;b=+b;d=+d;var e=0,f=0,h=0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0;f=c[a+792>>2]|0;if((f|0)<=0)return;e=c[a+800>>2]|0;a=0;do{d=+g[e+(a*52|0)+40>>2];if(d>0.0?(h=c[e+(a*52|0)+24>>2]|0,i=c[e+(a*52|0)+28>>2]|0,j=+g[h+8>>2],k=+g[i+8>>2]-j,l=+g[h+12>>2],m=+g[i+12>>2]-l,n=+g[h+16>>2],o=+g[i+16>>2]-n,p=+g[e+(a*52|0)+44>>2],p+(k*k+m*m+o*o)>1.1920928955078125e-07):0){d=(p-(k*k+m*m+o*o))/(d*(p+(k*k+m*m+o*o)))*b;q=d*+g[h+88>>2];g[h+8>>2]=j-k*q;g[h+12>>2]=l-m*q;g[h+16>>2]=n-o*q;d=d*+g[i+88>>2];g[i+8>>2]=+g[i+8>>2]+k*d;g[i+12>>2]=m*d+ +g[i+12>>2];g[i+16>>2]=o*d+ +g[i+16>>2]}a=a+1|0}while((a|0)!=(f|0));return}function yj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0;e=l;l=l+96|0;c[e+32>>2]=1065353216;c[e+32+4>>2]=0;c[e+32+4+4>>2]=0;c[e+32+4+8>>2]=0;c[e+32+4+12>>2]=0;c[e+32+20>>2]=1065353216;c[e+32+24>>2]=0;c[e+32+24+4>>2]=0;c[e+32+24+8>>2]=0;c[e+32+24+12>>2]=0;c[e+32+40>>2]=1065353216;n=e+32+44|0;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;c[n+16>>2]=0;Vb[c[(c[a>>2]|0)+8>>2]&127](a,e+32|0,e+16|0,e);k=+g[e>>2];m=+g[e+16>>2];i=+g[e+4>>2];j=+g[e+16+4>>2];f=+g[e+8>>2];h=+g[e+16+8>>2];g[d>>2]=+D(+((k-m)*(k-m)+(i-j)*(i-j)+(f-h)*(f-h)))*.5;g[b>>2]=(m+k)*.5;g[b+4>>2]=(j+i)*.5;g[b+8>>2]=(h+f)*.5;g[b+12>>2]=0.0;l=e;return}function zj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=c[d+48>>2]|0;if((c[d+60>>2]|0)==2){Ag(b+44|0,h)|0;f=c[b+48>>2]|0;if(!f){f=b+48|0;g=1}else{c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);f=b+48|0;g=1}}else{Ag(b+4|0,h)|0;f=c[b+8>>2]|0;if(!f){f=b+8|0;g=0}else{c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);f=b+8|0;g=0}}c[f>>2]=h;f=b+4+(g*40|0)+12|0;c[f>>2]=(c[f>>2]|0)+-1;f=c[d+52>>2]|0;c[((f|0)==0?b+84+(c[d+60>>2]<<2)|0:f+56|0)>>2]=c[d+56>>2];f=c[d+56>>2]|0;if(f|0)c[f+52>>2]=c[d+52>>2];h=c[b+96>>2]|0;Sb[c[(c[h>>2]|0)+16>>2]&127](h,d,e);c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);a[b+154>>0]=1;return}function Aj(a,d,f,h){a=a|0;d=d|0;f=f|0;h=h|0;var i=0,j=0,k=0,l=0,m=0;i=c[a+108>>2]|0;if(i|0){Vb[c[(c[i>>2]|0)+28>>2]&127](i,d,f,h);return}i=b[a+56>>1]|0;if(!(i<<16>>16))return;m=1;k=1;do{j=c[a+68>>2]|0;if(b[j+(k<<2)>>1]&1){l=c[a+60>>2]|0;k=e[j+(k<<2)+2>>1]|0;if(!(+g[d>>2]>+g[l+(k<<6)+32>>2])?!(+g[f>>2]<+g[l+(k<<6)+16>>2]):0)j=1;else j=0;if(!(!(+g[d+8>>2]>+g[l+(k<<6)+40>>2])?!(+g[f+8>>2]<+g[l+(k<<6)+24>>2]):0))j=0;if(!(+g[d+4>>2]>+g[l+(k<<6)+36>>2])?!(+g[f+4>>2]<+g[l+(k<<6)+20>>2]|j^1):0){zb[c[(c[h>>2]|0)+8>>2]&31](h,l+(k<<6)|0)|0;i=b[a+56>>1]|0}}m=m+1<<16>>16;k=m&65535}while(k>>>0<((i&65535)<<1|1)>>>0);return}function Bj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0;h=+g[b>>2];i=+g[b+16>>2];j=h>2];if((j+g[a+24>>2])return;k=h>i?b:b+16|0;if(+g[(+g[k>>2]>f?k:b+32|0)>>2]<+g[a+8>>2])return;f=+g[b+8>>2];h=+g[b+24>>2];j=f>2];if((j+g[a+32>>2])return;k=f>h?b+8|0:b+24|0;if(+g[(+g[k>>2]>i?k:b+40|0)>>2]<+g[a+16>>2])return;f=+g[b+4>>2];h=+g[b+20>>2];j=f>2];if((j+g[a+28>>2])return;k=f>h?b+4|0:b+20|0;if(+g[(+g[k>>2]>i?k:b+36|0)>>2]<+g[a+12>>2])return;k=c[a+4>>2]|0;Vb[c[(c[k>>2]|0)+8>>2]&127](k,b,d,e);return}function Cj(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0;if(!(a[b+738>>0]|0)){c[d>>2]=5;c[d+4>>2]=1;e=+bj(b,(c[b+28>>2]|0)+4|0,(c[b+32>>2]|0)+4|0);g[b+728>>2]=e;g[b+708>>2]=0.0;g[b+712>>2]=0.0;a[b+716>>0]=0;h=+g[b+692>>2];do if(!(h>=0.0))i=13;else{e=+mh(e-+g[b+688>>2],6.2831854820251465);if(!(e<-3.1415927410125732)){if(e>3.1415927410125732)e=e+-6.2831854820251465}else e=e+6.2831854820251465;if(e<-h){a[b+716>>0]=1;f=1.0;e=-(e+h)}else{if(!(e>h)){i=13;break}a[b+716>>0]=1;f=-1.0;e=h-e}g[b+708>>2]=e;g[b+712>>2]=f}while(0);if((i|0)==13?(a[b+737>>0]|0)==0:0)return;c[d>>2]=6;b=d+4|0}else{c[d>>2]=0;b=d+4|0}c[b>>2]=0;return}function Dj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0.0,i=0;f=l;l=l+16|0;c[a+4>>2]=c[b+24>>2];e=c[b>>2]|0;c[a+8>>2]=e;if(d){c[a+56>>2]=c[b+8>>2];c[a+56+4>>2]=c[b+8+4>>2];c[a+56+8>>2]=c[b+8+8>>2];c[a+56+12>>2]=c[b+8+12>>2];i=a+72|0;d=a+24|0;e=a+40|0;h=+g[b+24>>2];hq(i,d,e,h);h=+g[b+24>>2];l=f;return +h}else{d=gJ(OI(e)|0)|0;fm(f,d,+g[b+8>>2],+g[b+12>>2],+g[b+16>>2]);c[a+56>>2]=c[f>>2];c[a+56+4>>2]=c[f+4>>2];c[a+56+8>>2]=c[f+8>>2];c[a+56+12>>2]=c[f+12>>2];d=a+72|0;e=a+24|0;i=a+40|0;h=+g[b+24>>2];hq(d,e,i,h);h=+g[b+24>>2];l=f;return +h}return 0.0}function Ej(b,d,e,f){b=b|0;d=d|0;e=e|0;f=+f;var h=0,i=0.0,j=0.0,k=0.0;h=l;l=l+16|0;g[b+32>>2]=f;c[b+8>>2]=c[d>>2];c[b+8+4>>2]=c[d+4>>2];c[b+8+8>>2]=c[d+8>>2];c[b+8+12>>2]=c[d+12>>2];i=+g[b+28>>2];k=+g[e+4>>2]-i*+g[d+4>>2];j=+g[e+8>>2]-i*+g[d+8>>2];g[h>>2]=+g[e>>2]-+g[d>>2]*i;g[h+4>>2]=k;g[h+8>>2]=j;g[h+12>>2]=0.0;f=+g[b+24>>2]+i+f;g[b+32>>2]=f;if(!(f<0.0)){b=b+4|0;b=c[b>>2]|0;e=c[b>>2]|0;e=e+16|0;e=c[e>>2]|0;Tb[e&15](b,d,h,f);l=h;return}a[b+36>>0]=1;b=b+4|0;b=c[b>>2]|0;e=c[b>>2]|0;e=e+16|0;e=c[e>>2]|0;Tb[e&15](b,d,h,f);l=h;return}function Fj(a,b,d,e,f,h,i,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0.0,m=0.0;if(!(c[j+52>>2]|0))return;if((c[j+20>>2]|0)<=0)return;e=0;while(1){d=c[a+28>>2]|0;if((d|0)>0){l=0.0;b=0;do{k=c[(c[a+116>>2]|0)+(b<<2)>>2]|0;i=c[a+36>>2]|0;h=c[a+16>>2]|0;m=+qb[c[a+220>>2]&31](h+((c[i+(k*152|0)+144>>2]|0)*244|0)|0,h+((c[i+(k*152|0)+148>>2]|0)*244|0)|0,i+(k*152|0)|0);l=l+m*m;b=b+1|0}while((b|0)!=(d|0))}else l=0.0;if(l<=+g[j+92>>2]){b=8;break}k=c[j+20>>2]|0;i=e;e=e+1|0;if(!((i|0)<(k+-1|0)&(e|0)<(k|0))){b=8;break}}if((b|0)==8)return}function Gj(b,d){b=b|0;d=d|0;c[b+204>>2]=c[d+48>>2];c[b+208>>2]=c[d+52>>2];c[b+212>>2]=c[d+56>>2];c[b+216>>2]=c[d+60>>2];c[b+220>>2]=c[d+64>>2];c[b+224>>2]=c[d+68>>2];c[b+156>>2]=c[d>>2];c[b+156+4>>2]=c[d+4>>2];c[b+156+8>>2]=c[d+8>>2];c[b+156+12>>2]=c[d+12>>2];c[b+172>>2]=c[d+16>>2];c[b+172+4>>2]=c[d+16+4>>2];c[b+172+8>>2]=c[d+16+8>>2];c[b+172+12>>2]=c[d+16+12>>2];c[b+188>>2]=c[d+32>>2];c[b+188+4>>2]=c[d+32+4>>2];c[b+188+8>>2]=c[d+32+8>>2];c[b+188+12>>2]=c[d+32+12>>2];c[b+228>>2]=c[d+72>>2];g[b+232>>2]=0.0;g[b+252>>2]=0.0;g[b+236>>2]=0.0;g[b+240>>2]=0.0;g[b+256>>2]=0.0;g[b+244>>2]=.10000000149011612;a[b+260>>0]=a[d+80>>0]&1;c[b+248>>2]=c[d+76>>2];return}function Hj(a,b){a=a|0;b=+b;var d=0,e=0;d=c[a+84>>2]|0;if(d|0)Jb[d&31](a,b);Jb[c[(c[a>>2]|0)+140>>2]&31](a,b);g[a+28>>2]=b;c[a+32>>2]=0;c[a+48>>2]=xb[c[(c[a>>2]|0)+20>>2]&127](a)|0;Jb[c[(c[a>>2]|0)+164>>2]&31](a,b);Ib[c[(c[a>>2]|0)+44>>2]&511](a);Ib[c[(c[a>>2]|0)+148>>2]&511](a);g[a+104>>2]=b;Ob[c[(c[a>>2]|0)+152>>2]&127](a,a+92|0);Jb[c[(c[a>>2]|0)+144>>2]&31](a,b);if((c[a+296>>2]|0)>0){d=0;do{e=c[(c[a+304>>2]|0)+(d<<2)>>2]|0;Pb[c[(c[e>>2]|0)+8>>2]&7](e,a,b);d=d+1|0}while((d|0)<(c[a+296>>2]|0))}Jb[c[(c[a>>2]|0)+156>>2]&31](a,b);d=c[a+80>>2]|0;if(!d)return;Jb[d&31](a,b);return}function Ij(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0;f=l;l=l+16|0;c[b+4>>2]=d;c[b>>2]=4652;c[b+8>>2]=-1;c[b+12>>2]=-1;g[b+16>>2]=3402823466385288598117041.0e14;a[b+20>>0]=1;a[b+21>>0]=0;c[b+24>>2]=-1;c[b+28>>2]=e;if((a[22480]|0)==0?Uz(22480)|0:0){c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;ef(23152,0.0,0,0,f)}c[5839]=c[5839]|1;g[5889]=0.0;h=+g[5899]*0.0;i=+g[5900]*0.0;g[5894]=+g[5898]*0.0;g[5895]=h;g[5896]=i;g[5897]=0.0;c[5902]=0;c[5903]=0;c[5904]=0;c[5905]=0;i=+g[5891]*0.0;h=+g[5892]*0.0;g[5943]=+g[5890]*0.0;g[5944]=i;g[5945]=h;g[5946]=0.0;c[b+32>>2]=23152;g[b+36>>2]=0.0;g[b+40>>2]=.05000000074505806;c[b+44>>2]=0;l=f;return}function Jj(a){a=a|0;var b=0;c[a>>2]=3244;b=c[a+88>>2]|0;Ib[c[c[b>>2]>>2]&511](b);b=c[a+88>>2]|0;if(b|0){c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0)}b=c[a+92>>2]|0;Ib[c[c[b>>2]>>2]&511](b);b=c[a+92>>2]|0;if(b|0){c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0)}b=c[a+96>>2]|0;Ib[c[c[b>>2]>>2]&511](b);b=c[a+96>>2]|0;if(b|0){c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0)}b=c[a+100>>2]|0;Ib[c[c[b>>2]>>2]&511](b);b=c[a+100>>2]|0;if(b|0){c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0)}b=c[a+104>>2]|0;Ib[c[c[b>>2]>>2]&511](b);b=c[a+104>>2]|0;if(!b){nf(a);return}c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);nf(a);return}function Kj(b,d){b=b|0;d=d|0;var e=0,f=0;a:do if((d|0)!=0&(b&3|0)!=0){e=d;while(1){if(!(a[b>>0]|0))break a;b=b+1|0;d=e+-1|0;if((d|0)!=0&(b&3|0)!=0)e=d;else{e=d;d=(d|0)!=0;f=4;break}}}else{e=d;d=(d|0)!=0;f=4}while(0);b:do if((f|0)==4)if(d){if(a[b>>0]|0){c:do if(e>>>0>3)while(1){d=c[b>>2]|0;if((d&-2139062144^-2139062144)&d+-16843009|0)break;b=b+4|0;e=e+-4|0;if(e>>>0<=3){f=10;break c}}else f=10;while(0);if((f|0)==10)if(!e){e=0;break}while(1){if(!(a[b>>0]|0))break b;b=b+1|0;e=e+-1|0;if(!e){e=0;break}}}}else e=0;while(0);return (e|0?b:0)|0}function Lj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0,i=0.0,j=0.0,k=0.0,l=0,m=0;m=c[b+56>>2]|0;l=c[m+32>>2]|0;b=c[l>>2]|0;m=c[m+24>>2]|0;if((m|0)<=1){m=b;m=m+8|0;c[a>>2]=c[m>>2];c[a+4>>2]=c[m+4>>2];c[a+8>>2]=c[m+8>>2];c[a+12>>2]=c[m+12>>2];return}j=+g[d>>2];k=+g[d+4>>2];i=+g[d+8>>2];d=0;h=1;e=j*+g[b+8>>2]+k*+g[b+12>>2]+i*+g[b+16>>2];while(1){b=c[l+(h<<2)>>2]|0;f=j*+g[b+8>>2]+k*+g[b+12>>2]+i*+g[b+16>>2];b=f>e;d=b?h:d;h=h+1|0;if((h|0)==(m|0))break;else e=b?f:e}m=c[l+(d<<2)>>2]|0;m=m+8|0;c[a>>2]=c[m>>2];c[a+4>>2]=c[m+4>>2];c[a+8>>2]=c[m+8>>2];c[a+12>>2]=c[m+12>>2];return}function Mj(a){a=a|0;var b=0.0,c=0.0,d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0;n=+g[a+4>>2];h=+g[a+456>>2];m=+g[a+8>>2];e=+g[a+460>>2];l=+g[a+12>>2];c=+g[a+464>>2];k=+g[a+20>>2];j=+g[a+24>>2];i=+g[a+28>>2];f=+g[a+36>>2];d=+g[a+40>>2];b=+g[a+44>>2];g[a+324>>2]=n*h*n+m*e*m+l*c*l;g[a+328>>2]=n*h*k+m*e*j+l*c*i;g[a+332>>2]=n*h*f+m*e*d+l*c*b;g[a+336>>2]=0.0;g[a+340>>2]=h*k*n+e*j*m+c*i*l;g[a+344>>2]=h*k*k+e*j*j+c*i*i;g[a+348>>2]=h*k*f+e*j*d+c*i*b;g[a+352>>2]=0.0;g[a+356>>2]=h*f*n+e*d*m+c*b*l;g[a+360>>2]=h*f*k+e*d*j+c*b*i;g[a+364>>2]=h*f*f+e*d*d+c*b*b;g[a+368>>2]=0.0;return}function Nj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0;h=l;l=l+16|0;if((e|0)<=0){l=h;return}f=0;do{p=+g[b+(f<<4)>>2];o=+g[b+(f<<4)+4>>2];n=+g[b+(f<<4)+8>>2];m=p*+g[a+60>>2]+o*+g[a+64>>2]+n*+g[a+68>>2];k=p*+g[a+76>>2]+o*+g[a+80>>2]+n*+g[a+84>>2];n=p*+g[a+92>>2]+o*+g[a+96>>2]+n*+g[a+100>>2];g[h>>2]=m;g[h+4>>2]=k;g[h+8>>2]=n;g[h+12>>2]=0.0;j=a+60+((+g[h+((m>2]>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];f=f+1|0}while((f|0)!=(e|0));l=h;return}function Oj(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;c[b>>2]=5944;e=c[b+8>>2]|0;d=c[b+16>>2]|0;if((e|0)>0){h=0;do{f=(c[d+(h<<2)>>2]|0)+188|0;g=c[f>>2]|0;if(g){e=c[b+68>>2]|0;e=xb[c[(c[e>>2]|0)+36>>2]&127](e)|0;Sb[c[(c[e>>2]|0)+40>>2]&127](e,g,c[b+24>>2]|0);e=c[b+68>>2]|0;Sb[c[(c[e>>2]|0)+12>>2]&127](e,g,c[b+24>>2]|0);c[f>>2]=0;e=c[b+8>>2]|0;d=c[b+16>>2]|0}h=h+1|0}while((h|0)<(e|0))}if(!d){a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}function Pj(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0,h=0,i=0.0,j=0.0;c[a+264>>2]=c[b>>2];c[a+264+4>>2]=c[b+4>>2];c[a+264+8>>2]=c[b+8>>2];c[a+264+12>>2]=c[b+12>>2];d=c[a+248>>2]|0;if((d|0)<=0)return;h=0;do{f=c[(c[a+256>>2]|0)+(h<<2)>>2]|0;switch(c[f+220>>2]|0){case 2:case 5:break;default:if(!(c[f+564>>2]&1)){e=+g[f+404>>2];if(e!=0.0){j=1.0/e*+g[b+4>>2];i=1.0/e*+g[b+8>>2];g[f+424>>2]=1.0/e*+g[b>>2];g[f+428>>2]=j;g[f+432>>2]=i;g[f+436>>2]=0.0}c[f+440>>2]=c[b>>2];c[f+440+4>>2]=c[b+4>>2];c[f+440+8>>2]=c[b+8>>2];c[f+440+12>>2]=c[b+12>>2];d=c[a+248>>2]|0}}h=h+1|0}while((h|0)<(d|0));return}function Qj(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0,h=0.0,i=0.0,k=0.0;e=c[a+204>>2]|0;if(b==0.0){c[a+204>>2]=e|1;h=0.0}else{c[a+204>>2]=e&-2;h=1.0/b}g[a+404>>2]=h;k=+g[a+444>>2]*b;i=+g[a+448>>2]*b;g[a+424>>2]=+g[a+440>>2]*b;g[a+428>>2]=k;g[a+432>>2]=i;g[a+436>>2]=0.0;b=+g[d>>2];f=b!=0.0?(g[j>>2]=1.0/b,c[j>>2]|0):0;b=+g[d+4>>2];e=b!=0.0?(g[j>>2]=1.0/b,c[j>>2]|0):0;b=+g[d+8>>2];d=b!=0.0?(g[j>>2]=1.0/b,c[j>>2]|0):0;c[a+456>>2]=f;c[a+460>>2]=e;c[a+464>>2]=d;g[a+468>>2]=0.0;i=h*+g[a+412>>2];k=h*+g[a+416>>2];g[a+620>>2]=+g[a+408>>2]*h;g[a+624>>2]=i;g[a+628>>2]=k;g[a+632>>2]=0.0;return}function Rj(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,h=0;f=l;l=l+256|0;e=c[b+212>>2]|0;if((e|0)>-1){a=e;l=f;return a|0}h=(c[b+252>>2]&2|0)==0;e=h?0:b;do if(!h){if(!(+g[e+404>>2]!=0.0)?(c[e+204>>2]&2|0)==0:0)break;h=c[a+8>>2]|0;Yk(f|0,0,244)|0;Je(Gf(a+4|0,f)|0,b,d);c[b+212>>2]=h;l=f;return h|0}while(0);e=c[a+188>>2]|0;if((e|0)>=0){h=e;l=f;return h|0}c[a+188>>2]=c[a+8>>2];Yk(f|0,0,244)|0;Je(Gf(a+4|0,f)|0,0,d);h=c[a+188>>2]|0;l=f;return h|0}function Sj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0,i=0.0,j=0,k=0.0,l=0;k=+g[b+64>>2]*.5;l=c[b+72>>2]|0;e=+g[d>>2];f=+g[d+4>>2];i=+g[d+8>>2];i=+D(+(e*e+f*f+i*i));h=c[b+68>>2]|0;if(+g[d+(l<<2)>>2]>i*+g[b+56>>2]){g[a+(h<<2)>>2]=0.0;g[a+(l<<2)>>2]=k;k=0.0;l=c[b+76>>2]|0;l=a+(l<<2)|0;g[l>>2]=k;return}i=+g[d+(h<<2)>>2];j=c[b+76>>2]|0;e=+g[d+(j<<2)>>2];f=+D(+(i*i+e*e));if(f>1.1920928955078125e-07){f=+g[b+60>>2]/f;g[a+(h<<2)>>2]=i*f;g[a+(l<<2)>>2]=-k;k=e*f;l=j;l=a+(l<<2)|0;g[l>>2]=k;return}else{g[a+(h<<2)>>2]=0.0;g[a+(l<<2)>>2]=-k;k=0.0;l=j;l=a+(l<<2)|0;g[l>>2]=k;return}}function Tj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=c[b+296>>2]|0;if((e|0)==(c[b+300>>2]|0)?(h=e|0?e<<1:1,(e|0)<(h|0)):0){if(!h)g=0;else{c[6995]=(c[6995]|0)+1;e=sc((h<<2|3)+16|0)|0;if(!e)e=0;else{c[(e+4+15&-16)+-4>>2]=e;e=e+4+15&-16}g=e;e=c[b+296>>2]|0}if((e|0)>0){f=0;do{c[g+(f<<2)>>2]=c[(c[b+304>>2]|0)+(f<<2)>>2];f=f+1|0}while((f|0)!=(e|0))}f=c[b+304>>2]|0;if(f){if(a[b+308>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);e=c[b+296>>2]|0}c[b+304>>2]=0}a[b+308>>0]=1;c[b+304>>2]=g;c[b+300>>2]=h}c[(c[b+304>>2]|0)+(e<<2)>>2]=d;c[b+296>>2]=e+1;return}function Uj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,h=0.0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0.0,p=0.0;n=c[b+100>>2]|0;if((n|0)<=0){c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;n=a+12|0;g[n>>2]=0.0;return}o=+g[b+16>>2];p=+g[d>>2]*o;k=+g[b+20>>2];l=+g[d+4>>2]*k;m=+g[b+24>>2];j=+g[d+8>>2]*m;f=c[b+108>>2]|0;d=-1;b=0;e=-3402823466385288598117041.0e14;while(1){h=p*+g[f+(b<<4)>>2]+l*+g[f+(b<<4)+4>>2]+j*+g[f+(b<<4)+8>>2];i=h>e;d=i?b:d;b=b+1|0;if((b|0)==(n|0))break;else e=i?h:e}l=+g[f+(d<<4)+4>>2]*k;p=+g[f+(d<<4)+8>>2]*m;g[a>>2]=+g[f+(d<<4)>>2]*o;g[a+4>>2]=l;g[a+8>>2]=p;n=a+12|0;g[n>>2]=0.0;return}function Vj(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0;e=l;l=l+96|0;c[e+32>>2]=1065353216;c[e+32+4>>2]=0;c[e+32+4+4>>2]=0;c[e+32+4+8>>2]=0;c[e+32+4+12>>2]=0;c[e+32+20>>2]=1065353216;c[e+32+24>>2]=0;c[e+32+24+4>>2]=0;c[e+32+24+8>>2]=0;c[e+32+24+12>>2]=0;c[e+32+40>>2]=1065353216;j=e+32+44|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;Vb[c[(c[a>>2]|0)+8>>2]&127](a,e+32|0,e+16|0,e);h=(+g[e>>2]-+g[e+16>>2])*.5*2.0;f=(+g[e+4>>2]-+g[e+16+4>>2])*.5*2.0;i=(+g[e+8>>2]-+g[e+16+8>>2])*.5*2.0;g[d>>2]=b/12.0*(f*f+i*i);g[d+4>>2]=b/12.0*(h*h+i*i);g[d+8>>2]=b/12.0*(h*h+f*f);l=e;return}function Wj(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;e=gt()|0;Ij(e,3,b);c[e>>2]=4828;c[e+300>>2]=c[d>>2];c[e+300+4>>2]=c[d+4>>2];c[e+300+8>>2]=c[d+8>>2];c[e+300+12>>2]=c[d+12>>2];k=+g[d>>2];j=+g[d+4>>2];i=+g[d+8>>2];h=k*+g[b+20>>2]+j*+g[b+24>>2]+i*+g[b+28>>2]+ +g[b+56>>2];f=k*+g[b+36>>2]+j*+g[b+40>>2]+i*+g[b+44>>2]+ +g[b+60>>2];g[e+316>>2]=k*+g[b+4>>2]+j*+g[b+8>>2]+i*+g[b+12>>2]+ +g[b+52>>2];g[e+320>>2]=h;g[e+324>>2]=f;g[e+328>>2]=0.0;c[e+332>>2]=0;a[e+344>>0]=0;g[e+348>>2]=.30000001192092896;g[e+352>>2]=1.0;g[e+356>>2]=0.0;return e|0}function Xj(a,b,c){a=+a;b=+b;c=+c;var d=0.0,e=0.0,f=0;if(b>=c)return +a;if(a3.1415927410125732)d=d+-6.2831854820251465}else d=d+6.2831854820251465;e=+C(+d);d=+mh(c-a,6.2831854820251465);if(!(d<-3.1415927410125732)){if(d>3.1415927410125732)d=d+-6.2831854820251465}else d=d+6.2831854820251465;f=e<+C(+d);a=f?a:a+6.2831854820251465;return +a}if(!(a>c))return +a;d=+mh(a-c,6.2831854820251465);if(!(d<-3.1415927410125732)){if(d>3.1415927410125732)d=d+-6.2831854820251465}else d=d+6.2831854820251465;e=+C(+d);d=+mh(a-b,6.2831854820251465);if(!(d<-3.1415927410125732)){if(d>3.1415927410125732)d=d+-6.2831854820251465}else d=d+6.2831854820251465;f=+C(+d)>2]|0)>(c[d+12>>2]|0);f=c[(e?d:b)+12>>2]|0;e=c[(e?b:d)+12>>2]|0;b=(((e<<16|f)+~((e<<16|f)<<15)|0)>>>10^(e<<16|f)+~((e<<16|f)<<15))*9|0;b=(((b>>>6^b)+~((b>>>6^b)<<11)|0)>>>16^(b>>>6^b)+~((b>>>6^b)<<11))&(c[a+12>>2]|0)+-1;if((b|0)>=(c[a+32>>2]|0)){g=0;return g|0}b=c[(c[a+40>>2]|0)+(b<<2)>>2]|0;if((b|0)==-1){g=0;return g|0}d=c[a+16>>2]|0;while(1){if((c[(c[d+(b<<4)>>2]|0)+12>>2]|0)==(f|0)?(c[(c[d+(b<<4)+4>>2]|0)+12>>2]|0)==(e|0):0)break;b=c[(c[a+60>>2]|0)+(b<<2)>>2]|0;if((b|0)==-1){b=0;g=8;break}}if((g|0)==8)return b|0;g=d+(b<<4)|0;return g|0}function Zj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;e=l;l=l+16|0;Sb[c[(c[b>>2]|0)+68>>2]&127](e,b,d);c[a>>2]=c[e>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];if(!(+nb[c[(c[b>>2]|0)+48>>2]&15](b)!=0.0)){l=e;return}i=+g[d>>2];h=+g[d+4>>2];f=+g[d+8>>2];k=i*i+h*h+f*f<1.4210854715202004e-14?-1.0:i;j=i*i+h*h+f*f<1.4210854715202004e-14?-1.0:h;f=i*i+h*h+f*f<1.4210854715202004e-14?-1.0:f;h=1.0/+D(+(f*f+(k*k+j*j)));i=+nb[c[(c[b>>2]|0)+48>>2]&15](b);g[a>>2]=+g[a>>2]+i*h*k;g[a+4>>2]=i*h*j+ +g[a+4>>2];g[a+8>>2]=i*h*f+ +g[a+8>>2];l=e;return}function _j(a,b,d){a=a|0;b=+b;d=+d;var e=0.0,f=0.0,h=0.0;f=+g[a+692>>2];do if(f>0.0){h=+g[a+688>>2];e=+mh(b-h,6.2831854820251465);if(!(e<-3.1415927410125732)){if(e>3.1415927410125732)e=e+-6.2831854820251465}else e=e+6.2831854820251465;if(!(!(e<-f)&e<=f))if(e>0.0){b=+mh(f+h,6.2831854820251465);if(b<-3.1415927410125732){b=b+6.2831854820251465;break}if(!(b>3.1415927410125732))break;b=b+-6.2831854820251465;break}else{b=+mh(h-f,6.2831854820251465);if(b<-3.1415927410125732){b=b+6.2831854820251465;break}if(!(b>3.1415927410125732))break;b=b+-6.2831854820251465;break}}while(0);g[a+680>>2]=(b-+bj(a,(c[a+28>>2]|0)+4|0,(c[a+32>>2]|0)+4|0))/d;return}function $j(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;a:do switch(b|0){case 2:{if((c|0)<1){d=+g[a+232>>2];break a}if((c|0)<3){d=+g[a+264>>2];break a}if((c|0)==3){d=+g[a+248>>2];break a}if((c|0)<6)d=+g[a+280>>2];else d=3402823466385288598117041.0e14;break}case 3:{if((c|0)<1){d=+g[a+212>>2];break a}if((c|0)==3)d=+g[a+228>>2];else d=3402823466385288598117041.0e14;break}case 4:{if((c|0)<1){d=+g[a+244>>2];break a}if((c|0)<3){d=+g[a+276>>2];break a}if((c|0)==3){d=+g[a+260>>2];break a}if((c|0)<6)d=+g[a+292>>2];else d=3402823466385288598117041.0e14;break}default:d=3402823466385288598117041.0e14}while(0);return +d}function ak(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;e=+g[d>>2];f=+g[d+4>>2];h=+g[d+8>>2];if(e*e+f*f+h*h==0.0)e=+g[b+36>>2];else e=+D(+(e*e+f*f+h*h));g[b+32>>2]=e;g[b+20>>2]=e;a[b+249>>0]=1;e=+g[d>>2];f=+g[d+4>>2];h=+g[d+8>>2];if(e*e+f*f+h*h==0.0){i=+g[b+256>>2];f=+g[b+260>>2];e=+g[b+264>>2];d=b+268|0}else{j=1.0/+D(+(e*e+f*f+h*h));i=e*j;f=f*j;e=h*j;d=d+12|0}d=c[d>>2]|0;g[b+272>>2]=i;g[b+276>>2]=f;g[b+280>>2]=e;c[b+284>>2]=d;d=(c[b+8>>2]|0)+52|0;c[b+116>>2]=c[d>>2];c[b+116+4>>2]=c[d+4>>2];c[b+116+8>>2]=c[d+8>>2];c[b+116+12>>2]=c[d+12>>2];return}function bk(b){b=b|0;var d=0;c[b>>2]=4080;if(a[b+476>>0]|0?(d=c[b+472>>2]|0,Ib[c[c[d>>2]>>2]&511](d),d=c[b+472>>2]|0,d|0):0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}d=c[b+440>>2]|0;if(d|0){if(a[b+444>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+440>>2]=0}a[b+444>>0]=1;c[b+440>>2]=0;c[b+432>>2]=0;c[b+436>>2]=0;d=c[b+356>>2]|0;if(!d){a[b+360>>0]=1;c[b+356>>2]=0;c[b+348>>2]=0;d=b+352|0;c[d>>2]=0;Qg(b);return}if(a[b+360>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+356>>2]=0;a[b+360>>0]=1;c[b+356>>2]=0;c[b+348>>2]=0;d=b+352|0;c[d>>2]=0;Qg(b);return}function ck(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0;d=l;l=l+64|0;c[d+48>>2]=0;c[d+48+4>>2]=0;c[d+48+8>>2]=0;c[d+48+12>>2]=0;i=+g[b>>2];f=+g[b+4>>2];m=+g[b+8>>2];j=+g[b+12>>2];h=i*(2.0/(i*i+f*f+m*m+j*j));e=f*(2.0/(i*i+f*f+m*m+j*j));k=m*(2.0/(i*i+f*f+m*m+j*j));g[d>>2]=1.0-(f*e+m*k);g[d+4>>2]=i*e-j*k;g[d+8>>2]=i*k+j*e;g[d+12>>2]=0.0;g[d+16>>2]=i*e+j*k;g[d+20>>2]=1.0-(i*h+m*k);g[d+24>>2]=f*k-j*h;g[d+28>>2]=0.0;g[d+32>>2]=i*k-j*e;g[d+36>>2]=f*k+j*h;g[d+40>>2]=1.0-(i*h+f*e);g[d+44>>2]=0.0;Ld(a,d);l=d;return}function dk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0.0,i=0.0,k=0.0,m=0,n=0,o=0;f=l;l=l+48|0;Sb[c[(c[a>>2]|0)+124>>2]&127](a,f+32|0,e);o=c[f+32>>2]|0;n=c[f+32+4>>2]|0;m=c[f+32+8>>2]|0;c[b>>2]=o;c[b+4>>2]=n;c[b+8>>2]=m;g[b+12>>2]=0.0;e=c[(c[a>>2]|0)+64>>2]|0;k=-(c[j>>2]=o,+g[j>>2]);i=-(c[j>>2]=n,+g[j>>2]);h=-(c[j>>2]=m,+g[j>>2]);g[f>>2]=k;g[f+4>>2]=i;g[f+8>>2]=h;g[f+12>>2]=0.0;Sb[e&127](f+16|0,a,f);c[d>>2]=c[f+16>>2];c[d+4>>2]=c[f+16+4>>2];c[d+8>>2]=c[f+16+8>>2];c[d+12>>2]=c[f+16+12>>2];l=f;return}function ek(a,b,d){a=a|0;b=b|0;d=d|0;do if(!((b|0)==8&(d|0)==8)){if((b|0)==8&(d|0)==1){a=a+72|0;break}if((b|0)==1&(d|0)==8){a=a+76|0;break}if(!(d|b)){a=a+68|0;break}if((b|0)<20&(d|0)==28){a=a+84|0;break}if((b|0)==28&(d|0)<20){a=a+80|0;break}if((b|0)<20){if((d|0)<20){a=a+28|0;break}if((d+-21|0)>>>0<9){a=a+32|0;break}}else{if((d|0)<20&(b+-21|0)>>>0<9){a=a+36|0;break}if((b|0)==31)if((d|0)==31){a=a+44|0;break}else{a=a+40|0;break}}if((d|0)==31){a=a+48|0;break}else{a=a+52|0;break}}else a=a+56|0;while(0);return c[a>>2]|0}function fk(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=e|0;f=f|0;var h=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0;h=l;l=l+48|0;c[h+32>>2]=e;c[h+32+4>>2]=f;n=+g[b>>2];m=+g[b+4>>2];i=+g[b+8>>2];k=+g[a+56>>2]*n+ +g[a+60>>2]*m+ +g[a+64>>2]*i;j=n*+g[a+72>>2]+m*+g[a+76>>2]+i*+g[a+80>>2];i=n*+g[a+88>>2]+m*+g[a+92>>2]+i*+g[a+96>>2];c[h>>2]=c[a+48>>2];c[h+4>>2]=h+32;g[h+8>>2]=k;g[h+12>>2]=j;g[h+16>>2]=i;g[h+20>>2]=0.0;g[h+24>>2]=d;f=c[a+44>>2]|0;d=+qb[c[(c[f>>2]|0)+12>>2]&31](f,h,1);l=h;return +d}function gk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=l;l=l+16|0;c[a+4>>2]=c[b+40>>2];e=c[b>>2]|0;c[a+80>>2]=e;if(d){c[a+48>>2]=c[b+8>>2];c[a+48+4>>2]=c[b+8+4>>2];c[a+48+8>>2]=c[b+8+8>>2];c[a+48+12>>2]=c[b+8+12>>2]}else{e=gJ(OI(e)|0)|0;fm(f,e,+g[b+8>>2],+g[b+12>>2],+g[b+16>>2]);c[a+48>>2]=c[f>>2];c[a+48+4>>2]=c[f+4>>2];c[a+48+8>>2]=c[f+8>>2];c[a+48+12>>2]=c[f+12>>2]}c[a+64>>2]=c[b+24>>2];c[a+64+4>>2]=c[b+24+4>>2];c[a+64+8>>2]=c[b+24+8>>2];c[a+64+12>>2]=c[b+24+12>>2];l=f;return +(+g[b+40>>2])}function hk(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;if(e>>>0<3)switch(b|0){case 2:{g[a+756+(e<<2)>>2]=d;c[a+1304>>2]=c[a+1304>>2]|4<>2]=d;c[a+1304>>2]=c[a+1304>>2]|2<>2]=d;c[a+1304>>2]=c[a+1304>>2]|1<>>0>=3)return;switch(b|0){case 2:{g[a+868+(e+-3<<6)+32>>2]=d;c[a+1304>>2]=c[a+1304>>2]|4<>2]=d;c[a+1304>>2]=c[a+1304>>2]|2<>2]=d;c[a+1304>>2]=c[a+1304>>2]|1<>2]=3;c[h+8>>2]=-1;c[h+12>>2]=-1;g[h+16>>2]=3402823466385288598117041.0e14;a[h+20>>0]=1;a[h+21>>0]=0;c[h+24>>2]=-1;c[h+28>>2]=b;c[h+32>>2]=d;g[h+36>>2]=0.0;g[h+40>>2]=.05000000074505806;c[h+44>>2]=0;c[h>>2]=4828;c[h+300>>2]=c[e>>2];c[h+300+4>>2]=c[e+4>>2];c[h+300+8>>2]=c[e+8>>2];c[h+300+12>>2]=c[e+12>>2];c[h+316>>2]=c[f>>2];c[h+316+4>>2]=c[f+4>>2];c[h+316+8>>2]=c[f+8>>2];c[h+316+12>>2]=c[f+12>>2];c[h+332>>2]=0;a[h+344>>0]=0;g[h+348>>2]=.30000001192092896;g[h+352>>2]=1.0;g[h+356>>2]=0.0;return h|0}function jk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=c[b+252>>2]|0;if((b|0)==0|(d|0)!=8)if((b|0)==0|(d&2|0)==0){ki(a,b);return}else{Ob[c[(c[a>>2]|0)+92>>2]&127](a,b);return}f=c[a+348>>2]|0;a:do if((f|0)>0){e=c[a+356>>2]|0;d=0;while(1){if((c[e+(d<<2)>>2]|0)==(b|0))break a;d=d+1|0;if((d|0)>=(f|0)){d=f;break}}}else d=f;while(0);if((f|0)>(d|0)){g=c[a+356>>2]|0;d=g+(d<<2)|0;e=c[d>>2]|0;c[d>>2]=c[g+(f+-1<<2)>>2];c[(c[a+356>>2]|0)+(f+-1<<2)>>2]=e;c[a+348>>2]=f+-1}ki(a,b);return}function kk(b){b=b|0;var d=0;c[b>>2]=4580;d=c[b+80>>2]|0;if(d|0){if(a[b+84>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+80>>2]=0}a[b+84>>0]=1;c[b+80>>2]=0;c[b+72>>2]=0;c[b+76>>2]=0;d=c[b+60>>2]|0;if(d|0){if(a[b+64>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+60>>2]=0}a[b+64>>0]=1;c[b+60>>2]=0;c[b+52>>2]=0;c[b+56>>2]=0;d=c[b+40>>2]|0;if(!d){a[b+44>>0]=1;c[b+40>>2]=0;c[b+32>>2]=0;b=b+36|0;c[b>>2]=0;return}if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+40>>2]=0;a[b+44>>0]=1;c[b+40>>2]=0;c[b+32>>2]=0;b=b+36|0;c[b>>2]=0;return}function lk(b){b=b|0;var d=0;c[b>>2]=9068;d=c[b+60>>2]|0;if(d|0){if(a[b+64>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+60>>2]=0}a[b+64>>0]=1;c[b+60>>2]=0;c[b+52>>2]=0;c[b+56>>2]=0;d=c[b+40>>2]|0;if(d|0){if(a[b+44>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+40>>2]=0}a[b+44>>0]=1;c[b+40>>2]=0;c[b+32>>2]=0;c[b+36>>2]=0;d=c[b+16>>2]|0;if(!d){a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}function mk(b){b=b|0;var d=0;c[b>>2]=5768;d=c[b+56>>2]|0;if(d|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;d=c[b+36>>2]|0;if(d|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;d=c[b+16>>2]|0;if(!d){d=b+12|0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[d>>2]=0;return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;d=b+12|0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[d>>2]=0;return}function nk(b){b=b|0;var d=0;c[b>>2]=9668;d=c[b+56>>2]|0;if(d|0){if(a[b+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+56>>2]=0}a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;d=c[b+36>>2]|0;if(d|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;d=c[b+16>>2]|0;if(!d){a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;b=b+12|0;c[b>>2]=0;return}function ok(b){b=b|0;var d=0,e=0,f=0;e=Ds(10448)|0;c[e>>2]=5444;c[e+4>>2]=2;a[e+24>>0]=1;c[e+20>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+28>>2]=5916;g[e+60>>2]=0.0;c[e+10444>>2]=b;c[e+64>>2]=79;c[e+68>>2]=xb[c[(c[b>>2]|0)+12>>2]&127](b)|0;c[e+72>>2]=xb[c[(c[b>>2]|0)+8>>2]&127](b)|0;b=0;do{d=0;do{f=c[e+10444>>2]|0;c[e+76+(b*144|0)+(d<<2)>>2]=Bb[c[(c[f>>2]|0)+16>>2]&63](f,b,d)|0;f=c[e+10444>>2]|0;c[e+5260+(b*144|0)+(d<<2)>>2]=Bb[c[(c[f>>2]|0)+20>>2]&63](f,b,d)|0;d=d+1|0}while((d|0)<36);b=b+1|0}while((b|0)<36);return e|0}function pk(){var a=0,b=0,d=0,e=0;e=l;l=l+48|0;a=ts()|0;if(a|0?(d=c[a>>2]|0,d|0):0){b=c[d+48>>2]|0;a=c[d+48+4>>2]|0;if(!((b&-256|0)==1126902528&(a|0)==1129074247)){c[e+24>>2]=21877;Ww(21827,e+24|0)}if((b|0)==1126902529&(a|0)==1129074247)a=c[d+44>>2]|0;else a=d+80|0;c[e+36>>2]=a;d=c[d>>2]|0;a=c[d+4>>2]|0;if(ql(2784,d,e+36|0)|0){d=c[e+36>>2]|0;d=xb[c[(c[d>>2]|0)+8>>2]&127](d)|0;c[e>>2]=21877;c[e+4>>2]=a;c[e+8>>2]=d;Ww(21741,e)}else{c[e+16>>2]=21877;c[e+16+4>>2]=a;Ww(21786,e+16|0)}}Ww(21865,e+32|0)}function qk(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[d>>2]|0;b=zb[c[(c[b>>2]|0)+56>>2]&31](b,156)|0;d=c[d>>2]|0;c[b+4>>2]=d;c[b>>2]=3848;a[b+8>>0]=1;c[b+12>>2]=4060;c[b+60>>2]=d;c[b+64>>2]=0;a[b+88>>0]=1;c[b+84>>2]=0;c[b+76>>2]=0;c[b+80>>2]=0;a[b+108>>0]=1;c[b+104>>2]=0;c[b+96>>2]=0;c[b+100>>2]=0;a[b+128>>0]=1;c[b+124>>2]=0;c[b+116>>2]=0;c[b+120>>2]=0;a[b+148>>0]=1;c[b+144>>2]=0;c[b+136>>2]=0;c[b+140>>2]=0;c[b+16>>2]=c[f+8>>2];c[b+20>>2]=c[e+8>>2];gj(b+72|0);return b|0}function rk(b){b=b|0;var d=0;c[b>>2]=5400;d=c[b+344>>2]|0;Ib[c[c[d>>2]>>2]&511](d);d=c[b+344>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b>>2]=5356;d=c[b+336>>2]|0;if(d|0){if(a[b+340>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+336>>2]=0}a[b+340>>0]=1;c[b+336>>2]=0;c[b+328>>2]=0;c[b+332>>2]=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(!d){a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;b=b+292|0;c[b>>2]=0;return}if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;b=b+292|0;c[b>>2]=0;return}function sk(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[d>>2]|0;b=zb[c[(c[b>>2]|0)+56>>2]&31](b,156)|0;d=c[d>>2]|0;c[b+4>>2]=d;c[b>>2]=3848;a[b+8>>0]=0;c[b+12>>2]=4060;c[b+60>>2]=d;c[b+64>>2]=0;a[b+88>>0]=1;c[b+84>>2]=0;c[b+76>>2]=0;c[b+80>>2]=0;a[b+108>>0]=1;c[b+104>>2]=0;c[b+96>>2]=0;c[b+100>>2]=0;a[b+128>>0]=1;c[b+124>>2]=0;c[b+116>>2]=0;c[b+120>>2]=0;a[b+148>>0]=1;c[b+144>>2]=0;c[b+136>>2]=0;c[b+140>>2]=0;c[b+16>>2]=c[e+8>>2];c[b+20>>2]=c[f+8>>2];gj(b+72|0);return b|0}function tk(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=+e;f=f|0;h=h|0;var i=0;i=l;l=l+64|0;c[i+48>>2]=f;c[i+48+4>>2]=h;f=c[a+212>>2]|0;if(!(+g[f+4>>2]>=e)){l=i;return +e}c[i>>2]=c[a+216>>2];c[i+4>>2]=i+48;c[i+8>>2]=c[b>>2];c[i+8+4>>2]=c[b+4>>2];c[i+8+8>>2]=c[b+8>>2];c[i+8+12>>2]=c[b+12>>2];c[i+24>>2]=c[d>>2];c[i+24+4>>2]=c[d+4>>2];c[i+24+8>>2]=c[d+8>>2];c[i+24+12>>2]=c[d+12>>2];g[i+40>>2]=e;e=+qb[c[(c[f>>2]|0)+12>>2]&31](f,i,1);l=i;return +e}function uk(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0;i=Ts()|0;He(i,b,d,e,f,h);c[i>>2]=4764;c[i+4>>2]=9;a[i+1309>>0]=0;g[i+1316>>2]=0.0;g[i+1340>>2]=0.0;g[i+1364>>2]=1.0;a[i+1310>>0]=0;g[i+1320>>2]=0.0;g[i+1344>>2]=0.0;g[i+1368>>2]=1.0;a[i+1311>>0]=0;g[i+1324>>2]=0.0;g[i+1348>>2]=0.0;g[i+1372>>2]=1.0;a[i+1312>>0]=0;g[i+1328>>2]=0.0;g[i+1352>>2]=0.0;g[i+1376>>2]=1.0;a[i+1313>>0]=0;g[i+1332>>2]=0.0;g[i+1356>>2]=0.0;g[i+1380>>2]=1.0;a[i+1314>>0]=0;g[i+1336>>2]=0.0;g[i+1360>>2]=0.0;g[i+1384>>2]=1.0;return i|0}function vk(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0.0,f=0.0,h=0.0,i=0.0;c=l;l=l+48|0;d=2.0/+EF(b);f=+g[(gJ(b)|0)>>2];e=+g[(OI(b)|0)>>2];i=+g[(NI(b)|0)>>2];h=+g[(MI(b)|0)>>2];g[c+32>>2]=1.0-(e*e*d+i*i*d);g[c+28>>2]=f*e*d-h*i*d;g[c+24>>2]=f*i*d+h*e*d;g[c+20>>2]=f*e*d+h*i*d;g[c+16>>2]=1.0-(f*f*d+i*i*d);g[c+12>>2]=e*i*d-h*f*d;g[c+8>>2]=f*i*d-h*e*d;g[c+4>>2]=e*i*d+h*f*d;g[c>>2]=1.0-(f*f*d+e*e*d);Ip(a,c+32|0,c+28|0,c+24|0,c+20|0,c+16|0,c+12|0,c+8|0,c+4|0,c);l=c;return}function wk(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=c[e+16>>2]|0;if(!f){if(!(bp(e)|0)){g=c[e+16>>2]|0;h=5}}else{g=f;h=5}a:do if((h|0)==5){f=c[e+20>>2]|0;if((g-f|0)>>>0>>0){Bb[c[e+36>>2]&63](e,b,d)|0;break}b:do if((a[e+75>>0]|0)>-1){h=d;while(1){if(!h){g=b;break b}g=h+-1|0;if((a[b+g>>0]|0)==10)break;else h=g}if((Bb[c[e+36>>2]&63](e,b,h)|0)>>>0>>0)break a;g=b+h|0;d=d-h|0;f=c[e+20>>2]|0}else g=b;while(0);gi(f|0,g|0,d|0)|0;c[e+20>>2]=(c[e+20>>2]|0)+d}while(0);return}function xk(a,b,d){a=a|0;b=b|0;d=d|0;do if(!((b|0)==8&(d|0)==8)){if((b|0)==8&(d|0)==1){a=a+72|0;break}if((b|0)==1&(d|0)==8){a=a+76|0;break}if((b|0)<20&(d|0)==28){a=a+84|0;break}if((b|0)==28&(d|0)<20){a=a+80|0;break}if((b|0)<20){if((d|0)<20){a=a+28|0;break}if((d+-21|0)>>>0<9){a=a+32|0;break}}else{if((d|0)<20&(b+-21|0)>>>0<9){a=a+36|0;break}if((b|0)==31)if((d|0)==31){a=a+44|0;break}else{a=a+40|0;break}}if((d|0)==31){a=a+48|0;break}else{a=a+52|0;break}}else a=a+56|0;while(0);return c[a>>2]|0}function yk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;e=l;l=l+16|0;Sb[c[(c[b>>2]|0)+68>>2]&127](e,b,d);c[a>>2]=c[e>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];i=+g[d>>2];h=+g[d+4>>2];f=+g[d+8>>2];k=i*i+h*h+f*f<1.4210854715202004e-14?-1.0:i;j=i*i+h*h+f*f<1.4210854715202004e-14?-1.0:h;f=i*i+h*h+f*f<1.4210854715202004e-14?-1.0:f;h=1.0/+D(+(f*f+(k*k+j*j)));i=+nb[c[(c[b>>2]|0)+48>>2]&15](b);g[a>>2]=+g[a>>2]+i*h*k;g[a+4>>2]=i*h*j+ +g[a+4>>2];g[a+8>>2]=i*h*f+ +g[a+8>>2];l=e;return}function zk(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=l;l=l+48|0;e=$G(b,0)|0;g[d+32>>2]=+Dp(c,e);g[d+28>>2]=+ep(c,e);g[d+24>>2]=+dp(c,e);e=$G(b,1)|0;g[d+20>>2]=+Dp(c,e);g[d+16>>2]=+ep(c,e);g[d+12>>2]=+dp(c,e);b=$G(b,2)|0;g[d+8>>2]=+Dp(c,b);g[d+4>>2]=+ep(c,b);g[d>>2]=+dp(c,b);Sq(a,d+32|0,d+28|0,d+24|0,d+20|0,d+16|0,d+12|0,d+8|0,d+4|0,d);l=d;return}function Ak(a,b,c,d){a=a|0;b=b|0;c=+c;d=+d;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;i=+F(+c);h=+G(+c);c=+g[b+444>>2];if(+C(+i)>1.1920928955078125e-07){j=+g[b+448>>2];e=h*h;f=i*i;c=+D(+((h*h/(i*i)+1.0)/(1.0/(j*j)+h*h/(i*i)/(c*c))))}else{e=h*h;f=i*i}c=c*.5;j=+G(+c)/+D(+(f+0.0+e));c=+F(+c);k=c*d+i*j*0.0-h*j*-0.0;f=c*0.0-h*j*d-j*0.0*0.0;e=c*0.0+j*0.0*0.0-i*j*d;d=-(j*0.0*d)-i*j*0.0-h*j*-0.0;g[a>>2]=h*j*f+(c*k+d*-(j*0.0))-e*-(i*j);g[a+4>>2]=e*-(j*0.0)+(c*f+d*-(i*j))-h*j*k;g[a+8>>2]=k*-(i*j)+(h*j*d+c*e)-f*-(j*0.0);g[a+12>>2]=0.0;return}function Bk(b,d){b=b|0;d=d|0;var e=0,f=0,h=0;g[b+20>>2]=0.0;g[b+24>>2]=0.0;a[b+248>>0]=0;a[b+249>>0]=0;g[b+252>>2]=0.0;c[b+68>>2]=0;c[b+68+4>>2]=0;c[b+68+8>>2]=0;c[b+68+12>>2]=0;b=c[(c[b+8>>2]|0)+344>>2]|0;if((c[(xb[c[(c[b>>2]|0)+28>>2]&127](b)|0)+4>>2]|0)<=0)return;do{f=c[b>>2]|0;h=c[f+12>>2]|0;f=c[c[(xb[c[f+28>>2]&127](b)|0)+12>>2]>>2]|0;e=c[(c[(xb[c[(c[b>>2]|0)+28>>2]&127](b)|0)+12>>2]|0)+4>>2]|0;Cb[h&31](b,f,e,c[d+24>>2]|0)|0}while((c[(xb[c[(c[b>>2]|0)+28>>2]&127](b)|0)+4>>2]|0)>0);return}function Ck(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;c[6131]=(c[6131]|0)+-1;Ob[c[(c[a>>2]|0)+20>>2]&127](a,b);e=c[b+800>>2]|0;d=(c[a+12>>2]|0)+-1|0;g=c[a+20>>2]|0;f=c[g+(e<<2)>>2]|0;c[g+(e<<2)>>2]=c[g+(d<<2)>>2];c[(c[a+20>>2]|0)+(d<<2)>>2]=f;c[(c[(c[a+20>>2]|0)+(e<<2)>>2]|0)+800>>2]=e;c[a+12>>2]=d;a=c[a+72>>2]|0;if(!b)return;g=c[a+16>>2]|0;if(g>>>0<=b>>>0?(g+(P(c[a>>2]|0,c[a+4>>2]|0)|0)|0)>>>0>b>>>0:0){c[b>>2]=c[a+12>>2];c[a+12>>2]=b;c[a+8>>2]=(c[a+8>>2]|0)+1;return}c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function Dk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=c[b+8>>2]|0;if((k|0)<=0)return;j=c[b+16>>2]|0;i=0;b=0;do{h=c[j+(i<<2)>>2]|0;if(!(c[h+204>>2]&3)){g=c[a+16>>2]|0;e=g+(b<<3)|0;d=c[e>>2]|0;if((d|0)==(b|0))d=b;else{f=d;do{d=g+(f<<3)|0;c[e>>2]=c[d>>2];d=c[d>>2]|0;e=g+(d<<3)|0;f=c[e>>2]|0}while((d|0)!=(f|0))}c[h+208>>2]=d;c[g+(b<<3)+4>>2]=i;c[h+212>>2]=-1;b=b+1|0}else{c[h+208>>2]=-1;c[h+212>>2]=-2}i=i+1|0}while((i|0)!=(k|0));return}function Ek(a,b,d,f){a=a|0;b=b|0;d=d|0;f=f|0;var g=0,h=0,i=0;while(1){g=c[a+12>>2]|0;if(!(((e[f>>1]|0)>=(e[a>>1]|0)?(e[d>>1]|0)<=(e[a+6>>1]|0):0)&(e[d+4>>1]|0)<=(e[a+10>>1]|0)&(e[f+4>>1]|0)>=(e[a+4>>1]|0)&(e[d+2>>1]|0)<=(e[a+8>>1]|0)&(e[f+2>>1]|0)>=(e[a+2>>1]|0))){h=6;break}if((g|0)>-1)break;i=a+16|0;Ek(i,b,d,f);g=c[a+28>>2]|0;a=i+(((g|0)>-1?1:0-g|0)<<4)|0}if((h|0)==6)return;Sb[c[(c[b>>2]|0)+8>>2]&127](b,g>>>21,g&2097151);return}function Fk(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=Ts()|0;Yd(f,b,d,e);c[f>>2]=4764;c[f+4>>2]=9;a[f+1309>>0]=0;g[f+1316>>2]=0.0;g[f+1340>>2]=0.0;g[f+1364>>2]=1.0;a[f+1310>>0]=0;g[f+1320>>2]=0.0;g[f+1344>>2]=0.0;g[f+1368>>2]=1.0;a[f+1311>>0]=0;g[f+1324>>2]=0.0;g[f+1348>>2]=0.0;g[f+1372>>2]=1.0;a[f+1312>>0]=0;g[f+1328>>2]=0.0;g[f+1352>>2]=0.0;g[f+1376>>2]=1.0;a[f+1313>>0]=0;g[f+1332>>2]=0.0;g[f+1356>>2]=0.0;g[f+1380>>2]=1.0;a[f+1314>>0]=0;g[f+1336>>2]=0.0;g[f+1360>>2]=0.0;g[f+1384>>2]=1.0;return f|0}function Gk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0;h=+g[a+60>>2];k=+g[a+76>>2]-h;j=+g[a+64>>2];i=+g[a+80>>2]-j;l=+g[a+68>>2];m=+g[a+84>>2]-l;h=+g[a+92>>2]-h;j=+g[a+96>>2]-j;l=+g[a+100>>2]-l;g[d+12>>2]=0.0;f=1.0/+D(+((k*j-i*h)*(k*j-i*h)+((i*l-m*j)*(i*l-m*j)+(m*h-k*l)*(m*h-k*l))));g[d>>2]=(i*l-m*j)*f;g[d+4>>2]=(m*h-k*l)*f;g[d+8>>2]=(k*j-i*h)*f;c[e>>2]=c[a+60>>2];c[e+4>>2]=c[a+60+4>>2];c[e+8>>2]=c[a+60+8>>2];c[e+12>>2]=c[a+60+12>>2];return}function Hk(b){b=b|0;var d=0,e=0;c[b>>2]=6400;if(a[b+52>>0]|0?(d=c[b+56>>2]|0,d|0):0){e=c[b+4>>2]|0;Ob[c[(c[e>>2]|0)+16>>2]&127](e,d)}d=c[b+44>>2]|0;if(d|0){if(a[b+48>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+44>>2]=0}a[b+48>>0]=1;c[b+44>>2]=0;c[b+36>>2]=0;c[b+40>>2]=0;d=c[b+24>>2]|0;if(!d){a[b+28>>0]=1;c[b+24>>2]=0;c[b+16>>2]=0;e=b+20|0;c[e>>2]=0;return}if(a[b+28>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+24>>2]=0;a[b+28>>0]=1;c[b+24>>2]=0;c[b+16>>2]=0;e=b+20|0;c[e>>2]=0;return}function Ik(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+224|0;e=g+80|0;f=e+40|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));c[g+120>>2]=c[d>>2];if((Xc(0,b,g+120|0,g,g+80|0)|0)>=0){e=c[2444]|0;if((a[9850]|0)<1)c[2444]=e&-33;if(!(c[2456]|0)){d=c[2455]|0;c[2455]=g+136;c[2451]=g+136;c[2449]=g+136;c[2456]=80;c[2448]=g+136+80;Xc(9776,b,g+120|0,g,g+80|0)|0;if(d|0){Bb[c[9812>>2]&63](9776,0,0)|0;c[2455]=d;c[2456]=0;c[2448]=0;c[2451]=0;c[2449]=0}}else Xc(9776,b,g+120|0,g,g+80|0)|0;c[2444]=c[2444]|e&32}l=g;return}function Jk(b,d){b=b|0;d=d|0;do if(b){if(d>>>0<128){a[b>>0]=d;b=1;break}if(!(c[7131]|0))if((d&-128|0)==57216){a[b>>0]=d;b=1;break}else{c[7137]=84;b=-1;break}if(d>>>0<2048){a[b>>0]=d>>>6|192;a[b+1>>0]=d&63|128;b=2;break}if(d>>>0<55296|(d&-8192|0)==57344){a[b>>0]=d>>>12|224;a[b+1>>0]=d>>>6&63|128;a[b+2>>0]=d&63|128;b=3;break}if((d+-65536|0)>>>0<1048576){a[b>>0]=d>>>18|240;a[b+1>>0]=d>>>12&63|128;a[b+2>>0]=d>>>6&63|128;a[b+3>>0]=d&63|128;b=4;break}else{c[7137]=84;b=-1;break}}else b=1;while(0);return b|0}function Kk(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;i=+g[a+60>>2];k=+g[a+76>>2]-i;j=+g[a+64>>2];f=+g[a+80>>2]-j;d=+g[a+68>>2];h=+g[a+84>>2]-d;i=+g[a+92>>2]-i;j=+g[a+96>>2]-j;d=+g[a+100>>2]-d;g[c+12>>2]=0.0;e=1.0/+D(+((k*j-f*i)*(k*j-f*i)+((f*d-h*j)*(f*d-h*j)+(h*i-k*d)*(h*i-k*d))));g[c>>2]=(f*d-h*j)*e;g[c+4>>2]=(h*i-k*d)*e;g[c+8>>2]=(k*j-f*i)*e;if(!b)return;g[c>>2]=-((f*d-h*j)*e);g[c+4>>2]=-((h*i-k*d)*e);g[c+8>>2]=-((k*j-f*i)*e);return}function Lk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=c[a+780>>2]|0;g=c[a+812>>2]|0;if((g|0)<=0){h=0;return h|0}f=c[a+820>>2]|0;a=0;while(1){i=c[f+(a*44|0)+8>>2]|0;if(((i|0)==(h+(e*104|0)|0)|((i|0)==(h+(b*104|0)|0)|(i|0)==(h+(d*104|0)|0))?(i=c[f+(a*44|0)+12>>2]|0,(i|0)==(h+(e*104|0)|0)|((i|0)==(h+(b*104|0)|0)|(i|0)==(h+(d*104|0)|0))):0)?(i=c[f+(a*44|0)+16>>2]|0,(i|0)==(h+(e*104|0)|0)|((i|0)==(h+(b*104|0)|0)|(i|0)==(h+(d*104|0)|0))):0){a=1;f=7;break}a=a+1|0;if((a|0)>=(g|0)){a=0;f=7;break}}if((f|0)==7)return a|0;return 0}function Mk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;f=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=f;if(f|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;c[b+28>>2]=c[a+32>>2];c[b+32>>2]=c[a+36>>2];c[b+36>>2]=c[a+40>>2];c[b+40>>2]=c[a+44>>2];c[b+12>>2]=c[a+16>>2];c[b+16>>2]=c[a+20>>2];c[b+20>>2]=c[a+24>>2];c[b+24>>2]=c[a+28>>2];c[b+44>>2]=c[a+48>>2];c[b+48>>2]=0;c[b+52>>2]=c[a+56>>2];c[b+56>>2]=0;return 17763}function Nk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0,j=0;i=c[a+100>>2]|0;j=c[a+108>>2]|0;f=+g[j+(((b|0)%(i|0)|0)<<4)+4>>2]*+g[a+20>>2];h=+g[j+(((b|0)%(i|0)|0)<<4)+8>>2]*+g[a+24>>2];g[d>>2]=+g[j+(((b|0)%(i|0)|0)<<4)>>2]*+g[a+16>>2];g[d+4>>2]=f;g[d+8>>2]=h;g[d+12>>2]=0.0;d=c[a+108>>2]|0;h=+g[d+(((b+1|0)%(i|0)|0)<<4)+4>>2]*+g[a+20>>2];f=+g[d+(((b+1|0)%(i|0)|0)<<4)+8>>2]*+g[a+24>>2];g[e>>2]=+g[d+(((b+1|0)%(i|0)|0)<<4)>>2]*+g[a+16>>2];g[e+4>>2]=h;g[e+8>>2]=f;g[e+12>>2]=0.0;return}function Ok(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;f=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=f;if(f|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;c[b+28>>2]=c[a+32>>2];c[b+32>>2]=c[a+36>>2];c[b+36>>2]=c[a+40>>2];c[b+40>>2]=c[a+44>>2];c[b+12>>2]=c[a+16>>2];c[b+16>>2]=c[a+20>>2];c[b+20>>2]=c[a+24>>2];c[b+24>>2]=c[a+28>>2];c[b+44>>2]=c[a+48>>2];c[b+48>>2]=0;c[b+52>>2]=c[a+56>>2];c[b+56>>2]=0;return 17307}function Pk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,h=0,i=0;e=l;l=l+32|0;d=c[a+184>>2]|0;if(+g[d+4>>2]==0.0){d=0;l=e;return d|0}b=c[b>>2]|0;if(!(zb[c[(c[d>>2]|0)+8>>2]&31](d,c[b+188>>2]|0)|0)){d=1;l=e;return d|0}h=c[a+192>>2]|0;i=c[b+192>>2]|0;d=c[a+184>>2]|0;f=+g[a+188>>2];c[e>>2]=0;c[e+4>>2]=i;c[e+8>>2]=b;c[e+12>>2]=b+4;c[e+16>>2]=-1;c[e+20>>2]=-1;vc(h,a+36|0,a+100|0,e,d,f);d=1;l=e;return d|0}function Qk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;f=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=f;if(f|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;c[b+28>>2]=c[a+32>>2];c[b+32>>2]=c[a+36>>2];c[b+36>>2]=c[a+40>>2];c[b+40>>2]=c[a+44>>2];c[b+12>>2]=c[a+16>>2];c[b+16>>2]=c[a+20>>2];c[b+20>>2]=c[a+24>>2];c[b+24>>2]=c[a+28>>2];c[b+44>>2]=c[a+48>>2];c[b+48>>2]=0;c[b+52>>2]=c[a+72>>2];c[b+56>>2]=0;return 16327}function Rk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;e=l;l=l+16|0;k=+g[d>>2];j=+g[d+4>>2];i=+g[d+8>>2];h=k*+g[b+60>>2]+j*+g[b+64>>2]+i*+g[b+68>>2];f=k*+g[b+76>>2]+j*+g[b+80>>2]+i*+g[b+84>>2];i=k*+g[b+92>>2]+j*+g[b+96>>2]+i*+g[b+100>>2];g[e>>2]=h;g[e+4>>2]=f;g[e+8>>2]=i;g[e+12>>2]=0.0;d=b+60+((+g[e+((h>2]>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];l=e;return}function Sk(a,b){a=a|0;b=b|0;var d=0;d=l;l=l+16|0;c[d>>2]=c[b>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];b=c[a+8>>2]|0;c[b+304>>2]=(c[b+304>>2]|0)+1;c[b+4>>2]=1065353216;c[b+8>>2]=0;c[b+8+4>>2]=0;c[b+8+8>>2]=0;c[b+8+12>>2]=0;c[b+24>>2]=1065353216;c[b+28>>2]=0;c[b+28+4>>2]=0;c[b+28+8>>2]=0;c[b+28+12>>2]=0;c[b+44>>2]=1065353216;c[b+48>>2]=0;c[b+52>>2]=c[d>>2];c[b+52+4>>2]=c[d+4>>2];c[b+52+8>>2]=c[d+8>>2];c[b+52+12>>2]=c[d+12>>2];l=d;return}function Tk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;do switch(b|0){case 0:{b=1;f=0;break}case 1:{b=2;f=0;break}case 2:{b=3;f=1;break}case 3:{f=2;break}case 4:{f=0;break}case 5:{f=1;break}case 6:{f=2;break}case 7:{f=3;break}case 8:{b=5;f=4;break}case 9:{b=6;f=4;break}case 10:{b=7;f=5;break}case 11:{b=7;f=6;break}default:{b=0;f=0}}while(0);Sb[c[(c[a>>2]|0)+108>>2]&127](a,f,d);Sb[c[(c[a>>2]|0)+108>>2]&127](a,b,e);return}function Uk(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0;k=+nb[c[(c[a>>2]|0)+48>>2]&15](a);h=+nb[c[(c[a>>2]|0)+48>>2]&15](a);d=+nb[c[(c[a>>2]|0)+48>>2]&15](a);m=(k+ +g[a+32>>2])/+g[a+16>>2];j=(h+ +g[a+36>>2])/+g[a+20>>2];f=(d+ +g[a+40>>2])/+g[a+24>>2];l=+C(+(+g[b>>2]));i=+C(+(+g[b+4>>2]));e=+C(+(+g[b+8>>2]));g[a+16>>2]=l;g[a+20>>2]=i;g[a+24>>2]=e;g[a+28>>2]=0.0;g[a+32>>2]=m*l-k;g[a+36>>2]=j*i-h;g[a+40>>2]=f*e-d;g[a+44>>2]=0.0;return}function Vk(a,b,d,e,f,h,i,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0,m=0,n=0.0,o=0;bc[c[(c[a>>2]|0)+32>>2]&1](a,b,d,e,f,h,i,j,k);l=c[a+184>>2]|0;m=c[j+20>>2]|0;m=(l|0)>(m|0)?l:m;if((m|0)<=0)return 0.0;l=0;do{n=+wb[c[(c[a>>2]|0)+40>>2]&3](a,l,b,d,e,f,h,i,j,k);g[a+228>>2]=n;o=l;l=l+1|0}while(((o|0)<(m+-1|0)?!(n<=+g[j+92>>2]):0)&(l|0)<(m|0));return 0.0}function Wk(b,d){b=b|0;d=d|0;var e=0,f=0,h=0.0,i=0,j=0;if(a[b+527>>0]|0){c[d>>2]=0;c[d+4>>2]=0;return}c[d>>2]=3;c[d+4>>2]=3;j=c[b+28>>2]|0;i=c[b+32>>2]|0;xc(b,j+4|0,i+4|0,j+324|0,i+324|0);if((a[b+526>>0]|0?(e=c[d>>2]|0,c[d>>2]=e+1,f=c[d+4>>2]|0,c[d+4>>2]=f+-1,h=+g[b+456>>2],+g[b+444>>2]>2]>2]=e+2;c[d+4>>2]=f+-2}if(!(a[b+525>>0]|0))return;c[d>>2]=(c[d>>2]|0)+1;c[d+4>>2]=(c[d+4>>2]|0)+-1;return}function Xk(b,d,e,f,h){b=b|0;d=+d;e=e|0;f=f|0;h=h|0;g[b>>2]=d;c[b+4>>2]=e;c[b+72>>2]=f;c[b+76>>2]=c[h>>2];c[b+76+4>>2]=c[h+4>>2];c[b+76+8>>2]=c[h+8>>2];c[b+76+12>>2]=c[h+12>>2];g[b+92>>2]=0.0;g[b+96>>2]=0.0;g[b+100>>2]=.5;g[b+104>>2]=0.0;g[b+108>>2]=0.0;g[b+112>>2]=0.0;g[b+116>>2]=.800000011920929;g[b+120>>2]=1.0;a[b+124>>0]=0;g[b+128>>2]=.004999999888241291;g[b+132>>2]=.009999999776482582;g[b+136>>2]=.009999999776482582;g[b+140>>2]=.009999999776482582;kr(b+8|0);return}function Yk(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;f=b+e|0;d=d&255;if((e|0)>=67){while(b&3){a[b>>0]=d;b=b+1|0}g=d|d<<8|d<<16|d<<24;while((b|0)<=((f&-4)-64|0)){c[b>>2]=g;c[b+4>>2]=g;c[b+8>>2]=g;c[b+12>>2]=g;c[b+16>>2]=g;c[b+20>>2]=g;c[b+24>>2]=g;c[b+28>>2]=g;c[b+32>>2]=g;c[b+36>>2]=g;c[b+40>>2]=g;c[b+44>>2]=g;c[b+48>>2]=g;c[b+52>>2]=g;c[b+56>>2]=g;c[b+60>>2]=g;b=b+64|0}while((b|0)<(f&-4|0)){c[b>>2]=g;b=b+4|0}}while((b|0)<(f|0)){a[b>>0]=d;b=b+1|0}return f-e|0}function Zk(a,b,c,d,e,f,h,i,j,k){a=+a;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;i=+i;j=+j;k=k|0;if(!(((h-d)*b-(i-e)*a)*f+(((i-e)*c-(j-f)*b)*d+((j-f)*a-(h-d)*c)*e)<0.0)){k=0;return k|0}do if(!((h-d)*d+(i-e)*e+(j-f)*f>0.0))if((h-d)*h+(i-e)*i+(j-f)*j<0.0){a=h*h+i*i+j*j;break}else{a=((h*h+i*i+j*j)*(d*d+e*e+f*f)-(h*d+i*e+j*f)*(h*d+i*e+j*f))/((h-d)*(h-d)+(i-e)*(i-e)+(j-f)*(j-f));a=a>0.0?a:0.0;break}else a=d*d+e*e+f*f;while(0);g[k>>2]=+D(+a);k=1;return k|0}function _k(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0,h=0,i=0;b=c[b+36>>2]|0;i=c[b+8>>2]|0;h=c[b+12>>2]|0;f=c[b+16>>2]|0;e=+g[a+52>>2];d=+Gh(a+4|0,+g[a+36>>2],+g[a+40>>2],+g[a+44>>2],+g[i+8>>2],+g[i+12>>2],+g[i+16>>2],+g[h+8>>2],+g[h+12>>2],+g[h+16>>2],+g[f+8>>2],+g[f+12>>2],+g[f+16>>2],e);if(!(d>0.0&d>2]|0;h=h+1|0;c[i>>2]=h;return}g[a+52>>2]=d;c[a+56>>2]=b;i=a+60|0;h=c[i>>2]|0;h=h+1|0;c[i>>2]=h;return}function $k(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;a:do if(c>>>0>=3)if((c+-3|0)>>>0<3)switch(b|0){case 2:{d=+g[a+868+(c+-3<<6)+32>>2];break a}case 4:{d=+g[a+868+(c+-3<<6)+36>>2];break a}case 3:{d=+g[a+868+(c+-3<<6)+28>>2];break a}default:{d=0.0;break a}}else d=0.0;else switch(b|0){case 2:{d=+g[a+756+(c<<2)>>2];break a}case 4:{d=+g[a+772+(c<<2)>>2];break a}case 3:{d=+g[a+740+(c<<2)>>2];break a}default:{d=0.0;break a}}while(0);return +d}function al(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;Sb[c[(c[b>>2]|0)+68>>2]&127](a,b,d);if(!(+nb[c[(c[b>>2]|0)+48>>2]&15](b)!=0.0))return;h=+g[d>>2];f=+g[d+4>>2];e=+g[d+8>>2];j=h*h+f*f+e*e<1.4210854715202004e-14?-1.0:h;i=h*h+f*f+e*e<1.4210854715202004e-14?-1.0:f;e=h*h+f*f+e*e<1.4210854715202004e-14?-1.0:e;f=1.0/+D(+(e*e+(j*j+i*i)));h=+nb[c[(c[b>>2]|0)+48>>2]&15](b);g[a>>2]=+g[a>>2]+h*f*j;g[a+4>>2]=h*f*i+ +g[a+4>>2];g[a+8>>2]=h*f*e+ +g[a+8>>2];return}function bl(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;do if(!(qD(b,c[d+8>>2]|0)|0)){if(qD(b,c[d>>2]|0)|0){if((c[d+16>>2]|0)!=(e|0)?(c[d+20>>2]|0)!=(e|0):0){c[d+32>>2]=f;c[d+20>>2]=e;c[d+40>>2]=(c[d+40>>2]|0)+1;if((c[d+36>>2]|0)==1?(c[d+24>>2]|0)==2:0)a[d+54>>0]=1;c[d+44>>2]=4;break}if((f|0)==1)c[d+32>>2]=1}}else qs(d,e,f);while(0);return}function cl(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0;j=l;l=l+16|0;h=+g[b>>2];i=+g[b+4>>2];e=+g[b+8>>2];if(h*h+i*i+e*e>0.0?(f=+g[a+52>>2],f>0.0):0){c=1.0/+D(+(h*h+i*i+e*e));d=e*c*-f*e*c*-f+(h*c*-f*h*c*-f+i*c*-f*i*c*-f);if(d>0.0){g[j>>2]=-(h*c*-f);g[j+4>>2]=-(i*c*-f);g[j+8>>2]=-(e*c*-f);g[j+12>>2]=0.0;ve(a,j)}g[a+52>>2]=+D(+d);l=j;return}ve(a,b);l=j;return}function dl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;a:do if(!(qD(b,c[d+8>>2]|0)|0)){h=c[b+12>>2]|0;Co(b+16|0,d,e,f);if((h|0)>1){g=b+24|0;do{Co(g,d,e,f);if(a[d+54>>0]|0)break a;g=g+8|0}while(g>>>0<(b+16+(h<<3)|0)>>>0)}}else on(d,e,f);while(0);return}function el(a,b){a=a|0;b=b|0;var d=0;b=l;l=l+16|0;d=c[a+8>>2]|0;c[a+132>>2]=c[d+52>>2];c[a+132+4>>2]=c[d+52+4>>2];c[a+132+8>>2]=c[d+52+8>>2];c[a+132+12>>2]=c[d+52+12>>2];$p(a+152|0,d+52|0,16)|0;yh(d+4|0,b);c[a+168>>2]=c[b>>2];c[a+168+4>>2]=c[b+4>>2];c[a+168+8>>2]=c[b+8>>2];c[a+168+12>>2]=c[b+12>>2];c[a+184>>2]=c[a+168>>2];c[a+184+4>>2]=c[a+168+4>>2];c[a+184+8>>2]=c[a+168+8>>2];c[a+184+12>>2]=c[a+168+12>>2];l=b;return}function fl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=c[a+228>>2]|0;a:do if((f|0)>0){e=c[a+236>>2]|0;d=0;while(1){if((c[e+(d<<2)>>2]|0)==(b|0))break a;d=d+1|0;if((d|0)>=(f|0)){d=f;break}}}else d=f;while(0);if((f|0)>(d|0)){g=c[a+236>>2]|0;d=g+(d<<2)|0;e=c[d>>2]|0;c[d>>2]=c[g+(f+-1<<2)>>2];c[(c[a+236>>2]|0)+(f+-1<<2)>>2]=e;c[a+228>>2]=f+-1}ch(c[b+28>>2]|0,b);ch(c[b+32>>2]|0,b);return}function gl(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;f=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=f;if(f|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;c[b+28>>2]=c[a+32>>2];c[b+32>>2]=c[a+36>>2];c[b+36>>2]=c[a+40>>2];c[b+40>>2]=c[a+44>>2];c[b+12>>2]=c[a+16>>2];c[b+16>>2]=c[a+20>>2];c[b+20>>2]=c[a+24>>2];c[b+24>>2]=c[a+28>>2];c[b+44>>2]=c[a+48>>2];c[b+48>>2]=0;return 11372}function hl(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;f=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=f;if(f|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;c[b+12>>2]=c[a+72>>2];c[b+16>>2]=c[a+76>>2];c[b+20>>2]=c[a+80>>2];c[b+24>>2]=c[a+84>>2];c[b+28>>2]=c[a+52>>2];c[b+32>>2]=c[a+56>>2];c[b+36>>2]=c[a+60>>2];c[b+40>>2]=c[a+64>>2];c[b+44>>2]=c[a+68>>2];c[b+48>>2]=0;return 17004}function il(b,d,e){b=b|0;d=d|0;e=e|0;b=Ds(144)|0;c[b>>2]=5112;a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;a[b+40>>0]=1;c[b+36>>2]=0;c[b+28>>2]=0;c[b+32>>2]=0;a[b+60>>0]=1;c[b+56>>2]=0;c[b+48>>2]=0;c[b+52>>2]=0;a[b+80>>0]=1;c[b+76>>2]=0;c[b+68>>2]=0;c[b+72>>2]=0;c[b+92>>2]=e;g[b+96>>2]=0.0;a[b+140>>0]=1;c[b+136>>2]=0;c[b+128>>2]=0;c[b+132>>2]=0;c[b+108>>2]=d;c[b+112>>2]=0;c[b+116>>2]=2;c[b+120>>2]=1;g[b+104>>2]=0.0;g[b+100>>2]=0.0;return b|0}function jl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;f=c[d>>2]|0;f=zb[c[(c[f>>2]|0)+56>>2]&31](f,72)|0;h=c[d+4>>2]|0;i=c[b+8>>2]|0;g=c[b+12>>2]|0;e=c[b+16>>2]|0;c[f+4>>2]=c[d>>2];c[f>>2]=6400;c[f+8>>2]=i;a[f+28>>0]=1;c[f+24>>2]=0;c[f+16>>2]=0;c[f+20>>2]=0;a[f+48>>0]=1;c[f+44>>2]=0;c[f+36>>2]=0;c[f+40>>2]=0;a[f+52>>0]=0;c[f+56>>2]=h;a[f+60>>0]=0;c[f+64>>2]=g;c[f+68>>2]=e;return f|0}function kl(b,d){b=b|0;d=d|0;var e=0;e=bt()|0;c[e+8>>2]=0;c[e+12>>2]=-1;c[e+16>>2]=1065353216;c[e+20>>2]=1065353216;c[e+24>>2]=1065353216;g[e+28>>2]=0.0;g[e+48>>2]=.03999999910593033;c[e+56>>2]=0;c[e+60>>2]=1065353216;c[e+64>>2]=1065353216;c[e+68>>2]=1065353216;g[e+72>>2]=0.0;c[e+76>>2]=-1082130432;c[e+80>>2]=-1082130432;c[e+84>>2]=-1082130432;g[e+88>>2]=0.0;a[e+92>>0]=0;c[e>>2]=8036;c[e+96>>2]=b;c[e+4>>2]=3;if(!d)return e|0;uj(e);return e|0}function ll(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=l;l=l+32|0;if(!(+g[a+404>>2]!=0.0)){l=d;return}wo(a,+g[b>>2],+g[b+4>>2],+g[b+8>>2]);if(!(gJ(a+604|0)|0)){l=d;return}jq(d,+g[b>>2],+g[b+4>>2],+g[b+8>>2],+g[a+408>>2],+g[a+412>>2],+g[a+416>>2]);Ap(d+16|0,+g[c>>2],+g[c+4>>2],+g[c+8>>2],+g[d>>2],+g[d+4>>2],+g[d+8>>2]);xo(a,+g[d+16>>2],+g[d+16+4>>2],+g[d+16+8>>2]);l=d;return}function ml(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;a[b+53>>0]=1;do if((c[b+4>>2]|0)==(e|0)){a[b+52>>0]=1;e=c[b+16>>2]|0;if(!e){c[b+16>>2]=d;c[b+24>>2]=f;c[b+36>>2]=1;if(!((f|0)==1?(c[b+48>>2]|0)==1:0))break;a[b+54>>0]=1;break}if((e|0)!=(d|0)){c[b+36>>2]=(c[b+36>>2]|0)+1;a[b+54>>0]=1;break}e=c[b+24>>2]|0;if((e|0)==2){c[b+24>>2]=f;e=f}if((e|0)==1?(c[b+48>>2]|0)==1:0)a[b+54>>0]=1}while(0);return}function nl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=c[a+248>>2]|0;a:do if((f|0)>0){e=c[a+256>>2]|0;d=0;while(1){if((c[e+(d<<2)>>2]|0)==(b|0))break a;d=d+1|0;if((d|0)>=(f|0)){d=f;break}}}else d=f;while(0);if((f|0)<=(d|0)){ki(a,b);return}g=c[a+256>>2]|0;d=g+(d<<2)|0;e=c[d>>2]|0;c[d>>2]=c[g+(f+-1<<2)>>2];c[(c[a+256>>2]|0)+(f+-1<<2)>>2]=e;c[a+248>>2]=f+-1;ki(a,b);return}function ol(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=c[a+348>>2]|0;a:do if((f|0)>0){e=c[a+356>>2]|0;d=0;while(1){if((c[e+(d<<2)>>2]|0)==(b|0))break a;d=d+1|0;if((d|0)>=(f|0)){d=f;break}}}else d=f;while(0);if((f|0)<=(d|0)){ki(a,b);return}g=c[a+356>>2]|0;d=g+(d<<2)|0;e=c[d>>2]|0;c[d>>2]=c[g+(f+-1<<2)>>2];c[(c[a+356>>2]|0)+(f+-1<<2)>>2]=e;c[a+348>>2]=f+-1;ki(a,b);return}function pl(b,d,e){b=b|0;d=d|0;e=+e;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;a[b+251>>0]=0;c[b+68>>2]=c[d>>2];c[b+68+4>>2]=c[d+4>>2];c[b+68+8>>2]=c[d+8>>2];c[b+68+12>>2]=c[d+12>>2];f=+g[b+68>>2];h=+g[b+72>>2];i=+g[b+76>>2];j=+D(+(f*f+h*h+i*i));if(j>1.1920928955078125e-07){k=f*(1.0/j);h=h*(1.0/j);f=i*(1.0/j);d=c[b+80>>2]|0}else{k=0.0;h=0.0;f=0.0;d=0}g[b+84>>2]=k;g[b+88>>2]=h;g[b+92>>2]=f;c[b+96>>2]=d;g[b+252>>2]=+g[b+252>>2]+e;return}function ql(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+64|0;if(!(qD(a,b)|0))if((b|0)!=0?(f=fj(b,2792)|0,(f|0)!=0):0){b=g+4|0;e=b+52|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(e|0));c[g>>2]=f;c[g+8>>2]=a;c[g+12>>2]=-1;c[g+48>>2]=1;Vb[c[(c[f>>2]|0)+28>>2]&127](f,g,c[d>>2]|0,1);if((c[g+24>>2]|0)==1){c[d>>2]=c[g+16>>2];b=1}else b=0}else b=0;else b=1;l=g;return b|0}function rl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0,j=0.0,k=0.0,l=0.0,m=0;if((d|0)<=0)return;m=0;do{e=+g[a+36>>2];h=+g[a+32>>2];i=b+(m<<4)|0;k=+g[b+(m<<4)+4>>2];f=+g[b+(m<<4)+8>>2];l=+D(+(k*k+f*f));if(l!=0.0){j=f*(e/l);f=+g[i>>2]<0.0?-h:h;e=k*(e/l)}else{j=0.0;f=+g[i>>2]<0.0?-h:h}g[c+(m<<4)>>2]=f;g[c+(m<<4)+4>>2]=e;g[c+(m<<4)+8>>2]=j;m=m+1|0}while((m|0)!=(d|0));return}function sl(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;j=c[b>>2]|0;if(!e)e=c[a+188>>2]|0;i=c[a+328>>2]|0;if((i|0)<=0)return;h=c[a+336>>2]|0;f=0;while(1){g=h+(f<<2)|0;if((c[g>>2]|0)==(j|0))break;f=f+1|0;if((f|0)>=(i|0)){k=9;break}}if((k|0)==9)return;if((f|0)>=(i|0))return;c[g>>2]=c[h+(i+-1<<2)>>2];c[a+328>>2]=i+-1;k=c[a+344>>2]|0;Cb[c[(c[k>>2]|0)+12>>2]&31](k,e,b,d)|0;return}function tl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;e=l;l=l+32|0;d=c[a+216>>2]|0;if(+g[d+4>>2]==0.0){d=0;l=e;return d|0}b=c[b>>2]|0;if(!(zb[c[(c[d>>2]|0)+8>>2]&31](d,c[b+188>>2]|0)|0)){d=1;l=e;return d|0}f=c[b+192>>2]|0;d=c[a+216>>2]|0;c[e>>2]=0;c[e+4>>2]=f;c[e+8>>2]=b;c[e+12>>2]=b+4;c[e+16>>2]=-1;c[e+20>>2]=-1;ad(a+68|0,a+132|0,e,d);d=1;l=e;return d|0}function ul(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;c[b+4>>2]=c[d>>2];c[b>>2]=6512;a[b+24>>0]=1;c[b+20>>2]=0;c[b+12>>2]=0;c[b+16>>2]=0;a[b+44>>0]=1;c[b+40>>2]=0;c[b+32>>2]=0;c[b+36>>2]=0;a[b+64>>0]=1;c[b+60>>2]=0;c[b+52>>2]=0;c[b+56>>2]=0;a[b+68>>0]=g&1;c[b+72>>2]=c[d+4>>2];a[b+76>>0]=0;c[b+80>>2]=c[(c[(g?f:e)+4>>2]|0)+72>>2];eh(b,e,f);return}function vl(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0,h=0,i=0,j=0;j=c[a+72>>2]|0;i=c[a+68>>2]|0;h=c[a+76>>2]|0;e=+g[a+64>>2]*(+g[b+(j<<2)>>2]/+g[a+16+(j<<2)>>2]);g[a+64>>2]=e;f=+g[a+60>>2]*(+g[b+(i<<2)>>2]/+g[a+16+(i<<2)>>2]+ +g[b+(h<<2)>>2]/+g[a+16+(h<<2)>>2])*.5;g[a+60>>2]=f;g[a+56>>2]=f/+D(+(e*e+f*f));f=+C(+(+g[b>>2]));e=+C(+(+g[b+4>>2]));d=+C(+(+g[b+8>>2]));g[a+16>>2]=f;g[a+20>>2]=e;g[a+24>>2]=d;g[a+28>>2]=0.0;return}function wl(b){b=b|0;var d=0;c[b>>2]=5356;d=c[b+336>>2]|0;if(d|0){if(a[b+340>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+336>>2]=0}a[b+340>>0]=1;c[b+336>>2]=0;c[b+328>>2]=0;c[b+332>>2]=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(!d){a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;b=b+292|0;c[b>>2]=0;return}if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;b=b+292|0;c[b>>2]=0;return}function xl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0;if((d|0)<=0)return;m=0;do{e=+g[a+32>>2];i=+g[a+40>>2];k=+g[b+(m<<4)>>2];f=+g[b+(m<<4)+4>>2];l=+D(+(k*k+f*f));h=+g[b+(m<<4)+8>>2];if(l!=0.0){j=f*(e/l);f=h<0.0?-i:i;e=k*(e/l)}else{j=0.0;f=h<0.0?-i:i}g[c+(m<<4)>>2]=e;g[c+(m<<4)+4>>2]=j;g[c+(m<<4)+8>>2]=f;m=m+1|0}while((m|0)!=(d|0));return}function yl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0;if((d|0)<=0)return;m=0;do{e=+g[a+32>>2];i=+g[a+36>>2];k=+g[b+(m<<4)>>2];f=+g[b+(m<<4)+8>>2];l=+D(+(k*k+f*f));h=+g[b+(m<<4)+4>>2];if(l!=0.0){j=f*(e/l);f=h<0.0?-i:i;e=k*(e/l)}else{j=0.0;f=h<0.0?-i:i}g[c+(m<<4)>>2]=e;g[c+(m<<4)+4>>2]=f;g[c+(m<<4)+8>>2]=j;m=m+1|0}while((m|0)!=(d|0));return}function zl(b){b=b|0;var d=0;c[b>>2]=4324;d=c[b+556>>2]|0;if(d|0){if(a[b+560>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+556>>2]=0}a[b+560>>0]=1;c[b+556>>2]=0;c[b+548>>2]=0;c[b+552>>2]=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(!d){a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;b=b+292|0;c[b>>2]=0;return}if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0;a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;b=b+292|0;c[b>>2]=0;return}function Al(b){b=b|0;var d=0;d=bt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;g[d+48>>2]=.03999999910593033;c[d+56>>2]=0;c[d+60>>2]=1065353216;c[d+64>>2]=1065353216;c[d+68>>2]=1065353216;g[d+72>>2]=0.0;c[d+76>>2]=-1082130432;c[d+80>>2]=-1082130432;c[d+84>>2]=-1082130432;g[d+88>>2]=0.0;a[d+92>>0]=0;c[d>>2]=8036;c[d+96>>2]=b;c[d+4>>2]=3;uj(d);return d|0}function Bl(b){b=b|0;var d=0,e=0;d=c[b>>2]|0;if(d|0)Hn(b,d);d=c[b+4>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+4>>2]=0;c[b+8>>2]=-1;d=c[b+32>>2]|0;if(!d){d=b+28|0;e=b+16|0;c[e>>2]=0;a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[d>>2]=0;return}if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0;e=b+28|0;d=b+16|0;c[d>>2]=0;a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[e>>2]=0;return}function Cl(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=l;l=l+48|0;c[f+32>>2]=9284;c[f+32+4>>2]=e;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];c[f+16>>2]=c[d>>2];c[f+16+4>>2]=c[d+4>>2];c[f+16+8>>2]=c[d+8>>2];c[f+16+12>>2]=c[d+12>>2];Bf(c[a+4>>2]|0,f,f+32|0);Bf(c[a+44>>2]|0,f,f+32|0);l=f;return}function Dl(b){b=b|0;var d=0;d=c[b>>2]|0;if(d|0)Hn(b,d);d=c[b+4>>2]|0;if(d|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+4>>2]=0;c[b+8>>2]=-1;d=c[b+32>>2]|0;if(!d){a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;d=b+28|0;c[d>>2]=0;b=b+16|0;c[b>>2]=0;return}if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0;a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;d=b+28|0;c[d>>2]=0;b=b+16|0;c[b>>2]=0;return}function El(b,d){b=b|0;d=+d;var e=0,f=0,h=0.0;d=1.0/+g[(c[b+108>>2]|0)+404>>2];if((c[b+128>>2]|0)<=0)return;e=0;do{f=c[b+136>>2]|0;if(!(a[f+(e*284|0)+84>>0]|0))h=0.0;else{h=+g[f+(e*284|0)+272>>2];h=d*(+g[f+(e*284|0)+216>>2]*(+g[f+(e*284|0)+204>>2]-+g[f+(e*284|0)+32>>2])*+g[f+(e*284|0)+268>>2]-h*+g[(h<0.0?f+(e*284|0)+220|0:f+(e*284|0)+224|0)>>2]);h=h<0.0?0.0:h}g[f+(e*284|0)+276>>2]=h;e=e+1|0}while((e|0)<(c[b+128>>2]|0));return}function Fl(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0,f=0.0,h=0.0,i=0.0;e=l;l=l+48|0;f=+XI(b);h=+XI(c);i=+XI(d);b=+WI(b);c=+WI(c);d=+WI(d);g[e+32>>2]=h*i;g[e+28>>2]=c*b*i-f*d;g[e+24>>2]=c*f*i+b*d;g[e+20>>2]=h*d;g[e+16>>2]=c*b*d+f*i;g[e+12>>2]=c*f*d-b*i;g[e+8>>2]=-c;g[e+4>>2]=h*b;g[e>>2]=h*f;Ip(a,e+32|0,e+28|0,e+24|0,e+20|0,e+16|0,e+12|0,e+8|0,e+4|0,e);l=e;return}function Gl(a,d,f,g,h,i){a=a|0;d=d|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0;j=c[a+108>>2]|0;if(j|0){$b[c[(c[j>>2]|0)+24>>2]&7](j,d,f,g,h,i);return}d=b[a+56>>1]|0;if(!(d<<16>>16))return;h=1;i=1;do{f=c[a+68>>2]|0;if(b[f+(i<<2)>>1]&1){zb[c[(c[g>>2]|0)+8>>2]&31](g,(c[a+60>>2]|0)+((e[f+(i<<2)+2>>1]|0)<<6)|0)|0;d=b[a+56>>1]|0}h=h+1<<16>>16;i=h&65535}while(i>>>0<((d&65535)<<1|1)>>>0);return}function Hl(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;f=+g[a+32>>2]/+g[a+16>>2];e=+g[a+36>>2]/+g[a+20>>2];d=+g[a+40>>2]/+g[a+24>>2];j=+C(+(+g[b>>2]));i=+C(+(+g[b+4>>2]));h=+C(+(+g[b+8>>2]));g[a+16>>2]=j;g[a+20>>2]=i;g[a+24>>2]=h;g[a+28>>2]=0.0;e=e*+g[b+4>>2];d=d*+g[b+8>>2];g[a+32>>2]=f*+g[b>>2];g[a+36>>2]=e;g[a+40>>2]=d;g[a+44>>2]=0.0;c[a+48>>2]=c[a+32+((((c[a+56>>2]|0)+2|0)%3|0)<<2)>>2];return}function Il(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[d>>2]|0;b=zb[c[(c[b>>2]|0)+56>>2]&31](b,80)|0;d=c[d>>2]|0;c[b+4>>2]=d;c[b>>2]=5820;c[b+8>>2]=5868;c[b+56>>2]=d;c[b+60>>2]=0;c[b+44>>2]=f;c[b+48>>2]=e;f=Bb[c[(c[d>>2]|0)+12>>2]&63](d,c[f+8>>2]|0,c[e+8>>2]|0)|0;c[b+72>>2]=f;e=c[b+56>>2]|0;Ob[c[(c[e>>2]|0)+20>>2]&127](e,f);a[b+76>>0]=1;return b|0}function Jl(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=l;l=l+16|0;c[h>>2]=a;c[h+4>>2]=e;e=c[(c[b+4>>2]|0)+4>>2]|0;g=c[(c[d+4>>2]|0)+4>>2]|0;if((f|0)==1){f=c[a+76+(e*144|0)+(g<<2)>>2]|0;f=Cb[c[(c[f>>2]|0)+8>>2]&31](f,h,b,d)|0;l=h;return f|0}else{f=c[a+5260+(e*144|0)+(g<<2)>>2]|0;f=Cb[c[(c[f>>2]|0)+8>>2]&31](f,h,b,d)|0;l=h;return f|0}return 0}function Kl(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,h=0.0,i=0.0;e=+g[a+32>>2];i=+g[a+36>>2];h=+g[a+40>>2];switch(d|0){case 0:{a=0;d=0;f=1065353216;break}case 1:{a=0;d=0;f=-1082130432;break}case 2:{a=0;d=1065353216;f=0;e=i;break}case 3:{a=0;d=-1082130432;f=0;e=i;break}case 4:{a=1065353216;d=0;f=0;e=h;break}case 5:{a=-1082130432;d=0;f=0;e=h;break}default:return}c[b>>2]=f;c[b+4>>2]=d;c[b+8>>2]=a;g[b+12>>2]=-e;return}function Ll(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[d>>2]|0;b=zb[c[(c[b>>2]|0)+56>>2]&31](b,80)|0;d=c[d>>2]|0;c[b+4>>2]=d;c[b>>2]=5820;c[b+8>>2]=5868;c[b+56>>2]=d;c[b+60>>2]=0;c[b+44>>2]=e;c[b+48>>2]=f;f=Bb[c[(c[d>>2]|0)+12>>2]&63](d,c[e+8>>2]|0,c[f+8>>2]|0)|0;c[b+72>>2]=f;e=c[b+56>>2]|0;Ob[c[(c[e>>2]|0)+20>>2]&127](e,f);a[b+76>>0]=0;return b|0}function Ml(a){a=a|0;var b=0,d=0,e=0,f=0.0,h=0.0;e=c[a+248>>2]|0;if((e|0)<=0)return;b=c[a+256>>2]|0;a=0;do{d=c[b+(a<<2)>>2]|0;switch(c[d+220>>2]|0){case 2:case 5:break;default:if(!(c[d+204>>2]&3)){h=+g[d+428>>2]*+g[d+412>>2];f=+g[d+432>>2]*+g[d+416>>2];g[d+472>>2]=+g[d+424>>2]*+g[d+408>>2]+ +g[d+472>>2];g[d+476>>2]=h+ +g[d+476>>2];g[d+480>>2]=f+ +g[d+480>>2]}}a=a+1|0}while((a|0)!=(e|0));return}function Nl(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0,m=0.0;c=l;l=l+16|0;m=+g[a+12>>2];i=+g[(gJ(b)|0)>>2];j=+g[a>>2];k=+g[b+12>>2];h=+g[a+4>>2];d=+g[(NI(b)|0)>>2];e=+g[a+8>>2];f=+g[(OI(b)|0)>>2];g[c+12>>2]=m*i+j*k+h*d-e*f;g[c+8>>2]=m*f+h*k+e*i-j*d;g[c+4>>2]=m*d+e*k+j*f-h*i;g[c>>2]=m*k-j*i-h*f-e*d;as(a,c+12|0,c+8|0,c+4|0,c);l=c;return a|0}function Ol(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0.0,h=0.0,i=0.0,j=0,k=0;e=l;l=l+16|0;j=c[a+56>>2]|0;k=c[a+32+(((j+2|0)%3|0)<<2)>>2]|0;c[e>>2]=k;c[e+4>>2]=k;c[e+8>>2]=k;g[e+12>>2]=0.0;g[e+(j<<2)>>2]=+g[a+32+(j<<2)>>2]+ +g[e+(j<<2)>>2];h=+g[e>>2]*2.0;f=+g[e+4>>2]*2.0;i=+g[e+8>>2]*2.0;g[d>>2]=b*.0833333283662796*(f*f+i*i);g[d+4>>2]=b*.0833333283662796*(h*h+i*i);g[d+8>>2]=b*.0833333283662796*(h*h+f*f);l=e;return}function Pl(a,b){a=a|0;b=+b;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0;h=+nb[c[(c[a>>2]|0)+48>>2]&15](a);e=+nb[c[(c[a>>2]|0)+48>>2]&15](a);i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);h=h+ +g[a+32>>2];e=e+ +g[a+36>>2];i=i+ +g[a+40>>2];g[a+48>>2]=b;f=+nb[c[(c[a>>2]|0)+48>>2]&15](a);d=+nb[c[(c[a>>2]|0)+48>>2]&15](a);b=i-+nb[c[(c[a>>2]|0)+48>>2]&15](a);g[a+32>>2]=h-f;g[a+36>>2]=e-d;g[a+40>>2]=b;g[a+44>>2]=0.0;return}function Ql(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;if((c[a+8>>2]|0)<=0)return;e=0;a:while(1){while(1){f=c[a+16>>2]|0;g=f+(e<<4)|0;if(!(zb[c[(c[b>>2]|0)+8>>2]&31](b,g)|0))break;Cb[c[(c[a>>2]|0)+12>>2]&31](a,c[g>>2]|0,c[f+(e<<4)+4>>2]|0,d)|0;c[6156]=(c[6156]|0)+-1;if((e|0)>=(c[a+8>>2]|0)){e=7;break a}}e=e+1|0;if((e|0)>=(c[a+8>>2]|0)){e=7;break}}if((e|0)==7)return}function Rl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[d>>2]|0;b=zb[c[(c[b>>2]|0)+56>>2]&31](b,16)|0;d=c[d>>2]|0;c[b+4>>2]=d;c[b>>2]=5888;a[b+8>>0]=0;c[b+12>>2]=0;if(!(Bb[c[(c[d>>2]|0)+24>>2]&63](d,c[e+8>>2]|0,c[f+8>>2]|0)|0))return b|0;d=c[b+4>>2]|0;c[b+12>>2]=Bb[c[(c[d>>2]|0)+12>>2]&63](d,c[e+8>>2]|0,c[f+8>>2]|0)|0;a[b+8>>0]=1;return b|0}function Sl(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;f=(a[b+8>>0]|0)!=0;h=c[(f?e:d)+8>>2]|0;f=f?d:e;g=c[f+8>>2]|0;d=c[h+328>>2]|0;a:do if((d|0)>0){e=c[h+336>>2]|0;b=0;while(1){if((c[e+(b<<2)>>2]|0)==(g|0))break;b=b+1|0;if((b|0)>=(d|0))break a}if((b|0)!=(d|0))return}while(0);e=c[h+344>>2]|0;Sb[c[(c[e>>2]|0)+36>>2]&127](e,h,f);return}function Tl(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;a[b+251>>0]=1;c[b+68>>2]=c[d>>2];c[b+68+4>>2]=c[d+4>>2];c[b+68+8>>2]=c[d+8>>2];c[b+68+12>>2]=c[d+12>>2];e=+g[b+68>>2];f=+g[b+72>>2];h=+g[b+76>>2];i=+D(+(e*e+f*f+h*h));if(i>1.1920928955078125e-07){j=e*(1.0/i);f=f*(1.0/i);e=h*(1.0/i);d=c[b+80>>2]|0}else{j=0.0;f=0.0;e=0.0;d=0}g[b+84>>2]=j;g[b+88>>2]=f;g[b+92>>2]=e;c[b+96>>2]=d;return}function Ul(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);h=+nb[c[(c[a>>2]|0)+48>>2]&15](a);f=+nb[c[(c[a>>2]|0)+48>>2]&15](a);k=+g[b+52>>2]-h;j=+g[b+56>>2]-f;g[d>>2]=+g[b+48>>2]-i;g[d+4>>2]=k;g[d+8>>2]=j;g[d+12>>2]=0.0;h=h+ +g[b+52>>2];f=f+ +g[b+56>>2];g[e>>2]=i+ +g[b+48>>2];g[e+4>>2]=h;g[e+8>>2]=f;g[e+12>>2]=0.0;return}function Vl(a,b){a=a|0;b=+b;var d=0,e=0.0,f=0.0,h=0.0,i=0.0;d=nt()|0;c[d+4>>2]=35;c[d+8>>2]=0;c[d+12>>2]=-1;g[d+16>>2]=0.0;c[d>>2]=7396;i=+g[a>>2];h=+g[a+4>>2];f=+g[a+8>>2];a=c[a+12>>2]|0;e=1.0/+D(+(i*i+h*h+f*f));g[d+52>>2]=i*e;g[d+56>>2]=h*e;g[d+60>>2]=f*e;c[d+64>>2]=a;g[d+68>>2]=b;c[d+72>>2]=1065353216;c[d+76>>2]=1065353216;c[d+80>>2]=1065353216;g[d+84>>2]=0.0;c[d+4>>2]=28;return d|0}function Wl(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=c[a+780>>2]|0;h=c[a+792>>2]|0;if((h|0)<=0){h=0;return h|0}e=c[a+800>>2]|0;a=0;while(1){f=c[e+(a*52|0)+24>>2]|0;if((f|0)==(g+(b*104|0)|0)?(c[e+(a*52|0)+28>>2]|0)==(g+(d*104|0)|0):0){a=1;e=8;break}if((f|0)==(g+(d*104|0)|0)?(c[e+(a*52|0)+28>>2]|0)==(g+(b*104|0)|0):0){a=1;e=8;break}a=a+1|0;if((a|0)>=(h|0)){a=0;e=8;break}}if((e|0)==8)return a|0;return 0}function Xl(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=Rs()|0;Ra(f|0,a|0,b|0,d|0,e|0,0);c[f>>2]=4600;g[f+968>>2]=0.0;g[f+1056>>2]=0.0;g[f+1144>>2]=0.0;g[f+972>>2]=0.0;g[f+1060>>2]=0.0;g[f+1148>>2]=0.0;c[f+680>>2]=0;c[f+680+4>>2]=0;c[f+680+8>>2]=0;c[f+680+12>>2]=0;c[f+680+16>>2]=0;c[f+680+20>>2]=0;c[f+680+24>>2]=0;c[f+680+28>>2]=0;return f|0}function Yl(a){a=a|0;var b=0,d=0,e=0.0,f=0.0;if((c[a+128>>2]|0)<=0)return;b=0;do{d=c[a+136>>2]|0;c[d+(b*284|0)+32>>2]=c[d+(b*284|0)+204>>2];g[d+(b*284|0)+272>>2]=0.0;f=-+g[d+(b*284|0)+56>>2];e=-+g[d+(b*284|0)+60>>2];g[d+(b*284|0)>>2]=-+g[d+(b*284|0)+52>>2];g[d+(b*284|0)+4>>2]=f;g[d+(b*284|0)+8>>2]=e;g[d+(b*284|0)+12>>2]=0.0;g[d+(b*284|0)+268>>2]=1.0;b=b+1|0}while((b|0)<(c[a+128>>2]|0));return}function Zl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=c[d>>2]|0;g=zb[c[(c[g>>2]|0)+56>>2]&31](g,20)|0;h=c[d+4>>2]|0;i=a[b+4>>0]|0;b=c[d>>2]|0;c[g+4>>2]=b;c[g>>2]=6352;a[g+8>>0]=0;c[g+12>>2]=h;a[g+16>>0]=i;if(h|0)return g|0;c[g+12>>2]=Bb[c[(c[b>>2]|0)+12>>2]&63](b,c[e+8>>2]|0,c[f+8>>2]|0)|0;a[g+8>>0]=1;return g|0}function _l(b){b=b|0;var d=0;c[b>>2]=5356;d=c[b+336>>2]|0;if(d|0){if(a[b+340>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+336>>2]=0}a[b+340>>0]=1;c[b+336>>2]=0;c[b+328>>2]=0;c[b+332>>2]=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(d|0){if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0}a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function $l(b){b=b|0;var d=0;c[b>>2]=4324;d=c[b+556>>2]|0;if(d|0){if(a[b+560>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+556>>2]=0}a[b+560>>0]=1;c[b+556>>2]=0;c[b+548>>2]=0;c[b+552>>2]=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(d|0){if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0}a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function am(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=l;l=l+48|0;c[f>>2]=7376;c[f+4>>2]=b;c[f+8>>2]=c[d>>2];c[f+8+4>>2]=c[d+4>>2];c[f+8+8>>2]=c[d+8>>2];c[f+8+12>>2]=c[d+12>>2];c[f+24>>2]=c[e>>2];c[f+24+4>>2]=c[e+4>>2];c[f+24+8>>2]=c[e+8>>2];c[f+24+12>>2]=c[e+12>>2];b=c[a+52>>2]|0;Vb[c[(c[b>>2]|0)+8>>2]&127](b,f,d,e);l=f;return}function bm(a,b,d){a=a|0;b=+b;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;i=+g[a+32>>2];f=+g[a+36>>2];j=+g[a+40>>2];h=+nb[c[(c[a>>2]|0)+48>>2]&15](a);e=+nb[c[(c[a>>2]|0)+48>>2]&15](a);j=(j+ +nb[c[(c[a>>2]|0)+48>>2]&15](a))*2.0;g[d>>2]=b/12.0*((f+e)*2.0*(f+e)*2.0+j*j);g[d+4>>2]=b/12.0*((i+h)*2.0*(i+h)*2.0+j*j);g[d+8>>2]=b/12.0*((i+h)*2.0*(i+h)*2.0+(f+e)*2.0*(f+e)*2.0);g[d+12>>2]=0.0;return}function cm(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0;d=l;l=l+16|0;c[d>>2]=9320;c[d+4>>2]=e;i=c[a+168>>2]|0;ze(c[a+4>>2]|0,b,e+4|0,e+20|0,+g[e+32>>2],f,h,i,d);ze(c[a+44>>2]|0,b,e+4|0,e+20|0,+g[e+32>>2],f,h,i,d);l=d;return}function dm(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=l;l=l+32|0;uq(a,+g[b>>2],+g[b+4>>2],+g[b+8>>2]);jq(d,+g[b>>2],+g[b+4>>2],+g[b+8>>2],+g[a+408>>2],+g[a+412>>2],+g[a+416>>2]);Ap(d+16|0,+g[c>>2],+g[c+4>>2],+g[c+8>>2],+g[d>>2],+g[d+4>>2],+g[d+8>>2]);yq(a,+g[d+16>>2],+g[d+16+4>>2],+g[d+16+8>>2]);l=d;return}function em(a,b){a=a|0;b=b|0;var d=0;d=l;l=l+64|0;c[d>>2]=1065353216;c[d+4>>2]=0;c[d+4+4>>2]=0;c[d+4+8>>2]=0;c[d+4+12>>2]=0;c[d+20>>2]=1065353216;c[d+24>>2]=0;c[d+24+4>>2]=0;c[d+24+8>>2]=0;c[d+24+12>>2]=0;c[d+40>>2]=1065353216;c[d+44>>2]=0;c[d+48>>2]=c[b>>2];c[d+48+4>>2]=c[b+4>>2];c[d+48+8>>2]=c[b+8>>2];c[d+48+12>>2]=c[b+12>>2];Ld(a,d);l=d;return}function fm(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=+d;e=+e;var f=0,h=0;f=l;l=l+16|0;h=$G(b,0)|0;g[f+8>>2]=+Iy(+g[h>>2],+g[h+4>>2],+g[h+8>>2],c,d,e);h=$G(b,1)|0;g[f+4>>2]=+Iy(+g[h>>2],+g[h+4>>2],+g[h+8>>2],c,d,e);b=$G(b,2)|0;g[f>>2]=+Iy(+g[b>>2],+g[b+4>>2],+g[b+8>>2],c,d,e);$s(a,f+8|0,f+4|0,f);l=f;return}function gm(){var a=0,b=0,d=0;a=it()|0;c[a>>2]=1025;b=a+120|0;d=b+44|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(d|0));b=a+312|0;d=b+44|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(d|0));b=a+504|0;d=b+44|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(d|0));b=a+696|0;d=b+44|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(d|0));c[a+772>>2]=0;c[a+776>>2]=0;c[a+780>>2]=0;c[a+800>>2]=0;return a|0}function hm(a,b,d){a=a|0;b=b|0;d=d|0;a:do switch(c[b+220>>2]|0){case 2:case 5:{switch(c[d+220>>2]|0){case 2:case 5:{a=0;break}default:break a}return a|0}default:{}}while(0);if(!((c[b+280>>2]|0)!=0?!(zb[c[(c[b>>2]|0)+12>>2]&31](b,d)|0):0)){if(!(c[d+280>>2]|0)){d=1;return d|0}if(zb[c[(c[d>>2]|0)+12>>2]&31](d,b)|0){d=1;return d|0}}d=0;return d|0}function im(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=c[a+296>>2]|0;a:do if((f|0)>0){e=c[a+304>>2]|0;d=0;while(1){if((c[e+(d<<2)>>2]|0)==(b|0))break a;d=d+1|0;if((d|0)>=(f|0)){d=f;break}}}else d=f;while(0);if((f|0)<=(d|0))return;g=c[a+304>>2]|0;b=g+(d<<2)|0;e=c[b>>2]|0;c[b>>2]=c[g+(f+-1<<2)>>2];c[(c[a+304>>2]|0)+(f+-1<<2)>>2]=e;c[a+296>>2]=f+-1;return}function jm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;j=+g[a+32>>2];h=+g[a+36>>2];e=+g[a+40>>2];i=+nb[c[(c[a>>2]|0)+48>>2]&15](a);f=+nb[c[(c[a>>2]|0)+48>>2]&15](a);e=e+ +nb[c[(c[a>>2]|0)+48>>2]&15](a);g[d>>2]=+(b&1^1|0)*(j+i)-+(b&1|0)*(j+i);g[d+4>>2]=+(b>>>1&1^1|0)*(h+f)-+(b>>>1&1|0)*(h+f);g[d+8>>2]=+(b>>>2&1^1|0)*e-+(b>>>2&1|0)*e;g[d+12>>2]=0.0;return}function km(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=+d;e=+e;var f=0,h=0,i=0,j=0;f=l;l=l+16|0;j=$G(b,0)|0;i=$G(b,1)|0;h=$G(b,2)|0;an(f,c,d,e,+g[j>>2],+g[j+4>>2],+g[j+8>>2],+g[i>>2],+g[i+4>>2],+g[i+8>>2],+g[h>>2],+g[h+4>>2],+g[h+8>>2]);iq(a,+g[f>>2],+g[f+4>>2],+g[f+8>>2],+g[b+48>>2],+g[b+52>>2],+g[b+56>>2]);l=f;return}function lm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0;e=l;l=l+16|0;c[e>>2]=-1;c[e+4>>2]=c[a+20>>2];if(!(c[b+4>>2]|0))c[b+4>>2]=e;g=c[a+16>>2]|0;f=+qb[c[(c[g>>2]|0)+12>>2]&31](g,b,d);c[a+4>>2]=c[(c[a+16>>2]|0)+4>>2];l=e;return +f}function mm(b,d){b=b|0;d=d|0;if((c[b+16>>2]|0)!=(0-(c[b+56>>2]|0)|0))return;Dl(b+4|0);Dl(b+44|0);a[b+153>>0]=0;a[b+154>>0]=1;c[b+104>>2]=0;c[b+124>>2]=0;c[b+108>>2]=1;c[b+112>>2]=0;c[b+116>>2]=10;c[b+120>>2]=1;c[b+84>>2]=0;c[b+84+4>>2]=0;c[b+84+8>>2]=0;c[b+128>>2]=0;c[b+128+4>>2]=0;c[b+128+8>>2]=0;c[b+128+12>>2]=0;c[b+128+16>>2]=0;c[b+128+20>>2]=0;return}function nm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;i=+g[b+32>>2];j=+g[b+36>>2];e=+g[b+40>>2];h=+nb[c[(c[b>>2]|0)+48>>2]&15](b);f=+nb[c[(c[b>>2]|0)+48>>2]&15](b);e=e+ +nb[c[(c[b>>2]|0)+48>>2]&15](b);f=+g[d+4>>2]>=0.0?j+f:-(j+f);e=+g[d+8>>2]>=0.0?e:-e;g[a>>2]=+g[d>>2]>=0.0?i+h:-(i+h);g[a+4>>2]=f;g[a+8>>2]=e;g[a+12>>2]=0.0;return}function om(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0.0,h=0.0,i=0.0;if((d|0)<=0)return;e=0;do{i=+g[a+32>>2];h=+g[a+36>>2];h=+g[b+(e<<4)+4>>2]>=0.0?h:-h;f=+g[a+40>>2];f=+g[b+(e<<4)+8>>2]>=0.0?f:-f;g[c+(e<<4)>>2]=+g[b+(e<<4)>>2]>=0.0?i:-i;g[c+(e<<4)+4>>2]=h;g[c+(e<<4)+8>>2]=f;g[c+(e<<4)+12>>2]=0.0;e=e+1|0}while((e|0)!=(d|0));return}function pm(a,b,d,e,f,g,h,i,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;a=c[a+32>>2]|0;c[d>>2]=c[a+(k<<5)+12>>2];c[b>>2]=c[a+(k<<5)+16>>2];c[e>>2]=c[a+(k<<5)+28>>2];c[f>>2]=c[a+(k<<5)+20>>2];c[i>>2]=c[a+(k<<5)>>2];c[g>>2]=c[a+(k<<5)+4>>2];c[h>>2]=c[a+(k<<5)+8>>2];c[j>>2]=c[a+(k<<5)+24>>2];return}function qm(b){b=b|0;var d=0,e=0;c[b>>2]=6640;d=c[b+68>>2]|0;if(d|0?(Bl(d),e=c[b+68>>2]|0,e|0):0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}d=c[b+28>>2]|0;if(!d){a[b+32>>0]=1;c[b+28>>2]=0;c[b+20>>2]=0;b=b+24|0;c[b>>2]=0;return}if(a[b+32>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+28>>2]=0;a[b+32>>0]=1;c[b+28>>2]=0;c[b+20>>2]=0;b=b+24|0;c[b>>2]=0;return}function rm(b){b=b|0;var d=0,e=0;c[b>>2]=7604;d=c[b+108>>2]|0;if(d|0){if(a[b+112>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+108>>2]=0}a[b+112>>0]=1;c[b+108>>2]=0;c[b+100>>2]=0;c[b+104>>2]=0;c[b>>2]=7472;d=c[b+56>>2]|0;if(d|0?(Ib[c[c[d>>2]>>2]&511](d),e=c[b+56>>2]|0,e|0):0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function sm(a,b){a=a|0;b=+b;var d=0;d=l;l=l+16|0;c[a+8>>2]=0;c[a+12>>2]=-1;c[a+16>>2]=1065353216;c[a+20>>2]=1065353216;c[a+24>>2]=1065353216;g[a+28>>2]=0.0;g[a+48>>2]=.03999999910593033;c[a>>2]=7020;c[a+4>>2]=8;g[d+8>>2]=1.0;g[d+4>>2]=1.0;g[d>>2]=1.0;$s(a+16|0,d+8|0,d+4|0,d);Fs(a+32|0);MG(a+32|0,b);g[a+48>>2]=b;g[a+52>>2]=0.0;l=d;return}function tm(a,b){a=+a;b=+b;var d=0;d=Jt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;g[d+48>>2]=.03999999910593033;g[d+60>>2]=a;g[d+64>>2]=b;c[d+4>>2]=11;g[d+56>>2]=a/+D(+(a*a+b*b));c[d>>2]=6820;c[d+68>>2]=0;c[d+72>>2]=2;c[d+76>>2]=1;g[d+32>>2]=a;g[d+40>>2]=b;g[d+36>>2]=a;return d|0}function um(a,b){a=+a;b=+b;var d=0;d=Jt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;g[d+48>>2]=.03999999910593033;g[d+60>>2]=a;g[d+64>>2]=b;c[d+4>>2]=11;g[d+56>>2]=a/+D(+(a*a+b*b));c[d>>2]=6920;c[d+68>>2]=1;c[d+72>>2]=0;c[d+76>>2]=2;g[d+36>>2]=a;g[d+32>>2]=b;g[d+40>>2]=a;return d|0}function vm(a,b){a=+a;b=+b;var d=0;d=Jt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;g[d+48>>2]=.03999999910593033;c[d>>2]=6720;g[d+60>>2]=a;g[d+64>>2]=b;c[d+4>>2]=11;c[d+68>>2]=0;c[d+72>>2]=1;c[d+76>>2]=2;g[d+32>>2]=a;g[d+36>>2]=b;g[d+40>>2]=a;g[d+56>>2]=a/+D(+(a*a+b*b));return d|0}function wm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;switch(b|0){case 0:{a=0;b=0;e=1065353216;break}case 1:{a=0;b=0;e=-1082130432;break}case 2:{a=0;b=1065353216;e=0;break}case 3:{a=0;b=-1082130432;e=0;break}case 4:{a=1065353216;b=0;e=0;break}case 5:{a=-1082130432;b=0;e=0;break}default:return}c[d>>2]=e;c[d+4>>2]=b;c[d+8>>2]=a;g[d+12>>2]=0.0;return}function xm(b,d,e,f){b=b|0;d=d|0;e=e|0;f=+f;c[b+4>>2]=c[d>>2];c[b+4+4>>2]=c[d+4>>2];c[b+4+8>>2]=c[d+8>>2];c[b+4+12>>2]=c[d+12>>2];c[b+20>>2]=c[e>>2];c[b+20+4>>2]=c[e+4>>2];c[b+20+8>>2]=c[e+8>>2];c[b+20+12>>2]=c[e+12>>2];g[b+36>>2]=f;a[b+40>>0]=1;return}function ym(a,e,f){a=a|0;e=e|0;f=f|0;var h=0.0;switch(c[a+100>>2]|0){case 0:{h=+g[(c[a+96>>2]|0)+((P(c[a+68>>2]|0,f)|0)+e<<2)>>2];return +h}case 5:{h=+(d[(c[a+96>>2]|0)+((P(c[a+68>>2]|0,f)|0)+e)>>0]|0)*+g[a+92>>2];return +h}case 3:{h=+(b[(c[a+96>>2]|0)+((P(c[a+68>>2]|0,f)|0)+e<<1)>>1]|0)*+g[a+92>>2];return +h}default:{h=0.0;return +h}}return 0.0}function zm(a,b){a=a|0;b=b|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];c[a+16>>2]=c[b+16>>2];c[a+20>>2]=c[b+20>>2];c[a+24>>2]=c[b+24>>2];Vm(a+28|0,b+28|0);c[a+76>>2]=c[b+76>>2];c[a+76+4>>2]=c[b+76+4>>2];c[a+76+8>>2]=c[b+76+8>>2];c[a+76+12>>2]=c[b+76+12>>2];c[a+76+16>>2]=c[b+76+16>>2];return}function Am(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;switch(e|0){case 5:case -1:break;default:return}switch(b|0){case 2:{g[a+764>>2]=d;c[a+748>>2]=c[a+748>>2]|2;return}case 4:{g[a+760>>2]=d;c[a+748>>2]=c[a+748>>2]|1;return}case 3:{g[a+752>>2]=d;c[a+748>>2]=c[a+748>>2]|4;return}case 1:{g[a+756>>2]=d;c[a+748>>2]=c[a+748>>2]|8;return}default:return}}function Bm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=gJ(c[a+4>>2]|0)|0;if((e|0)>(b|0)){c[a+4>>2]=b;return}if((e|0)<(b|0))ko(a,b);while(1){if((e|0)>=(b|0))break;f=gJ((c[a+12>>2]|0)+(e*52|0)|0)|0;g=d;h=f+52|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));e=e+1|0}c[a+4>>2]=b;return}function Cm(a,b){a=a|0;b=b|0;var c=0.0,d=0;d=l;l=l+32|0;c=+g[b+12>>2];if(1.0-c*c<1.1920928955078125e-06){g[d+20>>2]=1.0;g[d+16>>2]=0.0;g[d+12>>2]=0.0;$s(a,d+20|0,d+16|0,d+12|0);l=d;return}else{c=1.0/+VI(1.0-c*c);g[d+8>>2]=+g[b>>2]*c;g[d+4>>2]=+g[b+4>>2]*c;g[d>>2]=+g[b+8>>2]*c;$s(a,d+8|0,d+4|0,d);l=d;return}}function Dm(b){b=b|0;var d=0;c[b>>2]=7604;d=c[b+108>>2]|0;if(d|0){if(a[b+112>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+108>>2]=0}a[b+112>>0]=1;c[b+108>>2]=0;c[b+100>>2]=0;c[b+104>>2]=0;c[b>>2]=7472;d=c[b+56>>2]|0;if(!d)return;Ib[c[c[d>>2]>>2]&511](d);d=c[b+56>>2]|0;if(!d)return;c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);return}function Em(a,b){a=+a;b=b|0;var d=0,e=0,f=0;h[j>>3]=a;d=c[j>>2]|0;e=c[j+4>>2]|0;f=Mu(d|0,e|0,52)|0;switch(f&2047){case 0:{if(a!=0.0){a=+Em(a*18446744073709551616.0,b);d=(c[b>>2]|0)+-64|0}else d=0;c[b>>2]=d;break}case 2047:break;default:{c[b>>2]=(f&2047)+-1022;c[j>>2]=d;c[j+4>>2]=e&-2146435073|1071644672;a=+h[j>>3]}}return +a}function Fm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=gJ(c[a+4>>2]|0)|0;if((e|0)>(b|0)){c[a+4>>2]=b;return}if((e|0)<(b|0))jo(a,b);while(1){if((e|0)>=(b|0))break;f=(c[a+12>>2]|0)+(e*104|0)|0;g=d;h=f+104|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));e=e+1|0}c[a+4>>2]=b;return}function Gm(b,e){b=b|0;e=e|0;var f=0,g=0;g=0;while(1){if((d[19849+g>>0]|0)==(b|0)){b=2;break}f=g+1|0;if((f|0)==87){f=19937;g=87;b=5;break}else g=f}if((b|0)==2)if(!g)f=19937;else{f=19937;b=5}if((b|0)==5)while(1){do{b=f;f=f+1|0}while((a[b>>0]|0)!=0);g=g+-1|0;if(!g)break;else b=5}return mH(f,c[e+20>>2]|0)|0}function Hm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=gJ(c[a+4>>2]|0)|0;if((e|0)>(b|0)){c[a+4>>2]=b;return}if((e|0)<(b|0))lo(a,b);while(1){if((e|0)>=(b|0))break;f=(c[a+12>>2]|0)+(e*44|0)|0;g=d;h=f+44|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));e=e+1|0}c[a+4>>2]=b;return}function Im(a,b){a=a|0;b=b|0;var d=0;d=l;l=l+16|0;c[a+408>>2]=c[b>>2];c[a+408+4>>2]=c[b+4>>2];c[a+408+8>>2]=c[b+8>>2];c[a+408+12>>2]=c[b+12>>2];Qq(d,+g[a+408>>2],+g[a+412>>2],+g[a+416>>2],+g[a+404>>2]);c[a+620>>2]=c[d>>2];c[a+620+4>>2]=c[d+4>>2];c[a+620+8>>2]=c[d+8>>2];c[a+620+12>>2]=c[d+12>>2];l=d;return}function Jm(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0;f=l;l=l+16|0;d=+g[b>>2];e=+g[b+4>>2];c=+g[b+8>>2];if(d*d+e*e+c*c>0.0){g[f>>2]=-d;g[f+4>>2]=-e;g[f+8>>2]=-c;g[f+12>>2]=0.0;ve(a,f);d=+g[b>>2];e=+g[b+4>>2];c=+g[b+8>>2]}g[a+52>>2]=+D(+(d*d+e*e+c*c));l=f;return}function Km(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=c[a+328>>2]|0;if((g|0)<=0)return;b=c[b>>2]|0;f=c[a+336>>2]|0;d=0;while(1){e=f+(d<<2)|0;if((c[e>>2]|0)==(b|0))break;d=d+1|0;if((d|0)>=(g|0)){h=7;break}}if((h|0)==7)return;if((d|0)>=(g|0))return;c[e>>2]=c[f+(g+-1<<2)>>2];c[a+328>>2]=g+-1;return}function Lm(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0,f=0.0,h=0.0,i=0.0;e=l;l=l+16|0;f=+XI(b*.5);b=+WI(b*.5);h=+XI(c*.5);c=+WI(c*.5);i=+XI(d*.5);d=+WI(d*.5);g[e+12>>2]=d*h*f-i*c*b;g[e+8>>2]=i*c*f+d*h*b;g[e+4>>2]=i*h*b-d*c*f;g[e>>2]=i*h*f+d*c*b;as(a,e+12|0,e+8|0,e+4|0,e);l=e;return}function Mm(a){a=a|0;var b=0;b=l;l=l+32|0;g[a>>2]=1.2000000476837158;g[a+4>>2]=0.0;g[a+8>>2]=0.0;g[a+12>>2]=1.0e3;g[b+20>>2]=0.0;g[b+16>>2]=0.0;g[b+12>>2]=0.0;$s(a+16|0,b+20|0,b+16|0,b+12|0);c[a+32>>2]=0;c[a+36>>2]=0;g[b+8>>2]=0.0;g[b+4>>2]=-10.0;g[b>>2]=0.0;$s(a+40|0,b+8|0,b+4|0,b);zC(a+56|0);l=b;return}function Nm(a,b,d,e,f,g,h,i,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;+vb[c[(c[a>>2]|0)+44>>2]&3](a,b,d,e,f,g,h,i,j);+vb[c[(c[a>>2]|0)+48>>2]&3](a,b,d,e,f,g,h,i,j);+sb[c[(c[a>>2]|0)+36>>2]&1](a,b,d,i);return 0.0}function Om(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if(c>>>0>0|(c|0)==0&b>>>0>4294967295){while(1){e=xs(b|0,c|0,10,0)|0;d=d+-1|0;a[d>>0]=e&255|48;e=b;b=rB(b|0,c|0,10,0)|0;if(!(c>>>0>9|(c|0)==9&e>>>0>4294967295))break;else c=A}c=b}else c=b;if(c)while(1){d=d+-1|0;a[d>>0]=(c>>>0)%10|0|48;if(c>>>0<10)break;else c=(c>>>0)/10|0}return d|0}function Pm(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0,f=0.0,h=0.0,i=0.0;e=l;l=l+16|0;f=+XI(b*.5);b=+WI(b*.5);h=+XI(c*.5);c=+WI(c*.5);i=+XI(d*.5);d=+WI(d*.5);g[e+12>>2]=i*c*f+d*h*b;g[e+8>>2]=i*h*b-d*c*f;g[e+4>>2]=d*h*f-i*c*b;g[e>>2]=i*h*f+d*c*b;as(a,e+12|0,e+8|0,e+4|0,e);l=e;return}function Qm(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=+h;c[a>>2]=b;c[a+4>>2]=d;c[a+8>>2]=c[e>>2];c[a+8+4>>2]=c[e+4>>2];c[a+8+8>>2]=c[e+8>>2];c[a+8+12>>2]=c[e+12>>2];c[a+24>>2]=c[f>>2];c[a+24+4>>2]=c[f+4>>2];c[a+24+8>>2]=c[f+8>>2];c[a+24+12>>2]=c[f+12>>2];g[a+40>>2]=h;return}function Rm(){var b=0;b=l;l=l+48|0;if(a[22392]|0){l=b;return}if(!(Uz(22392)|0)){l=b;return}g[b+32>>2]=1.0;g[b+28>>2]=0.0;g[b+24>>2]=0.0;g[b+20>>2]=0.0;g[b+16>>2]=1.0;g[b+12>>2]=0.0;g[b+8>>2]=0.0;g[b+4>>2]=0.0;g[b>>2]=1.0;Sq(22792,b+32|0,b+28|0,b+24|0,b+20|0,b+16|0,b+12|0,b+8|0,b+4|0,b);l=b;return}function Sm(){var b=0,e=0,f=0;f=l;l=l+16|0;a[f>>0]=10;b=c[2448]|0;if(!b)if(!(bp(9776)|0)){b=c[2448]|0;e=4}else b=-1;else e=4;do if((e|0)==4){e=c[2449]|0;if(!(e>>>0>=b>>>0|(a[9851]|0)==10)){c[2449]=e+1;a[e>>0]=10;b=10;break}if((Bb[c[9812>>2]&63](9776,f,1)|0)==1)b=d[f>>0]|0;else b=-1}while(0);l=f;return b|0}function Tm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0;e=l;l=l+16|0;c[e>>2]=-1;c[e+4>>2]=c[a+28>>2];if(!(c[b+4>>2]|0))c[b+4>>2]=e;g=c[a+24>>2]|0;f=+qb[c[(c[g>>2]|0)+12>>2]&31](g,b,d);c[a+4>>2]=c[(c[a+24>>2]|0)+4>>2];l=e;return +f}function Um(a,b,c){a=a|0;b=b|0;c=+c;var d=0,e=0.0;d=l;l=l+16|0;e=+MA(+g[b>>2],+g[b+4>>2],+g[b+8>>2]);e=+WI(c*.5)/e;g[d+12>>2]=+g[(gJ(b)|0)>>2]*e;g[d+8>>2]=+g[(OI(b)|0)>>2]*e;g[d+4>>2]=+g[(NI(b)|0)>>2]*e;g[d>>2]=+XI(c*.5);as(a,d+12|0,d+8|0,d+4|0,d);l=d;return}function Vm(a,b){a=a|0;b=b|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];c[a+16>>2]=c[b+16>>2];c[a+16+4>>2]=c[b+16+4>>2];c[a+16+8>>2]=c[b+16+8>>2];c[a+16+12>>2]=c[b+16+12>>2];c[a+32>>2]=c[b+32>>2];c[a+32+4>>2]=c[b+32+4>>2];c[a+32+8>>2]=c[b+32+8>>2];c[a+32+12>>2]=c[b+32+12>>2];return}function Wm(b){b=b|0;var d=0,e=0,f=0,g=0;d=c[b+8>>2]|0;if((d|0)<=0)return;f=0;do{e=c[(c[b+16>>2]|0)+(f<<2)>>2]|0;if(!(a[b+76>>0]|0))switch(c[e+220>>2]|0){case 2:case 5:break;default:g=6}else g=6;if((g|0)==6){g=0;xf(b,e);d=c[b+8>>2]|0}f=f+1|0}while((f|0)<(d|0));return}function Xm(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;a:do switch(b|0){case 2:case 1:{if(c>>>0<3){d=+g[a+600>>2];break a}if((c+-3|0)>>>0<3)d=+g[a+432>>2];else d=0.0;break}case 4:case 3:{if(c>>>0<3){d=+g[a+596>>2];break a}if((c+-3|0)>>>0<3)d=+g[a+604>>2];else d=0.0;break}default:d=0.0}while(0);return +d}function Ym(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[d>>2]|0;b=zb[c[(c[b>>2]|0)+56>>2]&31](b,16)|0;d=c[d>>2]|0;c[b+4>>2]=d;c[b>>2]=9600;a[b+8>>0]=0;c[b+12>>2]=0;c[b+12>>2]=Bb[c[(c[d>>2]|0)+12>>2]&63](d,c[e+8>>2]|0,c[f+8>>2]|0)|0;a[b+8>>0]=1;return b|0}function Zm(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[a+60>>2]|0;if(!d)return;e=xb[c[(c[d>>2]|0)+8>>2]&127](d)|0;e=Bb[c[(c[b>>2]|0)+16>>2]&63](b,e,1)|0;d=c[a+60>>2]|0;d=Bb[c[(c[d>>2]|0)+12>>2]&63](d,c[e+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,d,1346456916,c[a+60>>2]|0);return}function _m(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;a:do switch(c|0){case 5:case -1:switch(b|0){case 2:{d=+g[a+764>>2];break a}case 4:{d=+g[a+760>>2];break a}case 3:{d=+g[a+752>>2];break a}case 1:{d=+g[a+756>>2];break a}default:{d=0.0;break a}}default:d=0.0}while(0);return +d}function $m(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[a+56>>2]|0;if(!d)return;e=xb[c[(c[d>>2]|0)+12>>2]&127](d)|0;e=Bb[c[(c[b>>2]|0)+16>>2]&63](b,e,1)|0;d=c[a+56>>2]|0;d=Bb[c[(c[d>>2]|0)+16>>2]&63](d,c[e+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,d,1213612625,c[a+56>>2]|0);return}function an(a,b,c,d,e,f,h,i,j,k,m,n,o){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;i=+i;j=+j;k=+k;m=+m;n=+n;o=+o;var p=0;p=l;l=l+16|0;g[p+8>>2]=+Iy(b,c,d,e,f,h);g[p+4>>2]=+Iy(b,c,d,i,j,k);g[p>>2]=+Iy(b,c,d,m,n,o);$s(a,p+8|0,p+4|0,p);l=p;return}function bn(a,b,c){a=a|0;b=b|0;c=+c;var d=0.0,e=0.0,f=0.0,h=0.0;e=+g[a+32>>2];f=+g[a+36>>2];h=+g[a+40>>2];d=+g[b>>2];if(!(d<=e+c)){b=0;return b|0}if(!(d>=-e-c)){b=0;return b|0}d=+g[b+4>>2];if(!(d<=f+c)){b=0;return b|0}if(!(d>=-f-c)){b=0;return b|0}d=+g[b+8>>2];if(!(d<=h+c)){b=0;return b|0}b=d>=-h-c;return b|0}function cn(b,d){b=b|0;d=d|0;c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+24>>2]=c[d+24>>2];c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+28>>2]=c[d+28>>2];c[b+32>>2]=c[d+32>>2];c[b+36>>2]=c[d+36>>2];c[b+40>>2]=c[d+40>>2];c[b+56>>2]=c[d+56>>2];c[b+48>>2]=c[d+48>>2];a[b+44>>0]=a[d+44>>0]&1;return}function dn(a,b,d){a=a|0;b=b|0;d=d|0;rw(a);c[a>>2]=3124;c[a+16>>2]=c[b>>2];c[a+16+4>>2]=c[b+4>>2];c[a+16+8>>2]=c[b+8>>2];c[a+16+12>>2]=c[b+12>>2];c[a+32>>2]=c[d>>2];c[a+32+4>>2]=c[d+4>>2];c[a+32+8>>2]=c[d+8>>2];c[a+32+12>>2]=c[d+12>>2];c[a+80>>2]=0;return}function en(b,d,e,f){b=b|0;d=d|0;e=e|0;f=+f;if(!(+g[b+36>>2]>f))return;a[b+40>>0]=1;c[b+4>>2]=c[d>>2];c[b+4+4>>2]=c[d+4>>2];c[b+4+8>>2]=c[d+8>>2];c[b+4+12>>2]=c[d+12>>2];c[b+20>>2]=c[e>>2];c[b+20+4>>2]=c[e+4>>2];c[b+20+8>>2]=c[e+8>>2];c[b+20+12>>2]=c[e+12>>2];g[b+36>>2]=f;return}function fn(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;d=+g[b+32>>2];i=+g[b+40>>2];k=+g[c>>2];e=+g[c+4>>2];j=+D(+(k*k+e*e));f=+g[c+8>>2];if(j!=0.0){h=e*(d/j);e=f<0.0?-i:i;d=k*(d/j)}else{h=0.0;e=f<0.0?-i:i}g[a>>2]=d;g[a+8>>2]=e;g[a+4>>2]=h;return}function gn(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0,k=0.0;d=+g[b+32>>2];i=+g[b+36>>2];k=+g[c>>2];e=+g[c+8>>2];j=+D(+(k*k+e*e));f=+g[c+4>>2];if(j!=0.0){h=e*(d/j);e=f<0.0?-i:i;d=k*(d/j)}else{h=0.0;e=f<0.0?-i:i}g[a>>2]=d;g[a+4>>2]=e;g[a+8>>2]=h;return}function hn(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,h=0.0,i=0.0,j=0.0;d=+g[b+36>>2];f=+g[b+32>>2];j=+g[c+4>>2];e=+g[c+8>>2];i=+D(+(j*j+e*e));if(i!=0.0){h=e*(d/i);e=+g[c>>2]<0.0?-f:f;d=j*(d/i)}else{h=0.0;e=+g[c>>2]<0.0?-f:f}g[a+4>>2]=d;g[a>>2]=e;g[a+8>>2]=h;return}function jn(a,b){a=a|0;b=+b;var c=0,d=0.0;c=l;l=l+16|0;if(!(+g[a+68>>2]>0.0)){l=c;return}d=-+g[a+92>>2];b=-+g[a+96>>2];g[c>>2]=-+g[a+88>>2];g[c+4>>2]=d;g[c+8>>2]=b;g[c+12>>2]=0.0;aj(a+4|0,c,a+156|0);aj(a+16|0,a+88|0,a+172|0);l=c;return}function kn(a,b){a=a|0;b=+b;var c=0,d=0.0;c=l;l=l+16|0;if(!(+g[a+68>>2]>0.0)){l=c;return}d=-+g[a+92>>2];b=-+g[a+96>>2];g[c>>2]=-+g[a+88>>2];g[c+4>>2]=d;g[c+8>>2]=b;g[c+12>>2]=0.0;aj(a+4|0,c,a+164|0);aj(a+16|0,a+88|0,a+180|0);l=c;return}function ln(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0,g=0;if((d|0)>-1|(d|0)==-1&c>>>0>4294967295){e=(+(c>>>0)+4294967296.0*+(d>>>0))*18446744073709551616.0+(+(a>>>0)+4294967296.0*+(b>>>0));return +e}else{g=sw(0,0,a|0,b|0)|0;f=A;d=Ow((a|0)==0&(b|0)==0&1|0,0,~c|0,~d|0)|0;e=-+ln(g,f,d,A);return +e}return 0.0}function mn(a){a=a|0;var b=0.0,d=0.0,e=0.0;d=+g[(c[a+28>>2]|0)+404>>2];e=+g[(c[a+32>>2]|0)+404>>2];e=e==0.0?1.0:d/(d+e);d=+g[a+1116>>2]*e+(1.0-e)*+g[a+1180>>2];b=e*+g[a+1120>>2]+(1.0-e)*+g[a+1184>>2];g[a+1284>>2]=+g[a+1112>>2]*e+ +g[a+1176>>2]*(1.0-e);g[a+1288>>2]=d;g[a+1292>>2]=b;g[a+1296>>2]=0.0;return}function nn(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0;d=+g[a+404>>2];if(d!=0.0){f=1.0/d*+g[b+4>>2];e=1.0/d*+g[b+8>>2];g[a+424>>2]=1.0/d*+g[b>>2];g[a+428>>2]=f;g[a+432>>2]=e;g[a+436>>2]=0.0}c[a+440>>2]=c[b>>2];c[a+440+4>>2]=c[b+4>>2];c[a+440+8>>2]=c[b+8>>2];c[a+440+12>>2]=c[b+12>>2];return}function on(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=c[b+16>>2]|0;do if(f){if((f|0)!=(d|0)){c[b+36>>2]=(c[b+36>>2]|0)+1;c[b+24>>2]=2;a[b+54>>0]=1;break}if((c[b+24>>2]|0)==2)c[b+24>>2]=e}else{c[b+16>>2]=d;c[b+24>>2]=e;c[b+36>>2]=1}while(0);return}function pn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=c[a+84>>2]|0;a=c[f+8>>2]|0;if((a|0)<=0)return;e=0;do{d=c[(c[f+16>>2]|0)+(e*12|0)+8>>2]|0;if(d){Ob[c[(c[d>>2]|0)+16>>2]&127](d,b);a=c[f+8>>2]|0}e=e+1|0}while((e|0)<(a|0));return}function qn(a,b,d){a=a|0;b=b|0;d=d|0;Ut(a);c[a>>2]=2952;c[a+24>>2]=c[b>>2];c[a+24+4>>2]=c[b+4>>2];c[a+24+8>>2]=c[b+8>>2];c[a+24+12>>2]=c[b+12>>2];c[a+40>>2]=c[d>>2];c[a+40+4>>2]=c[d+4>>2];c[a+40+8>>2]=c[d+8>>2];c[a+40+12>>2]=c[d+12>>2];return}function rn(){var b=0,d=0,e=0;do if((c[2463]|0)>=0?(kJ()|0)!=0:0){if((a[9851]|0)!=10?(b=c[2449]|0,b>>>0<(c[2448]|0)>>>0):0){c[2449]=b+1;a[b>>0]=10;break}Sm()|0}else e=3;while(0);do if((e|0)==3){if((a[9851]|0)!=10?(d=c[2449]|0,d>>>0<(c[2448]|0)>>>0):0){c[2449]=d+1;a[d>>0]=10;break}Sm()|0}while(0);return}function sn(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[d>>2]|0;a=vy(c[b>>2]|0)|0;f=vy(f)|0;if(a|0)Vb[c[(c[a>>2]|0)+32>>2]&127](a,d,e,b);if(!f)return 0;Vb[c[(c[f>>2]|0)+32>>2]&127](f,b,e,d);return 0}function tn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+48|0;f=c[b+192>>2]|0;Vb[c[(c[f>>2]|0)+8>>2]&127](f,b+4|0,e+32|0,e+16|0);c[e>>2]=6304;c[e+4>>2]=b;c[e+8>>2]=a;c[e+12>>2]=d;d=c[a+68>>2]|0;Vb[c[(c[d>>2]|0)+28>>2]&127](d,e+32|0,e+16|0,e);l=e;return}function un(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=l;l=l+256|0;if((c|0)>(d|0)&(e&73728|0)==0){Yk(f|0,b|0,((c-d|0)>>>0<256?c-d|0:256)|0)|0;if((c-d|0)>>>0>255){b=c-d|0;do{fA(a,f,256);b=b+-256|0}while(b>>>0>255);b=c-d&255}else b=c-d|0;fA(a,f,b)}l=f;return}function vn(a,b,d){a=a|0;b=b|0;d=d|0;fi(a,b,d)|0;c[b+52>>2]=c[a+300>>2];c[b+56>>2]=c[a+304>>2];c[b+60>>2]=c[a+308>>2];c[b+64>>2]=c[a+312>>2];c[b+68>>2]=c[a+316>>2];c[b+72>>2]=c[a+320>>2];c[b+76>>2]=c[a+324>>2];c[b+80>>2]=c[a+328>>2];return 12513}function wn(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[b>>2]|0;e=c[a+84>>2]|0;if((d|0)==(e|0)){e=0;return e|0}if(!(c[a+12>>2]&c[b+4>>2])){e=0;return e|0}if(!(c[b+8>>2]&c[a+8>>2])){e=0;return e|0}b=c[a+96>>2]|0;e=Bb[c[(c[b>>2]|0)+28>>2]&63](b,e,d)|0;return e|0}function xn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=l;l=l+112|0;d=gJ(c[b+4>>2]|0)|0;e=f;g=e+104|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(g|0));PG(f);Fm(a,d,f);Jo(b,d,c[a+12>>2]|0);l=f;return}function yn(a){a=a|0;c[5650]=c[a>>2];c[5651]=c[a+4>>2];c[5652]=c[a+8>>2];c[5653]=c[a+12>>2];c[5654]=c[a+16>>2];c[5655]=c[a+20>>2];c[5656]=c[a+24>>2];Vm(22628,a+28|0);c[5669]=c[a+76>>2];c[5670]=c[a+76+4>>2];c[5671]=c[a+76+8>>2];c[5672]=c[a+76+12>>2];c[5673]=c[a+76+16>>2];return}function zn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=l;l=l+64|0;d=gJ(c[b+4>>2]|0)|0;e=f;g=e+52|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(g|0));PG(f);Bm(a,d,f);Eo(b,d,c[a+12>>2]|0);l=f;return}function An(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=l;l=l+48|0;d=gJ(c[b+4>>2]|0)|0;e=f;g=e+44|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(g|0));PG(f);Hm(a,d,f);Oo(b,d,c[a+12>>2]|0);l=f;return}function Bn(a){a=a|0;var b=0,d=0,e=0;Ib[c[(c[a>>2]|0)+8>>2]&511](a);Ib[c[(c[a>>2]|0)+12>>2]&511](a);b=c[a+24>>2]|0;if(!b)return;e=c[(c[b>>2]|0)+32>>2]|0;d=c[a+68>>2]|0;d=xb[c[(c[d>>2]|0)+36>>2]&127](d)|0;Vb[e&127](b,d,a+28|0,c[a+24>>2]|0);return}function Cn(a,b){a=+a;b=+b;var d=0;d=Nt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;c[d+4>>2]=10;c[d>>2]=7936;g[d+48>>2]=a;c[d+56>>2]=2;g[d+32>>2]=a;g[d+36>>2]=a;g[d+40>>2]=b*.5;g[d+44>>2]=0.0;return d|0}function Dn(a,b){a=+a;b=+b;var d=0;d=Nt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;c[d+4>>2]=10;c[d>>2]=7836;g[d+48>>2]=a;c[d+56>>2]=0;g[d+32>>2]=b*.5;g[d+36>>2]=a;g[d+40>>2]=a;g[d+44>>2]=0.0;return d|0}function En(a,b,c){a=a|0;b=b|0;c=+c;var d=0,e=0;e=l;l=l+32|0;d=Ss()|0;g[e+8>>2]=1.0;g[e+4>>2]=0.0;g[e>>2]=0.0;$s(e+16|0,e+8|0,e+4|0,e);Hg(d,a,b,c,e+16|0);l=e;return d|0}function Fn(a,b){a=+a;b=+b;var d=0;d=Nt()|0;c[d+8>>2]=0;c[d+12>>2]=-1;c[d+16>>2]=1065353216;c[d+20>>2]=1065353216;c[d+24>>2]=1065353216;g[d+28>>2]=0.0;c[d>>2]=7736;g[d+48>>2]=a;c[d+4>>2]=10;c[d+56>>2]=1;g[d+32>>2]=a;g[d+36>>2]=b*.5;g[d+40>>2]=a;g[d+44>>2]=0.0;return d|0}function Gn(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;j=gJ(b)|0;i=gJ(b+16|0)|0;h=gJ(b+32|0)|0;g=OI(b)|0;f=OI(b+16|0)|0;e=OI(b+32|0)|0;d=NI(b)|0;c=NI(b+16|0)|0;Sq(a,j,i,h,g,f,e,d,c,NI(b+32|0)|0);return}function Hn(a,b){a=a|0;b=b|0;var d=0;if(c[b+40>>2]|0){Hn(a,c[b+36>>2]|0);Hn(a,c[b+40>>2]|0)}if((c[a>>2]|0)==(b|0))c[a>>2]=0;d=c[a+4>>2]|0;if(!d){c[a+4>>2]=b;return}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);c[a+4>>2]=b;return}function In(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=c[a+32>>2]|0;c[g>>2]=(c[g>>2]|0)+1;qg(a,Qd(a,b,f)|0);qg(a,Qd(a,d,f)|0);qg(a,Qd(a,e,f)|0);return}function Jn(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;if(qD(a,c[b+8>>2]|0)|0)ml(b,d,e,f);else{a=c[a+8>>2]|0;$b[c[(c[a>>2]|0)+20>>2]&7](a,b,d,e,f,g)}return}function Kn(a){a=a|0;var b=0;b=l;l=l+48|0;g[b+32>>2]=1.0;g[b+28>>2]=0.0;g[b+24>>2]=0.0;g[b+20>>2]=0.0;g[b+16>>2]=1.0;g[b+12>>2]=0.0;g[b+8>>2]=0.0;g[b+4>>2]=0.0;g[b>>2]=1.0;Ip(a,b+32|0,b+28|0,b+24|0,b+20|0,b+16|0,b+12|0,b+8|0,b+4|0,b);l=b;return}function Ln(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[a+4>>2]|0;e=gJ(d)|0;if((e|0)==(gJ(c[a+8>>2]|0)|0)){eo(a,$B(e)|0);d=c[a+4>>2]|0}zm((c[a+12>>2]|0)+(d*96|0)|0,b);c[a+4>>2]=(c[a+4>>2]|0)+1;return}function Mn(a,b){a=a|0;b=b|0;var d=0,e=0;c[a+72>>2]=(c[a+72>>2]|0)+1;d=c[a+20>>2]|0;if((d|0)>0)do{e=d;d=d+-1|0;if((c[(c[a+28>>2]|0)+(d*80|0)+64>>2]|0)==(b|0))re(a,d)}while((e|0)>1);Ib[c[(c[a>>2]|0)+68>>2]&511](a);return}function Nn(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;switch(b|0){case 2:case 1:if(e>>>0<3){g[a+600>>2]=d;c[a+592>>2]=c[a+592>>2]|2;return}else{g[a+432>>2]=d;return}case 4:case 3:{g[(e>>>0<3?a+596|0:a+604|0)>>2]=d;c[a+592>>2]=c[a+592>>2]|(e>>>0<3?1:4);return}default:return}}function On(a,b){a=a|0;b=b|0;var d=0;a=c[a+68>>2]|0;if(!b)return;d=c[a+16>>2]|0;if(d>>>0<=b>>>0?(d+(P(c[a>>2]|0,c[a+4>>2]|0)|0)|0)>>>0>b>>>0:0){c[b>>2]=c[a+12>>2];c[a+12>>2]=b;c[a+8>>2]=(c[a+8>>2]|0)+1;return}c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function Pn(a){a=a|0;var b=0,d=0;if((c[a+248>>2]|0)<=0)return;b=0;do{d=(c[(c[a+256>>2]|0)+(b<<2)>>2]|0)+472|0;c[d>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;c[d+24>>2]=0;c[d+28>>2]=0;b=b+1|0}while((b|0)<(c[a+248>>2]|0));return}function Qn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=gJ(c[a+4>>2]|0)|0;if((e|0)>(b|0)){c[a+4>>2]=b;return}if((e|0)<(b|0))eo(a,b);while(1){if((e|0)>=(b|0))break;zm((c[a+12>>2]|0)+(e*96|0)|0,d);e=e+1|0}c[a+4>>2]=b;return}function Rn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=l;l=l+96|0;d=gJ(c[b+4>>2]|0)|0;e=f;g=e+96|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(g|0));Qn(a,d,f);Zq(b,d,c[a+12>>2]|0);l=f;return}function Sn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=c[a+52>>2]|0;if((d|0)<=0)return;f=0;do{e=c[(c[a+60>>2]|0)+(f<<2)>>2]|0;if(e){Ob[c[(c[e>>2]|0)+16>>2]&127](e,b);d=c[a+52>>2]|0}f=f+1|0}while((f|0)<(d|0));return}function Tn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=gJ(c[a+4>>2]|0)|0;if((e|0)>(b|0)){c[a+4>>2]=b;return}if((e|0)<(b|0))$n(a,b);while(1){if((e|0)>=(b|0))break;c[(c[a+12>>2]|0)+(e<<2)>>2]=c[d>>2];e=e+1|0}c[a+4>>2]=b;return}function Un(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[a+32>>2]|0;c[f>>2]=(c[f>>2]|0)+1;qg(a,Qd(a,b,0)|0);qg(a,Qd(a,d,0)|0);qg(a,Qd(a,e,0)|0);return}function Vn(a,b,d){a=a|0;b=b|0;d=d|0;c[a+52>>2]=c[b>>2];c[a+52+4>>2]=c[b+4>>2];c[a+52+8>>2]=c[b+8>>2];c[a+52+12>>2]=c[b+12>>2];c[a+68>>2]=c[d>>2];c[a+68+4>>2]=c[d+4>>2];c[a+68+8>>2]=c[d+8>>2];c[a+68+12>>2]=c[d+12>>2];c[a+48>>2]=1;return}function Wn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=c[d>>2]|0;a=vy(c[b>>2]|0)|0;e=vy(e)|0;if(a|0)Sb[c[(c[a>>2]|0)+28>>2]&127](a,d,b);if(!e)return 0;Sb[c[(c[e>>2]|0)+28>>2]&127](e,b,d);return 0}function Xn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=a;e=b;f=d+104|0;do{c[d>>2]=c[e>>2];d=d+4|0;e=e+4|0}while((d|0)<(f|0));Sv(a+104|0,b+104|0);Tv(a+124|0,b+124|0);Tv(a+144|0,b+144|0);return}function Yn(a,d){a=a|0;d=d|0;var e=0,f=0;if(b[a+56>>1]|0)return;b[a+64>>1]=1;d=b[a+58>>1]|0;f=c[a+60>>2]|0;if((d&65535)>1){e=1;do{d=e;e=e+1|0;b[f+(d<<6)+48>>1]=e;d=b[a+58>>1]|0}while(e>>>0<(d&65535)>>>0)}b[f+((d&65535)+-1<<6)+48>>1]=0;return}function Zn(a,b,c){a=+a;b=b|0;c=c|0;var d=0,e=0;e=l;l=l+32|0;d=Ds(144)|0;g[e+8>>2]=0.0;g[e+4>>2]=0.0;g[e>>2]=0.0;$s(e+16|0,e+8|0,e+4|0,e);Xk(d,a,b,c,e+16|0);l=e;return d|0}function _n(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[d>>2]=c[b+16>>2];c[d+4>>2]=c[b+16+4>>2];c[d+8>>2]=c[b+16+8>>2];c[d+12>>2]=c[b+16+12>>2];c[e>>2]=c[b+32>>2];c[e+4>>2]=c[b+32+4>>2];c[e+8>>2]=c[b+32+8>>2];c[e+12>>2]=c[b+32+12>>2];return}function $n(b,d){b=b|0;d=d|0;var e=0;if((gJ(c[b+8>>2]|0)|0)>=(d|0))return;e=It(d)|0;tr(b,gJ(c[b+4>>2]|0)|0,e);et(b);a[b+16>>0]=1;c[b+12>>2]=e;c[b+8>>2]=d;return}function ao(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;i=c[a+4>>2]|0;if(!(i&1))h=i>>8;else h=c[(c[e>>2]|0)+(i>>8)>>2]|0;a=c[a>>2]|0;$b[c[(c[a>>2]|0)+20>>2]&7](a,b,d,e+h|0,i&2|0?f:2,g);return}function bo(a,b){a=a|0;b=b|0;var d=0;a=c[a+68>>2]|0;d=c[a+12>>2]|0;if(d|0){c[a+12>>2]=c[d>>2];c[a+8>>2]=(c[a+8>>2]|0)+-1;b=d;return b|0}c[6995]=(c[6995]|0)+1;a=sc(b+19|0)|0;if(!a){b=0;return b|0}c[(a+4+15&-16)+-4>>2]=a;b=a+4+15&-16;return b|0}function co(b){b=b|0;g[b+60>>2]=0.0;g[b+8>>2]=0.0;g[b+12>>2]=.10000000149011612;g[b+16>>2]=300.0;g[b>>2]=1.0;g[b+4>>2]=-1.0;g[b+28>>2]=0.0;g[b+32>>2]=.20000000298023224;g[b+36>>2]=0.0;g[b+40>>2]=0.0;g[b+20>>2]=1.0;g[b+24>>2]=.5;c[b+56>>2]=0;g[b+48>>2]=0.0;a[b+44>>0]=0;return}function eo(b,d){b=b|0;d=d|0;var e=0;if((gJ(c[b+8>>2]|0)|0)>=(d|0))return;e=$t(d)|0;Zq(b,gJ(c[b+4>>2]|0)|0,e);et(b);a[b+16>>0]=1;c[b+12>>2]=e;c[b+8>>2]=d;return}function fo(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;g[a+692>>2]=(c-b)*.5;b=+mh((c-b)*.5+b,6.2831854820251465);if(!(b<-3.1415927410125732)){if(b>3.1415927410125732)b=b+-6.2831854820251465}else b=b+6.2831854820251465;g[a+688>>2]=b;g[a+696>>2]=d;g[a+700>>2]=e;g[a+704>>2]=f;return}function go(a,b,d){a=a|0;b=+b;d=+d;var e=0;e=l;l=l+16|0;g[e+12>>2]=b;g[e+8>>2]=d;g[e+4>>2]=0.0;g[e>>2]=1.0;c[a+504>>2]=c[(b<0.0?e+4|0:b>1.0?e:e+12|0)>>2];g[e+4>>2]=0.0;g[e>>2]=1.0;c[a+508>>2]=c[(d<0.0?e+4|0:d>1.0?e:e+8|0)>>2];l=e;return}function ho(){var b=0;b=l;l=l+32|0;if(a[22384]|0){l=b;return}if(!(Uz(22384)|0)){l=b;return}Rm();g[b+8>>2]=0.0;g[b+4>>2]=0.0;g[b>>2]=0.0;$s(b+16|0,b+8|0,b+4|0,b);Xq(22728,22792,b+16|0);l=b;return}function io(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[(c[b>>2]|0)+16>>2]|0;e=xb[c[(c[a>>2]|0)+16>>2]&127](a)|0;e=Bb[d&63](b,e,1)|0;d=Bb[c[(c[a>>2]|0)+20>>2]&63](a,c[e+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,d,1497645650,a);return}function jo(b,d){b=b|0;d=d|0;var e=0;if((gJ(c[b+8>>2]|0)|0)>=(d|0))return;e=du(d)|0;Jo(b,gJ(c[b+4>>2]|0)|0,e);et(b);a[b+16>>0]=1;c[b+12>>2]=e;c[b+8>>2]=d;return}function ko(b,d){b=b|0;d=d|0;var e=0;if((gJ(c[b+8>>2]|0)|0)>=(d|0))return;e=eu(d)|0;Eo(b,gJ(c[b+4>>2]|0)|0,e);et(b);a[b+16>>0]=1;c[b+12>>2]=e;c[b+8>>2]=d;return}function lo(b,d){b=b|0;d=d|0;var e=0;if((gJ(c[b+8>>2]|0)|0)>=(d|0))return;e=fu(d)|0;Oo(b,gJ(c[b+4>>2]|0)|0,e);et(b);a[b+16>>0]=1;c[b+12>>2]=e;c[b+8>>2]=d;return}function mo(a,b,d){a=a|0;b=b|0;d=d|0;c[b>>2]=c[a+52>>2];c[b+4>>2]=c[a+52+4>>2];c[b+8>>2]=c[a+52+8>>2];c[b+12>>2]=c[a+52+12>>2];c[d>>2]=c[a+68>>2];c[d+4>>2]=c[a+68+4>>2];c[d+8>>2]=c[a+68+8>>2];c[d+12>>2]=c[a+68+12>>2];return}function no(a){a=a|0;var b=0,d=0,e=0;b=c[a+24>>2]|0;if((b|0)<=0)return;e=0;do{d=c[(c[a+32>>2]|0)+(e<<2)>>2]|0;switch(c[d+220>>2]|0){case 2:case 5:break;default:{Eg(d);b=c[a+24>>2]|0}}e=e+1|0}while((e|0)<(b|0));return}function oo(a,b){a=a|0;b=b|0;var d=0,e=0;e=xb[c[(c[a>>2]|0)+16>>2]&127](a)|0;e=Bb[c[(c[b>>2]|0)+16>>2]&63](b,e,1)|0;d=Bb[c[(c[a>>2]|0)+20>>2]&63](a,c[e+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,d,1245859651,a);return}function po(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;if(qD(a,c[b+8>>2]|0)|0)on(b,d,e);else{a=c[a+8>>2]|0;Vb[c[(c[a>>2]|0)+28>>2]&127](a,b,d,e)}return}function qo(a,b,c){a=a|0;b=b|0;c=+c;var d=0;d=l;l=l+16|0;g[d+12>>2]=+g[(gJ(b)|0)>>2]*c;g[d+8>>2]=+g[(OI(b)|0)>>2]*c;g[d+4>>2]=+g[(NI(b)|0)>>2]*c;g[d>>2]=+g[b+12>>2]*c;dw(a,d+12|0,d+8|0,d+4|0,d);l=d;return}function ro(a,b,d){a=a|0;b=b|0;d=d|0;c[b>>2]=c[a+8>>2];c[b+4>>2]=c[a+8+4>>2];c[b+8>>2]=c[a+8+8>>2];c[b+12>>2]=c[a+8+12>>2];c[d>>2]=c[a+24>>2];c[d+4>>2]=c[a+24+4>>2];c[d+8>>2]=c[a+24+8>>2];c[d+12>>2]=c[a+24+12>>2];return}function so(a,b){a=a|0;b=b|0;var d=0,e=0;e=xb[c[(c[a>>2]|0)+52>>2]&127](a)|0;e=Bb[c[(c[b>>2]|0)+16>>2]&63](b,e,1)|0;d=Bb[c[(c[a>>2]|0)+56>>2]&63](a,c[e+8>>2]|0,b)|0;Zb[c[(c[b>>2]|0)+20>>2]&31](b,e,d,1346455635,a);return}function to(a,b){a=a|0;b=b|0;var c=0;c=l;l=l+80|0;Gn(c+32|0,b);Br(c,+g[b+48>>2],+g[b+52>>2],+g[b+56>>2]);fm(c+16|0,c+32|0,+g[c>>2],+g[c+4>>2],+g[c+8>>2]);Xq(a,c+32|0,c+16|0);l=c;return}function uo(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=c[a+4>>2]|0;if(!(h&1))g=h>>8;else g=c[(c[d>>2]|0)+(h>>8)>>2]|0;a=c[a>>2]|0;Zb[c[(c[a>>2]|0)+24>>2]&31](a,b,d+g|0,h&2|0?e:2,f);return}function vo(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=zb[c[(c[d>>2]|0)+40>>2]&31](d,a)|0;f=zb[c[(c[d>>2]|0)+28>>2]&31](d,e)|0;c[b>>2]=f;if(f|0)Ob[c[(c[d>>2]|0)+48>>2]&127](d,e);c[b+4>>2]=c[a+4>>2];c[b+8>>2]=0;return 17123}function wo(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0;e=l;l=l+32|0;jq(e,b,c,d,+g[a+408>>2],+g[a+412>>2],+g[a+416>>2]);Qq(e+16|0,+g[e>>2],+g[e+4>>2],+g[e+8>>2],+g[a+404>>2]);us(a+372|0,e+16|0)|0;l=e;return}function xo(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0;e=l;l=l+32|0;fm(e,a+324|0,b,c,d);jq(e+16|0,+g[e>>2],+g[e+4>>2],+g[e+8>>2],+g[a+604>>2],+g[a+608>>2],+g[a+612>>2]);us(a+388|0,e+16|0)|0;l=e;return}function yo(a,b,d){a=a|0;b=b|0;d=d|0;c[a+164>>2]=c[b>>2];c[a+164+4>>2]=c[b+4>>2];c[a+164+8>>2]=c[b+8>>2];c[a+164+12>>2]=c[b+12>>2];b=gJ(b)|0;if((!(+g[b>>2]!=1.0)?!(+g[b+4>>2]!=1.0):0)?!(+g[b+8>>2]!=1.0):0)d=0;c[a+180>>2]=d;return}function zo(a,b,d){a=a|0;b=b|0;d=d|0;c[b>>2]=c[a+952>>2];c[b+4>>2]=c[a+952+4>>2];c[b+8>>2]=c[a+952+8>>2];c[b+12>>2]=c[a+952+12>>2];c[d>>2]=c[a+968>>2];c[d+4>>2]=c[a+968+4>>2];c[d+8>>2]=c[a+968+8>>2];c[d+12>>2]=c[a+968+12>>2];return}function Ao(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;a:do if((c|0)==-1)switch(b|0){case 2:case 1:{d=+g[a+336>>2];break a}case 4:case 3:{d=+g[a+340>>2];break a}default:{d=3402823466385288598117041.0e14;break a}}else d=3402823466385288598117041.0e14;while(0);return +d}function Bo(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0;f=+g[b+32>>2];e=+g[b+36>>2];e=+g[c+4>>2]>=0.0?e:-e;d=+g[b+40>>2];d=+g[c+8>>2]>=0.0?d:-d;g[a>>2]=+g[c>>2]>=0.0?f:-f;g[a+4>>2]=e;g[a+8>>2]=d;g[a+12>>2]=0.0;return}function Co(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=c[a+4>>2]|0;if(!(g&1))f=g>>8;else f=c[(c[d>>2]|0)+(g>>8)>>2]|0;a=c[a>>2]|0;Vb[c[(c[a>>2]|0)+28>>2]&127](a,b,d+f|0,g&2|0?e:2);return}function Do(b){b=b|0;var d=0;c[b>>2]=5168;d=c[b+212>>2]|0;if(d|0){if(a[b+216>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+212>>2]=0}a[b+216>>0]=1;c[b+212>>2]=0;c[b+204>>2]=0;c[b+208>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function Eo(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=0;while(1){if((e|0)>=(b|0))break;f=gJ(d+(e*52|0)|0)|0;g=(c[a+12>>2]|0)+(e*52|0)|0;h=f+52|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));e=e+1|0}return}function Fo(a,b){a=a|0;b=b|0;var d=0,e=0;e=c[a+288>>2]|0;a:do if((e|0)>0){d=c[a+296>>2]|0;a=0;while(1){if((c[d+(a<<2)>>2]|0)==(b|0))break a;a=a+1|0;if((a|0)>=(e|0)){a=e;break}}}else a=e;while(0);return (a|0)>=(e|0)|0}function Go(b){b=b|0;var d=0;d=l;l=l+16|0;if(!(a[22368]|0))Uz(22368)|0;Bp(d,c[b+108>>2]|0,c[b+120>>2]|0);c[5674]=c[d>>2];c[5675]=c[d+4>>2];c[5676]=c[d+8>>2];c[5677]=c[d+12>>2];l=d;return 22696}function Ho(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=c[b>>2]|0;a=zb[c[(c[a>>2]|0)+56>>2]&31](a,84)|0;ul(a,b,d,e,1);return a|0}function Io(a,b){a=a|0;b=b|0;var d=0;d=c[a+4>>2]|0;if((c[b>>2]|0)!=(d|0)?(c[b+4>>2]|0)!=(d|0):0)return 0;d=c[a+8>>2]|0;Sb[c[(c[d>>2]|0)+32>>2]&127](d,b,c[a+12>>2]|0);return 0}function Jo(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=0;while(1){if((e|0)>=(b|0))break;f=d+(e*104|0)|0;g=(c[a+12>>2]|0)+(e*104|0)|0;h=f+104|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));e=e+1|0}return}function Ko(b){b=b|0;var d=0;c[b>>2]=9712;d=c[b+32>>2]|0;if(d|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function Lo(a){a=a|0;var b=0.0,d=0.0;if(c[a+204>>2]&3|0)return;d=+g[a+428>>2]*+g[a+412>>2];b=+g[a+432>>2]*+g[a+416>>2];g[a+472>>2]=+g[a+424>>2]*+g[a+408>>2]+ +g[a+472>>2];g[a+476>>2]=d+ +g[a+476>>2];g[a+480>>2]=b+ +g[a+480>>2];return}function Mo(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=c[b>>2]|0;a=zb[c[(c[a>>2]|0)+56>>2]&31](a,84)|0;ul(a,b,d,e,0);return a|0}function No(b){b=b|0;var d=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(d|0){if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0}a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function Oo(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=0;while(1){if((e|0)>=(b|0))break;f=d+(e*44|0)|0;g=(c[a+12>>2]|0)+(e*44|0)|0;h=f+44|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));e=e+1|0}return}function Po(a,b){a=a|0;b=b|0;var c=0;c=l;l=l+16|0;g[c+12>>2]=-+g[(gJ(b)|0)>>2];g[c+8>>2]=-+g[(OI(b)|0)>>2];g[c+4>>2]=-+g[(NI(b)|0)>>2];g[c>>2]=-+g[b+12>>2];dw(a,c+12|0,c+8|0,c+4|0,c);l=c;return}function Qo(a){a=a|0;var b=0;c[a>>2]=5820;c[a+8>>2]=5868;b=c[a+56>>2]|0;Ob[c[(c[b>>2]|0)+20>>2]&127](b,c[a+72>>2]|0);b=c[a+56>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,c[a+72>>2]|0);c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Ro(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0;e=l;l=l+16|0;d=+EF(a);d=+VI(d*+EF(b));c=+Gp(a,b);if(c<0.0){Po(e,b);c=+Gp(a,e)}d=+$A(c/d)*2.0;l=e;return +d}function So(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0;h=c[a+108>>2]|0;f=+g[h+(b<<4)+4>>2]*+g[a+20>>2];e=+g[h+(b<<4)+8>>2]*+g[a+24>>2];g[d>>2]=+g[h+(b<<4)>>2]*+g[a+16>>2];g[d+4>>2]=f;g[d+8>>2]=e;g[d+12>>2]=0.0;return}function To(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=l;l=l+32|0;c[e>>2]=c[a+60>>2];c[e+4>>2]=0;c[e+8>>2]=b;c[e+12>>2]=e+20;c[e+16>>2]=d;if((SC(_a(140,e|0)|0)|0)<0){c[e+20>>2]=-1;a=-1}else a=c[e+20>>2]|0;l=e;return a|0}function Uo(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;f=c[d>>2]|0;f=zb[c[(c[f>>2]|0)+56>>2]&31](f,12)|0;e=a[b+4>>0]|0;c[f+4>>2]=c[d>>2];c[f>>2]=3820;a[f+8>>0]=e;return f|0}function Vo(b,c){b=b|0;c=c|0;var d=0,e=0;d=a[b>>0]|0;e=a[c>>0]|0;if(d<<24>>24==0?1:d<<24>>24!=e<<24>>24)b=e;else{do{b=b+1|0;c=c+1|0;d=a[b>>0]|0;e=a[c>>0]|0}while(!(d<<24>>24==0?1:d<<24>>24!=e<<24>>24));b=e}return (d&255)-(b&255)|0}function Wo(a,b){a=a|0;b=b|0;var c=0.0;c=+g[(gJ(b)|0)>>2];g[a>>2]=+g[a>>2]+c;c=+g[(OI(b)|0)>>2];g[a+4>>2]=+g[a+4>>2]+c;c=+g[(NI(b)|0)>>2];g[a+8>>2]=+g[a+8>>2]+c;g[a+12>>2]=+g[a+12>>2]+ +g[b+12>>2];return a|0}function Xo(a,b){a=a|0;b=b|0;var c=0.0;c=+g[(gJ(b)|0)>>2];g[a>>2]=+g[a>>2]-c;c=+g[(OI(b)|0)>>2];g[a+4>>2]=+g[a+4>>2]-c;c=+g[(NI(b)|0)>>2];g[a+8>>2]=+g[a+8>>2]-c;g[a+12>>2]=+g[a+12>>2]-+g[b+12>>2];return a|0}function Yo(b){b=b|0;var d=0;d=l;l=l+16|0;if(!(a[22352]|0))Uz(22352)|0;Ob[c[(c[b>>2]|0)+76>>2]&127](d,b);c[5646]=c[d>>2];c[5647]=c[d+4>>2];c[5648]=c[d+8>>2];c[5649]=c[d+12>>2];l=d;return 22584}function Zo(b){b=b|0;var d=0;d=l;l=l+16|0;if(!(a[22416]|0))Uz(22416)|0;Ob[c[(c[b>>2]|0)+76>>2]&127](d,b);c[5718]=c[d>>2];c[5719]=c[d+4>>2];c[5720]=c[d+8>>2];c[5721]=c[d+12>>2];l=d;return 22872}function _o(a){a=a|0;var b=0,d=0;d=a+15&-16|0;b=c[i>>2]|0;a=b+d|0;if((d|0)>0&(a|0)<(b|0)|(a|0)<0){X()|0;Za(12);return -1}c[i>>2]=a;if((a|0)>(W()|0)?(V()|0)==0:0){c[i>>2]=b;Za(12);return -1}return b|0}function $o(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=gJ(c[b+4>>2]|0)|0;c[d>>2]=0;Tn(a,e,d);tr(b,e,c[a+12>>2]|0);l=d;return}function ap(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0;e=+g[b+20>>2];d=e*+g[b+260>>2]+ +g[b+72>>2];c=e*+g[b+264>>2]+ +g[b+76>>2];g[a>>2]=+g[b+256>>2]*e+ +g[b+68>>2];g[a+4>>2]=d;g[a+8>>2]=c;g[a+12>>2]=0.0;return}function bp(b){b=b|0;var d=0;d=a[b+74>>0]|0;a[b+74>>0]=d+255|d;d=c[b>>2]|0;if(!(d&8)){c[b+8>>2]=0;c[b+4>>2]=0;d=c[b+44>>2]|0;c[b+28>>2]=d;c[b+20>>2]=d;c[b+16>>2]=d+(c[b+48>>2]|0);b=0}else{c[b>>2]=d|32;b=-1}return b|0}function cp(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;if((e|0)!=-1)return;switch(b|0){case 2:case 1:{g[a+336>>2]=d;c[a+332>>2]=c[a+332>>2]|1;return}case 4:case 3:{g[a+340>>2]=d;c[a+332>>2]=c[a+332>>2]|2;return}default:return}}function dp(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+g[(NI(a)|0)>>2];c=c*+g[(gJ(b)|0)>>2];d=+g[(NI(a+16|0)|0)>>2];d=c+d*+g[(OI(b)|0)>>2];c=+g[(NI(a+32|0)|0)>>2];return +(d+c*+g[(NI(b)|0)>>2])}function ep(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+g[(OI(a)|0)>>2];c=c*+g[(gJ(b)|0)>>2];d=+g[(OI(a+16|0)|0)>>2];d=c+d*+g[(OI(b)|0)>>2];c=+g[(OI(a+32|0)|0)>>2];return +(d+c*+g[(NI(b)|0)>>2])}function fp(b,d,e){b=b|0;d=d|0;e=+e;var f=0;f=l;l=l+16|0;if(!(a[22376]|0))Uz(22376)|0;_i(f,b,d,e);c[5678]=c[f>>2];c[5679]=c[f+4>>2];c[5680]=c[f+8>>2];c[5681]=c[f+12>>2];l=f;return 22712}function gp(b,d,e){b=b|0;d=d|0;e=+e;var f=0;f=l;l=l+16|0;if(!(a[22424]|0))Uz(22424)|0;_i(f,b,d,e);c[5722]=c[f>>2];c[5723]=c[f+4>>2];c[5724]=c[f+8>>2];c[5725]=c[f+12>>2];l=f;return 22888}function hp(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;if((b|0)==(d|0))return;e=c[(c[a+4>>2]|0)+96>>2]|0;Bb[c[(c[e>>2]|0)+8>>2]&63](e,c[b+36>>2]|0,c[d+36>>2]|0)|0;d=(c[a+4>>2]|0)+120|0;c[d>>2]=(c[d>>2]|0)+1;return}function ip(a){a=a|0;var b=0,d=0.0,e=0.0,f=0.0;b=l;l=l+32|0;Sb[c[(c[a>>2]|0)+12>>2]&127](a,b+8|0,b);f=+g[b+8>>2];e=+g[b+8+4>>2];d=+g[b+8+8>>2];d=+D(+(f*f+e*e+d*d));l=b;return +(d+ +g[b>>2])}function jp(a){a=a|0;var b=0;c[a>>2]=5868;b=c[a+48>>2]|0;Ob[c[(c[b>>2]|0)+20>>2]&127](b,c[a+64>>2]|0);b=c[a+48>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,c[a+64>>2]|0);c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function kp(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=l;l=l+16|0;c[f>>2]=5516;c[f+4>>2]=d;c[f+8>>2]=a;Sb[c[(c[b>>2]|0)+48>>2]&127](b,f,e);l=f;return}function lp(a,b,d){a=a|0;b=b|0;d=d|0;a=c[b+8>>2]|0;if(!((d|0)!=0&(a|0)!=0))return;Ib[c[c[a>>2]>>2]&511](a);Ob[c[(c[d>>2]|0)+60>>2]&127](d,c[b+8>>2]|0);c[b+8>>2]=0;return}function mp(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=l;l=l+16|0;c[e>>2]=9144;c[e+4>>2]=b;c[e+8>>2]=a;c[e+12>>2]=d;Sb[c[(c[a>>2]|0)+48>>2]&127](a,e,d);l=e;return}function np(b){b=b|0;var d=0;c[b>>2]=7120;if(a[b+65>>0]|0?(d=c[b+56>>2]|0,Ib[c[c[d>>2]>>2]&511](d),d=c[b+56>>2]|0,d|0):0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function op(a,b){a=a|0;b=b|0;a=c[a+16>>2]|0;return zb[c[(c[a>>2]|0)+8>>2]&31](a,b)|0}function pp(a,b,c,d){a=+a;b=+b;c=+c;d=+d;var e=0,f=0;f=l;l=l+16|0;g[f+12>>2]=a;g[f+8>>2]=b;g[f+4>>2]=c;g[f>>2]=d;e=Pt()|0;Su(e,f+12|0,f+8|0,f+4|0,f);l=f;return e|0}function qp(a,b,c,d){a=+a;b=+b;c=+c;d=+d;var e=0,f=0;f=l;l=l+16|0;g[f+12>>2]=a;g[f+8>>2]=b;g[f+4>>2]=c;g[f>>2]=d;e=Ds(16)|0;dw(e,f+12|0,f+8|0,f+4|0,f);l=f;return e|0}function rp(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;if(qD(a,c[b+8>>2]|0)|0)ml(b,d,e,f);return}function sp(a,b){a=a|0;b=+b;var d=0,e=0;if((c[a+296>>2]|0)<=0)return;d=0;do{e=c[(c[a+304>>2]|0)+(d<<2)>>2]|0;Pb[c[(c[e>>2]|0)+8>>2]&7](e,a,b);d=d+1|0}while((d|0)<(c[a+296>>2]|0));return}function tp(a){a=a|0;var b=0.0,d=0,e=0,f=0.0;e=c[a+772>>2]|0;if((e|0)<=0){b=0.0;return +b}d=c[a+780>>2]|0;a=0;b=0.0;do{f=+g[d+(a*104|0)+88>>2];b=b+(f>0.0?1.0/f:0.0);a=a+1|0}while((a|0)!=(e|0));return +b}function up(b){b=b|0;var d=0;c[b>>2]=5168;d=c[b+212>>2]|0;if(d|0){if(a[b+216>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+212>>2]=0}a[b+216>>0]=1;c[b+212>>2]=0;c[b+204>>2]=0;c[b+208>>2]=0;return}function vp(b){b=b|0;var d=0;d=l;l=l+16|0;if(!(a[22344]|0))Uz(22344)|0;BA(d,b);c[5642]=c[d>>2];c[5643]=c[d+4>>2];c[5644]=c[d+8>>2];c[5645]=c[d+12>>2];l=d;return 22568}function wp(b){b=b|0;var d=0;d=l;l=l+16|0;if(!(a[22336]|0))Uz(22336)|0;kz(d,b);c[5638]=c[d>>2];c[5639]=c[d+4>>2];c[5640]=c[d+8>>2];c[5641]=c[d+12>>2];l=d;return 22552}function xp(b){b=b|0;var c=0.0,d=0.0,e=0.0;if(!(a[22400]|0))Uz(22400)|0;e=-+g[b+52>>2];d=+g[b+260>>2]*e;c=+g[b+264>>2]*e;g[5710]=+g[b+256>>2]*e;g[5711]=d;g[5712]=c;g[5713]=0.0;return 22840}function yp(a,b,d){a=a|0;b=+b;d=d|0;b=b*.4000000059604645*+nb[c[(c[a>>2]|0)+48>>2]&15](a);b=b*+nb[c[(c[a>>2]|0)+48>>2]&15](a);g[d>>2]=b;g[d+4>>2]=b;g[d+8>>2]=b;g[d+12>>2]=0.0;return}function zp(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;e=c[b>>2]|0;e=zb[c[(c[e>>2]|0)+56>>2]&31](e,16)|0;c[e+4>>2]=c[b>>2];c[e>>2]=4296;return e|0}function Ap(a,b,c,d,e,f,h){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;var i=0;i=l;l=l+16|0;g[i+8>>2]=c*h-d*f;g[i+4>>2]=d*e-b*h;g[i>>2]=b*f-c*e;$s(a,i+8|0,i+4|0,i);l=i;return}function Bp(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;b=gJ(b+4|0)|0;e=(gJ($G(b,0)|0)|0)+(c<<2)|0;d=(gJ($G(b,1)|0)|0)+(c<<2)|0;$s(a,e,d,(gJ($G(b,2)|0)|0)+(c<<2)|0);return}function Cp(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[d>>2]=-581039253;c[d+4>>2]=-581039253;c[d+8>>2]=-581039253;g[d+12>>2]=0.0;c[e>>2]=1566444395;c[e+4>>2]=1566444395;c[e+8>>2]=1566444395;g[e+12>>2]=0.0;return}function Dp(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+g[(gJ(a)|0)>>2];c=c*+g[(gJ(b)|0)>>2];d=+g[(gJ(a+16|0)|0)>>2];d=c+d*+g[(OI(b)|0)>>2];c=+g[(gJ(a+32|0)|0)>>2];return +(d+c*+g[(NI(b)|0)>>2])}function Ep(b){b=b|0;var d=0;d=l;l=l+16|0;if(!(a[22320]|0))Uz(22320)|0;lq(d,b);c[5630]=c[d>>2];c[5631]=c[d+4>>2];c[5632]=c[d+8>>2];c[5633]=c[d+12>>2];l=d;return 22520}function Fp(b){b=b|0;var d=0;d=l;l=l+16|0;if(!(a[22328]|0))Uz(22328)|0;Cm(d,b);c[5634]=c[d>>2];c[5635]=c[d+4>>2];c[5636]=c[d+8>>2];c[5637]=c[d+12>>2];l=d;return 22536}function Gp(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+g[a>>2];c=c*+g[(gJ(b)|0)>>2];d=+g[a+4>>2];d=c+d*+g[(OI(b)|0)>>2];c=+g[a+8>>2];c=d+c*+g[(NI(b)|0)>>2];return +(c+ +g[a+12>>2]*+g[b+12>>2])}function Hp(b){b=b|0;var d=0;c[b>>2]=9712;d=c[b+32>>2]|0;if(d|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;return}function Ip(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;$s(a,b,c,d);$s(a+16|0,e,f,g);$s(a+32|0,h,i,j);return}function Jp(b){b=b|0;var d=0;c[b>>2]=5320;d=c[b+296>>2]|0;if(d|0){if(a[b+300>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+296>>2]=0}a[b+300>>0]=1;c[b+296>>2]=0;c[b+288>>2]=0;c[b+292>>2]=0;return}function Kp(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=l;l=l+64|0;zk(d+16|0,b,c);km(d,b,+g[c+48>>2],+g[c+52>>2],+g[c+56>>2]);Xq(a,d+16|0,d);l=d;return}function Lp(b){b=b|0;var d=0;c[b>>2]=3172;d=c[b+32>>2]|0;if(d|0){if(a[b+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+32>>2]=0}a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;return}function Mp(a){a=a|0;var b=0,d=0;c[a>>2]=7472;b=c[a+56>>2]|0;if(b|0?(Ib[c[c[b>>2]>>2]&511](b),d=c[a+56>>2]|0,d|0):0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Np(a){a=a|0;var b=0;c[a>>2]=5820;c[a+8>>2]=5868;b=c[a+56>>2]|0;Ob[c[(c[b>>2]|0)+20>>2]&127](b,c[a+72>>2]|0);b=c[a+56>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,c[a+72>>2]|0);return}function Op(a,b){a=a|0;b=b|0;var d=0;d=(c[a+96>>2]|0)+4|0;c[d>>2]=c[b>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];uj(a);return}function Pp(b,d){b=b|0;d=d|0;var e=0;if(a[b+289>>0]|0?(e=c[b+216>>2]|0,e|0):0){c[6996]=(c[6996]|0)+1;Cd(c[e+-4>>2]|0)}a[b+289>>0]=0;c[b+216>>2]=d;c[(c[b+212>>2]|0)+8>>2]=d;return}function Qp(b){b=b|0;var d=0;c[b>>2]=5444;d=c[b+20>>2]|0;if(d|0){if(a[b+24>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+20>>2]=0}a[b+24>>0]=1;c[b+20>>2]=0;c[b+12>>2]=0;c[b+16>>2]=0;return}function Rp(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;e=c[b>>2]|0;e=zb[c[(c[e>>2]|0)+56>>2]&31](e,8)|0;c[e+4>>2]=c[b>>2];c[e>>2]=9572;return e|0}function Sp(b){b=b|0;var d=0;c[b>>2]=8992;d=c[b+16>>2]|0;if(d|0){if(a[b+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[b+16>>2]=0}a[b+20>>0]=1;c[b+16>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;return}function Tp(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;var f=0;f=l;l=l+16|0;g[f+12>>2]=b;g[f+8>>2]=c;g[f+4>>2]=d;g[f>>2]=e;as(a,f+12|0,f+8|0,f+4|0,f);l=f;return}function Up(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;f=c[b+8>>2]|0;e=c[f+344>>2]|0;Sb[c[(c[e>>2]|0)+40>>2]&127](e,f,c[d+8>>2]|0);return}function Vp(b){b=b|0;var d=0,e=0;c[b>>2]=6352;if(!(a[b+8>>0]|0)){cJ(b);return}d=c[b+12>>2]|0;if(!d){cJ(b);return}e=c[b+4>>2]|0;Ob[c[(c[e>>2]|0)+16>>2]&127](e,d);cJ(b);return}function Wp(b){b=b|0;var d=0,e=0;c[b>>2]=9600;if(!(a[b+8>>0]|0)){cJ(b);return}d=c[b+12>>2]|0;if(!d){cJ(b);return}e=c[b+4>>2]|0;Ob[c[(c[e>>2]|0)+16>>2]&127](e,d);cJ(b);return}function Xp(b){b=b|0;var d=0,e=0;c[b>>2]=5792;if(!(a[b+8>>0]|0)){cJ(b);return}d=c[b+12>>2]|0;if(!d){cJ(b);return}e=c[b+4>>2]|0;Ob[c[(c[e>>2]|0)+16>>2]&127](e,d);cJ(b);return}function Yp(b){b=b|0;var d=0;c[b>>2]=7120;if(!(a[b+65>>0]|0))return;d=c[b+56>>2]|0;Ib[c[c[d>>2]>>2]&511](d);b=c[b+56>>2]|0;if(!b)return;c[6996]=(c[6996]|0)+1;Cd(c[b+-4>>2]|0);return}function Zp(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=l;l=l+16|0;c[e>>2]=9164;c[e+4>>2]=b;Sb[c[(c[a>>2]|0)+48>>2]&127](a,e,d);l=e;return}function _p(b){b=b|0;var d=0,e=0;c[b>>2]=5888;if(!(a[b+8>>0]|0)){cJ(b);return}d=c[b+12>>2]|0;if(!d){cJ(b);return}e=c[b+4>>2]|0;Ob[c[(c[e>>2]|0)+16>>2]&127](e,d);cJ(b);return}function $p(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if((c|0)<(b|0)&(b|0)<(c+d|0)){e=b;c=c+d|0;b=b+d|0;while((d|0)>0){b=b-1|0;c=c-1|0;d=d-1|0;a[b>>0]=a[c>>0]|0}b=e}else gi(b,c,d)|0;return b|0}function aq(){var a=0,b=0;b=l;l=l+32|0;a=Ds(108)|0;Xt(b);rg(a,b);l=b;return a|0}function bq(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=P(b&65535,a&65535)|0;e=(c>>>16)+(P(b&65535,a>>>16)|0)|0;d=P(b>>>16,a&65535)|0;return (A=(e>>>16)+(P(b>>>16,a>>>16)|0)+(((e&65535)+d|0)>>>16)|0,e+d<<16|c&65535|0)|0}function cq(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0;e=+C(+(+g[b>>2]));d=+C(+(+g[b+4>>2]));c=+C(+(+g[b+8>>2]));g[a+16>>2]=e;g[a+20>>2]=d;g[a+24>>2]=c;g[a+28>>2]=0.0;return}function dq(a,b){a=a|0;b=b|0;Wf(a,c[b+36>>2]|0);return}function eq(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;if(qD(a,c[b+8>>2]|0)|0)on(b,d,e);return}function fq(a,b,c,d,e,f,g,h,i,j,k,l,m){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=+j;k=k|0;l=+l;m=m|0;Xb[a&0](b|0,c|0,d|0,e|0,+f,+g,+h,+i,+j,k|0,+l,m|0)}function gq(b){b=b|0;var d=0,e=0,f=0;e=c[b>>2]|0;f=(a[e>>0]|0)+-48|0;if(f>>>0<10){d=0;do{d=f+(d*10|0)|0;e=e+1|0;c[b>>2]=e;f=(a[e>>0]|0)+-48|0}while(f>>>0<10)}else d=0;return d|0}function hq(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;g[a>>2]=(1.0-d)*+g[b>>2]+ +g[c>>2]*d;g[a+4>>2]=(1.0-d)*+g[b+4>>2]+ +g[c+4>>2]*d;g[a+8>>2]=(1.0-d)*+g[b+8>>2]+ +g[c+8>>2]*d;return}function iq(a,b,c,d,e,f,h){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;var i=0;i=l;l=l+16|0;g[i+8>>2]=b+e;g[i+4>>2]=c+f;g[i>>2]=d+h;$s(a,i+8|0,i+4|0,i);l=i;return}function jq(a,b,c,d,e,f,h){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;var i=0;i=l;l=l+16|0;g[i+8>>2]=b*e;g[i+4>>2]=c*f;g[i>>2]=d*h;$s(a,i+8|0,i+4|0,i);l=i;return}function kq(a,b,c,d,e,f,h){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;h=+h;var i=0;i=l;l=l+16|0;g[i+8>>2]=b-e;g[i+4>>2]=c-f;g[i>>2]=d-h;$s(a,i+8|0,i+4|0,i);l=i;return}function lq(a,b){a=a|0;b=b|0;var c=0;c=l;l=l+16|0;g[c+8>>2]=-+g[b>>2];g[c+4>>2]=-+g[b+4>>2];g[c>>2]=-+g[b+8>>2];dw(a,c+8|0,c+4|0,c,b+12|0);l=c;return}function mq(a){a=a|0;var b=0;c[a>>2]=7472;b=c[a+56>>2]|0;if(!b)return;Ib[c[c[b>>2]>>2]&511](b);a=c[a+56>>2]|0;if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function nq(a,b,d){a=a|0;b=b|0;d=d|0;b=c[b+188>>2]|0;a=c[d+188>>2]|0;if(!(c[a+8>>2]&c[b+4>>2])){d=0;return d|0}d=(c[b+8>>2]&c[a+4>>2]|0)!=0;return d|0}function oq(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;return +(+cb(0,a|0,b|0,c|0,d|0,e|0,f|0,g|0,h|0))}function pq(a,b){a=a|0;b=b|0;if((b|0)==0?1:(c[b+252>>2]&2|0)==0){ki(a,b);return}else{Ob[c[(c[a>>2]|0)+92>>2]&127](a,b);return}}function qq(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;if(!((b|0)==0&(c|0)==0))do{e=e+-1|0;a[e>>0]=d[19831+(b&15)>>0]|0|f;b=Mu(b|0,c|0,4)|0;c=A}while(!((b|0)==0&(c|0)==0));return e|0}function rq(a){a=a|0;var b=0;c[a>>2]=5868;b=c[a+48>>2]|0;Ob[c[(c[b>>2]|0)+20>>2]&127](b,c[a+64>>2]|0);b=c[a+48>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,c[a+64>>2]|0);return}function sq(){var b=0;b=Ds(40)|0;g[b+12>>2]=1.0;c[b+8>>2]=0;c[b+4>>2]=5;c[b>>2]=3172;a[b+36>>0]=1;c[b+32>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;a[b+16>>0]=1;return b|0}function tq(b){b=b|0;var c=0;c=a[n+(b&255)>>0]|0;if((c|0)<8)return c|0;c=a[n+(b>>8&255)>>0]|0;if((c|0)<8)return c+8|0;c=a[n+(b>>16&255)>>0]|0;if((c|0)<8)return c+16|0;return (a[n+(b>>>24)>>0]|0)+24|0}function uq(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0;e=l;l=l+16|0;jq(e,b,c,d,+g[a+408>>2],+g[a+412>>2],+g[a+416>>2]);us(a+472|0,e)|0;l=e;return}function vq(a,b,c){a=+a;b=+b;c=+c;var d=0,e=0;e=l;l=l+16|0;g[e+8>>2]=a;g[e+4>>2]=b;g[e>>2]=c;d=Pt()|0;$s(d,e+8|0,e+4|0,e);l=e;return d|0}function wq(a,b){a=a|0;b=b|0;c[a+16>>2]=c[b>>2];c[a+16+4>>2]=c[b+4>>2];c[a+16+8>>2]=c[b+8>>2];c[a+16+12>>2]=c[b+12>>2];uj(a);return}function xq(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;return Gb[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0,k|0)|0}function yq(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0;e=l;l=l+16|0;jq(e,b,c,d,+g[a+604>>2],+g[a+608>>2],+g[a+612>>2]);us(a+488|0,e)|0;l=e;return}function zq(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;return +wb[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0,k|0)}function Aq(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;var e=0;e=Ss()|0;Hg(e,a,b,c,d);return e|0}function Bq(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;var h=0;h=qt()|0;ye(h,a,b,c,d,e,f,g);return h|0}function Cq(){var a=0,b=0;a=ts()|0;if((a|0?(b=c[a>>2]|0,b|0):0)?((c[b+48>>2]&-256|0)==1126902528?(c[b+48+4>>2]|0)==1129074247:0):0)qy(c[b+12>>2]|0);qy(nF()|0)}function Dq(a,b,d){a=a|0;b=b|0;d=d|0;mA(a,b);c[a+48>>2]=c[d>>2];c[a+48+4>>2]=c[d+4>>2];c[a+48+8>>2]=c[d+8>>2];c[a+48+12>>2]=c[d+12>>2];return}function Eq(a,b){a=a|0;b=b|0;c[a+304>>2]=(c[a+304>>2]|0)+1;c[a+388>>2]=c[b>>2];c[a+388+4>>2]=c[b+4>>2];c[a+388+8>>2]=c[b+8>>2];c[a+388+12>>2]=c[b+12>>2];return}function Fq(){var a=0,b=0;b=l;l=l+32|0;a=Ds(88)|0;Xt(b);ce(a,b);l=b;return a|0}function Gq(a,b,d){a=a|0;b=b|0;d=d|0;c[d>>2]=c[a+60+(b<<4)>>2];c[d+4>>2]=c[a+60+(b<<4)+4>>2];c[d+8>>2]=c[a+60+(b<<4)+8>>2];c[d+12>>2]=c[a+60+(b<<4)+12>>2];return}function Hq(a,b){a=a|0;b=b|0;c[a+304>>2]=(c[a+304>>2]|0)+1;c[a+372>>2]=c[b>>2];c[a+372+4>>2]=c[b+4>>2];c[a+372+8>>2]=c[b+8>>2];c[a+372+12>>2]=c[b+12>>2];return}function Iq(b,d){b=b|0;d=d|0;if(!(a[22408]|0))Uz(22408)|0;d=$G(b,d)|0;c[5714]=c[d>>2];c[5715]=c[d+4>>2];c[5716]=c[d+8>>2];c[5717]=c[d+12>>2];return 22856}function Jq(a,b){a=a|0;b=b|0;c[a+304>>2]=(c[a+304>>2]|0)+1;c[a+604>>2]=c[b>>2];c[a+604+4>>2]=c[b+4>>2];c[a+604+8>>2]=c[b+8>>2];c[a+604+12>>2]=c[b+12>>2];return}function Kq(a,b,c,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=j|0;k=k|0;l=+l;Yb[a&0](b|0,c|0,d|0,e|0,+f,+g,+h,+i,j|0,k|0,+l)}function Lq(a){a=a|0;var b=0.0,d=0.0;d=+g[a+36>>2];+nb[c[(c[a>>2]|0)+48>>2]&15](a);b=+nb[c[(c[a>>2]|0)+48>>2]&15](a);+nb[c[(c[a>>2]|0)+48>>2]&15](a);return +(d+b)}function Mq(a){a=a|0;var b=0.0,d=0.0;d=+g[a+32>>2];b=+nb[c[(c[a>>2]|0)+48>>2]&15](a);+nb[c[(c[a>>2]|0)+48>>2]&15](a);+nb[c[(c[a>>2]|0)+48>>2]&15](a);return +(d+b)}function Nq(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;cc[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0,k|0)}function Oq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=l;l=l+16|0;c[e>>2]=c[d>>2];a=Bb[c[(c[a>>2]|0)+16>>2]&63](a,b,e)|0;if(a)c[d>>2]=c[e>>2];l=e;return a&1|0}function Pq(a,b,d){a=a|0;b=b|0;d=d|0;c[a+156+(b<<4)>>2]=c[d>>2];c[a+156+(b<<4)+4>>2]=c[d+4>>2];c[a+156+(b<<4)+8>>2]=c[d+8>>2];c[a+156+(b<<4)+12>>2]=c[d+12>>2];return}function Qq(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;var f=0;f=l;l=l+16|0;g[f+8>>2]=b*e;g[f+4>>2]=c*e;g[f>>2]=d*e;$s(a,f+8|0,f+4|0,f);l=f;return}function Rq(a,b){a=a|0;b=b|0;g[a>>2]=+g[a>>2]*+g[b>>2];g[a+4>>2]=+g[a+4>>2]*+g[b>>2];g[a+8>>2]=+g[a+8>>2]*+g[b>>2];g[a+12>>2]=+g[a+12>>2]*+g[b>>2];return a|0}function Sq(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;Ip(a,b,c,d,e,f,g,h,i,j);return}function Tq(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=Us(344)|0;Vd(d,a,b,c);return d|0}function Uq(a,b,d){a=a|0;b=b|0;d=d|0;c[a+28+(b<<4)>>2]=c[d>>2];c[a+28+(b<<4)+4>>2]=c[d+4>>2];c[a+28+(b<<4)+8>>2]=c[d+8>>2];c[a+28+(b<<4)+12>>2]=c[d+12>>2];return}function Vq(b){b=b|0;var d=0;c[b>>2]=3172;d=c[b+32>>2]|0;if(!d){cJ(b);return}if(!(a[b+36>>0]|0)){cJ(b);return}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);cJ(b);return}function Wq(a,b,d){a=a|0;b=b|0;d=d|0;b=c[b+204>>2]|0;if(b&4|0)return 0;a=c[d+204>>2]|0;if(!(a&4))return (b&3|0)==0|(a&3|0)==0|0;else return 0;return 0}function Xq(a,b,d){a=a|0;b=b|0;d=d|0;Vm(a,b);c[a+48>>2]=c[d>>2];c[a+48+4>>2]=c[d+4>>2];c[a+48+8>>2]=c[d+8>>2];c[a+48+12>>2]=c[d+12>>2];return}function Yq(b){b=b|0;var d=0;c[b>>2]=6352;if(!(a[b+8>>0]|0))return;d=c[b+12>>2]|0;if(!d)return;b=c[b+4>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,d);return}function Zq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=0;while(1){if((e|0)>=(b|0))break;zm(d+(e*96|0)|0,(c[a+12>>2]|0)+(e*96|0)|0);e=e+1|0}return}function _q(b){b=b|0;var d=0;c[b>>2]=5444;d=c[b+20>>2]|0;if(!d){cJ(b);return}if(!(a[b+24>>0]|0)){cJ(b);return}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);cJ(b);return}function $q(a,b){a=a|0;b=b|0;var c=0;c=l;l=l+128|0;to(c,a+68|0);Kp(c+64|0,a+4|0,c);ur(b,c+64|0);l=c;return}function ar(b){b=b|0;var d=0;c[b>>2]=9600;if(!(a[b+8>>0]|0))return;d=c[b+12>>2]|0;if(!d)return;b=c[b+4>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,d);return}function br(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;g=qt()|0;ye(g,a,b,c,d,e,f,0);return g|0}function cr(b){b=b|0;var d=0;c[b>>2]=5792;if(!(a[b+8>>0]|0))return;d=c[b+12>>2]|0;if(!d)return;b=c[b+4>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,d);return}function dr(a,b){a=a|0;b=b|0;a=c[a+4>>2]|0;return ((c[b>>2]|0)==(a|0)?1:(c[b+4>>2]|0)==(a|0))|0}function er(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=dt()|0;He(f,a,b,c,d,e);return f|0}function fr(a,b){a=a|0;b=b|0;a=c[a+24>>2]|0;return zb[c[(c[a>>2]|0)+8>>2]&31](a,b)|0}function gr(b){b=b|0;var d=0;c[b>>2]=8992;d=c[b+16>>2]|0;if(!d){cJ(b);return}if(!(a[b+20>>0]|0)){cJ(b);return}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);cJ(b);return}function hr(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0;e=l;l=l+16|0;g[e+8>>2]=b;g[e+4>>2]=c;g[e>>2]=d;$s(a,e+8|0,e+4|0,e);l=e;return}function ir(b){b=b|0;var d=0;c[b>>2]=5888;if(!(a[b+8>>0]|0))return;d=c[b+12>>2]|0;if(!d)return;b=c[b+4>>2]|0;Ob[c[(c[b>>2]|0)+16>>2]&127](b,d);return}function jr(a,b,d){a=a|0;b=b|0;d=d|0;TH(a);c[a>>2]=3056;ur(a+4|0,b);ur(a+68|0,d);ur(a+132|0,b);c[a+196>>2]=0;return}function kr(a){a=a|0;var b=0;b=l;l=l+16|0;Kn(a);g[b+8>>2]=0.0;g[b+4>>2]=0.0;g[b>>2]=0.0;$s(a+48|0,b+8|0,b+4|0,b);l=b;return}function lr(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;var f=0;f=Ds(44)|0;Qm(f,a,b,c,d,e);return f|0}function mr(a,b,c){a=a|0;b=b|0;c=+c;switch(b|0){case 3:{a=a+452|0;break}case 4:{a=a+448|0;break}case 5:{a=a+444|0;break}default:return}g[a>>2]=c;return}function nr(a,b){a=a|0;b=b|0;b=c[b+36>>2]|0;we(a,c[(c[(c[(c[a+4>>2]|0)+4>>2]|0)+28>>2]|0)+(b*80|0)+64>>2]|0,b);return}function or(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;return +vb[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0)}function pr(a,b){a=a|0;b=b|0;var c=0;c=0;while(1){if((c|0)==3)break;g[a+868+(c<<6)+4>>2]=+ot(+g[(gJ(b)|0)+(c<<2)>>2]);c=c+1|0}return}function qr(a,b,c,d){a=+a;b=b|0;c=c|0;d=d|0;var e=0;e=Ds(144)|0;Xk(e,a,b,c,d);return e|0}function rr(a,b,d,e,f,g,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;return +(+ub[c[(c[a>>2]|0)+12>>2]&1](a,b,d,e,f,g,h,i))}function sr(b,c,d){b=b|0;c=c|0;d=d|0;if(!((b|0)==0&(c|0)==0))do{d=d+-1|0;a[d>>0]=b&7|48;b=Mu(b|0,c|0,3)|0;c=A}while(!((b|0)==0&(c|0)==0));return d|0}function tr(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=0;while(1){if((e|0)>=(b|0))break;c[d+(e<<2)>>2]=c[(c[a+12>>2]|0)+(e<<2)>>2];e=e+1|0}return}function ur(a,b){a=a|0;b=b|0;Vm(a,b);c[a+48>>2]=c[b+48>>2];c[a+48+4>>2]=c[b+48+4>>2];c[a+48+8>>2]=c[b+48+8>>2];c[a+48+12>>2]=c[b+48+12>>2];return}function vr(a,b){a=a|0;b=b|0;$s(a,b,b+16|0,b+32|0);$s(a+16|0,b+4|0,b+20|0,b+36|0);$s(a+32|0,b+8|0,b+24|0,b+40|0);return}function wr(a,b){a=a|0;b=b|0;var c=0;c=0;while(1){if((c|0)==3)break;g[a+868+(c<<6)>>2]=+ot(+g[(gJ(b)|0)+(c<<2)>>2]);c=c+1|0}return}function xr(a){a=a|0;c[6995]=(c[6995]|0)+1;a=sc((a<<2|3)+16|0)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function yr(a,b){a=a|0;b=b|0;Ib[c[(c[b>>2]|0)+32>>2]&511](b);id(a,b);Ib[c[(c[b>>2]|0)+36>>2]&511](b);return}function zr(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;bc[a&1](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0)}function Ar(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Sb[c[(c[a>>2]|0)+108>>2]&127](a,b,d);Sb[c[(c[a>>2]|0)+108>>2]&127](a,(b+1|0)%3|0,e);return}function Br(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;var e=0;e=l;l=l+16|0;g[e+8>>2]=-b;g[e+4>>2]=-c;g[e>>2]=-d;$s(a,e+8|0,e+4|0,e);l=e;return}function Cr(a,b){a=a|0;b=b|0;c[a+100>>2]=c[b>>2];c[a+100+4>>2]=c[b+4>>2];c[a+100+8>>2]=c[b+8>>2];c[a+100+12>>2]=c[b+12>>2];return}function Dr(a){a=a|0;c[6995]=(c[6995]|0)+1;a=sc((a*104|3)+16|0)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Er(a){a=a|0;c[6995]=(c[6995]|0)+1;a=sc((a*52|3)+16|0)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Fr(a){a=a|0;c[6995]=(c[6995]|0)+1;a=sc((a*44|3)+16|0)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Gr(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=rt()|0;he(f,a,b,c&65535,d,e);return f|0}function Hr(a,b){a=a|0;b=b|0;c[a+696>>2]=c[b>>2];c[a+696+4>>2]=c[b+4>>2];c[a+696+8>>2]=c[b+8>>2];c[a+696+12>>2]=c[b+12>>2];return}function Ir(a,b){a=a|0;b=b|0;c[a+680>>2]=c[b>>2];c[a+680+4>>2]=c[b+4>>2];c[a+680+8>>2]=c[b+8>>2];c[a+680+12>>2]=c[b+12>>2];return}function Jr(a,b){a=a|0;b=b|0;c[a+156>>2]=c[b>>2];c[a+156+4>>2]=c[b+4>>2];c[a+156+8>>2]=c[b+8>>2];c[a+156+12>>2]=c[b+12>>2];return}function Kr(b,c,d){b=b|0;c=c|0;d=d|0;a[b+1309+c>>0]=d&1;if((c|0)<3){a[b+788+c>>0]=d&1;return}else{a[b+868+(c+-3<<6)+44>>0]=d&1;return}}function Lr(a,b){a=a|0;b=b|0;c[a+112>>2]=c[b>>2];c[a+112+4>>2]=c[b+4>>2];c[a+112+8>>2]=c[b+8>>2];c[a+112+12>>2]=c[b+12>>2];return}function Mr(a,b){a=a|0;b=b|0;c[a+56>>2]=c[b>>2];c[a+56+4>>2]=c[b+4>>2];c[a+56+8>>2]=c[b+8>>2];c[a+56+12>>2]=c[b+12>>2];return}function Nr(b){b=b|0;if(a[22448]|0)return 23016;if(!(Uz(22448)|0))return 23016;c[5754]=1065353216;c[5755]=1065353216;c[5756]=1065353216;g[5757]=0.0;return 23016}function Or(a){a=a|0;c[6995]=(c[6995]|0)+1;a=sc(a*96|19)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Pr(a){a=a|0;var b=0;do{c[a+4>>2]=0;g[a+8>>2]=0.0;b=c[a+24>>2]|0;if(b|0)Pr(b);a=c[a+28>>2]|0}while((a|0)!=0);return}function Qr(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;Ud(a,b,c,d,e,f);return}function Rr(a,b){a=a|0;b=b|0;c[a+172>>2]=c[b>>2];c[a+172+4>>2]=c[b+4>>2];c[a+172+8>>2]=c[b+8>>2];c[a+172+12>>2]=c[b+12>>2];return}function Sr(a,b){a=a|0;b=b|0;c[a+32>>2]=c[b>>2];c[a+32+4>>2]=c[b+4>>2];c[a+32+8>>2]=c[b+8>>2];c[a+32+12>>2]=c[b+12>>2];return}function Tr(a){a=a|0;g[a>>2]=5.880000114440918;g[a+4>>2]=.8299999833106995;g[a+8>>2]=.8799999952316284;g[a+12>>2]=500.0;g[a+16>>2]=10.5;g[a+20>>2]=6.0e3;return}function Ur(a,b){a=a|0;b=b|0;c[a+24>>2]=c[b>>2];c[a+24+4>>2]=c[b+4>>2];c[a+24+8>>2]=c[b+8>>2];c[a+24+12>>2]=c[b+12>>2];return}function Vr(a,b){a=a|0;b=b|0;c[a+316>>2]=c[b>>2];c[a+316+4>>2]=c[b+4>>2];c[a+316+8>>2]=c[b+8>>2];c[a+316+12>>2]=c[b+12>>2];return}function Wr(a,b){a=a|0;b=b|0;c[a+300>>2]=c[b>>2];c[a+300+4>>2]=c[b+4>>2];c[a+300+8>>2]=c[b+8>>2];c[a+300+12>>2]=c[b+12>>2];return}function Xr(a,b){a=a|0;b=b|0;c[a+64>>2]=c[b>>2];c[a+64+4>>2]=c[b+4>>2];c[a+64+8>>2]=c[b+8>>2];c[a+64+12>>2]=c[b+12>>2];return}function Yr(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;return Fb[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0)|0}function Zr(a,b){a=a|0;b=b|0;c[a+52>>2]=c[b>>2];c[a+52+4>>2]=c[b+4>>2];c[a+52+8>>2]=c[b+8>>2];c[a+52+12>>2]=c[b+12>>2];return}function _r(a,b){a=a|0;b=b|0;c[a+188>>2]=c[b>>2];c[a+188+4>>2]=c[b+4>>2];c[a+188+8>>2]=c[b+8>>2];c[a+188+12>>2]=c[b+12>>2];return}function $r(a,b){a=a|0;b=b|0;c[a+40>>2]=c[b>>2];c[a+40+4>>2]=c[b+4>>2];c[a+40+8>>2]=c[b+8>>2];c[a+40+12>>2]=c[b+12>>2];return}function as(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[d>>2];c[a+8>>2]=c[e>>2];c[a+12>>2]=c[f>>2];return}function bs(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;return +ub[a&1](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0)}function cs(a,b){a=a|0;b=b|0;c[a+16>>2]=c[b>>2];c[a+16+4>>2]=c[b+4>>2];c[a+16+8>>2]=c[b+8>>2];c[a+16+12>>2]=c[b+12>>2];return}function ds(a,b){a=a|0;b=b|0;if(!(c[b+4>>2]&c[a+8>>2])){b=0;return b|0}b=(c[a+4>>2]&c[b+8>>2]|0)!=0;return b|0}function es(a,b){a=a|0;b=b|0;if(!(c[b+4>>2]&c[a+12>>2])){b=0;return b|0}b=(c[a+8>>2]&c[b+8>>2]|0)!=0;return b|0}function fs(a,b,d){a=a|0;b=b|0;d=+d;Ob[c[(c[a>>2]|0)+32>>2]&127](a,b);Pb[c[(c[a>>2]|0)+36>>2]&7](a,b,d);return}function gs(a,b){a=a|0;b=b|0;if(!(c[b+4>>2]&c[a+16>>2])){b=0;return b|0}b=(c[a+12>>2]&c[b+8>>2]|0)!=0;return b|0}function hs(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=rt()|0;he(e,a,b,c&65535,d,0);return e|0}function is(a,b){a=a|0;b=b|0;c[a+68>>2]=c[b>>2];c[a+68+4>>2]=c[b+4>>2];c[a+68+8>>2]=c[b+8>>2];c[a+68+12>>2]=c[b+12>>2];return}function js(a,b){a=a|0;b=b|0;c[a+36>>2]=c[b>>2];c[a+36+4>>2]=c[b+4>>2];c[a+36+8>>2]=c[b+8>>2];c[a+36+12>>2]=c[b+12>>2];return}function ks(a,b){a=a|0;b=b|0;c[a>>2]=c[b+264>>2];c[a+4>>2]=c[b+264+4>>2];c[a+8>>2]=c[b+264+8>>2];c[a+12>>2]=c[b+264+12>>2];return}function ls(b,d){b=b|0;d=d|0;if(!(a[22360]|0))Uz(22360)|0;yn(aC(c[b+12>>2]|0,d)|0);return 22600}function ms(){var a=0;a=Ds(16)|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;Dz(a);return a|0}function ns(a,b){a=a|0;b=+b;dg(a,b);a=c[a+472>>2]|0;Jb[c[(c[a>>2]|0)+24>>2]&31](a,b);return}function os(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=dt()|0;Yd(d,a,b,c);return d|0}function ps(){var a=0;a=jt()|0;ho();ho();jr(a,22728,22728);return a|0}function qs(a,b,d){a=a|0;b=b|0;d=d|0;if((c[a+4>>2]|0)==(b|0)?(c[a+28>>2]|0)!=1:0)c[a+28>>2]=d;return}function rs(){var a=0,b=0;b=ct(c[5628]|0,c[5629]|0,1284865837,1481765933)|0;b=Ow(b|0,A|0,1,0)|0;a=A;c[5628]=b;c[5629]=a;a=Mu(b|0,a|0,33)|0;return a|0}function ss(a,b){a=a|0;b=b|0;c[a+48>>2]=c[b>>2];c[a+48+4>>2]=c[b+4>>2];c[a+48+8>>2]=c[b+8>>2];c[a+48+12>>2]=c[b+12>>2];return}function ts(){var a=0,b=0;a=l;l=l+16|0;if(!(jb(28552,3)|0)){b=hb(c[7139]|0)|0;l=a;return b|0}else Ww(22016,a);return 0}function us(a,b){a=a|0;b=b|0;g[a>>2]=+g[a>>2]+ +g[b>>2];g[a+4>>2]=+g[a+4>>2]+ +g[b+4>>2];g[a+8>>2]=+g[a+8>>2]+ +g[b+8>>2];return a|0}function vs(a,b){a=a|0;b=b|0;g[a>>2]=+g[a>>2]-+g[b>>2];g[a+4>>2]=+g[a+4>>2]-+g[b+4>>2];g[a+8>>2]=+g[a+8>>2]-+g[b+8>>2];return a|0}function ws(a,b){a=a|0;b=b|0;var c=0;c=l;l=l+64|0;Kp(c,b,a+68|0);ur(a+4|0,c);l=c;return}function xs(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=l;l=l+16|0;Ye(a,b,d,e,f|0)|0;l=f;return (A=c[f+4>>2]|0,c[f>>2]|0)|0}function ys(a,b){a=a|0;b=b|0;c[a+12>>2]=c[b>>2];c[a+12+4>>2]=c[b+4>>2];c[a+12+8>>2]=c[b+8>>2];c[a+12+12>>2]=c[b+12>>2];return}function zs(a,b){a=a|0;b=b|0;c[a+88>>2]=c[b>>2];c[a+88+4>>2]=c[b+4>>2];c[a+88+8>>2]=c[b+8>>2];c[a+88+12>>2]=c[b+12>>2];return}function As(a){a=a|0;var b=0;b=Ds(108)|0;rg(b,a);return b|0}function Bs(a,b){a=a|0;b=b|0;c[a+20>>2]=c[b>>2];c[a+20+4>>2]=c[b+4>>2];c[a+20+8>>2]=c[b+8>>2];c[a+20+12>>2]=c[b+12>>2];return}function Cs(a,b){a=a|0;b=b|0;c[a+76>>2]=c[b>>2];c[a+76+4>>2]=c[b+4>>2];c[a+76+8>>2]=c[b+8>>2];c[a+76+12>>2]=c[b+12>>2];return}function Ds(a){a=a|0;var b=0;b=(a|0)==0?1:a;while(1){a=sc(b)|0;if(a|0)break;a=iF()|0;if(!a){a=0;break}Hb[a&3]()}return a|0}function Es(a,b){a=a|0;b=b|0;c[a+4>>2]=c[b>>2];c[a+4+4>>2]=c[b+4>>2];c[a+4+8>>2]=c[b+8>>2];c[a+4+12>>2]=c[b+12>>2];return}function Fs(a){a=a|0;var b=0;b=l;l=l+16|0;g[b+8>>2]=0.0;g[b+4>>2]=0.0;g[b>>2]=0.0;$s(a,b+8|0,b+4|0,b);l=b;return}function Gs(a,b){a=a|0;b=b|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];return}function Hs(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=Us(1252)|0;Bc(e,a,b,c,d);return e|0}function Is(a,b){a=a|0;b=b|0;c[a+72>>2]=c[b>>2];c[a+72+4>>2]=c[b+4>>2];c[a+72+8>>2]=c[b+8>>2];c[a+72+12>>2]=c[b+12>>2];return}function Js(a,b){a=a|0;b=b|0;g[a>>2]=+g[a>>2]*+g[b>>2];g[a+4>>2]=+g[a+4>>2]*+g[b>>2];g[a+8>>2]=+g[a+8>>2]*+g[b>>2];return a|0}function Ks(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=rt()|0;he(d,a,b,c&65535,0,0);return d|0}function Ls(a,b){a=a|0;b=b|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;g[a+(c[b+56>>2]<<2)>>2]=1.0;return}function Ms(a){a=a|0;var b=0;b=l;l=l+16|0;Cd(a);if(!(kb(c[7139]|0,0)|0)){l=b;return}else Ww(22115,b)}function Ns(a,b){a=a|0;b=b|0;c[a+8>>2]=c[b>>2];c[a+8+4>>2]=c[b+4>>2];c[a+8+8>>2]=c[b+8>>2];c[a+8+12>>2]=c[b+12>>2];return}function Os(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(255)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Ps(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=Jt()|0;Xe(d,a,b,c);return d|0}function Qs(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return ic(b,c,d,e)|0}function Rs(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(1479)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Ss(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(311)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Ts(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(1407)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Us(a){a=a|0;c[6995]=(c[6995]|0)+1;a=sc(a+19|0)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Vs(a){a=a|0;if(!(+C(+(+g[a+20>>2]))<1.1920928955078125e-07)){a=0;return a|0}a=+C(+(+g[a+24>>2]))<1.1920928955078125e-07;return a|0}function Ws(a){a=a|0;var b=0;b=jt()|0;ho();jr(b,a,22728);return b|0}function Xs(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(191)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Ys(a,b){a=a|0;b=b|0;if(!b?c[a+204>>2]&3|0:0)return;if((c[a+220>>2]&-2|0)!=4)c[a+220>>2]=1;g[a+224>>2]=0.0;return}function Zs(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a+-4>>2]|0)+8>>2]&127](a+-4|0,b,d,e);return}function _s(a,b){a=a|0;b=b|0;var c=0.0;c=+EF(a);c=+VI(c*+EF(b));return +(+$A(+Gp(a,b)/c))}function $s(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[d>>2];c[a+8>>2]=c[e>>2];g[a+12>>2]=0.0;return}function at(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(147)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function bt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(119)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function ct(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=bq(a,c)|0;f=A;return (A=(P(b,c)|0)+(P(d,a)|0)+f|f&0,e|0|0)|0}function dt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(1331)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function et(b){b=b|0;var d=0;d=c[b+12>>2]|0;if(!d)return;if(a[b+16>>0]&1)Ey(d);c[b+12>>2]=0;return}function ft(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;ac[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0)}function gt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(379)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function ht(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(627)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function it(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(823)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function jt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(219)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function kt(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a>>2]|0)+88>>2]&127](a,b,d<<16>>16,e<<16>>16);return}function lt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(1147)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function mt(a,b){a=a|0;b=b|0;var c=0;c=Ds(84)|0;dn(c,a,b);return c|0}function nt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(107)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function ot(a){a=+a;a=+$H(a);if(a<-3.1415927410125732){a=a+6.2831854820251465;return +a}if(!(a>3.1415927410125732))return +a;a=a+-6.2831854820251465;return +a}function pt(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a>>2]|0)+36>>2]&127](a,b,d<<16>>16,e<<16>>16);return}function qt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(787)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function rt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(135)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function st(a,b){a=a|0;b=b|0;c[a+348>>2]=c[b>>2];c[a+348+4>>2]=c[b+4>>2];c[a+348+8>>2]=c[b+8>>2];return}function tt(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((d|0)<=0)return;Yk(c|0,0,d<<4|0)|0;return}function ut(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(115)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function vt(a,b){a=a|0;b=b|0;c[a+540>>2]=b;if(!b)return;Ob[c[(c[b>>2]|0)+8>>2]&127](b,a+4|0);return}function wt(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;sj(a,b,c,d);return}function xt(a,b){a=a|0;b=b|0;var c=0;c=Jt()|0;Xe(c,a,b,1);return c|0}function yt(a,b){a=a|0;b=b|0;var c=0;c=rt()|0;he(c,a,b,16384,0,0);return c|0}function zt(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=c[a+192>>2]|0;Vb[c[(c[e>>2]|0)+8>>2]&127](e,a+4|0,b,d);return}function At(a){a=a|0;var b=0;b=Ds(88)|0;ce(b,a);return b|0}function Bt(a,b){a=a|0;b=b|0;c[a>>2]=1065353216;c[a+4>>2]=1065353216;c[a+8>>2]=1065353216;g[a+12>>2]=0.0;return}function Ct(a,b){a=a|0;b=b|0;var d=0;d=c[a+8>>2]|0;Sb[c[d+64>>2]&127](b,d,c[a+4>>2]|0);return 0}function Dt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(75)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Et(a,b){a=a|0;b=b|0;var d=0;d=a+92|0;do{c[a>>2]=c[b>>2];a=a+4|0;b=b+4|0}while((a|0)<(d|0));return}function Ft(a,b){a=a|0;b=b|0;Pa(a|0,b|0)}function Gt(a,b){a=a|0;b=b|0;Oa(a|0,b|0)}function Ht(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Og(a,b,c,d);return}function It(a){a=a|0;if(!a){a=0;return a|0}a=xr(a)|0;return a|0}function Jt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(99)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Kt(a,b){a=a|0;b=b|0;return +(+Iy(+g[a>>2],+g[a+4>>2],+g[a+8>>2],+g[b>>2],+g[b+4>>2],+g[b+8>>2]))}function Lt(a,b){a=a|0;b=b|0;var c=0;c=Ds(88)|0;qn(c,a,b);return c|0}function Mt(a,b,d){a=a|0;b=b|0;d=d|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;return}function Nt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(79)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Ot(a){a=a|0;var b=0;b=l;l=l+16|0;c[b>>2]=gJ(c[a+60>>2]|0)|0;a=SC(ab(6,b|0)|0)|0;l=b;return a|0}function Pt(){var a=0;c[6995]=(c[6995]|0)+1;a=sc(35)|0;if(!a){a=0;return a|0}c[(a+4+15&-16)+-4>>2]=a;a=a+4+15&-16;return a|0}function Qt(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 Eb[a&3](b|0,c|0,d|0,e|0,f|0,g|0)|0}function Rt(a){a=a|0;var b=0;b=l;l=l+16|0;Ob[c[(c[a>>2]|0)+44>>2]&127](a,b);l=b;return}function St(a){a=a|0;Tf(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Tt(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a>>2]|0)+8>>2]&127](a,b,d,e);return}function Ut(a){a=a|0;c[a>>2]=2976;g[a+4>>2]=1.0;c[a+8>>2]=0;c[a+12>>2]=1;c[a+16>>2]=-1;c[a+20>>2]=0;return}function Vt(a){a=a|0;var b=0;b=Nt()|0;Ai(b,a);c[b>>2]=8692;c[b+56>>2]=2;return b|0}function Wt(a){a=a|0;var b=0;b=Nt()|0;Ai(b,a);c[b>>2]=8588;c[b+56>>2]=0;return b|0}function Xt(a){a=a|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=4096;c[a+12>>2]=4096;c[a+16>>2]=0;c[a+20>>2]=1;return}function Yt(a,b,d){a=a|0;b=b|0;d=d|0;xe(c[a+108>>2]|0,c[a+136>>2]|0,b,d);return}function Zt(a,b){a=a|0;b=+b;var c=0;c=l;l=l+16|0;g[c>>2]=b;a=Rq(a,c)|0;l=c;return a|0}function _t(a,b){a=a|0;b=b|0;var c=0;c=jt()|0;jr(c,a,b);return c|0}function $t(a){a=a|0;if(!a){a=0;return a|0}a=Or(a)|0;return a|0}function au(a,b,d){a=a|0;b=b|0;d=d|0;Sb[c[(c[b>>2]|0)+64>>2]&127](a,b,d);return}function bu(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return 0.0}function cu(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a>>2]|0)+80>>2]&127](a,b,d,e);return}function du(a){a=a|0;if(!a){a=0;return a|0}a=Dr(a)|0;return a|0}function eu(a){a=a|0;if(!a){a=0;return a|0}a=Er(a)|0;return a|0}function fu(a){a=a|0;if(!a){a=0;return a|0}a=Fr(a)|0;return a|0}function gu(){var a=0;a=l;l=l+16|0;if(!(ib(28556,265)|0)){l=a;return}else Ww(22065,a)}function hu(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=f|0;g=g|0;return +rb[a&3](b|0,c|0,d|0,+e,f|0,g|0)}function iu(a,b){a=a|0;b=+b;var c=0;c=l;l=l+16|0;g[c>>2]=b;a=Js(a,c)|0;l=c;return a|0}function ju(a){a=a|0;if(c[a+204>>2]&3|0)return;if((c[a+220>>2]&-2|0)!=4)c[a+220>>2]=1;g[a+224>>2]=0.0;return}function ku(a,b){a=a|0;b=b|0;a=c[a+4>>2]|0;zb[c[(c[a>>2]|0)+8>>2]&31](a,c[b+36>>2]|0)|0;return}function lu(a,b){a=a|0;b=b|0;vr(a,b);$s(a+48|0,b+48|0,b+52|0,b+56|0);return}function mu(a,b,d){a=a|0;b=b|0;d=d|0;Tg(c[a+108>>2]|0,b,d);return}function nu(a,b){a=a|0;b=b|0;c[a+304>>2]=(c[a+304>>2]|0)+1;c[a+192>>2]=b;c[a+200>>2]=b;return}function ou(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;$b[a&7](b|0,c|0,d|0,e|0,f|0,g|0)}function pu(a,b,c,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=+f;g=+g;h=+h;i=+i;j=j|0;k=+k;l=l|0;T(36)}function qu(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a>>2]|0)+24>>2]&127](a,b,d,e);return}function ru(a,b,d){a=a|0;b=b|0;d=d|0;Vb[c[(c[a>>2]|0)+36>>2]&127](a,b,d<<16>>16,-3);return}function su(a,b,d){a=a|0;b=b|0;d=d|0;Sb[c[(c[b>>2]|0)+68>>2]&127](a,b,d);return}function tu(b,d){b=b|0;d=d|0;b=(a[b+344>>0]|0)==0?3:0;c[d>>2]=b;c[d+4>>2]=b;return}function uu(a,b){a=a|0;b=+b;var c=0;c=l;l=l+16|0;g[c>>2]=1.0/b;a=Rq(a,c)|0;l=c;return a|0}function vu(a,b,d){a=a|0;b=+b;d=d|0;return yb[c[(c[a>>2]|0)+52>>2]&1](a,b,d,.01666666753590107)|0}function wu(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){A=b<>>32-c;return a<>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;return}function yu(a){a=a|0;lk(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function zu(a){a=a|0;var b=0;b=c[a+68>>2]|0;Ob[c[(c[b>>2]|0)+32>>2]&127](b,c[a+24>>2]|0);return}function Au(a,b){a=a|0;b=b|0;wo(a,+g[b>>2],+g[b+4>>2],+g[b+8>>2]);return}function Bu(a,b,d,e){a=a|0;b=+b;d=d|0;e=+e;return yb[c[(c[a>>2]|0)+52>>2]&1](a,b,d,e)|0}function Cu(a,b){a=a|0;b=b|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=1065353216;g[a+12>>2]=0.0;return}function Du(a,b){a=a|0;b=b|0;c[a>>2]=1065353216;c[a+4>>2]=0;c[a+8>>2]=0;g[a+12>>2]=0.0;return}function Eu(a,b){a=a|0;b=b|0;c[a>>2]=0;c[a+4>>2]=1065353216;c[a+8>>2]=0;g[a+12>>2]=0.0;return}function Fu(a,b){a=a|0;b=b|0;Sb[c[(c[a>>2]|0)+8>>2]&127](a,b,c[(c[a+8>>2]|0)+48>>2]|0);return}function Gu(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;_b[a&0](b|0,c|0,d|0,e|0,f|0,+g)}function Hu(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=f|0;g=g|0;Ub[a&0](b|0,c|0,d|0,+e,f|0,g|0)}function Iu(a,b){a=a|0;b=b|0;xo(a,+g[b>>2],+g[b+4>>2],+g[b+8>>2]);return}function Ju(a){a=a|0;qC(a+144|0);qC(a+124|0);qC(a+104|0);return}function Ku(b,d,e){b=b|0;d=d|0;e=+e;g[(c[b+780>>2]|0)+(d*104|0)+88>>2]=e>0.0?1.0/e:0.0;a[b+984>>0]=1;return}function Lu(a,b,d){a=a|0;b=b|0;d=+d;Pb[c[(c[a>>2]|0)+20>>2]&7](a,b,d);return}function Mu(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){A=b>>>c;return a>>>c|(b&(1<>>c-32|0}function Nu(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a>>2]|0)+124>>2]&127](a,e,b,d);return}function Ou(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[a+112>>2]=b;c[a+116>>2]=d;c[a+120>>2]=e;return}function Pu(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Cb[c[(c[a>>2]|0)+8>>2]&31](a,b,d,e)|0;return}function Qu(a,b){a=a|0;b=b|0;uq(a,+g[b>>2],+g[b+4>>2],+g[b+8>>2]);return}function Ru(a,b,d){a=a|0;b=b|0;d=d|0;Vb[c[(c[a>>2]|0)+36>>2]&127](a,b,d<<16>>16,-1);return}function Su(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;$s(a,b,d,e);c[a+12>>2]=c[f>>2];return}function Tu(b,c,d,e){b=b|0;c=c|0;d=+d;e=+e;a[b+737>>0]=c&1;g[b+680>>2]=d;g[b+684>>2]=e;return}function Uu(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;fo(a,b,c,d,e,f);return}function Vu(a){a=a|0;bk(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Wu(a){a=a|0;rk(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Xu(a,b,c,d,e,f,g){a=a|0;b=b|0;c=+c;d=+d;e=e|0;f=f|0;g=g|0;Lb[a&0](b|0,+c,+d,e|0,f|0,g|0)}function Yu(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return 1.0}function Zu(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return}function _u(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;T(19);return 0}function $u(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Vb[c[(c[a>>2]|0)+32>>2]&127](a,b,d,e);return}function av(a){a=a|0;Qg(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function bv(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;T(9);return 0.0}function cv(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Yi(a,b,c,d,e);return}function dv(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;bg(a,b,c,d,e);return}function ev(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;Qa(a|0,b|0,+c,d|0)}function fv(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;Qb[c[(c[a>>2]|0)+28>>2]&7](a,b,d,e);return}function gv(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 Db[a&1](b|0,c|0,d|0,e|0,f|0)|0}function hv(a,b){a=a|0;b=b|0;Ce(a,b);return}function iv(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=+f;g=+g;h=+h;i=i|0;j=j|0;k=+k;T(37)}function jv(a,b){a=a|0;b=b|0;Tg(c[a+108>>2]|0,b,1);return}function kv(a,b){a=a|0;b=b|0;c[a+304>>2]=(c[a+304>>2]|0)+1;ur(a+4|0,b);return}function lv(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 +tb[a&15](b|0,c|0,d|0,e|0,f|0)}function mv(a,b){a=a|0;b=b|0;var c=0;c=Xs()|0;ig(c,a,b);return c|0}function nv(a,b){a=a|0;b=b|0;if(!b)b=0;else b=Ui(c[b>>2]|0,c[b+4>>2]|0,a)|0;return (b|0?b:a)|0}function ov(a,b){a=a|0;b=b|0;yq(a,+g[b>>2],+g[b+4>>2],+g[b+8>>2]);return}function pv(a,b){a=a|0;b=+b;var c=0;c=l;l=l+16|0;g[c>>2]=1.0/b;Js(a,c)|0;l=c;return}function qv(a,b){a=a|0;b=+b;return yb[c[(c[a>>2]|0)+52>>2]&1](a,b,1,.01666666753590107)|0}function rv(a){a=a|0;var b=0;b=Ds(8)|0;hw(b,a);return b|0}function sv(a,b,d){a=a|0;b=b|0;d=d|0;Sb[c[(c[a>>2]|0)+56>>2]&127](a,b,d);return}function tv(a,b,d){a=a|0;b=b|0;d=+d;Pb[c[(c[a>>2]|0)+36>>2]&7](a,b,d);return}function uv(b){b=b|0;if((c[b+56>>2]|0)==0?(a[b+44>>0]&1)==0:0){b=0;return b|0}b=1;return b|0}function vv(a){a=a|0;ii(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function wv(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;T(43)}function xv(a){a=a|0;tj(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function yv(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;fo(a,b,c,d,e,1.0);return}function zv(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;f=f|0;return +pb[a&3](b|0,c|0,+d,e|0,f|0)}function Av(a,b,c,d){a=a|0;b=b|0;c=+c;d=+d;Tu(a,b,c,d);return}function Bv(a,b,c){a=a|0;b=b|0;c=c|0;return +Sa(a|0,b|0,c|0)}function Cv(a){a=a|0;c[a>>2]=8404;if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Dv(a,b){a=a|0;b=b|0;return c[(bC(c[a+28>>2]|0,b)|0)+64>>2]|0}function Ev(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;Zb[a&31](b|0,c|0,d|0,e|0,f|0)}function Fv(a){a=a|0;if(!(c[a+12>>2]|0)){a=0;return a|0}a=c[a+20>>2]|0;return a|0}function Gv(a){a=a|0;et(a);Dw(a);return}function Hv(a){a=a|0;qm(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Iv(a,b){a=a|0;b=b|0;var c=0;c=Ds(64)|0;Dq(c,a,b);return c|0}function Jv(){var a=0;a=Ds(24)|0;Xt(a);return a|0}function Kv(a,b,d){a=a|0;b=b|0;d=+d;Jb[c[(c[a>>2]|0)+16>>2]&31](a,d);return}function Lv(a,b,c){a=a|0;b=b|0;c=c|0;yo(a,b,c);return}function Mv(a,b){a=a|0;b=b|0;Vb[c[(c[a>>2]|0)+36>>2]&127](a,b,2,-3);return}function Nv(a,b,d){a=a|0;b=+b;d=d|0;Mb[c[(c[a>>2]|0)+32>>2]&15](a,b,d);return}function Ov(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;return}function Pv(a){a=a|0;ji(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Qv(a){a=a|0;ni(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Rv(a,b,d){a=a|0;b=b|0;d=d|0;return +(+qb[c[(c[a>>2]|0)+32>>2]&31](a,b,d))}function Sv(a,b){a=a|0;b=b|0;$o(a,b);return}function Tv(a,b){a=a|0;b=b|0;$o(a,b);return}function Uv(a,b){a=a|0;b=b|0;$o(a,b);return}function Vv(a,b){a=a|0;b=b|0;return c[(aE(c[a+336>>2]|0,b)|0)>>2]|0}function Wv(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;Wb[a&1](b|0,c|0,d|0,e|0,+f)}function Xv(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;f=f|0;Rb[a&0](b|0,c|0,+d,e|0,f|0)}function Yv(a){a=a|0;c[a>>2]=4652;if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Zv(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;T(8);return 0.0}function _v(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+16>>2]&127](a,b);return}function $v(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+52>>2]&127](a,b);return}function aw(a,b,d){a=a|0;b=b|0;d=+d;Pb[c[(c[a>>2]|0)+8>>2]&7](a,b,d);return}function bw(a,b){a=a|0;b=b|0;wA(a,b);return}function cw(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Qc(a,b,c,d)|0;return 1}function dw(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;as(a,b,c,d,e);return}function ew(a){a=a|0;var b=0;b=Xs()|0;ig(b,a,1);return b|0}function fw(a,b,d){a=a|0;b=+b;d=d|0;g[(c[a+136>>2]|0)+(d*284|0)+232>>2]=b;return}function gw(a,b,d){a=a|0;b=+b;d=d|0;g[(c[a+136>>2]|0)+(d*284|0)+252>>2]=b;return}function hw(a,b){a=a|0;b=b|0;CH(a);c[a>>2]=5148;c[a+4>>2]=b;return}function iw(a,b){a=a|0;b=b|0;pr(a,b);return}function jw(a,b){a=a|0;b=b|0;wr(a,b);return}function kw(a,b){a=a|0;b=b|0;Vb[c[(c[a>>2]|0)+36>>2]&127](a,b,1,-1);return}function lw(a){a=+a;var b=0;h[j>>3]=a;b=c[j>>2]|0;A=c[j+4>>2]|0;return b|0}function mw(a,b,c){a=a|0;b=b|0;c=c|0;Wh(b,c);return}function nw(a,b){a=a|0;b=b|0;Rn(a,b);return}function ow(a){a=a|0;c[a>>2]=2928;c[a+4>>2]=1;c[a+8>>2]=-1;g[a+12>>2]=0.0;return}function pw(a){a=a|0;rd(a);if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function qw(a){a=a|0;var b=0;b=((c[a+56>>2]|0)+2|0)%3|0;return +(+g[(gJ(a+32|0)|0)+(b<<2)>>2])}function rw(a){a=a|0;c[a>>2]=3148;g[a+4>>2]=1.0;c[a+8>>2]=1;c[a+12>>2]=-1;return}function sw(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=b-d-(c>>>0>a>>>0|0)>>>0;return (A=d,a-c>>>0|0)|0}function tw(a,b){a=a|0;b=b|0;return c[(aE(c[a+12>>2]|0,b)|0)>>2]|0}function uw(a,b){a=a|0;b=b|0;if((c[a+220>>2]&-2|0)==4)return;c[a+220>>2]=b;return}function vw(a,b){a=a|0;b=b|0;Hr(a,b);return}function ww(a,b){a=a|0;b=b|0;Ir(a,b);return}function xw(a,b){a=a|0;b=b|0;Sb[c[(c[a>>2]|0)+56>>2]&127](a,b,0);return}function yw(a,b){a=a|0;b=+b;ry(a,b);return}function zw(a,b){a=a|0;b=b|0;return BB(a,b)|0}function Aw(a,b){a=a|0;b=b|0;return zb[c[(c[a>>2]|0)+40>>2]&31](a,b)|0}function Bw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+60>>2]&127](a,b);return}function Cw(a,b,d){a=a|0;b=b|0;d=+d;Ob[c[(c[a>>2]|0)+12>>2]&127](a,b);return}function Dw(b){b=b|0;a[b+16>>0]=1;c[b+12>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;return}function Ew(a){a=a|0;var b=0;b=Ds(64)|0;cn(b,a);return b|0}function Fw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+92>>2]&127](a,b);return}function Gw(a,b){a=a|0;b=b|0;xn(a,b);return}function Hw(a,b){a=a|0;b=b|0;zn(a,b);return}function Iw(a,b){a=a|0;b=b|0;An(a,b);return}function Jw(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return Cb[a&31](b|0,c|0,d|0,e|0)|0}function Kw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+32>>2]&127](a,b);return}function Lw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+128>>2]&127](a,b);return}function Mw(a){a=a|0;var b=0;b=Nt()|0;Ai(b,a);return b|0}function Nw(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;T(42)}function Ow(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return (A=b+d+(a+c>>>0>>>0>>0|0)>>>0,a+c>>>0|0)|0}function Pw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+40>>2]&127](a,b);return}function Qw(a,b,d){a=a|0;b=+b;d=d|0;g[(c[a+136>>2]|0)+(d*284|0)+256>>2]=b;return}function Rw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+84>>2]&127](a,b);return}function Sw(a){a=a|0;var b=0;b=ut()|0;Rf(b,a,0);return b|0}function Tw(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;Lm(a,b,c,d);return}function Uw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+28>>2]&127](a,b);return}function Vw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+124>>2]&127](a,b);return}function Ww(a,b){a=a|0;b=b|0;var d=0;d=l;l=l+16|0;c[d>>2]=b;Ik(a,d);rn();bb()}function Xw(a,b){a=a|0;b=+b;c[a+304>>2]=(c[a+304>>2]|0)+1;g[a+236>>2]=b;return}function Yw(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return +sb[a&1](b|0,c|0,d|0,e|0)}function Zw(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+72>>2]&127](a,b);return}function _w(){var a=0;a=rt()|0;lg(a,0,0,16);return a|0}function $w(a){a=a|0;var b=0;b=Ds(284)|0;Gj(b,a);return b|0}function ax(a,b){a=a|0;b=+b;g[a+44>>2]=b;g[a+48>>2]=+F(+b);return}function bx(a,b){a=a|0;b=+b;return +(+nb[c[(c[a>>2]|0)+16>>2]&15](a)*b)}function cx(a){a=a|0;pv(a,+MA(+g[a>>2],+g[a+4>>2],+g[a+8>>2]));return}function dx(a,b){a=a|0;b=b|0;Uv(a+928|0,b);return}function ex(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+12>>2]&127](a,b);return}function fx(a,b){a=a|0;b=+b;c[a+304>>2]=(c[a+304>>2]|0)+1;g[a+232>>2]=b;return}function gx(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;T(18);return 0}function hx(a,b){a=a|0;b=b|0;Oe(a,b);return}function ix(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;T(7);return 0.0}function jx(a,b,c){a=a|0;b=b|0;c=c|0;xi(a,b,c);return}function kx(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Vb[a&127](b|0,c|0,d|0,e|0)}function lx(a,b,c){a=a|0;b=b|0;c=c|0;ll(a,b,c);return}function mx(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;Pm(a,b,c,d);return}function nx(a,b){a=a|0;b=b|0;xf(a,b);return}function ox(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+68>>2]&127](a,b);return}function px(a){a=a|0;if(!a)return;Ib[c[(c[a>>2]|0)+4>>2]&511](a);return}function qx(a,b){a=a|0;b=+b;c[a+304>>2]=(c[a+304>>2]|0)+1;g[a+228>>2]=b;return}function rx(){var a=0;a=Xs()|0;ig(a,1,1);return a|0}function sx(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+8>>2]&127](a,b);return}function tx(a){a=a|0;return jF(c[a+204>>2]|0)|0}function ux(a,b,c){a=a|0;b=+b;c=+c;my(a,b,c);return}function vx(a,b){a=a|0;b=+b;Jb[c[(c[a>>2]|0)+20>>2]&31](a,b);return}function wx(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;Fl(a,b,c,d);return}function xx(a,b){a=a|0;b=b|0;nw(a+848|0,b);return}function yx(a){a=a|0;return MF(+g[a>>2],+g[a+4>>2])|0}function zx(a,b){a=a|0;b=+b;Jb[c[(c[a>>2]|0)+16>>2]&31](a,b);return}function Ax(a,b){a=a|0;b=b|0;return +(+g[(c[a+136>>2]|0)+(b*284|0)+232>>2])}function Bx(){var a=0;a=Ds(176)|0;Ne(a,0);return a|0}function Cx(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+24>>2]&127](a,b);return}function Dx(a,b){a=a|0;b=b|0;c[a+68>>2]=b;return}function Ex(a,b,d){a=a|0;b=b|0;d=d|0;c[a+20>>2]=b;c[a+28>>2]=d;return}function Fx(a,b,d){a=a|0;b=b|0;d=d|0;c[a+16>>2]=b;c[a+24>>2]=d;return}function Gx(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return 0}function Hx(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=d|0;e=+e;return yb[a&1](b|0,+c,d|0,+e)|0}function Ix(a,b,c){a=a|0;b=b|0;c=+c;Um(a,b,c);return}function Jx(a,b){a=a|0;b=b|0;Ob[c[(c[a>>2]|0)+64>>2]&127](a,b);return}function Kx(a){a=a|0;var b=0;b=((gJ(c[a+252>>2]|0)|0)&2|0)==0;return (b?0:a)|0}function Lx(a,b){a=a|0;b=b|0;return nC(c[a+12>>2]|0,b)|0}function Mx(a,b){a=a|0;b=b|0;return wC(c[a+12>>2]|0,b)|0}function Nx(a,b){a=a|0;b=b|0;return xC(c[a+12>>2]|0,b)|0}function Ox(a,b,c){a=a|0;b=b|0;c=c|0;dm(a,b,c);return}function Px(a,b,c){a=a|0;b=b|0;c=+c;g[a+1340+(b<<2)>>2]=c;return}function Qx(a,b,c){a=a|0;b=b|0;c=c|0;return jc(a,b,c)|0}function Rx(a,b,c){a=a|0;b=b|0;c=+c;mr(a,b,c);return}function Sx(a){a=a|0;c[a>>2]=3848;Qi(a+12|0);cJ(a);return}function Tx(a,b){a=a|0;b=b|0;Ln(a,b);return}function Ux(a,b){a=a|0;b=b|0;Gw(a+768|0,b);return}function Vx(a,b){a=a|0;b=b|0;Hw(a+788|0,b);return}function Wx(a,b){a=a|0;b=b|0;Iw(a+808|0,b);return}function Xx(a){a=a|0;if(!a)return;yF(a);cJ(a);return}function Yx(a,b){a=a|0;b=+b;g[a+32>>2]=b;g[a+36>>2]=b;return}function Zx(a,b,c){a=a|0;b=b|0;c=+c;g[a+1364+(b<<2)>>2]=c;return}function _x(a,b){a=a|0;b=b|0;re(a,b);return}function $x(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;Tb[a&15](b|0,c|0,d|0,+e)}function ay(a){a=a|0;if(!a)return;qC(a);cJ(a);return}function by(a){a=+a;var b=0;b=Dt()|0;sm(b,a);return b|0}function cy(a,b){a=a|0;b=b|0;kv(a,b);return}function dy(a,b){a=a|0;b=+b;g[a+136>>2]=b;return}function ey(a,b){a=a|0;b=+b;uz(a,b);return}function fy(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;Qb[a&7](b|0,c|0,+d,e|0)}function gy(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=d|0;e=e|0;Nb[a&0](b|0,+c,d|0,e|0)}function hy(a,b){a=a|0;b=+b;g[a+132>>2]=b;return}function iy(a,b){a=a|0;b=b|0;Vr(a,b);return}function jy(a,b){a=a|0;b=b|0;Wr(a,b);return}function ky(a){a=a|0;var b=0;b=gJ(a+32|0)|0;return +(+g[b+(c[a+56>>2]<<2)>>2])}function ly(a,b){a=a|0;b=b|0;c[a+24>>2]=b;return}function my(a,b,c){a=a|0;b=+b;c=+c;g[a+532>>2]=b;g[a+536>>2]=c;return}function ny(){var a=0;a=ut()|0;Rf(a,1,0);return a|0}function oy(a,b){a=a|0;b=b|0;return IC(a,b)|0}function py(a,b){a=a|0;b=b|0;g[a+56>>2]=+(b|0);return}function qy(a){a=a|0;var b=0;b=l;l=l+16|0;Hb[a&3]();Ww(22168,b)}function ry(b,c){b=b|0;c=+c;g[b+572>>2]=c;a[b+553>>0]=1;return}function sy(a,b){a=a|0;b=b|0;return c[(c[a+20>>2]|0)+(b<<2)>>2]|0}function ty(a){a=a|0;return +(+rI(+g[a+16>>2]))}function uy(a){a=a|0;return xb[c[(c[a>>2]|0)+40>>2]&127](a)|0}function vy(a){a=a|0;var b=0;b=(gJ(c[a+252>>2]|0)|0)==4;return (b?a:0)|0}function wy(a){a=a|0;return +(+MA(+g[a>>2],+g[a+4>>2],+g[a+8>>2]))}function xy(a,b){a=a|0;b=+b;dC(a,b);return}function yy(){var a=0;a=Ds(64)|0;co(a);return a|0}function zy(a,b){a=a|0;b=b|0;_B(a,b);return}function Ay(a,b){a=a|0;b=+b;Jb[c[(c[a>>2]|0)+44>>2]&31](a,b);return}function By(a,b){a=a|0;b=b|0;Eq(a,b);return}function Cy(a,b){a=a|0;b=+b;g[a+140>>2]=b;return}function Dy(a){a=a|0;return nG(+g[a+4>>2])|0}function Ey(a){a=a|0;if(!a)return;c[6996]=(c[6996]|0)+1;Cd(c[a+-4>>2]|0);return}function Fy(a,b){a=a|0;b=b|0;iD(a,b);return}function Gy(a,b){a=a|0;b=b|0;return (c[a+136>>2]|0)+(b*284|0)+92|0}function Hy(a,b){a=a|0;b=b|0;return Vv(a,b)|0}function Iy(a,b,c,d,e,f){a=+a;b=+b;c=+c;d=+d;e=+e;f=+f;return +(a*d+b*e+c*f)}function Jy(a){a=a|0;var b=0;b=(gJ(c[a+252>>2]|0)|0)==8;return (b?a:0)|0}function Ky(){var a=0;a=Ds(24)|0;Tr(a);return a|0}function Ly(a,b){a=a|0;b=b|0;Hq(a,b);return}function My(a,b){a=a|0;b=+b;UC(a,b);return}function Ny(a){a=a|0;g[a>>2]=.30000001192092896;g[a+4>>2]=1.0;g[a+8>>2]=0.0;return}function Oy(a,b){a=a|0;b=+b;yC(a,b);return}function Py(a,b){a=a|0;b=b|0;jD(a,b);return}function Qy(a,b){a=a|0;b=b|0;ur(a+4|0,b);return}function Ry(a){a=a|0;return QF(c[a+204>>2]|0)|0}function Sy(a,b){a=a|0;b=+b;WC(a,b);return}function Ty(a,b){a=a|0;b=+b;cA(a,b);return}function Uy(a,b){a=a|0;b=+b;XC(a,b);return}function Vy(a,b){a=a|0;b=+b;dA(a,b);return}function Wy(a,b){a=a|0;b=b|0;vt(a,b);return}function Xy(a,b){a=a|0;b=b|0;Jq(a,b);return}function Yy(a){a=a|0;return +(+rI(+g[a+104>>2]))}function Zy(a){a=a|0;return +(+RD(+g[a+12>>2]))}function _y(b,c){b=b|0;c=c|0;a[b+32>>0]=c&1;return}function $y(a){a=a|0;return HF(c[a+8>>2]|0)|0}function az(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Bb[a&63](b|0,c|0,d|0)|0}function bz(a,b){a=a|0;b=b|0;return +(+Ro(a,b))}function cz(a,b){a=a|0;b=b|0;xi(a,b,1);return}function dz(a,b){a=a|0;b=b|0;DC(a,b);return}function ez(a,b){a=a|0;b=b|0;c[a+8>>2]=b<<16>>16;return}function fz(a){a=a|0;if(!a)a=0;else a=(fj(a,2864)|0)!=0;return a&1|0}function gz(a){a=a|0;Jj(a);cJ(a);return}function hz(a,b){a=a|0;b=+b;bF(a,b);return}function iz(a,b){a=a|0;b=b|0;Im(a,b);return}function jz(a,b){a=a|0;b=+b;g[a+120>>2]=b;return}function kz(a,b){a=a|0;b=b|0;kB(a,b,+uE(b));return}function lz(a){a=a|0;c[a>>2]=3848;Qi(a+12|0);return}function mz(a,b){a=a|0;b=b|0;TC(a,b);return}function nz(a,b){a=a|0;b=b|0;lu(a,b);return}function oz(){var a=0;a=Ds(100)|0;Mm(a);return a|0}function pz(a,b){a=a|0;b=+b;g[a+116>>2]=b;return}function qz(a,b){a=a|0;b=+b;g[a+128>>2]=b;return}function rz(a,b){a=a|0;b=b|0;JC(a,b);return}function sz(a,b){a=a|0;b=b|0;c[a+12>>2]=b<<16>>16;return}function tz(a,b){a=a|0;b=b|0;return c[(c[a+236>>2]|0)+(b<<2)>>2]|0}function uz(b,c){b=b|0;c=+c;g[b+572>>2]=c;a[b+553>>0]=0;return}function vz(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return +qb[a&31](b|0,c|0,d|0)}function wz(a,b){a=a|0;b=b|0;KC(a,b);return}function xz(a,b){a=a|0;b=b|0;return jc(a,b,8192)|0}function yz(b,c){b=b|0;c=c|0;a[b+124>>0]=c&1;return}function zz(){var a=0;a=Ds(12)|0;Ny(a);return a|0}function Az(a,b){a=a|0;b=b|0;c[a+16>>2]=b<<16>>16;return}function Bz(a){a=a|0;if(!a)return;Ju(a);cJ(a);return}function Cz(a){a=a|0;return xb[c[(c[a>>2]|0)+48>>2]&127](a)|0}function Dz(a){a=a|0;ow(a);c[a>>2]=2904;return}function Ez(a){a=a|0;return pG(a)|0}function Fz(a,b){a=a|0;b=+b;Xw(a,b);return}function Gz(a,b){a=a|0;b=b|0;return +(+wf(a,b))}function Hz(a){a=a|0;return +(+rI(+g[a+124>>2]))}function Iz(){var a=0;a=Ds(4)|0;cC(a);return a|0}function Jz(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;return}function Kz(a){a=a|0;return kG(c[a+204>>2]|0)|0}function Lz(a,b){a=a|0;b=+b;SD(a,b);return}function Mz(a,b){a=a|0;b=b|0;yh(a,b);return}function Nz(a,b){a=a|0;b=+b;BD(a,b);return}function Oz(a){a=a|0;return xb[c[(c[a>>2]|0)+28>>2]&127](a)|0}function Pz(a,b){a=a|0;b=b|0;return Dv(a,b)|0}function Qz(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;return Ab[a&7](b|0,c|0,+d)|0}function Rz(a){a=a|0;return uv(a)|0}function Sz(a){a=a|0;return +(+g[a+136>>2])}function Tz(a){a=a|0;return qA(c[a+68>>2]|0)|0}function Uz(b){b=b|0;if((a[b>>0]|0)==1)b=0;else{a[b>>0]=1;b=1}return b|0}function Vz(b,c){b=b|0;c=c|0;a[b+80>>0]=c&1;return}function Wz(a,b){a=a|0;b=b|0;YC(a,b);return}function Xz(a){a=a|0;return +(+g[a+132>>2])}function Yz(a,b){a=a|0;b=b|0;return (c[a+136>>2]|0)+(b*284|0)|0}function Zz(a,b){a=a|0;b=b|0;bD(a,b);return}function _z(a){a=a|0;c[a+4>>2]=(c[a+4>>2]|0)+-1;return}function $z(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;T(41)}function aA(a){a=a|0;return AD(a)|0}function bA(a){a=a|0;Dw(a);return}function cA(a,b){a=a|0;b=+b;g[a+196>>2]=+ot(b);return}function dA(a,b){a=a|0;b=+b;g[a+192>>2]=+ot(b);return}function eA(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Sb[a&127](b|0,c|0,d|0)}function fA(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[a>>2]&32))wk(b,d,a);return}function gA(a,b){a=a|0;b=b|0;ur(a+92|0,b);return}function hA(a,b){a=a|0;b=+b;g[a+104>>2]=b;return}function iA(a){a=a|0;cj(a);cJ(a);return}function jA(a,b){a=a|0;b=+b;g[a+268>>2]=b;return}function kA(a){a=a|0;return +(+rI(+g[a+80>>2]))}function lA(a,b){a=a|0;b=b|0;c[b+780>>2]=0;return}function mA(a,b){a=a|0;b=b|0;vk(a,b);return}function nA(){c[5957]=1065353216;c[5958]=0;c[5959]=0;g[5960]=0.0;return}function oA(a,b){a=a|0;b=+b;fx(a,b);return}function pA(a){a=a|0;return +(+nb[c[(c[a>>2]|0)+48>>2]&15](a))}function qA(a){a=a|0;return xb[c[(c[a>>2]|0)+36>>2]&127](a)|0}function rA(a){a=a|0;var b=0;b=l;l=l+a|0;l=l+15&-16;return b|0}function sA(a,b){a=a|0;b=b|0;Ld(a,b);return}function tA(a,b){a=a|0;b=b|0;CD(a,b);return}function uA(a){a=a|0;return +(+g[a+140>>2])}function vA(b){b=b|0;return (a[b+32>>0]&1)!=0|0}function wA(b,c){b=b|0;c=c|0;a[b+250>>0]=c&1;return}function xA(a,b){a=a|0;b=b|0;ss(a,b);return}function yA(a,b){a=a|0;b=b|0;Xn(a+348|0,b);return}function zA(a,b){a=a|0;b=b|0;return Kx(b)|0}function AA(a,b){a=a|0;b=+b;g[a+112>>2]=b;return}function BA(a,b){a=a|0;b=b|0;yh(b,a);return}function CA(b,c){b=b|0;c=c|0;a[b+44>>0]=c&1;return}function DA(a){a=a|0;return cH(a)|0}function EA(a){a=a|0;return dH(a)|0}function FA(a){a=a|0;return iH(a)|0}function GA(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;T(17);return 0}function HA(a){a=a|0;_z(a);return}function IA(a,b){a=a|0;b=b|0;mA(a,b);return}function JA(a,b){a=a|0;b=b|0;return Jy(b)|0}function KA(a,b){a=a|0;b=b|0;c[a+52>>2]=b&1;return}function LA(a,b,d){a=a|0;b=b|0;d=d|0;c[a+24+(b<<2)>>2]=d;return}function MA(a,b,c){a=+a;b=+b;c=+c;return +(+VI(+_A(a,b,c)))}function NA(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;Mb[a&15](b|0,+c,d|0)}function OA(a,b){a=a|0;b=b|0;if(!a)a=0;else a=Jk(a,b)|0;return a|0}function PA(a,b){a=a|0;b=+b;g[a+220>>2]=b;return}function QA(a,b){a=a|0;b=+b;g[a+100>>2]=b;return}function RA(b){b=b|0;return (a[b+124>>0]&1)!=0|0}function SA(b,c){b=b|0;c=c|0;a[b+24>>0]=c&1;return}function TA(a){a=a|0;return ~~+g[a+56>>2]|0}function UA(a,b,d){a=a|0;b=b|0;d=d|0;c[a+8+(b<<2)>>2]=d;return}function VA(b,c){b=b|0;c=c|0;a[b+288>>0]=c&1;return}function WA(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;Pb[a&7](b|0,c|0,+d)}function XA(a,b){a=a|0;b=+b;g[a+224>>2]=b;return}function YA(a,b){a=a|0;b=+b;qx(a,b);return}function ZA(a){a=a|0;return GC(c[a+220>>2]|0)|0}function _A(a,b,c){a=+a;b=+b;c=+c;return +(+Iy(a,b,c,a,b,c))}function $A(a){a=+a;if(!(a<-1.0)){if(a>1.0)a=1.0}else a=-1.0;return +(+I(+a))}function aB(a){a=a|0;return +(+g[a+120>>2])}function bB(b,c){b=b|0;c=c|0;a[b+16>>0]=c&1;return}function cB(a){a=a|0;return tE(a)|0}function dB(a,b){a=a|0;b=b|0;Vm(a+104|0,b);return}function eB(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;f=f|0;T(4);return 0.0}function fB(a,b){a=a|0;b=+b;g[a+204>>2]=b;return}function gB(a,b){a=a|0;b=+b;g[a+208>>2]=b;return}function hB(a){a=a|0;return +(+g[a+116>>2])}function iB(a){a=a|0;return +(+g[a+128>>2])}function jB(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return}function kB(a,b,c){a=a|0;b=b|0;c=+c;qo(a,b,1.0/c);return}function lB(a){a=a|0;nf(a);cJ(a);return}function mB(a,b){a=a|0;b=b|0;var c=0;c=KB(a|0)|0;return ((b|0)==0?a:c)|0}function nB(a,b){a=a|0;b=+b;g[a+216>>2]=b;return}function oB(b){b=b|0;return (a[b+80>>0]&1)!=0|0}function pB(a,b){a=a|0;b=b|0;c[a+36>>2]=b;return}function qB(a,b){a=a|0;b=b|0;c[a+32>>2]=b;return}function rB(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Ye(a,b,c,d,0)|0}function sB(a,b){a=a|0;b=+b;g[a+248>>2]=b;return}function tB(b,c){b=b|0;c=c|0;a[b+260>>0]=c&1;return}function uB(b,c){b=b|0;c=c|0;a[b+25>>0]=c&1;return}function vB(a,b,c){a=a|0;b=+b;c=c|0;return}function wB(a,b){a=a|0;b=b|0;c[a+72>>2]=b;return}function xB(a){a=a|0;uu(a,+uE(a))|0;return}function yB(a,b,c,d){a=a|0;b=b|0;c=+c;d=+d;Kb[a&7](b|0,+c,+d)}function zB(a){a=a|0;return +(+GH(+g[a+12>>2]))}function AB(a,b){a=a|0;b=b|0;c[a+8>>2]=b;return}function BB(a,b){a=a|0;b=b|0;return a+868+(b<<6)|0}function CB(a){a=a|0;return zH(a)|0}function DB(a,b){a=a|0;b=b|0;return +(+_s(a,b))}function EB(a){a=a|0;return c[a+8>>2]&65535|0}function FB(a,b){a=a|0;b=b|0;c[a+220>>2]=b;return}function GB(b,c){b=b|0;c=c|0;a[b+26>>0]=c&1;return}function HB(b,c){b=b|0;c=c|0;a[b+84>>0]=c&1;return}function IB(a){a=a|0;Gi(a);cJ(a);return}function JB(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;T(40)}function KB(a){a=a|0;return (a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function LB(a){a=a|0;return HH(a)|0}function MB(a){a=a|0;return VE(a)|0}function NB(a){a=a|0;return (c[a+108>>2]|0)+4|0}function OB(a,b){a=a|0;b=b|0;c[a+4>>2]=b;return}function PB(a){a=a|0;return c[a+12>>2]&65535|0}function QB(a){a=a|0;if(!a)return;Ey(a);return}function RB(a,b){a=a|0;b=b|0;Vm(a+28|0,b);return}function SB(a,b,c){a=a|0;b=b|0;c=c|0;return zb[a&31](b|0,c|0)|0}function TB(a,b){a=a|0;b=+b;g[a+244>>2]=b;return}function UB(a,b){a=a|0;b=+b;g[a+240>>2]=b;return}function VB(a){a=a|0;return +(+g[a+104>>2])}function WB(a,b){a=a|0;b=b|0;return Nl(a,b)|0}function XB(a){a=a|0;return MH(a)|0}function YB(a){a=a|0;return c[a+16>>2]&65535|0}function ZB(a){a=a|0;kk(a);cJ(a);return}function _B(b,c){b=b|0;c=c|0;a[b+524>>0]=c&1;return}function $B(a){a=a|0;return ((a|0)==0?1:a<<1)|0}function aC(a,b){a=a|0;b=b|0;return a+(b*96|0)|0}function bC(a,b){a=a|0;b=b|0;return a+(b*80|0)|0}function cC(a){a=a|0;NG(a);c[a>>2]=3e3;return}function dC(a,b){a=a|0;b=+b;g[a+272>>2]=b;return}function eC(a,b){a=a|0;b=+b;g[a+212>>2]=b;return}function fC(a,b){a=a|0;b=+b;g[a+228>>2]=b;return}function gC(a){a=a|0;return +(+g[a+268>>2])}function hC(b){b=b|0;return (a[b+44>>0]&1)!=0|0}function iC(a){a=a|0;return gJ(c[a+84>>2]|0)|0}function jC(a,b){a=a|0;b=b|0;return Xo(a,b)|0}function kC(a,b){a=a|0;b=b|0;return Wo(a,b)|0}function lC(a,b){a=a|0;b=b|0;return +(+Gp(a,b))}function mC(a){a=a|0;return +(+ky(a))}function nC(a,b){a=a|0;b=b|0;return a+(b*104|0)|0}function oC(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;T(39)}function pC(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;f=f|0;T(33)}function qC(a){a=a|0;Gv(a);return}function rC(a,b){a=a|0;b=+b;g[a+252>>2]=b;return}function sC(a){a=a|0;return +(+g[a+96>>2])}function tC(a){a=a|0;return YH(a)|0}function uC(a){a=a|0;return (c[a+52>>2]|0)!=0|0}function vC(a){a=a|0;Qi(a);cJ(a);return}function wC(a,b){a=a|0;b=b|0;return a+(b*52|0)|0}function xC(a,b){a=a|0;b=b|0;return a+(b*44|0)|0}function yC(a,b){a=a|0;b=+b;g[a+276>>2]=b;return}function zC(a){a=a|0;bA(a);return}function AC(a){a=a|0;return gJ(c[a+88>>2]|0)|0}function BC(a){a=a|0;return gJ(c[a+780>>2]|0)|0}function CC(b){b=b|0;return (a[b+24>>0]&1)!=0|0}function DC(b,c){b=b|0;c=c|0;a[b+552>>0]=c&1;return}function EC(a,b,c){a=a|0;b=b|0;c=c|0;return 0}function FC(a){a=a|0;return +(+g[a+112>>2])}function GC(a){a=a|0;a=gJ(a)|0;return (a|0)!=5&(a|0)!=2|0}function HC(a){a=a|0;mk(a);cJ(a);return}function IC(a,b){a=a|0;b=b|0;return a+4+(b*192|0)|0}function JC(b,c){b=b|0;c=c|0;a[b+736>>0]=c&1;return}function KC(a,b){a=a|0;b=b|0;c[a+204>>2]=b;return}function LC(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=d|0;e=e|0;f=f|0;T(24)}function MC(a,b){a=a|0;b=+b;g[a+232>>2]=b;return}function NC(a,b){a=a|0;b=+b;g[a+280>>2]=b;return}function OC(a,b){a=a|0;b=+b;g[a+236>>2]=b;return}function PC(a){a=a|0;return +(+g[a+272>>2])}function QC(a,b){a=a|0;b=+b;return uu(a,b)|0}function RC(b){b=b|0;return (a[b+16>>0]&1)!=0|0}function SC(a){a=a|0;if(a>>>0>4294963200){c[7137]=0-a;a=-1}return a|0}function TC(b,c){b=b|0;c=c|0;a[b+21>>0]=c&1;return}function UC(a,b){a=a|0;b=+b;g[a+684>>2]=b;return}function VC(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;T(16);return 0}function WC(a,b){a=a|0;b=+b;g[a+188>>2]=b;return}function XC(a,b){a=a|0;b=+b;g[a+184>>2]=b;return}function YC(a,b){a=a|0;b=b|0;c[a+256>>2]=b;return}function ZC(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;T(6);return 0.0}function _C(a){a=a|0;return +(+g[a+220>>2])}function $C(a){a=a|0;return +(+g[a+100>>2])}function aD(a){a=a|0;return gJ(c[a+120>>2]|0)|0}function bD(b,c){b=b|0;c=c|0;a[b+737>>0]=c&1;return}function cD(a,b){a=a|0;b=+b;g[a+256>>2]=b;return}function dD(a){a=a|0;return +(+g[a+224>>2])}function eD(a,b){a=a|0;b=b|0;return vs(a,b)|0}function fD(a,b){a=a|0;b=b|0;return us(a,b)|0}function gD(a){a=a|0;return hh(a)|0}function hD(b,c){b=b|0;c=c|0;a[b+152>>0]=c&1;return}function iD(a,b){a=a|0;b=b|0;c[a+84>>2]=b;return}function jD(a,b){a=a|0;b=b|0;c[a+88>>2]=b;return}function kD(a,b){a=a|0;b=b|0;c[a+92>>2]=b;return}function lD(a,b){a=a|0;b=b|0;c[a+100>>2]=b;return}function mD(a,b){a=a|0;b=b|0;c[a+96>>2]=b;return}function nD(a){a=a|0;return (c[a+48>>2]|0)==1|0}function oD(a){a=a|0;nk(a);cJ(a);return}function pD(a){a=a|0;Hk(a);cJ(a);return}function qD(a,b){a=a|0;b=b|0;return (a|0)==(b|0)|0}function rD(a,b){a=a|0;b=b|0;if(!p){p=a;q=b}}function sD(b){b=b|0;return (a[b+260>>0]&1)!=0|0}function tD(a){a=a|0;return gJ(c[a+108>>2]|0)|0}function uD(a){a=a|0;return gJ(c[a+112>>2]|0)|0}function vD(a){a=a|0;return gJ(c[a+776>>2]|0)|0}function wD(a){a=a|0;return gJ(c[a+772>>2]|0)|0}function xD(b){b=b|0;return (a[b+25>>0]&1)!=0|0}function yD(a,b){a=a|0;b=b|0;return c[a+24+(b<<2)>>2]|0}function zD(a){a=a|0;return (c[a+96>>2]|0)+4|0}function AD(a){a=a|0;return gJ(c[a+328>>2]|0)|0}function BD(a,b){a=a|0;b=+b;g[a+440>>2]=b;return}function CD(a,b){a=a|0;b=b|0;c[a+264>>2]=b;return}function DD(a,b,c){a=a|0;b=b|0;c=c|0;Ob[a&127](b|0,c|0)}function ED(a,b,c){a=a|0;b=b|0;c=+c;return +ob[a&1](b|0,+c)}function FD(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=d|0;e=e|0;T(2);return 0.0}function GD(a){a=a|0;return +(+g[a+276>>2])}function HD(a){a=a|0;return +(+g[a+208>>2])}function ID(a){a=a|0;return gJ(c[a+192>>2]|0)|0}function JD(a){a=a|0;return gJ(c[a+204>>2]|0)|0}function KD(a){a=a|0;return gJ(c[a+24>>2]|0)|0}function LD(a){a=a|0;return gJ(c[a+68>>2]|0)|0}function MD(a){a=a|0;return +(+qw(a))}function ND(a,b){a=a|0;b=b|0;c[a+16>>2]=b;return}function OD(a,b){a=a|0;b=b|0;return c[a+8+(b<<2)>>2]|0}function PD(a,b){a=a|0;b=+b;g[a+72>>2]=b;return}function QD(a){a=+a;return (g[j>>2]=a,c[j>>2]|0)|0}function RD(a){a=+a;return +(+$A(!(a>=0.0)?-a:a)*2.0)}function SD(a,b){a=a|0;b=+b;g[a+96>>2]=b;return}function TD(a){a=a|0;if(!a)return;cJ(a);return}function UD(a){a=a|0;return +(+g[a+216>>2])}function VD(a){a=a|0;return gJ(c[a+540>>2]|0)|0}function WD(a){a=a|0;return gJ(c[a+116>>2]|0)|0}function XD(a,b){a=a|0;b=+b;RF(a,b);return}function YD(b){b=b|0;return (a[b+26>>0]&1)!=0|0}function ZD(b){b=b|0;return (a[b+84>>0]&1)!=0|0}function _D(a,b){a=a|0;b=+b;g[a+80>>2]=b;return}function $D(a){a=a|0;return +(+g[a+32>>2]*+g[a+16>>2])}function aE(a,b){a=a|0;b=b|0;return a+(b<<2)|0}function bE(a){a=a|0;return +(+g[a+248>>2])}function cE(a){a=a|0;return gJ(c[a+256>>2]|0)|0}function dE(a){a=a|0;return _H(a)|0}function eE(a,b){a=a|0;b=+b;g[a+52>>2]=b;return}function fE(a,b){a=a|0;b=+b;g[a+56>>2]=b;return}function gE(a,b){a=a|0;b=b|0;c[a+20>>2]=b;return}function hE(a,b,c){a=a|0;b=b|0;c=+c;return 0}function iE(a){a=a|0;return +(+g[a+204>>2])}function jE(a){a=a|0;kr(a);return}function kE(a,b){a=a|0;b=+b;lG(a,b);return}function lE(a,b){a=a|0;b=+b;mG(a,b);return}function mE(a,b){a=a|0;b=+b;MG(a,b);return}function nE(a){a=a|0;return gJ(c[a+264>>2]|0)|0}function oE(a){a=a|0;return c[a+36>>2]|0}function pE(a){a=a|0;return c[a+32>>2]|0}function qE(a){a=a|0;return gJ(c[a+56>>2]|0)|0}function rE(a,b){a=a|0;b=+b;g[a+68>>2]=b;return}function sE(a){a=a|0;return (c[a+52>>2]|0)+4|0}function tE(a){a=a|0;return gJ(c[a+20>>2]|0)|0}function uE(a){a=a|0;return +(+VI(+EF(a)))}function vE(a,b){a=a|0;b=b|0;return a+156+(b<<4)|0}function wE(a,b,c){a=a|0;b=b|0;c=+c;Jb[a&31](b|0,+c)}function xE(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;T(38)}function yE(a){a=a|0;return +(+g[(NI(a)|0)>>2])}function zE(a){a=a|0;return +(+g[(OI(a)|0)>>2])}function AE(a){a=a|0;return +(+g[(MI(a)|0)>>2])}function BE(a){a=a|0;return gI(a)|0}function CE(a){a=a|0;xB(a);return}function DE(a){a=a|0;return c[a+8>>2]|0}function EE(a,b){a=a|0;b=+b;g[a+64>>2]=b;return}function FE(a,b){a=a|0;b=+b;g[a+60>>2]=b;return}function GE(a,b){a=a|0;b=+b;g[a+44>>2]=b;return}function HE(a,b){a=a|0;b=+b;g[a+40>>2]=b;return}function IE(a,b){a=a|0;b=+b;g[a+36>>2]=b;return}function JE(a,b){a=a|0;b=+b;g[a+92>>2]=b;return}function KE(a){a=a|0;return c[a+216>>2]|0}function LE(a){a=a|0;return +(+g[a+244>>2])}function ME(a){a=a|0;return +(+g[a+240>>2])}function NE(a){a=a|0;return +(+EF(a))}function OE(a,b){a=a|0;b=b|0;return a+28+(b<<4)|0}function PE(a,b){a=a|0;b=+b;g[a+24>>2]=b;return}function QE(a,b){a=a|0;b=+b;g[a+20>>2]=b;return}function RE(a,b){a=a|0;b=+b;g[a+32>>2]=b;return}function SE(a,b){a=a|0;b=+b;g[a+28>>2]=b;return}function TE(a,b){a=a|0;b=b|0;c[a>>2]=b;return}function UE(a){a=a|0;return c[a+228>>2]|0}function VE(a){a=a|0;return gJ(c[a+128>>2]|0)|0}function WE(a){a=a|0;c[a+232>>2]=0;return}function XE(a,b,c){a=a|0;b=b|0;c=c|0;return}function YE(a,b){a=a|0;b=+b;g[a+76>>2]=b;return}function ZE(a){a=a|0;return +(+g[a+212>>2])}function _E(a){a=a|0;return +(+g[a+228>>2])}function $E(a){a=a|0;return a+56|0}function aF(a){a=a|0;return c[a+24>>2]|0}function bF(a,b){a=a|0;b=+b;g[a+16>>2]=b;return}function cF(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;T(35)}function dF(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=d|0;e=e|0;T(30)}function eF(a){a=a|0;return +(+g[a+252>>2])}function fF(a){a=a|0;return OI(a)|0}function gF(a){a=a|0;return +(+uE(a))}function hF(a){a=a|0;return c[a+4>>2]|0}function iF(){var a=0;a=c[7140]|0;c[7140]=a+0;return a|0}function jF(a){a=a|0;return (a&3|0)!=0|0}function kF(a,b){a=a|0;b=+b;g[a+48>>2]=b;return}function lF(a){a=a|0;return a+156|0}function mF(b){b=b|0;return (a[b+152>>0]&1)!=0|0}function nF(){var a=0;a=c[2475]|0;c[2475]=a+0;return a|0}function oF(a){a=a|0;return 644}function pF(a){a=a|0;pi(a);cJ(a);return}function qF(a){a=a|0;Ki(a);cJ(a);return}function rF(a){a=a|0;Oj(a);cJ(a);return}function sF(a){a=a|0;return +(+g[a+232>>2])}function tF(a){a=a|0;return +(+g[a+280>>2])}function uF(a){a=a|0;return +(+g[a+236>>2])}function vF(a){a=a|0;return a+100|0}function wF(a){a=a|0;return 348}function xF(a){a=a|0;return c[a+12>>2]|0}function yF(a){a=a|0;BF(a+56|0);return}function zF(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;T(15);return 0}function AF(a){a=a|0;cx(a);return}function BF(a){a=a|0;qC(a);return}function CF(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;T(5);return 0.0}function DF(a){a=a|0;return gJ(c[a+4>>2]|0)|0}function EF(a){a=a|0;return +(+Gp(a,a))}function FF(a){a=a|0;return +(+g[a+256>>2])}function GF(a){a=a|0;return +(+g[a>>2])}function HF(a){a=a|0;return (a|0)!=0|0}function IF(a,b){a=a|0;b=b|0;return xb[a&127](b|0)|0}function JF(a){a=a|0;return a+24|0}function KF(a){a=a|0;Ua(a|0)|0;Cq()}function LF(a){a=a|0;return c[a+1304>>2]|0}function MF(a,b){a=+a;b=+b;return !(a>b)|0}function NF(a){a=a|0;return a+64|0}function OF(a){a=a|0;return +(+g[a+72>>2])}function PF(a){a=a|0;return c[a+332>>2]|0}function QF(a){a=a|0;return (a&2|0)!=0|0}function RF(a,b){a=a|0;b=+b;g[a+12>>2]=b;return}function SF(a){a=a|0;return a+172|0}function TF(a){a=a|0;return c[a+84>>2]|0}function UF(a){a=a|0;return c[a+88>>2]|0}function VF(a){a=a|0;return c[a+92>>2]|0}function WF(a){a=a|0;return c[a+96>>2]|0}function XF(a){a=a|0;return 252}function YF(a,b,c,d){a=a|0;b=+b;c=c|0;d=+d;T(11);return 0}function ZF(a){a=a|0;return +(+g[(gJ(a)|0)>>2])}function _F(a){a=a|0;return a+52|0}function $F(a){a=a|0;return +(+g[a+80>>2])}function aG(a){a=a|0;return 28}function bG(a){a=a|0;return c[a+100>>2]|0}function cG(a){a=a|0;return c[a+72>>2]|0}function dG(a,b){a=a|0;b=b|0;return +nb[a&15](b|0)}function eG(a){a=a|0;return a+40|0}function fG(a){a=a|0;return c[a+16>>2]|0}function gG(a){a=a|0;return +(+g[a+52>>2])}function hG(a){a=a|0;return +(+g[a+56>>2])}function iG(a){a=a|0;return a+112|0}function jG(a){a=a|0;return 212}function kG(a){a=a|0;return (a&1|0)!=0|0}function lG(a,b){a=a|0;b=+b;g[a+8>>2]=b;return}function mG(a,b){a=a|0;b=+b;g[a+4>>2]=b;return}function nG(a){a=+a;return a<1.0|0}function oG(a,b){a=a|0;b=b|0;return 1}function pG(a){a=a|0;return a+344|0}function qG(a){a=a|0;NH(a);return}function rG(a){a=a|0;return +(+g[a+68>>2])}function sG(a){a=a|0;return c[a+300>>2]|0}function tG(a,b){a=a|0;b=b|0;l=a;m=b}function uG(a){a=a|0;return a+188|0}function vG(a){a=a|0;return c[a+20>>2]|0}function wG(a){a=a|0;return 204}function xG(a){a=a|0;return c[a+748>>2]|0}function yG(a,b){a=a|0;b=b|0;return}function zG(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;T(34)}function AG(a){a=a|0;return a+68|0}function BG(a){a=a|0;return a+36|0}function CG(a){a=a|0;return +(+g[a+64>>2])}function DG(a){a=a|0;return +(+g[a+60>>2])}function EG(a){a=a|0;return +(+g[a+44>>2])}function FG(a){a=a|0;return +(+g[a+40>>2])}function GG(a){a=a|0;return +(+g[a+36>>2])}function HG(a){a=a|0;return +(+g[a+48>>2])}function IG(a){a=a|0;return +(+g[a+92>>2])}function JG(a){a=a|0;return 220}function KG(a){a=a|0;return 264}function LG(a){a=a|0;return +(+g[a+76>>2])}function MG(a,b){a=a|0;b=+b;g[a>>2]=b;return}function NG(a){a=a|0;c[a>>2]=3028;return}function OG(a){a=a|0;c[a>>2]=8404;return}function PG(a){a=a|0;qG(a);return}function QG(a){a=a|0;return +(+g[a+24>>2])}function RG(a){a=a|0;return +(+g[a+4>>2])}function SG(a){a=a|0;return +(+g[a+20>>2])}function TG(a){a=a|0;return +(+g[a+32>>2])}function UG(a){a=a|0;return +(+g[a+16>>2])}function VG(a){a=a|0;return +(+g[a+12>>2])}function WG(a){a=a|0;return +(+g[a+28>>2])}function XG(a){a=a|0;return a+16|0}function YG(a){a=a|0;return 52}function ZG(a){a=a|0;return 68}function _G(a){a=a|0;return 84}function $G(a,b){a=a|0;b=b|0;return a+(b<<4)|0}function aH(a){a=a|0;return a+928|0}function bH(a){a=a|0;return +(+g[a+8>>2])}function cH(a){a=a|0;return a+316|0}function dH(a){a=a|0;return a+300|0}function eH(a,b){a=a|0;b=b|0;Ib[a&511](b|0)}function fH(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;T(32)}function gH(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;T(29)}function hH(a,b,c,d){a=a|0;b=+b;c=c|0;d=d|0;T(26)}function iH(a){a=a|0;return a+32|0}function jH(a){a=a|0;return 24}function kH(a){a=a|0;return a+848|0}function lH(a){a=a|0;return c[a>>2]|0}function mH(a,b){a=a|0;b=b|0;return nv(a,b)|0}function nH(a){a=a|0;Ey(a);return}function oH(a){a=a|0;cJ(a+-4|0);return}function pH(a){a=a|0;ni(a);return}function qH(a){a=a|0;return gJ(a)|0}function rH(a){a=a|0;return a+768|0}function sH(a){a=a|0;return a+788|0}function tH(a){a=a|0;return a+808|0}function uH(a){a=a|0;return a+104|0}function vH(a){a=a|0;return 496}function wH(a,b,c){a=a|0;b=b|0;c=c|0;T(14);return 0}function xH(a){a=a|0;return 32}function yH(a){a=a|0;return a+80|0}function zH(a){a=a|0;return a+388|0}function AH(a){a=a|0;return 60}function BH(a){a=a|0;return 436}function CH(a){a=a|0;c[a>>2]=3104;return}function DH(a,b,c){a=a|0;b=b|0;c=c|0;T(3);return 0.0}function EH(a){a=a|0;return a+348|0}function FH(){return Ds(1)|0}function GH(a){a=+a;return +(+$A(a)*2.0)}function HH(a){a=a|0;return a+372|0}function IH(a){a=a|0;c[a>>2]=4652;return}function JH(a){a=a|0;return (a&255)<<8|a>>8&255|0}function KH(a,b,c){a=a|0;b=b|0;c=+c;T(13);return 0}function LH(a){a=a|0;return 11398}function MH(a){a=a|0;return a+92|0}function NH(a){a=a|0;c[a>>2]=0;return}function OH(a){a=a|0;return a+88|0}function PH(a){a=a|0;return 4}function QH(a){a=a|0;return a+20|0}function RH(a){a=a|0;return 17723}function SH(a){a=a|0;return 17439}function TH(a){a=a|0;c[a>>2]=3080;return}function UH(){return Pt()|0}function VH(a){a=a|0;return 11336}function WH(a,b){a=a|0;b=+b;return}function XH(a){a=a|0;return a+76|0}function YH(a){a=a|0;return a+28|0}function ZH(a){a=a|0;return 16585}function _H(a){a=a|0;return a+440|0}function $H(a){a=+a;return +(+mh(a,6.2831854820251465))}function aI(a){a=a|0;return a+72|0}function bI(a,b,c){a=a|0;b=b|0;c=c|0;T(31)}function cI(a){a=a|0;return 16969}function dI(a,b){a=+a;b=b|0;return +(+Em(a,b))}function eI(){return Ds(64)|0}function fI(a){a=a|0;return 17027}function gI(a){a=a|0;return a+48|0}function hI(){c[176]=o}function iI(a){a=a|0;return 17225}function jI(a){a=a|0;return 1}function kI(a,b,c){a=a|0;b=b|0;c=+c;T(28)}function lI(a,b,c){a=a|0;b=+b;c=c|0;T(25)}function mI(a){a=a|0;return 17840}function nI(a){a=a|0;return 17811}function oI(a){a=a|0;return 3}function pI(a){a=a|0;return Gm(a,28524)|0}function qI(a){a=a|0;return 11665}function rI(a){a=+a;return +a}function sI(a){a=a|0;return 17783}function tI(a){a=a|0;return 16300}function uI(a){a=a|0;return 17383}function vI(a){a=a|0;return 17356}function wI(a){a=a|0;return 17326}function xI(a){a=a|0;return 8}function yI(a,b,c){a=a|0;b=+b;c=+c;T(23)}function zI(a){a=a|0;return 16404}function AI(a,b){a=a|0;b=b|0;T(12);return 0}function BI(a){a=a|0;return 16362}function CI(a){a=a|0;return 16383}function DI(a){a=a|0;return 6}function EI(a){a=a|0;return 12}function FI(){return 4}function GI(a){a=a|0;return 16343}function HI(a){a=a|0;return 0}function II(a){a=a|0;return 2}function JI(a){a=a|0;return 17498}function KI(a,b){a=a|0;b=+b;T(1);return 0.0}function LI(){c[5628]=1805;c[5629]=0;return}function MI(a){a=a|0;return a+12|0}function NI(a){a=a|0;return a+8|0}function OI(a){a=a|0;return a+4|0}function PI(a){a=a|0;Hb[a&3]()}function QI(){return 2}function RI(){return 1}function SI(){return 5}function TI(){return 3}function UI(){Wa()}function VI(a){a=+a;return +(+D(+a))}function WI(a){a=+a;return +(+G(+a))}function XI(a){a=+a;return +(+F(+a))}function YI(a,b){a=a|0;b=b|0;T(27)}function ZI(a){a=a|0;return}function _I(a,b){a=a|0;b=+b;T(22)}function $I(a){a=a|0;return Ds(a)|0}function aJ(a){a=a|0;cJ(a);return}function bJ(a){a=a|0;l=a}function cJ(a){a=a|0;Cd(a);return}function dJ(a){a=a|0;A=a}function eJ(a){a=a|0;T(10);return 0}function fJ(a){a=a|0;T(0);return 0.0}function gJ(a){a=a|0;return a|0}function hJ(){return A|0}function iJ(){return l|0}function jJ(a){a=a|0;T(21)}function kJ(){return 0}function lJ(){T(20)} +function dc(d,f){d=d|0;f=f|0;var h=0,i=0,k=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0.0,E=0.0,F=0.0,G=0,H=0.0,I=0,J=0,K=0,L=0.0,M=0,N=0,O=0.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.0,ja=0.0,ka=0,la=0;ha=l;l=l+192|0;i=c[d+56>>2]|0;if(i|0?(Ib[c[c[i>>2]>>2]&511](i),h=c[d+56>>2]|0,h|0):0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[6995]=(c[6995]|0)+1;h=sc(151)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}c[h>>2]=9696;a[h+20>>0]=1;c[h+16>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;a[h+40>>0]=1;c[h+36>>2]=0;c[h+28>>2]=0;c[h+32>>2]=0;a[h+60>>0]=1;c[h+56>>2]=0;c[h+48>>2]=0;c[h+52>>2]=0;c[d+56>>2]=h;n=0;o=0;ga=0;K=0;h=0;while(1){if((n|0)>=(xb[c[(c[d>>2]|0)+96>>2]&127](d)|0))break;do if((K|0)==(o|0)){i=o|0?o<<1:1;if((o|0)<(i|0)){if((i|0)!=0?(c[6995]=(c[6995]|0)+1,p=sc((i<<4|3)+16|0)|0,(p|0)!=0):0){c[(p+4+15&-16)+-4>>2]=p;k=p+4+15&-16}else k=0;if((o|0)<=0){if(!ga){m=k;h=k;k=o;break}}else{h=0;do{fa=k+(h<<4)|0;ea=ga+(h<<4)|0;c[fa>>2]=c[ea>>2];c[fa+4>>2]=c[ea+4>>2];c[fa+8>>2]=c[ea+8>>2];c[fa+12>>2]=c[ea+12>>2];h=h+1|0}while((h|0)!=(o|0))}c[6996]=(c[6996]|0)+1;Cd(c[ga+-4>>2]|0);m=k;h=k;k=o}else{i=o;m=ga;k=o}}else{i=o;m=ga;k=K}while(0);o=m+(K<<4)|0;c[o>>2]=c[ha+136>>2];c[o+4>>2]=c[ha+136+4>>2];c[o+8>>2]=c[ha+136+8>>2];c[o+12>>2]=c[ha+136+12>>2];Sb[c[(c[d>>2]|0)+108>>2]&127](d,n,o);n=n+1|0;o=i;ga=m;K=k+1|0}a[ha+76+16>>0]=1;fa=ha+76+12|0;c[fa>>2]=0;c[ha+76+4>>2]=0;c[ha+76+8>>2]=0;a[ha+76+36>>0]=1;ea=ha+76+32|0;c[ea>>2]=0;c[ha+76+24>>2]=0;c[ha+76+28>>2]=0;a[ha+76+56>>0]=1;da=ha+76+52|0;c[da>>2]=0;c[ha+76+44>>2]=0;c[ha+76+48>>2]=0;if(f){if((K|0)>0){J=0;i=0;k=0;m=0;while(1){h=J;J=J+1|0;if((J|0)<(K|0)){G=ga+(h<<4)|0;I=ga+(h<<4)+4|0;A=ga+(h<<4)+8|0;z=J;h=m;do{m=z;z=z+1|0;if((z|0)<(K|0)){x=ga+(m<<4)|0;y=ga+(m<<4)+4|0;w=ga+(m<<4)+8|0;f=z;do{F=+g[G>>2];v=+g[x>>2]-F;H=+g[I>>2];B=+g[y>>2]-H;L=+g[A>>2];E=+g[w>>2]-L;F=+g[ga+(f<<4)>>2]-F;H=+g[ga+(f<<4)+4>>2]-H;L=+g[ga+(f<<4)+8>>2]-L;q=1.0;p=0;while(1){t=(B*L-E*H)*q;u=(E*F-v*L)*q;r=(v*H-B*F)*q;a:do if(r*r+(t*t+u*u)>9.999999747378752e-05){s=1.0/+D(+(r*r+(t*t+u*u)));if((h|0)>0){m=0;do{if(t*s*+g[k+(m<<4)>>2]+u*s*+g[k+(m<<4)+4>>2]+r*s*+g[k+(m<<4)+8>>2]>.9990000128746033)break a;m=m+1|0}while((m|0)<(h|0))}q=t*s*+g[G>>2]+u*s*+g[I>>2]+r*s*+g[A>>2];m=0;do{if(t*s*+g[ga+(m<<4)>>2]+u*s*+g[ga+(m<<4)+4>>2]+r*s*+g[ga+(m<<4)+8>>2]-q+-.009999999776482582>0.0)break a;m=m+1|0}while((m|0)<(K|0));do if((h|0)==(i|0)){o=i|0?i<<1:1;if((i|0)<(o|0)){do if(!o)n=0;else{c[6995]=(c[6995]|0)+1;m=sc((o<<4|3)+16|0)|0;if(!m){n=0;break}c[(m+4+15&-16)+-4>>2]=m;n=m+4+15&-16}while(0);if((i|0)<=0){if(!k){m=o;k=n;break}}else{m=0;do{aa=n+(m<<4)|0;$=k+(m<<4)|0;c[aa>>2]=c[$>>2];c[aa+4>>2]=c[$+4>>2];c[aa+8>>2]=c[$+8>>2];c[aa+12>>2]=c[$+12>>2];m=m+1|0}while((m|0)!=(i|0))}c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);m=o;k=n}else m=i}else{m=i;i=h}while(0);g[k+(i<<4)>>2]=t*s;g[k+(i<<4)+4>>2]=u*s;g[k+(i<<4)+8>>2]=r*s;g[k+(i<<4)+12>>2]=-q;i=m;h=h+1|0}while(0);p=p+1|0;if((p|0)==2)break;else q=-1.0}f=f+1|0}while((f|0)!=(K|0))}}while((z|0)!=(K|0))}else h=m;if((J|0)==(K|0)){f=h;break}else m=h}if((f|0)>0){h=0;o=0;p=0;while(1){aa=k+(p<<4)|0;c[ha+136>>2]=c[aa>>2];c[ha+136+4>>2]=c[aa+4>>2];c[ha+136+8>>2]=c[aa+8>>2];q=+g[k+(p<<4)+12>>2];q=q-+nb[c[(c[d>>2]|0)+48>>2]&15](d);do if((p|0)==(h|0)){n=h|0?h<<1:1;if((h|0)<(n|0)){if((n|0)!=0?(c[6995]=(c[6995]|0)+1,M=sc((n<<4|3)+16|0)|0,(M|0)!=0):0){c[(M+4+15&-16)+-4>>2]=M;m=M+4+15&-16}else m=0;if((h|0)<=0){if(!o)break}else{i=0;do{aa=m+(i<<4)|0;$=o+(i<<4)|0;c[aa>>2]=c[$>>2];c[aa+4>>2]=c[$+4>>2];c[aa+8>>2]=c[$+8>>2];c[aa+12>>2]=c[$+12>>2];i=i+1|0}while((i|0)!=(h|0))}c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0)}else{n=h;m=o}}else{n=h;m=o;h=p}while(0);aa=m+(h<<4)|0;c[aa>>2]=c[ha+136>>2];c[aa+4>>2]=c[ha+136+4>>2];c[aa+8>>2]=c[ha+136+8>>2];g[m+(h<<4)+12>>2]=q;p=p+1|0;if((p|0)<(f|0)){h=n;o=m}else break}if((p|0)>0){G=0;o=0;n=0;i=0;h=0;do{z=G;G=G+1|0;if((G|0)<(p|0)){A=G;do{y=A;A=A+1|0;if((A|0)<(p|0)){x=A;do{t=+g[m+(y<<4)+4>>2];q=+g[m+(x<<4)+8>>2];r=+g[m+(y<<4)+8>>2];u=+g[m+(x<<4)+4>>2];v=+g[m+(x<<4)>>2];B=+g[m+(y<<4)>>2];s=+g[m+(z<<4)+8>>2];E=+g[m+(z<<4)+4>>2];F=+g[m+(z<<4)>>2];b:do if((((u*B-t*v)*(u*B-t*v)+((t*q-r*u)*(t*q-r*u)+(r*v-q*B)*(r*v-q*B))>9.999999747378752e-05?(v*E-u*F)*(v*E-u*F)+((u*s-q*E)*(u*s-q*E)+(q*F-v*s)*(q*F-v*s))>9.999999747378752e-05:0)?(t*F-B*E)*(t*F-B*E)+((r*E-t*s)*(r*E-t*s)+(B*s-r*F)*(B*s-r*F))>9.999999747378752e-05:0)?(O=s*(u*B-t*v)+(E*(r*v-q*B)+(t*q-r*u)*F),+C(+O)>9.999999974752427e-07):0){ia=+g[m+(z<<4)+12>>2];L=+g[m+(y<<4)+12>>2];ja=+g[m+(x<<4)+12>>2];H=-1.0/O*((r*E-t*s)*ja+((t*q-r*u)*ia+(u*s-q*E)*L));r=-1.0/O*((B*s-r*F)*ja+((r*v-q*B)*ia+(q*F-v*s)*L));q=-1.0/O*((t*F-B*E)*ja+((u*B-t*v)*ia+(v*E-u*F)*L));f=0;do{if(+g[m+(f<<4)+12>>2]+(H*+g[m+(f<<4)>>2]+r*+g[m+(f<<4)+4>>2]+q*+g[m+(f<<4)+8>>2])+-.009999999776482582>0.0)break b;f=f+1|0}while((f|0)<(p|0));do if((i|0)==(o|0)){w=o|0?o<<1:1;if((o|0)>=(w|0)){w=o;break}do if(!w)f=0;else{c[6995]=(c[6995]|0)+1;h=sc((w<<4|3)+16|0)|0;if(!h){f=0;break}c[(h+4+15&-16)+-4>>2]=h;f=h+4+15&-16}while(0);if((o|0)<=0){if(!n){n=f;h=f;break}}else{h=0;do{aa=f+(h<<4)|0;$=n+(h<<4)|0;c[aa>>2]=c[$>>2];c[aa+4>>2]=c[$+4>>2];c[aa+8>>2]=c[$+8>>2];c[aa+12>>2]=c[$+12>>2];h=h+1|0}while((h|0)!=(o|0))}c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0);n=f;h=f}else{w=o;o=i}while(0);g[n+(o<<4)>>2]=H;g[n+(o<<4)+4>>2]=r;g[n+(o<<4)+8>>2]=q;g[n+(o<<4)+12>>2]=0.0;o=w;i=i+1|0}while(0);x=x+1|0}while((x|0)!=(p|0))}}while((A|0)!=(p|0))}}while((G|0)!=(p|0))}else{n=0;i=0;h=0}}else{n=0;m=0;i=0;h=0}}else{n=0;m=0;k=0;i=0;h=0}uc(ha+76|0,h,i);if(n|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}if(m|0){c[6996]=(c[6996]|0)+1;Cd(c[m+-4>>2]|0)}if(k|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}}else uc(ha+76|0,h,K);I=c[ha+76+44>>2]|0;if((I|0)>0){c[6995]=(c[6995]|0)+1;h=sc((I<<4|3)+16|0)|0;if(!h)i=0;else{c[(h+4+15&-16)+-4>>2]=h;i=h+4+15&-16}h=0;do{aa=i+(h<<4)|0;c[aa>>2]=c[ha+136>>2];c[aa+4>>2]=c[ha+136+4>>2];c[aa+8>>2]=c[ha+136+8>>2];c[aa+12>>2]=c[ha+136+12>>2];h=h+1|0}while((h|0)!=(I|0));aa=i;_=i}else{aa=0;_=0}a[ha+56+16>>0]=1;$=ha+56+12|0;c[$>>2]=0;Z=ha+56+4|0;c[Z>>2]=0;c[ha+56+8>>2]=0;k=ha+136|0;n=k+19|0;do{a[k>>0]=0;k=k+1|0}while((k|0)<(n|0));if((I|0)<0)gb();if(I|0){Of(ha+56|0,I);i=c[$>>2]|0;h=0;do{a[i+(h*36|0)+16>>0]=1;k=i+(h*36|0)+4|0;c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;k=i+(h*36|0)+20|0;m=ha+136+3|0;n=k+16|0;do{a[k>>0]=a[m>>0]|0;k=k+1|0;m=m+1|0}while((k|0)<(n|0));h=h+1|0}while((h|0)!=(I|0))}c[Z>>2]=I;o=c[ha+76+4>>2]|0;n=c[d+56>>2]|0;m=c[n+8>>2]|0;if((m|0)<(o|0)){if((c[n+12>>2]|0)<(o|0)){if(!o){h=0;k=m}else{c[6995]=(c[6995]|0)+1;h=sc((o<<4|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}k=c[n+8>>2]|0}if((k|0)>0){i=0;do{Y=h+(i<<4)|0;X=(c[n+16>>2]|0)+(i<<4)|0;c[Y>>2]=c[X>>2];c[Y+4>>2]=c[X+4>>2];c[Y+8>>2]=c[X+8>>2];c[Y+12>>2]=c[X+12>>2];i=i+1|0}while((i|0)!=(k|0))}i=c[n+16>>2]|0;if(i|0){if(a[n+20>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[n+16>>2]=0}a[n+20>>0]=1;c[n+16>>2]=h;c[n+12>>2]=o;i=n+16|0}else i=n+16|0;h=m;do{Y=(c[i>>2]|0)+(h<<4)|0;c[Y>>2]=c[ha+136>>2];c[Y+4>>2]=c[ha+136+4>>2];c[Y+8>>2]=c[ha+136+8>>2];c[Y+12>>2]=c[ha+136+12>>2];h=h+1|0}while((h|0)!=(o|0))}c[n+8>>2]=o;if((o|0)>0){h=0;do{X=(c[fa>>2]|0)+(h<<4)|0;Y=(c[(c[d+56>>2]|0)+16>>2]|0)+(h<<4)|0;c[Y>>2]=c[X>>2];c[Y+4>>2]=c[X+4>>2];c[Y+8>>2]=c[X+8>>2];c[Y+12>>2]=c[X+12>>2];h=h+1|0}while((h|0)!=(o|0))}if((I|0)>0){G=0;do{z=(c[ea>>2]|0)+((c[(c[da>>2]|0)+(G<<2)>>2]|0)*12|0)|0;y=z;h=0;do{A=y+4|0;x=c[y+((c[A>>2]|0)*12|0)+8>>2]|0;f=c[$>>2]|0;w=f+(G*36|0)+4|0;i=c[w>>2]|0;p=f+(G*36|0)+8|0;if((i|0)==(c[p>>2]|0)?(N=i|0?i<<1:1,(i|0)<(N|0)):0){if(!N)o=0;else{c[6995]=(c[6995]|0)+1;i=sc((N<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}o=i;i=c[w>>2]|0}n=f+(G*36|0)+12|0;m=c[n>>2]|0;if((i|0)<=0)if(!m)k=f+(G*36|0)+16|0;else ba=132;else{k=0;do{c[o+(k<<2)>>2]=c[m+(k<<2)>>2];k=k+1|0}while((k|0)!=(i|0));ba=132}if((ba|0)==132){ba=0;i=f+(G*36|0)+16|0;if(a[i>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[m+-4>>2]|0)}c[n>>2]=0;k=i;i=c[w>>2]|0}a[k>>0]=1;c[n>>2]=o;c[p>>2]=N}c[(c[f+(G*36|0)+12>>2]|0)+(i<<2)>>2]=x;c[w>>2]=(c[w>>2]|0)+1;X=c[y+8>>2]|0;Y=c[fa>>2]|0;s=+g[Y+(X<<4)>>2]-+g[Y+(x<<4)>>2];t=+g[Y+(X<<4)+4>>2]-+g[Y+(x<<4)+4>>2];q=+g[Y+(X<<4)+8>>2]-+g[Y+(x<<4)+8>>2];r=1.0/+D(+(s*s+t*t+q*q));if((h|0)<2){g[ha+136+(h<<4)>>2]=s*r;g[ha+136+(h<<4)+4>>2]=t*r;g[ha+136+(h<<4)+8>>2]=q*r;g[ha+136+(h<<4)+12>>2]=0.0;h=h+1|0}Y=y+((c[A>>2]|0)*12|0)|0;y=Y+((c[Y>>2]|0)*12|0)|0}while((y|0)!=(z|0));if((h|0)==2){H=+g[ha+136+4>>2];L=+g[ha+136+24>>2];O=+g[ha+136+8>>2];ia=+g[ha+136+20>>2];F=+g[ha+136+16>>2];E=+g[ha+136>>2];X=aa+(G<<4)+4|0;Y=aa+(G<<4)+8|0;g[aa+(G<<4)+12>>2]=0.0;ja=1.0/+D(+((H*L-O*ia)*(H*L-O*ia)+(O*F-L*E)*(O*F-L*E)+(ia*E-H*F)*(ia*E-H*F)));g[aa+(G<<4)>>2]=(H*L-O*ia)*ja;g[X>>2]=(O*F-L*E)*ja;g[Y>>2]=(ia*E-H*F)*ja;n=c[$>>2]|0;g[n+(G*36|0)+20>>2]=(H*L-O*ia)*ja;c[n+(G*36|0)+24>>2]=c[X>>2];c[n+(G*36|0)+28>>2]=c[Y>>2];g[n+(G*36|0)+32>>2]=1000000015047466219876688.0e6}else{n=aa+(G<<4)|0;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;n=c[$>>2]|0}k=c[n+(G*36|0)+4>>2]|0;if((k|0)>0){m=c[(c[d+56>>2]|0)+16>>2]|0;r=+g[aa+(G<<4)>>2];s=+g[aa+(G<<4)+4>>2];t=+g[aa+(G<<4)+8>>2];i=c[n+(G*36|0)+12>>2]|0;h=0;q=1000000015047466219876688.0e6;do{Y=c[i+(h<<2)>>2]|0;ja=+g[m+(Y<<4)>>2]*r+ +g[m+(Y<<4)+4>>2]*s+ +g[m+(Y<<4)+8>>2]*t;q=q>ja?ja:q;h=h+1|0}while((h|0)!=(k|0))}else q=1000000015047466219876688.0e6;g[n+(G*36|0)+32>>2]=-q;G=G+1|0}while((G|0)!=(I|0))}if((c[Z>>2]|0)>0){i=0;m=0;k=0;n=0;o=0;while(1){do if((o|0)==(i|0)){i=o|0?o<<1:1;if((o|0)<(i|0)){if((i|0)!=0?(c[6995]=(c[6995]|0)+1,P=sc((i<<2|3)+16|0)|0,(P|0)!=0):0){c[(P+4+15&-16)+-4>>2]=P;k=P+4+15&-16}else k=0;if((o|0)>0){h=0;do{c[k+(h<<2)>>2]=c[m+(h<<2)>>2];h=h+1|0}while((h|0)!=(o|0));if(!n){m=k;Y=k;h=k;break}}else if((m|0)==0|(n|0)==0){m=k;Y=k;h=k;break}c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0);m=k;Y=k;h=k}else{i=o;Y=k;h=n}}else{Y=k;h=n}while(0);c[m+(o<<2)>>2]=o;o=o+1|0;if((o|0)>=(c[Z>>2]|0))break;else{k=Y;n=h}}M=ha+36+12|0;N=ha+36+4|0;P=ha+136+12|0;k=o;do{w=k+-1|0;i=c[m+(w<<2)>>2]|0;c[6995]=(c[6995]|0)+1;h=sc(23)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}c[h>>2]=i;X=c[$>>2]|0;r=+g[X+(i*36|0)+20>>2];s=+g[X+(i*36|0)+24>>2];q=+g[X+(i*36|0)+28>>2];c:do if((k|0)>1){o=w;i=h;f=h;n=1;p=h;h=1;y=w;while(1){z=h;while(1){h=c[$>>2]|0;x=o;do{X=x;x=x+-1|0;if((X|0)<=0){K=i;J=p;I=z;k=y;break c}w=c[m+(x<<2)>>2]|0}while(!(r*+g[h+(w*36|0)+20>>2]+s*+g[h+(w*36|0)+24>>2]+q*+g[h+(w*36|0)+28>>2]>.9990000128746033));do if((z|0)==(n|0)){k=z|0?z<<1:1;if((z|0)<(k|0)){do if(!k)o=0;else{c[6995]=(c[6995]|0)+1;h=sc((k<<2|3)+16|0)|0;if(!h){o=0;break}c[(h+4+15&-16)+-4>>2]=h;o=h+4+15&-16}while(0);if((z|0)>0){h=0;do{c[o+(h<<2)>>2]=c[p+(h<<2)>>2];h=h+1|0}while((h|0)!=(z|0));if(!f){n=k;p=o;i=o;f=o;break}}else if((p|0)==0|(f|0)==0){n=k;p=o;i=o;f=o;break}c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);n=k;p=o;i=o;f=o}else n=z}while(0);c[p+(z<<2)>>2]=w;z=z+1|0;h=0;while(1){if((c[m+(h<<2)>>2]|0)==(w|0))break;h=h+1|0;if((h|0)>=(y|0)){h=y;break}}if((y|0)>(h|0))break;else o=x}V=m+(h<<2)|0;W=c[V>>2]|0;k=y+-1|0;X=m+(k<<2)|0;c[V>>2]=c[X>>2];c[X>>2]=W;if((y|0)>1){o=x;h=z;y=k}else{o=x;h=z;ba=162;break}}}else{o=w;i=h;f=h;n=1;p=h;h=1;k=w;ba=162}while(0);d:do if((ba|0)==162){ba=0;y=h;while(1){h=c[$>>2]|0;w=o;do{X=w;w=w+-1|0;if((X|0)<=0){K=i;J=p;I=y;break d}x=c[m+(w<<2)>>2]|0}while(!(r*+g[h+(x*36|0)+20>>2]+s*+g[h+(x*36|0)+24>>2]+q*+g[h+(x*36|0)+28>>2]>.9990000128746033));do if((y|0)==(n|0)){n=y|0?y<<1:1;if((y|0)<(n|0)){do if(!n)o=0;else{c[6995]=(c[6995]|0)+1;h=sc((n<<2|3)+16|0)|0;if(!h){o=0;break}c[(h+4+15&-16)+-4>>2]=h;o=h+4+15&-16}while(0);if((y|0)>0){h=0;do{c[o+(h<<2)>>2]=c[p+(h<<2)>>2];h=h+1|0}while((h|0)!=(y|0));if(!f){p=o;i=o;h=o;break}}else if((p|0)==0|(f|0)==0){p=o;i=o;h=o;break}c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0);p=o;i=o;h=o}else{n=y;h=f}}else h=f;while(0);c[p+(y<<2)>>2]=x;o=w;f=h;y=y+1|0}}while(0);if((I|0)>1){a[ha+36+16>>0]=1;c[M>>2]=0;c[N>>2]=0;c[ha+36+8>>2]=0;z=0;q=0.0;r=0.0;s=0.0;n=0;do{i=c[J+(z<<2)>>2]|0;q=+g[h+(i*36|0)+20>>2]+q;r=+g[h+(i*36|0)+24>>2]+r;s=+g[h+(i*36|0)+28>>2]+s;y=h+(i*36|0)+4|0;if((c[y>>2]|0)>0){x=h+(i*36|0)+12|0;w=0;h=n;while(1){f=c[(c[x>>2]|0)+(w<<2)>>2]|0;X=(c[(c[d+56>>2]|0)+16>>2]|0)+(f<<4)|0;c[ha+136>>2]=c[X>>2];c[ha+136+4>>2]=c[X+4>>2];c[ha+136+8>>2]=c[X+8>>2];c[ha+136+12>>2]=c[X+12>>2];e:do if((h|0)>0){n=c[M>>2]|0;i=0;while(1){if((c[n+(i*24|0)+20>>2]|0)==(f|0))break e;i=i+1|0;if((i|0)>=(h|0)){ba=261;break}}}else ba=261;while(0);if((ba|0)==261){ba=0;c[ha>>2]=c[ha+136>>2];c[ha+4>>2]=c[ha+136+4>>2];c[ha+8>>2]=c[ha+136+8>>2];c[ha+12>>2]=c[ha+136+12>>2];do if((h|0)==(c[ha+36+8>>2]|0)){p=h|0?h<<1:1;if((h|0)>=(p|0))break;if(!p)o=0;else{c[6995]=(c[6995]|0)+1;h=sc((p*24|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}o=h;h=c[N>>2]|0}n=c[M>>2]|0;if((h|0)<=0){if(n)ba=270}else{i=0;do{ba=o+(i*24|0)|0;X=n+(i*24|0)|0;c[ba>>2]=c[X>>2];c[ba+4>>2]=c[X+4>>2];c[ba+8>>2]=c[X+8>>2];c[ba+12>>2]=c[X+12>>2];c[ba+16>>2]=c[X+16>>2];c[ba+20>>2]=c[X+20>>2];i=i+1|0}while((i|0)!=(h|0));ba=270}if((ba|0)==270){ba=0;if(a[ha+36+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0);h=c[N>>2]|0}c[M>>2]=0}a[ha+36+16>>0]=1;c[M>>2]=o;c[ha+36+8>>2]=p}while(0);X=c[M>>2]|0;W=X+(h*24|0)|0;c[W>>2]=c[ha>>2];c[W+4>>2]=c[ha+4>>2];c[W+8>>2]=c[ha+8>>2];c[W+12>>2]=c[ha+12>>2];c[W+16>>2]=c[ha+16>>2];c[X+(h*24|0)+20>>2]=f;h=(c[N>>2]|0)+1|0;c[N>>2]=h}w=w+1|0;if((w|0)>=(c[y>>2]|0)){n=h;break}}}z=z+1|0;h=c[$>>2]|0}while((z|0)!=(I|0));a[ha+16>>0]=1;c[ha+12>>2]=0;c[ha+4>>2]=0;c[ha+8>>2]=0;X=c[J>>2]|0;c[ha+20>>2]=c[h+(X*36|0)+20>>2];c[ha+24>>2]=c[h+(X*36|0)+24>>2];c[ha+28>>2]=c[h+(X*36|0)+28>>2];c[ha+32>>2]=c[h+(X*36|0)+32>>2];H=1.0/+D(+(q*q+r*r+s*s));O=q*H;L=r*H;H=s*H;if(+C(+H)>.7071067690849304){F=1.0/+D(+(H*H+L*L));t=O*-(H*F);u=(H*H+L*L)*F;v=0.0;B=L*F;E=-(O*L*F);F=-(H*F)}else{F=1.0/+D(+(O*O+L*L));t=(O*O+L*L)*F;u=-(H*O*F);v=-(L*F);B=0.0;E=H*-(L*F);F=O*F}if((n|0)<2)if((n|0)==1){n=0;o=0;f=0;i=1;while(1){w=c[M>>2]|0;do if((n|0)==(o|0)){p=o|0?o<<1:1;if((o|0)>=(p|0)){p=o;h=f;break}do if(!p)h=0;else{c[6995]=(c[6995]|0)+1;h=sc((p*24|3)+16|0)|0;if(!h){h=0;o=n;break}c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16;o=n}while(0);if((o|0)<=0){if(f|0)ba=212}else{i=0;do{ba=h+(i*24|0)|0;X=f+(i*24|0)|0;c[ba>>2]=c[X>>2];c[ba+4>>2]=c[X+4>>2];c[ba+8>>2]=c[X+8>>2];c[ba+12>>2]=c[X+12>>2];c[ba+16>>2]=c[X+16>>2];c[ba+20>>2]=c[X+20>>2];i=i+1|0}while((i|0)!=(o|0));ba=212}if((ba|0)==212){ba=0;c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}o=n;i=c[N>>2]|0}else{p=o;h=f;o=n}while(0);X=h+(o*24|0)|0;c[X>>2]=c[w>>2];c[X+4>>2]=c[w+4>>2];c[X+8>>2]=c[w+8>>2];c[X+12>>2]=c[w+12>>2];c[X+16>>2]=c[w+16>>2];c[X+20>>2]=c[w+20>>2];n=n+1|0;if((n|0)<(i|0)){o=p;f=h}else{ba=276;break}}}else{h=0;ba=315}else{o=c[M>>2]|0;i=0;h=n;do{if(v*+g[o+(i*24|0)>>2]+F*+g[o+(i*24|0)+4>>2]+B*+g[o+(i*24|0)+8>>2]>2]+F*+g[o+4>>2]+B*+g[o+8>>2]){c[ha+136>>2]=c[o>>2];c[ha+136+4>>2]=c[o+4>>2];c[ha+136+8>>2]=c[o+8>>2];c[ha+136+12>>2]=c[o+12>>2];c[ha+136+16>>2]=c[o+16>>2];c[ha+136+20>>2]=c[o+20>>2];h=o+(i*24|0)|0;c[o>>2]=c[h>>2];c[o+4>>2]=c[h+4>>2];c[o+8>>2]=c[h+8>>2];c[o+12>>2]=c[h+12>>2];c[o+16>>2]=c[h+16>>2];c[o+20>>2]=c[h+20>>2];h=o+(i*24|0)|0;c[h>>2]=c[ha+136>>2];c[h+4>>2]=c[ha+136+4>>2];c[h+8>>2]=c[ha+136+8>>2];c[h+12>>2]=c[ha+136+12>>2];c[h+16>>2]=c[ha+136+16>>2];c[h+20>>2]=c[ha+136+20>>2];h=n}i=i+1|0}while((i|0)<(h|0));g[o+16>>2]=-1000000015047466219876688.0e6;if((h|0)>1){s=+g[o+4>>2];i=1;do{ia=+g[o+(i*24|0)>>2]-+g[o>>2];ja=+g[o+(i*24|0)+4>>2]-s;r=+g[o+(i*24|0)+8>>2]-+g[o+8>>2];q=u*ia+E*ja+t*r;r=v*ia+F*ja+B*r;if(q*q+r*r<1.1920928955078125e-07)q=0.0;else{ja=+C(+q);ja=(!(r>=0.0)?2.356194496154785:.7853981852531433)-(!(r>=0.0)?r+ja:r-ja)/(!(r>=0.0)?ja-r:r+ja)*.7853981852531433;q=q<0.0?-ja:ja}g[o+(i*24|0)+16>>2]=q;i=i+1|0}while((i|0)!=(h|0))}c[ha+136>>2]=c[o>>2];c[ha+136+4>>2]=c[o+4>>2];c[ha+136+8>>2]=c[o+8>>2];c[ha+136+12>>2]=c[o+12>>2];rf(ha+36|0,ha+136|0,1,h+-1|0);i=c[M>>2]|0;c[6995]=(c[6995]|0)+1;h=sc(43)|0;if(!h)n=0;else{c[(h+4+15&-16)+-4>>2]=h;n=h+4+15&-16}o=c[M>>2]|0;c[n>>2]=c[i>>2];c[n+4>>2]=c[i+4>>2];c[n+8>>2]=c[i+8>>2];c[n+12>>2]=c[i+12>>2];c[n+16>>2]=c[i+16>>2];c[n+20>>2]=c[i+20>>2];c[6995]=(c[6995]|0)+1;h=sc(67)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}c[h>>2]=c[n>>2];c[h+4>>2]=c[n+4>>2];c[h+8>>2]=c[n+8>>2];c[h+12>>2]=c[n+12>>2];c[h+16>>2]=c[n+16>>2];c[h+20>>2]=c[n+20>>2];if(n|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}ba=h+24|0;c[ba>>2]=c[o+24>>2];c[ba+4>>2]=c[o+24+4>>2];c[ba+8>>2]=c[o+24+8>>2];c[ba+12>>2]=c[o+24+12>>2];c[ba+16>>2]=c[o+24+16>>2];c[ba+20>>2]=c[o+24+20>>2];if((c[N>>2]|0)==2){i=2;n=2}else{i=2;n=2;f=2;o=2;do{f:do if((o|0)>1){w=c[M>>2]|0;x=w+(i*24|0)|0;q=+g[x>>2];r=+g[w+(i*24|0)+4>>2];s=+g[w+(i*24|0)+8>>2];while(1){ba=o+-2|0;p=o+-1|0;F=+g[h+(ba*24|0)>>2];ia=F-+g[h+(p*24|0)>>2];B=+g[h+(ba*24|0)+4>>2];v=B-+g[h+(p*24|0)+4>>2];ja=+g[h+(ba*24|0)+8>>2];E=ja-+g[h+(p*24|0)+8>>2];if((ia*(B-r)-v*(F-q))*H+(O*(v*(ja-s)-E*(B-r))+L*(E*(F-q)-ia*(ja-s)))>0.0)break;if((p|0)>1){n=p;o=p}else{n=p;o=w;ba=240;break f}}do if((o|0)==(f|0)){w=f<<1;if((f|0)>=(w|0)){w=f;o=f;break}c[6995]=(c[6995]|0)+1;o=sc((f*48|3)+16|0)|0;if(!o)p=0;else{c[(o+4+15&-16)+-4>>2]=o;p=o+4+15&-16}if((n|0)>0){o=0;do{ba=p+(o*24|0)|0;X=h+(o*24|0)|0;c[ba>>2]=c[X>>2];c[ba+4>>2]=c[X+4>>2];c[ba+8>>2]=c[X+8>>2];c[ba+12>>2]=c[X+12>>2];c[ba+16>>2]=c[X+16>>2];c[ba+20>>2]=c[X+20>>2];o=o+1|0}while((o|0)!=(n|0))}c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);h=p;o=n}else w=f;while(0);o=h+(o*24|0)|0;c[o>>2]=c[x>>2];c[o+4>>2]=c[x+4>>2];c[o+8>>2]=c[x+8>>2];c[o+12>>2]=c[x+12>>2];c[o+16>>2]=c[x+16>>2];c[o+20>>2]=c[x+20>>2];o=n+1|0;n=o;f=w;ba=238}else ba=238;while(0);do if((ba|0)==238){ba=0;if((o|0)!=1)break;o=c[M>>2]|0;ba=240}while(0);if((ba|0)==240){w=o+(i*24|0)|0;do if((f|0)==1){c[6995]=(c[6995]|0)+1;o=sc(67)|0;if(!o)p=0;else{c[(o+4+15&-16)+-4>>2]=o;p=o+4+15&-16}if((n|0)<=0){if(!h){f=2;h=p;o=n;break}}else{o=0;do{ba=p+(o*24|0)|0;X=h+(o*24|0)|0;c[ba>>2]=c[X>>2];c[ba+4>>2]=c[X+4>>2];c[ba+8>>2]=c[X+8>>2];c[ba+12>>2]=c[X+12>>2];c[ba+16>>2]=c[X+16>>2];c[ba+20>>2]=c[X+20>>2];o=o+1|0}while((o|0)!=(n|0))}c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);f=2;h=p;o=n}else o=1;while(0);o=h+(o*24|0)|0;c[o>>2]=c[w>>2];c[o+4>>2]=c[w+4>>2];c[o+8>>2]=c[w+8>>2];c[o+12>>2]=c[w+12>>2];c[o+16>>2]=c[w+16>>2];c[o+20>>2]=c[w+20>>2];o=n+1|0;n=o}i=i+1|0}while((i|0)!=(c[N>>2]|0))}ba=276}g:do if((ba|0)==276){ba=0;if((n|0)>0){G=0;o=c[ha+4>>2]|0;i=c[ha+8>>2]|0;w=a[ha+16>>0]|0;while(1){A=h+(G*24|0)+20|0;do if((o|0)==(i|0)){y=i|0?i<<1:1;if((i|0)>=(y|0)){z=w;o=i;y=i;break}do if(!y)f=0;else{c[6995]=(c[6995]|0)+1;o=sc((y<<2|3)+16|0)|0;if(!o){f=0;break}c[(o+4+15&-16)+-4>>2]=o;f=o+4+15&-16}while(0);p=c[ha+12>>2]|0;if((i|0)<=0){if(p)ba=305}else{o=0;do{c[f+(o<<2)>>2]=c[p+(o<<2)>>2];o=o+1|0}while((o|0)!=(i|0));ba=305}if((ba|0)==305){ba=0;if(w<<24>>24){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}c[ha+12>>2]=0;i=c[ha+4>>2]|0}c[ha+12>>2]=f;c[ha+8>>2]=y;z=1;o=i}else{z=w;y=i}while(0);c[(c[ha+12>>2]|0)+(o<<2)>>2]=c[A>>2];o=o+1|0;c[ha+4>>2]=o;i=c[N>>2]|0;h:do if((i|0)>0){x=c[M>>2]|0;f=c[A>>2]|0;p=0;while(1){w=x+(p*24|0)+20|0;p=p+1|0;if((c[w>>2]|0)==(f|0))break;if((p|0)>=(i|0))break h}c[w>>2]=-1}while(0);G=G+1|0;if((G|0)>=(n|0))break;else{i=y;w=z}}a[ha+16>>0]=z}if((i|0)<=0){ba=315;break}x=c[M>>2]|0;y=c[Z>>2]|0;z=c[$>>2]|0;A=(I|0)>0;if((y|0)>0)w=0;else{ba=315;break}while(1){G=c[x+(w*24|0)+20>>2]|0;i:do if((G|0)!=-1){if(A)f=0;else{o=0;while(1){p=c[z+(o*36|0)+4>>2]|0;if((p|0)>0){f=c[z+(o*36|0)+12>>2]|0;n=0;do{if((c[f+(n<<2)>>2]|0)==(G|0)){i=1;break g}n=n+1|0}while((n|0)<(p|0))}o=o+1|0;if((o|0)>=(y|0))break i}}do{n=0;while(1){if((c[J+(n<<2)>>2]|0)==(f|0))break;n=n+1|0;if((n|0)>=(I|0)){ba=291;break}}do if((ba|0)==291){ba=0;o=c[z+(f*36|0)+4>>2]|0;if((o|0)<=0)break;p=c[z+(f*36|0)+12>>2]|0;n=0;do{if((c[p+(n<<2)>>2]|0)==(G|0)){i=1;break g}n=n+1|0}while((n|0)<(o|0))}while(0);f=f+1|0}while((f|0)<(y|0))}while(0);w=w+1|0;if((w|0)>=(i|0)){ba=315;break}}}while(0);if((ba|0)==315){ba=0;ih((c[d+56>>2]|0)+24|0,ha);i=0}if(h|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}h=c[ha+12>>2]|0;if(h|0){if(a[ha+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[ha+12>>2]=0}h=c[M>>2]|0;if(h|0){if(a[ha+36+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[M>>2]=0}if(i&(I|0)>0){p=0;ba=327}}else if((I|0)==1){p=0;ba=327}if((ba|0)==327)while(1){ba=0;f=c[J+(p<<2)>>2]|0;w=c[$>>2]|0;a[ha+136+16>>0]=1;c[P>>2]=0;c[ha+136+4>>2]=0;c[ha+136+8>>2]=0;o=c[w+(f*36|0)+4>>2]|0;if((o|0)>0){c[6995]=(c[6995]|0)+1;i=sc((o<<2|3)+16|0)|0;do if(!i){h=0;n=0}else{c[(i+4+15&-16)+-4>>2]=i;h=c[P>>2]|0;if((h|0)==0|(a[ha+136+16>>0]|0)==0){h=i+4+15&-16;n=i+4+15&-16;break}c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);h=i+4+15&-16;n=i+4+15&-16}while(0);a[ha+136+16>>0]=1;c[P>>2]=h;c[ha+136+8>>2]=o;Yk(h|0,0,o<<2|0)|0;c[ha+136+4>>2]=o;i=c[w+(f*36|0)+12>>2]|0;h=0;do{c[n+(h<<2)>>2]=c[i+(h<<2)>>2];h=h+1|0}while((h|0)!=(o|0));h=c[P>>2]|0}else{c[ha+136+4>>2]=o;h=0}c[ha+136+20>>2]=c[w+(f*36|0)+20>>2];c[ha+136+20+4>>2]=c[w+(f*36|0)+20+4>>2];c[ha+136+20+8>>2]=c[w+(f*36|0)+20+8>>2];c[ha+136+20+12>>2]=c[w+(f*36|0)+20+12>>2];ih((c[d+56>>2]|0)+24|0,ha+136|0);if(h|0){if(a[ha+136+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[P>>2]=0}p=p+1|0;if((p|0)>=(I|0))break;else ba=327}if(!((J|0)==0|(K|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[K+-4>>2]|0)}}while((k|0)!=0)}else{Y=0;m=0}X=c[d+56>>2]|0;c[X+64>>2]=0;c[X+64+4>>2]=0;c[X+64+8>>2]=0;c[X+64+12>>2]=0;h=c[X+28>>2]|0;if((h|0)>0){W=0;i=0;k=0;I=0;K=0;f=0;n=0;J=0;w=0;o=0;G=0;z=0;x=0;y=0;p=0;while(1){A=c[X+36>>2]|0;V=c[A+(W*36|0)+4>>2]|0;if((V|0)>0){U=W&65535;T=W|-65536;N=0;S=J;P=w;h=A;M=p;while(1){R=N+1|0;d=c[h+(W*36|0)+12>>2]|0;w=c[d+(N<<2)>>2]&65535;N=c[d+(((R|0)==(V|0)?0:R)<<2)>>2]&65535;d=N<<16>>16>w<<16>>16?w:N;Q=N<<16>>16>w<<16>>16?N:w;p=N<<16>>16>w<<16>>16?w:N;w=N<<16>>16>w<<16>>16?N:w;N=P+-1|0;j:do if((((p&65535)<<16)+(w<<16>>16)&N)>>>0>>0?(ca=c[k+((((p&65535)<<16)+(w<<16>>16)&N)<<2)>>2]|0,(ca|0)!=-1):0){h=ca;while(1){if(w<<16>>16==(b[i+(h<<2)>>1]|0)?p<<16>>16==(b[i+(h<<2)+2>>1]|0):0)break;h=c[n+(h<<2)>>2]|0;if((h|0)==-1){J=0;break j}}J=o+(h<<2)|0}else J=0;while(0);h=c[X+16>>2]|0;u=+g[h+(p<<16>>16<<4)>>2]-+g[h+(w<<16>>16<<4)>>2];v=+g[h+(p<<16>>16<<4)+4>>2]-+g[h+(w<<16>>16<<4)+4>>2];s=+g[h+(p<<16>>16<<4)+8>>2]-+g[h+(w<<16>>16<<4)+8>>2];t=1.0/+D(+(u*u+v*v+s*s));h=c[X+48>>2]|0;k:do if((h|0)>0){w=c[X+56>>2]|0;p=0;while(1){q=+g[w+(p<<4)>>2];r=+g[w+(p<<4)+8>>2];do if(!(+C(+(q-u*t))>1.0e-06)){if(+C(+(+g[w+(p<<4)+4>>2]-v*t))>1.0e-06)break;if(!(+C(+(r-s*t))>1.0e-06))break k}while(0);do if(!(+C(+(u*t+q))>1.0e-06)){if(+C(+(v*t+ +g[w+(p<<4)+4>>2]))>1.0e-06)break;if(!(+C(+(s*t+r))>1.0e-06))break k}while(0);p=p+1|0;if((p|0)>=(h|0)){ba=367;break}}}else ba=367;while(0);if((ba|0)==367){ba=0;do if((h|0)==(c[X+52>>2]|0)){A=h|0?h<<1:1;if((h|0)>=(A|0))break;if(!A)w=0;else{c[6995]=(c[6995]|0)+1;h=sc((A<<4|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}w=h;h=c[X+48>>2]|0}if((h|0)>0){p=0;do{ka=w+(p<<4)|0;la=(c[X+56>>2]|0)+(p<<4)|0;c[ka>>2]=c[la>>2];c[ka+4>>2]=c[la+4>>2];c[ka+8>>2]=c[la+8>>2];c[ka+12>>2]=c[la+12>>2];p=p+1|0}while((p|0)!=(h|0))}h=c[X+56>>2]|0;if(h|0){if(a[X+60>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[X+56>>2]=0}a[X+60>>0]=1;c[X+56>>2]=w;c[X+52>>2]=A;h=c[X+48>>2]|0}while(0);la=c[X+56>>2]|0;g[la+(h<<4)>>2]=u*t;g[la+(h<<4)+4>>2]=v*t;g[la+(h<<4)+8>>2]=s*t;g[la+(h<<4)+12>>2]=0.0;c[X+48>>2]=(c[X+48>>2]|0)+1}l:do if(!J){J=((d&65535)<<16)+(Q<<16>>16)&N;m:do if(J>>>0>>0){h=c[k+(J<<2)>>2]|0;if((h|0)==-1)break;while(1){if(Q<<16>>16==(b[i+(h<<2)>>1]|0)?d<<16>>16==(b[i+(h<<2)+2>>1]|0):0)break;h=c[n+(h<<2)>>2]|0;if((h|0)==-1)break m}A=o+(h<<2)|0;b[A>>1]=T;b[A+2>>1]=T>>>16;A=K;J=S;w=P;h=z;p=M;break l}while(0);do if((S|0)==(P|0)){w=S|0?S<<1:1;if((S|0)>=(w|0)){w=S;break}do if(!w)p=0;else{c[6995]=(c[6995]|0)+1;h=sc((w<<2|3)+16|0)|0;if(!h){p=0;break}c[(h+4+15&-16)+-4>>2]=h;p=h+4+15&-16}while(0);if((S|0)<=0){if(!o){o=p;break}}else{h=0;do{la=p+(h<<2)|0;ka=o+(h<<2)|0;ka=e[ka>>1]|e[ka+2>>1]<<16;b[la>>1]=ka;b[la+2>>1]=ka>>>16;h=h+1|0}while((h|0)!=(S|0))}c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0);o=p}else w=P;while(0);N=o+(S<<2)|0;b[N>>1]=T;b[N+2>>1]=T>>>16;N=S+1|0;do if((G|0)==(x|0)){x=G|0?G<<1:1;if((G|0)>=(x|0)){x=G;break}do if(!x)h=0;else{c[6995]=(c[6995]|0)+1;h=sc((x<<2|3)+16|0)|0;if(!h){h=0;break}c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}while(0);if((G|0)<=0){if(!i){i=h;break}}else{p=0;do{la=h+(p<<2)|0;ka=i+(p<<2)|0;ka=e[ka>>1]|e[ka+2>>1]<<16;b[la>>1]=ka;b[la+2>>1]=ka>>>16;p=p+1|0}while((p|0)!=(G|0))}c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);i=h}while(0);la=i+(G<<2)|0;b[la>>1]=(d&65535)<<16|Q&65535;b[la+2>>1]=((d&65535)<<16|Q&65535)>>>16;G=G+1|0;if((P|0)<(w|0)){do if((I|0)<(w|0)){do if((z|0)<(w|0)){do if(!w)p=0;else{c[6995]=(c[6995]|0)+1;h=sc((w<<2|3)+16|0)|0;if(!h){p=0;break}c[(h+4+15&-16)+-4>>2]=h;p=h+4+15&-16}while(0);if((I|0)<=0){if(!k){k=p;J=w;M=p;break}}else{h=0;do{c[p+(h<<2)>>2]=c[k+(h<<2)>>2];h=h+1|0}while((h|0)!=(I|0))}c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0);k=p;J=w;M=p}else J=z;while(0);z=w<<2;Yk(k+(I<<2)|0,0,z-(I<<2)|0)|0;if((K|0)<(w|0)){do if((f|0)<(w|0)){do if(!w)p=0;else{c[6995]=(c[6995]|0)+1;h=sc((z|3)+16|0)|0;if(!h){p=0;break}c[(h+4+15&-16)+-4>>2]=h;p=h+4+15&-16}while(0);if((K|0)<=0){if(!n){f=w;n=p;h=p;break}}else{h=0;do{c[p+(h<<2)>>2]=c[n+(h<<2)>>2];h=h+1|0}while((h|0)!=(K|0))}c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0);f=w;n=p;h=p}else h=y;while(0);Yk(n+(K<<2)|0,0,z-(K<<2)|0)|0;y=h}if((w|0)>0){Yk(M|0,-1,z|0)|0;Yk(y|0,-1,z|0)|0}if((I|0)<=0){I=w;A=w;h=J;p=M;break}p=w+-1|0;h=0;do{la=k+(((e[i+(h<<2)+2>>1]<<16)+(b[i+(h<<2)>>1]|0)&p)<<2)|0;c[n+(h<<2)>>2]=c[la>>2];c[la>>2]=h;h=h+1|0}while((h|0)!=(I|0));I=w;A=w;h=J;p=M}else{A=K;h=z;p=M}while(0);J=((d&65535)<<16)+(Q<<16>>16)&w+-1}else{A=K;h=z;p=M}J=k+(J<<2)|0;c[n+(S<<2)>>2]=c[J>>2];c[J>>2]=S;J=N}else{b[J+2>>1]=U;A=K;J=S;w=P;h=z;p=M}while(0);if((R|0)>=(V|0))break;N=R;K=A;S=J;P=w;z=h;h=c[X+36>>2]|0;M=p}z=h;h=c[X+28>>2]|0}else A=K;W=W+1|0;if((W|0)>=(h|0))break;else K=A}if((h|0)>0){z=c[X+36>>2]|0;A=c[X+16>>2]|0;y=0;q=0.0;do{f=c[z+(y*36|0)+4>>2]|0;w=c[z+(y*36|0)+12>>2]|0;x=c[w>>2]|0;if((f+-2|0)>=1){p=1;r=+g[X+64>>2];s=+g[X+68>>2];t=+g[X+72>>2];do{ka=c[w+(p<<2)>>2]|0;p=p+1|0;la=c[w+(((p|0)%(f|0)|0)<<2)>>2]|0;u=+g[A+(x<<4)>>2];v=+g[A+(ka<<4)>>2];E=+g[A+(x<<4)+4>>2];F=+g[A+(ka<<4)+4>>2];L=+g[A+(x<<4)+8>>2];O=+g[A+(ka<<4)+8>>2];B=+g[A+(la<<4)>>2];H=+g[A+(la<<4)+4>>2];ia=+g[A+(la<<4)+8>>2];ja=+D(+(((u-v)*(E-H)-(E-F)*(u-B))*((u-v)*(E-H)-(E-F)*(u-B))+(((E-F)*(L-ia)-(L-O)*(E-H))*((E-F)*(L-ia)-(L-O)*(E-H))+((L-O)*(u-B)-(u-v)*(L-ia))*((L-O)*(u-B)-(u-v)*(L-ia)))))*.5;r=r+(u+v+B)*.3333333432674408*ja;g[X+64>>2]=r;s=(E+F+H)*.3333333432674408*ja+s;g[X+68>>2]=s;t=ja*(L+O+ia)*.3333333432674408+t;g[X+72>>2]=t;q=q+ja}while((p|0)!=(f+-1|0))}y=y+1|0}while((y|0)!=(h|0));p=X+64|0;w=i;f=k;i=1}else ba=346}else{i=0;k=0;n=0;o=0;ba=346}if((ba|0)==346){q=0.0;p=X+64|0;w=i;f=k;i=0}t=1.0/q;u=t*+g[p>>2];g[p>>2]=u;s=t*+g[X+68>>2];g[X+68>>2]=s;t=t*+g[X+72>>2];g[X+72>>2]=t;g[X+96>>2]=3402823466385288598117041.0e14;if(i){k=c[X+36>>2]|0;i=0;r=3402823466385288598117041.0e14;while(1){q=+C(+(+g[k+(i*36|0)+32>>2]+(+g[k+(i*36|0)+20>>2]*u+ +g[k+(i*36|0)+24>>2]*s+ +g[k+(i*36|0)+28>>2]*t)));if(q>2]=q;else q=r;i=i+1|0;if((i|0)>=(h|0)){B=q;break}else r=q}}else B=3402823466385288598117041.0e14;i=c[X+8>>2]|0;if((i|0)>0){k=c[X+16>>2]|0;h=0;u=-3402823466385288598117041.0e14;v=-3402823466385288598117041.0e14;t=-3402823466385288598117041.0e14;s=3402823466385288598117041.0e14;r=3402823466385288598117041.0e14;q=3402823466385288598117041.0e14;do{ja=+g[k+(h<<4)>>2];q=jat?ja:t;ja=+g[k+(h<<4)+4>>2];r=jav?ja:v;ja=+g[k+(h<<4)+8>>2];s=jau?ja:u;h=h+1|0}while((h|0)!=(i|0))}else{u=-3402823466385288598117041.0e14;v=-3402823466385288598117041.0e14;t=-3402823466385288598117041.0e14;s=3402823466385288598117041.0e14;r=3402823466385288598117041.0e14;q=3402823466385288598117041.0e14}g[X+100>>2]=q+t;g[X+104>>2]=r+v;g[X+108>>2]=s+u;g[X+112>>2]=0.0;ja=t-q;q=v-r;r=u-s;g[X+116>>2]=ja;g[X+120>>2]=q;g[X+124>>2]=r;g[X+128>>2]=0.0;s=B/1.7320507764816284;p=+g[X+116+((ja>2]>2]*.5-s)*.0009765625;g[X+88>>2]=s;g[X+84>>2]=s;g[X+80>>2]=s;r=+g[X+116+(p<<2)>>2]*.5;g[X+80+(p<<2)>>2]=r;h=0;while(1){if(dh(X)|0){ba=452;break}r=r-q;g[X+80+(p<<2)>>2]=r;h=h+1|0;if((h|0)>=1024){ba=451;break}}n:do if((ba|0)==451){g[X+88>>2]=s;g[X+84>>2]=s;g[X+80>>2]=s}else if((ba|0)==452){q=(+g[X+96>>2]-s)*.0009765625;h=0;k=c[X+80+((1<<(1<>2]|0;while(1){i=c[X+80+((1<>2]|0;g[X+80+((1<>2]=q+(c[j>>2]=i,+g[j>>2]);r=q+ +g[X+80+((1<<(1<>2];g[X+80+((1<<(1<>2]=r;h=h+1|0;if(!(dh(X)|0))break;if((h|0)>=1024)break n;else k=(g[j>>2]=r,c[j>>2]|0)}c[X+80+((1<>2]=i;c[X+80+((1<<(1<>2]=k}while(0);if(w|0){c[6996]=(c[6996]|0)+1;Cd(c[w+-4>>2]|0)}if(o|0){c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0)}if(n|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}if(f|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}if(!((m|0)==0|(Y|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[Y+-4>>2]|0)}o=c[Z>>2]|0;p=c[$>>2]|0;if((o|0)<=0){if(p|0)ba=473}else{h=0;do{k=p+(h*36|0)+4|0;m=p+(h*36|0)+12|0;n=c[m>>2]|0;i=p+(h*36|0)+16|0;if(n|0){if(a[i>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}c[m>>2]=0}a[i>>0]=1;c[m>>2]=0;c[k>>2]=0;c[p+(h*36|0)+8>>2]=0;h=h+1|0}while((h|0)!=(o|0));ba=473}if((ba|0)==473){if(a[ha+56+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[p+-4>>2]|0)}c[$>>2]=0}if(!((aa|0)==0|(_|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[_+-4>>2]|0)}h=c[da>>2]|0;if(h|0){if(a[ha+76+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[da>>2]=0}a[ha+76+56>>0]=1;c[da>>2]=0;c[ha+76+44>>2]=0;c[ha+76+48>>2]=0;h=c[ea>>2]|0;if(h|0){if(a[ha+76+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[ea>>2]=0}a[ha+76+36>>0]=1;c[ea>>2]=0;c[ha+76+24>>2]=0;c[ha+76+28>>2]=0;h=c[fa>>2]|0;if(h|0){if(a[ha+76+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[fa>>2]=0}if(!ga){l=ha;return 1}c[6996]=(c[6996]|0)+1;Cd(c[ga+-4>>2]|0);l=ha;return 1}function ec(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var i=0.0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0,M=0,N=0,O=0,P=0.0,Q=0.0,R=0.0,S=0,T=0.0,U=0.0,V=0.0,W=0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0,ja=0,ka=0.0,la=0.0,ma=0.0,na=0,oa=0.0,pa=0,qa=0,ra=0,sa=0,ta=0;ta=l;l=l+1072|0;j=c[b+56>>2]|0;if(!j){j=c[b+4>>2]|0;j=Bb[c[(c[j>>2]|0)+12>>2]&63](j,c[d+8>>2]|0,c[e+8>>2]|0)|0;c[b+56>>2]=j;a[b+52>>0]=1}c[h+4>>2]=j;ra=c[d+4>>2]|0;pa=c[e+4>>2]|0;a:do switch(c[ra+4>>2]|0){case 10:switch(c[pa+4>>2]|0){case 10:{oa=+g[j+784>>2];sa=c[ra+56>>2]|0;b=c[pa+56>>2]|0;i=+fg(ta+640|0,ta+624|0,+g[ra+32+(sa<<2)>>2],+g[ra+32+(((sa+2|0)%3|0)<<2)>>2],+g[pa+32+(b<<2)>>2],+g[pa+32+(((b+2|0)%3|0)<<2)>>2],sa,b,c[d+12>>2]|0,c[e+12>>2]|0,oa);if(i>2]|0)+16>>2]&15](h,ta+640|0,ta+624|0,i);k=c[h+4>>2]|0;if(!(c[k+780>>2]|0)){l=ta;return}m=c[k+772>>2]|0;n=c[(c[h+8>>2]|0)+8>>2]|0;j=c[(c[h+12>>2]|0)+8>>2]|0;if((m|0)==(n|0)){af(k,m+4|0,j+4|0);l=ta;return}else{af(k,j+4|0,n+4|0);l=ta;return}}case 8:{oa=+g[j+784>>2];b=c[ra+56>>2]|0;i=+fg(ta+640|0,ta+624|0,+g[ra+32+(b<<2)>>2],+g[ra+32+(((b+2|0)%3|0)<<2)>>2],0.0,+g[pa+32>>2]*+g[pa+16>>2],b,1,c[d+12>>2]|0,c[e+12>>2]|0,oa);if(i>2]|0)+16>>2]&15](h,ta+640|0,ta+624|0,i);k=c[h+4>>2]|0;if(!(c[k+780>>2]|0)){l=ta;return}m=c[k+772>>2]|0;n=c[(c[h+8>>2]|0)+8>>2]|0;j=c[(c[h+12>>2]|0)+8>>2]|0;if((m|0)==(n|0)){af(k,m+4|0,j+4|0);l=ta;return}else{af(k,j+4|0,n+4|0);l=ta;return}}default:{m=pa+4|0;break a}}case 8:{if((c[pa+4>>2]|0)==10){oa=+g[j+784>>2];b=c[pa+56>>2]|0;i=+fg(ta+640|0,ta+624|0,0.0,+g[ra+32>>2]*+g[ra+16>>2],+g[pa+32+(b<<2)>>2],+g[pa+32+(((b+2|0)%3|0)<<2)>>2],1,b,c[d+12>>2]|0,c[e+12>>2]|0,oa);if(i>2]|0)+16>>2]&15](h,ta+640|0,ta+624|0,i);k=c[h+4>>2]|0;if(!(c[k+780>>2]|0)){l=ta;return}m=c[k+772>>2]|0;n=c[(c[h+8>>2]|0)+8>>2]|0;j=c[(c[h+12>>2]|0)+8>>2]|0;if((m|0)==(n|0)){af(k,m+4|0,j+4|0);l=ta;return}else{af(k,j+4|0,n+4|0);l=ta;return}}else m=pa+4|0;break}default:m=pa+4|0}while(0);g[ta+488+128>>2]=999999984306749440.0;g[ta+128+308>>2]=9.999999747378752e-05;a[ta+128+332>>0]=0;j=c[b+8>>2]|0;c[ta+48>>2]=9552;c[ta+48+4>>2]=0;c[ta+48+8>>2]=1065353216;c[ta+48+12>>2]=0;g[ta+48+16>>2]=0.0;c[ta+48+20>>2]=j;c[ta+48+24>>2]=ta+128;c[ta+48+28>>2]=ra;c[ta+48+32>>2]=pa;c[ta+48+36>>2]=c[ra+4>>2];c[ta+48+40>>2]=c[m>>2];g[ta+48+44>>2]=+nb[c[(c[ra>>2]|0)+48>>2]&15](ra);g[ta+48+48>>2]=+nb[c[(c[pa>>2]|0)+48>>2]&15](pa);a[ta+48+52>>0]=0;c[ta+48+60>>2]=-1;c[ta+48+72>>2]=1;c[ta+48+76>>2]=1;c[ta+48+28>>2]=ra;c[ta+48+32>>2]=pa;ma=+nb[c[(c[ra>>2]|0)+48>>2]&15](ra);oa=+nb[c[(c[pa>>2]|0)+48>>2]&15](pa);oa=ma+oa+ +g[(c[b+56>>2]|0)+784>>2]+ +g[h+32>>2];g[ta+488+128>>2]=oa*oa;j=c[d+12>>2]|0;c[ta+488>>2]=c[j>>2];c[ta+488+4>>2]=c[j+4>>2];c[ta+488+8>>2]=c[j+8>>2];c[ta+488+12>>2]=c[j+12>>2];n=ta+488+16|0;c[n>>2]=c[j+16>>2];c[n+4>>2]=c[j+16+4>>2];c[n+8>>2]=c[j+16+8>>2];c[n+12>>2]=c[j+16+12>>2];s=ta+488+32|0;c[s>>2]=c[j+32>>2];c[s+4>>2]=c[j+32+4>>2];c[s+8>>2]=c[j+32+8>>2];c[s+12>>2]=c[j+32+12>>2];t=ta+488+48|0;c[t>>2]=c[j+48>>2];c[t+4>>2]=c[j+48+4>>2];c[t+8>>2]=c[j+48+8>>2];c[t+12>>2]=c[j+48+12>>2];j=c[e+12>>2]|0;u=ta+488+64|0;c[u>>2]=c[j>>2];c[u+4>>2]=c[j+4>>2];c[u+8>>2]=c[j+8>>2];c[u+12>>2]=c[j+12>>2];L=ta+488+80|0;c[L>>2]=c[j+16>>2];c[L+4>>2]=c[j+16+4>>2];c[L+8>>2]=c[j+16+8>>2];c[L+12>>2]=c[j+16+12>>2];M=ta+488+96|0;c[M>>2]=c[j+32>>2];c[M+4>>2]=c[j+32+4>>2];c[M+8>>2]=c[j+32+8>>2];c[M+12>>2]=c[j+32+12>>2];N=ta+488+112|0;c[N>>2]=c[j+48>>2];c[N+4>>2]=c[j+48+4>>2];c[N+8>>2]=c[j+48+8>>2];c[N+12>>2]=c[j+48+12>>2];j=c[ra+4>>2]|0;if((j|0)<7?(k=c[m>>2]|0,(k|0)<7):0){c[ta+40>>2]=6428;if(!j){j=k;o=0.0}else{o=+nb[c[(c[ra>>2]|0)+48>>2]&15](ra);j=c[m>>2]|0}if(!j)i=0.0;else i=+nb[c[(c[pa>>2]|0)+48>>2]&15](pa);c[ta>>2]=6456;c[ta+4>>2]=h;g[ta+24>>2]=o;g[ta+28>>2]=i;a[ta+36>>0]=0;ia=c[ra+56>>2]|0;b:do if(ia|0){ja=c[pa+56>>2]|0;do if(!ja){if((c[m>>2]|0)!=1)break b;t=ta+1e3+16|0;a[t>>0]=1;u=ta+1e3+12|0;c[u>>2]=0;s=ta+1e3+4|0;c[s>>2]=0;n=ta+1e3+8|0;c[n>>2]=0;j=c[e+12>>2]|0;ma=+g[pa+60>>2];oa=+g[pa+60+4>>2];p=+g[pa+60+8>>2];i=ma*+g[j>>2]+oa*+g[j+4>>2]+p*+g[j+8>>2]+ +g[j+48>>2];o=ma*+g[j+16>>2]+oa*+g[j+20>>2]+p*+g[j+24>>2]+ +g[j+52>>2];p=ma*+g[j+32>>2]+oa*+g[j+36>>2]+p*+g[j+40>>2]+ +g[j+56>>2];c[6995]=(c[6995]|0)+1;j=sc(35)|0;if(!j)k=0;else{c[(j+4+15&-16)+-4>>2]=j;k=j+4+15&-16}j=c[u>>2]|0;if(!j)j=0;else{c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);j=c[s>>2]|0;c[u>>2]=0}a[t>>0]=1;c[u>>2]=k;c[n>>2]=1;g[k+(j<<4)>>2]=i;g[k+(j<<4)+4>>2]=o;g[k+(j<<4)+8>>2]=p;g[k+(j<<4)+12>>2]=0.0;j=(c[s>>2]|0)+1|0;c[s>>2]=j;sa=c[e+12>>2]|0;ma=+g[pa+60+16>>2];oa=+g[pa+60+20>>2];p=+g[pa+60+24>>2];i=ma*+g[sa>>2]+oa*+g[sa+4>>2]+p*+g[sa+8>>2]+ +g[sa+48>>2];o=ma*+g[sa+16>>2]+oa*+g[sa+20>>2]+p*+g[sa+24>>2]+ +g[sa+52>>2];p=ma*+g[sa+32>>2]+oa*+g[sa+36>>2]+p*+g[sa+40>>2]+ +g[sa+56>>2];if((j|0)==(c[n>>2]|0)?(O=j|0?j<<1:1,(j|0)<(O|0)):0){if(!O)m=0;else{c[6995]=(c[6995]|0)+1;j=sc((O<<4|3)+16|0)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}m=j;j=c[s>>2]|0}if((j|0)>0){k=0;do{sa=m+(k<<4)|0;qa=(c[u>>2]|0)+(k<<4)|0;c[sa>>2]=c[qa>>2];c[sa+4>>2]=c[qa+4>>2];c[sa+8>>2]=c[qa+8>>2];c[sa+12>>2]=c[qa+12>>2];k=k+1|0}while((k|0)!=(j|0))}j=c[u>>2]|0;if(j|0){if(a[t>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[u>>2]=0}a[t>>0]=1;c[u>>2]=m;c[n>>2]=O;j=c[s>>2]|0}sa=c[u>>2]|0;g[sa+(j<<4)>>2]=i;g[sa+(j<<4)+4>>2]=o;g[sa+(j<<4)+8>>2]=p;g[sa+(j<<4)+12>>2]=0.0;j=(c[s>>2]|0)+1|0;c[s>>2]=j;e=c[e+12>>2]|0;ma=+g[pa+60+32>>2];oa=+g[pa+60+36>>2];p=+g[pa+60+40>>2];i=ma*+g[e>>2]+oa*+g[e+4>>2]+p*+g[e+8>>2]+ +g[e+48>>2];o=ma*+g[e+16>>2]+oa*+g[e+20>>2]+p*+g[e+24>>2]+ +g[e+52>>2];p=ma*+g[e+32>>2]+oa*+g[e+36>>2]+p*+g[e+40>>2]+ +g[e+56>>2];if((j|0)==(c[n>>2]|0)?(S=j|0?j<<1:1,(j|0)<(S|0)):0){if(!S)m=0;else{c[6995]=(c[6995]|0)+1;j=sc((S<<4|3)+16|0)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}m=j;j=c[s>>2]|0}if((j|0)>0){k=0;do{e=m+(k<<4)|0;sa=(c[u>>2]|0)+(k<<4)|0;c[e>>2]=c[sa>>2];c[e+4>>2]=c[sa+4>>2];c[e+8>>2]=c[sa+8>>2];c[e+12>>2]=c[sa+12>>2];k=k+1|0}while((k|0)!=(j|0))}j=c[u>>2]|0;if(j|0){if(a[t>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[u>>2]=0}a[t>>0]=1;c[u>>2]=m;c[n>>2]=S;j=c[s>>2]|0}e=c[u>>2]|0;g[e+(j<<4)>>2]=i;g[e+(j<<4)+4>>2]=o;g[e+(j<<4)+8>>2]=p;g[e+(j<<4)+12>>2]=0.0;c[s>>2]=(c[s>>2]|0)+1;q=+g[(c[b+56>>2]|0)+784>>2];Dc(ta+48|0,ta+488|0,ta+40|0,c[f+20>>2]|0,0);i=+g[ta+48+4>>2];o=+g[ta+48+8>>2];p=+g[ta+48+12>>2];if(i*i+o*o+p*p>1.1920928955078125e-07){oa=1.0/(i*i+o*o+p*p);g[ta+760>>2]=i*oa;g[ta+760+4>>2]=o*oa;g[ta+760+8>>2]=p*oa;g[ta+760+12>>2]=0.0;oa=+g[ta+48+56>>2];i=+nb[c[(c[ra>>2]|0)+48>>2]&15](ra);i=oa-i-+nb[c[(c[pa>>2]|0)+48>>2]&15](pa);j=c[b+36>>2]|0;if((j|0)<0){if((c[b+40>>2]|0)<0){k=c[b+44>>2]|0;if(k|0){if(a[b+48>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[b+44>>2]=0}a[b+48>>0]=1;c[b+44>>2]=0;c[b+40>>2]=0}do{e=(c[b+44>>2]|0)+(j<<4)|0;c[e>>2]=c[ta+744>>2];c[e+4>>2]=c[ta+744+4>>2];c[e+8>>2]=c[ta+744+8>>2];c[e+12>>2]=c[ta+744+12>>2];j=j+1|0}while((j|0)!=0)}c[b+36>>2]=0;Mc(ta+760|0,c[ra+56>>2]|0,c[d+12>>2]|0,ta+1e3|0,b+32|0,i-q,q,h)}do if(a[b+52>>0]|0?(W=c[h+4>>2]|0,c[W+780>>2]|0):0){k=c[W+772>>2]|0;m=c[(c[h+8>>2]|0)+8>>2]|0;j=c[(c[h+12>>2]|0)+8>>2]|0;if((k|0)==(m|0)){af(W,k+4|0,j+4|0);break}else{af(W,j+4|0,m+4|0);break}}while(0);j=c[u>>2]|0;if(j|0){if(a[t>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[u>>2]=0}}else{oa=+g[(c[b+56>>2]|0)+784>>2];c:do if(!(a[f+24>>0]|0)){Dc(ta+48|0,ta+488|0,ta,c[f+20>>2]|0,0);i=+g[ta+32>>2];if(i<0.0&(a[ta+36>>0]|0)!=0){o=+g[ta+8>>2];p=+g[ta+12>>2];q=+g[ta+16>>2];m=c[ta+20>>2]|0;na=107}}else{u=c[d+12>>2]|0;L=c[e+12>>2]|0;c[6411]=(c[6411]|0)+1;da=+g[ia+64>>2];ea=+g[ia+68>>2];r=+g[u+4>>2];fa=+g[ia+72>>2];v=+g[u+8>>2];x=+g[u+16>>2];z=+g[u+20>>2];B=+g[u+24>>2];E=+g[u+32>>2];A=+g[u+36>>2];y=+g[u+40>>2];ga=+g[ja+64>>2];ha=+g[ja+68>>2];ma=+g[ja+72>>2];ka=da*+g[u>>2]+ea*r+fa*v+ +g[u+48>>2]-(ga*+g[L>>2]+ha*+g[L+4>>2]+ma*+g[L+8>>2]+ +g[L+48>>2]);la=da*x+ea*z+fa*B+ +g[u+52>>2]-(ga*+g[L+16>>2]+ha*+g[L+20>>2]+ma*+g[L+24>>2]+ +g[L+52>>2]);ma=da*E+ea*A+fa*y+ +g[u+56>>2]-(ga*+g[L+32>>2]+ha*+g[L+36>>2]+ma*+g[L+40>>2]+ +g[L+56>>2]);m=c[ia+28>>2]|0;d:do if((m|0)>0){i=3402823466385288598117041.0e14;j=0;w=0.0;o=0.0;p=0.0;q=0.0;H=x;while(1){f=c[ia+36>>2]|0;fa=+g[f+(j*36|0)+20>>2];ga=+g[f+(j*36|0)+24>>2];ha=+g[f+(j*36|0)+28>>2];x=fa*+g[u>>2]+ga*r+ha*v;v=fa*H+ga*z+ha*B;r=fa*E+ga*A+ha*y;g[ta+656>>2]=x;g[ta+656+4>>2]=v;g[ta+656+8>>2]=r;g[ta+656+12>>2]=0.0;if(ka*x+la*v+ma*r<0.0){g[ta+656>>2]=-x;g[ta+656+4>>2]=-v;g[ta+656+8>>2]=-r;B=-x;v=-v;r=-r}else B=x;c[6409]=(c[6409]|0)+1;if(Ii(u,L,ka,la,ma,B,v,r,ia,ja,i)|0){c[6410]=(c[6410]|0)+1;bh(ia,u,ta+656|0,ta+1e3|0,ta+760|0,ta+720|0,ta+704|0);bh(ja,L,ta+656|0,ta+744|0,ta+736|0,ta+688|0,ta+672|0);x=+g[ta+760>>2];y=+g[ta+744>>2];do if(x>2];A=+g[ta+1e3>>2];if(z=(m|0))break d;r=+g[u+4>>2];v=+g[u+8>>2];H=+g[u+16>>2];z=+g[u+20>>2];B=+g[u+24>>2];E=+g[u+32>>2];A=+g[u+36>>2];y=+g[u+40>>2]}break c}else{i=3402823466385288598117041.0e14;o=0.0;p=0.0;q=0.0}while(0);m=c[ja+28>>2]|0;e:do if((m|0)>0){k=0;x=0.0;while(1){f=c[ja+36>>2]|0;ga=+g[f+(k*36|0)+20>>2];ha=+g[f+(k*36|0)+24>>2];w=+g[f+(k*36|0)+28>>2];r=ga*+g[L>>2]+ha*+g[L+4>>2]+w*+g[L+8>>2];v=ga*+g[L+16>>2]+ha*+g[L+20>>2]+w*+g[L+24>>2];w=ga*+g[L+32>>2]+ha*+g[L+36>>2]+w*+g[L+40>>2];g[ta+656>>2]=r;g[ta+656+4>>2]=v;g[ta+656+8>>2]=w;g[ta+656+12>>2]=0.0;if(ka*r+la*v+ma*w<0.0){g[ta+656>>2]=-r;g[ta+656+4>>2]=-v;g[ta+656+8>>2]=-w;r=-r;v=-v;w=-w}c[6409]=(c[6409]|0)+1;if(Ii(u,L,ka,la,ma,r,v,w,ia,ja,i)|0){c[6410]=(c[6410]|0)+1;bh(ia,u,ta+656|0,ta+1e3|0,ta+760|0,ta+720|0,ta+704|0);bh(ja,L,ta+656|0,ta+744|0,ta+736|0,ta+688|0,ta+672|0);y=+g[ta+760>>2];z=+g[ta+744>>2];do if(y>2];B=+g[ta+1e3>>2];if(A=(m|0))break e}break c}while(0);j=c[ia+48>>2]|0;f:do if((j|0)>0){t=0;k=-1;n=-1;w=0.0;z=0.0;K=0.0;y=0.0;J=0.0;H=0.0;I=0.0;x=0.0;A=0.0;B=0.0;v=0.0;r=0.0;E=0.0;V=0.0;U=0.0;T=0.0;R=0.0;Q=0.0;P=0.0;m=c[ja+48>>2]|0;g:while(1){f=c[ia+56>>2]|0;da=+g[f+(t<<4)>>2];ea=+g[f+(t<<4)+4>>2];ha=+g[f+(t<<4)+8>>2];fa=da*+g[u>>2]+ea*+g[u+4>>2]+ha*+g[u+8>>2];ga=da*+g[u+16>>2]+ea*+g[u+20>>2]+ha*+g[u+24>>2];ha=da*+g[u+32>>2]+ea*+g[u+36>>2]+ha*+g[u+40>>2];if((m|0)>0){s=0;ba=w;ea=o;da=p;ca=q;aa=x;$=A;_=B;Z=E;while(1){f=c[ja+56>>2]|0;A=+g[f+(s<<4)>>2];B=+g[f+(s<<4)+4>>2];Y=+g[f+(s<<4)+8>>2];E=A*+g[L>>2]+B*+g[L+4>>2]+Y*+g[L+8>>2];X=A*+g[L+16>>2]+B*+g[L+20>>2]+Y*+g[L+24>>2];Y=A*+g[L+32>>2]+B*+g[L+36>>2]+Y*+g[L+40>>2];g[ta+656>>2]=ga*Y-ha*X;g[ta+656+4>>2]=ha*E-fa*Y;g[ta+656+8>>2]=fa*X-ga*E;g[ta+656+12>>2]=0.0;do if(!(+C(+(ga*Y-ha*X))>1.0e-06)){if(+C(+(ha*E-fa*Y))>1.0e-06){na=71;break}if(!(+C(+(fa*X-ga*E))>1.0e-06)){w=ba;o=ea;p=da;q=ca;E=Z;B=_;A=$;x=aa}else na=71}else na=71;while(0);do if((na|0)==71){na=0;q=1.0/+D(+((ga*Y-ha*X)*(ga*Y-ha*X)+(ha*E-fa*Y)*(ha*E-fa*Y)+(fa*X-ga*E)*(fa*X-ga*E)));o=(ga*Y-ha*X)*q;g[ta+656>>2]=o;p=(ha*E-fa*Y)*q;g[ta+656+4>>2]=p;q=(fa*X-ga*E)*q;g[ta+656+8>>2]=q;if(o*ka+p*la+ma*q<0.0){g[ta+656>>2]=-o;g[ta+656+4>>2]=-p;g[ta+656+8>>2]=-q;o=-o;p=-p;q=-q}c[6409]=(c[6409]|0)+1;if(!(Ii(u,L,ka,la,ma,o,p,q,ia,ja,i)|0)){w=ba;o=ea;p=da;q=ca;E=Z;B=_;A=$;x=aa;break}c[6410]=(c[6410]|0)+1;bh(ia,u,ta+656|0,ta+1e3|0,ta+760|0,ta+720|0,ta+704|0);bh(ja,L,ta+656|0,ta+744|0,ta+736|0,ta+688|0,ta+672|0);w=+g[ta+760>>2];x=+g[ta+744>>2];do if(!(w>2];B=+g[ta+1e3>>2];if(A>2];U=+g[ta+688+4>>2];V=+g[ta+688+8>>2];B=+g[ta+704>>2];A=+g[ta+704+4>>2];x=+g[ta+704+8>>2];break}else{j=1;w=A-B;T=+g[ta+672>>2];U=+g[ta+672+4>>2];V=+g[ta+672+8>>2];B=+g[ta+720>>2];A=+g[ta+720+4>>2];x=+g[ta+720+8>>2];break}}else{j=0;w=ba;B=_;A=$;x=aa}while(0);if(!j)break g;if(!(w>2]|0;if((s|0)>=(m|0))break;else{ba=w;ea=o;da=p;ca=q;aa=x;$=A;_=B;Z=E}}j=c[ia+48>>2]|0}t=t+1|0;if((t|0)>=(j|0)){j=n;i=E;break f}}break c}else{k=-1;j=-1;v=0.0;r=0.0;i=0.0;R=0.0;Q=0.0;P=0.0;z=0.0;K=0.0;y=0.0;J=0.0;H=0.0;I=0.0}while(0);if((k|j|0)>-1){A=P-i;B=Q-r;E=R-v;w=z*K+y*J+H*I;x=A*K+B*J+E*I;r=A*z+B*y+E*H;if(!(1.0-w*w==0.0))if(!((x-r*w)/(1.0-w*w)<-1000000015047466219876688.0e6))if((x-r*w)/(1.0-w*w)>1000000015047466219876688.0e6){i=1000000015047466219876688.0e6;na=90}else v=(x-r*w)/(1.0-w*w);else{i=-1000000015047466219876688.0e6;na=90}else{i=0.0;na=90}if((na|0)==90)v=i;i=w*v-r;do if(i<-1000000015047466219876688.0e6){if(x-w*1000000015047466219876688.0e6<-1000000015047466219876688.0e6){i=-1000000015047466219876688.0e6;r=-1000000015047466219876688.0e6;break}if(!(x-w*1000000015047466219876688.0e6>1000000015047466219876688.0e6)){i=-1000000015047466219876688.0e6;r=x-w*1000000015047466219876688.0e6;break}i=-1000000015047466219876688.0e6;r=1000000015047466219876688.0e6}else{if(!(i>1000000015047466219876688.0e6)){r=v;break}if(x+w*1000000015047466219876688.0e6<-1000000015047466219876688.0e6){i=1000000015047466219876688.0e6;r=-1000000015047466219876688.0e6;break}if(!(x+w*1000000015047466219876688.0e6>1000000015047466219876688.0e6)){i=1000000015047466219876688.0e6;r=x+w*1000000015047466219876688.0e6;break}i=1000000015047466219876688.0e6;r=1000000015047466219876688.0e6}while(0);z=z*i;y=y*i;x=H*i;w=z+(A-K*r);v=y+(B-J*r);i=x+(E-I*r);g[ta+1e3>>2]=w;g[ta+1e3+4>>2]=v;g[ta+1e3+8>>2]=i;g[ta+1e3+12>>2]=0.0;if(w*w+v*v+i*i>1.1920928955078125e-07){r=+D(+(w*w+v*v+i*i));g[ta+1e3>>2]=w*(1.0/r);g[ta+1e3+4>>2]=1.0/r*v;g[ta+1e3+8>>2]=1.0/r*i;if(w*(1.0/r)*ka+1.0/r*v*la+1.0/r*i*ma<0.0){g[ta+1e3>>2]=-(w*(1.0/r));g[ta+1e3+4>>2]=-(1.0/r*v);g[ta+1e3+8>>2]=-(1.0/r*i)}g[ta+760>>2]=P+z;g[ta+760+4>>2]=Q+y;g[ta+760+8>>2]=R+x;g[ta+760+12>>2]=0.0;Tb[c[(c[h>>2]|0)+16>>2]&15](h,ta+1e3|0,ta+760|0,-r)}}if(ka*o+la*p+ma*q<0.0){i=-1000000015047466219876688.0e6;o=-o;p=-p;q=-q;m=0;na=107}else{i=-1000000015047466219876688.0e6;m=0;na=107}}while(0);if((na|0)==107){j=c[b+16>>2]|0;if((j|0)<0){if((c[b+20>>2]|0)<0){k=c[b+24>>2]|0;if(k|0){if(a[b+28>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[b+24>>2]=0}a[b+28>>0]=1;c[b+24>>2]=0;c[b+20>>2]=0}do{na=(c[b+24>>2]|0)+(j<<4)|0;c[na>>2]=c[ta+1e3>>2];c[na+4>>2]=c[ta+1e3+4>>2];c[na+8>>2]=c[ta+1e3+8>>2];c[na+12>>2]=c[ta+1e3+12>>2];j=j+1|0}while((j|0)!=0)}c[b+16>>2]=0;O=c[ra+56>>2]|0;N=c[pa+56>>2]|0;M=c[d+12>>2]|0;L=c[e+12>>2]|0;K=i-oa;H=1.0/+D(+(o*o+p*p+q*q));J=o*H;I=p*H;H=q*H;g[ta+1e3>>2]=J;g[ta+1e3+4>>2]=I;g[ta+1e3+8>>2]=H;c[ta+1e3+12>>2]=m;k=c[N+28>>2]|0;if((k|0)>0){m=c[N+36>>2]|0;o=+g[L>>2];p=+g[L+4>>2];q=+g[L+8>>2];r=+g[L+16>>2];v=+g[L+20>>2];w=+g[L+24>>2];x=+g[L+32>>2];y=+g[L+36>>2];z=+g[L+40>>2];i=-3402823466385288598117041.0e14;j=0;t=-1;while(1){A=+g[m+(j*36|0)+20>>2];B=+g[m+(j*36|0)+24>>2];E=+g[m+(j*36|0)+28>>2];n=(A*o+B*p+E*q)*J+(A*r+B*v+E*w)*I+(A*x+B*y+E*z)*H>i;t=n?j:t;j=j+1|0;if((j|0)==(k|0))break;else i=n?(A*o+B*p+E*q)*J+(A*r+B*v+E*w)*I+(A*x+B*y+E*z)*H:i}}else t=-1;j=c[N+36>>2]|0;c[b+16>>2]=0;u=c[j+(t*36|0)+4>>2]|0;if((u|0)>0){s=j+(t*36|0)+12|0;n=0;k=0;do{d=c[(c[s>>2]|0)+(n<<2)>>2]|0;e=c[N+16>>2]|0;la=+g[e+(d<<4)>>2];ma=+g[e+(d<<4)+4>>2];p=+g[e+(d<<4)+8>>2];i=la*+g[L>>2]+ma*+g[L+4>>2]+p*+g[L+8>>2]+ +g[L+48>>2];o=la*+g[L+16>>2]+ma*+g[L+20>>2]+p*+g[L+24>>2]+ +g[L+52>>2];p=la*+g[L+32>>2]+ma*+g[L+36>>2]+p*+g[L+40>>2]+ +g[L+56>>2];if((k|0)==(c[b+20>>2]|0)?(qa=k|0?k<<1:1,(k|0)<(qa|0)):0){if(!qa)j=0;else{c[6995]=(c[6995]|0)+1;j=sc((qa<<4|3)+16|0)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}k=c[b+16>>2]|0}if((k|0)>0){m=0;do{d=j+(m<<4)|0;e=(c[b+24>>2]|0)+(m<<4)|0;c[d>>2]=c[e>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];c[d+12>>2]=c[e+12>>2];m=m+1|0}while((m|0)!=(k|0))}k=c[b+24>>2]|0;if(k|0){if(a[b+28>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[b+24>>2]=0}a[b+28>>0]=1;c[b+24>>2]=j;c[b+20>>2]=qa;j=c[b+16>>2]|0}else j=k;k=c[b+24>>2]|0;g[k+(j<<4)>>2]=i;g[k+(j<<4)+4>>2]=o;g[k+(j<<4)+8>>2]=p;g[k+(j<<4)+12>>2]=0.0;k=(c[b+16>>2]|0)+1|0;c[b+16>>2]=k;n=n+1|0}while((n|0)!=(u|0))}if((t|0)>-1)Mc(ta+1e3|0,O,M,b+12|0,b+32|0,K,oa,h)}if(a[b+52>>0]|0?(sa=c[h+4>>2]|0,c[sa+780>>2]|0):0){k=c[sa+772>>2]|0;m=c[(c[h+8>>2]|0)+8>>2]|0;j=c[(c[h+12>>2]|0)+8>>2]|0;if((k|0)==(m|0)){af(sa,k+4|0,j+4|0);break}else{af(sa,j+4|0,m+4|0);break}}}while(0);l=ta;return}while(0)}Dc(ta+48|0,ta+488|0,h,c[f+20>>2]|0,0);if((c[b+64>>2]|0?(c[(c[h+4>>2]|0)+780>>2]|0)<(c[b+68>>2]|0):0)?(K=+g[ta+48+4>>2],P=+g[ta+48+8>>2],Q=+g[ta+48+12>>2],K*K+P*P+Q*Q>1.1920928955078125e-07):0){J=1.0/(K*K+P*P+Q*Q);if(+C(+(Q*J))>.7071067690849304){I=1.0/+D(+(Q*J*Q*J+P*J*P*J));E=0.0;H=P*J*I;I=-(Q*J*I)}else{I=1.0/+D(+(K*J*K*J+P*J*P*J));E=-(P*J*I);H=0.0;I=K*J*I}B=+nb[c[(c[ra>>2]|0)+16>>2]&15](ra);z=+nb[c[(c[pa>>2]|0)+16>>2]&15](pa);i=.019999999552965164/(B>2]=c[ta+488>>2];c[ta+1e3+4>>2]=c[ta+488+4>>2];c[ta+1e3+8>>2]=c[ta+488+8>>2];c[ta+1e3+12>>2]=c[ta+488+12>>2];c[ta+1e3+16>>2]=c[n>>2];c[ta+1e3+16+4>>2]=c[n+4>>2];c[ta+1e3+16+8>>2]=c[n+8>>2];c[ta+1e3+16+12>>2]=c[n+12>>2];c[ta+1e3+32>>2]=c[s>>2];c[ta+1e3+32+4>>2]=c[s+4>>2];c[ta+1e3+32+8>>2]=c[s+8>>2];c[ta+1e3+32+12>>2]=c[s+12>>2];c[ta+1e3+48>>2]=c[t>>2];c[ta+1e3+48+4>>2]=c[t+4>>2];c[ta+1e3+48+8>>2]=c[t+8>>2];c[ta+1e3+48+12>>2]=c[t+12>>2]}else{c[ta+1e3>>2]=c[u>>2];c[ta+1e3+4>>2]=c[u+4>>2];c[ta+1e3+8>>2]=c[u+8>>2];c[ta+1e3+12>>2]=c[u+12>>2];c[ta+1e3+16>>2]=c[L>>2];c[ta+1e3+16+4>>2]=c[L+4>>2];c[ta+1e3+16+8>>2]=c[L+8>>2];c[ta+1e3+16+12>>2]=c[L+12>>2];c[ta+1e3+32>>2]=c[M>>2];c[ta+1e3+32+4>>2]=c[M+4>>2];c[ta+1e3+32+8>>2]=c[M+8>>2];c[ta+1e3+32+12>>2]=c[M+12>>2];c[ta+1e3+48>>2]=c[N>>2];c[ta+1e3+48+4>>2]=c[N+4>>2];c[ta+1e3+48+8>>2]=c[N+8>>2];c[ta+1e3+48+12>>2]=c[N+12>>2]}j=c[b+64>>2]|0;if((j|0)>0){A=E*E+I*I+H*H;y=(i>.39269909262657166?.39269909262657166:i)*.5;k=0;do{if(A>1.1920928955078125e-07){w=+G(+y)/+D(+A);r=E*w;v=I*w;w=H*w;x=+F(+y);q=+(k|0)*(6.2831854820251465/+(j|0))*.5;p=+G(+q)/+D(+(Q*J*Q*J+(K*J*K*J+P*J*P*J)));i=K*J*p;o=P*J*p;p=Q*J*p;q=+F(+q);if(B>2]|0;Z=+g[sa>>2];_=+g[sa+16>>2];$=+g[sa+32>>2];aa=+g[sa+4>>2];ba=+g[sa+20>>2];ca=+g[sa+36>>2];da=+g[sa+8>>2];ga=+g[sa+24>>2];oa=+g[sa+40>>2];g[ta+488>>2]=(1.0-(la*ma+Y*ea))*Z+(ha*ma-fa*ea)*_+(ha*ea+fa*ma)*$;g[ta+488+4>>2]=(1.0-(la*ma+Y*ea))*aa+(ha*ma-fa*ea)*ba+(ha*ea+fa*ma)*ca;g[ta+488+8>>2]=(1.0-(la*ma+Y*ea))*da+(ha*ma-fa*ea)*ga+(ha*ea+fa*ma)*oa;g[ta+488+12>>2]=0.0;g[ta+488+16>>2]=(ha*ma+fa*ea)*Z+(1.0-(ha*ka+Y*ea))*_+(la*ea-fa*ka)*$;g[ta+488+20>>2]=(ha*ma+fa*ea)*aa+(1.0-(ha*ka+Y*ea))*ba+(la*ea-fa*ka)*ca;g[ta+488+24>>2]=(ha*ma+fa*ea)*da+(1.0-(ha*ka+Y*ea))*ga+(la*ea-fa*ka)*oa;g[ta+488+28>>2]=0.0;g[ta+488+32>>2]=(ha*ea-fa*ma)*Z+(la*ea+fa*ka)*_+(1.0-(ha*ka+la*ma))*$;g[ta+488+36>>2]=(ha*ea-fa*ma)*aa+(la*ea+fa*ka)*ba+(1.0-(ha*ka+la*ma))*ca;g[ta+488+40>>2]=(ha*ea-fa*ma)*da+(la*ea+fa*ka)*ga+(1.0-(ha*ka+la*ma))*oa;g[ta+488+44>>2]=0.0;sa=c[e+12>>2]|0;c[u>>2]=c[sa>>2];c[u+4>>2]=c[sa+4>>2];c[u+8>>2]=c[sa+8>>2];c[u+12>>2]=c[sa+12>>2];c[L>>2]=c[sa+16>>2];c[L+4>>2]=c[sa+16+4>>2];c[L+8>>2]=c[sa+16+8>>2];c[L+12>>2]=c[sa+16+12>>2];c[M>>2]=c[sa+32>>2];c[M+4>>2]=c[sa+32+4>>2];c[M+8>>2]=c[sa+32+8>>2];c[M+12>>2]=c[sa+32+12>>2];c[N>>2]=c[sa+48>>2];c[N+4>>2]=c[sa+48+4>>2];c[N+8>>2]=c[sa+48+8>>2];c[N+12>>2]=c[sa+48+12>>2]}else{sa=c[d+12>>2]|0;c[ta+488>>2]=c[sa>>2];c[ta+488+4>>2]=c[sa+4>>2];c[ta+488+8>>2]=c[sa+8>>2];c[ta+488+12>>2]=c[sa+12>>2];c[n>>2]=c[sa+16>>2];c[n+4>>2]=c[sa+16+4>>2];c[n+8>>2]=c[sa+16+8>>2];c[n+12>>2]=c[sa+16+12>>2];c[s>>2]=c[sa+32>>2];c[s+4>>2]=c[sa+32+4>>2];c[s+8>>2]=c[sa+32+8>>2];c[s+12>>2]=c[sa+32+12>>2];c[t>>2]=c[sa+48>>2];c[t+4>>2]=c[sa+48+4>>2];c[t+8>>2]=c[sa+48+8>>2];c[t+12>>2]=c[sa+48+12>>2];ha=p*(r*-p+(v*q+x*-o)-w*-i)+(i*(x*q-r*-i-v*-o-w*-p)+q*(w*-o+(r*q+x*-i)-v*-p))-o*(v*-i+(w*q+x*-p)-r*-o);la=i*(v*-i+(w*q+x*-p)-r*-o)+(q*(r*-p+(v*q+x*-o)-w*-i)+o*(x*q-r*-i-v*-o-w*-p))-p*(w*-o+(r*q+x*-i)-v*-p);Y=o*(w*-o+(r*q+x*-i)-v*-p)+(p*(x*q-r*-i-v*-o-w*-p)+q*(v*-i+(w*q+x*-p)-r*-o))-i*(r*-p+(v*q+x*-o)-w*-i);fa=q*(x*q-r*-i-v*-o-w*-p)-i*(w*-o+(r*q+x*-i)-v*-p)-o*(r*-p+(v*q+x*-o)-w*-i)-p*(v*-i+(w*q+x*-p)-r*-o);ka=ha*(2.0/(fa*fa+(Y*Y+(ha*ha+la*la))));ma=la*(2.0/(fa*fa+(Y*Y+(ha*ha+la*la))));ea=Y*(2.0/(fa*fa+(Y*Y+(ha*ha+la*la))));sa=c[e+12>>2]|0;Z=+g[sa>>2];_=+g[sa+16>>2];$=+g[sa+32>>2];aa=+g[sa+4>>2];ba=+g[sa+20>>2];ca=+g[sa+36>>2];da=+g[sa+8>>2];ga=+g[sa+24>>2];oa=+g[sa+40>>2];g[ta+488+64>>2]=(1.0-(la*ma+Y*ea))*Z+(ha*ma-fa*ea)*_+(ha*ea+fa*ma)*$;g[ta+488+68>>2]=(1.0-(la*ma+Y*ea))*aa+(ha*ma-fa*ea)*ba+(ha*ea+fa*ma)*ca;g[ta+488+72>>2]=(1.0-(la*ma+Y*ea))*da+(ha*ma-fa*ea)*ga+(ha*ea+fa*ma)*oa;g[ta+488+76>>2]=0.0;g[ta+488+80>>2]=(ha*ma+fa*ea)*Z+(1.0-(ha*ka+Y*ea))*_+(la*ea-fa*ka)*$;g[ta+488+84>>2]=(ha*ma+fa*ea)*aa+(1.0-(ha*ka+Y*ea))*ba+(la*ea-fa*ka)*ca;g[ta+488+88>>2]=(ha*ma+fa*ea)*da+(1.0-(ha*ka+Y*ea))*ga+(la*ea-fa*ka)*oa;g[ta+488+92>>2]=0.0;g[ta+488+96>>2]=(ha*ea-fa*ma)*Z+(la*ea+fa*ka)*_+(1.0-(ha*ka+la*ma))*$;g[ta+488+100>>2]=(ha*ea-fa*ma)*aa+(la*ea+fa*ka)*ba+(1.0-(ha*ka+la*ma))*ca;g[ta+488+104>>2]=(ha*ea-fa*ma)*da+(la*ea+fa*ka)*ga+(1.0-(ha*ka+la*ma))*oa;g[ta+488+108>>2]=0.0}j=c[f+20>>2]|0;g[ta+760+32>>2]=0.0;c[ta+760>>2]=6484;c[ta+760+36>>2]=h;c[ta+760+40>>2]=c[ta+488>>2];c[ta+760+40+4>>2]=c[ta+488+4>>2];c[ta+760+40+8>>2]=c[ta+488+8>>2];c[ta+760+40+12>>2]=c[ta+488+12>>2];c[ta+760+56>>2]=c[n>>2];c[ta+760+56+4>>2]=c[n+4>>2];c[ta+760+56+8>>2]=c[n+8>>2];c[ta+760+56+12>>2]=c[n+12>>2];c[ta+760+72>>2]=c[s>>2];c[ta+760+72+4>>2]=c[s+4>>2];c[ta+760+72+8>>2]=c[s+8>>2];c[ta+760+72+12>>2]=c[s+12>>2];c[ta+760+88>>2]=c[t>>2];c[ta+760+88+4>>2]=c[t+4>>2];c[ta+760+88+8>>2]=c[t+8>>2];c[ta+760+88+12>>2]=c[t+12>>2];c[ta+760+104>>2]=c[u>>2];c[ta+760+104+4>>2]=c[u+4>>2];c[ta+760+104+8>>2]=c[u+8>>2];c[ta+760+104+12>>2]=c[u+12>>2];c[ta+760+120>>2]=c[L>>2];c[ta+760+120+4>>2]=c[L+4>>2];c[ta+760+120+8>>2]=c[L+8>>2];c[ta+760+120+12>>2]=c[L+12>>2];c[ta+760+136>>2]=c[M>>2];c[ta+760+136+4>>2]=c[M+4>>2];c[ta+760+136+8>>2]=c[M+8>>2];c[ta+760+136+12>>2]=c[M+12>>2];c[ta+760+152>>2]=c[N>>2];c[ta+760+152+4>>2]=c[N+4>>2];c[ta+760+152+8>>2]=c[N+8>>2];c[ta+760+152+12>>2]=c[N+12>>2];c[ta+760+168>>2]=c[ta+1e3>>2];c[ta+760+168+4>>2]=c[ta+1e3+4>>2];c[ta+760+168+8>>2]=c[ta+1e3+8>>2];c[ta+760+168+12>>2]=c[ta+1e3+12>>2];c[ta+760+184>>2]=c[ta+1e3+16>>2];c[ta+760+184+4>>2]=c[ta+1e3+16+4>>2];c[ta+760+184+8>>2]=c[ta+1e3+16+8>>2];c[ta+760+184+12>>2]=c[ta+1e3+16+12>>2];c[ta+760+200>>2]=c[ta+1e3+32>>2];c[ta+760+200+4>>2]=c[ta+1e3+32+4>>2];c[ta+760+200+8>>2]=c[ta+1e3+32+8>>2];c[ta+760+200+12>>2]=c[ta+1e3+32+12>>2];c[ta+760+216>>2]=c[ta+1e3+48>>2];c[ta+760+216+4>>2]=c[ta+1e3+48+4>>2];c[ta+760+216+8>>2]=c[ta+1e3+48+8>>2];c[ta+760+216+12>>2]=c[ta+1e3+48+12>>2];a[ta+760+232>>0]=B>2]=j;Dc(ta+48|0,ta+488|0,ta+760|0,j,0);j=c[b+64>>2]|0}k=k+1|0}while((k|0)<(j|0))}}if(!(a[b+52>>0]|0)){l=ta;return}k=c[h+4>>2]|0;if(!(c[k+780>>2]|0)){l=ta;return}m=c[k+772>>2]|0;n=c[(c[h+8>>2]|0)+8>>2]|0;j=c[(c[h+12>>2]|0)+8>>2]|0;if((m|0)==(n|0)){af(k,m+4|0,j+4|0);l=ta;return}else{af(k,j+4|0,n+4|0);l=ta;return}}function fc(b){b=b|0;var d=0,e=0,f=0,h=0,i=0.0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,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.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0.0,ga=0.0;W=l;l=l+176|0;ci(b);if(!(xb[c[(c[b>>2]|0)+20>>2]&127](b)|0)){l=W;return}if((c[b+348>>2]|0)<=0){l=W;return}Q=W+96+32|0;R=W+96+52|0;N=0;do{S=c[(c[b+356>>2]|0)+(N<<2)>>2]|0;if(xb[c[(c[b>>2]|0)+20>>2]&127](b)|0?(M=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0,(xb[c[(c[M>>2]|0)+56>>2]&127](M)|0)&1|0):0){e=c[b+72>>2]|0;if(!(a[S+533>>0]|0))M=e;else{c[W+80>>2]=c[S+580>>2];c[W+80+4>>2]=c[S+580+4>>2];c[W+80+8>>2]=c[S+580+8>>2];c[W+80+12>>2]=c[S+580+12>>2];i=+g[S+644>>2];k=+g[S+596>>2];m=+g[S+660>>2];s=+g[S+600>>2];t=+g[S+676>>2];u=+g[S+604>>2];v=+g[S+648>>2];w=+g[S+664>>2];x=+g[S+680>>2];y=+g[S+652>>2];z=+g[S+668>>2];A=+g[S+684>>2];B=+g[S+612>>2];C=+g[S+616>>2];E=+g[S+620>>2];F=+g[S+628>>2];G=+g[S+632>>2];H=+g[S+636>>2];ga=i*k+m*s+t*u+(k*v+s*w+u*x)*0.0+(k*y+s*z+u*A)*0.0;ea=(y*B+z*C+A*E)*0.0+(i*B+m*C+t*E+(v*B+w*C+x*E)*0.0);da=(y*F+z*G+A*H)*0.0+(i*F+m*G+t*H+(v*F+w*G+x*H)*0.0);fa=1.0/+D(+(ga*ga+ea*ea+da*da));ca=(i*k+m*s+t*u)*0.0+(k*v+s*w+u*x)+(k*y+s*z+u*A)*0.0;aa=(y*B+z*C+A*E)*0.0+(v*B+w*C+x*E+(i*B+m*C+t*E)*0.0);$=(y*F+z*G+A*H)*0.0+(v*F+w*G+x*H+(i*F+m*G+t*H)*0.0);ba=1.0/+D(+(ca*ca+aa*aa+$*$));_=(i*k+m*s+t*u)*0.0+(k*v+s*w+u*x)*0.0+(k*y+s*z+u*A);Y=y*B+z*C+A*E+((i*B+m*C+t*E)*0.0+(v*B+w*C+x*E)*0.0);X=y*F+z*G+A*H+((i*F+m*G+t*H)*0.0+(v*F+w*G+x*H)*0.0);Z=1.0/+D(+(_*_+Y*Y+X*X));M=c[(c[e>>2]|0)+16>>2]|0;ea=ea*fa*10.0+ +g[W+80+4>>2];da=fa*da*10.0+ +g[W+80+8>>2];g[W+160>>2]=ga*fa*10.0+ +g[W+80>>2];g[W+160+4>>2]=ea;g[W+160+8>>2]=da;g[W+160+12>>2]=0.0;c[W+96>>2]=1065353216;c[W+96+4>>2]=0;c[W+96+8>>2]=0;g[W+96+12>>2]=0.0;Vb[M&127](e,W+80|0,W+160|0,W+96|0);M=c[(c[e>>2]|0)+16>>2]|0;aa=aa*ba*10.0+ +g[W+80+4>>2];$=ba*$*10.0+ +g[W+80+8>>2];g[W+160>>2]=ca*ba*10.0+ +g[W+80>>2];g[W+160+4>>2]=aa;g[W+160+8>>2]=$;g[W+160+12>>2]=0.0;c[W+96>>2]=0;c[W+96+4>>2]=1065353216;c[W+96+8>>2]=0;g[W+96+12>>2]=0.0;Vb[M&127](e,W+80|0,W+160|0,W+96|0);M=c[(c[e>>2]|0)+16>>2]|0;Y=Y*Z*10.0+ +g[W+80+4>>2];X=Z*X*10.0+ +g[W+80+8>>2];g[W+160>>2]=_*Z*10.0+ +g[W+80>>2];g[W+160+4>>2]=Y;g[W+160+8>>2]=X;g[W+160+12>>2]=0.0;c[W+96>>2]=0;c[W+96+4>>2]=0;c[W+96+8>>2]=1065353216;g[W+96+12>>2]=0.0;Vb[M&127](e,W+80|0,W+160|0,W+96|0);if((c[S+544>>2]|0)>0){d=0;do{M=c[S+552>>2]|0;ca=+g[M+(d<<4)>>2];da=+g[M+(d<<4)+4>>2];ga=+g[M+(d<<4)+8>>2];ea=+g[W+80>>2]+((i*k+m*s+t*u)*ca+(k*v+s*w+u*x)*da+(k*y+s*z+u*A)*ga);fa=+g[W+80+4>>2]+((i*B+m*C+t*E)*ca+(v*B+w*C+x*E)*da+(y*B+z*C+A*E)*ga);ga=(i*F+m*G+t*H)*ca+(v*F+w*G+x*H)*da+(y*F+z*G+A*H)*ga+ +g[W+80+8>>2];c[W+64>>2]=1065353216;c[W+64+4>>2]=0;c[W+64+8>>2]=1065353216;g[W+64+12>>2]=0.0;M=c[(c[e>>2]|0)+16>>2]|0;g[W+160>>2]=ea+-.10000000149011612;g[W+160+4>>2]=fa;g[W+160+8>>2]=ga;g[W+160+12>>2]=0.0;g[W+96>>2]=ea+.10000000149011612;g[W+96+4>>2]=fa+0.0;g[W+96+8>>2]=ga+0.0;g[W+96+12>>2]=0.0;Vb[M&127](e,W+160|0,W+96|0,W+64|0);M=c[(c[e>>2]|0)+16>>2]|0;g[W+160>>2]=ea;g[W+160+4>>2]=fa+-.10000000149011612;g[W+160+8>>2]=ga;g[W+160+12>>2]=0.0;g[W+96>>2]=ea+0.0;g[W+96+4>>2]=fa+.10000000149011612;g[W+96+8>>2]=ga+0.0;g[W+96+12>>2]=0.0;Vb[M&127](e,W+160|0,W+96|0,W+64|0);M=c[(c[e>>2]|0)+16>>2]|0;g[W+160>>2]=ea;g[W+160+4>>2]=fa;g[W+160+8>>2]=ga+-.10000000149011612;g[W+160+12>>2]=0.0;g[W+96>>2]=ea+0.0;g[W+96+4>>2]=fa+0.0;g[W+96+8>>2]=ga+.10000000149011612;g[W+96+12>>2]=0.0;Vb[M&127](e,W+160|0,W+96|0,W+64|0);d=d+1|0}while((d|0)<(c[S+544>>2]|0))}M=c[b+72>>2]|0}L=c[b+364>>2]|0;c[W+80>>2]=0;c[W+80+4>>2]=0;c[W+80+8>>2]=0;c[W+80+12>>2]=0;c[W+64>>2]=1065353216;c[W+64+4>>2]=1065353216;c[W+64+8>>2]=1065353216;g[W+64+12>>2]=0.0;c[W+48>>2]=1065353216;c[W+48+4>>2]=0;c[W+48+8>>2]=0;g[W+48+12>>2]=0.0;if(!(L&256)){if(L&1|0?(T=c[S+772>>2]|0,(T|0)>0):0){f=0;d=T;do{e=c[S+780>>2]|0;if(c[(c[e+(f*104|0)+4>>2]|0)+16>>2]&1){d=c[(c[M>>2]|0)+16>>2]|0;K=e+(f*104|0)+8|0;I=e+(f*104|0)+12|0;q=c[I>>2]|0;J=e+(f*104|0)+16|0;r=c[J>>2]|0;g[W+160>>2]=+g[K>>2]+-.10000000149011612;c[W+160+4>>2]=q;c[W+160+8>>2]=r;g[W+160+12>>2]=0.0;fa=+g[I>>2]+0.0;ga=+g[J>>2]+0.0;g[W+96>>2]=+g[K>>2]+.10000000149011612;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;c[W+32>>2]=1065353216;c[W+32+4>>2]=0;c[W+32+8>>2]=0;g[W+32+12>>2]=0.0;Vb[d&127](M,W+160|0,W+96|0,W+32|0);d=c[(c[M>>2]|0)+16>>2]|0;ga=+g[I>>2]+-.10000000149011612;r=c[J>>2]|0;c[W+160>>2]=c[K>>2];g[W+160+4>>2]=ga;c[W+160+8>>2]=r;g[W+160+12>>2]=0.0;ga=+g[I>>2]+.10000000149011612;fa=+g[J>>2]+0.0;g[W+96>>2]=+g[K>>2]+0.0;g[W+96+4>>2]=ga;g[W+96+8>>2]=fa;g[W+96+12>>2]=0.0;c[W+32>>2]=0;c[W+32+4>>2]=1065353216;c[W+32+8>>2]=0;g[W+32+12>>2]=0.0;Vb[d&127](M,W+160|0,W+96|0,W+32|0);d=c[(c[M>>2]|0)+16>>2]|0;r=c[I>>2]|0;fa=+g[J>>2]+-.10000000149011612;c[W+160>>2]=c[K>>2];c[W+160+4>>2]=r;g[W+160+8>>2]=fa;g[W+160+12>>2]=0.0;fa=+g[I>>2]+0.0;ga=+g[J>>2]+.10000000149011612;g[W+96>>2]=+g[K>>2]+0.0;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;c[W+32>>2]=0;c[W+32+4>>2]=0;c[W+32+8>>2]=1065353216;g[W+32+12>>2]=0.0;Vb[d&127](M,W+160|0,W+96|0,W+32|0);d=c[S+772>>2]|0}f=f+1|0}while((f|0)<(d|0))}if(L&2|0?(U=c[S+792>>2]|0,(U|0)>0):0){f=0;d=U;do{e=c[S+800>>2]|0;if(c[(c[e+(f*52|0)+4>>2]|0)+16>>2]&1){Vb[c[(c[M>>2]|0)+16>>2]&127](M,(c[e+(f*52|0)+24>>2]|0)+8|0,(c[e+(f*52|0)+28>>2]|0)+8|0,W+80|0);d=c[S+792>>2]|0}f=f+1|0}while((f|0)<(d|0))}if(L&16|0?(V=c[S+772>>2]|0,(V|0)>0):0){f=0;d=V;do{e=c[S+780>>2]|0;if(c[(c[e+(f*104|0)+4>>2]|0)+16>>2]&1){ea=+g[e+(f*104|0)+72>>2]*.5;ga=+g[e+(f*104|0)+76>>2]*.5;fa=+g[e+(f*104|0)+80>>2]*.5;K=c[(c[M>>2]|0)+16>>2]|0;d=e+(f*104|0)+8|0;I=e+(f*104|0)+12|0;ca=ga+ +g[I>>2];J=e+(f*104|0)+16|0;da=fa+ +g[J>>2];g[W+160>>2]=ea+ +g[d>>2];g[W+160+4>>2]=ca;g[W+160+8>>2]=da;g[W+160+12>>2]=0.0;Vb[K&127](M,d,W+160|0,W+64|0);K=c[(c[M>>2]|0)+16>>2]|0;ga=+g[I>>2]-ga;fa=+g[J>>2]-fa;g[W+160>>2]=+g[d>>2]-ea;g[W+160+4>>2]=ga;g[W+160+8>>2]=fa;g[W+160+12>>2]=0.0;fa=+g[W+64+4>>2]*.5;ga=+g[W+64+8>>2]*.5;g[W+96>>2]=+g[W+64>>2]*.5;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;Vb[K&127](M,d,W+160|0,W+96|0);d=c[S+772>>2]|0}f=f+1|0}while((f|0)<(d|0))}if(L&32|0){if((a[22472]|0)==0?Uz(22472)|0:0){c[5774]=1065353216;c[5775]=0;c[5776]=0;c[5777]=0;c[5778]=0;c[5779]=1065353216;c[5780]=0;c[5781]=0;c[5782]=0;c[5783]=0;c[5784]=1065353216;g[5785]=0.0}if((c[S+872>>2]|0)>0){d=0;do{K=c[S+880>>2]|0;I=c[K+(d*104|0)+24>>2]|0;B=+g[I+8>>2];J=K+(d*104|0)+4|0;C=+g[J>>2];G=+g[I+12>>2];r=K+(d*104|0)+8|0;H=+g[r>>2];fa=+g[I+16>>2];I=K+(d*104|0)+12|0;da=+g[I>>2];ba=+g[K+(d*104|0)+20>>2]+(B*C+G*H+fa*da);g[W+160>>2]=B-C*ba;g[W+160+4>>2]=G-H*ba;g[W+160+8>>2]=fa-da*ba;g[W+160+12>>2]=0.0;X=+g[J>>2];Z=+g[r>>2];E=+g[I>>2];K=+g[K+(d*104|0)+4+((!(X>2]>2];Y=+g[23096+(K<<4)+4>>2];_=+g[23096+(K<<4)>>2];$=1.0/+D(+((X*Y-Z*_)*(X*Y-Z*_)+((Z*F-E*Y)*(Z*F-E*Y)+(E*_-X*F)*(E*_-X*F))));aa=E*(E*_-X*F)*$-Z*(X*Y-Z*_)*$;ca=X*(X*Y-Z*_)*$-E*(Z*F-E*Y)*$;ga=Z*(Z*F-E*Y)*$-X*(E*_-X*F)*$;ea=1.0/+D(+(ga*ga+(aa*aa+ca*ca)));K=c[(c[M>>2]|0)+16>>2]|0;g[W+96>>2]=B-C*ba-(Z*F-E*Y)*$*.5;g[W+96+4>>2]=G-H*ba-(E*_-X*F)*$*.5;g[W+96+8>>2]=fa-da*ba-(X*Y-Z*_)*$*.5;g[W+96+12>>2]=0.0;g[W+32>>2]=(Z*F-E*Y)*$*.5+(B-C*ba);g[W+32+4>>2]=(E*_-X*F)*$*.5+(G-H*ba);g[W+32+8>>2]=(X*Y-Z*_)*$*.5+(fa-da*ba);g[W+32+12>>2]=0.0;Vb[K&127](M,W+96|0,W+32|0,W+48|0);K=c[(c[M>>2]|0)+16>>2]|0;ba=+g[W+160>>2];da=+g[W+160+4>>2];fa=+g[W+160+8>>2];g[W+96>>2]=ba-ea*aa*.5;g[W+96+4>>2]=da-ea*ca*.5;g[W+96+8>>2]=fa-ea*ga*.5;g[W+96+12>>2]=0.0;g[W+32>>2]=ea*aa*.5+ba;g[W+32+4>>2]=ea*ca*.5+da;g[W+32+8>>2]=ea*ga*.5+fa;g[W+32+12>>2]=0.0;Vb[K&127](M,W+96|0,W+32|0,W+48|0);K=c[(c[M>>2]|0)+16>>2]|0;fa=+g[r>>2]*.5*3.0+ +g[W+160+4>>2];ga=+g[I>>2]*.5*3.0+ +g[W+160+8>>2];g[W+96>>2]=+g[J>>2]*.5*3.0+ +g[W+160>>2];g[W+96+4>>2]=fa;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;c[W+32>>2]=1065353216;c[W+32+4>>2]=1065353216;c[W+32+8>>2]=0;g[W+32+12>>2]=0.0;Vb[K&127](M,W+160|0,W+96|0,W+32|0);d=d+1|0}while((d|0)<(c[S+872>>2]|0))}}if(L&4|0?(c[W+160>>2]=0,c[W+160+4>>2]=1060320051,c[W+160+8>>2]=0,g[W+160+12>>2]=0.0,O=c[S+812>>2]|0,(O|0)>0):0){f=0;d=O;do{e=c[S+820>>2]|0;if(c[(c[e+(f*44|0)+4>>2]|0)+16>>2]&1){d=c[e+(f*44|0)+8>>2]|0;_=+g[d+8>>2];ba=+g[d+12>>2];ea=+g[d+16>>2];d=c[e+(f*44|0)+12>>2]|0;$=+g[d+8>>2];ca=+g[d+12>>2];fa=+g[d+16>>2];d=c[e+(f*44|0)+16>>2]|0;aa=+g[d+8>>2];da=+g[d+12>>2];ga=+g[d+16>>2];d=c[(c[M>>2]|0)+36>>2]|0;g[W+96>>2]=(_+$+aa)*.3333333432674408+(_-(_+$+aa)*.3333333432674408)*.800000011920929;g[W+96+4>>2]=(ba+ca+da)*.3333333432674408+(ba-(ba+ca+da)*.3333333432674408)*.800000011920929;g[W+96+8>>2]=(ea+fa+ga)*.3333333432674408+(ea-(ea+fa+ga)*.3333333432674408)*.800000011920929;g[W+96+12>>2]=0.0;g[W+32>>2]=(_+$+aa)*.3333333432674408+($-(_+$+aa)*.3333333432674408)*.800000011920929;g[W+32+4>>2]=(ba+ca+da)*.3333333432674408+(ca-(ba+ca+da)*.3333333432674408)*.800000011920929;g[W+32+8>>2]=(ea+fa+ga)*.3333333432674408+(fa-(ea+fa+ga)*.3333333432674408)*.800000011920929;g[W+32+12>>2]=0.0;g[W+16>>2]=(_+$+aa)*.3333333432674408+(aa-(_+$+aa)*.3333333432674408)*.800000011920929;g[W+16+4>>2]=(ba+ca+da)*.3333333432674408+(da-(ba+ca+da)*.3333333432674408)*.800000011920929;g[W+16+8>>2]=(ea+fa+ga)*.3333333432674408+(ga-(ea+fa+ga)*.3333333432674408)*.800000011920929;g[W+16+12>>2]=0.0;_b[d&0](M,W+96|0,W+32|0,W+16|0,W+160|0,1.0);d=c[S+812>>2]|0}f=f+1|0}while((f|0)<(d|0))}if(L&8|0?(c[W+160>>2]=1050253722,c[W+160+4>>2]=1050253722,c[W+160+8>>2]=1060320051,g[W+160+12>>2]=0.0,P=c[S+832>>2]|0,(P|0)>0):0){f=0;d=P;do{e=c[S+840>>2]|0;if(c[(c[e+(f*104|0)+4>>2]|0)+16>>2]&1){d=c[e+(f*104|0)+8>>2]|0;y=+g[d+8>>2];B=+g[d+12>>2];F=+g[d+16>>2];d=c[e+(f*104|0)+12>>2]|0;z=+g[d+8>>2];C=+g[d+12>>2];G=+g[d+16>>2];d=c[e+(f*104|0)+16>>2]|0;A=+g[d+8>>2];E=+g[d+12>>2];H=+g[d+16>>2];d=c[e+(f*104|0)+20>>2]|0;ea=+g[d+8>>2];fa=+g[d+12>>2];ga=+g[d+16>>2];d=c[(c[M>>2]|0)+36>>2]|0;ba=(y+z+A+ea)*.25+(y-(y+z+A+ea)*.25)*.800000011920929;ca=(B+C+E+fa)*.25+(B-(B+C+E+fa)*.25)*.800000011920929;da=(F+G+H+ga)*.25+(F-(F+G+H+ga)*.25)*.800000011920929;g[W+96>>2]=ba;g[W+96+4>>2]=ca;g[W+96+8>>2]=da;g[W+96+12>>2]=0.0;X=(y+z+A+ea)*.25+(z-(y+z+A+ea)*.25)*.800000011920929;Y=(B+C+E+fa)*.25+(C-(B+C+E+fa)*.25)*.800000011920929;Z=(F+G+H+ga)*.25+(G-(F+G+H+ga)*.25)*.800000011920929;g[W+32>>2]=X;g[W+32+4>>2]=Y;g[W+32+8>>2]=Z;g[W+32+12>>2]=0.0;_=(y+z+A+ea)*.25+(A-(y+z+A+ea)*.25)*.800000011920929;$=(B+C+E+fa)*.25+(E-(B+C+E+fa)*.25)*.800000011920929;aa=(F+G+H+ga)*.25+(H-(F+G+H+ga)*.25)*.800000011920929;g[W+16>>2]=_;g[W+16+4>>2]=$;g[W+16+8>>2]=aa;g[W+16+12>>2]=0.0;_b[d&0](M,W+96|0,W+32|0,W+16|0,W+160|0,1.0);d=c[(c[M>>2]|0)+36>>2]|0;g[W+96>>2]=ba;g[W+96+4>>2]=ca;g[W+96+8>>2]=da;g[W+96+12>>2]=0.0;g[W+32>>2]=X;g[W+32+4>>2]=Y;g[W+32+8>>2]=Z;g[W+32+12>>2]=0.0;ea=(y+z+A+ea)*.25+(ea-(y+z+A+ea)*.25)*.800000011920929;fa=(B+C+E+fa)*.25+(fa-(B+C+E+fa)*.25)*.800000011920929;ga=(F+G+H+ga)*.25+(ga-(F+G+H+ga)*.25)*.800000011920929;g[W+16>>2]=ea;g[W+16+4>>2]=fa;g[W+16+8>>2]=ga;g[W+16+12>>2]=0.0;_b[d&0](M,W+96|0,W+32|0,W+16|0,W+160|0,1.0);d=c[(c[M>>2]|0)+36>>2]|0;g[W+96>>2]=X;g[W+96+4>>2]=Y;g[W+96+8>>2]=Z;g[W+96+12>>2]=0.0;g[W+32>>2]=_;g[W+32+4>>2]=$;g[W+32+8>>2]=aa;g[W+32+12>>2]=0.0;g[W+16>>2]=ea;g[W+16+4>>2]=fa;g[W+16+8>>2]=ga;g[W+16+12>>2]=0.0;_b[d&0](M,W+96|0,W+32|0,W+16|0,W+160|0,1.0);d=c[(c[M>>2]|0)+36>>2]|0;g[W+96>>2]=_;g[W+96+4>>2]=$;g[W+96+8>>2]=aa;g[W+96+12>>2]=0.0;g[W+32>>2]=ba;g[W+32+4>>2]=ca;g[W+32+8>>2]=da;g[W+32+12>>2]=0.0;g[W+16>>2]=ea;g[W+16+4>>2]=fa;g[W+16+8>>2]=ga;g[W+16+12>>2]=0.0;_b[d&0](M,W+96|0,W+32|0,W+16|0,W+160|0,1.0);d=c[S+832>>2]|0}f=f+1|0}while((f|0)<(d|0))}}else{LI();d=c[S+1112>>2]|0;if((d|0)>0){K=0;do{if(a[(c[(c[S+1120>>2]|0)+(K<<2)>>2]|0)+377>>0]|0){da=+(rs()|0)*4.656612873077393e-10;ea=+(rs()|0)*4.656612873077393e-10;fa=+(rs()|0)*4.656612873077393e-10;ga=1.0/+D(+(fa*fa+(da*da+ea*ea)));g[W+160>>2]=da*ga*.75;g[W+160+4>>2]=ea*ga*.75;g[W+160+8>>2]=fa*ga*.75;g[W+160+12>>2]=0.0;f=c[(c[(c[S+1120>>2]|0)+(K<<2)>>2]|0)+24>>2]|0;if((f|0)>0){c[6995]=(c[6995]|0)+1;d=sc((f<<4|3)+16|0)|0;if(!d)e=0;else{c[(d+4+15&-16)+-4>>2]=d;e=d+4+15&-16}d=0;do{J=e+(d<<4)|0;c[J>>2]=c[W+96>>2];c[J+4>>2]=c[W+96+4>>2];c[J+8>>2]=c[W+96+8>>2];c[J+12>>2]=c[W+96+12>>2];d=d+1|0}while((d|0)!=(f|0));d=0;do{I=(c[(c[(c[(c[S+1120>>2]|0)+(K<<2)>>2]|0)+32>>2]|0)+(d<<2)>>2]|0)+8|0;J=e+(d<<4)|0;c[J>>2]=c[I>>2];c[J+4>>2]=c[I+4>>2];c[J+8>>2]=c[I+8>>2];c[J+12>>2]=c[I+12>>2];d=d+1|0}while((d|0)!=(f|0));J=e;I=e}else{J=0;I=0}a[W+96+16>>0]=1;c[W+96+12>>2]=0;c[W+96+4>>2]=0;c[W+96+8>>2]=0;a[W+96+36>>0]=1;c[Q>>2]=0;c[W+96+24>>2]=0;c[W+96+28>>2]=0;a[W+96+56>>0]=1;c[R>>2]=0;c[W+96+44>>2]=0;c[W+96+48>>2]=0;uc(W+96|0,I,f);q=c[W+96+44>>2]|0;if((q|0)>0){o=c[Q>>2]|0;n=0;do{r=c[(c[R>>2]|0)+(n<<2)>>2]|0;e=c[o+(r*12|0)+4>>2]|0;d=o+(r*12|0)+(e*12|0)+((c[o+(r*12|0)+(e*12|0)>>2]|0)*12|0)|0;if((d|0)!=(o+(r*12|0)|0)){p=c[W+96+12>>2]|0;e=c[o+(r*12|0)+(e*12|0)+8>>2]|0;f=c[o+(r*12|0)+8>>2]|0;while(1){h=c[d+8>>2]|0;_b[c[(c[M>>2]|0)+36>>2]&0](M,p+(e<<4)|0,p+(f<<4)|0,p+(h<<4)|0,W+160|0,1.0);e=d+((c[d+4>>2]|0)*12|0)|0;d=e+((c[e>>2]|0)*12|0)|0;if((d|0)==(o+(r*12|0)|0))break;else{e=f;f=h}}}n=n+1|0}while((n|0)<(q|0))}d=c[R>>2]|0;if(d|0){if(a[W+96+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[R>>2]=0}a[W+96+56>>0]=1;c[R>>2]=0;c[W+96+44>>2]=0;c[W+96+48>>2]=0;d=c[Q>>2]|0;if(d|0){if(a[W+96+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[Q>>2]=0}a[W+96+36>>0]=1;c[Q>>2]=0;c[W+96+24>>2]=0;c[W+96+28>>2]=0;d=c[W+96+12>>2]|0;if(d|0){if(a[W+96+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[W+96+12>>2]=0}if(!((J|0)==0|(I|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[I+-4>>2]|0)}d=c[S+1112>>2]|0}K=K+1|0}while((K|0)<(d|0))}}if(L&64|0){if((c[S+852>>2]|0)>0){d=0;do{K=c[S+860>>2]|0;q=c[K+(d*96|0)+20>>2]|0;ca=+g[K+(d*96|0)+4>>2];da=+g[K+(d*96|0)+8>>2];ea=+g[K+(d*96|0)+12>>2];fa=ca*+g[q+20>>2]+da*+g[q+24>>2]+ea*+g[q+28>>2]+ +g[q+56>>2];ga=ca*+g[q+36>>2]+da*+g[q+40>>2]+ea*+g[q+44>>2]+ +g[q+60>>2];g[W+32>>2]=ca*+g[q+4>>2]+da*+g[q+8>>2]+ea*+g[q+12>>2]+ +g[q+52>>2];g[W+32+4>>2]=fa;g[W+32+8>>2]=ga;g[W+32+12>>2]=0.0;K=K+(d*96|0)|0;q=c[K>>2]|0;c[W+16>>2]=1065353216;c[W+16+4>>2]=0;c[W+16+8>>2]=0;g[W+16+12>>2]=0.0;J=c[(c[M>>2]|0)+16>>2]|0;ga=+g[q+8>>2];I=c[q+12>>2]|0;r=c[q+16>>2]|0;g[W+160>>2]=ga+-.25;c[W+160+4>>2]=I;c[W+160+8>>2]=r;g[W+160+12>>2]=0.0;fa=(c[j>>2]=I,+g[j>>2])+0.0;ea=(c[j>>2]=r,+g[j>>2])+0.0;g[W+96>>2]=ga+.25;g[W+96+4>>2]=fa;g[W+96+8>>2]=ea;g[W+96+12>>2]=0.0;Vb[J&127](M,W+160|0,W+96|0,W+16|0);J=c[(c[M>>2]|0)+16>>2]|0;r=c[q+8>>2]|0;ea=+g[q+12>>2];I=c[q+16>>2]|0;c[W+160>>2]=r;g[W+160+4>>2]=ea+-.25;c[W+160+8>>2]=I;g[W+160+12>>2]=0.0;fa=(c[j>>2]=r,+g[j>>2])+0.0;ga=(c[j>>2]=I,+g[j>>2])+0.0;g[W+96>>2]=fa;g[W+96+4>>2]=ea+.25;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;Vb[J&127](M,W+160|0,W+96|0,W+16|0);J=c[(c[M>>2]|0)+16>>2]|0;I=c[q+8>>2]|0;r=c[q+12>>2]|0;ga=+g[q+16>>2];c[W+160>>2]=I;c[W+160+4>>2]=r;g[W+160+8>>2]=ga+-.25;g[W+160+12>>2]=0.0;ea=(c[j>>2]=I,+g[j>>2])+0.0;fa=(c[j>>2]=r,+g[j>>2])+0.0;g[W+96>>2]=ea;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga+.25;g[W+96+12>>2]=0.0;Vb[J&127](M,W+160|0,W+96|0,W+16|0);c[W+16>>2]=0;c[W+16+4>>2]=1065353216;c[W+16+8>>2]=0;g[W+16+12>>2]=0.0;J=c[(c[M>>2]|0)+16>>2]|0;ga=+g[W+32>>2];r=c[W+32+4>>2]|0;I=c[W+32+8>>2]|0;g[W+160>>2]=ga+-.25;c[W+160+4>>2]=r;c[W+160+8>>2]=I;g[W+160+12>>2]=0.0;fa=(c[j>>2]=r,+g[j>>2])+0.0;ea=(c[j>>2]=I,+g[j>>2])+0.0;g[W+96>>2]=ga+.25;g[W+96+4>>2]=fa;g[W+96+8>>2]=ea;g[W+96+12>>2]=0.0;Vb[J&127](M,W+160|0,W+96|0,W+16|0);J=c[(c[M>>2]|0)+16>>2]|0;I=c[W+32>>2]|0;ea=+g[W+32+4>>2];r=c[W+32+8>>2]|0;c[W+160>>2]=I;g[W+160+4>>2]=ea+-.25;c[W+160+8>>2]=r;g[W+160+12>>2]=0.0;fa=(c[j>>2]=I,+g[j>>2])+0.0;ga=(c[j>>2]=r,+g[j>>2])+0.0;g[W+96>>2]=fa;g[W+96+4>>2]=ea+.25;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;Vb[J&127](M,W+160|0,W+96|0,W+16|0);J=c[(c[M>>2]|0)+16>>2]|0;r=c[W+32>>2]|0;I=c[W+32+4>>2]|0;ga=+g[W+32+8>>2];c[W+160>>2]=r;c[W+160+4>>2]=I;g[W+160+8>>2]=ga+-.25;g[W+160+12>>2]=0.0;ea=(c[j>>2]=r,+g[j>>2])+0.0;fa=(c[j>>2]=I,+g[j>>2])+0.0;g[W+96>>2]=ea;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga+.25;g[W+96+12>>2]=0.0;Vb[J&127](M,W+160|0,W+96|0,W+16|0);J=c[(c[M>>2]|0)+16>>2]|0;K=(c[K>>2]|0)+8|0;c[W+160>>2]=1065353216;c[W+160+4>>2]=1065353216;c[W+160+8>>2]=1065353216;g[W+160+12>>2]=0.0;Vb[J&127](M,K,W+32|0,W+160|0);d=d+1|0}while((d|0)<(c[S+852>>2]|0))}d=c[S+772>>2]|0;if((d|0)>0){f=0;do{e=c[S+780>>2]|0;if((c[(c[e+(f*104|0)+4>>2]|0)+16>>2]&1|0)!=0?+g[e+(f*104|0)+88>>2]<=0.0:0){J=e+(f*104|0)+8|0;c[W+32>>2]=1065353216;c[W+32+4>>2]=0;c[W+32+8>>2]=0;g[W+32+12>>2]=0.0;d=c[(c[M>>2]|0)+16>>2]|0;ga=+g[J>>2];K=e+(f*104|0)+12|0;r=c[K>>2]|0;I=e+(f*104|0)+16|0;q=c[I>>2]|0;g[W+160>>2]=ga+-.25;c[W+160+4>>2]=r;c[W+160+8>>2]=q;g[W+160+12>>2]=0.0;fa=(c[j>>2]=r,+g[j>>2])+0.0;ea=(c[j>>2]=q,+g[j>>2])+0.0;g[W+96>>2]=ga+.25;g[W+96+4>>2]=fa;g[W+96+8>>2]=ea;g[W+96+12>>2]=0.0;Vb[d&127](M,W+160|0,W+96|0,W+32|0);d=c[(c[M>>2]|0)+16>>2]|0;q=c[J>>2]|0;ea=+g[K>>2];r=c[I>>2]|0;c[W+160>>2]=q;g[W+160+4>>2]=ea+-.25;c[W+160+8>>2]=r;g[W+160+12>>2]=0.0;fa=(c[j>>2]=q,+g[j>>2])+0.0;ga=(c[j>>2]=r,+g[j>>2])+0.0;g[W+96>>2]=fa;g[W+96+4>>2]=ea+.25;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;Vb[d&127](M,W+160|0,W+96|0,W+32|0);d=c[(c[M>>2]|0)+16>>2]|0;J=c[J>>2]|0;K=c[K>>2]|0;ga=+g[I>>2];c[W+160>>2]=J;c[W+160+4>>2]=K;g[W+160+8>>2]=ga+-.25;g[W+160+12>>2]=0.0;ea=(c[j>>2]=J,+g[j>>2])+0.0;fa=(c[j>>2]=K,+g[j>>2])+0.0;g[W+96>>2]=ea;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga+.25;g[W+96+12>>2]=0.0;Vb[d&127](M,W+160|0,W+96|0,W+32|0);d=c[S+772>>2]|0}f=f+1|0}while((f|0)<(d|0))}}if(L&128|0?(c[S+752>>2]|0)>0:0){e=0;do{f=c[S+760>>2]|0;h=f+(e*60|0)+8|0;c[W+160>>2]=c[h>>2];c[W+160+4>>2]=c[h+4>>2];c[W+160+8>>2]=c[h+8>>2];c[W+160+12>>2]=c[h+12>>2];h=c[f+(e*60|0)+24>>2]|0;if((h|0)>0){d=0;i=+g[W+160>>2];k=+g[W+160+4>>2];m=+g[W+160+8>>2];do{K=c[f+(e*60|0)+28+(d<<2)>>2]|0;ga=+g[f+(e*60|0)+44+(d<<2)>>2];i=+g[K+8>>2]*ga+i;k=ga*+g[K+12>>2]+k;m=ga*+g[K+16>>2]+m;g[W+160+8>>2]=m;d=d+1|0}while((d|0)!=(h|0));g[W+160>>2]=i;g[W+160+4>>2]=k}Sb[c[(c[M>>2]|0)+48>>2]&127](M,W+160|0,c[f+(e*60|0)+4>>2]|0);e=e+1|0}while((e|0)<(c[S+752>>2]|0))}if(L&512|0){K=c[S+988>>2]|0;c[W+160>>2]=1065353216;c[W+160+4>>2]=0;c[W+160+8>>2]=1065353216;g[W+160+12>>2]=0.0;c[W+96>>2]=1065353216;c[W+96+4>>2]=1065353216;c[W+96+8>>2]=1065353216;g[W+96+12>>2]=0.0;Qf(M,K,0,W+160|0,W+96|0)}if(L&1024|0){K=c[S+1028>>2]|0;c[W+160>>2]=0;c[W+160+4>>2]=1065353216;c[W+160+8>>2]=0;g[W+160+12>>2]=0.0;c[W+96>>2]=1065353216;c[W+96+4>>2]=0;c[W+96+8>>2]=0;g[W+96+12>>2]=0.0;Qf(M,K,0,W+160|0,W+96|0)}if(L&2048|0){K=c[S+1068>>2]|0;c[W+160>>2]=0;c[W+160+4>>2]=1065353216;c[W+160+8>>2]=1065353216;g[W+160+12>>2]=0.0;c[W+96>>2]=1065353216;c[W+96+4>>2]=0;c[W+96+8>>2]=0;g[W+96+12>>2]=0.0;Qf(M,K,0,W+160|0,W+96|0)}a:do if(L&4096|0?(c[S+912>>2]|0)>0:0){d=0;while(1){e=c[(c[S+920>>2]|0)+(d<<2)>>2]|0;switch(xb[c[(c[e>>2]|0)+20>>2]&127](e)|0){case 0:{L=ui(e+4|0)|0;ga=+g[e+28>>2];fa=+g[e+32>>2];ea=+g[e+36>>2];da=ga*+g[L+16>>2]+fa*+g[L+20>>2]+ea*+g[L+24>>2]+ +g[L+52>>2];ca=ga*+g[L+32>>2]+fa*+g[L+36>>2]+ea*+g[L+40>>2]+ +g[L+56>>2];g[W+32>>2]=ga*+g[L>>2]+fa*+g[L+4>>2]+ea*+g[L+8>>2]+ +g[L+48>>2];g[W+32+4>>2]=da;g[W+32+8>>2]=ca;g[W+32+12>>2]=0.0;L=ui(e+16|0)|0;ca=+g[e+44>>2];da=+g[e+48>>2];ea=+g[e+52>>2];fa=ca*+g[L+16>>2]+da*+g[L+20>>2]+ea*+g[L+24>>2]+ +g[L+52>>2];ga=ca*+g[L+32>>2]+da*+g[L+36>>2]+ea*+g[L+40>>2]+ +g[L+56>>2];g[W+16>>2]=ca*+g[L>>2]+da*+g[L+4>>2]+ea*+g[L+8>>2]+ +g[L+48>>2];g[W+16+4>>2]=fa;g[W+16+8>>2]=ga;g[W+16+12>>2]=0.0;L=c[(c[M>>2]|0)+16>>2]|0;K=(ui(e+4|0)|0)+48|0;c[W+160>>2]=1065353216;c[W+160+4>>2]=1065353216;c[W+160+8>>2]=0;g[W+160+12>>2]=0.0;Vb[L&127](M,K,W+32|0,W+160|0);K=c[(c[M>>2]|0)+16>>2]|0;L=(ui(e+16|0)|0)+48|0;c[W+160>>2]=0;c[W+160+4>>2]=1065353216;c[W+160+8>>2]=1065353216;g[W+160+12>>2]=0.0;Vb[K&127](M,L,W+16|0,W+160|0);c[W>>2]=1065353216;c[W+4>>2]=1065353216;c[W+8>>2]=0;g[W+12>>2]=0.0;L=c[(c[M>>2]|0)+16>>2]|0;ga=+g[W+32>>2];K=c[W+32+4>>2]|0;J=c[W+32+8>>2]|0;g[W+160>>2]=ga+-.25;c[W+160+4>>2]=K;c[W+160+8>>2]=J;g[W+160+12>>2]=0.0;fa=(c[j>>2]=K,+g[j>>2])+0.0;ea=(c[j>>2]=J,+g[j>>2])+0.0;g[W+96>>2]=ga+.25;g[W+96+4>>2]=fa;g[W+96+8>>2]=ea;g[W+96+12>>2]=0.0;Vb[L&127](M,W+160|0,W+96|0,W);L=c[(c[M>>2]|0)+16>>2]|0;J=c[W+32>>2]|0;ea=+g[W+32+4>>2];K=c[W+32+8>>2]|0;c[W+160>>2]=J;g[W+160+4>>2]=ea+-.25;c[W+160+8>>2]=K;g[W+160+12>>2]=0.0;fa=(c[j>>2]=J,+g[j>>2])+0.0;ga=(c[j>>2]=K,+g[j>>2])+0.0;g[W+96>>2]=fa;g[W+96+4>>2]=ea+.25;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;Vb[L&127](M,W+160|0,W+96|0,W);L=c[(c[M>>2]|0)+16>>2]|0;K=c[W+32>>2]|0;J=c[W+32+4>>2]|0;ga=+g[W+32+8>>2];c[W+160>>2]=K;c[W+160+4>>2]=J;g[W+160+8>>2]=ga+-.25;g[W+160+12>>2]=0.0;ea=(c[j>>2]=K,+g[j>>2])+0.0;fa=(c[j>>2]=J,+g[j>>2])+0.0;g[W+96>>2]=ea;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga+.25;g[W+96+12>>2]=0.0;Vb[L&127](M,W+160|0,W+96|0,W);c[W>>2]=0;c[W+4>>2]=1065353216;c[W+8>>2]=1065353216;g[W+12>>2]=0.0;L=c[(c[M>>2]|0)+16>>2]|0;ga=+g[W+16>>2];J=c[W+16+4>>2]|0;K=c[W+16+8>>2]|0;g[W+160>>2]=ga+-.25;c[W+160+4>>2]=J;c[W+160+8>>2]=K;g[W+160+12>>2]=0.0;fa=(c[j>>2]=J,+g[j>>2])+0.0;ea=(c[j>>2]=K,+g[j>>2])+0.0;g[W+96>>2]=ga+.25;g[W+96+4>>2]=fa;g[W+96+8>>2]=ea;g[W+96+12>>2]=0.0;Vb[L&127](M,W+160|0,W+96|0,W);L=c[(c[M>>2]|0)+16>>2]|0;K=c[W+16>>2]|0;ea=+g[W+16+4>>2];J=c[W+16+8>>2]|0;c[W+160>>2]=K;g[W+160+4>>2]=ea+-.25;c[W+160+8>>2]=J;g[W+160+12>>2]=0.0;fa=(c[j>>2]=K,+g[j>>2])+0.0;ga=(c[j>>2]=J,+g[j>>2])+0.0;g[W+96>>2]=fa;g[W+96+4>>2]=ea+.25;g[W+96+8>>2]=ga;g[W+96+12>>2]=0.0;Vb[L&127](M,W+160|0,W+96|0,W);L=c[(c[M>>2]|0)+16>>2]|0;J=c[W+16>>2]|0;K=c[W+16+4>>2]|0;ga=+g[W+16+8>>2];c[W+160>>2]=J;c[W+160+4>>2]=K;g[W+160+8>>2]=ga+-.25;g[W+160+12>>2]=0.0;ea=(c[j>>2]=J,+g[j>>2])+0.0;fa=(c[j>>2]=K,+g[j>>2])+0.0;g[W+96>>2]=ea;g[W+96+4>>2]=fa;g[W+96+8>>2]=ga+.25;g[W+96+12>>2]=0.0;Vb[L&127](M,W+160|0,W+96|0,W);break}case 1:{L=(ui(e+4|0)|0)+48|0;c[W+160>>2]=c[L>>2];c[W+160+4>>2]=c[L+4>>2];c[W+160+8>>2]=c[L+8>>2];c[W+160+12>>2]=c[L+12>>2];L=(ui(e+16|0)|0)+48|0;c[W+96>>2]=c[L>>2];c[W+96+4>>2]=c[L+4>>2];c[W+96+8>>2]=c[L+8>>2];c[W+96+12>>2]=c[L+12>>2];L=ui(e+4|0)|0;aa=+g[e+28>>2];$=+g[e+32>>2];da=+g[e+36>>2];ba=+g[L>>2]*aa+ +g[L+4>>2]*$+ +g[L+8>>2]*da;ca=aa*+g[L+16>>2]+$*+g[L+20>>2]+da*+g[L+24>>2];da=aa*+g[L+32>>2]+$*+g[L+36>>2]+da*+g[L+40>>2];L=ui(e+16|0)|0;$=+g[e+44>>2];aa=+g[e+48>>2];ga=+g[e+52>>2];ea=+g[L>>2]*$+ +g[L+4>>2]*aa+ +g[L+8>>2]*ga;fa=$*+g[L+16>>2]+aa*+g[L+20>>2]+ga*+g[L+24>>2];ga=$*+g[L+32>>2]+aa*+g[L+36>>2]+ga*+g[L+40>>2];L=c[(c[M>>2]|0)+16>>2]|0;aa=ca*10.0+ +g[W+160+4>>2];$=da*10.0+ +g[W+160+8>>2];g[W+32>>2]=ba*10.0+ +g[W+160>>2];g[W+32+4>>2]=aa;g[W+32+8>>2]=$;g[W+32+12>>2]=0.0;c[W+16>>2]=1065353216;c[W+16+4>>2]=1065353216;c[W+16+8>>2]=0;g[W+16+12>>2]=0.0;Vb[L&127](M,W+160|0,W+32|0,W+16|0);L=c[(c[M>>2]|0)+16>>2]|0;$=fa*10.0+ +g[W+160+4>>2];aa=ga*10.0+ +g[W+160+8>>2];g[W+32>>2]=ea*10.0+ +g[W+160>>2];g[W+32+4>>2]=$;g[W+32+8>>2]=aa;g[W+32+12>>2]=0.0;c[W+16>>2]=1065353216;c[W+16+4>>2]=1065353216;c[W+16+8>>2]=0;g[W+16+12>>2]=0.0;Vb[L&127](M,W+160|0,W+32|0,W+16|0);L=c[(c[M>>2]|0)+16>>2]|0;ca=ca*10.0+ +g[W+96+4>>2];da=da*10.0+ +g[W+96+8>>2];g[W+32>>2]=ba*10.0+ +g[W+96>>2];g[W+32+4>>2]=ca;g[W+32+8>>2]=da;g[W+32+12>>2]=0.0;c[W+16>>2]=0;c[W+16+4>>2]=1065353216;c[W+16+8>>2]=1065353216;g[W+16+12>>2]=0.0;Vb[L&127](M,W+96|0,W+32|0,W+16|0);L=c[(c[M>>2]|0)+16>>2]|0;fa=fa*10.0+ +g[W+96+4>>2];ga=ga*10.0+ +g[W+96+8>>2];g[W+32>>2]=ea*10.0+ +g[W+96>>2];g[W+32+4>>2]=fa;g[W+32+8>>2]=ga;g[W+32+12>>2]=0.0;c[W+16>>2]=0;c[W+16+4>>2]=1065353216;c[W+16+8>>2]=1065353216;g[W+16+12>>2]=0.0;Vb[L&127](M,W+96|0,W+32|0,W+16|0);break}default:{}}d=d+1|0;if((d|0)>=(c[S+912>>2]|0))break a}}while(0)}d=c[b+72>>2]|0;if(d|0?(xb[c[(c[d>>2]|0)+56>>2]&127](d)|0)&2|0:0){if(a[b+368>>0]|0){L=c[b+72>>2]|0;M=c[S+988>>2]|0;c[W+160>>2]=1065353216;c[W+160+4>>2]=0;c[W+160+8>>2]=1065353216;g[W+160+12>>2]=0.0;c[W+96>>2]=1065353216;c[W+96+4>>2]=1065353216;c[W+96+8>>2]=1065353216;g[W+96+12>>2]=0.0;Qf(L,M,0,W+160|0,W+96|0)}if(a[b+369>>0]|0){L=c[b+72>>2]|0;M=c[S+1028>>2]|0;c[W+160>>2]=0;c[W+160+4>>2]=1065353216;c[W+160+8>>2]=0;g[W+160+12>>2]=0.0;c[W+96>>2]=1065353216;c[W+96+4>>2]=0;c[W+96+8>>2]=0;g[W+96+12>>2]=0.0;Qf(L,M,0,W+160|0,W+96|0)}if(a[b+370>>0]|0){M=c[b+72>>2]|0;S=c[S+1068>>2]|0;c[W+160>>2]=0;c[W+160+4>>2]=1065353216;c[W+160+8>>2]=1065353216;g[W+160+12>>2]=0.0;c[W+96>>2]=1065353216;c[W+96+4>>2]=0;c[W+96+8>>2]=0;g[W+96+12>>2]=0.0;Qf(M,S,0,W+160|0,W+96|0)}}N=N+1|0}while((N|0)<(c[b+348>>2]|0));l=W;return}function gc(b,d,e){b=b|0;d=+d;e=+e;var f=0,h=0.0,i=0,j=0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0.0,Q=0.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.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.0,xa=0,ya=0,za=0.0,Aa=0.0,Ba=0.0,Ca=0.0,Da=0.0,Ea=0.0,Fa=0.0,Ga=0.0,Ha=0.0,Ia=0.0,Ja=0.0,Ka=0.0,La=0.0,Ma=0.0,Na=0.0,Oa=0.0,Pa=0.0,Qa=0.0,Ra=0.0,Sa=0.0,Ta=0.0,Ua=0.0,Va=0.0,Wa=0.0,Xa=0.0,Ya=0.0,Za=0.0,_a=0.0,$a=0.0,ab=0.0,bb=0.0,cb=0.0,db=0.0,eb=0.0,fb=0.0,gb=0.0,hb=0.0,ib=0.0,jb=0.0,kb=0.0,lb=0.0;ua=l;l=l+208|0;ta=+g[b+512>>2];ha=c[b+192>>2]|0;ga=+nb[c[(c[ha>>2]|0)+48>>2]&15](ha);a[ua+48+16>>0]=1;ha=ua+48+12|0;c[ha>>2]=0;c[ua+48+4>>2]=0;c[ua+48+8>>2]=0;a[ua+48+36>>0]=1;ia=ua+48+32|0;c[ia>>2]=0;c[ua+48+24>>2]=0;c[ua+48+28>>2]=0;a[ua+48+56>>0]=1;c[ua+48+52>>2]=0;c[ua+48+44>>2]=0;c[ua+48+48>>2]=0;ja=ua+48+76|0;a[ja>>0]=1;ka=ua+48+72|0;c[ka>>2]=0;la=ua+48+64|0;c[la>>2]=0;ma=ua+48+68|0;c[ma>>2]=0;na=ua+48+96|0;a[na>>0]=1;oa=ua+48+92|0;c[oa>>2]=0;pa=ua+48+84|0;c[pa>>2]=0;qa=ua+48+88|0;c[qa>>2]=0;a[ua+48+116>>0]=1;ra=ua+48+112|0;c[ra>>2]=0;c[ua+48+104>>2]=0;c[ua+48+108>>2]=0;sa=c[b+872>>2]|0;if((sa|0)<=0){Ph(ua+48|0);l=ua;return}fa=0;f=0;do{ea=c[b+880>>2]|0;da=ea+(fa*104|0)|0;ca=c[da>>2]|0;if(!(c[ca+204>>2]&4)){switch(c[ca+252>>2]|0){case 2:{Q=+g[ca+392>>2];n=+g[ea+(fa*104|0)+84>>2];H=+g[ca+396>>2];N=+g[ea+(fa*104|0)+80>>2];e=+g[ea+(fa*104|0)+76>>2];O=+g[ca+388>>2];j=0;k=ca;h=ta*(Q*n-H*N+ +g[ca+372>>2]);n=ta*(+g[ca+376>>2]+(H*e-n*O));e=ta*(N*O-Q*e+ +g[ca+380>>2]);break}case 64:{ba=c[(c[ca+324>>2]|0)+468>>2]|0;m=c[ua+48+4>>2]|0;if((ba+6|0)>(m|0)){if((c[ua+48+8>>2]|0)<(ba+6|0)){if(!(ba+6|0)){f=0;j=m}else{c[6995]=(c[6995]|0)+1;f=sc((ba+6<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=c[ua+48+4>>2]|0}k=c[ha>>2]|0;if((j|0)>0){i=0;do{c[f+(i<<2)>>2]=c[k+(i<<2)>>2];i=i+1|0}while((i|0)!=(j|0));if(a[ua+48+16>>0]|0)ya=18}else if(!((k|0)==0|(a[ua+48+16>>0]|0)==0))ya=18;if((ya|0)==18){ya=0;c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}a[ua+48+16>>0]=1;c[ha>>2]=f;c[ua+48+8>>2]=ba+6}else f=c[ha>>2]|0;Yk(f+(m<<2)|0,0,ba+6-m<<2|0)|0}c[ua+48+4>>2]=ba+6;m=c[ua+48+24>>2]|0;if((ba+6|0)>(m|0)){if((c[ua+48+28>>2]|0)<(ba+6|0)){if(!(ba+6|0)){f=0;j=m}else{c[6995]=(c[6995]|0)+1;f=sc((ba+6<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=c[ua+48+24>>2]|0}k=c[ia>>2]|0;if((j|0)>0){i=0;do{c[f+(i<<2)>>2]=c[k+(i<<2)>>2];i=i+1|0}while((i|0)!=(j|0));if(a[ua+48+36>>0]|0)ya=32}else if(!((k|0)==0|(a[ua+48+36>>0]|0)==0))ya=32;if((ya|0)==32){ya=0;c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}a[ua+48+36>>0]=1;c[ia>>2]=f;c[ua+48+28>>2]=ba+6}else f=c[ia>>2]|0;Yk(f+(m<<2)|0,0,ba+6-m<<2|0)|0}c[ua+48+24>>2]=ba+6;$=c[ha>>2]|0;I=c[ca+324>>2]|0;J=c[ca+328>>2]|0;u=c[ea+(fa*104|0)+24>>2]|0;aa=ea+(fa*104|0)+4|0;K=c[I+132>>2]|0;v=c[I+468>>2]|0;f=c[pa>>2]|0;if((f|0)<((K*3|0)+3|0)){if((c[qa>>2]|0)<((K*3|0)+3|0)){if(!((K*3|0)+3|0)){i=0;k=f}else{c[6995]=(c[6995]|0)+1;i=sc(((K*3|0)+3<<4|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}k=c[pa>>2]|0}if((k|0)>0){j=0;do{_=i+(j<<4)|0;Z=(c[oa>>2]|0)+(j<<4)|0;c[_>>2]=c[Z>>2];c[_+4>>2]=c[Z+4>>2];c[_+8>>2]=c[Z+8>>2];c[_+12>>2]=c[Z+12>>2];j=j+1|0}while((j|0)!=(k|0))}j=c[oa>>2]|0;if(j|0){if(a[na>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[oa>>2]=0}a[na>>0]=1;c[oa>>2]=i;c[qa>>2]=(K*3|0)+3}do{_=(c[oa>>2]|0)+(f<<4)|0;c[_>>2]=c[ua>>2];c[_+4>>2]=c[ua+4>>2];c[_+8>>2]=c[ua+8>>2];c[_+12>>2]=c[ua+12>>2];f=f+1|0}while((f|0)!=((K*3|0)+3|0))}c[pa>>2]=(K*3|0)+3;f=c[ua+48+104>>2]|0;if((f|0)<=(K+1|0)&(f|0)<=(K|0)){if((c[ua+48+108>>2]|0)<=(K|0)){if(!(K+1|0)){i=0;k=f}else{c[6995]=(c[6995]|0)+1;i=sc(((K+1|0)*48|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}k=c[ua+48+104>>2]|0}if((k|0)>0){j=0;do{Y=i+(j*48|0)|0;Z=c[ra>>2]|0;_=Z+(j*48|0)|0;c[Y>>2]=c[_>>2];c[Y+4>>2]=c[_+4>>2];c[Y+8>>2]=c[_+8>>2];c[Y+12>>2]=c[_+12>>2];Y=Z+(j*48|0)+16|0;_=i+(j*48|0)+16|0;c[_>>2]=c[Y>>2];c[_+4>>2]=c[Y+4>>2];c[_+8>>2]=c[Y+8>>2];c[_+12>>2]=c[Y+12>>2];Z=Z+(j*48|0)+32|0;_=i+(j*48|0)+32|0;c[_>>2]=c[Z>>2];c[_+4>>2]=c[Z+4>>2];c[_+8>>2]=c[Z+8>>2];c[_+12>>2]=c[Z+12>>2];j=j+1|0}while((j|0)!=(k|0))}j=c[ra>>2]|0;if(j|0){if(a[ua+48+116>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[ra>>2]=0}a[ua+48+116>>0]=1;c[ra>>2]=i;c[ua+48+108>>2]=K+1}do{_=c[ra>>2]|0;Z=_+(f*48|0)|0;c[Z>>2]=c[ua>>2];c[Z+4>>2]=c[ua+4>>2];c[Z+8>>2]=c[ua+8>>2];c[Z+12>>2]=c[ua+12>>2];Z=_+(f*48|0)+16|0;c[Z>>2]=c[ua+16>>2];c[Z+4>>2]=c[ua+16+4>>2];c[Z+8>>2]=c[ua+16+8>>2];c[Z+12>>2]=c[ua+16+12>>2];_=_+(f*48|0)+32|0;c[_>>2]=c[ua+32>>2];c[_+4>>2]=c[ua+32+4>>2];c[_+8>>2]=c[ua+32+8>>2];c[_+12>>2]=c[ua+32+12>>2];f=f+1|0}while((f|0)!=(K+1|0))}c[ua+48+104>>2]=K+1;z=c[oa>>2]|0;A=z+(K+1<<4)+(K+1<<4)|0;m=c[la>>2]|0;if((v|0)>(m|0)){if((c[ma>>2]|0)<(v|0)){if(!v){f=0;j=m}else{c[6995]=(c[6995]|0)+1;f=sc((v<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}j=c[la>>2]|0}k=c[ka>>2]|0;if((j|0)>0){i=0;do{c[f+(i<<2)>>2]=c[k+(i<<2)>>2];i=i+1|0}while((i|0)!=(j|0));if(a[ja>>0]|0)ya=74}else if(!((k|0)==0|(a[ja>>0]|0)==0))ya=74;if((ya|0)==74){ya=0;c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}a[ja>>0]=1;c[ka>>2]=f;c[ma>>2]=v}else f=c[ka>>2]|0;Yk(f+(m<<2)|0,0,v-m<<2|0)|0}c[la>>2]=v;y=(v|0)>0?c[ka>>2]|0:0;x=c[ra>>2]|0;O=+g[u+8>>2]-+g[I+12>>2];Q=+g[u+12>>2]-+g[I+16>>2];N=+g[u+16>>2]-+g[I+20>>2];E=+g[I+28>>2];G=+g[I+32>>2];t=+g[I+36>>2];C=+g[I+40>>2];H=E*(2.0/(E*E+G*G+t*t+C*C));F=G*(2.0/(E*E+G*G+t*t+C*C));B=t*(2.0/(E*E+G*G+t*t+C*C));g[x>>2]=1.0-(G*F+t*B);g[x+4>>2]=E*F-C*B;g[x+8>>2]=E*B+C*F;g[x+12>>2]=0.0;g[x+16>>2]=E*F+C*B;g[x+20>>2]=1.0-(E*H+t*B);g[x+24>>2]=G*B-C*H;g[x+28>>2]=0.0;g[x+32>>2]=E*B-C*F;g[x+36>>2]=G*B+C*H;g[x+40>>2]=1.0-(E*H+G*F);g[x+44>>2]=0.0;_=ea+(fa*104|0)+12|0;F=+g[_>>2];Z=ea+(fa*104|0)+8|0;G=+g[Z>>2];H=+g[aa>>2];g[$>>2]=Q*F-N*G+0.0;g[$+4>>2]=N*H-O*F+0.0;g[$+8>>2]=O*G-Q*H+0.0;c[$+12>>2]=c[aa>>2];c[$+16>>2]=c[Z>>2];c[$+20>>2]=c[_>>2];H=O*+g[x+16>>2]+Q*+g[x+20>>2]+N*+g[x+24>>2];G=O*+g[x+32>>2]+Q*+g[x+36>>2]+N*+g[x+40>>2];g[z>>2]=O*+g[x>>2]+Q*+g[x+4>>2]+N*+g[x+8>>2];g[z+4>>2]=H;g[z+8>>2]=G;g[z+12>>2]=0.0;G=+g[aa>>2];H=+g[Z>>2];N=+g[_>>2];Q=G*+g[x+16>>2]+H*+g[x+20>>2]+N*+g[x+24>>2];O=G*+g[x+32>>2]+H*+g[x+36>>2]+N*+g[x+40>>2];g[z+(K+1<<4)>>2]=+g[x>>2]*G+ +g[x+4>>2]*H+ +g[x+8>>2]*N;g[z+(K+1<<4)+4>>2]=Q;g[z+(K+1<<4)+8>>2]=O;g[z+(K+1<<4)+12>>2]=0.0;O=+g[x+16>>2]*0.0+ +g[x+20>>2]*0.0+ +g[x+24>>2]*0.0;Q=+g[x+32>>2]*0.0+ +g[x+36>>2]*0.0+ +g[x+40>>2]*0.0;g[A>>2]=+g[x>>2]*0.0+ +g[x+4>>2]*0.0+ +g[x+8>>2]*0.0;g[A+4>>2]=O;g[A+8>>2]=Q;g[A+12>>2]=0.0;if((v|0)>0)Yk($+24|0,0,(((v+5|0)>6?v+5|0:6)<<2)+-20|0)|0;if((J|0)>-1&(K|0)>0){w=0;f=c[I+140>>2]|0;while(1){q=+g[f+(w*608|0)+336>>2];o=+g[f+(w*608|0)+340>>2];F=+g[f+(w*608|0)+344>>2];N=+g[f+(w*608|0)+348>>2];p=q*(2.0/(q*q+o*o+F*F+N*N));Q=o*(2.0/(q*q+o*o+F*F+N*N));r=F*(2.0/(q*q+o*o+F*F+N*N));B=1.0-(o*Q+F*r);C=q*Q-N*r;e=q*r+N*Q;E=q*Q+N*r;F=1.0-(q*p+F*r);h=o*r-N*p;G=q*r-N*Q;N=o*r+N*p;Q=1.0-(q*p+o*Q);i=(c[f+(w*608|0)+20>>2]|0)+1|0;o=+g[x+(i*48|0)>>2];p=+g[x+(i*48|0)+16>>2];q=+g[x+(i*48|0)+32>>2];r=+g[x+(i*48|0)+4>>2];s=+g[x+(i*48|0)+20>>2];t=+g[x+(i*48|0)+36>>2];n=+g[x+(i*48|0)+8>>2];O=+g[x+(i*48|0)+24>>2];H=+g[x+(i*48|0)+40>>2];f=w;w=w+1|0;g[x+(w*48|0)>>2]=q*e+(p*C+o*B);g[x+(w*48|0)+4>>2]=e*t+(s*C+r*B);g[x+(w*48|0)+8>>2]=B*n+C*O+e*H;g[x+(w*48|0)+12>>2]=0.0;g[x+(w*48|0)+16>>2]=q*h+(o*E+p*F);g[x+(w*48|0)+20>>2]=t*h+(r*E+s*F);g[x+(w*48|0)+24>>2]=E*n+F*O+h*H;g[x+(w*48|0)+28>>2]=0.0;g[x+(w*48|0)+32>>2]=o*G+p*N+q*Q;g[x+(w*48|0)+36>>2]=r*G+s*N+t*Q;g[x+(w*48|0)+40>>2]=G*n+N*O+Q*H;g[x+(w*48|0)+44>>2]=0.0;u=z+(K+1<<4)+(i<<4)|0;H=+g[u>>2];O=+g[u+4>>2];n=+g[u+8>>2];u=z+(K+1<<4)+(w<<4)|0;g[u>>2]=B*H+C*O+e*n;g[u+4>>2]=E*H+F*O+h*n;g[u+8>>2]=G*H+N*O+Q*n;g[u+12>>2]=0.0;n=+g[A+(i<<4)>>2];O=+g[A+(i<<4)+4>>2];H=+g[A+(i<<4)+8>>2];v=A+(w<<4)|0;g[v>>2]=B*n+C*O+e*H;g[v+4>>2]=E*n+F*O+h*H;g[v+8>>2]=G*n+N*O+Q*H;g[v+12>>2]=0.0;H=+g[z+(i<<4)>>2];O=+g[z+(i<<4)+4>>2];n=+g[z+(i<<4)+8>>2];i=c[I+140>>2]|0;e=B*H+C*O+e*n-+g[i+(f*608|0)+352>>2];h=E*H+F*O+h*n-+g[i+(f*608|0)+356>>2];n=G*H+N*O+Q*n-+g[i+(f*608|0)+360>>2];i=z+(w<<4)|0;g[i>>2]=e;j=z+(w<<4)+4|0;g[j>>2]=h;k=z+(w<<4)+8|0;g[k>>2]=n;g[z+(w<<4)+12>>2]=0.0;m=c[I+140>>2]|0;switch(c[m+(f*608|0)+500>>2]|0){case 0:{Q=+g[m+(f*608|0)+140>>2];N=+g[m+(f*608|0)+144>>2];O=+g[m+(f*608|0)+136>>2];Q=(Q*n-N*h+ +g[m+(f*608|0)+152>>2])*+g[u>>2]+(N*e-n*O+ +g[m+(f*608|0)+156>>2])*+g[u+4>>2]+(h*O-Q*e+ +g[m+(f*608|0)+160>>2])*+g[u+8>>2];Y=y+(c[m+(f*608|0)+328>>2]<<2)|0;g[Y>>2]=Q;g[Y>>2]=Q+(+g[v>>2]*+g[m+(f*608|0)+136>>2]+ +g[v+4>>2]*+g[m+(f*608|0)+140>>2]+ +g[v+8>>2]*+g[m+(f*608|0)+144>>2]);break}case 1:{g[y+(c[m+(f*608|0)+328>>2]<<2)>>2]=+g[u>>2]*+g[m+(f*608|0)+152>>2]+ +g[u+4>>2]*+g[m+(f*608|0)+156>>2]+ +g[u+8>>2]*+g[m+(f*608|0)+160>>2];break}case 2:{G=+g[m+(f*608|0)+140>>2];N=+g[m+(f*608|0)+144>>2];Q=+g[m+(f*608|0)+136>>2];Y=c[m+(f*608|0)+328>>2]|0;g[y+(Y<<2)>>2]=(G*n-N*h+ +g[m+(f*608|0)+152>>2])*+g[u>>2]+(N*e-n*Q+ +g[m+(f*608|0)+156>>2])*+g[u+4>>2]+(h*Q-G*e+ +g[m+(f*608|0)+160>>2])*+g[u+8>>2];G=+g[m+(f*608|0)+172>>2];Q=+g[k>>2];N=+g[m+(f*608|0)+176>>2];H=+g[j>>2];O=+g[i>>2];F=+g[m+(f*608|0)+168>>2];g[y+(Y+1<<2)>>2]=(G*Q-N*H+ +g[m+(f*608|0)+184>>2])*+g[u>>2]+(N*O-Q*F+ +g[m+(f*608|0)+188>>2])*+g[u+4>>2]+(H*F-G*O+ +g[m+(f*608|0)+192>>2])*+g[u+8>>2];O=+g[m+(f*608|0)+204>>2];G=+g[k>>2];F=+g[m+(f*608|0)+208>>2];H=+g[j>>2];Q=+g[i>>2];N=+g[m+(f*608|0)+200>>2];g[y+(Y+2<<2)>>2]=(O*G-F*H+ +g[m+(f*608|0)+216>>2])*+g[u>>2]+(F*Q-G*N+ +g[m+(f*608|0)+220>>2])*+g[u+4>>2]+(H*N-O*Q+ +g[m+(f*608|0)+224>>2])*+g[u+8>>2];m=c[I+140>>2]|0;Y=c[m+(f*608|0)+328>>2]|0;g[y+(Y<<2)>>2]=+g[y+(Y<<2)>>2]+(+g[v>>2]*+g[m+(f*608|0)+136>>2]+ +g[v+4>>2]*+g[m+(f*608|0)+140>>2]+ +g[v+8>>2]*+g[m+(f*608|0)+144>>2]);g[y+(Y+1<<2)>>2]=+g[y+(Y+1<<2)>>2]+(+g[v>>2]*+g[m+(f*608|0)+168>>2]+ +g[v+4>>2]*+g[m+(f*608|0)+172>>2]+ +g[v+8>>2]*+g[m+(f*608|0)+176>>2]);g[y+(Y+2<<2)>>2]=+g[y+(Y+2<<2)>>2]+(+g[v>>2]*+g[m+(f*608|0)+200>>2]+ +g[v+4>>2]*+g[m+(f*608|0)+204>>2]+ +g[v+8>>2]*+g[m+(f*608|0)+208>>2]);break}case 3:{Q=+g[m+(f*608|0)+140>>2];N=+g[m+(f*608|0)+144>>2];O=+g[m+(f*608|0)+136>>2];Y=c[m+(f*608|0)+328>>2]|0;g[y+(Y<<2)>>2]=(Q*n-N*h)*+g[u>>2]+ +g[u+4>>2]*(N*e-n*O)+(h*O-Q*e)*+g[u+8>>2];g[y+(Y+1<<2)>>2]=+g[u>>2]*+g[m+(f*608|0)+184>>2]+ +g[u+4>>2]*+g[m+(f*608|0)+188>>2]+ +g[u+8>>2]*+g[m+(f*608|0)+192>>2];g[y+(Y+2<<2)>>2]=+g[u>>2]*+g[m+(f*608|0)+216>>2]+ +g[u+4>>2]*+g[m+(f*608|0)+220>>2]+ +g[u+8>>2]*+g[m+(f*608|0)+224>>2];break}default:{}}if((w|0)==(K|0))break;else f=m}if((J|0)!=-1){f=J;do{k=c[m+(f*608|0)+492>>2]|0;if((k|0)>0){j=c[m+(f*608|0)+328>>2]|0;i=0;do{c[$+(i+6+j<<2)>>2]=c[y+(j+i<<2)>>2];i=i+1|0}while((i|0)!=(k|0))}f=c[m+(f*608|0)+20>>2]|0}while((f|0)!=-1)}}f=c[ia>>2]|0;X=c[ca+324>>2]|0;I=c[ha>>2]|0;Y=c[X+132>>2]|0;u=c[X+468>>2]|0;v=c[la>>2]|0;if((u|0)>(v|0)){if((c[ma>>2]|0)<(u|0)){if(!u){i=0;k=v}else{c[6995]=(c[6995]|0)+1;i=sc((u<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}k=c[la>>2]|0}m=c[ka>>2]|0;if((k|0)>0){j=0;do{c[i+(j<<2)>>2]=c[m+(j<<2)>>2];j=j+1|0}while((j|0)!=(k|0));if(a[ja>>0]|0)ya=103}else if(!((m|0)==0|(a[ja>>0]|0)==0))ya=103;if((ya|0)==103){ya=0;c[6996]=(c[6996]|0)+1;Cd(c[m+-4>>2]|0)}a[ja>>0]=1;c[ka>>2]=i;c[ma>>2]=u}else i=c[ka>>2]|0;Yk(i+(v<<2)|0,0,u-v<<2|0)|0}c[la>>2]=u;i=c[pa>>2]|0;if((i|0)<((Y<<2)+4|0)){if((c[qa>>2]|0)<((Y<<2)+4|0)){if(!((Y<<2)+4|0)){j=0;m=i}else{c[6995]=(c[6995]|0)+1;j=sc((Y<<2)+4<<4|19)|0;if(!j)j=0;else{c[(j+4+15&-16)+-4>>2]=j;j=j+4+15&-16}m=c[pa>>2]|0}if((m|0)>0){k=0;do{W=j+(k<<4)|0;V=(c[oa>>2]|0)+(k<<4)|0;c[W>>2]=c[V>>2];c[W+4>>2]=c[V+4>>2];c[W+8>>2]=c[V+8>>2];c[W+12>>2]=c[V+12>>2];k=k+1|0}while((k|0)!=(m|0))}k=c[oa>>2]|0;if(k|0){if(a[na>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}c[oa>>2]=0}a[na>>0]=1;c[oa>>2]=j;c[qa>>2]=(Y<<2)+4}do{W=(c[oa>>2]|0)+(i<<4)|0;c[W>>2]=c[ua>>2];c[W+4>>2]=c[ua+4>>2];c[W+8>>2]=c[ua+8>>2];c[W+12>>2]=c[ua+12>>2];i=i+1|0}while((i|0)!=((Y<<2)+4|0))}c[pa>>2]=(Y<<2)+4;i=c[X+468>>2]|0;T=(i|0)==0?0:c[ka>>2]|0;U=c[oa>>2]|0;V=U+((Y<<1)+2<<4)|0;W=c[X+220>>2]|0;if((i|0)>0){R=(c[X+180>>2]|0)+(i+6<<2)|0;S=c[X+200>>2]|0}else{R=0;S=0}if(!(a[X+421>>0]|0)){r=+g[W>>2];s=+g[W+4>>2];t=+g[W+8>>2];B=+g[W+16>>2];C=+g[W+20>>2];E=+g[W+24>>2];F=+g[W+32>>2];H=+g[W+36>>2];O=+g[W+40>>2];G=-+g[I>>2];N=-+g[I+4>>2];Q=-+g[I+8>>2];o=-+g[I+12>>2];p=-+g[I+16>>2];q=-+g[I+20>>2];g[U>>2]=r*o+s*p+t*q;g[U+4>>2]=B*o+C*p+E*q;g[U+8>>2]=F*o+H*p+O*q;g[U+12>>2]=0.0;g[U+16>>2]=r*G+s*N+t*Q;g[U+20>>2]=B*G+C*N+E*Q;g[U+24>>2]=F*G+H*N+O*Q;g[U+28>>2]=0.0}else{c[U>>2]=0;c[U+4>>2]=0;c[U+8>>2]=0;c[U+12>>2]=0;c[U+16>>2]=0;c[U+20>>2]=0;c[U+24>>2]=0;c[U+28>>2]=0}if((Y|0)>0){Yk(U+32|0,0,Y<<5|0)|0;z=c[X+140>>2]|0;x=Y;do{y=x;x=x+-1|0;A=c[z+(x*608|0)+20>>2]|0;r=+g[W+(y*48|0)>>2];s=+g[W+(y*48|0)+4>>2];t=+g[W+(y*48|0)+8>>2];B=+g[W+(y*48|0)+16>>2];C=+g[W+(y*48|0)+20>>2];E=+g[W+(y*48|0)+24>>2];F=+g[W+(y*48|0)+32>>2];G=+g[W+(y*48|0)+36>>2];H=+g[W+(y*48|0)+40>>2];N=+g[z+(x*608|0)+352>>2];O=+g[z+(x*608|0)+356>>2];Q=+g[z+(x*608|0)+360>>2];v=c[z+(x*608|0)+492>>2]|0;w=c[z+(x*608|0)+328>>2]|0;if((v|0)>0){i=0;do{g[T+(w+i<<2)>>2]=+g[I+(i+6+w<<2)>>2]-(+g[z+(x*608|0)+136+(i<<5)+16>>2]*+g[U+(y<<5)>>2]+ +g[z+(x*608|0)+136+(i<<5)+20>>2]*+g[U+(y<<5)+4>>2]+ +g[z+(x*608|0)+136+(i<<5)+24>>2]*+g[U+(y<<5)+8>>2]+(+g[z+(x*608|0)+136+(i<<5)>>2]*+g[U+(y<<5)+16>>2]+ +g[z+(x*608|0)+136+(i<<5)+4>>2]*+g[U+(y<<5)+20>>2]+ +g[z+(x*608|0)+136+(i<<5)+8>>2]*+g[U+(y<<5)+24>>2]));i=i+1|0}while((i|0)!=(v|0));k=R+((P(w,w)|0)<<2)|0;j=0;do{m=ua+(j<<2)|0;g[m>>2]=0.0;u=P(v,j)|0;i=0;e=0.0;do{e=e+ +g[k+(u+i<<2)>>2]*+g[T+(w+i<<2)>>2];i=i+1|0}while((i|0)!=(v|0));g[m>>2]=e;j=j+1|0}while((j|0)!=(v|0));i=0;q=+g[U+(y<<5)>>2];p=+g[U+(y<<5)+4>>2];o=+g[U+(y<<5)+8>>2];n=+g[U+(y<<5)+16>>2];h=+g[U+(y<<5)+20>>2];e=+g[U+(y<<5)+24>>2];do{M=w+i|0;za=+g[ua+(i<<2)>>2];q=za*+g[S+(M<<5)>>2]+q;p=za*+g[S+(M<<5)+4>>2]+p;o=za*+g[S+(M<<5)+8>>2]+o;n=+g[S+(M<<5)+16>>2]*za+n;h=za*+g[S+(M<<5)+20>>2]+h;e=za*+g[S+(M<<5)+24>>2]+e;i=i+1|0}while((i|0)!=(v|0))}else{q=+g[U+(y<<5)>>2];p=+g[U+(y<<5)+4>>2];o=+g[U+(y<<5)+8>>2];n=+g[U+(y<<5)+16>>2];h=+g[U+(y<<5)+20>>2];e=+g[U+(y<<5)+24>>2]}n=O*o-Q*p+n;Q=h+(Q*q-N*o);za=N*p-O*q+e;g[U+(A+1<<5)>>2]=r*q+B*p+F*o+ +g[U+(A+1<<5)>>2];g[U+(A+1<<5)+4>>2]=s*q+C*p+G*o+ +g[U+(A+1<<5)+4>>2];g[U+(A+1<<5)+8>>2]=t*q+E*p+H*o+ +g[U+(A+1<<5)+8>>2];g[U+(A+1<<5)+16>>2]=r*n+B*Q+F*za+ +g[U+(A+1<<5)+16>>2];g[U+(A+1<<5)+20>>2]=s*n+C*Q+G*za+ +g[U+(A+1<<5)+20>>2];g[U+(A+1<<5)+24>>2]=t*n+E*Q+H*za+ +g[U+(A+1<<5)+24>>2]}while((y|0)>1)}if(!(a[X+421>>0]|0)){do if(!(c[X+132>>2]|0)){p=1.0/+g[X+44>>2];e=+g[U+16>>2]/+g[X+48>>2];h=+g[U+24>>2]/+g[X+56>>2];n=+g[U>>2]*p;o=p*+g[U+4>>2];p=p*+g[U+8>>2];q=+g[U+20>>2]/+g[X+52>>2]}else{if(!(a[X+420>>0]|0)){e=0.0;h=0.0;n=0.0;o=0.0;p=0.0;q=0.0;break}Va=+g[X+296>>2];cb=+g[X+316>>2];db=+g[X+300>>2];Ja=+g[X+312>>2];La=+g[X+308>>2];Ua=+g[X+292>>2];Ia=+g[X+276>>2];Ka=+g[X+280>>2];o=+g[X+284>>2];p=1.0/((Va*cb-db*Ja)*Ia+Ka*(db*La-cb*Ua)+(Ja*Ua-Va*La)*o);N=-((Va*cb-db*Ja)*p);Q=-((db*La-cb*Ua)*p);G=-((Ja*Ua-Va*La)*p);Pa=+g[X+372>>2];q=+g[X+376>>2];Na=+g[X+380>>2];Ga=Na*-((La*Ka-Ja*Ia)*p)+(Pa*-((Ja*o-cb*Ka)*p)+q*-((cb*Ia-La*o)*p));r=Na*-((Va*Ia-Ua*Ka)*p)+(Pa*-((db*Ka-Va*o)*p)+q*-((Ua*o-db*Ia)*p));hb=+g[X+388>>2];gb=+g[X+392>>2];ib=+g[X+396>>2];s=hb*-((Ja*o-cb*Ka)*p)+gb*-((cb*Ia-La*o)*p)+ib*-((La*Ka-Ja*Ia)*p);Fa=hb*-((db*Ka-Va*o)*p)+gb*-((Ua*o-db*Ia)*p)+ib*-((Va*Ia-Ua*Ka)*p);bb=+g[X+404>>2];C=+g[X+408>>2];ab=+g[X+412>>2];t=bb*-((Ja*o-cb*Ka)*p)+C*-((cb*Ia-La*o)*p)+ab*-((La*Ka-Ja*Ia)*p);Aa=bb*-((db*Ka-Va*o)*p)+C*-((Ua*o-db*Ia)*p)+ab*-((Va*Ia-Ua*Ka)*p);Sa=+g[X+228>>2];Oa=+g[X+244>>2];Xa=+g[X+260>>2];Ra=+g[X+232>>2];Ma=+g[X+248>>2];Wa=+g[X+264>>2];Ta=+g[X+236>>2];Qa=+g[X+252>>2];Ya=+g[X+268>>2];Ba=(Na*G+(Pa*N+q*Q))*Sa+Ga*Oa+r*Xa+ +g[X+324>>2];jb=(Na*G+(Pa*N+q*Q))*Ra+Ga*Ma+r*Wa+ +g[X+328>>2];r=(Na*G+(Pa*N+q*Q))*Ta+Ga*Qa+r*Ya+ +g[X+332>>2];Ga=(hb*N+gb*Q+ib*G)*Sa+s*Oa+Fa*Xa+ +g[X+340>>2];lb=(hb*N+gb*Q+ib*G)*Ra+s*Ma+Fa*Wa+ +g[X+344>>2];Fa=(hb*N+gb*Q+ib*G)*Ta+s*Qa+Fa*Ya+ +g[X+348>>2];s=Sa*(bb*N+C*Q+ab*G)+Oa*t+Aa*Xa+ +g[X+356>>2];h=(bb*N+C*Q+ab*G)*Ra+t*Ma+Aa*Wa+ +g[X+360>>2];Aa=(bb*N+C*Q+ab*G)*Ta+t*Qa+Aa*Ya+ +g[X+364>>2];t=1.0/(r*(Ga*h-lb*s)+(Ba*(lb*Aa-Fa*h)+jb*(Fa*s-Ga*Aa)));e=(lb*Aa-Fa*h)*t;Da=(Fa*s-Ga*Aa)*t;kb=(Ga*h-lb*s)*t;eb=bb*(jb*Fa-r*lb)*t+(Pa*e+hb*(r*h-jb*Aa)*t);n=C*(jb*Fa-r*lb)*t+(q*e+gb*(r*h-jb*Aa)*t);fb=ab*(jb*Fa-r*lb)*t+(Na*e+ib*(r*h-jb*Aa)*t);H=bb*(r*Ga-Ba*Fa)*t+(Pa*Da+hb*(Ba*Aa-r*s)*t);O=C*(r*Ga-Ba*Fa)*t+(q*Da+gb*(Ba*Aa-r*s)*t);F=ab*(r*Ga-Ba*Fa)*t+(Na*Da+ib*(Ba*Aa-r*s)*t);hb=bb*(Ba*lb-jb*Ga)*t+(Pa*kb+hb*(jb*s-Ba*h)*t);gb=C*(Ba*lb-jb*Ga)*t+(q*kb+gb*(jb*s-Ba*h)*t);ib=ab*(Ba*lb-jb*Ga)*t+(Na*kb+ib*(jb*s-Ba*h)*t);Na=fb*-((La*Ka-Ja*Ia)*p)+(eb*-((Ja*o-cb*Ka)*p)+n*-((cb*Ia-La*o)*p));ab=fb*-((Va*Ia-Ua*Ka)*p)+(eb*-((db*Ka-Va*o)*p)+n*-((Ua*o-db*Ia)*p));q=F*-((La*Ka-Ja*Ia)*p)+(H*-((Ja*o-cb*Ka)*p)+O*-((cb*Ia-La*o)*p));C=F*-((Va*Ia-Ua*Ka)*p)+(H*-((db*Ka-Va*o)*p)+O*-((Ua*o-db*Ia)*p));Pa=ib*-((La*Ka-Ja*Ia)*p)+(hb*-((Ja*o-cb*Ka)*p)+gb*-((cb*Ia-La*o)*p));bb=ib*-((Va*Ia-Ua*Ka)*p)+(hb*-((db*Ka-Va*o)*p)+gb*-((Ua*o-db*Ia)*p));_a=Qa*(ib*G+(hb*N+gb*Q))+(Oa*(fb*G+(eb*N+n*Q))+Ma*(F*G+(H*N+O*Q)));$a=Ya*(ib*G+(hb*N+gb*Q))+(Xa*(fb*G+(eb*N+n*Q))+Wa*(F*G+(H*N+O*Q)));Za=Ta*(ib*G+(hb*N+gb*Q))+(Sa*(fb*G+(eb*N+n*Q))+Ra*(F*G+(H*N+O*Q)))+-1.0;E=+g[U>>2];za=+g[U+4>>2];B=+g[U+8>>2];Ea=+g[U+16>>2];Ca=+g[U+20>>2];Ha=+g[U+24>>2];e=Ha*(jb*Fa-r*lb)*t+(Ea*e+Ca*(r*h-jb*Aa)*t)+(B*ab+(E*(fb*G+(eb*N+n*Q))+za*Na));h=Ha*(Ba*lb-jb*Ga)*t+(Ea*kb+Ca*(jb*s-Ba*h)*t)+(B*bb+(E*(ib*G+(hb*N+gb*Q))+za*Pa));n=Ha*(ib*G+(hb*N+gb*Q))+(Ea*(fb*G+(eb*N+n*Q))+Ca*(F*G+(H*N+O*Q)))+(B*((Ta*bb+(Sa*ab+Ra*C))*N+(Qa*bb+(Oa*ab+Ma*C))*-((Ja*o-cb*Ka)*p)+(Ya*bb+(Xa*ab+Wa*C)+-1.0)*-((db*Ka-Va*o)*p))+(E*($a*-((db*Ka-Va*o)*p)+(_a*-((Ja*o-cb*Ka)*p)+Za*N))+za*((Ya*Pa+(Xa*Na+Wa*q))*-((db*Ka-Va*o)*p)+((Ta*Pa+(Sa*Na+Ra*q))*N+(Qa*Pa+(Oa*Na+Ma*q)+-1.0)*-((Ja*o-cb*Ka)*p)))));o=Ha*Pa+(Ea*Na+Ca*q)+(B*((Ta*bb+(Sa*ab+Ra*C))*Q+(Qa*bb+(Oa*ab+Ma*C))*-((cb*Ia-La*o)*p)+(Ya*bb+(Xa*ab+Wa*C)+-1.0)*-((Ua*o-db*Ia)*p))+(E*($a*-((Ua*o-db*Ia)*p)+(_a*-((cb*Ia-La*o)*p)+Za*Q))+za*((Ya*Pa+(Xa*Na+Wa*q))*-((Ua*o-db*Ia)*p)+((Ta*Pa+(Sa*Na+Ra*q))*Q+(Qa*Pa+(Oa*Na+Ma*q)+-1.0)*-((cb*Ia-La*o)*p)))));p=Ha*bb+(Ea*ab+Ca*C)+(B*((Ta*bb+(Sa*ab+Ra*C))*G+(Qa*bb+(Oa*ab+Ma*C))*-((La*Ka-Ja*Ia)*p)+(Ya*bb+(Xa*ab+Wa*C)+-1.0)*-((Va*Ia-Ua*Ka)*p))+(E*($a*-((Va*Ia-Ua*Ka)*p)+(_a*-((La*Ka-Ja*Ia)*p)+Za*G))+za*((Ya*Pa+(Xa*Na+Wa*q))*-((Va*Ia-Ua*Ka)*p)+((Ta*Pa+(Sa*Na+Ra*q))*G+(Qa*Pa+(Oa*Na+Ma*q)+-1.0)*-((La*Ka-Ja*Ia)*p)))));q=Ha*(r*Ga-Ba*Fa)*t+(Ea*Da+Ca*(Ba*Aa-r*s)*t)+(B*C+(E*(F*G+(H*N+O*Q))+za*q))}while(0);e=-e;g[V>>2]=e;g[U+((Y<<1)+2<<4)+4>>2]=-q;g[U+((Y<<1)+2<<4)+8>>2]=-h;g[U+((Y<<1)+2<<4)+12>>2]=0.0;g[V+16>>2]=-n;g[V+20>>2]=-o;g[V+24>>2]=-p;g[V+28>>2]=0.0}else{c[V>>2]=0;c[V+4>>2]=0;c[V+8>>2]=0;c[V+12>>2]=0;c[V+16>>2]=0;c[V+20>>2]=0;c[V+24>>2]=0;c[V+28>>2]=0;e=0.0}if((Y|0)>0){v=0;K=c[X+140>>2]|0;do{w=v;v=v+1|0;e=+g[W+(v*48|0)>>2];h=+g[W+(v*48|0)+4>>2];n=+g[W+(v*48|0)+8>>2];o=+g[W+(v*48|0)+16>>2];p=+g[W+(v*48|0)+20>>2];q=+g[W+(v*48|0)+24>>2];r=+g[W+(v*48|0)+32>>2];s=+g[W+(v*48|0)+36>>2];t=+g[W+(v*48|0)+40>>2];lb=+g[K+(w*608|0)+352>>2];H=+g[K+(w*608|0)+356>>2];G=+g[K+(w*608|0)+360>>2];x=(c[K+(w*608|0)+20>>2]|0)+1|0;B=+g[V+(x<<5)>>2];C=+g[V+(x<<5)+4>>2];E=+g[V+(x<<5)+8>>2];y=V+(v<<5)|0;g[y>>2]=e*B+h*C+n*E;A=V+(v<<5)+4|0;g[A>>2]=o*B+p*C+q*E;J=V+(v<<5)+8|0;g[J>>2]=r*B+s*C+t*E;g[V+(v<<5)+12>>2]=0.0;ib=+g[V+(x<<5)+16>>2];jb=+g[V+(x<<5)+20>>2];kb=+g[V+(x<<5)+24>>2];F=e*ib+h*jb+n*kb-(H*(r*B+s*C+t*E)-G*(o*B+p*C+q*E));G=o*ib+p*jb+q*kb-(G*(e*B+h*C+n*E)-lb*(r*B+s*C+t*E));H=r*ib+s*jb+t*kb-(lb*(o*B+p*C+q*E)-H*(e*B+h*C+n*E));x=V+(v<<5)+16|0;g[x>>2]=F;z=V+(v<<5)+20|0;g[z>>2]=G;I=V+(v<<5)+24|0;g[I>>2]=H;g[V+(v<<5)+28>>2]=0.0;K=c[X+140>>2]|0;L=c[K+(w*608|0)+492>>2]|0;M=c[K+(w*608|0)+328>>2]|0;if((L|0)>0){i=0;do{u=M+i|0;g[ua+176+(i<<2)>>2]=+g[T+(u<<2)>>2]-(F*+g[S+(u<<5)>>2]+G*+g[S+(u<<5)+4>>2]+H*+g[S+(u<<5)+8>>2]+((e*B+h*C+n*E)*+g[S+(u<<5)+16>>2]+(o*B+p*C+q*E)*+g[S+(u<<5)+20>>2]+(r*B+s*C+t*E)*+g[S+(u<<5)+24>>2]));i=i+1|0}while((i|0)!=(L|0));k=R+((P(M,M)|0)<<2)|0;i=0;do{m=P(i,L)|0;u=f+24+(M<<2)+(i<<2)|0;g[u>>2]=0.0;j=0;e=0.0;do{e=e+ +g[k+(j+m<<2)>>2]*+g[ua+176+(j<<2)>>2];g[u>>2]=e;j=j+1|0}while((j|0)!=(L|0));i=i+1|0}while((i|0)!=(L|0));i=0;e=+g[y>>2];h=+g[A>>2];n=+g[J>>2];o=+g[x>>2];p=+g[z>>2];q=+g[I>>2];do{gb=+g[f+24+(M+i<<2)>>2];hb=gb*+g[K+(w*608|0)+136+(i<<5)+4>>2];ib=gb*+g[K+(w*608|0)+136+(i<<5)+8>>2];jb=gb*+g[K+(w*608|0)+136+(i<<5)+16>>2];kb=gb*+g[K+(w*608|0)+136+(i<<5)+20>>2];lb=gb*+g[K+(w*608|0)+136+(i<<5)+24>>2];e=+g[K+(w*608|0)+136+(i<<5)>>2]*gb+e;g[y>>2]=e;h=hb+h;g[A>>2]=h;n=ib+n;g[J>>2]=n;o=jb+o;g[x>>2]=o;p=kb+p;g[z>>2]=p;q=lb+q;g[I>>2]=q;i=i+1|0}while((i|0)!=(L|0))}}while((v|0)!=(Y|0));e=+g[V>>2]}kb=+g[U+((Y<<1)+2<<4)+4>>2];jb=+g[U+((Y<<1)+2<<4)+8>>2];ib=+g[W+4>>2]*e+ +g[W+20>>2]*kb+ +g[W+36>>2]*jb;hb=+g[W+8>>2]*e+ +g[W+24>>2]*kb+ +g[W+40>>2]*jb;g[f>>2]=+g[W>>2]*e+ +g[W+16>>2]*kb+ +g[W+32>>2]*jb;g[f+4>>2]=ib;g[f+8>>2]=hb;hb=+g[V+16>>2];ib=+g[V+20>>2];jb=+g[V+24>>2];kb=+g[W+4>>2]*hb+ +g[W+20>>2]*ib+ +g[W+36>>2]*jb;lb=+g[W+8>>2]*hb+ +g[W+24>>2]*ib+ +g[W+40>>2]*jb;g[f+12>>2]=+g[W>>2]*hb+ +g[W+16>>2]*ib+ +g[W+32>>2]*jb;g[f+16>>2]=kb;g[f+20>>2]=lb;if((ba|0)>-6){j=c[(c[ca+324>>2]|0)+180>>2]|0;i=0;e=0.0;do{e=e+ +g[j+(i<<2)>>2]*+g[$+(i<<2)>>2];i=i+1|0}while((i|0)<(ba+6|0))}else e=0.0;j=ca;k=0;h=ta*e*+g[aa>>2];n=ta*e*+g[Z>>2];e=ta*e*+g[_>>2];break}default:{j=0;k=0;h=0.0;n=0.0;e=0.0}}i=c[ea+(fa*104|0)+24>>2]|0;r=+g[i+8>>2];s=+g[i+12>>2];t=+g[i+16>>2];q=r-+g[i+24>>2]-h;p=s-+g[i+28>>2]-n;e=t-+g[i+32>>2]-e;h=+g[ea+(fa*104|0)+4>>2];n=+g[ea+(fa*104|0)+8>>2];o=+g[ea+(fa*104|0)+12>>2];if(q*h+p*n+e*o<=1.1920928955078125e-07){jb=r*h+s*n+t*o+ +g[ea+(fa*104|0)+20>>2];ib=+g[ea+(fa*104|0)+96>>2];jb=(jb>2];kb=(q-(q-h*(q*h+p*n+e*o))*ib+h*jb)*d;lb=(p-(p-n*(q*h+p*n+e*o))*ib+jb*n)*d;n=(e-(e-o*(q*h+p*n+e*o))*ib+jb*o)*d;e=+g[ea+(fa*104|0)+28>>2]*kb+ +g[ea+(fa*104|0)+32>>2]*lb+ +g[ea+(fa*104|0)+36>>2]*n;h=kb*+g[ea+(fa*104|0)+44>>2]+lb*+g[ea+(fa*104|0)+48>>2]+n*+g[ea+(fa*104|0)+52>>2];n=kb*+g[ea+(fa*104|0)+60>>2]+lb*+g[ea+(fa*104|0)+64>>2]+n*+g[ea+(fa*104|0)+68>>2];g[ua>>2]=e;g[ua+4>>2]=h;g[ua+8>>2]=n;g[ua+12>>2]=0.0;lb=+g[ea+(fa*104|0)+92>>2];g[i+8>>2]=r-e*lb;g[i+12>>2]=s-lb*h;g[i+16>>2]=t-lb*n;i=c[(c[da>>2]|0)+252>>2]|0;if((i|0)==2){if(k|0)ll(k,ua,ea+(fa*104|0)+76|0)}else if((j|0)!=0&(i|0)==64?(va=c[j+324>>2]|0,wa=+D(+(e*e+h*h+n*n))*-.5,xa=c[va+468>>2]|0,(xa|0)>-6):0){j=c[va+180>>2]|0;i=0;while(1){k=j+(i<<2)|0;h=wa*+g[f+(i<<2)>>2]+ +g[k>>2];g[k>>2]=h;e=+g[va+460>>2];if(!(h<-e)){if(e>2]=e}if((i|0)<(xa+5|0))i=i+1|0;else break}}}}fa=fa+1|0}while((fa|0)!=(sa|0));Ph(ua+48|0);l=ua;return}function hc(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,h=0,i=0,k=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0.0,D=0.0,E=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0;O=l;l=l+176|0;B=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;B=((xb[c[(c[B>>2]|0)+56>>2]&127](B)|0)&2048|0)!=0;M=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;M=((xb[c[(c[M>>2]|0)+56>>2]&127](M)|0)&4096|0)!=0;N=+g[d+40>>2];if(N<=0.0){l=O;return}switch(c[d+4>>2]|0){case 3:{c[O+112>>2]=1065353216;c[O+112+4>>2]=0;c[O+112+4+4>>2]=0;c[O+112+4+8>>2]=0;c[O+112+4+12>>2]=0;c[O+112+20>>2]=1065353216;c[O+112+24>>2]=0;c[O+112+24+4>>2]=0;c[O+112+24+8>>2]=0;c[O+112+24+12>>2]=0;c[O+112+40>>2]=1065353216;M=O+112+44|0;c[M>>2]=0;c[M+4>>2]=0;c[M+8>>2]=0;c[M+12>>2]=0;c[M+16>>2]=0;D=+g[d+300>>2];C=+g[d+304>>2];A=+g[d+308>>2];M=c[d+28>>2]|0;z=D*+g[M+20>>2]+C*+g[M+24>>2]+A*+g[M+28>>2]+ +g[M+56>>2];y=D*+g[M+36>>2]+C*+g[M+40>>2]+A*+g[M+44>>2]+ +g[M+60>>2];g[O+112+48>>2]=D*+g[M+4>>2]+C*+g[M+8>>2]+A*+g[M+12>>2]+ +g[M+52>>2];g[O+112+52>>2]=z;g[O+112+56>>2]=y;g[O+112+60>>2]=0.0;M=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[M>>2]|0)+64>>2]&7](M,O+112|0,N);y=+g[d+316>>2];z=+g[d+320>>2];A=+g[d+324>>2];d=c[d+32>>2]|0;C=y*+g[d+20>>2]+z*+g[d+24>>2]+A*+g[d+28>>2]+ +g[d+56>>2];D=y*+g[d+36>>2]+z*+g[d+40>>2]+A*+g[d+44>>2]+ +g[d+60>>2];g[O+112+48>>2]=y*+g[d+4>>2]+z*+g[d+8>>2]+A*+g[d+12>>2]+ +g[d+52>>2];g[O+112+52>>2]=C;g[O+112+56>>2]=D;g[O+112+60>>2]=0.0;if(B){b=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[b>>2]|0)+64>>2]&7](b,O+112|0,N)}l=O;return}case 4:{L=c[d+28>>2]|0;e=+g[d+552>>2];U=+g[L+4>>2];f=+g[d+552+16>>2];T=+g[L+8>>2];m=+g[d+552+32>>2];S=+g[L+12>>2];n=+g[d+552+4>>2];s=+g[d+552+20>>2];t=+g[d+552+36>>2];u=+g[d+552+8>>2];w=+g[d+552+24>>2];y=+g[d+552+40>>2];R=+g[L+20>>2];Q=+g[L+24>>2];P=+g[L+28>>2];v=+g[L+36>>2];x=+g[L+40>>2];z=+g[L+44>>2];W=+g[d+552+48>>2];V=+g[d+552+52>>2];D=+g[d+552+56>>2];A=+g[L+52>>2]+(U*W+T*V+S*D);C=R*W+Q*V+P*D+ +g[L+56>>2];D=v*W+x*V+z*D+ +g[L+60>>2];g[O+112>>2]=e*U+f*T+m*S;g[O+112+4>>2]=U*n+T*s+S*t;g[O+112+8>>2]=U*u+T*w+S*y;g[O+112+12>>2]=0.0;g[O+112+16>>2]=e*R+f*Q+m*P;g[O+112+20>>2]=n*R+s*Q+t*P;g[O+112+24>>2]=u*R+w*Q+y*P;g[O+112+28>>2]=0.0;g[O+112+32>>2]=e*v+f*x+m*z;g[O+112+36>>2]=n*v+s*x+t*z;g[O+112+40>>2]=u*v+w*x+y*z;g[O+112+44>>2]=0.0;g[O+112+48>>2]=A;g[O+112+52>>2]=C;g[O+112+56>>2]=D;g[O+112+60>>2]=0.0;if(B){L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N);L=c[d+32>>2]|0;w=+g[d+616>>2];m=+g[L+4>>2];x=+g[d+616+16>>2];n=+g[L+8>>2];y=+g[d+616+32>>2];s=+g[L+12>>2];z=+g[d+616+4>>2];A=+g[d+616+20>>2];C=+g[d+616+36>>2];D=+g[d+616+8>>2];Q=+g[d+616+24>>2];S=+g[d+616+40>>2];t=+g[L+20>>2];u=+g[L+24>>2];v=+g[L+28>>2];P=+g[L+36>>2];R=+g[L+40>>2];T=+g[L+44>>2];e=+g[d+616+48>>2];f=+g[d+616+52>>2];W=+g[d+616+56>>2];U=+g[L+52>>2]+(m*e+n*f+s*W);V=t*e+u*f+v*W+ +g[L+56>>2];W=P*e+R*f+T*W+ +g[L+60>>2];g[O+112>>2]=w*m+x*n+y*s;g[O+112+4>>2]=m*z+n*A+s*C;g[O+112+8>>2]=m*D+n*Q+s*S;g[O+112+12>>2]=0.0;g[O+112+16>>2]=w*t+x*u+y*v;g[O+112+20>>2]=z*t+A*u+C*v;g[O+112+24>>2]=D*t+Q*u+S*v;g[O+112+28>>2]=0.0;g[O+112+32>>2]=w*P+x*R+y*T;g[O+112+36>>2]=z*P+A*R+C*T;g[O+112+40>>2]=D*P+Q*R+S*T;g[O+112+44>>2]=0.0;g[O+112+48>>2]=U;g[O+112+52>>2]=V;g[O+112+56>>2]=W;g[O+112+60>>2]=0.0;L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N)}else{L=c[d+32>>2]|0;w=+g[d+616>>2];m=+g[L+4>>2];x=+g[d+616+16>>2];n=+g[L+8>>2];y=+g[d+616+32>>2];s=+g[L+12>>2];z=+g[d+616+4>>2];A=+g[d+616+20>>2];C=+g[d+616+36>>2];D=+g[d+616+8>>2];Q=+g[d+616+24>>2];S=+g[d+616+40>>2];t=+g[L+20>>2];u=+g[L+24>>2];v=+g[L+28>>2];P=+g[L+36>>2];R=+g[L+40>>2];T=+g[L+44>>2];e=+g[d+616+48>>2];f=+g[d+616+52>>2];W=+g[d+616+56>>2];U=+g[L+52>>2]+(m*e+n*f+s*W);V=t*e+u*f+v*W+ +g[L+56>>2];W=P*e+R*f+T*W+ +g[L+60>>2];g[O+112>>2]=w*m+x*n+y*s;g[O+112+4>>2]=m*z+n*A+s*C;g[O+112+8>>2]=m*D+n*Q+s*S;g[O+112+12>>2]=0.0;g[O+112+16>>2]=w*t+x*u+y*v;g[O+112+20>>2]=z*t+A*u+C*v;g[O+112+24>>2]=D*t+Q*u+S*v;g[O+112+28>>2]=0.0;g[O+112+32>>2]=w*P+x*R+y*T;g[O+112+36>>2]=z*P+A*R+C*T;g[O+112+40>>2]=D*P+Q*R+S*T;g[O+112+44>>2]=0.0;g[O+112+48>>2]=U;g[O+112+52>>2]=V;g[O+112+56>>2]=W;g[O+112+60>>2]=0.0}m=+g[d+688>>2];n=+g[d+688+4>>2];e=+mh(m-n,6.2831854820251465);if(!(e<-3.1415927410125732))if(e>3.1415927410125732)f=e+-6.2831854820251465;else f=e;else f=e+6.2831854820251465;e=+mh(m+n,6.2831854820251465);if(!(e<-3.1415927410125732)){if(e>3.1415927410125732)e=e+-6.2831854820251465}else e=e+6.2831854820251465;if(!(f==e)?M:0){c[O+96>>2]=c[O+112+8>>2];c[O+96+4>>2]=c[O+112+24>>2];c[O+96+8>>2]=c[O+112+40>>2];g[O+96+12>>2]=0.0;c[O+80>>2]=c[O+112>>2];c[O+80+4>>2]=c[O+112+16>>2];c[O+80+8>>2]=c[O+112+32>>2];g[O+80+12>>2]=0.0;b=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;d=c[(c[b>>2]|0)+68>>2]|0;c[O+64>>2]=0;c[O+64+4>>2]=0;c[O+64+8>>2]=0;c[O+64+12>>2]=0;Yb[d&0](b,O+112+48|0,O+96|0,O+80|0,N,N,n>0.0?f:0.0,n>0.0?e:6.2831854820251465,O+64|0,n>0.0,10.0)}l=O;return}case 5:{H=c[d+28>>2]|0;w=+g[d+300>>2];m=+g[H+4>>2];x=+g[d+300+16>>2];n=+g[H+8>>2];y=+g[d+300+32>>2];s=+g[H+12>>2];z=+g[d+300+4>>2];A=+g[d+300+20>>2];C=+g[d+300+36>>2];D=+g[d+300+8>>2];Q=+g[d+300+24>>2];S=+g[d+300+40>>2];t=+g[H+20>>2];u=+g[H+24>>2];v=+g[H+28>>2];P=+g[H+36>>2];R=+g[H+40>>2];T=+g[H+44>>2];e=+g[d+300+48>>2];f=+g[d+300+52>>2];W=+g[d+300+56>>2];U=+g[H+52>>2]+(m*e+n*f+s*W);V=t*e+u*f+v*W+ +g[H+56>>2];W=P*e+R*f+T*W+ +g[H+60>>2];g[O+112>>2]=w*m+x*n+y*s;H=O+112+4|0;g[H>>2]=m*z+n*A+s*C;J=O+112+8|0;g[J>>2]=m*D+n*Q+s*S;g[O+112+12>>2]=0.0;K=O+112+16|0;g[K>>2]=w*t+x*u+y*v;L=O+112+20|0;g[L>>2]=z*t+A*u+C*v;o=O+112+24|0;g[o>>2]=D*t+Q*u+S*v;g[O+112+28>>2]=0.0;p=O+112+32|0;g[p>>2]=w*P+x*R+y*T;q=O+112+36|0;g[q>>2]=z*P+A*R+C*T;r=O+112+40|0;g[r>>2]=D*P+Q*R+S*T;g[O+112+44>>2]=0.0;k=O+112+48|0;g[k>>2]=U;E=O+112+52|0;g[E>>2]=V;I=O+112+56|0;g[I>>2]=W;g[O+112+60>>2]=0.0;if(B){B=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[B>>2]|0)+64>>2]&7](B,O+112|0,N);B=c[d+32>>2]|0;w=+g[d+364>>2];m=+g[B+4>>2];x=+g[d+364+16>>2];n=+g[B+8>>2];y=+g[d+364+32>>2];s=+g[B+12>>2];z=+g[d+364+4>>2];A=+g[d+364+20>>2];C=+g[d+364+36>>2];D=+g[d+364+8>>2];Q=+g[d+364+24>>2];S=+g[d+364+40>>2];t=+g[B+20>>2];u=+g[B+24>>2];v=+g[B+28>>2];P=+g[B+36>>2];R=+g[B+40>>2];T=+g[B+44>>2];e=+g[d+364+48>>2];f=+g[d+364+52>>2];W=+g[d+364+56>>2];U=+g[B+52>>2]+(m*e+n*f+s*W);V=t*e+u*f+v*W+ +g[B+56>>2];W=P*e+R*f+T*W+ +g[B+60>>2];g[O+112>>2]=w*m+x*n+y*s;g[H>>2]=m*z+n*A+s*C;g[J>>2]=m*D+n*Q+s*S;g[O+112+12>>2]=0.0;g[K>>2]=w*t+x*u+y*v;g[L>>2]=z*t+A*u+C*v;g[o>>2]=D*t+Q*u+S*v;g[O+112+28>>2]=0.0;g[p>>2]=w*P+x*R+y*T;g[q>>2]=z*P+A*R+C*T;g[r>>2]=D*P+Q*R+S*T;g[O+112+44>>2]=0.0;g[k>>2]=U;g[E>>2]=V;g[I>>2]=W;g[O+112+60>>2]=0.0;B=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[B>>2]|0)+64>>2]&7](B,O+112|0,N)}else{B=c[d+32>>2]|0;w=+g[d+364>>2];m=+g[B+4>>2];x=+g[d+364+16>>2];n=+g[B+8>>2];y=+g[d+364+32>>2];s=+g[B+12>>2];z=+g[d+364+4>>2];A=+g[d+364+20>>2];C=+g[d+364+36>>2];D=+g[d+364+8>>2];Q=+g[d+364+24>>2];S=+g[d+364+40>>2];t=+g[B+20>>2];u=+g[B+24>>2];v=+g[B+28>>2];P=+g[B+36>>2];R=+g[B+40>>2];T=+g[B+44>>2];e=+g[d+364+48>>2];f=+g[d+364+52>>2];W=+g[d+364+56>>2];U=+g[B+52>>2]+(m*e+n*f+s*W);V=t*e+u*f+v*W+ +g[B+56>>2];W=P*e+R*f+T*W+ +g[B+60>>2];g[O+112>>2]=w*m+x*n+y*s;g[H>>2]=m*z+n*A+s*C;g[J>>2]=m*D+n*Q+s*S;g[O+112+12>>2]=0.0;g[K>>2]=w*t+x*u+y*v;g[L>>2]=z*t+A*u+C*v;g[o>>2]=D*t+Q*u+S*v;g[O+112+28>>2]=0.0;g[p>>2]=w*P+x*R+y*T;g[q>>2]=z*P+A*R+C*T;g[r>>2]=D*P+Q*R+S*T;g[O+112+44>>2]=0.0;g[k>>2]=U;g[E>>2]=V;g[I>>2]=W;g[O+112+60>>2]=0.0}if(M){Ak(O+96|0,d,6.0868353843688965,N);S=+g[O+96>>2];T=+g[O+96+4>>2];U=+g[O+96+8>>2];V=S*+g[K>>2]+T*+g[L>>2]+U*+g[o>>2]+ +g[E>>2];W=S*+g[p>>2]+T*+g[q>>2]+U*+g[r>>2]+ +g[I>>2];g[O+96>>2]=S*+g[O+112>>2]+T*+g[H>>2]+U*+g[J>>2]+ +g[k>>2];g[O+96+4>>2]=V;g[O+96+8>>2]=W;g[O+96+12>>2]=0.0;i=O+112+48|0;h=0;do{Ak(O+80|0,d,+(h|0)*6.283185005187988*.03125,N);S=+g[O+80>>2];T=+g[O+80+4>>2];U=+g[O+80+8>>2];V=S*+g[K>>2]+T*+g[L>>2]+U*+g[o>>2]+ +g[E>>2];W=S*+g[p>>2]+T*+g[q>>2]+U*+g[r>>2]+ +g[I>>2];g[O+80>>2]=S*+g[O+112>>2]+T*+g[H>>2]+U*+g[J>>2]+ +g[k>>2];g[O+80+4>>2]=V;g[O+80+8>>2]=W;g[O+80+12>>2]=0.0;M=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;B=c[(c[M>>2]|0)+16>>2]|0;c[O+64>>2]=0;c[O+64+4>>2]=0;c[O+64+8>>2]=0;c[O+64+12>>2]=0;Vb[B&127](M,O+96|0,O+80|0,O+64|0);if(!(h&3)){M=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;B=c[(c[M>>2]|0)+16>>2]|0;c[O+64>>2]=0;c[O+64+4>>2]=0;c[O+64+8>>2]=0;c[O+64+12>>2]=0;Vb[B&127](M,i,O+80|0,O+64|0)}c[O+96>>2]=c[O+80>>2];c[O+96+4>>2]=c[O+80+4>>2];c[O+96+8>>2]=c[O+80+8>>2];c[O+96+12>>2]=c[O+80+12>>2];h=h+1|0}while((h|0)!=32);C=+g[d+452>>2];D=+g[d+512>>2];h=c[d+32>>2]|0;if(+g[h+404>>2]>0.0){P=+g[d+364>>2];R=+g[h+4>>2];Q=+g[d+364+16>>2];S=+g[h+8>>2];z=+g[d+364+32>>2];A=+g[h+12>>2];Y=+g[d+364+4>>2];X=+g[d+364+20>>2];y=+g[d+364+36>>2];_=+g[d+364+8>>2];Z=+g[d+364+24>>2];x=+g[d+364+40>>2];aa=+g[h+20>>2];$=+g[h+24>>2];w=+g[h+28>>2];T=+g[h+36>>2];V=+g[h+40>>2];W=+g[h+44>>2];U=+g[d+364+48>>2];e=+g[d+364+52>>2];f=+g[d+364+56>>2];m=aa*U+$*e+w*f;n=_*T+Z*V+x*W;s=Y*T+X*V+y*W;t=P*T+Q*V+z*W;u=_*aa+Z*$+x*w;v=Y*aa+X*$+y*w;w=P*aa+Q*$+z*w;x=R*_+S*Z+A*x;y=R*Y+S*X+A*y;z=P*R+Q*S+z*A;A=R*U+S*e+A*f;h=h+4|0;e=T*U+V*e;f=W*f}else{h=c[d+28>>2]|0;V=+g[d+300>>2];X=+g[h+4>>2];W=+g[d+300+16>>2];Y=+g[h+8>>2];z=+g[d+300+32>>2];A=+g[h+12>>2];T=+g[d+300+4>>2];U=+g[d+300+20>>2];y=+g[d+300+36>>2];R=+g[d+300+8>>2];S=+g[d+300+24>>2];x=+g[d+300+40>>2];P=+g[h+20>>2];Q=+g[h+24>>2];w=+g[h+28>>2];Z=+g[h+36>>2];$=+g[h+40>>2];aa=+g[h+44>>2];_=+g[d+300+48>>2];e=+g[d+300+52>>2];f=+g[d+300+56>>2];m=P*_+Q*e+w*f;n=R*Z+S*$+x*aa;s=T*Z+U*$+y*aa;t=V*Z+W*$+z*aa;u=R*P+S*Q+x*w;v=T*P+U*Q+y*w;w=V*P+W*Q+z*w;x=X*R+Y*S+A*x;y=X*T+Y*U+A*y;z=V*X+W*Y+z*A;A=X*_+Y*e+A*f;h=h+4|0;e=Z*_+$*e;f=aa*f}_=A+ +g[h+48>>2];$=m+ +g[h+52>>2];aa=f+e+ +g[h+56>>2];g[O+112>>2]=z;g[H>>2]=y;g[J>>2]=x;g[O+112+12>>2]=0.0;g[K>>2]=w;g[L>>2]=v;g[o>>2]=u;g[O+112+28>>2]=0.0;g[p>>2]=t;g[q>>2]=s;g[r>>2]=n;g[O+112+44>>2]=0.0;g[k>>2]=_;g[E>>2]=$;g[I>>2]=aa;g[O+112+60>>2]=0.0;c[O+80>>2]=c[i>>2];c[O+80+4>>2]=c[i+4>>2];c[O+80+8>>2]=c[i+8>>2];c[O+80+12>>2]=c[i+12>>2];g[O+64>>2]=z;g[O+64+4>>2]=w;g[O+64+8>>2]=t;g[O+64+12>>2]=0.0;g[O+48>>2]=y;g[O+48+4>>2]=v;g[O+48+8>>2]=s;g[O+48+12>>2]=0.0;b=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;d=c[(c[b>>2]|0)+68>>2]|0;c[O+32>>2]=0;c[O+32+4>>2]=0;c[O+32+8>>2]=0;c[O+32+12>>2]=0;Yb[d&0](b,O+80|0,O+64|0,O+48|0,N,N,-D-C,C-D,O+32|0,1,10.0)}l=O;return}case 6:case 9:{c[O+112>>2]=c[d+1064>>2];c[O+112+4>>2]=c[d+1064+4>>2];c[O+112+8>>2]=c[d+1064+8>>2];c[O+112+12>>2]=c[d+1064+12>>2];i=d+1064+16|0;k=O+112+16|0;c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];o=d+1064+32|0;p=O+112+32|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];q=O+112+48|0;r=d+1064+48|0;c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];if(B){L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N);c[O+112>>2]=c[d+1128>>2];c[O+112+4>>2]=c[d+1128+4>>2];c[O+112+8>>2]=c[d+1128+8>>2];c[O+112+12>>2]=c[d+1128+12>>2];c[k>>2]=c[d+1128+16>>2];c[k+4>>2]=c[d+1128+16+4>>2];c[k+8>>2]=c[d+1128+16+8>>2];c[k+12>>2]=c[d+1128+16+12>>2];c[p>>2]=c[d+1128+32>>2];c[p+4>>2]=c[d+1128+32+4>>2];c[p+8>>2]=c[d+1128+32+8>>2];c[p+12>>2]=c[d+1128+32+12>>2];c[q>>2]=c[d+1128+48>>2];c[q+4>>2]=c[d+1128+48+4>>2];c[q+8>>2]=c[d+1128+48+8>>2];c[q+12>>2]=c[d+1128+48+12>>2];L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N)}else{c[O+112>>2]=c[d+1128>>2];c[O+112+4>>2]=c[d+1128+4>>2];c[O+112+8>>2]=c[d+1128+8>>2];c[O+112+12>>2]=c[d+1128+12>>2];c[k>>2]=c[d+1128+16>>2];c[k+4>>2]=c[d+1128+16+4>>2];c[k+8>>2]=c[d+1128+16+8>>2];c[k+12>>2]=c[d+1128+16+12>>2];c[p>>2]=c[d+1128+32>>2];c[p+4>>2]=c[d+1128+32+4>>2];c[p+8>>2]=c[d+1128+32+8>>2];c[p+12>>2]=c[d+1128+32+12>>2];c[q>>2]=c[d+1128+48>>2];c[q+4>>2]=c[d+1128+48+4>>2];c[q+8>>2]=c[d+1128+48+8>>2];c[q+12>>2]=c[d+1128+48+12>>2]}if(M){c[O+112>>2]=c[d+1064>>2];c[O+112+4>>2]=c[d+1064+4>>2];c[O+112+8>>2]=c[d+1064+8>>2];c[O+112+12>>2]=c[d+1064+12>>2];c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];h=d+1128+48|0;c[O+96>>2]=c[O+112+8>>2];c[O+96+4>>2]=c[O+112+24>>2];c[O+96+8>>2]=c[O+112+40>>2];g[O+96+12>>2]=0.0;c[O+80>>2]=c[O+112>>2];c[O+80+4>>2]=c[O+112+16>>2];c[O+80+8>>2]=c[O+112+32>>2];g[O+80+12>>2]=0.0;Y=+g[d+932>>2];e=+g[d+932+4>>2];$=+g[d+996>>2];_=+g[d+996+4>>2];K=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;L=c[(c[K>>2]|0)+72>>2]|0;c[O+64>>2]=0;c[O+64+4>>2]=0;c[O+64+8>>2]=0;c[O+64+12>>2]=0;Xb[L&0](K,h,O+96|0,O+80|0,N*.8999999761581421,Y,e,$,_,O+64|0,10.0,1);K=c[O+112+4>>2]|0;L=c[O+112+20>>2]|0;M=c[O+112+36>>2]|0;c[O+80>>2]=K;c[O+80+4>>2]=L;c[O+80+8>>2]=M;g[O+80+12>>2]=0.0;_=+g[d+1196>>2];$=+g[d+1200>>2];e=+F(+_);_=+G(+_);Y=+F(+$);$=+G(+$);Z=(c[j>>2]=K,+g[j>>2]);aa=(c[j>>2]=L,+g[j>>2]);f=(c[j>>2]=M,+g[j>>2]);g[O+64>>2]=e*Y*Z+e*$*aa-_*f;g[O+64+4>>2]=Y*aa-$*Z;g[O+64+8>>2]=_*Y*Z+_*$*aa+e*f;c[O+112>>2]=c[d+1128>>2];c[O+112+4>>2]=c[d+1128+4>>2];c[O+112+8>>2]=c[d+1128+8>>2];c[O+112+12>>2]=c[d+1128+12>>2];c[k>>2]=c[d+1128+16>>2];c[k+4>>2]=c[d+1128+16+4>>2];c[k+8>>2]=c[d+1128+16+8>>2];c[k+12>>2]=c[d+1128+16+12>>2];c[p>>2]=c[d+1128+32>>2];c[p+4>>2]=c[d+1128+32+4>>2];c[p+8>>2]=c[d+1128+32+8>>2];c[p+12>>2]=c[d+1128+32+12>>2];c[q>>2]=c[h>>2];c[q+4>>2]=c[h+4>>2];c[q+8>>2]=c[h+8>>2];c[q+12>>2]=c[h+12>>2];f=-+g[O+112+16>>2];e=-+g[O+112+32>>2];g[O+48>>2]=-+g[O+112>>2];g[O+48+4>>2]=f;g[O+48+8>>2]=e;g[O+48+12>>2]=0.0;e=+g[d+868>>2];f=+g[d+868+4>>2];if(!(e>f)){if(e>2]|0)+20>>2]&127](b)|0;L=c[(c[M>>2]|0)+68>>2]|0;c[O+32>>2]=0;c[O+32+4>>2]=0;c[O+32+8>>2]=0;c[O+32+12>>2]=0;Yb[L&0](M,h,O+48|0,O+64|0,N,N,e,f,O+32|0,1,10.0)}}else{M=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;L=c[(c[M>>2]|0)+68>>2]|0;c[O+32>>2]=0;c[O+32+4>>2]=0;c[O+32+8>>2]=0;c[O+32+12>>2]=0;Yb[L&0](M,h,O+48|0,O+64|0,N,N,-3.1415927410125732,3.1415927410125732,O+32|0,0,10.0)}c[O+112>>2]=c[d+1064>>2];c[O+112+4>>2]=c[d+1064+4>>2];c[O+112+8>>2]=c[d+1064+8>>2];c[O+112+12>>2]=c[d+1064+12>>2];c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];c[O+32>>2]=c[d+680>>2];c[O+32+4>>2]=c[d+680+4>>2];c[O+32+8>>2]=c[d+680+8>>2];c[O+32+12>>2]=c[d+680+12>>2];c[O+16>>2]=c[d+680+16>>2];c[O+16+4>>2]=c[d+680+16+4>>2];c[O+16+8>>2]=c[d+680+16+8>>2];c[O+16+12>>2]=c[d+680+16+12>>2];b=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;d=c[(c[b>>2]|0)+80>>2]|0;c[O>>2]=0;c[O+4>>2]=0;c[O+8>>2]=0;c[O+12>>2]=0;Zb[d&31](b,O+32|0,O+16|0,O+112|0,O)}l=O;return}case 12:{c[O+112>>2]=c[d+1236>>2];c[O+112+4>>2]=c[d+1236+4>>2];c[O+112+8>>2]=c[d+1236+8>>2];c[O+112+12>>2]=c[d+1236+12>>2];i=d+1236+16|0;k=O+112+16|0;c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];o=d+1236+32|0;p=O+112+32|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];q=O+112+48|0;r=d+1236+48|0;c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];if(B){L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N);c[O+112>>2]=c[d+1300>>2];c[O+112+4>>2]=c[d+1300+4>>2];c[O+112+8>>2]=c[d+1300+8>>2];c[O+112+12>>2]=c[d+1300+12>>2];c[k>>2]=c[d+1300+16>>2];c[k+4>>2]=c[d+1300+16+4>>2];c[k+8>>2]=c[d+1300+16+8>>2];c[k+12>>2]=c[d+1300+16+12>>2];c[p>>2]=c[d+1300+32>>2];c[p+4>>2]=c[d+1300+32+4>>2];c[p+8>>2]=c[d+1300+32+8>>2];c[p+12>>2]=c[d+1300+32+12>>2];c[q>>2]=c[d+1300+48>>2];c[q+4>>2]=c[d+1300+48+4>>2];c[q+8>>2]=c[d+1300+48+8>>2];c[q+12>>2]=c[d+1300+48+12>>2];L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N)}else{c[O+112>>2]=c[d+1300>>2];c[O+112+4>>2]=c[d+1300+4>>2];c[O+112+8>>2]=c[d+1300+8>>2];c[O+112+12>>2]=c[d+1300+12>>2];c[k>>2]=c[d+1300+16>>2];c[k+4>>2]=c[d+1300+16+4>>2];c[k+8>>2]=c[d+1300+16+8>>2];c[k+12>>2]=c[d+1300+16+12>>2];c[p>>2]=c[d+1300+32>>2];c[p+4>>2]=c[d+1300+32+4>>2];c[p+8>>2]=c[d+1300+32+8>>2];c[p+12>>2]=c[d+1300+32+12>>2];c[q>>2]=c[d+1300+48>>2];c[q+4>>2]=c[d+1300+48+4>>2];c[q+8>>2]=c[d+1300+48+8>>2];c[q+12>>2]=c[d+1300+48+12>>2]}if(M){c[O+112>>2]=c[d+1236>>2];c[O+112+4>>2]=c[d+1236+4>>2];c[O+112+8>>2]=c[d+1236+8>>2];c[O+112+12>>2]=c[d+1236+12>>2];c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];h=d+1300+48|0;c[O+96>>2]=c[O+112+8>>2];c[O+96+4>>2]=c[O+112+24>>2];c[O+96+8>>2]=c[O+112+40>>2];g[O+96+12>>2]=0.0;c[O+80>>2]=c[O+112>>2];c[O+80+4>>2]=c[O+112+16>>2];c[O+80+8>>2]=c[O+112+32>>2];g[O+80+12>>2]=0.0;Y=+g[d+1056>>2];e=+g[d+1060>>2];$=+g[d+1144>>2];_=+g[d+1144+4>>2];K=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;L=c[(c[K>>2]|0)+72>>2]|0;c[O+64>>2]=0;c[O+64+4>>2]=0;c[O+64+8>>2]=0;c[O+64+12>>2]=0;Xb[L&0](K,h,O+96|0,O+80|0,N*.8999999761581421,Y,e,$,_,O+64|0,10.0,1);K=c[O+112+4>>2]|0;L=c[O+112+20>>2]|0;M=c[O+112+36>>2]|0;c[O+80>>2]=K;c[O+80+4>>2]=L;c[O+80+8>>2]=M;g[O+80+12>>2]=0.0;_=+g[d+1368>>2];$=+g[d+1372>>2];e=+F(+_);_=+G(+_);Y=+F(+$);$=+G(+$);Z=(c[j>>2]=K,+g[j>>2]);aa=(c[j>>2]=L,+g[j>>2]);f=(c[j>>2]=M,+g[j>>2]);g[O+64>>2]=e*Y*Z+e*$*aa-_*f;g[O+64+4>>2]=Y*aa-$*Z;g[O+64+8>>2]=_*Y*Z+_*$*aa+e*f;c[O+112>>2]=c[d+1300>>2];c[O+112+4>>2]=c[d+1300+4>>2];c[O+112+8>>2]=c[d+1300+8>>2];c[O+112+12>>2]=c[d+1300+12>>2];c[k>>2]=c[d+1300+16>>2];c[k+4>>2]=c[d+1300+16+4>>2];c[k+8>>2]=c[d+1300+16+8>>2];c[k+12>>2]=c[d+1300+16+12>>2];c[p>>2]=c[d+1300+32>>2];c[p+4>>2]=c[d+1300+32+4>>2];c[p+8>>2]=c[d+1300+32+8>>2];c[p+12>>2]=c[d+1300+32+12>>2];c[q>>2]=c[h>>2];c[q+4>>2]=c[h+4>>2];c[q+8>>2]=c[h+8>>2];c[q+12>>2]=c[h+12>>2];f=-+g[O+112+16>>2];e=-+g[O+112+32>>2];g[O+48>>2]=-+g[O+112>>2];g[O+48+4>>2]=f;g[O+48+8>>2]=e;g[O+48+12>>2]=0.0;e=+g[d+968>>2];f=+g[d+968+4>>2];if(!(e>f)){if(e>2]|0)+20>>2]&127](b)|0;L=c[(c[M>>2]|0)+68>>2]|0;c[O+32>>2]=0;c[O+32+4>>2]=0;c[O+32+8>>2]=0;c[O+32+12>>2]=0;Yb[L&0](M,h,O+48|0,O+64|0,N,N,e,f,O+32|0,1,10.0)}}else{M=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;L=c[(c[M>>2]|0)+68>>2]|0;c[O+32>>2]=0;c[O+32+4>>2]=0;c[O+32+8>>2]=0;c[O+32+12>>2]=0;Yb[L&0](M,h,O+48|0,O+64|0,N,N,-3.1415927410125732,3.1415927410125732,O+32|0,0,10.0)}c[O+112>>2]=c[d+1236>>2];c[O+112+4>>2]=c[d+1236+4>>2];c[O+112+8>>2]=c[d+1236+8>>2];c[O+112+12>>2]=c[d+1236+12>>2];c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];c[O+32>>2]=c[d+680>>2];c[O+32+4>>2]=c[d+680+4>>2];c[O+32+8>>2]=c[d+680+8>>2];c[O+32+12>>2]=c[d+680+12>>2];c[O+16>>2]=c[d+680+16>>2];c[O+16+4>>2]=c[d+680+16+4>>2];c[O+16+8>>2]=c[d+680+16+8>>2];c[O+16+12>>2]=c[d+680+16+12>>2];b=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;d=c[(c[b>>2]|0)+80>>2]|0;c[O>>2]=0;c[O+4>>2]=0;c[O+8>>2]=0;c[O+12>>2]=0;Zb[d&31](b,O+32|0,O+16|0,O+112|0,O)}l=O;return}case 7:{c[O+112>>2]=c[d+824>>2];c[O+112+4>>2]=c[d+824+4>>2];c[O+112+8>>2]=c[d+824+8>>2];c[O+112+12>>2]=c[d+824+12>>2];h=O+112+16|0;c[h>>2]=c[d+824+16>>2];c[h+4>>2]=c[d+824+16+4>>2];c[h+8>>2]=c[d+824+16+8>>2];c[h+12>>2]=c[d+824+16+12>>2];i=O+112+32|0;c[i>>2]=c[d+824+32>>2];c[i+4>>2]=c[d+824+32+4>>2];c[i+8>>2]=c[d+824+32+8>>2];c[i+12>>2]=c[d+824+32+12>>2];k=O+112+48|0;c[k>>2]=c[d+824+48>>2];c[k+4>>2]=c[d+824+48+4>>2];c[k+8>>2]=c[d+824+48+8>>2];c[k+12>>2]=c[d+824+48+12>>2];if(B){L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N);c[O+112>>2]=c[d+888>>2];c[O+112+4>>2]=c[d+888+4>>2];c[O+112+8>>2]=c[d+888+8>>2];c[O+112+12>>2]=c[d+888+12>>2];c[h>>2]=c[d+888+16>>2];c[h+4>>2]=c[d+888+16+4>>2];c[h+8>>2]=c[d+888+16+8>>2];c[h+12>>2]=c[d+888+16+12>>2];c[i>>2]=c[d+888+32>>2];c[i+4>>2]=c[d+888+32+4>>2];c[i+8>>2]=c[d+888+32+8>>2];c[i+12>>2]=c[d+888+32+12>>2];c[k>>2]=c[d+888+48>>2];c[k+4>>2]=c[d+888+48+4>>2];c[k+8>>2]=c[d+888+48+8>>2];c[k+12>>2]=c[d+888+48+12>>2];L=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;Pb[c[(c[L>>2]|0)+64>>2]&7](L,O+112|0,N)}else{c[O+112>>2]=c[d+888>>2];c[O+112+4>>2]=c[d+888+4>>2];c[O+112+8>>2]=c[d+888+8>>2];c[O+112+12>>2]=c[d+888+12>>2];c[h>>2]=c[d+888+16>>2];c[h+4>>2]=c[d+888+16+4>>2];c[h+8>>2]=c[d+888+16+8>>2];c[h+12>>2]=c[d+888+16+12>>2];c[i>>2]=c[d+888+32>>2];c[i+4>>2]=c[d+888+32+4>>2];c[i+8>>2]=c[d+888+32+8>>2];c[i+12>>2]=c[d+888+32+12>>2];c[k>>2]=c[d+888+48>>2];c[k+4>>2]=c[d+888+48+4>>2];c[k+8>>2]=c[d+888+48+8>>2];c[k+12>>2]=c[d+888+48+12>>2]}if(M){E=a[d+180>>0]|0?d+824|0:d+888|0;H=c[E>>2]|0;K=c[E+4>>2]|0;I=c[E+16>>2]|0;L=c[E+20>>2]|0;J=c[E+32>>2]|0;M=c[E+36>>2]|0;Q=+g[E+48>>2];U=+g[E+52>>2];Y=+g[E+56>>2];$=+g[d+184>>2];T=(c[j>>2]=H,+g[j>>2]);S=(c[j>>2]=K,+g[j>>2])*0.0;R=+g[E+8>>2]*0.0;X=(c[j>>2]=I,+g[j>>2]);W=(c[j>>2]=L,+g[j>>2])*0.0;V=+g[E+24>>2]*0.0;aa=(c[j>>2]=J,+g[j>>2]);_=(c[j>>2]=M,+g[j>>2])*0.0;Z=+g[E+40>>2]*0.0;g[O+96>>2]=Q+(R+(S+T*$));g[O+96+4>>2]=U+(V+(W+X*$));g[O+96+8>>2]=Y+(Z+(_+aa*$));g[O+96+12>>2]=0.0;$=+g[d+188>>2];g[O+80>>2]=Q+(R+(S+T*$));g[O+80+4>>2]=U+(V+(W+X*$));g[O+80+8>>2]=Y+(Z+(_+aa*$));g[O+80+12>>2]=0.0;E=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;B=c[(c[E>>2]|0)+16>>2]|0;c[O+64>>2]=0;c[O+64+4>>2]=0;c[O+64+8>>2]=0;c[O+64+12>>2]=0;Vb[B&127](E,O+96|0,O+80|0,O+64|0);c[O+64>>2]=H;c[O+64+4>>2]=I;c[O+64+8>>2]=J;g[O+64+12>>2]=0.0;c[O+48>>2]=K;c[O+48+4>>2]=L;c[O+48+8>>2]=M;g[O+48+12>>2]=0.0;$=+g[d+192>>2];aa=+g[d+196>>2];b=xb[c[(c[b>>2]|0)+20>>2]&127](b)|0;M=c[(c[b>>2]|0)+68>>2]|0;c[O+32>>2]=0;c[O+32+4>>2]=0;c[O+32+8>>2]=0;c[O+32+12>>2]=0;Yb[M&0](b,d+888+48|0,O+64|0,O+48|0,N,N,$,aa,O+32|0,1,10.0)}l=O;return}default:{l=O;return}}}function ic(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,E=0.0,F=0,G=0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0,Q=0,R=0,S=0,T=0.0,U=0,V=0,W=0,X=0,Y=0,Z=0;Z=l;l=l+112|0;c[Z+40>>2]=0;a[Z+16>>0]=1;c[Z+12>>2]=0;c[Z+4>>2]=0;c[Z+8>>2]=0;a[Z+36>>0]=1;c[Z+32>>2]=0;c[Z+24>>2]=0;c[Z+28>>2]=0;i=e>>>0>8?e:8;if((i|0)>0){c[6995]=(c[6995]|0)+1;h=sc((i<<4|3)+16|0)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}h=0;do{Y=j+(h<<4)|0;c[Y>>2]=c[Z+48>>2];c[Y+4>>2]=c[Z+48+4>>2];c[Y+8>>2]=c[Z+48+8>>2];c[Y+12>>2]=c[Z+48+12>>2];h=h+1|0}while((h|0)!=(i|0));Y=j;X=j}else{Y=0;X=0}do if(!e){w=0;h=0;q=0;u=0;v=0}else{i=c[Z+24>>2]|0;if((i|0)<0){h=c[Z+32>>2]|0;if((c[Z+28>>2]|0)<0){if(!((h|0)==0|(a[Z+36>>0]|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}a[Z+36>>0]=1;c[Z+32>>2]=0;c[Z+28>>2]=0;h=0}Yk(h+(i<<2)|0,0,P(i,-4)|0)|0}c[Z+24>>2]=0;h=d;i=0;x=3402823466385288598117041.0e14;p=-3402823466385288598117041.0e14;y=3402823466385288598117041.0e14;r=-3402823466385288598117041.0e14;z=3402823466385288598117041.0e14;t=-3402823466385288598117041.0e14;while(1){T=+g[h>>2];x=Tp?T:p;T=+g[h+4>>2];y=Tr?T:r;T=+g[h+8>>2];z=Tt?T:t;i=i+1|0;if((i|0)==(e|0))break;else h=h+16|0}s=p-x;T=r-y;p=t-z;K=x+s*.5;J=y+T*.5;E=z+p*.5;do if(e>>>0<3|(s<9.999999974752427e-07|T<9.999999974752427e-07|p<9.999999974752427e-07)){t=s>9.999999974752427e-07&s<3402823466385288598117041.0e14?s:3402823466385288598117041.0e14;t=T>9.999999974752427e-07&T9.999999974752427e-07&p>2];z=1.0/T*+g[n+4>>2];A=1.0/p*+g[n+8>>2];n=n+16|0;a:do if(h){j=0;while(1){d=Y+(j<<4)|0;r=+g[d>>2];k=Y+(j<<4)+4|0;t=+g[k>>2];m=Y+(j<<4)+8|0;x=+g[m>>2];if(+C(+(r-y))<1.0000000474974513e-03&+C(+(t-z))<1.0000000474974513e-03&+C(+(x-A))<1.0000000474974513e-03)break;j=j+1|0;if(j>>>0>=h>>>0){m=j;break a}}if((y-1.0/s*K)*(y-1.0/s*K)+(z-1.0/T*J)*(z-1.0/T*J)+(A-1.0/p*E)*(A-1.0/p*E)>(r-1.0/s*K)*(r-1.0/s*K)+(t-1.0/T*J)*(t-1.0/T*J)+(x-1.0/p*E)*(x-1.0/p*E)){g[d>>2]=y;g[k>>2]=z;g[m>>2]=A;m=j}else m=j}else m=0;while(0);if((m|0)==(h|0)){g[Y+(h<<4)>>2]=y;g[Y+(h<<4)+4>>2]=z;g[Y+(h<<4)+8>>2]=A;h=h+1|0}if((i|0)==(c[Z+28>>2]|0)?(q=i|0?i<<1:1,(i|0)<(q|0)):0){if((q|0)!=0?(c[6995]=(c[6995]|0)+1,u=sc((q<<2|3)+16|0)|0,(u|0)!=0):0){c[(u+4+15&-16)+-4>>2]=u;k=u+4+15&-16}else k=0;d=c[Z+32>>2]|0;if((i|0)<=0){if(d)W=37}else{j=0;do{c[k+(j<<2)>>2]=c[d+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0));W=37}if((W|0)==37){W=0;if(a[Z+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[Z+32>>2]=0;i=c[Z+24>>2]|0}a[Z+36>>0]=1;c[Z+32>>2]=k;c[Z+28>>2]=q}c[(c[Z+32>>2]|0)+(i<<2)>>2]=m;i=(c[Z+24>>2]|0)+1|0;c[Z+24>>2]=i;o=o+1|0}while((o|0)!=(e|0));if(!h){i=1;x=-3402823466385288598117041.0e14;E=3402823466385288598117041.0e14;t=-3402823466385288598117041.0e14;A=3402823466385288598117041.0e14;r=-3402823466385288598117041.0e14;y=3402823466385288598117041.0e14}else{i=0;B=3402823466385288598117041.0e14;E=3402823466385288598117041.0e14;H=-3402823466385288598117041.0e14;x=-3402823466385288598117041.0e14;J=3402823466385288598117041.0e14;A=3402823466385288598117041.0e14;K=-3402823466385288598117041.0e14;t=-3402823466385288598117041.0e14;M=3402823466385288598117041.0e14;y=3402823466385288598117041.0e14;N=-3402823466385288598117041.0e14;r=-3402823466385288598117041.0e14;while(1){z=+g[Y+(i<<4)>>2];j=zH;x=d?z:x;I=+g[Y+(i<<4)+4>>2];k=IK;t=m?I:t;L=+g[Y+(i<<4)+8>>2];n=LN;r=o?L:r;i=i+1|0;if((i|0)==(h|0))break;else{B=j?z:B;H=d?z:H;J=k?I:J;K=m?I:K;M=n?L:M;N=o?L:N}}i=h>>>0<3}x=x-E;z=t-A;B=r-y;if(!(i|(x<9.999999974752427e-07|z<9.999999974752427e-07|B<9.999999974752427e-07))){if(h|0){r=T;U=h;W=52;break}break}E=E+x*.5;A=A+z*.5;y=y+B*.5;t=x>=9.999999974752427e-07&x<3402823466385288598117041.0e14?x:3402823466385288598117041.0e14;t=z>=9.999999974752427e-07&z=9.999999974752427e-07&B>2]=t;g[Y+4>>2]=y;g[Y+8>>2]=z;g[Y+16>>2]=I;g[Y+20>>2]=y;g[Y+24>>2]=z;g[Y+32>>2]=I;g[Y+36>>2]=H;g[Y+40>>2]=z;g[Y+48>>2]=t;g[Y+52>>2]=H;g[Y+56>>2]=z;g[Y+64>>2]=t;g[Y+68>>2]=y;g[Y+72>>2]=B;g[Y+80>>2]=I;g[Y+84>>2]=y;g[Y+88>>2]=B;g[Y+96>>2]=I;g[Y+100>>2]=H;g[Y+104>>2]=B;g[Y+112>>2]=t;g[Y+116>>2]=H;g[Y+120>>2]=B;U=8;W=52}if((W|0)==52){h=0;do{V=Y+(h<<4)|0;g[V>>2]=s*+g[V>>2];V=Y+(h<<4)+4|0;g[V>>2]=r*+g[V>>2];V=Y+(h<<4)+8|0;g[V>>2]=p*+g[V>>2];h=h+1|0}while(h>>>0>>0);if((U|0)>=4){p=+g[Y>>2];s=+g[Y+4>>2];r=+g[Y+8>>2];V=U<<2;c[6995]=(c[6995]|0)+1;h=sc((V|3)+16|0)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}c[Z+48>>2]=0;c[6995]=(c[6995]|0)+1;i=sc((V|3)+16|0)|0;if(i){c[(i+4+15&-16)+-4>>2]=i;h=c[Z+48>>2]|0;if(!h)h=i+4+15&-16;else{c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);h=i+4+15&-16}}else h=0;c[Z+48>>2]=h;z=p;x=p;y=r;n=U;q=j;u=0;t=s;p=s;h=U;o=j;d=j;while(1){if((u|0)==(h|0)?(v=u|0?u<<1:1,(u|0)<(v|0)):0){if((v|0)!=0?(c[6995]=(c[6995]|0)+1,w=sc((v<<2|3)+16|0)|0,(w|0)!=0):0){c[(w+4+15&-16)+-4>>2]=w;i=w+4+15&-16}else i=0;j=c[Z+48>>2]|0;if((u|0)<=0){if(j|0)W=68}else{h=0;do{c[i+(h<<2)>>2]=c[j+(h<<2)>>2];h=h+1|0}while((h|0)!=(u|0));W=68}if((W|0)==68){W=0;c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);c[Z+48>>2]=0}c[Z+48>>2]=i;m=v}else m=h;c[(c[Z+48>>2]|0)+(u<<2)>>2]=1;k=u;u=u+1|0;do if((k|0)==(n|0)){i=k|0?k<<1:1;if((k|0)<(i|0)){if((i|0)!=0?(c[6995]=(c[6995]|0)+1,F=sc((i<<2|3)+16|0)|0,(F|0)!=0):0){c[(F+4+15&-16)+-4>>2]=F;j=F+4+15&-16}else j=0;if((k|0)>0){h=0;do{c[j+(h<<2)>>2]=c[q+(h<<2)>>2];h=h+1|0}while((h|0)!=(k|0));if(!d){q=j;d=j;o=j;break}}else if((q|0)==0|(d|0)==0){q=j;d=j;o=j;break}c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);q=j;d=j;o=j}else i=k}else i=n;while(0);c[q+(k<<2)>>2]=0;M=+g[Y+(k<<4)>>2];x=M>2];p=N>2];r=T=(U|0))break;else{n=i;h=m}}z=z-x;x=t-p;I=y-r;I=+D(+(z*z+x*x+I*I))*1.0000000474974513e-03;O=Se(Y,U,.009999999776482582,.019999999552965164,1.0,c[Z+48>>2]|0)|0;m=c[Z+48>>2]|0;Q=Se(Y,U,-.009999999776482582,-.019999999552965164,-1.0,m)|0;n=Y+(O<<4)|0;u=Y+(Q<<4)|0;x=+g[n>>2]-+g[u>>2];v=Y+(O<<4)+4|0;w=Y+(Q<<4)+4|0;y=+g[v>>2]-+g[w>>2];F=Y+(O<<4)+8|0;G=Y+(Q<<4)+8|0;z=+g[F>>2]-+g[G>>2];b:do if((O|0)!=(Q|0)?!(z==0.0&y==0.0&x==0.0):0){p=+D(+((z*.019999999552965164-y*0.0)*(z*.019999999552965164-y*0.0)+(x*0.0-z)*(x*0.0-z)+(y-x*.019999999552965164)*(y-x*.019999999552965164)));r=+D(+((z-y*0.0)*(z-y*0.0)+(z*.019999999552965164+x*0.0)*(z*.019999999552965164+x*0.0)+(y*-.019999999552965164-x)*(y*-.019999999552965164-x)));if(p>r){s=(y-x*.019999999552965164)*(1.0/p);t=(z*.019999999552965164-y*0.0)*(1.0/p);p=(x*0.0-z)*(1.0/p)}else{s=(y*-.019999999552965164-x)*(1.0/r);t=(z-y*0.0)*(1.0/r);p=(z*.019999999552965164+x*0.0)*(1.0/r)}h=Se(Y,U,t,p,s,m)|0;if((h|0)==(O|0)|(h|0)==(Q|0))i=Se(Y,U,-t,-p,-s,m)|0;else i=h;if(!((i|0)==(O|0)|(i|0)==(Q|0))){j=Y+(i<<4)|0;p=+g[j>>2]-+g[n>>2];d=Y+(i<<4)+4|0;r=+g[d>>2]-+g[v>>2];k=Y+(i<<4)+8|0;s=+g[k>>2]-+g[F>>2];t=1.0/+D(+((y*p-r*x)*(y*p-r*x)+((r*z-s*y)*(r*z-s*y)+(s*x-z*p)*(s*x-z*p))));h=Se(Y,U,(r*z-s*y)*t,(s*x-z*p)*t,(y*p-r*x)*t,m)|0;if((h|0)==(i|0)|((h|0)==(O|0)|(h|0)==(Q|0)))h=Se(Y,U,-((r*z-s*y)*t),-((s*x-z*p)*t),-((y*p-r*x)*t),m)|0;if(!((h|0)==(i|0)|((h|0)==(O|0)|(h|0)==(Q|0)))?(E=+g[n>>2],K=+g[v>>2],B=+g[F>>2],N=+g[u>>2]-E,H=+g[w>>2]-K,L=+g[G>>2]-B,M=+g[j>>2]-E,J=+g[d>>2]-K,T=+g[k>>2]-B,R=(+g[Y+(h<<4)+8>>2]-B)*(N*J-H*M)+((+g[Y+(h<<4)>>2]-E)*(H*T-L*J)+(+g[Y+(h<<4)+4>>2]-K)*(L*M-N*T))<0.0,S=R?i:h,R=R?h:i,(O|0)!=-1):0){B=(+g[Y+(O<<4)>>2]+ +g[Y+(Q<<4)>>2]+ +g[Y+(R<<4)>>2]+ +g[Y+(S<<4)>>2])*.25;E=(+g[Y+(O<<4)+4>>2]+ +g[Y+(Q<<4)+4>>2]+ +g[Y+(R<<4)+4>>2]+ +g[Y+(S<<4)+4>>2])*.25;H=(+g[Y+(O<<4)+8>>2]+ +g[Y+(Q<<4)+8>>2]+ +g[Y+(R<<4)+8>>2]+ +g[Y+(S<<4)+8>>2])*.25;h=Lh(Z,R,S,Q)|0;c[h+12>>2]=2;c[h+16>>2]=3;c[h+20>>2]=1;h=Lh(Z,S,R,O)|0;c[h+12>>2]=3;c[h+16>>2]=2;c[h+20>>2]=0;h=Lh(Z,O,Q,S)|0;c[h+12>>2]=0;c[h+16>>2]=1;c[h+20>>2]=3;h=Lh(Z,Q,O,R)|0;c[h+12>>2]=1;c[h+16>>2]=0;c[h+20>>2]=2;c[q+(S<<2)>>2]=1;c[q+(R<<2)>>2]=1;c[q+(Q<<2)>>2]=1;c[q+(O<<2)>>2]=1;h=c[Z+4>>2]|0;if((h|0)>0){j=c[Z+12>>2]|0;i=0;do{h=c[j+(i<<2)>>2]|0;R=c[h>>2]|0;Q=c[h+4>>2]|0;S=c[h+8>>2]|0;x=+g[Y+(Q<<4)>>2];s=x-+g[Y+(R<<4)>>2];y=+g[Y+(Q<<4)+4>>2];t=y-+g[Y+(R<<4)+4>>2];r=+g[Y+(Q<<4)+8>>2];p=r-+g[Y+(R<<4)+8>>2];x=+g[Y+(S<<4)>>2]-x;y=+g[Y+(S<<4)+4>>2]-y;r=+g[Y+(S<<4)+8>>2]-r;z=+D(+((s*y-t*x)*(s*y-t*x)+((t*r-p*y)*(t*r-p*y)+(p*x-s*r)*(p*x-s*r))));if(z==0.0){A=1.0;r=0.0;p=0.0}else{A=1.0/z*(t*r-p*y);r=1.0/z*(p*x-s*r);p=1.0/z*(s*y-t*x)}R=Se(Y,U,A,r,p,c[Z+48>>2]|0)|0;c[h+28>>2]=R;S=c[h>>2]|0;g[h+32>>2]=(+g[Y+(R<<4)>>2]-+g[Y+(S<<4)>>2])*A+(+g[Y+(R<<4)+4>>2]-+g[Y+(S<<4)+4>>2])*r+(+g[Y+(R<<4)+8>>2]-+g[Y+(S<<4)+8>>2])*p;i=i+1|0;h=c[Z+4>>2]|0}while((i|0)<(h|0))}if((e+-4|0)>0){u=e+-4|0;while(1){m=c[Z+12>>2]|0;d=0;i=0;do{j=c[m+(d<<2)>>2]|0;do if(i){if(!j)break;if(+g[i+32>>2]<+g[j+32>>2])W=104}else W=104;while(0);if((W|0)==104){W=0;i=j}d=d+1|0}while((d|0)<(h|0));if((i|0)==0?1:!(+g[i+32>>2]>I)){h=1;break b}n=c[i+28>>2]|0;c[q+(n<<2)>>2]=1;h=c[Z+4>>2]|0;c:do if(h|0){j=Y+(n<<4)|0;d=Y+(n<<4)+4|0;k=Y+(n<<4)+8|0;i=m;while(1){h=h+-1|0;i=c[i+(h<<2)>>2]|0;do if(i|0){S=c[i>>2]|0;R=c[i+4>>2]|0;e=c[i+8>>2]|0;M=+g[Y+(R<<4)>>2];N=+g[Y+(S<<4)>>2];x=+g[Y+(R<<4)+4>>2];z=+g[Y+(S<<4)+4>>2];J=+g[Y+(R<<4)+8>>2];K=+g[Y+(S<<4)+8>>2];L=+g[Y+(e<<4)>>2]-M;y=+g[Y+(e<<4)+4>>2]-x;T=+g[Y+(e<<4)+8>>2]-J;A=+D(+(((M-N)*y-(x-z)*L)*((M-N)*y-(x-z)*L)+(((x-z)*T-(J-K)*y)*((x-z)*T-(J-K)*y)+((J-K)*L-(M-N)*T)*((J-K)*L-(M-N)*T))));if(!((A==0.0?0.0:1.0/A*((M-N)*y-(x-z)*L))*(+g[k>>2]-K)+((+g[j>>2]-N)*(A==0.0?1.0:1.0/A*((x-z)*T-(J-K)*y))+(+g[d>>2]-z)*(A==0.0?0.0:1.0/A*((J-K)*L-(M-N)*T)))>I*.009999999776482582))break;me(Z,i,n)}while(0);if(!h)break;i=c[Z+12>>2]|0}h=c[Z+4>>2]|0;if(!h)break;else i=h;d:do{i=i+-1|0;d=c[Z+12>>2]|0;k=c[d+(i<<2)>>2]|0;do if(k){m=c[k>>2]|0;do if((m|0)!=(n|0)){j=c[k+4>>2]|0;if((j|0)==(n|0)){j=n;break}if((c[k+8>>2]|0)!=(n|0))break d}else j=c[k+4>>2]|0;while(0);e=c[k+8>>2]|0;M=+g[Y+(j<<4)>>2];N=+g[Y+(m<<4)>>2];x=+g[Y+(j<<4)+4>>2];z=+g[Y+(m<<4)+4>>2];J=+g[Y+(j<<4)+8>>2];K=+g[Y+(m<<4)+8>>2];L=+g[Y+(e<<4)>>2]-M;y=+g[Y+(e<<4)+4>>2]-x;T=+g[Y+(e<<4)+8>>2]-J;A=+D(+(((M-N)*y-(x-z)*L)*((M-N)*y-(x-z)*L)+(((x-z)*T-(J-K)*y)*((x-z)*T-(J-K)*y)+((J-K)*L-(M-N)*T)*((J-K)*L-(M-N)*T))));if(!(AI*.009999999776482582))break;me(Z,c[d+(c[k+12>>2]<<2)>>2]|0,n);h=c[Z+4>>2]|0;i=h}while(0)}while((i|0)!=0);if(!h)break;d=c[Z+12>>2]|0;do{h=h+-1|0;j=c[d+(h<<2)>>2]|0;do if(j|0){if((c[j+28>>2]|0)>-1)break c;S=c[j>>2]|0;R=c[j+4>>2]|0;e=c[j+8>>2]|0;x=+g[Y+(R<<4)>>2];s=x-+g[Y+(S<<4)>>2];y=+g[Y+(R<<4)+4>>2];t=y-+g[Y+(S<<4)+4>>2];r=+g[Y+(R<<4)+8>>2];p=r-+g[Y+(S<<4)+8>>2];x=+g[Y+(e<<4)>>2]-x;y=+g[Y+(e<<4)+4>>2]-y;r=+g[Y+(e<<4)+8>>2]-r;z=+D(+((s*y-t*x)*(s*y-t*x)+((t*r-p*y)*(t*r-p*y)+(p*x-s*r)*(p*x-s*r))));if(z==0.0){A=1.0;r=0.0;p=0.0}else{A=1.0/z*(t*r-p*y);r=1.0/z*(p*x-s*r);p=1.0/z*(s*y-t*x)}i=Se(Y,U,A,r,p,c[Z+48>>2]|0)|0;c[j+28>>2]=i;if(!(c[q+(i<<2)>>2]|0)){e=c[j>>2]|0;g[j+32>>2]=(+g[Y+(i<<4)>>2]-+g[Y+(e<<4)>>2])*A+(+g[Y+(i<<4)+4>>2]-+g[Y+(e<<4)+4>>2])*r+(+g[Y+(i<<4)+8>>2]-+g[Y+(e<<4)+8>>2])*p;break}else{c[j+28>>2]=-1;break}}while(0)}while((h|0)!=0)}while(0);if((u|0)<=1){h=1;break b}u=u+-1|0;h=c[Z+4>>2]|0}}else h=1}else h=0}else h=0}else h=0;while(0);i=c[Z+48>>2]|0;if(i|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);c[Z+48>>2]=0}if(!((q|0)==0|(o|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[o+-4>>2]|0)}if(h){h=c[Z+4>>2]|0;if((h|0)>0){v=0;m=0;j=0;k=0;i=0;d=c[Z+12>>2]|0;n=0;do{o=c[d+(v<<2)>>2]|0;if(o){do if((k|0)==(m|0)){d=m|0?m<<1:1;if((m|0)>=(d|0)){d=m;break}do if(!d)i=0;else{c[6995]=(c[6995]|0)+1;h=sc((d<<2|3)+16|0)|0;if(!h){i=0;break}c[(h+4+15&-16)+-4>>2]=h;i=h+4+15&-16}while(0);if((m|0)>0){h=0;do{c[i+(h<<2)>>2]=c[j+(h<<2)>>2];h=h+1|0}while((h|0)!=(m|0));if(!n){j=i;n=i;break}}else if((j|0)==0|(n|0)==0){j=i;n=i;break}c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0);j=i;n=i}else d=m;while(0);c[j+(k<<2)>>2]=c[o>>2];o=k+1|0;q=(c[(c[Z+12>>2]|0)+(v<<2)>>2]|0)+4|0;do if((o|0)==(d|0)){m=d|0?d<<1:1;if((d|0)>=(m|0)){u=n;break}do if(!m)i=0;else{c[6995]=(c[6995]|0)+1;h=sc((m<<2|3)+16|0)|0;if(!h){i=0;break}c[(h+4+15&-16)+-4>>2]=h;i=h+4+15&-16}while(0);if((d|0)>0){h=0;do{c[i+(h<<2)>>2]=c[j+(h<<2)>>2];h=h+1|0}while((h|0)!=(d|0));if(!n){d=m;j=i;u=i;break}}else if((j|0)==0|(n|0)==0){d=m;j=i;u=i;break}c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0);d=m;j=i;u=i}else u=n;while(0);c[j+(o<<2)>>2]=c[q>>2];o=k+2|0;q=(c[(c[Z+12>>2]|0)+(v<<2)>>2]|0)+8|0;do if((o|0)==(d|0)){m=d|0?d<<1:1;if((d|0)>=(m|0)){m=d;n=u;break}do if(!m)n=0;else{c[6995]=(c[6995]|0)+1;h=sc((m<<2|3)+16|0)|0;if(!h){n=0;break}c[(h+4+15&-16)+-4>>2]=h;n=h+4+15&-16}while(0);if((d|0)>0){h=0;do{c[n+(h<<2)>>2]=c[j+(h<<2)>>2];h=h+1|0}while((h|0)!=(d|0));if(!u){j=n;i=n;break}}else if((j|0)==0|(u|0)==0){j=n;i=n;break}c[6996]=(c[6996]|0)+1;Cd(c[u+-4>>2]|0);j=n;i=n}else{m=d;n=u}while(0);c[j+(o<<2)>>2]=c[q>>2];d=c[Z+12>>2]|0;h=c[d+(v<<2)>>2]|0;c[d+(c[h+24>>2]<<2)>>2]=0;if(h|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}k=k+3|0;h=c[Z+4>>2]|0}v=v+1|0}while((v|0)<(h|0));c[Z+44>>2]=(k|0)/3|0;if((k|0)>0){c[6995]=(c[6995]|0)+1;h=sc((k<<2|3)+16|0)|0;if(!h)d=0;else{c[(h+4+15&-16)+-4>>2]=h;d=h+4+15&-16}Yk(d|0,0,k<<2|0)|0;h=0;do{c[d+(h<<2)>>2]=c[j+(h<<2)>>2];h=h+1|0}while((h|0)!=(k|0));n=i;m=j;h=d;S=d}else{n=i;m=j;h=0;S=0}}else{c[Z+44>>2]=0;n=0;m=0;h=0;k=0;S=0}i=c[Z+4>>2]|0;if((i|0)<0){if((c[Z+8>>2]|0)<0){j=c[Z+12>>2]|0;if(j|0){if(a[Z+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[Z+12>>2]=0}a[Z+16>>0]=1;c[Z+12>>2]=0;c[Z+8>>2]=0}do{c[(c[Z+12>>2]|0)+(i<<2)>>2]=0;i=i+1|0}while((i|0)!=0)}c[Z+4>>2]=0;if(!((m|0)==0|(n|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[n+-4>>2]|0)}R=c[Z+44>>2]|0;m=(U|0)>0;if(m){c[6995]=(c[6995]|0)+1;i=sc((U<<4|3)+16|0)|0;if(!i)j=0;else{c[(i+4+15&-16)+-4>>2]=i;j=i+4+15&-16}i=0;do{e=j+(i<<4)|0;c[e>>2]=c[Z+48>>2];c[e+4>>2]=c[Z+48+4>>2];c[e+8>>2]=c[Z+48+8>>2];c[e+12>>2]=c[Z+48+12>>2];i=i+1|0}while((i|0)!=(U|0));Q=j;O=j}else{Q=0;O=0}j=c[Z+24>>2]|0;do if((j|0)>0){c[6995]=(c[6995]|0)+1;i=sc((j<<2|3)+16|0)|0;if(!i)d=0;else{c[(i+4+15&-16)+-4>>2]=i;d=i+4+15&-16}Yk(d|0,0,j<<2|0)|0;if((c[Z+24>>2]|0)<=0){G=d;F=d;break}j=c[Z+32>>2]|0;i=0;do{c[d+(i<<2)>>2]=c[j+(i<<2)>>2];i=i+1|0}while((i|0)<(c[Z+24>>2]|0));G=d;F=d}else{G=0;F=0}while(0);if(m){c[6995]=(c[6995]|0)+1;i=sc((V|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}Yk(i|0,0,V|0)|0;u=i;v=i}else{u=0;v=0}Yk(v|0,0,V|0)|0;if((R|0)<=0)if(!u)w=0;else{i=0;W=221}else{q=c[Z+32>>2]|0;o=0;i=0;do{j=h+(o<<2)|0;m=c[j>>2]|0;n=u+(m<<2)|0;d=c[n>>2]|0;if(!d){c[j>>2]=i;c[Q+(i<<4)>>2]=c[X+(m<<4)>>2];c[Q+(i<<4)+4>>2]=c[X+(m<<4)+4>>2];c[Q+(i<<4)+8>>2]=c[X+(m<<4)+8>>2];d=c[Z+24>>2]|0;if((d|0)>0){j=0;do{if((c[G+(j<<2)>>2]|0)==(m|0))c[q+(j<<2)>>2]=i;j=j+1|0}while((j|0)!=(d|0))}i=i+1|0;c[n>>2]=i}else c[j>>2]=d+-1;o=o+1|0}while((o|0)!=(R*3|0));W=221}do if((W|0)==221){if(!v){w=i;break}c[6996]=(c[6996]|0)+1;Cd(c[v+-4>>2]|0);w=i}while(0);if(!((G|0)==0|(F|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[F+-4>>2]|0)}if((w|0)>0){c[6995]=(c[6995]|0)+1;i=sc((w<<4|3)+16|0)|0;if(!i)j=0;else{c[(i+4+15&-16)+-4>>2]=i;j=i+4+15&-16}i=0;do{W=j+(i<<4)|0;c[W>>2]=c[Z+48>>2];c[W+4>>2]=c[Z+48+4>>2];c[W+8>>2]=c[Z+48+8>>2];c[W+12>>2]=c[Z+48+12>>2];i=i+1|0}while((i|0)!=(w|0));m=j;d=j}else{m=0;d=0}if((R|0)>0){c[6995]=(c[6995]|0)+1;i=sc((R*12|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}j=c[Z+40>>2]|0;if(j|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[Z+40>>2]=i;Yk(i|0,0,R*12|0)|0}gi(d|0,O|0,w<<4|0)|0;gi(c[Z+40>>2]|0,S|0,R*12|0)|0;do if(k){if(!h){h=0;break}c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);h=0}while(0);if((Q|0)==0|(O|0)==0){q=m;u=R;v=R*3|0;break}c[6996]=(c[6996]|0)+1;Cd(c[O+-4>>2]|0);q=m;u=R;v=R*3|0;break}}}w=0;h=0;q=0;u=0;v=0}while(0);if(!((Y|0)==0|(X|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[X+-4>>2]|0)}if(h|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[6995]=(c[6995]|0)+1;h=sc(1271)|0;if(!h)F=0;else{c[(h+4+15&-16)+-4>>2]=h;F=h+4+15&-16}Bc(F,b,w,q,0);if((u|0)>0){i=F+780|0;j=F+792|0;d=F+800|0;k=F+984|0;h=0;do{o=h*3|0;b=c[Z+40>>2]|0;m=c[b+(o<<2)>>2]|0;n=c[b+(o+1<<2)>>2]|0;o=c[b+(o+2<<2)>>2]|0;if((m|0)<(n|0)){X=c[i>>2]|0;Xh(F,0);b=(c[j>>2]|0)+-1|0;Y=c[d>>2]|0;c[Y+(b*52|0)+24>>2]=X+(m*104|0);c[Y+(b*52|0)+28>>2]=X+(n*104|0);M=+g[X+(m*104|0)+8>>2]-+g[X+(n*104|0)+8>>2];N=+g[X+(m*104|0)+12>>2]-+g[X+(n*104|0)+12>>2];T=+g[X+(m*104|0)+16>>2]-+g[X+(n*104|0)+16>>2];g[Y+(b*52|0)+32>>2]=+D(+(M*M+N*N+T*T));a[k>>0]=1}if((n|0)<(o|0)){X=c[i>>2]|0;Xh(F,0);b=(c[j>>2]|0)+-1|0;Y=c[d>>2]|0;c[Y+(b*52|0)+24>>2]=X+(n*104|0);c[Y+(b*52|0)+28>>2]=X+(o*104|0);M=+g[X+(n*104|0)+8>>2]-+g[X+(o*104|0)+8>>2];N=+g[X+(n*104|0)+12>>2]-+g[X+(o*104|0)+12>>2];T=+g[X+(n*104|0)+16>>2]-+g[X+(o*104|0)+16>>2];g[Y+(b*52|0)+32>>2]=+D(+(M*M+N*N+T*T));a[k>>0]=1}if((o|0)<(m|0)){X=c[i>>2]|0;Xh(F,0);b=(c[j>>2]|0)+-1|0;Y=c[d>>2]|0;c[Y+(b*52|0)+24>>2]=X+(o*104|0);c[Y+(b*52|0)+28>>2]=X+(m*104|0);M=+g[X+(o*104|0)+8>>2]-+g[X+(m*104|0)+8>>2];N=+g[X+(o*104|0)+12>>2]-+g[X+(m*104|0)+12>>2];T=+g[X+(o*104|0)+16>>2]-+g[X+(m*104|0)+16>>2];g[Y+(b*52|0)+32>>2]=+D(+(M*M+N*N+T*T));a[k>>0]=1}bg(F,m,n,o,0);h=h+1|0}while((h|0)!=(u|0))}if(w)if(!q)u=0;else{c[6996]=(c[6996]|0)+1;Cd(c[q+-4>>2]|0);u=0}else u=q;if(v|0){h=c[Z+40>>2]|0;if(h|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);c[Z+40>>2]=0}c[Z+40>>2]=0}if(f){j=c[F+792>>2]|0;if((j|0)>0){d=F+800|0;h=243703;i=0;do{k=c[d>>2]|0;m=k+(i*52|0)|0;h=(P(h,1664525)|0)+1013904223|0;n=Z+48|0;o=m;q=n+52|0;do{c[n>>2]=c[o>>2];n=n+4|0;o=o+4|0}while((n|0)<(q|0));n=m;o=k+(((h>>>0)%(j>>>0)|0)*52|0)|0;q=n+52|0;do{c[n>>2]=c[o>>2];n=n+4|0;o=o+4|0}while((n|0)<(q|0));n=k+(((h>>>0)%(j>>>0)|0)*52|0)|0;o=Z+48|0;q=n+52|0;do{c[n>>2]=c[o>>2];n=n+4|0;o=o+4|0}while((n|0)<(q|0));i=i+1|0}while((i|0)!=(j|0))}else h=243703;k=c[F+812>>2]|0;if((k|0)>0){m=F+820|0;i=0;do{d=c[m>>2]|0;j=d+(i*44|0)|0;h=(P(h,1664525)|0)+1013904223|0;d=d+(((h>>>0)%(k>>>0)|0)*44|0)|0;n=Z+48|0;o=j;q=n+44|0;do{c[n>>2]=c[o>>2];n=n+4|0;o=o+4|0}while((n|0)<(q|0));n=j;o=d;q=n+44|0;do{c[n>>2]=c[o>>2];n=n+4|0;o=o+4|0}while((n|0)<(q|0));n=d;o=Z+48|0;q=n+44|0;do{c[n>>2]=c[o>>2];n=n+4|0;o=o+4|0}while((n|0)<(q|0));i=i+1|0}while((i|0)!=(k|0))}}h=c[Z+32>>2]|0;if(h|0){if(a[Z+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[Z+32>>2]=0}a[Z+36>>0]=1;c[Z+32>>2]=0;c[Z+24>>2]=0;c[Z+28>>2]=0;h=c[Z+12>>2]|0;if(h|0){if(a[Z+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[Z+12>>2]=0}h=c[Z+40>>2]|0;if(h|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);c[Z+40>>2]=0}c[Z+40>>2]=0;if(!u){l=Z;return F|0}c[6996]=(c[6996]|0)+1;Cd(c[u+-4>>2]|0);l=Z;return F|0}function jc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0.0,M=0.0,N=0.0,O=0.0;K=l;l=l+16|0;f=c[b+1112>>2]|0;if((f|0)>0)while(1){j=c[c[b+1120>>2]>>2]|0;f=c[j+348>>2]|0;if(f|0){Ag(b+1068|0,f)|0;h=c[b+1072>>2]|0;if(h|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+1072>>2]=f;c[b+1080>>2]=(c[b+1080>>2]|0)+-1}f=c[j+52>>2]|0;if(f|0){if(a[j+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[j+52>>2]=0}a[j+56>>0]=1;c[j+52>>2]=0;c[j+44>>2]=0;c[j+48>>2]=0;f=c[j+32>>2]|0;if(f|0){if(a[j+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[j+32>>2]=0}a[j+36>>0]=1;c[j+32>>2]=0;c[j+24>>2]=0;c[j+28>>2]=0;f=c[j+12>>2]|0;if(f|0){if(a[j+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[j+12>>2]=0}a[j+16>>0]=1;c[j+12>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);f=c[b+1112>>2]|0;a:do if((f|0)>0){i=c[b+1120>>2]|0;h=0;while(1){if((c[i+(h<<2)>>2]|0)==(j|0))break a;h=h+1|0;if((h|0)>=(f|0)){h=f;break}}}else h=f;while(0);if((f|0)>(h|0)){E=c[b+1120>>2]|0;F=E+(h<<2)|0;G=c[F>>2]|0;c[F>>2]=c[E+(f+-1<<2)>>2];c[(c[b+1120>>2]|0)+(f+-1<<2)>>2]=G;c[b+1112>>2]=f+-1;f=f+-1|0}if((f|0)<=0){h=f;break}}else h=f;f=c[b+772>>2]|0;f=(f|0)>(d|0)?d:f;if((h|0)<(f|0)){if((c[b+1116>>2]|0)<(f|0)){if(f){c[6995]=(c[6995]|0)+1;i=sc((f<<2|3)+16|0)|0;if(!i)i=0;else{c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}d=c[b+1112>>2]|0;if((d|0)>0){j=0;do{c[i+(j<<2)>>2]=c[(c[b+1120>>2]|0)+(j<<2)>>2];j=j+1|0}while((j|0)!=(d|0));j=i;i=b+1120|0}else{j=i;i=b+1120|0}}else{j=0;i=b+1120|0}d=c[i>>2]|0;if(d|0){if(a[b+1124>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0)}c[i>>2]=0}a[b+1124>>0]=1;c[i>>2]=j;c[b+1116>>2]=f}else i=b+1120|0;do{c[(c[i>>2]|0)+(h<<2)>>2]=0;h=h+1|0}while((h|0)!=(f|0))}c[b+1112>>2]=f;if((f|0)>0){h=0;do{c[6995]=(c[6995]|0)+1;f=sc(403)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}a[f+16>>0]=1;c[f+12>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;a[f+36>>0]=1;c[f+32>>2]=0;c[f+24>>2]=0;c[f+28>>2]=0;a[f+56>>0]=1;c[f+52>>2]=0;c[f+44>>2]=0;c[f+48>>2]=0;j=f+348|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;g[f+368>>2]=100.0;g[f+372>>2]=.009999999776482582;a[f+376>>0]=0;c[(c[b+1120>>2]|0)+(h<<2)>>2]=f;j=c[b+1120>>2]|0;a[(c[j+(h<<2)>>2]|0)+377>>0]=1;h=h+1|0;f=c[b+1112>>2]|0}while((h|0)<(f|0));if((f|0)>0){h=c[b+772>>2]|0;if((h|0)>0){i=0;k=0.0;m=0.0;n=0.0;d=f;while(1){p=c[b+780>>2]|0;v=k+ +g[p+(i*104|0)+8>>2];m=m+ +g[p+(i*104|0)+12>>2];w=n+ +g[p+(i*104|0)+16>>2];o=c[j+(((i*29873|0)%(d|0)|0)<<2)>>2]|0;p=p+(i*104|0)|0;j=c[o+24>>2]|0;if((j|0)==(c[o+28>>2]|0)?(q=j|0?j<<1:1,(j|0)<(q|0)):0){if(!q)h=0;else{c[6995]=(c[6995]|0)+1;h=sc((q<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}j=c[o+24>>2]|0}if((j|0)>0){d=0;do{c[h+(d<<2)>>2]=c[(c[o+32>>2]|0)+(d<<2)>>2];d=d+1|0}while((d|0)!=(j|0))}d=c[o+32>>2]|0;if(d){if(a[o+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);j=c[o+24>>2]|0}c[o+32>>2]=0}a[o+36>>0]=1;c[o+32>>2]=h;c[o+28>>2]=q;h=c[b+772>>2]|0}c[(c[o+32>>2]|0)+(j<<2)>>2]=p;c[o+24>>2]=j+1;i=i+1|0;if((i|0)>=(h|0))break;k=v;n=w;d=c[b+1112>>2]|0;j=c[b+1120>>2]|0}k=1.0/+(h|0);if((f|0)>=0)if(!f){i=0;n=v*k;m=m*k;k=w*k;J=70}else{n=v*k;m=m*k;k=w*k;J=68}else{E=b+780|0;G=0;F=0}}else{n=1.0/+(h|0)*0.0;m=1.0/+(h|0)*0.0;k=1.0/+(h|0)*0.0;J=68}if((J|0)==68){c[6995]=(c[6995]|0)+1;h=sc((f<<4|3)+16|0)|0;if(!h){i=0;J=70}else{c[(h+4+15&-16)+-4>>2]=h;i=h+4+15&-16;J=70}}if((J|0)==70){h=0;do{g[i+(h<<4)>>2]=n;g[i+(h<<4)+4>>2]=m;g[i+(h<<4)+8>>2]=k;g[i+(h<<4)+12>>2]=0.0;h=h+1|0}while((h|0)!=(f|0));E=b+780|0;G=i;F=i}t=G+4|0;u=G+8|0;s=0;do{z=+(s|0)*.0625;z=2.0-(z>1.0?1.0:z);d=0;o=0;while(1){h=c[(c[b+1120>>2]|0)+(o<<2)>>2]|0;j=c[h+24>>2]|0;if((j|0)>0){i=c[h+32>>2]|0;h=0;k=0.0;m=0.0;n=0.0;do{r=c[i+(h<<2)>>2]|0;k=k+ +g[r+8>>2];m=m+ +g[r+12>>2];n=n+ +g[r+16>>2];h=h+1|0}while((h|0)!=(j|0))}else{n=0.0;m=0.0;k=0.0}if(!j)r=d;else{q=G+(o<<4)|0;w=+g[q>>2];r=G+(o<<4)+4|0;x=+g[r>>2];h=G+(o<<4)+8|0;y=+g[h>>2];v=w+z*(k*(1.0/+(j|0))-w);m=x+z*(m*(1.0/+(j|0))-x);k=y+z*(n*(1.0/+(j|0))-y);g[q>>2]=v;g[r>>2]=m;g[h>>2]=k;g[G+(o<<4)+12>>2]=0.0;j=c[(c[b+1120>>2]|0)+(o<<2)>>2]|0;h=c[j+24>>2]|0;if((h|0)<0){if((c[j+28>>2]|0)<0){i=c[j+32>>2]|0;if(i|0){if(a[j+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[j+32>>2]=0}a[j+36>>0]=1;c[j+32>>2]=0;c[j+28>>2]=0}do{c[(c[j+32>>2]|0)+(h<<2)>>2]=0;h=h+1|0}while((h|0)!=0)}c[j+24>>2]=0;r=d|(v-w)*(v-w)+(m-x)*(m-x)+(k-y)*(k-y)>1.1920928955078125e-07}o=o+1|0;if((o|0)>=(f|0))break;else d=r}s=s+1|0;h=c[b+772>>2]|0;b:do if((h|0)>0){if((f|0)>1)q=0;else{p=0;while(1){d=c[c[b+1120>>2]>>2]|0;o=(c[E>>2]|0)+(p*104|0)|0;i=c[d+24>>2]|0;if((i|0)==(c[d+28>>2]|0)?(D=i|0?i<<1:1,(i|0)<(D|0)):0){if(!D)h=0;else{c[6995]=(c[6995]|0)+1;h=sc((D<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}i=c[d+24>>2]|0}if((i|0)>0){j=0;do{c[h+(j<<2)>>2]=c[(c[d+32>>2]|0)+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0))}j=c[d+32>>2]|0;if(j){if(a[d+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);i=c[d+24>>2]|0}c[d+32>>2]=0}a[d+36>>0]=1;c[d+32>>2]=h;c[d+28>>2]=D;h=c[b+772>>2]|0}c[(c[d+32>>2]|0)+(i<<2)>>2]=o;c[d+24>>2]=i+1;p=p+1|0;if((p|0)>=(h|0))break b}}do{o=c[E>>2]|0;m=+g[o+(q*104|0)+8>>2];n=+g[o+(q*104|0)+12>>2];v=+g[o+(q*104|0)+16>>2];i=1;k=+C(+(+g[G>>2]-m))+ +C(+(+g[t>>2]-n))+ +C(+(+g[u>>2]-v));j=0;while(1){w=+C(+(+g[G+(i<<4)>>2]-m))+ +C(+(+g[G+(i<<4)+4>>2]-n))+ +C(+(+g[G+(i<<4)+8>>2]-v));d=w>2]|0)+(j<<2)>>2]|0;d=o+(q*104|0)|0;i=c[p+24>>2]|0;if((i|0)==(c[p+28>>2]|0)?(B=i|0?i<<1:1,(i|0)<(B|0)):0){if(!B)h=0;else{c[6995]=(c[6995]|0)+1;h=sc((B<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}i=c[p+24>>2]|0}if((i|0)>0){j=0;do{c[h+(j<<2)>>2]=c[(c[p+32>>2]|0)+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0))}j=c[p+32>>2]|0;if(j){if(a[p+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);i=c[p+24>>2]|0}c[p+32>>2]=0}a[p+36>>0]=1;c[p+32>>2]=h;c[p+28>>2]=B;h=c[b+772>>2]|0}c[(c[p+32>>2]|0)+(i<<2)>>2]=d;c[p+24>>2]=i+1;q=q+1|0}while((q|0)<(h|0))}while(0)}while((s|0)<(e|0)&r);if((h|0)>0){h=h<<2;c[6995]=(c[6995]|0)+1;f=sc((h|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}Yk(f|0,-1,h|0)|0;e=f;u=f}else{e=0;u=0}f=c[b+1112>>2]|0;if((f|0)>0){o=c[b+1120>>2]|0;d=0;do{j=c[o+(d<<2)>>2]|0;if((c[j+24>>2]|0)>0){i=c[E>>2]|0;h=c[j+32>>2]|0;f=0;do{c[e+((((c[h+(f<<2)>>2]|0)-i|0)/104|0)<<2)>>2]=d;f=f+1|0}while((f|0)<(c[j+24>>2]|0));f=c[b+1112>>2]|0}d=d+1|0}while((d|0)<(f|0))}if((c[b+812>>2]|0)>0){r=0;do{D=c[b+820>>2]|0;q=c[E>>2]|0;f=((c[D+(r*44|0)+8>>2]|0)-q|0)/104|0;c[K>>2]=f;c[K+4>>2]=((c[D+(r*44|0)+12>>2]|0)-q|0)/104|0;c[K+8>>2]=((c[D+(r*44|0)+16>>2]|0)-q|0)/104|0;q=0;while(1){o=c[e+(f<<2)>>2]|0;d=1;do{f=c[K+(((d+q|0)%3|0)<<2)>>2]|0;c:do if((c[e+(f<<2)>>2]|0)!=(o|0)){p=c[(c[b+1120>>2]|0)+(o<<2)>>2]|0;j=(c[E>>2]|0)+(f*104|0)|0;h=c[p+24>>2]|0;d:do if((h|0)>0){i=c[p+32>>2]|0;f=0;while(1){if((c[i+(f<<2)>>2]|0)==(j|0))break;f=f+1|0;if((f|0)>=(h|0))break d}if((f|0)!=(h|0))break c}while(0);if((h|0)==(c[p+28>>2]|0)?(H=h|0?h<<1:1,(h|0)<(H|0)):0){if(!H)f=0;else{c[6995]=(c[6995]|0)+1;f=sc((H<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[p+24>>2]|0}if((h|0)>0){i=0;do{c[f+(i<<2)>>2]=c[(c[p+32>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(h|0))}i=c[p+32>>2]|0;if(i){if(a[p+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);h=c[p+24>>2]|0}c[p+32>>2]=0}a[p+36>>0]=1;c[p+32>>2]=f;c[p+28>>2]=H;f=h}else f=h;c[(c[p+32>>2]|0)+(f<<2)>>2]=j;c[p+24>>2]=f+1}while(0);d=d+1|0}while((d|0)!=3);f=q+1|0;if((f|0)>=3)break;q=f;f=c[K+(f<<2)>>2]|0}r=r+1|0}while((r|0)<(c[b+812>>2]|0));f=c[b+1112>>2]|0}if((f|0)>1){c[6995]=(c[6995]|0)+1;f=sc(403)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}a[f+16>>0]=1;c[f+12>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;p=f+36|0;a[p>>0]=1;q=f+32|0;c[q>>2]=0;r=f+24|0;c[r>>2]=0;s=f+28|0;c[s>>2]=0;a[f+56>>0]=1;c[f+52>>2]=0;c[f+44>>2]=0;c[f+48>>2]=0;t=f+348|0;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;g[f+368>>2]=100.0;g[f+372>>2]=.009999999776482582;a[f+376>>0]=0;t=f;a[f+377>>0]=0;j=c[b+772>>2]|0;if((j|0)>0){c[6995]=(c[6995]|0)+1;f=sc((j<<2|3)+16|0)|0;if(!f)i=0;else{c[(f+4+15&-16)+-4>>2]=f;i=f+4+15&-16}h=c[r>>2]|0;if((h|0)>0){f=0;do{c[i+(f<<2)>>2]=c[(c[q>>2]|0)+(f<<2)>>2];f=f+1|0}while((f|0)!=(h|0))}f=c[q>>2]|0;if(f|0){if(a[p>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[q>>2]=0}a[p>>0]=1;c[q>>2]=i;c[s>>2]=j;f=c[b+772>>2]|0;if((f|0)>0){o=0;i=c[r>>2]|0;h=j;while(1){d=(c[E>>2]|0)+(o*104|0)|0;do if((i|0)==(h|0)){j=h|0?h<<1:1;if((h|0)>=(j|0)){j=h;break}if(!j)f=0;else{c[6995]=(c[6995]|0)+1;f=sc((j<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[r>>2]|0}if((h|0)>0){i=0;do{c[f+(i<<2)>>2]=c[(c[q>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(h|0))}i=c[q>>2]|0;if(i){if(a[p>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);h=c[r>>2]|0}c[q>>2]=0}a[p>>0]=1;c[q>>2]=f;c[s>>2]=j;f=c[b+772>>2]|0}else{j=h;h=i}while(0);c[(c[q>>2]|0)+(h<<2)>>2]=d;i=h+1|0;c[r>>2]=i;o=o+1|0;if((o|0)>=(f|0))break;else h=j}}}f=c[b+1112>>2]|0;if((f|0)==(c[b+1116>>2]|0)?(I=f|0?f<<1:1,(f|0)<(I|0)):0){if(!I)i=0;else{c[6995]=(c[6995]|0)+1;f=sc((I<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=f;f=c[b+1112>>2]|0}if((f|0)>0){h=0;do{c[i+(h<<2)>>2]=c[(c[b+1120>>2]|0)+(h<<2)>>2];h=h+1|0}while((h|0)!=(f|0))}h=c[b+1120>>2]|0;if(h){if(a[b+1124>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0);f=c[b+1112>>2]|0}c[b+1120>>2]=0}a[b+1124>>0]=1;c[b+1120>>2]=i;c[b+1116>>2]=I}c[(c[b+1120>>2]|0)+(f<<2)>>2]=t;I=f+1|0;c[b+1112>>2]=I;E=c[b+1120>>2]|0;f=E+(f<<2)|0;H=c[E>>2]|0;c[E>>2]=c[f>>2];c[f>>2]=H;f=I}if((f|0)>0){h=0;do{d=c[(c[b+1120>>2]|0)+(h<<2)>>2]|0;do if(!(c[d+24>>2]|0)){j=h+-1|0;f=c[d+348>>2]|0;if(f|0){Ag(b+1068|0,f)|0;h=c[b+1072>>2]|0;if(h|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+1072>>2]=f;c[b+1080>>2]=(c[b+1080>>2]|0)+-1}f=c[d+52>>2]|0;if(f|0){if(a[d+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[d+52>>2]=0}a[d+56>>0]=1;c[d+52>>2]=0;c[d+44>>2]=0;c[d+48>>2]=0;f=c[d+32>>2]|0;if(f|0){if(a[d+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[d+32>>2]=0}a[d+36>>0]=1;c[d+32>>2]=0;c[d+24>>2]=0;c[d+28>>2]=0;f=c[d+12>>2]|0;if(f|0){if(a[d+16>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[f+-4>>2]|0)}c[d+12>>2]=0}a[d+16>>0]=1;c[d+12>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[6996]=(c[6996]|0)+1;Cd(c[d+-4>>2]|0);f=c[b+1112>>2]|0;e:do if((f|0)>0){i=c[b+1120>>2]|0;h=0;while(1){if((c[i+(h<<2)>>2]|0)==(d|0))break e;h=h+1|0;if((h|0)>=(f|0)){h=f;break}}}else h=f;while(0);if((f|0)<=(h|0)){h=j;break}H=c[b+1120>>2]|0;I=H+(h<<2)|0;h=c[I>>2]|0;c[I>>2]=c[H+(f+-1<<2)>>2];c[(c[b+1120>>2]|0)+(f+-1<<2)>>2]=h;c[b+1112>>2]=f+-1;h=j;f=f+-1|0}while(0);h=h+1|0}while((h|0)<(f|0))}if(!((e|0)==0|(u|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[u+-4>>2]|0)}if(!((G|0)==0|(F|0)==0)){c[6996]=(c[6996]|0)+1;Cd(c[F+-4>>2]|0)}}else J=234}else J=234;f:do if((J|0)==234){d=c[b+832>>2]|0;if(d|0){if((f|0)<(d|0)){if((c[b+1116>>2]|0)<(d|0)){c[6995]=(c[6995]|0)+1;h=sc((d<<2|3)+16|0)|0;if(!h)j=0;else{c[(h+4+15&-16)+-4>>2]=h;j=h+4+15&-16}i=c[b+1112>>2]|0;if((i|0)>0){h=0;do{c[j+(h<<2)>>2]=c[(c[b+1120>>2]|0)+(h<<2)>>2];h=h+1|0}while((h|0)!=(i|0))}h=c[b+1120>>2]|0;if(h|0){if(a[b+1124>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[b+1120>>2]=0}a[b+1124>>0]=1;c[b+1120>>2]=j;c[b+1116>>2]=d;h=b+1120|0}else h=b+1120|0;do{c[(c[h>>2]|0)+(f<<2)>>2]=0;f=f+1|0}while((f|0)!=(d|0))}c[b+1112>>2]=d;if((d|0)>0){h=0;do{c[6995]=(c[6995]|0)+1;f=sc(403)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}a[f+16>>0]=1;c[f+12>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;a[f+36>>0]=1;c[f+32>>2]=0;c[f+24>>2]=0;c[f+28>>2]=0;a[f+56>>0]=1;c[f+52>>2]=0;c[f+44>>2]=0;c[f+48>>2]=0;I=f+348|0;c[I>>2]=0;c[I+4>>2]=0;c[I+8>>2]=0;c[I+12>>2]=0;c[I+16>>2]=0;g[f+368>>2]=100.0;g[f+372>>2]=.009999999776482582;a[f+376>>0]=0;c[(c[b+1120>>2]|0)+(h<<2)>>2]=f;a[(c[(c[b+1120>>2]|0)+(h<<2)>>2]|0)+377>>0]=1;h=h+1|0}while((h|0)<(c[b+1112>>2]|0))}if((c[b+832>>2]|0)<=0)break;d=0;while(1){j=0;do{o=c[(c[b+1120>>2]|0)+(d<<2)>>2]|0;p=(c[b+840>>2]|0)+(d*104|0)+8+(j<<2)|0;h=c[o+24>>2]|0;if((h|0)==(c[o+28>>2]|0)?(r=h|0?h<<1:1,(h|0)<(r|0)):0){if(!r)f=0;else{c[6995]=(c[6995]|0)+1;f=sc((r<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[o+24>>2]|0}if((h|0)>0){i=0;do{c[f+(i<<2)>>2]=c[(c[o+32>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(h|0))}i=c[o+32>>2]|0;if(i){if(a[o+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);h=c[o+24>>2]|0}c[o+32>>2]=0}a[o+36>>0]=1;c[o+32>>2]=f;c[o+28>>2]=r;f=h}else f=h;c[(c[o+32>>2]|0)+(f<<2)>>2]=c[p>>2];c[o+24>>2]=f+1;j=j+1|0}while((j|0)!=4);d=d+1|0;if((d|0)>=(c[b+832>>2]|0))break f}}d=c[b+812>>2]|0;if((f|0)<(d|0)){if((c[b+1116>>2]|0)<(d|0)){if(d){c[6995]=(c[6995]|0)+1;h=sc((d<<2|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}j=c[b+1112>>2]|0;if((j|0)>0){i=0;do{c[h+(i<<2)>>2]=c[(c[b+1120>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(j|0));j=b+1120|0}else j=b+1120|0}else{h=0;j=b+1120|0}i=c[j>>2]|0;if(i|0){if(a[b+1124>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[j>>2]=0}a[b+1124>>0]=1;c[j>>2]=h;c[b+1116>>2]=d}do{c[(c[b+1120>>2]|0)+(f<<2)>>2]=0;f=f+1|0}while((f|0)!=(d|0))}c[b+1112>>2]=d;if((d|0)>0){h=0;do{c[6995]=(c[6995]|0)+1;f=sc(403)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}a[f+16>>0]=1;c[f+12>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;a[f+36>>0]=1;c[f+32>>2]=0;c[f+24>>2]=0;c[f+28>>2]=0;a[f+56>>0]=1;c[f+52>>2]=0;c[f+44>>2]=0;c[f+48>>2]=0;I=f+348|0;c[I>>2]=0;c[I+4>>2]=0;c[I+8>>2]=0;c[I+12>>2]=0;c[I+16>>2]=0;g[f+368>>2]=100.0;g[f+372>>2]=.009999999776482582;a[f+376>>0]=0;c[(c[b+1120>>2]|0)+(h<<2)>>2]=f;a[(c[(c[b+1120>>2]|0)+(h<<2)>>2]|0)+377>>0]=1;h=h+1|0}while((h|0)<(c[b+1112>>2]|0))}if((c[b+812>>2]|0)>0){d=0;do{j=0;do{o=c[(c[b+1120>>2]|0)+(d<<2)>>2]|0;p=(c[b+820>>2]|0)+(d*44|0)+8+(j<<2)|0;h=c[o+24>>2]|0;if((h|0)==(c[o+28>>2]|0)?(s=h|0?h<<1:1,(h|0)<(s|0)):0){if(!s)f=0;else{c[6995]=(c[6995]|0)+1;f=sc((s<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}h=c[o+24>>2]|0}if((h|0)>0){i=0;do{c[f+(i<<2)>>2]=c[(c[o+32>>2]|0)+(i<<2)>>2];i=i+1|0}while((i|0)!=(h|0))}i=c[o+32>>2]|0;if(i){if(a[o+36>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0);h=c[o+24>>2]|0}c[o+32>>2]=0}a[o+36>>0]=1;c[o+32>>2]=f;c[o+28>>2]=s;f=h}else f=h;c[(c[o+32>>2]|0)+(f<<2)>>2]=c[p>>2];c[o+24>>2]=f+1;j=j+1|0}while((j|0)!=3);d=d+1|0}while((d|0)<(c[b+812>>2]|0))}}while(0);f=c[b+1112>>2]|0;if(!f){b=0;l=K;return b|0}if((f|0)>0){p=0;do{q=c[(c[b+1120>>2]|0)+(p<<2)>>2]|0;g[q+128>>2]=0.0;o=c[q+24>>2]|0;d=c[q+4>>2]|0;if((o|0)>(d|0)){if((c[q+8>>2]|0)<(o|0)){if(!o){f=0;i=d}else{c[6995]=(c[6995]|0)+1;f=sc((o<<2|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=c[q+4>>2]|0}j=c[q+12>>2]|0;if((i|0)<=0)if(!j)h=q+16|0;else J=324;else{h=0;do{c[f+(h<<2)>>2]=c[j+(h<<2)>>2];h=h+1|0}while((h|0)!=(i|0));J=324}if((J|0)==324){J=0;if(!(a[q+16>>0]|0))h=q+16|0;else{c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);h=q+16|0}}a[h>>0]=1;c[q+12>>2]=f;c[q+8>>2]=o}else f=c[q+12>>2]|0;Yk(f+(d<<2)|0,0,o-d<<2|0)|0;d=c[q+24>>2]|0}else d=o;c[q+4>>2]=o;j=(d|0)>0;if(j){h=c[q+32>>2]|0;i=c[q+12>>2]|0;f=0;do{k=+g[(c[h+(f<<2)>>2]|0)+88>>2];if(k==0.0){a[q+376>>0]=1;k=999999984306749440.0}else k=1.0/k;g[i+(f<<2)>>2]=k;m=k+ +g[q+128>>2];g[q+128>>2]=m;f=f+1|0}while((f|0)!=(d|0));g[q+128>>2]=1.0/m;f=0;k=0.0;n=0.0;v=0.0;do{I=c[h+(f<<2)>>2]|0;A=+g[i+(f<<2)>>2];k=k+ +g[I+8>>2]*A;n=n+A*+g[I+12>>2];v=v+A*+g[I+16>>2];f=f+1|0}while((f|0)!=(d|0));m=1.0/m}else{m=1.0/+g[q+128>>2];g[q+128>>2]=m;v=0.0;n=0.0;k=0.0}A=k*m;z=n*m;y=v*m;g[q+228>>2]=A;g[q+232>>2]=z;g[q+236>>2]=y;g[q+240>>2]=0.0;f=q+316|0;h=f+36|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(h|0));f=q+132|0;h=f+48|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(h|0));if(j){h=c[q+32>>2]|0;i=c[q+12>>2]|0;f=0;k=0.0;x=0.0;w=0.0;m=0.0;n=0.0;v=0.0;do{I=c[h+(f<<2)>>2]|0;O=+g[I+8>>2]-A;M=+g[I+12>>2]-z;N=+g[I+16>>2]-y;L=+g[i+(f<<2)>>2];k=k+L*(M*M+N*N);g[q+132>>2]=k;x=L*(O*O+N*N)+x;g[q+152>>2]=x;w=(O*O+M*M)*L+w;g[q+172>>2]=w;m=m-M*O*L;g[q+136>>2]=m;n=n-N*O*L;g[q+140>>2]=n;v=v-N*M*L;g[q+156>>2]=v;f=f+1|0}while((f|0)!=(d|0));f=q+136|0;h=q+140|0;i=q+156|0;j=q+152|0}else{f=q+136|0;h=q+140|0;i=q+156|0;j=q+152|0;x=0.0;w=0.0;v=0.0;n=0.0;m=0.0;k=0.0}L=x*w-v*v;M=v*n-w*m;N=v*m-x*n;O=1.0/(L*k+m*M+N*n);g[q+132>>2]=L*O;g[f>>2]=(v*n-w*m)*O;g[h>>2]=(v*m-x*n)*O;g[q+144>>2]=0.0;g[q+148>>2]=M*O;g[j>>2]=(w*k-n*n)*O;g[i>>2]=(m*n-v*k)*O;g[q+160>>2]=0.0;g[q+164>>2]=N*O;g[q+168>>2]=(n*m-v*k)*O;g[q+172>>2]=(x*k-m*m)*O;g[q+176>>2]=0.0;c[q+60>>2]=1065353216;c[q+64>>2]=0;c[q+64+4>>2]=0;c[q+64+8>>2]=0;c[q+64+12>>2]=0;c[q+80>>2]=1065353216;c[q+84>>2]=0;c[q+84+4>>2]=0;c[q+84+8>>2]=0;c[q+84+12>>2]=0;c[q+100>>2]=1065353216;c[q+104>>2]=0;c[q+108>>2]=c[q+228>>2];c[q+108+4>>2]=c[q+228+4>>2];c[q+108+8>>2]=c[q+228+8>>2];c[q+108+12>>2]=c[q+228+12>>2];d=c[q+24>>2]|0;j=c[q+44>>2]|0;if((j|0)<(d|0)){if((c[q+48>>2]|0)<(d|0)){if(!d){f=0;i=j}else{c[6995]=(c[6995]|0)+1;f=sc((d<<4|3)+16|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=c[q+44>>2]|0}if((i|0)>0){h=0;do{I=f+(h<<4)|0;H=(c[q+52>>2]|0)+(h<<4)|0;c[I>>2]=c[H>>2];c[I+4>>2]=c[H+4>>2];c[I+8>>2]=c[H+8>>2];c[I+12>>2]=c[H+12>>2];h=h+1|0}while((h|0)!=(i|0))}h=c[q+52>>2]|0;if(h|0){if(a[q+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[h+-4>>2]|0)}c[q+52>>2]=0}a[q+56>>0]=1;c[q+52>>2]=f;c[q+48>>2]=d;h=q+52|0}else h=q+52|0;f=j;do{I=(c[h>>2]|0)+(f<<4)|0;c[I>>2]=c[K>>2];c[I+4>>2]=c[K+4>>2];c[I+8>>2]=c[K+8>>2];c[I+12>>2]=c[K+12>>2];f=f+1|0}while((f|0)!=(d|0))}c[q+44>>2]=d;if((d|0)>0){f=0;do{H=c[(c[q+32>>2]|0)+(f<<2)>>2]|0;N=+g[H+12>>2]-+g[q+232>>2];O=+g[H+16>>2]-+g[q+236>>2];I=c[q+52>>2]|0;g[I+(f<<4)>>2]=+g[H+8>>2]-+g[q+228>>2];g[I+(f<<4)+4>>2]=N;g[I+(f<<4)+8>>2]=O;g[I+(f<<4)+12>>2]=0.0;f=f+1|0}while((f|0)<(c[q+44>>2]|0))}p=p+1|0}while((p|0)<(c[b+1112>>2]|0))}Tc(b);f=c[b+1112>>2]|0;o=P(f,f)|0;d=c[b+1132>>2]|0;if((o|0)>(d|0)){if((c[b+1136>>2]|0)<(o|0)){if(!o){f=0;i=d}else{c[6995]=(c[6995]|0)+1;f=sc(o+19|0)|0;if(!f)f=0;else{c[(f+4+15&-16)+-4>>2]=f;f=f+4+15&-16}i=c[b+1132>>2]|0}j=c[b+1140>>2]|0;if((i|0)<=0)if(!j)h=b+1144|0;else J=372;else{h=0;do{a[f+h>>0]=a[j+h>>0]|0;h=h+1|0}while((h|0)!=(i|0));J=372}if((J|0)==372)if(!(a[b+1144>>0]|0))h=b+1144|0;else{c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0);h=b+1144|0}a[h>>0]=1;c[b+1140>>2]=f;c[b+1136>>2]=o}else f=c[b+1140>>2]|0;Yk(f+d|0,0,o-d|0)|0;f=c[b+1112>>2]|0}c[b+1132>>2]=o;if((f|0)<=0){b=f;l=K;return b|0}e=c[b+1120>>2]|0;s=c[b+1140>>2]|0;r=0;do{t=c[e+(r<<2)>>2]|0;c[t+380>>2]=r;u=c[t+24>>2]|0;q=0;do{j=c[e+(q<<2)>>2]|0;g:do if((u|0)>0){d=c[j+24>>2]|0;h=0;while(1){if((d|0)>0){p=c[(c[t+32>>2]|0)+(h<<2)>>2]|0;o=c[j+32>>2]|0;i=0;do{if((p|0)==(c[o+(i<<2)>>2]|0)){h=1;break g}i=i+1|0}while((i|0)<(d|0))}h=h+1|0;if((h|0)>=(u|0)){h=0;break}}}else h=0;while(0);a[s+((P(f,q)|0)+r)>>0]=h;q=q+1|0}while((q|0)!=(f|0));r=r+1|0}while((r|0)!=(f|0));l=K;return f|0}function kc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0.0,k=0.0,m=0,n=0.0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.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,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0;ja=l;l=l+64|0;if((e|0)<=0){l=ja;return}$=ja+16+4|0;aa=ja+16+8|0;Y=0;do{ba=c[d+(Y<<2)>>2]|0;ca=c[ba+772>>2]|0;da=c[ba+776>>2]|0;ea=Rj(b,ca,+g[f+12>>2])|0;fa=Rj(b,da,+g[f+12>>2])|0;ga=c[b+16>>2]|0;O=+g[ga+(ea*244|0)+128>>2];P=+g[ga+(ea*244|0)+132>>2];U=+g[ga+(ea*244|0)+136>>2];if(!(O*O+P*P+U*U<1.4210854715202004e-14?(O=+g[ga+(fa*244|0)+128>>2],P=+g[ga+(fa*244|0)+132>>2],U=+g[ga+(fa*244|0)+136>>2],O*O+P*P+U*U<1.4210854715202004e-14):0))ia=5;if((ia|0)==5?(ia=0,ha=c[ba+780>>2]|0,(ha|0)>0):0){Z=0;h=ha;do{W=ba+4+(Z*192|0)|0;o=ba+4+(Z*192|0)+80|0;if(+g[o>>2]<=+g[ba+788>>2]){X=c[b+28>>2]|0;if((X|0)==(c[b+32>>2]|0)?(_=X|0?X<<1:1,(X|0)<(_|0)):0){if(!_){h=0;m=X}else{c[6995]=(c[6995]|0)+1;h=sc((_*152|3)+16|0)|0;if(!h)h=0;else{c[(h+4+15&-16)+-4>>2]=h;h=h+4+15&-16}m=c[b+28>>2]|0}if((m|0)>0){i=0;do{gi(h+(i*152|0)|0,(c[b+36>>2]|0)+(i*152|0)|0,152)|0;i=i+1|0}while((i|0)!=(m|0))}i=c[b+36>>2]|0;if(i|0){if(a[b+40>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[i+-4>>2]|0)}c[b+36>>2]=0}a[b+40>>0]=1;c[b+36>>2]=h;c[b+32>>2]=_;h=c[b+28>>2]|0}else h=X;c[b+28>>2]=h+1;V=c[b+36>>2]|0;c[V+(X*152|0)+144>>2]=ea;c[V+(X*152|0)+148>>2]=fa;c[V+(X*152|0)+132>>2]=W;y=+g[ba+4+(Z*192|0)+48>>2]-+g[ca+52>>2];z=+g[ba+4+(Z*192|0)+52>>2]-+g[ca+56>>2];x=+g[ba+4+(Z*192|0)+56>>2]-+g[ca+60>>2];g[ja+48>>2]=y;g[ja+48+4>>2]=z;g[ja+48+8>>2]=x;g[ja+48+12>>2]=0.0;F=+g[ba+4+(Z*192|0)+32>>2]-+g[da+52>>2];G=+g[ba+4+(Z*192|0)+36>>2]-+g[da+56>>2];B=+g[ba+4+(Z*192|0)+40>>2]-+g[da+60>>2];g[ja+32>>2]=F;g[ja+32+4>>2]=G;g[ja+32+8>>2]=B;g[ja+32+12>>2]=0.0;if(!(c[ga+(ea*244|0)+240>>2]|0)){j=0.0;n=0.0;s=0.0}else{U=+g[ga+(ea*244|0)+192>>2]+ +g[ga+(ea*244|0)+224>>2];s=+g[ga+(ea*244|0)+196>>2]+ +g[ga+(ea*244|0)+228>>2];n=+g[ga+(ea*244|0)+200>>2]+ +g[ga+(ea*244|0)+232>>2];j=+g[ga+(ea*244|0)+176>>2]+ +g[ga+(ea*244|0)+208>>2]+(s*x-n*z);n=+g[ga+(ea*244|0)+180>>2]+ +g[ga+(ea*244|0)+212>>2]+(n*y-U*x);s=+g[ga+(ea*244|0)+184>>2]+ +g[ga+(ea*244|0)+216>>2]+(U*z-s*y)}if(!(c[ga+(fa*244|0)+240>>2]|0)){k=0.0;r=0.0;t=0.0}else{U=+g[ga+(fa*244|0)+192>>2]+ +g[ga+(fa*244|0)+224>>2];t=+g[ga+(fa*244|0)+196>>2]+ +g[ga+(fa*244|0)+228>>2];r=+g[ga+(fa*244|0)+200>>2]+ +g[ga+(fa*244|0)+232>>2];k=+g[ga+(fa*244|0)+176>>2]+ +g[ga+(fa*244|0)+208>>2]+(t*B-r*G);r=+g[ga+(fa*244|0)+180>>2]+ +g[ga+(fa*244|0)+212>>2]+(r*F-U*B);t=+g[ga+(fa*244|0)+184>>2]+ +g[ga+(fa*244|0)+216>>2]+(U*G-t*F)}P=j-k;O=n-r;K=s-t;Q=ba+4+(Z*192|0)+64|0;L=+g[Q>>2];R=ba+4+(Z*192|0)+68|0;M=+g[R>>2];S=ba+4+(Z*192|0)+72|0;N=+g[S>>2];p=c[b+16>>2]|0;i=c[p+(ea*244|0)+240>>2]|0;m=c[p+(fa*244|0)+240>>2]|0;U=+g[f+28>>2];J=+g[f+12>>2];j=+g[f+40>>2];k=+g[f+36>>2];T=ba+4+(Z*192|0)+120|0;h=c[T>>2]|0;if(!(h&6))if(!(h&8))I=k;else{I=J*+g[ba+4+(Z*192|0)+144>>2];j=I+ +g[ba+4+(Z*192|0)+148>>2];j=j<1.1920928955078125e-07?1.1920928955078125e-07:j;I=I/j;j=1.0/j}else{j=(h&2|0)==0?j:+g[ba+4+(Z*192|0)+144>>2];if(!(h&4))I=k;else I=+g[ba+4+(Z*192|0)+148>>2]}H=1.0/J*j;if(i|0){j=((z*N-x*M)*+g[i+324>>2]+(x*L-N*y)*+g[i+328>>2]+(M*y-z*L)*+g[i+332>>2])*+g[i+604>>2];k=((z*N-x*M)*+g[i+340>>2]+(x*L-N*y)*+g[i+344>>2]+(M*y-z*L)*+g[i+348>>2])*+g[i+608>>2];n=((z*N-x*M)*+g[i+356>>2]+(x*L-N*y)*+g[i+360>>2]+(M*y-z*L)*+g[i+364>>2])*+g[i+612>>2]}else{j=0.0;k=0.0;n=0.0}g[V+(X*152|0)+64>>2]=j;g[V+(X*152|0)+68>>2]=k;g[V+(X*152|0)+72>>2]=n;g[V+(X*152|0)+76>>2]=0.0;u=+g[S>>2];v=+g[R>>2];w=+g[Q>>2];if(m|0){r=(+g[m+324>>2]*-(G*u-B*v)+ +g[m+328>>2]*-(B*w-u*F)+ +g[m+332>>2]*-(v*F-G*w))*+g[m+604>>2];s=(+g[m+340>>2]*-(G*u-B*v)+ +g[m+344>>2]*-(B*w-u*F)+ +g[m+348>>2]*-(v*F-G*w))*+g[m+608>>2];t=(+g[m+356>>2]*-(G*u-B*v)+ +g[m+360>>2]*-(B*w-u*F)+ +g[m+364>>2]*-(v*F-G*w))*+g[m+612>>2]}else{r=0.0;s=0.0;t=0.0}g[V+(X*152|0)+80>>2]=r;g[V+(X*152|0)+84>>2]=s;g[V+(X*152|0)+88>>2]=t;g[V+(X*152|0)+92>>2]=0.0;if(i|0)k=+g[i+404>>2]+((k*x-n*z)*+g[Q>>2]+(n*y-x*j)*+g[R>>2]+(z*j-k*y)*+g[S>>2]);else k=0.0;if(m|0){E=-r;j=-s;t=-t;j=+g[m+404>>2]+((B*j-G*t)*+g[Q>>2]+(F*t-B*E)*+g[R>>2]+(G*E-F*j)*+g[S>>2])}else j=0.0;g[V+(X*152|0)+108>>2]=U/(H+(k+j));if(i|0){c[V+(X*152|0)+16>>2]=c[Q>>2];c[V+(X*152|0)+16+4>>2]=c[Q+4>>2];c[V+(X*152|0)+16+8>>2]=c[Q+8>>2];c[V+(X*152|0)+16+12>>2]=c[Q+12>>2];g[V+(X*152|0)>>2]=z*N-x*M;g[V+(X*152|0)+4>>2]=x*L-N*y;g[V+(X*152|0)+8>>2]=M*y-z*L;g[V+(X*152|0)+12>>2]=0.0}else{c[V+(X*152|0)>>2]=0;c[V+(X*152|0)+4>>2]=0;c[V+(X*152|0)+8>>2]=0;c[V+(X*152|0)+12>>2]=0;c[V+(X*152|0)+16>>2]=0;c[V+(X*152|0)+20>>2]=0;c[V+(X*152|0)+24>>2]=0;c[V+(X*152|0)+28>>2]=0}if(m|0){t=-+g[R>>2];E=-+g[S>>2];g[V+(X*152|0)+48>>2]=-+g[Q>>2];g[V+(X*152|0)+52>>2]=t;g[V+(X*152|0)+56>>2]=E;g[V+(X*152|0)+60>>2]=0.0;g[V+(X*152|0)+32>>2]=-(G*u-B*v);g[V+(X*152|0)+36>>2]=-(B*w-u*F);g[V+(X*152|0)+40>>2]=-(v*F-G*w);g[V+(X*152|0)+44>>2]=0.0}else{c[V+(X*152|0)+32>>2]=0;c[V+(X*152|0)+32+4>>2]=0;c[V+(X*152|0)+32+8>>2]=0;c[V+(X*152|0)+32+12>>2]=0;c[V+(X*152|0)+32+16>>2]=0;c[V+(X*152|0)+32+20>>2]=0;c[V+(X*152|0)+32+24>>2]=0;c[V+(X*152|0)+32+28>>2]=0}E=+g[o>>2]+ +g[f+64>>2];if(i|0){r=+g[i+392>>2];s=+g[i+396>>2];w=+g[i+388>>2];t=r*x-s*z+ +g[i+372>>2];s=+g[i+376>>2]+(s*y-x*w);r=z*w-r*y+ +g[i+380>>2]}else{t=0.0;s=0.0;r=0.0}if(m|0){j=+g[m+392>>2];k=+g[m+396>>2];z=+g[m+388>>2];n=j*B-k*G+ +g[m+372>>2];k=+g[m+376>>2]+(k*F-B*z);j=G*z-j*F+ +g[m+380>>2]}else{n=0.0;k=0.0;j=0.0}B=(t-n)*+g[Q>>2]+(s-k)*+g[R>>2]+(r-j)*+g[S>>2];c[V+(X*152|0)+104>>2]=c[ba+4+(Z*192|0)+84>>2];h=+C(+B)<+g[f+96>>2];B=h?0.0:-(B*+g[ba+4+(Z*192|0)+96>>2]);B=B<=0.0?0.0:B;h=c[f+72>>2]|0;do if(!(h&4))g[V+(X*152|0)+100>>2]=0.0;else{j=+g[ba+4+(Z*192|0)+124>>2]*+g[f+68>>2];g[V+(X*152|0)+100>>2]=j;do if(i|0){if(!(c[p+(ea*244|0)+240>>2]|0))break;G=j*+g[V+(X*152|0)+20>>2]*+g[p+(ea*244|0)+132>>2]*+g[i+412>>2]*+g[p+(ea*244|0)+116>>2];F=j*+g[V+(X*152|0)+24>>2]*+g[p+(ea*244|0)+136>>2]*+g[i+416>>2]*+g[p+(ea*244|0)+120>>2];g[p+(ea*244|0)+64>>2]=+g[p+(ea*244|0)+112>>2]*j*+g[V+(X*152|0)+16>>2]*+g[p+(ea*244|0)+128>>2]*+g[i+408>>2]+ +g[p+(ea*244|0)+64>>2];g[p+(ea*244|0)+68>>2]=G+ +g[p+(ea*244|0)+68>>2];g[p+(ea*244|0)+72>>2]=F+ +g[p+(ea*244|0)+72>>2];F=j*+g[p+(ea*244|0)+100>>2]*+g[V+(X*152|0)+68>>2];G=j*+g[p+(ea*244|0)+104>>2]*+g[V+(X*152|0)+72>>2];g[p+(ea*244|0)+80>>2]=j*+g[p+(ea*244|0)+96>>2]*+g[V+(X*152|0)+64>>2]+ +g[p+(ea*244|0)+80>>2];g[p+(ea*244|0)+84>>2]=F+ +g[p+(ea*244|0)+84>>2];g[p+(ea*244|0)+88>>2]=G+ +g[p+(ea*244|0)+88>>2]}while(0);if(!m)break;j=+g[V+(X*152|0)+100>>2];if(!(c[p+(fa*244|0)+240>>2]|0))break;G=+g[V+(X*152|0)+88>>2];F=+g[V+(X*152|0)+84>>2];z=+g[V+(X*152|0)+80>>2];x=j*+g[V+(X*152|0)+52>>2]*+g[p+(fa*244|0)+132>>2]*+g[m+412>>2]*+g[p+(fa*244|0)+116>>2];y=j*+g[V+(X*152|0)+56>>2]*+g[p+(fa*244|0)+136>>2]*+g[m+416>>2]*+g[p+(fa*244|0)+120>>2];g[p+(fa*244|0)+64>>2]=+g[p+(fa*244|0)+112>>2]*j*+g[V+(X*152|0)+48>>2]*+g[p+(fa*244|0)+128>>2]*+g[m+408>>2]+ +g[p+(fa*244|0)+64>>2];g[p+(fa*244|0)+68>>2]=x+ +g[p+(fa*244|0)+68>>2];g[p+(fa*244|0)+72>>2]=y+ +g[p+(fa*244|0)+72>>2];F=F*+g[p+(fa*244|0)+100>>2]*-j;G=G*+g[p+(fa*244|0)+104>>2]*-j;g[p+(fa*244|0)+80>>2]=+g[p+(fa*244|0)+80>>2]-z*+g[p+(fa*244|0)+96>>2]*-j;g[p+(fa*244|0)+84>>2]=+g[p+(fa*244|0)+84>>2]-F;g[p+(fa*244|0)+88>>2]=+g[p+(fa*244|0)+88>>2]-G}while(0);g[V+(X*152|0)+96>>2]=0.0;if(!(c[p+(ea*244|0)+240>>2]|0)){j=0.0;k=0.0;n=0.0;r=0.0;s=0.0;t=0.0}else{j=+g[p+(ea*244|0)+208>>2];k=+g[p+(ea*244|0)+212>>2];n=+g[p+(ea*244|0)+216>>2];r=+g[p+(ea*244|0)+224>>2];s=+g[p+(ea*244|0)+228>>2];t=+g[p+(ea*244|0)+232>>2]}if(!(c[p+(fa*244|0)+240>>2]|0)){u=0.0;v=0.0;w=0.0;x=0.0;y=0.0;z=0.0}else{u=+g[p+(fa*244|0)+208>>2];v=+g[p+(fa*244|0)+212>>2];w=+g[p+(fa*244|0)+216>>2];x=+g[p+(fa*244|0)+224>>2];y=+g[p+(fa*244|0)+228>>2];z=+g[p+(fa*244|0)+232>>2]}j=B-((j+ +g[p+(ea*244|0)+176>>2])*+g[V+(X*152|0)+16>>2]+(k+ +g[p+(ea*244|0)+180>>2])*+g[V+(X*152|0)+20>>2]+(n+ +g[p+(ea*244|0)+184>>2])*+g[V+(X*152|0)+24>>2]+((r+ +g[p+(ea*244|0)+192>>2])*+g[V+(X*152|0)>>2]+(s+ +g[p+(ea*244|0)+196>>2])*+g[V+(X*152|0)+4>>2]+(t+ +g[p+(ea*244|0)+200>>2])*+g[V+(X*152|0)+8>>2])+((u+ +g[p+(fa*244|0)+176>>2])*+g[V+(X*152|0)+48>>2]+(v+ +g[p+(fa*244|0)+180>>2])*+g[V+(X*152|0)+52>>2]+(w+ +g[p+(fa*244|0)+184>>2])*+g[V+(X*152|0)+56>>2]+((x+ +g[p+(fa*244|0)+192>>2])*+g[V+(X*152|0)+32>>2]+(y+ +g[p+(fa*244|0)+196>>2])*+g[V+(X*152|0)+36>>2]+(z+ +g[p+(fa*244|0)+200>>2])*+g[V+(X*152|0)+40>>2])));if(E>0.0){k=j-1.0/J*E;j=0.0}else{k=j;j=-(1.0/J*I*E)}J=+g[V+(X*152|0)+108>>2];I=j*J;G=k*J;m=(c[f+52>>2]|0)==0?1:E>+g[f+56>>2];g[V+(X*152|0)+112>>2]=m?I+G:G;g[V+(X*152|0)+128>>2]=m?0.0:I;g[V+(X*152|0)+116>>2]=H*J;g[V+(X*152|0)+120>>2]=0.0;g[V+(X*152|0)+124>>2]=1.0e10;c[V+(X*152|0)+140>>2]=c[b+68>>2];m=ba+4+(Z*192|0)+88|0;if(+g[m>>2]>0.0){Md(b,Q,ea,fa,X,+g[ba+4+(Z*192|0)+92>>2]);j=+g[S>>2];if(+C(+j)>.7071067690849304){I=+g[R>>2];H=1.0/+D(+(j*j+I*I));g[ja+16>>2]=0.0;g[$>>2]=-(H*j);g[aa>>2]=H*I;g[ja>>2]=(j*j+I*I)*H;J=+g[Q>>2];g[ja+4>>2]=-(H*I*J);u=J*-(H*j);k=0.0;n=-(H*j);r=H*I;s=(j*j+I*I)*H;j=-(H*I*J)}else{s=+g[Q>>2];I=+g[R>>2];J=1.0/+D(+(s*s+I*I));g[ja+16>>2]=-(I*J);g[$>>2]=J*s;g[aa>>2]=0.0;g[ja>>2]=-(J*s*j);g[ja+4>>2]=j*-(I*J);u=(s*s+I*I)*J;k=-(I*J);n=J*s;r=0.0;s=-(J*s*j);j=j*-(I*J)}t=1.0/+D(+(k*k+n*n+r*r));v=k*t;g[ja+16>>2]=v;w=n*t;g[$>>2]=w;t=r*t;g[aa>>2]=t;J=1.0/+D(+(s*s+j*j+u*u));n=s*J;g[ja>>2]=n;k=j*J;g[ja+4>>2]=k;j=u*J;g[ja+8>>2]=j;h=(c[ca+180>>2]&2|0)==0;if(h){r=v;s=w}else{y=+g[ca+4>>2];B=+g[ca+20>>2];F=+g[ca+36>>2];z=+g[ca+8>>2];E=+g[ca+24>>2];H=+g[ca+40>>2];r=+g[ca+12>>2];s=+g[ca+28>>2];J=+g[ca+44>>2];G=(y*v+B*w+F*t)*+g[ca+164>>2];I=(v*z+w*E+t*H)*+g[ca+168>>2];t=(v*r+w*s+t*J)*+g[ca+172>>2];g[ja+16>>2]=y*G+z*I+r*t;g[$>>2]=B*G+E*I+s*t;g[aa>>2]=F*G+H*I+J*t;g[ja+16+12>>2]=0.0;r=y*G+z*I+r*t;s=B*G+E*I+s*t;t=F*G+H*I+J*t}i=(c[da+180>>2]&2|0)==0;if(!i){w=+g[da+4>>2];z=+g[da+20>>2];F=+g[da+36>>2];x=+g[da+8>>2];B=+g[da+24>>2];H=+g[da+40>>2];y=+g[da+12>>2];E=+g[da+28>>2];J=+g[da+44>>2];G=(w*r+z*s+F*t)*+g[da+164>>2];I=(r*x+s*B+t*H)*+g[da+168>>2];t=(r*y+s*E+t*J)*+g[da+172>>2];g[ja+16>>2]=w*G+x*I+y*t;g[$>>2]=z*G+B*I+E*t;g[aa>>2]=F*G+H*I+J*t;g[ja+16+12>>2]=0.0;r=w*G+x*I+y*t;s=z*G+B*I+E*t;t=F*G+H*I+J*t}if(!((ca|0)==0|h)){w=+g[ca+4>>2];z=+g[ca+20>>2];F=+g[ca+36>>2];x=+g[ca+8>>2];B=+g[ca+24>>2];H=+g[ca+40>>2];y=+g[ca+12>>2];E=+g[ca+28>>2];J=+g[ca+44>>2];G=(w*n+z*k+F*j)*+g[ca+164>>2];I=(n*x+k*B+j*H)*+g[ca+168>>2];j=(n*y+k*E+j*J)*+g[ca+172>>2];g[ja>>2]=w*G+x*I+y*j;g[ja+4>>2]=z*G+B*I+E*j;g[ja+8>>2]=F*G+H*I+J*j;g[ja+12>>2]=0.0;n=w*G+x*I+y*j;k=z*G+B*I+E*j;j=F*G+H*I+J*j}if(!((da|0)==0|i)){w=+g[da+4>>2];z=+g[da+20>>2];F=+g[da+36>>2];x=+g[da+8>>2];B=+g[da+24>>2];H=+g[da+40>>2];y=+g[da+12>>2];E=+g[da+28>>2];J=+g[da+44>>2];G=(w*n+z*k+F*j)*+g[da+164>>2];I=(n*x+k*B+j*H)*+g[da+168>>2];j=(n*y+k*E+j*J)*+g[da+172>>2];g[ja>>2]=w*G+x*I+y*j;g[ja+4>>2]=z*G+B*I+E*j;g[ja+8>>2]=F*G+H*I+J*j;g[ja+12>>2]=0.0;n=w*G+x*I+y*j;k=z*G+B*I+E*j;j=F*G+H*I+J*j}if(+D(+(r*r+s*s+t*t))>.001)Md(b,ja+16|0,ea,fa,X,+g[m>>2]);if(+D(+(n*n+k*k+j*j))>.001)Md(b,ja,ea,fa,X,+g[m>>2]);h=c[f+72>>2]|0}do if(!(h&32))ia=82;else{if(!(c[T>>2]&1)){ia=82;break}h=ba+4+(Z*192|0)+152|0;ed(b,ba+4+(Z*192|0)+160|0,ea,fa,X,W,ja+48|0,ja+32|0,U,f,+g[ba+4+(Z*192|0)+136>>2],+g[h>>2]);if(!(c[f+72>>2]&16))break;ed(b,ba+4+(Z*192|0)+176|0,ea,fa,X,W,ja+48|0,ja+32|0,U,f,+g[ba+4+(Z*192|0)+140>>2],+g[h>>2])}while(0);do if((ia|0)==82){ia=0;j=+g[Q>>2];v=+g[R>>2];u=+g[S>>2];k=P-(P*L+O*M+K*N)*j;s=O-(P*L+O*M+K*N)*v;r=K-(P*L+O*M+K*N)*u;A=ba+4+(Z*192|0)+160|0;g[ba+4+(Z*192|0)+160>>2]=k;h=ba+4+(Z*192|0)+164|0;g[h>>2]=s;p=ba+4+(Z*192|0)+168|0;g[p>>2]=r;q=ba+4+(Z*192|0)+172|0;g[q>>2]=0.0;if((c[f+72>>2]&64|0)==0?k*k+s*s+r*r>1.1920928955078125e-07:0){j=1.0/+D(+(k*k+s*s+r*r));g[A>>2]=k*j;g[h>>2]=j*s;g[p>>2]=j*r;do if(!ca){n=k*j;k=j*s;j=j*r}else{if(!(c[ca+180>>2]&1)){n=k*j;k=j*s;j=j*r;break}G=+g[ca+4>>2];I=+g[ca+20>>2];L=+g[ca+36>>2];H=+g[ca+8>>2];J=+g[ca+24>>2];N=+g[ca+40>>2];n=+g[ca+12>>2];K=+g[ca+28>>2];P=+g[ca+44>>2];M=(G*k*j+I*j*s+j*r*L)*+g[ca+164>>2];O=(k*j*H+j*s*J+j*r*N)*+g[ca+168>>2];j=(k*j*n+j*s*K+j*r*P)*+g[ca+172>>2];g[A>>2]=G*M+H*O+n*j;g[h>>2]=I*M+J*O+K*j;g[p>>2]=L*M+N*O+P*j;g[q>>2]=0.0;n=G*M+H*O+n*j;k=I*M+J*O+K*j;j=L*M+N*O+P*j}while(0);do if(da|0){if(!(c[da+180>>2]&1))break;E=+g[da+4>>2];H=+g[da+20>>2];K=+g[da+36>>2];F=+g[da+8>>2];I=+g[da+24>>2];M=+g[da+40>>2];G=+g[da+12>>2];J=+g[da+28>>2];O=+g[da+44>>2];L=(E*n+H*k+K*j)*+g[da+164>>2];N=(n*F+k*I+j*M)*+g[da+168>>2];P=(n*G+k*J+j*O)*+g[da+172>>2];g[A>>2]=E*L+F*N+G*P;g[h>>2]=H*L+I*N+J*P;g[p>>2]=K*L+M*N+O*P;g[q>>2]=0.0}while(0);ed(b,A,ea,fa,X,W,ja+48|0,ja+32|0,U,f,0.0,0.0);if(!(c[f+72>>2]&16))break;O=+g[h>>2];n=+g[S>>2];L=+g[p>>2];M=+g[R>>2];P=+g[Q>>2];N=+g[A>>2];o=ba+4+(Z*192|0)+176|0;g[ba+4+(Z*192|0)+176>>2]=O*n-L*M;h=ba+4+(Z*192|0)+180|0;i=ba+4+(Z*192|0)+184|0;m=ba+4+(Z*192|0)+188|0;g[m>>2]=0.0;k=1.0/+D(+((O*n-L*M)*(O*n-L*M)+(L*P-n*N)*(L*P-n*N)+(M*N-O*P)*(M*N-O*P)));j=(O*n-L*M)*k;g[o>>2]=j;n=(L*P-n*N)*k;g[h>>2]=n;k=(M*N-O*P)*k;g[i>>2]=k;do if(ca){if(!(c[ca+180>>2]&1))break;F=+g[ca+4>>2];I=+g[ca+20>>2];L=+g[ca+36>>2];G=+g[ca+8>>2];J=+g[ca+24>>2];N=+g[ca+40>>2];H=+g[ca+12>>2];K=+g[ca+28>>2];P=+g[ca+44>>2];M=(F*j+I*n+k*L)*+g[ca+164>>2];O=(j*G+n*J+k*N)*+g[ca+168>>2];k=(j*H+n*K+k*P)*+g[ca+172>>2];g[o>>2]=F*M+G*O+H*k;g[h>>2]=I*M+J*O+K*k;g[i>>2]=L*M+N*O+P*k;g[m>>2]=0.0;j=F*M+G*O+H*k;n=I*M+J*O+K*k;k=L*M+N*O+P*k}while(0);do if(da|0){if(!(c[da+180>>2]&1))break;E=+g[da+4>>2];H=+g[da+20>>2];K=+g[da+36>>2];F=+g[da+8>>2];I=+g[da+24>>2];M=+g[da+40>>2];G=+g[da+12>>2];J=+g[da+28>>2];O=+g[da+44>>2];L=(E*j+H*n+K*k)*+g[da+164>>2];N=(j*F+n*I+k*M)*+g[da+168>>2];P=(j*G+n*J+k*O)*+g[da+172>>2];g[o>>2]=E*L+F*N+G*P;g[h>>2]=H*L+I*N+J*P;g[i>>2]=K*L+M*N+O*P;g[m>>2]=0.0}while(0);ed(b,o,ea,fa,X,W,ja+48|0,ja+32|0,U,f,0.0,0.0);break}o=ba+4+(Z*192|0)+176|0;if(+C(+u)>.7071067690849304){P=1.0/+D(+(u*u+v*v));g[A>>2]=0.0;g[h>>2]=-(P*u);g[p>>2]=P*v;s=-(P*v*j);t=j*-(P*u);r=(u*u+v*v)*P;n=0.0;k=-(P*u);j=P*v}else{k=1.0/+D(+(j*j+v*v));g[A>>2]=-(v*k);g[h>>2]=k*j;g[p>>2]=0.0;s=u*-(v*k);t=(j*j+v*v)*k;r=-(k*j*u);n=-(v*k);k=k*j;j=0.0}g[o>>2]=r;m=ba+4+(Z*192|0)+180|0;g[m>>2]=s;i=ba+4+(Z*192|0)+184|0;g[i>>2]=t;do if(ca){if(!(c[ca+180>>2]&1))break;F=+g[ca+4>>2];I=+g[ca+20>>2];L=+g[ca+36>>2];G=+g[ca+8>>2];J=+g[ca+24>>2];N=+g[ca+40>>2];H=+g[ca+12>>2];K=+g[ca+28>>2];P=+g[ca+44>>2];M=(F*n+I*k+L*j)*+g[ca+164>>2];O=(n*G+k*J+j*N)*+g[ca+168>>2];j=(n*H+k*K+j*P)*+g[ca+172>>2];g[A>>2]=F*M+G*O+H*j;g[h>>2]=I*M+J*O+K*j;g[p>>2]=L*M+N*O+P*j;g[q>>2]=0.0;n=F*M+G*O+H*j;k=I*M+J*O+K*j;j=L*M+N*O+P*j}while(0);do if(da|0){if(!(c[da+180>>2]&1))break;E=+g[da+4>>2];H=+g[da+20>>2];K=+g[da+36>>2];F=+g[da+8>>2];I=+g[da+24>>2];M=+g[da+40>>2];G=+g[da+12>>2];J=+g[da+28>>2];O=+g[da+44>>2];L=(E*n+H*k+K*j)*+g[da+164>>2];N=(n*F+k*I+j*M)*+g[da+168>>2];P=(n*G+k*J+j*O)*+g[da+172>>2];g[A>>2]=E*L+F*N+G*P;g[h>>2]=H*L+I*N+J*P;g[p>>2]=K*L+M*N+O*P;g[q>>2]=0.0}while(0);ed(b,A,ea,fa,X,W,ja+48|0,ja+32|0,U,f,0.0,0.0);h=c[f+72>>2]|0;if(h&16){do if(ca|0){if(!(c[ca+180>>2]&1))break;E=+g[ca+4>>2];z=+g[o>>2];H=+g[ca+20>>2];B=+g[m>>2];K=+g[ca+36>>2];P=+g[i>>2];F=+g[ca+8>>2];I=+g[ca+24>>2];M=+g[ca+40>>2];G=+g[ca+12>>2];J=+g[ca+28>>2];O=+g[ca+44>>2];L=(E*z+H*B+K*P)*+g[ca+164>>2];N=(z*F+B*I+P*M)*+g[ca+168>>2];P=(z*G+B*J+P*O)*+g[ca+172>>2];g[o>>2]=E*L+F*N+G*P;g[m>>2]=H*L+I*N+J*P;g[i>>2]=K*L+M*N+O*P;g[ba+4+(Z*192|0)+188>>2]=0.0}while(0);do if(da|0){if(!(c[da+180>>2]&1))break;E=+g[da+4>>2];z=+g[o>>2];H=+g[da+20>>2];B=+g[m>>2];K=+g[da+36>>2];P=+g[i>>2];F=+g[da+8>>2];I=+g[da+24>>2];M=+g[da+40>>2];G=+g[da+12>>2];J=+g[da+28>>2];O=+g[da+44>>2];L=(E*z+H*B+K*P)*+g[da+164>>2];N=(z*F+B*I+P*M)*+g[da+168>>2];P=(z*G+B*J+P*O)*+g[da+172>>2];g[o>>2]=E*L+F*N+G*P;g[m>>2]=H*L+I*N+J*P;g[i>>2]=K*L+M*N+O*P;g[ba+4+(Z*192|0)+188>>2]=0.0}while(0);ed(b,o,ea,fa,X,W,ja+48|0,ja+32|0,U,f,0.0,0.0);h=c[f+72>>2]|0}if((h&80|0)!=80)break;c[T>>2]=c[T>>2]|1}while(0);q=c[b+16>>2]|0;i=c[q+(ea*244|0)+240>>2]|0;m=c[q+(fa*244|0)+240>>2]|0;o=c[V+(X*152|0)+140>>2]|0;p=c[b+76>>2]|0;h=c[f+72>>2]|0;do if(!(h&4))g[p+(o*152|0)+100>>2]=0.0;else{j=+g[ba+4+(Z*192|0)+128>>2]*+g[f+68>>2];g[p+(o*152|0)+100>>2]=j;if(i|0){O=+g[i+404>>2];U=j*O*+g[p+(o*152|0)+20>>2]*+g[i+412>>2]*+g[q+(ea*244|0)+116>>2];P=j*O*+g[p+(o*152|0)+24>>2]*+g[i+416>>2]*+g[q+(ea*244|0)+120>>2];g[q+(ea*244|0)+64>>2]=+g[q+(ea*244|0)+112>>2]*j*O*+g[p+(o*152|0)+16>>2]*+g[i+408>>2]+ +g[q+(ea*244|0)+64>>2];g[q+(ea*244|0)+68>>2]=U+ +g[q+(ea*244|0)+68>>2];g[q+(ea*244|0)+72>>2]=P+ +g[q+(ea*244|0)+72>>2];P=j*+g[q+(ea*244|0)+100>>2]*+g[p+(o*152|0)+68>>2];U=j*+g[q+(ea*244|0)+104>>2]*+g[p+(o*152|0)+72>>2];g[q+(ea*244|0)+80>>2]=j*+g[q+(ea*244|0)+96>>2]*+g[p+(o*152|0)+64>>2]+ +g[q+(ea*244|0)+80>>2];g[q+(ea*244|0)+84>>2]=P+ +g[q+(ea*244|0)+84>>2];g[q+(ea*244|0)+88>>2]=U+ +g[q+(ea*244|0)+88>>2]}if(!m)break;j=+g[m+404>>2];k=+g[p+(o*152|0)+100>>2];if(!(c[q+(fa*244|0)+240>>2]|0))break;U=+g[p+(o*152|0)+88>>2];P=+g[p+(o*152|0)+84>>2];O=+g[p+(o*152|0)+80>>2];M=k*j*+g[p+(o*152|0)+52>>2]*+g[m+412>>2]*+g[q+(fa*244|0)+116>>2];N=k*j*+g[p+(o*152|0)+56>>2]*+g[m+416>>2]*+g[q+(fa*244|0)+120>>2];g[q+(fa*244|0)+64>>2]=+g[q+(fa*244|0)+112>>2]*k*j*+g[p+(o*152|0)+48>>2]*+g[m+408>>2]+ +g[q+(fa*244|0)+64>>2];g[q+(fa*244|0)+68>>2]=M+ +g[q+(fa*244|0)+68>>2];g[q+(fa*244|0)+72>>2]=N+ +g[q+(fa*244|0)+72>>2];P=P*+g[q+(fa*244|0)+100>>2]*-k;U=U*+g[q+(fa*244|0)+104>>2]*-k;g[q+(fa*244|0)+80>>2]=+g[q+(fa*244|0)+80>>2]-O*+g[q+(fa*244|0)+96>>2]*-k;g[q+(fa*244|0)+84>>2]=+g[q+(fa*244|0)+84>>2]-P;g[q+(fa*244|0)+88>>2]=+g[q+(fa*244|0)+88>>2]-U}while(0);do if(h&16|0){if(!(h&4)){g[p+((o+1|0)*152|0)+100>>2]=0.0;break}k=+g[ba+4+(Z*192|0)+132>>2]*+g[f+68>>2];g[p+((o+1|0)*152|0)+100>>2]=k;do if(i|0){j=+g[i+404>>2];if(!(c[q+(ea*244|0)+240>>2]|0))break;U=k*j*+g[p+((o+1|0)*152|0)+20>>2]*+g[q+(ea*244|0)+116>>2];P=k*j*+g[p+((o+1|0)*152|0)+24>>2]*+g[q+(ea*244|0)+120>>2];g[q+(ea*244|0)+64>>2]=+g[q+(ea*244|0)+112>>2]*k*j*+g[p+((o+1|0)*152|0)+16>>2]+ +g[q+(ea*244|0)+64>>2];g[q+(ea*244|0)+68>>2]=U+ +g[q+(ea*244|0)+68>>2];g[q+(ea*244|0)+72>>2]=P+ +g[q+(ea*244|0)+72>>2];P=k*+g[q+(ea*244|0)+100>>2]*+g[p+((o+1|0)*152|0)+68>>2];U=k*+g[q+(ea*244|0)+104>>2]*+g[p+((o+1|0)*152|0)+72>>2];g[q+(ea*244|0)+80>>2]=k*+g[q+(ea*244|0)+96>>2]*+g[p+((o+1|0)*152|0)+64>>2]+ +g[q+(ea*244|0)+80>>2];g[q+(ea*244|0)+84>>2]=P+ +g[q+(ea*244|0)+84>>2];g[q+(ea*244|0)+88>>2]=U+ +g[q+(ea*244|0)+88>>2]}while(0);if(!m)break;j=+g[m+404>>2];k=+g[p+((o+1|0)*152|0)+100>>2];if(!(c[q+(fa*244|0)+240>>2]|0))break;U=+g[p+((o+1|0)*152|0)+88>>2];P=+g[p+((o+1|0)*152|0)+84>>2];O=+g[p+((o+1|0)*152|0)+80>>2];M=k*j*+g[p+((o+1|0)*152|0)+52>>2]*+g[q+(fa*244|0)+116>>2];N=k*j*+g[p+((o+1|0)*152|0)+56>>2]*+g[q+(fa*244|0)+120>>2];g[q+(fa*244|0)+64>>2]=+g[q+(fa*244|0)+112>>2]*k*j*+g[p+((o+1|0)*152|0)+48>>2]+ +g[q+(fa*244|0)+64>>2];g[q+(fa*244|0)+68>>2]=M+ +g[q+(fa*244|0)+68>>2];g[q+(fa*244|0)+72>>2]=N+ +g[q+(fa*244|0)+72>>2];P=P*+g[q+(fa*244|0)+100>>2]*-k;U=U*+g[q+(fa*244|0)+104>>2]*-k;g[q+(fa*244|0)+80>>2]=+g[q+(fa*244|0)+80>>2]-O*+g[q+(fa*244|0)+96>>2]*-k;g[q+(fa*244|0)+84>>2]=+g[q+(fa*244|0)+84>>2]-P;g[q+(fa*244|0)+88>>2]=+g[q+(fa*244|0)+88>>2]-U}while(0);h=c[ba+780>>2]|0}Z=Z+1|0}while((Z|0)<(h|0))}Y=Y+1|0}while((Y|0)!=(e|0));l=ja;return}function lc(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=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;A=l;l=l+80|0;bf(b,e,f)|0;a[A+16>>0]=1;c[A+12>>2]=0;c[A+4>>2]=0;c[A+8>>2]=0;a[A+36>>0]=1;c[A+32>>2]=0;c[A+24>>2]=0;c[A+28>>2]=0;a[A+56>>0]=1;c[A+52>>2]=0;c[A+44>>2]=0;c[A+48>>2]=0;a[A+76>>0]=1;c[A+72>>2]=0;c[A+64>>2]=0;c[A+68>>2]=0;y=c[b+932>>2]|0;c[e+300>>2]=y;if(y){y=zb[c[(c[f>>2]|0)+28>>2]&31](f,b+928|0)|0;c[e+268>>2]=y;if(y|0){i=c[e+300>>2]|0;m=Bb[c[(c[f>>2]|0)+16>>2]&63](f,4,i)|0;if((i|0)>0){g=c[m+8>>2]|0;h=0;while(1){j=c[(c[b+940>>2]|0)+(h<<2)>>2]|0;if(!j)k=0;else k=zb[c[(c[f>>2]|0)+28>>2]&31](f,j)|0;c[g>>2]=k;if(!(zb[c[(c[f>>2]|0)+24>>2]&31](f,j)|0)){y=Bb[c[(c[f>>2]|0)+16>>2]&63](f,16,1)|0;t=c[y+8>>2]|0;c[t+12>>2]=c[j+16>>2];c[t+4>>2]=c[j+8>>2];c[t>>2]=c[j+4>>2];c[t+8>>2]=c[j+12>>2];Zb[c[(c[f>>2]|0)+20>>2]&31](f,y,11010,1414349395,j)}h=h+1|0;if((h|0)>=(i|0)){g=f;break}else g=g+4|0}}else g=f;Zb[c[(c[g>>2]|0)+20>>2]&31](f,m,11010,1497453121,b+928|0)}}else c[e+268>>2]=0;y=c[b+772>>2]|0;c[e+304>>2]=y;if(y){y=zb[c[(c[f>>2]|0)+28>>2]&31](f,b+768|0)|0;c[e+272>>2]=y;if(y|0){s=c[e+304>>2]|0;t=Bb[c[(c[f>>2]|0)+16>>2]&63](f,100,s)|0;if((s|0)>0){q=0;r=c[t+8>>2]|0;while(1){h=c[b+780>>2]|0;c[r+52>>2]=c[h+(q*104|0)+56>>2];c[r+56>>2]=c[h+(q*104|0)+60>>2];c[r+60>>2]=c[h+(q*104|0)+64>>2];c[r+64>>2]=c[h+(q*104|0)+68>>2];c[r+88>>2]=c[h+(q*104|0)+92>>2];c[r+92>>2]=(a[h+(q*104|0)+100>>0]<<7&255)<<24>>24>>7<<24>>24;c[r+84>>2]=c[h+(q*104|0)+88>>2];g=c[h+(q*104|0)+4>>2]|0;if(!g){i=0;g=h}else{i=zb[c[(c[f>>2]|0)+28>>2]&31](f,g)|0;g=c[b+780>>2]|0}c[r>>2]=i;c[r+68>>2]=c[g+(q*104|0)+72>>2];c[r+72>>2]=c[g+(q*104|0)+76>>2];c[r+76>>2]=c[g+(q*104|0)+80>>2];c[r+80>>2]=c[g+(q*104|0)+84>>2];c[r+4>>2]=c[g+(q*104|0)+8>>2];c[r+8>>2]=c[g+(q*104|0)+12>>2];c[r+12>>2]=c[g+(q*104|0)+16>>2];c[r+16>>2]=c[g+(q*104|0)+20>>2];c[r+20>>2]=c[g+(q*104|0)+24>>2];c[r+24>>2]=c[g+(q*104|0)+28>>2];c[r+28>>2]=c[g+(q*104|0)+32>>2];c[r+32>>2]=c[g+(q*104|0)+36>>2];c[r+36>>2]=c[g+(q*104|0)+40>>2];c[r+40>>2]=c[g+(q*104|0)+44>>2];c[r+44>>2]=c[g+(q*104|0)+48>>2];c[r+48>>2]=c[g+(q*104|0)+52>>2];m=(c[b+780>>2]|0)+(q*104|0)|0;p=((m+~(m<<15)|0)>>>10^m+~(m<<15))*9|0;p=((p>>>6^p)+~((p>>>6^p)<<11)|0)>>>16^(p>>>6^p)+~((p>>>6^p)<<11);n=c[A+48>>2]|0;a:do if((p&n+-1)>>>0<(c[A+4>>2]|0)>>>0?(u=c[(c[A+12>>2]|0)+((p&n+-1)<<2)>>2]|0,(u|0)!=-1):0){h=c[A+72>>2]|0;i=c[A+32>>2]|0;g=u;while(1){if((m|0)==(c[h+(g<<3)>>2]|0))break;g=c[i+(g<<2)>>2]|0;if((g|0)==-1){z=27;break a}}h=q;i=c[A+52>>2]|0}else z=27;while(0);if((z|0)==27){z=0;h=c[A+44>>2]|0;if((h|0)==(n|0)){g=n|0?n<<1:1;if((n|0)<(g|0)){if((g|0)!=0?(c[6995]=(c[6995]|0)+1,v=sc((g<<2|3)+16|0)|0,(v|0)!=0):0){c[(v+4+15&-16)+-4>>2]=v;k=v+4+15&-16}else k=0;j=c[A+52>>2]|0;if((n|0)<=0)if(!j)i=n;else z=35;else{i=0;do{c[k+(i<<2)>>2]=c[j+(i<<2)>>2];i=i+1|0}while((i|0)!=(n|0));z=35}if((z|0)==35){z=0;if(a[A+56>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[j+-4>>2]|0)}c[A+52>>2]=0;i=c[A+44>>2]|0}a[A+56>>0]=1;c[A+52>>2]=k;c[A+48>>2]=g}else{g=n;i=n}}else{g=n;i=h}c[(c[A+52>>2]|0)+(i<<2)>>2]=q;c[A+44>>2]=i+1;i=c[A+64>>2]|0;if((i|0)==(c[A+68>>2]|0)?(w=i|0?i<<1:1,(i|0)<(w|0)):0){if((w|0)!=0?(c[6995]=(c[6995]|0)+1,x=sc((w<<3|3)+16|0)|0,(x|0)!=0):0){c[(x+4+15&-16)+-4>>2]=x;j=x+4+15&-16}else j=0;if((i|0)>0){g=0;do{k=(c[A+72>>2]|0)+(g<<3)|0;o=c[k+4>>2]|0;y=j+(g<<3)|0;c[y>>2]=c[k>>2];c[y+4>>2]=o;g=g+1|0}while((g|0)!=(i|0))}g=c[A+72>>2]|0;if(g|0){if(a[A+76>>0]|0){c[6996]=(c[6996]|0)+1;Cd(c[g+-4>>2]|0)}c[A+72>>2]=0}a[A+76>>0]=1;c[A+72>>2]=j;c[A+68>>2]=w;i=c[A+64>>2]|0;g=c[A+48>>2]|0}c[(c[A+72>>2]|0)+(i<<3)>>2]=m;c[A+64>>2]=i+1;if((n|0)<(g|0)){o=c[A+4>>2]|0;do if((o|0)<(g|0)){if((c[A+8>>2]|0)<(g|0)){do if(!g)i=0;else{c[6995]=(c[6995]|0)+1;i=sc((g<<2|3)+16|0)|0;if(!i){i=0;break}c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}while(0);k=c[A+12>>2]|0;if((o|0)>0){j=0;do{c[i+(j<<2)>>2]=c[k+(j<<2)>>2];j=j+1|0}while((j|0)!=(o|0));if(a[A+16>>0]|0)z=62}else if(!((k|0)==0|(a[A+16>>0]|0)==0))z=62;if((z|0)==62){z=0;c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}a[A+16>>0]=1;c[A+12>>2]=i;c[A+8>>2]=g}else i=c[A+12>>2]|0;n=g<<2;Yk(i+(o<<2)|0,0,n-(o<<2)|0)|0;c[A+4>>2]=g;m=c[A+24>>2]|0;if((m|0)<(g|0)){if((c[A+28>>2]|0)<(g|0)){do if(!g)i=0;else{c[6995]=(c[6995]|0)+1;i=sc((n|3)+16|0)|0;if(!i){i=0;break}c[(i+4+15&-16)+-4>>2]=i;i=i+4+15&-16}while(0);k=c[A+32>>2]|0;if((m|0)>0){j=0;do{c[i+(j<<2)>>2]=c[k+(j<<2)>>2];j=j+1|0}while((j|0)!=(m|0));if(a[A+36>>0]|0)z=74}else if(!((k|0)==0|(a[A+36>>0]|0)==0))z=74;if((z|0)==74){z=0;c[6996]=(c[6996]|0)+1;Cd(c[k+-4>>2]|0)}a[A+36>>0]=1;c[A+32>>2]=i;c[A+28>>2]=g}else i=c[A+32>>2]|0;Yk(i+(m<<2)|0,0,n-(m<<2)|0)|0}c[A+24>>2]=g;if((g|0)>0){Yk(c[A+12>>2]|0,-1,n|0)|0;Yk(c[A+32>>2]|0,-1,n|0)|0}if((o|0)<=0){g=c[A+48>>2]|0;break}j=c[A+72>>2]|0;k=c[A+12>>2]|0;m=c[A+32>>2]|0;g=c[A+48>>2]|0;i=0;do{y=c[j+(i<<3)>>2]|0;y=((y+~(y<<15)|0)>>>10^y+~(y<<15))*9|0;y=k+(((((y>>>6^y)+~((y>>>6^y)<<11)|0)>>>16^(y>>>6^y)+~((y>>>6^y)<<11))&g+-1)<<2)|0;c[m+(i<<2)>>2]=c[y>>2];c[y>>2]=i;i=i+1|0}while((i|0)!=(o|0))}while(0);g=p&g+-1}else g=p&n+-1;i=c[A+12>>2]|0;c[(c[A+32>>2]|0)+(h<<2)>>2]=c[i+(g<<2)>>2]}c[i+(g<<2)>>2]=h;q=q+1|0;if((q|0)>=(s|0))break;else r=r+100|0}}Zb[c[(c[f>>2]|0)+20>>2]&31](f,t,11031,1145979475,b+768|0)}}else c[e+272>>2]=0;y=c[b+792>>2]|0;c[e+308>>2]=y;if(y){y=zb[c[(c[f>>2]|0)+28>>2]&31](f,c[b+800>>2]|0)|0;c[e+276>>2]=y;if(y|0){m=c[e+308>>2]|0;n=Bb[c[(c[f>>2]|0)+16>>2]&63](f,20,m)|0;if((m|0)>0){i=c[b+800>>2]|0;j=c[n+8>>2]|0;k=0;g=i;while(1){c[j+16>>2]=(a[i+(k*52|0)+36>>0]<<7&255)<<24>>24>>7<<24>>24;h=c[i+(k*52|0)+4>>2]|0;if(!h)h=0;else{h=zb[c[(c[f>>2]|0)+28>>2]&31](f,h)|0;i=c[b+800>>2]|0;g=i}c[j>>2]=h;h=c[i+(k*52|0)+24>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+4>>2]=h;h=c[i+(k*52|0)+28>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+8>>2]=h;c[j+12>>2]=c[i+(k*52|0)+32>>2];k=k+1|0;if((k|0)>=(m|0))break;else j=j+20|0}}else g=c[b+800>>2]|0;Zb[c[(c[f>>2]|0)+20>>2]&31](f,n,11048,1497453121,g)}}else c[e+276>>2]=0;y=c[b+812>>2]|0;c[e+312>>2]=y;if(y){y=zb[c[(c[f>>2]|0)+28>>2]&31](f,c[b+820>>2]|0)|0;c[e+280>>2]=y;if(y|0){m=c[e+312>>2]|0;n=Bb[c[(c[f>>2]|0)+16>>2]&63](f,36,m)|0;if((m|0)>0){i=c[b+820>>2]|0;j=c[n+8>>2]|0;k=0;g=i;while(1){h=c[i+(k*44|0)+4>>2]|0;if(!h)h=0;else{h=zb[c[(c[f>>2]|0)+28>>2]&31](f,h)|0;i=c[b+820>>2]|0;g=i}c[j+16>>2]=h;c[j>>2]=c[i+(k*44|0)+20>>2];c[j+4>>2]=c[i+(k*44|0)+24>>2];c[j+8>>2]=c[i+(k*44|0)+28>>2];c[j+12>>2]=c[i+(k*44|0)+32>>2];h=c[i+(k*44|0)+8>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+20>>2]=h;h=c[i+(k*44|0)+12>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+24>>2]=h;h=c[i+(k*44|0)+16>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+28>>2]=h;c[j+32>>2]=c[i+(k*44|0)+36>>2];k=k+1|0;if((k|0)>=(m|0))break;else j=j+36|0}}else g=c[b+820>>2]|0;Zb[c[(c[f>>2]|0)+20>>2]&31](f,n,11065,1497453121,g)}}else c[e+280>>2]=0;y=c[b+832>>2]|0;c[e+316>>2]=y;if(y){y=zb[c[(c[f>>2]|0)+28>>2]&31](f,c[b+840>>2]|0)|0;c[e+284>>2]=y;if(y|0){m=c[e+316>>2]|0;n=Bb[c[(c[f>>2]|0)+16>>2]&63](f,100,m)|0;if((m|0)>0){i=c[b+840>>2]|0;j=c[n+8>>2]|0;k=0;g=i;while(1){c[j>>2]=c[i+(k*104|0)+32>>2];c[j+4>>2]=c[i+(k*104|0)+36>>2];c[j+8>>2]=c[i+(k*104|0)+40>>2];c[j+12>>2]=c[i+(k*104|0)+44>>2];h=c[i+8>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+68>>2]=h;c[j+16>>2]=c[i+(k*104|0)+48>>2];c[j+20>>2]=c[i+(k*104|0)+52>>2];c[j+24>>2]=c[i+(k*104|0)+56>>2];c[j+28>>2]=c[i+(k*104|0)+60>>2];h=c[i+116>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+72>>2]=h;c[j+32>>2]=c[i+(k*104|0)+64>>2];c[j+36>>2]=c[i+(k*104|0)+68>>2];c[j+40>>2]=c[i+(k*104|0)+72>>2];c[j+44>>2]=c[i+(k*104|0)+76>>2];h=c[i+224>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+76>>2]=h;c[j+48>>2]=c[i+(k*104|0)+80>>2];c[j+52>>2]=c[i+(k*104|0)+84>>2];c[j+56>>2]=c[i+(k*104|0)+88>>2];c[j+60>>2]=c[i+(k*104|0)+92>>2];h=c[i+332>>2]|0;if(!h)h=-1;else h=(h-(c[b+780>>2]|0)|0)/104|0;c[j+80>>2]=h;c[j+88>>2]=c[i+(k*104|0)+96>>2];c[j+92>>2]=c[i+(k*104|0)+100>>2];h=c[i+(k*104|0)+4>>2]|0;if(!h)h=0;else{h=zb[c[(c[f>>2]|0)+28>>2]&31](f,h)|0;i=c[b+840>>2]|0;g=i}c[j+64>>2]=h;c[j+84>>2]=c[i+(k*104|0)+24>>2];k=k+1|0;if((k|0)>=(m|0))break;else j=j+100|0}}else g=c[b+840>>2]|0;Zb[c[(c[f>>2]|0)+20>>2]&31](f,n,11082,1497453121,g)}}else c[e+284>>2]=0;y=c[b+852>>2]|0;c[e+320>>2]=y;if(y){y=zb[c[(c[f>>2]|0)+28>>2]&31](f,c[b+860>>2]|0)|0;c[e+288>>2]=y;if(!y)y=f;else{k=c[e+320>>2]|0;m=Bb[c[(c[f>>2]|0)+16>>2]&63](f,92,k)|0;if((k|0)>0){i=c[m+8>>2]|0;j=0;while(1){h=c[b+860>>2]|0;c[i>>2]=c[h+(j*96|0)+28>>2];c[i+4>>2]=c[h+(j*96|0)+32>>2];c[i+8>>2]=c[h+(j*96|0)+36>>2];c[i+12>>2]=c[h+(j*96|0)+40>>2];c[i+16>>2]=c[h+(j*96|0)+44>>2];c[i+20>>2]=c[h+(j*96|0)+48>>2];c[i+24>>2]=c[h+(j*96|0)+52>>2];c[i+28>>2]=c[h+(j*96|0)+56>>2];c[i+32>>2]=c[h+(j*96|0)+60>>2];c[i+36>>2]=c[h+(j*96|0)+64>>2];c[i+40>>2]=c[h+(j*96|0)+68>>2];c[i+44>>2]=c[h+(j*96|0)+72>>2];c[i+48>>2]=c[h+(j*96|0)+76>>2];c[i+52>>2]=c[h+(j*96|0)+80>>2];c[i+56>>2]=c[h+(j*96|0)+84>>2];c[i+60>>2]=c[h+(j*96|0)+88>>2];c[i+88>>2]=c[h+(j*96|0)+92>>2];h=c[b+860>>2]|0;c[i+64>>2]=c[h+(j*96|0)+4>>2];c[i+68>>2]=c[h+(j*96|0)+8>>2];c[i+72>>2]=c[h+(j*96|0)+12>>2];c[i+76>>2]=c[h+(j*96|0)+16>>2];g=c[h+(j*96|0)>>2]|0;if(!g)g=-1;else g=(g-(c[b+780>>2]|0)|0)/104|0;c[i+84>>2]=g;g=c[h+(j*96|0)+20>>2]|0;if(!g)g=0;else g=zb[c[(c[f>>2]|0)+28>>2]&31](f,g)|0;c[i+80>>2]=g;j=j+1|0;if((j|0)>=(k|0))break;else i=i+92|0}}Zb[c[(c[f>>2]|0)+20>>2]&31](f,m,11100,1497453121,c[b+860>>2]|0);y=f}}else{c[e+288>>2]=0;y=f}c[e+360>>2]=c[b+376>>2];c[e+336>>2]=c[b+352>>2];c[e+352>>2]=c[b+368>>2];c[e+332>>2]=c[b+348>>2];c[e+348>>2]=c[b+364>>2];c[e+344>>2]=c[b+360>>2];c[e+420>>2]=c[b+436>>2];c[e+424>>2]=c[b+440>>2];c[e+428>>2]=c[b+444>>2];c[e+416>>2]=c[b+432>>2];n=c[b+424>>2]|0;c[e+340>>2]=c[b+356>>2];c[e+364>>2]=c[b+380>>2];c[e+432>>2]=c[b+448>>2];c[e+356>>2]=c[b+372>>2];c[e+368>>2]=c[b+384>>2];c[e+372>>2]=c[b+388>>2];c[e+376>>2]=c[b+392>>2];c[e+380>>2]=c[b+396>>2];c[e+412>>2]=c[b+428>>2];c[e+408>>2]=n;c[e+384>>2]=c[b+400>>2];c[e+388>>2]=c[b+404>>2];c[e+392>>2]=c[b+408>>2];c[e+396>>2]=c[b+412>>2];c[e+400>>2]=c[b+416>>2];c[e+404>>2]=c[b+420>>2];c[e+264>>2]=zb[c[(c[y>>2]|0)+28>>2]&31](f,b+532|0)|0;n=Bb[c[(c[f>>2]|0)+16>>2]&63](f,192,1)|0;m=c[n+8>>2]|0;c[m+96>>2]=c[b+692>>2];c[m+100>>2]=c[b+696>>2];c[m+104>>2]=c[b+700>>2];c[m+108>>2]=c[b+704>>2];c[m+112>>2]=c[b+708>>2];c[m+116>>2]=c[b+712>>2];c[m+120>>2]=c[b+716>>2];c[m+124>>2]=c[b+720>>2];c[m+128>>2]=c[b+724>>2];c[m+132>>2]=c[b+728>>2];c[m+136>>2]=c[b+732>>2];c[m+140>>2]=c[b+736>>2];c[m+180>>2]=d[b+533>>0];c[m+176>>2]=d[b+532>>0];c[m+144>>2]=c[b+580>>2];c[m+148>>2]=c[b+584>>2];c[m+152>>2]=c[b+588>>2];c[m+156>>2]=c[b+592>>2];x=c[b+544>>2]|0;c[m+168>>2]=x;if(x){x=zb[c[(c[y>>2]|0)+28>>2]&31](f,c[b+552>>2]|0)|0;j=c[m+168>>2]|0;c[m+160>>2]=x;if(j|0){k=Bb[c[(c[f>>2]|0)+16>>2]&63](f,16,j)|0;if((j|0)>0){g=c[b+552>>2]|0;h=c[k+8>>2]|0;i=0;while(1){c[h>>2]=c[g+(i<<4)>>2];c[h+4>>2]=c[g+(i<<4)+4>>2];c[h+8>>2]=c[g+(i<<4)+8>>2];c[h+12>>2]=c[g+(i<<4)+12>>2];i=i+1|0;if((i|0)==(j|0))break;else h=h+16|0}}else g=c[b+552>>2]|0;Zb[c[(c[f>>2]|0)+20>>2]&31](f,k,19202,1497453121,g)}}else c[m+160>>2]=0;c[m+184>>2]=c[b+536>>2];c[m>>2]=c[b+596>>2];c[m+4>>2]=c[b+600>>2];c[m+8>>2]=c[b+604>>2];c[m+12>>2]=c[b+608>>2];c[m+16>>2]=c[b+612>>2];c[m+20>>2]=c[b+616>>2];c[m+24>>2]=c[b+620>>2];c[m+28>>2]=c[b+624>>2];c[m+32>>2]=c[b+628>>2];c[m+36>>2]=c[b+632>>2];c[m+40>>2]=c[b+636>>2];c[m+44>>2]=c[b+640>>2];c[m+48>>2]=c[b+644>>2];c[m+52>>2]=c[b+648>>2];c[m+56>>2]=c[b+652>>2];c[m+60>>2]=c[b+656>>2];c[m+64>>2]=c[b+660>>2];c[m+68>>2]=c[b+664>>2];c[m+72>>2]=c[b+668>>2];c[m+76>>2]=c[b+672>>2];c[m+80>>2]=c[b+676>>2];c[m+84>>2]=c[b+680>>2];c[m+88>>2]=c[b+684>>2];c[m+92>>2]=c[b+688>>2];x=c[b+564>>2]|0;c[m+172>>2]=x;if(x){x=zb[c[(c[y>>2]|0)+28>>2]&31](f,c[b+572>>2]|0)|0;j=c[m+172>>2]|0;c[m+164>>2]=x;if(!j)z=147;else{k=Bb[c[(c[f>>2]|0)+16>>2]&63](f,4,j)|0;if((j|0)>0){g=c[b+572>>2]|0;h=0;i=c[k+8>>2]|0;while(1){c[i>>2]=c[g+(h<<2)>>2];h=h+1|0;if((h|0)==(j|0))break;else i=i+4|0}}else g=c[b+572>>2]|0;Zb[c[(c[f>>2]|0)+20>>2]&31](f,k,11120,1497453121,g);x=f}}else{c[m+164>>2]=0;z=147}if((z|0)==147)x=f;Zb[c[(c[x>>2]|0)+20>>2]&31](f,n,11126,1497453121,b+532|0);z=c[b+1112>>2]|0;c[e+324>>2]=z;if(z){z=zb[c[(c[y>>2]|0)+28>>2]&31](f,c[c[b+1120>>2]>>2]|0)|0;v=c[e+324>>2]|0;c[e+292>>2]=z;if(v|0){w=Bb[c[(c[f>>2]|0)+16>>2]&63](f,348,v)|0;if((v|0)>0){t=0;u=c[w+8>>2]|0;while(1){h=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;z=u+320|0;c[z>>2]=c[h+360>>2];c[u+256>>2]=c[h+332>>2];c[u+260>>2]=c[h+336>>2];c[u+264>>2]=c[h+340>>2];c[u+268>>2]=c[h+344>>2];c[u+344>>2]=c[h+380>>2];c[u+340>>2]=d[h+377>>0];c[u+160>>2]=c[h+228>>2];c[u+164>>2]=c[h+232>>2];c[u+168>>2]=c[h+236>>2];c[u+172>>2]=c[h+240>>2];c[u+336>>2]=d[h+376>>0];c[u+208>>2]=c[h+276>>2];c[u+212>>2]=c[h+280>>2];c[u+216>>2]=c[h+284>>2];c[u+220>>2]=c[h+288>>2];c[u+224>>2]=c[h+292>>2];c[u+228>>2]=c[h+296>>2];c[u+232>>2]=c[h+300>>2];c[u+236>>2]=c[h+304>>2];h=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;c[u>>2]=c[h+60>>2];c[u+4>>2]=c[h+64>>2];c[u+8>>2]=c[h+68>>2];c[u+12>>2]=c[h+72>>2];c[u+16>>2]=c[h+76>>2];c[u+20>>2]=c[h+80>>2];c[u+24>>2]=c[h+84>>2];c[u+28>>2]=c[h+88>>2];c[u+32>>2]=c[h+92>>2];c[u+36>>2]=c[h+96>>2];c[u+40>>2]=c[h+100>>2];c[u+44>>2]=c[h+104>>2];c[u+48>>2]=c[h+108>>2];c[u+52>>2]=c[h+112>>2];c[u+56>>2]=c[h+116>>2];c[u+60>>2]=c[h+120>>2];c[u+296>>2]=c[h+124>>2];h=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;c[u+300>>2]=c[h+128>>2];c[u+112>>2]=c[h+180>>2];c[u+116>>2]=c[h+184>>2];c[u+120>>2]=c[h+188>>2];c[u+124>>2]=c[h+192>>2];c[u+128>>2]=c[h+196>>2];c[u+132>>2]=c[h+200>>2];c[u+136>>2]=c[h+204>>2];c[u+140>>2]=c[h+208>>2];c[u+144>>2]=c[h+212>>2];c[u+148>>2]=c[h+216>>2];c[u+152>>2]=c[h+220>>2];c[u+156>>2]=c[h+224>>2];g=u+316|0;c[g>>2]=c[h+356>>2];c[u+64>>2]=c[h+132>>2];c[u+68>>2]=c[h+136>>2];c[u+72>>2]=c[h+140>>2];c[u+76>>2]=c[h+144>>2];c[u+80>>2]=c[h+148>>2];c[u+84>>2]=c[h+152>>2];c[u+88>>2]=c[h+156>>2];c[u+92>>2]=c[h+160>>2];c[u+96>>2]=c[h+164>>2];c[u+100>>2]=c[h+168>>2];c[u+104>>2]=c[h+172>>2];c[u+108>>2]=c[h+176>>2];h=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;c[u+240>>2]=c[h+316>>2];c[u+244>>2]=c[h+320>>2];c[u+248>>2]=c[h+324>>2];c[u+252>>2]=c[h+328>>2];c[u+324>>2]=c[h+364>>2];c[u+328>>2]=c[h+368>>2];c[u+312>>2]=c[h+352>>2];c[g>>2]=c[h+356>>2];c[z>>2]=c[h+360>>2];c[u+332>>2]=c[h+372>>2];z=c[h+44>>2]|0;g=u+284|0;c[g>>2]=z;n=u+292|0;c[n>>2]=c[h+4>>2];o=u+288|0;c[o>>2]=c[h+24>>2];c[u+304>>2]=c[h+308>>2];c[u+176>>2]=c[h+244>>2];c[u+180>>2]=c[h+248>>2];c[u+184>>2]=c[h+252>>2];c[u+188>>2]=c[h+256>>2];c[u+192>>2]=c[h+260>>2];c[u+196>>2]=c[h+264>>2];c[u+200>>2]=c[h+268>>2];c[u+204>>2]=c[h+272>>2];h=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;c[u+308>>2]=c[h+312>>2];if(z){z=zb[c[(c[y>>2]|0)+28>>2]&31](f,c[h+52>>2]|0)|0;c[u+272>>2]=z;if(z|0){j=c[g>>2]|0;m=Bb[c[(c[f>>2]|0)+16>>2]&63](f,16,j)|0;if((j|0)>0){g=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;k=c[g+52>>2]|0;h=0;i=c[m+8>>2]|0;while(1){c[i>>2]=c[k+(h<<4)>>2];c[i+4>>2]=c[k+(h<<4)+4>>2];c[i+8>>2]=c[k+(h<<4)+8>>2];c[i+12>>2]=c[k+(h<<4)+12>>2];h=h+1|0;if((h|0)==(j|0))break;else i=i+16|0}}else g=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;Zb[c[(c[x>>2]|0)+20>>2]&31](f,m,19202,1497453121,c[g+52>>2]|0)}}else c[u+272>>2]=0;if(c[n>>2]|0){z=zb[c[(c[y>>2]|0)+28>>2]&31](f,c[(c[(c[b+1120>>2]|0)+(t<<2)>>2]|0)+12>>2]|0)|0;c[u+280>>2]=z;if(z|0){j=c[n>>2]|0;m=Bb[c[(c[f>>2]|0)+16>>2]&63](f,4,j)|0;if((j|0)>0){g=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;k=c[g+12>>2]|0;h=0;i=c[m+8>>2]|0;while(1){c[i>>2]=c[k+(h<<2)>>2];h=h+1|0;if((h|0)==(j|0))break;else i=i+4|0}}else g=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;Zb[c[(c[x>>2]|0)+20>>2]&31](f,m,11120,1497453121,c[g+12>>2]|0)}}else c[u+280>>2]=0;if(c[o>>2]|0){z=zb[c[(c[y>>2]|0)+28>>2]&31](f,(c[(c[b+1120>>2]|0)+(t<<2)>>2]|0)+20|0)|0;c[u+276>>2]=z;if(z|0){m=c[n>>2]|0;s=Bb[c[(c[f>>2]|0)+16>>2]&63](f,4,m)|0;if((m|0)>0){g=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;n=c[g+32>>2]|0;o=c[A+12>>2]|0;p=c[A+72>>2]|0;q=c[A+52>>2]|0;r=c[A+32>>2]|0;j=0;k=c[s+8>>2]|0;while(1){i=c[n+(j<<2)>>2]|0;h=((i+~(i<<15)|0)>>>10^i+~(i<<15))*9|0;h=c[o+(((((h>>>6^h)+~((h>>>6^h)<<11)|0)>>>16^(h>>>6^h)+~((h>>>6^h)<<11))&(c[A+48>>2]|0)+-1)<<2)>>2]|0;if((i|0)!=(c[p+(h<<3)>>2]|0))do h=c[r+(h<<2)>>2]|0;while((i|0)!=(c[p+(h<<3)>>2]|0));c[k>>2]=c[q+(h<<2)>>2];j=j+1|0;if((j|0)==(m|0))break;else k=k+4|0}}else g=c[(c[b+1120>>2]|0)+(t<<2)>>2]|0;Zb[c[(c[x>>2]|0)+20>>2]&31](f,s,11163,1497453121,g+20|0)}}else c[u+276>>2]=0;t=t+1|0;if((t|0)>=(v|0))break;else u=u+348|0}}Zb[c[(c[x>>2]|0)+20>>2]&31](f,w,11143,1497453121,c[c[b+1120>>2]>>2]|0)}}else c[e+292>>2]=0;z=c[b+912>>2]|0;c[e+328>>2]=z;if(!z){c[e+296>>2]=0;kj(A);l=A;return 11187}z=zb[c[(c[y>>2]|0)+28>>2]&31](f,c[b+920>>2]|0)|0;c[e+296>>2]=z;if(!z){kj(A);l=A;return 11187}k=c[b+912>>2]|0;m=Bb[c[(c[f>>2]|0)+16>>2]&63](f,104,k)|0;if((k|0)>0){i=0;j=c[m+8>>2]|0;while(1){g=c[(c[b+920>>2]|0)+(i<<2)>>2]|0;c[j+96>>2]=xb[c[(c[g>>2]|0)+20>>2]&127](g)|0;g=(c[b+920>>2]|0)+(i<<2)|0;h=c[g>>2]|0;c[j+8>>2]=c[h+28>>2];c[j+12>>2]=c[h+32>>2];c[j+16>>2]=c[h+36>>2];c[j+20>>2]=c[h+40>>2];c[j+24>>2]=c[h+44>>2];c[j+28>>2]=c[h+48>>2];c[j+32>>2]=c[h+52>>2];c[j+36>>2]=c[h+56>>2];c[j+40>>2]=c[h+60>>2];c[j+44>>2]=c[h+64>>2];c[j+48>>2]=c[h+68>>2];c[j+52>>2]=d[h+152>>0];h=j+56|0;c[j>>2]=0;n=j+4|0;c[n>>2]=0;c[h>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;c[h+16>>2]=0;c[h+20>>2]=0;c[h+24>>2]=0;c[h+28>>2]=0;g=c[g>>2]|0;h=c[g+4>>2]|0;if(h){c[j+88>>2]=1;c[j>>2]=zb[c[(c[y>>2]|0)+28>>2]&31](f,h)|0;g=c[(c[b+920>>2]|0)+(i<<2)>>2]|0}if(c[g+12>>2]|0){c[j+88>>2]=3;c[j>>2]=zb[c[(c[y>>2]|0)+28>>2]&31](f,c[(c[(c[b+920>>2]|0)+(i<<2)>>2]|0)+12>>2]|0)|0}g=c[(c[b+920>>2]|0)+(i<<2)>>2]|0;h=c[g+8>>2]|0;if(h){c[j+88>>2]=2;c[j>>2]=zb[c[(c[y>>2]|0)+28>>2]&31](f,h)|0;g=c[(c[b+920>>2]|0)+(i<<2)>>2]|0}h=c[g+16>>2]|0;if(h){c[j+92>>2]=1;c[n>>2]=zb[c[(c[y>>2]|0)+28>>2]&31](f,h)|0;g=c[(c[b+920>>2]|0)+(i<<2)>>2]|0}h=c[g+24>>2]|0;if(h){c[j+92>>2]=3;c[n>>2]=zb[c[(c[y>>2]|0)+28>>2]&31](f,h)|0;g=c[(c[b+920>>2]|0)+(i<<2)>>2]|0}g=c[g+20>>2]|0;if(g|0){c[j+92>>2]=2;c[n>>2]=zb[c[(c[y>>2]|0)+28>>2]&31](f,g)|0}i=i+1|0;if((i|0)>=(k|0))break;else j=j+104|0}}Zb[c[(c[x>>2]|0)+20>>2]&31](f,m,11167,1497453121,c[b+920>>2]|0);kj(A);l=A;return 11187}function mc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=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,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;K=l;l=l+144|0;switch(d-b|0){case 0:{c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;l=K;return}case 2:{m=c[(c[a+92>>2]|0)+(b<<2)>>2]|0;b=c[m+88>>2]|0;d=c[m+200>>2]|0;g=c[m+92>>2]|0;f=c[m+204>>2]|0;if((b|0)==(d|0)&(g|0)==(f|0))if((c[m+96>>2]|0)==(c[m+208>>2]|0)){c[m+8>>2]=0;c[m>>2]=m;c[m+4>>2]=m;c[e>>2]=m;c[e+4>>2]=m;c[e+8>>2]=m;c[e+12>>2]=m;l=K;return}else f=g;f=g-f|0;if(!(f|b-d)){h=(c[m+96>>2]|0)>(c[m+208>>2]|0);f=h?m+112|0:m;c[f>>2]=f;c[f+4>>2]=f;g=f;h=h?m:m+112|0;i=f;j=f;k=f}else{c[m>>2]=m+112;c[m+4>>2]=m+112;c[m+112>>2]=m;c[m+116>>2]=m;j=(b-d|0)<0|(b-d|0)==0&(f|0)<0;g=m;h=m+112|0;i=j?m+112|0:m;j=j?m:m+112|0;k=(f|0)<0|(b-d|0)<0&(f|0)==0?m:m+112|0;f=(f|0)<0|(b-d|0)<0&(f|0)==0?m+112|0:m}c[e>>2]=j;c[e+4>>2]=i;c[e+8>>2]=k;c[e+12>>2]=f;a=hg(a,g,h)|0;c[a>>2]=a;c[a+4>>2]=a;c[g+8>>2]=a;a=c[a+8>>2]|0;c[a>>2]=a;c[a+4>>2]=a;c[h+8>>2]=a;l=K;return}case 1:{a=c[(c[a+92>>2]|0)+(b<<2)>>2]|0;c[a+8>>2]=0;c[a>>2]=a;c[a+4>>2]=a;c[e>>2]=a;c[e+4>>2]=a;c[e+8>>2]=a;c[e+12>>2]=a;l=K;return}default:{n=((d-b|0)/2|0)+b|0;m=c[a+92>>2]|0;k=c[m+(n+-1<<2)>>2]|0;i=c[k+88>>2]|0;j=c[k+92>>2]|0;k=c[k+96>>2]|0;a:do if((n|0)<(d|0)){f=n;do{g=c[m+(f<<2)>>2]|0;if((c[g+88>>2]|0)!=(i|0))break a;if((c[g+92>>2]|0)!=(j|0))break a;if((c[g+96>>2]|0)!=(k|0))break a;f=f+1|0}while((f|0)<(d|0))}else f=n;while(0);mc(a,b,n,e);c[K+96>>2]=0;c[K+96+4>>2]=0;c[K+96+8>>2]=0;c[K+96+12>>2]=0;mc(a,f,d,K+96|0);k=c[K+96+4>>2]|0;b:do if(k|0){B=c[e+4>>2]|0;if(!B){c[e>>2]=c[K+96>>2];c[e+4>>2]=c[K+96+4>>2];c[e+8>>2]=c[K+96+8>>2];c[e+12>>2]=c[K+96+12>>2];break}c[a+100>>2]=(c[a+100>>2]|0)+-1;i=c[e+12>>2]|0;j=c[K+96+8>>2]|0;g=c[i+88>>2]|0;do if((g|0)==(c[j+88>>2]|0)?(h=c[i+92>>2]|0,(h|0)==(c[j+92>>2]|0)):0){f=c[j+4>>2]|0;if((f|0)==(j|0)){f=c[j+8>>2]|0;if(!f)f=g;else{h=c[f+12>>2]|0;j=h;f=c[h+88>>2]|0;h=c[h+92>>2]|0}b=j;n=f+1|0;g=i;o=c[j+96>>2]|0;break}i=c[j>>2]|0;c[f>>2]=i;c[i+4>>2]=f;if((j|0)==(c[K+96>>2]|0)){g=c[i+88>>2]|0;h=c[f+88>>2]|0;do if((g|0)<(h|0))g=i;else{if((g|0)==(h|0)?(c[i+92>>2]|0)<(c[f+92>>2]|0):0){g=i;break}g=f}while(0);c[K+96>>2]=g}if((j|0)==(k|0)){g=c[i+88>>2]|0;h=c[f+88>>2]|0;do if((g|0)>(h|0))f=i;else if((g|0)==(h|0)?(c[i+92>>2]|0)>(c[f+92>>2]|0):0){f=i;break}while(0);c[K+96+4>>2]=f;H=36}else{f=k;H=36}}else{f=k;H=36}while(0);if((H|0)==36){y=c[e>>2]|0;z=c[K+96>>2]|0;d=B;h=0;j=0;w=1;x=0;o=f;while(1){m=c[o+88>>2]|0;n=c[d+88>>2]|0;i=P(m-n|0,w)|0;c:do if((i|0)<=0){if((i|0)<0){v=(x|0)!=0;k=d;g=o;b=c[d+92>>2]|0;u=c[o+92>>2]|0;while(1){r=c[(v?g+4|0:g)>>2]|0;s=(r|0)==(g|0);t=g+88|0;while(1){d=k+88|0;p=u-b|0;if(!s?(C=c[r+88>>2]|0,D=P(C-m|0,w)|0,E=c[r+92>>2]|0,F=E-u|0,(F|0)>-1):0){if(!D)break;if((D|0)<0?(P(F,i)|0)<=(P(D,p)|0):0)break}q=c[(v?k+4|0:k)>>2]|0;if((q|0)==(k|0))break c;G=c[q+88>>2]|0;n=P(G-(c[d>>2]|0)|0,w)|0;o=c[q+92>>2]|0;d=o-b|0;m=c[t>>2]|0;b=i;i=P(m-G|0,w)|0;if(!((d|0)>0&(i|0)<0))break c;if(!n){k=q;b=o;continue}if((n|0)>=0)break c;if((P(d,b)|0)>=(P(n,p)|0))break c;else{k=q;b=o}}g=r;i=P(C-(c[d>>2]|0)|0,w)|0;u=E;m=C}}g=c[d+92>>2]|0;b=(x|0)!=0;d:do if(b){k=d;while(1){i=c[k>>2]|0;if((i|0)==(d|0)){m=k;break d}if((c[i+88>>2]|0)!=(n|0)){m=k;break d}G=g;g=c[i+92>>2]|0;if((g|0)>(G|0)){m=k;break}else k=i}}else{k=d;while(1){i=c[k+4>>2]|0;if((i|0)==(d|0)){m=k;break d}if((c[i+88>>2]|0)!=(n|0)){m=k;break d}G=g;g=c[i+92>>2]|0;if((g|0)>(G|0)){m=k;break}else k=i}}while(0);i=c[o+92>>2]|0;if(b){g=o;while(1){k=c[g+4>>2]|0;if((k|0)==(o|0)){k=m;break c}if((c[k+88>>2]|0)!=(n|0)){k=m;break c}G=i;i=c[k+92>>2]|0;if((i|0)<(G|0)){k=m;break}else g=k}}else{g=o;while(1){k=c[g>>2]|0;if((k|0)==(o|0)){k=m;break c}if((c[k+88>>2]|0)!=(n|0)){k=m;break c}G=i;i=c[k+92>>2]|0;if((i|0)<(G|0)){k=m;break}else g=k}}}else{u=(x|0)!=0;k=d;g=o;t=n;s=c[o+92>>2]|0;while(1){r=g+88|0;b=c[k+92>>2]|0;d=s-b|0;m=c[(u?k:k+4|0)>>2]|0;e:do if((m|0)!=(k|0))if(u){p=i;q=m;o=t;n=b;while(1){m=o;o=c[q+88>>2]|0;m=P(o-m|0,w)|0;b=n;n=c[q+92>>2]|0;b=n-b|0;if((b|0)>=1)break e;if(m|0){if((m|0)>=0)break e;if((P(b,p)|0)>(P(m,d)|0))break e}k=P((c[r>>2]|0)-o|0,w)|0;d=s-n|0;m=c[q>>2]|0;if((m|0)==(q|0)){p=k;k=q;break}else{G=q;p=k;q=m;k=G}}}else{p=i;q=m;o=t;n=b;while(1){m=o;o=c[q+88>>2]|0;m=P(o-m|0,w)|0;b=n;n=c[q+92>>2]|0;b=n-b|0;if((b|0)>=1)break e;if(m|0){if((m|0)>=0)break e;if((P(b,p)|0)>(P(m,d)|0))break e}k=P((c[r>>2]|0)-o|0,w)|0;d=s-n|0;m=c[q+4>>2]|0;if((m|0)==(q|0)){p=k;k=q;break}else{G=q;p=k;q=m;k=G}}}else p=i;while(0);n=c[(u?g:g+4|0)>>2]|0;if((n|0)==(g|0))break c;i=c[n+88>>2]|0;m=P(i-(c[r>>2]|0)|0,w)|0;b=s;s=c[n+92>>2]|0;b=s-b|0;t=c[k+88>>2]|0;i=P(i-t|0,w)|0;if(!((b|0)<0&(i|0)>0))break c;if(!m){g=n;continue}if((m|0)>=0)break c;if((P(b,p)|0)>=(P(m,d)|0))break;else g=n}}while(0);i=(x|0)==0;j=i?g:j;h=i?k:h;o=i?z:g;d=i?y:k;x=x+1|0;if((x|0)==2)break;else w=i?-1:w}c[d+4>>2]=o;c[o>>2]=d;c[h>>2]=j;c[j+4>>2]=h;if((c[z+88>>2]|0)<(c[y+88>>2]|0))c[e>>2]=z;if((c[f+88>>2]|0)>=(c[B+88>>2]|0))c[e+4>>2]=f;c[e+12>>2]=c[K+96+12>>2];g=h;F=j;s=c[j+88>>2]|0;n=c[h+88>>2]|0;t=c[j+92>>2]|0;u=c[h+92>>2]|0;v=c[j+96>>2]|0;o=c[h+96>>2]|0;w=((t-u|0)<0)<<31>>31;x=0-(s-n)|0;y=sw(0,0,x|0,((x|0)<0)<<31>>31|0)|0;y=ct(v-o|0,((v-o|0)<0)<<31>>31|0,y|0,A|0)|0;z=A;B=ct(v-o|0,((v-o|0)<0)<<31>>31|0,t-u|0,w|0)|0;C=A;p=ct(s-n|0,((s-n|0)<0)<<31>>31|0,x|0,((x|0)<0)<<31>>31|0)|0;E=A;D=ct(t-u|0,w|0,t-u|0,w|0)|0;D=sw(p|0,E|0,D|0,A|0)|0;E=A;p=c[h+8>>2]|0;c[K+120>>2]=0;if(!p)p=0;else{q=sw(0,0,t-u|0,w|0)|0;r=A;d=p;f=0;do{m=c[d+12>>2]|0;i=c[m+88>>2]|0;k=c[m+92>>2]|0;m=c[m+96>>2]|0;b=ct(k-u|0,((k-u|0)<0)<<31>>31|0,x|0,((x|0)<0)<<31>>31|0)|0;G=A;e=ct(i-n|0,((i-n|0)<0)<<31>>31|0,q|0,r|0)|0;f:do if((b|0)==(e|0)&(G|0)==(A|0)?(e=ct(i-n|0,((i-n|0)<0)<<31>>31|0,y|0,z|0)|0,b=A,G=ct(k-u|0,((k-u|0)<0)<<31>>31|0,B|0,C|0)|0,b=Ow(G|0,A|0,e|0,b|0)|0,e=A,G=ct(m-o|0,((m-o|0)<0)<<31>>31|0,D|0,E|0)|0,G=Ow(b|0,e|0,G|0,A|0)|0,e=A,(e|0)>0|(e|0)==0&G>>>0>0):0){do if(f|0){b=(c[f+4>>2]|0)==(d|0);if((c[f>>2]|0)!=(d|0))if(b)break;else break f;if(!b)break f;e=c[f+12>>2]|0;L=c[(c[d+8>>2]|0)+12>>2]|0;G=c[L+88>>2]|0;b=c[L+92>>2]|0;L=c[L+96>>2]|0;M=(c[e+96>>2]|0)-L|0;b=(P(m-L|0,(c[e+92>>2]|0)-b|0)|0)-(P(M,k-b|0)|0)|0;G=(P(M,i-G|0)|0)-(P(m-L|0,(c[e+88>>2]|0)-G|0)|0)|0;b=ct(b|0,((b|0)<0)<<31>>31|0,t-u|0,w|0)|0;e=A;G=ct(G|0,((G|0)<0)<<31>>31|0,x|0,((x|0)<0)<<31>>31|0)|0;G=Ow(b|0,e|0,G|0,A|0)|0;e=A;if((e|0)>0|(e|0)==0&G>>>0>0)break f}while(0);f=d}while(0);d=c[d>>2]|0}while((d|0)!=(p|0));c[K+120>>2]=f;p=f}d=c[j+8>>2]|0;c[K+72>>2]=0;if(!d)f=0;else{n=sw(0,0,t-u|0,w|0)|0;o=A;b=d;f=0;do{m=c[b+12>>2]|0;i=c[m+88>>2]|0;k=c[m+92>>2]|0;m=c[m+96>>2]|0;G=ct(k-t|0,((k-t|0)<0)<<31>>31|0,x|0,((x|0)<0)<<31>>31|0)|0;M=A;L=ct(i-s|0,((i-s|0)<0)<<31>>31|0,n|0,o|0)|0;do if((G|0)==(L|0)&(M|0)==(A|0)?(L=ct(i-s|0,((i-s|0)<0)<<31>>31|0,y|0,z|0)|0,G=A,M=ct(k-t|0,((k-t|0)<0)<<31>>31|0,B|0,C|0)|0,G=Ow(M|0,A|0,L|0,G|0)|0,L=A,M=ct(m-v|0,((m-v|0)<0)<<31>>31|0,D|0,E|0)|0,M=Ow(G|0,L|0,M|0,A|0)|0,L=A,(L|0)>0|(L|0)==0&M>>>0>0):0){if(f|0){if((c[f>>2]|0)!=(b|0))break;if((c[f+4>>2]|0)==(b|0)?(L=c[f+12>>2]|0,e=c[(c[b+8>>2]|0)+12>>2]|0,M=c[e+88>>2]|0,G=c[e+92>>2]|0,e=c[e+96>>2]|0,r=(c[L+96>>2]|0)-e|0,G=(P(m-e|0,(c[L+92>>2]|0)-G|0)|0)-(P(r,k-G|0)|0)|0,M=(P(r,i-M|0)|0)-(P(m-e|0,(c[L+88>>2]|0)-M|0)|0)|0,G=ct(G|0,((G|0)<0)<<31>>31|0,t-u|0,w|0)|0,L=A,M=ct(M|0,((M|0)<0)<<31>>31|0,x|0,((x|0)<0)<<31>>31|0)|0,M=Ow(G|0,L|0,M|0,A|0)|0,L=A,!((L|0)>0|(L|0)==0&M>>>0>0)):0)break}f=b}while(0);b=c[b>>2]|0}while((b|0)!=(d|0));c[K+72>>2]=f}if((p|0)!=0|(f|0)!=0){rc(a,h,j,K+120|0,K+72|0);f=c[K+120>>2]|0;if(f){h=c[f+12>>2]|0;g=h}f=c[K+72>>2]|0;if(!f){f=F;i=h}else{j=c[f+12>>2]|0;f=j;i=h}}else{f=F;i=h}b=f;n=c[j+88>>2]|0;o=(c[j+96>>2]|0)+1|0;h=c[j+92>>2]|0}f=0;e=0;k=0;z=0;G=1;D=0;m=0;d=0;B=0;F=b;C=o;x=j;w=i;while(1){y=c[w+88>>2]|0;u=(c[x+88>>2]|0)-y|0;M=c[w+92>>2]|0;E=(c[x+92>>2]|0)-M|0;t=c[w+96>>2]|0;r=(c[x+96>>2]|0)-t|0;c[K+120>>2]=u;c[K+120+4>>2]=E;c[K+120+8>>2]=r;c[K+120+12>>2]=-1;y=n-y|0;M=h-M|0;t=C-t|0;s=(P(r,M)|0)-(P(E,t)|0)|0;t=(P(u,t)|0)-(P(r,y)|0)|0;M=(P(E,y)|0)-(P(u,M)|0)|0;c[K+72>>2]=s;c[K+72+4>>2]=((s|0)<0)<<31>>31;c[K+72+8>>2]=t;c[K+72+8+4>>2]=((t|0)<0)<<31>>31;c[K+72+16>>2]=M;c[K+72+16+4>>2]=((M|0)<0)<<31>>31;y=ct(E|0,((E|0)<0)<<31>>31|0,M|0,((M|0)<0)<<31>>31|0)|0;L=A;v=ct(r|0,((r|0)<0)<<31>>31|0,t|0,((t|0)<0)<<31>>31|0)|0;v=sw(y|0,L|0,v|0,A|0)|0;L=A;r=ct(s|0,((s|0)<0)<<31>>31|0,r|0,((r|0)<0)<<31>>31|0)|0;y=A;M=ct(u|0,((u|0)<0)<<31>>31|0,M|0,((M|0)<0)<<31>>31|0)|0;M=sw(r|0,y|0,M|0,A|0)|0;y=A;t=ct(u|0,((u|0)<0)<<31>>31|0,t|0,((t|0)<0)<<31>>31|0)|0;u=A;E=ct(s|0,((s|0)<0)<<31>>31|0,E|0,((E|0)<0)<<31>>31|0)|0;E=sw(t|0,u|0,E|0,A|0)|0;c[K+48>>2]=v;c[K+48+4>>2]=L;c[K+48+8>>2]=M;c[K+48+8+4>>2]=y;c[K+48+16>>2]=E;c[K+48+16+4>>2]=A;c[K+24>>2]=0;c[K+24+4>>2]=0;c[K+24+8>>2]=0;c[K+24+12>>2]=0;c[K+24+16>>2]=0;E=Fd(a,0,w,K+120|0,K+72|0,K+48|0,K+24|0)|0;c[K>>2]=0;c[K+4>>2]=0;c[K+8>>2]=0;c[K+12>>2]=0;c[K+16>>2]=0;y=Fd(a,1,x,K+120|0,K+72|0,K+48|0,K)|0;do if((E|0)!=0|(y|0)!=0){b=E|0?-1:1;do if((E|0)!=0&(y|0)!=0){v=c[K+24+16>>2]|0;b=c[K+16>>2]|0;if((v|0)!=(b|0)){u=v-b|0;break}if(!v)u=0;else{M=c[K+24>>2]|0;t=c[K+24+4>>2]|0;p=c[K+8>>2]|0;N=c[K+8+4>>2]|0;o=ct(p|0,0,M|0,0)|0;b=A;M=ct(N|0,0,M|0,0)|0;L=A;p=ct(p|0,0,t|0,0)|0;q=A;t=ct(N|0,0,t|0,0)|0;N=A;p=Ow(M|0,0,p|0,0)|0;M=A;N=Ow(L|0,0,t|0,N|0)|0;q=Ow(N|0,A|0,q|0,0)|0;M=Ow(q|0,A|0,M|0,0)|0;q=A;b=Ow(0,p|0,o|0,b|0)|0;o=A;p=Ow(M|0,q|0,(o>>>0

    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%0A5oR7gI$eepP0||A8^9WO-lR@a8em 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

  2. (M|Uq%Veuqk%wki1Oe_z;1DmA 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